Version 2.5.0-dev.2.0

Merge commit '804a338b5e268a8f30b50e1f3d78b0f7893821a7' into dev
diff --git a/.gitignore b/.gitignore
index 0216f06..f85b670 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,7 +3,6 @@
 /.project
 /Makefile
 /base
-/benchmarks
 /buildtools
 /ipch
 /out
@@ -23,6 +22,11 @@
 /*.vcxproj.user
 *.stamp
 
+# LLVM prebuilts
+/third_party/llvm/include
+/third_party/llvm/lib
+/third_party/llvm/.versions
+
 # Gyp generated files
 *.xcodeproj
 *.intermediate
@@ -55,6 +59,9 @@
 # GDB files
 .gdb_history
 
+# Clangd files
+.clangd
+
 # Built by chromebot and downloaded from Google Storage
 client/tests/drt
 
@@ -96,3 +103,4 @@
 /outline.dill
 /generated/
 /crash_logs/
+/build/config/gclient_args.gni
diff --git a/.packages b/.packages
index 80bae2d..435b8d5 100644
--- a/.packages
+++ b/.packages
@@ -17,6 +17,7 @@
 async:third_party/pkg/async/lib
 async_helper:pkg/async_helper/lib
 bazel_worker:third_party/pkg/bazel_worker/lib
+benchmark_harness:third_party/pkg/benchmark_harness/lib
 boolean_selector:third_party/pkg/boolean_selector/lib
 build_integration:pkg/build_integration/lib
 charcode:third_party/pkg/charcode/lib
@@ -99,10 +100,12 @@
 test_reflective_loader:third_party/pkg/test_reflective_loader/lib
 test_runner:pkg/test_runner/lib
 testing:pkg/testing/lib
+tflite_native:third_party/pkg/tflite_native/lib
 typed_data:third_party/pkg/typed_data/lib
 unittest:third_party/pkg/unittest/lib
 usage:third_party/pkg/usage/lib
 vm:pkg/vm/lib
+vm_service:pkg/vm_service/lib
 watcher:third_party/pkg/watcher/lib
 web_components:third_party/pkg/web_components/lib
 web_socket_channel:third_party/pkg/web_socket_channel/lib
diff --git a/.style.yapf b/.style.yapf
new file mode 100644
index 0000000..0e9640c
--- /dev/null
+++ b/.style.yapf
@@ -0,0 +1,2 @@
+[style]
+based_on_style = google
diff --git a/BUILD.gn b/BUILD.gn
index 6d899ee..c9f1531 100644
--- a/BUILD.gn
+++ b/BUILD.gn
@@ -2,6 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+import("build/config/gclient_args.gni")
 import("build/dart/dart_host_sdk_toolchain.gni")
 
 targetting_fuchsia = target_os == "fuchsia"
@@ -15,15 +16,20 @@
   deps = [
     ":runtime",
   ]
+  if (checkout_llvm) {
+    deps += [
+      ":llvm_codegen"
+    ]
+  }
 }
 
 group("most") {
+  import("runtime/runtime_args.gni")
   if (targetting_fuchsia) {
     # Fuchsia has run_vm_tests marked testonly.
     testonly = true
   }
   deps = [
-    ":analysis_server",
     ":create_sdk",
     ":dart2js",
     ":dartanalyzer",
@@ -31,6 +37,9 @@
     ":runtime",
     ":samples",
   ]
+  if (dart_target_arch != "arm") {
+    deps += [ ":analysis_server" ]
+  }
 }
 
 group("runtime") {
@@ -116,6 +125,23 @@
   ]
 }
 
+group("check_llvm") {
+  if (checkout_llvm) {
+    deps = [
+      "runtime/llvm_codegen/test",
+    ]
+  }
+}
+
+group("llvm_codegen") {
+  if (checkout_llvm) {
+    deps = [
+      "runtime/llvm_codegen/codegen",
+      "runtime/llvm_codegen/bit",
+    ]
+  }
+}
+
 # This is the target that is built on the dart2js build bots.
 # It must depend on anything that is required by the dart2js
 # test suites.
diff --git a/CHANGELOG.md b/CHANGELOG.md
index d3d7263..a0fafe4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -22,12 +22,32 @@
   * `RawSocket.read()`
   * `Utf8Codec.encode()` (and `Utf8Encoder.convert()`)
 
-  In addition, the following methods and classes were updated to return or
-  implement `Stream<Uint8List>` rather than `Stream<List<int>>`:
+  In addition, the following classes were updated to implement
+  `Stream<Uint8List>` rather than `Stream<List<int>>`:
 
-  * `File.openRead()`
   * `HttpRequest`
-  * `HttpClientResponse`
+  * `Socket`
+
+  **Possible errors and how to fix them**
+
+    * > The argument type 'Utf8Decoder' can't be assigned to the parameter type 'StreamTransformer<Uint8List, dynamic>'
+
+      > type 'Utf8Decoder' is not a subtype of type 'StreamTransformer' of 'streamTransformer'"
+
+      You can fix these call sites by updating your code to use
+      `StreamTransformer.bind()` instead of `Stream.transform()`, like so:
+
+      *Before:* `stream.transform(utf8.decoder)`
+      *After:* `utf8.decoder.bind(stream)`
+
+    * > The argument type 'IOSink' can't be assigned to the parameter type 'StreamConsumer<Uint8List>'
+
+      > type '_IOSinkImpl' is not a subtype of type 'StreamConsumer<Uint8List>' of 'streamConsumer'
+
+      You can fix these call sites by casting your stream instance to a `Stream<List<int>>` before calling `.pipe()` on the stream, like so:
+
+      *Before:* `stream.pipe(consumer)`
+      *After:* `stream.cast<List<int>>().pipe(consumer)`
 
   Finally, the following typed lists were updated to have their `sublist()`
   methods declare a return type that is the same as the source list:
@@ -47,7 +67,11 @@
   * `Uint32List.sublist()` → `Uint32List`
   * `Uint64List.sublist()` → `Uint64List`
 
-  
+#### `dart:async`
+
+* Add `value` and `error` constructors on `Stream`
+  to allow easily creating single-value or single-error streams.
+
 #### `dart:core`
 
 * Update `Uri` class to support [RFC6874](https://tools.ietf.org/html/rfc6874):
@@ -91,12 +115,38 @@
 #### Pub
 
  * Clean-up invalid git repositories in cache when fetching from git.
+ * **Breaking change**  [#36765](https://github.com/dart-lang/sdk/issues/36765):
+   Packages published to [pub.dev](https://pub.dev) can no longer contain git
+   dependencies. These packages will be rejected by the server.
 
 #### Linter
 
-The Linter was updated to `0.1.93`, which includes the following changes:
+The Linter was updated to `0.1.96`, which includes:
 
-* new lint: `avoid_print`
+* fixed false positives in `unnecessary_parens`
+* various changes to migrate to preferred analyzer APIs
+* rule test fixes
+
+#### Dartdoc
+
+Dartdoc was updated to `0.28.4`; this version includes several fixes and is based
+on a newer version of the analyzer package.
+
+## 2.4.1 - 2019-08-07
+
+This is a patch release that fixes a performance regression in JIT mode, as
+well as a potential crash of our AOT compiler.
+
+### Dart VM
+
+* Fixed a performance regression where usage of `Int32List` could trigger
+  repeated deoptimizations in JIT mode (Issue [37551][]).
+
+* Fixed a bug where usage of a static getter with name `length` could cause a
+  crash in our AOT compiler (Issue [35121][]).
+
+[37551]: https://github.com/dart-lang/sdk/issues/37551
+[35121]: https://github.com/dart-lang/sdk/issues/35121
 
 ## 2.4.0 - 2019-06-27
 
@@ -131,7 +181,7 @@
   [33327]: https://github.com/dart-lang/sdk/issues/33327
   [35804]: https://github.com/dart-lang/sdk/issues/35804
 
-* **Breaking change** [#36971](https://github.com/dart-lang/sdk/issues/36971): 
+* [#36971](https://github.com/dart-lang/sdk/issues/36971):
   The `HttpClientResponse` interface has been extended with the addition of a
   new `compressionState` getter, which specifies whether the body of a
   response was compressed when it was received and whether it has been
@@ -140,19 +190,18 @@
   As part of this change, a corresponding new enum was added to `dart:io`:
   `HttpClientResponseCompressionState`.
 
-  For those implementing the `HttpClientResponse`
-  interface, this is a breaking change, as implementing classes will need to
-  implement the new getter.
+  This is a **breaking change** for those implementing the `HttpClientResponse`
+  interface as subclasses will need to implement the new getter.
 
 #### `dart:async`
 
-* **Breaking change** [#36382](https://github.com/dart-lang/sdk/issues/36382): 
+* **Breaking change** [#36382](https://github.com/dart-lang/sdk/issues/36382):
   The `await for` allowed `null` as a stream due to a bug
   in `StreamIterator` class. This bug has now been fixed.
 
 #### `dart:core`
 
-* **Breaking change** [#36171](https://github.com/dart-lang/sdk/issues/36171): 
+* [#36171](https://github.com/dart-lang/sdk/issues/36171):
   The `RegExp` interface has been extended with two new
   constructor named parameters:
 
@@ -171,8 +220,9 @@
   * `String namedGroup(String name)`, a method that retrieves the match for
     the given named capture group
 
-  This change only affects implementers of the `RegExp` interface; current
-  code using Dart regular expressions will not be affected.
+  This is a **breaking change** for implementers of the `RegExp` interface.
+  Subclasses will need to add the new properties and may have to update the
+  return types on overridden methods.
 
 ### Language
 
diff --git a/DEPS b/DEPS
index 3cbb976..c512f03 100644
--- a/DEPS
+++ b/DEPS
@@ -36,7 +36,7 @@
   "chromium_git": "https://chromium.googlesource.com",
   "fuchsia_git": "https://fuchsia.googlesource.com",
 
-  "co19_2_rev": "b0220fc898c32d3944cb8c54cf7b78dd8c7cbadb",
+  "co19_2_rev": "a6f62f2024492b2c79b741d4b96e67fce31a9830",
 
   # As Flutter does, we use Fuchsia's GN and Clang toolchain. These revision
   # should be kept up to date with the revisions pulled by the Flutter engine.
@@ -55,6 +55,7 @@
   "args_tag": "1.4.4",
   "async_tag": "2.0.8",
   "bazel_worker_tag": "bazel_worker-v0.1.20",
+  "benchmark_harness_tag": "81641290dea44c34138a109a37e215482f405f81",
   "boolean_selector_tag" : "1.0.4",
   "boringssl_gen_rev": "bbf52f18f425e29b1185f2f6753bec02ed8c5880",
   "boringssl_rev" : "702e2b6d3831486535e958f262a05c75a5cb312e",
@@ -81,11 +82,11 @@
   # For more details, see https://github.com/dart-lang/sdk/issues/30164
   "dart_style_tag": "1.2.8",  # Please see the note above before updating.
 
-  "dartdoc_tag" : "v0.28.2",
+  "dartdoc_tag" : "0.28.4",
   "fixnum_tag": "0.10.9",
   "glob_tag": "1.1.7",
   "html_tag" : "0.14.0+1",
-  "http_io_rev": "0b05781c273a040ef521b5f7771dbc0356305872",
+  "http_io_rev": "2fa188caf7937e313026557713f7feffedd4978b",
   "http_multi_server_tag" : "2.0.5",
   "http_parser_tag" : "3.1.3",
   "http_retry_tag": "0.1.1",
@@ -96,7 +97,7 @@
   "intl_tag": "0.15.7",
   "jinja2_rev": "2222b31554f03e62600cd7e383376a7c187967a1",
   "json_rpc_2_tag": "2.0.9",
-  "linter_tag": "0.1.93",
+  "linter_tag": "0.1.96",
   "logging_tag": "0.11.3+2",
   "markupsafe_rev": "8f45f5cfa0009d2a70589bcda0349b8cb2b72783",
   "markdown_tag": "2.0.3",
@@ -134,10 +135,11 @@
   "term_glyph_tag": "1.0.1",
   "test_reflective_loader_tag": "0.1.8",
   "test_tag": "test-v1.6.4",
+  "tflite_native_rev": "7f3748a2adf0e7c246813d0b206396312cbaa0db",
   "typed_data_tag": "1.1.6",
   "unittest_rev": "2b8375bc98bb9dc81c539c91aaea6adce12e1072",
   "usage_tag": "3.4.0",
-  "watcher_rev": "0.9.7+12",
+  "watcher_rev": "0.9.7+12-pub",
   "web_components_rev": "8f57dac273412a7172c8ade6f361b407e2e4ed02",
   "web_socket_channel_tag": "1.0.9",
   "WebCore_rev": "fb11e887f77919450e497344da570d780e078bc8",
@@ -146,8 +148,20 @@
   "crashpad_rev": "bf327d8ceb6a669607b0dbab5a83a275d03f99ed",
   "minichromium_rev": "8d641e30a8b12088649606b912c2bc4947419ccc",
   "googletest_rev": "f854f1d27488996dc8a6db3c9453f80b02585e12",
+
+  # An LLVM backend needs LLVM binaries and headers. To avoid build time
+  # increases we can use prebuilts. We don't want to download this on every
+  # CQ/CI bot nor do we want the average Dart developer to incur that cost.
+  # So by default we will not download prebuilts.
+  "checkout_llvm": False,
+  "llvm_revision": "fe8bd96ebd6c490ea0b5c1fb342db2d7c393a109"
 }
 
+gclient_gn_args_file = Var("dart_root") + '/build/config/gclient_args.gni'
+gclient_gn_args = [
+  'checkout_llvm'
+]
+
 deps = {
   # Stuff needed for GN build.
   Var("dart_root") + "/buildtools/clang_format/script":
@@ -157,7 +171,7 @@
   Var("dart_root") + "/tools/sdks": {
       "packages": [{
           "package": "dart/dart-sdk/${{platform}}",
-          "version": "version:2.3.3-dev.0.0",
+          "version": "version:2.5.0-dev.1.0",
       }],
       "dep_type": "cipd",
   },
@@ -236,6 +250,9 @@
       Var("dart_git") + "async.git" + "@" + Var("async_tag"),
   Var("dart_root") + "/third_party/pkg/bazel_worker":
       Var("dart_git") + "bazel_worker.git" + "@" + Var("bazel_worker_tag"),
+  Var("dart_root") + "/third_party/pkg/benchmark_harness":
+      Var("dart_git") + "benchmark_harness.git" + "@" +
+      Var("benchmark_harness_tag"),
   Var("dart_root") + "/third_party/pkg/boolean_selector":
       Var("dart_git") + "boolean_selector.git" +
       "@" + Var("boolean_selector_tag"),
@@ -356,6 +373,8 @@
       Var("dart_git") + "term_glyph.git" + "@" + Var("term_glyph_tag"),
   Var("dart_root") + "/third_party/pkg/test":
       Var("dart_git") + "test.git" + "@" + Var("test_tag"),
+  Var("dart_root") + "/third_party/pkg/tflite_native":
+      Var("dart_git") + "tflite_native.git" + "@" + Var("tflite_native_rev"),
   Var("dart_root") + "/third_party/pkg/test_descriptor":
       Var("dart_git") + "test_descriptor.git" + "@" + Var("test_descriptor_tag"),
   Var("dart_root") + "/third_party/pkg/test_process":
@@ -395,6 +414,16 @@
       "dep_type": "cipd",
   },
 
+  Var("dart_root") + "/pkg/analysis_server/language_model": {
+    "packages": [
+      {
+        "package": "dart/language_model",
+        "version": "EFtZ0Z5T822s4EUOOaWeiXUppRGKp5d9Z6jomJIeQYcC",
+      }
+    ],
+    "dep_type": "cipd",
+  },
+
   Var("dart_root") + "/buildtools": {
       "packages": [
           {
@@ -404,6 +433,37 @@
       ],
       "dep_type": "cipd",
   },
+
+  # TODO(37531): Remove these cipd packages and build with sdk instead when
+  # benchmark runner gets support for that.
+  Var("dart_root") + "/benchmarks/FfiBoringssl/dart/native/out/": {
+      "packages": [
+          {
+              "package": "dart/benchmarks/ffiboringssl",
+              "version": "commit:a86c69888b9a416f5249aacb4690a765be064969",
+          },
+      ],
+      "dep_type": "cipd",
+  },
+  Var("dart_root") + "/benchmarks/FfiCall/dart/native/out/": {
+      "packages": [
+          {
+              "package": "dart/benchmarks/fficall",
+              "version": "version:1",
+          },
+      ],
+      "dep_type": "cipd",
+  },
+  Var("dart_root") + "/third_party/llvm": {
+      "packages": [
+          {
+              "package": "fuchsia/lib/llvm/${{platform}}",
+              "version": "git_revision:" + Var("llvm_revision"),
+          },
+      ],
+      "condition": "checkout_llvm",
+      "dep_type": "cipd",
+  }
 }
 
 deps_os = {
diff --git a/PRESUBMIT.py b/PRESUBMIT.py
index 0a39483..26354c4 100644
--- a/PRESUBMIT.py
+++ b/PRESUBMIT.py
@@ -1,7 +1,6 @@
 # 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.
-
 """Top-level presubmit script for Dart.
 
 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
@@ -16,209 +15,219 @@
 import tempfile
 
 
-def _CheckFormat(input_api, identification, extension, windows,
-    hasFormatErrors, should_skip = lambda path : False):
-  local_root = input_api.change.RepositoryRoot()
-  upstream = input_api.change._upstream
-  unformatted_files = []
-  for git_file in input_api.AffectedTextFiles():
-    if git_file.LocalPath().startswith("pkg/front_end/testcases/"):
-      continue
-    if should_skip(git_file.LocalPath()):
-      continue
-    filename = git_file.AbsoluteLocalPath()
-    if filename.endswith(extension) and hasFormatErrors(filename=filename):
-      old_version_has_errors = False
-      try:
-        path = git_file.LocalPath()
-        if windows:
-          # Git expects a linux style path.
-          path = path.replace(os.sep, '/')
-        old_contents = scm.GIT.Capture(
-          ['show', upstream + ':' + path],
-          cwd=local_root,
-          strip_out=False)
-        if hasFormatErrors(contents=old_contents):
-          old_version_has_errors = True
-      except subprocess.CalledProcessError as e:
-        old_version_has_errors = False
+def _CheckFormat(input_api,
+                 identification,
+                 extension,
+                 windows,
+                 hasFormatErrors,
+                 should_skip=lambda path: False):
+    local_root = input_api.change.RepositoryRoot()
+    upstream = input_api.change._upstream
+    unformatted_files = []
+    for git_file in input_api.AffectedTextFiles():
+        if git_file.LocalPath().startswith("pkg/front_end/testcases/"):
+            continue
+        if should_skip(git_file.LocalPath()):
+            continue
+        filename = git_file.AbsoluteLocalPath()
+        if filename.endswith(extension) and hasFormatErrors(filename=filename):
+            old_version_has_errors = False
+            try:
+                path = git_file.LocalPath()
+                if windows:
+                    # Git expects a linux style path.
+                    path = path.replace(os.sep, '/')
+                old_contents = scm.GIT.Capture(['show', upstream + ':' + path],
+                                               cwd=local_root,
+                                               strip_out=False)
+                if hasFormatErrors(contents=old_contents):
+                    old_version_has_errors = True
+            except subprocess.CalledProcessError as e:
+                old_version_has_errors = False
 
-      if old_version_has_errors:
-        print("WARNING: %s has existing and possibly new %s issues" %
-          (git_file.LocalPath(), identification))
-      else:
-        unformatted_files.append(filename)
+            if old_version_has_errors:
+                print("WARNING: %s has existing and possibly new %s issues" %
+                      (git_file.LocalPath(), identification))
+            else:
+                unformatted_files.append(filename)
 
-  return unformatted_files
+    return unformatted_files
 
 
 def _CheckBuildStatus(input_api, output_api):
-  results = []
-  status_check = input_api.canned_checks.CheckTreeIsOpen(
-      input_api,
-      output_api,
-      json_url='http://dart-status.appspot.com/current?format=json')
-  results.extend(status_check)
-  return results
+    results = []
+    status_check = input_api.canned_checks.CheckTreeIsOpen(
+        input_api,
+        output_api,
+        json_url='http://dart-status.appspot.com/current?format=json')
+    results.extend(status_check)
+    return results
 
 
 def _CheckDartFormat(input_api, output_api):
-  local_root = input_api.change.RepositoryRoot()
-  upstream = input_api.change._upstream
-  utils = imp.load_source('utils',
-      os.path.join(local_root, 'tools', 'utils.py'))
+    local_root = input_api.change.RepositoryRoot()
+    upstream = input_api.change._upstream
+    utils = imp.load_source('utils',
+                            os.path.join(local_root, 'tools', 'utils.py'))
 
-  prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt')
+    prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt')
 
-  windows = utils.GuessOS() == 'win32'
-  if windows:
-    prebuilt_dartfmt += '.bat'
-
-  if not os.path.isfile(prebuilt_dartfmt):
-    print('WARNING: dartfmt not found: %s' % (prebuilt_dartfmt))
-    return []
-
-  def HasFormatErrors(filename=None, contents=None):
-    # Don't look for formatting errors in multitests. Since those are very
-    # sensitive to whitespace, many cannot be formatted with dartfmt without
-    # breaking them.
-    if filename and filename.endswith('_test.dart'):
-      with open(filename) as f:
-        contents = f.read()
-        if '//#' in contents:
-          return False
-
-    args = [prebuilt_dartfmt, '--set-exit-if-changed']
-    if not contents:
-      args += [filename, '-n']
-
-    process = subprocess.Popen(args,
-                               stdout=subprocess.PIPE,
-                               stdin=subprocess.PIPE
-                               )
-    process.communicate(input=contents)
-
-    # Check for exit code 1 explicitly to distinguish it from a syntax error
-    # in the file (exit code 65). The repo contains many Dart files that are
-    # known to have syntax errors for testing purposes and which can't be
-    # parsed and formatted. Don't treat those as errors.
-    return process.returncode == 1
-
-  unformatted_files = _CheckFormat(input_api, "dartfmt", ".dart", windows,
-      HasFormatErrors)
-
-  if unformatted_files:
-    lineSep = " \\\n"
+    windows = utils.GuessOS() == 'win32'
     if windows:
-      lineSep = " ^\n";
-    return [output_api.PresubmitError(
-        'File output does not match dartfmt.\n'
-        'Fix these issues with:\n'
-        '%s -w%s%s' % (prebuilt_dartfmt, lineSep,
-            lineSep.join(unformatted_files)))]
+        prebuilt_dartfmt += '.bat'
 
-  return []
+    if not os.path.isfile(prebuilt_dartfmt):
+        print('WARNING: dartfmt not found: %s' % (prebuilt_dartfmt))
+        return []
+
+    def HasFormatErrors(filename=None, contents=None):
+        # Don't look for formatting errors in multitests. Since those are very
+        # sensitive to whitespace, many cannot be formatted with dartfmt without
+        # breaking them.
+        if filename and filename.endswith('_test.dart'):
+            with open(filename) as f:
+                contents = f.read()
+                if '//#' in contents:
+                    return False
+
+        args = [prebuilt_dartfmt, '--set-exit-if-changed']
+        if not contents:
+            args += [filename, '-n']
+
+        process = subprocess.Popen(
+            args, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
+        process.communicate(input=contents)
+
+        # Check for exit code 1 explicitly to distinguish it from a syntax error
+        # in the file (exit code 65). The repo contains many Dart files that are
+        # known to have syntax errors for testing purposes and which can't be
+        # parsed and formatted. Don't treat those as errors.
+        return process.returncode == 1
+
+    unformatted_files = _CheckFormat(input_api, "dartfmt", ".dart", windows,
+                                     HasFormatErrors)
+
+    if unformatted_files:
+        lineSep = " \\\n"
+        if windows:
+            lineSep = " ^\n"
+        return [
+            output_api.PresubmitError(
+                'File output does not match dartfmt.\n'
+                'Fix these issues with:\n'
+                '%s -w%s%s' % (prebuilt_dartfmt, lineSep,
+                               lineSep.join(unformatted_files)))
+        ]
+
+    return []
 
 
 def _CheckStatusFiles(input_api, output_api):
-  local_root = input_api.change.RepositoryRoot()
-  upstream = input_api.change._upstream
-  utils = imp.load_source('utils',
-      os.path.join(local_root, 'tools', 'utils.py'))
+    local_root = input_api.change.RepositoryRoot()
+    upstream = input_api.change._upstream
+    utils = imp.load_source('utils',
+                            os.path.join(local_root, 'tools', 'utils.py'))
 
-  dart = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dart')
-  lint = os.path.join(local_root, 'pkg', 'status_file', 'bin', 'lint.dart')
+    dart = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dart')
+    lint = os.path.join(local_root, 'pkg', 'status_file', 'bin', 'lint.dart')
 
-  windows = utils.GuessOS() == 'win32'
-  if windows:
-    dart += '.exe'
-
-  if not os.path.isfile(dart):
-    print('WARNING: dart not found: %s' % dart)
-    return []
-
-  if not os.path.isfile(lint):
-    print('WARNING: Status file linter not found: %s' % lint)
-    return []
-
-  def HasFormatErrors(filename=None, contents=None):
-    args = [dart, lint] + (['-t'] if contents else [filename])
-    process = subprocess.Popen(args,
-                               stdout=subprocess.PIPE,
-                               stdin=subprocess.PIPE)
-    process.communicate(input=contents)
-    return process.returncode != 0
-
-  def should_skip(path):
-      return (path.startswith("pkg/status_file/test/data/")
-              or path.startswith("pkg/front_end/"))
-
-  unformatted_files = _CheckFormat(input_api, "status file", ".status",
-      windows, HasFormatErrors, should_skip)
-
-  if unformatted_files:
-    normalize = os.path.join(local_root, 'pkg', 'status_file', 'bin',
-        'normalize.dart')
-    lineSep = " \\\n"
+    windows = utils.GuessOS() == 'win32'
     if windows:
-      lineSep = " ^\n";
-    return [output_api.PresubmitError(
-        'Status files are not normalized.\n'
-        'Fix these issues with:\n'
-        '%s %s -w%s%s' % (dart, normalize, lineSep,
-            lineSep.join(unformatted_files)))]
+        dart += '.exe'
 
-  return []
+    if not os.path.isfile(dart):
+        print('WARNING: dart not found: %s' % dart)
+        return []
+
+    if not os.path.isfile(lint):
+        print('WARNING: Status file linter not found: %s' % lint)
+        return []
+
+    def HasFormatErrors(filename=None, contents=None):
+        args = [dart, lint] + (['-t'] if contents else [filename])
+        process = subprocess.Popen(
+            args, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
+        process.communicate(input=contents)
+        return process.returncode != 0
+
+    def should_skip(path):
+        return (path.startswith("pkg/status_file/test/data/") or
+                path.startswith("pkg/front_end/"))
+
+    unformatted_files = _CheckFormat(input_api, "status file", ".status",
+                                     windows, HasFormatErrors, should_skip)
+
+    if unformatted_files:
+        normalize = os.path.join(local_root, 'pkg', 'status_file', 'bin',
+                                 'normalize.dart')
+        lineSep = " \\\n"
+        if windows:
+            lineSep = " ^\n"
+        return [
+            output_api.PresubmitError(
+                'Status files are not normalized.\n'
+                'Fix these issues with:\n'
+                '%s %s -w%s%s' % (dart, normalize, lineSep,
+                                  lineSep.join(unformatted_files)))
+        ]
+
+    return []
 
 
 def _CheckValidHostsInDEPS(input_api, output_api):
-  """Checks that DEPS file deps are from allowed_hosts."""
-  # Run only if DEPS file has been modified to annoy fewer bystanders.
-  if all(f.LocalPath() != 'DEPS' for f in input_api.AffectedFiles()):
-    return []
-  # Outsource work to gclient verify
-  try:
-    input_api.subprocess.check_output(['gclient', 'verify'])
-    return []
-  except input_api.subprocess.CalledProcessError, error:
-    return [output_api.PresubmitError(
-        'DEPS file must have only dependencies from allowed hosts.',
-        long_text=error.output)]
+    """Checks that DEPS file deps are from allowed_hosts."""
+    # Run only if DEPS file has been modified to annoy fewer bystanders.
+    if all(f.LocalPath() != 'DEPS' for f in input_api.AffectedFiles()):
+        return []
+    # Outsource work to gclient verify
+    try:
+        input_api.subprocess.check_output(['gclient', 'verify'])
+        return []
+    except input_api.subprocess.CalledProcessError, error:
+        return [
+            output_api.PresubmitError(
+                'DEPS file must have only dependencies from allowed hosts.',
+                long_text=error.output)
+        ]
+
 
 def _CheckLayering(input_api, output_api):
-  """Run VM layering check.
+    """Run VM layering check.
 
   This check validates that sources from one layer do not reference sources
   from another layer accidentally.
   """
-  # Run only if .cc or .h file was modified.
-  def is_cpp_file(path):
-    return path.endswith('.cc') or path.endswith('.h')
-  if all(not is_cpp_file(f.LocalPath()) for f in input_api.AffectedFiles()):
-    return []
 
-  local_root = input_api.change.RepositoryRoot()
-  layering_check = imp.load_source('layering_check',
-      os.path.join(local_root, 'runtime', 'tools', 'layering_check.py'))
-  errors = layering_check.DoCheck(local_root)
-  if errors:
-    return [output_api.PresubmitError(
-        'Layering check violation for C++ sources.',
-        long_text='\n'.join(errors))]
-  else:
-    return []
+    # Run only if .cc or .h file was modified.
+    def is_cpp_file(path):
+        return path.endswith('.cc') or path.endswith('.h')
+
+    if all(not is_cpp_file(f.LocalPath()) for f in input_api.AffectedFiles()):
+        return []
+
+    local_root = input_api.change.RepositoryRoot()
+    layering_check = imp.load_source(
+        'layering_check',
+        os.path.join(local_root, 'runtime', 'tools', 'layering_check.py'))
+    errors = layering_check.DoCheck(local_root)
+    if errors:
+        return [
+            output_api.PresubmitError(
+                'Layering check violation for C++ sources.',
+                long_text='\n'.join(errors))
+        ]
+    else:
+        return []
 
 
 def CheckChangeOnCommit(input_api, output_api):
-  return (_CheckValidHostsInDEPS(input_api, output_api) +
-          _CheckBuildStatus(input_api, output_api) +
-          _CheckDartFormat(input_api, output_api) +
-          _CheckStatusFiles(input_api, output_api) +
-          _CheckLayering(input_api, output_api))
+    return (_CheckValidHostsInDEPS(input_api, output_api) + _CheckBuildStatus(
+        input_api, output_api) + _CheckDartFormat(input_api, output_api) +
+            _CheckStatusFiles(input_api, output_api) + _CheckLayering(
+                input_api, output_api))
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  return (_CheckValidHostsInDEPS(input_api, output_api) +
-          _CheckDartFormat(input_api, output_api) +
-          _CheckStatusFiles(input_api, output_api) +
-          _CheckLayering(input_api, output_api))
+    return (_CheckValidHostsInDEPS(input_api, output_api) + _CheckDartFormat(
+        input_api, output_api) + _CheckStatusFiles(input_api, output_api) +
+            _CheckLayering(input_api, output_api))
diff --git a/WATCHLISTS b/WATCHLISTS
index 1c0bf93..0316d25 100644
--- a/WATCHLISTS
+++ b/WATCHLISTS
@@ -27,7 +27,7 @@
     'dart2js': {
       'filepath': (
         '^pkg/compiler|'
-        '^tests/compiler'
+        '^tests/compiler/dart2js'
       )
     },
     'package_vm': {
@@ -69,7 +69,7 @@
     'dart2js': [ 'johnniwinther@google.com', 'sigmund@google.com',
                  'sra@google.com', 'fishythefish@google.com' ],
     'front_end': [ 'dart-fe-team+reviews@google.com' ],
-    'kernel': [ 'karlklose@google.com', 'jensj@google.com', 'kmillikin@google.com',
+    'kernel': [ 'karlklose@google.com', 'jensj@google.com',
                 'alexmarkov@google.com' ],
     'messages_review': [ 'dart-uxr+reviews@google.com' ],
     'observatory': [ 'bkonyi@google.com' ],
diff --git a/benchmarks/Example/dart/Example.dart b/benchmarks/Example/dart/Example.dart
new file mode 100644
index 0000000..451124b
--- /dev/null
+++ b/benchmarks/Example/dart/Example.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.
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+class Example extends BenchmarkBase {
+  const Example() : super("Example");
+
+  // The benchmark code.
+  void run() {}
+
+  // Not measured setup code executed prior to the benchmark runs.
+  void setup() {}
+
+  // Not measures teardown code executed after the benchark runs.
+  void teardown() {}
+}
+
+main() {
+  const Example().report();
+}
diff --git a/benchmarks/FfiBoringssl/dart/FfiBoringssl.dart b/benchmarks/FfiBoringssl/dart/FfiBoringssl.dart
new file mode 100644
index 0000000..c87711b
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/FfiBoringssl.dart
@@ -0,0 +1,144 @@
+// 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.
+
+// Macro-benchmark for ffi with boringssl.
+
+import 'dart:convert';
+import 'dart:ffi';
+import 'dart:typed_data';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'digest.dart';
+import 'types.dart';
+
+//
+// BoringSSL functions
+//
+
+Uint8List inventData(int length) {
+  final result = Uint8List(length);
+  for (int i = 0; i < length; i++) {
+    result[i] = i % 256;
+  }
+  return result;
+}
+
+Uint8List toUint8List(Bytes bytes, int length) {
+  final result = Uint8List(length);
+  final uint8bytes = bytes.asUint8Pointer();
+  for (int i = 0; i < length; i++) {
+    result[i] = uint8bytes.elementAt(i).load<int>();
+  }
+  return result;
+}
+
+void copyFromUint8ListToTarget(Uint8List source, Data target) {
+  final int length = source.length;
+  final uint8target = target.asUint8Pointer();
+  for (int i = 0; i < length; i++) {
+    uint8target.offsetBy(i).store(source[i]);
+  }
+}
+
+String hash(Pointer<Data> data, int length, Pointer<EVP_MD> hashAlgorithm) {
+  final context = EVP_MD_CTX_new();
+  EVP_DigestInit(context, hashAlgorithm);
+  EVP_DigestUpdate(context, data, length);
+  final int resultSize = EVP_MD_CTX_size(context);
+  final Pointer<Bytes> result =
+      Pointer<Uint8>.allocate(count: resultSize).cast();
+  EVP_DigestFinal(context, result, nullptr.cast());
+  EVP_MD_CTX_free(context);
+  final String hash = base64Encode(toUint8List(result.load(), resultSize));
+  result.free();
+  return hash;
+}
+
+//
+// Benchmark fixtures.
+//
+
+// Number of repeats: 1 && Length in bytes: 10000000
+//  * CPU: Intel(R) Xeon(R) Gold 6154
+//    * Architecture: x64
+//      * 23000 - 52000000 us (without optimizations)
+//      * 23000 - 30000 us (with optimizations)
+//    * Architecture: SimDBC64
+//      * 23000 - 5500000 us (without optimizations)
+//      * 23000 - 30000 us (with optimizations)
+const int L = 1000; // Length of data in bytes.
+
+final hashAlgorithm = EVP_sha512();
+
+// Hash of generated data of `L` bytes with `hashAlgorithm`.
+const String expectedHash =
+    "bNLtqb+cBZcSkCmwBUuB5DP2uLe0madetwXv10usGUFJg1sdGhTEi+aW5NWIRW1RKiLq56obV74rVurn014Iyw==";
+
+/// This benchmark runs a digest algorithm on data residing in C memory.
+///
+/// This benchmark is intended as macro benchmark with a realistic workload.
+class DigestCMemory extends BenchmarkBase {
+  DigestCMemory() : super("FfiBoringssl.DigestCMemory");
+
+  Pointer<Data> data; // Data in C memory that we want to digest.
+
+  void setup() {
+    data = Pointer<Uint8>.allocate(count: L).cast();
+    copyFromUint8ListToTarget(inventData(L), data.load());
+    hash(data, L, hashAlgorithm);
+  }
+
+  void teardown() {
+    data.free();
+  }
+
+  void run() {
+    final String result = hash(data, L, hashAlgorithm);
+    if (result != expectedHash) {
+      throw Exception("$name: Unexpected result: $result");
+    }
+  }
+}
+
+/// This benchmark runs a digest algorithm on data residing in Dart memory.
+///
+/// This benchmark is intended as macro benchmark with a realistic workload.
+class DigestDartMemory extends BenchmarkBase {
+  DigestDartMemory() : super("FfiBoringssl.DigestDartMemory");
+
+  Uint8List data; // Data in C memory that we want to digest.
+
+  void setup() {
+    data = inventData(L);
+    final Pointer<Data> dataInC = Pointer<Uint8>.allocate(count: L).cast();
+    copyFromUint8ListToTarget(data, dataInC.load());
+    hash(dataInC, L, hashAlgorithm);
+    dataInC.free();
+  }
+
+  void teardown() {}
+
+  void run() {
+    final Pointer<Data> dataInC = Pointer<Uint8>.allocate(count: L).cast();
+    copyFromUint8ListToTarget(data, dataInC.load());
+    final String result = hash(dataInC, L, hashAlgorithm);
+    dataInC.free();
+    if (result != expectedHash) {
+      throw Exception("$name: Unexpected result: $result");
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+main() {
+  final benchmarks = [
+    () => DigestCMemory(),
+    () => DigestDartMemory(),
+  ];
+  benchmarks.forEach((benchmark) => benchmark().report());
+}
diff --git a/benchmarks/FfiBoringssl/dart/digest.dart b/benchmarks/FfiBoringssl/dart/digest.dart
new file mode 100644
index 0000000..ecc869b
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/digest.dart
@@ -0,0 +1,99 @@
+// 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:ffi';
+import 'dart:io';
+
+import 'dlopen_helper.dart';
+import 'types.dart';
+
+// See:
+// https://commondatastorage.googleapis.com/chromium-boringssl-docs/digest.h.html
+
+DynamicLibrary openSsl() {
+  // Force load crypto.
+  dlopenPlatformSpecific("crypto",
+      path: Platform.script.resolve("native/out/").path);
+  DynamicLibrary ssl = dlopenPlatformSpecific("ssl",
+      path: Platform.script.resolve("native/out/").path);
+  return ssl;
+}
+
+final DynamicLibrary ssl = openSsl();
+
+/// The following functions return EVP_MD objects that implement the named
+/// hash function.
+///
+/// ```c
+/// const EVP_MD *EVP_sha512(void);
+/// ```
+final Pointer<EVP_MD> Function() EVP_sha512 =
+    ssl.lookupFunction<Pointer<EVP_MD> Function(), Pointer<EVP_MD> Function()>(
+        'EVP_sha512');
+
+/// EVP_MD_CTX_new allocates and initialises a fresh EVP_MD_CTX and returns it,
+/// or NULL on allocation failure. The caller must use EVP_MD_CTX_free to
+/// release the resulting object.
+///
+/// ```c
+/// EVP_MD_CTX *EVP_MD_CTX_new(void);
+/// ```
+final Pointer<EVP_MD_CTX> Function() EVP_MD_CTX_new = ssl.lookupFunction<
+    Pointer<EVP_MD_CTX> Function(),
+    Pointer<EVP_MD_CTX> Function()>('EVP_MD_CTX_new');
+
+/// EVP_MD_CTX_free calls EVP_MD_CTX_cleanup and then frees ctx itself.
+///
+/// ```c
+/// void EVP_MD_CTX_free(EVP_MD_CTX *ctx);
+/// ```
+final void Function(Pointer<EVP_MD_CTX>) EVP_MD_CTX_free = ssl.lookupFunction<
+    Void Function(Pointer<EVP_MD_CTX>),
+    void Function(Pointer<EVP_MD_CTX>)>('EVP_MD_CTX_free');
+
+/// EVP_DigestInit acts like EVP_DigestInit_ex except that ctx is initialised
+/// before use.
+///
+/// ```c
+/// int EVP_DigestInit(EVP_MD_CTX *ctx, const EVP_MD *type);
+/// ```
+final int Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>) EVP_DigestInit =
+    ssl.lookupFunction<Int32 Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>),
+        int Function(Pointer<EVP_MD_CTX>, Pointer<EVP_MD>)>('EVP_DigestInit');
+
+/// EVP_DigestUpdate hashes len bytes from data into the hashing operation
+/// in ctx. It returns one.
+///
+/// ```c
+/// int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data,
+///                                     size_t len);
+/// ```
+final int Function(Pointer<EVP_MD_CTX>, Pointer<Data>, int) EVP_DigestUpdate =
+    ssl.lookupFunction<
+        Int32 Function(Pointer<EVP_MD_CTX>, Pointer<Data>, IntPtr),
+        int Function(
+            Pointer<EVP_MD_CTX>, Pointer<Data>, int)>('EVP_DigestUpdate');
+
+/// EVP_DigestFinal acts like EVP_DigestFinal_ex except that EVP_MD_CTX_cleanup
+/// is called on ctx before returning.
+///
+/// ```c
+/// int EVP_DigestFinal(EVP_MD_CTX *ctx, uint8_t *md_out,
+///                                    unsigned int *out_size);
+/// ```
+final int Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>, Pointer<Uint32>)
+    EVP_DigestFinal = ssl.lookupFunction<
+        Int32 Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>, Pointer<Uint32>),
+        int Function(Pointer<EVP_MD_CTX>, Pointer<Bytes>,
+            Pointer<Uint32>)>('EVP_DigestFinal');
+
+/// EVP_MD_CTX_size returns the digest size of ctx, in bytes. It will crash if
+/// a digest hasn't been set on ctx.
+///
+/// ```c
+/// size_t EVP_MD_CTX_size(const EVP_MD_CTX *ctx);
+/// ```
+final int Function(Pointer<EVP_MD_CTX>) EVP_MD_CTX_size = ssl.lookupFunction<
+    IntPtr Function(Pointer<EVP_MD_CTX>),
+    int Function(Pointer<EVP_MD_CTX>)>('EVP_MD_CTX_size');
diff --git a/benchmarks/FfiBoringssl/dart/dlopen_helper.dart b/benchmarks/FfiBoringssl/dart/dlopen_helper.dart
new file mode 100644
index 0000000..b031002
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/dlopen_helper.dart
@@ -0,0 +1,58 @@
+// 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:ffi';
+import 'dart:io';
+
+const kArm = "arm";
+const kArm64 = "arm64";
+const kIa32 = "ia32";
+const kX64 = "x64";
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  "arm": kArm,
+  "aarch64_be": kArm64,
+  "aarch64": kArm64,
+  "armv8b": kArm64,
+  "armv8l": kArm64,
+  "i386": kIa32,
+  "i686": kIa32,
+  "x86_64": kX64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == kX64) return kIa32;
+  if (pointerSize == 4 && architecture == kArm64) return kArm;
+
+  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(kX64)}/$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/FfiBoringssl/dart/native/.gitignore b/benchmarks/FfiBoringssl/dart/native/.gitignore
new file mode 100644
index 0000000..4404028
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/native/.gitignore
@@ -0,0 +1,7 @@
+# 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.
+
+build/
+out/
+src/
diff --git a/benchmarks/FfiBoringssl/dart/native/Makefile b/benchmarks/FfiBoringssl/dart/native/Makefile
new file mode 100644
index 0000000..149ded1
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/native/Makefile
@@ -0,0 +1,81 @@
+# 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.
+
+# TODO(37531): Remove this makefile and build with sdk instead when
+# benchmark runner gets support for that.
+
+REVISION=a86c69888b9a416f5249aacb4690a765be064969
+
+STRIPARM=arm-linux-gnueabihf-strip
+STRIPARM64=aarch64-linux-gnu-strip
+
+.PHONY: all cipd build/linux/x64 build/linux/ia32 build/linux/arm build/linux/arm64 clean
+
+all: out/linux/x64/libssl.so out/linux/x64/libcrypto.so out/linux/ia32/libssl.so out/linux/ia32/libcrypto.so out/linux/arm/libssl.so out/linux/arm/libcrypto.so out/linux/arm64/libssl.so out/linux/arm64/libcrypto.so
+
+cipd:
+	cipd create -name dart/benchmarks/ffiboringssl -in out -install-mode copy -tag commit:$(REVISION)
+
+src:
+	test -e src || git clone https://boringssl.googlesource.com/boringssl src
+	cd src && git reset --hard $(REVISION)
+
+build/linux/x64: src
+	mkdir -p build/linux/x64 && cd build/linux/x64 && cmake -DBUILD_SHARED_LIBS=1 ../../../src && make
+
+out/linux/x64:
+	mkdir -p out/linux/x64
+
+out/linux/x64/libssl.so: build/linux/x64 out/linux/x64
+	cp build/linux/x64/ssl/libssl.so $@
+	strip $@
+
+out/linux/x64/libcrypto.so: build/linux/x64 out/linux/x64
+	cp build/linux/x64/crypto/libcrypto.so $@
+	strip $@
+
+build/linux/ia32: src
+	mkdir -p build/linux/ia32 && cd build/linux/ia32 && cmake -DBUILD_SHARED_LIBS=1 -DCMAKE_TOOLCHAIN_FILE=../../../src/util/32-bit-toolchain.cmake ../../../src && make
+
+out/linux/ia32:
+	mkdir -p out/linux/ia32
+
+out/linux/ia32/libssl.so: build/linux/ia32 out/linux/ia32
+	cp build/linux/ia32/ssl/libssl.so $@
+	strip $@
+
+out/linux/ia32/libcrypto.so: build/linux/ia32 out/linux/ia32
+	cp build/linux/ia32/crypto/libcrypto.so $@
+	strip $@
+
+build/linux/arm: src
+	mkdir -p build/linux/arm && cd build/linux/arm && cmake -DBUILD_SHARED_LIBS=1 -DCMAKE_TOOLCHAIN_FILE=../../../arm.cmake ../../../src && make
+
+out/linux/arm:
+	mkdir -p out/linux/arm
+
+out/linux/arm/libssl.so: build/linux/arm out/linux/arm
+	cp build/linux/arm/ssl/libssl.so $@
+	$(STRIPARM) $@
+
+out/linux/arm/libcrypto.so: build/linux/arm out/linux/arm
+	cp build/linux/arm/crypto/libcrypto.so $@
+	$(STRIPARM) $@
+
+build/linux/arm64: src
+	mkdir -p build/linux/arm64 && cd build/linux/arm64 && cmake -DBUILD_SHARED_LIBS=1 -DCMAKE_TOOLCHAIN_FILE=../../../arm64.cmake ../../../src && make
+
+out/linux/arm64:
+	mkdir -p out/linux/arm64
+
+out/linux/arm64/libssl.so: build/linux/arm64 out/linux/arm64
+	cp build/linux/arm64/ssl/libssl.so $@
+	$(STRIPARM64) $@
+
+out/linux/arm64/libcrypto.so: build/linux/arm64 out/linux/arm64
+	cp build/linux/arm64/crypto/libcrypto.so $@
+	$(STRIPARM64) $@
+
+clean:
+	rm -rf build src out
diff --git a/benchmarks/FfiBoringssl/dart/native/arm.cmake b/benchmarks/FfiBoringssl/dart/native/arm.cmake
new file mode 100644
index 0000000..7ead7fc
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/native/arm.cmake
@@ -0,0 +1,17 @@
+# 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.
+
+# TODO(37531): Remove this cmake file and build with sdk instead when
+# benchmark runner gets support for that.
+
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_VERSION 1)
+set(CMAKE_SYSTEM_PROCESSOR "arm")
+set(CMAKE_C_COMPILER arm-linux-gnueabihf-gcc)
+set(CMAKE_CXX_COMPILER arm-linux-gnueabihf-g++)
+set(CMAKE_AS_COMPILER arm-linux-gnueabihf-as)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=attributes" CACHE STRING "c++ flags")
+set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -Wno-error=attributes" CACHE STRING "c flags")
+set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} " CACHE STRING "asm flags")
diff --git a/benchmarks/FfiBoringssl/dart/native/arm64.cmake b/benchmarks/FfiBoringssl/dart/native/arm64.cmake
new file mode 100644
index 0000000..771a2a6
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/native/arm64.cmake
@@ -0,0 +1,17 @@
+# 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.
+
+# TODO(37531): Remove this cmake file and build with sdk instead when
+# benchmark runner gets support for that.
+
+set(CMAKE_SYSTEM_NAME Linux)
+set(CMAKE_SYSTEM_VERSION 1)
+set(CMAKE_SYSTEM_PROCESSOR "arm64")
+set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)
+set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)
+set(CMAKE_AS_COMPILER aarch64-linux-gnu-as)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=attributes" CACHE STRING "c++ flags")
+set(CMAKE_C_FLAGS   "${CMAKE_C_FLAGS} -Wno-error=attributes" CACHE STRING "c flags")
+set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} " CACHE STRING "asm flags")
diff --git a/benchmarks/FfiBoringssl/dart/types.dart b/benchmarks/FfiBoringssl/dart/types.dart
new file mode 100644
index 0000000..c36c851
--- /dev/null
+++ b/benchmarks/FfiBoringssl/dart/types.dart
@@ -0,0 +1,25 @@
+// 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:ffi';
+
+/// digest algorithm.
+class EVP_MD extends Struct<EVP_MD> {}
+
+/// digest context.
+class EVP_MD_CTX extends Struct<EVP_MD_CTX> {}
+
+/// Type for `void*` used to represent opaque data.
+class Data extends Struct<Data> {
+  static Data fromUint8Pointer(Pointer<Uint8> p) => p.cast<Data>().load();
+
+  Pointer<Uint8> asUint8Pointer() => this.addressOf.cast();
+}
+
+/// Type for `uint8_t*` used to represent byte data.
+class Bytes extends Struct<Bytes> {
+  static Data fromUint8Pointer(Pointer<Uint8> p) => p.cast<Data>().load();
+
+  Pointer<Uint8> asUint8Pointer() => this.addressOf.cast();
+}
diff --git a/benchmarks/FfiCall/dart/FfiCall.dart b/benchmarks/FfiCall/dart/FfiCall.dart
new file mode 100644
index 0000000..d7e31c4
--- /dev/null
+++ b/benchmarks/FfiCall/dart/FfiCall.dart
@@ -0,0 +1,1150 @@
+// 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.
+
+// TODO(37581): Generate this file.
+
+// These micro benchmarks track the speed of reading and writing C memory from
+// Dart with a specific marshalling and unmarshalling of data.
+
+import 'dart:ffi';
+import 'dart:io';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+import 'dlopen_helper.dart';
+
+//
+// Trampoline functions.
+//
+
+DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific("native_functions",
+    path: Platform.script.resolve("native/out/").path);
+
+typedef NativeFunction1Uint8 = Uint8 Function(Uint8);
+typedef Function1int = int Function(int);
+Function1int function1Uint8 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Uint8, Function1int>("Function1Uint8");
+
+typedef NativeFunction1Uint16 = Uint16 Function(Uint16);
+Function1int function1Uint16 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Uint16, Function1int>("Function1Uint16");
+
+typedef NativeFunction1Uint32 = Uint32 Function(Uint32);
+Function1int function1Uint32 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Uint32, Function1int>("Function1Uint32");
+
+typedef NativeFunction1Uint64 = Uint64 Function(Uint64);
+Function1int function1Uint64 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Uint64, Function1int>("Function1Uint64");
+
+typedef NativeFunction1Int8 = Int8 Function(Int8);
+Function1int function1Int8 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Int8, Function1int>("Function1Int8");
+
+typedef NativeFunction1Int16 = Int16 Function(Int16);
+Function1int function1Int16 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Int16, Function1int>("Function1Int16");
+
+typedef NativeFunction1Int32 = Int32 Function(Int32);
+Function1int function1Int32 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Int32, Function1int>("Function1Int32");
+
+typedef NativeFunction2Int32 = Int32 Function(Int32, Int32);
+typedef Function2int = int Function(int, int);
+Function2int function2Int32 = ffiTestFunctions
+    .lookupFunction<NativeFunction2Int32, Function2int>("Function2Int32");
+
+typedef NativeFunction4Int32 = Int32 Function(Int32, Int32, Int32, Int32);
+typedef Function4int = int Function(int, int, int, int);
+Function4int function4Int32 = ffiTestFunctions
+    .lookupFunction<NativeFunction4Int32, Function4int>("Function4Int32");
+
+typedef NativeFunction10Int32 = Int32 Function(
+    Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32, Int32);
+typedef Function10int = int Function(
+    int, int, int, int, int, int, int, int, int, int);
+Function10int function10Int32 = ffiTestFunctions
+    .lookupFunction<NativeFunction10Int32, Function10int>("Function10Int32");
+
+typedef NativeFunction20Int32 = Int32 Function(
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32,
+    Int32);
+typedef Function20int = int Function(int, int, int, int, int, int, int, int,
+    int, int, int, int, int, int, int, int, int, int, int, int);
+Function20int function20Int32 = ffiTestFunctions
+    .lookupFunction<NativeFunction20Int32, Function20int>("Function20Int32");
+
+typedef NativeFunction1Int64 = Int64 Function(Int64);
+Function1int function1Int64 = ffiTestFunctions
+    .lookupFunction<NativeFunction1Int64, Function1int>("Function1Int64");
+
+typedef NativeFunction2Int64 = Int64 Function(Int64, Int64);
+Function2int function2Int64 = ffiTestFunctions
+    .lookupFunction<NativeFunction2Int64, Function2int>("Function2Int64");
+
+typedef NativeFunction4Int64 = Int64 Function(Int64, Int64, Int64, Int64);
+Function4int function4Int64 = ffiTestFunctions
+    .lookupFunction<NativeFunction4Int64, Function4int>("Function4Int64");
+
+typedef NativeFunction10Int64 = Int64 Function(
+    Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64, Int64);
+Function10int function10Int64 = ffiTestFunctions
+    .lookupFunction<NativeFunction10Int64, Function10int>("Function10Int64");
+
+typedef NativeFunction20Int64 = Int64 Function(
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64,
+    Int64);
+Function20int function20Int64 = ffiTestFunctions
+    .lookupFunction<NativeFunction20Int64, Function20int>("Function20Int64");
+
+typedef NativeFunction1Float = Float Function(Float);
+typedef Function1double = double Function(double);
+Function1double function1Float = ffiTestFunctions
+    .lookupFunction<NativeFunction1Float, Function1double>("Function1Float");
+
+typedef NativeFunction2Float = Float Function(Float, Float);
+typedef Function2double = double Function(double, double);
+Function2double function2Float = ffiTestFunctions
+    .lookupFunction<NativeFunction2Float, Function2double>("Function2Float");
+
+typedef NativeFunction4Float = Float Function(Float, Float, Float, Float);
+typedef Function4double = double Function(double, double, double, double);
+Function4double function4Float = ffiTestFunctions
+    .lookupFunction<NativeFunction4Float, Function4double>("Function4Float");
+
+typedef NativeFunction10Float = Float Function(
+    Float, Float, Float, Float, Float, Float, Float, Float, Float, Float);
+typedef Function10double = double Function(double, double, double, double,
+    double, double, double, double, double, double);
+Function10double function10Float = ffiTestFunctions
+    .lookupFunction<NativeFunction10Float, Function10double>("Function10Float");
+
+typedef NativeFunction20Float = Float Function(
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float,
+    Float);
+typedef Function20double = double Function(
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double,
+    double);
+Function20double function20Float = ffiTestFunctions
+    .lookupFunction<NativeFunction20Float, Function20double>("Function20Float");
+
+typedef NativeFunction1Double = Double Function(Double);
+Function1double function1Double = ffiTestFunctions
+    .lookupFunction<NativeFunction1Double, Function1double>("Function1Double");
+
+typedef NativeFunction2Double = Double Function(Double, Double);
+Function2double function2Double = ffiTestFunctions
+    .lookupFunction<NativeFunction2Double, Function2double>("Function1Double");
+
+typedef NativeFunction4Double = Double Function(Double, Double, Double, Double);
+Function4double function4Double = ffiTestFunctions
+    .lookupFunction<NativeFunction4Double, Function4double>("Function1Double");
+
+typedef NativeFunction10Double = Double Function(Double, Double, Double, Double,
+    Double, Double, Double, Double, Double, Double);
+Function10double function10Double =
+    ffiTestFunctions.lookupFunction<NativeFunction10Double, Function10double>(
+        "Function10Double");
+
+typedef NativeFunction20Double = Double Function(
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double,
+    Double);
+Function20double function20Double =
+    ffiTestFunctions.lookupFunction<NativeFunction20Double, Function20double>(
+        "Function20Double");
+
+typedef Function1PointerUint8 = Pointer<Uint8> Function(Pointer<Uint8>);
+Function1PointerUint8 function1PointerUint8 = ffiTestFunctions.lookupFunction<
+    Function1PointerUint8, Function1PointerUint8>("Function1PointerUint8");
+
+typedef Function2PointerUint8 = Pointer<Uint8> Function(
+    Pointer<Uint8>, Pointer<Uint8>);
+Function2PointerUint8 function2PointerUint8 = ffiTestFunctions.lookupFunction<
+    Function2PointerUint8, Function2PointerUint8>("Function2PointerUint8");
+
+typedef Function4PointerUint8 = Pointer<Uint8> Function(
+    Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>, Pointer<Uint8>);
+Function4PointerUint8 function4PointerUint8 = ffiTestFunctions.lookupFunction<
+    Function4PointerUint8, Function4PointerUint8>("Function4PointerUint8");
+
+typedef Function10PointerUint8 = Pointer<Uint8> Function(
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>);
+Function10PointerUint8 function10PointerUint8 = ffiTestFunctions.lookupFunction<
+    Function10PointerUint8, Function10PointerUint8>("Function10PointerUint8");
+
+typedef Function20PointerUint8 = Pointer<Uint8> Function(
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>,
+    Pointer<Uint8>);
+Function20PointerUint8 function20PointerUint8 = ffiTestFunctions.lookupFunction<
+    Function20PointerUint8, Function20PointerUint8>("Function20PointerUint8");
+
+//
+// Trampoline call.
+//
+
+int doCall1Uint8(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Uint8(17);
+  }
+  return x;
+}
+
+int doCall1Uint16(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Uint16(17);
+  }
+  return x;
+}
+
+int doCall1Uint32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Uint32(i);
+  }
+  return x;
+}
+
+int doCall1Uint64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Uint64(i);
+  }
+  return x;
+}
+
+int doCall1Int8(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Int8(17);
+  }
+  return x;
+}
+
+int doCall1Int16(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Int16(17);
+  }
+  return x;
+}
+
+int doCall1Int32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Int32(i);
+  }
+  return x;
+}
+
+int doCall2Int32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function2Int32(i, i);
+  }
+  return x;
+}
+
+int doCall4Int32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function4Int32(i, i, i, i);
+  }
+  return x;
+}
+
+int doCall10Int32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function10Int32(i, i, i, i, i, i, i, i, i, i);
+  }
+  return x;
+}
+
+int doCall20Int32(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function20Int32(
+        i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+  }
+  return x;
+}
+
+int doCall1Int64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function1Int64(i);
+  }
+  return x;
+}
+
+int doCall2Int64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function2Int64(i, i);
+  }
+  return x;
+}
+
+int doCall4Int64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function4Int64(i, i, i, i);
+  }
+  return x;
+}
+
+int doCall10Int64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function10Int64(i, i, i, i, i, i, i, i, i, i);
+  }
+  return x;
+}
+
+int doCall20Int64(int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function20Int64(
+        i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i, i);
+  }
+  return x;
+}
+
+int doCall1Int64Mint(int length) {
+  int x = 0x7FFFFFFF00000000;
+
+  for (int i = 0; i < length; i++) {
+    x = function1Int64(x);
+  }
+  return x;
+}
+
+double doCall1Float(int length) {
+  double x = 0.0;
+  for (int i = 0; i < length; i++) {
+    x += function1Float(17.0);
+  }
+  return x;
+}
+
+double doCall2Float(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function2Float(1.0, 2.0);
+  }
+  return x;
+}
+
+double doCall4Float(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function4Float(1.0, 2.0, 3.0, 4.0);
+  }
+  return x;
+}
+
+double doCall10Float(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function10Float(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
+  }
+  return x;
+}
+
+double doCall20Float(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function20Float(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);
+  }
+  return x;
+}
+
+double doCall1Double(int length) {
+  double x = 0.0;
+  for (int i = 0; i < length; i++) {
+    x += function1Double(17.0);
+  }
+  return x;
+}
+
+double doCall2Double(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function2Double(1.0, 2.0);
+  }
+  return x;
+}
+
+double doCall4Double(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function4Double(1.0, 2.0, 3.0, 4.0);
+  }
+  return x;
+}
+
+double doCall10Double(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function10Double(1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0);
+  }
+  return x;
+}
+
+double doCall20Double(int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += function20Double(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);
+  }
+  return x;
+}
+
+Pointer<Uint8> doCall1PointerUint8(int length, Pointer<Uint8> p1) {
+  Pointer<Uint8> x = p1;
+  for (int i = 0; i < length; i++) {
+    x = function1PointerUint8(x);
+  }
+  return x;
+}
+
+Pointer<Uint8> doCall2PointerUint8(
+    int length, Pointer<Uint8> p1, Pointer<Uint8> p2) {
+  Pointer<Uint8> x = p1;
+  for (int i = 0; i < length; i++) {
+    x = function2PointerUint8(x, p2);
+  }
+  return x;
+}
+
+Pointer<Uint8> doCall4PointerUint8(int length, Pointer<Uint8> p1,
+    Pointer<Uint8> p2, Pointer<Uint8> p3, Pointer<Uint8> p4) {
+  Pointer<Uint8> x = p1;
+  for (int i = 0; i < length; i++) {
+    x = function4PointerUint8(x, p2, p3, p4);
+  }
+  return x;
+}
+
+Pointer<Uint8> doCall10PointerUint8(
+    int length,
+    Pointer<Uint8> p1,
+    Pointer<Uint8> p2,
+    Pointer<Uint8> p3,
+    Pointer<Uint8> p4,
+    Pointer<Uint8> p5,
+    Pointer<Uint8> p6,
+    Pointer<Uint8> p7,
+    Pointer<Uint8> p8,
+    Pointer<Uint8> p9,
+    Pointer<Uint8> p10) {
+  Pointer<Uint8> x = p1;
+  for (int i = 0; i < length; i++) {
+    x = function10PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10);
+  }
+  return x;
+}
+
+Pointer<Uint8> doCall20PointerUint8(
+    int length,
+    Pointer<Uint8> p1,
+    Pointer<Uint8> p2,
+    Pointer<Uint8> p3,
+    Pointer<Uint8> p4,
+    Pointer<Uint8> p5,
+    Pointer<Uint8> p6,
+    Pointer<Uint8> p7,
+    Pointer<Uint8> p8,
+    Pointer<Uint8> p9,
+    Pointer<Uint8> p10,
+    Pointer<Uint8> p11,
+    Pointer<Uint8> p12,
+    Pointer<Uint8> p13,
+    Pointer<Uint8> p14,
+    Pointer<Uint8> p15,
+    Pointer<Uint8> p16,
+    Pointer<Uint8> p17,
+    Pointer<Uint8> p18,
+    Pointer<Uint8> p19,
+    Pointer<Uint8> p20) {
+  Pointer<Uint8> x = p1;
+  for (int i = 0; i < length; i++) {
+    x = function20PointerUint8(x, p2, p3, p4, p5, p6, p7, p8, p9, p10, p11, p12,
+        p13, p14, p15, p16, p17, p18, p19, p20);
+  }
+  return x;
+}
+
+//
+// Benchmark fixtures.
+//
+
+// Number of repeats: 1000
+//  * CPU: Intel(R) Xeon(R) Gold 6154
+//    * Architecture: x64
+//      * 200 - 1100 us
+//    * Architecture: SimDBC64
+//      * 2800 - 110000 us
+const N = 1000;
+
+class Uint8x01 extends BenchmarkBase {
+  Uint8x01() : super("FfiCall.Uint8x01");
+
+  void run() {
+    final int x = doCall1Uint8(N);
+    if (x != N * 17 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Uint16x01 extends BenchmarkBase {
+  Uint16x01() : super("FfiCall.Uint16x01");
+
+  void run() {
+    final int x = doCall1Uint16(N);
+    if (x != N * 17 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Uint32x01 extends BenchmarkBase {
+  Uint32x01() : super("FfiCall.Uint32x01");
+
+  void run() {
+    final int x = doCall1Uint32(N);
+    if (x != N * (N - 1) / 2 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Uint64x01 extends BenchmarkBase {
+  Uint64x01() : super("FfiCall.Uint64x01");
+
+  void run() {
+    final int x = doCall1Uint64(N);
+    if (x != N * (N - 1) / 2 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int8x01 extends BenchmarkBase {
+  Int8x01() : super("FfiCall.Int8x01");
+
+  void run() {
+    final int x = doCall1Int8(N);
+    if (x != N * 17 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int16x01 extends BenchmarkBase {
+  Int16x01() : super("FfiCall.Int16x01");
+
+  void run() {
+    final int x = doCall1Int16(N);
+    if (x != N * 17 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int32x01 extends BenchmarkBase {
+  Int32x01() : super("FfiCall.Int32x01");
+
+  void run() {
+    final int x = doCall1Int32(N);
+    if (x != N * (N - 1) / 2 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int32x02 extends BenchmarkBase {
+  Int32x02() : super("FfiCall.Int32x02");
+
+  void run() {
+    final int x = doCall2Int32(N);
+    if (x != N * (N - 1) * 2 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int32x04 extends BenchmarkBase {
+  Int32x04() : super("FfiCall.Int32x04");
+
+  void run() {
+    final int x = doCall4Int32(N);
+    if (x != N * (N - 1) * 4 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int32x10 extends BenchmarkBase {
+  Int32x10() : super("FfiCall.Int32x10");
+
+  void run() {
+    final int x = doCall10Int32(N);
+    if (x != N * (N - 1) * 10 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int32x20 extends BenchmarkBase {
+  Int32x20() : super("FfiCall.Int32x20");
+
+  void run() {
+    final int x = doCall20Int32(N);
+    if (x != N * (N - 1) * 20 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64x01 extends BenchmarkBase {
+  Int64x01() : super("FfiCall.Int64x01");
+
+  void run() {
+    final int x = doCall1Int64(N);
+    if (x != N * (N - 1) / 2 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64x02 extends BenchmarkBase {
+  Int64x02() : super("FfiCall.Int64x02");
+
+  void run() {
+    final int x = doCall2Int64(N);
+    if (x != N * (N - 1) * 2 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64x04 extends BenchmarkBase {
+  Int64x04() : super("FfiCall.Int64x04");
+
+  void run() {
+    final int x = doCall4Int64(N);
+    if (x != N * (N - 1) * 4 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64x10 extends BenchmarkBase {
+  Int64x10() : super("FfiCall.Int64x10");
+
+  void run() {
+    final int x = doCall10Int64(N);
+    if (x != N * (N - 1) * 10 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64x20 extends BenchmarkBase {
+  Int64x20() : super("FfiCall.Int64x20");
+
+  void run() {
+    final int x = doCall20Int64(N);
+    if (x != N * (N - 1) * 20 / 2) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Int64Mintx01 extends BenchmarkBase {
+  Int64Mintx01() : super("FfiCall.Int64Mintx01");
+
+  void run() {
+    final int x = doCall1Int64Mint(N);
+    if (x != 0x7FFFFFFF00000000 + N * 42) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Floatx01 extends BenchmarkBase {
+  Floatx01() : super("FfiCall.Floatx01");
+
+  void run() {
+    final double x = doCall1Float(N);
+    final double expected = N * (N - 1) / 2 + N * 42;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Floatx02 extends BenchmarkBase {
+  Floatx02() : super("FfiCall.Floatx02");
+
+  void run() {
+    final double x = doCall2Float(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Floatx04 extends BenchmarkBase {
+  Floatx04() : super("FfiCall.Floatx04");
+
+  void run() {
+    final double x = doCall4Float(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Floatx10 extends BenchmarkBase {
+  Floatx10() : super("FfiCall.Floatx10");
+
+  void run() {
+    final double x = doCall10Float(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Floatx20 extends BenchmarkBase {
+  Floatx20() : super("FfiCall.Floatx20");
+
+  void run() {
+    final double x = doCall20Float(N);
+    final double expected = N * 220.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Doublex01 extends BenchmarkBase {
+  Doublex01() : super("FfiCall.Doublex01");
+
+  void run() {
+    final double x = doCall1Double(N);
+    final double expected = N * (N - 1) / 2 + N * 42;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Doublex02 extends BenchmarkBase {
+  Doublex02() : super("FfiCall.Doublex02");
+
+  void run() {
+    final double x = doCall2Double(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Doublex04 extends BenchmarkBase {
+  Doublex04() : super("FfiCall.Doublex04");
+
+  void run() {
+    final double x = doCall4Double(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Doublex10 extends BenchmarkBase {
+  Doublex10() : super("FfiCall.Doublex10");
+
+  void run() {
+    final double x = doCall10Double(N);
+    final double expected = N * 55.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class Doublex20 extends BenchmarkBase {
+  Doublex20() : super("FfiCall.Doublex20");
+
+  void run() {
+    final double x = doCall20Double(N);
+    final double expected = N * 220.0;
+    if (0.999 * expected > x && x > 1.001 * expected) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8x01 extends BenchmarkBase {
+  PointerUint8x01() : super("FfiCall.PointerUint8x01");
+
+  Pointer<Uint8> pointer;
+  void setup() => pointer = Pointer.allocate(count: N + 1);
+  void teardown() => pointer.free();
+
+  void run() {
+    final Pointer<Uint8> x = doCall1PointerUint8(N, pointer);
+    if (x.address != pointer.address + N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8x02 extends BenchmarkBase {
+  PointerUint8x02() : super("FfiCall.PointerUint8x02");
+
+  Pointer<Uint8> pointer, pointer2;
+
+  void setup() {
+    pointer = Pointer.allocate(count: N + 1);
+    pointer2 = pointer.elementAt(1);
+  }
+
+  void teardown() {
+    pointer.free();
+  }
+
+  void run() {
+    final Pointer<Uint8> x = doCall2PointerUint8(N, pointer, pointer2);
+    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8x04 extends BenchmarkBase {
+  PointerUint8x04() : super("FfiCall.PointerUint8x04");
+
+  Pointer<Uint8> pointer, pointer2, pointer3, pointer4;
+
+  void setup() {
+    pointer = Pointer.allocate(count: N + 1);
+    pointer2 = pointer.elementAt(1);
+    pointer3 = pointer.elementAt(2);
+    pointer4 = pointer.elementAt(3);
+  }
+
+  void teardown() {
+    pointer.free();
+  }
+
+  void run() {
+    final Pointer<Uint8> x =
+        doCall4PointerUint8(N, pointer, pointer2, pointer3, pointer4);
+    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8x10 extends BenchmarkBase {
+  PointerUint8x10() : super("FfiCall.PointerUint8x10");
+
+  Pointer<Uint8> pointer,
+      pointer2,
+      pointer3,
+      pointer4,
+      pointer5,
+      pointer6,
+      pointer7,
+      pointer8,
+      pointer9,
+      pointer10;
+
+  void setup() {
+    pointer = Pointer.allocate(count: N + 1);
+    pointer2 = pointer.elementAt(1);
+    pointer3 = pointer.elementAt(2);
+    pointer4 = pointer.elementAt(3);
+    pointer5 = pointer.elementAt(4);
+    pointer6 = pointer.elementAt(5);
+    pointer7 = pointer.elementAt(6);
+    pointer8 = pointer.elementAt(7);
+    pointer9 = pointer.elementAt(8);
+    pointer10 = pointer.elementAt(9);
+  }
+
+  void teardown() {
+    pointer.free();
+  }
+
+  void run() {
+    final Pointer<Uint8> x = doCall10PointerUint8(
+        N,
+        pointer,
+        pointer2,
+        pointer3,
+        pointer4,
+        pointer5,
+        pointer6,
+        pointer7,
+        pointer8,
+        pointer9,
+        pointer10);
+    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8x20 extends BenchmarkBase {
+  PointerUint8x20() : super("FfiCall.PointerUint8x20");
+
+  Pointer<Uint8> pointer,
+      pointer2,
+      pointer3,
+      pointer4,
+      pointer5,
+      pointer6,
+      pointer7,
+      pointer8,
+      pointer9,
+      pointer10,
+      pointer11,
+      pointer12,
+      pointer13,
+      pointer14,
+      pointer15,
+      pointer16,
+      pointer17,
+      pointer18,
+      pointer19,
+      pointer20;
+
+  void setup() {
+    pointer = Pointer.allocate(count: N + 1);
+    pointer2 = pointer.elementAt(1);
+    pointer3 = pointer.elementAt(2);
+    pointer4 = pointer.elementAt(3);
+    pointer5 = pointer.elementAt(4);
+    pointer6 = pointer.elementAt(5);
+    pointer7 = pointer.elementAt(6);
+    pointer8 = pointer.elementAt(7);
+    pointer9 = pointer.elementAt(8);
+    pointer10 = pointer.elementAt(9);
+    pointer11 = pointer.elementAt(10);
+    pointer12 = pointer.elementAt(11);
+    pointer13 = pointer.elementAt(12);
+    pointer14 = pointer.elementAt(13);
+    pointer15 = pointer.elementAt(14);
+    pointer16 = pointer.elementAt(15);
+    pointer17 = pointer.elementAt(16);
+    pointer18 = pointer.elementAt(17);
+    pointer19 = pointer.elementAt(18);
+    pointer20 = pointer.elementAt(19);
+  }
+
+  void teardown() {
+    pointer.free();
+  }
+
+  void run() {
+    final Pointer<Uint8> x = doCall20PointerUint8(
+        N,
+        pointer,
+        pointer2,
+        pointer3,
+        pointer4,
+        pointer5,
+        pointer6,
+        pointer7,
+        pointer8,
+        pointer9,
+        pointer10,
+        pointer11,
+        pointer12,
+        pointer13,
+        pointer14,
+        pointer15,
+        pointer16,
+        pointer17,
+        pointer18,
+        pointer19,
+        pointer20);
+    if (x.address != pointer.address + N * sizeOf<Uint8>()) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+main() {
+  final benchmarks = [
+    () => Uint8x01(),
+    () => Uint16x01(),
+    () => Uint32x01(),
+    () => Uint64x01(),
+    () => Int8x01(),
+    () => Int16x01(),
+    () => Int32x01(),
+    () => Int32x02(),
+    () => Int32x04(),
+    () => Int32x10(),
+    () => Int32x20(),
+    () => Int64x01(),
+    () => Int64x02(),
+    () => Int64x04(),
+    () => Int64x10(),
+    () => Int64x20(),
+    () => Int64Mintx01(),
+    () => Floatx01(),
+    () => Floatx02(),
+    () => Floatx04(),
+    () => Floatx10(),
+    () => Floatx20(),
+    () => Doublex01(),
+    () => Doublex02(),
+    () => Doublex04(),
+    () => Doublex10(),
+    () => Doublex20(),
+    () => PointerUint8x01(),
+    () => PointerUint8x02(),
+    () => PointerUint8x04(),
+    () => PointerUint8x10(),
+    () => PointerUint8x20(),
+  ];
+  benchmarks.forEach((benchmark) => benchmark().report());
+}
diff --git a/benchmarks/FfiCall/dart/dlopen_helper.dart b/benchmarks/FfiCall/dart/dlopen_helper.dart
new file mode 100644
index 0000000..b031002
--- /dev/null
+++ b/benchmarks/FfiCall/dart/dlopen_helper.dart
@@ -0,0 +1,58 @@
+// 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:ffi';
+import 'dart:io';
+
+const kArm = "arm";
+const kArm64 = "arm64";
+const kIa32 = "ia32";
+const kX64 = "x64";
+
+// https://stackoverflow.com/questions/45125516/possible-values-for-uname-m
+final _unames = {
+  "arm": kArm,
+  "aarch64_be": kArm64,
+  "aarch64": kArm64,
+  "armv8b": kArm64,
+  "armv8l": kArm64,
+  "i386": kIa32,
+  "i686": kIa32,
+  "x86_64": kX64,
+};
+
+String _checkRunningMode(String architecture) {
+  // Check if we're running in 32bit mode.
+  final int pointerSize = sizeOf<IntPtr>();
+  if (pointerSize == 4 && architecture == kX64) return kIa32;
+  if (pointerSize == 4 && architecture == kArm64) return kArm;
+
+  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(kX64)}/$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/FfiCall/dart/native/.gitignore b/benchmarks/FfiCall/dart/native/.gitignore
new file mode 100644
index 0000000..4baa5ba
--- /dev/null
+++ b/benchmarks/FfiCall/dart/native/.gitignore
@@ -0,0 +1,5 @@
+# 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.
+
+out/
diff --git a/benchmarks/FfiCall/dart/native/Makefile b/benchmarks/FfiCall/dart/native/Makefile
new file mode 100644
index 0000000..5e5d716
--- /dev/null
+++ b/benchmarks/FfiCall/dart/native/Makefile
@@ -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.
+
+# 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
+
+# Bump this whenever the benchmark is updated.
+VERSION=1
+
+.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/fficall -in out -install-mode copy -tag version:$(VERSION)
+
+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/FfiCall/dart/native/native_functions.c b/benchmarks/FfiCall/dart/native/native_functions.c
new file mode 100644
index 0000000..9fcee4d
--- /dev/null
+++ b/benchmarks/FfiCall/dart/native/native_functions.c
@@ -0,0 +1,132 @@
+// 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.
+
+#include <stdint.h>
+
+uint8_t Function1Uint8(uint8_t x) { return x + 42; }
+
+uint16_t Function1Uint16(uint16_t x) { return x + 42; }
+
+uint32_t Function1Uint32(uint32_t x) { return x + 42; }
+
+uint64_t Function1Uint64(uint64_t x) { return x + 42; }
+
+int8_t Function1Int8(int8_t x) { return x + 42; }
+
+int16_t Function1Int16(int16_t x) { return x + 42; }
+
+int32_t Function1Int32(int32_t x) { return x + 42; }
+
+int32_t Function2Int32(int32_t a, int32_t b) {
+  return a + b;
+}
+
+int32_t Function4Int32(int32_t a, int32_t b, int32_t c, int32_t d) {
+  return a + b + c + d;
+}
+
+int32_t Function10Int32(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e,
+                        int32_t f, int32_t g, int32_t h, int32_t i, int32_t j) {
+  return a + b + c + d + e + f + g + h + i + j;
+}
+
+int32_t Function20Int32(int32_t a, int32_t b, int32_t c, int32_t d, int32_t e,
+                        int32_t f, int32_t g, int32_t h, int32_t i, int32_t j,
+                        int32_t k, int32_t l, int32_t m, int32_t n, int32_t o,
+                        int32_t p, int32_t q, int32_t r, int32_t s, int32_t t) {
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o +
+                   p + q + r + s + t;
+}
+
+int64_t Function1Int64(int64_t x) { return x + 42; }
+
+int64_t Function2Int64(int64_t a, int64_t b) {
+  return a + b;
+}
+
+int64_t Function4Int64(int64_t a, int64_t b, int64_t c, int64_t d) {
+  return a + b + c + d;
+}
+
+int64_t Function10Int64(int64_t a, int64_t b, int64_t c, int64_t d, int64_t e,
+                        int64_t f, int64_t g, int64_t h, int64_t i, int64_t j) {
+  return a + b + c + d + e + f + g + h + i + j;
+}
+
+int64_t Function20Int64(int64_t a, int64_t b, int64_t c, int64_t d, int64_t e,
+                        int64_t f, int64_t g, int64_t h, int64_t i, int64_t j,
+                        int64_t k, int64_t l, int64_t m, int64_t n, int64_t o,
+                        int64_t p, int64_t q, int64_t r, int64_t s, int64_t t) {
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o +
+                   p + q + r + s + t;
+}
+
+float Function1Float(float x) { return x + 42.0f; }
+
+float Function2Float(float a, float b) {
+  return a + b;
+}
+
+float Function4Float(float a, float b, float c, float d) {
+  return a + b + c + d;
+}
+
+float Function10Float(float a, float b, float c, float d, float e, float f,
+                      float g, float h, float i, float j) {
+  return a + b + c + d + e + f + g + h + i + j;
+}
+
+float Function20Float(float a, float b, float c, float d, float e, float f,
+                      float g, float h, float i, float j, float k, float l,
+                      float m, float n, float o, float p, float q, float r,
+                      float s, float t) {
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o + p +
+                 q + r + s + t;
+}
+
+double Function1Double(double x) { return x + 42.0; }
+
+double Function2Double(double a, double b) {
+  return a + b;
+}
+
+double Function4Double(double a, double b, double c, double d) {
+  return a + b + c + d;
+}
+
+double Function10Double(double a, double b, double c, double d, double e,
+                        double f, double g, double h, double i, double j) {
+  return a + b + c + d + e + f + g + h + i + j;
+}
+
+double Function20Double(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) {
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o +
+                  p + q + r + s + t;
+}
+
+uint8_t *Function1PointerUint8(uint8_t *a) { return a + 1; }
+
+uint8_t *Function2PointerUint8(uint8_t *a, uint8_t *b) { return a + 1; }
+
+uint8_t *Function4PointerUint8(uint8_t *a, uint8_t *b, uint8_t *c, uint8_t *d) {
+  return a + 1;
+}
+
+uint8_t *Function10PointerUint8(uint8_t *a, uint8_t *b, uint8_t *c, uint8_t *d,
+                                uint8_t *e, uint8_t *f, uint8_t *g, uint8_t *h,
+                                uint8_t *i, uint8_t *j) {
+  return a + 1;
+}
+
+uint8_t *Function20PointerUint8(uint8_t *a, uint8_t *b, uint8_t *c, uint8_t *d,
+                                uint8_t *e, uint8_t *f, uint8_t *g, uint8_t *h,
+                                uint8_t *i, uint8_t *j, uint8_t *k, uint8_t *l,
+                                uint8_t *m, uint8_t *n, uint8_t *o, uint8_t *p,
+                                uint8_t *q, uint8_t *r, uint8_t *s,
+                                uint8_t *t) {
+  return a + 1;
+}
diff --git a/benchmarks/FfiMemory/dart/FfiMemory.dart b/benchmarks/FfiMemory/dart/FfiMemory.dart
new file mode 100644
index 0000000..39c053f
--- /dev/null
+++ b/benchmarks/FfiMemory/dart/FfiMemory.dart
@@ -0,0 +1,431 @@
+// 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.
+
+// TODO(37581): Generate this file.
+
+// Micro-benchmarks for ffi memory stores and loads.
+//
+// These micro benchmarks track the speed of reading and writing C memory from
+// Dart with a specific marshalling and unmarshalling of data.
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+//
+// Pointer store.
+//
+
+void doStoreInt8(Pointer<Int8> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreUint8(Pointer<Uint8> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreInt16(Pointer<Int16> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreUint16(Pointer<Uint16> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreInt32(Pointer<Int32> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreUint32(Pointer<Uint32> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreInt64(Pointer<Int64> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreUint64(Pointer<Uint64> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1);
+  }
+}
+
+void doStoreFloat(Pointer<Float> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1.0);
+  }
+}
+
+void doStoreDouble(Pointer<Double> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(1.0);
+  }
+}
+
+void doStorePointer(
+    Pointer<Pointer<Int8>> pointer, int length, Pointer<Int8> data) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(data);
+  }
+}
+
+void doStoreInt64Mint(Pointer<Int64> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).store(0x7FFFFFFFFFFFFFFF);
+  }
+}
+
+//
+// Pointer load.
+//
+
+int doLoadInt8(Pointer<Int8> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadUint8(Pointer<Uint8> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadInt16(Pointer<Int16> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadUint16(Pointer<Uint16> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadInt32(Pointer<Int32> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadUint32(Pointer<Uint32> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadInt64(Pointer<Int64> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+int doLoadUint64(Pointer<Uint64> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+double doLoadFloat(Pointer<Float> pointer, int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<double>();
+  }
+  return x;
+}
+
+double doLoadDouble(Pointer<Double> pointer, int length) {
+  double x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<double>();
+  }
+  return x;
+}
+
+// Aggregates pointers through aggregrating their addresses.
+int doLoadPointer(Pointer<Pointer<Int8>> pointer, int length) {
+  Pointer<Int8> x;
+  int address_xor = 0;
+  for (int i = 0; i < length; i++) {
+    x = pointer.elementAt(i).load();
+    address_xor ^= x.address;
+  }
+  return address_xor;
+}
+
+int doLoadInt64Mint(Pointer<Int64> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<int>();
+  }
+  return x;
+}
+
+//
+// Benchmark fixtures.
+//
+
+// Number of repeats: 1000
+//  * CPU: Intel(R) Xeon(R) Gold 6154
+//    * Architecture: x64
+//      * 48000 - 125000 us (without optimizations)
+//      * 14 - ??? us (expected with optimizations, on par with typed data)
+//    * Architecture: SimDBC64
+//      * 52000 - 130000 us (without optimizations)
+//      * 300 - ??? us (expected with optimizations, on par with typed data)
+const N = 1000;
+
+class PointerInt8 extends BenchmarkBase {
+  Pointer<Int8> pointer;
+  PointerInt8() : super("FfiMemory.PointerInt8");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt8(pointer, N);
+    final int x = doLoadInt8(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint8 extends BenchmarkBase {
+  Pointer<Uint8> pointer;
+  PointerUint8() : super("FfiMemory.PointerUint8");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreUint8(pointer, N);
+    final int x = doLoadUint8(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerInt16 extends BenchmarkBase {
+  Pointer<Int16> pointer;
+  PointerInt16() : super("FfiMemory.PointerInt16");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt16(pointer, N);
+    final int x = doLoadInt16(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint16 extends BenchmarkBase {
+  Pointer<Uint16> pointer;
+  PointerUint16() : super("FfiMemory.PointerUint16");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreUint16(pointer, N);
+    final int x = doLoadUint16(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerInt32 extends BenchmarkBase {
+  Pointer<Int32> pointer;
+  PointerInt32() : super("FfiMemory.PointerInt32");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt32(pointer, N);
+    final int x = doLoadInt32(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint32 extends BenchmarkBase {
+  Pointer<Uint32> pointer;
+  PointerUint32() : super("FfiMemory.PointerUint32");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreUint32(pointer, N);
+    final int x = doLoadUint32(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerInt64 extends BenchmarkBase {
+  Pointer<Int64> pointer;
+  PointerInt64() : super("FfiMemory.PointerInt64");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt64(pointer, N);
+    final int x = doLoadInt64(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerUint64 extends BenchmarkBase {
+  Pointer<Uint64> pointer;
+  PointerUint64() : super("FfiMemory.PointerUint64");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreUint64(pointer, N);
+    final int x = doLoadUint64(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerFloat extends BenchmarkBase {
+  Pointer<Float> pointer;
+  PointerFloat() : super("FfiMemory.PointerFloat");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreFloat(pointer, N);
+    final double x = doLoadFloat(pointer, N);
+    if (0.99 * N > x || x > 1.01 * N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerDouble extends BenchmarkBase {
+  Pointer<Double> pointer;
+  PointerDouble() : super("FfiMemory.PointerDouble");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreDouble(pointer, N);
+    final double x = doLoadDouble(pointer, N);
+    if (0.99 * N > x || x > 1.01 * N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerPointer extends BenchmarkBase {
+  Pointer<Pointer<Int8>> pointer;
+  Pointer<Int8> data;
+  PointerPointer() : super("FfiMemory.PointerPointer");
+
+  void setup() {
+    pointer = Pointer.allocate(count: N);
+    data = Pointer.allocate();
+  }
+
+  void teardown() {
+    pointer.free();
+    data.free();
+  }
+
+  void run() {
+    doStorePointer(pointer, N, data);
+    final int x = doLoadPointer(pointer, N);
+    if (x != 0 || x == data.address) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+class PointerInt64Mint extends BenchmarkBase {
+  Pointer<Int64> pointer;
+  PointerInt64Mint() : super("FfiMemory.PointerInt64Mint");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt64Mint(pointer, N);
+    final int x = doLoadInt64Mint(pointer, N);
+    // Using overflow semantics in aggregation.
+    if (x != -N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+main() {
+  final benchmarks = [
+    () => PointerInt8(),
+    () => PointerUint8(),
+    () => PointerInt16(),
+    () => PointerUint16(),
+    () => PointerInt32(),
+    () => PointerUint32(),
+    () => PointerInt64(),
+    () => PointerInt64Mint(),
+    () => PointerUint64(),
+    () => PointerFloat(),
+    () => PointerDouble(),
+    () => PointerPointer(),
+  ];
+  benchmarks.forEach((benchmark) => benchmark().report());
+}
diff --git a/benchmarks/FfiStruct/dart/FfiStruct.dart b/benchmarks/FfiStruct/dart/FfiStruct.dart
new file mode 100644
index 0000000..ede799b
--- /dev/null
+++ b/benchmarks/FfiStruct/dart/FfiStruct.dart
@@ -0,0 +1,120 @@
+// 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.
+
+// Micro-benchmark for ffi struct field stores and loads.
+//
+// Only tests a single field because the FfiMemory benchmark already tests loads
+// and stores of different field sizes.
+
+import 'dart:ffi';
+
+import 'package:benchmark_harness/benchmark_harness.dart';
+
+//
+// Struct field store (plus Pointer elementAt and load).
+//
+
+void doStoreInt32(Pointer<VeryLargeStruct> pointer, int length) {
+  for (int i = 0; i < length; i++) {
+    pointer.elementAt(i).load<VeryLargeStruct>().c = 1;
+  }
+}
+
+//
+// Struct field load (plus Pointer elementAt and load).
+//
+
+int doLoadInt32(Pointer<VeryLargeStruct> pointer, int length) {
+  int x = 0;
+  for (int i = 0; i < length; i++) {
+    x += pointer.elementAt(i).load<VeryLargeStruct>().c;
+  }
+  return x;
+}
+
+//
+// Benchmark fixture.
+//
+
+// Number of repeats: 1000
+//  * CPU: Intel(R) Xeon(R) Gold 6154
+//    * Architecture: x64
+//      * 150000 - 465000 us (without optimizations)
+//      * 14 - ??? us (expected with optimizations, on par with typed data)
+const N = 1000;
+
+class FieldLoadStore extends BenchmarkBase {
+  Pointer<VeryLargeStruct> pointer;
+  FieldLoadStore() : super("FfiStruct.FieldLoadStore");
+
+  void setup() => pointer = Pointer.allocate(count: N);
+  void teardown() => pointer.free();
+
+  void run() {
+    doStoreInt32(pointer, N);
+    final int x = doLoadInt32(pointer, N);
+    if (x != N) {
+      throw Exception("$name: Unexpected result: $x");
+    }
+  }
+}
+
+//
+// Main driver.
+//
+
+main() {
+  final benchmarks = [
+    () => FieldLoadStore(),
+  ];
+  benchmarks.forEach((benchmark) => benchmark().report());
+}
+
+//
+// Test struct.
+//
+class VeryLargeStruct extends Struct<VeryLargeStruct> {
+  @Int8()
+  int a;
+
+  @Int16()
+  int b;
+
+  @Int32()
+  int c;
+
+  @Int64()
+  int d;
+
+  @Uint8()
+  int e;
+
+  @Uint16()
+  int f;
+
+  @Uint32()
+  int g;
+
+  @Uint64()
+  int h;
+
+  @IntPtr()
+  int i;
+
+  @Double()
+  double j;
+
+  @Float()
+  double k;
+
+  Pointer<VeryLargeStruct> parent;
+
+  @IntPtr()
+  int numChildren;
+
+  Pointer<VeryLargeStruct> children;
+
+  @Int8()
+  int smallLastField;
+}
diff --git a/build/config/linux/pkg-config.py b/build/config/linux/pkg-config.py
index fadcc0b..70cc608 100644
--- a/build/config/linux/pkg-config.py
+++ b/build/config/linux/pkg-config.py
@@ -34,139 +34,141 @@
 # success. This allows us to "kind of emulate" a Linux build from other
 # platforms.
 if sys.platform.find("linux") == -1:
-  print "[[],[],[],[],[]]"
-  sys.exit(0)
+    print "[[],[],[],[],[]]"
+    sys.exit(0)
 
 
 def SetConfigPath(options):
-  """Set the PKG_CONFIG_PATH environment variable.
+    """Set the PKG_CONFIG_PATH environment variable.
   This takes into account any sysroot and architecture specification from the
   options on the given command line."""
 
-  sysroot = options.sysroot
-  if not sysroot:
-    sysroot = ""
+    sysroot = options.sysroot
+    if not sysroot:
+        sysroot = ""
 
-  # Compute the library path name based on the architecture.
-  arch = options.arch
-  if sysroot and not arch:
-    print "You must specify an architecture via -a if using a sysroot."
-    sys.exit(1)
-  if arch == 'x64':
-    libpath = 'lib64'
-  else:
-    libpath = 'lib'
+    # Compute the library path name based on the architecture.
+    arch = options.arch
+    if sysroot and not arch:
+        print "You must specify an architecture via -a if using a sysroot."
+        sys.exit(1)
+    if arch == 'x64':
+        libpath = 'lib64'
+    else:
+        libpath = 'lib'
 
-  # Add the sysroot path to the environment's PKG_CONFIG_PATH
-  config_path = sysroot + '/usr/' + libpath + '/pkgconfig'
-  config_path += ':' + sysroot + '/usr/share/pkgconfig'
-  if 'PKG_CONFIG_PATH' in os.environ:
-    os.environ['PKG_CONFIG_PATH'] += ':' + config_path
-  else:
-    os.environ['PKG_CONFIG_PATH'] = config_path
+    # Add the sysroot path to the environment's PKG_CONFIG_PATH
+    config_path = sysroot + '/usr/' + libpath + '/pkgconfig'
+    config_path += ':' + sysroot + '/usr/share/pkgconfig'
+    if 'PKG_CONFIG_PATH' in os.environ:
+        os.environ['PKG_CONFIG_PATH'] += ':' + config_path
+    else:
+        os.environ['PKG_CONFIG_PATH'] = config_path
 
 
 def GetPkgConfigPrefixToStrip(args):
-  """Returns the prefix from pkg-config where packages are installed.
+    """Returns the prefix from pkg-config where packages are installed.
   This returned prefix is the one that should be stripped from the beginning of
   directory names to take into account sysroots."""
-  # Some sysroots, like the Chromium OS ones, may generate paths that are not
-  # relative to the sysroot. For example,
-  # /path/to/chroot/build/x86-generic/usr/lib/pkgconfig/pkg.pc may have all
-  # paths relative to /path/to/chroot (i.e. prefix=/build/x86-generic/usr)
-  # instead of relative to /path/to/chroot/build/x86-generic (i.e prefix=/usr).
-  # To support this correctly, it's necessary to extract the prefix to strip
-  # from pkg-config's |prefix| variable.
-  prefix = subprocess.check_output(["pkg-config", "--variable=prefix"] + args,
-      env=os.environ)
-  if prefix[-4] == '/usr':
-    return prefix[4:]
-  return prefix
+    # Some sysroots, like the Chromium OS ones, may generate paths that are not
+    # relative to the sysroot. For example,
+    # /path/to/chroot/build/x86-generic/usr/lib/pkgconfig/pkg.pc may have all
+    # paths relative to /path/to/chroot (i.e. prefix=/build/x86-generic/usr)
+    # instead of relative to /path/to/chroot/build/x86-generic (i.e prefix=/usr).
+    # To support this correctly, it's necessary to extract the prefix to strip
+    # from pkg-config's |prefix| variable.
+    prefix = subprocess.check_output(
+        ["pkg-config", "--variable=prefix"] + args, env=os.environ)
+    if prefix[-4] == '/usr':
+        return prefix[4:]
+    return prefix
 
 
 def MatchesAnyRegexp(flag, list_of_regexps):
-  """Returns true if the first argument matches any regular expression in the
+    """Returns true if the first argument matches any regular expression in the
   given list."""
-  for regexp in list_of_regexps:
-    if regexp.search(flag) != None:
-      return True
-  return False
+    for regexp in list_of_regexps:
+        if regexp.search(flag) != None:
+            return True
+    return False
 
 
 def RewritePath(path, strip_prefix, sysroot):
-  """Rewrites a path by stripping the prefix and prepending the sysroot."""
-  if os.path.isabs(path) and not path.startswith(sysroot):
-    if path.startswith(strip_prefix):
-      path = path[len(strip_prefix):]
-    path = path.lstrip('/')
-    return os.path.join(sysroot, path)
-  else:
-    return path
+    """Rewrites a path by stripping the prefix and prepending the sysroot."""
+    if os.path.isabs(path) and not path.startswith(sysroot):
+        if path.startswith(strip_prefix):
+            path = path[len(strip_prefix):]
+        path = path.lstrip('/')
+        return os.path.join(sysroot, path)
+    else:
+        return path
 
 
 parser = OptionParser()
-parser.add_option('-p', action='store', dest='pkg_config', type='string',
-                  default='pkg-config')
+parser.add_option(
+    '-p',
+    action='store',
+    dest='pkg_config',
+    type='string',
+    default='pkg-config')
 parser.add_option('-v', action='append', dest='strip_out', type='string')
 parser.add_option('-s', action='store', dest='sysroot', type='string')
 parser.add_option('-a', action='store', dest='arch', type='string')
-parser.add_option('--atleast-version', action='store',
-                  dest='atleast_version', type='string')
+parser.add_option(
+    '--atleast-version', action='store', dest='atleast_version', type='string')
 parser.add_option('--libdir', action='store_true', dest='libdir')
 (options, args) = parser.parse_args()
 
 # Make a list of regular expressions to strip out.
 strip_out = []
 if options.strip_out != None:
-  for regexp in options.strip_out:
-    strip_out.append(re.compile(regexp))
+    for regexp in options.strip_out:
+        strip_out.append(re.compile(regexp))
 
 SetConfigPath(options)
 if options.sysroot:
-  prefix = GetPkgConfigPrefixToStrip(args)
+    prefix = GetPkgConfigPrefixToStrip(args)
 else:
-  prefix = ''
+    prefix = ''
 
 if options.atleast_version:
-  # When asking for the return value, just run pkg-config and print the return
-  # value, no need to do other work.
-  if not subprocess.call([options.pkg_config,
-                          "--atleast-version=" + options.atleast_version] +
-                          args,
-                         env=os.environ):
-    print "true"
-  else:
-    print "false"
-  sys.exit(0)
+    # When asking for the return value, just run pkg-config and print the return
+    # value, no need to do other work.
+    if not subprocess.call(
+        [options.pkg_config, "--atleast-version=" + options.atleast_version] +
+            args,
+            env=os.environ):
+        print "true"
+    else:
+        print "false"
+    sys.exit(0)
 
 if options.libdir:
-  try:
-    libdir = subprocess.check_output([options.pkg_config,
-                                      "--variable=libdir"] +
-                                     args,
-                                     env=os.environ)
-  except:
-    print "Error from pkg-config."
-    sys.exit(1)
-  sys.stdout.write(libdir.strip())
-  sys.exit(0)
+    try:
+        libdir = subprocess.check_output(
+            [options.pkg_config, "--variable=libdir"] + args, env=os.environ)
+    except:
+        print "Error from pkg-config."
+        sys.exit(1)
+    sys.stdout.write(libdir.strip())
+    sys.exit(0)
 
 try:
-  flag_string = subprocess.check_output(
-      [ options.pkg_config, "--cflags", "--libs-only-l", "--libs-only-L" ] +
-      args, env=os.environ)
-  # For now just split on spaces to get the args out. This will break if
-  # pkgconfig returns quoted things with spaces in them, but that doesn't seem
-  # to happen in practice.
-  all_flags = flag_string.strip().split(' ')
+    flag_string = subprocess.check_output(
+        [options.pkg_config, "--cflags", "--libs-only-l", "--libs-only-L"] +
+        args,
+        env=os.environ)
+    # For now just split on spaces to get the args out. This will break if
+    # pkgconfig returns quoted things with spaces in them, but that doesn't seem
+    # to happen in practice.
+    all_flags = flag_string.strip().split(' ')
 except:
-  print "Could not run pkg-config."
-  sys.exit(1)
-
+    print "Could not run pkg-config."
+    sys.exit(1)
 
 sysroot = options.sysroot
 if not sysroot:
-  sysroot = ''
+    sysroot = ''
 
 includes = []
 cflags = []
@@ -175,24 +177,24 @@
 ldflags = []
 
 for flag in all_flags[:]:
-  if len(flag) == 0 or MatchesAnyRegexp(flag, strip_out):
-    continue;
+    if len(flag) == 0 or MatchesAnyRegexp(flag, strip_out):
+        continue
 
-  if flag[:2] == '-l':
-    libs.append(RewritePath(flag[2:], prefix, sysroot))
-  elif flag[:2] == '-L':
-    lib_dirs.append(RewritePath(flag[2:], prefix, sysroot))
-  elif flag[:2] == '-I':
-    includes.append(RewritePath(flag[2:], prefix, sysroot))
-  elif flag[:3] == '-Wl':
-    ldflags.append(flag)
-  elif flag == '-pthread':
-    # Many libs specify "-pthread" which we don't need since we always include
-    # this anyway. Removing it here prevents a bunch of duplicate inclusions on
-    # the command line.
-    pass
-  else:
-    cflags.append(flag)
+    if flag[:2] == '-l':
+        libs.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:2] == '-L':
+        lib_dirs.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:2] == '-I':
+        includes.append(RewritePath(flag[2:], prefix, sysroot))
+    elif flag[:3] == '-Wl':
+        ldflags.append(flag)
+    elif flag == '-pthread':
+        # Many libs specify "-pthread" which we don't need since we always include
+        # this anyway. Removing it here prevents a bunch of duplicate inclusions on
+        # the command line.
+        pass
+    else:
+        cflags.append(flag)
 
 # Output a GN array, the first one is the cflags, the second are the libs. The
 # JSON formatter prints GN compatible lists when everything is a list of
diff --git a/build/config/linux/sysroot_ld_path.py b/build/config/linux/sysroot_ld_path.py
index 4bce7ee..53b094d 100644
--- a/build/config/linux/sysroot_ld_path.py
+++ b/build/config/linux/sysroot_ld_path.py
@@ -12,8 +12,8 @@
 import sys
 
 if len(sys.argv) != 3:
-  print "Need two arguments"
-  sys.exit(1)
+    print "Need two arguments"
+    sys.exit(1)
 
 result = subprocess.check_output([sys.argv[1], sys.argv[2]]).strip()
 
diff --git a/build/config/mac/mac_app.py b/build/config/mac/mac_app.py
index 909fa58..8245967 100644
--- a/build/config/mac/mac_app.py
+++ b/build/config/mac/mac_app.py
@@ -9,105 +9,100 @@
 import subprocess
 import sys
 
-PLUTIL = [
-  '/usr/bin/env',
-  'xcrun',
-  'plutil'
-]
+PLUTIL = ['/usr/bin/env', 'xcrun', 'plutil']
 
 IBTOOL = [
-  '/usr/bin/env',
-  'xcrun',
-  'ibtool',
+    '/usr/bin/env',
+    'xcrun',
+    'ibtool',
 ]
 
 
 def MakeDirectories(path):
-  try:
-    os.makedirs(path)
-  except OSError as exc:
-    if exc.errno == errno.EEXIST and os.path.isdir(path):
-      return 0
-    else:
-      return -1
+    try:
+        os.makedirs(path)
+    except OSError as exc:
+        if exc.errno == errno.EEXIST and os.path.isdir(path):
+            return 0
+        else:
+            return -1
 
-  return 0
+    return 0
 
 
 def ProcessInfoPlist(args):
-  output_plist_file = os.path.abspath(os.path.join(args.output, 'Info.plist'))
-  return subprocess.check_call( PLUTIL + [
-    '-convert',
-    'binary1',
-    '-o',
-    output_plist_file,
-    '--',
-    args.input,
-  ])
+    output_plist_file = os.path.abspath(os.path.join(args.output, 'Info.plist'))
+    return subprocess.check_call(PLUTIL + [
+        '-convert',
+        'binary1',
+        '-o',
+        output_plist_file,
+        '--',
+        args.input,
+    ])
 
 
 def ProcessNIB(args):
-  output_nib_file = os.path.join(os.path.abspath(args.output),
-      "%s.nib" % os.path.splitext(os.path.basename(args.input))[0])
+    output_nib_file = os.path.join(
+        os.path.abspath(args.output),
+        "%s.nib" % os.path.splitext(os.path.basename(args.input))[0])
 
-  return subprocess.check_call(IBTOOL + [
-    '--module',
-    args.module,
-    '--auto-activate-custom-fonts',
-    '--target-device',
-    'mac',
-    '--compile',
-    output_nib_file,
-    os.path.abspath(args.input),
-  ])
+    return subprocess.check_call(IBTOOL + [
+        '--module',
+        args.module,
+        '--auto-activate-custom-fonts',
+        '--target-device',
+        'mac',
+        '--compile',
+        output_nib_file,
+        os.path.abspath(args.input),
+    ])
 
 
 def GenerateProjectStructure(args):
-  application_path = os.path.join( args.dir, args.name + ".app", "Contents" )
-  return MakeDirectories( application_path )
+    application_path = os.path.join(args.dir, args.name + ".app", "Contents")
+    return MakeDirectories(application_path)
 
 
 def Main():
-  parser = argparse.ArgumentParser(description='A script that aids in '
-                                   'the creation of an Mac application')
+    parser = argparse.ArgumentParser(description='A script that aids in '
+                                     'the creation of an Mac application')
 
-  subparsers = parser.add_subparsers()
+    subparsers = parser.add_subparsers()
 
-  # Plist Parser
+    # Plist Parser
 
-  plist_parser = subparsers.add_parser('plist',
-                                       help='Process the Info.plist')
-  plist_parser.set_defaults(func=ProcessInfoPlist)
-  
-  plist_parser.add_argument('-i', dest='input', help='The input plist path')
-  plist_parser.add_argument('-o', dest='output', help='The output plist dir')
+    plist_parser = subparsers.add_parser('plist', help='Process the Info.plist')
+    plist_parser.set_defaults(func=ProcessInfoPlist)
 
-  # NIB Parser
+    plist_parser.add_argument('-i', dest='input', help='The input plist path')
+    plist_parser.add_argument('-o', dest='output', help='The output plist dir')
 
-  plist_parser = subparsers.add_parser('nib',
-                                       help='Process a NIB file')
-  plist_parser.set_defaults(func=ProcessNIB)
-  
-  plist_parser.add_argument('-i', dest='input', help='The input nib path')
-  plist_parser.add_argument('-o', dest='output', help='The output nib dir')
-  plist_parser.add_argument('-m', dest='module', help='The module name')
+    # NIB Parser
 
-  # Directory Structure Parser
+    plist_parser = subparsers.add_parser('nib', help='Process a NIB file')
+    plist_parser.set_defaults(func=ProcessNIB)
 
-  dir_struct_parser = subparsers.add_parser('structure',
-                      help='Creates the directory of an Mac application')
+    plist_parser.add_argument('-i', dest='input', help='The input nib path')
+    plist_parser.add_argument('-o', dest='output', help='The output nib dir')
+    plist_parser.add_argument('-m', dest='module', help='The module name')
 
-  dir_struct_parser.set_defaults(func=GenerateProjectStructure)
+    # Directory Structure Parser
 
-  dir_struct_parser.add_argument('-d', dest='dir', help='Out directory')
-  dir_struct_parser.add_argument('-n', dest='name', help='App name')
+    dir_struct_parser = subparsers.add_parser(
+        'structure', help='Creates the directory of an Mac application')
 
-  # Engage!
+    dir_struct_parser.set_defaults(func=GenerateProjectStructure)
 
-  args = parser.parse_args()
+    dir_struct_parser.add_argument('-d', dest='dir', help='Out directory')
+    dir_struct_parser.add_argument('-n', dest='name', help='App name')
 
-  return args.func(args)
+    # Engage!
+
+    args = parser.parse_args()
+
+    return args.func(args)
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/build/detect_host_arch.py b/build/detect_host_arch.py
index cb61ec7..1b179cb 100755
--- a/build/detect_host_arch.py
+++ b/build/detect_host_arch.py
@@ -2,7 +2,6 @@
 # Copyright 2014 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.
-
 """Outputs host CPU architecture in format recognized by gyp."""
 
 import platform
@@ -11,41 +10,42 @@
 
 
 def HostArch():
-  """Returns the host architecture with a predictable string."""
-  host_arch = platform.machine()
+    """Returns the host architecture with a predictable string."""
+    host_arch = platform.machine()
 
-  # Convert machine type to format recognized by gyp.
-  if re.match(r'i.86', host_arch) or host_arch == 'i86pc':
-    host_arch = 'ia32'
-  elif host_arch in ['x86_64', 'amd64']:
-    host_arch = 'x64'
-  elif host_arch.startswith('arm'):
-    host_arch = 'arm'
-  elif host_arch.startswith('aarch64'):
-    host_arch = 'arm64'
-  elif host_arch.startswith('mips'):
-    host_arch = 'mips'
-  elif host_arch.startswith('ppc'):
-    host_arch = 'ppc'
-  elif host_arch.startswith('s390'):
-    host_arch = 's390'
+    # Convert machine type to format recognized by gyp.
+    if re.match(r'i.86', host_arch) or host_arch == 'i86pc':
+        host_arch = 'ia32'
+    elif host_arch in ['x86_64', 'amd64']:
+        host_arch = 'x64'
+    elif host_arch.startswith('arm'):
+        host_arch = 'arm'
+    elif host_arch.startswith('aarch64'):
+        host_arch = 'arm64'
+    elif host_arch.startswith('mips'):
+        host_arch = 'mips'
+    elif host_arch.startswith('ppc'):
+        host_arch = 'ppc'
+    elif host_arch.startswith('s390'):
+        host_arch = 's390'
 
+    # platform.machine is based on running kernel. It's possible to use 64-bit
+    # kernel with 32-bit userland, e.g. to give linker slightly more memory.
+    # Distinguish between different userland bitness by querying
+    # the python binary.
+    if host_arch == 'x64' and platform.architecture()[0] == '32bit':
+        host_arch = 'ia32'
+    if host_arch == 'arm64' and platform.architecture()[0] == '32bit':
+        host_arch = 'arm'
 
-  # platform.machine is based on running kernel. It's possible to use 64-bit
-  # kernel with 32-bit userland, e.g. to give linker slightly more memory.
-  # Distinguish between different userland bitness by querying
-  # the python binary.
-  if host_arch == 'x64' and platform.architecture()[0] == '32bit':
-    host_arch = 'ia32'
-  if host_arch == 'arm64' and platform.architecture()[0] == '32bit':
-    host_arch = 'arm'
-
-  return host_arch
+    return host_arch
 
 
 def DoMain(_):
-  """Hook to be called from gyp without starting a separate python
+    """Hook to be called from gyp without starting a separate python
   interpreter."""
-  return HostArch()
+    return HostArch()
+
+
 if __name__ == '__main__':
-  print DoMain([])
+    print DoMain([])
diff --git a/build/gn_helpers.py b/build/gn_helpers.py
index 9a94abf..3acb329 100644
--- a/build/gn_helpers.py
+++ b/build/gn_helpers.py
@@ -1,39 +1,40 @@
 # Copyright 2014 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.
-
 """Helper functions useful when writing scripts that are run from GN's
 exec_script function."""
 
+
 class GNException(Exception):
-  pass
+    pass
 
 
-def ToGNString(value, allow_dicts = True):
-  """Prints the given value to stdout.
+def ToGNString(value, allow_dicts=True):
+    """Prints the given value to stdout.
 
   allow_dicts indicates if this function will allow converting dictionaries
   to GN scopes. This is only possible at the top level, you can't nest a
   GN scope in a list, so this should be set to False for recursive calls."""
-  if isinstance(value, str) or isinstance(value, unicode):
-    if value.find('\n') >= 0:
-      raise GNException("Trying to print a string with a newline in it.")
-    return '"' + value.replace('"', '\\"') + '"'
+    if isinstance(value, str) or isinstance(value, unicode):
+        if value.find('\n') >= 0:
+            raise GNException("Trying to print a string with a newline in it.")
+        return '"' + value.replace('"', '\\"') + '"'
 
-  if isinstance(value, list):
-    return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
+    if isinstance(value, list):
+        return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
 
-  if isinstance(value, dict):
-    if not allow_dicts:
-      raise GNException("Attempting to recursively print a dictionary.")
-    result = ""
-    for key in value:
-      if not isinstance(key, str):
-        raise GNException("Dictionary key is not a string.")
-      result += "%s = %s\n" % (key, ToGNString(value[key], False))
-    return result
+    if isinstance(value, dict):
+        if not allow_dicts:
+            raise GNException("Attempting to recursively print a dictionary.")
+        result = ""
+        for key in value:
+            if not isinstance(key, str):
+                raise GNException("Dictionary key is not a string.")
+            result += "%s = %s\n" % (key, ToGNString(value[key], False))
+        return result
 
-  if isinstance(value, int):
-    return str(value)
+    if isinstance(value, int):
+        return str(value)
 
-  raise GNException("Unsupported type %s (value %s) when printing to GN." % (type(value), value))
+    raise GNException("Unsupported type %s (value %s) when printing to GN." %
+                      (type(value), value))
diff --git a/build/gn_run_binary.py b/build/gn_run_binary.py
index 718bf24..0c2287d 100755
--- a/build/gn_run_binary.py
+++ b/build/gn_run_binary.py
@@ -2,7 +2,6 @@
 # Copyright 2014 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.
-
 """Helper script for GN to run an arbitrary binary. See compiled_action.gni.
 
 Run with:
@@ -18,47 +17,50 @@
 import sys
 import subprocess
 
+
 # Run a command, swallowing the output unless there is an error.
 def run_command(command):
-  try:
-    subprocess.check_output(command, stderr=subprocess.STDOUT)
-    return 0
-  except subprocess.CalledProcessError as e:
-    return ("Command failed: " + ' '.join(command) + "\n" +
-            "output: " + e.output)
-  except OSError as e:
-    return ("Command failed: " + ' '.join(command) + "\n" +
-            "output: " + e.strerror)
+    try:
+        subprocess.check_output(command, stderr=subprocess.STDOUT)
+        return 0
+    except subprocess.CalledProcessError as e:
+        return ("Command failed: " + ' '.join(command) + "\n" + "output: " +
+                e.output)
+    except OSError as e:
+        return ("Command failed: " + ' '.join(command) + "\n" + "output: " +
+                e.strerror)
+
 
 def main(argv):
-  error_exit = 0
-  if argv[1] == "compiled_action":
-    error_exit = 1
-  elif argv[1] != "exec_script":
-    print ("The first argument should be either "
-           "'compiled_action' or 'exec_script")
-    return 1
+    error_exit = 0
+    if argv[1] == "compiled_action":
+        error_exit = 1
+    elif argv[1] != "exec_script":
+        print("The first argument should be either "
+              "'compiled_action' or 'exec_script")
+        return 1
 
-  # Unless the path is absolute, this script is designed to run binaries
-  # produced by the current build. We always prefix it with "./" to avoid
-  # picking up system versions that might also be on the path.
-  if os.path.isabs(argv[2]):
-    path = argv[2]
-  else:
-    path = './' + argv[2]
+    # Unless the path is absolute, this script is designed to run binaries
+    # produced by the current build. We always prefix it with "./" to avoid
+    # picking up system versions that might also be on the path.
+    if os.path.isabs(argv[2]):
+        path = argv[2]
+    else:
+        path = './' + argv[2]
 
-  if not os.path.isfile(path):
-    print ("Binary not found: " + path)
-    return error_exit
+    if not os.path.isfile(path):
+        print("Binary not found: " + path)
+        return error_exit
 
-  # The rest of the arguments are passed directly to the executable.
-  args = [path] + argv[3:]
+    # The rest of the arguments are passed directly to the executable.
+    args = [path] + argv[3:]
 
-  result = run_command(args)
-  if result != 0:
-    print (result)
-    return error_exit
-  return 0
+    result = run_command(args)
+    if result != 0:
+        print(result)
+        return error_exit
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/build/linux/sysroot_scripts/install-sysroot.py b/build/linux/sysroot_scripts/install-sysroot.py
index 304824d9..1fe6998 100755
--- a/build/linux/sysroot_scripts/install-sysroot.py
+++ b/build/linux/sysroot_scripts/install-sysroot.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2013 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.
-
 """Install Debian sysroots for building chromium.
 """
 
@@ -32,7 +31,6 @@
 sys.path.append(os.path.dirname(os.path.dirname(SCRIPT_DIR)))
 import detect_host_arch
 
-
 URL_PREFIX = 'https://commondatastorage.googleapis.com'
 URL_PATH = 'chrome-linux-sysroot/toolchain'
 
@@ -40,132 +38,136 @@
 
 
 class Error(Exception):
-  pass
+    pass
 
 
 def GetSha1(filename):
-  sha1 = hashlib.sha1()
-  with open(filename, 'rb') as f:
-    while True:
-      # Read in 1mb chunks, so it doesn't all have to be loaded into memory.
-      chunk = f.read(1024*1024)
-      if not chunk:
-        break
-      sha1.update(chunk)
-  return sha1.hexdigest()
+    sha1 = hashlib.sha1()
+    with open(filename, 'rb') as f:
+        while True:
+            # Read in 1mb chunks, so it doesn't all have to be loaded into memory.
+            chunk = f.read(1024 * 1024)
+            if not chunk:
+                break
+            sha1.update(chunk)
+    return sha1.hexdigest()
 
 
 def DetectHostArch():
-  # Figure out host arch using build/detect_host_arch.py and
-  # set target_arch to host arch
-  detected_host_arch = detect_host_arch.HostArch()
-  if detected_host_arch == 'x64':
-    return 'amd64'
-  elif detected_host_arch == 'ia32':
-    return 'i386'
-  elif detected_host_arch == 'arm':
-    return 'arm'
-  elif detected_host_arch == 'arm64':
-    return 'arm64'
-  elif detected_host_arch == 'mips':
-    return 'mips'
-  elif detected_host_arch == 'ppc':
-    return 'ppc'
-  elif detected_host_arch == 's390':
-    return 's390'
+    # Figure out host arch using build/detect_host_arch.py and
+    # set target_arch to host arch
+    detected_host_arch = detect_host_arch.HostArch()
+    if detected_host_arch == 'x64':
+        return 'amd64'
+    elif detected_host_arch == 'ia32':
+        return 'i386'
+    elif detected_host_arch == 'arm':
+        return 'arm'
+    elif detected_host_arch == 'arm64':
+        return 'arm64'
+    elif detected_host_arch == 'mips':
+        return 'mips'
+    elif detected_host_arch == 'ppc':
+        return 'ppc'
+    elif detected_host_arch == 's390':
+        return 's390'
 
-  raise Error('Unrecognized host arch: %s' % detected_host_arch)
+    raise Error('Unrecognized host arch: %s' % detected_host_arch)
 
 
 def main(args):
-  parser = optparse.OptionParser('usage: %prog [OPTIONS]', description=__doc__)
-  parser.add_option('--arch', type='choice', choices=VALID_ARCHS,
-                    help='Sysroot architecture: %s' % ', '.join(VALID_ARCHS))
-  options, _ = parser.parse_args(args)
-  if not sys.platform.startswith('linux'):
+    parser = optparse.OptionParser(
+        'usage: %prog [OPTIONS]', description=__doc__)
+    parser.add_option(
+        '--arch',
+        type='choice',
+        choices=VALID_ARCHS,
+        help='Sysroot architecture: %s' % ', '.join(VALID_ARCHS))
+    options, _ = parser.parse_args(args)
+    if not sys.platform.startswith('linux'):
+        return 0
+
+    if not options.arch:
+        print 'You much specify either --arch or --running-as-hook'
+        return 1
+    InstallDefaultSysrootForArch(options.arch)
+
     return 0
 
-  if not options.arch:
-    print 'You much specify either --arch or --running-as-hook'
-    return 1
-  InstallDefaultSysrootForArch(options.arch)
-
-  return 0
-
 
 def InstallDefaultSysrootForArch(target_arch):
-  if target_arch == 'amd64':
-    InstallSysroot('Jessie', 'amd64')
-  elif target_arch == 'arm':
-    InstallSysroot('Jessie', 'arm')
-  elif target_arch == 'arm64':
-    InstallSysroot('Jessie', 'arm64')
-  elif target_arch == 'i386':
-    InstallSysroot('Jessie', 'i386')
-  elif target_arch == 'mips':
-    InstallSysroot('Jessie', 'mips')
-  else:
-    raise Error('Unknown architecture: %s' % target_arch)
+    if target_arch == 'amd64':
+        InstallSysroot('Jessie', 'amd64')
+    elif target_arch == 'arm':
+        InstallSysroot('Jessie', 'arm')
+    elif target_arch == 'arm64':
+        InstallSysroot('Jessie', 'arm64')
+    elif target_arch == 'i386':
+        InstallSysroot('Jessie', 'i386')
+    elif target_arch == 'mips':
+        InstallSysroot('Jessie', 'mips')
+    else:
+        raise Error('Unknown architecture: %s' % target_arch)
 
 
 def InstallSysroot(target_platform, target_arch):
-  # The sysroot directory should match the one specified in build/common.gypi.
-  # TODO(thestig) Consider putting this elsewhere to avoid having to recreate
-  # it on every build.
-  linux_dir = os.path.dirname(SCRIPT_DIR)
+    # The sysroot directory should match the one specified in build/common.gypi.
+    # TODO(thestig) Consider putting this elsewhere to avoid having to recreate
+    # it on every build.
+    linux_dir = os.path.dirname(SCRIPT_DIR)
 
-  sysroots_file = os.path.join(SCRIPT_DIR, 'sysroots.json')
-  sysroots = json.load(open(sysroots_file))
-  sysroot_key = '%s_%s' % (target_platform.lower(), target_arch)
-  if sysroot_key not in sysroots:
-    raise Error('No sysroot for: %s %s' % (target_platform, target_arch))
-  sysroot_dict = sysroots[sysroot_key]
-  revision = sysroot_dict['Revision']
-  tarball_filename = sysroot_dict['Tarball']
-  tarball_sha1sum = sysroot_dict['Sha1Sum']
-  sysroot = os.path.join(linux_dir, sysroot_dict['SysrootDir'])
+    sysroots_file = os.path.join(SCRIPT_DIR, 'sysroots.json')
+    sysroots = json.load(open(sysroots_file))
+    sysroot_key = '%s_%s' % (target_platform.lower(), target_arch)
+    if sysroot_key not in sysroots:
+        raise Error('No sysroot for: %s %s' % (target_platform, target_arch))
+    sysroot_dict = sysroots[sysroot_key]
+    revision = sysroot_dict['Revision']
+    tarball_filename = sysroot_dict['Tarball']
+    tarball_sha1sum = sysroot_dict['Sha1Sum']
+    sysroot = os.path.join(linux_dir, sysroot_dict['SysrootDir'])
 
-  url = '%s/%s/%s/%s' % (URL_PREFIX, URL_PATH, revision, tarball_filename)
+    url = '%s/%s/%s/%s' % (URL_PREFIX, URL_PATH, revision, tarball_filename)
 
-  stamp = os.path.join(sysroot, '.stamp')
-  if os.path.exists(stamp):
-    with open(stamp) as s:
-      if s.read() == url:
-        return
+    stamp = os.path.join(sysroot, '.stamp')
+    if os.path.exists(stamp):
+        with open(stamp) as s:
+            if s.read() == url:
+                return
 
-  print 'Installing Debian %s %s root image: %s' % \
-      (target_platform, target_arch, sysroot)
-  if os.path.isdir(sysroot):
-    shutil.rmtree(sysroot)
-  os.mkdir(sysroot)
-  tarball = os.path.join(sysroot, tarball_filename)
-  print 'Downloading %s' % url
-  sys.stdout.flush()
-  sys.stderr.flush()
-  for _ in range(3):
-    try:
-      response = urllib2.urlopen(url)
-      with open(tarball, "wb") as f:
-        f.write(response.read())
-      break
-    except:
-      pass
-  else:
-    raise Error('Failed to download %s' % url)
-  sha1sum = GetSha1(tarball)
-  if sha1sum != tarball_sha1sum:
-    raise Error('Tarball sha1sum is wrong.'
-                'Expected %s, actual: %s' % (tarball_sha1sum, sha1sum))
-  subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot])
-  os.remove(tarball)
+    print 'Installing Debian %s %s root image: %s' % \
+        (target_platform, target_arch, sysroot)
+    if os.path.isdir(sysroot):
+        shutil.rmtree(sysroot)
+    os.mkdir(sysroot)
+    tarball = os.path.join(sysroot, tarball_filename)
+    print 'Downloading %s' % url
+    sys.stdout.flush()
+    sys.stderr.flush()
+    for _ in range(3):
+        try:
+            response = urllib2.urlopen(url)
+            with open(tarball, "wb") as f:
+                f.write(response.read())
+            break
+        except:
+            pass
+    else:
+        raise Error('Failed to download %s' % url)
+    sha1sum = GetSha1(tarball)
+    if sha1sum != tarball_sha1sum:
+        raise Error('Tarball sha1sum is wrong.'
+                    'Expected %s, actual: %s' % (tarball_sha1sum, sha1sum))
+    subprocess.check_call(['tar', 'xf', tarball, '-C', sysroot])
+    os.remove(tarball)
 
-  with open(stamp, 'w') as s:
-    s.write(url)
+    with open(stamp, 'w') as s:
+        s.write(url)
 
 
 if __name__ == '__main__':
-  try:
-    sys.exit(main(sys.argv[1:]))
-  except Error as e:
-    sys.stderr.write(str(e) + '\n')
-    sys.exit(1)
+    try:
+        sys.exit(main(sys.argv[1:]))
+    except Error as e:
+        sys.stderr.write(str(e) + '\n')
+        sys.exit(1)
diff --git a/build/mac/change_mach_o_flags.py b/build/mac/change_mach_o_flags.py
index c2aeaec..427117c 100755
--- a/build/mac/change_mach_o_flags.py
+++ b/build/mac/change_mach_o_flags.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011 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.
-
 """Usage: change_mach_o_flags.py [--executable-heap] [--no-pie] <executablepath>
 
 Arranges for the executable at |executable_path| to have its data (heap)
@@ -78,7 +77,6 @@
 import struct
 import sys
 
-
 # <mach-o/fat.h>
 FAT_MAGIC = 0xcafebabe
 FAT_CIGAM = 0xbebafeca
@@ -94,86 +92,86 @@
 
 
 class MachOError(Exception):
-  """A class for exceptions thrown by this module."""
+    """A class for exceptions thrown by this module."""
 
-  pass
+    pass
 
 
 def CheckedSeek(file, offset):
-  """Seeks the file-like object at |file| to offset |offset| and raises a
+    """Seeks the file-like object at |file| to offset |offset| and raises a
   MachOError if anything funny happens."""
 
-  file.seek(offset, os.SEEK_SET)
-  new_offset = file.tell()
-  if new_offset != offset:
-    raise MachOError, \
-          'seek: expected offset %d, observed %d' % (offset, new_offset)
+    file.seek(offset, os.SEEK_SET)
+    new_offset = file.tell()
+    if new_offset != offset:
+        raise MachOError, \
+              'seek: expected offset %d, observed %d' % (offset, new_offset)
 
 
 def CheckedRead(file, count):
-  """Reads |count| bytes from the file-like |file| object, raising a
+    """Reads |count| bytes from the file-like |file| object, raising a
   MachOError if any other number of bytes is read."""
 
-  bytes = file.read(count)
-  if len(bytes) != count:
-    raise MachOError, \
-          'read: expected length %d, observed %d' % (count, len(bytes))
+    bytes = file.read(count)
+    if len(bytes) != count:
+        raise MachOError, \
+              'read: expected length %d, observed %d' % (count, len(bytes))
 
-  return bytes
+    return bytes
 
 
 def ReadUInt32(file, endian):
-  """Reads an unsinged 32-bit integer from the file-like |file| object,
+    """Reads an unsinged 32-bit integer from the file-like |file| object,
   treating it as having endianness specified by |endian| (per the |struct|
   module), and returns it as a number. Raises a MachOError if the proper
   length of data can't be read from |file|."""
 
-  bytes = CheckedRead(file, 4)
+    bytes = CheckedRead(file, 4)
 
-  (uint32,) = struct.unpack(endian + 'I', bytes)
-  return uint32
+    (uint32,) = struct.unpack(endian + 'I', bytes)
+    return uint32
 
 
 def ReadMachHeader(file, endian):
-  """Reads an entire |mach_header| structure (<mach-o/loader.h>) from the
+    """Reads an entire |mach_header| structure (<mach-o/loader.h>) from the
   file-like |file| object, treating it as having endianness specified by
   |endian| (per the |struct| module), and returns a 7-tuple of its members
   as numbers. Raises a MachOError if the proper length of data can't be read
   from |file|."""
 
-  bytes = CheckedRead(file, 28)
+    bytes = CheckedRead(file, 28)
 
-  magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = \
-      struct.unpack(endian + '7I', bytes)
-  return magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags
+    magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = \
+        struct.unpack(endian + '7I', bytes)
+    return magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags
 
 
 def ReadFatArch(file):
-  """Reads an entire |fat_arch| structure (<mach-o/fat.h>) from the file-like
+    """Reads an entire |fat_arch| structure (<mach-o/fat.h>) from the file-like
   |file| object, treating it as having endianness specified by |endian|
   (per the |struct| module), and returns a 5-tuple of its members as numbers.
   Raises a MachOError if the proper length of data can't be read from
   |file|."""
 
-  bytes = CheckedRead(file, 20)
+    bytes = CheckedRead(file, 20)
 
-  cputype, cpusubtype, offset, size, align = struct.unpack('>5I', bytes)
-  return cputype, cpusubtype, offset, size, align
+    cputype, cpusubtype, offset, size, align = struct.unpack('>5I', bytes)
+    return cputype, cpusubtype, offset, size, align
 
 
 def WriteUInt32(file, uint32, endian):
-  """Writes |uint32| as an unsinged 32-bit integer to the file-like |file|
+    """Writes |uint32| as an unsinged 32-bit integer to the file-like |file|
   object, treating it as having endianness specified by |endian| (per the
   |struct| module)."""
 
-  bytes = struct.pack(endian + 'I', uint32)
-  assert len(bytes) == 4
+    bytes = struct.pack(endian + 'I', uint32)
+    assert len(bytes) == 4
 
-  file.write(bytes)
+    file.write(bytes)
 
 
 def HandleMachOFile(file, options, offset=0):
-  """Seeks the file-like |file| object to |offset|, reads its |mach_header|,
+    """Seeks the file-like |file| object to |offset|, reads its |mach_header|,
   and rewrites the header's |flags| field if appropriate. The header's
   endianness is detected. Both 32-bit and 64-bit Mach-O headers are supported
   (mach_header and mach_header_64). Raises MachOError if used on a header that
@@ -182,92 +180,98 @@
   according to |options| and written to |file| if any changes need to be made.
   If already set or clear as specified by |options|, nothing is written."""
 
-  CheckedSeek(file, offset)
-  magic = ReadUInt32(file, '<')
-  if magic == MH_MAGIC or magic == MH_MAGIC_64:
-    endian = '<'
-  elif magic == MH_CIGAM or magic == MH_CIGAM_64:
-    endian = '>'
-  else:
-    raise MachOError, \
-          'Mach-O file at offset %d has illusion of magic' % offset
+    CheckedSeek(file, offset)
+    magic = ReadUInt32(file, '<')
+    if magic == MH_MAGIC or magic == MH_MAGIC_64:
+        endian = '<'
+    elif magic == MH_CIGAM or magic == MH_CIGAM_64:
+        endian = '>'
+    else:
+        raise MachOError, \
+              'Mach-O file at offset %d has illusion of magic' % offset
 
-  CheckedSeek(file, offset)
-  magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = \
-      ReadMachHeader(file, endian)
-  assert magic == MH_MAGIC or magic == MH_MAGIC_64
-  if filetype != MH_EXECUTE:
-    raise MachOError, \
-          'Mach-O file at offset %d is type 0x%x, expected MH_EXECUTE' % \
-              (offset, filetype)
+    CheckedSeek(file, offset)
+    magic, cputype, cpusubtype, filetype, ncmds, sizeofcmds, flags = \
+        ReadMachHeader(file, endian)
+    assert magic == MH_MAGIC or magic == MH_MAGIC_64
+    if filetype != MH_EXECUTE:
+        raise MachOError, \
+              'Mach-O file at offset %d is type 0x%x, expected MH_EXECUTE' % \
+                  (offset, filetype)
 
-  original_flags = flags
+    original_flags = flags
 
-  if options.no_heap_execution:
-    flags |= MH_NO_HEAP_EXECUTION
-  else:
-    flags &= ~MH_NO_HEAP_EXECUTION
+    if options.no_heap_execution:
+        flags |= MH_NO_HEAP_EXECUTION
+    else:
+        flags &= ~MH_NO_HEAP_EXECUTION
 
-  if options.pie:
-    flags |= MH_PIE
-  else:
-    flags &= ~MH_PIE
+    if options.pie:
+        flags |= MH_PIE
+    else:
+        flags &= ~MH_PIE
 
-  if flags != original_flags:
-    CheckedSeek(file, offset + 24)
-    WriteUInt32(file, flags, endian)
+    if flags != original_flags:
+        CheckedSeek(file, offset + 24)
+        WriteUInt32(file, flags, endian)
 
 
 def HandleFatFile(file, options, fat_offset=0):
-  """Seeks the file-like |file| object to |offset| and loops over its
+    """Seeks the file-like |file| object to |offset| and loops over its
   |fat_header| entries, calling HandleMachOFile for each."""
 
-  CheckedSeek(file, fat_offset)
-  magic = ReadUInt32(file, '>')
-  assert magic == FAT_MAGIC
+    CheckedSeek(file, fat_offset)
+    magic = ReadUInt32(file, '>')
+    assert magic == FAT_MAGIC
 
-  nfat_arch = ReadUInt32(file, '>')
+    nfat_arch = ReadUInt32(file, '>')
 
-  for index in xrange(0, nfat_arch):
-    cputype, cpusubtype, offset, size, align = ReadFatArch(file)
-    assert size >= 28
+    for index in xrange(0, nfat_arch):
+        cputype, cpusubtype, offset, size, align = ReadFatArch(file)
+        assert size >= 28
 
-    # HandleMachOFile will seek around. Come back here after calling it, in
-    # case it sought.
-    fat_arch_offset = file.tell()
-    HandleMachOFile(file, options, offset)
-    CheckedSeek(file, fat_arch_offset)
+        # HandleMachOFile will seek around. Come back here after calling it, in
+        # case it sought.
+        fat_arch_offset = file.tell()
+        HandleMachOFile(file, options, offset)
+        CheckedSeek(file, fat_arch_offset)
 
 
 def main(me, args):
-  parser = optparse.OptionParser('%prog [options] <executable_path>')
-  parser.add_option('--executable-heap', action='store_false',
-                    dest='no_heap_execution', default=True,
-                    help='Clear the MH_NO_HEAP_EXECUTION bit')
-  parser.add_option('--no-pie', action='store_false',
-                    dest='pie', default=True,
-                    help='Clear the MH_PIE bit')
-  (options, loose_args) = parser.parse_args(args)
-  if len(loose_args) != 1:
-    parser.print_usage()
-    return 1
+    parser = optparse.OptionParser('%prog [options] <executable_path>')
+    parser.add_option(
+        '--executable-heap',
+        action='store_false',
+        dest='no_heap_execution',
+        default=True,
+        help='Clear the MH_NO_HEAP_EXECUTION bit')
+    parser.add_option(
+        '--no-pie',
+        action='store_false',
+        dest='pie',
+        default=True,
+        help='Clear the MH_PIE bit')
+    (options, loose_args) = parser.parse_args(args)
+    if len(loose_args) != 1:
+        parser.print_usage()
+        return 1
 
-  executable_path = loose_args[0]
-  executable_file = open(executable_path, 'rb+')
+    executable_path = loose_args[0]
+    executable_file = open(executable_path, 'rb+')
 
-  magic = ReadUInt32(executable_file, '<')
-  if magic == FAT_CIGAM:
-    # Check FAT_CIGAM and not FAT_MAGIC because the read was little-endian.
-    HandleFatFile(executable_file, options)
-  elif magic == MH_MAGIC or magic == MH_CIGAM or \
-      magic == MH_MAGIC_64 or magic == MH_CIGAM_64:
-    HandleMachOFile(executable_file, options)
-  else:
-    raise MachOError, '%s is not a Mach-O or fat file' % executable_file
+    magic = ReadUInt32(executable_file, '<')
+    if magic == FAT_CIGAM:
+        # Check FAT_CIGAM and not FAT_MAGIC because the read was little-endian.
+        HandleFatFile(executable_file, options)
+    elif magic == MH_MAGIC or magic == MH_CIGAM or \
+        magic == MH_MAGIC_64 or magic == MH_CIGAM_64:
+        HandleMachOFile(executable_file, options)
+    else:
+        raise MachOError, '%s is not a Mach-O or fat file' % executable_file
 
-  executable_file.close()
-  return 0
+    executable_file.close()
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[0], sys.argv[1:]))
+    sys.exit(main(sys.argv[0], sys.argv[1:]))
diff --git a/build/mac/find_sdk.py b/build/mac/find_sdk.py
index 0534766..3e7bbc1 100755
--- a/build/mac/find_sdk.py
+++ b/build/mac/find_sdk.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2012 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.
-
 """Prints the lowest locally available SDK version greater than or equal to a
 given minimum sdk version to standard output.
 
@@ -15,76 +14,91 @@
 import subprocess
 import sys
 
-
 from optparse import OptionParser
 
 
 def parse_version(version_str):
-  """'10.6' => [10, 6]"""
-  return map(int, re.findall(r'(\d+)', version_str))
+    """'10.6' => [10, 6]"""
+    return map(int, re.findall(r'(\d+)', version_str))
 
 
 def main():
-  parser = OptionParser()
-  parser.add_option("--verify",
-                    action="store_true", dest="verify", default=False,
-                    help="return the sdk argument and warn if it doesn't exist")
-  parser.add_option("--sdk_path",
-                    action="store", type="string", dest="sdk_path", default="",
-                    help="user-specified SDK path; bypasses verification")
-  parser.add_option("--print_sdk_path",
-                    action="store_true", dest="print_sdk_path", default=False,
-                    help="Additionaly print the path the SDK (appears first).")
-  (options, args) = parser.parse_args()
-  min_sdk_version = args[0]
+    parser = OptionParser()
+    parser.add_option(
+        "--verify",
+        action="store_true",
+        dest="verify",
+        default=False,
+        help="return the sdk argument and warn if it doesn't exist")
+    parser.add_option(
+        "--sdk_path",
+        action="store",
+        type="string",
+        dest="sdk_path",
+        default="",
+        help="user-specified SDK path; bypasses verification")
+    parser.add_option(
+        "--print_sdk_path",
+        action="store_true",
+        dest="print_sdk_path",
+        default=False,
+        help="Additionaly print the path the SDK (appears first).")
+    (options, args) = parser.parse_args()
+    min_sdk_version = args[0]
 
-  job = subprocess.Popen(['xcode-select', '-print-path'],
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.STDOUT)
-  out, err = job.communicate()
-  if job.returncode != 0:
-    print >> sys.stderr, out
-    print >> sys.stderr, err
-    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')
-  sdks = [re.findall('^MacOSX(10\.\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 = [s for s in sdks  # ['10.5', '10.6'] => ['10.6']
-          if parse_version(s) >= parse_version(min_sdk_version)]
-  if not sdks:
-    raise Exception('No %s+ SDK found' % min_sdk_version)
-  best_sdk = sorted(sdks, key=parse_version)[0]
+    job = subprocess.Popen(['xcode-select', '-print-path'],
+                           stdout=subprocess.PIPE,
+                           stderr=subprocess.STDOUT)
+    out, err = job.communicate()
+    if job.returncode != 0:
+        print >> sys.stderr, out
+        print >> sys.stderr, err
+        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')
+    sdks = [
+        re.findall('^MacOSX(10\.\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 = [
+        s for s in sdks  # ['10.5', '10.6'] => ['10.6']
+        if parse_version(s) >= parse_version(min_sdk_version)
+    ]
+    if not sdks:
+        raise Exception('No %s+ SDK found' % min_sdk_version)
+    best_sdk = sorted(sdks, key=parse_version)[0]
 
-  if options.verify and best_sdk != min_sdk_version and not options.sdk_path:
-    print >> sys.stderr, ''
-    print >> sys.stderr, '                                           vvvvvvv'
-    print >> sys.stderr, ''
-    print >> sys.stderr, \
-        'This build requires the %s SDK, but it was not found on your system.' \
-        % min_sdk_version
-    print >> sys.stderr, \
-        'Either install it, or explicitly set mac_sdk in your GYP_DEFINES.'
-    print >> sys.stderr, ''
-    print >> sys.stderr, '                                           ^^^^^^^'
-    print >> sys.stderr, ''
-    return min_sdk_version
+    if options.verify and best_sdk != min_sdk_version and not options.sdk_path:
+        print >> sys.stderr, ''
+        print >> sys.stderr, '                                           vvvvvvv'
+        print >> sys.stderr, ''
+        print >> sys.stderr, \
+            'This build requires the %s SDK, but it was not found on your system.' \
+            % min_sdk_version
+        print >> sys.stderr, \
+            'Either install it, or explicitly set mac_sdk in your GYP_DEFINES.'
+        print >> sys.stderr, ''
+        print >> sys.stderr, '                                           ^^^^^^^'
+        print >> sys.stderr, ''
+        return min_sdk_version
 
-  if options.print_sdk_path:
-    print subprocess.check_output(['xcodebuild', '-version', '-sdk',
-                                   'macosx' + best_sdk, 'Path']).strip()
+    if options.print_sdk_path:
+        print subprocess.check_output(
+            ['xcodebuild', '-version', '-sdk', 'macosx' + best_sdk,
+             'Path']).strip()
 
-  return best_sdk
+    return best_sdk
 
 
 if __name__ == '__main__':
-  if sys.platform != 'darwin':
-    raise Exception("This script only runs on Mac")
-  print main()
+    if sys.platform != 'darwin':
+        raise Exception("This script only runs on Mac")
+    print main()
diff --git a/build/mac/tweak_info_plist.py b/build/mac/tweak_info_plist.py
index 2057bac..b2a0f0c 100755
--- a/build/mac/tweak_info_plist.py
+++ b/build/mac/tweak_info_plist.py
@@ -33,248 +33,278 @@
 
 
 def _GetOutput(args):
-  """Runs a subprocess and waits for termination. Returns (stdout, returncode)
+    """Runs a subprocess and waits for termination. Returns (stdout, returncode)
   of the process. stderr is attached to the parent."""
-  proc = subprocess.Popen(args, stdout=subprocess.PIPE)
-  (stdout, stderr) = proc.communicate()
-  return (stdout, proc.returncode)
+    proc = subprocess.Popen(args, stdout=subprocess.PIPE)
+    (stdout, stderr) = proc.communicate()
+    return (stdout, proc.returncode)
 
 
 def _GetOutputNoError(args):
-  """Similar to _GetOutput() but ignores stderr. If there's an error launching
+    """Similar to _GetOutput() but ignores stderr. If there's an error launching
   the child (like file not found), the exception will be caught and (None, 1)
   will be returned to mimic quiet failure."""
-  try:
-    proc = subprocess.Popen(args, stdout=subprocess.PIPE,
-                            stderr=subprocess.PIPE)
-  except OSError:
-    return (None, 1)
-  (stdout, stderr) = proc.communicate()
-  return (stdout, proc.returncode)
+    try:
+        proc = subprocess.Popen(
+            args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    except OSError:
+        return (None, 1)
+    (stdout, stderr) = proc.communicate()
+    return (stdout, proc.returncode)
 
 
 def _RemoveKeys(plist, *keys):
-  """Removes a varargs of keys from the plist."""
-  for key in keys:
-    try:
-      del plist[key]
-    except KeyError:
-      pass
+    """Removes a varargs of keys from the plist."""
+    for key in keys:
+        try:
+            del plist[key]
+        except KeyError:
+            pass
 
 
 def _AddVersionKeys(plist, version=None):
-  """Adds the product version number into the plist. Returns True on success and
+    """Adds the product version number into the plist. Returns True on success and
   False on error. The error will be printed to stderr."""
-  if version:
-    match = re.match('\d+\.\d+\.(\d+\.\d+)$', version)
-    if not match:
-      print >>sys.stderr, 'Invalid version string specified: "%s"' % version
-      return False
+    if version:
+        match = re.match('\d+\.\d+\.(\d+\.\d+)$', version)
+        if not match:
+            print >> sys.stderr, 'Invalid version string specified: "%s"' % version
+            return False
 
-    full_version = match.group(0)
-    bundle_version = match.group(1)
+        full_version = match.group(0)
+        bundle_version = match.group(1)
 
-  else:
-    # Pull in the Chrome version number.
-    VERSION_TOOL = os.path.join(TOP, 'build/util/version.py')
-    VERSION_FILE = os.path.join(TOP, 'chrome/VERSION')
+    else:
+        # Pull in the Chrome version number.
+        VERSION_TOOL = os.path.join(TOP, 'build/util/version.py')
+        VERSION_FILE = os.path.join(TOP, 'chrome/VERSION')
 
-    (stdout, retval1) = _GetOutput([VERSION_TOOL, '-f', VERSION_FILE, '-t',
-                                    '@MAJOR@.@MINOR@.@BUILD@.@PATCH@'])
-    full_version = stdout.rstrip()
+        (stdout, retval1) = _GetOutput([
+            VERSION_TOOL, '-f', VERSION_FILE, '-t',
+            '@MAJOR@.@MINOR@.@BUILD@.@PATCH@'
+        ])
+        full_version = stdout.rstrip()
 
-    (stdout, retval2) = _GetOutput([VERSION_TOOL, '-f', VERSION_FILE, '-t',
-                                    '@BUILD@.@PATCH@'])
-    bundle_version = stdout.rstrip()
+        (stdout, retval2) = _GetOutput(
+            [VERSION_TOOL, '-f', VERSION_FILE, '-t', '@BUILD@.@PATCH@'])
+        bundle_version = stdout.rstrip()
 
-    # If either of the two version commands finished with non-zero returncode,
-    # report the error up.
-    if retval1 or retval2:
-      return False
+        # If either of the two version commands finished with non-zero returncode,
+        # report the error up.
+        if retval1 or retval2:
+            return False
 
-  # Add public version info so "Get Info" works.
-  plist['CFBundleShortVersionString'] = full_version
+    # Add public version info so "Get Info" works.
+    plist['CFBundleShortVersionString'] = full_version
 
-  # Honor the 429496.72.95 limit.  The maximum comes from splitting 2^32 - 1
-  # into  6, 2, 2 digits.  The limitation was present in Tiger, but it could
-  # have been fixed in later OS release, but hasn't been tested (it's easy
-  # enough to find out with "lsregister -dump).
-  # http://lists.apple.com/archives/carbon-dev/2006/Jun/msg00139.html
-  # BUILD will always be an increasing value, so BUILD_PATH gives us something
-  # unique that meetings what LS wants.
-  plist['CFBundleVersion'] = bundle_version
+    # Honor the 429496.72.95 limit.  The maximum comes from splitting 2^32 - 1
+    # into  6, 2, 2 digits.  The limitation was present in Tiger, but it could
+    # have been fixed in later OS release, but hasn't been tested (it's easy
+    # enough to find out with "lsregister -dump).
+    # http://lists.apple.com/archives/carbon-dev/2006/Jun/msg00139.html
+    # BUILD will always be an increasing value, so BUILD_PATH gives us something
+    # unique that meetings what LS wants.
+    plist['CFBundleVersion'] = bundle_version
 
-  # Return with no error.
-  return True
+    # Return with no error.
+    return True
 
 
 def _DoSCMKeys(plist, add_keys):
-  """Adds the SCM information, visible in about:version, to property list. If
+    """Adds the SCM information, visible in about:version, to property list. If
   |add_keys| is True, it will insert the keys, otherwise it will remove them."""
-  scm_revision = None
-  if add_keys:
-    # Pull in the Chrome revision number.
-    VERSION_TOOL = os.path.join(TOP, 'build/util/version.py')
-    LASTCHANGE_FILE = os.path.join(TOP, 'build/util/LASTCHANGE')
-    (stdout, retval) = _GetOutput([VERSION_TOOL, '-f', LASTCHANGE_FILE, '-t',
-                                  '@LASTCHANGE@'])
-    if retval:
-      return False
-    scm_revision = stdout.rstrip()
+    scm_revision = None
+    if add_keys:
+        # Pull in the Chrome revision number.
+        VERSION_TOOL = os.path.join(TOP, 'build/util/version.py')
+        LASTCHANGE_FILE = os.path.join(TOP, 'build/util/LASTCHANGE')
+        (stdout, retval) = _GetOutput(
+            [VERSION_TOOL, '-f', LASTCHANGE_FILE, '-t', '@LASTCHANGE@'])
+        if retval:
+            return False
+        scm_revision = stdout.rstrip()
 
-  # See if the operation failed.
-  _RemoveKeys(plist, 'SCMRevision')
-  if scm_revision != None:
-    plist['SCMRevision'] = scm_revision
-  elif add_keys:
-    print >>sys.stderr, 'Could not determine SCM revision.  This may be OK.'
+    # See if the operation failed.
+    _RemoveKeys(plist, 'SCMRevision')
+    if scm_revision != None:
+        plist['SCMRevision'] = scm_revision
+    elif add_keys:
+        print >> sys.stderr, 'Could not determine SCM revision.  This may be OK.'
 
-  return True
+    return True
 
 
 def _AddBreakpadKeys(plist, branding):
-  """Adds the Breakpad keys. This must be called AFTER _AddVersionKeys() and
+    """Adds the Breakpad keys. This must be called AFTER _AddVersionKeys() and
   also requires the |branding| argument."""
-  plist['BreakpadReportInterval'] = '3600'  # Deliberately a string.
-  plist['BreakpadProduct'] = '%s_Mac' % branding
-  plist['BreakpadProductDisplay'] = branding
-  plist['BreakpadVersion'] = plist['CFBundleShortVersionString']
-  # These are both deliberately strings and not boolean.
-  plist['BreakpadSendAndExit'] = 'YES'
-  plist['BreakpadSkipConfirm'] = 'YES'
+    plist['BreakpadReportInterval'] = '3600'  # Deliberately a string.
+    plist['BreakpadProduct'] = '%s_Mac' % branding
+    plist['BreakpadProductDisplay'] = branding
+    plist['BreakpadVersion'] = plist['CFBundleShortVersionString']
+    # These are both deliberately strings and not boolean.
+    plist['BreakpadSendAndExit'] = 'YES'
+    plist['BreakpadSkipConfirm'] = 'YES'
 
 
 def _RemoveBreakpadKeys(plist):
-  """Removes any set Breakpad keys."""
-  _RemoveKeys(plist,
-      'BreakpadURL',
-      'BreakpadReportInterval',
-      'BreakpadProduct',
-      'BreakpadProductDisplay',
-      'BreakpadVersion',
-      'BreakpadSendAndExit',
-      'BreakpadSkipConfirm')
+    """Removes any set Breakpad keys."""
+    _RemoveKeys(plist, 'BreakpadURL', 'BreakpadReportInterval',
+                'BreakpadProduct', 'BreakpadProductDisplay', 'BreakpadVersion',
+                'BreakpadSendAndExit', 'BreakpadSkipConfirm')
 
 
 def _TagSuffixes():
-  # Keep this list sorted in the order that tag suffix components are to
-  # appear in a tag value. That is to say, it should be sorted per ASCII.
-  components = ('32bit', 'full')
-  assert tuple(sorted(components)) == components
+    # Keep this list sorted in the order that tag suffix components are to
+    # appear in a tag value. That is to say, it should be sorted per ASCII.
+    components = ('32bit', 'full')
+    assert tuple(sorted(components)) == components
 
-  components_len = len(components)
-  combinations = 1 << components_len
-  tag_suffixes = []
-  for combination in xrange(0, combinations):
-    tag_suffix = ''
-    for component_index in xrange(0, components_len):
-      if combination & (1 << component_index):
-        tag_suffix += '-' + components[component_index]
-    tag_suffixes.append(tag_suffix)
-  return tag_suffixes
+    components_len = len(components)
+    combinations = 1 << components_len
+    tag_suffixes = []
+    for combination in xrange(0, combinations):
+        tag_suffix = ''
+        for component_index in xrange(0, components_len):
+            if combination & (1 << component_index):
+                tag_suffix += '-' + components[component_index]
+        tag_suffixes.append(tag_suffix)
+    return tag_suffixes
 
 
 def _AddKeystoneKeys(plist, bundle_identifier):
-  """Adds the Keystone keys. This must be called AFTER _AddVersionKeys() and
+    """Adds the Keystone keys. This must be called AFTER _AddVersionKeys() and
   also requires the |bundle_identifier| argument (com.example.product)."""
-  plist['KSVersion'] = plist['CFBundleShortVersionString']
-  plist['KSProductID'] = bundle_identifier
-  plist['KSUpdateURL'] = 'https://tools.google.com/service/update2'
+    plist['KSVersion'] = plist['CFBundleShortVersionString']
+    plist['KSProductID'] = bundle_identifier
+    plist['KSUpdateURL'] = 'https://tools.google.com/service/update2'
 
-  _RemoveKeys(plist, 'KSChannelID')
-  for tag_suffix in _TagSuffixes():
-    if tag_suffix:
-      plist['KSChannelID' + tag_suffix] = tag_suffix
+    _RemoveKeys(plist, 'KSChannelID')
+    for tag_suffix in _TagSuffixes():
+        if tag_suffix:
+            plist['KSChannelID' + tag_suffix] = tag_suffix
 
 
 def _RemoveKeystoneKeys(plist):
-  """Removes any set Keystone keys."""
-  _RemoveKeys(plist,
-      'KSVersion',
-      'KSProductID',
-      'KSUpdateURL')
+    """Removes any set Keystone keys."""
+    _RemoveKeys(plist, 'KSVersion', 'KSProductID', 'KSUpdateURL')
 
-  tag_keys = []
-  for tag_suffix in _TagSuffixes():
-    tag_keys.append('KSChannelID' + tag_suffix)
-  _RemoveKeys(plist, *tag_keys)
+    tag_keys = []
+    for tag_suffix in _TagSuffixes():
+        tag_keys.append('KSChannelID' + tag_suffix)
+    _RemoveKeys(plist, *tag_keys)
 
 
 def Main(argv):
-  parser = optparse.OptionParser('%prog [options]')
-  parser.add_option('--breakpad', dest='use_breakpad', action='store',
-      type='int', default=False, help='Enable Breakpad [1 or 0]')
-  parser.add_option('--breakpad_uploads', dest='breakpad_uploads',
-      action='store', type='int', default=False,
-      help='Enable Breakpad\'s uploading of crash dumps [1 or 0]')
-  parser.add_option('--keystone', dest='use_keystone', action='store',
-      type='int', default=False, help='Enable Keystone [1 or 0]')
-  parser.add_option('--scm', dest='add_scm_info', action='store', type='int',
-      default=True, help='Add SCM metadata [1 or 0]')
-  parser.add_option('--branding', dest='branding', action='store',
-      type='string', default=None, help='The branding of the binary')
-  parser.add_option('--bundle_id', dest='bundle_identifier',
-      action='store', type='string', default=None,
-      help='The bundle id of the binary')
-  parser.add_option('--version', dest='version', action='store', type='string',
-      default=None, help='The version string [major.minor.build.patch]')
-  (options, args) = parser.parse_args(argv)
+    parser = optparse.OptionParser('%prog [options]')
+    parser.add_option(
+        '--breakpad',
+        dest='use_breakpad',
+        action='store',
+        type='int',
+        default=False,
+        help='Enable Breakpad [1 or 0]')
+    parser.add_option(
+        '--breakpad_uploads',
+        dest='breakpad_uploads',
+        action='store',
+        type='int',
+        default=False,
+        help='Enable Breakpad\'s uploading of crash dumps [1 or 0]')
+    parser.add_option(
+        '--keystone',
+        dest='use_keystone',
+        action='store',
+        type='int',
+        default=False,
+        help='Enable Keystone [1 or 0]')
+    parser.add_option(
+        '--scm',
+        dest='add_scm_info',
+        action='store',
+        type='int',
+        default=True,
+        help='Add SCM metadata [1 or 0]')
+    parser.add_option(
+        '--branding',
+        dest='branding',
+        action='store',
+        type='string',
+        default=None,
+        help='The branding of the binary')
+    parser.add_option(
+        '--bundle_id',
+        dest='bundle_identifier',
+        action='store',
+        type='string',
+        default=None,
+        help='The bundle id of the binary')
+    parser.add_option(
+        '--version',
+        dest='version',
+        action='store',
+        type='string',
+        default=None,
+        help='The version string [major.minor.build.patch]')
+    (options, args) = parser.parse_args(argv)
 
-  if len(args) > 0:
-    print >>sys.stderr, parser.get_usage()
-    return 1
+    if len(args) > 0:
+        print >> sys.stderr, parser.get_usage()
+        return 1
 
-  # Read the plist into its parsed format.
-  DEST_INFO_PLIST = os.path.join(env['TARGET_BUILD_DIR'], env['INFOPLIST_PATH'])
-  plist = plistlib.readPlist(DEST_INFO_PLIST)
+    # Read the plist into its parsed format.
+    DEST_INFO_PLIST = os.path.join(env['TARGET_BUILD_DIR'],
+                                   env['INFOPLIST_PATH'])
+    plist = plistlib.readPlist(DEST_INFO_PLIST)
 
-  # Insert the product version.
-  if not _AddVersionKeys(plist, version=options.version):
-    return 2
+    # Insert the product version.
+    if not _AddVersionKeys(plist, version=options.version):
+        return 2
 
-  # Add Breakpad if configured to do so.
-  if options.use_breakpad:
-    if options.branding is None:
-      print >>sys.stderr, 'Use of Breakpad requires branding.'
-      return 1
-    _AddBreakpadKeys(plist, options.branding)
-    if options.breakpad_uploads:
-      plist['BreakpadURL'] = 'https://clients2.google.com/cr/report'
+    # Add Breakpad if configured to do so.
+    if options.use_breakpad:
+        if options.branding is None:
+            print >> sys.stderr, 'Use of Breakpad requires branding.'
+            return 1
+        _AddBreakpadKeys(plist, options.branding)
+        if options.breakpad_uploads:
+            plist['BreakpadURL'] = 'https://clients2.google.com/cr/report'
+        else:
+            # This allows crash dumping to a file without uploading the
+            # dump, for testing purposes.  Breakpad does not recognise
+            # "none" as a special value, but this does stop crash dump
+            # uploading from happening.  We need to specify something
+            # because if "BreakpadURL" is not present, Breakpad will not
+            # register its crash handler and no crash dumping will occur.
+            plist['BreakpadURL'] = 'none'
     else:
-      # This allows crash dumping to a file without uploading the
-      # dump, for testing purposes.  Breakpad does not recognise
-      # "none" as a special value, but this does stop crash dump
-      # uploading from happening.  We need to specify something
-      # because if "BreakpadURL" is not present, Breakpad will not
-      # register its crash handler and no crash dumping will occur.
-      plist['BreakpadURL'] = 'none'
-  else:
-    _RemoveBreakpadKeys(plist)
+        _RemoveBreakpadKeys(plist)
 
-  # Only add Keystone in Release builds.
-  if options.use_keystone and env['CONFIGURATION'] == 'Release':
-    if options.bundle_identifier is None:
-      print >>sys.stderr, 'Use of Keystone requires the bundle id.'
-      return 1
-    _AddKeystoneKeys(plist, options.bundle_identifier)
-  else:
-    _RemoveKeystoneKeys(plist)
+    # Only add Keystone in Release builds.
+    if options.use_keystone and env['CONFIGURATION'] == 'Release':
+        if options.bundle_identifier is None:
+            print >> sys.stderr, 'Use of Keystone requires the bundle id.'
+            return 1
+        _AddKeystoneKeys(plist, options.bundle_identifier)
+    else:
+        _RemoveKeystoneKeys(plist)
 
-  # Adds or removes any SCM keys.
-  if not _DoSCMKeys(plist, options.add_scm_info):
-    return 3
+    # Adds or removes any SCM keys.
+    if not _DoSCMKeys(plist, options.add_scm_info):
+        return 3
 
-  # Now that all keys have been mutated, rewrite the file.
-  temp_info_plist = tempfile.NamedTemporaryFile()
-  plistlib.writePlist(plist, temp_info_plist.name)
+    # Now that all keys have been mutated, rewrite the file.
+    temp_info_plist = tempfile.NamedTemporaryFile()
+    plistlib.writePlist(plist, temp_info_plist.name)
 
-  # Info.plist will work perfectly well in any plist format, but traditionally
-  # applications use xml1 for this, so convert it to ensure that it's valid.
-  proc = subprocess.Popen(['plutil', '-convert', 'xml1', '-o', DEST_INFO_PLIST,
-                           temp_info_plist.name])
-  proc.wait()
-  return proc.returncode
+    # Info.plist will work perfectly well in any plist format, but traditionally
+    # applications use xml1 for this, so convert it to ensure that it's valid.
+    proc = subprocess.Popen([
+        'plutil', '-convert', 'xml1', '-o', DEST_INFO_PLIST,
+        temp_info_plist.name
+    ])
+    proc.wait()
+    return proc.returncode
 
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv[1:]))
+    sys.exit(Main(sys.argv[1:]))
diff --git a/build/toolchain/get_concurrent_links.py b/build/toolchain/get_concurrent_links.py
index 6a40101..45e3ff5 100644
--- a/build/toolchain/get_concurrent_links.py
+++ b/build/toolchain/get_concurrent_links.py
@@ -10,55 +10,58 @@
 import subprocess
 import sys
 
+
 def GetDefaultConcurrentLinks():
-  # Inherit the legacy environment variable for people that have set it in GYP.
-  pool_size = int(os.getenv('GYP_LINK_CONCURRENCY', 0))
-  if pool_size:
-    return pool_size
+    # Inherit the legacy environment variable for people that have set it in GYP.
+    pool_size = int(os.getenv('GYP_LINK_CONCURRENCY', 0))
+    if pool_size:
+        return pool_size
 
-  if sys.platform in ('win32', 'cygwin'):
-    import ctypes
+    if sys.platform in ('win32', 'cygwin'):
+        import ctypes
 
-    class MEMORYSTATUSEX(ctypes.Structure):
-      _fields_ = [
-        ("dwLength", ctypes.c_ulong),
-        ("dwMemoryLoad", ctypes.c_ulong),
-        ("ullTotalPhys", ctypes.c_ulonglong),
-        ("ullAvailPhys", ctypes.c_ulonglong),
-        ("ullTotalPageFile", ctypes.c_ulonglong),
-        ("ullAvailPageFile", ctypes.c_ulonglong),
-        ("ullTotalVirtual", ctypes.c_ulonglong),
-        ("ullAvailVirtual", ctypes.c_ulonglong),
-        ("sullAvailExtendedVirtual", ctypes.c_ulonglong),
-      ]
+        class MEMORYSTATUSEX(ctypes.Structure):
+            _fields_ = [
+                ("dwLength", ctypes.c_ulong),
+                ("dwMemoryLoad", ctypes.c_ulong),
+                ("ullTotalPhys", ctypes.c_ulonglong),
+                ("ullAvailPhys", ctypes.c_ulonglong),
+                ("ullTotalPageFile", ctypes.c_ulonglong),
+                ("ullAvailPageFile", ctypes.c_ulonglong),
+                ("ullTotalVirtual", ctypes.c_ulonglong),
+                ("ullAvailVirtual", ctypes.c_ulonglong),
+                ("sullAvailExtendedVirtual", ctypes.c_ulonglong),
+            ]
 
-    stat = MEMORYSTATUSEX(dwLength=ctypes.sizeof(MEMORYSTATUSEX))
-    ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
+        stat = MEMORYSTATUSEX(dwLength=ctypes.sizeof(MEMORYSTATUSEX))
+        ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(stat))
 
-    mem_limit = max(1, stat.ullTotalPhys / (4 * (2 ** 30)))  # total / 4GB
-    hard_cap = max(1, int(os.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32)))
-    return min(mem_limit, hard_cap)
-  elif sys.platform.startswith('linux'):
-    if os.path.exists("/proc/meminfo"):
-      with open("/proc/meminfo") as meminfo:
-        memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB')
-        for line in meminfo:
-          match = memtotal_re.match(line)
-          if not match:
-            continue
-          # Allow 8Gb per link on Linux because Gold is quite memory hungry
-          return max(1, int(match.group(1)) / (8 * (2 ** 20)))
-    return 1
-  elif sys.platform == 'darwin':
-    try:
-      avail_bytes = int(subprocess.check_output(['sysctl', '-n', 'hw.memsize']))
-      # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
-      # 4GB per ld process allows for some more bloat.
-      return max(1, avail_bytes / (4 * (2 ** 30)))  # total / 4GB
-    except Exception:
-      return 1
-  else:
-    # TODO(scottmg): Implement this for other platforms.
-    return 1
+        mem_limit = max(1, stat.ullTotalPhys / (4 * (2**30)))  # total / 4GB
+        hard_cap = max(1, int(os.getenv('GYP_LINK_CONCURRENCY_MAX', 2**32)))
+        return min(mem_limit, hard_cap)
+    elif sys.platform.startswith('linux'):
+        if os.path.exists("/proc/meminfo"):
+            with open("/proc/meminfo") as meminfo:
+                memtotal_re = re.compile(r'^MemTotal:\s*(\d*)\s*kB')
+                for line in meminfo:
+                    match = memtotal_re.match(line)
+                    if not match:
+                        continue
+                    # Allow 8Gb per link on Linux because Gold is quite memory hungry
+                    return max(1, int(match.group(1)) / (8 * (2**20)))
+        return 1
+    elif sys.platform == 'darwin':
+        try:
+            avail_bytes = int(
+                subprocess.check_output(['sysctl', '-n', 'hw.memsize']))
+            # A static library debug build of Chromium's unit_tests takes ~2.7GB, so
+            # 4GB per ld process allows for some more bloat.
+            return max(1, avail_bytes / (4 * (2**30)))  # total / 4GB
+        except Exception:
+            return 1
+    else:
+        # TODO(scottmg): Implement this for other platforms.
+        return 1
+
 
 print GetDefaultConcurrentLinks()
diff --git a/build/toolchain/win/setup_toolchain.py b/build/toolchain/win/setup_toolchain.py
index 8150d3a..fde043b 100644
--- a/build/toolchain/win/setup_toolchain.py
+++ b/build/toolchain/win/setup_toolchain.py
@@ -22,195 +22,205 @@
 
 SCRIPT_DIR = os.path.dirname(__file__)
 
+
 def _ExtractImportantEnvironment(output_of_set):
-  """Extracts environment variables required for the toolchain to run from
+    """Extracts environment variables required for the toolchain to run from
   a textual dump output by the cmd.exe 'set' command."""
-  envvars_to_save = (
-      'goma_.*', # TODO(scottmg): This is ugly, but needed for goma.
-      'include',
-      'lib',
-      'libpath',
-      'path',
-      'pathext',
-      'systemroot',
-      'temp',
-      'tmp',
-      )
-  env = {}
-  # This occasionally happens and leads to misleading SYSTEMROOT error messages
-  # if not caught here.
-  if output_of_set.count('=') == 0:
-    raise Exception('Invalid output_of_set. Value is:\n%s' % output_of_set)
-  for line in output_of_set.splitlines():
-    for envvar in envvars_to_save:
-      if re.match(envvar + '=', line.lower()):
-        var, setting = line.split('=', 1)
-        if envvar == 'path':
-          # Our own rules and actions in Chromium rely on python being in the
-          # path. Add the path to this python here so that if it's not in the
-          # path when ninja is run later, python will still be found.
-          setting = os.path.dirname(sys.executable) + os.pathsep + setting
-        env[var.upper()] = setting.lower()
-        break
-  if sys.platform in ('win32', 'cygwin'):
-    for required in ('SYSTEMROOT', 'TEMP', 'TMP'):
-      if required not in env:
-        raise Exception('Environment variable "%s" '
-                        'required to be set to valid path' % required)
-  return env
+    envvars_to_save = (
+        'goma_.*',  # TODO(scottmg): This is ugly, but needed for goma.
+        'include',
+        'lib',
+        'libpath',
+        'path',
+        'pathext',
+        'systemroot',
+        'temp',
+        'tmp',
+    )
+    env = {}
+    # This occasionally happens and leads to misleading SYSTEMROOT error messages
+    # if not caught here.
+    if output_of_set.count('=') == 0:
+        raise Exception('Invalid output_of_set. Value is:\n%s' % output_of_set)
+    for line in output_of_set.splitlines():
+        for envvar in envvars_to_save:
+            if re.match(envvar + '=', line.lower()):
+                var, setting = line.split('=', 1)
+                if envvar == 'path':
+                    # Our own rules and actions in Chromium rely on python being in the
+                    # path. Add the path to this python here so that if it's not in the
+                    # path when ninja is run later, python will still be found.
+                    setting = os.path.dirname(
+                        sys.executable) + os.pathsep + setting
+                env[var.upper()] = setting.lower()
+                break
+    if sys.platform in ('win32', 'cygwin'):
+        for required in ('SYSTEMROOT', 'TEMP', 'TMP'):
+            if required not in env:
+                raise Exception('Environment variable "%s" '
+                                'required to be set to valid path' % required)
+    return env
 
 
 def _DetectVisualStudioPath():
-  """Return path to the GYP_MSVS_VERSION of Visual Studio.
+    """Return path to the GYP_MSVS_VERSION of Visual Studio.
   """
 
-  # Use the code in build/vs_toolchain.py to avoid duplicating code.
-  chromium_dir = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', '..'))
-  sys.path.append(os.path.join(chromium_dir, 'build'))
-  import vs_toolchain
-  return vs_toolchain.DetectVisualStudioPath()
+    # Use the code in build/vs_toolchain.py to avoid duplicating code.
+    chromium_dir = os.path.abspath(os.path.join(SCRIPT_DIR, '..', '..', '..'))
+    sys.path.append(os.path.join(chromium_dir, 'build'))
+    import vs_toolchain
+    return vs_toolchain.DetectVisualStudioPath()
 
 
 def _LoadEnvFromBat(args):
-  """Given a bat command, runs it and returns env vars set by it."""
-  args = args[:]
-  args.extend(('&&', 'set'))
-  popen = subprocess.Popen(
-      args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-  variables, _ = popen.communicate()
-  if popen.returncode != 0:
-    raise Exception('"%s" failed with error %d' % (args, popen.returncode))
-  return variables
+    """Given a bat command, runs it and returns env vars set by it."""
+    args = args[:]
+    args.extend(('&&', 'set'))
+    popen = subprocess.Popen(
+        args, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    variables, _ = popen.communicate()
+    if popen.returncode != 0:
+        raise Exception('"%s" failed with error %d' % (args, popen.returncode))
+    return variables
 
 
 def _LoadToolchainEnv(cpu, sdk_dir):
-  """Returns a dictionary with environment variables that must be set while
+    """Returns a dictionary with environment variables that must be set while
   running binaries from the toolchain (e.g. INCLUDE and PATH for cl.exe)."""
-  # Check if we are running in the SDK command line environment and use
-  # the setup script from the SDK if so. |cpu| should be either
-  # 'x86' or 'x64'.
-  assert cpu in ('x86', 'x64')
-  if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and sdk_dir:
-    # Load environment from json file.
-    env = os.path.normpath(os.path.join(sdk_dir, 'bin/SetEnv.%s.json' % cpu))
-    env = json.load(open(env))['env']
-    for k in env:
-      entries = [os.path.join(*([os.path.join(sdk_dir, 'bin')] + e))
-                 for e in env[k]]
-      # clang-cl wants INCLUDE to be ;-separated even on non-Windows,
-      # lld-link wants LIB to be ;-separated even on non-Windows.  Path gets :.
-      # The separator for INCLUDE here must match the one used in main() below.
-      sep = os.pathsep if k == 'PATH' else ';'
-      env[k] = sep.join(entries)
-    # PATH is a bit of a special case, it's in addition to the current PATH.
-    env['PATH'] = env['PATH'] + os.pathsep + os.environ['PATH']
-    # Augment with the current env to pick up TEMP and friends.
-    for k in os.environ:
-      if k not in env:
-        env[k] = os.environ[k]
+    # Check if we are running in the SDK command line environment and use
+    # the setup script from the SDK if so. |cpu| should be either
+    # 'x86' or 'x64'.
+    assert cpu in ('x86', 'x64')
+    if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', 1))) and sdk_dir:
+        # Load environment from json file.
+        env = os.path.normpath(
+            os.path.join(sdk_dir, 'bin/SetEnv.%s.json' % cpu))
+        env = json.load(open(env))['env']
+        for k in env:
+            entries = [
+                os.path.join(*([os.path.join(sdk_dir, 'bin')] + e))
+                for e in env[k]
+            ]
+            # clang-cl wants INCLUDE to be ;-separated even on non-Windows,
+            # lld-link wants LIB to be ;-separated even on non-Windows.  Path gets :.
+            # The separator for INCLUDE here must match the one used in main() below.
+            sep = os.pathsep if k == 'PATH' else ';'
+            env[k] = sep.join(entries)
+        # PATH is a bit of a special case, it's in addition to the current PATH.
+        env['PATH'] = env['PATH'] + os.pathsep + os.environ['PATH']
+        # Augment with the current env to pick up TEMP and friends.
+        for k in os.environ:
+            if k not in env:
+                env[k] = os.environ[k]
 
-    varlines = []
-    for k in sorted(env.keys()):
-      varlines.append('%s=%s' % (str(k), str(env[k])))
-    variables = '\n'.join(varlines)
+        varlines = []
+        for k in sorted(env.keys()):
+            varlines.append('%s=%s' % (str(k), str(env[k])))
+        variables = '\n'.join(varlines)
 
-    # Check that the json file contained the same environment as the .cmd file.
-    if sys.platform in ('win32', 'cygwin'):
-      script = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.cmd'))
-      assert _ExtractImportantEnvironment(variables) == \
-             _ExtractImportantEnvironment(_LoadEnvFromBat([script, '/' + cpu]))
-  else:
-    if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ:
-      os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath()
-    # We only support x64-hosted tools.
-    script_path = os.path.normpath(os.path.join(
-                                       os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                       'VC/vcvarsall.bat'))
-    if not os.path.exists(script_path):
-      # vcvarsall.bat for VS 2017 fails if run after running vcvarsall.bat from
-      # VS 2013 or VS 2015. Fix this by clearing the vsinstalldir environment
-      # variable.
-      if 'VSINSTALLDIR' in os.environ:
-        del os.environ['VSINSTALLDIR']
-      other_path = os.path.normpath(os.path.join(
-                                        os.environ['GYP_MSVS_OVERRIDE_PATH'],
-                                        'VC/Auxiliary/Build/vcvarsall.bat'))
-      if not os.path.exists(other_path):
-        raise Exception('%s is missing - make sure VC++ tools are installed.' %
-                        script_path)
-      script_path = other_path
-    # Chromium requires the 10.0.14393.0 SDK or higher - previous versions don't
-    # have all of the required declarations.
-    args = [script_path, 'amd64_x86' if cpu == 'x86' else 'amd64']
-    variables = _LoadEnvFromBat(args)
-  return _ExtractImportantEnvironment(variables)
+        # Check that the json file contained the same environment as the .cmd file.
+        if sys.platform in ('win32', 'cygwin'):
+            script = os.path.normpath(os.path.join(sdk_dir, 'Bin/SetEnv.cmd'))
+            assert _ExtractImportantEnvironment(variables) == \
+                   _ExtractImportantEnvironment(_LoadEnvFromBat([script, '/' + cpu]))
+    else:
+        if 'GYP_MSVS_OVERRIDE_PATH' not in os.environ:
+            os.environ['GYP_MSVS_OVERRIDE_PATH'] = _DetectVisualStudioPath()
+        # We only support x64-hosted tools.
+        script_path = os.path.normpath(
+            os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                         'VC/vcvarsall.bat'))
+        if not os.path.exists(script_path):
+            # vcvarsall.bat for VS 2017 fails if run after running vcvarsall.bat from
+            # VS 2013 or VS 2015. Fix this by clearing the vsinstalldir environment
+            # variable.
+            if 'VSINSTALLDIR' in os.environ:
+                del os.environ['VSINSTALLDIR']
+            other_path = os.path.normpath(
+                os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                             'VC/Auxiliary/Build/vcvarsall.bat'))
+            if not os.path.exists(other_path):
+                raise Exception(
+                    '%s is missing - make sure VC++ tools are installed.' %
+                    script_path)
+            script_path = other_path
+        # Chromium requires the 10.0.14393.0 SDK or higher - previous versions don't
+        # have all of the required declarations.
+        args = [script_path, 'amd64_x86' if cpu == 'x86' else 'amd64']
+        variables = _LoadEnvFromBat(args)
+    return _ExtractImportantEnvironment(variables)
 
 
 def _FormatAsEnvironmentBlock(envvar_dict):
-  """Format as an 'environment block' directly suitable for CreateProcess.
+    """Format as an 'environment block' directly suitable for CreateProcess.
   Briefly this is a list of key=value\0, terminated by an additional \0. See
   CreateProcess documentation for more details."""
-  block = ''
-  nul = '\0'
-  for key, value in envvar_dict.iteritems():
-    block += key + '=' + value + nul
-  block += nul
-  return block
+    block = ''
+    nul = '\0'
+    for key, value in envvar_dict.iteritems():
+        block += key + '=' + value + nul
+    block += nul
+    return block
 
 
 def main():
-  if len(sys.argv) != 5:
-    print('Usage setup_toolchain.py '
-          '<visual studio path> <win sdk path> '
-          '<runtime dirs> <target_cpu> <include prefix>')
-    sys.exit(2)
-  win_sdk_path = sys.argv[2]
-  runtime_dirs = sys.argv[3]
-  target_cpu = sys.argv[4]
+    if len(sys.argv) != 5:
+        print('Usage setup_toolchain.py '
+              '<visual studio path> <win sdk path> '
+              '<runtime dirs> <target_cpu> <include prefix>')
+        sys.exit(2)
+    win_sdk_path = sys.argv[2]
+    runtime_dirs = sys.argv[3]
+    target_cpu = sys.argv[4]
 
-  cpus = ('x86', 'x64')
-  assert target_cpu in cpus
-  vc_bin_dir = ''
-  include = ''
+    cpus = ('x86', 'x64')
+    assert target_cpu in cpus
+    vc_bin_dir = ''
+    include = ''
 
-  # TODO(scottmg|goma): Do we need an equivalent of
-  # ninja_use_custom_environment_files?
+    # TODO(scottmg|goma): Do we need an equivalent of
+    # ninja_use_custom_environment_files?
 
-  for cpu in cpus:
-    # Extract environment variables for subprocesses.
-    env = _LoadToolchainEnv(cpu, win_sdk_path)
-    env['PATH'] = runtime_dirs + os.pathsep + env['PATH']
+    for cpu in cpus:
+        # Extract environment variables for subprocesses.
+        env = _LoadToolchainEnv(cpu, win_sdk_path)
+        env['PATH'] = runtime_dirs + os.pathsep + env['PATH']
 
-    if cpu == target_cpu:
-      for path in env['PATH'].split(os.pathsep):
-        if os.path.exists(os.path.join(path, 'cl.exe')):
-          vc_bin_dir = os.path.realpath(path)
-          break
-      # The separator for INCLUDE here must match the one used in
-      # _LoadToolchainEnv() above.
-      include = [p.replace('"', r'\"') for p in env['INCLUDE'].split(';') if p]
-      include_I = ' '.join(['"/I' + i + '"' for i in include])
-      include_imsvc = ' '.join(['"-imsvc' + i + '"' for i in include])
+        if cpu == target_cpu:
+            for path in env['PATH'].split(os.pathsep):
+                if os.path.exists(os.path.join(path, 'cl.exe')):
+                    vc_bin_dir = os.path.realpath(path)
+                    break
+            # The separator for INCLUDE here must match the one used in
+            # _LoadToolchainEnv() above.
+            include = [
+                p.replace('"', r'\"') for p in env['INCLUDE'].split(';') if p
+            ]
+            include_I = ' '.join(['"/I' + i + '"' for i in include])
+            include_imsvc = ' '.join(['"-imsvc' + i + '"' for i in include])
 
-    env_block = _FormatAsEnvironmentBlock(env)
-    with open('environment.' + cpu, 'wb') as f:
-      f.write(env_block)
+        env_block = _FormatAsEnvironmentBlock(env)
+        with open('environment.' + cpu, 'wb') as f:
+            f.write(env_block)
 
-    # Create a store app version of the environment.
-    if 'LIB' in env:
-      env['LIB']     = env['LIB']    .replace(r'\VC\LIB', r'\VC\LIB\STORE')
-    if 'LIBPATH' in env:
-      env['LIBPATH'] = env['LIBPATH'].replace(r'\VC\LIB', r'\VC\LIB\STORE')
-    env_block = _FormatAsEnvironmentBlock(env)
-    with open('environment.winrt_' + cpu, 'wb') as f:
-      f.write(env_block)
+        # Create a store app version of the environment.
+        if 'LIB' in env:
+            env['LIB'] = env['LIB'].replace(r'\VC\LIB', r'\VC\LIB\STORE')
+        if 'LIBPATH' in env:
+            env['LIBPATH'] = env['LIBPATH'].replace(r'\VC\LIB',
+                                                    r'\VC\LIB\STORE')
+        env_block = _FormatAsEnvironmentBlock(env)
+        with open('environment.winrt_' + cpu, 'wb') as f:
+            f.write(env_block)
 
-  assert vc_bin_dir
-  print 'vc_bin_dir = ' + gn_helpers.ToGNString(vc_bin_dir)
-  assert include_I
-  print 'include_flags_I = ' + gn_helpers.ToGNString(include_I)
-  assert include_imsvc
-  print 'include_flags_imsvc = ' + gn_helpers.ToGNString(include_imsvc)
+    assert vc_bin_dir
+    print 'vc_bin_dir = ' + gn_helpers.ToGNString(vc_bin_dir)
+    assert include_I
+    print 'include_flags_I = ' + gn_helpers.ToGNString(include_I)
+    assert include_imsvc
+    print 'include_flags_imsvc = ' + gn_helpers.ToGNString(include_imsvc)
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/build/toolchain/win/tool_wrapper.py b/build/toolchain/win/tool_wrapper.py
index 4d749ef..fbe9248 100644
--- a/build/toolchain/win/tool_wrapper.py
+++ b/build/toolchain/win/tool_wrapper.py
@@ -1,7 +1,6 @@
 # Copyright (c) 2012 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.
-
 """Utility functions for Windows builds.
 
 This file is copied to the build directory as part of toolchain setup and
@@ -22,203 +21,218 @@
 # link.exe.
 _LINK_EXE_OUT_ARG = re.compile('/OUT:(?P<out>.+)$', re.IGNORECASE)
 
+
 def main(args):
-  executor = WinTool()
-  exit_code = executor.Dispatch(args)
-  if exit_code is not None:
-    sys.exit(exit_code)
+    executor = WinTool()
+    exit_code = executor.Dispatch(args)
+    if exit_code is not None:
+        sys.exit(exit_code)
 
 
 class WinTool(object):
-  """This class performs all the Windows tooling steps. The methods can either
+    """This class performs all the Windows tooling steps. The methods can either
   be executed directly, or dispatched from an argument list."""
 
-  def _UseSeparateMspdbsrv(self, env, args):
-    """Allows to use a unique instance of mspdbsrv.exe per linker instead of a
+    def _UseSeparateMspdbsrv(self, env, args):
+        """Allows to use a unique instance of mspdbsrv.exe per linker instead of a
     shared one."""
-    if len(args) < 1:
-      raise Exception("Not enough arguments")
+        if len(args) < 1:
+            raise Exception("Not enough arguments")
 
-    if args[0] != 'link.exe':
-      return
+        if args[0] != 'link.exe':
+            return
 
-    # Use the output filename passed to the linker to generate an endpoint name
-    # for mspdbsrv.exe.
-    endpoint_name = None
-    for arg in args:
-      m = _LINK_EXE_OUT_ARG.match(arg)
-      if m:
-        endpoint_name = re.sub(r'\W+', '',
-            '%s_%d' % (m.group('out'), os.getpid()))
-        break
+        # Use the output filename passed to the linker to generate an endpoint name
+        # for mspdbsrv.exe.
+        endpoint_name = None
+        for arg in args:
+            m = _LINK_EXE_OUT_ARG.match(arg)
+            if m:
+                endpoint_name = re.sub(r'\W+', '',
+                                       '%s_%d' % (m.group('out'), os.getpid()))
+                break
 
-    if endpoint_name is None:
-      return
+        if endpoint_name is None:
+            return
 
-    # Adds the appropriate environment variable. This will be read by link.exe
-    # to know which instance of mspdbsrv.exe it should connect to (if it's
-    # not set then the default endpoint is used).
-    env['_MSPDBSRV_ENDPOINT_'] = endpoint_name
+        # Adds the appropriate environment variable. This will be read by link.exe
+        # to know which instance of mspdbsrv.exe it should connect to (if it's
+        # not set then the default endpoint is used).
+        env['_MSPDBSRV_ENDPOINT_'] = endpoint_name
 
-  def Dispatch(self, args):
-    """Dispatches a string command to a method."""
-    if len(args) < 1:
-      raise Exception("Not enough arguments")
+    def Dispatch(self, args):
+        """Dispatches a string command to a method."""
+        if len(args) < 1:
+            raise Exception("Not enough arguments")
 
-    method = "Exec%s" % self._CommandifyName(args[0])
-    return getattr(self, method)(*args[1:])
+        method = "Exec%s" % self._CommandifyName(args[0])
+        return getattr(self, method)(*args[1:])
 
-  def _CommandifyName(self, name_string):
-    """Transforms a tool name like recursive-mirror to RecursiveMirror."""
-    return name_string.title().replace('-', '')
+    def _CommandifyName(self, name_string):
+        """Transforms a tool name like recursive-mirror to RecursiveMirror."""
+        return name_string.title().replace('-', '')
 
-  def _GetEnv(self, arch):
-    """Gets the saved environment from a file for a given architecture."""
-    # The environment is saved as an "environment block" (see CreateProcess
-    # and msvs_emulation for details). We convert to a dict here.
-    # Drop last 2 NULs, one for list terminator, one for trailing vs. separator.
-    pairs = open(arch).read()[:-2].split('\0')
-    kvs = [item.split('=', 1) for item in pairs]
-    return dict(kvs)
+    def _GetEnv(self, arch):
+        """Gets the saved environment from a file for a given architecture."""
+        # The environment is saved as an "environment block" (see CreateProcess
+        # and msvs_emulation for details). We convert to a dict here.
+        # Drop last 2 NULs, one for list terminator, one for trailing vs. separator.
+        pairs = open(arch).read()[:-2].split('\0')
+        kvs = [item.split('=', 1) for item in pairs]
+        return dict(kvs)
 
-  def ExecStamp(self, path):
-    """Simple stamp command."""
-    open(path, 'w').close()
+    def ExecStamp(self, path):
+        """Simple stamp command."""
+        open(path, 'w').close()
 
-  def ExecDeleteFile(self, path):
-    """Simple file delete command."""
-    if os.path.exists(path):
-      os.unlink(path)
+    def ExecDeleteFile(self, path):
+        """Simple file delete command."""
+        if os.path.exists(path):
+            os.unlink(path)
 
-  def ExecRecursiveMirror(self, source, dest):
-    """Emulation of rm -rf out && cp -af in out."""
-    if os.path.exists(dest):
-      if os.path.isdir(dest):
-        def _on_error(fn, path, dummy_excinfo):
-          # The operation failed, possibly because the file is set to
-          # read-only. If that's why, make it writable and try the op again.
-          if not os.access(path, os.W_OK):
-            os.chmod(path, stat.S_IWRITE)
-          fn(path)
-        shutil.rmtree(dest, onerror=_on_error)
-      else:
-        if not os.access(dest, os.W_OK):
-          # Attempt to make the file writable before deleting it.
-          os.chmod(dest, stat.S_IWRITE)
-        os.unlink(dest)
+    def ExecRecursiveMirror(self, source, dest):
+        """Emulation of rm -rf out && cp -af in out."""
+        if os.path.exists(dest):
+            if os.path.isdir(dest):
 
-    if os.path.isdir(source):
-      shutil.copytree(source, dest)
-    else:
-      shutil.copy2(source, dest)
-      # Try to diagnose crbug.com/741603
-      if not os.path.exists(dest):
-        raise Exception("Copying of %s to %s failed" % (source, dest))
+                def _on_error(fn, path, dummy_excinfo):
+                    # The operation failed, possibly because the file is set to
+                    # read-only. If that's why, make it writable and try the op again.
+                    if not os.access(path, os.W_OK):
+                        os.chmod(path, stat.S_IWRITE)
+                    fn(path)
 
-  def ExecLinkWrapper(self, arch, use_separate_mspdbsrv, *args):
-    """Filter diagnostic output from link that looks like:
+                shutil.rmtree(dest, onerror=_on_error)
+            else:
+                if not os.access(dest, os.W_OK):
+                    # Attempt to make the file writable before deleting it.
+                    os.chmod(dest, stat.S_IWRITE)
+                os.unlink(dest)
+
+        if os.path.isdir(source):
+            shutil.copytree(source, dest)
+        else:
+            shutil.copy2(source, dest)
+            # Try to diagnose crbug.com/741603
+            if not os.path.exists(dest):
+                raise Exception("Copying of %s to %s failed" % (source, dest))
+
+    def ExecLinkWrapper(self, arch, use_separate_mspdbsrv, *args):
+        """Filter diagnostic output from link that looks like:
     '   Creating library ui.dll.lib and object ui.dll.exp'
     This happens when there are exports from the dll or exe.
     """
-    env = self._GetEnv(arch)
-    if use_separate_mspdbsrv == 'True':
-      self._UseSeparateMspdbsrv(env, args)
-    if sys.platform == 'win32':
-      args = list(args)  # *args is a tuple by default, which is read-only.
-      args[0] = args[0].replace('/', '\\')
-    # https://docs.python.org/2/library/subprocess.html:
-    # "On Unix with shell=True [...] if args is a sequence, the first item
-    # specifies the command string, and any additional items will be treated as
-    # additional arguments to the shell itself.  That is to say, Popen does the
-    # equivalent of:
-    #   Popen(['/bin/sh', '-c', args[0], args[1], ...])"
-    # For that reason, since going through the shell doesn't seem necessary on
-    # non-Windows don't do that there.
-    link = subprocess.Popen(args, shell=sys.platform == 'win32', env=env,
-                            stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    # Read output one line at a time as it shows up to avoid OOM failures when
-    # GBs of output is produced.
-    for line in link.stdout:
-      if (not line.startswith('   Creating library ') and
-          not line.startswith('Generating code') and
-          not line.startswith('Finished generating code')):
-        print line,
-    return link.wait()
+        env = self._GetEnv(arch)
+        if use_separate_mspdbsrv == 'True':
+            self._UseSeparateMspdbsrv(env, args)
+        if sys.platform == 'win32':
+            args = list(
+                args)  # *args is a tuple by default, which is read-only.
+            args[0] = args[0].replace('/', '\\')
+        # https://docs.python.org/2/library/subprocess.html:
+        # "On Unix with shell=True [...] if args is a sequence, the first item
+        # specifies the command string, and any additional items will be treated as
+        # additional arguments to the shell itself.  That is to say, Popen does the
+        # equivalent of:
+        #   Popen(['/bin/sh', '-c', args[0], args[1], ...])"
+        # For that reason, since going through the shell doesn't seem necessary on
+        # non-Windows don't do that there.
+        link = subprocess.Popen(
+            args,
+            shell=sys.platform == 'win32',
+            env=env,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT)
+        # Read output one line at a time as it shows up to avoid OOM failures when
+        # GBs of output is produced.
+        for line in link.stdout:
+            if (not line.startswith('   Creating library ') and
+                    not line.startswith('Generating code') and
+                    not line.startswith('Finished generating code')):
+                print line,
+        return link.wait()
 
-  def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl,
-                      *flags):
-    """Filter noisy filenames output from MIDL compile step that isn't
+    def ExecMidlWrapper(self, arch, outdir, tlb, h, dlldata, iid, proxy, idl,
+                        *flags):
+        """Filter noisy filenames output from MIDL compile step that isn't
     quietable via command line flags.
     """
-    args = ['midl', '/nologo'] + list(flags) + [
-        '/out', outdir,
-        '/tlb', tlb,
-        '/h', h,
-        '/dlldata', dlldata,
-        '/iid', iid,
-        '/proxy', proxy,
-        idl]
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    out, _ = popen.communicate()
-    # Filter junk out of stdout, and write filtered versions. Output we want
-    # to filter is pairs of lines that look like this:
-    # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
-    # objidl.idl
-    lines = out.splitlines()
-    prefixes = ('Processing ', '64 bit Processing ')
-    processing = set(os.path.basename(x)
-                     for x in lines if x.startswith(prefixes))
-    for line in lines:
-      if not line.startswith(prefixes) and line not in processing:
-        print line
-    return popen.returncode
+        args = ['midl', '/nologo'] + list(flags) + [
+            '/out', outdir, '/tlb', tlb, '/h', h, '/dlldata', dlldata, '/iid',
+            iid, '/proxy', proxy, idl
+        ]
+        env = self._GetEnv(arch)
+        popen = subprocess.Popen(
+            args,
+            shell=True,
+            env=env,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT)
+        out, _ = popen.communicate()
+        # Filter junk out of stdout, and write filtered versions. Output we want
+        # to filter is pairs of lines that look like this:
+        # Processing C:\Program Files (x86)\Microsoft SDKs\...\include\objidl.idl
+        # objidl.idl
+        lines = out.splitlines()
+        prefixes = ('Processing ', '64 bit Processing ')
+        processing = set(
+            os.path.basename(x) for x in lines if x.startswith(prefixes))
+        for line in lines:
+            if not line.startswith(prefixes) and line not in processing:
+                print line
+        return popen.returncode
 
-  def ExecAsmWrapper(self, arch, *args):
-    """Filter logo banner from invocations of asm.exe."""
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    out, _ = popen.communicate()
-    for line in out.splitlines():
-      # Split to avoid triggering license checks:
-      if (not line.startswith('Copy' + 'right (C' +
-                              ') Microsoft Corporation') and
-          not line.startswith('Microsoft (R) Macro Assembler') and
-          not line.startswith(' Assembling: ') and
-          line):
-        print line
-    return popen.returncode
+    def ExecAsmWrapper(self, arch, *args):
+        """Filter logo banner from invocations of asm.exe."""
+        env = self._GetEnv(arch)
+        popen = subprocess.Popen(
+            args,
+            shell=True,
+            env=env,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT)
+        out, _ = popen.communicate()
+        for line in out.splitlines():
+            # Split to avoid triggering license checks:
+            if (not line.startswith('Copy' + 'right (C' +
+                                    ') Microsoft Corporation') and
+                    not line.startswith('Microsoft (R) Macro Assembler') and
+                    not line.startswith(' Assembling: ') and line):
+                print line
+        return popen.returncode
 
-  def ExecRcWrapper(self, arch, *args):
-    """Filter logo banner from invocations of rc.exe. Older versions of RC
+    def ExecRcWrapper(self, arch, *args):
+        """Filter logo banner from invocations of rc.exe. Older versions of RC
     don't support the /nologo flag."""
-    env = self._GetEnv(arch)
-    popen = subprocess.Popen(args, shell=True, env=env,
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    out, _ = popen.communicate()
-    for line in out.splitlines():
-      if (not line.startswith('Microsoft (R) Windows (R) Resource Compiler') and
-          not line.startswith('Copy' + 'right (C' +
-                              ') Microsoft Corporation') and
-          line):
-        print line
-    return popen.returncode
+        env = self._GetEnv(arch)
+        popen = subprocess.Popen(
+            args,
+            shell=True,
+            env=env,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT)
+        out, _ = popen.communicate()
+        for line in out.splitlines():
+            if (not line.startswith(
+                    'Microsoft (R) Windows (R) Resource Compiler') and
+                    not line.startswith('Copy' + 'right (C' +
+                                        ') Microsoft Corporation') and line):
+                print line
+        return popen.returncode
 
-  def ExecActionWrapper(self, arch, rspfile, *dirname):
-    """Runs an action command line from a response file using the environment
+    def ExecActionWrapper(self, arch, rspfile, *dirname):
+        """Runs an action command line from a response file using the environment
     for |arch|. If |dirname| is supplied, use that as the working directory."""
-    env = self._GetEnv(arch)
-    # TODO(scottmg): This is a temporary hack to get some specific variables
-    # through to actions that are set after GN-time. http://crbug.com/333738.
-    for k, v in os.environ.iteritems():
-      if k not in env:
-        env[k] = v
-    args = open(rspfile).read()
-    dirname = dirname[0] if dirname else None
-    return subprocess.call(args, shell=True, env=env, cwd=dirname)
+        env = self._GetEnv(arch)
+        # TODO(scottmg): This is a temporary hack to get some specific variables
+        # through to actions that are set after GN-time. http://crbug.com/333738.
+        for k, v in os.environ.iteritems():
+            if k not in env:
+                env[k] = v
+        args = open(rspfile).read()
+        dirname = dirname[0] if dirname else None
+        return subprocess.call(args, shell=True, env=env, cwd=dirname)
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
diff --git a/build/vs_toolchain.py b/build/vs_toolchain.py
index 32eb669..11376198 100644
--- a/build/vs_toolchain.py
+++ b/build/vs_toolchain.py
@@ -7,10 +7,13 @@
 # This file keeps the MSVC toolchain up-to-date for Google developers.
 # It is copied from Chromium:
 #   https://cs.chromium.org/chromium/src/build/vs_toolchain.py
-# with modifications that update paths, and remove dependencies on gyp.
+# with modifications that update paths and remove dependencies on gyp.
 # To update to a new MSVC toolchain, copy the updated script from the Chromium
-# tree, and edit to make it work in the Dart tree by updating paths in the original script.
+# tree, edit to make it work in the Dart tree by updating paths in the original script.
 
+from __future__ import print_function
+
+import collections
 import glob
 import json
 import os
@@ -24,87 +27,97 @@
 
 from gn_helpers import ToGNString
 
-
 script_dir = os.path.dirname(os.path.realpath(__file__))
 chrome_src = os.path.abspath(os.path.join(script_dir, os.pardir))
 SRC_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 sys.path.insert(0, os.path.join(chrome_src, 'tools'))
 json_data_file = os.path.join(script_dir, 'win_toolchain.json')
 
-
-# Use MSVS2017 as the default toolchain.
-CURRENT_DEFAULT_TOOLCHAIN_VERSION = '2017'
+# VS versions are listed in descending order of priority (highest first).
+MSVS_VERSIONS = collections.OrderedDict([
+    ('2017', '15.0'),
+    ('2019', '16.0'),
+])
 
 
 def SetEnvironmentAndGetRuntimeDllDirs():
-  """Sets up os.environ to use the depot_tools VS toolchain with gyp, and
-  returns the location of the VS runtime DLLs so they can be copied into
+    """Sets up os.environ to use the depot_tools VS toolchain with gyp, and
+  returns the location of the VC runtime DLLs so they can be copied into
   the output directory after gyp generation.
 
-  Return value is [x64path, x86path] or None
+  Return value is [x64path, x86path, 'Arm64Unused'] or None. arm64path is
+  generated separately because there are multiple folders for the arm64 VC
+  runtime.
   """
-  vs_runtime_dll_dirs = None
-  depot_tools_win_toolchain = \
-      bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')))
-  # When running on a non-Windows host, only do this if the SDK has explicitly
-  # been downloaded before (in which case json_data_file will exist).
-  if ((sys.platform in ('win32', 'cygwin') or os.path.exists(json_data_file))
-      and depot_tools_win_toolchain):
-    if ShouldUpdateToolchain():
-      update_result = Update()
-      if update_result != 0:
-        raise Exception('Failed to update, error code %d.' % update_result)
-    with open(json_data_file, 'r') as tempf:
-      toolchain_data = json.load(tempf)
+    vs_runtime_dll_dirs = None
+    depot_tools_win_toolchain = \
+        bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')))
+    # When running on a non-Windows host, only do this if the SDK has explicitly
+    # been downloaded before (in which case json_data_file will exist).
+    if ((sys.platform in ('win32', 'cygwin') or os.path.exists(json_data_file))
+            and depot_tools_win_toolchain):
+        if ShouldUpdateToolchain():
+            if len(sys.argv) > 1 and sys.argv[1] == 'update':
+                update_result = Update()
+            else:
+                update_result = Update(no_download=True)
+            if update_result != 0:
+                raise Exception(
+                    'Failed to update, error code %d.' % update_result)
+        with open(json_data_file, 'r') as tempf:
+            toolchain_data = json.load(tempf)
 
-    toolchain = toolchain_data['path']
-    version = toolchain_data['version']
-    win_sdk = toolchain_data.get('win_sdk')
-    if not win_sdk:
-      win_sdk = toolchain_data['win8sdk']
-    wdk = toolchain_data['wdk']
-    # TODO(scottmg): The order unfortunately matters in these. They should be
-    # split into separate keys for x64/x86/arm64. (See CopyDlls call below).
-    # http://crbug.com/345992
-    vs_runtime_dll_dirs = toolchain_data['runtime_dirs']
-    # The number of runtime_dirs in the toolchain_data was two (x64/x86) but
-    # changed to three (x64/x86/arm64) and this code needs to handle both
-    # possibilities, which can change independently from this code.
-    if len(vs_runtime_dll_dirs) == 2:
-      vs_runtime_dll_dirs.append('Arm64Unused')
+        toolchain = toolchain_data['path']
+        version = toolchain_data['version']
+        win_sdk = toolchain_data.get('win_sdk')
+        if not win_sdk:
+            win_sdk = toolchain_data['win8sdk']
+        wdk = toolchain_data['wdk']
+        # TODO(scottmg): The order unfortunately matters in these. They should be
+        # split into separate keys for x64/x86/arm64. (See CopyDlls call below).
+        # http://crbug.com/345992
+        vs_runtime_dll_dirs = toolchain_data['runtime_dirs']
+        # The number of runtime_dirs in the toolchain_data was two (x64/x86) but
+        # changed to three (x64/x86/arm64) and this code needs to handle both
+        # possibilities, which can change independently from this code.
+        if len(vs_runtime_dll_dirs) == 2:
+            vs_runtime_dll_dirs.append('Arm64Unused')
 
-    os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain
-    os.environ['GYP_MSVS_VERSION'] = version
+        os.environ['GYP_MSVS_OVERRIDE_PATH'] = toolchain
+        os.environ['GYP_MSVS_VERSION'] = version
 
-    os.environ['WINDOWSSDKDIR'] = win_sdk
-    os.environ['WDK_DIR'] = wdk
-    # Include the VS runtime in the PATH in case it's not machine-installed.
-    runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs)
-    os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH']
-  elif sys.platform == 'win32' and not depot_tools_win_toolchain:
-    if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ:
-      os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath()
-    if not 'GYP_MSVS_VERSION' in os.environ:
-      os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
+        os.environ['WINDOWSSDKDIR'] = win_sdk
+        os.environ['WDK_DIR'] = wdk
+        # Include the VS runtime in the PATH in case it's not machine-installed.
+        runtime_path = os.path.pathsep.join(vs_runtime_dll_dirs)
+        os.environ['PATH'] = runtime_path + os.path.pathsep + os.environ['PATH']
+    elif sys.platform == 'win32' and not depot_tools_win_toolchain:
+        if not 'GYP_MSVS_OVERRIDE_PATH' in os.environ:
+            os.environ['GYP_MSVS_OVERRIDE_PATH'] = DetectVisualStudioPath()
+        if not 'GYP_MSVS_VERSION' in os.environ:
+            os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
 
-    # When using an installed toolchain these files aren't needed in the output
-    # directory in order to run binaries locally, but they are needed in order
-    # to create isolates or the mini_installer. Copying them to the output
-    # directory ensures that they are available when needed.
-    bitness = platform.architecture()[0]
-    # When running 64-bit python the x64 DLLs will be in System32
-    # ARM64 binaries will not be available in the system directories because we
-    # don't build on ARM64 machines.
-    x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
-    x64_path = os.path.join(os.path.expandvars('%windir%'), x64_path)
-    vs_runtime_dll_dirs = [x64_path, os.path.expandvars('%windir%/SysWOW64'),
-                           'Arm64Unused']
+        # When using an installed toolchain these files aren't needed in the output
+        # directory in order to run binaries locally, but they are needed in order
+        # to create isolates or the mini_installer. Copying them to the output
+        # directory ensures that they are available when needed.
+        bitness = platform.architecture()[0]
+        # When running 64-bit python the x64 DLLs will be in System32
+        # ARM64 binaries will not be available in the system directories because we
+        # don't build on ARM64 machines.
+        x64_path = 'System32' if bitness == '64bit' else 'Sysnative'
+        x64_path = os.path.join(os.path.expandvars('%windir%'), x64_path)
+        vs_runtime_dll_dirs = [
+            x64_path,
+            os.path.join(os.path.expandvars('%windir%'), 'SysWOW64'),
+            'Arm64Unused'
+        ]
 
-  return vs_runtime_dll_dirs
+    return vs_runtime_dll_dirs
 
 
 def _RegistryGetValueUsingWinReg(key, value):
-  """Use the _winreg module to obtain the value of a registry key.
+    """Use the _winreg module to obtain the value of a registry key.
 
   Args:
     key: The registry key.
@@ -113,221 +126,271 @@
     contents of the registry key's value, or None on failure.  Throws
     ImportError if _winreg is unavailable.
   """
-  import _winreg
-  try:
-    root, subkey = key.split('\\', 1)
-    assert root == 'HKLM'  # Only need HKLM for now.
-    with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) as hkey:
-      return _winreg.QueryValueEx(hkey, value)[0]
-  except WindowsError:
-    return None
+    import _winreg
+    try:
+        root, subkey = key.split('\\', 1)
+        assert root == 'HKLM'  # Only need HKLM for now.
+        with _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, subkey) as hkey:
+            return _winreg.QueryValueEx(hkey, value)[0]
+    except WindowsError:
+        return None
 
 
 def _RegistryGetValue(key, value):
-  try:
-    return _RegistryGetValueUsingWinReg(key, value)
-  except ImportError:
-    raise Exception('The python library _winreg not found.')
+    try:
+        return _RegistryGetValueUsingWinReg(key, value)
+    except ImportError:
+        raise Exception('The python library _winreg not found.')
 
 
 def GetVisualStudioVersion():
-  """Return GYP_MSVS_VERSION of Visual Studio.
+    """Return best available version of Visual Studio.
   """
-  return os.environ.get('GYP_MSVS_VERSION', CURRENT_DEFAULT_TOOLCHAIN_VERSION)
+
+    env_version = os.environ.get('GYP_MSVS_VERSION')
+    if env_version:
+        return env_version
+
+    supported_versions = MSVS_VERSIONS.keys()
+
+    # VS installed in depot_tools for Googlers
+    if bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1'))):
+        return supported_versions[0]
+
+    # VS installed in system for external developers
+    supported_versions_str = ', '.join(
+        '{} ({})'.format(v, k) for k, v in MSVS_VERSIONS.items())
+    available_versions = []
+    for version in supported_versions:
+        for path in (
+                os.environ.get('vs%s_install' % version),
+                os.path.expandvars('%ProgramFiles(x86)%' +
+                                   '/Microsoft Visual Studio/%s' % version)):
+            if path and os.path.exists(path):
+                available_versions.append(version)
+                break
+
+    if not available_versions:
+        raise Exception('No supported Visual Studio can be found.'
+                        ' Supported versions are: %s.' % supported_versions_str)
+    return available_versions[0]
 
 
 def DetectVisualStudioPath():
-  """Return path to the GYP_MSVS_VERSION of Visual Studio.
+    """Return path to the GYP_MSVS_VERSION of Visual Studio.
   """
 
-  # Note that this code is used from
-  # build/toolchain/win/setup_toolchain.py as well.
-  version_as_year = GetVisualStudioVersion()
-  year_to_version = {
-      '2017': '15.0',
-  }
-  if version_as_year not in year_to_version:
-    raise Exception(('Visual Studio version %s (from GYP_MSVS_VERSION)'
-                     ' not supported. Supported versions are: %s') % (
-                       version_as_year, ', '.join(year_to_version.keys())))
-  if version_as_year == '2017':
-    # The VC++ 2017 install location needs to be located using COM instead of
+    # Note that this code is used from
+    # build/toolchain/win/setup_toolchain.py as well.
+    version_as_year = GetVisualStudioVersion()
+
+    # The VC++ >=2017 install location needs to be located using COM instead of
     # the registry. For details see:
     # https://blogs.msdn.microsoft.com/heaths/2016/09/15/changes-to-visual-studio-15-setup/
     # For now we use a hardcoded default with an environment variable override.
     for path in (
-        os.environ.get('vs2017_install'),
-        os.path.expandvars('%ProgramFiles(x86)%'
-                           '/Microsoft Visual Studio/2017/Enterprise'),
-        os.path.expandvars('%ProgramFiles(x86)%'
-                           '/Microsoft Visual Studio/2017/Professional'),
-        os.path.expandvars('%ProgramFiles(x86)%'
-                           '/Microsoft Visual Studio/2017/Community')):
-      if path and os.path.exists(path):
-        return path
+            os.environ.get('vs%s_install' % version_as_year),
+            os.path.expandvars(
+                '%ProgramFiles(x86)%' +
+                '/Microsoft Visual Studio/%s/Enterprise' % version_as_year),
+            os.path.expandvars(
+                '%ProgramFiles(x86)%' +
+                '/Microsoft Visual Studio/%s/Professional' % version_as_year),
+            os.path.expandvars(
+                '%ProgramFiles(x86)%' +
+                '/Microsoft Visual Studio/%s/Community' % version_as_year),
+            os.path.expandvars(
+                '%ProgramFiles(x86)%' +
+                '/Microsoft Visual Studio/%s/Preview' % version_as_year)):
+        if path and os.path.exists(path):
+            return path
 
-  raise Exception(('Visual Studio Version %s (from GYP_MSVS_VERSION)'
-                   ' not found.') % (version_as_year))
+    raise Exception('Visual Studio Version %s (from GYP_MSVS_VERSION)'
+                    ' not found.' % version_as_year)
 
 
 def _CopyRuntimeImpl(target, source, verbose=True):
-  """Copy |source| to |target| if it doesn't already exist or if it needs to be
+    """Copy |source| to |target| if it doesn't already exist or if it needs to be
   updated (comparing last modified time as an approximate float match as for
   some reason the values tend to differ by ~1e-07 despite being copies of the
   same file... https://crbug.com/603603).
   """
-  if (os.path.isdir(os.path.dirname(target)) and
-      (not os.path.isfile(target) or
-       abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)):
-    if verbose:
-      print 'Copying %s to %s...' % (source, target)
-    if os.path.exists(target):
-      # Make the file writable so that we can delete it now, and keep it
-      # readable.
-      os.chmod(target, stat.S_IWRITE | stat.S_IREAD)
-      os.unlink(target)
-    shutil.copy2(source, target)
-    # Make the file writable so that we can overwrite or delete it later,
-    # keep it readable.
-    os.chmod(target, stat.S_IWRITE | stat.S_IREAD)
+    if (os.path.isdir(os.path.dirname(target)) and
+        (not os.path.isfile(target) or
+         abs(os.stat(target).st_mtime - os.stat(source).st_mtime) >= 0.01)):
+        if verbose:
+            print('Copying %s to %s...' % (source, target))
+        if os.path.exists(target):
+            # Make the file writable so that we can delete it now, and keep it
+            # readable.
+            os.chmod(target, stat.S_IWRITE | stat.S_IREAD)
+            os.unlink(target)
+        shutil.copy2(source, target)
+        # Make the file writable so that we can overwrite or delete it later,
+        # keep it readable.
+        os.chmod(target, stat.S_IWRITE | stat.S_IREAD)
+
+
+def _SortByHighestVersionNumberFirst(list_of_str_versions):
+    """This sorts |list_of_str_versions| according to version number rules
+  so that version "1.12" is higher than version "1.9". Does not work
+  with non-numeric versions like 1.4.a8 which will be higher than
+  1.4.a12. It does handle the versions being embedded in file paths.
+  """
+
+    def to_int_if_int(x):
+        try:
+            return int(x)
+        except ValueError:
+            return x
+
+    def to_number_sequence(x):
+        part_sequence = re.split(r'[\\/\.]', x)
+        return [to_int_if_int(x) for x in part_sequence]
+
+    list_of_str_versions.sort(key=to_number_sequence, reverse=True)
 
 
 def _CopyUCRTRuntime(target_dir, source_dir, target_cpu, dll_pattern, suffix):
-  """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't
+    """Copy both the msvcp and vccorlib runtime DLLs, only if the target doesn't
   exist, but the target directory does exist."""
-  for file_part in ('msvcp', 'vccorlib', 'vcruntime'):
-    dll = dll_pattern % file_part
-    target = os.path.join(target_dir, dll)
-    source = os.path.join(source_dir, dll)
-    _CopyRuntimeImpl(target, source)
-  # Copy the UCRT files from the Windows SDK. This location includes the
-  # api-ms-win-crt-*.dll files that are not found in the Windows directory.
-  # These files are needed for component builds. If WINDOWSSDKDIR is not set
-  # use the default SDK path. This will be the case when
-  # DEPOT_TOOLS_WIN_TOOLCHAIN=0 and vcvarsall.bat has not been run.
-  win_sdk_dir = os.path.normpath(
-      os.environ.get('WINDOWSSDKDIR',
-                     os.path.expandvars('%ProgramFiles(x86)%'
-                                        '\\Windows Kits\\10')))
-  # ARM64 doesn't have a redist for the ucrt DLLs because they are always
-  # present in the OS.
-  if target_cpu != 'arm64':
-    ucrt_dll_dirs = os.path.join(win_sdk_dir, 'Redist', 'ucrt', 'DLLs',
-                                 target_cpu)
-    ucrt_files = glob.glob(os.path.join(ucrt_dll_dirs, 'api-ms-win-*.dll'))
-    assert len(ucrt_files) > 0
-    for ucrt_src_file in ucrt_files:
-      file_part = os.path.basename(ucrt_src_file)
-      ucrt_dst_file = os.path.join(target_dir, file_part)
-      _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False)
-  # We must copy ucrtbase.dll for x64/x86, and ucrtbased.dll for all CPU types.
-  if target_cpu != 'arm64' or not suffix.startswith('.'):
-    _CopyRuntimeImpl(os.path.join(target_dir, 'ucrtbase' + suffix),
-                     os.path.join(source_dir, 'ucrtbase' + suffix))
+    if target_cpu == 'arm64':
+        # Windows ARM64 VCRuntime is located at {toolchain_root}/VC/Redist/MSVC/
+        # {x.y.z}/[debug_nonredist/]arm64/Microsoft.VC141.CRT/.
+        vc_redist_root = FindVCRedistRoot()
+        if suffix.startswith('.'):
+            source_dir = os.path.join(vc_redist_root, 'arm64',
+                                      'Microsoft.VC141.CRT')
+        else:
+            source_dir = os.path.join(vc_redist_root, 'debug_nonredist',
+                                      'arm64', 'Microsoft.VC141.DebugCRT')
+    for file_part in ('msvcp', 'vccorlib', 'vcruntime'):
+        dll = dll_pattern % file_part
+        target = os.path.join(target_dir, dll)
+        source = os.path.join(source_dir, dll)
+        _CopyRuntimeImpl(target, source)
+    # Copy the UCRT files from the Windows SDK. This location includes the
+    # api-ms-win-crt-*.dll files that are not found in the Windows directory.
+    # These files are needed for component builds. If WINDOWSSDKDIR is not set
+    # use the default SDK path. This will be the case when
+    # DEPOT_TOOLS_WIN_TOOLCHAIN=0 and vcvarsall.bat has not been run.
+    win_sdk_dir = os.path.normpath(
+        os.environ.get(
+            'WINDOWSSDKDIR',
+            os.path.expandvars('%ProgramFiles(x86)%'
+                               '\\Windows Kits\\10')))
+    # ARM64 doesn't have a redist for the ucrt DLLs because they are always
+    # present in the OS.
+    if target_cpu != 'arm64':
+        # Starting with the 10.0.17763 SDK the ucrt files are in a version-named
+        # directory - this handles both cases.
+        redist_dir = os.path.join(win_sdk_dir, 'Redist')
+        version_dirs = glob.glob(os.path.join(redist_dir, '10.*'))
+        if len(version_dirs) > 0:
+            _SortByHighestVersionNumberFirst(version_dirs)
+            redist_dir = version_dirs[0]
+        ucrt_dll_dirs = os.path.join(redist_dir, 'ucrt', 'DLLs', target_cpu)
+        ucrt_files = glob.glob(os.path.join(ucrt_dll_dirs, 'api-ms-win-*.dll'))
+        assert len(ucrt_files) > 0
+        for ucrt_src_file in ucrt_files:
+            file_part = os.path.basename(ucrt_src_file)
+            ucrt_dst_file = os.path.join(target_dir, file_part)
+            _CopyRuntimeImpl(ucrt_dst_file, ucrt_src_file, False)
+    # We must copy ucrtbase.dll for x64/x86, and ucrtbased.dll for all CPU types.
+    if target_cpu != 'arm64' or not suffix.startswith('.'):
+        if not suffix.startswith('.'):
+            # ucrtbased.dll is located at {win_sdk_dir}/bin/{a.b.c.d}/{target_cpu}/
+            # ucrt/.
+            sdk_redist_root = os.path.join(win_sdk_dir, 'bin')
+            sdk_bin_sub_dirs = os.listdir(sdk_redist_root)
+            # Select the most recent SDK if there are multiple versions installed.
+            _SortByHighestVersionNumberFirst(sdk_bin_sub_dirs)
+            for directory in sdk_bin_sub_dirs:
+                sdk_redist_root_version = os.path.join(sdk_redist_root,
+                                                       directory)
+                if not os.path.isdir(sdk_redist_root_version):
+                    continue
+                if re.match(r'10\.\d+\.\d+\.\d+', directory):
+                    source_dir = os.path.join(sdk_redist_root_version,
+                                              target_cpu, 'ucrt')
+                    break
+        _CopyRuntimeImpl(
+            os.path.join(target_dir, 'ucrtbase' + suffix),
+            os.path.join(source_dir, 'ucrtbase' + suffix))
 
 
-def FindVCToolsRoot():
-  """In VS2017 the PGO runtime dependencies are located in
-  {toolchain_root}/VC/Tools/MSVC/{x.y.z}/bin/Host{target_cpu}/{target_cpu}/, the
-  {version_number} part is likely to change in case of a minor update of the
-  toolchain so we don't hardcode this value here (except for the major number).
-
-  This returns the '{toolchain_root}/VC/Tools/MSVC/{x.y.z}/bin/' path.
-
-  This function should only be called when using VS2017.
+def FindVCComponentRoot(component):
+    """Find the most recent Tools or Redist or other directory in an MSVC install.
+  Typical results are {toolchain_root}/VC/{component}/MSVC/{x.y.z}. The {x.y.z}
+  version number part changes frequently so the highest version number found is
+  used.
   """
-  assert GetVisualStudioVersion() == '2017'
-  SetEnvironmentAndGetRuntimeDllDirs()
-  assert ('GYP_MSVS_OVERRIDE_PATH' in os.environ)
-  vc_tools_msvc_root = os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
-      'VC', 'Tools', 'MSVC')
-  for directory in os.listdir(vc_tools_msvc_root):
-    if not os.path.isdir(os.path.join(vc_tools_msvc_root, directory)):
-      continue
-    if re.match('14\.\d+\.\d+', directory):
-      return os.path.join(vc_tools_msvc_root, directory, 'bin')
-  raise Exception('Unable to find the VC tools directory.')
+
+    SetEnvironmentAndGetRuntimeDllDirs()
+    assert ('GYP_MSVS_OVERRIDE_PATH' in os.environ)
+    vc_component_msvc_root = os.path.join(os.environ['GYP_MSVS_OVERRIDE_PATH'],
+                                          'VC', component, 'MSVC')
+    vc_component_msvc_contents = os.listdir(vc_component_msvc_root)
+    # Select the most recent toolchain if there are several.
+    _SortByHighestVersionNumberFirst(vc_component_msvc_contents)
+    for directory in vc_component_msvc_contents:
+        if not os.path.isdir(os.path.join(vc_component_msvc_root, directory)):
+            continue
+        if re.match(r'14\.\d+\.\d+', directory):
+            return os.path.join(vc_component_msvc_root, directory)
+    raise Exception('Unable to find the VC %s directory.' % component)
 
 
-def _CopyPGORuntime(target_dir, target_cpu):
-  """Copy the runtime dependencies required during a PGO build.
+def FindVCRedistRoot():
+    """In >=VS2017, Redist binaries are located in
+  {toolchain_root}/VC/Redist/MSVC/{x.y.z}/{target_cpu}/.
+
+  This returns the '{toolchain_root}/VC/Redist/MSVC/{x.y.z}/' path.
   """
-  env_version = GetVisualStudioVersion()
-  # These dependencies will be in a different location depending on the version
-  # of the toolchain.
-  if env_version == '2017':
-    pgo_runtime_root = FindVCToolsRoot()
-    assert pgo_runtime_root
-    # There's no version of pgosweep.exe in HostX64/x86, so we use the copy
-    # from HostX86/x86.
-    pgo_x86_runtime_dir = os.path.join(pgo_runtime_root, 'HostX86', 'x86')
-    pgo_x64_runtime_dir = os.path.join(pgo_runtime_root, 'HostX64', 'x64')
-    pgo_arm64_runtime_dir = os.path.join(pgo_runtime_root, 'arm64')
-  else:
-    raise Exception('Unexpected toolchain version: %s.' % env_version)
-
-  # We need to copy 2 runtime dependencies used during the profiling step:
-  #     - pgort140.dll: runtime library required to run the instrumented image.
-  #     - pgosweep.exe: executable used to collect the profiling data
-  pgo_runtimes = ['pgort140.dll', 'pgosweep.exe']
-  for runtime in pgo_runtimes:
-    if target_cpu == 'x86':
-      source = os.path.join(pgo_x86_runtime_dir, runtime)
-    elif target_cpu == 'x64':
-      source = os.path.join(pgo_x64_runtime_dir, runtime)
-    elif target_cpu == 'arm64':
-      source = os.path.join(pgo_arm64_runtime_dir, runtime)
-    else:
-      raise NotImplementedError('Unexpected target_cpu value: ' + target_cpu)
-    if not os.path.exists(source):
-      raise Exception('Unable to find %s.' % source)
-    _CopyRuntimeImpl(os.path.join(target_dir, runtime), source)
+    return FindVCComponentRoot('Redist')
 
 
 def _CopyRuntime(target_dir, source_dir, target_cpu, debug):
-  """Copy the VS runtime DLLs, only if the target doesn't exist, but the target
-  directory does exist. Handles VS 2015 and VS 2017."""
-  suffix = 'd.dll' if debug else '.dll'
-  # VS 2017 uses the same CRT DLLs as VS 2015.
-  _CopyUCRTRuntime(target_dir, source_dir, target_cpu, '%s140' + suffix,
-                    suffix)
+    """Copy the VS runtime DLLs, only if the target doesn't exist, but the target
+  directory does exist. Handles VS 2015, 2017 and 2019."""
+    suffix = 'd.dll' if debug else '.dll'
+    # VS 2015, 2017 and 2019 use the same CRT DLLs.
+    _CopyUCRTRuntime(target_dir, source_dir, target_cpu, '%s140' + suffix,
+                     suffix)
 
 
 def CopyDlls(target_dir, configuration, target_cpu):
-  """Copy the VS runtime DLLs into the requested directory as needed.
+    """Copy the VS runtime DLLs into the requested directory as needed.
 
   configuration is one of 'Debug' or 'Release'.
-  target_cpu is one of 'x86' or 'x64'.
+  target_cpu is one of 'x86', 'x64' or 'arm64'.
 
   The debug configuration gets both the debug and release DLLs; the
   release config only the latter.
   """
-  vs_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
-  if not vs_runtime_dll_dirs:
-    return
+    vs_runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
+    if not vs_runtime_dll_dirs:
+        return
 
-  x64_runtime, x86_runtime, arm64_runtime = vs_runtime_dll_dirs
-  if target_cpu == 'x64':
-    runtime_dir = x64_runtime
-  elif target_cpu == 'x86':
-    runtime_dir = x86_runtime
-  elif target_cpu == 'arm64':
-    runtime_dir = arm64_runtime
-  else:
-    raise Exception('Unknown target_cpu: ' + target_cpu)
-  _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False)
-  if configuration == 'Debug':
-    _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True)
-  else:
-    _CopyPGORuntime(target_dir, target_cpu)
-
-  _CopyDebugger(target_dir, target_cpu)
+    x64_runtime, x86_runtime, arm64_runtime = vs_runtime_dll_dirs
+    if target_cpu == 'x64':
+        runtime_dir = x64_runtime
+    elif target_cpu == 'x86':
+        runtime_dir = x86_runtime
+    elif target_cpu == 'arm64':
+        runtime_dir = arm64_runtime
+    else:
+        raise Exception('Unknown target_cpu: ' + target_cpu)
+    _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=False)
+    if configuration == 'Debug':
+        _CopyRuntime(target_dir, runtime_dir, target_cpu, debug=True)
+    _CopyDebugger(target_dir, target_cpu)
 
 
 def _CopyDebugger(target_dir, target_cpu):
-  """Copy dbghelp.dll and dbgcore.dll into the requested directory as needed.
+    """Copy dbghelp.dll and dbgcore.dll into the requested directory as needed.
 
-  target_cpu is one of 'x86' or 'x64'.
+  target_cpu is one of 'x86', 'x64' or 'arm64'.
 
   dbghelp.dll is used when Chrome needs to symbolize stacks. Copying this file
   from the SDK directory avoids using the system copy of dbghelp.dll which then
@@ -337,166 +400,174 @@
   dbgcore.dll is needed when using some functions from dbghelp.dll (like
   MinidumpWriteDump).
   """
-  win_sdk_dir = SetEnvironmentAndGetSDKDir()
-  if not win_sdk_dir:
-    return
+    win_sdk_dir = SetEnvironmentAndGetSDKDir()
+    if not win_sdk_dir:
+        return
 
-  # List of debug files that should be copied, the first element of the tuple is
-  # the name of the file and the second indicates if it's optional.
-  debug_files = [('dbghelp.dll', False), ('dbgcore.dll', True)]
-  for debug_file, is_optional in debug_files:
-    full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu, debug_file)
-    if not os.path.exists(full_path):
-      if is_optional:
-        continue
-      else:
-        # TODO(crbug.com/773476): remove version requirement.
-        raise Exception('%s not found in "%s"\r\nYou must install the '
-                        '"Debugging Tools for Windows" feature from the Windows'
-                        ' 10 SDK. You must use v10.0.17134.0. of the SDK'
-                        % (debug_file, full_path))
-    target_path = os.path.join(target_dir, debug_file)
-    _CopyRuntimeImpl(target_path, full_path)
+    # List of debug files that should be copied, the first element of the tuple is
+    # the name of the file and the second indicates if it's optional.
+    debug_files = [('dbghelp.dll', False), ('dbgcore.dll', True)]
+    for debug_file, is_optional in debug_files:
+        full_path = os.path.join(win_sdk_dir, 'Debuggers', target_cpu,
+                                 debug_file)
+        if not os.path.exists(full_path):
+            if is_optional:
+                continue
+            else:
+                # TODO(crbug.com/773476): remove version requirement.
+                raise Exception(
+                    '%s not found in "%s"\r\nYou must install the '
+                    '"Debugging Tools for Windows" feature from the Windows'
+                    ' 10 SDK.' % (debug_file, full_path))
+        target_path = os.path.join(target_dir, debug_file)
+        _CopyRuntimeImpl(target_path, full_path)
 
 
 def _GetDesiredVsToolchainHashes():
-  """Load a list of SHA1s corresponding to the toolchains that we want installed
+    """Load a list of SHA1s corresponding to the toolchains that we want installed
   to build with."""
-  env_version = GetVisualStudioVersion()
-  if env_version == '2017':
-    # VS 2017 Update 7.1 (15.7.1) with 10.0.17134.12 SDK, rebuilt with
-    # dbghelp.dll fix.
-    toolchain_hash = '3bc0ec615cf20ee342f3bc29bc991b5ad66d8d2c'
-    # Third parties that do not have access to the canonical toolchain can map
-    # canonical toolchain version to their own toolchain versions.
-    toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % toolchain_hash
-    return [os.environ.get(toolchain_hash_mapping_key, toolchain_hash)]
-  raise Exception('Unsupported VS version %s' % env_version)
+    env_version = GetVisualStudioVersion()
+    if env_version == '2017':
+        # VS 2017 Update 9 (15.9.12) with 10.0.18362 SDK, 10.0.17763 version of
+        # Debuggers, and 10.0.17134 version of d3dcompiler_47.dll, with ARM64
+        # libraries.
+        toolchain_hash = '418b3076791776573a815eb298c8aa590307af63'
+        # Third parties that do not have access to the canonical toolchain can map
+        # canonical toolchain version to their own toolchain versions.
+        toolchain_hash_mapping_key = 'GYP_MSVS_HASH_%s' % toolchain_hash
+        return [os.environ.get(toolchain_hash_mapping_key, toolchain_hash)]
+    raise Exception('Unsupported VS version %s' % env_version)
 
 
 def ShouldUpdateToolchain():
-  """Check if the toolchain should be upgraded."""
-  if not os.path.exists(json_data_file):
-    return True
-  with open(json_data_file, 'r') as tempf:
-    toolchain_data = json.load(tempf)
-  version = toolchain_data['version']
-  env_version = GetVisualStudioVersion()
-  # If there's a mismatch between the version set in the environment and the one
-  # in the json file then the toolchain should be updated.
-  return version != env_version
+    """Check if the toolchain should be upgraded."""
+    if not os.path.exists(json_data_file):
+        return True
+    with open(json_data_file, 'r') as tempf:
+        toolchain_data = json.load(tempf)
+    version = toolchain_data['version']
+    env_version = GetVisualStudioVersion()
+    # If there's a mismatch between the version set in the environment and the one
+    # in the json file then the toolchain should be updated.
+    return version != env_version
 
 
-def Update(force=False):
-  """Requests an update of the toolchain to the specific hashes we have at
+def Update(force=False, no_download=False):
+    """Requests an update of the toolchain to the specific hashes we have at
   this revision. The update outputs a .json of the various configuration
   information required to pass to gyp which we use in |GetToolchainDir()|.
+  If no_download is true then the toolchain will be configured if present but
+  will not be downloaded.
   """
-  if force != False and force != '--force':
-    print >>sys.stderr, 'Unknown parameter "%s"' % force
-    return 1
-  if force == '--force' or os.path.exists(json_data_file):
-    force = True
+    if force != False and force != '--force':
+        print('Unknown parameter "%s"' % force, file=sys.stderr)
+        return 1
+    if force == '--force' or os.path.exists(json_data_file):
+        force = True
 
-  depot_tools_win_toolchain = \
-      bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')))
-  if ((sys.platform in ('win32', 'cygwin') or force) and
-        depot_tools_win_toolchain):
-    import find_depot_tools
-    depot_tools_path = find_depot_tools.add_depot_tools_to_path()
+    depot_tools_win_toolchain = \
+        bool(int(os.environ.get('DEPOT_TOOLS_WIN_TOOLCHAIN', '1')))
+    if ((sys.platform in ('win32', 'cygwin') or force) and
+            depot_tools_win_toolchain):
+        import find_depot_tools
+        depot_tools_path = find_depot_tools.add_depot_tools_to_path()
 
-    # On Linux, the file system is usually case-sensitive while the Windows
-    # SDK only works on case-insensitive file systems.  If it doesn't already
-    # exist, set up a ciopfs fuse mount to put the SDK in a case-insensitive
-    # part of the file system.
-    toolchain_dir = os.path.join(depot_tools_path, 'win_toolchain', 'vs_files')
-    # For testing this block, unmount existing mounts with
-    # fusermount -u third_party/depot_tools/win_toolchain/vs_files
-    if sys.platform.startswith('linux') and not os.path.ismount(toolchain_dir):
-      import distutils.spawn
-      ciopfs = distutils.spawn.find_executable('ciopfs')
-      if not ciopfs:
-        # ciopfs not found in PATH; try the one downloaded from the DEPS hook.
-        ciopfs = os.path.join(script_dir, 'ciopfs')
-      if not os.path.isdir(toolchain_dir):
-        os.mkdir(toolchain_dir)
-      if not os.path.isdir(toolchain_dir + '.ciopfs'):
-        os.mkdir(toolchain_dir + '.ciopfs')
-      # Without use_ino, clang's #pragma once and Wnonportable-include-path
-      # both don't work right, see https://llvm.org/PR34931
-      # use_ino doesn't slow down builds, so it seems there's no drawback to
-      # just using it always.
-      subprocess.check_call([
-          ciopfs, '-o', 'use_ino', toolchain_dir + '.ciopfs', toolchain_dir])
+        # On Linux, the file system is usually case-sensitive while the Windows
+        # SDK only works on case-insensitive file systems.  If it doesn't already
+        # exist, set up a ciopfs fuse mount to put the SDK in a case-insensitive
+        # part of the file system.
+        toolchain_dir = os.path.join(depot_tools_path, 'win_toolchain',
+                                     'vs_files')
+        # For testing this block, unmount existing mounts with
+        # fusermount -u third_party/depot_tools/win_toolchain/vs_files
+        if sys.platform.startswith(
+                'linux') and not os.path.ismount(toolchain_dir):
+            import distutils.spawn
+            ciopfs = distutils.spawn.find_executable('ciopfs')
+            if not ciopfs:
+                # ciopfs not found in PATH; try the one downloaded from the DEPS hook.
+                ciopfs = os.path.join(script_dir, 'ciopfs')
+            if not os.path.isdir(toolchain_dir):
+                os.mkdir(toolchain_dir)
+            if not os.path.isdir(toolchain_dir + '.ciopfs'):
+                os.mkdir(toolchain_dir + '.ciopfs')
+            # Without use_ino, clang's #pragma once and Wnonportable-include-path
+            # both don't work right, see https://llvm.org/PR34931
+            # use_ino doesn't slow down builds, so it seems there's no drawback to
+            # just using it always.
+            subprocess.check_call([
+                ciopfs, '-o', 'use_ino', toolchain_dir + '.ciopfs',
+                toolchain_dir
+            ])
 
-    # Necessary so that get_toolchain_if_necessary.py will put the VS toolkit
-    # in the correct directory.
-    os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
-    get_toolchain_args = [
-        sys.executable,
-        os.path.join(depot_tools_path,
-                    'win_toolchain',
-                    'get_toolchain_if_necessary.py'),
-        '--output-json', json_data_file,
-      ] + _GetDesiredVsToolchainHashes()
-    if force:
-      get_toolchain_args.append('--force')
-    subprocess.check_call(get_toolchain_args)
+        # Necessary so that get_toolchain_if_necessary.py will put the VS toolkit
+        # in the correct directory.
+        os.environ['GYP_MSVS_VERSION'] = GetVisualStudioVersion()
+        get_toolchain_args = [
+            sys.executable,
+            os.path.join(depot_tools_path, 'win_toolchain',
+                         'get_toolchain_if_necessary.py'),
+            '--output-json',
+            json_data_file,
+        ] + _GetDesiredVsToolchainHashes()
+        if force:
+            get_toolchain_args.append('--force')
+        if no_download:
+            get_toolchain_args.append('--no-download')
+        subprocess.check_call(get_toolchain_args)
 
-  return 0
+    return 0
 
 
 def NormalizePath(path):
-  while path.endswith('\\'):
-    path = path[:-1]
-  return path
+    while path.endswith('\\'):
+        path = path[:-1]
+    return path
 
 
 def SetEnvironmentAndGetSDKDir():
-  """Gets location information about the current sdk (must have been
+    """Gets location information about the current sdk (must have been
   previously updated by 'update'). This is used for the GN build."""
-  SetEnvironmentAndGetRuntimeDllDirs()
+    SetEnvironmentAndGetRuntimeDllDirs()
 
-  # If WINDOWSSDKDIR is not set, search the default SDK path and set it.
-  if not 'WINDOWSSDKDIR' in os.environ:
-    default_sdk_path = os.path.expandvars('%ProgramFiles(x86)%'
-                                          '\\Windows Kits\\10')
-    if os.path.isdir(default_sdk_path):
-      os.environ['WINDOWSSDKDIR'] = default_sdk_path
+    # If WINDOWSSDKDIR is not set, search the default SDK path and set it.
+    if not 'WINDOWSSDKDIR' in os.environ:
+        default_sdk_path = os.path.expandvars('%ProgramFiles(x86)%'
+                                              '\\Windows Kits\\10')
+        if os.path.isdir(default_sdk_path):
+            os.environ['WINDOWSSDKDIR'] = default_sdk_path
 
-  return NormalizePath(os.environ['WINDOWSSDKDIR'])
+    return NormalizePath(os.environ['WINDOWSSDKDIR'])
 
 
 def GetToolchainDir():
-  """Gets location information about the current toolchain (must have been
+    """Gets location information about the current toolchain (must have been
   previously updated by 'update'). This is used for the GN build."""
-  runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
-  win_sdk_dir = SetEnvironmentAndGetSDKDir()
+    runtime_dll_dirs = SetEnvironmentAndGetRuntimeDllDirs()
+    win_sdk_dir = SetEnvironmentAndGetSDKDir()
 
-  print '''vs_path = %s
+    print('''vs_path = %s
 sdk_path = %s
 vs_version = %s
 wdk_dir = %s
 runtime_dirs = %s
-''' % (
-      ToGNString(NormalizePath(os.environ['GYP_MSVS_OVERRIDE_PATH'])),
-      ToGNString(win_sdk_dir),
-      ToGNString(GetVisualStudioVersion()),
-      ToGNString(NormalizePath(os.environ.get('WDK_DIR', ''))),
-      ToGNString(os.path.pathsep.join(runtime_dll_dirs or ['None'])))
+''' % (ToGNString(NormalizePath(os.environ['GYP_MSVS_OVERRIDE_PATH'])),
+       ToGNString(win_sdk_dir), ToGNString(GetVisualStudioVersion()),
+       ToGNString(NormalizePath(os.environ.get('WDK_DIR', ''))),
+       ToGNString(os.path.pathsep.join(runtime_dll_dirs or ['None']))))
 
 
 def main():
-  commands = {
-      'update': Update,
-      'get_toolchain_dir': GetToolchainDir,
-      'copy_dlls': CopyDlls,
-  }
-  if len(sys.argv) < 2 or sys.argv[1] not in commands:
-    print >>sys.stderr, 'Expected one of: %s' % ', '.join(commands)
-    return 1
-  return commands[sys.argv[1]](*sys.argv[2:])
+    commands = {
+        'update': Update,
+        'get_toolchain_dir': GetToolchainDir,
+        'copy_dlls': CopyDlls,
+    }
+    if len(sys.argv) < 2 or sys.argv[1] not in commands:
+        print('Expected one of: %s' % ', '.join(commands), file=sys.stderr)
+        return 1
+    return commands[sys.argv[1]](*sys.argv[2:])
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/build/win/importlibs/create_importlib_win.py b/build/win/importlibs/create_importlib_win.py
index bb6a2f0..401b6e8 100755
--- a/build/win/importlibs/create_importlib_win.py
+++ b/build/win/importlibs/create_importlib_win.py
@@ -14,7 +14,6 @@
 import sys
 import tempfile
 
-
 _USAGE = """\
 Usage: %prog [options] [imports-file]
 
@@ -24,7 +23,6 @@
     (lib.exe), both of which must be in path.
 """
 
-
 _ASM_STUB_HEADER = """\
 ; This file is autogenerated by create_importlib_win.py, do not edit.
 .386
@@ -35,55 +33,53 @@
 ; correct generation of import libs.
 """
 
-
 _DEF_STUB_HEADER = """\
 ; This file is autogenerated by create_importlib_win.py, do not edit.
 
 ; Export declarations for generating import libs.
 """
 
-
 _LOGGER = logging.getLogger()
 
 
-
 class _Error(Exception):
-  pass
+    pass
 
 
 class _ImportLibraryGenerator(object):
-  def __init__(self, temp_dir):
-    self._temp_dir = temp_dir
 
-  def _Shell(self, cmd, **kw):
-    ret = subprocess.call(cmd, **kw)
-    _LOGGER.info('Running "%s" returned %d.', cmd, ret)
-    if ret != 0:
-      raise _Error('Command "%s" returned %d.' % (cmd, ret))
+    def __init__(self, temp_dir):
+        self._temp_dir = temp_dir
 
-  def _ReadImportsFile(self, imports_file):
-    # Slurp the imports file.
-    return ast.literal_eval(open(imports_file).read())
+    def _Shell(self, cmd, **kw):
+        ret = subprocess.call(cmd, **kw)
+        _LOGGER.info('Running "%s" returned %d.', cmd, ret)
+        if ret != 0:
+            raise _Error('Command "%s" returned %d.' % (cmd, ret))
 
-  def _WriteStubsFile(self, import_names, output_file):
-    output_file.write(_ASM_STUB_HEADER)
+    def _ReadImportsFile(self, imports_file):
+        # Slurp the imports file.
+        return ast.literal_eval(open(imports_file).read())
 
-    for name in import_names:
-      output_file.write('%s PROC\n' % name)
-      output_file.write('%s ENDP\n' % name)
+    def _WriteStubsFile(self, import_names, output_file):
+        output_file.write(_ASM_STUB_HEADER)
 
-    output_file.write('END\n')
+        for name in import_names:
+            output_file.write('%s PROC\n' % name)
+            output_file.write('%s ENDP\n' % name)
 
-  def _WriteDefFile(self, dll_name, import_names, output_file):
-    output_file.write(_DEF_STUB_HEADER)
-    output_file.write('NAME %s\n' % dll_name)
-    output_file.write('EXPORTS\n')
-    for name in import_names:
-      name = name.split('@')[0]
-      output_file.write('  %s\n' % name)
+        output_file.write('END\n')
 
-  def _CreateObj(self, dll_name, imports):
-    """Writes an assembly file containing empty declarations.
+    def _WriteDefFile(self, dll_name, import_names, output_file):
+        output_file.write(_DEF_STUB_HEADER)
+        output_file.write('NAME %s\n' % dll_name)
+        output_file.write('EXPORTS\n')
+        for name in import_names:
+            name = name.split('@')[0]
+            output_file.write('  %s\n' % name)
+
+    def _CreateObj(self, dll_name, imports):
+        """Writes an assembly file containing empty declarations.
 
     For each imported function of the form:
 
@@ -106,112 +102,112 @@
     artifacts are quick and easy to produce, and of no interest to anyone
     after the fact."""
 
-    # Create an .asm file to provide stdcall-like stub names to lib.exe.
-    asm_name = dll_name + '.asm'
-    _LOGGER.info('Writing asm file "%s".', asm_name)
-    with open(os.path.join(self._temp_dir, asm_name), 'wb') as stubs_file:
-      self._WriteStubsFile(imports, stubs_file)
+        # Create an .asm file to provide stdcall-like stub names to lib.exe.
+        asm_name = dll_name + '.asm'
+        _LOGGER.info('Writing asm file "%s".', asm_name)
+        with open(os.path.join(self._temp_dir, asm_name), 'wb') as stubs_file:
+            self._WriteStubsFile(imports, stubs_file)
 
-    # Invoke on the assembler to compile it to .obj.
-    obj_name = dll_name + '.obj'
-    cmdline = ['ml.exe', '/nologo', '/c', asm_name, '/Fo', obj_name]
-    self._Shell(cmdline, cwd=self._temp_dir, stdout=open(os.devnull))
+        # Invoke on the assembler to compile it to .obj.
+        obj_name = dll_name + '.obj'
+        cmdline = ['ml.exe', '/nologo', '/c', asm_name, '/Fo', obj_name]
+        self._Shell(cmdline, cwd=self._temp_dir, stdout=open(os.devnull))
 
-    return obj_name
+        return obj_name
 
-  def _CreateImportLib(self, dll_name, imports, architecture, output_file):
-    """Creates an import lib binding imports to dll_name for architecture.
+    def _CreateImportLib(self, dll_name, imports, architecture, output_file):
+        """Creates an import lib binding imports to dll_name for architecture.
 
     On success, writes the import library to output file.
     """
-    obj_file = None
+        obj_file = None
 
-    # For x86 architecture we have to provide an object file for correct
-    # name mangling between the import stubs and the exported functions.
-    if architecture == 'x86':
-      obj_file = self._CreateObj(dll_name, imports)
+        # For x86 architecture we have to provide an object file for correct
+        # name mangling between the import stubs and the exported functions.
+        if architecture == 'x86':
+            obj_file = self._CreateObj(dll_name, imports)
 
-    # Create the corresponding .def file. This file has the non stdcall-adorned
-    # names, as exported by the destination DLL.
-    def_name = dll_name + '.def'
-    _LOGGER.info('Writing def file "%s".', def_name)
-    with open(os.path.join(self._temp_dir, def_name), 'wb') as def_file:
-      self._WriteDefFile(dll_name, imports, def_file)
+        # Create the corresponding .def file. This file has the non stdcall-adorned
+        # names, as exported by the destination DLL.
+        def_name = dll_name + '.def'
+        _LOGGER.info('Writing def file "%s".', def_name)
+        with open(os.path.join(self._temp_dir, def_name), 'wb') as def_file:
+            self._WriteDefFile(dll_name, imports, def_file)
 
-    # Invoke on lib.exe to create the import library.
-    # We generate everything into the temporary directory, as the .exp export
-    # files will be generated at the same path as the import library, and we
-    # don't want those files potentially gunking the works.
-    dll_base_name, ext = os.path.splitext(dll_name)
-    lib_name = dll_base_name + '.lib'
-    cmdline = ['lib.exe',
-               '/machine:%s' % architecture,
-               '/def:%s' % def_name,
-               '/out:%s' % lib_name]
-    if obj_file:
-      cmdline.append(obj_file)
+        # Invoke on lib.exe to create the import library.
+        # We generate everything into the temporary directory, as the .exp export
+        # files will be generated at the same path as the import library, and we
+        # don't want those files potentially gunking the works.
+        dll_base_name, ext = os.path.splitext(dll_name)
+        lib_name = dll_base_name + '.lib'
+        cmdline = [
+            'lib.exe',
+            '/machine:%s' % architecture,
+            '/def:%s' % def_name,
+            '/out:%s' % lib_name
+        ]
+        if obj_file:
+            cmdline.append(obj_file)
 
-    self._Shell(cmdline, cwd=self._temp_dir, stdout=open(os.devnull))
+        self._Shell(cmdline, cwd=self._temp_dir, stdout=open(os.devnull))
 
-    # Copy the .lib file to the output directory.
-    shutil.copyfile(os.path.join(self._temp_dir, lib_name), output_file)
-    _LOGGER.info('Created "%s".', output_file)
+        # Copy the .lib file to the output directory.
+        shutil.copyfile(os.path.join(self._temp_dir, lib_name), output_file)
+        _LOGGER.info('Created "%s".', output_file)
 
-  def CreateImportLib(self, imports_file, output_file):
-    # Read the imports file.
-    imports = self._ReadImportsFile(imports_file)
+    def CreateImportLib(self, imports_file, output_file):
+        # Read the imports file.
+        imports = self._ReadImportsFile(imports_file)
 
-    # Creates the requested import library in the output directory.
-    self._CreateImportLib(imports['dll_name'],
-                          imports['imports'],
-                          imports.get('architecture', 'x86'),
-                          output_file)
+        # Creates the requested import library in the output directory.
+        self._CreateImportLib(imports['dll_name'], imports['imports'],
+                              imports.get('architecture', 'x86'), output_file)
 
 
 def main():
-  parser = optparse.OptionParser(usage=_USAGE)
-  parser.add_option('-o', '--output-file',
-                    help='Specifies the output file path.')
-  parser.add_option('-k', '--keep-temp-dir',
-                    action='store_true',
-                    help='Keep the temporary directory.')
-  parser.add_option('-v', '--verbose',
-                    action='store_true',
-                    help='Verbose logging.')
+    parser = optparse.OptionParser(usage=_USAGE)
+    parser.add_option(
+        '-o', '--output-file', help='Specifies the output file path.')
+    parser.add_option(
+        '-k',
+        '--keep-temp-dir',
+        action='store_true',
+        help='Keep the temporary directory.')
+    parser.add_option(
+        '-v', '--verbose', action='store_true', help='Verbose logging.')
 
-  options, args = parser.parse_args()
+    options, args = parser.parse_args()
 
-  if len(args) != 1:
-    parser.error('You must provide an imports file.')
+    if len(args) != 1:
+        parser.error('You must provide an imports file.')
 
-  if not options.output_file:
-    parser.error('You must provide an output file.')
+    if not options.output_file:
+        parser.error('You must provide an output file.')
 
-  options.output_file = os.path.abspath(options.output_file)
+    options.output_file = os.path.abspath(options.output_file)
 
-  if options.verbose:
-    logging.basicConfig(level=logging.INFO)
-  else:
-    logging.basicConfig(level=logging.WARN)
+    if options.verbose:
+        logging.basicConfig(level=logging.INFO)
+    else:
+        logging.basicConfig(level=logging.WARN)
 
+    temp_dir = tempfile.mkdtemp()
+    _LOGGER.info('Created temporary directory "%s."', temp_dir)
+    try:
+        # Create a generator and create the import lib.
+        generator = _ImportLibraryGenerator(temp_dir)
 
-  temp_dir = tempfile.mkdtemp()
-  _LOGGER.info('Created temporary directory "%s."', temp_dir)
-  try:
-    # Create a generator and create the import lib.
-    generator = _ImportLibraryGenerator(temp_dir)
+        ret = generator.CreateImportLib(args[0], options.output_file)
+    except Exception, e:
+        _LOGGER.exception('Failed to create import lib.')
+        ret = 1
+    finally:
+        if not options.keep_temp_dir:
+            shutil.rmtree(temp_dir)
+            _LOGGER.info('Deleted temporary directory "%s."', temp_dir)
 
-    ret = generator.CreateImportLib(args[0], options.output_file)
-  except Exception, e:
-    _LOGGER.exception('Failed to create import lib.')
-    ret = 1
-  finally:
-    if not options.keep_temp_dir:
-      shutil.rmtree(temp_dir)
-      _LOGGER.info('Deleted temporary directory "%s."', temp_dir)
-
-  return ret
+    return ret
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/build/win/importlibs/filter_export_list.py b/build/win/importlibs/filter_export_list.py
index c2489a9d..23fe362 100755
--- a/build/win/importlibs/filter_export_list.py
+++ b/build/win/importlibs/filter_export_list.py
@@ -9,15 +9,14 @@
 import re
 import sys
 
-
-_EXPORT_RE = re.compile(r"""
+_EXPORT_RE = re.compile(
+    r"""
   ^\s*(?P<ordinal>[0-9]+)  # The ordinal field.
   \s+(?P<hint>[0-9A-F]+)   # The hint field.
   \s(?P<rva>........)      # The RVA field.
   \s+(?P<name>[^ ]+)       # And finally the name we're really after.
 """, re.VERBOSE)
 
-
 _USAGE = r"""\
 Usage: %prog [options] [master-file]
 
@@ -38,48 +37,51 @@
 function.
 """
 
+
 def _ReadMasterFile(master_file):
-  # Slurp the master file.
-  with open(master_file) as f:
-    master_exports = ast.literal_eval(f.read())
+    # Slurp the master file.
+    with open(master_file) as f:
+        master_exports = ast.literal_eval(f.read())
 
-  master_mapping = {}
-  for export in master_exports:
-    name = export.split('@')[0]
-    master_mapping[name] = export
+    master_mapping = {}
+    for export in master_exports:
+        name = export.split('@')[0]
+        master_mapping[name] = export
 
-  return master_mapping
+    return master_mapping
 
 
 def main():
-  parser = optparse.OptionParser(usage=_USAGE)
-  parser.add_option('-r', '--reverse',
-                    action='store_true',
-                    help='Reverse the matching, e.g. return the functions '
-                         'in the master list that aren\'t in the input.')
+    parser = optparse.OptionParser(usage=_USAGE)
+    parser.add_option(
+        '-r',
+        '--reverse',
+        action='store_true',
+        help='Reverse the matching, e.g. return the functions '
+        'in the master list that aren\'t in the input.')
 
-  options, args = parser.parse_args()
-  if len(args) != 1:
-    parser.error('Must provide a master file.')
+    options, args = parser.parse_args()
+    if len(args) != 1:
+        parser.error('Must provide a master file.')
 
-  master_mapping = _ReadMasterFile(args[0])
+    master_mapping = _ReadMasterFile(args[0])
 
-  found_exports = []
-  for line in sys.stdin:
-    match = _EXPORT_RE.match(line)
-    if match:
-      export_name = master_mapping.get(match.group('name'), None)
-      if export_name:
-          found_exports.append(export_name)
+    found_exports = []
+    for line in sys.stdin:
+        match = _EXPORT_RE.match(line)
+        if match:
+            export_name = master_mapping.get(match.group('name'), None)
+            if export_name:
+                found_exports.append(export_name)
 
-  if options.reverse:
-    # Invert the found_exports list.
-    found_exports = set(master_mapping.values()) - set(found_exports)
+    if options.reverse:
+        # Invert the found_exports list.
+        found_exports = set(master_mapping.values()) - set(found_exports)
 
-  # Sort the found exports for tidy output.
-  print '\n'.join(sorted(found_exports))
-  return 0
+    # Sort the found exports for tidy output.
+    print '\n'.join(sorted(found_exports))
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/build/win/reorder-imports.py b/build/win/reorder-imports.py
index 281668f..f96a9ec 100755
--- a/build/win/reorder-imports.py
+++ b/build/win/reorder-imports.py
@@ -10,48 +10,53 @@
 import subprocess
 import sys
 
+
 def reorder_imports(input_dir, output_dir, architecture):
-  """Run swapimports.exe on the initial chrome.exe, and write to the output
+    """Run swapimports.exe on the initial chrome.exe, and write to the output
   directory. Also copy over any related files that might be needed
   (pdbs, manifests etc.).
   """
 
-  input_image = os.path.join(input_dir, 'chrome.exe')
-  output_image = os.path.join(output_dir, 'chrome.exe')
+    input_image = os.path.join(input_dir, 'chrome.exe')
+    output_image = os.path.join(output_dir, 'chrome.exe')
 
-  swap_exe = os.path.join(
-    __file__,
-    '..\\..\\..\\third_party\\syzygy\\binaries\\exe\\swapimport.exe')
+    swap_exe = os.path.join(
+        __file__,
+        '..\\..\\..\\third_party\\syzygy\\binaries\\exe\\swapimport.exe')
 
-  args = [swap_exe, '--input-image=%s' % input_image,
-      '--output-image=%s' % output_image, '--overwrite', '--no-logo']
+    args = [
+        swap_exe,
+        '--input-image=%s' % input_image,
+        '--output-image=%s' % output_image, '--overwrite', '--no-logo'
+    ]
 
-  if architecture == 'x64':
-    args.append('--x64');
+    if architecture == 'x64':
+        args.append('--x64')
 
-  args.append('chrome_elf.dll');
+    args.append('chrome_elf.dll')
 
-  subprocess.call(args)
+    subprocess.call(args)
 
-  for fname in glob.iglob(os.path.join(input_dir, 'chrome.exe.*')):
-    shutil.copy(fname, os.path.join(output_dir, os.path.basename(fname)))
-  return 0
+    for fname in glob.iglob(os.path.join(input_dir, 'chrome.exe.*')):
+        shutil.copy(fname, os.path.join(output_dir, os.path.basename(fname)))
+    return 0
 
 
 def main(argv):
-  usage = 'reorder_imports.py -i <input_dir> -o <output_dir> -a <target_arch>'
-  parser = optparse.OptionParser(usage=usage)
-  parser.add_option('-i', '--input', help='reorder chrome.exe in DIR',
-      metavar='DIR')
-  parser.add_option('-o', '--output', help='write new chrome.exe to DIR',
-      metavar='DIR')
-  parser.add_option('-a', '--arch', help='architecture of build (optional)',
-      default='ia32')
-  opts, args = parser.parse_args()
+    usage = 'reorder_imports.py -i <input_dir> -o <output_dir> -a <target_arch>'
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option(
+        '-i', '--input', help='reorder chrome.exe in DIR', metavar='DIR')
+    parser.add_option(
+        '-o', '--output', help='write new chrome.exe to DIR', metavar='DIR')
+    parser.add_option(
+        '-a', '--arch', help='architecture of build (optional)', default='ia32')
+    opts, args = parser.parse_args()
 
-  if not opts.input or not opts.output:
-    parser.error('Please provide and input and output directory')
-  return reorder_imports(opts.input, opts.output, opts.arch)
+    if not opts.input or not opts.output:
+        parser.error('Please provide and input and output directory')
+    return reorder_imports(opts.input, opts.output, opts.arch)
+
 
 if __name__ == "__main__":
-  sys.exit(main(sys.argv[1:]))
+    sys.exit(main(sys.argv[1:]))
diff --git a/pkg/.gitignore b/pkg/.gitignore
index 2706929..6c1be22 100644
--- a/pkg/.gitignore
+++ b/pkg/.gitignore
@@ -7,4 +7,5 @@
 /*.vcxproj.user
 /*.vcxproj.filters
 /*.xcodeproj
-.idea/
\ No newline at end of file
+.idea/
+analysis_server/language_model/
diff --git a/pkg/analysis_server/analysis_options.yaml b/pkg/analysis_server/analysis_options.yaml
index e36185e..06e27a6 100644
--- a/pkg/analysis_server/analysis_options.yaml
+++ b/pkg/analysis_server/analysis_options.yaml
@@ -1,6 +1,13 @@
+analyzer:
+  exclude:
+    - test/mock_packages/**
+
 linter:
   rules:
-    - empty_constructor_bodies
+    - empty_constructor_bodies # pedantic
     - empty_statements
+    - prefer_equal_for_default_values # pedantic
+    - prefer_is_empty # pedantic
+    - prefer_is_not_empty # pedantic
     - unnecessary_brace_in_string_interps
-    - valid_regexps
+    - valid_regexps # pedantic
diff --git a/pkg/analysis_server/benchmark/benchmarks.dart b/pkg/analysis_server/benchmark/benchmarks.dart
index 1448599..2cb5f0a 100644
--- a/pkg/analysis_server/benchmark/benchmarks.dart
+++ b/pkg/analysis_server/benchmark/benchmarks.dart
@@ -151,7 +151,8 @@
   /// One of 'memory', 'cpu', or 'group'.
   final String kind;
 
-  Benchmark(this.id, this.description, {this.enabled: true, this.kind: 'cpu'});
+  Benchmark(this.id, this.description,
+      {this.enabled = true, this.kind = 'cpu'});
 
   bool get needsSetup => false;
 
@@ -160,8 +161,8 @@
   Future oneTimeCleanup() => new Future.value();
 
   Future<BenchMarkResult> run({
-    bool quick: false,
-    bool verbose: false,
+    bool quick = false,
+    bool verbose = false,
   });
 
   int get maxIterations => 0;
@@ -235,7 +236,7 @@
   String toString() => '${toJson()}';
 }
 
-List<String> getProjectRoots({bool quick: false}) {
+List<String> getProjectRoots({bool quick = false}) {
   String script = Platform.script.toFilePath(windows: Platform.isWindows);
   String pkgPath = path.normalize(path.join(path.dirname(script), '..', '..'));
   return <String>[path.join(pkgPath, quick ? 'meta' : 'analysis_server')];
diff --git a/pkg/analysis_server/benchmark/integration/driver.dart b/pkg/analysis_server/benchmark/integration/driver.dart
index f3b7032..9047f94 100644
--- a/pkg/analysis_server/benchmark/integration/driver.dart
+++ b/pkg/analysis_server/benchmark/integration/driver.dart
@@ -14,7 +14,7 @@
 final SPACE = ' '.codeUnitAt(0);
 
 void _printColumn(StringBuffer sb, String text, int keyLen,
-    {bool rightJustified: false}) {
+    {bool rightJustified = false}) {
   if (!rightJustified) {
     sb.write(text);
     sb.write(',');
@@ -272,7 +272,7 @@
    * Record the elapsed time for the given operation.
    */
   void record(String tag, Duration elapsed,
-      {bool notification: false, bool success: true}) {
+      {bool notification = false, bool success = true}) {
     Measurement measurement = measurements[tag];
     if (measurement == null) {
       measurement = new Measurement(tag, notification);
diff --git a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
index 56aca72..0fcb33d 100644
--- a/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
+++ b/pkg/analysis_server/benchmark/perf/benchmarks_impl.dart
@@ -27,8 +27,8 @@
 
   @override
   Future<BenchMarkResult> run({
-    bool quick: false,
-    bool verbose: false,
+    bool quick = false,
+    bool verbose = false,
   }) async {
     if (!quick) {
       deleteServerCache();
@@ -71,8 +71,8 @@
 
   @override
   Future<BenchMarkResult> run({
-    bool quick: false,
-    bool verbose: false,
+    bool quick = false,
+    bool verbose = false,
   }) async {
     Stopwatch stopwatch = new Stopwatch()..start();
 
@@ -127,7 +127,7 @@
       contents = contents.substring(0, index + 1) +
           ' ' +
           contents.substring(index + 1);
-      test.sendAnalysisUpdateContent(
+      await test.sendAnalysisUpdateContent(
           {filePath: new AddContentOverlay(contents)});
       await test.analysisFinished;
     }
@@ -152,10 +152,18 @@
     final Stopwatch stopwatch = new Stopwatch()..start();
 
     Future _complete(int offset) async {
+      // Create a new non-broadcast stream and subscribe to
+      // test.onCompletionResults before sending a request.
+      // Otherwise we could skip results which where posted to
+      // test.onCompletionResults after request is sent but
+      // before subscribing to test.onCompletionResults.
+      final completionResults = new StreamController<CompletionResultsParams>();
+      completionResults.sink.addStream(test.onCompletionResults);
+
       CompletionGetSuggestionsResult result =
           await test.sendCompletionGetSuggestions(filePath, offset);
 
-      Future<CompletionResultsParams> future = test.onCompletionResults
+      Future<CompletionResultsParams> future = completionResults.stream
           .where((CompletionResultsParams params) =>
               params.id == result.id && params.isLast)
           .first;
diff --git a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
index 0634a11..1f0b93a 100644
--- a/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
+++ b/pkg/analysis_server/benchmark/perf/flutter_analyze_benchmark.dart
@@ -62,8 +62,8 @@
 
   @override
   Future<BenchMarkResult> run({
-    bool quick: false,
-    bool verbose: false,
+    bool quick = false,
+    bool verbose = false,
   }) async {
     if (!quick) {
       deleteServerCache();
diff --git a/pkg/analysis_server/doc/api.html b/pkg/analysis_server/doc/api.html
index 2635ca1..2cf6a5f 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.27.1
+  1.27.2
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -272,6 +272,7 @@
 <li><a href="#request_edit.getAssists">edit.getAssists</a></li>
 <li><a href="#request_edit.getAvailableRefactorings">edit.getAvailableRefactorings</a></li>
 <li><a href="#request_edit.getFixes">edit.getFixes</a></li>
+<li><a href="#request_edit.getPostfixCompletion">edit.getPostfixCompletion</a></li>
 <li><a href="#request_edit.getRefactoring">edit.getRefactoring</a></li>
 <li><a href="#request_edit.sortMembers">edit.sortMembers</a></li>
 <li><a href="#request_edit.organizeDirectives">edit.organizeDirectives</a></li>
@@ -288,6 +289,9 @@
 <li><a href="#request_diagnostic.getServerPort">diagnostic.getServerPort</a></li>
 </ul>
 
+<p><a href="#domain_flutter">Flutter</a></p><ul><li><a href="#request_flutter.setSubscriptions">flutter.setSubscriptions</a></li>
+</ul>
+
 <h3>Command-line Arguments</h3>
 <p>
   The command-line arguments that can be passed to the server.
@@ -2252,6 +2256,48 @@
         <p>
           The fixes that are available for the errors at the given offset.
         </p>
+      </dd></dl></dd><dt class="request"><a name="request_edit.getPostfixCompletion">edit.getPostfixCompletion</a></dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "edit.getPostfixCompletion"
+  "params": {
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>key</b>": String
+    "<b>offset</b>": int
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+  "result": {
+    "<b>change</b>": <a href="#type_SourceChange">SourceChange</a>
+  }
+}</pre></div>
+    <p>
+      Get the changes required to convert the postfix template at the given
+      location into the template's expanded form.
+    </p>
+    
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>file: <a href="#type_FilePath">FilePath</a></b></dt><dd>
+        
+        <p>
+          The file containing the postfix template to be expanded.
+        </p>
+      </dd><dt class="field"><b>key: String</b></dt><dd>
+        
+        <p>
+          The unique name that identifies the template in use.
+        </p>
+      </dd><dt class="field"><b>offset: int</b></dt><dd>
+        
+        <p>
+          The offset used to identify the code to which the template will be
+          applied.
+        </p>
+      </dd></dl><h4>returns:</h4><dl><dt class="field"><b>change: <a href="#type_SourceChange">SourceChange</a></b></dt><dd>
+        
+        <p>
+          The change to be applied in order to complete the statement.
+        </p>
       </dd></dl></dd><dt class="request"><a name="request_edit.getRefactoring">edit.getRefactoring</a></dt><dd><div class="box"><pre>request: {
   "id": String
   "method": "edit.getRefactoring"
@@ -2811,7 +2857,92 @@
       </dd></dl></dd></dl>
 
 
-
+<h2 class="domain"><a name="domain_flutter">flutter domain</a></h2>
+  <p>
+    The analysis domain contains API’s related to Flutter support.
+  </p>
+  
+  
+  
+  
+<h3>Requests</h3><dl><dt class="request"><a name="request_flutter.setSubscriptions">flutter.setSubscriptions</a></dt><dd><div class="box"><pre>request: {
+  "id": String
+  "method": "flutter.setSubscriptions"
+  "params": {
+    "<b>subscriptions</b>": Map&lt;<a href="#type_FlutterService">FlutterService</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt;
+  }
+}</pre><br><pre>response: {
+  "id": String
+  "error": <span style="color:#999999">optional</span> <a href="#type_RequestError">RequestError</a>
+}</pre></div>
+    <p>
+      Subscribe for services that are specific to individual files.
+      All previous subscriptions are replaced by the current set of
+      subscriptions. If a given service is not included as a key in the map
+      then no files will be subscribed to the service, exactly as if the
+      service had been included in the map with an explicit empty list of
+      files.
+    </p>
+    <p>
+      Note that this request determines the set of requested
+      subscriptions. The actual set of subscriptions at any given
+      time is the intersection of this set with the set of files
+      currently subject to analysis. The files currently subject
+      to analysis are the set of files contained within an actual
+      analysis root but not excluded, plus all of the files
+      transitively reachable from those files via import, export
+      and part directives. (See analysis.setAnalysisRoots for an
+      explanation of how the actual analysis roots are
+      determined.) When the actual analysis roots change, the
+      actual set of subscriptions is automatically updated, but
+      the set of requested subscriptions is unchanged.
+    </p>
+    <p>
+      If a requested subscription is a directory it is ignored,
+      but remains in the set of requested subscriptions so that if
+      it later becomes a file it can be included in the set of
+      actual subscriptions.
+    </p>
+    <p>
+      It is an error if any of the keys in the map are not valid
+      services. If there is an error, then the existing
+      subscriptions will remain unchanged.
+    </p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>subscriptions: Map&lt;<a href="#type_FlutterService">FlutterService</a>, List&lt;<a href="#type_FilePath">FilePath</a>&gt;&gt;</b></dt><dd>
+        
+        <p>
+          A table mapping services to a list of the files being
+          subscribed to the service.
+        </p>
+      </dd></dl></dd></dl><h3>Notifications</h3><dl><dt class="notification"><a name="notification_flutter.outline">flutter.outline</a></dt><dd><div class="box"><pre>notification: {
+  "event": "flutter.outline"
+  "params": {
+    "<b>file</b>": <a href="#type_FilePath">FilePath</a>
+    "<b>outline</b>": <a href="#type_FlutterOutline">FlutterOutline</a>
+  }
+}</pre></div>
+    <p>
+      Reports the Flutter outline associated with a single file.
+    </p>
+    <p>
+      This notification is not subscribed to by default. Clients
+      can subscribe by including the value <tt>"OUTLINE"</tt> in
+      the list of services passed in an flutter.setSubscriptions
+      request.
+    </p>
+    
+  <h4>parameters:</h4><dl><dt class="field"><b>file: <a href="#type_FilePath">FilePath</a></b></dt><dd>
+        
+        <p>
+          The file with which the outline is associated.
+        </p>
+      </dd><dt class="field"><b>outline: <a href="#type_FlutterOutline">FlutterOutline</a></b></dt><dd>
+        
+        <p>
+          The outline associated with the file.
+        </p>
+      </dd></dl></dd></dl>
 
   <h2 class="domain"><a name="types">Types</a></h2>
   <p>
@@ -2871,6 +3002,11 @@
   
   
   
+  
+  
+  
+  
+  
 <dl><dt class="typeDefinition"><a name="type_AddContentOverlay">AddContentOverlay: object</a></dt><dd>
     <p>
       A directive to begin overlaying the contents of a file. The supplied
@@ -3620,7 +3756,7 @@
       An enumeration of the kinds of elements.
     </p>
     
-  <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
+  <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_ExecutableFile">ExecutableFile: object</a></dt><dd>
     <p>
       A description of an executable file.
     </p>
@@ -3699,7 +3835,325 @@
       not absolute or is not normalized, then an error of type
       <tt>INVALID_FILE_PATH_FORMAT</tt> will be generated.
     </p>
-  </dd><dt class="typeDefinition"><a name="type_FoldingKind">FoldingKind: String</a></dt><dd>
+  </dd><dt class="typeDefinition"><a name="type_FlutterOutline">FlutterOutline: object</a></dt><dd>
+    <p>
+      An node in the Flutter specific outline structure of a file.
+    </p>
+    
+  <dl><dt class="field"><b>kind: <a href="#type_FlutterOutlineKind">FlutterOutlineKind</a></b></dt><dd>
+        
+        <p>The kind of the node.</p>
+      </dd><dt class="field"><b>offset: int</b></dt><dd>
+        
+        <p>
+          The offset of the first character of the element. This is different
+          than the offset in the Element, which is the offset of the name of the
+          element. It can be used, for example, to map locations in the file
+          back to an outline.
+        </p>
+      </dd><dt class="field"><b>length: int</b></dt><dd>
+        
+        <p>
+          The length of the element.
+        </p>
+      </dd><dt class="field"><b>codeOffset: int</b></dt><dd>
+        
+        <p>
+          The offset of the first character of the element code, which is
+          neither documentation, nor annotation.
+        </p>
+      </dd><dt class="field"><b>codeLength: int</b></dt><dd>
+        
+        <p>
+          The length of the element code.
+        </p>
+      </dd><dt class="field"><b>label: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The text label of the node children of the node.
+          It is provided for any FlutterOutlineKind.GENERIC node,
+          where better information is not available.
+        </p>
+      </dd><dt class="field"><b>dartElement: <a href="#type_Element">Element</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If this node is a Dart element, the description of it; omitted
+          otherwise.
+        </p>
+      </dd><dt class="field"><b>attributes: List&lt;<a href="#type_FlutterOutlineAttribute">FlutterOutlineAttribute</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          Additional attributes for this node, which might be interesting
+          to display on the client. These attributes are usually arguments
+          for the instance creation or the invocation that created the widget.
+        </p>
+      </dd><dt class="field"><b>className: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the node creates a new class instance, or a reference to an
+          instance, this field has the name of the class.
+        </p>
+      </dd><dt class="field"><b>parentAssociationLabel: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A short text description how this node is associated with the parent
+          node. For example "appBar" or "body" in Scaffold.
+        </p>
+      </dd><dt class="field"><b>variableName: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If FlutterOutlineKind.VARIABLE, the name of the variable.
+        </p>
+      </dd><dt class="field"><b>children: List&lt;<a href="#type_FlutterOutline">FlutterOutline</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The children of the node. The field will be omitted if the node has no
+          children.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterOutlineAttribute">FlutterOutlineAttribute: object</a></dt><dd>
+    <p>
+      An attribute for a FlutterOutline.
+    </p>
+    
+  <dl><dt class="field"><b>name: String</b></dt><dd>
+        
+        <p>
+          The name of the attribute.
+        </p>
+      </dd><dt class="field"><b>label: String</b></dt><dd>
+        
+        <p>
+          The label of the attribute value, usually the Dart code.
+          It might be quite long, the client should abbreviate as needed.
+        </p>
+      </dd><dt class="field"><b>literalValueBoolean: bool<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The boolean literal value of the attribute.
+          This field is absent if the value is not a boolean literal.
+        </p>
+      </dd><dt class="field"><b>literalValueInteger: int<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The integer literal value of the attribute.
+          This field is absent if the value is not an integer literal.
+        </p>
+      </dd><dt class="field"><b>literalValueString: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The string literal value of the attribute.
+          This field is absent if the value is not a string literal.
+        </p>
+      </dd><dt class="field"><b>nameLocation: <a href="#type_Location">Location</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the attribute is a named argument, the location of the name,
+          without the colon.
+        </p>
+      </dd><dt class="field"><b>valueLocation: <a href="#type_Location">Location</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The location of the value.
+        </p>
+        <p>
+          This field is always available, but marked optional for backward
+          compatibility between new clients with older servers.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterOutlineKind">FlutterOutlineKind: String</a></dt><dd>
+    <p>
+      An enumeration of the kinds of FlutterOutline elements. The list of kinds
+      might be expanded with time, clients must be able to handle new kinds
+      in some general way.
+    </p>
+    
+  <dl><dt class="value">DART_ELEMENT</dt><dd>
+        
+        <p>A dart element declaration.</p>
+      </dd><dt class="value">GENERIC</dt><dd>
+        
+        <p>A generic Flutter element, without additional information.</p>
+      </dd><dt class="value">NEW_INSTANCE</dt><dd>
+        
+        <p>A new instance creation.</p>
+      </dd><dt class="value">INVOCATION</dt><dd>
+        
+        <p>An invocation of a method, a top-level function, a function
+          expression, etc.</p>
+      </dd><dt class="value">VARIABLE</dt><dd>
+        
+        <p>A reference to a local variable, or a field.</p>
+      </dd><dt class="value">PLACEHOLDER</dt><dd>
+        
+        <p>The parent node has a required Widget. The node works as a
+          placeholder child to drop a new Widget to.</p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterService">FlutterService: String</a></dt><dd>
+    <p>
+      An enumeration of the services provided by the flutter domain that
+      are related to a specific list of files.
+    </p>
+    
+  <dl><dt class="value">OUTLINE</dt></dl></dd><dt class="typeDefinition"><a name="type_FlutterWidgetProperty">FlutterWidgetProperty: object</a></dt><dd>
+    <p>
+      A property of a Flutter widget.
+    </p>
+    
+  <dl><dt class="field"><b>documentation: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The documentation of the property to show to the user. Omitted if
+          the server does not know the documentation, e.g. because the
+          corresponding field is not documented.
+        </p>
+      </dd><dt class="field"><b>expression: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the value of this property is set, the Dart code of the expression
+          of this property.
+        </p>
+      </dd><dt class="field"><b>id: int</b></dt><dd>
+        
+        <p>
+          The unique identifier of the property, must be passed back to the
+          server when updating the property value. Identifiers become invalid
+          on any source code change.
+        </p>
+      </dd><dt class="field"><b>isRequired: bool</b></dt><dd>
+        
+        <p>
+          True if the property is required, e.g. because it corresponds to
+          a required parameter of a constructor.
+        </p>
+      </dd><dt class="field"><b>isSafeToUpdate: bool</b></dt><dd>
+        
+        <p>
+          If the property expression is a concrete value (e.g. a literal, or
+          an enum constant), then it is safe to replace the expression with
+          another concrete value. In this case this field is true. Otherwise,
+          for example when the expression is a reference to a field, so that
+          its value is provided from outside, this field is false.
+        </p>
+      </dd><dt class="field"><b>name: String</b></dt><dd>
+        
+        <p>The name of the property to display to the user.</p>
+      </dd><dt class="field"><b>children: List&lt;<a href="#type_FlutterWidgetProperty">FlutterWidgetProperty</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The list of children properties, if any. For example any property of
+          type <tt>EdgeInsets</tt> will have four children properties of type
+          <tt>double</tt> - left / top / right / bottom.
+        </p>
+      </dd><dt class="field"><b>editor: <a href="#type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The editor that should be used by the client. This field is omitted
+          if the server does not know the editor for this property, for example
+          because it does not have one of the supported types.
+        </p>
+      </dd><dt class="field"><b>value: <a href="#type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          If the expression is set, and the server knows the value of the
+          expression, this field is set.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterWidgetPropertyEditor">FlutterWidgetPropertyEditor: object</a></dt><dd>
+    <p>
+      An editor for a property of a Flutter widget.
+    </p>
+    
+  <dl><dt class="field"><b>kind: <a href="#type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind</a></b></dt><dd>
+        
+      </dd><dt class="field"><b>enumItems: List&lt;<a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a>&gt;<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterWidgetPropertyEditorKind">FlutterWidgetPropertyEditorKind: String</a></dt><dd>
+    <p>
+      An enumeration of the kinds of property editors.
+    </p>
+    
+  <dl><dt class="value">BOOL</dt><dd>
+        
+        <p>
+          The editor for a property of type <tt>bool</tt>.
+        </p>
+      </dd><dt class="value">DOUBLE</dt><dd>
+        
+        <p>
+          The editor for a property of the type <tt>double</tt>.
+        </p>
+      </dd><dt class="value">ENUM</dt><dd>
+        
+        <p>
+          The editor for choosing an item of an enumeration, see the
+          <tt>enumItems</tt> field of <tt>FlutterWidgetPropertyEditor</tt>.
+        </p>
+      </dd><dt class="value">ENUM_LIKE</dt><dd>
+        
+        <p>
+          The editor for either choosing a pre-defined item from a list of
+          provided static field references (like <tt>ENUM</tt>), or specifying
+          a free-form expression.
+        </p>
+      </dd><dt class="value">INT</dt><dd>
+        
+        <p>
+          The editor for a property of type <tt>int</tt>.
+        </p>
+      </dd><dt class="value">STRING</dt><dd>
+        
+        <p>
+          The editor for a property of the type <tt>String</tt>.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterWidgetPropertyValue">FlutterWidgetPropertyValue: object</a></dt><dd>
+    <p>
+      A value of a property of a Flutter widget.
+    </p>
+    
+  <dl><dt class="field"><b>boolValue: bool<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd><dt class="field"><b>doubleValue: double<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd><dt class="field"><b>intValue: int<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd><dt class="field"><b>stringValue: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd><dt class="field"><b>enumValue: <a href="#type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem</a><span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+      </dd><dt class="field"><b>expression: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          A free-form expression, which will be used as the value as is.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FlutterWidgetPropertyValueEnumItem">FlutterWidgetPropertyValueEnumItem: object</a></dt><dd>
+    <p>
+      An item of an enumeration in a general sense - actual <tt>enum</tt>
+      value, or a static field in a class.
+    </p>
+    
+  <dl><dt class="field"><b>libraryUri: String</b></dt><dd>
+        
+        <p>
+          The URI of the library containing the <tt>className</tt>. When the
+          enum item is passed back, this will allow the server to import the
+          corresponding library if necessary.
+        </p>
+      </dd><dt class="field"><b>className: String</b></dt><dd>
+        
+        <p>
+          The name of the class or enum.
+        </p>
+      </dd><dt class="field"><b>name: String</b></dt><dd>
+        
+        <p>
+          The name of the field in the enumeration, or the static field in the
+          class.
+        </p>
+      </dd><dt class="field"><b>documentation: String<span style="color:#999999"> (optional)</span></b></dt><dd>
+        
+        <p>
+          The documentation to show to the user. Omitted if the server does not
+          know the documentation, e.g. because the corresponding field is not
+          documented.
+        </p>
+      </dd></dl></dd><dt class="typeDefinition"><a name="type_FoldingKind">FoldingKind: String</a></dt><dd>
     <p>
       An enumeration of the kinds of folding regions.
     </p>
@@ -4685,6 +5139,24 @@
           an analysis root, or the requested operation is not available
           for the file.
         </p>
+      </dd><dt class="value">FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET</dt><dd>
+        
+        <p>
+          The given location does not have a supported widget.
+        </p>
+      </dd><dt class="value">FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID</dt><dd>
+        
+        <p>
+          The given property identifier is not valid. It might have never been
+          valid, or a change to code invalidated it, or its TTL was exceeded.
+        </p>
+      </dd><dt class="value">FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED</dt><dd>
+        
+        <p>
+          The value of the property cannot be removed, for example because
+          the corresponding constructor argument is required, and the server
+          does not know what default value to use.
+        </p>
       </dd><dt class="value">FORMAT_INVALID_FILE</dt><dd>
         
         <p>
@@ -5536,7 +6008,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.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.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><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_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_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></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.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_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_generated.dart b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
index a245b14..81f5ff2 100644
--- a/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/lsp_protocol/protocol_generated.dart
@@ -2221,8 +2221,6 @@
   /// completion item with an `insertText` of `console` is provided it will only
   /// insert `sole`. Therefore it is recommended to use `textEdit` instead since
   /// it avoids additional client side interpretation.
-  ///  @deprecated Use textEdit instead.
-  @core.deprecated
   final String insertText;
 
   /// The format of the insert text. The format applies to both the `insertText`
@@ -6357,18 +6355,18 @@
   /// executed.
   static const Abort = const FailureHandlingKind._('abort');
 
-  /// All operations are executed transactional. That means they either all
+  /// All operations are executed transactionally. That means they either all
   /// succeed or no changes at all are applied to the workspace.
   static const Transactional = const FailureHandlingKind._('transactional');
 
   /// If the workspace edit contains only textual file changes they are executed
-  /// transactional. If resource changes (create, rename or delete file) are
+  /// transactionally. If resource changes (create, rename or delete file) are
   /// part of the change the failure handling strategy is abort.
   static const TextOnlyTransactional =
       const FailureHandlingKind._('textOnlyTransactional');
 
   /// The client tries to undo the operations already executed. But there is no
-  /// guarantee that this is succeeding.
+  /// guarantee that this succeeds.
   static const Undo = const FailureHandlingKind._('undo');
 
   Object toJson() => _value;
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 fb3c5ec..499c925 100644
--- a/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
+++ b/pkg/analysis_server/lib/plugin/edit/fix/fix_dart.dart
@@ -3,6 +3,7 @@
 // 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/correction/fix/dart/top_level_declarations.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 
@@ -21,4 +22,10 @@
    * 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);
 }
diff --git a/pkg/analysis_server/lib/protocol/protocol_constants.dart b/pkg/analysis_server/lib/protocol/protocol_constants.dart
index 2d93ddb..f51b81c 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.27.1';
+const String PROTOCOL_VERSION = '1.27.2';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -168,6 +168,8 @@
 const String EDIT_REQUEST_DARTFIX_EXCLUDED_FIXES = 'excludedFixes';
 const String EDIT_REQUEST_DARTFIX_INCLUDED = 'included';
 const String EDIT_REQUEST_DARTFIX_INCLUDED_FIXES = 'includedFixes';
+const String EDIT_REQUEST_DARTFIX_INCLUDE_PEDANTIC_FIXES =
+    'includePedanticFixes';
 const String EDIT_REQUEST_DARTFIX_INCLUDE_REQUIRED_FIXES =
     'includeRequiredFixes';
 const String EDIT_REQUEST_FORMAT = 'edit.format';
@@ -276,20 +278,19 @@
 const String EXECUTION_RESPONSE_MAP_URI_URI = 'uri';
 const String FLUTTER_NOTIFICATION_OUTLINE = 'flutter.outline';
 const String FLUTTER_NOTIFICATION_OUTLINE_FILE = 'file';
-const String FLUTTER_NOTIFICATION_OUTLINE_INSTRUMENTED_CODE =
-    'instrumentedCode';
 const String FLUTTER_NOTIFICATION_OUTLINE_OUTLINE = 'outline';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR =
-    'flutter.getChangeAddForDesignTimeConstructor';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_FILE =
-    'file';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_OFFSET =
-    'offset';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION =
+    'flutter.getWidgetDescription';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION_FILE = 'file';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION_OFFSET = 'offset';
 const String FLUTTER_REQUEST_SET_SUBSCRIPTIONS = 'flutter.setSubscriptions';
 const String FLUTTER_REQUEST_SET_SUBSCRIPTIONS_SUBSCRIPTIONS = 'subscriptions';
-const String
-    FLUTTER_RESPONSE_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_CHANGE =
-    'change';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE =
+    'flutter.setWidgetPropertyValue';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE_ID = 'id';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE_VALUE = 'value';
+const String FLUTTER_RESPONSE_GET_WIDGET_DESCRIPTION_PROPERTIES = 'properties';
+const String FLUTTER_RESPONSE_SET_WIDGET_PROPERTY_VALUE_CHANGE = 'change';
 const String KYTHE_REQUEST_GET_KYTHE_ENTRIES = 'kythe.getKytheEntries';
 const String KYTHE_REQUEST_GET_KYTHE_ENTRIES_FILE = 'file';
 const String KYTHE_RESPONSE_GET_KYTHE_ENTRIES_ENTRIES = 'entries';
diff --git a/pkg/analysis_server/lib/protocol/protocol_generated.dart b/pkg/analysis_server/lib/protocol/protocol_generated.dart
index 45a219f..084ca7e 100644
--- a/pkg/analysis_server/lib/protocol/protocol_generated.dart
+++ b/pkg/analysis_server/lib/protocol/protocol_generated.dart
@@ -8023,6 +8023,7 @@
  * {
  *   "included": List<FilePath>
  *   "includedFixes": optional List<String>
+ *   "includePedanticFixes": optional bool
  *   "includeRequiredFixes": optional bool
  *   "excludedFixes": optional List<String>
  * }
@@ -8034,6 +8035,8 @@
 
   List<String> _includedFixes;
 
+  bool _includePedanticFixes;
+
   bool _includeRequiredFixes;
 
   List<String> _excludedFixes;
@@ -8084,6 +8087,18 @@
   }
 
   /**
+   * A flag indicating that "pedantic" fixes should be applied.
+   */
+  bool get includePedanticFixes => _includePedanticFixes;
+
+  /**
+   * A flag indicating that "pedantic" fixes should be applied.
+   */
+  void set includePedanticFixes(bool value) {
+    this._includePedanticFixes = value;
+  }
+
+  /**
    * A flag indicating that "required" fixes should be applied.
    */
   bool get includeRequiredFixes => _includeRequiredFixes;
@@ -8115,10 +8130,12 @@
 
   EditDartfixParams(List<String> included,
       {List<String> includedFixes,
+      bool includePedanticFixes,
       bool includeRequiredFixes,
       List<String> excludedFixes}) {
     this.included = included;
     this.includedFixes = includedFixes;
+    this.includePedanticFixes = includePedanticFixes;
     this.includeRequiredFixes = includeRequiredFixes;
     this.excludedFixes = excludedFixes;
   }
@@ -8141,6 +8158,11 @@
         includedFixes = jsonDecoder.decodeList(jsonPath + ".includedFixes",
             json["includedFixes"], jsonDecoder.decodeString);
       }
+      bool includePedanticFixes;
+      if (json.containsKey("includePedanticFixes")) {
+        includePedanticFixes = jsonDecoder.decodeBool(
+            jsonPath + ".includePedanticFixes", json["includePedanticFixes"]);
+      }
       bool includeRequiredFixes;
       if (json.containsKey("includeRequiredFixes")) {
         includeRequiredFixes = jsonDecoder.decodeBool(
@@ -8153,6 +8175,7 @@
       }
       return new EditDartfixParams(included,
           includedFixes: includedFixes,
+          includePedanticFixes: includePedanticFixes,
           includeRequiredFixes: includeRequiredFixes,
           excludedFixes: excludedFixes);
     } else {
@@ -8172,6 +8195,9 @@
     if (includedFixes != null) {
       result["includedFixes"] = includedFixes;
     }
+    if (includePedanticFixes != null) {
+      result["includePedanticFixes"] = includePedanticFixes;
+    }
     if (includeRequiredFixes != null) {
       result["includeRequiredFixes"] = includeRequiredFixes;
     }
@@ -8196,6 +8222,7 @@
               included, other.included, (String a, String b) => a == b) &&
           listEqual(includedFixes, other.includedFixes,
               (String a, String b) => a == b) &&
+          includePedanticFixes == other.includePedanticFixes &&
           includeRequiredFixes == other.includeRequiredFixes &&
           listEqual(excludedFixes, other.excludedFixes,
               (String a, String b) => a == b);
@@ -8208,6 +8235,7 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, included.hashCode);
     hash = JenkinsSmiHash.combine(hash, includedFixes.hashCode);
+    hash = JenkinsSmiHash.combine(hash, includePedanticFixes.hashCode);
     hash = JenkinsSmiHash.combine(hash, includeRequiredFixes.hashCode);
     hash = JenkinsSmiHash.combine(hash, excludedFixes.hashCode);
     return JenkinsSmiHash.finish(hash);
@@ -14444,7 +14472,7 @@
 }
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor params
+ * flutter.getWidgetDescription params
  *
  * {
  *   "file": FilePath
@@ -14453,19 +14481,18 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-class FlutterGetChangeAddForDesignTimeConstructorParams
-    implements RequestParams {
+class FlutterGetWidgetDescriptionParams implements RequestParams {
   String _file;
 
   int _offset;
 
   /**
-   * The file containing the code of the class.
+   * The file where the widget instance is created.
    */
   String get file => _file;
 
   /**
-   * The file containing the code of the class.
+   * The file where the widget instance is created.
    */
   void set file(String value) {
     assert(value != null);
@@ -14473,24 +14500,24 @@
   }
 
   /**
-   * The offset of the class in the code.
+   * The offset in the file where the widget instance is created.
    */
   int get offset => _offset;
 
   /**
-   * The offset of the class in the code.
+   * The offset in the file where the widget instance is created.
    */
   void set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
 
-  FlutterGetChangeAddForDesignTimeConstructorParams(String file, int offset) {
+  FlutterGetWidgetDescriptionParams(String file, int offset) {
     this.file = file;
     this.offset = offset;
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorParams.fromJson(
+  factory FlutterGetWidgetDescriptionParams.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
       json = {};
@@ -14508,17 +14535,15 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "offset");
       }
-      return new FlutterGetChangeAddForDesignTimeConstructorParams(
-          file, offset);
+      return new FlutterGetWidgetDescriptionParams(file, offset);
     } else {
-      throw jsonDecoder.mismatch(jsonPath,
-          "flutter.getChangeAddForDesignTimeConstructor params", json);
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.getWidgetDescription params", json);
     }
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorParams.fromRequest(
-      Request request) {
-    return new FlutterGetChangeAddForDesignTimeConstructorParams.fromJson(
+  factory FlutterGetWidgetDescriptionParams.fromRequest(Request request) {
+    return new FlutterGetWidgetDescriptionParams.fromJson(
         new RequestDecoder(request), "params", request.params);
   }
 
@@ -14532,8 +14557,7 @@
 
   @override
   Request toRequest(String id) {
-    return new Request(
-        id, "flutter.getChangeAddForDesignTimeConstructor", toJson());
+    return new Request(id, "flutter.getWidgetDescription", toJson());
   }
 
   @override
@@ -14541,7 +14565,7 @@
 
   @override
   bool operator ==(other) {
-    if (other is FlutterGetChangeAddForDesignTimeConstructorParams) {
+    if (other is FlutterGetWidgetDescriptionParams) {
       return file == other.file && offset == other.offset;
     }
     return false;
@@ -14557,60 +14581,66 @@
 }
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor result
+ * flutter.getWidgetDescription result
  *
  * {
- *   "change": SourceChange
+ *   "properties": List<FlutterWidgetProperty>
  * }
  *
  * Clients may not extend, implement or mix-in this class.
  */
-class FlutterGetChangeAddForDesignTimeConstructorResult
-    implements ResponseResult {
-  SourceChange _change;
+class FlutterGetWidgetDescriptionResult implements ResponseResult {
+  List<FlutterWidgetProperty> _properties;
 
   /**
-   * The change that adds the forDesignTime() constructor. If the change cannot
-   * be produced, an error is returned.
+   * The list of properties of the widget. Some of the properties might be read
+   * only, when their editor is not set. This might be because they have type
+   * that we don't know how to edit, or for compound properties that work as
+   * containers for sub-properties.
    */
-  SourceChange get change => _change;
+  List<FlutterWidgetProperty> get properties => _properties;
 
   /**
-   * The change that adds the forDesignTime() constructor. If the change cannot
-   * be produced, an error is returned.
+   * The list of properties of the widget. Some of the properties might be read
+   * only, when their editor is not set. This might be because they have type
+   * that we don't know how to edit, or for compound properties that work as
+   * containers for sub-properties.
    */
-  void set change(SourceChange value) {
+  void set properties(List<FlutterWidgetProperty> value) {
     assert(value != null);
-    this._change = value;
+    this._properties = value;
   }
 
-  FlutterGetChangeAddForDesignTimeConstructorResult(SourceChange change) {
-    this.change = change;
+  FlutterGetWidgetDescriptionResult(List<FlutterWidgetProperty> properties) {
+    this.properties = properties;
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorResult.fromJson(
+  factory FlutterGetWidgetDescriptionResult.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
       json = {};
     }
     if (json is Map) {
-      SourceChange change;
-      if (json.containsKey("change")) {
-        change = new SourceChange.fromJson(
-            jsonDecoder, jsonPath + ".change", json["change"]);
+      List<FlutterWidgetProperty> properties;
+      if (json.containsKey("properties")) {
+        properties = jsonDecoder.decodeList(
+            jsonPath + ".properties",
+            json["properties"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetProperty.fromJson(
+                    jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "change");
+        throw jsonDecoder.mismatch(jsonPath, "properties");
       }
-      return new FlutterGetChangeAddForDesignTimeConstructorResult(change);
+      return new FlutterGetWidgetDescriptionResult(properties);
     } else {
-      throw jsonDecoder.mismatch(jsonPath,
-          "flutter.getChangeAddForDesignTimeConstructor result", json);
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.getWidgetDescription result", json);
     }
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorResult.fromResponse(
-      Response response) {
-    return new FlutterGetChangeAddForDesignTimeConstructorResult.fromJson(
+  factory FlutterGetWidgetDescriptionResult.fromResponse(Response response) {
+    return new FlutterGetWidgetDescriptionResult.fromJson(
         new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
         "result",
         response.result);
@@ -14619,7 +14649,9 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["change"] = change.toJson();
+    result["properties"] = properties
+        .map((FlutterWidgetProperty value) => value.toJson())
+        .toList();
     return result;
   }
 
@@ -14633,8 +14665,9 @@
 
   @override
   bool operator ==(other) {
-    if (other is FlutterGetChangeAddForDesignTimeConstructorResult) {
-      return change == other.change;
+    if (other is FlutterGetWidgetDescriptionResult) {
+      return listEqual(properties, other.properties,
+          (FlutterWidgetProperty a, FlutterWidgetProperty b) => a == b);
     }
     return false;
   }
@@ -14642,7 +14675,7 @@
   @override
   int get hashCode {
     int hash = 0;
-    hash = JenkinsSmiHash.combine(hash, change.hashCode);
+    hash = JenkinsSmiHash.combine(hash, properties.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -14663,12 +14696,6 @@
  *   "parentAssociationLabel": optional String
  *   "variableName": optional String
  *   "children": optional List<FlutterOutline>
- *   "id": optional int
- *   "isWidgetClass": optional bool
- *   "renderConstructor": optional String
- *   "stateClassName": optional String
- *   "stateOffset": optional int
- *   "stateLength": optional int
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -14698,18 +14725,6 @@
 
   List<FlutterOutline> _children;
 
-  int _id;
-
-  bool _isWidgetClass;
-
-  String _renderConstructor;
-
-  String _stateClassName;
-
-  int _stateOffset;
-
-  int _stateLength;
-
   /**
    * The kind of the node.
    */
@@ -14881,102 +14896,6 @@
     this._children = value;
   }
 
-  /**
-   * If the node is a widget, and it is instrumented, the unique identifier of
-   * this widget, that can be used to associate rendering information with this
-   * node.
-   */
-  int get id => _id;
-
-  /**
-   * If the node is a widget, and it is instrumented, the unique identifier of
-   * this widget, that can be used to associate rendering information with this
-   * node.
-   */
-  void set id(int value) {
-    this._id = value;
-  }
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered,
-   * even if it does not yet have the rendering constructor. This field is
-   * omitted if the node is not a widget class.
-   */
-  bool get isWidgetClass => _isWidgetClass;
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered,
-   * even if it does not yet have the rendering constructor. This field is
-   * omitted if the node is not a widget class.
-   */
-  void set isWidgetClass(bool value) {
-    this._isWidgetClass = value;
-  }
-
-  /**
-   * If the node is a widget class that can be rendered for IDE, the name of
-   * the constructor that should be used to instantiate the widget. Empty
-   * string for default constructor. Absent if the node is not a widget class
-   * that can be rendered.
-   */
-  String get renderConstructor => _renderConstructor;
-
-  /**
-   * If the node is a widget class that can be rendered for IDE, the name of
-   * the constructor that should be used to instantiate the widget. Empty
-   * string for default constructor. Absent if the node is not a widget class
-   * that can be rendered.
-   */
-  void set renderConstructor(String value) {
-    this._renderConstructor = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the
-   * same file, the name of the state class.
-   */
-  String get stateClassName => _stateClassName;
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the
-   * same file, the name of the state class.
-   */
-  void set stateClassName(String value) {
-    this._stateClassName = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the offset of the state class code in the
-   * file.
-   */
-  int get stateOffset => _stateOffset;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the offset of the state class code in the
-   * file.
-   */
-  void set stateOffset(int value) {
-    this._stateOffset = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the length of the state class code in the
-   * file.
-   */
-  int get stateLength => _stateLength;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the length of the state class code in the
-   * file.
-   */
-  void set stateLength(int value) {
-    this._stateLength = value;
-  }
-
   FlutterOutline(FlutterOutlineKind kind, int offset, int length,
       int codeOffset, int codeLength,
       {String label,
@@ -14985,13 +14904,7 @@
       String className,
       String parentAssociationLabel,
       String variableName,
-      List<FlutterOutline> children,
-      int id,
-      bool isWidgetClass,
-      String renderConstructor,
-      String stateClassName,
-      int stateOffset,
-      int stateLength}) {
+      List<FlutterOutline> children}) {
     this.kind = kind;
     this.offset = offset;
     this.length = length;
@@ -15004,12 +14917,6 @@
     this.parentAssociationLabel = parentAssociationLabel;
     this.variableName = variableName;
     this.children = children;
-    this.id = id;
-    this.isWidgetClass = isWidgetClass;
-    this.renderConstructor = renderConstructor;
-    this.stateClassName = stateClassName;
-    this.stateOffset = stateOffset;
-    this.stateLength = stateLength;
   }
 
   factory FlutterOutline.fromJson(
@@ -15093,35 +15000,6 @@
             (String jsonPath, Object json) =>
                 new FlutterOutline.fromJson(jsonDecoder, jsonPath, json));
       }
-      int id;
-      if (json.containsKey("id")) {
-        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
-      }
-      bool isWidgetClass;
-      if (json.containsKey("isWidgetClass")) {
-        isWidgetClass = jsonDecoder.decodeBool(
-            jsonPath + ".isWidgetClass", json["isWidgetClass"]);
-      }
-      String renderConstructor;
-      if (json.containsKey("renderConstructor")) {
-        renderConstructor = jsonDecoder.decodeString(
-            jsonPath + ".renderConstructor", json["renderConstructor"]);
-      }
-      String stateClassName;
-      if (json.containsKey("stateClassName")) {
-        stateClassName = jsonDecoder.decodeString(
-            jsonPath + ".stateClassName", json["stateClassName"]);
-      }
-      int stateOffset;
-      if (json.containsKey("stateOffset")) {
-        stateOffset = jsonDecoder.decodeInt(
-            jsonPath + ".stateOffset", json["stateOffset"]);
-      }
-      int stateLength;
-      if (json.containsKey("stateLength")) {
-        stateLength = jsonDecoder.decodeInt(
-            jsonPath + ".stateLength", json["stateLength"]);
-      }
       return new FlutterOutline(kind, offset, length, codeOffset, codeLength,
           label: label,
           dartElement: dartElement,
@@ -15129,13 +15007,7 @@
           className: className,
           parentAssociationLabel: parentAssociationLabel,
           variableName: variableName,
-          children: children,
-          id: id,
-          isWidgetClass: isWidgetClass,
-          renderConstructor: renderConstructor,
-          stateClassName: stateClassName,
-          stateOffset: stateOffset,
-          stateLength: stateLength);
+          children: children);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "FlutterOutline", json);
     }
@@ -15173,24 +15045,6 @@
       result["children"] =
           children.map((FlutterOutline value) => value.toJson()).toList();
     }
-    if (id != null) {
-      result["id"] = id;
-    }
-    if (isWidgetClass != null) {
-      result["isWidgetClass"] = isWidgetClass;
-    }
-    if (renderConstructor != null) {
-      result["renderConstructor"] = renderConstructor;
-    }
-    if (stateClassName != null) {
-      result["stateClassName"] = stateClassName;
-    }
-    if (stateOffset != null) {
-      result["stateOffset"] = stateOffset;
-    }
-    if (stateLength != null) {
-      result["stateLength"] = stateLength;
-    }
     return result;
   }
 
@@ -15216,13 +15070,7 @@
           parentAssociationLabel == other.parentAssociationLabel &&
           variableName == other.variableName &&
           listEqual(children, other.children,
-              (FlutterOutline a, FlutterOutline b) => a == b) &&
-          id == other.id &&
-          isWidgetClass == other.isWidgetClass &&
-          renderConstructor == other.renderConstructor &&
-          stateClassName == other.stateClassName &&
-          stateOffset == other.stateOffset &&
-          stateLength == other.stateLength;
+              (FlutterOutline a, FlutterOutline b) => a == b);
     }
     return false;
   }
@@ -15242,12 +15090,6 @@
     hash = JenkinsSmiHash.combine(hash, parentAssociationLabel.hashCode);
     hash = JenkinsSmiHash.combine(hash, variableName.hashCode);
     hash = JenkinsSmiHash.combine(hash, children.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, isWidgetClass.hashCode);
-    hash = JenkinsSmiHash.combine(hash, renderConstructor.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateClassName.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateOffset.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateLength.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15261,6 +15103,8 @@
  *   "literalValueBoolean": optional bool
  *   "literalValueInteger": optional int
  *   "literalValueString": optional String
+ *   "nameLocation": optional Location
+ *   "valueLocation": optional Location
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -15276,6 +15120,10 @@
 
   String _literalValueString;
 
+  Location _nameLocation;
+
+  Location _valueLocation;
+
   /**
    * The name of the attribute.
    */
@@ -15346,15 +15194,51 @@
     this._literalValueString = value;
   }
 
+  /**
+   * If the attribute is a named argument, the location of the name, without
+   * the colon.
+   */
+  Location get nameLocation => _nameLocation;
+
+  /**
+   * If the attribute is a named argument, the location of the name, without
+   * the colon.
+   */
+  void set nameLocation(Location value) {
+    this._nameLocation = value;
+  }
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward
+   * compatibility between new clients with older servers.
+   */
+  Location get valueLocation => _valueLocation;
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward
+   * compatibility between new clients with older servers.
+   */
+  void set valueLocation(Location value) {
+    this._valueLocation = value;
+  }
+
   FlutterOutlineAttribute(String name, String label,
       {bool literalValueBoolean,
       int literalValueInteger,
-      String literalValueString}) {
+      String literalValueString,
+      Location nameLocation,
+      Location valueLocation}) {
     this.name = name;
     this.label = label;
     this.literalValueBoolean = literalValueBoolean;
     this.literalValueInteger = literalValueInteger;
     this.literalValueString = literalValueString;
+    this.nameLocation = nameLocation;
+    this.valueLocation = valueLocation;
   }
 
   factory FlutterOutlineAttribute.fromJson(
@@ -15390,10 +15274,22 @@
         literalValueString = jsonDecoder.decodeString(
             jsonPath + ".literalValueString", json["literalValueString"]);
       }
+      Location nameLocation;
+      if (json.containsKey("nameLocation")) {
+        nameLocation = new Location.fromJson(
+            jsonDecoder, jsonPath + ".nameLocation", json["nameLocation"]);
+      }
+      Location valueLocation;
+      if (json.containsKey("valueLocation")) {
+        valueLocation = new Location.fromJson(
+            jsonDecoder, jsonPath + ".valueLocation", json["valueLocation"]);
+      }
       return new FlutterOutlineAttribute(name, label,
           literalValueBoolean: literalValueBoolean,
           literalValueInteger: literalValueInteger,
-          literalValueString: literalValueString);
+          literalValueString: literalValueString,
+          nameLocation: nameLocation,
+          valueLocation: valueLocation);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "FlutterOutlineAttribute", json);
     }
@@ -15413,6 +15309,12 @@
     if (literalValueString != null) {
       result["literalValueString"] = literalValueString;
     }
+    if (nameLocation != null) {
+      result["nameLocation"] = nameLocation.toJson();
+    }
+    if (valueLocation != null) {
+      result["valueLocation"] = valueLocation.toJson();
+    }
     return result;
   }
 
@@ -15426,7 +15328,9 @@
           label == other.label &&
           literalValueBoolean == other.literalValueBoolean &&
           literalValueInteger == other.literalValueInteger &&
-          literalValueString == other.literalValueString;
+          literalValueString == other.literalValueString &&
+          nameLocation == other.nameLocation &&
+          valueLocation == other.valueLocation;
     }
     return false;
   }
@@ -15439,6 +15343,8 @@
     hash = JenkinsSmiHash.combine(hash, literalValueBoolean.hashCode);
     hash = JenkinsSmiHash.combine(hash, literalValueInteger.hashCode);
     hash = JenkinsSmiHash.combine(hash, literalValueString.hashCode);
+    hash = JenkinsSmiHash.combine(hash, nameLocation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, valueLocation.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15555,7 +15461,6 @@
  * {
  *   "file": FilePath
  *   "outline": FlutterOutline
- *   "instrumentedCode": optional String
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -15565,8 +15470,6 @@
 
   FlutterOutline _outline;
 
-  String _instrumentedCode;
-
   /**
    * The file with which the outline is associated.
    */
@@ -15593,29 +15496,9 @@
     this._outline = value;
   }
 
-  /**
-   * If the file has Flutter widgets that can be rendered, this field has the
-   * instrumented content of the file, that allows associating widgets with
-   * corresponding outline nodes. If there are no widgets to render, this field
-   * is absent.
-   */
-  String get instrumentedCode => _instrumentedCode;
-
-  /**
-   * If the file has Flutter widgets that can be rendered, this field has the
-   * instrumented content of the file, that allows associating widgets with
-   * corresponding outline nodes. If there are no widgets to render, this field
-   * is absent.
-   */
-  void set instrumentedCode(String value) {
-    this._instrumentedCode = value;
-  }
-
-  FlutterOutlineParams(String file, FlutterOutline outline,
-      {String instrumentedCode}) {
+  FlutterOutlineParams(String file, FlutterOutline outline) {
     this.file = file;
     this.outline = outline;
-    this.instrumentedCode = instrumentedCode;
   }
 
   factory FlutterOutlineParams.fromJson(
@@ -15637,13 +15520,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "outline");
       }
-      String instrumentedCode;
-      if (json.containsKey("instrumentedCode")) {
-        instrumentedCode = jsonDecoder.decodeString(
-            jsonPath + ".instrumentedCode", json["instrumentedCode"]);
-      }
-      return new FlutterOutlineParams(file, outline,
-          instrumentedCode: instrumentedCode);
+      return new FlutterOutlineParams(file, outline);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "flutter.outline params", json);
     }
@@ -15659,9 +15536,6 @@
     Map<String, dynamic> result = {};
     result["file"] = file;
     result["outline"] = outline.toJson();
-    if (instrumentedCode != null) {
-      result["instrumentedCode"] = instrumentedCode;
-    }
     return result;
   }
 
@@ -15675,9 +15549,7 @@
   @override
   bool operator ==(other) {
     if (other is FlutterOutlineParams) {
-      return file == other.file &&
-          outline == other.outline &&
-          instrumentedCode == other.instrumentedCode;
+      return file == other.file && outline == other.outline;
     }
     return false;
   }
@@ -15687,7 +15559,6 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, file.hashCode);
     hash = JenkinsSmiHash.combine(hash, outline.hashCode);
-    hash = JenkinsSmiHash.combine(hash, instrumentedCode.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15866,6 +15737,1110 @@
 }
 
 /**
+ * flutter.setWidgetPropertyValue params
+ *
+ * {
+ *   "id": int
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterSetWidgetPropertyValueParams implements RequestParams {
+  int _id;
+
+  FlutterWidgetPropertyValue _value;
+
+  /**
+   * The identifier of the property, previously returned as a part of a
+   * FlutterWidgetProperty.
+   *
+   * An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is generated
+   * if the identifier is not valid.
+   */
+  int get id => _id;
+
+  /**
+   * The identifier of the property, previously returned as a part of a
+   * FlutterWidgetProperty.
+   *
+   * An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is generated
+   * if the identifier is not valid.
+   */
+  void set id(int value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  /**
+   * The new value to set for the property.
+   *
+   * If absent, indicates that the property should be removed. If the property
+   * corresponds to an optional parameter, the corresponding named argument is
+   * removed. If the property isRequired is true,
+   * FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
+   */
+  FlutterWidgetPropertyValue get value => _value;
+
+  /**
+   * The new value to set for the property.
+   *
+   * If absent, indicates that the property should be removed. If the property
+   * corresponds to an optional parameter, the corresponding named argument is
+   * removed. If the property isRequired is true,
+   * FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
+   */
+  void set value(FlutterWidgetPropertyValue value) {
+    this._value = value;
+  }
+
+  FlutterSetWidgetPropertyValueParams(int id,
+      {FlutterWidgetPropertyValue value}) {
+    this.id = id;
+    this.value = value;
+  }
+
+  factory FlutterSetWidgetPropertyValueParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "id");
+      }
+      FlutterWidgetPropertyValue value;
+      if (json.containsKey("value")) {
+        value = new FlutterWidgetPropertyValue.fromJson(
+            jsonDecoder, jsonPath + ".value", json["value"]);
+      }
+      return new FlutterSetWidgetPropertyValueParams(id, value: value);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.setWidgetPropertyValue params", json);
+    }
+  }
+
+  factory FlutterSetWidgetPropertyValueParams.fromRequest(Request request) {
+    return new FlutterSetWidgetPropertyValueParams.fromJson(
+        new RequestDecoder(request), "params", request.params);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    if (value != null) {
+      result["value"] = value.toJson();
+    }
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return new Request(id, "flutter.setWidgetPropertyValue", toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterSetWidgetPropertyValueParams) {
+      return id == other.id && value == other.value;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * flutter.setWidgetPropertyValue result
+ *
+ * {
+ *   "change": SourceChange
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterSetWidgetPropertyValueResult implements ResponseResult {
+  SourceChange _change;
+
+  /**
+   * The change that should be applied.
+   */
+  SourceChange get change => _change;
+
+  /**
+   * The change that should be applied.
+   */
+  void set change(SourceChange value) {
+    assert(value != null);
+    this._change = value;
+  }
+
+  FlutterSetWidgetPropertyValueResult(SourceChange change) {
+    this.change = change;
+  }
+
+  factory FlutterSetWidgetPropertyValueResult.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      SourceChange change;
+      if (json.containsKey("change")) {
+        change = new SourceChange.fromJson(
+            jsonDecoder, jsonPath + ".change", json["change"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "change");
+      }
+      return new FlutterSetWidgetPropertyValueResult(change);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.setWidgetPropertyValue result", json);
+    }
+  }
+
+  factory FlutterSetWidgetPropertyValueResult.fromResponse(Response response) {
+    return new FlutterSetWidgetPropertyValueResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
+        "result",
+        response.result);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["change"] = change.toJson();
+    return result;
+  }
+
+  @override
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterSetWidgetPropertyValueResult) {
+      return change == other.change;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, change.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetProperty
+ *
+ * {
+ *   "documentation": optional String
+ *   "expression": optional String
+ *   "id": int
+ *   "isRequired": bool
+ *   "isSafeToUpdate": bool
+ *   "name": String
+ *   "children": optional List<FlutterWidgetProperty>
+ *   "editor": optional FlutterWidgetPropertyEditor
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetProperty implements HasToJson {
+  String _documentation;
+
+  String _expression;
+
+  int _id;
+
+  bool _isRequired;
+
+  bool _isSafeToUpdate;
+
+  String _name;
+
+  List<FlutterWidgetProperty> _children;
+
+  FlutterWidgetPropertyEditor _editor;
+
+  FlutterWidgetPropertyValue _value;
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the
+   * server does not know the documentation, e.g. because the corresponding
+   * field is not documented.
+   */
+  String get documentation => _documentation;
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the
+   * server does not know the documentation, e.g. because the corresponding
+   * field is not documented.
+   */
+  void set documentation(String value) {
+    this._documentation = value;
+  }
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of
+   * this property.
+   */
+  String get expression => _expression;
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of
+   * this property.
+   */
+  void set expression(String value) {
+    this._expression = value;
+  }
+
+  /**
+   * The unique identifier of the property, must be passed back to the server
+   * when updating the property value. Identifiers become invalid on any source
+   * code change.
+   */
+  int get id => _id;
+
+  /**
+   * The unique identifier of the property, must be passed back to the server
+   * when updating the property value. Identifiers become invalid on any source
+   * code change.
+   */
+  void set id(int value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a
+   * required parameter of a constructor.
+   */
+  bool get isRequired => _isRequired;
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a
+   * required parameter of a constructor.
+   */
+  void set isRequired(bool value) {
+    assert(value != null);
+    this._isRequired = value;
+  }
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum
+   * constant), then it is safe to replace the expression with another concrete
+   * value. In this case this field is true. Otherwise, for example when the
+   * expression is a reference to a field, so that its value is provided from
+   * outside, this field is false.
+   */
+  bool get isSafeToUpdate => _isSafeToUpdate;
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum
+   * constant), then it is safe to replace the expression with another concrete
+   * value. In this case this field is true. Otherwise, for example when the
+   * expression is a reference to a field, so that its value is provided from
+   * outside, this field is false.
+   */
+  void set isSafeToUpdate(bool value) {
+    assert(value != null);
+    this._isSafeToUpdate = value;
+  }
+
+  /**
+   * The name of the property to display to the user.
+   */
+  String get name => _name;
+
+  /**
+   * The name of the property to display to the user.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  /**
+   * The list of children properties, if any. For example any property of type
+   * EdgeInsets will have four children properties of type double - left / top
+   * / right / bottom.
+   */
+  List<FlutterWidgetProperty> get children => _children;
+
+  /**
+   * The list of children properties, if any. For example any property of type
+   * EdgeInsets will have four children properties of type double - left / top
+   * / right / bottom.
+   */
+  void set children(List<FlutterWidgetProperty> value) {
+    this._children = value;
+  }
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the
+   * server does not know the editor for this property, for example because it
+   * does not have one of the supported types.
+   */
+  FlutterWidgetPropertyEditor get editor => _editor;
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the
+   * server does not know the editor for this property, for example because it
+   * does not have one of the supported types.
+   */
+  void set editor(FlutterWidgetPropertyEditor value) {
+    this._editor = value;
+  }
+
+  /**
+   * If the expression is set, and the server knows the value of the
+   * expression, this field is set.
+   */
+  FlutterWidgetPropertyValue get value => _value;
+
+  /**
+   * If the expression is set, and the server knows the value of the
+   * expression, this field is set.
+   */
+  void set value(FlutterWidgetPropertyValue value) {
+    this._value = value;
+  }
+
+  FlutterWidgetProperty(
+      int id, bool isRequired, bool isSafeToUpdate, String name,
+      {String documentation,
+      String expression,
+      List<FlutterWidgetProperty> children,
+      FlutterWidgetPropertyEditor editor,
+      FlutterWidgetPropertyValue value}) {
+    this.documentation = documentation;
+    this.expression = expression;
+    this.id = id;
+    this.isRequired = isRequired;
+    this.isSafeToUpdate = isSafeToUpdate;
+    this.name = name;
+    this.children = children;
+    this.editor = editor;
+    this.value = value;
+  }
+
+  factory FlutterWidgetProperty.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String documentation;
+      if (json.containsKey("documentation")) {
+        documentation = jsonDecoder.decodeString(
+            jsonPath + ".documentation", json["documentation"]);
+      }
+      String expression;
+      if (json.containsKey("expression")) {
+        expression = jsonDecoder.decodeString(
+            jsonPath + ".expression", json["expression"]);
+      }
+      int id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "id");
+      }
+      bool isRequired;
+      if (json.containsKey("isRequired")) {
+        isRequired = jsonDecoder.decodeBool(
+            jsonPath + ".isRequired", json["isRequired"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "isRequired");
+      }
+      bool isSafeToUpdate;
+      if (json.containsKey("isSafeToUpdate")) {
+        isSafeToUpdate = jsonDecoder.decodeBool(
+            jsonPath + ".isSafeToUpdate", json["isSafeToUpdate"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "isSafeToUpdate");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "name");
+      }
+      List<FlutterWidgetProperty> children;
+      if (json.containsKey("children")) {
+        children = jsonDecoder.decodeList(
+            jsonPath + ".children",
+            json["children"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetProperty.fromJson(
+                    jsonDecoder, jsonPath, json));
+      }
+      FlutterWidgetPropertyEditor editor;
+      if (json.containsKey("editor")) {
+        editor = new FlutterWidgetPropertyEditor.fromJson(
+            jsonDecoder, jsonPath + ".editor", json["editor"]);
+      }
+      FlutterWidgetPropertyValue value;
+      if (json.containsKey("value")) {
+        value = new FlutterWidgetPropertyValue.fromJson(
+            jsonDecoder, jsonPath + ".value", json["value"]);
+      }
+      return new FlutterWidgetProperty(id, isRequired, isSafeToUpdate, name,
+          documentation: documentation,
+          expression: expression,
+          children: children,
+          editor: editor,
+          value: value);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetProperty", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (documentation != null) {
+      result["documentation"] = documentation;
+    }
+    if (expression != null) {
+      result["expression"] = expression;
+    }
+    result["id"] = id;
+    result["isRequired"] = isRequired;
+    result["isSafeToUpdate"] = isSafeToUpdate;
+    result["name"] = name;
+    if (children != null) {
+      result["children"] = children
+          .map((FlutterWidgetProperty value) => value.toJson())
+          .toList();
+    }
+    if (editor != null) {
+      result["editor"] = editor.toJson();
+    }
+    if (value != null) {
+      result["value"] = value.toJson();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetProperty) {
+      return documentation == other.documentation &&
+          expression == other.expression &&
+          id == other.id &&
+          isRequired == other.isRequired &&
+          isSafeToUpdate == other.isSafeToUpdate &&
+          name == other.name &&
+          listEqual(children, other.children,
+              (FlutterWidgetProperty a, FlutterWidgetProperty b) => a == b) &&
+          editor == other.editor &&
+          value == other.value;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, expression.hashCode);
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, isRequired.hashCode);
+    hash = JenkinsSmiHash.combine(hash, isSafeToUpdate.hashCode);
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, children.hashCode);
+    hash = JenkinsSmiHash.combine(hash, editor.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyEditor
+ *
+ * {
+ *   "kind": FlutterWidgetPropertyEditorKind
+ *   "enumItems": optional List<FlutterWidgetPropertyValueEnumItem>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyEditor implements HasToJson {
+  FlutterWidgetPropertyEditorKind _kind;
+
+  List<FlutterWidgetPropertyValueEnumItem> _enumItems;
+
+  FlutterWidgetPropertyEditorKind get kind => _kind;
+
+  void set kind(FlutterWidgetPropertyEditorKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
+
+  List<FlutterWidgetPropertyValueEnumItem> get enumItems => _enumItems;
+
+  void set enumItems(List<FlutterWidgetPropertyValueEnumItem> value) {
+    this._enumItems = value;
+  }
+
+  FlutterWidgetPropertyEditor(FlutterWidgetPropertyEditorKind kind,
+      {List<FlutterWidgetPropertyValueEnumItem> enumItems}) {
+    this.kind = kind;
+    this.enumItems = enumItems;
+  }
+
+  factory FlutterWidgetPropertyEditor.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      FlutterWidgetPropertyEditorKind kind;
+      if (json.containsKey("kind")) {
+        kind = new FlutterWidgetPropertyEditorKind.fromJson(
+            jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "kind");
+      }
+      List<FlutterWidgetPropertyValueEnumItem> enumItems;
+      if (json.containsKey("enumItems")) {
+        enumItems = jsonDecoder.decodeList(
+            jsonPath + ".enumItems",
+            json["enumItems"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetPropertyValueEnumItem.fromJson(
+                    jsonDecoder, jsonPath, json));
+      }
+      return new FlutterWidgetPropertyEditor(kind, enumItems: enumItems);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetPropertyEditor", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    if (enumItems != null) {
+      result["enumItems"] = enumItems
+          .map((FlutterWidgetPropertyValueEnumItem value) => value.toJson())
+          .toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyEditor) {
+      return kind == other.kind &&
+          listEqual(
+              enumItems,
+              other.enumItems,
+              (FlutterWidgetPropertyValueEnumItem a,
+                      FlutterWidgetPropertyValueEnumItem b) =>
+                  a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, enumItems.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyEditorKind
+ *
+ * enum {
+ *   BOOL
+ *   DOUBLE
+ *   ENUM
+ *   ENUM_LIKE
+ *   INT
+ *   STRING
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyEditorKind implements Enum {
+  /**
+   * The editor for a property of type bool.
+   */
+  static const FlutterWidgetPropertyEditorKind BOOL =
+      const FlutterWidgetPropertyEditorKind._("BOOL");
+
+  /**
+   * The editor for a property of the type double.
+   */
+  static const FlutterWidgetPropertyEditorKind DOUBLE =
+      const FlutterWidgetPropertyEditorKind._("DOUBLE");
+
+  /**
+   * The editor for choosing an item of an enumeration, see the enumItems field
+   * of FlutterWidgetPropertyEditor.
+   */
+  static const FlutterWidgetPropertyEditorKind ENUM =
+      const FlutterWidgetPropertyEditorKind._("ENUM");
+
+  /**
+   * The editor for either choosing a pre-defined item from a list of provided
+   * static field references (like ENUM), or specifying a free-form expression.
+   */
+  static const FlutterWidgetPropertyEditorKind ENUM_LIKE =
+      const FlutterWidgetPropertyEditorKind._("ENUM_LIKE");
+
+  /**
+   * The editor for a property of type int.
+   */
+  static const FlutterWidgetPropertyEditorKind INT =
+      const FlutterWidgetPropertyEditorKind._("INT");
+
+  /**
+   * The editor for a property of the type String.
+   */
+  static const FlutterWidgetPropertyEditorKind STRING =
+      const FlutterWidgetPropertyEditorKind._("STRING");
+
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<FlutterWidgetPropertyEditorKind> VALUES =
+      const <FlutterWidgetPropertyEditorKind>[
+    BOOL,
+    DOUBLE,
+    ENUM,
+    ENUM_LIKE,
+    INT,
+    STRING
+  ];
+
+  @override
+  final String name;
+
+  const FlutterWidgetPropertyEditorKind._(this.name);
+
+  factory FlutterWidgetPropertyEditorKind(String name) {
+    switch (name) {
+      case "BOOL":
+        return BOOL;
+      case "DOUBLE":
+        return DOUBLE;
+      case "ENUM":
+        return ENUM;
+      case "ENUM_LIKE":
+        return ENUM_LIKE;
+      case "INT":
+        return INT;
+      case "STRING":
+        return STRING;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory FlutterWidgetPropertyEditorKind.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new FlutterWidgetPropertyEditorKind(json);
+      } catch (_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(
+        jsonPath, "FlutterWidgetPropertyEditorKind", json);
+  }
+
+  @override
+  String toString() => "FlutterWidgetPropertyEditorKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FlutterWidgetPropertyValue
+ *
+ * {
+ *   "boolValue": optional bool
+ *   "doubleValue": optional double
+ *   "intValue": optional int
+ *   "stringValue": optional String
+ *   "enumValue": optional FlutterWidgetPropertyValueEnumItem
+ *   "expression": optional String
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyValue implements HasToJson {
+  bool _boolValue;
+
+  double _doubleValue;
+
+  int _intValue;
+
+  String _stringValue;
+
+  FlutterWidgetPropertyValueEnumItem _enumValue;
+
+  String _expression;
+
+  bool get boolValue => _boolValue;
+
+  void set boolValue(bool value) {
+    this._boolValue = value;
+  }
+
+  double get doubleValue => _doubleValue;
+
+  void set doubleValue(double value) {
+    this._doubleValue = value;
+  }
+
+  int get intValue => _intValue;
+
+  void set intValue(int value) {
+    this._intValue = value;
+  }
+
+  String get stringValue => _stringValue;
+
+  void set stringValue(String value) {
+    this._stringValue = value;
+  }
+
+  FlutterWidgetPropertyValueEnumItem get enumValue => _enumValue;
+
+  void set enumValue(FlutterWidgetPropertyValueEnumItem value) {
+    this._enumValue = value;
+  }
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  String get expression => _expression;
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  void set expression(String value) {
+    this._expression = value;
+  }
+
+  FlutterWidgetPropertyValue(
+      {bool boolValue,
+      double doubleValue,
+      int intValue,
+      String stringValue,
+      FlutterWidgetPropertyValueEnumItem enumValue,
+      String expression}) {
+    this.boolValue = boolValue;
+    this.doubleValue = doubleValue;
+    this.intValue = intValue;
+    this.stringValue = stringValue;
+    this.enumValue = enumValue;
+    this.expression = expression;
+  }
+
+  factory FlutterWidgetPropertyValue.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool boolValue;
+      if (json.containsKey("boolValue")) {
+        boolValue =
+            jsonDecoder.decodeBool(jsonPath + ".boolValue", json["boolValue"]);
+      }
+      double doubleValue;
+      if (json.containsKey("doubleValue")) {
+        doubleValue = jsonDecoder.decodeDouble(
+            jsonPath + ".doubleValue", json["doubleValue"]);
+      }
+      int intValue;
+      if (json.containsKey("intValue")) {
+        intValue =
+            jsonDecoder.decodeInt(jsonPath + ".intValue", json["intValue"]);
+      }
+      String stringValue;
+      if (json.containsKey("stringValue")) {
+        stringValue = jsonDecoder.decodeString(
+            jsonPath + ".stringValue", json["stringValue"]);
+      }
+      FlutterWidgetPropertyValueEnumItem enumValue;
+      if (json.containsKey("enumValue")) {
+        enumValue = new FlutterWidgetPropertyValueEnumItem.fromJson(
+            jsonDecoder, jsonPath + ".enumValue", json["enumValue"]);
+      }
+      String expression;
+      if (json.containsKey("expression")) {
+        expression = jsonDecoder.decodeString(
+            jsonPath + ".expression", json["expression"]);
+      }
+      return new FlutterWidgetPropertyValue(
+          boolValue: boolValue,
+          doubleValue: doubleValue,
+          intValue: intValue,
+          stringValue: stringValue,
+          enumValue: enumValue,
+          expression: expression);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetPropertyValue", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (boolValue != null) {
+      result["boolValue"] = boolValue;
+    }
+    if (doubleValue != null) {
+      result["doubleValue"] = doubleValue;
+    }
+    if (intValue != null) {
+      result["intValue"] = intValue;
+    }
+    if (stringValue != null) {
+      result["stringValue"] = stringValue;
+    }
+    if (enumValue != null) {
+      result["enumValue"] = enumValue.toJson();
+    }
+    if (expression != null) {
+      result["expression"] = expression;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyValue) {
+      return boolValue == other.boolValue &&
+          doubleValue == other.doubleValue &&
+          intValue == other.intValue &&
+          stringValue == other.stringValue &&
+          enumValue == other.enumValue &&
+          expression == other.expression;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, boolValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, doubleValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, intValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, stringValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, enumValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, expression.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyValueEnumItem
+ *
+ * {
+ *   "libraryUri": String
+ *   "className": String
+ *   "name": String
+ *   "documentation": optional String
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyValueEnumItem implements HasToJson {
+  String _libraryUri;
+
+  String _className;
+
+  String _name;
+
+  String _documentation;
+
+  /**
+   * The URI of the library containing the className. When the enum item is
+   * passed back, this will allow the server to import the corresponding
+   * library if necessary.
+   */
+  String get libraryUri => _libraryUri;
+
+  /**
+   * The URI of the library containing the className. When the enum item is
+   * passed back, this will allow the server to import the corresponding
+   * library if necessary.
+   */
+  void set libraryUri(String value) {
+    assert(value != null);
+    this._libraryUri = value;
+  }
+
+  /**
+   * The name of the class or enum.
+   */
+  String get className => _className;
+
+  /**
+   * The name of the class or enum.
+   */
+  void set className(String value) {
+    assert(value != null);
+    this._className = value;
+  }
+
+  /**
+   * The name of the field in the enumeration, or the static field in the
+   * class.
+   */
+  String get name => _name;
+
+  /**
+   * The name of the field in the enumeration, or the static field in the
+   * class.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know
+   * the documentation, e.g. because the corresponding field is not documented.
+   */
+  String get documentation => _documentation;
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know
+   * the documentation, e.g. because the corresponding field is not documented.
+   */
+  void set documentation(String value) {
+    this._documentation = value;
+  }
+
+  FlutterWidgetPropertyValueEnumItem(
+      String libraryUri, String className, String name,
+      {String documentation}) {
+    this.libraryUri = libraryUri;
+    this.className = className;
+    this.name = name;
+    this.documentation = documentation;
+  }
+
+  factory FlutterWidgetPropertyValueEnumItem.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String libraryUri;
+      if (json.containsKey("libraryUri")) {
+        libraryUri = jsonDecoder.decodeString(
+            jsonPath + ".libraryUri", json["libraryUri"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "libraryUri");
+      }
+      String className;
+      if (json.containsKey("className")) {
+        className = jsonDecoder.decodeString(
+            jsonPath + ".className", json["className"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "className");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "name");
+      }
+      String documentation;
+      if (json.containsKey("documentation")) {
+        documentation = jsonDecoder.decodeString(
+            jsonPath + ".documentation", json["documentation"]);
+      }
+      return new FlutterWidgetPropertyValueEnumItem(libraryUri, className, name,
+          documentation: documentation);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "FlutterWidgetPropertyValueEnumItem", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["libraryUri"] = libraryUri;
+    result["className"] = className;
+    result["name"] = name;
+    if (documentation != null) {
+      result["documentation"] = documentation;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyValueEnumItem) {
+      return libraryUri == other.libraryUri &&
+          className == other.className &&
+          name == other.name &&
+          documentation == other.documentation;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, libraryUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, className.hashCode);
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * GeneralAnalysisService
  *
  * enum {
@@ -18740,6 +19715,9 @@
  *   CONTENT_MODIFIED
  *   DEBUG_PORT_COULD_NOT_BE_OPENED
  *   FILE_NOT_ANALYZED
+ *   FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED
  *   FORMAT_INVALID_FILE
  *   FORMAT_WITH_ERRORS
  *   GET_ERRORS_INVALID_FILE
@@ -18793,6 +19771,27 @@
       const RequestErrorCode._("FILE_NOT_ANALYZED");
 
   /**
+   * The given location does not have a supported widget.
+   */
+  static const RequestErrorCode FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET =
+      const RequestErrorCode._("FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET");
+
+  /**
+   * The given property identifier is not valid. It might have never been
+   * valid, or a change to code invalidated it, or its TTL was exceeded.
+   */
+  static const RequestErrorCode FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID =
+      const RequestErrorCode._("FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID");
+
+  /**
+   * The value of the property cannot be removed, for example because the
+   * corresponding constructor argument is required, and the server does not
+   * know what default value to use.
+   */
+  static const RequestErrorCode FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED =
+      const RequestErrorCode._("FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED");
+
+  /**
    * An "edit.format" request specified a FilePath which does not match a Dart
    * file in an analysis root.
    */
@@ -18984,6 +19983,9 @@
     CONTENT_MODIFIED,
     DEBUG_PORT_COULD_NOT_BE_OPENED,
     FILE_NOT_ANALYZED,
+    FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
+    FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID,
+    FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED,
     FORMAT_INVALID_FILE,
     FORMAT_WITH_ERRORS,
     GET_ERRORS_INVALID_FILE,
@@ -19025,6 +20027,12 @@
         return DEBUG_PORT_COULD_NOT_BE_OPENED;
       case "FILE_NOT_ANALYZED":
         return FILE_NOT_ANALYZED;
+      case "FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET":
+        return FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET;
+      case "FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID":
+        return FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID;
+      case "FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED":
+        return FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED;
       case "FORMAT_INVALID_FILE":
         return FORMAT_INVALID_FILE;
       case "FORMAT_WITH_ERRORS":
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 587adc4..6f3daf6 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -43,6 +43,7 @@
 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/features.dart';
+import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart';
 import 'package:analysis_server/src/services/search/search_engine_internal.dart';
 import 'package:analysis_server/src/utilities/null_string_sink.dart';
@@ -120,6 +121,9 @@
   /// notifications should be sent.
   Map<FlutterService, Set<String>> flutterServices = {};
 
+  /// The support for Flutter properties.
+  WidgetDescriptions flutterWidgetDescriptions = WidgetDescriptions();
+
   /// The [Completer] that completes when analysis is complete.
   Completer _onAnalysisCompleteCompleter;
 
@@ -167,9 +171,9 @@
     this.sdkManager,
     this.instrumentationService, {
     DiagnosticServer diagnosticServer,
-    ResolverProvider fileResolverProvider: null,
-    ResolverProvider packageResolverProvider: null,
-    this.detachableFileSystemManager: null,
+    ResolverProvider fileResolverProvider = null,
+    ResolverProvider packageResolverProvider = null,
+    this.detachableFileSystemManager = null,
   }) : super(options, diagnosticServer, baseResourceProvider) {
     notificationManager = new NotificationManager(channel, resourceProvider);
 
@@ -403,7 +407,7 @@
     String message,
     dynamic exception,
     /*StackTrace*/ stackTrace, {
-    bool fatal: false,
+    bool fatal = false,
   }) {
     StringBuffer buffer = new StringBuffer();
     buffer.write(exception ?? 'null exception');
@@ -740,6 +744,9 @@
   /// Whether to use the Language Server Protocol.
   bool useLanguageServerProtocol = false;
 
+  /// Base path to locate trained completion language model files.
+  String completionModelFolder;
+
   /// Whether to enable parsing via the Fasta parser.
   bool useFastaParser = true;
 
@@ -770,13 +777,8 @@
       String path = result.path;
       if (analysisServer.shouldSendErrorsNotificationFor(path)) {
         if (notificationManager != null) {
-          notificationManager.recordAnalysisErrors(
-              NotificationManager.serverId,
-              path,
-              server.doAnalysisError_listFromEngine(
-                  result.session.analysisContext.analysisOptions,
-                  result.lineInfo,
-                  result.errors));
+          notificationManager.recordAnalysisErrors(NotificationManager.serverId,
+              path, server.doAnalysisError_listFromEngine(result));
         } else {
           new_sendErrorNotification(analysisServer, result);
         }
diff --git a/pkg/analysis_server/lib/src/analysis_server_abstract.dart b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
index d1aa497d..f1a3a54 100644
--- a/pkg/analysis_server/lib/src/analysis_server_abstract.dart
+++ b/pkg/analysis_server/lib/src/analysis_server_abstract.dart
@@ -270,7 +270,7 @@
   /// analyzed in one of the analysis drivers to which the file was added,
   /// otherwise in the first driver, otherwise `null` is returned.
   Future<ResolvedUnitResult> getResolvedUnit(String path,
-      {bool sendCachedToStream: false}) {
+      {bool sendCachedToStream = false}) {
     if (!AnalysisEngine.isDartFileName(path)) {
       return null;
     }
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 233da3c..0bb5198 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -476,6 +476,14 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    computer._addRegion_token(
+        node.extensionKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
+    super.visitExtensionDeclaration(node);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     super.visitFieldDeclaration(node);
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
index 21fd783..7b4eee3 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights2.dart
@@ -567,6 +567,14 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    computer._addRegion_token(
+        node.extensionKeyword, HighlightRegionType.KEYWORD);
+    computer._addRegion_token(node.onKeyword, HighlightRegionType.BUILT_IN);
+    super.visitExtensionDeclaration(node);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     computer._addRegion_token(node.staticKeyword, HighlightRegionType.BUILT_IN);
     super.visitFieldDeclaration(node);
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index e1b0c0e..0315200 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -20,7 +20,7 @@
   final bool withBasicFlutter;
   final Flutter flutter;
 
-  DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter: false})
+  DartUnitOutlineComputer(this.resolvedUnit, {this.withBasicFlutter = false})
       : flutter = Flutter.of(resolvedUnit);
 
   /**
@@ -42,6 +42,9 @@
           constantOutlines.add(_newEnumConstant(constant));
         }
         unitContents.add(_newEnumOutline(enumDeclaration, constantOutlines));
+      } else if (unitMember is ExtensionDeclaration) {
+        unitContents.add(_newExtensionOutline(
+            unitMember, _outlinesForMembers(unitMember.members)));
       } else if (unitMember is TopLevelVariableDeclaration) {
         TopLevelVariableDeclaration fieldDeclaration = unitMember;
         VariableDeclarationList fields = fieldDeclaration.variables;
@@ -92,7 +95,6 @@
   }
 
   Outline _newClassOutline(ClassDeclaration node, List<Outline> classContents) {
-    node.firstTokenAfterCommentAndMetadata;
     SimpleIdentifier nameNode = node.name;
     String name = nameNode.name;
     Element element = new Element(
@@ -175,6 +177,21 @@
     return _nodeOutline(node, element, children);
   }
 
+  Outline _newExtensionOutline(
+      ExtensionDeclaration node, List<Outline> extensionContents) {
+    SimpleIdentifier nameNode = node.name;
+    String name = nameNode?.name ?? '';
+    Element element = new Element(
+        ElementKind.EXTENSION,
+        name,
+        Element.makeFlags(
+            isPrivate: Identifier.isPrivateName(name),
+            isDeprecated: _isDeprecated(node)),
+        location: _getLocationNode(nameNode ?? node.extendedType),
+        typeParameters: _getTypeParametersStr(node.typeParameters));
+    return _nodeOutline(node, element, extensionContents);
+  }
+
   Outline _newFunctionOutline(FunctionDeclaration function, bool isStatic) {
     TypeAnnotation returnType = function.returnType;
     SimpleIdentifier nameNode = function.name;
@@ -463,7 +480,7 @@
     engine.ExecutableElement executableElement = nameElement;
 
     String extractString(NodeList<Expression> arguments) {
-      if (arguments != null && arguments.length > 0) {
+      if (arguments != null && arguments.isNotEmpty) {
         Expression argument = arguments[0];
         if (argument is StringLiteral) {
           String value = argument.stringValue;
diff --git a/pkg/analysis_server/lib/src/computer/computer_overrides.dart b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
index 7eb2b68..9bd9102 100644
--- a/pkg/analysis_server/lib/src/computer/computer_overrides.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_overrides.dart
@@ -181,7 +181,7 @@
     _addInterfaceOverrides(type.superclass, checkType);
   }
 
-  void _addSuperOverrides(InterfaceType type, {bool withThisType: true}) {
+  void _addSuperOverrides(InterfaceType type, {bool withThisType = true}) {
     if (type == null) {
       return;
     }
diff --git a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
index 00f2cfc..0b0e009 100644
--- a/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
+++ b/pkg/analysis_server/lib/src/computer/import_elements_computer.dart
@@ -431,7 +431,7 @@
   final int offset;
   final int newLinesAfter;
 
-  _InsertionDescription(this.offset, {int before: 0, int after: 0})
+  _InsertionDescription(this.offset, {int before = 0, int after = 0})
       : this.newLinesBefore = before,
         this.newLinesAfter = after;
 }
diff --git a/pkg/analysis_server/lib/src/computer/new_notifications.dart b/pkg/analysis_server/lib/src/computer/new_notifications.dart
index a7c00bf..7b90b64 100644
--- a/pkg/analysis_server/lib/src/computer/new_notifications.dart
+++ b/pkg/analysis_server/lib/src/computer/new_notifications.dart
@@ -39,11 +39,7 @@
 
 void new_sendErrorNotification(
     AnalysisServer analysisServer, ResolvedUnitResult result) {
-  var serverErrors = protocol.doAnalysisError_listFromEngine(
-    result.session.analysisContext.analysisOptions,
-    result.lineInfo,
-    result.errors,
-  );
+  var serverErrors = protocol.doAnalysisError_listFromEngine(result);
   var params = new protocol.AnalysisErrorsParams(result.path, serverErrors);
   analysisServer.sendNotification(params.toNotification());
 }
diff --git a/pkg/analysis_server/lib/src/domain_abstract.dart b/pkg/analysis_server/lib/src/domain_abstract.dart
index 6a50a2d..a70be23 100644
--- a/pkg/analysis_server/lib/src/domain_abstract.dart
+++ b/pkg/analysis_server/lib/src/domain_abstract.dart
@@ -41,7 +41,7 @@
   Future<List<plugin.Response>> waitForResponses(
       Map<PluginInfo, Future<plugin.Response>> futures,
       {plugin.RequestParams requestParameters,
-      int timeout: 500}) async {
+      int timeout = 500}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     // TODO(brianwilkerson) requestParameters might need to be required.
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 78f7301..c526390 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -58,11 +58,7 @@
       return;
     }
 
-    List<AnalysisError> protocolErrors = doAnalysisError_listFromEngine(
-      result.session.analysisContext.analysisOptions,
-      result.lineInfo,
-      result.errors,
-    );
+    List<AnalysisError> protocolErrors = doAnalysisError_listFromEngine(result);
     server.sendResponse(
         new AnalysisGetErrorsResult(protocolErrors).toResponse(request.id));
   }
diff --git a/pkg/analysis_server/lib/src/domain_kythe.dart b/pkg/analysis_server/lib/src/domain_kythe.dart
index ecfcc43..4e7cffb 100644
--- a/pkg/analysis_server/lib/src/domain_kythe.dart
+++ b/pkg/analysis_server/lib/src/domain_kythe.dart
@@ -15,7 +15,7 @@
 import 'package:analysis_server/src/services/kythe/kythe_visitors.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer_plugin/protocol/protocol.dart' as plugin;
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
@@ -66,7 +66,7 @@
             server.resourceProvider,
             entries,
             file,
-            new InheritanceManager2(typeSystem),
+            new InheritanceManager3(typeSystem),
             result.content));
         allResults.add(new KytheGetKytheEntriesResult(entries, files));
       }
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 0d1e4df..d96e1bb 100644
--- a/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
+++ b/pkg/analysis_server/lib/src/domains/completion/available_suggestions.dart
@@ -140,12 +140,18 @@
       return protocol.ElementKind.ENUM;
     case DeclarationKind.ENUM_CONSTANT:
       return protocol.ElementKind.ENUM_CONSTANT;
+    case DeclarationKind.EXTENSION:
+      return protocol.ElementKind.EXTENSION;
+    case DeclarationKind.FIELD:
+      return protocol.ElementKind.FIELD;
     case DeclarationKind.FUNCTION:
       return protocol.ElementKind.FUNCTION;
     case DeclarationKind.FUNCTION_TYPE_ALIAS:
       return protocol.ElementKind.FUNCTION_TYPE_ALIAS;
     case DeclarationKind.GETTER:
       return protocol.ElementKind.GETTER;
+    case DeclarationKind.METHOD:
+      return protocol.ElementKind.METHOD;
     case DeclarationKind.MIXIN:
       return protocol.ElementKind.MIXIN;
     case DeclarationKind.SETTER:
diff --git a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
index d14c29a..fb322eb 100644
--- a/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_dartfix.dart
@@ -14,6 +14,7 @@
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 
 class EditDartFix
     with FixCodeProcessor, FixErrorProcessor, FixLintProcessor
@@ -39,13 +40,21 @@
     if (params.includeRequiredFixes == true) {
       fixInfo.addAll(allFixes.where((i) => i.isRequired));
     }
+    if (params.includePedanticFixes == true) {
+      for (var fix in allFixes) {
+        if (fix.isPedantic && !fixInfo.contains(fix)) {
+          fixInfo.add(fix);
+        }
+      }
+    }
     if (params.includedFixes != null) {
       for (String key in params.includedFixes) {
         var info = allFixes.firstWhere((i) => i.key == key, orElse: () => null);
         if (info != null) {
           fixInfo.add(info);
         } else {
-          // TODO(danrubel): Report unknown fix to the user
+          return new Response.invalidParameter(
+              request, 'includedFixes', 'Unknown fix: $key');
         }
       }
     }
@@ -58,7 +67,8 @@
         if (info != null) {
           fixInfo.remove(info);
         } else {
-          // TODO(danrubel): Report unknown fix to the user
+          return new Response.invalidParameter(
+              request, 'excludedFixes', 'Unknown fix: $key');
         }
       }
     }
@@ -69,6 +79,13 @@
     // Validate each included file and directory.
     final resourceProvider = server.resourceProvider;
     final contextManager = server.contextManager;
+
+    // Discard any existing analysis so that the linters set below will be
+    // used to generate errors that can then be fixed.
+    // TODO(danrubel): Rework to use a different approach if this command
+    // will be used from within the IDE.
+    contextManager.refresh(null);
+
     for (String filePath in params.included) {
       if (!server.isValidFilePath(filePath)) {
         return new Response.invalidFilePathFormat(request, filePath);
@@ -79,8 +96,18 @@
               contextManager.isInAnalysisRoot(filePath))) {
         return new Response.fileNotAnalyzed(request, filePath);
       }
-      var pkgFolder =
-          findPkgFolder(contextManager.getContextFolderFor(filePath));
+
+      // Set the linters used during analysis. If this command is used from
+      // within an IDE, then this will cause the lint results to change.
+      // TODO(danrubel): Rework to use a different approach if this command
+      // will be used from within the IDE.
+      var driver = contextManager.getDriverFor(filePath);
+      var analysisOptions = driver.analysisOptions as AnalysisOptionsImpl;
+      analysisOptions.lint = true;
+      analysisOptions.lintRules = linters;
+
+      var contextFolder = contextManager.getContextFolderFor(filePath);
+      var pkgFolder = findPkgFolder(contextFolder);
       if (pkgFolder != null && !pkgFolders.contains(pkgFolder)) {
         pkgFolders.add(pkgFolder);
       }
@@ -96,21 +123,22 @@
       await processPackage(pkgFolder);
     }
 
-    // Process each source file.
     bool hasErrors = false;
     String changedPath;
-    server.contextManager.driverMap.values
-        .forEach((d) => d.onCurrentSessionAboutToBeDiscarded = (String path) {
-              // Remember the resource that changed during analysis
-              changedPath = path;
-            });
+    contextManager.driverMap.values.forEach((driver) {
+      // Setup a listener to remember the resource that changed during analysis
+      // so it can be reported if there is an InconsistentAnalysisException.
+      driver.onCurrentSessionAboutToBeDiscarded = (String path) {
+        changedPath = path;
+      };
+    });
 
+    // Process each source file.
     try {
       await processResources((ResolvedUnitResult result) async {
         if (await processErrors(result)) {
           hasErrors = true;
         }
-        await processLints(result);
         if (numPhases > 0) {
           await processCodeTasks(0, result);
         }
@@ -120,7 +148,6 @@
           await processCodeTasks(phase, result);
         });
       }
-      await finishLints();
       await finishCodeTasks();
     } on InconsistentAnalysisException catch (_) {
       // If a resource changed, report the problem without suggesting fixes
diff --git a/pkg/analysis_server/lib/src/edit/edit_domain.dart b/pkg/analysis_server/lib/src/edit/edit_domain.dart
index 99a39bd..0e7ec3b 100644
--- a/pkg/analysis_server/lib/src/edit/edit_domain.dart
+++ b/pkg/analysis_server/lib/src/edit/edit_domain.dart
@@ -23,6 +23,7 @@
 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';
@@ -40,6 +41,8 @@
 // ignore: deprecated_member_use
 import 'package:analyzer/source/analysis_options_provider.dart';
 import 'package:analyzer/source/line_info.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/results.dart' as engine;
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart' as engine;
 import 'package:analyzer/src/error/codes.dart' as engine;
@@ -404,8 +407,7 @@
         return Response.DELAYED_RESPONSE;
       } else if (requestName ==
           EDIT_REQUEST_LIST_POSTFIX_COMPLETION_TEMPLATES) {
-        listPostfixCompletionTemplates(request);
-        return Response.DELAYED_RESPONSE;
+        return listPostfixCompletionTemplates(request);
       }
     } on RequestFailure catch (exception) {
       return exception.response;
@@ -487,17 +489,15 @@
     server.sendResponse(response);
   }
 
-  Future listPostfixCompletionTemplates(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var templates = DartPostfixCompletion.ALL_TEMPLATES
-        .map((pfc) =>
-            new PostfixTemplateDescriptor(pfc.name, pfc.key, pfc.example))
+  Response listPostfixCompletionTemplates(Request request) {
+    List<PostfixTemplateDescriptor> templates = DartPostfixCompletion
+        .ALL_TEMPLATES
+        .map((PostfixCompletionKind kind) =>
+            new PostfixTemplateDescriptor(kind.name, kind.key, kind.example))
         .toList();
 
-    Response response = new EditListPostfixCompletionTemplatesResult(templates)
+    return new EditListPostfixCompletionTemplatesResult(templates)
         .toResponse(request.id);
-    server.sendResponse(response);
   }
 
   Future<void> organizeDirectives(Request request) async {
@@ -593,7 +593,9 @@
     if (content == null) {
       return errorFixesList;
     }
-    SourceFactory sourceFactory = server.getAnalysisDriver(file).sourceFactory;
+    AnalysisDriver driver = server.getAnalysisDriver(file);
+    var session = driver.currentSession;
+    SourceFactory sourceFactory = driver.sourceFactory;
     List<engine.AnalysisError> errors = analyzeAnalysisOptions(
         optionsFile.createSource(), content, sourceFactory);
     YamlMap options = _getOptions(sourceFactory, content);
@@ -607,8 +609,9 @@
       if (fixes.isNotEmpty) {
         fixes.sort(Fix.SORT_BY_RELEVANCE);
         LineInfo lineInfo = new LineInfo.fromContent(content);
-        AnalysisError serverError =
-            newAnalysisError_fromEngine(lineInfo, error);
+        ResolvedUnitResult result = new engine.ResolvedUnitResultImpl(
+            session, file, null, true, content, lineInfo, false, null, errors);
+        AnalysisError serverError = newAnalysisError_fromEngine(result, error);
         AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
         fixes.forEach((fix) {
@@ -634,13 +637,22 @@
         int errorLine = lineInfo.getLocation(error.offset).lineNumber;
         if (errorLine == requestLine) {
           var workspace = DartChangeWorkspace(server.currentSessions);
-          var context = new DartFixContextImpl(workspace, result, error);
+          var context =
+              new DartFixContextImpl(workspace, result, error, (name) {
+            var tracker = server.declarationsTracker;
+            var provider = TopLevelDeclarationsProvider(tracker);
+            return provider.get(
+              result.session.analysisContext,
+              result.path,
+              name,
+            );
+          });
           List<Fix> fixes =
               await new DartFixContributor().computeFixes(context);
           if (fixes.isNotEmpty) {
             fixes.sort(Fix.SORT_BY_RELEVANCE);
             AnalysisError serverError =
-                newAnalysisError_fromEngine(lineInfo, error);
+                newAnalysisError_fromEngine(result, error);
             AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
             errorFixesList.add(errorFixes);
             fixes.forEach((fix) {
@@ -672,6 +684,7 @@
     }
     ManifestValidator validator =
         new ManifestValidator(manifestFile.createSource());
+    AnalysisSession session = server.getAnalysisDriver(file).currentSession;
     List<engine.AnalysisError> errors = validator.validate(content, true);
     for (engine.AnalysisError error in errors) {
       ManifestFixGenerator generator =
@@ -680,8 +693,9 @@
       if (fixes.isNotEmpty) {
         fixes.sort(Fix.SORT_BY_RELEVANCE);
         LineInfo lineInfo = new LineInfo.fromContent(content);
-        AnalysisError serverError =
-            newAnalysisError_fromEngine(lineInfo, error);
+        ResolvedUnitResult result = new engine.ResolvedUnitResultImpl(
+            session, file, null, true, content, lineInfo, false, null, errors);
+        AnalysisError serverError = newAnalysisError_fromEngine(result, error);
         AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
         fixes.forEach((fix) {
@@ -711,6 +725,7 @@
     }
     PubspecValidator validator = new PubspecValidator(
         server.resourceProvider, pubspecFile.createSource());
+    AnalysisSession session = server.getAnalysisDriver(file).currentSession;
     List<engine.AnalysisError> errors = validator.validate(pubspec.nodes);
     for (engine.AnalysisError error in errors) {
       PubspecFixGenerator generator =
@@ -719,8 +734,9 @@
       if (fixes.isNotEmpty) {
         fixes.sort(Fix.SORT_BY_RELEVANCE);
         LineInfo lineInfo = new LineInfo.fromContent(content);
-        AnalysisError serverError =
-            newAnalysisError_fromEngine(lineInfo, error);
+        ResolvedUnitResult result = new engine.ResolvedUnitResultImpl(
+            session, file, null, true, content, lineInfo, false, null, errors);
+        AnalysisError serverError = newAnalysisError_fromEngine(result, error);
         AnalysisErrorFixes errorFixes = new AnalysisErrorFixes(serverError);
         errorFixesList.add(errorFixes);
         fixes.forEach((fix) {
diff --git a/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_assist_task.dart b/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_assist_task.dart
new file mode 100644
index 0000000..6d0eb32
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_assist_task.dart
@@ -0,0 +1,84 @@
+// 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:analysis_server/plugin/edit/assist/assist_core.dart';
+import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
+import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
+import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
+import 'package:analysis_server/src/services/correction/assist.dart';
+import 'package:analysis_server/src/services/correction/assist_internal.dart';
+import 'package:analysis_server/src/services/correction/change_workspace.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/error/error.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer_plugin/utilities/assist/assist.dart';
+
+class BasicFixLintAssistTask extends FixLintTask {
+  final AssistKind assistKind;
+
+  BasicFixLintAssistTask(this.assistKind, DartFixListener listener)
+      : super(listener);
+
+  @override
+  Future<void> fixError(ResolvedUnitResult result, AnalysisError error) async {
+    var node = new NodeLocator(error.offset).searchWithin(result.unit);
+    AssistProcessor processor = new AssistProcessor(
+      new DartAssistContextImpl(
+        DartChangeWorkspace(listener.server.currentSessions),
+        result,
+        node.offset,
+        node.length,
+      ),
+    );
+    List<Assist> assists = await processor.computeAssist(assistKind);
+
+    final location = listener.locationFor(result, node.offset, node.length);
+    if (assists.isNotEmpty) {
+      for (Assist assist in assists) {
+        listener.addSourceChange(assist.kind.message, location, assist.change);
+      }
+    } else {
+      // TODO(danrubel): If assists is empty, then determine why
+      // assist could not be performed and report that in the description.
+      listener.addRecommendation(
+          'Fix not found: ${assistKind.message}', location);
+    }
+  }
+
+  static void preferForElementsToMapFromIterable(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_for_elements_to_map_fromIterable'],
+      new BasicFixLintAssistTask(
+          DartAssistKind.CONVERT_TO_FOR_ELEMENT, listener),
+    );
+  }
+
+  static void preferIfElementsToConditionalExpressions(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_if_elements_to_conditional_expressions'],
+      new BasicFixLintAssistTask(
+          DartAssistKind.CONVERT_TO_IF_ELEMENT, listener),
+    );
+  }
+
+  static void preferIntLiterals(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_int_literals'],
+      new BasicFixLintAssistTask(
+          DartAssistKind.CONVERT_TO_INT_LITERAL, listener),
+    );
+  }
+
+  static void preferSpreadCollections(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_spread_collections'],
+      new BasicFixLintAssistTask(DartAssistKind.CONVERT_TO_SPREAD, listener),
+    );
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_error_task.dart b/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_error_task.dart
new file mode 100644
index 0000000..2cc7b1c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/edit/fix/basic_fix_lint_error_task.dart
@@ -0,0 +1,52 @@
+// 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:analysis_server/src/edit/fix/dartfix_listener.dart';
+import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
+import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
+import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/lint/registry.dart';
+import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
+
+class BasicFixLintErrorTask extends FixLintTask {
+  final FixKind fixKind;
+
+  BasicFixLintErrorTask(this.fixKind, DartFixListener listener)
+      : super(listener);
+
+  static void nullClosures(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['null_closures'],
+      new BasicFixLintErrorTask(
+          DartFixKind.REPLACE_NULL_WITH_CLOSURE, listener),
+    );
+  }
+
+  static void preferEqualForDefaultValues(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_equal_for_default_values'],
+      new BasicFixLintErrorTask(
+          DartFixKind.REPLACE_COLON_WITH_EQUALS, listener),
+    );
+  }
+
+  static void preferIsEmpty(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_is_empty'],
+      new BasicFixLintErrorTask(DartFixKind.REPLACE_WITH_IS_EMPTY, listener),
+    );
+  }
+
+  static void preferIsNotEmpty(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerLintTask(
+      Registry.ruleRegistry['prefer_is_not_empty'],
+      new BasicFixLintErrorTask(
+          DartFixKind.REPLACE_WITH_IS_NOT_EMPTY, listener),
+    );
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart b/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
index 421b8cc..2fa706f 100644
--- a/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/dartfix_info.dart
@@ -8,15 +8,13 @@
 import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
 import 'package:analysis_server/src/edit/fix/fix_error_task.dart';
 import 'package:analysis_server/src/edit/fix/non_nullable_fix.dart';
-import 'package:analysis_server/src/edit/fix/prefer_for_elements_to_map_fromIterable_fix.dart';
-import 'package:analysis_server/src/edit/fix/prefer_if_elements_to_conditional_expressions_fix.dart';
-import 'package:analysis_server/src/edit/fix/prefer_int_literals_fix.dart';
 import 'package:analysis_server/src/edit/fix/prefer_mixin_fix.dart';
-import 'package:analysis_server/src/edit/fix/prefer_spread_collections_fix.dart';
+import 'package:analysis_server/src/edit/fix/basic_fix_lint_assist_task.dart';
+import 'package:analysis_server/src/edit/fix/basic_fix_lint_error_task.dart';
 
 const allFixes = <DartFixInfo>[
   //
-  // Fixes enabled by default
+  // Required fixes due to errors or upcoming language changes
   //
   const DartFixInfo(
     'fix-named-constructor-type-arguments',
@@ -51,7 +49,64 @@
     isRequired: true,
   ),
   //
-  // Fixes that may be explicitly enabled
+  // Pedantic lint fixes.
+  //
+  const DartFixInfo(
+    'null-closures',
+    '''
+Convert nulls to closures that return null where expected.
+
+For example, this
+  [1, 3, 5].firstWhere((e) => e.isOdd, orElse: null);
+
+will be converted to
+  [1, 3, 5].firstWhere((e) => e.isOdd, orElse: () => null);''',
+    BasicFixLintErrorTask.nullClosures,
+    isPedantic: true,
+  ),
+  const DartFixInfo(
+    'prefer-equal-for-default-values',
+    '''
+Convert declarations to use = to separate a named parameter from its default value.
+
+For example, this
+  f({a: 1}) { }
+
+will be converted to
+  f({a = 1}) { }''',
+    BasicFixLintErrorTask.preferEqualForDefaultValues,
+    isPedantic: true,
+  ),
+  const DartFixInfo(
+    'prefer-is-empty',
+    '''
+Convert to using 'isEmpty' when checking if a collection or iterable is empty.
+
+For example, this
+  if (lunchBox.length == 0) return 'so hungry...';
+
+will be converted to
+  if (lunchBox.isEmpty) return 'so hungry...';''',
+    BasicFixLintErrorTask.preferIsEmpty,
+    isDefault: false,
+    isPedantic: true,
+  ),
+  const DartFixInfo(
+    'prefer-is-not-empty',
+    '''
+Convert to using 'isNotEmpty' when checking if a collection or iterable is not empty.
+
+For example, this
+  if (words.length != 0) return words.join(' ');
+
+will be converted to
+  if (words.isNotEmpty) return words.join(' ');''',
+    BasicFixLintErrorTask.preferIsNotEmpty,
+    isDefault: false,
+    isPedantic: true,
+  ),
+  //
+  // Other fixes
   //
   const DartFixInfo(
     'double-to-int',
@@ -64,7 +119,8 @@
 
 will be converted to
   const double myDouble = 8;''',
-    PreferIntLiteralsFix.task,
+    BasicFixLintAssistTask.preferIntLiterals,
+    isDefault: false,
   ),
   const DartFixInfo(
     'use-spread-collections',
@@ -78,7 +134,7 @@
 will be converted to
   var l1 = ['b'];
   var l2 = ['a', ...l1];''',
-    PreferSpreadCollectionsFix.task,
+    BasicFixLintAssistTask.preferSpreadCollections,
     isDefault: false,
   ),
   const DartFixInfo(
@@ -91,7 +147,7 @@
 
 will be converted to
   f(bool b) => ['a', if (b) 'c' else 'd', 'e'];''',
-    PreferIfElementsToConditionalExpressionsFix.task,
+    BasicFixLintAssistTask.preferIfElementsToConditionalExpressions,
     isDefault: false,
   ),
   const DartFixInfo(
@@ -104,7 +160,7 @@
 
 will be converted to
   <int, int>{ for(int i in [1, 2, 3]) i : i * 2, }''',
-    PreferForElementsToMapFromIterableFix.task,
+    BasicFixLintAssistTask.preferForElementsToMapFromIterable,
     isDefault: false,
   ),
   //
@@ -128,11 +184,18 @@
   final String key;
   final String description;
   final bool isDefault;
+  final bool isPedantic;
   final bool isRequired;
   final void Function(DartFixRegistrar dartfix, DartFixListener listener) setup;
 
-  const DartFixInfo(this.key, this.description, this.setup,
-      {this.isDefault = true, this.isRequired = false});
+  const DartFixInfo(
+    this.key,
+    this.description,
+    this.setup, {
+    this.isDefault = true,
+    this.isRequired = false,
+    this.isPedantic = false,
+  });
 
   DartFix asDartFix() =>
       new DartFix(key, description: description, isRequired: isRequired);
diff --git a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
index e71fd1d..97c2233 100644
--- a/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/fix_error_task.dart
@@ -13,35 +13,6 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/src/error/codes.dart';
 
-/// A task for fixing a particular error
-class FixErrorTask {
-  static void fixNamedConstructorTypeArgs(
-      DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerErrorTask(
-        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
-        new FixErrorTask(listener));
-  }
-
-  final DartFixListener listener;
-
-  FixErrorTask(this.listener);
-
-  Future<void> fixError(ResolvedUnitResult result, AnalysisError error) async {
-    final workspace = DartChangeWorkspace(listener.server.currentSessions);
-    final dartContext = new DartFixContextImpl(workspace, result, error);
-    final processor = new FixProcessor(dartContext);
-    Fix fix = await processor.computeFix();
-    final location = listener.locationFor(result, error.offset, error.length);
-    if (fix != null) {
-      listener.addSourceChange(fix.change.message, location, fix.change);
-    } else {
-      // TODO(danrubel): Determine why the fix could not be applied
-      // and report that in the description.
-      listener.addRecommendation('Could not fix "${error.message}"', location);
-    }
-  }
-}
-
 /// A processor used by [EditDartFix] to manage [FixErrorTask]s.
 mixin FixErrorProcessor {
   /// A mapping from [ErrorCode] to the fix that should be applied.
@@ -60,11 +31,41 @@
     return foundError;
   }
 
-  Future<bool> fixError(ResolvedUnitResult result, AnalysisError error) async {
-    return true;
-  }
-
   void registerErrorTask(ErrorCode errorCode, FixErrorTask task) {
     errorTaskMap[errorCode] = task;
   }
 }
+
+/// A task for fixing a particular error
+class FixErrorTask {
+  final DartFixListener listener;
+
+  FixErrorTask(this.listener);
+
+  Future<void> fixError(ResolvedUnitResult result, AnalysisError error) async {
+    final workspace = DartChangeWorkspace(listener.server.currentSessions);
+    final dartContext = new DartFixContextImpl(
+      workspace,
+      result,
+      error,
+      (name) => [],
+    );
+    final processor = new FixProcessor(dartContext);
+    Fix fix = await processor.computeFix();
+    final location = listener.locationFor(result, error.offset, error.length);
+    if (fix != null) {
+      listener.addSourceChange(fix.change.message, location, fix.change);
+    } else {
+      // TODO(danrubel): Determine why the fix could not be applied
+      // and report that in the description.
+      listener.addRecommendation('Could not fix "${error.message}"', location);
+    }
+  }
+
+  static void fixNamedConstructorTypeArgs(
+      DartFixRegistrar registrar, DartFixListener listener) {
+    registrar.registerErrorTask(
+        StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+        new FixErrorTask(listener));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/edit/fix/fix_lint_task.dart b/pkg/analysis_server/lib/src/edit/fix/fix_lint_task.dart
index 0a68bcf..e332d1a 100644
--- a/pkg/analysis_server/lib/src/edit/fix/fix_lint_task.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/fix_lint_task.dart
@@ -4,167 +4,23 @@
 
 import 'package:analysis_server/src/edit/edit_dartfix.dart';
 import 'package:analysis_server/src/edit/fix/dartfix_listener.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/src/dart/ast/utilities.dart';
-import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/src/edit/fix/fix_error_task.dart';
 import 'package:analyzer/src/lint/linter.dart';
-import 'package:analyzer/src/lint/linter_visitor.dart';
 import 'package:analyzer/src/services/lint.dart';
-import 'package:front_end/src/fasta/fasta_codes.dart';
-import 'package:front_end/src/scanner/token.dart';
-import 'package:source_span/src/span.dart';
 
 /// A processor used by [EditDartFix] to manage [FixLintTask]s.
-mixin FixLintProcessor {
+mixin FixLintProcessor implements FixErrorProcessor {
   final linters = <Linter>[];
   final lintTasks = <FixLintTask>[];
 
-  Future<void> finishLints() async {
-    for (Linter linter in linters) {
-      linter.reporter = null;
-    }
-    for (FixLintTask fix in lintTasks) {
-      fix.source = null;
-      await fix.applyRemainingFixes();
-    }
-  }
-
-  Future<void> processLints(ResolvedUnitResult result) async {
-    // TODO(danrubel): Determine if a lint is configured to run as part of
-    // standard analysis and use those results if available instead of
-    // running the lint again.
-
-    Source source = result.unit.declaredElement.source;
-    for (Linter linter in linters) {
-      if (linter != null) {
-        linter.reporter.source = source;
-      }
-    }
-
-    // TODO(paulberry): use an API that provides this information more readily
-
-    var unitElement = result.unit.declaredElement;
-    var session = result.session;
-    var currentUnit = LinterContextUnit(result.content, result.unit);
-    var allUnits = <LinterContextUnit>[];
-    for (var cu in unitElement.library.units) {
-      if (identical(cu, unitElement)) {
-        allUnits.add(currentUnit);
-      } else {
-        Source source = cu.source;
-        if (source != null) {
-          var result = await session.getResolvedUnit(source.fullName);
-          allUnits.add(LinterContextUnit(result.content, result.unit));
-        }
-      }
-    }
-
-    final visitors = <AstVisitor>[];
-    final registry = new NodeLintRegistry(false);
-    var context = LinterContextImpl(
-        allUnits,
-        currentUnit,
-        session.declaredVariables,
-        result.typeProvider,
-        result.typeSystem,
-        result.session.analysisContext.analysisOptions);
-    for (Linter linter in linters) {
-      if (linter != null) {
-        final visitor = linter.getVisitor();
-        if (visitor != null) {
-          visitors.add(visitor);
-        }
-        if (linter is NodeLintRule) {
-          (linter as NodeLintRule).registerNodeProcessors(registry, context);
-        }
-      }
-    }
-
-    CompilationUnit unit = result.unit;
-    if (visitors.isNotEmpty) {
-      unit.accept(new ExceptionHandlingDelegatingAstVisitor(
-          visitors, ExceptionHandlingDelegatingAstVisitor.logException));
-    }
-    unit.accept(new LinterVisitor(
-        registry, ExceptionHandlingDelegatingAstVisitor.logException));
-
-    for (FixLintTask fix in lintTasks) {
-      await fix.applyLocalFixes(result);
-    }
-  }
-
   void registerLintTask(LintRule lint, FixLintTask task) {
     linters.add(lint);
     lintTasks.add(task);
-    lint.reporter = task;
+    errorTaskMap[lint.lintCode] = task;
   }
 }
 
 /// A task for fixing a particular lint.
-/// Subclasses should implement [applyLocalFixes] and [applyRemainingFixes]
-/// and may override any of the reportSomething() methods as needed.
-abstract class FixLintTask implements ErrorReporter {
-  final DartFixListener listener;
-
-  @override
-  Source source;
-
-  FixLintTask(this.listener);
-
-  /// Apply fixes for the current compilation unit.
-  Future<void> applyLocalFixes(ResolvedUnitResult result);
-
-  /// Apply any fixes remaining after all local changes have been applied.
-  Future<void> applyRemainingFixes();
-
-  @override
-  void reportError(AnalysisError error) {
-    // ignored
-  }
-
-  @override
-  void reportErrorForElement(ErrorCode errorCode, Element element,
-      [List<Object> arguments]) {
-    // ignored
-  }
-
-  @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    // ignored
-  }
-
-  @override
-  void reportErrorForOffset(ErrorCode errorCode, int offset, int length,
-      [List<Object> arguments]) {
-    // ignored
-  }
-
-  @override
-  void reportErrorForSpan(ErrorCode errorCode, SourceSpan span,
-      [List<Object> arguments]) {
-    // ignored
-  }
-
-  @override
-  void reportErrorForToken(ErrorCode errorCode, Token token,
-      [List<Object> arguments]) {
-    // ignored
-  }
-
-  @override
-  void reportErrorMessage(
-      ErrorCode errorCode, int offset, int length, Message message) {
-    // ignored
-  }
-
-  @override
-  void reportTypeErrorForNode(
-      ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    // ignored
-  }
+abstract class FixLintTask extends FixErrorTask {
+  FixLintTask(DartFixListener listener) : super(listener);
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
index ae1db3e..09b28ca 100644
--- a/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/non_nullable_fix.dart
@@ -196,7 +196,6 @@
 
   @override
   void addFix(SingleNullabilityFix fix) {
-    // TODO(danrubel): Update the description based upon the [fix.kind]
-    listener.addSuggestion(fix.kind.appliedMessage, fix.location);
+    listener.addSuggestion(fix.description.appliedMessage, fix.location);
   }
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_for_elements_to_map_fromIterable_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_for_elements_to_map_fromIterable_fix.dart
deleted file mode 100644
index 84ecff9..0000000
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_for_elements_to_map_fromIterable_fix.dart
+++ /dev/null
@@ -1,69 +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:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
-import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/lint/registry.dart';
-
-class PreferForElementsToMapFromIterableFix extends FixLintTask {
-  final List<AstNode> nodes = <AstNode>[];
-
-  PreferForElementsToMapFromIterableFix(DartFixListener listener)
-      : super(listener);
-
-  @override
-  Future<void> applyLocalFixes(ResolvedUnitResult result) async {
-    while (nodes.isNotEmpty) {
-      AstNode node = nodes.removeLast();
-      AssistProcessor processor = new AssistProcessor(
-        new DartAssistContextImpl(
-            DartChangeWorkspace(listener.server.currentSessions),
-            result,
-            node.offset,
-            node.length),
-      );
-      List<Assist> assists =
-          await processor.computeAssist(DartAssistKind.CONVERT_TO_FOR_ELEMENT);
-
-      final location = listener.locationFor(result, node.offset, node.length);
-      if (assists.isNotEmpty) {
-        for (Assist assist in assists) {
-          listener.addSourceChange(
-              assist.kind.message, location, assist.change);
-        }
-      } else {
-        listener.addRecommendation(
-            'Convert to for elements assist not found', location);
-      }
-    }
-
-    return null;
-  }
-
-  @override
-  Future<void> applyRemainingFixes() {
-    return null;
-  }
-
-  @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    nodes.add(node);
-  }
-
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerLintTask(
-      Registry.ruleRegistry['prefer_for_elements_to_map_fromIterable'],
-      new PreferForElementsToMapFromIterableFix(listener),
-    );
-  }
-}
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_if_elements_to_conditional_expressions_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_if_elements_to_conditional_expressions_fix.dart
deleted file mode 100644
index 0dbdf26..0000000
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_if_elements_to_conditional_expressions_fix.dart
+++ /dev/null
@@ -1,69 +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:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
-import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/lint/registry.dart';
-
-class PreferIfElementsToConditionalExpressionsFix extends FixLintTask {
-  final List<AstNode> nodes = <AstNode>[];
-
-  PreferIfElementsToConditionalExpressionsFix(DartFixListener listener)
-      : super(listener);
-
-  @override
-  Future<void> applyLocalFixes(ResolvedUnitResult result) async {
-    while (nodes.isNotEmpty) {
-      AstNode node = nodes.removeLast();
-      AssistProcessor processor = new AssistProcessor(
-        new DartAssistContextImpl(
-            DartChangeWorkspace(listener.server.currentSessions),
-            result,
-            node.offset,
-            node.length),
-      );
-      List<Assist> assists =
-          await processor.computeAssist(DartAssistKind.CONVERT_TO_IF_ELEMENT);
-
-      final location = listener.locationFor(result, node.offset, node.length);
-      if (assists.isNotEmpty) {
-        for (Assist assist in assists) {
-          listener.addSourceChange(
-              assist.kind.message, location, assist.change);
-        }
-      } else {
-        listener.addRecommendation(
-            'Convert to if elements assist not found', location);
-      }
-    }
-
-    return null;
-  }
-
-  @override
-  Future<void> applyRemainingFixes() {
-    return null;
-  }
-
-  @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    nodes.add(node);
-  }
-
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerLintTask(
-      Registry.ruleRegistry['prefer_if_elements_to_conditional_expressions'],
-      new PreferIfElementsToConditionalExpressionsFix(listener),
-    );
-  }
-}
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
deleted file mode 100644
index e483d05..0000000
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_int_literals_fix.dart
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
-import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/lint/registry.dart';
-
-class PreferIntLiteralsFix extends FixLintTask {
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerLintTask(
-      Registry.ruleRegistry['prefer_int_literals'],
-      new PreferIntLiteralsFix(listener),
-    );
-  }
-
-  final literalsToConvert = <DoubleLiteral>[];
-
-  PreferIntLiteralsFix(DartFixListener listener) : super(listener);
-
-  @override
-  Future<void> applyLocalFixes(ResolvedUnitResult result) async {
-    while (literalsToConvert.isNotEmpty) {
-      DoubleLiteral literal = literalsToConvert.removeLast();
-      AssistProcessor processor = new AssistProcessor(
-        new DartAssistContextImpl(
-          DartChangeWorkspace(listener.server.currentSessions),
-          result,
-          literal.offset,
-          0,
-        ),
-      );
-      List<Assist> assists =
-          await processor.computeAssist(DartAssistKind.CONVERT_TO_INT_LITERAL);
-      final location =
-          listener.locationFor(result, literal.offset, literal.length);
-      if (assists.isNotEmpty) {
-        for (Assist assist in assists) {
-          listener.addSourceChange(
-              'Replace a double literal with an int literal',
-              location,
-              assist.change);
-        }
-      } else {
-        // TODO(danrubel): If assists is empty, then determine why
-        // assist could not be performed and report that in the description.
-        listener.addRecommendation(
-            'Could not replace a double literal with an int literal', location);
-      }
-    }
-  }
-
-  @override
-  Future<void> applyRemainingFixes() {
-    // All fixes applied in [applyLocalFixes]
-    return null;
-  }
-
-  @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    if (source.fullName != null) {
-      literalsToConvert.add(node);
-    }
-  }
-}
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
index 2fec097..0d6bcef 100644
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
+++ b/pkg/analysis_server/lib/src/edit/fix/prefer_mixin_fix.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/plugin/edit/assist/assist_core.dart';
 import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
 import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
+import 'package:analysis_server/src/edit/fix/fix_code_task.dart';
 import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
 import 'package:analysis_server/src/services/correction/assist.dart';
 import 'package:analysis_server/src/services/correction/assist_internal.dart';
@@ -13,32 +14,17 @@
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/error.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/lint/registry.dart';
 
-class PreferMixinFix extends FixLintTask {
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerLintTask(
-      Registry.ruleRegistry['prefer_mixin'],
-      new PreferMixinFix(listener),
-    );
-  }
-
+class PreferMixinFix extends FixLintTask implements FixCodeTask {
   final classesToConvert = new Set<Element>();
 
   PreferMixinFix(DartFixListener listener) : super(listener);
 
   @override
-  Future<void> applyLocalFixes(ResolvedUnitResult result) {
-    // All fixes applied in [applyRemainingFixes]
-    return null;
-  }
-
-  @override
-  Future<void> applyRemainingFixes() async {
-    for (Element elem in classesToConvert) {
-      await convertClassToMixin(elem);
-    }
-  }
+  int get numPhases => 0;
 
   Future<void> convertClassToMixin(Element elem) async {
     ResolvedUnitResult result =
@@ -76,12 +62,38 @@
   }
 
   @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    TypeName type = node;
-    Element element = type.name.staticElement;
-    if (element.source?.fullName != null) {
-      classesToConvert.add(element);
+  Future<void> finish() async {
+    for (Element elem in classesToConvert) {
+      await convertClassToMixin(elem);
     }
   }
+
+  @override
+  Future<void> fixError(ResolvedUnitResult result, AnalysisError error) async {
+    var node = new NodeLocator(error.offset).searchWithin(result.unit);
+    TypeName type = node.thisOrAncestorOfType<TypeName>();
+    if (type != null) {
+      Element element = type.name.staticElement;
+      if (element.source?.fullName != null) {
+        classesToConvert.add(element);
+      }
+    } else {
+      // TODO(danrubel): Report if lint does not point to a type name
+      final location = listener.locationFor(result, node.offset, node.length);
+      listener.addRecommendation(
+          'Cannot not convert $node to a mixin', location);
+    }
+  }
+
+  @override
+  Future<void> processPackage(Folder pkgFolder) async {}
+
+  @override
+  Future<void> processUnit(int phase, ResolvedUnitResult result) async {}
+
+  static void task(DartFixRegistrar registrar, DartFixListener listener) {
+    var task = new PreferMixinFix(listener);
+    registrar.registerLintTask(Registry.ruleRegistry['prefer_mixin'], task);
+    registrar.registerCodeTask(task);
+  }
 }
diff --git a/pkg/analysis_server/lib/src/edit/fix/prefer_spread_collections_fix.dart b/pkg/analysis_server/lib/src/edit/fix/prefer_spread_collections_fix.dart
deleted file mode 100644
index caff2e6..0000000
--- a/pkg/analysis_server/lib/src/edit/fix/prefer_spread_collections_fix.dart
+++ /dev/null
@@ -1,68 +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:analysis_server/plugin/edit/assist/assist_core.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_listener.dart';
-import 'package:analysis_server/src/edit/fix/dartfix_registrar.dart';
-import 'package:analysis_server/src/edit/fix/fix_lint_task.dart';
-import 'package:analysis_server/src/services/correction/assist.dart';
-import 'package:analysis_server/src/services/correction/assist_internal.dart';
-import 'package:analysis_server/src/services/correction/change_workspace.dart';
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/lint/registry.dart';
-
-class PreferSpreadCollectionsFix extends FixLintTask {
-  final List<AstNode> nodes = <AstNode>[];
-
-  PreferSpreadCollectionsFix(DartFixListener listener) : super(listener);
-
-  @override
-  Future<void> applyLocalFixes(ResolvedUnitResult result) async {
-    while (nodes.isNotEmpty) {
-      AstNode node = nodes.removeLast();
-      AssistProcessor processor = new AssistProcessor(
-        new DartAssistContextImpl(
-            DartChangeWorkspace(listener.server.currentSessions),
-            result,
-            node.offset,
-            0),
-      );
-      List<Assist> assists =
-          await processor.computeAssist(DartAssistKind.CONVERT_TO_SPREAD);
-
-      final location = listener.locationFor(result, node.offset, node.length);
-      if (assists.isNotEmpty) {
-        for (Assist assist in assists) {
-          listener.addSourceChange(
-              assist.kind.message, location, assist.change);
-        }
-      } else {
-        listener.addRecommendation(
-            'Convert to spread assist not found', location);
-      }
-    }
-
-    return null;
-  }
-
-  @override
-  Future<void> applyRemainingFixes() {
-    return null;
-  }
-
-  @override
-  void reportErrorForNode(ErrorCode errorCode, AstNode node,
-      [List<Object> arguments]) {
-    nodes.add(node);
-  }
-
-  static void task(DartFixRegistrar registrar, DartFixListener listener) {
-    registrar.registerLintTask(
-      Registry.ruleRegistry['prefer_spread_collections'],
-      new PreferSpreadCollectionsFix(listener),
-    );
-  }
-}
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
index 3f92193..d6239cd 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_correction.dart
@@ -2,14 +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:async';
-
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
-import 'package:analyzer_plugin/protocol/protocol_common.dart' hide Element;
-import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 import 'package:meta/meta.dart';
 
 class FlutterCorrections {
@@ -39,37 +35,4 @@
    * Returns the EOL to use for this [CompilationUnit].
    */
   String get eol => utils.endOfLine;
-
-  Future<SourceChange> addForDesignTimeConstructor() async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    final node = this.node;
-    if (node is ClassDeclaration) {
-      var className = node.name.name;
-      var location = utils.prepareNewConstructorLocation(node);
-      var changeBuilder = new DartChangeBuilder(resolveResult.session);
-      await changeBuilder.addFileEdit(resolveResult.path, (builder) {
-        builder.addInsertion(location.offset, (builder) {
-          builder.write(location.prefix);
-
-          // If there are no constructors, we need to add also default.
-          bool hasConstructors =
-              node.members.any((m) => m is ConstructorDeclaration);
-          if (!hasConstructors) {
-            builder.writeln('$className();');
-            builder.writeln();
-            builder.write('  ');
-          }
-
-          builder.writeln('factory $className.forDesignTime() {');
-          builder.writeln('    // TODO: add arguments');
-          builder.writeln('    return new $className();');
-          builder.write('  }');
-          builder.write(location.suffix);
-        });
-      });
-      return changeBuilder.sourceChange;
-    }
-    return null;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
index 27d5268..bc659d6 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_domain.dart
@@ -2,15 +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 'package:analysis_server/protocol/protocol_constants.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/domain_abstract.dart';
-import 'package:analysis_server/src/flutter/flutter_correction.dart';
 import 'package:analysis_server/src/protocol/protocol_internal.dart';
 import 'package:analysis_server/src/protocol_server.dart';
-import 'package:analyzer/dart/analysis/results.dart';
 
 /**
  * A [RequestHandler] that handles requests in the `flutter` domain.
@@ -22,43 +18,57 @@
   FlutterDomainHandler(AnalysisServer server) : super(server);
 
   /**
-   * Implement the 'flutter.getChangeAddForDesignTimeConstructor' request.
+   * Implement the 'flutter.getWidgetDescription' request.
    */
-  Future getChangeAddForDesignTimeConstructor(Request request) async {
-    // TODO(brianwilkerson) Determine whether this await is necessary.
-    await null;
-    var params =
-        new FlutterGetChangeAddForDesignTimeConstructorParams.fromRequest(
-            request);
-    String file = params.file;
-    int offset = params.offset;
+  void getWidgetDescription(Request request) async {
+    var params = FlutterGetWidgetDescriptionParams.fromRequest(request);
+    var file = params.file;
+    var offset = params.offset;
 
-    ResolvedUnitResult result = await server.getResolvedUnit(file);
-    if (result != null) {
-      var corrections = new FlutterCorrections(
-        resolveResult: result,
-        selectionOffset: offset,
-        selectionLength: 0,
-      );
-      SourceChange change = await corrections.addForDesignTimeConstructor();
-      if (change != null) {
-        server.sendResponse(
-            new FlutterGetChangeAddForDesignTimeConstructorResult(change)
-                .toResponse(request.id));
-        return;
-      }
+    if (server.sendResponseErrorIfInvalidFilePath(request, file)) {
+      return;
     }
+
+    var resolvedUnit = await server.getResolvedUnit(file);
+    if (resolvedUnit == null) {
+      // TODO(scheglov) report error
+    }
+
+    var computer = server.flutterWidgetDescriptions;
+
+    var result = await computer.getDescription(
+      resolvedUnit,
+      offset,
+    );
+
+    if (result == null) {
+      server.sendResponse(
+        Response(
+          request.id,
+          error: RequestError(
+            RequestErrorCode.FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
+            'No Flutter widget at the given location.',
+          ),
+        ),
+      );
+      return;
+    }
+
     server.sendResponse(
-        new Response.invalidParameter(request, 'file', 'No change'));
+      result.toResponse(request.id),
+    );
   }
 
   @override
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName ==
-          FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR) {
-        getChangeAddForDesignTimeConstructor(request);
+      if (requestName == FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION) {
+        getWidgetDescription(request);
+        return Response.DELAYED_RESPONSE;
+      }
+      if (requestName == FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE) {
+        setPropertyValue(request);
         return Response.DELAYED_RESPONSE;
       }
       if (requestName == FLUTTER_REQUEST_SET_SUBSCRIPTIONS) {
@@ -71,6 +81,33 @@
   }
 
   /**
+   * Implement the 'flutter.setPropertyValue' request.
+   */
+  void setPropertyValue(Request request) async {
+    var params = FlutterSetWidgetPropertyValueParams.fromRequest(request);
+
+    var result = await server.flutterWidgetDescriptions.setPropertyValue(
+      params.id,
+      params.value,
+    );
+
+    if (result.errorCode != null) {
+      server.sendResponse(
+        Response(
+          request.id,
+          error: RequestError(result.errorCode, ''),
+        ),
+      );
+    }
+
+    server.sendResponse(
+      FlutterSetWidgetPropertyValueResult(
+        result.change,
+      ).toResponse(request.id),
+    );
+  }
+
+  /**
    * Implement the 'flutter.setSubscriptions' request.
    */
   Response setSubscriptions(Request request) {
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
index 3cc2d2e..b216613 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_notifications.dart
@@ -16,7 +16,6 @@
     var params = new protocol.FlutterOutlineParams(
       resolvedUnit.path,
       outline,
-      instrumentedCode: computer.instrumentedCode,
     );
     server.sendNotification(params.toNotification());
   });
diff --git a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
index 6330e82..cec1cc2 100644
--- a/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
+++ b/pkg/analysis_server/lib/src/flutter/flutter_outline_computer.dart
@@ -4,44 +4,20 @@
 
 import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/protocol_server.dart' as protocol;
-import 'package:analysis_server/src/protocol_server.dart';
 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/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/generated/source.dart';
 
 /// Computer for Flutter specific outlines.
 class FlutterOutlineComputer {
-  static const CONSTRUCTOR_NAME = 'forDesignTime';
-
-  /// Code to append to the instrumented library code.
-  static const RENDER_APPEND = r'''
-
-final flutterDesignerWidgets = <int, Widget>{};
-
-T _registerWidgetInstance<T extends Widget>(int id, T widget) {
-  flutterDesignerWidgets[id] = widget;
-  return widget;
-}
-''';
-
   final ResolvedUnitResult resolvedUnit;
   Flutter flutter;
 
   final List<protocol.FlutterOutline> _depthFirstOrder = [];
 
-  int nextWidgetId = 0;
-
-  /// This map is filled with information about widget classes that can be
-  /// rendered. Its keys are class name offsets.
-  final Map<int, _WidgetClass> widgets = {};
-
-  final List<protocol.SourceEdit> instrumentationEdits = [];
-  String instrumentedCode;
-
   FlutterOutlineComputer(this.resolvedUnit);
 
   protocol.FlutterOutline compute() {
@@ -52,13 +28,6 @@
 
     flutter = Flutter.of(resolvedUnit);
 
-    // Find widget classes.
-    // IDEA plugin only supports rendering widgets in libraries.
-    var unitElement = resolvedUnit.unit.declaredElement;
-    if (unitElement.source == unitElement.librarySource) {
-      _findWidgets();
-    }
-
     // Convert Dart outlines into Flutter outlines.
     var flutterDartOutline = _convert(dartOutline);
 
@@ -78,17 +47,6 @@
       }
     }
 
-    // Compute instrumented code.
-    if (widgets.values.any((w) => w.hasDesignTimeConstructor)) {
-      _rewriteRelativeDirectives();
-      instrumentationEdits.sort((a, b) => b.offset - a.offset);
-      instrumentedCode = SourceEdit.applySequence(
-        resolvedUnit.content,
-        instrumentationEdits,
-      );
-      instrumentedCode += RENDER_APPEND;
-    }
-
     return flutterDartOutline;
   }
 
@@ -99,10 +57,16 @@
     if (parameter == null) {
       return;
     }
+
+    protocol.Location nameLocation;
     if (argument is NamedExpression) {
-      argument = (argument as NamedExpression).expression;
+      NamedExpression namedExpression = argument;
+      nameLocation = protocol.newLocation_fromNode(namedExpression.name.label);
+      argument = namedExpression.expression;
     }
 
+    var valueLocation = protocol.newLocation_fromNode(argument);
+
     String name = parameter.displayName;
 
     var label = resolvedUnit.content.substring(argument.offset, argument.end);
@@ -110,15 +74,15 @@
       label = '…';
     }
 
+    bool literalValueBoolean;
+    int literalValueInteger;
+    String literalValueString;
     if (argument is BooleanLiteral) {
-      attributes.add(new protocol.FlutterOutlineAttribute(name, label,
-          literalValueBoolean: argument.value));
+      literalValueBoolean = argument.value;
     } else if (argument is IntegerLiteral) {
-      attributes.add(new protocol.FlutterOutlineAttribute(name, label,
-          literalValueInteger: argument.value));
+      literalValueInteger = argument.value;
     } else if (argument is StringLiteral) {
-      attributes.add(new protocol.FlutterOutlineAttribute(name, label,
-          literalValueString: argument.stringValue));
+      literalValueString = argument.stringValue;
     } else {
       if (argument is FunctionExpression) {
         bool hasParameters = argument.parameters != null &&
@@ -133,16 +97,17 @@
       } else if (argument is SetOrMapLiteral) {
         label = '{…}';
       }
-      attributes.add(new protocol.FlutterOutlineAttribute(name, label));
     }
-  }
 
-  int _addInstrumentationEdits(Expression expression) {
-    int id = nextWidgetId++;
-    instrumentationEdits.add(new protocol.SourceEdit(
-        expression.offset, 0, '_registerWidgetInstance($id, '));
-    instrumentationEdits.add(new protocol.SourceEdit(expression.end, 0, ')'));
-    return id;
+    attributes.add(new protocol.FlutterOutlineAttribute(
+      name,
+      label,
+      literalValueBoolean: literalValueBoolean,
+      literalValueInteger: literalValueInteger,
+      literalValueString: literalValueString,
+      nameLocation: nameLocation,
+      valueLocation: valueLocation,
+    ));
   }
 
   protocol.FlutterOutline _convert(protocol.Outline dartOutline) {
@@ -157,20 +122,6 @@
       flutterOutline.children = dartOutline.children.map(_convert).toList();
     }
 
-    // Fill rendering information for widget classes.
-    if (dartOutline.element.kind == protocol.ElementKind.CLASS) {
-      var widget = widgets[dartOutline.element.location.offset];
-      if (widget != null) {
-        flutterOutline.isWidgetClass = true;
-        if (widget.hasDesignTimeConstructor) {
-          flutterOutline.renderConstructor = CONSTRUCTOR_NAME;
-        }
-        flutterOutline.stateClassName = widget.state?.name?.name;
-        flutterOutline.stateOffset = widget.state?.offset;
-        flutterOutline.stateLength = widget.state?.length;
-      }
-    }
-
     _depthFirstOrder.add(flutterOutline);
     return flutterOutline;
   }
@@ -187,8 +138,6 @@
     String className = type.element.displayName;
 
     if (node is InstanceCreationExpression) {
-      int id = _addInstrumentationEdits(node);
-
       var attributes = <protocol.FlutterOutlineAttribute>[];
       var children = <protocol.FlutterOutline>[];
       for (var argument in node.argumentList.arguments) {
@@ -256,8 +205,7 @@
           node.length,
           className: className,
           attributes: attributes,
-          children: children,
-          id: id);
+          children: children);
     }
 
     // A generic Widget typed expression.
@@ -275,91 +223,14 @@
         label = _getShortLabel(node);
       }
 
-      int id = _addInstrumentationEdits(node);
       return new protocol.FlutterOutline(
           kind, node.offset, node.length, node.offset, node.length,
-          className: className,
-          variableName: variableName,
-          label: label,
-          id: id);
+          className: className, variableName: variableName, label: label);
     }
 
     return null;
   }
 
-  /// Return the `State` declaration for the given `StatefulWidget` declaration.
-  /// Return `null` if cannot be found.
-  ClassDeclaration _findState(ClassDeclaration widget) {
-    MethodDeclaration createStateMethod = widget.members.firstWhere(
-        (method) =>
-            method is MethodDeclaration &&
-            method.name.name == 'createState' &&
-            method.body != null,
-        orElse: () => null);
-    if (createStateMethod == null) {
-      return null;
-    }
-
-    DartType stateType;
-    {
-      FunctionBody buildBody = createStateMethod.body;
-      if (buildBody is ExpressionFunctionBody) {
-        stateType = buildBody.expression.staticType;
-      } else if (buildBody is BlockFunctionBody) {
-        List<Statement> statements = buildBody.block.statements;
-        if (statements.isNotEmpty) {
-          Statement lastStatement = statements.last;
-          if (lastStatement is ReturnStatement) {
-            stateType = lastStatement.expression?.staticType;
-          }
-        }
-      }
-    }
-    if (stateType == null) {
-      return null;
-    }
-
-    ClassElement stateElement;
-    if (stateType is InterfaceType && flutter.isState(stateType.element)) {
-      stateElement = stateType.element;
-    } else {
-      return null;
-    }
-
-    for (var stateNode in resolvedUnit.unit.declarations) {
-      if (stateNode is ClassDeclaration &&
-          stateNode.declaredElement == stateElement) {
-        return stateNode;
-      }
-    }
-
-    return null;
-  }
-
-  /// Fill [widgets] with information about classes that can be rendered.
-  void _findWidgets() {
-    for (var widget in resolvedUnit.unit.declarations) {
-      if (widget is ClassDeclaration) {
-        int nameOffset = widget.name.offset;
-
-        var designTimeConstructor = widget.getConstructor(CONSTRUCTOR_NAME);
-        bool hasDesignTimeConstructor = designTimeConstructor != null;
-
-        InterfaceType superType = widget.declaredElement.supertype;
-        if (flutter.isExactlyStatelessWidgetType(superType)) {
-          widgets[nameOffset] =
-              new _WidgetClass(nameOffset, hasDesignTimeConstructor);
-        } else if (flutter.isExactlyStatefulWidgetType(superType)) {
-          ClassDeclaration state = _findState(widget);
-          if (state != null) {
-            widgets[nameOffset] =
-                new _WidgetClass(nameOffset, hasDesignTimeConstructor, state);
-          }
-        }
-      }
-    }
-  }
-
   String _getShortLabel(AstNode node) {
     if (node is MethodInvocation) {
       var buffer = new StringBuffer();
@@ -381,25 +252,6 @@
     }
     return node.toString();
   }
-
-  /// The instrumented code is put into a temporary directory for Dart VM to
-  /// run. So, any relative URIs must be changed to corresponding absolute URIs.
-  void _rewriteRelativeDirectives() {
-    for (var directive in resolvedUnit.unit.directives) {
-      if (directive is UriBasedDirective) {
-        String uriContent = directive.uriContent;
-        Source source = directive.uriSource;
-        if (uriContent != null && source != null) {
-          try {
-            if (!Uri.parse(uriContent).isAbsolute) {
-              instrumentationEdits.add(new SourceEdit(directive.uri.offset,
-                  directive.uri.length, "'${source.uri}'"));
-            }
-          } on FormatException {}
-        }
-      }
-    }
-  }
 }
 
 class _FlutterOutlineBuilder extends GeneralizingAstVisitor<void> {
@@ -418,16 +270,3 @@
     }
   }
 }
-
-/// Information about a Widget class that can be rendered.
-class _WidgetClass {
-  final int nameOffset;
-
-  /// Is `true` if has `forDesignTime` constructor, so can be rendered.
-  final bool hasDesignTimeConstructor;
-
-  /// If a `StatefulWidget` with the `State` in the same file.
-  final ClassDeclaration state;
-
-  _WidgetClass(this.nameOffset, this.hasDesignTimeConstructor, [this.state]);
-}
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
index 0e60476..ea156f3 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/simple_edit_handler.dart
@@ -29,7 +29,7 @@
       List<SourceEdit> edits) async {
     // If there are no edits to apply, just complete the command without going
     // back to the client.
-    if (edits.length == 0) {
+    if (edits.isEmpty) {
       return success();
     }
 
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 539a782..29a70ea 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
@@ -18,6 +18,7 @@
 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';
@@ -194,12 +195,19 @@
         int errorLine = lineInfo.getLocation(error.offset).lineNumber - 1;
         if (errorLine >= range.start.line && errorLine <= range.end.line) {
           var workspace = DartChangeWorkspace(server.currentSessions);
-          var context = new DartFixContextImpl(workspace, unit, error);
+          var context = new DartFixContextImpl(workspace, unit, error, (name) {
+            var tracker = server.declarationsTracker;
+            return TopLevelDeclarationsProvider(tracker).get(
+              unit.session.analysisContext,
+              unit.path,
+              name,
+            );
+          });
           final fixes = await fixContributor.computeFixes(context);
           if (fixes.isNotEmpty) {
             fixes.sort(Fix.SORT_BY_RELEVANCE);
 
-            final diagnostic = toDiagnostic(lineInfo, error);
+            final diagnostic = toDiagnostic(unit, error);
             codeActions.addAll(
               fixes.map((fix) => _createFixAction(fix, diagnostic)),
             );
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 52d8a9c..a41573e 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/handler_completion.dart
@@ -18,6 +18,7 @@
 import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:analyzer/src/services/available_declarations.dart';
 
 // If the client does not provide capabilities.completion.completionItemKind.valueSet
 // then we must never send a kind that's not in this list.
@@ -188,7 +189,12 @@
         includedSuggestionRelevanceTags
             .forEach((t) => tagBoosts[t.tag] = t.relevanceBoost);
 
-        final setResults = library.declarations
+        // Collect declarations and their children.
+        final allDeclarations = library.declarations
+            .followedBy(library.declarations.expand((decl) => decl.children))
+            .toList();
+
+        final setResults = allDeclarations
             // Filter to only the kinds we should return.
             .where((item) =>
                 includedElementKinds.contains(protocolElementKind(item.kind)))
@@ -200,7 +206,14 @@
           final declaringUri = item.parent != null
               ? item.parent.locationLibraryUri
               : item.locationLibraryUri;
-          final key = _createImportedSymbolKey(item.name, declaringUri);
+
+          // 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 there are either:
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 38c5c23..25b0e2d 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
@@ -61,7 +61,7 @@
     }
 
     // The label might be `MyEnum.myValue`, but we import only `MyEnum`.
-    var requestedName = item.label;
+    var requestedName = item.insertText ?? item.label;
     if (requestedName.contains('.')) {
       requestedName = requestedName.substring(
         0,
@@ -113,7 +113,7 @@
           );
         }
 
-        var newInsertText = item.label;
+        var newInsertText = item.insertText ?? item.label;
         final builder = DartChangeBuilder(session);
         await builder.addFileEdit(libraryPath, (builder) {
           final result = builder.importLibraryElement(
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 c53327a..38ae200 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
@@ -12,7 +12,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:analyzer/src/dart/analysis/search.dart' as search;
+import 'package:analysis_server/src/search/workspace_symbols.dart' as search;
 
 class WorkspaceSymbolHandler
     extends MessageHandler<WorkspaceSymbolParams, List<SymbolInformation>> {
@@ -50,17 +50,13 @@
     // huge numbers on large projects.
     var remainingResults = 500;
 
-    final declarations = <search.Declaration>[];
-    final filePathsHashSet = new LinkedHashSet<String>();
-    for (var driver in server.driverMap.values) {
-      final driverResults = await driver.search
-          .declarations(regex, remainingResults, filePathsHashSet);
-      if (token.isCancellationRequested) {
-        return cancelled();
-      }
-      declarations.addAll(driverResults);
-      remainingResults -= driverResults.length;
-    }
+    final filePathsHashSet = LinkedHashSet<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.
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 de88f0f..f54a863 100644
--- a/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
+++ b/pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
@@ -148,7 +148,7 @@
     this.sdkManager,
     this.instrumentationService, {
     DiagnosticServer diagnosticServer,
-    ResolverProvider packageResolverProvider: null,
+    ResolverProvider packageResolverProvider = null,
   }) : super(options, diagnosticServer, baseResourceProvider) {
     messageHandler = new UninitializedStateMessageHandler(this);
     // TODO(dantup): This code is almost identical to AnalysisServer, consider
@@ -600,8 +600,7 @@
       String path = result.path;
       if (analysisServer.shouldSendErrorsNotificationFor(path)) {
         final serverErrors = protocol.mapEngineErrors(
-            result.session.analysisContext.analysisOptions,
-            result.lineInfo,
+            result,
             result.errors
                 .where((e) => e.errorCode.type != ErrorType.TODO)
                 .toList(),
diff --git a/pkg/analysis_server/lib/src/lsp/mapping.dart b/pkg/analysis_server/lib/src/lsp/mapping.dart
index 469f150..8088f62 100644
--- a/pkg/analysis_server/lib/src/lsp/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/mapping.dart
@@ -22,11 +22,12 @@
 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/diagnostic/diagnostic.dart' as analyzer;
 import 'package:analyzer/error/error.dart' as server;
 import 'package:analyzer/source/line_info.dart' as server;
-import 'package:analyzer/src/dart/analysis/search.dart' as server
-    show DeclarationKind;
 import 'package:analyzer/src/generated/source.dart' as server;
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/services/available_declarations.dart' as dec;
@@ -152,7 +153,34 @@
   int replacementOffset,
   int replacementLength,
 ) {
-  final label = declaration.name;
+  // Build display labels and text to insert. insertText and filterText may
+  // differ from label (for ex. if the label includes things like (…)). If
+  // either are missing then label will be used by the client.
+  String label;
+  String insertText;
+  String filterText;
+  switch (declaration.kind) {
+    case DeclarationKind.ENUM_CONSTANT:
+      label = '${declaration.parent.name}.${declaration.name}';
+      break;
+    case DeclarationKind.CONSTRUCTOR:
+      label = declaration.parent.name;
+      if (declaration.name.isNotEmpty) {
+        label += '.${declaration.name}';
+      }
+      insertText = label;
+      filterText = label;
+      label += declaration.parameterNames?.isNotEmpty ?? false ? '(…)' : '()';
+      break;
+    case DeclarationKind.FUNCTION:
+      label = declaration.name;
+      insertText = label;
+      filterText = label;
+      label += declaration.parameterNames?.isNotEmpty ?? false ? '(…)' : '()';
+      break;
+    default:
+      label = declaration.name;
+  }
 
   final useDeprecated =
       completionCapabilities?.completionItem?.deprecatedSupport == true;
@@ -182,8 +210,8 @@
     //  10 -> 999990
     //   1 -> 999999
     (1000000 - itemRelevance).toString(),
-    null, // filterText uses label if not set
-    null, // insertText is deprecated, but also uses label if not set
+    filterText != label ? filterText : null, // filterText uses label if not set
+    insertText != label ? insertText : null, // insertText uses label if not set
     null, // insertTextFormat (we always use plain text so can ommit this)
     null, // textEdit - added on during resolve
     null, // additionalTextEdits, used for adding imports, etc.
@@ -540,9 +568,30 @@
   int replacementOffset,
   int replacementLength,
 ) {
-  final label = suggestion.displayText != null
-      ? suggestion.displayText
-      : suggestion.completion;
+  // Build display labels and text to insert. insertText and filterText may
+  // differ from label (for ex. if the label includes things like (…)). If
+  // either are missing then label will be used by the client.
+  String label;
+  String insertText;
+  String filterText;
+  if (suggestion.displayText != null) {
+    label = suggestion.displayText;
+    insertText = suggestion.completion;
+  } else {
+    switch (suggestion.element?.kind) {
+      case server.ElementKind.CONSTRUCTOR:
+      case server.ElementKind.FUNCTION:
+      case server.ElementKind.METHOD:
+        label = suggestion.completion;
+        // Label is the insert text plus the parens to indicate it's callable.
+        insertText = label;
+        filterText = label;
+        label += suggestion.parameterNames?.isNotEmpty ?? false ? '(…)' : '()';
+        break;
+      default:
+        label = suggestion.completion;
+    }
+  }
 
   final useDeprecated =
       completionCapabilities?.completionItem?.deprecatedSupport == true;
@@ -570,8 +619,8 @@
     //  10 -> 999990
     //   1 -> 999999
     (1000000 - suggestion.relevance).toString(),
-    null, // filterText uses label if not set
-    null, // insertText is deprecated, but also uses label if not set
+    filterText != label ? filterText : null, // filterText uses label if not set
+    insertText != label ? insertText : null, // insertText uses label if not set
     null, // insertTextFormat (we always use plain text so can ommit this)
     new lsp.TextEdit(
       // TODO(dantup): If `clientSupportsSnippets == true` then we should map
@@ -587,23 +636,51 @@
 }
 
 lsp.Diagnostic toDiagnostic(
-    server.LineInfo lineInfo, server.AnalysisError error,
+    server.ResolvedUnitResult result, server.AnalysisError error,
     [server.ErrorSeverity errorSeverity]) {
   server.ErrorCode errorCode = error.errorCode;
 
   // Default to the error's severity if none is specified.
   errorSeverity ??= errorCode.errorSeverity;
 
+  List<DiagnosticRelatedInformation> relatedInformation;
+  if (error.contextMessages.isNotEmpty) {
+    relatedInformation = error.contextMessages
+        .map((message) => toDiagnosticRelatedInformation(result, message))
+        .toList();
+  }
+
+  String message = error.message;
+  if (error.correctionMessage != null) {
+    message = '$message\n${error.correctionMessage}';
+  }
+
   return new lsp.Diagnostic(
-    toRange(lineInfo, error.offset, error.length),
+    toRange(result.lineInfo, error.offset, error.length),
     toDiagnosticSeverity(errorSeverity),
     errorCode.name.toLowerCase(),
     languageSourceName,
-    error.message,
-    null,
+    message,
+    relatedInformation,
   );
 }
 
+lsp.DiagnosticRelatedInformation toDiagnosticRelatedInformation(
+    server.ResolvedUnitResult result, analyzer.DiagnosticMessage message) {
+  String file = message.filePath;
+  server.LineInfo lineInfo = result.session.getFile(file).lineInfo;
+  return lsp.DiagnosticRelatedInformation(
+      lsp.Location(
+        Uri.file(file).toString(),
+        toRange(
+          lineInfo,
+          message.offset,
+          message.length,
+        ),
+      ),
+      message.message);
+}
+
 lsp.DiagnosticSeverity toDiagnosticSeverity(server.ErrorSeverity severity) {
   switch (severity) {
     case server.ErrorSeverity.ERROR:
@@ -664,7 +741,7 @@
 ErrorOr<int> toOffset(
   server.LineInfo lineInfo,
   lsp.Position pos, {
-  failureIsCritial: false,
+  failureIsCritial = false,
 }) {
   if (pos.line > lineInfo.lineCount) {
     return new ErrorOr<int>.error(new lsp.ResponseError(
diff --git a/pkg/analysis_server/lib/src/lsp/source_edits.dart b/pkg/analysis_server/lib/src/lsp/source_edits.dart
index a3361d9..bf82ccf 100644
--- a/pkg/analysis_server/lib/src/lsp/source_edits.dart
+++ b/pkg/analysis_server/lib/src/lsp/source_edits.dart
@@ -11,7 +11,7 @@
 ErrorOr<String> applyEdits(
   String oldContent,
   List<TextDocumentContentChangeEvent> changes, {
-  failureIsCritical: false,
+  failureIsCritical = false,
 }) {
   String newContent = oldContent;
   for (var change in changes) {
diff --git a/pkg/analysis_server/lib/src/plugin/result_merger.dart b/pkg/analysis_server/lib/src/plugin/result_merger.dart
index 1db0891..3d2438c 100644
--- a/pkg/analysis_server/lib/src/plugin/result_merger.dart
+++ b/pkg/analysis_server/lib/src/plugin/result_merger.dart
@@ -841,7 +841,7 @@
    */
   @visibleForTesting
   bool overlaps(int leftStart, int leftEnd, int rightStart, int rightEnd,
-      {bool allowNesting: false}) {
+      {bool allowNesting = false}) {
     if (leftEnd < rightStart || leftStart > rightEnd) {
       return false;
     }
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 07fcdd8..431f959 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -7,10 +7,12 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/search/search_engine.dart'
     as engine;
+import 'package:analyzer/dart/analysis/results.dart' as engine;
 import 'package:analyzer/dart/ast/ast.dart' as engine;
 import 'package:analyzer/dart/ast/visitor.dart' as engine;
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/dart/element/type.dart' as engine;
+import 'package:analyzer/diagnostic/diagnostic.dart' as engine;
 import 'package:analyzer/error/error.dart' as engine;
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/source/error_processor.dart';
@@ -32,11 +34,8 @@
  * errors.
  */
 List<AnalysisError> doAnalysisError_listFromEngine(
-    engine.AnalysisOptions analysisOptions,
-    engine.LineInfo lineInfo,
-    List<engine.AnalysisError> errors) {
-  return mapEngineErrors(
-      analysisOptions, lineInfo, errors, newAnalysisError_fromEngine);
+    engine.ResolvedUnitResult result) {
+  return mapEngineErrors(result, result.errors, newAnalysisError_fromEngine);
 }
 
 /**
@@ -53,7 +52,7 @@
  */
 void doSourceChange_addSourceEdit(
     SourceChange change, engine.Source source, SourceEdit edit,
-    {bool isNewFile: false}) {
+    {bool isNewFile = false}) {
   String file = source.fullName;
   change.addEdit(file, isNewFile ? -1 : 0, edit);
 }
@@ -79,12 +78,13 @@
  * Translates engine errors through the ErrorProcessor.
  */
 List<T> mapEngineErrors<T>(
-    engine.AnalysisOptions analysisOptions,
-    engine.LineInfo lineInfo,
+    engine.ResolvedUnitResult result,
     List<engine.AnalysisError> errors,
-    T Function(engine.LineInfo lineInfo, engine.AnalysisError error,
+    T Function(engine.ResolvedUnitResult result, engine.AnalysisError error,
             [engine.ErrorSeverity errorSeverity])
         constructor) {
+  engine.AnalysisOptions analysisOptions =
+      result.session.analysisContext.analysisOptions;
   List<T> serverErrors = <T>[];
   for (engine.AnalysisError error in errors) {
     ErrorProcessor processor =
@@ -94,10 +94,10 @@
       // Errors with null severity are filtered out.
       if (severity != null) {
         // Specified severities override.
-        serverErrors.add(constructor(lineInfo, error, severity));
+        serverErrors.add(constructor(result, error, severity));
       }
     } else {
-      serverErrors.add(constructor(lineInfo, error));
+      serverErrors.add(constructor(result, error));
     }
   }
   return serverErrors;
@@ -109,7 +109,7 @@
  * If an [errorSeverity] is specified, it will override the one in [error].
  */
 AnalysisError newAnalysisError_fromEngine(
-    engine.LineInfo lineInfo, engine.AnalysisError error,
+    engine.ResolvedUnitResult result, engine.AnalysisError error,
     [engine.ErrorSeverity errorSeverity]) {
   engine.ErrorCode errorCode = error.errorCode;
   // prepare location
@@ -120,6 +120,7 @@
     int length = error.length;
     int startLine = -1;
     int startColumn = -1;
+    engine.LineInfo lineInfo = result.lineInfo;
     if (lineInfo != null) {
       CharacterLocation lineLocation = lineInfo.getLocation(offset);
       if (lineLocation != null) {
@@ -138,11 +139,42 @@
   var type = new AnalysisErrorType(errorCode.type.name);
   String message = error.message;
   String code = errorCode.name.toLowerCase();
+  List<DiagnosticMessage> contextMessages;
+  if (error.contextMessages.isNotEmpty) {
+    contextMessages = error.contextMessages
+        .map((message) => newDiagnosticMessage(result, message))
+        .toList();
+  }
   String correction = error.correction;
   bool fix = hasFix(error.errorCode);
   String url = errorCode.url;
   return new AnalysisError(severity, type, location, message, code,
-      correction: correction, hasFix: fix, url: url);
+      contextMessages: contextMessages,
+      correction: correction,
+      hasFix: fix,
+      url: url);
+}
+
+/**
+ * Create a DiagnosticMessage based on an [engine.DiagnosticMessage].
+ */
+DiagnosticMessage newDiagnosticMessage(
+    engine.ResolvedUnitResult result, engine.DiagnosticMessage message) {
+  String file = message.filePath;
+  int offset = message.offset;
+  int length = message.length;
+  int startLine = -1;
+  int startColumn = -1;
+  engine.LineInfo lineInfo = result.session.getFile(file).lineInfo;
+  if (lineInfo != null) {
+    CharacterLocation lineLocation = lineInfo.getLocation(offset);
+    if (lineLocation != null) {
+      startLine = lineLocation.lineNumber;
+      startColumn = lineLocation.columnNumber;
+    }
+  }
+  return DiagnosticMessage(
+      message.message, Location(file, offset, length, startLine, startColumn));
 }
 
 /**
diff --git a/pkg/analysis_server/lib/src/search/search_domain.dart b/pkg/analysis_server/lib/src/search/search_domain.dart
index ae98245..4e6b2ee 100644
--- a/pkg/analysis_server/lib/src/search/search_domain.dart
+++ b/pkg/analysis_server/lib/src/search/search_domain.dart
@@ -10,9 +10,9 @@
 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:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/analysis/search.dart' as search;
 
 /**
  * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
@@ -155,9 +155,6 @@
       }
     }
 
-    var files = new LinkedHashSet<String>();
-    var declarations = <search.Declaration>[];
-
     protocol.ElementKind getElementKind(search.DeclarationKind kind) {
       switch (kind) {
         case search.DeclarationKind.CLASS:
@@ -191,20 +188,15 @@
       }
     }
 
+    var tracker = server.declarationsTracker;
+    var files = LinkedHashSet<String>();
     int remainingMaxResults = params.maxResults;
-    for (var driver in server.driverMap.values.toList()) {
-      var driverDeclarations = await driver.search.declarations(
-          regExp, remainingMaxResults, files,
-          onlyForFile: params.file);
-      declarations.addAll(driverDeclarations);
-
-      if (remainingMaxResults != null) {
-        remainingMaxResults -= driverDeclarations.length;
-        if (remainingMaxResults <= 0) {
-          break;
-        }
-      }
-    }
+    var declarations = search.WorkspaceSymbols(tracker).declarations(
+      regExp,
+      remainingMaxResults,
+      files,
+      onlyForFile: params.file,
+    );
 
     List<protocol.ElementDeclaration> elementDeclarations =
         declarations.map((declaration) {
diff --git a/pkg/analysis_server/lib/src/search/workspace_symbols.dart b/pkg/analysis_server/lib/src/search/workspace_symbols.dart
new file mode 100644
index 0000000..cdc08cb
--- /dev/null
+++ b/pkg/analysis_server/lib/src/search/workspace_symbols.dart
@@ -0,0 +1,189 @@
+// 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:collection';
+
+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,
+  FIELD,
+  FUNCTION,
+  FUNCTION_TYPE_ALIAS,
+  GETTER,
+  METHOD,
+  MIXIN,
+  SETTER,
+  VARIABLE
+}
+
+class WorkspaceSymbols {
+  final DeclarationsTracker tracker;
+
+  WorkspaceSymbols(this.tracker);
+
+  List<Declaration> declarations(
+      RegExp regExp, int maxResults, LinkedHashSet<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;
+      }
+
+      String className;
+      if (declaration.parent?.kind == ad.DeclarationKind.CLASS) {
+        className = declaration.parent.name;
+      }
+
+      String mixinName;
+      if (declaration.parent?.kind == ad.DeclarationKind.MIXIN) {
+        mixinName = declaration.parent.name;
+      }
+
+      declarations.add(
+        new Declaration(
+          getPathIndex(path),
+          declaration.lineInfo,
+          name,
+          _getTopKind(declaration.kind),
+          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 {}
+
+    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.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.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/driver.dart b/pkg/analysis_server/lib/src/server/driver.dart
index af93a95..cecf404 100644
--- a/pkg/analysis_server/lib/src/server/driver.dart
+++ b/pkg/analysis_server/lib/src/server/driver.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
+import 'dart:ffi' as ffi;
 import 'dart:io';
 import 'dart:math';
 
@@ -18,6 +19,7 @@
 import 'package:analysis_server/src/server/http_server.dart';
 import 'package:analysis_server/src/server/lsp_stdio_server.dart';
 import 'package:analysis_server/src/server/stdio_server.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_ranking.dart';
 import 'package:analysis_server/src/services/completion/dart/uri_contributor.dart'
     show UriContributor;
 import 'package:analysis_server/src/socket_server.dart';
@@ -58,10 +60,10 @@
   void addFlag(String name,
       {String abbr,
       String help,
-      bool defaultsTo: false,
-      bool negatable: true,
+      bool defaultsTo = false,
+      bool negatable = true,
       void callback(bool value),
-      bool hide: false}) {
+      bool hide = false}) {
     _knownFlags.add(name);
     _parser.addFlag(name,
         abbr: abbr,
@@ -285,6 +287,12 @@
   static const String USE_LSP = "lsp";
 
   /**
+   * The path on disk to a directory containing language model files for smart
+   * code completion.
+   */
+  static const String COMPLETION_MODEL_FOLDER = "completion-model";
+
+  /**
    * The name of the flag to use summary2.
    */
   static const String USE_SUMMARY2 = "use-summary2";
@@ -339,6 +347,8 @@
     analysisServerOptions.cacheFolder = results[CACHE_FOLDER];
     analysisServerOptions.useFastaParser = results[USE_FASTA_PARSER];
     analysisServerOptions.useLanguageServerProtocol = results[USE_LSP];
+    analysisServerOptions.completionModelFolder =
+        results[COMPLETION_MODEL_FOLDER];
     AnalysisDriver.useSummary2 = results[USE_SUMMARY2];
 
     bool disableAnalyticsForSession = results[SUPPRESS_ANALYTICS_FLAG];
@@ -550,6 +560,7 @@
           socketServer.analysisServer.shutdown();
           exit(0);
         });
+        startCompletionRanking(socketServer, null, analysisServerOptions);
       },
           print: results[INTERNAL_PRINT_TO_CONSOLE]
               ? null
@@ -595,9 +606,38 @@
           exit(0);
         }
       });
+      startCompletionRanking(null, socketServer, analysisServerOptions);
     });
   }
 
+  /// This will be invoked after createAnalysisServer has been called on the
+  /// socket server. At that point, we'll be able to send a server.error
+  /// notification in case model startup fails.
+  void startCompletionRanking(
+      SocketServer socketServer,
+      LspSocketServer lspSocketServer,
+      AnalysisServerOptions analysisServerOptions) {
+    if (analysisServerOptions.completionModelFolder != null &&
+        ffi.sizeOf<ffi.IntPtr>() != 4) {
+      // Start completion model isolate if this is a 64 bit system and
+      // analysis server was configured to load a language model on disk.
+      CompletionRanking.instance =
+          CompletionRanking(analysisServerOptions.completionModelFolder);
+      CompletionRanking.instance.start().catchError((error) {
+        // Disable smart ranking if model startup fails.
+        analysisServerOptions.completionModelFolder = null;
+        CompletionRanking.instance = null;
+        if (socketServer != null) {
+          socketServer.analysisServer.sendServerErrorNotification(
+              'Failed to start ranking model isolate', error, error.stackTrace);
+        } else {
+          lspSocketServer.analysisServer.sendServerErrorNotification(
+              'Failed to start ranking model isolate', error, error.stackTrace);
+        }
+      });
+    }
+  }
+
   /**
    * Execute the given [callback] within a zone that will capture any unhandled
    * exceptions and both report them to the client and send them to the given
@@ -722,6 +762,8 @@
         help: "Whether to enable parsing via the Fasta parser");
     parser.addFlag(USE_LSP,
         defaultsTo: false, help: "Whether to use the Language Server Protocol");
+    parser.addOption(COMPLETION_MODEL_FOLDER,
+        help: "[path] path to the location of a code completion model");
     parser.addFlag(USE_SUMMARY2,
         defaultsTo: false, help: "Whether to use summary2");
     parser.addOption(TRAIN_USING,
@@ -765,7 +807,7 @@
    * Print information about how to use the server.
    */
   void _printUsage(ArgParser parser, telemetry.Analytics analytics,
-      {bool fromHelp: false}) {
+      {bool fromHelp = false}) {
     print('Usage: $BINARY_NAME [flags]');
     print('');
     print('Supported flags are:');
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 61df502..f3e4441 100644
--- a/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
+++ b/pkg/analysis_server/lib/src/services/completion/completion_performance.dart
@@ -23,7 +23,7 @@
   }
 
   int get elapsedInMilliseconds =>
-      operations.length > 0 ? operations.last.elapsed.inMilliseconds : 0;
+      operations.isNotEmpty ? operations.last.elapsed.inMilliseconds : 0;
 
   String get suggestionCount {
     if (notificationCount < 1) return '';
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 a18befb..8ba55c3 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
@@ -41,7 +41,7 @@
     if (entity == node.rightParenthesis) {
       return true;
     }
-    if (node.arguments.length > 0 && node.arguments.last == entity) {
+    if (node.arguments.isNotEmpty && node.arguments.last == entity) {
       return entity is SimpleIdentifier;
     }
   }
@@ -172,7 +172,7 @@
       ParameterElement parameter, bool appendColon, bool appendComma) {
     String name = parameter.name;
     String type = parameter.type?.displayName;
-    if (name != null && name.length > 0 && !namedArgs.contains(name)) {
+    if (name != null && name.isNotEmpty && !namedArgs.contains(name)) {
       String completion = name;
       if (appendColon) {
         completion += ': ';
@@ -220,7 +220,7 @@
   }
 
   void _addSuggestions(Iterable<ParameterElement> parameters) {
-    if (parameters == null || parameters.length == 0) {
+    if (parameters == null || parameters.isEmpty) {
       return;
     }
     Iterable<ParameterElement> requiredParam =
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 ff5c730..fecfc80 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
@@ -13,6 +13,7 @@
 import 'package:analysis_server/src/services/completion/dart/arglist_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/combinator_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/common_usage_sorter.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_ranking.dart';
 import 'package:analysis_server/src/services/completion/dart/contribution_sorter.dart';
 import 'package:analysis_server/src/services/completion/dart/field_formal_contributor.dart';
 import 'package:analysis_server/src/services/completion/dart/imported_reference_contributor.dart';
@@ -93,6 +94,10 @@
       return const <CompletionSuggestion>[];
     }
 
+    final ranking = CompletionRanking.instance;
+    Future<Map<String, double>> probabilityFuture =
+        ranking != null ? ranking.predict(dartRequest) : Future.value(null);
+
     SourceRange range =
         dartRequest.target.computeReplacementRange(dartRequest.offset);
     (request as CompletionRequestImpl)
@@ -173,6 +178,14 @@
     const SORT_TAG = 'DartCompletionManager - sort';
     performance.logStartTime(SORT_TAG);
     await contributionSorter.sort(dartRequest, suggestions);
+    if (ranking != null) {
+      suggestions = await ranking.rerank(
+          probabilityFuture,
+          suggestions,
+          includedSuggestionRelevanceTags,
+          dartRequest,
+          request.result.unit.featureSet);
+    }
     performance.logElapseTime(SORT_TAG);
     request.checkAborted();
     return suggestions;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart
new file mode 100644
index 0000000..cfb01cc
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking.dart
@@ -0,0 +1,185 @@
+// 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 'dart:isolate';
+
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_ranking_internal.dart';
+import 'package:analysis_server/src/services/completion/dart/language_model.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+
+/// Number of lookback tokens.
+const int _LOOKBACK = 100;
+
+/// Minimum probability to prioritize model-only suggestion.
+const double _MODEL_RELEVANCE_CUTOFF = 0.5;
+
+/// Prediction service run by the model isolate.
+void entrypoint(SendPort sendPort) {
+  LanguageModel model;
+  final port = ReceivePort();
+  sendPort.send(port.sendPort);
+  port.listen((message) {
+    Map<String, Map<String, double>> response = {};
+    switch (message['method']) {
+      case 'load':
+        model = LanguageModel.load(message['args'][0]);
+        break;
+      case 'predict':
+        response['data'] = model.predictWithScores(message['args']);
+        break;
+    }
+
+    message['port'].send(response);
+  });
+}
+
+class CompletionRanking {
+  /// Singleton instance.
+  static CompletionRanking instance;
+
+  /// Filesystem location of model files.
+  final String _directory;
+
+  /// Port to communicate from main to model isolate.
+  SendPort _write;
+
+  CompletionRanking(this._directory);
+
+  /// Send an RPC to the isolate worker and wait for it to respond.
+  Future<Map<String, Map<String, double>>> makeRequest(
+      String method, List<String> args) async {
+    final port = ReceivePort();
+    _write.send({
+      'method': method,
+      'args': args,
+      'port': port.sendPort,
+    });
+    return await port.first;
+  }
+
+  /// Makes a next-token prediction starting at the completion request
+  /// cursor and walking back to find previous input tokens.
+  Future<Map<String, double>> predict(DartCompletionRequest request) async {
+    final query = constructQuery(request, _LOOKBACK);
+    if (query == null) {
+      return Future.value(null);
+    }
+
+    final response = await makeRequest('predict', query);
+    return response['data'];
+  }
+
+  /// Transforms [CompletionSuggestion] relevances and
+  /// [IncludedSuggestionRelevanceTag] relevanceBoosts based on language model
+  /// predicted next-token probability distribution.
+  Future<List<CompletionSuggestion>> rerank(
+      Future<Map<String, double>> probabilityFuture,
+      List<CompletionSuggestion> suggestions,
+      List<IncludedSuggestionRelevanceTag> includedSuggestionRelevanceTags,
+      DartCompletionRequest request,
+      FeatureSet featureSet) async {
+    final probability = await probabilityFuture
+        .timeout(const Duration(milliseconds: 500), onTimeout: () => null);
+    if (probability == null || probability.isEmpty) {
+      // Failed to compute probability distribution, don't rerank.
+      return suggestions;
+    }
+
+    // Discard the type-based relevance boosts.
+    if (includedSuggestionRelevanceTags != null) {
+      includedSuggestionRelevanceTags.forEach((tag) {
+        tag.relevanceBoost = 0;
+      });
+    }
+
+    // Intersection between static analysis and model suggestions.
+    var middle = DART_RELEVANCE_HIGH + probability.length;
+    // Up to one suggestion from model with very high confidence.
+    var high = middle + probability.length;
+    // Lower relevance, model-only suggestions (perhaps literals).
+    var low = DART_RELEVANCE_LOW - 1;
+
+    List<MapEntry> entries = probability.entries.toList()
+      ..sort((a, b) => b.value.compareTo(a.value));
+
+    if (testInsideQuotes(request)) {
+      // If completion is requested inside of quotes, remove any suggestions
+      // which are not string literal.
+      entries = entries
+          .where((MapEntry entry) =>
+              isStringLiteral(entry.key) && isNotWhitespace(entry.key))
+          .toList();
+    } else if (request.opType.includeVarNameSuggestions &&
+        suggestions.every((CompletionSuggestion suggestion) =>
+            suggestion.kind == CompletionSuggestionKind.IDENTIFIER)) {
+      // If analysis server thinks this is a declaration context,
+      // remove all of the model-suggested literals.
+      // TODO(lambdabaa): Ask Brian for help leveraging
+      //     SimpleIdentifier#inDeclarationContext.
+      entries.retainWhere((MapEntry entry) => !isLiteral(entry.key));
+    }
+
+    var isRequestFollowingDot = testFollowingDot(request);
+    entries.forEach((MapEntry entry) {
+      // There may be multiple like
+      // CompletionSuggestion and CompletionSuggestion().
+      final completionSuggestions = suggestions.where((suggestion) =>
+          areCompletionsEquivalent(suggestion.completion, entry.key));
+      List<IncludedSuggestionRelevanceTag> includedSuggestions;
+      if (includedSuggestionRelevanceTags != null) {
+        includedSuggestions = includedSuggestionRelevanceTags
+            .where((tag) => areCompletionsEquivalent(
+                elementNameFromRelevanceTag(tag.tag), entry.key))
+            .toList();
+      } else {
+        includedSuggestions = [];
+      }
+      if (!isRequestFollowingDot && entry.value > _MODEL_RELEVANCE_CUTOFF) {
+        final relevance = high--;
+        if (completionSuggestions.isNotEmpty ||
+            includedSuggestions.isNotEmpty) {
+          completionSuggestions.forEach((completionSuggestion) {
+            completionSuggestion.relevance = relevance;
+          });
+          includedSuggestions.forEach((includedSuggestion) {
+            includedSuggestion.relevanceBoost = relevance;
+          });
+        } else {
+          suggestions
+              .add(createCompletionSuggestion(entry.key, featureSet, high--));
+          includedSuggestionRelevanceTags
+              .add(IncludedSuggestionRelevanceTag(entry.key, relevance));
+        }
+      } else if (completionSuggestions.isNotEmpty ||
+          includedSuggestions.isNotEmpty) {
+        final relevance = middle--;
+        completionSuggestions.forEach((completionSuggestion) {
+          completionSuggestion.relevance = relevance;
+        });
+        includedSuggestions.forEach((includedSuggestion) {
+          includedSuggestion.relevanceBoost = relevance;
+        });
+      } else if (!isRequestFollowingDot) {
+        final relevance = low--;
+        suggestions
+            .add(createCompletionSuggestion(entry.key, featureSet, relevance));
+        includedSuggestionRelevanceTags
+            .add(IncludedSuggestionRelevanceTag(entry.key, relevance));
+      }
+    });
+
+    return suggestions;
+  }
+
+  /// Spins up the model isolate and tells it to load the tflite model.
+  Future<void> start() async {
+    final port = ReceivePort();
+    await Isolate.spawn(entrypoint, port.sendPort);
+    this._write = await port.first;
+    await makeRequest('load', [_directory]);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart
new file mode 100644
index 0000000..9ec82f9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/dart/completion_ranking_internal.dart
@@ -0,0 +1,181 @@
+// 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:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/correction/util.dart';
+import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+
+/// Constructs a [CompletionSuggestion] object.
+CompletionSuggestion createCompletionSuggestion(
+    String completion, FeatureSet featureSet, int relevance) {
+  final tokens = TokenUtils.getTokens(completion, featureSet);
+  final token = tokens.isNotEmpty ? tokens[0] : null;
+  final completionKind = token != null && token.isKeyword
+      ? CompletionSuggestionKind.KEYWORD
+      : CompletionSuggestionKind.IDENTIFIER;
+  if (isLiteral(completion) &&
+      (completion.startsWith('"package:') ||
+          completion.startsWith('\'package:'))) {
+    completion = completion.replaceAll('\'', '').replaceAll('\"', '');
+  }
+  return CompletionSuggestion(completionKind, relevance, completion,
+      completion.length, 0, false, false);
+}
+
+/// Finds the token at which completion was requested.
+Token getCursorToken(DartCompletionRequest request) {
+  final entity = request.target.entity;
+  if (entity is AstNode) {
+    return entity.endToken;
+  }
+  return entity is Token ? entity : null;
+}
+
+/// Fuzzy matching between static analysis and model-predicted lexemes
+/// that considers pairs like "main" and "main()" to be equal.
+bool areCompletionsEquivalent(String dasCompletion, String modelCompletion) {
+  if (dasCompletion == null || modelCompletion == null) {
+    return false;
+  }
+  if (dasCompletion == modelCompletion) {
+    return true;
+  }
+
+  final index = dasCompletion.indexOf(new RegExp(r'[^0-9A-Za-z_]'));
+  // Disallow '.' since this gives all methods under a model-predicted token
+  // the same probability.
+  if (index == -1 || dasCompletion[index] == '.') {
+    return false;
+  }
+
+  // Checks that the strings are equal until the first non-alphanumeric token.
+  return dasCompletion.substring(0, index) == modelCompletion;
+}
+
+/// Step to previous token until we are at the first token before where the
+/// cursor is located.
+bool isStopToken(Token token, int cursorOffset) {
+  if (token == null) {
+    return true;
+  }
+  if (token.isSynthetic && !token.isEof) {
+    return false;
+  }
+  final position = token.offset + token.length;
+  if (position == cursorOffset) {
+    // If we are at the end of some token, step to previous only if the
+    // token is NOT an identifier, keyword, or literal. The rationale is that
+    // we want to keep moving if we have a situation like
+    // FooBar foo^ since foo is not a previous token to pass to the model.
+    return token.lexeme[token.lexeme.length - 1]
+        .contains(new RegExp(r'[0-9A-Za-z_]'));
+  }
+  // Stop if the token's location is strictly before the cursor, continue
+  // if the token's location is strictly after.
+  return position < cursorOffset;
+}
+
+bool isStringLiteral(String lexeme) {
+  if (lexeme == null || lexeme.isEmpty) {
+    return false;
+  }
+  return (lexeme.length > 1 && lexeme[0] == "'") ||
+      (lexeme.length > 2 && lexeme[0] == 'r' && lexeme[1] == "'");
+}
+
+bool isLiteral(String lexeme) {
+  if (lexeme == null || lexeme.isEmpty) {
+    return false;
+  }
+  if (new RegExp(r'^[0-9]+$').hasMatch(lexeme)) {
+    // Check for number lexeme.
+    return true;
+  }
+  return isStringLiteral(lexeme);
+}
+
+bool isNotWhitespace(String lexeme) {
+  return lexeme
+      .replaceAll("'", '')
+      .split('')
+      .any((String chr) => !new RegExp(r'\s').hasMatch(chr));
+}
+
+Token getCurrentToken(DartCompletionRequest request) {
+  var token = getCursorToken(request);
+  while (!isStopToken(token.previous, request.offset)) {
+    token = token.previous;
+  }
+  return token;
+}
+
+bool testInsideQuotes(DartCompletionRequest request) {
+  final token = getCurrentToken(request);
+  if (token.isSynthetic) {
+    return false;
+  }
+
+  final cursorOffset = request.offset;
+  if (cursorOffset == token.offset ||
+      cursorOffset == token.offset + token.length) {
+    // We are not inside the current token, quoted or otherwise.
+    return false;
+  }
+
+  final lexeme = token.lexeme;
+  if (lexeme.length > 2 && lexeme[0] == 'r') {
+    return lexeme[1] == "'" || lexeme[1] == '"';
+  }
+
+  return lexeme.length > 1 && (lexeme[0] == "'" || lexeme[0] == '"');
+}
+
+bool isTokenDot(Token token) {
+  return !token.isSynthetic && token.lexeme.endsWith('.');
+}
+
+bool testFollowingDot(DartCompletionRequest request) {
+  final token = getCurrentToken(request);
+  return isTokenDot(token) || isTokenDot(token.previous);
+}
+
+/// Finds the previous n tokens occurring before the cursor.
+List<String> constructQuery(DartCompletionRequest request, int n) {
+  var token = getCursorToken(request);
+  if (request.offset == null) {
+    return null;
+  }
+
+  while (!isStopToken(token, request.offset)) {
+    token = token.previous;
+  }
+
+  if (token?.offset == null || token?.type == null) {
+    return null;
+  }
+
+  final result = List<String>();
+  for (var size = 0; size < n && !token.isEof; token = token.previous) {
+    if (!token.isSynthetic) {
+      result.add(token.lexeme);
+      size += 1;
+    }
+  }
+
+  return result.reversed.toList(growable: false);
+}
+
+/// Maps included relevance tags formatted as
+/// '${element.librarySource.uri}::${element.name}' to element.name.
+String elementNameFromRelevanceTag(String tag) {
+  final index = tag.lastIndexOf('::');
+  if (index == -1) {
+    return null;
+  }
+
+  return tag.substring(index + 2);
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
index 64ed46a..2b1de7a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/field_formal_contributor.dart
@@ -44,7 +44,7 @@
         SimpleIdentifier fieldId = param.identifier;
         if (fieldId != null && fieldId != request.target.entity) {
           String fieldName = fieldId.name;
-          if (fieldName != null && fieldName.length > 0) {
+          if (fieldName != null && fieldName.isNotEmpty) {
             referencedFields.add(fieldName);
           }
         }
@@ -61,7 +61,7 @@
           SimpleIdentifier fieldId = varDecl.name;
           if (fieldId != null) {
             String fieldName = fieldId.name;
-            if (fieldName != null && fieldName.length > 0) {
+            if (fieldName != null && fieldName.isNotEmpty) {
               if (!referencedFields.contains(fieldName)) {
                 CompletionSuggestion suggestion = createSuggestion(
                     fieldId.staticElement,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
index 6a9d22b..2afa953 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/inherited_reference_contributor.dart
@@ -77,7 +77,7 @@
   }
 
   _addSuggestionsForType(InterfaceType type, DartCompletionRequest request,
-      {bool isFunctionalArgument: false}) {
+      {bool isFunctionalArgument = false}) {
     OpType opType = request.opType;
     if (!isFunctionalArgument) {
       for (PropertyAccessorElement elem in type.accessors) {
@@ -110,7 +110,7 @@
 
   List<CompletionSuggestion> _computeSuggestionsForClass2(
       ClassElement classElement, DartCompletionRequest request,
-      {bool skipChildClass: true}) {
+      {bool skipChildClass = true}) {
     bool isFunctionalArgument = request.target.isFunctionalArgument();
     kind = isFunctionalArgument
         ? CompletionSuggestionKind.IDENTIFIER
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index b68e34a..4ef2e9f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -194,6 +194,15 @@
         return;
       }
     }
+    if (previousMember is ExtensionDeclaration) {
+      if (previousMember.leftBracket == null ||
+          previousMember.leftBracket.isSynthetic) {
+        // If the prior member is an unfinished extension declaration then the
+        // user is probably finishing that.
+        _addExtensionDeclarationKeywords(previousMember);
+        return;
+      }
+    }
     if (previousMember is MixinDeclaration) {
       if (previousMember.leftBracket == null ||
           previousMember.leftBracket.isSynthetic) {
@@ -283,6 +292,21 @@
   }
 
   @override
+  visitExtensionDeclaration(ExtensionDeclaration node) {
+    // Don't suggest extension name
+    if (entity == node.name) {
+      return;
+    }
+    if (entity == node.rightBracket) {
+      _addExtensionBodyKeywords();
+    } else if (entity is ClassMember) {
+      _addExtensionBodyKeywords();
+    } else {
+      _addExtensionDeclarationKeywords(node);
+    }
+  }
+
+  @override
   visitFieldDeclaration(FieldDeclaration node) {
     VariableDeclarationList fields = node.fields;
     if (entity != fields) {
@@ -660,6 +684,23 @@
     }
   }
 
+  void _addExtensionBodyKeywords() {
+    _addSuggestions([
+      Keyword.CONST,
+      Keyword.DYNAMIC,
+      Keyword.FINAL,
+      Keyword.GET,
+      Keyword.OPERATOR,
+      Keyword.SET,
+      Keyword.STATIC,
+      Keyword.VAR,
+      Keyword.VOID
+    ]);
+    if (request.featureSet.isEnabled(Feature.non_nullable)) {
+      _addSuggestion(Keyword.LATE);
+    }
+  }
+
   void _addClassDeclarationKeywords(ClassDeclaration node) {
     // Very simplistic suggestion because analyzer will warn if
     // the extends / with / implements keywords are out of order
@@ -694,6 +735,9 @@
       Keyword.VAR,
       Keyword.VOID
     ], DART_RELEVANCE_HIGH);
+    if (request.featureSet.isEnabled(Feature.extension_methods)) {
+      _addSuggestion(Keyword.EXTENSION, DART_RELEVANCE_HIGH);
+    }
     if (request.featureSet.isEnabled(Feature.non_nullable)) {
       _addSuggestion(Keyword.LATE, DART_RELEVANCE_HIGH);
     }
@@ -715,6 +759,12 @@
     }
   }
 
+  void _addExtensionDeclarationKeywords(ExtensionDeclaration node) {
+    if (node.onKeyword == null || node.onKeyword.isSynthetic) {
+      _addSuggestion(Keyword.ON, DART_RELEVANCE_HIGH);
+    }
+  }
+
   void _addImportDirectiveKeywords(ImportDirective node) {
     bool hasDeferredKeyword = node.deferredKeyword != null;
     bool hasAsKeyword = node.asKeyword != null;
@@ -794,7 +844,7 @@
   }
 
   void _addSuggestion2(String completion,
-      {int offset, int relevance: DART_RELEVANCE_KEYWORD}) {
+      {int offset, int relevance = DART_RELEVANCE_KEYWORD}) {
     if (offset == null) {
       offset = completion.length;
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
index 77b4ebf..8076baf 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/label_contributor.dart
@@ -145,7 +145,7 @@
   CompletionSuggestion _addSuggestion(SimpleIdentifier id) {
     if (id != null) {
       String completion = id.name;
-      if (completion != null && completion.length > 0 && completion != '_') {
+      if (completion != null && completion.isNotEmpty && completion != '_') {
         CompletionSuggestion suggestion = new CompletionSuggestion(
             CompletionSuggestionKind.IDENTIFIER,
             DART_RELEVANCE_DEFAULT,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/language_model.dart b/pkg/analysis_server/lib/src/services/completion/dart/language_model.dart
new file mode 100644
index 0000000..71c209a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/completion/dart/language_model.dart
@@ -0,0 +1,110 @@
+// 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';
+import 'dart:convert';
+import 'dart:typed_data';
+
+import 'package:path/path.dart' as path;
+import 'package:quiver/check.dart';
+import 'package:tflite_native/tflite.dart' as tfl;
+
+/// Interface to TensorFlow-based Dart language model for next-token prediction.
+class LanguageModel {
+  static const _defaultCompletions = 100;
+
+  final tfl.Interpreter _interpreter;
+  final Map<String, int> _word2idx;
+  final Map<int, String> _idx2word;
+  final int _lookback;
+
+  LanguageModel._(
+      this._interpreter, this._word2idx, this._idx2word, this._lookback);
+
+  /// Number of previous tokens to look at during predictions.
+  int get lookback => _lookback;
+
+  /// Number of completion results to return during predictions.
+  int get completions => _defaultCompletions;
+
+  /// Load model from directory.
+  factory LanguageModel.load(String directory) {
+    // Load model.
+    final interpreter =
+        tfl.Interpreter.fromFile(path.join(directory, 'model.tflite'));
+    interpreter.allocateTensors();
+
+    // Load word2idx mapping for input.
+    final word2idx = json
+        .decode(File(path.join(directory, 'word2idx.json')).readAsStringSync())
+        .cast<String, int>();
+
+    // Load idx2word mapping for output.
+    final idx2word = json
+        .decode(File(path.join(directory, 'idx2word.json')).readAsStringSync())
+        .map<int, String>((k, v) => MapEntry<int, String>(int.parse(k), v));
+
+    // Get lookback size from model input tensor shape.
+    final tensorShape = interpreter.getInputTensors().single.shape;
+    checkArgument(tensorShape.length == 2 && tensorShape.first == 1,
+        message:
+            'tensor shape $tensorShape does not match the expected [1, X]');
+    final lookback = tensorShape.last;
+
+    return LanguageModel._(interpreter, word2idx, idx2word, lookback);
+  }
+
+  /// Tear down the interpreter.
+  void close() {
+    _interpreter.delete();
+  }
+
+  /// Predicts the next token to follow a list of precedent tokens
+  ///
+  /// Returns a list of tokens, sorted by most probable first.
+  List<String> predict(Iterable<String> tokens) =>
+      predictWithScores(tokens).keys.toList();
+
+  /// Predicts the next token with confidence scores.
+  ///
+  /// Returns an ordered map of tokens to scores, sorted by most probable first.
+  Map<String, double> predictWithScores(Iterable<String> tokens) {
+    final tensorIn = _interpreter.getInputTensors().single;
+    tensorIn.data = _transformInput(tokens);
+    _interpreter.invoke();
+    final tensorOut = _interpreter.getOutputTensors().single;
+    return _transformOutput(tensorOut.data);
+  }
+
+  /// Transforms tokens to data bytes that can be used as interpreter input.
+  List<int> _transformInput(Iterable<String> tokens) {
+    // Replace out of vocabulary tokens.
+    final sanitizedTokens = tokens
+        .map((token) => _word2idx.containsKey(token) ? token : '<unknown>');
+
+    // Get indexes (as floats).
+    final indexes = Float32List(lookback)
+      ..setAll(0, sanitizedTokens.map((token) => _word2idx[token].toDouble()));
+
+    // Get bytes
+    return Uint8List.view(indexes.buffer);
+  }
+
+  /// Transforms interpreter output data to map of tokens to scores.
+  Map<String, double> _transformOutput(List<int> databytes) {
+    // Get bytes.
+    final bytes = Uint8List.fromList(databytes);
+
+    // Get scores (as floats)
+    final probabilities = Float32List.view(bytes.buffer);
+
+    // Get indexes with scores, sorted by scores (descending)
+    final entries = probabilities.asMap().entries.toList()
+      ..sort((a, b) => b.value.compareTo(a.value));
+
+    // Get tokens with scores, limiting the length.
+    return Map.fromEntries(entries.sublist(0, completions))
+        .map((k, v) => MapEntry(_idx2word[k], v));
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
index e9d2506..51a5a04 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/library_prefix_contributor.dart
@@ -33,7 +33,7 @@
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
     for (ImportElement element in imports) {
       String completion = element.prefix?.name;
-      if (completion != null && completion.length > 0) {
+      if (completion != null && completion.isNotEmpty) {
         LibraryElement libElem = element.importedLibrary;
         if (libElem != null) {
           CompletionSuggestion suggestion = createSuggestion(libElem,
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
index 3318bb5..9e548cc 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_constructor_contributor.dart
@@ -127,7 +127,7 @@
       }
 
       String name = constructorDecl.name?.name;
-      if (name != null && name.length > 0) {
+      if (name != null && name.isNotEmpty) {
         completion = '$completion.$name';
       }
 
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 f881357..942b514 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
@@ -169,8 +169,8 @@
           createSuggestion(constructor, relevance: relevance);
       if (suggestion != null) {
         String name = suggestion.completion;
-        name = name.length > 0 ? '$className.$name' : className;
-        if (prefix != null && prefix.length > 0) {
+        name = name.isNotEmpty ? '$className.$name' : className;
+        if (prefix != null && prefix.isNotEmpty) {
           name = '$prefix.$name';
         }
         suggestion.completion = name;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index c24de75..c058170 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -349,12 +349,12 @@
 
   void _addLocalSuggestion(Comment documentationComment, SimpleIdentifier id,
       TypeAnnotation typeName, protocol.ElementKind elemKind,
-      {bool isAbstract: false,
-      bool isDeprecated: false,
+      {bool isAbstract = false,
+      bool isDeprecated = false,
       ClassOrMixinDeclaration classDecl,
       CompletionSuggestionKind kind,
       FormalParameterList param,
-      int relevance: DART_RELEVANCE_DEFAULT}) {
+      int relevance = DART_RELEVANCE_DEFAULT}) {
     kind ??= targetIsFunctionalArgument
         ? CompletionSuggestionKind.IDENTIFIER
         : optype.suggestKind;
@@ -384,9 +384,9 @@
   void _addLocalSuggestion_enumConstant(
       EnumConstantDeclaration constantDeclaration,
       EnumDeclaration enumDeclaration,
-      {bool isAbstract: false,
-      bool isDeprecated: false,
-      int relevance: DART_RELEVANCE_DEFAULT}) {
+      {bool isAbstract = false,
+      bool isDeprecated = false,
+      int relevance = DART_RELEVANCE_DEFAULT}) {
     String completion =
         '${enumDeclaration.name.name}.${constantDeclaration.name.name}';
     CompletionSuggestion suggestion = new CompletionSuggestion(
@@ -421,11 +421,11 @@
       SimpleIdentifier id,
       TypeAnnotation typeName,
       protocol.ElementKind elemKind,
-      {bool isAbstract: false,
-      bool isDeprecated: false,
+      {bool isAbstract = false,
+      bool isDeprecated = false,
       ClassOrMixinDeclaration classDecl,
       FormalParameterList param,
-      int relevance: DART_RELEVANCE_DEFAULT}) {
+      int relevance = DART_RELEVANCE_DEFAULT}) {
     relevance = optype.returnValueSuggestionsFilter(
         _staticTypeOfIdentifier(id), relevance);
     if (relevance != null) {
@@ -441,9 +441,9 @@
   void _addLocalSuggestion_includeReturnValueSuggestions_enumConstant(
       EnumConstantDeclaration constantDeclaration,
       EnumDeclaration enumDeclaration,
-      {bool isAbstract: false,
-      bool isDeprecated: false,
-      int relevance: DART_RELEVANCE_DEFAULT}) {
+      {bool isAbstract = false,
+      bool isDeprecated = false,
+      int relevance = DART_RELEVANCE_DEFAULT}) {
     ClassElement classElement =
         resolutionMap.elementDeclaredByEnumDeclaration(enumDeclaration);
     relevance =
@@ -461,11 +461,11 @@
       SimpleIdentifier id,
       TypeAnnotation typeName,
       protocol.ElementKind elemKind,
-      {bool isAbstract: false,
-      bool isDeprecated: false,
+      {bool isAbstract = false,
+      bool isDeprecated = false,
       ClassDeclaration classDecl,
       FormalParameterList param,
-      int relevance: DART_RELEVANCE_DEFAULT}) {
+      int relevance = DART_RELEVANCE_DEFAULT}) {
     relevance = optype.typeNameSuggestionsFilter(
         _staticTypeOfIdentifier(id), relevance);
     if (relevance != null) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
index cd4c94c..069c71d 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_contributor.dart
@@ -10,8 +10,8 @@
     hide CompletionSuggestion, CompletionSuggestionKind;
 import 'package:analysis_server/src/provisional/completion/dart/completion_dart.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
@@ -36,7 +36,7 @@
       return const <CompletionSuggestion>[];
     }
 
-    var inheritance = new InheritanceManager2(request.result.typeSystem);
+    var inheritance = new InheritanceManager3(request.result.typeSystem);
 
     // Generate a collection of inherited members
     var classElem = classDecl.declaredElement;
@@ -48,12 +48,12 @@
     // Build suggestions
     List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
     for (Name name in namesToOverride) {
-      FunctionType signature = interfaceMap[name];
+      ExecutableElement element = interfaceMap[name];
       // Gracefully degrade if the overridden element has not been resolved.
-      if (signature.returnType != null) {
+      if (element.returnType != null) {
         var invokeSuper = interface.isSuperImplemented(name);
         var suggestion =
-            await _buildSuggestion(request, targetId, signature, invokeSuper);
+            await _buildSuggestion(request, targetId, element, invokeSuper);
         if (suggestion != null) {
           suggestions.add(suggestion);
         }
@@ -64,19 +64,19 @@
 
   /**
    * Build a suggestion to replace [targetId] in the given [request] with an
-   * override of the given [signature].
+   * override of the given [element].
    */
   Future<CompletionSuggestion> _buildSuggestion(
       DartCompletionRequest request,
       SimpleIdentifier targetId,
-      FunctionType signature,
+      ExecutableElement element,
       bool invokeSuper) async {
     var displayTextBuffer = new StringBuffer();
     var builder = new DartChangeBuilder(request.result.session);
     await builder.addFileEdit(request.result.path, (builder) {
       builder.addReplacement(range.node(targetId), (builder) {
         builder.writeOverride(
-          signature,
+          element,
           displayTextBuffer: displayTextBuffer,
           invokeSuper: invokeSuper,
         );
@@ -96,7 +96,7 @@
         completion.startsWith(overrideAnnotation)) {
       completion = completion.substring(overrideAnnotation.length).trim();
     }
-    if (completion.length == 0) {
+    if (completion.isEmpty) {
       return null;
     }
 
@@ -113,10 +113,10 @@
         completion,
         selectionRange.offset - offsetDelta,
         selectionRange.length,
-        signature.element.hasDeprecated,
+        element.hasDeprecated,
         false,
         displayText: displayText);
-    suggestion.element = protocol.convertElement(signature.element);
+    suggestion.element = protocol.convertElement(element);
     return suggestion;
   }
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
index 3f98f7e..26a7ce5 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/static_member_contributor.dart
@@ -112,7 +112,7 @@
       }
     }
     String completion = element.displayName;
-    if (completion == null || completion.length <= 0) {
+    if (completion == null || completion.isEmpty) {
       return;
     }
     CompletionSuggestion suggestion =
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 0300ad1..5d4dfaf 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
@@ -18,8 +18,8 @@
  */
 CompletionSuggestion createSuggestion(Element element,
     {String completion,
-    CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-    int relevance: DART_RELEVANCE_DEFAULT}) {
+    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+    int relevance = DART_RELEVANCE_DEFAULT}) {
   if (element == null) {
     return null;
   }
@@ -111,7 +111,7 @@
    */
   CompletionSuggestion addSuggestion(Element element,
       {String prefix,
-      int relevance: DART_RELEVANCE_DEFAULT,
+      int relevance = DART_RELEVANCE_DEFAULT,
       String elementCompletion}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
@@ -119,14 +119,14 @@
       }
     }
     String completion = elementCompletion ?? element.displayName;
-    if (prefix != null && prefix.length > 0) {
-      if (completion == null || completion.length <= 0) {
+    if (prefix != null && prefix.isNotEmpty) {
+      if (completion == null || completion.isEmpty) {
         completion = prefix;
       } else {
         completion = '$prefix.$completion';
       }
     }
-    if (completion == null || completion.length <= 0) {
+    if (completion == null || completion.isEmpty) {
       return null;
     }
     CompletionSuggestion suggestion = createSuggestion(element,
@@ -203,7 +203,7 @@
       ClassElement classElem = element.enclosingElement;
       if (classElem != null) {
         String prefix = classElem.name;
-        if (prefix != null && prefix.length > 0) {
+        if (prefix != null && prefix.isNotEmpty) {
           addSuggestion(element, prefix: prefix);
         }
       }
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
index 50e4b46..909a158 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/type_member_contributor.dart
@@ -337,7 +337,7 @@
    * shadowed by a previously added suggestion.
    */
   void _addSuggestion(Element element,
-      {int relevance: DART_RELEVANCE_DEFAULT}) {
+      {int relevance = DART_RELEVANCE_DEFAULT}) {
     if (element.isPrivate) {
       if (element.library != containingLibrary) {
         // Do not suggest private members for imported libraries
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 46910af..64ca5ab 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
@@ -240,7 +240,7 @@
   }
 
   void _addSuggestion(String completion,
-      {int relevance: DART_RELEVANCE_DEFAULT}) {
+      {int relevance = DART_RELEVANCE_DEFAULT}) {
     suggestions.add(new CompletionSuggestion(CompletionSuggestionKind.IMPORT,
         relevance, completion, completion.length, 0, false, false));
   }
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 a40613c..f7cc0da 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -79,8 +79,8 @@
     Source source, protocol.ElementKind kind, SimpleIdentifier id,
     {String parameters,
     TypeAnnotation returnType,
-    bool isAbstract: false,
-    bool isDeprecated: false}) {
+    bool isAbstract = false,
+    bool isDeprecated = false}) {
   String name;
   Location location;
   if (id != null) {
@@ -114,7 +114,7 @@
     return null;
   }
   String completion = id.name;
-  if (completion == null || completion.length <= 0 || completion == '_') {
+  if (completion == null || completion.isEmpty || completion == '_') {
     return null;
   }
   CompletionSuggestion suggestion = new CompletionSuggestion(
@@ -131,7 +131,7 @@
     SimpleIdentifier classId = classDecl.name;
     if (classId != null) {
       String className = classId.name;
-      if (className != null && className.length > 0) {
+      if (className != null && className.isNotEmpty) {
         suggestion.declaringType = className;
       }
     }
diff --git a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
index 9fa7d7e..770f7eb5 100644
--- a/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
+++ b/pkg/analysis_server/lib/src/services/completion/postfix/postfix_completion.dart
@@ -24,7 +24,8 @@
 class DartPostfixCompletion {
   static const NO_TEMPLATE =
       const PostfixCompletionKind('', 'no change', null, null);
-  static const ALL_TEMPLATES = const [
+
+  static const List<PostfixCompletionKind> ALL_TEMPLATES = const [
     const PostfixCompletionKind("assert", "expr.assert -> assert(expr);",
         isAssertContext, expandAssert),
     const PostfixCompletionKind(
@@ -318,6 +319,8 @@
 
   TypeProvider get typeProvider => completionContext.resolveResult.typeProvider;
 
+  TypeSystem get typeSystem => completionContext.resolveResult.typeSystem;
+
   Future<PostfixCompletion> compute() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -331,7 +334,7 @@
 
   Future<PostfixCompletion> expand(
       PostfixCompletionKind kind, Function contexter, Function sourcer,
-      {bool withBraces: true}) async {
+      {bool withBraces = true}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     AstNode expr = contexter();
@@ -368,7 +371,7 @@
 
   Future<PostfixCompletion> expandTry(
       PostfixCompletionKind kind, Function contexter,
-      {bool withOn: false}) async {
+      {bool withOn = false}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     AstNode stmt = contexter();
@@ -448,7 +451,7 @@
       _findOuterExpression(node, typeProvider.intType);
 
   Expression findIterableExpression() =>
-      _findOuterExpression(node, typeProvider.iterableType);
+      _findOuterExpression(node, typeProvider.iterableDynamicType);
 
   Expression findObjectExpression() =>
       _findOuterExpression(node, typeProvider.objectType);
@@ -541,7 +544,7 @@
     Expression expr = list.firstWhere((expr) {
       DartType type = expr.staticType;
       if (type == null) return false;
-      if (type.isSubtypeOf(builtInType)) return true;
+      if (typeSystem.isSubtypeOf(type, builtInType)) return true;
       Element element = type.element;
       if (element is TypeDefiningElement) {
         TypeDefiningElement typeDefElem = element;
@@ -552,7 +555,7 @@
               pType.typeParameters.length, typeProvider.dynamicType));
         }
       }
-      return type.isSubtypeOf(builtInType);
+      return typeSystem.isSubtypeOf(type, builtInType);
     }, orElse: () => null);
     if (expr is SimpleIdentifier && expr.parent is PropertyAccess) {
       expr = expr.parent;
@@ -563,7 +566,7 @@
     return expr;
   }
 
-  AstNode _selectedNode({int at: null}) =>
+  AstNode _selectedNode({int at = null}) =>
       new NodeLocator(at == null ? selectionOffset : at)
           .searchWithin(completionContext.resolveResult.unit);
 
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 cf2f06f..f82c19c 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
@@ -894,7 +894,7 @@
 
   bool _complete_simpleEnter() {
     int offset;
-    if (!errors.isEmpty) {
+    if (errors.isNotEmpty) {
       offset = selectionOffset;
     } else {
       String indent = utils.getLinePrefix(selectionOffset);
@@ -1093,7 +1093,7 @@
     return false;
   }
 
-  engine.AnalysisError _findError(ErrorCode code, {partialMatch: null}) {
+  engine.AnalysisError _findError(ErrorCode code, {partialMatch = null}) {
     return errors.firstWhere(
         (err) =>
             err.errorCode == code &&
@@ -1203,7 +1203,7 @@
     }
   }
 
-  AstNode _selectedNode({int at: null}) =>
+  AstNode _selectedNode({int at = null}) =>
       new NodeLocator(at == null ? selectionOffset : at).searchWithin(unit);
 
   void _setCompletion(StatementCompletionKind kind, [List args]) {
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 32ec6cd..9dc704e 100644
--- a/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/assist_internal.dart
@@ -222,7 +222,7 @@
   }
 
   void _addAssistFromBuilder(DartChangeBuilder builder, AssistKind kind,
-      {List args: null}) {
+      {List args = null}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty) {
       _coverageMarker();
@@ -848,7 +848,7 @@
         node.offset > creation.argumentList.offset ||
         creation.staticType.element != typeProvider.listType.element ||
         creation.constructorName.name != null ||
-        creation.argumentList.arguments.length > 0) {
+        creation.argumentList.arguments.isNotEmpty) {
       _coverageMarker();
       return;
     }
@@ -2317,9 +2317,9 @@
       /// Replace code between [replaceOffset] and [replaceEnd] with
       /// `createState()`, empty line, or nothing.
       void replaceInterval(int replaceEnd,
-          {bool replaceWithEmptyLine: false,
-          bool hasEmptyLineBeforeCreateState: false,
-          bool hasEmptyLineAfterCreateState: true}) {
+          {bool replaceWithEmptyLine = false,
+          bool hasEmptyLineBeforeCreateState = false,
+          bool hasEmptyLineAfterCreateState = true}) {
         int replaceLength = replaceEnd - replaceOffset;
         builder.addReplacement(
           new SourceRange(replaceOffset, replaceLength),
@@ -2663,11 +2663,11 @@
   }
 
   Future<void> _addProposal_flutterWrapWidgetImpl(
-      {AssistKind kind: DartAssistKind.FLUTTER_WRAP_GENERIC,
+      {AssistKind kind = DartAssistKind.FLUTTER_WRAP_GENERIC,
       bool Function(Expression widgetExpr) widgetValidator,
       String parentLibraryUri,
       String parentClassName,
-      List<String> leadingLines: const []}) async {
+      List<String> leadingLines = const []}) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     Expression widgetExpr = flutter.identifyWidgetExpression(node);
@@ -4299,7 +4299,7 @@
   /// placed inside curly braces, would lexically make the resulting literal a
   /// set literal rather than a map literal.
   bool _listHasUnambiguousElement(AstNode node) {
-    if (node is ListLiteral && node.elements.length > 0) {
+    if (node is ListLiteral && node.elements.isNotEmpty) {
       for (CollectionElement element in node.elements) {
         if (_isUnambiguousElement(element)) {
           return true;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix.dart b/pkg/analysis_server/lib/src/services/correction/fix.dart
index 7ca77e9..adfc446 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix.dart
@@ -3,6 +3,7 @@
 // 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/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';
@@ -119,7 +120,16 @@
   @override
   final AnalysisError error;
 
-  DartFixContextImpl(this.workspace, this.resolveResult, this.error);
+  final List<TopLevelDeclaration> Function(String name)
+      getTopLevelDeclarationsFunction;
+
+  DartFixContextImpl(this.workspace, this.resolveResult, this.error,
+      this.getTopLevelDeclarationsFunction);
+
+  @override
+  List<TopLevelDeclaration> getTopLevelDeclarations(String name) {
+    return getTopLevelDeclarationsFunction(name);
+  }
 }
 
 /// An enumeration of quick fix kinds found in a Dart file.
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 af92ea7..78af2cc 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
@@ -149,7 +149,7 @@
   /// [kind]. If [args] are provided, they will be used to fill in the message
   /// for the fix.
   void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
-      {List args: null}) {
+      {List args = null}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
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
new file mode 100644
index 0000000..ef4b987
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/correction/fix/dart/top_level_declarations.dart
@@ -0,0 +1,107 @@
+// 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/dart/analysis/analysis_context.dart';
+import 'package:analyzer/src/services/available_declarations.dart';
+
+/// Information about a single top-level declaration.
+class TopLevelDeclaration {
+  /// The path of the library that exports this declaration.
+  final String path;
+
+  /// The URI of the library that exports this declaration.
+  final Uri uri;
+
+  final TopLevelDeclarationKind kind;
+
+  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, function, variable }
+
+class TopLevelDeclarationsProvider {
+  final DeclarationsTracker tracker;
+
+  TopLevelDeclarationsProvider(this.tracker);
+
+  void doTrackerWork() {
+    while (tracker.hasWork) {
+      tracker.doWork();
+    }
+  }
+
+  List<TopLevelDeclaration> get(
+    AnalysisContext analysisContext,
+    String path,
+    String name,
+  ) {
+    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,
+          ),
+        );
+      }
+    }
+
+    var declarationsContext = tracker.getContext(analysisContext);
+    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.MIXIN:
+        return TopLevelDeclarationKind.type;
+        break;
+      case DeclarationKind.FUNCTION:
+        return TopLevelDeclarationKind.function;
+        break;
+      case DeclarationKind.GETTER:
+      case DeclarationKind.SETTER:
+      case DeclarationKind.VARIABLE:
+        return TopLevelDeclarationKind.variable;
+        break;
+      default:
+        return null;
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
index 50ee2a7..cef444b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/manifest/fix_generator.dart
@@ -115,7 +115,7 @@
   /// for the fix.
   // ignore: unused_element
   void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
-      {List args: null}) {
+      {List args = null}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
index 36f9a32..4b3d769 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/pubspec/fix_generator.dart
@@ -73,7 +73,7 @@
   /// for the fix.
   // ignore: unused_element
   void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
-      {List args: null}) {
+      {List args = null}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty) {
       return;
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 616949d..774612b 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix_internal.dart
@@ -10,6 +10,7 @@
 import 'package:analysis_server/plugin/edit/fix/fix_dart.dart';
 import 'package:analysis_server/src/services/completion/dart/utilities.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/levenshtein.dart';
 import 'package:analysis_server/src/services/correction/namespace.dart';
 import 'package:analysis_server/src/services/correction/strings.dart';
@@ -26,7 +27,6 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/session_helper.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
@@ -105,7 +105,11 @@
     // For each fix, put the fix into the HashMap.
     for (int i = 0; i < allAnalysisErrors.length; i++) {
       final FixContext fixContextI = new DartFixContextImpl(
-          context.workspace, context.resolveResult, allAnalysisErrors[i]);
+        context.workspace,
+        context.resolveResult,
+        allAnalysisErrors[i],
+        (name) => [],
+      );
       final FixProcessor processorI = new FixProcessor(fixContextI);
       final List<Fix> fixesListI = await processorI.compute();
       for (Fix f in fixesListI) {
@@ -475,6 +479,7 @@
       await _addFix_createFunction_forFunctionType();
       await _addFix_createMixin();
       await _addFix_importLibrary_withType();
+      await _addFix_importLibrary_withFunction();
       await _addFix_importLibrary_withTopLevelVariable();
       await _addFix_createLocalVariable();
     }
@@ -1776,14 +1781,14 @@
 
           builder.write(targetLocation.prefix);
           builder.write(targetClassName);
-          if (!constructorName.isEmpty) {
+          if (constructorName.isNotEmpty) {
             builder.write('.');
             builder.addSimpleLinkedEdit('NAME', constructorName);
           }
           builder.write('(');
           writeParameters(true);
           builder.write(') : super');
-          if (!constructorName.isEmpty) {
+          if (constructorName.isNotEmpty) {
             builder.write('.');
             builder.addSimpleLinkedEdit('NAME', constructorName);
           }
@@ -2129,15 +2134,15 @@
     ClassDeclaration targetClass = node.parent as ClassDeclaration;
     ClassElement targetClassElement = targetClass.declaredElement;
     utils.targetClassElement = targetClassElement;
-    List<FunctionType> signatures =
+    List<ExecutableElement> signatures =
         InheritanceOverrideVerifier.missingOverrides(targetClass).toList();
     // sort by name, getters before setters
-    signatures.sort((FunctionType a, FunctionType b) {
-      int names = compareStrings(a.element.displayName, b.element.displayName);
+    signatures.sort((ExecutableElement a, ExecutableElement b) {
+      int names = compareStrings(a.displayName, b.displayName);
       if (names != 0) {
         return names;
       }
-      if (a.element.kind == ElementKind.GETTER) {
+      if (a.kind == ElementKind.GETTER) {
         return -1;
       }
       return 1;
@@ -2166,10 +2171,9 @@
 
         // merge getter/setter pairs into fields
         for (int i = 0; i < signatures.length; i++) {
-          FunctionType signature = signatures[i];
-          ExecutableElement element = signature.element;
+          ExecutableElement element = signatures[i];
           if (element.kind == ElementKind.GETTER && i + 1 < signatures.length) {
-            ExecutableElement nextElement = signatures[i + 1].element;
+            ExecutableElement nextElement = signatures[i + 1];
             if (nextElement.kind == ElementKind.SETTER) {
               // remove this and the next elements, adjust iterator
               signatures.removeAt(i + 1);
@@ -2183,7 +2187,7 @@
               builder.write(eol);
               // add field
               builder.write(prefix);
-              builder.writeType(signature.returnType, required: true);
+              builder.writeType(element.returnType, required: true);
               builder.write(' ');
               builder.write(element.name);
               builder.write(';');
@@ -2191,9 +2195,9 @@
           }
         }
         // add elements
-        for (FunctionType signature in signatures) {
+        for (ExecutableElement element in signatures) {
           addSeparatorBetweenDeclarations();
-          builder.writeOverride(signature);
+          builder.writeOverride(element);
         }
         builder.write(location.suffix);
       });
@@ -2305,7 +2309,7 @@
       builder.addInsertion(insertOffset, (DartEditBuilder builder) {
         builder.selectHere();
         // insert empty line before existing member
-        if (!targetClass.members.isEmpty) {
+        if (targetClass.members.isNotEmpty) {
           builder.write(eol);
         }
         // append method
@@ -2412,7 +2416,7 @@
     }
     // may be there is an existing import,
     // but it is with prefix and we don't use this prefix
-    Set<Source> alreadyImportedWithPrefix = new Set<Source>();
+    var alreadyImportedWithPrefix = new Set<String>();
     for (ImportElement imp in unitLibraryElement.imports) {
       // prepare element
       LibraryElement libraryElement = imp.importedLibrary;
@@ -2454,7 +2458,7 @@
           libraryName = libraryElement.source.shortName;
         }
         // don't add this library again
-        alreadyImportedWithPrefix.add(libraryElement.source);
+        alreadyImportedWithPrefix.add(libraryElement.source.fullName);
         // update library
         String newShowCode = 'show ${showNames.join(', ')}';
         int offset = showCombinator.offset;
@@ -2473,25 +2477,21 @@
     }
     // Find new top-level declarations.
     {
-      var declarations = await session.getTopLevelDeclarations(name);
-      for (TopLevelDeclarationInSource declaration in declarations) {
+      var declarations = context.getTopLevelDeclarations(name);
+      for (var declaration in declarations) {
         // Check the kind.
-        if (!kinds2.contains(declaration.declaration.kind)) {
+        if (!kinds2.contains(declaration.kind)) {
           continue;
         }
         // Check the source.
-        Source librarySource = declaration.source;
-        if (alreadyImportedWithPrefix.contains(librarySource)) {
-          continue;
-        }
-        if (!_isSourceVisibleToLibrary(librarySource)) {
+        if (alreadyImportedWithPrefix.contains(declaration.path)) {
           continue;
         }
         // Compute the fix kind.
         FixKind fixKind;
-        if (librarySource.isInSystemLibrary) {
+        if (declaration.uri.isScheme('dart')) {
           fixKind = DartFixKind.IMPORT_LIBRARY_SDK;
-        } else if (_isLibSrcPath(librarySource.fullName)) {
+        } else if (_isLibSrcPath(declaration.path)) {
           // Bad: non-API.
           fixKind = DartFixKind.IMPORT_LIBRARY_PROJECT3;
         } else if (declaration.isExported) {
@@ -2503,8 +2503,8 @@
         }
         // Add the fix.
         var relativeURI =
-            _getRelativeURIFromLibrary(unitLibraryElement, librarySource);
-        await _addFix_importLibrary(fixKind, librarySource.uri, relativeURI);
+            _getRelativeURIFromLibrary(unitLibraryElement, declaration.path);
+        await _addFix_importLibrary(fixKind, declaration.uri, relativeURI);
       }
     }
   }
@@ -2512,18 +2512,22 @@
   Future<void> _addFix_importLibrary_withFunction() async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
-    if (node is SimpleIdentifier && node.parent is MethodInvocation) {
-      MethodInvocation invocation = node.parent as MethodInvocation;
-      if (invocation.realTarget == null && invocation.methodName == node) {
-        String name = (node as SimpleIdentifier).name;
-        await _addFix_importLibrary_withElement(name, const [
-          ElementKind.FUNCTION,
-          ElementKind.TOP_LEVEL_VARIABLE
-        ], const [
-          TopLevelDeclarationKind.function,
-          TopLevelDeclarationKind.variable
-        ]);
+    if (node is SimpleIdentifier) {
+      if (node.parent is MethodInvocation) {
+        MethodInvocation invocation = node.parent as MethodInvocation;
+        if (invocation.realTarget != null || invocation.methodName != node) {
+          return;
+        }
       }
+
+      String name = (node as SimpleIdentifier).name;
+      await _addFix_importLibrary_withElement(name, const [
+        ElementKind.FUNCTION,
+        ElementKind.TOP_LEVEL_VARIABLE
+      ], const [
+        TopLevelDeclarationKind.function,
+        TopLevelDeclarationKind.variable
+      ]);
     }
   }
 
@@ -4052,7 +4056,7 @@
   }
 
   void _addFixFromBuilder(ChangeBuilder builder, FixKind kind,
-      {List args: null, bool importsOnly: false}) {
+      {List args = null, bool importsOnly = false}) {
     SourceChange change = builder.sourceChange;
     if (change.edits.isEmpty && !importsOnly) {
       return;
@@ -4220,7 +4224,7 @@
     StringBuffer buffer = new StringBuffer();
     buffer.write('super');
     String constructorName = constructor.displayName;
-    if (!constructorName.isEmpty) {
+    if (constructorName.isNotEmpty) {
       buffer.write('.');
       buffer.write(constructorName);
     }
@@ -4246,21 +4250,20 @@
   }
 
   /**
-   * Return the relative uri from the passed [library] to the passed
-   * [source]. If the [source] is not in the LibraryElement, `null` is returned.
+   * Return the relative uri from the passed [library] to the given [path].
+   * If the [path] is not in the LibraryElement, `null` is returned.
    */
-  String _getRelativeURIFromLibrary(LibraryElement library, Source source) {
+  String _getRelativeURIFromLibrary(LibraryElement library, String path) {
     var librarySource = library?.librarySource;
     if (librarySource == null) {
       return null;
     }
     var pathCtx = resourceProvider.pathContext;
     var libraryDirectory = pathCtx.dirname(librarySource.fullName);
-    var sourceDirectory = pathCtx.dirname(source.fullName);
-    if (pathCtx.isWithin(libraryDirectory, source.fullName) ||
+    var sourceDirectory = pathCtx.dirname(path);
+    if (pathCtx.isWithin(libraryDirectory, path) ||
         pathCtx.isWithin(sourceDirectory, libraryDirectory)) {
-      String relativeFile =
-          pathCtx.relative(source.fullName, from: libraryDirectory);
+      String relativeFile = pathCtx.relative(path, from: libraryDirectory);
       return pathCtx.split(relativeFile).join('/');
     }
     return null;
@@ -4469,30 +4472,6 @@
     return false;
   }
 
-  /**
-   * Return `true` if the [source] can be imported into current library.
-   */
-  bool _isSourceVisibleToLibrary(Source source) {
-    String path = source.fullName;
-
-    var contextRoot = context.resolveResult.session.analysisContext.contextRoot;
-    if (contextRoot == null) {
-      return true;
-    }
-
-    // We don't want to use private libraries of other packages.
-    if (source.uri.isScheme('package') && _isLibSrcPath(path)) {
-      return contextRoot.root.contains(path);
-    }
-
-    // We cannot use relative URIs to reference files outside of our package.
-    if (source.uri.isScheme('file')) {
-      return contextRoot.root.contains(path);
-    }
-
-    return true;
-  }
-
   bool _isToListMethodElement(MethodElement method) {
     if (method.name != 'toList') {
       return false;
diff --git a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
index 13e16c2..3669e86 100644
--- a/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
+++ b/pkg/analysis_server/lib/src/services/correction/levenshtein.dart
@@ -24,7 +24,8 @@
  * by Dan Gusfield and Chas Emerick's implementation of the Levenshtein distance
  * algorithm.
  */
-int levenshtein(String s, String t, int threshold, {bool caseSensitive: true}) {
+int levenshtein(String s, String t, int threshold,
+    {bool caseSensitive = true}) {
   if (s == null || t == null) {
     throw new ArgumentError('Strings must not be null');
   }
diff --git a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
index e8da43f..284acbb 100644
--- a/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
+++ b/pkg/analysis_server/lib/src/services/correction/name_suggestion.dart
@@ -31,7 +31,7 @@
  */
 List<String> getVariableNameSuggestionsForExpression(
     DartType expectedType, Expression assignedExpression, Set<String> excluded,
-    {bool isMethod: false}) {
+    {bool isMethod = false}) {
   String prefix;
 
   if (isMethod) {
diff --git a/pkg/analysis_server/lib/src/services/correction/namespace.dart b/pkg/analysis_server/lib/src/services/correction/namespace.dart
index a3bdd84..878ed69 100644
--- a/pkg/analysis_server/lib/src/services/correction/namespace.dart
+++ b/pkg/analysis_server/lib/src/services/correction/namespace.dart
@@ -82,7 +82,7 @@
       }
     }
     // no combinators => only possible candidate
-    if (importElement.combinators.length == 0) {
+    if (importElement.combinators.isEmpty) {
       return importElement;
     }
     // OK, we have candidate
diff --git a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
index 3c3ff33..15f2a75 100644
--- a/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
+++ b/pkg/analysis_server/lib/src/services/correction/organize_directives.dart
@@ -25,7 +25,7 @@
   bool hasUnresolvedIdentifierError;
 
   DirectiveOrganizer(this.initialCode, this.unit, this.errors,
-      {this.removeUnresolved: true, this.removeUnused: true}) {
+      {this.removeUnresolved = true, this.removeUnused = true}) {
     this.code = initialCode;
     this.endOfLine = getEOL(code);
     this.hasUnresolvedIdentifierError = errors.any((error) {
diff --git a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
index 3b9b505..3b9cb7a 100644
--- a/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
+++ b/pkg/analysis_server/lib/src/services/correction/selection_analyzer.dart
@@ -39,7 +39,7 @@
    * selection [SourceRange].
    */
   bool get hasSelectedNodes =>
-      _selectedNodes != null && !_selectedNodes.isEmpty;
+      _selectedNodes != null && _selectedNodes.isNotEmpty;
 
   /**
    * Returns `true` if there was no selected nodes yet.
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 a4bc4a8..51f43ab 100644
--- a/pkg/analysis_server/lib/src/services/correction/sort_members.dart
+++ b/pkg/analysis_server/lib/src/services/correction/sort_members.dart
@@ -26,6 +26,8 @@
     new _PriorityItem(false, _MemberKind.UNIT_FUNCTION_TYPE, true),
     new _PriorityItem(false, _MemberKind.UNIT_CLASS, false),
     new _PriorityItem(false, _MemberKind.UNIT_CLASS, true),
+    new _PriorityItem(false, _MemberKind.UNIT_EXTENSION, false),
+    new _PriorityItem(false, _MemberKind.UNIT_EXTENSION, true),
     new _PriorityItem(true, _MemberKind.CLASS_FIELD, false),
     new _PriorityItem(true, _MemberKind.CLASS_ACCESSOR, false),
     new _PriorityItem(true, _MemberKind.CLASS_ACCESSOR, true),
@@ -116,7 +118,7 @@
       if (member is FieldDeclaration) {
         FieldDeclaration fieldDeclaration = member;
         List<VariableDeclaration> fields = fieldDeclaration.fields.variables;
-        if (!fields.isEmpty) {
+        if (fields.isNotEmpty) {
           kind = _MemberKind.CLASS_FIELD;
           isStatic = fieldDeclaration.isStatic;
           name = fields[0].name.name;
@@ -276,16 +278,16 @@
       if (member is ClassOrMixinDeclaration) {
         kind = _MemberKind.UNIT_CLASS;
         name = member.name.name;
-      }
-      if (member is ClassTypeAlias) {
+      } else if (member is ClassTypeAlias) {
         kind = _MemberKind.UNIT_CLASS;
         name = member.name.name;
-      }
-      if (member is EnumDeclaration) {
+      } else if (member is EnumDeclaration) {
         kind = _MemberKind.UNIT_CLASS;
         name = member.name.name;
-      }
-      if (member is FunctionDeclaration) {
+      } else if (member is ExtensionDeclaration) {
+        kind = _MemberKind.UNIT_EXTENSION;
+        name = member.name?.name ?? '';
+      } else if (member is FunctionDeclaration) {
         FunctionDeclaration function = member;
         name = function.name.name;
         if (function.isGetter) {
@@ -301,20 +303,17 @@
             kind = _MemberKind.UNIT_FUNCTION;
           }
         }
-      }
-      if (member is FunctionTypeAlias) {
+      } else if (member is FunctionTypeAlias) {
         kind = _MemberKind.UNIT_FUNCTION_TYPE;
         name = member.name.name;
-      }
-      if (member is GenericTypeAlias) {
+      } else if (member is GenericTypeAlias) {
         kind = _MemberKind.UNIT_GENERIC_TYPE_ALIAS;
         name = member.name.name;
-      }
-      if (member is TopLevelVariableDeclaration) {
+      } else if (member is TopLevelVariableDeclaration) {
         TopLevelVariableDeclaration variableDeclaration = member;
         List<VariableDeclaration> variables =
             variableDeclaration.variables.variables;
-        if (!variables.isEmpty) {
+        if (variables.isNotEmpty) {
           if (variableDeclaration.variables.isConst) {
             kind = _MemberKind.UNIT_VARIABLE_CONST;
           } else {
@@ -460,24 +459,24 @@
 }
 
 class _MemberKind {
-  static const UNIT_FUNCTION_MAIN = const _MemberKind('UNIT_FUNCTION_MAIN', 0);
-  static const UNIT_ACCESSOR = const _MemberKind('UNIT_ACCESSOR', 1);
-  static const UNIT_FUNCTION = const _MemberKind('UNIT_FUNCTION', 2);
+  static const CLASS_ACCESSOR = const _MemberKind('CLASS_ACCESSOR');
+  static const CLASS_CONSTRUCTOR = const _MemberKind('CLASS_CONSTRUCTOR');
+  static const CLASS_FIELD = const _MemberKind('CLASS_FIELD');
+  static const CLASS_METHOD = const _MemberKind('CLASS_METHOD');
+  static const UNIT_ACCESSOR = const _MemberKind('UNIT_ACCESSOR');
+  static const UNIT_CLASS = const _MemberKind('UNIT_CLASS');
+  static const UNIT_EXTENSION = const _MemberKind('UNIT_EXTENSION');
+  static const UNIT_FUNCTION = const _MemberKind('UNIT_FUNCTION');
+  static const UNIT_FUNCTION_MAIN = const _MemberKind('UNIT_FUNCTION_MAIN');
+  static const UNIT_FUNCTION_TYPE = const _MemberKind('UNIT_FUNCTION_TYPE');
   static const UNIT_GENERIC_TYPE_ALIAS =
-      const _MemberKind('UNIT_GENERIC_TYPE_ALIAS', 3);
-  static const UNIT_FUNCTION_TYPE = const _MemberKind('UNIT_FUNCTION_TYPE', 4);
-  static const UNIT_CLASS = const _MemberKind('UNIT_CLASS', 5);
-  static const UNIT_VARIABLE_CONST = const _MemberKind('UNIT_VARIABLE', 6);
-  static const UNIT_VARIABLE = const _MemberKind('UNIT_VARIABLE', 7);
-  static const CLASS_ACCESSOR = const _MemberKind('CLASS_ACCESSOR', 8);
-  static const CLASS_CONSTRUCTOR = const _MemberKind('CLASS_CONSTRUCTOR', 9);
-  static const CLASS_FIELD = const _MemberKind('CLASS_FIELD', 10);
-  static const CLASS_METHOD = const _MemberKind('CLASS_METHOD', 11);
+      const _MemberKind('UNIT_GENERIC_TYPE_ALIAS');
+  static const UNIT_VARIABLE = const _MemberKind('UNIT_VARIABLE');
+  static const UNIT_VARIABLE_CONST = const _MemberKind('UNIT_VARIABLE_CONST');
 
   final String name;
-  final int ordinal;
 
-  const _MemberKind(this.name, this.ordinal);
+  const _MemberKind(this.name);
 
   @override
   String toString() => name;
diff --git a/pkg/analysis_server/lib/src/services/correction/util.dart b/pkg/analysis_server/lib/src/services/correction/util.dart
index 5fcc990..1fcc638 100644
--- a/pkg/analysis_server/lib/src/services/correction/util.dart
+++ b/pkg/analysis_server/lib/src/services/correction/util.dart
@@ -711,7 +711,7 @@
     // determine if empty line is required after
     int nextLineOffset = getLineNext(offset);
     String insertLine = source.substring(offset, nextLineOffset);
-    if (!insertLine.trim().isEmpty) {
+    if (insertLine.trim().isNotEmpty) {
       insertEmptyLineAfter = true;
     }
     // fill InsertDesc
@@ -822,7 +822,7 @@
    * to cover whole lines.
    */
   SourceRange getLinesRange(SourceRange sourceRange,
-      {bool skipLeadingEmptyLines: false}) {
+      {bool skipLeadingEmptyLines = false}) {
     // start
     int startOffset = sourceRange.offset;
     int startLineOffset = getLineContentStart(startOffset);
@@ -1017,7 +1017,7 @@
   /**
    * Indents given source left or right.
    */
-  String indentSourceLeftRight(String source, {bool indentLeft: true}) {
+  String indentSourceLeftRight(String source, {bool indentLeft = true}) {
     StringBuffer sb = new StringBuffer();
     String indent = getIndent(1);
     String eol = endOfLine;
diff --git a/pkg/analysis_server/lib/src/services/flutter/class_description.dart b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
new file mode 100644
index 0000000..d8f2e4d
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
@@ -0,0 +1,106 @@
+// 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/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+
+/// Information about a class with nested properties.
+///
+/// If the property value is set, and the expression is an
+/// [InstanceCreationExpression], we add nested properties for parameters of
+/// the used constructor.
+///
+/// If the property value is not set, but its type is a class, we still could
+/// add nested properties for this property. But we need to know how to
+/// materialize it - which constructor to call, and with which arguments.
+///
+/// This class provides such "how to materialize" information.
+class ClassDescription {
+  final ClassElement element;
+  final ConstructorElement constructor;
+
+  /// Mapping from a parameter to the default code for the corresponding
+  /// argument in a new instance creation that calls the [constructor].
+  ///
+  /// TODO(scheglov) Should be a generator, not just [String].
+  /// In general case we might need to import some libraries.
+  final Map<ParameterElement, String> parameterToDefaultCode;
+
+  ClassDescription(
+    this.element,
+    this.constructor,
+    this.parameterToDefaultCode,
+  );
+}
+
+/// The lazy-fill registry of [ClassDescription].
+class ClassDescriptionRegistry {
+  final Map<ClassElement, ClassDescription> _map = {};
+
+  /// Flush all data, because there was a change to a file.
+  void flush() {
+    _map.clear();
+  }
+
+  /// If the [type] is a class, and we know how to materialize it, return its
+  /// [ClassDescription]. Otherwise return `null`.
+  ClassDescription get(DartType type) {
+    if (type is InterfaceType) {
+      var element = type.element;
+      var description = _map[element];
+      if (description == null) {
+        description = _classDescription(element);
+        if (description != null) {
+          _map[element] = description;
+        }
+      }
+      return description;
+    }
+    return null;
+  }
+
+  /// Return `true` if properties should be created for instances of [type].
+  bool hasNestedProperties(DartType type) {
+    if (type is InterfaceType) {
+      return _isOptedInClass(type.element);
+    }
+    return false;
+  }
+
+  ClassDescription _classDescription(ClassElement element) {
+    if (!_isOptedInClass(element)) return null;
+
+    var constructor = element.unnamedConstructor;
+    if (constructor == null) return null;
+
+    var parameters = constructor.parameters;
+    var defaultValueMap = <ParameterElement, String>{};
+
+    for (var parameter in parameters) {
+      if (parameter.isNotOptional || parameter.hasRequired) {
+        return null;
+      }
+    }
+
+    return ClassDescription(element, constructor, defaultValueMap);
+  }
+
+  bool _isOptedInClass(ClassElement element) {
+    return _isClass(
+          element,
+          'package:flutter/src/widgets/container.dart',
+          'Container',
+        ) ||
+        _isClass(
+          element,
+          'package:flutter/src/painting/text_style.dart',
+          'TextStyle',
+        );
+  }
+
+  static bool _isClass(ClassElement element, String uri, String name) {
+    return element.name == name && element.library.source.uri.toString() == uri;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/flutter/property.dart b/pkg/analysis_server/lib/src/services/flutter/property.dart
new file mode 100644
index 0000000..0917e03
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/flutter/property.dart
@@ -0,0 +1,669 @@
+// 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:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/flutter/class_description.dart';
+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/token.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/src/util/comment.dart';
+import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
+import 'package:analyzer_plugin/utilities/range_factory.dart';
+
+String getFieldDocumentation(FieldElement field) {
+  var rawComment = field.documentationComment;
+  return getDartDocPlainText(rawComment);
+}
+
+String getParameterDocumentation(ParameterElement parameter) {
+  if (parameter is FieldFormalParameterElement) {
+    var rawComment = parameter.field.documentationComment;
+    return getDartDocPlainText(rawComment);
+  }
+  return null;
+}
+
+class PropertyDescription {
+  static int _nextPropertyId = 0;
+
+  final PropertyDescription parent;
+
+  /// The resolved unit, where the property value is.
+  final ResolvedUnitResult resolvedUnit;
+
+  /// The instance of [Flutter] support for the [resolvedUnit].
+  final Flutter flutter;
+
+  /// If the object that has this property is not materialized yet, so the
+  /// [instanceCreation] is `null`, the description of the object to
+  /// materialize.
+  final ClassDescription classDescription;
+
+  /// The instance creation of the object that has this property. Or `null`
+  /// if the object is not materialized yet, in this case [classDescription]
+  /// is set.
+  final InstanceCreationExpression instanceCreation;
+
+  /// Information about the `Container` property, which is not based on an
+  /// actual [instanceCreation] of the `Container` widget, i.e. is not
+  /// materialized.
+  final VirtualContainerProperty virtualContainer;
+
+  /// If the property is set, the full argument expression, might be a
+  /// [NamedExpression].
+  final Expression argumentExpression;
+
+  /// If the property is set, the value part of the argument expression,
+  /// the same as [argumentExpression] if a positional argument, or the
+  /// expression part of the [NamedExpression].
+  final Expression valueExpression;
+
+  /// The parameter element in the object constructor that is actually
+  /// invoked by [instanceCreation], or will be invoked when
+  /// [classDescription] is materialized.
+  final ParameterElement parameterElement;
+
+  /// Optional nested properties.
+  final List<PropertyDescription> children = [];
+
+  final protocol.FlutterWidgetProperty protocolProperty;
+
+  /// If this is a `EdgeInsets` typed property, the instance of helper.
+  /// Otherwise `null`.
+  _EdgeInsetsProperty _edgeInsetsProperty;
+
+  PropertyDescription({
+    this.parent,
+    this.resolvedUnit,
+    this.flutter,
+    this.classDescription,
+    this.instanceCreation,
+    this.argumentExpression,
+    this.valueExpression,
+    this.parameterElement,
+    this.protocolProperty,
+    this.virtualContainer,
+  });
+
+  String get name => protocolProperty.name;
+
+  /// This property has type `EdgeInsets`, add its nested properties.
+  void addEdgeInsetsNestedProperties(ClassElement classEdgeInsets) {
+    _edgeInsetsProperty = _EdgeInsetsProperty(classEdgeInsets, this);
+    _edgeInsetsProperty.addNested();
+  }
+
+  Future<protocol.SourceChange> changeValue(
+      protocol.FlutterWidgetPropertyValue value) async {
+    if (parent?._edgeInsetsProperty != null) {
+      return parent._edgeInsetsProperty.changeValue(this, value);
+    }
+
+    var changeBuilder = DartChangeBuilder(resolvedUnit.session);
+
+    ClassElement enumClassElement;
+    var enumValue = value.enumValue;
+    if (enumValue != null) {
+      var helper = AnalysisSessionHelper(resolvedUnit.session);
+      enumClassElement = await helper.getClass(
+        enumValue.libraryUri,
+        enumValue.className,
+      );
+    }
+
+    await changeBuilder.addFileEdit(resolvedUnit.path, (builder) {
+      _changeCode(builder, (builder) {
+        if (value.expression != null) {
+          builder.write(value.expression);
+        } else if (enumClassElement != null) {
+          builder.writeReference(enumClassElement);
+          builder.write('.');
+          builder.write(enumValue.name);
+        } else {
+          var code = _toPrimitiveValueCode(value);
+          builder.write(code);
+        }
+      });
+      _formatEnclosingFunctionBody(builder);
+    });
+
+    return changeBuilder.sourceChange;
+  }
+
+  Future<protocol.SourceChange> removeValue() async {
+    var changeBuilder = DartChangeBuilder(resolvedUnit.session);
+
+    if (argumentExpression != null) {
+      int endOffset;
+      var argumentList = instanceCreation.argumentList;
+      var arguments = argumentList.arguments;
+      var argumentIndex = arguments.indexOf(argumentExpression);
+      if (argumentIndex < arguments.length - 1) {
+        endOffset = arguments[argumentIndex + 1].offset;
+      } else {
+        endOffset = argumentList.rightParenthesis.offset;
+      }
+
+      var beginOffset = argumentExpression.offset;
+      await changeBuilder.addFileEdit(resolvedUnit.path, (builder) {
+        builder.addDeletion(
+          SourceRange(beginOffset, endOffset - beginOffset),
+        );
+      });
+    }
+
+    return changeBuilder.sourceChange;
+  }
+
+  void replaceChild(String name, PropertyDescription newChild) {
+    assert(newChild.parent == this);
+    for (var i = 0; i < children.length; i++) {
+      if (children[i].name == name) {
+        children[i] = newChild;
+        break;
+      }
+    }
+  }
+
+  void _changeCode(
+    DartFileEditBuilder builder,
+    void buildCode(DartEditBuilder builder),
+  ) {
+    if (valueExpression != null) {
+      builder.addReplacement(range.node(valueExpression), buildCode);
+    } else {
+      var parameterName = parameterElement.name;
+      if (instanceCreation != null) {
+        var argumentList = instanceCreation.argumentList;
+
+        var insertOffset = 0;
+        for (var argument in argumentList.arguments) {
+          if (argument is NamedExpression) {
+            var argumentName = argument.name.label.name;
+
+            if (argumentName.compareTo(parameterName) > 0 ||
+                _isChildArgument(argument) ||
+                _isChildrenArgument(argument)) {
+              insertOffset = argument.offset;
+              break;
+            }
+          }
+        }
+
+        var needsLeadingComma = false;
+        if (insertOffset == 0) {
+          var rightParenthesis = argumentList.rightParenthesis;
+          insertOffset = rightParenthesis.offset;
+          var previous = rightParenthesis.previous;
+          if (previous.type != TokenType.COMMA &&
+              previous != argumentList.leftParenthesis) {
+            needsLeadingComma = true;
+          }
+        }
+
+        builder.addInsertion(insertOffset, (builder) {
+          if (needsLeadingComma) {
+            builder.write(', ');
+          }
+
+          builder.write(parameterName);
+          builder.write(': ');
+
+          buildCode(builder);
+          builder.write(', ');
+        });
+      } else {
+        if (parent.virtualContainer != null) {
+          parent._changeCodeVirtualContainer(builder, parameterName, buildCode);
+        } else {
+          parent._changeCode(builder, (builder) {
+            builder.writeReference(classDescription.element);
+            // TODO(scheglov) constructor name
+            builder.write('(');
+            builder.write(parameterName);
+            builder.write(': ');
+            buildCode(builder);
+            builder.write(', ');
+            builder.write(')');
+          });
+        }
+      }
+    }
+  }
+
+  void _changeCodeVirtualContainer(
+    DartFileEditBuilder builder,
+    String parameterName,
+    void writeArgumentValue(DartEditBuilder builder),
+  ) {
+    if (virtualContainer._parentCreation != null) {
+      // `new Padding(...)` -> `Container(...)`
+      builder.addReplacement(
+        range.startEnd(
+          virtualContainer._parentCreation,
+          virtualContainer._parentCreation.constructorName,
+        ),
+        (builder) {
+          builder.writeReference(virtualContainer.containerElement);
+        },
+      );
+
+      var existingArgument = virtualContainer._parentArgumentToMove;
+      var existingName = existingArgument.name.label.name;
+
+      int parameterOffset;
+      var leadingComma = false;
+      var trailingComma = false;
+      if (existingName.compareTo(parameterName) > 0) {
+        // `Container(padding: ..., child: ...)`
+        //    ->
+        // `Container(alignment: ..., padding: ..., child: ...)`
+        parameterOffset = existingArgument.offset;
+        trailingComma = true;
+      } else {
+        // `Container(alignment: ..., child: ...)`
+        //    ->
+        // `Container(alignment: ..., padding: ..., child: ...)`
+        parameterOffset = existingArgument.end;
+        leadingComma = true;
+      }
+
+      builder.addInsertion(
+        parameterOffset,
+        (builder) {
+          if (leadingComma) {
+            builder.write(', ');
+          }
+
+          builder.write(parameterName);
+          builder.write(': ');
+          writeArgumentValue(builder);
+
+          if (trailingComma) {
+            builder.write(', ');
+          }
+        },
+      );
+    } else {
+      builder.addInsertion(
+        virtualContainer.widgetCreation.offset,
+        (builder) {
+          builder.writeReference(virtualContainer.containerElement);
+          builder.write('(');
+
+          builder.write(parameterName);
+          builder.write(': ');
+          writeArgumentValue(builder);
+          builder.write(', ');
+
+          builder.write('child: ');
+        },
+      );
+      builder.addSimpleInsertion(virtualContainer.widgetCreation.end, ',)');
+    }
+  }
+
+  FunctionBody _enclosingFunctionBody() {
+    if (parent != null) {
+      return parent._enclosingFunctionBody();
+    }
+    var anchorExpr = virtualContainer?.widgetCreation ?? instanceCreation;
+    return anchorExpr.thisOrAncestorOfType<FunctionBody>();
+  }
+
+  void _formatEnclosingFunctionBody(DartFileEditBuilder builder) {
+    var functionBody = _enclosingFunctionBody();
+    builder.format(range.node(functionBody));
+  }
+
+  /// TODO(scheglov) Generalize to identifying by type.
+  bool _isChildArgument(NamedExpression argument) {
+    var argumentName = argument.name.label.name;
+    return argumentName == 'child';
+  }
+
+  /// TODO(scheglov) Generalize to identifying by type.
+  bool _isChildrenArgument(NamedExpression argument) {
+    var argumentName = argument.name.label.name;
+    return argumentName == 'children';
+  }
+
+  String _toPrimitiveValueCode(protocol.FlutterWidgetPropertyValue value) {
+    if (value.boolValue != null) {
+      return '${value.boolValue}';
+    }
+
+    if (value.doubleValue != null) {
+      var code = value.doubleValue.toStringAsFixed(1);
+      if (code.endsWith('.0')) {
+        code = code.substring(0, code.length - 2);
+      }
+      return code;
+    }
+
+    if (value.intValue != null) {
+      return '${value.intValue}';
+    }
+
+    if (value.stringValue != null) {
+      var code = value.stringValue;
+      if (code.contains("'")) {
+        code = code.replaceAll("'", r"\'");
+      }
+      return "'$code'";
+    }
+
+    throw StateError('Not a primitive value: $value');
+  }
+
+  static int nextId() => _nextPropertyId++;
+}
+
+/// Every widget has the `Container` property, either based of an actual
+/// `Container` widget instance creation, or virtual, materialized when a
+/// nested property is set.
+///
+/// This class provides information necessary for such materialization.
+class VirtualContainerProperty {
+  final ClassElement containerElement;
+  final InstanceCreationExpression widgetCreation;
+
+  /// The existing wrapper around the widget, with semantic that is a subset
+  /// of the `Container` semantic, such as `Padding`. Such wrapper should be
+  /// replaced with full `Container` when `Container` is materialized.
+  ///
+  /// Might be `null`, if no existing replacable wrapped.
+  InstanceCreationExpression _parentCreation;
+
+  /// The argument from the [_parentCreation] that should be moved into
+  /// the new `Container` creation during its materialization.
+  NamedExpression _parentArgumentToMove;
+
+  VirtualContainerProperty(
+    this.containerElement,
+    this.widgetCreation,
+  );
+
+  void setParentCreation(
+    InstanceCreationExpression parentCreation,
+    NamedExpression parentArgumentToMove,
+  ) {
+    _parentCreation = parentCreation;
+    _parentArgumentToMove = parentArgumentToMove;
+  }
+}
+
+/// Support for `EdgeInsets` typed properties.
+///
+/// We try to generate nice looking code for `EdgeInsets` instances.
+class _EdgeInsetsProperty {
+  final ClassElement classEdgeInsets;
+
+  /// The property that has type `EdgeInsets`.
+  final PropertyDescription property;
+
+  /// The constructor `EdgeInsets.only`.
+  ConstructorElement onlyConstructor;
+
+  double leftValue;
+  double topValue;
+  double rightValue;
+  double bottomValue;
+
+  PropertyDescription leftProperty;
+  PropertyDescription topProperty;
+  PropertyDescription rightProperty;
+  PropertyDescription bottomProperty;
+
+  _EdgeInsetsProperty(this.classEdgeInsets, this.property);
+
+  Flutter get flutter => property.flutter;
+
+  void addNested() {
+    Expression leftExpression;
+    Expression topExpression;
+    Expression rightExpression;
+    Expression bottomExpression;
+    var propertyExpression = property.valueExpression;
+    if (propertyExpression is InstanceCreationExpression) {
+      var constructor = propertyExpression.staticElement;
+      if (constructor?.enclosingElement == classEdgeInsets) {
+        var arguments = propertyExpression.argumentList.arguments;
+        if (constructor.name == 'all') {
+          var expression = flutter.argumentByIndex(arguments, 0);
+          leftExpression = expression;
+          topExpression = expression;
+          rightExpression = expression;
+          bottomExpression = expression;
+        } else if (constructor.name == 'fromLTRB') {
+          leftExpression = flutter.argumentByIndex(arguments, 0);
+          topExpression = flutter.argumentByIndex(arguments, 1);
+          rightExpression = flutter.argumentByIndex(arguments, 2);
+          bottomExpression = flutter.argumentByIndex(arguments, 3);
+        } else if (constructor.name == 'only') {
+          var leftArgument = flutter.argumentByName(arguments, 'left');
+          var topArgument = flutter.argumentByName(arguments, 'top');
+          var rightArgument = flutter.argumentByName(arguments, 'right');
+          var bottomArgument = flutter.argumentByName(arguments, 'bottom');
+          leftExpression = leftArgument?.expression;
+          topExpression = topArgument?.expression;
+          rightExpression = rightArgument?.expression;
+          bottomExpression = bottomArgument?.expression;
+        } else if (constructor.name == 'symmetric') {
+          var hArgument = flutter.argumentByName(arguments, 'horizontal');
+          var vArgument = flutter.argumentByName(arguments, 'vertical');
+          leftExpression = hArgument?.expression;
+          topExpression = vArgument?.expression;
+          rightExpression = hArgument?.expression;
+          bottomExpression = vArgument?.expression;
+        }
+
+        leftValue = _valueDouble(leftExpression);
+        topValue = _valueDouble(topExpression);
+        rightValue = _valueDouble(rightExpression);
+        bottomValue = _valueDouble(bottomExpression);
+      }
+    }
+
+    onlyConstructor = classEdgeInsets.getNamedConstructor('only');
+
+    leftProperty = _addNestedProperty(
+      name: 'left',
+      expression: leftExpression,
+      value: leftValue,
+    );
+    topProperty = _addNestedProperty(
+      name: 'top',
+      expression: topExpression,
+      value: topValue,
+    );
+    rightProperty = _addNestedProperty(
+      name: 'right',
+      expression: rightExpression,
+      value: rightValue,
+    );
+    bottomProperty = _addNestedProperty(
+      name: 'bottom',
+      expression: bottomExpression,
+      value: bottomValue,
+    );
+  }
+
+  /// The value of the [nested] property is changed, make changes to the
+  /// value of the [property] is a whole, to generate nice code.
+  Future<protocol.SourceChange> changeValue(
+    PropertyDescription nested,
+    protocol.FlutterWidgetPropertyValue value,
+  ) async {
+    var doubleValue = value.doubleValue;
+    if (doubleValue == null) return null;
+
+    if (nested == leftProperty) {
+      leftValue = doubleValue;
+    } else if (nested == topProperty) {
+      topValue = doubleValue;
+    } else if (nested == rightProperty) {
+      rightValue = doubleValue;
+    } else if (nested == bottomProperty) {
+      bottomValue = doubleValue;
+    }
+
+    var leftCode = _toDoubleCode(leftValue);
+    var topCode = _toDoubleCode(topValue);
+    var rightCode = _toDoubleCode(rightValue);
+    var bottomCode = _toDoubleCode(bottomValue);
+
+    if (leftCode == '0' &&
+        topCode == '0' &&
+        rightCode == '0' &&
+        bottomCode == '0') {
+      return property.removeValue();
+    }
+
+    var changeBuilder = DartChangeBuilder(property.resolvedUnit.session);
+
+    await changeBuilder.addFileEdit(property.resolvedUnit.path, (builder) {
+      property._changeCode(builder, (builder) {
+        if (leftCode == rightCode && topCode == bottomCode) {
+          builder.writeReference(classEdgeInsets);
+          if (leftCode == topCode) {
+            builder.write('.all(');
+            builder.write(leftCode);
+            builder.write(')');
+          } else {
+            var hasHorizontal = false;
+            builder.write('.symmetric(');
+            if (leftCode != '0') {
+              builder.write('horizontal: ');
+              builder.write(leftCode);
+              hasHorizontal = true;
+            }
+            if (topCode != '0') {
+              if (hasHorizontal) {
+                builder.write(', ');
+              }
+              builder.write('vertical: ');
+              builder.write(topCode);
+            }
+            builder.write(')');
+          }
+        } else {
+          builder.writeReference(classEdgeInsets);
+          builder.write('.only(');
+          var needsComma = false;
+          if (leftCode != '0') {
+            builder.write('left: ');
+            builder.write(leftCode);
+            needsComma = true;
+          }
+          if (topCode != '0') {
+            if (needsComma) {
+              builder.write(', ');
+            }
+            builder.write('top: ');
+            builder.write(topCode);
+            needsComma = true;
+          }
+          if (rightCode != '0') {
+            if (needsComma) {
+              builder.write(', ');
+            }
+            builder.write('right: ');
+            builder.write(rightCode);
+            needsComma = true;
+          }
+          if (bottomCode != '0') {
+            if (needsComma) {
+              builder.write(', ');
+            }
+            builder.write('bottom: ');
+            builder.write(bottomCode);
+            needsComma = true;
+          }
+          builder.write(')');
+        }
+      });
+      property._formatEnclosingFunctionBody(builder);
+    });
+
+    return changeBuilder.sourceChange;
+  }
+
+  PropertyDescription _addNestedProperty({
+    String name,
+    Expression expression,
+    double value,
+  }) {
+    var parameter = onlyConstructor.parameters.singleWhere(
+      (p) => p.name == name,
+    );
+    var parameterDocumentation = getParameterDocumentation(parameter);
+    var nested = PropertyDescription(
+      parent: property,
+      resolvedUnit: property.resolvedUnit,
+      valueExpression: expression,
+      parameterElement: parameter,
+      protocolProperty: protocol.FlutterWidgetProperty(
+        PropertyDescription.nextId(),
+        true,
+        true,
+        name,
+        documentation: parameterDocumentation,
+        expression: _expressionCode(expression),
+        value: _protocolValueDouble(value),
+        editor: protocol.FlutterWidgetPropertyEditor(
+          protocol.FlutterWidgetPropertyEditorKind.DOUBLE,
+        ),
+      ),
+    );
+    property.children.add(nested);
+    return nested;
+  }
+
+  String _expressionCode(Expression expression) {
+    if (expression != null) {
+      var content = property.resolvedUnit.content;
+      return content.substring(expression.offset, expression.end);
+    }
+    return null;
+  }
+
+  static protocol.FlutterWidgetPropertyValue _protocolValueDouble(
+    double value,
+  ) {
+    if (value != null) {
+      return protocol.FlutterWidgetPropertyValue(
+        doubleValue: value,
+      );
+    }
+    return null;
+  }
+
+  static String _toDoubleCode(double value) {
+    if (value == null) {
+      return '0';
+    }
+
+    var code = value.toStringAsFixed(1);
+    if (code.endsWith('.0')) {
+      code = code.substring(0, code.length - 2);
+    }
+    return code;
+  }
+
+  static double _valueDouble(Expression expression) {
+    if (expression is DoubleLiteral) {
+      return expression.value;
+    }
+    if (expression is IntegerLiteral) {
+      return expression.value.toDouble();
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
new file mode 100644
index 0000000..1a16579
--- /dev/null
+++ b/pkg/analysis_server/lib/src/services/flutter/widget_descriptions.dart
@@ -0,0 +1,541 @@
+// 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:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:analysis_server/src/protocol_server.dart' as protocol;
+import 'package:analysis_server/src/services/flutter/class_description.dart';
+import 'package:analysis_server/src/services/flutter/property.dart';
+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/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/session_helper.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+
+/// The result of [WidgetDescriptions.setPropertyValue] invocation.
+class SetPropertyValueResult {
+  /// The error to report to the client, or `null` if OK.
+  final protocol.RequestErrorCode errorCode;
+
+  /// The change to apply, or `null` if [errorCode] is not `null`.
+  final protocol.SourceChange change;
+
+  SetPropertyValueResult._({this.errorCode, this.change});
+}
+
+class WidgetDescriptions {
+  final ClassDescriptionRegistry _classRegistry = ClassDescriptionRegistry();
+
+  /// The mapping of identifiers of previously returned properties.
+  final Map<int, PropertyDescription> _properties = {};
+
+  /// Return the description of the widget with [InstanceCreationExpression] in
+  /// the [resolvedUnit] at the [offset], or `null` if the location does not
+  /// correspond to a widget.
+  Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+    ResolvedUnitResult resolvedUnit,
+    int offset,
+  ) async {
+    var computer = _WidgetDescriptionComputer(
+      _classRegistry,
+      resolvedUnit,
+      offset,
+    );
+    var widgetDescription = await computer.compute();
+
+    if (widgetDescription == null) {
+      return null;
+    }
+
+    var protocolProperties = _toProtocolProperties(
+      widgetDescription.properties,
+    );
+    return protocol.FlutterGetWidgetDescriptionResult(protocolProperties);
+  }
+
+  Future<SetPropertyValueResult> setPropertyValue(
+    int id,
+    protocol.FlutterWidgetPropertyValue value,
+  ) async {
+    var property = _properties[id];
+    if (property == null) {
+      return SetPropertyValueResult._(
+        errorCode: protocol
+            .RequestErrorCode.FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID,
+      );
+    }
+
+    if (value == null) {
+      if (property.protocolProperty.isRequired) {
+        return SetPropertyValueResult._(
+          errorCode: protocol
+              .RequestErrorCode.FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED,
+        );
+      }
+      var change = await property.removeValue();
+      return SetPropertyValueResult._(change: change);
+    } else {
+      var change = await property.changeValue(value);
+      return SetPropertyValueResult._(change: change);
+    }
+  }
+
+  List<protocol.FlutterWidgetProperty> _toProtocolProperties(
+    List<PropertyDescription> properties,
+  ) {
+    var protocolProperties = <protocol.FlutterWidgetProperty>[];
+    for (var property in properties) {
+      var protocolProperty = property.protocolProperty;
+
+      _properties[protocolProperty.id] = property;
+
+      protocolProperty.children = _toProtocolProperties(property.children);
+      protocolProperties.add(protocolProperty);
+    }
+    return protocolProperties;
+  }
+}
+
+class _WidgetDescription {
+  final List<PropertyDescription> properties;
+
+  _WidgetDescription(this.properties);
+}
+
+class _WidgetDescriptionComputer {
+  final ClassDescriptionRegistry classRegistry;
+
+  /// The set of classes for which we are currently adding properties,
+  /// used to prevent infinite recursion.
+  final Set<ClassElement> classesBeingProcessed = Set<ClassElement>();
+
+  /// The resolved unit with the widget [InstanceCreationExpression].
+  final ResolvedUnitResult resolvedUnit;
+
+  /// The offset of the widget expression.
+  final int widgetOffset;
+
+  /// The instance of [Flutter] support.
+  final Flutter flutter;
+
+  ClassElement _classAlignment;
+  ClassElement _classAlignmentDirectional;
+  ClassElement _classContainer;
+  ClassElement _classEdgeInsets;
+
+  _WidgetDescriptionComputer(
+    this.classRegistry,
+    this.resolvedUnit,
+    this.widgetOffset,
+  ) : flutter = Flutter.of(resolvedUnit);
+
+  Future<_WidgetDescription> compute() async {
+    var node = NodeLocator2(widgetOffset).searchWithin(resolvedUnit.unit);
+    var instanceCreation = flutter.identifyNewExpression(node);
+    if (instanceCreation == null) {
+      return null;
+    }
+
+    var constructorElement = instanceCreation.staticElement;
+    if (constructorElement == null) {
+      return null;
+    }
+
+    await _fetchClassElements();
+
+    var properties = <PropertyDescription>[];
+    _addProperties(
+      properties: properties,
+      instanceCreation: instanceCreation,
+    );
+    _addContainerProperty(properties, instanceCreation);
+
+    return _WidgetDescription(properties);
+  }
+
+  void _addContainerProperty(
+    List<PropertyDescription> properties,
+    InstanceCreationExpression widgetCreation,
+  ) {
+    if (!flutter.isWidgetCreation(widgetCreation)) {
+      return;
+    }
+
+    InstanceCreationExpression parentCreation;
+    var childArgument = widgetCreation.parent;
+    if (childArgument is NamedExpression &&
+        childArgument.name.label.name == 'child') {
+      var argumentList = childArgument.parent;
+      var argumentListParent = argumentList.parent;
+      if (argumentList is ArgumentList &&
+          argumentListParent is InstanceCreationExpression) {
+        parentCreation = argumentListParent;
+      }
+    }
+
+    PropertyDescription containerProperty;
+    if (flutter.isExactlyContainerCreation(parentCreation)) {
+      containerProperty = PropertyDescription(
+        resolvedUnit: resolvedUnit,
+        instanceCreation: parentCreation,
+        protocolProperty: protocol.FlutterWidgetProperty(
+          PropertyDescription.nextId(),
+          true,
+          false,
+          'Container',
+        ),
+      );
+      properties.add(containerProperty);
+
+      _addProperties(
+        properties: containerProperty.children,
+        parent: containerProperty,
+        instanceCreation: parentCreation,
+      );
+
+      containerProperty.children.removeWhere(
+        (property) => property.name == 'child',
+      );
+    } else {
+      var containerDescription = classRegistry.get(_classContainer.type);
+      containerProperty = PropertyDescription(
+        resolvedUnit: resolvedUnit,
+        classDescription: containerDescription,
+        protocolProperty: protocol.FlutterWidgetProperty(
+          PropertyDescription.nextId(),
+          true,
+          false,
+          'Container',
+        ),
+        virtualContainer: VirtualContainerProperty(
+          _classContainer,
+          widgetCreation,
+        ),
+      );
+      properties.add(containerProperty);
+
+      _addProperties(
+        properties: containerProperty.children,
+        parent: containerProperty,
+        classDescription: containerDescription,
+      );
+
+      if (flutter.isExactlyAlignCreation(parentCreation) &&
+          flutter.findNamedArgument(parentCreation, 'widthFactor') == null &&
+          flutter.findNamedArgument(parentCreation, 'heightFactor') == null) {
+        _replaceNestedContainerProperty(
+          containerProperty,
+          parentCreation,
+          'alignment',
+        );
+      }
+
+      if (flutter.isExactlyPaddingCreation(parentCreation)) {
+        _replaceNestedContainerProperty(
+          containerProperty,
+          parentCreation,
+          'padding',
+        );
+      }
+    }
+
+    containerProperty.children.removeWhere(
+      (property) => property.name == 'child',
+    );
+  }
+
+  void _addProperties({
+    List<PropertyDescription> properties,
+    PropertyDescription parent,
+    ClassDescription classDescription,
+    InstanceCreationExpression instanceCreation,
+    ConstructorElement constructorElement,
+  }) {
+    constructorElement ??= instanceCreation?.staticElement;
+    constructorElement ??= classDescription?.constructor;
+    if (constructorElement == null) return;
+
+    var classElement = constructorElement.enclosingElement;
+    if (!classesBeingProcessed.add(classElement)) return;
+
+    var existingNamed = Set<ParameterElement>();
+    if (instanceCreation != null) {
+      for (var argumentExpression in instanceCreation.argumentList.arguments) {
+        var parameter = argumentExpression.staticParameterElement;
+        if (parameter == null) continue;
+
+        Expression valueExpression;
+        if (argumentExpression is NamedExpression) {
+          valueExpression = argumentExpression.expression;
+          existingNamed.add(parameter);
+        } else {
+          valueExpression = argumentExpression;
+        }
+
+        _addProperty(
+          properties: properties,
+          parent: parent,
+          parameter: parameter,
+          classDescription: classDescription,
+          instanceCreation: instanceCreation,
+          argumentExpression: argumentExpression,
+          valueExpression: valueExpression,
+        );
+      }
+    }
+
+    for (var parameter in constructorElement.parameters) {
+      if (!parameter.isNamed) continue;
+      if (existingNamed.contains(parameter)) continue;
+
+      _addProperty(
+        properties: properties,
+        parent: parent,
+        parameter: parameter,
+        classDescription: classDescription,
+        instanceCreation: instanceCreation,
+      );
+    }
+
+    classesBeingProcessed.remove(classElement);
+  }
+
+  void _addProperty({
+    List<PropertyDescription> properties,
+    PropertyDescription parent,
+    ParameterElement parameter,
+    ClassDescription classDescription,
+    InstanceCreationExpression instanceCreation,
+    Expression argumentExpression,
+    Expression valueExpression,
+  }) {
+    var documentation = getParameterDocumentation(parameter);
+
+    String valueExpressionCode;
+    if (valueExpression != null) {
+      valueExpressionCode = resolvedUnit.content.substring(
+        valueExpression.offset,
+        valueExpression.end,
+      );
+    }
+
+    var isSafeToUpdate = false;
+    protocol.FlutterWidgetPropertyValue value;
+    if (valueExpression != null) {
+      value = _toValue(valueExpression);
+      isSafeToUpdate = value != null;
+    } else {
+      isSafeToUpdate = true;
+    }
+
+    var propertyDescription = PropertyDescription(
+      parent: parent,
+      resolvedUnit: resolvedUnit,
+      flutter: flutter,
+      classDescription: classDescription,
+      instanceCreation: instanceCreation,
+      argumentExpression: argumentExpression,
+      valueExpression: valueExpression,
+      parameterElement: parameter,
+      protocolProperty: protocol.FlutterWidgetProperty(
+        PropertyDescription.nextId(),
+        parameter.isRequiredPositional,
+        isSafeToUpdate,
+        parameter.name,
+        documentation: documentation,
+        editor: _getEditor(parameter.type),
+        expression: valueExpressionCode,
+        value: value,
+      ),
+    );
+    properties.add(propertyDescription);
+
+    if (flutter.isExactEdgeInsetsGeometryType(parameter.type)) {
+      propertyDescription.addEdgeInsetsNestedProperties(_classEdgeInsets);
+    } else if (valueExpression is InstanceCreationExpression) {
+      var type = valueExpression.staticType;
+      if (classRegistry.hasNestedProperties(type)) {
+        _addProperties(
+          properties: propertyDescription.children,
+          parent: propertyDescription,
+          instanceCreation: valueExpression,
+        );
+      }
+    } else if (valueExpression == null) {
+      var classDescription = classRegistry.get(
+        parameter.type,
+      );
+      if (classDescription != null) {
+        _addProperties(
+          properties: propertyDescription.children,
+          parent: propertyDescription,
+          classDescription: classDescription,
+        );
+      }
+    }
+  }
+
+  List<protocol.FlutterWidgetPropertyValueEnumItem> _enumItemsForEnum(
+    ClassElement element,
+  ) {
+    return element.fields
+        .where((field) => field.isStatic && field.isEnumConstant)
+        .map(_toEnumItem)
+        .toList();
+  }
+
+  List<protocol.FlutterWidgetPropertyValueEnumItem> _enumItemsForStaticFields(
+      ClassElement classElement) {
+    return classElement.fields
+        .where((f) => f.isStatic)
+        .map(_toEnumItem)
+        .toList();
+  }
+
+  Future<void> _fetchClassElements() async {
+    var sessionHelper = AnalysisSessionHelper(resolvedUnit.session);
+    _classAlignment = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'Alignment',
+    );
+    _classAlignmentDirectional = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'AlignmentDirectional',
+    );
+    _classContainer = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'Container',
+    );
+    _classEdgeInsets = await sessionHelper.getClass(
+      flutter.widgetsUri,
+      'EdgeInsets',
+    );
+  }
+
+  protocol.FlutterWidgetPropertyEditor _getEditor(DartType type) {
+    if (type.isDartCoreBool) {
+      return protocol.FlutterWidgetPropertyEditor(
+        protocol.FlutterWidgetPropertyEditorKind.BOOL,
+      );
+    }
+    if (type.isDartCoreDouble) {
+      return protocol.FlutterWidgetPropertyEditor(
+        protocol.FlutterWidgetPropertyEditorKind.DOUBLE,
+      );
+    }
+    if (type.isDartCoreInt) {
+      return protocol.FlutterWidgetPropertyEditor(
+        protocol.FlutterWidgetPropertyEditorKind.INT,
+      );
+    }
+    if (type.isDartCoreString) {
+      return protocol.FlutterWidgetPropertyEditor(
+        protocol.FlutterWidgetPropertyEditorKind.STRING,
+      );
+    }
+    if (type is InterfaceType) {
+      var classElement = type.element;
+      if (classElement.isEnum) {
+        return protocol.FlutterWidgetPropertyEditor(
+          protocol.FlutterWidgetPropertyEditorKind.ENUM,
+          enumItems: _enumItemsForEnum(classElement),
+        );
+      }
+      if (flutter.isExactAlignmentGeometry(classElement)) {
+        var items = <protocol.FlutterWidgetPropertyValueEnumItem>[];
+        items.addAll(
+          _enumItemsForStaticFields(_classAlignment),
+        );
+        items.addAll(
+          _enumItemsForStaticFields(_classAlignmentDirectional),
+        );
+        return protocol.FlutterWidgetPropertyEditor(
+          protocol.FlutterWidgetPropertyEditorKind.ENUM_LIKE,
+          enumItems: items,
+        );
+      }
+    }
+    return null;
+  }
+
+  /// If the [parentCreation] has a property with the given [name], replace
+  /// with it the corresponding nested property of the [containerProperty].
+  void _replaceNestedContainerProperty(
+    PropertyDescription containerProperty,
+    InstanceCreationExpression parentCreation,
+    String name,
+  ) {
+    var argument = flutter.findNamedArgument(parentCreation, name);
+    if (argument != null) {
+      var replacements = <PropertyDescription>[];
+      _addProperty(
+        properties: replacements,
+        parent: containerProperty,
+        parameter: argument.staticParameterElement,
+        instanceCreation: parentCreation,
+        argumentExpression: argument,
+        valueExpression: argument.expression,
+      );
+
+      var replacement = replacements[0];
+      if (replacement != null) {
+        containerProperty.replaceChild(name, replacement);
+        containerProperty.virtualContainer.setParentCreation(
+          parentCreation,
+          argument,
+        );
+      }
+    }
+  }
+
+  protocol.FlutterWidgetPropertyValueEnumItem _toEnumItem(FieldElement field) {
+    var classElement = field.enclosingElement as ClassElement;
+    var libraryUriStr = '${classElement.library.source.uri}';
+    var documentation = getFieldDocumentation(field);
+
+    return protocol.FlutterWidgetPropertyValueEnumItem(
+      libraryUriStr,
+      classElement.name,
+      field.name,
+      documentation: documentation,
+    );
+  }
+
+  protocol.FlutterWidgetPropertyValue _toValue(Expression valueExpression) {
+    if (valueExpression is BooleanLiteral) {
+      return protocol.FlutterWidgetPropertyValue(
+        boolValue: valueExpression.value,
+      );
+    } else if (valueExpression is DoubleLiteral) {
+      return protocol.FlutterWidgetPropertyValue(
+        doubleValue: valueExpression.value,
+      );
+    } else if (valueExpression is Identifier) {
+      var element = valueExpression.staticElement;
+      if (element is PropertyAccessorElement && element.isGetter) {
+        var field = element.variable;
+        if (field is FieldElement && field.isStatic) {
+          var enclosingClass = field.enclosingElement as ClassElement;
+          if (field.isEnumConstant ||
+              flutter.isExactAlignment(enclosingClass) ||
+              flutter.isExactAlignmentDirectional(enclosingClass)) {
+            return protocol.FlutterWidgetPropertyValue(
+              enumValue: _toEnumItem(field),
+            );
+          }
+        }
+      }
+    } else if (valueExpression is IntegerLiteral) {
+      return protocol.FlutterWidgetPropertyValue(
+        intValue: valueExpression.value,
+      );
+    } else if (valueExpression is SimpleStringLiteral) {
+      return protocol.FlutterWidgetPropertyValue(
+        stringValue: valueExpression.value,
+      );
+    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
index 24d7722..0758a37 100644
--- a/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
+++ b/pkg/analysis_server/lib/src/services/kythe/kythe_visitors.dart
@@ -13,7 +13,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/workspace/bazel.dart';
 import 'package:analyzer/src/workspace/gn.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
@@ -30,7 +30,7 @@
   assert(element != null);
   var name = element.enclosingElement.name;
   var constructorName = element.name;
-  if (!constructorName.isEmpty) {
+  if (constructorName.isNotEmpty) {
     name = name + '.' + constructorName;
   }
   return name;
@@ -94,7 +94,7 @@
   final ResourceProvider resourceProvider;
   final List<KytheEntry> entries;
   final String corpus;
-  final InheritanceManager2 _inheritanceManager;
+  final InheritanceManager3 _inheritanceManager;
   final String _contents;
 
   String _enclosingFilePath = '';
@@ -695,18 +695,18 @@
           returnNode: node.returnType);
 
       // override edges
-      var overriddenSignatures = _inheritanceManager.getOverridden(
+      var overriddenList = _inheritanceManager.getOverridden(
         _enclosingClassElement.type,
         new Name(
           _enclosingClassElement.library.source.uri,
           node.declaredElement.name,
         ),
       );
-      for (FunctionType signature in overriddenSignatures) {
+      for (ExecutableElement overridden in overriddenList) {
         addEdge(
           methodVName,
           schema.OVERRIDES_EDGE,
-          _vNameFromElement(signature.element, schema.FUNCTION_KIND),
+          _vNameFromElement(overridden, schema.FUNCTION_KIND),
         );
       }
 
@@ -894,10 +894,10 @@
 
   _handleRefCallEdge(
     Element element, {
-    SyntacticEntity syntacticEntity: null,
-    int start: _notFound,
-    int end: _notFound,
-    KytheVName enclosingTarget: null,
+    SyntacticEntity syntacticEntity = null,
+    int start = _notFound,
+    int end = _notFound,
+    KytheVName enclosingTarget = null,
   }) {
     if (element is ExecutableElement &&
         _enclosingVName != _enclosingFileVName) {
@@ -931,11 +931,11 @@
   KytheVName _handleRefEdge(
     Element element,
     List<String> refEdgeTypes, {
-    SyntacticEntity syntacticEntity: null,
-    int start: _notFound,
-    int end: _notFound,
-    KytheVName enclosingTarget: null,
-    KytheVName enclosingAnchor: null,
+    SyntacticEntity syntacticEntity = null,
+    int start = _notFound,
+    int end = _notFound,
+    KytheVName enclosingTarget = null,
+    KytheVName enclosingAnchor = null,
   }) {
     assert(refEdgeTypes.isNotEmpty);
     element = _findNonSyntheticElement(element);
@@ -1140,13 +1140,13 @@
   /// Finally, for all anchors, a childof edge with a target of the enclosing
   /// file is written out.
   KytheVName addAnchorEdgesContainingEdge({
-    SyntacticEntity syntacticEntity: null,
-    int start: _notFound,
-    int end: _notFound,
-    List<String> edges: const [],
-    KytheVName target: null,
-    KytheVName enclosingTarget: null,
-    KytheVName enclosingAnchor: null,
+    SyntacticEntity syntacticEntity = null,
+    int start = _notFound,
+    int end = _notFound,
+    List<String> edges = const [],
+    KytheVName target = null,
+    KytheVName enclosingTarget = null,
+    KytheVName enclosingAnchor = null,
   }) {
     if (start == _notFound && end == _notFound) {
       if (syntacticEntity != null) {
@@ -1192,7 +1192,7 @@
   /// of logic as [addNameFact] to prevent the edge from being written out.
   /// This is a convenience method for visitors to add an edge Entry.
   KytheEntry addEdge(KytheVName source, String edgeKind, KytheVName target,
-      {int ordinalIntValue: _notFound}) {
+      {int ordinalIntValue = _notFound}) {
     if (ordinalIntValue == _notFound) {
       return addEntry(source, edgeKind, target, "/", new List<int>());
     } else {
@@ -1228,7 +1228,7 @@
     Element functionElement,
     FormalParameterList paramNodes,
     KytheVName functionVName, {
-    AstNode returnNode: null,
+    AstNode returnNode = null,
   }) {
     var i = 0;
     var funcTypeVName =
@@ -1291,10 +1291,10 @@
   /// currently guarantee that the inputs to these fact kinds are valid for the
   /// associated nodeKind- if a non-null, then it will set.
   KytheVName addNodeAndFacts(String nodeKind,
-      {Element element: null,
-      KytheVName nodeVName: null,
-      String subKind: null,
-      String completeFact: null}) {
+      {Element element = null,
+      KytheVName nodeVName = null,
+      String subKind = null,
+      String completeFact = null}) {
     if (nodeVName == null) {
       nodeVName = _vNameFromElement(element, nodeKind);
     }
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
index c340e13..c88d8a5 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_method.dart
@@ -219,7 +219,7 @@
     _prepareExcludedNames();
     _prepareNames();
     // closure cannot have parameters
-    if (_selectionFunctionExpression != null && !_parameters.isEmpty) {
+    if (_selectionFunctionExpression != null && _parameters.isNotEmpty) {
       String message = format(
           'Cannot extract closure as method, it references {0} external variable(s).',
           _parameters.length);
@@ -464,6 +464,15 @@
    * location of this [DartExpression] in AST allows extracting.
    */
   RefactoringStatus _checkSelection() {
+    if (selectionOffset <= 0) {
+      return new RefactoringStatus.fatal(
+          'The selection offset must be greater than zero.');
+    }
+    if (selectionOffset + selectionLength >= resolveResult.content.length) {
+      return new RefactoringStatus.fatal(
+          'The selection end offset must be less then the length of the file.');
+    }
+
     // Check for implicitly selected closure.
     {
       FunctionExpression function = _findFunctionExpression();
@@ -501,7 +510,7 @@
     }
 
     // Check selected nodes.
-    if (!selectedNodes.isEmpty) {
+    if (selectedNodes.isNotEmpty) {
       AstNode selectedNode = selectedNodes.first;
       _parentMember = getEnclosingClassOrUnitMember(selectedNode);
       // single expression selected
@@ -549,7 +558,7 @@
       return false;
     }
     // has parameters
-    if (!parameters.isEmpty) {
+    if (parameters.isNotEmpty) {
       return false;
     }
     // is assignment
diff --git a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
index 1cfca50..d9d3370 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/extract_widget.dart
@@ -562,7 +562,7 @@
   /// constructor. If the [name] is already public, then the [name].
   String constructorName;
 
-  _Parameter(this.name, this.type, {this.isMethodParameter: false});
+  _Parameter(this.name, this.type, {this.isMethodParameter = false});
 }
 
 class _ParametersCollector extends RecursiveAstVisitor<void> {
diff --git a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
index fa26c42..5a1634f 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/inline_method.dart
@@ -388,7 +388,7 @@
     } else if (_methodBody is BlockFunctionBody) {
       Block body = (_methodBody as BlockFunctionBody).block;
       List<Statement> statements = body.statements;
-      if (statements.length >= 1) {
+      if (statements.isNotEmpty) {
         Statement lastStatement = statements[statements.length - 1];
         // "return" statement requires special handling
         if (lastStatement is ReturnStatement) {
@@ -399,7 +399,7 @@
           statements = statements.sublist(0, statements.length - 1);
         }
         // if there are statements, process them
-        if (!statements.isEmpty) {
+        if (statements.isNotEmpty) {
           SourceRange statementsRange =
               _methodUtils.getLinesRangeStatements(statements);
           _methodStatementsPart = _createSourcePart(statementsRange);
diff --git a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
index e830d48..8d99597 100644
--- a/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
+++ b/pkg/analysis_server/lib/src/services/refactoring/naming_conventions.dart
@@ -152,7 +152,7 @@
 
 RefactoringStatus _validateIdentifier(
     String identifier, String desc, String beginDesc,
-    {bool allowBuiltIn: false}) {
+    {bool allowBuiltIn = false}) {
   // has leading/trailing spaces
   String trimmed = identifier.trim();
   if (identifier != trimmed) {
@@ -205,7 +205,7 @@
  * Validates [identifier], should be lower camel case.
  */
 RefactoringStatus _validateLowerCamelCase(String identifier, String desc,
-    {bool allowBuiltIn: false}) {
+    {bool allowBuiltIn = false}) {
   desc += ' name';
   // null
   if (identifier == null) {
diff --git a/pkg/analysis_server/lib/src/services/search/hierarchy.dart b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
index 5689c32..461c167 100644
--- a/pkg/analysis_server/lib/src/services/search/hierarchy.dart
+++ b/pkg/analysis_server/lib/src/services/search/hierarchy.dart
@@ -160,7 +160,7 @@
   List<ClassElement> queue = new List<ClassElement>();
   queue.add(seed);
   // process queue
-  while (!queue.isEmpty) {
+  while (queue.isNotEmpty) {
     ClassElement current = queue.removeLast();
     // add if not checked already
     if (!result.add(current)) {
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index a03964c..57d8ac6 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -30,6 +30,7 @@
 import 'package:analyzer/src/context/source.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/sdk/sdk.dart';
+import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 import 'package:analyzer/src/generated/engine.dart' hide AnalysisResult;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -40,7 +41,6 @@
 import 'package:analyzer/src/source/package_map_resolver.dart';
 import 'package:analyzer/src/source/sdk_ext.dart';
 import 'package:path/path.dart' as pathPackage;
-import 'package:analyzer/src/dartdoc/dartdoc_directive_info.dart';
 
 final String kCustomCss = '''
 .lead, .page-title+.markdown-body>p:first-child {
@@ -171,6 +171,7 @@
             description: 'Latency statistics for code completion.');
 
   pathPackage.Context get pathContext;
+
   List<CompletionPerformance> get performanceItems;
 
   @override
@@ -364,6 +365,7 @@
 class CompletionPage extends AbstractCompletionPage {
   @override
   AnalysisServer server;
+
   CompletionPage(DiagnosticsSite site, this.server) : super(site);
 
   CompletionDomainHandler get completionDomain => server.handlers
@@ -392,6 +394,8 @@
     b.write(writeOption('Strong mode', options.strongMode));
     b.write(writeOption('Implicit dynamic', options.implicitDynamic));
     b.write(writeOption('Implicit casts', options.implicitCasts));
+    b.write(writeOption('Experiments', options.enabledExperiments.join(', ')));
+    b.write('<br>');
 
     b.write(
         writeOption('Analyze function bodies', options.analyzeFunctionBodies));
@@ -404,8 +408,6 @@
     b.write(writeOption('Preserve comments', options.preserveComments));
     b.write(writeOption('Strong mode hints', options.strongModeHints));
 
-    b.write(writeOption('Enabled experiments', options.enabledExperiments));
-
     return b.toString();
   }
 
@@ -455,10 +457,15 @@
     buf.writeln('<div class="column one-half">');
     h3('Analysis options');
     p(describe(driver.analysisOptions), raw: true);
+
+    h3('Pub files');
+    buf.writeln('<p>');
     buf.writeln(
         writeOption('Has .packages file', folder.getChild('.packages').exists));
     buf.writeln(writeOption(
         'Has pubspec.yaml file', folder.getChild('pubspec.yaml').exists));
+    buf.writeln('</p>');
+
     buf.writeln('</div>');
 
     buf.writeln('<div class="column one-half">');
@@ -472,12 +479,15 @@
         p(writeOption('Use summaries', sdk.useSummary), raw: true);
       }
     }
+
     buf.writeln('</div>');
 
     buf.writeln('</div>');
 
     h3('Lints');
-    p(driver.analysisOptions.lintRules.map((l) => l.name).join(', '));
+    List<String> lints =
+        driver.analysisOptions.lintRules.map((l) => l.name).toList()..sort();
+    ul(lints, (String lint) => buf.write(lint), classes: 'scroll-table');
 
     h3('Error processors');
     p(driver.analysisOptions.errorProcessors
@@ -555,7 +565,9 @@
             ?.getContext(driver.analysisContext)
             ?.dartdocDirectiveInfo ??
         new DartdocDirectiveInfo();
+    buf.write('<p class="scroll-table">');
     writeMap(info.templateMap);
+    buf.write('</p>');
   }
 
   void writeList<E>(List<E> list) {
@@ -978,6 +990,7 @@
 class LspCompletionPage extends AbstractCompletionPage {
   @override
   LspAnalysisServer server;
+
   LspCompletionPage(DiagnosticsSite site, this.server) : super(site);
 
   @override
@@ -1059,8 +1072,7 @@
   NotFoundPage(DiagnosticsSite site, this.path)
       : super(site, '', '404 Not found', description: "'$path' not found.");
 
-  Future generateContent(Map<String, String> params) async {
-  }
+  Future generateContent(Map<String, String> params) async {}
 }
 
 class PluginsPage extends DiagnosticPageWithNav {
@@ -1186,7 +1198,7 @@
 ''');
 
     // write out a table
-    void _writeRow(List<String> data, {bool header: false}) {
+    void _writeRow(List<String> data, {bool header = false}) {
       buf.write('<tr>');
       if (header) {
         for (String d in data) {
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index ff199b9..e63f94e 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -82,11 +82,11 @@
     buf.writeln('<h2>${escape(text)}</h2>');
   }
 
-  void h3(String text, {bool raw: false}) {
+  void h3(String text, {bool raw = false}) {
     buf.writeln('<h3>${raw ? text : escape(text)}</h3>');
   }
 
-  void h4(String text, {bool raw: false}) {
+  void h4(String text, {bool raw = false}) {
     buf.writeln('<h4>${raw ? text : escape(text)}</h4>');
   }
 
@@ -102,7 +102,7 @@
 
   bool isCurrentPage(String pathToTest) => path == pathToTest;
 
-  void p(String text, {String style, bool raw: false, String classes}) {
+  void p(String text, {String style, bool raw = false, String classes}) {
     String c = classes == null ? '' : ' class="$classes"';
 
     if (style != null) {
diff --git a/pkg/analysis_server/lib/src/utilities/flutter.dart b/pkg/analysis_server/lib/src/utilities/flutter.dart
index f18247a..3eb7abb 100644
--- a/pkg/analysis_server/lib/src/utilities/flutter.dart
+++ b/pkg/analysis_server/lib/src/utilities/flutter.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_dart.dart';
 
 class Flutter {
+  static const _nameAlign = 'Align';
   static const _nameCenter = 'Center';
   static const _nameContainer = 'Container';
   static const _namePadding = 'Padding';
@@ -33,9 +34,11 @@
   final String packageName;
   final String widgetsUri;
 
+  final Uri _uriAlignment;
   final Uri _uriAsync;
   final Uri _uriBasic;
   final Uri _uriContainer;
+  final Uri _uriEdgeInsets;
   final Uri _uriFramework;
   final Uri _uriWidgetsIcon;
   final Uri _uriWidgetsText;
@@ -65,13 +68,37 @@
 
   Flutter._(this.packageName, String uriPrefix)
       : widgetsUri = '$uriPrefix/widgets.dart',
+        _uriAlignment = Uri.parse('$uriPrefix/src/painting/alignment.dart'),
         _uriAsync = Uri.parse('$uriPrefix/src/widgets/async.dart'),
         _uriBasic = Uri.parse('$uriPrefix/src/widgets/basic.dart'),
         _uriContainer = Uri.parse('$uriPrefix/src/widgets/container.dart'),
+        _uriEdgeInsets = Uri.parse('$uriPrefix/src/painting/edge_insets.dart'),
         _uriFramework = Uri.parse('$uriPrefix/src/widgets/framework.dart'),
         _uriWidgetsIcon = Uri.parse('$uriPrefix/src/widgets/icon.dart'),
         _uriWidgetsText = Uri.parse('$uriPrefix/src/widgets/text.dart');
 
+  /**
+   * Return the argument with the given [index], or `null` if none.
+   */
+  Expression argumentByIndex(List<Expression> arguments, int index) {
+    if (index < arguments.length) {
+      return arguments[index];
+    }
+    return null;
+  }
+
+  /**
+   * Return the named expression with the given [name], or `null` if none.
+   */
+  NamedExpression argumentByName(List<Expression> arguments, String name) {
+    for (var argument in arguments) {
+      if (argument is NamedExpression && argument.name.label.name == name) {
+        return argument;
+      }
+    }
+    return null;
+  }
+
   void convertChildToChildren(
       InstanceCreationExpression childArg,
       NamedExpression namedExp,
@@ -184,6 +211,17 @@
   }
 
   /**
+   * Return the named expression with the given [name], or `null` if none.
+   */
+  NamedExpression findNamedArgument(
+    InstanceCreationExpression creation,
+    String name,
+  ) {
+    var arguments = creation.argumentList.arguments;
+    return argumentByName(arguments, name);
+  }
+
+  /**
    * If the given [node] is a simple identifier, find the named expression whose
    * name is the given [name] that is an argument to a Flutter instance creation
    * expression. Return null if any condition cannot be satisfied.
@@ -321,6 +359,51 @@
   bool isChildrenArgument(Expression argument) =>
       argument is NamedExpression && argument.name.label.name == 'children';
 
+  /// Return `true` if the [element] is the Flutter class `Alignment`.
+  bool isExactAlignment(ClassElement element) {
+    return _isExactWidget(element, 'Alignment', _uriAlignment);
+  }
+
+  /// Return `true` if the [element] is the Flutter class `AlignmentDirectional`.
+  bool isExactAlignmentDirectional(ClassElement element) {
+    return _isExactWidget(element, 'AlignmentDirectional', _uriAlignment);
+  }
+
+  /// Return `true` if the [element] is the Flutter class `AlignmentGeometry`.
+  bool isExactAlignmentGeometry(ClassElement element) {
+    return _isExactWidget(element, 'AlignmentGeometry', _uriAlignment);
+  }
+
+  /// Return `true` if the [type] is the Flutter type `EdgeInsetsGeometry`.
+  bool isExactEdgeInsetsGeometryType(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, 'EdgeInsetsGeometry', _uriEdgeInsets);
+  }
+
+  /**
+   * Return `true` if the [node] is creation of `Align`.
+   */
+  bool isExactlyAlignCreation(InstanceCreationExpression node) {
+    var type = node?.staticType;
+    return isExactWidgetTypeAlign(type);
+  }
+
+  /**
+   * Return `true` if the [node] is creation of `Container`.
+   */
+  bool isExactlyContainerCreation(InstanceCreationExpression node) {
+    var type = node?.staticType;
+    return isExactWidgetTypeContainer(type);
+  }
+
+  /**
+   * Return `true` if the [node] is creation of `Padding`.
+   */
+  bool isExactlyPaddingCreation(InstanceCreationExpression node) {
+    var type = node?.staticType;
+    return isExactWidgetTypePadding(type);
+  }
+
   /**
    * Return `true` if the given [type] is the Flutter class `StatefulWidget`.
    */
@@ -343,6 +426,14 @@
   }
 
   /**
+   * Return `true` if the given [type] is the Flutter class `Align`.
+   */
+  bool isExactWidgetTypeAlign(DartType type) {
+    return type is InterfaceType &&
+        _isExactWidget(type.element, _nameAlign, _uriBasic);
+  }
+
+  /**
    * Return `true` if the given [type] is the Flutter class `Center`.
    */
   bool isExactWidgetTypeCenter(DartType type) {
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index c542415..3850a81 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -19,6 +19,7 @@
   source_span: any
   package_config: any
   path: any
+  tflite_native: any
   watcher: any
   yaml: any
 
diff --git a/pkg/analysis_server/test/abstract_context.dart b/pkg/analysis_server/test/abstract_context.dart
index 9b67afb8..5a29769 100644
--- a/pkg/analysis_server/test/abstract_context.dart
+++ b/pkg/analysis_server/test/abstract_context.dart
@@ -20,8 +20,7 @@
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
 
-import 'src/utilities/flutter_util.dart';
-import 'src/utilities/meta_util.dart';
+import 'src/utilities/mock_packages.dart';
 
 /**
  * Finds an [Element] with the given [name].
@@ -64,12 +63,20 @@
 
   void addFlutterPackage() {
     addMetaPackage();
-    Folder libFolder = configureFlutterPackage(resourceProvider);
-    addTestPackageDependency('flutter', libFolder.parent.path);
+
+    addTestPackageDependency(
+      'ui',
+      MockPackages.instance.addUI(resourceProvider).parent.path,
+    );
+
+    addTestPackageDependency(
+      'flutter',
+      MockPackages.instance.addFlutter(resourceProvider).parent.path,
+    );
   }
 
   void addMetaPackage() {
-    Folder libFolder = configureMetaPackage(resourceProvider);
+    Folder libFolder = MockPackages.instance.addMeta(resourceProvider);
     addTestPackageDependency('meta', libFolder.parent.path);
   }
 
diff --git a/pkg/analysis_server/test/analysis/get_hover_test.dart b/pkg/analysis_server/test/analysis/get_hover_test.dart
index 0a94c06..b340cfe 100644
--- a/pkg/analysis_server/test/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/analysis/get_hover_test.dart
@@ -320,6 +320,20 @@
     expect(hover.propagatedType, isNull);
   }
 
+  test_extensionDeclaration() async {
+    createAnalysisOptionsFile(experiments: ['extension-methods']);
+    addTestFile('''
+class A {}
+/// Comment
+extension E on A {}
+''');
+    HoverInformation hover = await prepareHover('E');
+    expect(hover.elementDescription, 'extension E on A');
+    expect(hover.dartdoc, 'Comment');
+    expect(hover.staticType, isNull);
+    expect(hover.propagatedType, isNull);
+  }
+
   test_function_topLevel_declaration() async {
     addTestFile('''
 library my.library;
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index f4593b4..c6b6de9 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -53,7 +53,6 @@
   AnalysisServer server;
   RequestHandler handler;
 
-  final List<ServerErrorParams> serverErrors = <ServerErrorParams>[];
   final List<GeneralAnalysisService> generalServices =
       <GeneralAnalysisService>[];
   final Map<AnalysisService, List<String>> analysisSubscriptions = {};
@@ -105,6 +104,19 @@
     return testFile;
   }
 
+  /// Create an analysis options file based on the given arguments.
+  void createAnalysisOptionsFile({List<String> experiments}) {
+    StringBuffer buffer = new StringBuffer();
+    if (experiments != null) {
+      buffer.writeln('analyzer:');
+      buffer.writeln('  enable-experiment:');
+      for (String experiment in experiments) {
+        buffer.writeln('    - $experiment');
+      }
+    }
+    addAnalysisOptionsFile(buffer.toString());
+  }
+
   AnalysisServer createAnalysisServer() {
     //
     // Create an SDK in the mock file system.
@@ -135,6 +147,12 @@
     handleSuccessfulRequest(request, handler: analysisHandler);
   }
 
+  void doAllDeclarationsTrackerWork() {
+    while (server.declarationsTracker.hasWork) {
+      server.declarationsTracker.doWork();
+    }
+  }
+
   /**
    * Returns the offset of [search] in [testCode].
    * Fails if not found.
@@ -175,8 +193,7 @@
 
   void processNotification(Notification notification) {
     if (notification.event == SERVER_NOTIFICATION_ERROR) {
-      var params = new ServerErrorParams.fromNotification(notification);
-      serverErrors.add(params);
+      fail('${notification.toJson()}');
     }
   }
 
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index 692cbb4..84426bd 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2426,7 +2426,7 @@
    * have not yet been fixed.
    */
   void buildTests(String baseName, String originalSource, List<String> results,
-      {Map<String, String> extraFiles, String failingTests: ''}) {
+      {Map<String, String> extraFiles, String failingTests = ''}) {
     List<LocationSpec> completionTests =
         LocationSpec.from(originalSource, results);
     completionTests.sort((LocationSpec first, LocationSpec second) {
diff --git a/pkg/analysis_server/test/completion_test_support.dart b/pkg/analysis_server/test/completion_test_support.dart
index 8588391..15fde66 100644
--- a/pkg/analysis_server/test/completion_test_support.dart
+++ b/pkg/analysis_server/test/completion_test_support.dart
@@ -190,14 +190,14 @@
     }
     if (!(badPoints.isEmpty && badResults.isEmpty)) {
       StringBuffer err = new StringBuffer();
-      if (!badPoints.isEmpty) {
+      if (badPoints.isNotEmpty) {
         err.write("No test location for tests:");
         for (String ch in badPoints) {
           err..write(' ')..write(ch);
         }
         err.write(' ');
       }
-      if (!badResults.isEmpty) {
+      if (badResults.isNotEmpty) {
         err.write("No results for tests:");
         for (String ch in badResults) {
           err..write(' ')..write(ch);
diff --git a/pkg/analysis_server/test/domain_completion_util.dart b/pkg/analysis_server/test/domain_completion_util.dart
index 190c397..db7b4ef 100644
--- a/pkg/analysis_server/test/domain_completion_util.dart
+++ b/pkg/analysis_server/test/domain_completion_util.dart
@@ -40,9 +40,9 @@
   }
 
   void assertHasResult(CompletionSuggestionKind kind, String completion,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      bool isDeprecated: false,
-      bool isPotential: false,
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      bool isDeprecated = false,
+      bool isPotential = false,
       int selectionOffset,
       ElementKind elementKind}) {
     var cs;
diff --git a/pkg/analysis_server/test/domain_edit_dartfix_test.dart b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
index 930f08a..60c01fe 100644
--- a/pkg/analysis_server/test/domain_edit_dartfix_test.dart
+++ b/pkg/analysis_server/test/domain_edit_dartfix_test.dart
@@ -48,16 +48,28 @@
     }
   }
 
-  Future<EditDartfixResult> performFix({List<String> includedFixes}) async {
+  Future<EditDartfixResult> performFix(
+      {List<String> includedFixes, bool pedantic}) async {
+    var response =
+        await performFixRaw(includedFixes: includedFixes, pedantic: pedantic);
+    expect(response.error, isNull);
+    return EditDartfixResult.fromResponse(response);
+  }
+
+  Future<Response> performFixRaw(
+      {List<String> includedFixes,
+      List<String> excludedFixes,
+      bool pedantic}) async {
     final id = nextRequestId;
     final params = new EditDartfixParams([projectPath]);
     params.includedFixes = includedFixes;
+    params.excludedFixes = excludedFixes;
+    params.includePedanticFixes = pedantic;
     final request = new Request(id, 'edit.dartfix', params.toJson());
 
     final response = await new EditDartFix(server, request).compute();
     expect(response.id, id);
-
-    return EditDartfixResult.fromResponse(response);
+    return response;
   }
 
   @override
@@ -93,34 +105,14 @@
 ''');
   }
 
-  test_dartfix_convertClassToMixin() async {
-    addTestFile('''
-class A {}
-class B extends A {}
-class C with B {}
-    ''');
-    createProject();
-    EditDartfixResult result = await performFix();
-    expect(result.suggestions, hasLength(1));
-    expectSuggestion(result.suggestions[0], 'mixin', 17, 1);
-    expectEdits(result.edits, '''
-class A {}
-mixin B implements A {}
-class C with B {}
-    ''');
-  }
-
-  test_dartfix_convertToIntLiteral() async {
+  test_dartfix_excludedFix_invalid() async {
     addTestFile('''
 const double myDouble = 42.0;
     ''');
     createProject();
-    EditDartfixResult result = await performFix();
-    expect(result.suggestions, hasLength(1));
-    expectSuggestion(result.suggestions[0], 'int literal', 24, 4);
-    expectEdits(result.edits, '''
-const double myDouble = 42;
-    ''');
+
+    final result = await performFixRaw(excludedFixes: ['not-a-fix']);
+    expect(result.error, isNotNull);
   }
 
   test_dartfix_excludedSource() async {
@@ -137,11 +129,40 @@
     createProject();
 
     // Assert no suggestions now that source has been excluded
-    final result = await performFix();
+    final result = await performFix(includedFixes: ['double-to-int']);
     expect(result.suggestions, hasLength(0));
     expect(result.edits, hasLength(0));
   }
 
+  test_dartfix_fixNamedConstructorTypeArgs() async {
+    addTestFile('''
+class A<T> { A.from(Object obj) { } }
+main() {
+  print(new A.from<String>([]));
+}
+    ''');
+    createProject();
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'type arguments', 65, 8);
+    expectEdits(result.edits, '''
+class A<T> { A.from(Object obj) { } }
+main() {
+  print(new A<String>.from([]));
+}
+    ''');
+  }
+
+  test_dartfix_includedFix_invalid() async {
+    addTestFile('''
+const double myDouble = 42.0;
+    ''');
+    createProject();
+
+    final result = await performFixRaw(includedFixes: ['not-a-fix']);
+    expect(result.error, isNotNull);
+  }
+
   test_dartfix_map_for_elements() async {
     // Add analysis options to enable ui as code
     newFile('/project/analysis_options.yaml', content: '''
@@ -169,25 +190,6 @@
 ''');
   }
 
-  test_dartfix_moveTypeArgumentToClass() async {
-    addTestFile('''
-class A<T> { A.from(Object obj) { } }
-main() {
-  print(new A.from<String>([]));
-}
-    ''');
-    createProject();
-    EditDartfixResult result = await performFix();
-    expect(result.suggestions, hasLength(1));
-    expectSuggestion(result.suggestions[0], 'type arguments', 65, 8);
-    expectEdits(result.edits, '''
-class A<T> { A.from(Object obj) { } }
-main() {
-  print(new A<String>.from([]));
-}
-    ''');
-  }
-
   test_dartfix_non_nullable() async {
     // Add analysis options to enable non-nullable analysis
     newFile('/project/analysis_options.yaml', content: '''
@@ -300,7 +302,8 @@
     createProject();
 
     // Assert dartfix suggestions
-    EditDartfixResult result = await performFix();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['double-to-int']);
     expect(result.suggestions, hasLength(1));
     expectSuggestion(result.suggestions[0], 'int literal', 38, 4);
     expectEdits(result.edits, '''
@@ -317,7 +320,8 @@
     createProject();
 
     // Assert dartfix suggestions
-    EditDartfixResult result = await performFix();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['double-to-int']);
     expect(result.suggestions, hasLength(1));
     expectSuggestion(result.suggestions[0], 'int literal', 38, 4);
     expectEdits(result.edits, '''
@@ -326,7 +330,103 @@
     ''');
   }
 
-  test_dartfix_spread_collections() async {
+  test_dartfix_pedantic() async {
+    addTestFile('main(List args) { if (args.length == 0) { } }');
+    createProject();
+    EditDartfixResult result = await performFix(pedantic: true);
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], "Replace with 'isEmpty'", 22, 16);
+    expect(result.hasErrors, isFalse);
+    expectEdits(result.edits, 'main(List args) { if (args.isEmpty) { } }');
+  }
+
+  test_dartfix_preferEqualForDefaultValues() async {
+    // Add analysis options to enable ui as code
+    addTestFile('f({a: 1}) { }');
+    createProject();
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], "Replace ':' with '='", 4, 1);
+    expect(result.hasErrors, isFalse);
+    expectEdits(result.edits, 'f({a = 1}) { }');
+  }
+
+  test_dartfix_preferForElementsToMapFromIterable() async {
+    addTestFile('''
+var m =
+  Map<int, int>.fromIterable([1, 2, 3], key: (i) => i, value: (i) => i * 2);
+    ''');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['map-for-elements']);
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(
+        result.suggestions[0], "Convert to a 'for' element", 10, 3);
+    expectEdits(result.edits, '''
+var m =
+  { for (var i in [1, 2, 3]) i : i * 2 };
+    ''');
+  }
+
+  test_dartfix_preferIfElementsToConditionalExpressions() async {
+    addTestFile('''
+f(bool b) => ['a', b ? 'c' : 'd', 'e'];
+    ''');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['collection-if-elements']);
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(
+        result.suggestions[0], "Convert to an 'if' element", 19, 1);
+    expectEdits(result.edits, '''
+f(bool b) => ['a', if (b) 'c' else 'd', 'e'];
+    ''');
+  }
+
+  test_dartfix_preferIntLiterals() async {
+    addTestFile('''
+const double myDouble = 42.0;
+    ''');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['double-to-int']);
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'int literal', 24, 4);
+    expectEdits(result.edits, '''
+const double myDouble = 42;
+    ''');
+  }
+
+  test_dartfix_preferIsEmpty() async {
+    addTestFile('main(List<String> args) { if (args.length == 0) { } }');
+    createProject();
+    EditDartfixResult result =
+        await performFix(includedFixes: ['prefer-is-empty']);
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], "Replace with 'isEmpty'", 30, 16);
+    expect(result.hasErrors, isFalse);
+    expectEdits(
+        result.edits, 'main(List<String> args) { if (args.isEmpty) { } }');
+  }
+
+  test_dartfix_preferMixin() async {
+    addTestFile('''
+class A {}
+class B extends A {}
+class C with B {}
+    ''');
+    createProject();
+    EditDartfixResult result = await performFix();
+    expect(result.suggestions, hasLength(1));
+    expectSuggestion(result.suggestions[0], 'mixin', 17, 1);
+    expectEdits(result.edits, '''
+class A {}
+mixin B implements A {}
+class C with B {}
+    ''');
+  }
+
+  test_dartfix_preferSpreadCollections() async {
     // Add analysis options to enable ui as code
     newFile('/project/analysis_options.yaml', content: '''
 analyzer:
diff --git a/pkg/analysis_server/test/edit/fixes_test.dart b/pkg/analysis_server/test/edit/fixes_test.dart
index e80a447..22a7245 100644
--- a/pkg/analysis_server/test/edit/fixes_test.dart
+++ b/pkg/analysis_server/test/edit/fixes_test.dart
@@ -40,6 +40,7 @@
 }
 ''');
     await waitForTasksFinished();
+    doAllDeclarationsTrackerWork();
     List<AnalysisErrorFixes> errorFixes =
         await _getFixesAt('Completer<String>');
     expect(errorFixes, hasLength(1));
@@ -143,9 +144,6 @@
   bbb: any
 ''');
 
-    // Ensure that the target is analyzed as an implicit source.
-    newFile('/aaa/lib/foo.dart', content: 'import "package:bbb/target.dart";');
-
     newFolder('/bbb');
     newFile('/bbb/.packages', content: '''
 bbb:${toUri('/bbb/lib')}
@@ -163,6 +161,7 @@
     _addOverlay(testFile, testCode);
 
     await waitForTasksFinished();
+    doAllDeclarationsTrackerWork();
 
     List<String> fixes = (await _getFixesAt('Foo()'))
         .single
diff --git a/pkg/analysis_server/test/edit/postfix_completion_test.dart b/pkg/analysis_server/test/edit/postfix_completion_test.dart
index c8cede9..71b5f4e 100644
--- a/pkg/analysis_server/test/edit/postfix_completion_test.dart
+++ b/pkg/analysis_server/test/edit/postfix_completion_test.dart
@@ -69,7 +69,7 @@
 
   void _assertHasChange(String message, String expectedCode, [Function cmp]) {
     if (change.message == message) {
-      if (!change.edits.isEmpty) {
+      if (change.edits.isNotEmpty) {
         String resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
@@ -89,7 +89,7 @@
   }
 
   _prepareCompletion(String key,
-      {bool atStart: false, bool atEnd: false, int delta: 0}) async {
+      {bool atStart = false, bool atEnd = false, int delta = 0}) async {
     int offset = findOffset(key);
     String src = testCode.replaceFirst(key, '', offset);
     modifyTestFile(src);
diff --git a/pkg/analysis_server/test/edit/refactoring_test.dart b/pkg/analysis_server/test/edit/refactoring_test.dart
index df6558d..6bef10b 100644
--- a/pkg/analysis_server/test/edit/refactoring_test.dart
+++ b/pkg/analysis_server/test/edit/refactoring_test.dart
@@ -13,7 +13,7 @@
 
 import '../analysis_abstract.dart';
 import '../mocks.dart';
-import '../src/utilities/flutter_util.dart' as flutter;
+import '../src/utilities/mock_packages.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -814,7 +814,7 @@
   List<RefactoringKind> kinds;
 
   void addFlutterPackage() {
-    var libFolder = flutter.configureFlutterPackage(resourceProvider);
+    var libFolder = MockPackages.instance.addFlutter(resourceProvider);
     // Create .packages in the project.
     newFile(join(projectPath, '.packages'), content: '''
 flutter:${libFolder.toUri()}
@@ -1336,7 +1336,7 @@
 @reflectiveTest
 class RenameTest extends _AbstractGetRefactoring_Test {
   Future<Response> sendRenameRequest(String search, String newName,
-      {String id: '0', bool validateOnly: false}) {
+      {String id = '0', bool validateOnly = false}) {
     RenameOptions options = newName != null ? new RenameOptions(newName) : null;
     Request request = new EditGetRefactoringParams(RefactoringKind.RENAME,
             testFile, findOffset(search), 0, validateOnly,
diff --git a/pkg/analysis_server/test/edit/statement_completion_test.dart b/pkg/analysis_server/test/edit/statement_completion_test.dart
index 4b381be..6ebb6ff 100644
--- a/pkg/analysis_server/test/edit/statement_completion_test.dart
+++ b/pkg/analysis_server/test/edit/statement_completion_test.dart
@@ -104,7 +104,7 @@
 
   void _assertHasChange(String message, String expectedCode, [Function cmp]) {
     if (change.message == message) {
-      if (!change.edits.isEmpty) {
+      if (change.edits.isNotEmpty) {
         String resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
@@ -124,7 +124,7 @@
   }
 
   _prepareCompletion(String search,
-      {bool atStart: false, bool atEnd: false, int delta: 0}) async {
+      {bool atStart = false, bool atEnd = false, int delta = 0}) async {
     int offset = findOffset(search);
     if (atStart) {
       delta = 0;
diff --git a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
index ae7e4db..e177c84 100644
--- a/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/get_hover_test.dart
@@ -67,11 +67,11 @@
     List<String> descriptionRegexps,
     String kind,
     List<String> staticTypeRegexps, {
-    bool isLocal: false,
-    bool isCore: false,
-    String docRegexp: null,
-    bool isLiteral: false,
-    List<String> parameterRegexps: null,
+    bool isLocal = false,
+    bool isCore = false,
+    String docRegexp = null,
+    bool isLiteral = false,
+    List<String> parameterRegexps = null,
   }) {
     int offset = text.indexOf(target);
     return sendAnalysisGetHover(pathname, offset).then((result) async {
diff --git a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
index d837ff2..42cd584 100644
--- a/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
+++ b/pkg/analysis_server/test/integration/analysis/highlights2_test.dart
@@ -118,10 +118,6 @@
     // There should be 1 error due to the fact that unresolvedIdentifier is
     // unresolved.
     expect(currentAnalysisErrors[pathname], hasLength(1));
-    void check(HighlightRegionType type, List<String> expected) {
-      expect(highlights[type], equals(expected.toSet()));
-      highlights.remove(type);
-    }
 
     check(HighlightRegionType.ANNOTATION, ['@override']);
     check(HighlightRegionType.BUILT_IN,
@@ -178,6 +174,7 @@
 ''';
     await computeHighlights(pathname, text);
     expect(currentAnalysisErrors[pathname], hasLength(0));
+
     check(HighlightRegionType.BUILT_IN, ['implements', 'mixin', 'on']);
     check(HighlightRegionType.KEYWORD, ['class']);
   }
diff --git a/pkg/analysis_server/test/integration/completion/list_token_details_test.dart b/pkg/analysis_server/test/integration/completion/list_token_details_test.dart
index 04df740..8aee4f8 100644
--- a/pkg/analysis_server/test/integration/completion/list_token_details_test.dart
+++ b/pkg/analysis_server/test/integration/completion/list_token_details_test.dart
@@ -25,7 +25,7 @@
   }
 
   @override
-  Future standardAnalysisSetup({bool subscribeStatus: true}) {
+  Future standardAnalysisSetup({bool subscribeStatus = true}) {
     List<Future> futures = <Future>[];
     if (subscribeStatus) {
       futures.add(sendServerSetSubscriptions([ServerService.STATUS]));
diff --git a/pkg/analysis_server/test/integration/coverage.md b/pkg/analysis_server/test/integration/coverage.md
index 6df0629..ae82a71 100644
--- a/pkg/analysis_server/test/integration/coverage.md
+++ b/pkg/analysis_server/test/integration/coverage.md
@@ -97,3 +97,5 @@
 - [ ] flutter.getChangeAddForDesignTimeConstructor
 - [ ] flutter.setSubscriptions
 - [ ] flutter.outline
+- [ ] flutter.getWidgetDescription
+- [ ] flutter.setWidgetPropertyValue
diff --git a/pkg/analysis_server/test/integration/edit/format_test.dart b/pkg/analysis_server/test/integration/edit/format_test.dart
index 8380c5b..4f62ef2 100644
--- a/pkg/analysis_server/test/integration/edit/format_test.dart
+++ b/pkg/analysis_server/test/integration/edit/format_test.dart
@@ -16,7 +16,7 @@
 
 @reflectiveTest
 class FormatTest extends AbstractAnalysisServerIntegrationTest {
-  String formatTestSetup({bool withErrors: false}) {
+  String formatTestSetup({bool withErrors = false}) {
     String pathname = sourcePath('test.dart');
 
     if (withErrors) {
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 cd4df3d..3516f8b 100644
--- a/pkg/analysis_server/test/integration/support/integration_test_methods.dart
+++ b/pkg/analysis_server/test/integration/support/integration_test_methods.dart
@@ -1744,6 +1744,10 @@
    *   If a name is specified that does not match the name of a known fix, an
    *   error of type UNKNOWN_FIX will be generated.
    *
+   * includePedanticFixes: bool (optional)
+   *
+   *   A flag indicating that "pedantic" fixes should be applied.
+   *
    * includeRequiredFixes: bool (optional)
    *
    *   A flag indicating that "required" fixes should be applied.
@@ -1786,10 +1790,12 @@
    */
   Future<EditDartfixResult> sendEditDartfix(List<String> included,
       {List<String> includedFixes,
+      bool includePedanticFixes,
       bool includeRequiredFixes,
       List<String> excludedFixes}) async {
     var params = new EditDartfixParams(included,
             includedFixes: includedFixes,
+            includePedanticFixes: includePedanticFixes,
             includeRequiredFixes: includeRequiredFixes,
             excludedFixes: excludedFixes)
         .toJson();
@@ -2581,36 +2587,81 @@
   }
 
   /**
-   * Return the change that adds the forDesignTime() constructor for the widget
-   * class at the given offset.
+   * Return the description of the widget instance at the given location.
+   *
+   * If the location does not have a support widget, an error of type
+   * FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET will be generated.
    *
    * Parameters
    *
    * file: FilePath
    *
-   *   The file containing the code of the class.
+   *   The file where the widget instance is created.
    *
    * offset: int
    *
-   *   The offset of the class in the code.
+   *   The offset in the file where the widget instance is created.
+   *
+   * Returns
+   *
+   * properties: List<FlutterWidgetProperty>
+   *
+   *   The list of properties of the widget. Some of the properties might be
+   *   read only, when their editor is not set. This might be because they have
+   *   type that we don't know how to edit, or for compound properties that
+   *   work as containers for sub-properties.
+   */
+  Future<FlutterGetWidgetDescriptionResult> sendFlutterGetWidgetDescription(
+      String file, int offset) async {
+    var params = new FlutterGetWidgetDescriptionParams(file, offset).toJson();
+    var result = await server.send("flutter.getWidgetDescription", params);
+    ResponseDecoder decoder = new ResponseDecoder(null);
+    return new FlutterGetWidgetDescriptionResult.fromJson(
+        decoder, 'result', result);
+  }
+
+  /**
+   * Set the value of a property, or remove it.
+   *
+   * The server will generate a change that the client should apply to the
+   * project to get the value of the property set to the new value. The
+   * complexity of the change might be from updating a single literal value in
+   * the code, to updating multiple files to get libraries imported, and new
+   * intermediate widgets instantiated.
+   *
+   * Parameters
+   *
+   * id: int
+   *
+   *   The identifier of the property, previously returned as a part of a
+   *   FlutterWidgetProperty.
+   *
+   *   An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is
+   *   generated if the identifier is not valid.
+   *
+   * value: FlutterWidgetPropertyValue (optional)
+   *
+   *   The new value to set for the property.
+   *
+   *   If absent, indicates that the property should be removed. If the
+   *   property corresponds to an optional parameter, the corresponding named
+   *   argument is removed. If the property isRequired is true,
+   *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
    *
    * Returns
    *
    * change: SourceChange
    *
-   *   The change that adds the forDesignTime() constructor. If the change
-   *   cannot be produced, an error is returned.
+   *   The change that should be applied.
    */
-  Future<FlutterGetChangeAddForDesignTimeConstructorResult>
-      sendFlutterGetChangeAddForDesignTimeConstructor(
-          String file, int offset) async {
+  Future<FlutterSetWidgetPropertyValueResult> sendFlutterSetWidgetPropertyValue(
+      int id,
+      {FlutterWidgetPropertyValue value}) async {
     var params =
-        new FlutterGetChangeAddForDesignTimeConstructorParams(file, offset)
-            .toJson();
-    var result = await server.send(
-        "flutter.getChangeAddForDesignTimeConstructor", params);
+        new FlutterSetWidgetPropertyValueParams(id, value: value).toJson();
+    var result = await server.send("flutter.setWidgetPropertyValue", params);
     ResponseDecoder decoder = new ResponseDecoder(null);
-    return new FlutterGetChangeAddForDesignTimeConstructorResult.fromJson(
+    return new FlutterSetWidgetPropertyValueResult.fromJson(
         decoder, 'result', result);
   }
 
@@ -2670,13 +2721,6 @@
    * outline: FlutterOutline
    *
    *   The outline associated with the file.
-   *
-   * instrumentedCode: String (optional)
-   *
-   *   If the file has Flutter widgets that can be rendered, this field has the
-   *   instrumented content of the file, that allows associating widgets with
-   *   corresponding outline nodes. If there are no widgets to render, this
-   *   field is absent.
    */
   Stream<FlutterOutlineParams> onFlutterOutline;
 
diff --git a/pkg/analysis_server/test/integration/support/integration_tests.dart b/pkg/analysis_server/test/integration/support/integration_tests.dart
index 7d348d6..c852984 100644
--- a/pkg/analysis_server/test/integration/support/integration_tests.dart
+++ b/pkg/analysis_server/test/integration/support/integration_tests.dart
@@ -18,6 +18,8 @@
 
 const Matcher isBool = const TypeMatcher<bool>();
 
+const Matcher isDouble = const TypeMatcher<double>();
+
 const Matcher isInt = const TypeMatcher<int>();
 
 const Matcher isNotification = const MatchesJsonObject(
@@ -40,7 +42,7 @@
  * Assert that [actual] matches [matcher].
  */
 void outOfTestExpect(actual, Matcher matcher,
-    {String reason, skip, bool verbose: false}) {
+    {String reason, skip, bool verbose = false}) {
   var matchState = {};
   try {
     if (matcher.matches(actual, matchState)) return;
@@ -242,7 +244,7 @@
    * then also enable [SERVER_NOTIFICATION_STATUS] notifications so that
    * [analysisFinished] can be used.
    */
-  Future standardAnalysisSetup({bool subscribeStatus: true}) {
+  Future standardAnalysisSetup({bool subscribeStatus = true}) {
     List<Future> futures = <Future>[];
     if (subscribeStatus) {
       futures.add(sendServerSetSubscriptions([ServerService.STATUS]));
@@ -663,10 +665,10 @@
   Future start({
     int diagnosticPort,
     String instrumentationLogFile,
-    bool profileServer: false,
+    bool profileServer = false,
     String sdkPath,
     int servicesPort,
-    bool useAnalysisHighlight2: false,
+    bool useAnalysisHighlight2 = false,
   }) async {
     if (_process != null) {
       throw new Exception('Process already started');
@@ -745,7 +747,7 @@
   /**
    * Deal with bad data received from the server.
    */
-  void _badDataFromServer(String details, {bool silent: false}) {
+  void _badDataFromServer(String details, {bool silent = false}) {
     if (!silent) {
       _recordStdio('BAD DATA FROM SERVER: $details');
     }
diff --git a/pkg/analysis_server/test/integration/support/protocol_matchers.dart b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
index 2dc3198..34cd727 100644
--- a/pkg/analysis_server/test/integration/support/protocol_matchers.dart
+++ b/pkg/analysis_server/test/integration/support/protocol_matchers.dart
@@ -470,6 +470,7 @@
  *   CONSTRUCTOR_INVOCATION
  *   ENUM
  *   ENUM_CONSTANT
+ *   EXTENSION
  *   FIELD
  *   FILE
  *   FUNCTION
@@ -499,6 +500,7 @@
   "CONSTRUCTOR_INVOCATION",
   "ENUM",
   "ENUM_CONSTANT",
+  "EXTENSION",
   "FIELD",
   "FILE",
   "FUNCTION",
@@ -617,12 +619,6 @@
  *   "parentAssociationLabel": optional String
  *   "variableName": optional String
  *   "children": optional List<FlutterOutline>
- *   "id": optional int
- *   "isWidgetClass": optional bool
- *   "renderConstructor": optional String
- *   "stateClassName": optional String
- *   "stateOffset": optional int
- *   "stateLength": optional int
  * }
  */
 final Matcher isFlutterOutline =
@@ -639,13 +635,7 @@
           "className": isString,
           "parentAssociationLabel": isString,
           "variableName": isString,
-          "children": isListOf(isFlutterOutline),
-          "id": isInt,
-          "isWidgetClass": isBool,
-          "renderConstructor": isString,
-          "stateClassName": isString,
-          "stateOffset": isInt,
-          "stateLength": isInt
+          "children": isListOf(isFlutterOutline)
         }));
 
 /**
@@ -657,6 +647,8 @@
  *   "literalValueBoolean": optional bool
  *   "literalValueInteger": optional int
  *   "literalValueString": optional String
+ *   "nameLocation": optional Location
+ *   "valueLocation": optional Location
  * }
  */
 final Matcher isFlutterOutlineAttribute =
@@ -666,7 +658,9 @@
         }, optionalFields: {
           "literalValueBoolean": isBool,
           "literalValueInteger": isInt,
-          "literalValueString": isString
+          "literalValueString": isString,
+          "nameLocation": isLocation,
+          "valueLocation": isLocation
         }));
 
 /**
@@ -700,6 +694,103 @@
 final Matcher isFlutterService = new MatchesEnum("FlutterService", ["OUTLINE"]);
 
 /**
+ * FlutterWidgetProperty
+ *
+ * {
+ *   "documentation": optional String
+ *   "expression": optional String
+ *   "id": int
+ *   "isRequired": bool
+ *   "isSafeToUpdate": bool
+ *   "name": String
+ *   "children": optional List<FlutterWidgetProperty>
+ *   "editor": optional FlutterWidgetPropertyEditor
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ */
+final Matcher isFlutterWidgetProperty =
+    new LazyMatcher(() => new MatchesJsonObject("FlutterWidgetProperty", {
+          "id": isInt,
+          "isRequired": isBool,
+          "isSafeToUpdate": isBool,
+          "name": isString
+        }, optionalFields: {
+          "documentation": isString,
+          "expression": isString,
+          "children": isListOf(isFlutterWidgetProperty),
+          "editor": isFlutterWidgetPropertyEditor,
+          "value": isFlutterWidgetPropertyValue
+        }));
+
+/**
+ * FlutterWidgetPropertyEditor
+ *
+ * {
+ *   "kind": FlutterWidgetPropertyEditorKind
+ *   "enumItems": optional List<FlutterWidgetPropertyValueEnumItem>
+ * }
+ */
+final Matcher isFlutterWidgetPropertyEditor = new LazyMatcher(() =>
+    new MatchesJsonObject("FlutterWidgetPropertyEditor", {
+      "kind": isFlutterWidgetPropertyEditorKind
+    }, optionalFields: {
+      "enumItems": isListOf(isFlutterWidgetPropertyValueEnumItem)
+    }));
+
+/**
+ * FlutterWidgetPropertyEditorKind
+ *
+ * enum {
+ *   BOOL
+ *   DOUBLE
+ *   ENUM
+ *   ENUM_LIKE
+ *   INT
+ *   STRING
+ * }
+ */
+final Matcher isFlutterWidgetPropertyEditorKind = new MatchesEnum(
+    "FlutterWidgetPropertyEditorKind",
+    ["BOOL", "DOUBLE", "ENUM", "ENUM_LIKE", "INT", "STRING"]);
+
+/**
+ * FlutterWidgetPropertyValue
+ *
+ * {
+ *   "boolValue": optional bool
+ *   "doubleValue": optional double
+ *   "intValue": optional int
+ *   "stringValue": optional String
+ *   "enumValue": optional FlutterWidgetPropertyValueEnumItem
+ *   "expression": optional String
+ * }
+ */
+final Matcher isFlutterWidgetPropertyValue = new LazyMatcher(() =>
+    new MatchesJsonObject("FlutterWidgetPropertyValue", null, optionalFields: {
+      "boolValue": isBool,
+      "doubleValue": isDouble,
+      "intValue": isInt,
+      "stringValue": isString,
+      "enumValue": isFlutterWidgetPropertyValueEnumItem,
+      "expression": isString
+    }));
+
+/**
+ * FlutterWidgetPropertyValueEnumItem
+ *
+ * {
+ *   "libraryUri": String
+ *   "className": String
+ *   "name": String
+ *   "documentation": optional String
+ * }
+ */
+final Matcher isFlutterWidgetPropertyValueEnumItem = new LazyMatcher(() =>
+    new MatchesJsonObject("FlutterWidgetPropertyValueEnumItem",
+        {"libraryUri": isString, "className": isString, "name": isString},
+        optionalFields: {"documentation": isString}));
+
+/**
  * FoldingKind
  *
  * enum {
@@ -1438,6 +1529,9 @@
  *   CONTENT_MODIFIED
  *   DEBUG_PORT_COULD_NOT_BE_OPENED
  *   FILE_NOT_ANALYZED
+ *   FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED
  *   FORMAT_INVALID_FILE
  *   FORMAT_WITH_ERRORS
  *   GET_ERRORS_INVALID_FILE
@@ -1470,6 +1564,9 @@
   "CONTENT_MODIFIED",
   "DEBUG_PORT_COULD_NOT_BE_OPENED",
   "FILE_NOT_ANALYZED",
+  "FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET",
+  "FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID",
+  "FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED",
   "FORMAT_INVALID_FILE",
   "FORMAT_WITH_ERRORS",
   "GET_ERRORS_INVALID_FILE",
@@ -2435,6 +2532,7 @@
  * {
  *   "included": List<FilePath>
  *   "includedFixes": optional List<String>
+ *   "includePedanticFixes": optional bool
  *   "includeRequiredFixes": optional bool
  *   "excludedFixes": optional List<String>
  * }
@@ -2444,6 +2542,7 @@
           "included": isListOf(isFilePath)
         }, optionalFields: {
           "includedFixes": isListOf(isString),
+          "includePedanticFixes": isBool,
           "includeRequiredFixes": isBool,
           "excludedFixes": isListOf(isString)
         }));
@@ -3027,29 +3126,27 @@
     () => new MatchesJsonObject("extractWidget options", {"name": isString}));
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor params
+ * flutter.getWidgetDescription params
  *
  * {
  *   "file": FilePath
  *   "offset": int
  * }
  */
-final Matcher isFlutterGetChangeAddForDesignTimeConstructorParams =
-    new LazyMatcher(() => new MatchesJsonObject(
-        "flutter.getChangeAddForDesignTimeConstructor params",
+final Matcher isFlutterGetWidgetDescriptionParams = new LazyMatcher(() =>
+    new MatchesJsonObject("flutter.getWidgetDescription params",
         {"file": isFilePath, "offset": isInt}));
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor result
+ * flutter.getWidgetDescription result
  *
  * {
- *   "change": SourceChange
+ *   "properties": List<FlutterWidgetProperty>
  * }
  */
-final Matcher isFlutterGetChangeAddForDesignTimeConstructorResult =
-    new LazyMatcher(() => new MatchesJsonObject(
-        "flutter.getChangeAddForDesignTimeConstructor result",
-        {"change": isSourceChange}));
+final Matcher isFlutterGetWidgetDescriptionResult = new LazyMatcher(() =>
+    new MatchesJsonObject("flutter.getWidgetDescription result",
+        {"properties": isListOf(isFlutterWidgetProperty)}));
 
 /**
  * flutter.outline params
@@ -3057,13 +3154,11 @@
  * {
  *   "file": FilePath
  *   "outline": FlutterOutline
- *   "instrumentedCode": optional String
  * }
  */
 final Matcher isFlutterOutlineParams = new LazyMatcher(() =>
     new MatchesJsonObject("flutter.outline params",
-        {"file": isFilePath, "outline": isFlutterOutline},
-        optionalFields: {"instrumentedCode": isString}));
+        {"file": isFilePath, "outline": isFlutterOutline}));
 
 /**
  * flutter.setSubscriptions params
@@ -3082,6 +3177,30 @@
 final Matcher isFlutterSetSubscriptionsResult = isNull;
 
 /**
+ * flutter.setWidgetPropertyValue params
+ *
+ * {
+ *   "id": int
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ */
+final Matcher isFlutterSetWidgetPropertyValueParams = new LazyMatcher(() =>
+    new MatchesJsonObject(
+        "flutter.setWidgetPropertyValue params", {"id": isInt},
+        optionalFields: {"value": isFlutterWidgetPropertyValue}));
+
+/**
+ * flutter.setWidgetPropertyValue result
+ *
+ * {
+ *   "change": SourceChange
+ * }
+ */
+final Matcher isFlutterSetWidgetPropertyValueResult = new LazyMatcher(() =>
+    new MatchesJsonObject(
+        "flutter.setWidgetPropertyValue result", {"change": isSourceChange}));
+
+/**
  * inlineLocalVariable feedback
  *
  * {
diff --git a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
index d232188..55d5140 100644
--- a/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
+++ b/pkg/analysis_server/test/lsp/code_actions_refactor_test.dart
@@ -6,8 +6,7 @@
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
-import '../src/utilities/flutter_util.dart' as flutter;
-import '../src/utilities/meta_util.dart' as meta;
+import '../src/utilities/mock_packages.dart';
 import 'code_actions_abstract.dart';
 
 main() {
@@ -74,8 +73,8 @@
   void setUp() {
     super.setUp();
 
-    final flutterLibFolder = flutter.configureFlutterPackage(resourceProvider);
-    final metaLibFolder = meta.configureMetaPackage(resourceProvider);
+    final flutterLibFolder = MockPackages.instance.addFlutter(resourceProvider);
+    final metaLibFolder = MockPackages.instance.addMeta(resourceProvider);
     // Create .packages in the project.
     newFile(join(projectFolderPath, '.packages'), content: '''
 flutter:${flutterLibFolder.toUri()}
diff --git a/pkg/analysis_server/test/lsp/completion_test.dart b/pkg/analysis_server/test/lsp/completion_test.dart
index 040ff87..83d63ff 100644
--- a/pkg/analysis_server/test/lsp/completion_test.dart
+++ b/pkg/analysis_server/test/lsp/completion_test.dart
@@ -229,12 +229,29 @@
     final item = res.singleWhere((c) => c.label == 'abcdefghij');
     expect(item.insertTextFormat,
         anyOf(equals(InsertTextFormat.PlainText), isNull));
-    // ignore: deprecated_member_use_from_same_package
     expect(item.insertText, anyOf(equals('abcdefghij'), isNull));
     final updated = applyTextEdits(withoutMarkers(content), [item.textEdit]);
     expect(updated, contains('a.abcdefghij'));
   }
 
+  test_parensNotInFilterTextInsertText() async {
+    final content = '''
+    class MyClass {}
+
+    main() {
+      MyClass a = new MyCla^
+    }
+    ''';
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+    expect(res.any((c) => c.label == 'MyClass()'), isTrue);
+    final item = res.singleWhere((c) => c.label == 'MyClass()');
+    expect(item.filterText, equals('MyClass'));
+    expect(item.insertText, equals('MyClass'));
+  }
+
   test_suggestionSets() async {
     newFile(
       join(projectFolderPath, 'other_file.dart'),
@@ -348,6 +365,112 @@
     expectAutoImportCompletion(resolvedCompletions, '../source_file3.dart');
   }
 
+  test_suggestionSets_enumValues() async {
+    newFile(
+      join(projectFolderPath, 'source_file.dart'),
+      content: '''
+      enum MyExportedEnum { One, Two }
+      ''',
+    );
+
+    final content = '''
+main() {
+  var a = MyExported^
+}
+    ''';
+
+    final initialAnalysis = waitForAnalysisComplete();
+    await initialize(
+        workspaceCapabilities:
+            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await initialAnalysis;
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    final enumCompletions =
+        res.where((c) => c.label.startsWith('MyExportedEnum')).toList();
+    expect(
+        enumCompletions.map((c) => c.label),
+        unorderedEquals(
+            ['MyExportedEnum', 'MyExportedEnum.One', 'MyExportedEnum.Two']));
+
+    final completion =
+        enumCompletions.singleWhere((c) => c.label == 'MyExportedEnum.One');
+
+    // Resolve the completion item (via server) to get its edits. This is the
+    // LSP's equiv of getSuggestionDetails() and is invoked by LSP clients to
+    // populate additional info (in our case, the additional edits for inserting
+    // the import).
+    final resolved = await resolveCompletion(completion);
+    expect(resolved, isNotNull);
+
+    // Ensure the detail field was update to show this will auto-import.
+    expect(
+        resolved.detail, startsWith("Auto import from '../source_file.dart'"));
+
+    // Ensure the edit was added on.
+    expect(resolved.textEdit, isNotNull);
+
+    // Apply both the main completion edit and the additionalTextEdits atomically.
+    final newContent = applyTextEdits(
+      withoutMarkers(content),
+      [resolved.textEdit].followedBy(resolved.additionalTextEdits).toList(),
+    );
+
+    // Ensure both edits were made - the completion, and the inserted import.
+    expect(newContent, equals('''
+import '../source_file.dart';
+
+main() {
+  var a = MyExportedEnum.One
+}
+    '''));
+  }
+
+  test_suggestionSets_enumValuesAlreadyImported() async {
+    newFile(
+      join(projectFolderPath, 'source_file.dart'),
+      content: '''
+      enum MyExportedEnum { One, Two }
+      ''',
+    );
+    newFile(
+      join(projectFolderPath, 'reexport1.dart'),
+      content: '''
+      export 'source_file.dart';
+      ''',
+    );
+    newFile(
+      join(projectFolderPath, 'reexport2.dart'),
+      content: '''
+      export 'source_file.dart';
+      ''',
+    );
+
+    final content = '''
+import '../reexport1.dart';
+
+main() {
+  var a = MyExported^
+}
+    ''';
+
+    final initialAnalysis = waitForAnalysisComplete();
+    await initialize(
+        workspaceCapabilities:
+            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await initialAnalysis;
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    final completions =
+        res.where((c) => c.label == 'MyExportedEnum.One').toList();
+    expect(completions, hasLength(1));
+    final resolved = await resolveCompletion(completions.first);
+    // It should not include auto-import text since it's already imported.
+    expect(resolved.detail, isNull);
+  }
+
   test_suggestionSets_filtersOutAlreadyImportedSymbols() async {
     newFile(
       join(projectFolderPath, 'source_file.dart'),
@@ -391,6 +514,63 @@
     expect(resolved.detail, isNull);
   }
 
+  test_suggestionSets_namedConstructors() async {
+    newFile(
+      join(projectFolderPath, 'other_file.dart'),
+      content: '''
+      /// This class is in another file.
+      class InOtherFile {
+        InOtherFile.fromJson() {}
+      }
+      ''',
+    );
+
+    final content = '''
+main() {
+  var a = InOtherF^
+}
+    ''';
+
+    final initialAnalysis = waitForAnalysisComplete();
+    await initialize(
+        workspaceCapabilities:
+            withApplyEditSupport(emptyWorkspaceClientCapabilities));
+    await openFile(mainFileUri, withoutMarkers(content));
+    await initialAnalysis;
+    final res = await getCompletion(mainFileUri, positionFromMarker(content));
+
+    // Find the completion for the class in the other file.
+    final completion =
+        res.singleWhere((c) => c.label == 'InOtherFile.fromJson()');
+    expect(completion, isNotNull);
+
+    // Expect no docs or text edit, since these are added during resolve.
+    expect(completion.documentation, isNull);
+    expect(completion.textEdit, isNull);
+
+    // Resolve the completion item (via server) to get its edits. This is the
+    // LSP's equiv of getSuggestionDetails() and is invoked by LSP clients to
+    // populate additional info (in our case, the additional edits for inserting
+    // the import).
+    final resolved = await resolveCompletion(completion);
+    expect(resolved, isNotNull);
+
+    // Apply both the main completion edit and the additionalTextEdits atomically.
+    final newContent = applyTextEdits(
+      withoutMarkers(content),
+      [resolved.textEdit].followedBy(resolved.additionalTextEdits).toList(),
+    );
+
+    // Ensure both edits were made - the completion, and the inserted import.
+    expect(newContent, equals('''
+import '../other_file.dart';
+
+main() {
+  var a = InOtherFile.fromJson
+}
+    '''));
+  }
+
   test_suggestionSets_includesReexportedSymbolsForEachFile() async {
     newFile(
       join(projectFolderPath, 'source_file.dart'),
@@ -605,7 +785,6 @@
     final item = res.singleWhere((c) => c.label == 'abcdefghij');
     expect(item.insertTextFormat,
         anyOf(equals(InsertTextFormat.PlainText), isNull));
-    // ignore: deprecated_member_use_from_same_package
     expect(item.insertText, anyOf(equals('abcdefghij'), isNull));
     final updated = applyTextEdits(withoutMarkers(content), [item.textEdit]);
     expect(updated, contains('a.abcdefghij'));
diff --git a/pkg/analysis_server/test/lsp/diagnostic_test.dart b/pkg/analysis_server/test/lsp/diagnostic_test.dart
index 88a6e62..c30d692 100644
--- a/pkg/analysis_server/test/lsp/diagnostic_test.dart
+++ b/pkg/analysis_server/test/lsp/diagnostic_test.dart
@@ -33,6 +33,38 @@
     expect(updatedDiagnostics, hasLength(1));
   }
 
+  test_contextMessage() async {
+    newFile(mainFilePath, content: '''
+void f() {
+  x = 0;
+  int x;
+  print(x);
+}
+''');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.relatedInformation, hasLength(1));
+  }
+
+  test_correction() async {
+    newFile(mainFilePath, content: '''
+void f() {
+  x = 0;
+}
+''');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.message, contains('\nTry'));
+  }
+
   test_deletedFile() async {
     newFile(mainFilePath, content: 'String a = 1;');
 
@@ -48,21 +80,6 @@
     expect(updatedDiagnostics, hasLength(0));
   }
 
-  test_initialAnalysis() async {
-    newFile(mainFilePath, content: 'String a = 1;');
-
-    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
-    await initialize();
-    final diagnostics = await diagnosticsUpdate;
-    expect(diagnostics, hasLength(1));
-    final diagnostic = diagnostics.first;
-    expect(diagnostic.code, equals('invalid_assignment'));
-    expect(diagnostic.range.start.line, equals(0));
-    expect(diagnostic.range.start.character, equals(11));
-    expect(diagnostic.range.end.line, equals(0));
-    expect(diagnostic.range.end.character, equals(12));
-  }
-
   test_dotFilesExcluded() async {
     var dotFolderFilePath =
         join(projectFolderPath, '.dart_tool', 'tool_file.dart');
@@ -82,6 +99,21 @@
     expect(diagnostics, isNull);
   }
 
+  test_initialAnalysis() async {
+    newFile(mainFilePath, content: 'String a = 1;');
+
+    final diagnosticsUpdate = waitForDiagnostics(mainFileUri);
+    await initialize();
+    final diagnostics = await diagnosticsUpdate;
+    expect(diagnostics, hasLength(1));
+    final diagnostic = diagnostics.first;
+    expect(diagnostic.code, equals('invalid_assignment'));
+    expect(diagnostic.range.start.line, equals(0));
+    expect(diagnostic.range.start.character, equals(11));
+    expect(diagnostic.range.end.line, equals(0));
+    expect(diagnostic.range.end.character, equals(12));
+  }
+
   test_todos() async {
     // TODOs only show up if there's also some code in the file.
     const initialContents = '''
diff --git a/pkg/analysis_server/test/mock_packages/.packages b/pkg/analysis_server/test/mock_packages/.packages
new file mode 100644
index 0000000..08d79f7
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/.packages
@@ -0,0 +1,3 @@
+flutter:flutter/lib
+meta:meta/lib
+ui:ui/lib
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/foundation.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/foundation.dart
new file mode 100644
index 0000000..5cf9392
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/foundation.dart
@@ -0,0 +1,14 @@
+// Copyright 2015 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 'package:meta/meta.dart'
+    show
+        immutable,
+        mustCallSuper,
+        optionalTypeArgs,
+        protected,
+        required,
+        visibleForTesting;
+
+export 'src/foundation/key.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
new file mode 100644
index 0000000..bf5fbc5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/material.dart
@@ -0,0 +1,8 @@
+// Copyright 2015 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 'widgets.dart';
+export 'src/material/app_bar.dart';
+export 'src/material/icons.dart';
+export 'src/material/scaffold.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
new file mode 100644
index 0000000..a3323f6
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/painting.dart
@@ -0,0 +1,11 @@
+// Copyright 2015 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/painting/alignment.dart';
+export 'src/painting/basic_types.dart';
+export 'src/painting/box_decoration.dart';
+export 'src/painting/decoration.dart';
+export 'src/painting/edge_insets.dart';
+export 'src/painting/text_painter.dart';
+export 'src/painting/text_style.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/rendering.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/rendering.dart
new file mode 100644
index 0000000..8071543
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/rendering.dart
@@ -0,0 +1,7 @@
+// Copyright 2015 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 'painting.dart';
+export 'src/rendering/flex.dart';
+export 'src/rendering/paragraph.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/foundation/key.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/foundation/key.dart
new file mode 100644
index 0000000..2de76be
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/foundation/key.dart
@@ -0,0 +1,19 @@
+// Copyright 2015 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.
+
+abstract class Key {
+  const factory Key(String value) = ValueKey<String>;
+
+  const Key._();
+}
+
+abstract class LocalKey extends Key {
+  const LocalKey() : super._();
+}
+
+class ValueKey<T> extends LocalKey {
+  final T value;
+
+  const ValueKey(this.value);
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart
new file mode 100644
index 0000000..2b447a3
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/app_bar.dart
@@ -0,0 +1,13 @@
+// Copyright 2015 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/widgets.dart';
+
+class AppBar extends StatefulWidget {
+  AppBar({
+    Key key,
+    title,
+    backgroundColor,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/icons.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/icons.dart
new file mode 100644
index 0000000..d3f89b2
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/icons.dart
@@ -0,0 +1,15 @@
+// Copyright 2015 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/widgets.dart';
+
+class Icons {
+  static const IconData alarm =
+      const IconData(0xe855, fontFamily: 'MaterialIcons');
+
+  static const IconData book =
+      const IconData(0xe865, fontFamily: 'MaterialIcons');
+
+  Icons._();
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart
new file mode 100644
index 0000000..181ae90
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/material/scaffold.dart
@@ -0,0 +1,12 @@
+// Copyright 2015 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/widgets.dart';
+
+class Scaffold extends StatefulWidget {
+  const Scaffold({
+    Key key,
+    Widget body,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/alignment.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/alignment.dart
new file mode 100644
index 0000000..43da0ff
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/alignment.dart
@@ -0,0 +1,241 @@
+// Copyright 2017 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 'basic_types.dart';
+
+/// Base class for [Alignment] that allows for text-direction aware
+/// resolution.
+///
+/// A property or argument of this type accepts classes created either with [new
+/// Alignment] and its variants, or [new AlignmentDirectional].
+///
+/// To convert an [AlignmentGeometry] object of indeterminate type into an
+/// [Alignment] object, call the [resolve] method.
+@immutable
+abstract class AlignmentGeometry {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const AlignmentGeometry();
+}
+
+/// A point within a rectangle.
+///
+/// `Alignment(0.0, 0.0)` represents the center of the rectangle. The distance
+/// from -1.0 to +1.0 is the distance from one side of the rectangle to the
+/// other side of the rectangle. Therefore, 2.0 units horizontally (or
+/// vertically) is equivalent to the width (or height) of the rectangle.
+///
+/// `Alignment(-1.0, -1.0)` represents the top left of the rectangle.
+///
+/// `Alignment(1.0, 1.0)` represents the bottom right of the rectangle.
+///
+/// `Alignment(0.0, 3.0)` represents a point that is horizontally centered with
+/// respect to the rectangle and vertically below the bottom of the rectangle by
+/// the height of the rectangle.
+///
+/// `Alignment(0.0, -0.5)` represents a point that is horizontally centered with
+/// respect to the rectangle and vertically half way between the top edge and
+/// the center.
+///
+/// `Alignment(x, y)` in a rectangle with height h and width w describes
+/// the point (x * w/2 + w/2, y * h/2 + h/2) in the coordinate system of the
+/// rectangle.
+///
+/// [Alignment] uses visual coordinates, which means increasing [x] moves the
+/// point from left to right. To support layouts with a right-to-left
+/// [TextDirection], consider using [AlignmentDirectional], in which the
+/// direction the point moves when increasing the horizontal value depends on
+/// the [TextDirection].
+///
+/// A variety of widgets use [Alignment] in their configuration, most
+/// notably:
+///
+///  * [Align] positions a child according to an [Alignment].
+///
+/// See also:
+///
+///  * [AlignmentDirectional], which has a horizontal coordinate orientation
+///    that depends on the [TextDirection].
+///  * [AlignmentGeometry], which is an abstract type that is agnostic as to
+///    whether the horizontal direction depends on the [TextDirection].
+class Alignment extends AlignmentGeometry {
+  /// Creates an alignment.
+  ///
+  /// The [x] and [y] arguments must not be null.
+  const Alignment(this.x, this.y)
+      : assert(x != null),
+        assert(y != null);
+
+  /// The distance fraction in the horizontal direction.
+  ///
+  /// A value of -1.0 corresponds to the leftmost edge. A value of 1.0
+  /// corresponds to the rightmost edge. Values are not limited to that range;
+  /// values less than -1.0 represent positions to the left of the left edge,
+  /// and values greater than 1.0 represent positions to the right of the right
+  /// edge.
+  final double x;
+
+  /// The distance fraction in the vertical direction.
+  ///
+  /// A value of -1.0 corresponds to the topmost edge. A value of 1.0
+  /// corresponds to the bottommost edge. Values are not limited to that range;
+  /// values less than -1.0 represent positions above the top, and values
+  /// greater than 1.0 represent positions below the bottom.
+  final double y;
+
+  /// The top left corner.
+  static const Alignment topLeft = Alignment(-1.0, -1.0);
+
+  /// The center point along the top edge.
+  static const Alignment topCenter = Alignment(0.0, -1.0);
+
+  /// The top right corner.
+  static const Alignment topRight = Alignment(1.0, -1.0);
+
+  /// The center point along the left edge.
+  static const Alignment centerLeft = Alignment(-1.0, 0.0);
+
+  /// The center point, both horizontally and vertically.
+  static const Alignment center = Alignment(0.0, 0.0);
+
+  /// The center point along the right edge.
+  static const Alignment centerRight = Alignment(1.0, 0.0);
+
+  /// The bottom left corner.
+  static const Alignment bottomLeft = Alignment(-1.0, 1.0);
+
+  /// The center point along the bottom edge.
+  static const Alignment bottomCenter = Alignment(0.0, 1.0);
+
+  /// The bottom right corner.
+  static const Alignment bottomRight = Alignment(1.0, 1.0);
+}
+
+/// An offset that's expressed as a fraction of a [Size], but whose horizontal
+/// component is dependent on the writing direction.
+///
+/// This can be used to indicate an offset from the left in [TextDirection.ltr]
+/// text and an offset from the right in [TextDirection.rtl] text without having
+/// to be aware of the current text direction.
+///
+/// See also:
+///
+///  * [Alignment], a variant that is defined in physical terms (i.e.
+///    whose horizontal component does not depend on the text direction).
+class AlignmentDirectional extends AlignmentGeometry {
+  /// Creates a directional alignment.
+  ///
+  /// The [start] and [y] arguments must not be null.
+  const AlignmentDirectional(this.start, this.y)
+      : assert(start != null),
+        assert(y != null);
+
+  /// The distance fraction in the horizontal direction.
+  ///
+  /// A value of -1.0 corresponds to the edge on the "start" side, which is the
+  /// left side in [TextDirection.ltr] contexts and the right side in
+  /// [TextDirection.rtl] contexts. A value of 1.0 corresponds to the opposite
+  /// edge, the "end" side. Values are not limited to that range; values less
+  /// than -1.0 represent positions beyond the start edge, and values greater than
+  /// 1.0 represent positions beyond the end edge.
+  ///
+  /// This value is normalized into an [Alignment.x] value by the [resolve]
+  /// method.
+  final double start;
+
+  /// The distance fraction in the vertical direction.
+  ///
+  /// A value of -1.0 corresponds to the topmost edge. A value of 1.0
+  /// corresponds to the bottommost edge. Values are not limited to that range;
+  /// values less than -1.0 represent positions above the top, and values
+  /// greater than 1.0 represent positions below the bottom.
+  ///
+  /// This value is passed through to [Alignment.y] unmodified by the
+  /// [resolve] method.
+  final double y;
+
+  /// The top corner on the "start" side.
+  static const AlignmentDirectional topStart = AlignmentDirectional(-1.0, -1.0);
+
+  /// The center point along the top edge.
+  ///
+  /// Consider using [Alignment.topCenter] instead, as it does not need
+  /// to be [resolve]d to be used.
+  static const AlignmentDirectional topCenter = AlignmentDirectional(0.0, -1.0);
+
+  /// The top corner on the "end" side.
+  static const AlignmentDirectional topEnd = AlignmentDirectional(1.0, -1.0);
+
+  /// The center point along the "start" edge.
+  static const AlignmentDirectional centerStart =
+      AlignmentDirectional(-1.0, 0.0);
+
+  /// The center point, both horizontally and vertically.
+  ///
+  /// Consider using [Alignment.center] instead, as it does not need to
+  /// be [resolve]d to be used.
+  static const AlignmentDirectional center = AlignmentDirectional(0.0, 0.0);
+
+  /// The center point along the "end" edge.
+  static const AlignmentDirectional centerEnd = AlignmentDirectional(1.0, 0.0);
+
+  /// The bottom corner on the "start" side.
+  static const AlignmentDirectional bottomStart =
+      AlignmentDirectional(-1.0, 1.0);
+
+  /// The center point along the bottom edge.
+  ///
+  /// Consider using [Alignment.bottomCenter] instead, as it does not
+  /// need to be [resolve]d to be used.
+  static const AlignmentDirectional bottomCenter =
+      AlignmentDirectional(0.0, 1.0);
+
+  /// The bottom corner on the "end" side.
+  static const AlignmentDirectional bottomEnd = AlignmentDirectional(1.0, 1.0);
+}
+
+/// The vertical alignment of text within an input box.
+///
+/// A single [y] value that can range from -1.0 to 1.0. -1.0 aligns to the top
+/// of an input box so that the top of the first line of text fits within the
+/// box and its padding. 0.0 aligns to the center of the box. 1.0 aligns so that
+/// the bottom of the last line of text aligns with the bottom interior edge of
+/// the input box.
+///
+/// See also:
+///
+///  * [TextField.textAlignVertical], which is passed on to the [InputDecorator].
+///  * [CupertinoTextField.textAlignVertical], which behaves in the same way as
+///    the parameter in TextField.
+///  * [InputDecorator.textAlignVertical], which defines the alignment of
+///    prefix, input, and suffix within an [InputDecorator].
+class TextAlignVertical {
+  /// Creates a TextAlignVertical from any y value between -1.0 and 1.0.
+  const TextAlignVertical({
+    @required this.y,
+  })  : assert(y != null),
+        assert(y >= -1.0 && y <= 1.0);
+
+  /// A value ranging from -1.0 to 1.0 that defines the topmost and bottommost
+  /// locations of the top and bottom of the input box.
+  final double y;
+
+  /// Aligns a TextField's input Text with the topmost location within a
+  /// TextField's input box.
+  static const TextAlignVertical top = TextAlignVertical(y: -1.0);
+
+  /// Aligns a TextField's input Text to the center of the TextField.
+  static const TextAlignVertical center = TextAlignVertical(y: 0.0);
+
+  /// Aligns a TextField's input Text with the bottommost location within a
+  /// TextField.
+  static const TextAlignVertical bottom = TextAlignVertical(y: 1.0);
+
+  @override
+  String toString() {
+    return '$runtimeType(y: $y)';
+  }
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/basic_types.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/basic_types.dart
new file mode 100644
index 0000000..2164092
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/basic_types.dart
@@ -0,0 +1,94 @@
+// Copyright 2015 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:ui/ui.dart' show TextDirection;
+
+export 'package:ui/ui.dart'
+    show
+        BlendMode,
+        Color,
+        FontStyle,
+        FontWeight,
+        Radius,
+        TextAlign,
+        TextBaseline,
+        TextDirection;
+
+/// The two cardinal directions in two dimensions.
+///
+/// The axis is always relative to the current coordinate space. This means, for
+/// example, that a [horizontal] axis might actually be diagonally from top
+/// right to bottom left, due to some local [Transform] applied to the scene.
+///
+/// See also:
+///
+///  * [AxisDirection], which is a directional version of this enum (with values
+///    light left and right, rather than just horizontal).
+///  * [TextDirection], which disambiguates between left-to-right horizontal
+///    content and right-to-left horizontal content.
+enum Axis {
+  /// Left and right.
+  ///
+  /// See also:
+  ///
+  ///  * [TextDirection], which disambiguates between left-to-right horizontal
+  ///    content and right-to-left horizontal content.
+  horizontal,
+
+  /// Up and down.
+  vertical,
+}
+
+/// A direction along either the horizontal or vertical [Axis].
+enum AxisDirection {
+  /// Zero is at the bottom and positive values are above it: ⇈
+  ///
+  /// Alphabetical content with a [GrowthDirection.forward] would have the A at
+  /// the bottom and the Z at the top. This is an unusual configuration.
+  up,
+
+  /// Zero is on the left and positive values are to the right of it: ⇉
+  ///
+  /// Alphabetical content with a [GrowthDirection.forward] would have the A on
+  /// the left and the Z on the right. This is the ordinary reading order for a
+  /// horizontal set of tabs in an English application, for example.
+  right,
+
+  /// Zero is at the top and positive values are below it: ⇊
+  ///
+  /// Alphabetical content with a [GrowthDirection.forward] would have the A at
+  /// the top and the Z at the bottom. This is the ordinary reading order for a
+  /// vertical list.
+  down,
+
+  /// Zero is to the right and positive values are to the left of it: ⇇
+  ///
+  /// Alphabetical content with a [GrowthDirection.forward] would have the A at
+  /// the right and the Z at the left. This is the ordinary reading order for a
+  /// horizontal set of tabs in a Hebrew application, for example.
+  left,
+}
+
+/// A direction in which boxes flow vertically.
+///
+/// This is used by the flex algorithm (e.g. [Column]) to decide in which
+/// direction to draw boxes.
+///
+/// This is also used to disambiguate `start` and `end` values (e.g.
+/// [MainAxisAlignment.start] or [CrossAxisAlignment.end]).
+///
+/// See also:
+///
+///  * [TextDirection], which controls the same thing but horizontally.
+enum VerticalDirection {
+  /// Boxes should start at the bottom and be stacked vertically towards the top.
+  ///
+  /// The "start" is at the bottom, the "end" is at the top.
+  up,
+
+  /// Boxes should start at the top and be stacked vertically towards the bottom.
+  ///
+  /// The "start" is at the top, the "end" is at the bottom.
+  down,
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/border_radius.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/border_radius.dart
new file mode 100644
index 0000000..f2d0952
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/border_radius.dart
@@ -0,0 +1,177 @@
+// Copyright 2015 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 'basic_types.dart';
+
+/// Base class for [BorderRadius] that allows for text-direction aware resolution.
+///
+/// A property or argument of this type accepts classes created either with [new
+/// BorderRadius.only] and its variants, or [new BorderRadiusDirectional.only]
+/// and its variants.
+///
+/// To convert a [BorderRadiusGeometry] object of indeterminate type into a
+/// [BorderRadius] object, call the [resolve] method.
+@immutable
+abstract class BorderRadiusGeometry {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const BorderRadiusGeometry();
+}
+
+/// An immutable set of radii for each corner of a rectangle.
+///
+/// Used by [BoxDecoration] when the shape is a [BoxShape.rectangle].
+///
+/// The [BorderRadius] class specifies offsets in terms of visual corners, e.g.
+/// [topLeft]. These values are not affected by the [TextDirection]. To support
+/// both left-to-right and right-to-left layouts, consider using
+/// [BorderRadiusDirectional], which is expressed in terms that are relative to
+/// a [TextDirection] (typically obtained from the ambient [Directionality]).
+class BorderRadius extends BorderRadiusGeometry {
+  /// Creates a border radius where all radii are [radius].
+  const BorderRadius.all(Radius radius)
+      : this.only(
+          topLeft: radius,
+          topRight: radius,
+          bottomLeft: radius,
+          bottomRight: radius,
+        );
+
+  /// Creates a border radius where all radii are [Radius.circular(radius)].
+  BorderRadius.circular(double radius)
+      : this.all(
+          Radius.circular(radius),
+        );
+
+  /// Creates a vertically symmetric border radius where the top and bottom
+  /// sides of the rectangle have the same radii.
+  const BorderRadius.vertical({
+    Radius top = Radius.zero,
+    Radius bottom = Radius.zero,
+  }) : this.only(
+          topLeft: top,
+          topRight: top,
+          bottomLeft: bottom,
+          bottomRight: bottom,
+        );
+
+  /// Creates a horizontally symmetrical border radius where the left and right
+  /// sides of the rectangle have the same radii.
+  const BorderRadius.horizontal({
+    Radius left = Radius.zero,
+    Radius right = Radius.zero,
+  }) : this.only(
+          topLeft: left,
+          topRight: right,
+          bottomLeft: left,
+          bottomRight: right,
+        );
+
+  /// Creates a border radius with only the given non-zero values. The other
+  /// corners will be right angles.
+  const BorderRadius.only({
+    this.topLeft = Radius.zero,
+    this.topRight = Radius.zero,
+    this.bottomLeft = Radius.zero,
+    this.bottomRight = Radius.zero,
+  });
+
+  /// A border radius with all zero radii.
+  static const BorderRadius zero = BorderRadius.all(Radius.zero);
+
+  /// The top-left [Radius].
+  final Radius topLeft;
+
+  /// The top-right [Radius].
+  final Radius topRight;
+
+  /// The bottom-left [Radius].
+  final Radius bottomLeft;
+
+  /// The bottom-right [Radius].
+  final Radius bottomRight;
+}
+
+/// An immutable set of radii for each corner of a rectangle, but with the
+/// corners specified in a manner dependent on the writing direction.
+///
+/// This can be used to specify a corner radius on the leading or trailing edge
+/// of a box, so that it flips to the other side when the text alignment flips
+/// (e.g. being on the top right in English text but the top left in Arabic
+/// text).
+///
+/// See also:
+///
+///  * [BorderRadius], a variant that uses physical labels (`topLeft` and
+///    `topRight` instead of `topStart` and `topEnd`).
+class BorderRadiusDirectional extends BorderRadiusGeometry {
+  /// Creates a border radius where all radii are [radius].
+  const BorderRadiusDirectional.all(Radius radius)
+      : this.only(
+          topStart: radius,
+          topEnd: radius,
+          bottomStart: radius,
+          bottomEnd: radius,
+        );
+
+  /// Creates a border radius where all radii are [Radius.circular(radius)].
+  BorderRadiusDirectional.circular(double radius)
+      : this.all(
+          Radius.circular(radius),
+        );
+
+  /// Creates a vertically symmetric border radius where the top and bottom
+  /// sides of the rectangle have the same radii.
+  const BorderRadiusDirectional.vertical({
+    Radius top = Radius.zero,
+    Radius bottom = Radius.zero,
+  }) : this.only(
+          topStart: top,
+          topEnd: top,
+          bottomStart: bottom,
+          bottomEnd: bottom,
+        );
+
+  /// Creates a horizontally symmetrical border radius where the start and end
+  /// sides of the rectangle have the same radii.
+  const BorderRadiusDirectional.horizontal({
+    Radius start = Radius.zero,
+    Radius end = Radius.zero,
+  }) : this.only(
+          topStart: start,
+          topEnd: end,
+          bottomStart: start,
+          bottomEnd: end,
+        );
+
+  /// Creates a border radius with only the given non-zero values. The other
+  /// corners will be right angles.
+  const BorderRadiusDirectional.only({
+    this.topStart = Radius.zero,
+    this.topEnd = Radius.zero,
+    this.bottomStart = Radius.zero,
+    this.bottomEnd = Radius.zero,
+  });
+
+  /// A border radius with all zero radii.
+  ///
+  /// Consider using [EdgeInsets.zero] instead, since that object has the same
+  /// effect, but will be cheaper to [resolve].
+  static const BorderRadiusDirectional zero =
+      BorderRadiusDirectional.all(Radius.zero);
+
+  /// The top-start [Radius].
+  final Radius topStart;
+
+  /// The top-end [Radius].
+  final Radius topEnd;
+
+  /// The bottom-start [Radius].
+  final Radius bottomStart;
+
+  /// The bottom-end [Radius].
+  final Radius bottomEnd;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/borders.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/borders.dart
new file mode 100644
index 0000000..8c9e028
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/borders.dart
@@ -0,0 +1,128 @@
+// Copyright 2015 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 'basic_types.dart';
+
+/// The style of line to draw for a [BorderSide] in a [Border].
+enum BorderStyle {
+  /// Skip the border.
+  none,
+
+  /// Draw the border as a solid line.
+  solid,
+
+  // if you add more, think about how they will lerp
+}
+
+/// A side of a border of a box.
+///
+/// A [Border] consists of four [BorderSide] objects: [Border.top],
+/// [Border.left], [Border.right], and [Border.bottom].
+///
+/// Note that setting [BorderSide.width] to 0.0 will result in hairline
+/// rendering. A more involved explanation is present in [BorderSide.width].
+///
+/// {@tool sample}
+///
+/// This sample shows how [BorderSide] objects can be used in a [Container], via
+/// a [BoxDecoration] and a [Border], to decorate some [Text]. In this example,
+/// the text has a thick bar above it that is light blue, and a thick bar below
+/// it that is a darker shade of blue.
+///
+/// ```dart
+/// Container(
+///   padding: EdgeInsets.all(8.0),
+///   decoration: BoxDecoration(
+///     border: Border(
+///       top: BorderSide(width: 16.0, color: Colors.lightBlue.shade50),
+///       bottom: BorderSide(width: 16.0, color: Colors.lightBlue.shade900),
+///     ),
+///   ),
+///   child: Text('Flutter in the sky', textAlign: TextAlign.center),
+/// )
+/// ```
+/// {@end-tool}
+///
+/// See also:
+///
+///  * [Border], which uses [BorderSide] objects to represent its sides.
+///  * [BoxDecoration], which optionally takes a [Border] object.
+///  * [TableBorder], which is similar to [Border] but has two more sides
+///    ([TableBorder.horizontalInside] and [TableBorder.verticalInside]), both
+///    of which are also [BorderSide] objects.
+@immutable
+class BorderSide {
+  /// Creates the side of a border.
+  ///
+  /// By default, the border is 1.0 logical pixels wide and solid black.
+  const BorderSide({
+    this.color = const Color(0xFF000000),
+    this.width = 1.0,
+    this.style = BorderStyle.solid,
+  })  : assert(color != null),
+        assert(width != null),
+        assert(width >= 0.0),
+        assert(style != null);
+
+  /// The color of this side of the border.
+  final Color color;
+
+  /// The width of this side of the border, in logical pixels.
+  ///
+  /// Setting width to 0.0 will result in a hairline border. This means that
+  /// the border will have the width of one physical pixel. Also, hairline
+  /// rendering takes shortcuts when the path overlaps a pixel more than once.
+  /// This means that it will render faster than otherwise, but it might
+  /// double-hit pixels, giving it a slightly darker/lighter result.
+  ///
+  /// To omit the border entirely, set the [style] to [BorderStyle.none].
+  final double width;
+
+  /// The style of this side of the border.
+  ///
+  /// To omit a side, set [style] to [BorderStyle.none]. This skips
+  /// painting the border, but the border still has a [width].
+  final BorderStyle style;
+
+  /// A hairline black border that is not rendered.
+  static const BorderSide none =
+      BorderSide(width: 0.0, style: BorderStyle.none);
+
+  /// Creates a copy of this border but with the given fields replaced with the new values.
+  BorderSide copyWith({
+    Color color,
+    double width,
+    BorderStyle style,
+  }) {
+    assert(width == null || width >= 0.0);
+    return BorderSide(
+      color: color ?? this.color,
+      width: width ?? this.width,
+      style: style ?? this.style,
+    );
+  }
+}
+
+/// Base class for shape outlines.
+///
+/// This class handles how to add multiple borders together. Subclasses define
+/// various shapes, like circles ([CircleBorder]), rounded rectangles
+/// ([RoundedRectangleBorder]), continuous rectangles
+/// ([ContinuousRectangleBorder]), or beveled rectangles
+/// ([BeveledRectangleBorder]).
+///
+/// See also:
+///
+///  * [ShapeDecoration], which can be used with [DecoratedBox] to show a shape.
+///  * [Material] (and many other widgets in the Material library), which takes
+///    a [ShapeBorder] to define its shape.
+///  * [NotchedShape], which describes a shape with a hole in it.
+@immutable
+abstract class ShapeBorder {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const ShapeBorder();
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_border.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_border.dart
new file mode 100644
index 0000000..b2bc66c
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_border.dart
@@ -0,0 +1,246 @@
+// Copyright 2015 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 'basic_types.dart';
+import 'border_radius.dart';
+import 'borders.dart';
+
+/// The shape to use when rendering a [Border] or [BoxDecoration].
+///
+/// Consider using [ShapeBorder] subclasses directly (with [ShapeDecoration]),
+/// instead of using [BoxShape] and [Border], if the shapes will need to be
+/// interpolated or animated. The [Border] class cannot interpolate between
+/// different shapes.
+enum BoxShape {
+  /// An axis-aligned, 2D rectangle. May have rounded corners (described by a
+  /// [BorderRadius]). The edges of the rectangle will match the edges of the box
+  /// into which the [Border] or [BoxDecoration] is painted.
+  ///
+  /// See also:
+  ///
+  ///  * [RoundedRectangleBorder], the equivalent [ShapeBorder].
+  rectangle,
+
+  /// A circle centered in the middle of the box into which the [Border] or
+  /// [BoxDecoration] is painted. The diameter of the circle is the shortest
+  /// dimension of the box, either the width or the height, such that the circle
+  /// touches the edges of the box.
+  ///
+  /// See also:
+  ///
+  ///  * [CircleBorder], the equivalent [ShapeBorder].
+  circle,
+
+  // Don't add more, instead create a new ShapeBorder.
+}
+
+/// Base class for box borders that can paint as rectangles, circles, or rounded
+/// rectangles.
+///
+/// This class is extended by [Border] and [BorderDirectional] to provide
+/// concrete versions of four-sided borders using different conventions for
+/// specifying the sides.
+///
+/// The only API difference that this class introduces over [ShapeBorder] is
+/// that its [paint] method takes additional arguments.
+///
+/// See also:
+///
+///  * [BorderSide], which is used to describe each side of the box.
+///  * [RoundedRectangleBorder], another way of describing a box's border.
+///  * [CircleBorder], another way of describing a circle border.
+///  * [BoxDecoration], which uses a [BoxBorder] to describe its borders.
+abstract class BoxBorder extends ShapeBorder {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const BoxBorder();
+
+  /// The top side of this border.
+  ///
+  /// This getter is available on both [Border] and [BorderDirectional]. If
+  /// [isUniform] is true, then this is the same style as all the other sides.
+  BorderSide get top;
+
+  /// The bottom side of this border.
+  BorderSide get bottom;
+}
+
+/// A border of a box, comprised of four sides: top, right, bottom, left.
+///
+/// The sides are represented by [BorderSide] objects.
+///
+/// {@tool sample}
+///
+/// All four borders the same, two-pixel wide solid white:
+///
+/// ```dart
+/// Border.all(width: 2.0, color: const Color(0xFFFFFFFF))
+/// ```
+/// {@end-tool}
+/// {@tool sample}
+///
+/// The border for a material design divider:
+///
+/// ```dart
+/// Border(bottom: BorderSide(color: Theme.of(context).dividerColor))
+/// ```
+/// {@end-tool}
+/// {@tool sample}
+///
+/// A 1990s-era "OK" button:
+///
+/// ```dart
+/// Container(
+///   decoration: const BoxDecoration(
+///     border: Border(
+///       top: BorderSide(width: 1.0, color: Color(0xFFFFFFFFFF)),
+///       left: BorderSide(width: 1.0, color: Color(0xFFFFFFFFFF)),
+///       right: BorderSide(width: 1.0, color: Color(0xFFFF000000)),
+///       bottom: BorderSide(width: 1.0, color: Color(0xFFFF000000)),
+///     ),
+///   ),
+///   child: Container(
+///     padding: const EdgeInsets.symmetric(horizontal: 20.0, vertical: 2.0),
+///     decoration: const BoxDecoration(
+///       border: Border(
+///         top: BorderSide(width: 1.0, color: Color(0xFFFFDFDFDF)),
+///         left: BorderSide(width: 1.0, color: Color(0xFFFFDFDFDF)),
+///         right: BorderSide(width: 1.0, color: Color(0xFFFF7F7F7F)),
+///         bottom: BorderSide(width: 1.0, color: Color(0xFFFF7F7F7F)),
+///       ),
+///       color: Color(0xFFBFBFBF),
+///     ),
+///     child: const Text(
+///       'OK',
+///       textAlign: TextAlign.center,
+///       style: TextStyle(color: Color(0xFF000000))
+///     ),
+///   ),
+/// )
+/// ```
+/// {@end-tool}
+///
+/// See also:
+///
+///  * [BoxDecoration], which uses this class to describe its edge decoration.
+///  * [BorderSide], which is used to describe each side of the box.
+///  * [Theme], from the material layer, which can be queried to obtain appropriate colors
+///    to use for borders in a material app, as shown in the "divider" sample above.
+class Border extends BoxBorder {
+  /// Creates a border.
+  ///
+  /// All the sides of the border default to [BorderSide.none].
+  ///
+  /// The arguments must not be null.
+  const Border({
+    this.top = BorderSide.none,
+    this.right = BorderSide.none,
+    this.bottom = BorderSide.none,
+    this.left = BorderSide.none,
+  })  : assert(top != null),
+        assert(right != null),
+        assert(bottom != null),
+        assert(left != null);
+
+  /// Creates a border whose sides are all the same.
+  ///
+  /// The `side` argument must not be null.
+  const Border.fromBorderSide(BorderSide side)
+      : assert(side != null),
+        top = side,
+        right = side,
+        bottom = side,
+        left = side;
+
+  /// A uniform border with all sides the same color and width.
+  ///
+  /// The sides default to black solid borders, one logical pixel wide.
+  factory Border.all({
+    Color color = const Color(0xFF000000),
+    double width = 1.0,
+    BorderStyle style = BorderStyle.solid,
+  }) {
+    final BorderSide side =
+        BorderSide(color: color, width: width, style: style);
+    return Border.fromBorderSide(side);
+  }
+
+  @override
+  final BorderSide top;
+
+  /// The right side of this border.
+  final BorderSide right;
+
+  @override
+  final BorderSide bottom;
+
+  /// The left side of this border.
+  final BorderSide left;
+}
+
+/// A border of a box, comprised of four sides, the lateral sides of which
+/// flip over based on the reading direction.
+///
+/// The lateral sides are called [start] and [end]. When painted in
+/// left-to-right environments, the [start] side will be painted on the left and
+/// the [end] side on the right; in right-to-left environments, it is the
+/// reverse. The other two sides are [top] and [bottom].
+///
+/// The sides are represented by [BorderSide] objects.
+///
+/// If the [start] and [end] sides are the same, then it is slightly more
+/// efficient to use a [Border] object rather than a [BorderDirectional] object.
+///
+/// See also:
+///
+///  * [BoxDecoration], which uses this class to describe its edge decoration.
+///  * [BorderSide], which is used to describe each side of the box.
+///  * [Theme], from the material layer, which can be queried to obtain appropriate colors
+///    to use for borders in a material app, as shown in the "divider" sample above.
+class BorderDirectional extends BoxBorder {
+  /// Creates a border.
+  ///
+  /// The [start] and [end] sides represent the horizontal sides; the start side
+  /// is on the leading edge given the reading direction, and the end side is on
+  /// the trailing edge. They are resolved during [paint].
+  ///
+  /// All the sides of the border default to [BorderSide.none].
+  ///
+  /// The arguments must not be null.
+  const BorderDirectional({
+    this.top = BorderSide.none,
+    this.start = BorderSide.none,
+    this.end = BorderSide.none,
+    this.bottom = BorderSide.none,
+  })  : assert(top != null),
+        assert(start != null),
+        assert(end != null),
+        assert(bottom != null);
+
+  @override
+  final BorderSide top;
+
+  /// The start side of this border.
+  ///
+  /// This is the side on the left in left-to-right text and on the right in
+  /// right-to-left text.
+  ///
+  /// See also:
+  ///
+  ///  * [TextDirection], which is used to describe the reading direction.
+  final BorderSide start;
+
+  /// The end side of this border.
+  ///
+  /// This is the side on the right in left-to-right text and on the left in
+  /// right-to-left text.
+  ///
+  /// See also:
+  ///
+  ///  * [TextDirection], which is used to describe the reading direction.
+  final BorderSide end;
+
+  @override
+  final BorderSide bottom;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_decoration.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_decoration.dart
new file mode 100644
index 0000000..75306cb
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/box_decoration.dart
@@ -0,0 +1,135 @@
+// Copyright 2015 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 'basic_types.dart';
+import 'border_radius.dart';
+import 'box_border.dart';
+import 'decoration.dart';
+
+/// An immutable description of how to paint a box.
+///
+/// The [BoxDecoration] class provides a variety of ways to draw a box.
+///
+/// The box has a [border], a body, and may cast a [boxShadow].
+///
+/// The [shape] of the box can be a circle or a rectangle. If it is a rectangle,
+/// then the [borderRadius] property controls the roundness of the corners.
+///
+/// The body of the box is painted in layers. The bottom-most layer is the
+/// [color], which fills the box. Above that is the [gradient], which also fills
+/// the box. Finally there is the [image], the precise alignment of which is
+/// controlled by the [DecorationImage] class.
+///
+/// The [border] paints over the body; the [boxShadow], naturally, paints below it.
+///
+/// {@tool sample}
+///
+/// The following example uses the [Container] widget from the widgets layer to
+/// draw an image with a border:
+///
+/// ```dart
+/// Container(
+///   decoration: BoxDecoration(
+///     color: const Color(0xff7c94b6),
+///     image: DecorationImage(
+///       image: ExactAssetImage('images/flowers.jpeg'),
+///       fit: BoxFit.cover,
+///     ),
+///     border: Border.all(
+///       color: Colors.black,
+///       width: 8.0,
+///     ),
+///   ),
+/// )
+/// ```
+/// {@end-tool}
+///
+/// {@template flutter.painting.boxDecoration.clip}
+/// The [shape] or the [borderRadius] won't clip the children of the
+/// decorated [Container]. If the clip is required, insert a clip widget
+/// (e.g., [ClipRect], [ClipRRect], [ClipPath]) as the child of the [Container].
+/// Be aware that clipping may be costly in terms of performance.
+/// {@endtemplate}
+///
+/// See also:
+///
+///  * [DecoratedBox] and [Container], widgets that can be configured with
+///    [BoxDecoration] objects.
+///  * [CustomPaint], a widget that lets you draw arbitrary graphics.
+///  * [Decoration], the base class which lets you define other decorations.
+class BoxDecoration extends Decoration {
+  /// The color to fill in the background of the box.
+  ///
+  /// The color is filled into the [shape] of the box (e.g., either a rectangle,
+  /// potentially with a [borderRadius], or a circle).
+  ///
+  /// This is ignored if [gradient] is non-null.
+  ///
+  /// The [color] is drawn under the [image].
+  final Color color;
+
+  /// A border to draw above the background [color], [gradient], or [image].
+  ///
+  /// Follows the [shape] and [borderRadius].
+  ///
+  /// Use [Border] objects to describe borders that do not depend on the reading
+  /// direction.
+  ///
+  /// Use [BoxBorder] objects to describe borders that should flip their left
+  /// and right edges based on whether the text is being read left-to-right or
+  /// right-to-left.
+  final BoxBorder border;
+
+  /// If non-null, the corners of this box are rounded by this [BorderRadius].
+  ///
+  /// Applies only to boxes with rectangular shapes; ignored if [shape] is not
+  /// [BoxShape.rectangle].
+  ///
+  /// {@macro flutter.painting.boxDecoration.clip}
+  final BorderRadiusGeometry borderRadius;
+
+  /// The blend mode applied to the [color] or [gradient] background of the box.
+  ///
+  /// If no [backgroundBlendMode] is provided then the default painting blend
+  /// mode is used.
+  ///
+  /// If no [color] or [gradient] is provided then the blend mode has no impact.
+  final BlendMode backgroundBlendMode;
+
+  /// The shape to fill the background [color], [gradient], and [image] into and
+  /// to cast as the [boxShadow].
+  ///
+  /// If this is [BoxShape.circle] then [borderRadius] is ignored.
+  ///
+  /// The [shape] cannot be interpolated; animating between two [BoxDecoration]s
+  /// with different [shape]s will result in a discontinuity in the rendering.
+  /// To interpolate between two shapes, consider using [ShapeDecoration] and
+  /// different [ShapeBorder]s; in particular, [CircleBorder] instead of
+  /// [BoxShape.circle] and [RoundedRectangleBorder] instead of
+  /// [BoxShape.rectangle].
+  ///
+  /// {@macro flutter.painting.boxDecoration.clip}
+  final BoxShape shape;
+
+  /// Creates a box decoration.
+  ///
+  /// * If [color] is null, this decoration does not paint a background color.
+  /// * If [image] is null, this decoration does not paint a background image.
+  /// * If [border] is null, this decoration does not paint a border.
+  /// * If [borderRadius] is null, this decoration uses more efficient background
+  ///   painting commands. The [borderRadius] argument must be null if [shape] is
+  ///   [BoxShape.circle].
+  /// * If [boxShadow] is null, this decoration does not paint a shadow.
+  /// * If [gradient] is null, this decoration does not paint gradients.
+  /// * If [backgroundBlendMode] is null, this decoration paints with [BlendMode.srcOver]
+  ///
+  /// The [shape] argument must not be null.
+  const BoxDecoration({
+    this.color,
+    this.border,
+    this.borderRadius,
+    this.backgroundBlendMode,
+    this.shape = BoxShape.rectangle,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/decoration.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/decoration.dart
new file mode 100644
index 0000000..6f18ea0
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/decoration.dart
@@ -0,0 +1,47 @@
+// Copyright 2015 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 'edge_insets.dart';
+
+/// A description of a box decoration (a decoration applied to a [Rect]).
+///
+/// This class presents the abstract interface for all decorations.
+/// See [BoxDecoration] for a concrete example.
+///
+/// To actually paint a [Decoration], use the [createBoxPainter]
+/// method to obtain a [BoxPainter]. [Decoration] objects can be
+/// shared between boxes; [BoxPainter] objects can cache resources to
+/// make painting on a particular surface faster.
+@immutable
+abstract class Decoration {
+  /// Abstract const constructor. This constructor enables subclasses to provide
+  /// const constructors so that they can be used in const expressions.
+  const Decoration();
+
+  /// Returns the insets to apply when using this decoration on a box
+  /// that has contents, so that the contents do not overlap the edges
+  /// of the decoration. For example, if the decoration draws a frame
+  /// around its edge, the padding would return the distance by which
+  /// to inset the children so as to not overlap the frame.
+  ///
+  /// This only works for decorations that have absolute sizes. If the padding
+  /// needed would change based on the size at which the decoration is drawn,
+  /// then this will return incorrect padding values.
+  ///
+  /// For example, when a [BoxDecoration] has [BoxShape.circle], the padding
+  /// does not take into account that the circle is drawn in the center of the
+  /// box regardless of the ratio of the box; it does not provide the extra
+  /// padding that is implied by changing the ratio.
+  ///
+  /// The value returned by this getter must be resolved (using
+  /// [EdgeInsetsGeometry.resolve] to obtain an absolute [EdgeInsets]. (For
+  /// example, [BorderDirectional] will return an [EdgeInsetsDirectional] for
+  /// its [padding].)
+  EdgeInsetsGeometry get padding => EdgeInsets.zero;
+
+  /// Whether this decoration is complex enough to benefit from caching its painting.
+  bool get isComplex => false;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/edge_insets.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/edge_insets.dart
new file mode 100644
index 0000000..3ea145e
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/edge_insets.dart
@@ -0,0 +1,47 @@
+// Copyright 2015 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.
+
+class EdgeInsets extends EdgeInsetsGeometry {
+  /// An [EdgeInsets] with zero offsets in each direction.
+  static const EdgeInsets zero = EdgeInsets.only();
+
+  /// The offset from the left.
+  final double left;
+
+  /// The offset from the top.
+  final double top;
+
+  /// The offset from the right.
+  final double right;
+
+  /// The offset from the bottom.
+  final double bottom;
+
+  const EdgeInsets.all(double value)
+      : left = value,
+        top = value,
+        right = value,
+        bottom = value;
+
+  const EdgeInsets.fromLTRB(this.left, this.top, this.right, this.bottom);
+
+  const EdgeInsets.only({
+    this.left = 0.0,
+    this.top = 0.0,
+    this.right = 0.0,
+    this.bottom = 0.0,
+  });
+
+  const EdgeInsets.symmetric({
+    double vertical = 0.0,
+    double horizontal = 0.0,
+  })  : left = horizontal,
+        top = vertical,
+        right = horizontal,
+        bottom = vertical;
+}
+
+abstract class EdgeInsetsGeometry {
+  const EdgeInsetsGeometry();
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_painter.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_painter.dart
new file mode 100644
index 0000000..41dd165
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_painter.dart
@@ -0,0 +1,18 @@
+// Copyright 2015 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.
+
+/// The different ways of considering the width of one or more lines of text.
+///
+/// See [Text.widthType].
+enum TextWidthBasis {
+  /// Multiline text will take up the full width given by the parent. For single
+  /// line text, only the minimum amount of width needed to contain the text
+  /// will be used. A common use case for this is a standard series of
+  /// paragraphs.
+  parent,
+
+  /// The width will be exactly enough to contain the longest line and no
+  /// longer. A common use case for this is chat bubbles.
+  longestLine,
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_style.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_style.dart
new file mode 100644
index 0000000..16f1685
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/painting/text_style.dart
@@ -0,0 +1,121 @@
+// Copyright 2015 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 'basic_types.dart';
+
+@immutable
+class TextStyle {
+  /// Whether null values are replaced with their value in an ancestor text
+  /// style (e.g., in a [TextSpan] tree).
+  ///
+  /// If this is false, properties that don't have explicit values will revert
+  /// to the defaults: white in color, a font size of 10 pixels, in a sans-serif
+  /// font face.
+  final bool inherit;
+
+  /// The name of the font to use when painting the text (e.g., Roboto). If the
+  /// font is defined in a package, this will be prefixed with
+  /// 'packages/package_name/' (e.g. 'packages/cool_fonts/Roboto'). The
+  /// prefixing is done by the constructor when the `package` argument is
+  /// provided.
+  ///
+  /// The value provided in [fontFamily] will act as the preferred/first font
+  /// family that glyphs are looked for in, followed in order by the font families
+  /// in [fontFamilyFallback]. When [fontFamily] is null or not provided, the
+  /// first value in [fontFamilyFallback] acts as the preferred/first font
+  /// family. When neither is provided, then the default platform font will
+  /// be used.
+  final String fontFamily;
+
+  /// The size of glyphs (in logical pixels) to use when painting the text.
+  ///
+  /// During painting, the [fontSize] is multiplied by the current
+  /// `textScaleFactor` to let users make it easier to read text by increasing
+  /// its size.
+  ///
+  /// [getParagraphStyle] will default to 14 logical pixels if the font size
+  /// isn't specified here.
+  final double fontSize;
+
+  /// The typeface thickness to use when painting the text (e.g., bold).
+  final FontWeight fontWeight;
+
+  /// The typeface variant to use when drawing the letters (e.g., italics).
+  final FontStyle fontStyle;
+
+  /// The amount of space (in logical pixels) to add between each letter.
+  /// A negative value can be used to bring the letters closer.
+  final double letterSpacing;
+
+  /// The amount of space (in logical pixels) to add at each sequence of
+  /// white-space (i.e. between each word). A negative value can be used to
+  /// bring the words closer.
+  final double wordSpacing;
+
+  /// The common baseline that should be aligned between this text span and its
+  /// parent text span, or, for the root text spans, with the line box.
+  final TextBaseline textBaseline;
+
+  /// The height of this text span, as a multiple of the font size.
+  ///
+  /// When [height] is null or omitted, the line height will be determined
+  /// by the font's metrics directly, which may differ from the fontSize.
+  /// When [height] is non-null, the line height of the span of text will be a
+  /// multiple of [fontSize] and be exactly `fontSize * height` logical pixels
+  /// tall.
+  ///
+  /// For most fonts, setting [height] to 1.0 is not the same as omitting or
+  /// setting height to null because the [fontSize] sets the height of the EM-square,
+  /// which is different than the font provided metrics for line height. The
+  /// following diagram illustrates the difference between the font-metrics
+  /// defined line height and the line height produced with `height: 1.0`
+  /// (which forms the upper and lower edges of the EM-square):
+  ///
+  /// ![Text height diagram](https://flutter.github.io/assets-for-api-docs/assets/painting/text_height_diagram.png)
+  ///
+  /// {@tool sample}
+  ///
+  /// Examples of the resulting line heights from different values of `TextStyle.height`:
+  ///
+  /// ![Text height comparison diagram](https://flutter.github.io/assets-for-api-docs/assets/painting/text_height_comparison_diagram.png)
+  ///
+  /// {@end-tool}
+  final double height;
+
+  /// The thickness of the decoration stroke as a muliplier of the thickness
+  /// defined by the font.
+  ///
+  /// The font provides a base stroke width for [decoration]s which scales off
+  /// of the [fontSize]. This property may be used to achieve a thinner or
+  /// thicker decoration stroke, without changing the [fontSize]. For example,
+  /// a [decorationThickness] of 2.0 will draw a decoration twice as thick as
+  /// the font defined decoration thickness.
+  ///
+  /// The default [decorationThickness] is 1.0, which will use the font's base
+  /// stroke thickness/width.
+  final double decorationThickness;
+
+  /// Creates a text style.
+  ///
+  /// The `package` argument must be non-null if the font family is defined in a
+  /// package. It is combined with the `fontFamily` argument to set the
+  /// [fontFamily] property.
+  const TextStyle({
+    this.inherit = true,
+    this.fontSize,
+    this.fontWeight,
+    this.fontStyle,
+    this.letterSpacing,
+    this.wordSpacing,
+    this.textBaseline,
+    this.height,
+    this.decorationThickness,
+    String fontFamily,
+    List<String> fontFamilyFallback,
+    String package,
+  }) : fontFamily =
+            package == null ? fontFamily : 'packages/$package/$fontFamily';
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/flex.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/flex.dart
new file mode 100644
index 0000000..d1c1e8e
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/flex.dart
@@ -0,0 +1,25 @@
+// Copyright 2015 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.
+
+enum CrossAxisAlignment {
+  start,
+  end,
+  center,
+  stretch,
+  baseline,
+}
+
+enum MainAxisAlignment {
+  start,
+  end,
+  center,
+  spaceBetween,
+  spaceAround,
+  spaceEvenly,
+}
+
+enum MainAxisSize {
+  min,
+  max,
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/paragraph.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/paragraph.dart
new file mode 100644
index 0000000..0686496
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/rendering/paragraph.dart
@@ -0,0 +1,21 @@
+// Copyright 2015 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.
+
+/// How overflowing text should be handled.
+///
+/// A [TextOverflow] can be passed to [Text] and [RichText] via their
+/// [Text.overflow] and [RichText.overflow] properties respectively.
+enum TextOverflow {
+  /// Clip the overflowing text to fix its container.
+  clip,
+
+  /// Fade the overflowing text to transparent.
+  fade,
+
+  /// Use an ellipsis to indicate that the text has overflowed.
+  ellipsis,
+
+  /// Render overflowing text outside of its container.
+  visible,
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart
new file mode 100644
index 0000000..081022b
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/async.dart
@@ -0,0 +1,17 @@
+// Copyright 2015 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 'framework.dart';
+
+class AsyncSnapshot<T> {}
+
+typedef AsyncWidgetBuilder<T> = Widget Function(
+    BuildContext context, AsyncSnapshot<T> snapshot);
+
+class StreamBuilder<T> {
+  const StreamBuilder(
+      {Key key, this.initialData, Stream<T> stream, @required this.builder});
+  final T initialData;
+  final AsyncWidgetBuilder<T> builder;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
new file mode 100644
index 0000000..761a15c
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/basic.dart
@@ -0,0 +1,135 @@
+// Copyright 2015 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/rendering.dart';
+
+import 'framework.dart';
+
+export 'package:flutter/painting.dart';
+export 'package:flutter/rendering.dart';
+
+class Align extends SingleChildRenderObjectWidget {
+  /// How to align the child.
+  ///
+  /// The x and y values of the [Alignment] control the horizontal and vertical
+  /// alignment, respectively. An x value of -1.0 means that the left edge of
+  /// the child is aligned with the left edge of the parent whereas an x value
+  /// of 1.0 means that the right edge of the child is aligned with the right
+  /// edge of the parent. Other values interpolate (and extrapolate) linearly.
+  /// For example, a value of 0.0 means that the center of the child is aligned
+  /// with the center of the parent.
+  ///
+  /// See also:
+  ///
+  ///  * [Alignment], which has more details and some convenience constants for
+  ///    common positions.
+  ///  * [AlignmentDirectional], which has a horizontal coordinate orientation
+  ///    that depends on the [TextDirection].
+  final AlignmentGeometry alignment;
+
+  /// If non-null, sets its width to the child's width multiplied by this factor.
+  ///
+  /// Can be both greater and less than 1.0 but must be positive.
+  final double widthFactor;
+
+  /// If non-null, sets its height to the child's height multiplied by this factor.
+  ///
+  /// Can be both greater and less than 1.0 but must be positive.
+  final double heightFactor;
+
+  /// Creates an alignment widget.
+  ///
+  /// The alignment defaults to [Alignment.center].
+  const Align({
+    Key key,
+    this.alignment = Alignment.center,
+    this.widthFactor,
+    this.heightFactor,
+    Widget child,
+  })  : assert(alignment != null),
+        assert(widthFactor == null || widthFactor >= 0.0),
+        assert(heightFactor == null || heightFactor >= 0.0),
+        super(key: key, child: child);
+}
+
+class AspectRatio extends SingleChildRenderObjectWidget {
+  const AspectRatio({
+    Key key,
+    @required double aspectRatio,
+    Widget child,
+  });
+}
+
+class Center extends StatelessWidget {
+  const Center({Key key, double heightFactor, Widget child});
+}
+
+class ClipRect extends SingleChildRenderObjectWidget {
+  const ClipRect({Key key, Widget child}) : super(key: key, child: child);
+
+  /// Does not actually exist in Flutter.
+  const ClipRect.rect({Key key, Widget child}) : super(key: key, child: child);
+}
+
+class Column extends Flex {
+  Column({
+    Key key,
+    MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
+    MainAxisSize mainAxisSize = MainAxisSize.max,
+    CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
+    TextDirection textDirection,
+    VerticalDirection verticalDirection = VerticalDirection.down,
+    TextBaseline textBaseline,
+    List<Widget> children = const <Widget>[],
+  });
+}
+
+class Expanded extends StatelessWidget {
+  const Expanded({
+    Key key,
+    int flex = 1,
+    @required Widget child,
+  });
+}
+
+class Flex extends Widget {
+  Flex({
+    Key key,
+    List<Widget> children = const <Widget>[],
+  });
+}
+
+class Padding extends SingleChildRenderObjectWidget {
+  final EdgeInsetsGeometry padding;
+
+  const Padding({
+    Key key,
+    @required this.padding,
+    Widget child,
+  });
+}
+
+class Row extends Flex {
+  Row({
+    Key key,
+    MainAxisAlignment mainAxisAlignment = MainAxisAlignment.start,
+    MainAxisSize mainAxisSize = MainAxisSize.max,
+    CrossAxisAlignment crossAxisAlignment = CrossAxisAlignment.center,
+    TextDirection textDirection,
+    VerticalDirection verticalDirection = VerticalDirection.down,
+    TextBaseline textBaseline,
+    List<Widget> children = const <Widget>[],
+  });
+}
+
+class Transform extends SingleChildRenderObjectWidget {
+  const Transform({
+    Key key,
+    @required transform,
+    origin,
+    alignment,
+    transformHitTests = true,
+    Widget child,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart
new file mode 100644
index 0000000..ede265b
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/container.dart
@@ -0,0 +1,67 @@
+// Copyright 2015 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';
+
+import 'framework.dart';
+
+class Container extends StatelessWidget {
+  final Widget child;
+
+  /// Align the [child] within the container.
+  ///
+  /// If non-null, the container will expand to fill its parent and position its
+  /// child within itself according to the given value. If the incoming
+  /// constraints are unbounded, then the child will be shrink-wrapped instead.
+  ///
+  /// Ignored if [child] is null.
+  ///
+  /// See also:
+  ///
+  ///  * [Alignment], a class with convenient constants typically used to
+  ///    specify an [AlignmentGeometry].
+  ///  * [AlignmentDirectional], like [Alignment] for specifying alignments
+  ///    relative to text direction.
+  final AlignmentGeometry alignment;
+
+  /// Empty space to inscribe inside the [decoration]. The [child], if any, is
+  /// placed inside this padding.
+  ///
+  /// This padding is in addition to any padding inherent in the [decoration];
+  /// see [Decoration.padding].
+  final EdgeInsetsGeometry padding;
+
+  /// The decoration to paint behind the [child].
+  ///
+  /// A shorthand for specifying just a solid color is available in the
+  /// constructor: set the `color` argument instead of the `decoration`
+  /// argument.
+  ///
+  /// The [child] is not clipped to the decoration. To clip a child to the shape
+  /// of a particular [ShapeDecoration], consider using a [ClipPath] widget.
+  final Decoration decoration;
+
+  /// The decoration to paint in front of the [child].
+  final Decoration foregroundDecoration;
+
+  /// Empty space to surround the [decoration] and [child].
+  final EdgeInsetsGeometry margin;
+
+  Container({
+    Key key,
+    this.alignment,
+    this.padding,
+    Color color,
+    Decoration decoration,
+    this.foregroundDecoration,
+    double width,
+    double height,
+    this.margin,
+    this.child,
+  })  : decoration = decoration,
+        super(key: key);
+
+  @override
+  Widget build(BuildContext context) => child;
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart
new file mode 100644
index 0000000..ac48179
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/framework.dart
@@ -0,0 +1,54 @@
+// Copyright 2015 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';
+
+export 'package:flutter/foundation.dart' show required;
+export 'package:flutter/foundation.dart' show Key, LocalKey, ValueKey;
+
+typedef void VoidCallback();
+
+abstract class BuildContext {
+  Widget get widget;
+}
+
+abstract class State<T extends StatefulWidget> {
+  BuildContext get context => null;
+
+  T get widget => null;
+
+  Widget build(BuildContext context) => null;
+
+  void dispose() {}
+
+  void setState(VoidCallback fn) {}
+}
+
+abstract class StatefulWidget extends Widget {
+  const StatefulWidget({Key key}) : super(key: key);
+
+  State createState() => null;
+}
+
+abstract class StatelessWidget extends Widget {
+  const StatelessWidget({Key key}) : super(key: key);
+
+  Widget build(BuildContext context) => null;
+}
+
+class Widget {
+  final Key key;
+
+  const Widget({this.key});
+}
+
+abstract class SingleChildRenderObjectWidget extends RenderObjectWidget {
+  final Widget child;
+
+  const SingleChildRenderObjectWidget({Key key, this.child}) : super(key: key);
+}
+
+abstract class RenderObjectWidget extends Widget {
+  const RenderObjectWidget({Key key}) : super(key: key);
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart
new file mode 100644
index 0000000..0e20e3d
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/gesture_detector.dart
@@ -0,0 +1,13 @@
+// Copyright 2015 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/widgets.dart';
+
+class GestureDetector extends StatelessWidget {
+  GestureDetector({
+    Key key,
+    Widget child,
+    onTap,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart
new file mode 100644
index 0000000..53d7a16
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/icon.dart
@@ -0,0 +1,24 @@
+// Copyright 2015 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 'framework.dart';
+
+class Icon extends StatelessWidget {
+  final IconData icon;
+
+  const Icon(
+    this.icon, {
+    Key key,
+  }) : super(key: key);
+}
+
+class IconData {
+  final int codePoint;
+  final String fontFamily;
+
+  const IconData(
+    this.codePoint, {
+    this.fontFamily,
+  });
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart
new file mode 100644
index 0000000..a052b28
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/src/widgets/text.dart
@@ -0,0 +1,113 @@
+// Copyright 2015 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';
+
+import 'basic.dart';
+import 'framework.dart';
+
+class DefaultTextStyle extends StatelessWidget {
+  DefaultTextStyle({Widget child});
+}
+
+class Text extends StatelessWidget {
+  /// The text to display.
+  ///
+  /// This will be null if a [textSpan] is provided instead.
+  final String data;
+
+  /// If non-null, the style to use for this text.
+  ///
+  /// If the style's "inherit" property is true, the style will be merged with
+  /// the closest enclosing [DefaultTextStyle]. Otherwise, the style will
+  /// replace the closest enclosing [DefaultTextStyle].
+  final TextStyle style;
+
+  /// How the text should be aligned horizontally.
+  final TextAlign textAlign;
+
+  /// The directionality of the text.
+  ///
+  /// This decides how [textAlign] values like [TextAlign.start] and
+  /// [TextAlign.end] are interpreted.
+  ///
+  /// This is also used to disambiguate how to render bidirectional text. For
+  /// example, if the [data] is an English phrase followed by a Hebrew phrase,
+  /// in a [TextDirection.ltr] context the English phrase will be on the left
+  /// and the Hebrew phrase to its right, while in a [TextDirection.rtl]
+  /// context, the English phrase will be on the right and the Hebrew phrase on
+  /// its left.
+  ///
+  /// Defaults to the ambient [Directionality], if any.
+  final TextDirection textDirection;
+
+  /// Whether the text should break at soft line breaks.
+  ///
+  /// If false, the glyphs in the text will be positioned as if there was unlimited horizontal space.
+  final bool softWrap;
+
+  /// How visual overflow should be handled.
+  final TextOverflow overflow;
+
+  /// The number of font pixels for each logical pixel.
+  ///
+  /// For example, if the text scale factor is 1.5, text will be 50% larger than
+  /// the specified font size.
+  ///
+  /// The value given to the constructor as textScaleFactor. If null, will
+  /// use the [MediaQueryData.textScaleFactor] obtained from the ambient
+  /// [MediaQuery], or 1.0 if there is no [MediaQuery] in scope.
+  final double textScaleFactor;
+
+  /// An optional maximum number of lines for the text to span, wrapping if necessary.
+  /// If the text exceeds the given number of lines, it will be truncated according
+  /// to [overflow].
+  ///
+  /// If this is 1, text will not wrap. Otherwise, text will be wrapped at the
+  /// edge of the box.
+  ///
+  /// If this is null, but there is an ambient [DefaultTextStyle] that specifies
+  /// an explicit number for its [DefaultTextStyle.maxLines], then the
+  /// [DefaultTextStyle] value will take precedence. You can use a [RichText]
+  /// widget directly to entirely override the [DefaultTextStyle].
+  final int maxLines;
+
+  /// An alternative semantics label for this text.
+  ///
+  /// If present, the semantics of this widget will contain this value instead
+  /// of the actual text. This will overwrite any of the semantics labels applied
+  /// directly to the [TextSpan]s.
+  ///
+  /// This is useful for replacing abbreviations or shorthands with the full
+  /// text value:
+  ///
+  /// ```dart
+  /// Text(r'$$', semanticsLabel: 'Double dollars')
+  /// ```
+  final String semanticsLabel;
+
+  /// {@macro flutter.dart:ui.text.TextWidthBasis}
+  final TextWidthBasis textWidthBasis;
+
+  /// Creates a text widget.
+  ///
+  /// If the [style] argument is null, the text will use the style from the
+  /// closest enclosing [DefaultTextStyle].
+  ///
+  /// The [data] parameter must not be null.
+  const Text(
+    this.data, {
+    Key key,
+    this.style,
+    this.textAlign,
+    this.textDirection,
+    this.softWrap,
+    this.overflow,
+    this.textScaleFactor,
+    this.maxLines,
+    this.semanticsLabel,
+    this.textWidthBasis,
+  }) : super(key: key);
+}
diff --git a/pkg/analysis_server/test/mock_packages/flutter/lib/widgets.dart b/pkg/analysis_server/test/mock_packages/flutter/lib/widgets.dart
new file mode 100644
index 0000000..76d58efd
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/lib/widgets.dart
@@ -0,0 +1,11 @@
+// Copyright 2015 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/widgets/async.dart';
+export 'src/widgets/basic.dart';
+export 'src/widgets/container.dart';
+export 'src/widgets/framework.dart';
+export 'src/widgets/gesture_detector.dart';
+export 'src/widgets/icon.dart';
+export 'src/widgets/text.dart';
diff --git a/pkg/analysis_server/test/mock_packages/flutter/pubspec.yaml b/pkg/analysis_server/test/mock_packages/flutter/pubspec.yaml
new file mode 100644
index 0000000..5b77f94
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/flutter/pubspec.yaml
@@ -0,0 +1 @@
+name: flutter
diff --git a/pkg/analysis_server/test/mock_packages/meta/lib/meta.dart b/pkg/analysis_server/test/mock_packages/meta/lib/meta.dart
new file mode 100644
index 0000000..9fd9fca
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/meta/lib/meta.dart
@@ -0,0 +1,320 @@
+// 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.
+
+/// Constants for use in metadata annotations.
+///
+/// See also `@deprecated` and `@override` in the `dart:core` library.
+///
+/// Annotations provide semantic information that tools can use to provide a
+/// better user experience. For example, an IDE might not autocomplete the name
+/// of a function that's been marked `@deprecated`, or it might display the
+/// function's name differently.
+///
+/// For information on installing and importing this library, see the
+/// [meta package on pub.dartlang.org] (https://pub.dartlang.org/packages/meta).
+/// For examples of using annotations, see
+/// [Metadata](https://www.dartlang.org/docs/dart-up-and-running/ch02.html#metadata)
+/// in the language tour.
+library meta;
+
+/// Used to annotate a function `f`. Indicates that `f` always throws an
+/// exception. Any functions that override `f`, in class inheritence, are also
+/// expected to conform to this contract.
+///
+/// Tools, such as the analyzer, can use this to understand whether a block of
+/// code "exits". For example:
+///
+/// ```dart
+/// @alwaysThrows toss() { throw 'Thrown'; }
+///
+/// int fn(bool b) {
+///   if (b) {
+///     return 0;
+///   } else {
+///     toss();
+///     print("Hello.");
+///   }
+/// }
+/// ```
+///
+/// Without the annotation on `toss`, it would look as though `fn` doesn't
+/// always return a value. The annotation shows that `fn` does always exit. In
+/// addition, the annotation reveals that any statements following a call to
+/// `toss` (like the `print` call) are dead code.
+///
+/// Tools, such as the analyzer, can also expect this contract to be enforced;
+/// that is, tools may emit warnings if a function with this annotation
+/// _doesn't_ always throw.
+const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
+
+/// Used to annotate a parameter of an instance method that overrides another
+/// method.
+///
+/// Indicates that this parameter may have a tighter type than the parameter on
+/// its superclass. The actual argument will be checked at runtime to ensure it
+/// is a subtype of the overridden parameter type.
+///
+/// DEPRECATED: Use the `covariant` modifier instead.
+@deprecated
+const _Checked checked = const _Checked();
+
+/// Used to annotate a library, or any declaration that is part of the public
+/// interface of a library (such as top-level members, class members, and
+/// function parameters) to indicate that the annotated API is experimental and
+/// may be removed or changed at any-time without updating the version of the
+/// containing package, despite the fact that it would otherwise be a breaking
+/// change.
+///
+/// If the annotation is applied to a library then it is equivalent to applying
+/// the annotation to all of the top-level members of the library. Applying the
+/// annotation to a class does *not* apply the annotation to subclasses, but
+/// does apply the annotation to members of the class.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration that is not part of the
+///   public interface of a library (such as a local variable or a declaration
+///   that is private) or a directive other than the first directive in the
+///   library, or
+/// * the declaration is referenced by a package that has not explicitly
+///   indicated its intention to use experimental APIs (details TBD).
+const _Experimental experimental = const _Experimental();
+
+/// Used to annotate an instance or static method `m`. Indicates that `m` must
+/// either be abstract or must return a newly allocated object or `null`. In
+/// addition, every method that either implements or overrides `m` is implicitly
+/// annotated with this same annotation.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a method, or
+/// * the annotation is associated with a method that has this annotation that
+///   can return anything other than a newly allocated object or `null`.
+const _Factory factory = const _Factory();
+
+/// Used to annotate a class `C`. Indicates that `C` and all subtypes of `C`
+/// must be immutable.
+///
+/// A class is immutable if all of the instance fields of the class, whether
+/// defined directly or inherited, are `final`.
+///
+/// Tools, such as the analyzer, can provide feedback if
+/// * the annotation is associated with anything other than a class, or
+/// * a class that has this annotation or extends, implements or mixes in a
+///   class that has this annotation is not immutable.
+const Immutable immutable = const Immutable();
+
+/// Used to annotate a test framework function that runs a single test.
+///
+/// Tools, such as IDEs, can show invocations of such function in a file
+/// structure view to help the user navigating in large test files.
+///
+/// The first parameter of the function must be the description of the test.
+const _IsTest isTest = const _IsTest();
+
+/// Used to annotate a test framework function that runs a group of tests.
+///
+/// Tools, such as IDEs, can show invocations of such function in a file
+/// structure view to help the user navigating in large test files.
+///
+/// The first parameter of the function must be the description of the group.
+const _IsTestGroup isTestGroup = const _IsTestGroup();
+
+/// Used to annotate a const constructor `c`. Indicates that any invocation of
+/// the constructor must use the keyword `const` unless one or more of the
+/// arguments to the constructor is not a compile-time constant.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a const constructor,
+///   or
+/// * an invocation of a constructor that has this annotation is not invoked
+///   using the `const` keyword unless one or more of the arguments to the
+///   constructor is not a compile-time constant.
+const _Literal literal = const _Literal();
+
+/// Used to annotate an instance method `m`. Indicates that every invocation of
+/// a method that overrides `m` must also invoke `m`. In addition, every method
+/// that overrides `m` is implicitly annotated with this same annotation.
+///
+/// Note that private methods with this annotation cannot be validly overridden
+/// outside of the library that defines the annotated method.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than an instance method,
+///   or
+/// * a method that overrides a method that has this annotation can return
+///   without invoking the overridden method.
+const _MustCallSuper mustCallSuper = const _MustCallSuper();
+
+/// Used to annotate a class declaration `C`. Indicates that any type arguments
+/// declared on `C` are to be treated as optional.  Tools such as the analyzer
+/// and linter can use this information to suppress warnings that would
+/// otherwise require type arguments to be provided for instances of `C`.
+const _OptionalTypeArgs optionalTypeArgs = const _OptionalTypeArgs();
+
+/// Used to annotate an instance member (method, getter, setter, operator, or
+/// field) `m` in a class `C`. If the annotation is on a field it applies to the
+/// getter, and setter if appropriate, that are induced by the field. Indicates
+/// that `m` should only be invoked from instance methods of `C` or classes that
+/// extend, implement or mix in `C`, either directly or indirectly. Additionally
+/// indicates that `m` should only be invoked on `this`, whether explicitly or
+/// implicitly.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than an instance member,
+///   or
+/// * an invocation of a member that has this annotation is used outside of an
+///   instance member defined on a class that extends or mixes in the class in
+///   which the protected member is defined, or that uses a receiver other than
+///   `this`.
+const _Protected protected = const _Protected();
+
+/// Used to annotate a named parameter `p` in a method or function `f`.
+/// Indicates that every invocation of `f` must include an argument
+/// corresponding to `p`, despite the fact that `p` would otherwise be an
+/// optional parameter.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a named parameter,
+/// * the annotation is associated with a named parameter in a method `m1` that
+///   overrides a method `m0` and `m0` defines a named parameter with the same
+///   name that does not have this annotation, or
+/// * an invocation of a method or function does not include an argument
+///   corresponding to a named parameter that has this annotation.
+const Required required = const Required();
+
+/// Annotation marking a class as not allowed as a super-type.
+///
+/// Classes in the same package as the marked class may extend, implement or
+/// mix-in the annotated class.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with anything other than a class,
+/// * the annotation is associated with a class `C`, and there is a class or
+///   mixin `D`, which extends, implements, mixes in, or constrains to `C`, and
+///   `C` and `D` are declared in different packages.
+const _Sealed sealed = const _Sealed();
+
+/// Used to annotate a field that is allowed to be overridden in Strong Mode.
+///
+/// Deprecated: Most of strong mode is now the default in 2.0, but the notion of
+/// virtual fields was dropped, so this annotation no longer has any meaning.
+/// Uses of the annotation should be removed.
+@deprecated
+const _Virtual virtual = const _Virtual();
+
+/// Used to annotate an instance member that was made public so that it could be
+/// overridden but that is not intended to be referenced from outside the
+/// defining library.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration other than a public
+///   instance member in a class, or
+/// * the member is referenced outside of the defining library.
+const _VisibleForOverriding visibleForOverriding =
+    const _VisibleForOverriding();
+
+/// Used to annotate a declaration was made public, so that it is more visible
+/// than otherwise necessary, to make code testable.
+///
+/// Tools, such as the analyzer, can provide feedback if
+///
+/// * the annotation is associated with a declaration not in the `lib` folder
+///   of a package, or
+/// * the declaration is referenced outside of its the defining library or a
+///   library which is in the `test` folder of the defining package.
+const _VisibleForTesting visibleForTesting = const _VisibleForTesting();
+
+/// Used to annotate a class.
+///
+/// See [immutable] for more details.
+class Immutable {
+  /// A human-readable explanation of the reason why the class is immutable.
+  final String reason;
+
+  /// Initialize a newly created instance to have the given [reason].
+  const Immutable([this.reason]);
+}
+
+/// Used to annotate a named parameter `p` in a method or function `f`.
+///
+/// See [required] for more details.
+class Required {
+  /// A human-readable explanation of the reason why the annotated parameter is
+  /// required. For example, the annotation might look like:
+  ///
+  ///     ButtonWidget({
+  ///         Function onHover,
+  ///         @Required('Buttons must do something when pressed')
+  ///         Function onPressed,
+  ///         ...
+  ///     }) ...
+  final String reason;
+
+  /// Initialize a newly created instance to have the given [reason].
+  const Required([this.reason]);
+}
+
+class _AlwaysThrows {
+  const _AlwaysThrows();
+}
+
+class _Checked {
+  const _Checked();
+}
+
+class _Experimental {
+  const _Experimental();
+}
+
+class _Factory {
+  const _Factory();
+}
+
+class _IsTest {
+  const _IsTest();
+}
+
+class _IsTestGroup {
+  const _IsTestGroup();
+}
+
+class _Literal {
+  const _Literal();
+}
+
+class _MustCallSuper {
+  const _MustCallSuper();
+}
+
+class _OptionalTypeArgs {
+  const _OptionalTypeArgs();
+}
+
+class _Protected {
+  const _Protected();
+}
+
+class _Sealed {
+  const _Sealed();
+}
+
+@deprecated
+class _Virtual {
+  const _Virtual();
+}
+
+class _VisibleForOverriding {
+  const _VisibleForOverriding();
+}
+
+class _VisibleForTesting {
+  const _VisibleForTesting();
+}
diff --git a/pkg/analysis_server/test/mock_packages/meta/pubspec.yaml b/pkg/analysis_server/test/mock_packages/meta/pubspec.yaml
new file mode 100644
index 0000000..d1b06d5
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/meta/pubspec.yaml
@@ -0,0 +1 @@
+name: meta
diff --git a/pkg/analysis_server/test/mock_packages/ui/lib/geometry.dart b/pkg/analysis_server/test/mock_packages/ui/lib/geometry.dart
new file mode 100644
index 0000000..7cbc6e0
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/ui/lib/geometry.dart
@@ -0,0 +1,25 @@
+// Copyright 2013 The Flutter Authors. 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.ui;
+
+/// A radius for either circular or elliptical shapes.
+class Radius {
+  /// Constructs a circular radius. [x] and [y] will have the same radius value.
+  const Radius.circular(double radius) : this.elliptical(radius, radius);
+
+  /// Constructs an elliptical radius with the given radii.
+  const Radius.elliptical(this.x, this.y);
+
+  /// The radius value on the horizontal axis.
+  final double x;
+
+  /// The radius value on the vertical axis.
+  final double y;
+
+  /// A radius with [x] and [y] values set to zero.
+  ///
+  /// You can use [Radius.zero] with [RRect] to have right-angle corners.
+  static const Radius zero = Radius.circular(0.0);
+}
diff --git a/pkg/analysis_server/test/mock_packages/ui/lib/painting.dart b/pkg/analysis_server/test/mock_packages/ui/lib/painting.dart
new file mode 100644
index 0000000..2009ca0
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/ui/lib/painting.dart
@@ -0,0 +1,650 @@
+// Copyright 2013 The Flutter Authors. 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.ui;
+
+/// An immutable 32 bit color value in ARGB format.
+///
+/// Consider the light teal of the Flutter logo. It is fully opaque, with a red
+/// channel value of 0x42 (66), a green channel value of 0xA5 (165), and a blue
+/// channel value of 0xF5 (245). In the common "hash syntax" for color values,
+/// it would be described as `#42A5F5`.
+///
+/// Here are some ways it could be constructed:
+///
+/// ```dart
+/// Color c = const Color(0xFF42A5F5);
+/// Color c = const Color.fromARGB(0xFF, 0x42, 0xA5, 0xF5);
+/// Color c = const Color.fromARGB(255, 66, 165, 245);
+/// Color c = const Color.fromRGBO(66, 165, 245, 1.0);
+/// ```
+///
+/// If you are having a problem with `Color` wherein it seems your color is just
+/// not painting, check to make sure you are specifying the full 8 hexadecimal
+/// digits. If you only specify six, then the leading two digits are assumed to
+/// be zero, which means fully-transparent:
+///
+/// ```dart
+/// Color c1 = const Color(0xFFFFFF); // fully transparent white (invisible)
+/// Color c2 = const Color(0xFFFFFFFF); // fully opaque white (visible)
+/// ```
+///
+/// See also:
+///
+///  * [Colors](https://docs.flutter.io/flutter/material/Colors-class.html), which
+///    defines the colors found in the Material Design specification.
+class Color {
+  /// Construct a color from the lower 32 bits of an [int].
+  ///
+  /// The bits are interpreted as follows:
+  ///
+  /// * Bits 24-31 are the alpha value.
+  /// * Bits 16-23 are the red value.
+  /// * Bits 8-15 are the green value.
+  /// * Bits 0-7 are the blue value.
+  ///
+  /// In other words, if AA is the alpha value in hex, RR the red value in hex,
+  /// GG the green value in hex, and BB the blue value in hex, a color can be
+  /// expressed as `const Color(0xAARRGGBB)`.
+  ///
+  /// For example, to get a fully opaque orange, you would use `const
+  /// Color(0xFFFF9000)` (`FF` for the alpha, `FF` for the red, `90` for the
+  /// green, and `00` for the blue).
+  @pragma('vm:entry-point')
+  const Color(int value) : value = value & 0xFFFFFFFF;
+
+  /// Construct a color from the lower 8 bits of four integers.
+  ///
+  /// * `a` is the alpha value, with 0 being transparent and 255 being fully
+  ///   opaque.
+  /// * `r` is [red], from 0 to 255.
+  /// * `g` is [green], from 0 to 255.
+  /// * `b` is [blue], from 0 to 255.
+  ///
+  /// Out of range values are brought into range using modulo 255.
+  ///
+  /// See also [fromRGBO], which takes the alpha value as a floating point
+  /// value.
+  const Color.fromARGB(int a, int r, int g, int b)
+      : value = (((a & 0xff) << 24) |
+                ((r & 0xff) << 16) |
+                ((g & 0xff) << 8) |
+                ((b & 0xff) << 0)) &
+            0xFFFFFFFF;
+
+  /// Create a color from red, green, blue, and opacity, similar to `rgba()` in CSS.
+  ///
+  /// * `r` is [red], from 0 to 255.
+  /// * `g` is [green], from 0 to 255.
+  /// * `b` is [blue], from 0 to 255.
+  /// * `opacity` is alpha channel of this color as a double, with 0.0 being
+  ///   transparent and 1.0 being fully opaque.
+  ///
+  /// Out of range values are brought into range using modulo 255.
+  ///
+  /// See also [fromARGB], which takes the opacity as an integer value.
+  const Color.fromRGBO(int r, int g, int b, double opacity)
+      : value = ((((opacity * 0xff ~/ 1) & 0xff) << 24) |
+                ((r & 0xff) << 16) |
+                ((g & 0xff) << 8) |
+                ((b & 0xff) << 0)) &
+            0xFFFFFFFF;
+
+  /// A 32 bit value representing this color.
+  ///
+  /// The bits are assigned as follows:
+  ///
+  /// * Bits 24-31 are the alpha value.
+  /// * Bits 16-23 are the red value.
+  /// * Bits 8-15 are the green value.
+  /// * Bits 0-7 are the blue value.
+  final int value;
+
+  /// The alpha channel of this color in an 8 bit value.
+  ///
+  /// A value of 0 means this color is fully transparent. A value of 255 means
+  /// this color is fully opaque.
+  int get alpha => (0xff000000 & value) >> 24;
+
+  /// The alpha channel of this color as a double.
+  ///
+  /// A value of 0.0 means this color is fully transparent. A value of 1.0 means
+  /// this color is fully opaque.
+  double get opacity => alpha / 0xFF;
+
+  /// The red channel of this color in an 8 bit value.
+  int get red => (0x00ff0000 & value) >> 16;
+
+  /// The green channel of this color in an 8 bit value.
+  int get green => (0x0000ff00 & value) >> 8;
+
+  /// The blue channel of this color in an 8 bit value.
+  int get blue => (0x000000ff & value) >> 0;
+
+  /// Returns a new color that matches this color with the alpha channel
+  /// replaced with `a` (which ranges from 0 to 255).
+  ///
+  /// Out of range values will have unexpected effects.
+  Color withAlpha(int a) {
+    return Color.fromARGB(a, red, green, blue);
+  }
+
+  /// Returns a new color that matches this color with the alpha channel
+  /// replaced with the given `opacity` (which ranges from 0.0 to 1.0).
+  ///
+  /// Out of range values will have unexpected effects.
+  Color withOpacity(double opacity) {
+    assert(opacity >= 0.0 && opacity <= 1.0);
+    return withAlpha((255.0 * opacity).round());
+  }
+
+  /// Returns a new color that matches this color with the red channel replaced
+  /// with `r` (which ranges from 0 to 255).
+  ///
+  /// Out of range values will have unexpected effects.
+  Color withRed(int r) {
+    return Color.fromARGB(alpha, r, green, blue);
+  }
+
+  /// Returns a new color that matches this color with the green channel
+  /// replaced with `g` (which ranges from 0 to 255).
+  ///
+  /// Out of range values will have unexpected effects.
+  Color withGreen(int g) {
+    return Color.fromARGB(alpha, red, g, blue);
+  }
+
+  /// Returns a new color that matches this color with the blue channel replaced
+  /// with `b` (which ranges from 0 to 255).
+  ///
+  /// Out of range values will have unexpected effects.
+  Color withBlue(int b) {
+    return Color.fromARGB(alpha, red, green, b);
+  }
+
+  @override
+  bool operator ==(dynamic other) {
+    if (identical(this, other)) return true;
+    if (other.runtimeType != runtimeType) return false;
+    final Color typedOther = other;
+    return value == typedOther.value;
+  }
+
+  @override
+  int get hashCode => value.hashCode;
+
+  @override
+  String toString() => 'Color(0x${value.toRadixString(16).padLeft(8, '0')})';
+}
+
+/// Algorithms to use when painting on the canvas.
+///
+/// When drawing a shape or image onto a canvas, different algorithms can be
+/// used to blend the pixels. The different values of [BlendMode] specify
+/// different such algorithms.
+///
+/// Each algorithm has two inputs, the _source_, which is the image being drawn,
+/// and the _destination_, which is the image into which the source image is
+/// being composited. The destination is often thought of as the _background_.
+/// The source and destination both have four color channels, the red, green,
+/// blue, and alpha channels. These are typically represented as numbers in the
+/// range 0.0 to 1.0. The output of the algorithm also has these same four
+/// channels, with values computed from the source and destination.
+///
+/// The documentation of each value below describes how the algorithm works. In
+/// each case, an image shows the output of blending a source image with a
+/// destination image. In the images below, the destination is represented by an
+/// image with horizontal lines and an opaque landscape photograph, and the
+/// source is represented by an image with vertical lines (the same lines but
+/// rotated) and a bird clip-art image. The [src] mode shows only the source
+/// image, and the [dst] mode shows only the destination image. In the
+/// documentation below, the transparency is illustrated by a checkerboard
+/// pattern. The [clear] mode drops both the source and destination, resulting
+/// in an output that is entirely transparent (illustrated by a solid
+/// checkerboard pattern).
+///
+/// The horizontal and vertical bars in these images show the red, green, and
+/// blue channels with varying opacity levels, then all three color channels
+/// together with those same varying opacity levels, then all three color
+/// channels set to zero with those varying opacity levels, then two bars showing
+/// a red/green/blue repeating gradient, the first with full opacity and the
+/// second with partial opacity, and finally a bar with the three color channels
+/// set to zero but the opacity varying in a repeating gradient.
+///
+/// ## Application to the [Canvas] API
+///
+/// When using [Canvas.saveLayer] and [Canvas.restore], the blend mode of the
+/// [Paint] given to the [Canvas.saveLayer] will be applied when
+/// [Canvas.restore] is called. Each call to [Canvas.saveLayer] introduces a new
+/// layer onto which shapes and images are painted; when [Canvas.restore] is
+/// called, that layer is then composited onto the parent layer, with the source
+/// being the most-recently-drawn shapes and images, and the destination being
+/// the parent layer. (For the first [Canvas.saveLayer] call, the parent layer
+/// is the canvas itself.)
+///
+/// See also:
+///
+///  * [Paint.blendMode], which uses [BlendMode] to define the compositing
+///    strategy.
+enum BlendMode {
+  // This list comes from Skia's SkXfermode.h and the values (order) should be
+  // kept in sync.
+  // See: https://skia.org/user/api/skpaint#SkXfermode
+
+  /// Drop both the source and destination images, leaving nothing.
+  ///
+  /// This corresponds to the "clear" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_clear.png)
+  clear,
+
+  /// Drop the destination image, only paint the source image.
+  ///
+  /// Conceptually, the destination is first cleared, then the source image is
+  /// painted.
+  ///
+  /// This corresponds to the "Copy" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_src.png)
+  src,
+
+  /// Drop the source image, only paint the destination image.
+  ///
+  /// Conceptually, the source image is discarded, leaving the destination
+  /// untouched.
+  ///
+  /// This corresponds to the "Destination" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_dst.png)
+  dst,
+
+  /// Composite the source image over the destination image.
+  ///
+  /// This is the default value. It represents the most intuitive case, where
+  /// shapes are painted on top of what is below, with transparent areas showing
+  /// the destination layer.
+  ///
+  /// This corresponds to the "Source over Destination" Porter-Duff operator,
+  /// also known as the Painter's Algorithm.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_srcOver.png)
+  srcOver,
+
+  /// Composite the source image under the destination image.
+  ///
+  /// This is the opposite of [srcOver].
+  ///
+  /// This corresponds to the "Destination over Source" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_dstOver.png)
+  ///
+  /// This is useful when the source image should have been painted before the
+  /// destination image, but could not be.
+  dstOver,
+
+  /// Show the source image, but only where the two images overlap. The
+  /// destination image is not rendered, it is treated merely as a mask. The
+  /// color channels of the destination are ignored, only the opacity has an
+  /// effect.
+  ///
+  /// To show the destination image instead, consider [dstIn].
+  ///
+  /// To reverse the semantic of the mask (only showing the source where the
+  /// destination is absent, rather than where it is present), consider
+  /// [srcOut].
+  ///
+  /// This corresponds to the "Source in Destination" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_srcIn.png)
+  srcIn,
+
+  /// Show the destination image, but only where the two images overlap. The
+  /// source image is not rendered, it is treated merely as a mask. The color
+  /// channels of the source are ignored, only the opacity has an effect.
+  ///
+  /// To show the source image instead, consider [srcIn].
+  ///
+  /// To reverse the semantic of the mask (only showing the source where the
+  /// destination is present, rather than where it is absent), consider [dstOut].
+  ///
+  /// This corresponds to the "Destination in Source" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_dstIn.png)
+  dstIn,
+
+  /// Show the source image, but only where the two images do not overlap. The
+  /// destination image is not rendered, it is treated merely as a mask. The color
+  /// channels of the destination are ignored, only the opacity has an effect.
+  ///
+  /// To show the destination image instead, consider [dstOut].
+  ///
+  /// To reverse the semantic of the mask (only showing the source where the
+  /// destination is present, rather than where it is absent), consider [srcIn].
+  ///
+  /// This corresponds to the "Source out Destination" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_srcOut.png)
+  srcOut,
+
+  /// Show the destination image, but only where the two images do not overlap. The
+  /// source image is not rendered, it is treated merely as a mask. The color
+  /// channels of the source are ignored, only the opacity has an effect.
+  ///
+  /// To show the source image instead, consider [srcOut].
+  ///
+  /// To reverse the semantic of the mask (only showing the destination where the
+  /// source is present, rather than where it is absent), consider [dstIn].
+  ///
+  /// This corresponds to the "Destination out Source" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_dstOut.png)
+  dstOut,
+
+  /// Composite the source image over the destination image, but only where it
+  /// overlaps the destination.
+  ///
+  /// This corresponds to the "Source atop Destination" Porter-Duff operator.
+  ///
+  /// This is essentially the [srcOver] operator, but with the output's opacity
+  /// channel being set to that of the destination image instead of being a
+  /// combination of both image's opacity channels.
+  ///
+  /// For a variant with the destination on top instead of the source, see
+  /// [dstATop].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_srcATop.png)
+  srcATop,
+
+  /// Composite the destination image over the source image, but only where it
+  /// overlaps the source.
+  ///
+  /// This corresponds to the "Destination atop Source" Porter-Duff operator.
+  ///
+  /// This is essentially the [dstOver] operator, but with the output's opacity
+  /// channel being set to that of the source image instead of being a
+  /// combination of both image's opacity channels.
+  ///
+  /// For a variant with the source on top instead of the destination, see
+  /// [srcATop].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_dstATop.png)
+  dstATop,
+
+  /// Apply a bitwise `xor` operator to the source and destination images. This
+  /// leaves transparency where they would overlap.
+  ///
+  /// This corresponds to the "Source xor Destination" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_xor.png)
+  xor,
+
+  /// Sum the components of the source and destination images.
+  ///
+  /// Transparency in a pixel of one of the images reduces the contribution of
+  /// that image to the corresponding output pixel, as if the color of that
+  /// pixel in that image was darker.
+  ///
+  /// This corresponds to the "Source plus Destination" Porter-Duff operator.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_plus.png)
+  plus,
+
+  /// Multiply the color components of the source and destination images.
+  ///
+  /// This can only result in the same or darker colors (multiplying by white,
+  /// 1.0, results in no change; multiplying by black, 0.0, results in black).
+  ///
+  /// When compositing two opaque images, this has similar effect to overlapping
+  /// two transparencies on a projector.
+  ///
+  /// For a variant that also multiplies the alpha channel, consider [multiply].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_modulate.png)
+  ///
+  /// See also:
+  ///
+  ///  * [screen], which does a similar computation but inverted.
+  ///  * [overlay], which combines [modulate] and [screen] to favor the
+  ///    destination image.
+  ///  * [hardLight], which combines [modulate] and [screen] to favor the
+  ///    source image.
+  modulate,
+
+  // Following blend modes are defined in the CSS Compositing standard.
+
+  /// Multiply the inverse of the components of the source and destination
+  /// images, and inverse the result.
+  ///
+  /// Inverting the components means that a fully saturated channel (opaque
+  /// white) is treated as the value 0.0, and values normally treated as 0.0
+  /// (black, transparent) are treated as 1.0.
+  ///
+  /// This is essentially the same as [modulate] blend mode, but with the values
+  /// of the colors inverted before the multiplication and the result being
+  /// inverted back before rendering.
+  ///
+  /// This can only result in the same or lighter colors (multiplying by black,
+  /// 1.0, results in no change; multiplying by white, 0.0, results in white).
+  /// Similarly, in the alpha channel, it can only result in more opaque colors.
+  ///
+  /// This has similar effect to two projectors displaying their images on the
+  /// same screen simultaneously.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_screen.png)
+  ///
+  /// See also:
+  ///
+  ///  * [modulate], which does a similar computation but without inverting the
+  ///    values.
+  ///  * [overlay], which combines [modulate] and [screen] to favor the
+  ///    destination image.
+  ///  * [hardLight], which combines [modulate] and [screen] to favor the
+  ///    source image.
+  screen, // The last coeff mode.
+
+  /// Multiply the components of the source and destination images after
+  /// adjusting them to favor the destination.
+  ///
+  /// Specifically, if the destination value is smaller, this multiplies it with
+  /// the source value, whereas is the source value is smaller, it multiplies
+  /// the inverse of the source value with the inverse of the destination value,
+  /// then inverts the result.
+  ///
+  /// Inverting the components means that a fully saturated channel (opaque
+  /// white) is treated as the value 0.0, and values normally treated as 0.0
+  /// (black, transparent) are treated as 1.0.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_overlay.png)
+  ///
+  /// See also:
+  ///
+  ///  * [modulate], which always multiplies the values.
+  ///  * [screen], which always multiplies the inverses of the values.
+  ///  * [hardLight], which is similar to [overlay] but favors the source image
+  ///    instead of the destination image.
+  overlay,
+
+  /// Composite the source and destination image by choosing the lowest value
+  /// from each color channel.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_darken.png)
+  darken,
+
+  /// Composite the source and destination image by choosing the highest value
+  /// from each color channel.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_lighten.png)
+  lighten,
+
+  /// Divide the destination by the inverse of the source.
+  ///
+  /// Inverting the components means that a fully saturated channel (opaque
+  /// white) is treated as the value 0.0, and values normally treated as 0.0
+  /// (black, transparent) are treated as 1.0.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_colorDodge.png)
+  colorDodge,
+
+  /// Divide the inverse of the destination by the the source, and inverse the result.
+  ///
+  /// Inverting the components means that a fully saturated channel (opaque
+  /// white) is treated as the value 0.0, and values normally treated as 0.0
+  /// (black, transparent) are treated as 1.0.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_colorBurn.png)
+  colorBurn,
+
+  /// Multiply the components of the source and destination images after
+  /// adjusting them to favor the source.
+  ///
+  /// Specifically, if the source value is smaller, this multiplies it with the
+  /// destination value, whereas is the destination value is smaller, it
+  /// multiplies the inverse of the destination value with the inverse of the
+  /// source value, then inverts the result.
+  ///
+  /// Inverting the components means that a fully saturated channel (opaque
+  /// white) is treated as the value 0.0, and values normally treated as 0.0
+  /// (black, transparent) are treated as 1.0.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_hardLight.png)
+  ///
+  /// See also:
+  ///
+  ///  * [modulate], which always multiplies the values.
+  ///  * [screen], which always multiplies the inverses of the values.
+  ///  * [overlay], which is similar to [hardLight] but favors the destination
+  ///    image instead of the source image.
+  hardLight,
+
+  /// Use [colorDodge] for source values below 0.5 and [colorBurn] for source
+  /// values above 0.5.
+  ///
+  /// This results in a similar but softer effect than [overlay].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_softLight.png)
+  ///
+  /// See also:
+  ///
+  ///  * [color], which is a more subtle tinting effect.
+  softLight,
+
+  /// Subtract the smaller value from the bigger value for each channel.
+  ///
+  /// Compositing black has no effect; compositing white inverts the colors of
+  /// the other image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver].
+  ///
+  /// The effect is similar to [exclusion] but harsher.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_difference.png)
+  difference,
+
+  /// Subtract double the product of the two images from the sum of the two
+  /// images.
+  ///
+  /// Compositing black has no effect; compositing white inverts the colors of
+  /// the other image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver].
+  ///
+  /// The effect is similar to [difference] but softer.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_exclusion.png)
+  exclusion,
+
+  /// Multiply the components of the source and destination images, including
+  /// the alpha channel.
+  ///
+  /// This can only result in the same or darker colors (multiplying by white,
+  /// 1.0, results in no change; multiplying by black, 0.0, results in black).
+  ///
+  /// Since the alpha channel is also multiplied, a fully-transparent pixel
+  /// (opacity 0.0) in one image results in a fully transparent pixel in the
+  /// output. This is similar to [dstIn], but with the colors combined.
+  ///
+  /// For a variant that multiplies the colors but does not multiply the alpha
+  /// channel, consider [modulate].
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_multiply.png)
+  multiply, // The last separable mode.
+
+  /// Take the hue of the source image, and the saturation and luminosity of the
+  /// destination image.
+  ///
+  /// The effect is to tint the destination image with the source image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver]. Regions that are entirely transparent in the source image take
+  /// their hue from the destination.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_hue.png)
+  ///
+  /// See also:
+  ///
+  ///  * [color], which is a similar but stronger effect as it also applies the
+  ///    saturation of the source image.
+  ///  * [HSVColor], which allows colors to be expressed using Hue rather than
+  ///    the red/green/blue channels of [Color].
+  hue,
+
+  /// Take the saturation of the source image, and the hue and luminosity of the
+  /// destination image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver]. Regions that are entirely transparent in the source image take
+  /// their saturation from the destination.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_hue.png)
+  ///
+  /// See also:
+  ///
+  ///  * [color], which also applies the hue of the source image.
+  ///  * [luminosity], which applies the luminosity of the source image to the
+  ///    destination.
+  saturation,
+
+  /// Take the hue and saturation of the source image, and the luminosity of the
+  /// destination image.
+  ///
+  /// The effect is to tint the destination image with the source image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver]. Regions that are entirely transparent in the source image take
+  /// their hue and saturation from the destination.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_color.png)
+  ///
+  /// See also:
+  ///
+  ///  * [hue], which is a similar but weaker effect.
+  ///  * [softLight], which is a similar tinting effect but also tints white.
+  ///  * [saturation], which only applies the saturation of the source image.
+  color,
+
+  /// Take the luminosity of the source image, and the hue and saturation of the
+  /// destination image.
+  ///
+  /// The opacity of the output image is computed in the same way as for
+  /// [srcOver]. Regions that are entirely transparent in the source image take
+  /// their luminosity from the destination.
+  ///
+  /// ![](https://flutter.github.io/assets-for-api-docs/assets/dart-ui/blend_mode_luminosity.png)
+  ///
+  /// See also:
+  ///
+  ///  * [saturation], which applies the saturation of the source image to the
+  ///    destination.
+  ///  * [ImageFilter.blur], which can be used with [BackdropFilter] for a
+  ///    related effect.
+  luminosity,
+}
diff --git a/pkg/analysis_server/test/mock_packages/ui/lib/text.dart b/pkg/analysis_server/test/mock_packages/ui/lib/text.dart
new file mode 100644
index 0000000..8511b01
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/ui/lib/text.dart
@@ -0,0 +1,131 @@
+// Copyright 2013 The Flutter Authors. 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.ui;
+
+/// Whether to slant the glyphs in the font
+enum FontStyle {
+  /// Use the upright glyphs
+  normal,
+
+  /// Use glyphs designed for slanting
+  italic,
+}
+
+/// The thickness of the glyphs used to draw the text
+class FontWeight {
+  /// Thin, the least thick
+  static const FontWeight w100 = const FontWeight._(0);
+
+  /// Extra-light
+  static const FontWeight w200 = const FontWeight._(1);
+
+  /// Light
+  static const FontWeight w300 = const FontWeight._(2);
+
+  /// Normal / regular / plain
+  static const FontWeight w400 = const FontWeight._(3);
+
+  /// Medium
+  static const FontWeight w500 = const FontWeight._(4);
+
+  /// Semi-bold
+  static const FontWeight w600 = const FontWeight._(5);
+
+  /// Bold
+  static const FontWeight w700 = const FontWeight._(6);
+
+  /// Extra-bold
+  static const FontWeight w800 = const FontWeight._(7);
+
+  /// Black, the most thick
+  static const FontWeight w900 = const FontWeight._(8);
+
+  /// The default font weight.
+  static const FontWeight normal = w400;
+
+  /// A commonly used font weight that is heavier than normal.
+  static const FontWeight bold = w700;
+
+  /// A list of all the font weights.
+  static const List<FontWeight> values = const <FontWeight>[
+    w100,
+    w200,
+    w300,
+    w400,
+    w500,
+    w600,
+    w700,
+    w800,
+    w900
+  ];
+
+  /// The encoded integer value of this font weight.
+  final int index;
+
+  const FontWeight._(this.index);
+
+  @override
+  String toString() {
+    return const <int, String>{
+      0: 'FontWeight.w100',
+      1: 'FontWeight.w200',
+      2: 'FontWeight.w300',
+      3: 'FontWeight.w400',
+      4: 'FontWeight.w500',
+      5: 'FontWeight.w600',
+      6: 'FontWeight.w700',
+      7: 'FontWeight.w800',
+      8: 'FontWeight.w900',
+    }[index];
+  }
+}
+
+enum TextAlign {
+  /// Align the text on the left edge of the container.
+  left,
+
+  /// Align the text on the right edge of the container.
+  right,
+
+  /// Align the text in the center of the container.
+  center,
+
+  /// Stretch lines of text that end with a soft line break to fill the width of
+  /// the container.
+  ///
+  /// Lines that end with hard line breaks are aligned towards the [start] edge.
+  justify,
+
+  /// Align the text on the leading edge of the container.
+  ///
+  /// For left-to-right text ([TextDirection.ltr]), this is the left edge.
+  ///
+  /// For right-to-left text ([TextDirection.rtl]), this is the right edge.
+  start,
+
+  /// Align the text on the trailing edge of the container.
+  ///
+  /// For left-to-right text ([TextDirection.ltr]), this is the right edge.
+  ///
+  /// For right-to-left text ([TextDirection.rtl]), this is the left edge.
+  end,
+}
+
+/// A horizontal line used for aligning text.
+enum TextBaseline {
+  /// The horizontal line used to align the bottom of glyphs for alphabetic characters.
+  alphabetic,
+
+  /// The horizontal line used to align ideographic characters.
+  ideographic,
+}
+
+enum TextDirection {
+  /// The text flows from right to left (e.g. Arabic, Hebrew).
+  rtl,
+
+  /// The text flows from left to right (e.g., English, French).
+  ltr,
+}
diff --git a/pkg/analysis_server/test/mock_packages/ui/lib/ui.dart b/pkg/analysis_server/test/mock_packages/ui/lib/ui.dart
new file mode 100644
index 0000000..05910ae
--- /dev/null
+++ b/pkg/analysis_server/test/mock_packages/ui/lib/ui.dart
@@ -0,0 +1,9 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+library dart.ui;
+
+part 'geometry.dart';
+part 'painting.dart';
+part 'text.dart';
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index 6daf2ec..4756c84 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -227,7 +227,7 @@
     _closed = true;
   }
 
-  void expectMsgCount({responseCount: 0, notificationCount: 0}) {
+  void expectMsgCount({responseCount = 0, notificationCount = 0}) {
     expect(responsesReceived, hasLength(responseCount));
     expect(notificationsReceived, hasLength(notificationCount));
   }
diff --git a/pkg/analysis_server/test/protocol_server_test.dart b/pkg/analysis_server/test/protocol_server_test.dart
index b2e9543..e3c256c 100644
--- a/pkg/analysis_server/test/protocol_server_test.dart
+++ b/pkg/analysis_server/test/protocol_server_test.dart
@@ -7,12 +7,16 @@
 import 'package:analysis_server/src/protocol_server.dart'
     hide DiagnosticMessage;
 import 'package:analysis_server/src/services/search/search_engine.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/dart/ast/ast.dart' as engine;
 import 'package:analyzer/dart/element/element.dart' as engine;
 import 'package:analyzer/dart/element/type.dart' as engine;
 import 'package:analyzer/diagnostic/diagnostic.dart';
 import 'package:analyzer/error/error.dart' as engine;
+import 'package:analyzer/src/dart/analysis/results.dart' as engine;
 import 'package:analyzer/src/dart/error/lint_codes.dart';
+import 'package:analyzer/src/diagnostic/diagnostic.dart' as engine;
 import 'package:analyzer/src/error/codes.dart' as engine;
 import 'package:analyzer/src/generated/source.dart' as engine;
 import 'package:test/test.dart';
@@ -31,17 +35,19 @@
 @reflectiveTest
 class AnalysisErrorTest {
   MockSource source = new MockSource();
-  engine.LineInfo lineInfo;
   MockAnalysisError engineError;
+  ResolvedUnitResult result;
 
   void setUp() {
     // prepare Source
     source.fullName = 'foo.dart';
-    // prepare LineInfo
-    lineInfo = new engine.LineInfo([0, 5, 9, 20]);
     // prepare AnalysisError
     engineError = new MockAnalysisError(source,
         engine.CompileTimeErrorCode.AMBIGUOUS_EXPORT, 10, 20, 'my message');
+    // prepare ResolvedUnitResult
+    engine.LineInfo lineInfo = new engine.LineInfo([0, 5, 9, 20]);
+    result = new engine.ResolvedUnitResultImpl(null, 'foo.dart', null, true,
+        null, lineInfo, false, null, [engineError]);
   }
 
   void tearDown() {
@@ -49,9 +55,47 @@
     engineError = null;
   }
 
+  void test_fromEngine_hasContextMessage() {
+    engineError.contextMessages.add(engine.DiagnosticMessageImpl(
+        filePath: 'bar.dart', offset: 30, length: 5, message: 'context'));
+    MockAnalysisSession session = new MockAnalysisSession();
+    session.addFileResult(new engine.FileResultImpl(
+        session, 'bar.dart', null, new engine.LineInfo([0, 5, 9, 20]), false));
+    AnalysisError error = newAnalysisError_fromEngine(
+        new engine.ResolvedUnitResultImpl(session, 'foo.dart', null, true, null,
+            new engine.LineInfo([0, 5, 9, 20]), false, null, [engineError]),
+        engineError);
+    expect(error.toJson(), {
+      'severity': 'ERROR',
+      'type': 'COMPILE_TIME_ERROR',
+      'location': {
+        'file': 'foo.dart',
+        'offset': 10,
+        'length': 20,
+        'startLine': 3,
+        'startColumn': 2
+      },
+      'message': 'my message',
+      'code': 'ambiguous_export',
+      'contextMessages': [
+        {
+          'message': 'context',
+          'location': {
+            'file': 'bar.dart',
+            'offset': 30,
+            'length': 5,
+            'startLine': 4,
+            'startColumn': 11
+          }
+        }
+      ],
+      'hasFix': false
+    });
+  }
+
   void test_fromEngine_hasCorrection() {
     engineError.correction = 'my correction';
-    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    AnalysisError error = newAnalysisError_fromEngine(result, engineError);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -76,7 +120,7 @@
         10,
         20,
         'my message');
-    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    AnalysisError error = newAnalysisError_fromEngine(result, engineError);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -101,7 +145,7 @@
         10,
         20,
         'my message');
-    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    AnalysisError error = newAnalysisError_fromEngine(result, engineError);
     expect(error.toJson(), {
       SEVERITY: 'INFO',
       TYPE: 'LINT',
@@ -121,7 +165,7 @@
 
   void test_fromEngine_noCorrection() {
     engineError.correction = null;
-    AnalysisError error = newAnalysisError_fromEngine(lineInfo, engineError);
+    AnalysisError error = newAnalysisError_fromEngine(result, engineError);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -140,7 +184,10 @@
 
   void test_fromEngine_noLineInfo() {
     engineError.correction = null;
-    AnalysisError error = newAnalysisError_fromEngine(null, engineError);
+    AnalysisError error = newAnalysisError_fromEngine(
+        new engine.ResolvedUnitResultImpl(null, 'foo.dart', null, true, null,
+            null, false, null, [engineError]),
+        engineError);
     expect(error.toJson(), {
       SEVERITY: 'ERROR',
       TYPE: 'COMPILE_TIME_ERROR',
@@ -211,7 +258,7 @@
    * the given key results in the given value.
    */
   void run(ApiEnum convert(EngineEnum value),
-      {Map<EngineEnum, ApiEnum> exceptions: const {}}) {
+      {Map<EngineEnum, ApiEnum> exceptions = const {}}) {
     ClassMirror engineClass = reflectClass(EngineEnum);
     engineClass.staticMembers.forEach((Symbol symbol, MethodMirror method) {
       if (symbol == #values) {
@@ -261,13 +308,13 @@
   @override
   int length;
 
+  @override
+  List<DiagnosticMessage> contextMessages = <DiagnosticMessage>[];
+
   MockAnalysisError(
       this.source, this.errorCode, this.offset, this.length, this.message);
 
   @override
-  List<DiagnosticMessage> get contextMessages => null;
-
-  @override
   String get correctionMessage => null;
 
   @override
@@ -277,6 +324,19 @@
   Severity get severity => null;
 }
 
+class MockAnalysisSession implements AnalysisSession {
+  Map<String, FileResult> fileResults = {};
+
+  void addFileResult(FileResult result) {
+    fileResults[result.path] = result;
+  }
+
+  @override
+  FileResult getFile(String path) => fileResults[path];
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
 class MockErrorCode implements engine.ErrorCode {
   @override
   engine.ErrorType type;
@@ -291,9 +351,9 @@
   String url;
 
   MockErrorCode(
-      {this.type: engine.ErrorType.COMPILE_TIME_ERROR,
-      this.errorSeverity: engine.ErrorSeverity.ERROR,
-      this.name: 'TEST_ERROR',
+      {this.type = engine.ErrorType.COMPILE_TIME_ERROR,
+      this.errorSeverity = engine.ErrorSeverity.ERROR,
+      this.name = 'TEST_ERROR',
       this.url});
 
   @override
diff --git a/pkg/analysis_server/test/search/element_references_test.dart b/pkg/analysis_server/test/search/element_references_test.dart
index ff75b70..3e88bcd 100644
--- a/pkg/analysis_server/test/search/element_references_test.dart
+++ b/pkg/analysis_server/test/search/element_references_test.dart
@@ -41,7 +41,6 @@
     if (searchId != null) {
       await waitForSearchResults();
     }
-    expect(serverErrors, isEmpty);
   }
 
   Future<void> test_constructor_named() async {
diff --git a/pkg/analysis_server/test/search/type_hierarchy_test.dart b/pkg/analysis_server/test/search/type_hierarchy_test.dart
index 3461a4f..25f46c8 100644
--- a/pkg/analysis_server/test/search/type_hierarchy_test.dart
+++ b/pkg/analysis_server/test/search/type_hierarchy_test.dart
@@ -1097,7 +1097,6 @@
     Request request =
         _createGetTypeHierarchyRequest(search, superOnly: superOnly);
     Response response = await serverChannel.sendRequest(request);
-    expect(serverErrors, isEmpty);
     return new SearchGetTypeHierarchyResult.fromResponse(response)
         .hierarchyItems;
   }
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 dd6b22f..2fa618c 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
@@ -32,7 +32,7 @@
    * the given [completion], [selectionOffset] and [selectionLength].
    */
   void assertSuggestArgumentAndCompletion(String name,
-      {String completion, int selectionOffset, int selectionLength: 0}) {
+      {String completion, int selectionOffset, int selectionLength = 0}) {
     CompletionSuggestion suggestion =
         suggestions.firstWhere((s) => s.parameterName == name);
     expect(suggestion, isNotNull);
@@ -77,9 +77,9 @@
    */
   void assertSuggestArgumentsAndTypes(
       {Map<String, String> namedArgumentsWithTypes,
-      List<int> requiredParamIndices: const <int>[],
-      bool includeColon: true,
-      bool includeComma: false}) {
+      List<int> requiredParamIndices = const <int>[],
+      bool includeColon = true,
+      bool includeComma = false}) {
     List<CompletionSuggestion> expected = new List<CompletionSuggestion>();
     int paramIndex = 0;
     namedArgumentsWithTypes.forEach((String name, String type) {
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 e7047ba..9fbe977 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
@@ -75,9 +75,9 @@
     expect(suggestion.hasNamedParameters, isNotNull);
   }
 
-  void assertNoSuggestions({CompletionSuggestionKind kind: null}) {
+  void assertNoSuggestions({CompletionSuggestionKind kind = null}) {
     if (kind == null) {
-      if (suggestions.length > 0) {
+      if (suggestions.isNotEmpty) {
         failedCompletion('Expected no suggestions', suggestions);
       }
       return;
@@ -100,17 +100,17 @@
   }
 
   CompletionSuggestion assertSuggest(String completion,
-      {CompletionSuggestionKind csKind: CompletionSuggestionKind.INVOCATION,
-      int relevance: DART_RELEVANCE_DEFAULT,
-      ElementKind elemKind: null,
-      bool isDeprecated: false,
-      bool isPotential: false,
+      {CompletionSuggestionKind csKind = CompletionSuggestionKind.INVOCATION,
+      int relevance = DART_RELEVANCE_DEFAULT,
+      ElementKind elemKind = null,
+      bool isDeprecated = false,
+      bool isPotential = false,
       String elemFile,
       int elemOffset,
       int selectionOffset,
       String paramName,
       String paramType,
-      String defaultArgListString: _UNCHECKED,
+      String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs =
         getSuggest(completion: completion, csKind: csKind, elemKind: elemKind);
@@ -157,9 +157,9 @@
   }
 
   CompletionSuggestion assertSuggestClass(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false,
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false,
       String elemFile,
       String elemName,
       int elemOffset}) {
@@ -181,8 +181,8 @@
   }
 
   CompletionSuggestion assertSuggestClassTypeAlias(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
     Element element = cs.element;
@@ -196,10 +196,10 @@
   }
 
   CompletionSuggestion assertSuggestConstructor(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
+      {int relevance = DART_RELEVANCE_DEFAULT,
       String elementName,
       int elemOffset,
-      String defaultArgListString: _UNCHECKED,
+      String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         relevance: relevance,
@@ -217,7 +217,7 @@
   }
 
   CompletionSuggestion assertSuggestEnum(String completion,
-      {bool isDeprecated: false}) {
+      {bool isDeprecated = false}) {
     CompletionSuggestion suggestion =
         assertSuggest(completion, isDeprecated: isDeprecated);
     expect(suggestion.isDeprecated, isDeprecated);
@@ -226,9 +226,9 @@
   }
 
   CompletionSuggestion assertSuggestEnumConst(String completion,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      bool isDeprecated: false,
-      bool hasTypeBoost: false}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      bool isDeprecated = false,
+      bool hasTypeBoost = false}) {
     if (hasTypeBoost) {
       relevance += DART_RELEVANCE_BOOST_TYPE;
     }
@@ -241,9 +241,9 @@
   }
 
   CompletionSuggestion assertSuggestField(String name, String type,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
@@ -263,10 +263,10 @@
   }
 
   CompletionSuggestion assertSuggestFunction(String name, String returnType,
-      {CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false,
-      int relevance: DART_RELEVANCE_DEFAULT,
-      String defaultArgListString: _UNCHECKED,
+      {CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false,
+      int relevance = DART_RELEVANCE_DEFAULT,
+      String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
@@ -300,9 +300,9 @@
   CompletionSuggestion assertSuggestFunctionTypeAlias(
     String name,
     String returnType, {
-    bool isDeprecated: false,
-    int relevance: DART_RELEVANCE_DEFAULT,
-    CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+    bool isDeprecated = false,
+    int relevance = DART_RELEVANCE_DEFAULT,
+    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
@@ -331,9 +331,9 @@
   }
 
   CompletionSuggestion assertSuggestGetter(String name, String returnType,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
         relevance: relevance,
@@ -353,10 +353,10 @@
 
   CompletionSuggestion assertSuggestMethod(
       String name, String declaringType, String returnType,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false,
-      String defaultArgListString: _UNCHECKED,
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false,
+      String defaultArgListString = _UNCHECKED,
       List<int> defaultArgumentListTextRanges}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind,
@@ -380,9 +380,9 @@
   }
 
   CompletionSuggestion assertSuggestMixin(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
-      bool isDeprecated: false,
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
+      bool isDeprecated = false,
       String elemFile,
       String elemName,
       int elemOffset}) {
@@ -404,9 +404,9 @@
   }
 
   CompletionSuggestion assertSuggestName(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.IDENTIFIER,
-      bool isDeprecated: false}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER,
+      bool isDeprecated = false}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind, relevance: relevance, isDeprecated: isDeprecated);
     expect(cs.completion, equals(name));
@@ -416,8 +416,8 @@
   }
 
   CompletionSuggestion assertSuggestSetter(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: kind, relevance: relevance, elemKind: ElementKind.SETTER);
     Element element = cs.element;
@@ -437,8 +437,8 @@
   CompletionSuggestion assertSuggestTopLevelVar(
     String name,
     String returnType, {
-    int relevance: DART_RELEVANCE_DEFAULT,
-    CompletionSuggestionKind kind: CompletionSuggestionKind.INVOCATION,
+    int relevance = DART_RELEVANCE_DEFAULT,
+    CompletionSuggestionKind kind = CompletionSuggestionKind.INVOCATION,
   }) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
@@ -495,9 +495,9 @@
   }
 
   CompletionSuggestion getSuggest(
-      {String completion: null,
-      CompletionSuggestionKind csKind: null,
-      ElementKind elemKind: null}) {
+      {String completion = null,
+      CompletionSuggestionKind csKind = null,
+      ElementKind elemKind = null}) {
     CompletionSuggestion cs;
     if (suggestions != null) {
       suggestions.forEach((CompletionSuggestion s) {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_ranking_internal_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_ranking_internal_test.dart
new file mode 100644
index 0000000..1e1e041
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/completion_ranking_internal_test.dart
@@ -0,0 +1,202 @@
+// 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:analysis_server/src/provisional/completion/dart/completion_dart.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_ranking_internal.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer_plugin/src/utilities/completion/completion_target.dart';
+import 'package:mockito/mockito.dart';
+import 'package:test/test.dart';
+
+class MockCompletionRequest extends Mock implements DartCompletionRequest {}
+
+class MockCompletionTarget extends Mock implements CompletionTarget {}
+
+class MockAstNode extends Mock implements AstNode {}
+
+class MockToken extends Mock implements Token {}
+
+void main() {
+  group('getCursorToken', () {
+    MockCompletionRequest request;
+    MockCompletionTarget target;
+
+    setUp(() {
+      request = MockCompletionRequest();
+      target = MockCompletionTarget();
+      when(request.target).thenReturn(target);
+    });
+
+    test('areCompletionsEquivalent exact match', () {
+      expect(areCompletionsEquivalent('foo', 'foo'), equals(true));
+    });
+
+    test('areCompletionsEquivalent function call', () {
+      expect(areCompletionsEquivalent('foo()', 'foo'), equals(true));
+    });
+
+    test('areCompletionsEquivalent field name', () {
+      expect(areCompletionsEquivalent('foo: ,', 'foo'), equals(true));
+    });
+
+    test('areCompletionsEquivalent different name', () {
+      expect(areCompletionsEquivalent('foo', 'fooBar'), equals(false));
+    });
+
+    test('areCompletionsEquivalent method invocation', () {
+      expect(areCompletionsEquivalent('foo.bar()', 'foo'), equals(false));
+    });
+
+    test('getCursorToken AstNode', () {
+      final node = MockAstNode();
+      final token = MockToken();
+      when(target.entity).thenReturn(node);
+      when(node.endToken).thenReturn(token);
+      expect(getCursorToken(request), equals(token));
+    });
+
+    test('getCursorToken Token', () {
+      final token = MockToken();
+      when(target.entity).thenReturn(token);
+      expect(getCursorToken(request), equals(token));
+    });
+
+    test('getCursorToken null', () {
+      when(target.entity).thenReturn(null);
+      expect(getCursorToken(request), equals(null));
+    });
+  });
+
+  test('isStopToken null', () {
+    expect(isStopToken(null, 5), equals(true));
+  });
+
+  test('isStopToken synthetic', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(true);
+    when(token.isEof).thenReturn(false);
+    expect(isStopToken(token, 5), equals(false));
+  });
+
+  test('isStopToken punctuation', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(false);
+    when(token.offset).thenReturn(4);
+    when(token.length).thenReturn(1);
+    when(token.lexeme).thenReturn(')');
+    expect(isStopToken(token, 5), equals(false));
+  });
+
+  test('isStopToken alphabetic', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(false);
+    when(token.offset).thenReturn(2);
+    when(token.length).thenReturn(3);
+    when(token.lexeme).thenReturn('foo');
+    expect(isStopToken(token, 5), equals(true));
+  });
+
+  test('isStringLiteral null', () {
+    expect(isStringLiteral(null), equals(false));
+  });
+
+  test('isStringLiteral empty string', () {
+    expect(isStringLiteral(''), equals(false));
+  });
+
+  test('isStringLiteral basic', () {
+    expect(isStringLiteral("'foo'"), equals(true));
+  });
+
+  test('isStringLiteral raw', () {
+    expect(isStringLiteral("r'foo'"), equals(true));
+  });
+
+  test('isLiteral string', () {
+    expect(isLiteral("'foo'"), equals(true));
+  });
+
+  test('isLiteral numeric', () {
+    expect(isLiteral('12345'), equals(true));
+  });
+
+  test('isLiteral not literal', () {
+    expect(isLiteral('foo'), equals(false));
+  });
+
+  test('isTokenDot dot', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(false);
+    when(token.lexeme).thenReturn('.');
+    expect(isTokenDot(token), equals(true));
+  });
+
+  test('isTokenDot not dot', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(false);
+    when(token.lexeme).thenReturn('foo');
+    expect(isTokenDot(token), equals(false));
+  });
+
+  test('isTokenDot synthetic', () {
+    final token = MockToken();
+    when(token.isSynthetic).thenReturn(true);
+    expect(isTokenDot(token), false);
+  });
+
+  test('getCurrentToken', () {
+    final one = MockToken();
+    final two = MockToken();
+    final three = MockToken();
+    when(three.previous).thenReturn(two);
+    when(two.previous).thenReturn(one);
+    final request = MockCompletionRequest();
+    final target = MockCompletionTarget();
+    when(request.offset).thenReturn(2);
+    when(request.target).thenReturn(target);
+    when(target.entity).thenReturn(three);
+    when(two.isSynthetic).thenReturn(true);
+    when(two.isEof).thenReturn(false);
+    when(one.isSynthetic).thenReturn(false);
+    when(one.offset).thenReturn(1);
+    when(one.length).thenReturn(3);
+    when(one.lexeme).thenReturn('foo');
+    expect(getCurrentToken(request), equals(one));
+  });
+
+  test('constructQuery', () {
+    final start = MockToken();
+    when(start.isSynthetic).thenReturn(true);
+    when(start.isEof).thenReturn(true);
+    final one = MockToken();
+    when(one.lexeme).thenReturn('class');
+    when(one.offset).thenReturn(0);
+    when(one.length).thenReturn(5);
+    when(one.isSynthetic).thenReturn(false);
+    when(one.isEof).thenReturn(false);
+    when(one.type).thenReturn(Keyword.CLASS);
+    final two = MockToken();
+    when(two.lexeme).thenReturn('Animal');
+    when(two.offset).thenReturn(6);
+    when(two.length).thenReturn(6);
+    when(two.isSynthetic).thenReturn(false);
+    when(one.previous).thenReturn(start);
+    when(two.previous).thenReturn(one);
+    when(two.type).thenReturn(TokenType.IDENTIFIER);
+    when(two.isEof).thenReturn(false);
+    final request = MockCompletionRequest();
+    final target = MockCompletionTarget();
+    when(request.offset).thenReturn(13);
+    when(request.target).thenReturn(target);
+    when(target.entity).thenReturn(two);
+    expect(constructQuery(request, 100), equals(['class', 'Animal']));
+  });
+
+  test('elementNameFromRelevanceTag', () {
+    final tag =
+        'package::flutter/src/widgets/preferred_size.dart::::PreferredSizeWidget';
+    expect(elementNameFromRelevanceTag(tag), equals('PreferredSizeWidget'));
+  });
+}
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart b/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart
new file mode 100644
index 0000000..ec65acd
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/completion_ranking_test.dart
@@ -0,0 +1,35 @@
+// 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';
+
+import 'package:analysis_server/src/services/completion/dart/completion_ranking.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+void main() {
+  CompletionRanking ranking;
+
+  setUp(() async {
+    ranking = CompletionRanking(directory);
+    await ranking.start();
+  });
+
+  test('make request to isolate', () async {
+    final tokens =
+        tokenize('if (list == null) { return; } for (final i = 0; i < list.');
+    final response = await ranking.makeRequest('predict', tokens);
+    expect(response['data']['length'], greaterThan(0.95));
+  });
+}
+
+final directory = path.join(File.fromUri(Platform.script).parent.path, '..',
+    '..', '..', '..', 'language_model', 'lexeme');
+
+/// Tokenizes the input string.
+///
+/// The input is split by word boundaries and trimmed of whitespace.
+List<String> tokenize(String input) =>
+    input.split(RegExp(r'\b|\s')).map((t) => t.trim()).toList()
+      ..removeWhere((t) => t.isEmpty);
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 0bd591f..b4d1d0c 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -15,6 +15,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(KeywordContributorTest);
+    defineReflectiveTests(KeywordContributorWithExtensionMethodsTest);
     defineReflectiveTests(KeywordContributorWithNnbdTest);
   });
 }
@@ -236,8 +237,8 @@
       [Keyword.CONST, Keyword.COVARIANT, Keyword.FINAL];
 
   void assertSuggestKeywords(Iterable<Keyword> expectedKeywords,
-      {List<String> pseudoKeywords: NO_PSEUDO_KEYWORDS,
-      int relevance: DART_RELEVANCE_KEYWORD}) {
+      {List<String> pseudoKeywords = NO_PSEUDO_KEYWORDS,
+      int relevance = DART_RELEVANCE_KEYWORD}) {
     Set<String> expectedCompletions = new Set<String>();
     Map<String, int> expectedOffsets = <String, int>{};
     Set<String> actualCompletions = new Set<String>();
@@ -2025,6 +2026,96 @@
 }
 
 @reflectiveTest
+class KeywordContributorWithExtensionMethodsTest
+    extends KeywordContributorTest {
+  @override
+  List<Keyword> get declarationKeywords =>
+      super.declarationKeywords..add(Keyword.EXTENSION);
+
+  @override
+  List<Keyword> get directiveAndDeclarationKeywords =>
+      super.directiveAndDeclarationKeywords..add(Keyword.EXTENSION);
+
+  @override
+  List<Keyword> get directiveDeclarationKeywords =>
+      super.directiveDeclarationKeywords..add(Keyword.EXTENSION);
+
+  List<Keyword> get extensionBodyKeywords => [
+        Keyword.CONST,
+        Keyword.DYNAMIC,
+        Keyword.FINAL,
+        Keyword.GET,
+        Keyword.OPERATOR,
+        Keyword.SET,
+        Keyword.STATIC,
+        Keyword.VAR,
+        Keyword.VOID
+      ];
+
+  @override
+  void setupResourceProvider() {
+    super.setupResourceProvider();
+    createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
+  }
+
+  test_class_body_empty() async {
+    addTestSource('extension E on int {^}');
+    await computeSuggestions();
+    assertSuggestKeywords(extensionBodyKeywords);
+  }
+
+  test_extension_body_beginning() async {
+    addTestSource('extension E on int {^ foo() {}}');
+    await computeSuggestions();
+    assertSuggestKeywords(extensionBodyKeywords);
+  }
+
+  test_extension_body_between() async {
+    addTestSource('extension E on int {foo() {} ^ void bar() {}}');
+    await computeSuggestions();
+    assertSuggestKeywords(extensionBodyKeywords);
+  }
+
+  test_extension_body_end() async {
+    addTestSource('extension E on int {foo() {} ^}');
+    await computeSuggestions();
+    assertSuggestKeywords(extensionBodyKeywords);
+  }
+
+  test_extension_member_const_afterStatic() async {
+    addTestSource('''
+extension E on int {
+  static c^
+}
+''');
+    await computeSuggestions();
+    assertSuggestKeywords(staticMember);
+  }
+
+  test_extension_member_final_afterStatic() async {
+    addTestSource('''
+extension E on int {
+  static f^
+}
+''');
+    await computeSuggestions();
+    assertSuggestKeywords(staticMember);
+  }
+
+  test_extension_noBody_named() async {
+    addTestSource('extension E ^');
+    await computeSuggestions();
+    assertSuggestKeywords([Keyword.ON], relevance: DART_RELEVANCE_HIGH);
+  }
+
+  test_extension_noBody_unnamed() async {
+    addTestSource('extension ^');
+    await computeSuggestions();
+    assertSuggestKeywords([Keyword.ON], relevance: DART_RELEVANCE_HIGH);
+  }
+}
+
+@reflectiveTest
 class KeywordContributorWithNnbdTest extends KeywordContributorTest {
   @override
   List<Keyword> get classBodyKeywords =>
diff --git a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
index 01dd324..7a04534 100644
--- a/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/label_contributor_test.dart
@@ -19,8 +19,8 @@
 @reflectiveTest
 class LabelContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestLabel(String name,
-      {int relevance: DART_RELEVANCE_DEFAULT,
-      CompletionSuggestionKind kind: CompletionSuggestionKind.IDENTIFIER}) {
+      {int relevance = DART_RELEVANCE_DEFAULT,
+      CompletionSuggestionKind kind = CompletionSuggestionKind.IDENTIFIER}) {
     CompletionSuggestion cs =
         assertSuggest(name, csKind: kind, relevance: relevance);
     expect(cs.returnType, isNull);
diff --git a/pkg/analysis_server/test/services/completion/dart/language_model_test.dart b/pkg/analysis_server/test/services/completion/dart/language_model_test.dart
new file mode 100644
index 0000000..32a09a8
--- /dev/null
+++ b/pkg/analysis_server/test/services/completion/dart/language_model_test.dart
@@ -0,0 +1,76 @@
+// 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:ffi';
+import 'dart:io';
+
+import 'package:analysis_server/src/services/completion/dart/language_model.dart';
+import 'package:path/path.dart' as path;
+import 'package:test/test.dart';
+
+final directory = path.join(File.fromUri(Platform.script).parent.path, '..',
+    '..', '..', '..', 'language_model', 'lexeme');
+const expectedLookback = 100;
+
+void main() {
+  if (sizeOf<IntPtr>() == 4) {
+    // We don't yet support running tflite on 32-bit systems.
+    return;
+  }
+
+  LanguageModel model;
+
+  setUp(() {
+    model = LanguageModel.load(directory);
+  });
+
+  tearDown(() {
+    model.close();
+  });
+
+  test('calculates lookback', () {
+    expect(model.lookback, expectedLookback);
+  });
+
+  test('predict with defaults', () {
+    final tokens =
+        tokenize('if (list == null) { return; } for (final i = 0; i < list.');
+    final suggestions = model.predict(tokens);
+    expect(suggestions, hasLength(model.completions));
+    expect(suggestions.first, 'length');
+  });
+
+  test('predict with confidence scores', () {
+    final tokens =
+        tokenize('if (list == null) { return; } for (final i = 0; i < list.');
+    final suggestions = model.predictWithScores(tokens);
+    final best = suggestions.entries.first;
+    expect(best.key, 'length');
+    expect(best.value, greaterThan(0.8));
+  });
+
+  test('predict when no previous tokens', () {
+    final tokens = <String>[];
+    final suggestions = model.predict(tokens);
+    expect(suggestions, hasLength(model.completions));
+    expect(suggestions.first, isNotEmpty);
+  });
+
+  test('load fail', () {
+    try {
+      LanguageModel.load('doesnotexist');
+      fail('Failure to load language model should throw an exception');
+    } catch (e) {
+      expect(
+          e.toString(), equals('Invalid argument(s): Unable to create model.'));
+    }
+  });
+}
+
+/// Tokenizes the input string.
+///
+/// The input is split by word boundaries and trimmed of whitespace.
+List<String> tokenize(String input) =>
+    input.split(RegExp(r'\b|\s')).map((t) => t.trim()).toList()
+      ..removeWhere((t) => t.isEmpty);
diff --git a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
index 237946b..5ab5ca8 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_constructor_contributor_test.dart
@@ -20,7 +20,7 @@
 class LocalConstructorContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestLocalVariable(
       String name, String returnType,
-      {int relevance: DART_RELEVANCE_LOCAL_VARIABLE}) {
+      {int relevance = DART_RELEVANCE_LOCAL_VARIABLE}) {
     // Local variables should only be suggested by LocalReferenceContributor
     CompletionSuggestion cs = assertSuggest(name,
         csKind: CompletionSuggestionKind.INVOCATION, relevance: relevance);
@@ -36,7 +36,7 @@
   }
 
   CompletionSuggestion assertSuggestParameter(String name, String returnType,
-      {int relevance: DART_RELEVANCE_PARAMETER}) {
+      {int relevance = DART_RELEVANCE_PARAMETER}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: CompletionSuggestionKind.INVOCATION, relevance: relevance);
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
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 b726924..3cd1ed2 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
@@ -20,9 +20,9 @@
 class LocalReferenceContributorTest extends DartCompletionContributorTest {
   CompletionSuggestion assertSuggestLocalVariable(
       String name, String returnType,
-      {int relevance: DART_RELEVANCE_LOCAL_VARIABLE,
-      bool hasTypeBoost: false,
-      bool hasSubtypeBoost: false}) {
+      {int relevance = DART_RELEVANCE_LOCAL_VARIABLE,
+      bool hasTypeBoost = false,
+      bool hasSubtypeBoost = false}) {
     if (hasTypeBoost) {
       relevance += DART_RELEVANCE_BOOST_TYPE;
     } else if (hasSubtypeBoost) {
@@ -43,7 +43,7 @@
   }
 
   CompletionSuggestion assertSuggestParameter(String name, String returnType,
-      {int relevance: DART_RELEVANCE_PARAMETER}) {
+      {int relevance = DART_RELEVANCE_PARAMETER}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: CompletionSuggestionKind.INVOCATION, relevance: relevance);
     expect(cs.returnType, returnType != null ? returnType : 'dynamic');
@@ -58,7 +58,7 @@
   }
 
   CompletionSuggestion assertSuggestTypeParameter(String name,
-      {int relevance: DART_RELEVANCE_TYPE_PARAMETER}) {
+      {int relevance = DART_RELEVANCE_TYPE_PARAMETER}) {
     CompletionSuggestion cs = assertSuggest(name,
         csKind: CompletionSuggestionKind.IDENTIFIER, relevance: relevance);
     expect(cs.returnType, isNull);
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 1298dca..d94b577 100644
--- a/pkg/analysis_server/test/services/completion/dart/test_all.dart
+++ b/pkg/analysis_server/test/services/completion/dart/test_all.dart
@@ -8,11 +8,17 @@
 import 'combinator_contributor_test.dart' as combinator_test;
 import 'common_usage_sorter_test.dart' as common_usage_test;
 import 'completion_manager_test.dart' as completion_manager;
+// ignore: unused_import
+import 'completion_ranking_test.dart' as completion_ranking_test;
+import 'completion_ranking_internal_test.dart'
+    as completion_ranking_internal_test;
 import 'field_formal_contributor_test.dart' as field_formal_contributor_test;
 import 'imported_reference_contributor_test.dart' as imported_ref_test;
 import 'inherited_reference_contributor_test.dart' as inherited_ref_test;
 import 'keyword_contributor_test.dart' as keyword_test;
 import 'label_contributor_test.dart' as label_contributor_test;
+// ignore: unused_import
+import 'language_model_test.dart' as language_model_test;
 import 'library_member_contributor_test.dart' as library_member_test;
 import 'library_prefix_contributor_test.dart' as library_prefix_test;
 import 'local_constructor_contributor_test.dart' as local_constructor_test;
@@ -25,18 +31,24 @@
 import 'uri_contributor_test.dart' as uri_contributor_test;
 import 'variable_name_contributor_test.dart' as variable_name_contributor_test;
 
-/// Utility for manually running all tests.
 main() {
   defineReflectiveSuite(() {
     arglist_test.main();
     combinator_test.main();
     common_usage_test.main();
     completion_manager.main();
+    // TODO(lambdabaa): Run this test once we figure out how to suppress
+    //   output from the tflite shared library
+    // completion_ranking_test.main();
+    completion_ranking_internal_test.main();
     field_formal_contributor_test.main();
     imported_ref_test.main();
     inherited_ref_test.main();
     keyword_test.main();
     label_contributor_test.main();
+    // TODO(brianwilkerson) Run this test when it's been updated to not rely on
+    //   the location of the 'script' being run.
+    // language_model_test.main();
     library_member_test.main();
     library_prefix_test.main();
     local_constructor_test.main();
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 bf67079..82ef23c 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
@@ -32,7 +32,7 @@
 
   void _assertHasChange(String message, String expectedCode, [Function cmp]) {
     if (change.message == message) {
-      if (!change.edits.isEmpty) {
+      if (change.edits.isNotEmpty) {
         String resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('/*caret*/', ''));
@@ -229,6 +229,36 @@
 ''');
   }
 
+  test_iter_List_dynamic() async {
+    await _prepareCompletion('.iter', '''
+f(List values) {
+  values.iter
+}
+''');
+    _assertHasChange('Expand .iter', '''
+f(List values) {
+  for (var value in values) {
+    /*caret*/
+  }
+}
+''');
+  }
+
+  test_iter_List_int() async {
+    await _prepareCompletion('.iter', '''
+f(List<int> values) {
+  values.iter
+}
+''');
+    _assertHasChange('Expand .iter', '''
+f(List<int> values) {
+  for (var value in values) {
+    /*caret*/
+  }
+}
+''');
+  }
+
   test_iterList() async {
     await _prepareCompletion('.iter', '''
 f() {
@@ -312,18 +342,11 @@
   }
 
   test_ifDynamic() async {
-    await _prepareCompletion('.if', '''
+    await _assertNotApplicable('.if', '''
 f(expr) {
   expr.if
 }
 ''');
-    _assertHasChange('Expand .if', '''
-f(expr) {
-  if (expr) {
-    /*caret*/
-  }
-}
-''');
   }
 }
 
@@ -331,12 +354,12 @@
 class _NegateTest extends PostfixCompletionTest {
   test_negate() async {
     await _prepareCompletion('.not', '''
-f(expr) {
+f(bool expr) {
   if (expr.not)
 }
 ''');
     _assertHasChange('Expand .not', '''
-f(expr) {
+f(bool expr) {
   if (!expr)
 }
 ''');
@@ -352,12 +375,12 @@
 
   test_negateCascade() async {
     await _prepareCompletion('.not', '''
-f(expr) {
+f(bool expr) {
   if (expr..a..b..c.not)
 }
 ''');
     _assertHasChange('Expand .not', '''
-f(expr) {
+f(bool expr) {
   if (!expr..a..b..c)
 }
 ''');
@@ -378,13 +401,29 @@
 
   test_negateProperty() async {
     await _prepareCompletion('.not', '''
-f(expr) {
-  if (expr.a.b.c.not)
+f(B b) {
+  if (b.a.f.not)
+}
+
+class A {
+  bool f;
+}
+`
+class B {
+  A a;
 }
 ''');
     _assertHasChange('Expand .not', '''
-f(expr) {
-  if (!expr.a.b.c)
+f(B b) {
+  if (!b.a.f)
+}
+
+class A {
+  bool f;
+}
+`
+class B {
+  A a;
 }
 ''');
   }
@@ -433,13 +472,13 @@
 class _NotNullTest extends PostfixCompletionTest {
   test_nn() async {
     await _prepareCompletion('.nn', '''
-f(expr) {
+f() {
   var list = [1,2,3];
   list.nn
 }
 ''');
     _assertHasChange('Expand .nn', '''
-f(expr) {
+f() {
   var list = [1,2,3];
   if (list != null) {
     /*caret*/
@@ -450,7 +489,7 @@
 
   test_nn_invalid() async {
     await _assertNotApplicable('.nn', '''
-f(expr) {
+f() {
   var list = [1,2,3];
 }.nn
 ''');
@@ -491,14 +530,12 @@
   test_null() async {
     await _prepareCompletion('.null', '''
 f(expr) {
-  var list = [1,2,3];
-  list.null
+  expr.null
 }
 ''');
     _assertHasChange('Expand .null', '''
 f(expr) {
-  var list = [1,2,3];
-  if (list == null) {
+  if (expr == null) {
     /*caret*/
   }
 }
@@ -695,12 +732,12 @@
 class _WhileTest extends PostfixCompletionTest {
   test_while() async {
     await _prepareCompletion('.while', '''
-f(expr) {
+f(bool expr) {
   expr.while
 }
 ''');
     _assertHasChange('Expand .while', '''
-f(expr) {
+f(bool expr) {
   while (expr) {
     /*caret*/
   }
diff --git a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
index 6d789ad..7907820e 100644
--- a/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
+++ b/pkg/analysis_server/test/services/completion/statement/statement_completion_test.dart
@@ -41,7 +41,7 @@
     int Function(String) cmp,
   ]) {
     if (change.message == message) {
-      if (!change.edits.isEmpty) {
+      if (change.edits.isNotEmpty) {
         String resultCode =
             SourceEdit.applySequence(testCode, change.edits[0].edits);
         expect(resultCode, expectedCode.replaceAll('////', ''));
@@ -72,7 +72,7 @@
   }
 
   _prepareCompletion(String search, String sourceCode,
-      {bool atEnd: false, int delta: 0}) async {
+      {bool atEnd = false, int delta = 0}) async {
     testCode = sourceCode.replaceAll('////', '');
     int offset = findOffset(search);
     if (atEnd) {
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 2a56e73..b2f4518 100644
--- a/pkg/analysis_server/test/services/correction/organize_directives_test.dart
+++ b/pkg/analysis_server/test/services/correction/organize_directives_test.dart
@@ -341,7 +341,7 @@
   }
 
   void _assertOrganize(String expectedCode,
-      {bool removeUnresolved: false, bool removeUnused: false}) {
+      {bool removeUnresolved = false, bool removeUnused = false}) {
     DirectiveOrganizer organizer = new DirectiveOrganizer(
         testCode, testUnit, testErrors,
         removeUnresolved: removeUnresolved, 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 faaac42..7acbf02 100644
--- a/pkg/analysis_server/test/services/correction/sort_members_test.dart
+++ b/pkg/analysis_server/test/services/correction/sort_members_test.dart
@@ -654,6 +654,36 @@
 ''');
   }
 
+  test_unitMembers_extensionClass() async {
+    createAnalysisOptionsFile(experiments: ['extension-methods']);
+    await _parseTestUnit(r'''
+extension E on C {}
+class C {}
+''');
+    // validate change
+    _assertSort(r'''
+class C {}
+extension E on C {}
+''');
+  }
+
+  test_unitMembers_extensions() async {
+    createAnalysisOptionsFile(experiments: ['extension-methods']);
+    await _parseTestUnit(r'''
+extension E2 on String {}
+extension on List {}
+extension E1 on int {}
+extension on bool {}
+''');
+    // validate change
+    _assertSort(r'''
+extension on List {}
+extension on bool {}
+extension E1 on int {}
+extension E2 on String {}
+''');
+  }
+
   test_unitMembers_function() async {
     await _parseTestUnit(r'''
 fc() {}
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 7c54046..94ad6ff 100644
--- a/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
+++ b/pkg/analysis_server/test/services/refactoring/extract_method_test.dart
@@ -296,7 +296,7 @@
 
   test_bad_namePartOfDeclaration_function() async {
     await indexTestUnit('''
-main() {
+void main() {
 }
 ''');
     _createRefactoringForString('main');
@@ -762,6 +762,28 @@
     expect(refactoring.createGetter, true);
   }
 
+  test_checkInitialCondition_false_outOfRange_length() async {
+    await indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    _createRefactoring(0, 1 << 20);
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+  }
+
+  test_checkInitialCondition_outOfRange_offset() async {
+    await indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    _createRefactoring(-10, 20);
+    RefactoringStatus status = await refactoring.checkAllConditions();
+    assertRefactoringStatus(status, RefactoringProblemSeverity.FATAL);
+  }
+
   test_checkName() async {
     await indexTestUnit('''
 main() {
@@ -1071,6 +1093,24 @@
     expect(refactoring.refactoringName, 'Extract Method');
   }
 
+  test_isAvailable_false_functionName() async {
+    await indexTestUnit('''
+void main() {}
+''');
+    _createRefactoringForString('main');
+    expect(refactoring.isAvailable(), isFalse);
+  }
+
+  test_isAvailable_true() async {
+    await indexTestUnit('''
+main() {
+  1 + 2;
+}
+''');
+    _createRefactoringForString('1 + 2');
+    expect(refactoring.isAvailable(), isTrue);
+  }
+
   test_names_singleExpression() async {
     await indexTestUnit('''
 class TreeItem {}
diff --git a/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart
new file mode 100644
index 0000000..bda2825
--- /dev/null
+++ b/pkg/analysis_server/test/src/computer/highlights2_computer_test.dart
@@ -0,0 +1,64 @@
+// 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:analysis_server/src/computer/computer_highlights2.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_context.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(Highlights2ComputerTest);
+  });
+}
+
+@reflectiveTest
+class Highlights2ComputerTest extends AbstractContextTest {
+  String sourcePath;
+  String content;
+  List<HighlightRegion> highlights;
+
+  setUp() {
+    super.setUp();
+    sourcePath = convertPath('/home/test/lib/test.dart');
+  }
+
+  test_extension() async {
+    createAnalysisOptionsFile(experiments: ['extension-methods']);
+    await _computeHighlights('''
+extension E on String {}
+''');
+    _check(HighlightRegionType.KEYWORD, 'extension');
+    _check(HighlightRegionType.BUILT_IN, 'on');
+  }
+
+  void _check(HighlightRegionType expectedType, String expectedText) {
+    for (var region in highlights) {
+      if (region.type == expectedType) {
+        int startIndex = region.offset;
+        int endIndex = startIndex + region.length;
+        String highlightedText = content.substring(startIndex, endIndex);
+        if (highlightedText == expectedText) {
+          return;
+        }
+      }
+    }
+    fail('Expected region of type $expectedType with text "$expectedText"');
+  }
+
+  Future<void> _computeHighlights(String content) async {
+    this.content = content;
+    newFile(sourcePath, content: content);
+    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
+    expect(result.errors, hasLength(0));
+    DartUnitHighlightsComputer2 computer =
+        new DartUnitHighlightsComputer2(result.unit);
+    highlights = computer.compute();
+  }
+}
diff --git a/pkg/analysis_server/test/src/computer/highlights_computer_test.dart b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
new file mode 100644
index 0000000..ab5d0ab
--- /dev/null
+++ b/pkg/analysis_server/test/src/computer/highlights_computer_test.dart
@@ -0,0 +1,64 @@
+// 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:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analyzer/dart/analysis/results.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../abstract_context.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(HighlightsComputerTest);
+  });
+}
+
+@reflectiveTest
+class HighlightsComputerTest extends AbstractContextTest {
+  String sourcePath;
+  String content;
+  List<HighlightRegion> highlights;
+
+  setUp() {
+    super.setUp();
+    sourcePath = convertPath('/home/test/lib/test.dart');
+  }
+
+  test_extension() async {
+    createAnalysisOptionsFile(experiments: ['extension-methods']);
+    await _computeHighlights('''
+extension E on String {}
+''');
+    _check(HighlightRegionType.KEYWORD, 'extension');
+    _check(HighlightRegionType.BUILT_IN, 'on');
+  }
+
+  void _check(HighlightRegionType expectedType, String expectedText) {
+    for (var region in highlights) {
+      if (region.type == expectedType) {
+        int startIndex = region.offset;
+        int endIndex = startIndex + region.length;
+        String highlightedText = content.substring(startIndex, endIndex);
+        if (highlightedText == expectedText) {
+          return;
+        }
+      }
+    }
+    fail('Expected region of type $expectedType with text "$expectedText"');
+  }
+
+  Future<void> _computeHighlights(String content) async {
+    this.content = content;
+    newFile(sourcePath, content: content);
+    ResolvedUnitResult result = await session.getResolvedUnit(sourcePath);
+    expect(result.errors, hasLength(0));
+    DartUnitHighlightsComputer computer =
+        new DartUnitHighlightsComputer(result.unit);
+    highlights = computer.compute();
+  }
+}
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 6fee770..ac637b4 100644
--- a/pkg/analysis_server/test/src/computer/outline_computer_test.dart
+++ b/pkg/analysis_server/test/src/computer/outline_computer_test.dart
@@ -5,6 +5,7 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/computer/computer_outline.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart';
 import 'package:meta/meta.dart';
 import 'package:test/test.dart';
@@ -413,6 +414,68 @@
     }
   }
 
+  test_extension_named() async {
+    createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
+    Outline unitOutline = await _computeOutline('''
+extension MyExt on String {
+  int get halfLength => length ~/ 2;
+  void writeOn(StringBuffer b) {
+    b.write(this);
+  }
+}
+''');
+    List<Outline> topOutlines = unitOutline.children;
+    expect(topOutlines, hasLength(1));
+    // MyExt
+    {
+      Outline outline_MyExt = topOutlines[0];
+      Element element_MyExt = outline_MyExt.element;
+      expect(element_MyExt.kind, ElementKind.EXTENSION);
+      expect(element_MyExt.name, 'MyExt');
+      {
+        Location location = element_MyExt.location;
+        expect(location.offset, testCode.indexOf('MyExt on'));
+        expect(location.length, 'MyExt'.length);
+      }
+      expect(element_MyExt.parameters, null);
+      expect(element_MyExt.returnType, null);
+      // StringUtilities children
+      List<Outline> outlines_MyExt = outline_MyExt.children;
+      expect(outlines_MyExt, hasLength(2));
+    }
+  }
+
+  test_extension_unnamed() async {
+    createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
+    Outline unitOutline = await _computeOutline('''
+extension on String {
+  int get halfLength => length ~/ 2;
+  void writeOn(StringBuffer b) {
+    b.write(this);
+  }
+}
+''');
+    List<Outline> topOutlines = unitOutline.children;
+    expect(topOutlines, hasLength(1));
+    // MyExt
+    {
+      Outline outline_MyExt = topOutlines[0];
+      Element element_MyExt = outline_MyExt.element;
+      expect(element_MyExt.kind, ElementKind.EXTENSION);
+      expect(element_MyExt.name, '');
+      {
+        Location location = element_MyExt.location;
+        expect(location.offset, testCode.indexOf('String'));
+        expect(location.length, 'String'.length);
+      }
+      expect(element_MyExt.parameters, null);
+      expect(element_MyExt.returnType, null);
+      // StringUtilities children
+      List<Outline> outlines_MyExt = outline_MyExt.children;
+      expect(outlines_MyExt, hasLength(2));
+    }
+  }
+
   test_genericTypeAlias_incomplete() async {
     Outline unitOutline = await _computeOutline('''
 typedef F = Object;
@@ -1257,7 +1320,7 @@
 
   void _expect(Outline outline,
       {ElementKind kind,
-      bool leaf: false,
+      bool leaf = false,
       int length,
       String name,
       int offset,
diff --git a/pkg/analysis_server/test/src/computer/test_all.dart b/pkg/analysis_server/test/src/computer/test_all.dart
index c99b3c5..def1a36 100644
--- a/pkg/analysis_server/test/src/computer/test_all.dart
+++ b/pkg/analysis_server/test/src/computer/test_all.dart
@@ -6,6 +6,8 @@
 
 import 'closingLabels_computer_test.dart' as closingLabels_computer_test;
 import 'folding_computer_test.dart' as folding_computer_test;
+import 'highlights2_computer_test.dart' as highlights2_computer;
+import 'highlights_computer_test.dart' as highlights_computer;
 import 'import_elements_computer_test.dart' as import_elements_computer_test;
 import 'imported_elements_computer_test.dart'
     as imported_elements_computer_test;
@@ -15,6 +17,8 @@
   defineReflectiveSuite(() {
     closingLabels_computer_test.main();
     folding_computer_test.main();
+    highlights2_computer.main();
+    highlights_computer.main();
     import_elements_computer_test.main();
     imported_elements_computer_test.main();
     outline_computer_test.main();
diff --git a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
index 47c59ec..824d864 100644
--- a/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
+++ b/pkg/analysis_server/test/src/domains/completion/get_suggestions_available_test.dart
@@ -198,7 +198,6 @@
     await waitResponse(
       CompletionGetSuggestionsParams(path, 0).toRequest('0'),
     );
-    expect(serverErrors, isEmpty);
   }
 
   test_relevanceTags_enum() async {
diff --git a/pkg/analysis_server/test/src/domains/flutter/base.dart b/pkg/analysis_server/test/src/domains/flutter/base.dart
new file mode 100644
index 0000000..168bacb
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/flutter/base.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:analysis_server/src/flutter/flutter_domain.dart';
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../analysis_abstract.dart';
+import '../../utilities/mock_packages.dart';
+
+@reflectiveTest
+class FlutterBase extends AbstractAnalysisTest {
+  FlutterWidgetProperty getProperty(
+    FlutterGetWidgetDescriptionResult result,
+    String name,
+  ) {
+    return result.properties.singleWhere((property) {
+      return property.name == name;
+    });
+  }
+
+  Future<FlutterGetWidgetDescriptionResult> getWidgetDescription(
+    String search,
+  ) async {
+    var response = await getWidgetDescriptionResponse(search);
+    expect(response.error, isNull);
+    return FlutterGetWidgetDescriptionResult.fromResponse(response);
+  }
+
+  Future<Response> getWidgetDescriptionResponse(String search) async {
+    var request = FlutterGetWidgetDescriptionParams(
+      testFile,
+      findOffset(search),
+    ).toRequest('0');
+    return await waitResponse(request);
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    projectPath = convertPath('/home');
+    testFile = convertPath('/home/test/lib/test.dart');
+
+    newFile('/home/test/pubspec.yaml', content: '');
+    newFile('/home/test/.packages', content: '''
+test:${toUri('/home/test/lib')}
+''');
+
+    _addFlutterPackage();
+
+    createProject();
+    handler = server.handlers.whereType<FlutterDomainHandler>().single;
+  }
+
+  void _addFlutterPackage() {
+    _addMetaPackage();
+    var libFolder = MockPackages.instance.addFlutter(resourceProvider);
+    _addPackageDependency('flutter', libFolder.parent.path);
+  }
+
+  void _addMetaPackage() {
+    var libFolder = MockPackages.instance.addMeta(resourceProvider);
+    _addPackageDependency('meta', libFolder.parent.path);
+  }
+
+  void _addPackageDependency(String name, String rootPath) {
+    var packagesFile = getFile('/home/test/.packages');
+    var packagesContent =
+        packagesFile.exists ? packagesFile.readAsStringSync() : '';
+
+    // Ignore if there is already the same package dependency.
+    if (packagesContent.contains('$name:file://')) {
+      return;
+    }
+
+    rootPath = convertPath(rootPath);
+    packagesContent += '$name:${toUri('$rootPath/lib')}\n';
+
+    packagesFile.writeAsStringSync(packagesContent);
+  }
+}
diff --git a/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart b/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart
new file mode 100644
index 0000000..9a319ca
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/flutter/get_widget_description_test.dart
@@ -0,0 +1,65 @@
+// 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:analysis_server/src/protocol_server.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetWidgetDescriptionTest);
+  });
+}
+
+@reflectiveTest
+class GetWidgetDescriptionTest extends FlutterBase {
+  test_kind_required() async {
+    addTestFile(r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+
+    var result = await getWidgetDescription('Text(');
+
+    var property = getProperty(result, 'data');
+    expect(property.documentation, isNotNull);
+    expect(property.expression, "'aaa'");
+    expect(property.isRequired, isTrue);
+    expect(property.editor, isNotNull);
+    expect(property.value.stringValue, 'aaa');
+  }
+
+  test_notInstanceCreation() async {
+    addTestFile(r'''
+void main() {
+  42;
+}
+''');
+
+    var response = await getWidgetDescriptionResponse('42');
+    expect(
+      response.error.code,
+      RequestErrorCode.FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
+    );
+  }
+
+  test_unresolvedInstanceCreation() async {
+    addTestFile(r'''
+void main() {
+  new Foo();
+}
+''');
+
+    var response = await getWidgetDescriptionResponse('new Foo');
+    expect(
+      response.error.code,
+      RequestErrorCode.FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart b/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart
new file mode 100644
index 0000000..8306d1e
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/flutter/set_property_value_test.dart
@@ -0,0 +1,153 @@
+// 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:analysis_server/src/protocol_server.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'base.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SetPropertyValueTest);
+  });
+}
+
+@reflectiveTest
+class SetPropertyValueTest extends FlutterBase {
+  test_named_add() async {
+    addTestFile(r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('');
+}
+''');
+
+    var widgetDesc = await getWidgetDescription('Text(');
+    var property = getProperty(widgetDesc, 'maxLines');
+
+    var result = await _setValue(
+      property,
+      FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    _assertTestFileChange(result.change, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    maxLines: 42,
+  );
+}
+''');
+  }
+
+  test_named_change() async {
+    addTestFile(r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1);
+}
+''');
+
+    var widgetDesc = await getWidgetDescription('Text(');
+    var property = getProperty(widgetDesc, 'maxLines');
+
+    var result = await _setValue(
+      property,
+      FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    _assertTestFileChange(result.change, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 42);
+}
+''');
+  }
+
+  test_named_remove() async {
+    addTestFile(r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1);
+}
+''');
+
+    var widgetDesc = await getWidgetDescription('Text(');
+    var property = getProperty(widgetDesc, 'maxLines');
+
+    var result = await _setValue(property, null);
+
+    _assertTestFileChange(result.change, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', );
+}
+''');
+  }
+
+  test_required_change() async {
+    addTestFile(r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+
+    var widgetDesc = await getWidgetDescription('Text(');
+    var property = getProperty(widgetDesc, 'data');
+
+    var result = await _setValue(
+      property,
+      FlutterWidgetPropertyValue(stringValue: 'bbb'),
+    );
+
+    _assertTestFileChange(result.change, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('bbb');
+}
+''');
+  }
+
+  void _assertTestFileChange(SourceChange change, String expected) {
+    var fileEdits = change.edits;
+    expect(fileEdits, hasLength(1));
+
+    var fileEdit = fileEdits[0];
+    expect(fileEdit.file, testFile);
+
+    var edits = fileEdit.edits;
+    expect(SourceEdit.applySequence(testCode, edits), expected);
+  }
+
+  Future<FlutterSetWidgetPropertyValueResult> _setValue(
+    FlutterWidgetProperty property,
+    FlutterWidgetPropertyValue value,
+  ) async {
+    var response = await _setValueResponse(property, value);
+    expect(response.error, isNull);
+    return FlutterSetWidgetPropertyValueResult.fromResponse(response);
+  }
+
+  Future<Response> _setValueResponse(
+    FlutterWidgetProperty property,
+    FlutterWidgetPropertyValue value,
+  ) async {
+    var request = FlutterSetWidgetPropertyValueParams(
+      property.id,
+      value: value,
+    ).toRequest('0');
+    return await waitResponse(request);
+  }
+}
diff --git a/pkg/analysis_server/test/src/domains/flutter/test_all.dart b/pkg/analysis_server/test/src/domains/flutter/test_all.dart
new file mode 100644
index 0000000..d25b982
--- /dev/null
+++ b/pkg/analysis_server/test/src/domains/flutter/test_all.dart
@@ -0,0 +1,15 @@
+// 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_reflective_loader/test_reflective_loader.dart';
+
+import 'get_widget_description_test.dart' as get_widget_description;
+import 'set_property_value_test.dart' as set_property_value;
+
+main() {
+  defineReflectiveSuite(() {
+    get_widget_description.main();
+    set_property_value.main();
+  });
+}
diff --git a/pkg/analysis_server/test/src/domains/test_all.dart b/pkg/analysis_server/test/src/domains/test_all.dart
index b936c18..5e6917d 100644
--- a/pkg/analysis_server/test/src/domains/test_all.dart
+++ b/pkg/analysis_server/test/src/domains/test_all.dart
@@ -6,10 +6,12 @@
 
 import 'completion/test_all.dart' as completion;
 import 'execution/test_all.dart' as execution;
+import 'flutter/test_all.dart' as flutter;
 
 main() {
   defineReflectiveSuite(() {
     completion.main();
     execution.main();
+    flutter.main();
   });
 }
diff --git a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
index 1039fe9..8f97f56 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_correction_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analysis_server/src/flutter/flutter_correction.dart';
-import 'package:analysis_server/src/protocol_server.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -33,101 +32,26 @@
     addFlutterPackage();
   }
 
-  test_addForDesignTimeConstructor_BAD_notClass() async {
-    await resolveTestUnit('var v = 42;');
-    offset = findOffset('v =');
-    _createCorrections();
-
-    SourceChange change = await corrections.addForDesignTimeConstructor();
-    expect(change, isNull);
-  }
-
-  test_addForDesignTimeConstructor_OK_hasConstructor() async {
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget(String text);
-
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    offset = findOffset('class MyWidget');
-    _createCorrections();
-
-    SourceChange change = await corrections.addForDesignTimeConstructor();
-    _assertChange(change, r'''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget(String text);
-
-  factory MyWidget.forDesignTime() {
-    // TODO: add arguments
-    return new MyWidget();
-  }
-
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-  }
-
-  test_addForDesignTimeConstructor_OK_noConstructor() async {
-    await resolveTestUnit('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    offset = findOffset('class MyWidget');
-    _createCorrections();
-
-    SourceChange change = await corrections.addForDesignTimeConstructor();
-    _assertChange(change, r'''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget();
-
-  factory MyWidget.forDesignTime() {
-    // TODO: add arguments
-    return new MyWidget();
-  }
-
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-  }
-
-  void _assertChange(SourceChange change, String expectedCode) {
-    expect(change, isNotNull);
-
-    List<SourceFileEdit> files = change.edits;
-    expect(files, hasLength(1));
-    expect(files[0].file, testFile);
-
-    List<SourceEdit> fileEdits = files[0].edits;
-    String resultCode = SourceEdit.applySequence(testCode, fileEdits);
-    if (resultCode != expectedCode) {
-      print(resultCode);
-    }
-    expect(resultCode, expectedCode);
-  }
-
-  void _createCorrections() {
-    corrections = new FlutterCorrections(
-      resolveResult: testAnalysisResult,
-      selectionOffset: offset,
-      selectionLength: length,
-    );
-  }
+//  void _assertChange(SourceChange change, String expectedCode) {
+//    expect(change, isNotNull);
+//
+//    List<SourceFileEdit> files = change.edits;
+//    expect(files, hasLength(1));
+//    expect(files[0].file, testFile);
+//
+//    List<SourceEdit> fileEdits = files[0].edits;
+//    String resultCode = SourceEdit.applySequence(testCode, fileEdits);
+//    if (resultCode != expectedCode) {
+//      print(resultCode);
+//    }
+//    expect(resultCode, expectedCode);
+//  }
+//
+//  void _createCorrections() {
+//    corrections = new FlutterCorrections(
+//      resolveResult: testAnalysisResult,
+//      selectionOffset: offset,
+//      selectionLength: length,
+//    );
+//  }
 }
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 2ab09bd..493fc2e 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
@@ -53,6 +53,8 @@
     var attribute = widget.attributes[0];
     expect(attribute.name, 'value');
     expect(attribute.label, '42');
+    _assertLocation(attribute.nameLocation, 75, 5);
+    _assertLocation(attribute.valueLocation, 82, 2);
   }
 
   test_attributes_bool() async {
@@ -420,276 +422,6 @@
 ''');
   }
 
-  test_render_BAD_noDesignTimeConstructor() async {
-    FlutterOutline unitOutline = await _computeOutline('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  @override
-  Widget build(BuildContext context) {
-    return new Row();
-  }
-}
-''');
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.isWidgetClass, isTrue);
-    expect(myWidget.renderConstructor, isNull);
-    expect(myWidget.stateClassName, isNull);
-    expect(myWidget.stateOffset, isNull);
-    expect(myWidget.stateLength, isNull);
-
-    expect(computer.instrumentedCode, isNull);
-  }
-
-  test_render_BAD_notWidget() async {
-    FlutterOutline unitOutline = await _computeOutline('''
-class C {}
-''');
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.isWidgetClass, isNull);
-    expect(myWidget.renderConstructor, isNull);
-    expect(myWidget.stateClassName, isNull);
-    expect(myWidget.stateOffset, isNull);
-    expect(myWidget.stateLength, isNull);
-
-    expect(computer.instrumentedCode, isNull);
-  }
-
-  test_render_BAD_part() async {
-    // Use test.dart as a part of a library.
-    // Add the library to the driver so that it is analyzed before the part.
-    var libPath = newFile('/home/test/lib/test_lib.dart', content: r'''
-part 'test.dart';
-import 'package:flutter/widgets.dart';
-''').path;
-    driver.addFile(libPath);
-
-    FlutterOutline unitOutline = await _computeOutline('''
-part of 'test_lib.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row();
-  }
-}
-''');
-
-    // Analysis is successful, no errors.
-    expect(resolveResult.errors, isEmpty);
-
-    // No instrumentation, because not a library.
-    expect(computer.instrumentedCode, isNull);
-
-    // There is forDesignTime() constructor, but we don't handle parts.
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.isWidgetClass, isNull);
-    expect(myWidget.renderConstructor, isNull);
-  }
-
-  test_render_instrumentedCode_registerWidgets() async {
-    await _computeOutline('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: <Widget>[
-        new Text('aaa'),
-        new Text('bbb'),
-      ],
-    );
-  }
-}
-''');
-    expect(
-        computer.instrumentedCode,
-        r'''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return _registerWidgetInstance(0, new Row(
-      children: <Widget>[
-        _registerWidgetInstance(1, new Text('aaa')),
-        _registerWidgetInstance(2, new Text('bbb')),
-      ],
-    ));
-  }
-}
-''' +
-            FlutterOutlineComputer.RENDER_APPEND);
-  }
-
-  test_render_instrumentedCode_rewriteUri_file() async {
-    newFile('/home/test/lib/my_lib.dart');
-
-    await _computeOutline('''
-import 'package:flutter/widgets.dart';
-import 'my_lib.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    expect(
-        computer.instrumentedCode,
-        '''
-import 'package:flutter/widgets.dart';
-import 'package:test/my_lib.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return _registerWidgetInstance(0, new Container());
-  }
-}
-''' +
-            FlutterOutlineComputer.RENDER_APPEND);
-  }
-
-  test_render_instrumentedCode_rewriteUri_package() async {
-    newFile('/home/test/lib/my_lib.dart');
-
-    await _computeOutline('''
-import 'package:flutter/widgets.dart';
-import 'my_lib.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return new Container();
-  }
-}
-''');
-    expect(
-        computer.instrumentedCode,
-        '''
-import 'package:flutter/widgets.dart';
-import 'package:test/my_lib.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return _registerWidgetInstance(0, new Container());
-  }
-}
-''' +
-            FlutterOutlineComputer.RENDER_APPEND);
-  }
-
-  test_render_stateful_createState_blockBody() async {
-    FlutterOutline unitOutline = await _computeOutline('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatefulWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  MyWidgetState createState() {
-    return new MyWidgetState();
-  }
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Container(),
-  }
-}
-''');
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.renderConstructor, 'forDesignTime');
-    expect(myWidget.stateClassName, 'MyWidgetState');
-    expect(myWidget.stateOffset, 192);
-    expect(myWidget.stateLength, 130);
-  }
-
-  test_render_stateful_createState_expressionBody() async {
-    FlutterOutline unitOutline = await _computeOutline('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatefulWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  MyWidgetState createState() => new MyWidgetState();
-}
-
-class MyWidgetState extends State<MyWidget> {
-  @override
-  Widget build(BuildContext context) {
-    return new Container(),
-  }
-}
-''');
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.isWidgetClass, isTrue);
-    expect(myWidget.renderConstructor, 'forDesignTime');
-    expect(myWidget.stateClassName, 'MyWidgetState');
-    expect(myWidget.stateOffset, 178);
-    expect(myWidget.stateLength, 130);
-  }
-
-  test_render_stateless() async {
-    FlutterOutline unitOutline = await _computeOutline('''
-import 'package:flutter/widgets.dart';
-
-class MyWidget extends StatelessWidget {
-  MyWidget.forDesignTime();
-
-  @override
-  Widget build(BuildContext context) {
-    return new Row(
-      children: <Widget>[
-        new Text('aaa'),
-        new Text('bbb'),
-      ],
-    );
-  }
-}
-''');
-    var myWidget = unitOutline.children[0];
-    expect(myWidget.isWidgetClass, isTrue);
-    expect(myWidget.renderConstructor, 'forDesignTime');
-    expect(myWidget.stateClassName, isNull);
-    expect(myWidget.stateOffset, isNull);
-    expect(myWidget.stateLength, isNull);
-
-    var build = myWidget.children[1];
-
-    var row = build.children[0];
-    expect(row.className, 'Row');
-    expect(row.id, 0);
-
-    var textA = row.children[0];
-    expect(textA.className, 'Text');
-    expect(textA.id, 1);
-
-    var textB = row.children[1];
-    expect(textB.className, 'Text');
-    expect(textB.id, 2);
-  }
-
   test_variableName() async {
     FlutterOutline unitOutline = await _computeOutline('''
 import 'package:flutter/widgets.dart';
@@ -721,6 +453,12 @@
     expect(textRef.variableName, 'text');
   }
 
+  void _assertLocation(
+      Location actual, int expectedOffset, int expectedLength) {
+    expect(actual.offset, expectedOffset);
+    expect(actual.length, expectedLength);
+  }
+
   Future<FlutterOutline> _computeOutline(String code) async {
     testCode = code;
     newFile(testPath, content: code);
@@ -754,6 +492,9 @@
 
     var attribute = newMyWidget.attributes[0];
     expect(attribute.name, name);
+    expect(attribute.nameLocation, isNull);
+    _assertLocation(attribute.valueLocation, 64, value.length);
+
     return attribute;
   }
 
diff --git a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
index 0636227..c6fcff4 100644
--- a/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
+++ b/pkg/analysis_server/test/src/flutter/flutter_outline_notification_test.dart
@@ -13,7 +13,7 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../../analysis_abstract.dart';
-import '../utilities/flutter_util.dart';
+import '../utilities/mock_packages.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -66,7 +66,7 @@
   void setUp() {
     super.setUp();
     createProject();
-    flutterFolder = configureFlutterPackage(resourceProvider);
+    flutterFolder = MockPackages.instance.addFlutter(resourceProvider);
   }
 
   Future<void> test_children() async {
diff --git a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
index 186e284..df7d05f 100644
--- a/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
+++ b/pkg/analysis_server/test/src/plugin/plugin_manager_test.dart
@@ -33,7 +33,7 @@
   });
 }
 
-ContextRoot _newContextRoot(String root, {List<String> exclude: const []}) {
+ContextRoot _newContextRoot(String root, {List<String> exclude = const []}) {
   return new ContextRoot(root, exclude, pathContext: path.context);
 }
 
diff --git a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
index acc611a..d715dd2 100644
--- a/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/assist/flutter_wrap_padding_test.dart
@@ -48,7 +48,10 @@
 import 'package:flutter/widgets.dart';
 class FakeFlutter {
   main() {
-    return /*caret*/Padding();
+    return Padding(
+      padding: const EdgeInsets.all(8.0),
+      child: Container(),
+    );
   }
 }
 ''');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
index 7656709..03dda70 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/create_missing_overrides_test.dart
@@ -4,6 +4,7 @@
 
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analysis_server/src/services/correction/fix.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart' show AnalysisDriver;
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -78,7 +79,21 @@
 class B extends A {
 }
 ''');
-    await assertHasFix('''
+    if (AnalysisDriver.useSummary2) {
+      await assertHasFix('''
+abstract class A {
+  void forEach(int f(double p1, String p2));
+}
+
+class B extends A {
+  @override
+  void forEach(int Function(double, String) f) {
+    // TODO: implement forEach
+  }
+}
+''');
+    } else {
+      await assertHasFix('''
 abstract class A {
   void forEach(int f(double p1, String p2));
 }
@@ -90,6 +105,7 @@
   }
 }
 ''');
+    }
   }
 
   test_generics_typeArguments() async {
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 beb7025..49a976a 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
@@ -7,9 +7,12 @@
 import 'package:analysis_server/plugin/edit/fix/fix_core.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/error/error.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
+import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer_plugin/protocol/protocol_common.dart'
     hide AnalysisError;
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
@@ -250,7 +253,19 @@
 
   /// Computes fixes for the given [error] in [testUnit].
   Future<List<Fix>> _computeFixes(AnalysisError error) async {
-    var context = new DartFixContextImpl(workspace, testAnalysisResult, error);
+    var tracker = DeclarationsTracker(MemoryByteStore(), resourceProvider);
+    tracker.addContext(driver.analysisContext);
+
+    var context = new DartFixContextImpl(
+      workspace,
+      testAnalysisResult,
+      error,
+      (name) {
+        var provider = TopLevelDeclarationsProvider(tracker);
+        provider.doTrackerWork();
+        return provider.get(driver.analysisContext, testFile, name);
+      },
+    );
     return await new DartFixContributor().computeFixes(context);
   }
 
@@ -268,7 +283,7 @@
       }
       errors = errors.where(errorFilter).toList();
     }
-    if (errors.length == 0) {
+    if (errors.isEmpty) {
       fail('Expected one error, found: none');
     } else if (errors.length > 1) {
       StringBuffer buffer = new StringBuffer();
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 6c11ac8..8119ac1 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
@@ -386,6 +386,41 @@
 ''');
   }
 
+  test_withFunction_identifier() async {
+    addSource('/home/test/lib/lib.dart', '''
+library lib;
+myFunction() {}
+''');
+    await resolveTestUnit('''
+main() {
+  myFunction;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  myFunction;
+}
+''');
+  }
+
+  test_withFunction_functionTopLevelVariableIdentifier() async {
+    addSource('/home/test/lib/lib.dart', 'var myFunction = () {};');
+    await resolveTestUnit('''
+main() {
+  myFunction;
+}
+''');
+    await assertHasFix('''
+import 'package:test/lib.dart';
+
+main() {
+  myFunction;
+}
+''');
+  }
+
   @failingTest
   test_withFunction_nonFunctionType() async {
     addSource('/home/test/lib/lib.dart', 'int zero = 0;');
diff --git a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
index 33223ec..f6f3724 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/update_sdk_constraints_test.dart
@@ -88,7 +88,7 @@
 ''', to: '^2.2.0');
   }
 
-  testUpdate({String content, String from: '^2.0.0', String to}) async {
+  testUpdate({String content, String from = '^2.0.0', String to}) async {
     updateTestPubspecFile('''
 environment:
   sdk: $from
diff --git a/pkg/analysis_server/test/src/services/flutter/constants.dart b/pkg/analysis_server/test/src/services/flutter/constants.dart
new file mode 100644
index 0000000..3bf64d2
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/flutter/constants.dart
@@ -0,0 +1,103 @@
+// 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.
+
+final alignmentEditor = '''
+"editor": {
+    "kind": "ENUM_LIKE",
+    "enumItems": $alignmentEnumItems
+  }''';
+
+final alignmentEnumItems = '''
+[
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "topLeft"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "topCenter"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "topRight"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "centerLeft"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "center"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "centerRight"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "bottomLeft"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "bottomCenter"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "Alignment",
+        "name": "bottomRight"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "topStart"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "topCenter"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "topEnd"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "centerStart"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "center"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "centerEnd"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "bottomStart"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "bottomCenter"
+      },
+      {
+        "libraryUri": "package:flutter/src/painting/alignment.dart",
+        "className": "AlignmentDirectional",
+        "name": "bottomEnd"
+      }
+    ]''';
diff --git a/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
new file mode 100644
index 0000000..6968e64
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/flutter/container_properties_test.dart
@@ -0,0 +1,1154 @@
+// 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:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'constants.dart';
+import 'widget_description.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ContainerPropertiesTest);
+    defineReflectiveTests(ContainerPropertyAlignmentTest);
+    defineReflectiveTests(ContainerPropertyPaddingTest);
+  });
+}
+
+@reflectiveTest
+class ContainerPropertiesTest extends WidgetDescriptionBase {
+  test_container_existing() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+    alignment: Alignment.centerRight,
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var childrenNames = property.children.map((p) => p.name).toList();
+
+    expect(
+      childrenNames,
+      containsAll([
+        'alignment',
+        'color',
+        'decoration',
+        'height',
+        'margin',
+        'width',
+      ]),
+    );
+
+    expect(childrenNames, isNot(contains('child')));
+  }
+
+  test_container_virtual() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Column(
+    children: [
+      Text(''),
+    ],
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var childrenNames = property.children.map((p) => p.name).toList();
+
+    expect(
+      childrenNames,
+      containsAll([
+        'alignment',
+        'color',
+        'decoration',
+        'height',
+        'margin',
+        'width',
+      ]),
+    );
+
+    expect(childrenNames, isNot(contains('child')));
+  }
+}
+
+@reflectiveTest
+class ContainerPropertyAlignmentTest extends WidgetDescriptionBase {
+  test_read_hasAlign_notSimple() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.centerRight,
+    widthFactor: 2,
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var alignmentProperty = getNestedProperty(property, 'alignment');
+    expect(alignmentProperty.expression, isNull);
+  }
+
+  test_read_hasAlign_simple() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var alignmentProperty = getNestedProperty(property, 'alignment');
+    assertPropertyJsonText(alignmentProperty, '''
+{
+  "expression": "Alignment.centerRight",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "alignment",
+  "children": [],
+  $alignmentEditor,
+  "value": {
+    "enumValue": {
+      "libraryUri": "package:flutter/src/painting/alignment.dart",
+      "className": "Alignment",
+      "name": "centerRight"
+    }
+  }
+}
+''');
+  }
+
+  test_read_hasContainer() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+    alignment: Alignment.centerRight,
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var alignmentProperty = getNestedProperty(property, 'alignment');
+    assertPropertyJsonText(alignmentProperty, '''
+{
+  "expression": "Alignment.centerRight",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "alignment",
+  "children": [],
+  $alignmentEditor,
+  "value": {
+    "enumValue": {
+      "libraryUri": "package:flutter/src/painting/alignment.dart",
+      "className": "Alignment",
+      "name": "centerRight"
+    }
+  }
+}
+''');
+  }
+
+  test_read_hasContainer_directional() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+    alignment: AlignmentDirectional.centerStart,
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var alignmentProperty = getNestedProperty(property, 'alignment');
+    assertPropertyJsonText(alignmentProperty, '''
+{
+  "expression": "AlignmentDirectional.centerStart",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "alignment",
+  "children": [],
+  $alignmentEditor,
+  "value": {
+    "enumValue": {
+      "libraryUri": "package:flutter/src/painting/alignment.dart",
+      "className": "AlignmentDirectional",
+      "name": "centerStart"
+    }
+  }
+}
+''');
+  }
+
+  test_write_hasAlign_change() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: _alignmentValue('bottomLeft'),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.bottomLeft,
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasAlign_remove() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      null,
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_add() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: _alignmentValue('bottomLeft'),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.bottomLeft,
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: _alignmentValue('bottomLeft'),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.bottomLeft,
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_remove() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      null,
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasPadding_add() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Padding(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: _alignmentValue('bottomLeft'),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.bottomLeft,
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_noContainer_add() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Column(
+    children: [
+      Text(''),
+    ],
+  );
+}
+''');
+    var alignmentProperty = await _alignmentProperty('Text(');
+
+    var result = await descriptions.setPropertyValue(
+      alignmentProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: _alignmentValue('bottomLeft'),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Column(
+    children: [
+      Container(
+        alignment: Alignment.bottomLeft,
+        child: Text(''),
+      ),
+    ],
+  );
+}
+''');
+  }
+
+  Future<protocol.FlutterWidgetProperty> _alignmentProperty(
+    String widgetSearch,
+  ) async {
+    var containerProperty = await getWidgetProperty(widgetSearch, 'Container');
+    return getNestedProperty(containerProperty, 'alignment');
+  }
+
+  static protocol.FlutterWidgetPropertyValueEnumItem _alignmentValue(
+    String name,
+  ) {
+    return protocol.FlutterWidgetPropertyValueEnumItem(
+      'package:flutter/src/painting/alignment.dart',
+      'Alignment',
+      name,
+    );
+  }
+}
+
+@reflectiveTest
+class ContainerPropertyPaddingTest extends WidgetDescriptionBase {
+  test_read_hasContainer_all() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.all(4),
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var paddingProperty = getNestedProperty(property, 'padding');
+
+    assertPropertyJsonText(paddingProperty, '''
+{
+  "expression": "EdgeInsets.all(4)",
+  "isRequired": false,
+  "isSafeToUpdate": false,
+  "name": "padding",
+  "children": [
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "left",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "top",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "right",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "bottom",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    }
+  ]
+}
+''');
+  }
+
+  test_read_hasContainer_fromLTRB() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.fromLTRB(1, 2, 3, 4),
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var paddingProperty = getNestedProperty(property, 'padding');
+
+    assertPropertyJsonText(paddingProperty, '''
+{
+  "expression": "EdgeInsets.fromLTRB(1, 2, 3, 4)",
+  "isRequired": false,
+  "isSafeToUpdate": false,
+  "name": "padding",
+  "children": [
+    {
+      "expression": "1",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "left",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 1.0
+      }
+    },
+    {
+      "expression": "2",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "top",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 2.0
+      }
+    },
+    {
+      "expression": "3",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "right",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 3.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "bottom",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    }
+  ]
+}
+''');
+  }
+
+  test_read_hasContainer_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var paddingProperty = getNestedProperty(property, 'padding');
+
+    assertPropertyJsonText(paddingProperty, '''
+{
+  "expression": "EdgeInsets.only(left: 1, right: 3)",
+  "isRequired": false,
+  "isSafeToUpdate": false,
+  "name": "padding",
+  "children": [
+    {
+      "expression": "1",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "left",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 1.0
+      }
+    },
+    {
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "top",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      }
+    },
+    {
+      "expression": "3",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "right",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 3.0
+      }
+    },
+    {
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "bottom",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      }
+    }
+  ]
+}
+''');
+  }
+
+  test_read_hasContainer_symmetric() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.symmetric(horizontal: 2, vertical: 4),
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var paddingProperty = getNestedProperty(property, 'padding');
+
+    assertPropertyJsonText(paddingProperty, '''
+{
+  "expression": "EdgeInsets.symmetric(horizontal: 2, vertical: 4)",
+  "isRequired": false,
+  "isSafeToUpdate": false,
+  "name": "padding",
+  "children": [
+    {
+      "expression": "2",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "left",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 2.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "top",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    },
+    {
+      "expression": "2",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "right",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 2.0
+      }
+    },
+    {
+      "expression": "4",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "bottom",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 4.0
+      }
+    }
+  ]
+}
+''');
+  }
+
+  test_read_hasPadding_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Padding(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'Container');
+    var paddingProperty = getNestedProperty(property, 'padding');
+
+    assertPropertyJsonText(paddingProperty, '''
+{
+  "expression": "EdgeInsets.only(left: 1, right: 3)",
+  "isRequired": false,
+  "isSafeToUpdate": false,
+  "name": "padding",
+  "children": [
+    {
+      "expression": "1",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "left",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 1.0
+      }
+    },
+    {
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "top",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      }
+    },
+    {
+      "expression": "3",
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "right",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      },
+      "value": {
+        "doubleValue": 3.0
+      }
+    },
+    {
+      "isRequired": true,
+      "isSafeToUpdate": true,
+      "name": "bottom",
+      "children": [],
+      "editor": {
+        "kind": "DOUBLE"
+      }
+    }
+  ]
+}
+''');
+  }
+
+  test_write_hasAlign_add_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Align(
+    alignment: Alignment.centerRight,
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 1,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    alignment: Alignment.centerRight,
+    padding: EdgeInsets.only(left: 1),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_add_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 1,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_all() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1, top: 2, right: 1, bottom: 1),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var topProperty = getNestedProperty(paddingProperty, 'top');
+
+    var result = await descriptions.setPropertyValue(
+      topProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 1,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.all(1),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 11,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 11, right: 3),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_remove() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var topProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      topProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 0,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_symmetric_both() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1, top: 2, right: 1, bottom: 4),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var topProperty = getNestedProperty(paddingProperty, 'top');
+
+    var result = await descriptions.setPropertyValue(
+      topProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 4,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.symmetric(horizontal: 1, vertical: 4),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_symmetric_horizontal() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 3,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.symmetric(horizontal: 3),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasContainer_change_symmetric_vertical() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.only(top: 2, bottom: 4),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var topProperty = getNestedProperty(paddingProperty, 'top');
+
+    var result = await descriptions.setPropertyValue(
+      topProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 4,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Container(
+    padding: EdgeInsets.symmetric(vertical: 4),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_hasPadding_change_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Padding(
+    padding: EdgeInsets.only(left: 1, right: 3),
+    child: Text(''),
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 11,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Padding(
+    padding: EdgeInsets.only(left: 11, right: 3),
+    child: Text(''),
+  );
+}
+''');
+  }
+
+  test_write_noContainer_add_only() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Column(
+    children: [
+      Text(''),
+    ],
+  );
+}
+''');
+    var paddingProperty = await _paddingProperty('Text(');
+    var leftProperty = getNestedProperty(paddingProperty, 'left');
+
+    var result = await descriptions.setPropertyValue(
+      leftProperty.id,
+      protocol.FlutterWidgetPropertyValue(
+        doubleValue: 1,
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Column(
+    children: [
+      Container(
+        padding: EdgeInsets.only(left: 1),
+        child: Text(''),
+      ),
+    ],
+  );
+}
+''');
+  }
+
+  Future<protocol.FlutterWidgetProperty> _paddingProperty(
+    String widgetSearch,
+  ) async {
+    var containerProperty = await getWidgetProperty(widgetSearch, 'Container');
+    return getNestedProperty(containerProperty, 'padding');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/flutter/test_all.dart b/pkg/analysis_server/test/src/services/flutter/test_all.dart
new file mode 100644
index 0000000..935e759
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/flutter/test_all.dart
@@ -0,0 +1,15 @@
+// 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_reflective_loader/test_reflective_loader.dart';
+
+import 'container_properties_test.dart' as container_properties;
+import 'widget_descriptions_test.dart' as widget_descriptions;
+
+main() {
+  defineReflectiveSuite(() {
+    container_properties.main();
+    widget_descriptions.main();
+  }, name: 'flutter');
+}
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_description.dart b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
new file mode 100644
index 0000000..4a25d2d
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/flutter/widget_description.dart
@@ -0,0 +1,127 @@
+// 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:convert';
+
+import 'package:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/services/flutter/widget_descriptions.dart';
+import 'package:analysis_server/src/utilities/flutter.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../abstract_single_unit.dart';
+
+@reflectiveTest
+class WidgetDescriptionBase extends AbstractSingleUnitTest {
+  final flutter = Flutter.mobile;
+  final descriptions = WidgetDescriptions();
+
+  void assertExpectedChange(SetPropertyValueResult result, String expected) {
+    expect(result.errorCode, isNull);
+
+    var change = result.change;
+
+    expect(change.edits, hasLength(1));
+    var fileEdit = change.edits[0];
+    expect(fileEdit.file, testAnalysisResult.path);
+
+    var actual = SourceEdit.applySequence(
+      testAnalysisResult.content,
+      fileEdit.edits,
+    );
+    expect(actual, expected);
+  }
+
+  void assertPropertyJsonText(
+    protocol.FlutterWidgetProperty property,
+    String expected,
+  ) {
+    var json = property.toJson();
+    _removeNotInterestingElements(json);
+
+    var actual = JsonEncoder.withIndent('  ').convert(json);
+
+    expected = expected.trimRight();
+    if (actual != expected) {
+      print('-----');
+      print(actual);
+      print('-----');
+    }
+    expect(actual, expected);
+  }
+
+  Future<protocol.FlutterGetWidgetDescriptionResult> getDescription(
+      String search) async {
+    var content = testAnalysisResult.content;
+
+    var offset = content.indexOf(search);
+    if (offset == -1) {
+      fail('Not found: $search');
+    }
+
+    if (content.indexOf(search, offset + search.length) != -1) {
+      fail('More than one: $search');
+    }
+
+    return descriptions.getDescription(testAnalysisResult, offset);
+  }
+
+  protocol.FlutterWidgetProperty getNestedProperty(
+      protocol.FlutterWidgetProperty parentProperty, String name) {
+    var nestedProperties = parentProperty.children;
+    return nestedProperties.singleWhere(
+      (property) => property.name == name,
+    );
+  }
+
+  Future<protocol.FlutterWidgetProperty> getWidgetProperty(
+      String widgetSearch, String name) async {
+    var widgetDescription = await getDescription(widgetSearch);
+    expect(widgetDescription, isNotNull);
+
+    var properties = widgetDescription.properties;
+    return properties.singleWhere(
+      (property) => property.name == name,
+    );
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    addFlutterPackage();
+  }
+
+  void _removeNotInterestingElements(Map<String, dynamic> json) {
+    json.remove('documentation');
+
+    var id = json.remove('id') as int;
+    expect(id, isNotNull);
+
+    Object editor = json['editor'];
+    if (editor is Map<String, dynamic>) {
+      if (editor['kind'] == 'ENUM' || editor['kind'] == 'ENUM_LIKE') {
+        Object items = editor['enumItems'];
+        if (items is List<Map<String, dynamic>>) {
+          for (var item in items) {
+            item.remove('documentation');
+          }
+        }
+      }
+    }
+
+    Object value = json['value'];
+    if (value is Map<String, dynamic>) {
+      Object enumItem = value['enumValue'];
+      if (enumItem is Map<String, dynamic>) {
+        enumItem.remove('documentation');
+      }
+    }
+
+    Object children = json['children'];
+    if (children is List<Map<String, dynamic>>) {
+      children.forEach(_removeNotInterestingElements);
+    }
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
new file mode 100644
index 0000000..8fe158f
--- /dev/null
+++ b/pkg/analysis_server/test/src/services/flutter/widget_descriptions_test.dart
@@ -0,0 +1,823 @@
+// 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:analysis_server/protocol/protocol_generated.dart' as protocol;
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'widget_description.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(GetDescriptionTest);
+    defineReflectiveTests(SetPropertyValueSelfTest);
+  });
+}
+
+@reflectiveTest
+class GetDescriptionTest extends WidgetDescriptionBase {
+  test_kind_named_notSet() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'softWrap');
+    expect(property.documentation, startsWith('Whether the text should'));
+    assertPropertyJsonText(property, r'''
+{
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "softWrap",
+  "children": [],
+  "editor": {
+    "kind": "BOOL"
+  }
+}
+''');
+  }
+
+  test_kind_named_set() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa', softWrap: true);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'softWrap');
+    expect(property.documentation, startsWith('Whether the text should'));
+    assertPropertyJsonText(property, r'''
+{
+  "expression": "true",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "softWrap",
+  "children": [],
+  "editor": {
+    "kind": "BOOL"
+  },
+  "value": {
+    "boolValue": true
+  }
+}
+''');
+  }
+
+  test_kind_required() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'data');
+    expect(property.documentation, startsWith('The text to display.'));
+    assertPropertyJsonText(property, r'''
+{
+  "expression": "'aaa'",
+  "isRequired": true,
+  "isSafeToUpdate": true,
+  "name": "data",
+  "children": [],
+  "editor": {
+    "kind": "STRING"
+  },
+  "value": {
+    "stringValue": "aaa"
+  }
+}
+''');
+  }
+
+  test_nested_notSet() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('');
+}
+''');
+    var styleProperty = await getWidgetProperty('Text(', 'style');
+
+    var fontSizeProperty = getNestedProperty(styleProperty, 'fontSize');
+    assertPropertyJsonText(fontSizeProperty, r'''
+{
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "fontSize",
+  "children": [],
+  "editor": {
+    "kind": "DOUBLE"
+  }
+}
+''');
+  }
+
+  test_nested_set() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', style: TextStyle(fontSize: 24));
+}
+''');
+    var styleProperty = await getWidgetProperty('Text(', 'style');
+
+    var fontSizeProperty = getNestedProperty(styleProperty, 'fontSize');
+    assertPropertyJsonText(fontSizeProperty, r'''
+{
+  "expression": "24",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "fontSize",
+  "children": [],
+  "editor": {
+    "kind": "DOUBLE"
+  },
+  "value": {
+    "intValue": 24
+  }
+}
+''');
+
+    var fontStyleProperty = getNestedProperty(styleProperty, 'fontStyle');
+    assertPropertyJsonText(fontStyleProperty, r'''
+{
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "fontStyle",
+  "children": [],
+  "editor": {
+    "kind": "ENUM",
+    "enumItems": [
+      {
+        "libraryUri": "package:ui/ui.dart",
+        "className": "FontStyle",
+        "name": "normal"
+      },
+      {
+        "libraryUri": "package:ui/ui.dart",
+        "className": "FontStyle",
+        "name": "italic"
+      }
+    ]
+  }
+}
+''');
+  }
+
+  test_notInstanceCreation() async {
+    await resolveTestUnit('''
+void main() {
+  42;
+}
+''');
+    var description = await getDescription('42');
+    expect(description, isNull);
+  }
+
+  test_type_double() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'textScaleFactor');
+    assertPropertyJsonText(property, r'''
+{
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "textScaleFactor",
+  "children": [],
+  "editor": {
+    "kind": "DOUBLE"
+  }
+}
+''');
+  }
+
+  test_type_enum() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', overflow: TextOverflow.fade);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'overflow');
+
+    expect(
+      property.toJson()['editor']['enumItems'][0]['documentation'],
+      startsWith('Clip the overflowing'),
+    );
+
+    assertPropertyJsonText(property, r'''
+{
+  "expression": "TextOverflow.fade",
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "overflow",
+  "children": [],
+  "editor": {
+    "kind": "ENUM",
+    "enumItems": [
+      {
+        "libraryUri": "package:flutter/src/rendering/paragraph.dart",
+        "className": "TextOverflow",
+        "name": "clip"
+      },
+      {
+        "libraryUri": "package:flutter/src/rendering/paragraph.dart",
+        "className": "TextOverflow",
+        "name": "fade"
+      },
+      {
+        "libraryUri": "package:flutter/src/rendering/paragraph.dart",
+        "className": "TextOverflow",
+        "name": "ellipsis"
+      },
+      {
+        "libraryUri": "package:flutter/src/rendering/paragraph.dart",
+        "className": "TextOverflow",
+        "name": "visible"
+      }
+    ]
+  },
+  "value": {
+    "enumValue": {
+      "libraryUri": "package:flutter/src/rendering/paragraph.dart",
+      "className": "TextOverflow",
+      "name": "fade"
+    }
+  }
+}
+''');
+  }
+
+  test_type_int() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+    assertPropertyJsonText(property, r'''
+{
+  "isRequired": false,
+  "isSafeToUpdate": true,
+  "name": "maxLines",
+  "children": [],
+  "editor": {
+    "kind": "INT"
+  }
+}
+''');
+  }
+
+  test_unresolvedInstanceCreation() async {
+    verifyNoTestUnitErrors = false;
+    await resolveTestUnit('''
+void main() {
+  new Foo();
+}
+''');
+    var description = await getDescription('Foo');
+    expect(description, isNull);
+  }
+}
+
+@reflectiveTest
+class SetPropertyValueSelfTest extends WidgetDescriptionBase {
+  test_expression() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(expression: '1 + 2'),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1 + 2);
+}
+''');
+  }
+
+  test_format_dontFormatOther() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void functionbefore() {
+  1 +  2; // two spaces
+}
+
+void main() {
+  Text('', );
+}
+
+void functionAfter() {
+  1 +  2; // two spaces
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void functionbefore() {
+  1 +  2; // two spaces
+}
+
+void main() {
+  Text(
+    '',
+    maxLines: 42,
+  );
+}
+
+void functionAfter() {
+  1 +  2; // two spaces
+}
+''');
+  }
+
+  test_invalidId() async {
+    await resolveTestUnit('');
+
+    var result = await descriptions.setPropertyValue(42, null);
+
+    expect(
+      result.errorCode,
+      protocol.RequestErrorCode.FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID,
+    );
+    expect(result.change, isNull);
+  }
+
+  test_named_addValue_beforeChild() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    child: Text(''),
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int xxx = 0, @required Widget child});
+}
+''');
+    var property = await getWidgetProperty('MyWidget<int>', 'xxx');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    xxx: 42,
+    child: Text(''),
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int xxx = 0, @required Widget child});
+}
+''');
+  }
+
+  test_named_addValue_beforeChildren() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    children: [Text('')],
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int xxx = 0, @required List<Widget> children});
+}
+''');
+    var property = await getWidgetProperty('MyWidget<int>', 'xxx');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    xxx: 42,
+    children: [Text('')],
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int xxx = 0, @required List<Widget> children});
+}
+''');
+  }
+
+  test_named_addValue_hasComma() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', );
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    maxLines: 42,
+  );
+}
+''');
+  }
+
+  test_named_addValue_noComma() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    maxLines: 42,
+  );
+}
+''');
+  }
+
+  test_named_addValue_sortedByName_first() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    bbb: 2,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0});
+}
+''');
+    var property = await getWidgetProperty('MyWidget<int>', 'aaa');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    aaa: 42,
+    bbb: 2,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0});
+}
+''');
+  }
+
+  test_named_addValue_sortedByName_last() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    aaa: 1,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0});
+}
+''');
+    var property = await getWidgetProperty('MyWidget<int>', 'bbb');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    aaa: 1,
+    bbb: 42,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0});
+}
+''');
+  }
+
+  test_named_addValue_sortedByName_middle() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    aaa: 1,
+    ccc: 3,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0, int ccc = 0});
+}
+''');
+    var property = await getWidgetProperty('MyWidget<int>', 'bbb');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  MyWidget<int>(
+    aaa: 1,
+    bbb: 42,
+    ccc: 3,
+  );
+}
+
+class MyWidget<T> {
+  MyWidget({int aaa = 0, int bbb = 0, int ccc = 0});
+}
+''');
+  }
+
+  test_named_changeValue() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(intValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 42);
+}
+''');
+  }
+
+  test_named_removeValue_last() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1,);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(property.id, null);
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', );
+}
+''');
+  }
+
+  test_named_removeValue_notLast() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', maxLines: 1, softWrap: true,);
+}
+''');
+    var property = await getWidgetProperty('Text(', 'maxLines');
+
+    var result = await descriptions.setPropertyValue(property.id, null);
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', softWrap: true,);
+}
+''');
+  }
+
+  test_nested_addValue() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', style: TextStyle(), );
+}
+''');
+    var styleProperty = await getWidgetProperty('Text(', 'style');
+
+    var fontSizeProperty = getNestedProperty(styleProperty, 'fontSize');
+
+    var result = await descriptions.setPropertyValue(
+      fontSizeProperty.id,
+      protocol.FlutterWidgetPropertyValue(doubleValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    style: TextStyle(
+      fontSize: 42,
+    ),
+  );
+}
+''');
+  }
+
+  test_nested_addValue_materialize() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('', );
+}
+''');
+    var styleProperty = await getWidgetProperty('Text(', 'style');
+
+    var fontSizeProperty = getNestedProperty(styleProperty, 'fontSize');
+
+    var result = await descriptions.setPropertyValue(
+      fontSizeProperty.id,
+      protocol.FlutterWidgetPropertyValue(doubleValue: 42),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    style: TextStyle(
+      fontSize: 42,
+    ),
+  );
+}
+''');
+  }
+
+  test_required_changeValue() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'data');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(stringValue: 'bbbb'),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('bbbb');
+}
+''');
+  }
+
+  test_required_removeValue() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('aaa');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'data');
+
+    var result = await descriptions.setPropertyValue(property.id, null);
+
+    expect(
+      result.errorCode,
+      protocol.RequestErrorCode.FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED,
+    );
+    expect(result.change, isNull);
+  }
+
+  test_type_enum_addValue() async {
+    await resolveTestUnit('''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text('');
+}
+''');
+    var property = await getWidgetProperty('Text(', 'overflow');
+
+    var result = await descriptions.setPropertyValue(
+      property.id,
+      protocol.FlutterWidgetPropertyValue(
+        enumValue: protocol.FlutterWidgetPropertyValueEnumItem(
+          'package:flutter/src/rendering/paragraph.dart',
+          'TextOverflow',
+          'ellipsis',
+        ),
+      ),
+    );
+
+    assertExpectedChange(result, r'''
+import 'package:flutter/material.dart';
+
+void main() {
+  Text(
+    '',
+    overflow: TextOverflow.ellipsis,
+  );
+}
+''');
+  }
+}
diff --git a/pkg/analysis_server/test/src/services/test_all.dart b/pkg/analysis_server/test/src/services/test_all.dart
index 46f575f..cc3293f 100644
--- a/pkg/analysis_server/test/src/services/test_all.dart
+++ b/pkg/analysis_server/test/src/services/test_all.dart
@@ -5,9 +5,11 @@
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'correction/test_all.dart' as correction_all;
+import 'flutter/test_all.dart' as flutter_all;
 
 main() {
   defineReflectiveSuite(() {
     correction_all.main();
+    flutter_all.main();
   }, name: 'services');
 }
diff --git a/pkg/analysis_server/test/src/utilities/flutter_util.dart b/pkg/analysis_server/test/src/utilities/flutter_util.dart
deleted file mode 100644
index 5eb623f..0000000
--- a/pkg/analysis_server/test/src/utilities/flutter_util.dart
+++ /dev/null
@@ -1,381 +0,0 @@
-// 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 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-
-const String flutterPkgLibPath = '/packages/flutter/lib';
-
-/**
- * Add some Flutter libraries and types to the given [provider] and return
- * the `lib` folder.
- */
-Folder configureFlutterPackage(MemoryResourceProvider provider) {
-  File newFile(String path, String content) =>
-      provider.newFile(provider.convertPath(path), content ?? '');
-
-  Folder newFolder(String path) =>
-      provider.newFolder(provider.convertPath(path));
-
-  newFile('$flutterPkgLibPath/material.dart', r'''
-export 'widgets.dart';
-export 'src/material/app_bar.dart';
-export 'src/material/gesture_detector.dart';
-export 'src/material/icons.dart';
-export 'src/material/scaffold.dart';
-''');
-
-  newFile('$flutterPkgLibPath/widgets.dart', r'''
-export 'src/widgets/async.dart';
-export 'src/widgets/basic.dart';
-export 'src/widgets/container.dart';
-export 'src/widgets/framework.dart';
-export 'src/widgets/icon.dart';
-export 'src/widgets/text.dart';
-''');
-
-  newFile('$flutterPkgLibPath/foundation.dart', r'''
-export 'package:meta/meta.dart' show
-  required;
-
-export 'src/foundation/key.dart';
-''');
-
-  void createSrcMaterial() {
-    newFile('$flutterPkgLibPath/src/material/app_bar.dart', r'''
-import 'package:flutter/widgets.dart';
-
-class AppBar extends StatefulWidget {
-  AppBar({
-    Key key,
-    title,
-    backgroundColor,
-  });
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/material/icons.dart', r'''
-import 'package:flutter/widgets.dart';
-
-class Icons {
-  static const IconData alarm =
-      const IconData(0xe855, fontFamily: 'MaterialIcons');
-  static const IconData book =
-      const IconData(0xe865, fontFamily: 'MaterialIcons');
-  Icons._();
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/material/scaffold.dart', r'''
-import 'package:flutter/widgets.dart';
-
-class Scaffold extends StatefulWidget {
-  const Scaffold({
-    Key key,
-    Widget body,
-  });
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/material/gesture_detector.dart', r'''
-import 'package:flutter/widgets.dart';
-
-class GestureDetector extends StatelessWidget {
-  GestureDetector({
-    Key key,
-    Widget child,
-    onTap,
-  });
-}
-''');
-  }
-
-  void createRendering() {
-    newFile('$flutterPkgLibPath/rendering.dart', r'''
-export 'painting.dart';
-export 'src/rendering/flex.dart';
-''');
-    newFile('$flutterPkgLibPath/src/rendering/flex.dart', r'''
-enum CrossAxisAlignment {
-  start,
-  end,
-  center,
-  stretch,
-  baseline,
-}
-''');
-  }
-
-  void createPainting() {
-    newFile('$flutterPkgLibPath/painting.dart', r'''
-export 'src/painting/edge_insets.dart';
-''');
-
-    newFile('$flutterPkgLibPath/src/painting/edge_insets.dart', r'''
-abstract class EdgeInsetsGeometry {
-  const EdgeInsetsGeometry();
-}
-
-class EdgeInsets extends EdgeInsetsGeometry {
-  const EdgeInsets.fromLTRB(this.left, this.top, this.right, this.bottom);
-
-  const EdgeInsets.all(double value)
-      : left = value, top = value, right = value, bottom = value;
-
-  const EdgeInsets.only({
-    this.left: 0.0,
-    this.top: 0.0,
-    this.right: 0.0,
-    this.bottom: 0.0
-  });
-
-  const EdgeInsets.symmetric({ double vertical: 0.0,
-                             double horizontal: 0.0 })
-    : left = horizontal, top = vertical, right = horizontal, bottom = vertical;
-}
-''');
-  }
-
-  void createSrcFoundation() {
-    newFile('$flutterPkgLibPath/src/foundation/key.dart', r'''
-
-abstract class Key {
-  const factory Key(String value) = ValueKey<String>;
-
-  const Key._();
-}
-
-abstract class LocalKey extends Key {
-  const LocalKey() : super._();
-}
-
-
-class ValueKey<T> extends LocalKey {
-  final T value;
-
-  const ValueKey(this.value);
-}
-''');
-  }
-
-  void createSrcWidgets() {
-    newFile('$flutterPkgLibPath/src/widgets/async.dart', r'''
-import 'framework.dart';
-
-class AsyncSnapshot<T> {}
-
-typedef AsyncWidgetBuilder<T> = Widget Function(BuildContext context, AsyncSnapshot<T> snapshot);
-
-class StreamBuilder<T> {
-  const StreamBuilder({
-    Key key,
-    this.initialData,
-    Stream<T> stream,
-    @required this.builder
-  });
-  final T initialData;
-  final AsyncWidgetBuilder<T> builder;
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/widgets/basic.dart', r'''
-import 'package:flutter/rendering.dart';
-
-import 'framework.dart';
-
-export 'package:flutter/painting.dart';
-export 'package:flutter/rendering.dart';
-
-class Center extends StatelessWidget {
-  const Center({Key key, double heightFactor, Widget child});
-}
-
-class Column extends Flex {
-  Column({
-    Key key,
-    CrossAxisAlignment crossAxisAlignment: CrossAxisAlignment.center,
-    List<Widget> children: const <Widget>[],
-  });
-}
-
-class Row extends Flex {
-  Row({
-    Key key,
-    List<Widget> children: const <Widget>[],
-  });
-}
-
-class Flex extends Widget {
-  Flex({
-    Key key,
-    List<Widget> children: const <Widget>[],
-  });
-}
-
-class ClipRect extends SingleChildRenderObjectWidget {
-  const ClipRect({Key key, Widget child}) :
-    super(key: key, child: child);
-    
-  /// Does not actually exist in Flutter.
-  const ClipRect.rect({Key key, Widget child}) :
-    super(key: key, child: child);
-}
-
-class Transform extends SingleChildRenderObjectWidget {
-  const Transform({
-    Key key,
-    @required transform,
-    origin,
-    alignment,
-    transformHitTests: true,
-    Widget child,
-  });
-}
-
-class AspectRatio extends SingleChildRenderObjectWidget {
-  const AspectRatio({
-    Key key,
-    @required double aspectRatio,
-    Widget child,
-  });
-}
-
-class Padding extends SingleChildRenderObjectWidget {
-  final EdgeInsetsGeometry padding;
-
-  const Padding({
-    Key key,
-    this.padding,
-    Widget child,
-  });
-}
-
-class Expanded extends StatelessWidget {
-  const Expanded({
-    Key key,
-    int flex: 1,
-    @required Widget child,
-  });
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/widgets/container.dart', r'''
-import 'framework.dart';
-
-class Container extends StatelessWidget {
-  final Widget child;
-  Container({
-    Key key,
-    double width,
-    double height,
-    this.child,
-  })
-      : super(key: key);
-
-  @override
-  Widget build(BuildContext context) => child;
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/widgets/framework.dart', r'''
-import 'package:flutter/foundation.dart';
-
-export 'package:flutter/foundation.dart' show required;
-export 'package:flutter/foundation.dart' show Key, LocalKey, ValueKey;
-
-typedef void VoidCallback();
-
-abstract class BuildContext {
-  Widget get widget;
-}
-
-abstract class State<T extends StatefulWidget> {
-  BuildContext get context => null;
-
-  T get widget => null;
-
-  Widget build(BuildContext context) {}
-
-  void dispose() {}
-
-  void setState(VoidCallback fn) {}
-}
-
-abstract class StatefulWidget extends Widget {
-  const StatefulWidget({Key key}) : super(key: key);
-
-  State createState() => null
-}
-
-abstract class StatelessWidget extends Widget {
-  const StatelessWidget({Key key}) : super(key: key);
-
-  Widget build(BuildContext context) => null;
-}
-
-class Widget {
-  final Key key;
-
-  const Widget({this.key});
-}
-
-abstract class SingleChildRenderObjectWidget extends RenderObjectWidget {
-  final Widget child;
-
-  const SingleChildRenderObjectWidget({Key key, this.child}) : super(key: key);
-}
-
-abstract class RenderObjectWidget extends Widget {
-  const RenderObjectWidget({Key key}) : super(key: key);
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/widgets/icon.dart', r'''
-import 'framework.dart';
-
-class Icon extends StatelessWidget {
-  final IconData icon;
-  const Icon(
-    this.icon, {
-    Key key,
-  })
-      : super(key: key);
-}
-
-class IconData {
-  final int codePoint;
-  final String fontFamily;
-  const IconData(
-    this.codePoint, {
-    this.fontFamily,
-  });
-}
-''');
-
-    newFile('$flutterPkgLibPath/src/widgets/text.dart', r'''
-import 'framework.dart';
-
-class DefaultTextStyle extends StatelessWidget {
-  DefaultTextStyle({Widget child});
-}
-
-class Text extends StatelessWidget {
-  final String data;
-  const Text(
-    this.data, {
-    Key key,
-  })
-      : super(key: key);
-}
-''');
-  }
-
-  createSrcFoundation();
-  createPainting();
-  createRendering();
-  createSrcWidgets();
-  createSrcMaterial();
-
-  return newFolder(flutterPkgLibPath);
-}
diff --git a/pkg/analysis_server/test/src/utilities/meta_util.dart b/pkg/analysis_server/test/src/utilities/meta_util.dart
deleted file mode 100644
index 2fc9cff..0000000
--- a/pkg/analysis_server/test/src/utilities/meta_util.dart
+++ /dev/null
@@ -1,128 +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/file_system/file_system.dart';
-import 'package:analyzer/file_system/memory_file_system.dart';
-
-const String metaPkgLibPath = '/packages/meta/lib';
-
-/**
- * Add a meta library and types to the given [provider] and return
- * the `lib` folder.
- */
-Folder configureMetaPackage(MemoryResourceProvider provider) {
-  File newFile(String path, String content) =>
-      provider.newFile(provider.convertPath(path), content ?? '');
-
-  Folder newFolder(String path) =>
-      provider.newFolder(provider.convertPath(path));
-
-  newFile('$metaPkgLibPath/meta.dart', r'''
-library meta;
-
-const _AlwaysThrows alwaysThrows = const _AlwaysThrows();
-
-@deprecated
-const _Checked checked = const _Checked();
-
-const _Experimental experimental = const _Experimental();
-
-const _Factory factory = const _Factory();
-
-const Immutable immutable = const Immutable();
-
-const _IsTest isTest = const _IsTest();
-
-const _IsTestGroup isTestGroup = const _IsTestGroup();
-
-const _Literal literal = const _Literal();
-
-const _MustCallSuper mustCallSuper = const _MustCallSuper();
-
-const _OptionalTypeArgs optionalTypeArgs = const _OptionalTypeArgs();
-
-const _Protected protected = const _Protected();
-
-const Required required = const Required();
-
-const _Sealed sealed = const _Sealed();
-
-@deprecated
-const _Virtual virtual = const _Virtual();
-
-const _VisibleForOverriding visibleForOverriding =
-    const _VisibleForOverriding();
-
-const _VisibleForTesting visibleForTesting = const _VisibleForTesting();
-
-class Immutable {
-  final String reason;
-  const Immutable([this.reason]);
-}
-
-class Required {
-  final String reason;
-  const Required([this.reason]);
-}
-
-class _AlwaysThrows {
-  const _AlwaysThrows();
-}
-
-class _Checked {
-  const _Checked();
-}
-
-class _Experimental {
-  const _Experimental();
-}
-
-class _Factory {
-  const _Factory();
-}
-
-class _IsTest {
-  const _IsTest();
-}
-
-class _IsTestGroup {
-  const _IsTestGroup();
-}
-
-class _Literal {
-  const _Literal();
-}
-
-class _MustCallSuper {
-  const _MustCallSuper();
-}
-
-class _OptionalTypeArgs {
-  const _OptionalTypeArgs();
-}
-
-class _Protected {
-  const _Protected();
-}
-
-class _Sealed {
-  const _Sealed();
-}
-
-@deprecated
-class _Virtual {
-  const _Virtual();
-}
-
-class _VisibleForOverriding {
-  const _VisibleForOverriding();
-}
-
-class _VisibleForTesting {
-  const _VisibleForTesting();
-}
-''');
-
-  return newFolder(metaPkgLibPath);
-}
diff --git a/pkg/analysis_server/test/src/utilities/mock_packages.dart b/pkg/analysis_server/test/src/utilities/mock_packages.dart
new file mode 100644
index 0000000..929127f
--- /dev/null
+++ b/pkg/analysis_server/test/src/utilities/mock_packages.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:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:front_end/src/testing/package_root.dart' as package_root;
+
+/// Helper for copying files from "tests/mock_packages" to memory file system.
+class MockPackages {
+  static final MockPackages instance = MockPackages._();
+
+  /// The mapping from relative Posix paths of files to the file contents.
+  Map<String, String> _cachedFiles = {};
+
+  MockPackages._() {
+    _cacheFiles();
+  }
+
+  Folder addFlutter(MemoryResourceProvider provider) {
+    var packageFolder = _addFiles(provider, 'flutter');
+    return packageFolder.getChildAssumingFolder('lib');
+  }
+
+  Folder addMeta(MemoryResourceProvider provider) {
+    var packageFolder = _addFiles(provider, 'meta');
+    return packageFolder.getChildAssumingFolder('lib');
+  }
+
+  Folder addUI(MemoryResourceProvider provider) {
+    var packageFolder = _addFiles(provider, 'ui');
+    return packageFolder.getChildAssumingFolder('lib');
+  }
+
+  /// Add files of the given [packageName] to the [provider].
+  Folder _addFiles(MemoryResourceProvider provider, String packageName) {
+    var packagesPath = provider.convertPath('/packages');
+
+    for (var relativePosixPath in _cachedFiles.keys) {
+      var relativePathComponents = relativePosixPath.split('/');
+      if (relativePathComponents[0] == packageName) {
+        var relativePath = provider.pathContext.joinAll(relativePathComponents);
+        var path = provider.pathContext.join(packagesPath, relativePath);
+        var content = _cachedFiles[relativePosixPath];
+        provider.newFile(path, content);
+      }
+    }
+
+    var packagesFolder = provider.getFolder(packagesPath);
+    return packagesFolder.getChildAssumingFolder(packageName);
+  }
+
+  void _cacheFiles() {
+    var resourceProvider = PhysicalResourceProvider.INSTANCE;
+    var pathContext = resourceProvider.pathContext;
+    var packageRoot = pathContext.normalize(package_root.packageRoot);
+    var mockPath = pathContext.join(
+      packageRoot,
+      'analysis_server',
+      'test',
+      'mock_packages',
+    );
+
+    void addFiles(Resource resource) {
+      if (resource is Folder) {
+        resource.getChildren().forEach(addFiles);
+      } else if (resource is File) {
+        var relativePath = pathContext.relative(
+          resource.path,
+          from: mockPath,
+        );
+        var relativePathComponents = pathContext.split(relativePath);
+        var relativePosixPath = relativePathComponents.join('/');
+        _cachedFiles[relativePosixPath] = resource.readAsStringSync();
+      }
+    }
+
+    addFiles(
+      resourceProvider.getFolder(mockPath),
+    );
+  }
+}
diff --git a/pkg/analysis_server/test/stress/completion/completion.dart b/pkg/analysis_server/test/stress/completion/completion.dart
index 81ebf7a..171563d 100644
--- a/pkg/analysis_server/test/stress/completion/completion.dart
+++ b/pkg/analysis_server/test/stress/completion/completion.dart
@@ -89,7 +89,7 @@
   if (result.wasParsed('help')) {
     printUsage(parser);
     return false;
-  } else if (result.rest.length < 1) {
+  } else if (result.rest.isEmpty) {
     printUsage(parser, error: 'Missing path to files');
     return false;
   } else if (result.rest.length > 1) {
diff --git a/pkg/analysis_server/test/stress/completion/completion_runner.dart b/pkg/analysis_server/test/stress/completion/completion_runner.dart
index 41a69b8..e29ce89 100644
--- a/pkg/analysis_server/test/stress/completion/completion_runner.dart
+++ b/pkg/analysis_server/test/stress/completion/completion_runner.dart
@@ -264,7 +264,7 @@
    * Print information about the given [suggestions].
    */
   void _printSuggestions(List<CompletionSuggestion> suggestions) {
-    if (suggestions.length == 0) {
+    if (suggestions.isEmpty) {
       output.writeln('  No suggestions');
       return;
     }
diff --git a/pkg/analysis_server/test/stress/replay/replay.dart b/pkg/analysis_server/test/stress/replay/replay.dart
index f842c5d..965b86b 100644
--- a/pkg/analysis_server/test/stress/replay/replay.dart
+++ b/pkg/analysis_server/test/stress/replay/replay.dart
@@ -417,7 +417,7 @@
       }
     } finally {
       // Ensure that the repository is left at the most recent commit.
-      if (history.commitIds.length > 0) {
+      if (history.commitIds.isNotEmpty) {
         repository.checkout(history.commitIds[0]);
       }
     }
diff --git a/pkg/analysis_server/test/stress/utilities/server.dart b/pkg/analysis_server/test/stress/utilities/server.dart
index c845787..e15c8a8 100644
--- a/pkg/analysis_server/test/stress/utilities/server.dart
+++ b/pkg/analysis_server/test/stress/utilities/server.dart
@@ -606,12 +606,12 @@
    * APIs.
    */
   Future<void> start(
-      {bool checked: true,
+      {bool checked = true,
       int diagnosticPort,
-      bool profileServer: false,
+      bool profileServer = false,
       String sdkPath,
       int servicesPort,
-      bool useAnalysisHighlight2: false}) async {
+      bool useAnalysisHighlight2 = false}) async {
     if (_process != null) {
       throw new Exception('Process already started');
     }
diff --git a/pkg/analysis_server/test/timing/timing_framework.dart b/pkg/analysis_server/test/timing/timing_framework.dart
index d02e6f0..35c5f2e 100644
--- a/pkg/analysis_server/test/timing/timing_framework.dart
+++ b/pkg/analysis_server/test/timing/timing_framework.dart
@@ -89,12 +89,12 @@
    */
   double computeStandardDeviation(List<int> values) {
     int count = values.length;
-    double sumOfValues = 0.0;
+    double sumOfValues = 0;
     for (int i = 0; i < count; i++) {
       sumOfValues += values[i];
     }
     double average = sumOfValues / count;
-    double sumOfDiffSquared = 0.0;
+    double sumOfDiffSquared = 0;
     for (int i = 0; i < count; i++) {
       double diff = values[i] - average;
       sumOfDiffSquared += diff * diff;
diff --git a/pkg/analysis_server/test/verify_tests_test.dart b/pkg/analysis_server/test/verify_tests_test.dart
index 4373181..e11636e 100644
--- a/pkg/analysis_server/test/verify_tests_test.dart
+++ b/pkg/analysis_server/test/verify_tests_test.dart
@@ -19,9 +19,13 @@
   String analysisServerPath =
       provider.pathContext.join(packageRoot, 'analysis_server');
   String testDirPath = provider.pathContext.join(analysisServerPath, 'test');
+  String mocksDirPath = provider.pathContext.join(testDirPath, 'mock_packages');
 
   AnalysisContextCollection collection = new AnalysisContextCollection(
-      includedPaths: <String>[testDirPath], resourceProvider: provider);
+    resourceProvider: provider,
+    includedPaths: <String>[testDirPath],
+    excludedPaths: <String>[mocksDirPath],
+  );
   List<AnalysisContext> contexts = collection.contexts;
   if (contexts.length != 1) {
     fail('The test directory contains multiple analysis contexts.');
diff --git a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
index 907f16c..d133c0f 100644
--- a/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
+++ b/pkg/analysis_server/tool/instrumentation/page/stats_page.dart
@@ -110,7 +110,7 @@
             String id = response.result('id');
             if (id != null) {
               List<NotificationEntry> events = log.completionEventsWithId(id);
-              if (events != null && events.length > 0) {
+              if (events != null && events.isNotEmpty) {
                 completionResponseTimes
                     .add(events[0].timeStamp - entry.timeStamp);
               }
diff --git a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
index c83b0af..5fc29c9 100644
--- a/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
+++ b/pkg/analysis_server/tool/lsp_spec/codegen_dart.dart
@@ -59,7 +59,7 @@
   return formattedCode.trim() + '\n'; // Ensure a single trailing newline.
 }
 
-TypeBase resolveTypeAlias(TypeBase type, {resolveEnumClasses: false}) {
+TypeBase resolveTypeAlias(TypeBase type, {resolveEnumClasses = false}) {
   if (type is Type && _typeAliases.containsKey(type.name)) {
     final alias = _typeAliases[type.name];
     // Only follow the type if we're not an enum, or we wanted to follow enums.
diff --git a/pkg/analysis_server/tool/lsp_spec/generate_all.dart b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
index 870b917..45a4e35 100644
--- a/pkg/analysis_server/tool/lsp_spec/generate_all.dart
+++ b/pkg/analysis_server/tool/lsp_spec/generate_all.dart
@@ -87,7 +87,7 @@
   }
 
   field(String name,
-      {String type, array: false, canBeNull: false, canBeUndefined: false}) {
+      {String type, array = false, canBeNull = false, canBeUndefined = false}) {
     var fieldType =
         array ? ArrayType(Type.identifier(type)) : Type.identifier(type);
 
diff --git a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
index 38c8f2e..b9fbf9e 100644
--- a/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
+++ b/pkg/analysis_server/tool/lsp_spec/lsp_specification.md
@@ -331,7 +331,7 @@
 	/**
 	 * The target resource identifier of this link.
 	 */
-	targetUri: string;
+	targetUri: DocumentUri;
 
 	/**
 	 * The full target range of this link. If the target for example is a symbol then target range is the
@@ -529,7 +529,7 @@
 	/**
 	 * The resource to create.
 	 */
-	uri: string;
+	uri: DocumentUri;
 	/**
 	 * Additional options
 	 */
@@ -561,11 +561,11 @@
 	/**
 	 * The old (existing) location.
 	 */
-	oldUri: string;
+	oldUri: DocumentUri;
 	/**
 	 * The new location.
 	 */
-	newUri: string;
+	newUri: DocumentUri;
 	/**
 	 * Rename options.
 	 */
@@ -597,7 +597,7 @@
 	/**
 	 * The file to delete.
 	 */
-	uri: string;
+	uri: DocumentUri;
 	/**
 	 * Delete options.
 	 */
@@ -614,7 +614,7 @@
 	/**
 	 * Holds changes to existing resources.
 	 */
-	changes?: { [uri: string]: TextEdit[]; };
+	changes?: { [uri: DocumentUri]: TextEdit[]; };
 
 	/**
 	 * Depending on the client capability `workspace.workspaceEdit.resourceOperations` document changes
@@ -1001,14 +1001,14 @@
 	export const Abort: FailureHandlingKind = 'abort';
 
 	/**
-	 * All operations are executed transactional. That means they either all
+	 * All operations are executed transactionally. That means they either all
 	 * succeed or no changes at all are applied to the workspace.
 	 */
 	export const Transactional: FailureHandlingKind = 'transactional';
 
 
 	/**
-	 * If the workspace edit contains only textual file changes they are executed transactional.
+	 * If the workspace edit contains only textual file changes they are executed transactionally.
 	 * If resource changes (create, rename or delete file) are part of the change the failure
 	 * handling strategy is abort.
 	 */
@@ -1016,7 +1016,7 @@
 
 	/**
 	 * The client tries to undo the operations already executed. But there is no
-	 * guarantee that this is succeeding.
+	 * guarantee that this succeeds.
 	 */
 	export const Undo: FailureHandlingKind = 'undo';
 }
@@ -1952,7 +1952,7 @@
 
 #### <a href="#shutdown" name="shutdown" class="anchor">Shutdown Request (:leftwards_arrow_with_hook:)</a>
 
-The shutdown request is sent from the client to the server. It asks the server to shut down, but to not exit (otherwise the response might not be delivered correctly to the client). There is a separate exit notification that asks the server to exit. Clients must not sent any notifications other than `exit` or requests to a server to which they have sent a shutdown requests. If a server receives requests after a shutdown request those requests should be errored with `InvalidRequest`.
+The shutdown request is sent from the client to the server. It asks the server to shut down, but to not exit (otherwise the response might not be delivered correctly to the client). There is a separate exit notification that asks the server to exit. Clients must not send any notifications other than `exit` or requests to a server to which they have sent a shutdown requests. If a server receives requests after a shutdown request those requests should be errored with `InvalidRequest`.
 
 _Request_:
 * method: 'shutdown'
@@ -2239,7 +2239,7 @@
 	/**
 	 * The associated URI for this workspace folder.
 	 */
-	uri: string;
+	uri: DocumentUri;
 
 	/**
 	 * The name of the workspace folder. Used to refer to this
@@ -2330,7 +2330,7 @@
 	/**
 	 * The scope to get the configuration section for.
 	 */
-	scopeUri?: string;
+	scopeUri?: DocumentUri;
 
 	/**
 	 * The configuration section asked for.
@@ -2971,8 +2971,6 @@
 	 * and a completion item with an `insertText` of `console` is provided it
 	 * will only insert `sole`. Therefore it is recommended to use `textEdit` instead
 	 * since it avoids additional client side interpretation.
-	 *
-	 * @deprecated Use textEdit instead.
 	 */
 	insertText?: string;
 
diff --git a/pkg/analysis_server/tool/spec/api.dart b/pkg/analysis_server/tool/spec/api.dart
index 6e98267..9148da5 100644
--- a/pkg/analysis_server/tool/spec/api.dart
+++ b/pkg/analysis_server/tool/spec/api.dart
@@ -466,7 +466,7 @@
   final Object value;
 
   TypeObjectField(this.name, this.type, dom.Element html,
-      {this.optional: false, this.value, bool experimental, bool deprecated})
+      {this.optional = false, this.value, bool experimental, bool deprecated})
       : super(html, experimental, deprecated);
 }
 
diff --git a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
index a8692f1..befdefa 100644
--- a/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analysis_server/tool/spec/codegen_dart_protocol.dart
@@ -1042,6 +1042,8 @@
             return new FromJsonFunction('jsonDecoder.decodeString');
           case 'bool':
             return new FromJsonFunction('jsonDecoder.decodeBool');
+          case 'double':
+            return new FromJsonFunction('jsonDecoder.decodeDouble');
           case 'int':
           case 'long':
             return new FromJsonFunction('jsonDecoder.decodeInt');
diff --git a/pkg/analysis_server/tool/spec/codegen_java.dart b/pkg/analysis_server/tool/spec/codegen_java.dart
index 6204f68..1e64953 100644
--- a/pkg/analysis_server/tool/spec/codegen_java.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java.dart
@@ -50,6 +50,7 @@
    */
   static const Map<String, String> _typeRenames = const {
     'bool': 'boolean',
+    'double': 'double',
     'int': 'int',
     'AvailableSuggestionRelevanceTag': 'String',
     'ExecutionContextId': 'String',
@@ -126,7 +127,10 @@
   bool isPrimitive(TypeDecl type) {
     if (type is TypeReference) {
       String typeStr = javaType(type);
-      return typeStr == 'boolean' || typeStr == 'int' || typeStr == 'long';
+      return typeStr == 'boolean' ||
+          typeStr == 'double' ||
+          typeStr == 'int' ||
+          typeStr == 'long';
     }
     return false;
   }
@@ -167,6 +171,8 @@
         if (optional) {
           if (typeName == 'boolean') {
             typeName = 'Boolean';
+          } else if (typeName == 'double') {
+            typeName = 'Double';
           } else if (typeName == 'int') {
             typeName = 'Integer';
           }
diff --git a/pkg/analysis_server/tool/spec/codegen_java_types.dart b/pkg/analysis_server/tool/spec/codegen_java_types.dart
index 2cb3562..094ce41 100644
--- a/pkg/analysis_server/tool/spec/codegen_java_types.dart
+++ b/pkg/analysis_server/tool/spec/codegen_java_types.dart
@@ -140,6 +140,8 @@
       return 'getAsString';
     } else if (name == 'boolean' || name == 'Boolean') {
       return 'getAsBoolean';
+    } else if (name == 'double' || name == 'Double') {
+      return 'getAsDouble';
     } else if (name == 'int' || name == 'Integer') {
       return 'getAsInt';
     } else if (name == 'long' || name == 'Long') {
diff --git a/pkg/analysis_server/tool/spec/from_html.dart b/pkg/analysis_server/tool/spec/from_html.dart
index f78ad63..a9e80b6 100644
--- a/pkg/analysis_server/tool/spec/from_html.dart
+++ b/pkg/analysis_server/tool/spec/from_html.dart
@@ -119,7 +119,7 @@
    */
   void checkAttributes(
       dom.Element element, List<String> requiredAttributes, String context,
-      {List<String> optionalAttributes: const []}) {
+      {List<String> optionalAttributes = const []}) {
     Set<String> attributesFound = new Set<String>();
     element.attributes.forEach((name, value) {
       if (!requiredAttributes.contains(name) &&
@@ -526,8 +526,14 @@
     String name = html.attributes['name'];
     context = '$context.${name != null ? name : 'field'}';
     checkAttributes(html, ['name'], context,
-        optionalAttributes: ['optional', 'value', 'deprecated']);
+        optionalAttributes: [
+          'optional',
+          'value',
+          'deprecated',
+          'experimental'
+        ]);
     bool deprecated = html.attributes['deprecated'] == 'true';
+    bool experimental = html.attributes['experimental'] == 'true';
     bool optional = false;
     String optionalString = html.attributes['optional'];
     if (optionalString != null) {
@@ -546,7 +552,10 @@
     String value = html.attributes['value'];
     TypeDecl type = processContentsAsType(html, context);
     return new TypeObjectField(name, type, html,
-        optional: optional, value: value, deprecated: deprecated);
+        optional: optional,
+        value: value,
+        deprecated: deprecated,
+        experimental: experimental);
   }
 
   /**
diff --git a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
index 7249cad..4132f31 100644
--- a/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
+++ b/pkg/analysis_server/tool/spec/generated/java/AnalysisServer.java
@@ -493,12 +493,13 @@
    * @param includedFixes A list of names indicating which fixes should be applied. If a name is
    *         specified that does not match the name of a known fix, an error of type UNKNOWN_FIX will
    *         be generated.
+   * @param includePedanticFixes A flag indicating that "pedantic" fixes should be applied.
    * @param includeRequiredFixes A flag indicating that "required" fixes should be applied.
    * @param excludedFixes A list of names indicating which fixes should not be applied. If a name is
    *         specified that does not match the name of a known fix, an error of type UNKNOWN_FIX will
    *         be generated.
    */
-  public void edit_dartfix(List<String> included, List<String> includedFixes, boolean includeRequiredFixes, List<String> excludedFixes, DartfixConsumer consumer);
+  public void edit_dartfix(List<String> included, List<String> includedFixes, boolean includePedanticFixes, boolean includeRequiredFixes, List<String> excludedFixes, DartfixConsumer consumer);
 
   /**
    * {@code edit.format}
@@ -779,15 +780,17 @@
   public void execution_setSubscriptions(List<String> subscriptions);
 
   /**
-   * {@code flutter.getChangeAddForDesignTimeConstructor}
+   * {@code flutter.getWidgetDescription}
    *
-   * Return the change that adds the forDesignTime() constructor for the widget class at the given
-   * offset.
+   * Return the description of the widget instance at the given location.
    *
-   * @param file The file containing the code of the class.
-   * @param offset The offset of the class in the code.
+   * If the location does not have a support widget, an error of type
+   * FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET will be generated.
+   *
+   * @param file The file where the widget instance is created.
+   * @param offset The offset in the file where the widget instance is created.
    */
-  public void flutter_getChangeAddForDesignTimeConstructor(String file, int offset, GetChangeAddForDesignTimeConstructorConsumer consumer);
+  public void flutter_getWidgetDescription(String file, int offset, GetWidgetDescriptionConsumer consumer);
 
   /**
    * {@code flutter.setSubscriptions}
@@ -819,6 +822,26 @@
   public void flutter_setSubscriptions(Map<String, List<String>> subscriptions);
 
   /**
+   * {@code flutter.setWidgetPropertyValue}
+   *
+   * Set the value of a property, or remove it.
+   *
+   * The server will generate a change that the client should apply to the project to get the value
+   * of the property set to the new value. The complexity of the change might be from updating a
+   * single literal value in the code, to updating multiple files to get libraries imported, and new
+   * intermediate widgets instantiated.
+   *
+   * @param id The identifier of the property, previously returned as a part of a
+   *         FlutterWidgetProperty. An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is
+   *         generated if the identifier is not valid.
+   * @param value The new value to set for the property. If absent, indicates that the property
+   *         should be removed. If the property corresponds to an optional parameter, the
+   *         corresponding named argument is removed. If the property isRequired is true,
+   *         FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
+   */
+  public void flutter_setWidgetPropertyValue(int id, FlutterWidgetPropertyValue value, SetWidgetPropertyValueConsumer consumer);
+
+  /**
    * Return {@code true} if the socket is open.
    */
   public boolean isSocketOpen();
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
index 2ac5f3e..5fe4e7b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/ElementKind.java
@@ -29,6 +29,8 @@
 
   public static final String ENUM_CONSTANT = "ENUM_CONSTANT";
 
+  public static final String EXTENSION = "EXTENSION";
+
   public static final String FIELD = "FIELD";
 
   public static final String FILE = "FILE";
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
index 52029e0..b711d11 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutline.java
@@ -104,46 +104,9 @@
   private final List<FlutterOutline> children;
 
   /**
-   * If the node is a widget, and it is instrumented, the unique identifier of this widget, that can
-   * be used to associate rendering information with this node.
-   */
-  private final Integer id;
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered, even if it does not yet
-   * have the rendering constructor. This field is omitted if the node is not a widget class.
-   */
-  private final Boolean isWidgetClass;
-
-  /**
-   * If the node is a widget class that can be rendered for IDE, the name of the constructor that
-   * should be used to instantiate the widget. Empty string for default constructor. Absent if the
-   * node is not a widget class that can be rendered.
-   */
-  private final String renderConstructor;
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the same file, the name of
-   * the state class.
-   */
-  private final String stateClassName;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class is defined in the same
-   * file, the offset of the state class code in the file.
-   */
-  private final Integer stateOffset;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class is defined in the same
-   * file, the length of the state class code in the file.
-   */
-  private final Integer stateLength;
-
-  /**
    * Constructor for {@link FlutterOutline}.
    */
-  public FlutterOutline(String kind, int offset, int length, int codeOffset, int codeLength, String label, Element dartElement, List<FlutterOutlineAttribute> attributes, String className, String parentAssociationLabel, String variableName, List<FlutterOutline> children, Integer id, Boolean isWidgetClass, String renderConstructor, String stateClassName, Integer stateOffset, Integer stateLength) {
+  public FlutterOutline(String kind, int offset, int length, int codeOffset, int codeLength, String label, Element dartElement, List<FlutterOutlineAttribute> attributes, String className, String parentAssociationLabel, String variableName, List<FlutterOutline> children) {
     this.kind = kind;
     this.offset = offset;
     this.length = length;
@@ -156,12 +119,6 @@
     this.parentAssociationLabel = parentAssociationLabel;
     this.variableName = variableName;
     this.children = children;
-    this.id = id;
-    this.isWidgetClass = isWidgetClass;
-    this.renderConstructor = renderConstructor;
-    this.stateClassName = stateClassName;
-    this.stateOffset = stateOffset;
-    this.stateLength = stateLength;
   }
 
   @Override
@@ -180,13 +137,7 @@
         ObjectUtilities.equals(other.className, className) &&
         ObjectUtilities.equals(other.parentAssociationLabel, parentAssociationLabel) &&
         ObjectUtilities.equals(other.variableName, variableName) &&
-        ObjectUtilities.equals(other.children, children) &&
-        ObjectUtilities.equals(other.id, id) &&
-        ObjectUtilities.equals(other.isWidgetClass, isWidgetClass) &&
-        ObjectUtilities.equals(other.renderConstructor, renderConstructor) &&
-        ObjectUtilities.equals(other.stateClassName, stateClassName) &&
-        ObjectUtilities.equals(other.stateOffset, stateOffset) &&
-        ObjectUtilities.equals(other.stateLength, stateLength);
+        ObjectUtilities.equals(other.children, children);
     }
     return false;
   }
@@ -204,13 +155,7 @@
     String parentAssociationLabel = jsonObject.get("parentAssociationLabel") == null ? null : jsonObject.get("parentAssociationLabel").getAsString();
     String variableName = jsonObject.get("variableName") == null ? null : jsonObject.get("variableName").getAsString();
     List<FlutterOutline> children = jsonObject.get("children") == null ? null : FlutterOutline.fromJsonArray(jsonObject.get("children").getAsJsonArray());
-    Integer id = jsonObject.get("id") == null ? null : jsonObject.get("id").getAsInt();
-    Boolean isWidgetClass = jsonObject.get("isWidgetClass") == null ? null : jsonObject.get("isWidgetClass").getAsBoolean();
-    String renderConstructor = jsonObject.get("renderConstructor") == null ? null : jsonObject.get("renderConstructor").getAsString();
-    String stateClassName = jsonObject.get("stateClassName") == null ? null : jsonObject.get("stateClassName").getAsString();
-    Integer stateOffset = jsonObject.get("stateOffset") == null ? null : jsonObject.get("stateOffset").getAsInt();
-    Integer stateLength = jsonObject.get("stateLength") == null ? null : jsonObject.get("stateLength").getAsInt();
-    return new FlutterOutline(kind, offset, length, codeOffset, codeLength, label, dartElement, attributes, className, parentAssociationLabel, variableName, children, id, isWidgetClass, renderConstructor, stateClassName, stateOffset, stateLength);
+    return new FlutterOutline(kind, offset, length, codeOffset, codeLength, label, dartElement, attributes, className, parentAssociationLabel, variableName, children);
   }
 
   public static List<FlutterOutline> fromJsonArray(JsonArray jsonArray) {
@@ -272,22 +217,6 @@
   }
 
   /**
-   * If the node is a widget, and it is instrumented, the unique identifier of this widget, that can
-   * be used to associate rendering information with this node.
-   */
-  public Integer getId() {
-    return id;
-  }
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered, even if it does not yet
-   * have the rendering constructor. This field is omitted if the node is not a widget class.
-   */
-  public Boolean getIsWidgetClass() {
-    return isWidgetClass;
-  }
-
-  /**
    * The kind of the node.
    */
   public String getKind() {
@@ -327,39 +256,6 @@
   }
 
   /**
-   * If the node is a widget class that can be rendered for IDE, the name of the constructor that
-   * should be used to instantiate the widget. Empty string for default constructor. Absent if the
-   * node is not a widget class that can be rendered.
-   */
-  public String getRenderConstructor() {
-    return renderConstructor;
-  }
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the same file, the name of
-   * the state class.
-   */
-  public String getStateClassName() {
-    return stateClassName;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class is defined in the same
-   * file, the length of the state class code in the file.
-   */
-  public Integer getStateLength() {
-    return stateLength;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class is defined in the same
-   * file, the offset of the state class code in the file.
-   */
-  public Integer getStateOffset() {
-    return stateOffset;
-  }
-
-  /**
    * If FlutterOutlineKind.VARIABLE, the name of the variable.
    */
   public String getVariableName() {
@@ -381,12 +277,6 @@
     builder.append(parentAssociationLabel);
     builder.append(variableName);
     builder.append(children);
-    builder.append(id);
-    builder.append(isWidgetClass);
-    builder.append(renderConstructor);
-    builder.append(stateClassName);
-    builder.append(stateOffset);
-    builder.append(stateLength);
     return builder.toHashCode();
   }
 
@@ -426,24 +316,6 @@
       }
       jsonObject.add("children", jsonArrayChildren);
     }
-    if (id != null) {
-      jsonObject.addProperty("id", id);
-    }
-    if (isWidgetClass != null) {
-      jsonObject.addProperty("isWidgetClass", isWidgetClass);
-    }
-    if (renderConstructor != null) {
-      jsonObject.addProperty("renderConstructor", renderConstructor);
-    }
-    if (stateClassName != null) {
-      jsonObject.addProperty("stateClassName", stateClassName);
-    }
-    if (stateOffset != null) {
-      jsonObject.addProperty("stateOffset", stateOffset);
-    }
-    if (stateLength != null) {
-      jsonObject.addProperty("stateLength", stateLength);
-    }
     return jsonObject;
   }
 
@@ -474,19 +346,7 @@
     builder.append("variableName=");
     builder.append(variableName + ", ");
     builder.append("children=");
-    builder.append(StringUtils.join(children, ", ") + ", ");
-    builder.append("id=");
-    builder.append(id + ", ");
-    builder.append("isWidgetClass=");
-    builder.append(isWidgetClass + ", ");
-    builder.append("renderConstructor=");
-    builder.append(renderConstructor + ", ");
-    builder.append("stateClassName=");
-    builder.append(stateClassName + ", ");
-    builder.append("stateOffset=");
-    builder.append(stateOffset + ", ");
-    builder.append("stateLength=");
-    builder.append(stateLength);
+    builder.append(StringUtils.join(children, ", "));
     builder.append("]");
     return builder.toString();
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
index b02f3ae..88dd44b 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterOutlineAttribute.java
@@ -65,14 +65,29 @@
   private final String literalValueString;
 
   /**
+   * If the attribute is a named argument, the location of the name, without the colon.
+   */
+  private final Location nameLocation;
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward compatibility between new
+   * clients with older servers.
+   */
+  private final Location valueLocation;
+
+  /**
    * Constructor for {@link FlutterOutlineAttribute}.
    */
-  public FlutterOutlineAttribute(String name, String label, Boolean literalValueBoolean, Integer literalValueInteger, String literalValueString) {
+  public FlutterOutlineAttribute(String name, String label, Boolean literalValueBoolean, Integer literalValueInteger, String literalValueString, Location nameLocation, Location valueLocation) {
     this.name = name;
     this.label = label;
     this.literalValueBoolean = literalValueBoolean;
     this.literalValueInteger = literalValueInteger;
     this.literalValueString = literalValueString;
+    this.nameLocation = nameLocation;
+    this.valueLocation = valueLocation;
   }
 
   @Override
@@ -84,7 +99,9 @@
         ObjectUtilities.equals(other.label, label) &&
         ObjectUtilities.equals(other.literalValueBoolean, literalValueBoolean) &&
         ObjectUtilities.equals(other.literalValueInteger, literalValueInteger) &&
-        ObjectUtilities.equals(other.literalValueString, literalValueString);
+        ObjectUtilities.equals(other.literalValueString, literalValueString) &&
+        ObjectUtilities.equals(other.nameLocation, nameLocation) &&
+        ObjectUtilities.equals(other.valueLocation, valueLocation);
     }
     return false;
   }
@@ -95,7 +112,9 @@
     Boolean literalValueBoolean = jsonObject.get("literalValueBoolean") == null ? null : jsonObject.get("literalValueBoolean").getAsBoolean();
     Integer literalValueInteger = jsonObject.get("literalValueInteger") == null ? null : jsonObject.get("literalValueInteger").getAsInt();
     String literalValueString = jsonObject.get("literalValueString") == null ? null : jsonObject.get("literalValueString").getAsString();
-    return new FlutterOutlineAttribute(name, label, literalValueBoolean, literalValueInteger, literalValueString);
+    Location nameLocation = jsonObject.get("nameLocation") == null ? null : Location.fromJson(jsonObject.get("nameLocation").getAsJsonObject());
+    Location valueLocation = jsonObject.get("valueLocation") == null ? null : Location.fromJson(jsonObject.get("valueLocation").getAsJsonObject());
+    return new FlutterOutlineAttribute(name, label, literalValueBoolean, literalValueInteger, literalValueString, nameLocation, valueLocation);
   }
 
   public static List<FlutterOutlineAttribute> fromJsonArray(JsonArray jsonArray) {
@@ -149,6 +168,23 @@
     return name;
   }
 
+  /**
+   * If the attribute is a named argument, the location of the name, without the colon.
+   */
+  public Location getNameLocation() {
+    return nameLocation;
+  }
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward compatibility between new
+   * clients with older servers.
+   */
+  public Location getValueLocation() {
+    return valueLocation;
+  }
+
   @Override
   public int hashCode() {
     HashCodeBuilder builder = new HashCodeBuilder();
@@ -157,6 +193,8 @@
     builder.append(literalValueBoolean);
     builder.append(literalValueInteger);
     builder.append(literalValueString);
+    builder.append(nameLocation);
+    builder.append(valueLocation);
     return builder.toHashCode();
   }
 
@@ -173,6 +211,12 @@
     if (literalValueString != null) {
       jsonObject.addProperty("literalValueString", literalValueString);
     }
+    if (nameLocation != null) {
+      jsonObject.add("nameLocation", nameLocation.toJson());
+    }
+    if (valueLocation != null) {
+      jsonObject.add("valueLocation", valueLocation.toJson());
+    }
     return jsonObject;
   }
 
@@ -189,7 +233,11 @@
     builder.append("literalValueInteger=");
     builder.append(literalValueInteger + ", ");
     builder.append("literalValueString=");
-    builder.append(literalValueString);
+    builder.append(literalValueString + ", ");
+    builder.append("nameLocation=");
+    builder.append(nameLocation + ", ");
+    builder.append("valueLocation=");
+    builder.append(valueLocation);
     builder.append("]");
     return builder.toString();
   }
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetProperty.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetProperty.java
new file mode 100644
index 0000000..c28e3c5
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetProperty.java
@@ -0,0 +1,289 @@
+/*
+ * Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.dart.server.utilities.general.JsonUtilities;
+import com.google.dart.server.utilities.general.ObjectUtilities;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * A property of a Flutter widget.
+ *
+ * @coverage dart.server.generated.types
+ */
+@SuppressWarnings("unused")
+public class FlutterWidgetProperty {
+
+  public static final FlutterWidgetProperty[] EMPTY_ARRAY = new FlutterWidgetProperty[0];
+
+  public static final List<FlutterWidgetProperty> EMPTY_LIST = Lists.newArrayList();
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the server does not know the
+   * documentation, e.g. because the corresponding field is not documented.
+   */
+  private final String documentation;
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of this property.
+   */
+  private final String expression;
+
+  /**
+   * The unique identifier of the property, must be passed back to the server when updating the
+   * property value. Identifiers become invalid on any source code change.
+   */
+  private final int id;
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a required parameter of a
+   * constructor.
+   */
+  private final boolean isRequired;
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum constant), then it is
+   * safe to replace the expression with another concrete value. In this case this field is true.
+   * Otherwise, for example when the expression is a reference to a field, so that its value is
+   * provided from outside, this field is false.
+   */
+  private final boolean isSafeToUpdate;
+
+  /**
+   * The name of the property to display to the user.
+   */
+  private final String name;
+
+  /**
+   * The list of children properties, if any. For example any property of type EdgeInsets will have
+   * four children properties of type double - left / top / right / bottom.
+   */
+  private final List<FlutterWidgetProperty> children;
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the server does not know
+   * the editor for this property, for example because it does not have one of the supported types.
+   */
+  private final FlutterWidgetPropertyEditor editor;
+
+  /**
+   * If the expression is set, and the server knows the value of the expression, this field is set.
+   */
+  private final FlutterWidgetPropertyValue value;
+
+  /**
+   * Constructor for {@link FlutterWidgetProperty}.
+   */
+  public FlutterWidgetProperty(String documentation, String expression, int id, boolean isRequired, boolean isSafeToUpdate, String name, List<FlutterWidgetProperty> children, FlutterWidgetPropertyEditor editor, FlutterWidgetPropertyValue value) {
+    this.documentation = documentation;
+    this.expression = expression;
+    this.id = id;
+    this.isRequired = isRequired;
+    this.isSafeToUpdate = isSafeToUpdate;
+    this.name = name;
+    this.children = children;
+    this.editor = editor;
+    this.value = value;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof FlutterWidgetProperty) {
+      FlutterWidgetProperty other = (FlutterWidgetProperty) obj;
+      return
+        ObjectUtilities.equals(other.documentation, documentation) &&
+        ObjectUtilities.equals(other.expression, expression) &&
+        other.id == id &&
+        other.isRequired == isRequired &&
+        other.isSafeToUpdate == isSafeToUpdate &&
+        ObjectUtilities.equals(other.name, name) &&
+        ObjectUtilities.equals(other.children, children) &&
+        ObjectUtilities.equals(other.editor, editor) &&
+        ObjectUtilities.equals(other.value, value);
+    }
+    return false;
+  }
+
+  public static FlutterWidgetProperty fromJson(JsonObject jsonObject) {
+    String documentation = jsonObject.get("documentation") == null ? null : jsonObject.get("documentation").getAsString();
+    String expression = jsonObject.get("expression") == null ? null : jsonObject.get("expression").getAsString();
+    int id = jsonObject.get("id").getAsInt();
+    boolean isRequired = jsonObject.get("isRequired").getAsBoolean();
+    boolean isSafeToUpdate = jsonObject.get("isSafeToUpdate").getAsBoolean();
+    String name = jsonObject.get("name").getAsString();
+    List<FlutterWidgetProperty> children = jsonObject.get("children") == null ? null : FlutterWidgetProperty.fromJsonArray(jsonObject.get("children").getAsJsonArray());
+    FlutterWidgetPropertyEditor editor = jsonObject.get("editor") == null ? null : FlutterWidgetPropertyEditor.fromJson(jsonObject.get("editor").getAsJsonObject());
+    FlutterWidgetPropertyValue value = jsonObject.get("value") == null ? null : FlutterWidgetPropertyValue.fromJson(jsonObject.get("value").getAsJsonObject());
+    return new FlutterWidgetProperty(documentation, expression, id, isRequired, isSafeToUpdate, name, children, editor, value);
+  }
+
+  public static List<FlutterWidgetProperty> fromJsonArray(JsonArray jsonArray) {
+    if (jsonArray == null) {
+      return EMPTY_LIST;
+    }
+    ArrayList<FlutterWidgetProperty> list = new ArrayList<FlutterWidgetProperty>(jsonArray.size());
+    Iterator<JsonElement> iterator = jsonArray.iterator();
+    while (iterator.hasNext()) {
+      list.add(fromJson(iterator.next().getAsJsonObject()));
+    }
+    return list;
+  }
+
+  /**
+   * The list of children properties, if any. For example any property of type EdgeInsets will have
+   * four children properties of type double - left / top / right / bottom.
+   */
+  public List<FlutterWidgetProperty> getChildren() {
+    return children;
+  }
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the server does not know the
+   * documentation, e.g. because the corresponding field is not documented.
+   */
+  public String getDocumentation() {
+    return documentation;
+  }
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the server does not know
+   * the editor for this property, for example because it does not have one of the supported types.
+   */
+  public FlutterWidgetPropertyEditor getEditor() {
+    return editor;
+  }
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of this property.
+   */
+  public String getExpression() {
+    return expression;
+  }
+
+  /**
+   * The unique identifier of the property, must be passed back to the server when updating the
+   * property value. Identifiers become invalid on any source code change.
+   */
+  public int getId() {
+    return id;
+  }
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a required parameter of a
+   * constructor.
+   */
+  public boolean isRequired() {
+    return isRequired;
+  }
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum constant), then it is
+   * safe to replace the expression with another concrete value. In this case this field is true.
+   * Otherwise, for example when the expression is a reference to a field, so that its value is
+   * provided from outside, this field is false.
+   */
+  public boolean isSafeToUpdate() {
+    return isSafeToUpdate;
+  }
+
+  /**
+   * The name of the property to display to the user.
+   */
+  public String getName() {
+    return name;
+  }
+
+  /**
+   * If the expression is set, and the server knows the value of the expression, this field is set.
+   */
+  public FlutterWidgetPropertyValue getValue() {
+    return value;
+  }
+
+  @Override
+  public int hashCode() {
+    HashCodeBuilder builder = new HashCodeBuilder();
+    builder.append(documentation);
+    builder.append(expression);
+    builder.append(id);
+    builder.append(isRequired);
+    builder.append(isSafeToUpdate);
+    builder.append(name);
+    builder.append(children);
+    builder.append(editor);
+    builder.append(value);
+    return builder.toHashCode();
+  }
+
+  public JsonObject toJson() {
+    JsonObject jsonObject = new JsonObject();
+    if (documentation != null) {
+      jsonObject.addProperty("documentation", documentation);
+    }
+    if (expression != null) {
+      jsonObject.addProperty("expression", expression);
+    }
+    jsonObject.addProperty("id", id);
+    jsonObject.addProperty("isRequired", isRequired);
+    jsonObject.addProperty("isSafeToUpdate", isSafeToUpdate);
+    jsonObject.addProperty("name", name);
+    if (children != null) {
+      JsonArray jsonArrayChildren = new JsonArray();
+      for (FlutterWidgetProperty elt : children) {
+        jsonArrayChildren.add(elt.toJson());
+      }
+      jsonObject.add("children", jsonArrayChildren);
+    }
+    if (editor != null) {
+      jsonObject.add("editor", editor.toJson());
+    }
+    if (value != null) {
+      jsonObject.add("value", value.toJson());
+    }
+    return jsonObject;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("[");
+    builder.append("documentation=");
+    builder.append(documentation + ", ");
+    builder.append("expression=");
+    builder.append(expression + ", ");
+    builder.append("id=");
+    builder.append(id + ", ");
+    builder.append("isRequired=");
+    builder.append(isRequired + ", ");
+    builder.append("isSafeToUpdate=");
+    builder.append(isSafeToUpdate + ", ");
+    builder.append("name=");
+    builder.append(name + ", ");
+    builder.append("children=");
+    builder.append(StringUtils.join(children, ", ") + ", ");
+    builder.append("editor=");
+    builder.append(editor + ", ");
+    builder.append("value=");
+    builder.append(value);
+    builder.append("]");
+    return builder.toString();
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditor.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditor.java
new file mode 100644
index 0000000..3dadd70
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditor.java
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.dart.server.utilities.general.JsonUtilities;
+import com.google.dart.server.utilities.general.ObjectUtilities;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * An editor for a property of a Flutter widget.
+ *
+ * @coverage dart.server.generated.types
+ */
+@SuppressWarnings("unused")
+public class FlutterWidgetPropertyEditor {
+
+  public static final FlutterWidgetPropertyEditor[] EMPTY_ARRAY = new FlutterWidgetPropertyEditor[0];
+
+  public static final List<FlutterWidgetPropertyEditor> EMPTY_LIST = Lists.newArrayList();
+
+  private final String kind;
+
+  private final List<FlutterWidgetPropertyValueEnumItem> enumItems;
+
+  /**
+   * Constructor for {@link FlutterWidgetPropertyEditor}.
+   */
+  public FlutterWidgetPropertyEditor(String kind, List<FlutterWidgetPropertyValueEnumItem> enumItems) {
+    this.kind = kind;
+    this.enumItems = enumItems;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof FlutterWidgetPropertyEditor) {
+      FlutterWidgetPropertyEditor other = (FlutterWidgetPropertyEditor) obj;
+      return
+        ObjectUtilities.equals(other.kind, kind) &&
+        ObjectUtilities.equals(other.enumItems, enumItems);
+    }
+    return false;
+  }
+
+  public static FlutterWidgetPropertyEditor fromJson(JsonObject jsonObject) {
+    String kind = jsonObject.get("kind").getAsString();
+    List<FlutterWidgetPropertyValueEnumItem> enumItems = jsonObject.get("enumItems") == null ? null : FlutterWidgetPropertyValueEnumItem.fromJsonArray(jsonObject.get("enumItems").getAsJsonArray());
+    return new FlutterWidgetPropertyEditor(kind, enumItems);
+  }
+
+  public static List<FlutterWidgetPropertyEditor> fromJsonArray(JsonArray jsonArray) {
+    if (jsonArray == null) {
+      return EMPTY_LIST;
+    }
+    ArrayList<FlutterWidgetPropertyEditor> list = new ArrayList<FlutterWidgetPropertyEditor>(jsonArray.size());
+    Iterator<JsonElement> iterator = jsonArray.iterator();
+    while (iterator.hasNext()) {
+      list.add(fromJson(iterator.next().getAsJsonObject()));
+    }
+    return list;
+  }
+
+  public List<FlutterWidgetPropertyValueEnumItem> getEnumItems() {
+    return enumItems;
+  }
+
+  public String getKind() {
+    return kind;
+  }
+
+  @Override
+  public int hashCode() {
+    HashCodeBuilder builder = new HashCodeBuilder();
+    builder.append(kind);
+    builder.append(enumItems);
+    return builder.toHashCode();
+  }
+
+  public JsonObject toJson() {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("kind", kind);
+    if (enumItems != null) {
+      JsonArray jsonArrayEnumItems = new JsonArray();
+      for (FlutterWidgetPropertyValueEnumItem elt : enumItems) {
+        jsonArrayEnumItems.add(elt.toJson());
+      }
+      jsonObject.add("enumItems", jsonArrayEnumItems);
+    }
+    return jsonObject;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("[");
+    builder.append("kind=");
+    builder.append(kind + ", ");
+    builder.append("enumItems=");
+    builder.append(StringUtils.join(enumItems, ", "));
+    builder.append("]");
+    return builder.toString();
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditorKind.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditorKind.java
new file mode 100644
index 0000000..c20a6a6
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyEditorKind.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+/**
+ * An enumeration of the kinds of property editors.
+ *
+ * @coverage dart.server.generated.types
+ */
+public class FlutterWidgetPropertyEditorKind {
+
+  /**
+   * The editor for a property of type bool.
+   */
+  public static final String BOOL = "BOOL";
+
+  /**
+   * The editor for a property of the type double.
+   */
+  public static final String DOUBLE = "DOUBLE";
+
+  /**
+   * The editor for choosing an item of an enumeration, see the enumItems field of
+   * FlutterWidgetPropertyEditor.
+   */
+  public static final String ENUM = "ENUM";
+
+  /**
+   * The editor for either choosing a pre-defined item from a list of provided static field
+   * references (like ENUM), or specifying a free-form expression.
+   */
+  public static final String ENUM_LIKE = "ENUM_LIKE";
+
+  /**
+   * The editor for a property of type int.
+   */
+  public static final String INT = "INT";
+
+  /**
+   * The editor for a property of the type String.
+   */
+  public static final String STRING = "STRING";
+
+}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValue.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValue.java
new file mode 100644
index 0000000..f91282f
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValue.java
@@ -0,0 +1,184 @@
+/*
+ * Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.dart.server.utilities.general.JsonUtilities;
+import com.google.dart.server.utilities.general.ObjectUtilities;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * A value of a property of a Flutter widget.
+ *
+ * @coverage dart.server.generated.types
+ */
+@SuppressWarnings("unused")
+public class FlutterWidgetPropertyValue {
+
+  public static final FlutterWidgetPropertyValue[] EMPTY_ARRAY = new FlutterWidgetPropertyValue[0];
+
+  public static final List<FlutterWidgetPropertyValue> EMPTY_LIST = Lists.newArrayList();
+
+  private final Boolean boolValue;
+
+  private final Double doubleValue;
+
+  private final Integer intValue;
+
+  private final String stringValue;
+
+  private final FlutterWidgetPropertyValueEnumItem enumValue;
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  private final String expression;
+
+  /**
+   * Constructor for {@link FlutterWidgetPropertyValue}.
+   */
+  public FlutterWidgetPropertyValue(Boolean boolValue, Double doubleValue, Integer intValue, String stringValue, FlutterWidgetPropertyValueEnumItem enumValue, String expression) {
+    this.boolValue = boolValue;
+    this.doubleValue = doubleValue;
+    this.intValue = intValue;
+    this.stringValue = stringValue;
+    this.enumValue = enumValue;
+    this.expression = expression;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof FlutterWidgetPropertyValue) {
+      FlutterWidgetPropertyValue other = (FlutterWidgetPropertyValue) obj;
+      return
+        ObjectUtilities.equals(other.boolValue, boolValue) &&
+        ObjectUtilities.equals(other.doubleValue, doubleValue) &&
+        ObjectUtilities.equals(other.intValue, intValue) &&
+        ObjectUtilities.equals(other.stringValue, stringValue) &&
+        ObjectUtilities.equals(other.enumValue, enumValue) &&
+        ObjectUtilities.equals(other.expression, expression);
+    }
+    return false;
+  }
+
+  public static FlutterWidgetPropertyValue fromJson(JsonObject jsonObject) {
+    Boolean boolValue = jsonObject.get("boolValue") == null ? null : jsonObject.get("boolValue").getAsBoolean();
+    Double doubleValue = jsonObject.get("doubleValue") == null ? null : jsonObject.get("doubleValue").getAsDouble();
+    Integer intValue = jsonObject.get("intValue") == null ? null : jsonObject.get("intValue").getAsInt();
+    String stringValue = jsonObject.get("stringValue") == null ? null : jsonObject.get("stringValue").getAsString();
+    FlutterWidgetPropertyValueEnumItem enumValue = jsonObject.get("enumValue") == null ? null : FlutterWidgetPropertyValueEnumItem.fromJson(jsonObject.get("enumValue").getAsJsonObject());
+    String expression = jsonObject.get("expression") == null ? null : jsonObject.get("expression").getAsString();
+    return new FlutterWidgetPropertyValue(boolValue, doubleValue, intValue, stringValue, enumValue, expression);
+  }
+
+  public static List<FlutterWidgetPropertyValue> fromJsonArray(JsonArray jsonArray) {
+    if (jsonArray == null) {
+      return EMPTY_LIST;
+    }
+    ArrayList<FlutterWidgetPropertyValue> list = new ArrayList<FlutterWidgetPropertyValue>(jsonArray.size());
+    Iterator<JsonElement> iterator = jsonArray.iterator();
+    while (iterator.hasNext()) {
+      list.add(fromJson(iterator.next().getAsJsonObject()));
+    }
+    return list;
+  }
+
+  public Boolean getBoolValue() {
+    return boolValue;
+  }
+
+  public Double getDoubleValue() {
+    return doubleValue;
+  }
+
+  public FlutterWidgetPropertyValueEnumItem getEnumValue() {
+    return enumValue;
+  }
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  public String getExpression() {
+    return expression;
+  }
+
+  public Integer getIntValue() {
+    return intValue;
+  }
+
+  public String getStringValue() {
+    return stringValue;
+  }
+
+  @Override
+  public int hashCode() {
+    HashCodeBuilder builder = new HashCodeBuilder();
+    builder.append(boolValue);
+    builder.append(doubleValue);
+    builder.append(intValue);
+    builder.append(stringValue);
+    builder.append(enumValue);
+    builder.append(expression);
+    return builder.toHashCode();
+  }
+
+  public JsonObject toJson() {
+    JsonObject jsonObject = new JsonObject();
+    if (boolValue != null) {
+      jsonObject.addProperty("boolValue", boolValue);
+    }
+    if (doubleValue != null) {
+      jsonObject.addProperty("doubleValue", doubleValue);
+    }
+    if (intValue != null) {
+      jsonObject.addProperty("intValue", intValue);
+    }
+    if (stringValue != null) {
+      jsonObject.addProperty("stringValue", stringValue);
+    }
+    if (enumValue != null) {
+      jsonObject.add("enumValue", enumValue.toJson());
+    }
+    if (expression != null) {
+      jsonObject.addProperty("expression", expression);
+    }
+    return jsonObject;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("[");
+    builder.append("boolValue=");
+    builder.append(boolValue + ", ");
+    builder.append("doubleValue=");
+    builder.append(doubleValue + ", ");
+    builder.append("intValue=");
+    builder.append(intValue + ", ");
+    builder.append("stringValue=");
+    builder.append(stringValue + ", ");
+    builder.append("enumValue=");
+    builder.append(enumValue + ", ");
+    builder.append("expression=");
+    builder.append(expression);
+    builder.append("]");
+    return builder.toString();
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValueEnumItem.java b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValueEnumItem.java
new file mode 100644
index 0000000..b704b52
--- /dev/null
+++ b/pkg/analysis_server/tool/spec/generated/java/types/FlutterWidgetPropertyValueEnumItem.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+ * for details. All rights reserved. Use of this source code is governed by a
+ * BSD-style license that can be found in the LICENSE file.
+ *
+ * This file has been automatically generated. Please do not edit it manually.
+ * To regenerate the file, use the script "pkg/analysis_server/tool/spec/generate_files".
+ */
+package org.dartlang.analysis.server.protocol;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import com.google.common.collect.Lists;
+import com.google.dart.server.utilities.general.JsonUtilities;
+import com.google.dart.server.utilities.general.ObjectUtilities;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import java.util.ArrayList;
+import java.util.Iterator;
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * An item of an enumeration in a general sense - actual enum value, or a static field in a class.
+ *
+ * @coverage dart.server.generated.types
+ */
+@SuppressWarnings("unused")
+public class FlutterWidgetPropertyValueEnumItem {
+
+  public static final FlutterWidgetPropertyValueEnumItem[] EMPTY_ARRAY = new FlutterWidgetPropertyValueEnumItem[0];
+
+  public static final List<FlutterWidgetPropertyValueEnumItem> EMPTY_LIST = Lists.newArrayList();
+
+  /**
+   * The URI of the library containing the className. When the enum item is passed back, this will
+   * allow the server to import the corresponding library if necessary.
+   */
+  private final String libraryUri;
+
+  /**
+   * The name of the class or enum.
+   */
+  private final String className;
+
+  /**
+   * The name of the field in the enumeration, or the static field in the class.
+   */
+  private final String name;
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know the documentation,
+   * e.g. because the corresponding field is not documented.
+   */
+  private final String documentation;
+
+  /**
+   * Constructor for {@link FlutterWidgetPropertyValueEnumItem}.
+   */
+  public FlutterWidgetPropertyValueEnumItem(String libraryUri, String className, String name, String documentation) {
+    this.libraryUri = libraryUri;
+    this.className = className;
+    this.name = name;
+    this.documentation = documentation;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (obj instanceof FlutterWidgetPropertyValueEnumItem) {
+      FlutterWidgetPropertyValueEnumItem other = (FlutterWidgetPropertyValueEnumItem) obj;
+      return
+        ObjectUtilities.equals(other.libraryUri, libraryUri) &&
+        ObjectUtilities.equals(other.className, className) &&
+        ObjectUtilities.equals(other.name, name) &&
+        ObjectUtilities.equals(other.documentation, documentation);
+    }
+    return false;
+  }
+
+  public static FlutterWidgetPropertyValueEnumItem fromJson(JsonObject jsonObject) {
+    String libraryUri = jsonObject.get("libraryUri").getAsString();
+    String className = jsonObject.get("className").getAsString();
+    String name = jsonObject.get("name").getAsString();
+    String documentation = jsonObject.get("documentation") == null ? null : jsonObject.get("documentation").getAsString();
+    return new FlutterWidgetPropertyValueEnumItem(libraryUri, className, name, documentation);
+  }
+
+  public static List<FlutterWidgetPropertyValueEnumItem> fromJsonArray(JsonArray jsonArray) {
+    if (jsonArray == null) {
+      return EMPTY_LIST;
+    }
+    ArrayList<FlutterWidgetPropertyValueEnumItem> list = new ArrayList<FlutterWidgetPropertyValueEnumItem>(jsonArray.size());
+    Iterator<JsonElement> iterator = jsonArray.iterator();
+    while (iterator.hasNext()) {
+      list.add(fromJson(iterator.next().getAsJsonObject()));
+    }
+    return list;
+  }
+
+  /**
+   * The name of the class or enum.
+   */
+  public String getClassName() {
+    return className;
+  }
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know the documentation,
+   * e.g. because the corresponding field is not documented.
+   */
+  public String getDocumentation() {
+    return documentation;
+  }
+
+  /**
+   * The URI of the library containing the className. When the enum item is passed back, this will
+   * allow the server to import the corresponding library if necessary.
+   */
+  public String getLibraryUri() {
+    return libraryUri;
+  }
+
+  /**
+   * The name of the field in the enumeration, or the static field in the class.
+   */
+  public String getName() {
+    return name;
+  }
+
+  @Override
+  public int hashCode() {
+    HashCodeBuilder builder = new HashCodeBuilder();
+    builder.append(libraryUri);
+    builder.append(className);
+    builder.append(name);
+    builder.append(documentation);
+    return builder.toHashCode();
+  }
+
+  public JsonObject toJson() {
+    JsonObject jsonObject = new JsonObject();
+    jsonObject.addProperty("libraryUri", libraryUri);
+    jsonObject.addProperty("className", className);
+    jsonObject.addProperty("name", name);
+    if (documentation != null) {
+      jsonObject.addProperty("documentation", documentation);
+    }
+    return jsonObject;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    builder.append("[");
+    builder.append("libraryUri=");
+    builder.append(libraryUri + ", ");
+    builder.append("className=");
+    builder.append(className + ", ");
+    builder.append("name=");
+    builder.append(name + ", ");
+    builder.append("documentation=");
+    builder.append(documentation);
+    builder.append("]");
+    return builder.toString();
+  }
+
+}
diff --git a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
index aa8e173..6abbf6e 100644
--- a/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
+++ b/pkg/analysis_server/tool/spec/generated/java/types/RequestErrorCode.java
@@ -33,6 +33,23 @@
   public static final String FILE_NOT_ANALYZED = "FILE_NOT_ANALYZED";
 
   /**
+   * The given location does not have a supported widget.
+   */
+  public static final String FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET = "FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET";
+
+  /**
+   * The given property identifier is not valid. It might have never been valid, or a change to code
+   * invalidated it, or its TTL was exceeded.
+   */
+  public static final String FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID = "FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID";
+
+  /**
+   * The value of the property cannot be removed, for example because the corresponding constructor
+   * argument is required, and the server does not know what default value to use.
+   */
+  public static final String FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED = "FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED";
+
+  /**
    * An "edit.format" request specified a FilePath which does not match a Dart file in an analysis
    * root.
    */
diff --git a/pkg/analysis_server/tool/spec/spec_input.html b/pkg/analysis_server/tool/spec/spec_input.html
index 14ed664..05826b4 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.27.1</version>
+  <version>1.27.2</version>
 </h1>
 <p>
   This document contains a specification of the API provided by the
@@ -2201,6 +2201,12 @@
           an error of type <tt>UNKNOWN_FIX</tt> will be generated.
         </p>
       </field>
+      <field name="includePedanticFixes" optional="true">
+        <ref>bool</ref>
+        <p>
+          A flag indicating that "pedantic" fixes should be applied.
+        </p>
+      </field>
       <field name="includeRequiredFixes" optional="true">
         <ref>bool</ref>
         <p>
@@ -2299,7 +2305,7 @@
       </field>
     </result>
   </request>
-  <request method="getPostfixCompletion" experimental="true">
+  <request method="getPostfixCompletion">
     <p>
       Get the changes required to convert the postfix template at the given
       location into the template's expanded form.
@@ -3141,26 +3147,80 @@
     </result>
   </request>
 </domain>
-<domain name="flutter" experimental="true">
+<domain name="flutter">
   <p>
     The analysis domain contains API’s related to Flutter support.
   </p>
-  <request method="getChangeAddForDesignTimeConstructor">
+  <request method="getWidgetDescription" experimental="true">
     <p>
-      Return the change that adds the forDesignTime() constructor for the
-      widget class at the given offset.
+      Return the description of the widget instance at the given location.
+    </p>
+    <p>
+      If the location does not have a support widget, an error of type
+      <tt>FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET</tt> will be generated.
     </p>
     <params>
       <field name="file">
         <ref>FilePath</ref>
         <p>
-          The file containing the code of the class.
+          The file where the widget instance is created.
         </p>
       </field>
       <field name="offset">
         <ref>int</ref>
         <p>
-          The offset of the class in the code.
+          The offset in the file where the widget instance is created.
+        </p>
+      </field>
+    </params>
+    <result>
+      <field name="properties">
+        <list>
+          <ref>FlutterWidgetProperty</ref>
+        </list>
+        <p>
+          The list of properties of the widget. Some of the properties might be
+          read only, when their <tt>editor</tt> is not set. This might be
+          because they have type that we don't know how to edit, or for
+          compound properties that work as containers for sub-properties.
+        </p>
+      </field>
+    </result>
+  </request>
+  <request method="setWidgetPropertyValue" experimental="true">
+    <p>
+      Set the value of a property, or remove it.
+    </p>
+    <p>
+      The server will generate a change that the client should apply to the
+      project to get the value of the property set to the new value.
+      The complexity of the change might be from updating a single literal
+      value in the code, to updating multiple files to get libraries imported,
+      and new intermediate widgets instantiated.
+    </p>
+    <params>
+      <field name="id">
+        <ref>int</ref>
+        <p>
+          The identifier of the property, previously returned as a part of
+          a <tt>FlutterWidgetProperty</tt>.
+        </p>
+        <p>
+          An error of type <tt>FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID</tt>
+          is generated if the identifier is not valid.
+        </p>
+      </field>
+      <field name="value" optional="true">
+        <ref>FlutterWidgetPropertyValue</ref>
+        <p>
+          The new value to set for the property.
+        </p>
+        <p>
+          If absent, indicates that the property should be removed. If the
+          property corresponds to an optional parameter, the corresponding
+          named argument is removed. If the property <tt>isRequired</tt> is
+          true, <tt>FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED</tt> error
+          is generated.
         </p>
       </field>
     </params>
@@ -3168,8 +3228,7 @@
       <field name="change">
         <ref>SourceChange</ref>
         <p>
-          The change that adds the forDesignTime() constructor.
-          If the change cannot be produced, an error is returned.
+          The change that should be applied.
         </p>
       </field>
     </result>
@@ -3227,7 +3286,7 @@
       </field>
     </params>
   </request>
-  <notification event="outline" experimental="true">
+  <notification event="outline">
     <p>
       Reports the Flutter outline associated with a single file.
     </p>
@@ -3250,15 +3309,6 @@
           The outline associated with the file.
         </p>
       </field>
-      <field name="instrumentedCode" optional="true">
-        <ref>String</ref>
-        <p>
-          If the file has Flutter widgets that can be rendered, this field
-          has the instrumented content of the file, that allows associating
-          widgets with corresponding outline nodes. If there are no widgets
-          to render, this field is absent.
-        </p>
-      </field>
     </params>
   </notification>
 </domain>
@@ -4080,7 +4130,209 @@
       <value><code>PART</code></value>
     </enum>
   </type>
-  <type name="FlutterService" experimental="true">
+  <type name="FlutterWidgetProperty">
+    <p>
+      A property of a Flutter widget.
+    </p>
+    <object>
+      <field name="documentation" optional="true">
+        <ref>String</ref>
+        <p>
+          The documentation of the property to show to the user. Omitted if
+          the server does not know the documentation, e.g. because the
+          corresponding field is not documented.
+        </p>
+      </field>
+      <field name="expression" optional="true">
+        <ref>String</ref>
+        <p>
+          If the value of this property is set, the Dart code of the expression
+          of this property.
+        </p>
+      </field>
+      <field name="id">
+        <ref>int</ref>
+        <p>
+          The unique identifier of the property, must be passed back to the
+          server when updating the property value. Identifiers become invalid
+          on any source code change.
+        </p>
+      </field>
+      <field name="isRequired">
+        <ref>bool</ref>
+        <p>
+          True if the property is required, e.g. because it corresponds to
+          a required parameter of a constructor.
+        </p>
+      </field>
+      <field name="isSafeToUpdate">
+        <ref>bool</ref>
+        <p>
+          If the property expression is a concrete value (e.g. a literal, or
+          an enum constant), then it is safe to replace the expression with
+          another concrete value. In this case this field is true. Otherwise,
+          for example when the expression is a reference to a field, so that
+          its value is provided from outside, this field is false.
+        </p>
+      </field>
+      <field name="name">
+        <ref>String</ref>
+        <p>The name of the property to display to the user.</p>
+      </field>
+      <field name="children" optional="true">
+        <list>
+          <ref>FlutterWidgetProperty</ref>
+        </list>
+        <p>
+          The list of children properties, if any. For example any property of
+          type <tt>EdgeInsets</tt> will have four children properties of type
+          <tt>double</tt> - left / top / right / bottom.
+        </p>
+      </field>
+      <field name="editor" optional="true">
+        <ref>FlutterWidgetPropertyEditor</ref>
+        <p>
+          The editor that should be used by the client. This field is omitted
+          if the server does not know the editor for this property, for example
+          because it does not have one of the supported types.
+        </p>
+      </field>
+      <field name="value" optional="true">
+        <ref>FlutterWidgetPropertyValue</ref>
+        <p>
+          If the expression is set, and the server knows the value of the
+          expression, this field is set.
+        </p>
+      </field>
+    </object>
+  </type>
+  <type name="FlutterWidgetPropertyEditor">
+    <p>
+      An editor for a property of a Flutter widget.
+    </p>
+    <object>
+      <field name="kind">
+        <ref>FlutterWidgetPropertyEditorKind</ref>
+      </field>
+      <field name="enumItems" optional="true">
+        <list>
+          <ref>FlutterWidgetPropertyValueEnumItem</ref>
+        </list>
+      </field>
+    </object>
+  </type>
+  <type name="FlutterWidgetPropertyEditorKind">
+    <p>
+      An enumeration of the kinds of property editors.
+    </p>
+    <enum>
+      <value>
+        <code>BOOL</code>
+        <p>
+          The editor for a property of type <tt>bool</tt>.
+        </p>
+      </value>
+      <value>
+        <code>DOUBLE</code>
+        <p>
+          The editor for a property of the type <tt>double</tt>.
+        </p>
+      </value>
+      <value>
+        <code>ENUM</code>
+        <p>
+          The editor for choosing an item of an enumeration, see the
+          <tt>enumItems</tt> field of <tt>FlutterWidgetPropertyEditor</tt>.
+        </p>
+      </value>
+      <value>
+        <code>ENUM_LIKE</code>
+        <p>
+          The editor for either choosing a pre-defined item from a list of
+          provided static field references (like <tt>ENUM</tt>), or specifying
+          a free-form expression.
+        </p>
+      </value>
+      <value>
+        <code>INT</code>
+        <p>
+          The editor for a property of type <tt>int</tt>.
+        </p>
+      </value>
+      <value>
+        <code>STRING</code>
+        <p>
+          The editor for a property of the type <tt>String</tt>.
+        </p>
+      </value>
+    </enum>
+  </type>
+  <type name="FlutterWidgetPropertyValue">
+    <p>
+      A value of a property of a Flutter widget.
+    </p>
+    <object>
+      <field name="boolValue" optional="true">
+        <ref>bool</ref>
+      </field>
+      <field name="doubleValue" optional="true">
+        <ref>double</ref>
+      </field>
+      <field name="intValue" optional="true">
+        <ref>int</ref>
+      </field>
+      <field name="stringValue" optional="true">
+        <ref>String</ref>
+      </field>
+      <field name="enumValue" optional="true">
+        <ref>FlutterWidgetPropertyValueEnumItem</ref>
+      </field>
+      <field name="expression" optional="true">
+        <ref>String</ref>
+        <p>
+          A free-form expression, which will be used as the value as is.
+        </p>
+      </field>
+    </object>
+  </type>
+  <type name="FlutterWidgetPropertyValueEnumItem">
+    <p>
+      An item of an enumeration in a general sense - actual <tt>enum</tt>
+      value, or a static field in a class.
+    </p>
+    <object>
+      <field name="libraryUri">
+        <ref>String</ref>
+        <p>
+          The URI of the library containing the <tt>className</tt>. When the
+          enum item is passed back, this will allow the server to import the
+          corresponding library if necessary.
+        </p>
+      </field>
+      <field name="className">
+        <ref>String</ref>
+        <p>
+          The name of the class or enum.
+        </p>
+      </field>
+      <field name="name">
+        <ref>String</ref>
+        <p>
+          The name of the field in the enumeration, or the static field in the
+          class.
+        </p>
+      </field>
+      <field name="documentation" optional="true">
+        <ref>String</ref>
+        <p>
+          The documentation to show to the user. Omitted if the server does not
+          know the documentation, e.g. because the corresponding field is not
+          documented.
+        </p>
+      </field>
+    </object>
+  </type>
+  <type name="FlutterService">
     <p>
       An enumeration of the services provided by the flutter domain that
       are related to a specific list of files.
@@ -4089,7 +4341,7 @@
       <value><code>OUTLINE</code></value>
     </enum>
   </type>
-  <type name="FlutterOutline" experimental="true">
+  <type name="FlutterOutline">
     <p>
       An node in the Flutter specific outline structure of a file.
     </p>
@@ -4180,57 +4432,9 @@
           children.
         </p>
       </field>
-      <field name="id" optional="true">
-        <ref>int</ref>
-        <p>
-          If the node is a widget, and it is instrumented, the unique identifier
-          of this widget, that can be used to associate rendering information
-          with this node.
-        </p>
-      </field>
-      <field name="isWidgetClass" optional="true">
-        <ref>bool</ref>
-        <p>
-          True if the node is a widget class, so it can potentially be
-          rendered, even if it does not yet have the rendering constructor.
-          This field is omitted if the node is not a widget class.
-        </p>
-      </field>
-      <field name="renderConstructor" optional="true">
-        <ref>String</ref>
-        <p>
-          If the node is a widget class that can be rendered for IDE, the name
-          of the constructor that should be used to instantiate the widget.
-          Empty string for default constructor. Absent if the node is not a
-          widget class that can be rendered.
-        </p>
-      </field>
-      <field name="stateClassName" optional="true">
-        <ref>String</ref>
-        <p>
-          If the node is a StatefulWidget, and its state class is defined in
-          the same file, the name of the state class.
-        </p>
-      </field>
-      <field name="stateOffset" optional="true">
-        <ref>int</ref>
-        <p>
-          If the node is a StatefulWidget that can be rendered, and its state
-          class is defined in the same file, the offset of the state class code
-          in the file.
-        </p>
-      </field>
-      <field name="stateLength" optional="true">
-        <ref>int</ref>
-        <p>
-          If the node is a StatefulWidget that can be rendered, and its state
-          class is defined in the same file, the length of the state class code
-          in the file.
-        </p>
-      </field>
     </object>
   </type>
-  <type name="FlutterOutlineAttribute" experimental="true">
+  <type name="FlutterOutlineAttribute">
     <p>
       An attribute for a FlutterOutline.
     </p>
@@ -4269,9 +4473,26 @@
           This field is absent if the value is not a string literal.
         </p>
       </field>
+      <field name="nameLocation" optional="true">
+        <ref>Location</ref>
+        <p>
+          If the attribute is a named argument, the location of the name,
+          without the colon.
+        </p>
+      </field>
+      <field name="valueLocation" optional="true">
+        <ref>Location</ref>
+        <p>
+          The location of the value.
+        </p>
+        <p>
+          This field is always available, but marked optional for backward
+          compatibility between new clients with older servers.
+        </p>
+      </field>
     </object>
   </type>
-  <type name="FlutterOutlineKind" experimental="true">
+  <type name="FlutterOutlineKind">
     <p>
       An enumeration of the kinds of FlutterOutline elements. The list of kinds
       might be expanded with time, clients must be able to handle new kinds
@@ -4658,6 +4879,27 @@
         </p>
       </value>
       <value>
+        <code>FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET</code>
+        <p>
+          The given location does not have a supported widget.
+        </p>
+      </value>
+      <value>
+        <code>FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID</code>
+        <p>
+          The given property identifier is not valid. It might have never been
+          valid, or a change to code invalidated it, or its TTL was exceeded.
+        </p>
+      </value>
+      <value>
+        <code>FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED</code>
+        <p>
+          The value of the property cannot be removed, for example because
+          the corresponding constructor argument is required, and the server
+          does not know what default value to use.
+        </p>
+      </value>
+      <value>
         <code>FORMAT_INVALID_FILE</code>
         <p>
           An "edit.format" request specified a FilePath
diff --git a/pkg/analysis_server/tool/spec/to_html.dart b/pkg/analysis_server/tool/spec/to_html.dart
index 820948c..f8b74ac 100644
--- a/pkg/analysis_server/tool/spec/to_html.dart
+++ b/pkg/analysis_server/tool/spec/to_html.dart
@@ -240,7 +240,7 @@
    * If [force] is true, then a section is inserted even if the payload is
    * null.
    */
-  void describePayload(TypeObject subType, String name, {bool force: false}) {
+  void describePayload(TypeObject subType, String name, {bool force = false}) {
     if (force || subType != null) {
       h4(() {
         write(name);
@@ -262,14 +262,14 @@
       link('domain_${domain.name}', () => write('\u2191'));
       write(')');
     });
-    if (domain.requests.length > 0) {
+    if (domain.requests.isNotEmpty) {
       element('div', {'class': 'subindex'}, () {
         generateRequestsIndex(domain.requests);
-        if (domain.notifications.length > 0) {
+        if (domain.notifications.isNotEmpty) {
           generateNotificationsIndex(domain.notifications);
         }
       });
-    } else if (domain.notifications.length > 0) {
+    } else if (domain.notifications.isNotEmpty) {
       element('div', {'class': 'subindex'}, () {
         generateNotificationsIndex(domain.notifications);
       });
@@ -286,7 +286,7 @@
     h3(() => write('Domains'));
     for (var domain in api.domains) {
       if (domain.experimental ||
-          (domain.requests.length == 0 && domain.notifications == 0)) {
+          (domain.requests.isEmpty && domain.notifications == 0)) {
         continue;
       }
       generateDomainIndex(domain);
@@ -440,7 +440,7 @@
    * Copy the contents of the given HTML element, translating the special
    * elements that define the API appropriately.
    */
-  void translateHtml(dom.Element html, {bool squashParagraphs: false}) {
+  void translateHtml(dom.Element html, {bool squashParagraphs = false}) {
     for (dom.Node node in html.nodes) {
       if (node is dom.Element) {
         if (squashParagraphs && node.localName == 'p') {
@@ -668,6 +668,9 @@
 
   @override
   void visitTypeObjectField(TypeObjectField typeObjectField) {
+    if (typeObjectField.experimental) {
+      return;
+    }
     dt('field', () {
       b(() {
         if (typeObjectField.deprecated) {
@@ -736,7 +739,7 @@
    */
   final bool short;
 
-  TypeVisitor(Api api, {this.fieldsToBold, this.short: false}) : super(api);
+  TypeVisitor(Api api, {this.fieldsToBold, this.short = false}) : super(api);
 
   @override
   void visitTypeEnum(TypeEnum typeEnum) {
diff --git a/pkg/analysis_server_client/CHANGELOG.md b/pkg/analysis_server_client/CHANGELOG.md
index 2e19ab6..968b0df 100644
--- a/pkg/analysis_server_client/CHANGELOG.md
+++ b/pkg/analysis_server_client/CHANGELOG.md
@@ -1,3 +1,6 @@
+# 1.1.3
+ * update dartfix protocol to include --pedantic
+
 # 1.1.1
  * Update ConnectionHandler to call checkServerProtocolVersion
 
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 2d93ddb..f51b81c 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.27.1';
+const String PROTOCOL_VERSION = '1.27.2';
 
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES = 'analysis.analyzedFiles';
 const String ANALYSIS_NOTIFICATION_ANALYZED_FILES_DIRECTORIES = 'directories';
@@ -168,6 +168,8 @@
 const String EDIT_REQUEST_DARTFIX_EXCLUDED_FIXES = 'excludedFixes';
 const String EDIT_REQUEST_DARTFIX_INCLUDED = 'included';
 const String EDIT_REQUEST_DARTFIX_INCLUDED_FIXES = 'includedFixes';
+const String EDIT_REQUEST_DARTFIX_INCLUDE_PEDANTIC_FIXES =
+    'includePedanticFixes';
 const String EDIT_REQUEST_DARTFIX_INCLUDE_REQUIRED_FIXES =
     'includeRequiredFixes';
 const String EDIT_REQUEST_FORMAT = 'edit.format';
@@ -276,20 +278,19 @@
 const String EXECUTION_RESPONSE_MAP_URI_URI = 'uri';
 const String FLUTTER_NOTIFICATION_OUTLINE = 'flutter.outline';
 const String FLUTTER_NOTIFICATION_OUTLINE_FILE = 'file';
-const String FLUTTER_NOTIFICATION_OUTLINE_INSTRUMENTED_CODE =
-    'instrumentedCode';
 const String FLUTTER_NOTIFICATION_OUTLINE_OUTLINE = 'outline';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR =
-    'flutter.getChangeAddForDesignTimeConstructor';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_FILE =
-    'file';
-const String FLUTTER_REQUEST_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_OFFSET =
-    'offset';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION =
+    'flutter.getWidgetDescription';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION_FILE = 'file';
+const String FLUTTER_REQUEST_GET_WIDGET_DESCRIPTION_OFFSET = 'offset';
 const String FLUTTER_REQUEST_SET_SUBSCRIPTIONS = 'flutter.setSubscriptions';
 const String FLUTTER_REQUEST_SET_SUBSCRIPTIONS_SUBSCRIPTIONS = 'subscriptions';
-const String
-    FLUTTER_RESPONSE_GET_CHANGE_ADD_FOR_DESIGN_TIME_CONSTRUCTOR_CHANGE =
-    'change';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE =
+    'flutter.setWidgetPropertyValue';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE_ID = 'id';
+const String FLUTTER_REQUEST_SET_WIDGET_PROPERTY_VALUE_VALUE = 'value';
+const String FLUTTER_RESPONSE_GET_WIDGET_DESCRIPTION_PROPERTIES = 'properties';
+const String FLUTTER_RESPONSE_SET_WIDGET_PROPERTY_VALUE_CHANGE = 'change';
 const String KYTHE_REQUEST_GET_KYTHE_ENTRIES = 'kythe.getKytheEntries';
 const String KYTHE_REQUEST_GET_KYTHE_ENTRIES_FILE = 'file';
 const String KYTHE_RESPONSE_GET_KYTHE_ENTRIES_ENTRIES = 'entries';
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 23f7303..2c611b4 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_generated.dart
@@ -8023,6 +8023,7 @@
  * {
  *   "included": List<FilePath>
  *   "includedFixes": optional List<String>
+ *   "includePedanticFixes": optional bool
  *   "includeRequiredFixes": optional bool
  *   "excludedFixes": optional List<String>
  * }
@@ -8034,6 +8035,8 @@
 
   List<String> _includedFixes;
 
+  bool _includePedanticFixes;
+
   bool _includeRequiredFixes;
 
   List<String> _excludedFixes;
@@ -8084,6 +8087,18 @@
   }
 
   /**
+   * A flag indicating that "pedantic" fixes should be applied.
+   */
+  bool get includePedanticFixes => _includePedanticFixes;
+
+  /**
+   * A flag indicating that "pedantic" fixes should be applied.
+   */
+  void set includePedanticFixes(bool value) {
+    this._includePedanticFixes = value;
+  }
+
+  /**
    * A flag indicating that "required" fixes should be applied.
    */
   bool get includeRequiredFixes => _includeRequiredFixes;
@@ -8115,10 +8130,12 @@
 
   EditDartfixParams(List<String> included,
       {List<String> includedFixes,
+      bool includePedanticFixes,
       bool includeRequiredFixes,
       List<String> excludedFixes}) {
     this.included = included;
     this.includedFixes = includedFixes;
+    this.includePedanticFixes = includePedanticFixes;
     this.includeRequiredFixes = includeRequiredFixes;
     this.excludedFixes = excludedFixes;
   }
@@ -8141,6 +8158,11 @@
         includedFixes = jsonDecoder.decodeList(jsonPath + ".includedFixes",
             json["includedFixes"], jsonDecoder.decodeString);
       }
+      bool includePedanticFixes;
+      if (json.containsKey("includePedanticFixes")) {
+        includePedanticFixes = jsonDecoder.decodeBool(
+            jsonPath + ".includePedanticFixes", json["includePedanticFixes"]);
+      }
       bool includeRequiredFixes;
       if (json.containsKey("includeRequiredFixes")) {
         includeRequiredFixes = jsonDecoder.decodeBool(
@@ -8153,6 +8175,7 @@
       }
       return new EditDartfixParams(included,
           includedFixes: includedFixes,
+          includePedanticFixes: includePedanticFixes,
           includeRequiredFixes: includeRequiredFixes,
           excludedFixes: excludedFixes);
     } else {
@@ -8172,6 +8195,9 @@
     if (includedFixes != null) {
       result["includedFixes"] = includedFixes;
     }
+    if (includePedanticFixes != null) {
+      result["includePedanticFixes"] = includePedanticFixes;
+    }
     if (includeRequiredFixes != null) {
       result["includeRequiredFixes"] = includeRequiredFixes;
     }
@@ -8196,6 +8222,7 @@
               included, other.included, (String a, String b) => a == b) &&
           listEqual(includedFixes, other.includedFixes,
               (String a, String b) => a == b) &&
+          includePedanticFixes == other.includePedanticFixes &&
           includeRequiredFixes == other.includeRequiredFixes &&
           listEqual(excludedFixes, other.excludedFixes,
               (String a, String b) => a == b);
@@ -8208,6 +8235,7 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, included.hashCode);
     hash = JenkinsSmiHash.combine(hash, includedFixes.hashCode);
+    hash = JenkinsSmiHash.combine(hash, includePedanticFixes.hashCode);
     hash = JenkinsSmiHash.combine(hash, includeRequiredFixes.hashCode);
     hash = JenkinsSmiHash.combine(hash, excludedFixes.hashCode);
     return JenkinsSmiHash.finish(hash);
@@ -14444,7 +14472,7 @@
 }
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor params
+ * flutter.getWidgetDescription params
  *
  * {
  *   "file": FilePath
@@ -14453,19 +14481,18 @@
  *
  * Clients may not extend, implement or mix-in this class.
  */
-class FlutterGetChangeAddForDesignTimeConstructorParams
-    implements RequestParams {
+class FlutterGetWidgetDescriptionParams implements RequestParams {
   String _file;
 
   int _offset;
 
   /**
-   * The file containing the code of the class.
+   * The file where the widget instance is created.
    */
   String get file => _file;
 
   /**
-   * The file containing the code of the class.
+   * The file where the widget instance is created.
    */
   void set file(String value) {
     assert(value != null);
@@ -14473,24 +14500,24 @@
   }
 
   /**
-   * The offset of the class in the code.
+   * The offset in the file where the widget instance is created.
    */
   int get offset => _offset;
 
   /**
-   * The offset of the class in the code.
+   * The offset in the file where the widget instance is created.
    */
   void set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
 
-  FlutterGetChangeAddForDesignTimeConstructorParams(String file, int offset) {
+  FlutterGetWidgetDescriptionParams(String file, int offset) {
     this.file = file;
     this.offset = offset;
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorParams.fromJson(
+  factory FlutterGetWidgetDescriptionParams.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
       json = {};
@@ -14508,17 +14535,15 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "offset");
       }
-      return new FlutterGetChangeAddForDesignTimeConstructorParams(
-          file, offset);
+      return new FlutterGetWidgetDescriptionParams(file, offset);
     } else {
-      throw jsonDecoder.mismatch(jsonPath,
-          "flutter.getChangeAddForDesignTimeConstructor params", json);
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.getWidgetDescription params", json);
     }
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorParams.fromRequest(
-      Request request) {
-    return new FlutterGetChangeAddForDesignTimeConstructorParams.fromJson(
+  factory FlutterGetWidgetDescriptionParams.fromRequest(Request request) {
+    return new FlutterGetWidgetDescriptionParams.fromJson(
         new RequestDecoder(request), "params", request.params);
   }
 
@@ -14532,8 +14557,7 @@
 
   @override
   Request toRequest(String id) {
-    return new Request(
-        id, "flutter.getChangeAddForDesignTimeConstructor", toJson());
+    return new Request(id, "flutter.getWidgetDescription", toJson());
   }
 
   @override
@@ -14541,7 +14565,7 @@
 
   @override
   bool operator ==(other) {
-    if (other is FlutterGetChangeAddForDesignTimeConstructorParams) {
+    if (other is FlutterGetWidgetDescriptionParams) {
       return file == other.file && offset == other.offset;
     }
     return false;
@@ -14557,60 +14581,66 @@
 }
 
 /**
- * flutter.getChangeAddForDesignTimeConstructor result
+ * flutter.getWidgetDescription result
  *
  * {
- *   "change": SourceChange
+ *   "properties": List<FlutterWidgetProperty>
  * }
  *
  * Clients may not extend, implement or mix-in this class.
  */
-class FlutterGetChangeAddForDesignTimeConstructorResult
-    implements ResponseResult {
-  SourceChange _change;
+class FlutterGetWidgetDescriptionResult implements ResponseResult {
+  List<FlutterWidgetProperty> _properties;
 
   /**
-   * The change that adds the forDesignTime() constructor. If the change cannot
-   * be produced, an error is returned.
+   * The list of properties of the widget. Some of the properties might be read
+   * only, when their editor is not set. This might be because they have type
+   * that we don't know how to edit, or for compound properties that work as
+   * containers for sub-properties.
    */
-  SourceChange get change => _change;
+  List<FlutterWidgetProperty> get properties => _properties;
 
   /**
-   * The change that adds the forDesignTime() constructor. If the change cannot
-   * be produced, an error is returned.
+   * The list of properties of the widget. Some of the properties might be read
+   * only, when their editor is not set. This might be because they have type
+   * that we don't know how to edit, or for compound properties that work as
+   * containers for sub-properties.
    */
-  void set change(SourceChange value) {
+  void set properties(List<FlutterWidgetProperty> value) {
     assert(value != null);
-    this._change = value;
+    this._properties = value;
   }
 
-  FlutterGetChangeAddForDesignTimeConstructorResult(SourceChange change) {
-    this.change = change;
+  FlutterGetWidgetDescriptionResult(List<FlutterWidgetProperty> properties) {
+    this.properties = properties;
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorResult.fromJson(
+  factory FlutterGetWidgetDescriptionResult.fromJson(
       JsonDecoder jsonDecoder, String jsonPath, Object json) {
     if (json == null) {
       json = {};
     }
     if (json is Map) {
-      SourceChange change;
-      if (json.containsKey("change")) {
-        change = new SourceChange.fromJson(
-            jsonDecoder, jsonPath + ".change", json["change"]);
+      List<FlutterWidgetProperty> properties;
+      if (json.containsKey("properties")) {
+        properties = jsonDecoder.decodeList(
+            jsonPath + ".properties",
+            json["properties"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetProperty.fromJson(
+                    jsonDecoder, jsonPath, json));
       } else {
-        throw jsonDecoder.mismatch(jsonPath, "change");
+        throw jsonDecoder.mismatch(jsonPath, "properties");
       }
-      return new FlutterGetChangeAddForDesignTimeConstructorResult(change);
+      return new FlutterGetWidgetDescriptionResult(properties);
     } else {
-      throw jsonDecoder.mismatch(jsonPath,
-          "flutter.getChangeAddForDesignTimeConstructor result", json);
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.getWidgetDescription result", json);
     }
   }
 
-  factory FlutterGetChangeAddForDesignTimeConstructorResult.fromResponse(
-      Response response) {
-    return new FlutterGetChangeAddForDesignTimeConstructorResult.fromJson(
+  factory FlutterGetWidgetDescriptionResult.fromResponse(Response response) {
+    return new FlutterGetWidgetDescriptionResult.fromJson(
         new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
         "result",
         response.result);
@@ -14619,7 +14649,9 @@
   @override
   Map<String, dynamic> toJson() {
     Map<String, dynamic> result = {};
-    result["change"] = change.toJson();
+    result["properties"] = properties
+        .map((FlutterWidgetProperty value) => value.toJson())
+        .toList();
     return result;
   }
 
@@ -14633,8 +14665,9 @@
 
   @override
   bool operator ==(other) {
-    if (other is FlutterGetChangeAddForDesignTimeConstructorResult) {
-      return change == other.change;
+    if (other is FlutterGetWidgetDescriptionResult) {
+      return listEqual(properties, other.properties,
+          (FlutterWidgetProperty a, FlutterWidgetProperty b) => a == b);
     }
     return false;
   }
@@ -14642,7 +14675,7 @@
   @override
   int get hashCode {
     int hash = 0;
-    hash = JenkinsSmiHash.combine(hash, change.hashCode);
+    hash = JenkinsSmiHash.combine(hash, properties.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -14663,12 +14696,6 @@
  *   "parentAssociationLabel": optional String
  *   "variableName": optional String
  *   "children": optional List<FlutterOutline>
- *   "id": optional int
- *   "isWidgetClass": optional bool
- *   "renderConstructor": optional String
- *   "stateClassName": optional String
- *   "stateOffset": optional int
- *   "stateLength": optional int
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -14698,18 +14725,6 @@
 
   List<FlutterOutline> _children;
 
-  int _id;
-
-  bool _isWidgetClass;
-
-  String _renderConstructor;
-
-  String _stateClassName;
-
-  int _stateOffset;
-
-  int _stateLength;
-
   /**
    * The kind of the node.
    */
@@ -14881,102 +14896,6 @@
     this._children = value;
   }
 
-  /**
-   * If the node is a widget, and it is instrumented, the unique identifier of
-   * this widget, that can be used to associate rendering information with this
-   * node.
-   */
-  int get id => _id;
-
-  /**
-   * If the node is a widget, and it is instrumented, the unique identifier of
-   * this widget, that can be used to associate rendering information with this
-   * node.
-   */
-  void set id(int value) {
-    this._id = value;
-  }
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered,
-   * even if it does not yet have the rendering constructor. This field is
-   * omitted if the node is not a widget class.
-   */
-  bool get isWidgetClass => _isWidgetClass;
-
-  /**
-   * True if the node is a widget class, so it can potentially be rendered,
-   * even if it does not yet have the rendering constructor. This field is
-   * omitted if the node is not a widget class.
-   */
-  void set isWidgetClass(bool value) {
-    this._isWidgetClass = value;
-  }
-
-  /**
-   * If the node is a widget class that can be rendered for IDE, the name of
-   * the constructor that should be used to instantiate the widget. Empty
-   * string for default constructor. Absent if the node is not a widget class
-   * that can be rendered.
-   */
-  String get renderConstructor => _renderConstructor;
-
-  /**
-   * If the node is a widget class that can be rendered for IDE, the name of
-   * the constructor that should be used to instantiate the widget. Empty
-   * string for default constructor. Absent if the node is not a widget class
-   * that can be rendered.
-   */
-  void set renderConstructor(String value) {
-    this._renderConstructor = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the
-   * same file, the name of the state class.
-   */
-  String get stateClassName => _stateClassName;
-
-  /**
-   * If the node is a StatefulWidget, and its state class is defined in the
-   * same file, the name of the state class.
-   */
-  void set stateClassName(String value) {
-    this._stateClassName = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the offset of the state class code in the
-   * file.
-   */
-  int get stateOffset => _stateOffset;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the offset of the state class code in the
-   * file.
-   */
-  void set stateOffset(int value) {
-    this._stateOffset = value;
-  }
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the length of the state class code in the
-   * file.
-   */
-  int get stateLength => _stateLength;
-
-  /**
-   * If the node is a StatefulWidget that can be rendered, and its state class
-   * is defined in the same file, the length of the state class code in the
-   * file.
-   */
-  void set stateLength(int value) {
-    this._stateLength = value;
-  }
-
   FlutterOutline(FlutterOutlineKind kind, int offset, int length,
       int codeOffset, int codeLength,
       {String label,
@@ -14985,13 +14904,7 @@
       String className,
       String parentAssociationLabel,
       String variableName,
-      List<FlutterOutline> children,
-      int id,
-      bool isWidgetClass,
-      String renderConstructor,
-      String stateClassName,
-      int stateOffset,
-      int stateLength}) {
+      List<FlutterOutline> children}) {
     this.kind = kind;
     this.offset = offset;
     this.length = length;
@@ -15004,12 +14917,6 @@
     this.parentAssociationLabel = parentAssociationLabel;
     this.variableName = variableName;
     this.children = children;
-    this.id = id;
-    this.isWidgetClass = isWidgetClass;
-    this.renderConstructor = renderConstructor;
-    this.stateClassName = stateClassName;
-    this.stateOffset = stateOffset;
-    this.stateLength = stateLength;
   }
 
   factory FlutterOutline.fromJson(
@@ -15093,35 +15000,6 @@
             (String jsonPath, Object json) =>
                 new FlutterOutline.fromJson(jsonDecoder, jsonPath, json));
       }
-      int id;
-      if (json.containsKey("id")) {
-        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
-      }
-      bool isWidgetClass;
-      if (json.containsKey("isWidgetClass")) {
-        isWidgetClass = jsonDecoder.decodeBool(
-            jsonPath + ".isWidgetClass", json["isWidgetClass"]);
-      }
-      String renderConstructor;
-      if (json.containsKey("renderConstructor")) {
-        renderConstructor = jsonDecoder.decodeString(
-            jsonPath + ".renderConstructor", json["renderConstructor"]);
-      }
-      String stateClassName;
-      if (json.containsKey("stateClassName")) {
-        stateClassName = jsonDecoder.decodeString(
-            jsonPath + ".stateClassName", json["stateClassName"]);
-      }
-      int stateOffset;
-      if (json.containsKey("stateOffset")) {
-        stateOffset = jsonDecoder.decodeInt(
-            jsonPath + ".stateOffset", json["stateOffset"]);
-      }
-      int stateLength;
-      if (json.containsKey("stateLength")) {
-        stateLength = jsonDecoder.decodeInt(
-            jsonPath + ".stateLength", json["stateLength"]);
-      }
       return new FlutterOutline(kind, offset, length, codeOffset, codeLength,
           label: label,
           dartElement: dartElement,
@@ -15129,13 +15007,7 @@
           className: className,
           parentAssociationLabel: parentAssociationLabel,
           variableName: variableName,
-          children: children,
-          id: id,
-          isWidgetClass: isWidgetClass,
-          renderConstructor: renderConstructor,
-          stateClassName: stateClassName,
-          stateOffset: stateOffset,
-          stateLength: stateLength);
+          children: children);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "FlutterOutline", json);
     }
@@ -15173,24 +15045,6 @@
       result["children"] =
           children.map((FlutterOutline value) => value.toJson()).toList();
     }
-    if (id != null) {
-      result["id"] = id;
-    }
-    if (isWidgetClass != null) {
-      result["isWidgetClass"] = isWidgetClass;
-    }
-    if (renderConstructor != null) {
-      result["renderConstructor"] = renderConstructor;
-    }
-    if (stateClassName != null) {
-      result["stateClassName"] = stateClassName;
-    }
-    if (stateOffset != null) {
-      result["stateOffset"] = stateOffset;
-    }
-    if (stateLength != null) {
-      result["stateLength"] = stateLength;
-    }
     return result;
   }
 
@@ -15216,13 +15070,7 @@
           parentAssociationLabel == other.parentAssociationLabel &&
           variableName == other.variableName &&
           listEqual(children, other.children,
-              (FlutterOutline a, FlutterOutline b) => a == b) &&
-          id == other.id &&
-          isWidgetClass == other.isWidgetClass &&
-          renderConstructor == other.renderConstructor &&
-          stateClassName == other.stateClassName &&
-          stateOffset == other.stateOffset &&
-          stateLength == other.stateLength;
+              (FlutterOutline a, FlutterOutline b) => a == b);
     }
     return false;
   }
@@ -15242,12 +15090,6 @@
     hash = JenkinsSmiHash.combine(hash, parentAssociationLabel.hashCode);
     hash = JenkinsSmiHash.combine(hash, variableName.hashCode);
     hash = JenkinsSmiHash.combine(hash, children.hashCode);
-    hash = JenkinsSmiHash.combine(hash, id.hashCode);
-    hash = JenkinsSmiHash.combine(hash, isWidgetClass.hashCode);
-    hash = JenkinsSmiHash.combine(hash, renderConstructor.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateClassName.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateOffset.hashCode);
-    hash = JenkinsSmiHash.combine(hash, stateLength.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15261,6 +15103,8 @@
  *   "literalValueBoolean": optional bool
  *   "literalValueInteger": optional int
  *   "literalValueString": optional String
+ *   "nameLocation": optional Location
+ *   "valueLocation": optional Location
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -15276,6 +15120,10 @@
 
   String _literalValueString;
 
+  Location _nameLocation;
+
+  Location _valueLocation;
+
   /**
    * The name of the attribute.
    */
@@ -15346,15 +15194,51 @@
     this._literalValueString = value;
   }
 
+  /**
+   * If the attribute is a named argument, the location of the name, without
+   * the colon.
+   */
+  Location get nameLocation => _nameLocation;
+
+  /**
+   * If the attribute is a named argument, the location of the name, without
+   * the colon.
+   */
+  void set nameLocation(Location value) {
+    this._nameLocation = value;
+  }
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward
+   * compatibility between new clients with older servers.
+   */
+  Location get valueLocation => _valueLocation;
+
+  /**
+   * The location of the value.
+   *
+   * This field is always available, but marked optional for backward
+   * compatibility between new clients with older servers.
+   */
+  void set valueLocation(Location value) {
+    this._valueLocation = value;
+  }
+
   FlutterOutlineAttribute(String name, String label,
       {bool literalValueBoolean,
       int literalValueInteger,
-      String literalValueString}) {
+      String literalValueString,
+      Location nameLocation,
+      Location valueLocation}) {
     this.name = name;
     this.label = label;
     this.literalValueBoolean = literalValueBoolean;
     this.literalValueInteger = literalValueInteger;
     this.literalValueString = literalValueString;
+    this.nameLocation = nameLocation;
+    this.valueLocation = valueLocation;
   }
 
   factory FlutterOutlineAttribute.fromJson(
@@ -15390,10 +15274,22 @@
         literalValueString = jsonDecoder.decodeString(
             jsonPath + ".literalValueString", json["literalValueString"]);
       }
+      Location nameLocation;
+      if (json.containsKey("nameLocation")) {
+        nameLocation = new Location.fromJson(
+            jsonDecoder, jsonPath + ".nameLocation", json["nameLocation"]);
+      }
+      Location valueLocation;
+      if (json.containsKey("valueLocation")) {
+        valueLocation = new Location.fromJson(
+            jsonDecoder, jsonPath + ".valueLocation", json["valueLocation"]);
+      }
       return new FlutterOutlineAttribute(name, label,
           literalValueBoolean: literalValueBoolean,
           literalValueInteger: literalValueInteger,
-          literalValueString: literalValueString);
+          literalValueString: literalValueString,
+          nameLocation: nameLocation,
+          valueLocation: valueLocation);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "FlutterOutlineAttribute", json);
     }
@@ -15413,6 +15309,12 @@
     if (literalValueString != null) {
       result["literalValueString"] = literalValueString;
     }
+    if (nameLocation != null) {
+      result["nameLocation"] = nameLocation.toJson();
+    }
+    if (valueLocation != null) {
+      result["valueLocation"] = valueLocation.toJson();
+    }
     return result;
   }
 
@@ -15426,7 +15328,9 @@
           label == other.label &&
           literalValueBoolean == other.literalValueBoolean &&
           literalValueInteger == other.literalValueInteger &&
-          literalValueString == other.literalValueString;
+          literalValueString == other.literalValueString &&
+          nameLocation == other.nameLocation &&
+          valueLocation == other.valueLocation;
     }
     return false;
   }
@@ -15439,6 +15343,8 @@
     hash = JenkinsSmiHash.combine(hash, literalValueBoolean.hashCode);
     hash = JenkinsSmiHash.combine(hash, literalValueInteger.hashCode);
     hash = JenkinsSmiHash.combine(hash, literalValueString.hashCode);
+    hash = JenkinsSmiHash.combine(hash, nameLocation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, valueLocation.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15555,7 +15461,6 @@
  * {
  *   "file": FilePath
  *   "outline": FlutterOutline
- *   "instrumentedCode": optional String
  * }
  *
  * Clients may not extend, implement or mix-in this class.
@@ -15565,8 +15470,6 @@
 
   FlutterOutline _outline;
 
-  String _instrumentedCode;
-
   /**
    * The file with which the outline is associated.
    */
@@ -15593,29 +15496,9 @@
     this._outline = value;
   }
 
-  /**
-   * If the file has Flutter widgets that can be rendered, this field has the
-   * instrumented content of the file, that allows associating widgets with
-   * corresponding outline nodes. If there are no widgets to render, this field
-   * is absent.
-   */
-  String get instrumentedCode => _instrumentedCode;
-
-  /**
-   * If the file has Flutter widgets that can be rendered, this field has the
-   * instrumented content of the file, that allows associating widgets with
-   * corresponding outline nodes. If there are no widgets to render, this field
-   * is absent.
-   */
-  void set instrumentedCode(String value) {
-    this._instrumentedCode = value;
-  }
-
-  FlutterOutlineParams(String file, FlutterOutline outline,
-      {String instrumentedCode}) {
+  FlutterOutlineParams(String file, FlutterOutline outline) {
     this.file = file;
     this.outline = outline;
-    this.instrumentedCode = instrumentedCode;
   }
 
   factory FlutterOutlineParams.fromJson(
@@ -15637,13 +15520,7 @@
       } else {
         throw jsonDecoder.mismatch(jsonPath, "outline");
       }
-      String instrumentedCode;
-      if (json.containsKey("instrumentedCode")) {
-        instrumentedCode = jsonDecoder.decodeString(
-            jsonPath + ".instrumentedCode", json["instrumentedCode"]);
-      }
-      return new FlutterOutlineParams(file, outline,
-          instrumentedCode: instrumentedCode);
+      return new FlutterOutlineParams(file, outline);
     } else {
       throw jsonDecoder.mismatch(jsonPath, "flutter.outline params", json);
     }
@@ -15659,9 +15536,6 @@
     Map<String, dynamic> result = {};
     result["file"] = file;
     result["outline"] = outline.toJson();
-    if (instrumentedCode != null) {
-      result["instrumentedCode"] = instrumentedCode;
-    }
     return result;
   }
 
@@ -15675,9 +15549,7 @@
   @override
   bool operator ==(other) {
     if (other is FlutterOutlineParams) {
-      return file == other.file &&
-          outline == other.outline &&
-          instrumentedCode == other.instrumentedCode;
+      return file == other.file && outline == other.outline;
     }
     return false;
   }
@@ -15687,7 +15559,6 @@
     int hash = 0;
     hash = JenkinsSmiHash.combine(hash, file.hashCode);
     hash = JenkinsSmiHash.combine(hash, outline.hashCode);
-    hash = JenkinsSmiHash.combine(hash, instrumentedCode.hashCode);
     return JenkinsSmiHash.finish(hash);
   }
 }
@@ -15866,6 +15737,1110 @@
 }
 
 /**
+ * flutter.setWidgetPropertyValue params
+ *
+ * {
+ *   "id": int
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterSetWidgetPropertyValueParams implements RequestParams {
+  int _id;
+
+  FlutterWidgetPropertyValue _value;
+
+  /**
+   * The identifier of the property, previously returned as a part of a
+   * FlutterWidgetProperty.
+   *
+   * An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is generated
+   * if the identifier is not valid.
+   */
+  int get id => _id;
+
+  /**
+   * The identifier of the property, previously returned as a part of a
+   * FlutterWidgetProperty.
+   *
+   * An error of type FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID is generated
+   * if the identifier is not valid.
+   */
+  void set id(int value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  /**
+   * The new value to set for the property.
+   *
+   * If absent, indicates that the property should be removed. If the property
+   * corresponds to an optional parameter, the corresponding named argument is
+   * removed. If the property isRequired is true,
+   * FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
+   */
+  FlutterWidgetPropertyValue get value => _value;
+
+  /**
+   * The new value to set for the property.
+   *
+   * If absent, indicates that the property should be removed. If the property
+   * corresponds to an optional parameter, the corresponding named argument is
+   * removed. If the property isRequired is true,
+   * FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED error is generated.
+   */
+  void set value(FlutterWidgetPropertyValue value) {
+    this._value = value;
+  }
+
+  FlutterSetWidgetPropertyValueParams(int id,
+      {FlutterWidgetPropertyValue value}) {
+    this.id = id;
+    this.value = value;
+  }
+
+  factory FlutterSetWidgetPropertyValueParams.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      int id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "id");
+      }
+      FlutterWidgetPropertyValue value;
+      if (json.containsKey("value")) {
+        value = new FlutterWidgetPropertyValue.fromJson(
+            jsonDecoder, jsonPath + ".value", json["value"]);
+      }
+      return new FlutterSetWidgetPropertyValueParams(id, value: value);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.setWidgetPropertyValue params", json);
+    }
+  }
+
+  factory FlutterSetWidgetPropertyValueParams.fromRequest(Request request) {
+    return new FlutterSetWidgetPropertyValueParams.fromJson(
+        new RequestDecoder(request), "params", request.params);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["id"] = id;
+    if (value != null) {
+      result["value"] = value.toJson();
+    }
+    return result;
+  }
+
+  @override
+  Request toRequest(String id) {
+    return new Request(id, "flutter.setWidgetPropertyValue", toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterSetWidgetPropertyValueParams) {
+      return id == other.id && value == other.value;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * flutter.setWidgetPropertyValue result
+ *
+ * {
+ *   "change": SourceChange
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterSetWidgetPropertyValueResult implements ResponseResult {
+  SourceChange _change;
+
+  /**
+   * The change that should be applied.
+   */
+  SourceChange get change => _change;
+
+  /**
+   * The change that should be applied.
+   */
+  void set change(SourceChange value) {
+    assert(value != null);
+    this._change = value;
+  }
+
+  FlutterSetWidgetPropertyValueResult(SourceChange change) {
+    this.change = change;
+  }
+
+  factory FlutterSetWidgetPropertyValueResult.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      SourceChange change;
+      if (json.containsKey("change")) {
+        change = new SourceChange.fromJson(
+            jsonDecoder, jsonPath + ".change", json["change"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "change");
+      }
+      return new FlutterSetWidgetPropertyValueResult(change);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "flutter.setWidgetPropertyValue result", json);
+    }
+  }
+
+  factory FlutterSetWidgetPropertyValueResult.fromResponse(Response response) {
+    return new FlutterSetWidgetPropertyValueResult.fromJson(
+        new ResponseDecoder(REQUEST_ID_REFACTORING_KINDS.remove(response.id)),
+        "result",
+        response.result);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["change"] = change.toJson();
+    return result;
+  }
+
+  @override
+  Response toResponse(String id) {
+    return new Response(id, result: toJson());
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterSetWidgetPropertyValueResult) {
+      return change == other.change;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, change.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetProperty
+ *
+ * {
+ *   "documentation": optional String
+ *   "expression": optional String
+ *   "id": int
+ *   "isRequired": bool
+ *   "isSafeToUpdate": bool
+ *   "name": String
+ *   "children": optional List<FlutterWidgetProperty>
+ *   "editor": optional FlutterWidgetPropertyEditor
+ *   "value": optional FlutterWidgetPropertyValue
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetProperty implements HasToJson {
+  String _documentation;
+
+  String _expression;
+
+  int _id;
+
+  bool _isRequired;
+
+  bool _isSafeToUpdate;
+
+  String _name;
+
+  List<FlutterWidgetProperty> _children;
+
+  FlutterWidgetPropertyEditor _editor;
+
+  FlutterWidgetPropertyValue _value;
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the
+   * server does not know the documentation, e.g. because the corresponding
+   * field is not documented.
+   */
+  String get documentation => _documentation;
+
+  /**
+   * The documentation of the property to show to the user. Omitted if the
+   * server does not know the documentation, e.g. because the corresponding
+   * field is not documented.
+   */
+  void set documentation(String value) {
+    this._documentation = value;
+  }
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of
+   * this property.
+   */
+  String get expression => _expression;
+
+  /**
+   * If the value of this property is set, the Dart code of the expression of
+   * this property.
+   */
+  void set expression(String value) {
+    this._expression = value;
+  }
+
+  /**
+   * The unique identifier of the property, must be passed back to the server
+   * when updating the property value. Identifiers become invalid on any source
+   * code change.
+   */
+  int get id => _id;
+
+  /**
+   * The unique identifier of the property, must be passed back to the server
+   * when updating the property value. Identifiers become invalid on any source
+   * code change.
+   */
+  void set id(int value) {
+    assert(value != null);
+    this._id = value;
+  }
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a
+   * required parameter of a constructor.
+   */
+  bool get isRequired => _isRequired;
+
+  /**
+   * True if the property is required, e.g. because it corresponds to a
+   * required parameter of a constructor.
+   */
+  void set isRequired(bool value) {
+    assert(value != null);
+    this._isRequired = value;
+  }
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum
+   * constant), then it is safe to replace the expression with another concrete
+   * value. In this case this field is true. Otherwise, for example when the
+   * expression is a reference to a field, so that its value is provided from
+   * outside, this field is false.
+   */
+  bool get isSafeToUpdate => _isSafeToUpdate;
+
+  /**
+   * If the property expression is a concrete value (e.g. a literal, or an enum
+   * constant), then it is safe to replace the expression with another concrete
+   * value. In this case this field is true. Otherwise, for example when the
+   * expression is a reference to a field, so that its value is provided from
+   * outside, this field is false.
+   */
+  void set isSafeToUpdate(bool value) {
+    assert(value != null);
+    this._isSafeToUpdate = value;
+  }
+
+  /**
+   * The name of the property to display to the user.
+   */
+  String get name => _name;
+
+  /**
+   * The name of the property to display to the user.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  /**
+   * The list of children properties, if any. For example any property of type
+   * EdgeInsets will have four children properties of type double - left / top
+   * / right / bottom.
+   */
+  List<FlutterWidgetProperty> get children => _children;
+
+  /**
+   * The list of children properties, if any. For example any property of type
+   * EdgeInsets will have four children properties of type double - left / top
+   * / right / bottom.
+   */
+  void set children(List<FlutterWidgetProperty> value) {
+    this._children = value;
+  }
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the
+   * server does not know the editor for this property, for example because it
+   * does not have one of the supported types.
+   */
+  FlutterWidgetPropertyEditor get editor => _editor;
+
+  /**
+   * The editor that should be used by the client. This field is omitted if the
+   * server does not know the editor for this property, for example because it
+   * does not have one of the supported types.
+   */
+  void set editor(FlutterWidgetPropertyEditor value) {
+    this._editor = value;
+  }
+
+  /**
+   * If the expression is set, and the server knows the value of the
+   * expression, this field is set.
+   */
+  FlutterWidgetPropertyValue get value => _value;
+
+  /**
+   * If the expression is set, and the server knows the value of the
+   * expression, this field is set.
+   */
+  void set value(FlutterWidgetPropertyValue value) {
+    this._value = value;
+  }
+
+  FlutterWidgetProperty(
+      int id, bool isRequired, bool isSafeToUpdate, String name,
+      {String documentation,
+      String expression,
+      List<FlutterWidgetProperty> children,
+      FlutterWidgetPropertyEditor editor,
+      FlutterWidgetPropertyValue value}) {
+    this.documentation = documentation;
+    this.expression = expression;
+    this.id = id;
+    this.isRequired = isRequired;
+    this.isSafeToUpdate = isSafeToUpdate;
+    this.name = name;
+    this.children = children;
+    this.editor = editor;
+    this.value = value;
+  }
+
+  factory FlutterWidgetProperty.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String documentation;
+      if (json.containsKey("documentation")) {
+        documentation = jsonDecoder.decodeString(
+            jsonPath + ".documentation", json["documentation"]);
+      }
+      String expression;
+      if (json.containsKey("expression")) {
+        expression = jsonDecoder.decodeString(
+            jsonPath + ".expression", json["expression"]);
+      }
+      int id;
+      if (json.containsKey("id")) {
+        id = jsonDecoder.decodeInt(jsonPath + ".id", json["id"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "id");
+      }
+      bool isRequired;
+      if (json.containsKey("isRequired")) {
+        isRequired = jsonDecoder.decodeBool(
+            jsonPath + ".isRequired", json["isRequired"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "isRequired");
+      }
+      bool isSafeToUpdate;
+      if (json.containsKey("isSafeToUpdate")) {
+        isSafeToUpdate = jsonDecoder.decodeBool(
+            jsonPath + ".isSafeToUpdate", json["isSafeToUpdate"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "isSafeToUpdate");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "name");
+      }
+      List<FlutterWidgetProperty> children;
+      if (json.containsKey("children")) {
+        children = jsonDecoder.decodeList(
+            jsonPath + ".children",
+            json["children"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetProperty.fromJson(
+                    jsonDecoder, jsonPath, json));
+      }
+      FlutterWidgetPropertyEditor editor;
+      if (json.containsKey("editor")) {
+        editor = new FlutterWidgetPropertyEditor.fromJson(
+            jsonDecoder, jsonPath + ".editor", json["editor"]);
+      }
+      FlutterWidgetPropertyValue value;
+      if (json.containsKey("value")) {
+        value = new FlutterWidgetPropertyValue.fromJson(
+            jsonDecoder, jsonPath + ".value", json["value"]);
+      }
+      return new FlutterWidgetProperty(id, isRequired, isSafeToUpdate, name,
+          documentation: documentation,
+          expression: expression,
+          children: children,
+          editor: editor,
+          value: value);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetProperty", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (documentation != null) {
+      result["documentation"] = documentation;
+    }
+    if (expression != null) {
+      result["expression"] = expression;
+    }
+    result["id"] = id;
+    result["isRequired"] = isRequired;
+    result["isSafeToUpdate"] = isSafeToUpdate;
+    result["name"] = name;
+    if (children != null) {
+      result["children"] = children
+          .map((FlutterWidgetProperty value) => value.toJson())
+          .toList();
+    }
+    if (editor != null) {
+      result["editor"] = editor.toJson();
+    }
+    if (value != null) {
+      result["value"] = value.toJson();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetProperty) {
+      return documentation == other.documentation &&
+          expression == other.expression &&
+          id == other.id &&
+          isRequired == other.isRequired &&
+          isSafeToUpdate == other.isSafeToUpdate &&
+          name == other.name &&
+          listEqual(children, other.children,
+              (FlutterWidgetProperty a, FlutterWidgetProperty b) => a == b) &&
+          editor == other.editor &&
+          value == other.value;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    hash = JenkinsSmiHash.combine(hash, expression.hashCode);
+    hash = JenkinsSmiHash.combine(hash, id.hashCode);
+    hash = JenkinsSmiHash.combine(hash, isRequired.hashCode);
+    hash = JenkinsSmiHash.combine(hash, isSafeToUpdate.hashCode);
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, children.hashCode);
+    hash = JenkinsSmiHash.combine(hash, editor.hashCode);
+    hash = JenkinsSmiHash.combine(hash, value.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyEditor
+ *
+ * {
+ *   "kind": FlutterWidgetPropertyEditorKind
+ *   "enumItems": optional List<FlutterWidgetPropertyValueEnumItem>
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyEditor implements HasToJson {
+  FlutterWidgetPropertyEditorKind _kind;
+
+  List<FlutterWidgetPropertyValueEnumItem> _enumItems;
+
+  FlutterWidgetPropertyEditorKind get kind => _kind;
+
+  void set kind(FlutterWidgetPropertyEditorKind value) {
+    assert(value != null);
+    this._kind = value;
+  }
+
+  List<FlutterWidgetPropertyValueEnumItem> get enumItems => _enumItems;
+
+  void set enumItems(List<FlutterWidgetPropertyValueEnumItem> value) {
+    this._enumItems = value;
+  }
+
+  FlutterWidgetPropertyEditor(FlutterWidgetPropertyEditorKind kind,
+      {List<FlutterWidgetPropertyValueEnumItem> enumItems}) {
+    this.kind = kind;
+    this.enumItems = enumItems;
+  }
+
+  factory FlutterWidgetPropertyEditor.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      FlutterWidgetPropertyEditorKind kind;
+      if (json.containsKey("kind")) {
+        kind = new FlutterWidgetPropertyEditorKind.fromJson(
+            jsonDecoder, jsonPath + ".kind", json["kind"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "kind");
+      }
+      List<FlutterWidgetPropertyValueEnumItem> enumItems;
+      if (json.containsKey("enumItems")) {
+        enumItems = jsonDecoder.decodeList(
+            jsonPath + ".enumItems",
+            json["enumItems"],
+            (String jsonPath, Object json) =>
+                new FlutterWidgetPropertyValueEnumItem.fromJson(
+                    jsonDecoder, jsonPath, json));
+      }
+      return new FlutterWidgetPropertyEditor(kind, enumItems: enumItems);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetPropertyEditor", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["kind"] = kind.toJson();
+    if (enumItems != null) {
+      result["enumItems"] = enumItems
+          .map((FlutterWidgetPropertyValueEnumItem value) => value.toJson())
+          .toList();
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyEditor) {
+      return kind == other.kind &&
+          listEqual(
+              enumItems,
+              other.enumItems,
+              (FlutterWidgetPropertyValueEnumItem a,
+                      FlutterWidgetPropertyValueEnumItem b) =>
+                  a == b);
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, kind.hashCode);
+    hash = JenkinsSmiHash.combine(hash, enumItems.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyEditorKind
+ *
+ * enum {
+ *   BOOL
+ *   DOUBLE
+ *   ENUM
+ *   ENUM_LIKE
+ *   INT
+ *   STRING
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyEditorKind implements Enum {
+  /**
+   * The editor for a property of type bool.
+   */
+  static const FlutterWidgetPropertyEditorKind BOOL =
+      const FlutterWidgetPropertyEditorKind._("BOOL");
+
+  /**
+   * The editor for a property of the type double.
+   */
+  static const FlutterWidgetPropertyEditorKind DOUBLE =
+      const FlutterWidgetPropertyEditorKind._("DOUBLE");
+
+  /**
+   * The editor for choosing an item of an enumeration, see the enumItems field
+   * of FlutterWidgetPropertyEditor.
+   */
+  static const FlutterWidgetPropertyEditorKind ENUM =
+      const FlutterWidgetPropertyEditorKind._("ENUM");
+
+  /**
+   * The editor for either choosing a pre-defined item from a list of provided
+   * static field references (like ENUM), or specifying a free-form expression.
+   */
+  static const FlutterWidgetPropertyEditorKind ENUM_LIKE =
+      const FlutterWidgetPropertyEditorKind._("ENUM_LIKE");
+
+  /**
+   * The editor for a property of type int.
+   */
+  static const FlutterWidgetPropertyEditorKind INT =
+      const FlutterWidgetPropertyEditorKind._("INT");
+
+  /**
+   * The editor for a property of the type String.
+   */
+  static const FlutterWidgetPropertyEditorKind STRING =
+      const FlutterWidgetPropertyEditorKind._("STRING");
+
+  /**
+   * A list containing all of the enum values that are defined.
+   */
+  static const List<FlutterWidgetPropertyEditorKind> VALUES =
+      const <FlutterWidgetPropertyEditorKind>[
+    BOOL,
+    DOUBLE,
+    ENUM,
+    ENUM_LIKE,
+    INT,
+    STRING
+  ];
+
+  @override
+  final String name;
+
+  const FlutterWidgetPropertyEditorKind._(this.name);
+
+  factory FlutterWidgetPropertyEditorKind(String name) {
+    switch (name) {
+      case "BOOL":
+        return BOOL;
+      case "DOUBLE":
+        return DOUBLE;
+      case "ENUM":
+        return ENUM;
+      case "ENUM_LIKE":
+        return ENUM_LIKE;
+      case "INT":
+        return INT;
+      case "STRING":
+        return STRING;
+    }
+    throw new Exception('Illegal enum value: $name');
+  }
+
+  factory FlutterWidgetPropertyEditorKind.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json is String) {
+      try {
+        return new FlutterWidgetPropertyEditorKind(json);
+      } catch (_) {
+        // Fall through
+      }
+    }
+    throw jsonDecoder.mismatch(
+        jsonPath, "FlutterWidgetPropertyEditorKind", json);
+  }
+
+  @override
+  String toString() => "FlutterWidgetPropertyEditorKind.$name";
+
+  String toJson() => name;
+}
+
+/**
+ * FlutterWidgetPropertyValue
+ *
+ * {
+ *   "boolValue": optional bool
+ *   "doubleValue": optional double
+ *   "intValue": optional int
+ *   "stringValue": optional String
+ *   "enumValue": optional FlutterWidgetPropertyValueEnumItem
+ *   "expression": optional String
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyValue implements HasToJson {
+  bool _boolValue;
+
+  double _doubleValue;
+
+  int _intValue;
+
+  String _stringValue;
+
+  FlutterWidgetPropertyValueEnumItem _enumValue;
+
+  String _expression;
+
+  bool get boolValue => _boolValue;
+
+  void set boolValue(bool value) {
+    this._boolValue = value;
+  }
+
+  double get doubleValue => _doubleValue;
+
+  void set doubleValue(double value) {
+    this._doubleValue = value;
+  }
+
+  int get intValue => _intValue;
+
+  void set intValue(int value) {
+    this._intValue = value;
+  }
+
+  String get stringValue => _stringValue;
+
+  void set stringValue(String value) {
+    this._stringValue = value;
+  }
+
+  FlutterWidgetPropertyValueEnumItem get enumValue => _enumValue;
+
+  void set enumValue(FlutterWidgetPropertyValueEnumItem value) {
+    this._enumValue = value;
+  }
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  String get expression => _expression;
+
+  /**
+   * A free-form expression, which will be used as the value as is.
+   */
+  void set expression(String value) {
+    this._expression = value;
+  }
+
+  FlutterWidgetPropertyValue(
+      {bool boolValue,
+      double doubleValue,
+      int intValue,
+      String stringValue,
+      FlutterWidgetPropertyValueEnumItem enumValue,
+      String expression}) {
+    this.boolValue = boolValue;
+    this.doubleValue = doubleValue;
+    this.intValue = intValue;
+    this.stringValue = stringValue;
+    this.enumValue = enumValue;
+    this.expression = expression;
+  }
+
+  factory FlutterWidgetPropertyValue.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      bool boolValue;
+      if (json.containsKey("boolValue")) {
+        boolValue =
+            jsonDecoder.decodeBool(jsonPath + ".boolValue", json["boolValue"]);
+      }
+      double doubleValue;
+      if (json.containsKey("doubleValue")) {
+        doubleValue = jsonDecoder.decodeDouble(
+            jsonPath + ".doubleValue", json["doubleValue"]);
+      }
+      int intValue;
+      if (json.containsKey("intValue")) {
+        intValue =
+            jsonDecoder.decodeInt(jsonPath + ".intValue", json["intValue"]);
+      }
+      String stringValue;
+      if (json.containsKey("stringValue")) {
+        stringValue = jsonDecoder.decodeString(
+            jsonPath + ".stringValue", json["stringValue"]);
+      }
+      FlutterWidgetPropertyValueEnumItem enumValue;
+      if (json.containsKey("enumValue")) {
+        enumValue = new FlutterWidgetPropertyValueEnumItem.fromJson(
+            jsonDecoder, jsonPath + ".enumValue", json["enumValue"]);
+      }
+      String expression;
+      if (json.containsKey("expression")) {
+        expression = jsonDecoder.decodeString(
+            jsonPath + ".expression", json["expression"]);
+      }
+      return new FlutterWidgetPropertyValue(
+          boolValue: boolValue,
+          doubleValue: doubleValue,
+          intValue: intValue,
+          stringValue: stringValue,
+          enumValue: enumValue,
+          expression: expression);
+    } else {
+      throw jsonDecoder.mismatch(jsonPath, "FlutterWidgetPropertyValue", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    if (boolValue != null) {
+      result["boolValue"] = boolValue;
+    }
+    if (doubleValue != null) {
+      result["doubleValue"] = doubleValue;
+    }
+    if (intValue != null) {
+      result["intValue"] = intValue;
+    }
+    if (stringValue != null) {
+      result["stringValue"] = stringValue;
+    }
+    if (enumValue != null) {
+      result["enumValue"] = enumValue.toJson();
+    }
+    if (expression != null) {
+      result["expression"] = expression;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyValue) {
+      return boolValue == other.boolValue &&
+          doubleValue == other.doubleValue &&
+          intValue == other.intValue &&
+          stringValue == other.stringValue &&
+          enumValue == other.enumValue &&
+          expression == other.expression;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, boolValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, doubleValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, intValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, stringValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, enumValue.hashCode);
+    hash = JenkinsSmiHash.combine(hash, expression.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
+ * FlutterWidgetPropertyValueEnumItem
+ *
+ * {
+ *   "libraryUri": String
+ *   "className": String
+ *   "name": String
+ *   "documentation": optional String
+ * }
+ *
+ * Clients may not extend, implement or mix-in this class.
+ */
+class FlutterWidgetPropertyValueEnumItem implements HasToJson {
+  String _libraryUri;
+
+  String _className;
+
+  String _name;
+
+  String _documentation;
+
+  /**
+   * The URI of the library containing the className. When the enum item is
+   * passed back, this will allow the server to import the corresponding
+   * library if necessary.
+   */
+  String get libraryUri => _libraryUri;
+
+  /**
+   * The URI of the library containing the className. When the enum item is
+   * passed back, this will allow the server to import the corresponding
+   * library if necessary.
+   */
+  void set libraryUri(String value) {
+    assert(value != null);
+    this._libraryUri = value;
+  }
+
+  /**
+   * The name of the class or enum.
+   */
+  String get className => _className;
+
+  /**
+   * The name of the class or enum.
+   */
+  void set className(String value) {
+    assert(value != null);
+    this._className = value;
+  }
+
+  /**
+   * The name of the field in the enumeration, or the static field in the
+   * class.
+   */
+  String get name => _name;
+
+  /**
+   * The name of the field in the enumeration, or the static field in the
+   * class.
+   */
+  void set name(String value) {
+    assert(value != null);
+    this._name = value;
+  }
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know
+   * the documentation, e.g. because the corresponding field is not documented.
+   */
+  String get documentation => _documentation;
+
+  /**
+   * The documentation to show to the user. Omitted if the server does not know
+   * the documentation, e.g. because the corresponding field is not documented.
+   */
+  void set documentation(String value) {
+    this._documentation = value;
+  }
+
+  FlutterWidgetPropertyValueEnumItem(
+      String libraryUri, String className, String name,
+      {String documentation}) {
+    this.libraryUri = libraryUri;
+    this.className = className;
+    this.name = name;
+    this.documentation = documentation;
+  }
+
+  factory FlutterWidgetPropertyValueEnumItem.fromJson(
+      JsonDecoder jsonDecoder, String jsonPath, Object json) {
+    if (json == null) {
+      json = {};
+    }
+    if (json is Map) {
+      String libraryUri;
+      if (json.containsKey("libraryUri")) {
+        libraryUri = jsonDecoder.decodeString(
+            jsonPath + ".libraryUri", json["libraryUri"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "libraryUri");
+      }
+      String className;
+      if (json.containsKey("className")) {
+        className = jsonDecoder.decodeString(
+            jsonPath + ".className", json["className"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "className");
+      }
+      String name;
+      if (json.containsKey("name")) {
+        name = jsonDecoder.decodeString(jsonPath + ".name", json["name"]);
+      } else {
+        throw jsonDecoder.mismatch(jsonPath, "name");
+      }
+      String documentation;
+      if (json.containsKey("documentation")) {
+        documentation = jsonDecoder.decodeString(
+            jsonPath + ".documentation", json["documentation"]);
+      }
+      return new FlutterWidgetPropertyValueEnumItem(libraryUri, className, name,
+          documentation: documentation);
+    } else {
+      throw jsonDecoder.mismatch(
+          jsonPath, "FlutterWidgetPropertyValueEnumItem", json);
+    }
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    Map<String, dynamic> result = {};
+    result["libraryUri"] = libraryUri;
+    result["className"] = className;
+    result["name"] = name;
+    if (documentation != null) {
+      result["documentation"] = documentation;
+    }
+    return result;
+  }
+
+  @override
+  String toString() => json.encode(toJson());
+
+  @override
+  bool operator ==(other) {
+    if (other is FlutterWidgetPropertyValueEnumItem) {
+      return libraryUri == other.libraryUri &&
+          className == other.className &&
+          name == other.name &&
+          documentation == other.documentation;
+    }
+    return false;
+  }
+
+  @override
+  int get hashCode {
+    int hash = 0;
+    hash = JenkinsSmiHash.combine(hash, libraryUri.hashCode);
+    hash = JenkinsSmiHash.combine(hash, className.hashCode);
+    hash = JenkinsSmiHash.combine(hash, name.hashCode);
+    hash = JenkinsSmiHash.combine(hash, documentation.hashCode);
+    return JenkinsSmiHash.finish(hash);
+  }
+}
+
+/**
  * GeneralAnalysisService
  *
  * enum {
@@ -18740,6 +19715,9 @@
  *   CONTENT_MODIFIED
  *   DEBUG_PORT_COULD_NOT_BE_OPENED
  *   FILE_NOT_ANALYZED
+ *   FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID
+ *   FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED
  *   FORMAT_INVALID_FILE
  *   FORMAT_WITH_ERRORS
  *   GET_ERRORS_INVALID_FILE
@@ -18793,6 +19771,27 @@
       const RequestErrorCode._("FILE_NOT_ANALYZED");
 
   /**
+   * The given location does not have a supported widget.
+   */
+  static const RequestErrorCode FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET =
+      const RequestErrorCode._("FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET");
+
+  /**
+   * The given property identifier is not valid. It might have never been
+   * valid, or a change to code invalidated it, or its TTL was exceeded.
+   */
+  static const RequestErrorCode FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID =
+      const RequestErrorCode._("FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID");
+
+  /**
+   * The value of the property cannot be removed, for example because the
+   * corresponding constructor argument is required, and the server does not
+   * know what default value to use.
+   */
+  static const RequestErrorCode FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED =
+      const RequestErrorCode._("FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED");
+
+  /**
    * An "edit.format" request specified a FilePath which does not match a Dart
    * file in an analysis root.
    */
@@ -18984,6 +19983,9 @@
     CONTENT_MODIFIED,
     DEBUG_PORT_COULD_NOT_BE_OPENED,
     FILE_NOT_ANALYZED,
+    FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET,
+    FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID,
+    FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED,
     FORMAT_INVALID_FILE,
     FORMAT_WITH_ERRORS,
     GET_ERRORS_INVALID_FILE,
@@ -19025,6 +20027,12 @@
         return DEBUG_PORT_COULD_NOT_BE_OPENED;
       case "FILE_NOT_ANALYZED":
         return FILE_NOT_ANALYZED;
+      case "FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET":
+        return FLUTTER_GET_WIDGET_DESCRIPTION_NO_WIDGET;
+      case "FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID":
+        return FLUTTER_SET_WIDGET_PROPERTY_VALUE_INVALID_ID;
+      case "FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED":
+        return FLUTTER_SET_WIDGET_PROPERTY_VALUE_IS_REQUIRED;
       case "FORMAT_INVALID_FILE":
         return FORMAT_INVALID_FILE;
       case "FORMAT_WITH_ERRORS":
diff --git a/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart b/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
index c95e384..7ae87b7 100644
--- a/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analysis_server_client/lib/src/protocol/protocol_internal.dart
@@ -6,8 +6,8 @@
 import 'dart:convert' hide JsonDecoder;
 
 import 'package:analysis_server_client/src/protocol/protocol_base.dart';
-import 'package:analysis_server_client/src/protocol/protocol_generated.dart';
 import 'package:analysis_server_client/src/protocol/protocol_common.dart';
+import 'package:analysis_server_client/src/protocol/protocol_generated.dart';
 
 final Map<String, RefactoringKind> REQUEST_ID_REFACTORING_KINDS =
     new HashMap<String, RefactoringKind>();
@@ -277,6 +277,25 @@
   }
 
   /**
+   * Decode a JSON object that is expected to be a double.  A string
+   * representation of a double is also accepted.
+   */
+  double decodeDouble(String jsonPath, Object json) {
+    if (json is double) {
+      return json;
+    } else if (json is int) {
+      return json.toDouble();
+    } else if (json is String) {
+      double value = double.tryParse(json);
+      if (value == null) {
+        throw mismatch(jsonPath, 'double', json);
+      }
+      return value;
+    }
+    throw mismatch(jsonPath, 'double', json);
+  }
+
+  /**
    * Decode a JSON object that is expected to be an integer.  A string
    * representation of an integer is also accepted.
    */
diff --git a/pkg/analysis_server_client/pubspec.yaml b/pkg/analysis_server_client/pubspec.yaml
index fc2de5b..a09fc5f 100644
--- a/pkg/analysis_server_client/pubspec.yaml
+++ b/pkg/analysis_server_client/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analysis_server_client
-version: 1.1.2
+version: 1.1.3
 author: Dart Team <misc@dartlang.org>
 description:
   A client wrapper over analysis_server.
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 0f4bb38..a4090eb 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -1,3 +1,22 @@
+## 0.37.1 (Not yet published)
+* Added the getters `isDartCoreList`, `isDartCoreMap`, `isDartCoreNum`,
+  `isDartCoreSet`, and `isDartCoreSymbol` to `DartType`.
+* Added the method `DartObject.toFunctionValue`.
+* Deprecated the `isEquivalentTo(DartType)` method of `DartType`.
+  The operator `==` now correctly considers two types equal if and
+  only if they represent the same type as defined by the spec.
+* Deprecated the `isMoreSpecificThan(DartType)` method of `DartType`.
+  Deprecated the `isMoreSpecificThan(DartType)` method of `TypeSystem`.
+  Deprecated the `isSupertypeOf(DartType)` method of `TypeSystem`.
+  Use `TypeSystem.isSubtypeOf(DartType)` instead.
+* Deprecated methods `flattenFutures`, `isAssignableTo` of `DartType`.
+  Use `TypeSystem.flatten()` and `TypeSystem.isAssignableTo` instead.
+* Deprecated InheritanceManager2, and replaced with InheritanceManager3.
+  InheritanceManager3 returns ExecutableElements, not FunctionType(s).
+* Added the optional parameter `path` to `parseString`.
+* Changed `TypeSystem.resolveToBound(DartType)` implementation to do
+  what its documentation says.
+
 ## 0.37.0
 * Removed deprecated getter `DartType.isUndefined`.
 * Removed deprecated class `SdkLibrariesReader`.
diff --git a/pkg/analyzer/README.md b/pkg/analyzer/README.md
index f2f9b6a..201fcca 100644
--- a/pkg/analyzer/README.md
+++ b/pkg/analyzer/README.md
@@ -1,8 +1,7 @@
 # Analyzer for Dart
 
-This package provides a low-level _library_ that performs static analysis
-of Dart code. It is useful for tool
-integration and embedding.
+This package provides a library that performs static analysis
+of Dart code. It is useful for tool integration and embedding.
 
 End-users should use the [dartanalyzer][] command-line tool
 to analyze their Dart code.
@@ -84,15 +83,14 @@
 
 ## Background
 
-The APIs in this package are, quite frankly, a mess at the moment. They were
-originally machine generated by a translator and were based on an earlier Java
-implementation. Several of the API's still look like their Java predecessors
-(or worse) rather than clean Dart API's.
+The APIs in this package were originally machine generated by a translator and were
+based on an earlier Java implementation. Several of the API's still look like their Java
+predecessors rather than clean Dart APIs.
 
 In addition, there is currently no clean distinction between public and internal
-APIs. We plan to address this issue but doing so will, unfortunately,
-require a large number of breaking changes. We will try to minimize the pain
-this causes for our clients, but some pain is inevitable.
+APIs. We plan to address this issue but doing so will, unfortunately, require a
+large number of breaking changes. We will try to minimize the pain this causes for
+our clients, but some pain is inevitable.
 
 ## License
 
diff --git a/pkg/analyzer/analysis_options.yaml b/pkg/analyzer/analysis_options.yaml
index e36185e..a8010a3 100644
--- a/pkg/analyzer/analysis_options.yaml
+++ b/pkg/analyzer/analysis_options.yaml
@@ -1,6 +1,8 @@
 linter:
   rules:
-    - empty_constructor_bodies
+    - empty_constructor_bodies # pedantic
     - empty_statements
+    - prefer_is_empty # pedantic
+    - prefer_is_not_empty # pedantic
     - unnecessary_brace_in_string_interps
-    - valid_regexps
+    - valid_regexps # pedantic
diff --git a/pkg/analyzer/lib/analyzer.dart b/pkg/analyzer/lib/analyzer.dart
index 3d473b7..d01db71 100644
--- a/pkg/analyzer/lib/analyzer.dart
+++ b/pkg/analyzer/lib/analyzer.dart
@@ -168,7 +168,7 @@
       new AnalyzerErrorGroup.fromAnalysisErrors(_errors);
 
   /// Whether any errors where collected.
-  bool get hasErrors => !_errors.isEmpty;
+  bool get hasErrors => _errors.isNotEmpty;
 
   @override
   void onError(AnalysisError error) => _errors.add(error);
diff --git a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
index 2405a63..b2fba13 100644
--- a/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/dart/analysis/analysis_context_collection.dart
@@ -20,6 +20,7 @@
   /// system, otherwise the default resource provider will be used.
   factory AnalysisContextCollection(
       {@required List<String> includedPaths,
+      List<String> excludedPaths,
       ResourceProvider resourceProvider}) = AnalysisContextCollectionImpl;
 
   /// Return all of the analysis contexts in this collection.
diff --git a/pkg/analyzer/lib/dart/analysis/session.dart b/pkg/analyzer/lib/dart/analysis/session.dart
index 6f31a7b..111b153 100644
--- a/pkg/analyzer/lib/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/dart/analysis/session.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/exception/exception.dart';
 import 'package:analyzer/file_system/file_system.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 
@@ -90,6 +89,10 @@
   /// absolute, normalized [path].
   ParsedUnitResult getParsedUnit(String path);
 
+  /// Return information about the file at the given absolute, normalized
+  /// [path].
+  FileResult getFile(String path);
+
   /// Return a future that will complete with information about the results of
   /// resolving the file with the given absolute, normalized [path].
   ///
@@ -122,11 +125,6 @@
   /// complete with [SourceKind.UNKNOWN].
   Future<SourceKind> getSourceKind(String path);
 
-  /// Return a future that will complete with a list of the top-level
-  /// declarations with the given [name] in all known libraries.
-  Future<List<TopLevelDeclarationInSource>> getTopLevelDeclarations(
-      String name);
-
   /// 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].
diff --git a/pkg/analyzer/lib/dart/analysis/utilities.dart b/pkg/analyzer/lib/dart/analysis/utilities.dart
index f4f7dff..ac920d1 100644
--- a/pkg/analyzer/lib/dart/analysis/utilities.dart
+++ b/pkg/analyzer/lib/dart/analysis/utilities.dart
@@ -51,6 +51,7 @@
   var content = (resourceProvider.getResource(path) as File).readAsStringSync();
   return parseString(
       content: content,
+      path: path,
       featureSet: featureSet,
       throwIfDiagnostics: throwIfDiagnostics);
 }
@@ -93,6 +94,9 @@
 /// If a [featureSet] is provided, it will be the default set of features that
 /// will be assumed by the parser.
 ///
+/// If a [path] is provided, it will be used as the name of the file when
+/// reporting errors.
+///
 /// If [throwIfDiagnostics] is `true` (the default), then if any diagnostics are
 /// produced because of syntactic errors in the [content] an `ArgumentError`
 /// will be thrown. If the parameter is `false`, then the caller can check the
@@ -100,9 +104,10 @@
 ParseStringResult parseString(
     {@required String content,
     FeatureSet featureSet,
+    String path,
     bool throwIfDiagnostics: true}) {
   featureSet ??= FeatureSet.fromEnableFlags([]);
-  var source = StringSource(content, null);
+  var source = StringSource(content, path);
   var reader = CharSequenceReader(content);
   var errorCollector = RecordingErrorListener();
   var scanner = Scanner(source, reader, errorCollector)
diff --git a/pkg/analyzer/lib/dart/ast/ast.dart b/pkg/analyzer/lib/dart/ast/ast.dart
index 6db198d..e389879 100644
--- a/pkg/analyzer/lib/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/dart/ast/ast.dart
@@ -2114,6 +2114,9 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ExtensionDeclaration implements CompilationUnitMember {
+  @override
+  ExtensionElement get declaredElement;
+
   /// Return the type that is being extended.
   TypeAnnotation get extendedType;
 
@@ -2153,9 +2156,20 @@
   /// contain a single argument, which evaluates to the object being extended.
   ArgumentList get argumentList;
 
+  /// Return the actual type extended by this override, produced by applying
+  /// [typeArgumentTypes] to the generic type extended by the extension.
+  ///
+  /// Return `null` if the AST structure has not been resolved.
+  DartType get extendedType;
+
   /// Return the name of the extension being selected.
   Identifier get extensionName;
 
+  /// Return the forced extension element.
+  ///
+  /// Return `null` if the AST structure has not been resolved.
+  ExtensionElement get staticElement;
+
   /// Return the type arguments to be applied to the extension, or `null` if no
   /// type arguments were provided.
   TypeArgumentList get typeArguments;
@@ -4644,6 +4658,18 @@
   /// information to the given [element].
   void set staticElement(Element element);
 
+  /// If the identifier is a tear-off, return the inferred type arguments
+  /// applied to the function type of the element to produce its [staticType].
+  ///
+  /// Return an empty list if the function type does not have type parameters.
+  ///
+  /// Return an empty list if the context type has type parameters.
+  ///
+  /// Return `null` if not a tear-off.
+  ///
+  /// Return `null` if the AST structure has not been resolved.
+  List<DartType> get tearOffTypeArgumentTypes;
+
   /// Return the token representing the identifier.
   Token get token;
 
diff --git a/pkg/analyzer/lib/dart/ast/visitor.dart b/pkg/analyzer/lib/dart/ast/visitor.dart
index 7aae724..abd4c10 100644
--- a/pkg/analyzer/lib/dart/ast/visitor.dart
+++ b/pkg/analyzer/lib/dart/ast/visitor.dart
@@ -64,7 +64,7 @@
   /// breadth-first order.
   void visitAllNodes(AstNode root) {
     _queue.add(root);
-    while (!_queue.isEmpty) {
+    while (_queue.isNotEmpty) {
       AstNode next = _queue.removeFirst();
       next.accept(this);
     }
diff --git a/pkg/analyzer/lib/dart/constant/value.dart b/pkg/analyzer/lib/dart/constant/value.dart
index 7799cc5..f8c15ec 100644
--- a/pkg/analyzer/lib/dart/constant/value.dart
+++ b/pkg/analyzer/lib/dart/constant/value.dart
@@ -10,6 +10,7 @@
 ///
 /// Instances of these constant values are accessed through the
 /// [element model](../element/element.dart).
+import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 
 /// A representation of the value of a compile-time constant expression.
@@ -88,6 +89,14 @@
   /// * the value of the object being represented is `null`.
   double toDoubleValue();
 
+  /// Return an element corresponding to the value of the object being
+  /// represented, or `null`
+  /// if
+  /// * this object is not of a function type,
+  /// * the value of the object being represented is not known, or
+  /// * the value of the object being represented is `null`.
+  ExecutableElement toFunctionValue();
+
   /// Return an integer corresponding to the value of the object being
   /// represented, or `null` if
   /// * this object is not of type 'int',
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 9559ff3..9a1f011 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -349,9 +349,8 @@
 ///
 /// Clients may not extend, implement or mix-in this class.
 abstract class ClassMemberElement implements Element {
-  @override
-  ClassElement get enclosingElement;
-
+  // TODO(brianwilkerson) Either remove this class or rename it to something
+  //  more correct, such as PotentiallyStaticElement.
   /// Return `true` if this element is a static element. A static element is an
   /// element that is not associated with a particular instance, but rather with
   /// an entire library or class.
@@ -425,6 +424,9 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class ConstructorElement
     implements ClassMemberElement, ExecutableElement, ConstantEvaluationTarget {
+  @override
+  ClassElement get enclosingElement;
+
   /// Return `true` if this constructor is a const constructor.
   bool get isConst;
 
@@ -1058,7 +1060,7 @@
 /// An element that represents an extension.
 ///
 /// Clients may not extend, implement or mix-in this class.
-abstract class ExtensionElement implements Element {
+abstract class ExtensionElement implements TypeParameterizedElement {
   /// Return a list containing all of the accessors (getters and setters)
   /// declared in this extension.
   List<PropertyAccessorElement> get accessors;
@@ -1066,13 +1068,12 @@
   /// Return the type that is extended by this extension.
   DartType get extendedType;
 
+  /// Return a list containing all of the fields declared in this extension.
+  List<FieldElement> get fields;
+
   /// Return a list containing all of the methods declared in this extension.
   List<MethodElement> get methods;
 
-  /// Return a list containing all of the type parameters declared by this
-  /// extension.
-  List<TypeParameterElement> get typeParameters;
-
   /// Return the element representing the getter with the given [name] that is
   /// declared in this extension, or `null` if this extension does not declare a
   /// getter with the given name.
@@ -1100,6 +1101,11 @@
   /// Return `true` if this element is an enum constant.
   bool get isEnumConstant;
 
+  /// Return `true` if this element is a static element. A static element is an
+  /// element that is not associated with a particular instance, but rather with
+  /// an entire library or class.
+  bool get isStatic;
+
   /// Returns `true` if this field can be overridden in strong mode.
   @deprecated
   bool get isVirtual;
@@ -1191,7 +1197,7 @@
   /// return type was explicitly specified.
   DartType get returnType;
 
-  @override
+  /// Return the type defined by this element.
   FunctionType get type;
 }
 
@@ -1655,7 +1661,9 @@
 /// Clients may not extend, implement or mix-in this class.
 abstract class TypeParameterElement implements TypeDefiningElement {
   /// Return the type representing the bound associated with this parameter, or
-  /// `null` if this parameter does not have an explicit bound.
+  /// `null` if this parameter does not have an explicit bound. Being able to
+  /// distinguish between an implicit and explicit bound is needed by the
+  /// instantiate to bounds algorithm.
   DartType get bound;
 
   @override
@@ -1674,9 +1682,6 @@
   /// If the element does not define a type, returns `true`.
   bool get isSimplyBounded;
 
-  /// The type of this element, which will be a parameterized type.
-  ParameterizedType get type;
-
   /// Return a list containing all of the type parameters declared by this
   /// element directly. This does not include type parameters that are declared
   /// by any enclosing elements.
diff --git a/pkg/analyzer/lib/dart/element/type.dart b/pkg/analyzer/lib/dart/element/type.dart
index f54f8c4..30a77d9 100644
--- a/pkg/analyzer/lib/dart/element/type.dart
+++ b/pkg/analyzer/lib/dart/element/type.dart
@@ -67,14 +67,34 @@
   /// dart:core library.
   bool get isDartCoreInt;
 
+  /// Returns `true` if this type represents the type 'List' defined in the
+  /// dart:core library.
+  bool get isDartCoreList;
+
+  /// Returns `true` if this type represents the type 'Map' defined in the
+  /// dart:core library.
+  bool get isDartCoreMap;
+
   /// Return `true` if this type represents the type 'Null' defined in the
   /// dart:core library.
   bool get isDartCoreNull;
 
+  /// Return `true` if this type represents the type 'num' defined in the
+  /// dart:core library.
+  bool get isDartCoreNum;
+
+  /// Returns `true` if this type represents the type 'Set' defined in the
+  /// dart:core library.
+  bool get isDartCoreSet;
+
   /// Return `true` if this type represents the type 'String' defined in the
   /// dart:core library.
   bool get isDartCoreString;
 
+  /// Returns `true` if this type represents the type 'Symbol' defined in the
+  /// dart:core library.
+  bool get isDartCoreSymbol;
+
   /// Return `true` if this type represents the type 'dynamic'.
   bool get isDynamic;
 
@@ -97,11 +117,13 @@
   ///     and for all R, if T << Future<R> then S << R.  Then flatten(T) = S.
   ///
   ///     In any other circumstance, flatten(T) = T.
+  @Deprecated('Use TypeSystem.flatten() instead.')
   DartType flattenFutures(TypeSystem typeSystem);
 
   /// Return `true` if this type is assignable to the given [type]. A type
   /// <i>T</i> may be assigned to a type <i>S</i>, written <i>T</i> &hArr;
   /// <i>S</i>, iff either <i>T</i> <: <i>S</i> or <i>S</i> <: <i>T</i>.
+  @Deprecated('Use TypeSystem.isAssignableTo() instead.')
   bool isAssignableTo(DartType type);
 
   /// Indicates whether `this` represents a type that is equivalent to `dest`.
@@ -112,9 +134,11 @@
   ///
   /// `operator==` would consider F<int> and F<bool> to be different types;
   /// `isEquivalentTo` considers them to be equivalent.
+  @Deprecated('operator== was fixed. Use it instead.')
   bool isEquivalentTo(DartType dest);
 
   /// Return `true` if this type is more specific than the given [type].
+  @Deprecated('Use TypeSystem.isSubtypeOf() instead.')
   bool isMoreSpecificThan(DartType type);
 
   /// Return `true` if this type is a subtype of the given [type].
@@ -123,6 +147,7 @@
   /// Return `true` if this type is a supertype of the given [type]. A type
   /// <i>S</i> is a supertype of <i>T</i>, written <i>S</i> :> <i>T</i>, iff
   /// <i>T</i> is a subtype of <i>S</i>.
+  @Deprecated('Use TypeSystem.isSubtypeOf() instead.')
   bool isSupertypeOf(DartType type);
 
   /// If this type is a [TypeParameterType], returns its bound if it has one, or
@@ -357,26 +382,9 @@
   /// * <i>I</i> is listed in the implements clause of <i>J</i>.
   /// * <i>I</i> is listed in the with clause of <i>J</i>.
   /// * <i>J</i> is a mixin application of the mixin of <i>I</i>.
+  @Deprecated('This method was used internally, and is not used anymore.')
   bool isDirectSupertypeOf(InterfaceType type);
 
-  /// Return `true` if this type is more specific than the given [type]. An
-  /// interface type <i>T</i> is more specific than an interface type <i>S</i>,
-  /// written <i>T &laquo; S</i>, if one of the following conditions is met:
-  ///
-  /// * Reflexivity: <i>T</i> is <i>S</i>.
-  /// * <i>T</i> is bottom.
-  /// * <i>S</i> is dynamic.
-  /// * Direct supertype: <i>S</i> is a direct supertype of <i>T</i>.
-  /// * <i>T</i> is a type parameter and <i>S</i> is the upper bound of
-  /// <i>T</i>.
-  /// * Covariance: <i>T</i> is of the form <i>I&lt;T<sub>1</sub>, &hellip;,
-  ///   T<sub>n</sub>&gt;</i> and S</i> is of the form <i>I&lt;S<sub>1</sub>,
-  ///   &hellip;, S<sub>n</sub>&gt;</i> and <i>T<sub>i</sub> &laquo;
-  ///   S<sub>i</sub></i>, <i>1 <= i <= n</i>.
-  /// * Transitivity: <i>T &laquo; U</i> and <i>U &laquo; S</i>.
-  @override
-  bool isMoreSpecificThan(DartType type);
-
   /// Return `true` if this type is a subtype of the given [type]. An interface
   /// type <i>T</i> is a subtype of an interface type <i>S</i>, written <i>T</i>
   /// <: <i>S</i>, iff <i>[bottom/dynamic]T</i> &laquo; <i>S</i> (<i>T</i> is
diff --git a/pkg/analyzer/lib/dart/element/type_system.dart b/pkg/analyzer/lib/dart/element/type_system.dart
index 7906724..0879f80 100644
--- a/pkg/analyzer/lib/dart/element/type_system.dart
+++ b/pkg/analyzer/lib/dart/element/type_system.dart
@@ -125,6 +125,10 @@
   /// Other type systems may define this operation differently.
   DartType leastUpperBound(DartType leftType, DartType rightType);
 
+  /// Returns a non-nullable version of [type].  This is equivalent to the
+  /// operation `NonNull` defined in the spec.
+  DartType promoteToNonNull(DartType type);
+
   /// Return the result of resolving the bounds of the given [type].
   ///
   /// For the Dart 2.0 type system, the definition of resolving to bounds is
diff --git a/pkg/analyzer/lib/error/error.dart b/pkg/analyzer/lib/error/error.dart
index e15ffd3..feb9217 100644
--- a/pkg/analyzer/lib/error/error.dart
+++ b/pkg/analyzer/lib/error/error.dart
@@ -65,7 +65,9 @@
   CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH,
   CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
   CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
+  CompileTimeErrorCode.ACCESS_STATIC_EXTENSION_MEMBER,
   CompileTimeErrorCode.AMBIGUOUS_EXPORT,
+  CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS,
   CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_BOTH,
   CompileTimeErrorCode.AMBIGUOUS_SET_OR_MAP_LITERAL_EITHER,
   CompileTimeErrorCode.ANNOTATION_WITH_NON_CLASS,
@@ -135,6 +137,13 @@
   CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS,
   CompileTimeErrorCode.EXTENDS_DISALLOWED_CLASS,
   CompileTimeErrorCode.EXTENDS_NON_CLASS,
+  CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER,
+  CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR,
+  CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD,
+  CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT,
+  CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+  CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE,
+  CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS,
   CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS,
   CompileTimeErrorCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED,
   CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
@@ -172,6 +181,7 @@
   CompileTimeErrorCode.INVALID_ANNOTATION_GETTER,
   CompileTimeErrorCode.INVALID_CONSTANT,
   CompileTimeErrorCode.INVALID_CONSTRUCTOR_NAME,
+  CompileTimeErrorCode.INVALID_EXTENSION_ARGUMENT_COUNT,
   CompileTimeErrorCode.INVALID_FACTORY_NAME_NOT_A_CLASS,
   CompileTimeErrorCode.INVALID_MODIFIER_ON_CONSTRUCTOR,
   CompileTimeErrorCode.INVALID_MODIFIER_ON_SETTER,
@@ -184,6 +194,7 @@
   CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_SET,
   CompileTimeErrorCode.INVALID_URI,
   CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
+  CompileTimeErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION,
   CompileTimeErrorCode.LABEL_IN_OUTER_SCOPE,
   CompileTimeErrorCode.LABEL_UNDEFINED,
   CompileTimeErrorCode.MAP_ENTRY_NOT_IN_MAP,
@@ -237,8 +248,9 @@
   CompileTimeErrorCode.NON_SYNC_FACTORY,
   CompileTimeErrorCode.NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
   CompileTimeErrorCode.NOT_ENOUGH_REQUIRED_ARGUMENTS,
-  CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD,
-  CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE,
+  CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
+  CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR,
+  CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE,
   CompileTimeErrorCode.NOT_ITERABLE_SPREAD,
   CompileTimeErrorCode.NOT_MAP_SPREAD,
   CompileTimeErrorCode.NOT_NULL_AWARE_NULL_SPREAD,
@@ -277,6 +289,7 @@
   CompileTimeErrorCode.RETURN_IN_GENERATOR,
   CompileTimeErrorCode.SHARED_DEFERRED_PREFIX,
   CompileTimeErrorCode.SUPER_INITIALIZER_IN_OBJECT,
+  CompileTimeErrorCode.SUPER_IN_EXTENSION,
   CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT,
   CompileTimeErrorCode.SUPER_IN_REDIRECTING_CONSTRUCTOR,
   CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF,
@@ -286,6 +299,9 @@
   CompileTimeErrorCode.UNDEFINED_CLASS,
   CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER,
   CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
+  CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
+  CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
+  CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER,
   CompileTimeErrorCode.UNDEFINED_NAMED_PARAMETER,
   CompileTimeErrorCode.URI_DOES_NOT_EXIST,
   CompileTimeErrorCode.URI_HAS_NOT_BEEN_GENERATED,
@@ -357,6 +373,7 @@
   HintCode.SDK_VERSION_NEVER,
   HintCode.SDK_VERSION_SET_LITERAL,
   HintCode.SDK_VERSION_UI_AS_CODE,
+  HintCode.SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT,
   HintCode.STRICT_RAW_TYPE,
   HintCode.STRICT_RAW_TYPE_IN_AS,
   HintCode.STRICT_RAW_TYPE_IN_IS,
@@ -367,7 +384,6 @@
   HintCode.UNDEFINED_SHOWN_NAME,
   HintCode.UNNECESSARY_CAST,
   HintCode.UNNECESSARY_NO_SUCH_METHOD,
-  HintCode.UNNECESSARY_NULL_AWARE_CALL,
   HintCode.UNNECESSARY_TYPE_CHECK_FALSE,
   HintCode.UNNECESSARY_TYPE_CHECK_TRUE,
   HintCode.UNUSED_CATCH_CLAUSE,
@@ -685,13 +701,19 @@
   StaticWarningCode.TYPE_PARAMETER_REFERENCED_BY_STATIC,
   StaticWarningCode.TYPE_TEST_WITH_NON_TYPE,
   StaticWarningCode.TYPE_TEST_WITH_UNDEFINED_NAME,
+  StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE,
   StaticWarningCode.UNDEFINED_CLASS,
   StaticWarningCode.UNDEFINED_CLASS_BOOLEAN,
   StaticWarningCode.UNDEFINED_IDENTIFIER,
   StaticWarningCode.UNDEFINED_IDENTIFIER_AWAIT,
   StaticWarningCode.UNDEFINED_NAMED_PARAMETER,
+  StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION,
+  StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL,
+  StaticWarningCode.UNNECESSARY_NULL_AWARE_SPREAD,
   StaticWarningCode.USE_OF_VOID_RESULT,
   StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE,
+  StaticWarningCode.INVALID_USE_OF_NULL_VALUE,
+  StaticWarningCode.INVALID_USE_OF_NEVER_VALUE,
   StrongModeCode.ASSIGNMENT_CAST,
   StrongModeCode.COULD_NOT_INFER,
   StrongModeCode.DOWN_CAST_COMPOSITE,
diff --git a/pkg/analyzer/lib/file_system/overlay_file_system.dart b/pkg/analyzer/lib/file_system/overlay_file_system.dart
index 3628b8f..216a886 100644
--- a/pkg/analyzer/lib/file_system/overlay_file_system.dart
+++ b/pkg/analyzer/lib/file_system/overlay_file_system.dart
@@ -341,26 +341,28 @@
 
   @override
   List<Resource> getChildren() {
-    List<Resource> children;
+    Map<String, Resource> children = {};
     try {
-      children = _folder
-          .getChildren()
-          .map((child) => new _OverlayResource._from(_provider, child))
-          .toList();
+      for (final child in _folder.getChildren()) {
+        children[child.path] = new _OverlayResource._from(_provider, child);
+      }
     } on FileSystemException {
-      children = [];
+      // We don't want to throw if we're a folder that only exists in the overlay
+      // and not on disk.
     }
+
     for (String overlayPath in _provider._overlaysInFolder(path)) {
       pathos.Context context = _provider.pathContext;
       if (context.dirname(overlayPath) == path) {
-        children.add(_provider.getFile(overlayPath));
+        children.putIfAbsent(overlayPath, () => _provider.getFile(overlayPath));
       } else {
         String relativePath = context.relative(overlayPath, from: path);
         String folderName = context.split(relativePath)[0];
-        children.add(_provider.getFolder(context.join(path, folderName)));
+        String folderPath = context.join(path, folderName);
+        children.putIfAbsent(folderPath, () => _provider.getFolder(folderPath));
       }
     }
-    return children;
+    return children.values.toList();
   }
 }
 
diff --git a/pkg/analyzer/lib/instrumentation/instrumentation.dart b/pkg/analyzer/lib/instrumentation/instrumentation.dart
index f483397..bcf859c 100644
--- a/pkg/analyzer/lib/instrumentation/instrumentation.dart
+++ b/pkg/analyzer/lib/instrumentation/instrumentation.dart
@@ -352,7 +352,7 @@
   void logVersion(String uuid, String clientId, String clientVersion,
       String serverVersion, String sdkVersion) {
     String normalize(String value) =>
-        value != null && value.length > 0 ? value : 'unknown';
+        value != null && value.isNotEmpty ? value : 'unknown';
 
     if (_instrumentationServer != null) {
       _instrumentationServer.logWithPriority(_join([
diff --git a/pkg/analyzer/lib/source/line_info.dart b/pkg/analyzer/lib/source/line_info.dart
index 5413ae4..631029f 100644
--- a/pkg/analyzer/lib/source/line_info.dart
+++ b/pkg/analyzer/lib/source/line_info.dart
@@ -43,7 +43,7 @@
   LineInfo(this.lineStarts) {
     if (lineStarts == null) {
       throw new ArgumentError("lineStarts must be non-null");
-    } else if (lineStarts.length < 1) {
+    } else if (lineStarts.isEmpty) {
       throw new ArgumentError("lineStarts must be non-empty");
     }
   }
diff --git a/pkg/analyzer/lib/src/context/builder.dart b/pkg/analyzer/lib/src/context/builder.dart
index 86cdd07..5b69ecb 100644
--- a/pkg/analyzer/lib/src/context/builder.dart
+++ b/pkg/analyzer/lib/src/context/builder.dart
@@ -362,7 +362,7 @@
       Map<Folder, YamlMap> embedderYamls = locator.embedderYamls;
       EmbedderSdk embedderSdk =
           new EmbedderSdk(resourceProvider, embedderYamls);
-      if (embedderSdk.sdkLibraries.length > 0) {
+      if (embedderSdk.sdkLibraries.isNotEmpty) {
         //
         // There is an embedder file that defines the content of the SDK and
         // there might be an extension file that extends it.
diff --git a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
index bacc26c..6360b32 100644
--- a/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/analysis_context_collection.dart
@@ -26,6 +26,7 @@
       @deprecated ByteStore byteStore,
       @deprecated FileContentOverlay fileContentOverlay,
       @required List<String> includedPaths,
+      List<String> excludedPaths,
       ResourceProvider resourceProvider,
       String sdkPath})
       : resourceProvider =
@@ -38,7 +39,10 @@
     var contextLocator = new ContextLocator(
       resourceProvider: this.resourceProvider,
     );
-    var roots = contextLocator.locateRoots(includedPaths: includedPaths);
+    var roots = contextLocator.locateRoots(
+      includedPaths: includedPaths,
+      excludedPaths: excludedPaths,
+    );
     for (var root in roots) {
       var contextBuilder = new ContextBuilderImpl(
         resourceProvider: this.resourceProvider,
diff --git a/pkg/analyzer/lib/src/dart/analysis/ddc.dart b/pkg/analyzer/lib/src/dart/analysis/ddc.dart
index 0426f4a..ef6dceb 100644
--- a/pkg/analyzer/lib/src/dart/analysis/ddc.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/ddc.dart
@@ -20,6 +20,8 @@
 import 'package:analyzer/src/summary/resynthesize.dart';
 import 'package:analyzer/src/summary/summarize_ast.dart';
 import 'package:analyzer/src/summary/summarize_elements.dart';
+import 'package:analyzer/src/summary/summary_sdk.dart';
+import 'package:analyzer/src/summary2/informative_data.dart';
 import 'package:analyzer/src/summary2/link.dart' as summary2;
 import 'package:analyzer/src/summary2/linked_bundle_context.dart' as summary2;
 import 'package:analyzer/src/summary2/linked_element_factory.dart' as summary2;
@@ -36,6 +38,8 @@
 
   _SourceCrawler _fileCrawler;
 
+  final List<_UnitInformativeData> _informativeData = [];
+
   final PackageBundleAssembler _assembler;
   List<int> summaryBytes;
 
@@ -83,17 +87,21 @@
     );
     context = RestrictedAnalysisContext(synchronousSession, _sourceFactory);
 
-    resynthesizer = StoreBasedSummaryResynthesizer(
-      context,
-      null,
-      context.sourceFactory,
-      /*strongMode*/ true,
-      SummaryDataStore([])
-        ..addStore(_summaryData)
-        ..addBundle(null, bundle),
-    );
-    resynthesizer.finishCoreAsyncLibraries();
-    context.typeProvider = resynthesizer.typeProvider;
+    if (AnalysisDriver.useSummary2) {
+      _createElementFactory(bundle);
+    } else {
+      resynthesizer = StoreBasedSummaryResynthesizer(
+        context,
+        null,
+        context.sourceFactory,
+        /*strongMode*/ true,
+        SummaryDataStore([])
+          ..addStore(_summaryData)
+          ..addBundle(null, bundle),
+      );
+      resynthesizer.finishCoreAsyncLibraries();
+      context.typeProvider = resynthesizer.typeProvider;
+    }
   }
 
   void _buildPackageBundleBytes() {
@@ -126,31 +134,65 @@
     var inputLibraries = <summary2.LinkInputLibrary>[];
 
     var sourceToUnit = _fileCrawler.sourceToUnit;
-    for (var librarySource in sourceToUnit.keys) {
+    var librarySourcesToLink = <Source>[]
+      ..addAll(_fileCrawler.librarySources)
+      ..addAll(_fileCrawler._invalidLibrarySources);
+    for (var librarySource in librarySourcesToLink) {
+      var libraryUriStr = '${librarySource.uri}';
       var unit = sourceToUnit[librarySource];
 
-      if (_explicitSources.contains(librarySource.uri)) {
-        var isPart = unit.directives.any((d) => d is PartOfDirective);
-        if (isPart) {
-          continue;
-        }
-      }
-
       var inputUnits = <summary2.LinkInputUnit>[];
       inputUnits.add(
         summary2.LinkInputUnit(null, librarySource, false, unit),
       );
 
+      _informativeData.add(
+        _UnitInformativeData(
+          libraryUriStr,
+          libraryUriStr,
+          createInformativeData(unit),
+        ),
+      );
+
       for (var directive in unit.directives) {
         if (directive is PartDirective) {
-          var partUri = directive.uri.stringValue;
-          var partSource = _sourceFactory.resolveUri(librarySource, partUri);
-          if (partSource != null) {
-            var partUnit = sourceToUnit[partSource];
+          var partRelativeUriStr = directive.uri.stringValue;
+          var partSource = _sourceFactory.resolveUri(
+            librarySource,
+            partRelativeUriStr,
+          );
+
+          // Add empty synthetic units for unresolved `part` URIs.
+          if (partSource == null) {
             inputUnits.add(
-              summary2.LinkInputUnit(partUri, partSource, false, partUnit),
+              summary2.LinkInputUnit(
+                partRelativeUriStr,
+                null,
+                true,
+                _fsState.unresolvedFile.parse(),
+              ),
             );
+            continue;
           }
+
+          var partUnit = sourceToUnit[partSource];
+          inputUnits.add(
+            summary2.LinkInputUnit(
+              partRelativeUriStr,
+              partSource,
+              partSource == null,
+              partUnit,
+            ),
+          );
+
+          var unitUriStr = '${partSource.uri}';
+          _informativeData.add(
+            _UnitInformativeData(
+              libraryUriStr,
+              unitUriStr,
+              createInformativeData(partUnit),
+            ),
+          );
         }
       }
 
@@ -179,6 +221,40 @@
     var linkResult = summary2.link(elementFactory, inputLibraries);
     _assembler.setBundle2(linkResult.bundle);
   }
+
+  void _createElementFactory(PackageBundle newBundle) {
+    elementFactory = summary2.LinkedElementFactory(
+      context,
+      null,
+      summary2.Reference.root(),
+    );
+    for (var bundle in _summaryData.bundles) {
+      elementFactory.addBundle(
+        summary2.LinkedBundleContext(elementFactory, bundle.bundle2),
+      );
+    }
+    elementFactory.addBundle(
+      summary2.LinkedBundleContext(elementFactory, newBundle.bundle2),
+    );
+
+    for (var unitData in _informativeData) {
+      elementFactory.setInformativeData(
+        unitData.libraryUriStr,
+        unitData.unitUriStr,
+        unitData.data,
+      );
+    }
+
+    var dartCore = elementFactory.libraryOfUri('dart:core');
+    var dartAsync = elementFactory.libraryOfUri('dart:async');
+    var typeProvider = SummaryTypeProvider()
+      ..initializeCore(dartCore)
+      ..initializeAsync(dartAsync);
+    context.typeProvider = typeProvider;
+
+    dartCore.createLoadLibraryFunction(typeProvider);
+    dartAsync.createLoadLibraryFunction(typeProvider);
+  }
 }
 
 class _SourceCrawler {
@@ -194,10 +270,23 @@
   /// we only visit a given source once.
   var _knownSources = Set<Uri>();
 
+  /// The set of URIs that expected to be libraries.
+  ///
+  /// Some of the might turn out to have `part of` directive, and so reported
+  /// later. However we still must be able to provide some element for them
+  /// when requested via `import` or `export` directives.
+  final Set<Uri> _expectedLibraryUris = Set<Uri>();
+
+  /// The list of sources with URIs that [_expectedLibraryUris], but turned
+  /// out to be parts. We still add them into summaries, but don't resolve
+  /// them as units.
+  final List<Source> _invalidLibrarySources = [];
+
   final Map<Source, UnlinkedUnitBuilder> sourceToUnlinkedUnit = {};
   final Map<String, UnlinkedUnitBuilder> uriToUnlinkedUnit = {};
   final Map<Source, CompilationUnit> sourceToUnit = {};
   final List<String> libraryUris = [];
+  final List<Source> librarySources = [];
 
   _SourceCrawler(
     this._fsState,
@@ -230,7 +319,7 @@
     var uriStr = uri.toString();
 
     // Maybe an input package contains the source.
-    if (_summaryData.unlinkedMap[uriStr] != null) {
+    if (_summaryData.hasUnlinkedUnit(uriStr)) {
       return;
     }
 
@@ -247,10 +336,13 @@
     uriToUnlinkedUnit[uriStr] = unlinkedUnit;
     sourceToUnlinkedUnit[source] = unlinkedUnit;
 
-    void enqueueSource(String relativeUri) {
+    void enqueueSource(String relativeUri, bool shouldBeLibrary) {
       var sourceUri = resolveRelativeUri(uri, Uri.parse(relativeUri));
       if (_knownSources.add(sourceUri)) {
         _pendingSource.add(sourceUri);
+        if (shouldBeLibrary) {
+          _expectedLibraryUris.add(sourceUri);
+        }
       }
     }
 
@@ -258,12 +350,13 @@
     var isPart = false;
     for (var directive in unit.directives) {
       if (directive is UriBasedDirective) {
-        enqueueSource(directive.uri.stringValue);
-        // Handle conditional imports.
         if (directive is NamespaceDirective) {
+          enqueueSource(directive.uri.stringValue, true);
           for (var config in directive.configurations) {
-            enqueueSource(config.uri.stringValue);
+            enqueueSource(config.uri.stringValue, true);
           }
+        } else {
+          enqueueSource(directive.uri.stringValue, false);
         }
       } else if (directive is PartOfDirective) {
         isPart = true;
@@ -273,6 +366,17 @@
     // Remember library URIs, for linking and compiling.
     if (!isPart) {
       libraryUris.add(uriStr);
+      librarySources.add(source);
+    } else if (_expectedLibraryUris.contains(uri)) {
+      _invalidLibrarySources.add(source);
     }
   }
 }
+
+class _UnitInformativeData {
+  final String libraryUriStr;
+  final String unitUriStr;
+  final List<UnlinkedInformativeData> data;
+
+  _UnitInformativeData(this.libraryUriStr, this.unitUriStr, this.data);
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
index 4da5300..589f93a 100644
--- a/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/defined_names.dart
@@ -12,7 +12,7 @@
 
   void appendName(Set<String> names, SimpleIdentifier node) {
     String name = node?.name;
-    if (name != null && name.length != 0) {
+    if (name != null && name.isNotEmpty) {
       names.add(name);
     }
   }
diff --git a/pkg/analyzer/lib/src/dart/analysis/driver.dart b/pkg/analyzer/lib/src/dart/analysis/driver.dart
index fb120f5..f0b1adc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/driver.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/driver.dart
@@ -28,7 +28,7 @@
 import 'package:analyzer/src/dart/analysis/search.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
 import 'package:analyzer/src/diagnostic/diagnostic.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
@@ -48,320 +48,229 @@
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:meta/meta.dart';
 
-/**
- * TODO(scheglov) We could use generalized Function in [AnalysisDriverTestView],
- * but this breaks `AnalysisContext` and code generation. So, for now let's
- * work around them, and rewrite generators to [AnalysisDriver].
- */
+/// TODO(scheglov) We could use generalized Function in [AnalysisDriverTestView],
+/// but this breaks `AnalysisContext` and code generation. So, for now let's
+/// work around them, and rewrite generators to [AnalysisDriver].
 typedef Future<void> WorkToWaitAfterComputingResult(String path);
 
-/**
- * This class computes [AnalysisResult]s for Dart files.
- *
- * Let the set of "explicitly analyzed files" denote the set of paths that have
- * been passed to [addFile] but not subsequently passed to [removeFile]. Let
- * the "current analysis results" denote the map from the set of explicitly
- * analyzed files to the most recent [AnalysisResult] delivered to [results]
- * for each file. Let the "current file state" represent a map from file path
- * to the file contents most recently read from that file, or fetched from the
- * content cache (considering all possible possible file paths, regardless of
- * whether they're in the set of explicitly analyzed files). Let the
- * "analysis state" be either "analyzing" or "idle".
- *
- * (These are theoretical constructs; they may not necessarily reflect data
- * structures maintained explicitly by the driver).
- *
- * Then we make the following guarantees:
- *
- *    - Whenever the analysis state is idle, the current analysis results are
- *      consistent with the current file state.
- *
- *    - A call to [addFile] or [changeFile] causes the analysis state to
- *      transition to "analyzing", and schedules the contents of the given
- *      files to be read into the current file state prior to the next time
- *      the analysis state transitions back to "idle".
- *
- *    - If at any time the client stops making calls to [addFile], [changeFile],
- *      and [removeFile], the analysis state will eventually transition back to
- *      "idle" after a finite amount of processing.
- *
- * As a result of these guarantees, a client may ensure that the analysis
- * results are "eventually consistent" with the file system by simply calling
- * [changeFile] any time the contents of a file on the file system have changed.
- *
- * TODO(scheglov) Clean up the list of implicitly analyzed files.
- */
+/// This class computes [AnalysisResult]s for Dart files.
+///
+/// Let the set of "explicitly analyzed files" denote the set of paths that have
+/// been passed to [addFile] but not subsequently passed to [removeFile]. Let
+/// the "current analysis results" denote the map from the set of explicitly
+/// analyzed files to the most recent [AnalysisResult] delivered to [results]
+/// for each file. Let the "current file state" represent a map from file path
+/// to the file contents most recently read from that file, or fetched from the
+/// content cache (considering all possible possible file paths, regardless of
+/// whether they're in the set of explicitly analyzed files). Let the
+/// "analysis state" be either "analyzing" or "idle".
+///
+/// (These are theoretical constructs; they may not necessarily reflect data
+/// structures maintained explicitly by the driver).
+///
+/// Then we make the following guarantees:
+///
+///    - Whenever the analysis state is idle, the current analysis results are
+///      consistent with the current file state.
+///
+///    - A call to [addFile] or [changeFile] causes the analysis state to
+///      transition to "analyzing", and schedules the contents of the given
+///      files to be read into the current file state prior to the next time
+///      the analysis state transitions back to "idle".
+///
+///    - If at any time the client stops making calls to [addFile], [changeFile],
+///      and [removeFile], the analysis state will eventually transition back to
+///      "idle" after a finite amount of processing.
+///
+/// As a result of these guarantees, a client may ensure that the analysis
+/// results are "eventually consistent" with the file system by simply calling
+/// [changeFile] any time the contents of a file on the file system have changed.
+///
+/// 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 = 85;
+  /// The version of data format, should be incremented on every format change.
+  static const int DATA_VERSION = 87;
 
-  /**
-   * The number of exception contexts allowed to write. Once this field is
-   * zero, we stop writing any new exception contexts in this process.
-   */
+  /// The number of exception contexts allowed to write. Once this field is
+  /// zero, we stop writing any new exception contexts in this process.
   static int allowedNumberOfContextsToWrite = 10;
 
-  /**
-   * Whether summary2 should be used to resynthesize elements.
-   */
+  /// Whether summary2 should be used to resynthesize elements.
   static bool useSummary2 = false;
 
-  /**
-   * The scheduler that schedules analysis work in this, and possibly other
-   * analysis drivers.
-   */
+  /// The scheduler that schedules analysis work in this, and possibly other
+  /// analysis drivers.
   final AnalysisDriverScheduler _scheduler;
 
-  /**
-   * The logger to write performed operations and performance to.
-   */
+  /// The logger to write performed operations and performance to.
   final PerformanceLog _logger;
 
-  /**
-   * The resource provider for working with files.
-   */
+  /// The resource provider for working with files.
   final ResourceProvider _resourceProvider;
 
-  /**
-   * The byte storage to get and put serialized data.
-   *
-   * It can be shared with other [AnalysisDriver]s.
-   */
+  /// The byte storage to get and put serialized data.
+  ///
+  /// It can be shared with other [AnalysisDriver]s.
   final ByteStore _byteStore;
 
-  /**
-   * The optional store with externally provided unlinked and corresponding
-   * linked summaries. These summaries are always added to the store for any
-   * file analysis.
-   */
+  /// The optional store with externally provided unlinked and corresponding
+  /// linked summaries. These summaries are always added to the store for any
+  /// file analysis.
   final SummaryDataStore _externalSummaries;
 
-  /**
-   * This [ContentCache] is consulted for a file content before reading
-   * the content from the file.
-   */
+  /// This [ContentCache] is consulted for a file content before reading
+  /// the content from the file.
   final FileContentOverlay _contentOverlay;
 
-  /**
-   * The analysis options to analyze with.
-   */
+  /// The analysis options to analyze with.
   AnalysisOptionsImpl _analysisOptions;
 
-  /**
-   * The [SourceFactory] is used to resolve URIs to paths and restore URIs
-   * from file paths.
-   */
+  /// The [SourceFactory] is used to resolve URIs to paths and restore URIs
+  /// from file paths.
   SourceFactory _sourceFactory;
 
-  /**
-   * The declared environment variables.
-   */
+  /// The declared environment variables.
   DeclaredVariables declaredVariables = new DeclaredVariables();
 
-  /**
-   * Information about the context root being analyzed by this driver.
-   */
+  /// Information about the context root being analyzed by this driver.
   final ContextRoot contextRoot;
 
-  /**
-   * The analysis context that created this driver / session.
-   */
+  /// The analysis context that created this driver / session.
   api.AnalysisContext analysisContext;
 
-  /**
-   * The salt to mix into all hashes used as keys for unlinked data.
-   */
+  /// The salt to mix into all hashes used as keys for unlinked data.
   final Uint32List _unlinkedSalt =
       new Uint32List(3 + AnalysisOptionsImpl.unlinkedSignatureLength);
 
-  /**
-   * The salt to mix into all hashes used as keys for linked data.
-   */
+  /// The salt to mix into all hashes used as keys for linked data.
   final Uint32List _linkedSalt =
       new Uint32List(3 + AnalysisOptions.signatureLength);
 
-  /**
-   * The set of priority files, that should be analyzed sooner.
-   */
+  /// The set of priority files, that should be analyzed sooner.
   final _priorityFiles = new LinkedHashSet<String>();
 
-  /**
-   * The mapping from the files for which analysis was requested using
-   * [getResult] to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which analysis was requested using
+  /// [getResult] to the [Completer]s to report the result.
   final _requestedFiles = <String, List<Completer<ResolvedUnitResult>>>{};
 
-  /**
-   * The mapping from the files for which analysis was requested using
-   * [getResolvedLibrary] to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which analysis was requested using
+  /// [getResolvedLibrary] to the [Completer]s to report the result.
   final _requestedLibraries =
       <String, List<Completer<ResolvedLibraryResult>>>{};
 
-  /**
-   * The task that discovers available files.  If this field is not `null`,
-   * and the task is not completed, it should be performed and completed
-   * before any name searching task.
-   */
+  /// The task that discovers available files.  If this field is not `null`,
+  /// and the task is not completed, it should be performed and completed
+  /// before any name searching task.
   _DiscoverAvailableFilesTask _discoverAvailableFilesTask;
 
-  /**
-   * The list of tasks to compute files defining a class member name.
-   */
+  /// The list of tasks to compute files defining a class member name.
   final _definingClassMemberNameTasks = <_FilesDefiningClassMemberNameTask>[];
 
-  /**
-   * The list of tasks to compute files referencing a name.
-   */
+  /// The list of tasks to compute files referencing a name.
   final _referencingNameTasks = <_FilesReferencingNameTask>[];
 
-  /**
-   * The list of tasks to compute top-level declarations of a name.
-   */
-  final _topLevelNameDeclarationsTasks = <_TopLevelNameDeclarationsTask>[];
-
-  /**
-   * The mapping from the files for which the index was requested using
-   * [getIndex] to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which the index was requested using
+  /// [getIndex] to the [Completer]s to report the result.
   final _indexRequestedFiles =
       <String, List<Completer<AnalysisDriverUnitIndex>>>{};
 
-  /**
-   * The mapping from the files for which the unit element key was requested
-   * using [getUnitElementSignature] to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which the unit element key was requested
+  /// using [getUnitElementSignature] to the [Completer]s to report the result.
   final _unitElementSignatureFiles = <String, List<Completer<String>>>{};
 
-  /**
-   * The mapping from the files for which the unit element key was requested
-   * using [getUnitElementSignature], and which were found to be parts without
-   * known libraries, to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which the unit element key was requested
+  /// using [getUnitElementSignature], and which were found to be parts without
+  /// known libraries, to the [Completer]s to report the result.
   final _unitElementSignatureParts = <String, List<Completer<String>>>{};
 
-  /**
-   * The mapping from the files for which the unit element was requested using
-   * [getUnitElement] to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which the unit element was requested using
+  /// [getUnitElement] to the [Completer]s to report the result.
   final _unitElementRequestedFiles =
       <String, List<Completer<UnitElementResult>>>{};
 
-  /**
-   * The mapping from the files for which the unit element was requested using
-   * [getUnitElement], and which were found to be parts without known libraries,
-   * to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which the unit element was requested using
+  /// [getUnitElement], and which were found to be parts without known libraries,
+  /// to the [Completer]s to report the result.
   final _unitElementRequestedParts =
       <String, List<Completer<UnitElementResult>>>{};
 
-  /**
-   * The mapping from the files for which analysis was requested using
-   * [getResult], and which were found to be parts without known libraries,
-   * to the [Completer]s to report the result.
-   */
+  /// The mapping from the files for which analysis was requested using
+  /// [getResult], and which were found to be parts without known libraries,
+  /// to the [Completer]s to report the result.
   final _requestedParts = <String, List<Completer<ResolvedUnitResult>>>{};
 
-  /**
-   * The set of part files that are currently scheduled for analysis.
-   */
+  /// The set of part files that are currently scheduled for analysis.
   final _partsToAnalyze = new LinkedHashSet<String>();
 
-  /**
-   * The controller for the [results] stream.
-   */
+  /// The controller for the [results] stream.
   final _resultController = new StreamController<ResolvedUnitResult>();
 
-  /**
-   * The stream that will be written to when analysis results are produced.
-   */
+  /// The stream that will be written to when analysis results are produced.
   Stream<ResolvedUnitResult> _onResults;
 
-  /**
-   * Resolution signatures of the most recently produced results for files.
-   */
+  /// Resolution signatures of the most recently produced results for files.
   final Map<String, String> _lastProducedSignatures = {};
 
-  /**
-   * Cached results for [_priorityFiles].
-   */
+  /// Cached results for [_priorityFiles].
   final Map<String, ResolvedUnitResult> _priorityResults = {};
 
-  /**
-   * The controller for the [exceptions] stream.
-   */
+  /// The controller for the [exceptions] stream.
   final StreamController<ExceptionResult> _exceptionController =
       new StreamController<ExceptionResult>();
 
-  /**
-   * The instance of the [Search] helper.
-   */
+  /// The instance of the [Search] helper.
   Search _search;
 
   AnalysisDriverTestView _testView;
 
   FileSystemState _fsState;
 
-  /**
-   * The [FileTracker] used by this driver.
-   */
+  /// The [FileTracker] used by this driver.
   FileTracker _fileTracker;
 
-  /**
-   * When this flag is set to `true`, the set of analyzed files must not change,
-   * and all [AnalysisResult]s are cached infinitely.
-   *
-   * The flag is intended to be used for non-interactive clients, like DDC,
-   * which start a new analysis session, load a set of files, resolve all of
-   * them, process the resolved units, and then throw away that whole session.
-   *
-   * The key problem that this flag is solving is that the driver analyzes the
-   * whole library when the result for a unit of the library is requested. So,
-   * when the client requests sequentially the defining unit, then the first
-   * part, then the second part, the driver has to perform analysis of the
-   * library three times and every time throw away all the units except the one
-   * which was requested. With this flag set to `true`, the driver can analyze
-   * once and cache all the resolved units.
-   */
+  /// When this flag is set to `true`, the set of analyzed files must not change,
+  /// and all [AnalysisResult]s are cached infinitely.
+  ///
+  /// The flag is intended to be used for non-interactive clients, like DDC,
+  /// which start a new analysis session, load a set of files, resolve all of
+  /// them, process the resolved units, and then throw away that whole session.
+  ///
+  /// The key problem that this flag is solving is that the driver analyzes the
+  /// whole library when the result for a unit of the library is requested. So,
+  /// when the client requests sequentially the defining unit, then the first
+  /// part, then the second part, the driver has to perform analysis of the
+  /// library three times and every time throw away all the units except the one
+  /// which was requested. With this flag set to `true`, the driver can analyze
+  /// once and cache all the resolved units.
   final bool disableChangesAndCacheAllResults;
 
-  /**
-   * Whether resolved units should be indexed.
-   */
+  /// Whether resolved units should be indexed.
   final bool enableIndex;
 
-  /**
-   * The cache to use with [disableChangesAndCacheAllResults].
-   */
+  /// The cache to use with [disableChangesAndCacheAllResults].
   final Map<String, AnalysisResult> _allCachedResults = {};
 
-  /**
-   * The current analysis session.
-   */
+  /// The current analysis session.
   AnalysisSessionImpl _currentSession;
 
-  /**
-   * The current library context, consistent with the [_currentSession].
-   *
-   * TODO(scheglov) We probably should tie it into the session.
-   */
+  /// The current library context, consistent with the [_currentSession].
+  ///
+  /// TODO(scheglov) We probably should tie it into the session.
   LibraryContext _libraryContext;
 
-  /**
-   * This function is invoked when the current session is about to be discarded.
-   * The argument represents the path of the resource causing the session
-   * to be discarded or `null` if there are multiple or this is unknown.
-   */
+  /// This function is invoked when the current session is about to be discarded.
+  /// The argument represents the path of the resource causing the session
+  /// to be discarded or `null` if there are multiple or this is unknown.
   void Function(String) onCurrentSessionAboutToBeDiscarded;
 
-  /**
-   * Create a new instance of [AnalysisDriver].
-   *
-   * The given [SourceFactory] is cloned to ensure that it does not contain a
-   * reference to a [AnalysisContext] in which it could have been used.
-   */
+  /// If testing data is being retained, a pointer to the object that is
+  /// retaining the testing data.  Otherwise `null`.
+  final TestingData testingData;
+
+  /// Create a new instance of [AnalysisDriver].
+  ///
+  /// The given [SourceFactory] is cloned to ensure that it does not contain a
+  /// reference to a [AnalysisContext] in which it could have been used.
   AnalysisDriver(
       this._scheduler,
       PerformanceLog logger,
@@ -373,10 +282,12 @@
       this._analysisOptions,
       {this.disableChangesAndCacheAllResults: false,
       this.enableIndex: false,
-      SummaryDataStore externalSummaries})
+      SummaryDataStore externalSummaries,
+      bool retainDataForTesting: false})
       : _logger = logger,
         _sourceFactory = sourceFactory.clone(),
-        _externalSummaries = externalSummaries {
+        _externalSummaries = externalSummaries,
+        testingData = retainDataForTesting ? TestingData() : null {
     _createNewSession(null);
     _onResults = _resultController.stream.asBroadcastStream();
     _testView = new AnalysisDriverTestView(this);
@@ -385,29 +296,19 @@
     _search = new Search(this);
   }
 
-  /**
-   * Return the set of files explicitly added to analysis using [addFile].
-   */
+  /// Return the set of files explicitly added to analysis using [addFile].
   Set<String> get addedFiles => _fileTracker.addedFiles;
 
-  /**
-   * Return the analysis options used to control analysis.
-   */
+  /// Return the analysis options used to control analysis.
   AnalysisOptions get analysisOptions => _analysisOptions;
 
-  /**
-   * Return the current analysis session.
-   */
+  /// Return the current analysis session.
   AnalysisSession get currentSession => _currentSession;
 
-  /**
-   * Return the stream that produces [ExceptionResult]s.
-   */
+  /// Return the stream that produces [ExceptionResult]s.
   Stream<ExceptionResult> get exceptions => _exceptionController.stream;
 
-  /**
-   * The current file system state.
-   */
+  /// The current file system state.
   FileSystemState get fsState => _fsState;
 
   @override
@@ -419,26 +320,18 @@
         _partsToAnalyze.isNotEmpty;
   }
 
-  /**
-   * Return the set of files that are known at this moment. This set does not
-   * always include all added files or all implicitly used file. If a file has
-   * not been processed yet, it might be missing.
-   */
+  /// Return the set of files that are known at this moment. This set does not
+  /// always include all added files or all implicitly used file. If a file has
+  /// not been processed yet, it might be missing.
   Set<String> get knownFiles => _fsState.knownFilePaths;
 
-  /**
-   * Return the path of the folder at the root of the context.
-   */
+  /// Return the path of the folder at the root of the context.
   String get name => contextRoot?.root ?? '';
 
-  /**
-   * Return the number of files scheduled for analysis.
-   */
+  /// Return the number of files scheduled for analysis.
   int get numberOfFilesToAnalyze => _fileTracker.numberOfPendingFiles;
 
-  /**
-   * Return the list of files that the driver should try to analyze sooner.
-   */
+  /// Return the list of files that the driver should try to analyze sooner.
   List<String> get priorityFiles => _priorityFiles.toList(growable: false);
 
   @override
@@ -452,44 +345,36 @@
     _scheduler.notify(this);
   }
 
-  /**
-   * Return the [ResourceProvider] that is used to access the file system.
-   */
+  /// Return the [ResourceProvider] that is used to access the file system.
   ResourceProvider get resourceProvider => _resourceProvider;
 
-  /**
-   * Return the [Stream] that produces [AnalysisResult]s for added files.
-   *
-   * Note that the stream supports only one single subscriber.
-   *
-   * Analysis starts when the [AnalysisDriverScheduler] is started and the
-   * driver is added to it. The analysis state transitions to "analyzing" and
-   * an analysis result is produced for every added file prior to the next time
-   * the analysis state transitions to "idle".
-   *
-   * At least one analysis result is produced for every file passed to
-   * [addFile] or [changeFile] prior to the next time the analysis state
-   * transitions to "idle", unless the file is later removed from analysis
-   * using [removeFile]. Analysis results for other files are produced only if
-   * the changes affect analysis results of other files.
-   *
-   * More than one result might be produced for the same file, even if the
-   * client does not change the state of the files.
-   *
-   * Results might be produced even for files that have never been added
-   * using [addFile], for example when [getResult] was called for a file.
-   */
+  /// Return the [Stream] that produces [AnalysisResult]s for added files.
+  ///
+  /// Note that the stream supports only one single subscriber.
+  ///
+  /// Analysis starts when the [AnalysisDriverScheduler] is started and the
+  /// driver is added to it. The analysis state transitions to "analyzing" and
+  /// an analysis result is produced for every added file prior to the next time
+  /// the analysis state transitions to "idle".
+  ///
+  /// At least one analysis result is produced for every file passed to
+  /// [addFile] or [changeFile] prior to the next time the analysis state
+  /// transitions to "idle", unless the file is later removed from analysis
+  /// using [removeFile]. Analysis results for other files are produced only if
+  /// the changes affect analysis results of other files.
+  ///
+  /// More than one result might be produced for the same file, even if the
+  /// client does not change the state of the files.
+  ///
+  /// Results might be produced even for files that have never been added
+  /// using [addFile], for example when [getResult] was called for a file.
   Stream<ResolvedUnitResult> get results => _onResults;
 
-  /**
-   * Return the search support for the driver.
-   */
+  /// Return the search support for the driver.
   Search get search => _search;
 
-  /**
-   * Return the source factory used to resolve URIs to paths and restore URIs
-   * from file paths.
-   */
+  /// Return the source factory used to resolve URIs to paths and restore URIs
+  /// from file paths.
   SourceFactory get sourceFactory => _sourceFactory;
 
   @visibleForTesting
@@ -520,9 +405,6 @@
     if (_unitElementRequestedFiles.isNotEmpty) {
       return AnalysisDriverPriority.interactive;
     }
-    if (_topLevelNameDeclarationsTasks.isNotEmpty) {
-      return AnalysisDriverPriority.interactive;
-    }
     if (_priorityFiles.isNotEmpty) {
       for (String path in _priorityFiles) {
         if (_fileTracker.isFilePending(path)) {
@@ -573,37 +455,33 @@
     }
   }
 
-  /**
-   * The file with the given [path] might have changed - updated, added or
-   * removed. Or not, we don't know. Or it might have, but then changed back.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   *
-   * Causes the analysis state to transition to "analyzing" (if it is not in
-   * that state already). Schedules the file contents for [path] to be read
-   * into the current file state prior to the next time the analysis state
-   * transitions to "idle".
-   *
-   * Invocation of this method will not prevent a [Future] returned from
-   * [getResult] from completing with a result, but the result is not
-   * guaranteed to be consistent with the new current file state after this
-   * [changeFile] invocation.
-   */
+  /// The file with the given [path] might have changed - updated, added or
+  /// removed. Or not, we don't know. Or it might have, but then changed back.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// Causes the analysis state to transition to "analyzing" (if it is not in
+  /// that state already). Schedules the file contents for [path] to be read
+  /// into the current file state prior to the next time the analysis state
+  /// transitions to "idle".
+  ///
+  /// Invocation of this method will not prevent a [Future] returned from
+  /// [getResult] from completing with a result, but the result is not
+  /// guaranteed to be consistent with the new current file state after this
+  /// [changeFile] invocation.
   void changeFile(String path) {
     _throwIfNotAbsolutePath(path);
     _throwIfChangesAreNotAllowed();
     _changeFile(path);
   }
 
-  /**
-   * Some state on which analysis depends has changed, so the driver needs to be
-   * re-configured with the new state.
-   *
-   * At least one of the optional parameters should be provided, but only those
-   * that represent state that has actually changed need be provided.
-   */
+  /// Some state on which analysis depends has changed, so the driver needs to be
+  /// re-configured with the new state.
+  ///
+  /// At least one of the optional parameters should be provided, but only those
+  /// that represent state that has actually changed need be provided.
   void configure(
       {AnalysisOptions analysisOptions, SourceFactory sourceFactory}) {
     if (analysisOptions != null) {
@@ -617,10 +495,8 @@
     _fileTracker.addFiles(addedFiles);
   }
 
-  /**
-   * Return a [Future] that completes when discovery of all files that are
-   * potentially available is done, so that they are included in [knownFiles].
-   */
+  /// Return a [Future] that completes when discovery of all files that are
+  /// potentially available is done, so that they are included in [knownFiles].
   Future<void> discoverAvailableFiles() {
     if (_discoverAvailableFilesTask != null &&
         _discoverAvailableFilesTask.isCompleted) {
@@ -636,15 +512,13 @@
     _scheduler.remove(this);
   }
 
-  /**
-   * Return the cached [ResolvedUnitResult] for the Dart file with the given
-   * [path]. If there is no cached result, return `null`. Usually only results
-   * of priority files are cached.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   */
+  /// Return the cached [ResolvedUnitResult] for the Dart file with the given
+  /// [path]. If there is no cached result, return `null`. Usually only results
+  /// of priority files are cached.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
   ResolvedUnitResult getCachedResult(String path) {
     _throwIfNotAbsolutePath(path);
     ResolvedUnitResult result = _priorityResults[path];
@@ -654,16 +528,14 @@
     return result;
   }
 
-  /**
-   * Return a [Future] that completes with the [ErrorsResult] for the Dart
-   * file with the given [path]. If the file is not a Dart file or cannot
-   * be analyzed, the [Future] completes with `null`.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * This method does not use analysis priorities, and must not be used in
-   * interactive analysis, such as Analysis Server or its plugins.
-   */
+  /// Return a [Future] that completes with the [ErrorsResult] for the Dart
+  /// file with the given [path]. If the file is not a Dart file or cannot
+  /// be analyzed, the [Future] completes with `null`.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// This method does not use analysis priorities, and must not be used in
+  /// interactive analysis, such as Analysis Server or its plugins.
   Future<ErrorsResult> getErrors(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -684,10 +556,8 @@
         analysisResult.lineInfo, analysisResult.isPart, analysisResult.errors);
   }
 
-  /**
-   * Return a [Future] that completes with the list of added files that
-   * define a class member with the given [name].
-   */
+  /// Return a [Future] that completes with the list of added files that
+  /// define a class member with the given [name].
   Future<List<String>> getFilesDefiningClassMemberName(String name) {
     _discoverAvailableFiles();
     var task = new _FilesDefiningClassMemberNameTask(this, name);
@@ -696,10 +566,8 @@
     return task.completer.future;
   }
 
-  /**
-   * Return a [Future] that completes with the list of known files that
-   * reference the given external [name].
-   */
+  /// Return a [Future] that completes with the list of known files that
+  /// reference the given external [name].
   Future<List<String>> getFilesReferencingName(String name) {
     _discoverAvailableFiles();
     var task = new _FilesReferencingNameTask(this, name);
@@ -708,11 +576,9 @@
     return task.completer.future;
   }
 
-  /**
-   * Return the [FileResult] for the Dart file with the given [path].
-   *
-   * The [path] must be absolute and normalized.
-   */
+  /// Return the [FileResult] for the Dart file with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
   FileResult getFileSync(String path) {
     _throwIfNotAbsolutePath(path);
     FileState file = _fileTracker.verifyApiSignature(path);
@@ -720,11 +586,9 @@
         _currentSession, path, file.uri, file.lineInfo, file.isPart);
   }
 
-  /**
-   * Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
-   * the file with the given [path], or with `null` if the file cannot be
-   * analyzed.
-   */
+  /// Return a [Future] that completes with the [AnalysisDriverUnitIndex] for
+  /// the file with the given [path], or with `null` if the file cannot be
+  /// analyzed.
   Future<AnalysisDriverUnitIndex> getIndex(String path) {
     _throwIfNotAbsolutePath(path);
     if (!enableIndex) {
@@ -741,15 +605,13 @@
     return completer.future;
   }
 
-  /**
-   * Return a [Future] that completes with the [LibraryElement] 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.
-   *
-   * Throw [ArgumentError] if the [uri] does not correspond to a file.
-   *
-   * Throw [ArgumentError] if the [uri] corresponds to a part.
-   */
+  /// Return a [Future] that completes with the [LibraryElement] 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.
+  ///
+  /// Throw [ArgumentError] if the [uri] does not correspond to a file.
+  ///
+  /// Throw [ArgumentError] if the [uri] corresponds to a part.
   Future<LibraryElement> getLibraryByUri(String uri) async {
     var uriObj = Uri.parse(uri);
     var file = _fsState.getFileForUri(uriObj);
@@ -770,14 +632,12 @@
     return unitResult.element.library;
   }
 
-  /**
-   * Return a [ParsedLibraryResult] for the library with the given [path].
-   *
-   * Throw [ArgumentError] if the given [path] is not the defining compilation
-   * unit for a library (that is, is a part of a library).
-   *
-   * The [path] must be absolute and normalized.
-   */
+  /// Return a [ParsedLibraryResult] for the library with the given [path].
+  ///
+  /// Throw [ArgumentError] if the given [path] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
+  ///
+  /// The [path] must be absolute and normalized.
   ParsedLibraryResult getParsedLibrary(String path) {
     FileState file = _fsState.getFileForPath(path);
 
@@ -801,12 +661,10 @@
     return ParsedLibraryResultImpl(currentSession, path, file.uri, units);
   }
 
-  /**
-   * Return a [ParsedLibraryResult] for the library with the given [uri].
-   *
-   * Throw [ArgumentError] if the given [uri] is not the defining compilation
-   * unit for a library (that is, is a part of a library).
-   */
+  /// Return a [ParsedLibraryResult] for the library with the given [uri].
+  ///
+  /// Throw [ArgumentError] if the given [uri] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
   ParsedLibraryResult getParsedLibraryByUri(Uri uri) {
     FileState file = _fsState.getFileForUri(uri);
 
@@ -822,25 +680,23 @@
     return getParsedLibrary(file.path);
   }
 
-  /**
-   * Return a [Future] that completes with a [ResolvedLibraryResult] for the
-   * Dart library file with the given [path].  If the file is not a Dart file
-   * or cannot be analyzed, the [Future] completes with `null`.
-   *
-   * Throw [ArgumentError] if the given [path] is not the defining compilation
-   * unit for a library (that is, is a part of a library).
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   *
-   * Invocation of this method causes the analysis state to transition to
-   * "analyzing" (if it is not in that state already), the driver will produce
-   * the resolution result for it, which is consistent with the current file
-   * state (including new states of the files previously reported using
-   * [changeFile]), prior to the next time the analysis state transitions
-   * to "idle".
-   */
+  /// Return a [Future] that completes with a [ResolvedLibraryResult] for the
+  /// Dart library file with the given [path].  If the file is not a Dart file
+  /// or cannot be analyzed, the [Future] completes with `null`.
+  ///
+  /// Throw [ArgumentError] if the given [path] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// Invocation of this method causes the analysis state to transition to
+  /// "analyzing" (if it is not in that state already), the driver will produce
+  /// the resolution result for it, which is consistent with the current file
+  /// state (including new states of the files previously reported using
+  /// [changeFile]), prior to the next time the analysis state transitions
+  /// to "idle".
   Future<ResolvedLibraryResult> getResolvedLibrary(String path) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
@@ -868,20 +724,18 @@
     return completer.future;
   }
 
-  /**
-   * Return a [Future] that completes with a [ResolvedLibraryResult] for the
-   * Dart library file with the given [uri].
-   *
-   * Throw [ArgumentError] if the given [uri] is not the defining compilation
-   * unit for a library (that is, is a part of a library).
-   *
-   * Invocation of this method causes the analysis state to transition to
-   * "analyzing" (if it is not in that state already), the driver will produce
-   * the resolution result for it, which is consistent with the current file
-   * state (including new states of the files previously reported using
-   * [changeFile]), prior to the next time the analysis state transitions
-   * to "idle".
-   */
+  /// Return a [Future] that completes with a [ResolvedLibraryResult] for the
+  /// Dart library file with the given [uri].
+  ///
+  /// Throw [ArgumentError] if the given [uri] is not the defining compilation
+  /// unit for a library (that is, is a part of a library).
+  ///
+  /// Invocation of this method causes the analysis state to transition to
+  /// "analyzing" (if it is not in that state already), the driver will produce
+  /// the resolution result for it, which is consistent with the current file
+  /// state (including new states of the files previously reported using
+  /// [changeFile]), prior to the next time the analysis state transitions
+  /// to "idle".
   Future<ResolvedLibraryResult> getResolvedLibraryByUri(Uri uri) {
     FileState file = _fsState.getFileForUri(uri);
 
@@ -907,25 +761,23 @@
     return signature;
   }
 
-  /**
-   * Return a [Future] that completes with a [ResolvedUnitResult] for the Dart
-   * file with the given [path]. If the file is not a Dart file or cannot
-   * be analyzed, the [Future] completes with `null`.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   *
-   * If the driver has the cached analysis result for the file, it is returned.
-   * If [sendCachedToStream] is `true`, then the result is also reported into
-   * the [results] stream, just as if it were freshly computed.
-   *
-   * Otherwise causes the analysis state to transition to "analyzing" (if it is
-   * not in that state already), the driver will produce the analysis result for
-   * it, which is consistent with the current file state (including new states
-   * of the files previously reported using [changeFile]), prior to the next
-   * time the analysis state transitions to "idle".
-   */
+  /// Return a [Future] that completes with a [ResolvedUnitResult] for the Dart
+  /// file with the given [path]. If the file is not a Dart file or cannot
+  /// be analyzed, the [Future] completes with `null`.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// If the driver has the cached analysis result for the file, it is returned.
+  /// If [sendCachedToStream] is `true`, then the result is also reported into
+  /// the [results] stream, just as if it were freshly computed.
+  ///
+  /// Otherwise causes the analysis state to transition to "analyzing" (if it is
+  /// not in that state already), the driver will produce the analysis result for
+  /// it, which is consistent with the current file state (including new states
+  /// of the files previously reported using [changeFile]), prior to the next
+  /// time the analysis state transitions to "idle".
   Future<ResolvedUnitResult> getResult(String path,
       {bool sendCachedToStream: false}) {
     _throwIfNotAbsolutePath(path);
@@ -953,13 +805,11 @@
     return completer.future;
   }
 
-  /**
-   * Return a [Future] that completes with the [SourceKind] for the Dart
-   * file with the given [path]. If the file is not a Dart file or cannot
-   * be analyzed, the [Future] completes with `null`.
-   *
-   * The [path] must be absolute and normalized.
-   */
+  /// Return a [Future] that completes with the [SourceKind] for the Dart
+  /// file with the given [path]. If the file is not a Dart file or cannot
+  /// be analyzed, the [Future] completes with `null`.
+  ///
+  /// The [path] must be absolute and normalized.
   Future<SourceKind> getSourceKind(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -971,23 +821,8 @@
     return null;
   }
 
-  /**
-   * Return a [Future] that completes with top-level declarations with the
-   * given [name] in all known libraries.
-   */
-  Future<List<TopLevelDeclarationInSource>> getTopLevelNameDeclarations(
-      String name) {
-    _discoverAvailableFiles();
-    var task = new _TopLevelNameDeclarationsTask(this, name);
-    _topLevelNameDeclarationsTasks.add(task);
-    _scheduler.notify(this);
-    return task.completer.future;
-  }
-
-  /**
-   * Return a [Future] that completes with the [UnitElementResult] for the
-   * file with the given [path], or with `null` if the file cannot be analyzed.
-   */
+  /// Return a [Future] that completes with the [UnitElementResult] for the
+  /// file with the given [path], or with `null` if the file cannot be analyzed.
   Future<UnitElementResult> getUnitElement(String path) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
@@ -1001,15 +836,13 @@
     return completer.future;
   }
 
-  /**
-   * Return a [Future] that completes with the signature for the
-   * [UnitElementResult] for the file with the given [path], or with `null` if
-   * the file cannot be analyzed.
-   *
-   * The signature is based the APIs of the files of the library (including
-   * the file itself) of the requested file and the transitive closure of files
-   * imported and exported by the library.
-   */
+  /// Return a [Future] that completes with the signature for the
+  /// [UnitElementResult] for the file with the given [path], or with `null` if
+  /// the file cannot be analyzed.
+  ///
+  /// The signature is based the APIs of the files of the library (including
+  /// the file itself) of the requested file and the transitive closure of files
+  /// imported and exported by the library.
   Future<String> getUnitElementSignature(String path) {
     _throwIfNotAbsolutePath(path);
     if (!_fsState.hasUri(path)) {
@@ -1032,50 +865,44 @@
     return signature;
   }
 
-  /**
-   * Return `true` is the file with the given absolute [uri] is a library,
-   * or `false` if it is a part. More specifically, return `true` if the file
-   * is not known to be a part.
-   *
-   * Correspondingly, return `true` if the [uri] does not correspond to a file,
-   * for any reason, e.g. the file does not exist, or the [uri] cannot be
-   * resolved to a file path, or the [uri] is invalid, e.g. a `package:` URI
-   * without a package name. In these cases we cannot prove that the file is
-   * not a part, so it must be a library.
-   */
+  /// Return `true` is the file with the given absolute [uri] is a library,
+  /// or `false` if it is a part. More specifically, return `true` if the file
+  /// is not known to be a part.
+  ///
+  /// Correspondingly, return `true` if the [uri] does not correspond to a file,
+  /// for any reason, e.g. the file does not exist, or the [uri] cannot be
+  /// resolved to a file path, or the [uri] is invalid, e.g. a `package:` URI
+  /// without a package name. In these cases we cannot prove that the file is
+  /// not a part, so it must be a library.
   bool isLibraryByUri(Uri uri) {
     return !_fsState.getFileForUri(uri).isPart;
   }
 
-  /**
-   * Return a [Future] that completes with a [ParsedUnitResult] for the file
-   * with the given [path].
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   *
-   * The parsing is performed in the method itself, and the result is not
-   * produced through the [results] stream (just because it is not a fully
-   * resolved unit).
-   */
+  /// Return a [Future] that completes with a [ParsedUnitResult] for the file
+  /// with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// The parsing is performed in the method itself, and the result is not
+  /// produced through the [results] stream (just because it is not a fully
+  /// resolved unit).
   Future<ParsedUnitResult> parseFile(String path) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
     return parseFileSync(path);
   }
 
-  /**
-   * Return a [ParsedUnitResult] for the file with the given [path].
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The [path] can be any file - explicitly or implicitly analyzed, or neither.
-   *
-   * The parsing is performed in the method itself, and the result is not
-   * produced through the [results] stream (just because it is not a fully
-   * resolved unit).
-   */
+  /// Return a [ParsedUnitResult] for the file with the given [path].
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The [path] can be any file - explicitly or implicitly analyzed, or neither.
+  ///
+  /// The parsing is performed in the method itself, and the result is not
+  /// produced through the [results] stream (just because it is not a fully
+  /// resolved unit).
   ParsedUnitResult parseFileSync(String path) {
     _throwIfNotAbsolutePath(path);
     FileState file = _fileTracker.verifyApiSignature(path);
@@ -1209,16 +1036,6 @@
       return;
     }
 
-    // Compute top-level declarations.
-    if (_topLevelNameDeclarationsTasks.isNotEmpty) {
-      _TopLevelNameDeclarationsTask task = _topLevelNameDeclarationsTasks.first;
-      bool isDone = task.perform();
-      if (isDone) {
-        _topLevelNameDeclarationsTasks.remove(task);
-      }
-      return;
-    }
-
     // Analyze a priority file.
     if (_priorityFiles.isNotEmpty) {
       for (String path in _priorityFiles) {
@@ -1324,15 +1141,13 @@
     }
   }
 
-  /**
-   * Remove the file with the given [path] from the list of files to analyze.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The results of analysis of the file might still be produced by the
-   * [results] stream. The driver will try to stop producing these results,
-   * but does not guarantee this.
-   */
+  /// Remove the file with the given [path] from the list of files to analyze.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The results of analysis of the file might still be produced by the
+  /// [results] stream. The driver will try to stop producing these results,
+  /// but does not guarantee this.
   void removeFile(String path) {
     _throwIfNotAbsolutePath(path);
     _throwIfChangesAreNotAllowed();
@@ -1341,29 +1156,23 @@
     _priorityResults.clear();
   }
 
-  /**
-   * Reset URI resolution, read again all files, build files graph, and ensure
-   * that for all added files new results are reported.
-   */
+  /// Reset URI resolution, read again all files, build files graph, and ensure
+  /// that for all added files new results are reported.
   void resetUriResolution() {
     _fsState.resetUriResolution();
     _fileTracker.scheduleAllAddedFiles();
     _changeHook(null);
   }
 
-  /**
-   * Implementation for [changeFile].
-   */
+  /// Implementation for [changeFile].
   void _changeFile(String path) {
     _fileTracker.changeFile(path);
     _libraryContext = null;
     _priorityResults.clear();
   }
 
-  /**
-   * Handles a notification from the [FileTracker] that there has been a change
-   * of state.
-   */
+  /// Handles a notification from the [FileTracker] that there has been a change
+  /// of state.
   void _changeHook(String path) {
     _createNewSession(path);
     _libraryContext = null;
@@ -1371,21 +1180,19 @@
     _scheduler.notify(this);
   }
 
-  /**
-   * Return the cached or newly computed analysis result of the file with the
-   * given [path].
-   *
-   * The result will have the fully resolved unit and will always be newly
-   * compute only if [withUnit] is `true`.
-   *
-   * Return `null` if the file is a part of an unknown library, so cannot be
-   * analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is
-   * analyzed anyway, even without a library.
-   *
-   * Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and
-   * the resolved signature of the file in its library is the same as the one
-   * that was the most recently produced to the client.
-   */
+  /// Return the cached or newly computed analysis result of the file with the
+  /// given [path].
+  ///
+  /// The result will have the fully resolved unit and will always be newly
+  /// compute only if [withUnit] is `true`.
+  ///
+  /// Return `null` if the file is a part of an unknown library, so cannot be
+  /// analyzed yet. But [asIsIfPartWithoutLibrary] is `true`, then the file is
+  /// analyzed anyway, even without a library.
+  ///
+  /// Return [AnalysisResult._UNCHANGED] if [skipIfSameSignature] is `true` and
+  /// the resolved signature of the file in its library is the same as the one
+  /// that was the most recently produced to the client.
   AnalysisResult _computeAnalysisResult(String path,
       {bool withUnit: false,
       bool asIsIfPartWithoutLibrary: false,
@@ -1447,7 +1254,8 @@
             libraryContext.elementFactory,
             libraryContext.inheritanceManager,
             library,
-            _resourceProvider);
+            _resourceProvider,
+            testingData: testingData);
         Map<FileState, UnitAnalysisResult> results = analyzer.analyze();
 
         List<int> bytes;
@@ -1495,10 +1303,8 @@
     return analysisResult._index;
   }
 
-  /**
-   * Return the newly computed resolution result of the library with the
-   * given [path].
-   */
+  /// Return the newly computed resolution result of the library with the
+  /// given [path].
   ResolvedLibraryResultImpl _computeResolvedLibrary(String path) {
     FileState library = _fsState.getFileForPath(path);
 
@@ -1516,7 +1322,8 @@
           libraryContext.elementFactory,
           libraryContext.inheritanceManager,
           library,
-          _resourceProvider);
+          _resourceProvider,
+          testingData: testingData);
       Map<FileState, UnitAnalysisResult> unitResults = analyzer.analyze();
       var resolvedUnits = <ResolvedUnitResult>[];
 
@@ -1590,12 +1397,10 @@
     return library.transitiveSignature;
   }
 
-  /**
-   * Creates new [FileSystemState] and [FileTracker] objects.
-   *
-   * This is used both on initial construction and whenever the configuration
-   * changes.
-   */
+  /// Creates new [FileSystemState] and [FileTracker] objects.
+  ///
+  /// This is used both on initial construction and whenever the configuration
+  /// changes.
   void _createFileTracker() {
     _fillSalt();
     _fsState = new FileSystemState(
@@ -1612,9 +1417,7 @@
     _fileTracker = new FileTracker(_logger, _fsState, _changeHook);
   }
 
-  /**
-   * Return the context in which the [library] should be analyzed.
-   */
+  /// Return the context in which the [library] should be analyzed.
   LibraryContext _createLibraryContext(FileState library) {
     if (_libraryContext != null) {
       if (_libraryContext.pack()) {
@@ -1643,9 +1446,7 @@
     return _libraryContext;
   }
 
-  /**
-   * Create a new analysis session, so invalidating the current one.
-   */
+  /// Create a new analysis session, so invalidating the current one.
   void _createNewSession(String path) {
     if (onCurrentSessionAboutToBeDiscarded != null) {
       onCurrentSessionAboutToBeDiscarded(path);
@@ -1653,17 +1454,13 @@
     _currentSession = new AnalysisSessionImpl(this);
   }
 
-  /**
-   * If this has not been done yet, schedule discovery of all files that are
-   * potentially available, so that they are included in [knownFiles].
-   */
+  /// If this has not been done yet, schedule discovery of all files that are
+  /// potentially available, so that they are included in [knownFiles].
   void _discoverAvailableFiles() {
     _discoverAvailableFilesTask ??= new _DiscoverAvailableFilesTask(this);
   }
 
-  /**
-   * Fill [_unlinkedSalt] and [_linkedSalt] with data.
-   */
+  /// Fill [_unlinkedSalt] and [_linkedSalt] with data.
   void _fillSalt() {
     _unlinkedSalt[0] = DATA_VERSION;
     _unlinkedSalt[1] = enableIndex ? 1 : 0;
@@ -1676,10 +1473,8 @@
     _linkedSalt.setAll(3, _analysisOptions.signature);
   }
 
-  /**
-   * Load the [AnalysisResult] for the given [file] from the [bytes]. Set
-   * optional [content] and [resolvedUnit].
-   */
+  /// Load the [AnalysisResult] for the given [file] from the [bytes]. Set
+  /// optional [content] and [resolvedUnit].
   AnalysisResult _getAnalysisResultFromBytes(
       FileState file, String signature, List<int> bytes,
       {String content, CompilationUnit resolvedUnit}) {
@@ -1701,9 +1496,7 @@
         unit.index);
   }
 
-  /**
-   * Return [AnalysisError]s for the given [serialized] errors.
-   */
+  /// Return [AnalysisError]s for the given [serialized] errors.
   List<AnalysisError> _getErrorsFromSerialized(
       FileState file, List<AnalysisDriverUnitError> serialized) {
     List<AnalysisError> errors = <AnalysisError>[];
@@ -1742,17 +1535,13 @@
     return errors;
   }
 
-  /**
-   * Return the key to store fully resolved results for the [signature].
-   */
+  /// Return the key to store fully resolved results for the [signature].
   String _getResolvedUnitKey(String signature) {
     return '$signature.resolved';
   }
 
-  /**
-   * Return the signature that identifies fully resolved results for the [file]
-   * in the [library], e.g. element model, errors, index, etc.
-   */
+  /// Return the signature that identifies fully resolved results for the [file]
+  /// in the [library], e.g. element model, errors, index, etc.
   String _getResolvedUnitSignature(FileState library, FileState file) {
     ApiSignature signature = new ApiSignature();
     signature.addUint32List(_linkedSalt);
@@ -1761,10 +1550,8 @@
     return signature.toHex();
   }
 
-  /**
-   * Return the lint code with the given [errorName], or `null` if there is no
-   * lint registered with that name.
-   */
+  /// Return the lint code with the given [errorName], or `null` if there is no
+  /// lint registered with that name.
   ErrorCode _lintCodeByUniqueName(String errorName) {
     const String lintPrefix = 'LintCode.';
     if (errorName.startsWith(lintPrefix)) {
@@ -1781,10 +1568,8 @@
     return null;
   }
 
-  /**
-   * We detected that one of the required `dart` libraries is missing.
-   * Return the empty analysis result with the error.
-   */
+  /// We detected that one of the required `dart` libraries is missing.
+  /// Return the empty analysis result with the error.
   AnalysisResult _newMissingDartLibraryResult(
       FileState file, String missingUri) {
     // TODO(scheglov) Find a better way to report this.
@@ -1818,9 +1603,7 @@
     _exceptionController.add(new ExceptionResult(path, caught, contextKey));
   }
 
-  /**
-   * Serialize the given [resolvedUnit] errors and index into bytes.
-   */
+  /// Serialize the given [resolvedUnit] errors and index into bytes.
   List<int> _serializeResolvedUnit(
       CompilationUnit resolvedUnit, List<AnalysisError> errors) {
     AnalysisDriverUnitIndexBuilder index = enableIndex
@@ -1900,30 +1683,24 @@
     }
   }
 
-  /**
-   * If the driver is used in the read-only mode with infinite cache,
-   * we should not allow invocations that change files.
-   */
+  /// If the driver is used in the read-only mode with infinite cache,
+  /// we should not allow invocations that change files.
   void _throwIfChangesAreNotAllowed() {
     if (disableChangesAndCacheAllResults) {
       throw new StateError('Changing files is not allowed for this driver.');
     }
   }
 
-  /**
-   * The driver supports only absolute paths, this method is used to validate
-   * any input paths to prevent errors later.
-   */
+  /// The driver supports only absolute paths, this method is used to validate
+  /// any input paths to prevent errors later.
   void _throwIfNotAbsolutePath(String path) {
     if (!_resourceProvider.pathContext.isAbsolute(path)) {
       throw new ArgumentError('Only absolute paths are supported: $path');
     }
   }
 
-  /**
-   * Given the list of [errors] for the [file], update the [file]'s
-   * [FileState.hasErrorOrWarning] flag.
-   */
+  /// Given the list of [errors] for the [file], update the [file]'s
+  /// [FileState.hasErrorOrWarning] flag.
   void _updateHasErrorOrWarningFlag(
       FileState file, List<AnalysisError> errors) {
     for (AnalysisError error in errors) {
@@ -1938,60 +1715,44 @@
   }
 }
 
-/**
- * A generic schedulable interface via the AnalysisDriverScheduler. Currently
- * only implemented by [AnalysisDriver] and the angular plugin, at least as
- * a temporary measure until the official plugin API is ready (and a different
- * scheduler is used)
- */
+/// A generic schedulable interface via the AnalysisDriverScheduler. Currently
+/// only implemented by [AnalysisDriver] and the angular plugin, at least as
+/// a temporary measure until the official plugin API is ready (and a different
+/// scheduler is used)
 abstract class AnalysisDriverGeneric {
-  /**
-   * Return `true` if the driver has a file to analyze.
-   */
+  /// Return `true` if the driver has a file to analyze.
   bool get hasFilesToAnalyze;
 
-  /**
-   * Set the list of files that the driver should try to analyze sooner.
-   *
-   * Every path in the list must be absolute and normalized.
-   *
-   * The driver will produce the results through the [results] stream. The
-   * exact order in which results are produced is not defined, neither
-   * between priority files, nor between priority and non-priority files.
-   */
+  /// Set the list of files that the driver should try to analyze sooner.
+  ///
+  /// Every path in the list must be absolute and normalized.
+  ///
+  /// The driver will produce the results through the [results] stream. The
+  /// exact order in which results are produced is not defined, neither
+  /// between priority files, nor between priority and non-priority files.
   void set priorityFiles(List<String> priorityPaths);
 
-  /**
-   * Return the priority of work that the driver needs to perform.
-   */
+  /// Return the priority of work that the driver needs to perform.
   AnalysisDriverPriority get workPriority;
 
-  /**
-   * Add the file with the given [path] to the set of files that are explicitly
-   * being analyzed.
-   *
-   * The [path] must be absolute and normalized.
-   *
-   * The results of analysis are eventually produced by the [results] stream.
-   */
+  /// Add the file with the given [path] to the set of files that are explicitly
+  /// being analyzed.
+  ///
+  /// The [path] must be absolute and normalized.
+  ///
+  /// The results of analysis are eventually produced by the [results] stream.
   void addFile(String path);
 
-  /**
-   * Notify the driver that the client is going to stop using it.
-   */
+  /// Notify the driver that the client is going to stop using it.
   void dispose();
 
-  /**
-   * Perform a single chunk of work and produce [results].
-   */
+  /// Perform a single chunk of work and produce [results].
   Future<void> performWork();
 }
 
-/**
- * Priorities of [AnalysisDriver] work. The farther a priority to the beginning
- * of the list, the earlier the corresponding [AnalysisDriver] should be asked
- * to perform work.
- */
+/// Priorities of [AnalysisDriver] work. The farther a priority to the beginning
+/// of the list, the earlier the corresponding [AnalysisDriver] should be asked
+/// to perform work.
 enum AnalysisDriverPriority {
   nothing,
   general,
@@ -2003,37 +1764,29 @@
   interactive
 }
 
-/**
- * Instances of this class schedule work in multiple [AnalysisDriver]s so that
- * work with the highest priority is performed first.
- */
+/// Instances of this class schedule work in multiple [AnalysisDriver]s so that
+/// work with the highest priority is performed first.
 class AnalysisDriverScheduler {
-  /**
-   * Time interval in milliseconds before pumping the event queue.
-   *
-   * Relinquishing execution flow and running the event loop after every task
-   * has too much overhead. Instead we use a fixed length of time, so we can
-   * spend less time overall and still respond quickly enough.
-   */
+  /// Time interval in milliseconds before pumping the event queue.
+  ///
+  /// Relinquishing execution flow and running the event loop after every task
+  /// has too much overhead. Instead we use a fixed length of time, so we can
+  /// spend less time overall and still respond quickly enough.
   static const int _MS_BEFORE_PUMPING_EVENT_QUEUE = 2;
 
-  /**
-   * Event queue pumping is required to allow IO and other asynchronous data
-   * processing while analysis is active. For example Analysis Server needs to
-   * be able to process `updateContent` or `setPriorityFiles` requests while
-   * background analysis is in progress.
-   *
-   * The number of pumpings is arbitrary, might be changed if we see that
-   * analysis or other data processing tasks are starving. Ideally we would
-   * need to run all asynchronous operations using a single global scheduler.
-   */
+  /// Event queue pumping is required to allow IO and other asynchronous data
+  /// processing while analysis is active. For example Analysis Server needs to
+  /// be able to process `updateContent` or `setPriorityFiles` requests while
+  /// background analysis is in progress.
+  ///
+  /// The number of pumpings is arbitrary, might be changed if we see that
+  /// analysis or other data processing tasks are starving. Ideally we would
+  /// need to run all asynchronous operations using a single global scheduler.
   static const int _NUMBER_OF_EVENT_QUEUE_PUMPINGS = 128;
 
   final PerformanceLog _logger;
 
-  /**
-   * The object used to watch as analysis drivers are created and deleted.
-   */
+  /// The object used to watch as analysis drivers are created and deleted.
   final DriverWatcher driverWatcher;
 
   final List<AnalysisDriverGeneric> _drivers = [];
@@ -2042,29 +1795,21 @@
 
   bool _started = false;
 
-  /**
-   * The optional worker that is invoked when its work priority is higher
-   * than work priorities in drivers.
-   *
-   * Don't use outside of Analyzer and Analysis Server.
-   */
+  /// The optional worker that is invoked when its work priority is higher
+  /// than work priorities in drivers.
+  ///
+  /// Don't use outside of Analyzer and Analysis Server.
   SchedulerWorker outOfBandWorker;
 
   AnalysisDriverScheduler(this._logger, {this.driverWatcher});
 
-  /**
-   * Return `true` if we are currently analyzing code.
-   */
+  /// Return `true` if we are currently analyzing code.
   bool get isAnalyzing => _hasFilesToAnalyze;
 
-  /**
-   * Return the stream that produces [AnalysisStatus] events.
-   */
+  /// Return the stream that produces [AnalysisStatus] events.
   Stream<AnalysisStatus> get status => _statusSupport.stream;
 
-  /**
-   * Return `true` if there is a driver with a file to analyze.
-   */
+  /// Return `true` if there is a driver with a file to analyze.
   bool get _hasFilesToAnalyze {
     for (AnalysisDriverGeneric driver in _drivers) {
       if (driver.hasFilesToAnalyze) {
@@ -2074,9 +1819,7 @@
     return false;
   }
 
-  /**
-   * Add the given [driver] and schedule it to perform its work.
-   */
+  /// Add the given [driver] and schedule it to perform its work.
   void add(AnalysisDriverGeneric driver) {
     _drivers.add(driver);
     _hasWork.notify();
@@ -2085,19 +1828,15 @@
     }
   }
 
-  /**
-   * Notify that there is a change to the [driver], it it might need to
-   * perform some work.
-   */
+  /// Notify that there is a change to the [driver], it it might need to
+  /// perform some work.
   void notify(AnalysisDriverGeneric driver) {
     _hasWork.notify();
     _statusSupport.preTransitionToAnalyzing();
   }
 
-  /**
-   * Remove the given [driver] from the scheduler, so that it will not be
-   * asked to perform any new work.
-   */
+  /// Remove the given [driver] from the scheduler, so that it will not be
+  /// asked to perform any new work.
   void remove(AnalysisDriverGeneric driver) {
     if (driver is AnalysisDriver) {
       driverWatcher?.removedDriver(driver);
@@ -2106,10 +1845,8 @@
     _hasWork.notify();
   }
 
-  /**
-   * Start the scheduler, so that any [AnalysisDriver] created before or
-   * after will be asked to perform work.
-   */
+  /// Start the scheduler, so that any [AnalysisDriver] created before or
+  /// after will be asked to perform work.
   void start() {
     if (_started) {
       throw new StateError('The scheduler has already been started.');
@@ -2118,18 +1855,14 @@
     _run();
   }
 
-  /**
-   * Return a future that will be completed the next time the status is idle.
-   *
-   * If the status is currently idle, the returned future will be signaled
-   * immediately.
-   */
+  /// Return a future that will be completed the next time the status is idle.
+  ///
+  /// If the status is currently idle, the returned future will be signaled
+  /// immediately.
   Future<void> waitForIdle() => _statusSupport.waitForIdle();
 
-  /**
-   * Run infinitely analysis cycle, selecting the drivers with the highest
-   * priority first.
-   */
+  /// Run infinitely analysis cycle, selecting the drivers with the highest
+  /// priority first.
   Future<void> _run() async {
     // Give other microtasks the time to run before doing the analysis cycle.
     await null;
@@ -2192,10 +1925,8 @@
     }
   }
 
-  /**
-   * Returns a [Future] that completes after performing [times] pumpings of
-   * the event queue.
-   */
+  /// Returns a [Future] that completes after performing [times] pumpings of
+  /// the event queue.
   static Future _pumpEventQueue(int times) {
     if (times == 0) {
       return new Future.value();
@@ -2225,35 +1956,28 @@
   }
 }
 
-/**
- * The result of analyzing of a single file.
- *
- * These results are self-consistent, i.e. [content], [lineInfo], the
- * resolved [unit] correspond to each other. All referenced elements, even
- * external ones, are also self-consistent. But none of the results is
- * guaranteed to be consistent with the state of the files.
- *
- * Every result is independent, and is not guaranteed to be consistent with
- * any previously returned result, even inside of the same library.
- */
+/// The result of analyzing of a single file.
+///
+/// These results are self-consistent, i.e. [content], [lineInfo], the
+/// resolved [unit] correspond to each other. All referenced elements, even
+/// external ones, are also self-consistent. But none of the results is
+/// guaranteed to be consistent with the state of the files.
+///
+/// Every result is independent, and is not guaranteed to be consistent with
+/// any previously returned result, even inside of the same library.
 class AnalysisResult extends ResolvedUnitResultImpl {
   static final _UNCHANGED = new AnalysisResult(
       null, null, null, null, null, null, null, null, null, null, null, null);
-  /**
-   * The [SourceFactory] with which the file was analyzed.
-   */
+
+  /// The [SourceFactory] with which the file was analyzed.
   final SourceFactory sourceFactory;
 
-  /**
-   * The signature of the result based on the content of the file, and the
-   * transitive closure of files imported and exported by the library of
-   * the requested file.
-   */
+  /// The signature of the result based on the content of the file, and the
+  /// transitive closure of files imported and exported by the library of
+  /// the requested file.
   final String _signature;
 
-  /**
-   * The index of the unit.
-   */
+  /// The index of the unit.
   final AnalysisDriverUnitIndex _index;
 
   AnalysisResult(
@@ -2289,46 +2013,32 @@
   static final PerformanceTag cache = driver.createChild('cache');
 }
 
-/**
- * An object that watches for the creation and removal of analysis drivers.
- *
- * Clients may not extend, implement or mix-in this class.
- */
+/// An object that watches for the creation and removal of analysis drivers.
+///
+/// Clients may not extend, implement or mix-in this class.
 abstract class DriverWatcher {
-  /**
-   * The context manager has just added the given analysis [driver]. This method
-   * must be called before the driver has been allowed to perform any analysis.
-   */
+  /// The context manager has just added the given analysis [driver]. This method
+  /// must be called before the driver has been allowed to perform any analysis.
   void addedDriver(AnalysisDriver driver, ContextRoot contextRoot);
 
-  /**
-   * The context manager has just removed the given analysis [driver].
-   */
+  /// The context manager has just removed the given analysis [driver].
   void removedDriver(AnalysisDriver driver);
 }
 
-/**
- * Exception that happened during analysis.
- */
+/// Exception that happened during analysis.
 class ExceptionResult {
-  /**
-   * The path of the file being analyzed when the [exception] happened.
-   *
-   * Absolute and normalized.
-   */
+  /// The path of the file being analyzed when the [exception] happened.
+  ///
+  /// Absolute and normalized.
   final String path;
 
-  /**
-   * The exception during analysis of the file with the [path].
-   */
+  /// The exception during analysis of the file with the [path].
   final CaughtException exception;
 
-  /**
-   * If the exception happened during a file analysis, and the context in which
-   * the exception happened was stored, this field is the key of the context
-   * in the byte store. May be `null` if the context is unknown, the maximum
-   * number of context to store was reached, etc.
-   */
+  /// If the exception happened during a file analysis, and the context in which
+  /// the exception happened was stored, this field is the key of the context
+  /// in the byte store. May be `null` if the context is unknown, the maximum
+  /// number of context to store was reached, etc.
   final String contextKey;
 
   ExceptionResult(this.path, this.exception, this.contextKey);
@@ -2343,10 +2053,8 @@
   Future<void> performWork();
 }
 
-/**
- * Task that discovers all files that are available to the driver, and makes
- * them known.
- */
+/// Task that discovers all files that are available to the driver, and makes
+/// them known.
 class _DiscoverAvailableFilesTask {
   static const int _MS_WORK_INTERVAL = 5;
 
@@ -2361,11 +2069,9 @@
 
   _DiscoverAvailableFilesTask(this.driver);
 
-  /**
-   * Perform the next piece of work, and set [isCompleted] to `true` to
-   * indicate that the task is done, or keeps it `false` to indicate that the
-   * task should continue to be run.
-   */
+  /// Perform the next piece of work, and set [isCompleted] to `true` to
+  /// indicate that the task is done, or keeps it `false` to indicate that the
+  /// task should continue to be run.
   void perform() {
     if (folderIterator == null) {
       files.addAll(driver.addedFiles);
@@ -2436,17 +2142,13 @@
   }
 }
 
-/**
- * Information about an exception and its context.
- */
+/// Information about an exception and its context.
 class _ExceptionState {
   final exception;
   final StackTrace stackTrace;
 
-  /**
-   * The key under which the context of the exception was stored, or `null`
-   * if unknown, the maximum number of context to store was reached, etc.
-   */
+  /// The key under which the context of the exception was stored, or `null`
+  /// if unknown, the maximum number of context to store was reached, etc.
   final String contextKey;
 
   _ExceptionState(this.exception, this.stackTrace, this.contextKey);
@@ -2455,10 +2157,8 @@
   String toString() => '$exception\n$stackTrace';
 }
 
-/**
- * Task that computes the list of files that were added to the driver and
- * declare a class member with the given [name].
- */
+/// Task that computes the list of files that were added to the driver and
+/// declare a class member with the given [name].
 class _FilesDefiningClassMemberNameTask {
   static const int _MS_WORK_INTERVAL = 5;
 
@@ -2472,16 +2172,14 @@
 
   _FilesDefiningClassMemberNameTask(this.driver, this.name);
 
-  /**
-   * Perform work for a fixed length of time, and complete the [completer] to
-   * either return `true` to indicate that the task is done, or return `false`
-   * to indicate that the task should continue to be run.
-   *
-   * Each invocation of an asynchronous method has overhead, which looks as
-   * `_SyncCompleter.complete` invocation, we see as much as 62% in some
-   * scenarios. Instead we use a fixed length of time, so we can spend less time
-   * overall and keep quick enough response time.
-   */
+  /// Perform work for a fixed length of time, and complete the [completer] to
+  /// either return `true` to indicate that the task is done, or return `false`
+  /// to indicate that the task should continue to be run.
+  ///
+  /// Each invocation of an asynchronous method has overhead, which looks as
+  /// `_SyncCompleter.complete` invocation, we see as much as 62% in some
+  /// scenarios. Instead we use a fixed length of time, so we can spend less time
+  /// overall and keep quick enough response time.
   bool perform() {
     Stopwatch timer = new Stopwatch()..start();
     while (timer.elapsedMilliseconds < _MS_WORK_INTERVAL) {
@@ -2511,11 +2209,9 @@
   }
 }
 
-/**
- * Task that computes the list of files that were added to the driver and
- * have at least one reference to an identifier [name] defined outside of the
- * file.
- */
+/// Task that computes the list of files that were added to the driver and
+/// have at least one reference to an identifier [name] defined outside of the
+/// file.
 class _FilesReferencingNameTask {
   static const int _WORK_FILES = 100;
   static const int _MS_WORK_INTERVAL = 5;
@@ -2532,16 +2228,14 @@
 
   _FilesReferencingNameTask(this.driver, this.name);
 
-  /**
-   * Perform work for a fixed length of time, and complete the [completer] to
-   * either return `true` to indicate that the task is done, or return `false`
-   * to indicate that the task should continue to be run.
-   *
-   * Each invocation of an asynchronous method has overhead, which looks as
-   * `_SyncCompleter.complete` invocation, we see as much as 62% in some
-   * scenarios. Instead we use a fixed length of time, so we can spend less time
-   * overall and keep quick enough response time.
-   */
+  /// Perform work for a fixed length of time, and complete the [completer] to
+  /// either return `true` to indicate that the task is done, or return `false`
+  /// to indicate that the task should continue to be run.
+  ///
+  /// Each invocation of an asynchronous method has overhead, which looks as
+  /// `_SyncCompleter.complete` invocation, we see as much as 62% in some
+  /// scenarios. Instead we use a fixed length of time, so we can spend less time
+  /// overall and keep quick enough response time.
   bool perform() {
     if (driver._fsState.fileStamp != fileStamp) {
       filesToCheck = null;
@@ -2572,66 +2266,3 @@
     return true;
   }
 }
-
-/**
- * Task that computes top-level declarations for a certain name in all
- * known libraries.
- */
-class _TopLevelNameDeclarationsTask {
-  final AnalysisDriver driver;
-  final String name;
-  final Completer<List<TopLevelDeclarationInSource>> completer =
-      new Completer<List<TopLevelDeclarationInSource>>();
-
-  final List<TopLevelDeclarationInSource> libraryDeclarations =
-      <TopLevelDeclarationInSource>[];
-  final Set<String> checkedFiles = new Set<String>();
-  final List<String> filesToCheck = <String>[];
-
-  _TopLevelNameDeclarationsTask(this.driver, this.name);
-
-  /**
-   * Perform a single piece of work, and either complete the [completer] and
-   * return `true` to indicate that the task is done, return `false` to indicate
-   * that the task should continue to be run.
-   */
-  bool perform() {
-    // Prepare files to check.
-    if (filesToCheck.isEmpty) {
-      filesToCheck.addAll(driver.addedFiles.difference(checkedFiles));
-      filesToCheck.addAll(driver.knownFiles.difference(checkedFiles));
-    }
-
-    // If no more files to check, complete and done.
-    if (filesToCheck.isEmpty) {
-      completer.complete(libraryDeclarations);
-      return true;
-    }
-
-    // Check the next file.
-    String path = filesToCheck.removeLast();
-    if (checkedFiles.add(path)) {
-      FileState file = driver._fsState.getFileForPath(path);
-      if (!file.isPart) {
-        bool isExported = false;
-
-        TopLevelDeclaration declaration;
-        for (FileState part in file.libraryFiles) {
-          declaration ??= part.topLevelDeclarations[name];
-        }
-
-        if (declaration == null) {
-          declaration = file.exportedTopLevelDeclarations[name];
-          isExported = true;
-        }
-        if (declaration != null) {
-          libraryDeclarations.add(new TopLevelDeclarationInSource(
-              file.source, declaration, isExported));
-        }
-      }
-    }
-
-    // We're not done yet.
-    return false;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
index 0a2ac39..b942b0e 100644
--- a/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/experiments.g.dart
@@ -24,7 +24,7 @@
 };
 
 List<bool> _buildExperimentalFlagsArray() => <bool>[
-      IsEnabledByDefault.constant_update_2018,
+      true, // constant-update-2018
       true, // control-flow-collections
       IsEnabledByDefault.extension_methods,
       IsEnabledByDefault.non_nullable,
@@ -74,7 +74,8 @@
       EnableString.constant_update_2018,
       IsEnabledByDefault.constant_update_2018,
       IsExpired.constant_update_2018,
-      'Enhanced constant expressions');
+      'Enhanced constant expressions',
+      firstSupportedVersion: '2.4.1');
 
   static const control_flow_collections = const ExperimentalFeature(
       1,
@@ -145,7 +146,7 @@
 /// enabled by default.
 class IsEnabledByDefault {
   /// Default state of the experiment "constant-update-2018"
-  static const bool constant_update_2018 = false;
+  static const bool constant_update_2018 = true;
 
   /// Default state of the experiment "control-flow-collections"
   static const bool control_flow_collections = true;
diff --git a/pkg/analyzer/lib/src/dart/analysis/file_state.dart b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
index f93cdc2..94d34a8 100644
--- a/pkg/analyzer/lib/src/dart/analysis/file_state.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/file_state.dart
@@ -18,7 +18,6 @@
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/referenced_names.dart';
 import 'package:analyzer/src/dart/analysis/unlinked_api_signature.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
 import 'package:analyzer/src/dart/scanner/scanner.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -85,11 +84,6 @@
  * should be called.
  */
 class FileState {
-  /**
-   * The next value for [_exportDeclarationsId].
-   */
-  static int _exportDeclarationsNextId = 0;
-
   final FileSystemState _fsState;
 
   /**
@@ -142,10 +136,6 @@
   String _transitiveSignature;
   String _transitiveSignatureLinked;
 
-  Map<String, TopLevelDeclaration> _topLevelDeclarations;
-  Map<String, TopLevelDeclaration> _exportedTopLevelDeclarations;
-  int _exportDeclarationsId = 0;
-
   /**
    * The flag that shows whether the file has an error or warning that
    * might be fixed by a change to another file.
@@ -216,18 +206,6 @@
    */
   List<FileState> get exportedFiles => _exportedFiles;
 
-  /**
-   * Return [TopLevelDeclaration]s exported from the this library file. The
-   * keys to the map are names of declarations.
-   */
-  Map<String, TopLevelDeclaration> get exportedTopLevelDeclarations {
-    if (AnalysisDriver.useSummary2) {
-      return <String, TopLevelDeclaration>{};
-    }
-    _exportDeclarationsNextId = 1;
-    return _computeExportedDeclarations().declarations;
-  }
-
   @override
   int get hashCode => uri.hashCode;
 
@@ -244,7 +222,7 @@
    */
   bool get isExternalLibrary {
     return _fsState.externalSummaries != null &&
-        _fsState.externalSummaries.linkedMap.containsKey(uriStr);
+        _fsState.externalSummaries.hasLinkedLibrary(uriStr);
   }
 
   /**
@@ -253,8 +231,8 @@
    */
   bool get isPart {
     if (_fsState.externalSummaries != null &&
-        _fsState.externalSummaries.unlinkedMap.containsKey(uriStr)) {
-      return !_fsState.externalSummaries.linkedMap.containsKey(uriStr);
+        _fsState.externalSummaries.hasUnlinkedUnit(uriStr)) {
+      return _fsState.externalSummaries.isPartUnit(uriStr);
     }
     if (_unlinked2 != null) {
       return !_unlinked2.hasLibraryDirective && _unlinked2.hasPartOfDirective;
@@ -326,63 +304,6 @@
   FileStateTestView get test => new FileStateTestView(this);
 
   /**
-   * Return public top-level declarations declared in the file. The keys to the
-   * map are names of declarations.
-   */
-  Map<String, TopLevelDeclaration> get topLevelDeclarations {
-    if (AnalysisDriver.useSummary2) {
-      return <String, TopLevelDeclaration>{};
-    }
-
-    if (_topLevelDeclarations == null) {
-      _topLevelDeclarations = <String, TopLevelDeclaration>{};
-
-      void addDeclaration(TopLevelDeclarationKind kind, String name) {
-        if (!name.startsWith('_')) {
-          _topLevelDeclarations[name] = new TopLevelDeclaration(kind, name);
-        }
-      }
-
-      // Add types.
-      for (UnlinkedClass type in unlinked.classes) {
-        addDeclaration(TopLevelDeclarationKind.type, type.name);
-      }
-      for (UnlinkedEnum type in unlinked.enums) {
-        addDeclaration(TopLevelDeclarationKind.type, type.name);
-      }
-      for (UnlinkedClass type in unlinked.mixins) {
-        addDeclaration(TopLevelDeclarationKind.type, type.name);
-      }
-      for (UnlinkedTypedef type in unlinked.typedefs) {
-        addDeclaration(TopLevelDeclarationKind.type, type.name);
-      }
-      // Add functions and variables.
-      Set<String> addedVariableNames = new Set<String>();
-      for (UnlinkedExecutable executable in unlinked.executables) {
-        String name = executable.name;
-        if (executable.kind == UnlinkedExecutableKind.functionOrMethod) {
-          addDeclaration(TopLevelDeclarationKind.function, name);
-        } else if (executable.kind == UnlinkedExecutableKind.getter ||
-            executable.kind == UnlinkedExecutableKind.setter) {
-          if (executable.kind == UnlinkedExecutableKind.setter) {
-            name = name.substring(0, name.length - 1);
-          }
-          if (addedVariableNames.add(name)) {
-            addDeclaration(TopLevelDeclarationKind.variable, name);
-          }
-        }
-      }
-      for (UnlinkedVariable variable in unlinked.variables) {
-        String name = variable.name;
-        if (addedVariableNames.add(name)) {
-          addDeclaration(TopLevelDeclarationKind.variable, name);
-        }
-      }
-    }
-    return _topLevelDeclarations;
-  }
-
-  /**
    * Return the set of transitive files - the file itself and all of the
    * directly or indirectly referenced files.
    */
@@ -551,10 +472,6 @@
           library.libraryCycle?.invalidate();
         }
       }
-
-      for (FileState file in _fsState._uriToFile.values) {
-        file._exportedTopLevelDeclarations = null;
-      }
     }
 
     // This file is potentially not a library for its previous parts anymore.
@@ -621,69 +538,6 @@
   @override
   String toString() => path ?? '<unresolved>';
 
-  /**
-   * Compute the full or partial map of exported declarations for this library.
-   */
-  _ExportedDeclarations _computeExportedDeclarations() {
-    // If we know exported declarations, return them.
-    if (_exportedTopLevelDeclarations != null) {
-      return new _ExportedDeclarations(0, _exportedTopLevelDeclarations);
-    }
-
-    // If we are already computing exported declarations for this library,
-    // report that we found a cycle.
-    if (_exportDeclarationsId != 0) {
-      return new _ExportedDeclarations(_exportDeclarationsId, null);
-    }
-
-    var declarations = <String, TopLevelDeclaration>{};
-
-    // Give each library a unique identifier.
-    _exportDeclarationsId = _exportDeclarationsNextId++;
-
-    // Append the exported declarations.
-    int firstCycleId = 0;
-    for (int i = 0; i < _exportedFiles.length; i++) {
-      var exported = _exportedFiles[i]._computeExportedDeclarations();
-      if (exported.declarations != null) {
-        for (TopLevelDeclaration t in exported.declarations.values) {
-          if (_exportFilters[i].accepts(t.name)) {
-            declarations[t.name] = t;
-          }
-        }
-      }
-      if (exported.firstCycleId > 0) {
-        if (firstCycleId == 0 || firstCycleId > exported.firstCycleId) {
-          firstCycleId = exported.firstCycleId;
-        }
-      }
-    }
-
-    // If this library is the first component of the cycle, then we are at
-    // the beginning of this cycle, and combination of partial export
-    // namespaces of other exported libraries and declarations of this library
-    // is the full export namespace of this library.
-    if (firstCycleId != 0 && firstCycleId == _exportDeclarationsId) {
-      firstCycleId = 0;
-    }
-
-    // We're done with this library, successfully or not.
-    _exportDeclarationsId = 0;
-
-    // Append the library declarations.
-    for (FileState file in libraryFiles) {
-      declarations.addAll(file.topLevelDeclarations);
-    }
-
-    // Record the declarations only if it is the full result.
-    if (firstCycleId == 0) {
-      _exportedTopLevelDeclarations = declarations;
-    }
-
-    // Return the full or partial result.
-    return new _ExportedDeclarations(firstCycleId, declarations);
-  }
-
   CompilationUnit _createEmptyCompilationUnit(FeatureSet featureSet) {
     var token = new Token.eof(0);
     return astFactory.compilationUnit(
@@ -719,7 +573,6 @@
     _definedTopLevelNames = null;
     _definedClassMemberNames = null;
     _referencedNames = null;
-    _topLevelDeclarations = null;
 
     if (_driverUnlinkedUnit != null) {
       for (var name in _driverUnlinkedUnit.subtypedNames) {
@@ -834,10 +687,6 @@
           library.libraryCycle?.invalidate();
         }
       }
-
-      for (FileState file in _fsState._uriToFile.values) {
-        file._exportedTopLevelDeclarations = null;
-      }
     }
 
     // This file is potentially not a library for its previous parts anymore.
@@ -1260,23 +1109,6 @@
         .where((f) => f._libraryCycle == null)
         .toSet();
   }
-
-  Set<FileState> get librariesWithComputedExportedDeclarations {
-    return state._uriToFile.values
-        .where((f) => !f.isPart && f._exportedTopLevelDeclarations != null)
-        .toSet();
-  }
-}
-
-/**
- * The result of computing exported top-level declarations.
- * It can be full (when [firstCycleId] is zero), or partial (when a cycle)
- */
-class _ExportedDeclarations {
-  final int firstCycleId;
-  final Map<String, TopLevelDeclaration> declarations;
-
-  _ExportedDeclarations(this.firstCycleId, this.declarations);
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index 51debbd..2292ce4 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -468,6 +468,7 @@
         elementKind == ElementKind.ERROR ||
         elementKind == ElementKind.LABEL ||
         elementKind == ElementKind.LOCAL_VARIABLE ||
+        elementKind == ElementKind.NEVER ||
         elementKind == ElementKind.PREFIX ||
         elementKind == ElementKind.TYPE_PARAMETER ||
         elementKind == ElementKind.FUNCTION &&
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index a52b70d..3a8ad34 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -12,6 +12,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/constant/compute.dart';
@@ -20,12 +21,13 @@
 import 'package:analyzer/src/dart/constant/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/resolver/ast_rewrite.dart';
 import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/legacy_type_asserter.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/error/imports_verifier.dart';
 import 'package:analyzer/src/error/inheritance_override.dart';
-import 'package:analyzer/src/error/pending_error.dart';
 import 'package:analyzer/src/generated/declaration_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error_verifier.dart';
@@ -61,7 +63,7 @@
   final FileState _library;
   final ResourceProvider _resourceProvider;
 
-  final InheritanceManager2 _inheritance;
+  final InheritanceManager3 _inheritance;
   final bool Function(Uri) _isLibraryUri;
   final AnalysisContext _context;
   final ElementResynthesizer _resynthesizer;
@@ -77,10 +79,9 @@
   final Map<FileState, IgnoreInfo> _fileToIgnoreInfo = {};
   final Map<FileState, RecordingErrorListener> _errorListeners = {};
   final Map<FileState, ErrorReporter> _errorReporters = {};
-  final Map<FileState, FlowAnalysisResult> _fileToFlowAnalysisResult = {};
+  final TestingData _testingData;
   final List<UsedImportedElements> _usedImportedElementsList = [];
   final List<UsedLocalElements> _usedLocalElementsList = [];
-  final Map<FileState, List<PendingError>> _fileToPendingErrors = {};
 
   /**
    * Constants in the current library.
@@ -101,8 +102,10 @@
       this._elementFactory,
       this._inheritance,
       this._library,
-      this._resourceProvider)
-      : _typeSystem = _context.typeSystem;
+      this._resourceProvider,
+      {TestingData testingData})
+      : _typeSystem = _context.typeSystem,
+        _testingData = testingData;
 
   /**
    * Compute analysis results for all units of the library.
@@ -157,7 +160,6 @@
 
     units.forEach((file, unit) {
       _resolveFile(file, unit);
-      _computePendingMissingRequiredParameters(file, unit);
     });
     timerLibraryAnalyzerResolve.stop();
 
@@ -263,13 +265,6 @@
     AnalysisErrorListener errorListener = _getErrorListener(file);
     ErrorReporter errorReporter = _getErrorReporter(file);
 
-    //
-    // Convert the pending errors into actual errors.
-    //
-    for (PendingError pendingError in _fileToPendingErrors[file]) {
-      errorListener.onError(pendingError.toAnalysisError());
-    }
-
     unit.accept(new DeadCodeVerifier(errorReporter, unit.featureSet,
         typeSystem: _context.typeSystem));
 
@@ -281,6 +276,7 @@
     unit.accept(new BestPracticesVerifier(
         errorReporter, _typeProvider, _libraryElement, unit, file.content,
         typeSystem: _context.typeSystem,
+        inheritanceManager: _inheritance,
         resourceProvider: _resourceProvider,
         analysisOptions: _context.analysisOptions));
 
@@ -336,7 +332,7 @@
     var nodeRegistry = new NodeLintRegistry(_analysisOptions.enableTiming);
     var visitors = <AstVisitor>[];
     var context = LinterContextImpl(allUnits, currentUnit, _declaredVariables,
-        _typeProvider, _typeSystem, _analysisOptions);
+        _typeProvider, _typeSystem, _inheritance, _analysisOptions);
     for (Linter linter in _analysisOptions.lintRules) {
       linter.reporter = errorReporter;
       if (linter is NodeLintRule) {
@@ -365,15 +361,6 @@
     }
   }
 
-  void _computePendingMissingRequiredParameters(
-      FileState file, CompilationUnit unit) {
-    // TODO(scheglov) This can be done without "pending" if we resynthesize.
-    var computer = new RequiredConstantsComputer(file.source);
-    unit.accept(computer);
-    _constants.addAll(computer.requiredConstants);
-    _fileToPendingErrors[file] = computer.pendingErrors;
-  }
-
   void _computeVerifyErrors(FileState file, CompilationUnit unit) {
     if (file.source == null) {
       return;
@@ -413,8 +400,7 @@
     // Use the ErrorVerifier to compute errors.
     //
     ErrorVerifier errorVerifier = new ErrorVerifier(
-        errorReporter, _libraryElement, _typeProvider, _inheritance, false,
-        flowAnalysisResult: _fileToFlowAnalysisResult[file]);
+        errorReporter, _libraryElement, _typeProvider, _inheritance, false);
     unit.accept(errorVerifier);
   }
 
@@ -703,9 +689,10 @@
 
     FlowAnalysisHelper flowAnalysisHelper;
     if (unit.featureSet.isEnabled(Feature.non_nullable)) {
-      flowAnalysisHelper = FlowAnalysisHelper(_context.typeSystem, unit);
-      _fileToFlowAnalysisResult[file] = flowAnalysisHelper.result;
-      flowAnalysisHelper.result.putIntoNode(unit);
+      flowAnalysisHelper =
+          FlowAnalysisHelper(_context.typeSystem, unit, _testingData != null);
+      _testingData?.recordFlowAnalysisResult(
+          file.uri, flowAnalysisHelper.result);
     }
 
     unit.accept(new ResolverVisitor(
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_context.dart b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
index 87010c4..99bfc35 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_context.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_context.dart
@@ -14,7 +14,7 @@
 import 'package:analyzer/src/dart/analysis/restricted_analysis_context.dart';
 import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptions;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
@@ -61,7 +61,7 @@
   RestrictedAnalysisContext analysisContext;
   SummaryResynthesizer resynthesizer;
   LinkedElementFactory elementFactory;
-  InheritanceManager2 inheritanceManager;
+  InheritanceManager3 inheritanceManager;
 
   var loadedBundles = Set<LibraryCycle>.identity();
 
@@ -103,7 +103,7 @@
       resynthesizer.finishCoreAsyncLibraries();
     }
 
-    inheritanceManager = new InheritanceManager2(analysisContext.typeSystem);
+    inheritanceManager = new InheritanceManager3(analysisContext.typeSystem);
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
index 3e79078..9232da87 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_graph.dart
@@ -127,6 +127,7 @@
 
       signature.addInt(node.file.libraryFiles.length);
       for (var file in node.file.libraryFiles) {
+        signature.addBool(file.exists);
         signature.addBytes(file.apiSignature);
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/analysis/search.dart b/pkg/analyzer/lib/src/dart/analysis/search.dart
index dd29d9d..1b58efc 100644
--- a/pkg/analyzer/lib/src/dart/analysis/search.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/search.dart
@@ -3,14 +3,12 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 
 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/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';
@@ -30,57 +28,6 @@
 }
 
 /**
- * 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,
-  FIELD,
-  FUNCTION,
-  FUNCTION_TYPE_ALIAS,
-  GETTER,
-  METHOD,
-  MIXIN,
-  SETTER,
-  VARIABLE
-}
-
-/**
  * Search support for an [AnalysisDriver].
  */
 class Search {
@@ -120,197 +67,6 @@
   }
 
   /**
-   * Return top-level and class member declarations.
-   *
-   * If [regExp] is not `null`, only declaration with names matching it are
-   * returned. Otherwise, all declarations are returned.
-   *
-   * If [maxResults] is not `null`, it sets the maximum number of returned
-   * declarations.
-   *
-   * The path of each file with at least one declaration is added to [files].
-   */
-  Future<List<Declaration>> declarations(
-      RegExp regExp, int maxResults, LinkedHashSet<String> files,
-      {String onlyForFile}) async {
-    List<Declaration> declarations = <Declaration>[];
-
-    // TODO(scheglov) Not implemented.
-    if (AnalysisDriver.useSummary2) {
-      return declarations;
-    }
-
-    DeclarationKind getExecutableKind(
-        UnlinkedExecutable executable, bool topLevel) {
-      switch (executable.kind) {
-        case UnlinkedExecutableKind.constructor:
-          return DeclarationKind.CONSTRUCTOR;
-        case UnlinkedExecutableKind.functionOrMethod:
-          if (topLevel) {
-            return DeclarationKind.FUNCTION;
-          }
-          return DeclarationKind.METHOD;
-        case UnlinkedExecutableKind.getter:
-          return DeclarationKind.GETTER;
-          break;
-        default:
-          return DeclarationKind.SETTER;
-      }
-    }
-
-    await _driver.discoverAvailableFiles();
-
-    try {
-      List<FileState> knownFiles = _driver.fsState.knownFiles.toList();
-      for (FileState file in knownFiles) {
-        if (onlyForFile != null && file.path != onlyForFile) {
-          continue;
-        }
-        if (files.contains(file.path)) {
-          continue;
-        }
-
-        int fileIndex;
-
-        void addDeclaration(String name, DeclarationKind kind, int offset,
-            int codeOffset, int codeLength,
-            {String className, String mixinName, String parameters}) {
-          if (maxResults != null && declarations.length >= maxResults) {
-            throw const _MaxNumberOfDeclarationsError();
-          }
-
-          if (name.endsWith('=')) {
-            name = name.substring(0, name.length - 1);
-          }
-          if (regExp != null && !regExp.hasMatch(name)) {
-            return;
-          }
-
-          if (fileIndex == null) {
-            fileIndex = files.length;
-            files.add(file.path);
-          }
-
-          var location = file.lineInfo.getLocation(offset);
-          declarations.add(new Declaration(
-              fileIndex,
-              file.lineInfo,
-              name,
-              kind,
-              offset,
-              location.lineNumber,
-              location.columnNumber,
-              codeOffset,
-              codeLength,
-              className,
-              mixinName,
-              parameters));
-        }
-
-        UnlinkedUnit unlinkedUnit = file.unlinked;
-        var parameterComposer = new _UnlinkedParameterComposer(unlinkedUnit);
-
-        String getParametersString(List<UnlinkedParam> parameters) {
-          parameterComposer.clear();
-          parameterComposer.appendParameters(parameters);
-          return parameterComposer.buffer.toString();
-        }
-
-        String getExecutableParameters(UnlinkedExecutable executable) {
-          if (executable.kind == UnlinkedExecutableKind.getter) {
-            return null;
-          }
-          return getParametersString(executable.parameters);
-        }
-
-        void addUnlinkedClass(UnlinkedClass class_, DeclarationKind kind,
-            {String className, String mixinName}) {
-          addDeclaration(class_.name, kind, class_.nameOffset,
-              class_.codeRange.offset, class_.codeRange.length);
-
-          parameterComposer.outerTypeParameters = class_.typeParameters;
-
-          for (var field in class_.fields) {
-            addDeclaration(field.name, DeclarationKind.FIELD, field.nameOffset,
-                field.codeRange.offset, field.codeRange.length,
-                className: className, mixinName: mixinName);
-          }
-
-          for (var executable in class_.executables) {
-            parameterComposer.innerTypeParameters = executable.typeParameters;
-            addDeclaration(
-                executable.name,
-                getExecutableKind(executable, false),
-                executable.nameOffset,
-                executable.codeRange.offset,
-                executable.codeRange.length,
-                className: className,
-                mixinName: mixinName,
-                parameters: getExecutableParameters(executable));
-            parameterComposer.innerTypeParameters = const [];
-          }
-
-          parameterComposer.outerTypeParameters = const [];
-        }
-
-        for (var class_ in unlinkedUnit.classes) {
-          var kind = class_.isMixinApplication
-              ? DeclarationKind.CLASS_TYPE_ALIAS
-              : DeclarationKind.CLASS;
-          addUnlinkedClass(class_, kind, className: class_.name);
-        }
-
-        for (var mixin in unlinkedUnit.mixins) {
-          addUnlinkedClass(mixin, DeclarationKind.MIXIN, mixinName: mixin.name);
-        }
-
-        for (var enum_ in unlinkedUnit.enums) {
-          addDeclaration(enum_.name, DeclarationKind.ENUM, enum_.nameOffset,
-              enum_.codeRange.offset, enum_.codeRange.length);
-          for (var value in enum_.values) {
-            addDeclaration(value.name, DeclarationKind.ENUM_CONSTANT,
-                value.nameOffset, value.nameOffset, value.name.length);
-          }
-        }
-
-        for (var executable in unlinkedUnit.executables) {
-          parameterComposer.outerTypeParameters = executable.typeParameters;
-          addDeclaration(
-              executable.name,
-              getExecutableKind(executable, true),
-              executable.nameOffset,
-              executable.codeRange.offset,
-              executable.codeRange.length,
-              parameters: getExecutableParameters(executable));
-        }
-
-        for (var typedef_ in unlinkedUnit.typedefs) {
-          parameterComposer.outerTypeParameters = typedef_.typeParameters;
-          addDeclaration(
-              typedef_.name,
-              DeclarationKind.FUNCTION_TYPE_ALIAS,
-              typedef_.nameOffset,
-              typedef_.codeRange.offset,
-              typedef_.codeRange.length,
-              parameters: getParametersString(typedef_.parameters));
-          parameterComposer.outerTypeParameters = const [];
-        }
-
-        for (var variable in unlinkedUnit.variables) {
-          addDeclaration(
-              variable.name,
-              DeclarationKind.VARIABLE,
-              variable.nameOffset,
-              variable.codeRange.offset,
-              variable.codeRange.length);
-        }
-      }
-    } on _MaxNumberOfDeclarationsError {}
-
-    return declarations;
-  }
-
-  /**
    * Returns references to the [element].
    */
   Future<List<SearchResult>> references(
@@ -1293,106 +1049,3 @@
         enclosingElement, kind, node.offset, node.length, true, isQualified));
   }
 }
-
-/**
- * The marker class that is thrown to stop adding declarations.
- */
-class _MaxNumberOfDeclarationsError {
-  const _MaxNumberOfDeclarationsError();
-}
-
-/**
- * Helper for composing parameter strings.
- */
-class _UnlinkedParameterComposer {
-  final UnlinkedUnit unlinkedUnit;
-  final StringBuffer buffer = new StringBuffer();
-
-  List<UnlinkedTypeParam> outerTypeParameters = const [];
-  List<UnlinkedTypeParam> innerTypeParameters = const [];
-
-  _UnlinkedParameterComposer(this.unlinkedUnit);
-
-  void appendParameter(UnlinkedParam parameter) {
-    bool hasType = appendType(parameter.type);
-    if (hasType && parameter.name.isNotEmpty) {
-      buffer.write(' ');
-    }
-    buffer.write(parameter.name);
-    if (parameter.isFunctionTyped) {
-      appendParameters(parameter.parameters);
-    }
-  }
-
-  void appendParameters(List<UnlinkedParam> parameters) {
-    buffer.write('(');
-
-    bool isFirstParameter = true;
-    for (var parameter in parameters) {
-      if (isFirstParameter) {
-        isFirstParameter = false;
-      } else {
-        buffer.write(', ');
-      }
-      appendParameter(parameter);
-    }
-
-    buffer.write(')');
-  }
-
-  bool appendType(EntityRef type) {
-    EntityRefKind kind = type?.entityKind;
-    if (kind == EntityRefKind.named) {
-      if (type.reference != 0) {
-        UnlinkedReference typeRef = unlinkedUnit.references[type.reference];
-        buffer.write(typeRef.name);
-        appendTypeArguments(type);
-        return true;
-      }
-      if (type.paramReference != 0) {
-        int ref = type.paramReference;
-        if (ref <= innerTypeParameters.length) {
-          var param = innerTypeParameters[innerTypeParameters.length - ref];
-          buffer.write(param.name);
-          return true;
-        }
-        ref -= innerTypeParameters.length;
-        if (ref <= outerTypeParameters.length) {
-          var param = outerTypeParameters[outerTypeParameters.length - ref];
-          buffer.write(param.name);
-          return true;
-        }
-        return false;
-      }
-    }
-    if (kind == EntityRefKind.genericFunctionType) {
-      if (appendType(type.syntheticReturnType)) {
-        buffer.write(' ');
-      }
-      buffer.write('Function');
-      appendParameters(type.syntheticParams);
-      return true;
-    }
-    return false;
-  }
-
-  void appendTypeArguments(EntityRef type) {
-    if (type.typeArguments.isNotEmpty) {
-      buffer.write('<');
-      bool first = true;
-      for (var arguments in type.typeArguments) {
-        if (first) {
-          first = false;
-        } else {
-          buffer.write(', ');
-        }
-        appendType(arguments);
-      }
-      buffer.write('>');
-    }
-  }
-
-  void clear() {
-    buffer.clear();
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/analysis/session.dart b/pkg/analyzer/lib/src/dart/analysis/session.dart
index 30db6fa..6b75d09 100644
--- a/pkg/analyzer/lib/src/dart/analysis/session.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/session.dart
@@ -12,7 +12,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart' as driver;
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/analysis/uri_converter.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart';
@@ -89,6 +88,12 @@
   }
 
   @override
+  FileResult getFile(String path) {
+    _checkConsistency();
+    return _driver.getFileSync(path);
+  }
+
+  @override
   Future<LibraryElement> getLibraryByUri(String uri) async {
     // TODO(brianwilkerson) Determine whether this await is necessary.
     await null;
@@ -159,13 +164,6 @@
   }
 
   @override
-  Future<List<TopLevelDeclarationInSource>> getTopLevelDeclarations(
-      String name) {
-    _checkConsistency();
-    return _driver.getTopLevelNameDeclarations(name);
-  }
-
-  @override
   Future<UnitElementResult> getUnitElement(String path) {
     _checkConsistency();
     return _driver.getUnitElement(path);
diff --git a/pkg/analyzer/lib/src/dart/analysis/testing_data.dart b/pkg/analyzer/lib/src/dart/analysis/testing_data.dart
new file mode 100644
index 0000000..8d27ede
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/analysis/testing_data.dart
@@ -0,0 +1,19 @@
+// 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/src/dart/resolver/flow_analysis_visitor.dart';
+
+/// Data structure maintaining intermediate analysis results for testing
+/// purposes.  Under normal execution, no instance of this class should be
+/// created.
+class TestingData {
+  /// Map containing the results of flow analysis.
+  final Map<Uri, FlowAnalysisResult> uriToFlowAnalysisResult = {};
+
+  /// Called by the analysis driver after performing flow analysis, to record
+  /// flow analysis results.
+  void recordFlowAnalysisResult(Uri uri, FlowAnalysisResult result) {
+    uriToFlowAnalysisResult[uri] = result;
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart b/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
deleted file mode 100644
index 1658aad..0000000
--- a/pkg/analyzer/lib/src/dart/analysis/top_level_declaration.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * Information about a single top-level declaration.
- */
-class TopLevelDeclaration {
-  final TopLevelDeclarationKind kind;
-  final String name;
-
-  TopLevelDeclaration(this.kind, this.name);
-
-  @override
-  String toString() => '($kind, $name)';
-}
-
-/**
- * A declaration in a source.
- */
-class TopLevelDeclarationInSource {
-  /**
-   * The declaring source.
-   */
-  final Source source;
-
-  /**
-   * The declaration.
-   */
-  final TopLevelDeclaration declaration;
-
-  /**
-   * Is `true` if the [declaration] is exported, not declared in the [source].
-   */
-  final bool isExported;
-
-  TopLevelDeclarationInSource(this.source, this.declaration, this.isExported);
-
-  @override
-  String toString() => '($source, $declaration, $isExported)';
-}
-
-/**
- * Kind of a top-level declaration.
- *
- * We don't need it to be precise, just enough to support quick fixes.
- */
-enum TopLevelDeclarationKind { type, function, variable }
diff --git a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
index 6fce596..5bd8db5 100644
--- a/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/unlinked_api_signature.dart
@@ -11,13 +11,13 @@
 ///
 /// If API signatures of two units are different, they may have different APIs.
 List<int> computeUnlinkedApiSignature(CompilationUnit unit) {
-  var computer = new _UnitApiSignatureComputer();
+  var computer = _UnitApiSignatureComputer();
   computer.compute(unit);
   return computer.signature.toByteList();
 }
 
 class _UnitApiSignatureComputer {
-  final signature = new ApiSignature();
+  final ApiSignature signature = ApiSignature();
 
   void addClassOrMixin(ClassOrMixinDeclaration node) {
     addTokens(node.beginToken, node.leftBracket);
@@ -49,6 +49,8 @@
           member.beginToken,
           (member.parameters ?? member.name).endToken,
         );
+        signature.addBool(member.body is EmptyFunctionBody);
+        addFunctionBodyModifiers(member.body);
       } else {
         addNode(member);
       }
@@ -57,6 +59,11 @@
     addToken(node.rightBracket);
   }
 
+  void addFunctionBodyModifiers(FunctionBody node) {
+    signature.addBool(node.isSynchronous);
+    signature.addBool(node.isGenerator);
+  }
+
   void addNode(AstNode node) {
     addTokens(node.beginToken, node.endToken);
   }
@@ -120,11 +127,12 @@
       if (declaration is ClassOrMixinDeclaration) {
         addClassOrMixin(declaration);
       } else if (declaration is FunctionDeclaration) {
-        var parameters = declaration.functionExpression.parameters;
+        var functionExpression = declaration.functionExpression;
         addTokens(
           declaration.beginToken,
-          (parameters ?? declaration.name).endToken,
+          (functionExpression.parameters ?? declaration.name).endToken,
         );
+        addFunctionBodyModifiers(functionExpression.body);
       } else if (declaration is TopLevelVariableDeclaration) {
         addVariables(declaration, declaration.variables, false);
       } else {
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 31c1d5e..87d899b 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -737,7 +737,7 @@
       return null;
     }
     List<ParameterElement> parameters = executableElement.parameters;
-    if (parameters.length < 1) {
+    if (parameters.isEmpty) {
       return null;
     }
     return parameters[0];
@@ -2567,7 +2567,7 @@
   Token get endToken {
     if (_body != null) {
       return _body.endToken;
-    } else if (!_initializers.isEmpty) {
+    } else if (_initializers.isNotEmpty) {
       return _initializers.endToken;
     }
     return _parameters.endToken;
@@ -3850,11 +3850,13 @@
   @override
   Token rightBracket;
 
+  ExtensionElement _declaredElement;
+
   ExtensionDeclarationImpl(
       CommentImpl comment,
       List<Annotation> metadata,
       this.extensionKeyword,
-      this._name,
+      SimpleIdentifierImpl name,
       TypeParameterListImpl typeParameters,
       this.onKeyword,
       TypeAnnotationImpl extendedType,
@@ -3862,15 +3864,13 @@
       List<ClassMember> members,
       this.rightBracket)
       : super(comment, metadata) {
+    _name = _becomeParentOf(name);
     _typeParameters = _becomeParentOf(typeParameters);
     _extendedType = _becomeParentOf(extendedType);
     _members = new NodeListImpl<ClassMember>(this, members);
   }
 
   @override
-  Token get beginToken => extensionKeyword;
-
-  @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
     ..add(extensionKeyword)
     ..add(name)
@@ -3882,10 +3882,15 @@
     ..add(rightBracket);
 
   @override
-  Element get declaredElement => name.staticElement;
+  ExtensionElement get declaredElement => _declaredElement;
+
+  /// Set the element declared by this declaration to the given [element].
+  set declaredElement(ExtensionElement element) {
+    _declaredElement = element;
+  }
 
   @override
-  Element get element => name.staticElement;
+  ExtensionElement get element => declaredElement;
 
   @override
   Token get endToken => rightBracket;
@@ -3898,7 +3903,7 @@
   }
 
   @override
-  Token get firstTokenAfterCommentAndMetadata => name.beginToken;
+  Token get firstTokenAfterCommentAndMetadata => extensionKeyword;
 
   @override
   NodeList<ClassMember> get members => _members;
@@ -3947,6 +3952,12 @@
   /// arguments were provided.
   TypeArgumentListImpl _typeArguments;
 
+  @override
+  List<DartType> typeArgumentTypes;
+
+  @override
+  DartType extendedType;
+
   ExtensionOverrideImpl(IdentifierImpl extensionName,
       TypeArgumentListImpl typeArguments, ArgumentListImpl argumentList) {
     _extensionName = _becomeParentOf(extensionName);
@@ -3971,7 +3982,7 @@
     ..add(_argumentList);
 
   @override
-  Token get endToken => _argumentList?.endToken;
+  Token get endToken => _argumentList.endToken;
 
   @override
   Identifier get extensionName => _extensionName;
@@ -3984,6 +3995,9 @@
   Precedence get precedence => Precedence.postfix;
 
   @override
+  ExtensionElement get staticElement => extensionName.staticElement;
+
+  @override
   TypeArgumentList get typeArguments => _typeArguments;
 
   void set typeArguments(TypeArgumentList typeArguments) {
@@ -3991,11 +4005,6 @@
   }
 
   @override
-  // TODO(brianwilkerson) Either implement this getter or remove it if it isn't
-  //  needed.
-  List<DartType> get typeArgumentTypes => null;
-
-  @override
   E accept<E>(AstVisitor<E> visitor) {
     return visitor.visitExtensionOverride(this);
   }
@@ -4151,7 +4160,7 @@
   @override
   Token get beginToken {
     NodeList<Annotation> metadata = this.metadata;
-    if (!metadata.isEmpty) {
+    if (metadata.isNotEmpty) {
       return metadata.beginToken;
     } else if (covariantKeyword != null) {
       return covariantKeyword;
@@ -4652,7 +4661,6 @@
 
   @override
   Token get beginToken => _variableList?.beginToken ?? super.beginToken;
-
   @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
     ..add(_variableList)
@@ -4695,7 +4703,6 @@
 
   @override
   Token get beginToken => initialization?.beginToken ?? super.beginToken;
-
   @override
   Iterable<SyntacticEntity> get childEntities => new ChildEntities()
     ..add(_initialization)
@@ -6022,7 +6029,7 @@
       return null;
     }
     List<ParameterElement> parameters = staticElement.parameters;
-    if (parameters.length < 1) {
+    if (parameters.isEmpty) {
       return null;
     }
     return parameters[0];
@@ -6540,7 +6547,7 @@
 
   @override
   Token get beginToken {
-    if (!_labels.isEmpty) {
+    if (_labels.isNotEmpty) {
       return _labels.beginToken;
     }
     return _statement.beginToken;
@@ -7609,7 +7616,7 @@
 
   @override
   Token get beginToken {
-    if (_elements.length == 0) {
+    if (_elements.isEmpty) {
       return null;
     }
     return _elements[0].beginToken;
@@ -7670,7 +7677,7 @@
 
   @override
   bool addAll(Iterable<E> nodes) {
-    if (nodes != null && !nodes.isEmpty) {
+    if (nodes != null && nodes.isNotEmpty) {
       if (nodes is List<E>) {
         int length = nodes.length;
         for (int i = 0; i < length; i++) {
@@ -8183,7 +8190,7 @@
       return null;
     }
     List<ParameterElement> parameters = staticElement.parameters;
-    if (parameters.length < 1) {
+    if (parameters.isEmpty) {
       return null;
     }
     return parameters[0];
@@ -8366,7 +8373,7 @@
       return null;
     }
     List<ParameterElement> parameters = staticElement.parameters;
-    if (parameters.length < 1) {
+    if (parameters.isEmpty) {
       return null;
     }
     return parameters[0];
@@ -8830,7 +8837,7 @@
   @override
   Token get beginToken {
     NodeList<Annotation> metadata = this.metadata;
-    if (!metadata.isEmpty) {
+    if (metadata.isNotEmpty) {
       return metadata.beginToken;
     } else if (covariantKeyword != null) {
       return covariantKeyword;
@@ -8897,6 +8904,9 @@
   /// getter context.
   AuxiliaryElements auxiliaryElements = null;
 
+  @override
+  List<DartType> tearOffTypeArgumentTypes;
+
   /// Initialize a newly created identifier.
   SimpleIdentifierImpl(this.token);
 
@@ -9600,7 +9610,7 @@
 
   @override
   Token get beginToken {
-    if (!_labels.isEmpty) {
+    if (_labels.isNotEmpty) {
       return _labels.beginToken;
     }
     return keyword;
@@ -9608,7 +9618,7 @@
 
   @override
   Token get endToken {
-    if (!_statements.isEmpty) {
+    if (_statements.isNotEmpty) {
       return _statements.endToken;
     }
     return colon;
@@ -9946,7 +9956,7 @@
       return _finallyBlock.endToken;
     } else if (finallyKeyword != null) {
       return finallyKeyword;
-    } else if (!_catchClauses.isEmpty) {
+    } else if (_catchClauses.isNotEmpty) {
       return _catchClauses.endToken;
     }
     return _body.endToken;
diff --git a/pkg/analyzer/lib/src/dart/ast/utilities.dart b/pkg/analyzer/lib/src/dart/ast/utilities.dart
index f1a7574..bbff1e7 100644
--- a/pkg/analyzer/lib/src/dart/ast/utilities.dart
+++ b/pkg/analyzer/lib/src/dart/ast/utilities.dart
@@ -6386,6 +6386,8 @@
       toNode.staticElement = node.staticElement;
       toNode.staticType = node.staticType;
       toNode.auxiliaryElements = node.auxiliaryElements;
+      (toNode as SimpleIdentifierImpl).tearOffTypeArgumentTypes =
+          node.tearOffTypeArgumentTypes;
       return true;
     }
     return false;
diff --git a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
index 26fc896..1ec4362 100644
--- a/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
+++ b/pkg/analyzer/lib/src/dart/constant/constant_verifier.dart
@@ -17,6 +17,7 @@
 import 'package:analyzer/src/dart/constant/potentially_constant.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -45,6 +46,8 @@
 
   final ConstantEvaluationEngine _evaluationEngine;
 
+  final DiagnosticFactory _diagnosticFactory = DiagnosticFactory();
+
   /// Initialize a newly created constant verifier.
   ConstantVerifier(ErrorReporter errorReporter, LibraryElement currentLibrary,
       TypeProvider typeProvider, DeclaredVariables declaredVariables,
@@ -171,23 +174,23 @@
       if (node.isConst) {
         InterfaceType nodeType = node.staticType;
         var elementType = nodeType.typeArguments[0];
-        var duplicateElements = <Expression>[];
+        var duplicateElements = <Expression, Expression>{};
         var verifier = _ConstLiteralVerifier(
           this,
           errorCode: CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT,
           forSet: true,
           setElementType: elementType,
-          setUniqueValues: Set<DartObject>(),
+          setUniqueValues: <DartObject, Expression>{},
           setDuplicateExpressions: duplicateElements,
         );
         for (CollectionElement element in node.elements) {
           verifier.verify(element);
         }
-        for (var duplicateElement in duplicateElements) {
-          _errorReporter.reportErrorForNode(
-            CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET,
-            duplicateElement,
-          );
+        for (var duplicateElement in duplicateElements.keys) {
+          _errorReporter.reportError(_diagnosticFactory.equalElementsInConstSet(
+              _errorReporter.source,
+              duplicateElement,
+              duplicateElements[duplicateElement]));
         }
       }
     } else if (node.isMap) {
@@ -196,25 +199,25 @@
         var keyType = nodeType.typeArguments[0];
         var valueType = nodeType.typeArguments[1];
         bool reportEqualKeys = true;
-        var duplicateKeyElements = <Expression>[];
+        var duplicateKeyElements = <Expression, Expression>{};
         var verifier = _ConstLiteralVerifier(
           this,
           errorCode: CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT,
           forMap: true,
           mapKeyType: keyType,
           mapValueType: valueType,
-          mapUniqueKeys: Set<DartObject>(),
+          mapUniqueKeys: <DartObject, Expression>{},
           mapDuplicateKeyExpressions: duplicateKeyElements,
         );
         for (CollectionElement entry in node.elements) {
           verifier.verify(entry);
         }
         if (reportEqualKeys) {
-          for (var duplicateKeyElement in duplicateKeyElements) {
-            _errorReporter.reportErrorForNode(
-              CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP,
-              duplicateKeyElement,
-            );
+          for (var duplicateKeyElement in duplicateKeyElements.keys) {
+            _errorReporter.reportError(_diagnosticFactory.equalKeysInConstMap(
+                _errorReporter.source,
+                duplicateKeyElement,
+                duplicateKeyElements[duplicateKeyElement]));
           }
         }
       }
@@ -348,7 +351,8 @@
       // lookup for ==
       MethodElement method =
           element.lookUpConcreteMethod("==", _currentLibrary);
-      if (method == null || method.enclosingElement.type.isObject) {
+      if (method == null ||
+          (method.enclosingElement as ClassElement).type.isObject) {
         return false;
       }
       // there is == that we don't like
@@ -562,15 +566,15 @@
 
 class _ConstLiteralVerifier {
   final ConstantVerifier verifier;
-  final Set<DartObject> mapUniqueKeys;
-  final List<Expression> mapDuplicateKeyExpressions;
+  final Map<DartObject, Expression> mapUniqueKeys;
+  final Map<Expression, Expression> mapDuplicateKeyExpressions;
   final ErrorCode errorCode;
   final DartType listElementType;
   final DartType mapKeyType;
   final DartType mapValueType;
   final DartType setElementType;
-  final Set<DartObject> setUniqueValues;
-  final List<CollectionElement> setDuplicateExpressions;
+  final Map<DartObject, Expression> setUniqueValues;
+  final Map<Expression, Expression> setDuplicateExpressions;
   final bool forList;
   final bool forMap;
   final bool forSet;
@@ -764,8 +768,11 @@
     if (forSet) {
       var iterableValue = listValue ?? setValue;
       for (var item in iterableValue) {
-        if (!setUniqueValues.add(item)) {
-          setDuplicateExpressions.add(element.expression);
+        Expression expression = element.expression;
+        if (setUniqueValues.containsKey(item)) {
+          setDuplicateExpressions[expression] = setUniqueValues[item];
+        } else {
+          setUniqueValues[item] = expression;
         }
       }
     }
@@ -812,8 +819,10 @@
         CompileTimeErrorCode.NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY,
       );
 
-      if (!mapUniqueKeys.add(keyValue)) {
-        mapDuplicateKeyExpressions.add(keyExpression);
+      if (mapUniqueKeys.containsKey(keyValue)) {
+        mapDuplicateKeyExpressions[keyExpression] = mapUniqueKeys[keyValue];
+      } else {
+        mapUniqueKeys[keyValue] = keyExpression;
       }
     }
 
@@ -849,8 +858,11 @@
       for (var entry in map.entries) {
         DartObjectImpl keyValue = entry.key;
         if (keyValue != null) {
-          if (!mapUniqueKeys.add(keyValue)) {
-            mapDuplicateKeyExpressions.add(element.expression);
+          if (mapUniqueKeys.containsKey(keyValue)) {
+            mapDuplicateKeyExpressions[element.expression] =
+                mapUniqueKeys[keyValue];
+          } else {
+            mapUniqueKeys[keyValue] = element.expression;
           }
         }
       }
@@ -887,8 +899,10 @@
       CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT_FROM_DEFERRED_LIBRARY,
     );
 
-    if (!setUniqueValues.add(value)) {
-      setDuplicateExpressions.add(expression);
+    if (setUniqueValues.containsKey(value)) {
+      setDuplicateExpressions[expression] = setUniqueValues[value];
+    } else {
+      setUniqueValues[value] = expression;
     }
 
     return true;
diff --git a/pkg/analyzer/lib/src/dart/constant/value.dart b/pkg/analyzer/lib/src/dart/constant/value.dart
index db0ed6f..6658568 100644
--- a/pkg/analyzer/lib/src/dart/constant/value.dart
+++ b/pkg/analyzer/lib/src/dart/constant/value.dart
@@ -701,8 +701,7 @@
     return null;
   }
 
-  /// If this constant represents a library function or static method, returns
-  /// it, otherwise returns `null`.
+  @override
   ExecutableElement toFunctionValue() {
     InstanceState state = _state;
     return state is FunctionState ? state._element : null;
diff --git a/pkg/analyzer/lib/src/dart/element/builder.dart b/pkg/analyzer/lib/src/dart/element/builder.dart
index caa0877..9d3103e 100644
--- a/pkg/analyzer/lib/src/dart/element/builder.dart
+++ b/pkg/analyzer/lib/src/dart/element/builder.dart
@@ -422,7 +422,7 @@
         SimpleIdentifier methodName = node.name;
         String nameOfMethod = methodName.name;
         if (nameOfMethod == TokenType.MINUS.lexeme &&
-            node.parameters.parameters.length == 0) {
+            node.parameters.parameters.isEmpty) {
           nameOfMethod = "unary-";
         }
         MethodElementImpl element =
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index e323a01..b145b76 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -690,7 +690,7 @@
     List<ClassElement> classesToVisit = new List<ClassElement>();
     HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     classesToVisit.add(this);
-    while (!classesToVisit.isEmpty) {
+    while (classesToVisit.isNotEmpty) {
       ClassElement currentElement = classesToVisit.removeAt(0);
       if (visitedClasses.add(currentElement)) {
         // check fields
@@ -1370,9 +1370,9 @@
 
       accessorElement.variable = field;
       if (isGetter) {
-        field.getter = accessorElement;
+        field.getter ??= accessorElement;
       } else {
-        field.setter = accessorElement;
+        field.setter ??= accessorElement;
       }
     }
 
@@ -1534,7 +1534,7 @@
     List<InterfaceType> typesToVisit = new List<InterfaceType>();
     List<ClassElement> visitedClasses = new List<ClassElement>();
     typesToVisit.add(startingType);
-    while (!typesToVisit.isEmpty) {
+    while (typesToVisit.isNotEmpty) {
       InterfaceType currentType = typesToVisit.removeAt(0);
       ClassElement currentElement = currentType.element;
       if (!visitedClasses.contains(currentElement)) {
@@ -1778,7 +1778,23 @@
     }
 
     if (linkedNode != null) {
-      // TODO(brianwilkerson) Implement this.
+      CompilationUnit linkedNode = this.linkedNode;
+      var containerRef = reference.getChild('@extension');
+      _extensions = <ExtensionElement>[];
+      for (var node in linkedNode.declarations) {
+        if (node is ExtensionDeclaration) {
+          var refName = linkedContext.getExtensionRefName(node);
+          var reference = containerRef.getChild(refName);
+          if (reference.hasElementFor(node)) {
+            _extensions.add(reference.element);
+          } else {
+            _extensions.add(
+              ExtensionElementImpl.forLinkedNode(this, reference, node),
+            );
+          }
+        }
+      }
+      return _extensions;
     } else if (_unlinkedUnit != null) {
       return _extensions = _unlinkedUnit.extensions
           .map((e) => ExtensionElementImpl.forSerialized(e, this))
@@ -2166,6 +2182,7 @@
     super.visitChildren(visitor);
     safelyVisitChildren(accessors, visitor);
     safelyVisitChildren(enums, visitor);
+    safelyVisitChildren(extensions, visitor);
     safelyVisitChildren(functions, visitor);
     safelyVisitChildren(functionTypeAliases, visitor);
     safelyVisitChildren(mixins, visitor);
@@ -2598,7 +2615,7 @@
   bool get isDefaultConstructor {
     // unnamed
     String name = this.name;
-    if (name != null && name.length != 0) {
+    if (name != null && name.isNotEmpty) {
       return false;
     }
     // no required parameters
@@ -2752,7 +2769,7 @@
     String constructorName = displayName;
     if (enclosingElement == null) {
       String message;
-      if (constructorName != null && !constructorName.isEmpty) {
+      if (constructorName != null && constructorName.isNotEmpty) {
         message =
             'Found constructor element named $constructorName with no enclosing element';
       } else {
@@ -2763,7 +2780,7 @@
     } else {
       name = enclosingElement.displayName;
     }
-    if (constructorName != null && !constructorName.isEmpty) {
+    if (constructorName != null && constructorName.isNotEmpty) {
       name = '$name.$constructorName';
     }
     appendToWithName(buffer, name);
@@ -4926,12 +4943,11 @@
 }
 
 /// A concrete implementation of an [ExtensionElement].
-class ExtensionElementImpl extends ElementImpl implements ExtensionElement {
+class ExtensionElementImpl extends ElementImpl
+    with TypeParameterizedElementMixin
+    implements ExtensionElement {
   /// The unlinked representation of the extension in the summary.
-  final /* UnlinkedExtension */ _unlinkedExtension;
-
-  /// A list containing all of the type parameters declared by this extension.
-  List<TypeParameterElement> _typeParameters;
+  final UnlinkedExtension _unlinkedExtension;
 
   /// The type being extended.
   DartType _extendedType;
@@ -4940,6 +4956,9 @@
   /// this extension.
   List<PropertyAccessorElement> _accessors;
 
+  /// A list containing all of the fields contained in this extension.
+  List<FieldElement> _fields;
+
   /// A list containing all of the methods contained in this extension.
   List<MethodElement> _methods;
 
@@ -4950,6 +4969,12 @@
       : _unlinkedExtension = null,
         super(name, nameOffset);
 
+  /// Initialize using the given linked information.
+  ExtensionElementImpl.forLinkedNode(CompilationUnitElementImpl enclosing,
+      Reference reference, AstNode linkedNode)
+      : _unlinkedExtension = null,
+        super.forLinkedNode(enclosing, reference, linkedNode);
+
   /// Initialize a newly created extension element to have the given [name].
   ExtensionElementImpl.forNode(Identifier name)
       : _unlinkedExtension = null,
@@ -4968,16 +4993,14 @@
 
     if (linkedNode != null) {
       if (linkedNode is ExtensionDeclaration) {
-        // TODO(brianwilkerson) Implement this.
-//        _createPropertiesAndAccessors();
-//        assert(_accessors != null);
-//        return _accessors;
+        _createPropertiesAndAccessors();
+        assert(_accessors != null);
+        return _accessors;
       } else {
         return _accessors = const [];
       }
     } else if (_unlinkedExtension != null) {
-      // TODO(brianwilkerson) Implement this.
-//      _resynthesizePropertyAccessors();
+      _resynthesizeFieldsAndPropertyAccessors();
     }
 
     return _accessors ??= const <PropertyAccessorElement>[];
@@ -4992,15 +5015,54 @@
   }
 
   @override
+  int get codeLength {
+    if (linkedNode != null) {
+      return linkedContext.getCodeLength(linkedNode);
+    }
+    if (_unlinkedExtension != null) {
+      return _unlinkedExtension.codeRange?.length;
+    }
+    return super.codeLength;
+  }
+
+  @override
+  int get codeOffset {
+    if (linkedNode != null) {
+      return linkedContext.getCodeOffset(linkedNode);
+    }
+    if (_unlinkedExtension != null) {
+      return _unlinkedExtension.codeRange?.offset;
+    }
+    return super.codeOffset;
+  }
+
+  @override
+  String get displayName => name;
+
+  @override
+  String get documentationComment {
+    if (linkedNode != null) {
+      var context = enclosingUnit.linkedContext;
+      var comment = context.getDocumentationComment(linkedNode);
+      return getCommentNodeRawText(comment);
+    }
+    if (_unlinkedExtension != null) {
+      return _unlinkedExtension.documentationComment?.text;
+    }
+    return super.documentationComment;
+  }
+
+  @override
+  TypeParameterizedElementMixin get enclosingTypeParameterContext => null;
+
+  @override
   DartType get extendedType {
     if (_extendedType != null) {
       return _extendedType;
     }
 
     if (linkedNode != null) {
-      // TODO(brianwilkerson) Implement this.
-//      var context = enclosingUnit.linkedContext;
-//      return _extendedType = context.getExtendedType(linkedNode)?.type;
+      return _extendedType = linkedContext.getExtendedType(linkedNode).type;
     } else if (_unlinkedExtension != null) {
       return _extendedType = enclosingUnit.resynthesizerContext
           .resolveTypeRef(this, _unlinkedExtension.extendedType);
@@ -5015,6 +5077,46 @@
   }
 
   @override
+  List<FieldElement> get fields {
+    if (_fields != null) {
+      return _fields;
+    }
+
+    if (linkedNode != null) {
+      if (linkedNode is ExtensionDeclaration) {
+        _createPropertiesAndAccessors();
+        assert(_fields != null);
+        return _fields;
+      } else {
+        return _fields = const [];
+      }
+    } else if (_unlinkedExtension != null) {
+      _resynthesizeFieldsAndPropertyAccessors();
+    }
+
+    return _fields ?? const <FieldElement>[];
+  }
+
+  void set fields(List<FieldElement> fields) {
+    _assertNotResynthesized(_unlinkedExtension);
+    for (FieldElement field in fields) {
+      (field as FieldElementImpl).enclosingElement = this;
+    }
+    _fields = fields;
+  }
+
+  @override
+  String get identifier {
+    if (linkedNode != null) {
+      return reference.name;
+    }
+    return super.identifier;
+  }
+
+  @override
+  bool get isSimplyBounded => true;
+
+  @override
   ElementKind get kind => ElementKind.EXTENSION;
 
   @override
@@ -5024,49 +5126,47 @@
     }
 
     if (linkedNode != null) {
-      // TODO(brianwilkerson) Implement this.
-//      var context = enclosingUnit.linkedContext;
-//      var containerRef = reference.getChild('@method');
-//      return _methods = context
-//          .getMethods(linkedNode)
-//          .where((node) => node.propertyKeyword == null)
-//          .map((node) {
-//        var name = node.name.name;
-//        var reference = containerRef.getChild(name);
-//        if (reference.hasElementFor(node)) {
-//          return reference.element as MethodElement;
-//        }
-//        return MethodElementImpl.forLinkedNode(this, reference, node);
-//      }).toList();
+      var context = enclosingUnit.linkedContext;
+      var containerRef = reference.getChild('@method');
+      return _methods = context
+          .getMethods(linkedNode)
+          .where((node) => node.propertyKeyword == null)
+          .map((node) {
+        var name = node.name.name;
+        var reference = containerRef.getChild(name);
+        if (reference.hasElementFor(node)) {
+          return reference.element as MethodElement;
+        }
+        return MethodElementImpl.forLinkedNode(this, reference, node);
+      }).toList();
     } else if (_unlinkedExtension != null) {
-      // TODO(brianwilkerson) Implement this.
-//      var unlinkedExecutables = _unlinkedExtension.executables;
-//
-//      var length = unlinkedExecutables.length;
-//      if (length == 0) {
-//        return _methods = const <MethodElement>[];
-//      }
-//
-//      var count = 0;
-//      for (var i = 0; i < length; i++) {
-//        var e = unlinkedExecutables[i];
-//        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
-//          count++;
-//        }
-//      }
-//      if (count == 0) {
-//        return _methods = const <MethodElement>[];
-//      }
-//
-//      var methods = new List<MethodElement>(count);
-//      var index = 0;
-//      for (var i = 0; i < length; i++) {
-//        var e = unlinkedExecutables[i];
-//        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
-//          methods[index++] = new MethodElementImpl.forSerialized(e, this);
-//        }
-//      }
-//      return _methods = methods;
+      var unlinkedExecutables = _unlinkedExtension.executables;
+
+      var length = unlinkedExecutables.length;
+      if (length == 0) {
+        return _methods = const <MethodElement>[];
+      }
+
+      var count = 0;
+      for (var i = 0; i < length; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
+          count++;
+        }
+      }
+      if (count == 0) {
+        return _methods = const <MethodElement>[];
+      }
+
+      var methods = new List<MethodElement>(count);
+      var index = 0;
+      for (var i = 0; i < length; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.functionOrMethod) {
+          methods[index++] = new MethodElementImpl.forSerialized(e, this);
+        }
+      }
+      return _methods = methods;
     }
     return _methods = const <MethodElement>[];
   }
@@ -5083,7 +5183,7 @@
   @override
   String get name {
     if (linkedNode != null) {
-      return reference.name;
+      return (linkedNode as ExtensionDeclaration).name?.name ?? '';
     }
     if (_unlinkedExtension != null) {
       return _unlinkedExtension.name;
@@ -5104,42 +5204,6 @@
     return offset;
   }
 
-  @override
-  List<TypeParameterElement> get typeParameters {
-    if (_typeParameters != null) {
-      return _typeParameters;
-    }
-
-    if (linkedNode != null) {
-      var typeParameters = linkedContext.getTypeParameters2(linkedNode);
-      if (typeParameters == null) {
-        return _typeParameters = const [];
-      }
-      var containerRef = reference.getChild('@typeParameter');
-      return _typeParameters =
-          typeParameters.typeParameters.map<TypeParameterElement>((node) {
-        var reference = containerRef.getChild(node.name.name);
-        if (reference.hasElementFor(node)) {
-          return reference.element as TypeParameterElement;
-        }
-        return TypeParameterElementImpl.forLinkedNode(this, reference, node);
-      }).toList();
-    } else if (_unlinkedExtension != null) {
-      List<UnlinkedTypeParam> unlinkedParams =
-          _unlinkedExtension?.typeParameters;
-      if (unlinkedParams != null) {
-        int numTypeParameters = unlinkedParams.length;
-        _typeParameters = new List<TypeParameterElement>(numTypeParameters);
-        for (int i = 0; i < numTypeParameters; i++) {
-          _typeParameters[i] = new TypeParameterElementImpl.forSerialized(
-              unlinkedParams[i], this);
-        }
-      }
-    }
-
-    return _typeParameters ?? const <TypeParameterElement>[];
-  }
-
   /// Set the type parameters defined by this extension to the given
   /// [typeParameters].
   void set typeParameters(List<TypeParameterElement> typeParameters) {
@@ -5147,15 +5211,45 @@
     for (TypeParameterElement typeParameter in typeParameters) {
       (typeParameter as TypeParameterElementImpl).enclosingElement = this;
     }
-    this._typeParameters = typeParameters;
+    this._typeParameterElements = typeParameters;
   }
 
   @override
+  List<UnlinkedTypeParam> get unlinkedTypeParams =>
+      _unlinkedExtension?.typeParameters;
+
+  @override
   T accept<T>(ElementVisitor<T> visitor) {
     return visitor.visitExtensionElement(this);
   }
 
   @override
+  void appendTo(StringBuffer buffer) {
+    buffer.write('extension ');
+    String name = displayName;
+    if (name == null) {
+      buffer.write("(unnamed)");
+    } else {
+      buffer.write(name);
+    }
+    int variableCount = typeParameters.length;
+    if (variableCount > 0) {
+      buffer.write("<");
+      for (int i = 0; i < variableCount; i++) {
+        if (i > 0) {
+          buffer.write(", ");
+        }
+        (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+      }
+      buffer.write(">");
+    }
+    if (extendedType != null && !extendedType.isObject) {
+      buffer.write(' on ');
+      buffer.write(extendedType.displayName);
+    }
+  }
+
+  @override
   PropertyAccessorElement getGetter(String getterName) {
     int length = accessors.length;
     for (int i = 0; i < length; i++) {
@@ -5184,6 +5278,192 @@
     return AbstractClassElementImpl.getSetterFromAccessors(
         setterName, accessors);
   }
+
+  @override
+  void visitChildren(ElementVisitor visitor) {
+    super.visitChildren(visitor);
+    safelyVisitChildren(accessors, visitor);
+    safelyVisitChildren(fields, visitor);
+    safelyVisitChildren(methods, visitor);
+    safelyVisitChildren(typeParameters, visitor);
+  }
+
+  /// Create the accessors and fields when [linkedNode] is not `null`.
+  void _createPropertiesAndAccessors() {
+    assert(_accessors == null);
+    assert(_fields == null);
+
+    var context = enclosingUnit.linkedContext;
+    var accessorList = <PropertyAccessorElement>[];
+    var fieldList = <FieldElement>[];
+
+    var fields = context.getFields(linkedNode);
+    for (var field in fields) {
+      var name = field.name.name;
+      var fieldElement = FieldElementImpl.forLinkedNodeFactory(
+        this,
+        reference.getChild('@field').getChild(name),
+        field,
+      );
+      fieldList.add(fieldElement);
+
+      accessorList.add(fieldElement.getter);
+      if (fieldElement.setter != null) {
+        accessorList.add(fieldElement.setter);
+      }
+    }
+
+    var methods = context.getMethods(linkedNode);
+    for (var method in methods) {
+      var isGetter = method.isGetter;
+      var isSetter = method.isSetter;
+      if (!isGetter && !isSetter) continue;
+
+      var name = method.name.name;
+      var containerRef = isGetter
+          ? reference.getChild('@getter')
+          : reference.getChild('@setter');
+
+      var accessorElement = PropertyAccessorElementImpl.forLinkedNode(
+        this,
+        containerRef.getChild(name),
+        method,
+      );
+      accessorList.add(accessorElement);
+
+      var fieldRef = reference.getChild('@field').getChild(name);
+      FieldElementImpl field = fieldRef.element;
+      if (field == null) {
+        field = new FieldElementImpl(name, -1);
+        fieldRef.element = field;
+        field.enclosingElement = this;
+        field.isSynthetic = true;
+        field.isFinal = isGetter;
+        field.isStatic = accessorElement.isStatic;
+        fieldList.add(field);
+      } else {
+        // TODO(brianwilkerson) Shouldn't this depend on whether there is a
+        //  setter?
+        field.isFinal = false;
+      }
+
+      accessorElement.variable = field;
+      if (isGetter) {
+        field.getter = accessorElement;
+      } else {
+        field.setter = accessorElement;
+      }
+    }
+
+    _accessors = accessorList;
+    _fields = fieldList;
+  }
+
+  /// Resynthesize explicit fields and property accessors and fill [_fields] and
+  /// [_accessors] with explicit and implicit elements.
+  void _resynthesizeFieldsAndPropertyAccessors() {
+    assert(_fields == null);
+    assert(_accessors == null);
+
+    var unlinkedFields = _unlinkedExtension.fields;
+    var unlinkedExecutables = _unlinkedExtension.executables;
+
+    // Build explicit fields and implicit property accessors.
+    List<FieldElement> explicitFields;
+    List<PropertyAccessorElement> implicitAccessors;
+    var unlinkedFieldsLength = unlinkedFields.length;
+    if (unlinkedFieldsLength != 0) {
+      explicitFields = new List<FieldElement>(unlinkedFieldsLength);
+      implicitAccessors = <PropertyAccessorElement>[];
+      for (var i = 0; i < unlinkedFieldsLength; i++) {
+        var v = unlinkedFields[i];
+        FieldElementImpl field =
+            new FieldElementImpl.forSerializedFactory(v, this);
+        explicitFields[i] = field;
+        implicitAccessors.add(
+            new PropertyAccessorElementImpl_ImplicitGetter(field)
+              ..enclosingElement = this);
+        if (!field.isConst && !field.isFinal) {
+          implicitAccessors.add(
+              new PropertyAccessorElementImpl_ImplicitSetter(field)
+                ..enclosingElement = this);
+        }
+      }
+    } else {
+      explicitFields = const <FieldElement>[];
+      implicitAccessors = const <PropertyAccessorElement>[];
+    }
+
+    var unlinkedExecutablesLength = unlinkedExecutables.length;
+    var getterSetterCount = 0;
+    for (var i = 0; i < unlinkedExecutablesLength; i++) {
+      var e = unlinkedExecutables[i];
+      if (e.kind == UnlinkedExecutableKind.getter ||
+          e.kind == UnlinkedExecutableKind.setter) {
+        getterSetterCount++;
+      }
+    }
+
+    // Build explicit property accessors and implicit fields.
+    List<PropertyAccessorElement> explicitAccessors;
+    Map<String, FieldElementImpl> implicitFields;
+    if (getterSetterCount != 0) {
+      explicitAccessors = new List<PropertyAccessorElement>(getterSetterCount);
+      implicitFields = <String, FieldElementImpl>{};
+      var index = 0;
+      for (var i = 0; i < unlinkedExecutablesLength; i++) {
+        var e = unlinkedExecutables[i];
+        if (e.kind == UnlinkedExecutableKind.getter ||
+            e.kind == UnlinkedExecutableKind.setter) {
+          PropertyAccessorElementImpl accessor =
+              new PropertyAccessorElementImpl.forSerialized(e, this);
+          explicitAccessors[index++] = accessor;
+          // Create or update the implicit field.
+          String fieldName = accessor.displayName;
+          FieldElementImpl field = implicitFields[fieldName];
+          if (field == null) {
+            field = new FieldElementImpl(fieldName, -1);
+            implicitFields[fieldName] = field;
+            field.enclosingElement = this;
+            field.isSynthetic = true;
+            field.isFinal = e.kind == UnlinkedExecutableKind.getter;
+            field.isStatic = e.isStatic;
+          } else {
+            field.isFinal = false;
+          }
+          accessor.variable = field;
+          if (e.kind == UnlinkedExecutableKind.getter) {
+            field.getter = accessor;
+          } else {
+            field.setter = accessor;
+          }
+        }
+      }
+    } else {
+      explicitAccessors = const <PropertyAccessorElement>[];
+      implicitFields = const <String, FieldElementImpl>{};
+    }
+
+    // Combine explicit and implicit fields and property accessors.
+    if (implicitFields.isEmpty) {
+      _fields = explicitFields;
+    } else if (explicitFields.isEmpty) {
+      _fields = implicitFields.values.toList(growable: false);
+    } else {
+      _fields = <FieldElement>[]
+        ..addAll(explicitFields)
+        ..addAll(implicitFields.values);
+    }
+    if (explicitAccessors.isEmpty) {
+      _accessors = implicitAccessors;
+    } else if (implicitAccessors.isEmpty) {
+      _accessors = explicitAccessors;
+    } else {
+      _accessors = <PropertyAccessorElement>[]
+        ..addAll(explicitAccessors)
+        ..addAll(implicitAccessors);
+    }
+  }
 }
 
 /// A concrete implementation of a [FieldElement].
@@ -5214,7 +5494,7 @@
   }
 
   factory FieldElementImpl.forLinkedNodeFactory(
-      ClassElementImpl enclosing, Reference reference, AstNode linkedNode) {
+      ElementImpl enclosing, Reference reference, AstNode linkedNode) {
     var context = enclosing.enclosingUnit.linkedContext;
     if (context.shouldBeConstFieldElement(linkedNode)) {
       return ConstFieldElementImpl.forLinkedNode(
@@ -5236,24 +5516,22 @@
 
   /// Initialize using the given serialized information.
   factory FieldElementImpl.forSerializedFactory(
-      UnlinkedVariable unlinkedVariable, ClassElementImpl enclosingClass) {
+      UnlinkedVariable unlinkedVariable, ElementImpl enclosingElement) {
     if (unlinkedVariable.initializer?.bodyExpr != null &&
         (unlinkedVariable.isConst ||
             unlinkedVariable.isFinal &&
                 !unlinkedVariable.isStatic &&
-                enclosingClass._hasConstConstructor)) {
+                enclosingElement is ClassElementImpl &&
+                enclosingElement._hasConstConstructor)) {
       return new ConstFieldElementImpl.forSerialized(
-          unlinkedVariable, enclosingClass);
+          unlinkedVariable, enclosingElement);
     } else {
       return new FieldElementImpl.forSerialized(
-          unlinkedVariable, enclosingClass);
+          unlinkedVariable, enclosingElement);
     }
   }
 
   @override
-  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
-
-  @override
   bool get isCovariant {
     if (linkedNode != null) {
       return linkedContext.isExplicitlyCovariant(linkedNode);
@@ -5274,7 +5552,9 @@
 
   @override
   bool get isEnumConstant =>
-      enclosingElement != null && enclosingElement.isEnum && !isSynthetic;
+      enclosingElement is ClassElement &&
+      (enclosingElement as ClassElement).isEnum &&
+      !isSynthetic;
 
   @override
   bool get isStatic {
@@ -6396,6 +6676,10 @@
 
   @override
   int get prefixOffset {
+    if (linkedNode != null) {
+      ImportDirective node = linkedNode;
+      return node.prefix?.offset ?? -1;
+    }
     if (_unlinkedImport != null) {
       return _unlinkedImport.prefixOffset;
     }
@@ -7499,7 +7783,7 @@
   /// given [offset].
   MethodElementImpl(String name, int offset) : super(name, offset);
 
-  MethodElementImpl.forLinkedNode(ClassElementImpl enclosingClass,
+  MethodElementImpl.forLinkedNode(TypeParameterizedElementMixin enclosingClass,
       Reference reference, MethodDeclaration linkedNode)
       : super.forLinkedNode(enclosingClass, reference, linkedNode);
 
@@ -7507,8 +7791,8 @@
   MethodElementImpl.forNode(Identifier name) : super.forNode(name);
 
   /// Initialize using the given serialized information.
-  MethodElementImpl.forSerialized(
-      UnlinkedExecutable serializedExecutable, ClassElementImpl enclosingClass)
+  MethodElementImpl.forSerialized(UnlinkedExecutable serializedExecutable,
+      TypeParameterizedElementMixin enclosingClass)
       : super.forSerialized(serializedExecutable, enclosingClass);
 
   @override
@@ -7521,11 +7805,8 @@
   }
 
   @override
-  ClassElement get enclosingElement => super.enclosingElement as ClassElement;
-
-  @override
   TypeParameterizedElementMixin get enclosingTypeParameterContext =>
-      super.enclosingElement as ClassElementImpl;
+      super.enclosingElement as TypeParameterizedElementMixin;
 
   /// Set whether this class is abstract.
   void set isAbstract(bool isAbstract) {
@@ -8569,7 +8850,9 @@
     if (_initializer == null) {
       if (linkedNode != null) {
         if (linkedContext.hasDefaultValue(linkedNode)) {
-          _initializer = new FunctionElementImpl('', -1)..isSynthetic = true;
+          _initializer = FunctionElementImpl('', -1)
+            ..enclosingElement = this
+            ..isSynthetic = true;
         }
       }
       if (unlinkedParam != null) {
@@ -8935,7 +9218,7 @@
         NormalFormalParameter parameterNode = node.parameter;
         var name = parameterNode.identifier?.name ?? '';
         var reference = containerRef.getChild(name);
-        reference.node2 = node;
+        reference.node = node;
         if (parameterNode is FieldFormalParameter) {
           return DefaultFieldFormalParameterElementImpl.forLinkedNode(
             enclosing,
@@ -9596,6 +9879,9 @@
 
   @override
   int get end {
+    if (linkedNode != null) {
+      return linkedContext.getCombinatorEnd(linkedNode);
+    }
     if (_unlinkedCombinator != null) {
       return _unlinkedCombinator.end;
     }
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
index 8bdc5c7..b27a187 100644
--- a/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager2.dart
@@ -4,6 +4,9 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart'
+    show InheritanceManagerBase, InheritanceManager3;
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/type_system.dart';
 import 'package:analyzer/src/generated/utilities_general.dart';
 
@@ -29,7 +32,7 @@
 }
 
 /// Manages knowledge about interface types and their members.
-class InheritanceManager2 {
+class InheritanceManager2 extends InheritanceManagerBase {
   static final _noSuchMethodName = Name(null, 'noSuchMethod');
 
   final TypeSystem _typeSystem;
@@ -43,6 +46,10 @@
 
   InheritanceManager2(this._typeSystem);
 
+  @override
+  InheritanceManager3 get asInheritanceManager3 =>
+      InheritanceManager3(_typeSystem);
+
   /// Return the most specific signature of the member with the given [name]
   /// that the [type] inherits from the mixins, superclasses, or interfaces;
   /// or `null` if no member is inherited because the member is not declared
diff --git a/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
new file mode 100644
index 0000000..1c9a60d
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/element/inheritance_manager3.dart
@@ -0,0 +1,544 @@
+// 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/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+import 'package:analyzer/src/generated/utilities_general.dart';
+
+/// Description of a failure to find a valid override from superinterfaces.
+class Conflict {
+  /// The name of an instance member for which we failed to find a valid
+  /// override.
+  final Name name;
+
+  /// The list of candidates for a valid override for a member [name].  It has
+  /// at least two items, because otherwise the only candidate is always valid.
+  final List<ExecutableElement> candidates;
+
+  /// The getter that conflicts with the [method], or `null`, if the conflict
+  /// is inconsistent inheritance.
+  final ExecutableElement getter;
+
+  /// The method tha conflicts with the [getter], or `null`, if the conflict
+  /// is inconsistent inheritance.
+  final ExecutableElement method;
+
+  Conflict(this.name, this.candidates, [this.getter, this.method]);
+}
+
+/// Manages knowledge about interface types and their members.
+class InheritanceManager3 extends InheritanceManagerBase {
+  static final _noSuchMethodName = Name(null, 'noSuchMethod');
+
+  final TypeSystem _typeSystem;
+
+  /// Cached instance interfaces for [InterfaceType].
+  final Map<InterfaceType, Interface> _interfaces = {};
+
+  /// The set of classes that are currently being processed, used to detect
+  /// self-referencing cycles.
+  final Set<ClassElement> _processingClasses = new Set<ClassElement>();
+
+  InheritanceManager3(this._typeSystem);
+
+  @override
+  InheritanceManager3 get asInheritanceManager3 => this;
+
+  /// Return the most specific signature of the member with the given [name]
+  /// that the [type] inherits from the mixins, superclasses, or interfaces;
+  /// or `null` if no member is inherited because the member is not declared
+  /// at all, or because there is no the most specific signature.
+  ///
+  /// This is equivalent to `getInheritedMap(type)[name]`.
+  ExecutableElement getInherited(InterfaceType type, Name name) {
+    return getInheritedMap(type)[name];
+  }
+
+  /// Return signatures of all concrete members that the given [type] inherits
+  /// from the superclasses and mixins.
+  Map<Name, ExecutableElement> getInheritedConcreteMap(InterfaceType type) {
+    var interface = getInterface(type);
+    return interface._superImplemented.last;
+  }
+
+  /// Return the mapping from names to most specific signatures of members
+  /// inherited from the super-interfaces (superclasses, mixins, and
+  /// interfaces).  If there is no most specific signature for a name, the
+  /// corresponding name will not be included.
+  Map<Name, ExecutableElement> getInheritedMap(InterfaceType type) {
+    var interface = getInterface(type);
+    if (interface._inheritedMap == null) {
+      interface._inheritedMap = {};
+      _findMostSpecificFromNamedCandidates(
+        interface._inheritedMap,
+        interface._overridden,
+      );
+    }
+    return interface._inheritedMap;
+  }
+
+  /// Return the interface of the given [type].  It might include private
+  /// members, not necessary accessible in all libraries.
+  Interface getInterface(InterfaceType type) {
+    if (type == null) {
+      return Interface._empty;
+    }
+
+    var result = _interfaces[type];
+    if (result != null) {
+      return result;
+    }
+    _interfaces[type] = Interface._empty;
+
+    var classElement = type.element;
+    if (!_processingClasses.add(classElement)) {
+      return Interface._empty;
+    }
+
+    Map<Name, List<ExecutableElement>> namedCandidates = {};
+    List<Map<Name, ExecutableElement>> superImplemented = [];
+    Map<Name, ExecutableElement> declared;
+    Interface superInterface;
+    Map<Name, ExecutableElement> implemented;
+    Map<Name, ExecutableElement> implementedForMixing;
+    try {
+      // If a class declaration has a member declaration, the signature of that
+      // member declaration becomes the signature in the interface.
+      declared = _getTypeMembers(type);
+
+      for (var interface in type.interfaces) {
+        var interfaceObj = getInterface(interface);
+        _addCandidates(namedCandidates, interfaceObj);
+      }
+
+      if (classElement.isMixin) {
+        var superClassCandidates = <Name, List<ExecutableElement>>{};
+        for (var constraint in type.superclassConstraints) {
+          var interfaceObj = getInterface(constraint);
+          _addCandidates(superClassCandidates, interfaceObj);
+          _addCandidates(namedCandidates, interfaceObj);
+        }
+
+        implemented = {};
+
+        // `mixin M on S1, S2 {}` can call using `super` any instance member
+        // from its superclass constraints, whether it is abstract or concrete.
+        var superClass = <Name, ExecutableElement>{};
+        _findMostSpecificFromNamedCandidates(superClass, superClassCandidates);
+        superImplemented.add(superClass);
+      } else {
+        if (type.superclass != null) {
+          superInterface = getInterface(type.superclass);
+          _addCandidates(namedCandidates, superInterface);
+
+          implemented = superInterface.implemented;
+          superImplemented.add(implemented);
+        } else {
+          implemented = {};
+        }
+
+        implementedForMixing = {};
+        for (var mixin in type.mixins) {
+          var interfaceObj = getInterface(mixin);
+          _addCandidates(namedCandidates, interfaceObj);
+
+          implemented = <Name, ExecutableElement>{}
+            ..addAll(implemented)
+            ..addAll(interfaceObj._implementedForMixing);
+          superImplemented.add(implemented);
+          implementedForMixing.addAll(interfaceObj._implementedForMixing);
+        }
+      }
+    } finally {
+      _processingClasses.remove(classElement);
+    }
+
+    var thisImplemented = <Name, ExecutableElement>{};
+    _addImplemented(thisImplemented, type);
+
+    if (classElement.isMixin) {
+      implementedForMixing = thisImplemented;
+    } else {
+      implementedForMixing.addAll(thisImplemented);
+    }
+
+    implemented = <Name, ExecutableElement>{}..addAll(implemented);
+    _addImplemented(implemented, type);
+
+    // If a class declaration does not have a member declaration with a
+    // particular name, but some super-interfaces do have a member with that
+    // name, it's a compile-time error if there is no signature among the
+    // super-interfaces that is a valid override of all the other
+    // super-interface signatures with the same name. That "most specific"
+    // signature becomes the signature of the class's interface.
+    Map<Name, ExecutableElement> map = new Map.of(declared);
+    List<Conflict> conflicts = _findMostSpecificFromNamedCandidates(
+      map,
+      namedCandidates,
+    );
+
+    var noSuchMethodForwarders = Set<Name>();
+    if (classElement.isAbstract) {
+      if (superInterface != null) {
+        noSuchMethodForwarders = superInterface._noSuchMethodForwarders;
+      }
+    } else {
+      var noSuchMethod = implemented[_noSuchMethodName];
+      if (noSuchMethod != null && !_isDeclaredInObject(noSuchMethod)) {
+        var superForwarders = superInterface?._noSuchMethodForwarders;
+        for (var name in map.keys) {
+          if (!implemented.containsKey(name) ||
+              superForwarders != null && superForwarders.contains(name)) {
+            implemented[name] = map[name];
+            noSuchMethodForwarders.add(name);
+          }
+        }
+      }
+    }
+
+    var interface = new Interface._(
+      map,
+      declared,
+      implemented,
+      noSuchMethodForwarders,
+      implementedForMixing,
+      namedCandidates,
+      superImplemented,
+      conflicts ?? const [],
+    );
+    _interfaces[type] = interface;
+    return interface;
+  }
+
+  /// Return the member with the given [name].
+  ///
+  /// If [concrete] is `true`, the the concrete implementation is returned,
+  /// from the given [type], or its superclass.
+  ///
+  /// If [forSuper] is `true`, then [concrete] is implied, and only concrete
+  /// members from the superclass are considered.
+  ///
+  /// If [forMixinIndex] is specified, only the nominal superclass, and the
+  /// given number of mixins after it are considered.  For example for `1` in
+  /// `class C extends S with M1, M2, M3`, only `S` and `M1` are considered.
+  ExecutableElement getMember(
+    InterfaceType type,
+    Name name, {
+    bool concrete: false,
+    int forMixinIndex: -1,
+    bool forSuper: false,
+  }) {
+    var interface = getInterface(type);
+    if (forSuper) {
+      var superImplemented = interface._superImplemented;
+      if (forMixinIndex >= 0) {
+        return superImplemented[forMixinIndex][name];
+      }
+      return superImplemented.last[name];
+    }
+    if (concrete) {
+      return interface.implemented[name];
+    }
+    return interface.map[name];
+  }
+
+  /// Return all members of mixins, superclasses, and interfaces that a member
+  /// with the given [name], defined in the [type], would override; or `null`
+  /// if no members would be overridden.
+  List<ExecutableElement> getOverridden(InterfaceType type, Name name) {
+    var interface = getInterface(type);
+    return interface._overridden[name];
+  }
+
+  void _addCandidate(Map<Name, List<ExecutableElement>> namedCandidates,
+      Name name, ExecutableElement candidate) {
+    var candidates = namedCandidates[name];
+    if (candidates == null) {
+      candidates = <ExecutableElement>[];
+      namedCandidates[name] = candidates;
+    }
+
+    candidates.add(candidate);
+  }
+
+  void _addCandidates(
+      Map<Name, List<ExecutableElement>> namedCandidates, Interface interface) {
+    var map = interface.map;
+    for (var name in map.keys) {
+      var candidate = map[name];
+      _addCandidate(namedCandidates, name, candidate);
+    }
+  }
+
+  void _addImplemented(
+      Map<Name, ExecutableElement> implemented, InterfaceType type) {
+    var libraryUri = type.element.librarySource.uri;
+
+    void addMember(ExecutableElement member) {
+      if (!member.isAbstract && !member.isStatic) {
+        var name = new Name(libraryUri, member.name);
+        implemented[name] = member;
+      }
+    }
+
+    void addMembers(InterfaceType type) {
+      type.methods.forEach(addMember);
+      type.accessors.forEach(addMember);
+    }
+
+    addMembers(type);
+  }
+
+  /// Check that all [candidates] for the given [name] have the same kind, all
+  /// getters, all methods, or all setter.  If a conflict found, return the
+  /// new [Conflict] instance that describes it.
+  Conflict _checkForGetterMethodConflict(
+      Name name, List<ExecutableElement> candidates) {
+    assert(candidates.length > 1);
+
+    bool allGetters = true;
+    bool allMethods = true;
+    bool allSetters = true;
+    for (var candidate in candidates) {
+      var kind = candidate.kind;
+      if (kind != ElementKind.GETTER) {
+        allGetters = false;
+      }
+      if (kind != ElementKind.METHOD) {
+        allMethods = false;
+      }
+      if (kind != ElementKind.SETTER) {
+        allSetters = false;
+      }
+    }
+
+    if (allGetters || allMethods || allSetters) {
+      return null;
+    }
+
+    ExecutableElement getter;
+    ExecutableElement method;
+    for (var candidate in candidates) {
+      var kind = candidate.kind;
+      if (kind == ElementKind.GETTER) {
+        getter ??= candidate;
+      }
+      if (kind == ElementKind.METHOD) {
+        method ??= candidate;
+      }
+    }
+    return new Conflict(name, candidates, getter, method);
+  }
+
+  /// The given [namedCandidates] maps names to candidates from direct
+  /// superinterfaces.  Find the most specific signature, and put it into the
+  /// [map], if there is no one yet (from the class itself).  If there is no
+  /// such single most specific signature (i.e. no valid override), then add a
+  /// new conflict description.
+  List<Conflict> _findMostSpecificFromNamedCandidates(
+      Map<Name, ExecutableElement> map,
+      Map<Name, List<ExecutableElement>> namedCandidates) {
+    List<Conflict> conflicts = null;
+
+    for (var name in namedCandidates.keys) {
+      if (map.containsKey(name)) {
+        continue;
+      }
+
+      var candidates = namedCandidates[name];
+
+      // If just one candidate, it is always valid.
+      if (candidates.length == 1) {
+        map[name] = candidates[0];
+        continue;
+      }
+
+      // Check for a getter/method conflict.
+      var conflict = _checkForGetterMethodConflict(name, candidates);
+      if (conflict != null) {
+        conflicts ??= <Conflict>[];
+        conflicts.add(conflict);
+      }
+
+      // Candidates are recorded in forward order, so
+      // `class X extends S with M1, M2 implements I1, I2 {}` will record
+      // candidates from [I1, I2, S, M1, M2]. But during method lookup
+      // candidates should be considered in backward order, i.e. from `M2`,
+      // then from `M1`, then from `S`.
+      ExecutableElement validOverride;
+      for (var i = candidates.length - 1; i >= 0; i--) {
+        validOverride = candidates[i];
+        for (var j = 0; j < candidates.length; j++) {
+          var candidate = candidates[j];
+          if (!_typeSystem.isOverrideSubtypeOf(
+              validOverride.type, candidate.type)) {
+            validOverride = null;
+            break;
+          }
+        }
+        if (validOverride != null) {
+          break;
+        }
+      }
+
+      if (validOverride != null) {
+        map[name] = validOverride;
+      } else {
+        conflicts ??= <Conflict>[];
+        conflicts.add(new Conflict(name, candidates));
+      }
+    }
+
+    return conflicts;
+  }
+
+  Map<Name, ExecutableElement> _getTypeMembers(InterfaceType type) {
+    var declared = <Name, ExecutableElement>{};
+    var libraryUri = type.element.librarySource.uri;
+
+    var methods = type.methods;
+    for (var i = 0; i < methods.length; i++) {
+      var method = methods[i];
+      if (!method.isStatic) {
+        var name = new Name(libraryUri, method.name);
+        declared[name] = method;
+      }
+    }
+
+    var accessors = type.accessors;
+    for (var i = 0; i < accessors.length; i++) {
+      var accessor = accessors[i];
+      if (!accessor.isStatic) {
+        var name = new Name(libraryUri, accessor.name);
+        declared[name] = accessor;
+      }
+    }
+
+    return declared;
+  }
+
+  static bool _isDeclaredInObject(ExecutableElement element) {
+    var enclosing = element.enclosingElement;
+    return enclosing is ClassElement &&
+        enclosing.supertype == null &&
+        !enclosing.isMixin;
+  }
+}
+
+/// A temporary bridge between the old and the new versions of inheritance
+/// managers. Clients may not reference, extend, implement, or mix-in this
+/// class. It will be removed in the next major version of analyser, together
+/// with "InheritanceManager2".
+abstract class InheritanceManagerBase {
+  InheritanceManager3 get asInheritanceManager3;
+}
+
+/// The instance interface of an [InterfaceType].
+class Interface {
+  static final _empty = Interface._(
+    const {},
+    const {},
+    const {},
+    Set<Name>(),
+    const {},
+    const {},
+    const [{}],
+    const [],
+  );
+
+  /// The map of names to their signature in the interface.
+  final Map<Name, ExecutableElement> map;
+
+  /// The map of declared names to their signatures.
+  final Map<Name, ExecutableElement> declared;
+
+  /// The map of names to their concrete implementations.
+  final Map<Name, ExecutableElement> implemented;
+
+  /// The set of names that are `noSuchMethod` forwarders in [implemented].
+  final Set<Name> _noSuchMethodForwarders;
+
+  /// The map of names to their concrete implementations that can be mixed
+  /// when this type is used as a mixin.
+  final Map<Name, ExecutableElement> _implementedForMixing;
+
+  /// The map of names to their signatures from the mixins, superclasses,
+  /// or interfaces.
+  final Map<Name, List<ExecutableElement>> _overridden;
+
+  /// Each item of this list maps names to their concrete implementations.
+  /// The first item of the list is the nominal superclass, next the nominal
+  /// superclass plus the first mixin, etc. So, for the class like
+  /// `class C extends S with M1, M2`, we get `[S, S&M1, S&M1&M2]`.
+  final List<Map<Name, ExecutableElement>> _superImplemented;
+
+  /// The list of conflicts between superinterfaces - the nominal superclass,
+  /// mixins, and interfaces.  Does not include conflicts with the declared
+  /// members of the class.
+  final List<Conflict> conflicts;
+
+  /// The map of names to the most specific signatures from the mixins,
+  /// superclasses, or interfaces.
+  Map<Name, ExecutableElement> _inheritedMap;
+
+  Interface._(
+    this.map,
+    this.declared,
+    this.implemented,
+    this._noSuchMethodForwarders,
+    this._implementedForMixing,
+    this._overridden,
+    this._superImplemented,
+    this.conflicts,
+  );
+
+  /// Return `true` if the [name] is implemented in the supertype.
+  bool isSuperImplemented(Name name) {
+    return _superImplemented.last.containsKey(name);
+  }
+}
+
+/// A public name, or a private name qualified by a library URI.
+class Name {
+  /// If the name is private, the URI of the defining library.
+  /// Otherwise, it is `null`.
+  final Uri libraryUri;
+
+  /// The name of this name object.
+  /// If the name starts with `_`, then the name is private.
+  /// Names of setters end with `=`.
+  final String name;
+
+  /// Precomputed
+  final bool isPublic;
+
+  /// The cached, pre-computed hash code.
+  final int hashCode;
+
+  factory Name(Uri libraryUri, String name) {
+    if (name.startsWith('_')) {
+      var hashCode = JenkinsSmiHash.hash2(libraryUri.hashCode, name.hashCode);
+      return new Name._internal(libraryUri, name, false, hashCode);
+    } else {
+      return new Name._internal(null, name, true, name.hashCode);
+    }
+  }
+
+  Name._internal(this.libraryUri, this.name, this.isPublic, this.hashCode);
+
+  @override
+  bool operator ==(other) {
+    return other is Name &&
+        name == other.name &&
+        libraryUri == other.libraryUri;
+  }
+
+  bool isAccessibleFor(Uri libraryUri) {
+    return isPublic || this.libraryUri == libraryUri;
+  }
+
+  @override
+  String toString() => libraryUri != null ? '$libraryUri::$name' : name;
+}
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index f818145..2bbc114 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.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';
@@ -20,22 +21,18 @@
  */
 class ConstructorMember extends ExecutableMember implements ConstructorElement {
   /**
-   * Initialize a newly created element to represent a constructor, based on the
-   * [baseElement], defined by the [definingType]. If [type] is passed, it
-   * represents the full type of the member, and will take precedence over
-   * the [definingType].
+   * Initialize a newly created element to represent a constructor, based on
+   * the [baseElement], and applied [substitution].
    */
-  ConstructorMember(ConstructorElement baseElement, InterfaceType definingType,
-      [FunctionType type])
-      : super(baseElement, definingType, type);
+  ConstructorMember(
+    ConstructorElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   ConstructorElement get baseElement => super.baseElement as ConstructorElement;
 
   @override
-  InterfaceType get definingType => super.definingType as InterfaceType;
-
-  @override
   ClassElement get enclosingElement => baseElement.enclosingElement;
 
   @override
@@ -57,8 +54,10 @@
   int get periodOffset => baseElement.periodOffset;
 
   @override
-  ConstructorElement get redirectedConstructor =>
-      from(baseElement.redirectedConstructor, definingType);
+  ConstructorElement get redirectedConstructor {
+    var definingType = _substitution.substituteType(enclosingElement.type);
+    return from(baseElement.redirectedConstructor, definingType);
+  }
 
   @override
   T accept<T>(ElementVisitor<T> visitor) =>
@@ -74,14 +73,14 @@
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
-    StringBuffer buffer = new StringBuffer();
+    StringBuffer buffer = StringBuffer();
     if (type != null) {
       buffer.write(type.returnType);
       buffer.write(' ');
     }
     buffer.write(baseElement.enclosingElement.displayName);
     String name = displayName;
-    if (name != null && !name.isEmpty) {
+    if (name != null && name.isNotEmpty) {
       buffer.write('.');
       buffer.write(name);
     }
@@ -106,7 +105,7 @@
    */
   static ConstructorElement from(
       ConstructorElement constructor, InterfaceType definingType) {
-    if (constructor == null || definingType.typeArguments.length == 0) {
+    if (constructor == null || definingType.typeArguments.isEmpty) {
       return constructor;
     }
     FunctionType baseType = constructor.type;
@@ -114,11 +113,10 @@
       // TODO(brianwilkerson) We need to understand when this can happen.
       return constructor;
     }
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType =
-        baseType.substitute2(argumentTypes, parameterTypes);
-    return new ConstructorMember(constructor, definingType, substitutedType);
+    return ConstructorMember(
+      constructor,
+      Substitution.fromInterfaceType(definingType),
+    );
   }
 }
 
@@ -131,14 +129,13 @@
 
   /**
    * Initialize a newly created element to represent a callable element (like a
-   * method or function or property), based on the [baseElement], defined by the
-   * [definingType]. If [type] is passed, it represents the full type of the
-   * member, and will take precedence over the [definingType].
+   * method or function or property), based on the [baseElement], and applied
+   * [substitution].
    */
-  ExecutableMember(ExecutableElement baseElement, InterfaceType definingType,
-      [FunctionType type])
-      : _type = type,
-        super(baseElement, definingType);
+  ExecutableMember(
+    ExecutableElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   ExecutableElement get baseElement => super.baseElement as ExecutableElement;
@@ -171,19 +168,32 @@
   bool get isSynchronous => baseElement.isSynchronous;
 
   @override
-  List<ParameterElement> get parameters => type.parameters;
+  List<ParameterElement> get parameters {
+    return baseElement.parameters.map((p) {
+      if (p is FieldFormalParameterElement) {
+        return FieldFormalParameterMember(p, _substitution);
+      }
+      return ParameterMember(p, _substitution);
+    }).toList();
+  }
 
   @override
   DartType get returnType => type.returnType;
 
   @override
   FunctionType get type {
-    return _type ??= baseElement.type.substitute2(definingType.typeArguments,
-        TypeParameterTypeImpl.getTypes(definingType.typeParameters));
+    if (_type != null) return _type;
+
+    return _type = _substitution.substituteType(baseElement.type);
   }
 
   @override
-  List<TypeParameterElement> get typeParameters => baseElement.typeParameters;
+  List<TypeParameterElement> get typeParameters {
+    return TypeParameterMember.from2(
+      baseElement.typeParameters,
+      _substitution,
+    );
+  }
 
   @override
   void visitChildren(ElementVisitor visitor) {
@@ -192,6 +202,45 @@
     super.visitChildren(visitor);
     safelyVisitChildren(parameters, visitor);
   }
+
+  static ExecutableElement from2(
+    ExecutableElement element,
+    MapSubstitution substitution,
+  ) {
+    var combined = substitution;
+    if (element is ExecutableMember) {
+      ExecutableMember member = element;
+      element = member.baseElement;
+      var map = <TypeParameterElement, DartType>{};
+      map.addAll(member._substitution.map);
+      map.addAll(substitution.map);
+      combined = Substitution.fromMap(map);
+    }
+
+    if (element is ConstructorElement) {
+      return ConstructorMember(element, combined);
+    } else if (element is MethodElement) {
+      return MethodMember(element, combined);
+    } else if (element is PropertyAccessorElement) {
+      return PropertyAccessorMember(element, combined);
+    } else {
+      throw UnimplementedError('(${element.runtimeType}) $element');
+    }
+  }
+
+  static ExecutableElement from3(
+    ExecutableElement element,
+    List<TypeParameterElement> typeParameters,
+    List<DartType> typeArguments,
+  ) {
+    if (typeParameters.isEmpty) {
+      return element;
+    }
+    return from2(
+      element,
+      Substitution.fromPairs(typeParameters, typeArguments),
+    );
+  }
 }
 
 /**
@@ -202,22 +251,17 @@
     implements FieldFormalParameterElement {
   /**
    * Initialize a newly created element to represent a field formal parameter,
-   * based on the [baseElement], defined by the [definingType]. If [type]
-   * is passed it will be used as the substituted type for this member.
+   * based on the [baseElement], with applied [substitution].
    */
   FieldFormalParameterMember(
-      FieldFormalParameterElement baseElement, ParameterizedType definingType,
-      [DartType type])
-      : super(baseElement, definingType, type);
+    FieldFormalParameterElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   FieldElement get field {
-    FieldElement field = (baseElement as FieldFormalParameterElement).field;
-    if (field is FieldElement) {
-      return FieldMember.from(
-          field, substituteFor(field.enclosingElement.type));
-    }
-    return field;
+    var field = (baseElement as FieldFormalParameterElement).field;
+    return FieldMember(field, _substitution);
   }
 
   @override
@@ -235,20 +279,27 @@
 class FieldMember extends VariableMember implements FieldElement {
   /**
    * Initialize a newly created element to represent a field, based on the
-   * [baseElement], defined by the [definingType].
+   * [baseElement], with applied [substitution].
    */
-  FieldMember(FieldElement baseElement, InterfaceType definingType)
-      : super(baseElement, definingType);
+  FieldMember(
+    FieldElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   FieldElement get baseElement => super.baseElement as FieldElement;
 
   @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
+  Element get enclosingElement => baseElement.enclosingElement;
 
   @override
-  PropertyAccessorElement get getter =>
-      PropertyAccessorMember.from(baseElement.getter, definingType);
+  PropertyAccessorElement get getter {
+    var baseGetter = baseElement.getter;
+    if (baseGetter == null) {
+      return null;
+    }
+    return PropertyAccessorMember(baseGetter, _substitution);
+  }
 
   @override
   bool get isCovariant => baseElement.isCovariant;
@@ -268,8 +319,13 @@
   DartType get propagatedType => null;
 
   @override
-  PropertyAccessorElement get setter =>
-      PropertyAccessorMember.from(baseElement.setter, definingType);
+  PropertyAccessorElement get setter {
+    var baseSetter = baseElement.setter;
+    if (baseSetter == null) {
+      return null;
+    }
+    return PropertyAccessorMember(baseSetter, _substitution);
+  }
 
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitFieldElement(this);
@@ -288,82 +344,14 @@
    * field. Return the member that was created, or the base field if no member
    * was created.
    */
-  static FieldElement from(FieldElement field, ParameterizedType definingType) {
+  static FieldElement from(FieldElement field, InterfaceType definingType) {
     if (field == null || definingType.typeArguments.isEmpty) {
       return field;
     }
-    // TODO(brianwilkerson) Consider caching the substituted type in the
-    // instance. It would use more memory but speed up some operations.
-    // We need to see how often the type is being re-computed.
-    return new FieldMember(field, definingType);
-  }
-}
-
-/**
- * Deprecated: this type is no longer used. Use
- * [MethodInvocation.staticInvokeType] to get the instantiated type of a generic
- * method invocation.
- *
- * An element of a generic function, where the type parameters are known.
- */
-// TODO(jmesserly): the term "function member" is a bit weird, but it allows
-// a certain consistency.
-@deprecated
-class FunctionMember extends ExecutableMember implements FunctionElement {
-  /**
-   * Initialize a newly created element to represent a function, based on the
-   * [baseElement], with the corresponding function [type].
-   */
-  @deprecated
-  FunctionMember(FunctionElement baseElement, [DartType type])
-      : super(baseElement, null, type);
-
-  @override
-  FunctionElement get baseElement => super.baseElement as FunctionElement;
-
-  @override
-  Element get enclosingElement => baseElement.enclosingElement;
-
-  @override
-  bool get isEntryPoint => baseElement.isEntryPoint;
-
-  @override
-  SourceRange get visibleRange => baseElement.visibleRange;
-
-  @override
-  T accept<T>(ElementVisitor<T> visitor) => visitor.visitFunctionElement(this);
-
-  @deprecated
-  @override
-  FunctionDeclaration computeNode() => baseElement.computeNode();
-
-  @override
-  String toString() {
-    StringBuffer buffer = new StringBuffer();
-    buffer.write(baseElement.displayName);
-    (type as FunctionTypeImpl).appendTo(buffer, new Set.identity());
-    return buffer.toString();
-  }
-
-  /**
-   * If the given [method]'s type is different when any type parameters from the
-   * defining type's declaration are replaced with the actual type arguments
-   * from the [definingType], create a method member representing the given
-   * method. Return the member that was created, or the base method if no member
-   * was created.
-   */
-  static MethodElement from(
-      MethodElement method, ParameterizedType definingType) {
-    if (method == null || definingType.typeArguments.length == 0) {
-      return method;
-    }
-    FunctionType baseType = method.type;
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes =
-        TypeParameterTypeImpl.getTypes(definingType.typeParameters);
-    FunctionType substitutedType =
-        baseType.substitute2(argumentTypes, parameterTypes);
-    return new MethodMember(method, definingType, substitutedType);
+    return FieldMember(
+      field,
+      Substitution.fromInterfaceType(definingType),
+    );
   }
 }
 
@@ -378,15 +366,15 @@
   final Element _baseElement;
 
   /**
-   * The type in which the element is defined.
+   * The substitution for type parameters referenced in the base element.
    */
-  final ParameterizedType _definingType;
+  final MapSubstitution _substitution;
 
   /**
    * Initialize a newly created element to represent a member, based on the
-   * [baseElement], defined by the [definingType].
+   * [baseElement], and applied [_substitution].
    */
-  Member(this._baseElement, this._definingType);
+  Member(this._baseElement, this._substitution);
 
   /**
    * Return the element on which the parameterized element was created.
@@ -396,11 +384,6 @@
   @override
   AnalysisContext get context => _baseElement.context;
 
-  /**
-   * Return the type in which the element is defined.
-   */
-  ParameterizedType get definingType => _definingType;
-
   @override
   String get displayName => _baseElement.displayName;
 
@@ -518,6 +501,11 @@
   @override
   Source get source => _baseElement.source;
 
+  /**
+   * The substitution for type parameters referenced in the base element.
+   */
+  MapSubstitution get substitution => _substitution;
+
   @deprecated
   @override
   CompilationUnit get unit => _baseElement.unit;
@@ -542,17 +530,6 @@
       _baseElement.isAccessibleIn(library);
 
   /**
-   * If the given [child] is not `null`, use the given [visitor] to visit it.
-   */
-  @deprecated
-  void safelyVisitChild(Element child, ElementVisitor visitor) {
-    // TODO(brianwilkerson) Make this private
-    if (child != null) {
-      child.accept(visitor);
-    }
-  }
-
-  /**
    * Use the given [visitor] to visit all of the [children].
    */
   void safelyVisitChildren(List<Element> children, ElementVisitor visitor) {
@@ -568,14 +545,12 @@
    * Return the type that results from replacing the type parameters in the
    * given [type] with the type arguments associated with this member.
    */
+  @Deprecated("Used only by 'getReifiedType', which is deprecated")
   DartType substituteFor(DartType type) {
     if (type == null) {
       return null;
     }
-    List<DartType> argumentTypes = _definingType.typeArguments;
-    List<DartType> parameterTypes =
-        TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
-    return type.substitute2(argumentTypes, parameterTypes);
+    return _substitution.substituteType(type);
   }
 
   @override
@@ -591,19 +566,18 @@
 class MethodMember extends ExecutableMember implements MethodElement {
   /**
    * Initialize a newly created element to represent a method, based on the
-   * [baseElement], defined by the [definingType]. If [type] is passed, it
-   * represents the full type of the member, and will take precedence over
-   * the [definingType].
+   * [baseElement], with applied [substitution].
    */
-  MethodMember(MethodElement baseElement, InterfaceType definingType,
-      [DartType type])
-      : super(baseElement, definingType, type);
+  MethodMember(
+    MethodElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   MethodElement get baseElement => super.baseElement as MethodElement;
 
   @override
-  ClassElement get enclosingElement => baseElement.enclosingElement;
+  Element get enclosingElement => baseElement.enclosingElement;
 
   @override
   T accept<T>(ElementVisitor<T> visitor) => visitor.visitMethodElement(this);
@@ -623,7 +597,7 @@
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
-    StringBuffer buffer = new StringBuffer();
+    StringBuffer buffer = StringBuffer();
     if (type != null) {
       buffer.write(type.returnType);
       buffer.write(' ');
@@ -638,7 +612,12 @@
         if (i > 0) {
           buffer.write(', ');
         }
-        (typeParameters[i] as TypeParameterElementImpl).appendTo(buffer);
+        // TODO(scheglov) consider always using TypeParameterMember
+        var typeParameter = typeParameters[i];
+        if (typeParameter is TypeParameterElementImpl) {
+          typeParameter.appendTo(buffer);
+        } else
+          (typeParameter as TypeParameterMember).appendTo(buffer);
       }
       buffer.write('>');
     }
@@ -685,15 +664,14 @@
    * was created.
    */
   static MethodElement from(MethodElement method, InterfaceType definingType) {
-    if (method == null || definingType.typeArguments.length == 0) {
+    if (method == null || definingType.typeArguments.isEmpty) {
       return method;
     }
-    FunctionType baseType = method.type;
-    List<DartType> argumentTypes = definingType.typeArguments;
-    List<DartType> parameterTypes = definingType.element.type.typeArguments;
-    FunctionType substitutedType =
-        baseType.substitute2(argumentTypes, parameterTypes);
-    return new MethodMember(method, definingType, substitutedType);
+
+    return MethodMember(
+      method,
+      Substitution.fromInterfaceType(definingType),
+    );
   }
 }
 
@@ -706,12 +684,14 @@
     implements ParameterElement {
   /**
    * Initialize a newly created element to represent a parameter, based on the
-   * [baseElement], defined by the [definingType]. If [type] is passed it will
+   * [baseElement], with applied [substitution]. If [type] is passed it will
    * represent the already substituted type.
    */
-  ParameterMember(ParameterElement baseElement, ParameterizedType definingType,
-      [DartType type])
-      : super._(baseElement, definingType, type);
+  ParameterMember(
+    ParameterElement baseElement,
+    MapSubstitution substitution, [
+    DartType type,
+  ]) : super._(baseElement, substitution, type);
 
   @override
   ParameterElement get baseElement => super.baseElement as ParameterElement;
@@ -745,7 +725,12 @@
   }
 
   @override
-  List<TypeParameterElement> get typeParameters => baseElement.typeParameters;
+  List<TypeParameterElement> get typeParameters {
+    return TypeParameterMember.from2(
+      baseElement.typeParameters,
+      _substitution,
+    );
+  }
 
   @override
   SourceRange get visibleRange => baseElement.visibleRange;
@@ -760,15 +745,8 @@
   @override
   E getAncestor<E extends Element>(Predicate<Element> predicate) {
     Element element = baseElement.getAncestor(predicate);
-    ParameterizedType definingType = this.definingType;
-    if (definingType is InterfaceType) {
-      if (element is ConstructorElement) {
-        return ConstructorMember.from(element, definingType) as E;
-      } else if (element is MethodElement) {
-        return MethodMember.from(element, definingType) as E;
-      } else if (element is PropertyAccessorElement) {
-        return PropertyAccessorMember.from(element, definingType) as E;
-      }
+    if (element is ExecutableElement) {
+      return ExecutableMember.from2(element, _substitution) as E;
     }
     return element as E;
   }
@@ -806,26 +784,32 @@
     implements PropertyAccessorElement {
   /**
    * Initialize a newly created element to represent a property, based on the
-   * [baseElement], defined by the [definingType].
+   * [baseElement], with applied [substitution].
    */
   PropertyAccessorMember(
-      PropertyAccessorElement baseElement, InterfaceType definingType)
-      : super(baseElement, definingType);
+    PropertyAccessorElement baseElement,
+    MapSubstitution substitution,
+  ) : super(baseElement, substitution);
 
   @override
   PropertyAccessorElement get baseElement =>
       super.baseElement as PropertyAccessorElement;
 
   @override
-  PropertyAccessorElement get correspondingGetter =>
-      from(baseElement.correspondingGetter, definingType);
+  PropertyAccessorElement get correspondingGetter {
+    return PropertyAccessorMember(
+      baseElement.correspondingGetter,
+      _substitution,
+    );
+  }
 
   @override
-  PropertyAccessorElement get correspondingSetter =>
-      from(baseElement.correspondingSetter, definingType);
-
-  @override
-  InterfaceType get definingType => super.definingType as InterfaceType;
+  PropertyAccessorElement get correspondingSetter {
+    return PropertyAccessorMember(
+      baseElement.correspondingSetter,
+      _substitution,
+    );
+  }
 
   @override
   Element get enclosingElement => baseElement.enclosingElement;
@@ -840,7 +824,7 @@
   PropertyInducingElement get variable {
     PropertyInducingElement variable = baseElement.variable;
     if (variable is FieldElement) {
-      return FieldMember.from(variable, definingType);
+      return FieldMember(variable, _substitution);
     }
     return variable;
   }
@@ -855,7 +839,7 @@
     List<ParameterElement> parameters = this.parameters;
     FunctionType type = this.type;
 
-    StringBuffer builder = new StringBuffer();
+    StringBuffer builder = StringBuffer();
     if (type != null) {
       builder.write(type.returnType);
       builder.write(' ');
@@ -892,10 +876,11 @@
     if (accessor == null || definingType.typeArguments.isEmpty) {
       return accessor;
     }
-    // TODO(brianwilkerson) Consider caching the substituted type in the
-    // instance. It would use more memory but speed up some operations.
-    // We need to see how often the type is being re-computed.
-    return new PropertyAccessorMember(accessor, definingType);
+
+    return PropertyAccessorMember(
+      accessor,
+      Substitution.fromInterfaceType(definingType),
+    );
   }
 }
 
@@ -918,10 +903,10 @@
   DartType _bound;
   DartType _type;
 
-  TypeParameterMember(
-      TypeParameterElement baseElement, DartType definingType, this._bound)
-      : super(baseElement, definingType) {
-    _type = new TypeParameterTypeImpl(this);
+  TypeParameterMember(TypeParameterElement baseElement,
+      MapSubstitution substitution, this._bound)
+      : super(baseElement, substitution) {
+    _type = TypeParameterTypeImpl(this);
   }
 
   @override
@@ -948,6 +933,21 @@
   T accept<T>(ElementVisitor<T> visitor) =>
       visitor.visitTypeParameterElement(this);
 
+  void appendTo(StringBuffer buffer) {
+    buffer.write(displayName);
+    if (bound != null) {
+      buffer.write(" extends ");
+      buffer.write(bound);
+    }
+  }
+
+  @override
+  String toString() {
+    var buffer = StringBuffer();
+    appendTo(buffer);
+    return buffer.toString();
+  }
+
   /**
    * If the given [parameter]'s type is different when any type parameters from
    * the defining type's declaration are replaced with the actual type
@@ -957,39 +957,44 @@
    */
   static List<TypeParameterElement> from(
       List<TypeParameterElement> formals, FunctionType definingType) {
-    List<DartType> argumentTypes = definingType.typeArguments;
-    if (argumentTypes.isEmpty) {
-      return formals;
-    }
-    List<DartType> parameterTypes =
-        TypeParameterTypeImpl.getTypes(definingType.typeParameters);
+    var substitution = Substitution.fromPairs(
+      definingType.typeParameters,
+      definingType.typeArguments,
+    );
+    return from2(formals, substitution);
+  }
 
+  static List<TypeParameterElement> from2(
+    List<TypeParameterElement> formals,
+    MapSubstitution substitution,
+  ) {
     // Create type formals with specialized bounds.
     // For example `<U extends T>` where T comes from an outer scope.
-    var results = formals.toList(growable: false);
-    for (int i = 0; i < results.length; i++) {
-      var formal = results[i];
+    var newElements = formals.toList(growable: false);
+    var newTypes = List<TypeParameterType>(formals.length);
+    for (int i = 0; i < newElements.length; i++) {
+      var formal = newElements[i];
       DartType bound = formal?.bound;
       if (bound != null) {
-        // substitute type arguments from the function.
-        bound = bound.substitute2(argumentTypes, parameterTypes);
-        results[i] = new TypeParameterMember(formal, definingType, bound);
+        bound = substitution.substituteType(bound);
+        var member = TypeParameterMember(formal, substitution, bound);
+        newElements[i] = member;
       }
+      newTypes[i] = newElements[i].type;
     }
-    List<TypeParameterType> formalTypes =
-        TypeParameterTypeImpl.getTypes(formals);
-    for (var formal in results) {
+
+    // Recursive bounds are allowed too, so make sure these are updated
+    // to refer to any new TypeParameterMember we just made, rather than
+    // the original type parameter
+    var substitution2 = Substitution.fromPairs(formals, newTypes);
+    for (var formal in newElements) {
       if (formal is TypeParameterMember) {
-        // Recursive bounds are allowed too, so make sure these are updated
-        // to refer to any new TypeParameterMember we just made, rather than
-        // the original type parameter
         // TODO(jmesserly): this is required so substituting for the
         // type formal will work. Investigate if there's a better solution.
-        formal._bound = formal.bound
-            .substitute2(TypeParameterTypeImpl.getTypes(results), formalTypes);
+        formal._bound = substitution2.substituteType(formal.bound);
       }
     }
-    return results;
+    return newElements;
   }
 }
 
@@ -998,25 +1003,24 @@
  * type parameters are known.
  */
 abstract class VariableMember extends Member implements VariableElement {
-  @override
-  final DartType type;
+  DartType _type;
 
   /**
    * Initialize a newly created element to represent a variable, based on the
-   * [baseElement], defined by the [definingType].
+   * [baseElement], with applied [substitution].
    */
-  VariableMember(VariableElement baseElement, ParameterizedType definingType,
-      [DartType type])
-      : type = type ??
-            baseElement.type.substitute2(definingType.typeArguments,
-                TypeParameterTypeImpl.getTypes(definingType.typeParameters)),
-        super(baseElement, definingType);
+  VariableMember(
+    VariableElement baseElement,
+    MapSubstitution substitution, [
+    DartType type,
+  ])  : _type = type,
+        super(baseElement, substitution);
 
   // TODO(jmesserly): this is temporary to allow the ParameterMember subclass.
   // Apparently mixins don't work with optional params.
-  VariableMember._(VariableElement baseElement, ParameterizedType definingType,
-      DartType type)
-      : this(baseElement, definingType, type);
+  VariableMember._(VariableElement baseElement, MapSubstitution substitution,
+      [DartType type])
+      : this(baseElement, substitution, type);
 
   @override
   VariableElement get baseElement => super.baseElement as VariableElement;
@@ -1033,7 +1037,7 @@
     // Elements within this element should have type parameters substituted,
     // just like this element.
     //
-    throw new UnsupportedError('initializer');
+    throw UnsupportedError('initializer');
     //    return getBaseElement().getInitializer();
   }
 
@@ -1060,6 +1064,13 @@
   bool get isStatic => baseElement.isStatic;
 
   @override
+  DartType get type {
+    if (_type != null) return _type;
+
+    return _type = _substitution.substituteType(baseElement.type);
+  }
+
+  @override
   DartObject computeConstantValue() => baseElement.computeConstantValue();
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/type.dart b/pkg/analyzer/lib/src/dart/element/type.dart
index 90c8f23..d4067ce 100644
--- a/pkg/analyzer/lib/src/dart/element/type.dart
+++ b/pkg/analyzer/lib/src/dart/element/type.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisEngine;
 import 'package:analyzer/src/generated/resolver.dart';
@@ -584,19 +585,20 @@
 
   @override
   String get displayName {
-    String name = this.name;
-
-    // Function types have an empty name when they are defined implicitly by
-    // either a closure or as part of a parameter declaration.
-    if (name == null || name.length == 0) {
+    if (name == null || name.isEmpty) {
+      // Function types have an empty name when they are defined implicitly by
+      // either a closure or as part of a parameter declaration.
       StringBuffer buffer = new StringBuffer();
       appendTo(buffer, new Set.identity());
+      if (nullabilitySuffix == NullabilitySuffix.question) {
+        buffer.write('?');
+      }
       return buffer.toString();
     }
 
     List<DartType> typeArguments = this.typeArguments;
 
-    bool areAllTypeArgumentsDynamic() {
+    bool allTypeArgumentsAreDynamic() {
       for (DartType type in typeArguments) {
         if (type != null && !type.isDynamic) {
           return false;
@@ -605,10 +607,10 @@
       return true;
     }
 
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(name);
     // If there is at least one non-dynamic type, then list them out.
-    if (!areAllTypeArgumentsDynamic()) {
-      StringBuffer buffer = new StringBuffer();
-      buffer.write(name);
+    if (!allTypeArgumentsAreDynamic()) {
       buffer.write("<");
       for (int i = 0; i < typeArguments.length; i++) {
         if (i != 0) {
@@ -618,10 +620,11 @@
         buffer.write(typeArg.displayName);
       }
       buffer.write(">");
-      name = buffer.toString();
     }
-
-    return name;
+    if (nullabilitySuffix == NullabilitySuffix.question) {
+      buffer.write('?');
+    }
+    return buffer.toString();
   }
 
   @override
@@ -724,7 +727,8 @@
               normalParameterTypes, object.normalParameterTypes) &&
           TypeImpl.equalArrays(
               optionalParameterTypes, object.optionalParameterTypes) &&
-          _equals(namedParameterTypes, object.namedParameterTypes);
+          _equals(namedParameterTypes, object.namedParameterTypes) &&
+          nullabilitySuffix == object.nullabilitySuffix;
     }
     return false;
   }
@@ -808,35 +812,6 @@
   }
 
   @override
-  bool isEquivalentTo(DartType other) {
-    if (other is FunctionTypeImpl) {
-      if (typeFormals.length != other.typeFormals.length) {
-        return false;
-      }
-      // `<T>T -> T` should be equal to `<U>U -> U`
-      // To test this, we instantiate both types with the same (unique) type
-      // variables, and see if the result is equal.
-      if (typeFormals.isNotEmpty) {
-        List<DartType> freshVariables = FunctionTypeImpl.relateTypeFormals(
-            this, other, (t, s, _, __) => t == s);
-        if (freshVariables == null) {
-          return false;
-        }
-        return instantiate(freshVariables)
-            .isEquivalentTo(other.instantiate(freshVariables));
-      }
-
-      return returnType.isEquivalentTo(other.returnType) &&
-          TypeImpl.equivalentArrays(
-              normalParameterTypes, other.normalParameterTypes) &&
-          TypeImpl.equivalentArrays(
-              optionalParameterTypes, other.optionalParameterTypes) &&
-          _equivalent(namedParameterTypes, other.namedParameterTypes);
-    }
-    return false;
-  }
-
-  @override
   bool isMoreSpecificThan(DartType type,
       [bool withDynamic = false, Set<Element> visitedElements]) {
     // Note: visitedElements is only used for breaking recursion in the type
@@ -854,6 +829,7 @@
     return FunctionTypeImpl.relate(
         typeSystem.instantiateToBounds(this),
         typeSystem.instantiateToBounds(type),
+        // ignore: deprecated_member_use_from_same_package
         (DartType t, DartType s) => t.isAssignableTo(s));
   }
 
@@ -1189,6 +1165,14 @@
           TypeParameterElement formal2, TypeParameterElement formal1)) {
     List<TypeParameterElement> params1 = f1.typeFormals;
     List<TypeParameterElement> params2 = f2.typeFormals;
+    return relateTypeFormals2(params1, params2, relation);
+  }
+
+  static List<DartType> relateTypeFormals2(
+      List<TypeParameterElement> params1,
+      List<TypeParameterElement> params2,
+      bool relation(DartType bound2, DartType bound1,
+          TypeParameterElement formal2, TypeParameterElement formal1)) {
     int count = params1.length;
     if (params2.length != count) {
       return null;
@@ -1252,31 +1236,6 @@
     }
     return true;
   }
-
-  /**
-   * Return `true` if all of the name/type pairs in the first map ([firstTypes])
-   * are equivalent to the corresponding name/type pairs in the second map
-   * ([secondTypes]). The maps are expected to iterate over their entries in the
-   * same order in which those entries were added to the map.
-   */
-  static bool _equivalent(
-      Map<String, DartType> firstTypes, Map<String, DartType> secondTypes) {
-    if (secondTypes.length != firstTypes.length) {
-      return false;
-    }
-    Iterator<String> firstKeys = firstTypes.keys.iterator;
-    Iterator<String> secondKeys = secondTypes.keys.iterator;
-    while (firstKeys.moveNext() && secondKeys.moveNext()) {
-      String firstKey = firstKeys.current;
-      String secondKey = secondKeys.current;
-      TypeImpl firstType = firstTypes[firstKey];
-      TypeImpl secondType = secondTypes[secondKey];
-      if (firstKey != secondKey || !firstType.isEquivalentTo(secondType)) {
-        return false;
-      }
-    }
-    return true;
-  }
 }
 
 /**
@@ -1403,11 +1362,9 @@
 
   @override
   String get displayName {
-    String name = this.name;
-
     List<DartType> typeArguments = this.typeArguments;
 
-    bool areAllTypeArgumentsDynamic() {
+    bool allTypeArgumentsAreDynamic() {
       for (DartType type in typeArguments) {
         if (type != null && !type.isDynamic) {
           return false;
@@ -1416,10 +1373,10 @@
       return true;
     }
 
+    StringBuffer buffer = new StringBuffer();
+    buffer.write(name);
     // If there is at least one non-dynamic type, then list them out.
-    if (!areAllTypeArgumentsDynamic()) {
-      StringBuffer buffer = new StringBuffer();
-      buffer.write(name);
+    if (!allTypeArgumentsAreDynamic()) {
       buffer.write("<");
       for (int i = 0; i < typeArguments.length; i++) {
         if (i != 0) {
@@ -1429,9 +1386,11 @@
         buffer.write(typeArg.displayName);
       }
       buffer.write(">");
-      name = buffer.toString();
     }
-    return name;
+    if (nullabilitySuffix == NullabilitySuffix.question) {
+      buffer.write('?');
+    }
+    return buffer.toString();
   }
 
   @override
@@ -1452,7 +1411,7 @@
     List<InterfaceType> interfaces = classElement.interfaces;
     List<TypeParameterElement> typeParameters = classElement.typeParameters;
     List<DartType> parameterTypes = classElement.type.typeArguments;
-    if (typeParameters.length == 0) {
+    if (typeParameters.isEmpty) {
       return interfaces;
     }
     int count = interfaces.length;
@@ -1519,6 +1478,24 @@
   }
 
   @override
+  bool get isDartCoreList {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "List" && element.library.isDartCore;
+  }
+
+  @override
+  bool get isDartCoreMap {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Map" && element.library.isDartCore;
+  }
+
+  @override
   bool get isDartCoreNull {
     ClassElement element = this.element;
     if (element == null) {
@@ -1528,6 +1505,24 @@
   }
 
   @override
+  bool get isDartCoreNum {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "num" && element.library.isDartCore;
+  }
+
+  @override
+  bool get isDartCoreSet {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Set" && element.library.isDartCore;
+  }
+
+  @override
   bool get isDartCoreString {
     ClassElement element = this.element;
     if (element == null) {
@@ -1537,6 +1532,15 @@
   }
 
   @override
+  bool get isDartCoreSymbol {
+    ClassElement element = this.element;
+    if (element == null) {
+      return false;
+    }
+    return element.name == "Symbol" && element.library.isDartCore;
+  }
+
+  @override
   bool get isObject => element.supertype == null && !element.isMixin;
 
   @override
@@ -1567,7 +1571,7 @@
       return null;
     }
     List<DartType> typeParameters = classElement.type.typeArguments;
-    if (typeArguments.length == 0 ||
+    if (typeArguments.isEmpty ||
         typeArguments.length != typeParameters.length) {
       return supertype;
     }
@@ -1612,8 +1616,9 @@
       return true;
     }
     if (object is InterfaceTypeImpl) {
-      return (element == object.element) &&
-          TypeImpl.equalArrays(typeArguments, object.typeArguments);
+      return element == object.element &&
+          TypeImpl.equalArrays(typeArguments, object.typeArguments) &&
+          nullabilitySuffix == object.nullabilitySuffix;
     }
     return false;
   }
@@ -1772,18 +1777,6 @@
   }
 
   @override
-  bool isEquivalentTo(DartType other) {
-    if (identical(other, this)) {
-      return true;
-    }
-    if (other is InterfaceTypeImpl) {
-      return (element == other.element) &&
-          TypeImpl.equivalentArrays(typeArguments, other.typeArguments);
-    }
-    return false;
-  }
-
-  @override
   bool isMoreSpecificThan(DartType type,
       [bool withDynamic = false, Set<Element> visitedElements]) {
     //
@@ -1815,6 +1808,7 @@
       //
       // Direct supertype: S is a direct supertype of T.
       //
+      // ignore: deprecated_member_use_from_same_package
       if (type.isDirectSupertypeOf(this)) {
         return true;
       }
@@ -2258,7 +2252,7 @@
       throw new ArgumentError(
           "argumentTypes.length (${argumentTypes.length}) != parameterTypes.length (${parameterTypes.length})");
     }
-    if (argumentTypes.length == 0 || typeArguments.length == 0) {
+    if (argumentTypes.isEmpty || typeArguments.isEmpty) {
       return this.pruned(prune);
     }
 
@@ -2378,80 +2372,6 @@
   }
 
   /**
-   * Compute the least upper bound of types [i] and [j], both of which are
-   * known to be interface types.
-   *
-   * In the event that the algorithm fails (which might occur due to a bug in
-   * the analyzer), `null` is returned.
-   */
-  static InterfaceType computeLeastUpperBound(InterfaceType i, InterfaceType j,
-      {@deprecated bool strong = true}) {
-    // compute set of supertypes
-    Set<InterfaceType> si = computeSuperinterfaceSet(i);
-    Set<InterfaceType> sj = computeSuperinterfaceSet(j);
-    // union si with i and sj with j
-    si.add(i);
-    sj.add(j);
-    // compute intersection, reference as set 's'
-    List<InterfaceType> s = _intersection(si, sj);
-    return computeTypeAtMaxUniqueDepth(s);
-  }
-
-  /**
-   * Return the length of the longest inheritance path from the given [type] to
-   * Object.
-   *
-   * See [computeLeastUpperBound].
-   */
-  static int computeLongestInheritancePathToObject(InterfaceType type) =>
-      _computeLongestInheritancePathToObject(
-          type, 0, new HashSet<ClassElement>());
-
-  /**
-   * Returns the set of all superinterfaces of the given [type].
-   *
-   * See [computeLeastUpperBound].
-   */
-  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type,
-          {@deprecated bool strong = true}) =>
-      _computeSuperinterfaceSet(type, new HashSet<InterfaceType>(), true);
-
-  /**
-   * Return the type from the [types] list that has the longest inheritance path
-   * to Object of unique length.
-   */
-  static InterfaceType computeTypeAtMaxUniqueDepth(List<InterfaceType> types) {
-    // for each element in Set s, compute the largest inheritance path to Object
-    List<int> depths = new List<int>.filled(types.length, 0);
-    int maxDepth = 0;
-    for (int n = 0; n < types.length; n++) {
-      depths[n] = computeLongestInheritancePathToObject(types[n]);
-      if (depths[n] > maxDepth) {
-        maxDepth = depths[n];
-      }
-    }
-    // ensure that the currently computed maxDepth is unique,
-    // otherwise, decrement and test for uniqueness again
-    for (; maxDepth >= 0; maxDepth--) {
-      int indexOfLeastUpperBound = -1;
-      int numberOfTypesAtMaxDepth = 0;
-      for (int m = 0; m < depths.length; m++) {
-        if (depths[m] == maxDepth) {
-          numberOfTypesAtMaxDepth++;
-          indexOfLeastUpperBound = m;
-        }
-      }
-      if (numberOfTypesAtMaxDepth == 1) {
-        return types[indexOfLeastUpperBound];
-      }
-    }
-    // Should be impossible--there should always be exactly one type with the
-    // maximum depth.
-    assert(false);
-    return null;
-  }
-
-  /**
    * If there is a single type which is at least as specific as all of the
    * types in [types], return it.  Otherwise return `null`.
    */
@@ -2467,7 +2387,7 @@
     for (DartType type in types) {
       // If any existing type in the bucket is more specific than this type,
       // then we can ignore this type.
-      if (bucket.any((DartType t) => typeSystem.isMoreSpecificThan(t, type))) {
+      if (bucket.any((DartType t) => typeSystem.isSubtypeOf(t, type))) {
         continue;
       }
       // Otherwise, we need to add this type to the bucket and remove any types
@@ -2475,7 +2395,7 @@
       bool added = false;
       int i = 0;
       while (i < bucket.length) {
-        if (typeSystem.isMoreSpecificThan(type, bucket[i])) {
+        if (typeSystem.isSubtypeOf(type, bucket[i])) {
           if (added) {
             if (i < bucket.length - 1) {
               bucket[i] = bucket.removeLast();
@@ -2528,105 +2448,6 @@
   }
 
   /**
-   * Return the length of the longest inheritance path from a subtype of the
-   * given [type] to Object, where the given [depth] is the length of the
-   * longest path from the subtype to this type. The set of [visitedTypes] is
-   * used to prevent infinite recursion in the case of a cyclic type structure.
-   *
-   * See [computeLongestInheritancePathToObject], and [computeLeastUpperBound].
-   */
-  static int _computeLongestInheritancePathToObject(
-      InterfaceType type, int depth, HashSet<ClassElement> visitedTypes) {
-    ClassElement classElement = type.element;
-    // Object case
-    if (type.isObject || visitedTypes.contains(classElement)) {
-      return depth;
-    }
-    int longestPath = 1;
-    try {
-      visitedTypes.add(classElement);
-      int pathLength;
-
-      // loop through each of the superinterfaces recursively calling this
-      // method and keeping track of the longest path to return
-      for (InterfaceType interface in classElement.superclassConstraints) {
-        pathLength = _computeLongestInheritancePathToObject(
-            interface, depth + 1, visitedTypes);
-        if (pathLength > longestPath) {
-          longestPath = pathLength;
-        }
-      }
-
-      // loop through each of the superinterfaces recursively calling this
-      // method and keeping track of the longest path to return
-      for (InterfaceType interface in classElement.interfaces) {
-        pathLength = _computeLongestInheritancePathToObject(
-            interface, depth + 1, visitedTypes);
-        if (pathLength > longestPath) {
-          longestPath = pathLength;
-        }
-      }
-
-      // finally, perform this same check on the super type
-      // TODO(brianwilkerson) Does this also need to add in the number of mixin
-      // classes?
-      InterfaceType supertype = classElement.supertype;
-      if (supertype != null) {
-        pathLength = _computeLongestInheritancePathToObject(
-            supertype, depth + 1, visitedTypes);
-        if (pathLength > longestPath) {
-          longestPath = pathLength;
-        }
-      }
-    } finally {
-      visitedTypes.remove(classElement);
-    }
-    return longestPath;
-  }
-
-  /**
-   * Add all of the superinterfaces of the given [type] to the given [set].
-   * Return the [set] as a convenience.
-   *
-   * If [strong] mode is enabled (Dart 2), then the `Function` interface is
-   * ignored and not treated as a superinterface.
-   *
-   * See [computeSuperinterfaceSet], and [computeLeastUpperBound].
-   */
-  static Set<InterfaceType> _computeSuperinterfaceSet(
-      InterfaceType type, HashSet<InterfaceType> set, bool _) {
-    Element element = type.element;
-    if (element != null) {
-      List<InterfaceType> superinterfaces = type.interfaces;
-      for (InterfaceType superinterface in superinterfaces) {
-        if (!superinterface.isDartCoreFunction) {
-          if (set.add(superinterface)) {
-            _computeSuperinterfaceSet(superinterface, set, true);
-          }
-        }
-      }
-      InterfaceType supertype = type.superclass;
-      if (supertype != null && !supertype.isDartCoreFunction) {
-        if (set.add(supertype)) {
-          _computeSuperinterfaceSet(supertype, set, true);
-        }
-      }
-    }
-    return set;
-  }
-
-  /**
-   * Return the intersection of the [first] and [second] sets of types, where
-   * intersection is based on the equality of the types themselves.
-   */
-  static List<InterfaceType> _intersection(
-      Set<InterfaceType> first, Set<InterfaceType> second) {
-    Set<InterfaceType> result = new HashSet<InterfaceType>.from(first);
-    result.retainAll(second);
-    return new List.from(result);
-  }
-
-  /**
    * 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.
@@ -2830,12 +2651,27 @@
   bool get isDartCoreInt => false;
 
   @override
+  bool get isDartCoreList => false;
+
+  @override
+  bool get isDartCoreMap => false;
+
+  @override
   bool get isDartCoreNull => false;
 
   @override
+  bool get isDartCoreNum => false;
+
+  @override
+  bool get isDartCoreSet => false;
+
+  @override
   bool get isDartCoreString => false;
 
   @override
+  bool get isDartCoreSymbol => false;
+
+  @override
   bool get isDynamic => false;
 
   @override
@@ -3035,31 +2871,6 @@
   }
 
   /**
-   * Return `true` if corresponding elements of the [first] and [second] lists
-   * of type arguments are all equivalent.
-   */
-  static bool equivalentArrays(List<DartType> first, List<DartType> second) {
-    if (first.length != second.length) {
-      return false;
-    }
-    for (int i = 0; i < first.length; i++) {
-      if (first[i] == null) {
-        AnalysisEngine.instance.logger
-            .logInformation('Found null type argument in TypeImpl.equalArrays');
-        return second[i] == null;
-      } else if (second[i] == null) {
-        AnalysisEngine.instance.logger
-            .logInformation('Found null type argument in TypeImpl.equalArrays');
-        return false;
-      }
-      if (!first[i].isEquivalentTo(second[i])) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  /**
    * Return a list containing the results of using the given [argumentTypes] and
    * [parameterTypes] to perform a substitution on all of the given [types].
    *
@@ -3156,24 +2967,6 @@
   }
 
   @override
-  bool isEquivalentTo(DartType other) {
-    if (other is TypeParameterTypeImpl && element == other.element) {
-      if (_comparingBounds) {
-        // If we're comparing bounds already, then we only need type variable
-        // equality.
-        return true;
-      }
-      _comparingBounds = true;
-      try {
-        return bound.isEquivalentTo(other.bound);
-      } finally {
-        _comparingBounds = false;
-      }
-    }
-    return false;
-  }
-
-  @override
   bool isMoreSpecificThan(DartType s,
       [bool withDynamic = false, Set<Element> visitedElements]) {
     //
@@ -3515,6 +3308,8 @@
 
   @override
   List<ParameterElement> get parameters {
+    var substitution = Substitution.fromPairs(typeParameters, typeArguments);
+
     List<ParameterElement> baseParameters = this.baseParameters;
     // no parameters, quick return
     int parameterCount = baseParameters.length;
@@ -3538,7 +3333,8 @@
 
       if (parameter is FieldFormalParameterElement) {
         // TODO(jmesserly): this seems like it won't handle pruning correctly.
-        specializedParams[i] = new FieldFormalParameterMember(parameter, this);
+        specializedParams[i] =
+            new FieldFormalParameterMember(parameter, substitution);
         continue;
       }
       var baseType = parameter.type as TypeImpl;
@@ -3552,7 +3348,7 @@
 
       specializedParams[i] = identical(type, baseType)
           ? parameter
-          : new ParameterMember(parameter, this, type);
+          : new ParameterMember(parameter, substitution, type);
     }
     return specializedParams;
   }
@@ -3567,7 +3363,7 @@
     }
     // If there are no arguments to substitute, or if the arguments size doesn't
     // match the parameter size, return the base return type.
-    if (typeArguments.length == 0 ||
+    if (typeArguments.isEmpty ||
         typeArguments.length != typeParameters.length) {
       return (baseReturnType as TypeImpl).pruned(newPrune);
     }
@@ -3711,7 +3507,7 @@
       // Circularity found.  Prune the type declaration.
       return new CircularFunctionTypeImpl();
     }
-    if (argumentTypes.length == 0) {
+    if (argumentTypes.isEmpty) {
       return this.pruned(prune);
     }
     List<DartType> typeArgs =
@@ -3745,7 +3541,7 @@
       // ignore: deprecated_member_use_from_same_package
       if (parameter.parameterKind == kind) {
         TypeImpl type = parameter.type ?? DynamicTypeImpl.instance;
-        if (typeArguments.length != 0 &&
+        if (typeArguments.isNotEmpty &&
             typeArguments.length == typeParameters.length) {
           type = type.substitute2(typeArguments, typeParameters, newPrune);
         } else {
@@ -3838,7 +3634,8 @@
           p.name,
           newType,
           // ignore: deprecated_member_use_from_same_package
-          p.parameterKind);
+          p.parameterKind)
+        ..isExplicitlyCovariant = p.isCovariant;
     }
 
     return new _FunctionTypeImplStrict._(
diff --git a/pkg/analyzer/lib/src/dart/element/type_algebra.dart b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
index a6f3bc0..fede84b 100644
--- a/pkg/analyzer/lib/src/dart/element/type_algebra.dart
+++ b/pkg/analyzer/lib/src/dart/element/type_algebra.dart
@@ -84,6 +84,13 @@
   DartType substitute(DartType type) => substitution.substituteType(type);
 }
 
+/// Substitution that is based on the [map].
+abstract class MapSubstitution extends Substitution {
+  const MapSubstitution();
+
+  Map<TypeParameterElement, DartType> get map;
+}
+
 abstract class Substitution {
   static const Substitution empty = _NullSubstitution.instance;
 
@@ -95,6 +102,20 @@
     return new _TopSubstitutor(this, contravariant).visit(type);
   }
 
+  /// Substitutes both variables from [first] and [second], favoring those from
+  /// [first] if they overlap.
+  ///
+  /// Neither substitution is applied to the results of the other, so this does
+  /// *not* correspond to a sequence of two substitutions. For example,
+  /// combining `{T -> List<G>}` with `{G -> String}` does not correspond to
+  /// `{T -> List<String>}` because the result from substituting `T` is not
+  /// searched for occurrences of `G`.
+  static Substitution combine(Substitution first, Substitution second) {
+    if (first == _NullSubstitution.instance) return second;
+    if (second == _NullSubstitution.instance) return first;
+    return new _CombinedSubstitution(first, second);
+  }
+
   /// Substitutes the type parameters on the class of [type] with the
   /// type arguments provided in [type].
   static Substitution fromInterfaceType(InterfaceType type) {
@@ -109,7 +130,7 @@
     if (map.isEmpty) {
       return _NullSubstitution.instance;
     }
-    return new _MapSubstitution(map, map);
+    return new _MapSubstitution(map);
   }
 
   /// Substitutes the Nth parameter in [parameters] with the Nth type in
@@ -147,7 +168,20 @@
     if (upper.isEmpty && lower.isEmpty) {
       return _NullSubstitution.instance;
     }
-    return new _MapSubstitution(upper, lower);
+    return new _UpperLowerBoundsSubstitution(upper, lower);
+  }
+}
+
+class _CombinedSubstitution extends Substitution {
+  final Substitution first;
+  final Substitution second;
+
+  _CombinedSubstitution(this.first, this.second);
+
+  @override
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+    return first.getSubstitute(parameter, upperBound) ??
+        second.getSubstitute(parameter, upperBound);
   }
 }
 
@@ -172,28 +206,36 @@
   }
 }
 
-class _MapSubstitution extends Substitution {
-  final Map<TypeParameterElement, DartType> upper;
-  final Map<TypeParameterElement, DartType> lower;
+class _MapSubstitution extends MapSubstitution {
+  final Map<TypeParameterElement, DartType> map;
 
-  _MapSubstitution(this.upper, this.lower);
+  _MapSubstitution(this.map);
 
   DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
-    return upperBound ? upper[parameter] : lower[parameter];
+    return map[parameter];
   }
+
+  @override
+  String toString() => '_MapSubstitution($map)';
 }
 
-class _NullSubstitution extends Substitution {
+class _NullSubstitution extends MapSubstitution {
   static const _NullSubstitution instance = const _NullSubstitution();
 
   const _NullSubstitution();
 
+  @override
+  Map<TypeParameterElement, DartType> get map => const {};
+
   DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
     return new TypeParameterTypeImpl(parameter);
   }
 
   @override
   DartType substituteType(DartType type, {bool contravariant: false}) => type;
+
+  @override
+  String toString() => "Substitution.empty";
 }
 
 class _TopSubstitutor extends _TypeSubstitutor {
@@ -307,12 +349,7 @@
 
     var parameters = type.parameters.map((parameter) {
       var type = inner.visit(parameter.type);
-      return ParameterElementImpl.synthetic(
-        parameter.name,
-        type,
-        // ignore: deprecated_member_use_from_same_package
-        parameter.parameterKind,
-      );
+      return _parameterElement(parameter, type);
     }).toList();
 
     inner.invertVariance();
@@ -349,12 +386,7 @@
 
     var parameters = type.parameters.map((parameter) {
       var type = inner.visit(parameter.type);
-      return ParameterElementImpl.synthetic(
-        parameter.name,
-        type,
-        // ignore: deprecated_member_use_from_same_package
-        parameter.parameterKind,
-      );
+      return _parameterElement(parameter, type);
     }).toList();
 
     inner.invertVariance();
@@ -412,4 +444,32 @@
 
   @override
   DartType visitVoidType(VoidType type) => type;
+
+  static ParameterElementImpl _parameterElement(
+    ParameterElement parameter,
+    DartType type,
+  ) {
+    var result = ParameterElementImpl.synthetic(
+      parameter.name,
+      type,
+      // ignore: deprecated_member_use_from_same_package
+      parameter.parameterKind,
+    );
+    result.isExplicitlyCovariant = parameter.isCovariant;
+    return result;
+  }
+}
+
+class _UpperLowerBoundsSubstitution extends Substitution {
+  final Map<TypeParameterElement, DartType> upper;
+  final Map<TypeParameterElement, DartType> lower;
+
+  _UpperLowerBoundsSubstitution(this.upper, this.lower);
+
+  DartType getSubstitute(TypeParameterElement parameter, bool upperBound) {
+    return upperBound ? upper[parameter] : lower[parameter];
+  }
+
+  @override
+  String toString() => '_UpperLowerBoundsSubstitution($upper, $lower)';
 }
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index fa76944..136e290 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/dart/element/element.dart';
 
 /**
  * The hints and coding recommendations for best practices which are not
@@ -53,8 +52,8 @@
       "Dead code: this on-catch block will never be executed because '{0}' is "
           "a subtype of '{1}' and hence will have been caught above.",
       correction:
-          "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.");
 
   /**
    * Parameters:
@@ -72,7 +71,7 @@
   //
   // ```dart
   // void f(C c) {
-  //   c.!m!();
+  //   c.[!m!]();
   // }
   // ```
   //
@@ -82,25 +81,38 @@
   // should indicate what code to use in place of the deprecated code.
   static const HintCode DEPRECATED_MEMBER_USE = const HintCode(
       'DEPRECATED_MEMBER_USE', "'{0}' is deprecated and shouldn't be used.",
-      correction:
-          "Try replacing the use of the deprecated member with the replacement.");
+      correction: "Try replacing the use of the deprecated member with the "
+          "replacement.");
 
   /**
-   * Deprecated members should not be invoked or used from within the package
-   * where they are declared.
-   *
-   * Intentionally separate from DEPRECATED_MEMBER_USE, so that package owners
-   * can ignore same-package deprecate member use Hints if they like, and
-   * continue to see cross-package deprecated member use Hints.
-   *
    * Parameters:
    * 0: the name of the member
    */
-  static const HintCode DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE = const HintCode(
-      'DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE',
-      "'{0}' is deprecated and shouldn't be used.",
-      correction:
-          "Try replacing the use of the deprecated member with the replacement.");
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a deprecated library member or
+  // class member is used in the same package in which it's declared.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // @deprecated
+  // var x = 0;
+  // var y = [!x!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // The fix depends on what's been deprecated and what the replacement is. The
+  // documentation for deprecated declarations should indicate what code to use
+  // in place of the deprecated code.
+  static const HintCode DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE =
+      const HintCode('DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE',
+          "'{0}' is deprecated and shouldn't be used.",
+          correction: "Try replacing the use of the deprecated member with the "
+              "replacement.");
 
   /**
    * Users should not create a class named `Function` anymore.
@@ -201,7 +213,7 @@
    */
   static const HintCode INFERENCE_FAILURE_ON_COLLECTION_LITERAL = HintCode(
       'INFERENCE_FAILURE_ON_COLLECTION_LITERAL',
-      "The type argument(s) of '{0}' cannot be inferred.",
+      "The type argument(s) of '{0}' can't be inferred.",
       correction: "Use explicit type argument(s) for '{0}'.");
 
   /**
@@ -211,7 +223,7 @@
    */
   static const HintCode INFERENCE_FAILURE_ON_INSTANCE_CREATION = HintCode(
       'INFERENCE_FAILURE_ON_INSTANCE_CREATION',
-      "The type argument(s) of '{0}' cannot be inferred.",
+      "The type argument(s) of '{0}' can't be inferred.",
       correction: "Use explicit type argument(s) for '{0}'.");
 
   /**
@@ -221,7 +233,7 @@
   static const HintCode INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE =
       const HintCode(
           'INFERENCE_FAILURE_ON_UNINITIALIZED_VARIABLE',
-          "The type of {0} cannot be inferred without either a type or "
+          "The type of {0} can't be inferred without either a type or "
               "initializer.",
           correction: "Try specifying the type of the variable.");
 
@@ -274,7 +286,7 @@
   // The following code produces this diagnostic:
   //
   // ```dart
-  // !@literal!
+  // [!@literal!]
   // var x;
   // ```
   //
@@ -335,8 +347,10 @@
   /// 0: the name of the member
   /// 1: the name of the defining class
   static const HintCode INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER =
-      const HintCode('INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER',
-          "The member '{0}' can only be used within '{1}' or a template library.");
+      const HintCode(
+          'INVALID_USE_OF_VISIBLE_FOR_TEMPLATE_MEMBER',
+          "The member '{0}' can only be used within '{1}' or a template "
+              "library.");
 
   /// This hint is generated anywhere where a member annotated with
   /// `@visibleForTesting` is used outside the defining library, or a test.
@@ -432,14 +446,31 @@
       "The parameter '{0}' is required. {1}.");
 
   /**
-   * Generate a hint for methods or functions that have a return type, but do
-   * not have a non-void return statement on all branches. At the end of methods
-   * or functions with no return, Dart implicitly returns `null`, avoiding these
-   * implicit returns is considered a best practice.
-   *
    * Parameters:
    * 0: the name of the declared return type
    */
+  // #### Description
+  //
+  // Any function or method that doesn’t end with either an explicit return or a
+  // throw implicitly returns `null`. This is rarely the desired behavior. The
+  // analyzer produces this diagnostic when it finds an implicit return.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // [!int!] f(int x) {
+  //   if (x < 0) {
+  //     return 0;
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Add a return statement that makes the return value explicit, even if `null`
+  // is the appropriate value.
   static const HintCode MISSING_RETURN = const HintCode(
       'MISSING_RETURN',
       "This function has a return type of '{0}', but doesn't end with a "
@@ -453,8 +484,9 @@
    */
   static const HintCode MIXIN_ON_SEALED_CLASS = const HintCode(
       'MIXIN_ON_SEALED_CLASS',
-      "The class '{0}' should not be used as a mixin constraint because it is "
-          "sealed, and any class mixing in this mixin has '{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 has '{0}' as a "
+          "superclass.",
       correction:
           "Try composing with this class, or refer to its documentation for "
           "more information.");
@@ -479,7 +511,7 @@
   static const HintCode MUST_CALL_SUPER = const HintCode(
       'MUST_CALL_SUPER',
       "This method overrides a method annotated as @mustCallSuper in '{0}', "
-          "but does not invoke the overridden method.");
+          "but doesn't invoke the overridden method.");
 
   /**
    * Generate a hint for non-const instance creation using a constructor
@@ -498,8 +530,8 @@
   static const HintCode NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW =
       const HintCode(
           'NON_CONST_CALL_TO_LITERAL_CONSTRUCTOR_USING_NEW',
-          "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'.",
           correction: "Try replacing the 'new' keyword with 'const'.");
 
   /**
@@ -519,8 +551,8 @@
       "The value of the '?.' operator can be 'null', which isn't appropriate "
           "in a condition.",
       correction:
-          "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.");
 
   /**
    * A condition in operands of a logical operator could evaluate to `null`
@@ -597,7 +629,7 @@
    */
   static const HintCode SDK_VERSION_ASYNC_EXPORTED_FROM_CORE = const HintCode(
       'SDK_VERSION_ASYNC_EXPORTED_FROM_CORE',
-      "The class '{0}' was not exported from 'dart:core' until version 2.1, "
+      "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.",
       correction:
           "Try either importing 'dart:async' or updating the SDK constraints.");
@@ -619,20 +651,22 @@
    */
   static const HintCode SDK_VERSION_BOOL_OPERATOR = const HintCode(
       'SDK_VERSION_BOOL_OPERATOR',
-      "Using the operator '{0}' for 'bool's was not supported until version "
-          "2.3.2, but this code is required to be able to run on earlier versions.",
+      "Using the operator '{0}' for 'bool's wasn't supported until version "
+          "2.3.2, but this code is required to be able to run on earlier "
+          "versions.",
       correction: "Try updating the SDK constraints.");
 
   /**
    * The operator '==' is being used on non-primitive values in code that
    * is expected to run on versions of the SDK that did not support it.
    */
-  static const HintCode SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT = const HintCode(
-      'SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT',
-      "Using the operator '==' for non-primitive types was not supported until "
-          "version 2.3.2, but this code is required to be able to run on earlier "
-          "versions.",
-      correction: "Try updating the SDK constraints.");
+  static const HintCode SDK_VERSION_EQ_EQ_OPERATOR_IN_CONST_CONTEXT =
+      const 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.",
+          correction: "Try updating the SDK constraints.");
 
   /**
    * The operator '>>>' is being used in code that is expected to run on
@@ -640,7 +674,7 @@
    */
   static const HintCode SDK_VERSION_GT_GT_GT_OPERATOR = const HintCode(
       'SDK_VERSION_GT_GT_GT_OPERATOR',
-      "The operator '>>>' was not supported until version 2.3.2, but this code "
+      "The operator '>>>' wasn't supported until version 2.3.2, but this code "
           "is required to be able to run on earlier versions.",
       correction: "Try updating the SDK constraints.");
 
@@ -650,9 +684,9 @@
    */
   static const HintCode SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT = const HintCode(
       'SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT',
-      "The use of an is 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 is 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.",
       correction: "Try updating the SDK constraints.");
 
   /**
@@ -662,7 +696,7 @@
   //
   // The analyzer produces this diagnostic when a set literal is found in code
   // that has an SDK constraint whose lower bound is less than 2.2. Set literals
-  // were not supported in earlier versions, so this code won't be able to run
+  // weren't supported in earlier versions, so this code won't be able to run
   // against earlier versions of the SDK.
   //
   // #### Example
@@ -678,7 +712,7 @@
   // The following code generates this diagnostic:
   //
   // ```dart
-  // var s = !<int>{}!;
+  // var s = [!<int>{}!];
   // ```
   //
   // #### Common fixes
@@ -699,8 +733,8 @@
   // ```
   static const HintCode SDK_VERSION_SET_LITERAL = const HintCode(
       'SDK_VERSION_SET_LITERAL',
-      "Set literals weren't supported until version 2.2, "
-          "but this code must 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.",
       correction: "Try updating the SDK constraints.");
 
   /**
@@ -716,11 +750,22 @@
    */
   static const HintCode SDK_VERSION_UI_AS_CODE = const HintCode(
       'SDK_VERSION_UI_AS_CODE',
-      "The for, if and spread elements were not supported until version 2.2.2, "
+      "The for, if, and spread elements weren't supported until version 2.2.2, "
           "but this code is required to be able to run on earlier versions.",
       correction: "Try updating the SDK constraints.");
 
   /**
+   * The for, if or spread element is being used in a const context that is
+   * expected to run on versions of the SDK that did not support them.
+   */
+  static const HintCode SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT = const HintCode(
+      'SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT',
+      "The for, if and spread elements were not supported in const contexts "
+          "until version 2.5.0, but this code is required to be able to run on "
+          "earlier versions.",
+      correction: "Try updating the SDK constraints.");
+
+  /**
    * When "strict-raw-types" is enabled, raw types must be inferred via the
    * context type, or have type arguments.
    */
@@ -752,8 +797,8 @@
    */
   static const HintCode SUBTYPE_OF_SEALED_CLASS = const HintCode(
       'SUBTYPE_OF_SEALED_CLASS',
-      "The class '{0}' should not be extended, mixed in, or implemented "
-          "because it is sealed.",
+      "The class '{0}' shouldn't be extended, mixed in, or implemented because "
+          "it is sealed.",
       correction:
           "Try composing instead of inheriting, or refer to its documentation "
           "for more information.");
@@ -802,14 +847,6 @@
   static const HintCode UNNECESSARY_NO_SUCH_METHOD = const HintCode(
       'UNNECESSARY_NO_SUCH_METHOD', "Unnecessary 'noSuchMethod' declaration.",
       correction: "Try removing the declaration of 'noSuchMethod'.");
-  /**
-   * When the '?.' operator is used on a target that we know to be non-null,
-   * it is unnecessary.
-   */
-  static const HintCode UNNECESSARY_NULL_AWARE_CALL = const HintCode(
-      'UNNECESSARY_NULL_AWARE_CALL',
-      "The target expression cannot be null, and so '?.' is not necessary.",
-      correction: "Replace the '?.' with a '.' in the invocation.");
 
   /**
    * Unnecessary type checks, the result is always false.
@@ -832,7 +869,8 @@
    */
   static const HintCode UNUSED_CATCH_CLAUSE = const 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.",
       // TODO(brianwilkerson) Split this error code so that we can differentiate
       // between removing the catch clause and replacing the catch clause with
       // an on clause.
@@ -847,25 +885,88 @@
       correction: "Try removing the stack trace variable, or using it.");
 
   /**
-   * See [Modifier.IS_USED_IN_LIBRARY].
+   * Parameters:
+   * 0: the name that is declared but not referenced
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a private class, enum, mixin,
+  // typedef, top level variable, top level function, or method is declared but
+  // never referenced.
+  //
+  // #### Example
+  //
+  // Assuming that no code in the library references `_C`, the following code
+  // produces this diagnostic:
+  //
+  // ```dart
+  // class [!_C!] {}
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the declaration isn't needed, then remove it.
+  //
+  // If the declaration was intended to be used, then add the missing code.
   static const HintCode UNUSED_ELEMENT = const HintCode(
-      'UNUSED_ELEMENT', "The {0} '{1}' isn't used.",
-      correction: "Try removing the declaration of '{1}'.");
+      'UNUSED_ELEMENT', "The declaration '{0}' isn't referenced.",
+      correction: "Try removing the declaration of '{0}'.");
 
   /**
-   * Unused fields are fields which are never read.
+   * Parameters:
+   * 0: the name of the unused field
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a private field is declared but
+  // never read, even if it's written in one or more places.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class Point {
+  //   int [!_x!];
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the field isn't needed, then remove it.
+  //
+  // If the field was intended to be used, then add the missing code.
   static const HintCode UNUSED_FIELD = const HintCode(
       'UNUSED_FIELD', "The value of the field '{0}' isn't used.",
       correction: "Try removing the field, or using it.");
 
   /**
-   * Unused imports are imports which are never used.
-   *
    * Parameters:
-   * 0: The content of the unused import's uri
+   * 0: the content of the unused import's uri
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an import isn't needed because
+  // none of the names that are imported are referenced within the importing
+  // library.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // import [!'dart:async'!];
+  //
+  // void main() {
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the import isn't needed, then remove it.
+  //
+  // If some of the imported names are intended to be used, then add the missing
+  // code.
   static const HintCode UNUSED_IMPORT = const HintCode(
       'UNUSED_IMPORT', "Unused import: '{0}'.",
       correction: "Try removing the import directive.");
@@ -880,8 +981,29 @@
               "using it in either a 'break' or 'continue' statement.");
 
   /**
-   * Unused local variables are local variables that are never read.
+   * Parameters:
+   * 0: the name of the unused variable
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a local variable is declared but
+  // never read, even if it's written in one or more places.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // void main() {
+  //   int [!count!] = 0;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the variable isn't needed, then remove it.
+  //
+  // If the variable was intended to be used, then add the missing code.
   static const HintCode UNUSED_LOCAL_VARIABLE = const HintCode(
       'UNUSED_LOCAL_VARIABLE',
       "The value of the local variable '{0}' isn't used.",
diff --git a/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
new file mode 100644
index 0000000..964531c
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/ast_rewrite.dart
@@ -0,0 +1,201 @@
+// 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/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/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/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+
+/// A visitor that will re-write an AST to support the optional `new` and
+/// `const` feature.
+class AstRewriteVisitor extends ScopedVisitor {
+  final bool addConstKeyword;
+  final TypeSystem typeSystem;
+
+  /// Initialize a newly created visitor.
+  AstRewriteVisitor(
+      this.typeSystem,
+      LibraryElement definingLibrary,
+      Source source,
+      TypeProvider typeProvider,
+      AnalysisErrorListener errorListener,
+      {Scope nameScope,
+      this.addConstKeyword: false})
+      : super(definingLibrary, source, typeProvider, errorListener,
+            nameScope: nameScope);
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    super.visitMethodInvocation(node);
+
+    SimpleIdentifier methodName = node.methodName;
+    if (methodName.isSynthetic) {
+      // This isn't a constructor invocation because the method name is
+      // synthetic.
+      return;
+    }
+
+    Expression target = node.target;
+    if (target == null) {
+      // Possible cases: C() or C<>()
+      if (node.realTarget != null) {
+        // This isn't a constructor invocation because it's in a cascade.
+        return;
+      }
+      Element element = nameScope.lookup(methodName, definingLibrary);
+      if (element is ClassElement) {
+        AstFactory astFactory = new AstFactoryImpl();
+        TypeName typeName = astFactory.typeName(methodName, node.typeArguments);
+        ConstructorName constructorName =
+            astFactory.constructorName(typeName, null, null);
+        InstanceCreationExpression instanceCreationExpression =
+            astFactory.instanceCreationExpression(
+                _getKeyword(node), constructorName, node.argumentList);
+        NodeReplacer.replace(node, instanceCreationExpression);
+      } else if (element is ExtensionElement) {
+        AstFactory astFactory = new AstFactoryImpl();
+        ExtensionOverride extensionOverride = astFactory.extensionOverride(
+            extensionName: methodName,
+            typeArguments: node.typeArguments,
+            argumentList: node.argumentList);
+        NodeReplacer.replace(node, extensionOverride);
+      }
+    } else if (target is SimpleIdentifier) {
+      // Possible cases: C.n(), p.C() or p.C<>()
+      if (node.operator.type == TokenType.QUESTION_PERIOD) {
+        // This isn't a constructor invocation because a null aware operator is
+        // being used.
+      }
+      Element element = nameScope.lookup(target, definingLibrary);
+      if (element is ClassElement) {
+        // Possible case: C.n()
+        var constructorElement = element.getNamedConstructor(methodName.name);
+        if (constructorElement != null) {
+          var typeArguments = node.typeArguments;
+          if (typeArguments != null) {
+            errorReporter.reportErrorForNode(
+                StaticTypeWarningCode
+                    .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+                typeArguments,
+                [element.name, constructorElement.name]);
+          }
+          AstFactory astFactory = new AstFactoryImpl();
+          TypeName typeName = astFactory.typeName(target, null);
+          ConstructorName constructorName =
+              astFactory.constructorName(typeName, node.operator, methodName);
+          InstanceCreationExpression instanceCreationExpression =
+              astFactory.instanceCreationExpression(
+                  _getKeyword(node), constructorName, node.argumentList,
+                  typeArguments: typeArguments);
+          NodeReplacer.replace(node, instanceCreationExpression);
+        }
+      } else if (element is PrefixElement) {
+        // Possible cases: p.C() or p.C<>()
+        AstFactory astFactory = new AstFactoryImpl();
+        Identifier identifier = astFactory.prefixedIdentifier(
+            astFactory.simpleIdentifier(target.token),
+            null,
+            astFactory.simpleIdentifier(methodName.token));
+        Element prefixedElement = nameScope.lookup(identifier, definingLibrary);
+        if (prefixedElement is ClassElement) {
+          TypeName typeName = astFactory.typeName(
+              astFactory.prefixedIdentifier(target, node.operator, methodName),
+              node.typeArguments);
+          ConstructorName constructorName =
+              astFactory.constructorName(typeName, null, null);
+          InstanceCreationExpression instanceCreationExpression =
+              astFactory.instanceCreationExpression(
+                  _getKeyword(node), constructorName, node.argumentList);
+          NodeReplacer.replace(node, instanceCreationExpression);
+        } else if (prefixedElement is ExtensionElement) {
+          AstFactory astFactory = new AstFactoryImpl();
+          PrefixedIdentifier extensionName =
+              astFactory.prefixedIdentifier(target, node.operator, methodName);
+          ExtensionOverride extensionOverride = astFactory.extensionOverride(
+              extensionName: extensionName,
+              typeArguments: node.typeArguments,
+              argumentList: node.argumentList);
+          NodeReplacer.replace(node, extensionOverride);
+        }
+      }
+    } else if (target is PrefixedIdentifier) {
+      // Possible case: p.C.n()
+      Element prefixElement = nameScope.lookup(target.prefix, definingLibrary);
+      target.prefix.staticElement = prefixElement;
+      if (prefixElement is PrefixElement) {
+        Element element = nameScope.lookup(target, definingLibrary);
+        if (element is ClassElement) {
+          var constructorElement = element.getNamedConstructor(methodName.name);
+          if (constructorElement != null) {
+            var typeArguments = node.typeArguments;
+            if (typeArguments != null) {
+              errorReporter.reportErrorForNode(
+                  StaticTypeWarningCode
+                      .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
+                  typeArguments,
+                  [element.name, constructorElement.name]);
+            }
+            AstFactory astFactory = new AstFactoryImpl();
+            TypeName typeName = astFactory.typeName(target, typeArguments);
+            ConstructorName constructorName =
+                astFactory.constructorName(typeName, node.operator, methodName);
+            InstanceCreationExpression instanceCreationExpression =
+                astFactory.instanceCreationExpression(
+                    _getKeyword(node), constructorName, node.argumentList);
+            NodeReplacer.replace(node, instanceCreationExpression);
+          }
+        }
+      }
+    }
+  }
+
+  /// Return the token that should be used in the [InstanceCreationExpression]
+  /// that corresponds to the given invocation [node].
+  Token _getKeyword(MethodInvocation node) {
+    return addConstKeyword
+        ? new KeywordToken(Keyword.CONST, node.offset)
+        : null;
+  }
+
+  /// Return the type of the given class [element] after substituting any type
+  /// arguments from the list of [typeArguments] for the class' type parameters.
+  static InterfaceType getType(TypeSystem typeSystem, ClassElement element,
+      TypeArgumentList typeArguments) {
+    DartType type = element.type;
+
+    List<TypeParameterElement> typeParameters = element.typeParameters;
+    if (typeParameters.isEmpty) {
+      return type;
+    }
+
+    if (typeArguments == null) {
+      return typeSystem.instantiateToBounds(type);
+    }
+
+    List<DartType> argumentTypes;
+    if (typeArguments.arguments.length == typeParameters.length) {
+      argumentTypes = typeArguments.arguments
+          .map((TypeAnnotation argument) => argument.type)
+          .toList();
+    } else {
+      argumentTypes = List<DartType>.filled(
+          typeParameters.length, DynamicTypeImpl.instance);
+    }
+    List<DartType> parameterTypes = typeParameters
+        .map((TypeParameterElement parameter) => parameter.type)
+        .toList();
+    return type.substitute2(argumentTypes, parameterTypes);
+  }
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart b/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
deleted file mode 100644
index bcf3d5e..0000000
--- a/pkg/analyzer/lib/src/dart/resolver/definite_assignment.dart
+++ /dev/null
@@ -1,779 +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/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:meta/meta.dart';
-
-/// Object that tracks "assigned" status for local variables in a function body.
-///
-/// The client should create a new instance of tracker for a function body.
-///
-/// Each declared local variable must be added using [add].  If the variable
-/// is assigned at the declaration, it is not actually tracked.
-///
-/// For each read of a local variable [read] should be invoked, and for each
-/// write - [write].  If there is a  "read" of a variable before it is
-/// definitely written, the variable is added to output [readBeforeWritten].
-///
-/// For each AST node that affects definite assignment the client must invoke
-/// corresponding `beginX` and `endX` methods.  They will combine assignment
-/// facts registered in parts of AST. These invocations are expected to be
-/// performed as a part of the resolution pass over the AST.
-///
-/// In the examples below, Dart code is listed on the left, and the set of
-/// calls that need to be made to [DefiniteAssignmentTracker] are listed on
-/// the right.
-///
-///
-/// --------------------------------------------------
-/// Assignments.
-///
-/// When the LHS is a local variable, and the assignment is pure, i.e. uses
-/// operators `=` and `??=`, only the RHS is executed, and then the
-/// variable on the LHS is marked as definitely assigned.
-///
-/// ```dart
-/// int V1;      // add(V1)
-/// int V2;      // add(V2)
-/// V1 = 0;      // write(V1)
-/// V2 = V2;     // read(V2) => readBeforeWritten; write(V2)
-/// V1;          // read(V1) => OK
-/// V2;          // read(V2) => readBeforeWritten (already)
-/// ```
-///
-/// In compound assignments to a local variable, or assignments where the LHS
-/// is not a simple identifier, the LHS is executed first, and then the RHS.
-///
-/// ```dart
-/// int V1;                 // add(V1)
-/// List<int> V2;           // add(V2)
-/// V1 += 1;                // read(V1) => readBeforeWritten; write(V1)
-/// V2[0] = (V2 = [0])[0];  // read(V2) => readBeforeWritten; write(V2)
-/// V1;                     // read(V1) => readBeforeWritten (already)
-/// V2;                     // read(V2) => readBeforeWritten (already)
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Logical expression.
-///
-/// In logical expressions `a && b` or `a || b` only `a` is always executed,
-/// in the enclosing branch.  The expression `b` might not be executed, so its
-/// results are on the exit from the logical expression.
-///
-/// ```dart
-/// int V1;      // add(V1)
-/// int V2;      // add(V2)
-/// (
-///   V1 = 1     // write(V1)
-/// ) > 0
-/// &&           // beginBinaryExpressionLogicalRight()
-/// (
-///   V2 = V1    // read(V1) => OK; write(V2)
-/// ) > 0
-/// ;            // endBinaryExpressionLogicalRight()
-/// V1;          // read(V1) => OK
-/// V2;          // read(V2) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// assert(C, M)
-///
-/// The `assert` statement is not guaranteed to execute, so assignments in the
-/// condition and the message are discarded.  But assignments in the condition
-/// are visible in the message.
-///
-/// ```dart
-/// bool V;    // add(V)
-/// assert(    // beginAssertStatement()
-///   V        // read(V) => readBeforeWritten
-/// );         // endAssertExpression()
-/// V          // read(V) => readBeforeWritten
-/// ```
-///
-/// ```dart
-/// bool V;      // add(V)
-/// assert(      // beginAssertExpression()
-///   V = true,  // write(V)
-///   "$V",      // read(V) => OK
-/// );           // endAssertExpression()
-/// V            // read(V) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// if (E) {} else {}
-///
-/// The variable must be assigned in the `then` branch, and the `else` branch.
-///
-/// The condition `E` contributes into the current branch.
-///
-/// ```dart
-/// int V1;     // add(V1)
-/// int V2;     // add(V2)
-/// int V3;     // add(V3)
-/// if (E)
-/// {           // beginIfStatementThen()
-///   V1 = 0;   // write(V1)
-///   V2 = 0;   // write(V2)
-///   V1;       // read(V1) => OK
-///   V2;       // read(V2) => OK
-/// } else {    // beginIfStatementElse()
-///   V1 = 0;   // write(V1)
-///   V3 = 0;   // write(V3)
-///   V1;       // read(V1) => OK
-///   V3;       // read(V3) => OK
-/// }           // endIfStatement(hasElse: true)
-/// V1;         // read(V1) => OK
-/// V2;         // read(V2) => readBeforeWritten
-/// V3;         // read(V3) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// while (E) {}
-///
-/// If `E` is not the `true` literal, which is covered below, then the body of
-/// the loop might be not executed at all.  So, the fork is discarded.
-///
-/// The condition `E` contributes into the current branch.
-///
-/// ```dart
-/// int V;      // add(V)
-/// while (     // beginWhileStatement(labels: [])
-///   E
-/// ) {         // beginWhileStatementBody(isTrue: false)
-///   V = 0;    // write(V)
-///   V;        // read(V) => OK
-/// }           // endWhileStatement()
-/// V;          // read(V) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// while (true) { ...break... }
-///
-/// Statements `break` and `continue` in loops make the rest of the enclosing
-/// (or labelled) loop ineligible for marking variables definitely assigned
-/// outside of the loop. However it is still OK to mark variables assigned and
-/// use their values in the rest of the loop.
-///
-/// ```dart
-/// int V;
-/// while (             // beginWhileStatement(labels: [])
-///   true
-/// ) {                 // beginWhileStatementBody(isTrue: true)
-///   if (condition) {  // beginIfStatement(hasElse: false)
-///     break;          // handleBreak(while);
-///   }                 // endIfStatement()
-///   V = 0;            // write(V)
-///   V;                // read(V) => OK
-/// }                   // endWhileStatement()
-/// V;                  // read(V) => readBeforeWritten
-/// ```
-///
-/// Nested loops:
-///
-/// ```dart
-/// int V1, V2;
-/// L1: while (         // beginWhileStatement(node)
-///   true
-/// ) {                 // beginWhileStatementBody(isTrue: true)
-///   while (           // beginWhileStatement(labels: [])
-///     true
-///   ) {               // beginWhileStatementBody()
-///     if (C1) {       // beginIfStatement(hasElse: true)
-///       V1 = 0;       // write(V1)
-///     } else {        // beginIfStatementElse()
-///       if (C2) {     // beginIfStatement(hasElse: false)
-///         break L1;   // handleBreak(L1: while)
-///       }             // endIfStatement()
-///       V1 = 0;       // write(V1)
-///     }               // endIfStatement()
-///     V1;             // read(V1) => OK
-///   }                 // endWhileStatement()
-///   V1;               // read(V1) => OK
-///   while (           // beginWhileStatement(node)
-///     true
-///   ) {               // beginWhileStatementBody(isTrue: true)
-///     V2 = 0;         // write(V2)
-///     break;          // handleBreak(while)
-///   }                 // endWhileStatement()
-///   V1;               // read(V1) => OK
-///   V2;               // read(V2) => OK
-/// }                   // endWhileStatement()
-/// V1;                 // read(V1) => readBeforeWritten
-/// V2;                 // read(V2) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// do {} while (E)
-///
-/// The body and the condition always execute, all assignments contribute to
-/// the current branch.  The body is tracked in its own branch, so that if
-/// it has an interruption (`break` or `continue`), we can discard the branch
-/// after or before the condition.
-///
-/// ```dart
-/// int V1;                  // add(V1)
-/// int V2;                  // add(V2)
-/// do {                     // beginDoWhileStatement(node)
-///   V1 = 0;                // write(V1)
-///   V1;                    // read(V1) => OK
-/// } while                  // beginDoWhileStatementCondition()
-///   ((V2 = 0) >= 0)        // write(V2)
-/// ;                        // endDoWhileStatement()
-/// V1;                      // read(V1) => OK
-/// V2;                      // read(V2) => OK
-/// ```
-///
-///
-/// --------------------------------------------------
-/// do { ...break... } while (E)
-///
-/// The `break` statement prevents execution of the rest of the body, and
-/// the condition.  So, the branch ends after the condition.
-///
-/// ```dart
-/// int V1;                  // add(V1)
-/// int V2;                  // add(V2)
-/// int V3;                  // add(V3)
-/// do {                     // beginDoWhileStatement(node)
-///   V1 = 0;                // write(V1)
-///   V1;                    // read(V1) => OK
-///   if (C1) break;         // handleBreak(do)
-///   V2 = 0;                // write(V2)
-///   V2;                    // read(V2) => OK
-/// } while                  // beginDoWhileStatementCondition()
-///   ((V3 = 0) >= 0)        // write(V3)
-/// ;                        // endDoWhileStatement()
-/// V1;                      // read(V1) => OK
-/// V2;                      // read(V2) => readBeforeWritten
-/// V3;                      // read(V3) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// do { ...continue... } while (E)
-///
-/// The `continue` statement prevents execution of the rest of the body, but
-/// the condition is always executed.  So, the branch ends before the condition,
-/// and the condition contributes to the enclosing branch.
-///
-/// ```dart
-/// int V1;                  // add(V1)
-/// int V2;                  // add(V2)
-/// int V3;                  // add(V3)
-/// do {                     // beginDoWhileStatement(node)
-///   V1 = 0;                // write(V1)
-///   V1;                    // read(V1) => OK
-///   if (C1) continue;      // handleContinue(do)
-///   V2 = 0;                // write(V2)
-///   V2;                    // read(V2) => OK
-/// } while                  // beginDoWhileStatementCondition()
-///   ((V3 = 0) >= 0)        // write(V3)
-/// ;                        // endDoWhileStatement()
-/// V1;                      // read(V1) => OK
-/// V2;                      // read(V2) => readBeforeWritten
-/// V3;                      // read(V3) => OK
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Try / catch.
-///
-/// The variable must be assigned in the `try` branch and every `catch` branch.
-///
-/// Note, that an improvement is possible, when some first statements in the
-/// `try` branch can be shown to not throw (e.g. `V = 0;`). We could consider
-/// these statements as definitely executed, so producing definite assignments.
-///
-/// ```dart
-/// int V;        // add(V)
-/// try {         // beginTryStatement()
-///   V = f();    // write(V)
-/// }             // endTryStatementBody()
-/// catch (_) {   // beginTryStatementCatchClause()
-///   V = 0;      // write(V)
-/// }             // endTryStatementCatchClause(); endTryStatementCatchClauses()
-/// V;            // read(V) => OK
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Try / finally.
-///
-/// The `finally` clause is always executed, so it is tracked in the branch
-/// that contains the `try` statement.
-///
-/// Without `catch` clauses the `try` clause is always executed to the end,
-/// so also can be tracked in the branch that contains the `try` statement.
-///
-/// ```dart
-/// int V1;     // add(V1)
-/// int V2;     // add(V2)
-/// try {       // beginTryStatement()
-///   V1 = 0;   // write(V1)
-/// }           // endTryStatementBody(); endTryStatementCatchClauses();
-/// finally {
-///   V2 = 0;   // write(V2)
-/// }
-/// V1;         // read(V1) => OK
-/// V2;         // read(V2) => OK
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Try / catch / finally.
-///
-/// The `finally` clause is always executed, so it is tracked in the branch
-/// that contains the `try` statement.
-///
-/// The `try` and `catch` branches are tracked as without `finally`.
-///
-///
-/// --------------------------------------------------
-/// switch (E) { case E1: ... default: }
-///
-/// The variable must be assigned in every `case` branch and must have the
-/// `default` branch.  If the `default` branch is missing, then the `switch`
-/// does not definitely cover all possible values of `E`, so the variable is
-/// not definitely assigned.
-///
-/// The expression `E` contributes into the current branch.
-///
-/// ```dart
-/// int V;      // add(V)
-/// switch      // beginSwitchStatement()
-/// (E) {       // endSwitchStatementExpression()
-///   case 1:   // beginSwitchStatementMember()
-///     V = 0;  // write(V)
-///     break;  // handleBreak(switch)
-///   default:  // beginSwitchStatementMember()
-///     V = 0;  // write(V); handleBreak(switch)
-/// }           // endSwitchStatement(hasDefault: true)
-/// V;          // read(V) => OK
-/// ```
-///
-/// The presence of a `continue L` statement in switch / case is analyzed in an
-/// approximate way; if a given variable is not written to in all case bodies,
-/// it is considered "not definitely assigned", even though a full basic block
-/// analysis would show that it is definitely assigned.
-///
-/// ```dart
-/// int V;           // add(V)
-/// switch           // beginSwitchStatement()
-/// (E) {            // endSwitchStatementExpression()
-///   L: case 1:     // beginSwitchStatementMember()
-///     V = 0;       // write(V)
-///     break;       // handleBreak(switch)
-///   case 2:        // beginSwitchStatementMember()
-///     continue L;  // handleContinue(switch)
-///   default:       // beginSwitchStatementMember()
-///     V = 0;       // write(V); handleBreak(switch)
-/// }                // endSwitchStatement(hasDefault: true)
-/// V;               // read(V) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// For each.
-///
-/// The iterable might be empty, so the body might be not executed, so writes
-/// in the body are discarded.  But writes in the iterable expressions are
-/// always executed.
-///
-/// ```dart
-/// int V1;     // add(V1)
-/// int V2;     // add(V2)
-/// for (var _ in (V1 = [0, 1, 2]))  // beginForEachStatement(node)
-/// {                                // beginForEachStatementBody()
-///   V2 = 0;                        // write(V1)
-/// }                                // endForEachStatement();
-/// V1;         // read(V1) => OK
-/// V2;         // read(V2) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// For statement.
-///
-/// Very similar to `while` statement.  The initializer and condition parts
-/// are always executed, so contribute to definite assignments.  The body and
-/// updaters might be not executed, so writes in them are discarded.  The
-/// updaters are executed after the body, so writes in the body are visible in
-/// the updaters, correspondingly AST portions should be visited, and
-/// [beginForEachStatementBody] should be before [beginForStatementUpdaters],
-/// and followed with [endForStatement].
-///
-/// ```dart
-/// int V1;     // 1. add(V1)
-/// int V2;     // 2. add(V2)
-/// int V3;     // 3. add(V3)
-/// int V4;     // 4. add(V4)
-/// for (                //  5. beginForStatement(node)
-///   var _ = (V1 = 0);  //  6. write(V1)
-///   (V2 = 0) >= 0;     //  7. write(V2)
-///   V3 = 0             // 10. beginForStatementUpdaters(); write(V3)
-/// ) {                  //  8. beginForStatementBody()
-///   V4 = 0;            //  9. write(V4)
-/// }                    // 11. endForStatement()
-/// V1;         // 12. read(V1) => OK
-/// V2;         // 13. read(V2) => OK
-/// V3;         // 14. read(V3) => readBeforeWritten
-/// V4;         // 15. read(V4) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Function expressions - local functions and closures.
-///
-/// A function expression, e.g. a closure passed as an argument of an
-/// invocation, might be invoked synchronously, asynchronously, or never.
-/// So, all local variables that are read in the function expression must be
-/// definitely assigned, but any writes should be discarded on exit from the
-/// function expression.
-///
-/// ```dart
-/// int V1;     // add(V1)
-/// int V2;     // add(V2)
-/// int V3;     // add(V2)
-/// V1 = 0;     // write(V1)
-/// void f() {  // beginFunctionExpression()
-///   V1;       // read(V1) => OK
-///   V2;       // read(V2) => readBeforeWritten
-///   V3 = 0;   // write(V1)
-/// }           // endFunctionExpression();
-/// V2 = 0;     // write(V2)
-/// f();
-/// V1;         // read(V1) => OK
-/// V2;         // read(V2) => OK
-/// V3;         // read(V3) => readBeforeWritten
-/// ```
-///
-///
-/// --------------------------------------------------
-/// Definite exit.
-///
-/// If a definite exit is reached, e.g. a `return` or a `throw` statement,
-/// then all the variables are vacuously definitely assigned.
-///
-/// ```dart
-/// int V;      // add(V)
-/// if (E) {
-/// {           // beginIfStatementThen()
-///   V = 0;    // write(V)
-/// } else {    // beginIfStatementElse()
-///   return;   // handleExit()
-/// }           // endIfStatement(hasElse: true)
-/// V;          // read(V) => OK
-/// ```
-class DefiniteAssignmentTracker {
-  /// The output list of variables that were read before they were written.
-  final List<LocalVariableElement> readBeforeWritten = [];
-
-  /// The stack of sets of variables that are not definitely assigned.
-  final List<_ElementSet> _stack = [];
-
-  /// The mapping from labeled [Statement]s to the index in the [_stack]
-  /// where the first related element is located.  The number of elements
-  /// is statement specific.
-  final Map<Statement, int> _statementToStackIndex = {};
-
-  /// The current set of variables that are not definitely assigned.
-  _ElementSet _current = _ElementSet.empty;
-
-  @visibleForTesting
-  bool get isRootBranch {
-    return _stack.isEmpty;
-  }
-
-  /// Add a new [variable], which might be already [assigned].
-  void add(LocalVariableElement variable, {bool assigned: false}) {
-    if (!assigned) {
-      _current = _current.add(variable);
-    }
-  }
-
-  void beginAssertStatement() {
-    _stack.add(_current);
-  }
-
-  void beginBinaryExpressionLogicalRight() {
-    _stack.add(_current);
-  }
-
-  void beginConditionalExpressionElse() {
-    var afterCondition = _stack.last;
-    _stack.last = _current; // after then
-    _current = afterCondition;
-  }
-
-  void beginConditionalExpressionThen() {
-    _stack.add(_current); // after condition
-  }
-
-  void beginDoWhileStatement(DoStatement statement) {
-    _statementToStackIndex[statement] = _stack.length;
-    _stack.add(_ElementSet.empty); // break set
-    _stack.add(_ElementSet.empty); // continue set
-  }
-
-  void beginDoWhileStatementCondition() {
-    var continueSet = _stack.removeLast();
-    // If there was a `continue`, use it.
-    // If there was not any, use the current.
-    _current = _current.union(continueSet);
-  }
-
-  void beginForStatement2(ForStatement statement) {
-    // Not strongly necessary, because we discard everything anyway.
-    // Just for consistency, so that `break` is handled without `null`.
-    _statementToStackIndex[statement] = _stack.length;
-  }
-
-  void beginForStatement2Body() {
-    _stack.add(_current); // break set
-    _stack.add(_ElementSet.empty); // continue set
-  }
-
-  void beginForStatementUpdaters() {
-    var continueSet = _stack.last;
-    _current = _current.union(continueSet);
-  }
-
-  void beginFunctionExpression() {
-    _stack.add(_current);
-  }
-
-  void beginIfStatementElse() {
-    var enclosing = _stack.last;
-    _stack.last = _current;
-    _current = enclosing;
-  }
-
-  void beginIfStatementThen() {
-    _stack.add(_current);
-  }
-
-  void beginSwitchStatement(SwitchStatement statement) {
-    _statementToStackIndex[statement] = _stack.length;
-    _stack.add(_ElementSet.empty); // break set
-    _stack.add(_ElementSet.empty); // continue set (placeholder)
-  }
-
-  void beginSwitchStatementMember() {
-    _current = _stack.last; // before cases
-  }
-
-  void beginTryStatement() {
-    _stack.add(_current); // before body, for catches
-  }
-
-  void beginTryStatementCatchClause() {
-    _current = _stack[_stack.length - 2]; // before body
-  }
-
-  void beginWhileStatement(WhileStatement statement) {
-    _statementToStackIndex[statement] = _stack.length;
-  }
-
-  void beginWhileStatementBody(bool isTrue) {
-    _stack.add(isTrue ? _ElementSet.empty : _current); // break set
-    _stack.add(_ElementSet.empty); // continue set
-  }
-
-  void endAssertStatement() {
-    _current = _stack.removeLast();
-  }
-
-  void endBinaryExpressionLogicalRight() {
-    _current = _stack.removeLast();
-  }
-
-  void endConditionalExpression() {
-    var thenSet = _stack.removeLast();
-    var elseSet = _current;
-    _current = thenSet.union(elseSet);
-  }
-
-  void endDoWhileStatement() {
-    var breakSet = _stack.removeLast();
-    // If there was a `break`, use it.
-    // If there was not any, use the current.
-    _current = _current.union(breakSet);
-  }
-
-  void endForStatement2() {
-    _stack.removeLast(); // continue set
-    _current = _stack.removeLast(); // break set, before body
-  }
-
-  void endFunctionExpression() {
-    _current = _stack.removeLast();
-  }
-
-  void endIfStatement(bool hasElse) {
-    if (hasElse) {
-      var thenSet = _stack.removeLast();
-      var elseSet = _current;
-      _current = thenSet.union(elseSet);
-    } else {
-      var afterCondition = _stack.removeLast();
-      _current = afterCondition;
-    }
-  }
-
-  void endSwitchStatement(bool hasDefault) {
-    var beforeCasesSet = _stack.removeLast();
-    _stack.removeLast(); // continue set
-    var breakSet = _stack.removeLast();
-    if (hasDefault) {
-      _current = breakSet;
-    } else {
-      _current = beforeCasesSet;
-    }
-  }
-
-  void endSwitchStatementExpression() {
-    _stack.add(_current); // before cases
-  }
-
-  void endTryStatementBody() {
-    _stack.add(_current); // union of body and catches
-  }
-
-  void endTryStatementCatchClause() {
-    _stack.last = _stack.last.union(_current); // union of body and catches
-  }
-
-  void endTryStatementCatchClauses() {
-    _current = _stack.removeLast(); // union of body and catches
-    _stack.removeLast(); // before body
-  }
-
-  void endWhileStatement() {
-    _stack.removeLast(); // continue set
-    _current = _stack.removeLast(); // break set
-  }
-
-  /// Handle a `break` statement with the given [target].
-  void handleBreak(AstNode target) {
-    var breakSetIndex = _statementToStackIndex[target];
-    if (breakSetIndex != null) {
-      _stack[breakSetIndex] = _stack[breakSetIndex].union(_current);
-    }
-    _current = _ElementSet.empty;
-  }
-
-  /// Handle a `continue` statement with the given [target].
-  void handleContinue(AstNode target) {
-    var breakSetIndex = _statementToStackIndex[target];
-    if (breakSetIndex != null) {
-      var continueSetIndex = breakSetIndex + 1;
-      _stack[continueSetIndex] = _stack[continueSetIndex].union(_current);
-    }
-    _current = _ElementSet.empty;
-  }
-
-  /// Register the fact that the current branch definitely exists, e.g. returns
-  /// from the body, throws an exception, etc.  So, all variables in the branch
-  /// are vacuously definitely assigned.
-  void handleExit() {
-    _current = _ElementSet.empty;
-  }
-
-  /// Register read of the given [variable] in the current branch.
-  void read(LocalVariableElement variable) {
-    if (_current.contains(variable)) {
-      // Add to the list of violating variables, if not there yet.
-      for (var i = 0; i < readBeforeWritten.length; ++i) {
-        var violatingVariable = readBeforeWritten[i];
-        if (identical(violatingVariable, variable)) {
-          return;
-        }
-      }
-      readBeforeWritten.add(variable);
-    }
-  }
-
-  /// Register write of the given [variable] in the current branch.
-  void write(LocalVariableElement variable) {
-    _current = _current.remove(variable);
-  }
-}
-
-/// List based immutable set of elements.
-class _ElementSet {
-  static final empty = _ElementSet._(
-    List<LocalVariableElement>(0),
-  );
-
-  final List<LocalVariableElement> elements;
-
-  _ElementSet._(this.elements);
-
-  _ElementSet add(LocalVariableElement addedElement) {
-    if (contains(addedElement)) {
-      return this;
-    }
-
-    var length = elements.length;
-    var newElements = List<LocalVariableElement>(length + 1);
-    for (var i = 0; i < length; ++i) {
-      newElements[i] = elements[i];
-    }
-    newElements[length] = addedElement;
-    return _ElementSet._(newElements);
-  }
-
-  bool contains(LocalVariableElement element) {
-    var length = elements.length;
-    for (var i = 0; i < length; ++i) {
-      if (identical(elements[i], element)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  _ElementSet remove(LocalVariableElement removedElement) {
-    if (!contains(removedElement)) {
-      return this;
-    }
-
-    var length = elements.length;
-    if (length == 1) {
-      return empty;
-    }
-
-    var newElements = List<LocalVariableElement>(length - 1);
-    var newIndex = 0;
-    for (var i = 0; i < length; ++i) {
-      var element = elements[i];
-      if (!identical(element, removedElement)) {
-        newElements[newIndex++] = element;
-      }
-    }
-
-    return _ElementSet._(newElements);
-  }
-
-  _ElementSet union(_ElementSet other) {
-    if (other == null || other.elements.isEmpty) {
-      return this;
-    }
-
-    var result = this;
-    var otherElements = other.elements;
-    for (var i = 0; i < otherElements.length; ++i) {
-      var otherElement = otherElements[i];
-      result = result.add(otherElement);
-    }
-    return result;
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index a0d6371..0b10058 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -178,6 +178,9 @@
       _nodeExits(node.expression);
 
   @override
+  bool visitExtensionOverride(ExtensionOverride node) => false;
+
+  @override
   bool visitForElement(ForElement node) {
     bool outerBreakValue = _enclosingBlockContainsBreak;
     _enclosingBlockContainsBreak = false;
@@ -509,7 +512,7 @@
         // For switch members with no statements, don't visit the children.
         // Otherwise, if there children statements don't exit, mark this as a
         // non-exiting case.
-        if (!switchMember.statements.isEmpty && !switchMember.accept(this)) {
+        if (switchMember.statements.isNotEmpty && !switchMember.accept(this)) {
           hasNonExitingCase = true;
         }
       }
diff --git a/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
new file mode 100644
index 0000000..e7b0ca8
--- /dev/null
+++ b/pkg/analyzer/lib/src/dart/resolver/extension_member_resolver.dart
@@ -0,0 +1,454 @@
+// 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/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/type_system.dart';
+
+class ExtensionMemberResolver {
+  final ResolverVisitor _resolver;
+
+  ExtensionMemberResolver(this._resolver);
+
+  DartType get _dynamicType => _typeProvider.dynamicType;
+
+  ErrorReporter get _errorReporter => _resolver.errorReporter;
+
+  Scope get _nameScope => _resolver.nameScope;
+
+  TypeProvider get _typeProvider => _resolver.typeProvider;
+
+  TypeSystem get _typeSystem => _resolver.typeSystem;
+
+  /// Return the most specific extension in the current scope for this [type],
+  /// that defines the member with the the [name] and [kind].
+  ///
+  /// If no applicable extensions, return `null`.
+  ///
+  /// If the match is ambiguous, report an error and return `null`.
+  ExtensionResolutionResult findExtension(
+      DartType type, String name, Expression target, ElementKind kind) {
+    var extensions = _getApplicable(type, name, kind);
+
+    if (extensions.isEmpty) {
+      return ExtensionResolutionResult.none;
+    }
+
+    if (extensions.length == 1) {
+      return ExtensionResolutionResult(
+          ExtensionResolutionState.single, extensions[0]);
+    }
+
+    var extension = _chooseMostSpecific(extensions);
+    if (extension != null) {
+      return ExtensionResolutionResult(
+          ExtensionResolutionState.single, extension);
+    }
+
+    _errorReporter.reportErrorForNode(
+      CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS,
+      target,
+      [
+        name,
+        extensions[0].element.name,
+        extensions[1].element.name,
+      ],
+    );
+    return ExtensionResolutionResult.ambiguous;
+  }
+
+  void resolveOverride(ExtensionOverride node) {
+    var nodeImpl = node as ExtensionOverrideImpl;
+    var element = node.staticElement;
+    var typeParameters = element.typeParameters;
+
+    if (!_isValidContext(node)) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS,
+        node,
+      );
+      nodeImpl.staticType = _dynamicType;
+    }
+
+    var arguments = node.argumentList.arguments;
+    if (arguments.length != 1) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.INVALID_EXTENSION_ARGUMENT_COUNT,
+        node.argumentList,
+      );
+      nodeImpl.typeArgumentTypes = _listOfDynamic(typeParameters);
+      nodeImpl.extendedType = _dynamicType;
+      return;
+    }
+
+    var receiverExpression = arguments[0];
+    var receiverType = receiverExpression.staticType;
+
+    var typeArgumentTypes = _inferTypeArguments(
+      element,
+      receiverType,
+      node.typeArguments,
+    );
+
+    nodeImpl.typeArgumentTypes = typeArgumentTypes;
+    nodeImpl.extendedType = Substitution.fromPairs(
+      typeParameters,
+      typeArgumentTypes,
+    ).substituteType(element.extendedType);
+
+    if (!_typeSystem.isAssignableTo(receiverType, node.extendedType)) {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE,
+        receiverExpression,
+        [receiverType, node.extendedType],
+      );
+    }
+  }
+
+  /// Return the most specific extension or `null` if no single one can be
+  /// identified.
+  InstantiatedExtension _chooseMostSpecific(
+      List<InstantiatedExtension> extensions) {
+    //
+    // https://github.com/dart-lang/language/blob/master/accepted/future-releases/static-extension-methods/feature-specification.md#extension-conflict-resolution:
+    //
+    // If more than one extension applies to a specific member invocation, then
+    // we resort to a heuristic to choose one of the extensions to apply. If
+    // exactly one of them is "more specific" than all the others, that one is
+    // chosen. Otherwise it is a compile-time error.
+    //
+    // An extension with on type clause T1 is more specific than another
+    // extension with on type clause T2 iff
+    //
+    // 1. T2 is declared in a platform library, and T1 is not, or
+    // 2. they are both declared in platform libraries or both declared in
+    //    non-platform libraries, and
+    // 3. the instantiated type (the type after applying type inference from the
+    //    receiver) of T1 is a subtype of the instantiated type of T2 and either
+    //    not vice versa, or
+    // 4. the instantiate-to-bounds type of T1 is a subtype of the
+    //    instantiate-to-bounds type of T2 and not vice versa.
+    //
+
+    for (var i = 0; i < extensions.length; i++) {
+      var e1 = extensions[i];
+      var isMoreSpecific = true;
+      for (var j = 0; j < extensions.length; j++) {
+        var e2 = extensions[j];
+        if (i != j && !_isMoreSpecific(e1, e2)) {
+          isMoreSpecific = false;
+          break;
+        }
+      }
+      if (isMoreSpecific) {
+        return e1;
+      }
+    }
+
+    // Otherwise fail.
+    return null;
+  }
+
+  /// Return extensions for the [type] that match the given [name] in the
+  /// current scope.
+  List<InstantiatedExtension> _getApplicable(
+      DartType type, String name, ElementKind kind) {
+    var candidates = _getExtensionsWithMember(name, kind);
+
+    var instantiatedExtensions = <InstantiatedExtension>[];
+    for (var candidate in candidates) {
+      var typeParameters = candidate.extension.typeParameters;
+      var inferrer = GenericInferrer(
+        _typeProvider,
+        _typeSystem,
+        typeParameters,
+      );
+      inferrer.constrainArgument(
+        type,
+        candidate.extension.extendedType,
+        'extendedType',
+      );
+      var typeArguments = inferrer.infer(typeParameters, failAtError: true);
+      if (typeArguments == null) {
+        continue;
+      }
+
+      var substitution = Substitution.fromPairs(
+        typeParameters,
+        typeArguments,
+      );
+      var extendedType = substitution.substituteType(
+        candidate.extension.extendedType,
+      );
+      if (!_isSubtypeOf(type, extendedType)) {
+        continue;
+      }
+
+      instantiatedExtensions.add(
+        InstantiatedExtension(
+          candidate.extension,
+          extendedType,
+          // TODO(scheglov) Hm... Maybe not use from3(), but identify null subst?
+          ExecutableMember.from3(
+            candidate.member,
+            typeParameters,
+            typeArguments,
+          ),
+        ),
+      );
+    }
+
+    return instantiatedExtensions;
+  }
+
+  /// Return extensions from the current scope, that define a member with the
+  /// given[name].
+  List<_CandidateExtension> _getExtensionsWithMember(
+    String name,
+    ElementKind kind,
+  ) {
+    var candidates = <_CandidateExtension>[];
+
+    /// Return `true` if the [elementName] matches the target [name], taking
+    /// into account the `=` on the end of the names of setters.
+    bool matchesName(String elementName) {
+      if (elementName.endsWith('=') && !name.endsWith('=')) {
+        elementName = elementName.substring(0, elementName.length - 1);
+      }
+      return elementName == name;
+    }
+
+    /// Add the given [extension] to the list of [candidates] if it defined a
+    /// member whose name matches the target [name].
+    void checkExtension(ExtensionElement extension) {
+      if (kind == ElementKind.GETTER) {
+        for (var accessor in extension.accessors) {
+          if (accessor.isGetter && matchesName(accessor.name)) {
+            candidates.add(_CandidateExtension(extension, accessor));
+            return;
+          }
+        }
+      } else if (kind == ElementKind.SETTER) {
+        for (var accessor in extension.accessors) {
+          if (accessor.isSetter && matchesName(accessor.name)) {
+            candidates.add(_CandidateExtension(extension, accessor));
+            return;
+          }
+        }
+      } else if (kind == ElementKind.METHOD) {
+        for (var method in extension.methods) {
+          if (matchesName(method.name)) {
+            candidates.add(_CandidateExtension(extension, method));
+            return;
+          }
+        }
+        // Check for a getter that matches a function type.
+        for (var accessor in extension.accessors) {
+          if (accessor.type is FunctionType &&
+              accessor.isGetter &&
+              matchesName(accessor.name)) {
+            candidates.add(_CandidateExtension(extension, accessor));
+            return;
+          }
+        }
+      }
+    }
+
+    for (var extension in _nameScope.extensions) {
+      checkExtension(extension);
+    }
+    return candidates;
+  }
+
+  /// Given the generic [extension] element, either return types specified
+  /// explicitly in [typeArguments], or infer type arguments from the given
+  /// [receiverType].
+  ///
+  /// If the number of explicit type arguments is different than the number
+  /// of extension's type parameters, or inference fails, return `dynamic`
+  /// for all type parameters.
+  List<DartType> _inferTypeArguments(
+    ExtensionElement extension,
+    DartType receiverType,
+    TypeArgumentList typeArguments,
+  ) {
+    var typeParameters = extension.typeParameters;
+    if (typeParameters.isEmpty) {
+      return const <DartType>[];
+    }
+
+    if (typeArguments != null) {
+      var arguments = typeArguments.arguments;
+      if (arguments.length == typeParameters.length) {
+        return arguments.map((a) => a.type).toList();
+      } else {
+        // TODO(scheglov) Report an error.
+        return _listOfDynamic(typeParameters);
+      }
+    } else {
+      if (receiverType != null) {
+        var inferrer = GenericInferrer(
+          _typeProvider,
+          _typeSystem,
+          typeParameters,
+        );
+        inferrer.constrainArgument(
+          receiverType,
+          extension.extendedType,
+          'extendedType',
+        );
+        return inferrer.infer(typeParameters);
+      } else {
+        return _listOfDynamic(typeParameters);
+      }
+    }
+  }
+
+  /// Instantiate the extended type of the [extension] to the bounds of the
+  /// type formals of the extension.
+  DartType _instantiateToBounds(ExtensionElement extension) {
+    var typeParameters = extension.typeParameters;
+    return Substitution.fromPairs(
+      typeParameters,
+      _typeSystem.instantiateTypeFormalsToBounds(typeParameters),
+    ).substituteType(extension.extendedType);
+  }
+
+  bool _isMoreSpecific(InstantiatedExtension e1, InstantiatedExtension e2) {
+    var t10 = e1.element.extendedType;
+    var t20 = e2.element.extendedType;
+    var t11 = e1._extendedType;
+    var t21 = e2._extendedType;
+
+    bool inSdk(DartType type) {
+      if (type.isDynamic || type.isVoid) {
+        return true;
+      }
+      return t20.element.library.isInSdk;
+    }
+
+    if (inSdk(t20)) {
+      //  1. T2 is declared in a platform library, and T1 is not
+      if (!inSdk(t10)) {
+        return true;
+      }
+    } else if (inSdk(t10)) {
+      return false;
+    }
+
+    // 2. they are both declared in platform libraries or both declared in
+    //    non-platform libraries, and
+    if (_isSubtypeAndNotViceVersa(t11, t21)) {
+      // 3. the instantiated type (the type after applying type inference from the
+      //    receiver) of T1 is a subtype of the instantiated type of T2 and either
+      //    not vice versa
+      return true;
+    }
+
+    // TODO(scheglov) store instantiated types
+    var t12 = _instantiateToBounds(e1.element);
+    var t22 = _instantiateToBounds(e2.element);
+    if (_isSubtypeAndNotViceVersa(t12, t22)) {
+      // or:
+      // 4. the instantiate-to-bounds type of T1 is a subtype of the
+      //    instantiate-to-bounds type of T2 and not vice versa.
+      return true;
+    }
+
+    return false;
+  }
+
+  bool _isSubtypeAndNotViceVersa(DartType t1, DartType t2) {
+    return _isSubtypeOf(t1, t2) && !_isSubtypeOf(t2, t1);
+  }
+
+  /// Ask the type system for a subtype check.
+  bool _isSubtypeOf(DartType type1, DartType type2) =>
+      _typeSystem.isSubtypeOf(type1, type2);
+
+  List<DartType> _listOfDynamic(List<TypeParameterElement> parameters) {
+    return List<DartType>.filled(parameters.length, _dynamicType);
+  }
+
+  /// Return `true` if the extension override [node] is being used as a target
+  /// of an operation that might be accessing an instance member.
+  static bool _isValidContext(ExtensionOverride node) {
+    AstNode parent = node.parent;
+    return parent is BinaryExpression && parent.leftOperand == node ||
+        parent is FunctionExpressionInvocation && parent.function == node ||
+        parent is IndexExpression && parent.target == node ||
+        parent is MethodInvocation && parent.target == node ||
+        parent is PrefixExpression ||
+        parent is PropertyAccess && parent.target == node;
+  }
+}
+
+/// The result of attempting to resolve an identifier to an extension member.
+class ExtensionResolutionResult {
+  /// An instance that can be used anywhere that no extension member was found.
+  static const ExtensionResolutionResult none =
+      ExtensionResolutionResult(ExtensionResolutionState.none, null);
+
+  /// An instance that can be used anywhere that multiple ambiguous members were
+  /// found.
+  static const ExtensionResolutionResult ambiguous =
+      ExtensionResolutionResult(ExtensionResolutionState.ambiguous, null);
+
+  /// The state of the result.
+  final ExtensionResolutionState state;
+
+  /// The extension that was found, or `null` if the [state] is not
+  /// [ExtensionResolutionState.single].
+  final InstantiatedExtension extension;
+
+  /// Initialize a newly created result.
+  const ExtensionResolutionResult(this.state, this.extension);
+
+  /// Return `true` if this result represents the case where no extension member
+  /// was found.
+  bool get isNone => state == ExtensionResolutionState.none;
+
+  /// Return `true` if this result represents the case where a single extension
+  /// member was found.
+  bool get isSingle => extension != null;
+}
+
+/// The state of an [ExtensionResolutionResult].
+enum ExtensionResolutionState {
+  /// Indicates that no extension member was found.
+  none,
+
+  /// Indicates that a single extension member was found.
+  single,
+
+  /// Indicates that multiple ambiguous members were found.
+  ambiguous
+}
+
+class InstantiatedExtension {
+  final ExtensionElement element;
+  final DartType _extendedType;
+  final ExecutableElement instantiatedMember;
+
+  InstantiatedExtension(
+    this.element,
+    this._extendedType,
+    this.instantiatedMember,
+  );
+}
+
+class _CandidateExtension {
+  final ExtensionElement extension;
+  final ExecutableElement member;
+
+  _CandidateExtension(this.extension, this.member);
+}
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis.dart
deleted file mode 100644
index 237c3ab..0000000
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis.dart
+++ /dev/null
@@ -1,1068 +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.
-
-/// Sets of local variables that are potentially assigned in a statement.
-///
-/// These statements are loops, `switch`, and `try` statements.
-class AssignedVariables<Statement, Element> {
-  final emptySet = Set<Element>();
-
-  /// Mapping from a [Statement] to the set of local variables that are
-  /// potentially assigned in that statement.
-  final Map<Statement, Set<Element>> _map = {};
-
-  /// The stack of nested statements.
-  final List<Set<Element>> _stack = [];
-
-  AssignedVariables();
-
-  /// Return the set of variables that are potentially assigned in the
-  /// [statement].
-  Set<Element> operator [](Statement statement) {
-    return _map[statement] ?? emptySet;
-  }
-
-  void beginStatement() {
-    var set = Set<Element>.identity();
-    _stack.add(set);
-  }
-
-  void endStatement(Statement node) {
-    _map[node] = _stack.removeLast();
-  }
-
-  void write(Element variable) {
-    for (var i = 0; i < _stack.length; ++i) {
-      _stack[i].add(variable);
-    }
-  }
-}
-
-class FlowAnalysis<Statement, Expression, Element, Type> {
-  final _ElementSet<Element> _emptySet;
-  final _State<Element, Type> _identity;
-
-  /// The [NodeOperations], used to manipulate expressions.
-  final NodeOperations<Expression> nodeOperations;
-
-  /// The [TypeOperations], used to access types, and check subtyping.
-  final TypeOperations<Element, Type> typeOperations;
-
-  /// The enclosing function body, used to check for potential mutations.
-  final FunctionBodyAccess functionBody;
-
-  /// The stack of states of variables that are not definitely assigned.
-  final List<_State<Element, Type>> _stack = [];
-
-  /// The mapping from labeled [Statement]s to the index in the [_stack]
-  /// where the first related element is located.  The number of elements
-  /// is statement specific.  Loops have two elements: `break` and `continue`
-  /// states.
-  final Map<Statement, int> _statementToStackIndex = {};
-
-  /// The list of all variables.
-  final List<Element> _variables = [];
-
-  _State<Element, Type> _current;
-
-  /// The last boolean condition, for [_conditionTrue] and [_conditionFalse].
-  Expression _condition;
-
-  /// The state when [_condition] evaluates to `true`.
-  _State<Element, Type> _conditionTrue;
-
-  /// The state when [_condition] evaluates to `false`.
-  _State<Element, Type> _conditionFalse;
-
-  factory FlowAnalysis(
-    NodeOperations<Expression> nodeOperations,
-    TypeOperations<Element, Type> typeOperations,
-    FunctionBodyAccess functionBody,
-  ) {
-    var emptySet = _ElementSet<Element>._(
-      List<Element>(0),
-    );
-    var identifyState = _State<Element, Type>(
-      false,
-      emptySet,
-      emptySet,
-      emptySet,
-      const {},
-    );
-    return FlowAnalysis._(
-      nodeOperations,
-      typeOperations,
-      functionBody,
-      emptySet,
-      identifyState,
-    );
-  }
-
-  FlowAnalysis._(
-    this.nodeOperations,
-    this.typeOperations,
-    this.functionBody,
-    this._emptySet,
-    this._identity,
-  ) {
-    _current = _State<Element, Type>(
-      true,
-      _emptySet,
-      _emptySet,
-      _emptySet,
-      const {},
-    );
-  }
-
-  /// Return `true` if the current state is reachable.
-  bool get isReachable => _current.reachable;
-
-  /// Add a new [variable], which might be already [assigned].
-  void add(Element variable, {bool assigned: false}) {
-    _variables.add(variable);
-    _current = _current.add(variable, assigned: assigned);
-  }
-
-  void booleanLiteral(Expression expression, bool value) {
-    _condition = expression;
-    if (value) {
-      _conditionTrue = _current;
-      _conditionFalse = _identity;
-    } else {
-      _conditionTrue = _identity;
-      _conditionFalse = _current;
-    }
-  }
-
-  void conditional_elseBegin(Expression conditionalExpression,
-      Expression thenExpression, bool isBool) {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
-
-    if (isBool) {
-      _conditionalEnd(thenExpression);
-      // Tail of the stack: falseThen, trueThen
-    }
-
-    _stack.add(afterThen);
-    _current = falseCondition;
-  }
-
-  void conditional_end(Expression conditionalExpression,
-      Expression elseExpression, bool isBool) {
-    var afterThen = _stack.removeLast();
-    var afterElse = _current;
-
-    if (isBool) {
-      _conditionalEnd(elseExpression);
-      // Tail of the stack: falseThen, trueThen, falseElse, trueElse
-
-      var trueElse = _stack.removeLast();
-      var falseElse = _stack.removeLast();
-
-      var trueThen = _stack.removeLast();
-      var falseThen = _stack.removeLast();
-
-      var trueResult = _join(trueThen, trueElse);
-      var falseResult = _join(falseThen, falseElse);
-
-      _condition = conditionalExpression;
-      _conditionTrue = trueResult;
-      _conditionFalse = falseResult;
-    }
-
-    _current = _join(afterThen, afterElse);
-  }
-
-  void conditional_thenBegin(
-      Expression conditionalExpression, Expression condition) {
-    _conditionalEnd(condition);
-    // Tail of the stack: falseCondition, trueCondition
-
-    var trueCondition = _stack.removeLast();
-    _current = trueCondition;
-  }
-
-  /// The [binaryExpression] checks that the [variable] is equal to `null`.
-  void conditionEqNull(Expression binaryExpression, Element variable) {
-    if (functionBody.isPotentiallyMutatedInClosure(variable)) {
-      return;
-    }
-
-    _condition = binaryExpression;
-    _conditionTrue = _current.markNullable(_emptySet, variable);
-    _conditionFalse = _current.markNonNullable(_emptySet, variable);
-  }
-
-  /// The [binaryExpression] checks that the [variable] is not equal to `null`.
-  void conditionNotEqNull(Expression binaryExpression, Element variable) {
-    if (functionBody.isPotentiallyMutatedInClosure(variable)) {
-      return;
-    }
-
-    _condition = binaryExpression;
-    _conditionTrue = _current.markNonNullable(_emptySet, variable);
-    _conditionFalse = _current.markNullable(_emptySet, variable);
-  }
-
-  void doStatement_bodyBegin(Statement doStatement, Set<Element> loopAssigned) {
-    _current = _current.removePromotedAll(loopAssigned);
-
-    _statementToStackIndex[doStatement] = _stack.length;
-    _stack.add(_identity); // break
-    _stack.add(_identity); // continue
-  }
-
-  void doStatement_conditionBegin() {
-    // Tail of the stack: break, continue
-
-    var continueState = _stack.removeLast();
-    _current = _join(_current, continueState);
-  }
-
-  void doStatement_end(Statement doStatement, Expression condition) {
-    _conditionalEnd(condition);
-    // Tail of the stack:  break, falseCondition, trueCondition
-
-    _stack.removeLast(); // trueCondition
-    var falseCondition = _stack.removeLast();
-    var breakState = _stack.removeLast();
-
-    _current = _join(falseCondition, breakState);
-  }
-
-  void forEachStatement_bodyBegin(Set<Element> loopAssigned) {
-    _stack.add(_current);
-    _current = _current.removePromotedAll(loopAssigned);
-  }
-
-  void forEachStatement_end() {
-    var afterIterable = _stack.removeLast();
-    _current = _join(_current, afterIterable);
-  }
-
-  void forStatement_bodyBegin(Statement node, Expression condition) {
-    _conditionalEnd(condition);
-    // Tail of the stack: falseCondition, trueCondition
-
-    var trueCondition = _stack.removeLast();
-
-    _statementToStackIndex[node] = _stack.length;
-    _stack.add(_identity); // break
-    _stack.add(_identity); // continue
-
-    _current = trueCondition;
-  }
-
-  void forStatement_conditionBegin(Set<Element> loopAssigned) {
-    _current = _current.removePromotedAll(loopAssigned);
-  }
-
-  void forStatement_end() {
-    // Tail of the stack: falseCondition, break
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
-
-    _current = _join(falseCondition, breakState);
-  }
-
-  void forStatement_updaterBegin() {
-    // Tail of the stack: falseCondition, break, continue
-    var afterBody = _current;
-    var continueState = _stack.removeLast();
-
-    _current = _join(afterBody, continueState);
-  }
-
-  void functionExpression_begin() {
-    _stack.add(_current);
-
-    Set<Element> notPromoted = null;
-    for (var variable in _current.promoted.keys) {
-      if (functionBody.isPotentiallyMutatedInScope(variable)) {
-        notPromoted ??= Set<Element>.identity();
-        notPromoted.add(variable);
-      }
-    }
-
-    if (notPromoted != null) {
-      _current = _current.removePromotedAll(notPromoted);
-    }
-  }
-
-  void functionExpression_end() {
-    _current = _stack.removeLast();
-  }
-
-  void handleBreak(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
-    if (breakIndex != null) {
-      _stack[breakIndex] = _join(_stack[breakIndex], _current);
-    }
-    _current = _current.exit();
-  }
-
-  void handleContinue(Statement target) {
-    var breakIndex = _statementToStackIndex[target];
-    if (breakIndex != null) {
-      var continueIndex = breakIndex + 1;
-      _stack[continueIndex] = _join(_stack[continueIndex], _current);
-    }
-    _current = _current.exit();
-  }
-
-  /// Register the fact that the current state definitely exists, e.g. returns
-  /// from the body, throws an exception, etc.
-  void handleExit() {
-    _current = _current.exit();
-  }
-
-  void ifNullExpression_end() {
-    var afterLeft = _stack.removeLast();
-    _current = _join(_current, afterLeft);
-  }
-
-  void ifNullExpression_rightBegin() {
-    _stack.add(_current); // afterLeft
-  }
-
-  void ifStatement_elseBegin() {
-    var afterThen = _current;
-    var falseCondition = _stack.removeLast();
-    _stack.add(afterThen);
-    _current = falseCondition;
-  }
-
-  void ifStatement_end(bool hasElse) {
-    _State<Element, Type> afterThen;
-    _State<Element, Type> afterElse;
-    if (hasElse) {
-      afterThen = _stack.removeLast();
-      afterElse = _current;
-    } else {
-      afterThen = _current; // no `else`, so `then` is still current
-      afterElse = _stack.removeLast(); // `falseCond` is still on the stack
-    }
-    _current = _join(afterThen, afterElse);
-  }
-
-  void ifStatement_thenBegin(Statement ifStatement, Expression condition) {
-    _conditionalEnd(condition);
-    // Tail of the stack:  falseCondition, trueCondition
-
-    var trueCondition = _stack.removeLast();
-    _current = trueCondition;
-  }
-
-  /// Return whether the [variable] is definitely assigned in the current state.
-  bool isAssigned(Element variable) {
-    return !_current.notAssigned.contains(variable);
-  }
-
-  void isExpression_end(
-      Expression isExpression, Element variable, bool isNot, Type type) {
-    if (functionBody.isPotentiallyMutatedInClosure(variable)) {
-      return;
-    }
-
-    _condition = isExpression;
-    if (isNot) {
-      _conditionTrue = _current;
-      _conditionFalse = _current.promote(typeOperations, variable, type);
-    } else {
-      _conditionTrue = _current.promote(typeOperations, variable, type);
-      _conditionFalse = _current;
-    }
-  }
-
-  /// Return `true` if the [variable] is known to be be non-nullable.
-  bool isNonNullable(Element variable) {
-    return !_current.notNonNullable.contains(variable);
-  }
-
-  /// Return `true` if the [variable] is known to be be nullable.
-  bool isNullable(Element variable) {
-    return !_current.notNullable.contains(variable);
-  }
-
-  void logicalAnd_end(Expression andExpression, Expression rightOperand) {
-    _conditionalEnd(rightOperand);
-    // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
-
-    var trueRight = _stack.removeLast();
-    var falseRight = _stack.removeLast();
-
-    _stack.removeLast(); // trueLeft is not used
-    var falseLeft = _stack.removeLast();
-
-    var trueResult = trueRight;
-    var falseResult = _join(falseLeft, falseRight);
-    var afterResult = _join(trueResult, falseResult);
-
-    _condition = andExpression;
-    _conditionTrue = trueResult;
-    _conditionFalse = falseResult;
-
-    _current = afterResult;
-  }
-
-  void logicalAnd_rightBegin(Expression andExpression, Expression leftOperand) {
-    _conditionalEnd(leftOperand);
-    // Tail of the stack: falseLeft, trueLeft
-
-    var trueLeft = _stack.last;
-    _current = trueLeft;
-  }
-
-  void logicalNot_end(Expression notExpression, Expression operand) {
-    _conditionalEnd(operand);
-    var trueExpr = _stack.removeLast();
-    var falseExpr = _stack.removeLast();
-
-    _condition = notExpression;
-    _conditionTrue = falseExpr;
-    _conditionFalse = trueExpr;
-  }
-
-  void logicalOr_end(Expression orExpression, Expression rightOperand) {
-    _conditionalEnd(rightOperand);
-    // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
-
-    var trueRight = _stack.removeLast();
-    var falseRight = _stack.removeLast();
-
-    var trueLeft = _stack.removeLast();
-    _stack.removeLast(); // falseLeft is not used
-
-    var trueResult = _join(trueLeft, trueRight);
-    var falseResult = falseRight;
-    var afterResult = _join(trueResult, falseResult);
-
-    _condition = orExpression;
-    _conditionTrue = trueResult;
-    _conditionFalse = falseResult;
-
-    _current = afterResult;
-  }
-
-  void logicalOr_rightBegin(Expression orExpression, Expression leftOperand) {
-    _conditionalEnd(leftOperand);
-    // Tail of the stack: falseLeft, trueLeft
-
-    var falseLeft = _stack[_stack.length - 2];
-    _current = falseLeft;
-  }
-
-  /// Retrieves the type that the [variable] is promoted to, if the [variable]
-  /// is currently promoted.  Otherwise returns `null`.
-  Type promotedType(Element variable) {
-    return _current.promoted[variable];
-  }
-
-  /// The [notPromoted] set contains all variables that are potentially
-  /// assigned in other cases that might target this with `continue`, so
-  /// these variables might have different types and are "un-promoted" from
-  /// the "afterExpression" state.
-  void switchStatement_beginCase(Set<Element> notPromoted) {
-    _current = _stack.last.removePromotedAll(notPromoted);
-  }
-
-  void switchStatement_end(Statement switchStatement, bool hasDefault) {
-    // Tail of the stack: break, continue, afterExpression
-    var afterExpression = _current = _stack.removeLast();
-    _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
-
-    if (hasDefault) {
-      _current = breakState;
-    } else {
-      _current = _join(breakState, afterExpression);
-    }
-  }
-
-  void switchStatement_expressionEnd(Statement switchStatement) {
-    _statementToStackIndex[switchStatement] = _stack.length;
-    _stack.add(_identity); // break
-    _stack.add(_identity); // continue
-    _stack.add(_current); // afterExpression
-  }
-
-  void tryCatchStatement_bodyBegin() {
-    _stack.add(_current);
-    // Tail of the stack: beforeBody
-  }
-
-  void tryCatchStatement_bodyEnd(Set<Element> assignedInBody) {
-    var beforeBody = _stack.removeLast();
-    var beforeCatch = beforeBody.removePromotedAll(assignedInBody);
-    _stack.add(beforeCatch);
-    _stack.add(_current); // afterBodyAndCatches
-    // Tail of the stack: beforeCatch, afterBodyAndCatches
-  }
-
-  void tryCatchStatement_catchBegin() {
-    var beforeCatch = _stack[_stack.length - 2];
-    _current = beforeCatch;
-  }
-
-  void tryCatchStatement_catchEnd() {
-    var afterBodyAndCatches = _stack.last;
-    _stack.last = _join(afterBodyAndCatches, _current);
-  }
-
-  void tryCatchStatement_end() {
-    var afterBodyAndCatches = _stack.removeLast();
-    _stack.removeLast(); // beforeCatch
-    _current = afterBodyAndCatches;
-  }
-
-  void tryFinallyStatement_bodyBegin() {
-    _stack.add(_current); // beforeTry
-  }
-
-  void tryFinallyStatement_end(Set<Element> assignedInFinally) {
-    var afterBody = _stack.removeLast();
-    _current = _current.restrict(
-      typeOperations,
-      _emptySet,
-      afterBody,
-      assignedInFinally,
-    );
-  }
-
-  void tryFinallyStatement_finallyBegin(Set<Element> assignedInBody) {
-    var beforeTry = _stack.removeLast();
-    var afterBody = _current;
-    _stack.add(afterBody);
-    _current = _join(afterBody, beforeTry.removePromotedAll(assignedInBody));
-  }
-
-  void verifyStackEmpty() {
-    assert(_stack.isEmpty);
-  }
-
-  void whileStatement_bodyBegin(
-      Statement whileStatement, Expression condition) {
-    _conditionalEnd(condition);
-    // Tail of the stack: falseCondition, trueCondition
-
-    var trueCondition = _stack.removeLast();
-
-    _statementToStackIndex[whileStatement] = _stack.length;
-    _stack.add(_identity); // break
-    _stack.add(_identity); // continue
-
-    _current = trueCondition;
-  }
-
-  void whileStatement_conditionBegin(Set<Element> loopAssigned) {
-    _current = _current.removePromotedAll(loopAssigned);
-  }
-
-  void whileStatement_end() {
-    _stack.removeLast(); // continue
-    var breakState = _stack.removeLast();
-    var falseCondition = _stack.removeLast();
-
-    _current = _join(falseCondition, breakState);
-  }
-
-  /// Register write of the given [variable] in the current state.
-  void write(
-    Element variable, {
-    bool isNull = false,
-    bool isNonNull = false,
-  }) {
-    _current = _current.write(typeOperations, _emptySet, variable,
-        isNull: isNull, isNonNull: isNonNull);
-  }
-
-  void _conditionalEnd(Expression condition) {
-    condition = nodeOperations.unwrapParenthesized(condition);
-    if (identical(condition, _condition)) {
-      _stack.add(_conditionFalse);
-      _stack.add(_conditionTrue);
-    } else {
-      _stack.add(_current);
-      _stack.add(_current);
-    }
-  }
-
-  _State<Element, Type> _join(
-    _State<Element, Type> first,
-    _State<Element, Type> second,
-  ) {
-    if (identical(first, _identity)) return second;
-    if (identical(second, _identity)) return first;
-
-    if (first.reachable && !second.reachable) return first;
-    if (!first.reachable && second.reachable) return second;
-
-    var newReachable = first.reachable || second.reachable;
-    var newNotAssigned = first.notAssigned.union(second.notAssigned);
-    var newNotNullable = first.notNullable.union(second.notNullable);
-    var newNotNonNullable = first.notNonNullable.union(second.notNonNullable);
-    var newPromoted = _joinPromoted(first.promoted, second.promoted);
-
-    return _State._identicalOrNew(
-      first,
-      second,
-      newReachable,
-      newNotAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      newPromoted,
-    );
-  }
-
-  Map<Element, Type> _joinPromoted(
-    Map<Element, Type> first,
-    Map<Element, Type> second,
-  ) {
-    if (identical(first, second)) return first;
-    if (first.isEmpty || second.isEmpty) return const {};
-
-    var result = <Element, Type>{};
-    var alwaysFirst = true;
-    var alwaysSecond = true;
-    for (var element in first.keys) {
-      var firstType = first[element];
-      var secondType = second[element];
-      if (firstType != null && secondType != null) {
-        if (typeOperations.isSubtypeOf(firstType, secondType)) {
-          result[element] = secondType;
-          alwaysFirst = false;
-        } else if (typeOperations.isSubtypeOf(secondType, firstType)) {
-          result[element] = firstType;
-          alwaysSecond = false;
-        } else {
-          alwaysFirst = false;
-          alwaysSecond = false;
-        }
-      } else {
-        alwaysFirst = false;
-        alwaysSecond = false;
-      }
-    }
-
-    if (alwaysFirst) return first;
-    if (alwaysSecond) return second;
-    if (result.isEmpty) return const {};
-    return result;
-  }
-}
-
-/// Accessor for function body information.
-abstract class FunctionBodyAccess<Element> {
-  bool isPotentiallyMutatedInClosure(Element variable);
-
-  bool isPotentiallyMutatedInScope(Element variable);
-}
-
-/// Operations on nodes, abstracted from concrete node interfaces.
-abstract class NodeOperations<Expression> {
-  /// If the [node] is a parenthesized expression, recursively unwrap it.
-  Expression unwrapParenthesized(Expression node);
-}
-
-/// Operations on types, abstracted from concrete type interfaces.
-abstract class TypeOperations<Element, Type> {
-  /// Return the static type of the given [element].
-  Type elementType(Element element);
-
-  /// Return `true` if the [element] is a local variable, not a parameter.
-  bool isLocalVariable(Element element);
-
-  /// Return `true` if the [leftType] is a subtype of the [rightType].
-  bool isSubtypeOf(Type leftType, Type rightType);
-}
-
-/// List based immutable set of elements.
-class _ElementSet<Element> {
-  final List<Element> elements;
-
-  _ElementSet._(this.elements);
-
-  _ElementSet<Element> add(Element addedElement) {
-    if (contains(addedElement)) {
-      return this;
-    }
-
-    var length = elements.length;
-    var newElements = List<Element>(length + 1);
-    for (var i = 0; i < length; ++i) {
-      newElements[i] = elements[i];
-    }
-    newElements[length] = addedElement;
-    return _ElementSet._(newElements);
-  }
-
-  _ElementSet<Element> addAll(Iterable<Element> elements) {
-    var result = this;
-    for (var element in elements) {
-      result = result.add(element);
-    }
-    return result;
-  }
-
-  bool contains(Element element) {
-    var length = elements.length;
-    for (var i = 0; i < length; ++i) {
-      if (identical(elements[i], element)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  _ElementSet<Element> intersect({
-    _ElementSet<Element> empty,
-    _ElementSet<Element> other,
-  }) {
-    if (identical(other, empty)) return empty;
-
-    // TODO(scheglov) optimize
-    var newElements =
-        elements.toSet().intersection(other.elements.toSet()).toList();
-
-    if (newElements.isEmpty) return empty;
-    return _ElementSet._(newElements);
-  }
-
-  _ElementSet<Element> remove(
-    _ElementSet<Element> empty,
-    Element removedElement,
-  ) {
-    if (!contains(removedElement)) {
-      return this;
-    }
-
-    var length = elements.length;
-    if (length == 1) {
-      return empty;
-    }
-
-    var newElements = List<Element>(length - 1);
-    var newIndex = 0;
-    for (var i = 0; i < length; ++i) {
-      var element = elements[i];
-      if (!identical(element, removedElement)) {
-        newElements[newIndex++] = element;
-      }
-    }
-
-    return _ElementSet._(newElements);
-  }
-
-  _ElementSet<Element> union(_ElementSet<Element> other) {
-    if (other.elements.isEmpty) {
-      return this;
-    }
-
-    var result = this;
-    var otherElements = other.elements;
-    for (var i = 0; i < otherElements.length; ++i) {
-      var otherElement = otherElements[i];
-      result = result.add(otherElement);
-    }
-    return result;
-  }
-}
-
-class _State<Element, Type> {
-  final bool reachable;
-  final _ElementSet<Element> notAssigned;
-  final _ElementSet<Element> notNullable;
-  final _ElementSet<Element> notNonNullable;
-  final Map<Element, Type> promoted;
-
-  _State(
-    this.reachable,
-    this.notAssigned,
-    this.notNullable,
-    this.notNonNullable,
-    this.promoted,
-  );
-
-  /// Add a new [variable] to track definite assignment.
-  _State<Element, Type> add(Element variable, {bool assigned: false}) {
-    var newNotAssigned = assigned ? notAssigned : notAssigned.add(variable);
-    var newNotNullable = notNullable.add(variable);
-    var newNotNonNullable = notNonNullable.add(variable);
-
-    if (identical(newNotAssigned, notAssigned) &&
-        identical(newNotNullable, notNullable) &&
-        identical(newNotNonNullable, notNonNullable)) {
-      return this;
-    }
-
-    return _State<Element, Type>(
-      reachable,
-      newNotAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      promoted,
-    );
-  }
-
-  _State<Element, Type> exit() {
-    return _State<Element, Type>(
-      false,
-      notAssigned,
-      notNullable,
-      notNonNullable,
-      promoted,
-    );
-  }
-
-  _State<Element, Type> markNonNullable(
-      _ElementSet<Element> emptySet, Element variable) {
-    var newNotNullable = notNullable.add(variable);
-    var newNotNonNullable = notNonNullable.remove(emptySet, variable);
-
-    if (identical(newNotNullable, notNullable) &&
-        identical(newNotNonNullable, notNonNullable)) {
-      return this;
-    }
-
-    return _State<Element, Type>(
-      reachable,
-      notAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      promoted,
-    );
-  }
-
-  _State<Element, Type> markNullable(
-      _ElementSet<Element> emptySet, Element variable) {
-    var newNotNullable = notNullable.remove(emptySet, variable);
-    var newNotNonNullable = notNonNullable.add(variable);
-
-    if (identical(newNotNullable, notNullable) &&
-        identical(newNotNonNullable, notNonNullable)) {
-      return this;
-    }
-
-    return _State<Element, Type>(
-      reachable,
-      notAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      promoted,
-    );
-  }
-
-  _State<Element, Type> promote(
-    TypeOperations<Element, Type> typeOperations,
-    Element variable,
-    Type type,
-  ) {
-    var previousType = promoted[variable];
-    previousType ??= typeOperations.elementType(variable);
-
-    if (typeOperations.isSubtypeOf(type, previousType) &&
-        type != previousType) {
-      var newPromoted = <Element, Type>{}..addAll(promoted);
-      newPromoted[variable] = type;
-      return _State<Element, Type>(
-        reachable,
-        notAssigned,
-        notNullable,
-        notNonNullable,
-        newPromoted,
-      );
-    }
-
-    return this;
-  }
-
-  _State<Element, Type> removePromotedAll(Set<Element> variables) {
-    var newNotNullable = notNullable.addAll(variables);
-    var newNotNonNullable = notNonNullable.addAll(variables);
-    var newPromoted = _removePromotedAll(promoted, variables);
-
-    if (identical(newNotNullable, notNullable) &&
-        identical(newNotNonNullable, notNonNullable) &&
-        identical(newPromoted, promoted)) return this;
-
-    return _State<Element, Type>(
-      reachable,
-      notAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      newPromoted,
-    );
-  }
-
-  _State<Element, Type> restrict(
-    TypeOperations<Element, Type> typeOperations,
-    _ElementSet<Element> emptySet,
-    _State<Element, Type> other,
-    Set<Element> unsafe,
-  ) {
-    var newReachable = reachable && other.reachable;
-    var newNotAssigned = notAssigned.intersect(
-      empty: emptySet,
-      other: other.notAssigned,
-    );
-
-    var newNotNullable = emptySet;
-    for (var variable in notNullable.elements) {
-      if (unsafe.contains(variable) || other.notNullable.contains(variable)) {
-        newNotNullable = newNotNullable.add(variable);
-      }
-    }
-
-    var newNotNonNullable = emptySet;
-    for (var variable in notNonNullable.elements) {
-      if (unsafe.contains(variable) ||
-          other.notNonNullable.contains(variable)) {
-        newNotNonNullable = newNotNonNullable.add(variable);
-      }
-    }
-
-    var newPromoted = <Element, Type>{};
-    for (var variable in promoted.keys) {
-      var thisType = promoted[variable];
-      if (!unsafe.contains(variable)) {
-        var otherType = other.promoted[variable];
-        if (otherType != null &&
-            typeOperations.isSubtypeOf(otherType, thisType)) {
-          newPromoted[variable] = otherType;
-          continue;
-        }
-      }
-      newPromoted[variable] = thisType;
-    }
-
-    return _identicalOrNew(
-      this,
-      other,
-      newReachable,
-      newNotAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      newPromoted,
-    );
-  }
-
-  _State<Element, Type> setReachable(bool reachable) {
-    if (this.reachable == reachable) return this;
-
-    return _State<Element, Type>(
-      reachable,
-      notAssigned,
-      notNullable,
-      notNonNullable,
-      promoted,
-    );
-  }
-
-  _State<Element, Type> write(
-    TypeOperations<Element, Type> typeOperations,
-    _ElementSet<Element> emptySet,
-    Element variable, {
-    bool isNull = false,
-    bool isNonNull = false,
-  }) {
-    var newNotAssigned = typeOperations.isLocalVariable(variable)
-        ? notAssigned.remove(emptySet, variable)
-        : notAssigned;
-
-    var newNotNullable = isNull
-        ? notNullable.remove(emptySet, variable)
-        : notNullable.add(variable);
-
-    var newNotNonNullable = isNonNull
-        ? notNonNullable.remove(emptySet, variable)
-        : notNonNullable.add(variable);
-
-    var newPromoted = _removePromoted(promoted, variable);
-
-    if (identical(newNotAssigned, notAssigned) &&
-        identical(newNotNullable, notNullable) &&
-        identical(newNotNonNullable, notNonNullable) &&
-        identical(newPromoted, promoted)) {
-      return this;
-    }
-
-    return _State<Element, Type>(
-      reachable,
-      newNotAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      newPromoted,
-    );
-  }
-
-  Map<Element, Type> _removePromoted(Map<Element, Type> map, Element variable) {
-    if (map.isEmpty) return const {};
-
-    var result = <Element, Type>{};
-    for (var key in map.keys) {
-      if (!identical(key, variable)) {
-        result[key] = map[key];
-      }
-    }
-
-    if (result.isEmpty) return const {};
-    return result;
-  }
-
-  Map<Element, Type> _removePromotedAll(
-    Map<Element, Type> map,
-    Set<Element> variables,
-  ) {
-    if (map.isEmpty) return const {};
-    if (variables.isEmpty) return map;
-
-    var result = <Element, Type>{};
-    var noChanges = true;
-    for (var key in map.keys) {
-      if (variables.contains(key)) {
-        noChanges = false;
-      } else {
-        result[key] = map[key];
-      }
-    }
-
-    if (noChanges) return map;
-    if (result.isEmpty) return const {};
-    return result;
-  }
-
-  static _State<Element, Type> _identicalOrNew<Element, Type>(
-    _State<Element, Type> first,
-    _State<Element, Type> second,
-    bool newReachable,
-    _ElementSet<Element> newNotAssigned,
-    _ElementSet<Element> newNotNullable,
-    _ElementSet<Element> newNotNonNullable,
-    Map<Element, Type> newPromoted,
-  ) {
-    if (first.reachable == newReachable &&
-        identical(first.notAssigned, newNotAssigned) &&
-        identical(first.notNullable, newNotNullable) &&
-        identical(first.notNonNullable, newNotNonNullable) &&
-        identical(first.promoted, newPromoted)) {
-      return first;
-    }
-    if (second.reachable == newReachable &&
-        identical(second.notAssigned, newNotAssigned) &&
-        identical(second.notNullable, newNotNullable) &&
-        identical(second.notNonNullable, newNotNonNullable) &&
-        identical(second.promoted, newPromoted)) {
-      return second;
-    }
-
-    return _State<Element, Type>(
-      newReachable,
-      newNotAssigned,
-      newNotNullable,
-      newNotNonNullable,
-      newPromoted,
-    );
-  }
-}
diff --git a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
index 79d3217..c126f1f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/flow_analysis_visitor.dart
@@ -8,8 +8,36 @@
 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/resolver/flow_analysis.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
+import 'package:front_end/src/fasta/flow_analysis/flow_analysis.dart';
+import 'package:meta/meta.dart';
+
+class AnalyzerFunctionBodyAccess
+    implements FunctionBodyAccess<VariableElement> {
+  final FunctionBody node;
+
+  AnalyzerFunctionBodyAccess(this.node);
+
+  @override
+  bool isPotentiallyMutatedInClosure(VariableElement variable) {
+    return node.isPotentiallyMutatedInClosure(variable);
+  }
+
+  @override
+  bool isPotentiallyMutatedInScope(VariableElement variable) {
+    return node.isPotentiallyMutatedInScope(variable);
+  }
+}
+
+class AnalyzerNodeOperations implements NodeOperations<Expression> {
+  const AnalyzerNodeOperations();
+
+  @override
+  Expression unwrapParenthesized(Expression node) {
+    return node.unParenthesized;
+  }
+}
 
 /// The helper for performing flow analysis during resolution.
 ///
@@ -29,29 +57,27 @@
   final AssignedVariables<Statement, VariableElement> assignedVariables;
 
   /// The result for post-resolution stages of analysis.
-  final FlowAnalysisResult result = FlowAnalysisResult();
+  final FlowAnalysisResult result;
 
   /// The current flow, when resolving a function body, or `null` otherwise.
   FlowAnalysis<Statement, Expression, VariableElement, DartType> flow;
 
   int _blockFunctionBodyLevel = 0;
 
-  factory FlowAnalysisHelper(TypeSystem typeSystem, AstNode node) {
+  factory FlowAnalysisHelper(
+      TypeSystem typeSystem, AstNode node, bool retainDataForTesting) {
     var assignedVariables = AssignedVariables<Statement, VariableElement>();
     node.accept(_AssignedVariablesVisitor(assignedVariables));
 
     return FlowAnalysisHelper._(
-      _NodeOperations(),
-      _TypeSystemTypeOperations(typeSystem),
-      assignedVariables,
-    );
+        const AnalyzerNodeOperations(),
+        _TypeSystemTypeOperations(typeSystem),
+        assignedVariables,
+        retainDataForTesting ? FlowAnalysisResult() : null);
   }
 
-  FlowAnalysisHelper._(
-    this._nodeOperations,
-    this._typeOperations,
-    this.assignedVariables,
-  );
+  FlowAnalysisHelper._(this._nodeOperations, this._typeOperations,
+      this.assignedVariables, this.result);
 
   LocalVariableTypeProvider get localVariableTypeProvider {
     return _LocalVariableTypeProvider(this);
@@ -76,56 +102,26 @@
       VariableElement localElement, Expression right) {
     if (localElement == null) return;
 
-    flow.write(
-      localElement,
-      isNull: _isNull(right),
-      isNonNull: _isNonNull(right),
-    );
+    flow.write(localElement);
   }
 
-  void binaryExpression_bangEq(
-    BinaryExpression node,
-    Expression left,
-    Expression right,
-  ) {
+  void binaryExpression_equal(
+      BinaryExpression node, Expression left, Expression right,
+      {@required bool notEqual}) {
     if (flow == null) return;
 
     if (right is NullLiteral) {
       if (left is SimpleIdentifier) {
         var element = left.staticElement;
         if (element is VariableElement) {
-          flow.conditionNotEqNull(node, element);
+          flow.conditionEqNull(node, element, notEqual: notEqual);
         }
       }
     } else if (left is NullLiteral) {
       if (right is SimpleIdentifier) {
         var element = right.staticElement;
         if (element is VariableElement) {
-          flow.conditionNotEqNull(node, element);
-        }
-      }
-    }
-  }
-
-  void binaryExpression_eqEq(
-    BinaryExpression node,
-    Expression left,
-    Expression right,
-  ) {
-    if (flow == null) return;
-
-    if (right is NullLiteral) {
-      if (left is SimpleIdentifier) {
-        var element = left.staticElement;
-        if (element is VariableElement) {
-          flow.conditionEqNull(node, element);
-        }
-      }
-    } else if (left is NullLiteral) {
-      if (right is SimpleIdentifier) {
-        var element = right.staticElement;
-        if (element is VariableElement) {
-          flow.conditionEqNull(node, element);
+          flow.conditionEqNull(node, element, notEqual: notEqual);
         }
       }
     }
@@ -136,15 +132,14 @@
 
     if (_blockFunctionBodyLevel > 1) {
       assert(flow != null);
-      return;
+    } else {
+      flow = FlowAnalysis<Statement, Expression, VariableElement, DartType>(
+        _nodeOperations,
+        _typeOperations,
+        AnalyzerFunctionBodyAccess(node),
+      );
     }
 
-    flow = FlowAnalysis<Statement, Expression, VariableElement, DartType>(
-      _nodeOperations,
-      _typeOperations,
-      _FunctionBodyAccess(node),
-    );
-
     var parameters = _enclosingExecutableParameters(node);
     if (parameters != null) {
       for (var parameter in parameters.parameters) {
@@ -160,12 +155,17 @@
       return;
     }
 
+    // Set this.flow to null before doing any clean-up so that if an exception
+    // is raised, the state is already updated correctly, and we don't have
+    // cascading failures.
+    var flow = this.flow;
+    this.flow = null;
+
     if (!flow.isReachable) {
-      result.functionBodiesThatDontComplete.add(node);
+      result?.functionBodiesThatDontComplete?.add(node);
     }
 
-    flow.verifyStackEmpty();
-    flow = null;
+    flow.finish();
   }
 
   void breakStatement(BreakStatement node) {
@@ -179,13 +179,15 @@
     if (flow == null) return;
     if (flow.isReachable) return;
 
-    // Ignore the [node] if it is fully covered by the last unreachable.
-    if (result.unreachableNodes.isNotEmpty) {
-      var last = result.unreachableNodes.last;
-      if (node.offset >= last.offset && node.end <= last.end) return;
-    }
+    if (result != null) {
+      // Ignore the [node] if it is fully covered by the last unreachable.
+      if (result.unreachableNodes.isNotEmpty) {
+        var last = result.unreachableNodes.last;
+        if (node.offset >= last.offset && node.end <= last.end) return;
+      }
 
-    result.unreachableNodes.add(node);
+      result.unreachableNodes.add(node);
+    }
   }
 
   void continueStatement(ContinueStatement node) {
@@ -233,41 +235,39 @@
 
     var element = node.staticElement;
     if (element is LocalVariableElement) {
-      if (element.isLate) return false;
-
       var typeSystem = _typeOperations.typeSystem;
       if (typeSystem.isPotentiallyNonNullable(element.type)) {
-        return !flow.isAssigned(element);
+        var isUnassigned = !flow.isAssigned(element);
+        if (isUnassigned) {
+          result?.unassignedNodes?.add(node);
+        }
+        // Note: in principle we could make this slightly more performant by
+        // checking element.isLate earlier, but we would lose the ability to
+        // test the flow analysis mechanism using late variables.  And it seems
+        // unlikely that the `late` modifier will be used often enough for it to
+        // make a significant difference.
+        if (element.isLate) return false;
+        return isUnassigned;
       }
     }
 
     return false;
   }
 
-  void simpleIdentifier(SimpleIdentifier node) {
-    if (flow == null) return;
-
-    var element = node.staticElement;
-    var isLocalVariable = element is LocalVariableElement;
-    if (isLocalVariable || element is ParameterElement) {
-      if (node.inGetterContext() && !node.inDeclarationContext()) {
-        if (flow.isNullable(element)) {
-          result.nullableNodes.add(node);
-        }
-
-        if (flow.isNonNullable(element)) {
-          result.nonNullableNodes.add(node);
-        }
-      }
+  void loopVariable(DeclaredIdentifier loopVariable) {
+    if (loopVariable != null) {
+      flow.add(loopVariable.declaredElement, assigned: true);
     }
   }
 
-  void variableDeclarationStatement(VariableDeclarationStatement node) {
-    var variables = node.variables.variables;
-    for (var i = 0; i < variables.length; ++i) {
-      var variable = variables[i];
-      flow.add(variable.declaredElement,
-          assigned: variable.initializer != null);
+  void variableDeclarationList(VariableDeclarationList node) {
+    if (flow != null) {
+      var variables = node.variables;
+      for (var i = 0; i < variables.length; ++i) {
+        var variable = variables[i];
+        flow.add(variable.declaredElement,
+            assigned: variable.initializer != null);
+      }
     }
   }
 
@@ -318,30 +318,10 @@
     }
     return null;
   }
-
-  static bool _isNonNull(Expression node) {
-    if (node is NullLiteral) return false;
-
-    return node is Literal;
-  }
-
-  static bool _isNull(Expression node) {
-    return node is NullLiteral;
-  }
 }
 
 /// The result of performing flow analysis on a unit.
 class FlowAnalysisResult {
-  static const _astKey = 'FlowAnalysisResult';
-
-  /// The list of identifiers, resolved to a local variable or a parameter,
-  /// where the variable is known to be nullable.
-  final List<SimpleIdentifier> nullableNodes = [];
-
-  /// The list of identifiers, resolved to a local variable or a parameter,
-  /// where the variable is known to be non-nullable.
-  final List<SimpleIdentifier> nonNullableNodes = [];
-
   /// The list of nodes, [Expression]s or [Statement]s, that cannot be reached,
   /// for example because a previous statement always exits.
   final List<AstNode> unreachableNodes = [];
@@ -350,13 +330,9 @@
   /// there is a `return` statement at the end of the function body block.
   final List<FunctionBody> functionBodiesThatDontComplete = [];
 
-  void putIntoNode(AstNode node) {
-    node.setProperty(_astKey, this);
-  }
-
-  static FlowAnalysisResult getFromNode(AstNode node) {
-    return node.getProperty(_astKey);
-  }
+  /// The list of [Expression]s representing variable accesses that occur before
+  /// the corresponding variable has been definitely assigned.
+  final List<AstNode> unassignedNodes = [];
 }
 
 /// The visitor that gathers local variables that are potentially assigned
@@ -454,22 +430,6 @@
   }
 }
 
-class _FunctionBodyAccess implements FunctionBodyAccess<VariableElement> {
-  final FunctionBody node;
-
-  _FunctionBodyAccess(this.node);
-
-  @override
-  bool isPotentiallyMutatedInClosure(VariableElement variable) {
-    return node.isPotentiallyMutatedInClosure(variable);
-  }
-
-  @override
-  bool isPotentiallyMutatedInScope(VariableElement variable) {
-    return node.isPotentiallyMutatedInScope(variable);
-  }
-}
-
 /// The flow analysis based implementation of [LocalVariableTypeProvider].
 class _LocalVariableTypeProvider implements LocalVariableTypeProvider {
   final FlowAnalysisHelper _manager;
@@ -484,13 +444,6 @@
   }
 }
 
-class _NodeOperations implements NodeOperations<Expression> {
-  @override
-  Expression unwrapParenthesized(Expression node) {
-    return node.unParenthesized;
-  }
-}
-
 class _TypeSystemTypeOperations
     implements TypeOperations<VariableElement, DartType> {
   final TypeSystem typeSystem;
@@ -498,17 +451,27 @@
   _TypeSystemTypeOperations(this.typeSystem);
 
   @override
-  DartType elementType(VariableElement element) {
-    return element.type;
-  }
-
-  @override
   bool isLocalVariable(VariableElement element) {
     return element is LocalVariableElement;
   }
 
   @override
+  bool isSameType(covariant TypeImpl type1, covariant TypeImpl type2) {
+    return type1 == type2;
+  }
+
+  @override
   bool isSubtypeOf(DartType leftType, DartType rightType) {
     return typeSystem.isSubtypeOf(leftType, rightType);
   }
+
+  @override
+  DartType promoteToNonNull(DartType type) {
+    return typeSystem.promoteToNonNull(type);
+  }
+
+  @override
+  DartType variableType(VariableElement variable) {
+    return variable.type;
+  }
 }
diff --git a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
index b1781ea..266d3cd 100644
--- a/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/inheritance_manager.dart
@@ -21,7 +21,7 @@
  * Instances of the class `InheritanceManager` manage the knowledge of where class members
  * (methods, getters & setters) are inherited from.
  */
-@Deprecated('Use InheritanceManager2 instead.')
+@Deprecated('Use InheritanceManager3 instead.')
 class InheritanceManager {
   /**
    * The [LibraryElement] that is managed by this manager.
@@ -77,7 +77,7 @@
    * @return a mapping between the set of all members inherited from the passed [ClassElement]
    *         superclass hierarchy, and the associated [ExecutableElement]
    */
-  @Deprecated('Use InheritanceManager2.getInheritedConcreteMap() instead.')
+  @Deprecated('Use InheritanceManager3.getInheritedConcreteMap() instead.')
   MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) =>
       new MemberMap.fromMap(
           _computeClassChainLookupMap(classElt, new HashSet<ClassElement>()));
@@ -90,7 +90,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement].
    */
-  @Deprecated('Use InheritanceManager2.getInheritedMap() instead.')
+  @Deprecated('Use InheritanceManager3.getInheritedMap() instead.')
   MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) =>
       new MemberMap.fromMap(
           _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>()));
@@ -126,7 +126,7 @@
    * @return the inherited executable element with the member name, or `null` if no such
    *         member exists
    */
-  @Deprecated('Use InheritanceManager2.getInherited() instead.')
+  @Deprecated('Use InheritanceManager3.getInherited() instead.')
   ExecutableElement lookupInheritance(
       ClassElement classElt, String memberName) {
     if (memberName == null || memberName.isEmpty) {
@@ -151,7 +151,7 @@
    * @return the inherited executable element with the member name, or `null` if no such
    *         member exists
    */
-  @Deprecated('Use InheritanceManager2.getMember() instead.')
+  @Deprecated('Use InheritanceManager3.getMember() instead.')
   ExecutableElement lookupMember(ClassElement classElt, String memberName) {
     ExecutableElement element = _lookupMemberInClass(classElt, memberName);
     if (element != null) {
@@ -170,7 +170,7 @@
    * @param memberName the name of the class member to query
    * @return a list of overridden methods
    */
-  @Deprecated('Use InheritanceManager2.getOverridden() instead.')
+  @Deprecated('Use InheritanceManager3.getOverridden() instead.')
   List<ExecutableElement> lookupOverrides(
       ClassElement classElt, String memberName) {
     List<ExecutableElement> result = new List<ExecutableElement>();
@@ -681,7 +681,7 @@
             //
             resultMap[key] = elements[subtypesOfAllOtherTypesIndexes[0]];
           } else {
-            if (!subtypesOfAllOtherTypesIndexes.isEmpty) {
+            if (subtypesOfAllOtherTypesIndexes.isNotEmpty) {
               //
               // Example: class A inherits 2 methods named 'm'.
               // One has the function type '(int) -> dynamic' and one has the
diff --git a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
index 3bb5ec4..60d1e92 100644
--- a/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/method_invocation_resolver.dart
@@ -7,12 +7,14 @@
 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/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/super_context.dart';
 import 'package:analyzer/src/generated/variable_type_provider.dart';
 
 class MethodInvocationResolver {
@@ -28,7 +30,7 @@
   final InterfaceType _typeType;
 
   /// The manager for the inheritance mappings.
-  final InheritanceManager2 _inheritance;
+  final InheritanceManager3 _inheritance;
 
   /// The element for the library containing the compilation unit being visited.
   final LibraryElement _definingLibrary;
@@ -45,12 +47,17 @@
   /// The [Name] object of the invocation being resolved by [resolve].
   Name _currentName;
 
+  /// Helper for extension method resolution.
+  //todo(pq): consider sharing instance with element_resolver
+  final ExtensionMemberResolver _extensionResolver;
+
   MethodInvocationResolver(this._resolver)
       : _typeType = _resolver.typeProvider.typeType,
         _inheritance = _resolver.inheritance,
         _definingLibrary = _resolver.definingLibrary,
         _definingLibraryUri = _resolver.definingLibrary.source.uri,
-        _localVariableTypeProvider = _resolver.localVariableTypeProvider;
+        _localVariableTypeProvider = _resolver.localVariableTypeProvider,
+        _extensionResolver = ExtensionMemberResolver(_resolver);
 
   /// The scope used to resolve identifiers.
   Scope get nameScope => _resolver.nameScope;
@@ -89,11 +96,25 @@
       }
     }
 
+    if (receiver is Identifier) {
+      var receiverElement = receiver.staticElement;
+      if (receiverElement is ExtensionElement) {
+        _resolveExtensionMember(
+            node, receiver, receiverElement, nameNode, name);
+        return;
+      }
+    }
+
     if (receiver is SuperExpression) {
       _resolveReceiverSuper(node, receiver, nameNode, name);
       return;
     }
 
+    if (receiver is ExtensionOverride) {
+      _resolveExtensionOverride(node, receiver, nameNode, name);
+      return;
+    }
+
     ClassElement typeReference = getTypeReference(receiver);
     if (typeReference != null) {
       _resolveReceiverTypeLiteral(node, typeReference, nameNode, name);
@@ -123,6 +144,11 @@
       _reportUseOfVoidType(node, receiver);
       return;
     }
+
+    if (receiverType == BottomTypeImpl.instance) {
+      _reportUseOfNeverType(node, receiver);
+      return;
+    }
   }
 
   /// Given an [argumentList] and the executable [element] that  will be invoked
@@ -144,18 +170,17 @@
     return null;
   }
 
-  /// If the element of the invoked [targetType] is a getter, then actually
-  /// the return type of the [targetType] is invoked.  So, remember the
-  /// [targetType] into [MethodInvocationImpl.methodNameType] and return the
-  /// actual invoked type.
-  DartType _getCalleeType(MethodInvocation node, FunctionType targetType) {
-    if (targetType.element.kind == ElementKind.GETTER) {
-      (node as MethodInvocationImpl).methodNameType = targetType;
-      var calleeType = targetType.returnType;
+  /// If the invoked [target] is a getter, then actually the return type of
+  /// the [target] is invoked.  So, remember the [target] into
+  /// [MethodInvocationImpl.methodNameType] and return the actual invoked type.
+  DartType _getCalleeType(MethodInvocation node, ExecutableElement target) {
+    if (target.kind == ElementKind.GETTER) {
+      (node as MethodInvocationImpl).methodNameType = target.type;
+      var calleeType = target.returnType;
       calleeType = _resolveTypeParameter(calleeType);
       return calleeType;
     }
-    return targetType;
+    return target.type;
   }
 
   /// Check for a generic type, and apply type arguments.
@@ -242,6 +267,14 @@
     );
   }
 
+  void _reportUseOfNeverType(MethodInvocation node, AstNode errorNode) {
+    _setDynamicResolution(node);
+    _resolver.errorReporter.reportErrorForNode(
+      StaticWarningCode.INVALID_USE_OF_NEVER_VALUE,
+      errorNode,
+    );
+  }
+
   void _reportUseOfVoidType(MethodInvocation node, AstNode errorNode) {
     _setDynamicResolution(node);
     _resolver.errorReporter.reportErrorForNode(
@@ -303,6 +336,101 @@
     return null;
   }
 
+  /// If there is an extension matching the [receiverType] and defining a
+  /// member with the given [name], resolve to the corresponding extension
+  /// method and return `true`. Otherwise return `false`.
+  ExtensionResolutionResult _resolveExtension(
+    MethodInvocation node,
+    DartType receiverType,
+    SimpleIdentifier nameNode,
+    String name,
+  ) {
+    var result = _extensionResolver.findExtension(
+      receiverType,
+      name,
+      nameNode,
+      ElementKind.METHOD,
+    );
+
+    if (!result.isSingle) {
+      _setDynamicResolution(node);
+      return result;
+    }
+
+    ExecutableElement member = result.extension.instantiatedMember;
+
+    if (member.isStatic) {
+      _setDynamicResolution(node);
+      _resolver.errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.ACCESS_STATIC_EXTENSION_MEMBER,
+        nameNode,
+      );
+      return result;
+    }
+
+    nameNode.staticElement = member;
+    var calleeType = _getCalleeType(node, member);
+    _setResolution(node, calleeType);
+    return result;
+  }
+
+  void _resolveExtensionMember(MethodInvocation node, Identifier receiver,
+      ExtensionElement extension, SimpleIdentifier nameNode, String name) {
+    ExecutableElement element =
+        extension.getMethod(name) ?? extension.getGetter(name);
+    if (element is ExecutableElement) {
+      if (!element.isStatic) {
+        _resolver.errorReporter.reportErrorForNode(
+            StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
+            nameNode,
+            [name]);
+      }
+      nameNode.staticElement = element;
+      _setResolution(node, _getCalleeType(node, element));
+    } else {
+      _reportUndefinedFunction(node, receiver);
+    }
+  }
+
+  void _resolveExtensionOverride(MethodInvocation node,
+      ExtensionOverride override, SimpleIdentifier nameNode, String name) {
+    ExtensionElement element = override.extensionName.staticElement;
+    ExecutableElement member =
+        element.getMethod(name) ?? element.getGetter(name);
+
+    if (member == null) {
+      _setDynamicResolution(node);
+      _resolver.errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
+        nameNode,
+        [name, element.name],
+      );
+      return;
+    }
+
+    member = ExecutableMember.from3(
+      member,
+      element.typeParameters,
+      override.typeArgumentTypes,
+    );
+
+    if (member is ExecutableElement && member.isStatic) {
+      _resolver.errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+        nameNode,
+      );
+    }
+
+    if (node.isCascaded) {
+      // TODO(brianwilkerson) Report this error and decide how to recover.
+      throw new UnsupportedError('cascaded extension override');
+    }
+
+    nameNode.staticElement = member;
+    var calleeType = _getCalleeType(node, member);
+    _setResolution(node, calleeType);
+  }
+
   void _resolveReceiverDynamic(MethodInvocation node, String name) {
     _setDynamicResolution(node);
   }
@@ -319,13 +447,13 @@
     }
 
     // We can invoke Object methods on Function.
-    var type = _inheritance.getMember(
+    var member = _inheritance.getMember(
       _resolver.typeProvider.objectType,
       new Name(null, name),
     );
-    if (type != null) {
-      nameNode.staticElement = type.element;
-      return _setResolution(node, type);
+    if (member != null) {
+      nameNode.staticElement = member;
+      return _setResolution(node, member.type);
     }
 
     _reportUndefinedMethod(
@@ -343,24 +471,19 @@
       return;
     }
 
-    var targetType = _inheritance.getMember(receiverType, _currentName);
-    if (targetType != null) {
-      var calleeType = _getCalleeType(node, targetType);
-
-      // TODO(scheglov) This is bad, we have to create members here.
-      // Find a way to avoid this.
-      Element element;
-      var baseElement = targetType.element;
-      if (baseElement is MethodElement) {
-        element = MethodMember.from(baseElement, receiverType);
-      } else if (baseElement is PropertyAccessorElement) {
-        element = PropertyAccessorMember.from(baseElement, receiverType);
-      }
-      nameNode.staticElement = element;
-
+    var target = _inheritance.getMember(receiverType, _currentName);
+    if (target != null) {
+      nameNode.staticElement = target;
+      var calleeType = _getCalleeType(node, target);
       return _setResolution(node, calleeType);
     }
 
+    // Look for an applicable extension.
+    var result = _resolveExtension(node, receiverType, nameNode, name);
+    if (result.isSingle) {
+      return;
+    }
+
     // The interface of the receiver does not have an instance member.
     // Try to recover and find a member in the class.
     var targetElement = _lookUpClassMember(receiverType.element, name);
@@ -380,11 +503,13 @@
     }
 
     _setDynamicResolution(node);
-    _resolver.errorReporter.reportErrorForNode(
-      StaticTypeWarningCode.UNDEFINED_METHOD,
-      nameNode,
-      [name, receiverType.element.displayName],
-    );
+    if (result.isNone) {
+      _resolver.errorReporter.reportErrorForNode(
+        StaticTypeWarningCode.UNDEFINED_METHOD,
+        nameNode,
+        [name, receiverType.element.displayName],
+      );
+    }
   }
 
   void _resolveReceiverNull(
@@ -397,7 +522,7 @@
         element = multiply.conflictingElements[0];
       }
       if (element is ExecutableElement) {
-        var calleeType = _getCalleeType(node, element.type);
+        var calleeType = _getCalleeType(node, element);
         return _setResolution(node, calleeType);
       }
       if (element is VariableElement) {
@@ -412,17 +537,30 @@
       return _reportInvocationOfNonFunction(node);
     }
 
+    InterfaceType receiverType;
     ClassElement enclosingClass = _resolver.enclosingClass;
     if (enclosingClass == null) {
-      return _reportUndefinedFunction(node, node.methodName);
+      if (_resolver.enclosingExtension == null) {
+        return _reportUndefinedFunction(node, node.methodName);
+      }
+      var extendedType =
+          _resolveTypeParameter(_resolver.enclosingExtension.extendedType);
+      if (extendedType is InterfaceType) {
+        receiverType = extendedType;
+      } else if (extendedType is FunctionType) {
+        receiverType = _resolver.typeProvider.functionType;
+      } else {
+        return _reportUndefinedFunction(node, node.methodName);
+      }
+      enclosingClass = receiverType.element;
+    } else {
+      receiverType = enclosingClass.type;
     }
+    var target = _inheritance.getMember(receiverType, _currentName);
 
-    var receiverType = enclosingClass.type;
-    var targetType = _inheritance.getMember(receiverType, _currentName);
-
-    if (targetType != null) {
-      nameNode.staticElement = targetType.element;
-      var calleeType = _getCalleeType(node, targetType);
+    if (target != null) {
+      nameNode.staticElement = target;
+      var calleeType = _getCalleeType(node, target);
       return _setResolution(node, calleeType);
     }
 
@@ -438,6 +576,18 @@
       return;
     }
 
+    var result = _extensionResolver.findExtension(
+        receiverType, name, nameNode, ElementKind.METHOD);
+    if (result.isSingle) {
+      var target = result.extension.instantiatedMember;
+      if (target != null) {
+        nameNode.staticElement = target;
+        var calleeType = _getCalleeType(node, target);
+        _setResolution(node, calleeType);
+        return;
+      }
+    }
+
     return _reportUndefinedMethod(node, name, enclosingClass);
   }
 
@@ -472,7 +622,7 @@
     }
 
     if (element is ExecutableElement) {
-      var calleeType = _getCalleeType(node, element.type);
+      var calleeType = _getCalleeType(node, element);
       return _setResolution(node, calleeType);
     }
 
@@ -481,21 +631,22 @@
 
   void _resolveReceiverSuper(MethodInvocation node, SuperExpression receiver,
       SimpleIdentifier nameNode, String name) {
-    if (!_isSuperInValidContext(receiver)) {
+    var enclosingClass = _resolver.enclosingClass;
+    if (SuperContext.of(receiver) != SuperContext.valid) {
       return;
     }
 
-    var receiverType = _resolver.enclosingClass.type;
-    var targetType = _inheritance.getMember(
+    var receiverType = enclosingClass.type;
+    var target = _inheritance.getMember(
       receiverType,
       _currentName,
       forSuper: true,
     );
 
     // If there is that concrete dispatch target, then we are done.
-    if (targetType != null) {
-      nameNode.staticElement = targetType.element;
-      var calleeType = _getCalleeType(node, targetType);
+    if (target != null) {
+      nameNode.staticElement = target;
+      var calleeType = _getCalleeType(node, target);
       _setResolution(node, calleeType);
       return;
     }
@@ -503,16 +654,16 @@
     // Otherwise, this is an error.
     // But we would like to give the user at least some resolution.
     // So, we try to find the interface target.
-    targetType = _inheritance.getInherited(receiverType, _currentName);
-    if (targetType != null) {
-      nameNode.staticElement = targetType.element;
-      var calleeType = _getCalleeType(node, targetType);
+    target = _inheritance.getInherited(receiverType, _currentName);
+    if (target != null) {
+      nameNode.staticElement = target;
+      var calleeType = _getCalleeType(node, target);
       _setResolution(node, calleeType);
 
       _resolver.errorReporter.reportErrorForNode(
           CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
           nameNode,
-          [targetType.element.kind.displayName, name]);
+          [target.kind.displayName, name]);
       return;
     }
 
@@ -521,7 +672,7 @@
     _resolver.errorReporter.reportErrorForNode(
         StaticTypeWarningCode.UNDEFINED_SUPER_METHOD,
         nameNode,
-        [name, _resolver.enclosingClass.displayName]);
+        [name, enclosingClass.displayName]);
   }
 
   void _resolveReceiverTypeLiteral(MethodInvocation node, ClassElement receiver,
@@ -534,7 +685,7 @@
     if (element != null) {
       if (element is ExecutableElement) {
         nameNode.staticElement = element;
-        var calleeType = _getCalleeType(node, element.type);
+        var calleeType = _getCalleeType(node, element);
         _setResolution(node, calleeType);
       } else {
         _reportInvocationOfNonFunction(node);
@@ -589,8 +740,15 @@
 
     if (type is InterfaceType) {
       var call = _inheritance.getMember(type, _nameCall);
-      if (call != null && call.element.kind == ElementKind.METHOD) {
-        type = call;
+      if (call == null) {
+        var result = _extensionResolver.findExtension(
+            type, _nameCall.name, node.methodName, ElementKind.METHOD);
+        if (result.isSingle) {
+          call = result.extension.instantiatedMember;
+        }
+      }
+      if (call != null && call.kind == ElementKind.METHOD) {
+        type = call.type;
       }
     }
 
@@ -617,6 +775,10 @@
       return _reportUseOfVoidType(node, node.methodName);
     }
 
+    if (type == BottomTypeImpl.instance) {
+      return _reportUseOfNeverType(node, node.methodName);
+    }
+
     _reportInvocationOfNonFunction(node);
   }
 
@@ -633,22 +795,6 @@
     return null;
   }
 
-  /// Return `true` if the given 'super' [expression] is used in a valid context.
-  static bool _isSuperInValidContext(SuperExpression expression) {
-    for (AstNode node = expression; node != null; node = node.parent) {
-      if (node is CompilationUnit) {
-        return false;
-      } else if (node is ConstructorDeclaration) {
-        return node.factoryKeyword == null;
-      } else if (node is ConstructorFieldInitializer) {
-        return false;
-      } else if (node is MethodDeclaration) {
-        return !node.isStatic;
-      }
-    }
-    return false;
-  }
-
   /// As an experiment for using synthetic [FunctionType]s, we replace some
   /// function types with the equivalent synthetic function type instance.
   /// The assumption that we try to prove is that only the set of parameters,
diff --git a/pkg/analyzer/lib/src/dart/resolver/scope.dart b/pkg/analyzer/lib/src/dart/resolver/scope.dart
index b7eb69e..655059b 100644
--- a/pkg/analyzer/lib/src/dart/resolver/scope.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/scope.dart
@@ -146,6 +146,32 @@
   }
 }
 
+/// The scope defined by an extension.
+class ExtensionScope extends EnclosedScope {
+  /// Initialize a newly created scope, enclosed within the [enclosingScope],
+  /// that represents the given [_extensionElement].
+  ExtensionScope(Scope enclosingScope, ExtensionElement extensionElement)
+      : super(enclosingScope) {
+    _defineMembers(extensionElement);
+  }
+
+  /// Define the static members defined by the given [extensionElement]. The
+  /// instance members should only be found if they would be found by normal
+  /// lookup on `this`.
+  void _defineMembers(ExtensionElement extensionElement) {
+    List<PropertyAccessorElement> accessors = extensionElement.accessors;
+    int accessorLength = accessors.length;
+    for (int i = 0; i < accessorLength; i++) {
+      define(accessors[i]);
+    }
+    List<MethodElement> methods = extensionElement.methods;
+    int methodLength = methods.length;
+    for (int i = 0; i < methodLength; i++) {
+      define(methods[i]);
+    }
+  }
+}
+
 /**
  * The scope defined by a function.
  */
@@ -365,6 +391,11 @@
   Map<String, Map<String, Element>> _definedPrefixedNames;
 
   /**
+   * Cache of public extensions defined in this library's imported namespaces.
+   */
+  List<ExtensionElement> _extensions;
+
+  /**
    * Initialize a newly created scope representing the names imported into the
    * [_definingLibrary].
    */
@@ -373,6 +404,23 @@
   }
 
   @override
+  List<ExtensionElement> get extensions {
+    if (_extensions == null) {
+      _extensions = [];
+      for (var namespace in _importedNamespaces) {
+        for (var element in namespace.definedNames.values) {
+          if (element is ExtensionElement &&
+              element.name.isNotEmpty /* named */ &&
+              !_extensions.contains(element)) {
+            _extensions.add(element);
+          }
+        }
+      }
+    }
+    return _extensions;
+  }
+
+  @override
   void define(Element element) {
     if (!Scope.isPrivateName(element.displayName)) {
       super.define(element);
@@ -559,6 +607,8 @@
  * A scope containing all of the names defined in a given library.
  */
 class LibraryScope extends EnclosedScope {
+  List<ExtensionElement> _extensions = <ExtensionElement>[];
+
   /**
    * Initialize a newly created scope representing the names defined in the
    * [definingLibrary].
@@ -576,6 +626,10 @@
     }
   }
 
+  @override
+  List<ExtensionElement> get extensions =>
+      enclosingScope.extensions.toList()..addAll(_extensions);
+
   /**
    * Add to this scope all of the public top-level names that are defined in the
    * given [compilationUnit].
@@ -589,6 +643,7 @@
     }
     for (ExtensionElement element in compilationUnit.extensions) {
       define(element);
+      _extensions.add(element);
     }
     for (FunctionElement element in compilationUnit.functions) {
       define(element);
@@ -770,6 +825,9 @@
     for (ClassElement element in compilationUnit.enums) {
       _addIfPublic(definedNames, element);
     }
+    for (ExtensionElement element in compilationUnit.extensions) {
+      _addIfPublic(definedNames, element);
+    }
     for (FunctionElement element in compilationUnit.functions) {
       _addIfPublic(definedNames, element);
     }
@@ -983,13 +1041,19 @@
   Scope get enclosingScope => null;
 
   /**
+   * The list of extensions defined in this scope.
+   */
+  List<ExtensionElement> get extensions =>
+      enclosingScope == null ? <ExtensionElement>[] : enclosingScope.extensions;
+
+  /**
    * Add the given [element] to this scope. If there is already an element with
    * the given name defined in this scope, then the original element will
    * continue to be mapped to the name.
    */
   void define(Element element) {
     String name = _getName(element);
-    if (name != null && !name.isEmpty) {
+    if (name != null && name.isNotEmpty) {
       _definedNames ??= new HashMap<String, Element>();
       _definedNames.putIfAbsent(name, () => element);
     }
@@ -1088,7 +1152,7 @@
   String _getName(Element element) {
     if (element is MethodElement) {
       MethodElement method = element;
-      if (method.name == "-" && method.parameters.length == 0) {
+      if (method.name == "-" && method.parameters.isEmpty) {
         return UNARY_MINUS;
       }
     }
diff --git a/pkg/analyzer/lib/src/dart/sdk/sdk.dart b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
index 22ab2f2..3f75ebc 100644
--- a/pkg/analyzer/lib/src/dart/sdk/sdk.dart
+++ b/pkg/analyzer/lib/src/dart/sdk/sdk.dart
@@ -657,7 +657,7 @@
     }
     try {
       File file = libraryDirectory.getChildAssumingFile(library.path);
-      if (!relativePath.isEmpty) {
+      if (relativePath.isNotEmpty) {
         File relativeFile = file.parent.getChildAssumingFile(relativePath);
         if (relativeFile.path == file.path) {
           // The relative file is the library, so return a Source for the
@@ -694,7 +694,7 @@
 
   static String getSdkProperty(ResourceProvider resourceProvider) {
     String exec = io.Platform.resolvedExecutable;
-    if (exec.length == 0) {
+    if (exec.isEmpty) {
       return null;
     }
     pathos.Context pathContext = resourceProvider.pathContext;
diff --git a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
index c742828..f563ec7 100644
--- a/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
+++ b/pkg/analyzer/lib/src/diagnostic/diagnostic_factory.dart
@@ -16,6 +16,37 @@
   /// Initialize a newly created diagnostic factory.
   DiagnosticFactory();
 
+  /// Return a diagnostic indicating that the [duplicateElement] (in a constant
+  /// set) is a duplicate of the [originalElement].
+  AnalysisError equalElementsInConstSet(
+      Source source, Expression duplicateElement, Expression originalElement) {
+    return new AnalysisError(
+        source,
+        duplicateElement.offset,
+        duplicateElement.length,
+        CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, [], [
+      new DiagnosticMessageImpl(
+          filePath: source.fullName,
+          message: "The first element with this value.",
+          offset: originalElement.offset,
+          length: originalElement.length)
+    ]);
+  }
+
+  /// Return a diagnostic indicating that the [duplicateKey] (in a constant map)
+  /// is a duplicate of the [originalKey].
+  AnalysisError equalKeysInConstMap(
+      Source source, Expression duplicateKey, Expression originalKey) {
+    return new AnalysisError(source, duplicateKey.offset, duplicateKey.length,
+        CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, [], [
+      new DiagnosticMessageImpl(
+          filePath: source.fullName,
+          message: "The first key with this value.",
+          offset: originalKey.offset,
+          length: originalKey.length)
+    ]);
+  }
+
   /// Return a diagnostic indicating that the given [identifier] was referenced
   /// before it was declared.
   AnalysisError referencedBeforeDeclaration(
diff --git a/pkg/analyzer/lib/src/error/codes.dart b/pkg/analyzer/lib/src/error/codes.dart
index a5590ab..a3db80c 100644
--- a/pkg/analyzer/lib/src/error/codes.dart
+++ b/pkg/analyzer/lib/src/error/codes.dart
@@ -126,6 +126,15 @@
               "same library.");
 
   /**
+   * No parameters.
+   */
+  //todo (pq): refactor to reuse StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER.
+  static const CompileTimeErrorCode ACCESS_STATIC_EXTENSION_MEMBER =
+      const CompileTimeErrorCode('ACCESS_STATIC_EXTENSION_MEMBER',
+          "Static extension members can't be accessed.",
+          correction: "Try removing the static member access.");
+
+  /**
    * 14.2 Exports: It is a compile-time error if a name <i>N</i> is re-exported
    * by a library <i>L</i> and <i>N</i> is introduced into the export namespace
    * of <i>L</i> by more than one export, unless each all exports refer to same
@@ -143,6 +152,24 @@
               "explicitly hiding the name in one of the export directives.");
 
   /**
+   * It is a compile time error if there are two applicable extensions defining
+   * the same member and neither is more specific than the other.
+   *
+   * Parameters:
+   * 0: the name of the member
+   * 1: the name of the first declaring extension
+   * 2: the name of the second declaring extension
+   */
+  static const CompileTimeErrorCode AMBIGUOUS_EXTENSION_METHOD_ACCESS =
+      const CompileTimeErrorCode(
+          'AMBIGUOUS_EXTENSION_METHOD_ACCESS',
+          "A member named '{0}' is defined in extensions '{1}' and '{2}' and "
+              "neither is more specific.",
+          correction:
+              "Try using an extension override to specify the extension "
+              "you want to to be chosen.");
+
+  /**
    * No parameters.
    */
   // #### Description
@@ -166,7 +193,7 @@
   //
   // ```dart
   // union(Map<String, String> a, List<String> b, Map<String, String> c) =>
-  //     {...a, ...b, ...c};
+  //     [!{...a, ...b, ...c}!];
   // ```
   //
   // The list `b` can only be spread into a set, and the maps `a` and `c` can
@@ -185,7 +212,7 @@
   // ```
   //
   // The second fix is to change the elements of one kind into elements that are
-  // consistent with the other elements. For example, you could add the elements
+  // consistent with the other elements. For example, you can add the elements
   // of the list as keys that map to themselves:
   //
   // ```dart
@@ -224,7 +251,7 @@
   // The following code produces this diagnostic:
   //
   // ```dart
-  // union(a, b) => !{...a, ...b}!;
+  // union(a, b) => [!{...a, ...b}!];
   // ```
   //
   // The problem occurs because there are no type arguments, and there is no
@@ -241,8 +268,8 @@
   // ```
   //
   // The second fix is to add type information so that the expressions have
-  // either the type `Iterable` or the type `Map`. You could add an explicit
-  // cast or, in this case, add types to the declarations of the two parameters:
+  // either the type `Iterable` or the type `Map`. You can add an explicit cast
+  // or, in this case, add types to the declarations of the two parameters:
   //
   // ```dart
   // union(List<int> a, List<int> b) => {...a, ...b};
@@ -315,10 +342,10 @@
    */
   static const CompileTimeErrorCode ASYNC_FOR_IN_WRONG_CONTEXT =
       const CompileTimeErrorCode('ASYNC_FOR_IN_WRONG_CONTEXT',
-          "The asynchronous for-in can only be used in an asynchronous function.",
+          "The async for-in can only be used in an async function.",
           correction:
-              "Try marking the function body with either 'async' or 'async*', or "
-              "removing the 'await' before the for loop.");
+              "Try marking the function body with either 'async' or 'async*', "
+              "or removing the 'await' before the for loop.");
 
   /**
    * 16.30 Await Expressions: It is a compile-time error if the function
@@ -327,7 +354,7 @@
    */
   static const CompileTimeErrorCode AWAIT_IN_WRONG_CONTEXT =
       const CompileTimeErrorCode('AWAIT_IN_WRONG_CONTEXT',
-          "The await expression can only be used in an asynchronous function.",
+          "The await expression can only be used in an async function.",
           correction:
               "Try marking the function body with either 'async' or 'async*'.");
 
@@ -391,8 +418,10 @@
    * 0: the built-in identifier that is being used
    */
   static const CompileTimeErrorCode BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME =
-      const CompileTimeErrorCode('BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME',
-          "The built-in identifier '{0}' can't be used as a type parameter name.",
+      const CompileTimeErrorCode(
+          'BUILT_IN_IDENTIFIER_AS_TYPE_PARAMETER_NAME',
+          "The built-in identifier '{0}' can't be used as a type parameter "
+              "name.",
           correction: "Try choosing a different name for the type parameter.");
 
   /**
@@ -403,8 +432,10 @@
    * 0: the this of the switch case expression
    */
   static const CompileTimeErrorCode CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS =
-      const CompileTimeErrorCode('CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
-          "The switch case expression type '{0}' can't override the == operator.");
+      const CompileTimeErrorCode(
+          'CASE_EXPRESSION_TYPE_IMPLEMENTS_EQUALS',
+          "The switch case expression type '{0}' can't override the == "
+              "operator.");
 
   /**
    * 10.11 Class Member Conflicts: Let `C` be a class. It is a compile-time
@@ -544,8 +575,8 @@
   static const CompileTimeErrorCode CONST_CONSTRUCTOR_THROWS_EXCEPTION =
       const CompileTimeErrorCode('CONST_CONSTRUCTOR_THROWS_EXCEPTION',
           "Const constructors can't throw exceptions.",
-          correction:
-              "Try removing the throw statement, or removing the keyword 'const'.");
+          correction: "Try removing the throw statement, or "
+              "removing the keyword 'const'.");
 
   /**
    * 10.6.3 Constant Constructors: It is a compile-time error if a constant
@@ -632,9 +663,41 @@
           correction: "Try removing the 'const' keyword.");
 
   /**
-   * 5 Variables: A constant variable must be initialized to a compile-time
-   * constant or a compile-time error occurs.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a value that isn't statically
+  // known to be a constant is assigned to a variable that's declared to be a
+  // 'const' variable.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `x` isn't declared to
+  // be `const`:
+  //
+  // ```dart
+  // var x = 0;
+  // const y = [!x!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the value being assigned can be declared to be `const`, then change the
+  // declaration:
+  //
+  // ```dart
+  // const x = 0;
+  // const y = x;
+  // ```
+  //
+  // If the value can't be declared to be `const`, then remove the `const`
+  // modifier from the variable, possibly using `final` in its place:
+  //
+  // ```dart
+  // var x = 0;
+  // final y = x;
+  // ```
   static const CompileTimeErrorCode CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE =
       const CompileTimeErrorCode('CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE',
           "Const variables must be initialized with a constant value.",
@@ -655,9 +718,9 @@
           "Constant values from a deferred library can't be used to "
               "initialized a const variable.",
           correction:
-              "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.");
 
   /**
    * 7.5 Instance Variables: It is a compile-time error if an instance variable
@@ -666,8 +729,8 @@
   static const CompileTimeErrorCode CONST_INSTANCE_FIELD =
       const CompileTimeErrorCode('CONST_INSTANCE_FIELD',
           "Only static fields can be declared as const.",
-          correction:
-              "Try declaring the field as final, or adding the keyword 'static'.");
+          correction: "Try declaring the field as final, or adding the keyword "
+              "'static'.");
 
   static const CompileTimeErrorCode CONST_SPREAD_EXPECTED_LIST_OR_SET =
       const CompileTimeErrorCode('CONST_SPREAD_EXPECTED_LIST_OR_SET',
@@ -817,8 +880,8 @@
           "The type '{0}' is declared with {1} type parameters, but {2} type "
               "arguments were given.",
           correction:
-              "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.");
 
   /**
    * 16.12.2 Const: If <i>e</i> is of the form <i>const T(a<sub>1</sub>,
@@ -912,9 +975,9 @@
   static const CompileTimeErrorCode DEFAULT_LIST_CONSTRUCTOR_MISMATCH =
       const CompileTimeErrorCode(
           'DEFAULT_LIST_CONSTRUCTOR_MISMATCH',
-          "A list whose values cannot be 'null' cannot be given an initial length "
-              "because the initial values would all be 'null'.",
-          correction: "Try removing the argument.");
+          "A list whose values can't be 'null' can't be given an initial "
+              "length because the initial values would all be 'null'.",
+          correction: "Try removing the argument or using 'List.filled'.");
 
   /**
    * 6.2.1 Required Formals: By means of a function signature that names the
@@ -954,7 +1017,7 @@
   // The following code generates this diagnostic:
   //
   // ```dart
-  // void log({required String !message! = 'no message'}) {}
+  // void log({required String [!message!] = 'no message'}) {}
   // ```
   //
   // #### Common fixes
@@ -1041,12 +1104,40 @@
       const CompileTimeErrorCode('DUPLICATE_NAMED_ARGUMENT',
           "The argument for the named parameter '{0}' was already specified.",
           correction: "Try removing one of the named arguments, or "
-              "correcting one of the names to reference a different named parameter.");
+              "correcting one of the names to reference a different named "
+              "parameter.");
 
   /**
-   * 16.10 Maps: It is a compile-time error if two keys of a constant map
-   * literal are equal according to their `==` operator (16.27).
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a key in a constant map is the
+  // same as a previous key in the same map. If two keys are the same, then the
+  // second value would overwrite the first value, which makes having both pairs
+  // pointless.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // const map = <int, String>{1: 'a', 2: 'b', [!1!]: 'c', 4: 'd'};
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If one of the keys was supposed to be different, then replace it:
+  //
+  // ```dart
+  // const map = <int, String>{1: 'a', 2: 'b', 3: 'c', 4: 'd'};
+  // ```
+  //
+  // Otherwise, remove the key/value pair that isn't intended to be in the map:
+  //
+  // ```dart
+  // const map = <int, String>{1: 'a', 2: 'b', 4: 'd'};
+  // ```
   static const CompileTimeErrorCode EQUAL_KEYS_IN_CONST_MAP =
       const CompileTimeErrorCode('EQUAL_KEYS_IN_CONST_MAP',
           "Two keys in a constant map literal can't be equal.");
@@ -1094,7 +1185,7 @@
   // The following code generates this diagnostic:
   //
   // ```dart
-  // var map = <String, int>{'a': 0, 'b': 1, !'c'!};
+  // var map = <String, int>{'a': 0, 'b': 1, [!'c'!]};
   // ```
   //
   // #### Common fix
@@ -1110,7 +1201,8 @@
       const CompileTimeErrorCode(
           'EXPRESSION_IN_MAP', "Expressions can't be used in a map literal.",
           correction:
-              "Try removing the expression or converting it to be a map entry.");
+              "Try removing the expression or converting it to be a map "
+              "entry.");
 
   /**
    * 7.9 Superclasses: It is a compile-time error if the extends clause of a
@@ -1120,10 +1212,12 @@
    * Parameters:
    * 0: the name of the superclass that was not found
    */
-  static const CompileTimeErrorCode EXTENDS_NON_CLASS = const CompileTimeErrorCode(
-      'EXTENDS_NON_CLASS', "Classes can only extend other classes.",
-      correction:
-          "Try specifying a different superclass, or removing the extends clause.");
+  static const CompileTimeErrorCode EXTENDS_NON_CLASS =
+      const CompileTimeErrorCode(
+          'EXTENDS_NON_CLASS', "Classes can only extend other classes.",
+          correction:
+              "Try specifying a different superclass, or removing the extends "
+              "clause.");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or
@@ -1175,6 +1269,71 @@
               "removing the extends clause.");
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_DECLARES_ABSTRACT_MEMBER =
+      const CompileTimeErrorCode('EXTENSION_DECLARES_ABSTRACT_MEMBER',
+          "Extensions can't declare abstract members.",
+          correction: "Try providing an implementation for the member.");
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_DECLARES_CONSTRUCTOR =
+      const CompileTimeErrorCode('EXTENSION_DECLARES_CONSTRUCTOR',
+          "Extensions can't declare constructors.",
+          correction: "Try removing the constructor declaration.");
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_DECLARES_INSTANCE_FIELD =
+      const CompileTimeErrorCode('EXTENSION_DECLARES_INSTANCE_FIELD',
+          "Extensions can't declare instance fields.",
+          correction:
+              "Try removing the field declaration or making it a static "
+              "field.");
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_DECLARES_MEMBER_OF_OBJECT =
+      const CompileTimeErrorCode(
+          'EXTENSION_DECLARES_MEMBER_OF_OBJECT',
+          "Extensions can't declare members with the same name as a member "
+              "declared by 'Object'.",
+          correction: "Try specifying a different name for the member.");
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER =
+      const CompileTimeErrorCode(
+          'EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER',
+          "An extension override can't be used to access a static member from "
+              "an extension.",
+          correction: "Try using just the name of the extension.");
+
+  /**
+   * Parameters:
+   * 0: the type of the argument
+   * 1: the extended type
+   */
+  static const CompileTimeErrorCode EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE =
+      const CompileTimeErrorCode(
+          'EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE',
+          "The type of the argument to the extension override '{0}' "
+              "isn't assignable to the extended type '{1}'.");
+
+  /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode EXTENSION_OVERRIDE_WITHOUT_ACCESS =
+      const CompileTimeErrorCode('EXTENSION_OVERRIDE_WITHOUT_ACCESS',
+          "An extension override can only be used to access instance members.",
+          correction: 'Consider adding an access to an instance member.');
+
+  /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m &lt;
    * h</i> or if <i>m &gt; n</i>.
    *
@@ -1255,8 +1414,10 @@
    * generative constructor.
    */
   static const CompileTimeErrorCode FIELD_INITIALIZER_FACTORY_CONSTRUCTOR =
-      const CompileTimeErrorCode('FIELD_INITIALIZER_FACTORY_CONSTRUCTOR',
-          "Initializing formal parameters can't be used in factory constructors.",
+      const CompileTimeErrorCode(
+          'FIELD_INITIALIZER_FACTORY_CONSTRUCTOR',
+          "Initializing formal parameters can't be used in factory "
+              "constructors.",
           correction: "Try using a normal parameter.");
 
   /**
@@ -1293,7 +1454,7 @@
    */
   static const CompileTimeErrorCode GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED =
       const CompileTimeErrorCode('GENERIC_FUNCTION_TYPED_PARAM_UNSUPPORTED',
-          "Analysis of generic function typed parameters is not yet supported.",
+          "Analysis of generic function typed parameters isn't yet supported.",
           correction:
               "Try using an explicit typedef, or changing type parameters to "
               "`dynamic`.");
@@ -1579,7 +1740,8 @@
           "The integer literal {0} can't be represented in 64 bits.",
           correction:
               "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.");
+              "9,223,372,036,854,775,807 or less than "
+              "-9,223,372,036,854,775,808.");
 
   /**
    * An integer literal with static type `double` and numeric value `i`
@@ -1591,11 +1753,11 @@
       const 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 and/or loss of '
-              'precision: {0}',
+              "represented as a 64 bit double without overflow and/or loss of "
+              "precision: {0}",
           correction:
-              'Try using the BigInt class, or switch to the closest valid '
-              'double: {1}');
+              "Try using the BigInt class, or switch to the closest valid "
+              "double: {1}");
 
   /**
    * 15 Metadata: Metadata consists of a series of annotations, each of which
@@ -1619,8 +1781,10 @@
    * not qualified by a deferred prefix.
    */
   static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY =
-      const CompileTimeErrorCode('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY',
-          "Constant values from a deferred library can't be used as annotations.",
+      const CompileTimeErrorCode(
+          'INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY',
+          "Constant values from a deferred library can't be used as "
+              "annotations.",
           correction: "Try removing the annotation, or "
               "changing the import to not be deferred.");
 
@@ -1632,7 +1796,7 @@
    */
   static const CompileTimeErrorCode INVALID_ANNOTATION_GETTER =
       const CompileTimeErrorCode(
-          'INVALID_ANNOTATION_GETTER', "Getters cannot be used as annotations.",
+          'INVALID_ANNOTATION_GETTER', "Getters can't be used as annotations.",
           correction: "Try using a top-level variable or a field.");
 
   /**
@@ -1672,6 +1836,16 @@
           'INVALID_CONSTRUCTOR_NAME', "Invalid constructor name.");
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode INVALID_EXTENSION_ARGUMENT_COUNT =
+      const CompileTimeErrorCode(
+          'INVALID_EXTENSION_ARGUMENT_COUNT',
+          "Extension overrides must have exactly one argument: "
+              "the value of 'this' in the extension method.",
+          correction: "Try specifying exactly one argument.");
+
+  /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of
    * the immediately enclosing class.
    */
@@ -1682,10 +1856,12 @@
               "the immediately enclosing class.");
 
   static const CompileTimeErrorCode INVALID_INLINE_FUNCTION_TYPE =
-      const CompileTimeErrorCode('INVALID_INLINE_FUNCTION_TYPE',
-          "Inline function types cannot be used for parameters in a generic function type.",
-          correction:
-              "Try using a generic function type (returnType 'Function(' parameters ')').");
+      const CompileTimeErrorCode(
+          'INVALID_INLINE_FUNCTION_TYPE',
+          "Inline function types can't be used for parameters in a generic "
+              "function type.",
+          correction: "Try using a generic function type "
+              "(returnType 'Function(' parameters ')').");
 
   /**
    * It is an error if an optional parameter (named or otherwise) with no
@@ -1695,10 +1871,10 @@
   static const CompileTimeErrorCode INVALID_OPTIONAL_PARAMETER_TYPE =
       const CompileTimeErrorCode(
           'INVALID_OPTIONAL_PARAMETER_TYPE',
-          "The parameter '{0}' cannot have a value of 'null' because of its "
-              "type, but no default value it valid, so it must be a required "
-              "parameter.",
-          correction: "Try making this nullable (by adding a '?') or "
+          "The parameter '{0}' can't have a value of 'null' because of its "
+              "type, but no non-null default value is provided.",
+          correction: "Try making this nullable (by adding a '?'), "
+              "adding a default value, or "
               "making this a required parameter.");
 
   /**
@@ -1780,6 +1956,14 @@
           correction: "Try removing the 'covariant' keyword.");
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode INVALID_USE_OF_COVARIANT_IN_EXTENSION =
+      const CompileTimeErrorCode('INVALID_USE_OF_COVARIANT_IN_EXTENSION',
+          "The 'covariant' keyword can't be used in extensions.",
+          correction: "Try removing the 'covariant' keyword.");
+
+  /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at
    * the specified URI is not a library declaration.
    *
@@ -1835,7 +2019,8 @@
       const CompileTimeErrorCode('MAP_ENTRY_NOT_IN_MAP',
           "Map entries can only be used in a map literal.",
           correction:
-              "Try converting the collection to a map or removing the map entry.");
+              "Try converting the collection to a map or removing the map "
+              "entry.");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member
@@ -1898,7 +2083,7 @@
   // The following code generates this diagnostic:
   //
   // ```dart
-  // void log({String !message!}) {}
+  // void log({String [!message!]}) {}
   // ```
   //
   // #### Common fixes
@@ -1938,10 +2123,8 @@
    * 0: the name of the parameter
    */
   static const CompileTimeErrorCode MISSING_REQUIRED_ARGUMENT =
-      const CompileTimeErrorCode(
-          'MISSING_REQUIRED_ARGUMENT',
-          "The named parameter '{0}' is required so "
-              "there needs to be a corresponding argument.",
+      const CompileTimeErrorCode('MISSING_REQUIRED_ARGUMENT',
+          "The named parameter '{0}' is required but was not provided.",
           correction: "Try adding the required argument.");
 
   /**
@@ -1978,8 +2161,8 @@
   static const CompileTimeErrorCode
       MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE = const CompileTimeErrorCode(
           'MIXIN_APPLICATION_NOT_IMPLEMENTED_INTERFACE',
-          "'{0}' cannot be mixed onto '{1}' "
-              "because '{1}' does not implement '{2}'.",
+          "'{0}' can't be mixed onto '{1}' because '{1}' doesn't implement "
+              "'{2}'.",
           correction: "Try extending the class '{0}'.");
 
   /**
@@ -2036,23 +2219,23 @@
       MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES =
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_INCONSISTENT_MATCHING_CLASSES',
-          "Type parameters could not be inferred for the mixin '{0}' because "
+          "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 =
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_NO_MATCHING_CLASS',
-          "Type parameters could not be inferred for the mixin '{0}' because "
-              "the base class does not implement the mixin's supertype "
+          "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 =
       const CompileTimeErrorCode(
           'MIXIN_INFERENCE_NO_POSSIBLE_SUBSTITUTION',
-          "Type parameters could not 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");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class
@@ -2301,9 +2484,45 @@
               "inside the function body.");
 
   /**
-   * 12.6 Lists: It is a compile time error if an element of a constant list
-   * literal is not a compile-time constant.
+   * No parameters.
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an element in a constant list
+  // literal isn't a constant value. The list literal can be constant either
+  // explicitly (because it's prefixed by the keyword `const`) or implicitly
+  // (because it appears in a <a href=”#constant-context”>constant context</a>).
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `x` isn't a constant,
+  // even though it appears in an implicitly constant list literal:
+  //
+  // ```dart
+  // int x = 2;
+  // const y = <int>[0, 1, [!x!]];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the list needs to be a constant list, then convert the element to be a
+  // constant. In the example above, you might add the keyword `const`
+  // to the declaration of `x`:
+  //
+  // ```dart
+  // const int x = 2;
+  // const y = <int>[0, 1, x];
+  // ```
+  //
+  // If the expression can't be made a constant, then the list can't be a
+  // constant either, so you must change the code so that the list isn't a
+  // constant. In the example above this means removing the `const` keyword from
+  // the declaration of `y`:
+  //
+  // ```dart
+  // int x = 2;
+  // var y = <int>[0, 1, x];
+  // ```
   static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT =
       const CompileTimeErrorCode('NON_CONSTANT_LIST_ELEMENT',
           "The values in a const list literal must be constants.",
@@ -2429,8 +2648,10 @@
    */
   @deprecated
   static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER =
-      const CompileTimeErrorCode('NON_CONSTANT_VALUE_IN_INITIALIZER',
-          "Initializer expressions in constant constructors must be constants.");
+      const CompileTimeErrorCode(
+          'NON_CONSTANT_VALUE_IN_INITIALIZER',
+          "Initializer expressions in constant constructors must be "
+              "constants.");
 
   static const CompileTimeErrorCode NON_SYNC_FACTORY =
       const CompileTimeErrorCode('NON_SYNC_FACTORY',
@@ -2448,8 +2669,8 @@
       NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE =
       const CompileTimeErrorCode(
           'NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE',
-          "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.",
           correction: "Try giving it an initializer expression, "
               "or ensure that it is assigned on every execution path, "
               "or mark it 'late'.");
@@ -2471,29 +2692,52 @@
           correction: "Try adding the missing arguments.");
 
   /**
-   * It is an error if a static variable with potentially non-nullable type has
-   * no initializer expression.
+   * It is an error if an instance field with potentially non-nullable type has
+   * no initializer expression and is not initialized in a constructor via an
+   * initializing formal or an initializer list entry, unless the field is
+   * marked with the `late` modifier.
    *
    * Parameters:
-   * 0: the name of the field that is invalid
+   * 0: the name of the field that is not initialized
    */
-  static const CompileTimeErrorCode NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD =
-      const CompileTimeErrorCode('NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD',
-          "Non-nullable static field '{0}' must be initialized.",
-          correction: "Try adding an initializer expression.");
+  static const CompileTimeErrorCode
+      NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD = const CompileTimeErrorCode(
+          'NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD',
+          "Non-nullable instance field '{0}' must be initialized.",
+          correction: "Try adding an initializer expression, "
+              "or a generative constructor that initializes it, "
+              "or mark it 'late'.");
 
   /**
-   * It is an error if a top level variable <cut> with potentially non-nullable
-   * type has no initializer expression <cut>.
+   * It is an error if an instance field with potentially non-nullable type has
+   * no initializer expression and is not initialized in a constructor via an
+   * initializing formal or an initializer list entry, unless the field is
+   * marked with the `late` modifier.
+   *
+   * Parameters:
+   *
+   * Parameters:
+   * 0: the name of the field that is not initialized
+   */
+  static const CompileTimeErrorCode
+      NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR =
+      const CompileTimeErrorCode(
+          'NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR',
+          "Non-nullable instance field '{0}' must be initialized.",
+          correction: "Try adding an initializer expression, "
+              "or add a field initializer in this constructor, "
+              "or mark it 'late'.");
+
+  /**
+   * It is an error if a static field or top-level variable with potentially
+   * non-nullable type has no initializer expression.
    *
    * Parameters:
    * 0: the name of the variable that is invalid
    */
-  static const CompileTimeErrorCode
-      NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE =
-      const CompileTimeErrorCode(
-          'NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE',
-          "Non-nullable top-level variable '{0}' must be initialized.",
+  static const CompileTimeErrorCode NOT_INITIALIZED_NON_NULLABLE_VARIABLE =
+      const CompileTimeErrorCode('NOT_INITIALIZED_NON_NULLABLE_VARIABLE',
+          "The non-nullable variable '{0}' must be initialized.",
           correction: "Try adding an initializer expression.");
 
   /**
@@ -2511,7 +2755,7 @@
   //
   // ```dart
   // var m = <String, int>{'a': 0, 'b': 1};
-  // var s = <String>{...m};
+  // var s = <String>{...[!m!]};
   // ```
   //
   // #### Common fix
@@ -2532,8 +2776,10 @@
       "Spread elements in map literals must implement 'Map'.");
 
   static const CompileTimeErrorCode NOT_NULL_AWARE_NULL_SPREAD =
-      const CompileTimeErrorCode('NOT_NULL_AWARE_NULL_SPREAD',
-          "The Null typed expression can't be used with a non-null-aware spread.");
+      const CompileTimeErrorCode(
+          'NOT_NULL_AWARE_NULL_SPREAD',
+          "The Null typed expression can't be used with a non-null-aware "
+              "spread.");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the
@@ -2556,8 +2802,8 @@
   static const CompileTimeErrorCode NULLABLE_TYPE_IN_CATCH_CLAUSE =
       const CompileTimeErrorCode(
           'NULLABLE_TYPE_IN_CATCH_CLAUSE',
-          "A nullable type cannot be used in an 'on' clause because it isn't valid "
-              "to throw 'null'.",
+          "A nullable type can't be used in an 'on' clause because it isn't "
+              "valid to throw 'null'.",
           correction: "Try removing the question mark.");
 
   /**
@@ -2581,7 +2827,7 @@
   // The following code generates this diagnostic:
   //
   // ```dart
-  // class Invalid extends !Duration?! {}
+  // class Invalid extends [!Duration?!] {}
   // ```
   //
   // #### Common fixes
@@ -2602,7 +2848,7 @@
    */
   static const CompileTimeErrorCode NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE =
       const CompileTimeErrorCode('NULLABLE_TYPE_IN_IMPLEMENTS_CLAUSE',
-          "A class or mixin cannot implement a nullable type.",
+          "A class or mixin can't implement a nullable type.",
           correction: "Try removing the question mark.");
 
   /**
@@ -2611,7 +2857,7 @@
    */
   static const CompileTimeErrorCode NULLABLE_TYPE_IN_ON_CLAUSE =
       const CompileTimeErrorCode('NULLABLE_TYPE_IN_ON_CLAUSE',
-          "A mixin cannot have a nullable type as a superclass constraint.",
+          "A mixin can't have a nullable type as a superclass constraint.",
           correction: "Try removing the question mark.");
 
   /**
@@ -2620,7 +2866,7 @@
    */
   static const CompileTimeErrorCode NULLABLE_TYPE_IN_WITH_CLAUSE =
       const CompileTimeErrorCode('NULLABLE_TYPE_IN_WITH_CLAUSE',
-          "A class or mixin cannot mix in a nullable type.",
+          "A class or mixin can't mix in a nullable type.",
           correction: "Try removing the question mark.");
 
   /**
@@ -2687,8 +2933,8 @@
           "The name '{0}' refers to an import prefix, so it must be followed "
               "by '.'.",
           correction:
-              "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.");
 
   /**
    * It is an error for a mixin to add a private name that conflicts with a
@@ -2828,9 +3074,44 @@
               "define the constructor named '{0}'.");
 
   /**
-   * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with
-   * the const modifier but <i>k'</i> is not a constant constructor.
+   * Parameters:
+   * 0: the name of the non-type referenced in the redirect
    */
+  // #### Description
+  //
+  // One way to implement a factory constructor is to redirect to another
+  // constructor by referencing the name of the constructor. The analyzer
+  // produces this diagnostic when the redirect is to something other than a
+  // constructor.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `f` is a function:
+  //
+  // ```dart
+  // C f() {}
+  // class C {
+  //   factory C() = [!f!];
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the constructor isn't defined, then either define it or replace it with
+  // a constructor that is defined.
+  //
+  // If the constructor is defined but the class that defines it isn't visible,
+  // then you probably need to add an import.
+  //
+  // If you're trying to return the value returned by a function, then rewrite
+  // the constructor to return the value from the constructor's body:
+  //
+  // ```dart
+  // C f() {}
+  // class C {
+  //   factory C() => f();
+  // }
+  // ```
   static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS =
       const CompileTimeErrorCode(
           'REDIRECT_TO_NON_CLASS',
@@ -2881,8 +3162,8 @@
       const CompileTimeErrorCode('REFERENCED_BEFORE_DECLARATION',
           "Local variable '{0}' can't be referenced before it is declared.",
           correction: "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.");
+              "renaming the local variable so that it doesn't hide a name from "
+              "an enclosing scope.");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form
@@ -2892,8 +3173,8 @@
       const CompileTimeErrorCode(
           'RETHROW_OUTSIDE_CATCH', "Rethrow must be inside of catch clause.",
           correction:
-              "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.");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form
@@ -2902,19 +3183,21 @@
   static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR =
       const CompileTimeErrorCode('RETURN_IN_GENERATIVE_CONSTRUCTOR',
           "Constructors can't return values.",
-          correction:
-              "Try removing the return statement or using a factory constructor.");
+          correction: "Try removing the return statement or using a factory "
+              "constructor.");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form
    * <i>return e;</i> appears in a generator function.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATOR = const CompileTimeErrorCode(
-      'RETURN_IN_GENERATOR',
-      "Can't return a value from a generator function (using the '{0}' modifier).",
-      correction:
-          "Try removing the value, replacing 'return' with 'yield' or changing the "
-          "method body modifier.");
+  static const CompileTimeErrorCode RETURN_IN_GENERATOR =
+      const CompileTimeErrorCode(
+          'RETURN_IN_GENERATOR',
+          "Can't return a value from a generator function (using the '{0}' "
+              "modifier).",
+          correction:
+              "Try removing the value, replacing 'return' with 'yield' or "
+              "changing the method body modifier.");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred
@@ -2928,6 +3211,15 @@
           correction: "Try renaming one of the prefixes.");
 
   /**
+   * No parameters.
+   */
+  static const CompileTimeErrorCode SUPER_IN_EXTENSION =
+      const CompileTimeErrorCode(
+          'SUPER_IN_EXTENSION',
+          "You can't reference 'super' in an extension because extensions do "
+              "not have a superclass.");
+
+  /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
    * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
    * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
@@ -2958,22 +3250,33 @@
           "The class 'Object' can't invoke a constructor from a superclass.");
 
   /**
-   * 12.11 Instance Creation: It is a static type warning if any of the type
-   * arguments to a constructor of a generic type <i>G</i> invoked by a new
-   * expression or a constant object expression are not subtypes of the bounds
-   * of the corresponding formal type parameters of <i>G</i>.
-   *
-   * 12.11.1 New: If T is malformed a dynamic error occurs. In checked mode, if
-   * T is mal-bounded a dynamic error occurs.
-   *
-   * 12.1 Constants: It is a compile-time error if evaluation of a compile-time
-   * constant would raise an exception.
-   *
    * Parameters:
    * 0: the name of the type used in the instance creation that should be
    *    limited by the bound as specified in the class declaration
    * 1: the name of the bounding type
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a type argument isn't the same
+  // as or a subclass of the bounds of the corresponding type parameter.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class A<E extends num> {}
+  // var a = A<[!String!]>();
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the type argument to be a subclass of the bounds:
+  //
+  // ```dart
+  // class A<E extends num> {}
+  // var a = A<int>();
+  // ```
   static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS =
       const CompileTimeErrorCode(
           'TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', "'{0}' doesn't extend '{1}'.",
@@ -2985,9 +3288,9 @@
    */
   static const CompileTimeErrorCode GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND =
       const CompileTimeErrorCode('GENERIC_FUNCTION_TYPE_CANNOT_BE_BOUND',
-          'Generic function types may not be used as type parameter bounds',
-          correction: 'Try making the free variable in the function type part'
-              ' of the larger declaration signature');
+          "Generic function types can't be used as type parameter bounds",
+          correction: "Try making the free variable in the function type part"
+              " of the larger declaration signature");
 
   static const CompileTimeErrorCode FOR_IN_WITH_CONST_VARIABLE =
       const CompileTimeErrorCode('FOR_IN_WITH_CONST_VARIABLE',
@@ -3003,7 +3306,7 @@
       GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT =
       const CompileTimeErrorCode(
           'GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT',
-          "A generic function type cannot be a type argument.",
+          "A generic function type can't be a type argument.",
           correction: "Try removing type parameters from the generic function "
               "type, or using 'dynamic' as the type argument here.");
 
@@ -3078,6 +3381,42 @@
               "invoking a different constructor.");
 
   /**
+   * Parameters:
+   * 0: the name of the getter that is undefined
+   * 1: the name of the extension that was explicitly specified
+   */
+  static const CompileTimeErrorCode UNDEFINED_EXTENSION_GETTER =
+      const CompileTimeErrorCode('UNDEFINED_EXTENSION_GETTER',
+          "The getter '{0}' isn't defined for the extension '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing getter, or "
+              "defining a getter named '{0}'.");
+
+  /**
+   * Parameters:
+   * 0: the name of the method that is undefined
+   * 1: the name of the extension that was explicitly specified
+   */
+  static const CompileTimeErrorCode UNDEFINED_EXTENSION_METHOD =
+      const CompileTimeErrorCode('UNDEFINED_EXTENSION_METHOD',
+          "The method '{0}' isn't defined for the extension '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing method, or "
+              "defining a method named '{0}'.");
+
+  /**
+   * Parameters:
+   * 0: the name of the setter that is undefined
+   * 1: the name of the extension that was explicitly specified
+   */
+  static const CompileTimeErrorCode UNDEFINED_EXTENSION_SETTER =
+      const CompileTimeErrorCode('UNDEFINED_EXTENSION_SETTER',
+          "The setter '{0}' isn't defined for the extension '{1}'.",
+          correction:
+              "Try correcting the name to the name of an existing setter, or "
+              "defining a setter named '{0}'.");
+
+  /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>,
    * <i>1<=i<=l</i>, must have a corresponding named parameter in the set
    * {<i>p<sub>n+1</sub></i> ... <i>p<sub>n+k</sub></i>} or a static warning
@@ -3093,24 +3432,32 @@
       const CompileTimeErrorCode('UNDEFINED_NAMED_PARAMETER',
           "The named parameter '{0}' isn't defined.",
           correction:
-              "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}'.");
 
   /**
-   * 14.2 Exports: It is a compile-time error if the compilation unit found at
-   * the specified URI is not a library declaration.
-   *
-   * 14.1 Imports: It is a compile-time error if the compilation unit found at
-   * the specified URI is not a library declaration.
-   *
-   * 14.3 Parts: It is a compile time error if the contents of the URI are not a
-   * valid part declaration.
-   *
    * Parameters:
    * 0: the URI pointing to a non-existent file
-   *
-   * See [INVALID_URI], [URI_HAS_NOT_BEEN_GENERATED].
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an import, export, or part
+  // directive is found where the URI refers to a file that doesn't exist.
+  //
+  // #### Example
+  //
+  // If the file `lib.dart` doesn't exist, the following code produces this
+  // diagnostic:
+  //
+  // ```dart
+  // import [!'lib.dart'!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the URI was mistyped or invalid, then correct the URI.
+  //
+  // If the URI is correct, then create the file.
   static const CompileTimeErrorCode URI_DOES_NOT_EXIST =
       const CompileTimeErrorCode(
           'URI_DOES_NOT_EXIST', "Target of URI doesn't exist: '{0}'.",
@@ -3118,20 +3465,43 @@
               "Try using a URI for a file that does exist.");
 
   /**
-   * Just like [URI_DOES_NOT_EXIST], but used when the URI refers to a file that
-   * is expected to be generated.
-   *
    * Parameters:
    * 0: the URI pointing to a non-existent file
-   *
-   * See [INVALID_URI], [URI_DOES_NOT_EXIST].
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an import, export, or part
+  // directive is found where the URI refers to a file that doesn't exist and
+  // the name of the file ends with a pattern that's commonly produced by code
+  // generators, such as one of the following:
+  // - `.g.dart`
+  // - `.pb.dart`
+  // - `.pbenum.dart`
+  // - `.pbserver.dart`
+  // - `.pbjson.dart`
+  // - `.template.dart`
+  //
+  // #### Example
+  //
+  // If the file `lib.g.dart` doesn't exist, the following code produces this
+  // diagnostic:
+  //
+  // ```dart
+  // import [!'lib.g.dart'!];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the file is a generated file, then run the generator that generates the
+  // file.
+  //
+  // If the file isn't a generated file, then check the spelling of the URI or
+  // create the file.
   static const CompileTimeErrorCode URI_HAS_NOT_BEEN_GENERATED =
       const CompileTimeErrorCode('URI_HAS_NOT_BEEN_GENERATED',
           "Target of URI hasn't been generated: '{0}'.",
-          correction:
-              "Try running the generator that will generate the file referenced by "
-              "the URI.");
+          correction: "Try running the generator that will generate the file "
+              "referenced by the URI.");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time
@@ -3163,8 +3533,10 @@
    * 2: the number of parameters found in the operator declaration
    */
   static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR =
-      const CompileTimeErrorCode('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR',
-          "Operator '{0}' should declare exactly {1} parameter(s), but {2} found.");
+      const CompileTimeErrorCode(
+          'WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR',
+          "Operator '{0}' should declare exactly {1} parameter(s), but {2} "
+              "found.");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the
@@ -3322,8 +3694,10 @@
    * function marked sync* may not be assigned to Iterable.
    */
   static const StaticTypeWarningCode ILLEGAL_SYNC_GENERATOR_RETURN_TYPE =
-      const StaticTypeWarningCode('ILLEGAL_SYNC_GENERATOR_RETURN_TYPE',
-          "Functions marked 'sync*' must have a return type assignable to 'Iterable'.",
+      const StaticTypeWarningCode(
+          'ILLEGAL_SYNC_GENERATOR_RETURN_TYPE',
+          "Functions marked 'sync*' must have a return type assignable to "
+              "'Iterable'.",
           correction: "Try fixing the return type of the function, or "
               "removing the modifier 'sync*' from the function body.");
 
@@ -3361,35 +3735,37 @@
    * 1: the name of the left hand side type
    */
   static const StaticTypeWarningCode INVALID_ASSIGNMENT =
-      const StaticTypeWarningCode('INVALID_ASSIGNMENT',
-          "A value of type '{0}' can't be assigned to a variable of type '{1}'.",
+      const StaticTypeWarningCode(
+          'INVALID_ASSIGNMENT',
+          "A value of type '{0}' can't be assigned to a variable of type "
+              "'{1}'.",
           correction: "Try changing the type of the variable, or "
               "casting the right-hand type to '{1}'.");
 
   /**
-   * 12.15.1 Ordinary Invocation: An ordinary method invocation <i>i</i> has the
-   * form <i>o.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>.
-   *
-   * Let <i>T</i> be the static type of <i>o</i>. It is a static type warning if
-   * <i>T</i> does not have an accessible instance member named <i>m</i>. If
-   * <i>T.m</i> exists, it is a static warning if the type <i>F</i> of
-   * <i>T.m</i> may not be assigned to a function type. If <i>T.m</i> does not
-   * exist, or if <i>F</i> is not a function type, the static type of <i>i</i>
-   * is dynamic.
-   *
-   * 12.15.3 Static Invocation: It is a static type warning if the type <i>F</i>
-   * of <i>C.m</i> may not be assigned to a function type.
-   *
-   * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
-   * <i>super.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. If
-   * <i>S.m</i> exists, it is a static warning if the type <i>F</i> of
-   * <i>S.m</i> may not be assigned to a function type.
-   *
    * Parameters:
    * 0: the name of the identifier that is not a function type
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it finds a function invocation,
+  // but the name of the function being invoked is defined to be something other
+  // than a function.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // typedef Binary = int Function(int, int);
+  // int f() {
+  //   return [!Binary!](1, 2);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Replace the name with the name of a function.
   static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION =
       const StaticTypeWarningCode(
           'INVOCATION_OF_NON_FUNCTION', "'{0}' isn't a function.",
@@ -3409,8 +3785,10 @@
    * <i>e<sub>f</sub></i> may not be assigned to a function type.
    */
   static const StaticTypeWarningCode INVOCATION_OF_NON_FUNCTION_EXPRESSION =
-      const StaticTypeWarningCode('INVOCATION_OF_NON_FUNCTION_EXPRESSION',
-          "The expression doesn't evaluate to a function, so it can't be invoked.");
+      const StaticTypeWarningCode(
+          'INVOCATION_OF_NON_FUNCTION_EXPRESSION',
+          "The expression doesn't evaluate to a function, so it can't be "
+              "invoked.");
 
   /**
    * 12.20 Conditional: It is a static type warning if the type of
@@ -3464,9 +3842,32 @@
           "The operands of the '{0}' operator must be assignable to 'bool'.");
 
   /**
-   * 15.8 Parameterized Types: It is a static type warning if <i>A<sub>i</sub>,
-   * 1 &lt;= i &lt;= n</i> does not denote a type in the enclosing lexical scope.
+   * Parameters:
+   * 0: the name appearing where a type is expected
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when an identifier that isn't a type
+  // is used as a type argument.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `x` is a variable, not
+  // a type:
+  //
+  // ```dart
+  // var x = 0;
+  // List<[!x!]> xList = [];
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Change the type argument to be a type:
+  //
+  // ```dart
+  // var x = 0;
+  // List<int> xList = [];
+  // ```
   static const StaticTypeWarningCode NON_TYPE_AS_TYPE_ARGUMENT =
       const StaticTypeWarningCode('NON_TYPE_AS_TYPE_ARGUMENT',
           "The name '{0}' isn't a type so it can't be used as a type argument.",
@@ -3485,8 +3886,10 @@
    * 2: the name of the method
    */
   static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE =
-      const StaticTypeWarningCode('RETURN_OF_INVALID_TYPE',
-          "The return type '{0}' isn't a '{1}', as defined by the method '{2}'.");
+      const StaticTypeWarningCode(
+          'RETURN_OF_INVALID_TYPE',
+          "The return type '{0}' isn't a '{1}', as defined by the method "
+              "'{2}'.");
 
   /**
    * 13.11 Return: It is a static type warning if the type of <i>e</i> may not
@@ -3498,8 +3901,10 @@
    * 1: the expected return type as defined by the method
    */
   static const StaticTypeWarningCode RETURN_OF_INVALID_TYPE_FROM_CLOSURE =
-      const StaticTypeWarningCode('RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
-          "The return type '{0}' isn't a '{1}', as defined by anonymous closure.");
+      const StaticTypeWarningCode(
+          'RETURN_OF_INVALID_TYPE_FROM_CLOSURE',
+          "The return type '{0}' isn't a '{1}', as defined by anonymous "
+              "closure.");
 
   /**
    * 10 Generics: It is a static type warning if a type parameter is a supertype
@@ -3533,17 +3938,41 @@
               "defining a constant named '{0}'.");
 
   /**
-   * 12.15.3 Unqualified Invocation: If there exists a lexically visible
-   * declaration named <i>id</i>, let <i>f<sub>id</sub></i> be the innermost
-   * such declaration. Then: [skip]. Otherwise, <i>f<sub>id</sub></i> is
-   * considered equivalent to the ordinary method invocation
-   * <b>this</b>.<i>id</i>(<i>a<sub>1</sub></i>, ..., <i>a<sub>n</sub></i>,
-   * <i>x<sub>n+1</sub></i> : <i>a<sub>n+1</sub></i>, ...,
-   * <i>x<sub>n+k</sub></i> : <i>a<sub>n+k</sub></i>).
-   *
    * Parameters:
    * 0: the name of the method that is undefined
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a function but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // List<int> empty() => [];
+  // void main() {
+  //   print([!emty!]());
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a function that is defined. The example above can be corrected
+  // by fixing the spelling of the function:
+  //
+  // ```dart
+  // List<int> empty() => [];
+  // void main() {
+  //   print(empty());
+  // }
+  // ```
+  //
+  // If the function is defined but isn't visible, then you probably need to add
+  // an import or re-arrange your code to make the function visible.
   static const StaticTypeWarningCode UNDEFINED_FUNCTION =
       const StaticTypeWarningCode(
           'UNDEFINED_FUNCTION', "The function '{0}' isn't defined.",
@@ -3553,16 +3982,46 @@
           isUnresolvedIdentifier: true);
 
   /**
-   * 12.17 Getter Invocation: Let <i>T</i> be the static type of <i>e</i>. It is
-   * a static type warning if <i>T</i> does not have a getter named <i>m</i>.
-   *
    * Parameters:
    * 0: the name of the getter
    * 1: the name of the enclosing type where the getter is being looked for
    */
-  // TODO(brianwilkerson) When the "target" is an enum, report
-  //  UNDEFINED_ENUM_CONSTANT instead.
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a getter but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class Point {
+  //   final int x;
+  //   final int y;
+  //   Point(this.x, this.y);
+  //   operator +(Point other) => Point(x + other.x, y + other.[!z!]);
+  // }
+  // ```
+  //
+  // #### Common fix
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a getter that is defined. The example above can be corrected by
+  // fixing the spelling of the getter:
+  //
+  // ```dart
+  // class Point {
+  //   final int x;
+  //   final int y;
+  //   Point(this.x, this.y);
+  //   operator +(Point other) => Point(x + other.x, y + other.y);
+  // }
+  // ```
   static const StaticTypeWarningCode UNDEFINED_GETTER =
+      // TODO(brianwilkerson) When the "target" is an enum, report
+      //  UNDEFINED_ENUM_CONSTANT instead.
       const StaticTypeWarningCode('UNDEFINED_GETTER',
           "The getter '{0}' isn't defined for the class '{1}'.",
           correction: "Try importing the library that defines '{0}', "
@@ -3570,14 +4029,33 @@
               "defining a getter or field named '{0}'.");
 
   /**
-   * 12.15.1 Ordinary Invocation: Let <i>T</i> be the static type of <i>o</i>.
-   * It is a static type warning if <i>T</i> does not have an accessible
-   * instance member named <i>m</i>.
-   *
    * Parameters:
    * 0: the name of the method that is undefined
    * 1: the resolved type name that the method lookup is happening on
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a method but either isn't defined or isn't
+  // visible in the scope in which it's being referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // int f(List<int> l) => l.[!removeMiddle!]();
+  // ```
+  //
+  // #### Common fix
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a method that is defined. The example above can be corrected by
+  // fixing the spelling of the method:
+  //
+  // ```dart
+  // int f(List<int> l) => l.removeLast();
+  // ```
   static const StaticTypeWarningCode UNDEFINED_METHOD =
       const StaticTypeWarningCode('UNDEFINED_METHOD',
           "The method '{0}' isn't defined for the class '{1}'.",
@@ -3614,19 +4092,55 @@
       const StaticTypeWarningCode(
           '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.",
+              "isn't defined in any of the libraries imported using that "
+              "prefix.",
           correction: "Try correcting the prefix or "
               "importing the library that defines '{0}'.");
 
   /**
-   * 12.18 Assignment: Let <i>T</i> be the static type of <i>e<sub>1</sub></i>.
-   * It is a static type warning if <i>T</i> does not have an accessible
-   * instance setter named <i>v=</i>.
-   *
    * Parameters:
    * 0: the name of the setter
    * 1: the name of the enclosing type where the setter is being looked for
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a setter but either isn't defined or isn't
+  // visible in the scope in which the identifier is being referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class Point {
+  //   int x;
+  //   int y;
+  //   Point(this.x, this.y);
+  //   void shiftBy(Point other) {
+  //     this.x += other.x;
+  //     this.[!z!] += other.y;
+  //   }
+  // }
+  // ```
+  //
+  // #### Common fix
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a setter that is defined. The example above can be corrected by
+  // fixing the spelling of the setter:
+  //
+  // ```dart
+  // class Point {
+  //   int x;
+  //   int y;
+  //   Point(this.x, this.y);
+  //   void shiftBy(Point other) {
+  //     this.x += other.x;
+  //     this.y += other.y;
+  //   }
+  // }
+  // ```
   static const StaticTypeWarningCode UNDEFINED_SETTER =
       const StaticTypeWarningCode('UNDEFINED_SETTER',
           "The setter '{0}' isn't defined for the class '{1}'.",
@@ -3723,7 +4237,8 @@
       UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER =
       const StaticTypeWarningCode(
           '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.",
           correction: "Try adding '{0}.' before the name.");
 
   /**
@@ -3756,7 +4271,7 @@
   static const StaticTypeWarningCode
       WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR = const StaticTypeWarningCode(
           'WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR',
-          "The constructor '{0}.{1}' does not have type parameters.",
+          "The constructor '{0}.{1}' doesn't have type parameters.",
           correction: "Try moving type arguments to after the type name.");
 
   /**
@@ -3876,37 +4391,63 @@
           "hiding the name from all but one of the imports.");
 
   /**
-   * 12.11.1 New: It is a static warning if the static type of <i>a<sub>i</sub>,
-   * 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type of the
-   * corresponding formal parameter of the constructor <i>T.id</i> (respectively
-   * <i>T</i>).
-   *
-   * 16.12.2 Const: It is a static warning if the static type of
-   * <i>a<sub>i</sub>, 1 &lt;= i &lt;= n+ k</i> may not be assigned to the type
-   * of the corresponding formal parameter of the constructor <i>T.id</i>
-   * (respectively <i>T</i>).
-   *
-   * 12.14.2 Binding Actuals to Formals: Let <i>T<sub>i</sub></i> be the static
-   * type of <i>a<sub>i</sub></i>, let <i>S<sub>i</sub></i> be the type of
-   * <i>p<sub>i</sub>, 1 &lt;= i &lt;= n+k</i> and let <i>S<sub>q</sub></i> be
-   * the type of the named parameter <i>q</i> of <i>f</i>. It is a static
-   * warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1
-   * &lt;= j &lt;= m</i>.
-   *
-   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub>, 1
-   * &lt;= i &lt;= l</i>, must have a corresponding named parameter in the set
-   * <i>{p<sub>n+1</sub>, &hellip; p<sub>n+k</sub>}</i> or a static warning
-   * occurs. It is a static warning if <i>T<sub>m+j</sub></i> may not be
-   * assigned to <i>S<sub>r</sub></i>, where <i>r = q<sub>j</sub>, 1 &lt;= j
-   * &lt;= l</i>.
-   *
    * Parameters:
    * 0: the name of the actual argument type
    * 1: the name of the expected type
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when the static type of an argument
+  // can't be assigned to the static type of the corresponding parameter.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // int f(int x) => x;
+  // num g(num y) => f([!y!]);
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If possible, rewrite the code so that the static type is assignable. In the
+  // example above you might be able to change the type of the parameter `y`:
+  //
+  // ```dart
+  // int f(int x) => x;
+  // int g(int y) => f(y);
+  // ```
+  //
+  // If that fix isn't possible, then add code to handle the case where the
+  // argument value isn't the required type. One approach is to coerce other
+  // types to the required type:
+  //
+  // ```dart
+  // int f(int x) => x;
+  // num g(num y) => f(y.floor());
+  // ```
+  //
+  // Another approach is to add explicit type tests and fallback code:
+  //
+  // ```dart
+  // int f(int x) => x;
+  // num g(num y) => f(y is int ? y : 0);
+  // ```
+  //
+  // If you believe that the runtime type of the argument will always be the
+  // same as the static type of the parameter, and you're willing to risk having
+  // an exception thrown at runtime if you're wrong, then add an explicit cast:
+  //
+  // ```dart
+  // int f(int x) => x;
+  // num g(num y) => f(y as int);
+  // ```
   static const StaticWarningCode ARGUMENT_TYPE_NOT_ASSIGNABLE =
-      const StaticWarningCode('ARGUMENT_TYPE_NOT_ASSIGNABLE',
-          "The argument type '{0}' can't be assigned to the parameter type '{1}'.");
+      const StaticWarningCode(
+          'ARGUMENT_TYPE_NOT_ASSIGNABLE',
+          "The argument type '{0}' can't be assigned to the parameter type "
+              "'{1}'.");
 
   /**
    * 5 Variables: Attempting to assign to a final variable elsewhere will cause
@@ -4037,8 +4578,10 @@
    * 2:e the shared name of the exported libraries
    */
   static const StaticWarningCode EXPORT_DUPLICATED_LIBRARY_NAMED =
-      const StaticWarningCode('EXPORT_DUPLICATED_LIBRARY_NAMED',
-          "The exported libraries '{0}' and '{1}' can't have the same name '{2}'.",
+      const StaticWarningCode(
+          'EXPORT_DUPLICATED_LIBRARY_NAMED',
+          "The exported libraries '{0}' and '{1}' can't have the same name "
+              "'{2}'.",
           correction:
               "Try adding a hide clause to one of the export directives.");
 
@@ -4120,8 +4663,10 @@
    * 1: the name of the type of the field
    */
   static const StaticWarningCode FIELD_INITIALIZER_NOT_ASSIGNABLE =
-      const StaticWarningCode('FIELD_INITIALIZER_NOT_ASSIGNABLE',
-          "The initializer type '{0}' can't be assigned to the field type '{1}'.");
+      const StaticWarningCode(
+          'FIELD_INITIALIZER_NOT_ASSIGNABLE',
+          "The initializer type '{0}' can't be assigned to the field type "
+              "'{1}'.");
 
   /**
    * 7.6.1 Generative Constructors: An initializing formal has the form
@@ -4204,8 +4749,10 @@
    * 2: the number of additional not initialized variables that aren't listed
    */
   static const StaticWarningCode FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS =
-      const StaticWarningCode('FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
-          "The final variables '{0}', '{1}' and '{2}' more must be initialized.",
+      const StaticWarningCode(
+          'FINAL_NOT_INITIALIZED_CONSTRUCTOR_3',
+          "The final variables '{0}', '{1}' and '{2}' more must be "
+              "initialized.",
           correction: "Try adding initializers for the fields.");
 
   /**
@@ -4218,8 +4765,10 @@
    * 2: the shared name of the imported libraries
    */
   static const StaticWarningCode IMPORT_DUPLICATED_LIBRARY_NAMED =
-      const StaticWarningCode('IMPORT_DUPLICATED_LIBRARY_NAMED',
-          "The imported libraries '{0}' and '{1}' can't have the same name '{2}'.",
+      const StaticWarningCode(
+          'IMPORT_DUPLICATED_LIBRARY_NAMED',
+          "The imported libraries '{0}' and '{1}' can't have the same name "
+              "'{2}'.",
           correction: "Try adding a hide clause to one of the imports.");
 
   /**
@@ -4246,8 +4795,8 @@
   static const StaticWarningCode
       INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED = const 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.",
           correction: "Try using the same default value in both methods.",
           errorSeverity: ErrorSeverity.WARNING);
 
@@ -4263,7 +4812,8 @@
       const 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.",
+              "'{0}.{1}' where this positional parameter has a different "
+              "value.",
           correction: "Try using the same default value in both methods.",
           errorSeverity: ErrorSeverity.WARNING);
 
@@ -4304,8 +4854,10 @@
    * &lt;= j &lt;= m</i>.
    */
   static const StaticWarningCode MAP_KEY_TYPE_NOT_ASSIGNABLE =
-      const StaticWarningCode('MAP_KEY_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the map key type '{1}'.");
+      const StaticWarningCode(
+          'MAP_KEY_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' can't be assigned to the map key type "
+              "'{1}'.");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt;
@@ -4323,8 +4875,10 @@
    * &lt;= j &lt;= m</i>.
    */
   static const StaticWarningCode MAP_VALUE_TYPE_NOT_ASSIGNABLE =
-      const StaticWarningCode('MAP_VALUE_TYPE_NOT_ASSIGNABLE',
-          "The element type '{0}' can't be assigned to the map value type '{1}'.");
+      const StaticWarningCode(
+          'MAP_VALUE_TYPE_NOT_ASSIGNABLE',
+          "The element type '{0}' can't be assigned to the map value type "
+              "'{1}'.");
 
   /**
    * 10.3 Setters: It is a compile-time error if a class has a setter named
@@ -4477,9 +5031,10 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS =
       const StaticWarningCode(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS',
-          "Missing concrete implementations of {0}, {1}, {2}, {3} and {4} more.",
-          correction:
-              "Try implementing the missing methods, or make the class abstract.");
+          "Missing concrete implementations of {0}, {1}, {2}, {3} and {4} "
+              "more.",
+          correction: "Try implementing the missing methods, or make the class "
+              "abstract.");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
@@ -4506,8 +5061,8 @@
       const StaticWarningCode(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR',
           "Missing concrete implementations of {0}, {1}, {2} and {3}.",
-          correction:
-              "Try implementing the missing methods, or make the class abstract.");
+          correction: "Try implementing the missing methods, or make the class "
+              "abstract.");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
@@ -4530,8 +5085,8 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE = const StaticWarningCode(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE',
           "Missing concrete implementation of {0}.",
-          correction:
-              "Try implementing the missing method, or make the class abstract.");
+          correction: "Try implementing the missing method, or make the class "
+              "abstract.");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
@@ -4557,8 +5112,8 @@
       const StaticWarningCode(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE',
           "Missing concrete implementations of {0}, {1} and {2}.",
-          correction:
-              "Try implementing the missing methods, or make the class abstract.");
+          correction: "Try implementing the missing methods, or make the class "
+              "abstract.");
 
   /**
    * 7.9.1 Inheritance and Overriding: It is a static warning if a non-abstract
@@ -4582,8 +5137,8 @@
       NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO = const StaticWarningCode(
           'NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO',
           "Missing concrete implementations of {0} and {1}.",
-          correction:
-              "Try implementing the missing methods, or make the class abstract.");
+          correction: "Try implementing the missing methods, or make the class "
+              "abstract.");
 
   /**
    * 13.11 Try: An on-catch clause of the form <i>on T catch (p<sub>1</sub>,
@@ -4596,8 +5151,10 @@
    * 0: the name of the non-type element
    */
   static const StaticWarningCode NON_TYPE_IN_CATCH_CLAUSE =
-      const StaticWarningCode('NON_TYPE_IN_CATCH_CLAUSE',
-          "The name '{0}' isn't a type and can't be used in an on-catch clause.",
+      const StaticWarningCode(
+          'NON_TYPE_IN_CATCH_CLAUSE',
+          "The name '{0}' isn't a type and can't be used in an on-catch "
+              "clause.",
           correction: "Try correcting the name to match an existing class.");
 
   /**
@@ -4620,20 +5177,28 @@
               "define a method rather than a setter.");
 
   /**
-   * 15.1 Static Types: A type <i>T</i> is malformed iff:
-   * * <i>T</i> has the form <i>id</i> or the form <i>prefix.id</i>, and in the
-   *   enclosing lexical scope, the name <i>id</i> (respectively
-   *   <i>prefix.id</i>) does not denote a type.
-   * * <i>T</i> denotes a type parameter in the enclosing lexical scope, but
-   * occurs in the signature or body of a static member.
-   * * <i>T</i> is a parameterized type of the form <i>G&lt;S<sub>1</sub>, ..,
-   * S<sub>n</sub>&gt;</i>,
-   *
-   * Any use of a malformed type gives rise to a static warning.
-   *
    * Parameters:
    * 0: the name that is not a type
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a name is used as a type but
+  // declared to be something other than a type.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic because `f` is a function:
+  //
+  // ```dart
+  // f() {}
+  // main() {
+  //   [!f!] v = null;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // Replace the name with the name of a type.
   static const StaticWarningCode NOT_A_TYPE = const StaticWarningCode(
       'NOT_A_TYPE', "{0} isn't a type.",
       correction: "Try correcting the name to match an existing type.");
@@ -4665,8 +5230,8 @@
   static const StaticWarningCode PART_OF_DIFFERENT_LIBRARY =
       const StaticWarningCode('PART_OF_DIFFERENT_LIBRARY',
           "Expected this library to be part of '{0}', not '{1}'.",
-          correction: "Try including a different part, or "
-              "changing the name of the library in the part's part-of directive.");
+          correction: "Try including a different part, or changing the name of "
+              "the library in the part's part-of directive.");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i>
@@ -4677,10 +5242,13 @@
    * 1: the name of the redirecting constructor
    */
   static const StaticWarningCode REDIRECT_TO_INVALID_FUNCTION_TYPE =
-      const StaticWarningCode('REDIRECT_TO_INVALID_FUNCTION_TYPE',
-          "The redirected constructor '{0}' has incompatible parameters with '{1}'.",
-          correction: "Try redirecting to a different constructor, or "
-              "directly invoking the desired constructor rather than redirecting to it.");
+      const StaticWarningCode(
+          'REDIRECT_TO_INVALID_FUNCTION_TYPE',
+          "The redirected constructor '{0}' has incompatible parameters with "
+              "'{1}'.",
+          correction: "Try redirecting to a different constructor, or directly "
+              "invoking the desired constructor rather than redirecting to "
+              "it.");
 
   /**
    * 7.6.2 Factories: It is a static warning if the function type of <i>k'</i>
@@ -4691,10 +5259,13 @@
    * 1: the name of the redirecting constructor's return type
    */
   static const StaticWarningCode REDIRECT_TO_INVALID_RETURN_TYPE =
-      const StaticWarningCode('REDIRECT_TO_INVALID_RETURN_TYPE',
-          "The return type '{0}' of the redirected constructor isn't assignable to '{1}'.",
-          correction: "Try redirecting to a different constructor, or "
-              "directly invoking the desired constructor rather than redirecting to it.");
+      const StaticWarningCode(
+          'REDIRECT_TO_INVALID_RETURN_TYPE',
+          "The return type '{0}' of the redirected constructor isn't "
+              "assignable to '{1}'.",
+          correction: "Try redirecting to a different constructor, or directly "
+              "invoking the desired constructor rather than redirecting to "
+              "it.");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class
@@ -4706,8 +5277,8 @@
       const StaticWarningCode('REDIRECT_TO_MISSING_CONSTRUCTOR',
           "The constructor '{0}' couldn't be found in '{1}'.",
           correction:
-              "Try correcting the constructor name to an existing constructor, or "
-              "defining the constructor in '{1}'.");
+              "Try correcting the constructor name to an existing constructor, "
+              "or defining the constructor in '{1}'.");
 
   /**
    * 7.6.2 Factories: It is a static warning if type does not denote a class
@@ -4715,10 +5286,12 @@
    * it is a static warning if the referenced constructor (be it <i>type</i> or
    * <i>type.id</i>) is not a constructor of <i>C</i>.
    */
-  static const StaticWarningCode REDIRECT_TO_NON_CLASS = const StaticWarningCode(
-      'REDIRECT_TO_NON_CLASS',
-      "The name '{0}' isn't a type and can't be used in a redirected constructor.",
-      correction: "Try correcting the name to match an existing class.");
+  static const StaticWarningCode REDIRECT_TO_NON_CLASS =
+      const StaticWarningCode(
+          'REDIRECT_TO_NON_CLASS',
+          "The name '{0}' isn't a type and can't be used in a redirected "
+              "constructor.",
+          correction: "Try correcting the name to match an existing class.");
 
   /**
    * 13.12 Return: Let <i>f</i> be the function immediately enclosing a return
@@ -4728,8 +5301,7 @@
    * * The return type of <i>f</i> may not be assigned to void.
    */
   static const StaticWarningCode RETURN_WITHOUT_VALUE = const StaticWarningCode(
-      'RETURN_WITHOUT_VALUE', "Missing return value after 'return'.",
-      correction: null);
+      'RETURN_WITHOUT_VALUE', "Missing return value after 'return'.");
 
   /**
    * Parameters:
@@ -4770,8 +5342,10 @@
    *    annotation
    */
   static const StaticWarningCode TYPE_ANNOTATION_DEFERRED_CLASS =
-      const StaticWarningCode('TYPE_ANNOTATION_DEFERRED_CLASS',
-          "The deferred type '{0}' can't be used in a declaration, cast or type test.",
+      const StaticWarningCode(
+          'TYPE_ANNOTATION_DEFERRED_CLASS',
+          "The deferred type '{0}' can't be used in a declaration, cast or "
+              "type test.",
           correction: "Try using a different type, or "
               "changing the import to not be deferred.");
 
@@ -4780,8 +5354,10 @@
    * available in the current lexical scope.
    */
   static const StaticWarningCode TYPE_TEST_WITH_NON_TYPE =
-      const StaticWarningCode('TYPE_TEST_WITH_NON_TYPE',
-          "The name '{0}' isn't a type and can't be used in an 'is' expression.",
+      const StaticWarningCode(
+          'TYPE_TEST_WITH_NON_TYPE',
+          "The name '{0}' isn't a type and can't be used in an 'is' "
+              "expression.",
           correction: "Try correcting the name to match an existing type.");
 
   /**
@@ -4789,8 +5365,10 @@
    * available in the current lexical scope.
    */
   static const StaticWarningCode TYPE_TEST_WITH_UNDEFINED_NAME =
-      const StaticWarningCode('TYPE_TEST_WITH_UNDEFINED_NAME',
-          "The name '{0}' isn't defined, so it can't be used in an 'is' expression.",
+      const StaticWarningCode(
+          'TYPE_TEST_WITH_UNDEFINED_NAME',
+          "The name '{0}' isn't defined, so it can't be used in an 'is' "
+              "expression.",
           correction:
               "Try changing the name to the name of an existing type, or "
               "creating a type with the name '{0}'.");
@@ -4810,14 +5388,41 @@
               "making the member an instance member.");
 
   /**
-   * 12.16.3 Static Invocation: A static method invocation <i>i</i> has the form
-   * <i>C.m(a<sub>1</sub>, &hellip;, a<sub>n</sub>, x<sub>n+1</sub>:
-   * a<sub>n+1</sub>, &hellip; x<sub>n+k</sub>: a<sub>n+k</sub>)</i>. It is a
-   * static warning if <i>C</i> does not denote a class in the current scope.
-   *
    * Parameters:
    * 0: the name of the undefined class
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // appears to be the name of a class but either isn't defined or isn't visible
+  // in the scope in which it's being referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class Point {}
+  // void main() {
+  //   [!Piont!] p;
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // the name of a class that is defined. The example above can be corrected by
+  // fixing the spelling of the class:
+  //
+  // ```dart
+  // class Point {}
+  // void main() {
+  //   Point p;
+  // }
+  // ```
+  //
+  // If the class is defined but isn't visible, then you probably need to add an
+  // import.
   static const StaticWarningCode UNDEFINED_CLASS = const StaticWarningCode(
       'UNDEFINED_CLASS', "Undefined class '{0}'.",
       correction: "Try changing the name to the name of an existing class, or "
@@ -4833,15 +5438,35 @@
           correction: "Try using the type 'bool'.");
 
   /**
-   * 12.30 Identifier Reference: It is as static warning if an identifier
-   * expression of the form <i>id</i> occurs inside a top level or static
-   * function (be it function, method, getter, or setter) or variable
-   * initializer and there is no declaration <i>d</i> with name <i>id</i> in the
-   * lexical scope enclosing the expression.
-   *
    * Parameters:
    * 0: the name of the identifier
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when it encounters an identifier that
+  // either isn't defined or isn't visible in the scope in which it's being
+  // referenced.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // int min(int left, int right) => left <= [!rihgt!] ? left : right;
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the identifier isn't defined, then either define it or replace it with
+  // an identifier that is defined. The example above can be corrected by
+  // fixing the spelling of the variable:
+  //
+  // ```dart
+  // int min(int left, int right) => left <= right ? left : right;
+  // ```
+  //
+  // If the identifier is defined but isn't visible, then you probably need to
+  // add an import or re-arrange your code to make the identifier visible.
   static const StaticWarningCode UNDEFINED_IDENTIFIER =
       const StaticWarningCode('UNDEFINED_IDENTIFIER', "Undefined name '{0}'.",
           correction: "Try correcting the name to one that is defined, or "
@@ -4859,14 +5484,67 @@
               "adding 'async' to the enclosing function body.");
 
   /**
-   * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>,
-   * <i>1<=i<=l</i>, must have a corresponding named parameter in the set
-   * {<i>p<sub>n+1</sub></i> &hellip; <i>p<sub>n+k</sub></i>} or a static
-   * warning occurs.
-   *
    * Parameters:
    * 0: the name of the requested named parameter
    */
+  // #### Description
+  //
+  // The analyzer produces this diagnostic when a method or function invocation
+  // has a named argument, but the method or function being invoked doesn’t
+  // define a parameter with the same name.
+  //
+  // #### Example
+  //
+  // The following code produces this diagnostic:
+  //
+  // ```dart
+  // class C {
+  //   m({int b}) {}
+  // }
+  // void f(C c) {
+  //   c.m([!a!]: 1);
+  // }
+  // ```
+  //
+  // #### Common fixes
+  //
+  // If the argument name is mistyped, then replace it with the correct name.
+  // The example above can be fixed by changing `a` to `b`:
+  //
+  // ```dart
+  // class C {
+  //   m({int b}) {}
+  // }
+  // void f(C c) {
+  //   c.m(b: 1);
+  // }
+  // ```
+  //
+  // If a subclass adds a parameter with the name in question, then cast the
+  // target to the subclass:
+  //
+  // ```dart
+  // class C {
+  //   m({int b}) {}
+  // }
+  // class D extends C {
+  //   m({int a, int b}) {}
+  // }
+  // void f(C c) {
+  //   (c as D).m(a: 1);
+  // }
+  // ```
+  //
+  // If the parameter should be added to the function, then add it:
+  //
+  // ```dart
+  // class C {
+  //   m({int a, int b}) {}
+  // }
+  // void f(C c) {
+  //   c.m(a: 1);
+  // }
+  // ```
   static const StaticWarningCode UNDEFINED_NAMED_PARAMETER =
       const StaticWarningCode('UNDEFINED_NAMED_PARAMETER',
           "The named parameter '{0}' isn't defined.",
@@ -4882,10 +5560,78 @@
   static const StaticWarningCode UNCHECKED_USE_OF_NULLABLE_VALUE =
       const StaticWarningCode(
           'UNCHECKED_USE_OF_NULLABLE_VALUE',
-          'The expression is nullable and must be null-checked before it can be'
-              ' used.',
+          "The expression is nullable and must be null-checked before it can "
+              "be used.",
           correction:
-              'Try casting or check the value is not null before using it.');
+              "Try checking that the value isn't null before using it.");
+
+  /**
+   * When the '!' operator is used on a value that we know to be non-null,
+   * it is unnecessary.
+   */
+  static const StaticWarningCode UNNECESSARY_NON_NULL_ASSERTION =
+      const StaticWarningCode(
+          'UNNECESSARY_NON_NULL_ASSERTION',
+          "The '!' will have no effect because the target expression cannot be"
+              " null.",
+          correction: "Try removing the '!' operator here.");
+
+  /**
+   * When the '...?' operator is used on a value that we know to be non-null,
+   * it is unnecessary.
+   */
+  static const StaticWarningCode UNNECESSARY_NULL_AWARE_SPREAD =
+      const StaticWarningCode(
+          'UNNECESSARY_NULL_AWARE_SPREAD',
+          "The target expression can't be null, so it isn't necessary to use "
+              "the null-aware spread operator '...?'.",
+          correction: "Try replacing the '...?' with a '...' in the spread.");
+
+  /**
+   * For the purposes of experimenting with potential non-null type semantics.
+   *
+   * Whereas [UNCHECKED_USE_OF_NULLABLE] refers to using a value of type T? as
+   * if it were a T, this refers to using a value of type [Null] itself. These
+   * occur at many of the same times ([Null] is a potentially nullable type) but
+   * it indicates a different type of programmer error and has different
+   * corrections.
+   *
+   * Parameters: none
+   */
+  static const StaticWarningCode INVALID_USE_OF_NULL_VALUE =
+      const StaticWarningCode('INVALID_USE_OF_NULL_VALUE',
+          "This expression is invalid as it will always be null.",
+          correction:
+              "Try changing the type, or casting, to a more useful type like "
+              "dynamic.");
+
+  /**
+   * It is an error to call a method or getter on an expression of type [Never],
+   * or to invoke it as if it were a function.
+   *
+   * Go out of our way to provide a *little* more information here because many
+   * dart users probably have never heard of the type Never. Be careful however
+   * of providing too much information or it only becomes more confusing. Hard
+   * balance to strike.
+   *
+   * Parameters: none
+   */
+  static const StaticWarningCode INVALID_USE_OF_NEVER_VALUE =
+      const StaticWarningCode(
+          'INVALID_USE_OF_NEVER_VALUE',
+          'This expression is invalid because its target is of type Never and'
+              ' will never complete with a value',
+          correction: 'Try checking for throw expressions or type errors in the'
+              ' target expression');
+
+  /**
+   * When the '?.' operator is used on a target that we know to be non-null,
+   * it is unnecessary.
+   */
+  static const StaticWarningCode UNNECESSARY_NULL_AWARE_CALL =
+      const StaticWarningCode('UNNECESSARY_NULL_AWARE_CALL',
+          "The target expression can't be null, and so '?.' isn't necessary.",
+          correction: "Try replacing the '?.' with a '.' in the invocation.");
 
   /**
    * It is a static warning to assign void to any non-void type in dart.
@@ -4896,11 +5642,11 @@
    */
   static const StaticWarningCode USE_OF_VOID_RESULT = const StaticWarningCode(
       'USE_OF_VOID_RESULT',
-      "The expression here has a type of 'void', and therefore cannot be used.",
+      "The expression here has a type of 'void', and therefore can't be used.",
       correction:
-          'Check if you are using the correct API; there may be a function or'
-          " call that returns void you didn't expect. Also check type parameters"
-          ' and variables which, in rare cases, may be void as well.');
+          "Try checking to see if you are 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.");
 
   @override
   final ErrorSeverity errorSeverity;
@@ -4927,15 +5673,13 @@
 
 /**
  * This class has Strong Mode specific error codes.
- * 
+ *
  * "Strong Mode" was the prototype for Dart 2's sound type system. Many of these
  * errors became part of Dart 2. Some of them are optional flags, used for
  * stricter checking.
  *
  * These error codes tend to use the same message across different severity
  * levels, so they are grouped for clarity.
- *
- * All of these error codes also use the "STRONG_MODE_" prefix in their name.
  */
 class StrongModeCode extends ErrorCode {
   static const String _implicitCastMessage =
@@ -5032,8 +5776,9 @@
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_FUNCTION_EXPR',
       "The function expression type '{0}' isn't of type '{1}'. "
-          "This means its parameter or return type does not match what is "
-          "expected. Consider changing parameter type(s) or the returned type(s).");
+          "This means its parameter or return type doesn't match what is "
+          "expected. Consider changing parameter type(s) or the returned "
+          "type(s).");
 
   static const StrongModeCode INVALID_CAST_NEW_EXPR = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
@@ -5044,20 +5789,20 @@
       ErrorType.COMPILE_TIME_ERROR,
       '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 does not match what is "
-          "expected.");
+          "'{2}'. This means its parameter or return type doesn't match what "
+          "is expected.");
 
   static const StrongModeCode INVALID_CAST_FUNCTION = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_CAST_FUNCTION',
       "The function '{0}' has type '{1}' that isn't of expected type "
-          "'{2}'. This means its parameter or return type does not match what is "
-          "expected.");
+          "'{2}'. This means its parameter or return type doesn't match what "
+          "is expected.");
 
   static const StrongModeCode INVALID_SUPER_INVOCATION = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       'INVALID_SUPER_INVOCATION',
-      "super call must be last in an initializer "
+      "The super call must be last in an initializer "
           "list (see https://goo.gl/EY6hDP): '{0}'.");
 
   static const StrongModeCode NON_GROUND_TYPE_CHECK_INFO = const StrongModeCode(
@@ -5146,21 +5891,29 @@
   static const StrongModeCode TOP_LEVEL_CYCLE = const StrongModeCode(
       ErrorType.COMPILE_TIME_ERROR,
       '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}.",
       correction:
-          "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.");
 
   static const StrongModeCode TOP_LEVEL_FUNCTION_LITERAL_BLOCK =
-      const StrongModeCode(ErrorType.HINT, 'TOP_LEVEL_FUNCTION_LITERAL_BLOCK',
-          "The type of the function literal can't be inferred because the literal has a block as its body.",
+      const StrongModeCode(
+          ErrorType.HINT,
+          'TOP_LEVEL_FUNCTION_LITERAL_BLOCK',
+          "The type of the function literal can't be inferred because the "
+              "literal has a block as its body.",
           correction: "Try adding an explicit type to the variable.");
 
-  static const StrongModeCode TOP_LEVEL_IDENTIFIER_NO_TYPE = const StrongModeCode(
-      ErrorType.HINT,
-      'TOP_LEVEL_IDENTIFIER_NO_TYPE',
-      "The type of '{0}' can't be inferred because the type of '{1}' couldn't be inferred.",
-      correction:
-          "Try adding an explicit type to either the variable '{0}' or the variable '{1}'.");
+  static const StrongModeCode TOP_LEVEL_IDENTIFIER_NO_TYPE =
+      const StrongModeCode(
+          ErrorType.HINT,
+          'TOP_LEVEL_IDENTIFIER_NO_TYPE',
+          "The type of '{0}' can't be inferred because the type of '{1}' "
+              "couldn't be inferred.",
+          correction:
+              "Try adding an explicit type to either the variable '{0}' or the "
+              "variable '{1}'.");
 
   static const StrongModeCode TOP_LEVEL_INSTANCE_GETTER = const StrongModeCode(
       ErrorType.STATIC_WARNING,
@@ -5189,7 +5942,7 @@
   const StrongModeCode(ErrorType type, String name, String message,
       {String correction, bool hasPublishedDocs})
       : type = type,
-        super.temporary('STRONG_MODE_$name', message,
+        super.temporary(name, message,
             correction: correction, hasPublishedDocs: hasPublishedDocs);
 
   @override
diff --git a/pkg/analyzer/lib/src/error/imports_verifier.dart b/pkg/analyzer/lib/src/error/imports_verifier.dart
new file mode 100644
index 0000000..ad45f0a
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/imports_verifier.dart
@@ -0,0 +1,556 @@
+// 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:collection';
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/error/listener.dart';
+import 'package:analyzer/src/dart/resolver/scope.dart';
+import 'package:analyzer/src/error/codes.dart';
+
+/// A visitor that visits ASTs and fills [UsedImportedElements].
+class GatherUsedImportedElementsVisitor extends RecursiveAstVisitor {
+  final LibraryElement library;
+  final UsedImportedElements usedElements = new UsedImportedElements();
+
+  GatherUsedImportedElementsVisitor(this.library);
+
+  @override
+  void visitBinaryExpression(BinaryExpression node) {
+    _recordIfExtensionMember(node.staticElement);
+    return super.visitBinaryExpression(node);
+  }
+
+  @override
+  void visitExportDirective(ExportDirective node) {
+    _visitDirective(node);
+  }
+
+  @override
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _recordIfExtensionMember(node.staticElement);
+    return super.visitFunctionExpressionInvocation(node);
+  }
+
+  @override
+  void visitImportDirective(ImportDirective node) {
+    _visitDirective(node);
+  }
+
+  @override
+  void visitIndexExpression(IndexExpression node) {
+    _recordIfExtensionMember(node.staticElement);
+    return super.visitIndexExpression(node);
+  }
+
+  @override
+  void visitLibraryDirective(LibraryDirective node) {
+    _visitDirective(node);
+  }
+
+  @override
+  void visitPrefixExpression(PrefixExpression node) {
+    _recordIfExtensionMember(node.staticElement);
+    return super.visitPrefixExpression(node);
+  }
+
+  @override
+  void visitSimpleIdentifier(SimpleIdentifier node) {
+    _visitIdentifier(node, node.staticElement);
+  }
+
+  void _recordIfExtensionMember(Element element) {
+    if (element != null && element.enclosingElement is ExtensionElement) {
+      _recordUsedExtension(element.enclosingElement);
+    }
+  }
+
+  /// If the given [identifier] is prefixed with a [PrefixElement], fill the
+  /// corresponding `UsedImportedElements.prefixMap` entry and return `true`.
+  bool _recordPrefixMap(SimpleIdentifier identifier, Element element) {
+    bool recordIfTargetIsPrefixElement(Expression target) {
+      if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
+        List<Element> prefixedElements = usedElements.prefixMap
+            .putIfAbsent(target.staticElement, () => <Element>[]);
+        prefixedElements.add(element);
+        return true;
+      }
+      return false;
+    }
+
+    AstNode parent = identifier.parent;
+    if (parent is MethodInvocation && parent.methodName == identifier) {
+      return recordIfTargetIsPrefixElement(parent.target);
+    }
+    if (parent is PrefixedIdentifier && parent.identifier == identifier) {
+      return recordIfTargetIsPrefixElement(parent.prefix);
+    }
+    return false;
+  }
+
+  void _recordUsedElement(Element element) {
+    // Ignore if an unknown library.
+    LibraryElement containingLibrary = element.library;
+    if (containingLibrary == null) {
+      return;
+    }
+    // Ignore if a local element.
+    if (library == containingLibrary) {
+      return;
+    }
+    // Remember the element.
+    usedElements.elements.add(element);
+  }
+
+  void _recordUsedExtension(ExtensionElement extension) {
+    // Ignore if a local element.
+    if (library == extension.library) {
+      return;
+    }
+    // Remember the element.
+    usedElements.usedExtensions.add(extension);
+  }
+
+  /// Visit identifiers used by the given [directive].
+  void _visitDirective(Directive directive) {
+    directive.documentationComment?.accept(this);
+    directive.metadata.accept(this);
+  }
+
+  void _visitIdentifier(SimpleIdentifier identifier, Element element) {
+    if (element == null) {
+      return;
+    }
+    // Record `importPrefix.identifier` into 'prefixMap'.
+    if (_recordPrefixMap(identifier, element)) {
+      return;
+    }
+    Element enclosingElement = element.enclosingElement;
+    if (enclosingElement is CompilationUnitElement) {
+      _recordUsedElement(element);
+    } else if (enclosingElement is ExtensionElement) {
+      _recordUsedExtension(enclosingElement);
+      return;
+    } else if (element is PrefixElement) {
+      usedElements.prefixMap.putIfAbsent(element, () => <Element>[]);
+    } else if (element is MultiplyDefinedElement) {
+      // If the element is multiply defined then call this method recursively
+      // for each of the conflicting elements.
+      List<Element> conflictingElements = element.conflictingElements;
+      int length = conflictingElements.length;
+      for (int i = 0; i < length; i++) {
+        Element elt = conflictingElements[i];
+        _visitIdentifier(identifier, elt);
+      }
+    }
+  }
+}
+
+/// Instances of the class `ImportsVerifier` visit all of the referenced
+/// libraries in the source code verifying that all of the imports are used,
+/// otherwise a [HintCode.UNUSED_IMPORT] hint is generated with
+/// [generateUnusedImportHints].
+///
+/// Additionally, [generateDuplicateImportHints] generates
+/// [HintCode.DUPLICATE_IMPORT] hints and [HintCode.UNUSED_SHOWN_NAME] hints.
+///
+/// While this class does not yet have support for an "Organize Imports" action,
+/// this logic built up in this class could be used for such an action in the
+/// future.
+class ImportsVerifier {
+  /// All [ImportDirective]s of the current library.
+  final List<ImportDirective> _allImports = <ImportDirective>[];
+
+  /// A list of [ImportDirective]s that the current library imports, but does
+  /// not use.
+  ///
+  /// As identifiers are visited by this visitor and an import has been
+  /// identified as being used by the library, the [ImportDirective] is removed
+  /// from this list. After all the sources in the library have been evaluated,
+  /// this list represents the set of unused imports.
+  ///
+  /// See [ImportsVerifier.generateUnusedImportErrors].
+  final List<ImportDirective> _unusedImports = <ImportDirective>[];
+
+  /// After the list of [unusedImports] has been computed, this list is a proper
+  /// subset of the unused imports that are listed more than once.
+  final List<ImportDirective> _duplicateImports = <ImportDirective>[];
+
+  /// The cache of [Namespace]s for [ImportDirective]s.
+  final HashMap<ImportDirective, Namespace> _namespaceMap =
+      new HashMap<ImportDirective, Namespace>();
+
+  /// This is a map between prefix elements and the import directives from which
+  /// they are derived. In cases where a type is referenced via a prefix
+  /// element, the import directive can be marked as used (removed from the
+  /// unusedImports) by looking at the resolved `lib` in `lib.X`, instead of
+  /// looking at which library the `lib.X` resolves.
+  ///
+  /// TODO (jwren) Since multiple [ImportDirective]s can share the same
+  /// [PrefixElement], it is possible to have an unreported unused import in
+  /// situations where two imports use the same prefix and at least one import
+  /// directive is used.
+  final HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap =
+      new HashMap<PrefixElement, List<ImportDirective>>();
+
+  /// A map of identifiers that the current library's imports show, but that the
+  /// library does not use.
+  ///
+  /// Each import directive maps to a list of the identifiers that are imported
+  /// via the "show" keyword.
+  ///
+  /// As each identifier is visited by this visitor, it is identified as being
+  /// used by the library, and the identifier is removed from this map (under
+  /// the import that imported it). After all the sources in the library have
+  /// been evaluated, each list in this map's values present the set of unused
+  /// shown elements.
+  ///
+  /// See [ImportsVerifier.generateUnusedShownNameHints].
+  final HashMap<ImportDirective, List<SimpleIdentifier>> _unusedShownNamesMap =
+      new HashMap<ImportDirective, List<SimpleIdentifier>>();
+
+  /// A map of names that are hidden more than once.
+  final HashMap<NamespaceDirective, List<SimpleIdentifier>>
+      _duplicateHiddenNamesMap =
+      new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
+
+  /// A map of names that are shown more than once.
+  final HashMap<NamespaceDirective, List<SimpleIdentifier>>
+      _duplicateShownNamesMap =
+      new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
+
+  void addImports(CompilationUnit node) {
+    for (Directive directive in node.directives) {
+      if (directive is ImportDirective) {
+        LibraryElement libraryElement = directive.uriElement;
+        if (libraryElement == null) {
+          continue;
+        }
+        _allImports.add(directive);
+        _unusedImports.add(directive);
+        //
+        // Initialize prefixElementMap
+        //
+        if (directive.asKeyword != null) {
+          SimpleIdentifier prefixIdentifier = directive.prefix;
+          if (prefixIdentifier != null) {
+            Element element = prefixIdentifier.staticElement;
+            if (element is PrefixElement) {
+              List<ImportDirective> list = _prefixElementMap[element];
+              if (list == null) {
+                list = new List<ImportDirective>();
+                _prefixElementMap[element] = list;
+              }
+              list.add(directive);
+            }
+            // TODO (jwren) Can the element ever not be a PrefixElement?
+          }
+        }
+        _addShownNames(directive);
+      }
+      if (directive is NamespaceDirective) {
+        _addDuplicateShownHiddenNames(directive);
+      }
+    }
+    if (_unusedImports.length > 1) {
+      // order the list of unusedImports to find duplicates in faster than
+      // O(n^2) time
+      List<ImportDirective> importDirectiveArray =
+          new List<ImportDirective>.from(_unusedImports);
+      importDirectiveArray.sort(ImportDirective.COMPARATOR);
+      ImportDirective currentDirective = importDirectiveArray[0];
+      for (int i = 1; i < importDirectiveArray.length; i++) {
+        ImportDirective nextDirective = importDirectiveArray[i];
+        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
+          // Add either the currentDirective or nextDirective depending on which
+          // comes second, this guarantees that the first of the duplicates
+          // won't be highlighted.
+          if (currentDirective.offset < nextDirective.offset) {
+            _duplicateImports.add(nextDirective);
+          } else {
+            _duplicateImports.add(currentDirective);
+          }
+        }
+        currentDirective = nextDirective;
+      }
+    }
+  }
+
+  /// Any time after the defining compilation unit has been visited by this
+  /// visitor, this method can be called to report an
+  /// [HintCode.DUPLICATE_IMPORT] hint for each of the import directives in the
+  /// [duplicateImports] list.
+  ///
+  /// @param errorReporter the error reporter to report the set of
+  ///        [HintCode.DUPLICATE_IMPORT] hints to
+  void generateDuplicateImportHints(ErrorReporter errorReporter) {
+    int length = _duplicateImports.length;
+    for (int i = 0; i < length; i++) {
+      errorReporter.reportErrorForNode(
+          HintCode.DUPLICATE_IMPORT, _duplicateImports[i].uri);
+    }
+  }
+
+  /// Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
+  /// shown or hidden name.
+  ///
+  /// Only call this method after all of the compilation units have been visited
+  /// by this visitor.
+  ///
+  /// @param errorReporter the error reporter used to report the set of
+  ///          [HintCode.UNUSED_SHOWN_NAME] hints
+  void generateDuplicateShownHiddenNameHints(ErrorReporter reporter) {
+    _duplicateHiddenNamesMap.forEach(
+        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
+      int length = identifiers.length;
+      for (int i = 0; i < length; i++) {
+        Identifier identifier = identifiers[i];
+        reporter.reportErrorForNode(
+            HintCode.DUPLICATE_HIDDEN_NAME, identifier, [identifier.name]);
+      }
+    });
+    _duplicateShownNamesMap.forEach(
+        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
+      int length = identifiers.length;
+      for (int i = 0; i < length; i++) {
+        Identifier identifier = identifiers[i];
+        reporter.reportErrorForNode(
+            HintCode.DUPLICATE_SHOWN_NAME, identifier, [identifier.name]);
+      }
+    });
+  }
+
+  /// Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
+  ///
+  /// Only call this method after all of the compilation units have been visited
+  /// by this visitor.
+  ///
+  /// @param errorReporter the error reporter used to report the set of
+  ///        [HintCode.UNUSED_IMPORT] hints
+  void generateUnusedImportHints(ErrorReporter errorReporter) {
+    int length = _unusedImports.length;
+    for (int i = 0; i < length; i++) {
+      ImportDirective unusedImport = _unusedImports[i];
+      // Check that the imported URI exists and isn't dart:core
+      ImportElement importElement = unusedImport.element;
+      if (importElement != null) {
+        LibraryElement libraryElement = importElement.importedLibrary;
+        if (libraryElement == null ||
+            libraryElement.isDartCore ||
+            libraryElement.isSynthetic) {
+          continue;
+        }
+      }
+      StringLiteral uri = unusedImport.uri;
+      errorReporter
+          .reportErrorForNode(HintCode.UNUSED_IMPORT, uri, [uri.stringValue]);
+    }
+  }
+
+  /// Use the error [reporter] to report an [HintCode.UNUSED_SHOWN_NAME] hint
+  /// for each unused shown name.
+  ///
+  /// This method should only be invoked after all of the compilation units have
+  /// been visited by this visitor.
+  void generateUnusedShownNameHints(ErrorReporter reporter) {
+    _unusedShownNamesMap.forEach(
+        (ImportDirective importDirective, List<SimpleIdentifier> identifiers) {
+      if (_unusedImports.contains(importDirective)) {
+        // The whole import is unused, not just one or more shown names from it,
+        // so an "unused_import" hint will be generated, making it unnecessary
+        // to generate hints for the individual names.
+        return;
+      }
+      int length = identifiers.length;
+      for (int i = 0; i < length; i++) {
+        Identifier identifier = identifiers[i];
+        List<SimpleIdentifier> duplicateNames =
+            _duplicateShownNamesMap[importDirective];
+        if (duplicateNames == null || !duplicateNames.contains(identifier)) {
+          // Only generate a hint if we won't also generate a
+          // "duplicate_shown_name" hint for the same identifier.
+          reporter.reportErrorForNode(
+              HintCode.UNUSED_SHOWN_NAME, identifier, [identifier.name]);
+        }
+      }
+    });
+  }
+
+  /// Remove elements from [_unusedImports] using the given [usedElements].
+  void removeUsedElements(UsedImportedElements usedElements) {
+    // Stop if all the imports and shown names are known to be used.
+    if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
+      return;
+    }
+    // Process import prefixes.
+    usedElements.prefixMap
+        .forEach((PrefixElement prefix, List<Element> elements) {
+      List<ImportDirective> importDirectives = _prefixElementMap[prefix];
+      if (importDirectives != null) {
+        int importLength = importDirectives.length;
+        for (int i = 0; i < importLength; i++) {
+          ImportDirective importDirective = importDirectives[i];
+          _unusedImports.remove(importDirective);
+          int elementLength = elements.length;
+          for (int j = 0; j < elementLength; j++) {
+            Element element = elements[j];
+            _removeFromUnusedShownNamesMap(element, importDirective);
+          }
+        }
+      }
+    });
+    // Process top-level elements.
+    for (Element element in usedElements.elements) {
+      // Stop if all the imports and shown names are known to be used.
+      if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
+        return;
+      }
+      // Find import directives using namespaces.
+      String name = element.name;
+      for (ImportDirective importDirective in _allImports) {
+        Namespace namespace = _computeNamespace(importDirective);
+        if (namespace?.get(name) != null) {
+          _unusedImports.remove(importDirective);
+          _removeFromUnusedShownNamesMap(element, importDirective);
+        }
+      }
+    }
+    // Process extension elements.
+    for (ExtensionElement extensionElement in usedElements.usedExtensions) {
+      // Stop if all the imports and shown names are known to be used.
+      if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
+        return;
+      }
+      // Find import directives using namespaces.
+      String name = extensionElement.name;
+      for (ImportDirective importDirective in _allImports) {
+        Namespace namespace = _computeNamespace(importDirective);
+        if (namespace?.get(name) == extensionElement) {
+          _unusedImports.remove(importDirective);
+          _removeFromUnusedShownNamesMap(extensionElement, importDirective);
+        }
+      }
+    }
+  }
+
+  /// Add duplicate shown and hidden names from [directive] into
+  /// [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
+  void _addDuplicateShownHiddenNames(NamespaceDirective directive) {
+    if (directive.combinators == null) {
+      return;
+    }
+    for (Combinator combinator in directive.combinators) {
+      // Use a Set to find duplicates in faster than O(n^2) time.
+      Set<Element> identifiers = new Set<Element>();
+      if (combinator is HideCombinator) {
+        for (SimpleIdentifier name in combinator.hiddenNames) {
+          if (name.staticElement != null) {
+            if (!identifiers.add(name.staticElement)) {
+              // [name] is a duplicate.
+              List<SimpleIdentifier> duplicateNames = _duplicateHiddenNamesMap
+                  .putIfAbsent(directive, () => new List<SimpleIdentifier>());
+              duplicateNames.add(name);
+            }
+          }
+        }
+      } else if (combinator is ShowCombinator) {
+        for (SimpleIdentifier name in combinator.shownNames) {
+          if (name.staticElement != null) {
+            if (!identifiers.add(name.staticElement)) {
+              // [name] is a duplicate.
+              List<SimpleIdentifier> duplicateNames = _duplicateShownNamesMap
+                  .putIfAbsent(directive, () => new List<SimpleIdentifier>());
+              duplicateNames.add(name);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /// Add every shown name from [importDirective] into [_unusedShownNamesMap].
+  void _addShownNames(ImportDirective importDirective) {
+    if (importDirective.combinators == null) {
+      return;
+    }
+    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
+    _unusedShownNamesMap[importDirective] = identifiers;
+    for (Combinator combinator in importDirective.combinators) {
+      if (combinator is ShowCombinator) {
+        for (SimpleIdentifier name in combinator.shownNames) {
+          if (name.staticElement != null) {
+            identifiers.add(name);
+          }
+        }
+      }
+    }
+  }
+
+  /// Lookup and return the [Namespace] from the [_namespaceMap].
+  ///
+  /// If the map does not have the computed namespace, compute it and cache it
+  /// in the map. If [importDirective] is not resolved or is not resolvable,
+  /// `null` is returned.
+  ///
+  /// @param importDirective the import directive used to compute the returned
+  ///        namespace
+  /// @return the computed or looked up [Namespace]
+  Namespace _computeNamespace(ImportDirective importDirective) {
+    Namespace namespace = _namespaceMap[importDirective];
+    if (namespace == null) {
+      // If the namespace isn't in the namespaceMap, then compute and put it in
+      // the map.
+      ImportElement importElement = importDirective.element;
+      if (importElement != null) {
+        namespace = importElement.namespace;
+        _namespaceMap[importDirective] = namespace;
+      }
+    }
+    return namespace;
+  }
+
+  /// Remove [element] from the list of names shown by [importDirective].
+  void _removeFromUnusedShownNamesMap(
+      Element element, ImportDirective importDirective) {
+    List<SimpleIdentifier> identifiers = _unusedShownNamesMap[importDirective];
+    if (identifiers == null) {
+      return;
+    }
+    int length = identifiers.length;
+    for (int i = 0; i < length; i++) {
+      Identifier identifier = identifiers[i];
+      if (element is PropertyAccessorElement) {
+        // If the getter or setter of a variable is used, then the variable (the
+        // shown name) is used.
+        if (identifier.staticElement == element.variable) {
+          identifiers.remove(identifier);
+          break;
+        }
+      } else {
+        if (identifier.staticElement == element) {
+          identifiers.remove(identifier);
+          break;
+        }
+      }
+    }
+    if (identifiers.isEmpty) {
+      _unusedShownNamesMap.remove(importDirective);
+    }
+  }
+}
+
+/// A container with information about used imports prefixes and used imported
+/// elements.
+class UsedImportedElements {
+  /// The map of referenced prefix elements and the elements that they prefix.
+  final Map<PrefixElement, List<Element>> prefixMap = {};
+
+  /// The set of referenced top-level elements.
+  final Set<Element> elements = {};
+
+  /// The set of extensions defining members that are referenced.
+  final Set<ExtensionElement> usedExtensions = {};
+}
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 4edfcba..af4dc3a 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -11,7 +11,8 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -22,7 +23,7 @@
 
   final TypeSystem _typeSystem;
   final TypeProvider _typeProvider;
-  final InheritanceManager2 _inheritance;
+  final InheritanceManager3 _inheritance;
   final ErrorReporter _reporter;
 
   InheritanceOverrideVerifier(
@@ -76,9 +77,9 @@
     }
   }
 
-  /// Returns [FunctionType]s of members that are in the interface of the
+  /// Returns [ExecutableElement] members that are in the interface of the
   /// given class, but don't have concrete implementations.
-  static List<FunctionType> missingOverrides(ClassDeclaration node) {
+  static List<ExecutableElement> missingOverrides(ClassDeclaration node) {
     return node.name.getProperty(_missingOverridesKey) ?? const [];
   }
 }
@@ -86,7 +87,7 @@
 class _ClassVerifier {
   final TypeSystem typeSystem;
   final TypeProvider typeProvider;
-  final InheritanceManager2 inheritance;
+  final InheritanceManager3 inheritance;
   final ErrorReporter reporter;
 
   final FeatureSet featureSet;
@@ -188,27 +189,27 @@
     _checkForMismatchedAccessorTypes(interface);
 
     if (!classElement.isAbstract) {
-      List<FunctionType> inheritedAbstract = null;
+      List<ExecutableElement> inheritedAbstract = null;
 
       for (var name in interface.map.keys) {
         if (!name.isAccessibleFor(libraryUri)) {
           continue;
         }
 
-        var interfaceType = interface.map[name];
-        var concreteType = interface.implemented[name];
+        var interfaceElement = interface.map[name];
+        var concreteElement = interface.implemented[name];
 
         // No concrete implementation of the name.
-        if (concreteType == null) {
+        if (concreteElement == null) {
           if (!_reportConcreteClassWithAbstractMember(name.name)) {
             inheritedAbstract ??= [];
-            inheritedAbstract.add(interfaceType);
+            inheritedAbstract.add(interfaceElement);
           }
           continue;
         }
 
         // The case when members have different kinds is reported in verifier.
-        if (concreteType.element.kind != interfaceType.element.kind) {
+        if (concreteElement.kind != interfaceElement.kind) {
           continue;
         }
 
@@ -220,16 +221,17 @@
         // 2. if the class contains no member named `m`, and the class member
         //    for `noSuchMethod` is the one declared in `Object`, then it's a
         //    compile-time error.
-        if (!typeSystem.isOverrideSubtypeOf(concreteType, interfaceType)) {
+        if (!typeSystem.isOverrideSubtypeOf(
+            concreteElement.type, interfaceElement.type)) {
           reporter.reportErrorForNode(
             CompileTimeErrorCode.INVALID_OVERRIDE,
             classNameNode,
             [
               name.name,
-              concreteType.element.enclosingElement.name,
-              concreteType.displayName,
-              interfaceType.element.enclosingElement.name,
-              interfaceType.displayName,
+              concreteElement.enclosingElement.name,
+              concreteElement.displayName,
+              interfaceElement.enclosingElement.name,
+              interfaceElement.displayName,
             ],
           );
         }
@@ -265,15 +267,15 @@
 
     var name = new Name(libraryUri, member.name);
     for (var superInterface in allSuperinterfaces) {
-      var superMemberType = superInterface.declared[name];
-      if (superMemberType != null) {
+      var superMember = superInterface.declared[name];
+      if (superMember != null) {
         // The case when members have different kinds is reported in verifier.
         // TODO(scheglov) Do it here?
-        if (member.kind != superMemberType.element.kind) {
+        if (member.kind != superMember.kind) {
           continue;
         }
 
-        if (!typeSystem.isOverrideSubtypeOf(member.type, superMemberType)) {
+        if (!typeSystem.isOverrideSubtypeOf(member.type, superMember.type)) {
           reporter.reportErrorForNode(
             CompileTimeErrorCode.INVALID_OVERRIDE,
             node,
@@ -281,14 +283,14 @@
               name.name,
               member.enclosingElement.name,
               member.type.displayName,
-              superMemberType.element.enclosingElement.name,
-              superMemberType.displayName
+              superMember.enclosingElement.name,
+              superMember.displayName
             ],
           );
         }
         if (methodParameterNodes != null) {
           _checkForOptionalParametersDifferentDefaultValues(
-            superMemberType.element,
+            superMember,
             member,
             methodParameterNodes,
           );
@@ -382,7 +384,7 @@
       if (!name.isAccessibleFor(libraryUri)) continue;
 
       var getter = interface.map[name];
-      if (getter.element.kind == ElementKind.GETTER) {
+      if (getter.kind == ElementKind.GETTER) {
         // TODO(scheglov) We should separate getters and setters.
         var setter = interface.map[new Name(libraryUri, '${name.name}=')];
         if (setter != null && setter.parameters.length == 1) {
@@ -390,27 +392,24 @@
           var setterType = setter.parameters[0].type;
           if (!typeSystem.isAssignableTo(getterType, setterType,
               featureSet: featureSet)) {
-            var getterElement = getter.element;
-            var setterElement = setter.element;
-
             Element errorElement;
-            if (getterElement.enclosingElement == classElement) {
-              errorElement = getterElement;
-            } else if (setterElement.enclosingElement == classElement) {
-              errorElement = setterElement;
+            if (getter.enclosingElement == classElement) {
+              errorElement = getter;
+            } else if (setter.enclosingElement == classElement) {
+              errorElement = setter;
             } else {
               errorElement = classElement;
             }
 
-            String getterName = getterElement.displayName;
-            if (getterElement.enclosingElement != classElement) {
-              var getterClassName = getterElement.enclosingElement.displayName;
+            String getterName = getter.displayName;
+            if (getter.enclosingElement != classElement) {
+              var getterClassName = getter.enclosingElement.displayName;
               getterName = '$getterClassName.$getterName';
             }
 
-            String setterName = setterElement.displayName;
-            if (setterElement.enclosingElement != classElement) {
-              var setterClassName = setterElement.enclosingElement.displayName;
+            String setterName = setter.displayName;
+            if (setter.enclosingElement != classElement) {
+              var setterClassName = setter.enclosingElement.displayName;
               setterName = '$setterClassName.$setterName';
             }
 
@@ -445,6 +444,9 @@
     for (var i = 0; i < baseParameterElements.length; ++i) {
       var baseParameter = baseParameterElements[i];
       if (baseParameter.isOptional) {
+        if (baseParameter is ParameterMember) {
+          baseParameter = (baseParameter as ParameterMember).baseElement;
+        }
         baseOptionalElements.add(baseParameter);
       }
     }
@@ -634,13 +636,13 @@
         node,
         [
           name.name,
-          conflict.getter.element.enclosingElement.name,
-          conflict.method.element.enclosingElement.name
+          conflict.getter.enclosingElement.name,
+          conflict.method.enclosingElement.name
         ],
       );
     } else {
       var candidatesStr = conflict.candidates.map((candidate) {
-        var className = candidate.element.enclosingElement.name;
+        var className = candidate.enclosingElement.name;
         return '$className.${name.name} (${candidate.displayName})';
       }).join(', ');
 
@@ -652,20 +654,18 @@
     }
   }
 
-  void _reportInheritedAbstractMembers(List<FunctionType> types) {
-    if (types == null) {
+  void _reportInheritedAbstractMembers(List<ExecutableElement> elements) {
+    if (elements == null) {
       return;
     }
 
     classNameNode.setProperty(
       InheritanceOverrideVerifier._missingOverridesKey,
-      types,
+      elements,
     );
 
     var descriptions = <String>[];
-    for (FunctionType type in types) {
-      ExecutableElement element = type.element;
-
+    for (ExecutableElement element in elements) {
       String prefix = '';
       if (element is PropertyAccessorElement) {
         if (element.isGetter) {
diff --git a/pkg/analyzer/lib/src/error/pending_error.dart b/pkg/analyzer/lib/src/error/pending_error.dart
deleted file mode 100644
index 8d65815..0000000
--- a/pkg/analyzer/lib/src/error/pending_error.dart
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/error/error.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/constant.dart';
-import 'package:analyzer/src/generated/source.dart';
-
-/**
- * A pending error is an analysis error that could not be reported at the time
- * it was discovered because some piece of information might be missing. After
- * the information has been computed, the pending error can be converted into a
- * real error.
- */
-abstract class PendingError {
-  /**
-   * Create an analysis error based on the information in the pending error.
-   */
-  AnalysisError toAnalysisError();
-}
-
-/**
- * A pending error used to compute either a [HintCode.MISSING_REQUIRED_PARAM] or
- * [HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS] analysis error. These errors
- * require that the value of the `@required` annotation be computed, which is
- * not always true when the error is discovered.
- */
-class PendingMissingRequiredParameterError implements PendingError {
-  /**
-   * The source against which the error will be reported.
-   */
-  final Source source;
-
-  /**
-   * The name of the parameter that is required.
-   */
-  final String parameterName;
-
-  /**
-   * The offset of the name of the method / function at the invocation site.
-   */
-  final int offset;
-
-  /**
-   * The length of the name of the method / function at the invocation site.
-   */
-  final int length;
-
-  /**
-   * The `@required` annotation whose value is used to compose the error message.
-   */
-  final ElementAnnotation annotation;
-
-  /**
-   * Initialize a newly created pending error.
-   */
-  PendingMissingRequiredParameterError(
-      this.source, this.parameterName, AstNode node, this.annotation)
-      : offset = node.offset,
-        length = node.length;
-
-  @override
-  AnalysisError toAnalysisError() {
-    HintCode errorCode;
-    List<String> arguments;
-    DartObject constantValue = annotation.constantValue;
-    String reason = constantValue?.getField('reason')?.toStringValue();
-    if (reason != null) {
-      errorCode = HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS;
-      arguments = [parameterName, reason];
-    } else {
-      errorCode = HintCode.MISSING_REQUIRED_PARAM;
-      arguments = [parameterName];
-    }
-    return new AnalysisError(source, offset, length, errorCode, arguments);
-  }
-}
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
new file mode 100644
index 0000000..6bd0134
--- /dev/null
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -0,0 +1,133 @@
+// 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/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/error/listener.dart';
+import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/error/codes.dart';
+
+/// Checks for missing arguments for required named parameters.
+class RequiredParametersVerifier extends SimpleAstVisitor<void> {
+  final ErrorReporter _errorReporter;
+
+  RequiredParametersVerifier(this._errorReporter);
+
+  @override
+  void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
+    _checkForMissingRequiredParam(
+      node.staticInvokeType,
+      node.argumentList,
+      node,
+    );
+  }
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    _checkForMissingRequiredParam(
+      node.staticElement?.type,
+      node.argumentList,
+      node.constructorName,
+    );
+  }
+
+  @override
+  void visitMethodInvocation(MethodInvocation node) {
+    _checkForMissingRequiredParam(
+      node.staticInvokeType,
+      node.argumentList,
+      node.methodName,
+    );
+  }
+
+  @override
+  void visitRedirectingConstructorInvocation(
+      RedirectingConstructorInvocation node) {
+    _checkForMissingRequiredParam(
+      node.staticElement?.type,
+      node.argumentList,
+      node,
+    );
+  }
+
+  @override
+  void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
+    _checkForMissingRequiredParam(
+      node.staticElement?.type,
+      node.argumentList,
+      node,
+    );
+  }
+
+  void _checkForMissingRequiredParam(
+    DartType type,
+    ArgumentList argumentList,
+    AstNode node,
+  ) {
+    if (type is FunctionType) {
+      for (ParameterElement parameter in type.parameters) {
+        if (parameter.isRequiredNamed) {
+          String parameterName = parameter.name;
+          if (!_containsNamedExpression(argumentList, parameterName)) {
+            _errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
+              node,
+              [parameterName],
+            );
+          }
+        }
+        if (parameter.isOptionalNamed) {
+          ElementAnnotationImpl annotation = _requiredAnnotation(parameter);
+          if (annotation != null) {
+            String parameterName = parameter.name;
+            if (!_containsNamedExpression(argumentList, parameterName)) {
+              String reason = _requiredReason(annotation);
+              if (reason != null) {
+                _errorReporter.reportErrorForNode(
+                  HintCode.MISSING_REQUIRED_PARAM_WITH_DETAILS,
+                  node,
+                  [parameterName, reason],
+                );
+              } else {
+                _errorReporter.reportErrorForNode(
+                  HintCode.MISSING_REQUIRED_PARAM,
+                  node,
+                  [parameterName],
+                );
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  static bool _containsNamedExpression(ArgumentList args, String name) {
+    NodeList<Expression> arguments = args.arguments;
+    for (int i = arguments.length - 1; i >= 0; i--) {
+      Expression expression = arguments[i];
+      if (expression is NamedExpression) {
+        if (expression.name.label.name == name) {
+          return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  static ElementAnnotationImpl _requiredAnnotation(ParameterElement element) {
+    return element.metadata.firstWhere(
+      (e) => e.isRequired,
+      orElse: () => null,
+    );
+  }
+
+  static String _requiredReason(ElementAnnotationImpl annotation) {
+    DartObject constantValue = annotation.computeConstantValue();
+    return constantValue?.getField('reason')?.toStringValue();
+  }
+}
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index e3454ce..131f83f 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -15,6 +15,7 @@
         CompilationUnitImpl,
         ExtensionDeclarationImpl,
         MixinDeclarationImpl;
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/fasta/error_converter.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
 import 'package:front_end/src/fasta/messages.dart'
@@ -45,6 +46,7 @@
 import 'package:front_end/src/fasta/parser.dart'
     show
         Assert,
+        ClassKind,
         FormalParameterKind,
         IdentifierContext,
         MemberKind,
@@ -214,6 +216,7 @@
     extensionDeclaration = ast.extensionDeclaration(
       comment: comment,
       metadata: metadata,
+      extensionKeyword: extensionKeyword,
       name: name,
       typeParameters: typeParameters,
       extendedType: null, // extendedType is set in [endExtensionDeclaration]
@@ -270,7 +273,9 @@
       assert(staticToken.isModifier);
       String className = classDeclaration != null
           ? classDeclaration.name.name
-          : mixinDeclaration.name.name;
+          : (mixinDeclaration != null
+              ? mixinDeclaration.name.name
+              : extensionDeclaration.name?.name);
       if (name?.lexeme == className && getOrSet == null) {
         // This error is also reported in OutlineBuilder.beginMethod
         handleRecoverableError(
@@ -409,33 +414,46 @@
           initializerObject.target, initializerObject);
     }
 
+    if (initializerObject is CascadeExpression) {
+      return buildInitializerTargetExpressionRecovery(
+          initializerObject.target, initializerObject);
+    }
+
     throw new UnsupportedError('unsupported initializer:'
         ' ${initializerObject.runtimeType} :: $initializerObject');
   }
 
   AstNode buildInitializerTargetExpressionRecovery(
       Expression target, Object initializerObject) {
-    if (target is FunctionExpressionInvocation) {
-      Expression targetFunct = target.function;
-      if (targetFunct is SuperExpression) {
-        // TODO(danrubel): Consider generating this error in the parser
-        // This error is also reported in the body builder
-        handleRecoverableError(messageInvalidSuperInInitializer,
-            targetFunct.superKeyword, targetFunct.superKeyword);
-        return ast.superConstructorInvocation(
-            targetFunct.superKeyword, null, null, target.argumentList);
+    ArgumentList argumentList;
+    while (true) {
+      if (target is FunctionExpressionInvocation) {
+        argumentList = (target as FunctionExpressionInvocation).argumentList;
+        target = (target as FunctionExpressionInvocation).function;
+      } else if (target is MethodInvocation) {
+        argumentList = (target as MethodInvocation).argumentList;
+        target = (target as MethodInvocation).target;
+      } else if (target is PropertyAccess) {
+        argumentList = null;
+        target = (target as PropertyAccess).target;
+      } else {
+        break;
       }
-      if (targetFunct is ThisExpression) {
-        // TODO(danrubel): Consider generating this error in the parser
-        // This error is also reported in the body builder
-        handleRecoverableError(messageInvalidThisInInitializer,
-            targetFunct.thisKeyword, targetFunct.thisKeyword);
-        return ast.redirectingConstructorInvocation(
-            targetFunct.thisKeyword, null, null, target.argumentList);
-      }
-      throw new UnsupportedError('unsupported initializer:'
-          ' ${initializerObject.runtimeType} :: $initializerObject'
-          ' %% targetFunct : ${targetFunct.runtimeType} :: $targetFunct');
+    }
+    if (target is SuperExpression) {
+      // TODO(danrubel): Consider generating this error in the parser
+      // This error is also reported in the body builder
+      handleRecoverableError(messageInvalidSuperInInitializer,
+          target.superKeyword, target.superKeyword);
+      return ast.superConstructorInvocation(
+          target.superKeyword, null, null, argumentList);
+    } else if (target is ThisExpression) {
+      // TODO(danrubel): Consider generating this error in the parser
+      // This error is also reported in the body builder
+      handleRecoverableError(messageInvalidThisInInitializer,
+          target.thisKeyword, target.thisKeyword);
+      return ast.redirectingConstructorInvocation(
+          target.thisKeyword, null, null, argumentList);
     }
     throw new UnsupportedError('unsupported initializer:'
         ' ${initializerObject.runtimeType} :: $initializerObject'
@@ -563,12 +581,6 @@
     push(ast.awaitExpression(awaitKeyword, pop()));
   }
 
-  void endInvalidAwaitExpression(
-      Token awaitKeyword, Token endToken, MessageCode errorCode) {
-    debugEvent("InvalidAwaitExpression");
-    endAwaitExpression(awaitKeyword, endToken);
-  }
-
   @override
   void endBinaryExpression(Token operatorToken) {
     assert(operatorToken.isOperator ||
@@ -641,7 +653,7 @@
 
   @override
   void endClassOrMixinBody(
-      int memberCount, Token leftBracket, Token rightBracket) {
+      ClassKind kind, int memberCount, Token leftBracket, Token rightBracket) {
     // TODO(danrubel): consider renaming endClassOrMixinBody
     // to endClassOrMixinOrExtensionBody
     assert(optional('{', leftBracket));
@@ -815,7 +827,8 @@
   }
 
   @override
-  void endExtensionDeclaration(Token onKeyword, Token token) {
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token token) {
     TypeAnnotation type = pop();
     extensionDeclaration
       ..extendedType = type
@@ -875,6 +888,15 @@
           ast.simpleIdentifier(typeName.identifier.token, isDeclaration: true);
     }
 
+    if (extensionDeclaration != null) {
+      // TODO(brianwilkerson) Decide how to handle constructor and field
+      //  declarations within extensions. They are invalid, but we might want to
+      //  resolve them in order to get navigation, search, etc.
+      errorReporter.errorReporter.reportErrorForNode(
+          CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR,
+          name ?? returnType);
+      return;
+    }
     currentDeclarationMembers.add(ast.constructorDeclaration(
         comment,
         metadata,
@@ -917,6 +939,17 @@
     Token covariantKeyword = covariantToken;
     List<Annotation> metadata = pop();
     Comment comment = _findComment(metadata, beginToken);
+    if (extensionDeclaration != null && staticToken == null) {
+      // TODO(brianwilkerson) Decide how to handle constructor and field
+      //  declarations within extensions. They are invalid, but we might want to
+      //  resolve them in order to get navigation, search, etc.
+      for (VariableDeclaration variable in variables) {
+        errorReporter.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD,
+            variable.name);
+      }
+      return;
+    }
     currentDeclarationMembers.add(ast.fieldDeclaration2(
         comment: comment,
         metadata: metadata,
@@ -982,8 +1015,14 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     assert(optionalOrNull('this', thisKeyword));
     assert(thisKeyword == null
         ? periodAfterThis == null
@@ -1338,6 +1377,12 @@
     push(initializers);
   }
 
+  void endInvalidAwaitExpression(
+      Token awaitKeyword, Token endToken, MessageCode errorCode) {
+    debugEvent("InvalidAwaitExpression");
+    endAwaitExpression(awaitKeyword, endToken);
+  }
+
   @override
   void endLabeledStatement(int labelCount) {
     debugEvent("LabeledStatement");
@@ -1522,6 +1567,15 @@
           initializers,
           redirectedConstructor,
           body);
+      if (extensionDeclaration != null) {
+        // TODO(brianwilkerson) Decide how to handle constructor and field
+        //  declarations within extensions. They are invalid, but we might want
+        //  to resolve them in order to get navigation, search, etc.
+        errorReporter.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR,
+            name ?? prefixOrName);
+        return;
+      }
       currentDeclarationMembers.add(constructor);
       if (mixinDeclaration != null) {
         // TODO (danrubel): Report an error if this is a mixin declaration.
@@ -1535,6 +1589,11 @@
             messageConstMethod, modifiers.constKeyword, modifiers.constKeyword);
       }
       checkFieldFormalParameters(parameters);
+      if (extensionDeclaration != null && body is EmptyFunctionBody) {
+        errorReporter.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER, name);
+        return;
+      }
       currentDeclarationMembers.add(ast.methodDeclaration(
           comment,
           metadata,
@@ -1550,7 +1609,7 @@
     }
 
     if (name is SimpleIdentifier) {
-      if (name.name == currentDeclarationName.name && getOrSet == null) {
+      if (name.name == currentDeclarationName?.name && getOrSet == null) {
         constructor(name, null, null);
       } else if (initializers.isNotEmpty && getOrSet == null) {
         constructor(name, null, null);
@@ -2102,7 +2161,7 @@
     SimpleIdentifier stackTrace;
     if (catchParameterList != null) {
       List<FormalParameter> catchParameters = catchParameterList.parameters;
-      if (catchParameters.length > 0) {
+      if (catchParameters.isNotEmpty) {
         exception = catchParameters[0].identifier;
         localDeclarations[exception.offset] = exception;
       }
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index d8abec8..0ffaae8 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -184,6 +184,16 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    ExtensionElement element = _match(node.name, _walker.getExtension());
+    (node as ExtensionDeclarationImpl).declaredElement = element;
+    _walk(new ElementWalker.forExtension(element), () {
+      super.visitExtensionDeclaration(node);
+    });
+    resolveMetadata(node, node.metadata, element);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     super.visitFieldDeclaration(node);
     FieldElement firstFieldElement = node.fields.variables[0].declaredElement;
@@ -799,6 +809,8 @@
   int _constructorIndex = 0;
   List<ClassElement> _enums;
   int _enumIndex = 0;
+  List<ExtensionElement> _extensions;
+  int _extensionIndex = 0;
   List<ExecutableElement> _functions;
   int _functionIndex = 0;
   List<ClassElement> _mixins;
@@ -831,6 +843,7 @@
         _accessors = compilationUnit.accessors.where(_isNotSynthetic).toList(),
         _classes = compilationUnit.types,
         _enums = compilationUnit.enums,
+        _extensions = compilationUnit.extensions,
         _functions = compilationUnit.functions,
         _mixins = compilationUnit.mixins,
         _typedefs = compilationUnit.functionTypeAliases,
@@ -843,6 +856,15 @@
       ExecutableElement element, CompilationUnitElement compilationUnit)
       : this._forExecutable(element, compilationUnit, new ElementHolder());
 
+  /// Creates an [ElementWalker] which walks the child elements of an extension
+  /// element.
+  ElementWalker.forExtension(ExtensionElement element)
+      : element = element,
+        _accessors = element.accessors.where(_isNotSynthetic).toList(),
+        _functions = element.methods,
+        _typeParameters = element.typeParameters,
+        _variables = element.fields.where(_isNotSynthetic).toList();
+
   /// Creates an [ElementWalker] which walks the child elements of a typedef
   /// element.
   ElementWalker.forGenericFunctionType(GenericFunctionTypeElement element)
@@ -904,6 +926,8 @@
   /// an [IndexError] if there are no more.
   ClassElement getEnum() => _enums[_enumIndex++];
 
+  ExtensionElement getExtension() => _extensions[_extensionIndex++];
+
   /// Returns the next non-synthetic child of [element] which is a top level
   /// function, method, or local function; throws an [IndexError] if there are
   /// no more.
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 22baf4d..0baf769 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -18,12 +18,15 @@
         SimpleIdentifierImpl;
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
 import 'package:analyzer/src/dart/resolver/method_invocation_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/super_context.dart';
 import 'package:analyzer/src/task/strong/checker.dart';
 
 /**
@@ -88,7 +91,7 @@
   /**
    * The manager for the inheritance mappings.
    */
-  final InheritanceManager2 _inheritance;
+  final InheritanceManager3 _inheritance;
 
   /**
    * The resolver driving this participant.
@@ -115,6 +118,8 @@
 
   final MethodInvocationResolver _methodInvocationResolver;
 
+  final ExtensionMemberResolver _extensionMemberResolver;
+
   /**
    * Initialize a newly created visitor to work for the given [_resolver] to
    * resolve the nodes in a compilation unit.
@@ -122,6 +127,7 @@
   ElementResolver(this._resolver, {this.reportConstEvaluationErrors: true})
       : _inheritance = _resolver.inheritance,
         _definingLibrary = _resolver.definingLibrary,
+        _extensionMemberResolver = ExtensionMemberResolver(_resolver),
         _methodInvocationResolver = new MethodInvocationResolver(_resolver) {
     _dynamicType = _resolver.typeProvider.dynamicType;
     _typeType = _resolver.typeProvider.typeType;
@@ -163,8 +169,10 @@
       operatorType = operatorFromCompoundAssignment(operatorType);
       if (leftHandSide != null) {
         String methodName = operatorType.lexeme;
+        // TODO(brianwilkerson) Change the [methodNameNode] from the left hand
+        //  side to the operator.
         MethodElement staticMethod =
-            _lookUpMethod(leftHandSide, staticType, methodName);
+            _lookUpMethod(leftHandSide, staticType, methodName, leftHandSide);
         node.staticElement = staticMethod;
         if (_shouldReportInvalidMember(staticType, staticMethod)) {
           _recordUndefinedToken(
@@ -261,7 +269,8 @@
             if (memberElement == null) {
               memberElement = element.getNamedConstructor(name.name);
               if (memberElement == null) {
-                memberElement = _lookUpSetter(prefix, element.type, name.name);
+                memberElement =
+                    _lookUpSetter(prefix, element.type, name.name, name);
               }
             }
             if (memberElement == null) {
@@ -392,13 +401,28 @@
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression function = node.function;
-    DartType staticInvokeType = _instantiateGenericMethod(
-        function.staticType, node.typeArguments, node);
+    DartType functionType;
+    if (function is ExtensionOverride) {
+      ExtensionElement element = function.extensionName.staticElement;
+      MethodElement member = element.getMethod('call');
+      if (member != null && member.isStatic) {
+        _resolver.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+            node.argumentList);
+      }
+      node.staticElement = member;
+      functionType = member.type;
+    } else {
+      functionType = function.staticType;
+    }
+
+    DartType staticInvokeType =
+        _instantiateGenericMethod(functionType, node.typeArguments, node);
 
     node.staticInvokeType = staticInvokeType;
 
     List<ParameterElement> parameters =
-        _computeCorrespondingParameters(node.argumentList, staticInvokeType);
+        _computeCorrespondingParameters(node, staticInvokeType);
     if (parameters != null) {
       node.argumentList.correspondingStaticParameters = parameters;
     }
@@ -457,7 +481,7 @@
     if (isInGetterContext && isInSetterContext) {
       // lookup setter
       MethodElement setterStaticMethod =
-          _lookUpMethod(target, staticType, setterMethodName);
+          _lookUpMethod(target, staticType, setterMethodName, target);
       // set setter element
       node.staticElement = setterStaticMethod;
       // generate undefined method warning
@@ -465,7 +489,7 @@
           node, target, setterMethodName, setterStaticMethod, staticType);
       // lookup getter method
       MethodElement getterStaticMethod =
-          _lookUpMethod(target, staticType, getterMethodName);
+          _lookUpMethod(target, staticType, getterMethodName, target);
       // set getter element
       AuxiliaryElements auxiliaryElements =
           new AuxiliaryElements(getterStaticMethod, null);
@@ -476,7 +500,7 @@
     } else if (isInGetterContext) {
       // lookup getter method
       MethodElement staticMethod =
-          _lookUpMethod(target, staticType, getterMethodName);
+          _lookUpMethod(target, staticType, getterMethodName, target);
       // set getter element
       node.staticElement = staticMethod;
       // generate undefined method warning
@@ -485,7 +509,7 @@
     } else if (isInSetterContext) {
       // lookup setter method
       MethodElement staticMethod =
-          _lookUpMethod(target, staticType, setterMethodName);
+          _lookUpMethod(target, staticType, setterMethodName, target);
       // set setter element
       node.staticElement = staticMethod;
       // generate undefined method warning
@@ -543,7 +567,10 @@
     }
     String methodName = _getPostfixOperator(node);
     DartType staticType = _getStaticType(operand);
-    MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName);
+    // TODO(brianwilkerson) Change the [methodNameNode] from the operand to
+    //  the operator.
+    MethodElement staticMethod =
+        _lookUpMethod(operand, staticType, methodName, operand);
     node.staticElement = staticMethod;
     if (_shouldReportInvalidMember(staticType, staticMethod)) {
       if (operand is SuperExpression) {
@@ -648,8 +675,10 @@
       Expression operand = node.operand;
       String methodName = _getPrefixOperator(node);
       DartType staticType = _getStaticType(operand, read: true);
+      // TODO(brianwilkerson) Change the [methodNameNode] from the operand to
+      //  the operator.
       MethodElement staticMethod =
-          _lookUpMethod(operand, staticType, methodName);
+          _lookUpMethod(operand, staticType, methodName, operand);
       node.staticElement = staticMethod;
       if (_shouldReportInvalidMember(staticType, staticMethod)) {
         if (operand is SuperExpression) {
@@ -672,7 +701,58 @@
   @override
   void visitPropertyAccess(PropertyAccess node) {
     Expression target = node.realTarget;
-    if (target is SuperExpression && !_isSuperInValidContext(target)) {
+    if (target is SuperExpression &&
+        SuperContext.of(target) != SuperContext.valid) {
+      return;
+    } else if (target is ExtensionOverride) {
+      if (node.isCascaded) {
+        // TODO(brianwilkerson) Report this error and decide how to recover.
+        throw new UnsupportedError('cascaded extension override');
+      }
+      ExtensionElement element = target.extensionName.staticElement;
+      SimpleIdentifier propertyName = node.propertyName;
+      String memberName = propertyName.name;
+      ExecutableElement member;
+      if (propertyName.inSetterContext()) {
+        member = element.getSetter(memberName);
+        if (member == null) {
+          _resolver.errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER,
+              propertyName,
+              [memberName, element.name]);
+        }
+        if (propertyName.inGetterContext()) {
+          PropertyAccessorElement getter = element.getGetter(memberName);
+          if (getter == null) {
+            _resolver.errorReporter.reportErrorForNode(
+                CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
+                propertyName,
+                [memberName, element.name]);
+          }
+          propertyName.auxiliaryElements = AuxiliaryElements(getter, null);
+        }
+      } else if (propertyName.inGetterContext()) {
+        member = element.getGetter(memberName) ?? element.getMethod(memberName);
+        if (member == null) {
+          _resolver.errorReporter.reportErrorForNode(
+              CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER,
+              propertyName,
+              [memberName, element.name]);
+        }
+      }
+      if (member != null && member.isStatic) {
+        _resolver.errorReporter.reportErrorForNode(
+            CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+            propertyName);
+      }
+
+      member = ExecutableMember.from3(
+        member,
+        element.typeParameters,
+        target.typeArgumentTypes,
+      );
+
+      propertyName.staticElement = member;
       return;
     }
     SimpleIdentifier propertyName = node.propertyName;
@@ -797,7 +877,7 @@
         enclosingClass != null) {
       InterfaceType enclosingType = enclosingClass.type;
       AuxiliaryElements auxiliaryElements = new AuxiliaryElements(
-          _lookUpGetter(null, enclosingType, node.name), null);
+          _lookUpGetter(null, enclosingType, node.name, node), null);
       node.auxiliaryElements = auxiliaryElements;
     }
     //
@@ -867,9 +947,13 @@
 
   @override
   void visitSuperExpression(SuperExpression node) {
-    if (!_isSuperInValidContext(node)) {
+    var context = SuperContext.of(node);
+    if (context == SuperContext.static) {
       _resolver.errorReporter.reportErrorForNode(
           CompileTimeErrorCode.SUPER_IN_INVALID_CONTEXT, node);
+    } else if (context == SuperContext.extension) {
+      _resolver.errorReporter
+          .reportErrorForNode(CompileTimeErrorCode.SUPER_IN_EXTENSION, node);
     }
     super.visitSuperExpression(node);
   }
@@ -930,10 +1014,10 @@
    * arguments, or `null` if no correspondence could be computed.
    */
   List<ParameterElement> _computeCorrespondingParameters(
-      ArgumentList argumentList, DartType type) {
+      FunctionExpressionInvocation invocation, DartType type) {
+    ArgumentList argumentList = invocation.argumentList;
     if (type is InterfaceType) {
-      MethodElement callMethod =
-          type.lookUpMethod(FunctionElement.CALL_METHOD_NAME, _definingLibrary);
+      MethodElement callMethod = invocation.staticElement;
       if (callMethod != null) {
         return _resolveArgumentsToFunction(false, argumentList, callMethod);
       }
@@ -1014,16 +1098,17 @@
   /**
    * Check for a generic method & apply type arguments if any were passed.
    */
-  DartType _instantiateGenericMethod(
-      DartType invokeType, TypeArgumentList typeArguments, AstNode node) {
+  DartType _instantiateGenericMethod(DartType invokeType,
+      TypeArgumentList typeArguments, FunctionExpressionInvocation invocation) {
     DartType parameterizableType;
     List<TypeParameterElement> parameters;
     if (invokeType is FunctionType) {
       parameterizableType = invokeType;
       parameters = invokeType.typeFormals;
     } else if (invokeType is InterfaceType) {
-      MethodElement callMethod = invokeType.lookUpMethod(
-          FunctionElement.CALL_METHOD_NAME, _resolver.definingLibrary);
+      MethodElement callMethod =
+          _lookUpCallMethod(invokeType, invocation.function);
+      invocation.staticElement = callMethod;
       parameterizableType = callMethod?.type;
       parameters = (parameterizableType as FunctionType)?.typeFormals;
     }
@@ -1033,7 +1118,7 @@
       if (arguments != null && arguments.length != parameters.length) {
         _resolver.errorReporter.reportErrorForNode(
             StaticTypeWarningCode.WRONG_NUMBER_OF_TYPE_ARGUMENTS_METHOD,
-            node,
+            invocation,
             [parameterizableType, parameters.length, arguments?.length ?? 0]);
         // Wrong number of type arguments. Ignore them.
         arguments = null;
@@ -1142,82 +1227,115 @@
   }
 
   /**
+   * Return the element representing the `call` method that is defined for the
+   * given [type]. If there are multiple `call` methods defined by extensions,
+   * use the given [node] to report the error.
+   */
+  MethodElement _lookUpCallMethod(InterfaceType type, Expression node) {
+    var callMethod = type.lookUpMethod(
+      FunctionElement.CALL_METHOD_NAME,
+      _resolver.definingLibrary,
+    );
+    if (callMethod != null) {
+      return callMethod;
+    }
+
+    var result = _extensionMemberResolver.findExtension(
+      type,
+      FunctionElement.CALL_METHOD_NAME,
+      node,
+      ElementKind.METHOD,
+    );
+    var instantiatedMember = result.extension?.instantiatedMember;
+    if (instantiatedMember is MethodElement) {
+      return instantiatedMember;
+    }
+
+    return null;
+  }
+
+  /**
    * Look up the getter with the given [getterName] in the given [type]. Return
    * the element representing the getter that was found, or `null` if there is
    * no getter with the given name. The [target] is the target of the
    * invocation, or `null` if there is no target.
    */
   PropertyAccessorElement _lookUpGetter(
-      Expression target, DartType type, String getterName) {
+      Expression target, DartType type, String name, Expression nameNode) {
     type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
-      return type.lookUpInheritedGetter(getterName,
+      var getter = type.lookUpInheritedGetter(name,
           library: _definingLibrary, thisType: target is! SuperExpression);
+      if (getter != null) {
+        return getter;
+      }
+      var result = _extensionMemberResolver.findExtension(
+          type, name, nameNode, ElementKind.GETTER);
+      if (result.isSingle) {
+        return result.extension.instantiatedMember;
+      }
     }
     return null;
   }
 
   /**
-   * Look up the method or getter with the given [memberName] in the given
+   * Look up the method or getter with the given [name] in the given
    * [type]. Return the element representing the method or getter that was
    * found, or `null` if there is no method or getter with the given name.
    */
-  ExecutableElement _lookupGetterOrMethod(DartType type, String memberName) {
+  ExecutableElement _lookupGetterOrMethod(DartType type, String name) {
     type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
-      return type.lookUpInheritedGetterOrMethod(memberName,
+      return type.lookUpInheritedGetterOrMethod(name,
           library: _definingLibrary);
     }
     return null;
   }
 
   /**
-   * Look up the [FunctionType] of a getter or a method with the given [name]
-   * in the given [targetType].
-   */
-  FunctionType _lookUpGetterType(DartType targetType, String name,
-      {bool concrete: false, bool forSuper: false}) {
-    targetType = _resolveTypeParameter(targetType);
-    if (targetType is InterfaceType) {
-      var nameObject = new Name(_definingLibrary.source.uri, name);
-      return _inheritance.getMember(
-        targetType,
-        nameObject,
-        concrete: concrete,
-        forSuper: forSuper,
-      );
-    }
-    return null;
-  }
-
-  /**
-   * Look up the method with the given [methodName] in the given [type]. Return
+   * Look up the method with the given [name] in the given [type]. Return
    * the element representing the method that was found, or `null` if there is
    * no method with the given name. The [target] is the target of the
    * invocation, or `null` if there is no target.
    */
   MethodElement _lookUpMethod(
-      Expression target, DartType type, String methodName) {
+      Expression target, DartType type, String name, Expression nameNode) {
     type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
-      return type.lookUpInheritedMethod(methodName,
+      var method = type.lookUpInheritedMethod(name,
           library: _definingLibrary, thisType: target is! SuperExpression);
+      if (method != null) {
+        return method;
+      }
+      var result = _extensionMemberResolver.findExtension(
+          type, name, nameNode, ElementKind.METHOD);
+      if (result.isSingle) {
+        return result.extension.instantiatedMember;
+      }
     }
     return null;
   }
 
   /**
-   * Look up the setter with the given [setterName] in the given [type]. Return
+   * Look up the setter with the given [name] in the given [type]. Return
    * the element representing the setter that was found, or `null` if there is
    * no setter with the given name. The [target] is the target of the
    * invocation, or `null` if there is no target.
    */
   PropertyAccessorElement _lookUpSetter(
-      Expression target, DartType type, String setterName) {
+      Expression target, DartType type, String name, Expression nameNode) {
     type = _resolveTypeParameter(type);
     if (type is InterfaceType) {
-      return type.lookUpInheritedSetter(setterName,
+      var setter = type.lookUpInheritedSetter(name,
           library: _definingLibrary, thisType: target is! SuperExpression);
+      if (setter != null) {
+        return setter;
+      }
+      var result = _extensionMemberResolver.findExtension(
+          type, name, nameNode, ElementKind.SETTER);
+      if (result.isSingle) {
+        return result.extension.instantiatedMember;
+      }
     }
     return null;
   }
@@ -1447,13 +1565,40 @@
   void _resolveBinaryExpression(BinaryExpression node, String methodName) {
     Expression leftOperand = node.leftOperand;
     if (leftOperand != null) {
+      if (leftOperand is ExtensionOverride) {
+        ExtensionElement element = leftOperand.extensionName.staticElement;
+        MethodElement member = element.getMethod(methodName);
+        if (member == null) {
+          _resolver.errorReporter.reportErrorForToken(
+              CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD,
+              node.operator,
+              [methodName, element.name]);
+        }
+        node.staticElement = member;
+        return;
+      }
       DartType leftType = _getStaticType(leftOperand);
       var isSuper = leftOperand is SuperExpression;
-      var invokeType = _lookUpGetterType(leftType, methodName,
-          concrete: isSuper, forSuper: isSuper);
-      var invokeElement = invokeType?.element;
+
+      ExecutableElement invokeElement;
+      if (leftType is InterfaceType) {
+        invokeElement = _inheritance.getMember(
+          leftType,
+          new Name(_definingLibrary.source.uri, methodName),
+          forSuper: isSuper,
+        );
+      }
+
+      if (invokeElement == null && leftType is InterfaceType) {
+        var result = _extensionMemberResolver.findExtension(
+            leftType, methodName, node, ElementKind.METHOD);
+        if (result.isSingle) {
+          invokeElement = result.extension.instantiatedMember;
+        }
+      }
+
       node.staticElement = invokeElement;
-      node.staticInvokeType = invokeType;
+      node.staticInvokeType = invokeElement?.type;
       if (_shouldReportInvalidMember(leftType, invokeElement)) {
         if (isSuper) {
           _recordUndefinedToken(
@@ -1550,13 +1695,16 @@
       Expression target, DartType targetType, SimpleIdentifier propertyName) {
     ExecutableElement memberElement = null;
     if (propertyName.inSetterContext()) {
-      memberElement = _lookUpSetter(target, targetType, propertyName.name);
+      memberElement =
+          _lookUpSetter(target, targetType, propertyName.name, propertyName);
     }
     if (memberElement == null) {
-      memberElement = _lookUpGetter(target, targetType, propertyName.name);
+      memberElement =
+          _lookUpGetter(target, targetType, propertyName.name, propertyName);
     }
     if (memberElement == null) {
-      memberElement = _lookUpMethod(target, targetType, propertyName.name);
+      memberElement =
+          _lookUpMethod(target, targetType, propertyName.name, propertyName);
     }
     return memberElement;
   }
@@ -1564,50 +1712,67 @@
   void _resolvePropertyAccess(
       Expression target, SimpleIdentifier propertyName, bool isCascaded) {
     DartType staticType = _getStaticType(target);
-    Element staticElement = null;
+    Element staticElement;
+    if (target is Identifier && target.staticElement is ExtensionElement) {
+      ExtensionElement extension = target.staticElement;
+      String memberName = propertyName.name;
+      if (propertyName.inSetterContext()) {
+        staticElement = extension.getSetter(memberName);
+      }
+      staticElement ??= extension.getGetter(memberName);
+      staticElement ??= extension.getMethod(memberName);
+      if (staticElement is ExecutableElement && !staticElement.isStatic) {
+        _resolver.errorReporter.reportErrorForNode(
+            StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER,
+            propertyName,
+            [memberName]);
+      }
+    }
     //
     // If this property access is of the form 'C.m' where 'C' is a class,
     // then we don't call resolveProperty(...) which walks up the class
     // hierarchy, instead we just look for the member in the type only.  This
     // does not apply to conditional property accesses (i.e. 'C?.m').
     //
-    ClassElement typeReference = getTypeReference(target);
-    if (typeReference != null) {
-      if (isCascaded) {
-        typeReference = _typeType.element;
-      }
-      staticElement = _resolveElement(typeReference, propertyName);
-    } else {
-      if (target is SuperExpression) {
-        if (staticType is InterfaceTypeImpl) {
-          staticElement = staticType.lookUpInheritedMember(
-              propertyName.name, _definingLibrary,
-              setter: propertyName.inSetterContext(),
-              concrete: true,
-              forSuperInvocation: true);
-          // We were not able to find the concrete dispatch target.
-          // But we would like to give the user at least some resolution.
-          // So, we retry without the "concrete" requirement.
-          if (staticElement == null) {
+    if (staticElement == null) {
+      ClassElement typeReference = getTypeReference(target);
+      if (typeReference != null) {
+        if (isCascaded) {
+          typeReference = _typeType.element;
+        }
+        staticElement = _resolveElement(typeReference, propertyName);
+      } else {
+        if (target is SuperExpression) {
+          if (staticType is InterfaceTypeImpl) {
             staticElement = staticType.lookUpInheritedMember(
                 propertyName.name, _definingLibrary,
-                setter: propertyName.inSetterContext(), concrete: false);
-            if (staticElement != null) {
-              ClassElementImpl receiverSuperClass =
-                  AbstractClassElementImpl.getImpl(
-                staticType.element.supertype.element,
-              );
-              if (!receiverSuperClass.hasNoSuchMethod) {
-                _resolver.errorReporter.reportErrorForNode(
-                    CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
-                    propertyName,
-                    [staticElement.kind.displayName, propertyName.name]);
+                setter: propertyName.inSetterContext(),
+                concrete: true,
+                forSuperInvocation: true);
+            // We were not able to find the concrete dispatch target.
+            // But we would like to give the user at least some resolution.
+            // So, we retry without the "concrete" requirement.
+            if (staticElement == null) {
+              staticElement = staticType.lookUpInheritedMember(
+                  propertyName.name, _definingLibrary,
+                  setter: propertyName.inSetterContext(), concrete: false);
+              if (staticElement != null) {
+                ClassElementImpl receiverSuperClass =
+                    AbstractClassElementImpl.getImpl(
+                  staticType.element.supertype.element,
+                );
+                if (!receiverSuperClass.hasNoSuchMethod) {
+                  _resolver.errorReporter.reportErrorForNode(
+                      CompileTimeErrorCode.ABSTRACT_SUPER_MEMBER_REFERENCE,
+                      propertyName,
+                      [staticElement.kind.displayName, propertyName.name]);
+                }
               }
             }
           }
+        } else {
+          staticElement = _resolveProperty(target, staticType, propertyName);
         }
-      } else {
-        staticElement = _resolveProperty(target, staticType, propertyName);
       }
     }
     // May be part of annotation, record property element only if exists.
@@ -1620,19 +1785,17 @@
     }
     propertyName.staticElement = staticElement;
     if (_shouldReportInvalidMember(staticType, staticElement)) {
-      Element staticOrPropagatedEnclosingElt = staticType.element;
-      bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt);
+      Element enclosingElement = staticType.element;
+      bool isStaticProperty = _isStatic(enclosingElement);
       // Special getter cases.
       if (propertyName.inGetterContext()) {
-        if (!isStaticProperty &&
-            staticOrPropagatedEnclosingElt is ClassElement) {
-          InterfaceType targetType = staticOrPropagatedEnclosingElt.type;
+        if (!isStaticProperty && enclosingElement is ClassElement) {
+          InterfaceType targetType = enclosingElement.type;
           if (targetType != null &&
               targetType.isDartCoreFunction &&
               propertyName.name == FunctionElement.CALL_METHOD_NAME) {
             return;
-          } else if (staticOrPropagatedEnclosingElt.isEnum &&
-              propertyName.name == "_name") {
+          } else if (enclosingElement.isEnum && propertyName.name == "_name") {
             _resolver.errorReporter.reportErrorForNode(
                 CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD,
                 propertyName,
@@ -1641,8 +1804,7 @@
           }
         }
       }
-      Element declaringElement =
-          staticType.isVoid ? null : staticOrPropagatedEnclosingElt;
+      Element declaringElement = staticType.isVoid ? null : enclosingElement;
       if (propertyName.inSetterContext()) {
         ErrorCode errorCode;
         var arguments = [propertyName.name, staticType.displayName];
@@ -1702,7 +1864,8 @@
           //
           ClassElement enclosingClass = _resolver.enclosingClass;
           if (enclosingClass != null) {
-            setter = _lookUpSetter(null, enclosingClass.type, identifier.name);
+            setter = _lookUpSetter(
+                null, enclosingClass.type, identifier.name, identifier);
           }
         }
         if (setter != null) {
@@ -1716,19 +1879,41 @@
           new SyntheticIdentifier('${identifier.name}=', identifier);
       element = _resolver.nameScope.lookup(setterId, _definingLibrary);
     }
-    ClassElement enclosingClass = _resolver.enclosingClass;
-    if (element == null && enclosingClass != null) {
-      InterfaceType enclosingType = enclosingClass.type;
-      if (element == null &&
-          (identifier.inSetterContext() ||
-              identifier.parent is CommentReference)) {
-        element = _lookUpSetter(null, enclosingType, identifier.name);
+    if (element == null) {
+      InterfaceType enclosingType;
+      ClassElement 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 = _resolver.typeProvider.functionType;
+        } else {
+          return null;
+        }
+      } else {
+        enclosingType = enclosingClass.type;
       }
-      if (element == null && identifier.inGetterContext()) {
-        element = _lookUpGetter(null, enclosingType, identifier.name);
-      }
-      if (element == null) {
-        element = _lookUpMethod(null, enclosingType, identifier.name);
+      if (enclosingType != null) {
+        if (element == null &&
+            (identifier.inSetterContext() ||
+                identifier.parent is CommentReference)) {
+          element =
+              _lookUpSetter(null, enclosingType, identifier.name, identifier);
+        }
+        if (element == null && identifier.inGetterContext()) {
+          element =
+              _lookUpGetter(null, enclosingType, identifier.name, identifier);
+        }
+        if (element == null) {
+          element =
+              _lookUpMethod(null, enclosingType, identifier.name, identifier);
+        }
       }
     }
     return element;
@@ -1809,24 +1994,6 @@
   }
 
   /**
-   * Return `true` if the given 'super' [expression] is used in a valid context.
-   */
-  static bool _isSuperInValidContext(SuperExpression expression) {
-    for (AstNode node = expression; node != null; node = node.parent) {
-      if (node is CompilationUnit) {
-        return false;
-      } else if (node is ConstructorDeclaration) {
-        return node.factoryKeyword == null;
-      } else if (node is ConstructorFieldInitializer) {
-        return false;
-      } else if (node is MethodDeclaration) {
-        return !node.isStatic;
-      }
-    }
-    return false;
-  }
-
-  /**
    * Resolve each of the annotations in the given list of [annotations].
    */
   static void _resolveAnnotations(NodeList<Annotation> annotations) {
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index 8f4c1b3..fd4540d 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -2260,10 +2260,10 @@
   }
 
   /// Return `true` if any sources were added.
-  bool get wereSourcesAdded => _changeSet.addedSources.length > 0;
+  bool get wereSourcesAdded => _changeSet.addedSources.isNotEmpty;
 
   /// Return `true` if any sources were removed or deleted.
   bool get wereSourcesRemoved =>
-      _changeSet.removedSources.length > 0 ||
-      _changeSet.removedContainers.length > 0;
+      _changeSet.removedSources.isNotEmpty ||
+      _changeSet.removedContainers.isNotEmpty;
 }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index 2603f21..c4fb17b 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -17,24 +17,21 @@
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
 import 'package:analyzer/src/dart/resolver/variance.dart';
 import 'package:analyzer/src/diagnostic/diagnostic_factory.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/error/literal_element_verifier.dart';
-import 'package:analyzer/src/error/pending_error.dart';
+import 'package:analyzer/src/error/required_parameters_verifier.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/parser.dart' show ParserErrorCode;
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/sdk.dart' show DartSdk, SdkLibrary;
-import 'package:analyzer/src/generated/source.dart';
 import 'package:meta/meta.dart';
 
 /**
@@ -90,7 +87,7 @@
   /**
    * The manager for the inheritance mappings.
    */
-  final InheritanceManager2 _inheritanceManager;
+  final InheritanceManager3 _inheritanceManager;
 
   /**
    * A flag indicating whether the visitor is currently within a constructor
@@ -214,6 +211,12 @@
   ClassElement _enclosingEnum;
 
   /**
+   * The element of the extension being visited, or `null` if we are not
+   * in the scope of an extension.
+   */
+  ExtensionElement _enclosingExtension;
+
+  /**
    * The method or function that we are currently visiting, or `null` if we are
    * not inside a method or function.
    */
@@ -294,22 +297,34 @@
   /// fixed.
   final bool disableConflictingGenericsCheck;
 
-  /// If running with [_isNonNullable], the result of the flow analysis of the
-  /// unit being verified by this visitor.
-  final FlowAnalysisResult flowAnalysisResult;
-
   /// The features enabled in the unit currently being checked for errors.
   FeatureSet _featureSet;
 
+  final RequiredParametersVerifier _requiredParametersVerifier;
+
   /**
    * Initialize a newly created error verifier.
+   *
+   * [inheritanceManager] should be an instance of either [InheritanceManager2]
+   * or [InheritanceManager3].  If an [InheritanceManager2] is supplied, it
+   * will be converted into an [InheritanceManager3] internally.  The ability
+   * to pass in [InheritanceManager2] exists for backward compatibility; in a
+   * future major version of the analyzer, an [InheritanceManager3] will
+   * be required.
    */
-  ErrorVerifier(ErrorReporter errorReporter, this._currentLibrary,
-      this._typeProvider, this._inheritanceManager, bool enableSuperMixins,
-      {this.disableConflictingGenericsCheck: false, this.flowAnalysisResult})
+  ErrorVerifier(
+      ErrorReporter errorReporter,
+      this._currentLibrary,
+      this._typeProvider,
+      InheritanceManagerBase inheritanceManager,
+      bool enableSuperMixins,
+      {this.disableConflictingGenericsCheck: false})
       : _errorReporter = errorReporter,
+        _inheritanceManager = inheritanceManager.asInheritanceManager3,
         _uninstantiatedBoundChecker =
-            new _UninstantiatedBoundChecker(errorReporter) {
+            new _UninstantiatedBoundChecker(errorReporter),
+        _requiredParametersVerifier =
+            RequiredParametersVerifier(errorReporter) {
     this._isInSystemLibrary = _currentLibrary.source.isInSystemLibrary;
     this._hasExtUri = _currentLibrary.hasExtUri;
     _isEnclosingConstructorConst = false;
@@ -363,7 +378,9 @@
 
   @override
   void visitArgumentList(ArgumentList node) {
-    _checkForArgumentTypesNotAssignableInList(node);
+    if (node.parent is! ExtensionOverride) {
+      _checkForArgumentTypesNotAssignableInList(node);
+    }
     super.visitArgumentList(node);
   }
 
@@ -707,6 +724,13 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    _enclosingExtension = node.declaredElement;
+    super.visitExtensionDeclaration(node);
+    _enclosingExtension = null;
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     _isInStaticVariableDeclaration = node.isStatic;
     _isInInstanceVariableDeclaration = !_isInStaticVariableDeclaration;
@@ -856,9 +880,17 @@
   @override
   void visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
     Expression functionExpression = node.function;
+    if (functionExpression is ExtensionOverride) {
+      // TODO(brianwilkerson) Update `_checkTypeArguments` to handle extension
+      //  overrides.
+//      _checkTypeArguments(node);
+      return super.visitFunctionExpressionInvocation(node);
+    }
     DartType expressionType = functionExpression.staticType;
     if (!_checkForNullableDereference(functionExpression) &&
         !_checkForUseOfVoidResult(functionExpression) &&
+        !_checkForUseOfNever(functionExpression) &&
+        node.staticElement == null &&
         !_isFunctionType(expressionType)) {
       _errorReporter.reportErrorForNode(
           StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION_EXPRESSION,
@@ -867,9 +899,8 @@
       _checkTypeArguments(node);
     }
     _checkForImplicitDynamicInvoke(node);
-    _checkForNullableDereference(node.function);
-    _checkForMissingRequiredParam(
-        node.staticInvokeType, node.argumentList, node);
+    _checkForNullableDereference(functionExpression);
+    _requiredParametersVerifier.visitFunctionExpressionInvocation(node);
     super.visitFunctionExpressionInvocation(node);
   }
 
@@ -977,8 +1008,7 @@
         _checkForConstOrNewWithAbstractClass(node, typeName, type);
         _checkForConstOrNewWithEnum(node, typeName, type);
         _checkForConstOrNewWithMixin(node, typeName, type);
-        _checkForMissingRequiredParam(
-            node.staticElement?.type, node.argumentList, node.constructorName);
+        _requiredParametersVerifier.visitInstanceCreationExpression(node);
         if (_isInConstInstanceCreation) {
           _checkForConstWithNonConst(node);
           _checkForConstWithUndefinedConstructor(
@@ -1029,7 +1059,6 @@
       _checkTypeArgumentCount(typeArguments, 1,
           StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS);
     }
-    _checkForInferenceFailureOnCollectionLiteral(node);
     _checkForImplicitDynamicTypedLiteral(node);
     _checkForListElementTypeNotAssignable(node);
 
@@ -1053,6 +1082,7 @@
         _checkForWrongNumberOfParametersForOperator(node);
         _checkForNonVoidReturnTypeForOperator(node);
       }
+      _checkForExtensionDeclaresMemberOfObject(node);
       _checkForTypeAnnotationDeferredClass(returnType);
       _checkForIllegalReturnType(returnType);
       _checkForImplicitDynamicReturn(node, node.declaredElement);
@@ -1080,8 +1110,7 @@
     _checkTypeArguments(node);
     _checkForImplicitDynamicInvoke(node);
     _checkForNullableDereference(methodName);
-    _checkForMissingRequiredParam(
-        node.staticInvokeType, node.argumentList, node.methodName);
+    _requiredParametersVerifier.visitMethodInvocation(node);
     if (node.operator?.type != TokenType.QUESTION_PERIOD &&
         methodName.name != 'toString' &&
         methodName.name != 'noSuchMethod') {
@@ -1142,7 +1171,10 @@
 
   @override
   void visitPostfixExpression(PostfixExpression node) {
-    if (node.operator.type != TokenType.BANG) {
+    if (node.operator.type == TokenType.BANG) {
+      _checkForUseOfVoidResult(node);
+      _checkForUnnecessaryNullAware(node.operand, node.operator);
+    } else {
       _checkForAssignmentToFinal(node.operand);
       _checkForIntNotAssignable(node.operand);
       _checkForNullableDereference(node.operand);
@@ -1202,11 +1234,7 @@
   @override
   void visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    DartType type =
-        resolutionMap.staticElementForConstructorReference(node)?.type;
-    if (type != null) {
-      _checkForMissingRequiredParam(type, node.argumentList, node);
-    }
+    _requiredParametersVerifier.visitRedirectingConstructorInvocation(node);
     _isInConstructorInitializer = true;
     try {
       super.visitRedirectingConstructorInvocation(node);
@@ -1247,7 +1275,6 @@
         _checkTypeArgumentCount(typeArguments, 2,
             StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS);
       }
-      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForMapTypeNotAssignable(node);
       _checkForNonConstMapAsExpressionStatement3(node);
@@ -1263,7 +1290,6 @@
         _checkTypeArgumentCount(typeArguments, 1,
             StaticTypeWarningCode.EXPECTED_ONE_SET_TYPE_ARGUMENTS);
       }
-      _checkForInferenceFailureOnCollectionLiteral(node);
       _checkForImplicitDynamicTypedLiteral(node);
       _checkForSetElementTypeNotAssignable3(node);
     }
@@ -1303,17 +1329,15 @@
   void visitSpreadElement(SpreadElement node) {
     if (node.spreadOperator.type != TokenType.PERIOD_PERIOD_PERIOD_QUESTION) {
       _checkForNullableDereference(node.expression);
+    } else {
+      _checkForUnnecessaryNullAware(node.expression, node.spreadOperator);
     }
     super.visitSpreadElement(node);
   }
 
   @override
   void visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    DartType type =
-        resolutionMap.staticElementForConstructorReference(node)?.type;
-    if (type != null) {
-      _checkForMissingRequiredParam(type, node.argumentList, node);
-    }
+    _requiredParametersVerifier.visitSuperConstructorInvocation(node);
     _isInConstructorInitializer = true;
     try {
       super.visitSuperConstructorInvocation(node);
@@ -1359,7 +1383,7 @@
   @override
   void visitTopLevelVariableDeclaration(TopLevelVariableDeclaration node) {
     _checkForFinalNotInitialized(node.variables);
-    _checkForNotInitializedNonNullableTopLevelVariable(node.variables);
+    _checkForNotInitializedNonNullableVariable(node.variables);
     super.visitTopLevelVariableDeclaration(node);
   }
 
@@ -1752,7 +1776,7 @@
 
     String name = identifier.name;
     if (element is MethodElement && element.isOperator && name == '-') {
-      if (element.parameters.length == 0) {
+      if (element.parameters.isEmpty) {
         name = 'unary-';
       }
     }
@@ -1984,15 +2008,22 @@
         }
       }
     }
-    // Prepare a list of not initialized fields.
+
+    // Prepare lists of not initialized fields.
     List<FieldElement> notInitFinalFields = <FieldElement>[];
-    fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
-      if (state == INIT_STATE.NOT_INIT) {
-        if (fieldElement.isFinal && !fieldElement.isLate) {
-          notInitFinalFields.add(fieldElement);
-        }
+    List<FieldElement> notInitNonNullableFields = <FieldElement>[];
+    fieldElementsMap.forEach((FieldElement field, INIT_STATE state) {
+      if (state != INIT_STATE.NOT_INIT) return;
+      if (field.isLate) return;
+
+      if (field.isFinal) {
+        notInitFinalFields.add(field);
+      } else if (_isNonNullable &&
+          _typeSystem.isPotentiallyNonNullable(field.type)) {
+        notInitNonNullableFields.add(field);
       }
     });
+
     // Visit all of the states in the map to ensure that none were never
     // initialized.
     fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
@@ -2026,6 +2057,17 @@
             [names[0], names[1], names.length - 2]);
       }
     }
+
+    if (notInitNonNullableFields.isNotEmpty) {
+      var names = notInitNonNullableFields.map((f) => f.name).toList()..sort();
+      for (var name in names) {
+        _errorReporter.reportErrorForNode(
+            CompileTimeErrorCode
+                .NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR,
+            constructor.returnType,
+            [name]);
+      }
+    }
   }
 
   /**
@@ -2581,12 +2623,10 @@
       String name = method.name;
 
       // find inherited property accessor
-      ExecutableElement inherited = _inheritanceManager
-          .getInherited(enclosingType, new Name(libraryUri, name))
-          ?.element;
-      inherited ??= _inheritanceManager
-          .getInherited(enclosingType, new Name(libraryUri, '$name='))
-          ?.element;
+      ExecutableElement inherited = _inheritanceManager.getInherited(
+          enclosingType, new Name(libraryUri, name));
+      inherited ??= _inheritanceManager.getInherited(
+          enclosingType, new Name(libraryUri, '$name='));
 
       if (method.isStatic && inherited != null) {
         _errorReporter.reportErrorForElement(
@@ -2610,12 +2650,10 @@
       String name = accessor.displayName;
 
       // find inherited method or property accessor
-      ExecutableElement inherited = _inheritanceManager
-          .getInherited(enclosingType, new Name(libraryUri, name))
-          ?.element;
-      inherited ??= _inheritanceManager
-          .getInherited(enclosingType, new Name(libraryUri, '$name='))
-          ?.element;
+      ExecutableElement inherited = _inheritanceManager.getInherited(
+          enclosingType, new Name(libraryUri, name));
+      inherited ??= _inheritanceManager.getInherited(
+          enclosingType, new Name(libraryUri, '$name='));
 
       if (accessor.isStatic && inherited != null) {
         _errorReporter.reportErrorForElement(
@@ -2647,7 +2685,7 @@
         var oldType = interfaces[element];
         if (oldType == null) {
           interfaces[element] = type;
-        } else if (!oldType.isEquivalentTo(type)) {
+        } else if (type != oldType) {
           _errorReporter.reportErrorForNode(
               CompileTimeErrorCode.CONFLICTING_GENERIC_INTERFACES,
               node,
@@ -3114,7 +3152,7 @@
     LibraryElement prevLibrary = _nameToExportElement[name];
     if (prevLibrary != null) {
       if (prevLibrary != exportedLibrary) {
-        if (!name.isEmpty) {
+        if (name.isNotEmpty) {
           _errorReporter.reportErrorForNode(
               StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED, directive, [
             prevLibrary.definingCompilationUnit.source.uri.toString(),
@@ -3238,6 +3276,22 @@
     return _DISALLOWED_TYPES_TO_EXTEND_OR_IMPLEMENT.contains(typeName.type);
   }
 
+  void _checkForExtensionDeclaresMemberOfObject(MethodDeclaration node) {
+    if (_enclosingExtension == null) return;
+
+    var name = node.name.name;
+    if (name == '==' ||
+        name == 'hashCode' ||
+        name == 'toString' ||
+        name == 'runtimeType' ||
+        name == 'noSuchMethod') {
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT,
+        node.name,
+      );
+    }
+  }
+
   /**
    * Verify that the given constructor field [initializer] has compatible field
    * and initializer expression types. The [fieldElement] is the static element
@@ -3390,7 +3444,9 @@
     }
     for (ClassMember classMember in members) {
       if (classMember is FieldDeclaration) {
-        _checkForFinalNotInitialized(classMember.fields);
+        var fields = classMember.fields;
+        _checkForFinalNotInitialized(fields);
+        _checkForNotInitializedNonNullableInstanceFields(classMember);
       }
     }
   }
@@ -3697,7 +3753,7 @@
     // check if there is another imported library with the same name
     LibraryElement prevLibrary = _nameToImportElement[name];
     if (prevLibrary != null) {
-      if (prevLibrary != nodeLibrary && !name.isEmpty) {
+      if (prevLibrary != nodeLibrary && name.isNotEmpty) {
         _errorReporter.reportErrorForNode(
             StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, directive, [
           prevLibrary.definingCompilationUnit.source.uri,
@@ -3743,25 +3799,6 @@
         [directive.uri.stringValue]);
   }
 
-  /// Checks a collection literal for an inference failure, and reports the
-  /// appropriate error if [AnalysisOptionsImpl.strictInference] is set.
-  ///
-  /// This checks if [node] does not have explicit or inferred type arguments.
-  /// When that happens, it reports a
-  /// HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL error.
-  void _checkForInferenceFailureOnCollectionLiteral(TypedLiteral node) {
-    if (!_options.strictInference || node == null) return;
-    if (node.typeArguments != null) {
-      // Type has explicit type arguments.
-      return;
-    }
-    var type = node.staticType;
-    if (_isMissingTypeArguments(node, type, type.element, node)) {
-      _errorReporter.reportErrorForNode(
-          HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL, node, [type.name]);
-    }
-  }
-
   /// Checks a type on an instance creation expression for an inference
   /// failure, and reports the appropriate error if
   /// [AnalysisOptionsImpl.strictInference] is set.
@@ -4186,24 +4223,6 @@
     }
   }
 
-  void _checkForMissingRequiredParam(
-      DartType type, ArgumentList argumentList, AstNode node) {
-    if (type is FunctionType) {
-      for (ParameterElement parameter in type.parameters) {
-        if (parameter.isRequiredNamed) {
-          String parameterName = parameter.name;
-          if (!RequiredConstantsComputer._containsNamedExpression(
-              argumentList, parameterName)) {
-            _errorReporter.reportErrorForNode(
-                CompileTimeErrorCode.MISSING_REQUIRED_ARGUMENT,
-                node,
-                [parameterName]);
-          }
-        }
-      }
-    }
-  }
-
   /**
    * Verify that the given function [body] does not contain return statements
    * that both have and do not have return values.
@@ -4341,11 +4360,10 @@
     for (var name in mixinElementImpl.superInvokedNames) {
       var nameObject = new Name(mixinLibraryUri, name);
 
-      var superMemberType = _inheritanceManager.getMember(
-          enclosingType, nameObject,
+      var superMember = _inheritanceManager.getMember(enclosingType, nameObject,
           forMixinIndex: mixinIndex, concrete: true, forSuper: true);
 
-      if (superMemberType == null) {
+      if (superMember == null) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode
                 .MIXIN_APPLICATION_NO_CONCRETE_SUPER_INVOKED_MEMBER,
@@ -4354,16 +4372,17 @@
         return true;
       }
 
-      FunctionType mixinMemberType =
+      ExecutableElement mixinMember =
           _inheritanceManager.getMember(mixinType, nameObject, forSuper: true);
 
-      if (mixinMemberType != null &&
-          !_typeSystem.isOverrideSubtypeOf(superMemberType, mixinMemberType)) {
+      if (mixinMember != null &&
+          !_typeSystem.isOverrideSubtypeOf(
+              superMember.type, mixinMember.type)) {
         _errorReporter.reportErrorForNode(
             CompileTimeErrorCode
                 .MIXIN_APPLICATION_CONCRETE_SUPER_INVOKED_MEMBER_TYPE,
             mixinName.name,
-            [name, mixinMemberType.displayName, superMemberType.displayName]);
+            [name, mixinMember.type.displayName, superMember.type.displayName]);
         return true;
       }
     }
@@ -4679,36 +4698,44 @@
     }
   }
 
-  void _checkForNotInitializedNonNullableStaticField(FieldDeclaration node) {
+  void _checkForNotInitializedNonNullableInstanceFields(
+    FieldDeclaration fieldDeclaration,
+  ) {
     if (!_isNonNullable) return;
 
-    if (!node.isStatic) return;
+    if (fieldDeclaration.isStatic) return;
+    var fields = fieldDeclaration.fields;
 
-    var fields = node.fields;
+    if (fields.isLate) return;
+    if (fields.isFinal) return;
 
-    // Const and final checked separately.
-    if (fields.isConst || fields.isFinal) return;
+    for (var field in fields.variables) {
+      if (field.initializer != null) continue;
 
-    if (fields.type == null) return;
-    var type = fields.type.type;
+      var type = field.declaredElement.type;
+      if (!_typeSystem.isPotentiallyNonNullable(type)) continue;
 
-    if (!_typeSystem.isPotentiallyNonNullable(type)) return;
-
-    for (var variable in fields.variables) {
-      if (variable.initializer == null) {
-        _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD,
-          variable.name,
-          [variable.name.name],
-        );
-      }
+      _errorReporter.reportErrorForNode(
+        CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
+        field,
+        [field.name.name],
+      );
     }
   }
 
-  void _checkForNotInitializedNonNullableTopLevelVariable(
+  void _checkForNotInitializedNonNullableStaticField(FieldDeclaration node) {
+    if (!node.isStatic) {
+      return;
+    }
+    _checkForNotInitializedNonNullableVariable(node.fields);
+  }
+
+  void _checkForNotInitializedNonNullableVariable(
     VariableDeclarationList node,
   ) {
-    if (!_isNonNullable) return;
+    if (!_isNonNullable) {
+      return;
+    }
 
     // Const and final checked separately.
     if (node.isConst || node.isFinal) {
@@ -4727,7 +4754,7 @@
     for (var variable in node.variables) {
       if (variable.initializer == null) {
         _errorReporter.reportErrorForNode(
-          CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE,
+          CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE,
           variable.name,
           [variable.name.name],
         );
@@ -4749,7 +4776,9 @@
       return false;
     }
 
-    StaticWarningCode code = StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE;
+    StaticWarningCode code = expression.staticType == _typeProvider.nullType
+        ? StaticWarningCode.INVALID_USE_OF_NULL_VALUE
+        : StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE;
 
     if (expression is MethodInvocation) {
       SimpleIdentifier methodName = expression.methodName;
@@ -5428,7 +5457,7 @@
       int loopThroughIndex =
           math.min(typeArguments.length, parameterElements.length);
       bool shouldSubstitute =
-          arguments.length != 0 && arguments.length == parameterTypes.length;
+          arguments.isNotEmpty && arguments.length == parameterTypes.length;
       for (int i = 0; i < loopThroughIndex; i++) {
         DartType argType = typeArguments[i];
         TypeAnnotation argumentNode =
@@ -5495,7 +5524,7 @@
       return;
     }
     // OK, type parameter is not supertype of its bound
-    if (!bound.isMoreSpecificThan(element.type)) {
+    if (!_typeSystem.isSubtypeOf(bound, element.type)) {
       return;
     }
 
@@ -5570,15 +5599,24 @@
   }
 
   void _checkForUnnecessaryNullAware(Expression target, Token operator) {
-    if (operator.type != TokenType.QUESTION_PERIOD || !_isNonNullable) {
+    if (!_isNonNullable) {
+      return;
+    }
+
+    ErrorCode errorCode;
+    if (operator.type == TokenType.QUESTION_PERIOD) {
+      errorCode = StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL;
+    } else if (operator.type == TokenType.PERIOD_PERIOD_PERIOD_QUESTION) {
+      errorCode = StaticWarningCode.UNNECESSARY_NULL_AWARE_SPREAD;
+    } else if (operator.type == TokenType.BANG) {
+      errorCode = StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION;
+    } else {
       return;
     }
 
     if (target.staticType != null &&
-        (target.staticType as TypeImpl).nullabilitySuffix ==
-            NullabilitySuffix.none) {
-      _errorReporter.reportErrorForToken(
-          HintCode.UNNECESSARY_NULL_AWARE_CALL, operator, []);
+        _typeSystem.isNonNullable(target.staticType)) {
+      _errorReporter.reportErrorForToken(errorCode, operator, []);
     }
   }
 
@@ -5614,6 +5652,27 @@
   }
 
   /**
+   * While in general Never is a sort of placehold type that should be usable
+   * anywhere, we explicitly bar it from some dubious syntactic locations such
+   * as calling a method on Never, which in practice would look something like
+   * `(throw x).toString()` which is clearly something between a mistake and
+   * dead code.
+   *
+   * See [StaticWarningCode.INVALID_USE_OF_NEVER_VALUE].
+   */
+  bool _checkForUseOfNever(Expression expression) {
+    if (expression == null ||
+        !identical(expression.staticType, BottomTypeImpl.instance)) {
+      return false;
+    }
+
+    _errorReporter.reportErrorForNode(
+        StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, expression);
+
+    return true;
+  }
+
+  /**
    * Check for situations where the result of a method or function is used, when
    * it returns 'void'. Or, in rare cases, when other types of expressions are
    * void, such as identifiers.
@@ -6025,17 +6084,32 @@
 
   void _checkUseOfCovariantInParameters(FormalParameterList node) {
     AstNode parent = node.parent;
-    if (parent is MethodDeclaration && !parent.isStatic) {
+    if (_enclosingClass != null &&
+        parent is MethodDeclaration &&
+        !parent.isStatic) {
       return;
     }
+
     NodeList<FormalParameter> parameters = node.parameters;
     int length = parameters.length;
     for (int i = 0; i < length; i++) {
       FormalParameter parameter = parameters[i];
+      if (parameter is DefaultFormalParameter) {
+        parameter = (parameter as DefaultFormalParameter).parameter;
+      }
       Token keyword = parameter.covariantKeyword;
       if (keyword != null) {
-        _errorReporter.reportErrorForToken(
-            CompileTimeErrorCode.INVALID_USE_OF_COVARIANT, keyword);
+        if (_enclosingExtension != null) {
+          _errorReporter.reportErrorForToken(
+            CompileTimeErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION,
+            keyword,
+          );
+        } else {
+          _errorReporter.reportErrorForToken(
+            CompileTimeErrorCode.INVALID_USE_OF_COVARIANT,
+            keyword,
+          );
+        }
       }
     }
   }
@@ -6150,6 +6224,9 @@
   /// [1] https://pub.dartlang.org/documentation/meta/latest/meta/mustCallSuper-constant.html
   MethodElement _findOverriddenMemberThatMustCallSuper(MethodDeclaration node) {
     Element member = node.declaredElement;
+    if (member.enclosingElement is! ClassElement) {
+      return null;
+    }
     ClassElement classElement = member.enclosingElement;
     String name = member.name;
 
@@ -6287,7 +6364,7 @@
     // Get the parameters for MethodDeclaration or FunctionDeclaration
     List<ParameterElement> setterParameters = setter.parameters;
     // If there are no setter parameters, return no type.
-    if (setterParameters.length == 0) {
+    if (setterParameters.isEmpty) {
       return null;
     }
     return setterParameters[0].type;
@@ -6300,8 +6377,10 @@
 
     Queue<ClassElement> superclasses =
         Queue.of(classElement.mixins.map((i) => i.element))
-          ..addAll(classElement.superclassConstraints.map((i) => i.element))
-          ..add(classElement.supertype?.element);
+          ..addAll(classElement.superclassConstraints.map((i) => i.element));
+    if (classElement.supertype != null) {
+      superclasses.add(classElement.supertype.element);
+    }
     return superclasses.any(
         (parent) => parent.lookUpConcreteMethod(name, parent.library) != null);
   }
@@ -6431,6 +6510,13 @@
         return false;
       } else if (node is MethodDeclaration) {
         return !node.isStatic;
+      } else if (node is FieldDeclaration) {
+        if (node.fields.isLate &&
+            (node.parent is ClassDeclaration ||
+                node.parent is MixinDeclaration)) {
+          return true;
+        }
+        // Continue; a non-late variable may still occur in a valid context.
       }
     }
     return false;
@@ -6616,118 +6702,6 @@
   }
 }
 
-/**
- * A class used to compute a list of the constants whose value needs to be
- * computed before errors can be computed by the [VerifyUnitTask].
- */
-class RequiredConstantsComputer extends RecursiveAstVisitor {
-  /**
-   * The source with which any pending errors will be associated.
-   */
-  final Source source;
-
-  /**
-   * A list of the pending errors that were computed.
-   */
-  final List<PendingError> pendingErrors = <PendingError>[];
-
-  /**
-   * A list of the constants whose value needs to be computed before the pending
-   * errors can be used to compute an analysis error.
-   */
-  final List<ConstantEvaluationTarget> requiredConstants =
-      <ConstantEvaluationTarget>[];
-
-  /**
-   * Initialize a newly created computer to compute required constants within
-   * the given [source].
-   */
-  RequiredConstantsComputer(this.source);
-
-  @override
-  Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
-    _checkForMissingRequiredParam(
-        node.staticInvokeType, node.argumentList, node);
-    return super.visitFunctionExpressionInvocation(node);
-  }
-
-  @override
-  Object visitInstanceCreationExpression(InstanceCreationExpression node) {
-    DartType type = node.constructorName.type.type;
-    if (type is InterfaceType) {
-      _checkForMissingRequiredParam(
-          resolutionMap.staticElementForConstructorReference(node)?.type,
-          node.argumentList,
-          node.constructorName);
-    }
-    return super.visitInstanceCreationExpression(node);
-  }
-
-  @override
-  Object visitMethodInvocation(MethodInvocation node) {
-    _checkForMissingRequiredParam(
-        node.staticInvokeType, node.argumentList, node.methodName);
-    return super.visitMethodInvocation(node);
-  }
-
-  @override
-  Object visitRedirectingConstructorInvocation(
-      RedirectingConstructorInvocation node) {
-    DartType type =
-        resolutionMap.staticElementForConstructorReference(node)?.type;
-    if (type != null) {
-      _checkForMissingRequiredParam(type, node.argumentList, node);
-    }
-    return super.visitRedirectingConstructorInvocation(node);
-  }
-
-  @override
-  Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
-    DartType type =
-        resolutionMap.staticElementForConstructorReference(node)?.type;
-    if (type != null) {
-      _checkForMissingRequiredParam(type, node.argumentList, node);
-    }
-    return super.visitSuperConstructorInvocation(node);
-  }
-
-  void _checkForMissingRequiredParam(
-      DartType type, ArgumentList argumentList, AstNode node) {
-    if (type is FunctionType) {
-      for (ParameterElement parameter in type.parameters) {
-        if (parameter.isOptionalNamed) {
-          ElementAnnotationImpl annotation = _getRequiredAnnotation(parameter);
-          if (annotation != null) {
-            String parameterName = parameter.name;
-            if (!_containsNamedExpression(argumentList, parameterName)) {
-              requiredConstants.add(annotation);
-              pendingErrors.add(new PendingMissingRequiredParameterError(
-                  source, parameterName, node, annotation));
-            }
-          }
-        }
-      }
-    }
-  }
-
-  ElementAnnotationImpl _getRequiredAnnotation(ParameterElement param) => param
-      .metadata
-      .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
-
-  static bool _containsNamedExpression(ArgumentList args, String name) {
-    NodeList<Expression> arguments = args.arguments;
-    for (int i = arguments.length - 1; i >= 0; i--) {
-      Expression expression = arguments[i];
-      if (expression is NamedExpression) {
-        if (expression.name.label.name == name) {
-          return true;
-        }
-      }
-    }
-    return false;
-  }
-}
-
 class _HasTypedefSelfReferenceVisitor extends GeneralizingElementVisitor<void> {
   final GenericFunctionTypeElement element;
   bool hasSelfReference = false;
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 901b3de..b02b79e 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -152,7 +152,7 @@
   }
 
   static bool isTagName(String s) {
-    if (s == null || s.length == 0) {
+    if (s == null || s.isEmpty) {
       return false;
     }
     int sz = s.length;
@@ -243,7 +243,7 @@
   }
 
   static startsWithChar(String str, int c) {
-    return str.length != 0 && str.codeUnitAt(0) == c;
+    return str.isNotEmpty && str.codeUnitAt(0) == c;
   }
 
   static String substringBefore(String str, String separator) {
diff --git a/pkg/analyzer/lib/src/generated/java_io.dart b/pkg/analyzer/lib/src/generated/java_io.dart
index b6517da..1549dd3 100644
--- a/pkg/analyzer/lib/src/generated/java_io.dart
+++ b/pkg/analyzer/lib/src/generated/java_io.dart
@@ -130,7 +130,7 @@
     }
     if (name == 'com.google.dart.sdk') {
       String exec = Platform.executable;
-      if (exec.length != 0) {
+      if (exec.isNotEmpty) {
         String sdkPath;
         // may be "xcodebuild/ReleaseIA32/dart" with "sdk" sibling
         {
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 3248dd0..2504097 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -1846,7 +1846,7 @@
               _reportErrorForCurrentToken(
                   ParserErrorCode.MULTIPLE_LIBRARY_DIRECTIVES);
             } else {
-              if (directives.length > 0) {
+              if (directives.isNotEmpty) {
                 _reportErrorForCurrentToken(
                     ParserErrorCode.LIBRARY_DIRECTIVE_NOT_FIRST);
               }
@@ -1870,7 +1870,7 @@
         }
 
         Directive directive = parseDirective();
-        if (declarations.length > 0 && !directiveFoundAfterDeclaration) {
+        if (declarations.isNotEmpty && !directiveFoundAfterDeclaration) {
           _reportErrorForToken(ParserErrorCode.DIRECTIVE_AFTER_DECLARATION,
               directive.beginToken);
           directiveFoundAfterDeclaration = true;
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 26f2d52..0310cdf 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -19,10 +19,9 @@
 import 'package:analyzer/src/context/builder.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/ast_factory.dart';
-import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/ast/utilities.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/exit_detector.dart';
@@ -50,172 +49,6 @@
 export 'package:analyzer/src/dart/resolver/scope.dart';
 export 'package:analyzer/src/generated/type_system.dart';
 
-/// A visitor that will re-write an AST to support the optional `new` and
-/// `const` feature.
-class AstRewriteVisitor extends ScopedVisitor {
-  final bool addConstKeyword;
-  final TypeSystem typeSystem;
-
-  /// Initialize a newly created visitor.
-  AstRewriteVisitor(
-      this.typeSystem,
-      LibraryElement definingLibrary,
-      Source source,
-      TypeProvider typeProvider,
-      AnalysisErrorListener errorListener,
-      {Scope nameScope,
-      this.addConstKeyword: false})
-      : super(definingLibrary, source, typeProvider, errorListener,
-            nameScope: nameScope);
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    super.visitMethodInvocation(node);
-
-    SimpleIdentifier methodName = node.methodName;
-    if (methodName.isSynthetic) {
-      // This isn't a constructor invocation because the method name is
-      // synthetic.
-      return;
-    }
-
-    Expression target = node.target;
-    if (target == null) {
-      // Possible cases: C() or C<>()
-      if (node.realTarget != null) {
-        // This isn't a constructor invocation because it's in a cascade.
-        return;
-      }
-      Element element = nameScope.lookup(methodName, definingLibrary);
-      if (element is ClassElement) {
-        AstFactory astFactory = new AstFactoryImpl();
-        TypeName typeName = astFactory.typeName(methodName, node.typeArguments);
-        ConstructorName constructorName =
-            astFactory.constructorName(typeName, null, null);
-        InstanceCreationExpression instanceCreationExpression =
-            astFactory.instanceCreationExpression(
-                _getKeyword(node), constructorName, node.argumentList);
-        NodeReplacer.replace(node, instanceCreationExpression);
-      }
-    } else if (target is SimpleIdentifier) {
-      // Possible cases: C.n(), p.C() or p.C<>()
-      if (node.operator.type == TokenType.QUESTION_PERIOD) {
-        // This isn't a constructor invocation because a null aware operator is
-        // being used.
-      }
-      Element element = nameScope.lookup(target, definingLibrary);
-      if (element is ClassElement) {
-        // Possible case: C.n()
-        var constructorElement = element.getNamedConstructor(methodName.name);
-        if (constructorElement != null) {
-          var typeArguments = node.typeArguments;
-          if (typeArguments != null) {
-            errorReporter.reportErrorForNode(
-                StaticTypeWarningCode
-                    .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
-                typeArguments,
-                [element.name, constructorElement.name]);
-          }
-          AstFactory astFactory = new AstFactoryImpl();
-          TypeName typeName = astFactory.typeName(target, null);
-          ConstructorName constructorName =
-              astFactory.constructorName(typeName, node.operator, methodName);
-          InstanceCreationExpression instanceCreationExpression =
-              astFactory.instanceCreationExpression(
-                  _getKeyword(node), constructorName, node.argumentList,
-                  typeArguments: typeArguments);
-          NodeReplacer.replace(node, instanceCreationExpression);
-        }
-      } else if (element is PrefixElement) {
-        // Possible cases: p.C() or p.C<>()
-        AstFactory astFactory = new AstFactoryImpl();
-        Identifier identifier = astFactory.prefixedIdentifier(
-            astFactory.simpleIdentifier(target.token),
-            null,
-            astFactory.simpleIdentifier(methodName.token));
-        Element prefixedElement = nameScope.lookup(identifier, definingLibrary);
-        if (prefixedElement is ClassElement) {
-          TypeName typeName = astFactory.typeName(
-              astFactory.prefixedIdentifier(target, node.operator, methodName),
-              node.typeArguments);
-          ConstructorName constructorName =
-              astFactory.constructorName(typeName, null, null);
-          InstanceCreationExpression instanceCreationExpression =
-              astFactory.instanceCreationExpression(
-                  _getKeyword(node), constructorName, node.argumentList);
-          NodeReplacer.replace(node, instanceCreationExpression);
-        }
-      }
-    } else if (target is PrefixedIdentifier) {
-      // Possible case: p.C.n()
-      Element prefixElement = nameScope.lookup(target.prefix, definingLibrary);
-      target.prefix.staticElement = prefixElement;
-      if (prefixElement is PrefixElement) {
-        Element element = nameScope.lookup(target, definingLibrary);
-        if (element is ClassElement) {
-          var constructorElement = element.getNamedConstructor(methodName.name);
-          if (constructorElement != null) {
-            var typeArguments = node.typeArguments;
-            if (typeArguments != null) {
-              errorReporter.reportErrorForNode(
-                  StaticTypeWarningCode
-                      .WRONG_NUMBER_OF_TYPE_ARGUMENTS_CONSTRUCTOR,
-                  typeArguments,
-                  [element.name, constructorElement.name]);
-            }
-            AstFactory astFactory = new AstFactoryImpl();
-            TypeName typeName = astFactory.typeName(target, typeArguments);
-            ConstructorName constructorName =
-                astFactory.constructorName(typeName, node.operator, methodName);
-            InstanceCreationExpression instanceCreationExpression =
-                astFactory.instanceCreationExpression(
-                    _getKeyword(node), constructorName, node.argumentList);
-            NodeReplacer.replace(node, instanceCreationExpression);
-          }
-        }
-      }
-    }
-  }
-
-  /// Return the token that should be used in the [InstanceCreationExpression]
-  /// that corresponds to the given invocation [node].
-  Token _getKeyword(MethodInvocation node) {
-    return addConstKeyword
-        ? new KeywordToken(Keyword.CONST, node.offset)
-        : null;
-  }
-
-  /// Return the type of the given class [element] after substituting any type
-  /// arguments from the list of [typeArguments] for the class' type parameters.
-  static InterfaceType getType(TypeSystem typeSystem, ClassElement element,
-      TypeArgumentList typeArguments) {
-    DartType type = element.type;
-
-    List<TypeParameterElement> typeParameters = element.typeParameters;
-    if (typeParameters.isEmpty) {
-      return type;
-    }
-
-    if (typeArguments == null) {
-      return typeSystem.instantiateToBounds(type);
-    }
-
-    List<DartType> argumentTypes;
-    if (typeArguments.arguments.length == typeParameters.length) {
-      argumentTypes = typeArguments.arguments
-          .map((TypeAnnotation argument) => argument.type)
-          .toList();
-    } else {
-      argumentTypes = List<DartType>.filled(
-          typeParameters.length, DynamicTypeImpl.instance);
-    }
-    List<DartType> parameterTypes = typeParameters
-        .map((TypeParameterElement parameter) => parameter.type)
-        .toList();
-    return type.substitute2(argumentTypes, parameterTypes);
-  }
-}
-
 /// Instances of the class `BestPracticesVerifier` traverse an AST structure
 /// looking for violations of Dart best practices.
 class BestPracticesVerifier extends RecursiveAstVisitor<void> {
@@ -246,6 +79,9 @@
   /// The type system primitives
   final TypeSystem _typeSystem;
 
+  /// The inheritance manager to access interface type hierarchy.
+  final InheritanceManager3 _inheritanceManager;
+
   /// The current library
   final LibraryElement _currentLibrary;
 
@@ -267,12 +103,14 @@
     CompilationUnit unit,
     String content, {
     TypeSystem typeSystem,
+    @required InheritanceManager3 inheritanceManager,
     ResourceProvider resourceProvider,
     DeclaredVariables declaredVariables,
     AnalysisOptions analysisOptions,
   })  : _nullType = typeProvider.nullType,
         _futureNullType = typeProvider.futureNullType,
         _typeSystem = typeSystem ?? new Dart2TypeSystem(typeProvider),
+        _inheritanceManager = inheritanceManager,
         _invalidAccessVerifier =
             new _InvalidAccessVerifier(_errorReporter, _currentLibrary) {
     _inDeprecatedMember = _currentLibrary.hasDeprecated;
@@ -288,6 +126,7 @@
         declaredVariables,
         typeProvider,
         _typeSystem,
+        _inheritanceManager,
         analysisOptions);
   }
 
@@ -728,7 +567,7 @@
         // or have the logic centralized elsewhere, instead of doing this logic
         // here.
         displayName = element.enclosingElement.displayName;
-        if (!element.displayName.isEmpty) {
+        if (element.displayName.isNotEmpty) {
           displayName = "$displayName.${element.displayName}";
         }
       } else if (element is LibraryElement) {
@@ -1056,7 +895,7 @@
         if (contextType is FunctionType) {
           returnType = contextType.returnType;
           flattenedType = body.isAsynchronous
-              ? returnType.flattenFutures(_typeSystem)
+              ? _typeSystem.flatten(returnType)
               : returnType;
         }
       }
@@ -1180,8 +1019,8 @@
           elseType != null &&
           !thenType.isDynamic &&
           !elseType.isDynamic &&
-          !thenType.isMoreSpecificThan(elseType) &&
-          !elseType.isMoreSpecificThan(thenType)) {
+          !_typeSystem.isSubtypeOf(thenType, elseType) &&
+          !_typeSystem.isSubtypeOf(elseType, thenType)) {
         return false;
       }
     }
@@ -1191,7 +1030,7 @@
         rhsType != null &&
         !lhsType.isDynamic &&
         !rhsType.isDynamic &&
-        _typeSystem.isMoreSpecificThan(lhsType, rhsType)) {
+        _typeSystem.isSubtypeOf(lhsType, rhsType)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node);
       return true;
     }
@@ -2492,107 +2331,6 @@
   }
 }
 
-/// A visitor that visits ASTs and fills [UsedImportedElements].
-class GatherUsedImportedElementsVisitor extends RecursiveAstVisitor {
-  final LibraryElement library;
-  final UsedImportedElements usedElements = new UsedImportedElements();
-
-  GatherUsedImportedElementsVisitor(this.library);
-
-  @override
-  void visitExportDirective(ExportDirective node) {
-    _visitDirective(node);
-  }
-
-  @override
-  void visitImportDirective(ImportDirective node) {
-    _visitDirective(node);
-  }
-
-  @override
-  void visitLibraryDirective(LibraryDirective node) {
-    _visitDirective(node);
-  }
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    _visitIdentifier(node, node.staticElement);
-  }
-
-  /// If the given [identifier] is prefixed with a [PrefixElement], fill the
-  /// corresponding `UsedImportedElements.prefixMap` entry and return `true`.
-  bool _recordPrefixMap(SimpleIdentifier identifier, Element element) {
-    bool recordIfTargetIsPrefixElement(Expression target) {
-      if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
-        List<Element> prefixedElements = usedElements.prefixMap
-            .putIfAbsent(target.staticElement, () => <Element>[]);
-        prefixedElements.add(element);
-        return true;
-      }
-      return false;
-    }
-
-    AstNode parent = identifier.parent;
-    if (parent is MethodInvocation && parent.methodName == identifier) {
-      return recordIfTargetIsPrefixElement(parent.target);
-    }
-    if (parent is PrefixedIdentifier && parent.identifier == identifier) {
-      return recordIfTargetIsPrefixElement(parent.prefix);
-    }
-    return false;
-  }
-
-  /// Visit identifiers used by the given [directive].
-  void _visitDirective(Directive directive) {
-    directive.documentationComment?.accept(this);
-    directive.metadata.accept(this);
-  }
-
-  void _visitIdentifier(SimpleIdentifier identifier, Element element) {
-    if (element == null) {
-      return;
-    }
-    // If the element is multiply defined then call this method recursively for
-    // each of the conflicting elements.
-    if (element is MultiplyDefinedElement) {
-      List<Element> conflictingElements = element.conflictingElements;
-      int length = conflictingElements.length;
-      for (int i = 0; i < length; i++) {
-        Element elt = conflictingElements[i];
-        _visitIdentifier(identifier, elt);
-      }
-      return;
-    }
-
-    // Record `importPrefix.identifier` into 'prefixMap'.
-    if (_recordPrefixMap(identifier, element)) {
-      return;
-    }
-
-    if (element is PrefixElement) {
-      usedElements.prefixMap.putIfAbsent(element, () => <Element>[]);
-      return;
-    } else if (element.enclosingElement is! CompilationUnitElement) {
-      // Identifiers that aren't a prefix element and whose enclosing element
-      // isn't a CompilationUnit are ignored- this covers the case the
-      // identifier is a relative-reference, a reference to an identifier not
-      // imported by this library.
-      return;
-    }
-    // Ignore if an unknown library.
-    LibraryElement containingLibrary = element.library;
-    if (containingLibrary == null) {
-      return;
-    }
-    // Ignore if a local element.
-    if (library == containingLibrary) {
-      return;
-    }
-    // Remember the element.
-    usedElements.elements.add(element);
-  }
-}
-
 /// An [AstVisitor] that fills [UsedLocalElements].
 class GatherUsedLocalElementsVisitor extends RecursiveAstVisitor {
   final UsedLocalElements usedElements = new UsedLocalElements();
@@ -2753,383 +2491,6 @@
   }
 }
 
-/// Instances of the class `ImportsVerifier` visit all of the referenced
-/// libraries in the source code verifying that all of the imports are used,
-/// otherwise a [HintCode.UNUSED_IMPORT] hint is generated with
-/// [generateUnusedImportHints].
-///
-/// Additionally, [generateDuplicateImportHints] generates
-/// [HintCode.DUPLICATE_IMPORT] hints and [HintCode.UNUSED_SHOWN_NAME] hints.
-///
-/// While this class does not yet have support for an "Organize Imports" action,
-/// this logic built up in this class could be used for such an action in the
-/// future.
-class ImportsVerifier {
-  /// All [ImportDirective]s of the current library.
-  final List<ImportDirective> _allImports = <ImportDirective>[];
-
-  /// A list of [ImportDirective]s that the current library imports, but does
-  /// not use.
-  ///
-  /// As identifiers are visited by this visitor and an import has been
-  /// identified as being used by the library, the [ImportDirective] is removed
-  /// from this list. After all the sources in the library have been evaluated,
-  /// this list represents the set of unused imports.
-  ///
-  /// See [ImportsVerifier.generateUnusedImportErrors].
-  final List<ImportDirective> _unusedImports = <ImportDirective>[];
-
-  /// After the list of [unusedImports] has been computed, this list is a proper
-  /// subset of the unused imports that are listed more than once.
-  final List<ImportDirective> _duplicateImports = <ImportDirective>[];
-
-  /// The cache of [Namespace]s for [ImportDirective]s.
-  final HashMap<ImportDirective, Namespace> _namespaceMap =
-      new HashMap<ImportDirective, Namespace>();
-
-  /// This is a map between prefix elements and the import directives from which
-  /// they are derived. In cases where a type is referenced via a prefix
-  /// element, the import directive can be marked as used (removed from the
-  /// unusedImports) by looking at the resolved `lib` in `lib.X`, instead of
-  /// looking at which library the `lib.X` resolves.
-  ///
-  /// TODO (jwren) Since multiple [ImportDirective]s can share the same
-  /// [PrefixElement], it is possible to have an unreported unused import in
-  /// situations where two imports use the same prefix and at least one import
-  /// directive is used.
-  final HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap =
-      new HashMap<PrefixElement, List<ImportDirective>>();
-
-  /// A map of identifiers that the current library's imports show, but that the
-  /// library does not use.
-  ///
-  /// Each import directive maps to a list of the identifiers that are imported
-  /// via the "show" keyword.
-  ///
-  /// As each identifier is visited by this visitor, it is identified as being
-  /// used by the library, and the identifier is removed from this map (under
-  /// the import that imported it). After all the sources in the library have
-  /// been evaluated, each list in this map's values present the set of unused
-  /// shown elements.
-  ///
-  /// See [ImportsVerifier.generateUnusedShownNameHints].
-  final HashMap<ImportDirective, List<SimpleIdentifier>> _unusedShownNamesMap =
-      new HashMap<ImportDirective, List<SimpleIdentifier>>();
-
-  /// A map of names that are hidden more than once.
-  final HashMap<NamespaceDirective, List<SimpleIdentifier>>
-      _duplicateHiddenNamesMap =
-      new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
-
-  /// A map of names that are shown more than once.
-  final HashMap<NamespaceDirective, List<SimpleIdentifier>>
-      _duplicateShownNamesMap =
-      new HashMap<NamespaceDirective, List<SimpleIdentifier>>();
-
-  void addImports(CompilationUnit node) {
-    for (Directive directive in node.directives) {
-      if (directive is ImportDirective) {
-        LibraryElement libraryElement = directive.uriElement;
-        if (libraryElement == null) {
-          continue;
-        }
-        _allImports.add(directive);
-        _unusedImports.add(directive);
-        //
-        // Initialize prefixElementMap
-        //
-        if (directive.asKeyword != null) {
-          SimpleIdentifier prefixIdentifier = directive.prefix;
-          if (prefixIdentifier != null) {
-            Element element = prefixIdentifier.staticElement;
-            if (element is PrefixElement) {
-              List<ImportDirective> list = _prefixElementMap[element];
-              if (list == null) {
-                list = new List<ImportDirective>();
-                _prefixElementMap[element] = list;
-              }
-              list.add(directive);
-            }
-            // TODO (jwren) Can the element ever not be a PrefixElement?
-          }
-        }
-        _addShownNames(directive);
-      }
-      if (directive is NamespaceDirective) {
-        _addDuplicateShownHiddenNames(directive);
-      }
-    }
-    if (_unusedImports.length > 1) {
-      // order the list of unusedImports to find duplicates in faster than
-      // O(n^2) time
-      List<ImportDirective> importDirectiveArray =
-          new List<ImportDirective>.from(_unusedImports);
-      importDirectiveArray.sort(ImportDirective.COMPARATOR);
-      ImportDirective currentDirective = importDirectiveArray[0];
-      for (int i = 1; i < importDirectiveArray.length; i++) {
-        ImportDirective nextDirective = importDirectiveArray[i];
-        if (ImportDirective.COMPARATOR(currentDirective, nextDirective) == 0) {
-          // Add either the currentDirective or nextDirective depending on which
-          // comes second, this guarantees that the first of the duplicates
-          // won't be highlighted.
-          if (currentDirective.offset < nextDirective.offset) {
-            _duplicateImports.add(nextDirective);
-          } else {
-            _duplicateImports.add(currentDirective);
-          }
-        }
-        currentDirective = nextDirective;
-      }
-    }
-  }
-
-  /// Any time after the defining compilation unit has been visited by this
-  /// visitor, this method can be called to report an
-  /// [HintCode.DUPLICATE_IMPORT] hint for each of the import directives in the
-  /// [duplicateImports] list.
-  ///
-  /// @param errorReporter the error reporter to report the set of
-  ///        [HintCode.DUPLICATE_IMPORT] hints to
-  void generateDuplicateImportHints(ErrorReporter errorReporter) {
-    int length = _duplicateImports.length;
-    for (int i = 0; i < length; i++) {
-      errorReporter.reportErrorForNode(
-          HintCode.DUPLICATE_IMPORT, _duplicateImports[i].uri);
-    }
-  }
-
-  /// Report a [HintCode.DUPLICATE_SHOWN_HIDDEN_NAME] hint for each duplicate
-  /// shown or hidden name.
-  ///
-  /// Only call this method after all of the compilation units have been visited
-  /// by this visitor.
-  ///
-  /// @param errorReporter the error reporter used to report the set of
-  ///          [HintCode.UNUSED_SHOWN_NAME] hints
-  void generateDuplicateShownHiddenNameHints(ErrorReporter reporter) {
-    _duplicateHiddenNamesMap.forEach(
-        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
-      int length = identifiers.length;
-      for (int i = 0; i < length; i++) {
-        Identifier identifier = identifiers[i];
-        reporter.reportErrorForNode(
-            HintCode.DUPLICATE_HIDDEN_NAME, identifier, [identifier.name]);
-      }
-    });
-    _duplicateShownNamesMap.forEach(
-        (NamespaceDirective directive, List<SimpleIdentifier> identifiers) {
-      int length = identifiers.length;
-      for (int i = 0; i < length; i++) {
-        Identifier identifier = identifiers[i];
-        reporter.reportErrorForNode(
-            HintCode.DUPLICATE_SHOWN_NAME, identifier, [identifier.name]);
-      }
-    });
-  }
-
-  /// Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
-  ///
-  /// Only call this method after all of the compilation units have been visited
-  /// by this visitor.
-  ///
-  /// @param errorReporter the error reporter used to report the set of
-  ///        [HintCode.UNUSED_IMPORT] hints
-  void generateUnusedImportHints(ErrorReporter errorReporter) {
-    int length = _unusedImports.length;
-    for (int i = 0; i < length; i++) {
-      ImportDirective unusedImport = _unusedImports[i];
-      // Check that the imported URI exists and isn't dart:core
-      ImportElement importElement = unusedImport.element;
-      if (importElement != null) {
-        LibraryElement libraryElement = importElement.importedLibrary;
-        if (libraryElement == null ||
-            libraryElement.isDartCore ||
-            libraryElement.isSynthetic) {
-          continue;
-        }
-      }
-      StringLiteral uri = unusedImport.uri;
-      errorReporter
-          .reportErrorForNode(HintCode.UNUSED_IMPORT, uri, [uri.stringValue]);
-    }
-  }
-
-  /// Use the error [reporter] to report an [HintCode.UNUSED_SHOWN_NAME] hint
-  /// for each unused shown name.
-  ///
-  /// This method should only be invoked after all of the compilation units have
-  /// been visited by this visitor.
-  void generateUnusedShownNameHints(ErrorReporter reporter) {
-    _unusedShownNamesMap.forEach(
-        (ImportDirective importDirective, List<SimpleIdentifier> identifiers) {
-      if (_unusedImports.contains(importDirective)) {
-        // The whole import is unused, not just one or more shown names from it,
-        // so an "unused_import" hint will be generated, making it unnecessary
-        // to generate hints for the individual names.
-        return;
-      }
-      int length = identifiers.length;
-      for (int i = 0; i < length; i++) {
-        Identifier identifier = identifiers[i];
-        List<SimpleIdentifier> duplicateNames =
-            _duplicateShownNamesMap[importDirective];
-        if (duplicateNames == null || !duplicateNames.contains(identifier)) {
-          // Only generate a hint if we won't also generate a
-          // "duplicate_shown_name" hint for the same identifier.
-          reporter.reportErrorForNode(
-              HintCode.UNUSED_SHOWN_NAME, identifier, [identifier.name]);
-        }
-      }
-    });
-  }
-
-  /// Remove elements from [_unusedImports] using the given [usedElements].
-  void removeUsedElements(UsedImportedElements usedElements) {
-    // Stop if all the imports and shown names are known to be used.
-    if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
-      return;
-    }
-    // Process import prefixes.
-    usedElements.prefixMap
-        .forEach((PrefixElement prefix, List<Element> elements) {
-      List<ImportDirective> importDirectives = _prefixElementMap[prefix];
-      if (importDirectives != null) {
-        int importLength = importDirectives.length;
-        for (int i = 0; i < importLength; i++) {
-          ImportDirective importDirective = importDirectives[i];
-          _unusedImports.remove(importDirective);
-          int elementLength = elements.length;
-          for (int j = 0; j < elementLength; j++) {
-            Element element = elements[j];
-            _removeFromUnusedShownNamesMap(element, importDirective);
-          }
-        }
-      }
-    });
-    // Process top-level elements.
-    for (Element element in usedElements.elements) {
-      // Stop if all the imports and shown names are known to be used.
-      if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
-        return;
-      }
-      // Find import directives using namespaces.
-      String name = element.name;
-      for (ImportDirective importDirective in _allImports) {
-        Namespace namespace = _computeNamespace(importDirective);
-        if (namespace?.get(name) != null) {
-          _unusedImports.remove(importDirective);
-          _removeFromUnusedShownNamesMap(element, importDirective);
-        }
-      }
-    }
-  }
-
-  /// Add duplicate shown and hidden names from [directive] into
-  /// [_duplicateHiddenNamesMap] and [_duplicateShownNamesMap].
-  void _addDuplicateShownHiddenNames(NamespaceDirective directive) {
-    if (directive.combinators == null) {
-      return;
-    }
-    for (Combinator combinator in directive.combinators) {
-      // Use a Set to find duplicates in faster than O(n^2) time.
-      Set<Element> identifiers = new Set<Element>();
-      if (combinator is HideCombinator) {
-        for (SimpleIdentifier name in combinator.hiddenNames) {
-          if (name.staticElement != null) {
-            if (!identifiers.add(name.staticElement)) {
-              // [name] is a duplicate.
-              List<SimpleIdentifier> duplicateNames = _duplicateHiddenNamesMap
-                  .putIfAbsent(directive, () => new List<SimpleIdentifier>());
-              duplicateNames.add(name);
-            }
-          }
-        }
-      } else if (combinator is ShowCombinator) {
-        for (SimpleIdentifier name in combinator.shownNames) {
-          if (name.staticElement != null) {
-            if (!identifiers.add(name.staticElement)) {
-              // [name] is a duplicate.
-              List<SimpleIdentifier> duplicateNames = _duplicateShownNamesMap
-                  .putIfAbsent(directive, () => new List<SimpleIdentifier>());
-              duplicateNames.add(name);
-            }
-          }
-        }
-      }
-    }
-  }
-
-  /// Add every shown name from [importDirective] into [_unusedShownNamesMap].
-  void _addShownNames(ImportDirective importDirective) {
-    if (importDirective.combinators == null) {
-      return;
-    }
-    List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
-    _unusedShownNamesMap[importDirective] = identifiers;
-    for (Combinator combinator in importDirective.combinators) {
-      if (combinator is ShowCombinator) {
-        for (SimpleIdentifier name in combinator.shownNames) {
-          if (name.staticElement != null) {
-            identifiers.add(name);
-          }
-        }
-      }
-    }
-  }
-
-  /// Lookup and return the [Namespace] from the [_namespaceMap].
-  ///
-  /// If the map does not have the computed namespace, compute it and cache it
-  /// in the map. If [importDirective] is not resolved or is not resolvable,
-  /// `null` is returned.
-  ///
-  /// @param importDirective the import directive used to compute the returned
-  ///        namespace
-  /// @return the computed or looked up [Namespace]
-  Namespace _computeNamespace(ImportDirective importDirective) {
-    Namespace namespace = _namespaceMap[importDirective];
-    if (namespace == null) {
-      // If the namespace isn't in the namespaceMap, then compute and put it in
-      // the map.
-      ImportElement importElement = importDirective.element;
-      if (importElement != null) {
-        namespace = importElement.namespace;
-        _namespaceMap[importDirective] = namespace;
-      }
-    }
-    return namespace;
-  }
-
-  /// Remove [element] from the list of names shown by [importDirective].
-  void _removeFromUnusedShownNamesMap(
-      Element element, ImportDirective importDirective) {
-    List<SimpleIdentifier> identifiers = _unusedShownNamesMap[importDirective];
-    if (identifiers == null) {
-      return;
-    }
-    int length = identifiers.length;
-    for (int i = 0; i < length; i++) {
-      Identifier identifier = identifiers[i];
-      if (element is PropertyAccessorElement) {
-        // If the getter or setter of a variable is used, then the variable (the
-        // shown name) is used.
-        if (identifier.staticElement == element.variable) {
-          identifiers.remove(identifier);
-          break;
-        }
-      } else {
-        if (identifier.staticElement == element) {
-          identifiers.remove(identifier);
-          break;
-        }
-      }
-    }
-    if (identifiers.isEmpty) {
-      _unusedShownNamesMap.remove(importDirective);
-    }
-  }
-}
-
 /// Maintains and manages contextual type information used for
 /// inferring types.
 class InferenceContext {
@@ -3321,7 +2682,7 @@
   /// the node that will first be visited.  If `null` or unspecified, a new
   /// [LibraryScope] will be created based on the [definingLibrary].
   InstanceFieldResolverVisitor(
-      InheritanceManager2 inheritance,
+      InheritanceManager3 inheritance,
       LibraryElement definingLibrary,
       Source source,
       TypeProvider typeProvider,
@@ -3425,7 +2786,7 @@
 /// being used correctly.
 class OverrideVerifier extends RecursiveAstVisitor {
   /// The inheritance manager used to find overridden methods.
-  final InheritanceManager2 _inheritance;
+  final InheritanceManager3 _inheritance;
 
   /// The URI of the library being verified.
   final Uri _libraryUri;
@@ -3527,7 +2888,7 @@
   /// [LibraryScope] will be created based on [definingLibrary] and
   /// [typeProvider].
   PartialResolverVisitor(
-      InheritanceManager2 inheritance,
+      InheritanceManager3 inheritance,
       LibraryElement definingLibrary,
       Source source,
       TypeProvider typeProvider,
@@ -3683,7 +3044,7 @@
   /**
    * The manager for the inheritance mappings.
    */
-  final InheritanceManager2 inheritance;
+  final InheritanceManager3 inheritance;
 
   final AnalysisOptionsImpl _analysisOptions;
 
@@ -3736,6 +3097,13 @@
 
   /// Initialize a newly created visitor to resolve the nodes in an AST node.
   ///
+  /// [inheritanceManager] should be an instance of either [InheritanceManager2]
+  /// or [InheritanceManager3].  If an [InheritanceManager2] is supplied, it
+  /// will be converted into an [InheritanceManager3] internally.  The ability
+  /// to pass in [InheritanceManager2] exists for backward compatibility; in a
+  /// future major version of the analyzer, an [InheritanceManager3] will
+  /// be required.
+  ///
   /// The [definingLibrary] is the element for the library containing the node
   /// being visited. The [source] is the source representing the compilation
   /// unit containing the node being visited. The [typeProvider] is the object
@@ -3749,7 +3117,7 @@
   /// TODO(paulberry): make [featureSet] a required parameter (this will be a
   /// breaking change).
   ResolverVisitor(
-      InheritanceManager2 inheritance,
+      InheritanceManagerBase inheritanceManager,
       LibraryElement definingLibrary,
       Source source,
       TypeProvider typeProvider,
@@ -3760,7 +3128,7 @@
       reportConstEvaluationErrors: true,
       FlowAnalysisHelper flowAnalysisHelper})
       : this._(
-            inheritance,
+            inheritanceManager.asInheritanceManager3,
             definingLibrary,
             source,
             typeProvider,
@@ -4081,16 +3449,12 @@
       flow?.logicalOr_end(node, right);
 
       node.accept(elementResolver);
-    } else if (operator == TokenType.BANG_EQ) {
+    } else if (operator == TokenType.BANG_EQ || operator == TokenType.EQ_EQ) {
       left.accept(this);
       right.accept(this);
       node.accept(elementResolver);
-      _flowAnalysis?.binaryExpression_bangEq(node, left, right);
-    } else if (operator == TokenType.EQ_EQ) {
-      left.accept(this);
-      right.accept(this);
-      node.accept(elementResolver);
-      _flowAnalysis?.binaryExpression_eqEq(node, left, right);
+      _flowAnalysis?.binaryExpression_equal(node, left, right,
+          notEqual: operator == TokenType.BANG_EQ);
     } else {
       if (operator == TokenType.QUESTION_QUESTION) {
         InferenceContext.setTypeFromNode(left, node);
@@ -4190,23 +3554,6 @@
     }
   }
 
-  /// Implementation of this method should be synchronized with
-  /// [visitClassDeclaration].
-  void visitClassDeclarationIncrementally(ClassDeclaration node) {
-    //
-    // Resolve the metadata in the library scope.
-    //
-    node.metadata?.accept(this);
-    _enclosingClassDeclaration = node;
-    //
-    // Continue the class resolution.
-    //
-    enclosingClass = node.declaredElement;
-    typeAnalyzer.thisType = enclosingClass?.type;
-    node.accept(elementResolver);
-    node.accept(typeAnalyzer);
-  }
-
   @override
   void visitComment(Comment node) {
     AstNode parent = node.parent;
@@ -4454,6 +3801,30 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    //
+    // Resolve the metadata in the library scope
+    // and associate the annotations with the element.
+    //
+    if (node.metadata != null) {
+      node.metadata.accept(this);
+      ElementResolver.resolveMetadata(node);
+    }
+    //
+    // Continue the extension resolution.
+    //
+    try {
+      DartType extendedType = node.declaredElement.extendedType;
+      typeAnalyzer.thisType = typeSystem.resolveToBound(extendedType);
+      super.visitExtensionDeclaration(node);
+      node.accept(elementResolver);
+      node.accept(typeAnalyzer);
+    } finally {
+      typeAnalyzer.thisType = null;
+    }
+  }
+
+  @override
   void visitForElementInScope(ForElement node) {
     ForLoopParts forLoopParts = node.forLoopParts;
     if (forLoopParts is ForParts) {
@@ -4569,6 +3940,7 @@
       // cannot be in scope while visiting the iterator.
       //
       iterable?.accept(this);
+      _flowAnalysis?.loopVariable(loopVariable);
       loopVariable?.accept(this);
 
       _flowAnalysis?.flow?.forEachStatement_bodyBegin(
@@ -4712,7 +4084,7 @@
 
     Statement thenStatement = node.thenStatement;
     if (_flowAnalysis != null) {
-      _flowAnalysis.flow.ifStatement_thenBegin(node, condition);
+      _flowAnalysis.flow.ifStatement_thenBegin(condition);
       visitStatementInScope(thenStatement);
     } else {
       _promoteManager.visitIfStatement_thenStatement(
@@ -5007,8 +4379,6 @@
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
-    _flowAnalysis?.simpleIdentifier(node);
-
     if (_flowAnalysis != null &&
         _flowAnalysis.isPotentiallyNonNullableLocalReadBeforeWrite(node)) {
       errorReporter.reportErrorForNode(
@@ -5120,6 +4490,12 @@
     for (var i = 0; i < catchLength; ++i) {
       var catchClause = catchClauses[i];
       flow.tryCatchStatement_catchBegin();
+      if (catchClause.exceptionParameter != null) {
+        flow.add(catchClause.exceptionParameter.staticElement, assigned: true);
+      }
+      if (catchClause.stackTraceParameter != null) {
+        flow.add(catchClause.stackTraceParameter.staticElement, assigned: true);
+      }
       catchClause.accept(this);
       flow.tryCatchStatement_catchEnd();
     }
@@ -5161,6 +4537,7 @@
 
   @override
   void visitVariableDeclarationList(VariableDeclarationList node) {
+    _flowAnalysis?.variableDeclarationList(node);
     for (VariableDeclaration decl in node.variables) {
       VariableElement variableElement =
           resolutionMap.elementDeclaredByVariableDeclaration(decl);
@@ -5170,12 +4547,6 @@
   }
 
   @override
-  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    _flowAnalysis?.variableDeclarationStatement(node);
-    super.visitVariableDeclarationStatement(node);
-  }
-
-  @override
   void visitWhileStatement(WhileStatement node) {
     _flowAnalysis?.checkUnreachableNode(node);
 
@@ -5725,6 +5096,10 @@
   /// or `null` if we are not in the scope of a class.
   ClassElement enclosingClass;
 
+  /// The element representing the extension containing the AST nodes being
+  /// visited, or `null` if we are not in the scope of an extension.
+  ExtensionElement enclosingExtension;
+
   /// Initialize a newly created visitor to resolve the nodes in a compilation
   /// unit.
   ///
@@ -5974,6 +5349,53 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    ExtensionElement extensionElement = node.declaredElement;
+    Scope outerScope = nameScope;
+    try {
+      if (extensionElement == null) {
+        AnalysisEngine.instance.logger.logInformation(
+            "Missing element for extension declaration ${node.name.name} "
+            "in ${definingLibrary.source.fullName}",
+            new CaughtException(new AnalysisException(), null));
+        super.visitExtensionDeclaration(node);
+      } else {
+        ExtensionElement outerExtension = enclosingExtension;
+        try {
+          enclosingExtension = extensionElement;
+          nameScope = new TypeParameterScope(nameScope, extensionElement);
+          visitExtensionDeclarationInScope(node);
+          DartType extendedType = extensionElement.extendedType;
+          if (extendedType is InterfaceType) {
+            nameScope = new ClassScope(nameScope, extendedType.element);
+          } else if (extendedType is FunctionType) {
+            nameScope =
+                new ClassScope(nameScope, typeProvider.functionType.element);
+          }
+          nameScope = ExtensionScope(nameScope, extensionElement);
+          visitExtensionMembersInScope(node);
+        } finally {
+          enclosingExtension = outerExtension;
+        }
+      }
+    } finally {
+      nameScope = outerScope;
+    }
+  }
+
+  void visitExtensionDeclarationInScope(ExtensionDeclaration node) {
+    node.name?.accept(this);
+    node.typeParameters?.accept(this);
+    node.extendedType?.accept(this);
+  }
+
+  void visitExtensionMembersInScope(ExtensionDeclaration node) {
+    node.documentationComment?.accept(this);
+    node.metadata.accept(this);
+    node.members.accept(this);
+  }
+
+  @override
   void visitForEachPartsWithDeclaration(ForEachPartsWithDeclaration node) {
     //
     // We visit the iterator before the loop variable because the loop variable
@@ -7333,6 +6755,9 @@
   /// Return the type representing the built-in type 'Type'.
   InterfaceType get typeType;
 
+  /// Return the type representing the built-in type `void`.
+  VoidType get voidType;
+
   /// Return 'true' if [id] is the name of a getter on
   /// the Object type.
   bool isObjectGetter(String id);
@@ -7570,6 +6995,9 @@
   @override
   InterfaceType get typeType => _typeType;
 
+  @override
+  VoidType get voidType => VoidTypeImpl.instance;
+
   /// Return the type with the given [typeName] from the given [namespace], or
   /// `null` if there is no class with the given name.
   InterfaceType _getType(Namespace namespace, String typeName) {
@@ -8040,7 +7468,7 @@
         variable.declaredType = element.returnType;
       } else if (variable.type == null) {
         List<ParameterElement> parameters = element.parameters;
-        DartType type = parameters != null && parameters.length > 0
+        DartType type = parameters != null && parameters.isNotEmpty
             ? parameters[0].type
             : _dynamicType;
         variable.declaredType = type;
@@ -8506,8 +7934,8 @@
 
   _visitClassElement(ClassElement element) {
     if (!_isUsedElement(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 
@@ -8520,15 +7948,15 @@
 
   _visitFunctionElement(FunctionElement element) {
     if (!_isUsedElement(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 
   _visitFunctionTypeAliasElement(FunctionTypeAliasElement element) {
     if (!_isUsedElement(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 
@@ -8548,38 +7976,26 @@
 
   _visitMethodElement(MethodElement element) {
     if (!_isUsedMember(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 
   _visitPropertyAccessorElement(PropertyAccessorElement element) {
     if (!_isUsedMember(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 
   _visitTopLevelVariableElement(TopLevelVariableElement element) {
     if (!_isUsedElement(element)) {
-      _reportErrorForElement(HintCode.UNUSED_ELEMENT, element,
-          [element.kind.displayName, element.displayName]);
+      _reportErrorForElement(
+          HintCode.UNUSED_ELEMENT, element, [element.displayName]);
     }
   }
 }
 
-/// A container with information about used imports prefixes and used imported
-/// elements.
-class UsedImportedElements {
-  /// The map of referenced [PrefixElement]s and the [Element]s that they
-  /// prefix.
-  final Map<PrefixElement, List<Element>> prefixMap =
-      new HashMap<PrefixElement, List<Element>>();
-
-  /// The set of referenced top-level [Element]s.
-  final Set<Element> elements = new HashSet<Element>();
-}
-
 /// A container with sets of used [Element]s.
 /// All these elements are defined in a single compilation unit or a library.
 class UsedLocalElements {
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index c9f344e..f6319d1 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -305,7 +305,7 @@
    *          relative to
    */
   PackageUriResolver(this._packagesDirectories) {
-    if (_packagesDirectories.length < 1) {
+    if (_packagesDirectories.isEmpty) {
       throw new ArgumentError(
           "At least one package directory must be provided");
     }
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index efa1dc9..c36e138 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/dart/element/member.dart' show ConstructorMember;
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type_algebra.dart';
+import 'package:analyzer/src/dart/resolver/extension_member_resolver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -68,7 +69,7 @@
    * The type representing the class containing the nodes being analyzed,
    * or `null` if the nodes are not within a class.
    */
-  InterfaceType thisType;
+  DartType thisType;
 
   /**
    * The object providing promoted or declared types of variables.
@@ -186,6 +187,13 @@
               'element', listTypeParam, ParameterKind.POSITIONAL);
       parameters = new List.filled(elementTypes.length, syntheticParamElement);
     }
+    if (_strictInference && parameters.isEmpty && contextType == null) {
+      // We cannot infer the type of a collection literal with no elements, and
+      // no context type. If there are any elements, inference has not failed,
+      // as the types of those elements are considered resolved.
+      _resolver.errorReporter.reportErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL, node, ['List']);
+    }
     InterfaceType inferred = ts.inferGenericFunctionOrType<InterfaceType>(
         _typeProvider.listType, parameters, elementTypes, contextType,
         downwards: downwards,
@@ -410,12 +418,14 @@
       return;
     }
     DartType staticType = node.staticInvokeType?.returnType ?? _dynamicType;
-    staticType = _typeSystem.refineBinaryExpressionType(
-        node.leftOperand.staticType,
-        node.operator.type,
-        node.rightOperand.staticType,
-        staticType,
-        _featureSet);
+    if (node.leftOperand is! ExtensionOverride) {
+      staticType = _typeSystem.refineBinaryExpressionType(
+          node.leftOperand.staticType,
+          node.operator.type,
+          node.rightOperand.staticType,
+          staticType,
+          _featureSet);
+    }
     _recordStaticType(node, staticType);
   }
 
@@ -468,6 +478,12 @@
   }
 
   @override
+  void visitExtensionOverride(ExtensionOverride node) {
+    var extensionResolver = ExtensionMemberResolver(_resolver);
+    extensionResolver.resolveOverride(node);
+  }
+
+  @override
   void visitFunctionDeclaration(FunctionDeclaration node) {
     FunctionExpression function = node.functionExpression;
     ExecutableElementImpl functionElement =
@@ -634,7 +650,7 @@
   void visitListLiteral(ListLiteral node) {
     TypeArgumentList typeArguments = node.typeArguments;
 
-    // If we have explicit arguments, use them
+    // If we have explicit arguments, use them.
     if (typeArguments != null) {
       DartType staticType = _dynamicType;
       NodeList<TypeAnnotation> arguments = typeArguments.arguments;
@@ -822,7 +838,7 @@
       staticType = staticElement.type;
     }
 
-    staticType = _inferGenericInstantiationFromContext(node, staticType);
+    staticType = _inferTearOff(node, node.identifier, staticType);
     if (!_inferObjectAccess(node, staticType, prefixedIdentifier)) {
       _recordStaticType(prefixedIdentifier, staticType);
       _recordStaticType(node, staticType);
@@ -915,7 +931,7 @@
         _nonNullableEnabled) {
       staticType = _typeSystem.makeNullable(staticType);
     }
-    staticType = _inferGenericInstantiationFromContext(node, staticType);
+    staticType = _inferTearOff(node, node.propertyName, staticType);
 
     if (!_inferObjectAccess(node, staticType, propertyName)) {
       _recordStaticType(propertyName, staticType);
@@ -971,6 +987,17 @@
       assert(literalType.element == _typeProvider.setType.element);
       (node as SetOrMapLiteralImpl).becomeSet();
     }
+    if (_strictInference &&
+        node.elements.isEmpty &&
+        InferenceContext.getContext(node) == null) {
+      // We cannot infer the type of a collection literal with no elements, and
+      // no context type. If there are any elements, inference has not failed,
+      // as the types of those elements are considered resolved.
+      _resolver.errorReporter.reportErrorForNode(
+          HintCode.INFERENCE_FAILURE_ON_COLLECTION_LITERAL,
+          node,
+          [node.isMap ? 'Map' : 'Set']);
+    }
     // TODO(brianwilkerson) Decide whether the literalType needs to be made
     //  non-nullable here or whether that will have happened in
     //  _inferSetOrMapLiteralType.
@@ -1054,7 +1081,7 @@
     } else {
       staticType = _dynamicType;
     }
-    staticType = _inferGenericInstantiationFromContext(node, staticType);
+    staticType = _inferTearOff(node, node, staticType);
     _recordStaticType(node, staticType);
   }
 
@@ -1364,7 +1391,7 @@
    */
   String _getFirstArgumentAsString(ArgumentList argumentList) {
     NodeList<Expression> arguments = argumentList.arguments;
-    if (arguments.length > 0) {
+    if (arguments.isNotEmpty) {
       Expression argument = arguments[0];
       if (argument is SimpleStringLiteral) {
         return argument.value;
@@ -1421,7 +1448,7 @@
     }
     if (accessor.isSetter) {
       List<DartType> parameterTypes = functionType.normalParameterTypes;
-      if (parameterTypes != null && parameterTypes.length > 0) {
+      if (parameterTypes != null && parameterTypes.isNotEmpty) {
         return parameterTypes[0];
       }
       PropertyAccessorElement getter = accessor.variable.getter;
@@ -1548,23 +1575,6 @@
   }
 
   /**
-   * Given an uninstantiated generic function type, try to infer the
-   * instantiated generic function type from the surrounding context.
-   */
-  DartType _inferGenericInstantiationFromContext(AstNode node, DartType type) {
-    TypeSystem ts = _typeSystem;
-    var context = InferenceContext.getContext(node);
-    if (context is FunctionType &&
-        type is FunctionType &&
-        ts is Dart2TypeSystem) {
-      // TODO(scheglov) Also store type arguments for identifiers.
-      return ts.inferFunctionTypeInstantiation(context, type,
-          errorReporter: _resolver.errorReporter, errorNode: node);
-    }
-    return type;
-  }
-
-  /**
    * Given a possibly generic invocation like `o.m(args)` or `(f)(args)` try to
    * infer the instantiated generic function type.
    *
@@ -1910,6 +1920,36 @@
   }
 
   /**
+   * Given an uninstantiated generic function type, referenced by the
+   * [identifier] in the tear-off [expression], try to infer the instantiated
+   * generic function type from the surrounding context.
+   */
+  DartType _inferTearOff(
+    Expression expression,
+    SimpleIdentifier identifier,
+    DartType tearOffType,
+  ) {
+    TypeSystem ts = _typeSystem;
+    var context = InferenceContext.getContext(expression);
+    if (context is FunctionType &&
+        tearOffType is FunctionType &&
+        ts is Dart2TypeSystem) {
+      var typeArguments = ts.inferFunctionTypeInstantiation(
+        context,
+        tearOffType,
+        errorReporter: _resolver.errorReporter,
+        errorNode: expression,
+      );
+      (identifier as SimpleIdentifierImpl).tearOffTypeArgumentTypes =
+          typeArguments;
+      if (typeArguments.isNotEmpty) {
+        return tearOffType.instantiate(typeArguments);
+      }
+    }
+    return tearOffType;
+  }
+
+  /**
    * Return `true` if the given [node] is not a type literal.
    */
   bool _isNotTypeLiteral(Identifier node) {
diff --git a/pkg/analyzer/lib/src/generated/super_context.dart b/pkg/analyzer/lib/src/generated/super_context.dart
new file mode 100644
index 0000000..3613971
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/super_context.dart
@@ -0,0 +1,49 @@
+// 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/dart/ast/ast.dart';
+
+/// An indication of the kind of context in which a super expression was found.
+class SuperContext {
+  /// An indication that the super expression is in a context in which it is
+  /// invalid because it is in an instance member of an extension.
+  static const SuperContext extension = SuperContext._('extension');
+
+  /// An indication that the super expression is in a context in which it is
+  /// invalid because it is not in an instance member.
+  static const SuperContext static = SuperContext._('static');
+
+  /// An indication that the super expression is in a context in which it is
+  /// valid.
+  static const SuperContext valid = SuperContext._('valid');
+
+  /// The name of the context.
+  final String name;
+
+  /// Return an indication of the context in which the super [expression] is
+  /// being used.
+  factory SuperContext.of(SuperExpression expression) {
+    for (AstNode node = expression; node != null; node = node.parent) {
+      if (node is CompilationUnit) {
+        return SuperContext.static;
+      } else if (node is ConstructorDeclaration) {
+        return node.factoryKeyword == null
+            ? SuperContext.valid
+            : SuperContext.static;
+      } else if (node is ConstructorFieldInitializer) {
+        return SuperContext.static;
+      } else if (node is MethodDeclaration) {
+        if (node.isStatic) {
+          return SuperContext.static;
+        } else if (node.parent is ExtensionDeclaration) {
+          return SuperContext.extension;
+        }
+        return SuperContext.valid;
+      }
+    }
+    return SuperContext.static;
+  }
+
+  const SuperContext._(this.name);
+}
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 a84c48b..a7d934a 100644
--- a/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/ast_test_factory.dart
@@ -1303,7 +1303,7 @@
           TokenFactory.tokenFromType(TokenType.SEMICOLON));
 
   static TypeArgumentList typeArgumentList(List<TypeAnnotation> types) {
-    if (types == null || types.length == 0) {
+    if (types == null || types.isEmpty) {
       return null;
     }
     return astFactory.typeArgumentList(TokenFactory.tokenFromType(TokenType.LT),
@@ -1345,7 +1345,7 @@
 
   static TypeParameterList typeParameterList([List<String> typeNames]) {
     List<TypeParameter> typeParameters = null;
-    if (typeNames != null && !typeNames.isEmpty) {
+    if (typeNames != null && typeNames.isNotEmpty) {
       typeParameters = new List<TypeParameter>();
       for (String typeName in typeNames) {
         typeParameters.add(typeParameter(typeName));
diff --git a/pkg/analyzer/lib/src/generated/testing/element_factory.dart b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
index e54a06c..c0ea183 100644
--- a/pkg/analyzer/lib/src/generated/testing/element_factory.dart
+++ b/pkg/analyzer/lib/src/generated/testing/element_factory.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:meta/meta.dart';
 import 'package:path/path.dart';
 
 /**
@@ -54,6 +55,26 @@
           [List<String> parameterNames]) =>
       classElement(typeName, objectType, parameterNames);
 
+  static ClassElementImpl classElement3({
+    @required String name,
+    List<TypeParameterElement> typeParameters,
+    List<String> typeParameterNames = const [],
+    InterfaceType supertype,
+    List<InterfaceType> mixins = const [],
+    List<InterfaceType> interfaces = const [],
+  }) {
+    typeParameters ??= ElementFactory.typeParameters(typeParameterNames);
+    supertype ??= objectType;
+
+    var element = ClassElementImpl(name, 0);
+    element.typeParameters = typeParameters;
+    element.supertype = supertype;
+    element.mixins = mixins;
+    element.interfaces = interfaces;
+    element.constructors = const <ConstructorElement>[];
+    return element;
+  }
+
   static classTypeAlias(String typeName, InterfaceType superclassType,
       [List<String> parameterNames]) {
     ClassElementImpl element =
@@ -190,6 +211,11 @@
     return spec;
   }
 
+  static ExtensionElementImpl extensionElement(
+          [String name, DartType extendedType]) =>
+      ExtensionElementImpl.forNode(AstTestFactory.identifier3(name))
+        ..extendedType = extendedType;
+
   static FieldElementImpl fieldElement(
       String name, bool isStatic, bool isFinal, bool isConst, DartType type,
       {Expression initializer}) {
@@ -463,6 +489,27 @@
     return method;
   }
 
+  static MixinElementImpl mixinElement({
+    @required String name,
+    List<TypeParameterElement> typeParameters,
+    List<String> typeParameterNames = const [],
+    List<InterfaceType> constraints = const [],
+    List<InterfaceType> interfaces = const [],
+  }) {
+    typeParameters ??= ElementFactory.typeParameters(typeParameterNames);
+
+    if (constraints.isEmpty) {
+      constraints = [objectType];
+    }
+
+    var element = MixinElementImpl(name, 0);
+    element.typeParameters = typeParameters;
+    element.superclassConstraints = constraints;
+    element.interfaces = interfaces;
+    element.constructors = const <ConstructorElement>[];
+    return element;
+  }
+
   static ParameterElementImpl namedParameter(String name) {
     ParameterElementImpl parameter = new ParameterElementImpl(name, 0);
     parameter.parameterKind = ParameterKind.NAMED;
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 b408d5f..8627558 100644
--- a/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
+++ b/pkg/analyzer/lib/src/generated/testing/test_type_provider.dart
@@ -605,6 +605,9 @@
     return _typeType;
   }
 
+  @override
+  VoidType get voidType => VoidTypeImpl.instance;
+
   void _initDartAsync() {
     Source asyncSource;
     if (_driver != null) {
diff --git a/pkg/analyzer/lib/src/generated/type_system.dart b/pkg/analyzer/lib/src/generated/type_system.dart
index 523beb8..6f89335 100644
--- a/pkg/analyzer/lib/src/generated/type_system.dart
+++ b/pkg/analyzer/lib/src/generated/type_system.dart
@@ -16,6 +16,7 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart' show TypeParameterMember;
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/error/codes.dart' show StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisContext, AnalysisOptionsImpl;
@@ -201,18 +202,18 @@
    * Given a generic function type `F<T0, T1, ... Tn>` and a context type C,
    * infer an instantiation of F, such that `F<S0, S1, ..., Sn>` <: C.
    *
-   * This is similar to [inferGenericFunctionOrType], but the return type is also
-   * considered as part of the solution.
+   * This is similar to [inferGenericFunctionOrType2], but the return type is
+   * also considered as part of the solution.
    *
    * If this function is called with a [contextType] that is also
    * uninstantiated, or a [fnType] that is already instantiated, it will have
-   * no effect and return [fnType].
+   * no effect and return `null`.
    */
-  FunctionType inferFunctionTypeInstantiation(
+  List<DartType> inferFunctionTypeInstantiation(
       FunctionType contextType, FunctionType fnType,
       {ErrorReporter errorReporter, AstNode errorNode}) {
     if (contextType.typeFormals.isNotEmpty || fnType.typeFormals.isEmpty) {
-      return fnType;
+      return const <DartType>[];
     }
 
     // Create a TypeSystem that will allow certain type parameters to be
@@ -223,12 +224,11 @@
     inferrer.constrainGenericFunctionInContext(fnType, contextType);
 
     // Infer and instantiate the resulting type.
-    var inferredTypes = inferrer.infer(
+    return inferrer.infer(
       fnType.typeFormals,
       errorReporter: errorReporter,
       errorNode: errorNode,
     );
-    return fnType.instantiate(inferredTypes);
   }
 
   /// Infers a generic type, function, method, or list/map literal
@@ -596,7 +596,7 @@
   /// Partially updated to reflect
   /// https://github.com/dart-lang/language/blob/da5adf7eb5f2d479069d8660ed7ca7b230098510/resources/type-system/subtyping.md
   ///
-  /// However, it does not correllate 1:1 and does not specialize Null vs Never
+  /// However, it does not correlate 1:1 and does not specialize Null vs Never
   /// cases. It also is not guaranteed to be exactly accurate vs the "spec"
   /// because it has slightly different order of operations. These should be
   /// brought in line or proven equivalent.
@@ -748,9 +748,8 @@
   @override
   DartType refineBinaryExpressionType(DartType leftType, TokenType operator,
       DartType rightType, DartType currentType, FeatureSet featureSet) {
-    if (leftType is TypeParameterType &&
-        leftType.element.bound == typeProvider.numType) {
-      if (rightType == leftType || rightType == typeProvider.intType) {
+    if (leftType is TypeParameterType && leftType.bound.isDartCoreNum) {
+      if (rightType == leftType || rightType.isDartCoreInt) {
         if (operator == TokenType.PLUS ||
             operator == TokenType.MINUS ||
             operator == TokenType.STAR ||
@@ -763,15 +762,16 @@
           return leftType;
         }
       }
-      if (rightType == typeProvider.doubleType) {
+      if (rightType.isDartCoreDouble) {
         if (operator == TokenType.PLUS ||
             operator == TokenType.MINUS ||
             operator == TokenType.STAR ||
             operator == TokenType.SLASH) {
+          InterfaceTypeImpl doubleType = typeProvider.doubleType;
           if (featureSet.isEnabled(Feature.non_nullable)) {
-            return promoteToNonNull(typeProvider.doubleType as TypeImpl);
+            return promoteToNonNull(doubleType);
           }
-          return typeProvider.doubleType;
+          return doubleType;
         }
       }
       return currentType;
@@ -956,51 +956,10 @@
   DartType _functionParameterBound(DartType f, DartType g) =>
       getGreatestLowerBound(f, g);
 
-  /**
-   * This currently does not implement a very complete least upper bound
-   * algorithm, but handles a couple of the very common cases that are
-   * causing pain in real code.  The current algorithm is:
-   * 1. If either of the types is a supertype of the other, return it.
-   *    This is in fact the best result in this case.
-   * 2. If the two types have the same class element, then take the
-   *    pointwise least upper bound of the type arguments.  This is again
-   *    the best result, except that the recursive calls may not return
-   *    the true least upper bounds.  The result is guaranteed to be a
-   *    well-formed type under the assumption that the input types were
-   *    well-formed (and assuming that the recursive calls return
-   *    well-formed types).
-   * 3. Otherwise return the spec-defined least upper bound.  This will
-   *    be an upper bound, might (or might not) be least, and might
-   *    (or might not) be a well-formed type.
-   *
-   * TODO(leafp): Use matchTypes or something similar here to handle the
-   *  case where one of the types is a superclass (but not supertype) of
-   *  the other, e.g. LUB(Iterable<double>, List<int>) = Iterable<num>
-   * TODO(leafp): Figure out the right final algorithm and implement it.
-   */
   @override
   DartType _interfaceLeastUpperBound(InterfaceType type1, InterfaceType type2) {
-    if (isSubtypeOf(type1, type2)) {
-      return type2;
-    }
-    if (isSubtypeOf(type2, type1)) {
-      return type1;
-    }
-    if (type1.element == type2.element) {
-      List<DartType> tArgs1 = type1.typeArguments;
-      List<DartType> tArgs2 = type2.typeArguments;
-
-      assert(tArgs1.length == tArgs2.length);
-      List<DartType> tArgs = new List(tArgs1.length);
-      for (int i = 0; i < tArgs1.length; i++) {
-        tArgs[i] = getLeastUpperBound(tArgs1[i], tArgs2[i]);
-      }
-      InterfaceTypeImpl lub = new InterfaceTypeImpl(type1.element);
-      lub.typeArguments = tArgs;
-      return lub;
-    }
-    return InterfaceTypeImpl.computeLeastUpperBound(type1, type2) ??
-        typeProvider.dynamicType;
+    var helper = InterfaceLeastUpperBoundHelper(this);
+    return helper.compute(type1, type2);
   }
 
   /// Check that [f1] is a subtype of [f2].
@@ -1326,6 +1285,7 @@
       {bool considerExtendsClause: true,
       ErrorReporter errorReporter,
       AstNode errorNode,
+      bool failAtError: false,
       bool downwardsInferPhase: false}) {
     var fnTypeParams = TypeParameterTypeImpl.getTypes(typeFormals);
 
@@ -1381,6 +1341,7 @@
       }
 
       if (!success) {
+        if (failAtError) return null;
         errorReporter?.reportErrorForNode(
             StrongModeCode.COULD_NOT_INFER,
             errorNode,
@@ -1393,6 +1354,7 @@
       }
 
       if (inferred is FunctionType && inferred.typeFormals.isNotEmpty) {
+        if (failAtError) return null;
         errorReporter
             ?.reportErrorForNode(StrongModeCode.COULD_NOT_INFER, errorNode, [
           typeParam,
@@ -1421,6 +1383,7 @@
     // Report any errors from instantiateToBounds.
     for (int i = 0; i < hasError.length; i++) {
       if (hasError[i]) {
+        if (failAtError) return null;
         TypeParameterType typeParam = fnTypeParams[i];
         var typeParamBound =
             typeParam.bound.substitute2(inferredTypes, fnTypeParams);
@@ -1893,6 +1856,379 @@
   }
 }
 
+/// The instantiation of a [ClassElement] with type arguments.
+///
+/// It is not a [DartType] itself, because it does not have nullability.
+/// But it should be used where nullability does not make sense - to specify
+/// superclasses, mixins, and implemented interfaces.
+class InstantiatedClass {
+  final ClassElement element;
+  final List<DartType> arguments;
+
+  final Substitution _substitution;
+
+  InstantiatedClass(this.element, this.arguments)
+      : _substitution = Substitution.fromPairs(
+          element.typeParameters,
+          arguments,
+        );
+
+  /// Return the [InstantiatedClass] that corresponds to the [type] - with the
+  /// same element and type arguments, ignoring its nullability suffix.
+  factory InstantiatedClass.of(InterfaceType type) {
+    return InstantiatedClass(type.element, type.typeArguments);
+  }
+
+  @override
+  int get hashCode {
+    var hash = 0x3fffffff & element.hashCode;
+    for (var i = 0; i < arguments.length; i++) {
+      hash = 0x3fffffff & (hash * 31 + (hash ^ arguments[i].hashCode));
+    }
+    return hash;
+  }
+
+  /// Return the interfaces that are directly implemented by this class.
+  List<InstantiatedClass> get interfaces {
+    var interfaces = element.interfaces;
+
+    var result = List<InstantiatedClass>(interfaces.length);
+    for (var i = 0; i < interfaces.length; i++) {
+      var interface = interfaces[i];
+      var substituted = _substitution.substituteType(interface);
+      result[i] = InstantiatedClass.of(substituted);
+    }
+
+    return result;
+  }
+
+  /// Return `true` if this type represents the type 'Function' defined in the
+  /// dart:core library.
+  bool get isDartCoreFunction {
+    return element.name == 'Function' && element.library.isDartCore;
+  }
+
+  /// Return the superclass of this type, or `null` if this type represents
+  /// the class 'Object'.
+  InstantiatedClass get superclass {
+    var supertype = element.supertype;
+    if (supertype == null) return null;
+
+    supertype = _substitution.substituteType(supertype);
+    return InstantiatedClass.of(supertype);
+  }
+
+  /// Return a list containing all of the superclass constraints defined for
+  /// this class. The list will be empty if this class does not represent a
+  /// mixin declaration. If this class _does_ represent a mixin declaration but
+  /// the declaration does not have an `on` clause, then the list will contain
+  /// the type for the class `Object`.
+  List<InstantiatedClass> get superclassConstraints {
+    var constraints = element.superclassConstraints;
+
+    var result = List<InstantiatedClass>(constraints.length);
+    for (var i = 0; i < constraints.length; i++) {
+      var constraint = constraints[i];
+      var substituted = _substitution.substituteType(constraint);
+      result[i] = InstantiatedClass.of(substituted);
+    }
+
+    return result;
+  }
+
+  @visibleForTesting
+  InterfaceType get withNullabilitySuffixNone {
+    return withNullability(NullabilitySuffix.none);
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (identical(this, other)) return true;
+
+    if (other is InstantiatedClass) {
+      if (element != other.element) return false;
+      if (arguments.length != other.arguments.length) return false;
+      for (var i = 0; i < arguments.length; i++) {
+        if (arguments[i] != other.arguments[i]) return false;
+      }
+      return true;
+    }
+    return false;
+  }
+
+  @override
+  String toString() {
+    var buffer = StringBuffer();
+    buffer.write(element.name);
+    if (arguments.isNotEmpty) {
+      buffer.write('<');
+      buffer.write(arguments.join(', '));
+      buffer.write('>');
+    }
+    return buffer.toString();
+  }
+
+  InterfaceType withNullability(NullabilitySuffix nullability) {
+    return InterfaceTypeImpl.explicit(
+      element,
+      arguments,
+      nullabilitySuffix: nullability,
+    );
+  }
+}
+
+class InterfaceLeastUpperBoundHelper {
+  final TypeSystem typeSystem;
+
+  InterfaceLeastUpperBoundHelper(this.typeSystem);
+
+  /// This currently does not implement a very complete least upper bound
+  /// algorithm, but handles a couple of the very common cases that are
+  /// causing pain in real code.  The current algorithm is:
+  /// 1. If either of the types is a supertype of the other, return it.
+  ///    This is in fact the best result in this case.
+  /// 2. If the two types have the same class element, then take the
+  ///    pointwise least upper bound of the type arguments.  This is again
+  ///    the best result, except that the recursive calls may not return
+  ///    the true least upper bounds.  The result is guaranteed to be a
+  ///    well-formed type under the assumption that the input types were
+  ///    well-formed (and assuming that the recursive calls return
+  ///    well-formed types).
+  /// 3. Otherwise return the spec-defined least upper bound.  This will
+  ///    be an upper bound, might (or might not) be least, and might
+  ///    (or might not) be a well-formed type.
+  ///
+  /// TODO(leafp): Use matchTypes or something similar here to handle the
+  ///  case where one of the types is a superclass (but not supertype) of
+  ///  the other, e.g. LUB(Iterable<double>, List<int>) = Iterable<num>
+  /// TODO(leafp): Figure out the right final algorithm and implement it.
+  InterfaceTypeImpl compute(InterfaceTypeImpl type1, InterfaceTypeImpl type2) {
+    var nullability = _chooseNullability(type1, type2);
+
+    // Strip off nullability.
+    type1 = type1.withNullability(NullabilitySuffix.none);
+    type2 = type2.withNullability(NullabilitySuffix.none);
+
+    if (typeSystem.isSubtypeOf(type1, type2)) {
+      return type2.withNullability(nullability);
+    }
+    if (typeSystem.isSubtypeOf(type2, type1)) {
+      return type1.withNullability(nullability);
+    }
+
+    if (type1.element == type2.element) {
+      var args1 = type1.typeArguments;
+      var args2 = type2.typeArguments;
+
+      assert(args1.length == args2.length);
+      var args = List<DartType>(args1.length);
+      for (int i = 0; i < args1.length; i++) {
+        args[i] = typeSystem.getLeastUpperBound(args1[i], args2[i]);
+      }
+
+      return new InterfaceTypeImpl.explicit(
+        type1.element,
+        args,
+        nullabilitySuffix: nullability,
+      );
+    }
+
+    var result = _computeLeastUpperBound(
+      InstantiatedClass.of(type1),
+      InstantiatedClass.of(type2),
+    );
+    return result.withNullability(nullability);
+  }
+
+  /// Compute the least upper bound of types [i] and [j], both of which are
+  /// known to be interface types.
+  ///
+  /// In the event that the algorithm fails (which might occur due to a bug in
+  /// the analyzer), `null` is returned.
+  InstantiatedClass _computeLeastUpperBound(
+    InstantiatedClass i,
+    InstantiatedClass j,
+  ) {
+    // compute set of supertypes
+    var si = computeSuperinterfaceSet(i);
+    var sj = computeSuperinterfaceSet(j);
+
+    // union si with i and sj with j
+    si.add(i);
+    sj.add(j);
+
+    // compute intersection, reference as set 's'
+    var s = _intersection(si, sj);
+    return _computeTypeAtMaxUniqueDepth(s);
+  }
+
+  /**
+   * Return the length of the longest inheritance path from the [element] to
+   * Object.
+   */
+  @visibleForTesting
+  static int computeLongestInheritancePathToObject(ClassElement element) {
+    return _computeLongestInheritancePathToObject(
+      element,
+      0,
+      Set<ClassElement>(),
+    );
+  }
+
+  /// Return all of the superinterfaces of the given [type].
+  @visibleForTesting
+  static Set<InstantiatedClass> computeSuperinterfaceSet(
+      InstantiatedClass type) {
+    var result = Set<InstantiatedClass>();
+    _addSuperinterfaces(result, type);
+    return result;
+  }
+
+  /// Add all of the superinterfaces of the given [type] to the given [set].
+  static void _addSuperinterfaces(
+      Set<InstantiatedClass> set, InstantiatedClass type) {
+    for (var interface in type.interfaces) {
+      if (!interface.isDartCoreFunction) {
+        if (set.add(interface)) {
+          _addSuperinterfaces(set, interface);
+        }
+      }
+    }
+
+    for (var constraint in type.superclassConstraints) {
+      if (!constraint.isDartCoreFunction) {
+        if (set.add(constraint)) {
+          _addSuperinterfaces(set, constraint);
+        }
+      }
+    }
+
+    var supertype = type.superclass;
+    if (supertype != null && !supertype.isDartCoreFunction) {
+      if (set.add(supertype)) {
+        _addSuperinterfaces(set, supertype);
+      }
+    }
+  }
+
+  static NullabilitySuffix _chooseNullability(
+    InterfaceTypeImpl type1,
+    InterfaceTypeImpl type2,
+  ) {
+    var nullability1 = type1.nullabilitySuffix;
+    var nullability2 = type2.nullabilitySuffix;
+    if (nullability1 == NullabilitySuffix.question ||
+        nullability2 == NullabilitySuffix.question) {
+      return NullabilitySuffix.question;
+    } else if (nullability1 == NullabilitySuffix.star ||
+        nullability2 == NullabilitySuffix.star) {
+      return NullabilitySuffix.star;
+    }
+    return NullabilitySuffix.none;
+  }
+
+  /// Return the length of the longest inheritance path from a subtype of the
+  /// given [element] to Object, where the given [depth] is the length of the
+  /// longest path from the subtype to this type. The set of [visitedElements]
+  /// is used to prevent infinite recursion in the case of a cyclic type
+  /// structure.
+  static int _computeLongestInheritancePathToObject(
+      ClassElement element, int depth, Set<ClassElement> visitedElements) {
+    // Object case
+    if (element.supertype == null || visitedElements.contains(element)) {
+      return depth;
+    }
+    int longestPath = 1;
+    try {
+      visitedElements.add(element);
+      int pathLength;
+
+      // loop through each of the superinterfaces recursively calling this
+      // method and keeping track of the longest path to return
+      for (InterfaceType interface in element.superclassConstraints) {
+        pathLength = _computeLongestInheritancePathToObject(
+            interface.element, depth + 1, visitedElements);
+        if (pathLength > longestPath) {
+          longestPath = pathLength;
+        }
+      }
+
+      // loop through each of the superinterfaces recursively calling this
+      // method and keeping track of the longest path to return
+      for (InterfaceType interface in element.interfaces) {
+        pathLength = _computeLongestInheritancePathToObject(
+            interface.element, depth + 1, visitedElements);
+        if (pathLength > longestPath) {
+          longestPath = pathLength;
+        }
+      }
+
+      // finally, perform this same check on the super type
+      // TODO(brianwilkerson) Does this also need to add in the number of mixin
+      // classes?
+      InterfaceType supertype = element.supertype;
+      if (supertype != null) {
+        pathLength = _computeLongestInheritancePathToObject(
+            supertype.element, depth + 1, visitedElements);
+        if (pathLength > longestPath) {
+          longestPath = pathLength;
+        }
+      }
+    } finally {
+      visitedElements.remove(element);
+    }
+    return longestPath;
+  }
+
+  /// Return the type from the [types] list that has the longest inheritance
+  /// path to Object of unique length.
+  static InstantiatedClass _computeTypeAtMaxUniqueDepth(
+    List<InstantiatedClass> types,
+  ) {
+    // for each element in Set s, compute the largest inheritance path to Object
+    List<int> depths = new List<int>.filled(types.length, 0);
+    int maxDepth = 0;
+    for (int i = 0; i < types.length; i++) {
+      depths[i] = computeLongestInheritancePathToObject(types[i].element);
+      if (depths[i] > maxDepth) {
+        maxDepth = depths[i];
+      }
+    }
+    // ensure that the currently computed maxDepth is unique,
+    // otherwise, decrement and test for uniqueness again
+    for (; maxDepth >= 0; maxDepth--) {
+      int indexOfLeastUpperBound = -1;
+      int numberOfTypesAtMaxDepth = 0;
+      for (int m = 0; m < depths.length; m++) {
+        if (depths[m] == maxDepth) {
+          numberOfTypesAtMaxDepth++;
+          indexOfLeastUpperBound = m;
+        }
+      }
+      if (numberOfTypesAtMaxDepth == 1) {
+        return types[indexOfLeastUpperBound];
+      }
+    }
+    // Should be impossible--there should always be exactly one type with the
+    // maximum depth.
+    assert(false);
+    return null;
+  }
+
+  /**
+   * Return the intersection of the [first] and [second] sets of types, where
+   * intersection is based on the equality of the types themselves.
+   */
+  static List<InstantiatedClass> _intersection(
+    Set<InstantiatedClass> first,
+    Set<InstantiatedClass> second,
+  ) {
+    var result = first.toSet();
+    result.retainAll(second);
+    return result.toList();
+  }
+}
+
 /// Used to check for infinite loops, if we repeat the same type comparison.
 class TypeComparison {
   final DartType lhs;
@@ -2096,6 +2432,7 @@
    *
    * In strong mode, this is equivalent to [isSubtypeOf].
    */
+  @Deprecated('Use isSubtypeOf() instead.')
   bool isMoreSpecificThan(DartType leftType, DartType rightType);
 
   @override
@@ -2176,9 +2513,9 @@
     var result = mixinElement.type.instantiate(inferredTypes);
 
     for (int i = 0; i < srcs.length; i++) {
-      if (!srcs[i]
-          .substitute2(result.typeArguments, mixinElement.type.typeArguments)
-          .isEquivalentTo(dests[i])) {
+      if (srcs[i].substitute2(
+              result.typeArguments, mixinElement.type.typeArguments) !=
+          dests[i]) {
         // Failed to find an appropriate substitution
         return null;
       }
@@ -2213,9 +2550,23 @@
 
   /// Returns a non-nullable version of [type].  This is equivalent to the
   /// operation `NonNull` defined in the spec.
-  DartType promoteToNonNull(TypeImpl type) {
+  DartType promoteToNonNull(covariant TypeImpl type) {
     if (type.isDartCoreNull) return BottomTypeImpl.instance;
-    // TODO(mfairhurst): handle type parameter types
+
+    if (type is TypeParameterTypeImpl) {
+      var promotedElement = TypeParameterElementImpl.synthetic(
+        type.element.name,
+      );
+
+      var bound = type.element.bound ?? typeProvider.objectType;
+      promotedElement.bound = promoteToNonNull(bound);
+
+      return TypeParameterTypeImpl(
+        promotedElement,
+        nullabilitySuffix: NullabilitySuffix.none,
+      );
+    }
+
     return type.withNullability(NullabilitySuffix.none);
   }
 
@@ -2238,8 +2589,7 @@
       }
       return typeProvider.boolType;
     }
-    DartType intType = typeProvider.intType;
-    if (leftType == intType) {
+    if (leftType.isDartCoreInt) {
       // int op double
       if (operator == TokenType.MINUS ||
           operator == TokenType.PERCENT ||
@@ -2249,10 +2599,10 @@
           operator == TokenType.PERCENT_EQ ||
           operator == TokenType.PLUS_EQ ||
           operator == TokenType.STAR_EQ) {
-        DartType doubleType = typeProvider.doubleType;
-        if (rightType == doubleType) {
+        if (rightType.isDartCoreDouble) {
+          InterfaceTypeImpl doubleType = typeProvider.doubleType;
           if (featureSet.isEnabled(Feature.non_nullable)) {
-            return promoteToNonNull(doubleType as TypeImpl);
+            return promoteToNonNull(doubleType);
           }
           return doubleType;
         }
@@ -2268,9 +2618,10 @@
           operator == TokenType.PLUS_EQ ||
           operator == TokenType.STAR_EQ ||
           operator == TokenType.TILDE_SLASH_EQ) {
-        if (rightType == intType) {
+        if (rightType.isDartCoreInt) {
+          InterfaceTypeImpl intType = typeProvider.intType;
           if (featureSet.isEnabled(Feature.non_nullable)) {
-            return promoteToNonNull(intType as TypeImpl);
+            return promoteToNonNull(intType);
           }
           return intType;
         }
@@ -2282,20 +2633,36 @@
 
   @override
   DartType resolveToBound(DartType type) {
-    return instantiateToBounds(type);
+    if (type is TypeParameterTypeImpl) {
+      var element = type.element;
+
+      var bound = element.bound as TypeImpl;
+      if (bound == null) {
+        return typeProvider.objectType;
+      }
+
+      NullabilitySuffix nullabilitySuffix = type.nullabilitySuffix;
+      NullabilitySuffix newNullabilitySuffix;
+      if (nullabilitySuffix == NullabilitySuffix.question ||
+          bound.nullabilitySuffix == NullabilitySuffix.question) {
+        newNullabilitySuffix = NullabilitySuffix.question;
+      } else if (nullabilitySuffix == NullabilitySuffix.star ||
+          bound.nullabilitySuffix == NullabilitySuffix.star) {
+        newNullabilitySuffix = NullabilitySuffix.star;
+      } else {
+        newNullabilitySuffix = NullabilitySuffix.none;
+      }
+
+      var resolved = resolveToBound(bound) as TypeImpl;
+      return resolved.withNullability(newNullabilitySuffix);
+    }
+
+    return type;
   }
 
   /**
    * Tries to promote from the first type from the second type, and returns the
    * promoted type if it succeeds, otherwise null.
-   *
-   * In the Dart 1 type system, it is not possible to promote from or to
-   * `dynamic`, and we must be promoting to a more specific type, see
-   * [isMoreSpecificThan]. Also it will always return the promote [to] type or
-   * null.
-   *
-   * In strong mode, this can potentially return a different type, see
-   * the override in [Dart2TypeSystem].
    */
   DartType tryPromoteToType(DartType to, DartType from);
 
@@ -2653,7 +3020,8 @@
     // However in summary code it doesn't look like the AST node with span is
     // available.
     String prefix;
-    if ((genericType.name == "List" || genericType.name == "Map") &&
+    if (genericType != null &&
+        (genericType.name == "List" || genericType.name == "Map") &&
         genericType?.element?.library?.isDartCore == true) {
       // This will become:
       //     "List element"
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index a43d31c..75ab704 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -187,7 +187,7 @@
   @override
   bool moveNext() {
     if (_iteratorIndex < 0) {
-      if (_iterators.length == 0) {
+      if (_iterators.isEmpty) {
         _currentIterator = null;
         return false;
       }
diff --git a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
index 98a39ae..33dee1e 100644
--- a/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
+++ b/pkg/analyzer/lib/src/hint/sdk_constraint_verifier.dart
@@ -72,14 +72,14 @@
   VersionRange get before_2_2_2 =>
       new VersionRange(max: Version.parse('2.2.2'), includeMax: false);
 
-  /// Return a range covering every version up to, but not including, 2.3.2.
-  VersionRange get before_2_3_2 =>
-      new VersionRange(max: Version.parse('2.3.2'), includeMax: false);
+  /// Return a range covering every version up to, but not including, 2.5.0.
+  VersionRange get before_2_5_0 =>
+      new VersionRange(max: Version.parse('2.5.0'), includeMax: false);
 
   /// Return `true` if references to the constant-update-2018 features need to
   /// be checked.
   bool get checkConstantUpdate2018 => _checkConstantUpdate2018 ??=
-      !before_2_3_2.intersect(_versionConstraint).isEmpty;
+      !before_2_5_0.intersect(_versionConstraint).isEmpty;
 
   /// Return `true` if references to Future and Stream need to be checked.
   bool get checkFutureAndStream => _checkFutureAndStream ??=
@@ -149,6 +149,7 @@
   @override
   void visitForElement(ForElement node) {
     _validateUiAsCode(node);
+    _validateUiAsCodeInConstContext(node);
     bool wasInUiAsCode = _inUiAsCode;
     _inUiAsCode = true;
     super.visitForElement(node);
@@ -163,6 +164,7 @@
   @override
   void visitIfElement(IfElement node) {
     _validateUiAsCode(node);
+    _validateUiAsCodeInConstContext(node);
     bool wasInUiAsCode = _inUiAsCode;
     _inUiAsCode = true;
     super.visitIfElement(node);
@@ -232,6 +234,7 @@
   @override
   void visitSpreadElement(SpreadElement node) {
     _validateUiAsCode(node);
+    _validateUiAsCodeInConstContext(node);
     bool wasInUiAsCode = _inUiAsCode;
     _inUiAsCode = true;
     super.visitSpreadElement(node);
@@ -246,4 +249,16 @@
       _errorReporter.reportErrorForNode(HintCode.SDK_VERSION_UI_AS_CODE, node);
     }
   }
+
+  /// Given that the [node] is only valid when the ui-as-code feature is
+  /// enabled in a const context, check that the code will not be executed with
+  /// a version of the SDK that does not support the feature.
+  void _validateUiAsCodeInConstContext(AstNode node) {
+    if (checkConstantUpdate2018 &&
+        !_inUiAsCode &&
+        node.thisOrAncestorOfType<TypedLiteral>().isConst) {
+      _errorReporter.reportErrorForNode(
+          HintCode.SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT, node);
+    }
+  }
 }
diff --git a/pkg/analyzer/lib/src/lint/linter.dart b/pkg/analyzer/lib/src/lint/linter.dart
index 51a2b46..5f02024 100644
--- a/pkg/analyzer/lib/src/lint/linter.dart
+++ b/pkg/analyzer/lib/src/lint/linter.dart
@@ -15,6 +15,7 @@
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/constant/potentially_constant.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/error/lint_codes.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisErrorInfo, AnalysisErrorInfoImpl, AnalysisOptions, Logger;
@@ -210,6 +211,8 @@
 
   DeclaredVariables get declaredVariables;
 
+  InheritanceManager3 get inheritanceManager;
+
   TypeProvider get typeProvider;
 
   TypeSystem get typeSystem;
@@ -255,8 +258,18 @@
   @override
   final TypeSystem typeSystem;
 
-  LinterContextImpl(this.allUnits, this.currentUnit, this.declaredVariables,
-      this.typeProvider, this.typeSystem, this.analysisOptions);
+  @override
+  final InheritanceManager3 inheritanceManager;
+
+  LinterContextImpl(
+    this.allUnits,
+    this.currentUnit,
+    this.declaredVariables,
+    this.typeProvider,
+    this.typeSystem,
+    this.inheritanceManager,
+    this.analysisOptions,
+  );
 
   @override
   bool canBeConst(InstanceCreationExpression expression) {
diff --git a/pkg/analyzer/lib/src/services/available_declarations.dart b/pkg/analyzer/lib/src/services/available_declarations.dart
index 6de334c..70428bf 100644
--- a/pkg/analyzer/lib/src/services/available_declarations.dart
+++ b/pkg/analyzer/lib/src/services/available_declarations.dart
@@ -13,6 +13,7 @@
 import 'package:analyzer/file_system/file_system.dart';
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/session.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer/src/dart/scanner/reader.dart';
@@ -34,6 +35,8 @@
 /// A top-level public declaration.
 class Declaration {
   final List<Declaration> children;
+  final int codeLength;
+  final int codeOffset;
   final String defaultArgumentListString;
   final List<int> defaultArgumentListTextRanges;
   final String docComplete;
@@ -43,6 +46,7 @@
   final bool isDeprecated;
   final bool isFinal;
   final DeclarationKind kind;
+  final LineInfo lineInfo;
   final int locationOffset;
   final String locationPath;
   final int locationStartColumn;
@@ -61,6 +65,8 @@
 
   Declaration({
     @required this.children,
+    @required this.codeLength,
+    @required this.codeOffset,
     @required this.defaultArgumentListString,
     @required this.defaultArgumentListTextRanges,
     @required this.docComplete,
@@ -70,6 +76,7 @@
     @required this.isDeprecated,
     @required this.isFinal,
     @required this.kind,
+    @required this.lineInfo,
     @required this.locationOffset,
     @required this.locationPath,
     @required this.locationStartColumn,
@@ -102,9 +109,12 @@
   CONSTRUCTOR,
   ENUM,
   ENUM_CONSTANT,
+  EXTENSION,
+  FIELD,
   FUNCTION,
   FUNCTION_TYPE_ALIAS,
   GETTER,
+  METHOD,
   MIXIN,
   SETTER,
   VARIABLE
@@ -140,12 +150,29 @@
   /// The path prefix keys are sorted so that the longest keys are first.
   final Map<String, List<String>> _pathPrefixToDependencyPathList = {};
 
+  /// The set of paths of already checked known files, some of which were
+  /// added to [_knownPathList]. For example we skip non-API files.
+  final Set<String> _knownPathSet = Set<String>();
+
+  /// The list of paths of files known to this context - from the context
+  /// itself, from direct dependencies, from indirect dependencies.
+  ///
+  /// We include libraries from this list only when actual context dependencies
+  /// are not known. Dependencies are always know for Pub packages, but are
+  /// currently never known for Bazel packages.
+  final List<String> _knownPathList = [];
+
   DeclarationsContext(this._tracker, this._analysisContext);
 
   /// Return the combined information about all of the dartdoc directives in
   /// this context.
   DartdocDirectiveInfo get dartdocDirectiveInfo => _dartdocDirectiveInfo;
 
+  /// The set of features that are globally enabled for this context.
+  FeatureSet get featureSet {
+    return _analysisContext.analysisOptions.contextFeatures;
+  }
+
   /// Return libraries that are available to the file with the given [path].
   ///
   /// With `Pub`, files below the `pubspec.yaml` file can access libraries
@@ -167,6 +194,10 @@
       }
     }
 
+    if (_pathPrefixToDependencyPathList.isEmpty) {
+      _addLibrariesWithPaths(dependencyLibraries, _knownPathList);
+    }
+
     _Package package;
     for (var candidatePackage in _packages) {
       if (candidatePackage.contains(path)) {
@@ -376,6 +407,21 @@
     }
   }
 
+  void _scheduleKnownFiles() {
+    var session = _analysisContext.currentSession as AnalysisSessionImpl;
+    // ignore: deprecated_member_use_from_same_package
+    var analysisDriver = session.getDriver();
+
+    for (var path in analysisDriver.knownFiles) {
+      if (_knownPathSet.add(path)) {
+        if (!path.contains(r'/lib/src/') && !path.contains(r'\lib\src\')) {
+          _knownPathList.add(path);
+          _tracker._addFile(this, path);
+        }
+      }
+    }
+  }
+
   void _scheduleSdkLibraries() {
     // ignore: deprecated_member_use_from_same_package
     var sdk = _analysisContext.currentSession.sourceFactory.dartSdk;
@@ -435,14 +481,27 @@
   /// libraries, but parts are ignored when we detect them.
   final List<_ScheduledFile> _scheduledFiles = [];
 
+  /// The time when known files were last pulled.
+  DateTime _whenKnownFilesPulled = DateTime.fromMillisecondsSinceEpoch(0);
+
   DeclarationsTracker(this._byteStore, this._resourceProvider);
 
+  /// Return all known libraries.
+  Iterable<Library> get allLibraries {
+    return _idToLibrary.values;
+  }
+
   /// The stream of changes to the set of libraries used by the added contexts.
   Stream<LibraryChange> get changes => _changesController.stream;
 
   /// Return `true` if there is scheduled work to do, as a result of adding
   /// new contexts, or changes to files.
   bool get hasWork {
+    var now = DateTime.now();
+    if (now.difference(_whenKnownFilesPulled).inSeconds > 1) {
+      _whenKnownFilesPulled = now;
+      _pullKnownFiles();
+    }
     return _changedPaths.isNotEmpty || _scheduledFiles.isNotEmpty;
   }
 
@@ -693,6 +752,16 @@
       LibraryChange._(changedLibraries, removedLibraries),
     );
   }
+
+  /// Pull known files into [DeclarationsContext]s.
+  ///
+  /// This is a temporary support for Bazel repositories, because IDEA
+  /// does not yet give us dependencies for them.
+  void _pullKnownFiles() {
+    for (var context in _contexts.values) {
+      context._scheduleKnownFiles();
+    }
+  }
 }
 
 class Libraries {
@@ -792,8 +861,8 @@
   static const fieldReturnTypeMask = 1 << 2;
   static const fieldTypeParametersMask = 1 << 3;
 
-  static Declaration fromIdl(
-      String path, Declaration parent, idl.AvailableDeclaration d) {
+  static Declaration fromIdl(String path, LineInfo lineInfo, Declaration parent,
+      idl.AvailableDeclaration d) {
     var fieldMask = d.fieldMask;
     var hasDoc = fieldMask & fieldDocMask != 0;
     var hasParameters = fieldMask & fieldParametersMask != 0;
@@ -810,6 +879,8 @@
     var children = <Declaration>[];
     var declaration = Declaration(
       children: children,
+      codeLength: d.codeLength,
+      codeOffset: d.codeOffset,
       defaultArgumentListString: d.defaultArgumentListString.isNotEmpty
           ? d.defaultArgumentListString
           : null,
@@ -823,6 +894,7 @@
       isDeprecated: d.isDeprecated,
       isFinal: d.isFinal,
       kind: kind,
+      lineInfo: lineInfo,
       locationOffset: d.locationOffset,
       locationPath: path,
       locationStartColumn: d.locationStartColumn,
@@ -839,7 +911,7 @@
     );
 
     for (var childIdl in d.children) {
-      var child = fromIdl(path, declaration, childIdl);
+      var child = fromIdl(path, lineInfo, declaration, childIdl);
       children.add(child);
     }
 
@@ -858,12 +930,18 @@
         return DeclarationKind.ENUM;
       case idl.AvailableDeclarationKind.ENUM_CONSTANT:
         return DeclarationKind.ENUM_CONSTANT;
+      case idl.AvailableDeclarationKind.EXTENSION:
+        return DeclarationKind.EXTENSION;
+      case idl.AvailableDeclarationKind.FIELD:
+        return DeclarationKind.FIELD;
       case idl.AvailableDeclarationKind.FUNCTION:
         return DeclarationKind.FUNCTION;
       case idl.AvailableDeclarationKind.FUNCTION_TYPE_ALIAS:
         return DeclarationKind.FUNCTION_TYPE_ALIAS;
       case idl.AvailableDeclarationKind.GETTER:
         return DeclarationKind.GETTER;
+      case idl.AvailableDeclarationKind.METHOD:
+        return DeclarationKind.METHOD;
       case idl.AvailableDeclarationKind.MIXIN:
         return DeclarationKind.MIXIN;
       case idl.AvailableDeclarationKind.SETTER:
@@ -887,12 +965,18 @@
         return idl.AvailableDeclarationKind.ENUM;
       case DeclarationKind.ENUM_CONSTANT:
         return idl.AvailableDeclarationKind.ENUM_CONSTANT;
+      case DeclarationKind.EXTENSION:
+        return idl.AvailableDeclarationKind.EXTENSION;
+      case DeclarationKind.FIELD:
+        return idl.AvailableDeclarationKind.FIELD;
       case DeclarationKind.FUNCTION:
         return idl.AvailableDeclarationKind.FUNCTION;
       case DeclarationKind.FUNCTION_TYPE_ALIAS:
         return idl.AvailableDeclarationKind.FUNCTION_TYPE_ALIAS;
       case DeclarationKind.GETTER:
         return idl.AvailableDeclarationKind.GETTER;
+      case DeclarationKind.METHOD:
+        return idl.AvailableDeclarationKind.METHOD;
       case DeclarationKind.MIXIN:
         return idl.AvailableDeclarationKind.MIXIN;
       case DeclarationKind.SETTER:
@@ -987,7 +1071,7 @@
 
 class _File {
   /// The version of data format, should be incremented on every format change.
-  static const int DATA_VERSION = 11;
+  static const int DATA_VERSION = 13;
 
   /// The next value for [id].
   static int _nextId = 0;
@@ -999,6 +1083,8 @@
   final Uri uri;
 
   bool exists = false;
+  List<int> lineStarts;
+  LineInfo lineInfo;
   bool isLibrary = false;
   bool isLibraryDeprecated = false;
   List<_Export> exports = [];
@@ -1071,7 +1157,7 @@
     if (bytes == null) {
       content ??= _readContent(resource);
 
-      CompilationUnit unit = _parse(content);
+      CompilationUnit unit = _parse(context.featureSet, content);
       _buildFileDeclarations(unit);
       _extractDartdocInfoFromUnit(unit);
       _putFileDeclarationsToByteStore(contentKey);
@@ -1118,6 +1204,9 @@
   }
 
   void _buildFileDeclarations(CompilationUnit unit) {
+    lineInfo = unit.lineInfo;
+    lineStarts = lineInfo.lineStarts;
+
     isLibrary = true;
     exports = [];
     fileDeclarations = [];
@@ -1159,7 +1248,20 @@
       }
     }
 
-    var lineInfo = unit.lineInfo;
+    int codeOffset = 0;
+    int codeLength = 0;
+
+    void setCodeRange(AstNode node) {
+      if (node is VariableDeclaration) {
+        var variables = node.parent as VariableDeclarationList;
+        var i = variables.variables.indexOf(node);
+        codeOffset = (i == 0 ? variables.parent : node).offset;
+        codeLength = node.end - codeOffset;
+      } else {
+        codeOffset = node.offset;
+        codeLength = node.length;
+      }
+    }
 
     String docComplete = null;
     String docSummary = null;
@@ -1201,6 +1303,8 @@
       var lineLocation = lineInfo.getLocation(locationOffset);
       var declaration = Declaration(
         children: <Declaration>[],
+        codeLength: codeLength,
+        codeOffset: codeOffset,
         defaultArgumentListString: defaultArgumentListString,
         defaultArgumentListTextRanges: defaultArgumentListTextRanges,
         docComplete: docComplete,
@@ -1210,6 +1314,7 @@
         isDeprecated: isDeprecated,
         isFinal: isFinal,
         kind: kind,
+        lineInfo: lineInfo,
         locationOffset: locationOffset,
         locationPath: path,
         name: name.name,
@@ -1234,24 +1339,18 @@
     }
 
     for (var node in unit.declarations) {
+      setCodeRange(node);
       setDartDoc(node);
       var isDeprecated = _hasDeprecatedAnnotation(node);
 
-      if (node is ClassDeclaration) {
-        var classDeclaration = addDeclaration(
-          isAbstract: node.isAbstract,
-          isDeprecated: isDeprecated,
-          kind: DeclarationKind.CLASS,
-          name: node.name,
-        );
-        if (classDeclaration == null) continue;
+      var hasConstructor = false;
+      void addClassMembers(Declaration parent, List<ClassMember> members) {
+        for (var classMember in members) {
+          setCodeRange(classMember);
+          setDartDoc(classMember);
+          isDeprecated = _hasDeprecatedAnnotation(classMember);
 
-        var hasConstructor = false;
-        for (var classMember in node.members) {
           if (classMember is ConstructorDeclaration) {
-            setDartDoc(classMember);
-            isDeprecated = _hasDeprecatedAnnotation(classMember);
-
             var parameters = classMember.parameters;
             var defaultArguments = _computeDefaultArguments(parameters);
 
@@ -1273,18 +1372,88 @@
               parameters: parameters.toSource(),
               parameterNames: _getFormalParameterNames(parameters),
               parameterTypes: _getFormalParameterTypes(parameters),
-              parent: classDeclaration,
+              parent: parent,
               requiredParameterCount:
                   _getFormalParameterRequiredCount(parameters),
-              returnType: node.name.name,
+              returnType: classMember.returnType.name,
             );
             hasConstructor = true;
+          } else if (classMember is FieldDeclaration) {
+            var isConst = classMember.fields.isConst;
+            var isFinal = classMember.fields.isFinal;
+            for (var field in classMember.fields.variables) {
+              setCodeRange(field);
+              addDeclaration(
+                isConst: isConst,
+                isDeprecated: isDeprecated,
+                isFinal: isFinal,
+                kind: DeclarationKind.FIELD,
+                name: field.name,
+                parent: parent,
+                relevanceTags: RelevanceTags._forExpression(field.initializer),
+                returnType: _getTypeAnnotationString(classMember.fields.type),
+              );
+            }
+          } else if (classMember is MethodDeclaration) {
+            var parameters = classMember.parameters;
+            if (classMember.isGetter) {
+              addDeclaration(
+                isDeprecated: isDeprecated,
+                kind: DeclarationKind.GETTER,
+                name: classMember.name,
+                parent: parent,
+                returnType: _getTypeAnnotationString(classMember.returnType),
+              );
+            } else if (classMember.isSetter) {
+              addDeclaration(
+                isDeprecated: isDeprecated,
+                kind: DeclarationKind.SETTER,
+                name: classMember.name,
+                parameters: parameters.toSource(),
+                parameterNames: _getFormalParameterNames(parameters),
+                parameterTypes: _getFormalParameterTypes(parameters),
+                parent: parent,
+                requiredParameterCount:
+                    _getFormalParameterRequiredCount(parameters),
+              );
+            } else {
+              var defaultArguments = _computeDefaultArguments(parameters);
+              addDeclaration(
+                defaultArgumentListString: defaultArguments?.text,
+                defaultArgumentListTextRanges: defaultArguments?.ranges,
+                isDeprecated: isDeprecated,
+                kind: DeclarationKind.METHOD,
+                name: classMember.name,
+                parameters: parameters.toSource(),
+                parameterNames: _getFormalParameterNames(parameters),
+                parameterTypes: _getFormalParameterTypes(parameters),
+                parent: parent,
+                requiredParameterCount:
+                    _getFormalParameterRequiredCount(parameters),
+                returnType: _getTypeAnnotationString(classMember.returnType),
+                typeParameters: classMember.typeParameters?.toSource(),
+              );
+            }
           }
         }
+      }
+
+      if (node is ClassDeclaration) {
+        var classDeclaration = addDeclaration(
+          isAbstract: node.isAbstract,
+          isDeprecated: isDeprecated,
+          kind: DeclarationKind.CLASS,
+          name: node.name,
+        );
+        if (classDeclaration == null) continue;
+
+        addClassMembers(classDeclaration, node.members);
 
         if (!hasConstructor) {
           classDeclaration.children.add(Declaration(
             children: [],
+            codeLength: codeLength,
+            codeOffset: codeOffset,
             defaultArgumentListString: null,
             defaultArgumentListTextRanges: null,
             docComplete: null,
@@ -1297,6 +1466,7 @@
             locationOffset: -1,
             locationPath: path,
             name: '',
+            lineInfo: lineInfo,
             locationStartColumn: 0,
             locationStartLine: 0,
             parameters: '()',
@@ -1333,6 +1503,14 @@
             parent: enumDeclaration,
           );
         }
+      } else if (node is ExtensionDeclaration) {
+        if (node.name != null) {
+          addDeclaration(
+            isDeprecated: isDeprecated,
+            kind: DeclarationKind.EXTENSION,
+            name: node.name,
+          );
+        }
       } else if (node is FunctionDeclaration) {
         var functionExpression = node.functionExpression;
         var parameters = functionExpression.parameters;
@@ -1401,15 +1579,18 @@
           typeParameters: node.typeParameters?.toSource(),
         );
       } else if (node is MixinDeclaration) {
-        addDeclaration(
+        var mixinDeclaration = addDeclaration(
           isDeprecated: isDeprecated,
           kind: DeclarationKind.MIXIN,
           name: node.name,
         );
+        if (mixinDeclaration == null) continue;
+        addClassMembers(mixinDeclaration, node.members);
       } else if (node is TopLevelVariableDeclaration) {
         var isConst = node.variables.isConst;
         var isFinal = node.variables.isFinal;
         for (var variable in node.variables.variables) {
+          setCodeRange(variable);
           addDeclaration(
             isConst: isConst,
             isDeprecated: isDeprecated,
@@ -1476,6 +1657,7 @@
 
   void _putFileDeclarationsToByteStore(String contentKey) {
     var builder = idl.AvailableFileBuilder(
+      lineStarts: lineStarts,
       isLibrary: isLibrary,
       isLibraryDeprecated: isLibraryDeprecated,
       exports: exports.map((e) {
@@ -1501,6 +1683,9 @@
   void _readFileDeclarationsFromBytes(List<int> bytes) {
     var idlFile = idl.AvailableFile.fromBuffer(bytes);
 
+    lineStarts = idlFile.lineStarts.toList();
+    lineInfo = LineInfo(lineStarts);
+
     isLibrary = idlFile.isLibrary;
     isLibraryDeprecated = idlFile.isLibraryDeprecated;
 
@@ -1519,7 +1704,7 @@
     }).toList();
 
     fileDeclarations = idlFile.declarations.map((e) {
-      return _DeclarationStorage.fromIdl(path, null, e);
+      return _DeclarationStorage.fromIdl(path, lineInfo, null, e);
     }).toList();
 
     templateNames = idlFile.directiveInfo.templateNames.toList();
@@ -1640,13 +1825,11 @@
     return false;
   }
 
-  static CompilationUnit _parse(String content) {
+  static CompilationUnit _parse(FeatureSet featureSet, String content) {
     var errorListener = AnalysisErrorListener.NULL_LISTENER;
     var source = StringSource(content, '');
 
     var reader = new CharSequenceReader(content);
-    // TODO(paulberry): figure out the appropriate FeatureSet to use here
-    var featureSet = FeatureSet.fromEnableFlags([]);
     var scanner = new Scanner(null, reader, errorListener)
       ..configureFeatures(featureSet);
     var token = scanner.tokenize();
diff --git a/pkg/analyzer/lib/src/summary/expr_builder.dart b/pkg/analyzer/lib/src/summary/expr_builder.dart
index 7f07f7e..f34a7ba 100644
--- a/pkg/analyzer/lib/src/summary/expr_builder.dart
+++ b/pkg/analyzer/lib/src/summary/expr_builder.dart
@@ -10,8 +10,8 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/resolver/ast_rewrite.dart';
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/resolver.dart' show AstRewriteVisitor;
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/summary/idl.dart';
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 93b3719..3b231d7 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -2270,6 +2270,8 @@
     with _AvailableDeclarationMixin
     implements idl.AvailableDeclaration {
   List<AvailableDeclarationBuilder> _children;
+  int _codeLength;
+  int _codeOffset;
   String _defaultArgumentListString;
   List<int> _defaultArgumentListTextRanges;
   String _docComplete;
@@ -2301,6 +2303,22 @@
   }
 
   @override
+  int get codeLength => _codeLength ??= 0;
+
+  set codeLength(int value) {
+    assert(value == null || value >= 0);
+    this._codeLength = value;
+  }
+
+  @override
+  int get codeOffset => _codeOffset ??= 0;
+
+  set codeOffset(int value) {
+    assert(value == null || value >= 0);
+    this._codeOffset = value;
+  }
+
+  @override
   String get defaultArgumentListString => _defaultArgumentListString ??= '';
 
   set defaultArgumentListString(String value) {
@@ -2464,6 +2482,8 @@
 
   AvailableDeclarationBuilder(
       {List<AvailableDeclarationBuilder> children,
+      int codeLength,
+      int codeOffset,
       String defaultArgumentListString,
       List<int> defaultArgumentListTextRanges,
       String docComplete,
@@ -2486,6 +2506,8 @@
       String returnType,
       String typeParameters})
       : _children = children,
+        _codeLength = codeLength,
+        _codeOffset = codeOffset,
         _defaultArgumentListString = defaultArgumentListString,
         _defaultArgumentListTextRanges = defaultArgumentListTextRanges,
         _docComplete = docComplete,
@@ -2523,6 +2545,8 @@
         x?.collectApiSignature(signature);
       }
     }
+    signature.addInt(this._codeLength ?? 0);
+    signature.addInt(this._codeOffset ?? 0);
     signature.addString(this._defaultArgumentListString ?? '');
     if (this._defaultArgumentListTextRanges == null) {
       signature.addInt(0);
@@ -2634,68 +2658,74 @@
     if (offset_children != null) {
       fbBuilder.addOffset(0, offset_children);
     }
+    if (_codeLength != null && _codeLength != 0) {
+      fbBuilder.addUint32(1, _codeLength);
+    }
+    if (_codeOffset != null && _codeOffset != 0) {
+      fbBuilder.addUint32(2, _codeOffset);
+    }
     if (offset_defaultArgumentListString != null) {
-      fbBuilder.addOffset(1, offset_defaultArgumentListString);
+      fbBuilder.addOffset(3, offset_defaultArgumentListString);
     }
     if (offset_defaultArgumentListTextRanges != null) {
-      fbBuilder.addOffset(2, offset_defaultArgumentListTextRanges);
+      fbBuilder.addOffset(4, offset_defaultArgumentListTextRanges);
     }
     if (offset_docComplete != null) {
-      fbBuilder.addOffset(3, offset_docComplete);
+      fbBuilder.addOffset(5, offset_docComplete);
     }
     if (offset_docSummary != null) {
-      fbBuilder.addOffset(4, offset_docSummary);
+      fbBuilder.addOffset(6, offset_docSummary);
     }
     if (_fieldMask != null && _fieldMask != 0) {
-      fbBuilder.addUint32(5, _fieldMask);
+      fbBuilder.addUint32(7, _fieldMask);
     }
     if (_isAbstract == true) {
-      fbBuilder.addBool(6, true);
-    }
-    if (_isConst == true) {
-      fbBuilder.addBool(7, true);
-    }
-    if (_isDeprecated == true) {
       fbBuilder.addBool(8, true);
     }
-    if (_isFinal == true) {
+    if (_isConst == true) {
       fbBuilder.addBool(9, true);
     }
+    if (_isDeprecated == true) {
+      fbBuilder.addBool(10, true);
+    }
+    if (_isFinal == true) {
+      fbBuilder.addBool(11, true);
+    }
     if (_kind != null && _kind != idl.AvailableDeclarationKind.CLASS) {
-      fbBuilder.addUint8(10, _kind.index);
+      fbBuilder.addUint8(12, _kind.index);
     }
     if (_locationOffset != null && _locationOffset != 0) {
-      fbBuilder.addUint32(11, _locationOffset);
+      fbBuilder.addUint32(13, _locationOffset);
     }
     if (_locationStartColumn != null && _locationStartColumn != 0) {
-      fbBuilder.addUint32(12, _locationStartColumn);
+      fbBuilder.addUint32(14, _locationStartColumn);
     }
     if (_locationStartLine != null && _locationStartLine != 0) {
-      fbBuilder.addUint32(13, _locationStartLine);
+      fbBuilder.addUint32(15, _locationStartLine);
     }
     if (offset_name != null) {
-      fbBuilder.addOffset(14, offset_name);
+      fbBuilder.addOffset(16, offset_name);
     }
     if (offset_parameterNames != null) {
-      fbBuilder.addOffset(15, offset_parameterNames);
+      fbBuilder.addOffset(17, offset_parameterNames);
     }
     if (offset_parameters != null) {
-      fbBuilder.addOffset(16, offset_parameters);
+      fbBuilder.addOffset(18, offset_parameters);
     }
     if (offset_parameterTypes != null) {
-      fbBuilder.addOffset(17, offset_parameterTypes);
+      fbBuilder.addOffset(19, offset_parameterTypes);
     }
     if (offset_relevanceTags != null) {
-      fbBuilder.addOffset(18, offset_relevanceTags);
+      fbBuilder.addOffset(20, offset_relevanceTags);
     }
     if (_requiredParameterCount != null && _requiredParameterCount != 0) {
-      fbBuilder.addUint32(19, _requiredParameterCount);
+      fbBuilder.addUint32(21, _requiredParameterCount);
     }
     if (offset_returnType != null) {
-      fbBuilder.addOffset(20, offset_returnType);
+      fbBuilder.addOffset(22, offset_returnType);
     }
     if (offset_typeParameters != null) {
-      fbBuilder.addOffset(21, offset_typeParameters);
+      fbBuilder.addOffset(23, offset_typeParameters);
     }
     return fbBuilder.endTable();
   }
@@ -2719,6 +2749,8 @@
   _AvailableDeclarationImpl(this._bc, this._bcOffset);
 
   List<idl.AvailableDeclaration> _children;
+  int _codeLength;
+  int _codeOffset;
   String _defaultArgumentListString;
   List<int> _defaultArgumentListTextRanges;
   String _docComplete;
@@ -2750,139 +2782,152 @@
   }
 
   @override
+  int get codeLength {
+    _codeLength ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 1, 0);
+    return _codeLength;
+  }
+
+  @override
+  int get codeOffset {
+    _codeOffset ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 2, 0);
+    return _codeOffset;
+  }
+
+  @override
   String get defaultArgumentListString {
     _defaultArgumentListString ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 1, '');
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
     return _defaultArgumentListString;
   }
 
   @override
   List<int> get defaultArgumentListTextRanges {
     _defaultArgumentListTextRanges ??=
-        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 2, const <int>[]);
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 4, const <int>[]);
     return _defaultArgumentListTextRanges;
   }
 
   @override
   String get docComplete {
-    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 3, '');
+    _docComplete ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 5, '');
     return _docComplete;
   }
 
   @override
   String get docSummary {
-    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 4, '');
+    _docSummary ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 6, '');
     return _docSummary;
   }
 
   @override
   int get fieldMask {
-    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 5, 0);
+    _fieldMask ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 7, 0);
     return _fieldMask;
   }
 
   @override
   bool get isAbstract {
-    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 6, false);
+    _isAbstract ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
     return _isAbstract;
   }
 
   @override
   bool get isConst {
-    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 7, false);
+    _isConst ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
     return _isConst;
   }
 
   @override
   bool get isDeprecated {
-    _isDeprecated ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 8, false);
+    _isDeprecated ??=
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 10, false);
     return _isDeprecated;
   }
 
   @override
   bool get isFinal {
-    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 9, false);
+    _isFinal ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 11, false);
     return _isFinal;
   }
 
   @override
   idl.AvailableDeclarationKind get kind {
     _kind ??= const _AvailableDeclarationKindReader()
-        .vTableGet(_bc, _bcOffset, 10, idl.AvailableDeclarationKind.CLASS);
+        .vTableGet(_bc, _bcOffset, 12, idl.AvailableDeclarationKind.CLASS);
     return _kind;
   }
 
   @override
   int get locationOffset {
     _locationOffset ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 11, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 13, 0);
     return _locationOffset;
   }
 
   @override
   int get locationStartColumn {
     _locationStartColumn ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 12, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 14, 0);
     return _locationStartColumn;
   }
 
   @override
   int get locationStartLine {
     _locationStartLine ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 13, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
     return _locationStartLine;
   }
 
   @override
   String get name {
-    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 14, '');
+    _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 16, '');
     return _name;
   }
 
   @override
   List<String> get parameterNames {
     _parameterNames ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 15, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 17, const <String>[]);
     return _parameterNames;
   }
 
   @override
   String get parameters {
-    _parameters ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 16, '');
+    _parameters ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 18, '');
     return _parameters;
   }
 
   @override
   List<String> get parameterTypes {
     _parameterTypes ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 17, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 19, const <String>[]);
     return _parameterTypes;
   }
 
   @override
   List<String> get relevanceTags {
     _relevanceTags ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 18, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 20, const <String>[]);
     return _relevanceTags;
   }
 
   @override
   int get requiredParameterCount {
     _requiredParameterCount ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 19, 0);
+        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 21, 0);
     return _requiredParameterCount;
   }
 
   @override
   String get returnType {
-    _returnType ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    _returnType ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 22, '');
     return _returnType;
   }
 
   @override
   String get typeParameters {
     _typeParameters ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 21, '');
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 23, '');
     return _typeParameters;
   }
 }
@@ -2893,6 +2938,8 @@
     Map<String, Object> _result = <String, Object>{};
     if (children.isNotEmpty)
       _result["children"] = children.map((_value) => _value.toJson()).toList();
+    if (codeLength != 0) _result["codeLength"] = codeLength;
+    if (codeOffset != 0) _result["codeOffset"] = codeOffset;
     if (defaultArgumentListString != '')
       _result["defaultArgumentListString"] = defaultArgumentListString;
     if (defaultArgumentListTextRanges.isNotEmpty)
@@ -2926,6 +2973,8 @@
   @override
   Map<String, Object> toMap() => {
         "children": children,
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
         "defaultArgumentListString": defaultArgumentListString,
         "defaultArgumentListTextRanges": defaultArgumentListTextRanges,
         "docComplete": docComplete,
@@ -2961,6 +3010,7 @@
   List<AvailableFileExportBuilder> _exports;
   bool _isLibrary;
   bool _isLibraryDeprecated;
+  List<int> _lineStarts;
   List<String> _parts;
 
   @override
@@ -3006,6 +3056,15 @@
   }
 
   @override
+  List<int> get lineStarts => _lineStarts ??= <int>[];
+
+  /// Offsets of the first character of each line in the source code.
+  set lineStarts(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._lineStarts = value;
+  }
+
+  @override
   List<String> get parts => _parts ??= <String>[];
 
   /// URIs of `part` directives.
@@ -3019,12 +3078,14 @@
       List<AvailableFileExportBuilder> exports,
       bool isLibrary,
       bool isLibraryDeprecated,
+      List<int> lineStarts,
       List<String> parts})
       : _declarations = declarations,
         _directiveInfo = directiveInfo,
         _exports = exports,
         _isLibrary = isLibrary,
         _isLibraryDeprecated = isLibraryDeprecated,
+        _lineStarts = lineStarts,
         _parts = parts;
 
   /// Flush [informative] data recursively.
@@ -3032,6 +3093,7 @@
     _declarations?.forEach((b) => b.flushInformative());
     _directiveInfo?.flushInformative();
     _exports?.forEach((b) => b.flushInformative());
+    _lineStarts = null;
   }
 
   /// Accumulate non-[informative] data into [signature].
@@ -3044,6 +3106,8 @@
         x?.collectApiSignature(signature);
       }
     }
+    signature.addBool(this._directiveInfo != null);
+    this._directiveInfo?.collectApiSignature(signature);
     if (this._exports == null) {
       signature.addInt(0);
     } else {
@@ -3062,8 +3126,6 @@
         signature.addString(x);
       }
     }
-    signature.addBool(this._directiveInfo != null);
-    this._directiveInfo?.collectApiSignature(signature);
   }
 
   List<int> toBuffer() {
@@ -3075,6 +3137,7 @@
     fb.Offset offset_declarations;
     fb.Offset offset_directiveInfo;
     fb.Offset offset_exports;
+    fb.Offset offset_lineStarts;
     fb.Offset offset_parts;
     if (!(_declarations == null || _declarations.isEmpty)) {
       offset_declarations = fbBuilder
@@ -3087,6 +3150,9 @@
       offset_exports = fbBuilder
           .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (!(_lineStarts == null || _lineStarts.isEmpty)) {
+      offset_lineStarts = fbBuilder.writeListUint32(_lineStarts);
+    }
     if (!(_parts == null || _parts.isEmpty)) {
       offset_parts = fbBuilder
           .writeList(_parts.map((b) => fbBuilder.writeString(b)).toList());
@@ -3096,19 +3162,22 @@
       fbBuilder.addOffset(0, offset_declarations);
     }
     if (offset_directiveInfo != null) {
-      fbBuilder.addOffset(5, offset_directiveInfo);
+      fbBuilder.addOffset(1, offset_directiveInfo);
     }
     if (offset_exports != null) {
-      fbBuilder.addOffset(1, offset_exports);
+      fbBuilder.addOffset(2, offset_exports);
     }
     if (_isLibrary == true) {
-      fbBuilder.addBool(2, true);
-    }
-    if (_isLibraryDeprecated == true) {
       fbBuilder.addBool(3, true);
     }
+    if (_isLibraryDeprecated == true) {
+      fbBuilder.addBool(4, true);
+    }
+    if (offset_lineStarts != null) {
+      fbBuilder.addOffset(5, offset_lineStarts);
+    }
     if (offset_parts != null) {
-      fbBuilder.addOffset(4, offset_parts);
+      fbBuilder.addOffset(6, offset_parts);
     }
     return fbBuilder.endTable();
   }
@@ -3140,6 +3209,7 @@
   List<idl.AvailableFileExport> _exports;
   bool _isLibrary;
   bool _isLibraryDeprecated;
+  List<int> _lineStarts;
   List<String> _parts;
 
   @override
@@ -3153,7 +3223,7 @@
   @override
   idl.DirectiveInfo get directiveInfo {
     _directiveInfo ??=
-        const _DirectiveInfoReader().vTableGet(_bc, _bcOffset, 5, null);
+        const _DirectiveInfoReader().vTableGet(_bc, _bcOffset, 1, null);
     return _directiveInfo;
   }
 
@@ -3161,27 +3231,34 @@
   List<idl.AvailableFileExport> get exports {
     _exports ??= const fb.ListReader<idl.AvailableFileExport>(
             const _AvailableFileExportReader())
-        .vTableGet(_bc, _bcOffset, 1, const <idl.AvailableFileExport>[]);
+        .vTableGet(_bc, _bcOffset, 2, const <idl.AvailableFileExport>[]);
     return _exports;
   }
 
   @override
   bool get isLibrary {
-    _isLibrary ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 2, false);
+    _isLibrary ??= const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
     return _isLibrary;
   }
 
   @override
   bool get isLibraryDeprecated {
     _isLibraryDeprecated ??=
-        const fb.BoolReader().vTableGet(_bc, _bcOffset, 3, false);
+        const fb.BoolReader().vTableGet(_bc, _bcOffset, 4, false);
     return _isLibraryDeprecated;
   }
 
   @override
+  List<int> get lineStarts {
+    _lineStarts ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 5, const <int>[]);
+    return _lineStarts;
+  }
+
+  @override
   List<String> get parts {
     _parts ??= const fb.ListReader<String>(const fb.StringReader())
-        .vTableGet(_bc, _bcOffset, 4, const <String>[]);
+        .vTableGet(_bc, _bcOffset, 6, const <String>[]);
     return _parts;
   }
 }
@@ -3200,6 +3277,7 @@
     if (isLibrary != false) _result["isLibrary"] = isLibrary;
     if (isLibraryDeprecated != false)
       _result["isLibraryDeprecated"] = isLibraryDeprecated;
+    if (lineStarts.isNotEmpty) _result["lineStarts"] = lineStarts;
     if (parts.isNotEmpty) _result["parts"] = parts;
     return _result;
   }
@@ -3211,6 +3289,7 @@
         "exports": exports,
         "isLibrary": isLibrary,
         "isLibraryDeprecated": isLibraryDeprecated,
+        "lineStarts": lineStarts,
         "parts": parts,
       };
 
@@ -4926,8 +5005,8 @@
   LinkedNodeBuilder _variantField_6;
   LinkedNodeBuilder _variantField_7;
   int _variantField_17;
-  LinkedNodeTypeBuilder _variantField_23;
   LinkedNodeBuilder _variantField_8;
+  LinkedNodeTypeSubstitutionBuilder _variantField_38;
   int _variantField_15;
   idl.UnlinkedTokenType _variantField_28;
   bool _variantField_27;
@@ -4942,6 +5021,7 @@
   idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
   LinkedNodeTypeBuilder _variantField_25;
+  String _variantField_20;
   int _flags;
   String _variantField_1;
   int _variantField_36;
@@ -4951,10 +5031,10 @@
   idl.LinkedNodeKind _kind;
   List<String> _variantField_34;
   String _name;
-  String _variantField_20;
   bool _variantField_31;
   idl.UnlinkedTokenType _variantField_35;
   TopLevelInferenceErrorBuilder _variantField_32;
+  LinkedNodeTypeBuilder _variantField_23;
   LinkedNodeBuilder _variantField_11;
   String _variantField_22;
   int _variantField_19;
@@ -5308,6 +5388,7 @@
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -5348,6 +5429,7 @@
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -5541,6 +5623,12 @@
   }
 
   @override
+  LinkedNodeBuilder get extensionDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    return _variantField_6;
+  }
+
+  @override
   LinkedNodeBuilder get fieldDeclaration_fields {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     return _variantField_6;
@@ -5973,6 +6061,11 @@
     _variantField_6 = value;
   }
 
+  set extensionDeclaration_typeParameters(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_6 = value;
+  }
+
   set fieldDeclaration_fields(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     _variantField_6 = value;
@@ -6320,6 +6413,12 @@
   }
 
   @override
+  LinkedNodeBuilder get extensionDeclaration_extendedType {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    return _variantField_7;
+  }
+
+  @override
   LinkedNodeBuilder get fieldFormalParameter_typeParameters {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     return _variantField_7;
@@ -6573,6 +6672,11 @@
     _variantField_7 = value;
   }
 
+  set extensionDeclaration_extendedType(LinkedNodeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_7 = value;
+  }
+
   set fieldFormalParameter_typeParameters(LinkedNodeBuilder value) {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     _variantField_7 = value;
@@ -6744,139 +6848,6 @@
   }
 
   @override
-  LinkedNodeTypeBuilder get annotation_elementType {
-    assert(kind == idl.LinkedNodeKind.annotation);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get assignmentExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.assignmentExpression);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get binaryExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get constructorName_elementType {
-    assert(kind == idl.LinkedNodeKind.constructorName);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get indexExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get postfixExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.postfixExpression);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get prefixExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.prefixExpression);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get redirectingConstructorInvocation_elementType {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get simpleIdentifier_elementType {
-    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get superConstructorInvocation_elementType {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    return _variantField_23;
-  }
-
-  @override
-  LinkedNodeTypeBuilder get typeParameter_defaultType {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    return _variantField_23;
-  }
-
-  set annotation_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.annotation);
-    _variantField_23 = value;
-  }
-
-  set assignmentExpression_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.assignmentExpression);
-    _variantField_23 = value;
-  }
-
-  set binaryExpression_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    _variantField_23 = value;
-  }
-
-  set constructorName_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.constructorName);
-    _variantField_23 = value;
-  }
-
-  set indexExpression_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    _variantField_23 = value;
-  }
-
-  set postfixExpression_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.postfixExpression);
-    _variantField_23 = value;
-  }
-
-  set prefixExpression_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.prefixExpression);
-    _variantField_23 = value;
-  }
-
-  set redirectingConstructorInvocation_elementType(
-      LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    _variantField_23 = value;
-  }
-
-  set simpleIdentifier_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
-    _variantField_23 = value;
-  }
-
-  set superConstructorInvocation_elementType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    _variantField_23 = value;
-  }
-
-  set typeName_type(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_23 = value;
-  }
-
-  set typeParameter_defaultType(LinkedNodeTypeBuilder value) {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    _variantField_23 = value;
-  }
-
-  @override
   LinkedNodeBuilder get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     return _variantField_8;
@@ -7053,6 +7024,121 @@
   }
 
   @override
+  LinkedNodeTypeSubstitutionBuilder get annotation_substitution {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get assignmentExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get binaryExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get constructorName_substitution {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get indexExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get postfixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get prefixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder
+      get redirectingConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder get simpleIdentifier_substitution {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    return _variantField_38;
+  }
+
+  @override
+  LinkedNodeTypeSubstitutionBuilder
+      get superConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    return _variantField_38;
+  }
+
+  set annotation_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_38 = value;
+  }
+
+  set assignmentExpression_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_38 = value;
+  }
+
+  set binaryExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_38 = value;
+  }
+
+  set constructorName_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_38 = value;
+  }
+
+  set indexExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_38 = value;
+  }
+
+  set postfixExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_38 = value;
+  }
+
+  set prefixExpression_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_38 = value;
+  }
+
+  set redirectingConstructorInvocation_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_38 = value;
+  }
+
+  set simpleIdentifier_substitution(LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_38 = value;
+  }
+
+  set superConstructorInvocation_substitution(
+      LinkedNodeTypeSubstitutionBuilder value) {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_38 = value;
+  }
+
+  @override
   int get assignmentExpression_element {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     return _variantField_15 ??= 0;
@@ -7083,12 +7169,6 @@
   }
 
   @override
-  int get importDirective_prefixOffset {
-    assert(kind == idl.LinkedNodeKind.importDirective);
-    return _variantField_15 ??= 0;
-  }
-
-  @override
   int get indexExpression_element {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     return _variantField_15 ??= 0;
@@ -7160,12 +7240,6 @@
     _variantField_15 = value;
   }
 
-  set importDirective_prefixOffset(int value) {
-    assert(kind == idl.LinkedNodeKind.importDirective);
-    assert(value == null || value >= 0);
-    _variantField_15 = value;
-  }
-
   set indexExpression_element(int value) {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     assert(value == null || value >= 0);
@@ -7404,6 +7478,12 @@
   }
 
   @override
+  List<LinkedNodeBuilder> get extensionDeclaration_members {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    return _variantField_5 ??= <LinkedNodeBuilder>[];
+  }
+
+  @override
   List<LinkedNodeBuilder> get forParts_updaters {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
@@ -7416,6 +7496,11 @@
     _variantField_5 = value;
   }
 
+  set extensionDeclaration_members(List<LinkedNodeBuilder> value) {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_5 = value;
+  }
+
   set forParts_updaters(List<LinkedNodeBuilder> value) {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
@@ -7619,6 +7704,41 @@
   }
 
   @override
+  String get extensionDeclaration_refName {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    return _variantField_20 ??= '';
+  }
+
+  @override
+  String get namespaceDirective_selectedUri {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_20 ??= '';
+  }
+
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    return _variantField_20 ??= '';
+  }
+
+  set extensionDeclaration_refName(String value) {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_20 = value;
+  }
+
+  set namespaceDirective_selectedUri(String value) {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_20 = value;
+  }
+
+  set simpleStringLiteral_value(String value) {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 = value;
+  }
+
+  @override
   int get flags => _flags ??= 0;
 
   set flags(int value) {
@@ -7648,18 +7768,21 @@
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
         kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.hideCombinator ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.libraryDirective ||
         kind == idl.LinkedNodeKind.methodDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration ||
         kind == idl.LinkedNodeKind.partDirective ||
         kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.showCombinator ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
         kind == idl.LinkedNodeKind.typeParameter ||
@@ -7678,18 +7801,21 @@
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
         kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.hideCombinator ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.libraryDirective ||
         kind == idl.LinkedNodeKind.methodDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration ||
         kind == idl.LinkedNodeKind.partDirective ||
         kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.showCombinator ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
         kind == idl.LinkedNodeKind.typeParameter ||
@@ -7791,30 +7917,6 @@
   }
 
   @override
-  String get namespaceDirective_selectedUri {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective);
-    return _variantField_20 ??= '';
-  }
-
-  @override
-  String get simpleStringLiteral_value {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    return _variantField_20 ??= '';
-  }
-
-  set namespaceDirective_selectedUri(String value) {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective);
-    _variantField_20 = value;
-  }
-
-  set simpleStringLiteral_value(String value) {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    _variantField_20 = value;
-  }
-
-  @override
   bool get simplyBoundable_isSimplyBounded {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.classTypeAlias ||
@@ -7858,6 +7960,28 @@
   }
 
   @override
+  LinkedNodeTypeBuilder get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    return _variantField_23;
+  }
+
+  @override
+  LinkedNodeTypeBuilder get typeParameter_defaultType {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    return _variantField_23;
+  }
+
+  set typeName_type(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_23 = value;
+  }
+
+  set typeParameter_defaultType(LinkedNodeTypeBuilder value) {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_23 = value;
+  }
+
+  @override
   LinkedNodeBuilder get unused11 {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     return _variantField_11;
@@ -7908,14 +8032,14 @@
     LinkedNodeBuilder annotation_arguments,
     LinkedNodeBuilder annotation_constructorName,
     int annotation_element,
-    LinkedNodeTypeBuilder annotation_elementType,
     LinkedNodeBuilder annotation_name,
+    LinkedNodeTypeSubstitutionBuilder annotation_substitution,
   })  : _kind = idl.LinkedNodeKind.annotation,
         _variantField_6 = annotation_arguments,
         _variantField_7 = annotation_constructorName,
         _variantField_17 = annotation_element,
-        _variantField_23 = annotation_elementType,
-        _variantField_8 = annotation_name;
+        _variantField_8 = annotation_name,
+        _variantField_38 = annotation_substitution;
 
   LinkedNodeBuilder.argumentList({
     List<LinkedNodeBuilder> argumentList_arguments,
@@ -7948,14 +8072,14 @@
   LinkedNodeBuilder.assignmentExpression({
     LinkedNodeBuilder assignmentExpression_leftHandSide,
     LinkedNodeBuilder assignmentExpression_rightHandSide,
-    LinkedNodeTypeBuilder assignmentExpression_elementType,
+    LinkedNodeTypeSubstitutionBuilder assignmentExpression_substitution,
     int assignmentExpression_element,
     idl.UnlinkedTokenType assignmentExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.assignmentExpression,
         _variantField_6 = assignmentExpression_leftHandSide,
         _variantField_7 = assignmentExpression_rightHandSide,
-        _variantField_23 = assignmentExpression_elementType,
+        _variantField_38 = assignmentExpression_substitution,
         _variantField_15 = assignmentExpression_element,
         _variantField_28 = assignmentExpression_operator,
         _variantField_25 = expression_type;
@@ -7971,7 +8095,7 @@
     LinkedNodeTypeBuilder binaryExpression_invokeType,
     LinkedNodeBuilder binaryExpression_leftOperand,
     LinkedNodeBuilder binaryExpression_rightOperand,
-    LinkedNodeTypeBuilder binaryExpression_elementType,
+    LinkedNodeTypeSubstitutionBuilder binaryExpression_substitution,
     int binaryExpression_element,
     idl.UnlinkedTokenType binaryExpression_operator,
     LinkedNodeTypeBuilder expression_type,
@@ -7979,7 +8103,7 @@
         _variantField_24 = binaryExpression_invokeType,
         _variantField_6 = binaryExpression_leftOperand,
         _variantField_7 = binaryExpression_rightOperand,
-        _variantField_23 = binaryExpression_elementType,
+        _variantField_38 = binaryExpression_substitution,
         _variantField_15 = binaryExpression_element,
         _variantField_28 = binaryExpression_operator,
         _variantField_25 = expression_type;
@@ -8138,12 +8262,12 @@
   LinkedNodeBuilder.constructorName({
     LinkedNodeBuilder constructorName_name,
     LinkedNodeBuilder constructorName_type,
-    LinkedNodeTypeBuilder constructorName_elementType,
+    LinkedNodeTypeSubstitutionBuilder constructorName_substitution,
     int constructorName_element,
   })  : _kind = idl.LinkedNodeKind.constructorName,
         _variantField_6 = constructorName_name,
         _variantField_7 = constructorName_type,
-        _variantField_23 = constructorName_elementType,
+        _variantField_38 = constructorName_substitution,
         _variantField_15 = constructorName_element;
 
   LinkedNodeBuilder.continueStatement({
@@ -8218,18 +8342,18 @@
     List<LinkedNodeBuilder> namespaceDirective_combinators,
     List<LinkedNodeBuilder> annotatedNode_metadata,
     List<LinkedNodeBuilder> namespaceDirective_configurations,
+    String namespaceDirective_selectedUri,
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUri,
     String uriBasedDirective_uriContent,
     int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.exportDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
         _variantField_3 = namespaceDirective_configurations,
+        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_22 = uriBasedDirective_uriContent,
         _variantField_19 = uriBasedDirective_uriElement;
 
@@ -8248,6 +8372,21 @@
   })  : _kind = idl.LinkedNodeKind.extendsClause,
         _variantField_6 = extendsClause_superclass;
 
+  LinkedNodeBuilder.extensionDeclaration({
+    List<LinkedNodeBuilder> annotatedNode_metadata,
+    LinkedNodeBuilder extensionDeclaration_typeParameters,
+    LinkedNodeBuilder extensionDeclaration_extendedType,
+    List<LinkedNodeBuilder> extensionDeclaration_members,
+    String extensionDeclaration_refName,
+    int informativeId,
+  })  : _kind = idl.LinkedNodeKind.extensionDeclaration,
+        _variantField_4 = annotatedNode_metadata,
+        _variantField_6 = extensionDeclaration_typeParameters,
+        _variantField_7 = extensionDeclaration_extendedType,
+        _variantField_5 = extensionDeclaration_members,
+        _variantField_20 = extensionDeclaration_refName,
+        _variantField_36 = informativeId;
+
   LinkedNodeBuilder.fieldDeclaration({
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder fieldDeclaration_fields,
@@ -8434,8 +8573,10 @@
         _variantField_31 = simplyBoundable_isSimplyBounded;
 
   LinkedNodeBuilder.hideCombinator({
+    int informativeId,
     List<String> names,
   })  : _kind = idl.LinkedNodeKind.hideCombinator,
+        _variantField_36 = informativeId,
         _variantField_34 = names;
 
   LinkedNodeBuilder.ifElement({
@@ -8464,36 +8605,34 @@
   LinkedNodeBuilder.importDirective({
     List<LinkedNodeBuilder> namespaceDirective_combinators,
     List<LinkedNodeBuilder> annotatedNode_metadata,
-    int importDirective_prefixOffset,
     List<LinkedNodeBuilder> namespaceDirective_configurations,
+    String namespaceDirective_selectedUri,
     String importDirective_prefix,
     int informativeId,
     LinkedNodeBuilder uriBasedDirective_uri,
-    String namespaceDirective_selectedUri,
     String uriBasedDirective_uriContent,
     int uriBasedDirective_uriElement,
   })  : _kind = idl.LinkedNodeKind.importDirective,
         _variantField_2 = namespaceDirective_combinators,
         _variantField_4 = annotatedNode_metadata,
-        _variantField_15 = importDirective_prefixOffset,
         _variantField_3 = namespaceDirective_configurations,
+        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_1 = importDirective_prefix,
         _variantField_36 = informativeId,
         _variantField_14 = uriBasedDirective_uri,
-        _variantField_20 = namespaceDirective_selectedUri,
         _variantField_22 = uriBasedDirective_uriContent,
         _variantField_19 = uriBasedDirective_uriElement;
 
   LinkedNodeBuilder.indexExpression({
     LinkedNodeBuilder indexExpression_index,
     LinkedNodeBuilder indexExpression_target,
-    LinkedNodeTypeBuilder indexExpression_elementType,
+    LinkedNodeTypeSubstitutionBuilder indexExpression_substitution,
     int indexExpression_element,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.indexExpression,
         _variantField_6 = indexExpression_index,
         _variantField_7 = indexExpression_target,
-        _variantField_23 = indexExpression_elementType,
+        _variantField_38 = indexExpression_substitution,
         _variantField_15 = indexExpression_element,
         _variantField_25 = expression_type;
 
@@ -8685,26 +8824,26 @@
 
   LinkedNodeBuilder.postfixExpression({
     LinkedNodeBuilder postfixExpression_operand,
-    LinkedNodeTypeBuilder postfixExpression_elementType,
+    LinkedNodeTypeSubstitutionBuilder postfixExpression_substitution,
     int postfixExpression_element,
     idl.UnlinkedTokenType postfixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.postfixExpression,
         _variantField_6 = postfixExpression_operand,
-        _variantField_23 = postfixExpression_elementType,
+        _variantField_38 = postfixExpression_substitution,
         _variantField_15 = postfixExpression_element,
         _variantField_28 = postfixExpression_operator,
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.prefixExpression({
     LinkedNodeBuilder prefixExpression_operand,
-    LinkedNodeTypeBuilder prefixExpression_elementType,
+    LinkedNodeTypeSubstitutionBuilder prefixExpression_substitution,
     int prefixExpression_element,
     idl.UnlinkedTokenType prefixExpression_operator,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.prefixExpression,
         _variantField_6 = prefixExpression_operand,
-        _variantField_23 = prefixExpression_elementType,
+        _variantField_38 = prefixExpression_substitution,
         _variantField_15 = prefixExpression_element,
         _variantField_28 = prefixExpression_operator,
         _variantField_25 = expression_type;
@@ -8732,12 +8871,13 @@
   LinkedNodeBuilder.redirectingConstructorInvocation({
     LinkedNodeBuilder redirectingConstructorInvocation_arguments,
     LinkedNodeBuilder redirectingConstructorInvocation_constructorName,
-    LinkedNodeTypeBuilder redirectingConstructorInvocation_elementType,
+    LinkedNodeTypeSubstitutionBuilder
+        redirectingConstructorInvocation_substitution,
     int redirectingConstructorInvocation_element,
   })  : _kind = idl.LinkedNodeKind.redirectingConstructorInvocation,
         _variantField_6 = redirectingConstructorInvocation_arguments,
         _variantField_7 = redirectingConstructorInvocation_constructorName,
-        _variantField_23 = redirectingConstructorInvocation_elementType,
+        _variantField_38 = redirectingConstructorInvocation_substitution,
         _variantField_15 = redirectingConstructorInvocation_element;
 
   LinkedNodeBuilder.rethrowExpression({
@@ -8760,8 +8900,10 @@
         _variantField_25 = expression_type;
 
   LinkedNodeBuilder.showCombinator({
+    int informativeId,
     List<String> names,
   })  : _kind = idl.LinkedNodeKind.showCombinator,
+        _variantField_36 = informativeId,
         _variantField_34 = names;
 
   LinkedNodeBuilder.simpleFormalParameter({
@@ -8780,11 +8922,11 @@
         _variantField_32 = topLevelTypeInferenceError;
 
   LinkedNodeBuilder.simpleIdentifier({
-    LinkedNodeTypeBuilder simpleIdentifier_elementType,
+    LinkedNodeTypeSubstitutionBuilder simpleIdentifier_substitution,
     int simpleIdentifier_element,
     LinkedNodeTypeBuilder expression_type,
   })  : _kind = idl.LinkedNodeKind.simpleIdentifier,
-        _variantField_23 = simpleIdentifier_elementType,
+        _variantField_38 = simpleIdentifier_substitution,
         _variantField_15 = simpleIdentifier_element,
         _variantField_25 = expression_type;
 
@@ -8808,12 +8950,12 @@
   LinkedNodeBuilder.superConstructorInvocation({
     LinkedNodeBuilder superConstructorInvocation_arguments,
     LinkedNodeBuilder superConstructorInvocation_constructorName,
-    LinkedNodeTypeBuilder superConstructorInvocation_elementType,
+    LinkedNodeTypeSubstitutionBuilder superConstructorInvocation_substitution,
     int superConstructorInvocation_element,
   })  : _kind = idl.LinkedNodeKind.superConstructorInvocation,
         _variantField_6 = superConstructorInvocation_arguments,
         _variantField_7 = superConstructorInvocation_constructorName,
-        _variantField_23 = superConstructorInvocation_elementType,
+        _variantField_38 = superConstructorInvocation_substitution,
         _variantField_15 = superConstructorInvocation_element;
 
   LinkedNodeBuilder.superExpression({
@@ -8898,13 +9040,13 @@
   LinkedNodeBuilder.typeParameter({
     List<LinkedNodeBuilder> annotatedNode_metadata,
     LinkedNodeBuilder typeParameter_bound,
-    LinkedNodeTypeBuilder typeParameter_defaultType,
     int informativeId,
+    LinkedNodeTypeBuilder typeParameter_defaultType,
   })  : _kind = idl.LinkedNodeKind.typeParameter,
         _variantField_4 = annotatedNode_metadata,
         _variantField_6 = typeParameter_bound,
-        _variantField_23 = typeParameter_defaultType,
-        _variantField_36 = informativeId;
+        _variantField_36 = informativeId,
+        _variantField_23 = typeParameter_defaultType;
 
   LinkedNodeBuilder.typeParameterList({
     List<LinkedNodeBuilder> typeParameterList_typeParameters,
@@ -8966,8 +9108,8 @@
     } else if (kind == idl.LinkedNodeKind.annotation) {
       annotation_arguments?.flushInformative();
       annotation_constructorName?.flushInformative();
-      annotation_elementType?.flushInformative();
       annotation_name?.flushInformative();
+      annotation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.argumentList) {
       argumentList_arguments?.forEach((b) => b.flushInformative());
     } else if (kind == idl.LinkedNodeKind.asExpression) {
@@ -8983,7 +9125,7 @@
     } else if (kind == idl.LinkedNodeKind.assignmentExpression) {
       assignmentExpression_leftHandSide?.flushInformative();
       assignmentExpression_rightHandSide?.flushInformative();
-      assignmentExpression_elementType?.flushInformative();
+      assignmentExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.awaitExpression) {
       awaitExpression_expression?.flushInformative();
@@ -8992,7 +9134,7 @@
       binaryExpression_invokeType?.flushInformative();
       binaryExpression_leftOperand?.flushInformative();
       binaryExpression_rightOperand?.flushInformative();
-      binaryExpression_elementType?.flushInformative();
+      binaryExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.block) {
       block_statements?.forEach((b) => b.flushInformative());
@@ -9059,7 +9201,7 @@
     } else if (kind == idl.LinkedNodeKind.constructorName) {
       constructorName_name?.flushInformative();
       constructorName_type?.flushInformative();
-      constructorName_elementType?.flushInformative();
+      constructorName_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.continueStatement) {
       continueStatement_label?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.declaredIdentifier) {
@@ -9097,6 +9239,12 @@
       expressionStatement_expression?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.extendsClause) {
       extendsClause_superclass?.flushInformative();
+    } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      annotatedNode_metadata?.forEach((b) => b.flushInformative());
+      extensionDeclaration_typeParameters?.flushInformative();
+      extensionDeclaration_extendedType?.flushInformative();
+      extensionDeclaration_members?.forEach((b) => b.flushInformative());
+      informativeId = null;
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       fieldDeclaration_fields?.flushInformative();
@@ -9175,6 +9323,7 @@
       genericTypeAlias_functionType?.flushInformative();
       informativeId = null;
     } else if (kind == idl.LinkedNodeKind.hideCombinator) {
+      informativeId = null;
     } else if (kind == idl.LinkedNodeKind.ifElement) {
       ifMixin_condition?.flushInformative();
       ifElement_thenElement?.flushInformative();
@@ -9194,7 +9343,7 @@
     } else if (kind == idl.LinkedNodeKind.indexExpression) {
       indexExpression_index?.flushInformative();
       indexExpression_target?.flushInformative();
-      indexExpression_elementType?.flushInformative();
+      indexExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
       instanceCreationExpression_arguments
@@ -9274,11 +9423,11 @@
       informativeId = null;
     } else if (kind == idl.LinkedNodeKind.postfixExpression) {
       postfixExpression_operand?.flushInformative();
-      postfixExpression_elementType?.flushInformative();
+      postfixExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.prefixExpression) {
       prefixExpression_operand?.flushInformative();
-      prefixExpression_elementType?.flushInformative();
+      prefixExpression_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
       prefixedIdentifier_identifier?.flushInformative();
@@ -9291,7 +9440,7 @@
     } else if (kind == idl.LinkedNodeKind.redirectingConstructorInvocation) {
       redirectingConstructorInvocation_arguments?.flushInformative();
       redirectingConstructorInvocation_constructorName?.flushInformative();
-      redirectingConstructorInvocation_elementType?.flushInformative();
+      redirectingConstructorInvocation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.rethrowExpression) {
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.returnStatement) {
@@ -9301,6 +9450,7 @@
       setOrMapLiteral_elements?.forEach((b) => b.flushInformative());
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.showCombinator) {
+      informativeId = null;
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       actualType?.flushInformative();
       normalFormalParameter_metadata?.forEach((b) => b.flushInformative());
@@ -9308,7 +9458,7 @@
       informativeId = null;
       topLevelTypeInferenceError?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.simpleIdentifier) {
-      simpleIdentifier_elementType?.flushInformative();
+      simpleIdentifier_substitution?.flushInformative();
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
     } else if (kind == idl.LinkedNodeKind.spreadElement) {
@@ -9318,7 +9468,7 @@
     } else if (kind == idl.LinkedNodeKind.superConstructorInvocation) {
       superConstructorInvocation_arguments?.flushInformative();
       superConstructorInvocation_constructorName?.flushInformative();
-      superConstructorInvocation_elementType?.flushInformative();
+      superConstructorInvocation_substitution?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.superExpression) {
       expression_type?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.switchCase) {
@@ -9355,8 +9505,8 @@
     } else if (kind == idl.LinkedNodeKind.typeParameter) {
       annotatedNode_metadata?.forEach((b) => b.flushInformative());
       typeParameter_bound?.flushInformative();
-      typeParameter_defaultType?.flushInformative();
       informativeId = null;
+      typeParameter_defaultType?.flushInformative();
     } else if (kind == idl.LinkedNodeKind.typeParameterList) {
       typeParameterList_typeParameters?.forEach((b) => b.flushInformative());
     } else if (kind == idl.LinkedNodeKind.variableDeclaration) {
@@ -9406,9 +9556,9 @@
       this.annotation_name?.collectApiSignature(signature);
       signature.addInt(this.annotation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.annotation_elementType != null);
-      this.annotation_elementType?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature.addBool(this.annotation_substitution != null);
+      this.annotation_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.argumentList) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.argumentList_arguments == null) {
@@ -9455,14 +9605,14 @@
       this.assignmentExpression_rightHandSide?.collectApiSignature(signature);
       signature.addInt(this.assignmentExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.assignmentExpression_elementType != null);
-      this.assignmentExpression_elementType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.assignmentExpression_operator == null
           ? 0
           : this.assignmentExpression_operator.index);
       signature.addString(this.name ?? '');
+      signature.addBool(this.assignmentExpression_substitution != null);
+      this.assignmentExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.awaitExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.awaitExpression_expression != null);
@@ -9479,8 +9629,6 @@
       this.binaryExpression_rightOperand?.collectApiSignature(signature);
       signature.addInt(this.binaryExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.binaryExpression_elementType != null);
-      this.binaryExpression_elementType?.collectApiSignature(signature);
       signature.addBool(this.binaryExpression_invokeType != null);
       this.binaryExpression_invokeType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
@@ -9489,6 +9637,8 @@
           ? 0
           : this.binaryExpression_operator.index);
       signature.addString(this.name ?? '');
+      signature.addBool(this.binaryExpression_substitution != null);
+      this.binaryExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.block) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.block_statements == null) {
@@ -9727,9 +9877,9 @@
       this.constructorName_type?.collectApiSignature(signature);
       signature.addInt(this.constructorName_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.constructorName_elementType != null);
-      this.constructorName_elementType?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature.addBool(this.constructorName_substitution != null);
+      this.constructorName_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.continueStatement) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.continueStatement_label != null);
@@ -9881,6 +10031,31 @@
       this.extendsClause_superclass?.collectApiSignature(signature);
       signature.addInt(this.flags ?? 0);
       signature.addString(this.name ?? '');
+    } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      signature.addInt(this.kind == null ? 0 : this.kind.index);
+      if (this.annotatedNode_metadata == null) {
+        signature.addInt(0);
+      } else {
+        signature.addInt(this.annotatedNode_metadata.length);
+        for (var x in this.annotatedNode_metadata) {
+          x?.collectApiSignature(signature);
+        }
+      }
+      if (this.extensionDeclaration_members == null) {
+        signature.addInt(0);
+      } else {
+        signature.addInt(this.extensionDeclaration_members.length);
+        for (var x in this.extensionDeclaration_members) {
+          x?.collectApiSignature(signature);
+        }
+      }
+      signature.addBool(this.extensionDeclaration_typeParameters != null);
+      this.extensionDeclaration_typeParameters?.collectApiSignature(signature);
+      signature.addBool(this.extensionDeclaration_extendedType != null);
+      this.extensionDeclaration_extendedType?.collectApiSignature(signature);
+      signature.addInt(this.flags ?? 0);
+      signature.addString(this.extensionDeclaration_refName ?? '');
+      signature.addString(this.name ?? '');
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.annotatedNode_metadata == null) {
@@ -10214,7 +10389,6 @@
       }
       signature.addBool(this.uriBasedDirective_uri != null);
       this.uriBasedDirective_uri?.collectApiSignature(signature);
-      signature.addInt(this.importDirective_prefixOffset ?? 0);
       signature.addInt(this.flags ?? 0);
       signature.addInt(this.uriBasedDirective_uriElement ?? 0);
       signature.addString(this.namespaceDirective_selectedUri ?? '');
@@ -10228,11 +10402,11 @@
       this.indexExpression_target?.collectApiSignature(signature);
       signature.addInt(this.indexExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.indexExpression_elementType != null);
-      this.indexExpression_elementType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature.addBool(this.indexExpression_substitution != null);
+      this.indexExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.instanceCreationExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.instanceCreationExpression_arguments == null) {
@@ -10518,28 +10692,28 @@
       this.postfixExpression_operand?.collectApiSignature(signature);
       signature.addInt(this.postfixExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.postfixExpression_elementType != null);
-      this.postfixExpression_elementType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.postfixExpression_operator == null
           ? 0
           : this.postfixExpression_operator.index);
       signature.addString(this.name ?? '');
+      signature.addBool(this.postfixExpression_substitution != null);
+      this.postfixExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.prefixExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.prefixExpression_operand != null);
       this.prefixExpression_operand?.collectApiSignature(signature);
       signature.addInt(this.prefixExpression_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.prefixExpression_elementType != null);
-      this.prefixExpression_elementType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addInt(this.prefixExpression_operator == null
           ? 0
           : this.prefixExpression_operator.index);
       signature.addString(this.name ?? '');
+      signature.addBool(this.prefixExpression_substitution != null);
+      this.prefixExpression_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.prefixedIdentifier) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addBool(this.prefixedIdentifier_identifier != null);
@@ -10577,12 +10751,12 @@
           ?.collectApiSignature(signature);
       signature.addInt(this.redirectingConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature
-          .addBool(this.redirectingConstructorInvocation_elementType != null);
-      this
-          .redirectingConstructorInvocation_elementType
-          ?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature
+          .addBool(this.redirectingConstructorInvocation_substitution != null);
+      this
+          .redirectingConstructorInvocation_substitution
+          ?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.rethrowExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10652,11 +10826,11 @@
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.simpleIdentifier_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.simpleIdentifier_elementType != null);
-      this.simpleIdentifier_elementType?.collectApiSignature(signature);
       signature.addBool(this.expression_type != null);
       this.expression_type?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature.addBool(this.simpleIdentifier_substitution != null);
+      this.simpleIdentifier_substitution?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10694,11 +10868,11 @@
           ?.collectApiSignature(signature);
       signature.addInt(this.superConstructorInvocation_element ?? 0);
       signature.addInt(this.flags ?? 0);
-      signature.addBool(this.superConstructorInvocation_elementType != null);
-      this
-          .superConstructorInvocation_elementType
-          ?.collectApiSignature(signature);
       signature.addString(this.name ?? '');
+      signature.addBool(this.superConstructorInvocation_substitution != null);
+      this
+          .superConstructorInvocation_substitution
+          ?.collectApiSignature(signature);
     } else if (kind == idl.LinkedNodeKind.superExpression) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.flags ?? 0);
@@ -10961,8 +11135,8 @@
     fb.Offset offset_variantField_4;
     fb.Offset offset_variantField_6;
     fb.Offset offset_variantField_7;
-    fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_8;
+    fb.Offset offset_variantField_38;
     fb.Offset offset_variantField_9;
     fb.Offset offset_variantField_12;
     fb.Offset offset_variantField_5;
@@ -10971,13 +11145,14 @@
     fb.Offset offset_variantField_3;
     fb.Offset offset_variantField_10;
     fb.Offset offset_variantField_25;
+    fb.Offset offset_variantField_20;
     fb.Offset offset_variantField_1;
     fb.Offset offset_variantField_30;
     fb.Offset offset_variantField_14;
     fb.Offset offset_variantField_34;
     fb.Offset offset_name;
-    fb.Offset offset_variantField_20;
     fb.Offset offset_variantField_32;
+    fb.Offset offset_variantField_23;
     fb.Offset offset_variantField_11;
     fb.Offset offset_variantField_22;
     if (_variantField_24 != null) {
@@ -10997,12 +11172,12 @@
     if (_variantField_7 != null) {
       offset_variantField_7 = _variantField_7.finish(fbBuilder);
     }
-    if (_variantField_23 != null) {
-      offset_variantField_23 = _variantField_23.finish(fbBuilder);
-    }
     if (_variantField_8 != null) {
       offset_variantField_8 = _variantField_8.finish(fbBuilder);
     }
+    if (_variantField_38 != null) {
+      offset_variantField_38 = _variantField_38.finish(fbBuilder);
+    }
     if (_variantField_9 != null) {
       offset_variantField_9 = _variantField_9.finish(fbBuilder);
     }
@@ -11030,6 +11205,9 @@
     if (_variantField_25 != null) {
       offset_variantField_25 = _variantField_25.finish(fbBuilder);
     }
+    if (_variantField_20 != null) {
+      offset_variantField_20 = fbBuilder.writeString(_variantField_20);
+    }
     if (_variantField_1 != null) {
       offset_variantField_1 = fbBuilder.writeString(_variantField_1);
     }
@@ -11046,12 +11224,12 @@
     if (_name != null) {
       offset_name = fbBuilder.writeString(_name);
     }
-    if (_variantField_20 != null) {
-      offset_variantField_20 = fbBuilder.writeString(_variantField_20);
-    }
     if (_variantField_32 != null) {
       offset_variantField_32 = _variantField_32.finish(fbBuilder);
     }
+    if (_variantField_23 != null) {
+      offset_variantField_23 = _variantField_23.finish(fbBuilder);
+    }
     if (_variantField_11 != null) {
       offset_variantField_11 = _variantField_11.finish(fbBuilder);
     }
@@ -11077,12 +11255,12 @@
     if (_variantField_17 != null && _variantField_17 != 0) {
       fbBuilder.addUint32(17, _variantField_17);
     }
-    if (offset_variantField_23 != null) {
-      fbBuilder.addOffset(23, offset_variantField_23);
-    }
     if (offset_variantField_8 != null) {
       fbBuilder.addOffset(8, offset_variantField_8);
     }
+    if (offset_variantField_38 != null) {
+      fbBuilder.addOffset(38, offset_variantField_38);
+    }
     if (_variantField_15 != null && _variantField_15 != 0) {
       fbBuilder.addUint32(15, _variantField_15);
     }
@@ -11129,6 +11307,9 @@
     if (offset_variantField_25 != null) {
       fbBuilder.addOffset(25, offset_variantField_25);
     }
+    if (offset_variantField_20 != null) {
+      fbBuilder.addOffset(20, offset_variantField_20);
+    }
     if (_flags != null && _flags != 0) {
       fbBuilder.addUint32(18, _flags);
     }
@@ -11156,9 +11337,6 @@
     if (offset_name != null) {
       fbBuilder.addOffset(37, offset_name);
     }
-    if (offset_variantField_20 != null) {
-      fbBuilder.addOffset(20, offset_variantField_20);
-    }
     if (_variantField_31 == true) {
       fbBuilder.addBool(31, true);
     }
@@ -11169,6 +11347,9 @@
     if (offset_variantField_32 != null) {
       fbBuilder.addOffset(32, offset_variantField_32);
     }
+    if (offset_variantField_23 != null) {
+      fbBuilder.addOffset(23, offset_variantField_23);
+    }
     if (offset_variantField_11 != null) {
       fbBuilder.addOffset(11, offset_variantField_11);
     }
@@ -11204,8 +11385,8 @@
   idl.LinkedNode _variantField_6;
   idl.LinkedNode _variantField_7;
   int _variantField_17;
-  idl.LinkedNodeType _variantField_23;
   idl.LinkedNode _variantField_8;
+  idl.LinkedNodeTypeSubstitution _variantField_38;
   int _variantField_15;
   idl.UnlinkedTokenType _variantField_28;
   bool _variantField_27;
@@ -11220,6 +11401,7 @@
   idl.LinkedNodeFormalParameterKind _variantField_26;
   double _variantField_21;
   idl.LinkedNodeType _variantField_25;
+  String _variantField_20;
   int _flags;
   String _variantField_1;
   int _variantField_36;
@@ -11229,10 +11411,10 @@
   idl.LinkedNodeKind _kind;
   List<String> _variantField_34;
   String _name;
-  String _variantField_20;
   bool _variantField_31;
   idl.UnlinkedTokenType _variantField_35;
   idl.TopLevelInferenceError _variantField_32;
+  idl.LinkedNodeType _variantField_23;
   idl.LinkedNode _variantField_11;
   String _variantField_22;
   int _variantField_19;
@@ -11513,6 +11695,7 @@
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -11771,6 +11954,14 @@
   }
 
   @override
+  idl.LinkedNode get extensionDeclaration_typeParameters {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_6 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 6, null);
+    return _variantField_6;
+  }
+
+  @override
   idl.LinkedNode get fieldDeclaration_fields {
     assert(kind == idl.LinkedNodeKind.fieldDeclaration);
     _variantField_6 ??=
@@ -12295,6 +12486,14 @@
   }
 
   @override
+  idl.LinkedNode get extensionDeclaration_extendedType {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_7 ??=
+        const _LinkedNodeReader().vTableGet(_bc, _bcOffset, 7, null);
+    return _variantField_7;
+  }
+
+  @override
   idl.LinkedNode get fieldFormalParameter_typeParameters {
     assert(kind == idl.LinkedNodeKind.fieldFormalParameter);
     _variantField_7 ??=
@@ -12543,102 +12742,6 @@
   }
 
   @override
-  idl.LinkedNodeType get annotation_elementType {
-    assert(kind == idl.LinkedNodeKind.annotation);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get assignmentExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.assignmentExpression);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get binaryExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.binaryExpression);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get constructorName_elementType {
-    assert(kind == idl.LinkedNodeKind.constructorName);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get indexExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.indexExpression);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get postfixExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.postfixExpression);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get prefixExpression_elementType {
-    assert(kind == idl.LinkedNodeKind.prefixExpression);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get redirectingConstructorInvocation_elementType {
-    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get simpleIdentifier_elementType {
-    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get superConstructorInvocation_elementType {
-    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get typeName_type {
-    assert(kind == idl.LinkedNodeKind.typeName);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
-  idl.LinkedNodeType get typeParameter_defaultType {
-    assert(kind == idl.LinkedNodeKind.typeParameter);
-    _variantField_23 ??=
-        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
-    return _variantField_23;
-  }
-
-  @override
   idl.LinkedNode get annotation_name {
     assert(kind == idl.LinkedNodeKind.annotation);
     _variantField_8 ??=
@@ -12767,6 +12870,87 @@
   }
 
   @override
+  idl.LinkedNodeTypeSubstitution get annotation_substitution {
+    assert(kind == idl.LinkedNodeKind.annotation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get assignmentExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.assignmentExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get binaryExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.binaryExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get constructorName_substitution {
+    assert(kind == idl.LinkedNodeKind.constructorName);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get indexExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.indexExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get postfixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.postfixExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get prefixExpression_substitution {
+    assert(kind == idl.LinkedNodeKind.prefixExpression);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution
+      get redirectingConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.redirectingConstructorInvocation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get simpleIdentifier_substitution {
+    assert(kind == idl.LinkedNodeKind.simpleIdentifier);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
+  idl.LinkedNodeTypeSubstitution get superConstructorInvocation_substitution {
+    assert(kind == idl.LinkedNodeKind.superConstructorInvocation);
+    _variantField_38 ??= const _LinkedNodeTypeSubstitutionReader()
+        .vTableGet(_bc, _bcOffset, 38, null);
+    return _variantField_38;
+  }
+
+  @override
   int get assignmentExpression_element {
     assert(kind == idl.LinkedNodeKind.assignmentExpression);
     _variantField_15 ??=
@@ -12807,14 +12991,6 @@
   }
 
   @override
-  int get importDirective_prefixOffset {
-    assert(kind == idl.LinkedNodeKind.importDirective);
-    _variantField_15 ??=
-        const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 15, 0);
-    return _variantField_15;
-  }
-
-  @override
   int get indexExpression_element {
     assert(kind == idl.LinkedNodeKind.indexExpression);
     _variantField_15 ??=
@@ -13015,6 +13191,15 @@
   }
 
   @override
+  List<idl.LinkedNode> get extensionDeclaration_members {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_5 ??=
+        const fb.ListReader<idl.LinkedNode>(const _LinkedNodeReader())
+            .vTableGet(_bc, _bcOffset, 5, const <idl.LinkedNode>[]);
+    return _variantField_5;
+  }
+
+  @override
   List<idl.LinkedNode> get forParts_updaters {
     assert(kind == idl.LinkedNodeKind.forPartsWithDeclarations ||
         kind == idl.LinkedNodeKind.forPartsWithExpression);
@@ -13163,6 +13348,31 @@
   }
 
   @override
+  String get extensionDeclaration_refName {
+    assert(kind == idl.LinkedNodeKind.extensionDeclaration);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
+  }
+
+  @override
+  String get namespaceDirective_selectedUri {
+    assert(kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.importDirective);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
+  }
+
+  @override
+  String get simpleStringLiteral_value {
+    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
+    _variantField_20 ??=
+        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
+    return _variantField_20;
+  }
+
+  @override
   int get flags {
     _flags ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 18, 0);
     return _flags;
@@ -13187,18 +13397,21 @@
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.exportDirective ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
         kind == idl.LinkedNodeKind.genericTypeAlias ||
+        kind == idl.LinkedNodeKind.hideCombinator ||
         kind == idl.LinkedNodeKind.importDirective ||
         kind == idl.LinkedNodeKind.libraryDirective ||
         kind == idl.LinkedNodeKind.methodDeclaration ||
         kind == idl.LinkedNodeKind.mixinDeclaration ||
         kind == idl.LinkedNodeKind.partDirective ||
         kind == idl.LinkedNodeKind.partOfDirective ||
+        kind == idl.LinkedNodeKind.showCombinator ||
         kind == idl.LinkedNodeKind.simpleFormalParameter ||
         kind == idl.LinkedNodeKind.topLevelVariableDeclaration ||
         kind == idl.LinkedNodeKind.typeParameter ||
@@ -13276,23 +13489,6 @@
   }
 
   @override
-  String get namespaceDirective_selectedUri {
-    assert(kind == idl.LinkedNodeKind.exportDirective ||
-        kind == idl.LinkedNodeKind.importDirective);
-    _variantField_20 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
-    return _variantField_20;
-  }
-
-  @override
-  String get simpleStringLiteral_value {
-    assert(kind == idl.LinkedNodeKind.simpleStringLiteral);
-    _variantField_20 ??=
-        const fb.StringReader().vTableGet(_bc, _bcOffset, 20, '');
-    return _variantField_20;
-  }
-
-  @override
   bool get simplyBoundable_isSimplyBounded {
     assert(kind == idl.LinkedNodeKind.classDeclaration ||
         kind == idl.LinkedNodeKind.classTypeAlias ||
@@ -13322,6 +13518,22 @@
   }
 
   @override
+  idl.LinkedNodeType get typeName_type {
+    assert(kind == idl.LinkedNodeKind.typeName);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
+  idl.LinkedNodeType get typeParameter_defaultType {
+    assert(kind == idl.LinkedNodeKind.typeParameter);
+    _variantField_23 ??=
+        const _LinkedNodeTypeReader().vTableGet(_bc, _bcOffset, 23, null);
+    return _variantField_23;
+  }
+
+  @override
   idl.LinkedNode get unused11 {
     assert(kind == idl.LinkedNodeKind.classDeclaration);
     _variantField_11 ??=
@@ -13371,10 +13583,10 @@
             annotation_constructorName.toJson();
       if (annotation_element != 0)
         _result["annotation_element"] = annotation_element;
-      if (annotation_elementType != null)
-        _result["annotation_elementType"] = annotation_elementType.toJson();
       if (annotation_name != null)
         _result["annotation_name"] = annotation_name.toJson();
+      if (annotation_substitution != null)
+        _result["annotation_substitution"] = annotation_substitution.toJson();
     }
     if (kind == idl.LinkedNodeKind.argumentList) {
       if (argumentList_arguments.isNotEmpty)
@@ -13411,9 +13623,9 @@
       if (assignmentExpression_rightHandSide != null)
         _result["assignmentExpression_rightHandSide"] =
             assignmentExpression_rightHandSide.toJson();
-      if (assignmentExpression_elementType != null)
-        _result["assignmentExpression_elementType"] =
-            assignmentExpression_elementType.toJson();
+      if (assignmentExpression_substitution != null)
+        _result["assignmentExpression_substitution"] =
+            assignmentExpression_substitution.toJson();
       if (assignmentExpression_element != 0)
         _result["assignmentExpression_element"] = assignmentExpression_element;
       if (assignmentExpression_operator != idl.UnlinkedTokenType.NOTHING)
@@ -13439,9 +13651,9 @@
       if (binaryExpression_rightOperand != null)
         _result["binaryExpression_rightOperand"] =
             binaryExpression_rightOperand.toJson();
-      if (binaryExpression_elementType != null)
-        _result["binaryExpression_elementType"] =
-            binaryExpression_elementType.toJson();
+      if (binaryExpression_substitution != null)
+        _result["binaryExpression_substitution"] =
+            binaryExpression_substitution.toJson();
       if (binaryExpression_element != 0)
         _result["binaryExpression_element"] = binaryExpression_element;
       if (binaryExpression_operator != idl.UnlinkedTokenType.NOTHING)
@@ -13628,9 +13840,9 @@
         _result["constructorName_name"] = constructorName_name.toJson();
       if (constructorName_type != null)
         _result["constructorName_type"] = constructorName_type.toJson();
-      if (constructorName_elementType != null)
-        _result["constructorName_elementType"] =
-            constructorName_elementType.toJson();
+      if (constructorName_substitution != null)
+        _result["constructorName_substitution"] =
+            constructorName_substitution.toJson();
       if (constructorName_element != 0)
         _result["constructorName_element"] = constructorName_element;
     }
@@ -13715,12 +13927,12 @@
             namespaceDirective_configurations
                 .map((_value) => _value.toJson())
                 .toList();
-      if (informativeId != 0) _result["informativeId"] = informativeId;
-      if (uriBasedDirective_uri != null)
-        _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
       if (namespaceDirective_selectedUri != '')
         _result["namespaceDirective_selectedUri"] =
             namespaceDirective_selectedUri;
+      if (informativeId != 0) _result["informativeId"] = informativeId;
+      if (uriBasedDirective_uri != null)
+        _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
       if (uriBasedDirective_uriContent != '')
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
       if (uriBasedDirective_uriElement != 0)
@@ -13740,6 +13952,24 @@
       if (extendsClause_superclass != null)
         _result["extendsClause_superclass"] = extendsClause_superclass.toJson();
     }
+    if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      if (annotatedNode_metadata.isNotEmpty)
+        _result["annotatedNode_metadata"] =
+            annotatedNode_metadata.map((_value) => _value.toJson()).toList();
+      if (extensionDeclaration_typeParameters != null)
+        _result["extensionDeclaration_typeParameters"] =
+            extensionDeclaration_typeParameters.toJson();
+      if (extensionDeclaration_extendedType != null)
+        _result["extensionDeclaration_extendedType"] =
+            extensionDeclaration_extendedType.toJson();
+      if (extensionDeclaration_members.isNotEmpty)
+        _result["extensionDeclaration_members"] = extensionDeclaration_members
+            .map((_value) => _value.toJson())
+            .toList();
+      if (extensionDeclaration_refName != '')
+        _result["extensionDeclaration_refName"] = extensionDeclaration_refName;
+      if (informativeId != 0) _result["informativeId"] = informativeId;
+    }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       if (annotatedNode_metadata.isNotEmpty)
         _result["annotatedNode_metadata"] =
@@ -13945,6 +14175,7 @@
             simplyBoundable_isSimplyBounded;
     }
     if (kind == idl.LinkedNodeKind.hideCombinator) {
+      if (informativeId != 0) _result["informativeId"] = informativeId;
       if (names.isNotEmpty) _result["names"] = names;
     }
     if (kind == idl.LinkedNodeKind.ifElement) {
@@ -13980,21 +14211,19 @@
       if (annotatedNode_metadata.isNotEmpty)
         _result["annotatedNode_metadata"] =
             annotatedNode_metadata.map((_value) => _value.toJson()).toList();
-      if (importDirective_prefixOffset != 0)
-        _result["importDirective_prefixOffset"] = importDirective_prefixOffset;
       if (namespaceDirective_configurations.isNotEmpty)
         _result["namespaceDirective_configurations"] =
             namespaceDirective_configurations
                 .map((_value) => _value.toJson())
                 .toList();
+      if (namespaceDirective_selectedUri != '')
+        _result["namespaceDirective_selectedUri"] =
+            namespaceDirective_selectedUri;
       if (importDirective_prefix != '')
         _result["importDirective_prefix"] = importDirective_prefix;
       if (informativeId != 0) _result["informativeId"] = informativeId;
       if (uriBasedDirective_uri != null)
         _result["uriBasedDirective_uri"] = uriBasedDirective_uri.toJson();
-      if (namespaceDirective_selectedUri != '')
-        _result["namespaceDirective_selectedUri"] =
-            namespaceDirective_selectedUri;
       if (uriBasedDirective_uriContent != '')
         _result["uriBasedDirective_uriContent"] = uriBasedDirective_uriContent;
       if (uriBasedDirective_uriElement != 0)
@@ -14005,9 +14234,9 @@
         _result["indexExpression_index"] = indexExpression_index.toJson();
       if (indexExpression_target != null)
         _result["indexExpression_target"] = indexExpression_target.toJson();
-      if (indexExpression_elementType != null)
-        _result["indexExpression_elementType"] =
-            indexExpression_elementType.toJson();
+      if (indexExpression_substitution != null)
+        _result["indexExpression_substitution"] =
+            indexExpression_substitution.toJson();
       if (indexExpression_element != 0)
         _result["indexExpression_element"] = indexExpression_element;
       if (expression_type != null)
@@ -14214,9 +14443,9 @@
       if (postfixExpression_operand != null)
         _result["postfixExpression_operand"] =
             postfixExpression_operand.toJson();
-      if (postfixExpression_elementType != null)
-        _result["postfixExpression_elementType"] =
-            postfixExpression_elementType.toJson();
+      if (postfixExpression_substitution != null)
+        _result["postfixExpression_substitution"] =
+            postfixExpression_substitution.toJson();
       if (postfixExpression_element != 0)
         _result["postfixExpression_element"] = postfixExpression_element;
       if (postfixExpression_operator != idl.UnlinkedTokenType.NOTHING)
@@ -14228,9 +14457,9 @@
     if (kind == idl.LinkedNodeKind.prefixExpression) {
       if (prefixExpression_operand != null)
         _result["prefixExpression_operand"] = prefixExpression_operand.toJson();
-      if (prefixExpression_elementType != null)
-        _result["prefixExpression_elementType"] =
-            prefixExpression_elementType.toJson();
+      if (prefixExpression_substitution != null)
+        _result["prefixExpression_substitution"] =
+            prefixExpression_substitution.toJson();
       if (prefixExpression_element != 0)
         _result["prefixExpression_element"] = prefixExpression_element;
       if (prefixExpression_operator != idl.UnlinkedTokenType.NOTHING)
@@ -14268,9 +14497,9 @@
       if (redirectingConstructorInvocation_constructorName != null)
         _result["redirectingConstructorInvocation_constructorName"] =
             redirectingConstructorInvocation_constructorName.toJson();
-      if (redirectingConstructorInvocation_elementType != null)
-        _result["redirectingConstructorInvocation_elementType"] =
-            redirectingConstructorInvocation_elementType.toJson();
+      if (redirectingConstructorInvocation_substitution != null)
+        _result["redirectingConstructorInvocation_substitution"] =
+            redirectingConstructorInvocation_substitution.toJson();
       if (redirectingConstructorInvocation_element != 0)
         _result["redirectingConstructorInvocation_element"] =
             redirectingConstructorInvocation_element;
@@ -14296,6 +14525,7 @@
         _result["expression_type"] = expression_type.toJson();
     }
     if (kind == idl.LinkedNodeKind.showCombinator) {
+      if (informativeId != 0) _result["informativeId"] = informativeId;
       if (names.isNotEmpty) _result["names"] = names;
     }
     if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
@@ -14316,9 +14546,9 @@
             topLevelTypeInferenceError.toJson();
     }
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
-      if (simpleIdentifier_elementType != null)
-        _result["simpleIdentifier_elementType"] =
-            simpleIdentifier_elementType.toJson();
+      if (simpleIdentifier_substitution != null)
+        _result["simpleIdentifier_substitution"] =
+            simpleIdentifier_substitution.toJson();
       if (simpleIdentifier_element != 0)
         _result["simpleIdentifier_element"] = simpleIdentifier_element;
       if (expression_type != null)
@@ -14348,9 +14578,9 @@
       if (superConstructorInvocation_constructorName != null)
         _result["superConstructorInvocation_constructorName"] =
             superConstructorInvocation_constructorName.toJson();
-      if (superConstructorInvocation_elementType != null)
-        _result["superConstructorInvocation_elementType"] =
-            superConstructorInvocation_elementType.toJson();
+      if (superConstructorInvocation_substitution != null)
+        _result["superConstructorInvocation_substitution"] =
+            superConstructorInvocation_substitution.toJson();
       if (superConstructorInvocation_element != 0)
         _result["superConstructorInvocation_element"] =
             superConstructorInvocation_element;
@@ -14441,10 +14671,10 @@
             annotatedNode_metadata.map((_value) => _value.toJson()).toList();
       if (typeParameter_bound != null)
         _result["typeParameter_bound"] = typeParameter_bound.toJson();
+      if (informativeId != 0) _result["informativeId"] = informativeId;
       if (typeParameter_defaultType != null)
         _result["typeParameter_defaultType"] =
             typeParameter_defaultType.toJson();
-      if (informativeId != 0) _result["informativeId"] = informativeId;
     }
     if (kind == idl.LinkedNodeKind.typeParameterList) {
       if (typeParameterList_typeParameters.isNotEmpty)
@@ -14521,8 +14751,8 @@
         "annotation_arguments": annotation_arguments,
         "annotation_constructorName": annotation_constructorName,
         "annotation_element": annotation_element,
-        "annotation_elementType": annotation_elementType,
         "annotation_name": annotation_name,
+        "annotation_substitution": annotation_substitution,
         "flags": flags,
         "kind": kind,
         "name": name,
@@ -14569,7 +14799,7 @@
         "assignmentExpression_leftHandSide": assignmentExpression_leftHandSide,
         "assignmentExpression_rightHandSide":
             assignmentExpression_rightHandSide,
-        "assignmentExpression_elementType": assignmentExpression_elementType,
+        "assignmentExpression_substitution": assignmentExpression_substitution,
         "assignmentExpression_element": assignmentExpression_element,
         "assignmentExpression_operator": assignmentExpression_operator,
         "expression_type": expression_type,
@@ -14592,7 +14822,7 @@
         "binaryExpression_invokeType": binaryExpression_invokeType,
         "binaryExpression_leftOperand": binaryExpression_leftOperand,
         "binaryExpression_rightOperand": binaryExpression_rightOperand,
-        "binaryExpression_elementType": binaryExpression_elementType,
+        "binaryExpression_substitution": binaryExpression_substitution,
         "binaryExpression_element": binaryExpression_element,
         "binaryExpression_operator": binaryExpression_operator,
         "expression_type": expression_type,
@@ -14771,7 +15001,7 @@
       return {
         "constructorName_name": constructorName_name,
         "constructorName_type": constructorName_type,
-        "constructorName_elementType": constructorName_elementType,
+        "constructorName_substitution": constructorName_substitution,
         "constructorName_element": constructorName_element,
         "flags": flags,
         "kind": kind,
@@ -14873,12 +15103,12 @@
         "namespaceDirective_combinators": namespaceDirective_combinators,
         "annotatedNode_metadata": annotatedNode_metadata,
         "namespaceDirective_configurations": namespaceDirective_configurations,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "flags": flags,
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
         "name": name,
-        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
         "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
@@ -14907,6 +15137,20 @@
         "name": name,
       };
     }
+    if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      return {
+        "annotatedNode_metadata": annotatedNode_metadata,
+        "extensionDeclaration_typeParameters":
+            extensionDeclaration_typeParameters,
+        "extensionDeclaration_extendedType": extensionDeclaration_extendedType,
+        "extensionDeclaration_members": extensionDeclaration_members,
+        "extensionDeclaration_refName": extensionDeclaration_refName,
+        "flags": flags,
+        "informativeId": informativeId,
+        "kind": kind,
+        "name": name,
+      };
+    }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       return {
         "annotatedNode_metadata": annotatedNode_metadata,
@@ -15113,6 +15357,7 @@
     if (kind == idl.LinkedNodeKind.hideCombinator) {
       return {
         "flags": flags,
+        "informativeId": informativeId,
         "kind": kind,
         "names": names,
         "name": name,
@@ -15150,15 +15395,14 @@
       return {
         "namespaceDirective_combinators": namespaceDirective_combinators,
         "annotatedNode_metadata": annotatedNode_metadata,
-        "importDirective_prefixOffset": importDirective_prefixOffset,
         "namespaceDirective_configurations": namespaceDirective_configurations,
+        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "flags": flags,
         "importDirective_prefix": importDirective_prefix,
         "informativeId": informativeId,
         "uriBasedDirective_uri": uriBasedDirective_uri,
         "kind": kind,
         "name": name,
-        "namespaceDirective_selectedUri": namespaceDirective_selectedUri,
         "uriBasedDirective_uriContent": uriBasedDirective_uriContent,
         "uriBasedDirective_uriElement": uriBasedDirective_uriElement,
       };
@@ -15167,7 +15411,7 @@
       return {
         "indexExpression_index": indexExpression_index,
         "indexExpression_target": indexExpression_target,
-        "indexExpression_elementType": indexExpression_elementType,
+        "indexExpression_substitution": indexExpression_substitution,
         "indexExpression_element": indexExpression_element,
         "expression_type": expression_type,
         "flags": flags,
@@ -15402,7 +15646,7 @@
     if (kind == idl.LinkedNodeKind.postfixExpression) {
       return {
         "postfixExpression_operand": postfixExpression_operand,
-        "postfixExpression_elementType": postfixExpression_elementType,
+        "postfixExpression_substitution": postfixExpression_substitution,
         "postfixExpression_element": postfixExpression_element,
         "postfixExpression_operator": postfixExpression_operator,
         "expression_type": expression_type,
@@ -15414,7 +15658,7 @@
     if (kind == idl.LinkedNodeKind.prefixExpression) {
       return {
         "prefixExpression_operand": prefixExpression_operand,
-        "prefixExpression_elementType": prefixExpression_elementType,
+        "prefixExpression_substitution": prefixExpression_substitution,
         "prefixExpression_element": prefixExpression_element,
         "prefixExpression_operator": prefixExpression_operator,
         "expression_type": expression_type,
@@ -15450,8 +15694,8 @@
             redirectingConstructorInvocation_arguments,
         "redirectingConstructorInvocation_constructorName":
             redirectingConstructorInvocation_constructorName,
-        "redirectingConstructorInvocation_elementType":
-            redirectingConstructorInvocation_elementType,
+        "redirectingConstructorInvocation_substitution":
+            redirectingConstructorInvocation_substitution,
         "redirectingConstructorInvocation_element":
             redirectingConstructorInvocation_element,
         "flags": flags,
@@ -15488,6 +15732,7 @@
     if (kind == idl.LinkedNodeKind.showCombinator) {
       return {
         "flags": flags,
+        "informativeId": informativeId,
         "kind": kind,
         "names": names,
         "name": name,
@@ -15508,7 +15753,7 @@
     }
     if (kind == idl.LinkedNodeKind.simpleIdentifier) {
       return {
-        "simpleIdentifier_elementType": simpleIdentifier_elementType,
+        "simpleIdentifier_substitution": simpleIdentifier_substitution,
         "simpleIdentifier_element": simpleIdentifier_element,
         "expression_type": expression_type,
         "flags": flags,
@@ -15518,10 +15763,10 @@
     }
     if (kind == idl.LinkedNodeKind.simpleStringLiteral) {
       return {
+        "simpleStringLiteral_value": simpleStringLiteral_value,
         "flags": flags,
         "kind": kind,
         "name": name,
-        "simpleStringLiteral_value": simpleStringLiteral_value,
       };
     }
     if (kind == idl.LinkedNodeKind.spreadElement) {
@@ -15547,8 +15792,8 @@
             superConstructorInvocation_arguments,
         "superConstructorInvocation_constructorName":
             superConstructorInvocation_constructorName,
-        "superConstructorInvocation_elementType":
-            superConstructorInvocation_elementType,
+        "superConstructorInvocation_substitution":
+            superConstructorInvocation_substitution,
         "superConstructorInvocation_element":
             superConstructorInvocation_element,
         "flags": flags,
@@ -15651,21 +15896,21 @@
       return {
         "typeName_typeArguments": typeName_typeArguments,
         "typeName_name": typeName_name,
-        "typeName_type": typeName_type,
         "flags": flags,
         "kind": kind,
         "name": name,
+        "typeName_type": typeName_type,
       };
     }
     if (kind == idl.LinkedNodeKind.typeParameter) {
       return {
         "annotatedNode_metadata": annotatedNode_metadata,
         "typeParameter_bound": typeParameter_bound,
-        "typeParameter_defaultType": typeParameter_defaultType,
         "flags": flags,
         "informativeId": informativeId,
         "kind": kind,
         "name": name,
+        "typeParameter_defaultType": typeParameter_defaultType,
       };
     }
     if (kind == idl.LinkedNodeKind.typeParameterList) {
@@ -16781,6 +17026,138 @@
   String toString() => convert.json.encode(toJson());
 }
 
+class LinkedNodeTypeSubstitutionBuilder extends Object
+    with _LinkedNodeTypeSubstitutionMixin
+    implements idl.LinkedNodeTypeSubstitution {
+  List<LinkedNodeTypeBuilder> _typeArguments;
+  List<int> _typeParameters;
+
+  @override
+  List<LinkedNodeTypeBuilder> get typeArguments =>
+      _typeArguments ??= <LinkedNodeTypeBuilder>[];
+
+  set typeArguments(List<LinkedNodeTypeBuilder> value) {
+    this._typeArguments = value;
+  }
+
+  @override
+  List<int> get typeParameters => _typeParameters ??= <int>[];
+
+  set typeParameters(List<int> value) {
+    assert(value == null || value.every((e) => e >= 0));
+    this._typeParameters = value;
+  }
+
+  LinkedNodeTypeSubstitutionBuilder(
+      {List<LinkedNodeTypeBuilder> typeArguments, List<int> typeParameters})
+      : _typeArguments = typeArguments,
+        _typeParameters = typeParameters;
+
+  /// Flush [informative] data recursively.
+  void flushInformative() {
+    _typeArguments?.forEach((b) => b.flushInformative());
+  }
+
+  /// Accumulate non-[informative] data into [signature].
+  void collectApiSignature(api_sig.ApiSignature signature) {
+    if (this._typeParameters == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._typeParameters.length);
+      for (var x in this._typeParameters) {
+        signature.addInt(x);
+      }
+    }
+    if (this._typeArguments == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._typeArguments.length);
+      for (var x in this._typeArguments) {
+        x?.collectApiSignature(signature);
+      }
+    }
+  }
+
+  fb.Offset finish(fb.Builder fbBuilder) {
+    fb.Offset offset_typeArguments;
+    fb.Offset offset_typeParameters;
+    if (!(_typeArguments == null || _typeArguments.isEmpty)) {
+      offset_typeArguments = fbBuilder
+          .writeList(_typeArguments.map((b) => b.finish(fbBuilder)).toList());
+    }
+    if (!(_typeParameters == null || _typeParameters.isEmpty)) {
+      offset_typeParameters = fbBuilder.writeListUint32(_typeParameters);
+    }
+    fbBuilder.startTable();
+    if (offset_typeArguments != null) {
+      fbBuilder.addOffset(1, offset_typeArguments);
+    }
+    if (offset_typeParameters != null) {
+      fbBuilder.addOffset(0, offset_typeParameters);
+    }
+    return fbBuilder.endTable();
+  }
+}
+
+class _LinkedNodeTypeSubstitutionReader
+    extends fb.TableReader<_LinkedNodeTypeSubstitutionImpl> {
+  const _LinkedNodeTypeSubstitutionReader();
+
+  @override
+  _LinkedNodeTypeSubstitutionImpl createObject(
+          fb.BufferContext bc, int offset) =>
+      new _LinkedNodeTypeSubstitutionImpl(bc, offset);
+}
+
+class _LinkedNodeTypeSubstitutionImpl extends Object
+    with _LinkedNodeTypeSubstitutionMixin
+    implements idl.LinkedNodeTypeSubstitution {
+  final fb.BufferContext _bc;
+  final int _bcOffset;
+
+  _LinkedNodeTypeSubstitutionImpl(this._bc, this._bcOffset);
+
+  List<idl.LinkedNodeType> _typeArguments;
+  List<int> _typeParameters;
+
+  @override
+  List<idl.LinkedNodeType> get typeArguments {
+    _typeArguments ??=
+        const fb.ListReader<idl.LinkedNodeType>(const _LinkedNodeTypeReader())
+            .vTableGet(_bc, _bcOffset, 1, const <idl.LinkedNodeType>[]);
+    return _typeArguments;
+  }
+
+  @override
+  List<int> get typeParameters {
+    _typeParameters ??=
+        const fb.Uint32ListReader().vTableGet(_bc, _bcOffset, 0, const <int>[]);
+    return _typeParameters;
+  }
+}
+
+abstract class _LinkedNodeTypeSubstitutionMixin
+    implements idl.LinkedNodeTypeSubstitution {
+  @override
+  Map<String, Object> toJson() {
+    Map<String, Object> _result = <String, Object>{};
+    if (typeArguments.isNotEmpty)
+      _result["typeArguments"] =
+          typeArguments.map((_value) => _value.toJson()).toList();
+    if (typeParameters.isNotEmpty) _result["typeParameters"] = typeParameters;
+    return _result;
+  }
+
+  @override
+  Map<String, Object> toMap() => {
+        "typeArguments": typeArguments,
+        "typeParameters": typeParameters,
+      };
+
+  @override
+  String toString() => convert.json.encode(toJson());
+}
+
 class LinkedNodeTypeTypeParameterBuilder extends Object
     with _LinkedNodeTypeTypeParameterMixin
     implements idl.LinkedNodeTypeTypeParameter {
@@ -22464,6 +22841,7 @@
   UnlinkedDocumentationCommentBuilder _documentationComment;
   List<UnlinkedExecutableBuilder> _executables;
   EntityRefBuilder _extendedType;
+  List<UnlinkedVariableBuilder> _fields;
   String _name;
   int _nameOffset;
   List<UnlinkedTypeParamBuilder> _typeParameters;
@@ -22514,6 +22892,15 @@
   }
 
   @override
+  List<UnlinkedVariableBuilder> get fields =>
+      _fields ??= <UnlinkedVariableBuilder>[];
+
+  /// Field declarations contained in the extension.
+  set fields(List<UnlinkedVariableBuilder> value) {
+    this._fields = value;
+  }
+
+  @override
   String get name => _name ??= '';
 
   /// Name of the extension, or an empty string if there is no name.
@@ -22546,6 +22933,7 @@
       UnlinkedDocumentationCommentBuilder documentationComment,
       List<UnlinkedExecutableBuilder> executables,
       EntityRefBuilder extendedType,
+      List<UnlinkedVariableBuilder> fields,
       String name,
       int nameOffset,
       List<UnlinkedTypeParamBuilder> typeParameters})
@@ -22554,6 +22942,7 @@
         _documentationComment = documentationComment,
         _executables = executables,
         _extendedType = extendedType,
+        _fields = fields,
         _name = name,
         _nameOffset = nameOffset,
         _typeParameters = typeParameters;
@@ -22565,6 +22954,7 @@
     _documentationComment = null;
     _executables?.forEach((b) => b.flushInformative());
     _extendedType?.flushInformative();
+    _fields?.forEach((b) => b.flushInformative());
     _nameOffset = null;
     _typeParameters?.forEach((b) => b.flushInformative());
   }
@@ -22598,6 +22988,14 @@
         x?.collectApiSignature(signature);
       }
     }
+    if (this._fields == null) {
+      signature.addInt(0);
+    } else {
+      signature.addInt(this._fields.length);
+      for (var x in this._fields) {
+        x?.collectApiSignature(signature);
+      }
+    }
   }
 
   fb.Offset finish(fb.Builder fbBuilder) {
@@ -22606,6 +23004,7 @@
     fb.Offset offset_documentationComment;
     fb.Offset offset_executables;
     fb.Offset offset_extendedType;
+    fb.Offset offset_fields;
     fb.Offset offset_name;
     fb.Offset offset_typeParameters;
     if (!(_annotations == null || _annotations.isEmpty)) {
@@ -22625,6 +23024,10 @@
     if (_extendedType != null) {
       offset_extendedType = _extendedType.finish(fbBuilder);
     }
+    if (!(_fields == null || _fields.isEmpty)) {
+      offset_fields =
+          fbBuilder.writeList(_fields.map((b) => b.finish(fbBuilder)).toList());
+    }
     if (_name != null) {
       offset_name = fbBuilder.writeString(_name);
     }
@@ -22648,6 +23051,9 @@
     if (offset_extendedType != null) {
       fbBuilder.addOffset(3, offset_extendedType);
     }
+    if (offset_fields != null) {
+      fbBuilder.addOffset(8, offset_fields);
+    }
     if (offset_name != null) {
       fbBuilder.addOffset(0, offset_name);
     }
@@ -22682,6 +23088,7 @@
   idl.UnlinkedDocumentationComment _documentationComment;
   List<idl.UnlinkedExecutable> _executables;
   idl.EntityRef _extendedType;
+  List<idl.UnlinkedVariable> _fields;
   String _name;
   int _nameOffset;
   List<idl.UnlinkedTypeParam> _typeParameters;
@@ -22723,6 +23130,14 @@
   }
 
   @override
+  List<idl.UnlinkedVariable> get fields {
+    _fields ??= const fb.ListReader<idl.UnlinkedVariable>(
+            const _UnlinkedVariableReader())
+        .vTableGet(_bc, _bcOffset, 8, const <idl.UnlinkedVariable>[]);
+    return _fields;
+  }
+
+  @override
   String get name {
     _name ??= const fb.StringReader().vTableGet(_bc, _bcOffset, 0, '');
     return _name;
@@ -22757,6 +23172,8 @@
       _result["executables"] =
           executables.map((_value) => _value.toJson()).toList();
     if (extendedType != null) _result["extendedType"] = extendedType.toJson();
+    if (fields.isNotEmpty)
+      _result["fields"] = fields.map((_value) => _value.toJson()).toList();
     if (name != '') _result["name"] = name;
     if (nameOffset != 0) _result["nameOffset"] = nameOffset;
     if (typeParameters.isNotEmpty)
@@ -22772,6 +23189,7 @@
         "documentationComment": documentationComment,
         "executables": executables,
         "extendedType": extendedType,
+        "fields": fields,
         "name": name,
         "nameOffset": nameOffset,
         "typeParameters": typeParameters,
@@ -23175,6 +23593,8 @@
     implements idl.UnlinkedInformativeData {
   int _variantField_2;
   int _variantField_3;
+  int _variantField_9;
+  int _variantField_8;
   List<int> _variantField_7;
   int _variantField_6;
   int _variantField_5;
@@ -23190,6 +23610,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23210,6 +23631,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23232,6 +23654,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23252,6 +23675,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23267,6 +23691,46 @@
   }
 
   @override
+  int get combinatorEnd {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    return _variantField_9 ??= 0;
+  }
+
+  set combinatorEnd(int value) {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    assert(value == null || value >= 0);
+    _variantField_9 = value;
+  }
+
+  @override
+  int get combinatorKeywordOffset {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    return _variantField_8 ??= 0;
+  }
+
+  @override
+  int get importDirective_prefixOffset {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    return _variantField_8 ??= 0;
+  }
+
+  set combinatorKeywordOffset(int value) {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    assert(value == null || value >= 0);
+    _variantField_8 = value;
+  }
+
+  set importDirective_prefixOffset(int value) {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    assert(value == null || value >= 0);
+    _variantField_8 = value;
+  }
+
+  @override
   List<int> get compilationUnit_lineStarts {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     return _variantField_7 ??= <int>[];
@@ -23320,6 +23784,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
@@ -23349,6 +23814,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
@@ -23370,6 +23836,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23387,6 +23854,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23482,6 +23950,17 @@
   })  : _kind = idl.LinkedNodeKind.exportDirective,
         _variantField_1 = directiveKeywordOffset;
 
+  UnlinkedInformativeDataBuilder.extensionDeclaration({
+    int codeLength,
+    int codeOffset,
+    int nameOffset,
+    List<String> documentationComment_tokens,
+  })  : _kind = idl.LinkedNodeKind.extensionDeclaration,
+        _variantField_2 = codeLength,
+        _variantField_3 = codeOffset,
+        _variantField_1 = nameOffset,
+        _variantField_4 = documentationComment_tokens;
+
   UnlinkedInformativeDataBuilder.fieldDeclaration({
     List<String> documentationComment_tokens,
   })  : _kind = idl.LinkedNodeKind.fieldDeclaration,
@@ -23538,9 +24017,18 @@
         _variantField_1 = nameOffset,
         _variantField_4 = documentationComment_tokens;
 
+  UnlinkedInformativeDataBuilder.hideCombinator({
+    int combinatorEnd,
+    int combinatorKeywordOffset,
+  })  : _kind = idl.LinkedNodeKind.hideCombinator,
+        _variantField_9 = combinatorEnd,
+        _variantField_8 = combinatorKeywordOffset;
+
   UnlinkedInformativeDataBuilder.importDirective({
+    int importDirective_prefixOffset,
     int directiveKeywordOffset,
   })  : _kind = idl.LinkedNodeKind.importDirective,
+        _variantField_8 = importDirective_prefixOffset,
         _variantField_1 = directiveKeywordOffset;
 
   UnlinkedInformativeDataBuilder.libraryDirective({
@@ -23582,6 +24070,13 @@
   })  : _kind = idl.LinkedNodeKind.partOfDirective,
         _variantField_1 = directiveKeywordOffset;
 
+  UnlinkedInformativeDataBuilder.showCombinator({
+    int combinatorEnd,
+    int combinatorKeywordOffset,
+  })  : _kind = idl.LinkedNodeKind.showCombinator,
+        _variantField_9 = combinatorEnd,
+        _variantField_8 = combinatorKeywordOffset;
+
   UnlinkedInformativeDataBuilder.simpleFormalParameter({
     int codeLength,
     int codeOffset,
@@ -23624,18 +24119,21 @@
     } else if (kind == idl.LinkedNodeKind.enumConstantDeclaration) {
     } else if (kind == idl.LinkedNodeKind.enumDeclaration) {
     } else if (kind == idl.LinkedNodeKind.exportDirective) {
+    } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
     } else if (kind == idl.LinkedNodeKind.fieldFormalParameter) {
     } else if (kind == idl.LinkedNodeKind.functionDeclaration) {
     } else if (kind == idl.LinkedNodeKind.functionTypeAlias) {
     } else if (kind == idl.LinkedNodeKind.functionTypedFormalParameter) {
     } else if (kind == idl.LinkedNodeKind.genericTypeAlias) {
+    } else if (kind == idl.LinkedNodeKind.hideCombinator) {
     } else if (kind == idl.LinkedNodeKind.importDirective) {
     } else if (kind == idl.LinkedNodeKind.libraryDirective) {
     } else if (kind == idl.LinkedNodeKind.methodDeclaration) {
     } else if (kind == idl.LinkedNodeKind.mixinDeclaration) {
     } else if (kind == idl.LinkedNodeKind.partDirective) {
     } else if (kind == idl.LinkedNodeKind.partOfDirective) {
+    } else if (kind == idl.LinkedNodeKind.showCombinator) {
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
     } else if (kind == idl.LinkedNodeKind.topLevelVariableDeclaration) {
     } else if (kind == idl.LinkedNodeKind.typeParameter) {
@@ -23728,6 +24226,19 @@
     } else if (kind == idl.LinkedNodeKind.exportDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.directiveKeywordOffset ?? 0);
+    } else if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      signature.addInt(this.kind == null ? 0 : this.kind.index);
+      signature.addInt(this.nameOffset ?? 0);
+      signature.addInt(this.codeLength ?? 0);
+      signature.addInt(this.codeOffset ?? 0);
+      if (this.documentationComment_tokens == null) {
+        signature.addInt(0);
+      } else {
+        signature.addInt(this.documentationComment_tokens.length);
+        for (var x in this.documentationComment_tokens) {
+          signature.addString(x);
+        }
+      }
     } else if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       if (this.documentationComment_tokens == null) {
@@ -23787,9 +24298,14 @@
           signature.addString(x);
         }
       }
+    } else if (kind == idl.LinkedNodeKind.hideCombinator) {
+      signature.addInt(this.kind == null ? 0 : this.kind.index);
+      signature.addInt(this.combinatorKeywordOffset ?? 0);
+      signature.addInt(this.combinatorEnd ?? 0);
     } else if (kind == idl.LinkedNodeKind.importDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.directiveKeywordOffset ?? 0);
+      signature.addInt(this.importDirective_prefixOffset ?? 0);
     } else if (kind == idl.LinkedNodeKind.libraryDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.directiveKeywordOffset ?? 0);
@@ -23833,6 +24349,10 @@
     } else if (kind == idl.LinkedNodeKind.partOfDirective) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.directiveKeywordOffset ?? 0);
+    } else if (kind == idl.LinkedNodeKind.showCombinator) {
+      signature.addInt(this.kind == null ? 0 : this.kind.index);
+      signature.addInt(this.combinatorKeywordOffset ?? 0);
+      signature.addInt(this.combinatorEnd ?? 0);
     } else if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       signature.addInt(this.kind == null ? 0 : this.kind.index);
       signature.addInt(this.nameOffset ?? 0);
@@ -23878,6 +24398,12 @@
     if (_variantField_3 != null && _variantField_3 != 0) {
       fbBuilder.addUint32(3, _variantField_3);
     }
+    if (_variantField_9 != null && _variantField_9 != 0) {
+      fbBuilder.addUint32(9, _variantField_9);
+    }
+    if (_variantField_8 != null && _variantField_8 != 0) {
+      fbBuilder.addUint32(8, _variantField_8);
+    }
     if (offset_variantField_7 != null) {
       fbBuilder.addOffset(7, offset_variantField_7);
     }
@@ -23919,6 +24445,8 @@
 
   int _variantField_2;
   int _variantField_3;
+  int _variantField_9;
+  int _variantField_8;
   List<int> _variantField_7;
   int _variantField_6;
   int _variantField_5;
@@ -23934,6 +24462,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23956,6 +24485,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.defaultFormalParameter ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -23971,6 +24501,29 @@
   }
 
   @override
+  int get combinatorEnd {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    _variantField_9 ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 9, 0);
+    return _variantField_9;
+  }
+
+  @override
+  int get combinatorKeywordOffset {
+    assert(kind == idl.LinkedNodeKind.hideCombinator ||
+        kind == idl.LinkedNodeKind.showCombinator);
+    _variantField_8 ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
+    return _variantField_8;
+  }
+
+  @override
+  int get importDirective_prefixOffset {
+    assert(kind == idl.LinkedNodeKind.importDirective);
+    _variantField_8 ??= const fb.Uint32Reader().vTableGet(_bc, _bcOffset, 8, 0);
+    return _variantField_8;
+  }
+
+  @override
   List<int> get compilationUnit_lineStarts {
     assert(kind == idl.LinkedNodeKind.compilationUnit);
     _variantField_7 ??=
@@ -24010,6 +24563,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldFormalParameter ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypedFormalParameter ||
@@ -24031,6 +24585,7 @@
         kind == idl.LinkedNodeKind.constructorDeclaration ||
         kind == idl.LinkedNodeKind.enumDeclaration ||
         kind == idl.LinkedNodeKind.enumConstantDeclaration ||
+        kind == idl.LinkedNodeKind.extensionDeclaration ||
         kind == idl.LinkedNodeKind.fieldDeclaration ||
         kind == idl.LinkedNodeKind.functionDeclaration ||
         kind == idl.LinkedNodeKind.functionTypeAlias ||
@@ -24112,6 +24667,13 @@
       if (directiveKeywordOffset != 0)
         _result["directiveKeywordOffset"] = directiveKeywordOffset;
     }
+    if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      if (codeLength != 0) _result["codeLength"] = codeLength;
+      if (codeOffset != 0) _result["codeOffset"] = codeOffset;
+      if (nameOffset != 0) _result["nameOffset"] = nameOffset;
+      if (documentationComment_tokens.isNotEmpty)
+        _result["documentationComment_tokens"] = documentationComment_tokens;
+    }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       if (documentationComment_tokens.isNotEmpty)
         _result["documentationComment_tokens"] = documentationComment_tokens;
@@ -24147,7 +24709,14 @@
       if (documentationComment_tokens.isNotEmpty)
         _result["documentationComment_tokens"] = documentationComment_tokens;
     }
+    if (kind == idl.LinkedNodeKind.hideCombinator) {
+      if (combinatorEnd != 0) _result["combinatorEnd"] = combinatorEnd;
+      if (combinatorKeywordOffset != 0)
+        _result["combinatorKeywordOffset"] = combinatorKeywordOffset;
+    }
     if (kind == idl.LinkedNodeKind.importDirective) {
+      if (importDirective_prefixOffset != 0)
+        _result["importDirective_prefixOffset"] = importDirective_prefixOffset;
       if (directiveKeywordOffset != 0)
         _result["directiveKeywordOffset"] = directiveKeywordOffset;
     }
@@ -24179,6 +24748,11 @@
       if (directiveKeywordOffset != 0)
         _result["directiveKeywordOffset"] = directiveKeywordOffset;
     }
+    if (kind == idl.LinkedNodeKind.showCombinator) {
+      if (combinatorEnd != 0) _result["combinatorEnd"] = combinatorEnd;
+      if (combinatorKeywordOffset != 0)
+        _result["combinatorKeywordOffset"] = combinatorKeywordOffset;
+    }
     if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       if (codeLength != 0) _result["codeLength"] = codeLength;
       if (codeOffset != 0) _result["codeOffset"] = codeOffset;
@@ -24271,6 +24845,15 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.extensionDeclaration) {
+      return {
+        "codeLength": codeLength,
+        "codeOffset": codeOffset,
+        "nameOffset": nameOffset,
+        "documentationComment_tokens": documentationComment_tokens,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.fieldDeclaration) {
       return {
         "documentationComment_tokens": documentationComment_tokens,
@@ -24320,8 +24903,16 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.hideCombinator) {
+      return {
+        "combinatorEnd": combinatorEnd,
+        "combinatorKeywordOffset": combinatorKeywordOffset,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.importDirective) {
       return {
+        "importDirective_prefixOffset": importDirective_prefixOffset,
         "directiveKeywordOffset": directiveKeywordOffset,
         "kind": kind,
       };
@@ -24363,6 +24954,13 @@
         "kind": kind,
       };
     }
+    if (kind == idl.LinkedNodeKind.showCombinator) {
+      return {
+        "combinatorEnd": combinatorEnd,
+        "combinatorKeywordOffset": combinatorKeywordOffset,
+        "kind": kind,
+      };
+    }
     if (kind == idl.LinkedNodeKind.simpleFormalParameter) {
       return {
         "codeLength": codeLength,
@@ -26577,11 +27175,11 @@
     implements idl.UnlinkedUnit {
   List<int> _apiSignature;
   List<UnlinkedClassBuilder> _classes;
-  List<UnlinkedExtensionBuilder> _extensions;
   CodeRangeBuilder _codeRange;
   List<UnlinkedEnumBuilder> _enums;
   List<UnlinkedExecutableBuilder> _executables;
   List<UnlinkedExportNonPublicBuilder> _exports;
+  List<UnlinkedExtensionBuilder> _extensions;
   List<UnlinkedImportBuilder> _imports;
   bool _isNNBD;
   bool _isPartOf;
@@ -26619,15 +27217,6 @@
   }
 
   @override
-  List<UnlinkedExtensionBuilder> get extensions =>
-      _extensions ??= <UnlinkedExtensionBuilder>[];
-
-  /// Extensions declared in the compilation unit.
-  set extensions(List<UnlinkedExtensionBuilder> value) {
-    this._extensions = value;
-  }
-
-  @override
   CodeRangeBuilder get codeRange => _codeRange;
 
   /// Code range of the unit.
@@ -26663,6 +27252,15 @@
   }
 
   @override
+  List<UnlinkedExtensionBuilder> get extensions =>
+      _extensions ??= <UnlinkedExtensionBuilder>[];
+
+  /// Extensions declared in the compilation unit.
+  set extensions(List<UnlinkedExtensionBuilder> value) {
+    this._extensions = value;
+  }
+
+  @override
   Null get fallbackModePath =>
       throw new UnimplementedError('attempt to access deprecated field');
 
@@ -26806,11 +27404,11 @@
   UnlinkedUnitBuilder(
       {List<int> apiSignature,
       List<UnlinkedClassBuilder> classes,
-      List<UnlinkedExtensionBuilder> extensions,
       CodeRangeBuilder codeRange,
       List<UnlinkedEnumBuilder> enums,
       List<UnlinkedExecutableBuilder> executables,
       List<UnlinkedExportNonPublicBuilder> exports,
+      List<UnlinkedExtensionBuilder> extensions,
       List<UnlinkedImportBuilder> imports,
       bool isNNBD,
       bool isPartOf,
@@ -26828,11 +27426,11 @@
       List<UnlinkedVariableBuilder> variables})
       : _apiSignature = apiSignature,
         _classes = classes,
-        _extensions = extensions,
         _codeRange = codeRange,
         _enums = enums,
         _executables = executables,
         _exports = exports,
+        _extensions = extensions,
         _imports = imports,
         _isNNBD = isNNBD,
         _isPartOf = isPartOf,
@@ -26852,11 +27450,11 @@
   /// Flush [informative] data recursively.
   void flushInformative() {
     _classes?.forEach((b) => b.flushInformative());
-    _extensions?.forEach((b) => b.flushInformative());
     _codeRange = null;
     _enums?.forEach((b) => b.flushInformative());
     _executables?.forEach((b) => b.flushInformative());
     _exports?.forEach((b) => b.flushInformative());
+    _extensions?.forEach((b) => b.flushInformative());
     _imports?.forEach((b) => b.flushInformative());
     _libraryAnnotations?.forEach((b) => b.flushInformative());
     _libraryDocumentationComment = null;
@@ -26992,11 +27590,11 @@
   fb.Offset finish(fb.Builder fbBuilder) {
     fb.Offset offset_apiSignature;
     fb.Offset offset_classes;
-    fb.Offset offset_extensions;
     fb.Offset offset_codeRange;
     fb.Offset offset_enums;
     fb.Offset offset_executables;
     fb.Offset offset_exports;
+    fb.Offset offset_extensions;
     fb.Offset offset_imports;
     fb.Offset offset_libraryAnnotations;
     fb.Offset offset_libraryDocumentationComment;
@@ -27015,10 +27613,6 @@
       offset_classes = fbBuilder
           .writeList(_classes.map((b) => b.finish(fbBuilder)).toList());
     }
-    if (!(_extensions == null || _extensions.isEmpty)) {
-      offset_extensions = fbBuilder
-          .writeList(_extensions.map((b) => b.finish(fbBuilder)).toList());
-    }
     if (_codeRange != null) {
       offset_codeRange = _codeRange.finish(fbBuilder);
     }
@@ -27034,6 +27628,10 @@
       offset_exports = fbBuilder
           .writeList(_exports.map((b) => b.finish(fbBuilder)).toList());
     }
+    if (!(_extensions == null || _extensions.isEmpty)) {
+      offset_extensions = fbBuilder
+          .writeList(_extensions.map((b) => b.finish(fbBuilder)).toList());
+    }
     if (!(_imports == null || _imports.isEmpty)) {
       offset_imports = fbBuilder
           .writeList(_imports.map((b) => b.finish(fbBuilder)).toList());
@@ -27082,9 +27680,6 @@
     if (offset_classes != null) {
       fbBuilder.addOffset(2, offset_classes);
     }
-    if (offset_extensions != null) {
-      fbBuilder.addOffset(22, offset_extensions);
-    }
     if (offset_codeRange != null) {
       fbBuilder.addOffset(15, offset_codeRange);
     }
@@ -27097,6 +27692,9 @@
     if (offset_exports != null) {
       fbBuilder.addOffset(13, offset_exports);
     }
+    if (offset_extensions != null) {
+      fbBuilder.addOffset(22, offset_extensions);
+    }
     if (offset_imports != null) {
       fbBuilder.addOffset(5, offset_imports);
     }
@@ -27169,11 +27767,11 @@
 
   List<int> _apiSignature;
   List<idl.UnlinkedClass> _classes;
-  List<idl.UnlinkedExtension> _extensions;
   idl.CodeRange _codeRange;
   List<idl.UnlinkedEnum> _enums;
   List<idl.UnlinkedExecutable> _executables;
   List<idl.UnlinkedExportNonPublic> _exports;
+  List<idl.UnlinkedExtension> _extensions;
   List<idl.UnlinkedImport> _imports;
   bool _isNNBD;
   bool _isPartOf;
@@ -27206,14 +27804,6 @@
   }
 
   @override
-  List<idl.UnlinkedExtension> get extensions {
-    _extensions ??= const fb.ListReader<idl.UnlinkedExtension>(
-            const _UnlinkedExtensionReader())
-        .vTableGet(_bc, _bcOffset, 22, const <idl.UnlinkedExtension>[]);
-    return _extensions;
-  }
-
-  @override
   idl.CodeRange get codeRange {
     _codeRange ??= const _CodeRangeReader().vTableGet(_bc, _bcOffset, 15, null);
     return _codeRange;
@@ -27244,6 +27834,14 @@
   }
 
   @override
+  List<idl.UnlinkedExtension> get extensions {
+    _extensions ??= const fb.ListReader<idl.UnlinkedExtension>(
+            const _UnlinkedExtensionReader())
+        .vTableGet(_bc, _bcOffset, 22, const <idl.UnlinkedExtension>[]);
+    return _extensions;
+  }
+
+  @override
   Null get fallbackModePath =>
       throw new UnimplementedError('attempt to access deprecated field');
 
@@ -27364,9 +27962,6 @@
     if (apiSignature.isNotEmpty) _result["apiSignature"] = apiSignature;
     if (classes.isNotEmpty)
       _result["classes"] = classes.map((_value) => _value.toJson()).toList();
-    if (extensions.isNotEmpty)
-      _result["extensions"] =
-          extensions.map((_value) => _value.toJson()).toList();
     if (codeRange != null) _result["codeRange"] = codeRange.toJson();
     if (enums.isNotEmpty)
       _result["enums"] = enums.map((_value) => _value.toJson()).toList();
@@ -27375,6 +27970,9 @@
           executables.map((_value) => _value.toJson()).toList();
     if (exports.isNotEmpty)
       _result["exports"] = exports.map((_value) => _value.toJson()).toList();
+    if (extensions.isNotEmpty)
+      _result["extensions"] =
+          extensions.map((_value) => _value.toJson()).toList();
     if (imports.isNotEmpty)
       _result["imports"] = imports.map((_value) => _value.toJson()).toList();
     if (isNNBD != false) _result["isNNBD"] = isNNBD;
@@ -27412,11 +28010,11 @@
   Map<String, Object> toMap() => {
         "apiSignature": apiSignature,
         "classes": classes,
-        "extensions": extensions,
         "codeRange": codeRange,
         "enums": enums,
         "executables": executables,
         "exports": exports,
+        "extensions": extensions,
         "imports": imports,
         "isNNBD": isNNBD,
         "isPartOf": isPartOf,
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index f4e0ac1..cfb2b67 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -20,12 +20,18 @@
 
   ENUM_CONSTANT,
 
+  EXTENSION,
+
+  FIELD,
+
   FUNCTION,
 
   FUNCTION_TYPE_ALIAS,
 
   GETTER,
 
+  METHOD,
+
   MIXIN,
 
   SETTER,
@@ -265,6 +271,8 @@
 
   extendsClause,
 
+  extensionDeclaration,
+
   fieldDeclaration,
 
   fieldFormalParameter,
@@ -1594,54 +1602,58 @@
 table AvailableDeclaration {
   children:[AvailableDeclaration] (id: 0);
 
-  defaultArgumentListString:string (id: 1);
+  codeLength:uint (id: 1);
 
-  defaultArgumentListTextRanges:[uint] (id: 2);
+  codeOffset:uint (id: 2);
 
-  docComplete:string (id: 3);
+  defaultArgumentListString:string (id: 3);
 
-  docSummary:string (id: 4);
+  defaultArgumentListTextRanges:[uint] (id: 4);
 
-  fieldMask:uint (id: 5);
+  docComplete:string (id: 5);
 
-  isAbstract:bool (id: 6);
+  docSummary:string (id: 6);
 
-  isConst:bool (id: 7);
+  fieldMask:uint (id: 7);
 
-  isDeprecated:bool (id: 8);
+  isAbstract:bool (id: 8);
 
-  isFinal:bool (id: 9);
+  isConst:bool (id: 9);
+
+  isDeprecated:bool (id: 10);
+
+  isFinal:bool (id: 11);
 
   /// The kind of the declaration.
-  kind:AvailableDeclarationKind (id: 10);
+  kind:AvailableDeclarationKind (id: 12);
 
-  locationOffset:uint (id: 11);
+  locationOffset:uint (id: 13);
 
-  locationStartColumn:uint (id: 12);
+  locationStartColumn:uint (id: 14);
 
-  locationStartLine:uint (id: 13);
+  locationStartLine:uint (id: 15);
 
   /// The first part of the declaration name, usually the only one, for example
   /// the name of a class like `MyClass`, or a function like `myFunction`.
-  name:string (id: 14);
+  name:string (id: 16);
 
-  parameterNames:[string] (id: 15);
+  parameterNames:[string] (id: 17);
 
-  parameters:string (id: 16);
+  parameters:string (id: 18);
 
-  parameterTypes:[string] (id: 17);
+  parameterTypes:[string] (id: 19);
 
   /// The partial list of relevance tags.  Not every declaration has one (for
   /// example, function do not currently), and not every declaration has to
   /// store one (for classes it can be computed when we know the library that
   /// includes this file).
-  relevanceTags:[string] (id: 18);
+  relevanceTags:[string] (id: 20);
 
-  requiredParameterCount:uint (id: 19);
+  requiredParameterCount:uint (id: 21);
 
-  returnType:string (id: 20);
+  returnType:string (id: 22);
 
-  typeParameters:string (id: 21);
+  typeParameters:string (id: 23);
 }
 
 /// Information about an available, even if not yet imported file.
@@ -1650,19 +1662,22 @@
   declarations:[AvailableDeclaration] (id: 0);
 
   /// The Dartdoc directives in the file.
-  directiveInfo:DirectiveInfo (id: 5);
+  directiveInfo:DirectiveInfo (id: 1);
 
   /// Exports directives of the file.
-  exports:[AvailableFileExport] (id: 1);
+  exports:[AvailableFileExport] (id: 2);
 
   /// Is `true` if this file is a library.
-  isLibrary:bool (id: 2);
+  isLibrary:bool (id: 3);
 
   /// Is `true` if this file is a library, and it is deprecated.
-  isLibraryDeprecated:bool (id: 3);
+  isLibraryDeprecated:bool (id: 4);
+
+  /// Offsets of the first character of each line in the source code.
+  lineStarts:[uint] (id: 5);
 
   /// URIs of `part` directives.
-  parts:[string] (id: 4);
+  parts:[string] (id: 6);
 }
 
 /// Information about an export directive.
@@ -1912,10 +1927,10 @@
 
   variantField_17:uint (id: 17);
 
-  variantField_23:LinkedNodeType (id: 23);
-
   variantField_8:LinkedNode (id: 8);
 
+  variantField_38:LinkedNodeTypeSubstitution (id: 38);
+
   variantField_15:uint (id: 15);
 
   variantField_28:UnlinkedTokenType (id: 28);
@@ -1944,6 +1959,8 @@
 
   variantField_25:LinkedNodeType (id: 25);
 
+  variantField_20:string (id: 20);
+
   flags:uint (id: 18);
 
   variantField_1:string (id: 1);
@@ -1962,14 +1979,14 @@
 
   name:string (id: 37);
 
-  variantField_20:string (id: 20);
-
   variantField_31:bool (id: 31);
 
   variantField_35:UnlinkedTokenType (id: 35);
 
   variantField_32:TopLevelInferenceError (id: 32);
 
+  variantField_23:LinkedNodeType (id: 23);
+
   variantField_11:LinkedNode (id: 11);
 
   variantField_22:string (id: 22);
@@ -2044,6 +2061,13 @@
   type:LinkedNodeType (id: 2);
 }
 
+/// Information about a type substitution.
+table LinkedNodeTypeSubstitution {
+  typeArguments:[LinkedNodeType] (id: 1);
+
+  typeParameters:[uint] (id: 0);
+}
+
 /// Information about a type parameter in a function type.
 table LinkedNodeTypeTypeParameter {
   bound:LinkedNodeType (id: 1);
@@ -2739,6 +2763,9 @@
   /// The type being extended.
   extendedType:EntityRef (id: 3);
 
+  /// Field declarations contained in the extension.
+  fields:[UnlinkedVariable] (id: 8);
+
   /// Name of the extension, or an empty string if there is no name.
   name:string (id: 0);
 
@@ -2799,6 +2826,10 @@
 
   variantField_3:uint (id: 3);
 
+  variantField_9:uint (id: 9);
+
+  variantField_8:uint (id: 8);
+
   /// Offsets of the first character of each line in the source code.
   variantField_7:[uint] (id: 7);
 
@@ -3070,9 +3101,6 @@
   /// Classes declared in the compilation unit.
   classes:[UnlinkedClass] (id: 2);
 
-  /// Extensions declared in the compilation unit.
-  extensions:[UnlinkedExtension] (id: 22);
-
   /// Code range of the unit.
   codeRange:CodeRange (id: 15);
 
@@ -3086,6 +3114,9 @@
   /// Export declarations in the compilation unit.
   exports:[UnlinkedExportNonPublic] (id: 13);
 
+  /// Extensions declared in the compilation unit.
+  extensions:[UnlinkedExtension] (id: 22);
+
   /// If this compilation unit was summarized in fallback mode, the path where
   /// the compilation unit may be found on disk.  Otherwise empty.
   ///
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index b157cdf..42e5b1f 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -299,73 +299,79 @@
   List<AvailableDeclaration> get children;
 
   @Id(1)
-  String get defaultArgumentListString;
+  int get codeLength;
 
   @Id(2)
-  List<int> get defaultArgumentListTextRanges;
+  int get codeOffset;
 
   @Id(3)
-  String get docComplete;
+  String get defaultArgumentListString;
 
   @Id(4)
-  String get docSummary;
+  List<int> get defaultArgumentListTextRanges;
 
   @Id(5)
-  int get fieldMask;
+  String get docComplete;
 
   @Id(6)
-  bool get isAbstract;
+  String get docSummary;
 
   @Id(7)
-  bool get isConst;
+  int get fieldMask;
 
   @Id(8)
-  bool get isDeprecated;
+  bool get isAbstract;
 
   @Id(9)
+  bool get isConst;
+
+  @Id(10)
+  bool get isDeprecated;
+
+  @Id(11)
   bool get isFinal;
 
   /// The kind of the declaration.
-  @Id(10)
+  @Id(12)
   AvailableDeclarationKind get kind;
 
-  @Id(11)
+  @Id(13)
   int get locationOffset;
 
-  @Id(12)
+  @Id(14)
   int get locationStartColumn;
 
-  @Id(13)
+  @Id(15)
   int get locationStartLine;
 
   /// The first part of the declaration name, usually the only one, for example
   /// the name of a class like `MyClass`, or a function like `myFunction`.
-  @Id(14)
+  @Id(16)
   String get name;
 
-  @Id(15)
+  @Id(17)
   List<String> get parameterNames;
 
-  @Id(16)
+  @Id(18)
   String get parameters;
 
-  @Id(17)
+  @Id(19)
   List<String> get parameterTypes;
 
   /// The partial list of relevance tags.  Not every declaration has one (for
   /// example, function do not currently), and not every declaration has to
   /// store one (for classes it can be computed when we know the library that
   /// includes this file).
-  @Id(18)
+  @Id(20)
   List<String> get relevanceTags;
 
-  @Id(19)
+  @Id(21)
   int get requiredParameterCount;
 
-  @Id(20)
+  @Id(22)
   String get returnType;
 
-  @Id(21)
+  @Id(23)
   String get typeParameters;
 }
 
@@ -376,9 +382,12 @@
   CONSTRUCTOR,
   ENUM,
   ENUM_CONSTANT,
+  EXTENSION,
+  FIELD,
   FUNCTION,
   FUNCTION_TYPE_ALIAS,
   GETTER,
+  METHOD,
   MIXIN,
   SETTER,
   VARIABLE
@@ -395,23 +404,28 @@
   List<AvailableDeclaration> get declarations;
 
   /// The Dartdoc directives in the file.
-  @Id(5)
+  @Id(1)
   DirectiveInfo get directiveInfo;
 
   /// Exports directives of the file.
-  @Id(1)
+  @Id(2)
   List<AvailableFileExport> get exports;
 
   /// Is `true` if this file is a library.
-  @Id(2)
+  @Id(3)
   bool get isLibrary;
 
   /// Is `true` if this file is a library, and it is deprecated.
-  @Id(3)
+  @Id(4)
   bool get isLibraryDeprecated;
 
+  /// Offsets of the first character of each line in the source code.
+  @informative
+  @Id(5)
+  List<int> get lineStarts;
+
   /// URIs of `part` directives.
-  @Id(4)
+  @Id(6)
   List<String> get parts;
 }
 
@@ -853,6 +867,7 @@
     LinkedNodeKind.enumDeclaration,
     LinkedNodeKind.enumConstantDeclaration,
     LinkedNodeKind.exportDirective,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldDeclaration,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypeAlias,
@@ -879,12 +894,12 @@
   @VariantId(17, variant: LinkedNodeKind.annotation)
   int get annotation_element;
 
-  @VariantId(23, variant: LinkedNodeKind.annotation)
-  LinkedNodeType get annotation_elementType;
-
   @VariantId(8, variant: LinkedNodeKind.annotation)
   LinkedNode get annotation_name;
 
+  @VariantId(38, variant: LinkedNodeKind.annotation)
+  LinkedNodeTypeSubstitution get annotation_substitution;
+
   @VariantId(2, variant: LinkedNodeKind.argumentList)
   List<LinkedNode> get argumentList_arguments;
 
@@ -909,9 +924,6 @@
   @VariantId(15, variant: LinkedNodeKind.assignmentExpression)
   int get assignmentExpression_element;
 
-  @VariantId(23, variant: LinkedNodeKind.assignmentExpression)
-  LinkedNodeType get assignmentExpression_elementType;
-
   @VariantId(6, variant: LinkedNodeKind.assignmentExpression)
   LinkedNode get assignmentExpression_leftHandSide;
 
@@ -921,15 +933,15 @@
   @VariantId(7, variant: LinkedNodeKind.assignmentExpression)
   LinkedNode get assignmentExpression_rightHandSide;
 
+  @VariantId(38, variant: LinkedNodeKind.assignmentExpression)
+  LinkedNodeTypeSubstitution get assignmentExpression_substitution;
+
   @VariantId(6, variant: LinkedNodeKind.awaitExpression)
   LinkedNode get awaitExpression_expression;
 
   @VariantId(15, variant: LinkedNodeKind.binaryExpression)
   int get binaryExpression_element;
 
-  @VariantId(23, variant: LinkedNodeKind.binaryExpression)
-  LinkedNodeType get binaryExpression_elementType;
-
   @VariantId(24, variant: LinkedNodeKind.binaryExpression)
   LinkedNodeType get binaryExpression_invokeType;
 
@@ -942,6 +954,9 @@
   @VariantId(7, variant: LinkedNodeKind.binaryExpression)
   LinkedNode get binaryExpression_rightOperand;
 
+  @VariantId(38, variant: LinkedNodeKind.binaryExpression)
+  LinkedNodeTypeSubstitution get binaryExpression_substitution;
+
   @VariantId(2, variant: LinkedNodeKind.block)
   List<LinkedNode> get block_statements;
 
@@ -1077,12 +1092,12 @@
   @VariantId(15, variant: LinkedNodeKind.constructorName)
   int get constructorName_element;
 
-  @VariantId(23, variant: LinkedNodeKind.constructorName)
-  LinkedNodeType get constructorName_elementType;
-
   @VariantId(6, variant: LinkedNodeKind.constructorName)
   LinkedNode get constructorName_name;
 
+  @VariantId(38, variant: LinkedNodeKind.constructorName)
+  LinkedNodeTypeSubstitution get constructorName_substitution;
+
   @VariantId(7, variant: LinkedNodeKind.constructorName)
   LinkedNode get constructorName_type;
 
@@ -1162,6 +1177,18 @@
   @VariantId(6, variant: LinkedNodeKind.extendsClause)
   LinkedNode get extendsClause_superclass;
 
+  @VariantId(7, variant: LinkedNodeKind.extensionDeclaration)
+  LinkedNode get extensionDeclaration_extendedType;
+
+  @VariantId(5, variant: LinkedNodeKind.extensionDeclaration)
+  List<LinkedNode> get extensionDeclaration_members;
+
+  @VariantId(20, variant: LinkedNodeKind.extensionDeclaration)
+  String get extensionDeclaration_refName;
+
+  @VariantId(6, variant: LinkedNodeKind.extensionDeclaration)
+  LinkedNode get extensionDeclaration_typeParameters;
+
   @VariantId(6, variant: LinkedNodeKind.fieldDeclaration)
   LinkedNode get fieldDeclaration_fields;
 
@@ -1306,18 +1333,15 @@
   @VariantId(1, variant: LinkedNodeKind.importDirective)
   String get importDirective_prefix;
 
-  @VariantId(15, variant: LinkedNodeKind.importDirective)
-  int get importDirective_prefixOffset;
-
   @VariantId(15, variant: LinkedNodeKind.indexExpression)
   int get indexExpression_element;
 
-  @VariantId(23, variant: LinkedNodeKind.indexExpression)
-  LinkedNodeType get indexExpression_elementType;
-
   @VariantId(6, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_index;
 
+  @VariantId(38, variant: LinkedNodeKind.indexExpression)
+  LinkedNodeTypeSubstitution get indexExpression_substitution;
+
   @VariantId(7, variant: LinkedNodeKind.indexExpression)
   LinkedNode get indexExpression_target;
 
@@ -1331,18 +1355,21 @@
     LinkedNodeKind.enumConstantDeclaration,
     LinkedNodeKind.enumDeclaration,
     LinkedNodeKind.exportDirective,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldDeclaration,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypedFormalParameter,
     LinkedNodeKind.functionTypeAlias,
     LinkedNodeKind.genericTypeAlias,
+    LinkedNodeKind.hideCombinator,
     LinkedNodeKind.importDirective,
     LinkedNodeKind.libraryDirective,
     LinkedNodeKind.methodDeclaration,
     LinkedNodeKind.mixinDeclaration,
     LinkedNodeKind.partDirective,
     LinkedNodeKind.partOfDirective,
+    LinkedNodeKind.showCombinator,
     LinkedNodeKind.simpleFormalParameter,
     LinkedNodeKind.topLevelVariableDeclaration,
     LinkedNodeKind.typeParameter,
@@ -1518,15 +1545,15 @@
   @VariantId(15, variant: LinkedNodeKind.postfixExpression)
   int get postfixExpression_element;
 
-  @VariantId(23, variant: LinkedNodeKind.postfixExpression)
-  LinkedNodeType get postfixExpression_elementType;
-
   @VariantId(6, variant: LinkedNodeKind.postfixExpression)
   LinkedNode get postfixExpression_operand;
 
   @VariantId(28, variant: LinkedNodeKind.postfixExpression)
   UnlinkedTokenType get postfixExpression_operator;
 
+  @VariantId(38, variant: LinkedNodeKind.postfixExpression)
+  LinkedNodeTypeSubstitution get postfixExpression_substitution;
+
   @VariantId(6, variant: LinkedNodeKind.prefixedIdentifier)
   LinkedNode get prefixedIdentifier_identifier;
 
@@ -1536,15 +1563,15 @@
   @VariantId(15, variant: LinkedNodeKind.prefixExpression)
   int get prefixExpression_element;
 
-  @VariantId(23, variant: LinkedNodeKind.prefixExpression)
-  LinkedNodeType get prefixExpression_elementType;
-
   @VariantId(6, variant: LinkedNodeKind.prefixExpression)
   LinkedNode get prefixExpression_operand;
 
   @VariantId(28, variant: LinkedNodeKind.prefixExpression)
   UnlinkedTokenType get prefixExpression_operator;
 
+  @VariantId(38, variant: LinkedNodeKind.prefixExpression)
+  LinkedNodeTypeSubstitution get prefixExpression_substitution;
+
   @VariantId(28, variant: LinkedNodeKind.propertyAccess)
   UnlinkedTokenType get propertyAccess_operator;
 
@@ -1563,8 +1590,8 @@
   @VariantId(15, variant: LinkedNodeKind.redirectingConstructorInvocation)
   int get redirectingConstructorInvocation_element;
 
-  @VariantId(23, variant: LinkedNodeKind.redirectingConstructorInvocation)
-  LinkedNodeType get redirectingConstructorInvocation_elementType;
+  @VariantId(38, variant: LinkedNodeKind.redirectingConstructorInvocation)
+  LinkedNodeTypeSubstitution get redirectingConstructorInvocation_substitution;
 
   @VariantId(6, variant: LinkedNodeKind.returnStatement)
   LinkedNode get returnStatement_expression;
@@ -1578,8 +1605,8 @@
   @VariantId(15, variant: LinkedNodeKind.simpleIdentifier)
   int get simpleIdentifier_element;
 
-  @VariantId(23, variant: LinkedNodeKind.simpleIdentifier)
-  LinkedNodeType get simpleIdentifier_elementType;
+  @VariantId(38, variant: LinkedNodeKind.simpleIdentifier)
+  LinkedNodeTypeSubstitution get simpleIdentifier_substitution;
 
   @VariantId(20, variant: LinkedNodeKind.simpleStringLiteral)
   String get simpleStringLiteral_value;
@@ -1611,8 +1638,8 @@
   @VariantId(15, variant: LinkedNodeKind.superConstructorInvocation)
   int get superConstructorInvocation_element;
 
-  @VariantId(23, variant: LinkedNodeKind.superConstructorInvocation)
-  LinkedNodeType get superConstructorInvocation_elementType;
+  @VariantId(38, variant: LinkedNodeKind.superConstructorInvocation)
+  LinkedNodeTypeSubstitution get superConstructorInvocation_substitution;
 
   @VariantId(6, variant: LinkedNodeKind.switchCase)
   LinkedNode get switchCase_expression;
@@ -1807,6 +1834,7 @@
   expressionFunctionBody,
   expressionStatement,
   extendsClause,
+  extensionDeclaration,
   fieldDeclaration,
   fieldFormalParameter,
   formalParameterList,
@@ -1978,6 +2006,15 @@
   void_
 }
 
+/// Information about a type substitution.
+abstract class LinkedNodeTypeSubstitution extends base.SummaryClass {
+  @Id(1)
+  List<LinkedNodeType> get typeArguments;
+
+  @Id(0)
+  List<int> get typeParameters;
+}
+
 /// Information about a type parameter in a function type.
 abstract class LinkedNodeTypeTypeParameter extends base.SummaryClass {
   @Id(1)
@@ -3522,6 +3559,10 @@
   @Id(3)
   EntityRef get extendedType;
 
+  /// Field declarations contained in the extension.
+  @Id(8)
+  List<UnlinkedVariable> get fields;
+
   /// Name of the extension, or an empty string if there is no name.
   @Id(0)
   String get name;
@@ -3605,6 +3646,7 @@
     LinkedNodeKind.constructorDeclaration,
     LinkedNodeKind.defaultFormalParameter,
     LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypeAlias,
@@ -3625,6 +3667,7 @@
     LinkedNodeKind.constructorDeclaration,
     LinkedNodeKind.defaultFormalParameter,
     LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypeAlias,
@@ -3638,6 +3681,18 @@
   ])
   int get codeOffset;
 
+  @VariantId(9, variantList: [
+    LinkedNodeKind.hideCombinator,
+    LinkedNodeKind.showCombinator,
+  ])
+  int get combinatorEnd;
+
+  @VariantId(8, variantList: [
+    LinkedNodeKind.hideCombinator,
+    LinkedNodeKind.showCombinator,
+  ])
+  int get combinatorKeywordOffset;
+
   /// Offsets of the first character of each line in the source code.
   @VariantId(7, variant: LinkedNodeKind.compilationUnit)
   List<int> get compilationUnit_lineStarts;
@@ -3663,6 +3718,7 @@
     LinkedNodeKind.constructorDeclaration,
     LinkedNodeKind.enumDeclaration,
     LinkedNodeKind.enumConstantDeclaration,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldDeclaration,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypeAlias,
@@ -3674,6 +3730,9 @@
   ])
   List<String> get documentationComment_tokens;
 
+  @VariantId(8, variant: LinkedNodeKind.importDirective)
+  int get importDirective_prefixOffset;
+
   /// The kind of the node.
   @Id(0)
   LinkedNodeKind get kind;
@@ -3684,6 +3743,7 @@
     LinkedNodeKind.constructorDeclaration,
     LinkedNodeKind.enumConstantDeclaration,
     LinkedNodeKind.enumDeclaration,
+    LinkedNodeKind.extensionDeclaration,
     LinkedNodeKind.fieldFormalParameter,
     LinkedNodeKind.functionDeclaration,
     LinkedNodeKind.functionTypedFormalParameter,
@@ -4192,10 +4252,6 @@
   @Id(2)
   List<UnlinkedClass> get classes;
 
-  /// Extensions declared in the compilation unit.
-  @Id(22)
-  List<UnlinkedExtension> get extensions;
-
   /// Code range of the unit.
   @informative
   @Id(15)
@@ -4214,6 +4270,10 @@
   @Id(13)
   List<UnlinkedExportNonPublic> get exports;
 
+  /// Extensions declared in the compilation unit.
+  @Id(22)
+  List<UnlinkedExtension> get extensions;
+
   /// If this compilation unit was summarized in fallback mode, the path where
   /// the compilation unit may be found on disk.  Otherwise empty.
   ///
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index e5e51d3..96da0a0 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -68,8 +68,9 @@
 import 'package:analyzer/src/dart/constant/value.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/ast_rewrite.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -207,7 +208,7 @@
     result.reference = compilationUnit.addRawReference('*bottom*');
     return result;
   } else if (type is TypeParameterType) {
-    TypeParameterElementImpl element = type.element;
+    TypeParameterElement element = type.element;
     var deBruijnIndex = typeParameterContext?.computeDeBruijnIndex(element);
     if (deBruijnIndex != null) {
       result.paramReference = deBruijnIndex;
@@ -2474,7 +2475,7 @@
       nameScope = new ClassScope(
           new TypeParameterScope(nameScope, enclosingClass), enclosingClass);
     }
-    var inheritance = new InheritanceManager2(linker.typeSystem);
+    var inheritance = new InheritanceManager3(linker.typeSystem);
     // Note: this is a bit of a hack; we ought to use the feature set for the
     // compilation unit being analyzed, but that's not feasible because sumaries
     // don't record the feature set.  This should be resolved when we switch to
@@ -2571,12 +2572,14 @@
   @override
   final CompilationUnitElementForLink enclosingElement;
 
-  // TODO(brianwilkerson) Remove this field if it remains unreferenced.
   final UnlinkedExtension _unlinkedExtension;
 
   ExtensionElementForLink(this.enclosingElement, this._unlinkedExtension);
 
   @override
+  String get name => _unlinkedExtension.name;
+
+  @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
 
@@ -3995,7 +3998,7 @@
   SpecialTypeElementForLink _voidElement;
   SpecialTypeElementForLink _dynamicElement;
   SpecialTypeElementForLink _bottomElement;
-  InheritanceManager2 _inheritanceManager;
+  InheritanceManager3 _inheritanceManager;
   ContextForLink _context;
   AnalysisSessionForLink _session;
 
@@ -4034,9 +4037,9 @@
   SpecialTypeElementForLink get dynamicElement => _dynamicElement ??=
       new SpecialTypeElementForLink(this, DynamicTypeImpl.instance);
 
-  /// Get an instance of [InheritanceManager2] for use during linking.
-  InheritanceManager2 get inheritanceManager =>
-      _inheritanceManager ??= new InheritanceManager2(typeSystem);
+  /// Get an instance of [InheritanceManager3] for use during linking.
+  InheritanceManager3 get inheritanceManager =>
+      _inheritanceManager ??= new InheritanceManager3(typeSystem);
 
   /// Get a stub implementation of [AnalysisContext] which can be used during
   /// linking.
@@ -5557,6 +5560,9 @@
   InterfaceType get typeType =>
       _typeType ??= _buildInterfaceType(_linker.coreLibrary, 'Type');
 
+  @override
+  VoidType get voidType => VoidTypeImpl.instance;
+
   InterfaceType _buildInterfaceType(
       LibraryElementForLink library, String name) {
     return library.getContainedName(name).buildType((int i) {
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index d015e2a..4de81f7 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -7,6 +7,7 @@
 
 import 'package:analyzer/dart/analysis/session.dart';
 import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/source_io.dart';
@@ -130,10 +131,17 @@
   Source resolveAbsolute(Uri uri, [Uri actualUri]) {
     actualUri ??= uri;
     String uriString = uri.toString();
-    UnlinkedUnit unit = _dataStore.unlinkedMap[uriString];
-    if (unit != null) {
+    if (AnalysisDriver.useSummary2) {
       String summaryPath = _dataStore.uriToSummaryPath[uriString];
-      return new InSummarySource(actualUri, summaryPath);
+      if (summaryPath != null) {
+        return new InSummarySource(actualUri, summaryPath);
+      }
+    } else {
+      UnlinkedUnit unit = _dataStore.unlinkedMap[uriString];
+      if (unit != null) {
+        String summaryPath = _dataStore.uriToSummaryPath[uriString];
+        return new InSummarySource(actualUri, summaryPath);
+      }
     }
     return null;
   }
@@ -193,10 +201,13 @@
   final Map<String, LinkedLibrary> linkedMap = <String, LinkedLibrary>{};
 
   /**
-   * Map from the URI of a library to the summary path that contained it.
+   * Map from the URI of a unit to the summary path that contained it.
    */
   final Map<String, String> uriToSummaryPath = <String, String>{};
 
+  final Set<String> _libraryUris = Set<String>();
+  final Set<String> _partUris = Set<String>();
+
   /**
    * List of summary paths.
    */
@@ -224,6 +235,7 @@
    */
   void addBundle(String path, PackageBundle bundle) {
     bundles.add(bundle);
+
     for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
       String uri = bundle.unlinkedUnitUris[i];
       if (_disallowOverlappingSummaries &&
@@ -239,6 +251,20 @@
       String uri = bundle.linkedLibraryUris[i];
       addLinkedLibrary(uri, bundle.linkedLibraries[i]);
     }
+
+    if (bundle.bundle2 != null) {
+      for (var library in bundle.bundle2.libraries) {
+        var libraryUri = library.uriStr;
+        _libraryUris.add(libraryUri);
+        for (var unit in library.units) {
+          var unitUri = unit.uriStr;
+          uriToSummaryPath[unitUri] = path;
+          if (unitUri != libraryUri) {
+            _partUris.add(unitUri);
+          }
+        }
+      }
+    }
   }
 
   /**
@@ -293,7 +319,11 @@
    * with the given absolute [uri].
    */
   bool hasLinkedLibrary(String uri) {
-    return linkedMap.containsKey(uri);
+    if (AnalysisDriver.useSummary2) {
+      return _libraryUris.contains(uri);
+    } else {
+      return linkedMap.containsKey(uri);
+    }
   }
 
   /**
@@ -301,7 +331,22 @@
    * with the given absolute [uri].
    */
   bool hasUnlinkedUnit(String uri) {
-    return unlinkedMap.containsKey(uri);
+    if (AnalysisDriver.useSummary2) {
+      return uriToSummaryPath.containsKey(uri);
+    } else {
+      return unlinkedMap.containsKey(uri);
+    }
+  }
+
+  /**
+   * Return `true` if the unit with the [uri] is a part unit in the store.
+   */
+  bool isPartUnit(String uri) {
+    if (AnalysisDriver.useSummary2) {
+      return _partUris.contains(uri);
+    } else {
+      return !linkedMap.containsKey(uri);
+    }
   }
 
   void _fillMaps(String path, ResourceProvider resourceProvider) {
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index fbe8c41..4601ade 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -577,7 +577,7 @@
       element = infoElement.unnamedConstructor;
     }
     if (element != null && info.hasTypeParameters) {
-      return new ConstructorMember(element, classType);
+      return ConstructorMember.from(element, classType);
     }
     return element;
   }
@@ -1559,7 +1559,15 @@
         }
         switch (linkedReference.kind) {
           case ReferenceKind.classOrEnum:
-            element = new ClassElementHandle(summaryResynthesizer, location);
+            if (locationComponents.length == 3 &&
+                locationComponents[0] == 'dart:core' &&
+                locationComponents[1] == 'dart:core' &&
+                locationComponents[2] == 'Never') {
+              element = NeverElementImpl.instance;
+              type = BottomTypeImpl.instance;
+            } else {
+              element = new ClassElementHandle(summaryResynthesizer, location);
+            }
             isDeclarableType = true;
             break;
           case ReferenceKind.constructor:
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index f5da9a7..401122b 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -293,6 +293,9 @@
   /// True if the 'dart:core' library is been summarized.
   bool isCoreLibrary = false;
 
+  /// True if the 'dart:core' library defining unit is been summarized.
+  bool isCoreLibraryDefiningUnit = false;
+
   /// True is a [PartOfDirective] was found, so the unit is a part.
   bool isPartOf = false;
 
@@ -516,7 +519,17 @@
     b.references = unlinkedReferences;
     b.typedefs = typedefs;
     b.variables = variables;
+
     b.publicNamespace = computePublicNamespace(compilationUnit);
+    if (isCoreLibraryDefiningUnit) {
+      b.publicNamespace.names.add(
+        UnlinkedPublicNameBuilder(
+          name: 'Never',
+          kind: ReferenceKind.classOrEnum,
+        ),
+      );
+    }
+
     _computeApiSignature(b);
     return b;
   }
@@ -1204,6 +1217,7 @@
     b.nameOffset = node.name?.offset ?? 0;
     b.typeParameters =
         serializeTypeParameters(node.typeParameters, typeParameterScope);
+    b.extendedType = serializeType(node.extendedType);
     if (node.members != null) {
       scopes.add(buildClassMemberScope(node.name?.name, node.members));
       for (ClassMember member in node.members) {
@@ -1212,6 +1226,7 @@
       scopes.removeLast();
     }
     b.executables = executables;
+    b.fields = variables;
     b.documentationComment = serializeDocumentation(node.documentationComment);
     b.annotations = serializeAnnotations(node.metadata);
     b.codeRange = serializeCodeRange(node);
@@ -1383,6 +1398,7 @@
     libraryNameOffset = node.name.offset;
     libraryNameLength = node.name.length;
     isCoreLibrary = libraryName == 'dart.core';
+    isCoreLibraryDefiningUnit = isCoreLibrary;
     libraryDocumentationComment =
         serializeDocumentation(node.documentationComment);
     libraryAnnotations = serializeAnnotations(node.metadata);
diff --git a/pkg/analyzer/lib/src/summary/summary_sdk.dart b/pkg/analyzer/lib/src/summary/summary_sdk.dart
index e54f587..35966b2 100644
--- a/pkg/analyzer/lib/src/summary/summary_sdk.dart
+++ b/pkg/analyzer/lib/src/summary/summary_sdk.dart
@@ -345,6 +345,9 @@
     return _typeType;
   }
 
+  @override
+  VoidType get voidType => VoidTypeImpl.instance;
+
   /**
    * Initialize the `dart:async` types provided by this type provider.
    */
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
index 95a829f..6ac2782 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_flags.dart
@@ -166,6 +166,11 @@
     TypedLiteral,
   );
 
+  static final _isNative = _checkBit(
+    8,
+    MethodDeclaration,
+  );
+
   static final _isNew = _checkBit(
     0,
     InstanceCreationExpression,
@@ -246,6 +251,7 @@
     bool isGet: false,
     bool isLate: false,
     bool isMap: false,
+    bool isNative: false,
     bool isNew: false,
     bool isOperator: false,
     bool isRequired: false,
@@ -338,6 +344,9 @@
     if (isMap) {
       result |= _isMap;
     }
+    if (isNative) {
+      result |= _isNative;
+    }
     if (isNew) {
       result |= _isNew;
     }
@@ -476,6 +485,10 @@
     return (flags & _isMap) != 0;
   }
 
+  static bool isNative(int flags) {
+    return (flags & _isNative) != 0;
+  }
+
   static bool isNew(int flags) {
     return (flags & _isNew) != 0;
   }
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 0bb6202..23235b0 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type_algebra.dart';
 import 'package:analyzer/src/generated/testing/ast_test_factory.dart';
 import 'package:analyzer/src/generated/testing/token_factory.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
@@ -65,6 +66,15 @@
     return _readType(data);
   }
 
+  Token _combinatorKeyword(LinkedNode data, Keyword keyword, Token def) {
+    var informativeData = _unitContext.getInformativeData(data);
+    if (informativeData != null) {
+      return TokenFactory.tokenFromKeyword(keyword)
+        ..offset = informativeData.combinatorKeywordOffset;
+    }
+    return def;
+  }
+
   SimpleIdentifier _declaredIdentifier(LinkedNode data) {
     var informativeData = _unitContext.getInformativeData(data);
     var offset = informativeData?.nameOffset ?? 0;
@@ -85,21 +95,18 @@
 
   Element _elementOfComponents(
     int rawElementIndex,
-    LinkedNodeType definingTypeNode,
+    LinkedNodeTypeSubstitution substitutionNode,
   ) {
     var element = _getElement(rawElementIndex);
-    if (definingTypeNode == null) return element;
+    if (substitutionNode == null) return element;
 
-    var definingType = _readType(definingTypeNode);
-    if (element is ConstructorElement) {
-      return ConstructorMember.from(element, definingType);
-    } else if (element is MethodElement) {
-      return MethodMember.from(element, definingType);
-    } else if (element is PropertyAccessorElement) {
-      return PropertyAccessorMember.from(element, definingType);
-    } else {
-      throw UnimplementedError('(${element.runtimeType}) $element');
-    }
+    var typeParameters = substitutionNode.typeParameters
+        .map<TypeParameterElement>(_getElement)
+        .toList();
+    var typeArguments = substitutionNode.typeArguments.map(_readType).toList();
+    var substitution = Substitution.fromPairs(typeParameters, typeArguments);
+
+    return ExecutableMember.from2(element, substitution);
   }
 
   T _getElement<T extends Element>(int index) {
@@ -126,7 +133,7 @@
       _readNode(data.annotation_arguments),
     )..element = _elementOfComponents(
         data.annotation_element,
-        data.annotation_elementType,
+        data.annotation_substitution,
       );
   }
 
@@ -177,7 +184,7 @@
     )
       ..staticElement = _elementOfComponents(
         data.assignmentExpression_element,
-        data.assignmentExpression_elementType,
+        data.assignmentExpression_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -197,7 +204,7 @@
     )
       ..staticElement = _elementOfComponents(
         data.binaryExpression_element,
-        data.binaryExpression_elementType,
+        data.binaryExpression_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -437,7 +444,7 @@
       _readNode(data.constructorName_name),
     )..staticElement = _elementOfComponents(
         data.constructorName_element,
-        data.constructorName_elementType,
+        data.constructorName_substitution,
       );
   }
 
@@ -590,6 +597,28 @@
     );
   }
 
+  ExtensionDeclaration _read_extensionDeclaration(LinkedNode data) {
+    timerAstBinaryReaderClass.start();
+    try {
+      var node = astFactory.extensionDeclaration(
+        comment: _readDocumentationComment(data),
+        metadata: _readNodeListLazy(data.annotatedNode_metadata),
+        extensionKeyword: _Tokens.EXTENSION,
+        name: data.name.isNotEmpty ? _declaredIdentifier(data) : null,
+        typeParameters: _readNode(data.extensionDeclaration_typeParameters),
+        onKeyword: _Tokens.ON,
+        extendedType: _readNodeLazy(data.extensionDeclaration_extendedType),
+        leftBracket: _Tokens.OPEN_CURLY_BRACKET,
+        members: _readNodeListLazy(data.extensionDeclaration_members),
+        rightBracket: _Tokens.CLOSE_CURLY_BRACKET,
+      );
+      LazyExtensionDeclaration(node, data);
+      return node;
+    } finally {
+      timerAstBinaryReaderClass.stop();
+    }
+  }
+
   FieldDeclaration _read_fieldDeclaration(LinkedNode data) {
     var node = astFactory.fieldDeclaration2(
       comment: _readDocumentationComment(data),
@@ -878,10 +907,12 @@
   }
 
   HideCombinator _read_hideCombinator(LinkedNode data) {
-    return astFactory.hideCombinator(
-      _Tokens.HIDE,
+    var node = astFactory.hideCombinator(
+      _combinatorKeyword(data, Keyword.HIDE, _Tokens.HIDE),
       data.names.map((name) => AstTestFactory.identifier3(name)).toList(),
     );
+    LazyCombinator(node, data);
+    return node;
   }
 
   IfElement _read_ifElement(LinkedNode data) {
@@ -924,9 +955,12 @@
       SimpleIdentifier prefix;
       if (data.importDirective_prefix.isNotEmpty) {
         prefix = astFactory.simpleIdentifier(
-          TokenFactory.tokenFromString(data.importDirective_prefix)
-            ..offset = data.importDirective_prefixOffset,
+          TokenFactory.tokenFromString(data.importDirective_prefix),
         );
+
+        var informativeData = _unitContext.getInformativeData(data);
+        prefix.token.offset =
+            informativeData?.importDirective_prefixOffset ?? 0;
       }
 
       var node = astFactory.importDirective(
@@ -960,7 +994,7 @@
           AstBinaryFlags.hasPeriod(data.flags) ? _Tokens.PERIOD_PERIOD : null
       ..staticElement = _elementOfComponents(
         data.indexExpression_element,
-        data.indexExpression_elementType,
+        data.indexExpression_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -1085,6 +1119,15 @@
   }
 
   MethodDeclaration _read_methodDeclaration(LinkedNode data) {
+    FunctionBody body;
+    if (AstBinaryFlags.isNative(data.flags)) {
+      body = AstTestFactory.nativeFunctionBody('');
+    } else if (AstBinaryFlags.isAbstract(data.flags)) {
+      body = AstTestFactory.emptyFunctionBody();
+    } else {
+      body = AstTestFactory.blockFunctionBody(AstTestFactory.block());
+    }
+
     var node = astFactory.methodDeclaration(
       _readDocumentationComment(data),
       _readNodeListLazy(data.annotatedNode_metadata),
@@ -1101,9 +1144,7 @@
       _declaredIdentifier(data),
       _readNode(data.methodDeclaration_typeParameters),
       _readNodeLazy(data.methodDeclaration_formalParameters),
-      AstBinaryFlags.isAbstract(data.flags)
-          ? AstTestFactory.emptyFunctionBody()
-          : AstTestFactory.blockFunctionBody(AstTestFactory.block()),
+      body,
     );
     LazyMethodDeclaration.setData(node, data);
     return node;
@@ -1237,7 +1278,7 @@
     )
       ..staticElement = _elementOfComponents(
         data.postfixExpression_element,
-        data.postfixExpression_elementType,
+        data.postfixExpression_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -1257,7 +1298,7 @@
     )
       ..staticElement = _elementOfComponents(
         data.prefixExpression_element,
-        data.prefixExpression_elementType,
+        data.prefixExpression_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -1280,7 +1321,7 @@
       _readNode(data.redirectingConstructorInvocation_arguments),
     )..staticElement = _elementOfComponents(
         data.redirectingConstructorInvocation_element,
-        data.redirectingConstructorInvocation_elementType,
+        data.redirectingConstructorInvocation_substitution,
       );
   }
 
@@ -1321,10 +1362,12 @@
   }
 
   ShowCombinator _read_showCombinator(LinkedNode data) {
-    return astFactory.showCombinator(
-      _Tokens.SHOW,
+    var node = astFactory.showCombinator(
+      _combinatorKeyword(data, Keyword.SHOW, _Tokens.SHOW),
       data.names.map((name) => AstTestFactory.identifier3(name)).toList(),
     );
+    LazyCombinator(node, data);
+    return node;
   }
 
   SimpleFormalParameter _read_simpleFormalParameter(LinkedNode data) {
@@ -1358,7 +1401,7 @@
     )
       ..staticElement = _elementOfComponents(
         data.simpleIdentifier_element,
-        data.simpleIdentifier_elementType,
+        data.simpleIdentifier_substitution,
       )
       ..staticType = _readType(data.expression_type);
   }
@@ -1392,7 +1435,7 @@
       _readNode(data.superConstructorInvocation_arguments),
     )..staticElement = _elementOfComponents(
         data.superConstructorInvocation_element,
-        data.superConstructorInvocation_elementType,
+        data.superConstructorInvocation_substitution,
       );
   }
 
@@ -1674,6 +1717,8 @@
         return _read_expressionStatement(data);
       case LinkedNodeKind.extendsClause:
         return _read_extendsClause(data);
+      case LinkedNodeKind.extensionDeclaration:
+        return _read_extensionDeclaration(data);
       case LinkedNodeKind.fieldDeclaration:
         return _read_fieldDeclaration(data);
       case LinkedNodeKind.fieldFormalParameter:
@@ -1913,6 +1958,7 @@
   static final EQ = TokenFactory.tokenFromType(TokenType.EQ);
   static final EXPORT = TokenFactory.tokenFromKeyword(Keyword.EXPORT);
   static final EXTENDS = TokenFactory.tokenFromKeyword(Keyword.EXTENDS);
+  static final EXTENSION = TokenFactory.tokenFromKeyword(Keyword.EXTENSION);
   static final FINAL = TokenFactory.tokenFromKeyword(Keyword.FINAL);
   static final FINALLY = TokenFactory.tokenFromKeyword(Keyword.FINALLY);
   static final FOR = TokenFactory.tokenFromKeyword(Keyword.FOR);
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 3e362e7..54f48bf 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -49,7 +49,7 @@
       annotation_arguments: node.arguments?.accept(this),
       annotation_constructorName: node.constructorName?.accept(this),
       annotation_element: elementComponents.rawElement,
-      annotation_elementType: elementComponents.definingType,
+      annotation_substitution: elementComponents.substitution,
       annotation_name: node.name?.accept(this),
     );
   }
@@ -92,7 +92,7 @@
     var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.assignmentExpression(
       assignmentExpression_element: elementComponents.rawElement,
-      assignmentExpression_elementType: elementComponents.definingType,
+      assignmentExpression_substitution: elementComponents.substitution,
       assignmentExpression_leftHandSide: node.leftHandSide.accept(this),
       assignmentExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
@@ -115,7 +115,7 @@
     var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.binaryExpression(
       binaryExpression_element: elementComponents.rawElement,
-      binaryExpression_elementType: elementComponents.definingType,
+      binaryExpression_substitution: elementComponents.substitution,
       binaryExpression_leftOperand: node.leftOperand.accept(this),
       binaryExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
@@ -347,7 +347,7 @@
     var elementComponents = _componentsOfElement(node.staticElement);
     return LinkedNodeBuilder.constructorName(
       constructorName_element: elementComponents.rawElement,
-      constructorName_elementType: elementComponents.definingType,
+      constructorName_substitution: elementComponents.substitution,
       constructorName_name: node.name?.accept(this),
       constructorName_type: node.type.accept(this),
     );
@@ -493,6 +493,22 @@
   }
 
   @override
+  LinkedNodeBuilder visitExtensionDeclaration(ExtensionDeclaration node) {
+    var builder = LinkedNodeBuilder.extensionDeclaration(
+      extensionDeclaration_extendedType: node.extendedType.accept(this),
+      extensionDeclaration_members: _writeNodeList(node.members),
+      extensionDeclaration_typeParameters: node.typeParameters?.accept(this),
+    );
+
+    _storeCompilationUnitMember(builder, node);
+    _storeInformativeId(builder, node);
+    builder.name = node.name?.name;
+    LazyExtensionDeclaration.get(node).put(builder);
+
+    return builder;
+  }
+
+  @override
   LinkedNodeBuilder visitFieldDeclaration(FieldDeclaration node) {
     var builder = LinkedNodeBuilder.fieldDeclaration(
       fieldDeclaration_fields: node.fields.accept(this),
@@ -720,6 +736,7 @@
     var builder = LinkedNodeBuilder.hideCombinator(
       names: node.hiddenNames.map((id) => id.name).toList(),
     );
+    _storeInformativeId(builder, node);
     return builder;
   }
 
@@ -756,7 +773,6 @@
     try {
       var builder = LinkedNodeBuilder.importDirective(
         importDirective_prefix: node.prefix?.name,
-        importDirective_prefixOffset: node.prefix?.offset ?? 0,
       );
       builder.flags = AstBinaryFlags.encode(
         isDeferred: node.deferredKeyword != null,
@@ -773,7 +789,7 @@
     var elementComponents = _componentsOfElement(node.staticElement);
     var builder = LinkedNodeBuilder.indexExpression(
       indexExpression_element: elementComponents.rawElement,
-      indexExpression_elementType: elementComponents.definingType,
+      indexExpression_substitution: elementComponents.substitution,
       indexExpression_index: node.index.accept(this),
       indexExpression_target: node.target?.accept(this),
       expression_type: _writeType(node.staticType),
@@ -909,6 +925,7 @@
       isExternal: node.externalKeyword != null,
       isGenerator: node.body?.isGenerator ?? false,
       isGet: node.isGetter,
+      isNative: node.body is NativeFunctionBody,
       isOperator: node.operatorKeyword != null,
       isSet: node.isSetter,
       isStatic: node.isStatic,
@@ -1025,7 +1042,7 @@
     return LinkedNodeBuilder.postfixExpression(
       expression_type: _writeType(node.staticType),
       postfixExpression_element: elementComponents.rawElement,
-      postfixExpression_elementType: elementComponents.definingType,
+      postfixExpression_substitution: elementComponents.substitution,
       postfixExpression_operand: node.operand.accept(this),
       postfixExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
@@ -1048,7 +1065,7 @@
     return LinkedNodeBuilder.prefixExpression(
       expression_type: _writeType(node.staticType),
       prefixExpression_element: elementComponents.rawElement,
-      prefixExpression_elementType: elementComponents.definingType,
+      prefixExpression_substitution: elementComponents.substitution,
       prefixExpression_operand: node.operand.accept(this),
       prefixExpression_operator: TokensWriter.astToBinaryTokenType(
         node.operator.type,
@@ -1079,8 +1096,8 @@
       redirectingConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
       redirectingConstructorInvocation_element: elementComponents.rawElement,
-      redirectingConstructorInvocation_elementType:
-          elementComponents.definingType,
+      redirectingConstructorInvocation_substitution:
+          elementComponents.substitution,
     );
     builder.flags = AstBinaryFlags.encode(
       hasThis: node.thisKeyword != null,
@@ -1122,6 +1139,7 @@
     var builder = LinkedNodeBuilder.showCombinator(
       names: node.shownNames.map((id) => id.name).toList(),
     );
+    _storeInformativeId(builder, node);
     return builder;
   }
 
@@ -1149,7 +1167,7 @@
     var elementComponents = _componentsOfElement(element);
     var builder = LinkedNodeBuilder.simpleIdentifier(
       simpleIdentifier_element: elementComponents.rawElement,
-      simpleIdentifier_elementType: elementComponents.definingType,
+      simpleIdentifier_substitution: elementComponents.substitution,
       expression_type: _writeType(node.staticType),
     );
     builder.flags = AstBinaryFlags.encode(
@@ -1193,7 +1211,7 @@
       superConstructorInvocation_constructorName:
           node.constructorName?.accept(this),
       superConstructorInvocation_element: elementComponents.rawElement,
-      superConstructorInvocation_elementType: elementComponents.definingType,
+      superConstructorInvocation_substitution: elementComponents.substitution,
     );
     _storeConstructorInitializer(builder, node);
     return builder;
@@ -1419,8 +1437,12 @@
 
     if (element is Member) {
       var elementIndex = _indexOfElement(element.baseElement);
-      var definingTypeNode = _writeType(element.definingType);
-      return _ElementComponents(elementIndex, definingTypeNode);
+      var substitution = element.substitution.map;
+      var substitutionBuilder = LinkedNodeTypeSubstitutionBuilder(
+        typeParameters: substitution.keys.map(_indexOfElement).toList(),
+        typeArguments: substitution.values.map(_writeType).toList(),
+      );
+      return _ElementComponents(elementIndex, substitutionBuilder);
     }
 
     var elementIndex = _indexOfElement(element);
@@ -1651,12 +1673,12 @@
   }
 }
 
-/// Components of a [Member] - the raw element, and the defining type.
+/// Components of a [Member] - the raw element, and the substitution.
 class _ElementComponents {
   final int rawElement;
-  final LinkedNodeType definingType;
+  final LinkedNodeTypeSubstitutionBuilder substitution;
 
-  _ElementComponents(this.rawElement, this.definingType);
+  _ElementComponents(this.rawElement, this.substitution);
 }
 
 class _IsSerializableExpressionVisitor extends RecursiveAstVisitor<void> {
diff --git a/pkg/analyzer/lib/src/summary2/ast_resolver.dart b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
index 1812c3e..63c1eda 100644
--- a/pkg/analyzer/lib/src/summary2/ast_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_resolver.dart
@@ -6,6 +6,7 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/error/listener.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/resolver/ast_rewrite.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary2/link.dart';
diff --git a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
index 22fb71ee57..aad7c03 100644
--- a/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/builder/source_library_builder.dart
@@ -93,28 +93,41 @@
       var unitRef = reference.getChild('@unit').getChild(unitContext.uriStr);
       var classRef = unitRef.getChild('@class');
       var enumRef = unitRef.getChild('@enum');
+      var extensionRef = unitRef.getChild('@extension');
       var functionRef = unitRef.getChild('@function');
       var mixinRef = unitRef.getChild('@mixin');
       var typeAliasRef = unitRef.getChild('@typeAlias');
       var getterRef = unitRef.getChild('@getter');
       var setterRef = unitRef.getChild('@setter');
       var variableRef = unitRef.getChild('@variable');
+      var nextUnnamedExtensionId = 0;
       for (var node in unitContext.unit.declarations) {
         if (node is ast.ClassDeclaration) {
           var name = node.name.name;
           var reference = classRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
           localScope.declare(name, reference);
         } else if (node is ast.ClassTypeAlias) {
           var name = node.name.name;
           var reference = classRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
           localScope.declare(name, reference);
         } else if (node is ast.EnumDeclaration) {
           var name = node.name.name;
           var reference = enumRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
           localScope.declare(name, reference);
+        } else if (node is ast.ExtensionDeclaration) {
+          var name = node.name?.name;
+          var refName = name ?? 'extension-${nextUnnamedExtensionId++}';
+          LazyExtensionDeclaration.get(node).setRefName(refName);
+
+          var reference = extensionRef.getChild(refName);
+          reference.node ??= node;
+
+          if (name != null) {
+            localScope.declare(name, reference);
+          }
         } else if (node is ast.FunctionDeclaration) {
           var name = node.name.name;
 
@@ -128,7 +141,7 @@
           }
 
           var reference = containerRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
 
           if (node.isSetter) {
             localScope.declare('$name=', reference);
@@ -138,26 +151,26 @@
         } else if (node is ast.FunctionTypeAlias) {
           var name = node.name.name;
           var reference = typeAliasRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
 
           localScope.declare(name, reference);
         } else if (node is ast.GenericTypeAlias) {
           var name = node.name.name;
           var reference = typeAliasRef.getChild(name);
-          reference.node2 = node;
+          reference.node = node;
 
           localScope.declare(name, reference);
         } else if (node is ast.MixinDeclaration) {
           var name = node.name.name;
           var reference = mixinRef.getChild(name);
-          reference.node2 = node;
+          reference.node ??= node;
           localScope.declare(name, reference);
         } else if (node is ast.TopLevelVariableDeclaration) {
           for (var variable in node.variables.variables) {
             var name = variable.name.name;
 
             var reference = variableRef.getChild(name);
-            reference.node2 = node;
+            reference.node ??= node;
 
             var getter = getterRef.getChild(name);
             localScope.declare(name, getter);
@@ -294,8 +307,8 @@
   ) {
     for (var configuration in configurations) {
       var name = configuration.name.components.join('.');
-      var value = configuration.value ?? 'true';
-      if (linker.declaredVariables.get(name) == (value)) {
+      var value = configuration.value?.stringValue ?? 'true';
+      if (linker.declaredVariables.get(name) == value) {
         return configuration.uri.stringValue;
       }
     }
diff --git a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
index fbdeaea..3baf981 100644
--- a/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/default_value_resolver.dart
@@ -28,6 +28,10 @@
 
   void resolve() {
     for (CompilationUnitElementImpl unit in _libraryElement.units) {
+      for (var extensionElement in unit.extensions) {
+        _extension(extensionElement);
+      }
+
       for (var classElement in unit.mixins) {
         _class(classElement);
       }
@@ -67,6 +71,13 @@
     _parameters(element.parameters);
   }
 
+  void _extension(ExtensionElement extensionElement) {
+    for (var element in extensionElement.methods) {
+      _setScopeFromElement(element);
+      _method(element);
+    }
+  }
+
   void _function(FunctionElementImpl element) {
     _astResolver = null;
     _executableElement = element;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index a09494f..121c99f 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -143,6 +143,23 @@
         directiveKeywordOffset: node.keyword.offset,
       ),
     );
+    node.combinators.accept(this);
+  }
+
+  @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    setData(
+      node,
+      UnlinkedInformativeDataBuilder.extensionDeclaration(
+        codeOffset: node.offset,
+        codeLength: node.length,
+        documentationComment_tokens: _nodeCommentTokens(node),
+        nameOffset: node.name?.offset ?? 0,
+      ),
+    );
+
+    node.typeParameters?.accept(this);
+    node.members.accept(this);
   }
 
   @override
@@ -246,13 +263,26 @@
   }
 
   @override
+  void visitHideCombinator(HideCombinator node) {
+    setData(
+      node,
+      UnlinkedInformativeDataBuilder.hideCombinator(
+        combinatorEnd: node.end,
+        combinatorKeywordOffset: node.offset,
+      ),
+    );
+  }
+
+  @override
   void visitImportDirective(ImportDirective node) {
     setData(
       node,
       UnlinkedInformativeDataBuilder.importDirective(
         directiveKeywordOffset: node.keyword.offset,
+        importDirective_prefixOffset: node.prefix?.offset ?? 0,
       ),
     );
+    node.combinators.accept(this);
   }
 
   @override
@@ -318,6 +348,17 @@
   }
 
   @override
+  void visitShowCombinator(ShowCombinator node) {
+    setData(
+      node,
+      UnlinkedInformativeDataBuilder.showCombinator(
+        combinatorEnd: node.end,
+        combinatorKeywordOffset: node.offset,
+      ),
+    );
+  }
+
+  @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     setData(
       node,
diff --git a/pkg/analyzer/lib/src/summary2/lazy_ast.dart b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
index 9537838..4bea1b2 100644
--- a/pkg/analyzer/lib/src/summary2/lazy_ast.dart
+++ b/pkg/analyzer/lib/src/summary2/lazy_ast.dart
@@ -329,6 +329,32 @@
   }
 }
 
+class LazyCombinator {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  LazyCombinator(Combinator node, this.data) {
+    node.setProperty(_key, this);
+  }
+
+  static LazyCombinator get(Combinator node) {
+    return node.getProperty(_key);
+  }
+
+  static int getEnd(
+    LinkedUnitContext context,
+    Combinator node,
+  ) {
+    var lazy = get(node);
+    if (lazy != null) {
+      var informativeData = context.getInformativeData(lazy.data);
+      return informativeData?.combinatorEnd ?? 0;
+    }
+    return node.end;
+  }
+}
+
 class LazyCompilationUnit {
   static const _key = 'lazyAst';
 
@@ -662,6 +688,123 @@
   }
 }
 
+class LazyExtensionDeclaration {
+  static const _key = 'lazyAst';
+
+  final LinkedNode data;
+
+  bool _hasDocumentationComment = false;
+  bool _hasExtendedType = false;
+  bool _hasMembers = false;
+  bool _hasMetadata = false;
+
+  /// The name for use in `Reference`. If the extension is named, the name
+  /// of the extension. If the extension is unnamed, a synthetic name.
+  String _refName;
+
+  LazyExtensionDeclaration(ExtensionDeclaration node, this.data) {
+    node.setProperty(_key, this);
+    if (data != null) {
+      _refName = data.extensionDeclaration_refName;
+    }
+  }
+
+  String get refName => _refName;
+
+  void put(LinkedNodeBuilder builder) {
+    assert(_refName != null);
+    builder.extensionDeclaration_refName = _refName;
+  }
+
+  void setRefName(String referenceName) {
+    _refName = referenceName;
+  }
+
+  static LazyExtensionDeclaration get(ExtensionDeclaration node) {
+    LazyExtensionDeclaration lazy = node.getProperty(_key);
+    if (lazy == null) {
+      return LazyExtensionDeclaration(node, null);
+    }
+    return lazy;
+  }
+
+  static int getCodeLength(
+    LinkedUnitContext context,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null) {
+      return context.getInformativeData(lazy.data)?.codeLength ?? 0;
+    }
+    return node.length;
+  }
+
+  static int getCodeOffset(
+    LinkedUnitContext context,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null) {
+      return context.getInformativeData(lazy.data)?.codeOffset ?? 0;
+    }
+    return node.offset;
+  }
+
+  static void readDocumentationComment(
+    LinkedUnitContext context,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasDocumentationComment) {
+      node.documentationComment = context.createComment(lazy.data);
+      lazy._hasDocumentationComment = true;
+    }
+  }
+
+  static void readExtendedType(
+    AstBinaryReader reader,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasExtendedType) {
+      (node as ExtensionDeclarationImpl).extendedType = reader.readNode(
+        lazy.data.extensionDeclaration_extendedType,
+      );
+      lazy._hasExtendedType = true;
+    }
+  }
+
+  static void readMembers(
+    AstBinaryReader reader,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasMembers) {
+      var dataList = lazy.data.extensionDeclaration_members;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.members[i] = reader.readNode(data);
+      }
+      lazy._hasMembers = true;
+    }
+  }
+
+  static void readMetadata(
+    AstBinaryReader reader,
+    ExtensionDeclaration node,
+  ) {
+    var lazy = get(node);
+    if (lazy?.data != null && !lazy._hasMetadata) {
+      var dataList = lazy.data.annotatedNode_metadata;
+      for (var i = 0; i < dataList.length; ++i) {
+        var data = dataList[i];
+        node.metadata[i] = reader.readNode(data);
+      }
+      lazy._hasMetadata = true;
+    }
+  }
+}
+
 class LazyFieldDeclaration {
   static const _key = 'lazyAst';
 
diff --git a/pkg/analyzer/lib/src/summary2/link.dart b/pkg/analyzer/lib/src/summary2/link.dart
index bc3b18f..9f09487 100644
--- a/pkg/analyzer/lib/src/summary2/link.dart
+++ b/pkg/analyzer/lib/src/summary2/link.dart
@@ -5,7 +5,7 @@
 import 'package:analyzer/dart/analysis/declared_variables.dart';
 import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/dart/ast/ast.dart' show CompilationUnit;
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/constant.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -46,7 +46,7 @@
   /// Libraries that are being linked.
   final Map<Uri, SourceLibraryBuilder> builders = {};
 
-  InheritanceManager2 inheritance; // TODO(scheglov) cache it
+  InheritanceManager3 inheritance; // TODO(scheglov) cache it
 
   Linker(this.elementFactory) {
     linkingBundleContext = LinkingBundleContext(
@@ -206,7 +206,7 @@
 
   void _createTypeSystem() {
     if (typeProvider != null) {
-      inheritance = InheritanceManager2(typeSystem);
+      inheritance = InheritanceManager3(typeSystem);
       return;
     }
 
@@ -217,7 +217,7 @@
       ..initializeCore(coreLib)
       ..initializeAsync(asyncLib);
 
-    inheritance = InheritanceManager2(typeSystem);
+    inheritance = InheritanceManager3(typeSystem);
   }
 
   void _performTopLevelInference() {
diff --git a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
index 846cdab..15c7bf2 100644
--- a/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_element_factory.dart
@@ -10,6 +10,7 @@
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/core_types.dart';
+import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/linked_bundle_context.dart';
 import 'package:analyzer/src/summary2/linked_unit_context.dart';
 import 'package:analyzer/src/summary2/reference.dart';
@@ -155,6 +156,11 @@
       return _enum(unit, reference);
     }
 
+    if (parentName == '@extension') {
+      var unit = elementOfReference(parent2);
+      return _extension(unit, reference);
+    }
+
     if (parentName == '@field') {
       var enclosing = elementOfReference(parent2);
       return _field(enclosing, reference);
@@ -248,11 +254,11 @@
 
   ClassElementImpl _class(
       CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node2 == null) {
+    if (reference.node == null) {
       _indexUnitElementDeclarations(unit);
-      assert(reference.node2 != null, '$reference');
+      assert(reference.node != null, '$reference');
     }
-    ClassElementImpl.forLinkedNode(unit, reference, reference.node2);
+    ClassElementImpl.forLinkedNode(unit, reference, reference.node);
     return reference.element;
   }
 
@@ -326,11 +332,21 @@
   }
 
   EnumElementImpl _enum(CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node2 == null) {
+    if (reference.node == null) {
       _indexUnitElementDeclarations(unit);
-      assert(reference.node2 != null, '$reference');
+      assert(reference.node != null, '$reference');
     }
-    EnumElementImpl.forLinkedNode(unit, reference, reference.node2);
+    EnumElementImpl.forLinkedNode(unit, reference, reference.node);
+    return reference.element;
+  }
+
+  ExtensionElementImpl _extension(
+      CompilationUnitElementImpl unit, Reference reference) {
+    if (reference.node == null) {
+      _indexUnitElementDeclarations(unit);
+      assert(reference.node != null, '$reference');
+    }
+    ExtensionElementImpl.forLinkedNode(unit, reference, reference.node);
     return reference.element;
   }
 
@@ -363,11 +379,11 @@
 
   MixinElementImpl _mixin(
       CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node2 == null) {
+    if (reference.node == null) {
       _indexUnitElementDeclarations(unit);
-      assert(reference.node2 != null, '$reference');
+      assert(reference.node != null, '$reference');
     }
-    MixinElementImpl.forLinkedNode(unit, reference, reference.node2);
+    MixinElementImpl.forLinkedNode(unit, reference, reference.node);
     return reference.element;
   }
 
@@ -387,11 +403,11 @@
 
   GenericTypeAliasElementImpl _typeAlias(
       CompilationUnitElementImpl unit, Reference reference) {
-    if (reference.node2 == null) {
+    if (reference.node == null) {
       _indexUnitElementDeclarations(unit);
-      assert(reference.node2 != null, '$reference');
+      assert(reference.node != null, '$reference');
     }
-    GenericTypeAliasElementImpl.forLinkedNode(unit, reference, reference.node2);
+    GenericTypeAliasElementImpl.forLinkedNode(unit, reference, reference.node);
     return reference.element;
   }
 
@@ -405,6 +421,7 @@
   ) {
     var classRef = unitRef.getChild('@class');
     var enumRef = unitRef.getChild('@enum');
+    var extensionRef = unitRef.getChild('@extension');
     var functionRef = unitRef.getChild('@function');
     var mixinRef = unitRef.getChild('@mixin');
     var typeAliasRef = unitRef.getChild('@typeAlias');
@@ -412,29 +429,32 @@
     for (var declaration in unitNode.declarations) {
       if (declaration is ClassDeclaration) {
         var name = declaration.name.name;
-        classRef.getChild(name).node2 = declaration;
+        classRef.getChild(name).node = declaration;
       } else if (declaration is ClassTypeAlias) {
         var name = declaration.name.name;
-        classRef.getChild(name).node2 = declaration;
+        classRef.getChild(name).node = declaration;
+      } else if (declaration is ExtensionDeclaration) {
+        var refName = LazyExtensionDeclaration.get(declaration).refName;
+        extensionRef.getChild(refName).node = declaration;
       } else if (declaration is EnumDeclaration) {
         var name = declaration.name.name;
-        enumRef.getChild(name).node2 = declaration;
+        enumRef.getChild(name).node = declaration;
       } else if (declaration is FunctionDeclaration) {
         var name = declaration.name.name;
-        functionRef.getChild(name).node2 = declaration;
+        functionRef.getChild(name).node = declaration;
       } else if (declaration is FunctionTypeAlias) {
         var name = declaration.name.name;
-        typeAliasRef.getChild(name).node2 = declaration;
+        typeAliasRef.getChild(name).node = declaration;
       } else if (declaration is GenericTypeAlias) {
         var name = declaration.name.name;
-        typeAliasRef.getChild(name).node2 = declaration;
+        typeAliasRef.getChild(name).node = declaration;
       } else if (declaration is MixinDeclaration) {
         var name = declaration.name.name;
-        mixinRef.getChild(name).node2 = declaration;
+        mixinRef.getChild(name).node = declaration;
       } else if (declaration is TopLevelVariableDeclaration) {
         for (var variable in declaration.variables.variables) {
           var name = variable.name.name;
-          variableRef.getChild(name).node2 = declaration;
+          variableRef.getChild(name).node = declaration;
         }
       }
     }
diff --git a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
index b7ed57f..cc0ae97 100644
--- a/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linked_unit_context.dart
@@ -150,6 +150,8 @@
       return LazyConstructorDeclaration.getCodeLength(this, node);
     } else if (node is EnumDeclaration) {
       return LazyEnumDeclaration.getCodeLength(this, node);
+    } else if (node is ExtensionDeclaration) {
+      return LazyExtensionDeclaration.getCodeLength(this, node);
     } else if (node is FormalParameter) {
       return LazyFormalParameter.getCodeLength(this, node);
     } else if (node is FunctionDeclaration) {
@@ -181,6 +183,8 @@
       return LazyConstructorDeclaration.getCodeOffset(this, node);
     } else if (node is EnumDeclaration) {
       return LazyEnumDeclaration.getCodeOffset(this, node);
+    } else if (node is ExtensionDeclaration) {
+      return LazyExtensionDeclaration.getCodeOffset(this, node);
     } else if (node is FormalParameter) {
       return LazyFormalParameter.getCodeOffset(this, node);
     } else if (node is FunctionDeclaration) {
@@ -201,6 +205,10 @@
     throw UnimplementedError('${node.runtimeType}');
   }
 
+  int getCombinatorEnd(ShowCombinator node) {
+    return LazyCombinator.getEnd(this, node);
+  }
+
   List<ConstructorInitializer> getConstructorInitializers(
     ConstructorDeclaration node,
   ) {
@@ -215,7 +223,7 @@
 
   Iterable<ConstructorDeclaration> getConstructors(AstNode node) sync* {
     if (node is ClassOrMixinDeclaration) {
-      var members = _getClassOrMixinMembers(node);
+      var members = _getClassOrExtensionOrMixinMembers(node);
       for (var member in members) {
         if (member is ConstructorDeclaration) {
           yield member;
@@ -256,6 +264,9 @@
     } else if (node is EnumDeclaration) {
       LazyEnumDeclaration.readDocumentationComment(this, node);
       return node.documentationComment;
+    } else if (node is ExtensionDeclaration) {
+      LazyExtensionDeclaration.readDocumentationComment(this, node);
+      return node.documentationComment;
     } else if (node is FunctionDeclaration) {
       LazyFunctionDeclaration.readDocumentationComment(this, node);
       return node.documentationComment;
@@ -295,6 +306,15 @@
     return node.constants;
   }
 
+  TypeAnnotation getExtendedType(ExtensionDeclaration node) {
+    LazyExtensionDeclaration.readExtendedType(_astReader, node);
+    return node.extendedType;
+  }
+
+  String getExtensionRefName(ExtensionDeclaration node) {
+    return LazyExtensionDeclaration.get(node).refName;
+  }
+
   String getFieldFormalParameterName(AstNode node) {
     if (node is DefaultFormalParameter) {
       return getFieldFormalParameterName(node.parameter);
@@ -305,8 +325,8 @@
     }
   }
 
-  Iterable<VariableDeclaration> getFields(ClassOrMixinDeclaration node) sync* {
-    var members = _getClassOrMixinMembers(node);
+  Iterable<VariableDeclaration> getFields(CompilationUnitMember node) sync* {
+    var members = _getClassOrExtensionOrMixinMembers(node);
     for (var member in members) {
       if (member is FieldDeclaration) {
         for (var field in member.fields.variables) {
@@ -453,6 +473,9 @@
     } else if (node is EnumDeclaration) {
       LazyEnumDeclaration.readMetadata(_astReader, node);
       return node.metadata;
+    } else if (node is ExtensionDeclaration) {
+      LazyExtensionDeclaration.readMetadata(_astReader, node);
+      return node.metadata;
     } else if (node is FormalParameter) {
       LazyFormalParameter.readMetadata(_astReader, node);
       return node.metadata;
@@ -487,13 +510,11 @@
     return const <Annotation>[];
   }
 
-  Iterable<MethodDeclaration> getMethods(AstNode node) sync* {
-    if (node is ClassOrMixinDeclaration) {
-      var members = _getClassOrMixinMembers(node);
-      for (var member in members) {
-        if (member is MethodDeclaration) {
-          yield member;
-        }
+  Iterable<MethodDeclaration> getMethods(CompilationUnitMember node) sync* {
+    var members = _getClassOrExtensionOrMixinMembers(node);
+    for (var member in members) {
+      if (member is MethodDeclaration) {
+        yield member;
       }
     }
   }
@@ -511,6 +532,8 @@
       }
     } else if (node is EnumConstantDeclaration) {
       return node.name.offset;
+    } else if (node is ExtensionDeclaration) {
+      return node.name?.offset ?? -1;
     } else if (node is FormalParameter) {
       return node.identifier?.offset ?? -1;
     } else if (node is MethodDeclaration) {
@@ -617,6 +640,8 @@
       return null;
     } else if (node is DefaultFormalParameter) {
       return getTypeParameters2(node.parameter);
+    } else if (node is ExtensionDeclaration) {
+      return node.typeParameters;
     } else if (node is FieldFormalParameter) {
       return null;
     } else if (node is FunctionDeclaration) {
@@ -758,7 +783,7 @@
     } else if (node is FunctionDeclaration) {
       return node.externalKeyword != null;
     } else if (node is MethodDeclaration) {
-      return node.externalKeyword != null;
+      return node.externalKeyword != null || node.body is NativeFunctionBody;
     } else {
       throw UnimplementedError('${node.runtimeType}');
     }
@@ -810,6 +835,14 @@
     throw UnimplementedError('${node.runtimeType}');
   }
 
+  bool isNative(AstNode node) {
+    if (node is MethodDeclaration) {
+      return node.body is NativeFunctionBody;
+    } else {
+      throw UnimplementedError('${node.runtimeType}');
+    }
+  }
+
   bool isSetter(AstNode node) {
     if (node is FunctionDeclaration) {
       return node.isSetter;
@@ -853,7 +886,8 @@
 
     var kind = linkedType.kind;
     if (kind == LinkedNodeTypeKind.bottom) {
-      return BottomTypeImpl.instance;
+      var nullabilitySuffix = _nullabilitySuffix(linkedType.nullabilitySuffix);
+      return BottomTypeImpl.instance.withNullability(nullabilitySuffix);
     } else if (kind == LinkedNodeTypeKind.dynamic_) {
       return DynamicTypeImpl.instance;
     } else if (kind == LinkedNodeTypeKind.function) {
@@ -1010,15 +1044,23 @@
     return ParameterKind.REQUIRED;
   }
 
-  List<ClassMember> _getClassOrMixinMembers(ClassOrMixinDeclaration node) {
+  List<ClassMember> _getClassOrExtensionOrMixinMembers(
+    CompilationUnitMember node,
+  ) {
     if (node is ClassDeclaration) {
       LazyClassDeclaration.readMembers(_astReader, node);
+      return node.members;
+    } else if (node is ClassTypeAlias) {
+      return <ClassMember>[];
+    } else if (node is ExtensionDeclaration) {
+      LazyExtensionDeclaration.readMembers(_astReader, node);
+      return node.members;
     } else if (node is MixinDeclaration) {
       LazyMixinDeclaration.readMembers(_astReader, node);
+      return node.members;
     } else {
       throw StateError('${node.runtimeType}');
     }
-    return node.members;
   }
 
   NodeList<Annotation> _getPartDirectiveAnnotation() {
diff --git a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
index 5ed338c..48b3541 100644
--- a/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
+++ b/pkg/analyzer/lib/src/summary2/linking_bundle_context.dart
@@ -80,6 +80,7 @@
     if (type.isBottom) {
       return LinkedNodeTypeBuilder(
         kind: LinkedNodeTypeKind.bottom,
+        nullabilitySuffix: _nullabilitySuffix(type),
       );
     } else if (type.isDynamic) {
       return LinkedNodeTypeBuilder(
diff --git a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
index b2f1eaa..ac7435a 100644
--- a/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/metadata_resolver.dart
@@ -79,6 +79,13 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    node.metadata.accept(this);
+    node.typeParameters?.accept(this);
+    node.members.accept(this);
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     node.metadata.accept(this);
   }
diff --git a/pkg/analyzer/lib/src/summary2/named_type_builder.dart b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
index 003393b..c90c6a8 100644
--- a/pkg/analyzer/lib/src/summary2/named_type_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/named_type_builder.dart
@@ -82,6 +82,8 @@
         var substitution = Substitution.fromPairs(parameters, arguments);
         _type = substitution.substituteType(rawType);
       }
+    } else if (element is NeverElementImpl) {
+      _type = element.type.withNullability(nullabilitySuffix);
     } else if (element is TypeParameterElement) {
       _type = TypeParameterTypeImpl(element);
     } else {
diff --git a/pkg/analyzer/lib/src/summary2/reference.dart b/pkg/analyzer/lib/src/summary2/reference.dart
index 626fdc8..781644d 100644
--- a/pkg/analyzer/lib/src/summary2/reference.dart
+++ b/pkg/analyzer/lib/src/summary2/reference.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary2/scope.dart';
 
 /// Indirection between a name and the corresponding [Element].
@@ -33,11 +32,8 @@
   /// The simple name of the reference in its [parent].
   final String name;
 
-  /// The corresponding [LinkedNode], or `null` if a named container.
-  LinkedNode node;
-
   /// The corresponding [AstNode], or `null` if a named container.
-  AstNode node2;
+  AstNode node;
 
   /// The corresponding [Element], or `null` if a named container.
   Element element;
@@ -89,11 +85,11 @@
   /// The element might be not `null`, but the node is different in case of
   /// duplicate declarations.
   bool hasElementFor(AstNode node) {
-    if (element != null && node2 == node) {
+    if (element != null && this.node == node) {
       return true;
     } else {
-      if (node2 == null) {
-        node2 = node;
+      if (node == null) {
+        this.node = node;
       }
       return false;
     }
diff --git a/pkg/analyzer/lib/src/summary2/reference_resolver.dart b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
index e9efbb0..050a3af 100644
--- a/pkg/analyzer/lib/src/summary2/reference_resolver.dart
+++ b/pkg/analyzer/lib/src/summary2/reference_resolver.dart
@@ -165,6 +165,33 @@
   }
 
   @override
+  void visitExtensionDeclaration(ExtensionDeclaration node) {
+    var outerScope = scope;
+    var outerReference = reference;
+
+    var refName = LazyExtensionDeclaration.get(node).refName;
+    reference = reference.getChild('@extension').getChild(refName);
+
+    ExtensionElementImpl element = reference.element;
+    node.name?.staticElement = element;
+
+    _createTypeParameterElements(node.typeParameters);
+    scope = new TypeParameterScope(scope, element);
+
+    node.typeParameters?.accept(this);
+    node.extendedType.accept(this);
+
+    scope = new ExtensionScope(scope, element);
+    LinkingNodeContext(node, scope);
+
+    node.members.accept(this);
+    nodesToBuildType.addDeclaration(node);
+
+    scope = outerScope;
+    reference = outerReference;
+  }
+
+  @override
   void visitFieldDeclaration(FieldDeclaration node) {
     node.fields.accept(this);
 
@@ -252,7 +279,7 @@
 
     var name = node.identifier.name;
     reference = reference.getChild('@parameter').getChild(name);
-    reference.node2 = node;
+    reference.node = node;
 
     var element = ParameterElementImpl.forLinkedNode(
       outerReference.element,
@@ -484,7 +511,7 @@
     var outerReference = this.reference;
     var containerRef = outerReference.getChild('@typeParameter');
     var reference = containerRef.getChild(node.name.name);
-    reference.node2 = node;
+    reference.node = node;
 
     var element = TypeParameterElementImpl.forLinkedNode(
       outerReference.element,
diff --git a/pkg/analyzer/lib/src/summary2/top_level_inference.dart b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
index 0da3ffe..8187614 100644
--- a/pkg/analyzer/lib/src/summary2/top_level_inference.dart
+++ b/pkg/analyzer/lib/src/summary2/top_level_inference.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/builder.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/dart/resolver/scope.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -43,8 +44,6 @@
 
   ConstantInitializersResolver(this.linker);
 
-  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
-
   void perform() {
     for (var builder in linker.builders.values) {
       _library = builder.element;
@@ -86,58 +85,15 @@
 
   TopLevelInference(this.linker);
 
-  DynamicTypeImpl get _dynamicType => DynamicTypeImpl.instance;
-
   void infer() {
     var initializerInference = _InitializerInference(linker);
     initializerInference.createNodes();
 
     _performOverrideInference();
-    _inferConstructorFieldFormals();
+
     initializerInference.perform();
   }
 
-  void _inferConstructorFieldFormals() {
-    for (var builder in linker.builders.values) {
-      for (var unit in builder.element.units) {
-        for (var class_ in unit.types) {
-          var fields = <String, DartType>{};
-          for (var field in class_.fields) {
-            if (field.isStatic) continue;
-            if (field.isSynthetic) continue;
-
-            var name = field.name;
-            var type = field.type;
-            if (type == null) {
-              throw StateError('Field $name should have a type.');
-            }
-            fields[name] ??= type;
-          }
-
-          for (var constructor in class_.constructors) {
-            for (var parameter in constructor.parameters) {
-              if (parameter is FieldFormalParameterElement) {
-                var node = _getLinkedNode(parameter);
-                if (node is DefaultFormalParameter) {
-                  var defaultParameter = node as DefaultFormalParameter;
-                  node = defaultParameter.parameter;
-                }
-
-                if (node is FieldFormalParameter &&
-                    node.type == null &&
-                    node.parameters == null) {
-                  var name = parameter.name;
-                  var type = fields[name] ?? _dynamicType;
-                  LazyAst.setType(node, type);
-                }
-              }
-            }
-          }
-        }
-      }
-    }
-  }
-
   void _performOverrideInference() {
     var inferrer = new InstanceMemberInferrer(
       linker.typeProvider,
@@ -151,8 +107,80 @@
   }
 }
 
+class _ConstructorInferenceNode extends _InferenceNode {
+  final _InferenceWalker _walker;
+  final ConstructorElement _constructor;
+
+  /// The parameters that have types from [_fields].
+  final List<FieldFormalParameter> _parameters = [];
+
+  /// The parallel list of fields corresponding to [_parameters].
+  final List<FieldElement> _fields = [];
+
+  @override
+  bool isEvaluated = false;
+
+  _ConstructorInferenceNode(
+    this._walker,
+    this._constructor,
+    Map<String, FieldElement> fieldMap,
+  ) {
+    for (var parameterElement in _constructor.parameters) {
+      if (parameterElement is FieldFormalParameterElement) {
+        var parameterNode = _getLinkedNode(parameterElement);
+        if (parameterNode is DefaultFormalParameter) {
+          var defaultParameter = parameterNode as DefaultFormalParameter;
+          parameterNode = defaultParameter.parameter;
+        }
+
+        if (parameterNode is FieldFormalParameter &&
+            parameterNode.type == null &&
+            parameterNode.parameters == null) {
+          parameterNode.identifier.staticElement = parameterElement;
+          var name = parameterNode.identifier.name;
+          var fieldElement = fieldMap[name];
+          if (fieldElement != null) {
+            _parameters.add(parameterNode);
+            _fields.add(fieldElement);
+          } else {
+            LazyAst.setType(parameterNode, DynamicTypeImpl.instance);
+          }
+        }
+      }
+    }
+  }
+
+  @override
+  String get displayName => '$_constructor';
+
+  @override
+  List<_InferenceNode> computeDependencies() {
+    return _fields.map(_walker.getNode).where((node) => node != null).toList();
+  }
+
+  @override
+  void evaluate() {
+    for (var i = 0; i < _parameters.length; ++i) {
+      var parameter = _parameters[i];
+      var type = _fields[i].type;
+      LazyAst.setType(parameter, type);
+      (parameter.declaredElement as ParameterElementImpl).type = type;
+    }
+    isEvaluated = true;
+  }
+
+  @override
+  void markCircular(List<_InferenceNode> cycle) {
+    for (var i = 0; i < _parameters.length; ++i) {
+      var parameterNode = _parameters[i];
+      LazyAst.setType(parameterNode, DynamicTypeImpl.instance);
+    }
+    isEvaluated = true;
+  }
+}
+
 class _FunctionElementForLink_Initializer implements FunctionElementImpl {
-  final _InferenceNode _node;
+  final _VariableInferenceNode _node;
 
   @override
   Element enclosingElement;
@@ -171,7 +199,19 @@
 }
 
 class _InferenceDependenciesCollector extends RecursiveAstVisitor<void> {
-  final Set<PropertyInducingElement> _set = Set.identity();
+  final Set<Element> _set = Set.identity();
+
+  @override
+  void visitInstanceCreationExpression(InstanceCreationExpression node) {
+    super.visitInstanceCreationExpression(node);
+    var element = node.staticElement;
+    if (element is ConstructorMember) {
+      element = (element as ConstructorMember).baseElement;
+    }
+    if (element != null) {
+      _set.add(element);
+    }
+  }
 
   @override
   void visitSimpleIdentifier(SimpleIdentifier node) {
@@ -182,108 +222,12 @@
   }
 }
 
-class _InferenceNode extends graph.Node<_InferenceNode> {
-  final _InferenceWalker _walker;
-  final LibraryElement _library;
-  final Scope _scope;
-  final PropertyInducingElementImpl _element;
-  final VariableDeclaration _node;
+abstract class _InferenceNode extends graph.Node<_InferenceNode> {
+  String get displayName;
 
-  @override
-  bool isEvaluated = false;
+  void evaluate();
 
-  _InferenceNode(
-    this._walker,
-    this._library,
-    this._scope,
-    this._element,
-    this._node,
-  );
-
-  bool get isImplicitlyTypedInstanceField {
-    VariableDeclarationList variables = _node.parent;
-    if (variables.type == null) {
-      var parent = variables.parent;
-      return parent is FieldDeclaration && !parent.isStatic;
-    }
-    return false;
-  }
-
-  @override
-  List<_InferenceNode> computeDependencies() {
-    _buildLocalElements();
-    _resolveInitializer();
-
-    var collector = _InferenceDependenciesCollector();
-    _node.initializer.accept(collector);
-
-    if (collector._set.isEmpty) {
-      return const <_InferenceNode>[];
-    }
-
-    var dependencies = collector._set
-        .map(_walker.getNode)
-        .where((node) => node != null)
-        .toList();
-
-    for (var node in dependencies) {
-      if (node.isImplicitlyTypedInstanceField) {
-        LazyAst.setType(_node, DynamicTypeImpl.instance);
-        isEvaluated = true;
-        return const <_InferenceNode>[];
-      }
-    }
-
-    return dependencies;
-  }
-
-  void evaluate() {
-    _resolveInitializer();
-
-    if (LazyAst.getType(_node) == null) {
-      var initializerType = _node.initializer.staticType;
-      initializerType = _dynamicIfNull(initializerType);
-      LazyAst.setType(_node, initializerType);
-    }
-
-    isEvaluated = true;
-  }
-
-  void markCircular(List<_InferenceNode> cycle) {
-    LazyAst.setType(_node, DynamicTypeImpl.instance);
-
-    var cycleNames = Set<String>();
-    for (var inferenceNode in cycle) {
-      var node = inferenceNode._node;
-      if (node is VariableDeclaration) {
-        cycleNames.add(node.name.name);
-      } else {
-        cycleNames.add('<unknown>');
-      }
-    }
-
-    LazyAst.setTypeInferenceError(
-      _node,
-      TopLevelInferenceErrorBuilder(
-        kind: TopLevelInferenceErrorKind.dependencyCycle,
-        arguments: cycleNames.toList(),
-      ),
-    );
-
-    isEvaluated = true;
-  }
-
-  void _buildLocalElements() {
-    var holder = ElementHolder();
-    _node.initializer.accept(LocalElementBuilder(holder, null));
-    _element.encloseElements(holder.functions);
-  }
-
-  void _resolveInitializer() {
-    var astResolver = AstResolver(_walker._linker, _library, _scope);
-    astResolver.rewriteAst(_node.initializer);
-    astResolver.resolve(_node.initializer);
-  }
+  void markCircular(List<_InferenceNode> cycle);
 }
 
 class _InferenceWalker extends graph.DependencyWalker<_InferenceNode> {
@@ -330,12 +274,14 @@
     for (var builder in _linker.builders.values) {
       _library = builder.element;
       for (var unit in _library.units) {
-        unit.types.forEach(_addClassElementFields);
+        unit.extensions.forEach(_addExtensionElementFields);
         unit.mixins.forEach(_addClassElementFields);
+        unit.types.forEach(_addClassConstructorFieldFormals);
+        unit.types.forEach(_addClassElementFields);
 
         _scope = builder.scope;
         for (var element in unit.topLevelVariables) {
-          _addNode(element);
+          _addVariableNode(element);
         }
       }
     }
@@ -345,15 +291,38 @@
     _walker.walkNodes();
   }
 
+  void _addClassConstructorFieldFormals(ClassElement class_) {
+    var fieldMap = <String, FieldElement>{};
+    for (var field in class_.fields) {
+      if (field.isStatic) continue;
+      if (field.isSynthetic) continue;
+      fieldMap[field.name] ??= field;
+    }
+
+    for (var constructor in class_.constructors) {
+      var inferenceNode =
+          _ConstructorInferenceNode(_walker, constructor, fieldMap);
+      _walker._nodes[constructor] = inferenceNode;
+    }
+  }
+
   void _addClassElementFields(ClassElement class_) {
     var node = _getLinkedNode(class_);
     _scope = LinkingNodeContext.get(node).scope;
     for (var element in class_.fields) {
-      _addNode(element);
+      _addVariableNode(element);
     }
   }
 
-  void _addNode(PropertyInducingElement element) {
+  void _addExtensionElementFields(ExtensionElement extension_) {
+    var node = _getLinkedNode(extension_);
+    _scope = LinkingNodeContext.get(node).scope;
+    for (var element in extension_.fields) {
+      _addVariableNode(element);
+    }
+  }
+
+  void _addVariableNode(PropertyInducingElement element) {
     if (element.isSynthetic) return;
 
     VariableDeclaration node = _getLinkedNode(element);
@@ -361,7 +330,7 @@
 
     if (node.initializer != null) {
       var inferenceNode =
-          _InferenceNode(_walker, _library, _scope, element, node);
+          _VariableInferenceNode(_walker, _library, _scope, element, node);
       _walker._nodes[element] = inferenceNode;
       (element as PropertyInducingElementImpl).initializer =
           _FunctionElementForLink_Initializer(inferenceNode);
@@ -370,3 +339,110 @@
     }
   }
 }
+
+class _VariableInferenceNode extends _InferenceNode {
+  final _InferenceWalker _walker;
+  final LibraryElement _library;
+  final Scope _scope;
+  final PropertyInducingElementImpl _element;
+  final VariableDeclaration _node;
+
+  @override
+  bool isEvaluated = false;
+
+  _VariableInferenceNode(
+    this._walker,
+    this._library,
+    this._scope,
+    this._element,
+    this._node,
+  );
+
+  @override
+  String get displayName {
+    return _node.name.name;
+  }
+
+  bool get isImplicitlyTypedInstanceField {
+    VariableDeclarationList variables = _node.parent;
+    if (variables.type == null) {
+      var parent = variables.parent;
+      return parent is FieldDeclaration && !parent.isStatic;
+    }
+    return false;
+  }
+
+  @override
+  List<_InferenceNode> computeDependencies() {
+    _buildLocalElements();
+    _resolveInitializer();
+
+    var collector = _InferenceDependenciesCollector();
+    _node.initializer.accept(collector);
+
+    if (collector._set.isEmpty) {
+      return const <_InferenceNode>[];
+    }
+
+    var dependencies = collector._set
+        .map(_walker.getNode)
+        .where((node) => node != null)
+        .toList();
+
+    for (var node in dependencies) {
+      if (node is _VariableInferenceNode &&
+          node.isImplicitlyTypedInstanceField) {
+        LazyAst.setType(_node, DynamicTypeImpl.instance);
+        isEvaluated = true;
+        return const <_InferenceNode>[];
+      }
+    }
+
+    return dependencies;
+  }
+
+  @override
+  void evaluate() {
+    _resolveInitializer();
+
+    if (LazyAst.getType(_node) == null) {
+      var initializerType = _node.initializer.staticType;
+      initializerType = _dynamicIfNull(initializerType);
+      LazyAst.setType(_node, initializerType);
+    }
+
+    isEvaluated = true;
+  }
+
+  @override
+  void markCircular(List<_InferenceNode> cycle) {
+    LazyAst.setType(_node, DynamicTypeImpl.instance);
+
+    var cycleNames = Set<String>();
+    for (var inferenceNode in cycle) {
+      cycleNames.add(inferenceNode.displayName);
+    }
+
+    LazyAst.setTypeInferenceError(
+      _node,
+      TopLevelInferenceErrorBuilder(
+        kind: TopLevelInferenceErrorKind.dependencyCycle,
+        arguments: cycleNames.toList(),
+      ),
+    );
+
+    isEvaluated = true;
+  }
+
+  void _buildLocalElements() {
+    var holder = ElementHolder();
+    _node.initializer.accept(LocalElementBuilder(holder, null));
+    _element.encloseElements(holder.functions);
+  }
+
+  void _resolveInitializer() {
+    var astResolver = AstResolver(_walker._linker, _library, _scope);
+    astResolver.rewriteAst(_node.initializer);
+    astResolver.resolve(_node.initializer);
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/type_alias.dart b/pkg/analyzer/lib/src/summary2/type_alias.dart
index 79e8ba8..37fae3b 100644
--- a/pkg/analyzer/lib/src/summary2/type_alias.dart
+++ b/pkg/analyzer/lib/src/summary2/type_alias.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/summary2/lazy_ast.dart';
 import 'package:analyzer/src/summary2/link.dart';
 
@@ -27,11 +29,27 @@
               node,
               finder.hasSelfReference,
             );
+            if (finder.hasSelfReference) {
+              _sanitizeGenericTypeAlias(node);
+            }
           }
         }
       }
     }
   }
+
+  void _sanitizeGenericTypeAlias(GenericTypeAlias node) {
+    var typeParameterList = node.typeParameters;
+    if (typeParameterList != null) {
+      for (var typeParameter in typeParameterList.typeParameters) {
+        typeParameter.bound = null;
+      }
+    }
+    node.functionType.returnType = null;
+    node.functionType.parameters.parameters.clear();
+    (node.functionType as GenericFunctionTypeImpl).type =
+        FunctionTypeImpl.synthetic(DynamicTypeImpl.instance, [], []);
+  }
 }
 
 class _Finder {
diff --git a/pkg/analyzer/lib/src/summary2/types_builder.dart b/pkg/analyzer/lib/src/summary2/types_builder.dart
index 0fa8a2b..e7733c3 100644
--- a/pkg/analyzer/lib/src/summary2/types_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/types_builder.dart
@@ -83,11 +83,15 @@
 
   void _classDeclaration(ClassDeclaration node) {}
 
+  void _classTypeAlias(ClassTypeAlias node) {}
+
   void _declaration(AstNode node) {
     if (node is ClassDeclaration) {
       _classDeclaration(node);
     } else if (node is ClassTypeAlias) {
-      // TODO(scheglov) ???
+      _classTypeAlias(node);
+    } else if (node is ExtensionDeclaration) {
+      _extensionDeclaration(node);
     } else if (node is FieldFormalParameter) {
       _fieldFormalParameter(node);
     } else if (node is FunctionDeclaration) {
@@ -134,6 +138,8 @@
     }
   }
 
+  void _extensionDeclaration(ExtensionDeclaration node) {}
+
   void _fieldFormalParameter(FieldFormalParameter node) {
     var parameterList = node.parameters;
     if (parameterList != null) {
diff --git a/pkg/analyzer/lib/src/task/api/model.dart b/pkg/analyzer/lib/src/task/api/model.dart
index 2d13057..05c8b23 100644
--- a/pkg/analyzer/lib/src/task/api/model.dart
+++ b/pkg/analyzer/lib/src/task/api/model.dart
@@ -287,7 +287,7 @@
       return false;
     }
 
-    if (cycle.length > 0) {
+    if (cycle.isNotEmpty) {
       traverse(cycle[0]);
     }
     return path;
diff --git a/pkg/analyzer/lib/src/task/options.dart b/pkg/analyzer/lib/src/task/options.dart
index d84a7ab..ee07eec 100644
--- a/pkg/analyzer/lib/src/task/options.dart
+++ b/pkg/analyzer/lib/src/task/options.dart
@@ -549,7 +549,7 @@
   AnalysisOptionsWarningCode _warningCode;
 
   TopLevelOptionValidator(this.pluginName, this.supportedOptions) {
-    assert(supportedOptions != null && !supportedOptions.isEmpty);
+    assert(supportedOptions != null && supportedOptions.isNotEmpty);
     if (supportedOptions.length > 1) {
       _valueProposal = StringUtilities.printListOfQuotedNames(supportedOptions);
       _warningCode =
diff --git a/pkg/analyzer/lib/src/task/strong/checker.dart b/pkg/analyzer/lib/src/task/strong/checker.dart
index b286b97..00ca4ae 100644
--- a/pkg/analyzer/lib/src/task/strong/checker.dart
+++ b/pkg/analyzer/lib/src/task/strong/checker.dart
@@ -19,9 +19,10 @@
 import 'package:analyzer/source/error_processor.dart' show ErrorProcessor;
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.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/error/codes.dart' show StrongModeCode;
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptionsImpl;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
@@ -97,9 +98,8 @@
   return null;
 }
 
-/// Looks up the declaration that matches [member] in [type] and returns it's
-/// declared type.
-FunctionType _getMemberType(InterfaceType type, ExecutableElement member) {
+/// Looks up the declaration that matches [member] in [type].
+ExecutableElement _getMember(InterfaceType type, ExecutableElement member) {
   if (member.isPrivate && type.element.library != member.library) {
     return null;
   }
@@ -112,14 +112,14 @@
       ? (member.isGetter ? type.getGetter(name) : type.getSetter(name))
       : type.getMethod(name);
   if (baseMember == null || baseMember.isStatic) return null;
-  return baseMember.type;
+  return baseMember;
 }
 
 /// Checks the body of functions and properties.
 class CodeChecker extends RecursiveAstVisitor {
   final Dart2TypeSystem rules;
   final TypeProvider typeProvider;
-  final InheritanceManager2 inheritance;
+  final InheritanceManager3 inheritance;
   final AnalysisErrorListener reporter;
   final AnalysisOptionsImpl _options;
   _OverrideChecker _overrideChecker;
@@ -499,14 +499,14 @@
     DartType type = DynamicTypeImpl.instance;
     if (node.typeArguments != null) {
       NodeList<TypeAnnotation> targs = node.typeArguments.arguments;
-      if (targs.length > 0) {
+      if (targs.isNotEmpty) {
         type = targs[0].type;
       }
     } else {
       DartType staticType = node.staticType;
       if (staticType is InterfaceType) {
         List<DartType> targs = staticType.typeArguments;
-        if (targs != null && targs.length > 0) {
+        if (targs != null && targs.isNotEmpty) {
           type = targs[0];
         }
       }
@@ -605,7 +605,7 @@
       DartType valueType = DynamicTypeImpl.instance;
       if (node.typeArguments != null) {
         NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
-        if (typeArguments.length > 0) {
+        if (typeArguments.isNotEmpty) {
           keyType = typeArguments[0].type;
         }
         if (typeArguments.length > 1) {
@@ -616,7 +616,7 @@
         if (staticType is InterfaceType) {
           List<DartType> typeArguments = staticType.typeArguments;
           if (typeArguments != null) {
-            if (typeArguments.length > 0) {
+            if (typeArguments.isNotEmpty) {
               keyType = typeArguments[0];
             }
             if (typeArguments.length > 1) {
@@ -633,14 +633,14 @@
       DartType type = DynamicTypeImpl.instance;
       if (node.typeArguments != null) {
         NodeList<TypeAnnotation> typeArguments = node.typeArguments.arguments;
-        if (typeArguments.length > 0) {
+        if (typeArguments.isNotEmpty) {
           type = typeArguments[0].type;
         }
       } else {
         DartType staticType = node.staticType;
         if (staticType is InterfaceType) {
           List<DartType> typeArguments = staticType.typeArguments;
-          if (typeArguments != null && typeArguments.length > 0) {
+          if (typeArguments != null && typeArguments.isNotEmpty) {
             type = typeArguments[0];
           }
         }
@@ -899,6 +899,13 @@
           classType.typeParameters.length, BottomTypeImpl.instance));
       var memberLowerBound = inheritance.getMember(
           classLowerBound, Name(element.librarySource.uri, element.name));
+      if (memberLowerBound == null &&
+          element.enclosingElement is ExtensionElement) {
+        // TODO(brianwilkerson) At this point, I think we need to search for the
+        //  extension member in the lower bound of the extended type. For now we
+        //  return in order to stop it from crashing.
+        return;
+      }
       var expectedType = invokeType.returnType;
 
       if (!rules.isSubtypeOf(memberLowerBound.returnType, expectedType)) {
@@ -1278,7 +1285,7 @@
       _failure = true;
     }
     if (errorCode.type == ErrorType.HINT &&
-        errorCode.name.startsWith('STRONG_MODE_TOP_LEVEL_')) {
+        errorCode.name.startsWith('TOP_LEVEL_')) {
       severity = ErrorSeverity.ERROR;
     }
     if (severity != ErrorSeverity.INFO || _options.strongModeHints) {
@@ -1570,24 +1577,36 @@
   ///   of `D.g`.
   void _findCovariantChecksForMember(ExecutableElement member,
       InterfaceType unsafeSupertype, Set<Element> covariantChecks) {
-    var f2 = _getMemberType(unsafeSupertype, member);
+    var f2 = _getMember(unsafeSupertype, member);
     if (f2 == null) return;
-    var f1 = member.type;
+    var f1 = member;
 
     // Find parameter or type formal checks that we need to ensure `f2 <: f1`.
     //
     // The static type system allows this subtyping, but it is not sound without
     // these runtime checks.
-    var fresh = FunctionTypeImpl.relateTypeFormals(f1, f2, (b2, b1, p2, p1) {
-      if (!rules.isSubtypeOf(b2, b1)) covariantChecks.add(p1);
-      return true;
-    });
+    var fresh = FunctionTypeImpl.relateTypeFormals2(
+      f1.typeParameters,
+      f2.typeParameters,
+      (b2, b1, p2, p1) {
+        if (!rules.isSubtypeOf(b2, b1)) {
+          covariantChecks.add(p1);
+        }
+        return true;
+      },
+    );
+
     if (fresh != null) {
-      f1 = f1.instantiate(fresh);
-      f2 = f2.instantiate(fresh);
+      var subst1 = Substitution.fromPairs(f1.typeParameters, fresh);
+      var subst2 = Substitution.fromPairs(f2.typeParameters, fresh);
+      f1 = ExecutableMember.from2(f1, subst1);
+      f2 = ExecutableMember.from2(f2, subst2);
     }
+
     FunctionTypeImpl.relateParameters(f1.parameters, f2.parameters, (p1, p2) {
-      if (!rules.isOverrideSubtypeOfParameter(p1, p2)) covariantChecks.add(p1);
+      if (!rules.isOverrideSubtypeOfParameter(p1, p2)) {
+        covariantChecks.add(p1);
+      }
       return true;
     });
   }
diff --git a/pkg/analyzer/lib/src/task/strong_mode.dart b/pkg/analyzer/lib/src/task/strong_mode.dart
index ed2c5c3..7b86364c 100644
--- a/pkg/analyzer/lib/src/task/strong_mode.dart
+++ b/pkg/analyzer/lib/src/task/strong_mode.dart
@@ -9,7 +9,7 @@
 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/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/summary/format.dart';
@@ -37,7 +37,7 @@
  */
 class InstanceMemberInferrer {
   final TypeProvider typeProvider;
-  final InheritanceManager2 inheritance;
+  final InheritanceManager3 inheritance;
   final Set<ClassElement> elementsBeingInferred = new HashSet<ClassElement>();
 
   InterfaceType interfaceType;
@@ -57,14 +57,14 @@
   }
 
   /**
-   * Return `true` if the elements corresponding to the [types] have the same
+   * Return `true` if the elements corresponding to the [elements] have the same
    * kind as the [element].
    */
   bool _allSameElementKind(
-      ExecutableElement element, List<FunctionType> types) {
+      ExecutableElement element, List<ExecutableElement> elements) {
     var elementKind = element.kind;
-    for (int i = 0; i < types.length; i++) {
-      if (types[i].element.kind != elementKind) {
+    for (int i = 0; i < elements.length; i++) {
+      if (elements[i].kind != elementKind) {
         return false;
       }
     }
@@ -84,7 +84,7 @@
       new Name(accessor.library.source.uri, name),
     );
 
-    List<FunctionType> overriddenSetters;
+    List<ExecutableElement> overriddenSetters;
     if (overriddenGetters == null || !accessor.variable.isFinal) {
       overriddenSetters = inheritance.getOverridden(
         interfaceType,
@@ -92,34 +92,34 @@
       );
     }
 
-    // Choose overridden types from getters or/and setters.
-    List<FunctionType> overriddenTypes = <FunctionType>[];
+    // Choose overridden members from getters or/and setters.
+    List<ExecutableElement> overriddenElements = <ExecutableElement>[];
     if (overriddenGetters == null && overriddenSetters == null) {
-      overriddenTypes = const <FunctionType>[];
+      overriddenElements = const <ExecutableElement>[];
     } else if (overriddenGetters == null && overriddenSetters != null) {
-      overriddenTypes = overriddenSetters;
+      overriddenElements = overriddenSetters;
     } else if (overriddenGetters != null && overriddenSetters == null) {
-      overriddenTypes = overriddenGetters;
+      overriddenElements = overriddenGetters;
     } else {
-      overriddenTypes = <FunctionType>[]
+      overriddenElements = <ExecutableElement>[]
         ..addAll(overriddenGetters)
         ..addAll(overriddenSetters);
     }
 
     bool isCovariant = false;
     DartType impliedType;
-    for (FunctionType overriddenType in overriddenTypes) {
-      var overriddenElementKind = overriddenType.element.kind;
-      if (overriddenType == null) {
+    for (ExecutableElement overriddenElement in overriddenElements) {
+      var overriddenElementKind = overriddenElement.kind;
+      if (overriddenElement == null) {
         return new _FieldOverrideInferenceResult(false, null, true);
       }
 
       DartType type;
       if (overriddenElementKind == ElementKind.GETTER) {
-        type = overriddenType.returnType;
+        type = overriddenElement.returnType;
       } else if (overriddenElementKind == ElementKind.SETTER) {
-        if (overriddenType.parameters.length == 1) {
-          ParameterElement parameter = overriddenType.parameters[0];
+        if (overriddenElement.parameters.length == 1) {
+          ParameterElement parameter = overriddenElement.parameters[0];
           type = parameter.type;
           isCovariant = isCovariant || parameter.isCovariant;
         }
@@ -364,15 +364,17 @@
 
     // TODO(scheglov) If no implicit types, don't ask inherited.
 
-    List<FunctionType> overriddenTypes = inheritance.getOverridden(
+    List<ExecutableElement> overriddenElements = inheritance.getOverridden(
       interfaceType,
       new Name(element.library.source.uri, element.name),
     );
-    if (overriddenTypes == null ||
-        !_allSameElementKind(element, overriddenTypes)) {
+    if (overriddenElements == null ||
+        !_allSameElementKind(element, overriddenElements)) {
       return;
     }
-    overriddenTypes = _toOverriddenFunctionTypes(element, overriddenTypes);
+
+    List<FunctionType> overriddenTypes =
+        _toOverriddenFunctionTypes(element, overriddenElements);
     if (overriddenTypes.isEmpty) {
       return;
     }
@@ -481,11 +483,8 @@
   }
 
   /**
-   * If the [element] has formal type parameters, then the [overriddenType]
-   * must have it as well, but they are different.  Replace type parameters
-   * of the [overriddenType] with type formals of the [element].
-   *
-   * Return `null`, in case of type parameters inconsistency.
+   * Return the [FunctionType] of the [overriddenElement] that [element]
+   * overrides. Return `null`, in case of type parameters inconsistency.
    *
    * The overridden element must have the same number of generic type
    * parameters as the target element, or none.
@@ -496,9 +495,10 @@
    * should infer this as `m<T>(T t)`.
    */
   FunctionType _toOverriddenFunctionType(
-      ExecutableElement element, FunctionType overriddenType) {
+      ExecutableElement element, ExecutableElement overriddenElement) {
     List<DartType> typeFormals =
         TypeParameterTypeImpl.getTypes(element.type.typeFormals);
+    FunctionType overriddenType = overriddenElement.type;
     if (overriddenType.typeFormals.isNotEmpty) {
       if (overriddenType.typeFormals.length != typeFormals.length) {
         return null;
@@ -509,20 +509,21 @@
   }
 
   /**
-   * Return [overriddenTypes] that override [element].
+   * Return [FunctionType]s of [overriddenElements] that override [element].
    * Return the empty list, in case of type parameters inconsistency.
    */
   List<FunctionType> _toOverriddenFunctionTypes(
-      ExecutableElement element, List<FunctionType> overriddenTypes) {
-    var result = <FunctionType>[];
-    for (var overriddenType in overriddenTypes) {
-      overriddenType = _toOverriddenFunctionType(element, overriddenType);
+      ExecutableElement element, List<ExecutableElement> overriddenElements) {
+    var overriddenTypes = <FunctionType>[];
+    for (ExecutableElement overriddenElement in overriddenElements) {
+      FunctionType overriddenType =
+          _toOverriddenFunctionType(element, overriddenElement);
       if (overriddenType == null) {
         return const <FunctionType>[];
       }
-      result.add(overriddenType);
+      overriddenTypes.add(overriddenType);
     }
-    return result;
+    return overriddenTypes;
   }
 
   /**
diff --git a/pkg/analyzer/lib/src/test_utilities/find_element.dart b/pkg/analyzer/lib/src/test_utilities/find_element.dart
index e4066ca..3632f39 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_element.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_element.dart
@@ -87,6 +87,15 @@
     throw StateError('Not found: $targetUri');
   }
 
+  ExtensionElement extension_(String name) {
+    for (var extension_ in unitElement.extensions) {
+      if (extension_.name == name) {
+        return extension_;
+      }
+    }
+    throw StateError('Not found: $name');
+  }
+
   FieldElement field(String name, {String of}) {
     FieldElement result;
 
@@ -122,6 +131,13 @@
       findIn(mixin.fields);
     }
 
+    for (var extension in unitElement.extensions) {
+      if (of != null && extension.name != of) {
+        continue;
+      }
+      findIn(extension.fields);
+    }
+
     if (result != null) {
       return result;
     }
@@ -171,6 +187,13 @@
       findIn(enum_.accessors);
     }
 
+    for (var extension_ in unitElement.extensions) {
+      if (of != null && extension_.name != of) {
+        continue;
+      }
+      findIn(extension_.accessors);
+    }
+
     for (var class_ in unitElement.types) {
       if (of != null && class_.name != of) {
         continue;
@@ -275,6 +298,13 @@
       }
     }
 
+    for (var extension_ in unitElement.extensions) {
+      if (of != null && extension_.name != of) {
+        continue;
+      }
+      findIn(extension_.methods);
+    }
+
     for (var class_ in unitElement.types) {
       if (of != null && class_.name != of) {
         continue;
@@ -330,6 +360,15 @@
       findIn(function.parameters);
     }
 
+    for (var extension_ in unitElement.extensions) {
+      for (var method in extension_.methods) {
+        findIn(method.parameters);
+      }
+      for (var accessor in extension_.accessors) {
+        findIn(accessor.parameters);
+      }
+    }
+
     for (var class_ in unitElement.types) {
       for (var constructor in class_.constructors) {
         findIn(constructor.parameters);
@@ -372,6 +411,13 @@
       }
     }
 
+    for (var extension_ in unitElement.extensions) {
+      if (of != null && extension_.name != of) {
+        continue;
+      }
+      findIn(extension_.accessors);
+    }
+
     for (var class_ in unitElement.types) {
       if (of != null && class_.name != of) {
         continue;
@@ -481,6 +527,15 @@
     throw StateError('Not found: $name');
   }
 
+  ExtensionElement extension_(String name) {
+    for (var element in definingUnit.extensions) {
+      if (element.name == name) {
+        return element;
+      }
+    }
+    throw StateError('Not found: $name');
+  }
+
   GenericTypeAliasElement functionTypeAlias(String name) {
     for (var element in definingUnit.functionTypeAliases) {
       if (element.name == name) {
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 7a1f121..e02ea7e 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -87,6 +87,14 @@
     return _node(search, (n) => n is ExpressionStatement);
   }
 
+  ExtensionDeclaration extensionDeclaration(String search) {
+    return _node(search, (n) => n is ExtensionDeclaration);
+  }
+
+  ExtensionOverride extensionOverride(String search) {
+    return _node(search, (n) => n is ExtensionOverride);
+  }
+
   FieldDeclaration fieldDeclaration(String search) {
     return _node(search, (n) => n is FieldDeclaration);
   }
diff --git a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
index 52afb8a..148acf6 100644
--- a/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
+++ b/pkg/analyzer/lib/src/test_utilities/mock_sdk.dart
@@ -222,6 +222,7 @@
   int operator ~();
 
   int gcd(int other);
+  int abs();
 
   external static int parse(String source,
       {int radix, int onError(String source)});
diff --git a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart b/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
index 9fe449e..d071a81 100644
--- a/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
+++ b/pkg/analyzer/lib/src/test_utilities/package_mixin.dart
@@ -11,6 +11,17 @@
   /// resolve 'package:' URIs.
   Map<String, List<Folder>> get packageMap;
 
+  /// Create a fake 'js' package that can be used by tests.
+  void addJsPackage() {
+    Folder lib = addPubPackage('js');
+    newFile(join(lib.path, 'js.dart'), content: r'''
+library js;
+class JS {
+  const JS([String js]);
+}
+''');
+  }
+
   /// Create a fake 'meta' package that can be used by tests.
   void addMetaPackage() {
     Folder lib = addPubPackage('meta');
diff --git a/pkg/analyzer/lib/src/util/ast_data_extractor.dart b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
index bf528bd..da98e77 100644
--- a/pkg/analyzer/lib/src/util/ast_data_extractor.dart
+++ b/pkg/analyzer/lib/src/util/ast_data_extractor.dart
@@ -107,7 +107,7 @@
 }
 
 class _Failure implements Exception {
-  final message;
+  final String message;
 
   _Failure([this.message]);
 
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index 6f7bc5b..8491beb 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,10 +1,12 @@
 name: analyzer
-version: 0.37.0
+version: 0.37.1-dev
 author: Dart Team <misc@dartlang.org>
-description: Static analyzer for Dart.
+description: This package provides a library that performs static analysis of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer
+
 environment:
   sdk: '>=2.2.2 <3.0.0'
+
 dependencies:
   args: '>=0.12.1 <2.0.0'
   charcode: ^1.1.0
diff --git a/pkg/analyzer/test/dart/analysis/utilities_test.dart b/pkg/analyzer/test/dart/analysis/utilities_test.dart
index 2f4eb29..fa89f06 100644
--- a/pkg/analyzer/test/dart/analysis/utilities_test.dart
+++ b/pkg/analyzer/test/dart/analysis/utilities_test.dart
@@ -55,6 +55,24 @@
         equals("void main() => print('Hello, world!');"));
   }
 
+  test_parseFile_errors_path() {
+    String content = '''
+void main() => print('Hello, world!')
+''';
+    String expectedPath;
+    ParseStringResult result =
+        _withMemoryFile(content, (resourceProvider, path) {
+      expectedPath = path;
+      return parseFile(
+          path: path,
+          featureSet: defaultFeatureSet,
+          resourceProvider: resourceProvider,
+          throwIfDiagnostics: false);
+    });
+    expect(result.errors, hasLength(1));
+    expect(result.errors[0].source.fullName, expectedPath);
+  }
+
   test_parseFile_errors_throw() {
     String content = '''
 void main() => print('Hello, world!')
@@ -137,6 +155,18 @@
         equals("void main() => print('Hello, world!');"));
   }
 
+  test_parseString_errors_path() {
+    String content = '''
+void main() => print('Hello, world!')
+''';
+    var path = 'foo/bar';
+    ParseStringResult result = parseString(
+        content: content, path: 'foo/bar', throwIfDiagnostics: false);
+    expect(result.errors, hasLength(1));
+    var error = result.errors[0];
+    expect(error.source.fullName, path);
+  }
+
   test_parseString_errors_throw() {
     String content = '''
 void main() => print('Hello, world!')
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 7ee7052..5138f20 100644
--- a/pkg/analyzer/test/file_system/overlay_file_system_test.dart
+++ b/pkg/analyzer/test/file_system/overlay_file_system_test.dart
@@ -532,6 +532,36 @@
         unorderedEquals([child1.path, child2.path, child3.path]));
   }
 
+  test_getChildren_existing_withOverlay() {
+    Folder folder = _folder(exists: true);
+    Folder child1 = _folder(
+        exists: true, path: provider.pathContext.join(folder.path, 'lib'));
+    _file(
+        exists: true,
+        path: provider.pathContext.join(child1.path, 'a.dart'),
+        withOverlay: true);
+    List<String> childPaths =
+        folder.getChildren().map((resource) => resource.path).toList();
+    expect(childPaths, equals([child1.path]));
+  }
+
+  test_getChildren_multipleDescendantOverlays() {
+    Folder folder = _folder(exists: true);
+    Folder child1 = _folder(
+        exists: false, path: provider.pathContext.join(folder.path, 'lib'));
+    _file(
+        exists: false,
+        withOverlay: true,
+        path: provider.pathContext.join(child1.path, 'a.dart'));
+    _file(
+        exists: false,
+        withOverlay: true,
+        path: provider.pathContext.join(child1.path, 'b.dart'));
+    List<String> childPaths =
+        folder.getChildren().map((resource) => resource.path).toList();
+    expect(childPaths, equals([child1.path]));
+  }
+
   test_getChildren_nonExisting_withOverlay() {
     File file = _file(exists: false, withOverlay: true);
     List<Resource> children = file.parent.parent.getChildren();
diff --git a/pkg/analyzer/test/generated/compile_time_error_code.dart b/pkg/analyzer/test/generated/compile_time_error_code.dart
index 21bcf7c..ed10771 100644
--- a/pkg/analyzer/test/generated/compile_time_error_code.dart
+++ b/pkg/analyzer/test/generated/compile_time_error_code.dart
@@ -43,24 +43,6 @@
     ]);
   }
 
-  test_ambiguousExport() async {
-    newFile("/test/lib/lib1.dart", content: r'''
-library lib1;
-class N {}
-''');
-    newFile("/test/lib/lib2.dart", content: r'''
-library lib2;
-class N {}
-''');
-    await assertErrorsInCode(r'''
-library L;
-export 'lib1.dart';
-export 'lib2.dart';
-''', [
-      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 31, 19),
-    ]);
-  }
-
   test_annotationWithNotClass() async {
     await assertErrorsInCode('''
 class Property {
@@ -720,12 +702,11 @@
 }
 
 const num a = 0;
-const _ = a == const A();
+const b = a == const A();
 ''',
         IsEnabledByDefault.constant_update_2018
             ? []
             : [
-                error(HintCode.UNUSED_ELEMENT, 49, 1),
                 error(CompileTimeErrorCode.CONST_EVAL_TYPE_BOOL_NUM_STRING, 53,
                     14),
               ]);
@@ -1801,7 +1782,7 @@
     // The type of the defaultValue needs to be correct even when the default
     // value isn't used (because the variable is defined in the environment).
     driver.declaredVariables = new DeclaredVariables.fromMap({'x': 'true'});
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 var b = const bool.fromEnvironment('x', defaultValue: 1);
 ''', [
       error(CompileTimeErrorCode.CONST_EVAL_THROWS_EXCEPTION, 8, 48),
@@ -2850,86 +2831,6 @@
     ]);
   }
 
-  test_invalidReferenceToThis_factoryConstructor() async {
-    await assertErrorsInCode(r'''
-class A {
-  factory A() { return this; }
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 33, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_instanceVariableInitializer_inConstructor() async {
-    await assertErrorsInCode(r'''
-class A {
-  var f;
-  A() : f = this;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 31, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_instanceVariableInitializer_inDeclaration() async {
-    await assertErrorsInCode(r'''
-class A {
-  var f = this;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 20, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_staticMethod() async {
-    await assertErrorsInCode(r'''
-class A {
-  static m() { return this; }
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 32, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_staticVariableInitializer() async {
-    await assertErrorsInCode(r'''
-class A {
-  static A f = this;
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 25, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_superInitializer() async {
-    await assertErrorsInCode(r'''
-class A {
-  A(var x) {}
-}
-class B extends A {
-  B() : super(this);
-}
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 60, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_topLevelFunction() async {
-    await assertErrorsInCode('''
-f() { return this; }
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 13, 4),
-    ]);
-  }
-
-  test_invalidReferenceToThis_variableInitializer() async {
-    await assertErrorsInCode('''
-int x = this;
-''', [
-      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 8, 4),
-    ]);
-  }
-
   test_invalidTypeArgumentInConstList() async {
     await assertErrorsInCode(r'''
 class A<E> {
@@ -5068,6 +4969,18 @@
   }
 
   test_typeAliasCannotReferenceItself_generic() async {
+    List<ExpectedError> expectedErrors;
+    if (AnalysisDriver.useSummary2) {
+      expectedErrors = [
+        error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 37),
+        error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, 101, 1),
+      ];
+    } else {
+      expectedErrors = [
+        error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 37),
+        error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 38, 37),
+      ];
+    }
     await assertErrorsInCode(r'''
 typedef F = void Function(List<G> l);
 typedef G = void Function(List<F> l);
@@ -5075,10 +4988,7 @@
   F foo(G g) => g;
   foo(null);
 }
-''', [
-      error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 37),
-      error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 38, 37),
-    ]);
+''', expectedErrors);
   }
 
   test_typeAliasCannotReferenceItself_parameterType_named() async {
@@ -5143,17 +5053,12 @@
   }
 
   test_typeAliasCannotReferenceItself_typeVariableBounds() async {
-    var errors = [
-      error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 30),
-    ];
-    if (!AnalysisDriver.useSummary2) {
-      errors.add(
-        error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 22, 3),
-      );
-    }
     await assertErrorsInCode('''
 typedef A<T extends A<int>>();
-''', errors);
+''', [
+      error(CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF, 0, 30),
+      error(CompileTimeErrorCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, 22, 3),
+    ]);
   }
 
   test_typeArgumentNotMatchingBounds_const() async {
diff --git a/pkg/analyzer/test/generated/element_resolver_test.dart b/pkg/analyzer/test/generated/element_resolver_test.dart
index 53c7e30..5a921b4 100644
--- a/pkg/analyzer/test/generated/element_resolver_test.dart
+++ b/pkg/analyzer/test/generated/element_resolver_test.dart
@@ -12,7 +12,7 @@
 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/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/element_resolver.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -1139,7 +1139,7 @@
         resourceProvider: resourceProvider);
     _typeProvider = context.typeProvider;
 
-    var inheritance = new InheritanceManager2(context.typeSystem);
+    var inheritance = new InheritanceManager3(context.typeSystem);
     Source source = new FileSource(getFile("/test.dart"));
     CompilationUnitElementImpl unit = new CompilationUnitElementImpl();
     unit.librarySource = unit.source = source;
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
deleted file mode 100644
index d13e5f5..0000000
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ /dev/null
@@ -1,291 +0,0 @@
-// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/parser.dart';
-import 'package:analyzer/src/generated/source.dart';
-import 'package:analyzer/src/task/options.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../src/util/yaml_test.dart';
-import 'resolver_test_case.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(HintCodeTest);
-  });
-}
-
-@reflectiveTest
-class HintCodeTest extends ResolverTestCase {
-  @override
-  void reset() {
-    super.resetWith(packages: [
-      [
-        'js',
-        r'''
-library js;
-class JS {
-  const JS([String js]);
-}
-'''
-      ],
-    ]);
-  }
-
-  test_deprecatedFunction_class() async {
-    Source source = addSource(r'''
-class Function {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION]);
-    verify([source]);
-  }
-
-  test_deprecatedFunction_extends() async {
-    Source source = addSource(r'''
-class A extends Function {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_EXTENDS_FUNCTION]);
-    verify([source]);
-  }
-
-  test_deprecatedFunction_extends2() async {
-    Source source = addSource(r'''
-class Function {}
-class A extends Function {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION,
-      HintCode.DEPRECATED_EXTENDS_FUNCTION
-    ]);
-    verify([source]);
-  }
-
-  test_deprecatedFunction_mixin() async {
-    Source source = addSource(r'''
-class A extends Object with Function {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DEPRECATED_MIXIN_FUNCTION]);
-    verify([source]);
-  }
-
-  test_deprecatedFunction_mixin2() async {
-    Source source = addSource(r'''
-class Function {}
-class A extends Object with Function {}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [
-      HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION,
-      HintCode.DEPRECATED_MIXIN_FUNCTION
-    ]);
-    verify([source]);
-  }
-
-  test_duplicateShownHiddenName_hidden() async {
-    Source source = addSource(r'''
-library L;
-export 'lib1.dart' hide A, B, A;''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DUPLICATE_HIDDEN_NAME]);
-    verify([source]);
-  }
-
-  test_duplicateShownHiddenName_shown() async {
-    Source source = addSource(r'''
-library L;
-export 'lib1.dart' show A, B, A;''');
-    addNamedSource("/lib1.dart", r'''
-library lib1;
-class A {}
-class B {}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.DUPLICATE_SHOWN_NAME]);
-    verify([source]);
-  }
-
-  test_isDouble() async {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.dart2jsHint = true;
-    resetWith(options: options);
-    Source source = addSource("var v = 1 is double;");
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.IS_DOUBLE]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_isInt() async {
-    Source source = addSource("var v = 1 is int;");
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.IS_INT]);
-    verify([source]);
-  }
-
-  test_isNotDouble() async {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.dart2jsHint = true;
-    resetWith(options: options);
-    Source source = addSource("var v = 1 is! double;");
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.IS_NOT_DOUBLE]);
-    verify([source]);
-  }
-
-  @failingTest
-  test_isNotInt() async {
-    Source source = addSource("var v = 1 is! int;");
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.IS_NOT_INT]);
-    verify([source]);
-  }
-
-  test_js_lib_OK() async {
-    Source source = addSource(r'''
-@JS()
-library foo;
-
-import 'package:js/js.dart';
-
-@JS()
-class A { }
-''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_missingJsLibAnnotation_class() async {
-    Source source = addSource(r'''
-library foo;
-
-import 'package:js/js.dart';
-
-@JS()
-class A { }
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_missingJsLibAnnotation_externalField() async {
-    // https://github.com/dart-lang/sdk/issues/26987
-    Source source = addSource(r'''
-import 'package:js/js.dart';
-
-@JS()
-external dynamic exports;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source,
-        [ParserErrorCode.EXTERNAL_FIELD, HintCode.MISSING_JS_LIB_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_missingJsLibAnnotation_function() async {
-    Source source = addSource(r'''
-library foo;
-
-import 'package:js/js.dart';
-
-@JS('acxZIndex')
-set _currentZIndex(int value) { }
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_missingJsLibAnnotation_method() async {
-    Source source = addSource(r'''
-library foo;
-
-import 'package:js/js.dart';
-
-class A {
-  @JS()
-  void a() { }
-}
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_missingJsLibAnnotation_variable() async {
-    Source source = addSource(r'''
-import 'package:js/js.dart';
-
-@JS()
-dynamic variable;
-''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
-    verify([source]);
-  }
-
-  test_strongMode_downCastCompositeHint() async {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongModeHints = true;
-    resetWith(options: options);
-    Source source = addSource(r'''
-main() {
-  List dynamicList = [ ];
-  List<int> list = dynamicList;
-  print(list);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.DOWN_CAST_COMPOSITE]);
-    verify([source]);
-  }
-
-  test_strongMode_downCastCompositeNoHint() async {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    options.strongModeHints = false;
-    resetWith(options: options);
-    Source source = addSource(r'''
-main() {
-  List dynamicList = [ ];
-  List<int> list = dynamicList;
-  print(list);
-}''');
-    await computeAnalysisResult(source);
-    assertNoErrors(source);
-    verify([source]);
-  }
-
-  test_strongMode_downCastCompositeWarn() async {
-    AnalysisOptionsImpl options = new AnalysisOptionsImpl();
-    applyToAnalysisOptions(
-        options,
-        wrap({
-          AnalyzerOptions.analyzer: {
-            AnalyzerOptions.errors: {
-              StrongModeCode.DOWN_CAST_COMPOSITE.name: 'warning'
-            },
-          }
-        }));
-    options.strongModeHints = false;
-    resetWith(options: options);
-    Source source = addSource(r'''
-main() {
-  List dynamicList = [ ];
-  List<int> list = dynamicList;
-  print(list);
-}''');
-    await computeAnalysisResult(source);
-    assertErrors(source, [StrongModeCode.DOWN_CAST_COMPOSITE]);
-    verify([source]);
-  }
-}
diff --git a/pkg/analyzer/test/generated/invalid_code_test.dart b/pkg/analyzer/test/generated/invalid_code_test.dart
index 6b501b9..778ecc8 100644
--- a/pkg/analyzer/test/generated/invalid_code_test.dart
+++ b/pkg/analyzer/test/generated/invalid_code_test.dart
@@ -48,6 +48,41 @@
 ''');
   }
 
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/37733')
+  test_fuzz_01() async {
+    await _assertCanBeAnalyzed(r'''
+typedef K=Function(<>($
+''');
+  }
+
+  test_fuzz_02() async {
+    await _assertCanBeAnalyzed(r'''
+class G<class G{d
+''');
+  }
+
+  @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/37735')
+  test_fuzz_03() async {
+    await _assertCanBeAnalyzed('''
+class{const():super.{n
+''');
+  }
+
+  test_fuzz_04() async {
+    await _assertCanBeAnalyzed('''
+f({a: ({b = 0}) {}}) {}
+''');
+  }
+
+  test_fuzz_06() async {
+    await _assertCanBeAnalyzed(r'''
+class C {
+  int f;
+  set f() {}
+}
+''');
+  }
+
   test_genericFunction_asTypeArgument_ofUnresolvedClass() async {
     await _assertCanBeAnalyzed(r'''
 C<int Function()> c;
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index eb33500..b219c94 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -17,15 +17,6 @@
 
 @reflectiveTest
 class NonHintCodeTest extends DriverResolutionTest {
-  test_async_future_object_without_return() async {
-    await assertErrorsInCode('''
-import 'dart:async';
-Future<Object> f() async {}
-''', [
-      error(HintCode.MISSING_RETURN, 21, 14),
-    ]);
-  }
-
   test_issue20904BuggyTypePromotionAtIfJoin_1() async {
     // https://code.google.com/p/dart/issues/detail?id=20904
     await assertNoErrorsInCode(r'''
diff --git a/pkg/analyzer/test/generated/parser_fasta_listener.dart b/pkg/analyzer/test/generated/parser_fasta_listener.dart
index 5b08f71..dd1a16f 100644
--- a/pkg/analyzer/test/generated/parser_fasta_listener.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_listener.dart
@@ -116,8 +116,8 @@
   }
 
   @override
-  void beginClassOrMixinBody(Token token) {
-    super.beginClassOrMixinBody(token);
+  void beginClassOrMixinBody(ClassKind kind, Token token) {
+    super.beginClassOrMixinBody(kind, token);
     begin('ClassOrMixinBody');
   }
 
@@ -623,9 +623,10 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     end('ClassOrMixinBody');
-    super.endClassOrMixinBody(memberCount, beginToken, endToken);
+    super.endClassOrMixinBody(kind, memberCount, beginToken, endToken);
   }
 
   @override
@@ -704,8 +705,9 @@
   }
 
   @override
-  void endExtensionDeclaration(Token onKeyword, Token token) {
-    super.endExtensionDeclaration(onKeyword, token);
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token token) {
+    super.endExtensionDeclaration(extensionKeyword, onKeyword, token);
     end('ExtensionDeclaration');
   }
 
@@ -762,11 +764,17 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     end('FormalParameter');
-    super.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, kind, memberKind);
+    super.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
+        initializerStart, initializerEnd, kind, memberKind);
   }
 
   @override
diff --git a/pkg/analyzer/test/generated/parser_fasta_test.dart b/pkg/analyzer/test/generated/parser_fasta_test.dart
index e67ca0b..9873beb 100644
--- a/pkg/analyzer/test/generated/parser_fasta_test.dart
+++ b/pkg/analyzer/test/generated/parser_fasta_test.dart
@@ -1018,6 +1018,17 @@
     ]);
   }
 
+  void test_constructor_super_cascade_synthetic() {
+    // https://github.com/dart-lang/sdk/issues/37110
+    parseCompilationUnit('class B extends A { B(): super.. {} }', errors: [
+      expectedError(ParserErrorCode.INVALID_SUPER_IN_INITIALIZER, 25, 5),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 30, 2),
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 33, 1),
+      expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 34, 1),
+      expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 36, 1),
+    ]);
+  }
+
   void test_constructor_super_field() {
     // https://github.com/dart-lang/sdk/issues/36262
     // https://github.com/dart-lang/sdk/issues/31198
@@ -1035,6 +1046,33 @@
         ]);
   }
 
+  void test_constructor_super_named_method() {
+    // https://github.com/dart-lang/sdk/issues/37600
+    parseCompilationUnit('class B extends A { B(): super.c().create() {} }',
+        errors: [
+          expectedError(ParserErrorCode.INVALID_SUPER_IN_INITIALIZER, 25, 5),
+        ]);
+  }
+
+  void test_constructor_super_named_method_method() {
+    // https://github.com/dart-lang/sdk/issues/37600
+    parseCompilationUnit('class B extends A { B(): super.c().create().x() {} }',
+        errors: [
+          expectedError(ParserErrorCode.INVALID_SUPER_IN_INITIALIZER, 25, 5),
+        ]);
+  }
+
+  void test_constructor_this_cascade_synthetic() {
+    // https://github.com/dart-lang/sdk/issues/37110
+    parseCompilationUnit('class B extends A { B(): this.. {} }', errors: [
+      expectedError(ParserErrorCode.MISSING_ASSIGNMENT_IN_INITIALIZER, 25, 4),
+      expectedError(ParserErrorCode.EXPECTED_TOKEN, 29, 2),
+      expectedError(ParserErrorCode.MISSING_IDENTIFIER, 32, 1),
+      expectedError(ParserErrorCode.MISSING_FUNCTION_BODY, 33, 1),
+      expectedError(ParserErrorCode.EXPECTED_EXECUTABLE, 35, 1),
+    ]);
+  }
+
   void test_constructor_this_field() {
     // https://github.com/dart-lang/sdk/issues/36262
     // https://github.com/dart-lang/sdk/issues/31198
@@ -1051,6 +1089,22 @@
     ]);
   }
 
+  void test_constructor_this_named_method() {
+    // https://github.com/dart-lang/sdk/issues/37600
+    parseCompilationUnit('class B extends A { B(): super.c().create() {} }',
+        errors: [
+          expectedError(ParserErrorCode.INVALID_SUPER_IN_INITIALIZER, 25, 5),
+        ]);
+  }
+
+  void test_constructor_this_named_method_field() {
+    // https://github.com/dart-lang/sdk/issues/37600
+    parseCompilationUnit('class B extends A { B(): super.c().create().x {} }',
+        errors: [
+          expectedError(ParserErrorCode.INVALID_SUPER_IN_INITIALIZER, 25, 5),
+        ]);
+  }
+
   @override
   void test_expectedListOrMapLiteral() {
     // The fasta parser returns an 'IntegerLiteralImpl' when parsing '1'.
@@ -1095,6 +1149,22 @@
         ]);
   }
 
+  void test_missing_closing_bracket_issue37528() {
+    final code = '\${foo';
+    createParser(code);
+    final result = fasta.scanString(code);
+    expect(result.hasErrors, isTrue);
+    var token = _parserProxy.fastaParser.syntheticPreviousToken(result.tokens);
+    try {
+      _parserProxy.fastaParser.parseExpression(token);
+      // TODO(danrubel): Replace this test once root cause is found
+      fail('exception expected');
+    } catch (e) {
+      var msg = e.toString();
+      expect(msg.contains('test_missing_closing_bracket_issue37528'), isTrue);
+    }
+  }
+
   void test_partialNamedConstructor() {
     parseCompilationUnit('class C { C. }', errors: [
       expectedError(ParserErrorCode.MISSING_IDENTIFIER, 13, 1),
@@ -1137,6 +1207,20 @@
     }
   }
 
+  void test_listLiteral_invalid_assert() {
+    // https://github.com/dart-lang/sdk/issues/37674
+    parseExpression('n=<.["\$assert',
+        errors: [
+          expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 3, 1),
+          expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 4, 1),
+          expectedError(ParserErrorCode.MISSING_IDENTIFIER, 7, 6),
+          expectedError(ParserErrorCode.EXPECTED_STRING_LITERAL, 7, 6),
+          expectedError(ScannerErrorCode.EXPECTED_TOKEN, 7, 1),
+          expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 12, 1),
+        ],
+        expectedEndOffset: 7);
+  }
+
   void test_listLiteral_spread_disabled() {
     ListLiteral list =
         parseExpression('[1, ...[2]]', featureSet: beforeUiAsCode, errors: [
@@ -1157,6 +1241,28 @@
     expect(first.value, 1);
   }
 
+  void test_lt_dot_bracket_quote() {
+    // https://github.com/dart-lang/sdk/issues/37674
+    ListLiteral list = parseExpression('<.["', errors: [
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 1, 1),
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 2, 1),
+      expectedError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 3, 1),
+      expectedError(ScannerErrorCode.EXPECTED_TOKEN, 4, 1),
+    ]);
+    expect(list.elements, hasLength(1));
+    StringLiteral first = list.elements[0];
+    expect(first.length, 1);
+  }
+
+  void test_lt_dot_listLiteral() {
+    // https://github.com/dart-lang/sdk/issues/37674
+    ListLiteral list = parseExpression('<.[]', errors: [
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 1, 1),
+      expectedError(ParserErrorCode.EXPECTED_TYPE_NAME, 2, 2),
+    ]);
+    expect(list.elements, hasLength(0));
+  }
+
   void test_mapLiteral() {
     SetOrMapLiteral map = parseExpression('{3: 6}');
     expect(map.constKeyword, isNull);
@@ -1627,6 +1733,16 @@
     expect((extension.extendedType as NamedType).name.name, 'C');
     expect(extension.members, hasLength(0));
   }
+
+  void test_void_type() {
+    var unit = parseCompilationUnit('extension E on void { }');
+    expect(unit.declarations, hasLength(1));
+    var extension = unit.declarations[0] as ExtensionDeclaration;
+    expect(extension.name.name, 'E');
+    expect(extension.onKeyword.lexeme, 'on');
+    expect((extension.extendedType as NamedType).name.name, 'void');
+    expect(extension.members, hasLength(0));
+  }
 }
 
 /**
@@ -2648,6 +2764,18 @@
     parseCompilationUnit('f() { var x = new Foo()!; }');
   }
 
+  void test_nullCheckOnIndex() {
+    // https://github.com/dart-lang/sdk/issues/37708
+    var unit = parseCompilationUnit('f() { obj![arg]; }');
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as IndexExpression;
+    var target = expression.target as PostfixExpression;
+    expect(target.operand.toSource(), 'obj');
+    expect(target.operator.lexeme, '!');
+  }
+
   void test_nullCheckOnLiteral_disabled() {
     parseCompilationUnit('f() { var x = 0!; }',
         errors: [expectedError(ParserErrorCode.EXPERIMENT_NOT_ENABLED, 15, 1)],
@@ -2689,6 +2817,18 @@
     parseCompilationUnit('f() { var x = null!; }');
   }
 
+  void test_nullCheckOnSend() {
+    // https://github.com/dart-lang/sdk/issues/37708
+    var unit = parseCompilationUnit('f() { obj!(arg); }');
+    var funct = unit.declarations[0] as FunctionDeclaration;
+    var body = funct.functionExpression.body as BlockFunctionBody;
+    var statement = body.block.statements[0] as ExpressionStatement;
+    var expression = statement.expression as FunctionExpressionInvocation;
+    var target = expression.function as PostfixExpression;
+    expect(target.operand.toSource(), 'obj');
+    expect(target.operator.lexeme, '!');
+  }
+
   void test_nullCheckOnSymbol() {
     // Issues like this should be caught during later analysis
     parseCompilationUnit('f() { var x = #seven!; }');
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index e038ca8..cca8618 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -261,7 +261,7 @@
    * visited.
    */
   void assertValid() {
-    if (!_errors.isEmpty) {
+    if (_errors.isNotEmpty) {
       StringBuffer buffer = new StringBuffer();
       buffer.write("Invalid AST structure:");
       for (String message in _errors) {
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index b20c4b5..1e77ec8 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -100,7 +100,7 @@
     delta.setAnalysisLevel(new TestSource(), AnalysisLevel.ALL);
     String result = delta.toString();
     expect(result, isNotNull);
-    expect(result.length > 0, isTrue);
+    expect(result.isNotEmpty, isTrue);
   }
 }
 
@@ -171,7 +171,7 @@
 @reflectiveTest
 class ErrorResolverTest extends DriverResolutionTest {
   test_breakLabelOnSwitchMember() async {
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 class A {
   void m(int i) {
     switch (i) {
@@ -187,7 +187,7 @@
   }
 
   test_continueLabelOnSwitch() async {
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 class A {
   void m(int i) {
     l: switch (i) {
@@ -275,6 +275,34 @@
         importedType);
   }
 
+  void test_extensions_imported() {
+    var context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
+
+    var extension = ElementFactory.extensionElement('test_extension');
+
+    var importedUnit1 = ElementFactory.compilationUnit('/imported1.dart');
+    importedUnit1.extensions = <ExtensionElement>[extension];
+
+    var importedLibraryName = 'imported_lib';
+    var importedLibrary = LibraryElementImpl(context, null, importedLibraryName,
+        0, importedLibraryName.length, false);
+    importedLibrary.definingCompilationUnit = importedUnit1;
+
+    var importingLibraryName = 'importing_lib';
+    var importingLibrary = LibraryElementImpl(context, null,
+        importingLibraryName, 0, importingLibraryName.length, false);
+    importingLibrary.definingCompilationUnit =
+        ElementFactory.compilationUnit('/importing.dart');
+
+    var importElement = ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    importingLibrary.imports = <ImportElement>[importElement];
+
+    expect(
+        LibraryImportScope(importingLibrary).extensions, contains(extension));
+  }
+
   void test_prefixedAndNonPrefixed() {
     AnalysisContext context = AnalysisContextFactory.contextWithCore(
         resourceProvider: resourceProvider);
@@ -336,6 +364,179 @@
             AstTestFactory.identifier3(importedTypeName), definingLibrary),
         importedType);
   }
+
+  void test_extensions() {
+    ExtensionElement extension =
+        ElementFactory.extensionElement('test_extension');
+
+    CompilationUnitElementImpl compilationUnit =
+        ElementFactory.compilationUnit('/test.dart');
+    compilationUnit.extensions = <ExtensionElement>[extension];
+
+    String libraryName = 'lib';
+    LibraryElementImpl library = new LibraryElementImpl(
+        null, null, libraryName, 0, libraryName.length, false);
+    library.definingCompilationUnit = compilationUnit;
+
+    expect(LibraryScope(library).extensions, contains(extension));
+  }
+
+  void test_extensions_imported() {
+    var context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
+
+    var importedUnit1 = ElementFactory.compilationUnit('/imported1.dart');
+    var importedExtension = ElementFactory.extensionElement('test_extension');
+    var unnamedImportedExtension = ElementFactory.extensionElement();
+    importedUnit1.extensions = [importedExtension, unnamedImportedExtension];
+
+    var importedLibraryName = 'imported_lib';
+    var importedLibrary = LibraryElementImpl(context, null, importedLibraryName,
+        0, importedLibraryName.length, false);
+    importedLibrary.definingCompilationUnit = importedUnit1;
+
+    var importingLibraryName = 'importing_lib';
+    var importingLibrary = LibraryElementImpl(context, null,
+        importingLibraryName, 0, importingLibraryName.length, false);
+
+    var localExtension = ElementFactory.extensionElement('test_extension');
+
+    var importingUnit = ElementFactory.compilationUnit('/importing.dart');
+    importingUnit.extensions = [localExtension];
+    importingLibrary.definingCompilationUnit = importingUnit;
+
+    var importElement = ImportElementImpl(0);
+    importElement.importedLibrary = importedLibrary;
+    importingLibrary.imports = [importElement];
+
+    var libraryExtensions = LibraryScope(importingLibrary).extensions;
+
+    expect(libraryExtensions, contains(localExtension));
+    expect(libraryExtensions, contains(importedExtension));
+    expect(libraryExtensions, isNot(contains(unnamedImportedExtension)));
+  }
+
+  /// Ensure that if a library L1 defines an extension E, L2 exports L1, and L3
+  /// imports L2, then E is included in the list.
+  void test_extensions_imported_chain() {
+    var context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
+
+    var unit1 = ElementFactory.compilationUnit('/unit1.dart');
+    var ext1 = ElementFactory.extensionElement('ext1');
+    unit1.extensions = [ext1];
+
+    var lib1Name = 'lib1';
+    var lib1 =
+        LibraryElementImpl(context, null, lib1Name, 0, lib1Name.length, false);
+    lib1.definingCompilationUnit = unit1;
+
+    var unit2 = ElementFactory.compilationUnit('/unit2.dart');
+
+    var lib2Name = 'lib2';
+    var lib2 =
+        LibraryElementImpl(context, null, lib2Name, 0, lib2Name.length, false);
+    lib2.definingCompilationUnit = unit2;
+
+    var lib1Export = ExportElementImpl(0);
+    lib1Export.exportedLibrary = lib1;
+    lib2.exports = [lib1Export];
+
+    var importingLibraryName = 'importing_lib';
+    var importingLibrary = LibraryElementImpl(context, null,
+        importingLibraryName, 0, importingLibraryName.length, false);
+
+    var importingUnit = ElementFactory.compilationUnit('/importing.dart');
+    importingLibrary.definingCompilationUnit = importingUnit;
+
+    var lib2Import = ImportElementImpl(0);
+    lib2Import.importedLibrary = lib2;
+    importingLibrary.imports = [lib2Import];
+
+    var libraryExtensions = LibraryScope(importingLibrary).extensions;
+
+    expect(libraryExtensions, orderedEquals([ext1]));
+  }
+
+  /// Ensure that if there are two extensions with the same name that are
+  /// imported from different libraries that they are both in the list of
+  /// extensions.
+  void test_extensions_imported_same_name() {
+    var context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
+
+    var sharedExtensionName = 'test_ext';
+
+    var unit1 = ElementFactory.compilationUnit('/unit1.dart');
+    var ext1 = ElementFactory.extensionElement(sharedExtensionName);
+    unit1.extensions = [ext1];
+
+    var lib1Name = 'lib1';
+    var lib1 =
+        LibraryElementImpl(context, null, lib1Name, 0, lib1Name.length, false);
+    lib1.definingCompilationUnit = unit1;
+
+    var unit2 = ElementFactory.compilationUnit('/unit2.dart');
+    var ext2 = ElementFactory.extensionElement(sharedExtensionName);
+    unit2.extensions = [ext2];
+
+    var lib2Name = 'lib2';
+    var lib2 =
+        LibraryElementImpl(context, null, lib2Name, 0, lib2Name.length, false);
+    lib2.definingCompilationUnit = unit2;
+
+    var importingLibraryName = 'importing_lib';
+    var importingLibrary = LibraryElementImpl(context, null,
+        importingLibraryName, 0, importingLibraryName.length, false);
+
+    var importingUnit = ElementFactory.compilationUnit('/importing.dart');
+    importingLibrary.definingCompilationUnit = importingUnit;
+
+    var importElement1 = ImportElementImpl(0);
+    importElement1.importedLibrary = lib1;
+    var importElement2 = ImportElementImpl(0);
+    importElement2.importedLibrary = lib2;
+    importingLibrary.imports = [importElement1, importElement2];
+
+    var libraryExtensions = LibraryScope(importingLibrary).extensions;
+
+    expect(libraryExtensions, contains(ext1));
+    expect(libraryExtensions, contains(ext2));
+  }
+
+  /// Ensure that if there are two imports for the same library that the
+  /// imported extension is only in the list one time.
+  void test_extensions_imported_twice() {
+    var context = AnalysisContextFactory.contextWithCore(
+        resourceProvider: resourceProvider);
+
+    var sharedExtensionName = 'test_ext';
+
+    var unit1 = ElementFactory.compilationUnit('/unit1.dart');
+    var ext1 = ElementFactory.extensionElement(sharedExtensionName);
+    unit1.extensions = [ext1];
+
+    var lib1Name = 'lib1';
+    var lib1 =
+        LibraryElementImpl(context, null, lib1Name, 0, lib1Name.length, false);
+    lib1.definingCompilationUnit = unit1;
+
+    var importingLibraryName = 'importing_lib';
+    var importingLibrary = LibraryElementImpl(context, null,
+        importingLibraryName, 0, importingLibraryName.length, false);
+
+    var importingUnit = ElementFactory.compilationUnit('/importing.dart');
+    importingLibrary.definingCompilationUnit = importingUnit;
+
+    var importElement1 = ImportElementImpl(0);
+    importElement1.importedLibrary = lib1;
+    var importElement2 = ImportElementImpl(0);
+    importElement2.importedLibrary = lib1;
+    importingLibrary.imports = [importElement1, importElement2];
+
+    var libraryExtensions = LibraryScope(importingLibrary).extensions;
+    expect(libraryExtensions, orderedEquals([ext1]));
+  }
 }
 
 @reflectiveTest
@@ -545,7 +746,7 @@
    * Assert that all of the visited nodes have a static type associated with them.
    */
   void assertResolved() {
-    if (!_unresolvedExpressions.isEmpty || !_unresolvedTypes.isEmpty) {
+    if (_unresolvedExpressions.isNotEmpty || _unresolvedTypes.isNotEmpty) {
       StringBuffer buffer = new StringBuffer();
       int unresolvedTypeCount = _unresolvedTypes.length;
       if (unresolvedTypeCount > 0) {
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index b0bb6d4..9c5ba4f 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -73,15 +73,15 @@
    * Assert that all of the visited identifiers were resolved.
    */
   void assertResolved() {
-    if (!_unresolvedNodes.isEmpty || !_wrongTypedNodes.isEmpty) {
+    if (_unresolvedNodes.isNotEmpty || _wrongTypedNodes.isNotEmpty) {
       StringBuffer buffer = new StringBuffer();
-      if (!_unresolvedNodes.isEmpty) {
+      if (_unresolvedNodes.isNotEmpty) {
         buffer.write("Failed to resolve ");
         buffer.write(_unresolvedNodes.length);
         buffer.writeln(" nodes:");
         _printNodes(buffer, _unresolvedNodes);
       }
-      if (!_wrongTypedNodes.isEmpty) {
+      if (_wrongTypedNodes.isNotEmpty) {
         buffer.write("Resolved ");
         buffer.write(_wrongTypedNodes.length);
         buffer.writeln(" to the wrong type of element:");
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index 36b6c24..cbde330 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -11,7 +11,7 @@
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -490,7 +490,7 @@
         _resolvedVariable(_typeProvider.doubleType, 'd'),
         TokenType.QUESTION_QUESTION_EQ,
         _resolvedInteger(0));
-    expect(_analyze(node), same(_typeProvider.numType));
+    expect(_analyze(node), _typeProvider.numType);
     _listener.assertNoErrors();
   }
 
@@ -549,7 +549,7 @@
     // 1 ?? 1.5
     Expression node = AstTestFactory.binaryExpression(
         _resolvedInteger(1), TokenType.QUESTION_QUESTION, _resolvedDouble(1.5));
-    expect(_analyze(node), same(_typeProvider.numType));
+    expect(_analyze(node), _typeProvider.numType);
     _listener.assertNoErrors();
   }
 
@@ -619,11 +619,13 @@
     MethodElement operator =
         ElementFactory.methodElement("*", typeA, [_typeProvider.doubleType]);
     classA.methods = <MethodElement>[operator];
+
+    var asExpression = AstTestFactory.asExpression(
+        AstTestFactory.identifier3("a"), AstTestFactory.typeName(classA));
+    asExpression.staticType = typeA;
+
     BinaryExpressionImpl node = AstTestFactory.binaryExpression(
-        AstTestFactory.asExpression(
-            AstTestFactory.identifier3("a"), AstTestFactory.typeName(classA)),
-        TokenType.PLUS,
-        _resolvedDouble(2.0));
+        asExpression, TokenType.PLUS, _resolvedDouble(2.0));
     node.staticElement = operator;
     node.staticInvokeType = node.staticElement.type;
     expect(_analyze(node), same(typeA));
@@ -667,7 +669,7 @@
         AstTestFactory.booleanLiteral(true),
         _resolvedDouble(1.0),
         _resolvedInteger(0));
-    expect(_analyze(node), same(_typeProvider.numType));
+    expect(_analyze(node), _typeProvider.numType);
     _listener.assertNoErrors();
   }
 
@@ -1523,7 +1525,7 @@
       context = AnalysisContextFactory.contextWithCore(
           resourceProvider: resourceProvider);
     }
-    var inheritance = new InheritanceManager2(context.typeSystem);
+    var inheritance = new InheritanceManager3(context.typeSystem);
     Source source = new FileSource(getFile("/lib.dart"));
     CompilationUnitElementImpl definingCompilationUnit =
         new CompilationUnitElementImpl();
diff --git a/pkg/analyzer/test/generated/static_warning_code_test.dart b/pkg/analyzer/test/generated/static_warning_code_test.dart
index 3ace484..2db6cba 100644
--- a/pkg/analyzer/test/generated/static_warning_code_test.dart
+++ b/pkg/analyzer/test/generated/static_warning_code_test.dart
@@ -2,14 +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 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/src/error/codes.dart';
-import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../src/dart/resolution/driver_resolution.dart';
-import 'test_support.dart';
 
 main() {
   defineReflectiveSuite(() {
@@ -19,1084 +15,6 @@
 
 @reflectiveTest
 class StaticWarningCodeTest extends DriverResolutionTest {
-  test_ambiguousImport_as() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-f(p) {p as N;}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 51, 1),
-    ]);
-  }
-
-  test_ambiguousImport_dart() async {
-    await assertErrorsInCode('''
-import 'dart:async';
-import 'dart:async2';
-
-Future v;
-''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 44, 6),
-    ]);
-  }
-
-  test_ambiguousImport_extends() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-class A extends N {}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 56, 1),
-      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 56, 1),
-    ]);
-  }
-
-  test_ambiguousImport_implements() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-class A implements N {}''', [
-      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 59, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 59, 1),
-    ]);
-  }
-
-  test_ambiguousImport_inPart() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}
-''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}
-''');
-    newFile('/test/lib/part.dart', content: '''
-part of lib;
-class A extends N {}
-''');
-    newFile('/test/lib/lib.dart', content: '''
-library lib;
-import 'lib1.dart';
-import 'lib2.dart';
-part 'part.dart';
-''');
-    ResolvedUnitResult libResult =
-        await resolveFile(convertPath('/test/lib/lib.dart'));
-    ResolvedUnitResult partResult =
-        await resolveFile(convertPath('/test/lib/part.dart'));
-    expect(libResult.errors, hasLength(0));
-    new GatheringErrorListener()
-      ..addAll(partResult.errors)
-      ..assertErrors([
-        error(StaticWarningCode.AMBIGUOUS_IMPORT, 29, 1),
-        error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 29, 1),
-      ]);
-  }
-
-  test_ambiguousImport_instanceCreation() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-library L;
-import 'lib1.dart';
-import 'lib2.dart';
-f() {new N();}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 60, 1),
-    ]);
-  }
-
-  test_ambiguousImport_is() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-f(p) {p is N;}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 51, 1),
-    ]);
-  }
-
-  test_ambiguousImport_qualifier() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-g() { N.FOO; }''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 46, 1),
-    ]);
-  }
-
-  test_ambiguousImport_typeAnnotation() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-typedef N FT(N p);
-N f(N p) {
-  N v;
-  return null;
-}
-class A {
-  N m() { return null; }
-}
-class B<T extends N> {}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 48, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 53, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 59, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 63, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 72, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 74, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 106, 1),
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 149, 1),
-    ]);
-  }
-
-  test_ambiguousImport_typeArgument_annotation() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-class A<T> {}
-A<N> f() { return null; }''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 56, 1),
-    ]);
-  }
-
-  test_ambiguousImport_typeArgument_instanceCreation() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-class N {}''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-class N {}''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-class A<T> {}
-f() {new A<N>();}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 65, 1),
-    ]);
-  }
-
-  test_ambiguousImport_varRead() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-var v;''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-var v;''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-f() { g(v); }
-g(p) {}''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 48, 1),
-    ]);
-  }
-
-  test_ambiguousImport_varWrite() async {
-    newFile("/test/lib/lib1.dart", content: '''
-library lib1;
-var v;''');
-    newFile("/test/lib/lib2.dart", content: '''
-library lib2;
-var v;''');
-    await assertErrorsInCode('''
-import 'lib1.dart';
-import 'lib2.dart';
-f() { v = 0; }''', [
-      error(StaticWarningCode.AMBIGUOUS_IMPORT, 46, 1),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_ambiguousClassName() async {
-    // See dartbug.com/19624
-    newFile("/test/lib/lib2.dart", content: '''
-class _A {}
-g(h(_A a)) {}''');
-    await assertErrorsInCode('''
-import 'lib2.dart';
-class _A {}
-f() {
-  g((_A a) {});
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 42, 9),
-    ]);
-    // The name _A is private to the library it's defined in, so this is a type
-    // mismatch. Furthermore, the error message should mention both _A and the
-    // filenames so the user can figure out what's going on.
-    String message = result.errors[0].message;
-    expect(message.indexOf("_A") >= 0, isTrue);
-  }
-
-  test_argumentTypeNotAssignable_annotation_namedConstructor() async {
-    await assertErrorsInCode('''
-class A {
-  const A.fromInt(int p);
-}
-@A.fromInt('0')
-main() {
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 49, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_annotation_unnamedConstructor() async {
-    await assertErrorsInCode('''
-class A {
-  const A(int p);
-}
-@A('0')
-main() {
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 33, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_binary() async {
-    await assertErrorsInCode('''
-class A {
-  operator +(int p) {}
-}
-f(A a) {
-  a + '0';
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_call() async {
-    await assertErrorsInCode('''
-typedef bool Predicate<T>(T object);
-
-Predicate<String> f() => null;
-
-void main() {
-  f().call(3);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 95, 1),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_cascadeSecond() async {
-    await assertErrorsInCode('''
-// filler filler filler filler filler filler filler filler filler filler
-class A {
-  B ma() { return new B(); }
-}
-class B {
-  mb(String p) {}
-}
-
-main() {
-  A a = new A();
-  a..  ma().mb(0);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 186, 1),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_const() async {
-    await assertErrorsInCode('''
-class A {
-  const A(String p);
-}
-main() {
-  const A(42);
-}''', [
-      error(
-          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
-          52,
-          2),
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_const_super() async {
-    await assertErrorsInCode('''
-class A {
-  const A(String p);
-}
-class B extends A {
-  const B() : super(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 73, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_functionExpressionInvocation_required() async {
-    await assertErrorsInCode('''
-main() {
-  (int x) {} ('');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_index() async {
-    await assertErrorsInCode('''
-class A {
-  operator [](int index) {}
-}
-f(A a) {
-  a['0'];
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 53, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_callParameter() async {
-    await assertErrorsInCode('''
-class A {
-  call(int p) {}
-}
-f(A a) {
-  a('0');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 42, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_callVariable() async {
-    await assertErrorsInCode('''
-class A {
-  call(int p) {}
-}
-main() {
-  A a = new A();
-  a('0');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 59, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_functionParameter() async {
-    await assertErrorsInCode('''
-a(b(int p)) {
-  b('0');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 18, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_functionParameter_generic() async {
-    await assertErrorsInCode('''
-class A<K, V> {
-  m(f(K k), V v) {
-    f(v);
-  }
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_functionTypes_optional() async {
-    await assertErrorsInCode('''
-void acceptFunNumOptBool(void funNumOptBool([bool b])) {}
-void funNumBool(bool b) {}
-main() {
-  acceptFunNumOptBool(funNumBool);
-}''', [
-      error(StrongModeCode.INVALID_CAST_FUNCTION, 116, 10),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_generic() async {
-    await assertErrorsInCode('''
-class A<T> {
-  m(T t) {}
-}
-f(A<String> a) {
-  a.m(1);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_named() async {
-    await assertErrorsInCode('''
-f({String p}) {}
-main() {
-  f(p: 42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 30, 5),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_optional() async {
-    await assertErrorsInCode('''
-f([String p]) {}
-main() {
-  f(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 30, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_required() async {
-    await assertErrorsInCode('''
-f(String p) {}
-main() {
-  f(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 28, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_typedef_generic() async {
-    await assertErrorsInCode('''
-typedef A<T>(T p);
-f(A<int> a) {
-  a('1');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 37, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_typedef_local() async {
-    await assertErrorsInCode('''
-typedef A(int p);
-A getA() => null;
-main() {
-  A a = getA();
-  a('1');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 65, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_invocation_typedef_parameter() async {
-    await assertErrorsInCode('''
-typedef A(int p);
-f(A a) {
-  a('1');
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 3),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_new_generic() async {
-    await assertErrorsInCode('''
-class A<T> {
-  A(T p) {}
-}
-main() {
-  new A<String>(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_new_optional() async {
-    await assertErrorsInCode('''
-class A {
-  A([String p]) {}
-}
-main() {
-  new A(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 48, 2),
-    ]);
-  }
-
-  test_argumentTypeNotAssignable_new_required() async {
-    await assertErrorsInCode('''
-class A {
-  A(String p) {}
-}
-main() {
-  new A(42);
-}''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 46, 2),
-    ]);
-  }
-
-  @failingTest
-  test_argumentTypeNotAssignable_tearOff_required() async {
-    await assertErrorsInCode('''
-class C {
-  Object/*=T*/ f/*<T>*/(Object/*=T*/ x) => x;
-}
-g(C c) {
-  var h = c.f/*<int>*/;
-  print(h('s'));
-}
-''', [
-      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 99, 1),
-    ]);
-  }
-
-  test_assignmentToClass() async {
-    await assertErrorsInCode('''
-class C {}
-main() {
-  C = null;
-}
-''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 22, 1),
-    ]);
-  }
-
-  test_assignmentToConst_instanceVariable() async {
-    await assertErrorsInCode('''
-class A {
-  static const v = 0;
-}
-f() {
-  A.v = 1;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 42, 3),
-    ]);
-  }
-
-  test_assignmentToConst_instanceVariable_plusEq() async {
-    await assertErrorsInCode('''
-class A {
-  static const v = 0;
-}
-f() {
-  A.v += 1;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 42, 3),
-    ]);
-  }
-
-  test_assignmentToConst_localVariable() async {
-    await assertErrorsInCode('''
-f() {
-  const x = 0;
-  x = 1;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
-    ]);
-  }
-
-  test_assignmentToConst_localVariable_plusEq() async {
-    await assertErrorsInCode('''
-f() {
-  const x = 0;
-  x += 1;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
-    ]);
-  }
-
-  test_assignmentToEnumType() async {
-    await assertErrorsInCode('''
-enum E { e }
-main() {
-  E = null;
-}
-''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 24, 1),
-    ]);
-  }
-
-  test_assignmentToFinal_instanceVariable() async {
-    await assertErrorsInCode('''
-class A {
-  final v = 0;
-}
-f() {
-  A a = new A();
-  a.v = 1;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL, 54, 1),
-    ]);
-  }
-
-  test_assignmentToFinal_instanceVariable_plusEq() async {
-    await assertErrorsInCode('''
-class A {
-  final v = 0;
-}
-f() {
-  A a = new A();
-  a.v += 1;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL, 54, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_localVariable() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x = 1;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_localVariable_plusEq() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x += 1;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_parameter() async {
-    await assertErrorsInCode('''
-f(final x) {
-  x = 1;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 15, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_postfixMinusMinus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x--;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_postfixPlusPlus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x++;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_prefixMinusMinus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  --x;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 25, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_prefixPlusPlus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  ++x;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 25, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_suffixMinusMinus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x--;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_suffixPlusPlus() async {
-    await assertErrorsInCode('''
-f() {
-  final x = 0;
-  x++;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
-    ]);
-  }
-
-  test_assignmentToFinalLocal_topLevelVariable() async {
-    await assertErrorsInCode('''
-final x = 0;
-f() { x = 1; }''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 19, 1),
-    ]);
-  }
-
-  test_assignmentToFinalNoSetter_prefixedIdentifier() async {
-    await assertErrorsInCode('''
-class A {
-  int get x => 0;
-}
-main() {
-  A a = new A();
-  a.x = 0;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, 60, 1),
-    ]);
-  }
-
-  test_assignmentToFinalNoSetter_propertyAccess() async {
-    await assertErrorsInCode('''
-class A {
-  int get x => 0;
-}
-class B {
-  static A a;
-}
-main() {
-  B.a.x = 0;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, 71, 1),
-    ]);
-  }
-
-  test_assignmentToFunction() async {
-    await assertErrorsInCode('''
-f() {}
-main() {
-  f = null;
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_FUNCTION, 18, 1),
-    ]);
-  }
-
-  test_assignmentToMethod() async {
-    await assertErrorsInCode('''
-class A {
-  m() {}
-}
-f(A a) {
-  a.m = () {};
-}''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_METHOD, 32, 3),
-    ]);
-  }
-
-  test_assignmentToTypedef() async {
-    await assertErrorsInCode('''
-typedef void F();
-main() {
-  F = null;
-}
-''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 29, 1),
-    ]);
-  }
-
-  test_assignmentToTypeParameter() async {
-    await assertErrorsInCode('''
-class C<T> {
-  f() {
-    T = null;
-  }
-}
-''', [
-      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 25, 1),
-    ]);
-  }
-
-  test_caseBlockNotTerminated() async {
-    await assertErrorsInCode('''
-f(int p) {
-  switch (p) {
-    case 0:
-      f(p);
-    case 1:
-      break;
-  }
-}''', [
-      error(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, 30, 4),
-    ]);
-  }
-
-  test_castToNonType() async {
-    await assertErrorsInCode('''
-var A = 0;
-f(String s) { var x = s as A; }''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 29, 1),
-      error(StaticWarningCode.CAST_TO_NON_TYPE, 38, 1),
-    ]);
-  }
-
-  test_concreteClassWithAbstractMember() async {
-    await assertErrorsInCode('''
-class A {
-  m();
-}''', [
-      error(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 12, 4),
-    ]);
-  }
-
-  test_concreteClassWithAbstractMember_noSuchMethod_interface() async {
-    await assertErrorsInCode('''
-class I {
-  noSuchMethod(v) => '';
-}
-class A implements I {
-  m();
-}''', [
-      error(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 62, 4),
-    ]);
-  }
-
-  test_constWithAbstractClass() async {
-    await assertErrorsInCode('''
-abstract class A {
-  const A();
-}
-void f() {
-  A a = const A();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 49, 1),
-      error(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, 59, 1),
-    ]);
-  }
-
-  test_constWithAbstractClass_generic() async {
-    await assertErrorsInCode('''
-abstract class A<E> {
-  const A();
-}
-void f() {
-  var a = const A<int>();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 54, 1),
-      error(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, 64, 6),
-    ]);
-
-    ClassDeclaration classA = result.unit.declarations[0];
-    FunctionDeclaration f = result.unit.declarations[1];
-    BlockFunctionBody body = f.functionExpression.body;
-    VariableDeclarationStatement a = body.block.statements[0];
-    InstanceCreationExpression init = a.variables.variables[0].initializer;
-    expect(init.staticType,
-        classA.declaredElement.type.instantiate([typeProvider.intType]));
-  }
-
-  test_exportDuplicatedLibraryNamed() async {
-    newFile("/test/lib/lib1.dart", content: "library lib;");
-    newFile("/test/lib/lib2.dart", content: "library lib;");
-    await assertErrorsInCode('''
-library test;
-export 'lib1.dart';
-export 'lib2.dart';''', [
-      error(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED, 34, 19),
-    ]);
-  }
-
-  test_extraPositionalArguments() async {
-    await assertErrorsInCode('''
-f() {}
-main() {
-  f(0, 1, '2');
-}''', [
-      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS, 19, 11),
-    ]);
-  }
-
-  test_extraPositionalArguments_functionExpression() async {
-    await assertErrorsInCode('''
-main() {
-  (int x) {} (0, 1);
-}''', [
-      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS, 22, 6),
-    ]);
-  }
-
-  test_extraPositionalArgumentsCouldBeNamed() async {
-    await assertErrorsInCode('''
-f({x, y}) {}
-main() {
-  f(0, 1, '2');
-}''', [
-      error(
-          StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 25, 11),
-    ]);
-  }
-
-  test_extraPositionalArgumentsCouldBeNamed_functionExpression() async {
-    await assertErrorsInCode('''
-main() {
-  (int x, {int y}) {} (0, 1);
-}''', [
-      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 31, 6),
-    ]);
-  }
-
-  test_fieldInitializedInInitializerAndDeclaration_final() async {
-    await assertErrorsInCode('''
-class A {
-  final int x = 0;
-  A() : x = 1 {}
-}''', [
-      error(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
-          37, 1),
-    ]);
-  }
-
-  test_fieldInitializerNotAssignable() async {
-    await assertErrorsInCode('''
-class A {
-  int x;
-  A() : x = '';
-}''', [
-      error(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 31, 2),
-    ]);
-  }
-
-  test_fieldInitializingFormalNotAssignable() async {
-    await assertErrorsInCode('''
-class A {
-  int x;
-  A(String this.x) {}
-}''', [
-      error(StrongModeCode.INVALID_PARAMETER_DECLARATION, 23, 13),
-      error(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 23, 13),
-    ]);
-  }
-
-  /**
-   * This test doesn't test the FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR code, but tests the
-   * FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION code instead. It is provided here to show
-   * coverage over all of the permutations of initializers in constructor declarations.
-   *
-   * Note: FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION covers a subset of
-   * FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR, since it more specific, we use it instead of
-   * the broader code
-   */
-  test_finalInitializedInDeclarationAndConstructor_initializers() async {
-    await assertErrorsInCode('''
-class A {
-  final x = 0;
-  A() : x = 0 {}
-}''', [
-      error(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
-          33, 1),
-    ]);
-  }
-
-  test_finalInitializedInDeclarationAndConstructor_initializingFormal() async {
-    await assertErrorsInCode('''
-class A {
-  final x = 0;
-  A(this.x) {}
-}''', [
-      error(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
-          34, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_inConstructor_1() async {
-    await assertErrorsInCode('''
-class A {
-  final int x;
-  A() {}
-}''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1, 27, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_inConstructor_2() async {
-    await assertErrorsInCode('''
-class A {
-  final int a;
-  final int b;
-  A() {}
-}''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2, 42, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_inConstructor_3() async {
-    await assertErrorsInCode('''
-class A {
-  final int a;
-  final int b;
-  final int c;
-  A() {}
-}''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS, 57, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_instanceField_final() async {
-    await assertErrorsInCode('''
-class A {
-  final F;
-}''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 18, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_instanceField_final_static() async {
-    await assertErrorsInCode('''
-class A {
-  static final F;
-}''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 25, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_library_final() async {
-    await assertErrorsInCode('''
-final F;
-''', [
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 6, 1),
-    ]);
-  }
-
-  test_finalNotInitialized_local_final() async {
-    await assertErrorsInCode('''
-f() {
-  final int x;
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
-      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 18, 1),
-    ]);
-  }
-
   test_functionWithoutCall_direct() async {
     await assertNoErrorsInCode('''
 class A implements Function {
@@ -1151,1185 +69,6 @@
 class B = Object with A;''');
   }
 
-  test_generalizedVoid_andVoidLhsError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x && true;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
-    ]);
-  }
-
-  test_generalizedVoid_andVoidRhsError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  true && x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 34, 1),
-    ]);
-  }
-
-  test_generalizedVoid_assignmentToVoidParameterOk() async {
-    // Note: the spec may decide to disallow this, but at this point that seems
-    // highly unlikely.
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  f(x);
-}
-void f(void x) {}
-''');
-  }
-
-  test_generalizedVoid_assignToVoid_notStrong_error() async {
-    // See StrongModeStaticTypeAnalyzer2Test.test_generalizedVoid_assignToVoidOk
-    // for testing that this does not have errors in strong mode.
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  x = 42;
-}
-''');
-  }
-
-  test_generalizedVoid_interpolateVoidValueError() async {
-    await assertErrorsInCode(r'''
-void main() {
-  void x;
-  "$x";
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 1),
-    ]);
-  }
-
-  test_generalizedVoid_negateVoidValueError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  !x;
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 1),
-    ]);
-  }
-
-  test_generalizedVoid_orVoidLhsError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x || true;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
-    ]);
-  }
-
-  test_generalizedVoid_orVoidRhsError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  false || x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 35, 1),
-    ]);
-  }
-
-  test_generalizedVoid_throwVoidValueError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  throw x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 32, 1),
-    ]);
-  }
-
-  test_generalizedVoid_unaryNegativeVoidValueError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  -x;
-}
-''', [
-      // TODO(mfairhurst) suppress UNDEFINED_OPERATOR
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
-      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 26, 1),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfInForeachIterableError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  for (var v in x) {}
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 35, 1),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidAsIndexAssignError() async {
-    await assertErrorsInCode('''
-void main(List list) {
-  void x;
-  list[x] = null;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidAsIndexError() async {
-    await assertErrorsInCode('''
-void main(List list) {
-  void x;
-  list[x];
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidAssignedToDynamicError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  dynamic z = x;
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 34, 1),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 38, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidByIndexingError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x[0];
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 3),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidCallSetterError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x.foo = null;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 3),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidCastsOk() async {
-    await assertNoErrorsInCode('''
-void use(dynamic x) { }
-void main() {
-  void x;
-  use(x as int);
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInConditionalConditionError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x ? null : null;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
-    ]);
-  }
-
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalLhsError() async {
-    // TODO(mfairhurst) Enable this.
-    await assertErrorsInCode('''
-void main(bool c) {
-  void x;
-  c ? x : null;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 36, 1),
-    ]);
-  }
-
-  @failingTest
-  test_generalizedVoid_useOfVoidInConditionalRhsError() async {
-    // TODO(mfairhurst) Enable this.
-    await assertErrorsInCode('''
-void main(bool c) {
-  void x;
-  c ? null : x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 43, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInDoWhileConditionError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  do {} while (x);
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 39, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInExpStmtOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  x;
-}
-''');
-  }
-
-  @failingTest // This test may be completely invalid.
-  test_generalizedVoid_useOfVoidInForeachVariableError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  for (x in [1, 2]) {}
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 31, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInForPartsOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  for (x; false; x) {}
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInIsTestError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x is int;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInListLiteralError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  <dynamic>[x];
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 36, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInListLiteralOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  <void>[x]; // not strong mode; we have to specify <void>.
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInMapLiteralKeyError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  var m2 = <dynamic, int>{x : 4};
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 2),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 50, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInMapLiteralKeyOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  var m2 = <void, int>{x : 4}; // not strong mode; we have to specify <void>.
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInMapLiteralValueError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  var m1 = <int, dynamic>{4: x};
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 2),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 53, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInMapLiteralValueOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  var m1 = <int, void>{4: x}; // not strong mode; we have to specify <void>.
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInNullOperatorLhsError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x ?? 499;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInNullOperatorRhsOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  null ?? x;
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidInSpecialAssignmentError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x += 1;
-}
-''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 2),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInSwitchExpressionError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  switch(x) {}
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 33, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidInWhileConditionError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  while (x) {};
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 33, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidNullPropertyAccessError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x?.foo;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 29, 3),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidPropertyAccessError() async {
-    await assertErrorsInCode('''
-void main() {
-  void x;
-  x.foo;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 3),
-    ]);
-  }
-
-  @failingTest
-  test_generalizedVoid_useOfVoidReturnInNonVoidFunctionError() async {
-    // TODO(mfairhurst) Get this test to pass once codebase is compliant.
-    await assertErrorsInCode('''
-dynamic main() {
-  void x;
-  return x;
-}
-''', [
-      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, 36, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidReturnInVoidFunctionOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  return x;
-}
-''');
-  }
-
-  test_generalizedVoid_useOfVoidWhenArgumentError() async {
-    await assertErrorsInCode('''
-void use(dynamic x) { }
-void main() {
-  void x;
-  use(x);
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 54, 1),
-    ]);
-  }
-
-  test_generalizedVoid_useOfVoidWithInitializerOk() async {
-    await assertNoErrorsInCode('''
-void main() {
-  void x;
-  void y = x;
-}
-''');
-  }
-
-  test_generalizedVoid_yieldStarVoid_asyncStar() async {
-    await assertErrorsInCode('''
-main(void x) async* {
-  yield* x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 31, 1),
-    ]);
-  }
-
-  test_generalizedVoid_yieldStarVoid_syncStar() async {
-    await assertErrorsInCode('''
-main(void x) sync* {
-  yield* x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 30, 1),
-    ]);
-  }
-
-  test_generalizedVoid_yieldVoid_asyncStar() async {
-    await assertErrorsInCode('''
-main(void x) async* {
-  yield x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 30, 1),
-    ]);
-  }
-
-  test_generalizedVoid_yieldVoid_syncStar() async {
-    await assertErrorsInCode('''
-main(void x) sync* {
-  yield x;
-}
-''', [
-      error(StaticWarningCode.USE_OF_VOID_RESULT, 29, 1),
-    ]);
-  }
-
-  test_importDuplicatedLibraryNamed() async {
-    newFile("/test/lib/lib1.dart", content: "library lib;");
-    newFile("/test/lib/lib2.dart", content: "library lib;");
-    assertErrorsInCode('''
-library test;
-import 'lib1.dart';
-import 'lib2.dart';''', [
-      error(HintCode.UNUSED_IMPORT, 21, 11),
-      error(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, 34, 19),
-      error(HintCode.UNUSED_IMPORT, 41, 11),
-    ]);
-  }
-
-  test_importOfNonLibrary() async {
-    newFile("/test/lib/lib1.dart", content: '''
-part of lib;
-class A {}''');
-    assertErrorsInCode('''
-library lib;
-import 'lib1.dart' deferred as p;
-var a = new p.A();''', [
-      error(StaticWarningCode.IMPORT_OF_NON_LIBRARY, 20, 11),
-    ]);
-  }
-
-  test_invalidGetterOverrideReturnType() async {
-    await assertErrorsInCode('''
-class A {
-  int get g { return 0; }
-}
-class B extends A {
-  String get g { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 60, 28),
-    ]);
-  }
-
-  test_invalidGetterOverrideReturnType_implicit() async {
-    await assertErrorsInCode('''
-class A {
-  String f;
-}
-class B extends A {
-  int f;
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 46, 5),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 46, 5),
-    ]);
-  }
-
-  test_invalidGetterOverrideReturnType_twoInterfaces() async {
-    // test from language/override_inheritance_field_test_11.dart
-    await assertErrorsInCode('''
-abstract class I {
-  int get getter => null;
-}
-abstract class J {
-  num get getter => null;
-}
-abstract class A implements I, J {}
-class B extends A {
-  String get getter => null;
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 152, 26),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 152, 26),
-    ]);
-  }
-
-  test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() async {
-    await assertErrorsInCode('''
-abstract class I<U> {
-  U get g => null;
-}
-abstract class J<V> {
-  V get g => null;
-}
-class B implements I<int>, J<String> {
-  double get g => null;
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 127, 21),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 127, 21),
-    ]);
-  }
-
-  test_invalidMethodOverrideNamedParamType() async {
-    await assertErrorsInCode('''
-class A {
-  m({int a}) {}
-}
-class B implements A {
-  m({String a}) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 53, 16),
-    ]);
-  }
-
-  test_invalidMethodOverrideNormalParamType_interface() async {
-    await assertErrorsInCode('''
-class A {
-  m(int a) {}
-}
-class B implements A {
-  m(String a) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 51, 14),
-    ]);
-  }
-
-  test_invalidMethodOverrideNormalParamType_superclass() async {
-    await assertErrorsInCode('''
-class A {
-  m(int a) {}
-}
-class B extends A {
-  m(String a) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 48, 14),
-    ]);
-  }
-
-  test_invalidMethodOverrideNormalParamType_superclass_interface() async {
-    await assertErrorsInCode('''
-abstract class I<U> {
-  m(U u) => null;
-}
-abstract class J<V> {
-  m(V v) => null;
-}
-class B extends I<int> implements J<String> {
-  m(double d) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 132, 14),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 132, 14),
-    ]);
-  }
-
-  test_invalidMethodOverrideNormalParamType_twoInterfaces() async {
-    await assertErrorsInCode('''
-abstract class I {
-  m(int n);
-}
-abstract class J {
-  m(num n);
-}
-abstract class A implements I, J {}
-class B extends A {
-  m(String n) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 14),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 14),
-    ]);
-  }
-
-  test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() async {
-    // language/override_inheritance_generic_test/08
-    await assertErrorsInCode('''
-abstract class I<U> {
-  m(U u) => null;
-}
-abstract class J<V> {
-  m(V v) => null;
-}
-class B implements I<int>, J<String> {
-  m(double d) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 125, 14),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 125, 14),
-    ]);
-  }
-
-  test_invalidMethodOverrideOptionalParamType() async {
-    await assertErrorsInCode('''
-class A {
-  m([int a]) {}
-}
-class B implements A {
-  m([String a]) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 53, 16),
-    ]);
-  }
-
-  test_invalidMethodOverrideOptionalParamType_twoInterfaces() async {
-    await assertErrorsInCode('''
-abstract class I {
-  m([int n]);
-}
-abstract class J {
-  m([num n]);
-}
-abstract class A implements I, J {}
-class B extends A {
-  m([String n]) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 128, 16),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 128, 16),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_interface() async {
-    await assertErrorsInCode('''
-class A {
-  int m() { return 0; }
-}
-class B implements A {
-  String m() { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 61, 26),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_interface_grandparent() async {
-    await assertErrorsInCode('''
-abstract class A {
-  int m();
-}
-abstract class B implements A {
-}
-class C implements B {
-  String m() { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 91, 26),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_mixin() async {
-    await assertErrorsInCode('''
-class A {
-  int m() { return 0; }
-}
-class B extends Object with A {
-  String m() { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 70, 26),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_superclass() async {
-    await assertErrorsInCode('''
-class A {
-  int m() { return 0; }
-}
-class B extends A {
-  String m() { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 58, 26),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_superclass_grandparent() async {
-    await assertErrorsInCode('''
-class A {
-  int m() { return 0; }
-}
-class B extends A {
-}
-class C extends B {
-  String m() { return 'a'; }
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 80, 26),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_twoInterfaces() async {
-    await assertErrorsInCode('''
-abstract class I {
-  int m();
-}
-abstract class J {
-  num m();
-}
-abstract class A implements I, J {}
-class B extends A {
-  String m() => '';
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 122, 17),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 122, 17),
-    ]);
-  }
-
-  test_invalidMethodOverrideReturnType_void() async {
-    await assertErrorsInCode('''
-class A {
-  int m() { return 0; }
-}
-class B extends A {
-  void m() {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 58, 11),
-    ]);
-  }
-
-  test_invalidOverrideNamed_fewerNamedParameters() async {
-    await assertErrorsInCode('''
-class A {
-  m({a, b}) {}
-}
-class B extends A {
-  m({a}) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 9),
-    ]);
-  }
-
-  test_invalidOverrideNamed_missingNamedParameter() async {
-    await assertErrorsInCode('''
-class A {
-  m({a, b}) {}
-}
-class B extends A {
-  m({a, c}) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 12),
-    ]);
-  }
-
-  test_invalidOverridePositional_optional() async {
-    await assertErrorsInCode('''
-class A {
-  m([a, b]) {}
-}
-class B extends A {
-  m([a]) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 9),
-    ]);
-  }
-
-  test_invalidOverridePositional_optionalAndRequired() async {
-    await assertErrorsInCode('''
-class A {
-  m(a, b, [c, d]) {}
-}
-class B extends A {
-  m(a, b, [c]) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 55, 15),
-    ]);
-  }
-
-  test_invalidOverridePositional_optionalAndRequired2() async {
-    await assertErrorsInCode('''
-class A {
-  m(a, b, [c, d]) {}
-}
-class B extends A {
-  m(a, [c, d]) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 55, 15),
-    ]);
-  }
-
-  test_invalidOverrideRequired() async {
-    await assertErrorsInCode('''
-class A {
-  m(a) {}
-}
-class B extends A {
-  m(a, b) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 44, 10),
-    ]);
-  }
-
-  test_invalidSetterOverrideNormalParamType() async {
-    await assertErrorsInCode('''
-class A {
-  void set s(int v) {}
-}
-class B extends A {
-  void set s(String v) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 57, 23),
-    ]);
-  }
-
-  test_invalidSetterOverrideNormalParamType_superclass_interface() async {
-    await assertErrorsInCode('''
-abstract class I {
-  set setter14(int _) => null;
-}
-abstract class J {
-  set setter14(num _) => null;
-}
-abstract class A extends I implements J {}
-class B extends A {
-  set setter14(String _) => null;
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 169, 31),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 169, 31),
-    ]);
-  }
-
-  test_invalidSetterOverrideNormalParamType_twoInterfaces() async {
-    // test from language/override_inheritance_field_test_34.dart
-    await assertErrorsInCode('''
-abstract class I {
-  set setter14(int _) => null;
-}
-abstract class J {
-  set setter14(num _) => null;
-}
-abstract class A implements I, J {}
-class B extends A {
-  set setter14(String _) => null;
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 31),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 31),
-    ]);
-  }
-
-  test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() async {
-    await assertErrorsInCode('''
-abstract class I<U> {
-  set s(U u) {}
-}
-abstract class J<V> {
-  set s(V v) {}
-}
-class B implements I<int>, J<String> {
-  set s(double d) {}
-}''', [
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 121, 18),
-      error(CompileTimeErrorCode.INVALID_OVERRIDE, 121, 18),
-    ]);
-  }
-
-  test_mismatchedAccessorTypes_topLevel() async {
-    await assertErrorsInCode('''
-int get g { return 0; }
-set g(String v) {}''', [
-      error(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, 0, 23),
-    ]);
-  }
-
-  test_missingEnumConstantInSwitch() async {
-    await assertErrorsInCode('''
-enum E { ONE, TWO, THREE, FOUR }
-bool odd(E e) {
-  switch (e) {
-    case E.ONE:
-    case E.THREE: return true;
-  }
-  return false;
-}''', [
-      error(StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, 51, 10),
-      error(StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, 51, 10),
-    ]);
-  }
-
-  test_mixedReturnTypes_localFunction() async {
-    await assertErrorsInCode('''
-class C {
-  m(int x) {
-    return (int y) {
-      if (y < 0) {
-        return;
-      }
-      return 0;
-    };
-  }
-}''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 71, 7),
-    ]);
-  }
-
-  test_mixedReturnTypes_method() async {
-    await assertErrorsInCode('''
-class C {
-  m(int x) {
-    if (x < 0) {
-      return;
-    }
-    return 0;
-  }
-}''', [
-      error(StaticWarningCode.MIXED_RETURN_TYPES, 46, 6),
-      error(StaticWarningCode.MIXED_RETURN_TYPES, 64, 6),
-    ]);
-  }
-
-  test_mixedReturnTypes_topLevelFunction() async {
-    await assertErrorsInCode('''
-f(int x) {
-  if (x < 0) {
-    return;
-  }
-  return 0;
-}''', [
-      error(StaticWarningCode.MIXED_RETURN_TYPES, 30, 6),
-      error(StaticWarningCode.MIXED_RETURN_TYPES, 44, 6),
-    ]);
-  }
-
-  test_newWithAbstractClass() async {
-    await assertErrorsInCode('''
-abstract class A {}
-void f() {
-  A a = new A();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 35, 1),
-      error(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, 43, 1),
-    ]);
-  }
-
-  test_newWithAbstractClass_generic() async {
-    await assertErrorsInCode('''
-abstract class A<E> {}
-void f() {
-  var a = new A<int>();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 40, 1),
-      error(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, 48, 6),
-    ]);
-
-    ClassDeclaration classA = result.unit.declarations[0];
-    FunctionDeclaration f = result.unit.declarations[1];
-    BlockFunctionBody body = f.functionExpression.body;
-    VariableDeclarationStatement a = body.block.statements[0];
-    InstanceCreationExpression init = a.variables.variables[0].initializer;
-    expect(init.staticType,
-        classA.declaredElement.type.instantiate([typeProvider.intType]));
-  }
-
-  test_newWithInvalidTypeParameters() async {
-    await assertErrorsInCode('''
-class A {}
-f() { return new A<A>(); }''', [
-      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 28, 4),
-    ]);
-  }
-
-  test_newWithInvalidTypeParameters_tooFew() async {
-    await assertErrorsInCode('''
-class A {}
-class C<K, V> {}
-f(p) {
-  return new C<A>();
-}''', [
-      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 48, 4),
-    ]);
-  }
-
-  test_newWithInvalidTypeParameters_tooMany() async {
-    await assertErrorsInCode('''
-class A {}
-class C<E> {}
-f(p) {
-  return new C<A, A>();
-}''', [
-      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 45, 7),
-    ]);
-  }
-
-  test_newWithNonType() async {
-    await assertErrorsInCode('''
-var A = 0;
-void f() {
-  var a = new A();
-}''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 28, 1),
-      error(StaticWarningCode.NEW_WITH_NON_TYPE, 36, 1),
-    ]);
-  }
-
-  test_newWithNonType_fromLibrary() async {
-    newFile("/test/lib/lib.dart", content: "class B {}");
-    await assertErrorsInCode('''
-import 'lib.dart' as lib;
-void f() {
-  var a = new lib.A();
-}
-lib.B b;''', [
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 43, 1),
-      error(StaticWarningCode.NEW_WITH_NON_TYPE, 55, 1),
-    ]);
-  }
-
-  test_newWithUndefinedConstructor() async {
-    await assertErrorsInCode('''
-class A {
-  A() {}
-}
-f() {
-  new A.name();
-}''', [
-      error(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4),
-    ]);
-  }
-
-  test_newWithUndefinedConstructorDefault() async {
-    await assertErrorsInCode('''
-class A {
-  A.name() {}
-}
-f() {
-  new A();
-}''', [
-      error(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberFivePlus() async {
-    await assertErrorsInCode('''
-abstract class A {
-  m();
-  n();
-  o();
-  p();
-  q();
-}
-class C extends A {
-}''', [
-      error(
-          StaticWarningCode
-              .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
-          62,
-          1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberFour() async {
-    await assertErrorsInCode('''
-abstract class A {
-  m();
-  n();
-  o();
-  p();
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
-          55, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_interface() async {
-    // 15979
-    await assertErrorsInCode('''
-abstract class M {}
-abstract class A {}
-abstract class I {
-  m();
-}
-class B = A with M implements I;''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          74, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_mixin() async {
-    // 15979
-    await assertErrorsInCode('''
-abstract class M {
-  m();
-}
-abstract class A {}
-class B = A with M;''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          54, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_classTypeAlias_superclass() async {
-    // 15979
-    await assertErrorsInCode('''
-class M {}
-abstract class A {
-  m();
-}
-class B = A with M;''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          45, 1),
-    ]);
-  }
-
   test_nonAbstractClassInheritsAbstractMemberOne_ensureCorrectFunctionSubtypeIsUsedInImplementation() async {
     // 15028
     await assertErrorsInCode('''
@@ -2344,522 +83,6 @@
     ]);
   }
 
-  test_nonAbstractClassInheritsAbstractMemberOne_getter_fromInterface() async {
-    await assertErrorsInCode('''
-class I {
-  int get g {return 1;}
-}
-class C implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          42, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_getter_fromSuperclass() async {
-    await assertErrorsInCode('''
-abstract class A {
-  int get g;
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          40, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface() async {
-    await assertErrorsInCode('''
-class I {
-  m(p) {}
-}
-class C implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          28, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_abstractNSM() async {
-    await assertErrorsInCode('''
-class I {
-  m(p) {}
-}
-class C implements I {
-  noSuchMethod(v);
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          28, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_abstractOverrideNSM() async {
-    await assertNoErrorsInCode('''
-class I {
-  m(p) {}
-}
-class B {
-  noSuchMethod(v) => null;
-}
-class C extends B implements I {
-  noSuchMethod(v);
-}''');
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_fromInterface_ifcNSM() async {
-    await assertErrorsInCode('''
-class I {
-  m(p) {}
-  noSuchMethod(v) => null;
-}
-class C implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          55, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_fromSuperclass() async {
-    await assertErrorsInCode('''
-abstract class A {
-  m(p);
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          35, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_method_optionalParamCount() async {
-    // 7640
-    await assertErrorsInCode('''
-abstract class A {
-  int x(int a);
-}
-abstract class B {
-  int x(int a, [int b]);
-}
-class C implements A, B {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          89, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_getter() async {
-    // 15001
-    await assertErrorsInCode('''
-abstract class A { get g1; get g2; }
-abstract class B implements A { get g1 => 1; }
-class C extends Object with B {}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          90, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_method() async {
-    // 15001
-    await assertErrorsInCode('''
-abstract class A { m1(); m2(); }
-abstract class B implements A { m1() => 1; }
-class C extends Object with B {}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          84, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_mixinInherits_setter() async {
-    // 15001
-    await assertErrorsInCode('''
-abstract class A { set s1(v); set s2(v); }
-abstract class B implements A { set s1(v) {} }
-class C extends Object with B {}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          96, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_noSuchMethod_interface() async {
-    // 15979
-    await assertErrorsInCode('''
-class I {
-  noSuchMethod(v) => '';
-}
-abstract class A {
-  m();
-}
-class B extends A implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          71, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_setter_and_implicitSetter() async {
-    // test from language/override_inheritance_abstract_test_14.dart
-    await assertErrorsInCode('''
-abstract class A {
-  set field(_);
-}
-abstract class I {
-  var field;
-}
-class B extends A implements I {
-  get field => 0;
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          77, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_setter_fromInterface() async {
-    await assertErrorsInCode('''
-class I {
-  set s(int i) {}
-}
-class C implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          36, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_setter_fromSuperclass() async {
-    await assertErrorsInCode('''
-abstract class A {
-  set s(int i);
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          43, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_superclasses_interface() async {
-    // bug 11154
-    await assertErrorsInCode('''
-class A {
-  get a => 'a';
-}
-abstract class B implements A {
-  get b => 'b';
-}
-class C extends B {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          84, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingGetter() async {
-    // 16133
-    await assertErrorsInCode('''
-class I {
-  var v;
-}
-class C implements I {
-  set v(_) {}
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          27, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberOne_variable_fromInterface_missingSetter() async {
-    // 16133
-    await assertErrorsInCode('''
-class I {
-  var v;
-}
-class C implements I {
-  get v => 1;
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
-          27, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberThree() async {
-    await assertErrorsInCode('''
-abstract class A {
-  m();
-  n();
-  o();
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
-          48, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberTwo() async {
-    await assertErrorsInCode('''
-abstract class A {
-  m();
-  n();
-}
-class C extends A {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-          41, 1),
-    ]);
-  }
-
-  test_nonAbstractClassInheritsAbstractMemberTwo_variable_fromInterface_missingBoth() async {
-    // 16133
-    await assertErrorsInCode('''
-class I {
-  var v;
-}
-class C implements I {
-}''', [
-      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
-          27, 1),
-    ]);
-  }
-
-  test_nonTypeInCatchClause_noElement() async {
-    await assertErrorsInCode('''
-f() {
-  try {
-  } on T catch (e) {
-  }
-}''', [
-      error(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, 21, 1),
-      error(HintCode.UNUSED_CATCH_CLAUSE, 30, 1),
-    ]);
-  }
-
-  test_nonTypeInCatchClause_notType() async {
-    await assertErrorsInCode('''
-var T = 0;
-f() {
-  try {
-  } on T catch (e) {
-  }
-}''', [
-      error(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, 32, 1),
-      error(HintCode.UNUSED_CATCH_CLAUSE, 41, 1),
-    ]);
-  }
-
-  test_nonVoidReturnForOperator() async {
-    await assertErrorsInCode('''
-class A {
-  int operator []=(a, b) { return a; }
-}''', [
-      error(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, 12, 3),
-    ]);
-  }
-
-  test_nonVoidReturnForSetter_function() async {
-    await assertErrorsInCode('''
-int set x(int v) {
-  return 42;
-}''', [
-      error(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, 0, 3),
-    ]);
-  }
-
-  test_nonVoidReturnForSetter_method() async {
-    await assertErrorsInCode('''
-class A {
-  int set x(int v) {
-    return 42;
-  }
-}''', [
-      error(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, 12, 3),
-    ]);
-  }
-
-  test_notAType() async {
-    await assertErrorsInCode('''
-f() {}
-main() {
-  f v = null;
-}''', [
-      error(StaticWarningCode.NOT_A_TYPE, 18, 1),
-      error(HintCode.UNUSED_LOCAL_VARIABLE, 20, 1),
-    ]);
-  }
-
-  test_notEnoughRequiredArguments() async {
-    await assertErrorsInCode('''
-f(int a, String b) {}
-main() {
-  f();
-}''', [
-      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 34, 2),
-    ]);
-  }
-
-  test_notEnoughRequiredArguments_functionExpression() async {
-    await assertErrorsInCode('''
-main() {
-  (int x) {} ();
-}''', [
-      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 22, 2),
-    ]);
-  }
-
-  test_notEnoughRequiredArguments_getterReturningFunction() async {
-    await assertErrorsInCode('''
-typedef Getter(self);
-Getter getter = (x) => x;
-main() {
-  getter();
-}''', [
-      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 65, 2),
-    ]);
-  }
-
-  test_partOfDifferentLibrary() async {
-    newFile("/test/lib/part.dart", content: "part of lub;");
-    await assertErrorsInCode('''
-library lib;
-part 'part.dart';''', [
-      error(StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, 18, 11),
-    ]);
-  }
-
-  test_redirectToInvalidFunctionType() async {
-    await assertErrorsInCode('''
-class A implements B {
-  A(int p) {}
-}
-class B {
-  factory B() = A;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, 65, 1),
-    ]);
-  }
-
-  test_redirectToInvalidReturnType() async {
-    await assertErrorsInCode('''
-class A {
-  A() {}
-}
-class B {
-  factory B() = A;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, 47, 1),
-    ]);
-  }
-
-  test_redirectToMissingConstructor_named() async {
-    await assertErrorsInCode('''
-class A implements B{
-  A() {}
-}
-class B {
-  factory B() = A.name;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR, 59, 6),
-    ]);
-  }
-
-  test_redirectToMissingConstructor_unnamed() async {
-    await assertErrorsInCode('''
-class A implements B{
-  A.name() {}
-}
-class B {
-  factory B() = A;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR, 64, 1),
-    ]);
-  }
-
-  test_redirectToNonClass_notAType() async {
-    await assertErrorsInCode('''
-class B {
-  int A;
-  factory B() = A;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_NON_CLASS, 35, 1),
-    ]);
-  }
-
-  test_redirectToNonClass_undefinedIdentifier() async {
-    await assertErrorsInCode('''
-class B {
-  factory B() = A;
-}''', [
-      error(StaticWarningCode.REDIRECT_TO_NON_CLASS, 26, 1),
-    ]);
-  }
-
-  test_returnWithoutValue_async() async {
-    await assertErrorsInCode('''
-import 'dart:async';
-Future<int> f() async {
-  return;
-}
-''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 47, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_async_future_object_with_return() async {
-    await assertErrorsInCode('''
-import 'dart:async';
-Future<Object> f() async {
-  return;
-}
-''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 50, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_factoryConstructor() async {
-    await assertErrorsInCode('''
-class A { factory A() { return; } }
-''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 24, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_function() async {
-    await assertErrorsInCode('''
-int f() { return; }
-''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 10, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_method() async {
-    await assertErrorsInCode('''
-class A { int m() { return; } }
-''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 20, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_mixedReturnTypes_function() async {
-    // Tests that only the RETURN_WITHOUT_VALUE warning is created, and no
-    // MIXED_RETURN_TYPES are created.
-    await assertErrorsInCode('''
-int f(int x) {
-  if (x < 0) {
-    return 1;
-  }
-  return;
-}''', [
-      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 50, 7),
-    ]);
-  }
-
-  test_returnWithoutValue_Null() async {
-    // Test that block bodied functions with return type Null and an empty
-    // return cause a static warning.
-    await assertNoErrorsInCode('''
-Null f() {return;}
-''');
-  }
-
   test_staticAccessToInstanceMember_method_invocation() async {
     await assertErrorsInCode('''
 class A {
diff --git a/pkg/analyzer/test/generated/strong_mode_test.dart b/pkg/analyzer/test/generated/strong_mode_test.dart
index 0c95349..a8e32bf 100644
--- a/pkg/analyzer/test/generated/strong_mode_test.dart
+++ b/pkg/analyzer/test/generated/strong_mode_test.dart
@@ -4342,7 +4342,6 @@
     expect(ft.toString(), 'List<T> Function<T>(String)');
     ft = ft.instantiate([typeProvider.intType]);
     expect(ft.toString(), 'List<int> Function(String)');
-    expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
   }
 
   test_genericMethod_explicitTypeParams() async {
@@ -4358,7 +4357,6 @@
     MethodInvocation f = findIdentifier('f<int>').parent;
     FunctionType ft = f.staticInvokeType;
     expect(ft.toString(), 'List<int> Function(String)');
-    expect('${ft.typeArguments}/${ft.typeParameters}', '[String, int]/[E, T]');
 
     SimpleIdentifier x = findIdentifier('x');
     expect(x.staticType,
@@ -4685,8 +4683,6 @@
 ''');
     MethodInvocation f = findIdentifier('f<int>(3);').parent;
     expect(f.staticInvokeType.toString(), 'S Function(int)');
-    FunctionType ft = f.staticInvokeType;
-    expect('${ft.typeArguments}/${ft.typeParameters}', '[S, int]/[T, S]');
 
     expectIdentifierType('f;', 'S Function<Sâ‚€>(Sâ‚€)');
   }
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 4481253..e6af823 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -8,13 +8,11 @@
 import 'checked_mode_compile_time_error_code_test.dart'
     as checked_mode_compile_time_error_code;
 import 'compile_time_error_code_test.dart' as compile_time_error_code;
-// ignore: deprecated_member_use_from_same_package
 import 'constant_test.dart' as constant_test;
 import 'declaration_resolver_test.dart' as declaration_resolver_test;
 import 'element_resolver_test.dart' as element_resolver_test;
 import 'engine_test.dart' as engine_test;
 import 'error_suppression_test.dart' as error_suppression;
-import 'hint_code_test.dart' as hint_code_test;
 import 'inheritance_manager_test.dart' as inheritance_manager_test;
 import 'invalid_code_test.dart' as invalid_code;
 import 'java_core_test.dart' as java_core_test;
@@ -46,7 +44,6 @@
     element_resolver_test.main();
     engine_test.main();
     error_suppression.main();
-    hint_code_test.main();
     inheritance_manager_test.main();
     invalid_code.main();
     java_core_test.main();
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index b795962..2a05d30 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -197,7 +197,7 @@
   List<AnalysisError> get errors => _errors;
 
   /// Return `true` if at least one error has been gathered.
-  bool get hasErrors => _errors.length > 0;
+  bool get hasErrors => _errors.isNotEmpty;
 
   /// Add the given [errors] to this listener.
   void addAll(List<AnalysisError> errors) {
@@ -288,9 +288,9 @@
             if (i > 0) {
               buffer.write(', ');
             }
-            buffer.write('message(resourceProvider.convertPath(\'');
+            buffer.write('message(\'');
             buffer.write(message.filePath);
-            buffer.write('\'), ');
+            buffer.write('\', ');
             buffer.write(message.offset);
             buffer.write(', ');
             buffer.write(message.length);
diff --git a/pkg/analyzer/test/generated/type_system_test.dart b/pkg/analyzer/test/generated/type_system_test.dart
index eca10d8..815c659 100644
--- a/pkg/analyzer/test/generated/type_system_test.dart
+++ b/pkg/analyzer/test/generated/type_system_test.dart
@@ -871,12 +871,14 @@
     var cOfB = c.type.instantiate([b.type]);
     // B b;
     // cOfB.m(b); // infer <B>
-    expect(_inferCall(cOfB.getMethod('m').type, [b.type]), [b.type, b.type]);
+    expect(_inferCall2(cOfB.getMethod('m').type, [b.type]).toString(),
+        'B Function(B)');
     // cOfA.m(b); // infer <B>
-    expect(_inferCall(cOfA.getMethod('m').type, [b.type]), [a.type, b.type]);
+    expect(_inferCall2(cOfA.getMethod('m').type, [b.type]).toString(),
+        'B Function(B)');
     // cOfObject.m(b); // infer <B>
-    expect(_inferCall(cOfObject.getMethod('m').type, [b.type]),
-        [objectType, b.type]);
+    expect(_inferCall2(cOfObject.getMethod('m').type, [b.type]).toString(),
+        'B Function(B)');
   }
 
   void test_boundedByOuterClassSubstituted() {
@@ -909,12 +911,14 @@
     // List<B> b;
     var listOfB = listType.instantiate([b.type]);
     // cOfB.m(b); // infer <B>
-    expect(_inferCall(cOfB.getMethod('m').type, [listOfB]), [b.type, listOfB]);
+    expect(_inferCall2(cOfB.getMethod('m').type, [listOfB]).toString(),
+        'List<B> Function(List<B>)');
     // cOfA.m(b); // infer <B>
-    expect(_inferCall(cOfA.getMethod('m').type, [listOfB]), [a.type, listOfB]);
+    expect(_inferCall2(cOfA.getMethod('m').type, [listOfB]).toString(),
+        'List<B> Function(List<B>)');
     // cOfObject.m(b); // infer <B>
-    expect(_inferCall(cOfObject.getMethod('m').type, [listOfB]),
-        [objectType, listOfB]);
+    expect(_inferCall2(cOfObject.getMethod('m').type, [listOfB]).toString(),
+        'List<B> Function(List<B>)');
   }
 
   void test_boundedRecursively() {
@@ -1102,6 +1106,13 @@
 
   List<DartType> _inferCall(FunctionTypeImpl ft, List<DartType> arguments,
       {DartType returnType, bool expectError: false}) {
+    FunctionType inferred = _inferCall2(ft, arguments,
+        returnType: returnType, expectError: expectError);
+    return inferred?.typeArguments;
+  }
+
+  FunctionType _inferCall2(FunctionTypeImpl ft, List<DartType> arguments,
+      {DartType returnType, bool expectError: false}) {
     var listener = new RecordingErrorListener();
 
     var reporter = new ErrorReporter(
@@ -1121,7 +1132,7 @@
     } else {
       expect(listener.errors, isEmpty, reason: 'did not expect any errors.');
     }
-    return inferred?.typeArguments;
+    return inferred;
   }
 }
 
@@ -1740,6 +1751,76 @@
     _checkLeastUpperBound(typeB, typeC, typeB);
   }
 
+  void test_directSuperclass_nullability() {
+    ClassElement _classElement(String name, InterfaceType supertype) {
+      return ElementFactory.classElement3(name: name, supertype: supertype);
+    }
+
+    InterfaceTypeImpl _interfaceType(
+      ClassElement element,
+      NullabilitySuffix nullabilitySuffix,
+    ) {
+      return InterfaceTypeImpl.explicit(
+        element,
+        const [],
+        nullabilitySuffix: nullabilitySuffix,
+      );
+    }
+
+    var aElement = ElementFactory.classElement3(name: 'A');
+    var aQuestion = _interfaceType(aElement, NullabilitySuffix.question);
+    var aStar = _interfaceType(aElement, NullabilitySuffix.star);
+    var aNone = _interfaceType(aElement, NullabilitySuffix.none);
+
+    var bElementStar = _classElement('B', aStar);
+    var bElementNone = _classElement('B', aNone);
+
+    InterfaceTypeImpl _bTypeStarElement(NullabilitySuffix nullability) {
+      return _interfaceType(bElementStar, nullability);
+    }
+
+    InterfaceTypeImpl _bTypeNoneElement(NullabilitySuffix nullability) {
+      return _interfaceType(bElementNone, nullability);
+    }
+
+    var bStarQuestion = _bTypeStarElement(NullabilitySuffix.question);
+    var bStarStar = _bTypeStarElement(NullabilitySuffix.star);
+    var bStarNone = _bTypeStarElement(NullabilitySuffix.none);
+
+    var bNoneQuestion = _bTypeNoneElement(NullabilitySuffix.question);
+    var bNoneStar = _bTypeNoneElement(NullabilitySuffix.star);
+    var bNoneNone = _bTypeNoneElement(NullabilitySuffix.none);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(bStarQuestion, aQuestion, aQuestion);
+    assertLUB(bStarQuestion, aStar, aQuestion);
+    assertLUB(bStarQuestion, aNone, aQuestion);
+
+    assertLUB(bStarStar, aQuestion, aQuestion);
+    assertLUB(bStarStar, aStar, aStar);
+    assertLUB(bStarStar, aNone, aStar);
+
+    assertLUB(bStarNone, aQuestion, aQuestion);
+    assertLUB(bStarNone, aStar, aStar);
+    assertLUB(bStarNone, aNone, aNone);
+
+    assertLUB(bNoneQuestion, aQuestion, aQuestion);
+    assertLUB(bNoneQuestion, aStar, aQuestion);
+    assertLUB(bNoneQuestion, aNone, aQuestion);
+
+    assertLUB(bNoneStar, aQuestion, aQuestion);
+    assertLUB(bNoneStar, aStar, aStar);
+    assertLUB(bNoneStar, aNone, aStar);
+
+    assertLUB(bNoneNone, aQuestion, aQuestion);
+    assertLUB(bNoneNone, aStar, aStar);
+    assertLUB(bNoneNone, aNone, aNone);
+  }
+
   void test_dynamic_bottom() {
     _checkLeastUpperBound(dynamicType, bottomType, dynamicType);
   }
@@ -1768,6 +1849,111 @@
     _checkLeastUpperBound(interfaceType, simpleFunctionType, objectType);
   }
 
+  void test_interface_sameElement_nullability() {
+    var aElement = ElementFactory.classElement3(name: 'A');
+
+    InterfaceTypeImpl _interfaceType(
+      ClassElement element,
+      NullabilitySuffix nullabilitySuffix,
+    ) {
+      return InterfaceTypeImpl.explicit(
+        element,
+        const [],
+        nullabilitySuffix: nullabilitySuffix,
+      );
+    }
+
+    var aQuestion = _interfaceType(aElement, NullabilitySuffix.question);
+    var aStar = _interfaceType(aElement, NullabilitySuffix.star);
+    var aNone = _interfaceType(aElement, NullabilitySuffix.none);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(aQuestion, aQuestion, aQuestion);
+    assertLUB(aQuestion, aStar, aQuestion);
+    assertLUB(aQuestion, aNone, aQuestion);
+
+    assertLUB(aStar, aQuestion, aQuestion);
+    assertLUB(aStar, aStar, aStar);
+    assertLUB(aStar, aNone, aStar);
+
+    assertLUB(aNone, aQuestion, aQuestion);
+    assertLUB(aNone, aStar, aStar);
+    assertLUB(aNone, aNone, aNone);
+  }
+
+  void test_mixinAndClass_constraintAndInterface() {
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+
+    var mixinM = ElementFactory.mixinElement(
+      name: 'M',
+      constraints: [instA.withNullabilitySuffixNone],
+    );
+
+    _checkLeastUpperBound(
+      InterfaceTypeImpl.explicit(
+        classB,
+        [],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+      InterfaceTypeImpl.explicit(
+        mixinM,
+        [],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+      instA.withNullability(NullabilitySuffix.star),
+    );
+  }
+
+  void test_mixinAndClass_object() {
+    var classA = ElementFactory.classElement3(name: 'A');
+    var mixinM = ElementFactory.mixinElement(name: 'M');
+
+    _checkLeastUpperBound(
+      InterfaceTypeImpl.explicit(classA, []),
+      InterfaceTypeImpl.explicit(mixinM, []),
+      typeProvider.objectType,
+    );
+  }
+
+  void test_mixinAndClass_sharedInterface() {
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+
+    var mixinM = ElementFactory.mixinElement(
+      name: 'M',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+
+    _checkLeastUpperBound(
+      InterfaceTypeImpl.explicit(
+        classB,
+        [],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+      InterfaceTypeImpl.explicit(
+        mixinM,
+        [],
+        nullabilitySuffix: NullabilitySuffix.star,
+      ),
+      instA.withNullability(NullabilitySuffix.star),
+    );
+  }
+
   void test_mixinCase() {
     // class A
     // class B extends A
@@ -1869,6 +2055,114 @@
     _checkLeastUpperBound(typeB, typeC, typeA);
   }
 
+  void test_sharedSuperclass1_nullability() {
+    ClassElementImpl _classElement(String name, InterfaceType supertype) {
+      return ElementFactory.classElement3(name: name, supertype: supertype);
+    }
+
+    InterfaceTypeImpl _interfaceType(
+      ClassElement element,
+      NullabilitySuffix nullabilitySuffix,
+    ) {
+      return InterfaceTypeImpl.explicit(
+        element,
+        const [],
+        nullabilitySuffix: nullabilitySuffix,
+      );
+    }
+
+    var aElement = _classElement('A', null);
+
+    var aQuestion = _interfaceType(aElement, NullabilitySuffix.question);
+    var aStar = _interfaceType(aElement, NullabilitySuffix.star);
+    var aNone = _interfaceType(aElement, NullabilitySuffix.none);
+
+    var bElementNone = _classElement('B', aNone);
+    var bElementStar = _classElement('B', aStar);
+
+    var cElementNone = _classElement('C', aNone);
+    var cElementStar = _classElement('C', aStar);
+
+    InterfaceTypeImpl bTypeElementNone(NullabilitySuffix nullability) {
+      return _interfaceType(bElementNone, nullability);
+    }
+
+    InterfaceTypeImpl bTypeElementStar(NullabilitySuffix nullability) {
+      return _interfaceType(bElementStar, nullability);
+    }
+
+    var bNoneQuestion = bTypeElementNone(NullabilitySuffix.question);
+    var bNoneStar = bTypeElementNone(NullabilitySuffix.star);
+    var bNoneNone = bTypeElementNone(NullabilitySuffix.none);
+
+    var bStarQuestion = bTypeElementStar(NullabilitySuffix.question);
+    var bStarStar = bTypeElementStar(NullabilitySuffix.star);
+    var bStarNone = bTypeElementStar(NullabilitySuffix.none);
+
+    InterfaceTypeImpl cTypeElementNone(NullabilitySuffix nullability) {
+      return _interfaceType(cElementNone, nullability);
+    }
+
+    InterfaceTypeImpl cTypeElementStar(NullabilitySuffix nullability) {
+      return _interfaceType(cElementStar, nullability);
+    }
+
+    var cNoneQuestion = cTypeElementNone(NullabilitySuffix.question);
+    var cNoneStar = cTypeElementNone(NullabilitySuffix.star);
+    var cNoneNone = cTypeElementNone(NullabilitySuffix.none);
+
+    var cStarQuestion = cTypeElementStar(NullabilitySuffix.question);
+    var cStarStar = cTypeElementStar(NullabilitySuffix.star);
+    var cStarNone = cTypeElementStar(NullabilitySuffix.none);
+
+    void assertLUB(DartType type1, DartType type2, DartType expected) {
+      expect(typeSystem.getLeastUpperBound(type1, type2), expected);
+      expect(typeSystem.getLeastUpperBound(type2, type1), expected);
+    }
+
+    assertLUB(bNoneQuestion, cNoneQuestion, aQuestion);
+    assertLUB(bNoneQuestion, cNoneStar, aQuestion);
+    assertLUB(bNoneQuestion, cNoneNone, aQuestion);
+    assertLUB(bNoneQuestion, cStarQuestion, aQuestion);
+    assertLUB(bNoneQuestion, cStarStar, aQuestion);
+    assertLUB(bNoneQuestion, cStarNone, aQuestion);
+
+    assertLUB(bNoneStar, cNoneQuestion, aQuestion);
+    assertLUB(bNoneStar, cNoneStar, aStar);
+    assertLUB(bNoneStar, cNoneNone, aStar);
+    assertLUB(bNoneStar, cStarQuestion, aQuestion);
+    assertLUB(bNoneStar, cStarStar, aStar);
+    assertLUB(bNoneStar, cStarNone, aStar);
+
+    assertLUB(bNoneNone, cNoneQuestion, aQuestion);
+    assertLUB(bNoneNone, cNoneStar, aStar);
+    assertLUB(bNoneNone, cNoneNone, aNone);
+    assertLUB(bNoneNone, cStarQuestion, aQuestion);
+    assertLUB(bNoneNone, cStarStar, aStar);
+    assertLUB(bNoneNone, cStarNone, aNone);
+
+    assertLUB(bStarQuestion, cNoneQuestion, aQuestion);
+    assertLUB(bStarQuestion, cNoneStar, aQuestion);
+    assertLUB(bStarQuestion, cNoneNone, aQuestion);
+    assertLUB(bStarQuestion, cStarQuestion, aQuestion);
+    assertLUB(bStarQuestion, cStarStar, aQuestion);
+    assertLUB(bStarQuestion, cStarNone, aQuestion);
+
+    assertLUB(bStarStar, cNoneQuestion, aQuestion);
+    assertLUB(bStarStar, cNoneStar, aStar);
+    assertLUB(bStarStar, cNoneNone, aStar);
+    assertLUB(bStarStar, cStarQuestion, aQuestion);
+    assertLUB(bStarStar, cStarStar, aStar);
+    assertLUB(bStarStar, cStarNone, aStar);
+
+    assertLUB(bStarNone, cNoneQuestion, aQuestion);
+    assertLUB(bStarNone, cNoneStar, aStar);
+    assertLUB(bStarNone, cNoneNone, aNone);
+    assertLUB(bStarNone, cStarQuestion, aQuestion);
+    assertLUB(bStarNone, cStarStar, aStar);
+    assertLUB(bStarNone, cStarNone, aNone);
+  }
+
   void test_sharedSuperclass2() {
     ClassElementImpl classA = ElementFactory.classElement2("A");
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
@@ -2729,7 +3023,7 @@
 
 @reflectiveTest
 class TypeSystemTest extends AbstractTypeSystemTest {
-  DartType get functionClassTypeNone {
+  InterfaceTypeImpl get functionClassTypeNone {
     return InterfaceTypeImpl.explicit(
       typeProvider.functionType.element,
       const <DartType>[],
@@ -2737,7 +3031,7 @@
     );
   }
 
-  DartType get functionClassTypeQuestion {
+  InterfaceTypeImpl get functionClassTypeQuestion {
     return InterfaceTypeImpl.explicit(
       typeProvider.functionType.element,
       const <DartType>[],
@@ -2745,7 +3039,7 @@
     );
   }
 
-  DartType get functionClassTypeStar {
+  InterfaceTypeImpl get functionClassTypeStar {
     return InterfaceTypeImpl.explicit(
       typeProvider.functionType.element,
       const <DartType>[],
@@ -2756,7 +3050,7 @@
   DartType get noneType => (typeProvider.stringType as TypeImpl)
       .withNullability(NullabilitySuffix.none);
 
-  FunctionType get nothingToVoidFunctionTypeNone {
+  FunctionTypeImpl get nothingToVoidFunctionTypeNone {
     return FunctionTypeImpl.synthetic(
       voidType,
       const <TypeParameterElement>[],
@@ -2765,7 +3059,7 @@
     );
   }
 
-  FunctionType get nothingToVoidFunctionTypeQuestion {
+  FunctionTypeImpl get nothingToVoidFunctionTypeQuestion {
     return FunctionTypeImpl.synthetic(
       voidType,
       const <TypeParameterElement>[],
@@ -2774,7 +3068,7 @@
     );
   }
 
-  FunctionType get nothingToVoidFunctionTypeStar {
+  FunctionTypeImpl get nothingToVoidFunctionTypeStar {
     return FunctionTypeImpl.synthetic(
       voidType,
       const <TypeParameterElement>[],
@@ -2783,13 +3077,46 @@
     );
   }
 
+  DartType get objectClassTypeNone => (typeProvider.objectType as TypeImpl)
+      .withNullability(NullabilitySuffix.none);
+
+  DartType get objectClassTypeQuestion => (typeProvider.objectType as TypeImpl)
+      .withNullability(NullabilitySuffix.question);
+
+  DartType get objectClassTypeStar => (typeProvider.objectType as TypeImpl)
+      .withNullability(NullabilitySuffix.star);
+
   DartType get questionType => (typeProvider.stringType as TypeImpl)
       .withNullability(NullabilitySuffix.question);
 
   DartType get starType => (typeProvider.stringType as TypeImpl)
       .withNullability(NullabilitySuffix.star);
 
-  DartType futureOrTypeNone({@required DartType argument}) {
+  InterfaceTypeImpl get stringClassTypeNone {
+    return InterfaceTypeImpl.explicit(
+      typeProvider.stringType.element,
+      const <DartType>[],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  InterfaceTypeImpl get stringClassTypeQuestion {
+    return InterfaceTypeImpl.explicit(
+      typeProvider.stringType.element,
+      const <DartType>[],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
+  InterfaceTypeImpl get stringClassTypeStar {
+    return InterfaceTypeImpl.explicit(
+      typeProvider.stringType.element,
+      const <DartType>[],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
+  InterfaceTypeImpl futureOrTypeNone({@required DartType argument}) {
     var element = typeProvider.futureOrType.element;
     return InterfaceTypeImpl.explicit(
       element,
@@ -2798,7 +3125,7 @@
     );
   }
 
-  DartType futureOrTypeQuestion({@required DartType argument}) {
+  InterfaceTypeImpl futureOrTypeQuestion({@required DartType argument}) {
     var element = typeProvider.futureOrType.element;
     return InterfaceTypeImpl.explicit(
       element,
@@ -2807,7 +3134,7 @@
     );
   }
 
-  DartType futureOrTypeStar({@required DartType argument}) {
+  InterfaceTypeImpl futureOrTypeStar({@required DartType argument}) {
     var element = typeProvider.futureOrType.element;
     return InterfaceTypeImpl.explicit(
       element,
@@ -2816,6 +3143,33 @@
     );
   }
 
+  InterfaceTypeImpl listClassTypeNone(DartType argument) {
+    var element = typeProvider.listType.element;
+    return InterfaceTypeImpl.explicit(
+      element,
+      <DartType>[argument],
+      nullabilitySuffix: NullabilitySuffix.none,
+    );
+  }
+
+  InterfaceTypeImpl listClassTypeQuestion(DartType argument) {
+    var element = typeProvider.listType.element;
+    return InterfaceTypeImpl.explicit(
+      element,
+      <DartType>[argument],
+      nullabilitySuffix: NullabilitySuffix.question,
+    );
+  }
+
+  InterfaceTypeImpl listClassTypeStar(DartType argument) {
+    var element = typeProvider.listType.element;
+    return InterfaceTypeImpl.explicit(
+      element,
+      <DartType>[argument],
+      nullabilitySuffix: NullabilitySuffix.star,
+    );
+  }
+
   test_isNonNullable_dynamic() {
     expect(typeSystem.isNonNullable(dynamicType), false);
   }
@@ -3115,6 +3469,10 @@
     expect(typeSystem.isNullable(starType), false);
   }
 
+  test_isNullable_Never() {
+    expect(typeSystem.isNullable(neverType), false);
+  }
+
   test_isNullable_never() {
     expect(typeSystem.isNullable(neverType), false);
   }
@@ -3282,8 +3640,140 @@
     expect(typeSystem.isPotentiallyNullable(voidType), true);
   }
 
+  test_promoteToNonNull_dynamic() {
+    expect(
+      typeSystem.promoteToNonNull(dynamicType),
+      dynamicType,
+    );
+  }
+
+  test_promoteToNonNull_functionType() {
+    // NonNull(T0 Function(...)) = T0 Function(...)
+    expect(
+      typeSystem.promoteToNonNull(nothingToVoidFunctionTypeQuestion),
+      nothingToVoidFunctionTypeNone,
+    );
+  }
+
+  test_promoteToNonNull_futureOr_question() {
+    // NonNull(FutureOr<T>) = FutureOr<T>
+    expect(
+      typeSystem.promoteToNonNull(
+        futureOrTypeQuestion(argument: stringClassTypeQuestion),
+      ),
+      futureOrTypeNone(argument: stringClassTypeQuestion),
+    );
+  }
+
+  test_promoteToNonNull_interfaceType_function_none() {
+    expect(
+      typeSystem.promoteToNonNull(functionClassTypeQuestion),
+      functionClassTypeNone,
+    );
+  }
+
+  test_promoteToNonNull_interfaceType_none() {
+    expect(
+      typeSystem.promoteToNonNull(stringClassTypeNone),
+      stringClassTypeNone,
+    );
+  }
+
+  test_promoteToNonNull_interfaceType_question() {
+    expect(
+      typeSystem.promoteToNonNull(stringClassTypeQuestion),
+      stringClassTypeNone,
+    );
+  }
+
+  test_promoteToNonNull_interfaceType_question_withTypeArguments() {
+    // NonNull(C<T1, ... , Tn>) = C<T1, ... , Tn>
+    // NonNull(List<String?>?) = List<String?>
+    expect(
+      typeSystem.promoteToNonNull(
+        listClassTypeQuestion(stringClassTypeQuestion),
+      ),
+      listClassTypeNone(stringClassTypeQuestion),
+    );
+  }
+
+  test_promoteToNonNull_interfaceType_star() {
+    expect(
+      typeSystem.promoteToNonNull(stringClassTypeStar),
+      stringClassTypeNone,
+    );
+  }
+
+  test_promoteToNonNull_never() {
+    expect(typeSystem.promoteToNonNull(neverType), neverType);
+  }
+
+  test_promoteToNonNull_null() {
+    expect(typeSystem.promoteToNonNull(nullType), neverType);
+  }
+
+  test_promoteToNonNull_typeParameter_noneBound_none() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeNone(bound: noneType),
+      ),
+      typeParameterTypeNone(bound: noneType),
+    );
+  }
+
+  test_promoteToNonNull_typeParameter_nullBound_none() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeNone(bound: null),
+      ),
+      typeParameterTypeNone(bound: objectClassTypeNone),
+    );
+  }
+
+  test_promoteToNonNull_typeParameter_questionBound_none() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeNone(bound: stringClassTypeQuestion),
+      ),
+      typeParameterTypeNone(bound: stringClassTypeNone),
+    );
+  }
+
+  test_promoteToNonNull_typeParameter_questionBound_question() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeQuestion(bound: stringClassTypeQuestion),
+      ),
+      typeParameterTypeNone(bound: stringClassTypeNone),
+    );
+  }
+
+  test_promoteToNonNull_typeParameter_questionBound_star() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeStar(bound: stringClassTypeQuestion),
+      ),
+      typeParameterTypeNone(bound: stringClassTypeNone),
+    );
+  }
+
+  test_promoteToNonNull_typeParameter_starBound_none() {
+    expect(
+      typeSystem.promoteToNonNull(
+        typeParameterTypeNone(bound: stringClassTypeStar),
+      ),
+      typeParameterTypeNone(bound: stringClassTypeNone),
+    );
+  }
+
+  test_promoteToNonNull_void() {
+    expect(
+      typeSystem.promoteToNonNull(voidType),
+      voidType,
+    );
+  }
+
   DartType typeParameterTypeNone({@required DartType bound}) {
-    expect(bound, isNotNull);
     var element = TypeParameterElementImpl.synthetic('T');
     element.bound = bound;
     return TypeParameterTypeImpl(
@@ -3293,7 +3783,6 @@
   }
 
   DartType typeParameterTypeQuestion({@required DartType bound}) {
-    expect(bound, isNotNull);
     var element = TypeParameterElementImpl.synthetic('T');
     element.bound = bound;
     return TypeParameterTypeImpl(
@@ -3303,7 +3792,6 @@
   }
 
   DartType typeParameterTypeStar({@required DartType bound}) {
-    expect(bound, isNotNull);
     var element = TypeParameterElementImpl.synthetic('T');
     element.bound = bound;
     return TypeParameterTypeImpl(
diff --git a/pkg/analyzer/test/id_tests/constant_test.dart b/pkg/analyzer/test/id_tests/constant_test.dart
new file mode 100644
index 0000000..d2d5509
--- /dev/null
+++ b/pkg/analyzer/test/id_tests/constant_test.dart
@@ -0,0 +1,95 @@
+// 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';
+
+import 'package:analyzer/dart/ast/ast.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/analysis/testing_data.dart';
+import 'package:analyzer/src/util/ast_data_extractor.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart';
+
+import '../util/id_testing_helper.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(
+      Platform.script.resolve('../../../front_end/test/constants/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const ConstantsDataComputer(), [analyzerConstantUpdate2018Config]));
+}
+
+class ConstantsDataComputer extends DataComputer<String> {
+  const ConstantsDataComputer();
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+
+  @override
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<String>> actualMap) {
+    ConstantsDataExtractor(unit.declaredElement.source.uri, actualMap)
+        .run(unit);
+  }
+}
+
+class ConstantsDataExtractor extends AstDataExtractor<String> {
+  ConstantsDataExtractor(Uri uri, Map<Id, ActualData<String>> actualMap)
+      : super(uri, actualMap);
+
+  @override
+  String computeNodeValue(Id id, AstNode node) {
+    if (node is Identifier) {
+      var element = node.staticElement;
+      if (element is PropertyAccessorElement && element.isSynthetic) {
+        var variable = element.variable;
+        if (!variable.isSynthetic && variable.isConst) {
+          var value = variable.constantValue;
+          if (value != null) return _stringify(value);
+        }
+      }
+    }
+    return null;
+  }
+
+  String _stringify(DartObject value) {
+    var type = value.type;
+    if (type is InterfaceType) {
+      if (type.isDartCoreNull) return 'Null()';
+      if (type.isDartCoreBool) return 'Bool(${value.toBoolValue()})';
+      if (type.isDartCoreString) return 'String(${value.toStringValue()})';
+      if (type.isDartCoreInt) return 'Int(${value.toIntValue()})';
+      if (type.isDartCoreDouble) return 'Double(${value.toDoubleValue()})';
+      if (type.isDartCoreSymbol) return 'Symbol(${value.toSymbolValue()})';
+      if (type.isDartCoreSet) {
+        var elements = value.toSetValue().map(_stringify).join(',');
+        return 'Set<${type.typeArguments[0]}>($elements)';
+      }
+      if (type.isDartCoreList) {
+        var elements = value.toListValue().map(_stringify).join(',');
+        return 'List<${type.typeArguments[0]}>($elements)';
+      }
+      if (type.isDartCoreMap) {
+        var typeArguments = type.typeArguments.join(',');
+        var elements = value.toMapValue().entries.map((entry) {
+          var key = _stringify(entry.key);
+          var value = _stringify(entry.value);
+          return '$key:$value';
+        }).join(',');
+        return 'Map<$typeArguments>($elements)';
+      }
+    } else if (type is FunctionType) {
+      var element = value.toFunctionValue();
+      return 'Function(${element.name})';
+    }
+    throw UnimplementedError('_stringify for type $type');
+  }
+}
diff --git a/pkg/analyzer/test/id_tests/definite_assignment_test.dart b/pkg/analyzer/test/id_tests/definite_assignment_test.dart
new file mode 100644
index 0000000..9bbd456
--- /dev/null
+++ b/pkg/analyzer/test/id_tests/definite_assignment_test.dart
@@ -0,0 +1,85 @@
+// 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';
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
+import 'package:analyzer/src/util/ast_data_extractor.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart';
+
+import '../util/id_testing_helper.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve(
+      '../../../front_end/test/flow_analysis/definite_assignment/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const _DefiniteAssignmentDataComputer(), [analyzerNnbdConfig]));
+}
+
+class _DefiniteAssignmentDataComputer extends DataComputer<String> {
+  const _DefiniteAssignmentDataComputer();
+
+  @override
+  DataInterpreter<String> get dataValidator =>
+      const _DefiniteAssignmentDataInterpreter();
+
+  @override
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<String>> actualMap) {
+    var flowResult =
+        testingData.uriToFlowAnalysisResult[unit.declaredElement.source.uri];
+    _DefiniteAssignmentDataExtractor(
+            unit.declaredElement.source.uri, actualMap, flowResult)
+        .run(unit);
+  }
+}
+
+class _DefiniteAssignmentDataExtractor extends AstDataExtractor<String> {
+  final FlowAnalysisResult _flowResult;
+
+  _DefiniteAssignmentDataExtractor(
+      Uri uri, Map<Id, ActualData<String>> actualMap, this._flowResult)
+      : super(uri, actualMap);
+
+  @override
+  String computeNodeValue(Id id, AstNode node) {
+    if (node is SimpleIdentifier && node.inGetterContext()) {
+      var element = node.staticElement;
+      if (element is LocalVariableElement || element is ParameterElement) {
+        if (_flowResult.unassignedNodes.contains(node)) {
+          return 'unassigned';
+        }
+      }
+    }
+    return null;
+  }
+}
+
+class _DefiniteAssignmentDataInterpreter implements DataInterpreter<String> {
+  const _DefiniteAssignmentDataInterpreter();
+
+  @override
+  String getText(String actualData) => actualData;
+
+  @override
+  String isAsExpected(String actualData, String expectedData) {
+    if (actualData == expectedData) {
+      return null;
+    } else {
+      return 'Expected $expectedData, got $actualData';
+    }
+  }
+
+  @override
+  bool isEmpty(String actualData) => actualData == null;
+}
diff --git a/pkg/analyzer/test/id_tests/nullability_test.dart b/pkg/analyzer/test/id_tests/nullability_test.dart
new file mode 100644
index 0000000..891d5aa
--- /dev/null
+++ b/pkg/analyzer/test/id_tests/nullability_test.dart
@@ -0,0 +1,107 @@
+// 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';
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type_system.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
+import 'package:analyzer/src/util/ast_data_extractor.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:test/test.dart';
+
+import '../util/id_testing_helper.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script
+      .resolve('../../../front_end/test/flow_analysis/nullability/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest:
+          runTestFor(const _NullabilityDataComputer(), [analyzerNnbdConfig]));
+}
+
+class FlowTestBase {
+  FlowAnalysisResult flowResult;
+
+  /// Resolve the given [code] and track nullability in the unit.
+  Future<void> trackCode(String code) async {
+    if (await checkTests(
+        code,
+        const _NullabilityDataComputer(),
+        FeatureSet.forTesting(
+            sdkVersion: '2.2.2', additionalFeatures: [Feature.non_nullable]))) {
+      fail('Failure(s)');
+    }
+  }
+}
+
+class _NullabilityDataComputer extends DataComputer<String> {
+  const _NullabilityDataComputer();
+
+  @override
+  DataInterpreter<String> get dataValidator =>
+      const _NullabilityDataInterpreter();
+
+  @override
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<String>> actualMap) {
+    _NullabilityDataExtractor(unit.declaredElement.source.uri, actualMap,
+            unit.declaredElement.context.typeSystem)
+        .run(unit);
+  }
+}
+
+class _NullabilityDataExtractor extends AstDataExtractor<String> {
+  final TypeSystem _typeSystem;
+
+  _NullabilityDataExtractor(
+      Uri uri, Map<Id, ActualData<String>> actualMap, this._typeSystem)
+      : super(uri, actualMap);
+
+  @override
+  String computeNodeValue(Id id, AstNode node) {
+    if (node is SimpleIdentifier && node.inGetterContext()) {
+      var element = node.staticElement;
+      if (element is LocalVariableElement || element is ParameterElement) {
+        TypeImpl promotedType = node.staticType;
+        TypeImpl declaredType = (element as VariableElement).type;
+        var isPromoted = promotedType != declaredType;
+        if (isPromoted &&
+            _typeSystem.isNullable(declaredType) &&
+            !_typeSystem.isNullable(promotedType)) {
+          return 'nonNullable';
+        }
+      }
+    }
+    return null;
+  }
+}
+
+class _NullabilityDataInterpreter implements DataInterpreter<String> {
+  const _NullabilityDataInterpreter();
+
+  @override
+  String getText(String actualData) => actualData;
+
+  @override
+  String isAsExpected(String actualData, String expectedData) {
+    if (actualData == expectedData) {
+      return null;
+    } else {
+      return 'Expected $expectedData, got $actualData';
+    }
+  }
+
+  @override
+  bool isEmpty(String actualData) => actualData.isEmpty;
+}
diff --git a/pkg/analyzer/test/id_tests/reachability_test.dart b/pkg/analyzer/test/id_tests/reachability_test.dart
new file mode 100644
index 0000000..6013f56
--- /dev/null
+++ b/pkg/analyzer/test/id_tests/reachability_test.dart
@@ -0,0 +1,129 @@
+// 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';
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
+import 'package:analyzer/src/util/ast_data_extractor.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:test/test.dart';
+
+import '../util/id_testing_helper.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script
+      .resolve('../../../front_end/test/flow_analysis/reachability/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest:
+          runTestFor(const _ReachabilityDataComputer(), [analyzerNnbdConfig]));
+}
+
+class FlowTestBase {
+  FlowAnalysisResult flowResult;
+
+  /// Resolve the given [code] and track nullability in the unit.
+  Future<void> trackCode(String code) async {
+    if (await checkTests(
+        code,
+        const _ReachabilityDataComputer(),
+        FeatureSet.forTesting(
+            sdkVersion: '2.2.2', additionalFeatures: [Feature.non_nullable]))) {
+      fail('Failure(s)');
+    }
+  }
+}
+
+enum _ReachabilityAssertion {
+  doesNotComplete,
+  unreachable,
+}
+
+class _ReachabilityDataComputer
+    extends DataComputer<Set<_ReachabilityAssertion>> {
+  const _ReachabilityDataComputer();
+
+  @override
+  DataInterpreter<Set<_ReachabilityAssertion>> get dataValidator =>
+      const _ReachabilityDataInterpreter();
+
+  @override
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap) {
+    var flowResult =
+        testingData.uriToFlowAnalysisResult[unit.declaredElement.source.uri];
+    _ReachabilityDataExtractor(
+            unit.declaredElement.source.uri, actualMap, flowResult)
+        .run(unit);
+  }
+}
+
+class _ReachabilityDataExtractor
+    extends AstDataExtractor<Set<_ReachabilityAssertion>> {
+  final FlowAnalysisResult _flowResult;
+
+  _ReachabilityDataExtractor(
+      Uri uri,
+      Map<Id, ActualData<Set<_ReachabilityAssertion>>> actualMap,
+      this._flowResult)
+      : super(uri, actualMap);
+
+  @override
+  Set<_ReachabilityAssertion> computeNodeValue(Id id, AstNode node) {
+    Set<_ReachabilityAssertion> result = {};
+    if (_flowResult.unreachableNodes.contains(node)) {
+      result.add(_ReachabilityAssertion.unreachable);
+    }
+    if (node is FunctionDeclaration) {
+      var body = node.functionExpression.body;
+      if (body != null &&
+          _flowResult.functionBodiesThatDontComplete.contains(body)) {
+        result.add(_ReachabilityAssertion.doesNotComplete);
+      }
+    }
+    return result.isEmpty ? null : result;
+  }
+}
+
+class _ReachabilityDataInterpreter
+    implements DataInterpreter<Set<_ReachabilityAssertion>> {
+  const _ReachabilityDataInterpreter();
+
+  @override
+  String getText(Set<_ReachabilityAssertion> actualData) =>
+      _sortedRepresentation(_toStrings(actualData));
+
+  @override
+  String isAsExpected(
+      Set<_ReachabilityAssertion> actualData, String expectedData) {
+    var actualStrings = _toStrings(actualData);
+    var actualSorted = _sortedRepresentation(actualStrings);
+    var expectedSorted = _sortedRepresentation(expectedData?.split(','));
+    if (actualSorted == expectedSorted) {
+      return null;
+    } else {
+      return 'Expected $expectedData, got $actualSorted';
+    }
+  }
+
+  @override
+  bool isEmpty(Set<_ReachabilityAssertion> actualData) => actualData.isEmpty;
+
+  String _sortedRepresentation(Iterable<String> values) {
+    var list = values == null || values.isEmpty ? ['none'] : values.toList();
+    list.sort();
+    return list.join(',');
+  }
+
+  List<String> _toStrings(Set<_ReachabilityAssertion> actualData) => actualData
+      .map((flowAssertion) => flowAssertion.toString().split('.')[1])
+      .toList();
+}
diff --git a/pkg/analyzer/test/id_tests/type_promotion_test.dart b/pkg/analyzer/test/id_tests/type_promotion_test.dart
new file mode 100644
index 0000000..059c251
--- /dev/null
+++ b/pkg/analyzer/test/id_tests/type_promotion_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 'dart:io';
+
+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/analysis/testing_data.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/util/ast_data_extractor.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart';
+
+import '../util/id_testing_helper.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script
+      .resolve('../../../front_end/test/flow_analysis/type_promotion/data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest:
+          runTestFor(const _TypePromotionDataComputer(), [analyzerNnbdConfig]));
+}
+
+class _TypePromotionDataComputer extends DataComputer<DartType> {
+  const _TypePromotionDataComputer();
+
+  @override
+  DataInterpreter<DartType> get dataValidator =>
+      const _TypePromotionDataInterpreter();
+
+  @override
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<DartType>> actualMap) {
+    _TypePromotionDataExtractor(unit.declaredElement.source.uri, actualMap)
+        .run(unit);
+  }
+}
+
+class _TypePromotionDataExtractor extends AstDataExtractor<DartType> {
+  _TypePromotionDataExtractor(Uri uri, Map<Id, ActualData<DartType>> actualMap)
+      : super(uri, actualMap);
+
+  @override
+  DartType computeNodeValue(Id id, AstNode node) {
+    if (node is SimpleIdentifier && node.inGetterContext()) {
+      var element = node.staticElement;
+      if (element is LocalVariableElement || element is ParameterElement) {
+        TypeImpl promotedType = node.staticType;
+        TypeImpl declaredType = (element as VariableElement).type;
+        var isPromoted = promotedType != declaredType;
+        if (isPromoted) {
+          return promotedType;
+        }
+      }
+    }
+    return null;
+  }
+}
+
+class _TypePromotionDataInterpreter implements DataInterpreter<DartType> {
+  const _TypePromotionDataInterpreter();
+
+  @override
+  String getText(DartType actualData) => actualData.toString();
+
+  @override
+  String isAsExpected(DartType actualData, String expectedData) {
+    if (actualData.toString() == expectedData) {
+      return null;
+    } else {
+      return 'Expected $expectedData, got $actualData';
+    }
+  }
+
+  @override
+  bool isEmpty(DartType actualData) => actualData == null;
+}
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 40d5bc6..0d03acf 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -100,10 +100,25 @@
   }
 
   void assertMember(
-      Expression node, String expectedDefiningType, Element expectedBase) {
+    Expression node,
+    Element expectedBase,
+    Map<String, String> expectedSubstitution,
+  ) {
     Member actual = getNodeElement(node);
-    expect(actual.definingType.toString(), expectedDefiningType);
+    assertMember2(actual, expectedBase, expectedSubstitution);
+  }
+
+  void assertMember2(
+    Member actual,
+    Element expectedBase,
+    Map<String, String> expectedSubstitution,
+  ) {
     expect(actual.baseElement, same(expectedBase));
+
+    var actualMapString = actual.substitution.map.map(
+      (k, v) => MapEntry(k.name, '$v'),
+    );
+    expect(actualMapString, expectedSubstitution);
   }
 
   void assertTopGetRef(String search, String name) {
@@ -1492,8 +1507,7 @@
       ConstructorElement element = constructor.declaredElement;
 
       ConstructorMember actualMember = element.redirectedConstructor;
-      expect(actualMember.baseElement, same(expectedElement));
-      expect(actualMember.definingType, auType);
+      assertMember2(actualMember, expectedElement, {'T': 'U'});
 
       var constructorName = constructor.redirectedConstructor;
       expect(constructorName.staticElement, same(actualMember));
@@ -1515,8 +1529,7 @@
       ConstructorElement element = constructor.declaredElement;
 
       ConstructorMember actualMember = element.redirectedConstructor;
-      expect(actualMember.baseElement, same(expectedElement));
-      expect(actualMember.definingType, auType);
+      assertMember2(actualMember, expectedElement, {'T': 'U'});
 
       var constructorName = constructor.redirectedConstructor;
       expect(constructorName.staticElement, same(actualMember));
@@ -1876,13 +1889,13 @@
 
     {
       var fRef = findNode.simple('f; // ref');
-      assertMember(fRef, 'C<int>', findElement.getter('f'));
+      assertMember(fRef, findElement.getter('f'), {'T': 'int'});
       assertType(fRef, 'int');
     }
 
     {
       var fRef = findNode.simple('f = 1;');
-      assertMember(fRef, 'C<int>', findElement.setter('f'));
+      assertMember(fRef, findElement.setter('f'), {'T': 'int'});
       assertType(fRef, 'int');
     }
   }
@@ -2551,7 +2564,7 @@
     {
       var creation = findNode.instanceCreation('new C<int, double>(1, 2.3);');
 
-      assertMember(creation, 'C<int, double>', defaultConstructor);
+      assertMember(creation, defaultConstructor, {'K': 'int', 'V': 'double'});
       assertType(creation, 'C<int, double>');
 
       var typeName = creation.constructorName.type;
@@ -2570,7 +2583,7 @@
     {
       var creation = findNode.instanceCreation('new C<num, String>.named');
 
-      assertMember(creation, 'C<num, String>', namedConstructor);
+      assertMember(creation, namedConstructor, {'K': 'num', 'V': 'String'});
       assertType(creation, 'C<num, String>');
 
       var typeName = creation.constructorName.type;
@@ -2581,7 +2594,8 @@
       assertTypeName(typeArguments[1], stringElement, 'String');
 
       var constructorName = creation.constructorName.name;
-      assertMember(constructorName, 'C<num, String>', namedConstructor);
+      assertMember(
+          constructorName, namedConstructor, {'K': 'num', 'V': 'String'});
       assertType(constructorName, null);
 
       var argument = creation.argumentList.arguments[0];
@@ -5392,6 +5406,11 @@
     expect(invocation.staticInvokeType.toString(), invokeTypeStr);
   }
 
+  @FailingTest(
+      reason: 'This test started failing, because we probably assign '
+          'corresponding parameter elements from FunctionType, which became '
+          'pure in this CL. We should clean this up by using MethodMember '
+          'parameters instead.')
   test_methodInvocation_instanceMethod_genericClass() async {
     addTestFile(r'''
 main() {
@@ -5412,7 +5431,8 @@
       assertType(invocation, 'void');
       assertInvokeType(invocation, invokeTypeStr);
 
-      assertMember(invocation.methodName, 'C<int, double>', mElement);
+      assertMember(
+          invocation.methodName, mElement, {'T': 'int', 'U': 'double'});
       assertType(invocation.methodName, invokeTypeStr);
 
       _assertArgumentToParameter(arguments[0], mElement.parameters[0]);
@@ -5420,7 +5440,8 @@
   }
 
   test_methodInvocation_instanceMethod_genericClass_genericMethod() async {
-    addTestFile(r'''
+    try {
+      addTestFile(r'''
 main() {
   new C<int>().m(1, 2.3);
 }
@@ -5428,26 +5449,40 @@
   Map<T, U> m<U>(T a, U b) => null;
 }
 ''');
-    await resolveTestFile();
-    MethodElement mElement = findElement.method('m');
+      await resolveTestFile();
+      MethodElement mElement = findElement.method('m');
 
-    {
-      var invocation = findNode.methodInvocation('m(1, 2.3)');
-      List<Expression> arguments = invocation.argumentList.arguments;
+      {
+        var invocation = findNode.methodInvocation('m(1, 2.3)');
+        List<Expression> arguments = invocation.argumentList.arguments;
 
-      var invokeTypeStr = 'Map<int, double> Function(int, double)';
-      assertType(invocation, 'Map<int, double>');
-      assertInvokeType(invocation, invokeTypeStr);
+        var invokeTypeStr = 'Map<int, double> Function(int, double)';
+        assertType(invocation, 'Map<int, double>');
+        assertInvokeType(invocation, invokeTypeStr);
 
-      assertMember(invocation.methodName, 'C<int>', mElement);
-      assertType(invocation.methodName, 'Map<int, U> Function<U>(int, U)');
+        assertMember(invocation.methodName, mElement, {'T': 'int'});
+        assertType(invocation.methodName, 'Map<int, U> Function<U>(int, U)');
 
+        if (AnalysisDriver.useSummary2) {
+          _assertArgumentToParameter2(arguments[0], 'int');
+          _assertArgumentToParameter2(arguments[1], 'double');
+        } else {
+          _assertArgumentToParameter(arguments[0], mElement.parameters[0]);
+          _assertArgumentToParameter(arguments[1], mElement.parameters[1]);
+        }
+      }
+      if (!AnalysisDriver.useSummary2) {
+        throw 'Test passed - expected to fail.';
+      }
+    } on String {
+      rethrow;
+    } catch (_) {
+      // This test started failing in summary1, because we assign
+      // corresponding parameter elements from FunctionType, which became
+      // structural, and does not know its element anymore.
+      // We should fix this up by using MethodMember parameters instead.
       if (AnalysisDriver.useSummary2) {
-        _assertArgumentToParameter2(arguments[0], 'int');
-        _assertArgumentToParameter2(arguments[1], 'double');
-      } else {
-        _assertArgumentToParameter(arguments[0], mElement.parameters[0]);
-        _assertArgumentToParameter(arguments[1], mElement.parameters[1]);
+        rethrow;
       }
     }
   }
@@ -5932,7 +5967,7 @@
 
     {
       var creation = findNode.instanceCreation('C<int>(); // ref');
-      assertMember(creation, 'C<int>', c.unnamedConstructor);
+      assertMember(creation, c.unnamedConstructor, {'T': 'int'});
       assertType(creation, 'C<int>');
 
       assertTypeName(creation.constructorName.type, c, 'C<int>');
@@ -5942,14 +5977,14 @@
     {
       var creation = findNode.instanceCreation('C<String>.named(); // ref');
       var namedConstructor = c.getNamedConstructor('named');
-      assertMember(creation, 'C<String>', namedConstructor);
+      assertMember(creation, namedConstructor, {'T': 'String'});
       assertType(creation, 'C<String>');
 
       assertTypeName(creation.constructorName.type, c, 'C<String>');
       assertTypeName(findNode.typeName('String>'), stringElement, 'String');
 
       assertMember(
-          creation.constructorName.name, 'C<String>', namedConstructor);
+          creation.constructorName.name, namedConstructor, {'T': 'String'});
     }
   }
 
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
index eac7525..dcc2fad 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_test.dart
@@ -15,7 +15,6 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
 import 'package:analyzer/src/dart/analysis/status.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/dart/constant/evaluation.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/error/codes.dart';
@@ -2228,102 +2227,6 @@
     expect(await driver.getSourceKind(path), SourceKind.PART);
   }
 
-  test_getTopLevelNameDeclarations() async {
-    var a = convertPath('/test/lib/a.dart');
-    var b = convertPath('/test/lib/b.dart');
-    var c = convertPath('/test/lib/c.dart');
-    var d = convertPath('/test/lib/d.dart');
-
-    newFile(a, content: 'class A {}');
-    newFile(b, content: 'export "a.dart"; class B {}');
-    newFile(c, content: 'import "d.dart"; class C {}');
-    newFile(d, content: 'class D {}');
-
-    driver.addFile(a);
-    driver.addFile(b);
-    driver.addFile(c);
-    // Don't add d.dart, it is referenced implicitly.
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('A'), [a, b], [false, true]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('B'), [b], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('C'), [c], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('D'), [d], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('X'), [], []);
-  }
-
-  test_getTopLevelNameDeclarations_discover() async {
-    var t = convertPath('/test/lib/test.dart');
-    var a1 = convertPath('/aaa/lib/a1.dart');
-    var a2 = convertPath('/aaa/lib/src/a2.dart');
-    var b = convertPath('/bbb/lib/b.dart');
-    var c = convertPath('/ccc/lib/c.dart');
-
-    newFile(t, content: 'class T {}');
-    newFile(a1, content: 'class A1 {}');
-    newFile(a2, content: 'class A2 {}');
-    newFile(b, content: 'class B {}');
-    newFile(c, content: 'class C {}');
-
-    driver.addFile(t);
-    // Don't add a1.dart, a2.dart, or b.dart - they should be discovered.
-    // And c.dart is not in .packages, so should not be discovered.
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('T'), [t], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('A1'), [a1], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('A2'), [a2], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('B'), [b], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('C'), [], []);
-  }
-
-  test_getTopLevelNameDeclarations_parts() async {
-    var a = convertPath('/test/lib/a.dart');
-    var b = convertPath('/test/lib/b.dart');
-    var c = convertPath('/test/lib/c.dart');
-
-    newFile(a, content: r'''
-library lib;
-part 'b.dart';
-part 'c.dart';
-class A {}
-''');
-    newFile(b, content: 'part of lib; class B {}');
-    newFile(c, content: 'part of lib; class C {}');
-
-    driver.addFile(a);
-    driver.addFile(b);
-    driver.addFile(c);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('A'), [a], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('B'), [a], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('C'), [a], [false]);
-
-    _assertTopLevelDeclarations(
-        await driver.getTopLevelNameDeclarations('X'), [], []);
-  }
-
   test_getUnitElement() async {
     String content = r'''
 foo(int p) {}
@@ -3513,20 +3416,6 @@
     }
   }
 
-  void _assertTopLevelDeclarations(
-      List<TopLevelDeclarationInSource> declarations,
-      List<String> expectedFiles,
-      List<bool> expectedIsExported) {
-    expect(expectedFiles, hasLength(expectedIsExported.length));
-    for (int i = 0; i < expectedFiles.length; i++) {
-      expect(declarations,
-          contains(predicate((TopLevelDeclarationInSource declaration) {
-        return declaration.source.fullName == expectedFiles[i] &&
-            declaration.isExported == expectedIsExported[i];
-      })));
-    }
-  }
-
   void _expectCircularityError(EvaluationResultImpl evaluationResult) {
     expect(evaluationResult, isNotNull);
     expect(evaluationResult.value, isNull);
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 98a279e..0eb6a6e 100644
--- a/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/file_state_test.dart
@@ -11,7 +11,6 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/library_graph.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/analysis/top_level_declaration.dart';
 import 'package:analyzer/src/file_system/file_system.dart';
 import 'package:analyzer/src/generated/engine.dart'
     show AnalysisOptions, AnalysisOptionsImpl;
@@ -105,249 +104,6 @@
         unorderedEquals(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H']));
   }
 
-  test_exportedTopLevelDeclarations_cycle() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    String c = convertPath('/aaa/lib/c.dart');
-    newFile(a, content: r'''
-export 'b.dart';
-class A {}
-''');
-    newFile(b, content: r'''
-export 'c.dart';
-class B {}
-''');
-    newFile(c, content: r'''
-export 'a.dart';
-class C {}
-''');
-    _assertExportedTopLevelDeclarations(a, ['A', 'B', 'C']);
-
-    // We asked for 'a', and it was computed.
-    // But 'b' and 'c' are not computed, because we detect that there is
-    // cycle with 'a', so we cannot get all exported declarations of 'a'.
-    _assertHasComputedExportedDeclarations([a]);
-  }
-
-  test_exportedTopLevelDeclarations_cycle_anotherOutsideCycle() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    String c = convertPath('/aaa/lib/c.dart');
-    String d = convertPath('/aaa/lib/d.dart');
-    newFile(a, content: r'''
-export 'b.dart';
-class A {}
-''');
-    newFile(b, content: r'''
-export 'c.dart';
-class B {}
-''');
-    newFile(c, content: r'''
-export 'b.dart';
-export 'd.dart';
-class C {}
-''');
-    newFile(d, content: r'''
-class D {}
-''');
-    _assertExportedTopLevelDeclarations(a, ['A', 'B', 'C', 'D']);
-
-    // To compute 'a' we compute 'b'.
-    // But 'c' is not computed, because of the cycle [b, c].
-    // However 'd' is not a part of a cycle, so it is computed too.
-    _assertHasComputedExportedDeclarations([a, b, d]);
-  }
-
-  test_exportedTopLevelDeclarations_cycle_onSequence() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    String c = convertPath('/aaa/lib/c.dart');
-    String d = convertPath('/aaa/lib/d.dart');
-    String e = convertPath('/aaa/lib/e.dart');
-    newFile(a, content: r'''
-export 'b.dart';
-class A {}
-''');
-    newFile(b, content: r'''
-export 'c.dart';
-class B {}
-''');
-    newFile(c, content: r'''
-export 'd.dart';
-class C {}
-''');
-    newFile(d, content: r'''
-export 'e.dart';
-class D {}
-''');
-    newFile(e, content: r'''
-export 'c.dart';
-class E {}
-''');
-    // We compute 'a'.
-    // To compute it we also compute 'b' and 'c'.
-    // But 'd' and 'e' are not computed, because of the cycle [c, d, e].
-    _assertExportedTopLevelDeclarations(a, ['A', 'B', 'C', 'D', 'E']);
-    _assertHasComputedExportedDeclarations([a, b, c]);
-
-    // We compute 'd', and try to compute 'e', because 'd' needs 'e'; 'e' can
-    // be computed because 'c' is ready, so the cycle [c, d, e] is broken.
-    _assertExportedTopLevelDeclarations(d, ['C', 'D', 'E']);
-    _assertHasComputedExportedDeclarations([a, b, c, d, e]);
-  }
-
-  test_exportedTopLevelDeclarations_export() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class A {}
-''');
-    newFile(b, content: r'''
-export 'a.dart';
-class B {}
-''');
-    _assertExportedTopLevelDeclarations(b, ['A', 'B']);
-    _assertHasComputedExportedDeclarations([a, b]);
-  }
-
-  test_exportedTopLevelDeclarations_export2_show() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    String c = convertPath('/aaa/lib/c.dart');
-    newFile(a, content: r'''
-class A1 {}
-class A2 {}
-class A3 {}
-''');
-    newFile(b, content: r'''
-export 'a.dart' show A1, A2;
-class B1 {}
-class B2 {}
-''');
-    newFile(c, content: r'''
-export 'b.dart' show A2, A3, B1;
-class C {}
-''');
-    _assertExportedTopLevelDeclarations(c, ['A2', 'B1', 'C']);
-    _assertHasComputedExportedDeclarations([a, b, c]);
-  }
-
-  test_exportedTopLevelDeclarations_export_flushOnChange() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class A {}
-''');
-    newFile(b, content: r'''
-export 'a.dart';
-class B {}
-''');
-
-    // Initial exported declarations.
-    _assertExportedTopLevelDeclarations(b, ['A', 'B']);
-
-    // Update a.dart, so a.dart and b.dart exported declarations are flushed.
-    newFile(a, content: 'class A {} class A2 {}');
-    fileSystemState.getFileForPath(a).refresh();
-    _assertExportedTopLevelDeclarations(b, ['A', 'A2', 'B']);
-  }
-
-  test_exportedTopLevelDeclarations_export_hide() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class A1 {}
-class A2 {}
-class A3 {}
-''');
-    newFile(b, content: r'''
-export 'a.dart' hide A2;
-class B {}
-''');
-    _assertExportedTopLevelDeclarations(b, ['A1', 'A3', 'B']);
-  }
-
-  test_exportedTopLevelDeclarations_export_preferLocal() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class V {}
-''');
-    newFile(b, content: r'''
-export 'a.dart';
-int V;
-''');
-    FileState file = fileSystemState.getFileForPath(b);
-    Map<String, TopLevelDeclaration> declarations =
-        file.exportedTopLevelDeclarations;
-    expect(declarations.keys, unorderedEquals(['V']));
-    expect(declarations['V'].kind, TopLevelDeclarationKind.variable);
-  }
-
-  test_exportedTopLevelDeclarations_export_show() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class A1 {}
-class A2 {}
-''');
-    newFile(b, content: r'''
-export 'a.dart' show A2;
-class B {}
-''');
-    _assertExportedTopLevelDeclarations(b, ['A2', 'B']);
-  }
-
-  test_exportedTopLevelDeclarations_export_show2() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    String c = convertPath('/aaa/lib/c.dart');
-    String d = convertPath('/aaa/lib/d.dart');
-    newFile(a, content: r'''
-export 'b.dart' show Foo;
-export 'c.dart' show Bar;
-''');
-    newFile(b, content: r'''
-export 'd.dart';
-''');
-    newFile(c, content: r'''
-export 'd.dart';
-''');
-    newFile(d, content: r'''
-class Foo {}
-class Bar {}
-''');
-    _assertExportedTopLevelDeclarations(a, ['Foo', 'Bar']);
-  }
-
-  test_exportedTopLevelDeclarations_import() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String b = convertPath('/aaa/lib/b.dart');
-    newFile(a, content: r'''
-class A {}
-''');
-    newFile(b, content: r'''
-import 'a.dart';
-class B {}
-''');
-    _assertExportedTopLevelDeclarations(b, ['B']);
-  }
-
-  test_exportedTopLevelDeclarations_parts() {
-    String a = convertPath('/aaa/lib/a.dart');
-    String a2 = convertPath('/aaa/lib/a2.dart');
-    newFile(a, content: r'''
-library lib;
-part 'a2.dart';
-class A1 {}
-''');
-    newFile(a2, content: r'''
-part of lib;
-class A2 {}
-''');
-    _assertExportedTopLevelDeclarations(a, ['A1', 'A2']);
-  }
-
   test_getFileForPath_doesNotExist() {
     String path = convertPath('/aaa/lib/a.dart');
     FileState file = fileSystemState.getFileForPath(path);
@@ -841,52 +597,6 @@
     expect(file.referencedNames, unorderedEquals(['A', 'B', 'C', 'D']));
   }
 
-  test_topLevelDeclarations() {
-    String path = convertPath('/aaa/lib/a.dart');
-    newFile(path, content: r'''
-class C {}
-typedef F();
-enum E {E1, E2}
-mixin M {}
-void f() {}
-var V1;
-get V2 => null;
-set V3(_) {}
-get V4 => null;
-set V4(_) {}
-
-class _C {}
-typedef _F();
-enum _E {E1, E2}
-mixin _M {}
-void _f() {}
-var _V1;
-get _V2 => null;
-set _V3(_) {}
-''');
-    FileState file = fileSystemState.getFileForPath(path);
-
-    Map<String, TopLevelDeclaration> declarations = file.topLevelDeclarations;
-
-    void assertHas(String name, TopLevelDeclarationKind kind) {
-      expect(declarations[name]?.kind, kind);
-    }
-
-    expect(
-      declarations.keys,
-      unorderedEquals(['C', 'F', 'E', 'M', 'f', 'V1', 'V2', 'V3', 'V4']),
-    );
-    assertHas('C', TopLevelDeclarationKind.type);
-    assertHas('F', TopLevelDeclarationKind.type);
-    assertHas('E', TopLevelDeclarationKind.type);
-    assertHas('M', TopLevelDeclarationKind.type);
-    assertHas('f', TopLevelDeclarationKind.function);
-    assertHas('V1', TopLevelDeclarationKind.variable);
-    assertHas('V2', TopLevelDeclarationKind.variable);
-    assertHas('V3', TopLevelDeclarationKind.variable);
-    assertHas('V4', TopLevelDeclarationKind.variable);
-  }
-
   test_transitiveSignature() {
     String pa = convertPath('/aaa/lib/a.dart');
     String pb = convertPath('/aaa/lib/b.dart');
@@ -947,24 +657,11 @@
     expect(bSignature, isNot(aSignature));
   }
 
-  void _assertExportedTopLevelDeclarations(String path, List<String> expected) {
-    FileState file = fileSystemState.getFileForPath(path);
-    Map<String, TopLevelDeclaration> declarations =
-        file.exportedTopLevelDeclarations;
-    expect(declarations.keys, unorderedEquals(expected));
-  }
-
   void _assertFilesWithoutLibraryCycle(List<FileState> expected) {
     var actual = fileSystemState.test.filesWithoutLibraryCycle;
     expect(_excludeSdk(actual), unorderedEquals(expected));
   }
 
-  void _assertHasComputedExportedDeclarations(List<String> expectedPathList) {
-    FileSystemStateTestView test = fileSystemState.test;
-    expect(test.librariesWithComputedExportedDeclarations.map((f) => f.path),
-        unorderedEquals(expectedPathList));
-  }
-
   void _assertIsUnresolvedFile(FileState file) {
     expect(file.path, isNull);
     expect(file.uri, isNull);
diff --git a/pkg/analyzer/test/src/dart/analysis/index_test.dart b/pkg/analyzer/test/src/dart/analysis/index_test.dart
index 56fb0c4..df9540b 100644
--- a/pkg/analyzer/test/src/dart/analysis/index_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/index_test.dart
@@ -872,6 +872,13 @@
 ''');
   }
 
+  test_isReferencedBy_NeverElement() async {
+    await _indexTestUnit('''
+Never f() {
+}''');
+    expect(index.usedElementOffsets, isEmpty);
+  }
+
   test_isReferencedBy_ParameterElement() async {
     await _indexTestUnit('''
 foo({var p}) {}
diff --git a/pkg/analyzer/test/src/dart/analysis/search_test.dart b/pkg/analyzer/test/src/dart/analysis/search_test.dart
index e0f2b7d..ac142d0 100644
--- a/pkg/analyzer/test/src/dart/analysis/search_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/search_test.dart
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:collection';
 
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/dart/ast/ast.dart' hide Declaration;
@@ -119,428 +118,6 @@
         unorderedEquals([a.methods[0], b.fields[0]]));
   }
 
-  test_declarations_class() async {
-    await _resolveTestUnit('''
-class C {
-  int f;
-  C();
-  C.named();
-  int get g => 0;
-  void set s(_) {}
-  void m() {}
-}
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'C', DeclarationKind.CLASS,
-        offset: 6, codeOffset: 0, codeLength: 91);
-    _assertHasDeclaration(declarations, 'f', DeclarationKind.FIELD,
-        offset: 16, codeOffset: 12, codeLength: 5, className: 'C');
-    _assertHasDeclaration(declarations, '', DeclarationKind.CONSTRUCTOR,
-        offset: 21, codeOffset: 21, codeLength: 4, className: 'C');
-    _assertHasDeclaration(declarations, 'named', DeclarationKind.CONSTRUCTOR,
-        offset: 30, codeOffset: 28, codeLength: 10, className: 'C');
-    _assertHasDeclaration(declarations, 'g', DeclarationKind.GETTER,
-        offset: 49, codeOffset: 41, codeLength: 15, className: 'C');
-    _assertHasDeclaration(declarations, 's', DeclarationKind.SETTER,
-        offset: 68, codeOffset: 59, codeLength: 16, className: 'C');
-    _assertHasDeclaration(declarations, 'm', DeclarationKind.METHOD,
-        offset: 83, codeOffset: 78, codeLength: 11, className: 'C');
-  }
-
-  test_declarations_discover() async {
-    var t = convertPath('/test/lib/t.dart');
-    var a = convertPath('/aaa/lib/a.dart');
-    var b = convertPath('/bbb/lib/b.dart');
-    var c = convertPath('/ccc/lib/c.dart');
-
-    newFile(t, content: 'class T {}');
-    newFile(a, content: 'class A {}');
-    newFile(b, content: 'class B {}');
-    newFile(c, content: 'class C {}');
-
-    driver.addFile(t);
-
-    var files = new LinkedHashSet<String>();
-    var declarations = await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'T', DeclarationKind.CLASS);
-    _assertHasDeclaration(declarations, 'A', DeclarationKind.CLASS);
-    _assertHasDeclaration(declarations, 'B', DeclarationKind.CLASS);
-    _assertNoDeclaration(declarations, 'C');
-  }
-
-  test_declarations_duplicateFile() async {
-    var a = convertPath('/test/lib/a.dart');
-    var b = convertPath('/test/lib/b.dart');
-
-    newFile(a, content: 'class A {}');
-    newFile(b, content: 'class B {}');
-
-    driver.addFile(a);
-    driver.addFile(b);
-
-    var files = new LinkedHashSet<String>();
-    files.add(b);
-
-    var declarations = await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'A', DeclarationKind.CLASS);
-    _assertNoDeclaration(declarations, 'B');
-  }
-
-  test_declarations_enum() async {
-    await _resolveTestUnit('''
-enum E {
-  a, bb, ccc
-}
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'E', DeclarationKind.ENUM,
-        offset: 5, codeOffset: 0, codeLength: 23);
-    _assertHasDeclaration(declarations, 'a', DeclarationKind.ENUM_CONSTANT,
-        offset: 11, codeOffset: 11, codeLength: 1);
-    _assertHasDeclaration(declarations, 'bb', DeclarationKind.ENUM_CONSTANT,
-        offset: 14, codeOffset: 14, codeLength: 2);
-    _assertHasDeclaration(declarations, 'ccc', DeclarationKind.ENUM_CONSTANT,
-        offset: 18, codeOffset: 18, codeLength: 3);
-  }
-
-  test_declarations_maxResults() async {
-    await _resolveTestUnit('''
-class A {}
-class B {}
-class C {}
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, 2, files);
-    expect(declarations, hasLength(2));
-  }
-
-  test_declarations_mixin() async {
-    await _resolveTestUnit('''
-mixin M {
-  int f;
-  int get g => 0;
-  void set s(_) {}
-  void m() {}
-}
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'M', DeclarationKind.MIXIN,
-        offset: 6, codeOffset: 0, codeLength: 71);
-    _assertHasDeclaration(declarations, 'f', DeclarationKind.FIELD,
-        offset: 16, codeOffset: 12, codeLength: 5, mixinName: 'M');
-    _assertHasDeclaration(declarations, 'g', DeclarationKind.GETTER,
-        offset: 29, codeOffset: 21, codeLength: 15, mixinName: 'M');
-    _assertHasDeclaration(declarations, 's', DeclarationKind.SETTER,
-        offset: 48, codeOffset: 39, codeLength: 16, mixinName: 'M');
-    _assertHasDeclaration(declarations, 'm', DeclarationKind.METHOD,
-        offset: 63, codeOffset: 58, codeLength: 11, mixinName: 'M');
-  }
-
-  test_declarations_onlyForFile() async {
-    var a = convertPath('/test/lib/a.dart');
-    var b = convertPath('/test/lib/b.dart');
-    newFile(a, content: 'class A {}');
-    newFile(b, content: 'class B {}');
-
-    driver.addFile(a);
-    driver.addFile(b);
-
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files, onlyForFile: b);
-
-    expect(files, [b]);
-
-    _assertNoDeclaration(declarations, 'A');
-    _assertHasDeclaration(declarations, 'B', DeclarationKind.CLASS);
-  }
-
-  test_declarations_parameters() async {
-    await _resolveTestUnit('''
-class C {
-  int get g => 0;
-  void m(int a, double b) {}
-}
-void f(bool a, String b) {}
-typedef F(int a);
-typedef T F2<T, U>(U a);
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-
-    Declaration declaration;
-
-    declaration =
-        _assertHasDeclaration(declarations, 'C', DeclarationKind.CLASS);
-    expect(declaration.parameters, isNull);
-
-    declaration = _assertHasDeclaration(
-        declarations, 'g', DeclarationKind.GETTER,
-        className: 'C');
-    expect(declaration.parameters, isNull);
-
-    declaration = _assertHasDeclaration(
-        declarations, 'm', DeclarationKind.METHOD,
-        className: 'C');
-    expect(declaration.parameters, '(int a, double b)');
-
-    declaration =
-        _assertHasDeclaration(declarations, 'f', DeclarationKind.FUNCTION);
-    expect(declaration.parameters, '(bool a, String b)');
-
-    declaration = _assertHasDeclaration(
-        declarations, 'F', DeclarationKind.FUNCTION_TYPE_ALIAS);
-    expect(declaration.parameters, '(int a)');
-
-    declaration = _assertHasDeclaration(
-        declarations, 'F2', DeclarationKind.FUNCTION_TYPE_ALIAS);
-    expect(declaration.parameters, '(U a)');
-  }
-
-  test_declarations_parameters_functionTyped() async {
-    await _resolveTestUnit('''
-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 files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-
-    Declaration declaration;
-
-    declaration =
-        _assertHasDeclaration(declarations, 'f1', DeclarationKind.FUNCTION);
-    expect(declaration.parameters, '(bool a(int b, String c))');
-
-    declaration =
-        _assertHasDeclaration(declarations, 'f2', DeclarationKind.FUNCTION);
-    expect(declaration.parameters, '(a(b, c))');
-
-    declaration =
-        _assertHasDeclaration(declarations, 'f3', DeclarationKind.FUNCTION);
-    expect(declaration.parameters, '(bool Function(int a, String b) c)');
-
-    declaration =
-        _assertHasDeclaration(declarations, 'f4', DeclarationKind.FUNCTION);
-    expect(declaration.parameters, '(bool Function(int, String) a)');
-  }
-
-  test_declarations_parameters_typeArguments() async {
-    await _resolveTestUnit('''
-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 files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-
-    Declaration declaration;
-
-    declaration = _assertHasDeclaration(
-        declarations, 'm1', DeclarationKind.METHOD,
-        className: 'A');
-    expect(declaration.parameters, '(Map<int, String> a)');
-
-    declaration = _assertHasDeclaration(
-        declarations, 'm2', DeclarationKind.METHOD,
-        className: 'A');
-    expect(declaration.parameters, '(Map<T, U> a)');
-
-    declaration = _assertHasDeclaration(
-        declarations, 'm3', DeclarationKind.METHOD,
-        className: 'A');
-    expect(declaration.parameters, '(Map<Map<T2, U2>, Map<U1, T>> a)');
-  }
-
-  test_declarations_regExp() async {
-    await _resolveTestUnit('''
-class A {}
-class B {}
-class C {}
-class D {}
-''');
-    var files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(new RegExp(r'[A-C]'), null, files);
-    _assertHasDeclaration(declarations, 'A', DeclarationKind.CLASS);
-    _assertHasDeclaration(declarations, 'B', DeclarationKind.CLASS);
-    _assertHasDeclaration(declarations, 'C', DeclarationKind.CLASS);
-    _assertNoDeclaration(declarations, 'D');
-  }
-
-  test_declarations_top() async {
-    await _resolveTestUnit('''
-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 files = new LinkedHashSet<String>();
-    List<Declaration> declarations =
-        await driver.search.declarations(null, null, files);
-    _assertHasDeclaration(declarations, 'g', DeclarationKind.GETTER,
-        offset: 8, codeOffset: 0, codeLength: 15);
-    _assertHasDeclaration(declarations, 's', DeclarationKind.SETTER,
-        offset: 25, codeOffset: 16, codeLength: 16);
-    _assertHasDeclaration(
-      declarations,
-      'f',
-      DeclarationKind.FUNCTION,
-      offset: 38,
-      codeOffset: 33,
-      codeLength: 16,
-    );
-    _assertHasDeclaration(declarations, 'v', DeclarationKind.VARIABLE,
-        offset: 54, codeOffset: 50, codeLength: 5);
-    _assertHasDeclaration(
-        declarations, 'tf1', DeclarationKind.FUNCTION_TYPE_ALIAS,
-        offset: 70, codeOffset: 57, codeLength: 19);
-    _assertHasDeclaration(
-        declarations, 'tf2', DeclarationKind.FUNCTION_TYPE_ALIAS,
-        offset: 85, codeOffset: 77, codeLength: 45);
-    // No declaration for type variables.
-    _assertNoDeclaration(declarations, 'T');
-    _assertNoDeclaration(declarations, 'S');
-    // No declarations for parameters.
-    _assertNoDeclaration(declarations, '_');
-    _assertNoDeclaration(declarations, 'p');
-    _assertNoDeclaration(declarations, 'tp');
-    _assertNoDeclaration(declarations, 'sp');
-  }
-
-  test_references_discover() async {
-    var t = convertPath('/test/lib/t.dart');
-    var a = convertPath('/aaa/lib/a.dart');
-    var b = convertPath('/bbb/lib/b.dart');
-    var c = convertPath('/ccc/lib/c.dart');
-
-    newFile(t, content: 'List t;');
-    newFile(a, content: 'List a;');
-    newFile(b, content: 'List b;');
-    newFile(c, content: 'List c;');
-
-    driver.addFile(t);
-
-    LibraryElement coreLib = await driver.getLibraryByUri('dart:core');
-    ClassElement listElement = coreLib.getType('List');
-
-    var searchedFiles = new SearchedFiles();
-    var results = await driver.search.references(listElement, searchedFiles);
-
-    void assertHasResult(String path, String name, {bool not: false}) {
-      var matcher = contains(predicate((SearchResult r) {
-        var element = r.enclosingElement;
-        return element.name == name && element.source.fullName == path;
-      }));
-      expect(results, not ? isNot(matcher) : matcher);
-    }
-
-    assertHasResult(t, 't');
-    assertHasResult(a, 'a');
-    assertHasResult(b, 'b');
-    assertHasResult(c, 'c', not: true);
-  }
-
-  test_references_discover_onlyOwned() async {
-    var t = convertPath('/test/lib/t.dart');
-    var a = convertPath('/aaa/lib/a.dart');
-    var b = convertPath('/bbb/lib/b.dart');
-
-    newFile(t, content: 'List t;');
-    newFile(a, content: 'List a;');
-    newFile(b, content: 'List b;');
-
-    driver.addFile(t);
-    driver.addFile(a);
-
-    LibraryElement coreLib = await driver.getLibraryByUri('dart:core');
-    ClassElement listElement = coreLib.getType('List');
-
-    var searchedFiles = new SearchedFiles();
-
-    // Make b.dart owned by a different driver.
-    var driver2 = createAnalysisDriver();
-    searchedFiles.add(b, driver2.search);
-
-    var results = await driver.search.references(listElement, searchedFiles);
-
-    void assertHasResult(String path, String name, {bool not: false}) {
-      var matcher = contains(predicate((SearchResult r) {
-        var element = r.enclosingElement;
-        return element.name == name && element.source.fullName == path;
-      }));
-      expect(results, not ? isNot(matcher) : matcher);
-    }
-
-    assertHasResult(t, 't');
-    assertHasResult(a, 'a');
-    assertHasResult(b, 'b', not: true);
-  }
-
-  test_references_discover_onlyOwned_samePath() async {
-    var p = convertPath('/test/lib/t.dart');
-    newFile(p, content: 'int t;');
-
-    var driver1 = createAnalysisDriver(packageMap: {
-      'test': [newFolder('/test/lib')]
-    });
-    var driver2 = createAnalysisDriver(packageMap: {});
-
-    var searchedFiles = new SearchedFiles();
-    searchedFiles.ownAdded(driver1.search);
-    searchedFiles.ownAdded(driver2.search); // does not own any file, but...
-
-    // driver1 owns both path and URI.
-    expect(searchedFiles.add(p, driver1.search), isTrue);
-
-    // The path is already owned by driver1, so cannot be handled in driver2.
-    expect(searchedFiles.add(p, driver2.search), isFalse);
-  }
-
-  test_references_discover_onlyOwned_sameUri() async {
-    var a = convertPath('/aaa/lib/t.dart');
-    var b = convertPath('/bbb/lib/t.dart');
-
-    newFile(a, content: 'int t;');
-    newFile(b, content: 'double t;');
-
-    var driver1 = createAnalysisDriver(packageMap: {
-      'ttt': [newFolder('/aaa/lib')]
-    });
-    var driver2 = createAnalysisDriver(packageMap: {
-      'ttt': [newFolder('/bbb/lib')]
-    });
-
-    // driver1 owns `/aaa/lib/t.dart` with `package:ttt/t.dart`.
-    driver1.addFile(a);
-
-    var searchedFiles = new SearchedFiles();
-
-    searchedFiles.ownAdded(driver1.search);
-    searchedFiles.ownAdded(driver2.search); // does not own any file, but...
-
-    // driver1 owns both path and URI.
-    expect(searchedFiles.add(a, driver1.search), isTrue);
-
-    // The URI is already owned by driver1, so cannot be handled in driver2.
-    expect(searchedFiles.add(b, driver2.search), isFalse);
-  }
-
   test_searchMemberReferences_qualified_resolved() async {
     await _resolveTestUnit('''
 class C {
@@ -1972,40 +1549,6 @@
         unorderedEquals([a, b, c, d, e, f]));
   }
 
-  Declaration _assertHasDeclaration(
-      List<Declaration> declarations, String name, DeclarationKind kind,
-      {int offset,
-      int codeOffset,
-      int codeLength,
-      String className,
-      String mixinName}) {
-    for (var declaration in declarations) {
-      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 = declarations
-        .map((d) => '(name=${d.name}, kind=${d.kind}, offset=${d.offset}, '
-            'codeOffset=${d.codeOffset}, codeLength=${d.codeLength})')
-        .join('\n');
-    fail('Exected to find (name=$name, kind=$kind, offset=$offset, '
-        'codeOffset=$codeOffset, codeLength=$codeLength) in\n$actual');
-  }
-
-  void _assertNoDeclaration(List<Declaration> declarations, String name) {
-    for (var declaration in declarations) {
-      if (declaration.name == name) {
-        fail('Unexpected declaration $name');
-      }
-    }
-  }
-
   ExpectedResult _expectId(
       Element enclosingElement, SearchResultKind kind, String search,
       {int length, bool isResolved: true, bool isQualified: false}) {
diff --git a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
index f7562ed..13e4a36 100644
--- a/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/unlinked_api_signature_test.dart
@@ -342,14 +342,50 @@
 ''');
   }
 
-  test_class_method_body_async_to_sync() {
-    assertSameSignature(r'''
+  test_class_method_body_async_to_asyncStar() {
+    assertNotSameSignature(r'''
 class C {
-  Future foo() async {}
+  foo() async {}
 }
 ''', r'''
 class C {
-  Future foo() {}
+  foo() async* {}
+}
+''');
+  }
+
+  test_class_method_body_async_to_sync() {
+    assertNotSameSignature(r'''
+class C {
+  foo() async {}
+}
+''', r'''
+class C {
+  foo() {}
+}
+''');
+  }
+
+  test_class_method_body_asyncStar_to_async() {
+    assertNotSameSignature(r'''
+class C {
+  foo() async* {}
+}
+''', r'''
+class C {
+  foo() async {}
+}
+''');
+  }
+
+  test_class_method_body_asyncStar_to_syncStar() {
+    assertNotSameSignature(r'''
+class C {
+  foo() async* {}
+}
+''', r'''
+class C {
+  foo() sync* {}
 }
 ''');
   }
@@ -370,6 +406,18 @@
 ''');
   }
 
+  test_class_method_body_block_to_empty() {
+    assertNotSameSignature(r'''
+class C {
+  void foo() {}
+}
+''', r'''
+class C {
+  void foo();
+}
+''');
+  }
+
   test_class_method_body_block_to_expression() {
     assertSameSignature(r'''
 class C {
@@ -385,15 +433,25 @@
   }
 
   test_class_method_body_empty_to_block() {
-    assertSameSignature(r'''
+    assertNotSameSignature(r'''
+class C {
+  void foo();
+}
+''', r'''
+class C {
+  void foo() {}
+}
+''');
+  }
+
+  test_class_method_body_empty_to_expression() {
+    assertNotSameSignature(r'''
 class C {
   int foo();
 }
 ''', r'''
 class C {
-  int foo() {
-    var v = 0;
-  }
+  int foo() => 0;
 }
 ''');
   }
@@ -410,14 +468,66 @@
 ''');
   }
 
-  test_class_method_body_sync_to_async() {
+  test_class_method_body_expression_to_block() {
     assertSameSignature(r'''
 class C {
-  Future foo() {}
+  int foo() => 1;
 }
 ''', r'''
 class C {
-  Future foo() async {}
+  int foo() {
+    return 2;
+  }
+}
+''');
+  }
+
+  test_class_method_body_sync_to_async() {
+    assertNotSameSignature(r'''
+class C {
+  foo() {}
+}
+''', r'''
+class C {
+  foo() async {}
+}
+''');
+  }
+
+  test_class_method_body_sync_to_syncStar() {
+    assertNotSameSignature(r'''
+class C {
+  foo() sync* {}
+}
+''', r'''
+class C {
+  foo() {}
+}
+''');
+  }
+
+  test_class_method_body_syncStar_to_sync() {
+    assertNotSameSignature(r'''
+class C {
+  foo() sync* {}
+}
+''', r'''
+class C {
+  foo() {}
+}
+''');
+  }
+
+  test_class_method_getter_body_block_to_empty() {
+    assertNotSameSignature(r'''
+class C {
+  int get foo {
+    return 1;
+  }
+}
+''', r'''
+class C {
+  int get foo;
 }
 ''');
   }
@@ -436,14 +546,54 @@
 ''');
   }
 
-  test_class_method_getter_body_empty_to_expression() {
-    assertSameSignature(r'''
+  test_class_method_getter_body_empty_to_block() {
+    assertNotSameSignature(r'''
 class C {
   int get foo;
 }
 ''', r'''
 class C {
-  int get foo => 2;
+  int get foo {
+    return 0;
+  }
+}
+''');
+  }
+
+  test_class_method_getter_body_empty_to_expression() {
+    assertNotSameSignature(r'''
+class C {
+  int get foo;
+}
+''', r'''
+class C {
+  int get foo => 0;
+}
+''');
+  }
+
+  test_class_method_getter_body_expression_to_block() {
+    assertSameSignature(r'''
+class C {
+  int get foo => 1;
+}
+''', r'''
+class C {
+  int get foo {
+    return 2;
+  }
+}
+''');
+  }
+
+  test_class_method_getter_body_expression_to_empty() {
+    assertNotSameSignature(r'''
+class C {
+  int get foo => 0;
+}
+''', r'''
+class C {
+  int get foo;
 }
 ''');
   }
@@ -508,6 +658,30 @@
 ''');
   }
 
+  test_class_method_setter_body_block_to_empty() {
+    assertNotSameSignature(r'''
+class C {
+  set foo(_) {}
+}
+''', r'''
+class C {
+  set foo(_);
+}
+''');
+  }
+
+  test_class_method_setter_body_empty_to_block() {
+    assertNotSameSignature(r'''
+class C {
+  set foo(_);
+}
+''', r'''
+class C {
+  set foo(_) {}
+}
+''');
+  }
+
   test_class_method_typeParameters_add() async {
     assertNotSameSignature(r'''
 class C {
@@ -616,10 +790,10 @@
   }
 
   test_function_body_async_to_sync() {
-    assertSameSignature(r'''
-Future foo() async {}
+    assertNotSameSignature(r'''
+foo() async {}
 ''', r'''
-Future foo() {}
+foo() {}
 ''');
   }
 
@@ -654,10 +828,18 @@
   }
 
   test_function_body_sync_to_async() {
-    assertSameSignature(r'''
-Future foo() {}
+    assertNotSameSignature(r'''
+foo() {}
 ''', r'''
-Future foo() async {}
+foo() async {}
+''');
+  }
+
+  test_function_body_sync_to_syncStar() {
+    assertNotSameSignature(r'''
+foo() {}
+''', r'''
+foo() sync* {}
 ''');
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 792b693..ee62881 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -1257,7 +1257,9 @@
     expect(t.isSubtypeOf(s), isTrue);
     expect(s.isSubtypeOf(t), isFalse);
     // assignable iff subtype
+    // ignore: deprecated_member_use_from_same_package
     expect(t.isAssignableTo(s), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(s.isAssignableTo(t), isFalse);
   }
 
@@ -2032,334 +2034,6 @@
     expect(result, classA.type.instantiate([classC.type]));
   }
 
-  void test_computeLongestInheritancePathToObject_multipleInterfacePaths() {
-    //
-    //   Object
-    //     |
-    //     A
-    //    / \
-    //   B   C
-    //   |   |
-    //   |   D
-    //    \ /
-    //     E
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    ClassElementImpl classD = ElementFactory.classElement2("D");
-    ClassElementImpl classE = ElementFactory.classElement2("E");
-    classB.interfaces = <InterfaceType>[classA.type];
-    classC.interfaces = <InterfaceType>[classA.type];
-    classD.interfaces = <InterfaceType>[classC.type];
-    classE.interfaces = <InterfaceType>[classB.type, classD.type];
-    // assertion: even though the longest path to Object for typeB is 2, and
-    // typeE implements typeB, the longest path for typeE is 4 since it also
-    // implements typeD
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
-        2);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type),
-        4);
-  }
-
-  void test_computeLongestInheritancePathToObject_multipleSuperclassPaths() {
-    //
-    //   Object
-    //     |
-    //     A
-    //    / \
-    //   B   C
-    //   |   |
-    //   |   D
-    //    \ /
-    //     E
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classB = ElementFactory.classElement("B", classA.type);
-    ClassElement classC = ElementFactory.classElement("C", classA.type);
-    ClassElement classD = ElementFactory.classElement("D", classC.type);
-    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
-    classE.interfaces = <InterfaceType>[classD.type];
-    // assertion: even though the longest path to Object for typeB is 2, and
-    // typeE extends typeB, the longest path for typeE is 4 since it also
-    // implements typeD
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
-        2);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classE.type),
-        4);
-  }
-
-  void test_computeLongestInheritancePathToObject_object() {
-    //
-    //   Object
-    //     |
-    //     A
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    InterfaceType object = classA.supertype;
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(object), 0);
-  }
-
-  void test_computeLongestInheritancePathToObject_recursion() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    classA.supertype = classB.type;
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
-        2);
-  }
-
-  void test_computeLongestInheritancePathToObject_singleInterfacePath() {
-    //
-    //   Object
-    //     |
-    //     A
-    //     |
-    //     B
-    //     |
-    //     C
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    classB.interfaces = <InterfaceType>[classA.type];
-    classC.interfaces = <InterfaceType>[classB.type];
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
-        1);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
-        2);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type),
-        3);
-  }
-
-  void test_computeLongestInheritancePathToObject_singleSuperclassPath() {
-    //
-    //   Object
-    //     |
-    //     A
-    //     |
-    //     B
-    //     |
-    //     C
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classB = ElementFactory.classElement("B", classA.type);
-    ClassElement classC = ElementFactory.classElement("C", classB.type);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classA.type),
-        1);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classB.type),
-        2);
-    expect(InterfaceTypeImpl.computeLongestInheritancePathToObject(classC.type),
-        3);
-  }
-
-  void test_computeSuperinterfaceSet_genericInterfacePath() {
-    //
-    //  A
-    //  | implements
-    //  B<T>
-    //  | implements
-    //  C<T>
-    //
-    //  D
-    //
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B", ["T"]);
-    ClassElementImpl classC = ElementFactory.classElement2("C", ["T"]);
-    ClassElement classD = ElementFactory.classElement2("D");
-    InterfaceType typeA = classA.type;
-    classB.interfaces = <InterfaceType>[typeA];
-    InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
-    DartType typeT = classC.type.typeArguments[0];
-    typeBT.typeArguments = <DartType>[typeT];
-    classC.interfaces = <InterfaceType>[typeBT];
-    // A
-    Set<InterfaceType> superinterfacesOfA =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
-    expect(superinterfacesOfA, hasLength(1));
-    InterfaceType typeObject = ElementFactory.object.type;
-    expect(superinterfacesOfA.contains(typeObject), isTrue);
-    // B<D>
-    InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
-    typeBD.typeArguments = <DartType>[classD.type];
-    Set<InterfaceType> superinterfacesOfBD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
-    expect(superinterfacesOfBD, hasLength(2));
-    expect(superinterfacesOfBD.contains(typeObject), isTrue);
-    expect(superinterfacesOfBD.contains(typeA), isTrue);
-    // C<D>
-    InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
-    typeCD.typeArguments = <DartType>[classD.type];
-    Set<InterfaceType> superinterfacesOfCD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
-    expect(superinterfacesOfCD, hasLength(3));
-    expect(superinterfacesOfCD.contains(typeObject), isTrue);
-    expect(superinterfacesOfCD.contains(typeA), isTrue);
-    expect(superinterfacesOfCD.contains(typeBD), isTrue);
-  }
-
-  void test_computeSuperinterfaceSet_genericSuperclassPath() {
-    //
-    //  A
-    //  |
-    //  B<T>
-    //  |
-    //  C<T>
-    //
-    //  D
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    InterfaceType typeA = classA.type;
-    ClassElement classB = ElementFactory.classElement("B", typeA, ["T"]);
-    ClassElementImpl classC = ElementFactory.classElement2("C", ["T"]);
-    InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
-    DartType typeT = classC.type.typeArguments[0];
-    typeBT.typeArguments = <DartType>[typeT];
-    classC.supertype = typeBT;
-    ClassElement classD = ElementFactory.classElement2("D");
-    // A
-    Set<InterfaceType> superinterfacesOfA =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeA);
-    expect(superinterfacesOfA, hasLength(1));
-    InterfaceType typeObject = ElementFactory.object.type;
-    expect(superinterfacesOfA.contains(typeObject), isTrue);
-    // B<D>
-    InterfaceTypeImpl typeBD = new InterfaceTypeImpl(classB);
-    typeBD.typeArguments = <DartType>[classD.type];
-    Set<InterfaceType> superinterfacesOfBD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeBD);
-    expect(superinterfacesOfBD, hasLength(2));
-    expect(superinterfacesOfBD.contains(typeObject), isTrue);
-    expect(superinterfacesOfBD.contains(typeA), isTrue);
-    // C<D>
-    InterfaceTypeImpl typeCD = new InterfaceTypeImpl(classC);
-    typeCD.typeArguments = <DartType>[classD.type];
-    Set<InterfaceType> superinterfacesOfCD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(typeCD);
-    expect(superinterfacesOfCD, hasLength(3));
-    expect(superinterfacesOfCD.contains(typeObject), isTrue);
-    expect(superinterfacesOfCD.contains(typeA), isTrue);
-    expect(superinterfacesOfCD.contains(typeBD), isTrue);
-  }
-
-  void test_computeSuperinterfaceSet_multipleInterfacePaths() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    ClassElementImpl classD = ElementFactory.classElement2("D");
-    ClassElementImpl classE = ElementFactory.classElement2("E");
-    classB.interfaces = <InterfaceType>[classA.type];
-    classC.interfaces = <InterfaceType>[classA.type];
-    classD.interfaces = <InterfaceType>[classC.type];
-    classE.interfaces = <InterfaceType>[classB.type, classD.type];
-    // D
-    Set<InterfaceType> superinterfacesOfD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    expect(superinterfacesOfD, hasLength(3));
-    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfD.contains(classA.type), isTrue);
-    expect(superinterfacesOfD.contains(classC.type), isTrue);
-    // E
-    Set<InterfaceType> superinterfacesOfE =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    expect(superinterfacesOfE, hasLength(5));
-    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfE.contains(classA.type), isTrue);
-    expect(superinterfacesOfE.contains(classB.type), isTrue);
-    expect(superinterfacesOfE.contains(classC.type), isTrue);
-    expect(superinterfacesOfE.contains(classD.type), isTrue);
-  }
-
-  void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classB = ElementFactory.classElement("B", classA.type);
-    ClassElement classC = ElementFactory.classElement("C", classA.type);
-    ClassElement classD = ElementFactory.classElement("D", classC.type);
-    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
-    classE.interfaces = <InterfaceType>[classD.type];
-    // D
-    Set<InterfaceType> superinterfacesOfD =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classD.type);
-    expect(superinterfacesOfD, hasLength(3));
-    expect(superinterfacesOfD.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfD.contains(classA.type), isTrue);
-    expect(superinterfacesOfD.contains(classC.type), isTrue);
-    // E
-    Set<InterfaceType> superinterfacesOfE =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classE.type);
-    expect(superinterfacesOfE, hasLength(5));
-    expect(superinterfacesOfE.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfE.contains(classA.type), isTrue);
-    expect(superinterfacesOfE.contains(classB.type), isTrue);
-    expect(superinterfacesOfE.contains(classC.type), isTrue);
-    expect(superinterfacesOfE.contains(classD.type), isTrue);
-  }
-
-  void test_computeSuperinterfaceSet_recursion() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
-    classA.supertype = classB.type;
-    Set<InterfaceType> superinterfacesOfB =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    expect(superinterfacesOfB, hasLength(2));
-  }
-
-  void test_computeSuperinterfaceSet_singleInterfacePath() {
-    ClassElementImpl classA = ElementFactory.classElement2("A");
-    ClassElementImpl classB = ElementFactory.classElement2("B");
-    ClassElementImpl classC = ElementFactory.classElement2("C");
-    classB.interfaces = <InterfaceType>[classA.type];
-    classC.interfaces = <InterfaceType>[classB.type];
-    // A
-    Set<InterfaceType> superinterfacesOfA =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    expect(superinterfacesOfA, hasLength(1));
-    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
-    // B
-    Set<InterfaceType> superinterfacesOfB =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    expect(superinterfacesOfB, hasLength(2));
-    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfB.contains(classA.type), isTrue);
-    // C
-    Set<InterfaceType> superinterfacesOfC =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    expect(superinterfacesOfC, hasLength(3));
-    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfC.contains(classA.type), isTrue);
-    expect(superinterfacesOfC.contains(classB.type), isTrue);
-  }
-
-  void test_computeSuperinterfaceSet_singleSuperclassPath() {
-    //
-    //  A
-    //  |
-    //  B
-    //  |
-    //  C
-    //
-    ClassElement classA = ElementFactory.classElement2("A");
-    ClassElement classB = ElementFactory.classElement("B", classA.type);
-    ClassElement classC = ElementFactory.classElement("C", classB.type);
-    // A
-    Set<InterfaceType> superinterfacesOfA =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classA.type);
-    expect(superinterfacesOfA, hasLength(1));
-    expect(superinterfacesOfA.contains(ElementFactory.object.type), isTrue);
-    // B
-    Set<InterfaceType> superinterfacesOfB =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classB.type);
-    expect(superinterfacesOfB, hasLength(2));
-    expect(superinterfacesOfB.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfB.contains(classA.type), isTrue);
-    // C
-    Set<InterfaceType> superinterfacesOfC =
-        InterfaceTypeImpl.computeSuperinterfaceSet(classC.type);
-    expect(superinterfacesOfC, hasLength(3));
-    expect(superinterfacesOfC.contains(ElementFactory.object.type), isTrue);
-    expect(superinterfacesOfC.contains(classA.type), isTrue);
-    expect(superinterfacesOfC.contains(classB.type), isTrue);
-  }
-
   void test_creation() {
     expect(new InterfaceTypeImpl(ElementFactory.classElement2("A")), isNotNull);
   }
@@ -2511,12 +2185,11 @@
 
   void test_getMethod_parameterized_doesNotUseTypeParameter() {
     //
-    // class A<E> { void m() {} }
+    // class A<E> { B m() {} }
     // class B {}
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", ["E"]);
     InterfaceType typeB = ElementFactory.classElement2("B").type;
-    DartType typeE = classA.type.typeArguments[0];
     String methodName = "m";
     MethodElementImpl methodM =
         ElementFactory.methodElement(methodName, typeB, []);
@@ -2531,7 +2204,7 @@
     MethodElement method = typeAI.getMethod(methodName);
     expect(method, isNotNull);
     FunctionType methodType = method.type;
-    expect(methodType.typeParameters, [same(typeE.element)]);
+    expect(methodType.typeParameters, isEmpty);
     expect(methodType.typeArguments, [same(typeI)]);
   }
 
@@ -2580,7 +2253,7 @@
     MethodElement method = typeAI.getMethod(methodName);
     expect(method, isNotNull);
     FunctionType methodType = method.type;
-    expect(methodType.typeParameters, [same(typeE.element)]);
+    expect(methodType.typeParameters, isEmpty);
     expect(methodType.typeArguments, [same(typeI)]);
     expect(methodType.returnType, same(typeI));
     List<DartType> parameterTypes = methodType.normalParameterTypes;
@@ -2776,6 +2449,7 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
@@ -2785,6 +2459,7 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isDirectSupertypeOf(typeC), isFalse);
   }
 
@@ -2794,6 +2469,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     classB.interfaces = <InterfaceType>[typeA];
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
@@ -2803,6 +2479,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
     classB.mixins = <InterfaceType>[typeA];
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isDirectSupertypeOf(typeB), isTrue);
   }
 
@@ -2828,13 +2505,16 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeB.isMoreSpecificThan(typeA), isTrue);
     // the opposite test tests a different branch in isMoreSpecificThan()
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isMoreSpecificThan(typeB), isFalse);
   }
 
   void test_isMoreSpecificThan_dynamic() {
     InterfaceType type = ElementFactory.classElement2("A").type;
+    // ignore: deprecated_member_use_from_same_package
     expect(type.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
   }
 
@@ -2845,12 +2525,15 @@
     InterfaceType typeAOfDynamic =
         classA.type.instantiate(<DartType>[dynamicType]);
     InterfaceType typeAOfB = classA.type.instantiate(<DartType>[classB.type]);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeAOfDynamic.isMoreSpecificThan(typeAOfB), isFalse);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeAOfB.isMoreSpecificThan(typeAOfDynamic), isTrue);
   }
 
   void test_isMoreSpecificThan_self() {
     InterfaceType type = ElementFactory.classElement2("A").type;
+    // ignore: deprecated_member_use_from_same_package
     expect(type.isMoreSpecificThan(type), isTrue);
   }
 
@@ -2866,6 +2549,7 @@
     classC.interfaces = <InterfaceType>[classB.type];
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
@@ -2881,6 +2565,7 @@
     classC.mixins = <InterfaceType>[classB.type];
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
@@ -2896,6 +2581,7 @@
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
     classA.supertype = classB.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isMoreSpecificThan(typeC), isFalse);
   }
 
@@ -2910,6 +2596,7 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isMoreSpecificThan(typeA), isTrue);
   }
 
@@ -2921,7 +2608,9 @@
     InterfaceType typeA = classA.type;
     TypeParameterType parameterType = classA.typeParameters[0].type;
     DartType objectType = _typeProvider.objectType;
+    // ignore: deprecated_member_use_from_same_package
     expect(parameterType.isMoreSpecificThan(objectType), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(parameterType.isMoreSpecificThan(typeA), isFalse);
   }
 
@@ -2939,6 +2628,7 @@
     parameterEA.bound = typeA;
     parameterEA.type = parameterAEType;
     classB.typeParameters = <TypeParameterElementImpl>[parameterEA];
+    // ignore: deprecated_member_use_from_same_package
     expect(parameterAEType.isMoreSpecificThan(typeA), isTrue);
   }
 
@@ -3107,7 +2797,9 @@
     ClassElement classB = ElementFactory.classElement("B", classA.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeB = classB.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeB.isSupertypeOf(typeA), isFalse);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeB), isTrue);
   }
 
@@ -3115,7 +2807,9 @@
     ClassElement classA = ElementFactory.classElement2("A");
     InterfaceType typeA = classA.type;
     DartType dynamicType = DynamicTypeImpl.instance;
+    // ignore: deprecated_member_use_from_same_package
     expect(dynamicType.isSupertypeOf(typeA), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(dynamicType), isTrue);
   }
 
@@ -3125,7 +2819,9 @@
     ClassElement classC = ElementFactory.classElement("C", classB.type);
     InterfaceType typeA = classA.type;
     InterfaceType typeC = classC.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isSupertypeOf(typeA), isFalse);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeC), isTrue);
   }
 
@@ -3138,9 +2834,13 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.interfaces = <InterfaceType>[typeB];
+    // ignore: deprecated_member_use_from_same_package
     expect(typeB.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeObject.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isSupertypeOf(typeA), isFalse);
   }
 
@@ -3158,9 +2858,13 @@
     InterfaceType typeB = classB.type;
     InterfaceType typeC = classC.type;
     classC.mixins = <InterfaceType>[typeB];
+    // ignore: deprecated_member_use_from_same_package
     expect(typeB.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeObject.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeC), isTrue);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeC.isSupertypeOf(typeA), isFalse);
   }
 
@@ -3168,13 +2872,16 @@
     ClassElement classA = ElementFactory.classElement2("A");
     InterfaceType typeA = classA.type;
     InterfaceType typeObject = classA.supertype;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeObject), isFalse);
+    // ignore: deprecated_member_use_from_same_package
     expect(typeObject.isSupertypeOf(typeA), isTrue);
   }
 
   void test_isSupertypeOf_self() {
     ClassElement classA = ElementFactory.classElement2("A");
     InterfaceType typeA = classA.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(typeA.isSupertypeOf(typeA), isTrue);
   }
 
@@ -3979,14 +3686,17 @@
 
   void test_isMoreSpecificThan_void_A() {
     ClassElement classA = ElementFactory.classElement2("A");
+    // ignore: deprecated_member_use_from_same_package
     expect(_voidType.isMoreSpecificThan(classA.type), isFalse);
   }
 
   void test_isMoreSpecificThan_void_dynamic() {
+    // ignore: deprecated_member_use_from_same_package
     expect(_voidType.isMoreSpecificThan(DynamicTypeImpl.instance), isTrue);
   }
 
   void test_isMoreSpecificThan_void_void() {
+    // ignore: deprecated_member_use_from_same_package
     expect(_voidType.isMoreSpecificThan(_voidType), isTrue);
   }
 
diff --git a/pkg/analyzer/test/src/dart/element/function_type_test.dart b/pkg/analyzer/test/src/dart/element/function_type_test.dart
index d5bb2f7..eb473da 100644
--- a/pkg/analyzer/test/src/dart/element/function_type_test.dart
+++ b/pkg/analyzer/test/src/dart/element/function_type_test.dart
@@ -1235,6 +1235,9 @@
   Element enclosingElement;
 
   @override
+  final bool isCovariant;
+
+  @override
   final String name;
 
   @override
@@ -1244,7 +1247,9 @@
   final DartType type;
 
   MockParameterElement(this.name,
-      {this.parameterKind: ParameterKind.REQUIRED, this.type});
+      {this.parameterKind: ParameterKind.REQUIRED,
+      this.type,
+      this.isCovariant = false});
 
   @override
   get displayName => name;
diff --git a/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
new file mode 100644
index 0000000..f07f824
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/inheritance_manager3_test.dart
@@ -0,0 +1,1230 @@
+// 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/dart/element/element.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InheritanceManager3Test);
+  });
+}
+
+@reflectiveTest
+class InheritanceManager3Test extends DriverResolutionTest {
+  InheritanceManager3 manager;
+
+  @override
+  Future<void> resolveTestFile() async {
+    await super.resolveTestFile();
+    manager = new InheritanceManager3(
+      result.unit.declaredElement.context.typeSystem,
+    );
+  }
+
+  test_getInherited_closestSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+
+class X extends B {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetInherited(
+      className: 'X',
+      name: 'foo',
+      expected: 'B.foo: void Function()',
+    );
+  }
+
+  test_getInherited_interfaces() async {
+    addTestFile('''
+abstract class I {
+  void foo();
+}
+
+abstrac class J {
+  void foo();
+}
+
+class X implements I, J {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetInherited(
+      className: 'X',
+      name: 'foo',
+      expected: 'J.foo: void Function()',
+    );
+  }
+
+  test_getInherited_mixin() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+mixin M {
+  void foo() {}
+}
+
+class X extends A with M {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetInherited(
+      className: 'X',
+      name: 'foo',
+      expected: 'M.foo: void Function()',
+    );
+  }
+
+  test_getInherited_preferImplemented() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class I {
+  void foo() {}
+}
+
+class X extends A implements I {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetInherited(
+      className: 'X',
+      name: 'foo',
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getInheritedConcreteMap_accessor_extends() async {
+    addTestFile('''
+class A {
+  int get foo => 0;
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', r'''
+A.foo: int Function()
+''');
+  }
+
+  test_getInheritedConcreteMap_accessor_implements() async {
+    addTestFile('''
+class A {
+  int get foo => 0;
+}
+
+abstract class B implements A {}
+''');
+    await resolveTestFile();
+    _assertInheritedConcreteMap('B', '');
+  }
+
+  test_getInheritedConcreteMap_accessor_with() async {
+    addTestFile('''
+mixin A {
+  int get foo => 0;
+}
+
+class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', r'''
+A.foo: int Function()
+''');
+  }
+
+  test_getInheritedConcreteMap_implicitExtends() async {
+    addTestFile('''
+class A {}
+''');
+    await resolveTestFile();
+    _assertInheritedConcreteMap('A', '');
+  }
+
+  test_getInheritedConcreteMap_method_extends() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedConcreteMap_method_extends_abstract() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', '');
+  }
+
+  test_getInheritedConcreteMap_method_extends_invalidForImplements() async {
+    addTestFile('''
+abstract class I {
+  void foo(int x, {int y});
+  void bar(String s);
+}
+
+class A {
+  void foo(int x) {}
+}
+
+class C extends A implements I {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('C', r'''
+A.foo: void Function(int)
+''');
+  }
+
+  test_getInheritedConcreteMap_method_implements() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+abstract class B implements A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', '');
+  }
+
+  test_getInheritedConcreteMap_method_with() async {
+    addTestFile('''
+mixin A {
+  void foo() {}
+}
+
+class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('B', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedConcreteMap_method_with2() async {
+    addTestFile('''
+mixin A {
+  void foo() {}
+}
+
+mixin B {
+  void bar() {}
+}
+
+class C extends Object with A, B {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedConcreteMap('C', r'''
+A.foo: void Function()
+B.bar: void Function()
+''');
+  }
+
+  test_getInheritedMap_accessor_extends() async {
+    addTestFile('''
+class A {
+  int get foo => 0;
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+''');
+  }
+
+  test_getInheritedMap_accessor_implements() async {
+    addTestFile('''
+class A {
+  int get foo => 0;
+}
+
+abstract class B implements A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+''');
+  }
+
+  test_getInheritedMap_accessor_with() async {
+    addTestFile('''
+mixin A {
+  int get foo => 0;
+}
+
+class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+''');
+  }
+
+  test_getInheritedMap_closestSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+
+class X extends B {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('X', r'''
+B.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_field_extends() async {
+    addTestFile('''
+class A {
+  int foo;
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+A.foo=: void Function(int)
+''');
+  }
+
+  test_getInheritedMap_field_implements() async {
+    addTestFile('''
+class A {
+  int foo;
+}
+
+abstract class B implements A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+A.foo=: void Function(int)
+''');
+  }
+
+  test_getInheritedMap_field_with() async {
+    addTestFile('''
+mixin A {
+  int foo;
+}
+
+class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: int Function()
+A.foo=: void Function(int)
+''');
+  }
+
+  test_getInheritedMap_implicitExtendsObject() async {
+    addTestFile('''
+class A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', '');
+  }
+
+  test_getInheritedMap_method_extends() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_method_implements() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+abstract class B implements A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_method_with() async {
+    addTestFile('''
+mixin A {
+  void foo() {}
+}
+
+class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('B', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_preferImplemented() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class I {
+  void foo() {}
+}
+
+class X extends A implements I {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('X', r'''
+A.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_union_conflict() async {
+    addTestFile('''
+abstract class I {
+  int foo();
+  void bar();
+}
+
+abstract class J {
+  double foo();
+  void bar();
+}
+
+abstract class A implements I, J {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+J.bar: void Function()
+''');
+  }
+
+  test_getInheritedMap_union_differentNames() async {
+    addTestFile('''
+abstract class I {
+  int foo();
+}
+
+abstract class J {
+  double bar();
+}
+
+abstract class A implements I, J {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+I.foo: int Function()
+J.bar: double Function()
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_2_getters() async {
+    addTestFile('''
+abstract class I {
+  int get foo;
+}
+
+abstract class J {
+  int get foo;
+}
+
+abstract class A implements I, J {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+J.foo: int Function()
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_2_methods() async {
+    addTestFile('''
+abstract class I {
+  void foo();
+}
+
+abstract class J {
+  void foo();
+}
+
+abstract class A implements I, J {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+J.foo: void Function()
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_2_setters() async {
+    addTestFile('''
+abstract class I {
+  void set foo(num _);
+}
+
+abstract class J {
+  void set foo(int _);
+}
+
+abstract class A implements I, J {}
+abstract class B implements J, I {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+I.foo=: void Function(num)
+''');
+
+    _assertInheritedMap('B', r'''
+I.foo=: void Function(num)
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_3_getters() async {
+    addTestFile('''
+class A {}
+class B extends A {}
+class C extends B {}
+
+abstract class I1 {
+  A get foo;
+}
+
+abstract class I2 {
+  B get foo;
+}
+
+abstract class I3 {
+  C get foo;
+}
+
+abstract class D implements I1, I2, I3 {}
+abstract class E implements I3, I2, I1 {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('D', r'''
+I3.foo: C Function()
+''');
+
+    _assertInheritedMap('E', r'''
+I3.foo: C Function()
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_3_methods() async {
+    addTestFile('''
+class A {}
+class B extends A {}
+class C extends B {}
+
+abstract class I1 {
+  void foo(A _);
+}
+
+abstract class I2 {
+  void foo(B _);
+}
+
+abstract class I3 {
+  void foo(C _);
+}
+
+abstract class D implements I1, I2, I3 {}
+abstract class E implements I3, I2, I1 {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('D', r'''
+I1.foo: void Function(A)
+''');
+  }
+
+  test_getInheritedMap_union_multipleSubtypes_3_setters() async {
+    addTestFile('''
+class A {}
+class B extends A {}
+class C extends B {}
+
+abstract class I1 {
+  set foo(A _);
+}
+
+abstract class I2 {
+  set foo(B _);
+}
+
+abstract class I3 {
+  set foo(C _);
+}
+
+abstract class D implements I1, I2, I3 {}
+abstract class E implements I3, I2, I1 {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('D', r'''
+I1.foo=: void Function(A)
+''');
+
+    _assertInheritedMap('E', r'''
+I1.foo=: void Function(A)
+''');
+  }
+
+  test_getInheritedMap_union_oneSubtype_2_methods() async {
+    addTestFile('''
+abstract class I1 {
+  int foo();
+}
+
+abstract class I2 {
+  int foo([int _]);
+}
+
+abstract class A implements I1, I2 {}
+abstract class B implements I2, I1 {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+I2.foo: int Function([int])
+''');
+
+    _assertInheritedMap('B', r'''
+I2.foo: int Function([int])
+''');
+  }
+
+  test_getInheritedMap_union_oneSubtype_3_methods() async {
+    addTestFile('''
+abstract class I1 {
+  int foo();
+}
+
+abstract class I2 {
+  int foo([int _]);
+}
+
+abstract class I3 {
+  int foo([int _, int __]);
+}
+
+abstract class A implements I1, I2, I3 {}
+abstract class B implements I3, I2, I1 {}
+''');
+    await resolveTestFile();
+
+    _assertInheritedMap('A', r'''
+I3.foo: int Function([int, int])
+''');
+
+    _assertInheritedMap('B', r'''
+I3.foo: int Function([int, int])
+''');
+  }
+
+  test_getMember() async {
+    addTestFile('''
+abstract class I1 {
+  void f(int i);
+}
+
+abstract class I2 {
+  void f(Object o);
+}
+
+abstract class C implements I1, I2 {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'C',
+      name: 'f',
+      expected: 'I2.f: void Function(Object)',
+    );
+  }
+
+  test_getMember_concrete() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'A',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_abstract() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'A',
+      name: 'foo',
+      concrete: true,
+    );
+  }
+
+  test_getMember_concrete_fromMixedClass() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class X with A {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_fromMixedClass2() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B = Object with A;
+
+class X with B {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_fromMixedClass_skipObject() async {
+    addTestFile('''
+class A {
+  String toString() => 'A';
+}
+
+class B {}
+
+class X extends A with B {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'toString',
+      concrete: true,
+      expected: 'A.toString: String Function()',
+    );
+  }
+
+  test_getMember_concrete_fromMixin() async {
+    addTestFile('''
+mixin M {
+  void foo() {}
+}
+
+class X with M {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      concrete: true,
+      expected: 'M.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_fromSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {}
+
+abstract class C extends B {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+
+    _assertGetMember(
+      className: 'C',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_missing() async {
+    addTestFile('''
+abstract class A {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'A',
+      name: 'foo',
+      concrete: true,
+    );
+  }
+
+  test_getMember_concrete_noSuchMethod() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+abstract class C extends B {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+
+    _assertGetMember(
+      className: 'C',
+      name: 'foo',
+      concrete: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_concrete_noSuchMethod_mixin() async {
+    addTestFile('''
+class A {
+  void foo();
+
+  noSuchMethod(_) {}
+}
+
+abstract class B extends Object with A {}
+''');
+    await resolveTestFile();
+
+    // noSuchMethod forwarders are not mixed-in.
+    // https://github.com/dart-lang/sdk/issues/33553#issuecomment-424638320
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      concrete: true,
+    );
+  }
+
+  test_getMember_concrete_noSuchMethod_moreSpecificSignature() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B implements A {
+  noSuchMethod(_) {}
+}
+
+class C extends B {
+  void foo([int a]);
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'C',
+      name: 'foo',
+      concrete: true,
+      expected: 'C.foo: void Function([int])',
+    );
+  }
+
+  test_getMember_preferLatest_mixin() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+mixin M1 {
+  void foo() {}
+}
+
+mixin M2 {
+  void foo() {}
+}
+
+abstract class I {
+  void foo();
+}
+
+class X extends A with M1, M2 implements I {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      expected: 'M2.foo: void Function()',
+    );
+  }
+
+  test_getMember_preferLatest_superclass() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+
+abstract class I {
+  void foo();
+}
+
+class X extends B implements I {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      expected: 'B.foo: void Function()',
+    );
+  }
+
+  test_getMember_preferLatest_this() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+abstract class I {
+  void foo();
+}
+
+class X extends A implements I {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      expected: 'X.foo: void Function()',
+    );
+  }
+
+  test_getMember_super_abstract() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+class B extends A {
+  noSuchMethod(_) {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      forSuper: true,
+    );
+  }
+
+  test_getMember_super_forMixin_interface() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+mixin M implements A {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'M',
+      name: 'foo',
+      forSuper: true,
+    );
+  }
+
+  test_getMember_super_forMixin_superclassConstraint() async {
+    addTestFile('''
+abstract class A {
+  void foo();
+}
+
+mixin M on A {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'M',
+      name: 'foo',
+      forSuper: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_super_fromMixin() async {
+    addTestFile('''
+mixin M {
+  void foo() {}
+}
+
+class X extends Object with M {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'X',
+      name: 'foo',
+      forSuper: true,
+      expected: 'M.foo: void Function()',
+    );
+  }
+
+  test_getMember_super_fromSuper() async {
+    addTestFile('''
+class A {
+  void foo() {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      forSuper: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  test_getMember_super_missing() async {
+    addTestFile('''
+class A {}
+
+class B extends A {}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      forSuper: true,
+    );
+  }
+
+  test_getMember_super_noSuchMember() async {
+    addTestFile('''
+class A {
+  void foo();
+  noSuchMethod(_) {}
+}
+
+class B extends A {
+  void foo() {}
+}
+''');
+    await resolveTestFile();
+
+    _assertGetMember(
+      className: 'B',
+      name: 'foo',
+      forSuper: true,
+      expected: 'A.foo: void Function()',
+    );
+  }
+
+  void _assertExecutable(ExecutableElement element, String expected) {
+    if (expected != null) {
+      var type = element.type;
+      var enclosingElement = element.enclosingElement;
+      var actual = '${enclosingElement.name}.${element.name}: $type';
+      expect(actual, expected);
+    } else {
+      expect(element, isNull);
+    }
+  }
+
+  void _assertGetInherited({
+    @required String className,
+    @required String name,
+    String expected,
+  }) {
+    var interfaceType = findElement.classOrMixin(className).type;
+
+    var member = manager.getInherited(
+      interfaceType,
+      new Name(null, name),
+    );
+
+    _assertExecutable(member, expected);
+  }
+
+  void _assertGetMember({
+    @required String className,
+    @required String name,
+    String expected,
+    bool concrete = false,
+    bool forSuper = false,
+  }) {
+    var interfaceType = findElement.classOrMixin(className).type;
+
+    var memberType = manager.getMember(
+      interfaceType,
+      new Name(null, name),
+      concrete: concrete,
+      forSuper: forSuper,
+    );
+
+    _assertExecutable(memberType, expected);
+  }
+
+  void _assertInheritedConcreteMap(String className, String expected) {
+    var type = findElement.class_(className).type;
+    var map = manager.getInheritedConcreteMap(type);
+    _assertNameToExecutableMap(map, expected);
+  }
+
+  void _assertInheritedMap(String className, String expected) {
+    var type = findElement.class_(className).type;
+    var map = manager.getInheritedMap(type);
+    _assertNameToExecutableMap(map, expected);
+  }
+
+  void _assertNameToExecutableMap(
+      Map<Name, ExecutableElement> map, String expected) {
+    var lines = <String>[];
+    for (var name in map.keys) {
+      var element = map[name];
+      var type = element.type;
+
+      var enclosingElement = element.enclosingElement;
+      if (enclosingElement.name == 'Object') continue;
+
+      lines.add('${enclosingElement.name}.${element.name}: $type');
+    }
+
+    lines.sort();
+    var actual = lines.isNotEmpty ? lines.join('\n') + '\n' : '';
+
+    if (actual != expected) {
+      print(actual);
+    }
+    expect(actual, expected);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
new file mode 100644
index 0000000..13d9100
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/element/least_upper_bound_helper_test.dart
@@ -0,0 +1,543 @@
+// 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/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/type.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/type_system.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../../generated/test_support.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InterfaceLeastUpperBoundHelperTest);
+  });
+}
+
+@reflectiveTest
+class InterfaceLeastUpperBoundHelperTest extends EngineTestCase {
+  /**
+   * The type provider used to access the types.
+   */
+  TestTypeProvider _typeProvider;
+
+  @override
+  void setUp() {
+    super.setUp();
+    _typeProvider = new TestTypeProvider();
+  }
+
+  void test_computeLongestInheritancePathToObject_multipleInterfacePaths() {
+    //
+    //   Object
+    //     |
+    //     A
+    //    / \
+    //   B   C
+    //   |   |
+    //   |   D
+    //    \ /
+    //     E
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    ClassElementImpl classD = ElementFactory.classElement2("D");
+    ClassElementImpl classE = ElementFactory.classElement2("E");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classA.type];
+    classD.interfaces = <InterfaceType>[classC.type];
+    classE.interfaces = <InterfaceType>[classB.type, classD.type];
+    // assertion: even though the longest path to Object for typeB is 2, and
+    // typeE implements typeB, the longest path for typeE is 4 since it also
+    // implements typeD
+    expect(_longestPathToObject(classB), 2);
+    expect(_longestPathToObject(classE), 4);
+  }
+
+  void test_computeLongestInheritancePathToObject_multipleSuperclassPaths() {
+    //
+    //   Object
+    //     |
+    //     A
+    //    / \
+    //   B   C
+    //   |   |
+    //   |   D
+    //    \ /
+    //     E
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classA.type);
+    ClassElement classD = ElementFactory.classElement("D", classC.type);
+    ClassElementImpl classE = ElementFactory.classElement("E", classB.type);
+    classE.interfaces = <InterfaceType>[classD.type];
+    // assertion: even though the longest path to Object for typeB is 2, and
+    // typeE extends typeB, the longest path for typeE is 4 since it also
+    // implements typeD
+    expect(_longestPathToObject(classB), 2);
+    expect(_longestPathToObject(classE), 4);
+  }
+
+  void test_computeLongestInheritancePathToObject_object() {
+    expect(_longestPathToObject(_typeProvider.objectType.element), 0);
+  }
+
+  void test_computeLongestInheritancePathToObject_recursion() {
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type);
+    classA.supertype = classB.type;
+    expect(_longestPathToObject(classA), 2);
+  }
+
+  void test_computeLongestInheritancePathToObject_singleInterfacePath() {
+    //
+    //   Object
+    //     |
+    //     A
+    //     |
+    //     B
+    //     |
+    //     C
+    //
+    ClassElementImpl classA = ElementFactory.classElement2("A");
+    ClassElementImpl classB = ElementFactory.classElement2("B");
+    ClassElementImpl classC = ElementFactory.classElement2("C");
+    classB.interfaces = <InterfaceType>[classA.type];
+    classC.interfaces = <InterfaceType>[classB.type];
+    expect(_longestPathToObject(classA), 1);
+    expect(_longestPathToObject(classB), 2);
+    expect(_longestPathToObject(classC), 3);
+  }
+
+  void test_computeLongestInheritancePathToObject_singleSuperclassPath() {
+    //
+    //   Object
+    //     |
+    //     A
+    //     |
+    //     B
+    //     |
+    //     C
+    //
+    ClassElement classA = ElementFactory.classElement2("A");
+    ClassElement classB = ElementFactory.classElement("B", classA.type);
+    ClassElement classC = ElementFactory.classElement("C", classB.type);
+    expect(_longestPathToObject(classA), 1);
+    expect(_longestPathToObject(classB), 2);
+    expect(_longestPathToObject(classC), 3);
+  }
+
+  void test_computeSuperinterfaceSet_genericInterfacePath() {
+    //
+    //  A
+    //  | implements
+    //  B<T>
+    //  | implements
+    //  C<T>
+    //
+    //  D
+    //
+
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    ClassElementImpl classA = ElementFactory.classElement2('A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      typeParameterNames: ['T'],
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+
+    var typeParametersC = ElementFactory.typeParameters(['T']);
+    var classC = ElementFactory.classElement3(
+      name: 'B',
+      typeParameters: typeParametersC,
+      interfaces: [
+        InstantiatedClass(
+          classB,
+          [typeParametersC[0].type],
+        ).withNullabilitySuffixNone,
+      ],
+    );
+
+    var classD = ElementFactory.classElement2('D');
+
+    InterfaceTypeImpl typeBT = new InterfaceTypeImpl(classB);
+    DartType typeT = classC.type.typeArguments[0];
+    typeBT.typeArguments = <DartType>[typeT];
+    classC.interfaces = <InterfaceType>[typeBT];
+
+    // A
+    expect(
+      _superInterfaces(instA),
+      unorderedEquals([instObject]),
+    );
+
+    // B<D>
+    expect(
+      _superInterfaces(
+        InstantiatedClass(classB, [classD.type]),
+      ),
+      unorderedEquals([instObject, instA]),
+    );
+
+    // C<D>
+    expect(
+      _superInterfaces(
+        InstantiatedClass(classC, [classD.type]),
+      ),
+      unorderedEquals([
+        instObject,
+        instA,
+        InstantiatedClass(classB, [classD.type]),
+      ]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_genericSuperclassPath() {
+    //
+    //  A
+    //  |
+    //  B<T>
+    //  |
+    //  C<T>
+    //
+    //  D
+    //
+
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    ClassElementImpl classA = ElementFactory.classElement2('A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      typeParameterNames: ['T'],
+      supertype: instA.withNullabilitySuffixNone,
+    );
+
+    var typeParametersC = ElementFactory.typeParameters(['T']);
+    var classC = ElementFactory.classElement3(
+      name: 'B',
+      typeParameters: typeParametersC,
+      supertype: InstantiatedClass(
+        classB,
+        [typeParametersC[0].type],
+      ).withNullabilitySuffixNone,
+    );
+
+    var classD = ElementFactory.classElement2('D');
+
+    // A
+    expect(
+      _superInterfaces(instA),
+      unorderedEquals([instObject]),
+    );
+
+    // B<D>
+    expect(
+      _superInterfaces(
+        InstantiatedClass(classB, [classD.type]),
+      ),
+      unorderedEquals([instObject, instA]),
+    );
+
+    // C<D>
+    expect(
+      _superInterfaces(
+        InstantiatedClass(classC, [classD.type]),
+      ),
+      unorderedEquals([
+        instObject,
+        instA,
+        InstantiatedClass(classB, [classD.type]),
+      ]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_mixin_constraints() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(name: 'C');
+    var instC = InstantiatedClass(classC, const []);
+
+    var mixinM = ElementFactory.mixinElement(
+      name: 'M',
+      constraints: [
+        instB.withNullabilitySuffixNone,
+        instC.withNullabilitySuffixNone,
+      ],
+    );
+    var instM = InstantiatedClass(mixinM, const []);
+
+    expect(
+      _superInterfaces(instM),
+      unorderedEquals([instObject, instA, instB, instC]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_mixin_constraints_object() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var mixinM = ElementFactory.mixinElement(name: 'M');
+    var instM = InstantiatedClass(mixinM, const []);
+
+    expect(
+      _superInterfaces(instM),
+      unorderedEquals([instObject]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_mixin_interfaces() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(name: 'C');
+    var instC = InstantiatedClass(classC, const []);
+
+    var mixinM = ElementFactory.mixinElement(
+      name: 'M',
+      interfaces: [
+        instB.withNullabilitySuffixNone,
+        instC.withNullabilitySuffixNone,
+      ],
+    );
+    var instM = InstantiatedClass(mixinM, const []);
+
+    expect(
+      _superInterfaces(instM),
+      unorderedEquals([instObject, instA, instB, instC]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_multipleInterfacePaths() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(
+      name: 'C',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+    var instC = InstantiatedClass(classC, const []);
+
+    var classD = ElementFactory.classElement3(
+      name: 'D',
+      interfaces: [instC.withNullabilitySuffixNone],
+    );
+    var instD = InstantiatedClass(classD, const []);
+
+    var classE = ElementFactory.classElement3(
+      name: 'E',
+      interfaces: [
+        instB.withNullabilitySuffixNone,
+        instD.withNullabilitySuffixNone,
+      ],
+    );
+    var instE = InstantiatedClass(classE, const []);
+
+    // D
+    expect(
+      _superInterfaces(instD),
+      unorderedEquals([instObject, instA, instC]),
+    );
+
+    // E
+    expect(
+      _superInterfaces(instE),
+      unorderedEquals([instObject, instA, instB, instC, instD]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_multipleSuperclassPaths() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      supertype: instA.withNullabilitySuffixNone,
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(
+      name: 'C',
+      supertype: instA.withNullabilitySuffixNone,
+    );
+    var instC = InstantiatedClass(classC, const []);
+
+    var classD = ElementFactory.classElement3(
+      name: 'D',
+      supertype: instC.withNullabilitySuffixNone,
+    );
+    var instD = InstantiatedClass(classD, const []);
+
+    var classE = ElementFactory.classElement3(
+      name: 'E',
+      supertype: instB.withNullabilitySuffixNone,
+      interfaces: [
+        instD.withNullabilitySuffixNone,
+      ],
+    );
+    var instE = InstantiatedClass(classE, const []);
+
+    // D
+    expect(
+      _superInterfaces(instD),
+      unorderedEquals([instObject, instA, instC]),
+    );
+
+    // E
+    expect(
+      _superInterfaces(instE),
+      unorderedEquals([instObject, instA, instB, instC, instD]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_recursion() {
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      supertype: instA.withNullabilitySuffixNone,
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    classA.supertype = instB.withNullabilitySuffixNone;
+
+    expect(
+      _superInterfaces(instB),
+      unorderedEquals([instA, instB]),
+    );
+
+    expect(
+      _superInterfaces(instA),
+      unorderedEquals([instA, instB]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_singleInterfacePath() {
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      interfaces: [instA.withNullabilitySuffixNone],
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(
+      name: 'C',
+      interfaces: [instB.withNullabilitySuffixNone],
+    );
+    var instC = InstantiatedClass(classC, const []);
+
+    // A
+    expect(
+      _superInterfaces(instA),
+      unorderedEquals([instObject]),
+    );
+
+    // B
+    expect(
+      _superInterfaces(instB),
+      unorderedEquals([instObject, instA]),
+    );
+
+    // C
+    expect(
+      _superInterfaces(instC),
+      unorderedEquals([instObject, instA, instB]),
+    );
+  }
+
+  void test_computeSuperinterfaceSet_singleSuperclassPath() {
+    //
+    //  A
+    //  |
+    //  B
+    //  |
+    //  C
+    //
+    var instObject = InstantiatedClass.of(_typeProvider.objectType);
+
+    var classA = ElementFactory.classElement3(name: 'A');
+    var instA = InstantiatedClass(classA, const []);
+
+    var classB = ElementFactory.classElement3(
+      name: 'B',
+      supertype: instA.withNullabilitySuffixNone,
+    );
+    var instB = InstantiatedClass(classB, const []);
+
+    var classC = ElementFactory.classElement3(
+      name: 'C',
+      supertype: instB.withNullabilitySuffixNone,
+    );
+    var instC = InstantiatedClass(classC, const []);
+
+    // A
+    expect(
+      _superInterfaces(instA),
+      unorderedEquals([instObject]),
+    );
+
+    // B
+    expect(
+      _superInterfaces(instB),
+      unorderedEquals([instObject, instA]),
+    );
+
+    // C
+    expect(
+      _superInterfaces(instC),
+      unorderedEquals([instObject, instA, instB]),
+    );
+  }
+
+  int _longestPathToObject(ClassElement element) {
+    return InterfaceLeastUpperBoundHelper.computeLongestInheritancePathToObject(
+        element);
+  }
+
+  Set<InstantiatedClass> _superInterfaces(InstantiatedClass type) {
+    return InterfaceLeastUpperBoundHelper.computeSuperinterfaceSet(type);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/element/test_all.dart b/pkg/analyzer/test/src/dart/element/test_all.dart
index d51bf52..ffecc6d 100644
--- a/pkg/analyzer/test/src/dart/element/test_all.dart
+++ b/pkg/analyzer/test/src/dart/element/test_all.dart
@@ -7,6 +7,8 @@
 import 'element_test.dart' as element;
 import 'function_type_test.dart' as function_type;
 import 'inheritance_manager2_test.dart' as inheritance_manager2;
+import 'inheritance_manager3_test.dart' as inheritance_manager3;
+import 'least_upper_bound_helper_test.dart' as least_upper_bound_helper;
 import 'type_algebra_test.dart' as type_algebra;
 
 /// Utility for manually running all tests.
@@ -15,6 +17,8 @@
     element.main();
     function_type.main();
     inheritance_manager2.main();
+    inheritance_manager3.main();
+    least_upper_bound_helper.main();
     type_algebra.main();
   }, name: 'element');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
index d5e4d8a..d3a06ce 100644
--- a/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/assignment_test.dart
@@ -35,7 +35,7 @@
     assertType(assignment, 'num'); // num + int = num
 
     IndexExpression indexed = assignment.leftHandSide;
-    assertMember(indexed, 'List<num>', listElement.getMethod('[]='));
+    assertMember(indexed, listElement.getMethod('[]='), {'E': 'num'});
     assertType(indexed, 'num');
 
     SimpleIdentifier xRef = indexed.target;
@@ -170,7 +170,11 @@
     assertType(assignment, 'double');
 
     IndexExpression indexed = assignment.leftHandSide;
-    assertMember(indexed, 'Map<int, double>', mapElement.getMethod('[]='));
+    assertMember(
+      indexed,
+      mapElement.getMethod('[]='),
+      {'K': 'int', 'V': 'double'},
+    );
     assertType(indexed, 'double');
   }
 
@@ -266,7 +270,7 @@
     assertType(assignment, 'int');
 
     IndexExpression indexed = assignment.leftHandSide;
-    assertMember(indexed, 'List<int>', listElement.getMethod('[]='));
+    assertMember(indexed, listElement.getMethod('[]='), {'E': 'int'});
     assertType(indexed, 'int');
 
     var xRef = indexed.target;
diff --git a/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart b/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
deleted file mode 100644
index 367b0ee..0000000
--- a/pkg/analyzer/test/src/dart/resolution/definite_assignment_test.dart
+++ /dev/null
@@ -1,1528 +0,0 @@
-// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/ast/token.dart';
-import 'package:analyzer/dart/ast/visitor.dart';
-import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/src/dart/resolver/definite_assignment.dart';
-import 'package:analyzer/src/test_utilities/package_mixin.dart';
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import 'driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(DefiniteAssignmentTrackerTest);
-  });
-}
-
-@reflectiveTest
-class DefiniteAssignmentTrackerTest extends DriverResolutionTest
-    with PackageMixin {
-  DefiniteAssignmentTracker tracker;
-
-  /// Assert that only local variables with the given names are marked as read
-  /// before being written.  All the other local variables are implicitly
-  /// considered definitely assigned.
-  void assertReadBeforeWritten(
-      [String name1, String name2, String name3, String name4]) {
-    var expected = [name1, name2, name3, name4]
-        .where((i) => i != null)
-        .map((name) => findElement.localVar(name))
-        .toList();
-    expect(tracker.readBeforeWritten, unorderedEquals(expected));
-  }
-
-  test_assert() async {
-    await trackCode(r'''
-main() {
-  int v;
-  assert((v = 0) >= 0, v);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftExpression() async {
-    await trackCode(r'''
-main() {
-  List<int> v;
-  v[0] = (v = [1, 2])[1];
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftLocal_compound() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v += 1;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftLocal_compound_assignInRight() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v += (v = v);
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftLocal_pure_eq() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v = 0;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_assignment_leftLocal_pure_eq_self() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v = v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftLocal_pure_questionEq() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v ??= 0;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_assignment_leftLocal_pure_questionEq_self() async {
-    await trackCode(r'''
-main() {
-  int v;
-  v ??= v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_binaryExpression_ifNull_left() async {
-    await trackCode(r'''
-main() {
-  int v;
-  (v = 0) ?? 0;
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_binaryExpression_ifNull_right() async {
-    await trackCode(r'''
-main(int a) {
-  int v;
-  a ?? (v = 0);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_binaryExpression_logicalAnd_left() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  ((v = 0) >= 0) && c;
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_binaryExpression_logicalAnd_right() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  c && ((v = 0) >= 0);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_binaryExpression_logicalOr_left() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  ((v = 0) >= 0) || c;
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_binaryExpression_logicalOr_right() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  c || ((v = 0) >= 0);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_binaryExpression_plus_left() async {
-    await trackCode(r'''
-main() {
-  int v;
-  (v = 0) + 1;
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_binaryExpression_plus_right() async {
-    await trackCode(r'''
-main() {
-  int v;
-  1 + (v = 0);
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_conditionalExpression_both() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  c ? (v = 0) : (v = 0);
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_conditionalExpression_condition() async {
-    await trackCode(r'''
-main() {
-  int v;
-  (v = 0) >= 0 ? 1 : 2;
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_conditionalExpression_else() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  c ? (v = 0) : 2;
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_conditionalExpression_then() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  c ? (v = 0) : 2;
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_doWhile_break_afterAssignment() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  do {
-    v = 0;
-    v;
-    if (c) break;
-  } while (c);
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_doWhile_break_beforeAssignment() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  do {
-    if (c) break;
-    v = 0;
-  } while (c);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_doWhile_breakOuterFromInner() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2, v3;
-  L1: do {
-    do {
-      v1 = 0;
-      if (c) break L1;
-      v2 = 0;
-      v3 = 0;
-    } while (c);
-    v2;
-  } while (c);
-  v1;
-  v3;
-}
-''');
-    assertReadBeforeWritten('v3');
-  }
-
-  test_doWhile_condition() async {
-    await trackCode(r'''
-main() {
-  int v1, v2;
-  do {
-    v1; // assigned in the condition, but not yet
-  } while ((v1 = 0) + (v2 = 0) >= 0);
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1');
-  }
-
-  test_doWhile_condition_break() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  do {
-    if (c) break;
-  } while ((v = 0) >= 0);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_doWhile_condition_break_continue() async {
-    await trackCode(r'''
-main(bool c1, bool c2) {
-  int v1, v2, v3, v4, v5, v6;
-  do {
-    v1 = 0; // visible outside, visible to the condition
-    if (c1) break;
-    v2 = 0; // not visible outside, visible to the condition
-    v3 = 0; // not visible outside, visible to the condition
-    if (c2) continue;
-    v4 = 0; // not visible
-    v5 = 0; // not visible
-  } while ((v6 = v1 + v2 + v4) == 0); // has break => v6 is not visible outside
-  v1;
-  v3;
-  v5;
-  v6;
-}
-''');
-    assertReadBeforeWritten('v3', 'v4', 'v5', 'v6');
-  }
-
-  test_doWhile_condition_continue() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2, v3, v4;
-  do {
-    v1 = 0; // visible outside, visible to the condition
-    if (c) continue;
-    v2 = 0; // not visible
-    v3 = 0; // not visible
-  } while ((v4 = v1 + v2) == 0); // no break => v4 visible outside
-  v1;
-  v3;
-  v4;
-}
-''');
-    assertReadBeforeWritten('v2', 'v3');
-  }
-
-  test_doWhile_continue_beforeAssignment() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  do {
-    if (c) continue;
-    v = 0;
-  } while (c);
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_for_body() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  for (; c;) {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_for_break() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (; c;) {
-    v1 = 0;
-    if (c) break;
-    v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1', 'v2');
-  }
-
-  test_for_break_updaters() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (; c; v1 + v2) {
-    v1 = 0;
-    if (c) break;
-    v2 = 0;
-  }
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_for_condition() async {
-    await trackCode(r'''
-main() {
-  int v;
-  for (; (v = 0) >= 0;) {
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_for_continue() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (; c;) {
-    v1 = 0;
-    if (c) continue;
-    v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1', 'v2');
-  }
-
-  test_for_continue_updaters() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (; c; v1 + v2) {
-    v1 = 0;
-    if (c) continue;
-    v2 = 0;
-  }
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_for_initializer_expression() async {
-    await trackCode(r'''
-main() {
-  int v;
-  for (v = 0;;) {
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_for_initializer_variable() async {
-    await trackCode(r'''
-main() {
-  int v;
-  for (var t = (v = 0);;) {
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_for_updaters() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2, v3, v4;
-  for (; c; v1 = 0, v2 = 0, v3 = 0, v4) {
-    v1;
-  }
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1', 'v2', 'v4');
-  }
-
-  test_for_updaters_afterBody() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  for (; c; v) {
-    v = 0;
-  }
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_forEach() async {
-    await trackCode(r'''
-main() {
-  int v1, v2;
-  for (var _ in (v1 = [0, 1, 2])) {
-    v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_forEach_break() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (var _ in [0, 1, 2]) {
-    v1 = 0;
-    if (c) break;
-    v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1', 'v2');
-  }
-
-  test_forEach_continue() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  for (var _ in [0, 1, 2]) {
-    v1 = 0;
-    if (c) continue;
-    v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v1', 'v2');
-  }
-
-  test_functionExpression_closure_read() async {
-    await trackCode(r'''
-main() {
-  int v1, v2;
-  
-  v1 = 0;
-  
-  [0, 1, 2].forEach((t) {
-    v1;
-    v2;
-  });
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_functionExpression_closure_write() async {
-    await trackCode(r'''
-main() {
-  int v;
-  
-  [0, 1, 2].forEach((t) {
-    v = t;
-  });
-
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_functionExpression_localFunction_local() async {
-    await trackCode(r'''
-main() {
-  int v;
-
-  v = 0;
-
-  void f() {
-    int v; // 1
-    v;
-  }
-}
-''');
-    var localV = findNode.simple('v; // 1').staticElement;
-    expect(tracker.readBeforeWritten, unorderedEquals([localV]));
-  }
-
-  test_functionExpression_localFunction_local2() async {
-    await trackCode(r'''
-main() {
-  int v1;
-
-  v1 = 0;
-
-  void f() {
-    int v2, v3;
-    v2 = 0;
-    v1;
-    v2;
-    v3;
-  }
-}
-''');
-    assertReadBeforeWritten('v3');
-  }
-
-  test_functionExpression_localFunction_read() async {
-    await trackCode(r'''
-main() {
-  int v1, v2, v3;
-
-  v1 = 0;
-
-  void f() {
-    v1;
-    v2;
-  }
-
-  v2 = 0;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_functionExpression_localFunction_write() async {
-    await trackCode(r'''
-main() {
-  int v;
-
-  void f() {
-    v = 0;
-  }
-
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_if_condition() async {
-    await trackCode(r'''
-main() {
-  int v;
-  if ((v = 0) >= 0) {
-    v;
-  } else {
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_if_then() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_if_thenElse_all() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-    v;
-  } else {
-    v = 0;
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_if_thenElse_else() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    // not assigned
-  } else {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_if_thenElse_then() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-  } else {
-    // not assigned
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_if_thenElse_then_exit_alwaysThrows() async {
-    addMetaPackage();
-    await trackCode(r'''
-import 'package:meta/meta.dart';
-
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-  } else {
-    foo();
-  }
-  v;
-}
-
-@alwaysThrows
-void foo() {}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_if_thenElse_then_exit_return() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-  } else {
-    return;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_if_thenElse_then_exit_throw() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  if (c) {
-    v = 0;
-  } else {
-    throw 42;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_switch_case1_default() async {
-    await trackCode(r'''
-main(int e) {
-  int v;
-  switch (e) {
-    case 1:
-      v = 0;
-      break;
-    case 2:
-      // not assigned
-      break;
-    default:
-      v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_switch_case2_default() async {
-    await trackCode(r'''
-main(int e) {
-  int v1, v2;
-  switch (e) {
-    case 1:
-      v1 = 0;
-      v2 = 0;
-      v1;
-      break;
-    default:
-      v1 = 0;
-      v1;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_switch_case_default_break() async {
-    await trackCode(r'''
-main(int e, bool c) {
-  int v1, v2;
-  switch (e) {
-    case 1:
-      v1 = 0;
-      if (c) break;
-      v2 = 0;
-      break;
-    default:
-      v1 = 0;
-      if (c) break;
-      v2 = 0;
-  }
-  v1;
-  v2;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_switch_case_default_continue() async {
-    await trackCode(r'''
-main(int e) {
-  int v;
-  switch (e) {
-    L: case 1:
-      v = 0;
-      break;
-    case 2:
-      continue L;
-    default:
-      v = 0;
-  }
-  v;
-}
-''');
-    // We don't analyze to which `case` we go from `continue L`,
-    // but we don't have to. If all cases assign, then the variable is
-    // not in the `breakSet`. And if there is a case when it is not assigned,
-    // we the variable will be left in the `breakSet`.
-    assertReadBeforeWritten();
-  }
-
-  test_switch_case_noDefault() async {
-    await trackCode(r'''
-main(int e) {
-  int v;
-  switch (e) {
-    case 1:
-      v = 0;
-      break;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_switch_condition() async {
-    await trackCode(r'''
-main() {
-  int v;
-  switch (v = 0) {}
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_tryCatch_all() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    f();
-    v = 0;
-  } catch (_) {
-    v = 0;
-  }
-  v;
-}
-
-void f() {}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_tryCatch_catch() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    // not assigned
-  } catch (_) {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_tryCatch_try() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    v = 0;
-  } catch (_) {
-    // not assigned
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_tryCatchFinally_catch() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    // not assigned
-  } catch (_) {
-    v = 0;
-  } finally {
-    // not assigned
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_tryCatchFinally_finally() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    // not assigned
-  } catch (_) {
-    // not assigned
-  } finally {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_tryCatchFinally_try() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    v = 0;
-  } catch (_) {
-    // not assigned
-  } finally {
-    // not assigned
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten('v');
-  }
-
-  test_tryFinally_finally() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    // not assigned
-  } finally {
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_tryFinally_try() async {
-    await trackCode(r'''
-main() {
-  int v;
-  try {
-    v = 0;
-  } finally {
-    // not assigned
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_condition() async {
-    await trackCode(r'''
-main() {
-  int v;
-  while ((v = 0) >= 0) {
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_condition_notTrue() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  while (c) {
-    v1 = 0;
-    v2 = 0;
-    v1;
-  }
-  v2;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_while_true_break_afterAssignment() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  while (true) {
-    v1 = 0;
-    v1;
-    if (c) break;
-    v1;
-    v2 = 0;
-    v2;
-  }
-  v1;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_true_break_beforeAssignment() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  while (true) {
-    if (c) break;
-    v1 = 0;
-    v2 = 0;
-    v2;
-  }
-  v1;
-}
-''');
-    assertReadBeforeWritten('v1');
-  }
-
-  test_while_true_break_if() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  while (true) {
-    if (c) {
-      v = 0;
-      break;
-    } else {
-      v = 0;
-      break;
-    }
-    v;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_true_break_if2() async {
-    await trackCode(r'''
-main(bool c) {
-  var v;
-  while (true) {
-    if (c) {
-      break;
-    } else {
-      v = 0;
-    }
-    v;
-  }
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_true_break_if3() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2;
-  while (true) {
-    if (c) {
-      v1 = 0;
-      v2 = 0;
-      if (c) break;
-    } else {
-      if (c) break;
-      v1 = 0;
-      v2 = 0;
-    }
-    v1;
-  }
-  v2;
-}
-''');
-    assertReadBeforeWritten('v2');
-  }
-
-  test_while_true_breakOuterFromInner() async {
-    await trackCode(r'''
-main(bool c) {
-  int v1, v2, v3;
-  L1: while (true) {
-    L2: while (true) {
-      v1 = 0;
-      if (c) break L1;
-      v2 = 0;
-      v3 = 0;
-      if (c) break L2;
-    }
-    v2;
-  }
-  v1;
-  v3;
-}
-''');
-    assertReadBeforeWritten('v3');
-  }
-
-  test_while_true_continue() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  while (true) {
-    if (c) continue;
-    v = 0;
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  test_while_true_noBreak() async {
-    await trackCode(r'''
-main(bool c) {
-  int v;
-  while (true) {
-    // No assignment, but not break.
-    // So, we don't exit the loop.
-    // So, all variables are assigned.
-  }
-  v;
-}
-''');
-    assertReadBeforeWritten();
-  }
-
-  /// Resolve the given [code] and track assignments in the unit.
-  Future<void> trackCode(String code) async {
-    addTestFile(code);
-    await resolveTestFile();
-
-    tracker = DefiniteAssignmentTracker();
-
-    var visitor = _AstVisitor(tracker);
-    result.unit.accept(visitor);
-  }
-}
-
-/// [AstVisitor] that drives the [tracker] in the way we expect the resolver
-/// will do in production.
-class _AstVisitor extends RecursiveAstVisitor<void> {
-  final DefiniteAssignmentTracker tracker;
-
-  _AstVisitor(this.tracker);
-
-  @override
-  void visitAssertStatement(AssertStatement node) {
-    tracker.beginAssertStatement();
-    super.visitAssertStatement(node);
-    tracker.endAssertStatement();
-  }
-
-  @override
-  void visitAssignmentExpression(AssignmentExpression node) {
-    var left = node.leftHandSide;
-    var right = node.rightHandSide;
-
-    LocalVariableElement localElement;
-    if (left is SimpleIdentifier) {
-      var element = left.staticElement;
-      if (element is LocalVariableElement) {
-        localElement = element;
-      }
-    }
-
-    if (localElement != null) {
-      var isPure = node.operator.type == TokenType.EQ;
-      if (!isPure) {
-        tracker.read(localElement);
-      }
-      right.accept(this);
-      tracker.write(localElement);
-    } else {
-      left.accept(this);
-      right.accept(this);
-    }
-  }
-
-  @override
-  void visitBinaryExpression(BinaryExpression node) {
-    var left = node.leftOperand;
-    var right = node.rightOperand;
-
-    var operator = node.operator.type;
-    var isLogical = operator == TokenType.AMPERSAND_AMPERSAND ||
-        operator == TokenType.BAR_BAR ||
-        operator == TokenType.QUESTION_QUESTION;
-
-    left.accept(this);
-
-    if (isLogical) {
-      tracker.beginBinaryExpressionLogicalRight();
-    }
-
-    right.accept(this);
-
-    if (isLogical) {
-      tracker.endBinaryExpressionLogicalRight();
-    }
-  }
-
-  @override
-  void visitBreakStatement(BreakStatement node) {
-    var target = _getLabelTarget(node, node.label?.staticElement);
-    tracker.handleBreak(target);
-    super.visitBreakStatement(node);
-  }
-
-  @override
-  void visitConditionalExpression(ConditionalExpression node) {
-    var condition = node.condition;
-    var thenExpression = node.thenExpression;
-    var elseExpression = node.elseExpression;
-
-    condition.accept(this);
-
-    tracker.beginConditionalExpressionThen();
-    thenExpression.accept(this);
-
-    tracker.beginConditionalExpressionElse();
-    elseExpression.accept(this);
-
-    tracker.endConditionalExpression();
-  }
-
-  @override
-  void visitContinueStatement(ContinueStatement node) {
-    var target = _getLabelTarget(node, node.label?.staticElement);
-    tracker.handleContinue(target);
-    super.visitContinueStatement(node);
-  }
-
-  @override
-  void visitDoStatement(DoStatement node) {
-    var body = node.body;
-    var condition = node.condition;
-
-    tracker.beginDoWhileStatement(node);
-    body.accept(this);
-
-    tracker.beginDoWhileStatementCondition();
-    condition.accept(this);
-
-    tracker.endDoWhileStatement();
-  }
-
-  @override
-  void visitForStatement(ForStatement node) {
-    var parts = node.forLoopParts;
-
-    tracker.beginForStatement2(node);
-
-    if (parts is ForParts) {
-      if (parts is ForPartsWithDeclarations) {
-        parts.variables?.accept(this);
-      } else if (parts is ForPartsWithExpression) {
-        parts.initialization?.accept(this);
-      } else {
-        throw new StateError('Unrecognized for loop parts');
-      }
-      parts.condition?.accept(this);
-    } else if (parts is ForEachParts) {
-      parts.iterable.accept(this);
-    } else {
-      throw new StateError('Unrecognized for loop parts');
-    }
-
-    tracker.beginForStatement2Body();
-    node.body?.accept(this);
-
-    if (parts is ForParts) {
-      tracker.beginForStatementUpdaters();
-      parts.updaters?.accept(this);
-    }
-
-    tracker.endForStatement2();
-  }
-
-  @override
-  void visitFunctionDeclaration(FunctionDeclaration node) {
-    super.visitFunctionDeclaration(node);
-    if (node.parent is CompilationUnit) {
-      expect(tracker.isRootBranch, isTrue);
-    }
-  }
-
-  @override
-  void visitFunctionExpression(FunctionExpression node) {
-    tracker.beginFunctionExpression();
-    super.visitFunctionExpression(node);
-    tracker.endFunctionExpression();
-  }
-
-  @override
-  void visitIfStatement(IfStatement node) {
-    var condition = node.condition;
-    var thenStatement = node.thenStatement;
-    var elseStatement = node.elseStatement;
-
-    condition.accept(this);
-
-    tracker.beginIfStatementThen();
-    thenStatement.accept(this);
-
-    if (elseStatement != null) {
-      tracker.beginIfStatementElse();
-      elseStatement.accept(this);
-    }
-
-    tracker.endIfStatement(elseStatement != null);
-  }
-
-  @override
-  void visitMethodInvocation(MethodInvocation node) {
-    super.visitMethodInvocation(node);
-    var element = node.methodName.staticElement;
-    if (element != null && element.hasAlwaysThrows) {
-      tracker.handleExit();
-    }
-  }
-
-  @override
-  void visitReturnStatement(ReturnStatement node) {
-    super.visitReturnStatement(node);
-    tracker.handleExit();
-  }
-
-  @override
-  void visitSimpleIdentifier(SimpleIdentifier node) {
-    var element = node.staticElement;
-    if (element is LocalVariableElement) {
-      if (node.inGetterContext()) {
-        tracker.read(element);
-      }
-    }
-
-    super.visitSimpleIdentifier(node);
-  }
-
-  @override
-  void visitSwitchStatement(SwitchStatement node) {
-    tracker.beginSwitchStatement(node);
-
-    node.expression.accept(this);
-    tracker.endSwitchStatementExpression();
-
-    var members = node.members;
-    var membersLength = members.length;
-    var hasDefault = false;
-    for (var i = 0; i < membersLength; i++) {
-      var member = members[i];
-      tracker.beginSwitchStatementMember();
-      member.accept(this);
-      // Implicit `break` at the end of `default`.
-      if (member is SwitchDefault) {
-        hasDefault = true;
-        tracker.handleBreak(node);
-      }
-    }
-
-    tracker.endSwitchStatement(hasDefault);
-  }
-
-  @override
-  void visitThrowExpression(ThrowExpression node) {
-    super.visitThrowExpression(node);
-    tracker.handleExit();
-  }
-
-  @override
-  void visitTryStatement(TryStatement node) {
-    var body = node.body;
-    var catchClauses = node.catchClauses;
-
-    tracker.beginTryStatement();
-
-    body.accept(this);
-    tracker.endTryStatementBody();
-
-    var catchLength = catchClauses.length;
-    for (var i = 0; i < catchLength; ++i) {
-      var catchClause = catchClauses[i];
-      tracker.beginTryStatementCatchClause();
-      catchClause.accept(this);
-      tracker.endTryStatementCatchClause();
-    }
-
-    tracker.endTryStatementCatchClauses();
-
-    node.finallyBlock?.accept(this);
-  }
-
-  @override
-  void visitVariableDeclarationStatement(VariableDeclarationStatement node) {
-    var variables = node.variables.variables;
-    for (var i = 0; i < variables.length; ++i) {
-      var variable = variables[i];
-      tracker.add(variable.declaredElement,
-          assigned: variable.initializer != null);
-    }
-
-    super.visitVariableDeclarationStatement(node);
-  }
-
-  @override
-  void visitWhileStatement(WhileStatement node) {
-    var condition = node.condition;
-    var body = node.body;
-
-    tracker.beginWhileStatement(node);
-    condition.accept(this);
-
-    var conditionIsLiteralTrue = condition is BooleanLiteral && condition.value;
-    tracker.beginWhileStatementBody(conditionIsLiteralTrue);
-    body.accept(this);
-
-    tracker.endWhileStatement();
-  }
-
-  /// This code has OK performance for tests, but think if there is something
-  /// better when using in production.
-  AstNode _getLabelTarget(AstNode node, LabelElement element) {
-    for (; node != null; node = node.parent) {
-      if (node is DoStatement ||
-          node is ForStatement ||
-          node is SwitchStatement ||
-          node is WhileStatement) {
-        if (element == null) {
-          return node;
-        }
-        var parent = node.parent;
-        if (parent is LabeledStatement) {
-          for (var nodeLabel in parent.labels) {
-            if (identical(nodeLabel.label.staticElement, element)) {
-              return node;
-            }
-          }
-        }
-      }
-      if (element != null && node is SwitchStatement) {
-        for (var member in node.members) {
-          for (var nodeLabel in member.labels) {
-            if (identical(nodeLabel.label.staticElement, element)) {
-              return node;
-            }
-          }
-        }
-      }
-    }
-    return null;
-  }
-}
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
new file mode 100644
index 0000000..b6633c9
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/extension_method_test.dart
@@ -0,0 +1,1493 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionMethodsDeclarationTest);
+    defineReflectiveTests(ExtensionMethodsExternalReferenceTest);
+    defineReflectiveTests(ExtensionMethodsInternalReferenceTest);
+  });
+}
+
+abstract class BaseExtensionMethodsTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+}
+
+/// Tests that show that extension declarations and the members inside them are
+/// resolved correctly.
+@reflectiveTest
+class ExtensionMethodsDeclarationTest extends BaseExtensionMethodsTest {
+  @failingTest
+  test_metadata() async {
+    await assertNoErrorsInCode('''
+const int ann = 1;
+class C {}
+@ann
+extension E on C {}
+''');
+    var annotation = findNode.annotation('@ann');
+    assertElement(annotation, findElement.topVar('ann'));
+  }
+
+  test_multipleExtensions_noConflict() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E1 on C {}
+extension E2 on C {}
+''');
+  }
+
+  test_named_generic() async {
+    await assertNoErrorsInCode('''
+class C<T> {}
+extension E<S> on C<S> {}
+''');
+    var extendedType = findNode.typeAnnotation('C<S>');
+    assertElement(extendedType, findElement.class_('C'));
+    assertType(extendedType, 'C<S>');
+  }
+
+  test_named_onDynamic() async {
+    await assertNoErrorsInCode('''
+extension E on dynamic {}
+''');
+    var extendedType = findNode.typeAnnotation('dynamic');
+    assertType(extendedType, 'dynamic');
+  }
+
+  test_named_onEnum() async {
+    await assertNoErrorsInCode('''
+enum A {a, b, c}
+extension E on A {}
+''');
+    var extendedType = findNode.typeAnnotation('A {}');
+    assertElement(extendedType, findElement.enum_('A'));
+    assertType(extendedType, 'A');
+  }
+
+  test_named_onFunctionType() async {
+    try {
+      await assertNoErrorsInCode('''
+extension E on int Function(int) {}
+''');
+      var extendedType = findNode.typeAnnotation('Function');
+      assertType(extendedType, 'int Function(int)');
+      if (!AnalysisDriver.useSummary2) {
+        throw 'Test passed - expected to fail.';
+      }
+    } on String {
+      rethrow;
+    } catch (e) {
+      if (AnalysisDriver.useSummary2) {
+        rethrow;
+      }
+    }
+  }
+
+  test_named_onInterface() async {
+    await assertNoErrorsInCode('''
+class C { }
+extension E on C {}
+''');
+    var extendedType = findNode.typeAnnotation('C {}');
+    assertElement(extendedType, findElement.class_('C'));
+    assertType(extendedType, 'C');
+  }
+
+  test_unnamed_generic() async {
+    await assertNoErrorsInCode('''
+class C<T> {}
+extension<S> on C<S> {}
+''');
+    var extendedType = findNode.typeAnnotation('C<S>');
+    assertElement(extendedType, findElement.class_('C'));
+    assertType(extendedType, 'C<S>');
+  }
+
+  test_unnamed_onDynamic() async {
+    await assertNoErrorsInCode('''
+extension on dynamic {}
+''');
+    var extendedType = findNode.typeAnnotation('dynamic');
+    assertType(extendedType, 'dynamic');
+  }
+
+  test_unnamed_onEnum() async {
+    await assertNoErrorsInCode('''
+enum A {a, b, c}
+extension on A {}
+''');
+    var extendedType = findNode.typeAnnotation('A {}');
+    assertElement(extendedType, findElement.enum_('A'));
+    assertType(extendedType, 'A');
+  }
+
+  @failingTest
+  test_unnamed_onFunctionType() async {
+    await assertNoErrorsInCode('''
+extension on int Function(int) {}
+''');
+    var extendedType = findNode.typeAnnotation('int ');
+    assertType(extendedType, 'int Function(int)');
+  }
+
+  test_unnamed_onInterface() async {
+    await assertNoErrorsInCode('''
+class C { }
+extension on C {}
+''');
+    var extendedType = findNode.typeAnnotation('C {}');
+    assertElement(extendedType, findElement.class_('C'));
+    assertType(extendedType, 'C');
+  }
+
+  test_visibility_hidden() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+extension E on C {
+  int a = 1;
+}
+''');
+    await assertErrorsInCode('''
+import 'lib.dart' hide E;
+
+f(C c) {
+  c.a;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+    ]);
+  }
+
+  test_visibility_notShown() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+extension E on C {
+  int a = 1;
+}
+''');
+    await assertErrorsInCode('''
+import 'lib.dart' show C;
+
+f(C c) {
+  c.a;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_GETTER, 40, 1),
+    ]);
+  }
+}
+
+/// Tests that extension members can be correctly resolved when referenced
+/// by code external to the extension declaration.
+@reflectiveTest
+class ExtensionMethodsExternalReferenceTest extends BaseExtensionMethodsTest {
+  /// Corresponds to: extension_member_resolution_t07
+  test_dynamicInvocation() async {
+    await assertNoErrorsInCode(r'''
+class A {}
+class C extends A {
+  String method(int i) => "$i";
+  noSuchMethod(Invocation i) { }
+}
+
+extension E<T extends A> on T {
+  String method(int i, String s) => '';
+}
+
+main() {
+  dynamic c = new C();
+  c.method(42, "-42");
+}
+''');
+  }
+
+  test_instance_call_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  int call(int x) => 0;
+}
+
+extension E on C {
+  int call(int x) => 0;
+}
+
+f(C c) {
+  c(2);
+}
+''');
+    var invocation = findNode.methodInvocation('c(2)');
+    expect(invocation.staticInvokeType.element,
+        same(findElement.method('call', of: 'C')));
+    assertInvokeType(invocation, 'int Function(int)');
+  }
+
+  test_instance_call_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int call(int x) => 0;
+}
+
+f(C c) {
+  c(2);
+}
+''');
+    var invocation = findNode.methodInvocation('c(2)');
+    expect(invocation.staticInvokeType.element,
+        same(findElement.method('call', of: 'E')));
+    assertInvokeType(invocation, 'int Function(int)');
+  }
+
+  test_instance_call_fromExtension_int() async {
+    await assertNoErrorsInCode('''
+extension E on int {
+  int call(int x) => 0;
+}
+
+f() {
+  1(2);
+}
+''');
+    var invocation = findNode.functionExpressionInvocation('1(2)');
+    expect(invocation.staticInvokeType.element,
+        same(findElement.method('call', of: 'E')));
+    assertInvokeType(invocation, 'int Function(int)');
+  }
+
+  test_instance_compoundAssignment_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  C operator +(int i) => this;
+}
+extension E on C {
+  C operator +(int i) => this;
+}
+f(C c) {
+  c += 2;
+}
+''');
+    var assignment = findNode.assignment('+=');
+    assertElement(assignment, findElement.method('+', of: 'C'));
+  }
+
+  test_instance_compoundAssignment_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  C operator +(int i) => this;
+}
+f(C c) {
+  c += 2;
+}
+''');
+    var assignment = findNode.assignment('+=');
+    assertElement(assignment, findElement.method('+', of: 'E'));
+  }
+
+  test_instance_getter_fromDifferentExtension_usingBounds() async {
+    await assertNoErrorsInCode('''
+class B {}
+extension E1 on B {
+  int get g => 0;
+}
+extension E2<T extends B> on T {
+  void a() {
+    g;
+  }
+}
+''');
+    var identifier = findNode.simple('g;');
+    assertElement(identifier, findElement.getter('g'));
+  }
+
+  test_instance_getter_fromDifferentExtension_withoutTarget() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E1 on C {
+  int get a => 1;
+}
+extension E2 on C {
+  void m() {
+    a;
+  }
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_instance_getter_fromExtendedType_usingBounds() async {
+    await assertNoErrorsInCode('''
+class B {
+  int get g => 0;
+}
+extension E<T extends B> on T {
+  void a() {
+    g;
+  }
+}
+''');
+    var identifier = findNode.simple('g;');
+    assertElement(identifier, findElement.getter('g'));
+  }
+
+  test_instance_getter_fromExtendedType_withoutTarget() async {
+    await assertNoErrorsInCode('''
+class C {
+  void m() {
+    a;
+  }
+}
+extension E on C {
+  int get a => 1;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_instance_getter_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int get a => 1;
+}
+
+f(C c) {
+  c.a;
+}
+''');
+    var access = findNode.prefixed('c.a');
+    assertElement(access, findElement.getter('a'));
+    assertType(access, 'int');
+  }
+
+  test_instance_getter_methodInvocation() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  double Function(int) get a => (b) => 2.0;
+}
+
+f(C c) {
+  c.a(0);
+}
+''');
+    var invocation = findNode.methodInvocation('a(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('a'),
+      'double Function(int)',
+      expectedMethodNameType: 'double Function(int) Function()',
+    );
+  }
+
+  test_instance_getter_specificSubtypeMatchLocal() async {
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {}
+
+extension A_Ext on A {
+  int get a => 1;
+}
+extension B_Ext on B {
+  int get a => 2;
+}
+
+f(B b) {
+  b.a;
+}
+''');
+    var access = findNode.prefixed('b.a');
+    assertElement(access, findElement.getter('a', of: 'B_Ext'));
+    assertType(access, 'int');
+  }
+
+  test_instance_getter_with_setter() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int get a => 1;
+}
+
+extension E2 on C {
+  set a(int v) { }
+}
+
+f(C c) {
+  print(c.a);
+}
+''');
+    var access = findNode.prefixed('c.a');
+    assertElement(access, findElement.getter('a'));
+    assertType(access, 'int');
+  }
+
+  test_instance_method_fromDifferentExtension_usingBounds() async {
+    await assertNoErrorsInCode('''
+class B {}
+extension E1 on B {
+  void m() {}
+}
+extension E2<T extends B> on T {
+  void a() {
+    m();
+  }
+}
+''');
+    var invocation = findNode.methodInvocation('m();');
+    assertElement(invocation, findElement.method('m'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromDifferentExtension_withoutTarget() async {
+    await assertNoErrorsInCode('''
+class B {}
+extension E1 on B {
+  void a() {}
+}
+extension E2 on B {
+  void m() {
+    a();
+  }
+}
+''');
+    var invocation = findNode.methodInvocation('a();');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromExtendedType_usingBounds() async {
+    await assertNoErrorsInCode('''
+class B {
+  void m() {}
+}
+extension E<T extends B> on T {
+  void a() {
+    m();
+  }
+}
+''');
+    var invocation = findNode.methodInvocation('m();');
+    assertElement(invocation, findElement.method('m'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromExtendedType_withoutTarget() async {
+    await assertNoErrorsInCode('''
+class B {
+  void m() {
+    a();
+  }
+}
+extension E on B {
+  void a() {}
+}
+''');
+    var invocation = findNode.methodInvocation('a();');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromInstance() async {
+    await assertNoErrorsInCode('''
+class B {}
+
+extension A on B {
+  void a() {}
+}
+
+f(B b) {
+  b.a();
+}
+''');
+    var invocation = findNode.methodInvocation('b.a()');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_moreSpecificThanPlatform() async {
+    //
+    // An extension with on type clause T1 is more specific than another
+    // extension with on type clause T2 iff
+    //
+    // 1. The latter extension is declared in a platform library, and the former
+    //    extension is not
+    //
+    newFile('/test/lib/core.dart', content: '''
+library dart.core;
+
+class Core {}
+''');
+
+    await assertNoErrorsInCode('''
+import 'core.dart' as platform;
+
+class Core2 extends platform.Core {}
+
+extension Core_Ext on platform.Core {
+  void a() {}
+}
+
+extension Core2_Ext on Core2 {
+  void a() {}
+}
+
+f(Core2 c) {
+  c.a();
+}
+''');
+    var invocation = findNode.methodInvocation('c.a()');
+    assertElement(invocation, findElement.method('a', of: 'Core2_Ext'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_specificSubtypeMatchLocal() async {
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {}
+
+extension A_Ext on A {
+  void a() {}
+}
+extension B_Ext on B {
+  void a() {}
+}
+
+f(B b) {
+  b.a();
+}
+''');
+
+    var invocation = findNode.methodInvocation('b.a()');
+    assertElement(invocation, findElement.method('a', of: 'B_Ext'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  @failingTest
+  test_instance_method_specificSubtypeMatchLocalGenerics() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+class B<T> extends A<T> {}
+
+class C {}
+
+extension A_Ext<T> on A<T> {
+  void f(T x) {}
+}
+
+extension B_Ext<T> on B<T> {
+  void f(T x) {}
+}
+
+f(B<C> x, C o) {
+  x.f(o);
+}
+''');
+    var invocation = findNode.methodInvocation('x.f(o)');
+    assertElement(invocation, findElement.method('f', of: 'B_Ext'));
+    assertInvokeType(invocation, 'void Function(T)');
+  }
+
+  test_instance_method_specificSubtypeMatchPlatform() async {
+    newFile('/test/lib/core.dart', content: '''
+library dart.core;
+
+class Core {}
+
+class Core2 extends Core {}
+''');
+    await assertNoErrorsInCode('''
+import 'core.dart';
+
+extension Core_Ext on Core {
+  void a() {}
+}
+
+extension Core2_Ext on Core2 {
+  void a() => 0;
+}
+
+f(Core2 c) {
+  c.a();
+}
+''');
+    var invocation = findNode.methodInvocation('c.a()');
+    assertElement(invocation, findElement.method('a', of: 'Core2_Ext'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_operator_binary_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator +(int i) {}
+}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  c + 2;
+}
+''');
+    var binary = findNode.binary('+ ');
+    assertElement(binary, findElement.method('+', of: 'C'));
+  }
+
+  test_instance_operator_binary_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  c + 2;
+}
+''');
+    var binary = findNode.binary('+ ');
+    assertElement(binary, findElement.method('+', of: 'E'));
+  }
+
+  test_instance_operator_index_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator [](int index) {}
+}
+extension E on C {
+  void operator [](int index) {}
+}
+f(C c) {
+  c[2];
+}
+''');
+    var index = findNode.index('c[2]');
+    assertElement(index, findElement.method('[]', of: 'C'));
+  }
+
+  test_instance_operator_index_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator [](int index) {}
+}
+f(C c) {
+  c[2];
+}
+''');
+    var index = findNode.index('c[2]');
+    assertElement(index, findElement.method('[]', of: 'E'));
+  }
+
+  test_instance_operator_indexEquals_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator []=(int index, int value) {}
+}
+extension E on C {
+  void operator []=(int index, int value) {}
+}
+f(C c) {
+  c[2] = 1;
+}
+''');
+    var index = findNode.index('c[2]');
+    assertElement(index, findElement.method('[]=', of: 'C'));
+  }
+
+  test_instance_operator_indexEquals_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator []=(int index, int value) {}
+}
+f(C c) {
+  c[2] = 3;
+}
+''');
+    var index = findNode.index('c[2]');
+    assertElement(index, findElement.method('[]=', of: 'E'));
+  }
+
+  test_instance_operator_postfix_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator +(int i) {}
+}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  c++;
+}
+''');
+    var postfix = findNode.postfix('++');
+    assertElement(postfix, findElement.method('+', of: 'C'));
+  }
+
+  test_instance_operator_postfix_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  c++;
+}
+''');
+    var postfix = findNode.postfix('++');
+    assertElement(postfix, findElement.method('+', of: 'E'));
+  }
+
+  test_instance_operator_prefix_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator +(int i) {}
+}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  ++c;
+}
+''');
+    var prefix = findNode.prefix('++');
+    assertElement(prefix, findElement.method('+', of: 'C'));
+  }
+
+  test_instance_operator_prefix_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator +(int i) {}
+}
+f(C c) {
+  ++c;
+}
+''');
+    var prefix = findNode.prefix('++');
+    assertElement(prefix, findElement.method('+', of: 'E'));
+  }
+
+  test_instance_operator_unary_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator -() {}
+}
+extension E on C {
+  void operator -() {}
+}
+f(C c) {
+  -c;
+}
+''');
+    var prefix = findNode.prefix('-c');
+    assertElement(prefix, findElement.method('unary-', of: 'C'));
+  }
+
+  test_instance_operator_unary_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator -() {}
+}
+f(C c) {
+  -c;
+}
+''');
+    var prefix = findNode.prefix('-c');
+    assertElement(prefix, findElement.method('unary-', of: 'E'));
+  }
+
+  test_instance_setter_oneMatch() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  set a(int x) {}
+}
+
+f(C c) {
+  c.a = 1;
+}
+''');
+    var access = findNode.prefixed('c.a');
+    assertElement(access, findElement.setter('a'));
+  }
+
+  test_instance_setter_with_getter() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int get a => 1;
+}
+
+extension E2 on C {
+  set a(int v) { }
+}
+
+f(C c) {
+  print(c.a = 1);
+}
+''');
+    var access = findNode.prefixed('c.a');
+    assertElement(access, findElement.setter('a'));
+    assertType(access, 'int');
+  }
+
+  test_instance_tearoff() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  void a(int x) {}
+}
+
+f(C c) => c.a;
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  test_static_field_importedWithPrefix() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+
+extension E on C {
+  static int a = 1;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+
+f() {
+  p.E.a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    var import = findElement.importFind('package:test/lib.dart');
+    assertElement(identifier, import.extension_('E').getGetter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_field_local() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int a = 1;
+}
+
+f() {
+  E.a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_getter_importedWithPrefix() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+
+extension E on C {
+  static int get a => 1;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+
+f() {
+  p.E.a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    var import = findElement.importFind('package:test/lib.dart');
+    assertElement(identifier, import.extension_('E').getGetter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_getter_local() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int get a => 1;
+}
+
+f() {
+  E.a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_method_importedWithPrefix() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+
+extension E on C {
+  static void a() {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+
+f() {
+  p.E.a();
+}
+''');
+    var invocation = findNode.methodInvocation('E.a()');
+    var import = findElement.importFind('package:test/lib.dart');
+    assertElement(invocation, import.extension_('E').getMethod('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_static_method_local() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static void a() {}
+}
+
+f() {
+  E.a();
+}
+''');
+    var invocation = findNode.methodInvocation('E.a()');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_static_setter_importedWithPrefix() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+
+extension E on C {
+  static set a(int x) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+
+f() {
+  p.E.a = 3;
+}
+''');
+    var identifier = findNode.simple('a =');
+    var import = findElement.importFind('package:test/lib.dart');
+    assertElement(identifier, import.extension_('E').getSetter('a'));
+  }
+
+  test_static_setter_local() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static set a(int x) {}
+}
+
+f() {
+  E.a = 3;
+}
+''');
+    var identifier = findNode.simple('a =');
+    assertElement(identifier, findElement.setter('a'));
+  }
+
+  test_static_tearoff() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static void a(int x) {}
+}
+
+f() => E.a;
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  test_thisAccessOnDynamic() async {
+    await assertNoErrorsInCode('''
+extension on dynamic {
+  int get d => 3;
+
+  void testDynamic() {
+    // Static type of `this` is dynamic, allows dynamic invocation.
+    this.arglebargle();
+  }
+}
+''');
+  }
+
+  test_thisAccessOnFunction() async {
+    await assertNoErrorsInCode('''
+extension on Function {
+  int get f => 4;
+
+  void testFunction() {
+    // Static type of `this` is Function. Allows any dynamic invocation.
+    this();
+    this(1);
+    this(x: 1);
+    // No function can have both optional positional and named parameters.
+  }
+}
+''');
+  }
+}
+
+/// Tests that extension members can be correctly resolved when referenced
+/// by code internal to (within) the extension declaration.
+@reflectiveTest
+class ExtensionMethodsInternalReferenceTest extends BaseExtensionMethodsTest {
+  test_instance_call() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int call(int x) => 0;
+  int m() => this(2);
+}
+''');
+    var invocation = findNode.functionExpressionInvocation('this(2)');
+    assertElement(invocation, findElement.method('call', of: 'E'));
+    assertType(invocation, 'int');
+  }
+
+  test_instance_getter_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {
+  int get a => 1;
+}
+
+extension E on C {
+  int get a => 1;
+  int m() => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a', of: 'E'));
+    assertType(identifier, 'int');
+  }
+
+  test_instance_getter_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  int get a => 1;
+}
+
+extension E on C {
+  int get a => 1;
+  int m() => this.a;
+}
+''');
+    var access = findNode.propertyAccess('this.a');
+    assertPropertyAccess(access, findElement.getter('a', of: 'C'), 'int');
+  }
+
+  test_instance_getter_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int get a => 1;
+  int m() => this.a;
+}
+''');
+    var access = findNode.propertyAccess('this.a');
+    assertPropertyAccess(access, findElement.getter('a', of: 'E'), 'int');
+  }
+
+  test_instance_method_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {
+  void a() {}
+}
+extension E on C {
+  void a() {}
+  void b() { a(); }
+}
+''');
+    var invocation = findNode.methodInvocation('a();');
+    assertElement(invocation, findElement.method('a', of: 'E'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void a() {}
+}
+extension E on C {
+  void a() {}
+  void b() { this.a(); }
+}
+''');
+    var invocation = findNode.methodInvocation('this.a');
+    assertElement(invocation, findElement.method('a', of: 'C'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_method_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void a() {}
+  void b() { this.a(); }
+}
+''');
+    var invocation = findNode.methodInvocation('this.a');
+    assertElement(invocation, findElement.method('a', of: 'E'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_instance_operator_binary_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator +(int i) {}
+}
+extension E on C {
+  void operator +(int i) {}
+  void b() { this + 2; }
+}
+''');
+    var binary = findNode.binary('+ ');
+    assertElement(binary, findElement.method('+', of: 'C'));
+  }
+
+  test_instance_operator_binary_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator +(int i) {}
+  void b() { this + 2; }
+}
+''');
+    var binary = findNode.binary('+ ');
+    assertElement(binary, findElement.method('+', of: 'E'));
+  }
+
+  test_instance_operator_index_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator [](int index) {}
+}
+extension E on C {
+  void operator [](int index) {}
+  void b() { this[2]; }
+}
+''');
+    var index = findNode.index('this[2]');
+    assertElement(index, findElement.method('[]', of: 'C'));
+  }
+
+  test_instance_operator_index_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator [](int index) {}
+  void b() { this[2]; }
+}
+''');
+    var index = findNode.index('this[2]');
+    assertElement(index, findElement.method('[]', of: 'E'));
+  }
+
+  test_instance_operator_indexEquals_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator []=(int index, int value) {}
+}
+extension E on C {
+  void operator []=(int index, int value) {}
+  void b() { this[2] = 1; }
+}
+''');
+    var index = findNode.index('this[2]');
+    assertElement(index, findElement.method('[]=', of: 'C'));
+  }
+
+  test_instance_operator_indexEquals_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator []=(int index, int value) {}
+  void b() { this[2] = 3; }
+}
+''');
+    var index = findNode.index('this[2]');
+    assertElement(index, findElement.method('[]=', of: 'E'));
+  }
+
+  test_instance_operator_unary_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  void operator -() {}
+}
+extension E on C {
+  void operator -() {}
+  void b() { -this; }
+}
+''');
+    var prefix = findNode.prefix('-this');
+    assertElement(prefix, findElement.method('unary-', of: 'C'));
+  }
+
+  test_instance_operator_unary_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator -() {}
+  void b() { -this; }
+}
+''');
+    var prefix = findNode.prefix('-this');
+    assertElement(prefix, findElement.method('unary-', of: 'E'));
+  }
+
+  test_instance_setter_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {
+  set a(int) {}
+}
+
+extension E on C {
+  set a(int) {}
+  void m() {
+    a = 3;
+  }
+}
+''');
+    var identifier = findNode.simple('a =');
+    assertElement(identifier, findElement.setter('a', of: 'E'));
+  }
+
+  test_instance_setter_fromThis_fromExtendedType() async {
+    await assertNoErrorsInCode('''
+class C {
+  set a(int) {}
+}
+
+extension E on C {
+  set a(int) {}
+  void m() {
+    this.a = 3;
+  }
+}
+''');
+    var access = findNode.propertyAccess('this.a');
+    assertElement(access, findElement.setter('a', of: 'C'));
+  }
+
+  test_instance_setter_fromThis_fromExtension() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  set a(int) {}
+  void m() {
+    this.a = 3;
+  }
+}
+''');
+    var access = findNode.propertyAccess('this.a');
+    assertElement(access, findElement.setter('a', of: 'E'));
+  }
+
+  test_instance_tearoff_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  void a(int x) {}
+  get b => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  test_instance_tearoff_fromThis() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  void a(int x) {}
+  get c => this.a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  test_static_field_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int a = 1;
+  int m() => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_field_fromStatic() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int a = 1;
+  static int m() => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_getter_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int get a => 1;
+  int m() => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_getter_fromStatic() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int get a => 1;
+  static int m() => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.getter('a'));
+    assertType(identifier, 'int');
+  }
+
+  test_static_method_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  static void a() {}
+  void b() { a(); }
+}
+''');
+    var invocation = findNode.methodInvocation('a();');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_static_method_fromStatic() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  static void a() {}
+  static void b() { a(); }
+}
+''');
+    var invocation = findNode.methodInvocation('a();');
+    assertElement(invocation, findElement.method('a'));
+    assertInvokeType(invocation, 'void Function()');
+  }
+
+  test_static_setter_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static set a(int x) {}
+  void m() {
+    a = 3;
+  }
+}
+''');
+    var identifier = findNode.simple('a =');
+    assertElement(identifier, findElement.setter('a'));
+  }
+
+  test_static_setter_fromStatic() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static set a(int x) {}
+  static void m() {
+    a = 3;
+  }
+}
+''');
+    var identifier = findNode.simple('a =');
+    assertElement(identifier, findElement.setter('a'));
+  }
+
+  test_static_tearoff_fromInstance() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static void a(int x) {}
+  get b => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  test_static_tearoff_fromStatic() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  static void a(int x) {}
+  static get c => a;
+}
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
new file mode 100644
index 0000000..77c2a17
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/extension_override_test.dart
@@ -0,0 +1,589 @@
+// 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/dart/analysis/features.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/generated/engine.dart';
+import 'package:meta/meta.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionOverrideTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionOverrideTest extends DriverResolutionTest {
+  ExtensionElement extension;
+  ExtensionOverride extensionOverride;
+
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  void findDeclarationAndOverride(
+      {@required String declarationName,
+      @required String overrideSearch,
+      String declarationUri}) {
+    if (declarationUri == null) {
+      ExtensionDeclaration declaration =
+          findNode.extensionDeclaration('extension $declarationName');
+      extension = declaration?.declaredElement;
+    } else {
+      extension =
+          findElement.importFind(declarationUri).extension_(declarationName);
+    }
+    extensionOverride = findNode.extensionOverride(overrideSearch);
+  }
+
+  test_call_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  int call(String s) => 0;
+}
+void f(A a) {
+  E(a)('');
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validateCall();
+  }
+
+  @failingTest
+  test_call_noPrefix_typeArguments() async {
+    // The test is failing because we're not yet doing type inference.
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  int call(T s) => 0;
+}
+void f(A a) {
+  E<String>(a)('');
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E<T>', overrideSearch: 'E<S');
+    validateOverride(typeArguments: [stringType]);
+    validateCall();
+  }
+
+  test_call_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  int call(String s) => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a)('');
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validateCall();
+  }
+
+  @failingTest
+  test_call_prefix_typeArguments() async {
+    // The test is failing because we're not yet doing type inference.
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  int call(T s) => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<String>(a)('');
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<S');
+    validateOverride(typeArguments: [stringType]);
+    validateCall();
+  }
+
+  test_getter_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  int get g => 0;
+}
+void f(A a) {
+  E(a).g;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_getter_noPrefix_noTypeArguments_methodInvocation() async {
+    await assertNoErrorsInCode('''
+class A {}
+
+extension E on A {
+  double Function(int) get g => (b) => 2.0;
+}
+
+void f(A a) {
+  E(a).g(0);
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+
+    var invocation = findNode.methodInvocation('g(0);');
+    assertMethodInvocation(
+      invocation,
+      findElement.getter('g'),
+      'double Function(int)',
+      expectedMethodNameType: 'double Function(int) Function()',
+    );
+  }
+
+  test_getter_noPrefix_typeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  int get g => 0;
+}
+void f(A a) {
+  E<int>(a).g;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_getter_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  int get g => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a).g;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_getter_prefix_typeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  int get g => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<int>(a).g;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_method_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  void m() {}
+}
+void f(A a) {
+  E(a).m();
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validateInvocation();
+  }
+
+  test_method_noPrefix_typeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  void m() {}
+}
+void f(A a) {
+  E<int>(a).m();
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validateInvocation();
+  }
+
+  test_method_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  void m() {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a).m();
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validateInvocation();
+  }
+
+  test_method_prefix_typeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  void m() {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<int>(a).m();
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validateInvocation();
+  }
+
+  test_operator_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  void operator +(int offset) {}
+}
+void f(A a) {
+  E(a) + 1;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validateBinaryExpression();
+  }
+
+  test_operator_noPrefix_typeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  void operator +(int offset) {}
+}
+void f(A a) {
+  E<int>(a) + 1;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validateBinaryExpression();
+  }
+
+  test_operator_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  void operator +(int offset) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a) + 1;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validateBinaryExpression();
+  }
+
+  test_operator_prefix_typeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  void operator +(int offset) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<int>(a) + 1;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validateBinaryExpression();
+  }
+
+  test_setter_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  set s(int x) {}
+}
+void f(A a) {
+  E(a).s = 0;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_setter_noPrefix_typeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  set s(int x) {}
+}
+void f(A a) {
+  E<int>(a).s = 0;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_setter_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  set s(int x) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a).s = 0;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_setter_prefix_typeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  set s(int x) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<int>(a).s = 0;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_setterAndGetter_noPrefix_noTypeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E on A {
+  int get s => 0;
+  set s(int x) {}
+}
+void f(A a) {
+  E(a).s += 0;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E ', overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_setterAndGetter_noPrefix_typeArguments() async {
+    await assertNoErrorsInCode('''
+class A {}
+extension E<T> on A {
+  int get s => 0;
+  set s(int x) {}
+}
+void f(A a) {
+  E<int>(a).s += 0;
+}
+''');
+    findDeclarationAndOverride(declarationName: 'E', overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_setterAndGetter_prefix_noTypeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E on A {
+  int get s => 0;
+  set s(int x) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E(a).s += 0;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E(a)');
+    validateOverride();
+    validatePropertyAccess();
+  }
+
+  test_setterAndGetter_prefix_typeArguments() async {
+    newFile('/test/lib/lib.dart', content: '''
+class A {}
+extension E<T> on A {
+  int get s => 0;
+  set s(int x) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib.dart' as p;
+void f(p.A a) {
+  p.E<int>(a).s += 0;
+}
+''');
+    findDeclarationAndOverride(
+        declarationName: 'E',
+        declarationUri: 'package:test/lib.dart',
+        overrideSearch: 'E<int>');
+    validateOverride(typeArguments: [intType]);
+    validatePropertyAccess();
+  }
+
+  test_tearoff() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  void a(int x) {}
+}
+
+f(C c) => E(c).a;
+''');
+    var identifier = findNode.simple('a;');
+    assertElement(identifier, findElement.method('a'));
+    assertType(identifier, 'void Function(int)');
+  }
+
+  void validateBinaryExpression() {
+    BinaryExpression binary = extensionOverride.parent as BinaryExpression;
+    Element resolvedElement = binary.staticElement;
+    expect(resolvedElement, extension.getMethod('+'));
+  }
+
+  void validateCall() {
+    FunctionExpressionInvocation invocation =
+        extensionOverride.parent as FunctionExpressionInvocation;
+    Element resolvedElement = invocation.staticElement;
+    expect(resolvedElement, extension.getMethod('call'));
+
+    NodeList<Expression> arguments = invocation.argumentList.arguments;
+    for (int i = 0; i < arguments.length; i++) {
+      expect(arguments[i].staticParameterElement, isNotNull);
+    }
+  }
+
+  void validateInvocation() {
+    MethodInvocation invocation = extensionOverride.parent as MethodInvocation;
+
+    assertMethodInvocation(
+      invocation,
+      extension.getMethod('m'),
+      'void Function()',
+    );
+
+    NodeList<Expression> arguments = invocation.argumentList.arguments;
+    for (int i = 0; i < arguments.length; i++) {
+      expect(arguments[i].staticParameterElement, isNotNull);
+    }
+  }
+
+  void validateOverride({List<DartType> typeArguments}) {
+    expect(extensionOverride.extensionName.staticElement, extension);
+    if (typeArguments == null) {
+      expect(extensionOverride.typeArguments, isNull);
+    } else {
+      expect(
+          extensionOverride.typeArguments.arguments
+              .map((annotation) => annotation.type),
+          unorderedEquals(typeArguments));
+    }
+    expect(extensionOverride.argumentList.arguments, hasLength(1));
+  }
+
+  void validatePropertyAccess() {
+    PropertyAccess access = extensionOverride.parent as PropertyAccess;
+    Element resolvedElement = access.propertyName.staticElement;
+    PropertyAccessorElement expectedElement;
+    if (access.propertyName.inSetterContext()) {
+      expectedElement = extension.getSetter('s');
+      if (access.propertyName.inGetterContext()) {
+        PropertyAccessorElement expectedGetter = extension.getGetter('s');
+        Element actualGetter =
+            access.propertyName.auxiliaryElements.staticElement;
+        expect(actualGetter, expectedGetter);
+      }
+    } else {
+      expectedElement = extension.getGetter('g');
+    }
+    expect(resolvedElement, expectedElement);
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart b/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart
deleted file mode 100644
index 8cd4944..0000000
--- a/pkg/analyzer/test/src/dart/resolution/flow_analysis_test.dart
+++ /dev/null
@@ -1,787 +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/dart/analysis/results.dart';
-import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/dart/resolver/flow_analysis_visitor.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/util/ast_data_extractor.dart';
-import 'package:front_end/src/testing/id.dart' show ActualData, Id;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../../util/id_equivalence_helper.dart';
-import 'driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(NullableFlowTest);
-    defineReflectiveTests(ReachableFlowTest);
-  });
-}
-
-class FlowTestBase extends DriverResolutionTest {
-  FlowAnalysisResult flowResult;
-
-  /// Resolve the given [code] and track nullability in the unit.
-  Future<void> trackCode(String code) async {
-    if (await checkTests(
-        code, _resultComputer, const _FlowAnalysisDataComputer())) {
-      fail('Failure(s)');
-    }
-  }
-
-  Future<ResolvedUnitResult> _resultComputer(String code) async {
-    addTestFile(code);
-    await resolveTestFile();
-    var unit = result.unit;
-    flowResult = FlowAnalysisResult.getFromNode(unit);
-    return result;
-  }
-}
-
-@reflectiveTest
-class NullableFlowTest extends FlowTestBase {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
-
-  test_assign_toNonNull() async {
-    await trackCode(r'''
-void f(int x) {
-  if (x != null) return;
-  /*nullable*/ x;
-  x = 0;
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_assign_toNull() async {
-    await trackCode(r'''
-void f(int x) {
-  if (x == null) return;
-  /*nonNullable*/ x;
-  x = null;
-  /*nullable*/ x;
-}
-''');
-  }
-
-  test_assign_toUnknown_fromNotNull() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a == null) return;
-  /*nonNullable*/ a;
-  a = b;
-  a;
-}
-''');
-  }
-
-  test_assign_toUnknown_fromNull() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a != null) return;
-  /*nullable*/ a;
-  a = b;
-  a;
-}
-''');
-  }
-
-  test_binaryExpression_logicalAnd() async {
-    await trackCode(r'''
-void f(int x) {
-  x == null && /*nullable*/ x.isEven;
-}
-''');
-  }
-
-  test_binaryExpression_logicalOr() async {
-    await trackCode(r'''
-void f(int x) {
-  x == null || /*nonNullable*/ x.isEven;
-}
-''');
-  }
-
-  test_constructor_if_then_else() async {
-    await trackCode(r'''
-class C {
-  C(int x) {
-    if (x == null) {
-      /*nullable*/ x;
-    } else {
-      /*nonNullable*/ x;
-    }
-  }
-}
-''');
-  }
-
-  test_if_joinThenElse_ifNull() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a == null) {
-    /*nullable*/ a;
-    if (b == null) return;
-    /*nonNullable*/ b;
-  } else {
-    /*nonNullable*/ a;
-    if (b == null) return;
-    /*nonNullable*/ b;
-  }
-  a;
-  /*nonNullable*/ b;
-}
-''');
-  }
-
-  test_if_notNull_thenExit_left() async {
-    await trackCode(r'''
-void f(int x) {
-  if (null != x) return;
-  /*nullable*/ x;
-}
-''');
-  }
-
-  test_if_notNull_thenExit_right() async {
-    await trackCode(r'''
-void f(int x) {
-  if (x != null) return;
-  /*nullable*/ x;
-}
-''');
-  }
-
-  test_if_null_thenExit_left() async {
-    await trackCode(r'''
-void f(int x) {
-  if (null == x) return;
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_if_null_thenExit_right() async {
-    await trackCode(r'''
-void f(int x) {
-  if (x == null) return;
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_if_then_else() async {
-    await trackCode(r'''
-void f(int x) {
-  if (x == null) {
-    /*nullable*/ x;
-  } else {
-    /*nonNullable*/ x;
-  }
-}
-''');
-  }
-
-  test_method_if_then_else() async {
-    await trackCode(r'''
-class C {
-  void f(int x) {
-    if (x == null) {
-      /*nullable*/ x;
-    } else {
-      /*nonNullable*/ x;
-    }
-  }
-}
-''');
-  }
-
-  test_potentiallyMutatedInClosure() async {
-    await trackCode(r'''
-f(int a, int b) {
-  localFunction() {
-    a = b;
-  }
-
-  if (a == null) {
-    a;
-    localFunction();
-    a;
-  }
-}
-''');
-  }
-
-  test_tryFinally_eqNullExit_body() async {
-    await trackCode(r'''
-void f(int x) {
-  try {
-    if (x == null) return;
-    /*nonNullable*/ x;
-  } finally {
-    x;
-  }
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_tryFinally_eqNullExit_finally() async {
-    await trackCode(r'''
-void f(int x) {
-  try {
-    x;
-  } finally {
-    if (x == null) return;
-    /*nonNullable*/ x;
-  }
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_tryFinally_outerEqNotNullExit_assignUnknown_body() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a != null) return;
-  try {
-    /*nullable*/ a;
-    a = b;
-    a;
-  } finally {
-    a;
-  }
-  a;
-}
-''');
-  }
-
-  test_tryFinally_outerEqNullExit_assignUnknown_body() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a == null) return;
-  try {
-    /*nonNullable*/ a;
-    a = b;
-    a;
-  } finally {
-    a;
-  }
-  a;
-}
-''');
-  }
-
-  test_tryFinally_outerEqNullExit_assignUnknown_finally() async {
-    await trackCode(r'''
-void f(int a, int b) {
-  if (a == null) return;
-  try {
-    /*nonNullable*/ a;
-  } finally {
-    /*nonNullable*/ a;
-    a = b;
-    a;
-  }
-  a;
-}
-''');
-  }
-
-  test_while_eqNull() async {
-    await trackCode(r'''
-void f(int x) {
-  while (x == null) {
-    /*nullable*/ x;
-  }
-  /*nonNullable*/ x;
-}
-''');
-  }
-
-  test_while_notEqNull() async {
-    await trackCode(r'''
-void f(int x) {
-  while (x != null) {
-    /*nonNullable*/ x;
-  }
-  /*nullable*/ x;
-}
-''');
-  }
-}
-
-@reflectiveTest
-class ReachableFlowTest extends FlowTestBase {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
-
-  test_conditional_false() async {
-    await trackCode(r'''
-void f() {
-  false ? /*unreachable*/ 1 : 2;
-}
-''');
-  }
-
-  test_conditional_true() async {
-    await trackCode(r'''
-void f() {
-  true ? 1 : /*unreachable*/ 2;
-}
-''');
-  }
-
-  test_do_false() async {
-    await trackCode(r'''
-void f() {
-  do {
-    1;
-  } while (false);
-  2;
-}
-''');
-  }
-
-  test_do_true() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  do {
-    1;
-  } while (true);
-  /*stmt: unreachable*/ 2;
-}
-''');
-  }
-
-  test_exit_beforeSplitStatement() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f(bool b, int i) {
-  return;
-  /*stmt: unreachable*/ Object _;
-  /*stmt: unreachable*/ do {} while (b);
-  /*stmt: unreachable*/ for (;;) {}
-  /*stmt: unreachable*/ for (_ in []) {}
-  /*stmt: unreachable*/ if (b) {}
-  /*stmt: unreachable*/ switch (i) {}
-  /*stmt: unreachable*/ try {} finally {}
-  /*stmt: unreachable*/ while (b) {}
-}
-''');
-  }
-
-  test_for_condition_true() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  for (; true;) {
-    1;
-  }
-  /*stmt: unreachable*/ 2;
-}
-''');
-  }
-
-  test_for_condition_true_implicit() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  for (;;) {
-    1;
-  }
-  /*stmt: unreachable*/ 2;
-}
-''');
-  }
-
-  test_forEach() async {
-    await trackCode(r'''
-void f() {
-  Object _;
-  for (_ in [0, 1, 2]) {
-    1;
-    return;
-  }
-  2;
-}
-''');
-  }
-
-  test_functionBody_hasReturn() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-int f() {
-  return 42;
-}
-''');
-  }
-
-  test_functionBody_noReturn() async {
-    await trackCode(r'''
-void f() {
-  1;
-}
-''');
-  }
-
-  test_if_condition() async {
-    await trackCode(r'''
-void f(bool b) {
-  if (b) {
-    1;
-  } else {
-    2;
-  }
-  3;
-}
-''');
-  }
-
-  test_if_false_then_else() async {
-    await trackCode(r'''
-void f() {
-  if (false) /*stmt: unreachable*/ {
-    1;
-  } else {
-  }
-  3;
-}
-''');
-  }
-
-  test_if_true_return() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  1;
-  if (true) {
-    return;
-  }
-  /*stmt: unreachable*/ 2;
-}
-''');
-  }
-
-  test_if_true_then_else() async {
-    await trackCode(r'''
-void f() {
-  if (true) {
-  } else /*stmt: unreachable*/ {
-    2;
-  }
-  3;
-}
-''');
-  }
-
-  test_logicalAnd_leftFalse() async {
-    await trackCode(r'''
-void f(int x) {
-  false && /*unreachable*/ (x == 1);
-}
-''');
-  }
-
-  test_logicalOr_leftTrue() async {
-    await trackCode(r'''
-void f(int x) {
-  true || /*unreachable*/ (x == 1);
-}
-''');
-  }
-
-  test_switch_case_neverCompletes() async {
-    await trackCode(r'''
-void f(bool b, int i) {
-  switch (i) {
-    case 1:
-      1;
-      if (b) {
-        return;
-      } else {
-        return;
-      }
-      /*stmt: unreachable*/ 2;
-  }
-  3;
-}
-''');
-  }
-
-  test_tryCatch() async {
-    await trackCode(r'''
-void f() {
-  try {
-    1;
-  } catch (_) {
-    2;
-  }
-  3;
-}
-''');
-  }
-
-  test_tryCatch_return_body() async {
-    await trackCode(r'''
-void f() {
-  try {
-    1;
-    return;
-    /*stmt: unreachable*/ 2;
-  } catch (_) {
-    3;
-  }
-  4;
-}
-''');
-  }
-
-  test_tryCatch_return_catch() async {
-    await trackCode(r'''
-void f() {
-  try {
-    1;
-  } catch (_) {
-    2;
-    return;
-    /*stmt: unreachable*/ 3;
-  }
-  4;
-}
-''');
-  }
-
-  test_tryCatchFinally_return_body() async {
-    await trackCode(r'''
-void f() {
-  try {
-    1;
-    return;
-  } catch (_) {
-    2;
-  } finally {
-    3;
-  }
-  4;
-}
-''');
-  }
-
-  test_tryCatchFinally_return_bodyCatch() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  try {
-    1;
-    return;
-  } catch (_) {
-    2;
-    return;
-  } finally {
-    3;
-  }
-  /*stmt: unreachable*/ 4;
-}
-''');
-  }
-
-  test_tryCatchFinally_return_catch() async {
-    await trackCode(r'''
-void f() {
-  try {
-    1;
-  } catch (_) {
-    2;
-    return;
-  } finally {
-    3;
-  }
-  4;
-}
-''');
-  }
-
-  test_tryFinally_return_body() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  try {
-    1;
-    return;
-  } finally {
-    2;
-  }
-  /*stmt: unreachable*/ 3;
-}
-''');
-  }
-
-  test_while_false() async {
-    await trackCode(r'''
-void f() {
-  while (false) /*stmt: unreachable*/ {
-    1;
-  }
-  2;
-}
-''');
-  }
-
-  test_while_true() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  while (true) {
-    1;
-  }
-  /*stmt: unreachable*/ 2;
-  /*stmt: unreachable*/ 3;
-}
-''');
-  }
-
-  test_while_true_break() async {
-    await trackCode(r'''
-void f() {
-  while (true) {
-    1;
-    break;
-    /*stmt: unreachable*/ 2;
-  }
-  3;
-}
-''');
-  }
-
-  test_while_true_breakIf() async {
-    await trackCode(r'''
-void f(bool b) {
-  while (true) {
-    1;
-    if (b) break;
-    2;
-  }
-  3;
-}
-''');
-  }
-
-  test_while_true_continue() async {
-    await trackCode(r'''
-/*member: f:doesNotComplete*/
-void f() {
-  while (true) {
-    1;
-    continue;
-    /*stmt: unreachable*/ 2;
-  }
-  /*stmt: unreachable*/ 3;
-}
-''');
-  }
-}
-
-class _FlowAnalysisDataComputer extends DataComputer<Set<_FlowAssertion>> {
-  const _FlowAnalysisDataComputer();
-
-  @override
-  DataInterpreter<Set<_FlowAssertion>> get dataValidator =>
-      const _FlowAnalysisDataInterpreter();
-
-  @override
-  void computeUnitData(CompilationUnit unit,
-      Map<Id, ActualData<Set<_FlowAssertion>>> actualMap) {
-    var flowResult = FlowAnalysisResult.getFromNode(unit);
-    _FlowAnalysisDataExtractor(
-            unit.declaredElement.source.uri, actualMap, flowResult)
-        .run(unit);
-  }
-}
-
-class _FlowAnalysisDataExtractor extends AstDataExtractor<Set<_FlowAssertion>> {
-  FlowAnalysisResult _flowResult;
-
-  _FlowAnalysisDataExtractor(Uri uri,
-      Map<Id, ActualData<Set<_FlowAssertion>>> actualMap, this._flowResult)
-      : super(uri, actualMap);
-
-  @override
-  Set<_FlowAssertion> computeNodeValue(Id id, AstNode node) {
-    Set<_FlowAssertion> result = {};
-    if (_flowResult.nullableNodes.contains(node)) {
-      // We sometimes erroneously annotate a node as both nullable and
-      // non-nullable.  Ignore for now.  TODO(paulberry): fix this.
-      if (!_flowResult.nonNullableNodes.contains(node)) {
-        result.add(_FlowAssertion.nullable);
-      }
-    }
-    if (_flowResult.nonNullableNodes.contains(node)) {
-      // We sometimes erroneously annotate a node as both nullable and
-      // non-nullable.  Ignore for now.  TODO(paulberry): fix this.
-      if (!_flowResult.nullableNodes.contains(node)) {
-        result.add(_FlowAssertion.nonNullable);
-      }
-    }
-    if (_flowResult.unreachableNodes.contains(node)) {
-      result.add(_FlowAssertion.unreachable);
-    }
-    if (node is FunctionDeclaration) {
-      var body = node.functionExpression.body;
-      if (body != null &&
-          _flowResult.functionBodiesThatDontComplete.contains(body)) {
-        result.add(_FlowAssertion.doesNotComplete);
-      }
-    }
-    return result.isEmpty ? null : result;
-  }
-}
-
-class _FlowAnalysisDataInterpreter
-    implements DataInterpreter<Set<_FlowAssertion>> {
-  const _FlowAnalysisDataInterpreter();
-
-  @override
-  String getText(Set<_FlowAssertion> actualData) =>
-      _sortedRepresentation(_toStrings(actualData));
-
-  @override
-  String isAsExpected(Set<_FlowAssertion> actualData, String expectedData) {
-    var actualStrings = _toStrings(actualData);
-    var actualSorted = _sortedRepresentation(actualStrings);
-    var expectedSorted = _sortedRepresentation(expectedData?.split(','));
-    if (actualSorted == expectedSorted) {
-      return null;
-    } else {
-      return 'Expected $expectedData, got $actualSorted';
-    }
-  }
-
-  @override
-  bool isEmpty(Set<_FlowAssertion> actualData) => actualData.isEmpty;
-
-  String _sortedRepresentation(Iterable<String> values) {
-    var list = values == null || values.isEmpty ? ['none'] : values.toList();
-    list.sort();
-    return list.join(',');
-  }
-
-  List<String> _toStrings(Set<_FlowAssertion> actualData) => actualData
-      .map((flowAssertion) => flowAssertion.toString().split('.')[1])
-      .toList();
-}
-
-enum _FlowAssertion {
-  doesNotComplete,
-  nonNullable,
-  nullable,
-  unreachable,
-}
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 98ee882..57179a1 100644
--- a/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/instance_creation_test.dart
@@ -34,6 +34,7 @@
       mapElement,
       'Map<dynamic, dynamic>',
       expectedConstructorMember: true,
+      expectedSubstitution: {'K': 'dynamic', 'V': 'dynamic'},
     );
   }
 
@@ -116,6 +117,7 @@
       'Foo<dynamic>',
       constructorName: 'bar',
       expectedConstructorMember: true,
+      expectedSubstitution: {'X': 'dynamic'},
     );
   }
 
@@ -147,6 +149,7 @@
       constructorName: 'bar',
       expectedConstructorMember: true,
       expectedPrefix: import.prefix,
+      expectedSubstitution: {'X': 'int'},
     );
   }
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
index 671bdef5..100d12e 100644
--- a/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/mixin_test.dart
@@ -1643,6 +1643,7 @@
 
     var element = findElement.mixin('M');
     var type = element.type;
+    // ignore: deprecated_member_use_from_same_package
     expect(type.isMoreSpecificThan(intType), isFalse);
   }
 
diff --git a/pkg/analyzer/test/src/dart/resolution/namespace_test.dart b/pkg/analyzer/test/src/dart/resolution/namespace_test.dart
index 7cceecc..f5b0bf7 100644
--- a/pkg/analyzer/test/src/dart/resolution/namespace_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/namespace_test.dart
@@ -21,7 +21,7 @@
     newFile('/test/lib/declares_never.dart', content: '''
 class Never {}
 ''');
-    assertNoErrorsInCode(r'''
+    await assertNoErrorsInCode(r'''
 import 'declares_never.dart';
 
 Never f() => throw 'foo';
diff --git a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
index 5a47b69..b4f9586 100644
--- a/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/optional_const_test.dart
@@ -36,6 +36,7 @@
       'B<num>',
       constructorName: 'named',
       expectedConstructorMember: true,
+      expectedSubstitution: {'T': 'num'},
     );
   }
 
@@ -46,6 +47,7 @@
       libraryA.getType('B'),
       'B<num>',
       expectedConstructorMember: true,
+      expectedSubstitution: {'T': 'num'},
     );
   }
 
@@ -57,6 +59,7 @@
       'B<num>',
       constructorName: 'named',
       expectedConstructorMember: true,
+      expectedSubstitution: {'T': 'num'},
       expectedPrefix: _importOfA()?.prefix,
     );
   }
@@ -68,6 +71,7 @@
       libraryA.getType('B'),
       'B<num>',
       expectedConstructorMember: true,
+      expectedSubstitution: {'T': 'num'},
       expectedPrefix: _importOfA()?.prefix,
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/resolution.dart b/pkg/analyzer/test/src/dart/resolution/resolution.dart
index 4040944..bd793ba 100644
--- a/pkg/analyzer/test/src/dart/resolution/resolution.dart
+++ b/pkg/analyzer/test/src/dart/resolution/resolution.dart
@@ -148,6 +148,7 @@
     expect(element.enclosingElement, expectedEnclosing);
   }
 
+  @Deprecated('Use assertErrorsInCode')
   Future<void> assertErrorCodesInCode(
       String code, List<ErrorCode> errors) async {
     addTestFile(code);
@@ -219,6 +220,7 @@
       ClassElement expectedClassElement, String expectedType,
       {String constructorName,
       bool expectedConstructorMember: false,
+      Map<String, String> expectedSubstitution,
       PrefixElement expectedPrefix}) {
     String expectedClassName = expectedClassElement.name;
 
@@ -250,7 +252,7 @@
 
     if (expectedConstructorMember) {
       expect(actualConstructorElement, const TypeMatcher<Member>());
-      assertMember(creation, expectedType, expectedConstructorElement);
+      assertMember(creation, expectedConstructorElement, expectedSubstitution);
     } else {
       assertElement(creation, expectedConstructorElement);
     }
@@ -272,11 +274,24 @@
     expect(actual, isDynamicType);
   }
 
+  void assertInvokeTypeNull(BinaryExpression node) {
+    DartType actual = node.staticInvokeType;
+    expect(actual, isNull);
+  }
+
   void assertMember(
-      Expression node, String expectedDefiningType, Element expectedBase) {
+    Expression node,
+    Element expectedBase,
+    Map<String, String> expectedSubstitution,
+  ) {
     Member actual = getNodeElement(node);
-    expect(typeString(actual.definingType), expectedDefiningType);
+
     expect(actual.baseElement, same(expectedBase));
+
+    var actualMapString = actual.substitution.map.map(
+      (k, v) => MapEntry(k.name, '$v'),
+    );
+    expect(actualMapString, expectedSubstitution);
   }
 
   void assertMethodInvocation(
@@ -429,10 +444,16 @@
       return node.element;
     } else if (node is AssignmentExpression) {
       return node.staticElement;
+    } else if (node is BinaryExpression) {
+      return node.staticElement;
     } else if (node is Declaration) {
       return node.declaredElement;
+    } else if (node is ExtensionOverride) {
+      return node.staticElement;
     } else if (node is FormalParameter) {
       return node.declaredElement;
+    } else if (node is FunctionExpressionInvocation) {
+      return node.staticElement;
     } else if (node is Identifier) {
       return node.staticElement;
     } else if (node is IndexExpression) {
@@ -447,6 +468,8 @@
       return node.staticElement;
     } else if (node is PropertyAccess) {
       return node.propertyName.staticElement;
+    } else if (node is TypeName) {
+      return node.name.staticElement;
     } else {
       fail('Unsupported node: (${node.runtimeType}) $node');
     }
diff --git a/pkg/analyzer/test/src/dart/resolution/test_all.dart b/pkg/analyzer/test/src/dart/resolution/test_all.dart
index c03f65c..243bad8 100644
--- a/pkg/analyzer/test/src/dart/resolution/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/test_all.dart
@@ -10,10 +10,10 @@
 import 'comment_test.dart' as comment;
 import 'constant_test.dart' as constant;
 import 'constructor_test.dart' as constructor;
-import 'definite_assignment_test.dart' as definite_assignment;
 import 'enum_test.dart' as enum_resolution;
 import 'export_test.dart' as export_;
-import 'flow_analysis_test.dart' as flow_analysis;
+import 'extension_method_test.dart' as extension_method;
+import 'extension_override_test.dart' as extension_override;
 import 'for_element_test.dart' as for_element;
 import 'for_in_test.dart' as for_in;
 import 'function_expression_invocation_test.dart'
@@ -37,7 +37,6 @@
 import 'property_access_test.dart' as property_access;
 import 'top_type_inference_test.dart' as top_type_inference;
 import 'type_inference/test_all.dart' as type_inference;
-import 'type_promotion_test.dart' as type_promotion;
 
 main() {
   defineReflectiveSuite(() {
@@ -47,10 +46,10 @@
     comment.main();
     constant.main();
     constructor.main();
-    definite_assignment.main();
     enum_resolution.main();
     export_.main();
-    flow_analysis.main();
+    extension_method.main();
+    extension_override.main();
     for_element.main();
     for_in.main();
     function_expression_invocation.main();
@@ -70,7 +69,6 @@
     optional_const.main();
     property_access.main();
     top_type_inference.main();
-    type_promotion.main();
     type_inference.main();
   }, name: 'resolution');
 }
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
new file mode 100644
index 0000000..410fc08
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/extension_methods_test.dart
@@ -0,0 +1,352 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionMethodsTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionMethodsTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_implicit_getter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  List<T> get foo => <T>[];
+}
+
+void f(A<int> a) {
+  a.foo;
+}
+''');
+    var prefixedIdentifier = findNode.prefixed('.foo');
+    assertMember(
+      prefixedIdentifier,
+      findElement.getter('foo', of: 'E'),
+      {'T': 'int'},
+    );
+    assertType(prefixedIdentifier, 'List<int>');
+  }
+
+  test_implicit_method() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  a.foo(1.0);
+}
+''');
+    // TODO(scheglov) We need to instantiate "foo" fully.
+    var invocation = findNode.methodInvocation('foo(1.0)');
+    assertMember(
+      invocation,
+      findElement.method('foo', of: 'E'),
+      {'T': 'int'},
+    );
+//    assertMember(
+//      invocation,
+//      findElement.method('foo', of: 'E'),
+//      {'T': 'int', 'U': 'double'},
+//    );
+    assertInvokeType(invocation, 'Map<int, double> Function(double)');
+    assertType(invocation, 'Map<int, double>');
+  }
+
+  test_implicit_method_onTypeParameter() async {
+    await assertNoErrorsInCode('''
+extension E<T> on T {
+  Map<T, U> foo<U>(U value) => <T, U>{};
+}
+
+main(String a) {
+  a.foo(0);
+}
+''');
+    // TODO(scheglov) We need to instantiate "foo" fully.
+    var invocation = findNode.methodInvocation('foo(0)');
+    assertMember(
+      invocation,
+      findElement.method('foo', of: 'E'),
+      {'T': 'String'},
+    );
+//    assertMember(
+//      invocation,
+//      findElement.method('foo', of: 'E'),
+//      {'T': 'int', 'U': 'double'},
+//    );
+    assertInvokeType(invocation, 'Map<String, int> Function(int)');
+    assertType(invocation, 'Map<String, int>');
+  }
+
+  test_implicit_method_tearOff() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  a.foo;
+}
+''');
+    var prefixedIdentifier = findNode.prefixed('foo;');
+    assertMember(
+      prefixedIdentifier,
+      findElement.method('foo', of: 'E'),
+      {'T': 'int'},
+    );
+    assertType(prefixedIdentifier, 'Map<int, U> Function<U>(U)');
+  }
+
+  test_implicit_setter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  set foo(T value) {}
+}
+
+void f(A<int> a) {
+  a.foo = 0;
+}
+''');
+    var propertyAccess = findNode.prefixed('.foo =');
+    assertMember(
+      propertyAccess,
+      findElement.setter('foo', of: 'E'),
+      {'T': 'int'},
+    );
+  }
+
+  test_override_hasTypeArguments_getter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  List<T> get foo => <T>[];
+}
+
+void f(A<int> a) {
+  E<num>(a).foo;
+}
+''');
+    var override = findNode.extensionOverride('E<num>(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['num']);
+    assertElementTypeString(override.extendedType, 'A<num>');
+
+    var propertyAccess = findNode.propertyAccess('.foo');
+    assertMember(
+      propertyAccess,
+      findElement.getter('foo', of: 'E'),
+      {'T': 'num'},
+    );
+    assertType(propertyAccess, 'List<num>');
+  }
+
+  test_override_hasTypeArguments_method() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  E<num>(a).foo(1.0);
+}
+''');
+    var override = findNode.extensionOverride('E<num>(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['num']);
+    assertElementTypeString(override.extendedType, 'A<num>');
+
+    // TODO(scheglov) We need to instantiate "foo" fully.
+    var invocation = findNode.methodInvocation('foo(1.0)');
+    assertMember(
+      invocation,
+      findElement.method('foo', of: 'E'),
+      {'T': 'num'},
+    );
+//    assertMember(
+//      invocation,
+//      findElement.method('foo', of: 'E'),
+//      {'T': 'int', 'U': 'double'},
+//    );
+    assertInvokeType(invocation, 'Map<num, double> Function(double)');
+  }
+
+  test_override_hasTypeArguments_method_tearOff() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  E<num>(a).foo;
+}
+''');
+    var propertyAccess = findNode.propertyAccess('foo;');
+    assertMember(
+      propertyAccess,
+      findElement.method('foo', of: 'E'),
+      {'T': 'num'},
+    );
+    assertType(propertyAccess, 'Map<num, U> Function<U>(U)');
+  }
+
+  test_override_hasTypeArguments_setter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  set foo(T value) {}
+}
+
+void f(A<int> a) {
+  E<num>(a).foo = 1.2;
+}
+''');
+    var override = findNode.extensionOverride('E<num>(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['num']);
+    assertElementTypeString(override.extendedType, 'A<num>');
+
+    var propertyAccess = findNode.propertyAccess('.foo =');
+    assertMember(
+      propertyAccess,
+      findElement.setter('foo', of: 'E'),
+      {'T': 'num'},
+    );
+  }
+
+  test_override_inferTypeArguments_getter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  List<T> get foo => <T>[];
+}
+
+void f(A<int> a) {
+  E(a).foo;
+}
+''');
+    var override = findNode.extensionOverride('E(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['int']);
+    assertElementTypeString(override.extendedType, 'A<int>');
+
+    var propertyAccess = findNode.propertyAccess('.foo');
+    assertMember(
+      propertyAccess,
+      findElement.getter('foo', of: 'E'),
+      {'T': 'int'},
+    );
+    assertType(propertyAccess, 'List<int>');
+  }
+
+  test_override_inferTypeArguments_method() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  E(a).foo(1.0);
+}
+''');
+    var override = findNode.extensionOverride('E(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['int']);
+    assertElementTypeString(override.extendedType, 'A<int>');
+
+    // TODO(scheglov) We need to instantiate "foo" fully.
+    var invocation = findNode.methodInvocation('foo(1.0)');
+    assertMember(
+      invocation,
+      findElement.method('foo', of: 'E'),
+      {'T': 'int'},
+    );
+//    assertMember(
+//      invocation,
+//      findElement.method('foo', of: 'E'),
+//      {'T': 'int', 'U': 'double'},
+//    );
+    assertInvokeType(invocation, 'Map<int, double> Function(double)');
+  }
+
+  test_override_inferTypeArguments_method_tearOff() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  Map<T, U> foo<U>(U u) => <T, U>{};
+}
+
+void f(A<int> a) {
+  E(a).foo;
+}
+''');
+    var override = findNode.extensionOverride('E(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['int']);
+    assertElementTypeString(override.extendedType, 'A<int>');
+
+    var propertyAccess = findNode.propertyAccess('foo;');
+    assertMember(
+      propertyAccess,
+      findElement.method('foo', of: 'E'),
+      {'T': 'int'},
+    );
+    assertType(propertyAccess, 'Map<int, U> Function<U>(U)');
+  }
+
+  test_override_inferTypeArguments_setter() async {
+    await assertNoErrorsInCode('''
+class A<T> {}
+
+extension E<T> on A<T> {
+  set foo(T value) {}
+}
+
+void f(A<int> a) {
+  E(a).foo = 0;
+}
+''');
+    var override = findNode.extensionOverride('E(a)');
+    assertElement(override, findElement.extension_('E'));
+    assertElementTypeStrings(override.typeArgumentTypes, ['int']);
+    assertElementTypeString(override.extendedType, 'A<int>');
+
+    var propertyAccess = findNode.propertyAccess('.foo =');
+    assertMember(
+      propertyAccess,
+      findElement.setter('foo', of: 'E'),
+      {'T': 'int'},
+    );
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart
new file mode 100644
index 0000000..63ef29a
--- /dev/null
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/tear_off_test.dart
@@ -0,0 +1,145 @@
+// 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/dart/element/element.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(TearOffTest);
+  });
+}
+
+@reflectiveTest
+class TearOffTest extends DriverResolutionTest {
+  test_empty_contextNotInstantiated() async {
+    await assertNoErrorsInCode('''
+T f<T>(T x) => x;
+
+void test() {
+  U Function<U>(U) context;
+  context = f; // 1
+}
+''');
+    _assertTearOff(
+      'f; // 1',
+      findElement.topFunction('f'),
+      'T Function<T>(T)',
+      [],
+    );
+  }
+
+  test_empty_notGeneric() async {
+    await assertNoErrorsInCode('''
+int f(int x) => x;
+
+void test() {
+  int Function(int) context;
+  context = f; // 1
+}
+''');
+    _assertTearOff(
+      'f; // 1',
+      findElement.topFunction('f'),
+      'int Function(int)',
+      [],
+    );
+  }
+
+  test_notEmpty() async {
+    await assertNoErrorsInCode('''
+T f<T>(T x) => x;
+
+class C {
+  T f<T>(T x) => x;
+  static T g<T>(T x) => x;
+}
+
+class D extends C {
+  void test() {
+    int Function(int) func;
+    func = super.f; // 1
+  }
+}
+
+void test() {
+  T h<T>(T x) => x;
+  int Function(int) func;
+  func = f; // 2
+  func = new C().f; // 3
+  func = C.g; // 4
+  func = h; // 5
+}
+''');
+    _assertTearOff(
+      'f; // 1',
+      findElement.method('f', of: 'C'),
+      'int Function(int)',
+      ['int'],
+    );
+    _assertTearOff(
+      'f; // 2',
+      findElement.topFunction('f'),
+      'int Function(int)',
+      ['int'],
+    );
+    _assertTearOff(
+      'f; // 3',
+      findElement.method('f', of: 'C'),
+      'int Function(int)',
+      ['int'],
+    );
+    _assertTearOff(
+      'g; // 4',
+      findElement.method('g', of: 'C'),
+      'int Function(int)',
+      ['int'],
+    );
+    _assertTearOff(
+      'h; // 5',
+      findElement.localFunction('h'),
+      'int Function(int)',
+      ['int'],
+    );
+  }
+
+  test_null_notTearOff() async {
+    await assertNoErrorsInCode('''
+T f<T>(T x) => x;
+
+void test() {
+  f(0);
+}
+''');
+    _assertTearOff(
+      'f(0);',
+      findElement.topFunction('f'),
+      'T Function<T>(T)',
+      null,
+    );
+    assertInvokeType(
+      findNode.methodInvocation('f(0)'),
+      'int Function(int)',
+    );
+  }
+
+  void _assertTearOff(
+    String search,
+    ExecutableElement element,
+    String type,
+    List<String> typeArguments,
+  ) {
+    var id = findNode.simple(search);
+    assertElement(id, element);
+    assertType(id, type);
+    if (typeArguments != null) {
+      assertElementTypeStrings(id.tearOffTypeArgumentTypes, typeArguments);
+    } else {
+      expect(id.tearOffTypeArgumentTypes, isNull);
+    }
+  }
+}
diff --git a/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart b/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart
index 0369a65..baeec95 100644
--- a/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart
+++ b/pkg/analyzer/test/src/dart/resolution/type_inference/test_all.dart
@@ -7,12 +7,14 @@
 import 'collection_elements_test.dart' as collection_elements;
 import 'conditional_expression_test.dart' as conditional_expression;
 import 'equality_expressions_test.dart' as equality_expressions;
+import 'extension_methods_test.dart' as extension_methods;
 import 'list_literal_test.dart' as list_literal;
 import 'logical_boolean_expressions_test.dart' as logical_boolean_expressions;
 import 'map_literal_test.dart' as map_literal;
 import 'prefix_expressions_test.dart' as prefix_expressions;
 import 'set_literal_test.dart' as set_literal;
 import 'statements_test.dart' as statements;
+import 'tear_off_test.dart' as tear_off;
 import 'throw_test.dart' as throw_expression;
 import 'type_test_expressions_test.dart' as type_test_expressions;
 
@@ -21,12 +23,14 @@
     collection_elements.main();
     conditional_expression.main();
     equality_expressions.main();
+    extension_methods.main();
     list_literal.main();
     logical_boolean_expressions.main();
     map_literal.main();
     prefix_expressions.main();
     set_literal.main();
     statements.main();
+    tear_off.main();
     throw_expression.main();
     type_test_expressions.main();
   }, name: 'type inference');
diff --git a/pkg/analyzer/test/src/dart/resolution/type_promotion_test.dart b/pkg/analyzer/test/src/dart/resolution/type_promotion_test.dart
deleted file mode 100644
index ff73bd4..0000000
--- a/pkg/analyzer/test/src/dart/resolution/type_promotion_test.dart
+++ /dev/null
@@ -1,757 +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/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/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/util/ast_data_extractor.dart';
-import 'package:front_end/src/testing/id.dart' show ActualData, Id;
-import 'package:test/test.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../../../util/id_equivalence_helper.dart';
-import 'driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(TypePromotionTest);
-  });
-}
-
-@reflectiveTest
-class TypePromotionTest extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
-
-  Future<void> resolveCode(String code) async {
-    if (await checkTests(
-        code, _resultComputer, const _TypePromotionDataComputer())) {
-      fail('Failure(s)');
-    }
-  }
-
-  test_assignment() async {
-    await resolveCode(r'''
-f(Object x) {
-  if (x is String) {
-    x = 42;
-    x;
-  }
-}
-''');
-  }
-
-  test_binaryExpression_ifNull() async {
-    await resolveCode(r'''
-void f(Object x) {
-  ((x is num) || (throw 1)) ?? ((/*num*/ x is int) || (throw 2));
-  /*num*/ x;
-}
-''');
-  }
-
-  test_binaryExpression_ifNull_rightUnPromote() async {
-    await resolveCode(r'''
-void f(Object x, Object y, Object z) {
-  if (x is int) {
-    /*int*/ x;
-    y ?? (x = z);
-    x;
-  }
-}
-''');
-  }
-
-  test_conditional_both() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  b ? ((x is num) || (throw 1)) : ((x is int) || (throw 2));
-  /*num*/ x;
-}
-''');
-  }
-
-  test_conditional_else() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  b ? 0 : ((x is int) || (throw 2));
-  x;
-}
-''');
-  }
-
-  test_conditional_then() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  b ? ((x is num) || (throw 1)) : 0;
-  x;
-}
-''');
-  }
-
-  test_do_condition_isNotType() async {
-    await resolveCode(r'''
-void f(Object x) {
-  do {
-    x;
-  } while (x is! String);
-  /*String*/ x;
-}
-''');
-  }
-
-  test_do_condition_isType() async {
-    await resolveCode(r'''
-void f(Object x) {
-  do {
-    x;
-  } while (x is String);
-  x;
-}
-''');
-  }
-
-  test_do_outerIsType() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    do {
-      /*String*/ x;
-    } while (b);
-    /*String*/ x;
-  }
-}
-''');
-  }
-
-  test_do_outerIsType_loopAssigned_body() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    do {
-      x;
-      x = x.length;
-    } while (b);
-    x;
-  }
-}
-''');
-  }
-
-  test_do_outerIsType_loopAssigned_condition() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    do {
-      x;
-      x = x.length;
-    } while (x != 0);
-    x;
-  }
-}
-''');
-  }
-
-  test_do_outerIsType_loopAssigned_condition2() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    do {
-      x;
-    } while ((x = 1) != 0);
-    x;
-  }
-}
-''');
-  }
-
-  test_for_outerIsType() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    for (; b;) {
-      /*String*/ x;
-    }
-    /*String*/ x;
-  }
-}
-''');
-  }
-
-  test_for_outerIsType_loopAssigned_body() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    for (; b;) {
-      x;
-      x = 42;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_for_outerIsType_loopAssigned_condition() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    for (; (x = 42) > 0;) {
-      x;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_for_outerIsType_loopAssigned_updaters() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    for (; b; x = 42) {
-      x;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_forEach_outerIsType_loopAssigned() async {
-    await resolveCode(r'''
-void f(Object x) {
-  Object v1;
-  if (x is String) {
-    for (var _ in (v1 = [0, 1, 2])) {
-      x;
-      x = 42;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_functionExpression_isType() async {
-    await resolveCode(r'''
-void f() {
-  void g(Object x) {
-    if (x is String) {
-      /*String*/ x;
-    }
-    x = 42;
-  }
-}
-''');
-  }
-
-  test_functionExpression_isType_mutatedInClosure2() async {
-    await resolveCode(r'''
-void f() {
-  void g(Object x) {
-    if (x is String) {
-      x;
-    }
-    
-    void h() {
-      x = 42;
-    }
-  }
-}
-''');
-  }
-
-  test_functionExpression_outerIsType_assignedOutside() async {
-    await resolveCode(r'''
-void f(Object x) {
-  void Function() g;
-  
-  if (x is String) {
-    /*String*/ x;
-
-    g = () {
-      x;
-    };
-  }
-
-  x = 42;
-  x;
-  g();
-}
-''');
-  }
-
-  test_if_combine_empty() async {
-    await resolveCode(r'''
-main(bool b, Object v) {
-  if (b) {
-    v is int || (throw 1);
-  } else {
-    v is String || (throw 2);
-  }
-  v;
-}
-''');
-  }
-
-  test_if_conditional_isNotType() async {
-    await resolveCode(r'''
-f(bool b, Object v) {
-  if (b ? (v is! int) : (v is! num)) {
-    v;
-  } else {
-    /*num*/ v;
-  }
-  v;
-}
-''');
-  }
-
-  test_if_conditional_isType() async {
-    await resolveCode(r'''
-f(bool b, Object v) {
-  if (b ? (v is int) : (v is num)) {
-    /*num*/ v;
-  } else {
-    v;
-  }
-  v;
-}
-''');
-  }
-
-  test_if_isNotType() async {
-    await resolveCode(r'''
-main(v) {
-  if (v is! String) {
-    v;
-  } else {
-    /*String*/ v;
-  }
-  v;
-}
-''');
-  }
-
-  test_if_isNotType_return() async {
-    await resolveCode(r'''
-main(v) {
-  if (v is! String) return;
-  /*String*/ v;
-}
-''');
-  }
-
-  test_if_isNotType_throw() async {
-    await resolveCode(r'''
-main(v) {
-  if (v is! String) throw 42;
-  /*String*/ v;
-}
-''');
-  }
-
-  test_if_isType() async {
-    await resolveCode(r'''
-main(v) {
-  if (v is String) {
-    /*String*/ v;
-  } else {
-    v;
-  }
-  v;
-}
-''');
-  }
-
-  test_if_isType_thenNonBoolean() async {
-    await resolveCode(r'''
-f(Object x) {
-  if ((x is String) != 3) {
-    x;
-  }
-}
-''');
-  }
-
-  test_if_logicalNot_isType() async {
-    await resolveCode(r'''
-main(v) {
-  if (!(v is String)) {
-    v;
-  } else {
-    /*String*/ v;
-  }
-  v;
-}
-''');
-  }
-
-  test_if_then_isNotType_return() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (b) {
-    if (x is! String) return;
-  }
-  x;
-}
-''');
-  }
-
-  test_logicalOr_throw() async {
-    await resolveCode(r'''
-main(v) {
-  v is String || (throw 42);
-  /*String*/ v;
-}
-''');
-  }
-
-  test_potentiallyMutatedInClosure() async {
-    await resolveCode(r'''
-f(Object x) {
-  localFunction() {
-    x = 42;
-  }
-
-  if (x is String) {
-    localFunction();
-    x;
-  }
-}
-''');
-  }
-
-  test_potentiallyMutatedInScope() async {
-    await resolveCode(r'''
-f(Object x) {
-  if (x is String) {
-    /*String*/ x;
-  }
-
-  x = 42;
-}
-''');
-  }
-
-  test_switch_outerIsType_assignedInCase() async {
-    await resolveCode(r'''
-void f(int e, Object x) {
-  if (x is String) {
-    switch (e) {
-      L: case 1:
-        x;
-        break;
-      case 2: // no label
-        /*String*/ x;
-        break;
-      case 3:
-        x = 42;
-        continue L;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_tryCatch_assigned_body() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is! String) return;
-  /*String*/ x;
-  try {
-    x = 42;
-    g(); // might throw
-    if (x is! String) return;
-    /*String*/ x;
-  } catch (_) {}
-  x;
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatch_isNotType_exit_body() async {
-    await resolveCode(r'''
-void f(Object x) {
-  try {
-    if (x is! String) return;
-    /*String*/ x;
-  } catch (_) {}
-  x;
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatch_isNotType_exit_body_catch() async {
-    await resolveCode(r'''
-void f(Object x) {
-  try {
-    if (x is! String) return;
-    /*String*/ x;
-  } catch (_) {
-    if (x is! String) return;
-    /*String*/ x;
-  }
-  /*String*/ x;
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatch_isNotType_exit_body_catchRethrow() async {
-    await resolveCode(r'''
-void f(Object x) {
-  try {
-    if (x is! String) return;
-    /*String*/ x;
-  } catch (_) {
-    x;
-    rethrow;
-  }
-  /*String*/ x;
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatch_isNotType_exit_catch() async {
-    await resolveCode(r'''
-void f(Object x) {
-  try {
-  } catch (_) {
-    if (x is! String) return;
-    /*String*/ x;
-  }
-  x;
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatchFinally_outerIsType() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    try {
-      /*String*/ x;
-    } catch (_) {
-      /*String*/ x;
-    } finally {
-      /*String*/ x;
-    }
-    /*String*/ x;
-  }
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatchFinally_outerIsType_assigned_body() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    try {
-      /*String*/ x;
-      x = 42;
-      g();
-    } catch (_) {
-      x;
-    } finally {
-      x;
-    }
-    x;
-  }
-}
-
-void g() {}
-''');
-  }
-
-  test_tryCatchFinally_outerIsType_assigned_catch() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    try {
-      /*String*/ x;
-    } catch (_) {
-      /*String*/ x;
-      x = 42;
-    } finally {
-      x;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_tryFinally_outerIsType_assigned_body() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    try {
-      /*String*/ x;
-      x = 42;
-    } finally {
-      x;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_tryFinally_outerIsType_assigned_finally() async {
-    await resolveCode(r'''
-void f(Object x) {
-  if (x is String) {
-    try {
-      /*String*/ x;
-    } finally {
-      /*String*/ x;
-      x = 42;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_while_condition_false() async {
-    await resolveCode(r'''
-void f(Object x) {
-  while (x is! String) {
-    x;
-  }
-  /*String*/ x;
-}
-''');
-  }
-
-  test_while_condition_true() async {
-    await resolveCode(r'''
-void f(Object x) {
-  while (x is String) {
-    /*String*/ x;
-  }
-  x;
-}
-''');
-  }
-
-  test_while_outerIsType() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    while (b) {
-      /*String*/ x;
-    }
-    /*String*/ x;
-  }
-}
-''');
-  }
-
-  test_while_outerIsType_loopAssigned_body() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    while (b) {
-      x;
-      x = x.length;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  test_while_outerIsType_loopAssigned_condition() async {
-    await resolveCode(r'''
-void f(bool b, Object x) {
-  if (x is String) {
-    while (x != 0) {
-      x;
-      x = x.length;
-    }
-    x;
-  }
-}
-''');
-  }
-
-  Future<ResolvedUnitResult> _resultComputer(String code) async {
-    addTestFile(code);
-    await resolveTestFile();
-    return result;
-  }
-}
-
-class _TypePromotionDataComputer extends DataComputer<DartType> {
-  const _TypePromotionDataComputer();
-
-  @override
-  DataInterpreter<DartType> get dataValidator =>
-      const _TypePromotionDataInterpreter();
-
-  @override
-  void computeUnitData(
-      CompilationUnit unit, Map<Id, ActualData<DartType>> actualMap) {
-    _TypePromotionDataExtractor(unit.declaredElement.source.uri, actualMap)
-        .run(unit);
-  }
-}
-
-class _TypePromotionDataExtractor extends AstDataExtractor<DartType> {
-  _TypePromotionDataExtractor(Uri uri, Map<Id, ActualData<DartType>> actualMap)
-      : super(uri, actualMap);
-
-  @override
-  DartType computeNodeValue(Id id, AstNode node) {
-    if (node is SimpleIdentifier && node.inGetterContext()) {
-      var element = node.staticElement;
-      if (element is VariableElement &&
-          (element is LocalVariableElement || element is ParameterElement)) {
-        var promotedType = node.staticType;
-        if (promotedType != element.type) {
-          return promotedType;
-        }
-      }
-    }
-    return null;
-  }
-}
-
-class _TypePromotionDataInterpreter implements DataInterpreter<DartType> {
-  const _TypePromotionDataInterpreter();
-
-  @override
-  String getText(DartType actualData) => actualData.toString();
-
-  @override
-  String isAsExpected(DartType actualData, String expectedData) {
-    if (actualData.toString() == expectedData) {
-      return null;
-    } else {
-      return 'Expected $expectedData, got $actualData';
-    }
-  }
-
-  @override
-  bool isEmpty(DartType actualData) => actualData == null;
-}
diff --git a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
index b795f9d..457e913 100644
--- a/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
+++ b/pkg/analyzer/test/src/dart/sdk/sdk_test.dart
@@ -225,7 +225,7 @@
     FolderBasedDartSdk sdk = _createDartSdk();
     String version = sdk.sdkVersion;
     expect(version, isNotNull);
-    expect(version.length > 0, isTrue);
+    expect(version.isNotEmpty, isTrue);
   }
 
   /**
diff --git a/pkg/analyzer/test/src/diagnostics/access_static_extension_member_test.dart b/pkg/analyzer/test/src/diagnostics/access_static_extension_member_test.dart
new file mode 100644
index 0000000..deb739c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/access_static_extension_member_test.dart
@@ -0,0 +1,74 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AccessStaticExtensionMemberTest);
+  });
+}
+
+@reflectiveTest
+class AccessStaticExtensionMemberTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  @failingTest
+  test_getter() async {
+    await assertErrorsInCode('''
+class C {}
+
+extension E on C {
+  static int get a => 0;
+}
+
+f(C c) {
+  c.a;
+}
+''', [
+      error(CompileTimeErrorCode.ACCESS_STATIC_EXTENSION_MEMBER, 72, 1),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+class C {}
+
+extension E on C {
+  static void a() {}
+}
+
+f(C c) {
+  c.a();
+}
+''', [
+      error(CompileTimeErrorCode.ACCESS_STATIC_EXTENSION_MEMBER, 68, 1),
+    ]);
+  }
+
+  @failingTest
+  test_setter() async {
+    await assertErrorsInCode('''
+class C {}
+
+extension E on C {
+  static set a(v) {}}
+}
+
+f(C c) {
+  c.a = 2;
+}
+''', [
+      error(CompileTimeErrorCode.ACCESS_STATIC_EXTENSION_MEMBER, 69, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
new file mode 100644
index 0000000..02dc727
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_export_test.dart
@@ -0,0 +1,58 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AmbiguousExportTest);
+    defineReflectiveTests(AmbiguousExportWithExtensionMethodsTest);
+  });
+}
+
+@reflectiveTest
+class AmbiguousExportTest extends DriverResolutionTest {
+  test_class() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+class N {}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+class N {}
+''');
+    await assertErrorsInCode(r'''
+export 'lib1.dart';
+export 'lib2.dart';
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 20, 19),
+    ]);
+  }
+}
+
+@reflectiveTest
+class AmbiguousExportWithExtensionMethodsTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_extension() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+extension E on String {}
+''');
+    await assertErrorsInCode(r'''
+export 'lib1.dart';
+export 'lib2.dart';
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 20, 19),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_extension_method_access_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_method_access_test.dart
new file mode 100644
index 0000000..cc03f82
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_extension_method_access_test.dart
@@ -0,0 +1,88 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AmbiguousExtensionMethodAccessTest);
+  });
+}
+
+@reflectiveTest
+class AmbiguousExtensionMethodAccessTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_getter() async {
+    // TODO(brianwilkerson) Ensure that only one diagnostic is produced.
+    await assertErrorsInCode('''
+class A {}
+
+extension A1_Ext on A {
+  void get a => 1;
+}
+
+extension A2_Ext on A {
+  void get a => 2;
+}
+
+f(A a) {
+  a.a;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_GETTER, 117, 1),
+      error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS, 117, 1),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+class A {}
+
+extension A1_Ext on A {
+  void a() {}
+}
+
+extension A2_Ext on A {
+  void a() {}
+}
+
+f(A a) {
+  a.a();
+}
+''', [
+      error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS, 107, 1),
+    ]);
+  }
+
+  test_setter() async {
+    // TODO(brianwilkerson) Ensure that only one diagnostic is produced.
+    await assertErrorsInCode('''
+class A {}
+
+extension A1_Ext on A {
+  set a(x) {}
+}
+
+extension A2_Ext on A {
+  set a(x) {}
+}
+
+f(A a) {
+  a.a = 3;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_SETTER, 107, 1),
+      error(CompileTimeErrorCode.AMBIGUOUS_EXTENSION_METHOD_ACCESS, 107, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
new file mode 100644
index 0000000..1ddeae5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_import_test.dart
@@ -0,0 +1,251 @@
+// 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/dart/analysis/results.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:matcher/src/core_matchers.dart';
+import 'package:test_api/src/frontend/expect.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../../generated/test_support.dart';
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AmbiguousImportTest);
+  });
+}
+
+@reflectiveTest
+class AmbiguousImportTest extends DriverResolutionTest {
+  test_as() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p as N;}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 51, 1),
+    ]);
+  }
+
+  test_dart() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+import 'dart:async2';
+
+Future v;
+''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 44, 6),
+    ]);
+  }
+
+  test_extends() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+class A extends N {}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 56, 1),
+      error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 56, 1),
+    ]);
+  }
+
+  test_implements() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+class A implements N {}''', [
+      error(CompileTimeErrorCode.IMPLEMENTS_NON_CLASS, 59, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 59, 1),
+    ]);
+  }
+
+  test_inPart() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}
+''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}
+''');
+    newFile('/test/lib/part.dart', content: '''
+part of lib;
+class A extends N {}
+''');
+    newFile('/test/lib/lib.dart', content: '''
+library lib;
+import 'lib1.dart';
+import 'lib2.dart';
+part 'part.dart';
+''');
+    ResolvedUnitResult libResult =
+        await resolveFile(convertPath('/test/lib/lib.dart'));
+    ResolvedUnitResult partResult =
+        await resolveFile(convertPath('/test/lib/part.dart'));
+    expect(libResult.errors, hasLength(0));
+    new GatheringErrorListener()
+      ..addAll(partResult.errors)
+      ..assertErrors([
+        error(StaticWarningCode.AMBIGUOUS_IMPORT, 29, 1),
+        error(CompileTimeErrorCode.EXTENDS_NON_CLASS, 29, 1),
+      ]);
+  }
+
+  test_instanceCreation() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+library L;
+import 'lib1.dart';
+import 'lib2.dart';
+f() {new N();}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 60, 1),
+    ]);
+  }
+
+  test_is() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+f(p) {p is N;}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 51, 1),
+    ]);
+  }
+
+  test_qualifier() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+g() { N.FOO; }''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 46, 1),
+    ]);
+  }
+
+  test_typeAnnotation() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+typedef N FT(N p);
+N f(N p) {
+  N v;
+  return null;
+}
+class A {
+  N m() { return null; }
+}
+class B<T extends N> {}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 48, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 53, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 59, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 63, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 72, 1),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 74, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 106, 1),
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 149, 1),
+    ]);
+  }
+
+  test_typeArgument_annotation() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+A<N> f() { return null; }''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 56, 1),
+    ]);
+  }
+
+  test_typeArgument_instanceCreation() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+class N {}''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+class N {}''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+class A<T> {}
+f() {new A<N>();}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 65, 1),
+    ]);
+  }
+
+  test_varRead() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+var v;''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+var v;''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { g(v); }
+g(p) {}''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 48, 1),
+    ]);
+  }
+
+  test_varWrite() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib1;
+var v;''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib2;
+var v;''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+f() { v = 0; }''', [
+      error(StaticWarningCode.AMBIGUOUS_IMPORT, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
index 26f5983..2a9c670 100644
--- a/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/ambiguous_set_or_map_literal_test.dart
@@ -17,7 +17,7 @@
 @reflectiveTest
 class AmbiguousSetOrMapLiteralBothTest extends DriverResolutionTest {
   test_setAndMap() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 Map<int, int> map;
 Set<int> set;
 var c = {...set, ...map};
@@ -39,7 +39,7 @@
   }
 
   test_setAndMap() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 var map;
 var set;
 var c = {...set, ...map};
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 06192b0..9d2253f 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
@@ -5,6 +5,7 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
+import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -18,6 +19,130 @@
 
 @reflectiveTest
 class ArgumentTypeNotAssignableTest extends DriverResolutionTest {
+  test_ambiguousClassName() async {
+    // See dartbug.com/19624
+    newFile("/test/lib/lib2.dart", content: '''
+class _A {}
+g(h(_A a)) {}''');
+    await assertErrorsInCode('''
+import 'lib2.dart';
+class _A {}
+f() {
+  g((_A a) {});
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 42, 9),
+    ]);
+    // The name _A is private to the library it's defined in, so this is a type
+    // mismatch. Furthermore, the error message should mention both _A and the
+    // filenames so the user can figure out what's going on.
+    String message = result.errors[0].message;
+    expect(message.indexOf("_A") >= 0, isTrue);
+  }
+
+  test_annotation_namedConstructor() async {
+    await assertErrorsInCode('''
+class A {
+  const A.fromInt(int p);
+}
+@A.fromInt('0')
+main() {
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 49, 3),
+    ]);
+  }
+
+  test_annotation_unnamedConstructor() async {
+    await assertErrorsInCode('''
+class A {
+  const A(int p);
+}
+@A('0')
+main() {
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 33, 3),
+    ]);
+  }
+
+  test_binary() async {
+    await assertErrorsInCode('''
+class A {
+  operator +(int p) {}
+}
+f(A a) {
+  a + '0';
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 3),
+    ]);
+  }
+
+  test_call() async {
+    await assertErrorsInCode('''
+typedef bool Predicate<T>(T object);
+
+Predicate<String> f() => (String s) => false;
+
+void main() {
+  f().call(3);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 110, 1),
+    ]);
+  }
+
+  test_cascadeSecond() async {
+    await assertErrorsInCode('''
+// filler filler filler filler filler filler filler filler filler filler
+class A {
+  B ma() { return new B(); }
+}
+class B {
+  mb(String p) {}
+}
+
+main() {
+  A a = new A();
+  a..  ma().mb(0);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 186, 1),
+    ]);
+  }
+
+  test_const() async {
+    await assertErrorsInCode('''
+class A {
+  const A(String p);
+}
+main() {
+  const A(42);
+}''', [
+      error(
+          CheckedModeCompileTimeErrorCode.CONST_CONSTRUCTOR_PARAM_TYPE_MISMATCH,
+          52,
+          2),
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
+    ]);
+  }
+
+  test_const_super() async {
+    await assertErrorsInCode('''
+class A {
+  const A(String p);
+}
+class B extends A {
+  const B() : super(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 73, 2),
+    ]);
+  }
+
+  test_functionExpressionInvocation_required() async {
+    await assertErrorsInCode('''
+main() {
+  (int x) {} ('');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 23, 2),
+    ]);
+  }
+
   test_functionType() async {
     await assertErrorsInCode(r'''
 m() {
@@ -32,6 +157,18 @@
     ]);
   }
 
+  test_index() async {
+    await assertErrorsInCode('''
+class A {
+  operator [](int index) {}
+}
+f(A a) {
+  a['0'];
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 53, 3),
+    ]);
+  }
+
   test_interfaceType() async {
     await assertErrorsInCode(r'''
 m() {
@@ -43,6 +180,187 @@
       error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 24, 1),
     ]);
   }
+
+  test_invocation_callParameter() async {
+    await assertErrorsInCode('''
+class A {
+  call(int p) {}
+}
+f(A a) {
+  a('0');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 42, 3),
+    ]);
+  }
+
+  test_invocation_callVariable() async {
+    await assertErrorsInCode('''
+class A {
+  call(int p) {}
+}
+main() {
+  A a = new A();
+  a('0');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 59, 3),
+    ]);
+  }
+
+  test_invocation_functionParameter() async {
+    await assertErrorsInCode('''
+a(b(int p)) {
+  b('0');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 18, 3),
+    ]);
+  }
+
+  test_invocation_functionParameter_generic() async {
+    await assertErrorsInCode('''
+class A<K, V> {
+  m(f(K k), V v) {
+    f(v);
+  }
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 41, 1),
+    ]);
+  }
+
+  test_invocation_functionTypes_optional() async {
+    await assertErrorsInCode('''
+void acceptFunNumOptBool(void funNumOptBool([bool b])) {}
+void funNumBool(bool b) {}
+main() {
+  acceptFunNumOptBool(funNumBool);
+}''', [
+      error(StrongModeCode.INVALID_CAST_FUNCTION, 116, 10),
+    ]);
+  }
+
+  test_invocation_generic() async {
+    await assertErrorsInCode('''
+class A<T> {
+  m(T t) {}
+}
+f(A<String> a) {
+  a.m(1);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 50, 1),
+    ]);
+  }
+
+  test_invocation_named() async {
+    await assertErrorsInCode('''
+f({String p = ''}) {}
+main() {
+  f(p: 42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 35, 5),
+    ]);
+  }
+
+  test_invocation_optional() async {
+    await assertErrorsInCode('''
+f([String p = '']) {}
+main() {
+  f(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 35, 2),
+    ]);
+  }
+
+  test_invocation_required() async {
+    await assertErrorsInCode('''
+f(String p) {}
+main() {
+  f(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 28, 2),
+    ]);
+  }
+
+  test_invocation_typedef_generic() async {
+    await assertErrorsInCode('''
+typedef A<T>(T p);
+f(A<int> a) {
+  a('1');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 37, 3),
+    ]);
+  }
+
+  test_invocation_typedef_local() async {
+    await assertErrorsInCode('''
+typedef A(int p);
+A getA() => throw '';
+main() {
+  A a = getA();
+  a('1');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 69, 3),
+    ]);
+  }
+
+  test_invocation_typedef_parameter() async {
+    await assertErrorsInCode('''
+typedef A(int p);
+f(A a) {
+  a('1');
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 31, 3),
+    ]);
+  }
+
+  test_new_generic() async {
+    await assertErrorsInCode('''
+class A<T> {
+  A(T p) {}
+}
+main() {
+  new A<String>(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 52, 2),
+    ]);
+  }
+
+  test_new_optional() async {
+    await assertErrorsInCode('''
+class A {
+  A([String p = '']) {}
+}
+main() {
+  new A(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 53, 2),
+    ]);
+  }
+
+  test_new_required() async {
+    await assertErrorsInCode('''
+class A {
+  A(String p) {}
+}
+main() {
+  new A(42);
+}''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 46, 2),
+    ]);
+  }
+
+  @failingTest
+  test_tearOff_required() async {
+    await assertErrorsInCode('''
+class C {
+  Object/*=T*/ f/*<T>*/(Object/*=T*/ x) => x;
+}
+g(C c) {
+  var h = c.f/*<int>*/;
+  print(h('s'));
+}
+''', [
+      error(StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE, 99, 1),
+    ]);
+  }
 }
 
 @reflectiveTest
@@ -85,4 +403,10 @@
 n(int i) {}
 ''');
   }
+
+  @failingTest
+  test_invocation_functionTypes_optional() async {
+    // The test is currently generating an error where none is expected.
+    await super.test_invocation_functionTypes_optional();
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
new file mode 100644
index 0000000..a3b7863
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_const_test.dart
@@ -0,0 +1,64 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToConstTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToConstTest extends DriverResolutionTest {
+  test_instanceVariable() async {
+    await assertErrorsInCode('''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v = 1;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 42, 3),
+    ]);
+  }
+
+  test_instanceVariable_plusEq() async {
+    await assertErrorsInCode('''
+class A {
+  static const v = 0;
+}
+f() {
+  A.v += 1;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 42, 3),
+    ]);
+  }
+
+  test_localVariable() async {
+    await assertErrorsInCode('''
+f() {
+  const x = 0;
+  x = 1;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
+    ]);
+  }
+
+  test_localVariable_plusEq() async {
+    await assertErrorsInCode('''
+f() {
+  const x = 0;
+  x += 1;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_CONST, 23, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
new file mode 100644
index 0000000..2839d0a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_local_test.dart
@@ -0,0 +1,123 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToFinalLocalTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToFinalLocalTest extends DriverResolutionTest {
+  test_localVariable() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x = 1;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_localVariable_plusEq() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x += 1;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_parameter() async {
+    await assertErrorsInCode('''
+f(final x) {
+  x = 1;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 15, 1),
+    ]);
+  }
+
+  test_postfixMinusMinus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x--;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_postfixPlusPlus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x++;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_prefixMinusMinus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  --x;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 25, 1),
+    ]);
+  }
+
+  test_prefixPlusPlus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  ++x;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 25, 1),
+    ]);
+  }
+
+  test_suffixMinusMinus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x--;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_suffixPlusPlus() async {
+    await assertErrorsInCode('''
+f() {
+  final x = 0;
+  x++;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 14, 1),
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 23, 1),
+    ]);
+  }
+
+  test_topLevelVariable() async {
+    await assertErrorsInCode('''
+final x = 0;
+f() { x = 1; }''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_LOCAL, 19, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart
new file mode 100644
index 0000000..a5f6427
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_no_setter_test.dart
@@ -0,0 +1,45 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToFinalNoSetterTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToFinalNoSetterTest extends DriverResolutionTest {
+  test_prefixedIdentifier() async {
+    await assertErrorsInCode('''
+class A {
+  int get x => 0;
+}
+main() {
+  A a = new A();
+  a.x = 0;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, 60, 1),
+    ]);
+  }
+
+  test_propertyAccess() async {
+    await assertErrorsInCode('''
+class A {
+  int get x => 0;
+}
+class B {
+  static A a;
+}
+main() {
+  B.a.x = 0;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, 71, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
new file mode 100644
index 0000000..b2a4a05
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_final_test.dart
@@ -0,0 +1,76 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+import 'package:analyzer/src/error/codes.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToFinalTest);
+    defineReflectiveTests(AssignmentToFinalWithNnbdTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToFinalTest extends DriverResolutionTest {
+  test_instanceVariable() async {
+    await assertErrorsInCode('''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v = 1;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL, 54, 1),
+    ]);
+  }
+
+  test_instanceVariable_plusEq() async {
+    await assertErrorsInCode('''
+class A {
+  final v = 0;
+}
+f() {
+  A a = new A();
+  a.v += 1;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FINAL, 54, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class AssignmentToFinalWithNnbdTest extends AssignmentToFinalTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
+
+  @failingTest
+  test_field_late() async {
+    await assertNoErrorsInCode('''
+class A {
+  final a;
+  void m() {
+    a = 1;
+  }
+}
+''');
+  }
+
+  @failingTest
+  test_localVariable_late() async {
+    await assertNoErrorsInCode('''
+void f() {
+  final a;
+  a = 1;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart
new file mode 100644
index 0000000..d24ec7e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_function_test.dart
@@ -0,0 +1,27 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToFunctionTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToFunctionTest extends DriverResolutionTest {
+  test_function() async {
+    await assertErrorsInCode('''
+f() {}
+main() {
+  f = null;
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_FUNCTION, 18, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
new file mode 100644
index 0000000..0a24297
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_method_test.dart
@@ -0,0 +1,29 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToMethodTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToMethodTest extends DriverResolutionTest {
+  test_method() async {
+    await assertErrorsInCode('''
+class A {
+  m() {}
+}
+f(A a) {
+  a.m = () {};
+}''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_METHOD, 32, 3),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart b/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart
new file mode 100644
index 0000000..f0b8b6a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/assignment_to_type_test.dart
@@ -0,0 +1,62 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentToTypeTest);
+  });
+}
+
+@reflectiveTest
+class AssignmentToTypeTest extends DriverResolutionTest {
+  test_class() async {
+    await assertErrorsInCode('''
+class C {}
+main() {
+  C = null;
+}
+''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 22, 1),
+    ]);
+  }
+
+  test_enum() async {
+    await assertErrorsInCode('''
+enum E { e }
+main() {
+  E = null;
+}
+''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 24, 1),
+    ]);
+  }
+
+  test_typedef() async {
+    await assertErrorsInCode('''
+typedef void F();
+main() {
+  F = null;
+}
+''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 29, 1),
+    ]);
+  }
+
+  test_typeParameter() async {
+    await assertErrorsInCode('''
+class C<T> {
+  f() {
+    T = null;
+  }
+}
+''', [
+      error(StaticWarningCode.ASSIGNMENT_TO_TYPE, 25, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart b/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart
new file mode 100644
index 0000000..6594b74
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/case_block_not_terminated_test.dart
@@ -0,0 +1,31 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CaseBlockNotTerminatedTest);
+  });
+}
+
+@reflectiveTest
+class CaseBlockNotTerminatedTest extends DriverResolutionTest {
+  test_caseBlockNotTerminated() async {
+    await assertErrorsInCode('''
+f(int p) {
+  switch (p) {
+    case 0:
+      f(p);
+    case 1:
+      break;
+  }
+}''', [
+      error(StaticWarningCode.CASE_BLOCK_NOT_TERMINATED, 30, 4),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart
new file mode 100644
index 0000000..08b4de7
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/cast_to_non_type_test.dart
@@ -0,0 +1,27 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(CastToNonTypeTest);
+  });
+}
+
+@reflectiveTest
+class CastToNonTypeTest extends DriverResolutionTest {
+  test_variable() async {
+    await assertErrorsInCode('''
+var A = 0;
+f(String s) { var x = s as A; }''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 29, 1),
+      error(StaticWarningCode.CAST_TO_NON_TYPE, 38, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
new file mode 100644
index 0000000..473325b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/concrete_class_with_abstract_member_test.dart
@@ -0,0 +1,38 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConcreteClassWithAbstractMemberTest);
+  });
+}
+
+@reflectiveTest
+class ConcreteClassWithAbstractMemberTest extends DriverResolutionTest {
+  test_direct() async {
+    await assertErrorsInCode('''
+class A {
+  m();
+}''', [
+      error(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 12, 4),
+    ]);
+  }
+
+  test_noSuchMethod_interface() async {
+    await assertErrorsInCode('''
+class I {
+  noSuchMethod(v) => '';
+}
+class A implements I {
+  m();
+}''', [
+      error(StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, 62, 4),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/const_with_abstract_class_test.dart b/pkg/analyzer/test/src/diagnostics/const_with_abstract_class_test.dart
new file mode 100644
index 0000000..9248319
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/const_with_abstract_class_test.dart
@@ -0,0 +1,46 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ConstWithAbstractClassTest);
+  });
+}
+
+@reflectiveTest
+class ConstWithAbstractClassTest extends DriverResolutionTest {
+  test_generic() async {
+    await assertErrorsInCode('''
+abstract class A<E> {
+  const A();
+}
+void f() {
+  var a = const A<int>();
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 54, 1),
+      error(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, 64, 6),
+    ]);
+
+    assertType(findNode.instanceCreation('const A<int>'), 'A<int>');
+  }
+
+  test_simple() async {
+    await assertErrorsInCode('''
+abstract class A {
+  const A();
+}
+void f() {
+  A a = const A();
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 49, 1),
+      error(StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, 59, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart
new file mode 100644
index 0000000..ed17e5b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_extends_function_test.dart
@@ -0,0 +1,35 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeprecatedExtendsFunctionTest);
+  });
+}
+
+@reflectiveTest
+class DeprecatedExtendsFunctionTest extends DriverResolutionTest {
+  test_core() async {
+    await assertErrorsInCode('''
+class A extends Function {}
+''', [
+      error(HintCode.DEPRECATED_EXTENDS_FUNCTION, 16, 8),
+    ]);
+  }
+
+  test_local() async {
+    await assertErrorsInCode('''
+class Function {}
+class A extends Function {}
+''', [
+      error(HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, 6, 8),
+      error(HintCode.DEPRECATED_EXTENDS_FUNCTION, 34, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_function_class_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_function_class_declaration_test.dart
new file mode 100644
index 0000000..66dc44d
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_function_class_declaration_test.dart
@@ -0,0 +1,25 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeprecatedFunctionClassDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class DeprecatedFunctionClassDeclarationTest extends DriverResolutionTest {
+  test_declaration() async {
+    await assertErrorsInCode('''
+class Function {}
+''', [
+      error(HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, 6, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
index 700ae9e..4aa435c 100644
--- a/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_member_use_test.dart
@@ -25,7 +25,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'deprecated_library.dart';
 f(A a) {}
 ''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE],
@@ -43,7 +43,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'deprecated_library.dart';
 f(A a) {}
 ''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE],
@@ -127,7 +127,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'deprecated_library.dart';
 f(A a) {}
 ''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE],
@@ -300,7 +300,7 @@
   }
 
   test_methodInvocation_constructor() async {
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 class A {
   @Deprecated('0.9')
   m() {}
@@ -333,7 +333,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'deprecated_library.dart';
 f(A a) {}
 ''', [HintCode.DEPRECATED_MEMBER_USE_FROM_SAME_PACKAGE],
@@ -458,7 +458,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 f(A a) {}
 ''', // This is a cross-package deprecated member usage.
@@ -477,7 +477,7 @@
     newFile('/workspace/project/BUILD');
     newFolder('/workspace/bazel-genfiles');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 f(A a) {}
 ''', // This is a cross-package deprecated member usage.
@@ -497,7 +497,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import '../../project_a/lib/deprecated_library.dart';
 f(A a) {}
 ''', // This is a same-workspace, cross-package deprecated member usage.
@@ -513,7 +513,7 @@
 ''');
 
     newPubPackage('/pkg1');
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 export 'package:foo/foo.dart';
 ''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
   }
@@ -534,7 +534,7 @@
             'BAR=bar\n');
     newFile('/workspace/out/debug-x87_128/dartlang/gen/project/foo.packages');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 f(A a) {}
 ''', // This is a cross-package deprecated member usage.
@@ -560,7 +560,7 @@
 class A {}
 ''');
 
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import '../../project_a/lib/deprecated_library.dart';
 f(A a) {}
 ''', // This is a same-workspace, cross-package deprecated member usage.
@@ -596,7 +596,7 @@
 ''');
 
     newPubPackage('/pkg1');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 void main() => A().m();
 ''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
@@ -611,7 +611,7 @@
 ''');
 
     newPubPackage('/pkg1');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 void main() => A().m();
 ''', [HintCode.DEPRECATED_MEMBER_USE], sourceName: '/pkg1/lib/lib1.dart');
@@ -626,7 +626,7 @@
 
     newFolder('/workspace/.dart_tool/build/generated/project/lib');
     newFileWithBytes('/workspace/pubspec.yaml', 'name: project'.codeUnits);
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'package:foo/foo.dart';
 f(A a) {}
 ''', // This is a cross-package deprecated member usage.
diff --git a/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart
new file mode 100644
index 0000000..dd0b1b9
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/deprecated_mixin_function_test.dart
@@ -0,0 +1,35 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DeprecatedMixinFunctionTest);
+  });
+}
+
+@reflectiveTest
+class DeprecatedMixinFunctionTest extends DriverResolutionTest {
+  test_core() async {
+    await assertErrorsInCode('''
+class A extends Object with Function {}
+''', [
+      error(HintCode.DEPRECATED_MIXIN_FUNCTION, 28, 8),
+    ]);
+  }
+
+  test_local() async {
+    await assertErrorsInCode('''
+class Function {}
+class A extends Object with Function {}
+''', [
+      error(HintCode.DEPRECATED_FUNCTION_CLASS_DECLARATION, 6, 8),
+      error(HintCode.DEPRECATED_MIXIN_FUNCTION, 46, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/down_cast_composite_test.dart b/pkg/analyzer/test/src/diagnostics/down_cast_composite_test.dart
new file mode 100644
index 0000000..06b08db
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/down_cast_composite_test.dart
@@ -0,0 +1,52 @@
+// 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/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DownCastCompositeDisabledTest);
+    defineReflectiveTests(DownCastCompositeEnabledTest);
+  });
+}
+
+@reflectiveTest
+class DownCastCompositeDisabledTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..strongModeHints = false;
+
+  test_use() async {
+    await assertNoErrorsInCode('''
+main() {
+  List dynamicList = [ ];
+  List<int> list = dynamicList;
+  print(list);
+}
+''');
+  }
+}
+
+@reflectiveTest
+class DownCastCompositeEnabledTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..strongModeHints = true;
+
+  test_use() async {
+    await assertErrorsInCode('''
+main() {
+  List dynamicList = [ ];
+  List<int> list = dynamicList;
+  print(list);
+}
+''', [
+      error(StrongModeCode.DOWN_CAST_COMPOSITE, 54, 11),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart
new file mode 100644
index 0000000..aadefba
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_hidden_name_test.dart
@@ -0,0 +1,29 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DuplicateHiddenNameTest);
+  });
+}
+
+@reflectiveTest
+class DuplicateHiddenNameTest extends DriverResolutionTest {
+  test_hidden() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+class B {}
+''');
+    await assertErrorsInCode('''
+export 'lib1.dart' hide A, B, A;
+''', [
+      error(HintCode.DUPLICATE_HIDDEN_NAME, 30, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart
new file mode 100644
index 0000000..b921499
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/duplicate_shown_name_test.dart
@@ -0,0 +1,29 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(DuplicateShownNameTest);
+  });
+}
+
+@reflectiveTest
+class DuplicateShownNameTest extends DriverResolutionTest {
+  test_hidden() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+class A {}
+class B {}
+''');
+    await assertErrorsInCode('''
+export 'lib1.dart' show A, B, A;
+''', [
+      error(HintCode.DUPLICATE_SHOWN_NAME, 30, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
index 61548d2..1f8c51a 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_elements_in_const_set_test.dart
@@ -22,7 +22,10 @@
     await assertErrorsInCode('''
 var c = const {1, 2, 1};
 ''', [
-      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 1),
+      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 1,
+          expectedMessages: [
+            message(resourceProvider.convertPath('/test/lib/test.dart'), 15, 1)
+          ]),
     ]);
   }
 
@@ -33,7 +36,13 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1),
+                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 36, 1,
+                    expectedMessages: [
+                      message(
+                          resourceProvider.convertPath('/test/lib/test.dart'),
+                          15,
+                          1)
+                    ]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 19),
@@ -95,7 +104,13 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1),
+                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 29, 1,
+                    expectedMessages: [
+                      message(
+                          resourceProvider.convertPath('/test/lib/test.dart'),
+                          15,
+                          1)
+                    ]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 12),
@@ -110,7 +125,10 @@
 
 var c = const {const A<int>(), const A<int>()};
 ''', [
-      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 60, 14),
+      error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 60, 14,
+          expectedMessages: [
+            message(resourceProvider.convertPath('/test/lib/test.dart'), 44, 14)
+          ]),
     ]);
   }
 
@@ -144,7 +162,13 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3),
+                error(CompileTimeErrorCode.EQUAL_ELEMENTS_IN_CONST_SET, 21, 3,
+                    expectedMessages: [
+                      message(
+                          resourceProvider.convertPath('/test/lib/test.dart'),
+                          15,
+                          1)
+                    ]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_SET_ELEMENT, 18, 6),
diff --git a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
index 590411c..fc2b901 100644
--- a/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/equal_keys_in_const_map_test.dart
@@ -22,7 +22,8 @@
     await assertErrorsInCode('''
 var c = const {1: null, 2: null, 1: null};
 ''', [
-      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 33, 1),
+      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 33, 1,
+          expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
     ]);
   }
 
@@ -33,7 +34,8 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1),
+                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 48, 1,
+                    expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 31),
@@ -95,7 +97,8 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1),
+                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 35, 1,
+                    expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 18),
@@ -110,7 +113,8 @@
 
 var c = const {const A<int>(): null, const A<int>(): null};
 ''', [
-      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 66, 14),
+      error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 66, 14,
+          expectedMessages: [message('/test/lib/test.dart', 44, 14)]),
     ]);
   }
 
@@ -144,7 +148,8 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9),
+                error(CompileTimeErrorCode.EQUAL_KEYS_IN_CONST_MAP, 27, 9,
+                    expectedMessages: [message('/test/lib/test.dart', 15, 1)]),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 24, 12),
diff --git a/pkg/analyzer/test/src/diagnostics/export_suplicated_library_named_test.dart b/pkg/analyzer/test/src/diagnostics/export_suplicated_library_named_test.dart
new file mode 100644
index 0000000..8b39ac3
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/export_suplicated_library_named_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExportDuplicatedLibraryNamedTest);
+  });
+}
+
+@reflectiveTest
+class ExportDuplicatedLibraryNamedTest extends DriverResolutionTest {
+  test_sameNames() async {
+    newFile("/test/lib/lib1.dart", content: "library lib;");
+    newFile("/test/lib/lib2.dart", content: "library lib;");
+    await assertErrorsInCode('''
+export 'lib1.dart';
+export 'lib2.dart';
+''', [
+      error(StaticWarningCode.EXPORT_DUPLICATED_LIBRARY_NAMED, 20, 19),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart
new file mode 100644
index 0000000..3426dd9
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_abstract_method_test.dart
@@ -0,0 +1,70 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionDeclaresAbstractMethodTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionDeclaresAbstractMethodTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_getter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  bool get isPalindrome;
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER, 35, 12),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+extension E on String {
+  String reversed();
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER, 33, 8),
+    ]);
+  }
+
+  test_none() async {
+    await assertNoErrorsInCode('''
+extension E on String {}
+''');
+  }
+
+  test_operator() async {
+    await assertErrorsInCode('''
+extension E on String {
+  String operator -(String otherString);
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER, 42, 1),
+    ]);
+  }
+
+  test_setter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  set length(int newLength);
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_ABSTRACT_MEMBER, 30, 6),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart
new file mode 100644
index 0000000..b7d66b5
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_constructor_test.dart
@@ -0,0 +1,46 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionDeclaresConstructorTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionDeclaresConstructorTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_named() async {
+    await assertErrorsInCode('''
+extension E on String {
+  E.named() : super();
+}
+''', [error(CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR, 28, 5)]);
+  }
+
+  test_none() async {
+    await assertNoErrorsInCode('''
+extension E on String {}
+''');
+  }
+
+  test_unnamed() async {
+    await assertErrorsInCode('''
+extension E on String {
+  E() : super();
+}
+''', [error(CompileTimeErrorCode.EXTENSION_DECLARES_CONSTRUCTOR, 26, 1)]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart
new file mode 100644
index 0000000..f7916c2
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_field_test.dart
@@ -0,0 +1,58 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionDeclaresFieldTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionDeclaresFieldTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_multiple() async {
+    await assertErrorsInCode('''
+extension E on String {
+  String one, two, three;
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD, 33, 3),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD, 38, 3),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD, 43, 5)
+    ]);
+  }
+
+  test_none() async {
+    await assertNoErrorsInCode('''
+extension E on String {}
+''');
+  }
+
+  test_one() async {
+    await assertErrorsInCode('''
+extension E on String {
+  String s;
+}
+''', [error(CompileTimeErrorCode.EXTENSION_DECLARES_INSTANCE_FIELD, 33, 1)]);
+  }
+
+  test_static() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  static String EMPTY = '';
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart b/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart
new file mode 100644
index 0000000..399b525
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_declares_member_of_object_test.dart
@@ -0,0 +1,62 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionDeclaresMemberOfObjectTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionDeclaresMemberOfObjectTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_instance_differentKind() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void hashCode() {}
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 31, 8),
+    ]);
+  }
+
+  test_instance_sameKind() async {
+    await assertErrorsInCode('''
+extension E on String {
+  bool operator==(_) => false;
+  int get hashCode => 0;
+  String toString() => '';
+  dynamic get runtimeType => null;
+  dynamic noSuchMethod(_) => null;
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 39, 2),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 65, 8),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 89, 8),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 121, 11),
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 152, 12),
+    ]);
+  }
+
+  test_static() async {
+    await assertErrorsInCode('''
+extension E on String {
+  static void hashCode() {}
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_DECLARES_MEMBER_OF_OBJECT, 38, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart
new file mode 100644
index 0000000..4ec538c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_access_to_static_member_test.dart
@@ -0,0 +1,87 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionOverrideAccessToStaticMemberTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionOverrideAccessToStaticMemberTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_getter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  static String get empty => '';
+}
+void f() {
+  E('a').empty;
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER, 79,
+          5),
+    ]);
+  }
+
+  test_getterAndSetter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  static String get empty => '';
+  static void set empty(String s) {}
+}
+void f() {
+  E('a').empty += 'b';
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER,
+          116, 5),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+extension E on String {
+  static String empty() => '';
+}
+void f() {
+  E('a').empty();
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER, 77,
+          5),
+    ]);
+    var invocation = findNode.methodInvocation('empty();');
+    assertMethodInvocation(
+      invocation,
+      findElement.method('empty'),
+      'String Function()',
+    );
+  }
+
+  test_setter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  static void set empty(String s) {}
+}
+void f() {
+  E('a').empty = 'b';
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ACCESS_TO_STATIC_MEMBER, 83,
+          5),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart
new file mode 100644
index 0000000..a0e9709
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_argument_not_assignable_test.dart
@@ -0,0 +1,102 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionDeclaresAbstractMethodTest);
+    defineReflectiveTests(ExtensionDeclaresAbstractMethodWithNNBDTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionDeclaresAbstractMethodTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_subtype() async {
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {}
+extension E on A {
+  void m() {}
+}
+void f(B b) {
+  E(b).m();
+}
+''');
+  }
+
+  test_supertype() async {
+    // This will be an error under NNBD.
+    await assertNoErrorsInCode('''
+class A {}
+class B extends A {}
+extension E on B {
+  void m() {}
+}
+void f(A a) {
+  E(a).m();
+}
+''');
+  }
+
+  test_unrelated() async {
+    await assertErrorsInCode('''
+class A {}
+class B {}
+extension E on A {
+  void m() {}
+}
+void f(B b) {
+  E(b).m();
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE, 75,
+          1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class ExtensionDeclaresAbstractMethodWithNNBDTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0',
+        additionalFeatures: [Feature.extension_methods, Feature.non_nullable]);
+
+  test_override_onNonNullable() async {
+    await assertErrorsInCode(r'''
+extension E on String {
+  void m() {}
+}
+f() {
+  E(null).m();
+}
+''', [
+      error(CompileTimeErrorCode.EXTENSION_OVERRIDE_ARGUMENT_NOT_ASSIGNABLE, 50,
+          4),
+    ]);
+  }
+
+  test_override_onNullable() async {
+    await assertNoErrorsInCode(r'''
+extension E on String? {
+  void m() {}
+}
+f() {
+  E(null).m();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart b/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart
new file mode 100644
index 0000000..c2723b8
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extension_override_without_access_test.dart
@@ -0,0 +1,135 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtensionOverrideWithoutAccessTest);
+  });
+}
+
+@reflectiveTest
+class ExtensionOverrideWithoutAccessTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_binaryExpression() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  int operator +(int x) => x;
+}
+f(C c) {
+  E(c) + 2;
+}
+''');
+  }
+
+  test_call() async {
+    await assertNoErrorsInCode('''
+class C {}
+
+extension E on C {
+  int call(int x) => 0;
+}
+
+f(C c) {
+  E(c)(2);
+}
+''');
+  }
+
+  test_expressionStatement() async {
+    await assertErrorsInCode('''
+class C {}
+extension E on C {
+  void m() {}
+}
+f(C c) {
+  E(c);
+}
+''', [error(CompileTimeErrorCode.EXTENSION_OVERRIDE_WITHOUT_ACCESS, 57, 4)]);
+    assertTypeDynamic(findNode.extensionOverride('E(c)'));
+  }
+
+  test_getter() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  int get g => 0;
+}
+f(C c) {
+  E(c).g;
+}
+''');
+  }
+
+  test_indexExpression_get() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  int operator [](int i) => 4;
+}
+f(C c) {
+  E(c)[2];
+}
+''');
+  }
+
+  test_indexExpression_set() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void operator []=(int i, int v) {}
+}
+f(C c) {
+  E(c)[2] = 5;
+}
+''');
+  }
+
+  test_methodInvocation() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  void m() {}
+}
+f(C c) {
+  E(c).m();
+}
+''');
+  }
+
+  test_prefixExpression() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  int operator -() => 7;
+}
+f(C c) {
+  -E(c);
+}
+''');
+  }
+
+  test_setter() async {
+    await assertNoErrorsInCode('''
+class C {}
+extension E on C {
+  set s(int x) {}
+}
+f(C c) {
+  E(c).s = 3;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
new file mode 100644
index 0000000..76dbce0
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/extra_positional_arguments_test.dart
@@ -0,0 +1,64 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ExtraPositionalArgumentsCouldBeNamedTest);
+    defineReflectiveTests(ExtraPositionalArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class ExtraPositionalArgumentsCouldBeNamedTest extends DriverResolutionTest {
+  test_functionExpression() async {
+    await assertErrorsInCode('''
+main() {
+  (int x, {int y}) {} (0, 1);
+}
+''', [
+      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 31, 6),
+    ]);
+  }
+
+  test_topLevelFunction() async {
+    await assertErrorsInCode('''
+f({x, y}) {}
+main() {
+  f(0, 1, '2');
+}
+''', [
+      error(
+          StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS_COULD_BE_NAMED, 25, 11),
+    ]);
+  }
+}
+
+@reflectiveTest
+class ExtraPositionalArgumentsTest extends DriverResolutionTest {
+  test_extraPositionalArguments() async {
+    await assertErrorsInCode('''
+f() {}
+main() {
+  f(0, 1, '2');
+}
+''', [
+      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS, 19, 11),
+    ]);
+  }
+
+  test_extraPositionalArguments_functionExpression() async {
+    await assertErrorsInCode('''
+main() {
+  (int x) {} (0, 1);
+}
+''', [
+      error(StaticWarningCode.EXTRA_POSITIONAL_ARGUMENTS, 22, 6),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/field_initialized_in_initializer_and_declaration_test.dart b/pkg/analyzer/test/src/diagnostics/field_initialized_in_initializer_and_declaration_test.dart
new file mode 100644
index 0000000..46395a1
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/field_initialized_in_initializer_and_declaration_test.dart
@@ -0,0 +1,30 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FieldInitializedInInitializerAndDeclarationTest);
+  });
+}
+
+@reflectiveTest
+class FieldInitializedInInitializerAndDeclarationTest
+    extends DriverResolutionTest {
+  test_both() async {
+    await assertErrorsInCode('''
+class A {
+  final int x = 0;
+  A() : x = 1;
+}
+''', [
+      error(StaticWarningCode.FIELD_INITIALIZED_IN_INITIALIZER_AND_DECLARATION,
+          37, 1),
+    ]);
+  }
+}
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
new file mode 100644
index 0000000..55e94cb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/field_initializer_not_assignable_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FieldInitializerNotAssignableTest);
+  });
+}
+
+@reflectiveTest
+class FieldInitializerNotAssignableTest extends DriverResolutionTest {
+  test_unrelated() async {
+    await assertErrorsInCode('''
+class A {
+  int x;
+  A() : x = '';
+}
+''', [
+      error(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, 31, 2),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart b/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart
new file mode 100644
index 0000000..65b451e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/field_initializing_formal_not_assignable_test.dart
@@ -0,0 +1,29 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FieldInitializingFormalNotAssignableTest);
+  });
+}
+
+@reflectiveTest
+class FieldInitializingFormalNotAssignableTest extends DriverResolutionTest {
+  test_unrelated() async {
+    await assertErrorsInCode('''
+class A {
+  int x;
+  A(String this.x) {}
+}
+''', [
+      error(StrongModeCode.INVALID_PARAMETER_DECLARATION, 23, 13),
+      error(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 23, 13),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/final_initialized_in_delcaration_and_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/final_initialized_in_delcaration_and_constructor_test.dart
new file mode 100644
index 0000000..0779878
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/final_initialized_in_delcaration_and_constructor_test.dart
@@ -0,0 +1,30 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FinalInitializedInDeclarationAndConstructorTest);
+  });
+}
+
+@reflectiveTest
+class FinalInitializedInDeclarationAndConstructorTest
+    extends DriverResolutionTest {
+  test_initializingFormal() async {
+    await assertErrorsInCode('''
+class A {
+  final x = 0;
+  A(this.x) {}
+}
+''', [
+      error(StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCTOR,
+          34, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_constructor_test.dart
new file mode 100644
index 0000000..d624ad9
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_constructor_test.dart
@@ -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 file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(FinalNotInitializedConstructorTest);
+  });
+}
+
+@reflectiveTest
+class FinalNotInitializedConstructorTest extends DriverResolutionTest {
+  test_1() async {
+    await assertErrorsInCode('''
+class A {
+  final int x;
+  A() {}
+}
+''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1, 27, 1),
+    ]);
+  }
+
+  test_2() async {
+    await assertErrorsInCode('''
+class A {
+  final int a;
+  final int b;
+  A() {}
+}
+''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2, 42, 1),
+    ]);
+  }
+
+  test_3Plus() async {
+    await assertErrorsInCode('''
+class A {
+  final int a;
+  final int b;
+  final int c;
+  A() {}
+}
+''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS, 57, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
index 28b987a..5be052f 100644
--- a/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/final_not_initialized_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-//import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -11,13 +12,49 @@
 
 main() {
   defineReflectiveSuite(() {
-//    defineReflectiveTests(FinalNotInitializedTest);
+    defineReflectiveTests(FinalNotInitializedTest);
     defineReflectiveTests(FinalNotInitializedWithNnbdTest);
   });
 }
 
 @reflectiveTest
-class FinalNotInitializedTest extends DriverResolutionTest {}
+class FinalNotInitializedTest extends DriverResolutionTest {
+  test_instanceField_final() async {
+    await assertErrorsInCode('''
+class A {
+  final F;
+}''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 18, 1),
+    ]);
+  }
+
+  test_instanceField_final_static() async {
+    await assertErrorsInCode('''
+class A {
+  static final F;
+}''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 25, 1),
+    ]);
+  }
+
+  test_library_final() async {
+    await assertErrorsInCode('''
+final F;
+''', [
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 6, 1),
+    ]);
+  }
+
+  test_local_final() async {
+    await assertErrorsInCode('''
+f() {
+  final int x;
+}''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 18, 1),
+      error(StaticWarningCode.FINAL_NOT_INITIALIZED, 18, 1),
+    ]);
+  }
+}
 
 @reflectiveTest
 class FinalNotInitializedWithNnbdTest extends DriverResolutionTest {
@@ -26,24 +63,24 @@
     ..contextFeatures = new FeatureSet.forTesting(
         sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
 
-  test_field_noConstructor_initializer() {
-    assertNoErrorsInCode('''
+  test_field_noConstructor_initializer() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f = 1;
 }
 ''');
   }
 
-  test_field_noConstructor_noInitializer() {
-    assertNoErrorsInCode('''
+  test_field_noConstructor_noInitializer() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f;
 }
 ''');
   }
 
-  test_field_unnamedConstructor_constructorInitializer() {
-    assertNoErrorsInCode('''
+  test_field_unnamedConstructor_constructorInitializer() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f;
   C() : f = 2;
@@ -51,8 +88,8 @@
 ''');
   }
 
-  test_field_unnamedConstructor_fieldFormalParameter() {
-    assertNoErrorsInCode('''
+  test_field_unnamedConstructor_fieldFormalParameter() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f;
   C(this.f);
@@ -60,8 +97,8 @@
 ''');
   }
 
-  test_field_unnamedConstructor_initializer() {
-    assertNoErrorsInCode('''
+  test_field_unnamedConstructor_initializer() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f = 1;
   C();
@@ -69,8 +106,8 @@
 ''');
   }
 
-  test_field_unnamedConstructor_noInitializer() {
-    assertNoErrorsInCode('''
+  test_field_unnamedConstructor_noInitializer() async {
+    await assertNoErrorsInCode('''
 class C {
   late final f;
   C();
@@ -78,16 +115,16 @@
 ''');
   }
 
-  test_localVariable_initializer() {
-    assertNoErrorsInCode('''
+  test_localVariable_initializer() async {
+    await assertNoErrorsInCode('''
 f() {
   late final x = 1;
 }
 ''');
   }
 
-  test_localVariable_noInitializer() {
-    assertNoErrorsInCode('''
+  test_localVariable_noInitializer() async {
+    await assertNoErrorsInCode('''
 f() {
   late final x;
 }
diff --git a/pkg/analyzer/test/src/diagnostics/import_duplicated_library_named_test.dart b/pkg/analyzer/test/src/diagnostics/import_duplicated_library_named_test.dart
new file mode 100644
index 0000000..af61f3b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/import_duplicated_library_named_test.dart
@@ -0,0 +1,35 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportDuplicatedLibraryNamedTest);
+  });
+}
+
+@reflectiveTest
+class ImportDuplicatedLibraryNamedTest extends DriverResolutionTest {
+  test_duplicate() async {
+    newFile("/test/lib/lib1.dart", content: '''
+library lib;
+class A {}
+''');
+    newFile("/test/lib/lib2.dart", content: '''
+library lib;
+class B {}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+class C implements A, B {}
+''', [
+      error(StaticWarningCode.IMPORT_DUPLICATED_LIBRARY_NAMED, 20, 19),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/import_of_non_library_test.dart b/pkg/analyzer/test/src/diagnostics/import_of_non_library_test.dart
new file mode 100644
index 0000000..d32baeb
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/import_of_non_library_test.dart
@@ -0,0 +1,31 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ImportOfNonLibraryTest);
+  });
+}
+
+@reflectiveTest
+class ImportOfNonLibraryTest extends DriverResolutionTest {
+  test_part() async {
+    newFile("/test/lib/lib1.dart", content: '''
+part of lib;
+class A {}
+''');
+    await assertErrorsInCode('''
+library lib;
+import 'lib1.dart' deferred as p;
+var a = new p.A();
+''', [
+      error(StaticWarningCode.IMPORT_OF_NON_LIBRARY, 20, 11),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_extension_argument_count_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_extension_argument_count_test.dart
new file mode 100644
index 0000000..7556e86
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_extension_argument_count_test.dart
@@ -0,0 +1,63 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidExtensionArgumentCountTest);
+  });
+}
+
+@reflectiveTest
+class InvalidExtensionArgumentCountTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_many() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void m() {}
+}
+f() {
+  E('a', 'b', 'c').m();
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_EXTENSION_ARGUMENT_COUNT, 49, 15),
+    ]);
+    assertElementTypeDynamic(findNode.extensionOverride('E(').extendedType);
+  }
+
+  test_one() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  void m() {}
+}
+f() {
+  E('a').m();
+}
+''');
+  }
+
+  test_zero() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void m() {}
+}
+f() {
+  E().m();
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_EXTENSION_ARGUMENT_COUNT, 49, 2),
+    ]);
+    assertElementTypeDynamic(findNode.extensionOverride('E(').extendedType);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
new file mode 100644
index 0000000..ab75f79
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_override_test.dart
@@ -0,0 +1,448 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidOverrideTest);
+  });
+}
+
+@reflectiveTest
+class InvalidOverrideTest extends DriverResolutionTest {
+  test_getter_returnType() async {
+    await assertErrorsInCode('''
+class A {
+  int get g { return 0; }
+}
+class B extends A {
+  String get g { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 60, 28),
+    ]);
+  }
+
+  test_getter_returnType_implicit() async {
+    await assertErrorsInCode('''
+class A {
+  String f;
+}
+class B extends A {
+  int f;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 46, 5),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 46, 5),
+    ]);
+  }
+
+  test_getter_returnType_twoInterfaces() async {
+    // test from language/override_inheritance_field_test_11.dart
+    await assertErrorsInCode('''
+abstract class I {
+  int get getter => null;
+}
+abstract class J {
+  num get getter => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  String get getter => null;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 152, 26),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 152, 26),
+    ]);
+  }
+
+  test_getter_returnType_twoInterfaces_conflicting() async {
+    await assertErrorsInCode('''
+abstract class I<U> {
+  U get g => null;
+}
+abstract class J<V> {
+  V get g => null;
+}
+class B implements I<int>, J<String> {
+  double get g => null;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 127, 21),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 127, 21),
+    ]);
+  }
+
+  test_method_named_fewerNamedParameters() async {
+    await assertErrorsInCode('''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a}) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 9),
+    ]);
+  }
+
+  test_method_named_missingNamedParameter() async {
+    await assertErrorsInCode('''
+class A {
+  m({a, b}) {}
+}
+class B extends A {
+  m({a, c}) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 12),
+    ]);
+  }
+
+  test_method_namedParamType() async {
+    await assertErrorsInCode('''
+class A {
+  m({int a}) {}
+}
+class B implements A {
+  m({String a}) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 53, 16),
+    ]);
+  }
+
+  test_method_normalParamType_interface() async {
+    await assertErrorsInCode('''
+class A {
+  m(int a) {}
+}
+class B implements A {
+  m(String a) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 51, 14),
+    ]);
+  }
+
+  test_method_normalParamType_superclass() async {
+    await assertErrorsInCode('''
+class A {
+  m(int a) {}
+}
+class B extends A {
+  m(String a) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 48, 14),
+    ]);
+  }
+
+  test_method_normalParamType_superclass_interface() async {
+    await assertErrorsInCode('''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B extends I<int> implements J<String> {
+  m(double d) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 132, 14),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 132, 14),
+    ]);
+  }
+
+  test_method_normalParamType_twoInterfaces() async {
+    await assertErrorsInCode('''
+abstract class I {
+  m(int n);
+}
+abstract class J {
+  m(num n);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m(String n) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 14),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 124, 14),
+    ]);
+  }
+
+  test_method_normalParamType_twoInterfaces_conflicting() async {
+    // language/override_inheritance_generic_test/08
+    await assertErrorsInCode('''
+abstract class I<U> {
+  m(U u) => null;
+}
+abstract class J<V> {
+  m(V v) => null;
+}
+class B implements I<int>, J<String> {
+  m(double d) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 125, 14),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 125, 14),
+    ]);
+  }
+
+  test_method_optionalParamType() async {
+    await assertErrorsInCode('''
+class A {
+  m([int a]) {}
+}
+class B implements A {
+  m([String a]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 53, 16),
+    ]);
+  }
+
+  test_method_optionalParamType_twoInterfaces() async {
+    await assertErrorsInCode('''
+abstract class I {
+  m([int n]);
+}
+abstract class J {
+  m([num n]);
+}
+abstract class A implements I, J {}
+class B extends A {
+  m([String n]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 128, 16),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 128, 16),
+    ]);
+  }
+
+  test_method_positional_optional() async {
+    await assertErrorsInCode('''
+class A {
+  m([a, b]) {}
+}
+class B extends A {
+  m([a]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 49, 9),
+    ]);
+  }
+
+  test_method_positional_optionalAndRequired() async {
+    await assertErrorsInCode('''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, b, [c]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 55, 15),
+    ]);
+  }
+
+  test_method_positional_optionalAndRequired2() async {
+    await assertErrorsInCode('''
+class A {
+  m(a, b, [c, d]) {}
+}
+class B extends A {
+  m(a, [c, d]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 55, 15),
+    ]);
+  }
+
+  test_method_required() async {
+    await assertErrorsInCode('''
+class A {
+  m(a) {}
+}
+class B extends A {
+  m(a, b) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 44, 10),
+    ]);
+  }
+
+  test_method_returnType_interface() async {
+    await assertErrorsInCode('''
+class A {
+  int m() { return 0; }
+}
+class B implements A {
+  String m() { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 61, 26),
+    ]);
+  }
+
+  test_method_returnType_interface_grandparent() async {
+    await assertErrorsInCode('''
+abstract class A {
+  int m();
+}
+abstract class B implements A {
+}
+class C implements B {
+  String m() { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 91, 26),
+    ]);
+  }
+
+  test_method_returnType_mixin() async {
+    await assertErrorsInCode('''
+class A {
+  int m() { return 0; }
+}
+class B extends Object with A {
+  String m() { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 70, 26),
+    ]);
+  }
+
+  test_method_returnType_superclass() async {
+    await assertErrorsInCode('''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  String m() { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 58, 26),
+    ]);
+  }
+
+  test_method_returnType_superclass_grandparent() async {
+    await assertErrorsInCode('''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+}
+class C extends B {
+  String m() { return 'a'; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 80, 26),
+    ]);
+  }
+
+  test_method_returnType_twoInterfaces() async {
+    await assertErrorsInCode('''
+abstract class I {
+  int m();
+}
+abstract class J {
+  num m();
+}
+abstract class A implements I, J {}
+class B extends A {
+  String m() => '';
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 122, 17),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 122, 17),
+    ]);
+  }
+
+  test_method_returnType_void() async {
+    await assertErrorsInCode('''
+class A {
+  int m() { return 0; }
+}
+class B extends A {
+  void m() {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 58, 11),
+    ]);
+  }
+
+  test_setter_normalParamType() async {
+    await assertErrorsInCode('''
+class A {
+  void set s(int v) {}
+}
+class B extends A {
+  void set s(String v) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 57, 23),
+    ]);
+  }
+
+  test_setter_normalParamType_superclass_interface() async {
+    await assertErrorsInCode('''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A extends I implements J {}
+class B extends A {
+  set setter14(String _) => null;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 169, 31),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 169, 31),
+    ]);
+  }
+
+  test_setter_normalParamType_twoInterfaces() async {
+    // test from language/override_inheritance_field_test_34.dart
+    await assertErrorsInCode('''
+abstract class I {
+  set setter14(int _) => null;
+}
+abstract class J {
+  set setter14(num _) => null;
+}
+abstract class A implements I, J {}
+class B extends A {
+  set setter14(String _) => null;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 31),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 162, 31),
+    ]);
+  }
+
+  test_setter_normalParamType_twoInterfaces_conflicting() async {
+    await assertErrorsInCode('''
+abstract class I<U> {
+  set s(U u) {}
+}
+abstract class J<V> {
+  set s(V v) {}
+}
+class B implements I<int>, J<String> {
+  set s(double d) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 121, 18),
+      error(CompileTimeErrorCode.INVALID_OVERRIDE, 121, 18),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_reference_to_this_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_this_test.dart
new file mode 100644
index 0000000..9b4a533
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_reference_to_this_test.dart
@@ -0,0 +1,141 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidReferenceToThisTest);
+    defineReflectiveTests(InvalidReferenceToThisTest_NNBD);
+  });
+}
+
+@reflectiveTest
+class InvalidReferenceToThisTest extends DriverResolutionTest {
+  test_factoryConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  factory A() { return this; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 33, 4),
+    ]);
+  }
+
+  test_instanceVariableInitializer_inConstructor() async {
+    await assertErrorsInCode(r'''
+class A {
+  var f;
+  A() : f = this;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 31, 4),
+    ]);
+  }
+
+  test_instanceVariableInitializer_inDeclaration() async {
+    await assertErrorsInCode(r'''
+class A {
+  var f = this;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 20, 4),
+    ]);
+  }
+
+  test_staticMethod() async {
+    await assertErrorsInCode(r'''
+class A {
+  static m() { return this; }
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 32, 4),
+    ]);
+  }
+
+  test_staticVariableInitializer() async {
+    await assertErrorsInCode(r'''
+class A {
+  static A f = this;
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 25, 4),
+    ]);
+  }
+
+  test_superInitializer() async {
+    await assertErrorsInCode(r'''
+class A {
+  A(var x) {}
+}
+class B extends A {
+  B() : super(this);
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 60, 4),
+    ]);
+  }
+
+  test_topLevelFunction() async {
+    await assertErrorsInCode('''
+f() { return this; }
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 13, 4),
+    ]);
+  }
+
+  test_variableInitializer() async {
+    await assertErrorsInCode('''
+int x = this;
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 8, 4),
+    ]);
+  }
+
+  test_variableInitializer_inMethod_notLate() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  f() {
+    var r = this;
+  }
+}
+''');
+  }
+}
+
+@reflectiveTest
+class InvalidReferenceToThisTest_NNBD extends InvalidReferenceToThisTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_instanceVariableInitializer_inDeclaration_late() async {
+    await assertNoErrorsInCode(r'''
+class A {
+  late f = this;
+}
+''');
+  }
+
+  test_mixinVariableInitializer_inDeclaration_late() async {
+    await assertNoErrorsInCode(r'''
+mixin A {
+  late f = this;
+}
+''');
+  }
+
+  test_variableInitializer_late() async {
+    await assertErrorsInCode('''
+late x = this;
+''', [
+      error(CompileTimeErrorCode.INVALID_REFERENCE_TO_THIS, 9, 4),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_in_extension_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_in_extension_test.dart
new file mode 100644
index 0000000..c147375
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_covariant_in_extension_test.dart
@@ -0,0 +1,54 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfCovariantInExtensionTest);
+  });
+}
+
+@reflectiveTest
+class InvalidUseOfCovariantInExtensionTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_optional_named() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void foo({covariant int a}) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION, 36, 9),
+    ]);
+  }
+
+  test_optional_positional() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void foo([covariant int a]) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION, 36, 9),
+    ]);
+  }
+
+  test_required_positional() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void foo(covariant int a) {}
+}
+''', [
+      error(CompileTimeErrorCode.INVALID_USE_OF_COVARIANT_IN_EXTENSION, 35, 9),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_never_value_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_never_value_test.dart
new file mode 100644
index 0000000..794d498
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_never_value_test.dart
@@ -0,0 +1,273 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfNeverTest);
+    defineReflectiveTests(InvalidUseOfNeverTest_Legacy);
+  });
+}
+
+@reflectiveTest
+class InvalidUseOfNeverTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_local_invoked() async {
+    await assertErrorsInCode(r'''
+void main(Never x) {
+  x();
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 23, 1),
+    ]);
+  }
+
+  @failingTest
+  test_local_neverQuestion_getter_hashCode() async {
+    // reports undefined getter
+    await assertNoErrorsInCode(r'''
+void main(Never? neverQ) {
+  neverQ.hashCode;
+}
+''');
+  }
+
+  @failingTest
+  test_local_neverQuestion_getter_toString() async {
+    // reports undefined getter
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '').toString;
+}
+''');
+  }
+
+  test_local_neverQuestion_methodCall_toString() async {
+    await assertNoErrorsInCode(r'''
+void main(Never? neverQ) {
+  neverQ.toString();
+}
+''');
+  }
+
+  @failingTest
+  test_local_neverQuestion_operator_equals() async {
+    // We report this as an error even though CFE does not.
+    await assertNoErrorsInCode(r'''
+void main(Never? neverQ) {
+  neverQ == 0;
+}
+''');
+  }
+
+  @failingTest
+  test_local_operator_plusPlus_prefix() async {
+    // Reports 'undefined operator'
+    await assertErrorsInCode(r'''
+void main(Never x) {
+  ++x;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  @failingTest
+  test_local_operator_plusPlus_suffix() async {
+    // Reports 'undefined operator'
+    await assertErrorsInCode(r'''
+void main(Never x) {
+  x++;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  test_member_invoked() async {
+    await assertErrorsInCode(r'''
+class C {
+  Never get x => throw '';
+}
+
+void main() {
+  C c = C();
+  c.x();
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 71, 1),
+    ]);
+  }
+
+  @failingTest
+  test_throw_getter_foo() async {
+    // Reports undefined getter.
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '').foo;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  @failingTest
+  test_throw_getter_hashCode() async {
+    // Reports undefined getter.
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '').hashCode;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  @failingTest
+  test_throw_getter_toString() async {
+    // Reports undefined getter (it seems to get confused by the tear-off).
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '').toString;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  test_throw_invoked() async {
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '')();
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 16, 10),
+    ]);
+  }
+
+  test_throw_methodCall_foo() async {
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '').foo();
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 16, 10),
+    ]);
+  }
+
+  test_throw_methodCall_toString() async {
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '').toString();
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 16, 10),
+    ]);
+  }
+
+  @failingTest
+  test_throw_operator_equals() async {
+    // We report this as an error even though CFE does not.
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '') == 0;
+}
+''');
+  }
+
+  @failingTest
+  test_throw_operator_plus_lhs() async {
+    // Currently reports "no such operator"
+    await assertErrorsInCode(r'''
+void main() {
+  (throw '') + 0;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NEVER_VALUE, 70, 1),
+    ]);
+  }
+
+  test_throw_operator_plus_rhs() async {
+    await assertNoErrorsInCode(r'''
+void main() {
+  0 + (throw '');
+}
+''');
+  }
+
+  test_throw_operator_ternary_falseBranch() async {
+    await assertNoErrorsInCode(r'''
+void f(bool c) {
+  c ? 0 : (throw '');
+}
+''');
+  }
+
+  test_throw_operator_ternary_trueBranch() async {
+    await assertNoErrorsInCode(r'''
+void f(bool c) {
+  c ? (throw '') : 0;
+}
+''');
+  }
+
+  test_throw_param() async {
+    await assertNoErrorsInCode(r'''
+void f(x) {
+  f(throw '');
+}
+''');
+  }
+}
+
+/// Construct Never* by using throw expressions and assert no errors.
+@reflectiveTest
+class InvalidUseOfNeverTest_Legacy extends DriverResolutionTest {
+  @failingTest
+  test_throw_getter_hashCode() async {
+    // Reports undefined getter.
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '').hashCode;
+}
+''');
+  }
+
+  @failingTest
+  test_throw_getter_toString() async {
+    // Reports undefined getter (it seems to get confused by the tear-off).
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '').toString;
+}
+''');
+  }
+
+  test_throw_methodCall_toString() async {
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '').toString();
+}
+''');
+  }
+
+  @failingTest
+  test_throw_operator_equals() async {
+    // We report this as an error even though CFE does not.
+    await assertNoErrorsInCode(r'''
+void main() {
+  (throw '') == 0;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart b/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart
new file mode 100644
index 0000000..6bbcb48
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/invalid_use_of_null_value_test.dart
@@ -0,0 +1,127 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(InvalidUseOfNullValueTest);
+  });
+}
+
+@reflectiveTest
+class InvalidUseOfNullValueTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_as() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x as int; // ignore: unnecessary_cast
+}
+''');
+  }
+
+  test_await() async {
+    await assertNoErrorsInCode(r'''
+m() async {
+  Null x;
+  await x;
+}
+''');
+  }
+
+  test_cascade() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x..toString;
+}
+''', [
+      error(StaticWarningCode.INVALID_USE_OF_NULL_VALUE, 18, 1),
+    ]);
+  }
+
+  test_eq() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x == null;
+}
+''');
+  }
+
+  test_forLoop() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  for (var y in x) {}
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 27, 1),
+      error(StaticWarningCode.INVALID_USE_OF_NULL_VALUE, 32, 1),
+    ]);
+  }
+
+  test_is() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x is int;
+}
+''');
+  }
+
+  test_member() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x.runtimeType;
+}
+''');
+  }
+
+  test_method() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x.toString();
+}
+''');
+  }
+
+  test_notEq() async {
+    await assertNoErrorsInCode(r'''
+m() {
+  Null x;
+  x != null;
+}
+''');
+  }
+
+  test_ternary_lhs() async {
+    await assertNoErrorsInCode(r'''
+m(bool cond) {
+  Null x;
+  cond ? x : 1;
+}
+''');
+  }
+
+  test_ternary_rhs() async {
+    await assertNoErrorsInCode(r'''
+m(bool cond) {
+  Null x;
+  cond ? 0 : x;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/is_double_test.dart b/pkg/analyzer/test/src/diagnostics/is_double_test.dart
new file mode 100644
index 0000000..5192cab
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/is_double_test.dart
@@ -0,0 +1,30 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IsDoubleTest);
+  });
+}
+
+@reflectiveTest
+class IsDoubleTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..dart2jsHint = true;
+
+  test_use() async {
+    await assertErrorsInCode('''
+var v = 1 is double;
+''', [
+      error(HintCode.IS_DOUBLE, 8, 11),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/is_int_test.dart b/pkg/analyzer/test/src/diagnostics/is_int_test.dart
new file mode 100644
index 0000000..c9d5083
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/is_int_test.dart
@@ -0,0 +1,31 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IsIntTest);
+  });
+}
+
+@reflectiveTest
+class IsIntTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..dart2jsHint = true;
+
+  @failingTest
+  test_use() async {
+    await assertErrorsInCode('''
+var v = 1 is int;
+''', [
+      error(HintCode.IS_INT, 8, 8),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/is_not_double_test.dart b/pkg/analyzer/test/src/diagnostics/is_not_double_test.dart
new file mode 100644
index 0000000..0a100593
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/is_not_double_test.dart
@@ -0,0 +1,30 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IsNotDoubleTest);
+  });
+}
+
+@reflectiveTest
+class IsNotDoubleTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..dart2jsHint = true;
+
+  test_use() async {
+    await assertErrorsInCode('''
+var v = 1 is! double;
+''', [
+      error(HintCode.IS_NOT_DOUBLE, 8, 12),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/is_not_int_test.dart b/pkg/analyzer/test/src/diagnostics/is_not_int_test.dart
new file mode 100644
index 0000000..31f6d6f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/is_not_int_test.dart
@@ -0,0 +1,31 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(IsNotIntTest);
+  });
+}
+
+@reflectiveTest
+class IsNotIntTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..dart2jsHint = true;
+
+  @failingTest
+  test_use() async {
+    await assertErrorsInCode('''
+var v = 1 is! int;
+''', [
+      error(HintCode.IS_NOT_INT, 8, 9),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/mismatched_getter_and_setter_types_test.dart b/pkg/analyzer/test/src/diagnostics/mismatched_getter_and_setter_types_test.dart
new file mode 100644
index 0000000..ec3b2bc
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mismatched_getter_and_setter_types_test.dart
@@ -0,0 +1,25 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MismatchedGetterAndSetterTypesTest);
+  });
+}
+
+@reflectiveTest
+class MismatchedGetterAndSetterTypesTest extends DriverResolutionTest {
+  test_topLevel() async {
+    await assertErrorsInCode('''
+int get g { return 0; }
+set g(String v) {}''', [
+      error(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, 0, 23),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_enum_value_in_switch_test.dart b/pkg/analyzer/test/src/diagnostics/missing_enum_value_in_switch_test.dart
new file mode 100644
index 0000000..6ad7d34
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/missing_enum_value_in_switch_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.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingEnumConstantInSwitchTest);
+  });
+}
+
+@reflectiveTest
+class MissingEnumConstantInSwitchTest extends DriverResolutionTest {
+  test_first() async {
+    await assertErrorsInCode('''
+enum E { ONE, TWO, THREE }
+bool odd(E e) {
+  switch (e) {
+    case E.TWO:
+    case E.THREE: return true;
+  }
+  return false;
+}''', [
+      error(StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, 45, 10),
+    ]);
+  }
+
+  test_last() async {
+    await assertErrorsInCode('''
+enum E { ONE, TWO, THREE }
+bool odd(E e) {
+  switch (e) {
+    case E.ONE:
+    case E.TWO: return true;
+  }
+  return false;
+}''', [
+      error(StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, 45, 10),
+    ]);
+  }
+
+  test_middle() async {
+    await assertErrorsInCode('''
+enum E { ONE, TWO, THREE }
+bool odd(E e) {
+  switch (e) {
+    case E.ONE:
+    case E.THREE: return true;
+  }
+  return false;
+}''', [
+      error(StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, 45, 10),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
new file mode 100644
index 0000000..561c11b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/missing_js_lib_annotation_test.dart
@@ -0,0 +1,104 @@
+// 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/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/dart/error/syntactic_errors.dart';
+import 'package:analyzer/src/test_utilities/package_mixin.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MissingJSLibAnnotationTest);
+  });
+}
+
+@reflectiveTest
+class MissingJSLibAnnotationTest extends DriverResolutionTest
+    with PackageMixin {
+  test_class() async {
+    addJsPackage();
+    await assertErrorsInCode('''
+library foo;
+
+import 'package:js/js.dart';
+
+@JS()
+class A { }
+''', [
+      error(HintCode.MISSING_JS_LIB_ANNOTATION, 44, 5),
+    ]);
+  }
+
+  test_externalField() async {
+    // https://github.com/dart-lang/sdk/issues/26987
+    addJsPackage();
+    await assertErrorsInCode('''
+import 'package:js/js.dart';
+
+@JS()
+external dynamic exports;
+''', [
+      error(HintCode.MISSING_JS_LIB_ANNOTATION, 30, 5),
+      error(ParserErrorCode.EXTERNAL_FIELD, 36, 8),
+    ]);
+  }
+
+  test_function() async {
+    addJsPackage();
+    await assertErrorsInCode('''
+library foo;
+
+import 'package:js/js.dart';
+
+@JS('acxZIndex')
+set _currentZIndex(int value) { }
+''', [
+      error(HintCode.MISSING_JS_LIB_ANNOTATION, 44, 16),
+      error(HintCode.UNUSED_ELEMENT, 65, 14),
+    ]);
+  }
+
+  test_method() async {
+    addJsPackage();
+    await assertErrorsInCode('''
+library foo;
+
+import 'package:js/js.dart';
+
+class A {
+  @JS()
+  void a() { }
+}
+''', [
+      error(HintCode.MISSING_JS_LIB_ANNOTATION, 56, 5),
+    ]);
+  }
+
+  test_notMissing() async {
+    addJsPackage();
+    await assertNoErrorsInCode('''
+@JS()
+library foo;
+
+import 'package:js/js.dart';
+
+@JS()
+class A { }
+''');
+  }
+
+  test_variable() async {
+    addJsPackage();
+    await assertErrorsInCode('''
+import 'package:js/js.dart';
+
+@JS()
+dynamic variable;
+''', [
+      error(HintCode.MISSING_JS_LIB_ANNOTATION, 30, 5),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
index fa860a6..bbc42ec 100644
--- a/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/missing_required_param_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/test_utilities/package_mixin.dart';
@@ -166,7 +167,8 @@
 
   test_typedef_functionParam() async {
     addMetaPackage();
-    await assertErrorsInCode(r'''
+    try {
+      await assertErrorsInCode(r'''
 import 'package:meta/meta.dart';
 
 String test(C c) => c.m()();
@@ -177,8 +179,17 @@
   F m() => ({@required String x}) => null;
 }
 ''', [
-      error(HintCode.MISSING_REQUIRED_PARAM, 54, 7),
-    ]);
+        error(HintCode.MISSING_REQUIRED_PARAM, 54, 7),
+      ]);
+    } catch (_) {
+      // MISSING_REQUIRED_PARAM cannot be reported here with summary2, because
+      // the return type of `C.m` is a structural FunctionType, which does
+      // not know its elements, and does not know that there was a parameter
+      // marked `@required`. There is exactly one such typedef in Flutter.
+      if (!AnalysisDriver.useSummary2) {
+        rethrow;
+      }
+    }
   }
 
   /// Resolve the test file at [path].
diff --git a/pkg/analyzer/test/src/diagnostics/mixed_return_types_test.dart b/pkg/analyzer/test/src/diagnostics/mixed_return_types_test.dart
new file mode 100644
index 0000000..8cbb93f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/mixed_return_types_test.dart
@@ -0,0 +1,47 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(MixedReturnTypesTest);
+  });
+}
+
+@reflectiveTest
+class MixedReturnTypesTest extends DriverResolutionTest {
+  test_method() async {
+    await assertErrorsInCode('''
+class C {
+  m(int x) {
+    if (x < 0) {
+      return;
+    }
+    return 0;
+  }
+}
+''', [
+      error(StaticWarningCode.MIXED_RETURN_TYPES, 46, 6),
+      error(StaticWarningCode.MIXED_RETURN_TYPES, 64, 6),
+    ]);
+  }
+
+  test_topLevelFunction() async {
+    await assertErrorsInCode('''
+f(int x) {
+  if (x < 0) {
+    return;
+  }
+  return 0;
+}
+''', [
+      error(StaticWarningCode.MIXED_RETURN_TYPES, 30, 6),
+      error(StaticWarningCode.MIXED_RETURN_TYPES, 44, 6),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_abstract_class_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_abstract_class_test.dart
new file mode 100644
index 0000000..4350613
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/new_with_abstract_class_test.dart
@@ -0,0 +1,41 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NewWithAbstractClassTest);
+  });
+}
+
+@reflectiveTest
+class NewWithAbstractClassTest extends DriverResolutionTest {
+  test_generic() async {
+    await assertErrorsInCode('''
+abstract class A<E> {}
+void f() {
+  new A<int>();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, 40, 6),
+    ]);
+
+    assertType(findNode.instanceCreation('new A<int>'), 'A<int>');
+  }
+
+  test_nonGeneric() async {
+    await assertErrorsInCode('''
+abstract class A {}
+void f() {
+  new A();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_ABSTRACT_CLASS, 37, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_invalid_type_parameters_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_invalid_type_parameters_test.dart
new file mode 100644
index 0000000..d3e81cf
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/new_with_invalid_type_parameters_test.dart
@@ -0,0 +1,50 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NewWithInvalidTypeParametersTest);
+  });
+}
+
+@reflectiveTest
+class NewWithInvalidTypeParametersTest extends DriverResolutionTest {
+  test_nonGeneric() async {
+    await assertErrorsInCode('''
+class A {}
+f() { return new A<A>(); }
+''', [
+      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 28, 4),
+    ]);
+  }
+
+  test_tooFew() async {
+    await assertErrorsInCode('''
+class A {}
+class C<K, V> {}
+f(p) {
+  return new C<A>();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 48, 4),
+    ]);
+  }
+
+  test_tooMany() async {
+    await assertErrorsInCode('''
+class A {}
+class C<E> {}
+f(p) {
+  return new C<A, A>();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_INVALID_TYPE_PARAMETERS, 45, 7),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart b/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart
new file mode 100644
index 0000000..fa26b8c
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/new_with_non_type_test.dart
@@ -0,0 +1,41 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NewWithNonTypeTest);
+  });
+}
+
+@reflectiveTest
+class NewWithNonTypeTest extends DriverResolutionTest {
+  test_imported() async {
+    newFile("/test/lib/lib.dart", content: "class B {}");
+    await assertErrorsInCode('''
+import 'lib.dart' as lib;
+void f() {
+  new lib.A();
+}
+lib.B b;
+''', [
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 47, 1),
+    ]);
+  }
+
+  test_local() async {
+    await assertErrorsInCode('''
+var A = 0;
+void f() {
+  new A();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_NON_TYPE, 28, 1),
+    ]);
+  }
+}
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
new file mode 100644
index 0000000..bb10cff
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/new_with_undefined_constructor_test.dart
@@ -0,0 +1,43 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NewWithUndefinedConstructorTest);
+  });
+}
+
+@reflectiveTest
+class NewWithUndefinedConstructorTest extends DriverResolutionTest {
+  test_default() async {
+    await assertErrorsInCode('''
+class A {
+  A.name() {}
+}
+f() {
+  new A();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 38, 1),
+    ]);
+  }
+
+  test_named() async {
+    await assertErrorsInCode('''
+class A {
+  A() {}
+}
+f() {
+  new A.name();
+}
+''', [
+      error(StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, 35, 4),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
new file mode 100644
index 0000000..6565089
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_abstract_class_inherits_abstract_member_test.dart
@@ -0,0 +1,394 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonAbstractClassInheritsAbstractMemberTest);
+  });
+}
+
+@reflectiveTest
+class NonAbstractClassInheritsAbstractMemberTest extends DriverResolutionTest {
+  test_fivePlus() async {
+    await assertErrorsInCode('''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+  q();
+}
+class C extends A {
+}
+''', [
+      error(
+          StaticWarningCode
+              .NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FIVE_PLUS,
+          62,
+          1),
+    ]);
+  }
+
+  test_four() async {
+    await assertErrorsInCode('''
+abstract class A {
+  m();
+  n();
+  o();
+  p();
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_FOUR,
+          55, 1),
+    ]);
+  }
+
+  test_one_classTypeAlias_interface() async {
+    // 15979
+    await assertErrorsInCode('''
+abstract class M {}
+abstract class A {}
+abstract class I {
+  m();
+}
+class B = A with M implements I;
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          74, 1),
+    ]);
+  }
+
+  test_one_classTypeAlias_mixin() async {
+    // 15979
+    await assertErrorsInCode('''
+abstract class M {
+  m();
+}
+abstract class A {}
+class B = A with M;
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          54, 1),
+    ]);
+  }
+
+  test_one_classTypeAlias_superclass() async {
+    // 15979
+    await assertErrorsInCode('''
+class M {}
+abstract class A {
+  m();
+}
+class B = A with M;
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          45, 1),
+    ]);
+  }
+
+  test_one_getter_fromInterface() async {
+    await assertErrorsInCode('''
+class I {
+  int get g {return 1;}
+}
+class C implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          42, 1),
+    ]);
+  }
+
+  test_one_getter_fromSuperclass() async {
+    await assertErrorsInCode('''
+abstract class A {
+  int get g;
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          40, 1),
+    ]);
+  }
+
+  test_one_method_fromInterface() async {
+    await assertErrorsInCode('''
+class I {
+  m(p) {}
+}
+class C implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          28, 1),
+    ]);
+  }
+
+  test_one_method_fromInterface_abstractNSM() async {
+    await assertErrorsInCode('''
+class I {
+  m(p) {}
+}
+class C implements I {
+  noSuchMethod(v);
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          28, 1),
+    ]);
+  }
+
+  test_one_method_fromInterface_abstractOverrideNSM() async {
+    await assertNoErrorsInCode('''
+class I {
+  m(p) {}
+}
+class B {
+  noSuchMethod(v) => null;
+}
+class C extends B implements I {
+  noSuchMethod(v);
+}
+''');
+  }
+
+  test_one_method_fromInterface_ifcNSM() async {
+    await assertErrorsInCode('''
+class I {
+  m(p) {}
+  noSuchMethod(v) => null;
+}
+class C implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          55, 1),
+    ]);
+  }
+
+  test_one_method_fromSuperclass() async {
+    await assertErrorsInCode('''
+abstract class A {
+  m(p);
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          35, 1),
+    ]);
+  }
+
+  test_one_method_optionalParamCount() async {
+    // 7640
+    await assertErrorsInCode('''
+abstract class A {
+  int x(int a);
+}
+abstract class B {
+  int x(int a, [int b]);
+}
+class C implements A, B {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          89, 1),
+    ]);
+  }
+
+  test_one_mixinInherits_getter() async {
+    // 15001
+    await assertErrorsInCode('''
+abstract class A { get g1; get g2; }
+abstract class B implements A { get g1 => 1; }
+class C extends Object with B {}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          90, 1),
+    ]);
+  }
+
+  test_one_mixinInherits_method() async {
+    // 15001
+    await assertErrorsInCode('''
+abstract class A { m1(); m2(); }
+abstract class B implements A { m1() => 1; }
+class C extends Object with B {}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          84, 1),
+    ]);
+  }
+
+  test_one_mixinInherits_setter() async {
+    // 15001
+    await assertErrorsInCode('''
+abstract class A { set s1(v); set s2(v); }
+abstract class B implements A { set s1(v) {} }
+class C extends Object with B {}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          96, 1),
+    ]);
+  }
+
+  test_one_noSuchMethod_interface() async {
+    // 15979
+    await assertErrorsInCode('''
+class I {
+  noSuchMethod(v) => '';
+}
+abstract class A {
+  m();
+}
+class B extends A implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          71, 1),
+    ]);
+  }
+
+  test_one_setter_and_implicitSetter() async {
+    // test from language/override_inheritance_abstract_test_14.dart
+    await assertErrorsInCode('''
+abstract class A {
+  set field(_);
+}
+abstract class I {
+  var field;
+}
+class B extends A implements I {
+  get field => 0;
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          77, 1),
+    ]);
+  }
+
+  test_one_setter_fromInterface() async {
+    await assertErrorsInCode('''
+class I {
+  set s(int i) {}
+}
+class C implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          36, 1),
+    ]);
+  }
+
+  test_one_setter_fromSuperclass() async {
+    await assertErrorsInCode('''
+abstract class A {
+  set s(int i);
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          43, 1),
+    ]);
+  }
+
+  test_one_superclasses_interface() async {
+    // bug 11154
+    await assertErrorsInCode('''
+class A {
+  get a => 'a';
+}
+abstract class B implements A {
+  get b => 'b';
+}
+class C extends B {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          84, 1),
+    ]);
+  }
+
+  test_one_variable_fromInterface_missingGetter() async {
+    // 16133
+    await assertErrorsInCode('''
+class I {
+  var v;
+}
+class C implements I {
+  set v(_) {}
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          27, 1),
+    ]);
+  }
+
+  test_one_variable_fromInterface_missingSetter() async {
+    // 16133
+    await assertErrorsInCode('''
+class I {
+  var v;
+}
+class C implements I {
+  get v => 1;
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
+          27, 1),
+    ]);
+  }
+
+  test_three() async {
+    await assertErrorsInCode('''
+abstract class A {
+  m();
+  n();
+  o();
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
+          48, 1),
+    ]);
+  }
+
+  test_two() async {
+    await assertErrorsInCode('''
+abstract class A {
+  m();
+  n();
+}
+class C extends A {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+          41, 1),
+    ]);
+  }
+
+  test_two_fromInterface_missingBoth() async {
+    // 16133
+    await assertErrorsInCode('''
+class I {
+  var v;
+}
+class C implements I {
+}
+''', [
+      error(StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
+          27, 1),
+    ]);
+  }
+}
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 b32c756..927bb08 100644
--- a/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_condition_test.dart
@@ -13,13 +13,14 @@
   defineReflectiveSuite(() {
     defineReflectiveTests(NonBoolConditionTest);
     defineReflectiveTests(NonBoolConditionWithConstantsTest);
+    defineReflectiveTests(NonBoolConditionTest_NNBD);
   });
 }
 
 @reflectiveTest
 class NonBoolConditionTest extends DriverResolutionTest {
   test_ifElement() async {
-    assertErrorsInCode(
+    await assertErrorsInCode(
         '''
 const c = [if (3) 1];
 ''',
@@ -35,6 +36,34 @@
 }
 
 @reflectiveTest
+class NonBoolConditionTest_NNBD extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+  test_if_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  if (x) {}
+}
+''', [
+      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 22, 1),
+    ]);
+  }
+
+  test_ternary_condition_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x ? 0 : 1;
+}
+''', [
+      error(StaticTypeWarningCode.NON_BOOL_CONDITION, 18, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
 class NonBoolConditionWithConstantsTest extends NonBoolConditionTest {
   @override
   AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
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
new file mode 100644
index 0000000..9d5066a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_negation_expression_test.dart
@@ -0,0 +1,35 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonBoolNegationExpressionTest_NNBD);
+  });
+}
+
+@reflectiveTest
+class NonBoolNegationExpressionTest_NNBD extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  !x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.NON_BOOL_NEGATION_EXPRESSION, 19, 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
new file mode 100644
index 0000000..98aeb9f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_bool_operand_test.dart
@@ -0,0 +1,45 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonBoolOperandTest_NNBD);
+  });
+}
+
+@reflectiveTest
+class NonBoolOperandTest_NNBD extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_and_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  if(x && true) {}
+}
+''', [
+      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+    ]);
+  }
+
+  test_or_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  if(x || false) {}
+}
+''', [
+      error(StaticTypeWarningCode.NON_BOOL_OPERAND, 21, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
index a57c563..91c3b85 100644
--- a/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_constant_map_element_test.dart
@@ -167,7 +167,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -182,7 +182,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -197,7 +197,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 67, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -212,7 +212,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -240,7 +240,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -268,7 +268,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_KEY, 57, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -302,7 +302,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -317,7 +317,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -332,7 +332,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 70, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -347,7 +347,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 25),
@@ -375,7 +375,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
@@ -403,7 +403,7 @@
 ''',
         analysisOptions.experimentStatus.constant_update_2018
             ? [
-                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 0, 0),
+                error(CompileTimeErrorCode.NON_CONSTANT_MAP_VALUE, 60, 1),
               ]
             : [
                 error(CompileTimeErrorCode.NON_CONSTANT_MAP_ELEMENT, 46, 15),
diff --git a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
index 933fa1b..45a9406 100644
--- a/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/non_null_opt_out_test.dart
@@ -24,7 +24,7 @@
         sdkVersion: '2.3.0', additionalFeatures: [Feature.non_nullable]);
 
   test_nnbd_optOut_invalidSyntax() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 // @dart = 2.2
 // NNBD syntax is not allowed
 f(x, z) { (x is String?) ? x : z; }
@@ -32,7 +32,7 @@
   }
 
   test_nnbd_optOut_late() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 // @dart = 2.2
 class C {
   // "late" is allowed as an identifier
diff --git a/pkg/analyzer/test/src/diagnostics/non_type_in_catch_clause_test.dart b/pkg/analyzer/test/src/diagnostics/non_type_in_catch_clause_test.dart
new file mode 100644
index 0000000..e108ef7
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_type_in_catch_clause_test.dart
@@ -0,0 +1,44 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonTypeInCatchClauseTest);
+  });
+}
+
+@reflectiveTest
+class NonTypeInCatchClauseTest extends DriverResolutionTest {
+  test_notDefined() async {
+    await assertErrorsInCode('''
+f() {
+  try {
+  } on T catch (e) {
+  }
+}
+''', [
+      error(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, 21, 1),
+      error(HintCode.UNUSED_CATCH_CLAUSE, 30, 1),
+    ]);
+  }
+
+  test_notType() async {
+    await assertErrorsInCode('''
+var T = 0;
+f() {
+  try {
+  } on T catch (e) {
+  }
+}
+''', [
+      error(StaticWarningCode.NON_TYPE_IN_CATCH_CLAUSE, 32, 1),
+      error(HintCode.UNUSED_CATCH_CLAUSE, 41, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_void_return_for_operator_test.dart b/pkg/analyzer/test/src/diagnostics/non_void_return_for_operator_test.dart
new file mode 100644
index 0000000..ae8954a
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_void_return_for_operator_test.dart
@@ -0,0 +1,26 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonVoidReturnForOperatorTest);
+  });
+}
+
+@reflectiveTest
+class NonVoidReturnForOperatorTest extends DriverResolutionTest {
+  test_indexSetter() async {
+    await assertErrorsInCode('''
+class A {
+  int operator []=(a, b) { return a; }
+}''', [
+      error(StaticWarningCode.NON_VOID_RETURN_FOR_OPERATOR, 12, 3),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/non_void_return_for_setter_test.dart b/pkg/analyzer/test/src/diagnostics/non_void_return_for_setter_test.dart
new file mode 100644
index 0000000..c9fadce8
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/non_void_return_for_setter_test.dart
@@ -0,0 +1,37 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NonVoidReturnForSetterTest);
+  });
+}
+
+@reflectiveTest
+class NonVoidReturnForSetterTest extends DriverResolutionTest {
+  test_function() async {
+    await assertErrorsInCode('''
+int set x(int v) {
+  return 42;
+}''', [
+      error(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, 0, 3),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+class A {
+  int set x(int v) {
+    return 42;
+  }
+}''', [
+      error(StaticWarningCode.NON_VOID_RETURN_FOR_SETTER, 12, 3),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_a_type_test.dart b/pkg/analyzer/test/src/diagnostics/not_a_type_test.dart
new file mode 100644
index 0000000..9ff91b1
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/not_a_type_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NotATypeTest);
+  });
+}
+
+@reflectiveTest
+class NotATypeTest extends DriverResolutionTest {
+  test_function() async {
+    await assertErrorsInCode('''
+f() {}
+main() {
+  f v = null;
+}''', [
+      error(StaticWarningCode.NOT_A_TYPE, 18, 1),
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 20, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
index 548d473..e376e33 100644
--- a/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/not_assigned_potentially_non_nullable_local_variable_test.dart
@@ -1397,6 +1397,11 @@
 }
 ''', [
       error(HintCode.DEAD_CODE, 81, 2),
+      error(
+          CompileTimeErrorCode
+              .NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
+          81,
+          1),
     ]);
   }
 
@@ -1407,12 +1412,16 @@
   while (true) {
     // No assignment, but no break.
     // So, we don't exit the loop.
-    // So, all variables are assigned.
   }
   v;
 }
 ''', [
-      error(HintCode.DEAD_CODE, 153, 2),
+      error(HintCode.DEAD_CODE, 114, 2),
+      error(
+          CompileTimeErrorCode
+              .NOT_ASSIGNED_POTENTIALLY_NON_NULLABLE_LOCAL_VARIABLE,
+          114,
+          1),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/not_enough_required_arguments_test.dart b/pkg/analyzer/test/src/diagnostics/not_enough_required_arguments_test.dart
new file mode 100644
index 0000000..bea8216
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/not_enough_required_arguments_test.dart
@@ -0,0 +1,47 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NotEnoughRequiredArgumentsTest);
+  });
+}
+
+@reflectiveTest
+class NotEnoughRequiredArgumentsTest extends DriverResolutionTest {
+  test_functionExpression() async {
+    await assertErrorsInCode('''
+main() {
+  (int x) {} ();
+}''', [
+      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 22, 2),
+    ]);
+  }
+
+  test_functionInvocation() async {
+    await assertErrorsInCode('''
+f(int a, String b) {}
+main() {
+  f();
+}''', [
+      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 34, 2),
+    ]);
+  }
+
+  test_getterReturningFunction() async {
+    await assertErrorsInCode('''
+typedef Getter(self);
+Getter getter = (x) => x;
+main() {
+  getter();
+}''', [
+      error(StaticWarningCode.NOT_ENOUGH_REQUIRED_ARGUMENTS, 65, 2),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart
new file mode 100644
index 0000000..ccb37f7
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_instance_field_test.dart
@@ -0,0 +1,184 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NotInitializedNonNullableInstanceFieldTest);
+  });
+}
+
+@reflectiveTest
+class NotInitializedNonNullableInstanceFieldTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_constructorFieldInitializer() async {
+    await assertNoErrorsInCode('''
+class A {
+  int x;
+
+  A() : x = 0;
+}
+''');
+  }
+
+  test_factoryConstructor() async {
+    await assertNoErrorsInCode('''
+class A {
+  int x = 0;
+
+  A(this.x);
+
+  factory A.named() => A(0);
+}
+''');
+  }
+
+  test_fieldFormal() async {
+    await assertNoErrorsInCode('''
+class A {
+  int x;
+
+  A(this.x);
+}
+''');
+  }
+
+  test_futureOr_questionArgument_none() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+
+class A {
+  FutureOr<int?> x;
+}
+''');
+  }
+
+  test_hasInitializer() async {
+    await assertNoErrorsInCode('''
+class A {
+  int x = 0;
+}
+''');
+  }
+
+  test_inferredType() async {
+    await assertErrorsInCode('''
+abstract class A {
+  int get x;
+}
+
+class B extends A {
+  var x;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
+          61, 1),
+    ]);
+  }
+
+  test_notAllConstructors() async {
+    await assertErrorsInCode('''
+class A {
+  int x;
+
+  A.a(this.x);
+
+  A.b();
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR,
+          38,
+          1),
+    ]);
+  }
+
+  test_notAllFields() async {
+    await assertErrorsInCode('''
+class A {
+  int x, y, z;
+
+  A() : x = 0, z = 2;
+}
+''', [
+      error(
+          CompileTimeErrorCode
+              .NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD_CONSTRUCTOR,
+          28,
+          1),
+    ]);
+  }
+
+  test_nullable() async {
+    await assertNoErrorsInCode('''
+class A {
+  int? x;
+}
+''');
+  }
+
+  test_type_dynamic() async {
+    await assertNoErrorsInCode('''
+class A {
+  dynamic x;
+}
+''');
+  }
+
+  test_type_dynamic_implicit() async {
+    await assertNoErrorsInCode('''
+class A {
+  var x;
+}
+''');
+  }
+
+  test_type_never() async {
+    await assertErrorsInCode('''
+class A {
+  Never x;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
+          18, 1),
+    ]);
+  }
+
+  test_type_void() async {
+    await assertNoErrorsInCode('''
+class A {
+  void x;
+}
+''');
+  }
+
+  test_typeParameter() async {
+    await assertErrorsInCode('''
+class A<T> {
+  T x;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_INSTANCE_FIELD,
+          17, 1),
+    ]);
+  }
+
+  test_typeParameter_nullable() async {
+    await assertNoErrorsInCode('''
+class A<T> {
+  T? x;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_static_field_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_static_field_test.dart
deleted file mode 100644
index 233eb2b..0000000
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_static_field_test.dart
+++ /dev/null
@@ -1,95 +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/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(NotInitializedNonNullableStaticFieldTest);
-  });
-}
-
-@reflectiveTest
-class NotInitializedNonNullableStaticFieldTest extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
-
-  test_futureOr_questionArgument_none() async {
-    assertNoErrorsInCode('''
-import 'dart:async';
-
-class A {
-  static FutureOr<int?> v;
-}
-''');
-  }
-
-  test_hasInitializer() async {
-    assertNoErrorsInCode('''
-class A {
-  static int v = 0;
-}
-''');
-  }
-
-  test_noInitializer() async {
-    assertErrorsInCode('''
-class A {
-  static int x = 0, y, z = 2;
-}
-''', [
-      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD, 30,
-          1),
-    ]);
-  }
-
-  test_nullable() async {
-    assertNoErrorsInCode('''
-class A {
-  static int? v;
-}
-''');
-  }
-
-  test_type_dynamic() async {
-    assertNoErrorsInCode('''
-class A {
-  static dynamic v;
-}
-''');
-  }
-
-  test_type_dynamic_implicit() async {
-    assertNoErrorsInCode('''
-class A {
-  static var v;
-}
-''');
-  }
-
-  test_type_never() async {
-    assertErrorsInCode('''
-class A {
-  static Never v;
-}
-''', [
-      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_STATIC_FIELD, 25,
-          1),
-    ]);
-  }
-
-  test_type_void() async {
-    assertNoErrorsInCode('''
-class A {
-  static void v;
-}
-''');
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_top_level_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_top_level_variable_test.dart
deleted file mode 100644
index 218e4ef..0000000
--- a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_top_level_variable_test.dart
+++ /dev/null
@@ -1,84 +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/src/dart/analysis/experiments.dart';
-import 'package:analyzer/src/error/codes.dart';
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:test_reflective_loader/test_reflective_loader.dart';
-
-import '../dart/resolution/driver_resolution.dart';
-
-main() {
-  defineReflectiveSuite(() {
-    defineReflectiveTests(NotInitializedNonNullableTopLevelVariableTest);
-  });
-}
-
-@reflectiveTest
-class NotInitializedNonNullableTopLevelVariableTest
-    extends DriverResolutionTest {
-  @override
-  AnalysisOptionsImpl get analysisOptions =>
-      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
-
-  test_futureOr_questionArgument_none() async {
-    assertNoErrorsInCode('''
-import 'dart:async';
-
-FutureOr<int?> v;
-''');
-  }
-
-  test_hasInitializer() async {
-    assertNoErrorsInCode('''
-int v = 0;
-''');
-  }
-
-  test_noInitializer() async {
-    assertErrorsInCode('''
-int x = 0, y, z = 2;
-''', [
-      error(
-          CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE,
-          11,
-          1),
-    ]);
-  }
-
-  test_nullable() async {
-    assertNoErrorsInCode('''
-int? v;
-''');
-  }
-
-  test_type_dynamic() async {
-    assertNoErrorsInCode('''
-dynamic v;
-''');
-  }
-
-  test_type_dynamic_implicit() async {
-    assertNoErrorsInCode('''
-var v;
-''');
-  }
-
-  test_type_never() async {
-    assertErrorsInCode('''
-Never v;
-''', [
-      error(
-          CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_TOP_LEVEL_VARIABLE,
-          6,
-          1),
-    ]);
-  }
-
-  test_type_void() async {
-    assertNoErrorsInCode('''
-void v;
-''');
-  }
-}
diff --git a/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
new file mode 100644
index 0000000..ef60224
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/not_initialized_non_nullable_variable_test.dart
@@ -0,0 +1,147 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NotInitializedNonNullableVariableTest);
+  });
+}
+
+@reflectiveTest
+class NotInitializedNonNullableVariableTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_staticField_futureOr_questionArgument_none() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+
+class A {
+  static FutureOr<int?> v;
+}
+''');
+  }
+
+  test_staticField_hasInitializer() async {
+    await assertNoErrorsInCode('''
+class A {
+  static int v = 0;
+}
+''');
+  }
+
+  test_staticField_noInitializer() async {
+    await assertErrorsInCode('''
+class A {
+  static int x = 0, y, z = 2;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 30, 1),
+    ]);
+  }
+
+  test_staticField_nullable() async {
+    await assertNoErrorsInCode('''
+class A {
+  static int? v;
+}
+''');
+  }
+
+  test_staticField_type_dynamic() async {
+    await assertNoErrorsInCode('''
+class A {
+  static dynamic v;
+}
+''');
+  }
+
+  test_staticField_type_dynamic_implicit() async {
+    await assertNoErrorsInCode('''
+class A {
+  static var v;
+}
+''');
+  }
+
+  test_staticField_type_never() async {
+    await assertErrorsInCode('''
+class A {
+  static Never v;
+}
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 25, 1),
+    ]);
+  }
+
+  test_staticField_type_void() async {
+    await assertNoErrorsInCode('''
+class A {
+  static void v;
+}
+''');
+  }
+
+  test_topLevelVariable_futureOr_questionArgument_none() async {
+    await assertNoErrorsInCode('''
+import 'dart:async';
+
+FutureOr<int?> v;
+''');
+  }
+
+  test_topLevelVariable_hasInitializer() async {
+    await assertNoErrorsInCode('''
+int v = 0;
+''');
+  }
+
+  test_topLevelVariable_noInitializer() async {
+    await assertErrorsInCode('''
+int x = 0, y, z = 2;
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 11, 1),
+    ]);
+  }
+
+  test_topLevelVariable_nullable() async {
+    await assertNoErrorsInCode('''
+int? v;
+''');
+  }
+
+  test_topLevelVariable_type_dynamic() async {
+    await assertNoErrorsInCode('''
+dynamic v;
+''');
+  }
+
+  test_topLevelVariable_type_dynamic_implicit() async {
+    await assertNoErrorsInCode('''
+var v;
+''');
+  }
+
+  test_topLevelVariable_type_never() async {
+    await assertErrorsInCode('''
+Never v;
+''', [
+      error(CompileTimeErrorCode.NOT_INITIALIZED_NON_NULLABLE_VARIABLE, 6, 1),
+    ]);
+  }
+
+  test_topLevelVariable_type_void() async {
+    await assertNoErrorsInCode('''
+void v;
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart
index 3948d35..9253675 100644
--- a/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_catch_clause_test.dart
@@ -22,7 +22,7 @@
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_noOnClause() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 f() {
   try {
   } catch (e) {
@@ -32,7 +32,7 @@
   }
 
   test_on_class_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 f() {
   try {
@@ -43,7 +43,7 @@
   }
 
   test_on_class_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 f() {
   try {
@@ -56,7 +56,7 @@
   }
 
   test_on_typeParameter() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A<B> {
   m() {
     try {
@@ -70,7 +70,7 @@
   }
 
   test_on_typeParameter_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A<B extends Object> {
   m() {
     try {
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart
index b2f454b..cd601a3 100644
--- a/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_extends_clause_test.dart
@@ -22,14 +22,14 @@
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_class_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 class B extends A {}
 ''');
   }
 
   test_class_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 class B extends A? {}
 ''', [
@@ -38,7 +38,7 @@
   }
 
   test_classAlias_withClass_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 class B {}
 class C = A with B;
@@ -46,7 +46,7 @@
   }
 
   test_classAlias_withClass_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 class B {}
 class C = A? with B;
@@ -56,7 +56,7 @@
   }
 
   test_classAlias_withMixin_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 mixin B {}
 class C = A with B;
@@ -64,7 +64,7 @@
   }
 
   test_classAlias_withMixin_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 mixin B {}
 class C = A? with B;
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart
index 39ffb8e..6eb1e9f 100644
--- a/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_implements_clause_test.dart
@@ -22,14 +22,14 @@
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_class_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 class B implements A {}
 ''');
   }
 
   test_class_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 class B implements A? {}
 ''', [
@@ -38,14 +38,14 @@
   }
 
   test_mixin_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 mixin B implements A {}
 ''');
   }
 
   test_mixin_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 mixin B implements A? {}
 ''', [
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart
index 60e319a..1e8706d 100644
--- a/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_on_clause_test.dart
@@ -22,14 +22,14 @@
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 mixin B on A {}
 ''');
   }
 
   test_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 mixin B on A? {}
 ''', [
diff --git a/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart b/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart
index c05909c..d39ed26 100644
--- a/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/nullable_type_in_with_clause_test.dart
@@ -22,14 +22,14 @@
       AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
 
   test_class_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 class B with A {}
 ''');
   }
 
   test_class_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 class B with A? {}
 ''', [
@@ -38,7 +38,7 @@
   }
 
   test_classAlias_withClass_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 class B {}
 class C = A with B;
@@ -46,7 +46,7 @@
   }
 
   test_classAlias_withClass_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 class B {}
 class C = A with B?;
@@ -56,7 +56,7 @@
   }
 
   test_classAlias_withMixin_nonNullable() async {
-    assertNoErrorsInCode('''
+    await assertNoErrorsInCode('''
 class A {}
 mixin B {}
 class C = A with B;
@@ -64,7 +64,7 @@
   }
 
   test_classAlias_withMixin_nullable() async {
-    assertErrorsInCode('''
+    await assertErrorsInCode('''
 class A {}
 mixin B {}
 class C = A with B?;
diff --git a/pkg/analyzer/test/src/diagnostics/part_of_different_library_test.dart b/pkg/analyzer/test/src/diagnostics/part_of_different_library_test.dart
new file mode 100644
index 0000000..b54eff4
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/part_of_different_library_test.dart
@@ -0,0 +1,27 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(PartOfDifferentLibraryTest);
+  });
+}
+
+@reflectiveTest
+class PartOfDifferentLibraryTest extends DriverResolutionTest {
+  test_name() async {
+    newFile("/test/lib/part.dart", content: "part of lub;");
+    await assertErrorsInCode('''
+library lib;
+part 'part.dart';
+''', [
+      error(StaticWarningCode.PART_OF_DIFFERENT_LIBRARY, 18, 11),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_function_type_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_function_type_test.dart
new file mode 100644
index 0000000..f5b335e
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_function_type_test.dart
@@ -0,0 +1,29 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RedirectToInvalidFunctionTypeTest);
+  });
+}
+
+@reflectiveTest
+class RedirectToInvalidFunctionTypeTest extends DriverResolutionTest {
+  test_redirectToInvalidFunctionType() async {
+    await assertErrorsInCode('''
+class A implements B {
+  A(int p) {}
+}
+class B {
+  factory B() = A;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, 65, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_return_type_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_return_type_test.dart
new file mode 100644
index 0000000..d1b8b0f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_invalid_return_type_test.dart
@@ -0,0 +1,29 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RedirectToInvalidReturnTypeTest);
+  });
+}
+
+@reflectiveTest
+class RedirectToInvalidReturnTypeTest extends DriverResolutionTest {
+  test_redirectToInvalidReturnType() async {
+    await assertErrorsInCode('''
+class A {
+  A() {}
+}
+class B {
+  factory B() = A;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, 47, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_missing_constructor_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_missing_constructor_test.dart
new file mode 100644
index 0000000..c688e3b
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_missing_constructor_test.dart
@@ -0,0 +1,41 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RedirectToMissingConstructorTest);
+  });
+}
+
+@reflectiveTest
+class RedirectToMissingConstructorTest extends DriverResolutionTest {
+  test_named() async {
+    await assertErrorsInCode('''
+class A implements B{
+  A() {}
+}
+class B {
+  factory B() = A.name;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR, 59, 6),
+    ]);
+  }
+
+  test_unnamed() async {
+    await assertErrorsInCode('''
+class A implements B{
+  A.name() {}
+}
+class B {
+  factory B() = A;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR, 64, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/redirect_to_non_class_test.dart b/pkg/analyzer/test/src/diagnostics/redirect_to_non_class_test.dart
new file mode 100644
index 0000000..39c83ab
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/redirect_to_non_class_test.dart
@@ -0,0 +1,36 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(RedirectToNonClassTest);
+  });
+}
+
+@reflectiveTest
+class RedirectToNonClassTest extends DriverResolutionTest {
+  test_notAType() async {
+    await assertErrorsInCode('''
+class B {
+  int A;
+  factory B() = A;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_NON_CLASS, 35, 1),
+    ]);
+  }
+
+  test_undefinedIdentifier() async {
+    await assertErrorsInCode('''
+class B {
+  factory B() = A;
+}''', [
+      error(StaticWarningCode.REDIRECT_TO_NON_CLASS, 26, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/return_without_value_test.dart b/pkg/analyzer/test/src/diagnostics/return_without_value_test.dart
new file mode 100644
index 0000000..bff5145
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/return_without_value_test.dart
@@ -0,0 +1,105 @@
+// 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/src/error/codes.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ReturnWithoutValueTest);
+  });
+}
+
+@reflectiveTest
+class ReturnWithoutValueTest extends DriverResolutionTest {
+  test_async() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+Future<int> f() async {
+  return;
+}
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 47, 7),
+    ]);
+  }
+
+  test_async_future_object_with_return() async {
+    await assertErrorsInCode('''
+import 'dart:async';
+Future<Object> f() async {
+  return;
+}
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 50, 7),
+    ]);
+  }
+
+  test_factoryConstructor() async {
+    await assertErrorsInCode('''
+class A { factory A() { return; } }
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 24, 7),
+    ]);
+  }
+
+  test_function() async {
+    await assertErrorsInCode('''
+int f() { return; }
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 10, 7),
+    ]);
+  }
+
+  test_localFunction() async {
+    await assertErrorsInCode('''
+class C {
+  m(int x) {
+    return (int y) {
+      if (y < 0) {
+        return;
+      }
+      return 0;
+    };
+  }
+}
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 71, 7),
+    ]);
+  }
+
+  test_method() async {
+    await assertErrorsInCode('''
+class A { int m() { return; } }
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 20, 7),
+    ]);
+  }
+
+  test_multipleInconsistentReturns() async {
+    // Tests that only the RETURN_WITHOUT_VALUE warning is created, and no
+    // MIXED_RETURN_TYPES are created.
+    await assertErrorsInCode('''
+int f(int x) {
+  if (x < 0) {
+    return 1;
+  }
+  return;
+}
+''', [
+      error(StaticWarningCode.RETURN_WITHOUT_VALUE, 50, 7),
+    ]);
+  }
+
+  test_Null() async {
+    // Test that block bodied functions with return type Null and an empty
+    // return cause a static warning.
+    await assertNoErrorsInCode('''
+Null f() {
+  return;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_as_expression_in_const_context_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_as_expression_in_const_context_test.dart
index 106093c..d7f2330 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_as_expression_in_const_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_as_expression_in_const_context_test.dart
@@ -23,7 +23,7 @@
     ..enabledExperiments = [EnableString.constant_update_2018];
 
   test_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const dynamic a = 2;
 const c = (a as int) + 2;
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_bool_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_bool_operator_test.dart
index 4183627..6cd9411 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_bool_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_bool_operator_test.dart
@@ -22,7 +22,7 @@
     ..enabledExperiments = [EnableString.constant_update_2018];
 
   test_and_const_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const c = true & false;
 ''');
   }
@@ -36,7 +36,7 @@
   }
 
   test_and_nonConst_equals() {
-    verifyVersion('2.2.2', '''
+    verifyVersion('2.5.0', '''
 var c = true & false;
 ''');
   }
@@ -48,7 +48,7 @@
   }
 
   test_or_const_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const c = true | false;
 ''');
   }
@@ -62,7 +62,7 @@
   }
 
   test_or_nonConst_equals() {
-    verifyVersion('2.2.2', '''
+    verifyVersion('2.5.0', '''
 var c = true | false;
 ''');
   }
@@ -74,7 +74,7 @@
   }
 
   test_xor_const_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const c = true ^ false;
 ''');
   }
@@ -88,7 +88,7 @@
   }
 
   test_xor_nonConst_equals() {
-    verifyVersion('2.2.2', '''
+    verifyVersion('2.5.0', '''
 var c = true ^ false;
 ''');
   }
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_eq_eq_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_eq_eq_operator_test.dart
index e1814bb..a173f44 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_eq_eq_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_eq_eq_operator_test.dart
@@ -22,7 +22,7 @@
     ..enabledExperiments = [EnableString.constant_update_2018];
 
   test_left_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 class A {
   const A();
 }
@@ -44,7 +44,7 @@
   }
 
   test_right_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 class A {
   const A();
 }
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
index ed8c441..416079f 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_gt_gt_gt_operator_test.dart
@@ -24,7 +24,7 @@
   test_const_equals() {
     // TODO(brianwilkerson) Add '>>>' to MockSdk and remove the code
     //  UNDEFINED_OPERATOR when triple_shift is enabled by default.
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const a = 42 >>> 3;
 ''', expectedErrors: [
       error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 13, 3),
@@ -43,7 +43,7 @@
   }
 
   test_declaration_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 class A {
   A operator >>>(A a) => this;
 }
@@ -63,7 +63,7 @@
   test_nonConst_equals() {
     // TODO(brianwilkerson) Add '>>>' to MockSdk and remove the code
     //  UNDEFINED_OPERATOR when constant update is enabled by default.
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 var a = 42 >>> 3;
 ''', expectedErrors: [
       error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 11, 3),
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_is_expression_in_const_context_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_is_expression_in_const_context_test.dart
index fb7197a..ab7ff21 100644
--- a/pkg/analyzer/test/src/diagnostics/sdk_version_is_expression_in_const_context_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_is_expression_in_const_context_test.dart
@@ -23,7 +23,7 @@
     ..enabledExperiments = [EnableString.constant_update_2018];
 
   test_equals() {
-    verifyVersion('2.3.2', '''
+    verifyVersion('2.5.0', '''
 const dynamic a = 2;
 const c = a is int;
 ''');
diff --git a/pkg/analyzer/test/src/diagnostics/sdk_version_ui_as_code_in_const_context_test.dart b/pkg/analyzer/test/src/diagnostics/sdk_version_ui_as_code_in_const_context_test.dart
new file mode 100644
index 0000000..b1d9ff1
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/sdk_version_ui_as_code_in_const_context_test.dart
@@ -0,0 +1,43 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/dart/error/hint_codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import 'sdk_constraint_verifier_support.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SdkVersionUiAsCodeInConstContextTest);
+  });
+}
+
+@reflectiveTest
+class SdkVersionUiAsCodeInConstContextTest extends SdkConstraintVerifierTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..enabledExperiments = [EnableString.constant_update_2018];
+
+  test_equals() async {
+    await verifyVersion('2.5.0', '''
+const zero = [...const [0]];
+''');
+  }
+
+  test_greaterThan() async {
+    await verifyVersion('2.5.2', '''
+const zero = [...const [0]];
+''');
+  }
+
+  test_lessThan() async {
+    await verifyVersion('2.4.0', '''
+const zero = [if (0 < 1) 0];
+''', expectedErrors: [
+      error(HintCode.SDK_VERSION_UI_AS_CODE_IN_CONST_CONTEXT, 14, 12),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
new file mode 100644
index 0000000..6fc3e81
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/static_access_to_instance_member_test.dart
@@ -0,0 +1,68 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+//    defineReflectiveTests(StaticAccessToInstanceMemberTest);
+    defineReflectiveTests(StaticAccessToInstanceMemberWithExtensionMethodsTest);
+  });
+}
+
+@reflectiveTest
+class StaticAccessToInstanceMemberTest extends DriverResolutionTest {}
+
+@reflectiveTest
+class StaticAccessToInstanceMemberWithExtensionMethodsTest
+    extends StaticAccessToInstanceMemberTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_getter() async {
+    assertErrorsInCode('''
+extension E on int {
+  int get g => 0;
+}
+f() {
+  E.g;
+}
+''', [
+      error(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, 51, 1),
+    ]);
+  }
+
+  test_method() async {
+    assertErrorsInCode('''
+extension E on int {
+  void m() {}
+}
+f() {
+  E.m();
+}
+''', [
+      error(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, 47, 1),
+    ]);
+  }
+
+  test_setter() async {
+    assertErrorsInCode('''
+extension E on int {
+  void set s(int i) {}
+}
+f() {
+  E.s = 2;
+}
+''', [
+      error(StaticWarningCode.STATIC_ACCESS_TO_INSTANCE_MEMBER, 56, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/super_in_extension_test.dart b/pkg/analyzer/test/src/diagnostics/super_in_extension_test.dart
new file mode 100644
index 0000000..b356cfd
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/super_in_extension_test.dart
@@ -0,0 +1,92 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(SuperInExtensionTest);
+  });
+}
+
+@reflectiveTest
+class SuperInExtensionTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_binaryOperator_inMethod() async {
+    // TODO(brianwilkerson) Ensure that only one diagnostic is produced.
+    await assertErrorsInCode('''
+extension E on int {
+  int plusOne() => super + 1;
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_EXTENSION, 40, 5),
+      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 46, 1),
+    ]);
+  }
+
+  test_getter_inSetter() async {
+    await assertErrorsInCode('''
+class C {
+  int get value => 0;
+  set value(int newValue) {}
+}
+extension E on C {
+  set sign(int sign) {
+    value = super.value * sign;
+  }
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_EXTENSION, 117, 5),
+    ]);
+  }
+
+  test_indexOperator_inMethod() async {
+    // TODO(brianwilkerson) Ensure that only one diagnostic is produced.
+    await assertErrorsInCode('''
+class C {
+  int operator[](int i) => 0;
+}
+extension E on C {
+  int at(int i) => super[i];
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_EXTENSION, 80, 5),
+      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 85, 3),
+    ]);
+  }
+
+  test_method_inGetter() async {
+    await assertErrorsInCode('''
+extension E on int {
+  int get displayTest => super.toString();
+}
+''', [
+      error(CompileTimeErrorCode.SUPER_IN_EXTENSION, 46, 5),
+    ]);
+  }
+
+  test_prefixOperator_inGetter() async {
+    // TODO(brianwilkerson) Ensure that only one diagnostic is produced.
+    await assertErrorsInCode('''
+class C {
+  C operator-() => this;
+}
+extension E on C {
+  C get negated => -super;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, 75, 1),
+      error(CompileTimeErrorCode.SUPER_IN_EXTENSION, 76, 5),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/test_all.dart b/pkg/analyzer/test/src/diagnostics/test_all.dart
index 810392d..3f0007b 100644
--- a/pkg/analyzer/test/src/diagnostics/test_all.dart
+++ b/pkg/analyzer/test/src/diagnostics/test_all.dart
@@ -4,11 +4,29 @@
 
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import 'access_static_extension_member_test.dart'
+    as access_static_extension_member;
+import 'ambiguous_export_test.dart' as ambiguous_export;
+import 'ambiguous_extension_method_access_test.dart'
+    as ambiguous_extension_method_access;
+import 'ambiguous_import_test.dart' as ambiguous_import;
 import 'ambiguous_set_or_map_literal_test.dart' as ambiguous_set_or_map_literal;
 import 'argument_type_not_assignable_test.dart' as argument_type_not_assignable;
+import 'assignment_to_const_test.dart' as assignment_to_const;
+import 'assignment_to_final_local_test.dart' as assignment_to_final_local;
+import 'assignment_to_final_no_setter_test.dart'
+    as assignment_to_final_no_setter;
+import 'assignment_to_final_test.dart' as assignment_to_final;
+import 'assignment_to_function_test.dart' as assignment_to_function;
+import 'assignment_to_method_test.dart' as assignment_to_method;
+import 'assignment_to_type_test.dart' as assignment_to_type;
 import 'async_keyword_used_as_identifier_test.dart'
     as async_keyword_used_as_identifier;
 import 'can_be_null_after_null_aware_test.dart' as can_be_null_after_null_aware;
+import 'case_block_not_terminated_test.dart' as case_block_not_terminated;
+import 'cast_to_non_type_test.dart' as cast_to_non_type;
+import 'concrete_class_with_abstract_member_test.dart'
+    as concrete_class_with_abstract_member;
 import 'const_constructor_param_type_mismatch_test.dart'
     as const_constructor_param_type_mismatch;
 import 'const_constructor_with_mixin_with_field_test.dart'
@@ -21,26 +39,65 @@
 import 'const_spread_expected_list_or_set_test.dart'
     as const_spread_expected_list_or_set;
 import 'const_spread_expected_map_test.dart' as const_spread_expected_map;
+import 'const_with_abstract_class_test.dart' as const_with_abstract_class;
 import 'dead_code_test.dart' as dead_code;
 import 'default_list_constructor_mismatch_test.dart'
     as default_list_constructor_mismatch;
 import 'default_value_on_required_parameter_test.dart'
     as default_value_on_required_paramter;
+import 'deprecated_extends_function_test.dart' as deprecated_extends_function;
+import 'deprecated_function_class_declaration_test.dart'
+    as deprecated_function_class_declaration;
 import 'deprecated_member_use_test.dart' as deprecated_member_use;
+import 'deprecated_mixin_function_test.dart' as deprecated_mixin_function;
 import 'division_optimization_test.dart' as division_optimization;
+import 'down_cast_composite_test.dart' as down_cast_composite;
+import 'duplicate_hidden_name_test.dart' as duplicate_hidden_name;
 import 'duplicate_import_test.dart' as duplicate_import;
+import 'duplicate_shown_name_test.dart' as duplicate_shown_name;
 import 'equal_elements_in_const_set_test.dart' as equal_elements_in_const_set;
 import 'equal_keys_in_const_map_test.dart' as equal_keys_in_const_map;
+import 'export_suplicated_library_named_test.dart'
+    as export_suplicated_library_named;
 import 'expression_in_map_test.dart' as expression_in_map;
 import 'extends_non_class_test.dart' as extends_non_class;
+import 'extension_declares_abstract_method_test.dart'
+    as extension_declares_abstract_method;
+import 'extension_declares_constructor_test.dart'
+    as extension_declares_constructor;
+import 'extension_declares_field_test.dart' as extension_declares_field;
+import 'extension_declares_member_of_object_test.dart'
+    as extension_declares_member_of_object;
+import 'extension_override_access_to_static_member_test.dart'
+    as extension_override_access_to_static_member;
+import 'extension_override_argument_not_assignable_test.dart'
+    as extension_override_argument_not_assignable;
+import 'extension_override_without_access_test.dart'
+    as extension_override_without_access;
+import 'extra_positional_arguments_test.dart' as extra_positional_arguments;
+import 'field_initialized_in_initializer_and_declaration_test.dart'
+    as field_initialized_in_initializer_and_declaration;
+import 'field_initializer_not_assignable_test.dart'
+    as field_initializer_not_assignable;
+import 'field_initializing_formal_not_assignable_test.dart'
+    as field_initializing_formal_not_assignable;
+import 'final_initialized_in_delcaration_and_constructor_test.dart'
+    as final_initialized_in_delcaration_and_constructor;
+import 'final_not_initialized_constructor_test.dart'
+    as final_not_initialized_constructor;
 import 'final_not_initialized_test.dart' as final_not_initialized;
 import 'implements_non_class_test.dart' as implements_non_class;
 import 'implicit_this_reference_in_initializer_test.dart'
     as implicit_this_reference_in_initializer;
 import 'import_deferred_library_with_load_function_test.dart'
     as import_deferred_library_with_load_function;
+import 'import_duplicated_library_named_test.dart'
+    as import_duplicated_library_named;
+import 'import_of_non_library_test.dart' as import_of_non_library;
 import 'invalid_assignment_test.dart' as invalid_assignment;
 import 'invalid_cast_new_expr_test.dart' as invalid_cast_new_expr;
+import 'invalid_extension_argument_count_test.dart'
+    as invalid_extension_argument_count;
 import 'invalid_factory_annotation_test.dart' as invalid_factory_annotation;
 import 'invalid_factory_method_impl_test.dart' as invalid_factory_method_impl;
 import 'invalid_immutable_annotation_test.dart' as invalid_immutable_annotation;
@@ -51,8 +108,14 @@
     as invalid_override_different_default_values_named;
 import 'invalid_override_different_default_values_positional_test.dart'
     as invalid_override_different_default_values_positional;
+import 'invalid_override_test.dart' as invalid_override;
+import 'invalid_reference_to_this_test.dart' as invalid_reference_to_this;
 import 'invalid_required_param_test.dart' as invalid_required_param;
 import 'invalid_sealed_annotation_test.dart' as invalid_sealed_annotation;
+import 'invalid_use_of_covariant_in_extension_test.dart'
+    as invalid_use_of_covariant_in_extension;
+import 'invalid_use_of_never_value_test.dart' as invalid_use_of_never_value;
+import 'invalid_use_of_null_value_test.dart' as invalid_use_of_null_value;
 import 'invalid_use_of_protected_member_test.dart'
     as invalid_use_of_protected_member;
 import 'invalid_use_of_visible_for_template_member_test.dart'
@@ -61,23 +124,42 @@
     as invalid_use_of_visible_for_testing_member;
 import 'invalid_visibility_annotation_test.dart'
     as invalid_visibility_annotation;
+import 'is_double_test.dart' as is_double;
+import 'is_int_test.dart' as is_int;
+import 'is_not_double_test.dart' as is_not_double;
+import 'is_not_int_test.dart' as is_not_int;
 import 'list_element_type_not_assignable_test.dart'
     as list_element_type_not_assignable;
 import 'map_entry_not_in_map_test.dart' as map_entry_not_in_map;
 import 'map_key_type_not_assignable_test.dart' as map_key_type_not_assignable;
 import 'map_value_type_not_assignable_test.dart'
     as map_value_type_not_assignable;
+import 'mismatched_getter_and_setter_types_test.dart'
+    as mismatched_getter_and_setter_types;
 import 'missing_default_value_for_parameter_test.dart'
-    as missing_default_value_for_paramter;
+    as missing_default_value_for_parameter;
+import 'missing_enum_value_in_switch_test.dart' as missing_enum_value_in_switch;
+import 'missing_js_lib_annotation_test.dart' as missing_js_lib_annotation;
 import 'missing_required_param_test.dart' as missing_required_param;
 import 'missing_return_test.dart' as missing_return;
+import 'mixed_return_types_test.dart' as mixed_return_types;
 import 'mixin_of_non_class_test.dart' as mixin_of_non_class;
 import 'mixin_on_sealed_class_test.dart' as mixin_on_sealed_class;
 import 'mixin_super_class_constraint_non_interface_test.dart'
     as mixin_super_class_constraint_non_interface;
 import 'must_be_immutable_test.dart' as must_be_immutable;
 import 'must_call_super_test.dart' as must_call_super;
+import 'new_with_abstract_class_test.dart' as new_with_abstract_class;
+import 'new_with_invalid_type_parameters_test.dart'
+    as new_with_invalid_type_parameters;
+import 'new_with_non_type_test.dart' as new_with_non_type;
+import 'new_with_undefined_constructor_test.dart'
+    as new_with_undefined_constructor;
+import 'non_abstract_class_inherits_abstract_member_test.dart'
+    as non_abstract_class_inherits_abstract_member;
 import 'non_bool_condition_test.dart' as non_bool_condition;
+import 'non_bool_negation_expression_test.dart' as non_bool_negation_expression;
+import 'non_bool_operand_test.dart' as non_bool_operand;
 import 'non_constant_if_element_condition_from_deferred_library_test.dart'
     as non_constant_if_element_condition_from_deferred_library;
 import 'non_constant_list_element_from_deferred_library_test.dart'
@@ -96,12 +178,18 @@
 import 'non_constant_spread_expression_from_deferred_library_test.dart'
     as non_constant_spread_expression_from_deferred_library;
 import 'non_null_opt_out_test.dart' as non_null_opt_out;
+import 'non_type_in_catch_clause_test.dart' as non_type_in_catch_clause;
+import 'non_void_return_for_operator_test.dart' as non_void_return_for_operator;
+import 'non_void_return_for_setter_test.dart' as non_void_return_for_setter;
+import 'not_a_type_test.dart' as not_a_type;
 import 'not_assigned_potentially_non_nullable_local_variable_test.dart'
     as not_assigned_potentially_non_nullable_local_variable;
-import 'not_initialized_non_nullable_static_field_test.dart'
-    as not_initialized_non_nullable_static_field;
-import 'not_initialized_non_nullable_top_level_variable_test.dart'
-    as not_initialized_non_nullable_top_level_variable;
+import 'not_enough_required_arguments_test.dart'
+    as not_enough_required_arguments;
+import 'not_initialized_non_nullable_instance_field_test.dart'
+    as not_initialized_non_nullable_instance_field;
+import 'not_initialized_non_nullable_variable_test.dart'
+    as not_initialized_non_nullable_variable;
 import 'not_iterable_spread_test.dart' as not_iterable_spread;
 import 'not_map_spread_test.dart' as not_map_spread;
 import 'not_null_aware_null_spread_test.dart' as not_null_aware_null_spread;
@@ -127,6 +215,15 @@
     as override_on_non_overriding_method;
 import 'override_on_non_overriding_setter_test.dart'
     as override_on_non_overriding_setter;
+import 'part_of_different_library_test.dart' as part_of_different_library;
+import 'redirect_to_invalid_function_type_test.dart'
+    as redirect_to_invalid_function_type;
+import 'redirect_to_invalid_return_type_test.dart'
+    as redirect_to_invalid_return_type;
+import 'redirect_to_missing_constructor_test.dart'
+    as redirect_to_missing_constructor;
+import 'redirect_to_non_class_test.dart' as redirect_to_non_class;
+import 'return_without_value_test.dart' as return_without_value;
 import 'sdk_version_as_expression_in_const_context_test.dart'
     as sdk_version_as_expression_in_const_context;
 import 'sdk_version_async_exported_from_core_test.dart'
@@ -139,26 +236,39 @@
     as sdk_version_is_expression_in_const_context;
 import 'sdk_version_never_test.dart' as sdk_version_never;
 import 'sdk_version_set_literal_test.dart' as sdk_version_set_literal;
+import 'sdk_version_ui_as_code_in_const_context_test.dart'
+    as sdk_version_ui_as_code_in_const_context;
 import 'sdk_version_ui_as_code_test.dart' as sdk_version_ui_as_code;
 import 'set_element_type_not_assignable_test.dart'
     as set_element_type_not_assignable;
+import 'static_access_to_instance_member_test.dart'
+    as static_access_to_instance_member;
 import 'subtype_of_sealed_class_test.dart' as subtype_of_sealed_class;
+import 'super_in_extension_test.dart' as super_in_extension;
 import 'top_level_instance_getter_test.dart' as top_level_instance_getter;
 import 'top_level_instance_method_test.dart' as top_level_instance_method;
 import 'type_check_is_not_null_test.dart' as type_check_is_not_null;
 import 'type_check_is_null_test.dart' as type_check_is_null;
 import 'unchecked_use_of_nullable_value_test.dart'
     as unchecked_use_of_nullable_value;
+import 'undefined_extension_getter_test.dart' as undefined_extension_getter;
+import 'undefined_extension_method_test.dart' as undefined_extension_method;
+import 'undefined_extension_setter_test.dart' as undefined_extension_setter;
 import 'undefined_getter_test.dart' as undefined_getter;
 import 'undefined_hidden_name_test.dart' as undefined_hidden_name;
 import 'undefined_identifier_test.dart' as undefined_identifier;
+import 'undefined_method_test.dart' as undefined_method;
 import 'undefined_operator_test.dart' as undefined_operator;
 import 'undefined_prefixed_name_test.dart' as undefined_prefixed_name;
 import 'undefined_setter_test.dart' as undefined_setter;
 import 'undefined_shown_name_test.dart' as undefined_shown_name;
 import 'unnecessary_cast_test.dart' as unnecessary_cast;
 import 'unnecessary_no_such_method_test.dart' as unnecessary_no_such_method;
+import 'unnecessary_non_null_assertion_test.dart'
+    as unnecessary_non_null_assertion;
 import 'unnecessary_null_aware_call_test.dart' as unnecessary_null_aware_call;
+import 'unnecessary_null_aware_spread_test.dart'
+    as unnecessary_null_aware_spread;
 import 'unnecessary_type_check_false_test.dart' as unnecessary_type_check_false;
 import 'unnecessary_type_check_true_test.dart' as unnecessary_type_check_true;
 import 'unused_catch_clause_test.dart' as unused_catch_clause;
@@ -176,10 +286,24 @@
 
 main() {
   defineReflectiveSuite(() {
+    access_static_extension_member.main();
+    ambiguous_export.main();
+    ambiguous_extension_method_access.main();
+    ambiguous_import.main();
     ambiguous_set_or_map_literal.main();
     argument_type_not_assignable.main();
+    assignment_to_const.main();
+    assignment_to_final_local.main();
+    assignment_to_final_no_setter.main();
+    assignment_to_final.main();
+    assignment_to_function.main();
+    assignment_to_method.main();
+    assignment_to_type.main();
     async_keyword_used_as_identifier.main();
     can_be_null_after_null_aware.main();
+    case_block_not_terminated.main();
+    cast_to_non_type.main();
+    concrete_class_with_abstract_member.main();
     const_constructor_param_type_mismatch.main();
     const_constructor_with_mixin_with_field.main();
     const_eval_throws_exception.main();
@@ -187,22 +311,46 @@
     const_set_element_type_implements_equals.main();
     const_spread_expected_list_or_set.main();
     const_spread_expected_map.main();
+    const_with_abstract_class.main();
     dead_code.main();
     default_list_constructor_mismatch.main();
     default_value_on_required_paramter.main();
+    deprecated_extends_function.main();
+    deprecated_function_class_declaration.main();
     deprecated_member_use.main();
+    deprecated_mixin_function.main();
     division_optimization.main();
+    down_cast_composite.main();
+    duplicate_hidden_name.main();
     duplicate_import.main();
+    duplicate_shown_name.main();
     equal_elements_in_const_set.main();
     equal_keys_in_const_map.main();
+    export_suplicated_library_named.main();
     expression_in_map.main();
     extends_non_class.main();
+    extension_declares_abstract_method.main();
+    extension_declares_constructor.main();
+    extension_declares_field.main();
+    extension_declares_member_of_object.main();
+    extension_override_access_to_static_member.main();
+    extension_override_argument_not_assignable.main();
+    extension_override_without_access.main();
+    extra_positional_arguments.main();
+    field_initialized_in_initializer_and_declaration.main();
+    field_initializer_not_assignable.main();
+    field_initializing_formal_not_assignable.main();
+    final_initialized_in_delcaration_and_constructor.main();
+    final_not_initialized_constructor.main();
     final_not_initialized.main();
     implements_non_class.main();
     implicit_this_reference_in_initializer.main();
     import_deferred_library_with_load_function.main();
+    import_duplicated_library_named.main();
+    import_of_non_library.main();
     invalid_assignment.main();
     invalid_cast_new_expr.main();
+    invalid_extension_argument_count.main();
     invalid_factory_annotation.main();
     invalid_factory_method_impl.main();
     invalid_immutable_annotation.main();
@@ -210,25 +358,45 @@
     invalid_optional_parameter_type.main();
     invalid_override_different_default_values_named.main();
     invalid_override_different_default_values_positional.main();
+    invalid_override.main();
+    invalid_reference_to_this.main();
     invalid_required_param.main();
     invalid_sealed_annotation.main();
+    invalid_use_of_covariant_in_extension.main();
+    invalid_use_of_never_value.main();
+    invalid_use_of_null_value.main();
     invalid_use_of_protected_member.main();
     invalid_use_of_visible_for_template_member.main();
     invalid_use_of_visible_for_testing_member.main();
     invalid_visibility_annotation.main();
+    is_double.main();
+    is_int.main();
+    is_not_double.main();
+    is_not_int.main();
     list_element_type_not_assignable.main();
     map_entry_not_in_map.main();
     map_key_type_not_assignable.main();
     map_value_type_not_assignable.main();
-    missing_default_value_for_paramter.main();
+    mismatched_getter_and_setter_types.main();
+    missing_default_value_for_parameter.main();
+    missing_enum_value_in_switch.main();
+    missing_js_lib_annotation.main();
     missing_required_param.main();
     missing_return.main();
+    mixed_return_types.main();
     mixin_of_non_class.main();
     mixin_on_sealed_class.main();
     mixin_super_class_constraint_non_interface.main();
     must_be_immutable.main();
     must_call_super.main();
+    new_with_abstract_class.main();
+    new_with_invalid_type_parameters.main();
+    new_with_non_type.main();
+    new_with_undefined_constructor.main();
+    non_abstract_class_inherits_abstract_member.main();
     non_bool_condition.main();
+    non_bool_negation_expression.main();
+    non_bool_operand.main();
     non_constant_if_element_condition_from_deferred_library.main();
     non_constant_list_element.main();
     non_constant_list_element_from_deferred_library.main();
@@ -241,9 +409,14 @@
     non_constant_set_element_from_deferred_library.main();
     non_constant_spread_expression_from_deferred_library.main();
     non_null_opt_out.main();
+    non_type_in_catch_clause.main();
+    non_void_return_for_operator.main();
+    non_void_return_for_setter.main();
+    not_a_type.main();
     not_assigned_potentially_non_nullable_local_variable.main();
-    not_initialized_non_nullable_static_field.main();
-    not_initialized_non_nullable_top_level_variable.main();
+    not_enough_required_arguments.main();
+    not_initialized_non_nullable_instance_field.main();
+    not_initialized_non_nullable_variable.main();
     not_iterable_spread.main();
     not_map_spread.main();
     not_null_aware_null_spread.main();
@@ -260,6 +433,12 @@
     override_on_non_overriding_getter.main();
     override_on_non_overriding_method.main();
     override_on_non_overriding_setter.main();
+    part_of_different_library.main();
+    redirect_to_invalid_function_type.main();
+    redirect_to_invalid_return_type.main();
+    redirect_to_missing_constructor.main();
+    redirect_to_non_class.main();
+    return_without_value.main();
     sdk_version_as_expression_in_const_context.main();
     sdk_version_async_exported_from_core.main();
     sdk_version_bool_operator.main();
@@ -269,23 +448,32 @@
     sdk_version_never.main();
     sdk_version_set_literal.main();
     sdk_version_ui_as_code.main();
+    sdk_version_ui_as_code_in_const_context.main();
     set_element_type_not_assignable.main();
+    static_access_to_instance_member.main();
     subtype_of_sealed_class.main();
+    super_in_extension.main();
     top_level_instance_getter.main();
     top_level_instance_method.main();
     type_check_is_not_null.main();
     type_check_is_null.main();
     unchecked_use_of_nullable_value.main();
+    undefined_extension_getter.main();
+    undefined_extension_method.main();
+    undefined_extension_setter.main();
     undefined_getter.main();
-    undefined_identifier.main();
     undefined_hidden_name.main();
+    undefined_identifier.main();
+    undefined_method.main();
     undefined_operator.main();
     undefined_prefixed_name.main();
     undefined_setter.main();
     undefined_shown_name.main();
     unnecessary_cast.main();
     unnecessary_no_such_method.main();
+    unnecessary_non_null_assertion.main();
     unnecessary_null_aware_call.main();
+    unnecessary_null_aware_spread.main();
     unnecessary_type_check_false.main();
     unnecessary_type_check_true.main();
     unused_catch_clause.main();
diff --git a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
index 906d4da..6f2981b 100644
--- a/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unchecked_use_of_nullable_value_test.dart
@@ -623,12 +623,14 @@
   }
 
   test_spread_nullable() async {
-    await assertErrorCodesInCode(r'''
+    await assertErrorsInCode(r'''
 m() {
   List? list;
   [...list];
 }
-''', [StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE]);
+''', [
+      error(StaticWarningCode.UNCHECKED_USE_OF_NULLABLE_VALUE, 26, 4),
+    ]);
   }
 
   test_spread_nullable_question() async {
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_extension_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_extension_getter_test.dart
new file mode 100644
index 0000000..3a99516
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_extension_getter_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.
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedExtensionGetterTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedExtensionGetterTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_defined() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  int get g => 0;
+}
+f() {
+  E('a').g;
+}
+''');
+  }
+
+  test_undefined() async {
+    await assertErrorsInCode('''
+extension E on String {}
+f() {
+  E('a').g;
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER, 40, 1),
+    ]);
+  }
+
+  test_undefined_withSetter() async {
+    await assertErrorsInCode('''
+extension E on String {
+  void set s(int x) {}
+}
+f() {
+  E('a').s += 1;
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_GETTER, 64, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_extension_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_extension_method_test.dart
new file mode 100644
index 0000000..d2a1f9f1
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_extension_method_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 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedExtensionMethodTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedExtensionMethodTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_method_defined() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  int m() => 0;
+}
+f() {
+  E('a').m();
+}
+''');
+  }
+
+  test_method_undefined() async {
+    await assertErrorsInCode('''
+extension E on String {}
+f() {
+  E('a').m();
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD, 40, 1),
+    ]);
+    var invocation = findNode.methodInvocation('m();');
+    assertMethodInvocation(
+      invocation,
+      null,
+      'dynamic',
+      expectedType: 'dynamic',
+    );
+  }
+
+  test_operator_defined() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  void operator +(int offset) {}
+}
+f() {
+  E('a') + 1;
+}
+''');
+  }
+
+  test_operator_undefined() async {
+    await assertErrorsInCode('''
+extension E on String {}
+f() {
+  E('a') + 1;
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_METHOD, 40, 1),
+    ]);
+    var binaryExpression = findNode.binary('+ 1');
+    assertElementNull(binaryExpression);
+    assertInvokeTypeNull(binaryExpression);
+    assertTypeDynamic(binaryExpression);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart
new file mode 100644
index 0000000..fab4c5d
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_extension_setter_test.dart
@@ -0,0 +1,46 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedExtensionSetterTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedExtensionSetterTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_defined() async {
+    await assertNoErrorsInCode('''
+extension E on String {
+  void set s(int x) {}
+}
+f() {
+  E('a').s = 1;
+}
+''');
+  }
+
+  test_undefined() async {
+    await assertErrorsInCode('''
+extension E on String {}
+f() {
+  E('a').s = 1;
+}
+''', [
+      error(CompileTimeErrorCode.UNDEFINED_EXTENSION_SETTER, 40, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
index 3958e85..52fcc72 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_getter_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UndefinedGetterTest);
+    defineReflectiveTests(UndefinedGetterWithExtensionMethodsTest);
   });
 }
 
@@ -92,12 +95,14 @@
   }
 
   test_nullMember_undefined() async {
-    await assertErrorCodesInCode(r'''
+    await assertErrorsInCode(r'''
 m() {
   Null _null;
   _null.foo;
 }
-''', [StaticTypeWarningCode.UNDEFINED_GETTER]);
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_GETTER, 28, 3),
+    ]);
   }
 
   test_promotedTypeParameter_regress35305() async {
@@ -112,3 +117,25 @@
     ]);
   }
 }
+
+@reflectiveTest
+class UndefinedGetterWithExtensionMethodsTest extends UndefinedGetterTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_withExtension() async {
+    await assertErrorsInCode(r'''
+class C {}
+
+extension E on C {}
+
+f(C c) {
+  c.a;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_GETTER, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
new file mode 100644
index 0000000..e0ba03f
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/undefined_method_test.dart
@@ -0,0 +1,82 @@
+// 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/dart/analysis/features.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UndefinedMethodTest);
+    defineReflectiveTests(UndefinedMethodWithExtensionMethodsTest);
+  });
+}
+
+@reflectiveTest
+class UndefinedMethodTest extends DriverResolutionTest {}
+
+@reflectiveTest
+class UndefinedMethodWithExtensionMethodsTest extends UndefinedMethodTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_withExtension() async {
+    await assertErrorsInCode(r'''
+class C {}
+
+extension E on C {
+  void a() {}
+}
+
+f(C c) {
+  c.c();
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_METHOD, 61, 1),
+    ]);
+  }
+
+  test_definedInPrivateExtension() async {
+    newFile('/test/lib/lib.dart', content: '''
+class B {}
+
+extension _ on B {
+  void a() {}
+}
+''');
+    await assertErrorsInCode(r'''
+import 'lib.dart';
+
+f(B b) {
+  b.a();
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+    ]);
+  }
+
+  test_definedInUnnamedExtension() async {
+    newFile('/test/lib/lib.dart', content: '''
+class C {}
+
+extension on C {
+  void a() {}
+}
+''');
+    await assertErrorsInCode(r'''
+import 'lib.dart';
+
+f(C c) {
+  c.a();
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_METHOD, 33, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
index 8ce6206..ee6452d 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_operator_test.dart
@@ -44,6 +44,17 @@
     ]);
   }
 
+  test_index_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x[0];
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 3),
+    ]);
+  }
+
   test_indexBoth() async {
     await assertErrorsInCode(r'''
 class A {}
@@ -133,6 +144,64 @@
     ]);
   }
 
+  test_minus_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x - 3;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+    ]);
+  }
+
+  test_minusEq_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x -= 1;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+    ]);
+  }
+
+  test_plus_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x + 3;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 1),
+    ]);
+  }
+
+  test_plusEq_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x += 1;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 20, 2),
+    ]);
+  }
+
+  test_postfixDec_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x--;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+    ]);
+  }
+
   test_postfixExpression() async {
     await assertNoErrorsInCode(r'''
 class A {}
@@ -158,6 +227,30 @@
 ''');
   }
 
+  test_postfixInc_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  x++;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 19, 2),
+    ]);
+  }
+
+  test_prefixDec_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  --x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+    ]);
+  }
+
   test_prefixExpression() async {
     await assertNoErrorsInCode(r'''
 class A {}
@@ -182,4 +275,28 @@
 }
 ''');
   }
+
+  test_prefixInc_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  ++x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 2),
+    ]);
+  }
+
+  test_unaryMinus_null() async {
+    await assertErrorsInCode(r'''
+m() {
+  Null x;
+  -x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 13, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 18, 1),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
index 827b77e..9340c2e 100644
--- a/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/undefined_setter_test.dart
@@ -2,14 +2,18 @@
 // for 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/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
+import 'undefined_getter_test.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UndefinedSetterTest);
+    defineReflectiveTests(UndefinedSetterWithExtensionMethodsTest);
   });
 }
 
@@ -44,3 +48,25 @@
     ]);
   }
 }
+
+@reflectiveTest
+class UndefinedSetterWithExtensionMethodsTest extends UndefinedGetterTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_withExtension() async {
+    await assertErrorsInCode(r'''
+class C {}
+
+extension E on C {}
+
+f(C c) {
+  c.a = 1;
+}
+''', [
+      error(StaticTypeWarningCode.UNDEFINED_SETTER, 46, 1),
+    ]);
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
index a7a5c1a..18e5f55 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_cast_test.dart
@@ -59,7 +59,7 @@
 
   test_generics() async {
     // dartbug.com/18953
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'dart:async';
 Future<int> f() => new Future.value(0);
 void g(bool c) {
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart
new file mode 100644
index 0000000..f7ccde3
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_non_null_assertion_test.dart
@@ -0,0 +1,41 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryNonNullAssertionTest);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryNonNullAssertionTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_parameter_nonNull() async {
+    await assertErrorsInCode('''
+f(int x) {
+  x!;
+}
+''', [
+      error(StaticWarningCode.UNNECESSARY_NON_NULL_ASSERTION, 14, 1),
+    ]);
+  }
+
+  test_parameter_nullable() async {
+    await assertNoErrorsInCode('''
+f(int? x) {
+  x!;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart
index 110b35b..b1317e4 100644
--- a/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_call_test.dart
@@ -27,7 +27,7 @@
   (x)?.isEven;
 }
 ''', [
-      error(HintCode.UNNECESSARY_NULL_AWARE_CALL, 16, 2),
+      error(StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL, 16, 2),
     ]);
   }
 
@@ -45,7 +45,7 @@
   x?.isEven;
 }
 ''', [
-      error(HintCode.UNNECESSARY_NULL_AWARE_CALL, 14, 2),
+      error(StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL, 14, 2),
     ]);
   }
 
@@ -63,7 +63,7 @@
   (x)?.round();
 }
 ''', [
-      error(HintCode.UNNECESSARY_NULL_AWARE_CALL, 16, 2),
+      error(StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL, 16, 2),
     ]);
   }
 
@@ -81,7 +81,7 @@
   x?.round();
 }
 ''', [
-      error(HintCode.UNNECESSARY_NULL_AWARE_CALL, 14, 2),
+      error(StaticWarningCode.UNNECESSARY_NULL_AWARE_CALL, 14, 2),
     ]);
   }
 
diff --git a/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_spread_test.dart b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_spread_test.dart
new file mode 100644
index 0000000..99d6199
--- /dev/null
+++ b/pkg/analyzer/test/src/diagnostics/unnecessary_null_aware_spread_test.dart
@@ -0,0 +1,52 @@
+// 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/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+import '../dart/resolution/driver_resolution.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(UnnecessaryNullAwareSpreadTest);
+  });
+}
+
+@reflectiveTest
+class UnnecessaryNullAwareSpreadTest extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_local_nonNullableSpread_nullableType() async {
+    await assertNoErrorsInCode('''
+f() {
+  List x = [];
+  [...x];
+}
+''');
+  }
+
+  test_local_nullableSpread_nonNullableType() async {
+    await assertErrorsInCode('''
+f() {
+  List x = [];
+  [...?x];
+}
+''', [
+      error(StaticWarningCode.UNNECESSARY_NULL_AWARE_SPREAD, 24, 4),
+    ]);
+  }
+
+  test_local_nullableSpread_nullableType() async {
+    await assertNoErrorsInCode('''
+f() {
+  List? x;
+  [...?x];
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
index 2159a68..0a78364 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_import_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UnusedImportTest);
+    defineReflectiveTests(UnusedImportWithExtensionMethodsTest);
   });
 }
 
@@ -224,3 +227,169 @@
     ]);
   }
 }
+
+@reflectiveTest
+class UnusedImportWithExtensionMethodsTest extends UnusedImportTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_instance_call() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on int {
+  int call(int x) => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  7(9);
+}
+''');
+  }
+
+  test_instance_getter() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String get empty => '';
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  ''.empty;
+}
+''');
+  }
+
+  test_instance_method() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String empty() => '';
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  ''.empty();
+}
+''');
+  }
+
+  test_instance_operator_binary() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String operator -(String s) => this;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  'abc' - 'c';
+}
+''');
+  }
+
+  test_instance_operator_index() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on int {
+  int operator [](int i) => 0;
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  9[7];
+}
+''');
+  }
+
+  test_instance_operator_unary() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  void operator -() {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  -'abc';
+}
+''');
+  }
+
+  test_instance_setter() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  void set length(int i) {}
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  'abc'.length = 2;
+}
+''');
+  }
+
+  test_multipleExtensions() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String a() => '';
+}
+''');
+    newFile('/test/lib/lib2.dart', content: r'''
+extension E on String {
+  String b() => '';
+}
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart';
+import 'lib2.dart';
+
+f() {
+  ''.b();
+}
+''', [
+      error(HintCode.UNUSED_IMPORT, 7, 11),
+    ]);
+  }
+
+  test_override_getter() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String get empty => '';
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  E('').empty;
+}
+''');
+  }
+
+  test_static_field() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  static const String empty = '';
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart';
+
+f() {
+  E.empty;
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
index 99b749b..804b8d8 100644
--- a/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/unused_shown_name_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/dart/analysis/features.dart';
 import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import '../dart/resolution/driver_resolution.dart';
@@ -10,6 +12,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UnusedShownNameTest);
+    defineReflectiveTests(UnusedShownNameWithExtensionMethodsTest);
   });
 }
 
@@ -20,7 +23,7 @@
 class A {}
 class B {}
 ''');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' show A, B;
 A a;
 ''', [
@@ -33,7 +36,7 @@
 class A {}
 class B {}
 ''');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' as p show A, B;
 p.A a;
 ''', [
@@ -48,7 +51,7 @@
 class C {}
 class D {}
 ''');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' show A, B;
 import 'lib1.dart' show C, D;
 A a;
@@ -66,7 +69,7 @@
 const int var3 = 3;
 const int var4 = 4;
 ''');
-    assertErrorsInCode(r'''
+    await assertErrorsInCode(r'''
 import 'lib1.dart' show var1, var2;
 import 'lib1.dart' show var3, var4;
 int a = var1;
@@ -77,3 +80,44 @@
     ]);
   }
 }
+
+@reflectiveTest
+class UnusedShownNameWithExtensionMethodsTest extends UnusedShownNameTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = new FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_instance_method_unused() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String empty() => '';
+}
+String s = '';
+''');
+    await assertErrorsInCode('''
+import 'lib1.dart' show E, s;
+
+f() {
+  s.length;
+}
+''', [
+      error(HintCode.UNUSED_SHOWN_NAME, 24, 1),
+    ]);
+  }
+
+  test_instance_method_used() async {
+    newFile('/test/lib/lib1.dart', content: r'''
+extension E on String {
+  String empty() => '';
+}
+''');
+    await assertNoErrorsInCode('''
+import 'lib1.dart' show E;
+
+f() {
+  ''.empty();
+}
+''');
+  }
+}
diff --git a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
index 3d0a5a4..322c773 100644
--- a/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/use_of_void_result_test.dart
@@ -2,18 +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/features.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
+import 'package:analyzer/src/error/codes.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
+import '../../generated/test_support.dart';
 import '../dart/resolution/driver_resolution.dart';
 
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(UseOfVoidResultTest);
+    defineReflectiveTests(UseOfVoidResultWithExtensionMethodsTest);
+    defineReflectiveTests(UseOfVoidResultTest_NonNullable);
   });
 }
 
 @reflectiveTest
 class UseOfVoidResultTest extends DriverResolutionTest {
+  test_andVoidLhsError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x && true;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
+    ]);
+  }
+
+  test_andVoidRhsError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  true && x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 34, 1),
+    ]);
+  }
+
+  test_assignmentToVoidParameterOk() async {
+    // Note: the spec may decide to disallow this, but at this point that seems
+    // highly unlikely.
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  f(x);
+}
+void f(void x) {}
+''');
+  }
+
+  test_assignToVoid_notStrong_error() async {
+    // See StrongModeStaticTypeAnalyzer2Test.test_assignToVoidOk
+    // for testing that this does not have errors in strong mode.
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  x = 42;
+}
+''');
+  }
+
   test_implicitReturnValue() async {
     await assertNoErrorsInCode(r'''
 f() {}
@@ -25,6 +77,29 @@
 ''');
   }
 
+  test_interpolateVoidValueError() async {
+    await assertErrorsInCode(r'''
+void main() {
+  void x;
+  "$x";
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 1),
+    ]);
+  }
+
+  test_negateVoidValueError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  !x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 1),
+    ]);
+  }
+
   test_nonVoidReturnValue() async {
     await assertNoErrorsInCode(r'''
 int f() => 1;
@@ -33,4 +108,485 @@
 }
 ''');
   }
+
+  test_orVoidLhsError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x || true;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
+    ]);
+  }
+
+  test_orVoidRhsError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  false || x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 35, 1),
+    ]);
+  }
+
+  test_throwVoidValueError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  throw x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 32, 1),
+    ]);
+  }
+
+  test_unaryNegativeVoidValueError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  -x;
+}
+''', [
+      // TODO(mfairhurst) suppress UNDEFINED_OPERATOR
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
+      error(StaticTypeWarningCode.UNDEFINED_OPERATOR, 26, 1),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 1),
+    ]);
+  }
+
+  test_useOfInForeachIterableError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  for (var v in x) {}
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 35, 1),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
+    ]);
+  }
+
+  test_useOfVoidAsIndexAssignError() async {
+    await assertErrorsInCode('''
+void main(List list) {
+  void x;
+  list[x] = null;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
+    ]);
+  }
+
+  test_useOfVoidAsIndexError() async {
+    await assertErrorsInCode('''
+void main(List list) {
+  void x;
+  list[x];
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 40, 1),
+    ]);
+  }
+
+  test_useOfVoidAssignedToDynamicError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  dynamic z = x;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 34, 1),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 38, 1),
+    ]);
+  }
+
+  test_useOfVoidByIndexingError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x[0];
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 27, 3),
+    ]);
+  }
+
+  test_useOfVoidCallSetterError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x.foo = null;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 3),
+    ]);
+  }
+
+  test_useOfVoidCastsOk() async {
+    await assertNoErrorsInCode('''
+void use(dynamic x) { }
+void main() {
+  void x;
+  use(x as int);
+}
+''');
+  }
+
+  test_useOfVoidInConditionalConditionError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x ? null : null;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
+    ]);
+  }
+
+  @failingTest
+  test_useOfVoidInConditionalLhsError() async {
+    // TODO(mfairhurst) Enable this.
+    await assertErrorsInCode('''
+void main(bool c) {
+  void x;
+  c ? x : null;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 36, 1),
+    ]);
+  }
+
+  @failingTest
+  test_useOfVoidInConditionalRhsError() async {
+    // TODO(mfairhurst) Enable this.
+    await assertErrorsInCode('''
+void main(bool c) {
+  void x;
+  c ? null : x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 43, 1),
+    ]);
+  }
+
+  test_useOfVoidInDoWhileConditionError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  do {} while (x);
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 39, 1),
+    ]);
+  }
+
+  test_useOfVoidInExpStmtOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  x;
+}
+''');
+  }
+
+  @failingTest // This test may be completely invalid.
+  test_useOfVoidInForeachVariableError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  for (x in [1, 2]) {}
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 31, 1),
+    ]);
+  }
+
+  test_useOfVoidInForPartsOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  for (x; false; x) {}
+}
+''');
+  }
+
+  test_useOfVoidInIsTestError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x is int;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
+    ]);
+  }
+
+  test_useOfVoidInListLiteralError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  <dynamic>[x];
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 36, 1),
+    ]);
+  }
+
+  test_useOfVoidInListLiteralOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  <void>[x]; // not strong mode; we have to specify <void>.
+}
+''');
+  }
+
+  test_useOfVoidInMapLiteralKeyError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  var m2 = <dynamic, int>{x : 4};
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 2),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 50, 1),
+    ]);
+  }
+
+  test_useOfVoidInMapLiteralKeyOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  var m2 = <void, int>{x : 4}; // not strong mode; we have to specify <void>.
+}
+''');
+  }
+
+  test_useOfVoidInMapLiteralValueError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  var m1 = <int, dynamic>{4: x};
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 30, 2),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 53, 1),
+    ]);
+  }
+
+  test_useOfVoidInMapLiteralValueOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  var m1 = <int, void>{4: x}; // not strong mode; we have to specify <void>.
+}
+''');
+  }
+
+  test_useOfVoidInNullOperatorLhsError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x ?? 499;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 26, 1),
+    ]);
+  }
+
+  test_useOfVoidInNullOperatorRhsOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  null ?? x;
+}
+''');
+  }
+
+  test_useOfVoidInSpecialAssignmentError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x += 1;
+}
+''', [
+      error(HintCode.UNUSED_LOCAL_VARIABLE, 21, 1),
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 2),
+    ]);
+  }
+
+  test_useOfVoidInSwitchExpressionError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  switch(x) {}
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 33, 1),
+    ]);
+  }
+
+  test_useOfVoidInWhileConditionError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  while (x) {};
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 33, 1),
+    ]);
+  }
+
+  test_useOfVoidNullPropertyAccessError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x?.foo;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 29, 3),
+    ]);
+  }
+
+  test_useOfVoidPropertyAccessError() async {
+    await assertErrorsInCode('''
+void main() {
+  void x;
+  x.foo;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 28, 3),
+    ]);
+  }
+
+  @failingTest
+  test_useOfVoidReturnInNonVoidFunctionError() async {
+    // TODO(mfairhurst) Get this test to pass once codebase is compliant.
+    await assertErrorsInCode('''
+dynamic main() {
+  void x;
+  return x;
+}
+''', [
+      error(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, 36, 1),
+    ]);
+  }
+
+  test_useOfVoidReturnInVoidFunctionOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  return x;
+}
+''');
+  }
+
+  test_useOfVoidWhenArgumentError() async {
+    await assertErrorsInCode('''
+void use(dynamic x) { }
+void main() {
+  void x;
+  use(x);
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 54, 1),
+    ]);
+  }
+
+  test_useOfVoidWithInitializerOk() async {
+    await assertNoErrorsInCode('''
+void main() {
+  void x;
+  void y = x;
+}
+''');
+  }
+
+  test_yieldStarVoid_asyncStar() async {
+    await assertErrorsInCode('''
+main(void x) async* {
+  yield* x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 31, 1),
+    ]);
+  }
+
+  test_yieldStarVoid_syncStar() async {
+    await assertErrorsInCode('''
+main(void x) sync* {
+  yield* x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 30, 1),
+    ]);
+  }
+
+  test_yieldVoid_asyncStar() async {
+    await assertErrorsInCode('''
+main(void x) async* {
+  yield x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 30, 1),
+    ]);
+  }
+
+  test_yieldVoid_syncStar() async {
+    await assertErrorsInCode('''
+main(void x) sync* {
+  yield x;
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 29, 1),
+    ]);
+  }
+}
+
+@reflectiveTest
+class UseOfVoidResultTest_NonNullable extends DriverResolutionTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions =>
+      AnalysisOptionsImpl()..enabledExperiments = [EnableString.non_nullable];
+
+  test_bang_nonVoid() async {
+    await assertNoErrorsInCode(r'''
+int? f() => 1;
+g() {
+  f()!;
+}
+''');
+  }
+
+  test_bang_void() async {
+    await assertErrorsInCode(r'''
+void f() => 1;
+g() {
+  f()!;
+}
+''', [ExpectedError(StaticWarningCode.USE_OF_VOID_RESULT, 23, 4)]);
+  }
+}
+
+@reflectiveTest
+class UseOfVoidResultWithExtensionMethodsTest extends UseOfVoidResultTest {
+  @override
+  AnalysisOptionsImpl get analysisOptions => AnalysisOptionsImpl()
+    ..contextFeatures = FeatureSet.forTesting(
+        sdkVersion: '2.3.0', additionalFeatures: [Feature.extension_methods]);
+
+  test_useOfVoidReturnInExtensionMethod() async {
+    await assertErrorsInCode('''
+extension on void {
+  testVoid() {
+    // No access on void. Static type of `this` is void!
+    this.toString();
+  }
+}
+''', [
+      error(StaticWarningCode.USE_OF_VOID_RESULT, 96, 4),
+    ]);
+  }
 }
diff --git a/pkg/analyzer/test/src/diagnostics/wrong_type_parameter_variance_in_superinterface_test.dart b/pkg/analyzer/test/src/diagnostics/wrong_type_parameter_variance_in_superinterface_test.dart
index 5815369..70860b2 100644
--- a/pkg/analyzer/test/src/diagnostics/wrong_type_parameter_variance_in_superinterface_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/wrong_type_parameter_variance_in_superinterface_test.dart
@@ -316,11 +316,20 @@
 class B<X> extends A<void Function<Y extends X>()> {}
 ''', [
         error(
-          CompileTimeErrorCode.WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
-          22,
-          1,
-        ),
+            CompileTimeErrorCode
+                .WRONG_TYPE_PARAMETER_VARIANCE_IN_SUPERINTERFACE,
+            22,
+            1),
+        error(
+            CompileTimeErrorCode.GENERIC_FUNCTION_TYPE_CANNOT_BE_TYPE_ARGUMENT,
+            35,
+            28),
       ]);
+      if (!AnalysisDriver.useSummary2) {
+        throw 'Test passed - expected to fail.';
+      }
+    } on String {
+      rethrow;
     } catch (_) {
       // TODO(scheglov) This code crashes with summary1.
 //    NoSuchMethodError: The getter 'bound' was called on null.
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 8761698..028dbdd 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
@@ -4,6 +4,7 @@
 
 import 'dart:async';
 
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/lint/linter.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
@@ -32,6 +33,7 @@
       result.session.declaredVariables,
       result.typeProvider,
       result.typeSystem,
+      InheritanceManager3(result.typeSystem),
       analysisOptions,
     );
   }
diff --git a/pkg/analyzer/test/src/services/available_declarations_test.dart b/pkg/analyzer/test/src/services/available_declarations_test.dart
index 38bd97b..a80aeb9 100644
--- a/pkg/analyzer/test/src/services/available_declarations_test.dart
+++ b/pkg/analyzer/test/src/services/available_declarations_test.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
 import 'package:analyzer/src/dart/analysis/byte_store.dart';
 import 'package:analyzer/src/dart/analysis/driver_based_analysis_context.dart';
+import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/services/available_declarations.dart';
 import 'package:analyzer/src/test_utilities/mock_sdk.dart';
 import 'package:analyzer/src/test_utilities/resource_provider_mixin.dart';
@@ -33,6 +34,10 @@
 
   AnalysisContext testAnalysisContext;
 
+  /// The file system specific `/home/test/analysis_options.yaml` path.
+  String get analysisOptionsPath =>
+      convertPath('/home/test/analysis_options.yaml');
+
   void addDotPackagesDependency(String path, String name, String rootPath) {
     var packagesFile = getFile(path);
 
@@ -72,6 +77,23 @@
     testAnalysisContext = getContext(testPath);
   }
 
+  /// Create an analysis options file based on the given arguments.
+  void createAnalysisOptionsFile({List<String> experiments}) {
+    var buffer = StringBuffer();
+    if (experiments != null) {
+      buffer.writeln('analyzer:');
+      buffer.writeln('  enable-experiment:');
+      for (var experiment in experiments) {
+        buffer.writeln('    - $experiment');
+      }
+    }
+    newFile(analysisOptionsPath, content: buffer.toString());
+
+    if (analysisContextCollection != null) {
+      createAnalysisContexts();
+    }
+  }
+
   /// Return the existing analysis context that should be used to analyze the
   /// given [path], or throw [StateError] if the [path] is not analyzed in any
   /// of the created analysis contexts.
@@ -1358,6 +1380,47 @@
     );
   }
 
+  test_EXTENSION() async {
+    createAnalysisOptionsFile(experiments: [EnableString.extension_methods]);
+    newFile('/home/test/lib/test.dart', content: r'''
+extension A on String {}
+
+extension on String {}
+
+@deprecated
+extension B on String {}
+
+/// aaa
+///
+/// bbb bbb
+/// ccc ccc
+extension C on String {}
+''');
+
+    tracker.addContext(testAnalysisContext);
+    await _doAllTrackerWork();
+
+    var library = _getLibrary('package:test/test.dart');
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'A'),
+      'A',
+      DeclarationKind.EXTENSION,
+    );
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'B'),
+      'B',
+      DeclarationKind.EXTENSION,
+      isDeprecated: true,
+    );
+    _assertDeclaration(
+      _getDeclaration(library.declarations, 'C'),
+      'C',
+      DeclarationKind.EXTENSION,
+      docSummary: 'aaa',
+      docComplete: 'aaa\n\nbbb bbb\nccc ccc',
+    );
+  }
+
   test_FUNCTION() async {
     newFile('/home/test/lib/test.dart', content: r'''
 void a() {}
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 14354cc..d810032 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -331,6 +331,26 @@
     }
   }
 
+  void writeExtensionElement(ExtensionElement e) {
+    writeDocumentation(e);
+    writeMetadata(e, '', '\n');
+
+    buffer.write('extension ');
+    writeName(e);
+    writeCodeRange(e);
+    writeTypeParameterElements(e.typeParameters);
+    if (e.extendedType != null) {
+      buffer.write(' on ');
+      writeType(e.extendedType);
+    }
+
+    buffer.writeln(' {');
+    e.fields.forEach(writePropertyInducingElement);
+    e.accessors.forEach(writePropertyAccessorElement);
+    e.methods.forEach(writeMethodElement);
+    buffer.writeln('}');
+  }
+
   void writeFunctionElement(FunctionElement e) {
     writeDocumentation(e);
     writeMetadata(e, '', '\n');
@@ -899,7 +919,8 @@
       }
     }
 
-    if (e.enclosingElement is ClassElement) {
+    if (e.enclosingElement is ClassElement ||
+        e.enclosingElement is ExtensionElement) {
       writeDocumentation(e, '  ');
       writeMetadata(e, '  ', '\n');
 
@@ -1016,6 +1037,7 @@
     e.enums.forEach(writeClassElement);
     e.types.forEach(writeClassElement);
     e.mixins.forEach(writeClassElement);
+    e.extensions.forEach(writeExtensionElement);
     e.topLevelVariables.forEach(writePropertyInducingElement);
     e.accessors.forEach(writePropertyAccessorElement);
     e.functions.forEach(writeFunctionElement);
@@ -1078,7 +1100,7 @@
 
     ElementLocation location = element.location;
     List<String> components = location.components.toList();
-    if (components.length >= 1) {
+    if (components.isNotEmpty) {
       components[0] = onlyName(components[0]);
     }
     if (components.length >= 2) {
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
index 8d7a3e5..d3dbb1d 100644
--- a/pkg/analyzer/test/src/summary/linker_test.dart
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/link.dart';
@@ -12,6 +13,7 @@
 import 'test_strategies.dart';
 
 main() {
+  if (AnalysisDriver.useSummary2) return;
   defineReflectiveSuite(() {
     defineReflectiveTests(LinkerUnitTest);
   });
diff --git a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
index 9daafee..ff8a21e 100644
--- a/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
+++ b/pkg/analyzer/test/src/summary/package_bundle_reader_test.dart
@@ -187,6 +187,9 @@
   List<String> unlinkedUnitUris;
 
   @override
+  LinkedNodeBundle bundle2;
+
+  @override
   noSuchMethod(Invocation invocation) {
     throw new StateError('Unexpected invocation of ${invocation.memberName}');
   }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index b4acb72..a37bd09 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -2,6 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
 import 'element_text.dart';
@@ -9,6 +10,7 @@
 import 'test_strategies.dart';
 
 main() {
+  if (AnalysisDriver.useSummary2) return;
   defineReflectiveSuite(() {
     defineReflectiveTests(ApplyCheckElementTextReplacements);
     defineReflectiveTests(ResynthesizeAstStrongTest);
@@ -25,6 +27,12 @@
 @reflectiveTest
 class ResynthesizeAstStrongTest extends ResynthesizeTestStrategyTwoPhase
     with ResynthesizeTestCases, GetElementTestCases, ResynthesizeTestHelpers {
+  @override
+  @failingTest
+  test_codeRange_extensions() async {
+    await super.test_codeRange_extensions();
+  }
+
   @failingTest // See dartbug.com/32290
   test_const_constructor_inferred_args() =>
       super.test_const_constructor_inferred_args();
@@ -35,15 +43,42 @@
   @failingTest // See dartbug.com/33441
   test_const_map_inferredType() => super.test_const_map_inferredType();
 
+  @FailingTest(
+      reason: "NoSuchMethodError: Class 'ExtensionElementForLink' has no "
+          "instance method 'getGetter' with matching arguments.")
+  test_const_reference_staticMethod_ofExtension() async {
+    await super.test_const_reference_staticMethod_ofExtension();
+  }
+
   @failingTest // See dartbug.com/33441
   test_const_set_inferredType() => super.test_const_set_inferredType();
 
   @override
   @failingTest
+  test_defaultValue_refersToExtension_method_inside() async {
+    await super.test_defaultValue_refersToExtension_method_inside();
+  }
+
+  @override
+  @failingTest
   test_defaultValue_refersToGenericClass() async {
     await super.test_defaultValue_refersToGenericClass();
   }
 
+  @FailingTest(
+    reason: 'Inference for extension fields is not implemented in summary1.',
+  )
+  test_duplicateDeclaration_extension() async {
+    await super.test_duplicateDeclaration_extension();
+  }
+
+  @FailingTest(
+    reason: 'Inference for extension fields is not implemented in summary1.',
+  )
+  test_extension_field_inferredType_const() async {
+    await super.test_extension_field_inferredType_const();
+  }
+
   @override
   @failingTest
   test_infer_generic_typedef_complex() async {
@@ -52,7 +87,20 @@
 
   @override
   @failingTest
+  test_metadata_extensionDeclaration() async {
+    await super.test_metadata_extensionDeclaration();
+  }
+
+  @override
+  @failingTest
   test_syntheticFunctionType_inGenericClass() async {
     await super.test_syntheticFunctionType_inGenericClass();
   }
+
+  @FailingTest(
+      reason: "NoSuchMethodError: Class 'ExtensionElementForLink' has no "
+          "instance method 'getGetter' with matching arguments.")
+  test_variable_initializer_staticMethod_ofExtension() async {
+    await super.test_variable_initializer_staticMethod_ofExtension();
+  }
 }
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index 4e184c6..ff7f676 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -208,6 +208,9 @@
 mixin ResynthesizeTestCases implements ResynthesizeTestHelpers {
   FeatureSet get disableNnbd => FeatureSet.forTesting(sdkVersion: '2.2.2');
 
+  FeatureSet get enableExtensionMethods =>
+      FeatureSet.forTesting(additionalFeatures: [Feature.extension_methods]);
+
   FeatureSet get enableNnbd =>
       FeatureSet.forTesting(additionalFeatures: [Feature.non_nullable]);
 
@@ -1104,6 +1107,19 @@
 ''');
   }
 
+  test_class_getter_native() async {
+    var library = await checkLibrary('''
+class C {
+  int get x() native;
+}
+''');
+    checkElementText(library, r'''
+class C {
+  external int get x;
+}
+''');
+  }
+
   test_class_getter_static() async {
     var library = await checkLibrary('class C { static int get x => null; }');
     checkElementText(library, r'''
@@ -1218,6 +1234,19 @@
 ''');
   }
 
+  test_class_method_native() async {
+    var library = await checkLibrary('''
+class C {
+  int m() native;
+}
+''');
+    checkElementText(library, r'''
+class C {
+  external int m() {}
+}
+''');
+  }
+
   test_class_method_params() async {
     var library = await checkLibrary('class C { f(x, y) {} }');
     checkElementText(library, r'''
@@ -1618,6 +1647,19 @@
 ''');
   }
 
+  test_class_setter_native() async {
+    var library = await checkLibrary('''
+class C {
+  void set x(int value) native;
+}
+''');
+    checkElementText(library, r'''
+class C {
+  external void set x(int value);
+}
+''');
+  }
+
   test_class_setter_static() async {
     var library =
         await checkLibrary('class C { static void set x(int value) {} }');
@@ -2018,6 +2060,68 @@
         withConstElements: false);
   }
 
+  test_codeRange_extensions() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+class A {}
+
+extension Raw on A {}
+
+/// Comment 1.
+/// Comment 2.
+extension HasDocComment on A {}
+
+@Object()
+extension HasAnnotation on A {}
+
+@Object()
+/// Comment 1.
+/// Comment 2.
+extension AnnotationThenComment on A {}
+
+/// Comment 1.
+/// Comment 2.
+@Object()
+extension CommentThenAnnotation on A {}
+
+/// Comment 1.
+@Object()
+/// Comment 2.
+extension CommentAroundAnnotation on A {}
+''');
+    checkElementText(
+        library,
+        r'''
+class A/*codeOffset=0, codeLength=10*/ {
+}
+extension Raw/*codeOffset=12, codeLength=21*/ on A {
+}
+/// Comment 1.
+/// Comment 2.
+extension HasDocComment/*codeOffset=35, codeLength=61*/ on A {
+}
+@Object()
+extension HasAnnotation/*codeOffset=98, codeLength=41*/ on A {
+}
+/// Comment 1.
+/// Comment 2.
+@Object()
+extension AnnotationThenComment/*codeOffset=141, codeLength=79*/ on A {
+}
+/// Comment 1.
+/// Comment 2.
+@Object()
+extension CommentThenAnnotation/*codeOffset=222, codeLength=79*/ on A {
+}
+/// Comment 2.
+@Object()
+extension CommentAroundAnnotation/*codeOffset=318, codeLength=66*/ on A {
+}
+''',
+        withCodeRanges: true,
+        withConstElements: false);
+  }
+
   test_codeRange_field() async {
     var library = await checkLibrary('''
 class C {
@@ -3605,6 +3709,27 @@
 ''');
   }
 
+  test_const_reference_staticMethod_ofExtension() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+class A {}
+extension E on A {
+  static void f() {}
+}
+const x = E.f;
+''');
+    checkElementText(library, r'''
+class A {
+}
+extension E on A {
+  static void f() {}
+}
+const void Function() x =
+        E/*location: test.dart;E*/.
+        f/*location: test.dart;E;f*/;
+''');
+  }
+
   test_const_reference_topLevelFunction() async {
     var library = await checkLibrary(r'''
 foo() {}
@@ -5121,6 +5246,26 @@
 ''');
   }
 
+  test_defaultValue_refersToExtension_method_inside() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+class A {}
+extension E on A {
+  static void f() {}
+  static void g([Object p = f]) {}
+}
+''');
+    checkElementText(library, r'''
+class A {
+}
+extension E on A {
+  static void f() {}
+  static void g([Object p =
+        f/*location: test.dart;E;f*/]) {}
+}
+''');
+  }
+
   test_defaultValue_refersToGenericClass() async {
     var library = await checkLibrary('''
 class B<T1, T2> {
@@ -5353,6 +5498,165 @@
     }
   }
 
+  test_duplicateDeclaration_class() async {
+    var library = await checkLibrary(r'''
+class A {}
+class A {
+  var x;
+}
+class A {
+  var y = 0;
+}
+''');
+    checkElementText(library, r'''
+class A {
+}
+class A {
+  dynamic x;
+}
+class A {
+  int y;
+}
+''');
+  }
+
+  test_duplicateDeclaration_classTypeAlias() async {
+    var library = await checkLibrary(r'''
+class A {}
+class B {}
+class X = A with M;
+class X = B with M;
+mixin M {}
+''');
+    checkElementText(library, r'''
+class A {
+}
+class B {
+}
+class alias X extends A with M {
+  synthetic X() = A;
+}
+class alias X extends B with M {
+  synthetic X() = B;
+}
+mixin M on Object {
+}
+''');
+  }
+
+  test_duplicateDeclaration_enum() async {
+    var library = await checkLibrary(r'''
+enum E {a, b}
+enum E {c, d, e}
+''');
+    checkElementText(library, r'''
+enum E {
+  synthetic final int index;
+  synthetic static const List<E> values;
+  static const E a;
+  static const E b;
+  String toString() {}
+}
+enum E {
+  synthetic final int index;
+  synthetic static const List<E> values;
+  static const E c;
+  static const E d;
+  static const E e;
+  String toString() {}
+}
+''');
+  }
+
+  test_duplicateDeclaration_extension() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary(r'''
+class A {}
+extension E on A {}
+extension E on A {
+  static var x;
+}
+extension E on A {
+  static var y = 0;
+}
+''');
+    checkElementText(library, r'''
+class A {
+}
+extension E on A {
+}
+extension E on A {
+  static dynamic x;
+}
+extension E on A {
+  static int y;
+}
+''');
+  }
+
+  test_duplicateDeclaration_function() async {
+    var library = await checkLibrary(r'''
+void f() {}
+void f(int a) {}
+void f([int b, double c]) {}
+''');
+    checkElementText(library, r'''
+void f() {}
+void f(int a) {}
+void f([int b], [double c]) {}
+''');
+  }
+
+  test_duplicateDeclaration_functionTypeAlias() async {
+    var library = await checkLibrary(r'''
+typedef void F();
+typedef void F(int a);
+typedef void F([int b, double c]);
+''');
+    checkElementText(library, r'''
+typedef F = void Function();
+typedef F = void Function(int a);
+typedef F = void Function([int b], [double c]);
+''');
+  }
+
+  test_duplicateDeclaration_mixin() async {
+    var library = await checkLibrary(r'''
+mixin A {}
+mixin A {
+  var x;
+}
+mixin A {
+  var y = 0;
+}
+''');
+    checkElementText(library, r'''
+mixin A on Object {
+}
+mixin A on Object {
+  dynamic x;
+}
+mixin A on Object {
+  int y;
+}
+''');
+  }
+
+  test_duplicateDeclaration_topLevelVariable() async {
+    var library = await checkLibrary(r'''
+bool x;
+var x;
+var x = 1;
+var x = 2.3;
+''');
+    checkElementText(library, r'''
+bool x;
+dynamic x;
+int x;
+double x;
+''');
+  }
+
   test_enum_documented() async {
     var library = await checkLibrary('''
 // Extra comment so doc comment offset != 0
@@ -5522,8 +5826,9 @@
   }
 
   test_export_configurations_useDefault() async {
-    declaredVariables =
-        new DeclaredVariables.fromMap({'dart.library.io': 'false'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5546,8 +5851,10 @@
   }
 
   test_export_configurations_useFirst() async {
-    declaredVariables = new DeclaredVariables.fromMap(
-        {'dart.library.io': 'true', 'dart.library.html': 'true'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5570,8 +5877,10 @@
   }
 
   test_export_configurations_useSecond() async {
-    declaredVariables = new DeclaredVariables.fromMap(
-        {'dart.library.io': 'false', 'dart.library.html': 'true'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5775,8 +6084,9 @@
   }
 
   test_exportImport_configurations_useDefault() async {
-    declaredVariables =
-        new DeclaredVariables.fromMap({'dart.library.io': 'false'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5799,8 +6109,10 @@
   }
 
   test_exportImport_configurations_useFirst() async {
-    declaredVariables = new DeclaredVariables.fromMap(
-        {'dart.library.io': 'true', 'dart.library.html': 'true'});
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'true',
+      'dart.library.html': 'false',
+    });
     addLibrarySource('/foo.dart', 'class A {}');
     addLibrarySource('/foo_io.dart', 'class A {}');
     addLibrarySource('/foo_html.dart', 'class A {}');
@@ -5822,6 +6134,32 @@
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
+  test_exportImport_configurations_useSecond() async {
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    });
+    addLibrarySource('/foo.dart', 'class A {}');
+    addLibrarySource('/foo_io.dart', 'class A {}');
+    addLibrarySource('/foo_html.dart', 'class A {}');
+    addLibrarySource('/bar.dart', r'''
+export 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+''');
+    var library = await checkLibrary(r'''
+import 'bar.dart';
+class B extends A {}
+''');
+    checkElementText(library, r'''
+import 'bar.dart';
+class B extends A {
+}
+''');
+    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
   test_exports() async {
     addLibrarySource('/a.dart', 'library a;');
     addLibrarySource('/b.dart', 'library b;');
@@ -5851,6 +6189,35 @@
 ''');
   }
 
+  test_extension_documented_tripleSlash() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+/// aaa
+/// bbbb
+/// cc
+extension E on int {}''');
+    checkElementText(library, r'''
+/// aaa
+/// bbbb
+/// cc
+extension E on int {
+}
+''');
+  }
+
+  test_extension_field_inferredType_const() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+extension E on int {
+  static const x = 0;
+}''');
+    checkElementText(library, r'''
+extension E on int {
+  static const int x = 0;
+}
+''');
+  }
+
   test_field_covariant() async {
     var library = await checkLibrary('''
 class C {
@@ -6471,6 +6838,21 @@
 ''');
   }
 
+  test_genericTypeAlias_recursive() async {
+    var library = await checkLibrary('''
+typedef F<X extends F> = Function(F);
+''');
+    if (isAstBasedSummary) {
+      checkElementText(library, r'''
+notSimplyBounded typedef F<X> = dynamic Function();
+''');
+    } else {
+      checkElementText(library, r'''
+notSimplyBounded typedef F<X extends dynamic Function(...)> = dynamic Function(dynamic Function(...) );
+''');
+    }
+  }
+
   test_getter_documented() async {
     var library = await checkLibrary('''
 // Extra comment so doc comment offset != 0
@@ -6610,6 +6992,78 @@
     expect(typeA.element.source.shortName, 'foo_io.dart');
   }
 
+  test_import_configurations_useFirst_eqTrue() async {
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'true',
+      'dart.library.html': 'true',
+    });
+    addLibrarySource('/foo.dart', 'class A {}');
+    addLibrarySource('/foo_io.dart', 'class A {}');
+    addLibrarySource('/foo_html.dart', 'class A {}');
+    var library = await checkLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io == 'true') 'foo_io.dart'
+  if (dart.library.html == 'true') 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+import 'foo_io.dart';
+class B extends A {
+}
+''');
+    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    expect(typeA.element.source.shortName, 'foo_io.dart');
+  }
+
+  test_import_configurations_useSecond() async {
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    });
+    addLibrarySource('/foo.dart', 'class A {}');
+    addLibrarySource('/foo_io.dart', 'class A {}');
+    addLibrarySource('/foo_html.dart', 'class A {}');
+    var library = await checkLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io) 'foo_io.dart'
+  if (dart.library.html) 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+import 'foo_html.dart';
+class B extends A {
+}
+''');
+    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
+  test_import_configurations_useSecond_eqTrue() async {
+    declaredVariables = new DeclaredVariables.fromMap({
+      'dart.library.io': 'false',
+      'dart.library.html': 'true',
+    });
+    addLibrarySource('/foo.dart', 'class A {}');
+    addLibrarySource('/foo_io.dart', 'class A {}');
+    addLibrarySource('/foo_html.dart', 'class A {}');
+    var library = await checkLibrary(r'''
+import 'foo.dart'
+  if (dart.library.io == 'true') 'foo_io.dart'
+  if (dart.library.html == 'true') 'foo_html.dart';
+
+class B extends A {}
+''');
+    checkElementText(library, r'''
+import 'foo_html.dart';
+class B extends A {
+}
+''');
+    var typeA = library.definingCompilationUnit.getType('B').supertype;
+    expect(typeA.element.source.shortName, 'foo_html.dart');
+  }
+
   test_import_deferred() async {
     addLibrarySource('/a.dart', 'f() {}');
     var library = await checkLibrary('''
@@ -8201,6 +8655,27 @@
 ''');
   }
 
+  test_metadata_extensionDeclaration() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary(r'''
+const a = null;
+class A {}
+@a
+@Object()
+extension E on A {}''');
+    checkElementText(library, r'''
+class A {
+}
+@
+        a/*location: test.dart;a?*/
+@
+        Object/*location: dart:core;Object*/()
+extension E on A {
+}
+const dynamic a = null;
+''');
+  }
+
   test_metadata_fieldDeclaration() async {
     var library = await checkLibrary('const a = null; class C { @a int x; }');
     checkElementText(library, r'''
@@ -9580,6 +10055,29 @@
 ''');
   }
 
+  test_type_inference_field_depends_onFieldFormal() async {
+    var library = await checkLibrary('''
+class A<T> {
+  T value;
+
+  A(this.value);
+}
+
+class B {
+  var a = new A('');
+}
+''');
+    checkElementText(library, r'''
+class A<T> {
+  T value;
+  A(T this.value);
+}
+class B {
+  A<String> a;
+}
+''');
+  }
+
   test_type_inference_fieldFormal_depends_onField() async {
     var library = await checkLibrary('''
 class A<T> {
@@ -9716,6 +10214,28 @@
 ''');
   }
 
+  test_type_never_disableNnbd() async {
+    featureSet = disableNnbd;
+    var library = await checkLibrary('Never d;');
+    checkElementText(
+        library,
+        r'''
+Never* d;
+''',
+        annotateNullability: true);
+  }
+
+  test_type_never_enableNnbd() async {
+    featureSet = enableNnbd;
+    var library = await checkLibrary('Never d;');
+    checkElementText(
+        library,
+        r'''
+Never d;
+''',
+        annotateNullability: true);
+  }
+
   test_type_param_generic_function_type_nullability_legacy() async {
     featureSet = disableNnbd;
     var library = await checkLibrary('''
@@ -10758,6 +11278,25 @@
 ''');
   }
 
+  test_variable_initializer_staticMethod_ofExtension() async {
+    featureSet = enableExtensionMethods;
+    var library = await checkLibrary('''
+class A {}
+extension E on A {
+  static int f() => 0;
+}
+var x = E.f();
+''');
+    checkElementText(library, r'''
+class A {
+}
+extension E on A {
+  static int f() {}
+}
+int x;
+''');
+  }
+
   test_variable_initializer_untyped() async {
     var library = await checkLibrary('var v = 0;');
     checkElementText(library, r'''
diff --git a/pkg/analyzer/test/src/task/options_test.dart b/pkg/analyzer/test/src/task/options_test.dart
index e93a4af..d7637d1 100644
--- a/pkg/analyzer/test/src/task/options_test.dart
+++ b/pkg/analyzer/test/src/task/options_test.dart
@@ -49,6 +49,24 @@
   YamlMap parseOptions(String source) =>
       optionsProvider.getOptionsFromString(source);
 
+  test_configure_chromeos_checks() {
+    configureContext('''
+analyzer:
+  optional-checks:
+    chrome-os-manifest-checks
+''');
+    expect(true, analysisOptions.chromeOsManifestChecks);
+  }
+
+  test_configure_chromeos_checks_map() {
+    configureContext('''
+analyzer:
+  optional-checks:
+    chrome-os-manifest-checks : true
+''');
+    expect(true, analysisOptions.chromeOsManifestChecks);
+  }
+
   test_configure_error_processors() {
     configureContext('''
 analyzer:
@@ -126,24 +144,6 @@
     List<String> names = analysisOptions.enabledPluginNames;
     expect(names, ['angular2']);
   }
-
-  test_configure_chromeos_checks() {
-    configureContext('''
-analyzer:
-  optional-checks:
-    chrome-os-manifest-checks
-''');
-    expect(true, analysisOptions.chromeOsManifestChecks);
-  }
-
-  test_configure_chromeos_checks_map() {
-    configureContext('''
-analyzer:
-  optional-checks:
-    chrome-os-manifest-checks : true
-''');
-    expect(true, analysisOptions.chromeOsManifestChecks);
-  }
 }
 
 @reflectiveTest
@@ -188,11 +188,7 @@
                 '_PLUS');
       } else if (errorType == StrongModeCode) {
         void removeCode(StrongModeCode code) {
-          String name = code.name;
-          declaredNames.remove(name);
-          if (name.startsWith('STRONG_MODE_')) {
-            declaredNames.remove(name.substring(12));
-          }
+          declaredNames.remove(code.name);
         }
 
         removeCode(StrongModeCode.DOWN_CAST_COMPOSITE);
@@ -430,7 +426,7 @@
     validate('''
 analyzer:
   errors:
-    strong_mode_assignment_cast: ignore
+    assignment_cast: ignore
 ''', []);
   }
 
@@ -479,22 +475,6 @@
     ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUES]);
   }
 
-  test_linter_supported_rules() {
-    Registry.ruleRegistry.register(new TestRule());
-    validate('''
-linter:
-  rules:
-    - fantastic_test_rule
-    ''', []);
-  }
-
-  test_linter_unsupported_option() {
-    validate('''
-linter:
-  unsupported: true
-    ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE]);
-  }
-
   test_chromeos_manifest_checks() {
     validate('''
 analyzer:
@@ -511,6 +491,22 @@
 ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE]);
   }
 
+  test_linter_supported_rules() {
+    Registry.ruleRegistry.register(new TestRule());
+    validate('''
+linter:
+  rules:
+    - fantastic_test_rule
+    ''', []);
+  }
+
+  test_linter_unsupported_option() {
+    validate('''
+linter:
+  unsupported: true
+    ''', [AnalysisOptionsWarningCode.UNSUPPORTED_OPTION_WITH_LEGAL_VALUE]);
+  }
+
   void validate(String source, List<ErrorCode> expected) {
     var options = optionsProvider.getOptionsFromString(source);
     var errors = validator.validate(options);
diff --git a/pkg/analyzer/test/src/task/strong/checker_test.dart b/pkg/analyzer/test/src/task/strong/checker_test.dart
index 46590c8..d8e26ac 100644
--- a/pkg/analyzer/test/src/task/strong/checker_test.dart
+++ b/pkg/analyzer/test/src/task/strong/checker_test.dart
@@ -4270,15 +4270,58 @@
 main() {
   var emptyList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
   var emptyMap = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{};
+  final finalEmptyList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
+  final finalEmptyMap = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{};
+  const constEmptyList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
+  const constEmptyMap = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{};
 
-  var upwardsInfersDynamicList = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[42 as dynamic];
-  var upwardsInfersDynamicSet = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{42 as dynamic};
+  void listFunction(
+      [list = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/const []]) => print(list);
+  void mapFunction(
+      [map = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/const {}]) => print(map);
 
+  var conditionalEmptyList =
+      "a" == "b" ? [1, 2, 3] : /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
 
+  dynamic returnsList1() => /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[];
+  Object returnsList2() => [];
+  void returnsList3() => [];
+
+  var onlyInnermostEmptyCollections = {
+    /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/[]:
+        /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{}
+  };
+
+  // Inference has enough info in all of the cases below.
+  var upwardsInfersDynamicList = [42 as dynamic];
+  var upwardsInfersDynamicList2 = [42 as dynamic, 43 as dynamic];
+  var upwardsInfersDynamicList3 = [42 , 43.0];
+  var upwardsInfersDynamicSet = {42 as dynamic};
+
+  // Upwards inference provides correct types.
   dynamic d;
-  var upwardsInfersDynamicMap1 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{d: 2};
-  var upwardsInfersDynamicMap2 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{4: d};
-  var upwardsInfersDynamicMap3 = /*info:INFERENCE_FAILURE_ON_COLLECTION_LITERAL*/{d: d};
+  var upwardsInfersDynamicMap1 = {d: 2};
+  var upwardsInfersDynamicMap2 = {4: d};
+  var upwardsInfersDynamicMap3 = {d: d};
+  var listWithElements = [1, 2, 3];
+
+  // The type of the right side of `??` is inferred from the left.
+  var nullAwareEmptyList = [1, 2, 3] ?? [];
+
+  // Type arguments provide types.
+  var typeArgList = <dynamic>[];
+  var typeArgSet = <dynamic>{};
+  var typeArgMap = <dynamic, dynamic>{};
+
+  // Downwards inference provides correct types.
+  Set<dynamic> downwardsInfersDynamicSet = {};
+  Map<dynamic, dynamic> downwardsInfersDynamicDynamicMap = {};
+  List<int> downwardsInfersIntList = [];
+  Set<int> downwardsInfersIntSet = {};
+
+  // The type of `set` is `Set<dynamic>`.
+  int setLength(Set set) => set.length;
+  setLength({});
 }
     ''');
     await check(strictInference: true);
diff --git a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
index b78eabd..8fb7e6f 100644
--- a/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
+++ b/pkg/analyzer/test/src/task/strong/strong_test_helper.dart
@@ -55,21 +55,11 @@
   return new SourceSpanWithContext(startLoc, endLoc, text, lineText);
 }
 
-String _errorCodeName(ErrorCode errorCode) {
-  var name = errorCode.name;
-  final prefix = 'STRONG_MODE_';
-  if (name.startsWith(prefix)) {
-    return name.substring(prefix.length);
-  } else {
-    return name;
-  }
-}
-
 ErrorSeverity _errorSeverity(
     AnalysisOptions analysisOptions, AnalysisError error) {
   // TODO(brianwilkerson) Remove the if when top-level inference is made an
   // error again.
-  if (error.errorCode.name.startsWith('STRONG_MODE_TOP_LEVEL_')) {
+  if (error.errorCode.name.startsWith('TOP_LEVEL_')) {
     return ErrorSeverity.ERROR;
   }
   return ErrorProcessor.getProcessor(analysisOptions, error)?.severity ??
@@ -192,7 +182,7 @@
         resolutionMap.elementDeclaredByCompilationUnit(unit).source, sourceCode,
         end: offset + length);
     var levelName = _errorSeverity(analysisOptions, error).displayName;
-    return '@$offset $levelName:${_errorCodeName(error.errorCode)}\n' +
+    return '@$offset $levelName:${error.errorCode.name}\n' +
         span.message(error.message);
   }
 
@@ -411,7 +401,7 @@
 
   bool matches(AnalysisOptions options, AnalysisError e) {
     return _errorSeverity(options, e) == severity &&
-        _errorCodeName(e.errorCode) == typeName;
+        e.errorCode.name == typeName;
   }
 
   String toString() => '@$offset ${severity.displayName}: [$typeName]';
diff --git a/pkg/analyzer/test/test_all.dart b/pkg/analyzer/test/test_all.dart
index f68ff2b..7694f2f 100644
--- a/pkg/analyzer/test/test_all.dart
+++ b/pkg/analyzer/test/test_all.dart
@@ -13,6 +13,7 @@
 import 'parse_compilation_unit_test.dart' as parse_compilation_unit;
 import 'source/test_all.dart' as source;
 import 'src/test_all.dart' as src;
+import 'verify_diagnostics_test.dart' as verify_diagnostics;
 import 'verify_docs_test.dart' as verify_docs;
 import 'verify_tests_test.dart' as verify_tests;
 
@@ -27,6 +28,7 @@
     parse_compilation_unit.main();
     source.main();
     src.main();
+    verify_diagnostics.main();
     verify_docs.main();
     verify_tests.main();
   }, name: 'analyzer');
diff --git a/pkg/analyzer/test/util/ast_type_matchers.dart b/pkg/analyzer/test/util/ast_type_matchers.dart
index d47a240..faebe01 100644
--- a/pkg/analyzer/test/util/ast_type_matchers.dart
+++ b/pkg/analyzer/test/util/ast_type_matchers.dart
@@ -107,24 +107,16 @@
 
 const isExtendsClause = const TypeMatcher<ExtendsClause>();
 
+const isExtensionOverride = const TypeMatcher<ExtensionOverride>();
+
 const isFieldDeclaration = const TypeMatcher<FieldDeclaration>();
 
 const isFieldFormalParameter = const TypeMatcher<FieldFormalParameter>();
 
-/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
-/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
-final Matcher isForEachStatement = predicate(
-    (Object o) => o is ForStatement && o.forLoopParts is ForEachParts);
-
 const isFormalParameter = const TypeMatcher<FormalParameter>();
 
 const isFormalParameterList = const TypeMatcher<FormalParameterList>();
 
-/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
-/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
-final Matcher isForStatement =
-    predicate((Object o) => o is ForStatement && o.forLoopParts is ForParts);
-
 const isFunctionBody = const TypeMatcher<FunctionBody>();
 
 const isFunctionDeclaration = const TypeMatcher<FunctionDeclaration>();
@@ -185,11 +177,6 @@
 
 const isLiteral = const TypeMatcher<Literal>();
 
-/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
-/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
-final Matcher isMapLiteral =
-    predicate((Object o) => o is SetOrMapLiteral && o.isMap);
-
 const isMapLiteralEntry = const TypeMatcher<MapLiteralEntry>();
 
 const isMethodDeclaration = const TypeMatcher<MethodDeclaration>();
@@ -243,11 +230,6 @@
 
 const isScriptTag = const TypeMatcher<ScriptTag>();
 
-/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
-/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
-final Matcher isSetLiteral =
-    predicate((Object o) => o is SetOrMapLiteral && o.isSet);
-
 const isShowCombinator = const TypeMatcher<ShowCombinator>();
 
 const isSimpleFormalParameter = const TypeMatcher<SimpleFormalParameter>();
@@ -316,3 +298,23 @@
 const isWithClause = const TypeMatcher<WithClause>();
 
 const isYieldStatement = const TypeMatcher<YieldStatement>();
+
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isForEachStatement = predicate(
+    (Object o) => o is ForStatement && o.forLoopParts is ForEachParts);
+
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isForStatement =
+    predicate((Object o) => o is ForStatement && o.forLoopParts is ForParts);
+
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isMapLiteral =
+    predicate((Object o) => o is SetOrMapLiteral && o.isMap);
+
+/// TODO(paulberry): remove the explicit type `Matcher` once an SDK has been
+/// released that includes ba5644b76cb811e8f01ffb375b87d20d6295749c.
+final Matcher isSetLiteral =
+    predicate((Object o) => o is SetOrMapLiteral && o.isSet);
diff --git a/pkg/analyzer/test/util/element_type_matchers.dart b/pkg/analyzer/test/util/element_type_matchers.dart
index c141414..93f7e7a 100644
--- a/pkg/analyzer/test/util/element_type_matchers.dart
+++ b/pkg/analyzer/test/util/element_type_matchers.dart
@@ -7,8 +7,6 @@
 
 const isClassElement = const TypeMatcher<ClassElement>();
 
-const isClassMemberElement = const TypeMatcher<ClassMemberElement>();
-
 const isCompilationUnitElement = const TypeMatcher<CompilationUnitElement>();
 
 const isConstructorElement = const TypeMatcher<ConstructorElement>();
diff --git a/pkg/analyzer/test/util/id_equivalence_helper.dart b/pkg/analyzer/test/util/id_equivalence_helper.dart
deleted file mode 100644
index 20ace3c..0000000
--- a/pkg/analyzer/test/util/id_equivalence_helper.dart
+++ /dev/null
@@ -1,474 +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.
-
-// Note: this file contains code that was mostly copied from
-// tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
-// and then tweaked to work with the analyzer.
-// TODO(paulberry,johnniwinther): share this code between the analyzer and
-// dart2js.
-
-import 'package:analyzer/dart/analysis/results.dart';
-import 'package:analyzer/dart/analysis/utilities.dart';
-import 'package:analyzer/dart/ast/ast.dart' hide Annotation;
-import 'package:front_end/src/testing/annotated_code_helper.dart';
-import 'package:front_end/src/testing/id.dart'
-    show ActualData, Id, IdValue, MemberId, NodeId;
-
-/// Checks [compiledData] against the expected data in [expectedMap] derived
-/// from [code].
-Future<bool> checkCode<T>(
-    String mode,
-    Uri mainFileUri,
-    Map<Uri, AnnotatedCode> code,
-    MemberAnnotations<IdValue> expectedMaps,
-    CompiledData compiledData,
-    DataInterpreter<T> dataValidator,
-    {bool filterActualData(IdValue expected, ActualData<T> actualData),
-    bool fatalErrors: true}) async {
-  IdData<T> data = new IdData<T>(code, expectedMaps, compiledData);
-  bool hasFailure = false;
-  Set<Uri> neededDiffs = new Set<Uri>();
-
-  void checkActualMap(
-      Map<Id, ActualData<T>> actualMap, Map<Id, IdValue> expectedMap,
-      [Uri uri]) {
-    bool hasLocalFailure = false;
-    actualMap.forEach((Id id, ActualData<T> actualData) {
-      T actual = actualData.value;
-      String actualText = dataValidator.getText(actual);
-
-      if (!expectedMap.containsKey(id)) {
-        if (!dataValidator.isEmpty(actual)) {
-          reportError(
-              actualData.offset,
-              'EXTRA $mode DATA for ${id.descriptor}:\n '
-              'object   : ${actualData.objectText}\n '
-              'actual   : ${colorizeActual('${IdValue.idToString(id, actualText)}')}\n '
-              'Data was expected for these ids: ${expectedMap.keys}');
-          if (filterActualData == null || filterActualData(null, actualData)) {
-            hasLocalFailure = true;
-          }
-        }
-      } else {
-        IdValue expected = expectedMap[id];
-        String unexpectedMessage =
-            dataValidator.isAsExpected(actual, expected.value);
-        if (unexpectedMessage != null) {
-          reportError(
-              actualData.offset,
-              'UNEXPECTED $mode DATA for ${id.descriptor}:\n '
-              'detail  : ${colorizeMessage(unexpectedMessage)}\n '
-              'object  : ${actualData.objectText}\n '
-              'expected: ${colorizeExpected('$expected')}\n '
-              'actual  : ${colorizeActual('${IdValue.idToString(id, actualText)}')}');
-          if (filterActualData == null ||
-              filterActualData(expected, actualData)) {
-            hasLocalFailure = true;
-          }
-        }
-      }
-    });
-    if (hasLocalFailure) {
-      hasFailure = true;
-      if (uri != null) {
-        neededDiffs.add(uri);
-      }
-    }
-  }
-
-  data.actualMaps.forEach((Uri uri, Map<Id, ActualData<T>> actualMap) {
-    checkActualMap(actualMap, data.expectedMaps[uri], uri);
-  });
-  checkActualMap(data.actualMaps.globalData, data.expectedMaps.globalData);
-
-  Set<Id> missingIds = new Set<Id>();
-  void checkMissing(
-      Map<Id, IdValue> expectedMap, Map<Id, ActualData<T>> actualMap,
-      [Uri uri]) {
-    expectedMap.forEach((Id id, IdValue expected) {
-      if (!actualMap.containsKey(id)) {
-        missingIds.add(id);
-        String message = 'MISSING $mode DATA for ${id.descriptor}: '
-            'Expected ${colorizeExpected('$expected')}';
-        if (uri != null) {
-          var begin = data.getOffsetFromId(id, uri);
-          reportError(begin, message);
-        } else {
-          print(message);
-        }
-      }
-    });
-    if (missingIds.isNotEmpty && uri != null) {
-      neededDiffs.add(uri);
-    }
-  }
-
-  data.expectedMaps.forEach((Uri uri, Map<Id, IdValue> expectedMap) {
-    checkMissing(expectedMap, data.actualMaps[uri], uri);
-  });
-  checkMissing(data.expectedMaps.globalData, data.actualMaps.globalData);
-  for (Uri uri in neededDiffs) {
-    print('--annotations diff [${uri.pathSegments.last}]-------------');
-    print(data.diffCode(uri, dataValidator));
-    print('----------------------------------------------------------');
-  }
-  if (missingIds.isNotEmpty) {
-    print("MISSING ids: $missingIds.");
-    hasFailure = true;
-  }
-  if (hasFailure && fatalErrors) {
-    throw StateError('Errors found.');
-  }
-  return hasFailure;
-}
-
-Future<bool> checkTests<T>(
-    String rawCode,
-    Future<ResolvedUnitResult> resultComputer(String rawCode),
-    DataComputer<T> dataComputer) async {
-  AnnotatedCode code =
-      new AnnotatedCode.fromText(rawCode, commentStart, commentEnd);
-  var result = await resultComputer(code.sourceCode);
-  var uri = result.libraryElement.source.uri;
-  var marker = 'normal';
-  Map<String, MemberAnnotations<IdValue>> expectedMaps = {
-    marker: new MemberAnnotations<IdValue>(),
-  };
-  computeExpectedMap(uri, code, expectedMaps);
-  MemberAnnotations<IdValue> annotations = expectedMaps[marker];
-  Map<Id, ActualData<T>> actualMap = {};
-  dataComputer.computeUnitData(result.unit, actualMap);
-  var compiledData = CompiledData<T>(uri, {uri: actualMap}, {});
-  return await checkCode(marker, uri, {uri: code}, annotations, compiledData,
-      dataComputer.dataValidator);
-}
-
-/// Colorize the actual annotation [text], if ANSI colors are supported.
-String colorizeActual(String text) {
-  return text;
-}
-
-/// Colorize annotation delimiters [start] and [end] surrounding [text], if
-/// ANSI colors are supported.
-String colorizeAnnotation(String start, String text, String end) {
-  return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
-}
-
-/// Colorize delimiter [text], if ANSI colors are supported.
-String colorizeDelimiter(String text) {
-  return text;
-}
-
-/// Colorize diffs [expected] and [actual] and [delimiter], if ANSI colors are
-/// supported.
-String colorizeDiff(String expected, String delimiter, String actual) {
-  return '${colorizeExpected(expected)}'
-      '${colorizeDelimiter(delimiter)}${colorizeActual(actual)}';
-}
-
-/// Colorize an expected annotation [text], if ANSI colors are supported.
-String colorizeExpected(String text) {
-  return text;
-}
-
-/// Colorize a matching annotation [text], if ANSI colors are supported.
-String colorizeMatch(String text) {
-  return text;
-}
-
-/// Colorize a message [text], if ANSI colors are supported.
-String colorizeMessage(String text) {
-  return text;
-}
-
-/// Compute three [MemberAnnotations] objects from [code] specifying the
-/// expected annotations we anticipate encountering; one corresponding to the
-/// old implementation, one for the new implementation, and one for the new
-/// implementation using strong mode.
-///
-/// If an annotation starts with 'ast.' it is only expected for the old
-/// implementation, if it starts with 'kernel.' it is only expected for the
-/// new implementation, and if it starts with 'strong.' it is only expected for
-/// strong mode (using the common frontend). Otherwise it is expected for all
-/// implementations.
-///
-/// Most nodes have the same and expectations should match this by using
-/// annotations without prefixes.
-void computeExpectedMap(Uri sourceUri, AnnotatedCode code,
-    Map<String, MemberAnnotations<IdValue>> maps) {
-  List<String> mapKeys = maps.keys.toList();
-  Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
-
-  split.forEach((String marker, AnnotatedCode code) {
-    MemberAnnotations<IdValue> fileAnnotations = maps[marker];
-    assert(fileAnnotations != null, "No annotations for $marker in $maps");
-    Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
-    for (Annotation annotation in code.annotations) {
-      String text = annotation.text;
-      IdValue idValue = IdValue.decode(annotation.offset, text);
-      if (idValue.id.isGlobal) {
-        _expectFalse(
-            fileAnnotations.globalData.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id} in $marker: "
-            "$idValue and ${fileAnnotations.globalData[idValue.id]}.");
-        fileAnnotations.globalData[idValue.id] = idValue;
-      } else {
-        _expectFalse(
-            expectedValues.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id} in $marker: "
-            "$idValue and ${expectedValues[idValue.id]}.");
-        expectedValues[idValue.id] = idValue;
-      }
-    }
-  });
-}
-
-/// Reports [message] as an error using [spannable] as error location.
-void reportError(int offset, String message) {
-  print('$offset: $message');
-}
-
-String withAnnotations(String sourceCode, Map<int, List<String>> annotations) {
-  StringBuffer sb = new StringBuffer();
-  int end = 0;
-  for (int offset in annotations.keys.toList()..sort()) {
-    if (offset >= sourceCode.length) {
-      sb.write('...');
-      return sb.toString();
-    }
-    if (offset > end) {
-      sb.write(sourceCode.substring(end, offset));
-    }
-    for (String annotation in annotations[offset]) {
-      sb.write(colorizeAnnotation('/*', annotation, '*/'));
-    }
-    end = offset;
-  }
-  if (end < sourceCode.length) {
-    sb.write(sourceCode.substring(end));
-  }
-  return sb.toString();
-}
-
-void _expectFalse(bool b, String message) {
-  if (b) {
-    throw StateError(message);
-  }
-}
-
-class CompiledData<T> {
-  final Uri mainUri;
-  final Map<Uri, Map<Id, ActualData<T>>> actualMaps;
-  final Map<Id, ActualData<T>> globalData;
-
-  CompiledData(this.mainUri, this.actualMaps, this.globalData);
-
-  Map<int, List<String>> computeAnnotations(Uri uri) {
-    Map<Id, ActualData<T>> thisMap = actualMaps[uri];
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData<T> data1) {
-      String value1 = '${data1.value}';
-      annotations
-          .putIfAbsent(data1.offset, () => [])
-          .add(colorizeActual(value1));
-    });
-    return annotations;
-  }
-
-  Map<int, List<String>> computeDiffAnnotationsAgainst(
-      Map<Id, ActualData<T>> thisMap, Map<Id, ActualData<T>> otherMap, Uri uri,
-      {bool includeMatches: false}) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData<T> data1) {
-      ActualData<T> data2 = otherMap[id];
-      String value1 = '${data1.value}';
-      if (data1.value != data2?.value) {
-        String value2 = '${data2?.value ?? '---'}';
-        annotations
-            .putIfAbsent(data1.offset, () => [])
-            .add(colorizeDiff(value1, ' | ', value2));
-      } else if (includeMatches) {
-        annotations
-            .putIfAbsent(data1.offset, () => [])
-            .add(colorizeMatch(value1));
-      }
-    });
-    otherMap.forEach((Id id, ActualData<T> data2) {
-      if (!thisMap.containsKey(id)) {
-        String value1 = '---';
-        String value2 = '${data2.value}';
-        annotations
-            .putIfAbsent(data2.offset, () => [])
-            .add(colorizeDiff(value1, ' | ', value2));
-      }
-    });
-    return annotations;
-  }
-}
-
-abstract class DataComputer<T> {
-  const DataComputer();
-
-  DataInterpreter<T> get dataValidator;
-
-  /// Function that computes a data mapping for [unit].
-  ///
-  /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-  /// for the data origin.
-  void computeUnitData(CompilationUnit unit, Map<Id, ActualData<T>> actualMap);
-}
-
-/// Interface used for interpreting annotations.
-abstract class DataInterpreter<T> {
-  /// Returns a textual representation of [actualData].
-  String getText(T actualData);
-
-  /// Returns `null` if [actualData] satisfies the [expectedData] annotation.
-  /// Otherwise, a message is returned contain the information about the
-  /// problems found.
-  String isAsExpected(T actualData, String expectedData);
-
-  /// Returns `true` if [actualData] corresponds to empty data.
-  bool isEmpty(T actualData);
-}
-
-/// Data collected by [computeData].
-class IdData<T> {
-  final Map<Uri, AnnotatedCode> code;
-  final MemberAnnotations<IdValue> expectedMaps;
-  final CompiledData _compiledData;
-  final MemberAnnotations<ActualData<T>> _actualMaps = new MemberAnnotations();
-
-  IdData(this.code, this.expectedMaps, this._compiledData) {
-    for (Uri uri in code.keys) {
-      _actualMaps[uri] = _compiledData.actualMaps[uri] ?? <Id, ActualData<T>>{};
-    }
-    _actualMaps.globalData.addAll(_compiledData.globalData);
-  }
-
-  MemberAnnotations<ActualData<T>> get actualMaps => _actualMaps;
-  Uri get mainUri => _compiledData.mainUri;
-
-  String actualCode(Uri uri) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData<T> data) {
-      annotations.putIfAbsent(data.offset, () => []).add('${data.value}');
-    });
-    return withAnnotations(code[uri].sourceCode, annotations);
-  }
-
-  String diffCode(Uri uri, DataInterpreter<T> dataValidator) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData<T> data) {
-      IdValue expectedValue = expectedMaps[uri][id];
-      T actualValue = data.value;
-      String unexpectedMessage =
-          dataValidator.isAsExpected(actualValue, expectedValue?.value);
-      if (unexpectedMessage != null) {
-        String expected = expectedValue?.toString() ?? '';
-        String actual = dataValidator.getText(actualValue);
-        int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '$expected';
-          String value2 = IdValue.idToString(id, '$actual');
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
-      }
-    });
-    expectedMaps[uri].forEach((Id id, IdValue expected) {
-      if (!actualMaps[uri].containsKey(id)) {
-        int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '$expected';
-          String value2 = '---';
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
-      }
-    });
-    return withAnnotations(code[uri].sourceCode, annotations);
-  }
-
-  int getOffsetFromId(Id id, Uri uri) {
-    if (id is NodeId) {
-      return id.value;
-    } else if (id is MemberId) {
-      if (id.className != null) {
-        throw UnimplementedError('TODO(paulberry): handle class members');
-      }
-      var name = id.memberName;
-      var unit =
-          parseString(content: code[uri].sourceCode, throwIfDiagnostics: false)
-              .unit;
-      for (var declaration in unit.declarations) {
-        if (declaration is FunctionDeclaration) {
-          if (declaration.name.name == name) {
-            return declaration.offset;
-          }
-        }
-      }
-      throw StateError('Member not found: $name');
-    } else {
-      throw StateError('Unexpected id ${id.runtimeType}');
-    }
-  }
-}
-
-/// Encapsulates the member data computed for each source file of interest.
-/// It's a glorified wrapper around a map of maps, but written this way to
-/// provide a little more information about what it's doing. [DataType] refers
-/// to the type this map is holding -- it is either [IdValue] or [ActualData].
-class MemberAnnotations<DataType> {
-  /// For each Uri, we create a map associating an element id with its
-  /// corresponding annotations.
-  final Map<Uri, Map<Id, DataType>> _computedDataForEachFile =
-      new Map<Uri, Map<Id, DataType>>();
-
-  /// Member or class annotations that don't refer to any of the user files.
-  final Map<Id, DataType> globalData = <Id, DataType>{};
-
-  Map<Id, DataType> operator [](Uri file) {
-    if (!_computedDataForEachFile.containsKey(file)) {
-      _computedDataForEachFile[file] = <Id, DataType>{};
-    }
-    return _computedDataForEachFile[file];
-  }
-
-  void operator []=(Uri file, Map<Id, DataType> computedData) {
-    _computedDataForEachFile[file] = computedData;
-  }
-
-  void forEach(void f(Uri file, Map<Id, DataType> computedData)) {
-    _computedDataForEachFile.forEach(f);
-  }
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('MemberAnnotations(');
-    String comma = '';
-    if (_computedDataForEachFile.isNotEmpty &&
-        (_computedDataForEachFile.length > 1 ||
-            _computedDataForEachFile.values.single.isNotEmpty)) {
-      sb.write('data:{');
-      _computedDataForEachFile.forEach((Uri uri, Map<Id, DataType> data) {
-        sb.write(comma);
-        sb.write('$uri:');
-        sb.write(data);
-        comma = ',';
-      });
-      sb.write('}');
-    }
-    if (globalData.isNotEmpty) {
-      sb.write(comma);
-      sb.write('global:');
-      sb.write(globalData);
-    }
-    sb.write(')');
-    return sb.toString();
-  }
-}
diff --git a/pkg/analyzer/test/util/id_testing_helper.dart b/pkg/analyzer/test/util/id_testing_helper.dart
new file mode 100644
index 0000000..7002715
--- /dev/null
+++ b/pkg/analyzer/test/util/id_testing_helper.dart
@@ -0,0 +1,232 @@
+// 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.
+
+// TODO(paulberry,johnniwinther): Use the code for extraction of test data from
+// annotated code from CFE.
+
+import 'package:analyzer/dart/analysis/features.dart';
+import 'package:analyzer/dart/analysis/utilities.dart';
+import 'package:analyzer/dart/ast/ast.dart' hide Annotation;
+import 'package:analyzer/diagnostic/diagnostic.dart';
+import 'package:analyzer/file_system/file_system.dart';
+import 'package:analyzer/file_system/memory_file_system.dart';
+import 'package:analyzer/src/dart/analysis/byte_store.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
+import 'package:analyzer/src/dart/analysis/file_state.dart';
+import 'package:analyzer/src/dart/analysis/performance_logger.dart';
+import 'package:analyzer/src/dart/analysis/testing_data.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/source/package_map_resolver.dart';
+import 'package:analyzer/src/test_utilities/mock_sdk.dart';
+import 'package:front_end/src/testing/annotated_code_helper.dart';
+import 'package:front_end/src/testing/id.dart'
+    show ActualData, Id, IdValue, MemberId, NodeId;
+import 'package:front_end/src/testing/id_testing.dart';
+
+/// Test configuration used for testing the analyzer with constant evaluation.
+final TestConfig analyzerConstantUpdate2018Config = TestConfig(
+    analyzerMarker, 'analyzer with constant-update-2018',
+    featureSet: FeatureSet.forTesting(
+        sdkVersion: '2.2.2',
+        additionalFeatures: [Feature.constant_update_2018]));
+
+/// Test configuration used for testing the analyzer with NNBD.
+final TestConfig analyzerNnbdConfig = TestConfig(
+    analyzerMarker, 'analyzer with NNBD',
+    featureSet: FeatureSet.forTesting(
+        sdkVersion: '2.2.2', additionalFeatures: [Feature.non_nullable]));
+
+/// A fake absolute directory used as the root of a memory-file system in ID
+/// tests.
+Uri _defaultDir = Uri.parse('file:///a/b/c/');
+
+Future<bool> checkTests<T>(
+    String rawCode, DataComputer<T> dataComputer, FeatureSet featureSet) async {
+  AnnotatedCode code =
+      new AnnotatedCode.fromText(rawCode, commentStart, commentEnd);
+  String testFileName = 'test.dart';
+  var testFileUri = _toTestUri(testFileName);
+  var memorySourceFiles = {testFileName: code.sourceCode};
+  var marker = 'analyzer';
+  Map<String, MemberAnnotations<IdValue>> expectedMaps = {
+    marker: new MemberAnnotations<IdValue>(),
+  };
+  computeExpectedMap(testFileUri, testFileName, code, expectedMaps,
+      onFailure: onFailure);
+  Map<Uri, AnnotatedCode> codeMap = {testFileUri: code};
+  var libFileNames = <String>[];
+  var testData = TestData(testFileUri, testFileUri, memorySourceFiles, codeMap,
+      expectedMaps, libFileNames);
+  var config =
+      TestConfig(marker, 'provisional test config', featureSet: featureSet);
+  return runTestForConfig<T>(testData, dataComputer, config);
+}
+
+/// Creates the testing URI used for [fileName] in annotated tests.
+Uri createUriForFileName(String fileName, {bool isLib}) => _toTestUri(fileName);
+
+void onFailure(String message) {
+  throw StateError(message);
+}
+
+/// Runs [dataComputer] on [testData] for all [testedConfigs].
+///
+/// Returns `true` if an error was encountered.
+Future<bool> runTest<T>(TestData testData, DataComputer<T> dataComputer,
+    List<TestConfig> testedConfigs,
+    {bool testAfterFailures,
+    bool forUserLibrariesOnly: true,
+    Iterable<Id> globalIds: const <Id>[],
+    void onFailure(String message)}) async {
+  bool hasFailures = false;
+  for (TestConfig config in testedConfigs) {
+    if (await runTestForConfig(testData, dataComputer, config,
+        fatalErrors: !testAfterFailures, onFailure: onFailure)) {
+      hasFailures = true;
+    }
+  }
+  return hasFailures;
+}
+
+/// Creates a test runner for [dataComputer] on [testedConfigs].
+RunTestFunction runTestFor<T>(
+    DataComputer<T> dataComputer, List<TestConfig> testedConfigs) {
+  return (TestData testData,
+      {bool testAfterFailures, bool verbose, bool succinct, bool printCode}) {
+    return runTest(testData, dataComputer, testedConfigs,
+        testAfterFailures: testAfterFailures, onFailure: onFailure);
+  };
+}
+
+/// Runs [dataComputer] on [testData] for [config].
+///
+/// Returns `true` if an error was encountered.
+Future<bool> runTestForConfig<T>(
+    TestData testData, DataComputer<T> dataComputer, TestConfig config,
+    {bool fatalErrors, void onFailure(String message)}) async {
+  MemberAnnotations<IdValue> memberAnnotations =
+      testData.expectedMaps[config.marker];
+  var resourceProvider = new MemoryResourceProvider();
+  for (var entry in testData.memorySourceFiles.entries) {
+    resourceProvider.newFile(
+        resourceProvider.convertPath(_toTestUri(entry.key).path), entry.value);
+  }
+  var sdk = new MockSdk(resourceProvider: resourceProvider);
+  var logBuffer = new StringBuffer();
+  var logger = new PerformanceLog(logBuffer);
+  var scheduler = new AnalysisDriverScheduler(logger);
+  // TODO(paulberry): Do we need a non-empty package map for any of these tests?
+  var packageMap = <String, List<Folder>>{};
+  var byteStore = new MemoryByteStore();
+  var analysisOptions = AnalysisOptionsImpl()
+    ..contextFeatures = config.featureSet;
+  var driver = new AnalysisDriver(
+      scheduler,
+      logger,
+      resourceProvider,
+      byteStore,
+      new FileContentOverlay(),
+      null,
+      new SourceFactory([
+        new DartUriResolver(sdk),
+        new PackageMapUriResolver(resourceProvider, packageMap),
+        new ResourceUriResolver(resourceProvider)
+      ], null, resourceProvider),
+      analysisOptions,
+      retainDataForTesting: true);
+  scheduler.start();
+  var result = await driver
+      .getResult(resourceProvider.convertPath(testData.entryPoint.path));
+  var errors =
+      result.errors.where((e) => e.severity == Severity.error).toList();
+  if (errors.isNotEmpty) {
+    onFailure('Errors found:\n  ${errors.join('\n  ')}');
+    return true;
+  }
+  Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
+  Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
+
+  Map<Id, ActualData<T>> actualMapFor(Uri uri) {
+    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
+  }
+
+  dataComputer.computeUnitData(
+      driver.testingData, result.unit, actualMapFor(testData.entryPoint));
+  var compiledData = AnalyzerCompiledData<T>(
+      testData.code, testData.entryPoint, actualMaps, globalData);
+  return checkCode(config.name, testData.testFileUri, testData.code,
+      memberAnnotations, compiledData, dataComputer.dataValidator,
+      fatalErrors: fatalErrors, onFailure: onFailure);
+}
+
+/// Convert relative file paths into an absolute Uri as expected by the test
+/// helpers.
+Uri _toTestUri(String relativePath) => _defaultDir.resolve(relativePath);
+
+class AnalyzerCompiledData<T> extends CompiledData<T> {
+  // TODO(johnniwinther,paulberry): Maybe this should have access to the
+  // [ResolvedUnitResult] instead.
+  final Map<Uri, AnnotatedCode> code;
+
+  AnalyzerCompiledData(
+      this.code,
+      Uri mainUri,
+      Map<Uri, Map<Id, ActualData<T>>> actualMaps,
+      Map<Id, ActualData<T>> globalData)
+      : super(mainUri, actualMaps, globalData);
+
+  @override
+  int getOffsetFromId(Id id, Uri uri) {
+    if (id is NodeId) {
+      return id.value;
+    } else if (id is MemberId) {
+      if (id.className != null) {
+        throw UnimplementedError('TODO(paulberry): handle class members');
+      }
+      var name = id.memberName;
+      var unit =
+          parseString(content: code[uri].sourceCode, throwIfDiagnostics: false)
+              .unit;
+      for (var declaration in unit.declarations) {
+        if (declaration is FunctionDeclaration) {
+          if (declaration.name.name == name) {
+            return declaration.offset;
+          }
+        }
+      }
+      throw StateError('Member not found: $name');
+    } else {
+      throw StateError('Unexpected id ${id.runtimeType}');
+    }
+  }
+
+  @override
+  void reportError(Uri uri, int offset, String message,
+      {bool succinct: false}) {
+    print('$offset: $message');
+  }
+}
+
+abstract class DataComputer<T> {
+  const DataComputer();
+
+  DataInterpreter<T> get dataValidator;
+
+  /// Function that computes a data mapping for [unit].
+  ///
+  /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
+  /// for the data origin.
+  void computeUnitData(TestingData testingData, CompilationUnit unit,
+      Map<Id, ActualData<T>> actualMap);
+}
+
+class TestConfig {
+  final String marker;
+  final String name;
+  final FeatureSet featureSet;
+
+  TestConfig(this.marker, this.name, {FeatureSet featureSet})
+      : featureSet = featureSet ?? FeatureSet.fromEnableFlags([]);
+}
diff --git a/pkg/analyzer/test/verify_diagnostics_test.dart b/pkg/analyzer/test/verify_diagnostics_test.dart
new file mode 100644
index 0000000..8a6a460
--- /dev/null
+++ b/pkg/analyzer/test/verify_diagnostics_test.dart
@@ -0,0 +1,288 @@
+// 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/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer/dart/analysis/results.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/error/error.dart';
+import 'package:analyzer/file_system/physical_file_system.dart';
+import 'package:front_end/src/testing/package_root.dart' as package_root;
+import 'package:path/path.dart';
+import 'package:test/test.dart';
+
+import '../tool/diagnostics/generate.dart';
+import 'src/dart/resolution/driver_resolution.dart';
+
+/// Validate the documentation associated with the declarations of the error
+/// codes.
+void main() async {
+  Context pathContext = PhysicalResourceProvider.INSTANCE.pathContext;
+  //
+  // Validate that the input to the generator is correct.
+  //
+  String packageRoot = pathContext.normalize(package_root.packageRoot);
+  String analyzerPath = pathContext.join(packageRoot, 'analyzer');
+  List<String> docPaths = [
+    pathContext.join(
+        analyzerPath, 'lib', 'src', 'dart', 'error', 'hint_codes.dart'),
+    pathContext.join(analyzerPath, 'lib', 'src', 'error', 'codes.dart'),
+  ];
+
+  DocumentationValidator validator = DocumentationValidator(docPaths);
+  validator.validate();
+  //
+  // Validate that the generator has been run.
+  //
+  if (pathContext.style != Style.windows) {
+    String outputPath =
+        pathContext.join(analyzerPath, 'tool', 'diagnostics', 'diagnostics.md');
+    String actualContent = PhysicalResourceProvider.INSTANCE
+        .getFile(outputPath)
+        .readAsStringSync();
+
+    StringBuffer sink = StringBuffer();
+    DocumentationGenerator generator = DocumentationGenerator(docPaths);
+    generator.writeDocumentation(sink);
+    String expectedContent = sink.toString();
+
+    if (actualContent != expectedContent) {
+      fail('The diagnostic documentation needs to be regenerated.\n'
+          'Please run tool/diagnostics/generate.dart.');
+    }
+  }
+}
+
+/// A class used to validate diagnostic documentation.
+class DocumentationValidator {
+  /// The sequence used to mark the start of an error range.
+  static const String errorRangeStart = '[!';
+
+  /// The sequence used to mark the end of an error range.
+  static const String errorRangeEnd = '!]';
+
+  /// The absolute paths of the files containing the declarations of the error
+  /// codes.
+  final List<String> docPaths;
+
+  /// The buffer to which validation errors are written.
+  final StringBuffer buffer = StringBuffer();
+
+  /// The path to the file currently being verified.
+  String filePath;
+
+  /// A flag indicating whether the [filePath] has already been written to the
+  /// buffer.
+  bool hasWrittenFilePath = false;
+
+  /// The name of the error code currently being verified.
+  String codeName;
+
+  /// A flag indicating whether the [codeName] has already been written to the
+  /// buffer.
+  bool hasWrittenCodeName = false;
+
+  /// Initialize a newly created documentation validator.
+  DocumentationValidator(this.docPaths);
+
+  /// Validate the documentation.
+  void validate() async {
+    AnalysisContextCollection collection = new AnalysisContextCollection(
+        includedPaths: docPaths,
+        resourceProvider: PhysicalResourceProvider.INSTANCE);
+    for (String docPath in docPaths) {
+      _validateFile(_parse(collection, docPath));
+    }
+    if (buffer.isNotEmpty) {
+      fail(buffer.toString());
+    }
+  }
+
+  /// Extract documentation from the given [field] declaration.
+  List<String> _extractDoc(FieldDeclaration field) {
+    Token comments = field.firstTokenAfterCommentAndMetadata.precedingComments;
+    if (comments == null) {
+      return null;
+    }
+    List<String> docs = [];
+    while (comments != null) {
+      String lexeme = comments.lexeme;
+      if (lexeme.startsWith('// TODO')) {
+        break;
+      } else if (lexeme.startsWith('// ')) {
+        docs.add(lexeme.substring(3));
+      } else if (lexeme == '//') {
+        docs.add('');
+      }
+      comments = comments.next;
+    }
+    if (docs.isEmpty) {
+      return null;
+    }
+    return docs;
+  }
+
+  _SnippetData _extractSnippetData(String snippet) {
+    int rangeStart = snippet.indexOf(errorRangeStart);
+    if (rangeStart < 0) {
+      _reportProblem('No error range in example');
+      return _SnippetData(snippet, -1, 0);
+    }
+    int rangeEnd = snippet.indexOf(errorRangeEnd, rangeStart + 1);
+    if (rangeEnd < 0) {
+      _reportProblem('No end of error range in example');
+      return _SnippetData(snippet, -1, 0);
+    } else if (snippet.indexOf(errorRangeStart, rangeEnd) > 0) {
+      _reportProblem('More than one error range in example');
+    }
+    return _SnippetData(
+        snippet.substring(0, rangeStart) +
+            snippet.substring(rangeStart + 1, rangeEnd) +
+            snippet.substring(rangeEnd + 1),
+        rangeStart,
+        rangeEnd - rangeStart - 1);
+  }
+
+  /// Extract the snippets of Dart code between the start (inclusive) and end
+  /// (exclusive) indexes.
+  List<String> _extractSnippets(List<String> lines, int start, int end) {
+    List<String> snippets = [];
+    int snippetStart = lines.indexOf('```dart', start);
+    while (snippetStart >= 0 && snippetStart < end) {
+      int snippetEnd = lines.indexOf('```', snippetStart + 1);
+      snippets.add(lines.sublist(snippetStart + 1, snippetEnd).join('\n'));
+      snippetStart = lines.indexOf('```dart', snippetEnd + 1);
+    }
+    return snippets;
+  }
+
+  /// Use the analysis context [collection] to parse the file at the given
+  /// [path] and return the result.
+  ParsedUnitResult _parse(AnalysisContextCollection collection, String path) {
+    AnalysisSession session = collection.contextFor(path).currentSession;
+    if (session == null) {
+      throw new StateError('No session for "$path"');
+    }
+    ParsedUnitResult result = session.getParsedUnit(path);
+    if (result.state != ResultState.VALID) {
+      throw new StateError('Unable to parse "$path"');
+    }
+    return result;
+  }
+
+  /// Report a problem with the current error code.
+  void _reportProblem(String problem, {List<AnalysisError> errors = const []}) {
+    if (!hasWrittenFilePath) {
+      buffer.writeln();
+      buffer.writeln('In $filePath');
+      hasWrittenFilePath = true;
+    }
+    if (!hasWrittenCodeName) {
+      buffer.writeln('  $codeName');
+      hasWrittenCodeName = true;
+    }
+    buffer.writeln('    $problem');
+    for (AnalysisError error in errors) {
+      buffer.write(error.errorCode);
+      buffer.write(' (');
+      buffer.write(error.offset);
+      buffer.write(', ');
+      buffer.write(error.length);
+      buffer.write(') ');
+      buffer.writeln(error.message);
+    }
+  }
+
+  /// Extract documentation from the file that was parsed to produce the given
+  /// [result].
+  void _validateFile(ParsedUnitResult result) {
+    filePath = result.path;
+    hasWrittenFilePath = false;
+    CompilationUnit unit = result.unit;
+    for (CompilationUnitMember declaration in unit.declarations) {
+      if (declaration is ClassDeclaration) {
+        String className = declaration.name.name;
+        for (ClassMember member in declaration.members) {
+          if (member is FieldDeclaration) {
+            List<String> docs = _extractDoc(member);
+            if (docs != null) {
+              VariableDeclaration variable = member.fields.variables[0];
+              String variableName = variable.name.name;
+              codeName = '$className.$variableName';
+              hasWrittenCodeName = false;
+
+              int exampleStart = docs.indexOf('#### Example');
+              int fixesStart = docs.indexOf('#### Common fixes');
+
+              List<String> exampleSnippets =
+                  _extractSnippets(docs, exampleStart + 1, fixesStart);
+              for (String snippet in exampleSnippets) {
+                _SnippetData data = _extractSnippetData(snippet);
+                _validateSnippet(data.snippet, data.offset, data.length);
+              }
+
+              List<String> fixesSnippets =
+                  _extractSnippets(docs, fixesStart + 1, docs.length);
+              for (String snippet in fixesSnippets) {
+                _validateSnippet(snippet, -1, 0);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  /// Resolve the [snippet]. If the [offset] is less than zero, then verify that
+  /// no diagnostics are reported. If the [offset] is greater than or equal to
+  /// zero, verify that one error whose name matches the current code is
+  /// reported at that offset with the given [length].
+  void _validateSnippet(String snippet, int offset, int length) async {
+    // TODO(brianwilkerson) Implement this.
+    DriverResolutionTest test = DriverResolutionTest();
+    test.setUp();
+    test.addTestFile(snippet);
+    await test.resolveTestFile();
+    List<AnalysisError> errors = test.result.errors;
+    int errorCount = errors.length;
+    if (offset < 0) {
+      if (errorCount > 0) {
+        _reportProblem('Expected no errors but found $errorCount.',
+            errors: errors);
+      }
+    } else {
+      if (errorCount == 0) {
+        _reportProblem('Expected one error but found none.');
+      } else if (errorCount == 1) {
+        AnalysisError error = errors[0];
+        if (error.errorCode != codeName) {
+          _reportProblem(
+              'Expected an error with code $codeName, found ${error.errorCode}.');
+        }
+        if (error.offset != offset) {
+          _reportProblem(
+              'Expected an error at $offset, found ${error.offset}.');
+        }
+        if (error.length != length) {
+          _reportProblem(
+              'Expected an error of length $length, found ${error.length}.');
+        }
+      } else {
+        _reportProblem('Expected one error but found $errorCount.',
+            errors: errors);
+      }
+    }
+  }
+}
+
+/// A data holder used to return multiple values when extracting an error range
+/// from a snippet.
+class _SnippetData {
+  final String snippet;
+  final int offset;
+  final int length;
+
+  _SnippetData(this.snippet, this.offset, this.length);
+}
diff --git a/pkg/analyzer/test/verify_tests_test.dart b/pkg/analyzer/test/verify_tests_test.dart
index 147ae8a..e14d258 100644
--- a/pkg/analyzer/test/verify_tests_test.dart
+++ b/pkg/analyzer/test/verify_tests_test.dart
@@ -59,7 +59,13 @@
       return;
     }
     if (testAllFile == null) {
-      fail('Missing "test_all.dart" in $relativePath');
+      if (relativePath != 'id_tests') {
+        fail('Missing "test_all.dart" in $relativePath');
+      } else {
+        // The tests in the id_tests folder don't have a test_all.dart file
+        // because they don't use the package:test framework.
+        return;
+      }
     }
     ParsedUnitResult result = session.getParsedUnit(testAllFile.path);
     if (result.state != ResultState.VALID) {
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 7bcca54..a8b6cde 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -12,6 +12,50 @@
 For more information about the analyzer, see
 [Customizing static analysis](/guides/language/analysis-options).
 
+## Glossary
+
+This page uses the following terms.
+
+### Constant context
+
+A _constant context_ is a region of code in which it isn't necessary to include
+the `const` keyword because it's implied by the fact that everything in that
+region is required to be a constant. The following locations are constant
+contexts:
+
+* Everything inside a list, map or set literal that's prefixed by the keyword
+  `const`. Example:
+
+  ```dart
+  var l = const [/*constant context*/];
+  ```
+
+* The arguments inside an invocation of a constant constructor. Example:
+
+  ```dart
+  var p = const Point(/*constant context*/);
+  ```
+
+* The initializer for a variable that's prefixed by the keyword `const`.
+  Example:
+
+  ```dart
+  const v = /*constant context*/;
+  ```
+
+* Annotations
+
+* The expression in a case clause. Example:
+
+  ```dart
+  void f(int e) {
+    switch (e) {
+      case /*constant context*/:
+        break;
+    }
+  }
+  ```
+
 ## Diagnostics
 
 The analyzer produces the following diagnostics for code that
@@ -42,10 +86,10 @@
 
 The following code produces this diagnostic:
 
-```dart
+{% prettify dart %}
 union(Map<String, String> a, List<String> b, Map<String, String> c) =>
-    {...a, ...b, ...c};
-```
+    [!{...a, ...b, ...c}!];
+{% endprettify %}
 
 The list `b` can only be spread into a set, and the maps `a` and `c` can
 only be spread into a map, and the literal can't be both.
@@ -57,19 +101,19 @@
 consistent. In this case, that likely means removing the list and deciding
 what to do about the now unused parameter:
 
-```dart
+{% prettify dart %}
 union(Map<String, String> a, List<String> b, Map<String, String> c) =>
     {...a, ...c};
-```
+{% endprettify %}
 
 The second fix is to change the elements of one kind into elements that are
-consistent with the other elements. For example, you could add the elements
+consistent with the other elements. For example, you can add the elements
 of the list as keys that map to themselves:
 
-```dart
+{% prettify dart %}
 union(Map<String, String> a, List<String> b, Map<String, String> c) =>
     {...a, for (String s in b) s: s, ...c};
-```
+{% endprettify %}
 
 ### ambiguous_set_or_map_literal_either
 
@@ -94,9 +138,9 @@
 
 The following code produces this diagnostic:
 
-```dart
-union(a, b) => !{...a, ...b}!;
-```
+{% prettify dart %}
+union(a, b) => [!{...a, ...b}!];
+{% endprettify %}
 
 The problem occurs because there are no type arguments, and there is no
 information about the type of either `a` or `b`.
@@ -107,43 +151,134 @@
 arguments to the literal. For example, if the literal is intended to be a
 map literal, you might write something like this:
 
-```dart
+{% prettify dart %}
 union(a, b) => <String, String>{...a, ...b};
-```
+{% endprettify %}
 
 The second fix is to add type information so that the expressions have
-either the type `Iterable` or the type `Map`. You could add an explicit
-cast or, in this case, add types to the declarations of the two parameters:
+either the type `Iterable` or the type `Map`. You can add an explicit cast
+or, in this case, add types to the declarations of the two parameters:
 
-```dart
+{% prettify dart %}
 union(List<int> a, List<int> b) => {...a, ...b};
-```
+{% endprettify %}
 
 The third fix is to add context information. In this case, that means
 adding a return type to the function:
 
-```dart
+{% prettify dart %}
 Set<String> union(a, b) => {...a, ...b};
-```
+{% endprettify %}
 
 In other cases, you might add a type somewhere else. For example, say the
 original code looks like this:
 
-```dart
+{% prettify dart %}
 union(a, b) {
   var x = {...a, ...b};
   return x;
 }
-```
+{% endprettify %}
 
 You might add a type annotation on `x`, like this:
 
-```dart
+{% prettify dart %}
 union(a, b) {
   Map<String, String> x = {...a, ...b};
   return x;
 }
-```
+{% endprettify %}
+
+### argument_type_not_assignable
+
+_The argument type '{0}' can't be assigned to the parameter type '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when the static type of an argument
+can't be assigned to the static type of the corresponding parameter.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+int f(int x) => x;
+num g(num y) => f([!y!]);
+{% endprettify %}
+
+#### Common fixes
+
+If possible, rewrite the code so that the static type is assignable. In the
+example above you might be able to change the type of the parameter `y`:
+
+{% prettify dart %}
+int f(int x) => x;
+int g(int y) => f(y);
+{% endprettify %}
+
+If that fix isn't possible, then add code to handle the case where the
+argument value isn't the required type. One approach is to coerce other
+types to the required type:
+
+{% prettify dart %}
+int f(int x) => x;
+num g(num y) => f(y.floor());
+{% endprettify %}
+
+Another approach is to add explicit type tests and fallback code:
+
+{% prettify dart %}
+int f(int x) => x;
+num g(num y) => f(y is int ? y : 0);
+{% endprettify %}
+
+If you believe that the runtime type of the argument will always be the
+same as the static type of the parameter, and you're willing to risk having
+an exception thrown at runtime if you're wrong, then add an explicit cast:
+
+{% prettify dart %}
+int f(int x) => x;
+num g(num y) => f(y as int);
+{% endprettify %}
+
+### const_initialized_with_non_constant_value
+
+_Const variables must be initialized with a constant value._
+
+#### Description
+
+The analyzer produces this diagnostic when a value that isn't statically
+known to be a constant is assigned to a variable that's declared to be a
+'const' variable.
+
+#### Example
+
+The following code produces this diagnostic because `x` isn't declared to
+be `const`:
+
+{% prettify dart %}
+var x = 0;
+const y = [!x!];
+{% endprettify %}
+
+#### Common fixes
+
+If the value being assigned can be declared to be `const`, then change the
+declaration:
+
+{% prettify dart %}
+const x = 0;
+const y = x;
+{% endprettify %}
+
+If the value can't be declared to be `const`, then remove the `const`
+modifier from the variable, possibly using `final` in its place:
+
+{% prettify dart %}
+var x = 0;
+final y = x;
+{% endprettify %}
 
 ### deprecated_member_use
 
@@ -159,17 +294,75 @@
 If the method `m` in the class `C` is annotated with `@deprecated`, then
 the following code produces this diagnostic:
 
-```dart
+{% prettify dart %}
 void f(C c) {
-  c.!m!();
+  c.[!m!]();
 }
-```
+{% endprettify %}
 
 #### Common fixes
 
 The documentation for declarations that are annotated with `@deprecated`
 should indicate what code to use in place of the deprecated code.
 
+### deprecated_member_use_from_same_package
+
+_'{0}' is deprecated and shouldn't be used._
+
+#### Description
+
+The analyzer produces this diagnostic when a deprecated library member or
+class member is used in the same package in which it's declared.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+@deprecated
+var x = 0;
+var y = [!x!];
+{% endprettify %}
+
+#### Common fixes
+
+The fix depends on what's been deprecated and what the replacement is. The
+documentation for deprecated declarations should indicate what code to use
+in place of the deprecated code.
+
+### equal_keys_in_const_map
+
+_Two keys in a constant map literal can't be equal._
+
+#### Description
+
+The analyzer produces this diagnostic when a key in a constant map is the
+same as a previous key in the same map. If two keys are the same, then the
+second value would overwrite the first value, which makes having both pairs
+pointless.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+const map = <int, String>{1: 'a', 2: 'b', [!1!]: 'c', 4: 'd'};
+{% endprettify %}
+
+#### Common fixes
+
+If one of the keys was supposed to be different, then replace it:
+
+{% prettify dart %}
+const map = <int, String>{1: 'a', 2: 'b', 3: 'c', 4: 'd'};
+{% endprettify %}
+
+Otherwise, remove the key/value pair that isn't intended to be in the map:
+
+{% prettify dart %}
+const map = <int, String>{1: 'a', 2: 'b', 4: 'd'};
+{% endprettify %}
+
 ### expression_in_map
 
 _Expressions can't be used in a map literal._
@@ -183,9 +376,9 @@
 
 The following code generates this diagnostic:
 
-```dart
-var map = <String, int>{'a': 0, 'b': 1, !'c'!};
-```
+{% prettify dart %}
+var map = <String, int>{'a': 0, 'b': 1, [!'c'!]};
+{% endprettify %}
 
 #### Common fix
 
@@ -193,9 +386,9 @@
 entry, fix the issue by replacing the expression with the key or the value.
 For example:
 
-```dart
+{% prettify dart %}
 var map = <String, int>{'a': 0, 'b': 1, 'c': 2};
-```
+{% endprettify %}
 
 ### invalid_literal_annotation
 
@@ -210,18 +403,165 @@
 
 The following code produces this diagnostic:
 
-```dart
-!@literal!
+{% prettify dart %}
+[!@literal!]
 var x;
-```
+{% endprettify %}
 
 #### Common fixes
 
 Remove the annotation:
 
-```dart
+{% prettify dart %}
 var x;
-```
+{% endprettify %}
+
+### invocation_of_non_function
+
+_'{0}' isn't a function._
+
+#### Description
+
+The analyzer produces this diagnostic when it finds a function invocation,
+but the name of the function being invoked is defined to be something other
+than a function.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+typedef Binary = int Function(int, int);
+int f() {
+  return [!Binary!](1, 2);
+}
+{% endprettify %}
+
+#### Common fixes
+
+Replace the name with the name of a function.
+
+### missing_return
+
+_This function has a return type of '{0}', but doesn't end with a return
+statement._
+
+#### Description
+
+Any function or method that doesn’t end with either an explicit return or a
+throw implicitly returns `null`. This is rarely the desired behavior. The
+analyzer produces this diagnostic when it finds an implicit return.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+[!int!] f(int x) {
+  if (x < 0) {
+    return 0;
+  }
+}
+{% endprettify %}
+
+#### Common fixes
+
+Add a return statement that makes the return value explicit, even if `null`
+is the appropriate value.
+
+### non_constant_list_element
+
+_The values in a const list literal must be constants._
+
+#### Description
+
+The analyzer produces this diagnostic when an element in a constant list
+literal isn't a constant value. The list literal can be constant either
+explicitly (because it's prefixed by the keyword `const`) or implicitly
+(because it appears in a <a href=”#constant-context”>constant context</a>).
+
+#### Example
+
+The following code produces this diagnostic because `x` isn't a constant,
+even though it appears in an implicitly constant list literal:
+
+{% prettify dart %}
+int x = 2;
+const y = <int>[0, 1, [!x!]];
+{% endprettify %}
+
+#### Common fixes
+
+If the list needs to be a constant list, then convert the element to be a
+constant. In the example above, you might add the keyword `const`
+to the declaration of `x`:
+
+{% prettify dart %}
+const int x = 2;
+const y = <int>[0, 1, x];
+{% endprettify %}
+
+If the expression can't be made a constant, then the list can't be a
+constant either, so you must change the code so that the list isn't a
+constant. In the example above this means removing the `const` keyword from
+the declaration of `y`:
+
+{% prettify dart %}
+int x = 2;
+var y = <int>[0, 1, x];
+{% endprettify %}
+
+### non_type_as_type_argument
+
+_The name '{0}' isn't a type so it can't be used as a type argument._
+
+#### Description
+
+The analyzer produces this diagnostic when an identifier that isn't a type
+is used as a type argument.
+
+#### Example
+
+The following code produces this diagnostic because `x` is a variable, not
+a type:
+
+{% prettify dart %}
+var x = 0;
+List<[!x!]> xList = [];
+{% endprettify %}
+
+#### Common fixes
+
+Change the type argument to be a type:
+
+{% prettify dart %}
+var x = 0;
+List<int> xList = [];
+{% endprettify %}
+
+### not_a_type
+
+_{0} isn't a type._
+
+#### Description
+
+The analyzer produces this diagnostic when a name is used as a type but
+declared to be something other than a type.
+
+#### Example
+
+The following code produces this diagnostic because `f` is a function:
+
+{% prettify dart %}
+f() {}
+main() {
+  [!f!] v = null;
+}
+{% endprettify %}
+
+#### Common fixes
+
+Replace the name with the name of a type.
 
 ### not_iterable_spread
 
@@ -237,31 +577,71 @@
 
 The following code generates this diagnostic:
 
-```dart
+{% prettify dart %}
 var m = <String, int>{'a': 0, 'b': 1};
-var s = <String>{...m};
-```
+var s = <String>{...[!m!]};
+{% endprettify %}
 
 #### Common fix
 
 The most common fix is to replace the expression with one that produces an
 iterable object:
 
-```dart
+{% prettify dart %}
 var m = <String, int>{'a': 0, 'b': 1};
 var s = <String>{...m.keys};
-```
+{% endprettify %}
+
+### redirect_to_non_class
+
+_The name '{0}' isn't a type and can't be used in a redirected constructor._
+
+#### Description
+
+One way to implement a factory constructor is to redirect to another
+constructor by referencing the name of the constructor. The analyzer
+produces this diagnostic when the redirect is to something other than a
+constructor.
+
+#### Example
+
+The following code produces this diagnostic because `f` is a function:
+
+{% prettify dart %}
+C f() {}
+class C {
+  factory C() = [!f!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the constructor isn't defined, then either define it or replace it with
+a constructor that is defined.
+
+If the constructor is defined but the class that defines it isn't visible,
+then you probably need to add an import.
+
+If you're trying to return the value returned by a function, then rewrite
+the constructor to return the value from the constructor's body:
+
+{% prettify dart %}
+C f() {}
+class C {
+  factory C() => f();
+}
+{% endprettify %}
 
 ### sdk_version_set_literal
 
-_Set literals weren't supported until version 2.2, but this code must 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._
 
 #### Description
 
 The analyzer produces this diagnostic when a set literal is found in code
 that has an SDK constraint whose lower bound is less than 2.2. Set literals
-were not supported in earlier versions, so this code won't be able to run
+weren't supported in earlier versions, so this code won't be able to run
 against earlier versions of the SDK.
 
 #### Example
@@ -276,9 +656,9 @@
 
 The following code generates this diagnostic:
 
-```dart
-var s = !<int>{}!;
-```
+{% prettify dart %}
+var s = [!<int>{}!];
+{% endprettify %}
 
 #### Common fixes
 
@@ -293,6 +673,472 @@
 If you do need to support older versions of the SDK, then replace the set
 literal with code that creates the set without the use of a literal:
 
-```dart
+{% prettify dart %}
 var s = new Set<int>();
-```
+{% endprettify %}
+
+### type_argument_not_matching_bounds
+
+_'{0}' doesn't extend '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when a type argument isn't the same
+as or a subclass of the bounds of the corresponding type parameter.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class A<E extends num> {}
+var a = A<[!String!]>();
+{% endprettify %}
+
+#### Common fixes
+
+Change the type argument to be a subclass of the bounds:
+
+{% prettify dart %}
+class A<E extends num> {}
+var a = A<int>();
+{% endprettify %}
+
+### undefined_class
+
+_Undefined class '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+appears to be the name of a class but either isn't defined or isn't visible
+in the scope in which it's being referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class Point {}
+void main() {
+  [!Piont!] p;
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the identifier isn't defined, then either define it or replace it with
+the name of a class that is defined. The example above can be corrected by
+fixing the spelling of the class:
+
+{% prettify dart %}
+class Point {}
+void main() {
+  Point p;
+}
+{% endprettify %}
+
+If the class is defined but isn't visible, then you probably need to add an
+import.
+
+### undefined_function
+
+_The function '{0}' isn't defined._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+appears to be the name of a function but either isn't defined or isn't
+visible in the scope in which it's being referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+List<int> empty() => [];
+void main() {
+  print([!emty!]());
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the identifier isn't defined, then either define it or replace it with
+the name of a function that is defined. The example above can be corrected
+by fixing the spelling of the function:
+
+{% prettify dart %}
+List<int> empty() => [];
+void main() {
+  print(empty());
+}
+{% endprettify %}
+
+If the function is defined but isn't visible, then you probably need to add
+an import or re-arrange your code to make the function visible.
+
+### undefined_getter
+
+_The getter '{0}' isn't defined for the class '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+appears to be the name of a getter but either isn't defined or isn't
+visible in the scope in which it's being referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class Point {
+  final int x;
+  final int y;
+  Point(this.x, this.y);
+  operator +(Point other) => Point(x + other.x, y + other.[!z!]);
+}
+{% endprettify %}
+
+#### Common fix
+
+If the identifier isn't defined, then either define it or replace it with
+the name of a getter that is defined. The example above can be corrected by
+fixing the spelling of the getter:
+
+{% prettify dart %}
+class Point {
+  final int x;
+  final int y;
+  Point(this.x, this.y);
+  operator +(Point other) => Point(x + other.x, y + other.y);
+}
+{% endprettify %}
+
+### undefined_identifier
+
+_Undefined name '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+either isn't defined or isn't visible in the scope in which it's being
+referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+int min(int left, int right) => left <= [!rihgt!] ? left : right;
+{% endprettify %}
+
+#### Common fixes
+
+If the identifier isn't defined, then either define it or replace it with
+an identifier that is defined. The example above can be corrected by
+fixing the spelling of the variable:
+
+{% prettify dart %}
+int min(int left, int right) => left <= right ? left : right;
+{% endprettify %}
+
+If the identifier is defined but isn't visible, then you probably need to
+add an import or re-arrange your code to make the identifier visible.
+
+### undefined_method
+
+_The method '{0}' isn't defined for the class '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+appears to be the name of a method but either isn't defined or isn't
+visible in the scope in which it's being referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+int f(List<int> l) => l.[!removeMiddle!]();
+{% endprettify %}
+
+#### Common fix
+
+If the identifier isn't defined, then either define it or replace it with
+the name of a method that is defined. The example above can be corrected by
+fixing the spelling of the method:
+
+{% prettify dart %}
+int f(List<int> l) => l.removeLast();
+{% endprettify %}
+
+### undefined_named_parameter
+
+_The named parameter '{0}' isn't defined._
+
+#### Description
+
+The analyzer produces this diagnostic when a method or function invocation
+has a named argument, but the method or function being invoked doesn’t
+define a parameter with the same name.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class C {
+  m({int b}) {}
+}
+void f(C c) {
+  c.m([!a!]: 1);
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the argument name is mistyped, then replace it with the correct name.
+The example above can be fixed by changing `a` to `b`:
+
+{% prettify dart %}
+class C {
+  m({int b}) {}
+}
+void f(C c) {
+  c.m(b: 1);
+}
+{% endprettify %}
+
+If a subclass adds a parameter with the name in question, then cast the
+target to the subclass:
+
+{% prettify dart %}
+class C {
+  m({int b}) {}
+}
+class D extends C {
+  m({int a, int b}) {}
+}
+void f(C c) {
+  (c as D).m(a: 1);
+}
+{% endprettify %}
+
+If the parameter should be added to the function, then add it:
+
+{% prettify dart %}
+class C {
+  m({int a, int b}) {}
+}
+void f(C c) {
+  c.m(a: 1);
+}
+{% endprettify %}
+
+### undefined_setter
+
+_The setter '{0}' isn't defined for the class '{1}'._
+
+#### Description
+
+The analyzer produces this diagnostic when it encounters an identifier that
+appears to be the name of a setter but either isn't defined or isn't
+visible in the scope in which the identifier is being referenced.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class Point {
+  int x;
+  int y;
+  Point(this.x, this.y);
+  void shiftBy(Point other) {
+    this.x += other.x;
+    this.[!z!] += other.y;
+  }
+}
+{% endprettify %}
+
+#### Common fix
+
+If the identifier isn't defined, then either define it or replace it with
+the name of a setter that is defined. The example above can be corrected by
+fixing the spelling of the setter:
+
+{% prettify dart %}
+class Point {
+  int x;
+  int y;
+  Point(this.x, this.y);
+  void shiftBy(Point other) {
+    this.x += other.x;
+    this.y += other.y;
+  }
+}
+{% endprettify %}
+
+### unused_element
+
+_The declaration '{0}' isn't referenced._
+
+#### Description
+
+The analyzer produces this diagnostic when a private class, enum, mixin,
+typedef, top level variable, top level function, or method is declared but
+never referenced.
+
+#### Example
+
+Assuming that no code in the library references `_C`, the following code
+produces this diagnostic:
+
+{% prettify dart %}
+class [!_C!] {}
+{% endprettify %}
+
+#### Common fixes
+
+If the declaration isn't needed, then remove it.
+
+If the declaration was intended to be used, then add the missing code.
+
+### unused_field
+
+_The value of the field '{0}' isn't used._
+
+#### Description
+
+The analyzer produces this diagnostic when a private field is declared but
+never read, even if it's written in one or more places.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+class Point {
+  int [!_x!];
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the field isn't needed, then remove it.
+
+If the field was intended to be used, then add the missing code.
+
+### unused_import
+
+_Unused import: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when an import isn't needed because
+none of the names that are imported are referenced within the importing
+library.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+import [!'dart:async'!];
+
+void main() {
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the import isn't needed, then remove it.
+
+If some of the imported names are intended to be used, then add the missing
+code.
+
+### unused_local_variable
+
+_The value of the local variable '{0}' isn't used._
+
+#### Description
+
+The analyzer produces this diagnostic when a local variable is declared but
+never read, even if it's written in one or more places.
+
+#### Example
+
+The following code produces this diagnostic:
+
+{% prettify dart %}
+void main() {
+  int [!count!] = 0;
+}
+{% endprettify %}
+
+#### Common fixes
+
+If the variable isn't needed, then remove it.
+
+If the variable was intended to be used, then add the missing code.
+
+### uri_does_not_exist
+
+_Target of URI doesn't exist: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when an import, export, or part
+directive is found where the URI refers to a file that doesn't exist.
+
+#### Example
+
+If the file `lib.dart` doesn't exist, the following code produces this
+diagnostic:
+
+{% prettify dart %}
+import [!'lib.dart'!];
+{% endprettify %}
+
+#### Common fixes
+
+If the URI was mistyped or invalid, then correct the URI.
+
+If the URI is correct, then create the file.
+
+### uri_has_not_been_generated
+
+_Target of URI hasn't been generated: '{0}'._
+
+#### Description
+
+The analyzer produces this diagnostic when an import, export, or part
+directive is found where the URI refers to a file that doesn't exist and
+the name of the file ends with a pattern that's commonly produced by code
+generators, such as one of the following:
+- `.g.dart`
+- `.pb.dart`
+- `.pbenum.dart`
+- `.pbserver.dart`
+- `.pbjson.dart`
+- `.template.dart`
+
+#### Example
+
+If the file `lib.g.dart` doesn't exist, the following code produces this
+diagnostic:
+
+{% prettify dart %}
+import [!'lib.g.dart'!];
+{% endprettify %}
+
+#### Common fixes
+
+If the file is a generated file, then run the generator that generates the
+file.
+
+If the file isn't a generated file, then check the spelling of the URI or
+create the file.
diff --git a/pkg/analyzer/tool/diagnostics/generate.dart b/pkg/analyzer/tool/diagnostics/generate.dart
index 4a27869..0c7efa6 100644
--- a/pkg/analyzer/tool/diagnostics/generate.dart
+++ b/pkg/analyzer/tool/diagnostics/generate.dart
@@ -27,8 +27,11 @@
   String outputPath =
       pathContext.join(analyzerPath, 'tool', 'diagnostics', 'diagnostics.md');
 
+  IOSink sink = File(outputPath).openWrite();
   DocumentationGenerator generator = DocumentationGenerator(docPaths);
-  generator.writeDocumentation(outputPath);
+  generator.writeDocumentation(sink);
+  await sink.flush();
+  await sink.close();
 }
 
 /// A class used to generate diagnostic documentation.
@@ -47,13 +50,10 @@
   }
 
   /// Write the documentation to the file at the given [outputPath].
-  void writeDocumentation(String outputPath) async {
-    IOSink sink = File(outputPath).openWrite();
+  void writeDocumentation(StringSink sink) {
     _writeHeader(sink);
-//    _writeGlossary(sink);
+    _writeGlossary(sink);
     _writeDiagnostics(sink);
-    await sink.flush();
-    await sink.close();
   }
 
   /// Return a version of the [text] in which characters that have special
@@ -80,12 +80,26 @@
       return null;
     }
     List<String> docs = [];
+    bool inDartCodeBlock = false;
     while (comments != null) {
       String lexeme = comments.lexeme;
       if (lexeme.startsWith('// TODO')) {
         break;
       } else if (lexeme.startsWith('// ')) {
-        docs.add(lexeme.substring(3));
+        String trimmedLine = lexeme.substring(3);
+        if (trimmedLine == '```dart') {
+          inDartCodeBlock = true;
+          docs.add('{% prettify dart %}');
+        } else if (trimmedLine == '```') {
+          if (inDartCodeBlock) {
+            docs.add('{% endprettify %}');
+            inDartCodeBlock = false;
+          } else {
+            docs.add(trimmedLine);
+          }
+        } else {
+          docs.add(trimmedLine);
+        }
       } else if (lexeme == '//') {
         docs.add('');
       }
@@ -163,7 +177,7 @@
   }
 
   /// Write the documentation for all of the diagnostics.
-  void _writeDiagnostics(IOSink sink) {
+  void _writeDiagnostics(StringSink sink) {
     sink.write('''
 
 ## Diagnostics
@@ -183,24 +197,64 @@
     }
   }
 
-//  /// Write the glossary.
-//  void _writeGlossary(IOSink sink) {
-//    sink.write('''
-//
-//## Glossary
-//
-//This page uses the following terms.
-//
+  /// Write the glossary.
+  void _writeGlossary(StringSink sink) {
+    sink.write('''
+
+## Glossary
+
+This page uses the following terms.
+
+### Constant context
+
+A _constant context_ is a region of code in which it isn't necessary to include
+the `const` keyword because it's implied by the fact that everything in that
+region is required to be a constant. The following locations are constant
+contexts:
+
+* Everything inside a list, map or set literal that's prefixed by the keyword
+  `const`. Example:
+
+  ```dart
+  var l = const [/*constant context*/];
+  ```
+
+* The arguments inside an invocation of a constant constructor. Example:
+
+  ```dart
+  var p = const Point(/*constant context*/);
+  ```
+
+* The initializer for a variable that's prefixed by the keyword `const`.
+  Example:
+
+  ```dart
+  const v = /*constant context*/;
+  ```
+
+* Annotations
+
+* The expression in a case clause. Example:
+
+  ```dart
+  void f(int e) {
+    switch (e) {
+      case /*constant context*/:
+        break;
+    }
+  }
+  ```
+''');
+
 //### Potentially non-nullable
 //
 //A type is _potentially non-nullable_ if it's either explicitly non-nullable or
 //if it's a type parameter. The latter case is included because the actual runtime
 //type might be non-nullable.
-//''');
-//  }
+  }
 
   /// Write the header of the file.
-  void _writeHeader(IOSink sink) {
+  void _writeHeader(StringSink sink) {
     sink.write('''
 ---
 title: Diagnostics
diff --git a/pkg/analyzer/tool/summary/generate.dart b/pkg/analyzer/tool/summary/generate.dart
index 2e0a224..5d6ad0b 100644
--- a/pkg/analyzer/tool/summary/generate.dart
+++ b/pkg/analyzer/tool/summary/generate.dart
@@ -732,7 +732,7 @@
                     'Class `$clsName`: TopLevel argument must be a string'
                     ' literal');
               }
-            } else if (annotation.arguments.length != 0) {
+            } else if (annotation.arguments.isNotEmpty) {
               throw new Exception(
                   'Class `$clsName`: TopLevel requires 0 or 1 arguments');
             }
@@ -752,7 +752,7 @@
                   'Class `$clsName`: @Variant argument must be a string literal',
                 );
               }
-            } else if (annotation.arguments.length != 0) {
+            } else if (annotation.arguments.isNotEmpty) {
               throw Exception(
                 'Class `$clsName`: @Variant requires 1 argument',
               );
diff --git a/pkg/analyzer/tool/summary/mini_ast.dart b/pkg/analyzer/tool/summary/mini_ast.dart
index 7a9f931..d766655 100644
--- a/pkg/analyzer/tool/summary/mini_ast.dart
+++ b/pkg/analyzer/tool/summary/mini_ast.dart
@@ -215,7 +215,8 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody");
     push(popList(memberCount,
         new List<ClassMember>.filled(memberCount, null, growable: true)));
@@ -297,8 +298,14 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     debugEvent("FormalParameter");
     pop(); // Name
     pop(); // Type
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index dd86768..be6d5f0 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -195,8 +195,6 @@
   PackageBundleAssembler assembler;
   final Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{};
 
-  final bool buildSummary2 = false;
-  final bool consumeSummary2 = false;
   final Map<String, ParsedUnitResult> inputParsedUnitResults = {};
   summary2.LinkedElementFactory elementFactory;
 
@@ -277,21 +275,21 @@
           });
 
           // Build and assemble linked libraries.
-          if (!options.buildSummaryOnlyUnlinked) {
-            // Prepare URIs of unlinked units that should be linked.
-            var unlinkedUris = new Set<String>();
-            for (var bundle in unlinkedBundles) {
-              unlinkedUris.addAll(bundle.unlinkedUnitUris);
-            }
-            for (var src in explicitSources) {
-              unlinkedUris.add('${src.uri}');
-            }
-            // Perform linking.
-            _computeLinkedLibraries(unlinkedUris);
-          }
-
-          if (buildSummary2) {
+          if (AnalysisDriver.useSummary2) {
             _computeLinkedLibraries2();
+          } else {
+            if (!options.buildSummaryOnlyUnlinked) {
+              // Prepare URIs of unlinked units that should be linked.
+              var unlinkedUris = new Set<String>();
+              for (var bundle in unlinkedBundles) {
+                unlinkedUris.addAll(bundle.unlinkedUnitUris);
+              }
+              for (var src in explicitSources) {
+                unlinkedUris.add('${src.uri}');
+              }
+              // Perform linking.
+              _computeLinkedLibraries(unlinkedUris);
+            }
           }
 
           // Write the whole package bundle.
@@ -339,9 +337,6 @@
    * add them to  the [assembler].
    */
   void _computeLinkedLibraries(Set<String> libraryUris) {
-    // Ensure that summary1 linking is done with summary1 rules.
-    AnalysisDriver.useSummary2 = false;
-
     logger.run('Link output summary', () {
       void trackDependency(String absoluteUri) {
         if (dependencyTracker != null) {
@@ -378,7 +373,6 @@
    * [inputParsedUnitResults] to produce linked libraries in [assembler].
    */
   void _computeLinkedLibraries2() {
-    AnalysisDriver.useSummary2 = consumeSummary2;
     logger.run('Link output summary2', () {
       var inputLibraries = <summary2.LinkInputLibrary>[];
 
@@ -520,9 +514,6 @@
     analysisOptions =
         createAnalysisOptionsForCommandLineOptions(options, rootPath);
 
-    // Ensure that FileState prepare summary2 information if necessary.
-    AnalysisDriver.useSummary2 = consumeSummary2;
-
     AnalysisDriverScheduler scheduler = new AnalysisDriverScheduler(logger);
     analysisDriver = new AnalysisDriver(
         scheduler,
@@ -538,7 +529,7 @@
     declaredVariables = new DeclaredVariables.fromMap(options.definedVariables);
     analysisDriver.declaredVariables = declaredVariables;
 
-    if (buildSummary2) {
+    if (AnalysisDriver.useSummary2) {
       _createLinkedElementFactory();
     }
 
@@ -609,10 +600,13 @@
       return;
     }
     var result = await analysisDriver.parseFile(source.fullName);
-    inputParsedUnitResults[result.path] = result;
-    UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(result.unit);
-    uriToUnit[absoluteUri] = unlinkedUnit;
-    assembler.addUnlinkedUnit(source, unlinkedUnit);
+    if (AnalysisDriver.useSummary2) {
+      inputParsedUnitResults[result.path] = result;
+    } else {
+      UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(result.unit);
+      uriToUnit[absoluteUri] = unlinkedUnit;
+      assembler.addUnlinkedUnit(source, unlinkedUnit);
+    }
   }
 
   /**
@@ -620,8 +614,6 @@
    * is sent to a new file at that path.
    */
   Future<void> _printErrors({String outputPath}) async {
-    AnalysisDriver.useSummary2 = consumeSummary2;
-
     await logger.runAsync('Compute and print analysis errors', () async {
       StringBuffer buffer = new StringBuffer();
       var severityProcessor = (AnalysisError error) =>
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 6330d84..526bc26 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/file_system/physical_file_system.dart';
 import 'package:analyzer/src/command_line/arguments.dart';
 import 'package:analyzer/src/context/builder.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/util/sdk.dart';
 import 'package:analyzer_cli/src/ansi.dart' as ansi;
@@ -269,6 +270,11 @@
     }
 
     if (options.buildSummaryOnlyUnlinked) {
+      if (AnalysisDriver.useSummary2) {
+        printAndFail('The option --build-summary-only-unlinked can not be used '
+            'together with summary2.');
+        return null; // Only reachable in testing.
+      }
       if (!options.buildSummaryOnly) {
         printAndFail(
             'The option --build-summary-only-unlinked can be used only '
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index cac47aa..2baf586 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -2,13 +2,13 @@
 description: Command line interface for the Dart Analyzer.
 publish_to: none
 dependencies:
-  analyzer: ^0.27.0
+  analyzer: ^0.37.0
   args: '>=0.13.0 <2.0.0'
   bazel_worker: ^0.1.0
   collection: ^1.14.1
   linter: ^0.1.16
   package_config: '>=0.1.5 <2.0.0'
-  protobuf: ^0.9.0
+  protobuf: ^0.13.0
   telemetry: ^0.0.1
   yaml: ^2.1.2
 dev_dependencies:
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index 8903b6a..02d79d9 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -8,6 +8,7 @@
 import 'package:analyzer/error/error.dart';
 import 'package:analyzer/source/error_processor.dart';
 import 'package:analyzer/src/analysis_options/analysis_options_provider.dart';
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/source.dart';
@@ -26,6 +27,7 @@
 main() {
   defineReflectiveSuite(() {
     defineReflectiveTests(BuildModeTest);
+    defineReflectiveTests(BuildModeSummaryDependenciesTest);
     defineReflectiveTests(ExitCodesTest);
     defineReflectiveTests(ExitCodesTest_PreviewDart2);
     defineReflectiveTests(LinterTest);
@@ -36,6 +38,86 @@
   }, name: 'Driver');
 }
 
+class AbstractBuildModeTest extends BaseTest {
+  Future<void> _doDrive(String path,
+      {String uri,
+      List<String> additionalArgs: const [],
+      String dartSdkSummaryPath}) async {
+    path = _p(path);
+
+    var optionsFileName = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
+    var options = _p('data/options_tests_project/' + optionsFileName);
+
+    List<String> args = <String>[];
+    if (dartSdkSummaryPath != null) {
+      args.add('--dart-sdk-summary');
+      args.add(dartSdkSummaryPath);
+    } else {
+      String sdkPath = _findSdkDirForSummaries();
+      args.add('--dart-sdk');
+      args.add(sdkPath);
+    }
+    args.add('--build-mode');
+    args.add('--format=machine');
+    args.addAll(additionalArgs);
+
+    uri ??= 'file:///test_file.dart';
+    String source = '$uri|$path';
+
+    await drive(source, args: args, options: options);
+  }
+
+  /// Try to find a appropriate directory to pass to "--dart-sdk" that will
+  /// allow summaries to be found.
+  String _findSdkDirForSummaries() {
+    Set<String> triedDirectories = new Set<String>();
+    bool isSuitable(String sdkDir) {
+      triedDirectories.add(sdkDir);
+      return new File(path.join(sdkDir, 'lib', '_internal', 'strong.sum'))
+          .existsSync();
+    }
+
+    String makeAbsoluteAndNormalized(String result) {
+      result = path.absolute(result);
+      result = path.normalize(result);
+      return result;
+    }
+
+    // Usually the sdk directory is the parent of the parent of the "dart"
+    // executable.
+    Directory executableParent = new File(Platform.executable).parent;
+    Directory executableGrandparent = executableParent.parent;
+    if (isSuitable(executableGrandparent.path)) {
+      return makeAbsoluteAndNormalized(executableGrandparent.path);
+    }
+    // During build bot execution, the sdk directory is simply the parent of the
+    // "dart" executable.
+    if (isSuitable(executableParent.path)) {
+      return makeAbsoluteAndNormalized(executableParent.path);
+    }
+    // If neither of those are suitable, assume we are running locally within the
+    // SDK project (e.g. within an IDE).  Find the build output directory and
+    // search all built configurations.
+    Directory sdkRootDir =
+        new File(Platform.script.toFilePath()).parent.parent.parent.parent;
+    for (String outDirName in ['out', 'xcodebuild']) {
+      Directory outDir = new Directory(path.join(sdkRootDir.path, outDirName));
+      if (outDir.existsSync()) {
+        for (FileSystemEntity subdir in outDir.listSync()) {
+          if (subdir is Directory) {
+            String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
+            if (isSuitable(candidateSdkDir)) {
+              return makeAbsoluteAndNormalized(candidateSdkDir);
+            }
+          }
+        }
+      }
+    }
+    throw new Exception('Could not find an SDK directory containing summaries.'
+        '  Tried: ${triedDirectories.toList()}');
+  }
+}
+
 class BaseTest {
   static const emptyOptionsFile = 'data/empty_options.yaml';
 
@@ -135,7 +217,266 @@
 }
 
 @reflectiveTest
-class BuildModeTest extends BaseTest {
+class BuildModeSummaryDependenciesTest extends AbstractBuildModeTest {
+  String tempDir;
+
+  /// Any direct export is a dependency.
+  test_export_direct() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], 'class A {}');
+      await _assertDependencies('c', [a], '''
+export 'package:a/a.dart';
+''', [a]);
+    });
+  }
+
+  /// Imports of dependencies are not necessary dependencies.
+  /// Here our dependency does not use its dependency.
+  test_import2_notUsed() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], '');
+      var b = await _buildPackage('b', [a], '''
+import 'package:a/a.dart';
+''');
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+''', [b]);
+    });
+  }
+
+  test_import2_usedAsFieldType() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], 'class A {}');
+      var b = await _buildPackage('b', [a], '''
+import 'package:a/a.dart';
+class B {
+  A f;
+}
+''');
+
+      // We don't use `f`, so don't depend on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+var x = B();
+''', [b]);
+
+      // We use `f` for type inference.
+      // So, dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+var x = B().f;
+''', [a, b]);
+
+      // We reference `f` in initializer, but not for type inference.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+Object x = B().f;
+''', [b]);
+
+      // We perform full analysis, so request the type of `f`;
+      // So, dependency on "a".
+      await _assertDependencies(
+        'c',
+        [a, b],
+        '''
+import 'package:b/b.dart';
+Object x = B().f;
+''',
+        [a, b],
+        summaryOnly: false,
+      );
+    });
+  }
+
+  test_import2_usedAsSupertype() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], 'class A {}');
+      var b = await _buildPackage('b', [a], '''
+import 'package:a/a.dart';
+class B extends A {}
+''');
+
+      // We don't invoke anything on class `B`, so don't ask its supertype.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+B x;
+''', [b]);
+
+      // We infer the type of `x` to `B`.
+      // But we don't ask `B` for its supertype.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+var x = B();
+''', [b]);
+
+      // We perform full analysis, and check that `new B()` is assignable
+      // to `B x`. While doing this, we ask for `B` supertype.
+      // So, dependency on "a".
+      await _assertDependencies(
+        'c',
+        [a, b],
+        '''
+import 'package:b/b.dart';
+var x = B();
+''',
+        [a, b],
+        summaryOnly: false,
+      );
+    });
+  }
+
+  test_import2_usedAsTopLevelVariableType() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], 'class A {}');
+      var b = await _buildPackage('b', [a], '''
+import 'package:a/a.dart';
+A v;
+''');
+
+      // We don't use `v`.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+''', [b]);
+
+      // We use `v` for type inference.
+      // So, dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+var x = v;
+''', [a, b]);
+
+      // We don't use `v` for type inference.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+Object x = v;
+''', [b]);
+
+      // We perform full analysis, and request the type of `v`.
+      // So, dependency on "a".
+      await _assertDependencies(
+        'c',
+        [a, b],
+        '''
+import 'package:b/b.dart';
+Object x = v;
+''',
+        [a, b],
+        summaryOnly: false,
+      );
+
+      // We use `v` in a method body.
+      // So, no dependency on "a".
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+main() {
+  v;
+}
+''', [b]);
+
+      // We perform full analysis, so ask for the type of `v`.
+      // So, dependency on "a".
+      await _assertDependencies(
+        'c',
+        [a, b],
+        '''
+import 'package:b/b.dart';
+main() {
+  v;
+}
+''',
+        [a, b],
+        summaryOnly: false,
+      );
+    });
+  }
+
+  /// Any direct import is a dependency.
+  test_import_direct() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], '');
+      var b = await _buildPackage('b', [], '');
+      await _assertDependencies('c', [a, b], '''
+import 'package:a/a.dart';
+import 'package:b/b.dart';
+''', [a, b]);
+    });
+  }
+
+  /// Exports of dependencies are dependencies.
+  test_import_export() async {
+    await _withTempDir(() async {
+      var a = await _buildPackage('a', [], 'class A {}');
+      var b = await _buildPackage('b', [a], '''
+export 'package:a/a.dart';
+''');
+      await _assertDependencies('c', [a, b], '''
+import 'package:b/b.dart';
+''', [a, b]);
+    });
+  }
+
+  Future<void> _assertDependencies(
+    String name,
+    List<_DependencyPackage> inputPackages,
+    String content,
+    List<_DependencyPackage> expectedPackages, {
+    bool summaryOnly = true,
+  }) async {
+    var pkg = await _buildPackage(name, inputPackages, content,
+        summaryOnly: summaryOnly);
+
+    var depString = File(pkg.dep).readAsStringSync();
+    var expectedList = expectedPackages.map((p) => p.sum).toList();
+    expect(depString.split('\n'), unorderedEquals(expectedList));
+  }
+
+  Future<_DependencyPackage> _buildPackage(
+    String name,
+    List<_DependencyPackage> inputPackages,
+    String content, {
+    bool summaryOnly = true,
+  }) async {
+    var filePath = path.join(tempDir, '$name.dart');
+    File(filePath).writeAsStringSync(content);
+    var pkg = _DependencyPackage(
+      name: name,
+      path: filePath,
+      uri: 'package:$name/$name.dart',
+      sum: path.join(tempDir, '$name.sum'),
+      dep: path.join(tempDir, '$name.dep'),
+    );
+
+    var args = <String>[];
+    if (summaryOnly) {
+      args.add('--build-summary-only');
+    }
+    for (var input in inputPackages) {
+      args.add('--build-summary-input=${input.sum}');
+    }
+    args.add('--build-summary-output=${pkg.sum}');
+    args.add('--summary-deps-output=${pkg.dep}');
+
+    await _doDrive(pkg.path, uri: pkg.uri, additionalArgs: args);
+    expect(exitCode, 0);
+
+    return pkg;
+  }
+
+  Future<void> _withTempDir(Future<void> f()) async {
+    await withTempDirAsync((tempDir) async {
+      this.tempDir = tempDir;
+      await f();
+    });
+  }
+}
+
+@reflectiveTest
+class BuildModeTest extends AbstractBuildModeTest {
   test_buildLinked() async {
     await withTempDirAsync((tempDir) async {
       var outputPath = path.join(tempDir, 'test_file.dart.sum');
@@ -148,13 +489,27 @@
       PackageBundle bundle =
           new PackageBundle.fromBuffer(await output.readAsBytes());
       var testFileUri = 'file:///test_file.dart';
-      expect(bundle.unlinkedUnitUris, equals([testFileUri]));
-      expect(bundle.linkedLibraryUris, equals([testFileUri]));
+      if (AnalysisDriver.useSummary2) {
+        var bundle2 = bundle.bundle2;
+        expect(_linkedLibraryUriList(bundle2), [testFileUri]);
+        expect(
+          _linkedLibraryUnitUriList(bundle2, testFileUri),
+          [testFileUri],
+        );
+      } else {
+        expect(bundle.unlinkedUnitUris, equals([testFileUri]));
+        expect(bundle.linkedLibraryUris, equals([testFileUri]));
+      }
       expect(exitCode, 0);
     });
   }
 
   test_buildLinked_buildSummaryOutputSemantic() async {
+    // All informative data is stored separately when summary2.
+    if (AnalysisDriver.useSummary2) {
+      return;
+    }
+
     await withTempDirAsync((tempDir) async {
       var testDart = path.join(tempDir, 'test.dart');
       var testSumFull = path.join(tempDir, 'test.sum.full');
@@ -194,6 +549,11 @@
   }
 
   test_buildLinked_fromUnlinked() async {
+    // We don't use unlinked units with summary2.
+    if (AnalysisDriver.useSummary2) {
+      return;
+    }
+
     await withTempDirAsync((tempDir) async {
       var aDart = path.join(tempDir, 'a.dart');
       var bDart = path.join(tempDir, 'b.dart');
@@ -258,6 +618,11 @@
   }
 
   test_buildUnlinked() async {
+    // We don't use unlinked units with summary2.
+    if (AnalysisDriver.useSummary2) {
+      return;
+    }
+
     await withTempDirAsync((tempDir) async {
       var outputPath = path.join(tempDir, 'test_file.dart.sum');
       await _doDrive(path.join('data', 'test_file.dart'), additionalArgs: [
@@ -309,8 +674,14 @@
         expect(exitCode, 0);
         var bytes = new File(aSum).readAsBytesSync();
         var bundle = new PackageBundle.fromBuffer(bytes);
-        expect(bundle.unlinkedUnitUris, equals([aUri]));
-        expect(bundle.linkedLibraryUris, equals([aUri]));
+        if (AnalysisDriver.useSummary2) {
+          var bundle2 = bundle.bundle2;
+          expect(_linkedLibraryUriList(bundle2), [aUri]);
+          expect(_linkedLibraryUnitUriList(bundle2, aUri), [aUri]);
+        } else {
+          expect(bundle.unlinkedUnitUris, equals([aUri]));
+          expect(bundle.linkedLibraryUris, equals([aUri]));
+        }
       }
 
       // Analyze package:bbb/b.dart and compute summary.
@@ -322,8 +693,14 @@
         expect(exitCode, 0);
         var bytes = new File(bSum).readAsBytesSync();
         var bundle = new PackageBundle.fromBuffer(bytes);
-        expect(bundle.unlinkedUnitUris, equals([bUri]));
-        expect(bundle.linkedLibraryUris, equals([bUri]));
+        if (AnalysisDriver.useSummary2) {
+          var bundle2 = bundle.bundle2;
+          expect(_linkedLibraryUriList(bundle2), [bUri]);
+          expect(_linkedLibraryUnitUriList(bundle2, bUri), [bUri]);
+        } else {
+          expect(bundle.unlinkedUnitUris, equals([bUri]));
+          expect(bundle.linkedLibraryUris, equals([bUri]));
+        }
       }
 
       // Analyze package:ccc/c.dart and compute summary.
@@ -335,8 +712,14 @@
         expect(exitCode, 0);
         var bytes = new File(cSum).readAsBytesSync();
         var bundle = new PackageBundle.fromBuffer(bytes);
-        expect(bundle.unlinkedUnitUris, equals([cUri]));
-        expect(bundle.linkedLibraryUris, equals([cUri]));
+        if (AnalysisDriver.useSummary2) {
+          var bundle2 = bundle.bundle2;
+          expect(_linkedLibraryUriList(bundle2), [cUri]);
+          expect(_linkedLibraryUnitUriList(bundle2, cUri), [cUri]);
+        } else {
+          expect(bundle.unlinkedUnitUris, equals([cUri]));
+          expect(bundle.linkedLibraryUris, equals([cUri]));
+        }
       }
     });
   }
@@ -364,6 +747,11 @@
   }
 
   test_error_linkedAsUnlinked() async {
+    // We don't use unlinked units with summary2.
+    if (AnalysisDriver.useSummary2) {
+      return;
+    }
+
     await withTempDirAsync((tempDir) async {
       var aDart = path.join(tempDir, 'a.dart');
       var bDart = path.join(tempDir, 'b.dart');
@@ -411,6 +799,11 @@
   }
 
   test_error_unlinkedAsLinked() async {
+    // We don't use unlinked units with summary2.
+    if (AnalysisDriver.useSummary2) {
+      return;
+    }
+
     await withTempDirAsync((tempDir) async {
       var aDart = path.join(tempDir, 'a.dart');
       var bDart = path.join(tempDir, 'b.dart');
@@ -485,82 +878,18 @@
     });
   }
 
-  Future<void> _doDrive(String path,
-      {String uri,
-      List<String> additionalArgs: const [],
-      String dartSdkSummaryPath}) async {
-    path = _p(path);
-
-    var optionsFileName = AnalysisEngine.ANALYSIS_OPTIONS_YAML_FILE;
-    var options = _p('data/options_tests_project/' + optionsFileName);
-
-    List<String> args = <String>[];
-    if (dartSdkSummaryPath != null) {
-      args.add('--dart-sdk-summary');
-      args.add(dartSdkSummaryPath);
-    } else {
-      String sdkPath = _findSdkDirForSummaries();
-      args.add('--dart-sdk');
-      args.add(sdkPath);
-    }
-    args.add('--build-mode');
-    args.add('--format=machine');
-    args.addAll(additionalArgs);
-
-    uri ??= 'file:///test_file.dart';
-    String source = '$uri|$path';
-
-    await drive(source, args: args, options: options);
+  Iterable<String> _linkedLibraryUnitUriList(
+    LinkedNodeBundle bundle2,
+    String libraryUriStr,
+  ) {
+    var libraries = bundle2.libraries;
+    var library = libraries.singleWhere((l) => l.uriStr == libraryUriStr);
+    return library.units.map((u) => u.uriStr).toList();
   }
 
-  /// Try to find a appropriate directory to pass to "--dart-sdk" that will
-  /// allow summaries to be found.
-  String _findSdkDirForSummaries() {
-    Set<String> triedDirectories = new Set<String>();
-    bool isSuitable(String sdkDir) {
-      triedDirectories.add(sdkDir);
-      return new File(path.join(sdkDir, 'lib', '_internal', 'strong.sum'))
-          .existsSync();
-    }
-
-    String makeAbsoluteAndNormalized(String result) {
-      result = path.absolute(result);
-      result = path.normalize(result);
-      return result;
-    }
-
-    // Usually the sdk directory is the parent of the parent of the "dart"
-    // executable.
-    Directory executableParent = new File(Platform.executable).parent;
-    Directory executableGrandparent = executableParent.parent;
-    if (isSuitable(executableGrandparent.path)) {
-      return makeAbsoluteAndNormalized(executableGrandparent.path);
-    }
-    // During build bot execution, the sdk directory is simply the parent of the
-    // "dart" executable.
-    if (isSuitable(executableParent.path)) {
-      return makeAbsoluteAndNormalized(executableParent.path);
-    }
-    // If neither of those are suitable, assume we are running locally within the
-    // SDK project (e.g. within an IDE).  Find the build output directory and
-    // search all built configurations.
-    Directory sdkRootDir =
-        new File(Platform.script.toFilePath()).parent.parent.parent.parent;
-    for (String outDirName in ['out', 'xcodebuild']) {
-      Directory outDir = new Directory(path.join(sdkRootDir.path, outDirName));
-      if (outDir.existsSync()) {
-        for (FileSystemEntity subdir in outDir.listSync()) {
-          if (subdir is Directory) {
-            String candidateSdkDir = path.join(subdir.path, 'dart-sdk');
-            if (isSuitable(candidateSdkDir)) {
-              return makeAbsoluteAndNormalized(candidateSdkDir);
-            }
-          }
-        }
-      }
-    }
-    throw new Exception('Could not find an SDK directory containing summaries.'
-        '  Tried: ${triedDirectories.toList()}');
+  Iterable<String> _linkedLibraryUriList(LinkedNodeBundle bundle2) {
+    var libraries = bundle2.libraries;
+    return libraries.map((l) => l.uriStr).toList();
   }
 }
 
@@ -973,3 +1302,13 @@
   @override
   noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
 }
+
+class _DependencyPackage {
+  final String name;
+  final String path;
+  final String uri;
+  final String sum;
+  final String dep;
+
+  _DependencyPackage({this.name, this.path, this.uri, this.sum, this.dep});
+}
diff --git a/pkg/analyzer_cli/test/options_test.dart b/pkg/analyzer_cli/test/options_test.dart
index 55621d3..ea5d4d4 100644
--- a/pkg/analyzer_cli/test/options_test.dart
+++ b/pkg/analyzer_cli/test/options_test.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/src/dart/analysis/experiments.dart';
 import 'package:analyzer/src/dart/analysis/experiments_impl.dart'
     show overrideKnownFeatures;
+import 'package:analyzer/src/dart/analysis/driver.dart';
 import 'package:analyzer_cli/src/driver.dart';
 import 'package:analyzer_cli/src/options.dart';
 import 'package:telemetry/telemetry.dart' as telemetry;
@@ -418,9 +419,19 @@
       '--build-summary-only-unlinked',
       'package:p/foo.dart|/path/to/p/lib/foo.dart'
     ]);
-    expect(options.buildMode, isTrue);
-    expect(options.buildSummaryOnly, isTrue);
-    expect(options.buildSummaryOnlyUnlinked, isTrue);
+    if (AnalysisDriver.useSummary2) {
+      expect(
+        errorStringBuffer.toString(),
+        contains(
+          'The option --build-summary-only-unlinked can not be used '
+          'together with summary2.',
+        ),
+      );
+    } else {
+      expect(options.buildMode, isTrue);
+      expect(options.buildSummaryOnly, isTrue);
+      expect(options.buildSummaryOnlyUnlinked, isTrue);
+    }
   }
 
   test_buildSummaryOutput() {
diff --git a/pkg/analyzer_fe_comparison/lib/src/kernel.dart b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
index bb7e328..b5df74b 100644
--- a/pkg/analyzer_fe_comparison/lib/src/kernel.dart
+++ b/pkg/analyzer_fe_comparison/lib/src/kernel.dart
@@ -19,8 +19,9 @@
 Future<ComparisonNode> analyzePackage(
     List<Uri> inputs, Uri packagesFileUri, Uri platformUri) async {
   var messages = <DiagnosticMessage>[];
-  var component = await kernelForComponent(
-      inputs, _makeCompilerOptions(packagesFileUri, platformUri, messages.add));
+  var component = (await kernelForModule(inputs,
+          _makeCompilerOptions(packagesFileUri, platformUri, messages.add)))
+      .component;
   if (messages.isNotEmpty) {
     return ComparisonNode(
         'Error occurred', messages.map(_diagnosticMessageToNode).toList());
@@ -42,8 +43,9 @@
 Future<ComparisonNode> analyzeProgram(Uri input, Uri packagesFileUri,
     Uri platformUri, bool uriFilter(Uri uri)) async {
   var messages = <DiagnosticMessage>[];
-  var component = await kernelForProgram(
-      input, _makeCompilerOptions(packagesFileUri, platformUri, messages.add));
+  var component = (await kernelForProgram(input,
+          _makeCompilerOptions(packagesFileUri, platformUri, messages.add)))
+      .component;
   if (messages.isNotEmpty) {
     return ComparisonNode(
         'Error occurred', messages.map(_diagnosticMessageToNode).toList());
diff --git a/pkg/analyzer_plugin/CHANGELOG.md b/pkg/analyzer_plugin/CHANGELOG.md
index 32d0093..8c46bac 100644
--- a/pkg/analyzer_plugin/CHANGELOG.md
+++ b/pkg/analyzer_plugin/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.2.0 (Not yet published)
+- Change `DartEditBuilder.writeOverride()` to accept `ExecutableElement`
+  instead of `FunctionType`.
+
+## 0.1.0
+
+- Support the latest `pkg:analyzer`.
+- remove the declared type of generated setters
+
 ## 0.0.1-alpha.8
 
 - Support the latest `pkg:analyzer`.
diff --git a/pkg/analyzer_plugin/analysis_options.yaml b/pkg/analyzer_plugin/analysis_options.yaml
index 7e84b0f..6517645 100644
--- a/pkg/analyzer_plugin/analysis_options.yaml
+++ b/pkg/analyzer_plugin/analysis_options.yaml
@@ -4,6 +4,7 @@
 linter:
   rules:
     - annotate_overrides
+    - avoid_return_types_on_setters
     - empty_constructor_bodies
     - empty_statements
     #- prefer_single_quotes
diff --git a/pkg/analyzer_plugin/doc/api.html b/pkg/analyzer_plugin/doc/api.html
index 910ab7a..2390ce2 100644
--- a/pkg/analyzer_plugin/doc/api.html
+++ b/pkg/analyzer_plugin/doc/api.html
@@ -1291,7 +1291,7 @@
       An enumeration of the kinds of elements.
     </p>
     
-  <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_FilePath">FilePath: String</a></dt><dd>
+  <dl><dt class="value">CLASS</dt><dt class="value">CLASS_TYPE_ALIAS</dt><dt class="value">COMPILATION_UNIT</dt><dt class="value">CONSTRUCTOR</dt><dt class="value">CONSTRUCTOR_INVOCATION</dt><dt class="value">ENUM</dt><dt class="value">ENUM_CONSTANT</dt><dt class="value">EXTENSION</dt><dt class="value">FIELD</dt><dt class="value">FILE</dt><dt class="value">FUNCTION</dt><dt class="value">FUNCTION_INVOCATION</dt><dt class="value">FUNCTION_TYPE_ALIAS</dt><dt class="value">GETTER</dt><dt class="value">LABEL</dt><dt class="value">LIBRARY</dt><dt class="value">LOCAL_VARIABLE</dt><dt class="value">METHOD</dt><dt class="value">MIXIN</dt><dt class="value">PARAMETER</dt><dt class="value">PREFIX</dt><dt class="value">SETTER</dt><dt class="value">TOP_LEVEL_VARIABLE</dt><dt class="value">TYPE_PARAMETER</dt><dt class="value">UNIT_TEST_GROUP</dt><dt class="value">UNIT_TEST_TEST</dt><dt class="value">UNKNOWN</dt></dl></dd><dt class="typeDefinition"><a name="type_FilePath">FilePath: String</a></dt><dd>
     
     <p>
       The absolute, normalized path of a file.
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
index 77cf688..75ea664 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_common.dart
@@ -33,7 +33,7 @@
   /**
    * The new content of the file.
    */
-  void set content(String value) {
+  set content(String value) {
     assert(value != null);
     this._content = value;
   }
@@ -136,7 +136,7 @@
   /**
    * The severity of the error.
    */
-  void set severity(AnalysisErrorSeverity value) {
+  set severity(AnalysisErrorSeverity value) {
     assert(value != null);
     this._severity = value;
   }
@@ -149,7 +149,7 @@
   /**
    * The type of the error.
    */
-  void set type(AnalysisErrorType value) {
+  set type(AnalysisErrorType value) {
     assert(value != null);
     this._type = value;
   }
@@ -162,7 +162,7 @@
   /**
    * The location associated with the error.
    */
-  void set location(Location value) {
+  set location(Location value) {
     assert(value != null);
     this._location = value;
   }
@@ -177,7 +177,7 @@
    * The message to be displayed for this error. The message should indicate
    * what is wrong with the code and why it is wrong.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -194,7 +194,7 @@
    * message should indicate how the user can fix the error. The field is
    * omitted if there is no correction message associated with the error code.
    */
-  void set correction(String value) {
+  set correction(String value) {
     this._correction = value;
   }
 
@@ -206,7 +206,7 @@
   /**
    * The name, as a string, of the error code associated with this error.
    */
-  void set code(String value) {
+  set code(String value) {
     assert(value != null);
     this._code = value;
   }
@@ -219,7 +219,7 @@
   /**
    * The URL of a page containing documentation associated with this error.
    */
-  void set url(String value) {
+  set url(String value) {
     this._url = value;
   }
 
@@ -233,7 +233,7 @@
    * Additional messages associated with this diagnostic that provide context
    * to help the user understand the diagnostic.
    */
-  void set contextMessages(List<DiagnosticMessage> value) {
+  set contextMessages(List<DiagnosticMessage> value) {
     this._contextMessages = value;
   }
 
@@ -259,7 +259,7 @@
    * no false positives should be returned. If a client sees this flag set they
    * can proceed with the confidence that there are in fact associated fixes.
    */
-  void set hasFix(bool value) {
+  set hasFix(bool value) {
     this._hasFix = value;
   }
 
@@ -592,7 +592,7 @@
   /**
    * The edits to be applied to the file.
    */
-  void set edits(List<SourceEdit> value) {
+  set edits(List<SourceEdit> value) {
     assert(value != null);
     this._edits = value;
   }
@@ -735,7 +735,7 @@
   /**
    * The kind of element being suggested.
    */
-  void set kind(CompletionSuggestionKind value) {
+  set kind(CompletionSuggestionKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -750,7 +750,7 @@
    * The relevance of this completion suggestion where a higher number
    * indicates a higher relevance.
    */
-  void set relevance(int value) {
+  set relevance(int value) {
     assert(value != null);
     this._relevance = value;
   }
@@ -769,7 +769,7 @@
    * additionally insert a template for the parameters. The information
    * required in order to do so is contained in other fields.
    */
-  void set completion(String value) {
+  set completion(String value) {
     assert(value != null);
     this._completion = value;
   }
@@ -786,7 +786,7 @@
    * only defined if the displayed text should be different than the
    * completion. Otherwise it is omitted.
    */
-  void set displayText(String value) {
+  set displayText(String value) {
     this._displayText = value;
   }
 
@@ -800,7 +800,7 @@
    * The offset, relative to the beginning of the completion, of where the
    * selection should be placed after insertion.
    */
-  void set selectionOffset(int value) {
+  set selectionOffset(int value) {
     assert(value != null);
     this._selectionOffset = value;
   }
@@ -813,7 +813,7 @@
   /**
    * The number of characters that should be selected after insertion.
    */
-  void set selectionLength(int value) {
+  set selectionLength(int value) {
     assert(value != null);
     this._selectionLength = value;
   }
@@ -826,7 +826,7 @@
   /**
    * True if the suggested element is deprecated.
    */
-  void set isDeprecated(bool value) {
+  set isDeprecated(bool value) {
     assert(value != null);
     this._isDeprecated = value;
   }
@@ -841,7 +841,7 @@
    * True if the element is not known to be valid for the target. This happens
    * if the type of the target is dynamic.
    */
-  void set isPotential(bool value) {
+  set isPotential(bool value) {
     assert(value != null);
     this._isPotential = value;
   }
@@ -858,7 +858,7 @@
    * suggested. This field is omitted if there is no Dartdoc associated with
    * the element.
    */
-  void set docSummary(String value) {
+  set docSummary(String value) {
     this._docSummary = value;
   }
 
@@ -872,7 +872,7 @@
    * The Dartdoc associated with the element being suggested. This field is
    * omitted if there is no Dartdoc associated with the element.
    */
-  void set docComplete(String value) {
+  set docComplete(String value) {
     this._docComplete = value;
   }
 
@@ -886,7 +886,7 @@
    * The class that declares the element being suggested. This field is omitted
    * if the suggested element is not a member of a class.
    */
-  void set declaringType(String value) {
+  set declaringType(String value) {
     this._declaringType = value;
   }
 
@@ -900,7 +900,7 @@
    * A default String for use in generating argument list source contents on
    * the client side.
    */
-  void set defaultArgumentListString(String value) {
+  set defaultArgumentListString(String value) {
     this._defaultArgumentListString = value;
   }
 
@@ -922,7 +922,7 @@
    * of length 1, starting at offsets 0 and 3. Clients can use these ranges to
    * treat the 'x' and 'y' values specially for linked edits.
    */
-  void set defaultArgumentListTextRanges(List<int> value) {
+  set defaultArgumentListTextRanges(List<int> value) {
     this._defaultArgumentListTextRanges = value;
   }
 
@@ -934,7 +934,7 @@
   /**
    * Information about the element reference being suggested.
    */
-  void set element(Element value) {
+  set element(Element value) {
     this._element = value;
   }
 
@@ -950,7 +950,7 @@
    * being suggested. This field is omitted if the suggested element is not a
    * getter, function or method.
    */
-  void set returnType(String value) {
+  set returnType(String value) {
     this._returnType = value;
   }
 
@@ -966,7 +966,7 @@
    * This field is omitted if the suggested element is not a setter, function
    * or method.
    */
-  void set parameterNames(List<String> value) {
+  set parameterNames(List<String> value) {
     this._parameterNames = value;
   }
 
@@ -980,7 +980,7 @@
    * The types of the parameters of the function or method being suggested.
    * This field is omitted if the parameterNames field is omitted.
    */
-  void set parameterTypes(List<String> value) {
+  set parameterTypes(List<String> value) {
     this._parameterTypes = value;
   }
 
@@ -994,7 +994,7 @@
    * The number of required parameters for the function or method being
    * suggested. This field is omitted if the parameterNames field is omitted.
    */
-  void set requiredParameterCount(int value) {
+  set requiredParameterCount(int value) {
     this._requiredParameterCount = value;
   }
 
@@ -1008,7 +1008,7 @@
    * True if the function or method being suggested has at least one named
    * parameter. This field is omitted if the parameterNames field is omitted.
    */
-  void set hasNamedParameters(bool value) {
+  set hasNamedParameters(bool value) {
     this._hasNamedParameters = value;
   }
 
@@ -1024,7 +1024,7 @@
    * if the suggestion is not the addition of an optional argument within an
    * argument list.
    */
-  void set parameterName(String value) {
+  set parameterName(String value) {
     this._parameterName = value;
   }
 
@@ -1038,7 +1038,7 @@
    * The type of the options parameter being suggested. This field is omitted
    * if the parameterName field is omitted.
    */
-  void set parameterType(String value) {
+  set parameterType(String value) {
     this._parameterType = value;
   }
 
@@ -1514,7 +1514,7 @@
   /**
    * The message to be displayed to the user.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -1529,7 +1529,7 @@
    * The location associated with or referenced by the message. Clients should
    * provide the ability to navigate to the location.
    */
-  void set location(Location value) {
+  set location(Location value) {
     assert(value != null);
     this._location = value;
   }
@@ -1655,7 +1655,7 @@
   /**
    * The kind of the element.
    */
-  void set kind(ElementKind value) {
+  set kind(ElementKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -1670,7 +1670,7 @@
    * The name of the element. This is typically used as the label in the
    * outline.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -1683,7 +1683,7 @@
   /**
    * The location of the name in the declaration of the element.
    */
-  void set location(Location value) {
+  set location(Location value) {
     this._location = value;
   }
 
@@ -1711,7 +1711,7 @@
    * - 0x10 - set if the element is private
    * - 0x20 - set if the element is deprecated
    */
-  void set flags(int value) {
+  set flags(int value) {
     assert(value != null);
     this._flags = value;
   }
@@ -1730,7 +1730,7 @@
    * parameters (e.g. getter), this field will not be defined. If the element
    * has zero parameters, this field will have a value of "()".
    */
-  void set parameters(String value) {
+  set parameters(String value) {
     this._parameters = value;
   }
 
@@ -1746,7 +1746,7 @@
    * this field will not be defined. If the element does not have a declared
    * return type, this field will contain an empty string.
    */
-  void set returnType(String value) {
+  set returnType(String value) {
     this._returnType = value;
   }
 
@@ -1760,7 +1760,7 @@
    * The type parameter list for the element. If the element doesn't have type
    * parameters, this field will not be defined.
    */
-  void set typeParameters(String value) {
+  set typeParameters(String value) {
     this._typeParameters = value;
   }
 
@@ -1903,6 +1903,7 @@
  *   CONSTRUCTOR_INVOCATION
  *   ENUM
  *   ENUM_CONSTANT
+ *   EXTENSION
  *   FIELD
  *   FILE
  *   FUNCTION
@@ -1944,6 +1945,8 @@
 
   static const ElementKind ENUM_CONSTANT = const ElementKind._("ENUM_CONSTANT");
 
+  static const ElementKind EXTENSION = const ElementKind._("EXTENSION");
+
   static const ElementKind FIELD = const ElementKind._("FIELD");
 
   static const ElementKind FILE = const ElementKind._("FILE");
@@ -2000,6 +2003,7 @@
     CONSTRUCTOR_INVOCATION,
     ENUM,
     ENUM_CONSTANT,
+    EXTENSION,
     FIELD,
     FILE,
     FUNCTION,
@@ -2042,6 +2046,8 @@
         return ENUM;
       case "ENUM_CONSTANT":
         return ENUM_CONSTANT;
+      case "EXTENSION":
+        return EXTENSION;
       case "FIELD":
         return FIELD;
       case "FILE":
@@ -2221,7 +2227,7 @@
   /**
    * The kind of the region.
    */
-  void set kind(FoldingKind value) {
+  set kind(FoldingKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -2234,7 +2240,7 @@
   /**
    * The offset of the region to be folded.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -2247,7 +2253,7 @@
   /**
    * The length of the region to be folded.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -2347,7 +2353,7 @@
   /**
    * The type of highlight associated with the region.
    */
-  void set type(HighlightRegionType value) {
+  set type(HighlightRegionType value) {
     assert(value != null);
     this._type = value;
   }
@@ -2360,7 +2366,7 @@
   /**
    * The offset of the region to be highlighted.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -2373,7 +2379,7 @@
   /**
    * The length of the region to be highlighted.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -3177,7 +3183,7 @@
   /**
    * The ticket of the source node.
    */
-  void set source(KytheVName value) {
+  set source(KytheVName value) {
     assert(value != null);
     this._source = value;
   }
@@ -3190,7 +3196,7 @@
   /**
    * An edge label. The schema defines which labels are meaningful.
    */
-  void set kind(String value) {
+  set kind(String value) {
     this._kind = value;
   }
 
@@ -3202,7 +3208,7 @@
   /**
    * The ticket of the target node.
    */
-  void set target(KytheVName value) {
+  set target(KytheVName value) {
     this._target = value;
   }
 
@@ -3214,7 +3220,7 @@
   /**
    * A fact label. The schema defines which fact labels are meaningful.
    */
-  void set fact(String value) {
+  set fact(String value) {
     assert(value != null);
     this._fact = value;
   }
@@ -3227,7 +3233,7 @@
   /**
    * The String value of the fact.
    */
-  void set value(List<int> value) {
+  set value(List<int> value) {
     this._value = value;
   }
 
@@ -3356,7 +3362,7 @@
   /**
    * An opaque signature generated by the analyzer.
    */
-  void set signature(String value) {
+  set signature(String value) {
     assert(value != null);
     this._signature = value;
   }
@@ -3373,7 +3379,7 @@
    * a collection of related files, such as the contents of a given source
    * repository.
    */
-  void set corpus(String value) {
+  set corpus(String value) {
     assert(value != null);
     this._corpus = value;
   }
@@ -3390,7 +3396,7 @@
    * identifier, denoting a distinct subset of the corpus. This may also be
    * used to designate virtual collections like generated files.
    */
-  void set root(String value) {
+  set root(String value) {
     assert(value != null);
     this._root = value;
   }
@@ -3405,7 +3411,7 @@
    * A path-structured label describing the “location” of the named object
    * relative to the corpus and the root.
    */
-  void set path(String value) {
+  set path(String value) {
     assert(value != null);
     this._path = value;
   }
@@ -3418,7 +3424,7 @@
   /**
    * The language this name belongs to.
    */
-  void set language(String value) {
+  set language(String value) {
     assert(value != null);
     this._language = value;
   }
@@ -3540,7 +3546,7 @@
   /**
    * The positions of the regions that should be edited simultaneously.
    */
-  void set positions(List<Position> value) {
+  set positions(List<Position> value) {
     assert(value != null);
     this._positions = value;
   }
@@ -3553,7 +3559,7 @@
   /**
    * The length of the regions that should be edited simultaneously.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -3568,7 +3574,7 @@
    * Pre-computed suggestions for what every region might want to be changed
    * to.
    */
-  void set suggestions(List<LinkedEditSuggestion> value) {
+  set suggestions(List<LinkedEditSuggestion> value) {
     assert(value != null);
     this._suggestions = value;
   }
@@ -3698,7 +3704,7 @@
   /**
    * The value that could be used to replace all of the linked edit regions.
    */
-  void set value(String value) {
+  set value(String value) {
     assert(value != null);
     this._value = value;
   }
@@ -3711,7 +3717,7 @@
   /**
    * The kind of value being proposed.
    */
-  void set kind(LinkedEditSuggestionKind value) {
+  set kind(LinkedEditSuggestionKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -3874,7 +3880,7 @@
   /**
    * The file containing the range.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -3887,7 +3893,7 @@
   /**
    * The offset of the range.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -3900,7 +3906,7 @@
   /**
    * The length of the range.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -3915,7 +3921,7 @@
    * The one-based index of the line containing the first character of the
    * range.
    */
-  void set startLine(int value) {
+  set startLine(int value) {
     assert(value != null);
     this._startLine = value;
   }
@@ -3930,7 +3936,7 @@
    * The one-based index of the column containing the first character of the
    * range.
    */
-  void set startColumn(int value) {
+  set startColumn(int value) {
     assert(value != null);
     this._startColumn = value;
   }
@@ -4052,7 +4058,7 @@
   /**
    * The offset of the region from which the user can navigate.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -4065,7 +4071,7 @@
   /**
    * The length of the region from which the user can navigate.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -4082,7 +4088,7 @@
    * the given region is bound. By opening the target, clients can implement
    * one form of navigation. This list cannot be empty.
    */
-  void set targets(List<int> value) {
+  set targets(List<int> value) {
     assert(value != null);
     this._targets = value;
   }
@@ -4191,7 +4197,7 @@
   /**
    * The kind of the element.
    */
-  void set kind(ElementKind value) {
+  set kind(ElementKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -4206,7 +4212,7 @@
    * The index of the file (in the enclosing navigation response) to navigate
    * to.
    */
-  void set fileIndex(int value) {
+  set fileIndex(int value) {
     assert(value != null);
     this._fileIndex = value;
   }
@@ -4219,7 +4225,7 @@
   /**
    * The offset of the region to which the user can navigate.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -4232,7 +4238,7 @@
   /**
    * The length of the region to which the user can navigate.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -4247,7 +4253,7 @@
    * The one-based index of the line containing the first character of the
    * region.
    */
-  void set startLine(int value) {
+  set startLine(int value) {
     assert(value != null);
     this._startLine = value;
   }
@@ -4262,7 +4268,7 @@
    * The one-based index of the column containing the first character of the
    * region.
    */
-  void set startColumn(int value) {
+  set startColumn(int value) {
     assert(value != null);
     this._startColumn = value;
   }
@@ -4397,7 +4403,7 @@
   /**
    * The element that was referenced.
    */
-  void set element(Element value) {
+  set element(Element value) {
     assert(value != null);
     this._element = value;
   }
@@ -4410,7 +4416,7 @@
   /**
    * The offsets of the name of the referenced element within the file.
    */
-  void set offsets(List<int> value) {
+  set offsets(List<int> value) {
     assert(value != null);
     this._offsets = value;
   }
@@ -4423,7 +4429,7 @@
   /**
    * The length of the name of the referenced element.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -4533,7 +4539,7 @@
   /**
    * A description of the element represented by this node.
    */
-  void set element(Element value) {
+  set element(Element value) {
     assert(value != null);
     this._element = value;
   }
@@ -4552,7 +4558,7 @@
    * It can be used, for example, to map locations in the file back to an
    * outline.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -4565,7 +4571,7 @@
   /**
    * The length of the element.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -4580,7 +4586,7 @@
    * The offset of the first character of the element code, which is neither
    * documentation, nor annotation.
    */
-  void set codeOffset(int value) {
+  set codeOffset(int value) {
     assert(value != null);
     this._codeOffset = value;
   }
@@ -4593,7 +4599,7 @@
   /**
    * The length of the element code.
    */
-  void set codeLength(int value) {
+  set codeLength(int value) {
     assert(value != null);
     this._codeLength = value;
   }
@@ -4608,7 +4614,7 @@
    * The children of the node. The field will be omitted if the node has no
    * children. Children are sorted by offset.
    */
-  void set children(List<Outline> value) {
+  set children(List<Outline> value) {
     this._children = value;
   }
 
@@ -4750,7 +4756,7 @@
   /**
    * The kind of the parameter.
    */
-  void set kind(ParameterKind value) {
+  set kind(ParameterKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -4763,7 +4769,7 @@
   /**
    * The name of the parameter.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -4776,7 +4782,7 @@
   /**
    * The type of the parameter.
    */
-  void set type(String value) {
+  set type(String value) {
     assert(value != null);
     this._type = value;
   }
@@ -4791,7 +4797,7 @@
    * The default value for this parameter. This value will be omitted if the
    * parameter does not have a default value.
    */
-  void set defaultValue(String value) {
+  set defaultValue(String value) {
     this._defaultValue = value;
   }
 
@@ -4970,7 +4976,7 @@
   /**
    * The file containing the position.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -4983,7 +4989,7 @@
   /**
    * The offset of the position.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -5184,7 +5190,7 @@
    * The unique identifier of the parameter. Clients may omit this field for
    * the parameters they want to add.
    */
-  void set id(String value) {
+  set id(String value) {
     this._id = value;
   }
 
@@ -5196,7 +5202,7 @@
   /**
    * The kind of the parameter.
    */
-  void set kind(RefactoringMethodParameterKind value) {
+  set kind(RefactoringMethodParameterKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -5211,7 +5217,7 @@
    * The type that should be given to the parameter, or the return type of the
    * parameter's function type.
    */
-  void set type(String value) {
+  set type(String value) {
     assert(value != null);
     this._type = value;
   }
@@ -5224,7 +5230,7 @@
   /**
    * The name that should be given to the parameter.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -5241,7 +5247,7 @@
    * not of a function type, this field will not be defined. If the function
    * type has zero parameters, this field will have a value of '()'.
    */
-  void set parameters(String value) {
+  set parameters(String value) {
     this._parameters = value;
   }
 
@@ -5427,7 +5433,7 @@
   /**
    * The severity of the problem being represented.
    */
-  void set severity(RefactoringProblemSeverity value) {
+  set severity(RefactoringProblemSeverity value) {
     assert(value != null);
     this._severity = value;
   }
@@ -5440,7 +5446,7 @@
   /**
    * A human-readable description of the problem being represented.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -5457,7 +5463,7 @@
    * unless there is a specific location associated with the problem (such as a
    * location where an element being renamed will be shadowed).
    */
-  void set location(Location value) {
+  set location(Location value) {
     this._location = value;
   }
 
@@ -5718,7 +5724,7 @@
   /**
    * A human-readable description of the change to be applied.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -5731,7 +5737,7 @@
   /**
    * A list of the edits used to effect the change, grouped by file.
    */
-  void set edits(List<SourceFileEdit> value) {
+  set edits(List<SourceFileEdit> value) {
     assert(value != null);
     this._edits = value;
   }
@@ -5746,7 +5752,7 @@
    * A list of the linked editing groups used to customize the changes that
    * were made.
    */
-  void set linkedEditGroups(List<LinkedEditGroup> value) {
+  set linkedEditGroups(List<LinkedEditGroup> value) {
     assert(value != null);
     this._linkedEditGroups = value;
   }
@@ -5759,7 +5765,7 @@
   /**
    * The position that should be selected after the edits have been applied.
    */
-  void set selection(Position value) {
+  set selection(Position value) {
     this._selection = value;
   }
 
@@ -5773,7 +5779,7 @@
    * The optional identifier of the change kind. The identifier remains stable
    * even if the message changes, or is parameterized.
    */
-  void set id(String value) {
+  set id(String value) {
     this._id = value;
   }
 
@@ -5957,7 +5963,7 @@
   /**
    * The offset of the region to be modified.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -5970,7 +5976,7 @@
   /**
    * The length of the region to be modified.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -5983,7 +5989,7 @@
   /**
    * The code that is to replace the specified region in the original code.
    */
-  void set replacement(String value) {
+  set replacement(String value) {
     assert(value != null);
     this._replacement = value;
   }
@@ -6010,7 +6016,7 @@
    * id so that they can be referenced. Edits in the same response that do not
    * need to be referenced will not have an id.
    */
-  void set id(String value) {
+  set id(String value) {
     this._id = value;
   }
 
@@ -6129,7 +6135,7 @@
   /**
    * The file containing the code to be modified.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -6150,7 +6156,7 @@
    * sure that the file was not changed since then, so it is safe to apply the
    * change.
    */
-  void set fileStamp(int value) {
+  set fileStamp(int value) {
     assert(value != null);
     this._fileStamp = value;
   }
@@ -6163,7 +6169,7 @@
   /**
    * A list of the edits used to effect the change.
    */
-  void set edits(List<SourceEdit> value) {
+  set edits(List<SourceEdit> value) {
     assert(value != null);
     this._edits = value;
   }
diff --git a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
index eee9d22e..756f1eb 100644
--- a/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
+++ b/pkg/analyzer_plugin/lib/protocol/protocol_generated.dart
@@ -36,7 +36,7 @@
   /**
    * The error with which the fixes are associated.
    */
-  void set error(AnalysisError value) {
+  set error(AnalysisError value) {
     assert(value != null);
     this._error = value;
   }
@@ -49,7 +49,7 @@
   /**
    * The fixes associated with the error.
    */
-  void set fixes(List<PrioritizedSourceChange> value) {
+  set fixes(List<PrioritizedSourceChange> value) {
     assert(value != null);
     this._fixes = value;
   }
@@ -148,7 +148,7 @@
   /**
    * The file containing the errors.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -161,7 +161,7 @@
   /**
    * The errors contained in the file.
    */
-  void set errors(List<AnalysisError> value) {
+  set errors(List<AnalysisError> value) {
     assert(value != null);
     this._errors = value;
   }
@@ -262,7 +262,7 @@
   /**
    * The file containing the folding regions.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -275,7 +275,7 @@
   /**
    * The folding regions contained in the file.
    */
-  void set regions(List<FoldingRegion> value) {
+  set regions(List<FoldingRegion> value) {
     assert(value != null);
     this._regions = value;
   }
@@ -379,7 +379,7 @@
   /**
    * The file in which navigation information is being requested.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -394,7 +394,7 @@
    * The offset of the region for which navigation information is being
    * requested.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -409,7 +409,7 @@
    * The length of the region for which navigation information is being
    * requested.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -521,7 +521,7 @@
    * A list of the paths of files that are referenced by the navigation
    * targets.
    */
-  void set files(List<String> value) {
+  set files(List<String> value) {
     assert(value != null);
     this._files = value;
   }
@@ -536,7 +536,7 @@
    * A list of the navigation targets that are referenced by the navigation
    * regions.
    */
-  void set targets(List<NavigationTarget> value) {
+  set targets(List<NavigationTarget> value) {
     assert(value != null);
     this._targets = value;
   }
@@ -549,7 +549,7 @@
   /**
    * A list of the navigation regions within the requested region of the file.
    */
-  void set regions(List<NavigationRegion> value) {
+  set regions(List<NavigationRegion> value) {
     assert(value != null);
     this._regions = value;
   }
@@ -669,7 +669,7 @@
   /**
    * The watch events that the plugin should handle.
    */
-  void set events(List<WatchEvent> value) {
+  set events(List<WatchEvent> value) {
     assert(value != null);
     this._events = value;
   }
@@ -790,7 +790,7 @@
   /**
    * The file containing the highlight regions.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -803,7 +803,7 @@
   /**
    * The highlight regions contained in the file.
    */
-  void set regions(List<HighlightRegion> value) {
+  set regions(List<HighlightRegion> value) {
     assert(value != null);
     this._regions = value;
   }
@@ -910,7 +910,7 @@
   /**
    * The file containing the navigation regions.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -923,7 +923,7 @@
   /**
    * The navigation regions contained in the file.
    */
-  void set regions(List<NavigationRegion> value) {
+  set regions(List<NavigationRegion> value) {
     assert(value != null);
     this._regions = value;
   }
@@ -938,7 +938,7 @@
    * The navigation targets referenced in the file. They are referenced by
    * NavigationRegions by their index in this array.
    */
-  void set targets(List<NavigationTarget> value) {
+  set targets(List<NavigationTarget> value) {
     assert(value != null);
     this._targets = value;
   }
@@ -953,7 +953,7 @@
    * The files containing navigation targets referenced in the file. They are
    * referenced by NavigationTargets by their index in this array.
    */
-  void set files(List<String> value) {
+  set files(List<String> value) {
     assert(value != null);
     this._files = value;
   }
@@ -1082,7 +1082,7 @@
   /**
    * The file in which the references occur.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -1095,7 +1095,7 @@
   /**
    * The occurrences of references to elements within the file.
    */
-  void set occurrences(List<Occurrences> value) {
+  set occurrences(List<Occurrences> value) {
     assert(value != null);
     this._occurrences = value;
   }
@@ -1197,7 +1197,7 @@
   /**
    * The file with which the outline is associated.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -1210,7 +1210,7 @@
   /**
    * The outline fragments associated with the file.
    */
-  void set outline(List<Outline> value) {
+  set outline(List<Outline> value) {
     assert(value != null);
     this._outline = value;
   }
@@ -1383,7 +1383,7 @@
   /**
    * A list of the context roots that should be analyzed.
    */
-  void set roots(List<ContextRoot> value) {
+  set roots(List<ContextRoot> value) {
     assert(value != null);
     this._roots = value;
   }
@@ -1500,7 +1500,7 @@
   /**
    * The files that are to be a priority for analysis.
    */
-  void set files(List<String> value) {
+  set files(List<String> value) {
     assert(value != null);
     this._files = value;
   }
@@ -1615,7 +1615,7 @@
    * A table mapping services to a list of the files being subscribed to the
    * service.
    */
-  void set subscriptions(Map<AnalysisService, List<String>> value) {
+  set subscriptions(Map<AnalysisService, List<String>> value) {
     assert(value != null);
     this._subscriptions = value;
   }
@@ -1740,7 +1740,7 @@
    * A table mapping the files whose content has changed to a description of
    * the content change.
    */
-  void set files(Map<String, dynamic> value) {
+  set files(Map<String, dynamic> value) {
     assert(value != null);
     this._files = value;
   }
@@ -1868,7 +1868,7 @@
   /**
    * The file containing the point at which suggestions are to be made.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -1881,7 +1881,7 @@
   /**
    * The offset within the file at which suggestions are to be made.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -1986,7 +1986,7 @@
    * portion of an identifier before the original offset. In particular, the
    * replacementOffset will be the offset of the beginning of said identifier.
    */
-  void set replacementOffset(int value) {
+  set replacementOffset(int value) {
     assert(value != null);
     this._replacementOffset = value;
   }
@@ -2003,7 +2003,7 @@
    * containing the cursor is to be replaced when the suggestion is applied
    * (that is, the number of characters in the existing identifier).
    */
-  void set replacementLength(int value) {
+  set replacementLength(int value) {
     assert(value != null);
     this._replacementLength = value;
   }
@@ -2024,7 +2024,7 @@
    * client to respond to further keystrokes from the user without having to
    * make additional requests.
    */
-  void set results(List<CompletionSuggestion> value) {
+  set results(List<CompletionSuggestion> value) {
     assert(value != null);
     this._results = value;
   }
@@ -2148,7 +2148,7 @@
    * The absolute path of the root directory containing the files to be
    * analyzed.
    */
-  void set root(String value) {
+  set root(String value) {
     assert(value != null);
     this._root = value;
   }
@@ -2163,7 +2163,7 @@
    * A list of the absolute paths of files and directories within the root
    * directory that should not be analyzed.
    */
-  void set exclude(List<String> value) {
+  set exclude(List<String> value) {
     assert(value != null);
     this._exclude = value;
   }
@@ -2178,7 +2178,7 @@
    * The absolute path of the analysis options file that should be used to
    * control the analysis of the files in the context.
    */
-  void set optionsFile(String value) {
+  set optionsFile(String value) {
     this._optionsFile = value;
   }
 
@@ -2362,7 +2362,7 @@
   /**
    * The file containing the code for which assists are being requested.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -2375,7 +2375,7 @@
   /**
    * The offset of the code for which assists are being requested.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -2388,7 +2388,7 @@
   /**
    * The length of the code for which assists are being requested.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -2491,7 +2491,7 @@
   /**
    * The assists that are available at the given location.
    */
-  void set assists(List<PrioritizedSourceChange> value) {
+  set assists(List<PrioritizedSourceChange> value) {
     assert(value != null);
     this._assists = value;
   }
@@ -2589,7 +2589,7 @@
   /**
    * The file containing the code on which the refactoring would be based.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -2602,7 +2602,7 @@
   /**
    * The offset of the code on which the refactoring would be based.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -2615,7 +2615,7 @@
   /**
    * The length of the code on which the refactoring would be based.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -2729,7 +2729,7 @@
    * However, plugins can support pre-defined refactorings, such as a rename
    * refactoring, at locations not supported by server.
    */
-  void set kinds(List<RefactoringKind> value) {
+  set kinds(List<RefactoringKind> value) {
     assert(value != null);
     this._kinds = value;
   }
@@ -2824,7 +2824,7 @@
   /**
    * The file containing the errors for which fixes are being requested.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -2837,7 +2837,7 @@
   /**
    * The offset used to select the errors for which fixes will be returned.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -2929,7 +2929,7 @@
   /**
    * The fixes that are available for the errors at the given offset.
    */
-  void set fixes(List<AnalysisErrorFixes> value) {
+  set fixes(List<AnalysisErrorFixes> value) {
     assert(value != null);
     this._fixes = value;
   }
@@ -3035,7 +3035,7 @@
   /**
    * The kind of refactoring to be performed.
    */
-  void set kind(RefactoringKind value) {
+  set kind(RefactoringKind value) {
     assert(value != null);
     this._kind = value;
   }
@@ -3048,7 +3048,7 @@
   /**
    * The file containing the code involved in the refactoring.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -3061,7 +3061,7 @@
   /**
    * The offset of the region involved in the refactoring.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -3074,7 +3074,7 @@
   /**
    * The length of the region involved in the refactoring.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -3089,7 +3089,7 @@
    * True if the client is only requesting that the values of the options be
    * validated and no change be generated.
    */
-  void set validateOnly(bool value) {
+  set validateOnly(bool value) {
     assert(value != null);
     this._validateOnly = value;
   }
@@ -3110,7 +3110,7 @@
    * as "Options". This field can be omitted if the refactoring does not
    * require any options or if the values of those options are not known.
    */
-  void set options(RefactoringOptions value) {
+  set options(RefactoringOptions value) {
     this._options = value;
   }
 
@@ -3270,7 +3270,7 @@
    * context in which the refactoring is requested. The list should be empty if
    * there are no known problems.
    */
-  void set initialProblems(List<RefactoringProblem> value) {
+  set initialProblems(List<RefactoringProblem> value) {
     assert(value != null);
     this._initialProblems = value;
   }
@@ -3287,7 +3287,7 @@
    * such as light-weight validation of a new name, flags compatibility, etc.
    * The list should be empty if there are no known problems.
    */
-  void set optionsProblems(List<RefactoringProblem> value) {
+  set optionsProblems(List<RefactoringProblem> value) {
     assert(value != null);
     this._optionsProblems = value;
   }
@@ -3304,7 +3304,7 @@
    * result of a full, potentially expensive validation and / or change
    * creation. The list should be empty if there are no known problems.
    */
-  void set finalProblems(List<RefactoringProblem> value) {
+  set finalProblems(List<RefactoringProblem> value) {
     assert(value != null);
     this._finalProblems = value;
   }
@@ -3323,7 +3323,7 @@
    * returned is documented in the section titled Refactorings, labeled as
    * "Feedback".
    */
-  void set feedback(RefactoringFeedback value) {
+  set feedback(RefactoringFeedback value) {
     this._feedback = value;
   }
 
@@ -3341,7 +3341,7 @@
    * being computed, such as having no options specified for a refactoring that
    * requires them, or if only validation was requested.
    */
-  void set change(SourceChange value) {
+  set change(SourceChange value) {
     this._change = value;
   }
 
@@ -3363,7 +3363,7 @@
    * to a member from an unknown type. This field can be omitted if the change
    * field is omitted or if there are no potential edits for the refactoring.
    */
-  void set potentialEdits(List<String> value) {
+  set potentialEdits(List<String> value) {
     this._potentialEdits = value;
   }
 
@@ -3544,7 +3544,7 @@
    * The offsets of the expressions that cover the specified selection, from
    * the down most to the up most.
    */
-  void set coveringExpressionOffsets(List<int> value) {
+  set coveringExpressionOffsets(List<int> value) {
     this._coveringExpressionOffsets = value;
   }
 
@@ -3558,7 +3558,7 @@
    * The lengths of the expressions that cover the specified selection, from
    * the down most to the up most.
    */
-  void set coveringExpressionLengths(List<int> value) {
+  set coveringExpressionLengths(List<int> value) {
     this._coveringExpressionLengths = value;
   }
 
@@ -3570,7 +3570,7 @@
   /**
    * The proposed names for the local variable.
    */
-  void set names(List<String> value) {
+  set names(List<String> value) {
     assert(value != null);
     this._names = value;
   }
@@ -3585,7 +3585,7 @@
    * The offsets of the expressions that would be replaced by a reference to
    * the variable.
    */
-  void set offsets(List<int> value) {
+  set offsets(List<int> value) {
     assert(value != null);
     this._offsets = value;
   }
@@ -3604,7 +3604,7 @@
    * given expression, if the offset of that expression is offsets[i], then the
    * length of that expression is lengths[i].
    */
-  void set lengths(List<int> value) {
+  set lengths(List<int> value) {
     assert(value != null);
     this._lengths = value;
   }
@@ -3737,7 +3737,7 @@
   /**
    * The name that the local variable should be given.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -3756,7 +3756,7 @@
    * variable. The expression used to initiate the refactoring will always be
    * replaced.
    */
-  void set extractAll(bool value) {
+  set extractAll(bool value) {
     assert(value != null);
     this._extractAll = value;
   }
@@ -3869,7 +3869,7 @@
    * The offset to the beginning of the expression or statements that will be
    * extracted.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -3882,7 +3882,7 @@
   /**
    * The length of the expression or statements that will be extracted.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -3897,7 +3897,7 @@
    * The proposed return type for the method. If the returned element does not
    * have a declared return type, this field will contain an empty string.
    */
-  void set returnType(String value) {
+  set returnType(String value) {
     assert(value != null);
     this._returnType = value;
   }
@@ -3910,7 +3910,7 @@
   /**
    * The proposed names for the method.
    */
-  void set names(List<String> value) {
+  set names(List<String> value) {
     assert(value != null);
     this._names = value;
   }
@@ -3923,7 +3923,7 @@
   /**
    * True if a getter could be created rather than a method.
    */
-  void set canCreateGetter(bool value) {
+  set canCreateGetter(bool value) {
     assert(value != null);
     this._canCreateGetter = value;
   }
@@ -3936,7 +3936,7 @@
   /**
    * The proposed parameters for the method.
    */
-  void set parameters(List<RefactoringMethodParameter> value) {
+  set parameters(List<RefactoringMethodParameter> value) {
     assert(value != null);
     this._parameters = value;
   }
@@ -3951,7 +3951,7 @@
    * The offsets of the expressions or statements that would be replaced by an
    * invocation of the method.
    */
-  void set offsets(List<int> value) {
+  set offsets(List<int> value) {
     assert(value != null);
     this._offsets = value;
   }
@@ -3972,7 +3972,7 @@
    * that expression is offsets[i], then the length of that expression is
    * lengths[i].
    */
-  void set lengths(List<int> value) {
+  set lengths(List<int> value) {
     assert(value != null);
     this._lengths = value;
   }
@@ -4152,7 +4152,7 @@
   /**
    * The return type that should be defined for the method.
    */
-  void set returnType(String value) {
+  set returnType(String value) {
     assert(value != null);
     this._returnType = value;
   }
@@ -4167,7 +4167,7 @@
    * True if a getter should be created rather than a method. It is an error if
    * this field is true and the list of parameters is non-empty.
    */
-  void set createGetter(bool value) {
+  set createGetter(bool value) {
     assert(value != null);
     this._createGetter = value;
   }
@@ -4180,7 +4180,7 @@
   /**
    * The name that the method should be given.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -4211,7 +4211,7 @@
    * - To add new parameters, omit their identifier.
    * - To remove some parameters, omit them in this list.
    */
-  void set parameters(List<RefactoringMethodParameter> value) {
+  set parameters(List<RefactoringMethodParameter> value) {
     assert(value != null);
     this._parameters = value;
   }
@@ -4228,7 +4228,7 @@
    * by an invocation of the method. The expression or statements used to
    * initiate the refactoring will always be replaced.
    */
-  void set extractAll(bool value) {
+  set extractAll(bool value) {
     assert(value != null);
     this._extractAll = value;
   }
@@ -4366,7 +4366,7 @@
   /**
    * The name of the variable being inlined.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -4379,7 +4379,7 @@
   /**
    * The number of times the variable occurs.
    */
-  void set occurrences(int value) {
+  set occurrences(int value) {
     assert(value != null);
     this._occurrences = value;
   }
@@ -4492,7 +4492,7 @@
    * The name of the class enclosing the method being inlined. If not a class
    * member is being inlined, this field will be absent.
    */
-  void set className(String value) {
+  set className(String value) {
     this._className = value;
   }
 
@@ -4504,7 +4504,7 @@
   /**
    * The name of the method (or function) being inlined.
    */
-  void set methodName(String value) {
+  set methodName(String value) {
     assert(value != null);
     this._methodName = value;
   }
@@ -4519,7 +4519,7 @@
    * True if the declaration of the method is selected and all references
    * should be inlined.
    */
-  void set isDeclaration(bool value) {
+  set isDeclaration(bool value) {
     assert(value != null);
     this._isDeclaration = value;
   }
@@ -4622,7 +4622,7 @@
    * True if the method being inlined should be removed. It is an error if this
    * field is true and inlineAll is false.
    */
-  void set deleteSource(bool value) {
+  set deleteSource(bool value) {
     assert(value != null);
     this._deleteSource = value;
   }
@@ -4637,7 +4637,7 @@
    * True if all invocations of the method should be inlined, or false if only
    * the invocation site used to create this refactoring should be inlined.
    */
-  void set inlineAll(bool value) {
+  set inlineAll(bool value) {
     assert(value != null);
     this._inlineAll = value;
   }
@@ -4729,7 +4729,7 @@
    * The file containing the code for which the Kythe Entry objects are being
    * requested.
    */
-  void set file(String value) {
+  set file(String value) {
     assert(value != null);
     this._file = value;
   }
@@ -4816,7 +4816,7 @@
   /**
    * The list of KytheEntry objects for the queried file.
    */
-  void set entries(List<KytheEntry> value) {
+  set entries(List<KytheEntry> value) {
     assert(value != null);
     this._entries = value;
   }
@@ -4835,7 +4835,7 @@
    * to a referenced file that does not exist or generated files not being
    * generated or passed before the call to "getKytheEntries".
    */
-  void set files(List<String> value) {
+  set files(List<String> value) {
     assert(value != null);
     this._files = value;
   }
@@ -4958,7 +4958,7 @@
   /**
    * The new file path to which the given file is being moved.
    */
-  void set newFile(String value) {
+  set newFile(String value) {
     assert(value != null);
     this._newFile = value;
   }
@@ -5050,7 +5050,7 @@
    * true, the server will not expect any other responses or notifications from
    * the plugin.
    */
-  void set isFatal(bool value) {
+  set isFatal(bool value) {
     assert(value != null);
     this._isFatal = value;
   }
@@ -5063,7 +5063,7 @@
   /**
    * The error message indicating what kind of error was encountered.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -5078,7 +5078,7 @@
    * The stack trace associated with the generation of the error, used for
    * debugging the plugin.
    */
-  void set stackTrace(String value) {
+  set stackTrace(String value) {
     assert(value != null);
     this._stackTrace = value;
   }
@@ -5247,7 +5247,7 @@
    * The path to the directory containing the on-disk byte store that is to be
    * used by any analysis drivers that are created.
    */
-  void set byteStorePath(String value) {
+  set byteStorePath(String value) {
     assert(value != null);
     this._byteStorePath = value;
   }
@@ -5262,7 +5262,7 @@
    * The path to the directory containing the SDK that is to be used by any
    * analysis drivers that are created.
    */
-  void set sdkPath(String value) {
+  set sdkPath(String value) {
     assert(value != null);
     this._sdkPath = value;
   }
@@ -5277,7 +5277,7 @@
    * The version number of the plugin spec supported by the analysis server
    * that is executing the plugin.
    */
-  void set version(String value) {
+  set version(String value) {
     assert(value != null);
     this._version = value;
   }
@@ -5400,7 +5400,7 @@
    * plugin spec as the analysis server. If the value is false, then the plugin
    * is expected to shutdown after returning the response.
    */
-  void set isCompatible(bool value) {
+  set isCompatible(bool value) {
     assert(value != null);
     this._isCompatible = value;
   }
@@ -5415,7 +5415,7 @@
    * The name of the plugin. This value is only used when the server needs to
    * identify the plugin, either to the user or for debugging purposes.
    */
-  void set name(String value) {
+  set name(String value) {
     assert(value != null);
     this._name = value;
   }
@@ -5430,7 +5430,7 @@
    * The version of the plugin. This value is only used when the server needs
    * to identify the plugin, either to the user or for debugging purposes.
    */
-  void set version(String value) {
+  set version(String value) {
     assert(value != null);
     this._version = value;
   }
@@ -5445,7 +5445,7 @@
    * Information that the user can use to use to contact the maintainers of the
    * plugin when there is a problem.
    */
-  void set contactInfo(String value) {
+  set contactInfo(String value) {
     this._contactInfo = value;
   }
 
@@ -5463,7 +5463,7 @@
    * Otherwise, it will be used to identify the files for which the plugin
    * should be notified of changes.
    */
-  void set interestingFiles(List<String> value) {
+  set interestingFiles(List<String> value) {
     assert(value != null);
     this._interestingFiles = value;
   }
@@ -5604,7 +5604,7 @@
    * The priority of the change. The value is expected to be non-negative, and
    * zero (0) is the lowest priority.
    */
-  void set priority(int value) {
+  set priority(int value) {
     assert(value != null);
     this._priority = value;
   }
@@ -5617,7 +5617,7 @@
   /**
    * The change with which the relevance is associated.
    */
-  void set change(SourceChange value) {
+  set change(SourceChange value) {
     assert(value != null);
     this._change = value;
   }
@@ -5791,7 +5791,7 @@
   /**
    * The offset to the beginning of the name selected to be renamed.
    */
-  void set offset(int value) {
+  set offset(int value) {
     assert(value != null);
     this._offset = value;
   }
@@ -5804,7 +5804,7 @@
   /**
    * The length of the name selected to be renamed.
    */
-  void set length(int value) {
+  set length(int value) {
     assert(value != null);
     this._length = value;
   }
@@ -5819,7 +5819,7 @@
    * The human-readable description of the kind of element being renamed (such
    * as “class” or “function type alias”).
    */
-  void set elementKindName(String value) {
+  set elementKindName(String value) {
     assert(value != null);
     this._elementKindName = value;
   }
@@ -5832,7 +5832,7 @@
   /**
    * The old name of the element before the refactoring.
    */
-  void set oldName(String value) {
+  set oldName(String value) {
     assert(value != null);
     this._oldName = value;
   }
@@ -5938,7 +5938,7 @@
   /**
    * The name that the element should have after the refactoring.
    */
-  void set newName(String value) {
+  set newName(String value) {
     assert(value != null);
     this._newName = value;
   }
@@ -6024,7 +6024,7 @@
   /**
    * A code that uniquely identifies the error that occurred.
    */
-  void set code(RequestErrorCode value) {
+  set code(RequestErrorCode value) {
     assert(value != null);
     this._code = value;
   }
@@ -6037,7 +6037,7 @@
   /**
    * A short description of the error.
    */
-  void set message(String value) {
+  set message(String value) {
     assert(value != null);
     this._message = value;
   }
@@ -6052,7 +6052,7 @@
    * The stack trace associated with processing the request, used for debugging
    * the plugin.
    */
-  void set stackTrace(String value) {
+  set stackTrace(String value) {
     this._stackTrace = value;
   }
 
@@ -6243,7 +6243,7 @@
   /**
    * The type of change represented by this event.
    */
-  void set type(WatchEventType value) {
+  set type(WatchEventType value) {
     assert(value != null);
     this._type = value;
   }
@@ -6256,7 +6256,7 @@
   /**
    * The absolute path of the file or directory that changed.
    */
-  void set path(String value) {
+  set path(String value) {
     assert(value != null);
     this._path = value;
   }
diff --git a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
index f1f2afb..1e78106 100644
--- a/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
+++ b/pkg/analyzer_plugin/lib/src/protocol/protocol_internal.dart
@@ -270,6 +270,25 @@
   }
 
   /**
+   * Decode a JSON object that is expected to be a double.  A string
+   * representation of a double is also accepted.
+   */
+  double decodeDouble(String jsonPath, Object json) {
+    if (json is double) {
+      return json;
+    } else if (json is int) {
+      return json.toDouble();
+    } else if (json is String) {
+      double value = double.tryParse(json);
+      if (value == null) {
+        throw mismatch(jsonPath, 'double', json);
+      }
+      return value;
+    }
+    throw mismatch(jsonPath, 'double', json);
+  }
+
+  /**
    * Decode a JSON object that is expected to be an integer.  A string
    * representation of an integer is also accepted.
    */
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 5051946..404dacb 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
@@ -301,7 +301,7 @@
   void addDeletion(SourceRange range) {
     if (range.length > 0) {
       EditBuilderImpl builder = createEditBuilder(range.offset, range.length);
-      _addEdit(builder);
+      _addEditBuilder(builder);
     }
   }
 
@@ -311,7 +311,7 @@
     try {
       buildEdit(builder);
     } finally {
-      _addEdit(builder);
+      _addEditBuilder(builder);
     }
   }
 
@@ -329,7 +329,7 @@
     try {
       buildEdit(builder);
     } finally {
-      _addEdit(builder);
+      _addEditBuilder(builder);
     }
   }
 
@@ -339,7 +339,7 @@
     try {
       builder.write(text);
     } finally {
-      _addEdit(builder);
+      _addEditBuilder(builder);
     }
   }
 
@@ -349,7 +349,7 @@
     try {
       builder.write(text);
     } finally {
-      _addEdit(builder);
+      _addEditBuilder(builder);
     }
   }
 
@@ -365,16 +365,44 @@
   }
 
   /**
-   * Add the edit from the given [builder] to the edits associates with the
+   * Replace edits in the [range] with the given [edit].
+   * The [range] is relative to the original code.
+   */
+  void replaceEdits(SourceRange range, SourceEdit edit) {
+    fileEdit.edits.removeWhere((edit) {
+      if (range.contains(edit.offset)) {
+        if (!range.contains(edit.end)) {
+          throw StateError('$edit is not completely in $range');
+        }
+        return true;
+      } else if (range.contains(edit.end)) {
+        throw StateError('$edit is not completely in $range');
+      }
+      return false;
+    });
+
+    _addEdit(edit);
+  }
+
+  /**
+   * Add the edit from the given [edit] to the edits associates with the
    * current file.
    */
-  void _addEdit(EditBuilderImpl builder) {
-    SourceEdit edit = builder.sourceEdit;
+  void _addEdit(SourceEdit edit) {
     fileEdit.add(edit);
     int delta = _editDelta(edit);
     changeBuilder._updatePositions(
         edit.offset + math.max<int>(0, delta), delta);
     changeBuilder._lockedPositions.clear();
+  }
+
+  /**
+   * Add the edit from the given [builder] to the edits associates with the
+   * current file.
+   */
+  void _addEditBuilder(EditBuilderImpl builder) {
+    SourceEdit edit = builder.sourceEdit;
+    _addEdit(edit);
     _captureSelection(builder, edit);
   }
 
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 86a386f..287af32 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
@@ -25,6 +25,7 @@
 import 'package:analyzer_plugin/utilities/change_builder/change_workspace.dart';
 import 'package:analyzer_plugin/utilities/range_factory.dart';
 import 'package:charcode/ascii.dart';
+import 'package:dart_style/dart_style.dart';
 import 'package:meta/meta.dart';
 
 /**
@@ -73,8 +74,7 @@
     }
     int timeStamp = state == ResultState.VALID ? 0 : -1;
 
-    CompilationUnit unit = result.unit;
-    CompilationUnitElement declaredUnit = unit.declaredElement;
+    CompilationUnitElement declaredUnit = result.unit.declaredElement;
     CompilationUnitElement libraryUnit =
         declaredUnit.library.definingCompilationUnit;
 
@@ -88,8 +88,7 @@
       });
     }
 
-    return DartFileEditBuilderImpl(
-        this, path, timeStamp, session, unit, libraryEditBuilder);
+    return DartFileEditBuilderImpl(this, result, timeStamp, libraryEditBuilder);
   }
 }
 
@@ -417,7 +416,7 @@
 
   @override
   void writeOverride(
-    FunctionType signature, {
+    ExecutableElement element, {
     StringBuffer displayTextBuffer,
     String returnTypeGroupName,
     bool invokeSuper: false,
@@ -431,7 +430,6 @@
       }
     }
 
-    ExecutableElement element = signature.element as ExecutableElement;
     String prefix = getIndent(1);
     String prefix2 = getIndent(2);
     ElementKind elementKind = element.kind;
@@ -452,7 +450,7 @@
     }
 
     // return type
-    DartType returnType = signature.returnType;
+    DartType returnType = element.returnType;
     bool typeWritten = writeType(returnType,
         groupName: returnTypeGroupName, methodBeingCopied: element);
     if (typeWritten) {
@@ -492,9 +490,10 @@
       }
       displayTextBuffer?.write(' => …');
     } else {
-      List<ParameterElement> parameters = signature.parameters;
+      List<ParameterElement> parameters = element.parameters;
       withCarbonCopyBuffer(() {
-        writeTypeParameters(signature.typeFormals, methodBeingCopied: element);
+        writeTypeParameters(element.type.typeFormals,
+            methodBeingCopied: element);
         writeParameters(parameters, methodBeingCopied: element);
       });
       writeln(' {');
@@ -999,7 +998,7 @@
   void _initializeEnclosingElements() {
     if (!_hasEnclosingElementsInitialized) {
       _EnclosingElementFinder finder = new _EnclosingElementFinder();
-      finder.find(dartFileEditBuilder.unit, offset);
+      finder.find(dartFileEditBuilder.resolvedUnit.unit, offset);
       _enclosingClass = finder.enclosingClass;
       _enclosingExecutable = finder.enclosingExecutable;
       _hasEnclosingElementsInitialized = true;
@@ -1020,6 +1019,12 @@
       return;
     }
 
+    // TODO(scheglov) We should use "methodBeingCopied" to verify that
+    // we really are just copying this type parameter.
+    if (element is TypeParameterElement) {
+      return;
+    }
+
     ImportElement import = dartFileEditBuilder._getImportElement(element);
     if (import != null) {
       if (import.prefix != null) {
@@ -1125,19 +1130,9 @@
 class DartFileEditBuilderImpl extends FileEditBuilderImpl
     implements DartFileEditBuilder {
   /**
-   * The session that analyzed this file.
+   * The resolved unit for the file.
    */
-  final AnalysisSession session;
-
-  /**
-   * The compilation unit to which the code will be added.
-   */
-  final CompilationUnit unit;
-
-  /**
-   * The target library, which contains the [unit].
-   */
-  final LibraryElement libraryElement;
+  final ResolvedUnitResult resolvedUnit;
 
   /**
    * The change builder for the library
@@ -1166,12 +1161,11 @@
   /**
    * 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 [path] and [timeStamp], and the given fully resolved [unit].
+   * the given [resolvedUnit] and [timeStamp].
    */
-  DartFileEditBuilderImpl(DartChangeBuilderImpl changeBuilder, String path,
-      int timeStamp, this.session, this.unit, this.libraryChangeBuilder)
-      : libraryElement = unit.declaredElement.library,
-        super(changeBuilder, path, timeStamp);
+  DartFileEditBuilderImpl(DartChangeBuilderImpl changeBuilder,
+      this.resolvedUnit, int timeStamp, this.libraryChangeBuilder)
+      : super(changeBuilder, resolvedUnit.path, timeStamp);
 
   @override
   bool get hasEdits =>
@@ -1224,12 +1218,43 @@
   }
 
   @override
-  String importLibrary(Uri uri) {
-    return _importLibrary(uri).uriText;
+  void format(SourceRange range) {
+    var newContent = resolvedUnit.content;
+    var newRangeOffset = range.offset;
+    var newRangeLength = range.length;
+    for (var edit in fileEdit.edits) {
+      newContent = edit.apply(newContent);
+
+      var lengthDelta = edit.replacement.length - edit.length;
+      if (edit.offset < newRangeOffset) {
+        newRangeOffset += lengthDelta;
+      } else if (edit.offset < newRangeOffset + newRangeLength) {
+        newRangeLength += lengthDelta;
+      }
+    }
+
+    var formattedResult = DartFormatter().formatSource(
+      SourceCode(
+        newContent,
+        isCompilationUnit: true,
+        selectionStart: newRangeOffset,
+        selectionLength: newRangeLength,
+      ),
+    );
+
+    replaceEdits(
+      range,
+      SourceEdit(
+        range.offset,
+        range.length,
+        formattedResult.selectedText,
+      ),
+    );
   }
 
-  String importLibraryWithRelativeUri(String uriText, [String prefix = null]) {
-    return _importLibraryWithRelativeUri(uriText, prefix).uriText;
+  @override
+  String importLibrary(Uri uri) {
+    return _importLibrary(uri).uriText;
   }
 
   @override
@@ -1263,6 +1288,10 @@
     return ImportLibraryElementResultImpl(prefix);
   }
 
+  String importLibraryWithRelativeUri(String uriText, [String prefix = null]) {
+    return _importLibraryWithRelativeUri(uriText, prefix).uriText;
+  }
+
   @override
   void replaceTypeWithFuture(
       TypeAnnotation typeAnnotation, TypeProvider typeProvider) {
@@ -1297,7 +1326,7 @@
     LibraryDirective libraryDirective;
     List<ImportDirective> importDirectives = <ImportDirective>[];
     PartDirective partDirective;
-    for (Directive directive in unit.directives) {
+    for (Directive directive in resolvedUnit.unit.directives) {
       if (directive is LibraryDirective) {
         libraryDirective = directive;
       } else if (directive is ImportDirective) {
@@ -1333,7 +1362,7 @@
             {ImportDirective prev,
             ImportDirective next,
             bool trailingNewLine: false}) {
-          LineInfo lineInfo = unit.lineInfo;
+          LineInfo lineInfo = resolvedUnit.lineInfo;
           if (prev != null) {
             int offset = prev.end;
             int line = lineInfo.getLocation(offset).lineNumber;
@@ -1458,11 +1487,11 @@
     // If still at the beginning of the file, add before the first declaration.
     int offset;
     bool insertEmptyLineAfter = false;
-    if (unit.declarations.isNotEmpty) {
-      offset = unit.declarations.first.offset;
+    if (resolvedUnit.unit.declarations.isNotEmpty) {
+      offset = resolvedUnit.unit.declarations.first.offset;
       insertEmptyLineAfter = true;
     } else {
-      offset = unit.end;
+      offset = resolvedUnit.unit.end;
     }
     addInsertion(offset, (EditBuilder builder) {
       for (int i = 0; i < importList.length; i++) {
@@ -1482,7 +1511,7 @@
    * the element is declared in the same library.
    */
   ImportElement _getImportElement(Element element) {
-    for (ImportElement import in libraryElement.imports) {
+    for (ImportElement import in resolvedUnit.libraryElement.imports) {
       Map<String, Element> definedNames = import.namespace.definedNames;
       if (definedNames.containsValue(element)) {
         return import;
@@ -1496,9 +1525,9 @@
    */
   String _getLibraryUriText(Uri uri) {
     if (uri.scheme == 'file') {
-      var pathContext = session.resourceProvider.pathContext;
+      var pathContext = resolvedUnit.session.resourceProvider.pathContext;
       String whatPath = pathContext.fromUri(uri);
-      String libraryPath = libraryElement.source.fullName;
+      String libraryPath = resolvedUnit.libraryElement.source.fullName;
       String libraryFolder = pathContext.dirname(libraryPath);
       String relativeFile = pathContext.relative(whatPath, from: libraryFolder);
       return pathContext.split(relativeFile).join('/');
@@ -1539,7 +1568,7 @@
    * Return `true` if the [element] is defined in the target library.
    */
   bool _isDefinedLocally(Element element) {
-    return element.library == libraryElement;
+    return element.library == resolvedUnit.libraryElement;
   }
 
   /**
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
index 894e061..c198032 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/dart/syntactic_scope.dart
@@ -300,7 +300,7 @@
 
   void _addName(SimpleIdentifier node) {
     if (node == null) return;
-    if (node.end == offset) return;
+    if (node.offset <= offset && offset <= node.end) return;
 
     names.add(node.name);
   }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
index 7bf30d5..4b7909e 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/completion_core.dart
@@ -40,7 +40,7 @@
   int get length => _length;
 
   @override
-  void set length(int length) {
+  set length(int length) {
     if (_length != null) {
       throw new StateError('The length can only be set once');
     }
@@ -54,7 +54,7 @@
   int get offset => _offset;
 
   @override
-  void set offset(int length) {
+  set offset(int length) {
     if (_offset != null) {
       throw new StateError('The offset can only be set once');
     }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
index 2b0dc59..9e50791 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/optype.dart
@@ -7,6 +7,7 @@
 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;
@@ -22,6 +23,11 @@
  */
 class OpType {
   /**
+   * The [TypeSystem] used during resolution of the current unit.
+   */
+  TypeSystem _typeSystem;
+
+  /**
    * Indicates whether constructor suggestions should be included.
    */
   bool includeConstructorSuggestions = false;
@@ -140,6 +146,8 @@
       return optype;
     }
 
+    optype._typeSystem = target.unit?.declaredElement?.context?.typeSystem;
+
     var targetNode = target.containingNode;
     targetNode.accept(new _OpTypeAstVisitor(optype, target.entity, offset));
 
@@ -259,7 +267,7 @@
       if (dartType != null) {
         if (dartType == _requiredType) {
           return relevance + DART_RELEVANCE_BOOST_TYPE;
-        } else if (dartType.isSubtypeOf(_requiredType)) {
+        } else if (_isSubtypeOf(dartType, _requiredType)) {
           return relevance + DART_RELEVANCE_BOOST_SUBTYPE;
         }
       }
@@ -267,6 +275,15 @@
     };
   }
 
+  /// Return `true` if the [leftType] is a subtype of the [rightType].
+  bool _isSubtypeOf(DartType leftType, DartType rightType) {
+    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) {
@@ -385,7 +402,8 @@
         DartType staticType = node.expression.staticType;
         if (staticType != null &&
             (staticType.isDynamic ||
-                (dartType.isSubtypeOf(staticType) && dartType != staticType))) {
+                (optype._isSubtypeOf(dartType, staticType) &&
+                    dartType != staticType))) {
           return relevance;
         } else {
           return null;
@@ -814,7 +832,8 @@
         DartType staticType = node.expression.staticType;
         if (staticType != null &&
             (staticType.isDynamic ||
-                (dartType.isSubtypeOf(staticType) && dartType != staticType))) {
+                (optype._isSubtypeOf(dartType, staticType) &&
+                    dartType != staticType))) {
           return relevance;
         } else {
           return null;
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index c4fe0c2..0763e54 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -4,6 +4,7 @@
 
 import 'package:analyzer/dart/element/element.dart' as analyzer;
 import 'package:analyzer/dart/element/type.dart' as analyzer;
+import 'package:analyzer/diagnostic/diagnostic.dart' as analyzer;
 import 'package:analyzer/error/error.dart' as analyzer;
 import 'package:analyzer/exception/exception.dart' as analyzer;
 import 'package:analyzer/source/error_processor.dart' as analyzer;
@@ -43,6 +44,13 @@
         startColumn = lineLocation.columnNumber;
       }
     }
+    List<plugin.DiagnosticMessage> contextMessages;
+    if (error.contextMessages.isNotEmpty) {
+      contextMessages = error.contextMessages
+          .map((message) =>
+              convertDiagnosticMessage(message, lineInfo: lineInfo))
+          .toList();
+    }
     return new plugin.AnalysisError(
         convertErrorSeverity(severity),
         convertErrorType(errorCode.type),
@@ -50,6 +58,7 @@
             startLine, startColumn),
         error.message,
         errorCode.name.toLowerCase(),
+        contextMessages: contextMessages,
         correction: error.correction,
         hasFix: true);
   }
@@ -85,6 +94,31 @@
   }
 
   /**
+   * Convert the diagnostic [message] from the 'analyzer' package to an analysis
+   * error defined by the plugin API. If a [lineInfo] is provided then the
+   * error's location will have a start line and start column.
+   */
+  plugin.DiagnosticMessage convertDiagnosticMessage(
+      analyzer.DiagnosticMessage message,
+      {analyzer.LineInfo lineInfo}) {
+    String file = message.filePath;
+    int offset = message.offset;
+    int length = message.length;
+    int startLine = -1;
+    int startColumn = -1;
+    if (lineInfo != null) {
+      analyzer.CharacterLocation lineLocation =
+          lineInfo.getLocation(offset) as analyzer.CharacterLocation;
+      if (lineLocation != null) {
+        startLine = lineLocation.lineNumber;
+        startColumn = lineLocation.columnNumber;
+      }
+    }
+    return plugin.DiagnosticMessage(message.message,
+        plugin.Location(file, offset, length, startLine, startColumn));
+  }
+
+  /**
    * Convert the given [element] from the 'analyzer' package to an element
    * defined by the plugin API.
    */
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 a00516b..6f1d86c 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
@@ -208,13 +208,13 @@
 
   /**
    * Append a placeholder for an override of the specified inherited
-   * [signature]. If provided, write a string value suitable for display
+   * [element]. If provided, write a string value suitable for display
    * (e.g., in a completion popup) in the given [displayTextBuffer].
    * If [invokeSuper] is `true`, then the corresponding `super.name()` will be
    * added in the body.
    */
   void writeOverride(
-    FunctionType signature, {
+    ExecutableElement element, {
     StringBuffer displayTextBuffer,
     bool invokeSuper: false,
   });
@@ -348,6 +348,15 @@
       FunctionBody body, TypeProvider typeProvider);
 
   /**
+   * Format the code covered by the [range].
+   *
+   * If there are any edits that are in the [range], these edits are applied
+   * first, and replaced with a single new edit that produces the resulting
+   * formatted code. The [range] is relative to the original code.
+   */
+  void format(SourceRange range);
+
+  /**
    * Arrange to have an import added for the library with the given [uri].
    *
    * Returns the text of the URI that will be used in the import directive.
diff --git a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
index 6a354cd..970306d 100644
--- a/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
+++ b/pkg/analyzer_plugin/lib/utilities/completion/completion_core.dart
@@ -33,7 +33,7 @@
    * Hence, this setter throws a [StateError] if the length has already been
    * set.
    */
-  void set length(int length);
+  set length(int length);
 
   /**
    * Set the offset of the region of text that should be replaced by the
@@ -43,7 +43,7 @@
    * Hence, this setter throws a [StateError] if the offset has already been
    * set.
    */
-  void set offset(int offset);
+  set offset(int offset);
 
   /**
    * Indicates if the collector's offset has been set (and ultimately the
diff --git a/pkg/analyzer_plugin/pubspec.yaml b/pkg/analyzer_plugin/pubspec.yaml
index db15540..b7b473f 100644
--- a/pkg/analyzer_plugin/pubspec.yaml
+++ b/pkg/analyzer_plugin/pubspec.yaml
@@ -1,6 +1,6 @@
 name: analyzer_plugin
-description: A framework for building plugins for the analysis server.
-version: 0.0.1-alpha.8
+description: A framework and support code for building plugins for the analysis server.
+version: 0.2.0
 author: Dart Team <misc@dartlang.org>
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/analyzer_plugin
 
@@ -8,8 +8,9 @@
   sdk: '>=2.0.0 <3.0.0'
 
 dependencies:
-  analyzer: '>=0.35.3 <0.37.0'
+  analyzer: '>=0.35.3 <0.38.0'
   charcode: '^1.1.0'
+  dart_style: '^1.2.0'
   html: '>=0.13.1 <0.15.0'
   meta: ^1.0.2
   path: '^1.4.1'
@@ -18,5 +19,7 @@
 dev_dependencies:
   analysis_tool:
     path: ../analysis_tool
+  front_end:
+    path: ../front_end
   test_reflective_loader: ^0.1.8
   test: ^1.0.0
diff --git a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
index d7aeda7..58cb27c 100644
--- a/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
+++ b/pkg/analyzer_plugin/test/integration/support/protocol_matchers.dart
@@ -271,6 +271,7 @@
  *   CONSTRUCTOR_INVOCATION
  *   ENUM
  *   ENUM_CONSTANT
+ *   EXTENSION
  *   FIELD
  *   FILE
  *   FUNCTION
@@ -300,6 +301,7 @@
   "CONSTRUCTOR_INVOCATION",
   "ENUM",
   "ENUM_CONSTANT",
+  "EXTENSION",
   "FIELD",
   "FILE",
   "FUNCTION",
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 5aae60f..ff2cb12 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
@@ -9,7 +9,7 @@
 import 'package:analyzer/dart/ast/standard_resolution_map.dart';
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/resolver.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/generated/testing/test_type_provider.dart';
@@ -1562,6 +1562,101 @@
     });
   }
 
+  test_format_hasEdits() async {
+    var initialCode = r'''
+void functionBefore() {
+  1 +  2;
+}
+
+void foo() {
+  1 +  2;
+  42;
+  3 +  4;
+}
+
+void functionAfter() {
+  1 +  2;
+}
+''';
+    var path = convertPath('/home/test/lib/test.dart');
+    newFile(path, content: initialCode);
+
+    var builder = newBuilder();
+    await builder.addFileEdit(path, (builder) {
+      builder.addInsertion(34, (builder) {
+        builder.writeln('  3 +  4;');
+      });
+      builder.addSimpleReplacement(SourceRange(62, 2), '1 +  2 +  3');
+      builder.addInsertion(112, (builder) {
+        builder.writeln('  3 +  4;');
+      });
+      builder.format(SourceRange(48, 29));
+    });
+
+    var edits = getEdits(builder);
+    var resultCode = SourceEdit.applySequence(initialCode, edits);
+    expect(resultCode, r'''
+void functionBefore() {
+  1 +  2;
+  3 +  4;
+}
+
+void foo() {
+  1 + 2;
+  1 + 2 + 3;
+  3 + 4;
+}
+
+void functionAfter() {
+  1 +  2;
+  3 +  4;
+}
+''');
+  }
+
+  test_format_noEdits() async {
+    var initialCode = r'''
+void functionBefore() {
+  1 +  2;
+}
+
+void foo() {
+  1 +  2;
+  3;
+  4 +  5;
+}
+
+void functionAfter() {
+  1 +  2;
+}
+''';
+    var path = convertPath('/home/test/lib/test.dart');
+    newFile(path, content: initialCode);
+
+    var builder = newBuilder();
+    await builder.addFileEdit(path, (builder) {
+      builder.format(SourceRange(37, 39));
+    });
+
+    var edits = getEdits(builder);
+    var resultCode = SourceEdit.applySequence(initialCode, edits);
+    expect(resultCode, r'''
+void functionBefore() {
+  1 +  2;
+}
+
+void foo() {
+  1 + 2;
+  3;
+  4 + 5;
+}
+
+void functionAfter() {
+  1 +  2;
+}
+''');
+  }
+
   test_replaceTypeWithFuture() async {
     String path = convertPath('/home/test/lib/test.dart');
     addSource(path, 'String f() {}');
@@ -2619,7 +2714,7 @@
     }
 
     TypeSystem typeSystem = await session.typeSystem;
-    var inherited = new InheritanceManager2(typeSystem).getInherited(
+    var inherited = new InheritanceManager3(typeSystem).getInherited(
       targetElement.type,
       new Name(null, nameToOverride),
     );
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
index fade0d2..c16d058 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/import_library_element_test.dart
@@ -205,21 +205,34 @@
     );
   }
 
-  test_formalParameter() async {
-    newFile('/home/test/lib/a.dart', content: 'class A {}');
-    newFile('/home/test/lib/b.dart', content: r'''
-export 'a.dart';
-''');
+  test_formalParameter_end() async {
+    newFile('/home/test/lib/a.dart', content: 'class AAA {}');
     await _assertImportLibraryElement(
       initialCode: r'''
-f(A^) {}
+f(AAA^) {}
 ''',
       uriStr: 'package:test/a.dart',
-      name: 'A',
+      name: 'AAA',
       expectedCode: r'''
 import 'package:test/a.dart';
 
-f(A) {}
+f(AAA) {}
+''',
+    );
+  }
+
+  test_formalParameter_start() async {
+    newFile('/home/test/lib/a.dart', content: 'class AAA {}');
+    await _assertImportLibraryElement(
+      initialCode: r'''
+f(^AAA) {}
+''',
+      uriStr: 'package:test/a.dart',
+      name: 'AAA',
+      expectedCode: r'''
+import 'package:test/a.dart';
+
+f(AAA) {}
 ''',
     );
   }
diff --git a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
index 40bdcbc..19d52fc 100644
--- a/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
+++ b/pkg/analyzer_plugin/test/src/utilities/change_builder/dart/syntactic_scope_test.dart
@@ -352,6 +352,18 @@
 ''');
   }
 
+  test_FormalParameter_nameOnly() {
+    _assertScopeNames(code: r'''
+N1 N2(^1N3^2) {
+  ^3
+}
+''', expected: r'''
+1: {}
+2: {}
+3: N3
+''');
+  }
+
   test_ForStatement2_ForEachPartsWithDeclaration() {
     _enableExperiments();
     _assertScopeNames(code: r'''
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 775e9a6..93206a5 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -9,6 +9,7 @@
 import 'package:analyzer/exception/exception.dart' as analyzer;
 import 'package:analyzer/source/error_processor.dart' as analyzer;
 import 'package:analyzer/src/dart/element/element.dart' as analyzer;
+import 'package:analyzer/src/diagnostic/diagnostic.dart' as analyzer;
 import 'package:analyzer/src/error/codes.dart' as analyzer;
 import 'package:analyzer/src/generated/engine.dart' as analyzer;
 import 'package:analyzer/src/generated/source.dart' as analyzer;
@@ -57,8 +58,23 @@
     expect(pluginError.type, converter.convertErrorType(errorCode.type));
   }
 
-  analyzer.AnalysisError createError(int offset) => new analyzer.AnalysisError(
-      source, offset, 5, analyzer.CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT);
+  analyzer.AnalysisError createError(int offset, {String contextMessage}) {
+    List<analyzer.DiagnosticMessageImpl> contextMessages = [];
+    if (contextMessage != null) {
+      contextMessages.add(analyzer.DiagnosticMessageImpl(
+          filePath: source.fullName,
+          offset: 53,
+          length: 7,
+          message: contextMessage));
+    }
+    return new analyzer.AnalysisError(
+        source,
+        offset,
+        5,
+        analyzer.CompileTimeErrorCode.AWAIT_IN_WRONG_CONTEXT,
+        null,
+        contextMessages);
+  }
 
   @override
   void setUp() {
@@ -67,6 +83,25 @@
     testFile = convertPath('/test.dart');
   }
 
+  test_convertAnalysisError_contextMessages() {
+    analyzer.AnalysisError analyzerError =
+        createError(13, contextMessage: 'here');
+    analyzer.LineInfo lineInfo = new analyzer.LineInfo([0, 10, 20]);
+    analyzer.ErrorSeverity severity = analyzer.ErrorSeverity.WARNING;
+
+    plugin.AnalysisError pluginError = converter.convertAnalysisError(
+        analyzerError,
+        lineInfo: lineInfo,
+        severity: severity);
+    assertError(pluginError, analyzerError,
+        startColumn: 4, startLine: 2, severity: severity);
+    expect(pluginError.contextMessages, hasLength(1));
+    plugin.DiagnosticMessage message = pluginError.contextMessages[0];
+    expect(message.message, 'here');
+    expect(message.location.offset, 53);
+    expect(message.location.length, 7);
+  }
+
   test_convertAnalysisError_lineInfo_noSeverity() {
     analyzer.AnalysisError analyzerError = createError(13);
     analyzer.LineInfo lineInfo = new analyzer.LineInfo([0, 10, 20]);
diff --git a/pkg/analyzer_plugin/test/verify_tests_test.dart b/pkg/analyzer_plugin/test/verify_tests_test.dart
index 6b3ccd0..4aa0876 100644
--- a/pkg/analyzer_plugin/test/verify_tests_test.dart
+++ b/pkg/analyzer_plugin/test/verify_tests_test.dart
@@ -17,7 +17,7 @@
   PhysicalResourceProvider provider = PhysicalResourceProvider.INSTANCE;
   String packageRoot = provider.pathContext.normalize(package_root.packageRoot);
   String analysisServerPath =
-      provider.pathContext.join(packageRoot, 'analysis_server');
+      provider.pathContext.join(packageRoot, 'analyzer_plugin');
   String testDirPath = provider.pathContext.join(analysisServerPath, 'test');
 
   AnalysisContextCollection collection = new AnalysisContextCollection(
diff --git a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
index f4e92dd..0f4e2eb 100644
--- a/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
+++ b/pkg/analyzer_plugin/tool/spec/codegen_dart_protocol.dart
@@ -465,7 +465,7 @@
         docComment(toHtmlVisitor.collectHtml(() {
           toHtmlVisitor.translateHtml(field.html);
         }));
-        writeln('void set ${field.name}(${dartType(field.type)} value) {');
+        writeln('set ${field.name}(${dartType(field.type)} value) {');
         indent(() {
           if (!field.optional) {
             writeln('assert(value != null);');
diff --git a/pkg/analyzer_plugin/tool/spec/common_types_spec.html b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
index aac0a52..812c449 100644
--- a/pkg/analyzer_plugin/tool/spec/common_types_spec.html
+++ b/pkg/analyzer_plugin/tool/spec/common_types_spec.html
@@ -530,6 +530,7 @@
       <value><code>CONSTRUCTOR_INVOCATION</code></value>
       <value><code>ENUM</code></value>
       <value><code>ENUM_CONSTANT</code></value>
+      <value><code>EXTENSION</code></value>
       <value><code>FIELD</code></value>
       <value><code>FILE</code></value>
       <value><code>FUNCTION</code></value>
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index f7c4050..7113669 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -68,6 +68,8 @@
 class _CodegenImpact extends WorldImpactBuilderImpl implements CodegenImpact {
   static const String tag = 'codegen-impact';
 
+  @override
+  final MemberEntity member;
   Set<Pair<DartType, DartType>> _typeVariableBoundsSubtypeChecks;
   Set<String> _constSymbols;
   List<Set<ClassEntity>> _specializedGetInterceptors;
@@ -78,9 +80,10 @@
   Set<FunctionEntity> _nativeMethods;
   Set<Selector> _oneShotInterceptors;
 
-  _CodegenImpact();
+  _CodegenImpact(this.member);
 
   _CodegenImpact.internal(
+      this.member,
       Set<DynamicUse> dynamicUses,
       Set<StaticUse> staticUses,
       Set<TypeUse> typeUses,
@@ -98,6 +101,7 @@
 
   factory _CodegenImpact.readFromDataSource(DataSource source) {
     source.begin(tag);
+    MemberEntity member = source.readMember();
     Set<DynamicUse> dynamicUses = source
         .readList(() => DynamicUse.readFromDataSource(source),
             emptyAsNull: true)
@@ -139,6 +143,7 @@
         ?.toSet();
     source.end(tag);
     return new _CodegenImpact.internal(
+        member,
         dynamicUses,
         staticUses,
         typeUses,
@@ -157,6 +162,7 @@
   @override
   void writeToDataSink(DataSink sink) {
     sink.begin(tag);
+    sink.writeMember(member);
     sink.writeList(dynamicUses, (DynamicUse use) => use.writeToDataSink(sink),
         allowNull: true);
     sink.writeList(staticUses, (StaticUse use) => use.writeToDataSink(sink),
@@ -192,9 +198,11 @@
 
   @override
   void apply(WorldImpactVisitor visitor) {
-    staticUses.forEach(visitor.visitStaticUse);
-    dynamicUses.forEach(visitor.visitDynamicUse);
-    typeUses.forEach(visitor.visitTypeUse);
+    staticUses.forEach((StaticUse use) => visitor.visitStaticUse(member, use));
+    dynamicUses.forEach((DynamicUse use) => visitor.visitDynamicUse);
+    typeUses.forEach((TypeUse use) => visitor.visitTypeUse(member, use));
+    constantUses
+        .forEach((ConstantUse use) => visitor.visitConstantUse(member, use));
   }
 
   void registerTypeVariableBoundsSubtypeCheck(
@@ -331,7 +339,7 @@
   List<ModularExpression> _expressions;
 
   CodegenRegistry(this._elementEnvironment, this._currentElement)
-      : this._worldImpact = new _CodegenImpact();
+      : this._worldImpact = new _CodegenImpact(_currentElement);
 
   @override
   String toString() => 'CodegenRegistry for $_currentElement';
@@ -560,6 +568,9 @@
         case ModularNameKind.globalPropertyNameForMember:
           name.value = namer.globalPropertyNameForMember(name.data);
           break;
+        case ModularNameKind.globalNameForInterfaceTypeVariable:
+          name.value = namer.globalNameForInterfaceTypeVariable(name.data);
+          break;
         case ModularNameKind.nameForGetInterceptor:
           name.value = namer.nameForGetInterceptor(name.set);
           break;
@@ -637,6 +648,7 @@
   globalPropertyNameForClass,
   globalPropertyNameForType,
   globalPropertyNameForMember,
+  globalNameForInterfaceTypeVariable,
   nameForGetInterceptor,
   nameForOneShotInterceptor,
   asName,
@@ -690,6 +702,9 @@
       case ModularNameKind.invocation:
         data = Selector.readFromDataSource(source);
         break;
+      case ModularNameKind.globalNameForInterfaceTypeVariable:
+        data = source.readTypeVariable();
+        break;
       case ModularNameKind.nameForGetInterceptor:
         set = source.readClasses().toSet();
         break;
@@ -742,6 +757,10 @@
         Selector selector = data;
         selector.writeToDataSink(sink);
         break;
+      case ModularNameKind.globalNameForInterfaceTypeVariable:
+        TypeVariableEntity typeVariable = data;
+        sink.writeTypeVariable(typeVariable);
+        break;
       case ModularNameKind.nameForGetInterceptor:
         sink.writeClasses(set);
         break;
@@ -758,7 +777,7 @@
   }
 
   js.Name get value {
-    assert(_value != null);
+    assert(_value != null, 'value not set for $this');
     return _value;
   }
 
@@ -776,19 +795,19 @@
 
   @override
   String get name {
-    assert(_value != null);
+    assert(_value != null, 'value not set for $this');
     return _value.name;
   }
 
   @override
   bool get allowRename {
-    assert(_value != null);
+    assert(_value != null, 'value not set for $this');
     return _value.allowRename;
   }
 
   @override
   int compareTo(js.Name other) {
-    assert(_value != null);
+    assert(_value != null, 'value not set for $this');
     return _value.compareTo(other);
   }
 
@@ -812,7 +831,8 @@
   }
 
   @override
-  String toString() => 'ModularName(kind=$kind,data=$data,value=${value?.key})';
+  String toString() =>
+      'ModularName(kind=$kind, data=$data, value=${_value?.key})';
 }
 
 enum ModularExpressionKind {
diff --git a/pkg/compiler/lib/src/common_elements.dart b/pkg/compiler/lib/src/common_elements.dart
index d21986b..4d53d40 100644
--- a/pkg/compiler/lib/src/common_elements.dart
+++ b/pkg/compiler/lib/src/common_elements.dart
@@ -490,6 +490,26 @@
   FieldEntity get rtiIsField;
   FunctionEntity get rtiEvalMethod;
   FunctionEntity get rtiBindMethod;
+  FunctionEntity get rtiAddRulesMethod;
+
+  FunctionEntity get generalIsTestImplementation;
+  FunctionEntity get generalAsCheckImplementation;
+  FunctionEntity get generalTypeCheckImplementation;
+
+  FunctionEntity get specializedIsBool;
+  FunctionEntity get specializedAsBoolNullable;
+  FunctionEntity get specializedCheckBoolNullable;
+  FunctionEntity get specializedAsDoubleNullable;
+  FunctionEntity get specializedCheckDoubleNullable;
+  FunctionEntity get specializedIsInt;
+  FunctionEntity get specializedAsIntNullable;
+  FunctionEntity get specializedCheckIntNullable;
+  FunctionEntity get specializedIsNum;
+  FunctionEntity get specializedAsNumNullable;
+  FunctionEntity get specializedCheckNumNullable;
+  FunctionEntity get specializedIsString;
+  FunctionEntity get specializedAsStringNullable;
+  FunctionEntity get specializedCheckStringNullable;
 
   // From dart:_internal
 
@@ -1837,6 +1857,7 @@
       _checkTypeBound ??= _findRtiFunction('checkTypeBound');
 
   ClassEntity get _rtiImplClass => _findClass(rtiLibrary, 'Rti');
+  ClassEntity get _rtiUniverseClass => _findClass(rtiLibrary, '_Universe');
   FieldEntity _findRtiClassField(String name) =>
       _findClassMember(_rtiImplClass, name);
 
@@ -1863,6 +1884,81 @@
   FunctionEntity get rtiBindMethod =>
       _rtiBindMethod ??= _findClassMember(_rtiImplClass, '_bind');
 
+  FunctionEntity _rtiAddRulesMethod;
+  @override
+  FunctionEntity get rtiAddRulesMethod =>
+      _rtiAddRulesMethod ??= _findClassMember(_rtiUniverseClass, 'addRules');
+
+  FunctionEntity _generalIsTestImplementation;
+  @override
+  FunctionEntity get generalIsTestImplementation =>
+      _generalIsTestImplementation ??=
+          _findRtiFunction('_generalIsTestImplementation');
+
+  FunctionEntity _generalAsCheckImplementation;
+  @override
+  FunctionEntity get generalAsCheckImplementation =>
+      _generalAsCheckImplementation ??=
+          _findRtiFunction('_generalAsCheckImplementation');
+
+  FunctionEntity _generalTypeCheckImplementation;
+  @override
+  FunctionEntity get generalTypeCheckImplementation =>
+      _generalTypeCheckImplementation ??=
+          _findRtiFunction('_generalTypeCheckImplementation');
+
+  @override
+  FunctionEntity get specializedIsBool => _findRtiFunction('_isBool');
+
+  @override
+  FunctionEntity get specializedAsBoolNullable =>
+      _findRtiFunction('_asBoolNullable');
+
+  @override
+  FunctionEntity get specializedCheckBoolNullable =>
+      _findRtiFunction('_checkBoolNullable');
+
+  @override
+  FunctionEntity get specializedAsDoubleNullable =>
+      _findRtiFunction('_asDoubleNullable');
+
+  @override
+  FunctionEntity get specializedCheckDoubleNullable =>
+      _findRtiFunction('_checkDoubleNullable');
+
+  @override
+  FunctionEntity get specializedIsInt => _findRtiFunction('_isInt');
+
+  @override
+  FunctionEntity get specializedAsIntNullable =>
+      _findRtiFunction('_asIntNullable');
+
+  @override
+  FunctionEntity get specializedCheckIntNullable =>
+      _findRtiFunction('_checkIntNullable');
+
+  @override
+  FunctionEntity get specializedIsNum => _findRtiFunction('_isNum');
+
+  @override
+  FunctionEntity get specializedAsNumNullable =>
+      _findRtiFunction('_asNumNullable');
+
+  @override
+  FunctionEntity get specializedCheckNumNullable =>
+      _findRtiFunction('_checkNumNullable');
+
+  @override
+  FunctionEntity get specializedIsString => _findRtiFunction('_isString');
+
+  @override
+  FunctionEntity get specializedAsStringNullable =>
+      _findRtiFunction('_asStringNullable');
+
+  @override
+  FunctionEntity get specializedCheckStringNullable =>
+      _findRtiFunction('_checkStringNullable');
+
   // From dart:_internal
 
   ClassEntity _symbolImplementationClass;
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index bb24531..61be000 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -1243,6 +1243,7 @@
         break;
       case BinaryOperatorKind.SHL:
       case BinaryOperatorKind.SHR:
+      case BinaryOperatorKind.SHRU:
       case BinaryOperatorKind.AND:
       case BinaryOperatorKind.OR:
       case BinaryOperatorKind.XOR:
@@ -1266,7 +1267,8 @@
         }
         if (isValid &&
             (operator.kind == BinaryOperatorKind.SHL ||
-                operator.kind == BinaryOperatorKind.SHR)) {
+                operator.kind == BinaryOperatorKind.SHR ||
+                operator.kind == BinaryOperatorKind.SHRU)) {
           IntConstantValue shift = rightValue;
           if (shift.intValue < BigInt.zero) {
             environment.reportError(right, MessageKind.INVALID_CONSTANT_SHIFT,
@@ -1392,8 +1394,9 @@
       case BinaryOperatorKind.AND:
       case BinaryOperatorKind.OR:
       case BinaryOperatorKind.XOR:
-      case BinaryOperatorKind.SHR:
       case BinaryOperatorKind.SHL:
+      case BinaryOperatorKind.SHR:
+      case BinaryOperatorKind.SHRU:
         return commonElements.intType;
       case BinaryOperatorKind.IF_NULL:
       case BinaryOperatorKind.INDEX:
@@ -1430,8 +1433,9 @@
     BinaryOperatorKind.XOR: 9,
     BinaryOperatorKind.AND: 10,
     BinaryOperatorKind.OR: 8,
-    BinaryOperatorKind.SHR: 11,
     BinaryOperatorKind.SHL: 11,
+    BinaryOperatorKind.SHR: 11,
+    BinaryOperatorKind.SHRU: 11,
     BinaryOperatorKind.ADD: 12,
     BinaryOperatorKind.SUB: 12,
     BinaryOperatorKind.MUL: 13,
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index f961525..ffcfc5c 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -17,7 +17,6 @@
 import 'options.dart' show CompilerOptions;
 import 'source_file_provider.dart';
 import 'util/command_line.dart';
-import 'util/uri_extras.dart';
 import 'util/util.dart' show stackTraceFilePrefix;
 
 const String _defaultSpecificationUri = '../../../../sdk/lib/libraries.json';
@@ -675,16 +674,16 @@
         inputName = 'bytes data';
         inputSize = inputProvider.dartCharactersRead;
         String dataInput =
-            relativize(currentDirectory, readDataUri, Platform.isWindows);
+            fe.relativizeUri(currentDirectory, readDataUri, Platform.isWindows);
         summary = 'Data files $input and $dataInput ';
         break;
       case ReadStrategy.fromCodegen:
         inputName = 'bytes data';
         inputSize = inputProvider.dartCharactersRead;
         String dataInput =
-            relativize(currentDirectory, readDataUri, Platform.isWindows);
-        String codeInput =
-            relativize(currentDirectory, readCodegenUri, Platform.isWindows);
+            fe.relativizeUri(currentDirectory, readDataUri, Platform.isWindows);
+        String codeInput = fe.relativizeUri(
+            currentDirectory, readCodegenUri, Platform.isWindows);
         summary = 'Data files $input, $dataInput and '
             '${codeInput}[0-${codegenShards - 1}] ';
         break;
@@ -696,31 +695,34 @@
         outputName = 'characters JavaScript';
         outputSize = outputProvider.totalCharactersWrittenJavaScript;
         primaryOutputSize = outputProvider.totalCharactersWrittenPrimary;
-        String output = relativize(currentDirectory, out, Platform.isWindows);
+        String output =
+            fe.relativizeUri(currentDirectory, out, Platform.isWindows);
         summary += 'compiled to JavaScript: ${output}';
         break;
       case WriteStrategy.toKernel:
         processName = 'Compiled';
         outputName = 'kernel bytes';
         outputSize = outputProvider.totalDataWritten;
-        String output = relativize(currentDirectory, out, Platform.isWindows);
+        String output =
+            fe.relativizeUri(currentDirectory, out, Platform.isWindows);
         summary += 'compiled to dill: ${output}.';
         break;
       case WriteStrategy.toData:
         processName = 'Serialized';
         outputName = 'bytes data';
         outputSize = outputProvider.totalDataWritten;
-        String output = relativize(currentDirectory, out, Platform.isWindows);
-        String dataOutput =
-            relativize(currentDirectory, writeDataUri, Platform.isWindows);
+        String output =
+            fe.relativizeUri(currentDirectory, out, Platform.isWindows);
+        String dataOutput = fe.relativizeUri(
+            currentDirectory, writeDataUri, Platform.isWindows);
         summary += 'serialized to dill and data: ${output} and ${dataOutput}.';
         break;
       case WriteStrategy.toCodegen:
         processName = 'Serialized';
         outputName = 'bytes data';
         outputSize = outputProvider.totalDataWritten;
-        String codeOutput =
-            relativize(currentDirectory, writeCodegenUri, Platform.isWindows);
+        String codeOutput = fe.relativizeUri(
+            currentDirectory, writeCodegenUri, Platform.isWindows);
         summary += 'serialized to codegen data: '
             '${codeOutput}${codegenShard}.';
         break;
@@ -731,9 +733,9 @@
         '${_formatCharacterCount(outputSize)} $outputName in '
         '${_formatDurationAsSeconds(wallclock.elapsed)} seconds');
     if (primaryOutputSize != null) {
-      diagnosticHandler
-          .info('${_formatCharacterCount(primaryOutputSize)} $outputName '
-              'in ${relativize(currentDirectory, out, Platform.isWindows)}');
+      diagnosticHandler.info(
+          '${_formatCharacterCount(primaryOutputSize)} $outputName '
+          'in ${fe.relativizeUri(currentDirectory, out, Platform.isWindows)}');
     }
     if (writeStrategy == WriteStrategy.toJs) {
       if (outputSpecified || diagnosticHandler.verbose) {
@@ -756,7 +758,9 @@
   diagnosticHandler.autoReadFileUri = true;
   CompilerOptions compilerOptions = CompilerOptions.parse(options,
       librariesSpecificationUri: librariesSpecificationUri,
-      platformBinaries: platformBinaries)
+      platformBinaries: platformBinaries,
+      onError: (String message) => fail(message),
+      onWarning: (String message) => print(message))
     ..entryPoint = script
     ..packageRoot = packageRoot
     ..packageConfig = packageConfig
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 437ff2a..67332be 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -6,6 +6,8 @@
 
 import 'dart:collection' show Queue;
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
+
 import 'common/tasks.dart' show CompilerTask;
 import 'common.dart';
 import 'common_elements.dart'
@@ -26,7 +28,6 @@
 import 'universe/use.dart';
 import 'universe/world_impact.dart'
     show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
-import 'util/uri_extras.dart' as uri_extras;
 import 'util/util.dart' show makeUnique;
 import 'world.dart' show KClosedWorld;
 
@@ -179,14 +180,14 @@
   ///
   /// The collected dependent elements and constants are are added to
   /// [elements] and [constants] respectively.
-  void _collectDirectMemberDependencies(
+  void _collectDirectMemberDependencies(KClosedWorld closedWorld,
       MemberEntity element, Dependencies dependencies) {
     // TODO(sigurdm): We want to be more specific about this - need a better
     // way to query "liveness".
     if (!compiler.resolutionWorldBuilder.isMemberUsed(element)) {
       return;
     }
-    _collectDependenciesFromImpact(element, dependencies);
+    _collectDependenciesFromImpact(closedWorld, element, dependencies);
     collectConstantsInBody(element, dependencies);
   }
 
@@ -195,7 +196,9 @@
   ///
   /// Adds the results to [elements] and [constants].
   void _collectAllElementsAndConstantsResolvedFromClass(
-      ClassEntity element, Dependencies dependencies) {
+      KClosedWorld closedWorld,
+      ClassEntity element,
+      Dependencies dependencies) {
     // If we see a class, add everything its live instance members refer
     // to.  Static members are not relevant, unless we are processing
     // extra dependencies due to mirrors.
@@ -203,7 +206,7 @@
       if (!compiler.resolutionWorldBuilder.isMemberUsed(member)) return;
       if (!member.isInstanceMember) return;
       dependencies.addMember(member);
-      _collectDirectMemberDependencies(member, dependencies);
+      _collectDirectMemberDependencies(closedWorld, member, dependencies);
     }
 
     ClassEntity cls = element;
@@ -219,21 +222,24 @@
   ///
   /// Adds the results to [elements] and [constants].
   void _collectAllElementsAndConstantsResolvedFromMember(
-      MemberEntity element, Dependencies dependencies) {
+      KClosedWorld closedWorld,
+      MemberEntity element,
+      Dependencies dependencies) {
     if (element is FunctionEntity) {
       _collectTypeDependencies(
           elementEnvironment.getFunctionType(element), dependencies);
     }
     if (element.isStatic || element.isTopLevel || element.isConstructor) {
       dependencies.addMember(element);
-      _collectDirectMemberDependencies(element, dependencies);
+      _collectDirectMemberDependencies(closedWorld, element, dependencies);
     }
     if (element is ConstructorEntity && element.isGenerativeConstructor) {
       // When instantiating a class, we record a reference to the
       // constructor, not the class itself.  We must add all the
       // instance members of the constructor's class.
       ClassEntity cls = element.enclosingClass;
-      _collectAllElementsAndConstantsResolvedFromClass(cls, dependencies);
+      _collectAllElementsAndConstantsResolvedFromClass(
+          closedWorld, cls, dependencies);
     }
 
     // Other elements, in particular instance members, are ignored as
@@ -265,13 +271,14 @@
   }
 
   /// Extract any dependencies that are known from the impact of [element].
-  void _collectDependenciesFromImpact(
+  void _collectDependenciesFromImpact(KClosedWorld closedWorld,
       MemberEntity element, Dependencies dependencies) {
     WorldImpact worldImpact = compiler.impactCache[element];
     compiler.impactStrategy.visitImpact(
         element,
         worldImpact,
-        new WorldImpactVisitorImpl(visitStaticUse: (StaticUse staticUse) {
+        new WorldImpactVisitorImpl(
+            visitStaticUse: (MemberEntity member, StaticUse staticUse) {
           Entity usedEntity = staticUse.element;
           if (usedEntity is MemberEntity) {
             dependencies.addMember(usedEntity, staticUse.deferredImport);
@@ -306,7 +313,7 @@
               break;
             default:
           }
-        }, visitTypeUse: (TypeUse typeUse) {
+        }, visitTypeUse: (MemberEntity member, TypeUse typeUse) {
           DartType type = typeUse.type;
           switch (typeUse.kind) {
             case TypeUseKind.TYPE_LITERAL:
@@ -327,17 +334,23 @@
               _collectTypeDependencies(type, dependencies);
               break;
             case TypeUseKind.AS_CAST:
-              if (!compiler.options.omitAsCasts) {
+              if (closedWorld.annotationsData
+                  .getExplicitCastCheckPolicy(element)
+                  .isEmitted) {
                 _collectTypeDependencies(type, dependencies);
               }
               break;
             case TypeUseKind.IMPLICIT_CAST:
-              if (compiler.options.implicitDowncastCheckPolicy.isEmitted) {
+              if (closedWorld.annotationsData
+                  .getImplicitDowncastCheckPolicy(element)
+                  .isEmitted) {
                 _collectTypeDependencies(type, dependencies);
               }
               break;
             case TypeUseKind.PARAMETER_CHECK:
-              if (compiler.options.parameterCheckPolicy.isEmitted) {
+              if (closedWorld.annotationsData
+                  .getParameterCheckPolicy(element)
+                  .isEmitted) {
                 _collectTypeDependencies(type, dependencies);
               }
               break;
@@ -346,7 +359,7 @@
               failedAt(element, "Unexpected type use: $typeUse.");
               break;
           }
-        }, visitDynamicUse: (DynamicUse dynamicUse) {
+        }, visitDynamicUse: (MemberEntity member, DynamicUse dynamicUse) {
           // TODO(johnniwinther): Use rti need data to skip unneeded type
           // arguments.
           _collectTypeArgumentDependencies(
@@ -360,8 +373,12 @@
   /// import set, we stop and enqueue a new recursive update in [queue].
   ///
   /// Invariants: oldSet is either null or a subset of newSet.
-  void _updateConstantRecursive(ConstantValue constant, ImportSet oldSet,
-      ImportSet newSet, WorkQueue queue) {
+  void _updateConstantRecursive(
+      KClosedWorld closedWorld,
+      ConstantValue constant,
+      ImportSet oldSet,
+      ImportSet newSet,
+      WorkQueue queue) {
     if (constant == null) return;
     var currentSet = _constantToSet[constant];
 
@@ -375,19 +392,21 @@
       _constantToSet[constant] = newSet;
       if (constant is ConstructedConstantValue) {
         ClassEntity cls = constant.type.element;
-        _updateClassRecursive(cls, oldSet, newSet, queue);
+        _updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
       }
       if (constant is InstantiationConstantValue) {
         for (DartType type in constant.typeArguments) {
           if (type is InterfaceType) {
-            _updateClassRecursive(type.element, oldSet, newSet, queue);
+            _updateClassRecursive(
+                closedWorld, type.element, oldSet, newSet, queue);
           }
         }
       }
       constant.getDependencies().forEach((ConstantValue dependency) {
         // Constants are not allowed to refer to deferred constants, so
         // no need to check for a deferred type literal here.
-        _updateConstantRecursive(dependency, oldSet, newSet, queue);
+        _updateConstantRecursive(
+            closedWorld, dependency, oldSet, newSet, queue);
       });
     } else {
       assert(
@@ -401,8 +420,8 @@
     }
   }
 
-  void _updateClassRecursive(ClassEntity element, ImportSet oldSet,
-      ImportSet newSet, WorkQueue queue) {
+  void _updateClassRecursive(KClosedWorld closedWorld, ClassEntity element,
+      ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
     if (element == null) return;
 
     ImportSet currentSet = _classToSet[element];
@@ -419,17 +438,18 @@
       _classToSet[element] = newSet;
 
       Dependencies dependencies = new Dependencies();
-      _collectAllElementsAndConstantsResolvedFromClass(element, dependencies);
+      _collectAllElementsAndConstantsResolvedFromClass(
+          closedWorld, element, dependencies);
       LibraryEntity library = element.library;
       _processDependencies(
-          library, dependencies, oldSet, newSet, queue, element);
+          closedWorld, library, dependencies, oldSet, newSet, queue, element);
     } else {
       queue.addClass(element, newSet);
     }
   }
 
-  void _updateMemberRecursive(MemberEntity element, ImportSet oldSet,
-      ImportSet newSet, WorkQueue queue) {
+  void _updateMemberRecursive(KClosedWorld closedWorld, MemberEntity element,
+      ImportSet oldSet, ImportSet newSet, WorkQueue queue) {
     if (element == null) return;
 
     ImportSet currentSet = _memberToSet[element];
@@ -446,11 +466,12 @@
       _memberToSet[element] = newSet;
 
       Dependencies dependencies = new Dependencies();
-      _collectAllElementsAndConstantsResolvedFromMember(element, dependencies);
+      _collectAllElementsAndConstantsResolvedFromMember(
+          closedWorld, element, dependencies);
 
       LibraryEntity library = element.library;
       _processDependencies(
-          library, dependencies, oldSet, newSet, queue, element);
+          closedWorld, library, dependencies, oldSet, newSet, queue, element);
     } else {
       queue.addMember(element, newSet);
     }
@@ -542,8 +563,14 @@
     }
   }
 
-  void _processDependencies(LibraryEntity library, Dependencies dependencies,
-      ImportSet oldSet, ImportSet newSet, WorkQueue queue, Spannable context) {
+  void _processDependencies(
+      KClosedWorld closedWorld,
+      LibraryEntity library,
+      Dependencies dependencies,
+      ImportSet oldSet,
+      ImportSet newSet,
+      WorkQueue queue,
+      Spannable context) {
     dependencies.classes.forEach((ClassEntity cls, DependencyInfo info) {
       _fixClassDependencyInfo(info, cls, library, context);
       if (info.isDeferred) {
@@ -553,7 +580,7 @@
           }
         }
       } else {
-        _updateClassRecursive(cls, oldSet, newSet, queue);
+        _updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
       }
     });
 
@@ -566,7 +593,7 @@
           }
         }
       } else {
-        _updateMemberRecursive(member, oldSet, newSet, queue);
+        _updateMemberRecursive(closedWorld, member, oldSet, newSet, queue);
       }
     });
 
@@ -584,7 +611,7 @@
           }
         }
       } else {
-        _updateConstantRecursive(constant, oldSet, newSet, queue);
+        _updateConstantRecursive(closedWorld, constant, oldSet, newSet, queue);
       }
     });
   }
@@ -773,7 +800,7 @@
       void emptyQueue() {
         while (queue.isNotEmpty) {
           WorkItem item = queue.nextItem();
-          item.update(this, queue);
+          item.update(this, closedWorld, queue);
         }
       }
 
@@ -946,7 +973,7 @@
   ImportDescription(
       ImportEntity import, LibraryEntity importingLibrary, Uri mainLibraryUri)
       : this.internal(
-            uri_extras.relativize(
+            fe.relativizeUri(
                 mainLibraryUri, importingLibrary.canonicalUri, false),
             import.name,
             importingLibrary);
@@ -1167,7 +1194,7 @@
 
   WorkItem(this.importsToAdd);
 
-  void update(DeferredLoadTask task, WorkQueue queue);
+  void update(DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue);
 }
 
 /// Summary of the work that needs to be done on a class.
@@ -1178,11 +1205,12 @@
   ClassWorkItem(this.cls, ImportSet newSet) : super(newSet);
 
   @override
-  void update(DeferredLoadTask task, WorkQueue queue) {
+  void update(
+      DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
     queue.pendingClasses.remove(cls);
     ImportSet oldSet = task._classToSet[cls];
     ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
-    task._updateClassRecursive(cls, oldSet, newSet, queue);
+    task._updateClassRecursive(closedWorld, cls, oldSet, newSet, queue);
   }
 }
 
@@ -1194,11 +1222,12 @@
   MemberWorkItem(this.member, ImportSet newSet) : super(newSet);
 
   @override
-  void update(DeferredLoadTask task, WorkQueue queue) {
+  void update(
+      DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
     queue.pendingMembers.remove(member);
     ImportSet oldSet = task._memberToSet[member];
     ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
-    task._updateMemberRecursive(member, oldSet, newSet, queue);
+    task._updateMemberRecursive(closedWorld, member, oldSet, newSet, queue);
   }
 }
 
@@ -1210,11 +1239,12 @@
   ConstantWorkItem(this.constant, ImportSet newSet) : super(newSet);
 
   @override
-  void update(DeferredLoadTask task, WorkQueue queue) {
+  void update(
+      DeferredLoadTask task, KClosedWorld closedWorld, WorkQueue queue) {
     queue.pendingConstants.remove(constant);
     ImportSet oldSet = task._constantToSet[constant];
     ImportSet newSet = task.importSets.union(oldSet, importsToAdd);
-    task._updateConstantRecursive(constant, oldSet, newSet, queue);
+    task._updateConstantRecursive(closedWorld, constant, oldSet, newSet, queue);
   }
 }
 
diff --git a/pkg/compiler/lib/src/diagnostics/code_location.dart b/pkg/compiler/lib/src/diagnostics/code_location.dart
index 8e923f9..17b48f6 100644
--- a/pkg/compiler/lib/src/diagnostics/code_location.dart
+++ b/pkg/compiler/lib/src/diagnostics/code_location.dart
@@ -4,7 +4,7 @@
 
 library dart2js.diagnostics.code_location;
 
-import '../util/uri_extras.dart' as uri_extras show relativize;
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 
 /// [CodeLocation] divides uris into different classes.
 ///
@@ -47,7 +47,7 @@
 
   @override
   String relativize(Uri baseUri) {
-    return uri_extras.relativize(baseUri, uri, false);
+    return fe.relativizeUri(baseUri, uri, false);
   }
 }
 
@@ -82,7 +82,7 @@
 
   @override
   String relativize(Uri baseUri) {
-    return uri_extras.relativize(baseUri, uri, false);
+    return fe.relativizeUri(baseUri, uri, false);
   }
 }
 
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 83f3790..646cdee 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -465,14 +465,14 @@
     compiler.impactStrategy.visitImpact(
         entity,
         impact,
-        new WorldImpactVisitorImpl(visitDynamicUse: (dynamicUse) {
+        new WorldImpactVisitorImpl(visitDynamicUse: (member, dynamicUse) {
           AbstractValue mask = dynamicUse.receiverConstraint;
           selections.addAll(closedWorld
               // TODO(het): Handle `call` on `Closure` through
               // `world.includesClosureCall`.
               .locateMembers(dynamicUse.selector, mask)
               .map((MemberEntity e) => new Selection(e, mask)));
-        }, visitStaticUse: (staticUse) {
+        }, visitStaticUse: (member, staticUse) {
           selections.add(new Selection(staticUse.element, null));
         }),
         IMPACT_USE);
diff --git a/pkg/compiler/lib/src/elements/entity_utils.dart b/pkg/compiler/lib/src/elements/entity_utils.dart
index 0a26700..82be8db 100644
--- a/pkg/compiler/lib/src/elements/entity_utils.dart
+++ b/pkg/compiler/lib/src/elements/entity_utils.dart
@@ -133,6 +133,8 @@
     return r'operator$shl';
   } else if (name == '>>') {
     return r'operator$shr';
+  } else if (name == '>>>') {
+    return r'operator$shru';
   } else if (name == '>=') {
     return r'operator$ge';
   } else if (name == '>') {
diff --git a/pkg/compiler/lib/src/elements/operators.dart b/pkg/compiler/lib/src/elements/operators.dart
index e3fc7d9..4f3e95c 100644
--- a/pkg/compiler/lib/src/elements/operators.dart
+++ b/pkg/compiler/lib/src/elements/operators.dart
@@ -79,6 +79,7 @@
   MOD,
   SHL,
   SHR,
+  SHRU,
   GTEQ,
   GT,
   LTEQ,
@@ -149,6 +150,10 @@
   static const BinaryOperator SHR =
       const BinaryOperator._(BinaryOperatorKind.SHR, '>>');
 
+  /// The binary >>> operator.
+  static const BinaryOperator SHRU =
+      const BinaryOperator._(BinaryOperatorKind.SHRU, '>>');
+
   /// The binary >= operator.
   static const BinaryOperator GTEQ =
       const BinaryOperator._(BinaryOperatorKind.GTEQ, '>=');
@@ -226,6 +231,8 @@
         return SHL;
       case '>>':
         return SHR;
+      case '>>>':
+        return SHRU;
       case '>=':
         return GTEQ;
       case '>':
@@ -270,6 +277,8 @@
         return SHL;
       case BinaryOperatorKind.SHR:
         return SHR;
+      case BinaryOperatorKind.SHRU:
+        return SHRU;
       case BinaryOperatorKind.GTEQ:
         return GTEQ;
       case BinaryOperatorKind.GT:
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 9529615..5dbbef9 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -13,10 +13,10 @@
 import 'common_elements.dart' show ElementEnvironment;
 import 'constants/values.dart';
 import 'compiler.dart' show Compiler;
-import 'options.dart';
 import 'elements/entities.dart';
 import 'elements/types.dart';
 import 'inferrer/types.dart';
+import 'js_backend/annotations.dart';
 import 'js_backend/backend.dart' show CodegenInputs;
 import 'js_backend/enqueuer.dart';
 import 'universe/member_usage.dart';
@@ -184,8 +184,8 @@
 abstract class EnqueuerImpl extends Enqueuer {
   CompilerTask get task;
   void checkClass(ClassEntity cls);
-  void processStaticUse(StaticUse staticUse);
-  void processTypeUse(TypeUse typeUse);
+  void processStaticUse(MemberEntity member, StaticUse staticUse);
+  void processTypeUse(MemberEntity member, TypeUse typeUse);
   void processDynamicUse(DynamicUse dynamicUse);
   void processConstantUse(ConstantUse constantUse);
   EnqueuerListener get listener;
@@ -235,7 +235,6 @@
   @override
   final CompilerTask task;
   final String name;
-  final CompilerOptions _options;
   @override
   final EnqueuerListener listener;
 
@@ -244,6 +243,7 @@
   final ResolutionEnqueuerWorldBuilder _worldBuilder;
   final WorkItemBuilder _workItemBuilder;
   final DiagnosticReporter _reporter;
+  final AnnotationsData _annotationsData;
 
   @override
   bool queueIsClosed = false;
@@ -256,8 +256,8 @@
   // applying additional impacts before re-emptying the queue.
   void Function() onEmptyForTesting;
 
-  ResolutionEnqueuer(this.task, this._options, this._reporter, this.listener,
-      this._worldBuilder, this._workItemBuilder,
+  ResolutionEnqueuer(this.task, this._reporter, this.listener,
+      this._worldBuilder, this._workItemBuilder, this._annotationsData,
       [this.name = 'resolution enqueuer']) {
     _impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
@@ -365,7 +365,7 @@
   }
 
   @override
-  void processStaticUse(StaticUse staticUse) {
+  void processStaticUse(MemberEntity member, StaticUse staticUse) {
     task.measureSubtask('resolution.staticUse', () {
       _worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
       // TODO(johnniwinther): Add `ResolutionWorldBuilder.registerConstructorUse`
@@ -383,7 +383,7 @@
   }
 
   @override
-  void processTypeUse(TypeUse typeUse) {
+  void processTypeUse(MemberEntity member, TypeUse typeUse) {
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
@@ -399,17 +399,17 @@
         _registerIsCheck(type);
         break;
       case TypeUseKind.AS_CAST:
-        if (!_options.omitAsCasts) {
+        if (_annotationsData.getExplicitCastCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
       case TypeUseKind.IMPLICIT_CAST:
-        if (_options.implicitDowncastCheckPolicy.isEmitted) {
+        if (_annotationsData.getImplicitDowncastCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
       case TypeUseKind.PARAMETER_CHECK:
-        if (_options.parameterCheckPolicy.isEmitted) {
+        if (_annotationsData.getParameterCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
@@ -525,22 +525,22 @@
   EnqueuerImplImpactVisitor(this.enqueuer);
 
   @override
-  void visitDynamicUse(DynamicUse dynamicUse) {
+  void visitDynamicUse(MemberEntity member, DynamicUse dynamicUse) {
     enqueuer.processDynamicUse(dynamicUse);
   }
 
   @override
-  void visitStaticUse(StaticUse staticUse) {
-    enqueuer.processStaticUse(staticUse);
+  void visitStaticUse(MemberEntity member, StaticUse staticUse) {
+    enqueuer.processStaticUse(member, staticUse);
   }
 
   @override
-  void visitTypeUse(TypeUse typeUse) {
-    enqueuer.processTypeUse(typeUse);
+  void visitTypeUse(MemberEntity member, TypeUse typeUse) {
+    enqueuer.processTypeUse(member, typeUse);
   }
 
   @override
-  void visitConstantUse(ConstantUse constantUse) {
+  void visitConstantUse(MemberEntity member, ConstantUse constantUse) {
     enqueuer.processConstantUse(constantUse);
   }
 }
diff --git a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
index a064777..b4ba15b 100644
--- a/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
+++ b/pkg/compiler/lib/src/inferrer/abstract_value_domain.dart
@@ -64,6 +64,19 @@
 /// A value in an abstraction of runtime values.
 abstract class AbstractValue {}
 
+/// A pair of an AbstractValue and a precision flag. See
+/// [AbstractValueDomain.createFromStaticType] for semantics of [isPrecise].
+class AbstractValueWithPrecision {
+  final AbstractValue abstractValue;
+  final bool isPrecise;
+
+  const AbstractValueWithPrecision(this.abstractValue, this.isPrecise);
+
+  @override
+  String toString() =>
+      'AbstractValueWithPrecision($abstractValue, isPrecise: $isPrecise)';
+}
+
 /// A system that implements an abstraction over runtime values.
 abstract class AbstractValueDomain {
   /// The [AbstractValue] that represents an unknown runtime value.
@@ -162,9 +175,38 @@
   /// `Stream` class used for the `async*` implementation.
   AbstractValue get asyncStarStreamType;
 
+  /// Returns an [AbstractValue] and a precision flag.
+  ///
   /// Creates an [AbstractValue] corresponding to an expression of the given
-  /// static [type] and [classRelation].
-  AbstractValue createFromStaticType(DartType type,
+  /// static [type] and [classRelation], and an `isPrecise` flag that is `true`
+  /// if the [AbstractValue] precisely represents the [type], or `false` if the
+  /// [AbstractValue] is an approximation.
+  ///
+  /// If `isPrecise` is `true`, then the abstract value is equivalent to [type].
+  ///
+  /// If `isPrecise` is `false` then the abstract value contains all types in
+  /// [type] but might contain more. Two different Dart types can have the same
+  /// approximation, so care must be taken not to make subtype judgements from
+  /// imprecise abstract values.
+  ///
+  /// The type `T` where `T` is a type parameter would be modelled by an
+  /// imprecise abstract value type since we don't know how `T` is
+  /// instantiated. It might be approximated by the bound of `T`.  `List<T>`
+  /// where `T` is a type parameter would be modelled as imprecise for the same
+  /// reason.
+  ///
+  /// If the abstract value domain does not track generic type parameters (e.g.
+  /// the current implementation of type-masks), then `List<int>` would need to
+  /// be modelled by an imprecise abstract value. `List<dynamic>` might be the
+  /// imprecise approximation.
+  ///
+  /// In the context of a run-time type check, an imprecise abstract value can
+  /// be used to compute an output type by narrowing the input type, but only a
+  /// precise abstract value could be used to remove the check on the basis of
+  /// the input's abstract type. The check can only be removed with additional
+  /// reasoning, for example, that a dominating check uses the same type
+  /// expression.
+  AbstractValueWithPrecision createFromStaticType(DartType type,
       [ClassRelation classRelation = ClassRelation.subtype]);
 
   /// Creates an [AbstractValue] for a non-null exact instance of [cls].
diff --git a/pkg/compiler/lib/src/inferrer/builder_kernel.dart b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
index 200d368..95f3c9c 100644
--- a/pkg/compiler/lib/src/inferrer/builder_kernel.dart
+++ b/pkg/compiler/lib/src/inferrer/builder_kernel.dart
@@ -1851,12 +1851,13 @@
 
   @override
   TypeInformation visitConstantExpression(ir.ConstantExpression node) {
-    return node.constant.accept(new TypeInformationConstantVisitor(this, node));
+    return new TypeInformationConstantVisitor(this, node)
+        .visitConstant(node.constant);
   }
 }
 
 class TypeInformationConstantVisitor
-    implements ir.ConstantVisitor<TypeInformation> {
+    extends ir.ComputeOnceConstantVisitor<TypeInformation> {
   final KernelTypeGraphBuilder builder;
   final ir.ConstantExpression expression;
 
@@ -1903,7 +1904,7 @@
     return builder.createMapTypeInformation(
         new ConstantReference(expression, node),
         node.entries
-            .map((e) => new Pair(e.key.accept(this), e.value.accept(this))),
+            .map((e) => new Pair(visitConstant(e.key), visitConstant(e.value))),
         isConst: true);
   }
 
@@ -1911,7 +1912,7 @@
   TypeInformation visitListConstant(ir.ListConstant node) {
     return builder.createListTypeInformation(
         new ConstantReference(expression, node),
-        node.entries.map((e) => e.accept(this)),
+        node.entries.map((e) => visitConstant(e)),
         isConst: true);
   }
 
@@ -1919,7 +1920,7 @@
   TypeInformation visitSetConstant(ir.SetConstant node) {
     return builder.createSetTypeInformation(
         new ConstantReference(expression, node),
-        node.entries.map((e) => e.accept(this)),
+        node.entries.map((e) => visitConstant(e)),
         isConst: true);
   }
 
@@ -1927,7 +1928,8 @@
   TypeInformation visitInstanceConstant(ir.InstanceConstant node) {
     node.fieldValues.forEach((ir.Reference reference, ir.Constant value) {
       builder._inferrer.recordTypeOfField(
-          builder._elementMap.getField(reference.asField), value.accept(this));
+          builder._elementMap.getField(reference.asField),
+          visitConstant(value));
     });
     return builder._types.getConcreteTypeFor(builder
         ._closedWorld.abstractValueDomain
@@ -1937,8 +1939,8 @@
   @override
   TypeInformation visitPartialInstantiationConstant(
       ir.PartialInstantiationConstant node) {
-    return builder
-        .createInstantiationTypeInformation(node.tearOffConstant.accept(this));
+    return builder.createInstantiationTypeInformation(
+        visitConstant(node.tearOffConstant));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/inferrer/trivial.dart b/pkg/compiler/lib/src/inferrer/trivial.dart
index a7dd919..218962b 100644
--- a/pkg/compiler/lib/src/inferrer/trivial.dart
+++ b/pkg/compiler/lib/src/inferrer/trivial.dart
@@ -359,9 +359,9 @@
       const TrivialAbstractValue();
 
   @override
-  AbstractValue createFromStaticType(DartType type,
+  AbstractValueWithPrecision createFromStaticType(DartType type,
           [ClassRelation classRelation = ClassRelation.subtype]) =>
-      const TrivialAbstractValue();
+      const AbstractValueWithPrecision(const TrivialAbstractValue(), false);
 
   @override
   AbstractValue get asyncStarStreamType => const TrivialAbstractValue();
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index b8d5dcc..f3a949d 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -469,11 +469,7 @@
 
   AbstractValue potentiallyNarrowType(
       AbstractValue mask, InferrerEngine inferrer) {
-    if (inferrer.options.assignmentCheckPolicy.isTrusted ||
-        inferrer.options.assignmentCheckPolicy.isEmitted) {
-      return _potentiallyNarrowType(mask, inferrer);
-    }
-    return mask;
+    return _potentiallyNarrowType(mask, inferrer);
   }
 
   AbstractValue _potentiallyNarrowType(
@@ -803,7 +799,9 @@
 
   AbstractValue potentiallyNarrowType(
       AbstractValue mask, InferrerEngine inferrer) {
-    if (inferrer.options.parameterCheckPolicy.isTrusted) {
+    if (inferrer.closedWorld.annotationsData
+        .getParameterCheckPolicy(method)
+        .isTrusted) {
       // In checked or strong mode we don't trust the types of the arguments
       // passed to a parameter. The means that the checking of a parameter is
       // based on the actual arguments.
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
index f487ba4..a24356a 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/masks.dart
@@ -264,31 +264,44 @@
   }
 
   @override
-  AbstractValue createFromStaticType(DartType type,
+  AbstractValueWithPrecision createFromStaticType(DartType type,
       [ClassRelation classRelation = ClassRelation.subtype]) {
+    bool isPrecise = true;
     while (type is TypeVariableType) {
       TypeVariableType typeVariable = type;
       type = _closedWorld.elementEnvironment
           .getTypeVariableBound(typeVariable.element);
       classRelation = ClassRelation.subtype;
+      isPrecise = false;
     }
     if (type is InterfaceType) {
+      if (isPrecise) {
+        // TODO(sra): Could be precise if instantiated-to-bounds.
+        for (DartType argument in type.typeArguments) {
+          if (argument is DynamicType) continue;
+          isPrecise = false;
+        }
+      }
       switch (classRelation) {
         case ClassRelation.exact:
-          return new TypeMask.exact(type.element, _closedWorld);
+          return AbstractValueWithPrecision(
+              TypeMask.exact(type.element, _closedWorld), isPrecise);
         case ClassRelation.thisExpression:
           if (!_closedWorld.isUsedAsMixin(type.element)) {
-            return new TypeMask.subclass(type.element, _closedWorld);
+            return AbstractValueWithPrecision(
+                TypeMask.subclass(type.element, _closedWorld), isPrecise);
           }
           break;
         case ClassRelation.subtype:
           break;
       }
-      return new TypeMask.subtype(type.element, _closedWorld);
+      return AbstractValueWithPrecision(
+          TypeMask.subtype(type.element, _closedWorld), isPrecise);
     } else if (type is FunctionType) {
-      return new TypeMask.subtype(commonElements.functionClass, _closedWorld);
+      return AbstractValueWithPrecision(
+          TypeMask.subtype(commonElements.functionClass, _closedWorld), false);
     } else {
-      return dynamicType;
+      return AbstractValueWithPrecision(dynamicType, false);
     }
   }
 
diff --git a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
index 1c3b7ec..6327315 100644
--- a/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
+++ b/pkg/compiler/lib/src/inferrer/typemasks/union_type_mask.dart
@@ -114,7 +114,7 @@
   static TypeMask flatten(List<FlatTypeMask> masks, JClosedWorld closedWorld) {
     // TODO(johnniwinther): Move this computation to [ClosedWorld] and use the
     // class set structures.
-    assert(masks.length > 1);
+    if (masks.isEmpty) throw ArgumentError.value(masks, 'masks');
     // If either type mask is a subtype type mask, we cannot use a
     // subclass type mask to represent their union.
     bool useSubclass = masks.every((e) => !e.isSubtype);
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index 0e88362..654c87b 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -4,9 +4,9 @@
 
 library dart2js.source_map_builder;
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 import 'package:kernel/ast.dart' show Location;
 import '../../compiler_new.dart' show CompilerOutput, OutputSink, OutputType;
-import '../util/uri_extras.dart' show relativize;
 import '../util/util.dart';
 import 'location_provider.dart';
 import 'code_output.dart' show SourceLocationsProvider, SourceLocations;
@@ -122,15 +122,15 @@
     buffer.write('  "version": 3,\n');
     buffer.write('  "engine": "$version",\n');
     if (sourceMapUri != null && targetFileUri != null) {
-      buffer.write(
-          '  "file": "${relativize(sourceMapUri, targetFileUri, false)}",\n');
+      buffer.write('  "file": '
+          '"${fe.relativizeUri(sourceMapUri, targetFileUri, false)}",\n');
     }
     buffer.write('  "sourceRoot": "",\n');
     buffer.write('  "sources": ');
     Iterable<String> relativeSourceUriList = const <String>[];
     if (sourceMapUri != null) {
       relativeSourceUriList =
-          uriMap.elements.map((u) => relativize(sourceMapUri, u, false));
+          uriMap.elements.map((u) => fe.relativizeUri(sourceMapUri, u, false));
     }
     printStringListOn(relativeSourceUriList, buffer);
     buffer.write(',\n');
@@ -255,7 +255,7 @@
   /// make it point to the source map file in [sourceMapUri].
   static String generateSourceMapTag(Uri sourceMapUri, Uri fileUri) {
     if (sourceMapUri != null && fileUri != null) {
-      String sourceMapFileName = relativize(fileUri, sourceMapUri, false);
+      String sourceMapFileName = fe.relativizeUri(fileUri, sourceMapUri, false);
       return '''
 
 //# sourceMappingURL=$sourceMapFileName
diff --git a/pkg/compiler/lib/src/ir/constants.dart b/pkg/compiler/lib/src/ir/constants.dart
index 06a6eb3..46f1e9e 100644
--- a/pkg/compiler/lib/src/ir/constants.dart
+++ b/pkg/compiler/lib/src/ir/constants.dart
@@ -19,12 +19,14 @@
 
   Dart2jsConstantEvaluator(
       ir.TypeEnvironment typeEnvironment, ReportErrorFunction reportError,
-      {bool enableAsserts,
-      Map<String, String> environment: const {},
+      {Map<String, String> environment: const {},
       bool supportReevaluationForTesting: false})
       : _supportReevaluationForTesting = supportReevaluationForTesting,
-        super(const Dart2jsConstantsBackend(), environment, typeEnvironment,
-            enableAsserts, new ErrorReporter(reportError));
+        super(
+            const Dart2jsConstantsBackend(supportsUnevaluatedConstants: false),
+            environment,
+            typeEnvironment,
+            new ErrorReporter(reportError));
 
   @override
   ErrorReporter get errorReporter => super.errorReporter;
diff --git a/pkg/compiler/lib/src/ir/impact.dart b/pkg/compiler/lib/src/ir/impact.dart
index 8799d9b..6ff3566 100644
--- a/pkg/compiler/lib/src/ir/impact.dart
+++ b/pkg/compiler/lib/src/ir/impact.dart
@@ -654,7 +654,7 @@
   @override
   void handleConstantExpression(ir.ConstantExpression node) {
     ir.LibraryDependency import = getDeferredImport(node);
-    node.constant.accept(new ConstantImpactVisitor(this, import, node));
+    new ConstantImpactVisitor(this, import, node).visitConstant(node.constant);
   }
 }
 
@@ -694,7 +694,7 @@
       this.impactData, this.typeMapsForTesting, this.cachedStaticTypes);
 }
 
-class ConstantImpactVisitor implements ir.ConstantVisitor<void> {
+class ConstantImpactVisitor extends ir.VisitOnceConstantVisitor {
   final ImpactRegistry registry;
   final ir.LibraryDependency import;
   final ir.ConstantExpression expression;
@@ -727,7 +727,7 @@
   void visitPartialInstantiationConstant(ir.PartialInstantiationConstant node) {
     registry.registerGenericInstantiation(
         node.tearOffConstant.procedure.function.functionType, node.types);
-    node.tearOffConstant.accept(this);
+    visitConstant(node.tearOffConstant);
   }
 
   @override
@@ -738,7 +738,7 @@
       ir.Field field = reference.asField;
       registry.registerFieldConstantInitialization(
           field, new ConstantReference(expression, value));
-      value.accept(this);
+      visitConstant(value);
     });
   }
 
@@ -747,7 +747,7 @@
     registry.registerSetLiteral(node.typeArgument,
         isConst: true, isEmpty: node.entries.isEmpty);
     for (ir.Constant element in node.entries) {
-      element.accept(this);
+      visitConstant(element);
     }
   }
 
@@ -756,7 +756,7 @@
     registry.registerListLiteral(node.typeArgument,
         isConst: true, isEmpty: node.entries.isEmpty);
     for (ir.Constant element in node.entries) {
-      element.accept(this);
+      visitConstant(element);
     }
   }
 
@@ -765,8 +765,8 @@
     registry.registerMapLiteral(node.keyType, node.valueType,
         isConst: true, isEmpty: node.entries.isEmpty);
     for (ir.ConstantMapEntry entry in node.entries) {
-      entry.key.accept(this);
-      entry.value.accept(this);
+      visitConstant(entry.key);
+      visitConstant(entry.value);
     }
   }
 
diff --git a/pkg/compiler/lib/src/ir/visitors.dart b/pkg/compiler/lib/src/ir/visitors.dart
index b5b5e64..6c08757 100644
--- a/pkg/compiler/lib/src/ir/visitors.dart
+++ b/pkg/compiler/lib/src/ir/visitors.dart
@@ -36,6 +36,15 @@
     }
     return sb.toString();
   }
+
+  @override
+  String visitConstantExpression(ir.ConstantExpression node) {
+    ir.Constant constant = node.constant;
+    if (constant is ir.StringConstant) {
+      return constant.value;
+    }
+    return null;
+  }
 }
 
 /// Visitor that converts a kernel constant expression into a
@@ -659,7 +668,7 @@
   }
 }
 
-class ConstantValuefier implements ir.ConstantVisitor<ConstantValue> {
+class ConstantValuefier extends ir.ComputeOnceConstantVisitor<ConstantValue> {
   final IrToElementMap elementMap;
 
   ConstantValuefier(this.elementMap);
@@ -695,7 +704,7 @@
     for (ir.DartType type in node.types) {
       typeArguments.add(elementMap.getDartType(type));
     }
-    FunctionConstantValue function = node.tearOffConstant.accept(this);
+    FunctionConstantValue function = visitConstant(node.tearOffConstant);
     return new InstantiationConstantValue(typeArguments, function);
   }
 
@@ -706,7 +715,7 @@
     Map<FieldEntity, ConstantValue> fields = {};
     node.fieldValues.forEach((ir.Reference reference, ir.Constant value) {
       FieldEntity field = elementMap.getField(reference.asField);
-      fields[field] = value.accept(this);
+      fields[field] = visitConstant(value);
     });
     return new ConstructedConstantValue(type, fields);
   }
@@ -715,7 +724,7 @@
   ConstantValue visitListConstant(ir.ListConstant node) {
     List<ConstantValue> elements = [];
     for (ir.Constant element in node.entries) {
-      elements.add(element.accept(this));
+      elements.add(visitConstant(element));
     }
     DartType type = elementMap.commonElements
         .listType(elementMap.getDartType(node.typeArgument));
@@ -726,7 +735,7 @@
   ConstantValue visitSetConstant(ir.SetConstant node) {
     List<ConstantValue> elements = [];
     for (ir.Constant element in node.entries) {
-      elements.add(element.accept(this));
+      elements.add(visitConstant(element));
     }
     DartType type = elementMap.commonElements
         .setType(elementMap.getDartType(node.typeArgument));
@@ -738,8 +747,8 @@
     List<ConstantValue> keys = [];
     List<ConstantValue> values = [];
     for (ir.ConstantMapEntry element in node.entries) {
-      keys.add(element.key.accept(this));
-      values.add(element.value.accept(this));
+      keys.add(visitConstant(element.key));
+      values.add(visitConstant(element.value));
     }
     DartType type = elementMap.commonElements.mapType(
         elementMap.getDartType(node.keyType),
diff --git a/pkg/compiler/lib/src/js_backend/annotations.dart b/pkg/compiler/lib/src/js_backend/annotations.dart
index 97678ca..5831230 100644
--- a/pkg/compiler/lib/src/js_backend/annotations.dart
+++ b/pkg/compiler/lib/src/js_backend/annotations.dart
@@ -74,6 +74,36 @@
       6, 'assumeDynamic',
       forFunctionsOnly: true, internalOnly: true);
 
+  static const PragmaAnnotation asTrust = const PragmaAnnotation(7, 'as:trust',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation asCheck = const PragmaAnnotation(8, 'as:check',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation typesTrust = const PragmaAnnotation(
+      9, 'types:trust',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation typesCheck = const PragmaAnnotation(
+      10, 'types:check',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation parameterTrust = const PragmaAnnotation(
+      11, 'parameter:trust',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation parameterCheck = const PragmaAnnotation(
+      12, 'parameter:check',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation downcastTrust = const PragmaAnnotation(
+      13, 'downcast:trust',
+      forFunctionsOnly: false, internalOnly: false);
+
+  static const PragmaAnnotation downcastCheck = const PragmaAnnotation(
+      14, 'downcast:check',
+      forFunctionsOnly: false, internalOnly: false);
+
   static const List<PragmaAnnotation> values = [
     noInline,
     tryInline,
@@ -82,7 +112,36 @@
     noThrows,
     noSideEffects,
     assumeDynamic,
+    asTrust,
+    asCheck,
+    typesTrust,
+    typesCheck,
+    parameterTrust,
+    parameterCheck,
+    downcastTrust,
+    downcastCheck,
   ];
+
+  static const Map<PragmaAnnotation, Set<PragmaAnnotation>> implies = {
+    typesTrust: {parameterTrust, downcastTrust},
+    typesCheck: {parameterCheck, downcastCheck},
+  };
+  static const Map<PragmaAnnotation, Set<PragmaAnnotation>> excludes = {
+    noInline: {tryInline},
+    tryInline: {noInline},
+    typesTrust: {typesCheck, parameterCheck, downcastCheck},
+    typesCheck: {typesTrust, parameterTrust, downcastTrust},
+    parameterTrust: {parameterCheck},
+    parameterCheck: {parameterTrust},
+    downcastTrust: {downcastCheck},
+    downcastCheck: {downcastTrust},
+    asTrust: {asCheck},
+    asCheck: {asTrust},
+  };
+  static const Map<PragmaAnnotation, Set<PragmaAnnotation>> requires = {
+    noThrows: {noInline},
+    noSideEffects: {noInline},
+  };
 }
 
 List<PragmaAnnotationData> computePragmaAnnotationData(
@@ -124,7 +183,7 @@
     DiagnosticReporter reporter,
     ir.Member member,
     List<PragmaAnnotationData> pragmaAnnotationData) {
-  EnumSet<PragmaAnnotation> values = new EnumSet<PragmaAnnotation>();
+  EnumSet<PragmaAnnotation> annotations = new EnumSet<PragmaAnnotation>();
 
   Uri uri = member.enclosingLibrary.importUri;
   bool platformAnnotationsAllowed =
@@ -137,7 +196,7 @@
     for (PragmaAnnotation annotation in PragmaAnnotation.values) {
       if (annotation.name == suffix) {
         found = true;
-        values.add(annotation);
+        annotations.add(annotation);
 
         if (data.hasOptions) {
           reporter.reportErrorMessage(
@@ -180,35 +239,55 @@
     }
   }
 
-  if (values.contains(PragmaAnnotation.tryInline) &&
-      values.contains(PragmaAnnotation.noInline)) {
-    reporter.reportErrorMessage(
-        computeSourceSpanFromTreeNode(member), MessageKind.GENERIC, {
-      'text': "@pragma('dart2js:tryInline') must not be used with "
-          "@pragma('dart2js:noInline')."
-    });
-    values.remove(PragmaAnnotation.tryInline);
+  Map<PragmaAnnotation, EnumSet<PragmaAnnotation>> reportedExclusions = {};
+  for (PragmaAnnotation annotation
+      in annotations.iterable(PragmaAnnotation.values)) {
+    Set<PragmaAnnotation> implies = PragmaAnnotation.implies[annotation];
+    if (implies != null) {
+      for (PragmaAnnotation other in implies) {
+        if (annotations.contains(other)) {
+          reporter.reportHintMessage(
+              computeSourceSpanFromTreeNode(member), MessageKind.GENERIC, {
+            'text': "@pragma('dart2js:${annotation.name}') implies "
+                "@pragma('dart2js:${other.name}')."
+          });
+        }
+      }
+    }
+    Set<PragmaAnnotation> excludes = PragmaAnnotation.excludes[annotation];
+    if (excludes != null) {
+      for (PragmaAnnotation other in excludes) {
+        if (annotations.contains(other) &&
+            !(reportedExclusions[other]?.contains(annotation) ?? false)) {
+          reporter.reportErrorMessage(
+              computeSourceSpanFromTreeNode(member), MessageKind.GENERIC, {
+            'text': "@pragma('dart2js:${annotation.name}') must not be used "
+                "with @pragma('dart2js:${other.name}')."
+          });
+          (reportedExclusions[annotation] ??= new EnumSet()).add(other);
+        }
+      }
+    }
+    Set<PragmaAnnotation> requires = PragmaAnnotation.requires[annotation];
+    if (requires != null) {
+      for (PragmaAnnotation other in requires) {
+        if (!annotations.contains(other)) {
+          reporter.reportErrorMessage(
+              computeSourceSpanFromTreeNode(member), MessageKind.GENERIC, {
+            'text': "@pragma('dart2js:${annotation.name}') should always be "
+                "combined with @pragma('dart2js:${other.name}')."
+          });
+        }
+      }
+    }
   }
-  if (values.contains(PragmaAnnotation.noThrows) &&
-      !values.contains(PragmaAnnotation.noInline)) {
-    reporter.internalError(
-        computeSourceSpanFromTreeNode(member),
-        "@pragma('dart2js:noThrows') should always be combined with "
-        "@pragma('dart2js:noInline').");
-  }
-  if (values.contains(PragmaAnnotation.noSideEffects) &&
-      !values.contains(PragmaAnnotation.noInline)) {
-    reporter.internalError(
-        computeSourceSpanFromTreeNode(member),
-        "@pragma('dart2js:noSideEffects') should always be combined with "
-        "@pragma('dart2js:noInline').");
-  }
-  return values;
+  return annotations;
 }
 
 abstract class AnnotationsData {
   /// Deserializes a [AnnotationsData] object from [source].
-  factory AnnotationsData.readFromDataSource(DataSource source) =
+  factory AnnotationsData.readFromDataSource(
+          CompilerOptions options, DataSource source) =
       AnnotationsDataImpl.readFromDataSource;
 
   /// Serializes this [AnnotationsData] to [sink].
@@ -254,6 +333,28 @@
   /// Calls [f] for all functions with a `@pragma('dart2js:noSideEffects')`
   /// annotation.
   void forEachNoSideEffects(void f(FunctionEntity function));
+
+  /// What should the compiler do with parameter type assertions in [member].
+  ///
+  /// If [member] is `null`, the default policy is returned.
+  CheckPolicy getParameterCheckPolicy(MemberEntity member);
+
+  /// What should the compiler do with implicit downcasts in [member].
+  ///
+  /// If [member] is `null`, the default policy is returned.
+  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity member);
+
+  /// What the compiler should do with a boolean value in a condition context
+  /// in [member] when the language specification says it is a runtime error for
+  /// it to be null.
+  ///
+  /// If [member] is `null`, the default policy is returned.
+  CheckPolicy getConditionCheckPolicy(MemberEntity member);
+
+  /// Whether should the compiler do with explicit casts in [member].
+  ///
+  /// If [member] is `null`, the default policy is returned.
+  CheckPolicy getExplicitCastCheckPolicy(MemberEntity member);
 }
 
 class AnnotationsDataImpl implements AnnotationsData {
@@ -261,17 +362,28 @@
   /// debugging data stream.
   static const String tag = 'annotations-data';
 
+  final CheckPolicy _defaultParameterCheckPolicy;
+  final CheckPolicy _defaultImplicitDowncastCheckPolicy;
+  final CheckPolicy _defaultConditionCheckPolicy;
+  final CheckPolicy _defaultExplicitCastCheckPolicy;
   final Map<MemberEntity, EnumSet<PragmaAnnotation>> pragmaAnnotations;
 
-  AnnotationsDataImpl(this.pragmaAnnotations);
+  AnnotationsDataImpl(CompilerOptions options, this.pragmaAnnotations)
+      : this._defaultParameterCheckPolicy = options.defaultParameterCheckPolicy,
+        this._defaultImplicitDowncastCheckPolicy =
+            options.defaultImplicitDowncastCheckPolicy,
+        this._defaultConditionCheckPolicy = options.defaultConditionCheckPolicy,
+        this._defaultExplicitCastCheckPolicy =
+            options.defaultExplicitCastCheckPolicy;
 
-  factory AnnotationsDataImpl.readFromDataSource(DataSource source) {
+  factory AnnotationsDataImpl.readFromDataSource(
+      CompilerOptions options, DataSource source) {
     source.begin(tag);
     Map<MemberEntity, EnumSet<PragmaAnnotation>> pragmaAnnotations =
         source.readMemberMap(
             (MemberEntity member) => new EnumSet.fromValue(source.readInt()));
     source.end(tag);
-    return new AnnotationsDataImpl(pragmaAnnotations);
+    return new AnnotationsDataImpl(options, pragmaAnnotations);
   }
 
   @override
@@ -356,6 +468,78 @@
       }
     });
   }
+
+  @override
+  CheckPolicy getParameterCheckPolicy(MemberEntity member) {
+    if (member != null) {
+      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      if (annotations != null) {
+        if (annotations.contains(PragmaAnnotation.typesTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.typesCheck)) {
+          return CheckPolicy.checked;
+        } else if (annotations.contains(PragmaAnnotation.parameterTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.parameterCheck)) {
+          return CheckPolicy.checked;
+        }
+      }
+    }
+    return _defaultParameterCheckPolicy;
+  }
+
+  @override
+  CheckPolicy getImplicitDowncastCheckPolicy(MemberEntity member) {
+    if (member != null) {
+      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      if (annotations != null) {
+        if (annotations.contains(PragmaAnnotation.typesTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.typesCheck)) {
+          return CheckPolicy.checked;
+        } else if (annotations.contains(PragmaAnnotation.downcastTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.downcastCheck)) {
+          return CheckPolicy.checked;
+        }
+      }
+    }
+    return _defaultImplicitDowncastCheckPolicy;
+  }
+
+  @override
+  CheckPolicy getConditionCheckPolicy(MemberEntity member) {
+    if (member != null) {
+      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      if (annotations != null) {
+        if (annotations.contains(PragmaAnnotation.typesTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.typesCheck)) {
+          return CheckPolicy.checked;
+        } else if (annotations.contains(PragmaAnnotation.downcastTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.downcastCheck)) {
+          return CheckPolicy.checked;
+        }
+      }
+    }
+    return _defaultConditionCheckPolicy;
+  }
+
+  @override
+  CheckPolicy getExplicitCastCheckPolicy(MemberEntity member) {
+    if (member != null) {
+      EnumSet<PragmaAnnotation> annotations = pragmaAnnotations[member];
+      if (annotations != null) {
+        if (annotations.contains(PragmaAnnotation.asTrust)) {
+          return CheckPolicy.trusted;
+        } else if (annotations.contains(PragmaAnnotation.asCheck)) {
+          return CheckPolicy.checked;
+        }
+      }
+    }
+    return _defaultExplicitCastCheckPolicy;
+  }
 }
 
 class AnnotationsDataBuilder {
@@ -368,7 +552,7 @@
     }
   }
 
-  AnnotationsData close() {
-    return new AnnotationsDataImpl(pragmaAnnotations);
+  AnnotationsData close(CompilerOptions options) {
+    return new AnnotationsDataImpl(options, pragmaAnnotations);
   }
 }
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index b367d3a..a5b5f8a 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -20,6 +20,7 @@
 import 'checked_mode_helpers.dart';
 import 'namer.dart';
 import 'runtime_types.dart';
+import 'runtime_types_codegen.dart';
 import 'runtime_types_new.dart';
 
 abstract class FunctionCompiler {
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index f1ff33f..50f7e16 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -776,7 +776,34 @@
         _commonElements.instanceType,
         _commonElements.rtiEvalMethod,
         _commonElements.rtiBindMethod,
-      ])
+        _commonElements.generalIsTestImplementation,
+        _commonElements.generalAsCheckImplementation,
+        _commonElements.generalTypeCheckImplementation,
+        // Specialized checks.
+        _commonElements.specializedIsBool,
+        _commonElements.specializedAsBoolNullable,
+        _commonElements.specializedCheckBoolNullable,
+        // no specializedIsDouble.
+        _commonElements.specializedAsDoubleNullable,
+        _commonElements.specializedCheckDoubleNullable,
+        _commonElements.specializedIsInt,
+        _commonElements.specializedAsIntNullable,
+        _commonElements.specializedCheckIntNullable,
+        _commonElements.specializedIsNum,
+        _commonElements.specializedAsNumNullable,
+        _commonElements.specializedCheckNumNullable,
+        _commonElements.specializedIsString,
+        _commonElements.specializedAsStringNullable,
+        _commonElements.specializedCheckStringNullable,
+      ], globalClasses: [
+        _commonElements.closureClass, // instanceOrFunctionType uses this.
+      ], globalUses: [])
     ];
   }
+
+  BackendImpact _rtiAddRules;
+
+  BackendImpact get rtiAddRules => _rtiAddRules ??= BackendImpact(
+      globalUses: [_commonElements.rtiAddRulesMethod],
+      otherImpacts: [_needsString('Needed to encode the new RTI ruleset.')]);
 }
diff --git a/pkg/compiler/lib/src/js_backend/codegen_listener.dart b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
index c77257b..f8554ec 100644
--- a/pkg/compiler/lib/src/js_backend/codegen_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen_listener.dart
@@ -4,6 +4,8 @@
 
 library js_backend.backend.codegen_listener;
 
+import 'dart:collection';
+
 import '../common/names.dart' show Identifiers;
 import '../common_elements.dart' show CommonElements, ElementEnvironment;
 import '../constants/values.dart';
@@ -11,6 +13,7 @@
 import '../elements/types.dart';
 import '../enqueue.dart' show Enqueuer, EnqueuerListener;
 import '../native/enqueue.dart';
+import '../options.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/use.dart' show StaticUse, TypeUse;
 import '../universe/world_impact.dart'
@@ -18,9 +21,10 @@
 import 'backend_impact.dart';
 import 'backend_usage.dart';
 import 'custom_elements_analysis.dart';
-import 'runtime_types.dart';
+import 'runtime_types_resolution.dart';
 
 class CodegenEnqueuerListener extends EnqueuerListener {
+  final CompilerOptions _options;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
   final BackendImpacts _impacts;
@@ -33,8 +37,10 @@
   final NativeCodegenEnqueuer _nativeEnqueuer;
 
   bool _isNoSuchMethodUsed = false;
+  bool _isNewRtiUsed = false;
 
   CodegenEnqueuerListener(
+      this._options,
       this._elementEnvironment,
       this._commonElements,
       this._impacts,
@@ -115,6 +121,15 @@
       _isNoSuchMethodUsed = true;
     }
 
+    // TODO(fishythefish): Avoid registering unnecessary impacts.
+    if (_options.experimentNewRti && !_isNewRtiUsed) {
+      WorldImpactBuilderImpl newRtiImpact = new WorldImpactBuilderImpl();
+      newRtiImpact.registerStaticUse(StaticUse.staticInvoke(
+          _commonElements.rtiAddRulesMethod, CallStructure.TWO_ARGS));
+      enqueuer.applyImpact(newRtiImpact);
+      _isNewRtiUsed = true;
+    }
+
     if (!enqueuer.queueIsEmpty) return false;
 
     return true;
@@ -124,12 +139,15 @@
   void onQueueClosed() {}
 
   /// Adds the impact of [constant] to [impactBuilder].
-  void _computeImpactForCompileTimeConstant(
-      ConstantValue constant, WorldImpactBuilder impactBuilder) {
-    _computeImpactForCompileTimeConstantInternal(constant, impactBuilder);
+  void _computeImpactForCompileTimeConstant(ConstantValue constant,
+      WorldImpactBuilder impactBuilder, Set<ConstantValue> visited) {
+    if (visited.add(constant)) {
+      _computeImpactForCompileTimeConstantInternal(constant, impactBuilder);
 
-    for (ConstantValue dependency in constant.getDependencies()) {
-      _computeImpactForCompileTimeConstant(dependency, impactBuilder);
+      for (ConstantValue dependency in constant.getDependencies()) {
+        _computeImpactForCompileTimeConstant(
+            dependency, impactBuilder, visited);
+      }
     }
   }
 
@@ -193,7 +211,8 @@
   @override
   WorldImpact registerUsedConstant(ConstantValue constant) {
     WorldImpactBuilderImpl impactBuilder = new WorldImpactBuilderImpl();
-    _computeImpactForCompileTimeConstant(constant, impactBuilder);
+    _computeImpactForCompileTimeConstant(
+        constant, impactBuilder, new LinkedHashSet.identity());
     return impactBuilder;
   }
 
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 943b3932..b9a78c9 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -18,6 +18,7 @@
 import 'field_analysis.dart' show JFieldAnalysis;
 import 'runtime_types.dart';
 import 'runtime_types_new.dart' show RecipeEncoder;
+import 'runtime_types_resolution.dart';
 
 typedef jsAst.Expression _ConstantReferenceGenerator(ConstantValue constant);
 
@@ -236,7 +237,11 @@
         .toList(growable: false);
     jsAst.ArrayInitializer array = new jsAst.ArrayInitializer(elements);
     jsAst.Expression value = _makeConstantList(array);
-    return maybeAddTypeArguments(constant, constant.type, value);
+    if (_options.experimentNewRti) {
+      return maybeAddListTypeArgumentsNewRti(constant, constant.type, value);
+    } else {
+      return maybeAddTypeArguments(constant, constant.type, value);
+    }
   }
 
   @override
@@ -255,7 +260,12 @@
     ];
 
     if (_rtiNeed.classNeedsTypeArguments(classElement)) {
-      arguments.add(_reifiedTypeArguments(constant, sourceType.typeArguments));
+      if (_options.experimentNewRti) {
+        arguments.add(_reifiedTypeNewRti(sourceType));
+      } else {
+        arguments
+            .add(_reifiedTypeArguments(constant, sourceType.typeArguments));
+      }
     }
 
     jsAst.Expression constructor = _emitter.constructorAccess(classElement);
@@ -341,8 +351,12 @@
     }
 
     if (_rtiNeed.classNeedsTypeArguments(classElement)) {
-      arguments
-          .add(_reifiedTypeArguments(constant, constant.type.typeArguments));
+      if (_options.experimentNewRti) {
+        arguments.add(_reifiedTypeNewRti(constant.type));
+      } else {
+        arguments
+            .add(_reifiedTypeArguments(constant, constant.type.typeArguments));
+      }
     }
 
     jsAst.Expression constructor = _emitter.constructorAccess(classElement);
@@ -413,7 +427,12 @@
       }
     });
     if (_rtiNeed.classNeedsTypeArguments(constant.type.element)) {
-      fields.add(_reifiedTypeArguments(constant, constant.type.typeArguments));
+      if (_options.experimentNewRti) {
+        fields.add(_reifiedTypeNewRti(constant.type));
+      } else {
+        fields
+            .add(_reifiedTypeArguments(constant, constant.type.typeArguments));
+      }
     }
     return new jsAst.New(constructor, fields);
   }
@@ -424,9 +443,14 @@
     ClassEntity cls =
         _commonElements.getInstantiationClass(constant.typeArguments.length);
     List<jsAst.Expression> fields = <jsAst.Expression>[
-      _constantReferenceGenerator(constant.function),
-      _reifiedTypeArguments(constant, constant.typeArguments)
+      _constantReferenceGenerator(constant.function)
     ];
+    if (_options.experimentNewRti) {
+      fields
+          .add(_reifiedTypeNewRti(InterfaceType(cls, constant.typeArguments)));
+    } else {
+      fields.add(_reifiedTypeArguments(constant, constant.typeArguments));
+    }
     jsAst.Expression constructor = _emitter.constructorAccess(cls);
     return new jsAst.New(constructor, fields);
   }
@@ -447,6 +471,20 @@
     return value;
   }
 
+  jsAst.Expression maybeAddListTypeArgumentsNewRti(
+      ConstantValue constant, InterfaceType type, jsAst.Expression value) {
+    // List<T> --> JSArray<T>
+    if (type.element != _commonElements.jsArrayClass) {
+      type = InterfaceType(_commonElements.jsArrayClass, type.typeArguments);
+    }
+    if (_rtiNeed.classNeedsTypeArguments(type.element)) {
+      return new jsAst.Call(
+          getHelperProperty(_commonElements.setRuntimeTypeInfo),
+          [value, _reifiedTypeNewRti(type)]);
+    }
+    return value;
+  }
+
   jsAst.Expression _reifiedTypeArguments(
       ConstantValue constant, List<DartType> typeArguments) {
     jsAst.Expression unexpected(TypeVariableType _variable) {
@@ -465,6 +503,14 @@
     return new jsAst.ArrayInitializer(arguments);
   }
 
+  jsAst.Expression _reifiedTypeNewRti(DartType type) {
+    assert(_options.experimentNewRti);
+    assert(!type.containsTypeVariables);
+    jsAst.Expression recipe = _rtiRecipeEncoder.encodeGroundRecipe(
+        _emitter, TypeExpressionRecipe(type));
+    return js(r'#(#)', [getHelperProperty(_commonElements.findType), recipe]);
+  }
+
   @override
   jsAst.Expression visitDeferredGlobal(DeferredGlobalConstantValue constant,
       [_]) {
diff --git a/pkg/compiler/lib/src/js_backend/enqueuer.dart b/pkg/compiler/lib/src/js_backend/enqueuer.dart
index ba98487..4e2c957 100644
--- a/pkg/compiler/lib/src/js_backend/enqueuer.dart
+++ b/pkg/compiler/lib/src/js_backend/enqueuer.dart
@@ -13,7 +13,7 @@
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../enqueue.dart';
-import '../options.dart';
+import '../js_backend/annotations.dart';
 import '../universe/codegen_world_builder.dart';
 import '../universe/member_usage.dart';
 import '../universe/use.dart'
@@ -43,7 +43,7 @@
   final CompilerTask task;
   @override
   final EnqueuerListener listener;
-  final CompilerOptions _options;
+  final AnnotationsData _annotationsData;
 
   WorldImpactVisitor _impactVisitor;
 
@@ -59,8 +59,8 @@
   static const ImpactUseCase IMPACT_USE =
       const ImpactUseCase('CodegenEnqueuer');
 
-  CodegenEnqueuer(this.task, this._options, this._worldBuilder,
-      this._workItemBuilder, this.listener)
+  CodegenEnqueuer(this.task, this._worldBuilder, this._workItemBuilder,
+      this.listener, this._annotationsData)
       : this.name = 'codegen enqueuer' {
     _impactVisitor = new EnqueuerImplImpactVisitor(this);
   }
@@ -166,13 +166,13 @@
   }
 
   @override
-  void processStaticUse(StaticUse staticUse) {
+  void processStaticUse(MemberEntity member, StaticUse staticUse) {
     task.measureSubtask('codegen.staticUse', () {
       _worldBuilder.registerStaticUse(staticUse, _applyMemberUse);
       switch (staticUse.kind) {
         case StaticUseKind.CONSTRUCTOR_INVOKE:
         case StaticUseKind.CONST_CONSTRUCTOR_INVOKE:
-          processTypeUse(new TypeUse.instantiation(staticUse.type));
+          processTypeUse(member, new TypeUse.instantiation(staticUse.type));
           break;
         case StaticUseKind.INLINING:
           // TODO(johnniwinther): Should this be tracked with _MemberUsage ?
@@ -185,7 +185,7 @@
   }
 
   @override
-  void processTypeUse(TypeUse typeUse) {
+  void processTypeUse(MemberEntity member, TypeUse typeUse) {
     DartType type = typeUse.type;
     switch (typeUse.kind) {
       case TypeUseKind.INSTANTIATION:
@@ -199,17 +199,17 @@
         _registerIsCheck(type);
         break;
       case TypeUseKind.AS_CAST:
-        if (!_options.omitAsCasts) {
+        if (_annotationsData.getExplicitCastCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
       case TypeUseKind.IMPLICIT_CAST:
-        if (_options.implicitDowncastCheckPolicy.isEmitted) {
+        if (_annotationsData.getImplicitDowncastCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
       case TypeUseKind.PARAMETER_CHECK:
-        if (_options.parameterCheckPolicy.isEmitted) {
+        if (_annotationsData.getParameterCheckPolicy(member).isEmitted) {
           _registerIsCheck(type);
         }
         break;
diff --git a/pkg/compiler/lib/src/js_backend/impact_transformer.dart b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
index 2084a1d..c684fb7 100644
--- a/pkg/compiler/lib/src/js_backend/impact_transformer.dart
+++ b/pkg/compiler/lib/src/js_backend/impact_transformer.dart
@@ -19,13 +19,13 @@
 import '../js_emitter/native_emitter.dart';
 import '../native/enqueue.dart';
 import '../native/behavior.dart';
-import '../options.dart';
 import '../universe/feature.dart';
 import '../universe/selector.dart';
 import '../universe/use.dart';
 import '../universe/world_impact.dart' show TransformedWorldImpact, WorldImpact;
 import '../util/util.dart';
 import '../world.dart';
+import 'annotations.dart';
 import 'backend_impact.dart';
 import 'backend_usage.dart';
 import 'custom_elements_analysis.dart';
@@ -33,9 +33,9 @@
 import 'namer.dart';
 import 'native_data.dart';
 import 'runtime_types.dart';
+import 'runtime_types_resolution.dart';
 
 class JavaScriptImpactTransformer extends ImpactTransformer {
-  final CompilerOptions _options;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
   final BackendImpacts _impacts;
@@ -45,9 +45,9 @@
   final CustomElementsResolutionAnalysis _customElementsResolutionAnalysis;
   final RuntimeTypesNeedBuilder _rtiNeedBuilder;
   final ClassHierarchyBuilder _classHierarchyBuilder;
+  final AnnotationsData _annotationsData;
 
   JavaScriptImpactTransformer(
-      this._options,
       this._elementEnvironment,
       this._commonElements,
       this._impacts,
@@ -56,7 +56,8 @@
       this._backendUsageBuilder,
       this._customElementsResolutionAnalysis,
       this._rtiNeedBuilder,
-      this._classHierarchyBuilder);
+      this._classHierarchyBuilder,
+      this._annotationsData);
 
   @override
   WorldImpact transformResolutionImpact(ResolutionImpact worldImpact) {
@@ -158,18 +159,24 @@
           onIsCheck(type, transformed);
           break;
         case TypeUseKind.AS_CAST:
-          if (!_options.omitAsCasts) {
+          if (_annotationsData
+              .getExplicitCastCheckPolicy(worldImpact.member)
+              .isEmitted) {
             onIsCheck(type, transformed);
             hasAsCast = true;
           }
           break;
         case TypeUseKind.IMPLICIT_CAST:
-          if (_options.implicitDowncastCheckPolicy.isEmitted) {
+          if (_annotationsData
+              .getImplicitDowncastCheckPolicy(worldImpact.member)
+              .isEmitted) {
             onIsCheck(type, transformed);
           }
           break;
         case TypeUseKind.PARAMETER_CHECK:
-          if (_options.parameterCheckPolicy.isEmitted) {
+          if (_annotationsData
+              .getParameterCheckPolicy(worldImpact.member)
+              .isEmitted) {
             onIsCheck(type, transformed);
           }
           break;
@@ -343,7 +350,6 @@
 }
 
 class CodegenImpactTransformer {
-  final CompilerOptions _options;
   final JClosedWorld _closedWorld;
   final ElementEnvironment _elementEnvironment;
   final CommonElements _commonElements;
@@ -358,7 +364,6 @@
   final NativeEmitter _nativeEmitter;
 
   CodegenImpactTransformer(
-      this._options,
       this._closedWorld,
       this._elementEnvironment,
       this._commonElements,
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index c4b1477..b944875 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -515,6 +515,7 @@
   final Map<String, jsAst.Name> userInstanceOperators = HashMap();
   final Map<jsAst.Name, jsAst.Name> userGetters = HashMap();
   final Map<jsAst.Name, jsAst.Name> userSetters = HashMap();
+  final Map<TypeVariableEntity, jsAst.Name> _typeVariableNames = {};
 
   Map<String, String> createMinifiedInstanceNameMap() {
     var map = <String, String>{};
@@ -828,6 +829,28 @@
       _disambiguateGlobalType(element);
 
   @override
+  jsAst.Name globalNameForInterfaceTypeVariable(TypeVariableEntity element) {
+    return _typeVariableNames[element] ??=
+        _globalNameForInterfaceTypeVariable(element);
+  }
+
+  jsAst.Name _globalNameForInterfaceTypeVariable(TypeVariableEntity element) {
+    // Construct a name from the class name and type variable,
+    // e.g. "ListMixin.E". The class name is unique which ensures the type
+    // variable name is unique.
+    //
+    // TODO(sra): Better minified naming. Type variable names are used in type
+    // recipes and must contain a period ('.'). They can be frequency-assigned
+    // independently of the class name, e.g. '.a', '.2', 'a.', etc.
+    String name = element.name;
+    if (name.length > 1) name = '${element.index}'; // Avoid long names (rare).
+    return CompoundName([
+      globalPropertyNameForClass(element.typeDeclaration),
+      StringBackedName('.$name')
+    ]);
+  }
+
+  @override
   jsAst.Name instanceFieldPropertyName(FieldEntity element) {
     ClassEntity enclosingClass = element.enclosingClass;
 
@@ -1565,6 +1588,8 @@
       return r'$shl';
     } else if (name == '>>') {
       return r'$shr';
+    } else if (name == '>>>') {
+      return r'$shru';
     } else if (name == '>=') {
       return r'$ge';
     } else if (name == '>') {
@@ -2314,6 +2339,14 @@
   /// object on which the returned property name should be used.
   jsAst.Name globalPropertyNameForType(Entity element);
 
+  /// Returns a name, the string of which is a globally unique key distinct from
+  /// other global property names.
+  ///
+  /// The name is not necessarily a valid JavaScript identifier, so it needs to
+  /// be quoted.
+  jsAst.Name globalNameForInterfaceTypeVariable(
+      TypeVariableEntity typeVariable);
+
   /// Returns the name for the instance field that holds runtime type arguments
   /// on generic classes.
   jsAst.Name get rtiFieldJsName;
@@ -2569,6 +2602,18 @@
         return runtimeTypeName(_commonElements.functionClass);
       case JsGetName.FUTURE_CLASS_TYPE_NAME:
         return runtimeTypeName(_commonElements.futureClass);
+      case JsGetName.BOOL_RECIPE:
+        return runtimeTypeName(_commonElements.boolClass);
+      case JsGetName.DOUBLE_RECIPE:
+        return runtimeTypeName(_commonElements.doubleClass);
+      case JsGetName.INT_RECIPE:
+        return runtimeTypeName(_commonElements.intClass);
+      case JsGetName.NUM_RECIPE:
+        return runtimeTypeName(_commonElements.numClass);
+      case JsGetName.STRING_RECIPE:
+        return runtimeTypeName(_commonElements.stringClass);
+      case JsGetName.RTI_FIELD_IS:
+        return instanceFieldPropertyName(_commonElements.rtiIsField);
       default:
         throw failedAt(spannable, 'Error: Namer has no name for "$name".');
     }
@@ -2741,6 +2786,15 @@
   }
 
   @override
+  jsAst.Name globalNameForInterfaceTypeVariable(TypeVariableEntity element) {
+    jsAst.Name name = new ModularName(
+        ModularNameKind.globalNameForInterfaceTypeVariable,
+        data: element);
+    _registry.registerModularName(name);
+    return name;
+  }
+
+  @override
   jsAst.Name nameForGetInterceptor(Set<ClassEntity> classes) {
     jsAst.Name name =
         new ModularName(ModularNameKind.nameForGetInterceptor, set: classes);
diff --git a/pkg/compiler/lib/src/js_backend/resolution_listener.dart b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
index 04381e4..a6be0ee 100644
--- a/pkg/compiler/lib/src/js_backend/resolution_listener.dart
+++ b/pkg/compiler/lib/src/js_backend/resolution_listener.dart
@@ -436,6 +436,11 @@
     if (_options.experimentCallInstrumentation) {
       _registerBackendImpact(impactBuilder, _impacts.traceHelper);
     }
+
+    if (_options.experimentNewRti) {
+      _registerBackendImpact(impactBuilder, _impacts.rtiAddRules);
+    }
+
     _registerBackendImpact(impactBuilder, _impacts.assertUnreachable);
     _registerCheckedModeHelpers(impactBuilder);
     return impactBuilder;
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index fa7a7d1..47a74c6 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -13,194 +13,27 @@
         JCommonElements,
         JElementEnvironment;
 import '../elements/entities.dart';
-import '../elements/names.dart';
 import '../elements/types.dart';
-import '../ir/runtime_type_analysis.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_emitter/js_emitter.dart' show ModularEmitter;
 import '../options.dart';
-import '../serialization/serialization.dart';
-import '../universe/class_hierarchy.dart';
-import '../universe/class_set.dart';
 import '../universe/codegen_world_builder.dart';
 import '../universe/feature.dart';
-import '../universe/selector.dart';
 import '../world.dart';
-import 'backend_usage.dart';
 import 'namer.dart';
 import 'native_data.dart';
-
-/// For each class, stores the possible class subtype tests that could succeed.
-abstract class TypeChecks {
-  /// Get the set of checks required for class [element].
-  ClassChecks operator [](ClassEntity element);
-
-  /// Get the iterable for all classes that need type checks.
-  Iterable<ClassEntity> get classes;
-}
+import 'runtime_types_codegen.dart';
+import 'runtime_types_resolution.dart';
 
 typedef jsAst.Expression OnVariableCallback(TypeVariableType variable);
 typedef bool ShouldEncodeTypedefCallback(TypedefType variable);
 
-/// Interface for the classes and methods that need runtime types.
-abstract class RuntimeTypesNeed {
-  /// Deserializes a [RuntimeTypesNeed] object from [source].
-  factory RuntimeTypesNeed.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
-    bool isTrivial = source.readBool();
-    if (isTrivial) {
-      return const TrivialRuntimeTypesNeed();
-    }
-    return new RuntimeTypesNeedImpl.readFromDataSource(
-        source, elementEnvironment);
-  }
-
-  /// Serializes this [RuntimeTypesNeed] to [sink].
-  void writeToDataSink(DataSink sink);
-
-  /// Returns `true` if [cls] needs type arguments at runtime type.
-  ///
-  /// This is for instance the case for generic classes used in a type test:
-  ///
-  ///   class C<T> {}
-  ///   main() {
-  ///     new C<int>() is C<int>;
-  ///     new C<String>() is C<String>;
-  ///   }
-  ///
-  bool classNeedsTypeArguments(ClassEntity cls);
-
-  /// Returns `true` if [method] needs type arguments at runtime type.
-  ///
-  /// This is for instance the case for generic methods that use type tests:
-  ///
-  ///   method<T>(T t) => t is T;
-  ///   main() {
-  ///     method<int>(0);
-  ///     method<String>('');
-  ///   }
-  ///
-  bool methodNeedsTypeArguments(FunctionEntity method);
-
-  /// Returns `true` if a signature is needed for [method].
-  ///
-  /// A signature is a runtime method type descriptor function that creates
-  /// a runtime representation of the type of the method.
-  ///
-  /// This is for instance needed for instance methods of generic classes that
-  /// are torn off and whose type therefore potentially is used in a type test:
-  ///
-  ///     class C<T> {
-  ///       method(T t) {}
-  ///     }
-  ///     main() {
-  ///       new C<int>().method is void Function(int);
-  ///       new C<String>().method is void Function(String);
-  ///     }
-  ///
-  /// Since type of the method depends on the type argument of its enclosing
-  /// class, the type of the method is a JavaScript function like:
-  ///
-  ///    signature: function (T) {
-  ///      return {'func': true, params: [T]};
-  ///    }
-  ///
-  bool methodNeedsSignature(FunctionEntity method);
-
-  /// Returns `true` if a dynamic call of [selector] needs to pass type
-  /// arguments.
-  bool selectorNeedsTypeArguments(Selector selector);
-
-  /// Returns `true` if a generic instantiation on an expression of type
-  /// [functionType] with the given [typeArgumentCount] needs to pass type
-  /// arguments.
-  // TODO(johnniwinther): Use [functionType].
-  bool instantiationNeedsTypeArguments(
-      DartType functionType, int typeArgumentCount);
-}
-
-class TrivialRuntimeTypesNeed implements RuntimeTypesNeed {
-  const TrivialRuntimeTypesNeed();
-
-  @override
-  void writeToDataSink(DataSink sink) {
-    sink.writeBool(true); // Is trivial.
-  }
-
-  @override
-  bool classNeedsTypeArguments(ClassEntity cls) => true;
-
-  @override
-  bool methodNeedsSignature(FunctionEntity method) => true;
-
-  @override
-  bool methodNeedsTypeArguments(FunctionEntity method) =>
-      // TODO(johnniwinther): Align handling of type arguments passed to factory
-      // constructors with type arguments passed the regular generic methods.
-      !(method is ConstructorEntity && method.isFactoryConstructor);
-
-  @override
-  bool selectorNeedsTypeArguments(Selector selector) => true;
-
-  @override
-  bool instantiationNeedsTypeArguments(
-      DartType functionType, int typeArgumentCount) {
-    return true;
-  }
-}
-
-/// Interface for computing classes and methods that need runtime types.
-abstract class RuntimeTypesNeedBuilder {
-  /// Registers that [cls] uses one of its type variables as a literal.
-  void registerClassUsingTypeVariableLiteral(ClassEntity cls);
-
-  /// Registers that [method] uses one of its type variables as a literal.
-  void registerMethodUsingTypeVariableLiteral(FunctionEntity method);
-
-  /// Registers that [localFunction] uses one of its type variables as a
-  /// literal.
-  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction);
-
-  /// Registers that a generic [instantiation] is used.
-  void registerGenericInstantiation(GenericInstantiation instantiation);
-
-  /// Computes the [RuntimeTypesNeed] for the data registered with this builder.
-  RuntimeTypesNeed computeRuntimeTypesNeed(
-      KClosedWorld closedWorld, CompilerOptions options);
-}
-
-class TrivialRuntimeTypesNeedBuilder implements RuntimeTypesNeedBuilder {
-  const TrivialRuntimeTypesNeedBuilder();
-
-  @override
-  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {}
-
-  @override
-  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {}
-
-  @override
-  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {}
-
-  @override
-  void registerGenericInstantiation(GenericInstantiation instantiation) {}
-
-  @override
-  RuntimeTypesNeed computeRuntimeTypesNeed(
-      KClosedWorld closedWorld, CompilerOptions options) {
-    return const TrivialRuntimeTypesNeed();
-  }
-}
-
 /// Interface for the needed runtime type checks.
 abstract class RuntimeTypesChecks {
   /// Returns the required runtime type checks.
   TypeChecks get requiredChecks;
 
-  /// Return all classes that are referenced in the type of the function, i.e.,
-  /// in the return type or the argument types.
-  Iterable<ClassEntity> getReferencedClasses(FunctionType type);
-
   /// Return all classes needed for runtime type information.
   Iterable<ClassEntity> get requiredClasses;
 }
@@ -217,9 +50,6 @@
 
   @override
   Iterable<ClassEntity> get requiredClasses => _allClasses;
-
-  @override
-  Iterable<ClassEntity> getReferencedClasses(FunctionType type) => _allClasses;
 }
 
 /// Interface for computing the needed runtime type checks.
@@ -291,21 +121,6 @@
   }
 }
 
-class ClassCollector extends ArgumentCollector {
-  final ElementEnvironment _elementEnvironment;
-
-  ClassCollector(this._elementEnvironment);
-
-  @override
-  void addClass(ClassEntity cls) {
-    if (classes.add(cls)) {
-      _elementEnvironment.forEachSupertype(cls, (InterfaceType type) {
-        collect(type, isTypeArgument: true);
-      });
-    }
-  }
-}
-
 abstract class RuntimeTypesSubstitutionsMixin
     implements RuntimeTypesSubstitutions {
   JClosedWorld get _closedWorld;
@@ -639,23 +454,6 @@
   TrivialRuntimeTypesSubstitutions(this._closedWorld);
 }
 
-/// Interface for computing substitutions need for runtime type checks.
-abstract class RuntimeTypesSubstitutions {
-  bool isTrivialSubstitution(ClassEntity cls, ClassEntity check);
-
-  Substitution getSubstitution(ClassEntity cls, ClassEntity other);
-
-  Set<ClassEntity> getClassesUsedInSubstitutions(TypeChecks checks);
-
-  static bool hasTypeArguments(DartType type) {
-    if (type is InterfaceType) {
-      InterfaceType interfaceType = type;
-      return !interfaceType.treatAsRaw;
-    }
-    return false;
-  }
-}
-
 abstract class RuntimeTypesEncoder {
   jsAst.Expression getSignatureEncoding(ModularNamer namer,
       ModularEmitter emitter, DartType type, jsAst.Expression this_);
@@ -692,1196 +490,6 @@
   RuntimeTypeTags get rtiTags;
 }
 
-/// Common functionality for [_RuntimeTypesNeedBuilder] and [_RuntimeTypes].
-abstract class _RuntimeTypesBase {
-  final DartTypes _types;
-
-  _RuntimeTypesBase(this._types);
-
-  /// Compute type arguments of classes that use one of their type variables in
-  /// is-checks and add the is-checks that they imply.
-  ///
-  /// This function must be called after all is-checks have been registered.
-  ///
-  /// TODO(karlklose): move these computations into a function producing an
-  /// immutable datastructure.
-  void registerImplicitChecks(
-      Set<InterfaceType> instantiatedTypes,
-      Iterable<ClassEntity> classesUsingChecks,
-      Set<DartType> implicitIsChecks) {
-    // If there are no classes that use their variables in checks, there is
-    // nothing to do.
-    if (classesUsingChecks.isEmpty) return;
-    // Find all instantiated types that are a subtype of a class that uses
-    // one of its type arguments in an is-check and add the arguments to the
-    // set of is-checks.
-    for (InterfaceType type in instantiatedTypes) {
-      for (ClassEntity cls in classesUsingChecks) {
-        // We need the type as instance of its superclass anyway, so we just
-        // try to compute the substitution; if the result is [:null:], the
-        // classes are not related.
-        InterfaceType instance = _types.asInstanceOf(type, cls);
-        if (instance != null) {
-          for (DartType argument in instance.typeArguments) {
-            implicitIsChecks.add(argument.unaliased);
-          }
-        }
-      }
-    }
-  }
-}
-
-class RuntimeTypesNeedImpl implements RuntimeTypesNeed {
-  /// Tag used for identifying serialized [RuntimeTypesNeed] objects in a
-  /// debugging data stream.
-  static const String tag = 'runtime-types-need';
-
-  final ElementEnvironment _elementEnvironment;
-  final Set<ClassEntity> classesNeedingTypeArguments;
-  final Set<FunctionEntity> methodsNeedingSignature;
-  final Set<FunctionEntity> methodsNeedingTypeArguments;
-  final Set<Local> localFunctionsNeedingSignature;
-  final Set<Local> localFunctionsNeedingTypeArguments;
-  final Set<Selector> selectorsNeedingTypeArguments;
-  final Set<int> instantiationsNeedingTypeArguments;
-
-  RuntimeTypesNeedImpl(
-      this._elementEnvironment,
-      this.classesNeedingTypeArguments,
-      this.methodsNeedingSignature,
-      this.methodsNeedingTypeArguments,
-      this.localFunctionsNeedingSignature,
-      this.localFunctionsNeedingTypeArguments,
-      this.selectorsNeedingTypeArguments,
-      this.instantiationsNeedingTypeArguments);
-
-  factory RuntimeTypesNeedImpl.readFromDataSource(
-      DataSource source, ElementEnvironment elementEnvironment) {
-    source.begin(tag);
-    Set<ClassEntity> classesNeedingTypeArguments =
-        source.readClasses<ClassEntity>().toSet();
-    Set<FunctionEntity> methodsNeedingSignature =
-        source.readMembers<FunctionEntity>().toSet();
-    Set<FunctionEntity> methodsNeedingTypeArguments =
-        source.readMembers<FunctionEntity>().toSet();
-    Set<Selector> selectorsNeedingTypeArguments =
-        source.readList(() => new Selector.readFromDataSource(source)).toSet();
-    Set<int> instantiationsNeedingTypeArguments =
-        source.readList(source.readInt).toSet();
-    source.end(tag);
-    return new RuntimeTypesNeedImpl(
-        elementEnvironment,
-        classesNeedingTypeArguments,
-        methodsNeedingSignature,
-        methodsNeedingTypeArguments,
-        null,
-        null,
-        selectorsNeedingTypeArguments,
-        instantiationsNeedingTypeArguments);
-  }
-
-  @override
-  void writeToDataSink(DataSink sink) {
-    sink.writeBool(false); // Is _not_ trivial.
-    sink.begin(tag);
-    sink.writeClasses(classesNeedingTypeArguments);
-    sink.writeMembers(methodsNeedingSignature);
-    sink.writeMembers(methodsNeedingTypeArguments);
-    assert(localFunctionsNeedingSignature == null);
-    assert(localFunctionsNeedingTypeArguments == null);
-    sink.writeList(selectorsNeedingTypeArguments,
-        (Selector selector) => selector.writeToDataSink(sink));
-    sink.writeList(instantiationsNeedingTypeArguments, sink.writeInt);
-    sink.end(tag);
-  }
-
-  bool checkClass(covariant ClassEntity cls) => true;
-
-  @override
-  bool classNeedsTypeArguments(ClassEntity cls) {
-    assert(checkClass(cls));
-    if (!_elementEnvironment.isGenericClass(cls)) return false;
-    return classesNeedingTypeArguments.contains(cls);
-  }
-
-  @override
-  bool methodNeedsSignature(FunctionEntity function) {
-    return methodsNeedingSignature.contains(function);
-  }
-
-  @override
-  bool methodNeedsTypeArguments(FunctionEntity function) {
-    return methodsNeedingTypeArguments.contains(function);
-  }
-
-  @override
-  bool selectorNeedsTypeArguments(Selector selector) {
-    if (selector.callStructure.typeArgumentCount == 0) return false;
-    return selectorsNeedingTypeArguments.contains(selector);
-  }
-
-  @override
-  bool instantiationNeedsTypeArguments(
-      DartType functionType, int typeArgumentCount) {
-    return instantiationsNeedingTypeArguments.contains(typeArgumentCount);
-  }
-}
-
-class TypeVariableTests {
-  List<RtiNode> _nodes = <RtiNode>[];
-  Map<ClassEntity, ClassNode> _classes = <ClassEntity, ClassNode>{};
-  Map<Entity, MethodNode> _methods = <Entity, MethodNode>{};
-  Map<Selector, Set<Entity>> _appliedSelectorMap;
-  Map<GenericInstantiation, Set<Entity>> _instantiationMap;
-
-  /// All explicit is-tests.
-  final Set<DartType> explicitIsChecks;
-
-  /// All implicit is-tests.
-  final Set<DartType> implicitIsChecks = new Set<DartType>();
-
-  TypeVariableTests(
-      ElementEnvironment elementEnvironment,
-      CommonElements commonElements,
-      DartTypes types,
-      BuiltWorld world,
-      Set<GenericInstantiation> genericInstantiations,
-      {bool forRtiNeeds: true})
-      : explicitIsChecks = new Set<DartType>.from(world.isChecks) {
-    _setupDependencies(
-        elementEnvironment, commonElements, world, genericInstantiations,
-        forRtiNeeds: forRtiNeeds);
-    _propagateTests(commonElements, elementEnvironment, world);
-    if (forRtiNeeds) {
-      _propagateLiterals(elementEnvironment, world);
-    }
-    _collectResults(commonElements, elementEnvironment, types, world,
-        forRtiNeeds: forRtiNeeds);
-  }
-
-  /// Classes whose type variables are explicitly or implicitly used in
-  /// is-tests.
-  ///
-  /// For instance `A` and `B` in:
-  ///
-  ///     class A<T> {
-  ///       m(o) => o is T;
-  ///     }
-  ///     class B<S> {
-  ///       m(o) => new A<S>().m(o);
-  ///     }
-  ///     main() => new B<int>().m(0);
-  ///
-  Iterable<ClassEntity> get classTestsForTesting =>
-      _classes.values.where((n) => n.hasTest).map((n) => n.cls).toSet();
-
-  /// Classes that explicitly use their type variables in is-tests.
-  ///
-  /// For instance `A` in:
-  ///
-  ///     class A<T> {
-  ///       m(o) => o is T;
-  ///     }
-  ///     main() => new A<int>().m(0);
-  ///
-  Iterable<ClassEntity> get directClassTestsForTesting =>
-      _classes.values.where((n) => n.hasDirectTest).map((n) => n.cls).toSet();
-
-  /// Methods that explicitly or implicitly use their type variables in
-  /// is-tests.
-  ///
-  /// For instance `m1` and `m2`in:
-  ///
-  ///     m1<T>(o) => o is T;
-  ///     m2<S>(o) => m1<S>(o);
-  ///     main() => m2<int>(0);
-  ///
-  Iterable<Entity> get methodTestsForTesting =>
-      _methods.values.where((n) => n.hasTest).map((n) => n.function).toSet();
-
-  /// Methods that explicitly use their type variables in is-tests.
-  ///
-  /// For instance `m` in:
-  ///
-  ///     m<T>(o) => o is T;
-  ///     main() => m<int>(0);
-  ///
-  Iterable<Entity> get directMethodTestsForTesting => _methods.values
-      .where((n) => n.hasDirectTest)
-      .map((n) => n.function)
-      .toSet();
-
-  /// The entities that need type arguments at runtime if the 'key entity' needs
-  /// type arguments.
-  ///
-  /// For instance:
-  ///
-  ///     class A<T> {
-  ///       m() => new B<T>();
-  ///     }
-  ///     class B<T> {}
-  ///     main() => new A<String>().m() is B<int>;
-  ///
-  /// Here `A` needs type arguments at runtime because the key entity `B` needs
-  /// it in order to generate the check against `B<int>`.
-  ///
-  /// This can also involve generic methods:
-  ///
-  ///    class A<T> {}
-  ///    method<T>() => new A<T>();
-  ///    main() => method<int>() is A<int>();
-  ///
-  /// Here `method` need type arguments at runtime because the key entity `A`
-  /// needs it in order to generate the check against `A<int>`.
-  ///
-  Iterable<Entity> getTypeArgumentDependencies(Entity entity) {
-    Iterable<RtiNode> dependencies;
-    if (entity is ClassEntity) {
-      dependencies = _classes[entity]?.dependencies;
-    } else {
-      dependencies = _methods[entity]?.dependencies;
-    }
-    if (dependencies == null) return const <Entity>[];
-    return dependencies.map((n) => n.entity).toSet();
-  }
-
-  /// Calls [f] for each selector that applies to generic [targets].
-  void forEachAppliedSelector(void f(Selector selector, Set<Entity> targets)) {
-    _appliedSelectorMap.forEach(f);
-  }
-
-  /// Calls [f] for each generic instantiation that applies to generic
-  /// closurized [targets].
-  void forEachGenericInstantiation(
-      void f(GenericInstantiation instantiation, Set<Entity> targets)) {
-    _instantiationMap?.forEach(f);
-  }
-
-  ClassNode _getClassNode(ClassEntity cls) {
-    return _classes.putIfAbsent(cls, () {
-      ClassNode node = new ClassNode(cls);
-      _nodes.add(node);
-      return node;
-    });
-  }
-
-  MethodNode _getMethodNode(ElementEnvironment elementEnvironment,
-      BuiltWorld world, Entity function) {
-    return _methods.putIfAbsent(function, () {
-      MethodNode node;
-      if (function is FunctionEntity) {
-        Name instanceName;
-        bool isCallTarget;
-        bool isNoSuchMethod;
-        if (function.isInstanceMember) {
-          isCallTarget = world.closurizedMembers.contains(function);
-          instanceName = function.memberName;
-          isNoSuchMethod = instanceName.text == Identifiers.noSuchMethod_;
-        } else {
-          isCallTarget = world.closurizedStatics.contains(function);
-          isNoSuchMethod = false;
-        }
-        node = new MethodNode(function, function.parameterStructure,
-            isCallTarget: isCallTarget,
-            instanceName: instanceName,
-            isNoSuchMethod: isNoSuchMethod);
-      } else {
-        ParameterStructure parameterStructure = new ParameterStructure.fromType(
-            elementEnvironment.getLocalFunctionType(function));
-        node = new MethodNode(function, parameterStructure, isCallTarget: true);
-      }
-      _nodes.add(node);
-      return node;
-    });
-  }
-
-  void _setupDependencies(
-      ElementEnvironment elementEnvironment,
-      CommonElements commonElements,
-      BuiltWorld world,
-      Set<GenericInstantiation> genericInstantiations,
-      {bool forRtiNeeds: true}) {
-    /// Register that if `node.entity` needs type arguments then so do entities
-    /// whose type variables occur in [type].
-    ///
-    /// For instance if `A` needs type arguments then so does `B` in:
-    ///
-    ///   class A<T> {}
-    ///   class B<T> { m() => new A<T>(); }
-    ///
-    void registerDependencies(RtiNode node, DartType type) {
-      type.forEachTypeVariable((TypeVariableType typeVariable) {
-        Entity typeDeclaration = typeVariable.element.typeDeclaration;
-        if (typeDeclaration is ClassEntity) {
-          node.addDependency(_getClassNode(typeDeclaration));
-        } else {
-          node.addDependency(
-              _getMethodNode(elementEnvironment, world, typeDeclaration));
-        }
-      });
-    }
-
-    // Add the rti dependencies that are implicit in the way the backend
-    // generates code: when we create a new [List], we actually create a
-    // [JSArray] in the backend and we need to add type arguments to the calls
-    // of the list constructor whenever we determine that [JSArray] needs type
-    // arguments.
-    //
-    // This is need for instance for:
-    //
-    //    var list = <int>[];
-    //    var set = list.toSet();
-    //    set is Set<String>;
-    //
-    // It also occurs for [Map] vs [JsLinkedHashMap] in:
-    //
-    //    var map = <int, double>{};
-    //    var set = map.keys.toSet();
-    //    set is Set<String>;
-    //
-    // TODO(johnniwinther): Make this dependency visible from code, possibly
-    // using generic methods.
-    if (commonElements.jsArrayClass != null) {
-      _getClassNode(commonElements.jsArrayClass)
-          .addDependency(_getClassNode(commonElements.listClass));
-    }
-    if (commonElements.setLiteralClass != null) {
-      _getClassNode(commonElements.setLiteralClass)
-          .addDependency(_getClassNode(commonElements.setClass));
-    }
-    if (commonElements.mapLiteralClass != null) {
-      _getClassNode(commonElements.mapLiteralClass)
-          .addDependency(_getClassNode(commonElements.mapClass));
-    }
-
-    void processCheckedType(DartType type) {
-      if (type is InterfaceType) {
-        // Register that if [cls] needs type arguments then so do the entities
-        // that declare type variables occurring in [type].
-        ClassEntity cls = type.element;
-        registerDependencies(_getClassNode(cls), type);
-      }
-      if (type is FutureOrType) {
-        // [type] is `FutureOr<X>`.
-
-        // For the implied `is Future<X>` test, register that if `Future` needs
-        // type arguments then so do the entities that declare type variables
-        // occurring in `type.typeArgument`.
-        registerDependencies(
-            _getClassNode(commonElements.futureClass), type.typeArgument);
-        // Process `type.typeArgument` for the implied `is X` test.
-        processCheckedType(type.typeArgument);
-      }
-    }
-
-    world.isChecks.forEach(processCheckedType);
-
-    world.instantiatedTypes.forEach((InterfaceType type) {
-      // Register that if [cls] needs type arguments then so do the entities
-      // that declare type variables occurring in [type].
-      ClassEntity cls = type.element;
-      registerDependencies(_getClassNode(cls), type);
-    });
-
-    world.forEachStaticTypeArgument(
-        (Entity entity, Iterable<DartType> typeArguments) {
-      for (DartType type in typeArguments) {
-        // Register that if [entity] needs type arguments then so do the
-        // entities that declare type variables occurring in [type].
-        registerDependencies(
-            _getMethodNode(elementEnvironment, world, entity), type);
-      }
-    });
-
-    world.forEachDynamicTypeArgument(
-        (Selector selector, Iterable<DartType> typeArguments) {
-      void processEntity(Entity entity) {
-        MethodNode node = _getMethodNode(elementEnvironment, world, entity);
-        if (node.selectorApplies(selector)) {
-          for (DartType type in typeArguments) {
-            // Register that if `node.entity` needs type arguments then so do
-            // the entities that declare type variables occurring in [type].
-            registerDependencies(node, type);
-          }
-        }
-      }
-
-      world.forEachGenericInstanceMethod(processEntity);
-      world.genericLocalFunctions.forEach(processEntity);
-      world.closurizedStatics.forEach(processEntity);
-      world.userNoSuchMethods.forEach(processEntity);
-    });
-
-    for (GenericInstantiation instantiation in genericInstantiations) {
-      void processEntity(Entity entity) {
-        MethodNode node = _getMethodNode(elementEnvironment, world, entity);
-        if (node.parameterStructure.typeParameters ==
-            instantiation.typeArguments.length) {
-          if (forRtiNeeds) {
-            _instantiationMap ??= <GenericInstantiation, Set<Entity>>{};
-            _instantiationMap
-                .putIfAbsent(instantiation, () => new Set<Entity>())
-                .add(entity);
-          }
-          for (DartType type in instantiation.typeArguments) {
-            // Register that if `node.entity` needs type arguments then so do
-            // the entities that declare type variables occurring in [type].
-            registerDependencies(node, type);
-          }
-        }
-      }
-
-      world.closurizedMembers.forEach(processEntity);
-      world.closurizedStatics.forEach(processEntity);
-      world.genericLocalFunctions.forEach(processEntity);
-    }
-  }
-
-  void _propagateTests(CommonElements commonElements,
-      ElementEnvironment elementEnvironment, BuiltWorld worldBuilder) {
-    void processTypeVariableType(TypeVariableType type, {bool direct: true}) {
-      TypeVariableEntity variable = type.element;
-      if (variable.typeDeclaration is ClassEntity) {
-        _getClassNode(variable.typeDeclaration).markTest(direct: direct);
-      } else {
-        _getMethodNode(
-                elementEnvironment, worldBuilder, variable.typeDeclaration)
-            .markTest(direct: direct);
-      }
-    }
-
-    void processType(DartType type, {bool direct: true}) {
-      if (type is FutureOrType) {
-        _getClassNode(commonElements.futureClass).markIndirectTest();
-        processType(type.typeArgument, direct: false);
-      } else {
-        type.forEachTypeVariable((TypeVariableType type) {
-          processTypeVariableType(type, direct: direct);
-        });
-      }
-    }
-
-    worldBuilder.isChecks.forEach(processType);
-  }
-
-  void _propagateLiterals(
-      ElementEnvironment elementEnvironment, BuiltWorld world) {
-    world.typeVariableTypeLiterals.forEach((TypeVariableType typeVariableType) {
-      TypeVariableEntity variable = typeVariableType.element;
-      if (variable.typeDeclaration is ClassEntity) {
-        _getClassNode(variable.typeDeclaration).markDirectLiteral();
-      } else {
-        _getMethodNode(elementEnvironment, world, variable.typeDeclaration)
-            .markDirectLiteral();
-      }
-    });
-  }
-
-  String dump({bool verbose: false}) {
-    StringBuffer sb = new StringBuffer();
-
-    void addNode(RtiNode node) {
-      if (node.hasUse || node.dependencies.isNotEmpty || verbose) {
-        sb.write(' $node');
-        String comma = '';
-        if (node._testState & 1 != 0) {
-          sb.write(' direct test');
-          comma = ',';
-        }
-        if (node._testState & 2 != 0) {
-          sb.write('$comma indirect test');
-          comma = ',';
-        }
-        if (node._literalState & 1 != 0) {
-          sb.write('$comma direct literal');
-          comma = ',';
-        }
-        if (node._literalState & 2 != 0) {
-          sb.write('$comma indirect literal');
-          comma = ',';
-        }
-        if (node.dependencies.isNotEmpty || verbose) {
-          sb.writeln(':');
-          node.dependencies.forEach((n) => sb.writeln('  $n'));
-        } else {
-          sb.writeln();
-        }
-      }
-    }
-
-    void addType(DartType type) {
-      sb.writeln(' $type');
-    }
-
-    sb.writeln('classes:');
-    _classes.values.forEach(addNode);
-    sb.writeln('methods:');
-    _methods.values.forEach(addNode);
-    sb.writeln('explicit is-tests:');
-    explicitIsChecks.forEach(addType);
-    sb.writeln('implicit is-tests:');
-    implicitIsChecks.forEach(addType);
-
-    return sb.toString();
-  }
-
-  void _collectResults(CommonElements commonElements,
-      ElementEnvironment elementEnvironment, DartTypes types, BuiltWorld world,
-      {bool forRtiNeeds: true}) {
-    /// Register the implicit is-test of [type].
-    ///
-    /// If [type] is of the form `FutureOr<X>`, also register the implicit
-    /// is-tests of `Future<X>` and `X`.
-    void addImplicitCheck(DartType type) {
-      if (implicitIsChecks.add(type)) {
-        if (type is FutureOrType) {
-          addImplicitCheck(commonElements.futureType(type.typeArgument));
-          addImplicitCheck(type.typeArgument);
-        }
-      }
-    }
-
-    void addImplicitChecks(Iterable<DartType> types) {
-      types.forEach(addImplicitCheck);
-    }
-
-    world.isChecks.forEach((DartType type) {
-      if (type is FutureOrType) {
-        addImplicitCheck(commonElements.futureType(type.typeArgument));
-        addImplicitCheck(type.typeArgument);
-      }
-    });
-
-    // Compute type arguments of classes that use one of their type variables in
-    // is-checks and add the is-checks that they imply.
-    _classes.forEach((ClassEntity cls, ClassNode node) {
-      if (!node.hasTest) return;
-      // Find all instantiated types that are a subtype of a class that uses
-      // one of its type arguments in an is-check and add the arguments to the
-      // set of is-checks.
-      for (InterfaceType type in world.instantiatedTypes) {
-        // We need the type as instance of its superclass anyway, so we just
-        // try to compute the substitution; if the result is [:null:], the
-        // classes are not related.
-        InterfaceType instance = types.asInstanceOf(type, cls);
-        if (instance != null) {
-          for (DartType argument in instance.typeArguments) {
-            addImplicitCheck(argument.unaliased);
-          }
-        }
-      }
-    });
-
-    world.forEachStaticTypeArgument(
-        (Entity function, Iterable<DartType> typeArguments) {
-      if (!_getMethodNode(elementEnvironment, world, function).hasTest) {
-        return;
-      }
-      addImplicitChecks(typeArguments);
-    });
-
-    if (forRtiNeeds) {
-      _appliedSelectorMap = <Selector, Set<Entity>>{};
-    }
-
-    world.forEachDynamicTypeArgument(
-        (Selector selector, Iterable<DartType> typeArguments) {
-      for (MethodNode node in _methods.values) {
-        if (node.selectorApplies(selector)) {
-          if (forRtiNeeds) {
-            _appliedSelectorMap
-                .putIfAbsent(selector, () => new Set<Entity>())
-                .add(node.entity);
-          }
-          if (node.hasTest) {
-            addImplicitChecks(typeArguments);
-          }
-        }
-      }
-    });
-  }
-}
-
-abstract class RtiNode {
-  Entity get entity;
-  Set<RtiNode> _dependencies;
-  int _testState = 0;
-  int _literalState = 0;
-
-  Iterable<RtiNode> get dependencies => _dependencies ?? const <RtiNode>[];
-
-  bool get hasDirectTest => _testState & 1 != 0;
-  bool get hasIndirectTest => _testState & 2 != 0;
-
-  bool get hasTest => _testState != 0;
-
-  bool get hasDirectLiteral => _literalState & 1 != 0;
-  bool get hasIndirectLiteral => _literalState & 2 != 0;
-
-  bool get hasLiteral => _literalState != 0;
-
-  bool get hasUse => hasTest || hasLiteral;
-
-  /// Register that if [entity] needs type arguments then so does `node.entity`.
-  bool addDependency(RtiNode node) {
-    if (entity == node.entity) {
-      // Skip trivial dependencies; if [entity] needs type arguments so does
-      // [entity]!
-      return false;
-    }
-    _dependencies ??= new Set<RtiNode>();
-    return _dependencies.add(node);
-  }
-
-  void markTest({bool direct}) {
-    setTestState(direct ? 1 : 2);
-  }
-
-  void markDirectTest() {
-    setTestState(1);
-  }
-
-  void markIndirectTest() {
-    setTestState(2);
-  }
-
-  void setTestState(int value) {
-    if (_testState != value) {
-      if (_testState == 0) {
-        _testState |= value;
-        if (_dependencies != null) {
-          for (RtiNode node in _dependencies) {
-            node.markIndirectTest();
-          }
-        }
-      } else {
-        _testState = value;
-      }
-    }
-  }
-
-  void markDirectLiteral() {
-    setLiteralState(1);
-  }
-
-  void markIndirectLiteral() {
-    setLiteralState(2);
-  }
-
-  void setLiteralState(int value) {
-    if (_literalState != value) {
-      if (_literalState == 0) {
-        _literalState |= value;
-        if (_dependencies != null) {
-          for (RtiNode node in _dependencies) {
-            node.markIndirectLiteral();
-          }
-        }
-      } else {
-        _literalState = value;
-      }
-    }
-  }
-
-  String get kind;
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write(kind);
-    sb.write(':');
-    sb.write(entity);
-    return sb.toString();
-  }
-}
-
-class ClassNode extends RtiNode {
-  final ClassEntity cls;
-
-  ClassNode(this.cls);
-
-  @override
-  Entity get entity => cls;
-
-  @override
-  String get kind => 'class';
-}
-
-class MethodNode extends RtiNode {
-  final Entity function;
-  final ParameterStructure parameterStructure;
-  final bool isCallTarget;
-  final Name instanceName;
-  final bool isNoSuchMethod;
-
-  MethodNode(this.function, this.parameterStructure,
-      {this.isCallTarget, this.instanceName, this.isNoSuchMethod: false});
-
-  @override
-  Entity get entity => function;
-
-  bool selectorApplies(Selector selector) {
-    if (isNoSuchMethod) return true;
-    return (isCallTarget && selector.isClosureCall ||
-            instanceName == selector.memberName) &&
-        selector.callStructure.signatureApplies(parameterStructure);
-  }
-
-  @override
-  String get kind => 'method';
-
-  @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('MethodNode(');
-    sb.write('function=$function');
-    sb.write(',parameterStructure=$parameterStructure');
-    sb.write(',isCallTarget=$isCallTarget');
-    sb.write(',instanceName=$instanceName');
-    sb.write(')');
-    return sb.toString();
-  }
-}
-
-class RuntimeTypesNeedBuilderImpl extends _RuntimeTypesBase
-    implements RuntimeTypesNeedBuilder {
-  final ElementEnvironment _elementEnvironment;
-
-  final Set<ClassEntity> classesUsingTypeVariableLiterals =
-      new Set<ClassEntity>();
-
-  final Set<FunctionEntity> methodsUsingTypeVariableLiterals =
-      new Set<FunctionEntity>();
-
-  final Set<Local> localFunctionsUsingTypeVariableLiterals = new Set<Local>();
-
-  Map<Selector, Set<Entity>> selectorsNeedingTypeArgumentsForTesting;
-
-  Map<GenericInstantiation, Set<Entity>>
-      instantiationsNeedingTypeArgumentsForTesting;
-
-  final Set<GenericInstantiation> _genericInstantiations =
-      new Set<GenericInstantiation>();
-
-  TypeVariableTests typeVariableTestsForTesting;
-
-  RuntimeTypesNeedBuilderImpl(this._elementEnvironment, DartTypes types)
-      : super(types);
-
-  @override
-  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {
-    classesUsingTypeVariableLiterals.add(cls);
-  }
-
-  @override
-  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {
-    methodsUsingTypeVariableLiterals.add(method);
-  }
-
-  @override
-  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {
-    localFunctionsUsingTypeVariableLiterals.add(localFunction);
-  }
-
-  @override
-  void registerGenericInstantiation(GenericInstantiation instantiation) {
-    _genericInstantiations.add(instantiation);
-  }
-
-  @override
-  RuntimeTypesNeed computeRuntimeTypesNeed(
-      KClosedWorld closedWorld, CompilerOptions options) {
-    TypeVariableTests typeVariableTests = new TypeVariableTests(
-        closedWorld.elementEnvironment,
-        closedWorld.commonElements,
-        closedWorld.dartTypes,
-        closedWorld,
-        _genericInstantiations);
-    Set<ClassEntity> classesNeedingTypeArguments = new Set<ClassEntity>();
-    Set<FunctionEntity> methodsNeedingSignature = new Set<FunctionEntity>();
-    Set<FunctionEntity> methodsNeedingTypeArguments = new Set<FunctionEntity>();
-    Set<Local> localFunctionsNeedingSignature = new Set<Local>();
-    Set<Local> localFunctionsNeedingTypeArguments = new Set<Local>();
-    Set<Entity> processedEntities = new Set<Entity>();
-
-    // Find the classes that need type arguments at runtime. Such
-    // classes are:
-    // (1) used in an is check with type variables,
-    // (2) dependencies of classes in (1),
-    // (3) subclasses of (2) and (3).
-    void potentiallyNeedTypeArguments(Entity entity) {
-      // Functions with type arguments can have dependencies of each other (if
-      // the functions call each other) so we keep a set to prevent infinitely
-      // recursing over the same entities.
-      if (processedEntities.contains(entity)) return;
-
-      processedEntities.add(entity);
-      if (entity is ClassEntity) {
-        ClassEntity cls = entity;
-        if (!_elementEnvironment.isGenericClass(cls)) return;
-        if (classesNeedingTypeArguments.contains(cls)) return;
-        classesNeedingTypeArguments.add(cls);
-
-        // TODO(ngeoffray): This should use subclasses, not subtypes.
-        closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
-            (ClassEntity sub) {
-          potentiallyNeedTypeArguments(sub);
-          return IterationStep.CONTINUE;
-        });
-      } else if (entity is FunctionEntity) {
-        methodsNeedingTypeArguments.add(entity);
-      } else {
-        localFunctionsNeedingTypeArguments.add(entity);
-      }
-
-      Iterable<Entity> dependencies =
-          typeVariableTests.getTypeArgumentDependencies(entity);
-      dependencies.forEach((Entity other) {
-        potentiallyNeedTypeArguments(other);
-      });
-    }
-
-    Set<Local> localFunctions = closedWorld.localFunctions.toSet();
-    Set<FunctionEntity> closurizedMembers =
-        closedWorld.closurizedMembersWithFreeTypeVariables.toSet();
-
-    // Check local functions and closurized members.
-    void checkClosures({DartType potentialSubtypeOf}) {
-      bool checkFunctionType(FunctionType functionType) {
-        ClassEntity contextClass = DartTypes.getClassContext(functionType);
-        if (contextClass != null &&
-            (potentialSubtypeOf == null ||
-                closedWorld.dartTypes
-                    .isPotentialSubtype(functionType, potentialSubtypeOf))) {
-          potentiallyNeedTypeArguments(contextClass);
-          return true;
-        }
-        return false;
-      }
-
-      Set<Local> localFunctionsToRemove;
-      Set<FunctionEntity> closurizedMembersToRemove;
-      for (Local function in localFunctions) {
-        FunctionType functionType =
-            _elementEnvironment.getLocalFunctionType(function);
-        if (potentialSubtypeOf == null ||
-            closedWorld.dartTypes
-                .isPotentialSubtype(functionType, potentialSubtypeOf,
-                    // TODO(johnniwinther): Use register generic instantiations
-                    // instead.
-                    assumeInstantiations: _genericInstantiations.isNotEmpty)) {
-          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
-            Entity typeDeclaration = typeVariable.element.typeDeclaration;
-            if (!processedEntities.contains(typeDeclaration)) {
-              potentiallyNeedTypeArguments(typeDeclaration);
-            }
-          });
-          localFunctionsNeedingSignature.add(function);
-          localFunctionsToRemove ??= new Set<Local>();
-          localFunctionsToRemove.add(function);
-        }
-      }
-      for (FunctionEntity function in closurizedMembers) {
-        if (checkFunctionType(_elementEnvironment.getFunctionType(function))) {
-          methodsNeedingSignature.add(function);
-          closurizedMembersToRemove ??= new Set<FunctionEntity>();
-          closurizedMembersToRemove.add(function);
-        }
-      }
-      if (localFunctionsToRemove != null) {
-        localFunctions.removeAll(localFunctionsToRemove);
-      }
-      if (closurizedMembersToRemove != null) {
-        closurizedMembers.removeAll(closurizedMembersToRemove);
-      }
-    }
-
-    // Compute the set of all classes and methods that need runtime type
-    // information.
-
-    void processChecks(Set<DartType> checks) {
-      checks.forEach((DartType type) {
-        if (type.isInterfaceType) {
-          InterfaceType itf = type;
-          if (!itf.treatAsRaw) {
-            potentiallyNeedTypeArguments(itf.element);
-          }
-        } else {
-          type.forEachTypeVariable((TypeVariableType typeVariable) {
-            // This handles checks against type variables and function types
-            // containing type variables.
-            Entity typeDeclaration = typeVariable.element.typeDeclaration;
-            potentiallyNeedTypeArguments(typeDeclaration);
-          });
-          if (type.isFunctionType) {
-            checkClosures(potentialSubtypeOf: type);
-          }
-          if (type is FutureOrType) {
-            potentiallyNeedTypeArguments(
-                closedWorld.commonElements.futureClass);
-          }
-        }
-      });
-    }
-
-    processChecks(typeVariableTests.explicitIsChecks);
-    processChecks(typeVariableTests.implicitIsChecks);
-
-    // Add the classes, methods and local functions that need type arguments
-    // because they use a type variable as a literal.
-    classesUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
-    methodsUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
-    localFunctionsUsingTypeVariableLiterals
-        .forEach(potentiallyNeedTypeArguments);
-
-    if (closedWorld.isMemberUsed(
-        closedWorld.commonElements.invocationTypeArgumentGetter)) {
-      // If `Invocation.typeArguments` is live, mark all user-defined
-      // implementations of `noSuchMethod` as needing type arguments.
-      for (MemberEntity member in closedWorld.userNoSuchMethods) {
-        potentiallyNeedTypeArguments(member);
-      }
-    }
-
-    if (options.parameterCheckPolicy.isEmitted) {
-      void checkFunction(Entity function, FunctionType type) {
-        for (FunctionTypeVariable typeVariable in type.typeVariables) {
-          DartType bound = typeVariable.bound;
-          if (!bound.isDynamic &&
-              !bound.isVoid &&
-              bound != closedWorld.commonElements.objectType) {
-            potentiallyNeedTypeArguments(function);
-            break;
-          }
-        }
-      }
-
-      closedWorld.forEachGenericMethod((FunctionEntity method) {
-        checkFunction(method, _elementEnvironment.getFunctionType(method));
-      });
-
-      for (Local function in closedWorld.genericLocalFunctions) {
-        checkFunction(
-            function, _elementEnvironment.getLocalFunctionType(function));
-      }
-    }
-
-    BackendUsage backendUsage = closedWorld.backendUsage;
-    CommonElements commonElements = closedWorld.commonElements;
-
-    /// Set to `true` if subclasses of `Object` need runtimeType. This is
-    /// only used to stop the computation early.
-    bool neededOnAll = false;
-
-    /// Set to `true` if subclasses of `Function` need runtimeType.
-    bool neededOnFunctions = false;
-
-    Set<ClassEntity> classesDirectlyNeedingRuntimeType = new Set<ClassEntity>();
-
-    Iterable<ClassEntity> impliedClasses(DartType type) {
-      if (type is InterfaceType) {
-        return [type.element];
-      } else if (type is DynamicType) {
-        return [commonElements.objectClass];
-      } else if (type is FunctionType) {
-        // TODO(johnniwinther): Include only potential function type subtypes.
-        return [commonElements.functionClass];
-      } else if (type is VoidType) {
-        // No classes implied.
-      } else if (type is FunctionTypeVariable) {
-        return impliedClasses(type.bound);
-      } else if (type is FutureOrType) {
-        return [commonElements.futureClass]
-          ..addAll(impliedClasses(type.typeArgument));
-      } else if (type is TypeVariableType) {
-        // TODO(johnniwinther): Can we do better?
-        return impliedClasses(
-            _elementEnvironment.getTypeVariableBound(type.element));
-      }
-      throw new UnsupportedError('Unexpected type $type');
-    }
-
-    void addClass(ClassEntity cls) {
-      if (cls != null) {
-        classesDirectlyNeedingRuntimeType.add(cls);
-      }
-      if (cls == commonElements.objectClass) {
-        neededOnAll = true;
-      }
-      if (cls == commonElements.functionClass) {
-        neededOnFunctions = true;
-      }
-    }
-
-    for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
-      switch (runtimeTypeUse.kind) {
-        case RuntimeTypeUseKind.string:
-          if (!options.laxRuntimeTypeToString) {
-            impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
-          }
-
-          break;
-        case RuntimeTypeUseKind.equals:
-          Iterable<ClassEntity> receiverClasses =
-              impliedClasses(runtimeTypeUse.receiverType);
-          Iterable<ClassEntity> argumentClasses =
-              impliedClasses(runtimeTypeUse.argumentType);
-
-          for (ClassEntity receiverClass in receiverClasses) {
-            for (ClassEntity argumentClass in argumentClasses) {
-              // TODO(johnniwinther): Special case use of `this.runtimeType`.
-              SubclassResult result = closedWorld.classHierarchy
-                  .commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
-                      argumentClass, ClassQuery.SUBTYPE);
-              switch (result.kind) {
-                case SubclassResultKind.EMPTY:
-                  break;
-                case SubclassResultKind.EXACT1:
-                case SubclassResultKind.SUBCLASS1:
-                case SubclassResultKind.SUBTYPE1:
-                  addClass(receiverClass);
-                  break;
-                case SubclassResultKind.EXACT2:
-                case SubclassResultKind.SUBCLASS2:
-                case SubclassResultKind.SUBTYPE2:
-                  addClass(argumentClass);
-                  break;
-                case SubclassResultKind.SET:
-                  for (ClassEntity cls in result.classes) {
-                    addClass(cls);
-                    if (neededOnAll) break;
-                  }
-                  break;
-              }
-            }
-          }
-          break;
-        case RuntimeTypeUseKind.unknown:
-          impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
-          break;
-      }
-      if (neededOnAll) break;
-    }
-    Set<ClassEntity> allClassesNeedingRuntimeType;
-    if (neededOnAll) {
-      neededOnFunctions = true;
-      allClassesNeedingRuntimeType = closedWorld.classHierarchy
-          .subclassesOf(commonElements.objectClass)
-          .toSet();
-    } else {
-      allClassesNeedingRuntimeType = new Set<ClassEntity>();
-      // TODO(johnniwinther): Support this operation directly in
-      // [ClosedWorld] using the [ClassSet]s.
-      for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
-        if (!allClassesNeedingRuntimeType.contains(cls)) {
-          allClassesNeedingRuntimeType
-              .addAll(closedWorld.classHierarchy.subtypesOf(cls));
-        }
-      }
-    }
-    allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
-    if (neededOnFunctions) {
-      for (Local function in closedWorld.genericLocalFunctions) {
-        potentiallyNeedTypeArguments(function);
-      }
-      for (Local function in localFunctions) {
-        FunctionType functionType =
-            _elementEnvironment.getLocalFunctionType(function);
-        functionType.forEachTypeVariable((TypeVariableType typeVariable) {
-          Entity typeDeclaration = typeVariable.element.typeDeclaration;
-          if (!processedEntities.contains(typeDeclaration)) {
-            potentiallyNeedTypeArguments(typeDeclaration);
-          }
-        });
-        localFunctionsNeedingSignature.addAll(localFunctions);
-      }
-      for (FunctionEntity function
-          in closedWorld.closurizedMembersWithFreeTypeVariables) {
-        methodsNeedingSignature.add(function);
-        potentiallyNeedTypeArguments(function.enclosingClass);
-      }
-    }
-
-    Set<Selector> selectorsNeedingTypeArguments = new Set<Selector>();
-    typeVariableTests
-        .forEachAppliedSelector((Selector selector, Set<Entity> targets) {
-      for (Entity target in targets) {
-        if (methodsNeedingTypeArguments.contains(target) ||
-            localFunctionsNeedingTypeArguments.contains(target)) {
-          selectorsNeedingTypeArguments.add(selector);
-          if (retainDataForTesting) {
-            selectorsNeedingTypeArgumentsForTesting ??=
-                <Selector, Set<Entity>>{};
-            selectorsNeedingTypeArgumentsForTesting
-                .putIfAbsent(selector, () => new Set<Entity>())
-                .add(target);
-          } else {
-            return;
-          }
-        }
-      }
-    });
-    Set<int> instantiationsNeedingTypeArguments = new Set<int>();
-    typeVariableTests.forEachGenericInstantiation(
-        (GenericInstantiation instantiation, Set<Entity> targets) {
-      for (Entity target in targets) {
-        if (methodsNeedingTypeArguments.contains(target) ||
-            localFunctionsNeedingTypeArguments.contains(target)) {
-          // TODO(johnniwinther): Use the static type of the instantiated
-          // expression.
-          instantiationsNeedingTypeArguments
-              .add(instantiation.typeArguments.length);
-          if (retainDataForTesting) {
-            instantiationsNeedingTypeArgumentsForTesting ??=
-                <GenericInstantiation, Set<Entity>>{};
-            instantiationsNeedingTypeArgumentsForTesting
-                .putIfAbsent(instantiation, () => new Set<Entity>())
-                .add(target);
-          } else {
-            return;
-          }
-        }
-      }
-    });
-
-    if (retainDataForTesting) {
-      typeVariableTestsForTesting = typeVariableTests;
-    }
-
-    /*print(typeVariableTests.dump());
-    print('------------------------------------------------------------------');
-    print('classesNeedingTypeArguments:');
-    classesNeedingTypeArguments.forEach((e) => print('  $e'));
-    print('------------------------------------------------------------------');
-    print('methodsNeedingSignature:');
-    methodsNeedingSignature.forEach((e) => print('  $e'));
-    print('------------------------------------------------------------------');
-    print('methodsNeedingTypeArguments:');
-    methodsNeedingTypeArguments.forEach((e) => print('  $e'));
-    print('------------------------------------------------------------------');
-    print('localFunctionsNeedingSignature:');
-    localFunctionsNeedingSignature.forEach((e) => print('  $e'));
-    print('------------------------------------------------------------------');
-    print('localFunctionsNeedingTypeArguments:');
-    localFunctionsNeedingTypeArguments.forEach((e) => print('  $e'));
-    print('------------------------------------------------------------------');
-    print('selectorsNeedingTypeArguments:');
-    selectorsNeedingTypeArguments.forEach((e) => print('  $e'));
-    print('instantiationsNeedingTypeArguments: '
-        '$instantiationsNeedingTypeArguments');*/
-
-    return new RuntimeTypesNeedImpl(
-        _elementEnvironment,
-        classesNeedingTypeArguments,
-        methodsNeedingSignature,
-        methodsNeedingTypeArguments,
-        localFunctionsNeedingSignature,
-        localFunctionsNeedingTypeArguments,
-        selectorsNeedingTypeArguments,
-        instantiationsNeedingTypeArguments);
-  }
-}
-
 class _RuntimeTypesChecks implements RuntimeTypesChecks {
   final RuntimeTypesSubstitutions _substitutions;
   @override
@@ -1901,16 +509,9 @@
         .addAll(_substitutions.getClassesUsedInSubstitutions(requiredChecks));
     return required;
   }
-
-  @override
-  Iterable<ClassEntity> getReferencedClasses(FunctionType type) {
-    FunctionArgumentCollector collector = new FunctionArgumentCollector();
-    collector.collect(type);
-    return collector.classes;
-  }
 }
 
-class RuntimeTypesImpl extends _RuntimeTypesBase
+class RuntimeTypesImpl
     with RuntimeTypesSubstitutionsMixin
     implements RuntimeTypesChecksBuilder {
   @override
@@ -1926,7 +527,7 @@
   @override
   bool rtiChecksBuilderClosed = false;
 
-  RuntimeTypesImpl(this._closedWorld) : super(_closedWorld.dartTypes);
+  RuntimeTypesImpl(this._closedWorld);
 
   JCommonElements get _commonElements => _closedWorld.commonElements;
   @override
@@ -2149,8 +750,10 @@
     });
     liveClasses.forEach(processClass);
 
-    if (options.parameterCheckPolicy.isEmitted) {
-      codegenWorld.forEachGenericMethod((FunctionEntity method) {
+    codegenWorld.forEachGenericMethod((FunctionEntity method) {
+      if (_closedWorld.annotationsData
+          .getParameterCheckPolicy(method)
+          .isEmitted) {
         if (_rtiNeed.methodNeedsTypeArguments(method)) {
           for (TypeVariableType typeVariable
               in _elementEnvironment.getFunctionTypeVariables(method)) {
@@ -2161,8 +764,8 @@
                 bound, TypeVisitorState.covariantTypeArgument);
           }
         }
-      });
-    }
+      }
+    });
 
     cachedRequiredChecks = _computeChecks(classUseMap);
     rtiChecksBuilderClosed = true;
@@ -2737,69 +1340,6 @@
   }
 }
 
-/// Representation of the substitution of type arguments when going from the
-/// type of a class to one of its supertypes.
-///
-/// For `class B<T> extends A<List<T>, int>`, the substitution is the
-/// representation of `(T) => [<List, T>, int]`. For more details of the
-/// representation consult the documentation of [getSupertypeSubstitution].
-//TODO(floitsch): Remove support for non-function substitutions.
-class Substitution {
-  final bool isTrivial;
-  final bool isFunction;
-  final List<DartType> arguments;
-  final List<DartType> parameters;
-  final int length;
-
-  const Substitution.trivial()
-      : isTrivial = true,
-        isFunction = false,
-        length = null,
-        arguments = const <DartType>[],
-        parameters = const <DartType>[];
-
-  Substitution.list(this.arguments)
-      : isTrivial = false,
-        isFunction = false,
-        length = null,
-        parameters = const <DartType>[];
-
-  Substitution.function(this.arguments, this.parameters)
-      : isTrivial = false,
-        isFunction = true,
-        length = null;
-
-  Substitution.jsInterop(this.length)
-      : isTrivial = false,
-        isFunction = false,
-        arguments = const <DartType>[],
-        parameters = const <DartType>[];
-
-  bool get isJsInterop => length != null;
-
-  @override
-  String toString() => 'Substitution(isTrivial=$isTrivial,'
-      'isFunction=$isFunction,isJsInterop=$isJsInterop,arguments=$arguments,'
-      'parameters=$parameters,length=$length)';
-}
-
-/// A pair of a class that we need a check against and the type argument
-/// substitution for this check.
-class TypeCheck {
-  final ClassEntity cls;
-  final bool needsIs;
-  final Substitution substitution;
-  @override
-  final int hashCode = _nextHash = (_nextHash + 100003).toUnsigned(30);
-  static int _nextHash = 0;
-
-  TypeCheck(this.cls, this.substitution, {this.needsIs: true});
-
-  @override
-  String toString() =>
-      'TypeCheck(cls=$cls,needsIs=$needsIs,substitution=$substitution)';
-}
-
 enum TypeVisitorState {
   direct,
   covariantTypeArgument,
@@ -2897,49 +1437,6 @@
   }
 }
 
-/// [TypeCheck]s need for a single class.
-class ClassChecks {
-  final Map<ClassEntity, TypeCheck> _map;
-
-  final ClassFunctionType functionType;
-
-  ClassChecks(this.functionType) : _map = <ClassEntity, TypeCheck>{};
-
-  const ClassChecks.empty()
-      : _map = const <ClassEntity, TypeCheck>{},
-        functionType = null;
-
-  void add(TypeCheck check) {
-    _map[check.cls] = check;
-  }
-
-  TypeCheck operator [](ClassEntity cls) => _map[cls];
-
-  Iterable<TypeCheck> get checks => _map.values;
-
-  @override
-  String toString() {
-    return 'ClassChecks($checks)';
-  }
-}
-
-/// Data needed for generating a signature function for the function type of
-/// a class.
-class ClassFunctionType {
-  /// The `call` function that defines the function type.
-  final FunctionEntity callFunction;
-
-  /// The type of the `call` function.
-  final FunctionType callType;
-
-  /// The signature function for the function type.
-  ///
-  /// This is used for Dart 2.
-  final FunctionEntity signatureFunction;
-
-  ClassFunctionType(this.callFunction, this.callType, this.signatureFunction);
-}
-
 /// Runtime type usage for a class.
 class ClassUse {
   /// Whether the class is directly or indirectly instantiated.
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart b/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart
new file mode 100644
index 0000000..982e018
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_codegen.dart
@@ -0,0 +1,140 @@
+// 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 js_backend.runtime_types_codegen;
+
+import '../elements/entities.dart';
+import '../elements/types.dart';
+
+/// Data needed for generating a signature function for the function type of
+/// a class.
+class ClassFunctionType {
+  /// The `call` function that defines the function type.
+  final FunctionEntity callFunction;
+
+  /// The type of the `call` function.
+  final FunctionType callType;
+
+  /// The signature function for the function type.
+  ///
+  /// This is used for Dart 2.
+  final FunctionEntity signatureFunction;
+
+  ClassFunctionType(this.callFunction, this.callType, this.signatureFunction);
+}
+
+/// A pair of a class that we need a check against and the type argument
+/// substitution for this check.
+class TypeCheck {
+  final ClassEntity cls;
+  final bool needsIs;
+  final Substitution substitution;
+  @override
+  final int hashCode = _nextHash = (_nextHash + 100003).toUnsigned(30);
+  static int _nextHash = 0;
+
+  TypeCheck(this.cls, this.substitution, {this.needsIs: true});
+
+  @override
+  String toString() =>
+      'TypeCheck(cls=$cls,needsIs=$needsIs,substitution=$substitution)';
+}
+
+/// [TypeCheck]s need for a single class.
+class ClassChecks {
+  final Map<ClassEntity, TypeCheck> _map;
+
+  final ClassFunctionType functionType;
+
+  ClassChecks(this.functionType) : _map = <ClassEntity, TypeCheck>{};
+
+  const ClassChecks.empty()
+      : _map = const <ClassEntity, TypeCheck>{},
+        functionType = null;
+
+  void add(TypeCheck check) {
+    _map[check.cls] = check;
+  }
+
+  TypeCheck operator [](ClassEntity cls) => _map[cls];
+
+  Iterable<TypeCheck> get checks => _map.values;
+
+  @override
+  String toString() {
+    return 'ClassChecks($checks)';
+  }
+}
+
+/// For each class, stores the possible class subtype tests that could succeed.
+abstract class TypeChecks {
+  /// Get the set of checks required for class [element].
+  ClassChecks operator [](ClassEntity element);
+
+  /// Get the iterable for all classes that need type checks.
+  Iterable<ClassEntity> get classes;
+}
+
+/// Representation of the substitution of type arguments when going from the
+/// type of a class to one of its supertypes.
+///
+/// For `class B<T> extends A<List<T>, int>`, the substitution is the
+/// representation of `(T) => [<List, T>, int]`. For more details of the
+/// representation consult the documentation of [getSupertypeSubstitution].
+//TODO(floitsch): Remove support for non-function substitutions.
+class Substitution {
+  final bool isTrivial;
+  final bool isFunction;
+  final List<DartType> arguments;
+  final List<DartType> parameters;
+  final int length;
+
+  const Substitution.trivial()
+      : isTrivial = true,
+        isFunction = false,
+        length = null,
+        arguments = const <DartType>[],
+        parameters = const <DartType>[];
+
+  Substitution.list(this.arguments)
+      : isTrivial = false,
+        isFunction = false,
+        length = null,
+        parameters = const <DartType>[];
+
+  Substitution.function(this.arguments, this.parameters)
+      : isTrivial = false,
+        isFunction = true,
+        length = null;
+
+  Substitution.jsInterop(this.length)
+      : isTrivial = false,
+        isFunction = false,
+        arguments = const <DartType>[],
+        parameters = const <DartType>[];
+
+  bool get isJsInterop => length != null;
+
+  @override
+  String toString() => 'Substitution(isTrivial=$isTrivial,'
+      'isFunction=$isFunction,isJsInterop=$isJsInterop,arguments=$arguments,'
+      'parameters=$parameters,length=$length)';
+}
+
+/// Interface for computing substitutions need for runtime type checks.
+abstract class RuntimeTypesSubstitutions {
+  bool isTrivialSubstitution(ClassEntity cls, ClassEntity check);
+
+  Substitution getSubstitution(ClassEntity cls, ClassEntity other);
+
+  Set<ClassEntity> getClassesUsedInSubstitutions(TypeChecks checks);
+
+  static bool hasTypeArguments(DartType type) {
+    if (type is InterfaceType) {
+      InterfaceType interfaceType = type;
+      return !interfaceType.treatAsRaw;
+    }
+    return false;
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
index 4135d60..426d5b9 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_new.dart
@@ -6,7 +6,8 @@
 
 import 'package:js_runtime/shared/recipe_syntax.dart';
 
-import '../common_elements.dart' show JCommonElements, JElementEnvironment;
+import '../common_elements.dart'
+    show CommonElements, JCommonElements, JElementEnvironment;
 import '../elements/entities.dart';
 import '../elements/types.dart';
 import '../js/js.dart' as jsAst;
@@ -17,17 +18,35 @@
 import '../world.dart';
 import 'namer.dart';
 import 'native_data.dart';
-
-import 'runtime_types.dart' show RuntimeTypesNeed, RuntimeTypesSubstitutions;
+import 'runtime_types_codegen.dart' show RuntimeTypesSubstitutions;
+import 'runtime_types_resolution.dart' show RuntimeTypesNeed;
 
 abstract class RecipeEncoder {
-  /// Returns a [jsAst.Expression] representing the given [recipe] to be
+  /// Returns a [jsAst.Literal] representing the given [recipe] to be
   /// evaluated against a type environment with shape [structure].
-  jsAst.Expression encodeRecipe(ModularEmitter emitter,
+  jsAst.Literal encodeRecipe(ModularEmitter emitter,
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe);
 
-  jsAst.Expression encodeGroundRecipe(
-      ModularEmitter emitter, TypeRecipe recipe);
+  jsAst.Literal encodeGroundRecipe(ModularEmitter emitter, TypeRecipe recipe);
+
+  /// Return the recipe with type variables replaced with <any>. This is a hack
+  /// until DartType contains <any> and the parameter stub emitter is replaced
+  /// with an SSA path.
+  // TODO(33422): Remove need for this.
+  jsAst.Literal encodeRecipeWithVariablesReplaceByAny(
+      ModularEmitter emitter, DartType dartType);
+
+  /// Returns a [jsAst.Literal] representing [supertypeArgument] to be evaluated
+  /// against a [FullTypeEnvironmentStructure] representing [declaringType]. Any
+  /// [TypeVariableType]s appearing in [supertypeArgument] which are declared by
+  /// [declaringType] are always encoded as indices.
+  jsAst.Literal encodeDirectSupertypeRecipe(ModularEmitter emitter,
+      InterfaceType declaringType, DartType supertypeArgument);
+
+  /// Converts a recipe into a fragment of code that accesses the evaluated
+  /// recipe.
+  // TODO(33422): Remove need for this by pushing stubs through SSA.
+  jsAst.Expression evaluateRecipe(ModularEmitter emitter, jsAst.Literal recipe);
 
   // TODO(sra): Still need a $signature function when the function type is a
   // function of closed type variables. See if the $signature method can always
@@ -48,18 +67,44 @@
       this._elementEnvironment, this.commonElements, this._rtiNeed);
 
   @override
-  jsAst.Expression encodeRecipe(ModularEmitter emitter,
+  jsAst.Literal encodeRecipe(ModularEmitter emitter,
       TypeEnvironmentStructure environmentStructure, TypeRecipe recipe) {
     return _RecipeGenerator(this, emitter, environmentStructure, recipe).run();
   }
 
   @override
-  jsAst.Expression encodeGroundRecipe(
-      ModularEmitter emitter, TypeRecipe recipe) {
+  jsAst.Literal encodeGroundRecipe(ModularEmitter emitter, TypeRecipe recipe) {
     return _RecipeGenerator(this, emitter, null, recipe).run();
   }
 
   @override
+  jsAst.Literal encodeRecipeWithVariablesReplaceByAny(
+      ModularEmitter emitter, DartType dartType) {
+    return _RecipeGenerator(this, emitter, null, TypeExpressionRecipe(dartType),
+            hackTypeVariablesToAny: true)
+        .run();
+  }
+
+  @override
+  jsAst.Literal encodeDirectSupertypeRecipe(ModularEmitter emitter,
+      InterfaceType declaringType, DartType supertypeArgument) {
+    return _RecipeGenerator(
+            this,
+            emitter,
+            FullTypeEnvironmentStructure(classType: declaringType),
+            TypeExpressionRecipe(supertypeArgument),
+            indexTypeVariablesOnDeclaringClass: true)
+        .run();
+  }
+
+  @override
+  jsAst.Expression evaluateRecipe(
+      ModularEmitter emitter, jsAst.Literal recipe) {
+    return js('#(#)',
+        [emitter.staticFunctionAccess(commonElements.findType), recipe]);
+  }
+
+  @override
   jsAst.Expression encodeSignature(ModularNamer namer, ModularEmitter emitter,
       DartType type, jsAst.Expression this_) {
     // TODO(sra): These inputs (referenced to quell lints) are used by the old
@@ -76,6 +121,8 @@
   final ModularEmitter _emitter;
   final TypeEnvironmentStructure _environment;
   final TypeRecipe _recipe;
+  final bool indexTypeVariablesOnDeclaringClass;
+  final bool hackTypeVariablesToAny;
 
   final List<FunctionTypeVariable> functionTypeVariables = [];
 
@@ -84,13 +131,15 @@
   final List<int> _codes = [];
 
   _RecipeGenerator(
-      this._encoder, this._emitter, this._environment, this._recipe);
+      this._encoder, this._emitter, this._environment, this._recipe,
+      {this.indexTypeVariablesOnDeclaringClass = false,
+      this.hackTypeVariablesToAny = false});
 
   JClosedWorld get _closedWorld => _encoder._closedWorld;
   NativeBasicData get _nativeData => _encoder._nativeData;
   RuntimeTypesSubstitutions get _rtiSubstitutions => _encoder._rtiSubstitutions;
 
-  jsAst.Expression run() {
+  jsAst.Literal run() {
     _start(_recipe);
     assert(functionTypeVariables.isEmpty);
     if (_fragments.isEmpty) {
@@ -181,6 +230,12 @@
 
   @override
   void visitTypeVariableType(TypeVariableType type, _) {
+    if (hackTypeVariablesToAny) {
+      // Emit 'any' type.
+      _emitExtensionOp(Recipe.pushAnyExtension);
+      return;
+    }
+
     TypeEnvironmentStructure environment = _environment;
     if (environment is SingletonTypeEnvironmentStructure) {
       if (type == environment.variable) {
@@ -204,7 +259,9 @@
         _emitInteger(1 + environment.bindings.length + index);
         return;
       }
-      // TODO(sra): Encode type variables names via namer.
+      jsAst.Name name = _emitter.typeVariableAccessNewRti(type.element);
+      _emitName(name);
+      return;
     }
     // TODO(sra): Handle missing cases. This just emits some readable junk. The
     // backticks ensure it won't parse at runtime.
@@ -215,6 +272,15 @@
     TypeVariableEntity element = variable.element;
     ClassEntity cls = element.typeDeclaration;
 
+    if (indexTypeVariablesOnDeclaringClass) {
+      TypeEnvironmentStructure environment = _environment;
+      if (environment is FullTypeEnvironmentStructure) {
+        if (identical(environment.classType.element, cls)) {
+          return element.index;
+        }
+      }
+    }
+
     // TODO(sra): We might be in a context where the class type variable has an
     // index, even though in the general case it is not at a specific index.
 
@@ -379,3 +445,128 @@
     _emitCode(Recipe.wrapFutureOr);
   }
 }
+
+class _RulesetEntry {
+  final InterfaceType _targetType;
+  List<InterfaceType> _supertypes;
+  Map<TypeVariableType, DartType> _typeVariables = {};
+
+  _RulesetEntry(this._targetType, Iterable<InterfaceType> supertypes)
+      : _supertypes = supertypes.toList();
+
+  bool get isEmpty => _supertypes.isEmpty && _typeVariables.isEmpty;
+}
+
+class Ruleset {
+  List<_RulesetEntry> _entries;
+
+  Ruleset(this._entries);
+  Ruleset.empty() : this([]);
+
+  void add(InterfaceType targetType, Iterable<InterfaceType> supertypes) =>
+      _entries.add(_RulesetEntry(targetType, supertypes));
+}
+
+class RulesetEncoder {
+  final DartTypes _dartTypes;
+  final ModularEmitter _emitter;
+  final RecipeEncoder _recipeEncoder;
+
+  RulesetEncoder(this._dartTypes, this._emitter, this._recipeEncoder);
+
+  CommonElements get _commonElements => _dartTypes.commonElements;
+  ClassEntity get _objectClass => _commonElements.objectClass;
+
+  final _leftBrace = js.stringPart('{');
+  final _rightBrace = js.stringPart('}');
+  final _leftBracket = js.stringPart('[');
+  final _rightBracket = js.stringPart(']');
+  final _colon = js.stringPart(':');
+  final _comma = js.stringPart(',');
+  final _quote = js.stringPart("'");
+
+  bool _isObject(InterfaceType type) => identical(type.element, _objectClass);
+
+  void _preprocessSupertype(_RulesetEntry entry, InterfaceType supertype) {
+    InterfaceType thisSupertype = _dartTypes.getThisType(supertype.element);
+    List<DartType> typeVariables = thisSupertype.typeArguments;
+    List<DartType> supertypeArguments = supertype.typeArguments;
+    int length = typeVariables.length;
+    assert(supertypeArguments.length == length);
+    for (int i = 0; i < length; i++) {
+      entry._typeVariables[typeVariables[i]] = supertypeArguments[i];
+    }
+  }
+
+  void _preprocessEntry(_RulesetEntry entry) {
+    entry._supertypes.removeWhere(_isObject);
+    entry._supertypes.forEach(
+        (InterfaceType supertype) => _preprocessSupertype(entry, supertype));
+    entry._supertypes.removeWhere(
+        (InterfaceType supertype) => identical(entry._targetType, supertype));
+  }
+
+  void _preprocessRuleset(Ruleset ruleset) {
+    ruleset._entries
+        .removeWhere((_RulesetEntry entry) => _isObject(entry._targetType));
+    ruleset._entries.forEach(_preprocessEntry);
+    ruleset._entries.removeWhere((_RulesetEntry entry) => entry.isEmpty);
+  }
+
+  // TODO(fishythefish): Common substring elimination.
+
+  /// Produces a string readable by `JSON.parse()`.
+  jsAst.StringConcatenation encodeRuleset(Ruleset ruleset) {
+    _preprocessRuleset(ruleset);
+    return _encodeRuleset(ruleset);
+  }
+
+  jsAst.StringConcatenation _encodeRuleset(Ruleset ruleset) =>
+      js.concatenateStrings([
+        _quote,
+        _leftBrace,
+        ...js.joinLiterals(ruleset._entries.map(_encodeEntry), _comma),
+        _rightBrace,
+        _quote,
+      ]);
+
+  jsAst.StringConcatenation _encodeEntry(_RulesetEntry entry) =>
+      js.concatenateStrings([
+        js.quoteName(_emitter.typeAccessNewRti(entry._targetType.element)),
+        _colon,
+        _leftBrace,
+        ...js.joinLiterals([
+          ...entry._supertypes.map((InterfaceType supertype) =>
+              _encodeSupertype(entry._targetType, supertype)),
+          ...entry._typeVariables.entries.map((mapEntry) => _encodeTypeVariable(
+              entry._targetType, mapEntry.key, mapEntry.value))
+        ], _comma),
+        _rightBrace,
+      ]);
+
+  jsAst.StringConcatenation _encodeSupertype(
+          InterfaceType targetType, InterfaceType supertype) =>
+      js.concatenateStrings([
+        js.quoteName(_emitter.typeAccessNewRti(supertype.element)),
+        _colon,
+        _leftBracket,
+        ...js.joinLiterals(
+            supertype.typeArguments.map((DartType supertypeArgument) =>
+                _encodeSupertypeArgument(targetType, supertypeArgument)),
+            _comma),
+        _rightBracket,
+      ]);
+
+  jsAst.StringConcatenation _encodeTypeVariable(InterfaceType targetType,
+          TypeVariableType typeVariable, DartType supertypeArgument) =>
+      js.concatenateStrings([
+        js.quoteName(_emitter.typeVariableAccessNewRti(typeVariable.element)),
+        _colon,
+        _encodeSupertypeArgument(targetType, supertypeArgument),
+      ]);
+
+  jsAst.Literal _encodeSupertypeArgument(
+          InterfaceType targetType, DartType supertypeArgument) =>
+      _recipeEncoder.encodeDirectSupertypeRecipe(
+          _emitter, targetType, supertypeArgument);
+}
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
new file mode 100644
index 0000000..3d87fac
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/runtime_types_resolution.dart
@@ -0,0 +1,1327 @@
+// 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 js_backend.runtime_types_resolution;
+
+import '../common.dart';
+import '../common/names.dart' show Identifiers;
+import '../common_elements.dart' show CommonElements, ElementEnvironment;
+import '../elements/entities.dart';
+import '../elements/names.dart';
+import '../elements/types.dart';
+import '../ir/runtime_type_analysis.dart';
+import '../kernel/kelements.dart';
+import '../options.dart';
+import '../serialization/serialization.dart';
+import '../universe/class_hierarchy.dart';
+import '../universe/class_set.dart';
+import '../universe/feature.dart';
+import '../universe/selector.dart';
+import '../world.dart';
+import 'backend_usage.dart';
+
+abstract class RtiNode {
+  Entity get entity;
+  Set<RtiNode> _dependencies;
+  int _testState = 0;
+  int _literalState = 0;
+
+  Iterable<RtiNode> get dependencies => _dependencies ?? const <RtiNode>[];
+
+  bool get hasDirectTest => _testState & 1 != 0;
+  bool get hasIndirectTest => _testState & 2 != 0;
+
+  bool get hasTest => _testState != 0;
+
+  bool get hasDirectLiteral => _literalState & 1 != 0;
+  bool get hasIndirectLiteral => _literalState & 2 != 0;
+
+  bool get hasLiteral => _literalState != 0;
+
+  bool get hasUse => hasTest || hasLiteral;
+
+  /// Register that if [entity] needs type arguments then so does `node.entity`.
+  bool addDependency(RtiNode node) {
+    if (entity == node.entity) {
+      // Skip trivial dependencies; if [entity] needs type arguments so does
+      // [entity]!
+      return false;
+    }
+    _dependencies ??= new Set<RtiNode>();
+    return _dependencies.add(node);
+  }
+
+  void markTest({bool direct}) {
+    setTestState(direct ? 1 : 2);
+  }
+
+  void markDirectTest() {
+    setTestState(1);
+  }
+
+  void markIndirectTest() {
+    setTestState(2);
+  }
+
+  void setTestState(int value) {
+    if (_testState != value) {
+      if (_testState == 0) {
+        _testState |= value;
+        if (_dependencies != null) {
+          for (RtiNode node in _dependencies) {
+            node.markIndirectTest();
+          }
+        }
+      } else {
+        _testState = value;
+      }
+    }
+  }
+
+  void markDirectLiteral() {
+    setLiteralState(1);
+  }
+
+  void markIndirectLiteral() {
+    setLiteralState(2);
+  }
+
+  void setLiteralState(int value) {
+    if (_literalState != value) {
+      if (_literalState == 0) {
+        _literalState |= value;
+        if (_dependencies != null) {
+          for (RtiNode node in _dependencies) {
+            node.markIndirectLiteral();
+          }
+        }
+      } else {
+        _literalState = value;
+      }
+    }
+  }
+
+  String get kind;
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write(kind);
+    sb.write(':');
+    sb.write(entity);
+    return sb.toString();
+  }
+}
+
+class ClassNode extends RtiNode {
+  final ClassEntity cls;
+
+  ClassNode(this.cls);
+
+  @override
+  Entity get entity => cls;
+
+  @override
+  String get kind => 'class';
+}
+
+class MethodNode extends RtiNode {
+  final Entity function;
+  final ParameterStructure parameterStructure;
+  final bool isCallTarget;
+  final Name instanceName;
+  final bool isNoSuchMethod;
+
+  MethodNode(this.function, this.parameterStructure,
+      {this.isCallTarget, this.instanceName, this.isNoSuchMethod: false});
+
+  @override
+  Entity get entity => function;
+
+  bool selectorApplies(Selector selector) {
+    if (isNoSuchMethod) return true;
+    return (isCallTarget && selector.isClosureCall ||
+            instanceName == selector.memberName) &&
+        selector.callStructure.signatureApplies(parameterStructure);
+  }
+
+  @override
+  String get kind => 'method';
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('MethodNode(');
+    sb.write('function=$function');
+    sb.write(',parameterStructure=$parameterStructure');
+    sb.write(',isCallTarget=$isCallTarget');
+    sb.write(',instanceName=$instanceName');
+    sb.write(')');
+    return sb.toString();
+  }
+}
+
+class TypeVariableTests {
+  List<RtiNode> _nodes = <RtiNode>[];
+  Map<ClassEntity, ClassNode> _classes = <ClassEntity, ClassNode>{};
+  Map<Entity, MethodNode> _methods = <Entity, MethodNode>{};
+  Map<Selector, Set<Entity>> _appliedSelectorMap;
+  Map<GenericInstantiation, Set<Entity>> _instantiationMap;
+
+  /// All explicit is-tests.
+  final Set<DartType> explicitIsChecks;
+
+  /// All implicit is-tests.
+  final Set<DartType> implicitIsChecks = new Set<DartType>();
+
+  TypeVariableTests(
+      ElementEnvironment elementEnvironment,
+      CommonElements commonElements,
+      DartTypes types,
+      BuiltWorld world,
+      Set<GenericInstantiation> genericInstantiations,
+      {bool forRtiNeeds: true})
+      : explicitIsChecks = new Set<DartType>.from(world.isChecks) {
+    _setupDependencies(
+        elementEnvironment, commonElements, world, genericInstantiations,
+        forRtiNeeds: forRtiNeeds);
+    _propagateTests(commonElements, elementEnvironment, world);
+    if (forRtiNeeds) {
+      _propagateLiterals(elementEnvironment, world);
+    }
+    _collectResults(commonElements, elementEnvironment, types, world,
+        forRtiNeeds: forRtiNeeds);
+  }
+
+  /// Classes whose type variables are explicitly or implicitly used in
+  /// is-tests.
+  ///
+  /// For instance `A` and `B` in:
+  ///
+  ///     class A<T> {
+  ///       m(o) => o is T;
+  ///     }
+  ///     class B<S> {
+  ///       m(o) => new A<S>().m(o);
+  ///     }
+  ///     main() => new B<int>().m(0);
+  ///
+  Iterable<ClassEntity> get classTestsForTesting =>
+      _classes.values.where((n) => n.hasTest).map((n) => n.cls).toSet();
+
+  /// Classes that explicitly use their type variables in is-tests.
+  ///
+  /// For instance `A` in:
+  ///
+  ///     class A<T> {
+  ///       m(o) => o is T;
+  ///     }
+  ///     main() => new A<int>().m(0);
+  ///
+  Iterable<ClassEntity> get directClassTestsForTesting =>
+      _classes.values.where((n) => n.hasDirectTest).map((n) => n.cls).toSet();
+
+  /// Methods that explicitly or implicitly use their type variables in
+  /// is-tests.
+  ///
+  /// For instance `m1` and `m2`in:
+  ///
+  ///     m1<T>(o) => o is T;
+  ///     m2<S>(o) => m1<S>(o);
+  ///     main() => m2<int>(0);
+  ///
+  Iterable<Entity> get methodTestsForTesting =>
+      _methods.values.where((n) => n.hasTest).map((n) => n.function).toSet();
+
+  /// Methods that explicitly use their type variables in is-tests.
+  ///
+  /// For instance `m` in:
+  ///
+  ///     m<T>(o) => o is T;
+  ///     main() => m<int>(0);
+  ///
+  Iterable<Entity> get directMethodTestsForTesting => _methods.values
+      .where((n) => n.hasDirectTest)
+      .map((n) => n.function)
+      .toSet();
+
+  /// The entities that need type arguments at runtime if the 'key entity' needs
+  /// type arguments.
+  ///
+  /// For instance:
+  ///
+  ///     class A<T> {
+  ///       m() => new B<T>();
+  ///     }
+  ///     class B<T> {}
+  ///     main() => new A<String>().m() is B<int>;
+  ///
+  /// Here `A` needs type arguments at runtime because the key entity `B` needs
+  /// it in order to generate the check against `B<int>`.
+  ///
+  /// This can also involve generic methods:
+  ///
+  ///    class A<T> {}
+  ///    method<T>() => new A<T>();
+  ///    main() => method<int>() is A<int>();
+  ///
+  /// Here `method` need type arguments at runtime because the key entity `A`
+  /// needs it in order to generate the check against `A<int>`.
+  ///
+  Iterable<Entity> getTypeArgumentDependencies(Entity entity) {
+    Iterable<RtiNode> dependencies;
+    if (entity is ClassEntity) {
+      dependencies = _classes[entity]?.dependencies;
+    } else {
+      dependencies = _methods[entity]?.dependencies;
+    }
+    if (dependencies == null) return const <Entity>[];
+    return dependencies.map((n) => n.entity).toSet();
+  }
+
+  /// Calls [f] for each selector that applies to generic [targets].
+  void forEachAppliedSelector(void f(Selector selector, Set<Entity> targets)) {
+    _appliedSelectorMap.forEach(f);
+  }
+
+  /// Calls [f] for each generic instantiation that applies to generic
+  /// closurized [targets].
+  void forEachGenericInstantiation(
+      void f(GenericInstantiation instantiation, Set<Entity> targets)) {
+    _instantiationMap?.forEach(f);
+  }
+
+  ClassNode _getClassNode(ClassEntity cls) {
+    return _classes.putIfAbsent(cls, () {
+      ClassNode node = new ClassNode(cls);
+      _nodes.add(node);
+      return node;
+    });
+  }
+
+  MethodNode _getMethodNode(ElementEnvironment elementEnvironment,
+      BuiltWorld world, Entity function) {
+    return _methods.putIfAbsent(function, () {
+      MethodNode node;
+      if (function is FunctionEntity) {
+        Name instanceName;
+        bool isCallTarget;
+        bool isNoSuchMethod;
+        if (function.isInstanceMember) {
+          isCallTarget = world.closurizedMembers.contains(function);
+          instanceName = function.memberName;
+          isNoSuchMethod = instanceName.text == Identifiers.noSuchMethod_;
+        } else {
+          isCallTarget = world.closurizedStatics.contains(function);
+          isNoSuchMethod = false;
+        }
+        node = new MethodNode(function, function.parameterStructure,
+            isCallTarget: isCallTarget,
+            instanceName: instanceName,
+            isNoSuchMethod: isNoSuchMethod);
+      } else {
+        ParameterStructure parameterStructure = new ParameterStructure.fromType(
+            elementEnvironment.getLocalFunctionType(function));
+        node = new MethodNode(function, parameterStructure, isCallTarget: true);
+      }
+      _nodes.add(node);
+      return node;
+    });
+  }
+
+  void _setupDependencies(
+      ElementEnvironment elementEnvironment,
+      CommonElements commonElements,
+      BuiltWorld world,
+      Set<GenericInstantiation> genericInstantiations,
+      {bool forRtiNeeds: true}) {
+    /// Register that if `node.entity` needs type arguments then so do entities
+    /// whose type variables occur in [type].
+    ///
+    /// For instance if `A` needs type arguments then so does `B` in:
+    ///
+    ///   class A<T> {}
+    ///   class B<T> { m() => new A<T>(); }
+    ///
+    void registerDependencies(RtiNode node, DartType type) {
+      type.forEachTypeVariable((TypeVariableType typeVariable) {
+        Entity typeDeclaration = typeVariable.element.typeDeclaration;
+        if (typeDeclaration is ClassEntity) {
+          node.addDependency(_getClassNode(typeDeclaration));
+        } else {
+          node.addDependency(
+              _getMethodNode(elementEnvironment, world, typeDeclaration));
+        }
+      });
+    }
+
+    // Add the rti dependencies that are implicit in the way the backend
+    // generates code: when we create a new [List], we actually create a
+    // [JSArray] in the backend and we need to add type arguments to the calls
+    // of the list constructor whenever we determine that [JSArray] needs type
+    // arguments.
+    //
+    // This is need for instance for:
+    //
+    //    var list = <int>[];
+    //    var set = list.toSet();
+    //    set is Set<String>;
+    //
+    // It also occurs for [Map] vs [JsLinkedHashMap] in:
+    //
+    //    var map = <int, double>{};
+    //    var set = map.keys.toSet();
+    //    set is Set<String>;
+    //
+    // TODO(johnniwinther): Make this dependency visible from code, possibly
+    // using generic methods.
+    if (commonElements.jsArrayClass != null) {
+      _getClassNode(commonElements.jsArrayClass)
+          .addDependency(_getClassNode(commonElements.listClass));
+    }
+    if (commonElements.setLiteralClass != null) {
+      _getClassNode(commonElements.setLiteralClass)
+          .addDependency(_getClassNode(commonElements.setClass));
+    }
+    if (commonElements.mapLiteralClass != null) {
+      _getClassNode(commonElements.mapLiteralClass)
+          .addDependency(_getClassNode(commonElements.mapClass));
+    }
+
+    void processCheckedType(DartType type) {
+      if (type is InterfaceType) {
+        // Register that if [cls] needs type arguments then so do the entities
+        // that declare type variables occurring in [type].
+        ClassEntity cls = type.element;
+        registerDependencies(_getClassNode(cls), type);
+      }
+      if (type is FutureOrType) {
+        // [type] is `FutureOr<X>`.
+
+        // For the implied `is Future<X>` test, register that if `Future` needs
+        // type arguments then so do the entities that declare type variables
+        // occurring in `type.typeArgument`.
+        registerDependencies(
+            _getClassNode(commonElements.futureClass), type.typeArgument);
+        // Process `type.typeArgument` for the implied `is X` test.
+        processCheckedType(type.typeArgument);
+      }
+    }
+
+    world.isChecks.forEach(processCheckedType);
+
+    world.instantiatedTypes.forEach((InterfaceType type) {
+      // Register that if [cls] needs type arguments then so do the entities
+      // that declare type variables occurring in [type].
+      ClassEntity cls = type.element;
+      registerDependencies(_getClassNode(cls), type);
+    });
+
+    world.forEachStaticTypeArgument(
+        (Entity entity, Iterable<DartType> typeArguments) {
+      for (DartType type in typeArguments) {
+        // Register that if [entity] needs type arguments then so do the
+        // entities that declare type variables occurring in [type].
+        registerDependencies(
+            _getMethodNode(elementEnvironment, world, entity), type);
+      }
+    });
+
+    world.forEachDynamicTypeArgument(
+        (Selector selector, Iterable<DartType> typeArguments) {
+      void processEntity(Entity entity) {
+        MethodNode node = _getMethodNode(elementEnvironment, world, entity);
+        if (node.selectorApplies(selector)) {
+          for (DartType type in typeArguments) {
+            // Register that if `node.entity` needs type arguments then so do
+            // the entities that declare type variables occurring in [type].
+            registerDependencies(node, type);
+          }
+        }
+      }
+
+      world.forEachGenericInstanceMethod(processEntity);
+      world.genericLocalFunctions.forEach(processEntity);
+      world.closurizedStatics.forEach(processEntity);
+      world.userNoSuchMethods.forEach(processEntity);
+    });
+
+    for (GenericInstantiation instantiation in genericInstantiations) {
+      void processEntity(Entity entity) {
+        MethodNode node = _getMethodNode(elementEnvironment, world, entity);
+        if (node.parameterStructure.typeParameters ==
+            instantiation.typeArguments.length) {
+          if (forRtiNeeds) {
+            _instantiationMap ??= <GenericInstantiation, Set<Entity>>{};
+            _instantiationMap
+                .putIfAbsent(instantiation, () => new Set<Entity>())
+                .add(entity);
+          }
+          for (DartType type in instantiation.typeArguments) {
+            // Register that if `node.entity` needs type arguments then so do
+            // the entities that declare type variables occurring in [type].
+            registerDependencies(node, type);
+          }
+        }
+      }
+
+      world.closurizedMembers.forEach(processEntity);
+      world.closurizedStatics.forEach(processEntity);
+      world.genericLocalFunctions.forEach(processEntity);
+    }
+  }
+
+  void _propagateTests(CommonElements commonElements,
+      ElementEnvironment elementEnvironment, BuiltWorld worldBuilder) {
+    void processTypeVariableType(TypeVariableType type, {bool direct: true}) {
+      TypeVariableEntity variable = type.element;
+      if (variable.typeDeclaration is ClassEntity) {
+        _getClassNode(variable.typeDeclaration).markTest(direct: direct);
+      } else {
+        _getMethodNode(
+                elementEnvironment, worldBuilder, variable.typeDeclaration)
+            .markTest(direct: direct);
+      }
+    }
+
+    void processType(DartType type, {bool direct: true}) {
+      if (type is FutureOrType) {
+        _getClassNode(commonElements.futureClass).markIndirectTest();
+        processType(type.typeArgument, direct: false);
+      } else {
+        type.forEachTypeVariable((TypeVariableType type) {
+          processTypeVariableType(type, direct: direct);
+        });
+      }
+    }
+
+    worldBuilder.isChecks.forEach(processType);
+  }
+
+  void _propagateLiterals(
+      ElementEnvironment elementEnvironment, BuiltWorld world) {
+    world.typeVariableTypeLiterals.forEach((TypeVariableType typeVariableType) {
+      TypeVariableEntity variable = typeVariableType.element;
+      if (variable.typeDeclaration is ClassEntity) {
+        _getClassNode(variable.typeDeclaration).markDirectLiteral();
+      } else {
+        _getMethodNode(elementEnvironment, world, variable.typeDeclaration)
+            .markDirectLiteral();
+      }
+    });
+  }
+
+  String dump({bool verbose: false}) {
+    StringBuffer sb = new StringBuffer();
+
+    void addNode(RtiNode node) {
+      if (node.hasUse || node.dependencies.isNotEmpty || verbose) {
+        sb.write(' $node');
+        String comma = '';
+        if (node._testState & 1 != 0) {
+          sb.write(' direct test');
+          comma = ',';
+        }
+        if (node._testState & 2 != 0) {
+          sb.write('$comma indirect test');
+          comma = ',';
+        }
+        if (node._literalState & 1 != 0) {
+          sb.write('$comma direct literal');
+          comma = ',';
+        }
+        if (node._literalState & 2 != 0) {
+          sb.write('$comma indirect literal');
+          comma = ',';
+        }
+        if (node.dependencies.isNotEmpty || verbose) {
+          sb.writeln(':');
+          node.dependencies.forEach((n) => sb.writeln('  $n'));
+        } else {
+          sb.writeln();
+        }
+      }
+    }
+
+    void addType(DartType type) {
+      sb.writeln(' $type');
+    }
+
+    sb.writeln('classes:');
+    _classes.values.forEach(addNode);
+    sb.writeln('methods:');
+    _methods.values.forEach(addNode);
+    sb.writeln('explicit is-tests:');
+    explicitIsChecks.forEach(addType);
+    sb.writeln('implicit is-tests:');
+    implicitIsChecks.forEach(addType);
+
+    return sb.toString();
+  }
+
+  void _collectResults(CommonElements commonElements,
+      ElementEnvironment elementEnvironment, DartTypes types, BuiltWorld world,
+      {bool forRtiNeeds: true}) {
+    /// Register the implicit is-test of [type].
+    ///
+    /// If [type] is of the form `FutureOr<X>`, also register the implicit
+    /// is-tests of `Future<X>` and `X`.
+    void addImplicitCheck(DartType type) {
+      if (implicitIsChecks.add(type)) {
+        if (type is FutureOrType) {
+          addImplicitCheck(commonElements.futureType(type.typeArgument));
+          addImplicitCheck(type.typeArgument);
+        }
+      }
+    }
+
+    void addImplicitChecks(Iterable<DartType> types) {
+      types.forEach(addImplicitCheck);
+    }
+
+    world.isChecks.forEach((DartType type) {
+      if (type is FutureOrType) {
+        addImplicitCheck(commonElements.futureType(type.typeArgument));
+        addImplicitCheck(type.typeArgument);
+      }
+    });
+
+    // Compute type arguments of classes that use one of their type variables in
+    // is-checks and add the is-checks that they imply.
+    _classes.forEach((ClassEntity cls, ClassNode node) {
+      if (!node.hasTest) return;
+      // Find all instantiated types that are a subtype of a class that uses
+      // one of its type arguments in an is-check and add the arguments to the
+      // set of is-checks.
+      for (InterfaceType type in world.instantiatedTypes) {
+        // We need the type as instance of its superclass anyway, so we just
+        // try to compute the substitution; if the result is [:null:], the
+        // classes are not related.
+        InterfaceType instance = types.asInstanceOf(type, cls);
+        if (instance != null) {
+          for (DartType argument in instance.typeArguments) {
+            addImplicitCheck(argument.unaliased);
+          }
+        }
+      }
+    });
+
+    world.forEachStaticTypeArgument(
+        (Entity function, Iterable<DartType> typeArguments) {
+      if (!_getMethodNode(elementEnvironment, world, function).hasTest) {
+        return;
+      }
+      addImplicitChecks(typeArguments);
+    });
+
+    if (forRtiNeeds) {
+      _appliedSelectorMap = <Selector, Set<Entity>>{};
+    }
+
+    world.forEachDynamicTypeArgument(
+        (Selector selector, Iterable<DartType> typeArguments) {
+      for (MethodNode node in _methods.values) {
+        if (node.selectorApplies(selector)) {
+          if (forRtiNeeds) {
+            _appliedSelectorMap
+                .putIfAbsent(selector, () => new Set<Entity>())
+                .add(node.entity);
+          }
+          if (node.hasTest) {
+            addImplicitChecks(typeArguments);
+          }
+        }
+      }
+    });
+  }
+}
+
+/// Interface for the classes and methods that need runtime types.
+abstract class RuntimeTypesNeed {
+  /// Deserializes a [RuntimeTypesNeed] object from [source].
+  factory RuntimeTypesNeed.readFromDataSource(
+      DataSource source, ElementEnvironment elementEnvironment) {
+    bool isTrivial = source.readBool();
+    if (isTrivial) {
+      return const TrivialRuntimeTypesNeed();
+    }
+    return new RuntimeTypesNeedImpl.readFromDataSource(
+        source, elementEnvironment);
+  }
+
+  /// Serializes this [RuntimeTypesNeed] to [sink].
+  void writeToDataSink(DataSink sink);
+
+  /// Returns `true` if [cls] needs type arguments at runtime type.
+  ///
+  /// This is for instance the case for generic classes used in a type test:
+  ///
+  ///   class C<T> {}
+  ///   main() {
+  ///     new C<int>() is C<int>;
+  ///     new C<String>() is C<String>;
+  ///   }
+  ///
+  bool classNeedsTypeArguments(ClassEntity cls);
+
+  /// Returns `true` if [method] needs type arguments at runtime type.
+  ///
+  /// This is for instance the case for generic methods that use type tests:
+  ///
+  ///   method<T>(T t) => t is T;
+  ///   main() {
+  ///     method<int>(0);
+  ///     method<String>('');
+  ///   }
+  ///
+  bool methodNeedsTypeArguments(FunctionEntity method);
+
+  /// Returns `true` if a signature is needed for [method].
+  ///
+  /// A signature is a runtime method type descriptor function that creates
+  /// a runtime representation of the type of the method.
+  ///
+  /// This is for instance needed for instance methods of generic classes that
+  /// are torn off and whose type therefore potentially is used in a type test:
+  ///
+  ///     class C<T> {
+  ///       method(T t) {}
+  ///     }
+  ///     main() {
+  ///       new C<int>().method is void Function(int);
+  ///       new C<String>().method is void Function(String);
+  ///     }
+  ///
+  /// Since type of the method depends on the type argument of its enclosing
+  /// class, the type of the method is a JavaScript function like:
+  ///
+  ///    signature: function (T) {
+  ///      return {'func': true, params: [T]};
+  ///    }
+  ///
+  bool methodNeedsSignature(FunctionEntity method);
+
+  /// Returns `true` if a dynamic call of [selector] needs to pass type
+  /// arguments.
+  bool selectorNeedsTypeArguments(Selector selector);
+
+  /// Returns `true` if a generic instantiation on an expression of type
+  /// [functionType] with the given [typeArgumentCount] needs to pass type
+  /// arguments.
+  // TODO(johnniwinther): Use [functionType].
+  bool instantiationNeedsTypeArguments(
+      DartType functionType, int typeArgumentCount);
+}
+
+class TrivialRuntimeTypesNeed implements RuntimeTypesNeed {
+  const TrivialRuntimeTypesNeed();
+
+  @override
+  void writeToDataSink(DataSink sink) {
+    sink.writeBool(true); // Is trivial.
+  }
+
+  @override
+  bool classNeedsTypeArguments(ClassEntity cls) => true;
+
+  @override
+  bool methodNeedsSignature(FunctionEntity method) => true;
+
+  @override
+  bool methodNeedsTypeArguments(FunctionEntity method) =>
+      // TODO(johnniwinther): Align handling of type arguments passed to factory
+      // constructors with type arguments passed the regular generic methods.
+      !(method is ConstructorEntity && method.isFactoryConstructor);
+
+  @override
+  bool selectorNeedsTypeArguments(Selector selector) => true;
+
+  @override
+  bool instantiationNeedsTypeArguments(
+      DartType functionType, int typeArgumentCount) {
+    return true;
+  }
+}
+
+class RuntimeTypesNeedImpl implements RuntimeTypesNeed {
+  /// Tag used for identifying serialized [RuntimeTypesNeed] objects in a
+  /// debugging data stream.
+  static const String tag = 'runtime-types-need';
+
+  final ElementEnvironment _elementEnvironment;
+  final Set<ClassEntity> classesNeedingTypeArguments;
+  final Set<FunctionEntity> methodsNeedingSignature;
+  final Set<FunctionEntity> methodsNeedingTypeArguments;
+  final Set<Local> localFunctionsNeedingSignature;
+  final Set<Local> localFunctionsNeedingTypeArguments;
+  final Set<Selector> selectorsNeedingTypeArguments;
+  final Set<int> instantiationsNeedingTypeArguments;
+
+  RuntimeTypesNeedImpl(
+      this._elementEnvironment,
+      this.classesNeedingTypeArguments,
+      this.methodsNeedingSignature,
+      this.methodsNeedingTypeArguments,
+      this.localFunctionsNeedingSignature,
+      this.localFunctionsNeedingTypeArguments,
+      this.selectorsNeedingTypeArguments,
+      this.instantiationsNeedingTypeArguments);
+
+  factory RuntimeTypesNeedImpl.readFromDataSource(
+      DataSource source, ElementEnvironment elementEnvironment) {
+    source.begin(tag);
+    Set<ClassEntity> classesNeedingTypeArguments =
+        source.readClasses<ClassEntity>().toSet();
+    Set<FunctionEntity> methodsNeedingSignature =
+        source.readMembers<FunctionEntity>().toSet();
+    Set<FunctionEntity> methodsNeedingTypeArguments =
+        source.readMembers<FunctionEntity>().toSet();
+    Set<Selector> selectorsNeedingTypeArguments =
+        source.readList(() => new Selector.readFromDataSource(source)).toSet();
+    Set<int> instantiationsNeedingTypeArguments =
+        source.readList(source.readInt).toSet();
+    source.end(tag);
+    return new RuntimeTypesNeedImpl(
+        elementEnvironment,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        null,
+        null,
+        selectorsNeedingTypeArguments,
+        instantiationsNeedingTypeArguments);
+  }
+
+  @override
+  void writeToDataSink(DataSink sink) {
+    sink.writeBool(false); // Is _not_ trivial.
+    sink.begin(tag);
+    sink.writeClasses(classesNeedingTypeArguments);
+    sink.writeMembers(methodsNeedingSignature);
+    sink.writeMembers(methodsNeedingTypeArguments);
+    assert(localFunctionsNeedingSignature == null);
+    assert(localFunctionsNeedingTypeArguments == null);
+    sink.writeList(selectorsNeedingTypeArguments,
+        (Selector selector) => selector.writeToDataSink(sink));
+    sink.writeList(instantiationsNeedingTypeArguments, sink.writeInt);
+    sink.end(tag);
+  }
+
+  bool checkClass(covariant ClassEntity cls) => true;
+
+  @override
+  bool classNeedsTypeArguments(ClassEntity cls) {
+    assert(checkClass(cls));
+    if (!_elementEnvironment.isGenericClass(cls)) return false;
+    return classesNeedingTypeArguments.contains(cls);
+  }
+
+  @override
+  bool methodNeedsSignature(FunctionEntity function) {
+    return methodsNeedingSignature.contains(function);
+  }
+
+  @override
+  bool methodNeedsTypeArguments(FunctionEntity function) {
+    return methodsNeedingTypeArguments.contains(function);
+  }
+
+  @override
+  bool selectorNeedsTypeArguments(Selector selector) {
+    if (selector.callStructure.typeArgumentCount == 0) return false;
+    return selectorsNeedingTypeArguments.contains(selector);
+  }
+
+  @override
+  bool instantiationNeedsTypeArguments(
+      DartType functionType, int typeArgumentCount) {
+    return instantiationsNeedingTypeArguments.contains(typeArgumentCount);
+  }
+}
+
+/// Interface for computing classes and methods that need runtime types.
+abstract class RuntimeTypesNeedBuilder {
+  /// Registers that [cls] uses one of its type variables as a literal.
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls);
+
+  /// Registers that [method] uses one of its type variables as a literal.
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method);
+
+  /// Registers that [localFunction] uses one of its type variables as a
+  /// literal.
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction);
+
+  /// Registers that a generic [instantiation] is used.
+  void registerGenericInstantiation(GenericInstantiation instantiation);
+
+  /// Computes the [RuntimeTypesNeed] for the data registered with this builder.
+  RuntimeTypesNeed computeRuntimeTypesNeed(
+      KClosedWorld closedWorld, CompilerOptions options);
+}
+
+class TrivialRuntimeTypesNeedBuilder implements RuntimeTypesNeedBuilder {
+  const TrivialRuntimeTypesNeedBuilder();
+
+  @override
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {}
+
+  @override
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {}
+
+  @override
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {}
+
+  @override
+  void registerGenericInstantiation(GenericInstantiation instantiation) {}
+
+  @override
+  RuntimeTypesNeed computeRuntimeTypesNeed(
+      KClosedWorld closedWorld, CompilerOptions options) {
+    return const TrivialRuntimeTypesNeed();
+  }
+}
+
+class RuntimeTypesNeedBuilderImpl implements RuntimeTypesNeedBuilder {
+  final ElementEnvironment _elementEnvironment;
+
+  final Set<ClassEntity> classesUsingTypeVariableLiterals =
+      new Set<ClassEntity>();
+
+  final Set<FunctionEntity> methodsUsingTypeVariableLiterals =
+      new Set<FunctionEntity>();
+
+  final Set<Local> localFunctionsUsingTypeVariableLiterals = new Set<Local>();
+
+  Map<Selector, Set<Entity>> selectorsNeedingTypeArgumentsForTesting;
+
+  Map<GenericInstantiation, Set<Entity>>
+      instantiationsNeedingTypeArgumentsForTesting;
+
+  final Set<GenericInstantiation> _genericInstantiations =
+      new Set<GenericInstantiation>();
+
+  TypeVariableTests typeVariableTestsForTesting;
+
+  RuntimeTypesNeedBuilderImpl(this._elementEnvironment);
+
+  @override
+  void registerClassUsingTypeVariableLiteral(ClassEntity cls) {
+    classesUsingTypeVariableLiterals.add(cls);
+  }
+
+  @override
+  void registerMethodUsingTypeVariableLiteral(FunctionEntity method) {
+    methodsUsingTypeVariableLiterals.add(method);
+  }
+
+  @override
+  void registerLocalFunctionUsingTypeVariableLiteral(Local localFunction) {
+    localFunctionsUsingTypeVariableLiterals.add(localFunction);
+  }
+
+  @override
+  void registerGenericInstantiation(GenericInstantiation instantiation) {
+    _genericInstantiations.add(instantiation);
+  }
+
+  @override
+  RuntimeTypesNeed computeRuntimeTypesNeed(
+      KClosedWorld closedWorld, CompilerOptions options) {
+    TypeVariableTests typeVariableTests = new TypeVariableTests(
+        closedWorld.elementEnvironment,
+        closedWorld.commonElements,
+        closedWorld.dartTypes,
+        closedWorld,
+        _genericInstantiations);
+    Set<ClassEntity> classesNeedingTypeArguments = new Set<ClassEntity>();
+    Set<FunctionEntity> methodsNeedingSignature = new Set<FunctionEntity>();
+    Set<FunctionEntity> methodsNeedingTypeArguments = new Set<FunctionEntity>();
+    Set<Local> localFunctionsNeedingSignature = new Set<Local>();
+    Set<Local> localFunctionsNeedingTypeArguments = new Set<Local>();
+    Set<Entity> processedEntities = new Set<Entity>();
+
+    // Find the classes that need type arguments at runtime. Such
+    // classes are:
+    // (1) used in an is check with type variables,
+    // (2) dependencies of classes in (1),
+    // (3) subclasses of (2) and (3).
+    void potentiallyNeedTypeArguments(Entity entity) {
+      // Functions with type arguments can have dependencies of each other (if
+      // the functions call each other) so we keep a set to prevent infinitely
+      // recursing over the same entities.
+      if (processedEntities.contains(entity)) return;
+
+      processedEntities.add(entity);
+      if (entity is ClassEntity) {
+        ClassEntity cls = entity;
+        if (!_elementEnvironment.isGenericClass(cls)) return;
+        if (classesNeedingTypeArguments.contains(cls)) return;
+        classesNeedingTypeArguments.add(cls);
+
+        // TODO(ngeoffray): This should use subclasses, not subtypes.
+        closedWorld.classHierarchy.forEachStrictSubtypeOf(cls,
+            (ClassEntity sub) {
+          potentiallyNeedTypeArguments(sub);
+          return IterationStep.CONTINUE;
+        });
+      } else if (entity is FunctionEntity) {
+        methodsNeedingTypeArguments.add(entity);
+      } else {
+        localFunctionsNeedingTypeArguments.add(entity);
+      }
+
+      Iterable<Entity> dependencies =
+          typeVariableTests.getTypeArgumentDependencies(entity);
+      dependencies.forEach((Entity other) {
+        potentiallyNeedTypeArguments(other);
+      });
+    }
+
+    Set<Local> localFunctions = closedWorld.localFunctions.toSet();
+    Set<FunctionEntity> closurizedMembers =
+        closedWorld.closurizedMembersWithFreeTypeVariables.toSet();
+
+    // Check local functions and closurized members.
+    void checkClosures({DartType potentialSubtypeOf}) {
+      bool checkFunctionType(FunctionType functionType) {
+        ClassEntity contextClass = DartTypes.getClassContext(functionType);
+        if (contextClass != null &&
+            (potentialSubtypeOf == null ||
+                closedWorld.dartTypes
+                    .isPotentialSubtype(functionType, potentialSubtypeOf))) {
+          potentiallyNeedTypeArguments(contextClass);
+          return true;
+        }
+        return false;
+      }
+
+      Set<Local> localFunctionsToRemove;
+      Set<FunctionEntity> closurizedMembersToRemove;
+      for (Local function in localFunctions) {
+        FunctionType functionType =
+            _elementEnvironment.getLocalFunctionType(function);
+        if (potentialSubtypeOf == null ||
+            closedWorld.dartTypes
+                .isPotentialSubtype(functionType, potentialSubtypeOf,
+                    // TODO(johnniwinther): Use register generic instantiations
+                    // instead.
+                    assumeInstantiations: _genericInstantiations.isNotEmpty)) {
+          functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            if (!processedEntities.contains(typeDeclaration)) {
+              potentiallyNeedTypeArguments(typeDeclaration);
+            }
+          });
+          localFunctionsNeedingSignature.add(function);
+          localFunctionsToRemove ??= new Set<Local>();
+          localFunctionsToRemove.add(function);
+        }
+      }
+      for (FunctionEntity function in closurizedMembers) {
+        if (checkFunctionType(_elementEnvironment.getFunctionType(function))) {
+          methodsNeedingSignature.add(function);
+          closurizedMembersToRemove ??= new Set<FunctionEntity>();
+          closurizedMembersToRemove.add(function);
+        }
+      }
+      if (localFunctionsToRemove != null) {
+        localFunctions.removeAll(localFunctionsToRemove);
+      }
+      if (closurizedMembersToRemove != null) {
+        closurizedMembers.removeAll(closurizedMembersToRemove);
+      }
+    }
+
+    // Compute the set of all classes and methods that need runtime type
+    // information.
+
+    void processChecks(Set<DartType> checks) {
+      checks.forEach((DartType type) {
+        if (type.isInterfaceType) {
+          InterfaceType itf = type;
+          if (!itf.treatAsRaw) {
+            potentiallyNeedTypeArguments(itf.element);
+          }
+        } else {
+          type.forEachTypeVariable((TypeVariableType typeVariable) {
+            // This handles checks against type variables and function types
+            // containing type variables.
+            Entity typeDeclaration = typeVariable.element.typeDeclaration;
+            potentiallyNeedTypeArguments(typeDeclaration);
+          });
+          if (type.isFunctionType) {
+            checkClosures(potentialSubtypeOf: type);
+          }
+          if (type is FutureOrType) {
+            potentiallyNeedTypeArguments(
+                closedWorld.commonElements.futureClass);
+          }
+        }
+      });
+    }
+
+    processChecks(typeVariableTests.explicitIsChecks);
+    processChecks(typeVariableTests.implicitIsChecks);
+
+    // Add the classes, methods and local functions that need type arguments
+    // because they use a type variable as a literal.
+    classesUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
+    methodsUsingTypeVariableLiterals.forEach(potentiallyNeedTypeArguments);
+    localFunctionsUsingTypeVariableLiterals
+        .forEach(potentiallyNeedTypeArguments);
+
+    if (closedWorld.isMemberUsed(
+        closedWorld.commonElements.invocationTypeArgumentGetter)) {
+      // If `Invocation.typeArguments` is live, mark all user-defined
+      // implementations of `noSuchMethod` as needing type arguments.
+      for (MemberEntity member in closedWorld.userNoSuchMethods) {
+        potentiallyNeedTypeArguments(member);
+      }
+    }
+
+    void checkFunction(Entity function, FunctionType type) {
+      for (FunctionTypeVariable typeVariable in type.typeVariables) {
+        DartType bound = typeVariable.bound;
+        if (!bound.isDynamic &&
+            !bound.isVoid &&
+            bound != closedWorld.commonElements.objectType) {
+          potentiallyNeedTypeArguments(function);
+          break;
+        }
+      }
+    }
+
+    closedWorld.forEachGenericMethod((FunctionEntity method) {
+      if (closedWorld.annotationsData
+          .getParameterCheckPolicy(method)
+          .isEmitted) {
+        checkFunction(method, _elementEnvironment.getFunctionType(method));
+      }
+    });
+    for (KLocalFunction function in closedWorld.genericLocalFunctions) {
+      if (closedWorld.annotationsData
+          // TODO(johnniwinther): Support @pragma on local functions and use
+          // this here instead of the enclosing member.
+          .getParameterCheckPolicy(function.memberContext)
+          .isEmitted) {
+        checkFunction(
+            function, _elementEnvironment.getLocalFunctionType(function));
+      }
+    }
+
+    BackendUsage backendUsage = closedWorld.backendUsage;
+    CommonElements commonElements = closedWorld.commonElements;
+
+    /// Set to `true` if subclasses of `Object` need runtimeType. This is
+    /// only used to stop the computation early.
+    bool neededOnAll = false;
+
+    /// Set to `true` if subclasses of `Function` need runtimeType.
+    bool neededOnFunctions = false;
+
+    Set<ClassEntity> classesDirectlyNeedingRuntimeType = new Set<ClassEntity>();
+
+    Iterable<ClassEntity> impliedClasses(DartType type) {
+      if (type is InterfaceType) {
+        return [type.element];
+      } else if (type is DynamicType) {
+        return [commonElements.objectClass];
+      } else if (type is FunctionType) {
+        // TODO(johnniwinther): Include only potential function type subtypes.
+        return [commonElements.functionClass];
+      } else if (type is VoidType) {
+        // No classes implied.
+      } else if (type is FunctionTypeVariable) {
+        return impliedClasses(type.bound);
+      } else if (type is FutureOrType) {
+        return [commonElements.futureClass]
+          ..addAll(impliedClasses(type.typeArgument));
+      } else if (type is TypeVariableType) {
+        // TODO(johnniwinther): Can we do better?
+        return impliedClasses(
+            _elementEnvironment.getTypeVariableBound(type.element));
+      }
+      throw new UnsupportedError('Unexpected type $type');
+    }
+
+    void addClass(ClassEntity cls) {
+      if (cls != null) {
+        classesDirectlyNeedingRuntimeType.add(cls);
+      }
+      if (cls == commonElements.objectClass) {
+        neededOnAll = true;
+      }
+      if (cls == commonElements.functionClass) {
+        neededOnFunctions = true;
+      }
+    }
+
+    for (RuntimeTypeUse runtimeTypeUse in backendUsage.runtimeTypeUses) {
+      switch (runtimeTypeUse.kind) {
+        case RuntimeTypeUseKind.string:
+          if (!options.laxRuntimeTypeToString) {
+            impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
+          }
+
+          break;
+        case RuntimeTypeUseKind.equals:
+          Iterable<ClassEntity> receiverClasses =
+              impliedClasses(runtimeTypeUse.receiverType);
+          Iterable<ClassEntity> argumentClasses =
+              impliedClasses(runtimeTypeUse.argumentType);
+
+          for (ClassEntity receiverClass in receiverClasses) {
+            for (ClassEntity argumentClass in argumentClasses) {
+              // TODO(johnniwinther): Special case use of `this.runtimeType`.
+              SubclassResult result = closedWorld.classHierarchy
+                  .commonSubclasses(receiverClass, ClassQuery.SUBTYPE,
+                      argumentClass, ClassQuery.SUBTYPE);
+              switch (result.kind) {
+                case SubclassResultKind.EMPTY:
+                  break;
+                case SubclassResultKind.EXACT1:
+                case SubclassResultKind.SUBCLASS1:
+                case SubclassResultKind.SUBTYPE1:
+                  addClass(receiverClass);
+                  break;
+                case SubclassResultKind.EXACT2:
+                case SubclassResultKind.SUBCLASS2:
+                case SubclassResultKind.SUBTYPE2:
+                  addClass(argumentClass);
+                  break;
+                case SubclassResultKind.SET:
+                  for (ClassEntity cls in result.classes) {
+                    addClass(cls);
+                    if (neededOnAll) break;
+                  }
+                  break;
+              }
+            }
+          }
+          break;
+        case RuntimeTypeUseKind.unknown:
+          impliedClasses(runtimeTypeUse.receiverType).forEach(addClass);
+          break;
+      }
+      if (neededOnAll) break;
+    }
+    Set<ClassEntity> allClassesNeedingRuntimeType;
+    if (neededOnAll) {
+      neededOnFunctions = true;
+      allClassesNeedingRuntimeType = closedWorld.classHierarchy
+          .subclassesOf(commonElements.objectClass)
+          .toSet();
+    } else {
+      allClassesNeedingRuntimeType = new Set<ClassEntity>();
+      // TODO(johnniwinther): Support this operation directly in
+      // [ClosedWorld] using the [ClassSet]s.
+      for (ClassEntity cls in classesDirectlyNeedingRuntimeType) {
+        if (!allClassesNeedingRuntimeType.contains(cls)) {
+          allClassesNeedingRuntimeType
+              .addAll(closedWorld.classHierarchy.subtypesOf(cls));
+        }
+      }
+    }
+    allClassesNeedingRuntimeType.forEach(potentiallyNeedTypeArguments);
+    if (neededOnFunctions) {
+      for (Local function in closedWorld.genericLocalFunctions) {
+        potentiallyNeedTypeArguments(function);
+      }
+      for (Local function in localFunctions) {
+        FunctionType functionType =
+            _elementEnvironment.getLocalFunctionType(function);
+        functionType.forEachTypeVariable((TypeVariableType typeVariable) {
+          Entity typeDeclaration = typeVariable.element.typeDeclaration;
+          if (!processedEntities.contains(typeDeclaration)) {
+            potentiallyNeedTypeArguments(typeDeclaration);
+          }
+        });
+        localFunctionsNeedingSignature.addAll(localFunctions);
+      }
+      for (FunctionEntity function
+          in closedWorld.closurizedMembersWithFreeTypeVariables) {
+        methodsNeedingSignature.add(function);
+        potentiallyNeedTypeArguments(function.enclosingClass);
+      }
+    }
+
+    Set<Selector> selectorsNeedingTypeArguments = new Set<Selector>();
+    typeVariableTests
+        .forEachAppliedSelector((Selector selector, Set<Entity> targets) {
+      for (Entity target in targets) {
+        if (methodsNeedingTypeArguments.contains(target) ||
+            localFunctionsNeedingTypeArguments.contains(target)) {
+          selectorsNeedingTypeArguments.add(selector);
+          if (retainDataForTesting) {
+            selectorsNeedingTypeArgumentsForTesting ??=
+                <Selector, Set<Entity>>{};
+            selectorsNeedingTypeArgumentsForTesting
+                .putIfAbsent(selector, () => new Set<Entity>())
+                .add(target);
+          } else {
+            return;
+          }
+        }
+      }
+    });
+    Set<int> instantiationsNeedingTypeArguments = new Set<int>();
+    typeVariableTests.forEachGenericInstantiation(
+        (GenericInstantiation instantiation, Set<Entity> targets) {
+      for (Entity target in targets) {
+        if (methodsNeedingTypeArguments.contains(target) ||
+            localFunctionsNeedingTypeArguments.contains(target)) {
+          // TODO(johnniwinther): Use the static type of the instantiated
+          // expression.
+          instantiationsNeedingTypeArguments
+              .add(instantiation.typeArguments.length);
+          if (retainDataForTesting) {
+            instantiationsNeedingTypeArgumentsForTesting ??=
+                <GenericInstantiation, Set<Entity>>{};
+            instantiationsNeedingTypeArgumentsForTesting
+                .putIfAbsent(instantiation, () => new Set<Entity>())
+                .add(target);
+          } else {
+            return;
+          }
+        }
+      }
+    });
+
+    if (retainDataForTesting) {
+      typeVariableTestsForTesting = typeVariableTests;
+    }
+
+    /*print(typeVariableTests.dump());
+    print('------------------------------------------------------------------');
+    print('classesNeedingTypeArguments:');
+    classesNeedingTypeArguments.forEach((e) => print('  $e'));
+    print('------------------------------------------------------------------');
+    print('methodsNeedingSignature:');
+    methodsNeedingSignature.forEach((e) => print('  $e'));
+    print('------------------------------------------------------------------');
+    print('methodsNeedingTypeArguments:');
+    methodsNeedingTypeArguments.forEach((e) => print('  $e'));
+    print('------------------------------------------------------------------');
+    print('localFunctionsNeedingSignature:');
+    localFunctionsNeedingSignature.forEach((e) => print('  $e'));
+    print('------------------------------------------------------------------');
+    print('localFunctionsNeedingTypeArguments:');
+    localFunctionsNeedingTypeArguments.forEach((e) => print('  $e'));
+    print('------------------------------------------------------------------');
+    print('selectorsNeedingTypeArguments:');
+    selectorsNeedingTypeArguments.forEach((e) => print('  $e'));
+    print('instantiationsNeedingTypeArguments: '
+        '$instantiationsNeedingTypeArguments');*/
+
+    return new RuntimeTypesNeedImpl(
+        _elementEnvironment,
+        classesNeedingTypeArguments,
+        methodsNeedingSignature,
+        methodsNeedingTypeArguments,
+        localFunctionsNeedingSignature,
+        localFunctionsNeedingTypeArguments,
+        selectorsNeedingTypeArguments,
+        instantiationsNeedingTypeArguments);
+  }
+}
diff --git a/pkg/compiler/lib/src/js_backend/specialized_checks.dart b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
new file mode 100644
index 0000000..4aacd02
--- /dev/null
+++ b/pkg/compiler/lib/src/js_backend/specialized_checks.dart
@@ -0,0 +1,78 @@
+// 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 '../common_elements.dart' show JCommonElements;
+import '../elements/entities.dart';
+import '../elements/types.dart';
+
+class SpecializedChecks {
+  static MemberEntity findAsCheck(
+      DartType dartType, bool isTypeError, JCommonElements commonElements) {
+    if (dartType is InterfaceType) {
+      if (dartType.typeArguments.isNotEmpty) return null;
+      return _findAsCheck(dartType.element, commonElements,
+          isTypeError: isTypeError, isNullable: true);
+    }
+    return null;
+  }
+
+  static MemberEntity _findAsCheck(
+      ClassEntity element, JCommonElements commonElements,
+      {bool isTypeError, bool isNullable}) {
+    if (element == commonElements.jsStringClass ||
+        element == commonElements.stringClass) {
+      if (isNullable) {
+        return isTypeError
+            ? commonElements.specializedCheckStringNullable
+            : commonElements.specializedAsStringNullable;
+      }
+      return null;
+    }
+
+    if (element == commonElements.jsBoolClass ||
+        element == commonElements.boolClass) {
+      if (isNullable) {
+        return isTypeError
+            ? commonElements.specializedCheckBoolNullable
+            : commonElements.specializedAsBoolNullable;
+      }
+      return null;
+    }
+
+    if (element == commonElements.jsDoubleClass ||
+        element == commonElements.doubleClass) {
+      if (isNullable) {
+        return isTypeError
+            ? commonElements.specializedCheckDoubleNullable
+            : commonElements.specializedAsDoubleNullable;
+      }
+      return null;
+    }
+
+    if (element == commonElements.jsNumberClass ||
+        element == commonElements.numClass) {
+      if (isNullable) {
+        return isTypeError
+            ? commonElements.specializedCheckNumNullable
+            : commonElements.specializedAsNumNullable;
+      }
+      return null;
+    }
+
+    if (element == commonElements.jsIntClass ||
+        element == commonElements.intClass ||
+        element == commonElements.jsUInt32Class ||
+        element == commonElements.jsUInt31Class ||
+        element == commonElements.jsPositiveIntClass) {
+      if (isNullable) {
+        return isTypeError
+            ? commonElements.specializedCheckIntNullable
+            : commonElements.specializedAsIntNullable;
+      }
+      return null;
+    }
+
+    return null;
+  }
+}
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index 62e9ab0..58e2b6c 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -99,6 +99,7 @@
           _compiler.reporter,
           _emitter,
           codegen.rtiEncoder,
+          codegen.rtiRecipeEncoder,
           closedWorld.elementEnvironment);
       typeTestRegistry = new TypeTestRegistry(
           _compiler.options, closedWorld.elementEnvironment);
@@ -129,6 +130,7 @@
           closedWorld.interceptorData,
           typeTestRegistry.rtiChecks,
           codegenInputs.rtiEncoder,
+          codegenInputs.rtiRecipeEncoder,
           codegenWorld.oneShotInterceptorData,
           _backendStrategy.customElementsCodegenAnalysis,
           _backendStrategy.generatedCode,
@@ -183,6 +185,9 @@
   /// Returns the JS name representing the type [e].
   jsAst.Name typeAccessNewRti(Entity e);
 
+  /// Returns the JS name representing the type variable [e].
+  jsAst.Name typeVariableAccessNewRti(TypeVariableEntity e);
+
   /// Returns the JS code for accessing the embedded [global].
   jsAst.Expression generateEmbeddedGlobalAccess(String global);
 
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 495613f..c0d9037 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -18,7 +18,6 @@
 import '../js_backend/native_data.dart';
 import '../js_backend/interceptor_data.dart';
 import '../native/enqueue.dart';
-import '../options.dart';
 import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
@@ -26,7 +25,6 @@
 import 'code_emitter_task.dart' show Emitter;
 
 class InterceptorStubGenerator {
-  final CompilerOptions _options;
   final CommonElements _commonElements;
   final Emitter _emitter;
   final NativeCodegenEnqueuer _nativeCodegenEnqueuer;
@@ -36,7 +34,6 @@
   final JClosedWorld _closedWorld;
 
   InterceptorStubGenerator(
-      this._options,
       this._commonElements,
       this._emitter,
       this._nativeCodegenEnqueuer,
@@ -304,7 +301,12 @@
       // checked mode, so we don't optimize the interceptor if the
       // _compiler has type assertions enabled.
       if (selector.isIndexSet &&
-          (_options.parameterCheckPolicy.isEmitted || !containsArray)) {
+          // TODO(johnniwinther): Support annotations on the possible targets
+          // and used their parameter check policy here.
+          (_closedWorld.annotationsData
+                  .getParameterCheckPolicy(null)
+                  .isEmitted ||
+              !containsArray)) {
         return null;
       }
       if (!containsArray && !containsString) {
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
index 0fa30eb..571486a 100644
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
@@ -17,6 +17,8 @@
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
 import '../js_backend/runtime_types.dart' show RuntimeTypesEncoder;
+import '../js_backend/runtime_types_new.dart' show RecipeEncoder;
+import '../js_model/type_recipe.dart' show TypeExpressionRecipe;
 import '../options.dart';
 
 import 'code_emitter_task.dart' show Emitter;
@@ -101,6 +103,7 @@
   final DiagnosticReporter reporter;
   final Emitter _emitter;
   final RuntimeTypesEncoder _rtiEncoder;
+  final RecipeEncoder _rtiRecipeEncoder;
   final JElementEnvironment _elementEnvironment;
 
   /// A map with a token per output unit for a list of expressions that
@@ -131,7 +134,7 @@
       <OutputUnit, Map<DartType, _BoundMetadataEntry>>{};
 
   MetadataCollector(this._options, this.reporter, this._emitter,
-      this._rtiEncoder, this._elementEnvironment);
+      this._rtiEncoder, this._rtiRecipeEncoder, this._elementEnvironment);
 
   List<jsAst.DeferredNumber> reifyDefaultArguments(
       FunctionEntity function, OutputUnit outputUnit) {
@@ -192,10 +195,19 @@
     return representation;
   }
 
+  jsAst.Expression _computeTypeRepresentationNewRti(DartType type) {
+    return _rtiRecipeEncoder.encodeGroundRecipe(
+        _emitter, TypeExpressionRecipe(type));
+  }
+
   jsAst.Expression addTypeInOutputUnit(DartType type, OutputUnit outputUnit) {
     _typesMap[outputUnit] ??= new Map<DartType, _BoundMetadataEntry>();
     return _typesMap[outputUnit].putIfAbsent(type, () {
-      return new _BoundMetadataEntry(_computeTypeRepresentation(type));
+      if (_options.experimentNewRti) {
+        return new _BoundMetadataEntry(_computeTypeRepresentationNewRti(type));
+      } else {
+        return new _BoundMetadataEntry(_computeTypeRepresentation(type));
+      }
     });
   }
 
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 247a1ef..c43eebb 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -9,6 +9,7 @@
 import '../elements/entities.dart';
 import '../js/js.dart' as js show Expression, Name, Statement, TokenFinalizer;
 import '../js/js_debug.dart' as js show nodeToString;
+import '../js_backend/runtime_types_codegen.dart';
 import 'js_emitter.dart' show MetadataCollector;
 
 class Program {
@@ -244,6 +245,7 @@
   final List<Method> methods;
   final List<Field> fields;
   final List<StubMethod> isChecks;
+  final ClassChecks classChecksNewRti;
   final List<StubMethod> checkedSetters;
 
   /// Stub methods for this class that are call stubs for getters.
@@ -293,6 +295,7 @@
       this.noSuchMethodStubs,
       this.checkedSetters,
       this.isChecks,
+      this.classChecksNewRti,
       this.functionTypeIndex,
       {this.hasRtiField,
       this.onlyForRti,
@@ -340,6 +343,7 @@
       List<StubMethod> callStubs,
       List<StubMethod> checkedSetters,
       List<StubMethod> isChecks,
+      ClassChecks classChecksNewRti,
       js.Expression functionTypeIndex,
       {bool hasRtiField,
       bool onlyForRti,
@@ -355,6 +359,7 @@
             const <StubMethod>[],
             checkedSetters,
             isChecks,
+            classChecksNewRti,
             functionTypeIndex,
             hasRtiField: hasRtiField,
             onlyForRti: onlyForRti,
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index 14ae576..c3b28b7 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -15,6 +15,7 @@
 import '../js_backend/native_data.dart';
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_new.dart' show RecipeEncoder;
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/codegen_world_builder.dart';
 import '../universe/selector.dart' show Selector;
@@ -33,6 +34,7 @@
   final NativeEmitter _nativeEmitter;
   final Namer _namer;
   final RuntimeTypesEncoder _rtiEncoder;
+  final RecipeEncoder _rtiRecipeEncoder; // `null` if not experimentNewRti.
   final NativeData _nativeData;
   final InterceptorData _interceptorData;
   final CodegenWorld _codegenWorld;
@@ -44,6 +46,7 @@
       this._nativeEmitter,
       this._namer,
       this._rtiEncoder,
+      this._rtiRecipeEncoder,
       this._nativeData,
       this._interceptorData,
       this._codegenWorld,
@@ -172,15 +175,22 @@
       for (TypeVariableType typeVariable
           in _closedWorld.elementEnvironment.getFunctionTypeVariables(member)) {
         if (selector.typeArgumentCount == 0) {
-          targetArguments[count++] = _rtiEncoder.getTypeRepresentation(
-              _emitter,
-              _closedWorld.elementEnvironment
-                  .getTypeVariableDefaultType(typeVariable.element),
-              (_) => _emitter.constantReference(
-                  // TODO(33422): Support type variables in default
-                  // types. Temporarily using the "any" type (encoded as -2) to
-                  // avoid failing on bounds checks.
-                  new IntConstantValue(new BigInt.from(-2))));
+          DartType defaultType = _closedWorld.elementEnvironment
+              .getTypeVariableDefaultType(typeVariable.element);
+          if (_rtiRecipeEncoder != null) {
+            jsAst.Expression typeRti = _rtiRecipeEncoder.evaluateRecipe(
+                _emitter,
+                _rtiRecipeEncoder.encodeRecipeWithVariablesReplaceByAny(
+                    _emitter, defaultType));
+            targetArguments[count++] = typeRti;
+          } else {
+            targetArguments[count++] = _rtiEncoder.getTypeRepresentation(
+                _emitter, defaultType, (_) => _emitter.constantReference(
+                    // TODO(33422): Support type variables in default
+                    // types. Temporarily using the "any" type (encoded as -2) to
+                    // avoid failing on bounds checks.
+                    new IntConstantValue(new BigInt.from(-2))));
+          }
         } else {
           String jsName = '\$${typeVariable.element.name}';
           stubParameters[parameterIndex++] = new jsAst.Parameter(jsName);
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
index 763bde2..83a7d37 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
@@ -89,7 +89,9 @@
         js.Name accessorName = _namer.fieldAccessorName(field);
         js.Name fieldName = _namer.fieldPropertyName(field);
         bool needsCheckedSetter = false;
-        if (_options.parameterCheckPolicy.isEmitted &&
+        if (_closedWorld.annotationsData
+                .getParameterCheckPolicy(field)
+                .isEmitted &&
             needsSetter &&
             !canAvoidGeneratedCheckedSetter(field)) {
           needsCheckedSetter = true;
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 0cc2993..e9decf2 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
@@ -27,8 +27,12 @@
 import '../../js_backend/namer.dart' show Namer, StringBackedName;
 import '../../js_backend/native_data.dart';
 import '../../js_backend/runtime_types.dart'
-    show RuntimeTypesChecks, RuntimeTypesNeed, RuntimeTypesEncoder;
+    show RuntimeTypesChecks, RuntimeTypesEncoder;
+import '../../js_backend/runtime_types_new.dart' show RecipeEncoder;
+import '../../js_backend/runtime_types_resolution.dart' show RuntimeTypesNeed;
 import '../../js_model/elements.dart' show JGeneratorBody, JSignatureMethod;
+import '../../js_model/type_recipe.dart'
+    show FullTypeEnvironmentStructure, TypeExpressionRecipe;
 import '../../native/enqueue.dart' show NativeCodegenEnqueuer;
 import '../../options.dart';
 import '../../universe/codegen_world_builder.dart';
@@ -69,6 +73,7 @@
   final InterceptorData _interceptorData;
   final RuntimeTypesChecks _rtiChecks;
   final RuntimeTypesEncoder _rtiEncoder;
+  final RecipeEncoder _rtiRecipeEncoder;
   final OneShotInterceptorData _oneShotInterceptorData;
   final CustomElementsCodegenAnalysis _customElementsCodegenAnalysis;
   final Map<MemberEntity, js.Expression> _generatedCode;
@@ -111,6 +116,7 @@
       this._interceptorData,
       this._rtiChecks,
       this._rtiEncoder,
+      this._rtiRecipeEncoder,
       this._oneShotInterceptorData,
       this._customElementsCodegenAnalysis,
       this._generatedCode,
@@ -337,7 +343,6 @@
 
   js.Expression _buildTypeToInterceptorMap() {
     InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
-        _options,
         _commonElements,
         _task.emitter,
         _nativeCodegenEnqueuer,
@@ -802,6 +807,7 @@
           callStubs,
           checkedSetters,
           isChecks,
+          _rtiChecks.requiredChecks[cls],
           typeTests.functionTypeIndex,
           isDirectlyInstantiated: isInstantiated,
           hasRtiField: hasRtiField,
@@ -818,6 +824,7 @@
           noSuchMethodStubs,
           checkedSetters,
           isChecks,
+          _rtiChecks.requiredChecks[cls],
           typeTests.functionTypeIndex,
           isDirectlyInstantiated: isInstantiated,
           hasRtiField: hasRtiField,
@@ -921,7 +928,8 @@
     js.Expression functionType;
     if (canTearOff) {
       OutputUnit outputUnit = _outputUnitData.outputUnitForMember(element);
-      functionType = _generateFunctionType(memberType, outputUnit);
+      functionType =
+          _generateFunctionType(element.enclosingClass, memberType, outputUnit);
     }
 
     FunctionEntity method = element;
@@ -950,12 +958,22 @@
         applyIndex: applyIndex);
   }
 
-  js.Expression _generateFunctionType(
+  js.Expression _generateFunctionType(ClassEntity /*?*/ enclosingClass,
       FunctionType type, OutputUnit outputUnit) {
     if (type.containsTypeVariables) {
-      js.Expression thisAccess = js.js(r'this.$receiver');
-      return _rtiEncoder.getSignatureEncoding(
-          _namer, _task.emitter, type, thisAccess);
+      if (_options.experimentNewRti) {
+        // TODO(sra): The recipe might reference class type variables. Collect
+        // these for the type metadata.
+        return _rtiRecipeEncoder.encodeRecipe(
+            _task.emitter,
+            FullTypeEnvironmentStructure(
+                classType: _elementEnvironment.getThisType(enclosingClass)),
+            TypeExpressionRecipe(type));
+      } else {
+        js.Expression thisAccess = js.js(r'this.$receiver');
+        return _rtiEncoder.getSignatureEncoding(
+            _namer, _task.emitter, type, thisAccess);
+      }
     } else {
       return _task.metadataCollector.reifyType(type, outputUnit);
     }
@@ -970,6 +988,7 @@
         _task.nativeEmitter,
         _namer,
         _rtiEncoder,
+        _options.experimentNewRti ? _rtiRecipeEncoder : null,
         _nativeData,
         _interceptorData,
         _codegenWorld,
@@ -1010,7 +1029,6 @@
 
   Iterable<StaticStubMethod> _generateGetInterceptorMethods() {
     InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
-        _options,
         _commonElements,
         _task.emitter,
         _nativeCodegenEnqueuer,
@@ -1115,7 +1133,6 @@
 
   Iterable<StaticStubMethod> _generateOneShotInterceptors() {
     InterceptorStubGenerator stubGenerator = new InterceptorStubGenerator(
-        _options,
         _commonElements,
         _task.emitter,
         _nativeCodegenEnqueuer,
@@ -1176,7 +1193,7 @@
     DartType type = _elementEnvironment.getFunctionType(element);
     if (needsTearOff) {
       OutputUnit outputUnit = _outputUnitData.outputUnitForMember(element);
-      functionType = _generateFunctionType(type, outputUnit);
+      functionType = _generateFunctionType(null, type, outputUnit);
     }
 
     FunctionEntity method = element;
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index d82e130..a11f5bd 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -13,14 +13,9 @@
 import '../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
 import '../js_backend/namer.dart' show Namer;
 import '../js_backend/runtime_types.dart'
-    show
-        ClassChecks,
-        ClassFunctionType,
-        OnVariableCallback,
-        RuntimeTypesChecks,
-        RuntimeTypesEncoder,
-        Substitution,
-        TypeCheck;
+    show RuntimeTypesChecks, RuntimeTypesEncoder, OnVariableCallback;
+import '../js_backend/runtime_types_codegen.dart'
+    show ClassChecks, ClassFunctionType, Substitution, TypeCheck;
 import '../js_emitter/sorter.dart';
 import '../util/util.dart' show Setlet;
 
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
index 8752178..cba78ea 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
@@ -92,6 +92,11 @@
   }
 
   @override
+  js.Name typeVariableAccessNewRti(TypeVariableEntity element) {
+    return _namer.globalNameForInterfaceTypeVariable(element);
+  }
+
+  @override
   js.Expression staticClosureAccess(FunctionEntity element) {
     return new js.Call(
         new js.PropertyAccess(_namer.readGlobalObjectForMember(element),
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 c2b4798..5882777 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
@@ -436,6 +436,9 @@
 // global type resources are available for generating constants.
 #embeddedGlobalsPart1;
 
+// Adds the subtype rules for the new RTI.
+#typeRules;
+
 // Instantiates all constants.
 #constants;
 
@@ -531,6 +534,9 @@
 // Builds the inheritance structure.
 #inheritance;
 
+// Adds the subtype rules for the new RTI.
+#typeRules;
+
 // Instantiates all constants of this deferred fragment.
 // Note that the constant-holder has been updated earlier and storing the
 // constant values in the constant-holder makes them available globally.
@@ -580,6 +586,12 @@
   final ModelEmitter _modelEmitter;
   final JClosedWorld _closedWorld;
   final CodegenWorld _codegenWorld;
+  RecipeEncoder _recipeEncoder;
+  RulesetEncoder _rulesetEncoder;
+
+  DartTypes get _dartTypes => _closedWorld.dartTypes;
+  JElementEnvironment get _elementEnvironment =>
+      _closedWorld.elementEnvironment;
 
   js.Name _call0Name, _call1Name, _call2Name;
   js.Name get call0Name =>
@@ -597,7 +609,21 @@
       this._constantEmitter,
       this._modelEmitter,
       this._closedWorld,
-      this._codegenWorld);
+      this._codegenWorld) {
+    if (_options.experimentNewRti) {
+      _recipeEncoder = RecipeEncoderImpl(
+          _closedWorld,
+          _options.disableRtiOptimization
+              ? TrivialRuntimeTypesSubstitutions(_closedWorld)
+              : RuntimeTypesImpl(_closedWorld),
+          _closedWorld.nativeData,
+          _closedWorld.elementEnvironment,
+          _closedWorld.commonElements,
+          _closedWorld.rtiNeed);
+      _rulesetEncoder =
+          RulesetEncoder(_closedWorld.dartTypes, _emitter, _recipeEncoder);
+    }
+  }
 
   js.Expression generateEmbeddedGlobalAccess(String global) =>
       _emitter.generateEmbeddedGlobalAccess(global);
@@ -667,6 +693,7 @@
           emitEmbeddedGlobalsPart1(program, deferredLoadingState),
       'embeddedGlobalsPart2':
           emitEmbeddedGlobalsPart2(program, deferredLoadingState),
+      'typeRules': emitTypeRules(fragment),
       'nativeSupport': program.needsNativeSupport
           ? emitNativeSupport(fragment)
           : new js.EmptyStatement(),
@@ -747,6 +774,7 @@
     var methodAliases = emitInstanceMethodAliases(fragment);
     var tearOffs = emitInstallTearOffs(fragment);
     var constants = emitConstants(fragment);
+    var typeRules = emitTypeRules(fragment);
     var staticNonFinalFields = emitStaticNonFinalFields(fragment);
     var lazyInitializers = emitLazilyInitializedStatics(fragment);
     // TODO(floitsch): only call emitNativeSupport if we need native.
@@ -788,6 +816,7 @@
       'inheritance': inheritance,
       'aliases': methodAliases,
       'tearOffs': tearOffs,
+      'typeRules': typeRules,
       'constants': constants,
       'staticNonFinalFields': staticNonFinalFields,
       'lazyStatics': lazyInitializers,
@@ -1910,6 +1939,28 @@
     return js.Block(statements);
   }
 
+  js.Statement emitTypeRules(Fragment fragment) {
+    if (!_options.experimentNewRti) return js.EmptyStatement();
+
+    Ruleset ruleset = Ruleset.empty();
+    Iterable<Class> classes =
+        fragment.libraries.expand((Library library) => library.classes);
+    classes.forEach((Class cls) {
+      if (cls.classChecksNewRti == null) return;
+      InterfaceType targetType = _elementEnvironment.getThisType(cls.element);
+      Iterable<InterfaceType> supertypes = cls.classChecksNewRti.checks.map(
+          (TypeCheck check) => _dartTypes.asInstanceOf(targetType, check.cls));
+      ruleset.add(targetType, supertypes);
+    });
+
+    FunctionEntity method = _closedWorld.commonElements.rtiAddRulesMethod;
+    return js.js.statement('#(init.#,JSON.parse(#));', [
+      _emitter.staticFunctionAccess(method),
+      RTI_UNIVERSE,
+      _rulesetEncoder.encodeRuleset(ruleset),
+    ]);
+  }
+
   /// Returns an expression that creates the initial Rti Universe.
   ///
   /// This needs to be kept in sync with `_Universe.create` in `dart:_rti`.
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 e5643a5..ef075cd 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
@@ -36,9 +36,10 @@
 import '../../common/tasks.dart';
 import '../../constants/values.dart'
     show ConstantValue, FunctionConstantValue, NullConstantValue;
-import '../../common_elements.dart' show CommonElements;
+import '../../common_elements.dart' show CommonElements, JElementEnvironment;
 import '../../dump_info.dart';
 import '../../elements/entities.dart';
+import '../../elements/types.dart';
 import '../../hash/sha1.dart' show Hasher;
 import '../../io/code_output.dart';
 import '../../io/location_provider.dart' show LocationCollector;
@@ -49,7 +50,9 @@
     show Namer, ConstantEmitter, StringBackedName;
 import '../../js_backend/js_interop_analysis.dart' as jsInteropAnalysis;
 import '../../js_backend/runtime_types.dart';
-import '../../js_backend/runtime_types_new.dart' show RecipeEncoder;
+import '../../js_backend/runtime_types_codegen.dart';
+import '../../js_backend/runtime_types_new.dart'
+    show RecipeEncoder, RecipeEncoderImpl, Ruleset, RulesetEncoder;
 import '../../options.dart';
 import '../../universe/codegen_world_builder.dart' show CodegenWorld;
 import '../../world.dart';
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index 7a2c9e4..01fa35a 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -8,10 +8,9 @@
 import '../common_elements.dart';
 import '../elements/entities.dart';
 import '../js_backend/runtime_types.dart'
-    show
-        RuntimeTypesChecks,
-        RuntimeTypesChecksBuilder,
-        RuntimeTypesSubstitutions;
+    show RuntimeTypesChecks, RuntimeTypesChecksBuilder;
+import '../js_backend/runtime_types_codegen.dart'
+    show RuntimeTypesSubstitutions;
 import '../options.dart';
 import '../universe/codegen_world_builder.dart';
 
diff --git a/pkg/compiler/lib/src/js_model/closure.dart b/pkg/compiler/lib/src/js_model/closure.dart
index 32f7f78..e0ebc2f 100644
--- a/pkg/compiler/lib/src/js_model/closure.dart
+++ b/pkg/compiler/lib/src/js_model/closure.dart
@@ -13,10 +13,10 @@
 import '../ir/closure.dart';
 import '../ir/element_map.dart';
 import '../ir/static_type_cache.dart';
+import '../js_backend/annotations.dart';
 import '../js_model/element_map.dart';
 import '../js_model/env.dart';
 import '../ordered_typeset.dart';
-import '../options.dart';
 import '../serialization/serialization.dart';
 import '../ssa/type_builder.dart';
 import '../universe/selector.dart';
@@ -151,7 +151,7 @@
 class ClosureDataBuilder {
   final JsToElementMap _elementMap;
   final GlobalLocalsMap _globalLocalsMap;
-  final CompilerOptions _options;
+  final AnnotationsData _annotationsData;
 
   /// Map of the scoping information that corresponds to a particular entity.
   Map<MemberEntity, ScopeInfo> _scopeMap = {};
@@ -163,7 +163,8 @@
   Map<ir.LocalFunction, ClosureRepresentationInfo>
       _localClosureRepresentationMap = {};
 
-  ClosureDataBuilder(this._elementMap, this._globalLocalsMap, this._options);
+  ClosureDataBuilder(
+      this._elementMap, this._globalLocalsMap, this._annotationsData);
 
   void _updateScopeBasedOnRtiNeed(KernelScopeInfo scope, ClosureRtiNeed rtiNeed,
       MemberEntity outermostEntity) {
@@ -174,16 +175,14 @@
             return true;
             break;
           case VariableUseKind.implicitCast:
-            if (_options.implicitDowncastCheckPolicy.isEmitted) {
+            if (_annotationsData
+                .getImplicitDowncastCheckPolicy(outermostEntity)
+                .isEmitted) {
               return true;
             }
             break;
           case VariableUseKind.localType:
-            if (_options.assignmentCheckPolicy.isEmitted) {
-              return true;
-            }
             break;
-
           case VariableUseKind.constructorTypeArgument:
             ConstructorEntity constructor =
                 _elementMap.getConstructor(usage.member);
@@ -213,7 +212,9 @@
             }
             break;
           case VariableUseKind.memberParameter:
-            if (_options.parameterCheckPolicy.isEmitted) {
+            if (_annotationsData
+                .getParameterCheckPolicy(outermostEntity)
+                .isEmitted) {
               return true;
             } else {
               FunctionEntity method = _elementMap.getMethod(usage.member);
@@ -223,7 +224,9 @@
             }
             break;
           case VariableUseKind.localParameter:
-            if (_options.parameterCheckPolicy.isEmitted) {
+            if (_annotationsData
+                .getParameterCheckPolicy(outermostEntity)
+                .isEmitted) {
               return true;
             } else if (rtiNeed
                 .localFunctionNeedsSignature(usage.localFunction)) {
@@ -231,26 +234,20 @@
             }
             break;
           case VariableUseKind.memberReturnType:
-            if (_options.assignmentCheckPolicy.isEmitted) {
+            FunctionEntity method = _elementMap.getMethod(usage.member);
+            if (rtiNeed.methodNeedsSignature(method)) {
               return true;
-            } else {
-              FunctionEntity method = _elementMap.getMethod(usage.member);
-              if (rtiNeed.methodNeedsSignature(method)) {
-                return true;
-              }
             }
             break;
           case VariableUseKind.localReturnType:
-            if (_options.assignmentCheckPolicy.isEmitted) {
-              return true;
-            } else if (rtiNeed
-                .localFunctionNeedsSignature(usage.localFunction)) {
+            if (rtiNeed.localFunctionNeedsSignature(usage.localFunction)) {
               return true;
             }
             break;
           case VariableUseKind.fieldType:
-            if (_options.assignmentCheckPolicy.isEmitted ||
-                _options.parameterCheckPolicy.isEmitted) {
+            if (_annotationsData
+                .getParameterCheckPolicy(outermostEntity)
+                .isEmitted) {
               return true;
             }
             break;
diff --git a/pkg/compiler/lib/src/js_model/element_map_impl.dart b/pkg/compiler/lib/src/js_model/element_map_impl.dart
index 692c95e..43985c5 100644
--- a/pkg/compiler/lib/src/js_model/element_map_impl.dart
+++ b/pkg/compiler/lib/src/js_model/element_map_impl.dart
@@ -85,6 +85,7 @@
   KernelDartTypes _types;
   ir.TypeEnvironment _typeEnvironment;
   ir.ClassHierarchy _classHierarchy;
+  ConstantValuefier _constantValuefier;
 
   /// Library environment. Used for fast lookup.
   JProgramEnv programEnv;
@@ -143,6 +144,7 @@
     _constantEnvironment = new JsConstantEnvironment(this, environment);
     _typeConverter = new DartTypeConverter(this);
     _types = new KernelDartTypes(this);
+    _constantValuefier = new ConstantValuefier(this);
 
     programEnv = _elementMap.env.convert();
     for (int libraryIndex = 0;
@@ -322,6 +324,7 @@
     _constantEnvironment = new JsConstantEnvironment(this, environment);
     _typeConverter = new DartTypeConverter(this);
     _types = new KernelDartTypes(this);
+    _constantValuefier = new ConstantValuefier(this);
 
     source.registerComponentLookup(new ComponentLookup(component));
     _EntityLookup entityLookup = new _EntityLookup();
@@ -1451,7 +1454,7 @@
   ConstantValue getConstantValue(ir.Expression node,
       {bool requireConstant: true, bool implicitNull: false}) {
     if (node is ir.ConstantExpression) {
-      return node.constant.accept(new ConstantValuefier(this));
+      return _constantValuefier.visitConstant(node.constant);
     }
 
     ConstantExpression constant;
diff --git a/pkg/compiler/lib/src/js_model/js_strategy.dart b/pkg/compiler/lib/src/js_model/js_strategy.dart
index f794857..339c61f 100644
--- a/pkg/compiler/lib/src/js_model/js_strategy.dart
+++ b/pkg/compiler/lib/src/js_model/js_strategy.dart
@@ -34,6 +34,7 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/namer.dart';
 import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_codegen.dart';
 import '../js_backend/runtime_types_new.dart'
     show RecipeEncoder, RecipeEncoderImpl;
 import '../js_emitter/code_emitter_task.dart' show ModularEmitter;
@@ -169,7 +170,7 @@
         closedWorld.annotationsData);
     GlobalLocalsMap _globalLocalsMap = new GlobalLocalsMap();
     ClosureDataBuilder closureDataBuilder = new ClosureDataBuilder(
-        _elementMap, _globalLocalsMap, _compiler.options);
+        _elementMap, _globalLocalsMap, closedWorld.annotationsData);
     JsClosedWorldBuilder closedWorldBuilder = new JsClosedWorldBuilder(
         _elementMap,
         _globalLocalsMap,
@@ -256,7 +257,6 @@
         commonElements, elementEnvironment, closedWorld.nativeData);
     return new CodegenEnqueuer(
         task,
-        _compiler.options,
         new CodegenWorldBuilderImpl(
             closedWorld,
             _compiler.abstractValueStrategy.createSelectorStrategy(),
@@ -271,13 +271,15 @@
             // tracing.
             new ComponentLookup(_elementMap.programEnv.mainComponent)),
         new CodegenEnqueuerListener(
+            _compiler.options,
             elementEnvironment,
             commonElements,
             impacts,
             closedWorld.backendUsage,
             closedWorld.rtiNeed,
             customElementsCodegenAnalysis,
-            nativeCodegenEnqueuer));
+            nativeCodegenEnqueuer),
+        closedWorld.annotationsData);
   }
 
   /// Called before the compiler starts running the codegen enqueuer.
@@ -308,7 +310,6 @@
         closedWorld.commonElements, _compiler.options.experimentNewRti);
 
     _codegenImpactTransformer = new CodegenImpactTransformer(
-        _compiler.options,
         closedWorld,
         closedWorld.elementEnvironment,
         closedWorld.commonElements,
diff --git a/pkg/compiler/lib/src/js_model/js_world.dart b/pkg/compiler/lib/src/js_model/js_world.dart
index b1beeb8..c24c3a9 100644
--- a/pkg/compiler/lib/src/js_model/js_world.dart
+++ b/pkg/compiler/lib/src/js_model/js_world.dart
@@ -24,7 +24,7 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../js_model/locals.dart';
 import '../ordered_typeset.dart';
 import '../options.dart';
@@ -163,7 +163,7 @@
         source.readClassMap(() => source.readClasses().toSet());
 
     AnnotationsData annotationsData =
-        new AnnotationsData.readFromDataSource(source);
+        new AnnotationsData.readFromDataSource(options, source);
 
     ClosureData closureData =
         new ClosureData.readFromDataSource(elementMap, source);
diff --git a/pkg/compiler/lib/src/js_model/js_world_builder.dart b/pkg/compiler/lib/src/js_model/js_world_builder.dart
index 805c178..152ee8d 100644
--- a/pkg/compiler/lib/src/js_model/js_world_builder.dart
+++ b/pkg/compiler/lib/src/js_model/js_world_builder.dart
@@ -22,7 +22,7 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../kernel/kelements.dart';
 import '../native/behavior.dart';
 import '../options.dart';
@@ -196,7 +196,7 @@
         JFieldAnalysis.from(closedWorld, map, _options);
 
     AnnotationsDataImpl oldAnnotationsData = closedWorld.annotationsData;
-    AnnotationsData annotationsData = new AnnotationsDataImpl(
+    AnnotationsData annotationsData = new AnnotationsDataImpl(_options,
         map.toBackendMemberMap(oldAnnotationsData.pragmaAnnotations, identity));
 
     OutputUnitData outputUnitData =
diff --git a/pkg/compiler/lib/src/js_model/type_recipe.dart b/pkg/compiler/lib/src/js_model/type_recipe.dart
index 2c72265..ed1543c 100644
--- a/pkg/compiler/lib/src/js_model/type_recipe.dart
+++ b/pkg/compiler/lib/src/js_model/type_recipe.dart
@@ -12,7 +12,30 @@
 /// A type environment maps type parameter variables to type values. The type
 /// variables are mostly elided in the runtime representation, replaced by
 /// indexes into the reified environment.
-abstract class TypeEnvironmentStructure {}
+abstract class TypeEnvironmentStructure {
+  /// Structural equality on [TypeEnvironmentStructure].
+  static bool same(TypeEnvironmentStructure a, TypeEnvironmentStructure b) {
+    if (a is SingletonTypeEnvironmentStructure) {
+      if (b is SingletonTypeEnvironmentStructure) {
+        return a.variable == b.variable;
+      }
+      return false;
+    }
+    return _sameFullStructure(a, b);
+  }
+
+  static bool _sameFullStructure(
+      FullTypeEnvironmentStructure a, FullTypeEnvironmentStructure b) {
+    if (a.classType != b.classType) return false;
+    List<TypeVariableType> aBindings = a.bindings;
+    List<TypeVariableType> bBindings = b.bindings;
+    if (aBindings.length != bBindings.length) return false;
+    for (int i = 0; i < aBindings.length; i++) {
+      if (aBindings[i] != bBindings[i]) return false;
+    }
+    return true;
+  }
+}
 
 /// A singleton type environment maps a binds a single value.
 class SingletonTypeEnvironmentStructure extends TypeEnvironmentStructure {
@@ -38,7 +61,36 @@
 
 /// A TypeRecipe is evaluated against a type environment to produce either a
 /// type, or another type environment.
-abstract class TypeRecipe {}
+abstract class TypeRecipe {
+  /// Returns `true` is [recipeB] evaluated in an environment described by
+  /// [structureB] gives the same type as [recipeA] evaluated in environment
+  /// described by [structureA].
+  static bool yieldsSameType(
+      TypeRecipe recipeA,
+      TypeEnvironmentStructure structureA,
+      TypeRecipe recipeB,
+      TypeEnvironmentStructure structureB) {
+    if (recipeA == recipeB &&
+        TypeEnvironmentStructure.same(structureA, structureB)) {
+      return true;
+    }
+
+    // TODO(sra): Type recipes that are different but equal modulo naming also
+    // yield the same type, e.g. `List<X> @X` and `List<Y> @Y`.
+    return false;
+  }
+
+  /// Returns `true` if [recipe] evaluates in an environment with [structure] to
+  /// the environment.
+  static bool isIdentity(
+      TypeRecipe recipe, TypeEnvironmentStructure structure) {
+    if (structure is SingletonTypeEnvironmentStructure &&
+        recipe is TypeExpressionRecipe) {
+      if (structure.variable == recipe.type) return true;
+    }
+    return false;
+  }
+}
 
 /// A recipe that yields a reified type.
 class TypeExpressionRecipe extends TypeRecipe {
@@ -47,6 +99,11 @@
   TypeExpressionRecipe(this.type);
 
   @override
+  bool operator ==(other) {
+    return other is TypeExpressionRecipe && type == other.type;
+  }
+
+  @override
   String toString() => 'TypeExpressionRecipe($type)';
 }
 
@@ -61,6 +118,11 @@
   SingletonTypeEnvironmentRecipe(this.type);
 
   @override
+  bool operator ==(other) {
+    return other is SingletonTypeEnvironmentRecipe && type == other.type;
+  }
+
+  @override
   String toString() => 'SingletonTypeEnvironmentRecipe($type)';
 }
 
@@ -81,5 +143,21 @@
   FullTypeEnvironmentRecipe({this.classType, this.types = const []});
 
   @override
+  bool operator ==(other) {
+    return other is FullTypeEnvironmentRecipe && _equal(this, other);
+  }
+
+  static bool _equal(FullTypeEnvironmentRecipe a, FullTypeEnvironmentRecipe b) {
+    if (a.classType != b.classType) return false;
+    List<DartType> aTypes = a.types;
+    List<DartType> bTypes = b.types;
+    if (aTypes.length != bTypes.length) return false;
+    for (int i = 0; i < aTypes.length; i++) {
+      if (aTypes[i] != bTypes[i]) return false;
+    }
+    return true;
+  }
+
+  @override
   String toString() => 'FullTypeEnvironmentRecipe($classType, $types)';
 }
diff --git a/pkg/compiler/lib/src/kernel/dart2js_target.dart b/pkg/compiler/lib/src/kernel/dart2js_target.dart
index 3d32f5f..5dcee7e 100644
--- a/pkg/compiler/lib/src/kernel/dart2js_target.dart
+++ b/pkg/compiler/lib/src/kernel/dart2js_target.dart
@@ -79,14 +79,12 @@
   bool get errorOnUnexactWebIntLiterals => true;
 
   @override
-  bool get supportsSetLiterals => true;
-
-  @override
   void performModularTransformationsOnLibraries(
       ir.Component component,
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<ir.Library> libraries,
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)}) {}
 
@@ -149,7 +147,7 @@
 
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      const Dart2jsConstantsBackend();
+      const Dart2jsConstantsBackend(supportsUnevaluatedConstants: true);
 }
 
 // TODO(sigmund): this "extraRequiredLibraries" needs to be removed...
@@ -196,7 +194,10 @@
 };
 
 class Dart2jsConstantsBackend extends ConstantsBackend {
-  const Dart2jsConstantsBackend();
+  @override
+  final bool supportsUnevaluatedConstants;
+
+  const Dart2jsConstantsBackend({this.supportsUnevaluatedConstants});
 
   @override
   NumberSemantics get numberSemantics => NumberSemantics.js;
diff --git a/pkg/compiler/lib/src/kernel/element_map_impl.dart b/pkg/compiler/lib/src/kernel/element_map_impl.dart
index eba6bd9..5818ce3 100644
--- a/pkg/compiler/lib/src/kernel/element_map_impl.dart
+++ b/pkg/compiler/lib/src/kernel/element_map_impl.dart
@@ -760,9 +760,7 @@
     return _constantEvaluator ??= new Dart2jsConstantEvaluator(typeEnvironment,
         (ir.LocatedMessage message, List<ir.LocatedMessage> context) {
       reportLocatedMessage(reporter, message, context);
-    },
-        enableAsserts: options.enableUserAssertions,
-        environment: _environment.toMap());
+    }, environment: _environment.toMap());
   }
 
   @override
@@ -1034,7 +1032,7 @@
         }
         return null;
       } else {
-        return constant.accept(_constantValuefier);
+        return _constantValuefier.visitConstant(constant);
       }
     }
 
diff --git a/pkg/compiler/lib/src/kernel/kernel_impact.dart b/pkg/compiler/lib/src/kernel/kernel_impact.dart
index 5415e98..78da253 100644
--- a/pkg/compiler/lib/src/kernel/kernel_impact.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_impact.dart
@@ -58,8 +58,7 @@
       VariableScopeModel variableScopeModel,
       this._annotations,
       this._constantValuefier)
-      : this.impactBuilder =
-            new ResolutionWorldImpactBuilder('${currentMember}'),
+      : this.impactBuilder = new ResolutionWorldImpactBuilder(currentMember),
         super(elementMap.typeEnvironment, elementMap.classHierarchy,
             variableScopeModel);
 
@@ -95,8 +94,7 @@
 
   KernelImpactConverter(this.elementMap, this.currentMember, this.reporter,
       this._options, this._constantValuefier)
-      : this.impactBuilder =
-            new ResolutionWorldImpactBuilder('${currentMember}');
+      : this.impactBuilder = new ResolutionWorldImpactBuilder(currentMember);
 
   @override
   ir.TypeEnvironment get typeEnvironment => elementMap.typeEnvironment;
@@ -806,7 +804,7 @@
       ir.Field node, ConstantReference constant) {
     impactBuilder.registerStaticUse(new StaticUse.fieldConstantInit(
         elementMap.getField(node),
-        constant.constant.accept(_constantValuefier)));
+        _constantValuefier.visitConstant(constant.constant)));
   }
 
   @override
diff --git a/pkg/compiler/lib/src/kernel/kernel_strategy.dart b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
index 4ecf6d3..80ea69f 100644
--- a/pkg/compiler/lib/src/kernel/kernel_strategy.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_strategy.dart
@@ -34,7 +34,7 @@
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
 import '../js_backend/resolution_listener.dart';
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../kernel/dart2js_target.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
 import '../native/resolver.dart';
@@ -158,8 +158,14 @@
     ClassQueries classQueries = new KernelClassQueries(elementMap);
     ClassHierarchyBuilder classHierarchyBuilder =
         new ClassHierarchyBuilder(commonElements, classQueries);
+    AnnotationsDataBuilder annotationsDataBuilder =
+        new AnnotationsDataBuilder();
+    // TODO(johnniwinther): This is a hack. The annotation data is built while
+    // using it. With CFE constants the annotations data can be built fully
+    // before creating the resolution enqueuer.
+    AnnotationsData annotationsData = new AnnotationsDataImpl(
+        compiler.options, annotationsDataBuilder.pragmaAnnotations);
     impactTransformer = new JavaScriptImpactTransformer(
-        compiler.options,
         elementEnvironment,
         commonElements,
         impacts,
@@ -168,15 +174,13 @@
         _backendUsageBuilder,
         _customElementsResolutionAnalysis,
         rtiNeedBuilder,
-        classHierarchyBuilder);
+        classHierarchyBuilder,
+        annotationsData);
     InterceptorDataBuilder interceptorDataBuilder =
         new InterceptorDataBuilderImpl(
             nativeBasicData, elementEnvironment, commonElements);
-    AnnotationsDataBuilder annotationsDataBuilder =
-        new AnnotationsDataBuilder();
     return new ResolutionEnqueuer(
         task,
-        compiler.options,
         compiler.reporter,
         new ResolutionEnqueuerListener(
             compiler.options,
@@ -220,7 +224,8 @@
             compiler.impactCache,
             _fieldAnalysis,
             _modularStrategy,
-            _irAnnotationData));
+            _irAnnotationData),
+        annotationsData);
   }
 
   @override
@@ -288,8 +293,7 @@
   RuntimeTypesNeedBuilder _createRuntimeTypesNeedBuilder() {
     return _runtimeTypesNeedBuilder ??= _options.disableRtiOptimization
         ? const TrivialRuntimeTypesNeedBuilder()
-        : new RuntimeTypesNeedBuilderImpl(
-            elementEnvironment, _elementMap.types);
+        : new RuntimeTypesNeedBuilderImpl(elementEnvironment);
   }
 
   RuntimeTypesNeedBuilder get runtimeTypesNeedBuilderForTesting =>
diff --git a/pkg/compiler/lib/src/kernel/kernel_world.dart b/pkg/compiler/lib/src/kernel/kernel_world.dart
index bf9f1b0..f9b990d 100644
--- a/pkg/compiler/lib/src/kernel/kernel_world.dart
+++ b/pkg/compiler/lib/src/kernel/kernel_world.dart
@@ -12,7 +12,7 @@
 import '../js_backend/interceptor_data.dart';
 import '../js_backend/native_data.dart';
 import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../options.dart';
 import '../universe/class_hierarchy.dart';
 import '../universe/member_usage.dart';
diff --git a/pkg/compiler/lib/src/kernel/loader.dart b/pkg/compiler/lib/src/kernel/loader.dart
index d1cd03c..bfdf6ee 100644
--- a/pkg/compiler/lib/src/kernel/loader.dart
+++ b/pkg/compiler/lib/src/kernel/loader.dart
@@ -105,8 +105,7 @@
             _options.librariesSpecificationUri,
             dependencies,
             _options.packageConfig,
-            experimentalFlags: _options.languageExperiments,
-            enableAsserts: _options.enableUserAssertions);
+            experimentalFlags: _options.languageExperiments);
         component = await fe.compile(
             initializedCompilerState,
             false,
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index 74bf19a..c829130 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -255,34 +255,34 @@
   /// Whether to omit implicit strong mode checks.
   bool omitImplicitChecks = false;
 
-  /// Whether to omit as casts.
+  /// Whether to omit as casts by default.
   bool omitAsCasts = false;
 
   /// Whether to omit class type arguments only needed for `toString` on
   /// `Object.runtimeType`.
   bool laxRuntimeTypeToString = false;
 
-  /// What should the compiler do with type assertions of assignments.
-  ///
-  /// This is an internal configuration option derived from other flags.
-  CheckPolicy assignmentCheckPolicy;
-
   /// What should the compiler do with parameter type assertions.
   ///
   /// This is an internal configuration option derived from other flags.
-  CheckPolicy parameterCheckPolicy;
+  CheckPolicy defaultParameterCheckPolicy;
 
   /// What should the compiler do with implicit downcasts.
   ///
   /// This is an internal configuration option derived from other flags.
-  CheckPolicy implicitDowncastCheckPolicy;
+  CheckPolicy defaultImplicitDowncastCheckPolicy;
 
   /// What the compiler should do with a boolean value in a condition context
   /// when the language specification says it is a runtime error for it to be
   /// null.
   ///
   /// This is an internal configuration option derived from other flags.
-  CheckPolicy conditionCheckPolicy;
+  CheckPolicy defaultConditionCheckPolicy;
+
+  /// What should the compiler do with explicit casts.
+  ///
+  /// This is an internal configuration option derived from other flags.
+  CheckPolicy defaultExplicitCastCheckPolicy;
 
   /// Whether to generate code compliant with content security policy (CSP).
   bool useContentSecurityPolicy = false;
@@ -351,9 +351,12 @@
 
   /// Create an options object by parsing flags from [options].
   static CompilerOptions parse(List<String> options,
-      {Uri librariesSpecificationUri, Uri platformBinaries}) {
+      {Uri librariesSpecificationUri,
+      Uri platformBinaries,
+      void Function(String) onError,
+      void Function(String) onWarning}) {
     Map<fe.ExperimentalFlag, bool> languageExperiments =
-        _extractExperiments(options);
+        _extractExperiments(options, onError: onError, onWarning: onWarning);
     if (equalMaps(languageExperiments, fe.defaultExperimentalFlags)) {
       platformBinaries ??= fe.computePlatformBinariesLocation();
     }
@@ -470,6 +473,7 @@
     if (benchmarkingExperiment) {
       // TODO(sra): Set flags implied by '--benchmarking-x'. Initially this will
       // be --experiment-new-rti, and later NNBD.
+      experimentNewRti = true;
     }
 
     if (optimizationLevel != null) {
@@ -492,15 +496,19 @@
 
     // Strong mode always trusts type annotations (inferred or explicit), so
     // assignments checks should be trusted.
-    assignmentCheckPolicy = CheckPolicy.trusted;
     if (omitImplicitChecks) {
-      parameterCheckPolicy = CheckPolicy.trusted;
-      implicitDowncastCheckPolicy = CheckPolicy.trusted;
-      conditionCheckPolicy = CheckPolicy.trusted;
+      defaultParameterCheckPolicy = CheckPolicy.trusted;
+      defaultImplicitDowncastCheckPolicy = CheckPolicy.trusted;
+      defaultConditionCheckPolicy = CheckPolicy.trusted;
     } else {
-      parameterCheckPolicy = CheckPolicy.checked;
-      implicitDowncastCheckPolicy = CheckPolicy.checked;
-      conditionCheckPolicy = CheckPolicy.checked;
+      defaultParameterCheckPolicy = CheckPolicy.checked;
+      defaultImplicitDowncastCheckPolicy = CheckPolicy.checked;
+      defaultConditionCheckPolicy = CheckPolicy.checked;
+    }
+    if (omitAsCasts) {
+      defaultExplicitCastCheckPolicy = CheckPolicy.trusted;
+    } else {
+      defaultExplicitCastCheckPolicy = CheckPolicy.checked;
     }
 
     if (_disableMinification) {
@@ -602,11 +610,14 @@
   return stringUris.map(Uri.parse).toList();
 }
 
-Map<fe.ExperimentalFlag, bool> _extractExperiments(List<String> options) {
+Map<fe.ExperimentalFlag, bool> _extractExperiments(List<String> options,
+    {void Function(String) onError, void Function(String) onWarning}) {
   List<String> experiments =
       _extractOptionalCsvOption(options, Flags.enableLanguageExperiments);
-  return fe.parseExperimentalFlags(
-      experiments, (String error) => throw new ArgumentError(error));
+  onError ??= (String error) => throw new ArgumentError(error);
+  onWarning ??= (String warning) => print(warning);
+  return fe.parseExperimentalFlags(fe.parseExperimentalArguments(experiments),
+      onError: onError, onWarning: onWarning);
 }
 
 const String _UNDETERMINED_BUILD_ID = "build number could not be determined";
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index 9fdb9bb..e64c8ee 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -6,7 +6,7 @@
 
 import '../common/resolution.dart' show ResolutionImpact;
 import '../constants/expressions.dart';
-import '../elements/entities.dart' show ClassEntity;
+import '../elements/entities.dart' show ClassEntity, MemberEntity;
 import '../universe/feature.dart';
 import '../universe/world_impact.dart' show WorldImpact, WorldImpactBuilderImpl;
 import '../util/enumset.dart' show EnumSet;
@@ -14,7 +14,8 @@
 
 class ResolutionWorldImpactBuilder extends WorldImpactBuilderImpl
     implements ResolutionImpact {
-  final String name;
+  @override
+  final MemberEntity member;
   EnumSet<Feature> _features;
   Setlet<MapLiteralUse> _mapLiterals;
   Setlet<SetLiteralUse> _setLiterals;
@@ -26,7 +27,7 @@
   Set<RuntimeTypeUse> _runtimeTypeUses;
   Set<GenericInstantiation> _genericInstantiations;
 
-  ResolutionWorldImpactBuilder(this.name);
+  ResolutionWorldImpactBuilder(this.member);
 
   @override
   bool get isEmpty => false;
@@ -144,7 +145,7 @@
   @override
   String toString() {
     StringBuffer sb = new StringBuffer();
-    sb.write('ResolutionWorldImpactBuilder($name)');
+    sb.write('ResolutionWorldImpactBuilder($member)');
     WorldImpact.printOn(sb, this);
     if (_features != null) {
       sb.write('\n features:');
diff --git a/pkg/compiler/lib/src/serialization/abstract_sink.dart b/pkg/compiler/lib/src/serialization/abstract_sink.dart
index 484d24f..88c73d0 100644
--- a/pkg/compiler/lib/src/serialization/abstract_sink.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_sink.dart
@@ -31,6 +31,7 @@
   IndexedSink<Uri> _uriIndex;
   IndexedSink<ir.Member> _memberNodeIndex;
   IndexedSink<ImportEntity> _importIndex;
+  IndexedSink<ConstantValue> _constantIndex;
 
   Map<Type, IndexedSink> _generalCaches = {};
 
@@ -49,6 +50,7 @@
     _uriIndex = new IndexedSink<Uri>(this);
     _memberNodeIndex = new IndexedSink<ir.Member>(this);
     _importIndex = new IndexedSink<ImportEntity>(this);
+    _constantIndex = new IndexedSink<ConstantValue>(this);
   }
 
   @override
@@ -293,6 +295,19 @@
     }
   }
 
+  _MemberData _getMemberData(ir.TreeNode node) {
+    ir.TreeNode member = node;
+    while (member is! ir.Member) {
+      if (member == null) {
+        throw new UnsupportedError("No enclosing member of TreeNode "
+            "$node (${node.runtimeType})");
+      }
+      member = member.parent;
+    }
+    _writeMemberNode(member);
+    return _memberData[member] ??= new _MemberData(member);
+  }
+
   void _writeTreeNode(ir.TreeNode value, _MemberData memberData) {
     if (value is ir.Class) {
       _writeEnumInternal(_TreeNodeKind.cls);
@@ -312,24 +327,14 @@
       _writeTypeParameter(value, memberData);
     } else if (value is ConstantReference) {
       _writeEnumInternal(_TreeNodeKind.constant);
+      memberData ??= _getMemberData(value.expression);
       _writeTreeNode(value.expression, memberData);
-      _ConstantNodeIndexerVisitor indexer = new _ConstantNodeIndexerVisitor();
-      value.expression.constant.accept(indexer);
-      _writeIntInternal(indexer.getIndex(value.constant));
+      int index =
+          memberData.getIndexByConstant(value.expression, value.constant);
+      _writeIntInternal(index);
     } else {
       _writeEnumInternal(_TreeNodeKind.node);
-      if (memberData == null) {
-        ir.TreeNode member = value;
-        while (member is! ir.Member) {
-          if (member == null) {
-            throw new UnsupportedError("No enclosing member of TreeNode "
-                "$value (${value.runtimeType})");
-          }
-          member = member.parent;
-        }
-        _writeMemberNode(member);
-        memberData = _memberData[member] ??= new _MemberData(member);
-      }
+      memberData ??= _getMemberData(value);
       int index = memberData.getIndexByTreeNode(value);
       assert(
           index != null,
@@ -405,6 +410,7 @@
     _entityWriter.writeMemberToDataSink(this, value);
   }
 
+  @override
   void writeTypeVariable(IndexedTypeVariable value) {
     _entityWriter.writeTypeVariableToDataSink(this, value);
   }
@@ -464,6 +470,10 @@
   }
 
   void _writeConstant(ConstantValue value) {
+    _constantIndex.write(value, _writeConstantInternal);
+  }
+
+  void _writeConstantInternal(ConstantValue value) {
     _writeEnumInternal(value.kind);
     switch (value.kind) {
       case ConstantValueKind.BOOL:
diff --git a/pkg/compiler/lib/src/serialization/abstract_source.dart b/pkg/compiler/lib/src/serialization/abstract_source.dart
index a69e834..4dbc87f 100644
--- a/pkg/compiler/lib/src/serialization/abstract_source.dart
+++ b/pkg/compiler/lib/src/serialization/abstract_source.dart
@@ -19,6 +19,7 @@
   IndexedSource<Uri> _uriIndex;
   IndexedSource<_MemberData> _memberNodeIndex;
   IndexedSource<ImportEntity> _importIndex;
+  IndexedSource<ConstantValue> _constantIndex;
 
   Map<Type, IndexedSource> _generalCaches = {};
 
@@ -30,6 +31,7 @@
     _uriIndex = new IndexedSource<Uri>(this);
     _memberNodeIndex = new IndexedSource<_MemberData>(this);
     _importIndex = new IndexedSource<ImportEntity>(this);
+    _constantIndex = new IndexedSource<ConstantValue>(this);
   }
 
   @override
@@ -138,6 +140,7 @@
     return _entityReader.readMemberFromDataSource(this, entityLookup);
   }
 
+  @override
   IndexedTypeVariable readTypeVariable() {
     return _entityReader.readTypeVariableFromDataSource(this, entityLookup);
   }
@@ -532,6 +535,10 @@
   }
 
   ConstantValue _readConstant() {
+    return _constantIndex.read(_readConstantInternal);
+  }
+
+  ConstantValue _readConstantInternal() {
     ConstantValueKind kind = _readEnumInternal(ConstantValueKind.values);
     switch (kind) {
       case ConstantValueKind.BOOL:
@@ -618,21 +625,19 @@
       case _TreeNodeKind.typeParameter:
         return _readTypeParameter(memberData);
       case _TreeNodeKind.constant:
-        // TODO(johnniwinther): Support serialization within a member context
-        // and use this to temporarily cache constant node indices.
+        memberData ??= _readMemberData();
         ir.ConstantExpression expression = _readTreeNode(memberData);
-        _ConstantNodeIndexerVisitor indexer = new _ConstantNodeIndexerVisitor();
-        expression.constant.accept(indexer);
-        ir.Constant constant = indexer.getConstant(_readIntInternal());
+        ir.Constant constant =
+            memberData.getConstantByIndex(expression, _readIntInternal());
         return new ConstantReference(expression, constant);
       case _TreeNodeKind.node:
-        if (memberData == null) {
-          memberData = _readMemberData();
-        }
+        memberData ??= _readMemberData();
         int index = _readIntInternal();
         ir.TreeNode treeNode = memberData.getTreeNodeByIndex(index);
-        assert(treeNode != null,
-            "No TreeNode found for index $index in ${memberData.node}.$_errorContext");
+        assert(
+            treeNode != null,
+            "No TreeNode found for index $index in "
+            "${memberData.node}.$_errorContext");
         return treeNode;
     }
     throw new UnsupportedError("Unexpected _TreeNodeKind $kind");
diff --git a/pkg/compiler/lib/src/serialization/helpers.dart b/pkg/compiler/lib/src/serialization/helpers.dart
index b73a8c9..176965b 100644
--- a/pkg/compiler/lib/src/serialization/helpers.dart
+++ b/pkg/compiler/lib/src/serialization/helpers.dart
@@ -335,8 +335,7 @@
 /// Data sink helper that canonicalizes [E] values using indices.
 class IndexedSink<E> {
   final AbstractDataSink _sink;
-  final Map<E, int> _cache = {};
-  Set<E> _current = {};
+  final Map<E, int> _cache = {null: 0}; // slot 0 is pre-allocated to `null`.
 
   IndexedSink(this._sink);
 
@@ -345,16 +344,16 @@
   /// If [value] has not been canonicalized yet, [writeValue] is called to
   /// serialize the [value] itself.
   void write(E value, void writeValue(E value)) {
+    const int pending = -1;
     int index = _cache[value];
     if (index == null) {
-      if (!_current.add(value)) {
-        throw new ArgumentError("Cyclic dependency on cached value: $value");
-      }
       index = _cache.length;
       _sink._writeIntInternal(index);
+      _cache[value] = pending; // Increments length to allocate slot.
       writeValue(value);
       _cache[value] = index;
-      _current.remove(value);
+    } else if (index == pending) {
+      throw ArgumentError("Cyclic dependency on cached value: $value");
     } else {
       _sink._writeIntInternal(index);
     }
@@ -364,7 +363,7 @@
 /// Data source helper reads canonicalized [E] values through indices.
 class IndexedSource<E> {
   final AbstractDataSource _source;
-  final List<E> _cache = [];
+  final List<E> _cache = [null]; // slot 0 is pre-allocated to `null`.
 
   IndexedSource(this._source);
 
@@ -375,11 +374,17 @@
   E read(E readValue()) {
     int index = _source._readIntInternal();
     if (index >= _cache.length) {
+      assert(index == _cache.length);
+      _cache.add(null); // placeholder.
       E value = readValue();
-      _cache.add(value);
+      _cache[index] = value;
       return value;
     } else {
-      return _cache[index];
+      E value = _cache[index];
+      if (value == null && index != 0) {
+        throw StateError('Unfilled index $index of $E');
+      }
+      return value;
     }
   }
 }
diff --git a/pkg/compiler/lib/src/serialization/member_data.dart b/pkg/compiler/lib/src/serialization/member_data.dart
index 867a271..a014c58 100644
--- a/pkg/compiler/lib/src/serialization/member_data.dart
+++ b/pkg/compiler/lib/src/serialization/member_data.dart
@@ -209,6 +209,10 @@
   /// [ir.TreeNode]s.
   Map<ir.TreeNode, int> _nodeToIndexMap;
 
+  /// Cached [ir.ConstantExpression] to [_ConstantNodeIndexerVisitor] map used
+  /// for fast serialization/deserialization of constant references.
+  Map<ir.ConstantExpression, _ConstantNodeIndexerVisitor> _constantIndexMap;
+
   _MemberData(this.node);
 
   void _ensureMaps() {
@@ -220,6 +224,27 @@
     }
   }
 
+  _ConstantNodeIndexerVisitor _createConstantIndexer(
+      ir.ConstantExpression node) {
+    _ConstantNodeIndexerVisitor indexer = new _ConstantNodeIndexerVisitor();
+    node.constant.accept(indexer);
+    return indexer;
+  }
+
+  ir.Constant getConstantByIndex(ir.ConstantExpression node, int index) {
+    _constantIndexMap ??= {};
+    _ConstantNodeIndexerVisitor indexer =
+        _constantIndexMap[node] ??= _createConstantIndexer(node);
+    return indexer.getConstant(index);
+  }
+
+  int getIndexByConstant(ir.ConstantExpression node, ir.Constant constant) {
+    _constantIndexMap ??= {};
+    _ConstantNodeIndexerVisitor indexer =
+        _constantIndexMap[node] ??= _createConstantIndexer(node);
+    return indexer.getIndex(constant);
+  }
+
   /// Returns the [ir.TreeNode] corresponding to [index] in this member.
   ir.TreeNode getTreeNodeByIndex(int index) {
     _ensureMaps();
diff --git a/pkg/compiler/lib/src/serialization/node_indexer.dart b/pkg/compiler/lib/src/serialization/node_indexer.dart
index 8e92ebf..92b90d2 100644
--- a/pkg/compiler/lib/src/serialization/node_indexer.dart
+++ b/pkg/compiler/lib/src/serialization/node_indexer.dart
@@ -210,11 +210,16 @@
   int _currentIndex = 0;
   final Map<int, ir.Constant> _indexToNodeMap = {};
   final Map<ir.Constant, int> _nodeToIndexMap = {};
+  final Set<ir.Constant> _visitedNonindexedNodes = {};
 
-  void registerConstant(ir.Constant node) {
+  /// Returns `true` if node not already registered.
+  bool _register(ir.Constant node) {
+    int index = _nodeToIndexMap[node];
+    if (index != null) return false;
     _indexToNodeMap[_currentIndex] = node;
     _nodeToIndexMap[node] = _currentIndex;
     _currentIndex++;
+    return true;
   }
 
   int getIndex(ir.Constant node) {
@@ -244,33 +249,38 @@
 
   @override
   void visitInstanceConstant(ir.InstanceConstant node) {
-    node.fieldValues.forEach((_, ir.Constant value) {
-      value.accept(this);
-    });
+    if (_visitedNonindexedNodes.add(node)) {
+      node.fieldValues.forEach((_, ir.Constant value) {
+        value.accept(this);
+      });
+    }
   }
 
   @override
   void visitSetConstant(ir.SetConstant node) {
-    registerConstant(node);
-    for (ir.Constant element in node.entries) {
-      element.accept(this);
+    if (_register(node)) {
+      for (ir.Constant element in node.entries) {
+        element.accept(this);
+      }
     }
   }
 
   @override
   void visitListConstant(ir.ListConstant node) {
-    registerConstant(node);
-    for (ir.Constant element in node.entries) {
-      element.accept(this);
+    if (_register(node)) {
+      for (ir.Constant element in node.entries) {
+        element.accept(this);
+      }
     }
   }
 
   @override
   void visitMapConstant(ir.MapConstant node) {
-    registerConstant(node);
-    for (ir.ConstantMapEntry entry in node.entries) {
-      entry.key.accept(this);
-      entry.value.accept(this);
+    if (_register(node)) {
+      for (ir.ConstantMapEntry entry in node.entries) {
+        entry.key.accept(this);
+        entry.value.accept(this);
+      }
     }
   }
 
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 425f6d2..9f5b8ab 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -330,6 +330,9 @@
       Map<MemberEntity, V> map, void f(MemberEntity member, V value),
       {bool allowNull: false});
 
+  /// Writes a reference to the indexed type variable [value] to this data sink.
+  void writeTypeVariable(IndexedTypeVariable value);
+
   /// Writes a reference to the local [value] to this data sink.
   void writeLocal(Local local);
 
@@ -738,6 +741,9 @@
   Map<K, V> readMemberMap<K extends MemberEntity, V>(V f(MemberEntity member),
       {bool emptyAsNull: false});
 
+  /// Reads a reference to an indexed type variable from this data source.
+  IndexedTypeVariable readTypeVariable();
+
   /// Reads a reference to a local from this data source.
   Local readLocal();
 
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 3a6f81a..5cfda65 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -9,6 +9,8 @@
 import 'dart:math' as math;
 import 'dart:typed_data';
 
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
+
 import '../compiler.dart' as api show Diagnostic;
 import '../compiler_new.dart' as api;
 import '../compiler_new.dart';
@@ -16,7 +18,6 @@
 import 'dart2js.dart' show AbortLeg;
 import 'filenames.dart';
 import 'io/source_file.dart';
-import 'util/uri_extras.dart';
 
 abstract class SourceFileProvider implements CompilerInput {
   bool isWindows = (Platform.operatingSystem == 'windows');
@@ -107,7 +108,7 @@
         .getUrl(resourceUri)
         .then((HttpClientRequest request) => request.close())
         .then((HttpClientResponse response) {
-      if (response.statusCode != HttpStatus.OK) {
+      if (response.statusCode != HttpStatus.ok) {
         String msg = 'Failure getting $resourceUri: '
             '${response.statusCode} ${response.reasonPhrase}';
         throw msg;
@@ -145,7 +146,7 @@
     throw "unimplemented";
   }
 
-  relativizeUri(Uri uri) => relativize(cwd, uri, isWindows);
+  relativizeUri(Uri uri) => fe.relativizeUri(cwd, uri, isWindows);
 
   SourceFile<List<int>> getUtf8SourceFile(Uri resourceUri) {
     return utf8SourceFiles[resourceUri];
@@ -384,12 +385,13 @@
 
     RandomAccessFile output;
     try {
-      output = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE);
+      output = new File(uri.toFilePath()).openSync(mode: FileMode.write);
     } on FileSystemException catch (e) {
       onFailure('$e');
     }
 
-    allOutputFiles.add(relativize(currentDirectory, uri, Platform.isWindows));
+    allOutputFiles
+        .add(fe.relativizeUri(currentDirectory, uri, Platform.isWindows));
 
     int charactersWritten = 0;
 
@@ -424,7 +426,8 @@
   BinaryOutputSink createBinarySink(Uri uri) {
     uri = currentDirectory.resolveUri(uri);
 
-    allOutputFiles.add(relativize(currentDirectory, uri, Platform.isWindows));
+    allOutputFiles
+        .add(fe.relativizeUri(currentDirectory, uri, Platform.isWindows));
 
     if (uri.scheme != 'file') {
       onFailure('Unhandled scheme ${uri.scheme} in $uri.');
@@ -432,7 +435,7 @@
 
     RandomAccessFile output;
     try {
-      output = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE);
+      output = new File(uri.toFilePath()).openSync(mode: FileMode.write);
     } on FileSystemException catch (e) {
       onFailure('$e');
     }
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 2fa3bac..a7fea25 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -33,6 +33,7 @@
 import '../js_backend/namer.dart' show ModularNamer;
 import '../js_backend/native_data.dart';
 import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../js_emitter/code_emitter_task.dart' show ModularEmitter;
 import '../js_model/locals.dart' show JumpVisitor;
 import '../js_model/elements.dart' show JGeneratorBody;
@@ -472,7 +473,9 @@
             }
             if (targetElement.isInstanceMember) {
               if (fieldData.isEffectivelyFinal ||
-                  !options.parameterCheckPolicy.isEmitted) {
+                  !closedWorld.annotationsData
+                      .getParameterCheckPolicy(targetElement)
+                      .isEmitted) {
                 // No need for a checked setter.
                 return null;
               }
@@ -512,7 +515,11 @@
                 "Unexpected function signature: "
                 "$targetElement inside a non-closure: $target");
           }
-          _buildMethodSignature(originalClosureNode);
+          if (options.experimentNewRti) {
+            _buildMethodSignatureNewRti(originalClosureNode);
+          } else {
+            _buildMethodSignature(originalClosureNode);
+          }
           break;
         case MemberKind.generatorBody:
           _buildGeneratorBody(
@@ -581,7 +588,8 @@
     _inLazyInitializerExpression = node.isStatic;
     FieldEntity field = _elementMap.getMember(node);
     _openFunction(field, checks: TargetChecks.none);
-    if (node.isInstanceMember && options.parameterCheckPolicy.isEmitted) {
+    if (node.isInstanceMember &&
+        closedWorld.annotationsData.getParameterCheckPolicy(field).isEmitted) {
       HInstruction thisInstruction = localsHandler.readThis(
           sourceInformation: _sourceInformationBuilder.buildGet(node));
       // Use dynamic type because the type computed by the inferrer is
@@ -593,7 +601,7 @@
       // to be the first parameter.
       graph.entry.addBefore(graph.entry.last, parameter);
       HInstruction value = _typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
-          parameter, _getDartTypeIfValid(node.type));
+          field, parameter, _getDartTypeIfValid(node.type));
       if (!_fieldAnalysis.getFieldData(field).isElided) {
         add(new HFieldSet(_abstractValueDomain, field, thisInstruction, value));
       }
@@ -603,7 +611,7 @@
         HInstruction fieldValue = pop();
         HInstruction checkInstruction =
             _typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
-                fieldValue, _getDartTypeIfValid(node.type));
+                field, fieldValue, _getDartTypeIfValid(node.type));
         stack.add(checkInstruction);
       } else {
         stack.add(graph.addConstantNull(closedWorld));
@@ -624,7 +632,8 @@
   /// non-null bool.
   HInstruction popBoolified() {
     HInstruction value = pop();
-    return _typeBuilder.potentiallyCheckOrTrustTypeOfCondition(value);
+    return _typeBuilder.potentiallyCheckOrTrustTypeOfCondition(
+        _currentFrame.member, value);
   }
 
   /// Extend current method parameters with parameters for the class type
@@ -761,7 +770,7 @@
           DartType type = _elementEnvironment.getFieldType(member);
           type = localsHandler.substInContext(type);
           constructorArguments.add(_typeBuilder
-              .potentiallyCheckOrTrustTypeOfAssignment(value, type));
+              .potentiallyCheckOrTrustTypeOfAssignment(member, value, type));
         }
       }
     });
@@ -1229,6 +1238,21 @@
     _closeFunction();
   }
 
+  /// Constructs a special signature function for a closure.
+  void _buildMethodSignatureNewRti(ir.FunctionNode originalClosureNode) {
+    // The signature function has no corresponding ir.Node, so we just use the
+    // targetElement to set up the type environment.
+    _openFunction(targetElement, checks: TargetChecks.none);
+    FunctionType functionType =
+        _elementMap.getFunctionType(originalClosureNode);
+    HInstruction rti =
+        _typeBuilder.analyzeTypeArgumentNewRti(functionType, sourceElement);
+    close(new HReturn(_abstractValueDomain, rti,
+            _sourceInformationBuilder.buildReturn(originalClosureNode)))
+        .addSuccessor(graph.exit);
+    _closeFunction();
+  }
+
   /// Builds generative constructor body.
   void _buildConstructorBody(ir.Constructor constructor) {
     FunctionEntity constructorBody =
@@ -1344,7 +1368,12 @@
     if (elementType.containsFreeTypeVariables) {
       // Type must be computed in the entry function, where the type variables
       // are in scope, and passed to the body function.
-      inputs.add(_typeBuilder.analyzeTypeArgument(elementType, function));
+      if (options.experimentNewRti) {
+        inputs
+            .add(_typeBuilder.analyzeTypeArgumentNewRti(elementType, function));
+      } else {
+        inputs.add(_typeBuilder.analyzeTypeArgument(elementType, function));
+      }
     } else {
       // Types with no type variables can be emitted as part of the generator,
       // avoiding an extra argument.
@@ -1397,6 +1426,7 @@
     if (block.id != 1) return false;
     for (HInstruction node = block.first; node != null; node = node.next) {
       if (node is HGoto) continue;
+      if (node is HLoadType) continue; // Orphaned if check is redundant.
       return false;
     }
     return true;
@@ -1436,7 +1466,7 @@
           (targetChecks.checkCovariantParameters &&
               (variable.isGenericCovariantImpl || variable.isCovariant))) {
         newParameter = _typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
-            newParameter, type);
+            targetElement, newParameter, type);
       } else {
         newParameter = _typeBuilder.trustTypeOfParameter(newParameter, type);
       }
@@ -1450,7 +1480,7 @@
 
   void _checkTypeVariableBounds(FunctionEntity method) {
     if (_rtiNeed.methodNeedsTypeArguments(method) &&
-        options.parameterCheckPolicy.isEmitted) {
+        closedWorld.annotationsData.getParameterCheckPolicy(method).isEmitted) {
       ir.FunctionNode function = getFunctionNode(_elementMap, method);
       for (ir.TypeParameter typeParameter in function.typeParameters) {
         Local local = _localsMap.getLocalTypeVariable(
@@ -1791,7 +1821,7 @@
         }*/
       } else {
         value = _typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
-            value, _returnType);
+            _currentFrame.member, value, _returnType);
       }
     }
     _handleInTryStatement();
@@ -2058,7 +2088,7 @@
 
       Local loopVariableLocal = _localsMap.getLocalVariable(node.variable);
       HInstruction value = _typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
-          pop(), _getDartTypeIfValid(node.variable.type));
+          _currentFrame.member, pop(), _getDartTypeIfValid(node.variable.type));
       localsHandler.updateLocal(loopVariableLocal, value,
           sourceInformation: sourceInformation);
       // Hint to name loop value after name of loop variable.
@@ -2413,8 +2443,16 @@
       return;
     }
 
-    if ((!node.isTypeError && !options.omitAsCasts) ||
-        options.implicitDowncastCheckPolicy.isEmitted) {
+    CheckPolicy policy;
+    if (node.isTypeError) {
+      policy = closedWorld.annotationsData
+          .getImplicitDowncastCheckPolicy(_currentFrame.member);
+    } else {
+      policy = closedWorld.annotationsData
+          .getExplicitCastCheckPolicy(_currentFrame.member);
+    }
+
+    if (policy.isEmitted) {
       HInstruction converted = _typeBuilder.buildTypeConversion(
           expressionInstruction,
           localsHandler.substInContext(type),
@@ -3384,7 +3422,7 @@
             _abstractValueDomain,
             target,
             _typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
-                value, _getDartTypeIfValid(staticTarget.setterType))));
+                target, value, _getDartTypeIfValid(staticTarget.setterType))));
       }
     }
     stack.add(value);
@@ -3535,7 +3573,7 @@
     localsHandler.updateLocal(
         local,
         _typeBuilder.potentiallyCheckOrTrustTypeOfAssignment(
-            value, _getDartTypeIfValid(variable.type)),
+            _currentFrame.member, value, _getDartTypeIfValid(variable.type)),
         sourceInformation: sourceInformation);
   }
 
@@ -4016,8 +4054,10 @@
         new Selector.callClosure(0, const <String>[], typeArguments.length);
     StaticType receiverStaticType =
         _getStaticType(invocation.arguments.positional[1]);
-    AbstractValue receiverType = _abstractValueDomain.createFromStaticType(
-        receiverStaticType.type, receiverStaticType.relation);
+    AbstractValue receiverType = _abstractValueDomain
+        .createFromStaticType(
+            receiverStaticType.type, receiverStaticType.relation)
+        .abstractValue;
     push(new HInvokeClosure(selector, receiverType, inputs,
         _abstractValueDomain.dynamicType, typeArguments));
 
@@ -4495,6 +4535,16 @@
         return js.js
             .expressionTemplateYielding(_emitter.typeAccess(objectClass));
 
+      case JsBuiltin.dartClosureConstructor:
+        ClassEntity closureClass = closedWorld.commonElements.closureClass;
+        // TODO(sra): Should add a dependency on the constructor used as a
+        // token.
+        registry
+            // ignore:deprecated_member_use_from_same_package
+            .registerInstantiatedClass(closureClass);
+        return js.js
+            .expressionTemplateYielding(_emitter.typeAccess(closureClass));
+
       case JsBuiltin.isCheckPropertyToJsConstructorName:
         int isPrefixLength = _namer.fixedNames.operatorIsPrefix.length;
         return js.js.expressionTemplateFor('#.substring($isPrefixLength)');
@@ -4760,8 +4810,10 @@
       List<HInstruction> arguments,
       List<DartType> typeArguments,
       SourceInformation sourceInformation) {
-    AbstractValue typeBound = _abstractValueDomain.createFromStaticType(
-        staticReceiverType.type, staticReceiverType.relation);
+    AbstractValue typeBound = _abstractValueDomain
+        .createFromStaticType(
+            staticReceiverType.type, staticReceiverType.relation)
+        .abstractValue;
     receiverType = receiverType == null
         ? typeBound
         : _abstractValueDomain.intersection(receiverType, typeBound);
@@ -6208,8 +6260,8 @@
       if (trusted) {
         checkedOrTrusted = _typeBuilder.trustTypeOfParameter(argument, type);
       } else {
-        checkedOrTrusted =
-            _typeBuilder.potentiallyCheckOrTrustTypeOfParameter(argument, type);
+        checkedOrTrusted = _typeBuilder.potentiallyCheckOrTrustTypeOfParameter(
+            function, argument, type);
       }
       localsHandler.updateLocal(parameter, checkedOrTrusted);
     });
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 6c5154c..4dfc69b 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -26,6 +26,7 @@
 import '../js_backend/native_data.dart';
 import '../js_backend/namer.dart' show ModularNamer;
 import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_codegen.dart';
 import '../js_backend/runtime_types_new.dart' show RecipeEncoder;
 import '../js_emitter/code_emitter_task.dart' show ModularEmitter;
 import '../js_model/elements.dart' show JGeneratorBody;
@@ -703,6 +704,7 @@
       if (instruction is HTypeConversion ||
           instruction is HPrimitiveCheck ||
           instruction is HAsCheck ||
+          instruction is HAsCheckSimple ||
           instruction is HBoolConversion) {
         String inputName = variableNames.getName(instruction.checkedInput);
         if (variableNames.getName(instruction) == inputName) {
@@ -3361,6 +3363,8 @@
     use(node.checkedInput);
     js.Expression second = pop();
 
+    _registry.registerTypeUse(TypeUse.isCheck(node.checkedTypeExpression));
+
     FieldEntity field = node.isTypeError
         ? _commonElements.rtiCheckField
         : _commonElements.rtiAsField;
@@ -3371,6 +3375,17 @@
   }
 
   @override
+  visitAsCheckSimple(HAsCheckSimple node) {
+    use(node.checkedInput);
+    MemberEntity method = node.method;
+    _registry.registerStaticUse(
+        StaticUse.staticInvoke(method, CallStructure.ONE_ARG));
+    js.Expression methodAccess = _emitter.staticFunctionAccess(method);
+    push(js.js(r'#(#)', [methodAccess, pop()]).withSourceInformation(
+        node.sourceInformation));
+  }
+
+  @override
   visitSubtypeCheck(HSubtypeCheck node) {
     throw UnimplementedError('SsaCodeGenerator.visitSubtypeCheck  $node');
   }
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index c0ae4ec..d028d7a 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -143,18 +143,15 @@
 
   @override
   HInstruction visitInvokeDynamic(HInvokeDynamic node) {
-    if (node.isInterceptedCall) {
-      tryReplaceInterceptorWithDummy(node, node.selector, node.receiverType);
-    }
+    tryReplaceExplicitReceiverWithDummy(
+        node, node.selector, node.element, node.receiverType);
     return node;
   }
 
   @override
   HInstruction visitInvokeSuper(HInvokeSuper node) {
-    if (node.isInterceptedCall) {
-      AbstractValue mask = node.getDartReceiver(_closedWorld).instructionType;
-      tryReplaceInterceptorWithDummy(node, node.selector, mask);
-    }
+    tryReplaceExplicitReceiverWithDummy(
+        node, node.selector, node.element, null);
     return node;
   }
 
@@ -164,8 +161,8 @@
     return node;
   }
 
-  bool tryReplaceInterceptorWithDummy(
-      HInvoke node, Selector selector, AbstractValue mask) {
+  void tryReplaceExplicitReceiverWithDummy(HInvoke node, Selector selector,
+      MemberEntity target, AbstractValue mask) {
     // Calls of the form
     //
     //     a.foo$1(a, x)
@@ -185,29 +182,41 @@
     // --->
     //     b.get$thing().foo$1(0, x)
     //
+    assert(target != null || mask != null);
+
+    if (!node.isInterceptedCall) return;
 
     // TODO(15933): Make automatically generated property extraction closures
     // work with the dummy receiver optimization.
-    if (selector.isGetter) return false;
+    if (selector.isGetter) return;
 
     // This assignment of inputs is uniform for HInvokeDynamic and HInvokeSuper.
     HInstruction interceptor = node.inputs[0];
     HInstruction receiverArgument = node.inputs[1];
 
-    if (interceptor.nonCheck() == receiverArgument.nonCheck()) {
-      if (_interceptorData.isInterceptedSelector(selector) &&
-          !_interceptorData.isInterceptedMixinSelector(
-              selector, mask, _closedWorld)) {
-        ConstantValue constant =
-            new DummyInterceptorConstantValue(receiverArgument.instructionType);
-        HConstant dummy = graph.addConstant(constant, _closedWorld);
-        receiverArgument.usedBy.remove(node);
-        node.inputs[1] = dummy;
-        dummy.usedBy.add(node);
-        return true;
-      }
+    // A 'self-interceptor'?
+    if (interceptor.nonCheck() != receiverArgument.nonCheck()) return;
+
+    // TODO(sra): Should this be an assert?
+    if (!_interceptorData.isInterceptedSelector(selector)) return;
+
+    if (target != null) {
+      // A call that resolves to a single instance method (element) requires the
+      // calling convention consistent with the method.
+      ClassEntity cls = target.enclosingClass;
+      assert(_interceptorData.isInterceptedMethod(target));
+      if (_interceptorData.isInterceptedClass(cls)) return;
+    } else if (_interceptorData.isInterceptedMixinSelector(
+        selector, mask, _closedWorld)) {
+      return;
     }
-    return false;
+
+    ConstantValue constant =
+        DummyInterceptorConstantValue(receiverArgument.instructionType);
+    HConstant dummy = graph.addConstant(constant, _closedWorld);
+    receiverArgument.usedBy.remove(node);
+    node.inputs[1] = dummy;
+    dummy.usedBy.add(node);
   }
 
   @override
@@ -762,6 +771,13 @@
   }
 
   @override
+  void visitAsCheckSimple(HAsCheckSimple instruction) {
+    // Type checks and cast checks compile to code that only use their input
+    // once, so we can safely visit them and try to merge the input.
+    visitInstruction(instruction);
+  }
+
+  @override
   void visitTypeEval(HTypeEval instruction) {
     // Type expressions compile to code that only use their input once, so we
     // can safely visit them and try to merge the input.
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index d0eb67d..b0d2411 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -9,7 +9,6 @@
 import '../elements/names.dart';
 import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/types.dart';
-import '../options.dart';
 import '../universe/call_structure.dart';
 import '../universe/selector.dart';
 import '../world.dart' show JClosedWorld;
@@ -24,11 +23,8 @@
 class InvokeDynamicSpecializer {
   const InvokeDynamicSpecializer();
 
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return AbstractValueFactory.inferredResultTypeForSelector(
         instruction.selector, instruction.receiverType, results);
   }
@@ -37,7 +33,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -121,7 +116,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -134,13 +128,17 @@
     }
     // TODO(johnniwinther): Merge this and the following if statement.
     if (index.isInteger(closedWorld.abstractValueDomain).isPotentiallyFalse &&
-        options.parameterCheckPolicy.isEmitted) {
+        // TODO(johnniwinther): Support annotations on the possible targets
+        // and used their parameter check policy here.
+        closedWorld.annotationsData.getParameterCheckPolicy(null).isEmitted) {
       // We want the right checked mode error.
       return null;
     }
 
     HInstruction value = instruction.inputs[3];
-    if (options.parameterCheckPolicy.isEmitted) {
+    // TODO(johnniwinther): Support annotations on the possible targets
+    // and used their parameter check policy here.
+    if (closedWorld.annotationsData.getParameterCheckPolicy(null).isEmitted) {
       if (!_valueParameterCheckAlwaysSucceeds(
           instruction, receiver, value, commonElements, closedWorld)) {
         return null;
@@ -193,7 +191,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -206,7 +203,9 @@
     if (instruction.inputs[2]
             .isInteger(abstractValueDomain)
             .isPotentiallyFalse &&
-        options.parameterCheckPolicy.isEmitted) {
+        // TODO(johnniwinther): Support annotations on the possible targets
+        // and used their parameter check policy here.
+        closedWorld.annotationsData.getParameterCheckPolicy(null).isEmitted) {
       // We want the right checked mode error.
       return null;
     }
@@ -234,11 +233,8 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     // All bitwise operations on primitive types either produce an
     // integer or throw an error.
     if (instruction.inputs[1]
@@ -246,8 +242,7 @@
         .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint32Type;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -255,17 +250,13 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
-      HBitNot converted = new HBitNot(
-          input,
-          instruction.selector,
-          computeTypeFromInputTypes(
-              instruction, results, options, closedWorld));
+      HBitNot converted = new HBitNot(input, instruction.selector,
+          computeTypeFromInputTypes(instruction, results, closedWorld));
       log?.registerBitNot(instruction, converted);
       return converted;
     }
@@ -282,11 +273,8 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction operand = instruction.inputs[1];
     if (operand
         .isNumberOrNull(closedWorld.abstractValueDomain)
@@ -305,8 +293,7 @@
       }
       return closedWorld.abstractValueDomain.numType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -314,17 +301,13 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
-      HNegate converted = new HNegate(
-          input,
-          instruction.selector,
-          computeTypeFromInputTypes(
-              instruction, results, options, closedWorld));
+      HNegate converted = new HNegate(input, instruction.selector,
+          computeTypeFromInputTypes(instruction, results, closedWorld));
       log?.registerUnaryNegate(instruction, converted);
       return converted;
     }
@@ -341,19 +324,15 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction input = instruction.inputs[1];
     if (input
         .isNumberOrNull(closedWorld.abstractValueDomain)
         .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.excludeNull(input.instructionType);
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -361,17 +340,13 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
     HInstruction input = instruction.inputs[1];
     if (input.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
-      HAbs converted = new HAbs(
-          input,
-          instruction.selector,
-          computeTypeFromInputTypes(
-              instruction, results, options, closedWorld));
+      HAbs converted = new HAbs(input, instruction.selector,
+          computeTypeFromInputTypes(instruction, results, closedWorld));
       log?.registerAbs(instruction, converted);
       return converted;
     }
@@ -386,11 +361,8 @@
   const BinaryArithmeticSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
     if (left
@@ -412,8 +384,7 @@
       }
       return closedWorld.abstractValueDomain.numType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   bool isBuiltin(HInvokeDynamic instruction, JClosedWorld closedWorld) {
@@ -430,13 +401,12 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
     if (isBuiltin(instruction, closedWorld)) {
       HInstruction builtin =
-          newBuiltinVariant(instruction, results, options, closedWorld);
+          newBuiltinVariant(instruction, results, closedWorld);
       if (log != null) {
         registerOptimization(log, instruction, builtin);
       }
@@ -451,6 +421,15 @@
     return null;
   }
 
+  bool inputsAreNum(HInstruction instruction, JClosedWorld closedWorld) {
+    HInstruction left = instruction.inputs[1];
+    HInstruction right = instruction.inputs[2];
+    return left
+            .isNumberOrNull(closedWorld.abstractValueDomain)
+            .isDefinitelyTrue &&
+        right.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue;
+  }
+
   bool inputsArePositiveIntegers(
       HInstruction instruction, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
@@ -470,11 +449,8 @@
         right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue;
   }
 
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld);
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld);
 
   void registerOptimization(
       OptimizationTestLog log, HInstruction original, HInstruction converted);
@@ -484,19 +460,15 @@
   const AddSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (inputsAreUInt31(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.uint32Type;
     }
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.positiveIntType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -505,16 +477,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HAdd(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -533,25 +502,18 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInstruction instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInstruction instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     if (left.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.doubleType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HDivide(instruction.inputs[1], instruction.inputs[2],
         instruction.selector, closedWorld.abstractValueDomain.doubleType);
   }
@@ -567,16 +529,12 @@
   const ModuloSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.positiveIntType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -585,11 +543,8 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     // Modulo cannot be mapped to the native operator (different semantics).
 
     // We can use HRemainder if both inputs are non-negative and the receiver
@@ -636,8 +591,7 @@
           instruction.inputs[1],
           instruction.inputs[2],
           instruction.selector,
-          computeTypeFromInputTypes(
-              instruction, results, options, closedWorld));
+          computeTypeFromInputTypes(instruction, results, closedWorld));
     }
     // TODO(sra):
     //   a % N -->  a & (N-1), N=2^k, where a>=0, does not have -0.0 problem.
@@ -662,16 +616,12 @@
   const RemainderSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.positiveIntType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -680,16 +630,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HRemainder(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -708,29 +655,22 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.positiveIntType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HMultiply(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -749,16 +689,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HSubtract(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -777,19 +714,18 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (hasUint31Result(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
     if (inputsArePositiveIntegers(instruction, closedWorld)) {
       return closedWorld.abstractValueDomain.positiveIntType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    if (inputsAreNum(instruction, closedWorld)) {
+      return closedWorld.abstractValueDomain.intType;
+    }
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   bool isNotZero(HInstruction instruction) {
@@ -831,7 +767,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -843,7 +778,7 @@
           isNotZero(right)) {
         if (hasUint31Result(instruction, closedWorld)) {
           HInstruction converted =
-              newBuiltinVariant(instruction, results, options, closedWorld);
+              newBuiltinVariant(instruction, results, closedWorld);
           if (log != null) {
             registerOptimization(log, instruction, converted);
           }
@@ -863,16 +798,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HTruncatingDivide(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -886,19 +818,15 @@
   const BinaryBitOpSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     // All bitwise operations on number types either produce an unsigned 32-bit
     // integer or throw an error.
     HInstruction left = instruction.inputs[1];
     if (left.isNumberOrNull(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint32Type;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   bool argumentLessThan32(HInstruction instruction) {
@@ -945,7 +873,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -954,7 +881,7 @@
     if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       if (argumentLessThan32(right)) {
         HInstruction converted =
-            newBuiltinVariant(instruction, results, options, closedWorld);
+            newBuiltinVariant(instruction, results, closedWorld);
         if (log != null) {
           registerOptimization(log, instruction, converted);
         }
@@ -976,16 +903,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HShiftLeft(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -999,17 +923,13 @@
   const ShiftRightSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     if (left.isUInt32(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return left.instructionType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -1017,7 +937,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1026,7 +945,7 @@
     if (left.isNumber(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       if (argumentLessThan32(right) && isPositive(left, closedWorld)) {
         HInstruction converted =
-            newBuiltinVariant(instruction, results, options, closedWorld);
+            newBuiltinVariant(instruction, results, closedWorld);
         if (log != null) {
           registerOptimization(log, instruction, converted);
         }
@@ -1061,16 +980,13 @@
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HShiftRight(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -1094,32 +1010,25 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
     if (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
         right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HBitOr(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -1138,11 +1047,8 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
     if (left
@@ -1152,21 +1058,17 @@
             right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue)) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HBitAnd(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -1185,32 +1087,25 @@
   }
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     HInstruction left = instruction.inputs[1];
     HInstruction right = instruction.inputs[2];
     if (left.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue &&
         right.isUInt31(closedWorld.abstractValueDomain).isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.uint31Type;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
-  HInstruction newBuiltinVariant(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  HInstruction newBuiltinVariant(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     return new HBitXor(
         instruction.inputs[1],
         instruction.inputs[2],
         instruction.selector,
-        computeTypeFromInputTypes(instruction, results, options, closedWorld));
+        computeTypeFromInputTypes(instruction, results, closedWorld));
   }
 
   @override
@@ -1224,18 +1119,14 @@
   const RelationalSpecializer();
 
   @override
-  AbstractValue computeTypeFromInputTypes(
-      HInvokeDynamic instruction,
-      GlobalTypeInferenceResults results,
-      CompilerOptions options,
-      JClosedWorld closedWorld) {
+  AbstractValue computeTypeFromInputTypes(HInvokeDynamic instruction,
+      GlobalTypeInferenceResults results, JClosedWorld closedWorld) {
     if (instruction.inputs[1]
         .isPrimitiveOrNull(closedWorld.abstractValueDomain)
         .isDefinitelyTrue) {
       return closedWorld.abstractValueDomain.boolType;
     }
-    return super
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+    return super.computeTypeFromInputTypes(instruction, results, closedWorld);
   }
 
   @override
@@ -1243,7 +1134,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1275,7 +1165,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1432,7 +1321,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1466,7 +1354,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1516,7 +1403,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1563,7 +1449,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
@@ -1597,7 +1482,6 @@
       HInvokeDynamic instruction,
       HGraph graph,
       GlobalTypeInferenceResults results,
-      CompilerOptions options,
       JCommonElements commonElements,
       JClosedWorld closedWorld,
       OptimizationTestLog log) {
diff --git a/pkg/compiler/lib/src/ssa/logging.dart b/pkg/compiler/lib/src/ssa/logging.dart
index cdfb2a9..a819a7d 100644
--- a/pkg/compiler/lib/src/ssa/logging.dart
+++ b/pkg/compiler/lib/src/ssa/logging.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import '../elements/entities.dart';
-import '../util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'nodes.dart';
 
 /// Log used for unit testing optimizations.
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index a7d0316..89a7adf 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -108,6 +108,7 @@
   // Instructions for 'dart:_rti'.
   R visitIsTest(HIsTest node);
   R visitAsCheck(HAsCheck node);
+  R visitAsCheckSimple(HAsCheckSimple node);
   R visitSubtypeCheck(HSubtypeCheck node);
   R visitLoadType(HLoadType node);
   R visitInstanceEnvironment(HInstanceEnvironment node);
@@ -603,6 +604,8 @@
   @override
   visitAsCheck(HAsCheck node) => visitCheck(node);
   @override
+  visitAsCheckSimple(HAsCheckSimple node) => visitCheck(node);
+  @override
   visitSubtypeCheck(HSubtypeCheck node) => visitCheck(node);
   @override
   visitLoadType(HLoadType node) => visitInstruction(node);
@@ -1092,11 +1095,12 @@
 
   static const int IS_TEST_TYPECODE = 47;
   static const int AS_CHECK_TYPECODE = 48;
-  static const int SUBTYPE_CHECK_TYPECODE = 49;
-  static const int LOAD_TYPE_TYPECODE = 50;
-  static const int INSTANCE_ENVIRONMENT_TYPECODE = 51;
-  static const int TYPE_EVAL_TYPECODE = 52;
-  static const int TYPE_BIND_TYPECODE = 53;
+  static const int AS_CHECK_SIMPLE_TYPECODE = 49;
+  static const int SUBTYPE_CHECK_TYPECODE = 50;
+  static const int LOAD_TYPE_TYPECODE = 51;
+  static const int INSTANCE_ENVIRONMENT_TYPECODE = 52;
+  static const int TYPE_EVAL_TYPECODE = 53;
+  static const int TYPE_BIND_TYPECODE = 54;
 
   HInstruction(this.inputs, this.instructionType)
       : id = idCounter++,
@@ -4378,12 +4382,19 @@
 
 /// Type cast or type check using Rti form of type expression.
 class HAsCheck extends HCheck {
+  final AbstractValueWithPrecision checkedType;
+  final DartType checkedTypeExpression;
   final bool isTypeError;
 
-  HAsCheck(HInstruction checked, HInstruction rti, this.isTypeError,
-      AbstractValue type)
+  HAsCheck(
+      HInstruction checked,
+      HInstruction rti,
+      this.checkedType,
+      this.checkedTypeExpression,
+      this.isTypeError,
+      AbstractValue instructionType)
       : assert(isTypeError != null),
-        super([rti, checked], type);
+        super([rti, checked], instructionType);
 
   // The type input is first to facilitate the `type.as(value)` codegen pattern.
   HInstruction get typeInput => inputs[0];
@@ -4407,6 +4418,64 @@
     return isTypeError == other.isTypeError;
   }
 
+  bool isRedundant(JClosedWorld closedWorld) {
+    if (!checkedType.isPrecise) return false;
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    AbstractValue inputType = checkedInput.instructionType;
+    return abstractValueDomain
+        .isIn(inputType, checkedType.abstractValue)
+        .isDefinitelyTrue;
+  }
+
+  @override
+  String toString() {
+    String error = isTypeError ? 'TypeError' : 'CastError';
+    return 'HAsCheck($error)';
+  }
+}
+
+/// Type cast or type check for simple known types that are achieved via a
+/// simple static call.
+class HAsCheckSimple extends HCheck {
+  final DartType dartType;
+  final AbstractValueWithPrecision checkedType;
+  final bool isTypeError;
+  final MemberEntity method;
+
+  HAsCheckSimple(HInstruction checked, this.dartType, this.checkedType,
+      this.isTypeError, this.method, AbstractValue type)
+      : assert(isTypeError != null),
+        super([checked], type);
+
+  @override
+  HInstruction get checkedInput => inputs[0];
+
+  @override
+  bool isJsStatement() => false;
+
+  @override
+  accept(HVisitor visitor) => visitor.visitAsCheckSimple(this);
+
+  bool isRedundant(JClosedWorld closedWorld) {
+    if (!checkedType.isPrecise) return false;
+    AbstractValueDomain abstractValueDomain = closedWorld.abstractValueDomain;
+    AbstractValue inputType = checkedInput.instructionType;
+    return abstractValueDomain
+        .isIn(inputType, checkedType.abstractValue)
+        .isDefinitelyTrue;
+  }
+
+  @override
+  int typeCode() => HInstruction.AS_CHECK_SIMPLE_TYPECODE;
+
+  @override
+  bool typeEquals(HInstruction other) => other is HAsCheckSimple;
+
+  @override
+  bool dataEquals(HAsCheckSimple other) {
+    return isTypeError == other.isTypeError && dartType == other.dartType;
+  }
+
   @override
   String toString() {
     String error = isTypeError ? 'TypeError' : 'CastError';
@@ -4521,7 +4590,8 @@
 
   @override
   bool dataEquals(HTypeEval other) {
-    return typeExpression == other.typeExpression;
+    return TypeRecipe.yieldsSameType(
+        typeExpression, envStructure, other.typeExpression, other.envStructure);
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 865c0ff..ee39ddb 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -17,7 +17,9 @@
     show FieldAnalysisData, JFieldAnalysis;
 import '../js_backend/backend.dart' show CodegenInputs;
 import '../js_backend/native_data.dart' show NativeData;
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_codegen.dart';
+import '../js_model/type_recipe.dart' show TypeRecipe;
+import '../js_backend/specialized_checks.dart';
 import '../native/behavior.dart';
 import '../options.dart';
 import '../universe/selector.dart' show Selector;
@@ -83,7 +85,7 @@
         new SsaTypeConversionInserter(closedWorld),
         new SsaRedundantPhiEliminator(),
         new SsaDeadPhiEliminator(),
-        new SsaTypePropagator(globalInferenceResults, _options,
+        new SsaTypePropagator(globalInferenceResults,
             closedWorld.commonElements, closedWorld, log),
         // After type propagation, more instructions can be
         // simplified.
@@ -93,7 +95,7 @@
         new SsaInstructionSimplifier(globalInferenceResults, _options,
             codegen.rtiSubstitutions, closedWorld, registry, log),
         new SsaCheckInserter(trustPrimitives, closedWorld, boundsChecked),
-        new SsaTypePropagator(globalInferenceResults, _options,
+        new SsaTypePropagator(globalInferenceResults,
             closedWorld.commonElements, closedWorld, log),
         // Run a dead code eliminator before LICM because dead
         // interceptors are often in the way of LICM'able instructions.
@@ -101,7 +103,7 @@
         new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
         // After GVN, some instructions might need their type to be
         // updated because they now have different inputs.
-        new SsaTypePropagator(globalInferenceResults, _options,
+        new SsaTypePropagator(globalInferenceResults,
             closedWorld.commonElements, closedWorld, log),
         codeMotion = new SsaCodeMotion(closedWorld.abstractValueDomain),
         loadElimination = new SsaLoadElimination(closedWorld),
@@ -111,7 +113,7 @@
         // controlled by a test on the value, so redo 'conversion insertion' to
         // learn from the refined type.
         new SsaTypeConversionInserter(closedWorld),
-        new SsaTypePropagator(globalInferenceResults, _options,
+        new SsaTypePropagator(globalInferenceResults,
             closedWorld.commonElements, closedWorld, log),
         new SsaValueRangeAnalyzer(closedWorld, this),
         // Previous optimizations may have generated new
@@ -133,7 +135,7 @@
           dce.eliminatedSideEffects ||
           loadElimination.newGvnCandidates) {
         phases = <OptimizationPhase>[
-          new SsaTypePropagator(globalInferenceResults, _options,
+          new SsaTypePropagator(globalInferenceResults,
               closedWorld.commonElements, closedWorld, log),
           new SsaGlobalValueNumberer(closedWorld.abstractValueDomain),
           new SsaCodeMotion(closedWorld.abstractValueDomain),
@@ -146,7 +148,7 @@
         ];
       } else {
         phases = <OptimizationPhase>[
-          new SsaTypePropagator(globalInferenceResults, _options,
+          new SsaTypePropagator(globalInferenceResults,
               closedWorld.commonElements, closedWorld, log),
           // Run the simplifier to remove unneeded type checks inserted by
           // type propagation.
@@ -519,14 +521,8 @@
     }
 
     // Try converting the instruction to a builtin instruction.
-    HInstruction instruction = node.specializer.tryConvertToBuiltin(
-        node,
-        _graph,
-        _globalInferenceResults,
-        _options,
-        commonElements,
-        _closedWorld,
-        _log);
+    HInstruction instruction = node.specializer.tryConvertToBuiltin(node,
+        _graph, _globalInferenceResults, commonElements, _closedWorld, _log);
     if (instruction != null) {
       return instruction;
     }
@@ -551,7 +547,9 @@
         } else if (applies(commonElements.jsArrayAdd)) {
           // The codegen special cases array calls, but does not
           // inline argument type checks.
-          if (!_options.parameterCheckPolicy.isEmitted ||
+          if (!_closedWorld.annotationsData
+                  .getParameterCheckPolicy(commonElements.jsArrayAdd)
+                  .isEmitted ||
               input is HLiteralList) {
             target = commonElements.jsArrayAdd;
           }
@@ -636,24 +634,32 @@
       return splitInstruction;
     }
 
-    // TODO(sra): Implement tagging with `JSArray<String>` for new rti.
-
     node.block.addBefore(node, splitInstruction);
 
-    HInstruction stringTypeInfo = new HTypeInfoExpression(
-        TypeInfoExpressionKind.COMPLETE,
-        _closedWorld.elementEnvironment.getThisType(commonElements.stringClass),
-        <HInstruction>[],
-        _abstractValueDomain.dynamicType);
-    node.block.addBefore(node, stringTypeInfo);
+    HInstruction typeInfo;
+    if (_options.experimentNewRti) {
+      typeInfo = HLoadType(
+          _closedWorld.elementEnvironment.createInterfaceType(
+              commonElements.jsArrayClass, [commonElements.stringType]),
+          _abstractValueDomain.dynamicType);
+      node.block.addBefore(node, typeInfo);
+    } else {
+      HInstruction stringTypeInfo = new HTypeInfoExpression(
+          TypeInfoExpressionKind.COMPLETE,
+          _closedWorld.elementEnvironment
+              .getThisType(commonElements.stringClass),
+          <HInstruction>[],
+          _abstractValueDomain.dynamicType);
+      node.block.addBefore(node, stringTypeInfo);
 
-    HInstruction typeInfo = new HTypeInfoExpression(
-        TypeInfoExpressionKind.INSTANCE,
-        _closedWorld.elementEnvironment
-            .getThisType(commonElements.jsArrayClass),
-        <HInstruction>[stringTypeInfo],
-        _abstractValueDomain.dynamicType);
-    node.block.addBefore(node, typeInfo);
+      typeInfo = new HTypeInfoExpression(
+          TypeInfoExpressionKind.INSTANCE,
+          _closedWorld.elementEnvironment
+              .getThisType(commonElements.jsArrayClass),
+          <HInstruction>[stringTypeInfo],
+          _abstractValueDomain.dynamicType);
+      node.block.addBefore(node, typeInfo);
+    }
 
     HInvokeStatic tagInstruction = new HInvokeStatic(
         commonElements.setRuntimeTypeInfo,
@@ -755,7 +761,7 @@
             _closedWorld.elementEnvironment.getFieldType(field);
         HInstruction closureCall = new HInvokeClosure(
             callSelector,
-            _abstractValueDomain.createFromStaticType(fieldType),
+            _abstractValueDomain.createFromStaticType(fieldType).abstractValue,
             inputs,
             node.instructionType,
             node.typeArguments)
@@ -799,7 +805,11 @@
       }
 
       // If the target has no checks don't let a bad type stop us inlining.
-      if (!_options.parameterCheckPolicy.isEmitted) return;
+      if (!_closedWorld.annotationsData
+          .getParameterCheckPolicy(method)
+          .isEmitted) {
+        return;
+      }
 
       AbstractValue parameterAbstractValue = _abstractValueDomain
           .getAbstractValueForNativeMethodParameterType(parameterType);
@@ -1323,7 +1333,7 @@
     // Use `node.inputs.last` in case the call follows the interceptor calling
     // convention, but is not a call on an interceptor.
     HInstruction value = node.inputs.last;
-    if (_options.parameterCheckPolicy.isEmitted) {
+    if (_closedWorld.annotationsData.getParameterCheckPolicy(field).isEmitted) {
       if (_options.experimentNewRti) {
         // TODO(sra): Implement inlining of setters with checks for new rti.
         node.needsCheck = true;
@@ -1846,6 +1856,79 @@
 
     return node;
   }
+
+  @override
+  HInstruction visitTypeEval(HTypeEval node) {
+    if (TypeRecipe.isIdentity(node.typeExpression, node.envStructure)) {
+      return node.inputs.single;
+    }
+    return node;
+  }
+
+  @override
+  HInstruction visitAsCheck(HAsCheck node) {
+    if (node.isRedundant(_closedWorld)) return node.checkedInput;
+
+    // See if this check can be lowered to a simple one.
+    HInstruction typeInput = node.typeInput;
+    if (typeInput is HLoadType) {
+      DartType dartType = typeInput.typeExpression;
+      MemberEntity specializedCheck = SpecializedChecks.findAsCheck(
+          dartType, node.isTypeError, _closedWorld.commonElements);
+      if (specializedCheck != null) {
+        AbstractValueWithPrecision checkedType =
+            _abstractValueDomain.createFromStaticType(dartType);
+        return HAsCheckSimple(node.checkedInput, dartType, checkedType,
+            node.isTypeError, specializedCheck, node.instructionType);
+      }
+    }
+    return node;
+  }
+
+  @override
+  HInstruction visitAsCheckSimple(HAsCheckSimple node) {
+    if (node.isRedundant(_closedWorld)) return node.checkedInput;
+    return node;
+  }
+
+  @override
+  HInstruction visitInstanceEnvironment(HInstanceEnvironment node) {
+    HInstruction instance = node.inputs.single;
+
+    // Store-forward instance types of created instances and constant instances.
+    //
+    // Forwarding the type might cause the instance (HCreate, constant etc) to
+    // become dead. This might cause us to lose track of that fact that there
+    // are type expressions from within the instance's class scope, so breaking
+    // the algorithm for generating the per-type runtime type information. The
+    // fix is to register the classes as created here in case the instance
+    // becomes dead.
+    //
+    // TODO(sra): It would be cleaner to track on HLoadType, HTypeEval, etc
+    // which class scope(s) they originated from. If the type expressions become
+    // dead, the references to the scope type variables become dead.
+
+    if (instance is HCreate) {
+      if (instance.hasRtiInput) {
+        instance.instantiatedTypes?.forEach(_registry.registerInstantiation);
+        return instance.inputs.last;
+      }
+      return node;
+    }
+
+    if (instance is HConstant) {
+      ConstantValue constantValue = instance.constant;
+      if (constantValue is ConstructedConstantValue) {
+        _registry.registerInstantiation(constantValue.type);
+        return HLoadType(constantValue.type, instance.instructionType);
+      }
+      return node;
+    }
+
+    // TODO(sra): Store-forward list literal types.
+
+    return node;
+  }
 }
 
 class SsaCheckInserter extends HBaseVisitor implements OptimizationPhase {
diff --git a/pkg/compiler/lib/src/ssa/ssa.dart b/pkg/compiler/lib/src/ssa/ssa.dart
index 12f1db9..5fb6fe9 100644
--- a/pkg/compiler/lib/src/ssa/ssa.dart
+++ b/pkg/compiler/lib/src/ssa/ssa.dart
@@ -20,6 +20,7 @@
 import '../js_emitter/code_emitter_task.dart' show ModularEmitter;
 import '../js_emitter/startup_emitter/emitter.dart' show ModularEmitterImpl;
 import '../js_model/elements.dart';
+import '../js_model/type_recipe.dart' show TypeExpressionRecipe;
 import '../options.dart';
 import '../universe/call_structure.dart' show CallStructure;
 import '../universe/use.dart' show StaticUse;
@@ -141,47 +142,30 @@
             name);
         break;
       case AsyncMarker.SYNC_STAR:
-        rewriter = new SyncStarRewriter(_reporter, element,
-            endOfIteration:
-                emitter.staticFunctionAccess(commonElements.endOfIteration),
-            iterableFactory: emitter
-                .staticFunctionAccess(commonElements.syncStarIterableFactory),
-            iterableFactoryTypeArguments:
-                _fetchItemType(codegen, emitter, asyncTypeParameter),
-            yieldStarExpression:
-                emitter.staticFunctionAccess(commonElements.yieldStar),
-            uncaughtErrorExpression: emitter
-                .staticFunctionAccess(commonElements.syncStarUncaughtError),
-            safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
-            bodyName: namer.deriveAsyncBodyName(name));
-        registry.registerStaticUse(new StaticUse.staticInvoke(
-            commonElements.syncStarIterableFactory,
-            const CallStructure.unnamed(1, 1), [
-          elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)
-        ]));
+        rewriter = _makeSyncStarRewriter(
+            codegen,
+            commonElements,
+            elementEnvironment,
+            registry,
+            namer,
+            emitter,
+            element,
+            code,
+            asyncTypeParameter,
+            name);
         break;
       case AsyncMarker.ASYNC_STAR:
-        rewriter = new AsyncStarRewriter(_reporter, element,
-            asyncStarHelper:
-                emitter.staticFunctionAccess(commonElements.asyncStarHelper),
-            streamOfController:
-                emitter.staticFunctionAccess(commonElements.streamOfController),
-            wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
-            newController: emitter.staticFunctionAccess(
-                commonElements.asyncStarStreamControllerFactory),
-            newControllerTypeArguments:
-                _fetchItemType(codegen, emitter, asyncTypeParameter),
-            safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
-            yieldExpression:
-                emitter.staticFunctionAccess(commonElements.yieldSingle),
-            yieldStarExpression:
-                emitter.staticFunctionAccess(commonElements.yieldStar),
-            bodyName: namer.deriveAsyncBodyName(name));
-        registry.registerStaticUse(new StaticUse.staticInvoke(
-            commonElements.asyncStarStreamControllerFactory,
-            const CallStructure.unnamed(1, 1), [
-          elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)
-        ]));
+        rewriter = _makeAsyncStarRewriter(
+            codegen,
+            commonElements,
+            elementEnvironment,
+            registry,
+            namer,
+            emitter,
+            element,
+            code,
+            asyncTypeParameter,
+            name);
         break;
     }
     return rewriter.rewrite(code, bodySourceInformation, exitSourceInformation);
@@ -199,6 +183,24 @@
     return <js.Expression>[ast];
   }
 
+  List<js.Expression> _fetchItemTypeNewRti(
+      CodegenInputs codegen,
+      CommonElements commonElements,
+      CodegenRegistry registry,
+      ModularEmitter emitter,
+      DartType type) {
+    if (type == null) return null;
+
+    FunctionEntity helperElement = commonElements.findType;
+    registry.registerStaticUse(
+        new StaticUse.staticInvoke(helperElement, CallStructure.ONE_ARG));
+    js.Expression recipe = codegen.rtiRecipeEncoder
+        .encodeGroundRecipe(emitter, TypeExpressionRecipe(type));
+    js.Expression helper = emitter.staticFunctionAccess(helperElement);
+    var ast = js.js(r'#(#)', [helper, recipe]);
+    return <js.Expression>[ast];
+  }
+
   AsyncRewriter _makeAsyncRewriter(
       CodegenInputs codegen,
       CommonElements commonElements,
@@ -213,8 +215,10 @@
     FunctionEntity startFunction = commonElements.asyncHelperStartSync;
     FunctionEntity completerFactory = commonElements.asyncAwaitCompleterFactory;
 
-    List<js.Expression> itemTypeExpression =
-        _fetchItemType(codegen, emitter, elementType);
+    List<js.Expression> itemTypeExpression = _options.experimentNewRti
+        ? _fetchItemTypeNewRti(
+            codegen, commonElements, registry, emitter, elementType)
+        : _fetchItemType(codegen, emitter, elementType);
 
     AsyncRewriter rewriter = new AsyncRewriter(_reporter, element,
         asyncStart: emitter.staticFunctionAccess(startFunction),
@@ -238,6 +242,83 @@
     return rewriter;
   }
 
+  SyncStarRewriter _makeSyncStarRewriter(
+      CodegenInputs codegen,
+      CommonElements commonElements,
+      JElementEnvironment elementEnvironment,
+      CodegenRegistry registry,
+      ModularNamer namer,
+      ModularEmitter emitter,
+      FunctionEntity element,
+      js.Expression code,
+      DartType asyncTypeParameter,
+      js.Name name) {
+    List<js.Expression> itemTypeExpression = _options.experimentNewRti
+        ? _fetchItemTypeNewRti(
+            codegen, commonElements, registry, emitter, asyncTypeParameter)
+        : _fetchItemType(codegen, emitter, asyncTypeParameter);
+
+    SyncStarRewriter rewriter = new SyncStarRewriter(_reporter, element,
+        endOfIteration:
+            emitter.staticFunctionAccess(commonElements.endOfIteration),
+        iterableFactory: emitter
+            .staticFunctionAccess(commonElements.syncStarIterableFactory),
+        iterableFactoryTypeArguments: itemTypeExpression,
+        yieldStarExpression:
+            emitter.staticFunctionAccess(commonElements.yieldStar),
+        uncaughtErrorExpression:
+            emitter.staticFunctionAccess(commonElements.syncStarUncaughtError),
+        safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
+        bodyName: namer.deriveAsyncBodyName(name));
+
+    registry.registerStaticUse(new StaticUse.staticInvoke(
+        commonElements.syncStarIterableFactory,
+        const CallStructure.unnamed(1, 1),
+        [elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)]));
+
+    return rewriter;
+  }
+
+  AsyncStarRewriter _makeAsyncStarRewriter(
+      CodegenInputs codegen,
+      CommonElements commonElements,
+      JElementEnvironment elementEnvironment,
+      CodegenRegistry registry,
+      ModularNamer namer,
+      ModularEmitter emitter,
+      FunctionEntity element,
+      js.Expression code,
+      DartType asyncTypeParameter,
+      js.Name name) {
+    List<js.Expression> itemTypeExpression = _options.experimentNewRti
+        ? _fetchItemTypeNewRti(
+            codegen, commonElements, registry, emitter, asyncTypeParameter)
+        : _fetchItemType(codegen, emitter, asyncTypeParameter);
+
+    AsyncStarRewriter rewriter = new AsyncStarRewriter(_reporter, element,
+        asyncStarHelper:
+            emitter.staticFunctionAccess(commonElements.asyncStarHelper),
+        streamOfController:
+            emitter.staticFunctionAccess(commonElements.streamOfController),
+        wrapBody: emitter.staticFunctionAccess(commonElements.wrapBody),
+        newController: emitter.staticFunctionAccess(
+            commonElements.asyncStarStreamControllerFactory),
+        newControllerTypeArguments: itemTypeExpression,
+        safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
+        yieldExpression:
+            emitter.staticFunctionAccess(commonElements.yieldSingle),
+        yieldStarExpression:
+            emitter.staticFunctionAccess(commonElements.yieldStar),
+        bodyName: namer.deriveAsyncBodyName(name));
+
+    registry.registerStaticUse(new StaticUse.staticInvoke(
+        commonElements.asyncStarStreamControllerFactory,
+        const CallStructure.unnamed(1, 1),
+        [elementEnvironment.getFunctionAsyncOrSyncStarElementType(element)]));
+
+    return rewriter;
+  }
+
   @override
   Iterable<CompilerTask> get tasks {
     return <CompilerTask>[_builder, optimizer, generator];
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 7ca5ee2..72086bf 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -688,6 +688,13 @@
   }
 
   @override
+  String visitAsCheckSimple(HAsCheckSimple node) {
+    var inputs = node.inputs.map(temporaryId).join(', ');
+    String error = node.isTypeError ? 'TypeError' : 'CastError';
+    return "AsCheckSimple: $error ${node.dartType} $inputs";
+  }
+
+  @override
   String visitSubtypeCheck(HSubtypeCheck node) {
     var inputs = node.inputs.map(temporaryId).join(', ');
     return "SubtypeCheck: $inputs";
@@ -708,7 +715,7 @@
   @override
   String visitTypeEval(HTypeEval node) {
     var inputs = node.inputs.map(temporaryId).join(', ');
-    return "TypeEval: ${node.typeExpression}  $inputs";
+    return "TypeEval: ${node.typeExpression}  ${node.envStructure}  $inputs";
   }
 
   @override
diff --git a/pkg/compiler/lib/src/ssa/type_builder.dart b/pkg/compiler/lib/src/ssa/type_builder.dart
index 03ad305..7a0eaed 100644
--- a/pkg/compiler/lib/src/ssa/type_builder.dart
+++ b/pkg/compiler/lib/src/ssa/type_builder.dart
@@ -9,6 +9,7 @@
 import '../inferrer/abstract_value_domain.dart';
 import '../js_model/type_recipe.dart';
 import '../io/source_information.dart';
+import '../options.dart';
 import '../universe/use.dart' show TypeUse;
 import '../world.dart';
 
@@ -84,6 +85,9 @@
     if (other is HTypeConversion && other.isRedundant(builder.closedWorld)) {
       return original;
     }
+    if (other is HAsCheck && other.isRedundant(builder.closedWorld)) {
+      return original;
+    }
     return other;
   }
 
@@ -112,12 +116,14 @@
   }
 
   HInstruction potentiallyCheckOrTrustTypeOfParameter(
-      HInstruction original, DartType type) {
+      MemberEntity memberContext, HInstruction original, DartType type) {
     if (type == null) return original;
     HInstruction checkedOrTrusted = original;
-    if (builder.options.parameterCheckPolicy.isTrusted) {
+    CheckPolicy parameterCheckPolicy = builder.closedWorld.annotationsData
+        .getParameterCheckPolicy(memberContext);
+    if (parameterCheckPolicy.isTrusted) {
       checkedOrTrusted = _trustType(original, type);
-    } else if (builder.options.parameterCheckPolicy.isEmitted) {
+    } else if (parameterCheckPolicy.isEmitted) {
       checkedOrTrusted = _checkType(original, type);
     }
     if (checkedOrTrusted == original) return original;
@@ -129,25 +135,23 @@
   /// instruction that checks the type is what we expect or automatically
   /// trusts the written type.
   HInstruction potentiallyCheckOrTrustTypeOfAssignment(
-      HInstruction original, DartType type) {
+      MemberEntity memberContext, HInstruction original, DartType type) {
     if (type == null) return original;
-    HInstruction checkedOrTrusted = original;
-    if (builder.options.assignmentCheckPolicy.isTrusted) {
-      checkedOrTrusted = _trustType(original, type);
-    } else if (builder.options.assignmentCheckPolicy.isEmitted) {
-      checkedOrTrusted = _checkType(original, type);
-    }
+    HInstruction checkedOrTrusted = _trustType(original, type);
     if (checkedOrTrusted == original) return original;
     builder.add(checkedOrTrusted);
     return checkedOrTrusted;
   }
 
-  HInstruction potentiallyCheckOrTrustTypeOfCondition(HInstruction original) {
+  HInstruction potentiallyCheckOrTrustTypeOfCondition(
+      MemberEntity memberContext, HInstruction original) {
     DartType boolType = _closedWorld.commonElements.boolType;
     HInstruction checkedOrTrusted = original;
-    if (builder.options.conditionCheckPolicy.isTrusted) {
+    CheckPolicy conditionCheckPolicy = builder.closedWorld.annotationsData
+        .getConditionCheckPolicy(memberContext);
+    if (conditionCheckPolicy.isTrusted) {
       checkedOrTrusted = _trustType(original, boolType);
-    } else if (builder.options.conditionCheckPolicy.isEmitted) {
+    } else if (conditionCheckPolicy.isEmitted) {
       checkedOrTrusted = _checkBoolConverion(original);
     }
     if (checkedOrTrusted == original) return original;
@@ -475,19 +479,13 @@
     HInstruction reifiedType = analyzeTypeArgumentNewRti(
         type, builder.sourceElement,
         sourceInformation: sourceInformation);
-    if (type is InterfaceType) {
-      // TODO(sra): Under NNDB opt-in, this will be NonNullable.
-      AbstractValue subtype =
-          _abstractValueDomain.createNullableSubtype(type.element);
-      return HAsCheck(original, reifiedType, isTypeError, subtype)
-        ..sourceInformation = sourceInformation;
-    } else {
-      // TypeMasks don't encode function types or FutureOr types or type
-      // variable types.
-      AbstractValue abstractValue = original.instructionType;
-      return HAsCheck(original, reifiedType, isTypeError, abstractValue)
-        ..sourceInformation = sourceInformation;
-    }
+    AbstractValueWithPrecision checkedType =
+        _abstractValueDomain.createFromStaticType(type);
+    AbstractValue instructionType = _abstractValueDomain.intersection(
+        original.instructionType, checkedType.abstractValue);
+    return HAsCheck(
+        original, reifiedType, checkedType, type, isTypeError, instructionType)
+      ..sourceInformation = sourceInformation;
   }
 }
 
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 257ce71..987a986 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -7,7 +7,6 @@
 import '../elements/types.dart';
 import '../inferrer/abstract_value_domain.dart';
 import '../inferrer/types.dart';
-import '../options.dart';
 import '../universe/selector.dart' show Selector;
 import '../world.dart' show JClosedWorld;
 import 'logging.dart';
@@ -37,15 +36,14 @@
       new Map<HInstruction, Function>();
 
   final GlobalTypeInferenceResults results;
-  final CompilerOptions options;
   final CommonElements commonElements;
   final JClosedWorld closedWorld;
   final OptimizationTestLog _log;
   @override
   String get name => 'SsaTypePropagator';
 
-  SsaTypePropagator(this.results, this.options, this.commonElements,
-      this.closedWorld, this._log);
+  SsaTypePropagator(
+      this.results, this.commonElements, this.closedWorld, this._log);
 
   AbstractValueDomain get abstractValueDomain =>
       closedWorld.abstractValueDomain;
@@ -499,6 +497,27 @@
     }
 
     return instruction.specializer
-        .computeTypeFromInputTypes(instruction, results, options, closedWorld);
+        .computeTypeFromInputTypes(instruction, results, closedWorld);
+  }
+
+  @override
+  AbstractValue visitAsCheck(HAsCheck instruction) {
+    HInstruction input = instruction.checkedInput;
+    AbstractValue inputType = input.instructionType;
+    AbstractValue checkedType = instruction.checkedType.abstractValue;
+    AbstractValue outputType =
+        abstractValueDomain.intersection(checkedType, inputType);
+    outputType = _numericFixup(outputType, inputType, checkedType);
+    if (inputType != outputType) {
+      // Replace dominated uses of input with uses of this HTypeConversion so
+      // the uses benefit from the stronger type.
+      //
+      // Do not replace local accesses, since the local must be a HLocalValue,
+      // not a HAsCheck.
+      if (!(input is HParameterValue && input.usedAsVariable())) {
+        input.replaceAllUsersDominatedBy(instruction.next, instruction);
+      }
+    }
+    return outputType;
   }
 }
diff --git a/pkg/compiler/lib/src/universe/resolution_world_builder.dart b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
index 82cc3a2..19d9461 100644
--- a/pkg/compiler/lib/src/universe/resolution_world_builder.dart
+++ b/pkg/compiler/lib/src/universe/resolution_world_builder.dart
@@ -16,7 +16,7 @@
 import '../js_backend/interceptor_data.dart' show InterceptorDataBuilder;
 import '../js_backend/native_data.dart' show NativeBasicData, NativeDataBuilder;
 import '../js_backend/no_such_method_registry.dart';
-import '../js_backend/runtime_types.dart';
+import '../js_backend/runtime_types_resolution.dart';
 import '../kernel/element_map_impl.dart';
 import '../kernel/kernel_world.dart';
 import '../native/enqueue.dart' show NativeResolutionEnqueuer;
@@ -1056,7 +1056,7 @@
         mixinUses: _classHierarchyBuilder.mixinUses,
         typesImplementedBySubclasses: typesImplementedBySubclasses,
         classHierarchy: _classHierarchyBuilder.close(),
-        annotationsData: _annotationsDataBuilder.close(),
+        annotationsData: _annotationsDataBuilder.close(_options),
         isChecks: _isChecks,
         staticTypeArgumentDependencies: staticTypeArgumentDependencies,
         dynamicTypeArgumentDependencies: dynamicTypeArgumentDependencies,
diff --git a/pkg/compiler/lib/src/universe/world_impact.dart b/pkg/compiler/lib/src/universe/world_impact.dart
index f3c8e21..b7cdac8 100644
--- a/pkg/compiler/lib/src/universe/world_impact.dart
+++ b/pkg/compiler/lib/src/universe/world_impact.dart
@@ -4,6 +4,7 @@
 
 library dart2js.universe.world_impact;
 
+import '../elements/entities.dart';
 import '../util/util.dart' show Setlet;
 import 'use.dart';
 
@@ -21,6 +22,8 @@
 class WorldImpact {
   const WorldImpact();
 
+  MemberEntity get member => null;
+
   Iterable<DynamicUse> get dynamicUses => const <DynamicUse>[];
 
   Iterable<StaticUse> get staticUses => const <StaticUse>[];
@@ -37,10 +40,12 @@
   bool get isEmpty => true;
 
   void apply(WorldImpactVisitor visitor) {
-    staticUses.forEach(visitor.visitStaticUse);
-    dynamicUses.forEach(visitor.visitDynamicUse);
-    typeUses.forEach(visitor.visitTypeUse);
-    constantUses.forEach(visitor.visitConstantUse);
+    staticUses.forEach((StaticUse use) => visitor.visitStaticUse(member, use));
+    dynamicUses
+        .forEach((DynamicUse use) => visitor.visitDynamicUse(member, use));
+    typeUses.forEach((TypeUse use) => visitor.visitTypeUse(member, use));
+    constantUses
+        .forEach((ConstantUse use) => visitor.visitConstantUse(member, use));
   }
 
   @override
@@ -53,6 +58,8 @@
   }
 
   static void printOn(StringBuffer sb, WorldImpact worldImpact) {
+    sb.write('member: ${worldImpact.member}');
+
     void add(String title, Iterable iterable) {
       if (iterable.isNotEmpty) {
         sb.write('\n $title:');
@@ -222,6 +229,9 @@
   TransformedWorldImpact(this.worldImpact);
 
   @override
+  MemberEntity get member => worldImpact.member;
+
+  @override
   bool get isEmpty {
     return worldImpact.isEmpty &&
         _staticUses == null &&
@@ -288,10 +298,12 @@
 
   @override
   void apply(WorldImpactVisitor visitor) {
-    staticUses.forEach(visitor.visitStaticUse);
-    dynamicUses.forEach(visitor.visitDynamicUse);
-    typeUses.forEach(visitor.visitTypeUse);
-    constantUses.forEach(visitor.visitConstantUse);
+    staticUses.forEach((StaticUse use) => visitor.visitStaticUse(member, use));
+    dynamicUses
+        .forEach((DynamicUse use) => visitor.visitDynamicUse(member, use));
+    typeUses.forEach((TypeUse use) => visitor.visitTypeUse(member, use));
+    constantUses
+        .forEach((ConstantUse use) => visitor.visitConstantUse(member, use));
   }
 
   @override
@@ -333,14 +345,14 @@
 
 /// Visitor used to process the uses of a [WorldImpact].
 abstract class WorldImpactVisitor {
-  void visitStaticUse(StaticUse staticUse);
-  void visitDynamicUse(DynamicUse dynamicUse);
-  void visitTypeUse(TypeUse typeUse);
-  void visitConstantUse(ConstantUse typeUse);
+  void visitStaticUse(MemberEntity member, StaticUse staticUse);
+  void visitDynamicUse(MemberEntity member, DynamicUse dynamicUse);
+  void visitTypeUse(MemberEntity member, TypeUse typeUse);
+  void visitConstantUse(MemberEntity member, ConstantUse typeUse);
 }
 
 // TODO(johnniwinther): Remove these when we get anonymous local classes.
-typedef void VisitUse<U>(U use);
+typedef void VisitUse<U>(MemberEntity member, U use);
 
 class WorldImpactVisitorImpl implements WorldImpactVisitor {
   final VisitUse<StaticUse> _visitStaticUse;
@@ -359,30 +371,30 @@
         _visitConstantUse = visitConstantUse;
 
   @override
-  void visitStaticUse(StaticUse use) {
+  void visitStaticUse(MemberEntity member, StaticUse use) {
     if (_visitStaticUse != null) {
-      _visitStaticUse(use);
+      _visitStaticUse(member, use);
     }
   }
 
   @override
-  void visitDynamicUse(DynamicUse use) {
+  void visitDynamicUse(MemberEntity member, DynamicUse use) {
     if (_visitDynamicUse != null) {
-      _visitDynamicUse(use);
+      _visitDynamicUse(member, use);
     }
   }
 
   @override
-  void visitTypeUse(TypeUse use) {
+  void visitTypeUse(MemberEntity member, TypeUse use) {
     if (_visitTypeUse != null) {
-      _visitTypeUse(use);
+      _visitTypeUse(member, use);
     }
   }
 
   @override
-  void visitConstantUse(ConstantUse use) {
+  void visitConstantUse(MemberEntity member, ConstantUse use) {
     if (_visitConstantUse != null) {
-      _visitConstantUse(use);
+      _visitConstantUse(member, use);
     }
   }
 }
diff --git a/pkg/compiler/lib/src/util/features.dart b/pkg/compiler/lib/src/util/features.dart
deleted file mode 100644
index bf98932..0000000
--- a/pkg/compiler/lib/src/util/features.dart
+++ /dev/null
@@ -1,158 +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.
-
-/// Set of features used in annotations.
-class Features {
-  Map<String, Object> _features = {};
-
-  void add(String key, {var value: ''}) {
-    _features[key] = value.toString();
-  }
-
-  void addElement(String key, [var value]) {
-    List<String> list = _features.putIfAbsent(key, () => <String>[]);
-    if (value != null) {
-      list.add(value.toString());
-    }
-  }
-
-  bool containsKey(String key) {
-    return _features.containsKey(key);
-  }
-
-  void operator []=(String key, String value) {
-    _features[key] = value;
-  }
-
-  Object operator [](String key) => _features[key];
-
-  Object remove(String key) => _features.remove(key);
-
-  bool get isEmpty => _features.isEmpty;
-
-  bool get isNotEmpty => _features.isNotEmpty;
-
-  void forEach(void Function(String, Object) f) {
-    _features.forEach(f);
-  }
-
-  /// Returns a string containing all features in a comma-separated list sorted
-  /// by feature names.
-  String getText() {
-    StringBuffer sb = new StringBuffer();
-    bool needsComma = false;
-    for (String name in _features.keys.toList()..sort()) {
-      dynamic value = _features[name];
-      if (value != null) {
-        if (needsComma) {
-          sb.write(',');
-        }
-        sb.write(name);
-        if (value is List<String>) {
-          value = '[${(value..sort()).join(',')}]';
-        }
-        if (value != '') {
-          sb.write('=');
-          sb.write(value);
-        }
-        needsComma = true;
-      }
-    }
-    return sb.toString();
-  }
-
-  @override
-  String toString() => 'Features(${getText()})';
-
-  /// Creates a [Features] object by parse the [text] encoding.
-  ///
-  /// Single features will be parsed as strings and list features (features
-  /// encoded in `[...]` will be parsed as lists of strings.
-  static Features fromText(String text) {
-    Features features = new Features();
-    if (text == null) return features;
-    int index = 0;
-    while (index < text.length) {
-      int eqPos = text.indexOf('=', index);
-      int commaPos = text.indexOf(',', index);
-      String name;
-      bool hasValue = false;
-      if (eqPos != -1 && commaPos != -1) {
-        if (eqPos < commaPos) {
-          name = text.substring(index, eqPos);
-          hasValue = true;
-          index = eqPos + 1;
-        } else {
-          name = text.substring(index, commaPos);
-          index = commaPos + 1;
-        }
-      } else if (eqPos != -1) {
-        name = text.substring(index, eqPos);
-        hasValue = true;
-        index = eqPos + 1;
-      } else if (commaPos != -1) {
-        name = text.substring(index, commaPos);
-        index = commaPos + 1;
-      } else {
-        name = text.substring(index);
-        index = text.length;
-      }
-      if (hasValue) {
-        const Map<String, String> delimiters = const {
-          '[': ']',
-          '{': '}',
-          '(': ')',
-          '<': '>'
-        };
-        List<String> endDelimiters = <String>[];
-        bool isList = index < text.length && text.startsWith('[', index);
-        if (isList) {
-          features.addElement(name);
-          endDelimiters.add(']');
-          index++;
-        }
-        int valueStart = index;
-        while (index < text.length) {
-          String char = text.substring(index, index + 1);
-          if (endDelimiters.isNotEmpty && endDelimiters.last == char) {
-            endDelimiters.removeLast();
-            index++;
-          } else {
-            String endDelimiter = delimiters[char];
-            if (endDelimiter != null) {
-              endDelimiters.add(endDelimiter);
-              index++;
-            } else if (char == ',') {
-              if (endDelimiters.isEmpty) {
-                break;
-              } else if (endDelimiters.length == 1 && isList) {
-                String value = text.substring(valueStart, index);
-                features.addElement(name, value);
-                index++;
-                valueStart = index;
-              } else {
-                index++;
-              }
-            } else {
-              index++;
-            }
-          }
-        }
-        if (isList) {
-          String value = text.substring(valueStart, index - 1);
-          if (value.isNotEmpty) {
-            features.addElement(name, value);
-          }
-        } else {
-          String value = text.substring(valueStart, index);
-          features.add(name, value: value);
-        }
-        index++;
-      } else {
-        features.add(name);
-      }
-    }
-    return features;
-  }
-}
diff --git a/pkg/compiler/lib/src/util/uri_extras.dart b/pkg/compiler/lib/src/util/uri_extras.dart
deleted file mode 100644
index 5164378..0000000
--- a/pkg/compiler/lib/src/util/uri_extras.dart
+++ /dev/null
@@ -1,73 +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.
-
-library uri_extras;
-
-import 'dart:math';
-
-String relativize(Uri base, Uri uri, bool isWindows) {
-  bool equalsNCS(String a, String b) {
-    return a.toLowerCase() == b.toLowerCase();
-  }
-
-  if (!equalsNCS(base.scheme, uri.scheme) ||
-      equalsNCS(base.scheme, 'dart') ||
-      equalsNCS(base.scheme, 'package')) {
-    return uri.toString();
-  }
-
-  if (!equalsNCS(base.scheme, 'file')) {
-    isWindows = false;
-  }
-
-  String normalize(String path) {
-    if (isWindows) {
-      return path.toLowerCase();
-    } else {
-      return path;
-    }
-  }
-
-  if (base.userInfo == uri.userInfo &&
-      equalsNCS(base.host, uri.host) &&
-      base.port == uri.port &&
-      uri.query == "" &&
-      uri.fragment == "") {
-    if (normalize(uri.path).startsWith(normalize(base.path))) {
-      return uri.path.substring(base.path.lastIndexOf('/') + 1);
-    }
-
-    if (!base.path.startsWith('/') || !uri.path.startsWith('/')) {
-      return uri.toString();
-    }
-
-    List<String> uriParts = uri.path.split('/');
-    List<String> baseParts = base.path.split('/');
-    int common = 0;
-    int length = min(uriParts.length, baseParts.length);
-    while (common < length &&
-        normalize(uriParts[common]) == normalize(baseParts[common])) {
-      common++;
-    }
-    if (common == 1 || (isWindows && common == 2)) {
-      // The first part will always be an empty string because the
-      // paths are absolute. On Windows, we must also consider drive
-      // letters or hostnames.
-      if (baseParts.length > common + 1) {
-        // Avoid using '..' to go to the root, unless we are already there.
-        return uri.path;
-      }
-    }
-    StringBuffer sb = new StringBuffer();
-    for (int i = common + 1; i < baseParts.length; i++) {
-      sb.write('../');
-    }
-    for (int i = common; i < uriParts.length - 1; i++) {
-      sb.write('${uriParts[i]}/');
-    }
-    sb.write('${uriParts.last}');
-    return sb.toString();
-  }
-  return uri.toString();
-}
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index 92be403..1174c10 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -78,11 +78,18 @@
   /// Mix the bits of the hash codes of the unordered key/value from [map] with
   /// [existing].
   static int unorderedMapHash(Map map, [int existing = 0]) {
-    int h = 0;
-    for (var key in map.keys) {
-      h ^= objectHash(key, objectHash(map[key]));
+    if (map.length == 0) return existing;
+    List<int> hashCodes = List(map.length);
+    int i = 0;
+    for (var entry in map.entries) {
+      hashCodes[i++] = objectHash(entry.key, objectHash(entry.value));
     }
-    return mixHashCodeBits(h, existing);
+    hashCodes.sort();
+    int h = existing;
+    for (int hashCode in hashCodes) {
+      h = mixHashCodeBits(h, hashCode);
+    }
+    return h;
   }
 
   /// Mix the bits of the key/value hash codes from [map] with [existing].
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index c592196..046be4f 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -25,7 +25,7 @@
 import 'js_backend/interceptor_data.dart' show InterceptorData;
 import 'js_backend/native_data.dart' show NativeData;
 import 'js_backend/no_such_method_registry.dart' show NoSuchMethodData;
-import 'js_backend/runtime_types.dart' show RuntimeTypesNeed;
+import 'js_backend/runtime_types_resolution.dart' show RuntimeTypesNeed;
 import 'js_model/locals.dart';
 import 'js_emitter/sorter.dart';
 import 'universe/class_hierarchy.dart';
diff --git a/pkg/compiler/tool/generate_kernel.dart b/pkg/compiler/tool/generate_kernel.dart
index f610317..817ba97 100644
--- a/pkg/compiler/tool/generate_kernel.dart
+++ b/pkg/compiler/tool/generate_kernel.dart
@@ -33,16 +33,16 @@
     ];
 
   if (flags.rest.isEmpty) {
-    var script = relativizeUri(Platform.script);
-    var platform =
-        relativizeUri(Uri.base.resolve(nativeToUriPath(flags['platform'])));
+    var script = relativizeUri(Uri.base, Platform.script, false);
+    var platform = relativizeUri(
+        Uri.base, Uri.base.resolve(nativeToUriPath(flags['platform'])), false);
     print('usage: ${Platform.executable} $script '
         '[--platform=$platform] [--out=out.dill] program.dart');
     exit(1);
   }
 
   Uri entry = Uri.base.resolve(nativeToUriPath(flags.rest.first));
-  var component = await kernelForProgram(entry, options);
+  var component = (await kernelForProgram(entry, options)).component;
   await writeComponentToBinary(component, flags['out']);
 }
 
diff --git a/pkg/dartfix/analysis_options.yaml b/pkg/dartfix/analysis_options.yaml
index bc2e864..63d1935 100644
--- a/pkg/dartfix/analysis_options.yaml
+++ b/pkg/dartfix/analysis_options.yaml
@@ -1,7 +1,11 @@
-include: package:pedantic/analysis_options.1.7.0.yaml
+include: package:pedantic/analysis_options.1.8.0.yaml
 
 linter:
   rules:
-    - directives_ordering
-    - empty_statements
-    - unnecessary_brace_in_string_interps
+    directives_ordering: true
+    empty_statements: true
+    unnecessary_brace_in_string_interps: true
+
+    # Turn off the prefer_is_empty lint so that it can be used in the example tests
+    # and not be reported during normal package analysis.
+    prefer_is_empty: false
diff --git a/pkg/dartfix/bin/dartfix.dart b/pkg/dartfix/bin/dartfix.dart
index 7df5fc4..d611474 100644
--- a/pkg/dartfix/bin/dartfix.dart
+++ b/pkg/dartfix/bin/dartfix.dart
@@ -7,7 +7,7 @@
 
 /// The entry point for dartfix.
 void main(List<String> args) async {
-  Driver starter = new Driver();
+  Driver starter = Driver();
 
   // Wait for the starter to complete.
   await starter.start(args);
diff --git a/pkg/dartfix/example/example-fixed.dart b/pkg/dartfix/example/example-fixed.dart
deleted file mode 100644
index 4f4a314..0000000
--- a/pkg/dartfix/example/example-fixed.dart
+++ /dev/null
@@ -1,18 +0,0 @@
-// This file contains code that has been modified by running dartfix.
-// See example.dart for the original unmodified code.
-
-// Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int.
-const double myDouble = 4;
-
-// This class is used as a mixin but does not use the new mixin syntax.
-// Running dartfix converts this class to use the new syntax.
-mixin MyMixin {
-  final someValue = myDouble;
-}
-
-class MyClass with MyMixin {}
-
-main() {
-  print('myDouble = ${MyClass().someValue}');
-}
diff --git a/pkg/dartfix/example/example.dart b/pkg/dartfix/example/example.dart
index 53d5292..dabfd0c 100644
--- a/pkg/dartfix/example/example.dart
+++ b/pkg/dartfix/example/example.dart
@@ -1,8 +1,13 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
 // This file contains code that is modified by running dartfix.
-// After running dartfix, the content of this file matches example-fixed.dart.
+// After running dartfix, this content matches a file in the "fixed" directory.
 
 // Dart will automatically convert int literals to doubles.
-// Running dartfix converts this double literal to an int.
+// Running dartfix converts this double literal to an int
+// if --double-to-int is specified on the command line.
 const double myDouble = 4.0;
 
 // This class is used as a mixin but does not use the new mixin syntax.
@@ -13,6 +18,8 @@
 
 class MyClass with MyMixin {}
 
-main() {
-  print('myDouble = ${MyClass().someValue}');
+main(List<String> args) {
+  if (args.length == 0) {
+    print('myDouble = ${MyClass().someValue}');
+  }
 }
diff --git a/pkg/dartfix/fixed/example_default.dart b/pkg/dartfix/fixed/example_default.dart
new file mode 100644
index 0000000..fc6a20b
--- /dev/null
+++ b/pkg/dartfix/fixed/example_default.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int
+// if --double-to-int is specified on the command line.
+const double myDouble = 4;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+mixin MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main(List<String> args) {
+  if (args.length == 0) {
+    print('myDouble = ${MyClass().someValue}');
+  }
+}
diff --git a/pkg/dartfix/fixed/example_pedantic.dart b/pkg/dartfix/fixed/example_pedantic.dart
new file mode 100644
index 0000000..71852d6
--- /dev/null
+++ b/pkg/dartfix/fixed/example_pedantic.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int
+// if --double-to-int is specified on the command line.
+const double myDouble = 4.0;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+class MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main(List<String> args) {
+  if (args.isEmpty) {
+    print('myDouble = ${MyClass().someValue}');
+  }
+}
diff --git a/pkg/dartfix/fixed/example_prefer_is_empty.dart b/pkg/dartfix/fixed/example_prefer_is_empty.dart
new file mode 100644
index 0000000..71852d6
--- /dev/null
+++ b/pkg/dartfix/fixed/example_prefer_is_empty.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int
+// if --double-to-int is specified on the command line.
+const double myDouble = 4.0;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+class MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main(List<String> args) {
+  if (args.isEmpty) {
+    print('myDouble = ${MyClass().someValue}');
+  }
+}
diff --git a/pkg/dartfix/fixed/example_required.dart b/pkg/dartfix/fixed/example_required.dart
new file mode 100644
index 0000000..73b0cb7
--- /dev/null
+++ b/pkg/dartfix/fixed/example_required.dart
@@ -0,0 +1,25 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This file contains code that has been modified by running dartfix.
+// See example.dart for the original unmodified code.
+
+// Dart will automatically convert int literals to doubles.
+// Running dartfix converts this double literal to an int
+// if --double-to-int is specified on the command line.
+const double myDouble = 4.0;
+
+// This class is used as a mixin but does not use the new mixin syntax.
+// Running dartfix converts this class to use the new syntax.
+mixin MyMixin {
+  final someValue = myDouble;
+}
+
+class MyClass with MyMixin {}
+
+main(List<String> args) {
+  if (args.length == 0) {
+    print('myDouble = ${MyClass().someValue}');
+  }
+}
diff --git a/pkg/dartfix/lib/handler/analysis_complete_handler.dart b/pkg/dartfix/lib/handler/analysis_complete_handler.dart
index 939f703..e45b8a8 100644
--- a/pkg/dartfix/lib/handler/analysis_complete_handler.dart
+++ b/pkg/dartfix/lib/handler/analysis_complete_handler.dart
@@ -25,7 +25,7 @@
   }
 
   Future<void> analysisComplete() {
-    _analysisComplete ??= new Completer<void>();
+    _analysisComplete ??= Completer<void>();
     return _analysisComplete.future;
   }
 }
diff --git a/pkg/dartfix/lib/listener/bad_message_listener.dart b/pkg/dartfix/lib/listener/bad_message_listener.dart
index fc46ed9..b8fb5dc 100644
--- a/pkg/dartfix/lib/listener/bad_message_listener.dart
+++ b/pkg/dartfix/lib/listener/bad_message_listener.dart
@@ -16,7 +16,7 @@
       _receivedBadDataFromServer = true;
       // Give the server 1 second to continue outputting bad data
       // such as outputting a stacktrace.
-      new Future.delayed(new Duration(seconds: 1), () {
+      Future.delayed(Duration(seconds: 1), () {
         throw '$prefix $details';
       });
     }
diff --git a/pkg/dartfix/lib/listener/timed_listener.dart b/pkg/dartfix/lib/listener/timed_listener.dart
index 56a6555..69e904a 100644
--- a/pkg/dartfix/lib/listener/timed_listener.dart
+++ b/pkg/dartfix/lib/listener/timed_listener.dart
@@ -8,7 +8,7 @@
 /// to each logged interaction with the server.
 mixin TimedListener on ServerListener {
   /// Stopwatch that we use to generate timing information for debug output.
-  Stopwatch _time = new Stopwatch();
+  Stopwatch _time = Stopwatch();
 
   /// The [currentElapseTime] at which the last communication was received from
   /// the server or `null` if no communication has been received.
diff --git a/pkg/dartfix/lib/src/driver.dart b/pkg/dartfix/lib/src/driver.dart
index 1ae0b29..3908b60 100644
--- a/pkg/dartfix/lib/src/driver.dart
+++ b/pkg/dartfix/lib/src/driver.dart
@@ -50,7 +50,7 @@
     }
     if (checkIfChangesShouldBeApplied(result)) {
       for (SourceFileEdit fileEdit in result.edits) {
-        final file = new File(fileEdit.file);
+        final file = File(fileEdit.file);
         String code = file.existsSync() ? file.readAsStringSync() : '';
         code = SourceEdit.applySequence(code, fileEdit.edits);
         await file.writeAsString(code);
@@ -80,15 +80,22 @@
   /// server being run and return `true` if they are.
   /// Display an error message and return `false` if not.
   bool checkIfSelectedOptionsAreSupported(Options options) {
-    if (handler.serverProtocolVersion.compareTo(new Version(1, 22, 2)) >= 0) {
+    if (handler.serverProtocolVersion.compareTo(Version(1, 27, 2)) >= 0) {
+      return true;
+    }
+    if (options.pedanticFixes) {
+      _unsupportedOption(pedanticOption);
+      return false;
+    }
+    if (handler.serverProtocolVersion.compareTo(Version(1, 22, 2)) >= 0) {
       return true;
     }
     if (options.excludeFixes.isNotEmpty) {
-      _unsupportedOption(excludeOption);
+      _unsupportedOption(excludeFixOption);
       return false;
     }
     if (options.includeFixes.isNotEmpty) {
-      _unsupportedOption(includeOption);
+      _unsupportedOption(includeFixOption);
       return false;
     }
     if (options.requiredFixes) {
@@ -108,7 +115,7 @@
     logger.trace('Requesting fixes');
     Future isAnalysisComplete = handler.analysisComplete();
 
-    final params = new EditDartfixParams(options.targets);
+    final params = EditDartfixParams(options.targets);
     if (options.excludeFixes.isNotEmpty) {
       params.excludedFixes = options.excludeFixes;
     }
@@ -118,6 +125,9 @@
     if (options.requiredFixes) {
       params.includeRequiredFixes = true;
     }
+    if (options.pedanticFixes) {
+      params.includePedanticFixes = true;
+    }
     Map<String, dynamic> json =
         await server.send(EDIT_REQUEST_DARTFIX, params.toJson());
 
@@ -128,7 +138,7 @@
     await isAnalysisComplete;
 
     progress.finish(showTiming: true);
-    ResponseDecoder decoder = new ResponseDecoder(null);
+    ResponseDecoder decoder = ResponseDecoder(null);
     return EditDartfixResult.fromJson(decoder, 'result', json);
   }
 
@@ -136,10 +146,10 @@
     if (suggestions.isNotEmpty) {
       logger.stdout('');
       logger.stdout(ansi.emphasized('$title:'));
-      List<DartFixSuggestion> sorted = new List.from(suggestions)
+      List<DartFixSuggestion> sorted = List.from(suggestions)
         ..sort(compareSuggestions);
       for (DartFixSuggestion suggestion in sorted) {
-        final msg = new StringBuffer();
+        final msg = StringBuffer();
         msg.write('  ${toSentenceFragment(suggestion.description)}');
         final loc = suggestion.location;
         if (loc != null) {
@@ -169,7 +179,7 @@
   void showFix(DartFix fix) {
     logger.stdout('''
 
-• ${fix.name}''');
+• ${ansi.emphasized(fix.name)}''');
     if (fix.description != null) {
       for (String line in _indentAndWrapDescription(fix.description)) {
         logger.stdout(line);
@@ -179,27 +189,28 @@
 
   Future<EditGetDartfixInfoResult> showFixes({Progress progress}) async {
     Map<String, dynamic> json = await server.send(
-        EDIT_REQUEST_GET_DARTFIX_INFO, new EditGetDartfixInfoParams().toJson());
+        EDIT_REQUEST_GET_DARTFIX_INFO, EditGetDartfixInfoParams().toJson());
     progress?.finish(showTiming: true);
-    ResponseDecoder decoder = new ResponseDecoder(null);
+    ResponseDecoder decoder = ResponseDecoder(null);
     final result = EditGetDartfixInfoResult.fromJson(decoder, 'result', json);
 
-    final fixes = new List<DartFix>.from(result.fixes)
+    final fixes = List<DartFix>.from(result.fixes)
       ..sort((f1, f2) => f1.name.compareTo(f2.name));
 
     logger.stdout('''
 
-These fixes are automatically applied unless at least one
---$includeOption option is specified and --$requiredOption is not specified.
-They may be individually disabled using --$excludeOption.''');
+The following fixes are automatically applied unless at least one --$includeFixOption option is specified
+(and --$requiredOption is not specified). They may be individually disabled using --$excludeFixOption.''');
 
     fixes.where((fix) => fix.isRequired).forEach(showFix);
 
     logger.stdout('''
 
-These fixes are NOT automatically applied, but may be enabled using --$includeOption.''');
+These fixes are NOT automatically applied, but may be enabled using --$includeFixOption:''');
 
-    fixes.where((fix) => !fix.isRequired).forEach(showFix);
+    fixes.where((fix) => !fix.isRequired).toList()
+      ..sort(compareFixes)
+      ..forEach(showFix);
 
     return result;
   }
@@ -216,8 +227,8 @@
     targets = options.targets;
     context = testContext ?? options.context;
     logger = testLogger ?? options.logger;
-    server = new Server(listener: new _Listener(logger));
-    handler = new _Handler(this);
+    server = Server(listener: _Listener(logger));
+    handler = _Handler(this);
 
     // Start showing progress before we start the analysis server.
     Progress progress;
@@ -228,7 +239,7 @@
     }
 
     if (!await startServer(options)) {
-      context.exit(15);
+      context.exit(16);
     }
 
     if (!checkIfSelectedOptionsAreSupported(options)) {
@@ -291,10 +302,10 @@
     logger.trace('');
     logger.trace('Setup analysis');
     await server.send(SERVER_REQUEST_SET_SUBSCRIPTIONS,
-        new ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
+        ServerSetSubscriptionsParams([ServerService.STATUS]).toJson());
     await server.send(
         ANALYSIS_REQUEST_SET_ANALYSIS_ROOTS,
-        new AnalysisSetAnalysisRootsParams(
+        AnalysisSetAnalysisRootsParams(
           options.targets,
           const [],
         ).toJson());
diff --git a/pkg/dartfix/lib/src/options.dart b/pkg/dartfix/lib/src/options.dart
index fc4e262..9aba6fa 100644
--- a/pkg/dartfix/lib/src/options.dart
+++ b/pkg/dartfix/lib/src/options.dart
@@ -9,12 +9,13 @@
 import 'package:dartfix/src/context.dart';
 import 'package:path/path.dart' as path;
 
-const excludeOption = 'exclude';
-
 const forceOption = 'force';
-const includeOption = 'include';
+const includeFixOption = 'fix';
+const excludeFixOption = 'excludeFix';
 const overwriteOption = 'overwrite';
+const pedanticOption = 'pedantic';
 const requiredOption = 'required';
+
 const _binaryName = 'dartfix';
 const _colorOption = 'color';
 const _serverSnapshot = 'server';
@@ -32,6 +33,7 @@
   final String sdkPath;
   final String serverSnapshot;
 
+  final bool pedanticFixes;
   final bool requiredFixes;
   final List<String> includeFixes;
   final List<String> excludeFixes;
@@ -44,11 +46,10 @@
 
   Options._fromArgs(this.context, ArgResults results)
       : force = results[forceOption] as bool,
-        includeFixes =
-            (results[includeOption] as List ?? []).cast<String>().toList(),
-        excludeFixes =
-            (results[excludeOption] as List ?? []).cast<String>().toList(),
+        includeFixes = (results[includeFixOption] as List ?? []).cast<String>(),
+        excludeFixes = (results[excludeFixOption] as List ?? []).cast<String>(),
         overwrite = results[overwriteOption] as bool,
+        pedanticFixes = results[pedanticOption] as bool,
         requiredFixes = results[requiredOption] as bool,
         sdkPath = _getSdkPath(),
         serverSnapshot = results[_serverSnapshot],
@@ -67,17 +68,16 @@
   }
 
   static Options parse(List<String> args, Context context, Logger logger) {
-    final parser = new ArgParser(allowTrailingOptions: true)
+    final parser = ArgParser(allowTrailingOptions: true)
       ..addSeparator('Choosing fixes to be applied:')
-      ..addMultiOption(includeOption,
-          abbr: 'i', help: 'Include a specific fix.', valueHelp: 'name-of-fix')
-      ..addMultiOption(excludeOption,
-          abbr: 'x', help: 'Exclude a specific fix.', valueHelp: 'name-of-fix')
+      ..addMultiOption(includeFixOption,
+          help: 'Include a specific fix.', valueHelp: 'name-of-fix')
+      ..addMultiOption(excludeFixOption,
+          help: 'Exclude a specific fix.', valueHelp: 'name-of-fix')
+      ..addFlag(pedanticOption,
+          help: 'Apply pedantic fixes.', defaultsTo: false, negatable: false)
       ..addFlag(requiredOption,
-          abbr: 'r',
-          help: 'Apply required fixes.',
-          defaultsTo: false,
-          negatable: false)
+          help: 'Apply required fixes.', defaultsTo: false, negatable: false)
       ..addSeparator('Modifying files:')
       ..addFlag(overwriteOption,
           abbr: 'w',
@@ -106,26 +106,26 @@
           help: 'Use ansi colors when printing messages.',
           defaultsTo: Ansi.terminalSupportsAnsi);
 
-    context ??= new Context();
+    context ??= Context();
 
     ArgResults results;
     try {
       results = parser.parse(args);
     } on FormatException catch (e) {
-      logger ??= new Logger.standard(ansi: new Ansi(Ansi.terminalSupportsAnsi));
+      logger ??= Logger.standard(ansi: Ansi(Ansi.terminalSupportsAnsi));
       logger.stderr(e.message);
       _showUsage(parser, logger);
-      context.exit(15);
+      context.exit(17);
     }
 
-    Options options = new Options._fromArgs(context, results);
+    Options options = Options._fromArgs(context, results);
 
     if (logger == null) {
       if (options.verbose) {
-        logger = new Logger.verbose();
+        logger = Logger.verbose();
       } else {
-        logger = new Logger.standard(
-            ansi: new Ansi(
+        logger = Logger.standard(
+            ansi: Ansi(
           options.useColor != null
               ? options.useColor
               : Ansi.terminalSupportsAnsi,
@@ -144,18 +144,18 @@
     String sdkPath = options.sdkPath;
     if (sdkPath == null) {
       logger.stderr('No Dart SDK found.');
-      context.exit(15);
+      context.exit(18);
     }
 
     if (!context.exists(sdkPath)) {
       logger.stderr('Invalid Dart SDK path: $sdkPath');
-      context.exit(15);
+      context.exit(19);
     }
 
     // Check for files and/or directories to analyze.
     if (options.targets == null || options.targets.isEmpty) {
       logger.stderr('Expected at least one file or directory to analyze.');
-      context.exit(15);
+      context.exit(20);
     }
 
     // Normalize and verify paths
@@ -168,7 +168,7 @@
         } else {
           logger.stderr('Expected directory, but found: $target');
         }
-        context.exit(15);
+        context.exit(21);
       }
     }
 
@@ -200,7 +200,7 @@
         ? '''
 
 Use --$_helpOption to display the fixes that can be specified using either
---$includeOption or --$excludeOption.'''
+--$includeFixOption or --$excludeFixOption.'''
         : '');
   }
 }
diff --git a/pkg/dartfix/lib/src/util.dart b/pkg/dartfix/lib/src/util.dart
index cdce9f4..b3935f8 100644
--- a/pkg/dartfix/lib/src/util.dart
+++ b/pkg/dartfix/lib/src/util.dart
@@ -15,9 +15,14 @@
   return (s2.location?.offset ?? 0) - (s1.location?.offset ?? 0);
 }
 
-/// Return the analysis_server executable by proceeding upward
-/// until finding the Dart SDK repository root then returning
-/// the analysis_server executable within the repository.
+int compareFixes(DartFix s1, DartFix s2) {
+  return s1.name.compareTo(s2.name);
+}
+
+/// Return the analysis_server executable by proceeding upward until finding the
+/// Dart SDK repository root, then returning the analysis_server executable
+/// within the repository.
+///
 /// Return `null` if it cannot be found.
 String findServerPath() {
   String pathname = Platform.script.toFilePath();
@@ -28,7 +33,7 @@
     }
     String serverPath =
         path.join(parent, 'pkg', 'analysis_server', 'bin', 'server.dart');
-    if (new File(serverPath).existsSync()) {
+    if (File(serverPath).existsSync()) {
       return serverPath;
     }
     pathname = parent;
diff --git a/pkg/dartfix/pubspec.yaml b/pkg/dartfix/pubspec.yaml
index 06f97d6..124c866 100644
--- a/pkg/dartfix/pubspec.yaml
+++ b/pkg/dartfix/pubspec.yaml
@@ -15,13 +15,17 @@
 dependencies:
   # pin to an exact version of analysis_server_client because the edit.dartfix protocol
   # is experimental and will continue to evolve
-  analysis_server_client: 1.1.2
+  analysis_server_client: 1.1.3
   args: ^1.4.0
   cli_util: ^0.1.3
   path: ^1.6.0
   pub_semver: ^1.4.2
 
 dev_dependencies:
-  analyzer: ^0.33.0
-  pedantic: ^1.7.0
+  analyzer: ^0.37.0
+  pedantic: ^1.8.0
   test: ^1.3.0
+
+dependency_overrides:
+  analysis_server_client:
+    path: ../analysis_server_client
diff --git a/pkg/dartfix/test/src/driver_example_test.dart b/pkg/dartfix/test/src/driver_example_test.dart
new file mode 100644
index 0000000..6968d1f
--- /dev/null
+++ b/pkg/dartfix/test/src/driver_example_test.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:test/test.dart';
+
+import 'test_context.dart';
+
+main() {
+  test('run original example', () async {
+    File exampleFile = findFile('pkg/dartfix/example/example.dart');
+
+    print('--- launching original example');
+    final futureResult1 =
+        Process.run(Platform.resolvedExecutable, [exampleFile.path]);
+
+    print('--- waiting for original example');
+    final result = await futureResult1;
+
+    print('--- original example output');
+    var text = result.stdout as String;
+    print(text);
+
+    expect(text.trim(), 'myDouble = 4.0');
+  });
+}
diff --git a/pkg/dartfix/test/src/driver_exclude_test.dart b/pkg/dartfix/test/src/driver_exclude_test.dart
index b57f4a1..828b6b1 100644
--- a/pkg/dartfix/test/src/driver_exclude_test.dart
+++ b/pkg/dartfix/test/src/driver_exclude_test.dart
@@ -19,18 +19,18 @@
     exampleFile = findFile('pkg/dartfix/example/example.dart');
     exampleDir = exampleFile.parent;
 
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger(debug: _debug);
+    final driver = Driver();
+    final testContext = TestContext();
+    final testLogger = TestLogger(debug: _debug);
     String exampleSource = await exampleFile.readAsString();
 
-    var args = ['-xuse-mixin', exampleDir.path];
-    if (_debug) {
-      args.add('-v');
-    }
     try {
-      await driver.start(args,
-          testContext: testContext, testLogger: testLogger);
+      await driver.start([
+        if (_debug) '-v',
+        '--excludeFix',
+        'use-mixin',
+        exampleDir.path,
+      ], testContext: testContext, testLogger: testLogger);
     } finally {
       if (_debug) {
         print(testLogger.stderrBuffer.toString());
@@ -41,8 +41,6 @@
     }
 
     final suggestions = driver.result.suggestions;
-    expect(suggestions, hasLength(1));
-    expectDoesNotHaveSuggestion(suggestions, 'Convert MyMixin to a mixin');
-    expectHasSuggestion(suggestions, 'Replace a double literal');
-  });
+    expect(suggestions, hasLength(0));
+  }, timeout: const Timeout(Duration(minutes: 3)));
 }
diff --git a/pkg/dartfix/test/src/driver_help_test.dart b/pkg/dartfix/test/src/driver_help_test.dart
index b7e944c..9165d5e 100644
--- a/pkg/dartfix/test/src/driver_help_test.dart
+++ b/pkg/dartfix/test/src/driver_help_test.dart
@@ -10,9 +10,9 @@
 
 main() {
   test('help explicit', () async {
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger();
+    final driver = Driver();
+    final testContext = TestContext();
+    final testLogger = TestLogger();
     try {
       await driver.start(
         ['--help'], // display help and list fixes
@@ -26,15 +26,15 @@
     final errText = testLogger.stderrBuffer.toString();
     final outText = testLogger.stdoutBuffer.toString();
     expect(errText, isEmpty);
-    expect(outText, contains('--$excludeOption'));
+    expect(outText, contains('--$excludeFixOption'));
     expect(outText, isNot(contains('Use --help to display the fixes')));
     expect(outText, contains('use-mixin'));
   });
 
   test('help implicit', () async {
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger();
+    final driver = Driver();
+    final testContext = TestContext();
+    final testLogger = TestLogger();
     try {
       await driver.start(
         [], // no options or arguments should display help and list fixes
@@ -50,7 +50,7 @@
     print(errText);
     print(outText);
     expect(errText, isEmpty);
-    expect(outText, contains('--$excludeOption'));
+    expect(outText, contains('--$excludeFixOption'));
     expect(outText, isNot(contains('Use --help to display the fixes')));
     expect(outText, contains('use-mixin'));
   });
diff --git a/pkg/dartfix/test/src/driver_include_test.dart b/pkg/dartfix/test/src/driver_include_test.dart
index d25e710..aef5f68 100644
--- a/pkg/dartfix/test/src/driver_include_test.dart
+++ b/pkg/dartfix/test/src/driver_include_test.dart
@@ -9,7 +9,7 @@
 
 import 'test_context.dart';
 
-const _debug = false;
+const _debug = true;
 
 main() {
   File exampleFile;
@@ -19,23 +19,29 @@
     exampleFile = findFile('pkg/dartfix/example/example.dart');
     exampleDir = exampleFile.parent;
 
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger();
+    final driver = Driver();
+    final testContext = TestContext();
+    final testLogger = TestLogger(debug: _debug);
     String exampleSource = await exampleFile.readAsString();
 
-    await driver.start(['-iuse-mixin', exampleDir.path],
-        testContext: testContext, testLogger: testLogger);
-    if (_debug) {
-      print(testLogger.stderrBuffer.toString());
-      print(testLogger.stdoutBuffer.toString());
-      print('--- original example');
-      print(exampleSource);
+    try {
+      await driver.start([
+        if (_debug) '-v',
+        '--fix',
+        'double-to-int',
+        exampleDir.path,
+      ], testContext: testContext, testLogger: testLogger);
+    } finally {
+      if (_debug) {
+        print(testLogger.stderrBuffer.toString());
+        print(testLogger.stdoutBuffer.toString());
+        print('--- original example');
+        print(exampleSource);
+      }
     }
 
     final suggestions = driver.result.suggestions;
     expect(suggestions, hasLength(1));
-    expectHasSuggestion(suggestions, 'Convert MyMixin to a mixin');
-    expectDoesNotHaveSuggestion(suggestions, 'Replace a double literal');
-  });
+    expectHasSuggestion(suggestions, 'Convert to an int literal');
+  }, timeout: const Timeout(Duration(minutes: 3)));
 }
diff --git a/pkg/dartfix/test/src/driver_pedantic_test.dart b/pkg/dartfix/test/src/driver_pedantic_test.dart
new file mode 100644
index 0000000..39d75c2
--- /dev/null
+++ b/pkg/dartfix/test/src/driver_pedantic_test.dart
@@ -0,0 +1,13 @@
+// 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 'driver_test.dart' show defineDriverTests;
+
+main() {
+  defineDriverTests(
+    name: 'pedantic',
+    options: ['--pedantic'],
+    expectedSuggestions: ["Replace with 'isEmpty'"],
+  );
+}
diff --git a/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart b/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart
new file mode 100644
index 0000000..fe1390e
--- /dev/null
+++ b/pkg/dartfix/test/src/driver_prefer_is_empty_test.dart
@@ -0,0 +1,13 @@
+// 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 'driver_test.dart' show defineDriverTests;
+
+main() {
+  defineDriverTests(
+    name: 'prefer-is-empty',
+    options: ['--fix', 'prefer-is-empty'],
+    expectedSuggestions: ["Replace with 'isEmpty'"],
+  );
+}
diff --git a/pkg/dartfix/test/src/driver_required_test.dart b/pkg/dartfix/test/src/driver_required_test.dart
index 408cbbf..a732db5 100644
--- a/pkg/dartfix/test/src/driver_required_test.dart
+++ b/pkg/dartfix/test/src/driver_required_test.dart
@@ -2,40 +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.
 
-import 'dart:io';
-
-import 'package:dartfix/src/driver.dart';
-import 'package:test/test.dart';
-
-import 'test_context.dart';
-
-const _debug = false;
+import 'driver_test.dart' show defineDriverTests;
 
 main() {
-  test('required fixes', () async {
-    File exampleFile;
-    Directory exampleDir;
-
-    exampleFile = findFile('pkg/dartfix/example/example.dart');
-    exampleDir = exampleFile.parent;
-
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger();
-    String exampleSource = await exampleFile.readAsString();
-
-    await driver.start(['-r', exampleDir.path],
-        testContext: testContext, testLogger: testLogger);
-    if (_debug) {
-      print(testLogger.stderrBuffer.toString());
-      print(testLogger.stdoutBuffer.toString());
-      print('--- original example');
-      print(exampleSource);
-    }
-
-    final suggestions = driver.result.suggestions;
-    expect(suggestions, hasLength(1));
-    expectHasSuggestion(suggestions, 'Convert MyMixin to a mixin');
-    expectDoesNotHaveSuggestion(suggestions, 'Replace a double literal');
-  });
+  defineDriverTests(
+    name: 'required',
+    options: ['--required'],
+    expectedSuggestions: ['Convert MyMixin to a mixin'],
+  );
 }
diff --git a/pkg/dartfix/test/src/driver_test.dart b/pkg/dartfix/test/src/driver_test.dart
index fc5bd29..8570f29 100644
--- a/pkg/dartfix/test/src/driver_test.dart
+++ b/pkg/dartfix/test/src/driver_test.dart
@@ -10,78 +10,82 @@
 
 import 'test_context.dart';
 
-const _debug = false;
-const _updateExample = false;
+void defineDriverTests({
+  String name,
+  List<String> options,
+  List<String> expectedSuggestions,
+  bool debug = false,
+  bool updateExample = false,
+}) {
+  var fixFileName = 'example_${name.replaceAll('-', '_')}.dart';
 
-main() {
   File exampleFile;
   File exampleFixedFile;
   Directory exampleDir;
 
   setUp(() {
     exampleFile = findFile('pkg/dartfix/example/example.dart');
-    exampleFixedFile = findFile('pkg/dartfix/example/example-fixed.dart');
+    exampleFixedFile = findFile('pkg/dartfix/fixed/$fixFileName');
     exampleDir = exampleFile.parent;
   });
 
-  test('fix example', () async {
-    final driver = new Driver();
-    final testContext = new TestContext();
-    final testLogger = new TestLogger(debug: _debug);
+  test('fix example - $name', () async {
+    final driver = Driver();
+    final testContext = TestContext();
+    final testLogger = TestLogger(debug: debug);
     String exampleSource = await exampleFile.readAsString();
 
-    await driver.start([
-      if (_debug) '-v',
-      exampleDir.path,
-    ], testContext: testContext, testLogger: testLogger);
-    if (_debug) {
+    await driver.start([if (debug) '-v', ...options, exampleDir.path],
+        testContext: testContext, testLogger: testLogger);
+    if (debug) {
       print(testLogger.stderrBuffer.toString());
       print(testLogger.stdoutBuffer.toString());
       print('--- original example');
       print(exampleSource);
     }
 
-    final suggestions = driver.result.suggestions;
-    expect(suggestions, hasLength(2));
-    expectHasSuggestion(suggestions, 'Convert MyMixin to a mixin');
-    expectHasSuggestion(suggestions, 'Replace a double literal');
-
     expect(driver.result.edits, hasLength(1));
     for (SourceEdit edit in driver.result.edits[0].edits) {
       exampleSource = edit.apply(exampleSource);
     }
-    if (_debug) {
+    if (debug) {
       print('--- fixed example');
       print(exampleSource);
     }
 
+    final suggestions = driver.result.suggestions;
+    for (var expectedSuggestion in expectedSuggestions) {
+      expectHasSuggestion(suggestions, expectedSuggestion);
+    }
+    expect(suggestions, hasLength(expectedSuggestions.length));
+
     exampleSource = replaceLeadingComment(exampleSource);
-    if (_updateExample) {
+    if (updateExample) {
       await exampleFixedFile.writeAsString(exampleSource);
     } else {
       final expectedSource = await exampleFixedFile.readAsString();
       expect(exampleSource, expectedSource);
     }
-  });
+  }, timeout: const Timeout(Duration(minutes: 3)));
 
-  test('run example', () async {
-    if (_debug) print('--- launching original example');
+  test('run example - $name', () async {
+    if (debug) print('--- launching original example');
     final futureResult1 =
         Process.run(Platform.resolvedExecutable, [exampleFile.path]);
 
-    if (_debug) print('--- launching fixed example');
+    if (debug) print('--- launching fixed example');
     final futureResult2 =
         Process.run(Platform.resolvedExecutable, [exampleFixedFile.path]);
 
-    if (_debug) print('--- waiting for original example');
+    if (debug) print('--- waiting for original example');
     final result1 = await futureResult1;
 
-    if (_debug) print('--- waiting for fixed example');
+    if (debug) print('--- waiting for fixed example');
     final result2 = await futureResult2;
 
     final stdout1 = result1.stdout;
     final stdout2 = result2.stdout;
-    if (_debug) {
+    if (debug) {
       print('--- original example output');
       print(stdout1);
       print('--- fixed example output');
@@ -91,13 +95,25 @@
   });
 }
 
-String replaceLeadingComment(String source) {
-  final out = new StringBuffer('''
+main() {
+  defineDriverTests(
+    name: 'default',
+    options: ['--fix', 'double-to-int', '--fix', 'use-mixin'],
+    expectedSuggestions: [
+      'Convert MyMixin to a mixin',
+      'Convert to an int literal',
+    ],
+  );
+}
+
+String replaceLeadingComment(String source) => source.replaceAll(
+    '''
+// This file contains code that is modified by running dartfix.
+// After running dartfix, this content matches a file in the "fixed" directory.
+'''
+        .trim(),
+    '''
 // This file contains code that has been modified by running dartfix.
 // See example.dart for the original unmodified code.
   '''
-      .trim());
-  final pattern = 'the content of this file matches example-fixed.dart.';
-  out.write(source.substring(source.indexOf(pattern) + pattern.length));
-  return out.toString();
-}
+        .trim());
diff --git a/pkg/dartfix/test/src/options_test.dart b/pkg/dartfix/test/src/options_test.dart
index c8c2713..c6c87ed 100644
--- a/pkg/dartfix/test/src/options_test.dart
+++ b/pkg/dartfix/test/src/options_test.dart
@@ -13,8 +13,8 @@
   TestLogger logger;
 
   setUp(() {
-    context = new TestContext();
-    logger = new TestLogger();
+    context = TestContext();
+    logger = TestLogger();
   });
 
   String p(String filePath) => context.convertPath(filePath);
@@ -28,6 +28,7 @@
     List<String> excludeFixes = const <String>[],
     bool showHelp = false,
     String normalOut,
+    bool pedanticFixes = false,
     bool requiredFixes = false,
     bool overwrite = false,
     String serverSnapshot,
@@ -52,6 +53,7 @@
       expect(actualExitCode, isNull, reason: 'exit code');
     }
     expect(options.force, force);
+    expect(options.pedanticFixes, pedanticFixes);
     expect(options.requiredFixes, requiredFixes);
     expect(options.overwrite, overwrite);
     expect(options.serverSnapshot, serverSnapshot);
@@ -73,7 +75,7 @@
   }
 
   test('exclude fix', () {
-    parse(['--exclude', 'c', '--exclude', 'd', 'foo'],
+    parse(['--excludeFix', 'c', '--excludeFix', 'd', 'foo'],
         excludeFixes: ['c', 'd'], targetSuffixes: ['foo']);
   });
 
@@ -90,13 +92,13 @@
   });
 
   test('include fix', () {
-    parse(['--include', 'a', '--include', 'b', 'foo'],
+    parse(['--fix', 'a', '--fix', 'b', 'foo'],
         includeFixes: ['a', 'b'], targetSuffixes: ['foo']);
   });
 
   test('invalid option', () {
     parse(['--foo'],
-        errorOut: 'Could not find an option named "foo"', exitCode: 15);
+        errorOut: 'Could not find an option named "foo"', exitCode: 17);
   });
 
   test('invalid option no logger', () {
@@ -104,19 +106,23 @@
       Options.parse(['--foo'], context, null);
       fail('Expected exception');
     } on TestExit catch (e) {
-      expect(e.code, 15, reason: 'exit code');
+      expect(e.code, 17, reason: 'exit code');
     }
   });
 
   test('invalid target', () {
     parse(['foo.dart'],
-        errorOut: 'Expected directory, but found', exitCode: 15);
+        errorOut: 'Expected directory, but found', exitCode: 21);
   });
 
   test('overwrite', () {
     parse(['--overwrite', 'foo'], overwrite: true, targetSuffixes: ['foo']);
   });
 
+  test('pedantic fixes', () {
+    parse(['--pedantic', 'foo'], pedanticFixes: true);
+  });
+
   test('required fixes', () {
     parse(['--required', 'foo'], requiredFixes: true);
   });
diff --git a/pkg/dartfix/test/src/test_context.dart b/pkg/dartfix/test/src/test_context.dart
index 11010eb..8e8aa25 100644
--- a/pkg/dartfix/test/src/test_context.dart
+++ b/pkg/dartfix/test/src/test_context.dart
@@ -38,10 +38,10 @@
 class TestLogger implements Logger {
   final bool debug;
   final Ansi ansi;
-  final stdoutBuffer = new StringBuffer();
-  final stderrBuffer = new StringBuffer();
+  final stdoutBuffer = StringBuffer();
+  final stderrBuffer = StringBuffer();
 
-  TestLogger({this.debug = false}) : this.ansi = new Ansi(false);
+  TestLogger({this.debug = false}) : this.ansi = Ansi(false);
 
   @override
   void flush() {}
@@ -51,7 +51,7 @@
 
   @override
   Progress progress(String message) {
-    return new SimpleProgress(this, message);
+    return SimpleProgress(this, message);
   }
 
   @override
@@ -79,7 +79,8 @@
       return;
     }
   }
-  fail('Failed to find suggestion containing: $expectedText');
+  fail('Failed to find suggestion containing: $expectedText\n'
+      'in ${suggestions.map((s) => s.description).toList()}');
 }
 
 void expectDoesNotHaveSuggestion(
@@ -94,7 +95,7 @@
 File findFile(String relPath) {
   Directory dir = Directory.current;
   while (true) {
-    final file = new File.fromUri(dir.uri.resolve(relPath));
+    final file = File.fromUri(dir.uri.resolve(relPath));
     if (file.existsSync()) {
       return file;
     }
diff --git a/pkg/dev_compiler/bin/dartdevc.dart b/pkg/dev_compiler/bin/dartdevc.dart
index 4d4ac46..a906e00 100755
--- a/pkg/dev_compiler/bin/dartdevc.dart
+++ b/pkg/dev_compiler/bin/dartdevc.dart
@@ -56,7 +56,7 @@
     /// Build a map of uris to digests.
     final inputDigests = <Uri, List<int>>{};
     for (var input in request.inputs) {
-      inputDigests[Uri.base.resolve(input.path)] = input.digest;
+      inputDigests[sourcePathToUri(input.path)] = input.digest;
     }
 
     lastResult = await runZoned(
diff --git a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
index 519cd8b..f795cfb 100644
--- a/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/code_generator.dart
@@ -25,7 +25,7 @@
 import 'package:analyzer/src/generated/type_system.dart' show Dart2TypeSystem;
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/task/strong/ast_properties.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:source_span/source_span.dart' show SourceLocation;
 
 import '../compiler/js_metalet.dart' as js_ast;
@@ -262,8 +262,8 @@
   /// errors, and computes the output module code and optionally the source map.
   js_ast.Program compile(List<CompilationUnit> compilationUnits) {
     _libraryRoot = options.libraryRoot;
-    if (!_libraryRoot.endsWith(path.separator)) {
-      _libraryRoot += path.separator;
+    if (!_libraryRoot.endsWith(p.separator)) {
+      _libraryRoot += p.separator;
     }
 
     if (moduleItems.isNotEmpty) {
@@ -418,33 +418,26 @@
     return name;
   }
 
-  /// Choose a canonical name from the [library] element.
-  ///
-  /// This never uses the library's name (the identifier in the `library`
-  /// declaration) as it doesn't have any meaningful rules enforced.
   @override
   String jsLibraryName(LibraryElement library) {
-    var uri = library.source.uri;
+    var uri = library.source.uri.normalizePath();
     if (uri.scheme == 'dart') {
       return isSdkInternalRuntime(library) ? 'dart' : uri.path;
     }
-    // TODO(vsm): This is not necessarily unique if '__' appears in a file name.
-    var encodedSeparator = '__';
-    String qualifiedPath;
+    Iterable<String> segments;
     if (uri.scheme == 'package') {
       // Strip the package name.
-      // TODO(vsm): This is not unique if an escaped '/'appears in a filename.
-      // E.g., "foo/bar.dart" and "foo$47bar.dart" would collide.
-      qualifiedPath = uri.pathSegments.skip(1).join(encodedSeparator);
+      segments = uri.pathSegments.skip(1);
     } else {
-      qualifiedPath = path
-          .relative(uri.toFilePath(), from: _libraryRoot)
-          .replaceAll(path.separator, encodedSeparator)
-          .replaceAll('..', encodedSeparator);
+      segments = p.split(p.relative(uri.toFilePath(), from: _libraryRoot));
     }
-    return pathToJSIdentifier(qualifiedPath);
+    return pathToJSIdentifier(p.withoutExtension(segments.join('/')));
   }
 
+  // TODO(markzipan): Analyzer libraries are non-aliased.
+  @override
+  String jsLibraryAlias(LibraryElement library) => null;
+
   /// Debugger friendly name for a Dart Library.
   @override
   String jsLibraryDebuggerName(LibraryElement library) {
@@ -454,7 +447,7 @@
 
     var filePath = uri.toFilePath();
     // Relative path to the library.
-    return path.relative(filePath, from: _libraryRoot);
+    return p.relative(filePath, from: _libraryRoot);
   }
 
   /// Returns true if the library [l] is dart:_runtime.
@@ -3006,7 +2999,7 @@
   @override
   js_ast.Expression visitSimpleIdentifier(SimpleIdentifier node,
       [PrefixedIdentifier prefix]) {
-    var typeArgs = _getTypeArgs(node.staticElement, node.staticType);
+    var typeArgs = _emitFunctionTypeArguments(node.tearOffTypeArgumentTypes);
     var simpleId = _emitSimpleIdentifier(node, prefix)
       ..sourceInformation = _nodeSpan(node);
     if (prefix != null &&
@@ -3105,7 +3098,7 @@
   js_ast.Expression _emitClassMemberElement(
       ClassMemberElement element, Element accessor, Expression node) {
     bool isStatic = element.isStatic;
-    var classElem = element.enclosingElement;
+    var classElem = element.enclosingElement as ClassElement;
     var type = classElem.type;
     var member = _emitMemberName(element.name,
         isStatic: isStatic, type: type, element: accessor);
@@ -3300,7 +3293,7 @@
   /// [_emitTopLevelName] on the class, but if the member is external, then the
   /// native class name will be used, for direct access to the native member.
   js_ast.Expression _emitStaticClassName(ClassMemberElement member) {
-    var c = member.enclosingElement;
+    var c = member.enclosingElement as ClassElement;
     _declareBeforeUse(c);
 
     // A static native element should just forward directly to the JS type's
@@ -3593,7 +3586,7 @@
   /// Emits assignment to a static field element or property.
   js_ast.Expression _emitSetField(Expression right, FieldElement field,
       js_ast.Expression jsTarget, SimpleIdentifier id) {
-    var classElem = field.enclosingElement;
+    var classElem = field.enclosingElement as ClassElement;
     var isStatic = field.isStatic;
     var member = _emitMemberName(field.name,
         isStatic: isStatic, type: classElem.type, element: field.setter);
@@ -3998,57 +3991,18 @@
     if (function is Identifier && !_reifyGeneric(function.staticElement)) {
       return null;
     }
-    return _emitFunctionTypeArguments(
-        node, function.staticType, node.staticInvokeType, node.typeArguments);
+    if (node.typeArgumentTypes.isEmpty) {
+      return null;
+    }
+    return _emitFunctionTypeArguments(node.typeArgumentTypes);
   }
 
-  /// If `g` is a generic function type, and `f` is an instantiation of it,
-  /// then this will return the type arguments to apply, otherwise null.
+  /// If has [typeArguments], emit them, otherwise return `null`.
   List<js_ast.Expression> _emitFunctionTypeArguments(
-      AstNode node, DartType g, DartType f,
-      [TypeArgumentList typeArgs]) {
-    if (node is InvocationExpression) {
-      if (g is! FunctionType && typeArgs == null) {
-        return null;
-      }
-      var typeArguments = node.typeArgumentTypes;
-      return typeArguments.map(_emitType).toList(growable: false);
-    }
-
-    if (g is FunctionType &&
-        g.typeFormals.isNotEmpty &&
-        f is FunctionType &&
-        f.typeFormals.isEmpty) {
-      var typeArguments = _recoverTypeArguments(g, f);
-      return typeArguments.map(_emitType).toList(growable: false);
-    }
-
-    return null;
-  }
-
-  /// Given a generic function type [g] and an instantiated function type [f],
-  /// find a list of type arguments TArgs such that `g<TArgs> == f`,
-  /// and return TArgs.
-  ///
-  /// This function must be called with type [f] that was instantiated from [g].
-  Iterable<DartType> _recoverTypeArguments(FunctionType g, FunctionType f) {
-    // TODO(jmesserly): this design is a bit unfortunate. It would be nice if
-    // resolution could simply create a synthetic type argument list.
-    assert(g.typeFormals.isNotEmpty && f.typeFormals.isEmpty);
-    assert(g.typeFormals.length <= f.typeArguments.length);
-
-    // Instantiation in Analyzer works like this:
-    // Given:
-    //     {U/T} <S> T -> S
-    // Where {U/T} represents the typeArguments (U) and typeParameters (T) list,
-    // and <S> represents the typeFormals.
-    //
-    // Now instantiate([V]), and the result should be:
-    //     {U/T, V/S} T -> S.
-    //
-    // Therefore, we can recover the typeArguments from our instantiated
-    // function.
-    return f.typeArguments.skip(f.typeArguments.length - g.typeFormals.length);
+      List<DartType> typeArguments) {
+    if (typeArguments == null) return null;
+    if (typeArguments.isEmpty) return null;
+    return typeArguments.map(_emitType).toList(growable: false);
   }
 
   /// Emits code for the `JS(...)` macro.
@@ -4511,6 +4465,10 @@
         return _emitConstList(type.typeArguments[0],
             value.toListValue().map(_emitDartObject).toList());
       }
+      if (type.element == types.setType.element) {
+        return _emitConstSet(type.typeArguments[0],
+            value.toSetValue().map(_emitDartObject).toList());
+      }
       if (type.element == types.mapType.element) {
         var entries = <js_ast.Expression>[];
         value.toMapValue().forEach((key, value) {
@@ -4577,7 +4535,10 @@
     DartType getType(TypeAnnotation typeNode) {
       if (typeNode is NamedType && typeNode.typeArguments != null) {
         var e = typeNode.name.staticElement;
-        if (e is TypeParameterizedElement) {
+        if (e is ClassElement) {
+          return e.type.instantiate(
+              typeNode.typeArguments.arguments.map(getType).toList());
+        } else if (e is FunctionTypedElement) {
           return e.type.instantiate(
               typeNode.typeArguments.arguments.map(getType).toList());
         }
@@ -5260,23 +5221,9 @@
     }
   }
 
-  List<js_ast.Expression> _getTypeArgs(Element member, DartType instantiated) {
-    DartType type;
-    if (member is ExecutableElement) {
-      type = member.type;
-    } else if (member is VariableElement) {
-      type = member.type;
-    }
-
-    // TODO(jmesserly): handle explicitly passed type args.
-    if (type == null) return null;
-    return _emitFunctionTypeArguments(null, type, instantiated);
-  }
-
   /// Shared code for [PrefixedIdentifier] and [PropertyAccess].
   js_ast.Expression _emitPropertyGet(
       Expression receiver, SimpleIdentifier memberId, Expression accessNode) {
-    var resultType = accessNode.staticType;
     var accessor = memberId.staticElement;
     var memberName = memberId.name;
     var receiverType = getStaticType(receiver);
@@ -5329,7 +5276,9 @@
       result = _emitTargetAccess(jsTarget, jsName, accessor, memberId);
     }
 
-    var typeArgs = _getTypeArgs(accessor, resultType);
+    var typeArgs = _emitFunctionTypeArguments(
+      memberId.tearOffTypeArgumentTypes,
+    );
     return typeArgs == null
         ? result
         : runtimeCall('gbind(#, #)', [result, typeArgs]);
@@ -5808,6 +5757,12 @@
     return _emitType(type.instantiate(typeArgs));
   }
 
+  js_ast.Expression _emitConstSet(
+      DartType elementType, List<js_ast.Expression> elements) {
+    return cacheConst(
+        runtimeCall('constSet([#], #)', [elements, _emitType(elementType)]));
+  }
+
   js_ast.Expression _emitSetImplType(InterfaceType type, {bool identity}) {
     var typeArgs = type.typeArguments;
     if (typeArgs.isEmpty) return _emitType(type);
diff --git a/pkg/dev_compiler/lib/src/analyzer/command.dart b/pkg/dev_compiler/lib/src/analyzer/command.dart
index d8e2363..817b3c1 100644
--- a/pkg/dev_compiler/lib/src/analyzer/command.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/command.dart
@@ -9,7 +9,7 @@
     show ConflictingSummaryException;
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:args/command_runner.dart' show UsageException;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 import '../compiler/shared_command.dart' show CompilerResult;
 import 'context.dart' show AnalyzerOptions;
@@ -77,7 +77,7 @@
     print('''
 We're sorry, you've found a bug in our compiler.
 You can report this bug at:
-    https://github.com/dart-lang/sdk/issues/labels/area-dev-compiler
+    https://github.com/dart-lang/sdk/issues/labels/web-dev-compiler
 Please include the information below in your report, along with
 any other information that may help us track it down. Thanks!
     $_binaryName arguments: ${args.join(' ')}
@@ -170,8 +170,8 @@
   if (compilerOpts.summarizeApi) {
     var summaryPaths = compilerOpts.summaryOutPath != null
         ? [compilerOpts.summaryOutPath]
-        : outPaths.map((p) =>
-            '${path.withoutExtension(p)}.${compilerOpts.summaryExtension}');
+        : outPaths.map((path) =>
+            '${p.withoutExtension(path)}.${compilerOpts.summaryExtension}');
 
     // place next to every compiled module
     for (var summaryPath in summaryPaths) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/context.dart b/pkg/dev_compiler/lib/src/analyzer/context.dart
index b3f4d3f..4891f38 100644
--- a/pkg/dev_compiler/lib/src/analyzer/context.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/context.dart
@@ -17,7 +17,7 @@
     show InSummarySource, InSummaryUriResolver, SummaryDataStore;
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:cli_util/cli_util.dart' show getSdkPath;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 // ignore_for_file: deprecated_member_use
 
@@ -38,7 +38,7 @@
   ResourceProvider _resourceProvider;
 
   /// The default analysis root.
-  String analysisRoot = path.current;
+  String analysisRoot = p.current;
 
   // May be null.
   final DependencyTracker dependencyTracker;
@@ -69,7 +69,7 @@
 
     var dartSdkPath = args['dart-sdk'] as String ?? getSdkPath();
     dartSdkSummaryPath ??= contextOpts.dartSdkSummaryPath ??
-        path.join(dartSdkPath, 'lib', '_internal', 'ddc_sdk.sum');
+        p.join(dartSdkPath, 'lib', '_internal', 'ddc_sdk.sum');
     // For building the SDK, we explicitly set the path to none.
     if (dartSdkSummaryPath == 'build') dartSdkSummaryPath = null;
     contextOpts.dartSdkSummaryPath = dartSdkSummaryPath;
@@ -160,7 +160,7 @@
       ContextBuilder(resourceProvider, null, null, options: builderOptions);
 
   var packageResolver = PackageMapUriResolver(resourceProvider,
-      builder.convertPackagesToMap(builder.createPackageMap(path.current)));
+      builder.convertPackagesToMap(builder.createPackageMap(p.current)));
 
   return [ResourceUriResolver(resourceProvider), packageResolver];
 }
@@ -170,7 +170,7 @@
   for (var mapping in argument) {
     var splitMapping = mapping.split(',');
     if (splitMapping.length >= 2) {
-      mappings[splitMapping[0]] = path.absolute(splitMapping[1]);
+      mappings[splitMapping[0]] = p.absolute(splitMapping[1]);
     }
   }
   return mappings;
diff --git a/pkg/dev_compiler/lib/src/analyzer/driver.dart b/pkg/dev_compiler/lib/src/analyzer/driver.dart
index 24ea8fe..5a7b3ca 100644
--- a/pkg/dev_compiler/lib/src/analyzer/driver.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/driver.dart
@@ -13,13 +13,14 @@
 import 'package:analyzer/src/dart/analysis/file_state.dart';
 import 'package:analyzer/src/dart/analysis/library_analyzer.dart';
 import 'package:analyzer/src/dart/analysis/performance_logger.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/generated/sdk.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
 import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'package:meta/meta.dart';
 
 import '../compiler/shared_command.dart' show sdkLibraryVariables;
@@ -130,11 +131,13 @@
     _extensionTypes ??= ExtensionTypeSet(
       resynthesizerBuilder.context.typeProvider,
       resynthesizerBuilder.resynthesizer,
+      resynthesizerBuilder.elementFactory,
     );
 
     return LinkedAnalysisDriver(
       analysisOptions,
       resynthesizerBuilder.resynthesizer,
+      resynthesizerBuilder.elementFactory,
       sourceFactory,
       resynthesizerBuilder.libraryUris,
       declaredVariables,
@@ -172,6 +175,7 @@
 class LinkedAnalysisDriver {
   final AnalysisOptions analysisOptions;
   final SummaryResynthesizer resynthesizer;
+  final LinkedElementFactory elementFactory;
   final SourceFactory sourceFactory;
   final List<String> libraryUris;
   final DeclaredVariables declaredVariables;
@@ -186,6 +190,7 @@
   LinkedAnalysisDriver(
       this.analysisOptions,
       this.resynthesizer,
+      this.elementFactory,
       this.sourceFactory,
       this.libraryUris,
       this.declaredVariables,
@@ -193,12 +198,22 @@
       this._fsState,
       this._resourceProvider);
 
-  TypeProvider get typeProvider => resynthesizer.typeProvider;
+  TypeProvider get typeProvider {
+    if (resynthesizer != null) {
+      return resynthesizer.typeProvider;
+    } else {
+      return elementFactory.analysisContext.typeProvider;
+    }
+  }
 
   /// True if [uri] refers to a Dart library (i.e. a Dart source file exists
   /// with this uri, and it is not a part file).
   bool _isLibraryUri(String uri) {
-    return resynthesizer.hasLibrarySummary(uri);
+    if (resynthesizer != null) {
+      return resynthesizer.hasLibrarySummary(uri);
+    } else {
+      return elementFactory.isLibraryUri(uri);
+    }
   }
 
   /// Analyzes the library at [uri] and returns the results of analysis for all
@@ -208,16 +223,23 @@
       throw ArgumentError('"$libraryUri" is not a library');
     }
 
+    AnalysisContext analysisContext;
+    if (resynthesizer != null) {
+      analysisContext = resynthesizer.context;
+    } else {
+      analysisContext = elementFactory.analysisContext;
+    }
+
     var libraryFile = _fsState.getFileForUri(Uri.parse(libraryUri));
     var analyzer = LibraryAnalyzer(
         analysisOptions as AnalysisOptionsImpl,
         declaredVariables,
-        resynthesizer.sourceFactory,
+        sourceFactory,
         (uri) => _isLibraryUri('$uri'),
-        resynthesizer.context,
+        analysisContext,
         resynthesizer,
-        null,
-        InheritanceManager2(resynthesizer.typeSystem),
+        elementFactory,
+        InheritanceManager3(analysisContext.typeSystem),
         libraryFile,
         _resourceProvider);
     // TODO(jmesserly): ideally we'd use the existing public `analyze()` method,
@@ -233,6 +255,10 @@
   }
 
   LibraryElement getLibrary(String uri) {
-    return resynthesizer.getLibraryElement(uri);
+    if (resynthesizer != null) {
+      return resynthesizer.getLibraryElement(uri);
+    } else {
+      return elementFactory.libraryOfUri(uri);
+    }
   }
 }
diff --git a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
index e8fe0f0..98c7b54 100644
--- a/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/element_helpers.dart
@@ -57,7 +57,14 @@
     // Futhermore, the second line is represented by a GenericTypeAliasElement,
     // and its type getter does not even include its own type formals `<S>`.
     // That has to be worked around using `.function.type`.
-    var type = e is GenericTypeAliasElement ? e.function.type : e.type;
+    DartType type;
+    if (e is GenericTypeAliasElement) {
+      type = e.function.type;
+    } else if (e is FunctionTypedElement) {
+      type = e.type;
+    } else if (e is ClassElement) {
+      type = e.type;
+    }
     var bounds = rules.instantiateTypeFormalsToBounds(e.typeParameters);
     if (bounds == null) return type;
     return type.substitute2(
@@ -220,7 +227,7 @@
   var method = classElement.lookUpMethod(
       FunctionElement.NO_SUCH_METHOD_METHOD_NAME, classElement.library);
   var definingClass = method?.enclosingElement;
-  return definingClass != null && !definingClass.type.isObject;
+  return definingClass is ClassElement && !definingClass.type.isObject;
 }
 
 /// Returns true if this class is of the form:
diff --git a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
index db93257..3327bc8 100644
--- a/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/error_helpers.dart
@@ -9,7 +9,7 @@
 import 'package:analyzer/source/line_info.dart';
 import 'package:analyzer/src/error/codes.dart';
 import 'package:analyzer/src/generated/engine.dart' show AnalysisOptions;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 class ErrorCollector {
   final bool _replCompile;
@@ -63,7 +63,7 @@
     return (StringBuffer()
           ..write('[${_errorSeverity(error).displayName}] ')
           ..write(error.message)
-          ..write(' (${path.prettyUri(error.source.uri)}')
+          ..write(' (${p.prettyUri(error.source.uri)}')
           ..write(
               ', line ${location.lineNumber}, col ${location.columnNumber})'))
         .toString();
diff --git a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
index 195fe89..d0e80e6 100644
--- a/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/extension_types.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:collection';
+
 import 'package:analyzer/dart/element/element.dart'
-    show ClassElement, CompilationUnitElement, Element;
+    show ClassElement, CompilationUnitElement, Element, LibraryElement;
 import 'package:analyzer/dart/element/type.dart' show DartType, InterfaceType;
 import 'package:analyzer/src/generated/resolver.dart' show TypeProvider;
 import 'package:analyzer/src/summary/resynthesize.dart';
+import 'package:analyzer/src/summary2/linked_element_factory.dart';
 import 'element_helpers.dart' show getAnnotationName, isBuiltinAnnotation;
 
 /// Contains information about native JS types (those types provided by the
@@ -29,6 +31,7 @@
 /// `first` to the `Array.prototype`.
 class ExtensionTypeSet {
   final SummaryResynthesizer _resynthesizer;
+  final LinkedElementFactory _elementFactory;
 
   // Abstract types that may be implemented by both native and non-native
   // classes.
@@ -38,7 +41,8 @@
   final _nativeTypes = HashSet<ClassElement>();
   final _pendingLibraries = HashSet<String>();
 
-  ExtensionTypeSet(TypeProvider types, this._resynthesizer) {
+  ExtensionTypeSet(
+      TypeProvider types, this._resynthesizer, this._elementFactory) {
     // TODO(vsm): Eventually, we want to make this extensible - i.e., find
     // annotations in user code as well.  It would need to be summarized in
     // the element model - not searched this way on every compile.  To make this
@@ -108,14 +112,14 @@
   }
 
   void _addExtensionTypesForLibrary(String libraryUri, List<String> typeNames) {
-    var library = _resynthesizer.getLibraryElement(libraryUri);
+    var library = _getLibraryByUri(libraryUri);
     for (var typeName in typeNames) {
       _addExtensionType(library.getType(typeName).type);
     }
   }
 
   void _addExtensionTypes(String libraryUri) {
-    var library = _resynthesizer.getLibraryElement(libraryUri);
+    var library = _getLibraryByUri(libraryUri);
     _visitCompilationUnit(library.definingCompilationUnit);
     library.parts.forEach(_visitCompilationUnit);
   }
@@ -124,6 +128,14 @@
     _pendingLibraries.add(libraryUri);
   }
 
+  LibraryElement _getLibraryByUri(String uriStr) {
+    if (_resynthesizer != null) {
+      return _resynthesizer.getLibraryElement(uriStr);
+    } else {
+      return _elementFactory.libraryOfUri(uriStr);
+    }
+  }
+
   bool _processPending(Element element) {
     if (_pendingLibraries.isEmpty) return false;
     if (element is ClassElement) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
index 0ce3e60..3f4cd73 100644
--- a/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/module_compiler.dart
@@ -12,7 +12,7 @@
 
 import 'package:analyzer/src/generated/engine.dart' show AnalysisContext;
 import 'package:args/args.dart' show ArgParser, ArgResults;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:source_maps/source_maps.dart';
 
 import '../compiler/js_names.dart' as js_ast;
@@ -120,7 +120,8 @@
   if (analyzerOptions.dependencyTracker != null) {
     var file = File(analyzerOptions.dependencyTracker.outputPath);
     file.writeAsStringSync(
-        (analyzerOptions.dependencyTracker.dependencies.toList()..sort()).join('\n'));
+        (analyzerOptions.dependencyTracker.dependencies.toList()..sort())
+            .join('\n'));
   }
 
   var jsModule = JSModuleFile(
@@ -222,7 +223,7 @@
 
   static String _getLibraryRoot(ArgResults args) {
     var root = args['library-root'] as String;
-    return root != null ? path.absolute(root) : path.current;
+    return root != null ? p.absolute(root) : p.current;
   }
 }
 
@@ -286,10 +287,10 @@
       builtMap = placeSourceMap(
           sourceMap.build(jsUrl), mapUrl, options.bazelMapping, null);
       if (options.sourceMapComment) {
-        var jsDir = path.dirname(path.fromUri(jsUrl));
-        var relative = path.relative(path.fromUri(mapUrl), from: jsDir);
-        var relativeMapUrl = path.toUri(relative).toString();
-        assert(path.dirname(jsUrl) == path.dirname(mapUrl));
+        var jsDir = p.dirname(p.fromUri(jsUrl));
+        var relative = p.relative(p.fromUri(mapUrl), from: jsDir);
+        var relativeMapUrl = p.toUri(relative).toString();
+        assert(p.dirname(jsUrl) == p.dirname(mapUrl));
         printer.emit('\n//# sourceMappingURL=');
         printer.emit(relativeMapUrl);
         printer.emit('\n');
@@ -312,7 +313,7 @@
   void writeCodeSync(ModuleFormat format, String jsPath) {
     String mapPath = jsPath + '.map';
     var code = getCode(
-        format, path.toUri(jsPath).toString(), path.toUri(mapPath).toString());
+        format, p.toUri(jsPath).toString(), p.toUri(mapPath).toString());
     var c = code.code;
     if (format == ModuleFormat.amdConcat ||
         format == ModuleFormat.legacyConcat) {
diff --git a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
index ffa6943..789197d 100644
--- a/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
+++ b/pkg/dev_compiler/lib/src/analyzer/type_utilities.dart
@@ -190,7 +190,12 @@
     // readability to little or no benefit.  It would be good to do this
     // when we know that we can hoist it to an outer scope, but for
     // now we just disable it.
-    if (freeVariables.any((i) => i.enclosingElement is FunctionTypedElement)) {
+    if (freeVariables.any((i) =>
+        i.enclosingElement is FunctionTypedElement ||
+        // Strict function types don't have element, so their type parameters
+        // don't have any enclosing element. Analyzer started returning
+        // strict function types for generic methods.
+        i.enclosingElement == null)) {
       return true;
     }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/module_builder.dart b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
index a6ebc20..208ca81 100644
--- a/pkg/dev_compiler/lib/src/compiler/module_builder.dart
+++ b/pkg/dev_compiler/lib/src/compiler/module_builder.dart
@@ -4,7 +4,7 @@
 
 import 'package:args/args.dart' show ArgParser, ArgResults;
 import 'package:args/command_runner.dart' show UsageException;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 import '../js_ast/js_ast.dart';
 import 'js_names.dart';
@@ -206,8 +206,9 @@
         var names = export.exportedNames;
         assert(names != null); // export * not supported in legacy modules.
         for (var name in names) {
-          statements
-              .add(js.statement('#.# = #;', [exportsVar, name.name, name]));
+          var alias = name.asName ?? name.name;
+          statements.add(
+              js.statement('#.# = #;', [exportsVar, alias.name, name.name]));
         }
       }
     }
@@ -266,8 +267,9 @@
         // export * is not emitted by the compiler, so we don't handle it here.
         assert(names != null);
         for (var name in names) {
-          statements
-              .add(js.statement('#.# = #;', [exportsVar, name.name, name]));
+          var alias = name.asName ?? name.name;
+          statements.add(
+              js.statement('#.# = #;', [exportsVar, alias.name, name.name]));
         }
       }
     }
@@ -315,7 +317,8 @@
         // export * is not emitted by the compiler, so we don't handle it here.
         assert(names != null);
         for (var name in names) {
-          exportedProps.add(Property(js.string(name.name), name));
+          var alias = name.asName ?? name.name;
+          exportedProps.add(Property(js.string(alias.name), name.name));
         }
       }
       statements.add(js.comment('Exports:'));
@@ -338,9 +341,22 @@
   }
 }
 
-/// Escape [name] to make it into a valid identifier.
-String pathToJSIdentifier(String name) {
-  return toJSIdentifier(path.basenameWithoutExtension(name));
+/// Converts an entire arbitrary path string into a string compatible with
+/// JS identifier naming rules while conserving path information.
+///
+/// NOT guaranteed to result in a unique string. E.g.,
+///   1) '__' appears in a file name.
+///   2) An escaped '/' or '\' appears in a filename (a/b and a$47b).
+String pathToJSIdentifier(String path) {
+  path = p.normalize(path);
+  if (path.startsWith('/') || path.startsWith('\\')) {
+    path = path.substring(1, path.length);
+  }
+  return toJSIdentifier(path
+      .replaceAll('\\', '__')
+      .replaceAll('/', '__')
+      .replaceAll('..', '__')
+      .replaceAll('-', '_'));
 }
 
 /// Escape [name] to make it into a valid identifier.
@@ -371,3 +387,6 @@
 
 // Invalid characters for identifiers, which would need to be escaped.
 final _invalidCharInIdentifier = RegExp(r'[^A-Za-z_$0-9]');
+
+// Replacement string for path separators (i.e., '/', '\', '..').
+final encodedSeparator = "__";
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_command.dart b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
index fbbf31d..886de19 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_command.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_command.dart
@@ -7,8 +7,8 @@
 import 'package:analyzer/src/generated/engine.dart' show AnalysisEngine;
 import 'package:args/args.dart';
 import 'package:front_end/src/api_unstable/ddc.dart'
-    show InitializedCompilerState;
-import 'package:path/path.dart' as path;
+    show InitializedCompilerState, parseExperimentalArguments;
+import 'package:path/path.dart' as p;
 import 'module_builder.dart';
 import '../analyzer/command.dart' as analyzer_compiler;
 import '../analyzer/driver.dart' show CompilerAnalysisDriver;
@@ -117,8 +117,8 @@
             summarizeApi: args['summarize'] as bool,
             emitMetadata: args['emit-metadata'] as bool,
             enableAsserts: args['enable-asserts'] as bool,
-            experiments:
-                _parseExperiments(args['enable-experiment'] as List<String>),
+            experiments: parseExperimentalArguments(
+                args['enable-experiment'] as List<String>),
             bazelMapping:
                 _parseBazelMappings(args['bazel-mapping'] as List<String>),
             summaryModules: _parseCustomSummaryModules(
@@ -184,10 +184,9 @@
       if (moduleRoot != null) {
         // TODO(jmesserly): remove this legacy support after a deprecation
         // period. (Mainly this is to give time for migrating build rules.)
-        moduleName =
-            path.withoutExtension(path.relative(outPath, from: moduleRoot));
+        moduleName = p.withoutExtension(p.relative(outPath, from: moduleRoot));
       } else {
-        moduleName = path.basenameWithoutExtension(outPath);
+        moduleName = p.basenameWithoutExtension(outPath);
       }
     }
     // TODO(jmesserly): this should probably use sourcePathToUri.
@@ -195,7 +194,7 @@
     // Also we should not need this logic if the user passed in the module name
     // explicitly. It is here for backwards compatibility until we can confirm
     // that build systems do not depend on passing windows-style paths here.
-    return path.toUri(moduleName).toString();
+    return p.toUri(moduleName).toString();
   }
 }
 
@@ -217,42 +216,28 @@
             0,
             // Strip off the extension, including the last `.`.
             summaryPath.length - (summaryExt.length + 1))
-        : path.withoutExtension(summaryPath);
+        : p.withoutExtension(summaryPath);
     if (equalSign != -1) {
       modulePath = summaryPath.substring(equalSign + 1);
       summaryPath = summaryPath.substring(0, equalSign);
-    } else if (moduleRoot != null && path.isWithin(moduleRoot, summaryPath)) {
+    } else if (moduleRoot != null && p.isWithin(moduleRoot, summaryPath)) {
       // TODO(jmesserly): remove this, it's legacy --module-root support.
-      modulePath = path.url.joinAll(
-          path.split(path.relative(summaryPathWithoutExt, from: moduleRoot)));
+      modulePath = p.url.joinAll(
+          p.split(p.relative(summaryPathWithoutExt, from: moduleRoot)));
     } else {
-      modulePath = path.basename(summaryPathWithoutExt);
+      modulePath = p.basename(summaryPathWithoutExt);
     }
     pathToModule[summaryPath] = modulePath;
   }
   return pathToModule;
 }
 
-Map<String, bool> _parseExperiments(List<String> arguments) {
-  var result = <String, bool>{};
-  for (var argument in arguments) {
-    for (var feature in argument.split(',')) {
-      if (feature.startsWith('no-')) {
-        result[feature.substring(3)] = false;
-      } else {
-        result[feature] = true;
-      }
-    }
-  }
-  return result;
-}
-
 Map<String, String> _parseBazelMappings(List<String> argument) {
   var mappings = <String, String>{};
   for (var mapping in argument) {
     var splitMapping = mapping.split(',');
     if (splitMapping.length >= 2) {
-      mappings[path.absolute(splitMapping[0])] = splitMapping[1];
+      mappings[p.absolute(splitMapping[0])] = splitMapping[1];
     }
   }
   return mappings;
@@ -335,7 +320,7 @@
     var uriPath = uri.path;
     var root = Uri.base.path;
     if (uriPath.startsWith(root)) {
-      return path.toUri(uriPath.substring(root.length));
+      return p.toUri(uriPath.substring(root.length));
     }
   }
   return uri;
@@ -352,8 +337,8 @@
     {String multiRootOutputPath}) {
   var map = Map.from(sourceMap);
   // Convert to a local file path if it's not.
-  sourceMapPath = path.fromUri(sourcePathToUri(sourceMapPath));
-  var sourceMapDir = path.dirname(path.absolute(sourceMapPath));
+  sourceMapPath = sourcePathToUri(p.absolute(p.fromUri(sourceMapPath))).path;
+  var sourceMapDir = p.url.dirname(sourceMapPath);
   var list = (map['sources'] as List).toList();
 
   String makeRelative(String sourcePath) {
@@ -362,31 +347,32 @@
     if (scheme == 'dart' || scheme == 'package' || scheme == multiRootScheme) {
       if (scheme == multiRootScheme) {
         var multiRootPath = '$multiRootOutputPath${uri.path}';
-        multiRootPath = path.relative(multiRootPath, from: sourceMapDir);
+        multiRootPath = p.relative(multiRootPath, from: sourceMapDir);
         return multiRootPath;
       }
       return sourcePath;
     }
 
     // Convert to a local file path if it's not.
-    sourcePath = path.absolute(path.fromUri(uri));
+    sourcePath = sourcePathToUri(p.absolute(p.fromUri(uri))).path;
 
     // Allow bazel mappings to override.
-    var match = bazelMappings[sourcePath];
+    var match = bazelMappings != null ? bazelMappings[sourcePath] : null;
     if (match != null) return match;
 
     // Fall back to a relative path against the source map itself.
-    sourcePath = path.relative(sourcePath, from: sourceMapDir);
+    sourcePath = p.relative(sourcePath, from: sourceMapDir);
 
     // Convert from relative local path to relative URI.
-    return path.toUri(sourcePath).path;
+    return p.toUri(sourcePath).path;
   }
 
   for (int i = 0; i < list.length; i++) {
     list[i] = makeRelative(list[i] as String);
   }
   map['sources'] = list;
-  map['file'] = makeRelative(map['file'] as String);
+  map['file'] =
+      map['file'] != null ? makeRelative(map['file'] as String) : null;
   return map;
 }
 
diff --git a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
index 21daddb..2024848 100644
--- a/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
+++ b/pkg/dev_compiler/lib/src/compiler/shared_compiler.dart
@@ -96,11 +96,18 @@
   FunctionNode get currentFunction;
 
   /// Choose a canonical name from the [library] element.
+  @protected
+  String jsLibraryName(Library library);
+
+  /// Choose a module-unique name from the [library] element.
+  ///
+  /// Returns null if no alias exists or there are multiple output paths
+  /// (e.g., when compiling the Dart SDK).
   ///
   /// This never uses the library's name (the identifier in the `library`
   /// declaration) as it doesn't have any meaningful rules enforced.
   @protected
-  String jsLibraryName(Library library);
+  String jsLibraryAlias(Library library);
 
   /// Debugger friendly name for a Dart [library].
   @protected
@@ -384,12 +391,14 @@
         _libraries[library] = runtimeModule;
         continue;
       }
-      var id = js_ast.TemporaryId(jsLibraryName(library));
-      _libraries[library] = id;
+      var libraryId = js_ast.TemporaryId(jsLibraryName(library));
+      _libraries[library] = libraryId;
+      var alias = jsLibraryAlias(library);
+      var aliasId = alias == null ? null : js_ast.TemporaryId(alias);
 
       items.add(js.statement(
-          'const # = Object.create(#.library)', [id, runtimeModule]));
-      exports.add(js_ast.NameSpecifier(id));
+          'const # = Object.create(#.library)', [libraryId, runtimeModule]));
+      exports.add(js_ast.NameSpecifier(libraryId, asName: aliasId));
     }
 
     // dart:_runtime has a magic module that holds extension method symbols.
@@ -426,9 +435,9 @@
   @protected
   js_ast.Identifier emitLibraryName(Library library) {
     // It's either one of the libraries in this module, or it's an import.
+    var libraryId = js_ast.TemporaryId(jsLibraryName(library));
     return _libraries[library] ??
-        _imports.putIfAbsent(
-            library, () => js_ast.TemporaryId(jsLibraryName(library)));
+        _imports.putIfAbsent(library, () => libraryId);
   }
 
   /// Emits imports and extension methods into [items].
@@ -454,8 +463,14 @@
       //     import {foo} from 'foo';         // if no rename needed
       //     import {foo as foo$} from 'foo'; // if rename was needed
       //
-      var imports =
-          libraries.map((l) => js_ast.NameSpecifier(_imports[l])).toList();
+      var imports = libraries.map((library) {
+        var alias = jsLibraryAlias(library);
+        if (alias != null) {
+          var aliasId = js_ast.TemporaryId(alias);
+          return js_ast.NameSpecifier(aliasId, asName: _imports[library]);
+        }
+        return js_ast.NameSpecifier(_imports[library]);
+      }).toList();
       if (module == coreModuleName) {
         imports.add(js_ast.NameSpecifier(runtimeModule));
         imports.add(js_ast.NameSpecifier(extensionSymbolsModule));
diff --git a/pkg/dev_compiler/lib/src/js_ast/nodes.dart b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
index 219e99a..0d69f98 100644
--- a/pkg/dev_compiler/lib/src/js_ast/nodes.dart
+++ b/pkg/dev_compiler/lib/src/js_ast/nodes.dart
@@ -2272,20 +2272,22 @@
   /// if this is an `export *`.
   ///
   /// This can be useful for lowering to other module formats.
-  List<Identifier> get exportedNames {
-    if (isDefault) return [Identifier('default')];
+  List<NameSpecifier> get exportedNames {
+    if (isDefault) return [NameSpecifier(Identifier('default'))];
 
     var exported = this.exported;
-    if (exported is ClassDeclaration) return [exported.classExpr.name];
-    if (exported is FunctionDeclaration) return [exported.name];
+    if (exported is ClassDeclaration) {
+      return [NameSpecifier(exported.classExpr.name)];
+    }
+    if (exported is FunctionDeclaration) return [NameSpecifier(exported.name)];
     if (exported is VariableDeclarationList) {
       return exported.declarations
-          .map((i) => i.declaration as Identifier)
+          .map((i) => NameSpecifier(i.declaration as Identifier))
           .toList();
     }
     if (exported is ExportClause) {
       if (exported.exportStar) return null;
-      return exported.exports.map((e) => e.name).toList();
+      return exported.exports;
     }
     throw StateError('invalid export declaration');
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart b/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
index caa8b83..d90fa57 100644
--- a/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
+++ b/pkg/dev_compiler/lib/src/kernel/analyzer_to_kernel.dart
@@ -436,7 +436,7 @@
         fileUri: e.source.uri,
         reference: _reference(e));
     if (!e.isFinal && !e.isConst) {
-      var class_ = e.enclosingElement;
+      var class_ = e.enclosingElement as a.ClassElement;
       if (class_.typeParameters.isNotEmpty) {
         result.isGenericCovariantImpl = _isGenericCovariant(class_, e.type);
       }
@@ -598,7 +598,7 @@
     var enclosingElement = e.enclosingElement;
     if (hasBound && enclosingElement is a.ClassMemberElement) {
       var class_ = enclosingElement.enclosingElement;
-      if (class_ != null && class_.typeParameters.isNotEmpty) {
+      if (class_ is a.ClassElement && class_.typeParameters.isNotEmpty) {
         t.isGenericCovariantImpl = _isGenericCovariant(class_, e.bound);
       }
     }
diff --git a/pkg/dev_compiler/lib/src/kernel/command.dart b/pkg/dev_compiler/lib/src/kernel/command.dart
index 22da1ec..72912de 100644
--- a/pkg/dev_compiler/lib/src/kernel/command.dart
+++ b/pkg/dev_compiler/lib/src/kernel/command.dart
@@ -11,11 +11,10 @@
 import 'package:cli_util/cli_util.dart' show getSdkPath;
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:kernel/kernel.dart' hide MapEntry;
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/text/ast_to_text.dart' as kernel show Printer;
 import 'package:kernel/binary/ast_to_binary.dart' as kernel show BinaryPrinter;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:source_maps/source_maps.dart' show SourceMapBuilder;
 
 import '../compiler/js_names.dart' as js_ast;
@@ -48,7 +47,7 @@
     print('''
 We're sorry, you've found a bug in our compiler.
 You can report this bug at:
-    https://github.com/dart-lang/sdk/issues/labels/area-dev-compiler
+    https://github.com/dart-lang/sdk/issues/labels/web-dev-compiler
 Please include the information below in your report, along with
 any other information that may help us track it down. Thanks!
 -------------------- %< --------------------
@@ -76,7 +75,7 @@
   var argParser = ArgParser(allowTrailingOptions: true)
     ..addFlag('help',
         abbr: 'h', help: 'Display this message.', negatable: false)
-    ..addOption('out', abbr: 'o', help: 'Output file (required).')
+    ..addMultiOption('out', abbr: 'o', help: 'Output file (required).')
     ..addOption('packages', help: 'The package spec file to use.')
     // TODO(jmesserly): is this still useful for us, or can we remove it now?
     ..addFlag('summarize-text',
@@ -95,6 +94,8 @@
         help: 'The directories to search when encountering uris with the '
             'specified multi-root scheme.',
         defaultsTo: [Uri.base.path])
+    ..addOption('multi-root-output-path',
+        help: 'Path to set multi-root files relative to.', hide: true)
     ..addOption('dart-sdk',
         help: '(unsupported with --kernel) path to the Dart SDK.', hide: true)
     ..addFlag('compile-sdk',
@@ -113,12 +114,15 @@
     return CompilerResult(64);
   }
 
-  var output = argResults['out'] as String;
-  if (output == null) {
+  var outPaths = argResults['out'] as List<String>;
+  var moduleFormats = parseModuleFormatOption(argResults);
+  if (outPaths.isEmpty) {
     print('Please specify the output file location. For example:\n'
-        '    -o PATH/TO/OUTPUT_FILE.js'
-        '');
-    print(_usageMessage(argParser));
+        '    -o PATH/TO/OUTPUT_FILE.js');
+    return CompilerResult(64);
+  } else if (outPaths.length != moduleFormats.length) {
+    print('Number of output files (${outPaths.length}) must match '
+        'number of module formats (${moduleFormats.length}).');
     return CompilerResult(64);
   }
 
@@ -136,8 +140,17 @@
   var multiRootPaths = (argResults['multi-root'] as Iterable<String>)
       .map(Uri.base.resolve)
       .toList();
-  var multiRootOutputPath =
-      _longestPrefixingPath(path.absolute(output), multiRootPaths);
+  var multiRootOutputPath = argResults['multi-root-output-path'] as String;
+  if (multiRootOutputPath == null) {
+    if (outPaths.length > 1) {
+      print(
+          'If multiple output files (found ${outPaths.length}) are specified, '
+          'then --multi-root-output-path must be explicitly provided.');
+      return CompilerResult(64);
+    }
+    var jsOutputUri = sourcePathToUri(p.absolute(outPaths.first));
+    multiRootOutputPath = _longestPrefixingPath(jsOutputUri, multiRootPaths);
+  }
 
   var fileSystem = MultiRootFileSystem(
       multiRootScheme, multiRootPaths, fe.StandardFileSystem.instance);
@@ -181,10 +194,9 @@
     //
     // Another option: we could make an in-memory file with the relevant info.
     librarySpecPath =
-        path.join(path.dirname(path.dirname(sdkSummaryPath)), "libraries.json");
+        p.join(p.dirname(p.dirname(sdkSummaryPath)), "libraries.json");
     if (!File(librarySpecPath).existsSync()) {
-      librarySpecPath =
-          path.join(path.dirname(sdkSummaryPath), "libraries.json");
+      librarySpecPath = p.join(p.dirname(sdkSummaryPath), "libraries.json");
     }
   }
 
@@ -214,17 +226,8 @@
     fe.printDiagnosticMessage(message, print);
   }
 
-  var experiments = <fe.ExperimentalFlag, bool>{};
-  for (var name in options.experiments.keys) {
-    var flag = fe.parseExperimentalFlag(name);
-    if (flag == fe.ExperimentalFlag.expiredFlag) {
-      stderr.writeln("Flag '$name' is no longer required.");
-    } else if (flag != null) {
-      experiments[flag] = options.experiments[name];
-    } else {
-      stderr.writeln("Unknown experiment flag '$name'.");
-    }
-  }
+  var experiments = fe.parseExperimentalFlags(options.experiments,
+      onError: stderr.writeln, onWarning: print);
 
   bool trackWidgetCreation =
       argResults['track-widget-creation'] as bool ?? false;
@@ -246,7 +249,8 @@
         DevCompilerTarget(
             TargetFlags(trackWidgetCreation: trackWidgetCreation)),
         fileSystem: fileSystem,
-        experiments: experiments);
+        experiments: experiments,
+        environmentDefines: declaredVariables);
   } else {
     doneInputSummaries = List<Component>(summaryModules.length);
     compilerState = await fe.initializeIncrementalCompiler(
@@ -262,7 +266,8 @@
         DevCompilerTarget(
             TargetFlags(trackWidgetCreation: trackWidgetCreation)),
         fileSystem: fileSystem,
-        experiments: experiments);
+        experiments: experiments,
+        environmentDefines: declaredVariables);
     incrementalCompiler = compilerState.incrementalCompiler;
     cachedSdkInput =
         compilerState.workerInputCache[sourcePathToUri(sdkSummaryPath)];
@@ -284,15 +289,15 @@
     converter.dispose();
   }
 
-  ClassHierarchy hierarchy;
   fe.DdcResult result;
   if (useAnalyzer || !useIncrementalCompiler) {
     result = await fe.compile(compilerState, inputs, diagnosticMessageHandler);
   } else {
+    compilerState.options.onDiagnostic = diagnosticMessageHandler;
     Component incrementalComponent = await incrementalCompiler.computeDelta(
         entryPoints: inputs, fullComponent: true);
-    hierarchy = incrementalCompiler.userCode.loader.hierarchy;
-    result = fe.DdcResult(incrementalComponent, doneInputSummaries);
+    result = fe.DdcResult(incrementalComponent, doneInputSummaries,
+        incrementalCompiler.userCode.loader.hierarchy);
 
     // Workaround for DDC relying on isExternal being set to true.
     for (var lib in cachedSdkInput.component.libraries) {
@@ -304,6 +309,8 @@
       }
     }
   }
+  compilerState.options.onDiagnostic = null; // See http://dartbug.com/36983.
+
   if (result == null || !succeeded) {
     return CompilerResult(1, kernelState: compilerState);
   }
@@ -313,12 +320,15 @@
     return CompilerResult(1, kernelState: compilerState);
   }
 
-  var file = File(output);
-  await file.parent.create(recursive: true);
-
   // Output files can be written in parallel, so collect the futures.
   var outFiles = <Future>[];
   if (argResults['summarize'] as bool) {
+    if (outPaths.length > 1) {
+      print(
+          'If multiple output files (found ${outPaths.length}) are specified, '
+          'the --summarize option is not supported.');
+      return CompilerResult(64);
+    }
     // TODO(jmesserly): CFE mutates the Kernel tree, so we can't save the dill
     // file if we successfully reused a cached library. If compiler state is
     // unchanged, it means we used the cache.
@@ -328,46 +338,52 @@
     if (identical(compilerState, oldCompilerState)) {
       component.unbindCanonicalNames();
     }
-    var sink = File(path.withoutExtension(output) + '.dill').openWrite();
+    var sink = File(p.withoutExtension(outPaths.first) + '.dill').openWrite();
     // TODO(jmesserly): this appears to save external libraries.
     // Do we need to run them through an outlining step so they can be saved?
     kernel.BinaryPrinter(sink).writeComponentFile(component);
     outFiles.add(sink.flush().then((_) => sink.close()));
   }
   if (argResults['summarize-text'] as bool) {
+    if (outPaths.length > 1) {
+      print(
+          'If multiple output files (found ${outPaths.length}) are specified, '
+          'the --summarize-text option is not supported.');
+      return CompilerResult(64);
+    }
     StringBuffer sb = StringBuffer();
     kernel.Printer(sb, showExternal: false).writeComponentFile(component);
-    outFiles.add(File(output + '.txt').writeAsString(sb.toString()));
-  }
-  if (hierarchy == null) {
-    var target = compilerState.options.target as DevCompilerTarget;
-    hierarchy = target.hierarchy;
+    outFiles.add(File(outPaths.first + '.txt').writeAsString(sb.toString()));
   }
 
-  var compiler =
-      ProgramCompiler(component, hierarchy, options, declaredVariables);
+  var compiler = ProgramCompiler(
+      component, result.classHierarchy, options, declaredVariables);
 
   var jsModule = compiler.emitModule(
       component, result.inputSummaries, inputSummaries, summaryModules);
 
-  // TODO(jmesserly): support for multiple output formats?
-  //
   // Also the old Analyzer backend had some code to make debugging better when
   // --single-out-file is used, but that option does not appear to be used by
   // any of our build systems.
-  var jsCode = jsProgramToCode(jsModule, options.moduleFormats.first,
-      buildSourceMap: options.sourceMap,
-      inlineSourceMap: options.inlineSourceMap,
-      jsUrl: path.toUri(output).toString(),
-      mapUrl: path.toUri(output + '.map').toString(),
-      bazelMapping: options.bazelMapping,
-      customScheme: multiRootScheme,
-      multiRootOutputPath: multiRootOutputPath);
+  for (var i = 0; i < outPaths.length; ++i) {
+    var output = outPaths[i];
+    var moduleFormat = moduleFormats[i];
+    var file = File(output);
+    await file.parent.create(recursive: true);
+    var jsCode = jsProgramToCode(jsModule, moduleFormat,
+        buildSourceMap: options.sourceMap,
+        inlineSourceMap: options.inlineSourceMap,
+        jsUrl: p.toUri(output).toString(),
+        mapUrl: p.toUri(output + '.map').toString(),
+        bazelMapping: options.bazelMapping,
+        customScheme: multiRootScheme,
+        multiRootOutputPath: multiRootOutputPath);
 
-  outFiles.add(file.writeAsString(jsCode.code));
-  if (jsCode.sourceMap != null) {
-    outFiles.add(
-        File(output + '.map').writeAsString(json.encode(jsCode.sourceMap)));
+    outFiles.add(file.writeAsString(jsCode.code));
+    if (jsCode.sourceMap != null) {
+      outFiles.add(
+          File(output + '.map').writeAsString(json.encode(jsCode.sourceMap)));
+    }
   }
 
   await Future.wait(outFiles);
@@ -421,10 +437,10 @@
     builtMap = placeSourceMap(
         sourceMap.build(jsUrl), mapUrl, bazelMapping, customScheme,
         multiRootOutputPath: multiRootOutputPath);
-    var jsDir = path.dirname(path.fromUri(jsUrl));
-    var relative = path.relative(path.fromUri(mapUrl), from: jsDir);
-    var relativeMapUrl = path.toUri(relative).toString();
-    assert(path.dirname(jsUrl) == path.dirname(mapUrl));
+    var jsDir = p.dirname(p.fromUri(jsUrl));
+    var relative = p.relative(p.fromUri(mapUrl), from: jsDir);
+    var relativeMapUrl = p.toUri(relative).toString();
+    assert(p.dirname(jsUrl) == p.dirname(mapUrl));
     printer.emit('\n//# sourceMappingURL=');
     printer.emit(relativeMapUrl);
     printer.emit('\n');
@@ -469,12 +485,12 @@
 
 /// The default path of the kernel summary for the Dart SDK.
 final defaultSdkSummaryPath =
-    path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
+    p.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.dill');
 
-final defaultLibrarySpecPath = path.join(getSdkPath(), 'lib', 'libraries.json');
+final defaultLibrarySpecPath = p.join(getSdkPath(), 'lib', 'libraries.json');
 
 final defaultAnalyzerSdkSummaryPath =
-    path.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
+    p.join(getSdkPath(), 'lib', '_internal', 'ddc_sdk.sum');
 
 bool _checkForDartMirrorsImport(Component component) {
   for (var library in component.libraries) {
@@ -506,7 +522,7 @@
 
   // Check for $cwd/.packages
   while (true) {
-    var file = File(path.join(dir.path, ".packages"));
+    var file = File(p.join(dir.path, ".packages"));
     if (file.existsSync()) return file.path;
 
     // If we didn't find it, search the parent directory.
@@ -518,7 +534,8 @@
 }
 
 /// Inputs must be absolute paths. Returns null if no prefixing path is found.
-String _longestPrefixingPath(String basePath, List<Uri> prefixingPaths) {
+String _longestPrefixingPath(Uri baseUri, List<Uri> prefixingPaths) {
+  var basePath = baseUri.path;
   return prefixingPaths.fold(null, (String previousValue, Uri element) {
     if (basePath.startsWith(element.path) &&
         (previousValue == null || previousValue.length < element.path.length)) {
diff --git a/pkg/dev_compiler/lib/src/kernel/compiler.dart b/pkg/dev_compiler/lib/src/kernel/compiler.dart
index 76c8c53..fb8f432 100644
--- a/pkg/dev_compiler/lib/src/kernel/compiler.dart
+++ b/pkg/dev_compiler/lib/src/kernel/compiler.dart
@@ -14,6 +14,7 @@
 import 'package:kernel/type_algebra.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:source_span/source_span.dart' show SourceLocation;
+import 'package:path/path.dart' as p;
 
 import '../compiler/js_names.dart' as js_ast;
 import '../compiler/js_utils.dart' as js_ast;
@@ -32,13 +33,12 @@
 import 'property_model.dart';
 import 'type_table.dart';
 
-class ProgramCompiler extends Object
+class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
     with SharedCompiler<Library, Class, InterfaceType, FunctionNode>
     implements
         StatementVisitor<js_ast.Statement>,
         ExpressionVisitor<js_ast.Expression>,
-        DartTypeVisitor<js_ast.Expression>,
-        ConstantVisitor<js_ast.Expression> {
+        DartTypeVisitor<js_ast.Expression> {
   final SharedCompilerOptions _options;
 
   /// Maps a library URI import, that is not in [_libraries], to the
@@ -62,6 +62,16 @@
   /// Let variables collected for the given function.
   List<js_ast.TemporaryId> _letVariables;
 
+  final _constTable = js_ast.TemporaryId("CT");
+
+  // Constant getters used to populate the constant table.
+  final _constLazyAccessors = List<js_ast.Method>();
+
+  /// Tracks the index in [moduleItems] where the const table must be inserted.
+  /// Required for SDK builds due to internal circular dependencies.
+  /// E.g., dart.constList depends on JSArray.
+  int _constTableInsertionIndex = 0;
+
   /// The class that is emitting its base class or mixin references, otherwise
   /// null.
   ///
@@ -185,6 +195,9 @@
   /// as targets for continue and break.
   final _switchLabelStates = HashMap<Statement, _SwitchLabelState>();
 
+  /// Maps Kernel constants to their JS aliases.
+  final constAliasCache = HashMap<Constant, js_ast.Expression>();
+
   final Class _jsArrayClass;
   final Class _privateSymbolClass;
   final Class _linkedHashMapImplClass;
@@ -287,6 +300,11 @@
       _pendingClasses.addAll(l.classes);
     }
 
+    // TODO(markzipan): Don't emit this when compiling the SDK.
+    moduleItems
+        .add(js.statement("const # = Object.create(null);", [_constTable]));
+    _constTableInsertionIndex = moduleItems.length;
+
     // Add implicit dart:core dependency so it is first.
     emitLibraryName(_coreTypes.coreLibrary);
 
@@ -297,6 +315,15 @@
     // This is done by forward declaring items.
     libraries.forEach(_emitLibrary);
 
+    // This can cause problems if it's ever true during the SDK build, as it's
+    // emitted before dart.defineLazy.
+    if (_constLazyAccessors.isNotEmpty) {
+      var constTableBody = runtimeStatement(
+          'defineLazy(#, { # })', [_constTable, _constLazyAccessors]);
+      moduleItems.insert(_constTableInsertionIndex, constTableBody);
+      _constLazyAccessors.clear();
+    }
+
     moduleItems.addAll(afterClassDefItems);
     afterClassDefItems.clear();
 
@@ -319,21 +346,24 @@
     if (uri.scheme == 'dart') {
       return isSdkInternalRuntime(library) ? 'dart' : uri.path;
     }
+    return pathToJSIdentifier(p.withoutExtension(uri.pathSegments.last));
+  }
 
-    // TODO(vsm): This is not necessarily unique if '__' appears in a file name.
+  @override
+  String jsLibraryAlias(Library library) {
+    var uri = library.importUri.normalizePath();
+    if (uri.scheme == 'dart') return null;
+
     Iterable<String> segments;
     if (uri.scheme == 'package') {
       // Strip the package name.
-      // TODO(vsm): This is not unique if an escaped '/'appears in a filename.
-      // E.g., "foo/bar.dart" and "foo__bar.dart" would collide.
       segments = uri.pathSegments.skip(1);
     } else {
-      // TODO(jmesserly): this is not unique typically.
-      segments = [uri.pathSegments.last];
+      segments = uri.pathSegments;
     }
 
-    var qualifiedPath = segments.map((p) => p == '..' ? '' : p).join('__');
-    return pathToJSIdentifier(qualifiedPath);
+    var qualifiedPath = pathToJSIdentifier(p.withoutExtension(segments.join('/')));
+    return qualifiedPath == jsLibraryName(library) ? null : qualifiedPath;
   }
 
   @override
@@ -445,6 +475,11 @@
 
     moduleItems.add(_emitClassDeclaration(c));
 
+    // The const table depends on dart.defineLazy, so emit it after the SDK.
+    if (isSdkInternalRuntime(_currentLibrary)) {
+      _constTableInsertionIndex = moduleItems.length;
+    }
+
     _currentClass = savedClass;
     _types.thisType = savedClass?.thisType;
     _currentLibrary = savedLibrary;
@@ -462,7 +497,9 @@
   /// declarations are assumed to be available before we start execution.
   /// See [startTopLevel].
   void _declareBeforeUse(Class c) {
-    if (c != null && _emittingClassExtends) _emitClass(c);
+    if (c != null && _emittingClassExtends) {
+      _emitClass(c);
+    }
   }
 
   js_ast.Statement _emitClassDeclaration(Class c) {
@@ -2028,11 +2065,26 @@
       // TODO(jmesserly): it'd be nice to avoid this special case.
       var lazyFields = <Field>[];
       var savedUri = _currentUri;
+
+      // Helper functions to test if a constructor invocation is internal and
+      // should be eagerly evaluated.
+      var isInternalConstructor = (ConstructorInvocation node) {
+        var type = node.getStaticType(_types) as InterfaceType;
+        var library = type.classNode.enclosingLibrary;
+        return isSdkInternalRuntime(library);
+      };
       for (var field in fields) {
         var init = field.initializer;
         if (init == null ||
             init is BasicLiteral ||
+            init is ConstructorInvocation && isInternalConstructor(init) ||
             init is StaticInvocation && isInlineJS(init.target)) {
+          if (init is ConstructorInvocation) {
+            // This is an eagerly executed constructor invocation.  We need to
+            // ensure the class is emitted before this statement.
+            var type = init.getStaticType(_types) as InterfaceType;
+            _emitClass(type.classNode);
+          }
           _currentUri = field.fileUri;
           moduleItems.add(js.statement('# = #;', [
             _emitTopLevelName(field),
@@ -2083,12 +2135,11 @@
   }
 
   js_ast.Fun _emitStaticFieldInitializer(Field field) {
-    return js_ast.Fun(
-        [],
-        js_ast.Block(_withLetScope(() => [
-              js_ast.Return(
-                  _visitInitializer(field.initializer, field.annotations))
-            ])));
+    return js_ast.Fun([], js_ast.Block(_withLetScope(() {
+      return [
+        js_ast.Return(_visitInitializer(field.initializer, field.annotations))
+      ];
+    })));
   }
 
   List<js_ast.Statement> _withLetScope(List<js_ast.Statement> visitBody()) {
@@ -3101,6 +3152,9 @@
 
   js_ast.Expression _visitExpression(Expression e) {
     if (e == null) return null;
+    if (e is ConstantExpression) {
+      return visitConstant(e.constant);
+    }
     var result = e.accept(this) as js_ast.Expression;
     result.sourceInformation ??= _nodeStart(e);
     return result;
@@ -3780,7 +3834,15 @@
 
   @override
   js_ast.Expression visitConstantExpression(ConstantExpression node) =>
-      node.constant.accept(this) as js_ast.Expression;
+      visitConstant(node.constant);
+
+  @override
+  js_ast.Expression canonicalizeConstObject(js_ast.Expression expr) {
+    if (isSdkInternalRuntime(_currentLibrary)) {
+      return super.canonicalizeConstObject(expr);
+    }
+    return runtimeCall('const(#)', [expr]);
+  }
 
   @override
   js_ast.Expression visitVariableGet(VariableGet node) {
@@ -4725,7 +4787,7 @@
     if (isFromEnvironmentInvocation(_coreTypes, node)) {
       var value = _constants.evaluate(node);
       if (value is PrimitiveConstant) {
-        return value.accept(this) as js_ast.Expression;
+        return visitConstant(value);
       }
     }
 
@@ -4864,7 +4926,7 @@
         node.accept(this);
         if (node is ConstantExpression) {
           var list = node.constant as ListConstant;
-          entries.addAll(list.entries.map(_visitConstant));
+          entries.addAll(list.entries.map(visitConstant));
         } else if (node is ListLiteral) {
           entries.addAll(node.expressions.map(_visitExpression));
         }
@@ -4886,7 +4948,7 @@
         node.accept(this);
         if (node is ConstantExpression) {
           var set = node.constant as SetConstant;
-          entries.addAll(set.entries.map(_visitConstant));
+          entries.addAll(set.entries.map(visitConstant));
         } else if (node is SetLiteral) {
           entries.addAll(node.expressions.map(_visitExpression));
         }
@@ -4909,8 +4971,8 @@
         if (node is ConstantExpression) {
           var map = node.constant as MapConstant;
           for (var entry in map.entries) {
-            entries.add(_visitConstant(entry.key));
-            entries.add(_visitConstant(entry.value));
+            entries.add(visitConstant(entry.key));
+            entries.add(visitConstant(entry.value));
           }
         } else if (node is MapLiteral) {
           for (var entry in node.entries) {
@@ -5032,11 +5094,7 @@
   js_ast.Expression visitListLiteral(ListLiteral node) {
     var elementType = node.typeArgument;
     var elements = _visitExpressionList(node.expressions);
-    // TODO(markzipan): remove const check when we use front-end const eval
-    if (!node.isConst) {
-      return _emitList(elementType, elements);
-    }
-    return _emitConstList(elementType, elements);
+    return _emitList(elementType, elements);
   }
 
   js_ast.Expression _emitList(
@@ -5270,8 +5328,48 @@
         findAnnotation(node, test), 'name') as String;
   }
 
-  js_ast.Expression _visitConstant(Constant node) =>
-      node.accept(this) as js_ast.Expression;
+  @override
+  js_ast.Expression cacheConst(js_ast.Expression jsExpr) {
+    if (isSdkInternalRuntime(_currentLibrary)) {
+      return super.cacheConst(jsExpr);
+    }
+    return jsExpr;
+  }
+
+  @override
+  js_ast.Expression visitConstant(Constant node) {
+    if (node is TearOffConstant) {
+      // JS() or JS interop functions should not be lazily loaded.
+      if (node.procedure.isExternal || _isInForeignJS) {
+        return _emitStaticTarget(node.procedure);
+      }
+    }
+    if (isSdkInternalRuntime(_currentLibrary) || node is PrimitiveConstant) {
+      return super.visitConstant(node);
+    }
+    var constAlias = constAliasCache[node];
+    if (constAlias != null) {
+      return constAlias;
+    }
+    var constAliasString = "C${constAliasCache.length}";
+    var constAliasProperty = propertyName(constAliasString);
+    var constAliasId = js_ast.TemporaryId(constAliasString);
+    var constAccessor =
+        js.call("# || #.#", [constAliasId, _constTable, constAliasProperty]);
+    constAliasCache[node] = constAccessor;
+    var constJs = super.visitConstant(node);
+    moduleItems.add(js.statement('let #;', [constAliasId]));
+
+    var func = js_ast.Fun(
+        [],
+        js_ast.Block([
+          js.statement("return # = #;", [constAliasId, constJs])
+        ]));
+    var accessor = js_ast.Method(constAliasProperty, func, isGetter: true);
+    _constLazyAccessors.add(accessor);
+    return constAccessor;
+  }
+
   @override
   js_ast.Expression visitNullConstant(NullConstant node) =>
       js_ast.LiteralNull();
@@ -5295,6 +5393,15 @@
         return js.number(intValue);
       }
     }
+    if (value.isInfinite) {
+      if (value.isNegative) {
+        return js.call('-1 / 0');
+      }
+      return js.call('1 / 0');
+    }
+    if (value.isNaN) {
+      return js.call('0 / 0');
+    }
     return js.number(value);
   }
 
@@ -5315,8 +5422,8 @@
   js_ast.Expression visitMapConstant(MapConstant node) {
     var entries = [
       for (var e in node.entries) ...[
-        _visitConstant(e.key),
-        _visitConstant(e.value),
+        visitConstant(e.key),
+        visitConstant(e.value),
       ],
     ];
     return _emitConstMap(node.keyType, node.valueType, entries);
@@ -5324,16 +5431,17 @@
 
   @override
   js_ast.Expression visitListConstant(ListConstant node) => _emitConstList(
-      node.typeArgument, node.entries.map(_visitConstant).toList());
+      node.typeArgument, node.entries.map(visitConstant).toList());
 
   @override
   js_ast.Expression visitSetConstant(SetConstant node) => _emitConstSet(
-      node.typeArgument, node.entries.map(_visitConstant).toList());
+      node.typeArgument, node.entries.map(visitConstant).toList());
 
   @override
   js_ast.Expression visitInstanceConstant(InstanceConstant node) {
+    _declareBeforeUse(node.classNode);
     entryToProperty(MapEntry<Reference, Constant> entry) {
-      var constant = entry.value.accept(this) as js_ast.Expression;
+      var constant = visitConstant(entry.value);
       var member = entry.key.asField;
       return js_ast.Property(
           _emitMemberName(member.name.name, member: member), constant);
@@ -5350,8 +5458,10 @@
   }
 
   @override
-  js_ast.Expression visitTearOffConstant(TearOffConstant node) =>
-      _emitStaticGet(node.procedure);
+  js_ast.Expression visitTearOffConstant(TearOffConstant node) {
+    _declareBeforeUse(node.procedure.enclosingClass);
+    return _emitStaticGet(node.procedure);
+  }
 
   @override
   js_ast.Expression visitTypeLiteralConstant(TypeLiteralConstant node) =>
@@ -5361,13 +5471,13 @@
   js_ast.Expression visitPartialInstantiationConstant(
           PartialInstantiationConstant node) =>
       runtimeCall('gbind(#, #)', [
-        _visitConstant(node.tearOffConstant),
+        visitConstant(node.tearOffConstant),
         node.types.map(_emitType).toList()
       ]);
 
   @override
   js_ast.Expression visitUnevaluatedConstant(UnevaluatedConstant node) =>
-      _visitExpression(node.expression);
+      throw UnsupportedError('Encountered an unevaluated constant: $node');
 }
 
 bool _isInlineJSFunction(Statement body) {
diff --git a/pkg/dev_compiler/lib/src/kernel/constants.dart b/pkg/dev_compiler/lib/src/kernel/constants.dart
index 3066d8e..9044034 100644
--- a/pkg/dev_compiler/lib/src/kernel/constants.dart
+++ b/pkg/dev_compiler/lib/src/kernel/constants.dart
@@ -25,7 +25,7 @@
       TypeEnvironment types, Map<String, String> declaredVariables)
       : _visitor = _ConstantVisitor(types.coreTypes),
         _evaluator = ConstantEvaluator(const DevCompilerConstantsBackend(),
-            declaredVariables, types, false, const _ErrorReporter());
+            declaredVariables, types, const _ErrorReporter());
 
   /// Determines if an expression is constant.
   bool isConstant(Expression e) => _visitor.isConstant(e);
diff --git a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
index 481a4e8..33242c9 100644
--- a/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
+++ b/pkg/dev_compiler/lib/src/kernel/nullable_inference.dart
@@ -356,13 +356,17 @@
       }
     }
     var initializer = node.initializer;
-    if (initializer != null) {
-      var savedVariable = _variableAssignedTo;
-      _variableAssignedTo = node;
+    // A Variable declaration with a FunctionNode as a parent is a function
+    // parameter so we can't trust the initializer as a nullable check.
+    if (node.parent is! FunctionNode) {
+      if (initializer != null) {
+        var savedVariable = _variableAssignedTo;
+        _variableAssignedTo = node;
 
-      if (!_nullInference.isNullable(initializer)) _notNullLocals.add(node);
+        if (!_nullInference.isNullable(initializer)) _notNullLocals.add(node);
 
-      _variableAssignedTo = savedVariable;
+        _variableAssignedTo = savedVariable;
+      }
     }
     initializer?.accept(this);
   }
diff --git a/pkg/dev_compiler/lib/src/kernel/target.dart b/pkg/dev_compiler/lib/src/kernel/target.dart
index c1635a0..1eb6b62 100644
--- a/pkg/dev_compiler/lib/src/kernel/target.dart
+++ b/pkg/dev_compiler/lib/src/kernel/target.dart
@@ -18,8 +18,6 @@
 
   final TargetFlags flags;
 
-  ClassHierarchy hierarchy;
-
   WidgetCreatorTracker _widgetTracker;
 
   @override
@@ -92,9 +90,6 @@
   bool get errorOnUnexactWebIntLiterals => true;
 
   @override
-  bool get supportsSetLiterals => true;
-
-  @override
   bool get enableNoSuchMethodForwarders => true;
 
   @override
@@ -103,9 +98,9 @@
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<Library> libraries,
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)}) {
-    this.hierarchy = hierarchy;
     for (var library in libraries) {
       _CovarianceTransformer(library).transform();
     }
diff --git a/pkg/dev_compiler/test/nullable_inference_test.dart b/pkg/dev_compiler/test/nullable_inference_test.dart
index 7690119..fe8f787 100644
--- a/pkg/dev_compiler/test/nullable_inference_test.dart
+++ b/pkg/dev_compiler/test/nullable_inference_test.dart
@@ -39,11 +39,11 @@
     });
     test('List', () async {
       await expectNotNull(
-          'main() { print([42, null]); }', '<dart.core::int>[42, null], 42');
+          'main() { print([42, null]); }', '<dart.core::int*>[42, null], 42');
     });
     test('Map', () async {
       await expectNotNull('main() { print({"x": null}); }',
-          '<dart.core::String, dart.core::Null>{"x": null}, "x"');
+          '<dart.core::String*, dart.core::Null*>{"x": null}, "x"');
     });
 
     test('Symbol', () async {
@@ -51,7 +51,7 @@
     });
 
     test('Type', () async {
-      await expectNotNull('main() { print(Object); }', 'dart.core::Object');
+      await expectNotNull('main() { print(Object); }', 'dart.core::Object*');
     });
   });
 
@@ -61,12 +61,12 @@
 
   test('is', () async {
     await expectNotNull('main() { 42 is int; null is int; }',
-        '42 is dart.core::int, 42, null is dart.core::int');
+        '42 is dart.core::int*, 42, null is dart.core::int*');
   });
 
   test('as', () async {
     await expectNotNull(
-        'main() { 42 as int; null as int; }', '42 as dart.core::int, 42');
+        'main() { 42 as int; null as int; }', '42 as dart.core::int*, 42');
   });
 
   test('constructor', () async {
@@ -248,8 +248,8 @@
   });
 
   test('function expression', () async {
-    await expectNotNull(
-        'main() { () => null; f() {}; f; }', '() → dart.core::Null => null, f');
+    await expectNotNull('main() { () => null; f() {}; f; }',
+        '() → dart.core::Null* => null, f');
   });
 
   test('cascades (kernel let)', () async {
@@ -390,7 +390,8 @@
       await expectNotNull('''main() {
         var x = () => 42;
         var y = (() => x = null);
-      }''', '() → dart.core::int => 42, 42, () → dart.core::Null => x = null');
+      }''',
+          '() → dart.core::int* => 42, 42, () → dart.core::Null* => x = null');
     });
     test('do not depend on unrelated variables', () async {
       await expectNotNull('''main() {
@@ -408,6 +409,27 @@
       }''', '1, dart.core::identical(x, 1), 1, y');
     });
   });
+  group('functions parameters in SDK', () {
+    setUp(() {
+      // Using annotations here to test how the parameter is detected when
+      // compiling functions from the SDK.
+      // A regression test for: https://github.com/dart-lang/sdk/issues/37700
+      useAnnotations = true;
+    });
+    tearDown(() {
+      useAnnotations = false;
+    });
+    test('optional with default value', () async {
+      await expectNotNull('''
+        f(x, [y = 1]) { x; y; }
+      ''', '1');
+    });
+    test('named with default value', () async {
+      await expectNotNull('''
+        f(x, {y = 1}) { x; y; }
+      ''', '1');
+    });
+  });
 
   group('notNull', () {
     setUp(() {
@@ -470,8 +492,14 @@
   var component = await kernelCompile(code);
   var collector = NotNullCollector();
   component.accept(collector);
-  var actualNotNull =
-      collector.notNullExpressions.map((e) => e.toString()).join(', ');
+  var actualNotNull = collector.notNullExpressions
+      // ConstantExpressions print the table offset - we want to compare
+      // against the underlying constant value instead.
+      .map((e) => (e is ConstantExpression ? e.constant : e).toString())
+      // Filter out our own NotNull annotations.  The library prefix changes
+      // per test, so just filter on the suffix.
+      .where((s) => !s.endsWith('::_NotNull {}'))
+      .join(', ');
   expect(actualNotNull, equals(expectedNotNull));
 }
 
@@ -578,7 +606,9 @@
   var oldCompilerState = _compilerState;
   _compilerState = await fe.initializeCompiler(oldCompilerState, false, null,
       sdkUri, packagesUri, null, [], DevCompilerTarget(TargetFlags()),
-      fileSystem: _fileSystem, experiments: const {});
+      fileSystem: _fileSystem,
+      experiments: const {},
+      environmentDefines: const {});
   if (!identical(oldCompilerState, _compilerState)) inference = null;
   fe.DdcResult result =
       await fe.compile(_compilerState, [mainUri], diagnosticMessageHandler);
diff --git a/pkg/dev_compiler/test/options/options_test.dart b/pkg/dev_compiler/test/options/options_test.dart
index 454daab..9d5fe8f 100644
--- a/pkg/dev_compiler/test/options/options_test.dart
+++ b/pkg/dev_compiler/test/options/options_test.dart
@@ -11,16 +11,16 @@
 import 'package:dev_compiler/src/analyzer/command.dart';
 import 'package:dev_compiler/src/analyzer/driver.dart';
 import 'package:dev_compiler/src/analyzer/module_compiler.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:test/test.dart';
 
 import '../testing.dart' show repoDirectory, testDirectory;
 
 /// The `test/options` directory.
-final optionsDir = path.join(testDirectory, 'options');
+final optionsDir = p.join(testDirectory, 'options');
 
 /// Summary file for testing.
-final sdkSummaryFile = path.join(repoDirectory, 'gen', 'sdk', 'ddc_sdk.sum');
+final sdkSummaryFile = p.join(repoDirectory, 'gen', 'sdk', 'ddc_sdk.sum');
 
 final sdkSummaryArgs = ['--$sdkSummaryPathOption', sdkSummaryFile];
 
@@ -59,7 +59,7 @@
   });
 
   test('fromArgs options file 2', () {
-    var optionsFile2 = path.join(optionsDir, 'analysis_options_2.yaml');
+    var optionsFile2 = p.join(optionsDir, 'analysis_options_2.yaml');
     expect(File(optionsFile2).existsSync(), isTrue);
     var args = <String>['--$analysisOptionsFileOption', optionsFile2];
     //TODO(danrubel) remove sdkSummaryArgs once all SDKs have summary file
diff --git a/pkg/dev_compiler/test/sdk_source_map_test.dart b/pkg/dev_compiler/test/sdk_source_map_test.dart
new file mode 100644
index 0000000..f4028f5
--- /dev/null
+++ b/pkg/dev_compiler/test/sdk_source_map_test.dart
@@ -0,0 +1,32 @@
+// 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';
+
+import 'package:expect/expect.dart';
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart' as sm;
+
+void main() async {
+  final binDir = p.dirname(Platform.resolvedExecutable);
+  final sdkDir = p.dirname(binDir);
+  // This test expects to run in a build SDK.
+  Expect.isTrue(binDir.endsWith('bin'));
+
+  final sdkJsMapDir =
+      p.joinAll([sdkDir, 'lib', 'dev_compiler', 'kernel', 'amd']);
+  final sdkJsMapFile = p.join(sdkJsMapDir, 'dart_sdk.js.map');
+
+  final sdkJsMapText = await File(sdkJsMapFile).readAsString();
+  var mapping = sm.parse(sdkJsMapText) as sm.SingleMapping;
+
+  var urls = mapping.urls;
+  Expect.isTrue(urls.isNotEmpty);
+  for (var url in urls) {
+    Expect.equals(p.extension(url), '.dart');
+    Expect.isFalse(p.isAbsolute(url));
+    var fullPath = p.canonicalize(p.join(sdkJsMapDir, url));
+    Expect.isTrue(await File(fullPath).exists());
+  }
+}
diff --git a/pkg/dev_compiler/test/sourcemap/common.dart b/pkg/dev_compiler/test/sourcemap/common.dart
index f3e041e..b8890ba 100644
--- a/pkg/dev_compiler/test/sourcemap/common.dart
+++ b/pkg/dev_compiler/test/sourcemap/common.dart
@@ -6,7 +6,7 @@
 
 import 'dart:io';
 
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:front_end/src/testing/annotated_code_helper.dart';
 import 'package:sourcemap_testing/src/stepping_helper.dart';
 import 'package:testing/testing.dart';
@@ -74,7 +74,7 @@
 
   @override
   Future<Result<Data>> run(Data data, ChainContext context) async {
-    var outWrapperPath = path.join(data.outDir.path, "wrapper.js");
+    var outWrapperPath = p.join(data.outDir.path, "wrapper.js");
     ProcessResult runResult =
         runD8AndStep(data.outDir.path, data.code, ['--module', outWrapperPath]);
     data.d8Output = (runResult.stdout as String).split("\n");
@@ -100,7 +100,7 @@
 File findInOutDir(String relative) {
   var outerDir = sdkRoot.path;
   for (var outDir in const ["out/ReleaseX64", "xcodebuild/ReleaseX64"]) {
-    var tryPath = path.join(outerDir, outDir, relative);
+    var tryPath = p.join(outerDir, outDir, relative);
     File file = File(tryPath);
     if (file.existsSync()) return file;
   }
diff --git a/pkg/dev_compiler/test/sourcemap/ddc_common.dart b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
index 653b25e..c96ca2d 100644
--- a/pkg/dev_compiler/test/sourcemap/ddc_common.dart
+++ b/pkg/dev_compiler/test/sourcemap/ddc_common.dart
@@ -9,7 +9,7 @@
 
 import 'package:front_end/src/api_unstable/ddc.dart' as fe;
 import 'package:front_end/src/testing/annotated_code_helper.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'package:sourcemap_testing/src/stacktrace_helper.dart';
 import 'package:sourcemap_testing/src/stepping_helper.dart';
 import 'package:testing/testing.dart';
@@ -163,7 +163,7 @@
 void createHtmlWrapper(File sdkJsFile, Uri outputFile, String jsContent,
     String outputFilename, Uri outDir) {
   // For debugging via HTML, Chrome and ./pkg/test_runner/bin/http_server.dart.
-  var sdkFile = File(path.relative(sdkJsFile.path, from: sdkRoot.path));
+  var sdkFile = File(p.relative(sdkJsFile.path, from: sdkRoot.path));
   String jsRootDart = "/root_dart/${sdkFile.uri}";
   File.fromUri(outputFile.resolve("$outputFilename.html.js")).writeAsStringSync(
       jsContent.replaceFirst("from 'dart_sdk.js'", "from '$jsRootDart'"));
@@ -206,3 +206,103 @@
 String d8Preambles = File.fromUri(selfUri.resolve(
         '../../../../sdk/lib/_internal/js_dev_runtime/private/preambles/d8.js'))
     .readAsStringSync();
+
+/// Transforms a path to a valid JS identifier.
+///
+/// This logic must be synchronized with [pathToJSIdentifier] in DDC at:
+/// pkg/dev_compiler/lib/src/compiler/module_builder.dart
+String pathToJSIdentifier(String path) {
+  path = p.normalize(path);
+  if (path.startsWith('/') || path.startsWith('\\')) {
+    path = path.substring(1, path.length);
+  }
+  return _toJSIdentifier(path
+      .replaceAll('\\', '__')
+      .replaceAll('/', '__')
+      .replaceAll('..', '__')
+      .replaceAll('-', '_'));
+}
+
+/// Escape [name] to make it into a valid identifier.
+String _toJSIdentifier(String name) {
+  if (name.isEmpty) return r'$';
+
+  // Escape any invalid characters
+  StringBuffer buffer;
+  for (var i = 0; i < name.length; i++) {
+    var ch = name[i];
+    var needsEscape = ch == r'$' || _invalidCharInIdentifier.hasMatch(ch);
+    if (needsEscape && buffer == null) {
+      buffer = StringBuffer(name.substring(0, i));
+    }
+    if (buffer != null) {
+      buffer.write(needsEscape ? '\$${ch.codeUnits.join("")}' : ch);
+    }
+  }
+
+  var result = buffer != null ? '$buffer' : name;
+  // Ensure the identifier first character is not numeric and that the whole
+  // identifier is not a keyword.
+  if (result.startsWith(RegExp('[0-9]')) || _invalidVariableName(result)) {
+    return '\$$result';
+  }
+  return result;
+}
+
+// Invalid characters for identifiers, which would need to be escaped.
+final _invalidCharInIdentifier = RegExp(r'[^A-Za-z_$0-9]');
+
+bool _invalidVariableName(String keyword) {
+  switch (keyword) {
+    // http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words
+    case "await":
+    case "break":
+    case "case":
+    case "catch":
+    case "class":
+    case "const":
+    case "continue":
+    case "debugger":
+    case "default":
+    case "delete":
+    case "do":
+    case "else":
+    case "enum":
+    case "export":
+    case "extends":
+    case "finally":
+    case "for":
+    case "function":
+    case "if":
+    case "import":
+    case "in":
+    case "instanceof":
+    case "let":
+    case "new":
+    case "return":
+    case "super":
+    case "switch":
+    case "this":
+    case "throw":
+    case "try":
+    case "typeof":
+    case "var":
+    case "void":
+    case "while":
+    case "with":
+    case "arguments":
+    case "eval":
+    // http://www.ecma-international.org/ecma-262/6.0/#sec-future-reserved-words
+    // http://www.ecma-international.org/ecma-262/6.0/#sec-identifiers-static-semantics-early-errors
+    case "implements":
+    case "interface":
+    case "package":
+    case "private":
+    case "protected":
+    case "public":
+    case "static":
+    case "yield":
+      return true;
+  }
+  return false;
+}
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
index 275870c..d8b4fa6 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddc_suite.dart
@@ -24,7 +24,7 @@
   @override
   List<Step> get steps => _steps ??= <Step>[
         const Setup(),
-        Compile(DevCompilerRunner(environment.containsKey("debug"))),
+        Compile(DevCompilerRunner(debugging: environment.containsKey("debug"))),
         const StepWithD8(),
         CheckSteps(environment.containsKey("debug")),
       ];
@@ -35,8 +35,9 @@
 
 class DevCompilerRunner implements CompilerRunner {
   final bool debugging;
+  final bool absoluteRoot;
 
-  const DevCompilerRunner([this.debugging = false]);
+  const DevCompilerRunner({this.debugging = false, this.absoluteRoot = true});
 
   @override
   Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
@@ -54,7 +55,7 @@
       "--modules=es6",
       "--dart-sdk-summary=${ddcSdkSummary.path}",
       "--library-root",
-      outDir.toFilePath(),
+      absoluteRoot ? "/" : outDir.toFilePath(),
       "-o",
       outputFile.toFilePath(),
       inputFile.toFilePath()
@@ -77,9 +78,11 @@
           sdkJsFile, outputFile, jsContent, outputFilename, outDir);
     }
 
-    var inputFileName = inputFile.pathSegments.last;
-    var inputFileNameNoExt =
-        inputFileName.substring(0, inputFileName.lastIndexOf("."));
+    var inputFileName =
+        absoluteRoot ? inputFile.path : inputFile.pathSegments.last;
+    inputFileName = inputFileName.split(":").last;
+    var inputFileNameNoExt = pathToJSIdentifier(
+        inputFileName.substring(0, inputFileName.lastIndexOf(".")));
     File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
   }
diff --git a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
index 1d1fb94..2aced38 100644
--- a/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/sourcemaps_ddk_suite.dart
@@ -32,7 +32,7 @@
   List<Step> get steps {
     return _steps ??= <Step>[
       const Setup(),
-      Compile(DevCompilerRunner(this, debugging())),
+      Compile(DevCompilerRunner(this, debugging: debugging())),
       const StepWithD8(),
       CheckSteps(debugging()),
     ];
@@ -46,7 +46,7 @@
   final WithCompilerState context;
   final bool debugging;
 
-  const DevCompilerRunner(this.context, [this.debugging = false]);
+  const DevCompilerRunner(this.context, {this.debugging = false});
 
   @override
   Future<Null> run(Uri inputFile, Uri outputFile, Uri outWrapperFile) async {
@@ -96,9 +96,9 @@
           sdkJsFile, outputFile, jsContent, outputFilename, outDir);
     }
 
-    var inputFileName = inputFile.pathSegments.last;
-    var inputFileNameNoExt =
-        inputFileName.substring(0, inputFileName.lastIndexOf("."));
+    var inputPath = inputFile.path;
+    inputPath = inputPath.substring(0, inputPath.lastIndexOf("."));
+    var inputFileNameNoExt = pathToJSIdentifier(inputPath);
     File.fromUri(outWrapperFile).writeAsStringSync(
         getWrapperContent(jsSdkPath, inputFileNameNoExt, outputFilename));
   }
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
index d137aa1..0ed9dfb 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddc_suite.dart
@@ -15,7 +15,9 @@
     const Setup(),
     const SetCwdToSdkRoot(),
     const TestStackTrace(
-        ddc.DevCompilerRunner(false), "ddc.", ["ddc.", "ddk."]),
+        ddc.DevCompilerRunner(debugging: false, absoluteRoot: false),
+        "ddc",
+        ["ddc", "ddk"]),
   ];
 }
 
diff --git a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
index 94d26c6..515007e 100644
--- a/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
+++ b/pkg/dev_compiler/test/sourcemap/stacktrace_ddk_suite.dart
@@ -22,8 +22,8 @@
     return _steps ??= <Step>[
       const Setup(),
       const SetCwdToSdkRoot(),
-      TestStackTrace(
-          ddk.DevCompilerRunner(this, false), "ddk.", const ["ddk.", "ddc."]),
+      TestStackTrace(ddk.DevCompilerRunner(this, debugging: false), "ddk",
+          const ["ddk", "ddc"]),
     ];
   }
 }
diff --git a/pkg/dev_compiler/test/testing.dart b/pkg/dev_compiler/test/testing.dart
index 449f460..2f178d1 100644
--- a/pkg/dev_compiler/test/testing.dart
+++ b/pkg/dev_compiler/test/testing.dart
@@ -8,14 +8,14 @@
 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:path/path.dart' as p;
 
 final String testingPath =
-    path.fromUri((reflectClass(_TestUtils).owner as LibraryMirror).uri);
-final String testDirectory = path.dirname(testingPath);
+    p.fromUri((reflectClass(_TestUtils).owner as LibraryMirror).uri);
+final String testDirectory = p.dirname(testingPath);
 
 /// The local path to the root directory of the dev_compiler repo.
-final String repoDirectory = path.dirname(testDirectory);
+final String repoDirectory = p.dirname(testDirectory);
 
 class _TestUtils {}
 
diff --git a/pkg/dev_compiler/tool/ddb b/pkg/dev_compiler/tool/ddb
index 67be845..7ce2e26 100755
--- a/pkg/dev_compiler/tool/ddb
+++ b/pkg/dev_compiler/tool/ddb
@@ -15,7 +15,7 @@
 import 'dart:io';
 
 import 'package:args/args.dart' show ArgParser;
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 void main(List<String> args) async {
   void printUsage() {
@@ -37,6 +37,10 @@
         abbr: 'd',
         help: 'Use current source instead of built SDK.',
         defaultsTo: false)
+    ..addFlag('summarize-text',
+        help: 'Emit API summary in a .js.txt file.\n'
+            'Ignored when not passed with --kernel.',
+        defaultsTo: false)
     ..addOption('runtime',
         abbr: 'r',
         help: 'Platform to run on (node|d8|chrome).  Default is node.',
@@ -62,17 +66,22 @@
     printUsage();
     exit(1);
   }
-  var entry = options.rest.first;
-  var libRoot = path.dirname(entry);
-  var basename = path.basenameWithoutExtension(entry);
-
   var debug = options['debug'] as bool;
   var kernel = options['kernel'] as bool;
+  var summarizeText = options['summarize-text'] as bool;
   var binary = options['binary'] as String;
   var experiments = options['enable-experiment'] as List;
   var summaries = options['summary'] as List;
   var port = int.parse(options['port'] as String);
 
+  var entry = p.canonicalize(options.rest.first);
+  var libRoot = p.dirname(entry);
+  var basename = p.basenameWithoutExtension(entry);
+  var libname = kernel
+      ? p.relative(p.withoutExtension(entry)).replaceAll('/', '__')
+      : basename;
+  libname = libname.replaceAll('-', '_');
+
   // By default (no `-d`), we use the `dartdevc` binary on the user's path to
   // compute the SDK we use for execution.  I.e., we assume that `dart` is
   // under `$DART_SDK/bin/dart` and use that to find `dartdevc` and related
@@ -80,24 +89,25 @@
   // If you want to run against a freshly built SDK, that must be first on
   // your path.
   var dartBinary = Platform.resolvedExecutable;
-  var dartSdk = path.dirname(path.dirname(dartBinary));
+  var dartSdk = p.dirname(p.dirname(dartBinary));
 
   // In debug mode (`-d`), we run from the `pkg/dev_compiler` sources.  We
   // determine the location via this actual script (i.e., `-d` assumes
   // this script remains under to `tool` sub-directory).
-  var toolPath = Platform.script.normalizePath().toFilePath();
-  var ddcPath = path.dirname(path.dirname(toolPath));
-  var dartCheckoutPath = path.dirname(path.dirname(ddcPath));
+  var toolPath =
+      Platform.script.normalizePath().toFilePath(windows: Platform.isWindows);
+  var ddcPath = p.dirname(p.dirname(toolPath));
+  var dartCheckoutPath = p.dirname(p.dirname(ddcPath));
 
   ProcessResult runDdc(String command, List<String> args) {
     if (debug) {
       // Use unbuilt script.  This only works from a source checkout.
-      args.insertAll(0,
-          ['--enable-asserts', path.join(ddcPath, 'bin', '${command}.dart')]);
+      args.insertAll(
+          0, ['--enable-asserts', p.join(ddcPath, 'bin', '$command.dart')]);
       command = dartBinary;
     } else {
       // Use built snapshot.
-      command = path.join(dartSdk, 'bin', command);
+      command = p.join(dartSdk, 'bin', command);
     }
     return Process.runSync(command, args);
   }
@@ -136,23 +146,21 @@
   String requirePath;
   String ddcSdk;
   if (debug) {
-    var sdkRoot = path.dirname(path.dirname(ddcPath));
-    var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
-    sdkJsPath = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
-        kernel ? 'kernel' : 'js', mod);
-    requirePath = path.join(sdkRoot, 'third_party', 'requirejs');
-    ddcSdk = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc',
-        kernel ? path.join('kernel', 'ddc_sdk.dill') : 'ddc_sdk.sum');
-  } else {
-    var suffix = kernel ? path.join('kernel', mod) : mod;
-    sdkJsPath = path.join(dartSdk, 'lib', 'dev_compiler', suffix);
-    requirePath = sdkJsPath;
-    ddcSdk = path.join(
-        dartSdk, 'lib', '_internal', kernel ? 'ddc_sdk.dill' : 'ddc_sdk.sum');
+    var sdkRoot = p.dirname(p.dirname(ddcPath));
+    var buildDir = p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
+    dartSdk = p.join(buildDir, 'ReleaseX64', 'dart-sdk');
   }
+  var suffix = kernel ? p.join('kernel', mod) : mod;
+  sdkJsPath = p.join(dartSdk, 'lib', 'dev_compiler', suffix);
+  requirePath = sdkJsPath;
+  ddcSdk = p.join(
+      dartSdk, 'lib', '_internal', kernel ? 'ddc_sdk.dill' : 'ddc_sdk.sum');
+
   ProcessResult result;
   var ddcArgs = [
     if (kernel) '--kernel',
+    if (kernel && summarizeText)
+      '--summarize-text',
     '--modules=$mod',
     '--dart-sdk-summary=$ddcSdk',
     // TODO(nshahan) Cleanup when we settle on using or removing library-root.
@@ -161,7 +169,7 @@
     for (var summary in summaries) '--summary=$summary',
     for (var experiment in experiments) '--enable-experiment=$experiment',
     '-o',
-    '$libRoot/$basename.js',
+    p.setExtension(entry, '.js'),
     entry
   ];
 
@@ -187,7 +195,6 @@
 <script src='$requirePath/require.js'></script>
 <script>
   require.config({
-    baseUrl: '$libRoot',
     paths: {
         'dart_sdk': '$sdkJsPath/dart_sdk'
     },
@@ -197,13 +204,13 @@
         function(sdk, app) {
     'use strict';
     sdk._debugger.registerDevtoolsFormatter();
-    app.$basename.main();
+    app.$libname.main();
   });
 </script>
 """;
-    var htmlFile = '$libRoot/$basename.html';
+    var htmlFile = p.setExtension(entry, '.html');
     new File(htmlFile).writeAsStringSync(html);
-    var tmp = path.join(Directory.systemTemp.path, 'ddc');
+    var tmp = p.join(Directory.systemTemp.path, 'ddc');
 
     result = Process.runSync(chromeBinary, [
       '--auto-open-devtools-for-tabs',
@@ -222,7 +229,7 @@
     } catch(e) {
     }
     let sdk = require(\"dart_sdk\");
-    let main = require(\"./$basename\").$basename.main;
+    let main = require(\"./$basename\").$libname.main;
     try {
       sdk._isolate_helper.startRootIsolate(main, []);
     } catch(e) {
@@ -233,7 +240,7 @@
       process.exit(1);
     }
     ''';
-    var nodeFile = '$libRoot/$basename.run.js';
+    var nodeFile = p.setExtension(entry, '.run.js');
     new File(nodeFile).writeAsStringSync(runjs);
     var nodeBinary = binary ?? 'node';
     result = Process.runSync(
@@ -243,7 +250,7 @@
     // Fix SDK import.  `d8` doesn't let us set paths, so we need a full path
     // to the SDK.
 
-    var jsFile = File('$libRoot/$basename.js');
+    var jsFile = File(p.setExtension(entry, '.js'));
     var jsContents = jsFile.readAsStringSync();
     jsContents = jsContents.replaceFirst(
         "from 'dart_sdk.js'", "from '$sdkJsPath/dart_sdk.js'");
@@ -252,7 +259,7 @@
     var runjs = '''
     import { dart, _isolate_helper } from '$sdkJsPath/dart_sdk.js';
     import { $basename } from '$basename.js';
-    let main = $basename.main;
+    let main = $libname.main;
     try {
       _isolate_helper.startRootIsolate(() => {}, []);
       main();
@@ -260,9 +267,9 @@
       console.error(e);
     }
     ''';
-    var d8File = path.join(libRoot, '$basename.d8.js');
+    var d8File = p.setExtension(entry, '.d8.js');
     new File(d8File).writeAsStringSync(runjs);
-    var d8Binary = binary ?? path.join(dartCheckoutPath, _d8executable);
+    var d8Binary = binary ?? p.join(dartCheckoutPath, _d8executable);
     result = Process.runSync(d8Binary, ['--module', d8File]);
   }
   await echoResult(result);
@@ -270,11 +277,11 @@
 
 String get _d8executable {
   if (Platform.isWindows) {
-    return path.join('third_party', 'd8', 'windows', 'd8.exe');
+    return p.join('third_party', 'd8', 'windows', 'd8.exe');
   } else if (Platform.isLinux) {
-    return path.join('third_party', 'd8', 'linux', 'd8');
+    return p.join('third_party', 'd8', 'linux', 'd8');
   } else if (Platform.isMacOS) {
-    return path.join('third_party', 'd8', 'macos', 'd8');
+    return p.join('third_party', 'd8', 'macos', 'd8');
   }
   throw new UnsupportedError('Unsupported platform.');
 }
diff --git a/pkg/dev_compiler/tool/kernel_sdk.dart b/pkg/dev_compiler/tool/kernel_sdk.dart
index b8d2311..11e2a33 100755
--- a/pkg/dev_compiler/tool/kernel_sdk.dart
+++ b/pkg/dev_compiler/tool/kernel_sdk.dart
@@ -16,31 +16,31 @@
 import 'package:front_end/src/api_unstable/ddc.dart'
     show
         CompilerOptions,
-        kernelForComponent,
+        kernelForModule,
         DiagnosticMessage,
         printDiagnosticMessage,
         Severity;
 import 'package:kernel/kernel.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 Future main(List<String> args) async {
-  var ddcPath = path.dirname(path.dirname(path.fromUri(Platform.script)));
+  var ddcPath = p.dirname(p.dirname(p.fromUri(Platform.script)));
 
   // Parse flags.
   var parser = ArgParser()
     ..addOption('output')
     ..addOption('libraries',
-        defaultsTo: path.join(ddcPath, '../../sdk/lib/libraries.json'))
-    ..addOption('packages', defaultsTo: path.join(ddcPath, '../../.packages'));
+        defaultsTo: p.join(ddcPath, '../../sdk/lib/libraries.json'))
+    ..addOption('packages', defaultsTo: p.join(ddcPath, '../../.packages'));
   var parserOptions = parser.parse(args);
 
   var outputPath = parserOptions['output'] as String;
   if (outputPath == null) {
-    var sdkRoot = path.absolute(path.dirname(path.dirname(ddcPath)));
-    var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
-    var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
-    outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill');
+    var sdkRoot = p.absolute(p.dirname(p.dirname(ddcPath)));
+    var buildDir = p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out');
+    var genDir = p.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc');
+    outputPath = p.join(genDir, 'kernel', 'ddc_sdk.dill');
   }
 
   var librarySpecPath = parserOptions['libraries'] as String;
@@ -62,20 +62,22 @@
     ..packagesFileUri = Uri.base.resolveUri(Uri.file(packagesPath))
     ..librariesSpecificationUri = Uri.base.resolveUri(Uri.file(librarySpecPath))
     ..target = target
-    ..onDiagnostic = onDiagnostic;
+    ..onDiagnostic = onDiagnostic
+    ..environmentDefines = {};
 
   var inputs = target.extraRequiredLibraries.map(Uri.parse).toList();
-  var component = await kernelForComponent(inputs, options);
+  var compilerResult = await kernelForModule(inputs, options);
+  var component = compilerResult.component;
 
-  var outputDir = path.dirname(outputPath);
+  var outputDir = p.dirname(outputPath);
   await Directory(outputDir).create(recursive: true);
   await writeComponentToBinary(component, outputPath);
-  File(librarySpecPath).copySync(
-      path.join(path.dirname(outputDir), path.basename(librarySpecPath)));
+  File(librarySpecPath)
+      .copySync(p.join(p.dirname(outputDir), p.basename(librarySpecPath)));
 
   var jsModule = ProgramCompiler(
       component,
-      target.hierarchy,
+      compilerResult.classHierarchy,
       SharedCompilerOptions(moduleName: 'dart_sdk'),
       {}).emitModule(component, [], [], {});
   var moduleFormats = {
@@ -87,11 +89,13 @@
 
   for (var name in moduleFormats.keys) {
     var format = moduleFormats[name];
-    var jsDir = path.join(outputDir, name);
-    var jsPath = path.join(jsDir, 'dart_sdk.js');
+    var jsDir = p.join(outputDir, name);
+    var jsPath = p.join(jsDir, 'dart_sdk.js');
+    var mapPath = '$jsPath.map';
     await Directory(jsDir).create();
-    var jsCode = jsProgramToCode(jsModule, format);
+    var jsCode = jsProgramToCode(jsModule, format,
+        jsUrl: jsPath, mapUrl: mapPath, buildSourceMap: true);
     await File(jsPath).writeAsString(jsCode.code);
-    await File('$jsPath.map').writeAsString(json.encode(jsCode.sourceMap));
+    await File(mapPath).writeAsString(json.encode(jsCode.sourceMap));
   }
 }
diff --git a/pkg/dev_compiler/tool/patch_sdk.dart b/pkg/dev_compiler/tool/patch_sdk.dart
index f6b6a8c..5b268a8 100755
--- a/pkg/dev_compiler/tool/patch_sdk.dart
+++ b/pkg/dev_compiler/tool/patch_sdk.dart
@@ -14,20 +14,19 @@
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
 import 'package:analyzer/src/generated/sdk.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 void main(List<String> argv) {
-  var self = path.relative(path.fromUri(Platform.script));
+  var self = p.relative(p.fromUri(Platform.script));
   if (argv.length < 3) {
-    var toolDir = path.relative(path.dirname(path.fromUri(Platform.script)));
-    var dartDir = path.dirname(path
-        .dirname(path.dirname(path.dirname(path.fromUri(Platform.script)))));
+    var toolDir = p.relative(p.dirname(p.fromUri(Platform.script)));
+    var dartDir =
+        p.dirname(p.dirname(p.dirname(p.dirname(p.fromUri(Platform.script)))));
 
-    var repoExample = path.join(toolDir, '..', '..', '..');
+    var repoExample = p.join(toolDir, '..', '..', '..');
     var patchExample =
-        path.join(dartDir, 'sdk', 'lib', '_internal', 'js_dev_runtime');
-    var outExample =
-        path.relative(path.normalize(path.join('gen', 'patched_sdk')));
+        p.join(dartDir, 'sdk', 'lib', '_internal', 'js_dev_runtime');
+    var outExample = p.relative(p.normalize(p.join('gen', 'patched_sdk')));
 
     print('Usage: $self DART_REPO_DIR PATCH_DIR OUTPUT_DIR');
     print('For example:');
@@ -39,24 +38,24 @@
 
   var repoDir = argv[0];
   var patchDir = argv[1];
-  var sdkLibIn = path.join(repoDir, 'sdk', 'lib');
-  var patchIn = path.join(patchDir, 'patch');
-  var privateIn = path.join(patchDir, 'private');
-  var sdkOut = path.join(argv[2], 'lib');
+  var sdkLibIn = p.join(repoDir, 'sdk', 'lib');
+  var patchIn = p.join(patchDir, 'patch');
+  var privateIn = p.join(patchDir, 'private');
+  var sdkOut = p.join(argv[2], 'lib');
 
   var INTERNAL_PATH = '_internal/js_runtime/lib/';
 
   // Copy libraries.dart and version
-  var librariesDart = path.join(patchDir, 'libraries.dart');
+  var librariesDart = p.join(patchDir, 'libraries.dart');
   var libContents = File(librariesDart).readAsStringSync();
   // TODO(jmesserly): can we remove this?
-  _writeSync(path.join(sdkOut, '_internal', 'libraries.dart'), libContents);
+  _writeSync(p.join(sdkOut, '_internal', 'libraries.dart'), libContents);
   _writeSync(
-      path.join(
+      p.join(
           sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
       libContents);
-  _writeSync(path.join(sdkOut, '..', 'version'),
-      File(path.join(repoDir, 'tools', 'VERSION')).readAsStringSync());
+  _writeSync(p.join(sdkOut, '..', 'version'),
+      File(p.join(repoDir, 'tools', 'VERSION')).readAsStringSync());
 
   // Parse libraries.dart
   var sdkLibraries = _getSdkLibraries(libContents);
@@ -68,12 +67,11 @@
     // So instead we skip explicitly marked as VM libs.
     if (library.isVmLibrary) continue;
 
-    var libraryOut = path.join(sdkLibIn, library.path);
-    var libraryOverride = path.join(patchDir, 'lib', library.path);
+    var libraryOut = p.join(sdkLibIn, library.path);
+    var libraryOverride = p.join(patchDir, 'lib', library.path);
     String libraryIn;
     if (library.path.contains(INTERNAL_PATH)) {
-      libraryIn =
-          path.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
+      libraryIn = p.join(privateIn, library.path.replaceAll(INTERNAL_PATH, ''));
     } else if (File(libraryOverride).existsSync()) {
       libraryIn = libraryOverride;
     } else {
@@ -91,9 +89,9 @@
       for (var part in parseString(content: libraryContents).unit.directives) {
         if (part is PartDirective) {
           var partPath = part.uri.stringValue;
-          outPaths.add(path.join(path.dirname(libraryOut), partPath));
+          outPaths.add(p.join(p.dirname(libraryOut), partPath));
 
-          var partFile = File(path.join(path.dirname(libraryIn), partPath));
+          var partFile = File(p.join(p.dirname(libraryIn), partPath));
           partFiles.add(partFile);
           inputModifyTime = math.max(inputModifyTime,
               partFile.lastModifiedSync().millisecondsSinceEpoch);
@@ -101,8 +99,8 @@
       }
 
       // See if we can find a patch file.
-      var patchPath = path.join(
-          patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
+      var patchPath = p.join(
+          patchIn, p.basenameWithoutExtension(libraryIn) + '_patch.dart');
 
       var patchFile = File(patchPath);
       bool patchExists = patchFile.existsSync();
@@ -113,7 +111,7 @@
 
       // Compute output paths
       outPaths = outPaths
-          .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn)))
+          .map((path) => p.join(sdkOut, p.relative(path, from: sdkLibIn)))
           .toList();
 
       // Compare output modify time with input modify time.
@@ -150,7 +148,7 @@
 
 /// Writes a file, creating the directory if needed.
 void _writeSync(String filePath, String contents) {
-  var outDir = Directory(path.dirname(filePath));
+  var outDir = Directory(p.dirname(filePath));
   if (!outDir.existsSync()) outDir.createSync(recursive: true);
 
   File(filePath).writeAsStringSync(contents);
diff --git a/pkg/dev_compiler/web/main.dart b/pkg/dev_compiler/web/main.dart
index df7682f..b1267cb 100755
--- a/pkg/dev_compiler/web/main.dart
+++ b/pkg/dev_compiler/web/main.dart
@@ -69,7 +69,7 @@
     messageHandler("We're sorry, you've found a bug in our compiler.");
     messageHandler("You can report this bug at:");
     messageHandler(
-        "    https://github.com/dart-lang/sdk/issues/labels/area-dev-compiler");
+        "    https://github.com/dart-lang/sdk/issues/labels/web-dev-compiler");
     messageHandler("");
     messageHandler(
         "Please include the information below in your report, along with");
diff --git a/pkg/dev_compiler/web/stack_trace_mapper.dart b/pkg/dev_compiler/web/stack_trace_mapper.dart
index 7fa1dc1..e4557c3 100644
--- a/pkg/dev_compiler/web/stack_trace_mapper.dart
+++ b/pkg/dev_compiler/web/stack_trace_mapper.dart
@@ -23,7 +23,7 @@
 library stack_trace_mapper;
 
 import 'package:js/js.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 import 'source_map_stack_trace.dart';
 import 'package:source_maps/source_maps.dart';
 import 'package:source_span/source_span.dart';
@@ -80,7 +80,7 @@
         var mapping = parse(strMap) as SingleMapping;
         mapping
           ..targetUrl = uri
-          ..sourceRoot = '${path.dirname(uri)}/';
+          ..sourceRoot = '${p.dirname(uri)}/';
         _bundle.addMapping(mapping);
       }
     }
diff --git a/pkg/dev_compiler/web/web_command.dart b/pkg/dev_compiler/web/web_command.dart
index 2a7496d..e58a363 100644
--- a/pkg/dev_compiler/web/web_command.dart
+++ b/pkg/dev_compiler/web/web_command.dart
@@ -27,7 +27,7 @@
 
 import 'package:dev_compiler/src/compiler/module_builder.dart';
 import 'package:js/js.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
 typedef void MessageHandler(Object message);
 
@@ -164,13 +164,13 @@
     var resolveFn = (String url) {
       var packagePrefix = 'package:';
       var uri = Uri.parse(url);
-      var base = path.basename(url);
+      var base = p.basename(url);
       var parts = uri.pathSegments;
       var match;
       int bestScore = 0;
       for (var candidate in summaryData.uriToSummaryPath.keys) {
-        if (path.basename(candidate) != base) continue;
-        List<String> candidateParts = path.dirname(candidate).split('/');
+        if (p.basename(candidate) != base) continue;
+        List<String> candidateParts = p.dirname(candidate).split('/');
         var first = candidateParts.first;
 
         // Process and strip "package:" prefix.
@@ -228,7 +228,7 @@
       if (existingLibrary == null) {
         sourceCode = imports + body;
       } else {
-        var dir = path.dirname(existingLibrary);
+        var dir = p.dirname(existingLibrary);
         // Need to pull in all the imports from the existing library and
         // re-export all privates as privates in this library.
         // Assumption: summaries are available for all libraries, including any
@@ -261,10 +261,10 @@
           // dart: and package: uris are not relative but the path package
           // thinks they are. We have to provide absolute uris as our library
           // has a different directory than the library we are pretending to be.
-          if (path.isRelative(uri) &&
+          if (p.isRelative(uri) &&
               !uri.startsWith('package:') &&
               !uri.startsWith('dart:')) {
-            uri = path.normalize(path.join(dir, uri));
+            uri = p.normalize(p.join(dir, uri));
           }
           sb.write('import ${json.encode(uri)}');
           if (import.prefixReference != 0) {
@@ -287,7 +287,7 @@
       }
       resources.newFile(fileName, sourceCode);
 
-      var name = path.toUri(libraryName).toString();
+      var name = p.toUri(libraryName).toString();
       compilerOptions.moduleName = name;
       JSModuleFile module =
           compileWithAnalyzer(driver, [fileName], options, compilerOptions);
diff --git a/pkg/expect/lib/expect.dart b/pkg/expect/lib/expect.dart
index 3b2b2bf..df8bffa 100644
--- a/pkg/expect/lib/expect.dart
+++ b/pkg/expect/lib/expect.dart
@@ -662,7 +662,7 @@
 /// Exception thrown on a failed expectation check.
 ///
 /// Always recognized by [Expect.throws] as an unexpected error.
-class ExpectException implements Exception {
+class ExpectException {
   final String message;
   ExpectException(this.message);
   String toString() => message;
diff --git a/pkg/front_end/analysis_options.yaml b/pkg/front_end/analysis_options.yaml
index 2b7dca6..63c5c24 100644
--- a/pkg/front_end/analysis_options.yaml
+++ b/pkg/front_end/analysis_options.yaml
@@ -4,7 +4,14 @@
 
 analyzer:
   exclude:
+    - test/extensions/data/**
+    - test/flow_analysis/definite_assignment/data/**
+    - test/flow_analysis/nullability/data/**
+    - test/flow_analysis/reachability/data/**
+    - test/flow_analysis/type_promotion/data/**
     - testcases/**
+    - test/id_testing/data/**
+    - test/language_versioning/data/**
   errors:
     # Allow having TODOs in the code
     todo: ignore
diff --git a/pkg/front_end/lib/src/api_prototype/compiler_options.dart b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
index 14a2a0c..e6616203 100644
--- a/pkg/front_end/lib/src/api_prototype/compiler_options.dart
+++ b/pkg/front_end/lib/src/api_prototype/compiler_options.dart
@@ -9,7 +9,11 @@
 import 'diagnostic_message.dart' show DiagnosticMessageHandler;
 
 import 'experimental_flags.dart'
-    show defaultExperimentalFlags, ExperimentalFlag, parseExperimentalFlag;
+    show
+        defaultExperimentalFlags,
+        ExperimentalFlag,
+        expiredExperimentalFlags,
+        parseExperimentalFlag;
 
 import 'file_system.dart' show FileSystem;
 
@@ -76,7 +80,7 @@
 
   /// URI of the SDK summary file (typically a "file:" URI).
   ///
-  /// This should should be a summary previosly generated by this package (and
+  /// This should should be a summary previously generated by this package (and
   /// not the similarly named summary files from `package:analyzer`.)
   ///
   /// If `null` and [compileSdk] is false, the SDK summary will be searched for
@@ -153,16 +157,16 @@
   /// If not specified, the default target is the VM.
   Target target;
 
-  /// Whether asserts in initializers in const constructors are checked during
-  /// constant evaluation.
+  /// Deprecated. Has no affect on front-end.
+  // TODO(dartbug.com/37514) Remove this field once DDK removes its uses of it.
   bool enableAsserts = false;
 
   /// Whether to show verbose messages (mainly for debugging and performance
   /// tracking).
   ///
   /// Messages are printed on stdout.
-  // TODO(sigmund): improve the diagnotics API to provide mechanism to intercept
-  // verbose data (Issue #30056)
+  // TODO(sigmund): improve the diagnostics API to provide mechanism to
+  // intercept verbose data (Issue #30056)
   bool verbose = false;
 
   /// Whether to run extra verification steps to validate that compiled
@@ -213,40 +217,89 @@
   bool writeFileOnCrashReport = true;
 }
 
-/// Parse experimental flags from a list of strings, each of which is either a
-/// flag name or a flag name prefixed by 'no-'. Return a map of flags to their
-/// values that can be passed to [experimentalFlags]. The returned map is
-/// normalized to contain default values for unmentioned flags.
+/// Parse experimental flag arguments of the form 'flag' or 'no-flag' into a map
+/// from 'flag' to `true` or `false`, respectively.
+Map<String, bool> parseExperimentalArguments(List<String> arguments) {
+  Map<String, bool> result = {};
+  if (arguments != null) {
+    for (var argument in arguments) {
+      for (var feature in argument.split(',')) {
+        if (feature.startsWith('no-')) {
+          result[feature.substring(3)] = false;
+        } else {
+          result[feature] = true;
+        }
+      }
+    }
+  }
+  return result;
+}
+
+/// Parse a map of experimental flags to values that can be passed to
+/// [CompilerOptions.experimentalFlags].
+/// The returned map is normalized to contain default values for unmentioned
+/// flags.
 ///
 /// If an unknown flag is mentioned, or a flag is mentioned more than once,
 /// the supplied error handler is called with an error message.
+///
+/// If an expired flag is set to its non-default value the supplied error
+/// handler is called with an error message.
+///
+/// If an expired flag is set to its default value the supplied warning
+/// handler is called with a warning message.
 Map<ExperimentalFlag, bool> parseExperimentalFlags(
-    Iterable<String> experiments, void onError(String message)) {
+    Map<String, bool> experiments,
+    {void onError(String message),
+    void onWarning(String message)}) {
   Map<ExperimentalFlag, bool> flags = <ExperimentalFlag, bool>{};
   if (experiments != null) {
-    for (String experiment in experiments) {
-      bool value = true;
-      if (experiment.startsWith("no-")) {
-        value = false;
-        experiment = experiment.substring(3);
-      }
+    for (String experiment in experiments.keys) {
+      bool value = experiments[experiment];
       ExperimentalFlag flag = parseExperimentalFlag(experiment);
       if (flag == null) {
         onError("Unknown experiment: " + experiment);
-      } else if (flag == ExperimentalFlag.expiredFlag) {
-        print("Experiment flag no longer required: " + experiment);
       } else if (flags.containsKey(flag)) {
         if (flags[flag] != value) {
           onError(
               "Experiment specified with conflicting values: " + experiment);
         }
       } else {
-        flags[flag] = value;
+        if (expiredExperimentalFlags[flag]) {
+          if (value != defaultExperimentalFlags[flag]) {
+            /// Produce an error when the value is not the default value.
+            if (value) {
+              onError("Enabling experiment " +
+                  experiment +
+                  " is no longer supported.");
+            } else {
+              onError("Disabling experiment " +
+                  experiment +
+                  " is no longer supported.");
+            }
+            value = defaultExperimentalFlags[flag];
+          } else if (onWarning != null) {
+            /// Produce a warning when the value is the default value.
+            if (value) {
+              onWarning("Experiment " +
+                  experiment +
+                  " is enabled by default. "
+                      "The use of the flag is deprecated.");
+            } else {
+              onWarning("Experiment " +
+                  experiment +
+                  " is disabled by default. "
+                      "The use of the flag is deprecated.");
+            }
+          }
+          flags[flag] = value;
+        } else {
+          flags[flag] = value;
+        }
       }
     }
   }
   for (ExperimentalFlag flag in ExperimentalFlag.values) {
-    if (flag == ExperimentalFlag.expiredFlag) continue;
     assert(defaultExperimentalFlags.containsKey(flag),
         "No default value for $flag.");
     flags[flag] ??= defaultExperimentalFlags[flag];
diff --git a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
index 5c2f97e..466a1ff 100644
--- a/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
+++ b/pkg/front_end/lib/src/api_prototype/experimental_flags.dart
@@ -12,13 +12,9 @@
   controlFlowCollections,
   extensionMethods,
   nonNullable,
+  setLiterals,
   spreadCollections,
   tripleShift,
-
-  // A placeholder representing an "expired" flag which has been removed
-  // from the codebase but still needs to be gracefully ignored
-  // when specified on the command line.
-  expiredFlag,
 }
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
@@ -31,23 +27,32 @@
       return ExperimentalFlag.extensionMethods;
     case "non-nullable":
       return ExperimentalFlag.nonNullable;
+    case "set-literals":
+      return ExperimentalFlag.setLiterals;
     case "spread-collections":
       return ExperimentalFlag.spreadCollections;
     case "triple-shift":
       return ExperimentalFlag.tripleShift;
-
-    // Expired flags
-    case "set-literals":
-      return ExperimentalFlag.expiredFlag;
   }
   return null;
 }
 
 const Map<ExperimentalFlag, bool> defaultExperimentalFlags = {
-  ExperimentalFlag.constantUpdate2018: false,
+  ExperimentalFlag.constantUpdate2018: true,
   ExperimentalFlag.controlFlowCollections: true,
   ExperimentalFlag.extensionMethods: false,
   ExperimentalFlag.nonNullable: false,
+  ExperimentalFlag.setLiterals: true,
   ExperimentalFlag.spreadCollections: true,
   ExperimentalFlag.tripleShift: false,
 };
+
+const Map<ExperimentalFlag, bool> expiredExperimentalFlags = {
+  ExperimentalFlag.constantUpdate2018: false,
+  ExperimentalFlag.controlFlowCollections: false,
+  ExperimentalFlag.extensionMethods: false,
+  ExperimentalFlag.nonNullable: false,
+  ExperimentalFlag.setLiterals: true,
+  ExperimentalFlag.spreadCollections: false,
+  ExperimentalFlag.tripleShift: false,
+};
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 ce04a71..0cf8a93 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
@@ -4,6 +4,10 @@
 
 import 'dart:async' show Future;
 
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
 import 'package:kernel/kernel.dart'
     show Component, Procedure, DartType, TypeParameter;
 
@@ -45,6 +49,14 @@
   /// 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();
+
   /// 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
   /// next call to [computeDelta]).
diff --git a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
index 9b44f9a..b83bdd4 100644
--- a/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
+++ b/pkg/front_end/lib/src/api_prototype/kernel_generator.dart
@@ -7,7 +7,11 @@
 
 import 'dart:async' show Future;
 
-import 'package:kernel/kernel.dart' show Component;
+import 'package:kernel/ast.dart' show Component;
+
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
@@ -31,8 +35,8 @@
 /// follows `import`, `export`, and `part` declarations to discover the whole
 /// program, and converts the result to Dart Kernel format.
 ///
-/// If `compileSdk` in [options] is true, the generated component will include
-/// code for the SDK.
+/// If `compileSdk` in [options] is true, the generated [CompilerResult] will
+/// include code for the SDK.
 ///
 /// If summaries are provided in [options], the compiler will use them instead
 /// of compiling the libraries contained in those summaries. This is useful, for
@@ -42,10 +46,20 @@
 /// The input [source] is expected to be a script with a main method, otherwise
 /// an error is reported.
 // TODO(sigmund): rename to kernelForScript?
-Future<Component> kernelForProgram(Uri source, CompilerOptions options) async {
+Future<CompilerResult> kernelForProgram(
+    Uri source, CompilerOptions options) async {
+  return (await kernelForProgramInternal(source, options));
+}
+
+Future<CompilerResult> kernelForProgramInternal(
+    Uri source, CompilerOptions options,
+    {bool retainDataForTesting: false}) async {
   var pOptions = new ProcessedOptions(options: options, inputs: [source]);
   return await CompilerContext.runWithOptions(pOptions, (context) async {
-    var component = (await generateKernelInternal())?.component;
+    CompilerResult result = await generateKernelInternal(
+        includeHierarchyAndCoreTypes: true,
+        retainDataForTesting: retainDataForTesting);
+    var component = result?.component;
     if (component == null) return null;
 
     if (component.mainMethod == null) {
@@ -54,33 +68,54 @@
           Severity.error);
       return null;
     }
-    return component;
+    return result;
   });
 }
 
-/// Generates a kernel representation for a build unit containing [sources].
+/// Generates a kernel representation for a module containing [sources].
 ///
-/// A build unit is a collection of libraries that are compiled together.
-/// Libraries in the build unit may depend on each other and may have
-/// dependencies to libraries in other build units. Unlinke library
-/// dependencies, build unit dependencies must be acyclic.
+/// A module is a collection of libraries that are compiled together. Libraries
+/// in the module may depend on each other and may have dependencies to
+/// libraries in other modules. Unlike library dependencies, module dependencies
+/// must be acyclic.
 ///
-/// This API is intended for modular compilation. Dependencies to other build
-/// units are specified using [CompilerOptions.inputSummaries].  Any dependency
+/// This API is intended for modular compilation. Dependencies to other modules
+/// are specified using [CompilerOptions.inputSummaries]. Any dependency
 /// of [sources] that is not listed in [CompilerOptions.inputSummaries] and
 /// [CompilerOptions.sdkSummary] is treated as an additional source file for the
-/// build unit.
+/// module.
 ///
 /// Any `part` declarations found in [sources] must refer to part files which
-/// are also listed in the build unit sources, otherwise an error results.  (It
-/// is not permitted to refer to a part file declared in another build unit).
+/// are also listed in the module sources, otherwise an error results.  (It
+/// is not permitted to refer to a part file declared in another module).
 ///
-/// The return value is a [Component] object with no main method set. The
-/// [Component] includes external libraries for those libraries loaded through
-/// summaries.
-Future<Component> kernelForComponent(
+/// The return value is a [CompilerResult] object with no main method set in
+/// the [Component] of its `component` property. The [Component] includes
+/// external libraries for those libraries loaded through summaries.
+Future<CompilerResult> kernelForModule(
     List<Uri> sources, CompilerOptions options) async {
   return (await generateKernel(
-          new ProcessedOptions(options: options, inputs: sources)))
-      ?.component;
+      new ProcessedOptions(options: options, inputs: sources),
+      includeHierarchyAndCoreTypes: true));
+}
+
+/// Result object for [kernelForProgram] and [kernelForModule].
+abstract class CompilerResult {
+  /// The generated summary bytes, if it was requested.
+  List<int> get summary;
+
+  /// The generated component, if it was requested.
+  Component get component;
+
+  /// Dependencies traversed by the compiler. Used only for generating
+  /// dependency .GN files in the dart-sdk build system.
+  /// Note this might be removed when we switch to compute dependencies without
+  /// using the compiler itself.
+  List<Uri> get deps;
+
+  /// The [ClassHierarchy] for the compiled [component], if it was requested.
+  ClassHierarchy get classHierarchy;
+
+  /// The [CoreTypes] object for the compiled [component], if it was requested.
+  CoreTypes get coreTypes;
 }
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 2cd528c..e9f9dda 100644
--- a/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
+++ b/pkg/front_end/lib/src/api_unstable/bazel_worker.dart
@@ -7,6 +7,7 @@
 
 import 'dart:async' show Future;
 
+import 'package:front_end/src/api_prototype/compiler_options.dart';
 import 'package:kernel/kernel.dart' show Component, CanonicalName;
 
 import 'package:kernel/target/targets.dart' show Target;
@@ -18,6 +19,8 @@
 
 import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
 
+import '../api_prototype/front_end.dart' show CompilerResult;
+
 import '../api_prototype/file_system.dart' show FileSystem;
 
 import '../base/processed_options.dart' show ProcessedOptions;
@@ -26,7 +29,7 @@
 
 import '../fasta/incremental_compiler.dart' show IncrementalCompiler;
 
-import '../kernel_generator_impl.dart' show CompilerResult, generateKernel;
+import '../kernel_generator_impl.dart' show generateKernel;
 
 import 'compiler_state.dart'
     show InitializedCompilerState, WorkerInputComponent, digestsEqual;
@@ -72,8 +75,9 @@
   Map<Uri, WorkerInputComponent> workerInputCache =
       oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
   bool startOver = false;
-  Map<ExperimentalFlag, bool> experimentalFlags =
-      parseExperimentalFlags(experiments, (e) => throw e);
+  Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
+      parseExperimentalArguments(experiments),
+      onError: (e) => throw e);
 
   if (oldState == null ||
       oldState.incrementalCompiler == null ||
@@ -130,7 +134,7 @@
     // won't be able to link to it when loading more outlines.
     sdkComponent.adoptChildren();
 
-    // TODO(jensj): This is - at least currently - neccessary,
+    // TODO(jensj): This is - at least currently - necessary,
     // although it's not entirely obvious why.
     // It likely has to do with several outlines containing the same libraries.
     // Once that stops (and we check for it) we can probably remove this,
@@ -218,7 +222,9 @@
     ..target = target
     ..fileSystem = fileSystem
     ..environmentDefines = const {}
-    ..experimentalFlags = parseExperimentalFlags(experiments, (e) => throw e);
+    ..experimentalFlags = parseExperimentalFlags(
+        parseExperimentalArguments(experiments),
+        onError: (e) => throw e);
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/pkg/front_end/lib/src/api_unstable/dart2js.dart b/pkg/front_end/lib/src/api_unstable/dart2js.dart
index 0955d51..947ca61 100644
--- a/pkg/front_end/lib/src/api_unstable/dart2js.dart
+++ b/pkg/front_end/lib/src/api_unstable/dart2js.dart
@@ -39,7 +39,7 @@
 import 'util.dart' show equalLists, equalMaps;
 
 export '../api_prototype/compiler_options.dart'
-    show CompilerOptions, parseExperimentalFlags;
+    show CompilerOptions, parseExperimentalFlags, parseExperimentalArguments;
 
 export '../api_prototype/diagnostic_message.dart'
     show
@@ -117,8 +117,7 @@
     Uri packagesFileUri,
     {List<Uri> dependencies,
     Map<ExperimentalFlag, bool> experimentalFlags,
-    bool verify: false,
-    bool enableAsserts: false}) {
+    bool verify: false}) {
   linkedDependencies.sort((a, b) => a.toString().compareTo(b.toString()));
 
   if (oldState != null &&
@@ -136,8 +135,7 @@
     ..librariesSpecificationUri = librariesSpecificationUri
     ..packagesFileUri = packagesFileUri
     ..experimentalFlags = experimentalFlags
-    ..verify = verify
-    ..enableAsserts = enableAsserts;
+    ..verify = verify;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
 
diff --git a/pkg/front_end/lib/src/api_unstable/ddc.dart b/pkg/front_end/lib/src/api_unstable/ddc.dart
index d761b49..b53e029 100644
--- a/pkg/front_end/lib/src/api_unstable/ddc.dart
+++ b/pkg/front_end/lib/src/api_unstable/ddc.dart
@@ -4,6 +4,7 @@
 
 import 'dart:async' show Future;
 
+import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/kernel.dart' show Component, CanonicalName;
 
 import 'package:kernel/target/targets.dart' show Target;
@@ -31,14 +32,15 @@
 
 import 'util.dart' show equalLists, equalMaps;
 
-export '../api_prototype/compiler_options.dart' show CompilerOptions;
+export '../api_prototype/compiler_options.dart'
+    show CompilerOptions, parseExperimentalFlags, parseExperimentalArguments;
 
 export '../api_prototype/diagnostic_message.dart' show DiagnosticMessage;
 
 export '../api_prototype/experimental_flags.dart'
     show ExperimentalFlag, parseExperimentalFlag;
 
-export '../api_prototype/kernel_generator.dart' show kernelForComponent;
+export '../api_prototype/kernel_generator.dart' show kernelForModule;
 
 export '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
 
@@ -67,8 +69,10 @@
 class DdcResult {
   final Component component;
   final List<Component> inputSummaries;
+  final ClassHierarchy classHierarchy;
 
-  DdcResult(this.component, this.inputSummaries);
+  DdcResult(this.component, this.inputSummaries, this.classHierarchy)
+      : assert(classHierarchy != null);
 }
 
 Future<InitializedCompilerState> initializeCompiler(
@@ -81,7 +85,8 @@
     List<Uri> inputSummaries,
     Target target,
     {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> experiments}) async {
+    Map<ExperimentalFlag, bool> experiments,
+    Map<String, String> environmentDefines}) async {
   inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
 
   if (oldState != null &&
@@ -90,7 +95,8 @@
       oldState.options.packagesFileUri == packagesFile &&
       oldState.options.librariesSpecificationUri == librariesSpecificationUri &&
       equalLists(oldState.options.inputSummaries, inputSummaries) &&
-      equalMaps(oldState.options.experimentalFlags, experiments)) {
+      equalMaps(oldState.options.experimentalFlags, experiments) &&
+      equalMaps(oldState.options.environmentDefines, environmentDefines)) {
     // Reuse old state.
 
     // These libraries are marked external when compiling. If not un-marking
@@ -114,7 +120,8 @@
     ..inputSummaries = inputSummaries
     ..librariesSpecificationUri = librariesSpecificationUri
     ..target = target
-    ..fileSystem = fileSystem ?? StandardFileSystem.instance;
+    ..fileSystem = fileSystem ?? StandardFileSystem.instance
+    ..environmentDefines = environmentDefines;
   if (experiments != null) options.experimentalFlags = experiments;
 
   ProcessedOptions processedOpts = new ProcessedOptions(options: options);
@@ -134,7 +141,8 @@
     Map<Uri, List<int>> workerInputDigests,
     Target target,
     {FileSystem fileSystem,
-    Map<ExperimentalFlag, bool> experiments}) async {
+    Map<ExperimentalFlag, bool> experiments,
+    Map<String, String> environmentDefines}) async {
   inputSummaries.sort((a, b) => a.toString().compareTo(b.toString()));
 
   IncrementalCompiler incrementalCompiler;
@@ -146,7 +154,7 @@
       oldState?.workerInputCache ?? new Map<Uri, WorkerInputComponent>();
   var sdkDigest = workerInputDigests[sdkSummary];
   if (sdkDigest == null) {
-    throw new StateError("Expected to get sdk digest at $cachedSdkInput");
+    throw new StateError("Expected to get sdk digest at $sdkSummary");
   }
 
   cachedSdkInput = workerInputCache[sdkSummary];
@@ -156,7 +164,8 @@
       oldState.options.compileSdk != compileSdk ||
       cachedSdkInput == null ||
       !digestsEqual(cachedSdkInput.digest, sdkDigest) ||
-      !equalMaps(oldState.options.experimentalFlags, experiments)) {
+      !equalMaps(oldState.options.experimentalFlags, experiments) ||
+      !equalMaps(oldState.options.environmentDefines, environmentDefines)) {
     // No previous state.
     options = new CompilerOptions()
       ..compileSdk = compileSdk
@@ -166,7 +175,8 @@
       ..inputSummaries = inputSummaries
       ..librariesSpecificationUri = librariesSpecificationUri
       ..target = target
-      ..fileSystem = fileSystem ?? StandardFileSystem.instance;
+      ..fileSystem = fileSystem ?? StandardFileSystem.instance
+      ..environmentDefines = environmentDefines;
     if (experiments != null) options.experimentalFlags = experiments;
 
     // We'll load a new sdk, anything loaded already will have a wrong root.
@@ -266,12 +276,13 @@
   processedOpts.inputs.clear();
   processedOpts.inputs.addAll(inputs);
 
-  var compilerResult = await generateKernel(processedOpts);
+  var compilerResult =
+      await generateKernel(processedOpts, includeHierarchyAndCoreTypes: true);
 
   var component = compilerResult?.component;
   if (component == null) return null;
 
   // This should be cached.
   var summaries = await processedOpts.loadInputSummaries(null);
-  return new DdcResult(component, summaries);
+  return new DdcResult(component, summaries, compilerResult.classHierarchy);
 }
diff --git a/pkg/front_end/lib/src/api_unstable/vm.dart b/pkg/front_end/lib/src/api_unstable/vm.dart
index 5d814c2..47691d7 100644
--- a/pkg/front_end/lib/src/api_unstable/vm.dart
+++ b/pkg/front_end/lib/src/api_unstable/vm.dart
@@ -3,19 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 export '../api_prototype/compiler_options.dart'
-    show CompilerOptions, parseExperimentalFlags;
+    show CompilerOptions, parseExperimentalArguments, parseExperimentalFlags;
 
 export '../api_prototype/diagnostic_message.dart'
     show DiagnosticMessage, DiagnosticMessageHandler, getMessageUri;
 
+export '../api_prototype/experimental_flags.dart'
+    show defaultExperimentalFlags, ExperimentalFlag;
+
 export '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
 
+export '../api_prototype/front_end.dart' show CompilerResult;
+
 export '../api_prototype/incremental_kernel_generator.dart'
     show IncrementalKernelGenerator, isLegalIdentifier;
 
 export '../api_prototype/kernel_generator.dart'
-    show kernelForComponent, kernelForProgram;
+    show kernelForModule, kernelForProgram;
 
 export '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
 
@@ -37,6 +42,7 @@
         messageBytecodeLimitExceededTooManyArguments,
         noLength,
         templateFfiFieldAnnotation,
+        templateFfiFieldNoAnnotation,
         templateFfiNotStatic,
         templateFfiTypeInvalid,
         templateFfiTypeMismatch,
@@ -50,7 +56,11 @@
 
 export '../fasta/hybrid_file_system.dart' show HybridFileSystem;
 
-export '../fasta/kernel/utils.dart' show serializeComponent, serializeProcedure;
+export '../fasta/kernel/utils.dart'
+    show
+        createExpressionEvaluationComponent,
+        serializeComponent,
+        serializeProcedure;
 
 export '../fasta/resolve_input_uri.dart' show resolveInputUri;
 
diff --git a/pkg/front_end/lib/src/base/libraries_specification.dart b/pkg/front_end/lib/src/base/libraries_specification.dart
index 7838eda..09baff1 100644
--- a/pkg/front_end/lib/src/base/libraries_specification.dart
+++ b/pkg/front_end/lib/src/base/libraries_specification.dart
@@ -90,7 +90,8 @@
 // TODO(sigmund): move this file to a shared package.
 import 'dart:convert' show jsonDecode, jsonEncode;
 
-import '../fasta/util/relativize.dart';
+import '../fasta/util/relativize.dart' show relativizeUri;
+import '../fasta/resolve_input_uri.dart' show isWindows;
 
 /// Contents from a single library specification file.
 ///
@@ -202,7 +203,7 @@
   Map toJsonMap(Uri outputUri) {
     var result = {};
     var dir = outputUri.resolve('.');
-    String pathFor(Uri uri) => relativizeUri(uri, base: dir);
+    String pathFor(Uri uri) => relativizeUri(dir, uri, isWindows);
     _targets.forEach((targetName, target) {
       var libraries = {};
       target._libraries.forEach((name, lib) {
diff --git a/pkg/front_end/lib/src/base/processed_options.dart b/pkg/front_end/lib/src/base/processed_options.dart
index a3e6cbe..ed907b5 100644
--- a/pkg/front_end/lib/src/base/processed_options.dart
+++ b/pkg/front_end/lib/src/base/processed_options.dart
@@ -25,7 +25,7 @@
     show CompilerOptions, DiagnosticMessage;
 
 import '../api_prototype/experimental_flags.dart'
-    show defaultExperimentalFlags, ExperimentalFlag;
+    show defaultExperimentalFlags, ExperimentalFlag, expiredExperimentalFlags;
 
 import '../api_prototype/file_system.dart'
     show FileSystem, FileSystemEntity, FileSystemException;
@@ -158,8 +158,6 @@
 
   Uri get packagesUriRaw => _raw.packagesFileUri;
 
-  bool get enableAsserts => _raw.enableAsserts;
-
   bool get verbose => _raw.verbose;
 
   bool get verify => _raw.verify;
@@ -315,7 +313,11 @@
   bool isExperimentEnabled(ExperimentalFlag flag) {
     assert(defaultExperimentalFlags.containsKey(flag),
         "No default value for $flag.");
-    // TODO(askesc): Determine default flag value from specification file.
+    assert(expiredExperimentalFlags.containsKey(flag),
+        "No expired value for $flag.");
+    if (expiredExperimentalFlags[flag]) {
+      return defaultExperimentalFlags[flag];
+    }
     return _raw.experimentalFlags[flag] ?? defaultExperimentalFlags[flag];
   }
 
@@ -346,7 +348,7 @@
     if (_inputSummariesComponents == null) {
       var uris = _raw.inputSummaries;
       if (uris == null || uris.isEmpty) return const <Component>[];
-      // TODO(sigmund): throttle # of concurrent opreations.
+      // TODO(sigmund): throttle # of concurrent operations.
       var allBytes = await Future.wait(
           uris.map((uri) => _readAsBytes(fileSystem.entityForUri(uri))));
       _inputSummariesComponents =
@@ -368,7 +370,7 @@
     if (_linkedDependencies == null) {
       var uris = _raw.linkedDependencies;
       if (uris == null || uris.isEmpty) return const <Component>[];
-      // TODO(sigmund): throttle # of concurrent opreations.
+      // TODO(sigmund): throttle # of concurrent operations.
       var allBytes = await Future.wait(
           uris.map((uri) => _readAsBytes(fileSystem.entityForUri(uri))));
       _linkedDependencies =
@@ -405,7 +407,7 @@
       ticker.logMs("Started building UriTranslator");
       var libraries = await _computeLibrarySpecification();
       ticker.logMs("Read libraries file");
-      var packages = await _getPackages();
+      Packages packages = await _getPackages();
       ticker.logMs("Read packages file");
       _uriTranslator = new UriTranslator(libraries, packages);
     }
@@ -464,7 +466,7 @@
 
     var input = inputs.first;
 
-    // When compiling the SDK the input files are normaly `dart:` URIs.
+    // When compiling the SDK the input files are normally `dart:` URIs.
     if (input.scheme == 'dart') return _packages = Packages.noPackages;
 
     if (input.scheme == 'packages') {
@@ -564,7 +566,7 @@
 
   /// Ensure [_sdkRoot], [_sdkSummary] and [_librarySpecUri] are initialized.
   ///
-  /// If they are not set explicitly, they are infered based on the default
+  /// If they are not set explicitly, they are inferred based on the default
   /// behavior described in [CompilerOptions].
   void _ensureSdkDefaults() {
     if (_computedSdkDefaults) return;
diff --git a/pkg/front_end/lib/src/fasta/builder/builder.dart b/pkg/front_end/lib/src/fasta/builder/builder.dart
index cce01a4..285dc07 100644
--- a/pkg/front_end/lib/src/fasta/builder/builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builder.dart
@@ -20,7 +20,7 @@
 
 export 'constructor_reference_builder.dart' show ConstructorReferenceBuilder;
 
-export 'declaration.dart' show Declaration;
+export 'declaration.dart' show Builder;
 
 export 'dynamic_type_builder.dart' show DynamicTypeBuilder;
 
@@ -30,6 +30,13 @@
 
 export 'formal_parameter_builder.dart' show FormalParameterBuilder;
 
+export 'procedure_builder.dart'
+    show
+        FunctionBuilder,
+        ConstructorBuilder,
+        ProcedureBuilder,
+        RedirectingFactoryBuilder;
+
 export 'function_type_builder.dart' show FunctionTypeBuilder;
 
 export 'invalid_type_builder.dart' show InvalidTypeBuilder;
@@ -50,8 +57,6 @@
 
 export 'prefix_builder.dart' show PrefixBuilder;
 
-export 'procedure_builder.dart' show ProcedureBuilder;
-
 export 'type_alias_builder.dart' show TypeAliasBuilder;
 
 export 'type_builder.dart' show TypeBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart
index b362d75..0e4d3a3 100644
--- a/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/builtin_type_builder.dart
@@ -4,19 +4,22 @@
 
 library fasta.builtin_type_builder;
 
+import 'package:kernel/ast.dart' show DartType;
+
 import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeDeclarationBuilder;
 
-abstract class BuiltinTypeBuilder<T extends TypeBuilder, R>
-    extends TypeDeclarationBuilder<T, R> {
-  final R type;
+abstract class BuiltinTypeBuilder extends TypeDeclarationBuilder {
+  final DartType type;
 
   BuiltinTypeBuilder(
       String name, this.type, LibraryBuilder compilationUnit, int charOffset)
       : super(null, 0, name, compilationUnit, charOffset);
 
-  R buildType(LibraryBuilder library, List<T> arguments) => type;
+  DartType buildType(LibraryBuilder library, List<TypeBuilder> arguments) =>
+      type;
 
-  R buildTypesWithBuiltArguments(LibraryBuilder library, List<R> arguments) {
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
     return type;
   }
 
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 199e65c..b6bbd4a 100644
--- a/pkg/front_end/lib/src/fasta/builder/class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/class_builder.dart
@@ -4,12 +4,59 @@
 
 library fasta.class_builder;
 
-import '../problems.dart' show internalProblem;
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        AsExpression,
+        Class,
+        Constructor,
+        DartType,
+        DynamicType,
+        Expression,
+        Field,
+        FunctionNode,
+        InterfaceType,
+        InvalidType,
+        ListLiteral,
+        Member,
+        MethodInvocation,
+        Name,
+        Procedure,
+        ProcedureKind,
+        RedirectingFactoryConstructor,
+        ReturnStatement,
+        StaticGet,
+        Supertype,
+        ThisExpression,
+        TypeParameter,
+        TypeParameterType,
+        VariableDeclaration,
+        VoidType;
+
+import 'package:kernel/ast.dart' show FunctionType, TypeParameterType;
+
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
+import 'package:kernel/clone.dart' show CloneWithoutBody;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
+
+import 'package:kernel/src/bounds_checks.dart'
+    show TypeArgumentIssue, findTypeArgumentIssues, getGenericTypeName;
+
+import 'package:kernel/type_algebra.dart' show Substitution, substitute;
+
+import 'package:kernel/type_algebra.dart' as type_algebra
+    show getSubstitutionMap;
+
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
+
+import '../dill/dill_member_builder.dart' show DillMemberBuilder;
 
 import 'builder.dart'
     show
         ConstructorReferenceBuilder,
-        Declaration,
+        Builder,
         LibraryBuilder,
         MemberBuilder,
         MetadataBuilder,
@@ -20,15 +67,91 @@
         TypeVariableBuilder;
 
 import '../fasta_codes.dart'
-    show LocatedMessage, Message, templateInternalProblemNotFoundIn;
+    show
+        LocatedMessage,
+        Message,
+        messageGenericFunctionTypeUsedAsActualTypeArgument,
+        messageImplementsFutureOr,
+        messagePatchClassOrigin,
+        messagePatchClassTypeVariablesMismatch,
+        messagePatchDeclarationMismatch,
+        messagePatchDeclarationOrigin,
+        noLength,
+        templateDuplicatedDeclarationUse,
+        templateGenericFunctionTypeInferredAsActualTypeArgument,
+        templateIllegalMixinDueToConstructors,
+        templateIllegalMixinDueToConstructorsCause,
+        templateImplementsRepeated,
+        templateImplementsSuperClass,
+        templateImplicitMixinOverrideContext,
+        templateIncompatibleRedirecteeFunctionType,
+        templateIncorrectTypeArgument,
+        templateIncorrectTypeArgumentInSupertype,
+        templateIncorrectTypeArgumentInSupertypeInferred,
+        templateInterfaceCheckContext,
+        templateInternalProblemNotFoundIn,
+        templateMixinApplicationIncompatibleSupertype,
+        templateNamedMixinOverrideContext,
+        templateOverriddenMethodCause,
+        templateOverrideFewerNamedArguments,
+        templateOverrideFewerPositionalArguments,
+        templateOverrideMismatchNamedParameter,
+        templateOverrideMoreRequiredArguments,
+        templateOverrideTypeMismatchParameter,
+        templateOverrideTypeMismatchReturnType,
+        templateOverrideTypeVariablesMismatch,
+        templateRedirectingFactoryIncompatibleTypeArgument,
+        templateRedirectionTargetNotFound,
+        templateTypeArgumentMismatch;
 
-abstract class ClassBuilder<T extends TypeBuilder, R>
-    extends TypeDeclarationBuilder<T, R> {
+import '../kernel/kernel_builder.dart'
+    show
+        ConstructorReferenceBuilder,
+        Builder,
+        FunctionBuilder,
+        NamedTypeBuilder,
+        LibraryBuilder,
+        MemberBuilder,
+        MetadataBuilder,
+        ProcedureBuilder,
+        RedirectingFactoryBuilder,
+        Scope,
+        TypeBuilder,
+        TypeVariableBuilder;
+
+import '../kernel/redirecting_factory_body.dart'
+    show getRedirectingFactoryBody, RedirectingFactoryBody;
+
+import '../kernel/kernel_target.dart' show KernelTarget;
+
+import '../kernel/types.dart' show Types;
+
+import '../names.dart' show noSuchMethodName;
+
+import '../problems.dart'
+    show internalProblem, unexpected, unhandled, unimplemented;
+
+import '../scope.dart' show AmbiguousBuilder;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../type_inference/type_schema.dart' show UnknownType;
+
+abstract class ClassBuilder extends TypeDeclarationBuilder {
+  /// The type variables declared on a class, extension or mixin declaration.
   List<TypeVariableBuilder> typeVariables;
 
-  T supertype;
+  /// The type in the `extends` clause of a class declaration.
+  ///
+  /// Currently this also holds the synthesized super class for a mixin
+  /// declaration.
+  TypeBuilder supertype;
 
-  List<T> interfaces;
+  /// The type in the `implements` clause of a class or mixin declaration.
+  List<TypeBuilder> interfaces;
+
+  /// The types in the `on` clause of an extension or mixin declaration.
+  List<TypeBuilder> onTypes;
 
   final Scope scope;
 
@@ -40,6 +163,8 @@
 
   Map<String, ConstructorRedirection> redirectingConstructors;
 
+  ClassBuilder actualOrigin;
+
   ClassBuilder(
       List<MetadataBuilder> metadata,
       int modifiers,
@@ -47,6 +172,7 @@
       this.typeVariables,
       this.supertype,
       this.interfaces,
+      this.onTypes,
       this.scope,
       this.constructors,
       LibraryBuilder parent,
@@ -66,9 +192,9 @@
     return isMixinApplication && super.isNamedMixinApplication;
   }
 
-  T get mixedInType;
+  TypeBuilder get mixedInType;
 
-  void set mixedInType(T mixin);
+  void set mixedInType(TypeBuilder mixin);
 
   List<ConstructorReferenceBuilder> get constructorReferences => null;
 
@@ -77,7 +203,17 @@
     return library.partOfLibrary ?? library;
   }
 
-  void buildOutlineExpressions(LibraryBuilder library) {}
+  void buildOutlineExpressions(LibraryBuilder library) {
+    void build(String ignore, Builder declaration) {
+      MemberBuilder member = declaration;
+      member.buildOutlineExpressions(library);
+    }
+
+    MetadataBuilder.buildAnnotations(
+        isPatch ? origin.target : cls, metadata, library, this, null);
+    constructors.forEach(build);
+    scope.forEach(build);
+  }
 
   /// Registers a constructor redirection for this class and returns true if
   /// this redirection gives rise to a cycle that has not been reported before.
@@ -102,38 +238,129 @@
     for (ConstructorReferenceBuilder ref in constructorReferences) {
       ref.resolveIn(scope, library);
     }
-    return constructorReferences.length;
+    int count = constructorReferences.length;
+    if (count != 0) {
+      Map<String, MemberBuilder> constructors = this.constructors.local;
+      // Copy keys to avoid concurrent modification error.
+      List<String> names = constructors.keys.toList();
+      for (String name in names) {
+        Builder declaration = constructors[name];
+        do {
+          if (declaration.parent != this) {
+            unexpected("$fileUri", "${declaration.parent.fileUri}", charOffset,
+                fileUri);
+          }
+          if (declaration is RedirectingFactoryBuilder) {
+            // Compute the immediate redirection target, not the effective.
+            ConstructorReferenceBuilder redirectionTarget =
+                declaration.redirectionTarget;
+            if (redirectionTarget != null) {
+              Builder targetBuilder = redirectionTarget.target;
+              if (declaration.next == null) {
+                // Only the first one (that is, the last on in the linked list)
+                // is actually in the kernel tree. This call creates a StaticGet
+                // to [declaration.target] in a field `_redirecting#` which is
+                // only legal to do to things in the kernel tree.
+                addRedirectingConstructor(declaration, library);
+              }
+              if (targetBuilder is FunctionBuilder) {
+                List<DartType> typeArguments = declaration.typeArguments;
+                if (typeArguments == null) {
+                  // TODO(32049) If type arguments aren't specified, they should
+                  // be inferred.  Currently, the inference is not performed.
+                  // The code below is a workaround.
+                  typeArguments = new List<DartType>.filled(
+                      targetBuilder.target.enclosingClass.typeParameters.length,
+                      const DynamicType(),
+                      growable: true);
+                }
+                declaration.setRedirectingFactoryBody(
+                    targetBuilder.target, typeArguments);
+              } else if (targetBuilder is DillMemberBuilder) {
+                List<DartType> typeArguments = declaration.typeArguments;
+                if (typeArguments == null) {
+                  // TODO(32049) If type arguments aren't specified, they should
+                  // be inferred.  Currently, the inference is not performed.
+                  // The code below is a workaround.
+                  typeArguments = new List<DartType>.filled(
+                      targetBuilder.target.enclosingClass.typeParameters.length,
+                      const DynamicType(),
+                      growable: true);
+                }
+                declaration.setRedirectingFactoryBody(
+                    targetBuilder.member, typeArguments);
+              } else if (targetBuilder is AmbiguousBuilder) {
+                Message message = templateDuplicatedDeclarationUse
+                    .withArguments(redirectionTarget.fullNameForErrors);
+                if (declaration.isConst) {
+                  addProblem(message, declaration.charOffset, noLength);
+                } else {
+                  addProblem(message, declaration.charOffset, noLength);
+                }
+                // CoreTypes aren't computed yet, and this is the outline
+                // phase. So we can't and shouldn't create a method body.
+                declaration.body = new RedirectingFactoryBody.unresolved(
+                    redirectionTarget.fullNameForErrors);
+              } else {
+                Message message = templateRedirectionTargetNotFound
+                    .withArguments(redirectionTarget.fullNameForErrors);
+                if (declaration.isConst) {
+                  addProblem(message, declaration.charOffset, noLength);
+                } else {
+                  addProblem(message, declaration.charOffset, noLength);
+                }
+                // CoreTypes aren't computed yet, and this is the outline
+                // phase. So we can't and shouldn't create a method body.
+                declaration.body = new RedirectingFactoryBody.unresolved(
+                    redirectionTarget.fullNameForErrors);
+              }
+            }
+          }
+          declaration = declaration.next;
+        } while (declaration != null);
+      }
+    }
+    return count;
   }
 
   /// Used to lookup a static member of this class.
-  Declaration findStaticBuilder(
+  Builder findStaticBuilder(
       String name, int charOffset, Uri fileUri, LibraryBuilder accessingLibrary,
       {bool isSetter: false}) {
     if (accessingLibrary.origin != library.origin && name.startsWith("_")) {
       return null;
     }
-    Declaration declaration = isSetter
+    Builder declaration = isSetter
         ? scope.lookupSetter(name, charOffset, fileUri, isInstanceScope: false)
         : scope.lookup(name, charOffset, fileUri, isInstanceScope: false);
+    if (declaration == null && isPatch) {
+      return origin.findStaticBuilder(
+          name, charOffset, fileUri, accessingLibrary,
+          isSetter: isSetter);
+    }
     return declaration;
   }
 
-  Declaration findConstructorOrFactory(
+  Builder findConstructorOrFactory(
       String name, int charOffset, Uri uri, LibraryBuilder accessingLibrary) {
     if (accessingLibrary.origin != library.origin && name.startsWith("_")) {
       return null;
     }
-    return constructors.lookup(name, charOffset, uri);
+    Builder declaration = constructors.lookup(name, charOffset, uri);
+    if (declaration == null && isPatch) {
+      return origin.findConstructorOrFactory(
+          name, charOffset, uri, accessingLibrary);
+    }
+    return declaration;
   }
 
-  void forEach(void f(String name, Declaration builder)) {
+  void forEach(void f(String name, Builder builder)) {
     scope.forEach(f);
   }
 
   /// Don't use for scope lookup. Only use when an element is known to exist
   /// (and isn't a setter).
-  MemberBuilder operator [](String name) {
-    // TODO(ahe): Rename this to getLocalMember.
+  MemberBuilder getLocalMember(String name) {
     return scope.local[name] ??
         internalProblem(
             templateInternalProblemNotFoundIn.withArguments(
@@ -157,12 +384,1420 @@
   /// For example, this method is convenient for use when building synthetic
   /// members, such as those of an enum.
   MemberBuilder firstMemberNamed(String name) {
-    Declaration declaration = this[name];
+    Builder declaration = getLocalMember(name);
     while (declaration.next != null) {
       declaration = declaration.next;
     }
     return declaration;
   }
+
+  Class get cls;
+
+  Class get target => cls;
+
+  Class get actualCls;
+
+  @override
+  ClassBuilder get origin => actualOrigin ?? this;
+
+  /// [arguments] have already been built.
+  InterfaceType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    assert(arguments == null || cls.typeParameters.length == arguments.length);
+    return arguments == null ? cls.rawType : new InterfaceType(cls, arguments);
+  }
+
+  @override
+  int get typeVariablesCount => typeVariables?.length ?? 0;
+
+  List<DartType> buildTypeArguments(
+      LibraryBuilder library, List<TypeBuilder> arguments) {
+    if (arguments == null && typeVariables == null) {
+      return <DartType>[];
+    }
+
+    if (arguments == null && typeVariables != null) {
+      List<DartType> result =
+          new List<DartType>.filled(typeVariables.length, null, growable: true);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = typeVariables[i].defaultType.build(library);
+      }
+      if (library is SourceLibraryBuilder) {
+        library.inferredTypes.addAll(result);
+      }
+      return result;
+    }
+
+    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
+      // That should be caught and reported as a compile-time error earlier.
+      return unhandled(
+          templateTypeArgumentMismatch
+              .withArguments(typeVariables.length)
+              .message,
+          "buildTypeArguments",
+          -1,
+          null);
+    }
+
+    // arguments.length == typeVariables.length
+    List<DartType> result =
+        new List<DartType>.filled(arguments.length, null, growable: true);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
+    }
+    return result;
+  }
+
+  /// If [arguments] are null, the default types for the variables are used.
+  InterfaceType buildType(LibraryBuilder library, List<TypeBuilder> arguments) {
+    return buildTypesWithBuiltArguments(
+        library, buildTypeArguments(library, arguments));
+  }
+
+  Supertype buildSupertype(
+      LibraryBuilder library, List<TypeBuilder> arguments) {
+    Class cls = isPatch ? origin.target : this.cls;
+    return new Supertype(cls, buildTypeArguments(library, arguments));
+  }
+
+  Supertype buildMixedInType(
+      LibraryBuilder library, List<TypeBuilder> arguments) {
+    Class cls = isPatch ? origin.target : this.cls;
+    if (arguments != null) {
+      return new Supertype(cls, buildTypeArguments(library, arguments));
+    } else {
+      return new Supertype(
+          cls,
+          new List<DartType>.filled(
+              cls.typeParameters.length, const UnknownType(),
+              growable: true));
+    }
+  }
+
+  void checkSupertypes(CoreTypes coreTypes) {
+    // This method determines whether the class (that's being built) its super
+    // class appears both in 'extends' and 'implements' clauses and whether any
+    // interface appears multiple times in the 'implements' clause.
+    if (interfaces == null) return;
+
+    // Extract super class (if it exists).
+    ClassBuilder superClass;
+    TypeBuilder superClassType = supertype;
+    if (superClassType is NamedTypeBuilder) {
+      Builder decl = superClassType.declaration;
+      if (decl is ClassBuilder) {
+        superClass = decl;
+      }
+    }
+
+    // Validate interfaces.
+    Map<ClassBuilder, int> problems;
+    Map<ClassBuilder, int> problemsOffsets;
+    Set<ClassBuilder> implemented = new Set<ClassBuilder>();
+    for (TypeBuilder type in interfaces) {
+      if (type is NamedTypeBuilder) {
+        int charOffset = -1; // TODO(ahe): Get offset from type.
+        Builder decl = type.declaration;
+        if (decl is ClassBuilder) {
+          ClassBuilder interface = decl;
+          if (superClass == interface) {
+            addProblem(
+                templateImplementsSuperClass.withArguments(interface.name),
+                charOffset,
+                noLength);
+          } else if (implemented.contains(interface)) {
+            // Aggregate repetitions.
+            problems ??= new Map<ClassBuilder, int>();
+            problems[interface] ??= 0;
+            problems[interface] += 1;
+
+            problemsOffsets ??= new Map<ClassBuilder, int>();
+            problemsOffsets[interface] ??= charOffset;
+          } else if (interface.target == coreTypes.futureOrClass) {
+            addProblem(messageImplementsFutureOr, charOffset,
+                interface.target.name.length);
+          } else {
+            implemented.add(interface);
+          }
+        }
+      }
+    }
+    if (problems != null) {
+      problems.forEach((ClassBuilder interface, int repetitions) {
+        addProblem(
+            templateImplementsRepeated.withArguments(
+                interface.name, repetitions),
+            problemsOffsets[interface],
+            noLength);
+      });
+    }
+  }
+
+  void checkBoundsInSupertype(
+      Supertype supertype, TypeEnvironment typeEnvironment) {
+    SourceLibraryBuilder library = this.library;
+
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+        new InterfaceType(supertype.classNode, supertype.typeArguments),
+        typeEnvironment,
+        allowSuperBounded: false);
+    if (issues != null) {
+      for (TypeArgumentIssue issue in issues) {
+        Message message;
+        DartType argument = issue.argument;
+        TypeParameter typeParameter = issue.typeParameter;
+        bool inferred = library.inferredTypes.contains(argument);
+        if (argument is FunctionType && argument.typeParameters.length > 0) {
+          if (inferred) {
+            message = templateGenericFunctionTypeInferredAsActualTypeArgument
+                .withArguments(argument);
+          } else {
+            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+          }
+          typeParameter = null;
+        } else {
+          if (inferred) {
+            message =
+                templateIncorrectTypeArgumentInSupertypeInferred.withArguments(
+                    argument,
+                    typeParameter.bound,
+                    typeParameter.name,
+                    getGenericTypeName(issue.enclosingType),
+                    supertype.classNode.name,
+                    name);
+          } else {
+            message = templateIncorrectTypeArgumentInSupertype.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType),
+                supertype.classNode.name,
+                name);
+          }
+        }
+
+        library.reportTypeArgumentIssue(
+            message, fileUri, charOffset, typeParameter);
+      }
+    }
+  }
+
+  void checkBoundsInOutline(TypeEnvironment typeEnvironment) {
+    SourceLibraryBuilder library = this.library;
+
+    // Check in bounds of own type variables.
+    for (TypeParameter parameter in cls.typeParameters) {
+      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+          parameter.bound, typeEnvironment,
+          allowSuperBounded: true);
+      if (issues != null) {
+        for (TypeArgumentIssue issue in issues) {
+          DartType argument = issue.argument;
+          TypeParameter typeParameter = issue.typeParameter;
+          if (library.inferredTypes.contains(argument)) {
+            // Inference in type expressions in the supertypes boils down to
+            // instantiate-to-bound which shouldn't produce anything that breaks
+            // the bounds after the non-simplicity checks are done.  So, any
+            // violation here is the result of non-simple bounds, and the error
+            // is reported elsewhere.
+            continue;
+          }
+
+          Message message;
+          if (argument is FunctionType && argument.typeParameters.length > 0) {
+            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+            typeParameter = null;
+          } else {
+            message = templateIncorrectTypeArgument.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType));
+          }
+
+          library.reportTypeArgumentIssue(
+              message, fileUri, parameter.fileOffset, typeParameter);
+        }
+      }
+    }
+
+    // Check in supers.
+    if (cls.supertype != null) {
+      checkBoundsInSupertype(cls.supertype, typeEnvironment);
+    }
+    if (cls.mixedInType != null) {
+      checkBoundsInSupertype(cls.mixedInType, typeEnvironment);
+    }
+    if (cls.implementedTypes != null) {
+      for (Supertype supertype in cls.implementedTypes) {
+        checkBoundsInSupertype(supertype, typeEnvironment);
+      }
+    }
+
+    // Check in members.
+    for (Field field in cls.fields) {
+      library.checkBoundsInField(field, typeEnvironment);
+    }
+    for (Procedure procedure in cls.procedures) {
+      library.checkBoundsInFunctionNode(
+          procedure.function, typeEnvironment, fileUri);
+    }
+    for (Constructor constructor in cls.constructors) {
+      library.checkBoundsInFunctionNode(
+          constructor.function, typeEnvironment, fileUri);
+    }
+    for (RedirectingFactoryConstructor redirecting
+        in cls.redirectingFactoryConstructors) {
+      library.checkBoundsInFunctionNodeParts(
+          typeEnvironment, fileUri, redirecting.fileOffset,
+          typeParameters: redirecting.typeParameters,
+          positionalParameters: redirecting.positionalParameters,
+          namedParameters: redirecting.namedParameters);
+    }
+  }
+
+  void addRedirectingConstructor(
+      ProcedureBuilder constructor, SourceLibraryBuilder library) {
+    // Add a new synthetic field to this class for representing factory
+    // constructors. This is used to support resolving such constructors in
+    // source code.
+    //
+    // The synthetic field looks like this:
+    //
+    //     final _redirecting# = [c1, ..., cn];
+    //
+    // Where each c1 ... cn are an instance of [StaticGet] whose target is
+    // [constructor.target].
+    //
+    // TODO(ahe): Add a kernel node to represent redirecting factory bodies.
+    DillMemberBuilder constructorsField =
+        origin.scope.local.putIfAbsent("_redirecting#", () {
+      ListLiteral literal = new ListLiteral(<Expression>[]);
+      Name name = new Name("_redirecting#", library.library);
+      Field field = new Field(name,
+          isStatic: true, initializer: literal, fileUri: cls.fileUri)
+        ..fileOffset = cls.fileOffset;
+      cls.addMember(field);
+      return new DillMemberBuilder(field, this);
+    });
+    Field field = constructorsField.target;
+    ListLiteral literal = field.initializer;
+    literal.expressions
+        .add(new StaticGet(constructor.target)..parent = literal);
+  }
+
+  void handleSeenCovariant(
+      Types types,
+      Member declaredMember,
+      Member interfaceMember,
+      bool isSetter,
+      callback(Member declaredMember, 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 m = types.hierarchy.getInterfaceMemberKernel(
+          supertype.classNode, interfaceMember.name, isSetter);
+      if (m != null) {
+        callback(declaredMember, m, isSetter);
+      }
+    }
+  }
+
+  void checkOverride(
+      Types types,
+      Member declaredMember,
+      Member interfaceMember,
+      bool isSetter,
+      callback(Member declaredMember, Member interfaceMember, bool isSetter),
+      {bool isInterfaceCheck = false}) {
+    if (declaredMember == interfaceMember) {
+      return;
+    }
+    if (declaredMember is Constructor || interfaceMember is Constructor) {
+      unimplemented(
+          "Constructor in override check.", declaredMember.fileOffset, fileUri);
+    }
+    if (declaredMember is Procedure && interfaceMember is Procedure) {
+      if (declaredMember.kind == ProcedureKind.Method &&
+          interfaceMember.kind == ProcedureKind.Method) {
+        bool seenCovariant = checkMethodOverride(
+            types, declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              types, declaredMember, interfaceMember, isSetter, callback);
+        }
+      }
+      if (declaredMember.kind == ProcedureKind.Getter &&
+          interfaceMember.kind == ProcedureKind.Getter) {
+        checkGetterOverride(
+            types, declaredMember, interfaceMember, isInterfaceCheck);
+      }
+      if (declaredMember.kind == ProcedureKind.Setter &&
+          interfaceMember.kind == ProcedureKind.Setter) {
+        bool seenCovariant = checkSetterOverride(
+            types, declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              types, declaredMember, interfaceMember, isSetter, callback);
+        }
+      }
+    } else {
+      bool declaredMemberHasGetter = declaredMember is Field ||
+          declaredMember is Procedure && declaredMember.isGetter;
+      bool interfaceMemberHasGetter = interfaceMember is Field ||
+          interfaceMember is Procedure && interfaceMember.isGetter;
+      bool declaredMemberHasSetter = (declaredMember is Field &&
+              !declaredMember.isFinal &&
+              !declaredMember.isConst) ||
+          declaredMember is Procedure && declaredMember.isSetter;
+      bool interfaceMemberHasSetter = (interfaceMember is Field &&
+              !interfaceMember.isFinal &&
+              !interfaceMember.isConst) ||
+          interfaceMember is Procedure && interfaceMember.isSetter;
+      if (declaredMemberHasGetter && interfaceMemberHasGetter) {
+        checkGetterOverride(
+            types, declaredMember, interfaceMember, isInterfaceCheck);
+      }
+      if (declaredMemberHasSetter && interfaceMemberHasSetter) {
+        bool seenCovariant = checkSetterOverride(
+            types, declaredMember, interfaceMember, isInterfaceCheck);
+        if (seenCovariant) {
+          handleSeenCovariant(
+              types, declaredMember, interfaceMember, isSetter, callback);
+        }
+      }
+    }
+    // TODO(ahe): Handle other cases: accessors, operators, and fields.
+  }
+
+  void checkOverrides(
+      ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {}
+
+  void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy,
+      TypeEnvironment typeEnvironment) {}
+
+  bool hasUserDefinedNoSuchMethod(
+      Class klass, ClassHierarchy hierarchy, Class objectClass) {
+    Member noSuchMethod = hierarchy.getDispatchTarget(klass, noSuchMethodName);
+    return noSuchMethod != null && noSuchMethod.enclosingClass != objectClass;
+  }
+
+  void transformProcedureToNoSuchMethodForwarder(
+      Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
+    String prefix =
+        procedure.isGetter ? 'get:' : procedure.isSetter ? 'set:' : '';
+    Expression invocation = target.backendTarget.instantiateInvocation(
+        target.loader.coreTypes,
+        new ThisExpression(),
+        prefix + procedure.name.name,
+        new Arguments.forwarded(procedure.function),
+        procedure.fileOffset,
+        /*isSuper=*/ false);
+    Expression result = new MethodInvocation(new ThisExpression(),
+        noSuchMethodName, new Arguments([invocation]), noSuchMethodInterface)
+      ..fileOffset = procedure.fileOffset;
+    if (procedure.function.returnType is! VoidType) {
+      result = new AsExpression(result, procedure.function.returnType)
+        ..isTypeError = true
+        ..fileOffset = procedure.fileOffset;
+    }
+    procedure.function.body = new ReturnStatement(result)
+      ..fileOffset = procedure.fileOffset;
+    procedure.function.body.parent = procedure.function;
+
+    procedure.isAbstract = false;
+    procedure.isNoSuchMethodForwarder = true;
+    procedure.isForwardingStub = false;
+    procedure.isForwardingSemiStub = false;
+  }
+
+  void addNoSuchMethodForwarderForProcedure(Member noSuchMethod,
+      KernelTarget target, Procedure procedure, ClassHierarchy hierarchy) {
+    CloneWithoutBody cloner = new CloneWithoutBody(
+        typeSubstitution: type_algebra.getSubstitutionMap(
+            hierarchy.getClassAsInstanceOf(cls, procedure.enclosingClass)),
+        cloneAnnotations: false);
+    Procedure cloned = cloner.clone(procedure)..isExternal = false;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, cloned);
+    cls.procedures.add(cloned);
+    cloned.parent = cls;
+
+    SourceLibraryBuilder library = this.library;
+    library.forwardersOrigins.add(cloned);
+    library.forwardersOrigins.add(procedure);
+  }
+
+  void addNoSuchMethodForwarderGetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure getter = new Procedure(
+        field.name,
+        ProcedureKind.Getter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 0,
+            returnType: substitution.substituteType(field.type)),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, getter);
+    cls.procedures.add(getter);
+    getter.parent = cls;
+  }
+
+  void addNoSuchMethodForwarderSetterForField(Member noSuchMethod,
+      KernelTarget target, Field field, ClassHierarchy hierarchy) {
+    Substitution substitution = Substitution.fromSupertype(
+        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
+    Procedure setter = new Procedure(
+        field.name,
+        ProcedureKind.Setter,
+        new FunctionNode(null,
+            typeParameters: <TypeParameter>[],
+            positionalParameters: <VariableDeclaration>[
+              new VariableDeclaration("value",
+                  type: substitution.substituteType(field.type))
+            ],
+            namedParameters: <VariableDeclaration>[],
+            requiredParameterCount: 1,
+            returnType: const VoidType()),
+        fileUri: field.fileUri)
+      ..fileOffset = field.fileOffset;
+    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, setter);
+    cls.procedures.add(setter);
+    setter.parent = cls;
+  }
+
+  /// Adds noSuchMethod forwarding stubs to this class. Returns `true` if the
+  /// class was modified.
+  bool addNoSuchMethodForwarders(
+      KernelTarget target, ClassHierarchy hierarchy) {
+    if (cls.isAbstract) return false;
+
+    Set<Name> existingForwardersNames = new Set<Name>();
+    Set<Name> existingSetterForwardersNames = new Set<Name>();
+    Class leastConcreteSuperclass = cls.superclass;
+    while (
+        leastConcreteSuperclass != null && leastConcreteSuperclass.isAbstract) {
+      leastConcreteSuperclass = leastConcreteSuperclass.superclass;
+    }
+    if (leastConcreteSuperclass != null) {
+      bool superHasUserDefinedNoSuchMethod = hasUserDefinedNoSuchMethod(
+          leastConcreteSuperclass, hierarchy, target.objectClass);
+      List<Member> concrete =
+          hierarchy.getDispatchTargets(leastConcreteSuperclass);
+      for (Member member
+          in hierarchy.getInterfaceMembers(leastConcreteSuperclass)) {
+        if ((superHasUserDefinedNoSuchMethod ||
+                leastConcreteSuperclass.enclosingLibrary.compareTo(
+                            member.enclosingClass.enclosingLibrary) !=
+                        0 &&
+                    member.name.isPrivate) &&
+            ClassHierarchy.findMemberByName(concrete, member.name) == null) {
+          existingForwardersNames.add(member.name);
+        }
+      }
+
+      List<Member> concreteSetters =
+          hierarchy.getDispatchTargets(leastConcreteSuperclass, setters: true);
+      for (Member member in hierarchy
+          .getInterfaceMembers(leastConcreteSuperclass, setters: true)) {
+        if (ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
+            null) {
+          existingSetterForwardersNames.add(member.name);
+        }
+      }
+    }
+
+    Member noSuchMethod = ClassHierarchy.findMemberByName(
+        hierarchy.getInterfaceMembers(cls), noSuchMethodName);
+
+    List<Member> concrete = hierarchy.getDispatchTargets(cls);
+    List<Member> declared = hierarchy.getDeclaredMembers(cls);
+
+    bool clsHasUserDefinedNoSuchMethod =
+        hasUserDefinedNoSuchMethod(cls, hierarchy, target.objectClass);
+    bool changed = false;
+    for (Member member in hierarchy.getInterfaceMembers(cls)) {
+      // We generate a noSuchMethod forwarder for [member] in [cls] if the
+      // following three conditions are satisfied simultaneously:
+      // 1) There is a user-defined noSuchMethod in [cls] or [member] is private
+      //    and the enclosing library of [member] is different from that of
+      //    [cls].
+      // 2) There is no implementation of [member] in [cls].
+      // 3) The superclass of [cls] has no forwarder for [member].
+      if (member is Procedure &&
+          (clsHasUserDefinedNoSuchMethod ||
+              cls.enclosingLibrary
+                          .compareTo(member.enclosingClass.enclosingLibrary) !=
+                      0 &&
+                  member.name.isPrivate) &&
+          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
+          !existingForwardersNames.contains(member.name)) {
+        if (ClassHierarchy.findMemberByName(declared, member.name) != null) {
+          transformProcedureToNoSuchMethodForwarder(
+              noSuchMethod, target, member);
+        } else {
+          addNoSuchMethodForwarderForProcedure(
+              noSuchMethod, target, member, hierarchy);
+        }
+        existingForwardersNames.add(member.name);
+        changed = true;
+        continue;
+      }
+
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
+          !existingForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderGetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingForwardersNames.add(member.name);
+        changed = true;
+      }
+    }
+
+    List<Member> concreteSetters =
+        hierarchy.getDispatchTargets(cls, setters: true);
+    List<Member> declaredSetters =
+        hierarchy.getDeclaredMembers(cls, setters: true);
+    for (Member member in hierarchy.getInterfaceMembers(cls, setters: true)) {
+      if (member is Procedure &&
+          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
+              null &&
+          !existingSetterForwardersNames.contains(member.name)) {
+        if (ClassHierarchy.findMemberByName(declaredSetters, member.name) !=
+            null) {
+          transformProcedureToNoSuchMethodForwarder(
+              noSuchMethod, target, member);
+        } else {
+          addNoSuchMethodForwarderForProcedure(
+              noSuchMethod, target, member, hierarchy);
+        }
+        existingSetterForwardersNames.add(member.name);
+        changed = true;
+      }
+      if (member is Field &&
+          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
+              null &&
+          !existingSetterForwardersNames.contains(member.name)) {
+        addNoSuchMethodForwarderSetterForField(
+            noSuchMethod, target, member, hierarchy);
+        existingSetterForwardersNames.add(member.name);
+        changed = true;
+      }
+    }
+
+    return changed;
+  }
+
+  Uri _getMemberUri(Member member) {
+    if (member is Field) return member.fileUri;
+    if (member is Procedure) return member.fileUri;
+    // Other member types won't be seen because constructors don't participate
+    // in override relationships
+    return unhandled('${member.runtimeType}', '_getMemberUri', -1, null);
+  }
+
+  Substitution _computeInterfaceSubstitution(
+      Types types,
+      Member declaredMember,
+      Member interfaceMember,
+      FunctionNode declaredFunction,
+      FunctionNode interfaceFunction,
+      bool isInterfaceCheck) {
+    Substitution interfaceSubstitution = Substitution.empty;
+    if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
+      interfaceSubstitution = Substitution.fromInterfaceType(types.hierarchy
+          .getKernelTypeAsInstanceOf(
+              cls.thisType, interfaceMember.enclosingClass));
+    }
+    if (declaredFunction?.typeParameters?.length !=
+        interfaceFunction?.typeParameters?.length) {
+      library.addProblem(
+          templateOverrideTypeVariablesMismatch.withArguments(
+              "${declaredMember.enclosingClass.name}."
+                  "${declaredMember.name.name}",
+              "${interfaceMember.enclosingClass.name}."
+                  "${interfaceMember.name.name}"),
+          declaredMember.fileOffset,
+          noLength,
+          declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(_getMemberUri(interfaceMember),
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
+    } else if (!library.loader.target.backendTarget.legacyMode &&
+        declaredFunction?.typeParameters != null) {
+      Map<TypeParameter, DartType> substitutionMap =
+          <TypeParameter, DartType>{};
+      for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
+        substitutionMap[interfaceFunction.typeParameters[i]] =
+            new TypeParameterType(declaredFunction.typeParameters[i]);
+      }
+      Substitution substitution = Substitution.fromMap(substitutionMap);
+      for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
+        TypeParameter declaredParameter = declaredFunction.typeParameters[i];
+        TypeParameter interfaceParameter = interfaceFunction.typeParameters[i];
+        if (!interfaceParameter.isGenericCovariantImpl) {
+          DartType declaredBound = declaredParameter.bound;
+          DartType interfaceBound = interfaceParameter.bound;
+          if (interfaceSubstitution != null) {
+            declaredBound = interfaceSubstitution.substituteType(declaredBound);
+            interfaceBound =
+                interfaceSubstitution.substituteType(interfaceBound);
+          }
+          if (declaredBound != substitution.substituteType(interfaceBound)) {
+            library.addProblem(
+                templateOverrideTypeVariablesMismatch.withArguments(
+                    "${declaredMember.enclosingClass.name}."
+                        "${declaredMember.name.name}",
+                    "${interfaceMember.enclosingClass.name}."
+                        "${interfaceMember.name.name}"),
+                declaredMember.fileOffset,
+                noLength,
+                declaredMember.fileUri,
+                context: [
+                      templateOverriddenMethodCause
+                          .withArguments(interfaceMember.name.name)
+                          .withLocation(_getMemberUri(interfaceMember),
+                              interfaceMember.fileOffset, noLength)
+                    ] +
+                    inheritedContext(isInterfaceCheck, declaredMember));
+          }
+        }
+      }
+      interfaceSubstitution =
+          Substitution.combine(interfaceSubstitution, substitution);
+    }
+    return interfaceSubstitution;
+  }
+
+  Substitution _computeDeclaredSubstitution(
+      Types types, Member declaredMember) {
+    Substitution declaredSubstitution = Substitution.empty;
+    if (declaredMember.enclosingClass.typeParameters.isNotEmpty) {
+      declaredSubstitution = Substitution.fromInterfaceType(types.hierarchy
+          .getKernelTypeAsInstanceOf(
+              cls.thisType, declaredMember.enclosingClass));
+    }
+    return declaredSubstitution;
+  }
+
+  void _checkTypes(
+      Types types,
+      Substitution interfaceSubstitution,
+      Substitution declaredSubstitution,
+      Member declaredMember,
+      Member interfaceMember,
+      DartType declaredType,
+      DartType interfaceType,
+      bool isCovariant,
+      VariableDeclaration declaredParameter,
+      bool isInterfaceCheck,
+      {bool asIfDeclaredParameter = false}) {
+    if (library.loader.target.backendTarget.legacyMode) return;
+
+    if (interfaceSubstitution != null) {
+      interfaceType = interfaceSubstitution.substituteType(interfaceType);
+    }
+    if (declaredSubstitution != null) {
+      declaredType = declaredSubstitution.substituteType(declaredType);
+    }
+
+    bool inParameter = declaredParameter != null || asIfDeclaredParameter;
+    DartType subtype = inParameter ? interfaceType : declaredType;
+    DartType supertype = inParameter ? declaredType : interfaceType;
+
+    if (types.isSubtypeOfKernel(subtype, supertype)) {
+      // No problem--the proper subtyping relation is satisfied.
+    } else if (isCovariant && types.isSubtypeOfKernel(supertype, subtype)) {
+      // No problem--the overriding parameter is marked "covariant" and has
+      // a type which is a subtype of the parameter it overrides.
+    } else if (subtype is InvalidType || supertype is InvalidType) {
+      // Don't report a problem as something else is wrong that has already
+      // been reported.
+    } else {
+      // Report an error.
+      String declaredMemberName =
+          '${declaredMember.enclosingClass.name}.${declaredMember.name.name}';
+      String interfaceMemberName =
+          '${interfaceMember.enclosingClass.name}.${interfaceMember.name.name}';
+      Message message;
+      int fileOffset;
+      if (declaredParameter == null) {
+        message = templateOverrideTypeMismatchReturnType.withArguments(
+            declaredMemberName,
+            declaredType,
+            interfaceType,
+            interfaceMemberName);
+        fileOffset = declaredMember.fileOffset;
+      } else {
+        message = templateOverrideTypeMismatchParameter.withArguments(
+            declaredParameter.name,
+            declaredMemberName,
+            declaredType,
+            interfaceType,
+            interfaceMemberName);
+        fileOffset = declaredParameter.fileOffset;
+      }
+      library.addProblem(message, fileOffset, noLength, declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(_getMemberUri(interfaceMember),
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
+    }
+  }
+
+  /// Returns whether a covariant parameter was seen and more methods thus have
+  /// to be checked.
+  bool checkMethodOverride(Types types, Procedure declaredMember,
+      Procedure interfaceMember, bool isInterfaceCheck) {
+    assert(declaredMember.kind == ProcedureKind.Method);
+    assert(interfaceMember.kind == ProcedureKind.Method);
+    bool seenCovariant = false;
+    FunctionNode declaredFunction = declaredMember.function;
+    FunctionNode interfaceFunction = interfaceMember.function;
+
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        types,
+        declaredMember,
+        interfaceMember,
+        declaredFunction,
+        interfaceFunction,
+        isInterfaceCheck);
+
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(types, declaredMember);
+
+    _checkTypes(
+        types,
+        interfaceSubstitution,
+        declaredSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredFunction.returnType,
+        interfaceFunction.returnType,
+        false,
+        null,
+        isInterfaceCheck);
+    if (declaredFunction.positionalParameters.length <
+        interfaceFunction.positionalParameters.length) {
+      library.addProblem(
+          templateOverrideFewerPositionalArguments.withArguments(
+              "${declaredMember.enclosingClass.name}."
+                  "${declaredMember.name.name}",
+              "${interfaceMember.enclosingClass.name}."
+                  "${interfaceMember.name.name}"),
+          declaredMember.fileOffset,
+          noLength,
+          declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(interfaceMember.fileUri,
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
+    }
+    if (interfaceFunction.requiredParameterCount <
+        declaredFunction.requiredParameterCount) {
+      library.addProblem(
+          templateOverrideMoreRequiredArguments.withArguments(
+              "${declaredMember.enclosingClass.name}."
+                  "${declaredMember.name.name}",
+              "${interfaceMember.enclosingClass.name}."
+                  "${interfaceMember.name.name}"),
+          declaredMember.fileOffset,
+          noLength,
+          declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(interfaceMember.fileUri,
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
+    }
+    for (int i = 0;
+        i < declaredFunction.positionalParameters.length &&
+            i < interfaceFunction.positionalParameters.length;
+        i++) {
+      var declaredParameter = declaredFunction.positionalParameters[i];
+      var interfaceParameter = interfaceFunction.positionalParameters[i];
+      _checkTypes(
+          types,
+          interfaceSubstitution,
+          declaredSubstitution,
+          declaredMember,
+          interfaceMember,
+          declaredParameter.type,
+          interfaceFunction.positionalParameters[i].type,
+          declaredParameter.isCovariant || interfaceParameter.isCovariant,
+          declaredParameter,
+          isInterfaceCheck);
+      if (declaredParameter.isCovariant) seenCovariant = true;
+    }
+    if (declaredFunction.namedParameters.isEmpty &&
+        interfaceFunction.namedParameters.isEmpty) {
+      return seenCovariant;
+    }
+    if (declaredFunction.namedParameters.length <
+        interfaceFunction.namedParameters.length) {
+      library.addProblem(
+          templateOverrideFewerNamedArguments.withArguments(
+              "${declaredMember.enclosingClass.name}."
+                  "${declaredMember.name.name}",
+              "${interfaceMember.enclosingClass.name}."
+                  "${interfaceMember.name.name}"),
+          declaredMember.fileOffset,
+          noLength,
+          declaredMember.fileUri,
+          context: [
+                templateOverriddenMethodCause
+                    .withArguments(interfaceMember.name.name)
+                    .withLocation(interfaceMember.fileUri,
+                        interfaceMember.fileOffset, noLength)
+              ] +
+              inheritedContext(isInterfaceCheck, declaredMember));
+    }
+    int compareNamedParameters(VariableDeclaration p0, VariableDeclaration p1) {
+      return p0.name.compareTo(p1.name);
+    }
+
+    List<VariableDeclaration> sortedFromDeclared =
+        new List.from(declaredFunction.namedParameters)
+          ..sort(compareNamedParameters);
+    List<VariableDeclaration> sortedFromInterface =
+        new List.from(interfaceFunction.namedParameters)
+          ..sort(compareNamedParameters);
+    Iterator<VariableDeclaration> declaredNamedParameters =
+        sortedFromDeclared.iterator;
+    Iterator<VariableDeclaration> interfaceNamedParameters =
+        sortedFromInterface.iterator;
+    outer:
+    while (declaredNamedParameters.moveNext() &&
+        interfaceNamedParameters.moveNext()) {
+      while (declaredNamedParameters.current.name !=
+          interfaceNamedParameters.current.name) {
+        if (!declaredNamedParameters.moveNext()) {
+          library.addProblem(
+              templateOverrideMismatchNamedParameter.withArguments(
+                  "${declaredMember.enclosingClass.name}."
+                      "${declaredMember.name.name}",
+                  interfaceNamedParameters.current.name,
+                  "${interfaceMember.enclosingClass.name}."
+                      "${interfaceMember.name.name}"),
+              declaredMember.fileOffset,
+              noLength,
+              declaredMember.fileUri,
+              context: [
+                    templateOverriddenMethodCause
+                        .withArguments(interfaceMember.name.name)
+                        .withLocation(interfaceMember.fileUri,
+                            interfaceMember.fileOffset, noLength)
+                  ] +
+                  inheritedContext(isInterfaceCheck, declaredMember));
+          break outer;
+        }
+      }
+      var declaredParameter = declaredNamedParameters.current;
+      _checkTypes(
+          types,
+          interfaceSubstitution,
+          declaredSubstitution,
+          declaredMember,
+          interfaceMember,
+          declaredParameter.type,
+          interfaceNamedParameters.current.type,
+          declaredParameter.isCovariant,
+          declaredParameter,
+          isInterfaceCheck);
+      if (declaredParameter.isCovariant) seenCovariant = true;
+    }
+    return seenCovariant;
+  }
+
+  void checkGetterOverride(Types types, Member declaredMember,
+      Member interfaceMember, bool isInterfaceCheck) {
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(types, declaredMember);
+    var declaredType = declaredMember.getterType;
+    var interfaceType = interfaceMember.getterType;
+    _checkTypes(
+        types,
+        interfaceSubstitution,
+        declaredSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredType,
+        interfaceType,
+        false,
+        null,
+        isInterfaceCheck);
+  }
+
+  /// Returns whether a covariant parameter was seen and more methods thus have
+  /// to be checked.
+  bool checkSetterOverride(Types types, Member declaredMember,
+      Member interfaceMember, bool isInterfaceCheck) {
+    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
+        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
+    Substitution declaredSubstitution =
+        _computeDeclaredSubstitution(types, declaredMember);
+    var declaredType = declaredMember.setterType;
+    var interfaceType = interfaceMember.setterType;
+    var declaredParameter =
+        declaredMember.function?.positionalParameters?.elementAt(0);
+    bool isCovariant = declaredParameter?.isCovariant ?? false;
+    if (!isCovariant && declaredMember is Field) {
+      isCovariant = declaredMember.isCovariant;
+    }
+    if (!isCovariant && interfaceMember is Field) {
+      isCovariant = interfaceMember.isCovariant;
+    }
+    _checkTypes(
+        types,
+        interfaceSubstitution,
+        declaredSubstitution,
+        declaredMember,
+        interfaceMember,
+        declaredType,
+        interfaceType,
+        isCovariant,
+        declaredParameter,
+        isInterfaceCheck,
+        asIfDeclaredParameter: true);
+    return isCovariant;
+  }
+
+  // Extra context on override messages when the overriding member is inherited
+  List<LocatedMessage> inheritedContext(
+      bool isInterfaceCheck, Member declaredMember) {
+    if (declaredMember.enclosingClass == cls) {
+      // Ordinary override
+      return const [];
+    }
+    if (isInterfaceCheck) {
+      // Interface check
+      return [
+        templateInterfaceCheckContext
+            .withArguments(cls.name)
+            .withLocation(cls.fileUri, cls.fileOffset, cls.name.length)
+      ];
+    } else {
+      if (cls.isAnonymousMixin) {
+        // Implicit mixin application class
+        String baseName = cls.superclass.demangledName;
+        String mixinName = cls.mixedInClass.name;
+        int classNameLength = cls.nameAsMixinApplicationSubclass.length;
+        return [
+          templateImplicitMixinOverrideContext
+              .withArguments(mixinName, baseName)
+              .withLocation(cls.fileUri, cls.fileOffset, classNameLength)
+        ];
+      } else {
+        // Named mixin application class
+        return [
+          templateNamedMixinOverrideContext
+              .withArguments(cls.name)
+              .withLocation(cls.fileUri, cls.fileOffset, cls.name.length)
+        ];
+      }
+    }
+  }
+
+  String get fullNameForErrors {
+    return isMixinApplication && !isNamedMixinApplication
+        ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
+        : name;
+  }
+
+  void checkMixinDeclaration() {
+    assert(cls.isMixinDeclaration);
+    for (Builder constructor in constructors.local.values) {
+      if (!constructor.isSynthetic &&
+          (constructor.isFactory || constructor.isConstructor)) {
+        addProblem(
+            templateIllegalMixinDueToConstructors
+                .withArguments(fullNameForErrors),
+            charOffset,
+            noLength,
+            context: [
+              templateIllegalMixinDueToConstructorsCause
+                  .withArguments(fullNameForErrors)
+                  .withLocation(
+                      constructor.fileUri, constructor.charOffset, noLength)
+            ]);
+      }
+    }
+  }
+
+  void checkMixinApplication(ClassHierarchy hierarchy) {
+    // A mixin declaration can only be applied to a class that implements all
+    // the declaration's superclass constraints.
+    InterfaceType supertype = cls.supertype.asInterfaceType;
+    Substitution substitution = Substitution.fromSupertype(cls.mixedInType);
+    for (Supertype constraint in cls.mixedInClass.superclassConstraints()) {
+      InterfaceType interface =
+          substitution.substituteSupertype(constraint).asInterfaceType;
+      if (hierarchy.getTypeAsInstanceOf(supertype, interface.classNode) !=
+          interface) {
+        library.addProblem(
+            templateMixinApplicationIncompatibleSupertype.withArguments(
+                supertype, interface, cls.mixedInType.asInterfaceType),
+            cls.fileOffset,
+            noLength,
+            cls.fileUri);
+      }
+    }
+  }
+
+  @override
+  void applyPatch(Builder patch) {
+    if (patch is ClassBuilder) {
+      patch.actualOrigin = this;
+      // TODO(ahe): Complain if `patch.supertype` isn't null.
+      scope.local.forEach((String name, Builder member) {
+        Builder memberPatch = patch.scope.local[name];
+        if (memberPatch != null) {
+          member.applyPatch(memberPatch);
+        }
+      });
+      scope.setters.forEach((String name, Builder member) {
+        Builder memberPatch = patch.scope.setters[name];
+        if (memberPatch != null) {
+          member.applyPatch(memberPatch);
+        }
+      });
+      constructors.local.forEach((String name, Builder member) {
+        Builder memberPatch = patch.constructors.local[name];
+        if (memberPatch != null) {
+          member.applyPatch(memberPatch);
+        }
+      });
+
+      int originLength = typeVariables?.length ?? 0;
+      int patchLength = patch.typeVariables?.length ?? 0;
+      if (originLength != patchLength) {
+        patch.addProblem(messagePatchClassTypeVariablesMismatch,
+            patch.charOffset, noLength, context: [
+          messagePatchClassOrigin.withLocation(fileUri, charOffset, noLength)
+        ]);
+      } else if (typeVariables != null) {
+        int count = 0;
+        for (TypeVariableBuilder t in patch.typeVariables) {
+          typeVariables[count++].applyPatch(t);
+        }
+      }
+    } else {
+      library.addProblem(messagePatchDeclarationMismatch, patch.charOffset,
+          noLength, patch.fileUri, context: [
+        messagePatchDeclarationOrigin.withLocation(
+            fileUri, charOffset, noLength)
+      ]);
+    }
+  }
+
+  // Computes the function type of a given redirection target. Returns [null] if
+  // the type of the target could not be computed.
+  FunctionType computeRedirecteeType(
+      RedirectingFactoryBuilder factory, TypeEnvironment typeEnvironment) {
+    ConstructorReferenceBuilder redirectionTarget = factory.redirectionTarget;
+    FunctionNode target;
+    if (redirectionTarget.target == null) return null;
+    if (redirectionTarget.target is FunctionBuilder) {
+      FunctionBuilder targetBuilder = redirectionTarget.target;
+      target = targetBuilder.function;
+    } else if (redirectionTarget.target is DillMemberBuilder &&
+        (redirectionTarget.target.isConstructor ||
+            redirectionTarget.target.isFactory)) {
+      DillMemberBuilder targetBuilder = redirectionTarget.target;
+      // It seems that the [redirectionTarget.target] is an instance of
+      // [DillMemberBuilder] whenever the redirectee is an implicit constructor,
+      // e.g.
+      //
+      //   class A {
+      //     factory A() = B;
+      //   }
+      //   class B implements A {}
+      //
+      target = targetBuilder.member.function;
+    } else if (redirectionTarget.target is AmbiguousBuilder) {
+      // Multiple definitions with the same name: An error has already been
+      // issued.
+      // TODO(http://dartbug.com/35294): Unfortunate error; see also
+      // https://dart-review.googlesource.com/c/sdk/+/85390/.
+      return null;
+    } else {
+      unhandled("${redirectionTarget.target}", "computeRedirecteeType",
+          charOffset, fileUri);
+    }
+
+    List<DartType> typeArguments =
+        getRedirectingFactoryBody(factory.target).typeArguments;
+    FunctionType targetFunctionType = target.functionType;
+    if (typeArguments != null &&
+        targetFunctionType.typeParameters.length != typeArguments.length) {
+      addProblem(
+          templateTypeArgumentMismatch
+              .withArguments(targetFunctionType.typeParameters.length),
+          redirectionTarget.charOffset,
+          noLength);
+      return null;
+    }
+
+    // Compute the substitution of the target class type parameters if
+    // [redirectionTarget] has any type arguments.
+    Substitution substitution;
+    bool hasProblem = false;
+    if (typeArguments != null && typeArguments.length > 0) {
+      substitution = Substitution.fromPairs(
+          targetFunctionType.typeParameters, typeArguments);
+      for (int i = 0; i < targetFunctionType.typeParameters.length; i++) {
+        TypeParameter typeParameter = targetFunctionType.typeParameters[i];
+        DartType typeParameterBound =
+            substitution.substituteType(typeParameter.bound);
+        DartType typeArgument = typeArguments[i];
+        // Check whether the [typeArgument] respects the bounds of [typeParameter].
+        if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound)) {
+          addProblem(
+              templateRedirectingFactoryIncompatibleTypeArgument.withArguments(
+                  typeArgument, typeParameterBound),
+              redirectionTarget.charOffset,
+              noLength);
+          hasProblem = true;
+        }
+      }
+    } else if (typeArguments == null &&
+        targetFunctionType.typeParameters.length > 0) {
+      // TODO(hillerstrom): In this case, we need to perform type inference on
+      // the redirectee to obtain actual type arguments which would allow the
+      // following program to type check:
+      //
+      //    class A<T> {
+      //       factory A() = B;
+      //    }
+      //    class B<T> implements A<T> {
+      //       B();
+      //    }
+      //
+      return null;
+    }
+
+    // Substitute if necessary.
+    targetFunctionType = substitution == null
+        ? targetFunctionType
+        : (substitution.substituteType(targetFunctionType.withoutTypeParameters)
+            as FunctionType);
+
+    return hasProblem ? null : targetFunctionType;
+  }
+
+  String computeRedirecteeName(ConstructorReferenceBuilder redirectionTarget) {
+    String targetName = redirectionTarget.fullNameForErrors;
+    if (targetName == "") {
+      return redirectionTarget.target.parent.fullNameForErrors;
+    } else {
+      return targetName;
+    }
+  }
+
+  void checkRedirectingFactory(
+      RedirectingFactoryBuilder factory, TypeEnvironment typeEnvironment) {
+    // The factory type cannot contain any type parameters other than those of
+    // its enclosing class, because constructors cannot specify type parameters
+    // of their own.
+    FunctionType factoryType =
+        factory.procedure.function.functionType.withoutTypeParameters;
+    FunctionType redirecteeType =
+        computeRedirecteeType(factory, typeEnvironment);
+
+    // TODO(hillerstrom): It would be preferable to know whether a failure
+    // happened during [_computeRedirecteeType].
+    if (redirecteeType == null) return;
+
+    // Check whether [redirecteeType] <: [factoryType].
+    if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType)) {
+      addProblem(
+          templateIncompatibleRedirecteeFunctionType.withArguments(
+              redirecteeType, factoryType),
+          factory.redirectionTarget.charOffset,
+          noLength);
+    }
+  }
+
+  void checkRedirectingFactories(TypeEnvironment typeEnvironment) {
+    Map<String, MemberBuilder> constructors = this.constructors.local;
+    Iterable<String> names = constructors.keys;
+    for (String name in names) {
+      Builder constructor = constructors[name];
+      do {
+        if (constructor is RedirectingFactoryBuilder) {
+          checkRedirectingFactory(constructor, typeEnvironment);
+        }
+        constructor = constructor.next;
+      } while (constructor != null);
+    }
+  }
+
+  /// Returns a map which maps the type variables of [superclass] to their
+  /// respective values as defined by the superclass clause of this class (and
+  /// its superclasses).
+  ///
+  /// It's assumed that [superclass] is a superclass of this class.
+  ///
+  /// For example, given:
+  ///
+  ///     class Box<T> {}
+  ///     class BeatBox extends Box<Beat> {}
+  ///     class Beat {}
+  ///
+  /// We have:
+  ///
+  ///     [[BeatBox]].getSubstitutionMap([[Box]]) -> {[[Box::T]]: Beat]]}.
+  ///
+  /// It's an error if [superclass] isn't a superclass.
+  Map<TypeParameter, DartType> getSubstitutionMap(Class superclass) {
+    Supertype supertype = target.supertype;
+    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
+    List<DartType> arguments;
+    List<TypeParameter> variables;
+    Class classNode;
+
+    while (classNode != superclass) {
+      classNode = supertype.classNode;
+      arguments = supertype.typeArguments;
+      variables = classNode.typeParameters;
+      supertype = classNode.supertype;
+      if (variables.isNotEmpty) {
+        Map<TypeParameter, DartType> directSubstitutionMap =
+            <TypeParameter, DartType>{};
+        for (int i = 0; i < variables.length; i++) {
+          DartType argument =
+              i < arguments.length ? arguments[i] : const DynamicType();
+          if (substitutionMap != null) {
+            // TODO(ahe): Investigate if requiring the caller to use
+            // `substituteDeep` from `package:kernel/type_algebra.dart` instead
+            // of `substitute` is faster. If so, we can simply this code.
+            argument = substitute(argument, substitutionMap);
+          }
+          directSubstitutionMap[variables[i]] = argument;
+        }
+        substitutionMap = directSubstitutionMap;
+      }
+    }
+
+    return substitutionMap;
+  }
+
+  /// Looks up the member by [name] on the class built by this class builder.
+  ///
+  /// If [isSetter] is `false`, only fields, methods, and getters with that name
+  /// will be found.  If [isSetter] is `true`, only non-final fields and setters
+  /// will be found.
+  ///
+  /// If [isSuper] is `false`, the member is found among the interface members
+  /// the class built by this class builder. If [isSuper] is `true`, the member
+  /// is found among the class members of the superclass.
+  ///
+  /// If this class builder is a patch, interface members declared in this
+  /// patch are searched before searching the interface members in the origin
+  /// class.
+  Member lookupInstanceMember(ClassHierarchy hierarchy, Name name,
+      {bool isSetter: false, bool isSuper: false}) {
+    Class instanceClass = cls;
+    if (isPatch) {
+      assert(identical(instanceClass, origin.cls),
+          "Found ${origin.cls} expected $instanceClass");
+      if (isSuper) {
+        // The super class is only correctly found through the origin class.
+        instanceClass = origin.cls;
+      } else {
+        Member member =
+            hierarchy.getInterfaceMember(instanceClass, name, setter: isSetter);
+        if (member?.parent == instanceClass) {
+          // Only if the member is found in the patch can we use it.
+          return member;
+        } else {
+          // Otherwise, we need to keep searching in the origin class.
+          instanceClass = origin.cls;
+        }
+      }
+    }
+
+    if (isSuper) {
+      instanceClass = instanceClass.superclass;
+      if (instanceClass == null) return null;
+    }
+    Member target = isSuper
+        ? hierarchy.getDispatchTarget(instanceClass, name, setter: isSetter)
+        : hierarchy.getInterfaceMember(instanceClass, name, setter: isSetter);
+    if (isSuper && target == null) {
+      if (cls.isMixinDeclaration ||
+          (library.loader.target.backendTarget.enableSuperMixins &&
+              this.isAbstract)) {
+        target =
+            hierarchy.getInterfaceMember(instanceClass, name, setter: isSetter);
+      }
+    }
+    return target;
+  }
+
+  /// Looks up the constructor by [name] on the the class built by this class
+  /// builder.
+  ///
+  /// If [isSuper] is `true`, constructors in the superclass are searched.
+  Constructor lookupConstructor(Name name, {bool isSuper: false}) {
+    Class instanceClass = cls;
+    if (isSuper) {
+      instanceClass = instanceClass.superclass;
+    }
+    if (instanceClass != null) {
+      for (Constructor constructor in instanceClass.constructors) {
+        if (constructor.name == name) return constructor;
+      }
+    }
+
+    /// Performs a similar lookup to [lookupConstructor], but using a slower
+    /// implementation.
+    Constructor lookupConstructorWithPatches(Name name, bool isSuper) {
+      ClassBuilder builder = this.origin;
+
+      ClassBuilder getSuperclass(ClassBuilder builder) {
+        // This way of computing the superclass is slower than using the kernel
+        // objects directly.
+        Object supertype = builder.supertype;
+        if (supertype is NamedTypeBuilder) {
+          Object builder = supertype.declaration;
+          if (builder is ClassBuilder) return builder;
+        }
+        return null;
+      }
+
+      if (isSuper) {
+        builder = getSuperclass(builder)?.origin;
+      }
+      if (builder != null) {
+        Class target = builder.target;
+        for (Constructor constructor in target.constructors) {
+          if (constructor.name == name) return constructor;
+        }
+      }
+      return null;
+    }
+
+    return lookupConstructorWithPatches(name, isSuper);
+  }
 }
 
 class ConstructorRedirection {
diff --git a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
index d3f8d63..6dac852 100644
--- a/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/constructor_reference_builder.dart
@@ -9,7 +9,7 @@
 import 'builder.dart'
     show
         ClassBuilder,
-        Declaration,
+        Builder,
         LibraryBuilder,
         PrefixBuilder,
         QualifiedName,
@@ -29,10 +29,10 @@
   /// This is the name of a named constructor. As `bar` in `new Foo<T>.bar()`.
   final String suffix;
 
-  Declaration target;
+  Builder target;
 
   ConstructorReferenceBuilder(this.name, this.typeArguments, this.suffix,
-      Declaration parent, this.charOffset)
+      Builder parent, this.charOffset)
       : fileUri = parent.fileUri;
 
   String get fullNameForErrors {
@@ -42,7 +42,7 @@
 
   void resolveIn(Scope scope, LibraryBuilder accessingLibrary) {
     final name = this.name;
-    Declaration declaration;
+    Builder declaration;
     if (name is QualifiedName) {
       String prefix = name.qualifier;
       String middle = name.name;
diff --git a/pkg/front_end/lib/src/fasta/builder/declaration.dart b/pkg/front_end/lib/src/fasta/builder/declaration.dart
index 4b3d601..38db8e2 100644
--- a/pkg/front_end/lib/src/fasta/builder/declaration.dart
+++ b/pkg/front_end/lib/src/fasta/builder/declaration.dart
@@ -6,15 +6,15 @@
 
 import '../problems.dart' show unsupported;
 
-abstract class Declaration {
+abstract class Builder {
   /// Used when multiple things with the same name are declared within the same
   /// parent. Only used for top-level and class-member declarations, not for
   /// block scopes.
-  Declaration next;
+  Builder next;
 
-  Declaration();
+  Builder();
 
-  Declaration get parent;
+  Builder get parent;
 
   Uri get fileUri;
 
@@ -22,7 +22,7 @@
 
   get target => unsupported("${runtimeType}.target", charOffset, fileUri);
 
-  Declaration get origin => this;
+  Builder get origin => this;
 
   String get fullNameForErrors;
 
@@ -69,7 +69,7 @@
   }
 
   /// Applies [patch] to this declaration.
-  void applyPatch(Declaration patch) {
+  void applyPatch(Builder patch) {
     unsupported("${runtimeType}.applyPatch", charOffset, fileUri);
   }
 
@@ -82,5 +82,5 @@
 
   /// Resolve constructors (lookup names in scope) recorded in this builder and
   /// return the number of constructors resolved.
-  int resolveConstructors(covariant Declaration parent) => 0;
+  int resolveConstructors(covariant Builder parent) => 0;
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
index abed113..b2c03c3 100644
--- a/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/dynamic_type_builder.dart
@@ -4,11 +4,13 @@
 
 library fasta.dynamic_type_builder;
 
-import 'builder.dart' show LibraryBuilder, TypeBuilder, BuiltinTypeBuilder;
+import 'package:kernel/ast.dart' show DartType;
 
-class DynamicTypeBuilder<T extends TypeBuilder, R>
-    extends BuiltinTypeBuilder<T, R> {
-  DynamicTypeBuilder(R type, LibraryBuilder compilationUnit, int charOffset)
+import 'builder.dart' show LibraryBuilder, BuiltinTypeBuilder;
+
+class DynamicTypeBuilder extends BuiltinTypeBuilder {
+  DynamicTypeBuilder(
+      DartType type, LibraryBuilder compilationUnit, int charOffset)
       : super("dynamic", type, compilationUnit, charOffset);
 
   String get debugName => "DynamicTypeBuilder";
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 33f875f..093e2f0 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -4,11 +4,350 @@
 
 library fasta.enum_builder;
 
-import 'builder.dart' show ClassBuilder, MetadataBuilder, TypeBuilder;
+import 'builder.dart' show ClassBuilder, MetadataBuilder;
 
-abstract class EnumBuilder<T extends TypeBuilder, R>
-    implements ClassBuilder<T, R> {
-  List<EnumConstantInfo> get enumConstantInfos;
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        Class,
+        Constructor,
+        ConstructorInvocation,
+        DirectPropertyGet,
+        Expression,
+        Field,
+        FieldInitializer,
+        IntLiteral,
+        InterfaceType,
+        ListLiteral,
+        ProcedureKind,
+        ReturnStatement,
+        StaticGet,
+        StringLiteral,
+        SuperInitializer,
+        ThisExpression,
+        VariableGet;
+
+import '../fasta_codes.dart'
+    show
+        LocatedMessage,
+        messageNoUnnamedConstructorInObject,
+        templateDuplicatedDeclaration,
+        templateDuplicatedDeclarationCause,
+        templateDuplicatedDeclarationSyntheticCause,
+        templateEnumConstantSameNameAsEnclosing;
+
+import '../modifier.dart'
+    show
+        constMask,
+        finalMask,
+        hasInitializerMask,
+        initializingFormalMask,
+        staticMask;
+
+import '../source/source_class_builder.dart' show SourceClassBuilder;
+
+import '../kernel/kernel_builder.dart'
+    show
+        Builder,
+        FormalParameterBuilder,
+        ClassBuilder,
+        ConstructorBuilder,
+        FieldBuilder,
+        NamedTypeBuilder,
+        ProcedureBuilder,
+        TypeBuilder,
+        LibraryBuilder,
+        MemberBuilder,
+        MetadataBuilder,
+        Scope;
+
+import '../kernel/metadata_collector.dart';
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+class EnumBuilder extends SourceClassBuilder {
+  final List<EnumConstantInfo> enumConstantInfos;
+
+  final NamedTypeBuilder intType;
+
+  final NamedTypeBuilder stringType;
+
+  final NamedTypeBuilder objectType;
+
+  final NamedTypeBuilder listType;
+
+  EnumBuilder.internal(
+      List<MetadataBuilder> metadata,
+      String name,
+      Scope scope,
+      Scope constructors,
+      Class cls,
+      this.enumConstantInfos,
+      this.intType,
+      this.listType,
+      this.objectType,
+      this.stringType,
+      LibraryBuilder parent,
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset)
+      : super(metadata, 0, name, null, null, null, null, scope, constructors,
+            parent, null, startCharOffset, charOffset, charEndOffset,
+            cls: cls);
+
+  factory EnumBuilder(
+      MetadataCollector metadataCollector,
+      List<MetadataBuilder> metadata,
+      String name,
+      List<EnumConstantInfo> enumConstantInfos,
+      SourceLibraryBuilder parent,
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset) {
+    assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
+    // TODO(ahe): These types shouldn't be looked up in scope, they come
+    // directly from dart:core.
+    TypeBuilder intType = new NamedTypeBuilder("int", null);
+    TypeBuilder stringType = new NamedTypeBuilder("String", null);
+    NamedTypeBuilder objectType = new NamedTypeBuilder("Object", null);
+    Class cls = new Class(name: name);
+    Map<String, MemberBuilder> members = <String, MemberBuilder>{};
+    Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
+    NamedTypeBuilder selfType = new NamedTypeBuilder(name, null);
+    TypeBuilder listType =
+        new NamedTypeBuilder("List", <TypeBuilder>[selfType]);
+
+    /// metadata class E {
+    ///   final int index;
+    ///   final String _name;
+    ///   const E(this.index, this._name);
+    ///   static const E id0 = const E(0, 'E.id0');
+    ///   ...
+    ///   static const E idn-1 = const E(n - 1, 'E.idn-1');
+    ///   static const List<E> values = const <E>[id0, ..., idn-1];
+    ///   String toString() => _name;
+    /// }
+
+    members["index"] = new FieldBuilder(null, intType, "index",
+        finalMask | hasInitializerMask, parent, charOffset, charOffset);
+    members["_name"] = new FieldBuilder(null, stringType, "_name",
+        finalMask | hasInitializerMask, parent, charOffset, charOffset);
+    ConstructorBuilder constructorBuilder = new ConstructorBuilder(
+        null,
+        constMask,
+        null,
+        "",
+        null,
+        <FormalParameterBuilder>[
+          new FormalParameterBuilder(null, initializingFormalMask, intType,
+              "index", parent, charOffset),
+          new FormalParameterBuilder(null, initializingFormalMask, stringType,
+              "_name", parent, charOffset)
+        ],
+        parent,
+        charOffset,
+        charOffset,
+        charOffset,
+        charEndOffset);
+    constructors[""] = constructorBuilder;
+    FieldBuilder valuesBuilder = new FieldBuilder(
+        null,
+        listType,
+        "values",
+        constMask | staticMask | hasInitializerMask,
+        parent,
+        charOffset,
+        charOffset);
+    members["values"] = valuesBuilder;
+    ProcedureBuilder toStringBuilder = new ProcedureBuilder(
+        null,
+        0,
+        stringType,
+        "toString",
+        null,
+        null,
+        ProcedureKind.Method,
+        parent,
+        charOffset,
+        charOffset,
+        charOffset,
+        charEndOffset);
+    members["toString"] = toStringBuilder;
+    String className = name;
+    if (enumConstantInfos != null) {
+      for (int i = 0; i < enumConstantInfos.length; i++) {
+        EnumConstantInfo enumConstantInfo = enumConstantInfos[i];
+        List<MetadataBuilder> metadata = enumConstantInfo.metadata;
+        String name = enumConstantInfo.name;
+        String documentationComment = enumConstantInfo.documentationComment;
+        MemberBuilder existing = members[name];
+        if (existing != null) {
+          // The existing declaration is synthetic if it has the same
+          // charOffset as the enclosing enum.
+          bool isSynthetic = existing.charOffset == charOffset;
+          List<LocatedMessage> context = isSynthetic
+              ? <LocatedMessage>[
+                  templateDuplicatedDeclarationSyntheticCause
+                      .withArguments(name)
+                      .withLocation(
+                          parent.fileUri, charOffset, className.length)
+                ]
+              : <LocatedMessage>[
+                  templateDuplicatedDeclarationCause
+                      .withArguments(name)
+                      .withLocation(
+                          parent.fileUri, existing.charOffset, name.length)
+                ];
+          parent.addProblem(templateDuplicatedDeclaration.withArguments(name),
+              enumConstantInfo.charOffset, name.length, parent.fileUri,
+              context: context);
+          enumConstantInfos[i] = null;
+        } else if (name == className) {
+          parent.addProblem(
+              templateEnumConstantSameNameAsEnclosing.withArguments(name),
+              enumConstantInfo.charOffset,
+              name.length,
+              parent.fileUri);
+        }
+        FieldBuilder fieldBuilder = new FieldBuilder(
+            metadata,
+            selfType,
+            name,
+            constMask | staticMask | hasInitializerMask,
+            parent,
+            enumConstantInfo.charOffset,
+            enumConstantInfo.charOffset);
+        metadataCollector?.setDocumentationComment(
+            fieldBuilder.target, documentationComment);
+        members[name] = fieldBuilder..next = existing;
+      }
+    }
+    final int startCharOffsetComputed =
+        metadata == null ? startCharOffset : metadata.first.charOffset;
+    EnumBuilder enumBuilder = new EnumBuilder.internal(
+        metadata,
+        name,
+        new Scope(members, null, parent.scope, "enum $name",
+            isModifiable: false),
+        new Scope(constructors, null, null, name, isModifiable: false),
+        cls,
+        enumConstantInfos,
+        intType,
+        listType,
+        objectType,
+        stringType,
+        parent,
+        startCharOffsetComputed,
+        charOffset,
+        charEndOffset);
+    void setParent(String name, MemberBuilder builder) {
+      do {
+        builder.parent = enumBuilder;
+        builder = builder.next;
+      } while (builder != null);
+    }
+
+    members.forEach(setParent);
+    constructors.forEach(setParent);
+    selfType.bind(enumBuilder);
+    return enumBuilder;
+  }
+
+  TypeBuilder get mixedInType => null;
+
+  InterfaceType buildType(LibraryBuilder library, List<TypeBuilder> arguments) {
+    return cls.rawType;
+  }
+
+  @override
+  Class build(SourceLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
+    cls.isEnum = true;
+    intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    stringType.resolveIn(
+        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    objectType.resolveIn(
+        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+    listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
+
+    FieldBuilder indexFieldBuilder = firstMemberNamed("index");
+    Field indexField = indexFieldBuilder.build(libraryBuilder);
+    FieldBuilder nameFieldBuilder = firstMemberNamed("_name");
+    Field nameField = nameFieldBuilder.build(libraryBuilder);
+    ProcedureBuilder toStringBuilder = firstMemberNamed("toString");
+    toStringBuilder.body = new ReturnStatement(
+        new DirectPropertyGet(new ThisExpression(), nameField));
+    List<Expression> values = <Expression>[];
+    if (enumConstantInfos != null) {
+      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
+        if (enumConstantInfo != null) {
+          Builder declaration = firstMemberNamed(enumConstantInfo.name);
+          if (declaration.isField) {
+            FieldBuilder field = declaration;
+            values.add(new StaticGet(field.build(libraryBuilder)));
+          }
+        }
+      }
+    }
+    FieldBuilder valuesBuilder = firstMemberNamed("values");
+    valuesBuilder.build(libraryBuilder);
+    valuesBuilder.initializer =
+        new ListLiteral(values, typeArgument: cls.rawType, isConst: true);
+    ConstructorBuilder constructorBuilder = constructorScopeBuilder[""];
+    Constructor constructor = constructorBuilder.build(libraryBuilder);
+    constructor.initializers.insert(
+        0,
+        new FieldInitializer(indexField,
+            new VariableGet(constructor.function.positionalParameters[0]))
+          ..parent = constructor);
+    constructor.initializers.insert(
+        1,
+        new FieldInitializer(nameField,
+            new VariableGet(constructor.function.positionalParameters[1]))
+          ..parent = constructor);
+    ClassBuilder objectClass = objectType.declaration;
+    MemberBuilder superConstructor = objectClass.findConstructorOrFactory(
+        "", charOffset, fileUri, libraryBuilder);
+    if (superConstructor == null || !superConstructor.isConstructor) {
+      // TODO(ahe): Ideally, we would also want to check that [Object]'s
+      // unnamed constructor requires no arguments. But that information isn't
+      // always available at this point, and it's not really a situation that
+      // can happen unless you start modifying the SDK sources.
+      library.addProblem(messageNoUnnamedConstructorInObject,
+          objectClass.charOffset, objectClass.name.length, objectClass.fileUri);
+    } else {
+      constructor.initializers.add(
+          new SuperInitializer(superConstructor.target, new Arguments.empty())
+            ..parent = constructor);
+    }
+    int index = 0;
+    if (enumConstantInfos != null) {
+      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
+        if (enumConstantInfo != null) {
+          String constant = enumConstantInfo.name;
+          Builder declaration = firstMemberNamed(constant);
+          FieldBuilder field;
+          if (declaration.isField) {
+            field = declaration;
+          } else {
+            continue;
+          }
+          Arguments arguments = new Arguments(<Expression>[
+            new IntLiteral(index++),
+            new StringLiteral("$name.$constant")
+          ]);
+          field.initializer =
+              new ConstructorInvocation(constructor, arguments, isConst: true);
+        }
+      }
+    }
+    return super.build(libraryBuilder, coreLibrary);
+  }
+
+  @override
+  Builder findConstructorOrFactory(
+      String name, int charOffset, Uri uri, LibraryBuilder library) {
+    return null;
+  }
 }
 
 class EnumConstantInfo {
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 fed33cf..364614d 100644
--- a/pkg/front_end/lib/src/fasta/builder/field_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/field_builder.dart
@@ -4,26 +4,230 @@
 
 library fasta.field_builder;
 
+import 'package:kernel/ast.dart' show DartType, Expression;
+
 import 'builder.dart' show LibraryBuilder, MemberBuilder;
 
-import 'package:kernel/ast.dart' show DartType;
+import 'package:kernel/ast.dart'
+    show Class, DartType, Expression, Field, InvalidType, Name, NullLiteral;
 
-abstract class FieldBuilder<T> extends MemberBuilder {
+import '../constant_context.dart' show ConstantContext;
+
+import '../fasta_codes.dart'
+    show
+        messageInternalProblemAlreadyInitialized,
+        templateCantInferTypeDueToCircularity;
+
+import '../kernel/body_builder.dart' show BodyBuilder;
+
+import '../kernel/kernel_builder.dart'
+    show
+        ClassBuilder,
+        Builder,
+        ImplicitFieldType,
+        TypeBuilder,
+        LibraryBuilder,
+        MetadataBuilder;
+
+import '../problems.dart' show internalProblem;
+
+import '../scanner.dart' show Token;
+
+import '../scope.dart' show Scope;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../source/source_loader.dart' show SourceLoader;
+
+import '../type_inference/type_inference_engine.dart'
+    show IncludesTypeParametersNonCovariantly, Variance;
+
+import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
+
+import '../type_inference/type_schema.dart' show UnknownType;
+
+class FieldBuilder extends MemberBuilder {
   final String name;
 
   final int modifiers;
 
-  FieldBuilder(
-      this.name, this.modifiers, LibraryBuilder compilationUnit, int charOffset)
-      : super(compilationUnit, charOffset);
+  final Field field;
+  final List<MetadataBuilder> metadata;
+  final TypeBuilder type;
+  Token constInitializerToken;
+
+  bool hadTypesInferred = false;
+
+  FieldBuilder(this.metadata, this.type, this.name, this.modifiers,
+      Builder compilationUnit, int charOffset, int charEndOffset)
+      : field = new Field(null, fileUri: compilationUnit?.fileUri)
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset,
+        super(compilationUnit, charOffset);
 
   String get debugName => "FieldBuilder";
 
-  DartType get builtType;
-
-  void set initializer(T value);
-
-  bool get hasInitializer;
-
   bool get isField => true;
+
+  void set initializer(Expression value) {
+    if (!hasInitializer && value is! NullLiteral && !isConst && !isFinal) {
+      internalProblem(
+          messageInternalProblemAlreadyInitialized, charOffset, fileUri);
+    }
+    field.initializer = value..parent = field;
+  }
+
+  bool get isEligibleForInference {
+    return !library.legacyMode &&
+        type == null &&
+        (hasInitializer || isInstanceMember);
+  }
+
+  Field build(SourceLibraryBuilder library) {
+    field.name ??= new Name(name, library.target);
+    if (type != null) {
+      field.type = type.build(library);
+
+      if (!isFinal && !isConst) {
+        IncludesTypeParametersNonCovariantly needsCheckVisitor;
+        if (parent is ClassBuilder) {
+          Class enclosingClass = parent.target;
+          if (enclosingClass.typeParameters.isNotEmpty) {
+            needsCheckVisitor = new IncludesTypeParametersNonCovariantly(
+                enclosingClass.typeParameters,
+                // We are checking the field type as if it is the type of the
+                // parameter of the implicit setter and this is a contravariant
+                // position.
+                initialVariance: Variance.contravariant);
+          }
+        }
+        if (needsCheckVisitor != null) {
+          if (field.type.accept(needsCheckVisitor)) {
+            field.isGenericCovariantImpl = true;
+          }
+        }
+      }
+    }
+    bool isInstanceMember = !isStatic && !isTopLevel;
+    field
+      ..isCovariant = isCovariant
+      ..isFinal = isFinal
+      ..isConst = isConst
+      ..hasImplicitGetter = isInstanceMember
+      ..hasImplicitSetter = isInstanceMember && !isConst && !isFinal
+      ..isStatic = !isInstanceMember;
+    return field;
+  }
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library) {
+    ClassBuilder classBuilder = isClassMember ? parent : null;
+    MetadataBuilder.buildAnnotations(
+        field, metadata, library, classBuilder, this);
+
+    // For modular compilation we need to include initializers of all const
+    // fields and all non-static final fields in classes with const constructors
+    // into the outline.
+    if ((isConst ||
+            (isFinal &&
+                !isStatic &&
+                isClassMember &&
+                classBuilder.hasConstConstructor)) &&
+        constInitializerToken != null) {
+      Scope scope = classBuilder?.scope ?? library.scope;
+      BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
+          library, classBuilder, this, scope, fileUri);
+      bodyBuilder.constantContext =
+          isConst ? ConstantContext.inferred : ConstantContext.none;
+      initializer = bodyBuilder.parseFieldInitializer(constInitializerToken)
+        ..parent = field;
+      bodyBuilder.typeInferrer
+          ?.inferFieldInitializer(bodyBuilder, field.type, field.initializer);
+      if (library.loader is SourceLoader) {
+        SourceLoader loader = library.loader;
+        loader.transformPostInference(field, bodyBuilder.transformSetLiterals,
+            bodyBuilder.transformCollections);
+      }
+      bodyBuilder.resolveRedirectingFactoryTargets();
+    }
+    constInitializerToken = null;
+  }
+
+  Field get target => field;
+
+  @override
+  void inferType() {
+    SourceLibraryBuilder library = this.library;
+    if (field.type is! ImplicitFieldType) {
+      // We have already inferred a type.
+      return;
+    }
+    ImplicitFieldType type = field.type;
+    if (type.member != this) {
+      // The implicit type was inherited.
+      FieldBuilder other = type.member;
+      other.inferCopiedType(field);
+      return;
+    }
+    if (type.isStarted) {
+      library.addProblem(
+          templateCantInferTypeDueToCircularity.withArguments(name),
+          charOffset,
+          name.length,
+          fileUri);
+      field.type = const InvalidType();
+      return;
+    }
+    type.isStarted = true;
+    TypeInferrerImpl typeInferrer = library.loader.typeInferenceEngine
+        .createTopLevelTypeInferrer(
+            fileUri, field.enclosingClass?.thisType, null);
+    BodyBuilder bodyBuilder = new BodyBuilder.forField(this, typeInferrer);
+    bodyBuilder.constantContext =
+        isConst ? ConstantContext.inferred : ConstantContext.none;
+    initializer = bodyBuilder.parseFieldInitializer(type.initializerToken);
+    type.initializerToken = null;
+
+    DartType inferredType = typeInferrer.inferDeclarationType(typeInferrer
+        .inferExpression(field.initializer, const UnknownType(), true,
+            isVoidAllowed: true));
+
+    if (field.type is ImplicitFieldType) {
+      // `field.type` may have changed if a circularity was detected when
+      // [inferredType] was computed.
+      field.type = inferredType;
+
+      IncludesTypeParametersNonCovariantly needsCheckVisitor;
+      if (parent is ClassBuilder) {
+        Class enclosingClass = parent.target;
+        if (enclosingClass.typeParameters.isNotEmpty) {
+          needsCheckVisitor = new IncludesTypeParametersNonCovariantly(
+              enclosingClass.typeParameters,
+              // We are checking the field type as if it is the type of the
+              // parameter of the implicit setter and this is a contravariant
+              // position.
+              initialVariance: Variance.contravariant);
+        }
+      }
+      if (needsCheckVisitor != null) {
+        if (field.type.accept(needsCheckVisitor)) {
+          field.isGenericCovariantImpl = true;
+        }
+      }
+    }
+
+    // The following is a hack. The outline should contain the compiled
+    // initializers, however, as top-level inference is subtly different from
+    // we need to compile the field initializer again when everything else is
+    // compiled.
+    field.initializer = null;
+  }
+
+  void inferCopiedType(Field other) {
+    inferType();
+    other.type = field.type;
+    other.initializer = null;
+  }
+
+  DartType get builtType => field.type;
 }
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 587a7df..177280d 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
@@ -15,18 +15,59 @@
 import 'builder.dart'
     show LibraryBuilder, MetadataBuilder, ModifierBuilder, TypeBuilder;
 
-abstract class FormalParameterBuilder<T extends TypeBuilder>
-    extends ModifierBuilder {
+import 'package:kernel/ast.dart' show VariableDeclaration;
+
+import '../constant_context.dart' show ConstantContext;
+
+import '../modifier.dart' show finalMask, initializingFormalMask;
+
+import '../scanner.dart' show Token;
+
+import '../scope.dart' show Scope;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../source/source_loader.dart' show SourceLoader;
+
+import '../kernel/body_builder.dart' show BodyBuilder;
+
+import '../kernel/kernel_builder.dart'
+    show
+        ClassBuilder,
+        Builder,
+        ConstructorBuilder,
+        FieldBuilder,
+        LibraryBuilder,
+        MetadataBuilder,
+        TypeBuilder;
+
+import '../kernel/kernel_shadow_ast.dart' show VariableDeclarationJudgment;
+
+/// A builder for a formal parameter, i.e. a parameter on a method or
+/// constructor.
+class FormalParameterBuilder extends ModifierBuilder {
+  /// List of metadata builders for the metadata declared on this parameter.
   final List<MetadataBuilder> metadata;
 
   final int modifiers;
 
-  final T type;
+  final TypeBuilder type;
 
   final String name;
 
+  /// The kind of this parameter, i.e. if it's required, positional optional,
+  /// or named optional.
   FormalParameterKind kind = FormalParameterKind.mandatory;
 
+  /// The variable declaration created for this formal parameter.
+  VariableDeclaration declaration;
+
+  /// The first token of the default value, if any.
+  ///
+  /// This is stored until outlines have been built through
+  /// [buildOutlineExpressions].
+  Token initializerToken;
+
   FormalParameterBuilder(this.metadata, this.modifiers, this.type, this.name,
       LibraryBuilder compilationUnit, int charOffset)
       : super(compilationUnit, charOffset);
@@ -49,5 +90,83 @@
   @override
   String get fullNameForErrors => name;
 
-  FormalParameterBuilder forFormalParameterInitializerScope();
+  VariableDeclaration get target => declaration;
+
+  VariableDeclaration build(
+      SourceLibraryBuilder library, int functionNestingLevel) {
+    if (declaration == null) {
+      declaration = new VariableDeclarationJudgment(name, functionNestingLevel,
+          type: type?.build(library),
+          isFinal: isFinal,
+          isConst: isConst,
+          isFieldFormal: isInitializingFormal,
+          isCovariant: isCovariant)
+        ..fileOffset = charOffset;
+    }
+    return declaration;
+  }
+
+  FormalParameterBuilder clone(List<TypeBuilder> newTypes) {
+    // TODO(dmitryas):  It's not clear how [metadata] is used currently, and
+    // how it should be cloned.  Consider cloning it instead of reusing it.
+    return new FormalParameterBuilder(
+        metadata, modifiers, type?.clone(newTypes), name, parent, charOffset)
+      ..kind = kind;
+  }
+
+  FormalParameterBuilder forFormalParameterInitializerScope() {
+    assert(declaration != null);
+    return !isInitializingFormal
+        ? this
+        : (new FormalParameterBuilder(
+            metadata,
+            modifiers | finalMask | initializingFormalMask,
+            type,
+            name,
+            null,
+            charOffset)
+          ..parent = parent
+          ..declaration = declaration);
+  }
+
+  void finalizeInitializingFormal() {
+    Object cls = parent.parent;
+    if (cls is ClassBuilder) {
+      Builder field = cls.scope.lookup(name, charOffset, fileUri);
+      if (field is FieldBuilder) {
+        target.type = field.target.type;
+      }
+    }
+  }
+
+  /// Builds the default value from this [initializerToken] if this is a
+  /// formal parameter on a const constructor or instance method.
+  void buildOutlineExpressions(LibraryBuilder library) {
+    // 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.
+    final bool isConstConstructorParameter =
+        (parent is ConstructorBuilder && parent.target.isConst);
+    if ((isConstConstructorParameter || parent.isInstanceMember) &&
+        initializerToken != null) {
+      final ClassBuilder classBuilder = parent.parent;
+      Scope scope = classBuilder.scope;
+      BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
+          library, classBuilder, this, scope, fileUri);
+      bodyBuilder.constantContext = ConstantContext.required;
+      target.initializer = bodyBuilder.parseFieldInitializer(initializerToken)
+        ..parent = target;
+      bodyBuilder.typeInferrer?.inferParameterInitializer(
+          bodyBuilder, target.initializer, target.type);
+      if (library.loader is SourceLoader) {
+        SourceLoader loader = library.loader;
+        loader.transformPostInference(target, bodyBuilder.transformSetLiterals,
+            bodyBuilder.transformCollections);
+      }
+      bodyBuilder.resolveRedirectingFactoryTargets();
+    }
+    initializerToken = null;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
index b266feb..34b14fd 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_type_builder.dart
@@ -6,10 +6,32 @@
 
 import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeVariableBuilder;
 
-abstract class FunctionTypeBuilder extends TypeBuilder {
+import 'package:kernel/ast.dart'
+    show
+        DartType,
+        DynamicType,
+        FunctionType,
+        NamedType,
+        Supertype,
+        TypeParameter,
+        TypedefType;
+
+import '../fasta_codes.dart'
+    show LocatedMessage, messageSupertypeIsFunction, noLength;
+
+import '../problems.dart' show unsupported;
+
+import '../kernel/kernel_builder.dart'
+    show
+        FormalParameterBuilder,
+        LibraryBuilder,
+        TypeBuilder,
+        TypeVariableBuilder;
+
+class FunctionTypeBuilder extends TypeBuilder {
   final TypeBuilder returnType;
-  final List typeVariables;
-  final List formals;
+  final List<TypeVariableBuilder> typeVariables;
+  final List<FormalParameterBuilder> formals;
 
   FunctionTypeBuilder(this.returnType, this.typeVariables, this.formals);
 
@@ -51,6 +73,77 @@
     return buffer;
   }
 
+  FunctionType build(LibraryBuilder library, [TypedefType origin]) {
+    DartType builtReturnType =
+        returnType?.build(library) ?? const DynamicType();
+    List<DartType> positionalParameters = <DartType>[];
+    List<NamedType> namedParameters;
+    int requiredParameterCount = 0;
+    if (formals != null) {
+      for (FormalParameterBuilder formal in formals) {
+        DartType type = formal.type?.build(library) ?? const DynamicType();
+        if (formal.isPositional) {
+          positionalParameters.add(type);
+          if (formal.isRequired) requiredParameterCount++;
+        } else if (formal.isNamed) {
+          namedParameters ??= <NamedType>[];
+          namedParameters.add(new NamedType(formal.name, type));
+        }
+      }
+      if (namedParameters != null) {
+        namedParameters.sort();
+      }
+    }
+    List<TypeParameter> typeParameters;
+    if (typeVariables != null) {
+      typeParameters = <TypeParameter>[];
+      for (TypeVariableBuilder t in typeVariables) {
+        typeParameters.add(t.parameter);
+      }
+    }
+    return new FunctionType(positionalParameters, builtReturnType,
+        namedParameters: namedParameters ?? const <NamedType>[],
+        typeParameters: typeParameters ?? const <TypeParameter>[],
+        requiredParameterCount: requiredParameterCount,
+        typedefType: origin);
+  }
+
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    library.addProblem(
+        messageSupertypeIsFunction, charOffset, noLength, fileUri);
+    return null;
+  }
+
+  Supertype buildMixedInType(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    return buildSupertype(library, charOffset, fileUri);
+  }
+
   @override
-  build(LibraryBuilder library) {}
+  buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
+    return unsupported("buildInvalidType", message.charOffset, message.uri);
+  }
+
+  FunctionTypeBuilder clone(List<TypeBuilder> newTypes) {
+    List<TypeVariableBuilder> clonedTypeVariables;
+    if (typeVariables != null) {
+      clonedTypeVariables = new List<TypeVariableBuilder>(typeVariables.length);
+      for (int i = 0; i < clonedTypeVariables.length; i++) {
+        clonedTypeVariables[i] = typeVariables[i].clone(newTypes);
+      }
+    }
+    List<FormalParameterBuilder> clonedFormals;
+    if (formals != null) {
+      clonedFormals = new List<FormalParameterBuilder>(formals.length);
+      for (int i = 0; i < clonedFormals.length; i++) {
+        FormalParameterBuilder formal = formals[i];
+        clonedFormals[i] = formal.clone(newTypes);
+      }
+    }
+    FunctionTypeBuilder newType = new FunctionTypeBuilder(
+        returnType?.clone(newTypes), clonedTypeVariables, clonedFormals);
+    newTypes.add(newType);
+    return newType;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
index 4b67433..52355e7 100644
--- a/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/invalid_type_builder.dart
@@ -4,16 +4,42 @@
 
 library fasta.invalid_type_builder;
 
+import 'package:kernel/ast.dart' show DartType, InvalidType;
+
 import '../fasta_codes.dart' show LocatedMessage;
 
-import 'builder.dart' show TypeBuilder, TypeDeclarationBuilder;
+import 'builder.dart' show TypeDeclarationBuilder;
 
-abstract class InvalidTypeBuilder<T extends TypeBuilder, R>
-    extends TypeDeclarationBuilder<T, R> {
-  InvalidTypeBuilder(String name, int charOffset, [Uri fileUri])
-      : super(null, 0, name, null, charOffset, fileUri);
+import '../kernel/kernel_builder.dart' show TypeBuilder, LibraryBuilder;
 
-  LocatedMessage get message;
-
+class InvalidTypeBuilder extends TypeDeclarationBuilder {
   String get debugName => "InvalidTypeBuilder";
+
+  final LocatedMessage message;
+
+  final List<LocatedMessage> context;
+
+  final bool suppressMessage;
+
+  InvalidTypeBuilder(String name, this.message,
+      {this.context, this.suppressMessage: true})
+      : super(null, 0, name, null, message.charOffset, message.uri);
+
+  @override
+  InvalidType get target => const InvalidType();
+
+  DartType buildType(LibraryBuilder library, List<TypeBuilder> arguments) {
+    return buildTypesWithBuiltArguments(library, null);
+  }
+
+  /// [Arguments] have already been built.
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    if (!suppressMessage) {
+      library.addProblem(message.messageObject, message.charOffset,
+          message.length, message.uri,
+          context: context);
+    }
+    return const InvalidType();
+  }
 }
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 a818b67..f74ee3d 100644
--- a/pkg/front_end/lib/src/fasta/builder/library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/library_builder.dart
@@ -4,6 +4,8 @@
 
 library fasta.library_builder;
 
+import 'package:kernel/ast.dart' show Library;
+
 import '../combinator.dart' show Combinator;
 
 import '../problems.dart' show internalProblem, unsupported;
@@ -26,7 +28,7 @@
 import 'builder.dart'
     show
         ClassBuilder,
-        Declaration,
+        Builder,
         FieldBuilder,
         ModifierBuilder,
         NameIterator,
@@ -35,8 +37,7 @@
         ScopeBuilder,
         TypeBuilder;
 
-abstract class LibraryBuilder<T extends TypeBuilder, R>
-    extends ModifierBuilder {
+abstract class LibraryBuilder extends ModifierBuilder {
   final Scope scope;
 
   final Scope exportScope;
@@ -60,8 +61,25 @@
 
   bool get isSynthetic => false;
 
+  /// Set the langauge version to a specific non-null major and minor version.
+  ///
+  /// If the language version has previously been explicitly set set (i.e. with
+  /// [explicit] set to true), any subsequent call (explicit or not) should be
+  /// ignored.
+  /// Multiple calls with [explicit] set to false should be allowed though.
+  ///
+  /// The main idea is that the .packages file specifies a default language
+  /// version, but that the library can have source code that specifies another
+  /// one which should be supported, but specifying several in code should not
+  /// change anything.
+  ///
+  /// [offset] and [length] refers to the offset and length of the source code
+  /// specifying the language version.
+  void setLanguageVersion(int major, int minor,
+      {int offset: 0, int length, bool explicit});
+
   @override
-  Declaration get parent => null;
+  Builder get parent => null;
 
   bool get isPart => false;
 
@@ -74,11 +92,11 @@
   int get modifiers => 0;
 
   @override
-  R get target;
+  Library get target;
 
   Uri get uri;
 
-  Iterator<Declaration> get iterator {
+  Iterator<Builder> get iterator {
     return LibraryLocalDeclarationIterator(this);
   }
 
@@ -86,7 +104,7 @@
     return new LibraryLocalDeclarationNameIterator(this);
   }
 
-  Declaration addBuilder(String name, Declaration declaration, int charOffset);
+  Builder addBuilder(String name, Builder declaration, int charOffset);
 
   void addExporter(
       LibraryBuilder exporter, List<Combinator> combinators, int charOffset) {
@@ -115,16 +133,15 @@
   }
 
   /// Returns true if the export scope was modified.
-  bool addToExportScope(String name, Declaration member,
-      [int charOffset = -1]) {
+  bool addToExportScope(String name, Builder member, [int charOffset = -1]) {
     if (name.startsWith("_")) return false;
     if (member is PrefixBuilder) return false;
-    Map<String, Declaration> map =
+    Map<String, Builder> map =
         member.isSetter ? exportScope.setters : exportScope.local;
-    Declaration existing = map[name];
+    Builder existing = map[name];
     if (existing == member) return false;
     if (existing != null) {
-      Declaration result = computeAmbiguousDeclaration(
+      Builder result = computeAmbiguousDeclaration(
           name, existing, member, charOffset,
           isExport: true);
       map[name] = result;
@@ -135,11 +152,10 @@
     return true;
   }
 
-  void addToScope(
-      String name, Declaration member, int charOffset, bool isImport);
+  void addToScope(String name, Builder member, int charOffset, bool isImport);
 
-  Declaration computeAmbiguousDeclaration(
-      String name, Declaration declaration, Declaration other, int charOffset,
+  Builder computeAmbiguousDeclaration(
+      String name, Builder declaration, Builder other, int charOffset,
       {bool isExport: false, bool isImport: false});
 
   int finishDeferredLoadTearoffs() => 0;
@@ -162,7 +178,7 @@
   /// If [constructorName] is null or the empty string, it's assumed to be an
   /// unnamed constructor. it's an error if [constructorName] starts with
   /// `"_"`, and [bypassLibraryPrivacy] is false.
-  Declaration getConstructor(String className,
+  Builder getConstructor(String className,
       {String constructorName, bool bypassLibraryPrivacy: false}) {
     constructorName ??= "";
     if (constructorName.startsWith("_") && !bypassLibraryPrivacy) {
@@ -172,12 +188,12 @@
           -1,
           null);
     }
-    Declaration cls = (bypassLibraryPrivacy ? scope : exportScope)
+    Builder cls = (bypassLibraryPrivacy ? scope : exportScope)
         .lookup(className, -1, null);
     if (cls is ClassBuilder) {
       // TODO(ahe): This code is similar to code in `endNewExpression` in
       // `body_builder.dart`, try to share it.
-      Declaration constructor =
+      Builder constructor =
           cls.findConstructorOrFactory(constructorName, -1, null, this);
       if (constructor == null) {
         // Fall-through to internal error below.
@@ -217,7 +233,7 @@
 
   /// Don't use for scope lookup. Only use when an element is known to exist
   /// (and not a setter).
-  Declaration operator [](String name) {
+  Builder getLocalMember(String name) {
     return scope.local[name] ??
         internalProblem(
             templateInternalProblemNotFoundIn.withArguments(name, "$fileUri"),
@@ -225,7 +241,7 @@
             fileUri);
   }
 
-  Declaration lookup(String name, int charOffset, Uri fileUri) {
+  Builder lookup(String name, int charOffset, Uri fileUri) {
     return scope.lookup(name, charOffset, fileUri);
   }
 
@@ -242,14 +258,14 @@
   List<FieldBuilder> takeImplicitlyTypedFields() => null;
 }
 
-class LibraryLocalDeclarationIterator implements Iterator<Declaration> {
+class LibraryLocalDeclarationIterator implements Iterator<Builder> {
   final LibraryBuilder library;
-  final Iterator<Declaration> iterator;
+  final Iterator<Builder> iterator;
 
   LibraryLocalDeclarationIterator(this.library)
       : iterator = library.scope.iterator;
 
-  Declaration get current => iterator.current;
+  Builder get current => iterator.current;
 
   bool moveNext() {
     while (iterator.moveNext()) {
@@ -266,7 +282,7 @@
   LibraryLocalDeclarationNameIterator(this.library)
       : iterator = library.scope.nameIterator;
 
-  Declaration get current => iterator.current;
+  Builder get current => iterator.current;
 
   String get name => iterator.name;
 
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 e714210..dd40c72 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -7,13 +7,13 @@
 import '../problems.dart' show unsupported;
 
 import 'builder.dart'
-    show ClassBuilder, Declaration, LibraryBuilder, ModifierBuilder;
+    show ClassBuilder, Builder, LibraryBuilder, ModifierBuilder;
 
 abstract class MemberBuilder extends ModifierBuilder {
   /// For top-level members, the parent is set correctly during
   /// construction. However, for class members, the parent is initially the
   /// library and updated later.
-  Declaration parent;
+  Builder parent;
 
   String get name;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
index f43b4a6..5ac0dc0 100644
--- a/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/metadata_builder.dart
@@ -4,6 +4,44 @@
 
 library fasta.metadata_builder;
 
-abstract class MetadataBuilder {
-  int get charOffset;
+import 'package:kernel/ast.dart' show Annotatable, Class, Library;
+
+import '../kernel/body_builder.dart' show BodyBuilder;
+
+import '../kernel/kernel_builder.dart' show ClassBuilder, MemberBuilder;
+
+import '../scanner.dart' show Token;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../scope.dart' show Scope;
+
+class MetadataBuilder {
+  final Token beginToken;
+
+  int get charOffset => beginToken.charOffset;
+
+  MetadataBuilder(this.beginToken);
+
+  static void buildAnnotations(
+      Annotatable parent,
+      List<MetadataBuilder> metadata,
+      SourceLibraryBuilder library,
+      ClassBuilder classBuilder,
+      MemberBuilder member) {
+    if (metadata == null) return;
+    Uri fileUri = member?.fileUri ?? classBuilder?.fileUri ?? library.fileUri;
+    Scope scope = parent is Library || parent is Class || classBuilder == null
+        ? library.scope
+        : classBuilder.scope;
+    BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
+        library, classBuilder, member, scope, fileUri);
+    for (int i = 0; i < metadata.length; ++i) {
+      MetadataBuilder annotationBuilder = metadata[i];
+      parent.addAnnotation(
+          bodyBuilder.parseAnnotation(annotationBuilder.beginToken));
+    }
+    bodyBuilder.inferAnnotations(parent.annotations);
+    bodyBuilder.resolveRedirectingFactoryTargets();
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
index c62e021..a0f7861 100644
--- a/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/mixin_application_builder.dart
@@ -4,17 +4,23 @@
 
 library fasta.mixin_application_builder;
 
-import 'builder.dart' show TypeBuilder, TypeVariableBuilder;
+import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeVariableBuilder;
 
-abstract class MixinApplicationBuilder<T extends TypeBuilder>
-    extends TypeBuilder {
-  final T supertype;
-  final List<T> mixins;
+import 'package:kernel/ast.dart' show InterfaceType, Supertype;
+
+import '../fasta_codes.dart' show LocatedMessage;
+
+import '../problems.dart' show unsupported;
+
+class MixinApplicationBuilder extends TypeBuilder {
+  final TypeBuilder supertype;
+  final List<TypeBuilder> mixins;
+  Supertype builtType;
+
+  List<TypeVariableBuilder> typeVariables;
 
   MixinApplicationBuilder(this.supertype, this.mixins);
 
-  void set typeVariables(List<TypeVariableBuilder> variables);
-
   String get name => null;
 
   String get debugName => "MixinApplicationBuilder";
@@ -23,11 +29,41 @@
     buffer.write(supertype);
     buffer.write(" with ");
     bool first = true;
-    for (T t in mixins) {
+    for (TypeBuilder t in mixins) {
       if (!first) buffer.write(", ");
       first = false;
       t.printOn(buffer);
     }
     return buffer;
   }
+
+  @override
+  InterfaceType build(LibraryBuilder library) {
+    int charOffset = -1; // TODO(ahe): Provide these.
+    Uri fileUri = null; // TODO(ahe): Provide these.
+    return unsupported("build", charOffset, fileUri);
+  }
+
+  @override
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    return unsupported("buildSupertype", charOffset, fileUri);
+  }
+
+  @override
+  Supertype buildMixedInType(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    return unsupported("buildMixedInType", charOffset, fileUri);
+  }
+
+  @override
+  buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
+    return unsupported("buildInvalidType", message.charOffset, message.uri);
+  }
+
+  MixinApplicationBuilder clone(List<TypeBuilder> newTypes) {
+    int charOffset = -1; // TODO(dmitryas): Provide these.
+    Uri fileUri = null; // TODO(dmitryas): Provide these.
+    return unsupported("clone", charOffset, fileUri);
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
index 8ed8b22..907ec5a 100644
--- a/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/modifier_builder.dart
@@ -9,18 +9,20 @@
         abstractMask,
         constMask,
         covariantMask,
+        extensionDeclarationMask,
         externalMask,
         finalMask,
         hasConstConstructorMask,
         hasInitializerMask,
         initializingFormalMask,
+        mixinDeclarationMask,
         namedMixinApplicationMask,
         staticMask;
 
-import 'builder.dart' show Declaration;
+import 'builder.dart' show Builder;
 
-abstract class ModifierBuilder extends Declaration {
-  Declaration parent;
+abstract class ModifierBuilder extends Builder {
+  Builder parent;
 
   final int charOffset;
 
@@ -53,6 +55,10 @@
 
   bool get hasConstConstructor => (modifiers & hasConstConstructorMask) != 0;
 
+  bool get isMixin => (modifiers & mixinDeclarationMask) != 0;
+
+  bool get isExtension => (modifiers & extensionDeclarationMask) != 0;
+
   bool get isClassMember => false;
 
   String get name;
diff --git a/pkg/front_end/lib/src/fasta/builder/name_iterator.dart b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
index 9a93124..11303b4 100644
--- a/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
+++ b/pkg/front_end/lib/src/fasta/builder/name_iterator.dart
@@ -4,8 +4,8 @@
 
 library fasta.name_iterator;
 
-import 'builder.dart' show Declaration;
+import 'builder.dart' show Builder;
 
-abstract class NameIterator implements Iterator<Declaration> {
+abstract class NameIterator implements Iterator<Builder> {
   String get name;
 }
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 9644f64..d35ed97 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
@@ -4,6 +4,8 @@
 
 library fasta.named_type_builder;
 
+import 'package:kernel/ast.dart' show DartType, Supertype;
+
 import '../fasta_codes.dart'
     show
         Message,
@@ -17,13 +19,17 @@
         templateTypeArgumentsOnTypeVariable,
         templateTypeNotFound;
 
+import '../messages.dart'
+    show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
+
 import '../problems.dart' show unhandled;
 
+import '../severity.dart' show Severity;
+
 import 'builder.dart'
     show
-        Declaration,
+        Builder,
         Identifier,
-        InvalidTypeBuilder,
         LibraryBuilder,
         PrefixBuilder,
         QualifiedName,
@@ -33,19 +39,29 @@
         TypeVariableBuilder,
         flattenName;
 
-abstract class NamedTypeBuilder<T extends TypeBuilder, R> extends TypeBuilder {
+import '../kernel/kernel_builder.dart'
+    show
+        ClassBuilder,
+        InvalidTypeBuilder,
+        LibraryBuilder,
+        TypeBuilder,
+        TypeDeclarationBuilder,
+        TypeVariableBuilder,
+        flattenName;
+
+class NamedTypeBuilder extends TypeBuilder {
   final Object name;
 
-  List<T> arguments;
+  List<TypeBuilder> arguments;
 
   @override
-  TypeDeclarationBuilder<T, R> declaration;
+  TypeDeclarationBuilder declaration;
 
   NamedTypeBuilder(this.name, this.arguments);
 
-  @override
-  InvalidTypeBuilder<T, R> buildInvalidType(LocatedMessage message,
-      {List<LocatedMessage> context});
+  NamedTypeBuilder.fromTypeDeclarationBuilder(this.declaration,
+      [this.arguments])
+      : this.name = declaration.name;
 
   @override
   void bind(TypeDeclarationBuilder declaration) {
@@ -57,11 +73,11 @@
       Scope scope, int charOffset, Uri fileUri, LibraryBuilder library) {
     if (declaration != null) return;
     final name = this.name;
-    Declaration member;
+    Builder member;
     if (name is QualifiedName) {
       Object qualifier = name.qualifier;
       String prefixName = flattenName(qualifier, charOffset, fileUri);
-      Declaration prefix = scope.lookup(prefixName, charOffset, fileUri);
+      Builder prefix = scope.lookup(prefixName, charOffset, fileUri);
       if (prefix is PrefixBuilder) {
         member = prefix.lookup(name.name, name.charOffset, fileUri);
       }
@@ -91,24 +107,26 @@
       return;
     } else if (member is TypeDeclarationBuilder) {
       declaration = member.origin;
-      if (arguments == null && declaration.typeVariablesCount != 0) {
-        String typeName;
-        int typeNameOffset;
-        if (name is Identifier) {
-          typeName = name.name;
-          typeNameOffset = name.charOffset;
-        } else {
-          typeName = name;
-          typeNameOffset = charOffset;
+      if (!declaration.isExtension) {
+        if (arguments == null && declaration.typeVariablesCount != 0) {
+          String typeName;
+          int typeNameOffset;
+          if (name is Identifier) {
+            typeName = name.name;
+            typeNameOffset = name.charOffset;
+          } else {
+            typeName = name;
+            typeNameOffset = charOffset;
+          }
+          library.addProblem(
+              templateMissingExplicitTypeArguments
+                  .withArguments(declaration.typeVariablesCount),
+              typeNameOffset,
+              typeName.length,
+              fileUri);
         }
-        library.addProblem(
-            templateMissingExplicitTypeArguments
-                .withArguments(declaration.typeVariablesCount),
-            typeNameOffset,
-            typeName.length,
-            fileUri);
+        return;
       }
-      return;
     }
     Template<Message Function(String name)> template =
         member == null ? templateTypeNotFound : templateNotAType;
@@ -157,7 +175,7 @@
     if (arguments?.isEmpty ?? true) return buffer;
     buffer.write("<");
     bool first = true;
-    for (T t in arguments) {
+    for (TypeBuilder t in arguments) {
       if (!first) buffer.write(", ");
       first = false;
       t.printOn(buffer);
@@ -165,4 +183,103 @@
     buffer.write(">");
     return buffer;
   }
+
+  InvalidTypeBuilder buildInvalidType(LocatedMessage message,
+      {List<LocatedMessage> context}) {
+    // TODO(ahe): Consider if it makes sense to pass a QualifiedName to
+    // InvalidTypeBuilder?
+    return new InvalidTypeBuilder(
+        flattenName(name, message.charOffset, message.uri), message,
+        context: context);
+  }
+
+  Supertype handleInvalidSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    var template = declaration.isTypeVariable
+        ? templateSupertypeIsTypeVariable
+        : templateSupertypeIsIllegal;
+    library.addProblem(
+        template.withArguments(flattenName(name, charOffset, fileUri)),
+        charOffset,
+        noLength,
+        fileUri);
+    return null;
+  }
+
+  DartType build(LibraryBuilder library) {
+    assert(declaration != null, "Declaration has not been resolved on $this.");
+    return declaration.buildType(library, arguments);
+  }
+
+  Supertype buildSupertype(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    TypeDeclarationBuilder declaration = this.declaration;
+    if (declaration is ClassBuilder) {
+      return declaration.buildSupertype(library, arguments);
+    } else if (declaration is InvalidTypeBuilder) {
+      library.addProblem(
+          declaration.message.messageObject,
+          declaration.message.charOffset,
+          declaration.message.length,
+          declaration.message.uri,
+          severity: Severity.error);
+      return null;
+    } else {
+      return handleInvalidSupertype(library, charOffset, fileUri);
+    }
+  }
+
+  Supertype buildMixedInType(
+      LibraryBuilder library, int charOffset, Uri fileUri) {
+    TypeDeclarationBuilder declaration = this.declaration;
+    if (declaration is ClassBuilder) {
+      return declaration.buildMixedInType(library, arguments);
+    } else if (declaration is InvalidTypeBuilder) {
+      library.addProblem(
+          declaration.message.messageObject,
+          declaration.message.charOffset,
+          declaration.message.length,
+          declaration.message.uri,
+          severity: Severity.error);
+      return null;
+    } else {
+      return handleInvalidSupertype(library, charOffset, fileUri);
+    }
+  }
+
+  TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
+    TypeBuilder result = substitution[declaration];
+    if (result != null) {
+      assert(declaration is TypeVariableBuilder);
+      return result;
+    } else if (arguments != null) {
+      List<TypeBuilder> arguments;
+      int i = 0;
+      for (TypeBuilder argument in this.arguments) {
+        TypeBuilder type = argument.subst(substitution);
+        if (type != argument) {
+          arguments ??= this.arguments.toList();
+          arguments[i] = type;
+        }
+        i++;
+      }
+      if (arguments != null) {
+        return new NamedTypeBuilder(name, arguments)..bind(declaration);
+      }
+    }
+    return this;
+  }
+
+  NamedTypeBuilder clone(List<TypeBuilder> newTypes) {
+    List<TypeBuilder> clonedArguments;
+    if (arguments != null) {
+      clonedArguments = new List<TypeBuilder>(arguments.length);
+      for (int i = 0; i < clonedArguments.length; i++) {
+        clonedArguments[i] = arguments[i].clone(newTypes);
+      }
+    }
+    NamedTypeBuilder newType = new NamedTypeBuilder(name, clonedArguments);
+    newTypes.add(newType);
+    return newType;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
index bfd642d..f820280 100644
--- a/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/prefix_builder.dart
@@ -4,9 +4,15 @@
 
 library fasta.prefix_builder;
 
-import 'builder.dart' show Declaration, LibraryBuilder, Scope;
+import 'builder.dart' show Builder, LibraryBuilder, Scope;
 
-class PrefixBuilder extends Declaration {
+import 'package:kernel/ast.dart' show LibraryDependency;
+
+import '../builder/builder.dart' show LibraryBuilder;
+
+import '../kernel/load_library_builder.dart' show LoadLibraryBuilder;
+
+class PrefixBuilder extends Builder {
   final String name;
 
   final Scope exportScope = new Scope.top();
@@ -20,19 +26,29 @@
 
   final int importIndex;
 
-  PrefixBuilder(
-      this.name, this.deferred, this.parent, this.charOffset, this.importIndex);
+  final LibraryDependency dependency;
+
+  LoadLibraryBuilder loadLibraryBuilder;
+
+  PrefixBuilder(this.name, this.deferred, this.parent, this.dependency,
+      this.charOffset, this.importIndex) {
+    if (deferred) {
+      loadLibraryBuilder =
+          new LoadLibraryBuilder(parent, dependency, charOffset);
+      addToExportScope('loadLibrary', loadLibraryBuilder, charOffset);
+    }
+  }
 
   Uri get fileUri => parent.fileUri;
 
-  Declaration lookup(String name, int charOffset, Uri fileUri) {
+  Builder lookup(String name, int charOffset, Uri fileUri) {
     return exportScope.lookup(name, charOffset, fileUri);
   }
 
-  void addToExportScope(String name, Declaration member, int charOffset) {
-    Map<String, Declaration> map =
+  void addToExportScope(String name, Builder member, int charOffset) {
+    Map<String, Builder> map =
         member.isSetter ? exportScope.setters : exportScope.local;
-    Declaration existing = map[name];
+    Builder existing = map[name];
     if (existing != null) {
       map[name] = parent.computeAmbiguousDeclaration(
           name, existing, member, charOffset,
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 e720b31..0ce6588 100644
--- a/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/procedure_builder.dart
@@ -7,11 +7,15 @@
 // Note: we're deliberately using AsyncMarker and ProcedureKind from kernel
 // outside the kernel-specific builders. This is simpler than creating
 // additional enums.
-import 'package:kernel/ast.dart' show AsyncMarker, ProcedureKind;
+import 'package:kernel/ast.dart'
+    show AsyncMarker, ProcedureKind, VariableDeclaration;
+
+import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
+import 'package:kernel/type_algebra.dart';
 
 import 'builder.dart'
     show
-        Declaration,
+        Builder,
         FormalParameterBuilder,
         LibraryBuilder,
         MemberBuilder,
@@ -20,12 +24,88 @@
         TypeBuilder,
         TypeVariableBuilder;
 
-abstract class ProcedureBuilder<T extends TypeBuilder> extends MemberBuilder {
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        AsyncMarker,
+        Class,
+        Constructor,
+        ConstructorInvocation,
+        DartType,
+        DynamicType,
+        EmptyStatement,
+        Expression,
+        FunctionNode,
+        Initializer,
+        InterfaceType,
+        Member,
+        Name,
+        Procedure,
+        ProcedureKind,
+        RedirectingInitializer,
+        Statement,
+        StaticInvocation,
+        StringLiteral,
+        SuperInitializer,
+        TypeParameter,
+        TypeParameterType,
+        VariableDeclaration,
+        setParents;
+
+import '../../scanner/token.dart' show Token;
+
+import '../constant_context.dart' show ConstantContext;
+
+import '../kernel/body_builder.dart' show BodyBuilder;
+
+import '../kernel/expression_generator_helper.dart'
+    show ExpressionGeneratorHelper;
+
+import '../kernel/kernel_builder.dart'
+    show
+        ClassBuilder,
+        ConstructorReferenceBuilder,
+        Builder,
+        FormalParameterBuilder,
+        LibraryBuilder,
+        MetadataBuilder,
+        TypeBuilder,
+        TypeVariableBuilder,
+        isRedirectingGenerativeConstructorImplementation;
+
+import '../kernel/kernel_shadow_ast.dart' show VariableDeclarationJudgment;
+
+import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
+
+import '../loader.dart' show Loader;
+
+import '../messages.dart'
+    show
+        Message,
+        messageConstFactoryRedirectionToNonConst,
+        messageMoreThanOneSuperOrThisInitializer,
+        messageNonInstanceTypeVariableUse,
+        messagePatchDeclarationMismatch,
+        messagePatchDeclarationOrigin,
+        messagePatchNonExternal,
+        messageSuperInitializerNotLast,
+        messageThisInitializerNotAlone,
+        noLength;
+
+import '../problems.dart' show unexpected;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../type_inference/type_inference_engine.dart'
+    show IncludesTypeParametersNonCovariantly, Variance;
+
+/// Common base class for constructor and procedure builders.
+abstract class FunctionBuilder extends MemberBuilder {
   final List<MetadataBuilder> metadata;
 
   final int modifiers;
 
-  final T returnType;
+  final TypeBuilder returnType;
 
   final String name;
 
@@ -33,7 +113,12 @@
 
   final List<FormalParameterBuilder> formals;
 
-  ProcedureBuilder(
+  /// If this procedure is an instance member declared in an extension
+  /// declaration, [extensionThis] holds the synthetically added `this`
+  /// parameter.
+  VariableDeclaration extensionThis;
+
+  FunctionBuilder(
       this.metadata,
       this.modifiers,
       this.returnType,
@@ -41,10 +126,17 @@
       this.typeVariables,
       this.formals,
       LibraryBuilder compilationUnit,
-      int charOffset)
-      : super(compilationUnit, charOffset);
+      int charOffset,
+      this.nativeMethodName)
+      : super(compilationUnit, charOffset) {
+    if (formals != null) {
+      for (int i = 0; i < formals.length; i++) {
+        formals[i].parent = this;
+      }
+    }
+  }
 
-  String get debugName => "ProcedureBuilder";
+  String get debugName => "FunctionBuilder";
 
   AsyncMarker get asyncModifier;
 
@@ -62,13 +154,11 @@
 
   bool get isFactory => identical(ProcedureKind.Factory, kind);
 
-  void set body(covariant statement);
-
   /// This is the formal parameter scope as specified in the Dart Programming
-  /// Language Specifiction, 4th ed, section 9.2.
+  /// Language Specification, 4th ed, section 9.2.
   Scope computeFormalParameterScope(Scope parent) {
     if (formals == null) return parent;
-    Map<String, Declaration> local = <String, Declaration>{};
+    Map<String, Builder> local = <String, Builder>{};
     for (FormalParameterBuilder formal in formals) {
       if (!isConstructor || !formal.isInitializingFormal) {
         local[formal.name] = formal;
@@ -95,7 +185,7 @@
     // parameter initializer scope.
 
     if (formals == null) return parent;
-    Map<String, Declaration> local = <String, Declaration>{};
+    Map<String, Builder> local = <String, Builder>{};
     for (FormalParameterBuilder formal in formals) {
       local[formal.name] = formal.forFormalParameterInitializerScope();
     }
@@ -104,11 +194,11 @@
   }
 
   /// This scope doesn't correspond to any scope specified in the Dart
-  /// Programming Language Specifiction, 4th ed. It's an unspecified extension
+  /// Programming Language Specification, 4th ed. It's an unspecified extension
   /// to support generic methods.
   Scope computeTypeParameterScope(Scope parent) {
     if (typeVariables == null) return parent;
-    Map<String, Declaration> local = <String, Declaration>{};
+    Map<String, Builder> local = <String, Builder>{};
     for (TypeVariableBuilder variable in typeVariables) {
       local[variable.name] = variable;
     }
@@ -124,4 +214,668 @@
     }
     return null;
   }
+
+  final String nativeMethodName;
+
+  FunctionNode function;
+
+  Statement actualBody;
+
+  FunctionBuilder get actualOrigin;
+
+  void set body(Statement newBody) {
+//    if (newBody != null) {
+//      if (isAbstract) {
+//        // TODO(danrubel): Is this check needed?
+//        return internalProblem(messageInternalProblemBodyOnAbstractMethod,
+//            newBody.fileOffset, fileUri);
+//      }
+//    }
+    actualBody = newBody;
+    if (function != null) {
+      // A forwarding semi-stub is a method that is abstract in the source code,
+      // but which needs to have a forwarding stub body in order to ensure that
+      // covariance checks occur.  We don't want to replace the forwarding stub
+      // body with null.
+      var parent = function.parent;
+      if (!(newBody == null &&
+          parent is Procedure &&
+          parent.isForwardingSemiStub)) {
+        function.body = newBody;
+        newBody?.parent = function;
+      }
+    }
+  }
+
+  void setRedirectingFactoryBody(Member target, List<DartType> typeArguments) {
+    if (actualBody != null) {
+      unexpected("null", "${actualBody.runtimeType}", charOffset, fileUri);
+    }
+    actualBody = new RedirectingFactoryBody(target, typeArguments);
+    function.body = actualBody;
+    actualBody?.parent = function;
+    if (isPatch) {
+      actualOrigin.setRedirectingFactoryBody(target, typeArguments);
+    }
+  }
+
+  Statement get body => actualBody ??= new EmptyStatement();
+
+  bool get isNative => nativeMethodName != null;
+
+  FunctionNode buildFunction(LibraryBuilder library) {
+    assert(function == null);
+    FunctionNode result = new FunctionNode(body, asyncMarker: asyncModifier);
+    IncludesTypeParametersNonCovariantly needsCheckVisitor;
+    if (!isConstructor && !isFactory && parent is ClassBuilder) {
+      Class enclosingClass = parent.target;
+      if (enclosingClass.typeParameters.isNotEmpty) {
+        needsCheckVisitor = new IncludesTypeParametersNonCovariantly(
+            enclosingClass.typeParameters,
+            // We are checking the parameter types which are in a contravariant position.
+            initialVariance: Variance.contravariant);
+      }
+    }
+    if (typeVariables != null) {
+      for (TypeVariableBuilder t in typeVariables) {
+        TypeParameter parameter = t.parameter;
+        result.typeParameters.add(parameter);
+        if (needsCheckVisitor != null) {
+          if (parameter.bound.accept(needsCheckVisitor)) {
+            parameter.isGenericCovariantImpl = true;
+          }
+        }
+      }
+      setParents(result.typeParameters, result);
+    }
+    if (formals != null) {
+      for (FormalParameterBuilder formal in formals) {
+        VariableDeclaration parameter = formal.build(library, 0);
+        if (needsCheckVisitor != null) {
+          if (parameter.type.accept(needsCheckVisitor)) {
+            parameter.isGenericCovariantImpl = true;
+          }
+        }
+        if (formal.isNamed) {
+          result.namedParameters.add(parameter);
+        } else {
+          result.positionalParameters.add(parameter);
+        }
+        parameter.parent = result;
+        if (formal.isRequired) {
+          result.requiredParameterCount++;
+        }
+      }
+    }
+    if (isSetter && (formals?.length != 1 || formals[0].isOptional)) {
+      // Replace illegal parameters by single dummy parameter.
+      // Do this after building the parameters, since the diet listener
+      // assumes that parameters are built, even if illegal in number.
+      VariableDeclaration parameter =
+          new VariableDeclarationJudgment("#synthetic", 0);
+      result.positionalParameters.clear();
+      result.positionalParameters.add(parameter);
+      parameter.parent = result;
+      result.namedParameters.clear();
+      result.requiredParameterCount = 1;
+    }
+    if (returnType != null) {
+      result.returnType = returnType.build(library);
+    }
+    if (!isConstructor && !isInstanceMember && parent is ClassBuilder) {
+      List<TypeParameter> typeParameters = parent.target.typeParameters;
+      if (typeParameters.isNotEmpty) {
+        Map<TypeParameter, DartType> substitution;
+        DartType removeTypeVariables(DartType type) {
+          if (substitution == null) {
+            substitution = <TypeParameter, DartType>{};
+            for (TypeParameter parameter in typeParameters) {
+              substitution[parameter] = const DynamicType();
+            }
+          }
+          library.addProblem(
+              messageNonInstanceTypeVariableUse, charOffset, noLength, fileUri);
+          return substitute(type, substitution);
+        }
+
+        Set<TypeParameter> set = typeParameters.toSet();
+        for (VariableDeclaration parameter in result.positionalParameters) {
+          if (containsTypeVariable(parameter.type, set)) {
+            parameter.type = removeTypeVariables(parameter.type);
+          }
+        }
+        for (VariableDeclaration parameter in result.namedParameters) {
+          if (containsTypeVariable(parameter.type, set)) {
+            parameter.type = removeTypeVariables(parameter.type);
+          }
+        }
+        if (containsTypeVariable(result.returnType, set)) {
+          result.returnType = removeTypeVariables(result.returnType);
+        }
+      }
+    }
+    if (parent is ClassBuilder) {
+      ClassBuilder cls = parent;
+      if (cls.isExtension && isInstanceMember) {
+        extensionThis = result.positionalParameters.first;
+      }
+    }
+    return function = result;
+  }
+
+  Member build(SourceLibraryBuilder library);
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library) {
+    MetadataBuilder.buildAnnotations(
+        target, metadata, library, isClassMember ? parent : null, this);
+
+    if (formals != null) {
+      // For const constructors we need to include default parameter values
+      // into the outline. For all other formals we need to call
+      // buildOutlineExpressions to clear initializerToken to prevent
+      // consuming too much memory.
+      for (FormalParameterBuilder formal in formals) {
+        formal.buildOutlineExpressions(library);
+      }
+    }
+  }
+
+  void becomeNative(Loader loader) {
+    Builder constructor = loader.getNativeAnnotation();
+    Arguments arguments =
+        new Arguments(<Expression>[new StringLiteral(nativeMethodName)]);
+    Expression annotation;
+    if (constructor.isConstructor) {
+      annotation = new ConstructorInvocation(constructor.target, arguments)
+        ..isConst = true;
+    } else {
+      annotation = new StaticInvocation(constructor.target, arguments)
+        ..isConst = true;
+    }
+    target.addAnnotation(annotation);
+  }
+
+  bool checkPatch(FunctionBuilder patch) {
+    if (!isExternal) {
+      patch.library.addProblem(
+          messagePatchNonExternal, patch.charOffset, noLength, patch.fileUri,
+          context: [
+            messagePatchDeclarationOrigin.withLocation(
+                fileUri, charOffset, noLength)
+          ]);
+      return false;
+    }
+    return true;
+  }
+
+  void reportPatchMismatch(Builder patch) {
+    library.addProblem(messagePatchDeclarationMismatch, patch.charOffset,
+        noLength, patch.fileUri, context: [
+      messagePatchDeclarationOrigin.withLocation(fileUri, charOffset, noLength)
+    ]);
+  }
+}
+
+class ProcedureBuilder extends FunctionBuilder {
+  final Procedure procedure;
+  final int charOpenParenOffset;
+
+  AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
+
+  @override
+  ProcedureBuilder actualOrigin;
+
+  bool hadTypesInferred = false;
+
+  ProcedureBuilder(
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder returnType,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      ProcedureKind kind,
+      SourceLibraryBuilder compilationUnit,
+      int startCharOffset,
+      int charOffset,
+      this.charOpenParenOffset,
+      int charEndOffset,
+      [String nativeMethodName])
+      : procedure =
+            new Procedure(null, kind, null, fileUri: compilationUnit?.fileUri)
+              ..startFileOffset = startCharOffset
+              ..fileOffset = charOffset
+              ..fileEndOffset = charEndOffset,
+        super(metadata, modifiers, returnType, name, typeVariables, formals,
+            compilationUnit, charOffset, nativeMethodName);
+
+  @override
+  ProcedureBuilder get origin => actualOrigin ?? this;
+
+  ProcedureKind get kind => procedure.kind;
+
+  AsyncMarker get asyncModifier => actualAsyncModifier;
+
+  Statement get body {
+    if (actualBody == null && !isAbstract && !isExternal) {
+      actualBody = new EmptyStatement();
+    }
+    return actualBody;
+  }
+
+  void set asyncModifier(AsyncMarker newModifier) {
+    actualAsyncModifier = newModifier;
+    if (function != null) {
+      // No parent, it's an enum.
+      function.asyncMarker = actualAsyncModifier;
+      function.dartAsyncMarker = actualAsyncModifier;
+    }
+  }
+
+  bool get isEligibleForTopLevelInference {
+    if (library.legacyMode) return false;
+    if (isInstanceMember) {
+      if (returnType == null) return true;
+      if (formals != null) {
+        for (var formal in formals) {
+          if (formal.type == null) return true;
+        }
+      }
+    }
+    return false;
+  }
+
+  /// Returns `true` if this procedure is declared in an extension declaration.
+  bool get isExtensionMethod {
+    if (parent is ClassBuilder) {
+      ClassBuilder cls = parent;
+      return cls.isExtension;
+    }
+    return false;
+  }
+
+  Procedure build(SourceLibraryBuilder library) {
+    // TODO(ahe): I think we may call this twice on parts. Investigate.
+    if (procedure.name == null) {
+      procedure.function = buildFunction(library);
+      procedure.function.parent = procedure;
+      procedure.function.fileOffset = charOpenParenOffset;
+      procedure.function.fileEndOffset = procedure.fileEndOffset;
+      procedure.isAbstract = isAbstract;
+      procedure.isExternal = isExternal;
+      procedure.isConst = isConst;
+      if (isExtensionMethod) {
+        ClassBuilder extension = parent;
+        procedure.isStatic = false;
+        procedure.isExtensionMethod = true;
+        procedure.kind = ProcedureKind.Method;
+        procedure.name = new Name('${extension.name}|${name}', library.target);
+      } else {
+        procedure.isStatic = isStatic;
+        procedure.name = new Name(name, library.target);
+      }
+    }
+    return procedure;
+  }
+
+  Procedure get target => origin.procedure;
+
+  @override
+  int finishPatch() {
+    if (!isPatch) return 0;
+
+    // TODO(ahe): restore file-offset once we track both origin and patch file
+    // URIs. See https://github.com/dart-lang/sdk/issues/31579
+    origin.procedure.fileUri = fileUri;
+    origin.procedure.startFileOffset = procedure.startFileOffset;
+    origin.procedure.fileOffset = procedure.fileOffset;
+    origin.procedure.fileEndOffset = procedure.fileEndOffset;
+    origin.procedure.annotations
+        .forEach((m) => m.fileOffset = procedure.fileOffset);
+
+    origin.procedure.isAbstract = procedure.isAbstract;
+    origin.procedure.isExternal = procedure.isExternal;
+    origin.procedure.function = procedure.function;
+    origin.procedure.function.parent = origin.procedure;
+    return 1;
+  }
+
+  @override
+  void becomeNative(Loader loader) {
+    procedure.isExternal = true;
+    super.becomeNative(loader);
+  }
+
+  @override
+  void applyPatch(Builder patch) {
+    if (patch is ProcedureBuilder) {
+      if (checkPatch(patch)) {
+        patch.actualOrigin = this;
+      }
+    } else {
+      reportPatchMismatch(patch);
+    }
+  }
+}
+
+// TODO(ahe): Move this to own file?
+class ConstructorBuilder extends FunctionBuilder {
+  final Constructor constructor;
+
+  final int charOpenParenOffset;
+
+  bool hasMovedSuperInitializer = false;
+
+  SuperInitializer superInitializer;
+
+  RedirectingInitializer redirectingInitializer;
+
+  Token beginInitializers;
+
+  @override
+  ConstructorBuilder actualOrigin;
+
+  ConstructorBuilder(
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder returnType,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      SourceLibraryBuilder compilationUnit,
+      int startCharOffset,
+      int charOffset,
+      this.charOpenParenOffset,
+      int charEndOffset,
+      [String nativeMethodName])
+      : constructor = new Constructor(null, fileUri: compilationUnit?.fileUri)
+          ..startFileOffset = startCharOffset
+          ..fileOffset = charOffset
+          ..fileEndOffset = charEndOffset,
+        super(metadata, modifiers, returnType, name, typeVariables, formals,
+            compilationUnit, charOffset, nativeMethodName);
+
+  @override
+  ConstructorBuilder get origin => actualOrigin ?? this;
+
+  bool get isInstanceMember => false;
+
+  bool get isConstructor => true;
+
+  AsyncMarker get asyncModifier => AsyncMarker.Sync;
+
+  ProcedureKind get kind => null;
+
+  bool get isRedirectingGenerativeConstructor {
+    return isRedirectingGenerativeConstructorImplementation(constructor);
+  }
+
+  bool get isEligibleForTopLevelInference {
+    if (library.legacyMode) return false;
+    if (formals != null) {
+      for (var formal in formals) {
+        if (formal.type == null && formal.isInitializingFormal) return true;
+      }
+    }
+    return false;
+  }
+
+  Constructor build(SourceLibraryBuilder library) {
+    if (constructor.name == null) {
+      constructor.function = buildFunction(library);
+      constructor.function.parent = constructor;
+      constructor.function.fileOffset = charOpenParenOffset;
+      constructor.function.fileEndOffset = constructor.fileEndOffset;
+      constructor.function.typeParameters = const <TypeParameter>[];
+      constructor.isConst = isConst;
+      constructor.isExternal = isExternal;
+      constructor.name = new Name(name, library.target);
+    }
+    if (isEligibleForTopLevelInference) {
+      for (FormalParameterBuilder formal in formals) {
+        if (formal.type == null && formal.isInitializingFormal) {
+          formal.declaration.type = null;
+        }
+      }
+      library.loader.typeInferenceEngine.toBeInferred[constructor] = library;
+    }
+    return constructor;
+  }
+
+  @override
+  void buildOutlineExpressions(LibraryBuilder library) {
+    super.buildOutlineExpressions(library);
+
+    // For modular compilation purposes we need to include initializers
+    // for const constructors into the outline.
+    if (isConst && beginInitializers != null) {
+      ClassBuilder classBuilder = parent;
+      BodyBuilder bodyBuilder = new BodyBuilder.forOutlineExpression(
+          library, classBuilder, this, classBuilder.scope, fileUri);
+      bodyBuilder.constantContext = ConstantContext.inferred;
+      bodyBuilder.parseInitializers(beginInitializers);
+      bodyBuilder.resolveRedirectingFactoryTargets();
+    }
+    beginInitializers = null;
+  }
+
+  FunctionNode buildFunction(LibraryBuilder library) {
+    // According to the specification §9.3 the return type of a constructor
+    // function is its enclosing class.
+    FunctionNode functionNode = super.buildFunction(library);
+    ClassBuilder enclosingClass = parent;
+    List<DartType> typeParameterTypes = new List<DartType>();
+    for (int i = 0; i < enclosingClass.target.typeParameters.length; i++) {
+      TypeParameter typeParameter = enclosingClass.target.typeParameters[i];
+      typeParameterTypes.add(new TypeParameterType(typeParameter));
+    }
+    functionNode.returnType =
+        new InterfaceType(enclosingClass.target, typeParameterTypes);
+    return functionNode;
+  }
+
+  Constructor get target => origin.constructor;
+
+  void injectInvalidInitializer(
+      Message message, int charOffset, ExpressionGeneratorHelper helper) {
+    List<Initializer> initializers = constructor.initializers;
+    Initializer lastInitializer = initializers.removeLast();
+    assert(lastInitializer == superInitializer ||
+        lastInitializer == redirectingInitializer);
+    Initializer error = helper.buildInvalidInitializer(
+        helper.desugarSyntheticExpression(
+            helper.buildProblem(message, charOffset, noLength)),
+        charOffset);
+    initializers.add(error..parent = constructor);
+    initializers.add(lastInitializer);
+  }
+
+  void addInitializer(
+      Initializer initializer, ExpressionGeneratorHelper helper) {
+    List<Initializer> initializers = constructor.initializers;
+    if (initializer is SuperInitializer) {
+      if (superInitializer != null || redirectingInitializer != null) {
+        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
+            initializer.fileOffset, helper);
+      } else {
+        initializers.add(initializer..parent = constructor);
+        superInitializer = initializer;
+      }
+    } else if (initializer is RedirectingInitializer) {
+      if (superInitializer != null || redirectingInitializer != null) {
+        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
+            initializer.fileOffset, helper);
+      } else if (constructor.initializers.isNotEmpty) {
+        Initializer first = constructor.initializers.first;
+        Initializer error = helper.buildInvalidInitializer(
+            helper.desugarSyntheticExpression(helper.buildProblem(
+                messageThisInitializerNotAlone, first.fileOffset, noLength)),
+            first.fileOffset);
+        initializers.add(error..parent = constructor);
+      } else {
+        initializers.add(initializer..parent = constructor);
+        redirectingInitializer = initializer;
+      }
+    } else if (redirectingInitializer != null) {
+      injectInvalidInitializer(
+          messageThisInitializerNotAlone, initializer.fileOffset, helper);
+    } else if (superInitializer != null) {
+      injectInvalidInitializer(
+          messageSuperInitializerNotLast, superInitializer.fileOffset, helper);
+    } else {
+      initializers.add(initializer..parent = constructor);
+    }
+  }
+
+  @override
+  int finishPatch() {
+    if (!isPatch) return 0;
+
+    // TODO(ahe): restore file-offset once we track both origin and patch file
+    // URIs. See https://github.com/dart-lang/sdk/issues/31579
+    origin.constructor.fileUri = fileUri;
+    origin.constructor.startFileOffset = constructor.startFileOffset;
+    origin.constructor.fileOffset = constructor.fileOffset;
+    origin.constructor.fileEndOffset = constructor.fileEndOffset;
+    origin.constructor.annotations
+        .forEach((m) => m.fileOffset = constructor.fileOffset);
+
+    origin.constructor.isExternal = constructor.isExternal;
+    origin.constructor.function = constructor.function;
+    origin.constructor.function.parent = origin.constructor;
+    origin.constructor.initializers = constructor.initializers;
+    setParents(origin.constructor.initializers, origin.constructor);
+    return 1;
+  }
+
+  @override
+  void becomeNative(Loader loader) {
+    constructor.isExternal = true;
+    super.becomeNative(loader);
+  }
+
+  @override
+  void applyPatch(Builder patch) {
+    if (patch is ConstructorBuilder) {
+      if (checkPatch(patch)) {
+        patch.actualOrigin = this;
+      }
+    } else {
+      reportPatchMismatch(patch);
+    }
+  }
+
+  void prepareInitializers() {
+    // For const constructors we parse initializers already at the outlining
+    // stage, there is no easy way to make body building stage skip initializer
+    // parsing, so we simply clear parsed initializers and rebuild them
+    // again.
+    // Note: this method clears both initializers from the target Kernel node
+    // and internal state associated with parsing initializers.
+    if (target.isConst) {
+      target.initializers.length = 0;
+      redirectingInitializer = null;
+      superInitializer = null;
+      hasMovedSuperInitializer = false;
+    }
+  }
+}
+
+class RedirectingFactoryBuilder extends ProcedureBuilder {
+  final ConstructorReferenceBuilder redirectionTarget;
+  List<DartType> typeArguments;
+
+  RedirectingFactoryBuilder(
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder returnType,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      SourceLibraryBuilder compilationUnit,
+      int startCharOffset,
+      int charOffset,
+      int charOpenParenOffset,
+      int charEndOffset,
+      [String nativeMethodName,
+      this.redirectionTarget])
+      : super(
+            metadata,
+            modifiers,
+            returnType,
+            name,
+            typeVariables,
+            formals,
+            ProcedureKind.Factory,
+            compilationUnit,
+            startCharOffset,
+            charOffset,
+            charOpenParenOffset,
+            charEndOffset,
+            nativeMethodName);
+
+  @override
+  Statement get body => actualBody;
+
+  @override
+  void setRedirectingFactoryBody(Member target, List<DartType> typeArguments) {
+    if (actualBody != null) {
+      unexpected("null", "${actualBody.runtimeType}", charOffset, fileUri);
+    }
+
+    // Ensure that constant factories only have constant targets/bodies.
+    if (isConst && !target.isConst) {
+      library.addProblem(messageConstFactoryRedirectionToNonConst, charOffset,
+          noLength, fileUri);
+    }
+
+    actualBody = new RedirectingFactoryBody(target, typeArguments);
+    function.body = actualBody;
+    actualBody?.parent = function;
+    if (isPatch) {
+      if (function.typeParameters != null) {
+        Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
+        for (int i = 0; i < function.typeParameters.length; i++) {
+          substitution[function.typeParameters[i]] =
+              new TypeParameterType(actualOrigin.function.typeParameters[i]);
+        }
+        List<DartType> newTypeArguments =
+            new List<DartType>(typeArguments.length);
+        for (int i = 0; i < newTypeArguments.length; i++) {
+          newTypeArguments[i] = substitute(typeArguments[i], substitution);
+        }
+        typeArguments = newTypeArguments;
+      }
+      actualOrigin.setRedirectingFactoryBody(target, typeArguments);
+    }
+  }
+
+  @override
+  Procedure build(SourceLibraryBuilder library) {
+    Procedure result = super.build(library);
+    result.isRedirectingFactoryConstructor = true;
+    if (redirectionTarget.typeArguments != null) {
+      typeArguments =
+          new List<DartType>(redirectionTarget.typeArguments.length);
+      for (int i = 0; i < typeArguments.length; i++) {
+        typeArguments[i] = redirectionTarget.typeArguments[i].build(library);
+      }
+    }
+    return result;
+  }
+
+  @override
+  int finishPatch() {
+    if (!isPatch) return 0;
+
+    super.finishPatch();
+
+    if (origin is RedirectingFactoryBuilder) {
+      RedirectingFactoryBuilder redirectingOrigin = origin;
+      redirectingOrigin.typeArguments = typeArguments;
+    }
+
+    return 1;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
index c2e5255..430ef0a 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_alias_builder.dart
@@ -4,6 +4,35 @@
 
 library fasta.function_type_alias_builder;
 
+import 'package:kernel/ast.dart'
+    show
+        DartType,
+        DynamicType,
+        FunctionType,
+        InvalidType,
+        TypeParameter,
+        Typedef,
+        VariableDeclaration;
+
+import 'package:kernel/type_algebra.dart'
+    show FreshTypeParameters, getFreshTypeParameters, substitute;
+
+import '../fasta_codes.dart'
+    show noLength, templateCyclicTypedef, templateTypeArgumentMismatch;
+
+import '../kernel/kernel_builder.dart'
+    show
+        FunctionTypeBuilder,
+        FormalParameterBuilder,
+        LibraryBuilder,
+        MetadataBuilder,
+        TypeBuilder,
+        TypeVariableBuilder;
+
+import '../problems.dart' show unhandled;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import 'builder.dart'
     show
         LibraryBuilder,
@@ -12,24 +41,166 @@
         TypeDeclarationBuilder,
         TypeVariableBuilder;
 
-abstract class TypeAliasBuilder<T extends TypeBuilder, R>
-    extends TypeDeclarationBuilder<T, R> {
-  final T type;
+class TypeAliasBuilder extends TypeDeclarationBuilder {
+  final TypeBuilder type;
 
-  final List<TypeVariableBuilder<T, R>> typeVariables;
+  final List<TypeVariableBuilder> typeVariables;
 
-  TypeAliasBuilder(
-      List<MetadataBuilder> metadata,
-      String name,
-      this.typeVariables,
-      this.type,
-      LibraryBuilder<T, Object> parent,
-      int charOffset)
-      : super(metadata, null, name, parent, charOffset);
+  final Typedef target;
+
+  DartType thisType;
+
+  TypeAliasBuilder(List<MetadataBuilder> metadata, String name,
+      this.typeVariables, this.type, LibraryBuilder parent, int charOffset,
+      [Typedef target])
+      : target = target ??
+            (new Typedef(name, null,
+                typeParameters:
+                    TypeVariableBuilder.kernelTypeParametersFromBuilders(
+                        typeVariables),
+                fileUri: parent.target.fileUri)
+              ..fileOffset = charOffset),
+        super(metadata, 0, name, parent, charOffset);
 
   String get debugName => "TypeAliasBuilder";
 
-  LibraryBuilder<T, Object> get parent => super.parent;
+  LibraryBuilder get parent => super.parent;
 
-  int get typeVariablesCount;
+  Typedef build(SourceLibraryBuilder libraryBuilder) {
+    target..type ??= buildThisType(libraryBuilder);
+
+    TypeBuilder type = this.type;
+    if (type is FunctionTypeBuilder) {
+      List<TypeParameter> typeParameters =
+          new List<TypeParameter>(type.typeVariables?.length ?? 0);
+      for (int i = 0; i < typeParameters.length; ++i) {
+        TypeVariableBuilder typeVariable = type.typeVariables[i];
+        typeParameters[i] = typeVariable.parameter;
+      }
+      FreshTypeParameters freshTypeParameters =
+          getFreshTypeParameters(typeParameters);
+      target.typeParametersOfFunctionType
+          .addAll(freshTypeParameters.freshTypeParameters);
+
+      if (type.formals != null) {
+        for (FormalParameterBuilder formal in type.formals) {
+          VariableDeclaration parameter = formal.build(libraryBuilder, 0);
+          parameter.type = freshTypeParameters.substitute(parameter.type);
+          if (formal.isNamed) {
+            target.namedParameters.add(parameter);
+          } else {
+            target.positionalParameters.add(parameter);
+          }
+        }
+      }
+    } else if (type != null) {
+      unhandled("${type.fullNameForErrors}", "build", charOffset, fileUri);
+    }
+
+    return target;
+  }
+
+  DartType buildThisType(LibraryBuilder library) {
+    if (thisType != null) {
+      if (identical(thisType, cyclicTypeAliasMarker)) {
+        library.addProblem(templateCyclicTypedef.withArguments(name),
+            charOffset, noLength, fileUri);
+        return const InvalidType();
+      }
+      return thisType;
+    }
+    // It is a compile-time error for an alias (typedef) to refer to itself. We
+    // detect cycles by detecting recursive calls to this method using an
+    // instance of InvalidType that isn't identical to `const InvalidType()`.
+    thisType = cyclicTypeAliasMarker;
+    TypeBuilder type = this.type;
+    if (type is FunctionTypeBuilder) {
+      FunctionType builtType = type?.build(library, target.thisType);
+      if (builtType != null) {
+        if (typeVariables != null) {
+          for (TypeVariableBuilder tv in typeVariables) {
+            // Follow bound in order to find all cycles
+            tv.bound?.build(library);
+          }
+        }
+        return thisType = builtType;
+      } else {
+        return thisType = const InvalidType();
+      }
+    } else if (type == null) {
+      return thisType = const InvalidType();
+    } else {
+      return unhandled(
+          "${type.fullNameForErrors}", "buildThisType", charOffset, fileUri);
+    }
+  }
+
+  /// [arguments] have already been built.
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    var thisType = buildThisType(library);
+    if (const DynamicType() == thisType) return thisType;
+    FunctionType result = thisType;
+    if (target.typeParameters.isEmpty && arguments == null) return result;
+    Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
+    for (int i = 0; i < target.typeParameters.length; i++) {
+      substitution[target.typeParameters[i]] = arguments[i];
+    }
+    return substitute(result, substitution);
+  }
+
+  List<DartType> buildTypeArguments(
+      LibraryBuilder library, List<TypeBuilder> arguments) {
+    if (arguments == null && typeVariables == null) {
+      return <DartType>[];
+    }
+
+    if (arguments == null && typeVariables != null) {
+      List<DartType> result =
+          new List<DartType>.filled(typeVariables.length, null, growable: true);
+      for (int i = 0; i < result.length; ++i) {
+        result[i] = typeVariables[i].defaultType.build(library);
+      }
+      if (library is SourceLibraryBuilder) {
+        library.inferredTypes.addAll(result);
+      }
+      return result;
+    }
+
+    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
+      // That should be caught and reported as a compile-time error earlier.
+      return unhandled(
+          templateTypeArgumentMismatch
+              .withArguments(typeVariables.length)
+              .message,
+          "buildTypeArguments",
+          -1,
+          null);
+    }
+
+    // arguments.length == typeVariables.length
+    List<DartType> result =
+        new List<DartType>.filled(arguments.length, null, growable: true);
+    for (int i = 0; i < result.length; ++i) {
+      result[i] = arguments[i].build(library);
+    }
+    return result;
+  }
+
+  /// If [arguments] are null, the default types for the variables are used.
+  @override
+  int get typeVariablesCount => typeVariables?.length ?? 0;
+
+  @override
+  DartType buildType(LibraryBuilder library, List<TypeBuilder> arguments) {
+    var thisType = buildThisType(library);
+    if (thisType is InvalidType) return thisType;
+    FunctionType result = thisType;
+    if (target.typeParameters.isEmpty && arguments == null) return result;
+    // Otherwise, substitute.
+    return buildTypesWithBuiltArguments(
+        library, buildTypeArguments(library, arguments));
+  }
 }
+
+final InvalidType cyclicTypeAliasMarker = new InvalidType();
diff --git a/pkg/front_end/lib/src/fasta/builder/type_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
index 0758872..0c0b5f9 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_builder.dart
@@ -4,6 +4,8 @@
 
 library fasta.type_builder;
 
+import 'package:kernel/ast.dart' show DartType, Supertype;
+
 import '../fasta_codes.dart' show LocatedMessage;
 
 import 'builder.dart'
@@ -42,9 +44,14 @@
   /// resolved later.
   TypeBuilder clone(List<TypeBuilder> newTypes);
 
-  build(LibraryBuilder library);
-
   buildInvalidType(LocatedMessage message, {List<LocatedMessage> context});
 
   String get fullNameForErrors => "${printOn(new StringBuffer())}";
+
+  DartType build(LibraryBuilder library);
+
+  Supertype buildSupertype(LibraryBuilder library, int charOffset, Uri fileUri);
+
+  Supertype buildMixedInType(
+      LibraryBuilder library, int charOffset, Uri fileUri);
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
index 32a5a31..fa2c7bd 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_declaration_builder.dart
@@ -4,28 +4,25 @@
 
 library fasta.type_declaration_builder;
 
-import 'builder.dart'
-    show
-        Declaration,
-        LibraryBuilder,
-        MetadataBuilder,
-        ModifierBuilder,
-        TypeBuilder;
+import 'package:kernel/ast.dart' show DartType;
 
-abstract class TypeDeclarationBuilder<T extends TypeBuilder, R>
-    extends ModifierBuilder {
+import 'builder.dart'
+    show Builder, LibraryBuilder, MetadataBuilder, ModifierBuilder, TypeBuilder;
+
+abstract class TypeDeclarationBuilder extends ModifierBuilder {
   final List<MetadataBuilder> metadata;
 
   final int modifiers;
 
   final String name;
 
-  Declaration parent;
+  Builder parent;
 
   TypeDeclarationBuilder(
       this.metadata, this.modifiers, this.name, this.parent, int charOffset,
       [Uri fileUri])
-      : super(parent, charOffset, fileUri);
+      : assert(modifiers != null),
+        super(parent, charOffset, fileUri);
 
   bool get isTypeDeclaration => true;
 
@@ -34,9 +31,9 @@
 
   int get typeVariablesCount => 0;
 
-  R buildType(LibraryBuilder<T, Object> library, List<T> arguments);
+  DartType buildType(LibraryBuilder library, List<TypeBuilder> arguments);
 
   /// [arguments] have already been built.
-  R buildTypesWithBuiltArguments(
-      LibraryBuilder<T, Object> library, List<R> arguments);
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments);
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
index 7d8cea1..54a4f58 100644
--- a/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/type_variable_builder.dart
@@ -6,15 +6,37 @@
 
 import 'builder.dart' show LibraryBuilder, TypeBuilder, TypeDeclarationBuilder;
 
-abstract class TypeVariableBuilder<T extends TypeBuilder, R>
-    extends TypeDeclarationBuilder<T, R> {
-  T bound;
+import 'package:kernel/ast.dart'
+    show DartType, TypeParameter, TypeParameterType;
 
-  T defaultType;
+import '../fasta_codes.dart' show templateTypeArgumentsOnTypeVariable;
+
+import '../kernel/kernel_builder.dart'
+    show ClassBuilder, NamedTypeBuilder, LibraryBuilder, TypeBuilder;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+class TypeVariableBuilder extends TypeDeclarationBuilder {
+  TypeBuilder bound;
+
+  TypeBuilder defaultType;
+
+  final TypeParameter actualParameter;
+
+  TypeVariableBuilder actualOrigin;
 
   TypeVariableBuilder(
-      String name, this.bound, LibraryBuilder compilationUnit, int charOffset)
-      : super(null, 0, name, compilationUnit, charOffset);
+      String name, SourceLibraryBuilder compilationUnit, int charOffset,
+      {this.bound, bool synthesizeTypeParameterName: false})
+      : actualParameter = new TypeParameter(
+            synthesizeTypeParameterName ? '#$name' : name, null)
+          ..fileOffset = charOffset,
+        super(null, 0, name, compilationUnit, charOffset);
+
+  TypeVariableBuilder.fromKernel(
+      TypeParameter parameter, LibraryBuilder compilationUnit)
+      : actualParameter = parameter,
+        super(null, 0, parameter.name, compilationUnit, parameter.fileOffset);
 
   bool get isTypeVariable => true;
 
@@ -31,7 +53,86 @@
 
   String toString() => "${printOn(new StringBuffer())}";
 
-  T asTypeBuilder();
+  TypeVariableBuilder get origin => actualOrigin ?? this;
 
-  TypeVariableBuilder clone(List<TypeBuilder> newTypes);
+  TypeParameter get parameter => origin.actualParameter;
+
+  TypeParameter get target => parameter;
+
+  DartType buildType(LibraryBuilder library, List<TypeBuilder> arguments) {
+    if (arguments != null) {
+      int charOffset = -1; // TODO(ahe): Provide these.
+      Uri fileUri = null; // TODO(ahe): Provide these.
+      library.addProblem(
+          templateTypeArgumentsOnTypeVariable.withArguments(name),
+          charOffset,
+          name.length,
+          fileUri);
+    }
+    return new TypeParameterType(parameter);
+  }
+
+  DartType buildTypesWithBuiltArguments(
+      LibraryBuilder library, List<DartType> arguments) {
+    if (arguments != null) {
+      int charOffset = -1; // TODO(ahe): Provide these.
+      Uri fileUri = null; // TODO(ahe): Provide these.
+      library.addProblem(
+          templateTypeArgumentsOnTypeVariable.withArguments(name),
+          charOffset,
+          name.length,
+          fileUri);
+    }
+    return buildType(library, null);
+  }
+
+  TypeBuilder asTypeBuilder() {
+    return new NamedTypeBuilder(name, null)..bind(this);
+  }
+
+  void finish(
+      LibraryBuilder library, ClassBuilder object, TypeBuilder dynamicType) {
+    if (isPatch) return;
+    DartType objectType = object.buildType(library, null);
+    parameter.bound ??= bound?.build(library) ?? objectType;
+    // If defaultType is not set, initialize it to dynamic, unless the bound is
+    // explicitly specified as Object, in which case defaultType should also be
+    // Object. This makes sure instantiation of generic function types with an
+    // explicit Object bound results in Object as the instantiated type.
+    parameter.defaultType ??= defaultType?.build(library) ??
+        (bound != null && parameter.bound == objectType
+            ? objectType
+            : dynamicType.build(library));
+  }
+
+  void applyPatch(covariant TypeVariableBuilder patch) {
+    patch.actualOrigin = this;
+  }
+
+  TypeVariableBuilder clone(List<TypeBuilder> newTypes) {
+    // TODO(dmitryas): Figure out if using [charOffset] here is a good idea.
+    // An alternative is to use the offset of the node the cloned type variable
+    // is declared on.
+    return new TypeVariableBuilder(name, parent, charOffset,
+        bound: bound.clone(newTypes));
+  }
+
+  @override
+  bool operator ==(Object other) {
+    return other is TypeVariableBuilder && target == other.target;
+  }
+
+  @override
+  int get hashCode => target.hashCode;
+
+  static List<TypeParameter> kernelTypeParametersFromBuilders(
+      List<TypeVariableBuilder> builders) {
+    if (builders == null) return null;
+    List<TypeParameter> result =
+        new List<TypeParameter>.filled(builders.length, null, growable: true);
+    for (int i = 0; i < builders.length; i++) {
+      result[i] = builders[i].target;
+    }
+    return result;
+  }
 }
diff --git a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
index 9c8ce77..f80ac6e 100644
--- a/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
+++ b/pkg/front_end/lib/src/fasta/builder/unresolved_type.dart
@@ -7,8 +7,8 @@
 import 'builder.dart' show LibraryBuilder, Scope, TypeBuilder;
 
 /// A wrapper around a type that is yet to be resolved.
-class UnresolvedType<T extends TypeBuilder> {
-  final T builder;
+class UnresolvedType {
+  final TypeBuilder builder;
   final int charOffset;
   final Uri fileUri;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart
index 2ccffe5..f337f16 100644
--- a/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/void_type_builder.dart
@@ -4,11 +4,12 @@
 
 library fasta.void_type_builder;
 
-import 'builder.dart' show BuiltinTypeBuilder, LibraryBuilder, TypeBuilder;
+import 'package:kernel/ast.dart' show DartType;
 
-class VoidTypeBuilder<T extends TypeBuilder, R>
-    extends BuiltinTypeBuilder<T, R> {
-  VoidTypeBuilder(R type, LibraryBuilder compilationUnit, int charOffset)
+import 'builder.dart' show BuiltinTypeBuilder, LibraryBuilder;
+
+class VoidTypeBuilder extends BuiltinTypeBuilder {
+  VoidTypeBuilder(DartType type, LibraryBuilder compilationUnit, int charOffset)
       : super("void", type, compilationUnit, charOffset);
 
   String get debugName => "VoidTypeBuilder";
diff --git a/pkg/front_end/lib/src/fasta/colors.dart b/pkg/front_end/lib/src/fasta/colors.dart
index 00ae3b6a..c8b4812 100644
--- a/pkg/front_end/lib/src/fasta/colors.dart
+++ b/pkg/front_end/lib/src/fasta/colors.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.
 
-// TODO(ahe): Orignially copied from sdk/pkg/compiler/lib/src/colors.dart,
+// TODO(ahe): Originally copied from sdk/pkg/compiler/lib/src/colors.dart,
 // merge these two packages.
 library colors;
 
diff --git a/pkg/front_end/lib/src/fasta/command_line_reporting.dart b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
index 15778043..2f406fb 100644
--- a/pkg/front_end/lib/src/fasta/command_line_reporting.dart
+++ b/pkg/front_end/lib/src/fasta/command_line_reporting.dart
@@ -28,6 +28,8 @@
 
 import 'problems.dart' show unhandled;
 
+import 'resolve_input_uri.dart' show isWindows;
+
 import 'severity.dart' show Severity, severityPrefixes;
 
 import 'scanner/characters.dart' show $CARET, $SPACE, $TAB;
@@ -74,7 +76,8 @@
     }
 
     if (message.uri != null) {
-      String path = relativizeUri(translateSdk(message.uri));
+      String path =
+          relativizeUri(Uri.base, translateSdk(message.uri), isWindows);
       int offset = message.charOffset;
       location ??= (offset == -1 ? null : getLocation(message.uri, offset));
       if (location?.line == TreeNode.noOffset) {
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 cb12b88..c7e42fe 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
@@ -11,9 +11,8 @@
 
 import '../kernel/kernel_builder.dart'
     show
-        KernelClassBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
+        ClassBuilder,
+        TypeBuilder,
         LibraryBuilder,
         MemberBuilder,
         Scope,
@@ -25,7 +24,7 @@
 
 import 'dill_member_builder.dart' show DillMemberBuilder;
 
-class DillClassBuilder extends KernelClassBuilder {
+class DillClassBuilder extends ClassBuilder {
   final Class cls;
 
   DillClassBuilder(Class cls, DillLibraryBuilder parent)
@@ -37,6 +36,7 @@
             null,
             null,
             null,
+            null,
             new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
                 parent.scope, "class ${cls.name}", isModifiable: false),
             new Scope(<String, MemberBuilder>{}, null, null, cls.name,
@@ -55,8 +55,8 @@
 
   Uri get fileUri => cls.fileUri;
 
-  KernelTypeBuilder get supertype {
-    KernelTypeBuilder supertype = super.supertype;
+  TypeBuilder get supertype {
+    TypeBuilder supertype = super.supertype;
     if (supertype == null) {
       Supertype targetSupertype = cls.supertype;
       if (targetSupertype == null) return null;
@@ -86,7 +86,7 @@
 
   @override
   List<DartType> buildTypeArguments(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
+      LibraryBuilder library, List<TypeBuilder> arguments) {
     // For performance reasons, [typeVariables] aren't restored from [target].
     // So, if [arguments] is null, the default types should be retrieved from
     // [cls.typeParameters].
@@ -113,15 +113,15 @@
   /// superclass.
   bool get isMixinApplication => cls.isMixinApplication;
 
-  KernelTypeBuilder get mixedInType {
+  TypeBuilder get mixedInType {
     return computeTypeBuilder(library, cls.mixedInType);
   }
 
-  List<KernelTypeBuilder> get interfaces {
+  List<TypeBuilder> get interfaces {
     if (cls.implementedTypes.isEmpty) return null;
     if (super.interfaces == null) {
-      List<KernelTypeBuilder> result =
-          new List<KernelTypeBuilder>(cls.implementedTypes.length);
+      List<TypeBuilder> result =
+          new List<TypeBuilder>(cls.implementedTypes.length);
       for (int i = 0; i < result.length; i++) {
         result[i] = computeTypeBuilder(library, cls.implementedTypes[i]);
       }
@@ -130,7 +130,7 @@
     return super.interfaces;
   }
 
-  void set mixedInType(KernelTypeBuilder mixin) {
+  void set mixedInType(TypeBuilder mixin) {
     unimplemented("mixedInType=", -1, null);
   }
 }
@@ -139,7 +139,7 @@
   return cls.isAbstract ? abstractMask : 0;
 }
 
-KernelTypeBuilder computeTypeBuilder(
+TypeBuilder computeTypeBuilder(
     DillLibraryBuilder library, Supertype supertype) {
   return supertype == null
       ? null
@@ -152,8 +152,7 @@
   List<TypeVariableBuilder> result =
       new List.filled(typeParameters.length, null);
   for (int i = 0; i < result.length; i++) {
-    result[i] =
-        new KernelTypeVariableBuilder.fromKernel(typeParameters[i], library);
+    result[i] = new TypeVariableBuilder.fromKernel(typeParameters[i], library);
   }
   return result;
 }
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
index f1d4ff2..c058725 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_library_builder.dart
@@ -32,14 +32,7 @@
 import '../problems.dart' show internalProblem, unhandled, unimplemented;
 
 import '../kernel/kernel_builder.dart'
-    show
-        Declaration,
-        DynamicTypeBuilder,
-        InvalidTypeBuilder,
-        KernelInvalidTypeBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        Scope;
+    show Builder, DynamicTypeBuilder, InvalidTypeBuilder, LibraryBuilder, Scope;
 
 import '../kernel/redirecting_factory_body.dart' show RedirectingFactoryBody;
 
@@ -51,7 +44,32 @@
 
 import 'dill_type_alias_builder.dart' show DillTypeAliasBuilder;
 
-class DillLibraryBuilder extends LibraryBuilder<KernelTypeBuilder, Library> {
+class LazyLibraryScope extends Scope {
+  DillLibraryBuilder libraryBuilder;
+
+  LazyLibraryScope(Map<String, Builder> local, Map<String, Builder> setters,
+      Scope parent, String debugName,
+      {bool isModifiable: true})
+      : super(local, setters, parent, debugName, isModifiable: isModifiable);
+
+  LazyLibraryScope.top({bool isModifiable: false})
+      : this(<String, Builder>{}, <String, Builder>{}, null, "top",
+            isModifiable: isModifiable);
+
+  Map<String, Builder> get local {
+    if (libraryBuilder == null) throw new StateError("No library builder.");
+    libraryBuilder.ensureLoaded();
+    return super.local;
+  }
+
+  Map<String, Builder> get setters {
+    if (libraryBuilder == null) throw new StateError("No library builder.");
+    libraryBuilder.ensureLoaded();
+    return super.setters;
+  }
+}
+
+class DillLibraryBuilder extends LibraryBuilder {
   final Library library;
 
   DillLoader loader;
@@ -64,12 +82,46 @@
 
   bool exportsAlreadyFinalized = false;
 
+  // TODO(jensj): These 4 booleans could potentially be merged into a single
+  // state field.
+  bool isReadyToBuild = false;
+  bool isReadyToFinalizeExports = false;
+  bool isBuilt = false;
+  bool isBuiltAndMarked = false;
+
   DillLibraryBuilder(this.library, this.loader)
-      : super(library.fileUri, new Scope.top(), new Scope.top());
+      : super(library.fileUri, new LazyLibraryScope.top(),
+            new LazyLibraryScope.top()) {
+    LazyLibraryScope lazyScope = scope;
+    lazyScope.libraryBuilder = this;
+    LazyLibraryScope lazyExportScope = exportScope;
+    lazyExportScope.libraryBuilder = this;
+  }
+
+  void ensureLoaded() {
+    if (!isReadyToBuild) throw new StateError("Not ready to build.");
+    isBuiltAndMarked = true;
+    if (isBuilt) return;
+    isBuilt = true;
+    library.classes.forEach(addClass);
+    library.procedures.forEach(addMember);
+    library.typedefs.forEach(addTypedef);
+    library.fields.forEach(addMember);
+
+    if (isReadyToFinalizeExports) {
+      finalizeExports();
+    } else {
+      throw new StateError("Not ready to finalize exports.");
+    }
+  }
 
   @override
   bool get isSynthetic => library.isSynthetic;
 
+  @override
+  void setLanguageVersion(int major, int minor,
+      {int offset: 0, int length, bool explicit}) {}
+
   Uri get uri => library.importUri;
 
   Uri get fileUri => library.fileUri;
@@ -82,10 +134,7 @@
 
   void addSyntheticDeclarationOfDynamic() {
     addBuilder(
-        "dynamic",
-        new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
-            const DynamicType(), this, -1),
-        -1);
+        "dynamic", new DynamicTypeBuilder(const DynamicType(), this, -1), -1);
   }
 
   void addClass(Class cls) {
@@ -119,7 +168,7 @@
   }
 
   @override
-  Declaration addBuilder(String name, Declaration declaration, int charOffset) {
+  Builder addBuilder(String name, Builder declaration, int charOffset) {
     if (name == null || name.isEmpty) return null;
     bool isSetter = declaration.isSetter;
     if (isSetter) {
@@ -147,14 +196,13 @@
   }
 
   @override
-  void addToScope(
-      String name, Declaration member, int charOffset, bool isImport) {
+  void addToScope(String name, Builder member, int charOffset, bool isImport) {
     unimplemented("addToScope", charOffset, fileUri);
   }
 
   @override
-  Declaration computeAmbiguousDeclaration(
-      String name, Declaration builder, Declaration other, int charOffset,
+  Builder computeAmbiguousDeclaration(
+      String name, Builder builder, Builder other, int charOffset,
       {bool isExport: false, bool isImport: false}) {
     if (builder == other) return builder;
     if (builder is InvalidTypeBuilder) return builder;
@@ -165,7 +213,7 @@
     if (builder.parent == this) return builder;
     Message message = templateDuplicatedDeclaration.withArguments(name);
     addProblem(message, charOffset, name.length, fileUri);
-    return new KernelInvalidTypeBuilder(
+    return new InvalidTypeBuilder(
         name, message.withLocation(fileUri, charOffset, name.length));
   }
 
@@ -174,11 +222,19 @@
     return library.name ?? "<library '${library.fileUri}'>";
   }
 
+  void markAsReadyToBuild() {
+    isReadyToBuild = true;
+  }
+
+  void markAsReadyToFinalizeExports() {
+    isReadyToFinalizeExports = true;
+  }
+
   void finalizeExports() {
     if (exportsAlreadyFinalized) return;
     exportsAlreadyFinalized = true;
     unserializableExports?.forEach((String name, String messageText) {
-      Declaration declaration;
+      Builder declaration;
       switch (name) {
         case "dynamic":
         case "void":
@@ -192,8 +248,7 @@
               ? templateTypeNotFound.withArguments(name)
               : templateUnspecified.withArguments(messageText);
           addProblem(message, -1, noLength, null);
-          declaration =
-              new KernelInvalidTypeBuilder(name, message.withoutLocation());
+          declaration = new InvalidTypeBuilder(name, message.withoutLocation());
       }
       exportScopeBuilder.addMember(name, declaration);
     });
@@ -226,7 +281,7 @@
             -1,
             fileUri);
       }
-      Declaration declaration;
+      Builder declaration;
       if (isSetter) {
         declaration = library.exportScope.setters[name];
         exportScopeBuilder.addSetter(name, declaration);
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
index aa5785b..46d79f1 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_loader.dart
@@ -12,7 +12,7 @@
     show SummaryTemplate, Template, templateDillOutlineSummary;
 
 import '../kernel/kernel_builder.dart'
-    show KernelClassBuilder, KernelTypeBuilder, LibraryBuilder;
+    show ClassBuilder, TypeBuilder, LibraryBuilder;
 
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
 
@@ -26,7 +26,7 @@
 
 import 'dill_target.dart' show DillTarget;
 
-class DillLoader extends Loader<Library> {
+class DillLoader extends Loader {
   DillLoader(TargetImplementation target) : super(target);
 
   Template<SummaryTemplate> get outlineSummaryTemplate =>
@@ -61,10 +61,7 @@
     if (builder.library == null) {
       unhandled("null", "builder.library", 0, builder.fileUri);
     }
-    builder.library.classes.forEach(builder.addClass);
-    builder.library.procedures.forEach(builder.addMember);
-    builder.library.typedefs.forEach(builder.addTypedef);
-    builder.library.fields.forEach(builder.addMember);
+    builder.markAsReadyToBuild();
   }
 
   Future<Null> buildBody(DillLibraryBuilder builder) {
@@ -74,19 +71,19 @@
   void finalizeExports() {
     builders.forEach((Uri uri, LibraryBuilder builder) {
       DillLibraryBuilder library = builder;
-      library.finalizeExports();
+      library.markAsReadyToFinalizeExports();
     });
   }
 
   @override
-  KernelClassBuilder computeClassBuilderFromTargetClass(Class cls) {
+  ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
     Library kernelLibrary = cls.enclosingLibrary;
     LibraryBuilder library = builders[kernelLibrary.importUri];
-    return library[cls.name];
+    return library.getLocalMember(cls.name);
   }
 
   @override
-  KernelTypeBuilder computeTypeBuilder(DartType type) {
+  TypeBuilder computeTypeBuilder(DartType type) {
     return type.accept(new TypeBuilderComputer(this));
   }
 }
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 a648190..e733b84 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
@@ -9,7 +9,7 @@
 
 import '../kernel/kernel_builder.dart'
     show
-        Declaration,
+        Builder,
         MemberBuilder,
         isRedirectingGenerativeConstructorImplementation;
 
@@ -23,7 +23,7 @@
 
   final Member member;
 
-  DillMemberBuilder(Member member, Declaration parent)
+  DillMemberBuilder(Member member, Builder parent)
       : modifiers = computeModifiers(member),
         member = member,
         super(parent, member.fileOffset);
diff --git a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
index 8247cbf..dce2cac 100644
--- a/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
+++ b/pkg/front_end/lib/src/fasta/dill/dill_type_alias_builder.dart
@@ -4,13 +4,13 @@
 
 library fasta.dill_typedef_builder;
 
-import 'package:kernel/ast.dart' show DartType, Library, Typedef;
+import 'package:kernel/ast.dart' show DartType, Typedef;
 
 import '../kernel/kernel_builder.dart'
     show
-        KernelTypeAliasBuilder,
-        KernelFunctionTypeBuilder,
-        KernelTypeBuilder,
+        TypeAliasBuilder,
+        FunctionTypeBuilder,
+        TypeBuilder,
         LibraryBuilder,
         MetadataBuilder;
 
@@ -18,7 +18,7 @@
 
 import 'dill_library_builder.dart' show DillLibraryBuilder;
 
-class DillTypeAliasBuilder extends KernelTypeAliasBuilder {
+class DillTypeAliasBuilder extends TypeAliasBuilder {
   DillTypeAliasBuilder(Typedef typedef, DillLibraryBuilder parent)
       : super(null, typedef.name, null, null, parent, typedef.fileOffset,
             typedef);
@@ -31,19 +31,18 @@
   int get typeVariablesCount => target.typeParameters.length;
 
   @override
-  KernelFunctionTypeBuilder get type {
+  FunctionTypeBuilder get type {
     return unimplemented("type", -1, null);
   }
 
   @override
-  DartType buildThisType(LibraryBuilder<KernelTypeBuilder, Library> library) {
+  DartType buildThisType(LibraryBuilder library) {
     return thisType ??= target.type;
   }
 
   @override
   List<DartType> buildTypeArguments(
-      LibraryBuilder<KernelTypeBuilder, Library> library,
-      List<KernelTypeBuilder> arguments) {
+      LibraryBuilder library, List<TypeBuilder> arguments) {
     // For performance reasons, [typeVariables] aren't restored from [target].
     // So, if [arguments] is null, the default types should be retrieved from
     // [cls.typeParameters].
diff --git a/pkg/front_end/lib/src/fasta/export.dart b/pkg/front_end/lib/src/fasta/export.dart
index 476de4c..05044eb 100644
--- a/pkg/front_end/lib/src/fasta/export.dart
+++ b/pkg/front_end/lib/src/fasta/export.dart
@@ -4,7 +4,7 @@
 
 library fasta.export;
 
-import 'builder/builder.dart' show Declaration, LibraryBuilder;
+import 'builder/builder.dart' show Builder, LibraryBuilder;
 
 import 'combinator.dart' show Combinator;
 
@@ -23,7 +23,7 @@
 
   Uri get fileUri => exporter.fileUri;
 
-  bool addToExportScope(String name, Declaration member) {
+  bool addToExportScope(String name, Builder member) {
     if (combinators != null) {
       for (Combinator combinator in combinators) {
         if (combinator.isShow && !combinator.names.contains(name)) return false;
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes.dart b/pkg/front_end/lib/src/fasta/fasta_codes.dart
index 322c728..a0d556e 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes.dart
@@ -17,6 +17,8 @@
 
 import 'severity.dart' show Severity;
 
+import 'resolve_input_uri.dart' show isWindows;
+
 import 'util/relativize.dart' as util show relativizeUri;
 
 part 'fasta_codes_generated.dart';
@@ -45,7 +47,7 @@
 }
 
 class Message {
-  final Code code;
+  final Code<dynamic> code;
 
   final String message;
 
@@ -80,7 +82,7 @@
 
   Map<String, dynamic> get arguments => const <String, dynamic>{};
 
-  Code get code => this;
+  Code<dynamic> get code => this;
 
   @override
   LocatedMessage withLocation(Uri uri, int charOffset, int length) {
@@ -114,7 +116,7 @@
   const LocatedMessage(
       this.uri, this.charOffset, this.length, this.messageObject);
 
-  Code get code => messageObject.code;
+  Code<dynamic> get code => messageObject.code;
 
   String get message => messageObject.message;
 
@@ -154,7 +156,7 @@
   const FormattedMessage(this.locatedMessage, this.formatted, this.line,
       this.column, this.severity, this.relatedInformation);
 
-  Code get code => locatedMessage.code;
+  Code<dynamic> get code => locatedMessage.code;
 
   String get message => locatedMessage.message;
 
@@ -251,7 +253,7 @@
   // (otherwise, we might get an `UNUSED_IMPORT` warning).
   //
   // 2. We can change `base` argument here if needed.
-  return util.relativizeUri(uri, base: Uri.base);
+  return uri == null ? null : util.relativizeUri(Uri.base, uri, isWindows);
 }
 
 typedef SummaryTemplate = Message Function(int, int, num, num, num);
diff --git a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
index 2055984..9c46c62 100644
--- a/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
+++ b/pkg/front_end/lib/src/fasta/fasta_codes_generated.dart
@@ -1832,7 +1832,7 @@
 const MessageCode messageConstructorCyclic = const MessageCode(
     "ConstructorCyclic",
     analyzerCodes: <String>["RECURSIVE_CONSTRUCTOR_REDIRECT"],
-    message: r"""Redirecting constructers can't be cyclic.""",
+    message: r"""Redirecting constructors can't be cyclic.""",
     tip:
         r"""Try to have all constructors eventually redirect to a non-redirecting constructor.""");
 
@@ -2700,7 +2700,8 @@
 const Template<Message Function(Token token)> templateDuplicatedModifier =
     const Template<Message Function(Token token)>(
         messageTemplate: r"""The modifier '#lexeme' was already specified.""",
-        tipTemplate: r"""Try removing all but one occurence of the modifier.""",
+        tipTemplate:
+            r"""Try removing all but one occurrence of the modifier.""",
         withArguments: _withArgumentsDuplicatedModifier);
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
@@ -2714,7 +2715,7 @@
   String lexeme = token.lexeme;
   return new Message(codeDuplicatedModifier,
       message: """The modifier '${lexeme}' was already specified.""",
-      tip: """Try removing all but one occurence of the modifier.""",
+      tip: """Try removing all but one occurrence of the modifier.""",
       arguments: {'token': token});
 }
 
@@ -3615,7 +3616,7 @@
 
     When specified, the compiler can be invoked with inputs using the custom
     URI scheme. The compiler can ignore the exact location of files on disk
-    and as a result to produce output that is independendent of the absolute
+    and as a result to produce output that is independent of the absolute
     location of files on disk. This is mostly useful for integrating with
     build systems.
 
@@ -3746,6 +3747,33 @@
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Template<
+    Message Function(
+        String
+            name)> templateFfiFieldNoAnnotation = const Template<
+        Message Function(String name)>(
+    messageTemplate:
+        r"""Field '#name' requires no annotation to declare its C++ type, it is a Pointer which is represented by the same type in Dart and C++.""",
+    withArguments: _withArgumentsFfiFieldNoAnnotation);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(String name)> codeFfiFieldNoAnnotation =
+    const Code<Message Function(String name)>(
+  "FfiFieldNoAnnotation",
+  templateFfiFieldNoAnnotation,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsFfiFieldNoAnnotation(String name) {
+  if (name.isEmpty) throw 'No name provided';
+  name = demangleMixinApplicationName(name);
+  return new Message(codeFfiFieldNoAnnotation,
+      message:
+          """Field '${name}' requires no annotation to declare its C++ type, it is a Pointer which is represented by the same type in Dart and C++.""",
+      arguments: {'name': name});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
     Message Function(String name)> templateFfiNotStatic = const Template<
         Message Function(String name)>(
     messageTemplate:
@@ -6544,6 +6572,54 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeLanguageVersionInvalidInDotPackages =
+    messageLanguageVersionInvalidInDotPackages;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageLanguageVersionInvalidInDotPackages = const MessageCode(
+    "LanguageVersionInvalidInDotPackages",
+    message:
+        r"""The language version is not specified correctly in the .packages file.""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Null> codeLanguageVersionMismatchInPart =
+    messageLanguageVersionMismatchInPart;
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const MessageCode messageLanguageVersionMismatchInPart = const MessageCode(
+    "LanguageVersionMismatchInPart",
+    message:
+        r"""The language version override has to be the same in the library and its part(s).""");
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Template<
+    Message Function(
+        int count,
+        int
+            count2)> templateLanguageVersionTooHigh = const Template<
+        Message Function(int count, int count2)>(
+    messageTemplate:
+        r"""The specified language version is too high. The highest supported language version is #count.#count2.""",
+    withArguments: _withArgumentsLanguageVersionTooHigh);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+const Code<Message Function(int count, int count2)> codeLanguageVersionTooHigh =
+    const Code<Message Function(int count, int count2)>(
+  "LanguageVersionTooHigh",
+  templateLanguageVersionTooHigh,
+);
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
+Message _withArgumentsLanguageVersionTooHigh(int count, int count2) {
+  if (count == null) throw 'No count provided';
+  if (count2 == null) throw 'No count provided';
+  return new Message(codeLanguageVersionTooHigh,
+      message:
+          """The specified language version is too high. The highest supported language version is ${count}.${count2}.""",
+      arguments: {'count': count, 'count2': count2});
+}
+
+// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeLibraryDirectiveNotFirst = messageLibraryDirectiveNotFirst;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
new file mode 100644
index 0000000..cafa01b
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/flow_analysis/flow_analysis.dart
@@ -0,0 +1,1204 @@
+// 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:meta/meta.dart';
+
+/// Sets of local variables that are potentially assigned in a statement.
+///
+/// These statements are loops, `switch`, and `try` statements.
+class AssignedVariables<Statement, Variable> {
+  final emptySet = Set<Variable>();
+
+  /// Mapping from a [Statement] to the set of local variables that are
+  /// potentially assigned in that statement.
+  final Map<Statement, Set<Variable>> _map = {};
+
+  /// The stack of nested statements.
+  final List<Set<Variable>> _stack = [];
+
+  AssignedVariables();
+
+  /// Return the set of variables that are potentially assigned in the
+  /// [statement].
+  Set<Variable> operator [](Statement statement) {
+    return _map[statement] ?? emptySet;
+  }
+
+  void beginStatement() {
+    var set = Set<Variable>.identity();
+    _stack.add(set);
+  }
+
+  void endStatement(Statement node) {
+    _map[node] = _stack.removeLast();
+  }
+
+  void write(Variable variable) {
+    for (var i = 0; i < _stack.length; ++i) {
+      _stack[i].add(variable);
+    }
+  }
+}
+
+class FlowAnalysis<Statement, Expression, Variable, Type> {
+  static bool get _assertionsEnabled {
+    bool result = false;
+    assert(result = true);
+    return result;
+  }
+
+  final _VariableSet<Variable> _emptySet;
+
+  /// The [NodeOperations], used to manipulate expressions.
+  final NodeOperations<Expression> nodeOperations;
+
+  /// The [TypeOperations], used to access types, and check subtyping.
+  final TypeOperations<Variable, Type> typeOperations;
+
+  /// The enclosing function body, used to check for potential mutations.
+  final FunctionBodyAccess<Variable> functionBody;
+
+  /// The stack of states of variables that are not definitely assigned.
+  final List<FlowModel<Variable, Type>> _stack = [];
+
+  /// The mapping from labeled [Statement]s to the index in the [_stack]
+  /// where the first related element is located.  The number of elements
+  /// is statement specific.  Loops have two elements: `break` and `continue`
+  /// states.
+  final Map<Statement, int> _statementToStackIndex = {};
+
+  /// List of all variables passed to [add].
+  final List<Variable> _addedVariables = [];
+
+  FlowModel<Variable, Type> _current;
+
+  /// The last boolean condition, for [_conditionTrue] and [_conditionFalse].
+  Expression _condition;
+
+  /// The state when [_condition] evaluates to `true`.
+  FlowModel<Variable, Type> _conditionTrue;
+
+  /// The state when [_condition] evaluates to `false`.
+  FlowModel<Variable, Type> _conditionFalse;
+
+  /// If assertions are enabled, keeps track of all variables that have been
+  /// passed into the API (other than through a call to [add]).  The [finish]
+  /// method uses this to verify that the caller doesn't forget to pass a
+  /// variable to [add].
+  ///
+  /// Note: the reason we have to keep track of this set (rather than simply
+  /// checking each variable at the time it is passed into the API) is because
+  /// the client doesn't call `add` until a variable is declared, and in
+  /// erroneous code, it's possible that a variable might be used before its
+  /// declaration.
+  final Set<Variable> _referencedVariables =
+      _assertionsEnabled ? Set<Variable>() : null;
+
+  factory FlowAnalysis(
+    NodeOperations<Expression> nodeOperations,
+    TypeOperations<Variable, Type> typeOperations,
+    FunctionBodyAccess<Variable> functionBody,
+  ) {
+    var emptySet = FlowModel<Variable, Type>(false).notAssigned;
+    return FlowAnalysis._(
+      nodeOperations,
+      typeOperations,
+      functionBody,
+      emptySet,
+    );
+  }
+
+  FlowAnalysis._(
+    this.nodeOperations,
+    this.typeOperations,
+    this.functionBody,
+    this._emptySet,
+  ) {
+    _current = FlowModel<Variable, Type>(true);
+  }
+
+  /// Return `true` if the current state is reachable.
+  bool get isReachable => _current.reachable;
+
+  /// Add a new [variable], which might be already [assigned].
+  void add(Variable variable, {bool assigned: false}) {
+    _addedVariables.add(variable);
+    _current = _current.add(variable, assigned: assigned);
+  }
+
+  void booleanLiteral(Expression expression, bool value) {
+    _condition = expression;
+    if (value) {
+      _conditionTrue = _current;
+      _conditionFalse = _current.setReachable(false);
+    } else {
+      _conditionTrue = _current.setReachable(false);
+      _conditionFalse = _current;
+    }
+  }
+
+  void conditional_elseBegin(Expression conditionalExpression,
+      Expression thenExpression, bool isBool) {
+    var afterThen = _current;
+    var falseCondition = _stack.removeLast();
+
+    if (isBool) {
+      _conditionalEnd(thenExpression);
+      // Tail of the stack: falseThen, trueThen
+    }
+
+    _stack.add(afterThen);
+    _current = falseCondition;
+  }
+
+  void conditional_end(Expression conditionalExpression,
+      Expression elseExpression, bool isBool) {
+    var afterThen = _stack.removeLast();
+    var afterElse = _current;
+
+    if (isBool) {
+      _conditionalEnd(elseExpression);
+      // Tail of the stack: falseThen, trueThen, falseElse, trueElse
+
+      var trueElse = _stack.removeLast();
+      var falseElse = _stack.removeLast();
+
+      var trueThen = _stack.removeLast();
+      var falseThen = _stack.removeLast();
+
+      var trueResult = _join(trueThen, trueElse);
+      var falseResult = _join(falseThen, falseElse);
+
+      _condition = conditionalExpression;
+      _conditionTrue = trueResult;
+      _conditionFalse = falseResult;
+    }
+
+    _current = _join(afterThen, afterElse);
+  }
+
+  void conditional_thenBegin(
+      Expression conditionalExpression, Expression condition) {
+    _conditionalEnd(condition);
+    // Tail of the stack: falseCondition, trueCondition
+
+    var trueCondition = _stack.removeLast();
+    _current = trueCondition;
+  }
+
+  /// The [binaryExpression] checks that the [variable] is, or is not, equal to
+  /// `null`.
+  void conditionEqNull(Expression binaryExpression, Variable variable,
+      {bool notEqual: false}) {
+    _variableReferenced(variable);
+    if (functionBody.isPotentiallyMutatedInClosure(variable)) {
+      return;
+    }
+
+    _condition = binaryExpression;
+    var currentPromoted = _current.markNonNullable(typeOperations, variable);
+    if (notEqual) {
+      _conditionTrue = currentPromoted;
+      _conditionFalse = _current;
+    } else {
+      _conditionTrue = _current;
+      _conditionFalse = currentPromoted;
+    }
+  }
+
+  void doStatement_bodyBegin(
+      Statement doStatement, Set<Variable> loopAssigned) {
+    _variablesReferenced(loopAssigned);
+    _current = _current.removePromotedAll(loopAssigned);
+
+    _statementToStackIndex[doStatement] = _stack.length;
+    _stack.add(null); // break
+    _stack.add(null); // continue
+  }
+
+  void doStatement_conditionBegin() {
+    // Tail of the stack: break, continue
+
+    var continueState = _stack.removeLast();
+    _current = _join(_current, continueState);
+  }
+
+  void doStatement_end(Statement doStatement, Expression condition) {
+    _conditionalEnd(condition);
+    // Tail of the stack:  break, falseCondition, trueCondition
+
+    _stack.removeLast(); // trueCondition
+    var falseCondition = _stack.removeLast();
+    var breakState = _stack.removeLast();
+
+    _current = _join(falseCondition, breakState);
+  }
+
+  /// This method should be called at the conclusion of flow analysis for a top
+  /// level function or method.  Performs assertion checks.
+  void finish() {
+    assert(_stack.isEmpty);
+    assert(() {
+      var variablesNotAdded =
+          _referencedVariables.difference(Set<Variable>.from(_addedVariables));
+      assert(variablesNotAdded.isEmpty,
+          'Variables not passed to add: $variablesNotAdded');
+      return true;
+    }());
+  }
+
+  void forEachStatement_bodyBegin(Set<Variable> loopAssigned) {
+    _variablesReferenced(loopAssigned);
+    _stack.add(_current);
+    _current = _current.removePromotedAll(loopAssigned);
+  }
+
+  void forEachStatement_end() {
+    var afterIterable = _stack.removeLast();
+    _current = _join(_current, afterIterable);
+  }
+
+  void forStatement_bodyBegin(Statement node, Expression condition) {
+    _conditionalEnd(condition);
+    // Tail of the stack: falseCondition, trueCondition
+
+    var trueCondition = _stack.removeLast();
+
+    _statementToStackIndex[node] = _stack.length;
+    _stack.add(null); // break
+    _stack.add(null); // continue
+
+    _current = trueCondition;
+  }
+
+  void forStatement_conditionBegin(Set<Variable> loopAssigned) {
+    _variablesReferenced(loopAssigned);
+    _current = _current.removePromotedAll(loopAssigned);
+  }
+
+  void forStatement_end() {
+    // Tail of the stack: falseCondition, break
+    var breakState = _stack.removeLast();
+    var falseCondition = _stack.removeLast();
+
+    _current = _join(falseCondition, breakState);
+  }
+
+  void forStatement_updaterBegin() {
+    // Tail of the stack: falseCondition, break, continue
+    var afterBody = _current;
+    var continueState = _stack.removeLast();
+
+    _current = _join(afterBody, continueState);
+  }
+
+  void functionExpression_begin() {
+    _stack.add(_current);
+
+    Set<Variable> notPromoted = null;
+    for (var entry in _current.promoted.entries) {
+      var variable = entry.key;
+      var promotedType = entry.value;
+      if (promotedType != null &&
+          functionBody.isPotentiallyMutatedInScope(variable)) {
+        notPromoted ??= Set<Variable>.identity();
+        notPromoted.add(variable);
+      }
+    }
+
+    if (notPromoted != null) {
+      _current = _current.removePromotedAll(notPromoted);
+    }
+  }
+
+  void functionExpression_end() {
+    _current = _stack.removeLast();
+  }
+
+  void handleBreak(Statement target) {
+    var breakIndex = _statementToStackIndex[target];
+    if (breakIndex != null) {
+      _stack[breakIndex] = _join(_stack[breakIndex], _current);
+    }
+    _current = _current.setReachable(false);
+  }
+
+  void handleContinue(Statement target) {
+    var breakIndex = _statementToStackIndex[target];
+    if (breakIndex != null) {
+      var continueIndex = breakIndex + 1;
+      _stack[continueIndex] = _join(_stack[continueIndex], _current);
+    }
+    _current = _current.setReachable(false);
+  }
+
+  /// Register the fact that the current state definitely exists, e.g. returns
+  /// from the body, throws an exception, etc.
+  void handleExit() {
+    _current = _current.setReachable(false);
+  }
+
+  void ifNullExpression_end() {
+    var afterLeft = _stack.removeLast();
+    _current = _join(_current, afterLeft);
+  }
+
+  void ifNullExpression_rightBegin() {
+    _stack.add(_current); // afterLeft
+  }
+
+  void ifStatement_elseBegin() {
+    var afterThen = _current;
+    var falseCondition = _stack.removeLast();
+    _stack.add(afterThen);
+    _current = falseCondition;
+  }
+
+  void ifStatement_end(bool hasElse) {
+    FlowModel<Variable, Type> afterThen;
+    FlowModel<Variable, Type> afterElse;
+    if (hasElse) {
+      afterThen = _stack.removeLast();
+      afterElse = _current;
+    } else {
+      afterThen = _current; // no `else`, so `then` is still current
+      afterElse = _stack.removeLast(); // `falseCond` is still on the stack
+    }
+    _current = _join(afterThen, afterElse);
+  }
+
+  void ifStatement_thenBegin(Expression condition) {
+    _conditionalEnd(condition);
+    // Tail of the stack:  falseCondition, trueCondition
+
+    var trueCondition = _stack.removeLast();
+    _current = trueCondition;
+  }
+
+  /// Return whether the [variable] is definitely assigned in the current state.
+  bool isAssigned(Variable variable) {
+    _variableReferenced(variable);
+    return !_current.notAssigned.contains(variable);
+  }
+
+  void isExpression_end(
+      Expression isExpression, Variable variable, bool isNot, Type type) {
+    _variableReferenced(variable);
+    if (functionBody.isPotentiallyMutatedInClosure(variable)) {
+      return;
+    }
+
+    _condition = isExpression;
+    if (isNot) {
+      _conditionTrue = _current;
+      _conditionFalse = _current.promote(typeOperations, variable, type);
+    } else {
+      _conditionTrue = _current.promote(typeOperations, variable, type);
+      _conditionFalse = _current;
+    }
+  }
+
+  void logicalAnd_end(Expression andExpression, Expression rightOperand) {
+    _conditionalEnd(rightOperand);
+    // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
+
+    var trueRight = _stack.removeLast();
+    var falseRight = _stack.removeLast();
+
+    _stack.removeLast(); // trueLeft is not used
+    var falseLeft = _stack.removeLast();
+
+    var trueResult = trueRight;
+    var falseResult = _join(falseLeft, falseRight);
+    var afterResult = _join(trueResult, falseResult);
+
+    _condition = andExpression;
+    _conditionTrue = trueResult;
+    _conditionFalse = falseResult;
+
+    _current = afterResult;
+  }
+
+  void logicalAnd_rightBegin(Expression andExpression, Expression leftOperand) {
+    _conditionalEnd(leftOperand);
+    // Tail of the stack: falseLeft, trueLeft
+
+    var trueLeft = _stack.last;
+    _current = trueLeft;
+  }
+
+  void logicalNot_end(Expression notExpression, Expression operand) {
+    _conditionalEnd(operand);
+    var trueExpr = _stack.removeLast();
+    var falseExpr = _stack.removeLast();
+
+    _condition = notExpression;
+    _conditionTrue = falseExpr;
+    _conditionFalse = trueExpr;
+  }
+
+  void logicalOr_end(Expression orExpression, Expression rightOperand) {
+    _conditionalEnd(rightOperand);
+    // Tail of the stack: falseLeft, trueLeft, falseRight, trueRight
+
+    var trueRight = _stack.removeLast();
+    var falseRight = _stack.removeLast();
+
+    var trueLeft = _stack.removeLast();
+    _stack.removeLast(); // falseLeft is not used
+
+    var trueResult = _join(trueLeft, trueRight);
+    var falseResult = falseRight;
+    var afterResult = _join(trueResult, falseResult);
+
+    _condition = orExpression;
+    _conditionTrue = trueResult;
+    _conditionFalse = falseResult;
+
+    _current = afterResult;
+  }
+
+  void logicalOr_rightBegin(Expression orExpression, Expression leftOperand) {
+    _conditionalEnd(leftOperand);
+    // Tail of the stack: falseLeft, trueLeft
+
+    var falseLeft = _stack[_stack.length - 2];
+    _current = falseLeft;
+  }
+
+  /// Retrieves the type that the [variable] is promoted to, if the [variable]
+  /// is currently promoted.  Otherwise returns `null`.
+  Type promotedType(Variable variable) {
+    _variableReferenced(variable);
+    return _current.promoted[variable];
+  }
+
+  /// The [notPromoted] set contains all variables that are potentially
+  /// assigned in other cases that might target this with `continue`, so
+  /// these variables might have different types and are "un-promoted" from
+  /// the "afterExpression" state.
+  void switchStatement_beginCase(Set<Variable> notPromoted) {
+    _variablesReferenced(notPromoted);
+    _current = _stack.last.removePromotedAll(notPromoted);
+  }
+
+  void switchStatement_end(Statement switchStatement, bool hasDefault) {
+    // Tail of the stack: break, continue, afterExpression
+    var afterExpression = _current = _stack.removeLast();
+    _stack.removeLast(); // continue
+    var breakState = _stack.removeLast();
+
+    if (hasDefault) {
+      // breakState should not be null because we should have joined it with
+      // something non-null when handling the default case.
+      assert(breakState != null);
+      _current = breakState;
+    } else {
+      _current = _join(breakState, afterExpression);
+    }
+  }
+
+  void switchStatement_expressionEnd(Statement switchStatement) {
+    _statementToStackIndex[switchStatement] = _stack.length;
+    _stack.add(null); // break
+    _stack.add(null); // continue
+    _stack.add(_current); // afterExpression
+  }
+
+  void tryCatchStatement_bodyBegin() {
+    _stack.add(_current);
+    // Tail of the stack: beforeBody
+  }
+
+  void tryCatchStatement_bodyEnd(Set<Variable> assignedInBody) {
+    _variablesReferenced(assignedInBody);
+    var beforeBody = _stack.removeLast();
+    var beforeCatch = beforeBody.removePromotedAll(assignedInBody);
+    _stack.add(beforeCatch);
+    _stack.add(_current); // afterBodyAndCatches
+    // Tail of the stack: beforeCatch, afterBodyAndCatches
+  }
+
+  void tryCatchStatement_catchBegin() {
+    var beforeCatch = _stack[_stack.length - 2];
+    _current = beforeCatch;
+  }
+
+  void tryCatchStatement_catchEnd() {
+    var afterBodyAndCatches = _stack.last;
+    _stack.last = _join(afterBodyAndCatches, _current);
+  }
+
+  void tryCatchStatement_end() {
+    var afterBodyAndCatches = _stack.removeLast();
+    _stack.removeLast(); // beforeCatch
+    _current = afterBodyAndCatches;
+  }
+
+  void tryFinallyStatement_bodyBegin() {
+    _stack.add(_current); // beforeTry
+  }
+
+  void tryFinallyStatement_end(Set<Variable> assignedInFinally) {
+    _variablesReferenced(assignedInFinally);
+    var afterBody = _stack.removeLast();
+    _current = _current.restrict(
+      typeOperations,
+      _emptySet,
+      afterBody,
+      assignedInFinally,
+    );
+  }
+
+  void tryFinallyStatement_finallyBegin(Set<Variable> assignedInBody) {
+    _variablesReferenced(assignedInBody);
+    var beforeTry = _stack.removeLast();
+    var afterBody = _current;
+    _stack.add(afterBody);
+    _current = _join(afterBody, beforeTry.removePromotedAll(assignedInBody));
+  }
+
+  void whileStatement_bodyBegin(
+      Statement whileStatement, Expression condition) {
+    _conditionalEnd(condition);
+    // Tail of the stack: falseCondition, trueCondition
+
+    var trueCondition = _stack.removeLast();
+
+    _statementToStackIndex[whileStatement] = _stack.length;
+    _stack.add(null); // break
+    _stack.add(null); // continue
+
+    _current = trueCondition;
+  }
+
+  void whileStatement_conditionBegin(Set<Variable> loopAssigned) {
+    _variablesReferenced(loopAssigned);
+    _current = _current.removePromotedAll(loopAssigned);
+  }
+
+  void whileStatement_end() {
+    _stack.removeLast(); // continue
+    var breakState = _stack.removeLast();
+    var falseCondition = _stack.removeLast();
+
+    _current = _join(falseCondition, breakState);
+  }
+
+  /// Register write of the given [variable] in the current state.
+  void write(Variable variable) {
+    _variableReferenced(variable);
+    _current = _current.write(typeOperations, _emptySet, variable);
+  }
+
+  void _conditionalEnd(Expression condition) {
+    condition = nodeOperations.unwrapParenthesized(condition);
+    if (identical(condition, _condition)) {
+      _stack.add(_conditionFalse);
+      _stack.add(_conditionTrue);
+    } else {
+      _stack.add(_current);
+      _stack.add(_current);
+    }
+  }
+
+  FlowModel<Variable, Type> _join(
+          FlowModel<Variable, Type> first, FlowModel<Variable, Type> second) =>
+      FlowModel.join(typeOperations, first, second);
+
+  /// If assertions are enabled, records that the given variable has been
+  /// referenced.  The [finish] method will verify that all referenced variables
+  /// were eventually passed to [add].
+  void _variableReferenced(Variable variable) {
+    assert(() {
+      _referencedVariables.add(variable);
+      return true;
+    }());
+  }
+
+  /// If assertions are enabled, records that the given variables have been
+  /// referenced.  The [finish] method will verify that all referenced variables
+  /// were eventually passed to [add].
+  void _variablesReferenced(Iterable<Variable> variables) {
+    assert(() {
+      _referencedVariables.addAll(variables);
+      return true;
+    }());
+  }
+}
+
+/// An instance of the [FlowModel] class represents the information gathered by
+/// flow analysis at a single point in the control flow of the function or
+/// method being analyzed.
+///
+/// Instances of this class are immutable, so the methods below that "update"
+/// the state actually leave `this` unchanged and return a new state object.
+@visibleForTesting
+class FlowModel<Variable, Type> {
+  /// Indicates whether this point in the control flow is reachable.
+  final bool reachable;
+
+  /// The set of variables that are not yet definitely assigned at this point in
+  /// the control flow.
+  final _VariableSet<Variable> notAssigned;
+
+  /// For each variable being tracked by flow analysis, the variable's promoted
+  /// type, or `null` if the variable's type is not promoted.
+  ///
+  /// Flow analysis has no awareness of scope, so variables that are out of
+  /// scope are retained in the map until such time as their declaration no
+  /// longer dominates the control flow.  So, for example, if a variable is
+  /// declared and then promoted inside the `then` branch of an `if` statement,
+  /// and the `else` branch of the `if` statement ends in a `return` statement,
+  /// then the variable remains in the map after the `if` statement ends, even
+  /// though the variable is not in scope anymore.  This should not have any
+  /// effect on analysis results for error-free code, because it is an error to
+  /// refer to a variable that is no longer in scope.
+  final Map<Variable, Type> promoted;
+
+  /// Creates a state object with the given [reachable] status.  All variables
+  /// are assumed to be unpromoted and already assigned, so joining another
+  /// state with this one will have no effect on it.
+  FlowModel(bool reachable)
+      : this._(
+          reachable,
+          _VariableSet<Variable>._(const []),
+          const {},
+        );
+
+  FlowModel._(
+    this.reachable,
+    this.notAssigned,
+    this.promoted,
+  );
+
+  /// Updates the state to track a newly declared local [variable].  The
+  /// optional [assigned] boolean indicates whether the variable is assigned at
+  /// the point of declaration.
+  FlowModel<Variable, Type> add(Variable variable, {bool assigned: false}) {
+    var newNotAssigned = assigned ? notAssigned : notAssigned.add(variable);
+    var newPromoted = Map<Variable, Type>.from(promoted);
+    newPromoted[variable] = null;
+
+    return FlowModel<Variable, Type>._(
+      reachable,
+      newNotAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Updates the state to indicate that the given [variable] has been
+  /// determined to contain a non-null value.
+  ///
+  /// TODO(paulberry): should this method mark the variable as definitely
+  /// assigned?  Does it matter?
+  FlowModel<Variable, Type> markNonNullable(
+      TypeOperations<Variable, Type> typeOperations, Variable variable) {
+    var previousType = promoted[variable];
+    previousType ??= typeOperations.variableType(variable);
+    var type = typeOperations.promoteToNonNull(previousType);
+
+    if (!typeOperations.isSameType(type, previousType)) {
+      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      newPromoted[variable] = type;
+      return FlowModel<Variable, Type>._(
+        reachable,
+        notAssigned,
+        newPromoted,
+      );
+    }
+
+    return this;
+  }
+
+  /// Updates the state to indicate that the given [variable] has been
+  /// determined to satisfy the given [type], e.g. as a consequence of an `is`
+  /// expression as the condition of an `if` statement.
+  ///
+  /// Note that the state is only changed if [type] is a subtype of the
+  /// variable's previous (possibly promoted) type.
+  ///
+  /// TODO(paulberry): if the type is non-nullable, should this method mark the
+  /// variable as definitely assigned?  Does it matter?
+  FlowModel<Variable, Type> promote(
+    TypeOperations<Variable, Type> typeOperations,
+    Variable variable,
+    Type type,
+  ) {
+    var previousType = promoted[variable];
+    previousType ??= typeOperations.variableType(variable);
+
+    if (typeOperations.isSubtypeOf(type, previousType) &&
+        !typeOperations.isSameType(type, previousType)) {
+      var newPromoted = <Variable, Type>{}..addAll(promoted);
+      newPromoted[variable] = type;
+      return FlowModel<Variable, Type>._(
+        reachable,
+        notAssigned,
+        newPromoted,
+      );
+    }
+
+    return this;
+  }
+
+  /// Updates the state to indicate that the given [variables] are no longer
+  /// promoted; they are presumed to have their declared types.
+  ///
+  /// This is used at the top of loops to conservatively cancel the promotion of
+  /// variables that are modified within the loop, so that we correctly analyze
+  /// code like the following:
+  ///
+  ///     if (x is int) {
+  ///       x.isEven; // OK, promoted to int
+  ///       while (true) {
+  ///         x.isEven; // ERROR: promotion lost
+  ///         x = 'foo';
+  ///       }
+  ///     }
+  ///
+  /// Note that a more accurate analysis would be to iterate to a fixed point,
+  /// and only remove promotions if it can be shown that they aren't restored
+  /// later in the loop body.  If we switch to a fixed point analysis, we should
+  /// be able to remove this method.
+  FlowModel<Variable, Type> removePromotedAll(Set<Variable> variables) {
+    var newPromoted = _removePromotedAll(promoted, variables);
+
+    if (identical(newPromoted, promoted)) return this;
+
+    return FlowModel<Variable, Type>._(
+      reachable,
+      notAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Updates the state to reflect a control path that is known to have
+  /// previously passed through some [other] state.
+  ///
+  /// Approximately, this method forms the union of the definite assignments and
+  /// promotions in `this` state and the [other] state.  More precisely:
+  ///
+  /// The control flow path is considered reachable if both this state and the
+  /// other state are reachable.  Variables are considered definitely assigned
+  /// if they were definitely assigned in either this state or the other state.
+  /// Variable type promotions are taken from this state, unless the promotion
+  /// in the other state is more specific, and the variable is "safe".  A
+  /// variable is considered safe if there is no chance that it was assigned
+  /// more recently than the "other" state.
+  ///
+  /// This is used after a `try/finally` statement to combine the promotions and
+  /// definite assignments that occurred in the `try` and `finally` blocks
+  /// (where `this` is the state from the `finally` block and `other` is the
+  /// state from the `try` block).  Variables that are assigned in the `finally`
+  /// block are considered "unsafe" because the assignment might have cancelled
+  /// the effect of any promotion that occurred inside the `try` block.
+  FlowModel<Variable, Type> restrict(
+    TypeOperations<Variable, Type> typeOperations,
+    _VariableSet<Variable> emptySet,
+    FlowModel<Variable, Type> other,
+    Set<Variable> unsafe,
+  ) {
+    var newReachable = reachable && other.reachable;
+    var newNotAssigned = notAssigned.intersect(
+      empty: emptySet,
+      other: other.notAssigned,
+    );
+    if (newNotAssigned.variables.length == notAssigned.variables.length) {
+      newNotAssigned = notAssigned;
+    } else if (newNotAssigned.variables.length ==
+        other.notAssigned.variables.length) {
+      newNotAssigned = other.notAssigned;
+    }
+
+    var newPromoted = <Variable, Type>{};
+    bool promotedMatchesThis = true;
+    bool promotedMatchesOther = other.promoted.length == promoted.length;
+    for (var entry in promoted.entries) {
+      var variable = entry.key;
+      var thisType = entry.value;
+      var otherType = other.promoted[variable];
+      if (!unsafe.contains(variable)) {
+        if (otherType != null &&
+            (thisType == null ||
+                typeOperations.isSubtypeOf(otherType, thisType))) {
+          newPromoted[variable] = otherType;
+          if (promotedMatchesThis &&
+              (thisType == null ||
+                  !typeOperations.isSameType(thisType, otherType))) {
+            promotedMatchesThis = false;
+          }
+          continue;
+        }
+      }
+      if (thisType != null) {
+        newPromoted[variable] = thisType;
+        if (promotedMatchesOther &&
+            (otherType == null ||
+                !typeOperations.isSameType(thisType, otherType))) {
+          promotedMatchesOther = false;
+        }
+      } else {
+        newPromoted[variable] = null;
+        if (promotedMatchesOther && otherType != null) {
+          promotedMatchesOther = false;
+        }
+      }
+    }
+    assert(promotedMatchesThis ==
+        _promotionsEqual(typeOperations, newPromoted, promoted));
+    assert(promotedMatchesOther ==
+        _promotionsEqual(typeOperations, newPromoted, other.promoted));
+    if (promotedMatchesThis) {
+      newPromoted = promoted;
+    } else if (promotedMatchesOther) {
+      newPromoted = other.promoted;
+    }
+
+    return _identicalOrNew(
+      this,
+      other,
+      newReachable,
+      newNotAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Updates the state to indicate whether the control flow path is
+  /// [reachable].
+  FlowModel<Variable, Type> setReachable(bool reachable) {
+    if (this.reachable == reachable) return this;
+
+    return FlowModel<Variable, Type>._(
+      reachable,
+      notAssigned,
+      promoted,
+    );
+  }
+
+  @override
+  String toString() => '($reachable, $notAssigned, $promoted)';
+
+  /// Updates the state to indicate that an assignment was made to the given
+  /// [variable].  The variable is marked as definitely assigned, and any
+  /// previous type promotion is removed.
+  ///
+  /// TODO(paulberry): allow for writes that preserve type promotions.
+  FlowModel<Variable, Type> write(TypeOperations<Variable, Type> typeOperations,
+      _VariableSet<Variable> emptySet, Variable variable) {
+    var newNotAssigned = typeOperations.isLocalVariable(variable)
+        ? notAssigned.remove(emptySet, variable)
+        : notAssigned;
+
+    var newPromoted = _removePromoted(promoted, variable);
+
+    if (identical(newNotAssigned, notAssigned) &&
+        identical(newPromoted, promoted)) {
+      return this;
+    }
+
+    return FlowModel<Variable, Type>._(
+      reachable,
+      newNotAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Removes a [variable] from a "promoted" [map], treating the map as
+  /// immutable.
+  Map<Variable, Type> _removePromoted(
+      Map<Variable, Type> map, Variable variable) {
+    if (map[variable] == null) return map;
+
+    var result = Map<Variable, Type>.from(map);
+    result[variable] = null;
+    return result;
+  }
+
+  /// Removes a set of [variable]s from a "promoted" [map], treating the map as
+  /// immutable.
+  Map<Variable, Type> _removePromotedAll(
+    Map<Variable, Type> map,
+    Set<Variable> variables,
+  ) {
+    if (map.isEmpty) return const {};
+    if (variables.isEmpty) return map;
+
+    var result = <Variable, Type>{};
+    var noChanges = true;
+    for (var entry in map.entries) {
+      var variable = entry.key;
+      var promotedType = entry.value;
+      if (variables.contains(variable) && promotedType != null) {
+        result[variable] = null;
+        noChanges = false;
+      } else {
+        result[variable] = promotedType;
+      }
+    }
+
+    if (noChanges) return map;
+    if (result.isEmpty) return const {};
+    return result;
+  }
+
+  /// Forms a new state to reflect a control flow path that might have come from
+  /// either `this` or the [other] state.
+  ///
+  /// The control flow path is considered reachable if either of the input
+  /// states is reachable.  Variables are considered definitely assigned if they
+  /// were definitely assigned in both of the input states.  Variable promotions
+  /// are kept only if they are common to both input states; if a variable is
+  /// promoted to one type in one state and a subtype in the other state, the
+  /// less specific type promotion is kept.
+  static FlowModel<Variable, Type> join<Variable, Type>(
+    TypeOperations<Variable, Type> typeOperations,
+    FlowModel<Variable, Type> first,
+    FlowModel<Variable, Type> second,
+  ) {
+    if (first == null) return second;
+    if (second == null) return first;
+
+    if (first.reachable && !second.reachable) return first;
+    if (!first.reachable && second.reachable) return second;
+
+    var newReachable = first.reachable || second.reachable;
+    var newNotAssigned = first.notAssigned.union(second.notAssigned);
+    var newPromoted =
+        FlowModel.joinPromoted(typeOperations, first.promoted, second.promoted);
+
+    return FlowModel._identicalOrNew(
+      first,
+      second,
+      newReachable,
+      newNotAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Joins two "promoted" maps.  See [join] for details.
+  @visibleForTesting
+  static Map<Variable, Type> joinPromoted<Variable, Type>(
+    TypeOperations<Variable, Type> typeOperations,
+    Map<Variable, Type> first,
+    Map<Variable, Type> second,
+  ) {
+    if (identical(first, second)) return first;
+    if (first.isEmpty || second.isEmpty) return const {};
+
+    var result = <Variable, Type>{};
+    var alwaysFirst = true;
+    var alwaysSecond = true;
+    for (var entry in first.entries) {
+      var variable = entry.key;
+      if (!second.containsKey(variable)) {
+        alwaysFirst = false;
+      } else {
+        var firstType = entry.value;
+        var secondType = second[variable];
+        if (identical(firstType, secondType)) {
+          result[variable] = firstType;
+        } else if (firstType == null) {
+          result[variable] = null;
+          alwaysSecond = false;
+        } else if (secondType == null) {
+          result[variable] = null;
+          alwaysFirst = false;
+        } else if (typeOperations.isSubtypeOf(firstType, secondType)) {
+          result[variable] = secondType;
+          alwaysFirst = false;
+        } else if (typeOperations.isSubtypeOf(secondType, firstType)) {
+          result[variable] = firstType;
+          alwaysSecond = false;
+        } else {
+          result[variable] = null;
+          alwaysFirst = false;
+          alwaysSecond = false;
+        }
+      }
+    }
+
+    if (alwaysFirst) return first;
+    if (alwaysSecond && result.length == second.length) return second;
+    if (result.isEmpty) return const {};
+    return result;
+  }
+
+  /// Creates a new [FlowModel] object, unless it is equivalent to either
+  /// [first] or [second], in which case one of those objects is re-used.
+  static FlowModel<Variable, Type> _identicalOrNew<Variable, Type>(
+    FlowModel<Variable, Type> first,
+    FlowModel<Variable, Type> second,
+    bool newReachable,
+    _VariableSet<Variable> newNotAssigned,
+    Map<Variable, Type> newPromoted,
+  ) {
+    if (first.reachable == newReachable &&
+        identical(first.notAssigned, newNotAssigned) &&
+        identical(first.promoted, newPromoted)) {
+      return first;
+    }
+    if (second.reachable == newReachable &&
+        identical(second.notAssigned, newNotAssigned) &&
+        identical(second.promoted, newPromoted)) {
+      return second;
+    }
+
+    return FlowModel<Variable, Type>._(
+      newReachable,
+      newNotAssigned,
+      newPromoted,
+    );
+  }
+
+  /// Determines whether the given "promoted" maps are equivalent.
+  static bool _promotionsEqual<Variable, Type>(
+      TypeOperations<Variable, Type> typeOperations,
+      Map<Variable, Type> p1,
+      Map<Variable, Type> p2) {
+    if (p1.length != p2.length) return false;
+    if (!p1.keys.toSet().containsAll(p2.keys)) return false;
+    for (var entry in p1.entries) {
+      var p1Value = entry.value;
+      var p2Value = p2[entry.key];
+      if (p1Value == null) {
+        if (p2Value != null) return false;
+      } else {
+        if (p2Value == null) return false;
+        if (!typeOperations.isSameType(p1Value, p2Value)) return false;
+      }
+    }
+    return true;
+  }
+}
+
+/// Accessor for function body information.
+abstract class FunctionBodyAccess<Variable> {
+  bool isPotentiallyMutatedInClosure(Variable variable);
+
+  bool isPotentiallyMutatedInScope(Variable variable);
+}
+
+/// Operations on nodes, abstracted from concrete node interfaces.
+abstract class NodeOperations<Expression> {
+  /// If the [node] is a parenthesized expression, recursively unwrap it.
+  Expression unwrapParenthesized(Expression node);
+}
+
+/// Operations on types, abstracted from concrete type interfaces.
+abstract class TypeOperations<Variable, Type> {
+  /// Return `true` if the [variable] is a local variable, not a parameter.
+  bool isLocalVariable(Variable variable);
+
+  /// Returns `true` if [type1] and [type2] are the same type.
+  bool isSameType(Type type1, Type type2);
+
+  /// Return `true` if the [leftType] is a subtype of the [rightType].
+  bool isSubtypeOf(Type leftType, Type rightType);
+
+  /// Returns the non-null promoted version of [type].
+  ///
+  /// Note that some types don't have a non-nullable version (e.g.
+  /// `FutureOr<int?>`), so [type] may be returned even if it is nullable.
+  Type /*!*/ promoteToNonNull(Type type);
+
+  /// Return the static type of the given [variable].
+  Type variableType(Variable variable);
+}
+
+/// List based immutable set of variables.
+class _VariableSet<Variable> {
+  final List<Variable> variables;
+
+  _VariableSet._(this.variables);
+
+  _VariableSet<Variable> add(Variable addedVariable) {
+    if (contains(addedVariable)) {
+      return this;
+    }
+
+    var length = variables.length;
+    var newVariables = List<Variable>(length + 1);
+    for (var i = 0; i < length; ++i) {
+      newVariables[i] = variables[i];
+    }
+    newVariables[length] = addedVariable;
+    return _VariableSet._(newVariables);
+  }
+
+  _VariableSet<Variable> addAll(Iterable<Variable> variables) {
+    var result = this;
+    for (var variable in variables) {
+      result = result.add(variable);
+    }
+    return result;
+  }
+
+  bool contains(Variable variable) {
+    var length = variables.length;
+    for (var i = 0; i < length; ++i) {
+      if (identical(variables[i], variable)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  _VariableSet<Variable> intersect({
+    _VariableSet<Variable> empty,
+    _VariableSet<Variable> other,
+  }) {
+    if (identical(other, empty)) return empty;
+    if (identical(this, other)) return this;
+
+    // TODO(scheglov) optimize
+    var newVariables =
+        variables.toSet().intersection(other.variables.toSet()).toList();
+
+    if (newVariables.isEmpty) return empty;
+    return _VariableSet._(newVariables);
+  }
+
+  _VariableSet<Variable> remove(
+    _VariableSet<Variable> empty,
+    Variable removedVariable,
+  ) {
+    if (!contains(removedVariable)) {
+      return this;
+    }
+
+    var length = variables.length;
+    if (length == 1) {
+      return empty;
+    }
+
+    var newVariables = List<Variable>(length - 1);
+    var newIndex = 0;
+    for (var i = 0; i < length; ++i) {
+      var variable = variables[i];
+      if (!identical(variable, removedVariable)) {
+        newVariables[newIndex++] = variable;
+      }
+    }
+
+    return _VariableSet._(newVariables);
+  }
+
+  @override
+  String toString() => variables.isEmpty ? '{}' : '{ ${variables.join(', ')} }';
+
+  _VariableSet<Variable> union(_VariableSet<Variable> other) {
+    if (other.variables.isEmpty) {
+      return this;
+    }
+
+    var result = this;
+    var otherVariables = other.variables;
+    for (var i = 0; i < otherVariables.length; ++i) {
+      var otherVariable = otherVariables[i];
+      result = result.add(otherVariable);
+    }
+    return result;
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
index 4b388a3..84d1cbd 100644
--- a/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
+++ b/pkg/front_end/lib/src/fasta/hybrid_file_system.dart
@@ -13,7 +13,7 @@
 import '../api_prototype/standard_file_system.dart';
 
 /// A file system that mixes files from memory and a physical file system. All
-/// memory entities take priotity over file system entities.
+/// memory entities take priority over file system entities.
 class HybridFileSystem implements FileSystem {
   final MemoryFileSystem memory;
   final FileSystem physical;
@@ -26,7 +26,7 @@
       new HybridFileSystemEntity(uri, this);
 }
 
-/// Entity that delegates to an underlying memory or phisical file system
+/// Entity that delegates to an underlying memory or physical file system
 /// entity.
 class HybridFileSystemEntity implements FileSystemEntity {
   final Uri uri;
diff --git a/pkg/front_end/lib/src/fasta/import.dart b/pkg/front_end/lib/src/fasta/import.dart
index b15bce3..af6a7fb 100644
--- a/pkg/front_end/lib/src/fasta/import.dart
+++ b/pkg/front_end/lib/src/fasta/import.dart
@@ -6,12 +6,12 @@
 
 import 'package:kernel/ast.dart' show LibraryDependency;
 
-import 'builder/builder.dart' show Declaration, LibraryBuilder;
+import 'builder/builder.dart' show Builder, LibraryBuilder;
+
+import 'builder/prefix_builder.dart' show PrefixBuilder;
 
 import 'kernel/kernel_builder.dart' show toKernelCombinators;
 
-import 'kernel/kernel_prefix_builder.dart' show KernelPrefixBuilder;
-
 import 'combinator.dart' show Combinator;
 
 import 'configuration.dart' show Configuration;
@@ -23,7 +23,7 @@
   /// The library being imported.
   final LibraryBuilder imported;
 
-  final KernelPrefixBuilder prefixBuilder;
+  final PrefixBuilder prefixBuilder;
 
   final bool deferred;
 
@@ -59,17 +59,17 @@
 
   void finalizeImports(LibraryBuilder importer) {
     if (nativeImportPath != null) return;
-    void Function(String, Declaration) add;
+    void Function(String, Builder) add;
     if (prefixBuilder == null) {
-      add = (String name, Declaration member) {
+      add = (String name, Builder member) {
         importer.addToScope(name, member, charOffset, true);
       };
     } else {
-      add = (String name, Declaration member) {
+      add = (String name, Builder member) {
         prefixBuilder.addToExportScope(name, member, charOffset);
       };
     }
-    imported.exportScope.forEach((String name, Declaration member) {
+    imported.exportScope.forEach((String name, Builder member) {
       if (combinators != null) {
         for (Combinator combinator in combinators) {
           if (combinator.isShow && !combinator.names.contains(name)) return;
@@ -79,7 +79,7 @@
       add(name, member);
     });
     if (prefixBuilder != null) {
-      Declaration existing =
+      Builder existing =
           importer.addBuilder(prefix, prefixBuilder, prefixCharOffset);
       if (existing == prefixBuilder) {
         importer.addToScope(prefix, prefixBuilder, prefixCharOffset, true);
@@ -88,7 +88,7 @@
   }
 }
 
-KernelPrefixBuilder createPrefixBuilder(
+PrefixBuilder createPrefixBuilder(
     String prefix,
     LibraryBuilder importer,
     LibraryBuilder imported,
@@ -104,6 +104,6 @@
         combinators: toKernelCombinators(combinators))
       ..fileOffset = charOffset;
   }
-  return new KernelPrefixBuilder(
+  return new PrefixBuilder(
       prefix, deferred, importer, dependency, prefixCharOffset, importIndex);
 }
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 87f7acd1..14a8d00 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -15,7 +15,10 @@
         CanonicalNameSdkError,
         InvalidKernelVersionError;
 
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/class_hierarchy.dart'
+    show ClassHierarchy, ClosedWorldClassHierarchy;
+
+import 'package:kernel/core_types.dart' show CoreTypes;
 
 import 'package:kernel/kernel.dart'
     show
@@ -32,6 +35,7 @@
         ProcedureKind,
         ReturnStatement,
         Source,
+        Supertype,
         TreeNode,
         TypeParameter;
 
@@ -68,7 +72,7 @@
 
 import 'hybrid_file_system.dart' show HybridFileSystem;
 
-import 'kernel/kernel_library_builder.dart' show KernelLibraryBuilder;
+import 'kernel/kernel_builder.dart' show ClassHierarchyBuilder;
 
 import 'kernel/kernel_shadow_ast.dart' show VariableDeclarationJudgment;
 
@@ -90,6 +94,8 @@
   final Ticker ticker;
 
   final bool outlineOnly;
+  bool trackNeededDillLibraries = false;
+  Set<Library> neededDillLibraries;
 
   Set<Uri> invalidatedUris = new Set<Uri>();
 
@@ -301,6 +307,19 @@
           uriTranslator);
       userCode.loader.hierarchy = hierarchy;
 
+      if (trackNeededDillLibraries) {
+        // Reset dill loaders and kernel class hierarchy.
+        for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+          if (builder is DillLibraryBuilder) {
+            builder.isBuiltAndMarked = false;
+          }
+        }
+
+        if (hierarchy is ClosedWorldClassHierarchy) {
+          hierarchy.resetUsed();
+        }
+      }
+
       for (LibraryBuilder library in reusedLibraries) {
         userCode.loader.builders[library.uri] = library;
         if (library.uri.scheme == "dart" && library.uri.path == "core") {
@@ -324,8 +343,23 @@
         componentWithDill =
             await userCode.buildComponent(verify: c.options.verify);
       }
+      hierarchy ??= userCode.loader.hierarchy;
 
       recordNonFullComponentForTesting(componentWithDill);
+      if (trackNeededDillLibraries) {
+        // Which dill builders were built?
+        neededDillLibraries = new Set<Library>();
+        for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+          if (builder is DillLibraryBuilder) {
+            if (builder.isBuiltAndMarked) {
+              neededDillLibraries.add(builder.library);
+            }
+          }
+        }
+
+        updateNeededDillLibrariesWithHierarchy(
+            hierarchy, userCode.loader.builderHierarchy);
+      }
 
       if (componentWithDill != null) {
         this.invalidatedUris.clear();
@@ -388,6 +422,82 @@
     });
   }
 
+  @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.
+  /// Currently there are two different class hierarchies which is unfortunate.
+  /// For now this method allows the 'ClassHierarchyBuilder' to be null.
+  ///
+  /// TODO(jensj,CFE in general): Eventually we should get to a point where we
+  /// only have one class hierarchy.
+  /// TODO(jensj): This could probably be a utility method somewhere instead
+  /// (though handling of the case where all bets are off should probably still
+  /// live locally).
+  void updateNeededDillLibrariesWithHierarchy(
+      ClassHierarchy hierarchy, ClassHierarchyBuilder builderHierarchy) {
+    if (hierarchy is ClosedWorldClassHierarchy && !hierarchy.allBetsOff) {
+      neededDillLibraries ??= new Set<Library>();
+      Set<Class> classes = new Set<Class>();
+      List<Class> worklist = new List<Class>();
+      // Get all classes touched by kernel class hierarchy.
+      List<Class> usedClasses = hierarchy.getUsedClasses();
+      worklist.addAll(usedClasses);
+      classes.addAll(usedClasses);
+
+      // Get all classes touched by fasta class hierarchy.
+      if (builderHierarchy != null) {
+        for (Class c in builderHierarchy.nodes.keys) {
+          if (classes.add(c)) worklist.add(c);
+        }
+      }
+
+      // Get all supers etc.
+      while (worklist.isNotEmpty) {
+        Class c = worklist.removeLast();
+        for (Supertype supertype in c.implementedTypes) {
+          if (classes.add(supertype.classNode)) {
+            worklist.add(supertype.classNode);
+          }
+        }
+        if (c.mixedInType != null) {
+          if (classes.add(c.mixedInType.classNode)) {
+            worklist.add(c.mixedInType.classNode);
+          }
+        }
+        if (c.supertype != null) {
+          if (classes.add(c.supertype.classNode)) {
+            worklist.add(c.supertype.classNode);
+          }
+        }
+      }
+
+      // Add any libraries that was used or was in the "parent-chain" of a
+      // used class.
+      for (Class c in classes) {
+        Library library = c.enclosingLibrary;
+        // Only add if loaded from a dill file.
+        if (dillLoadedData.loader.builders.containsKey(library.importUri)) {
+          neededDillLibraries.add(library);
+        }
+      }
+    } else {
+      // Cannot track in other kernel class hierarchies or
+      // if all bets are off: Add everything.
+      neededDillLibraries = new Set<Library>();
+      for (LibraryBuilder builder in dillLoadedData.loader.builders.values) {
+        if (builder is DillLibraryBuilder) {
+          neededDillLibraries.add(builder.library);
+        }
+      }
+    }
+  }
+
   /// Internal method.
   void invalidateNotKeptUserBuilders(Set<Uri> invalidatedUris) {
     if (modulesToLoad != null && userBuilders != null) {
@@ -405,7 +515,7 @@
   }
 
   /// Internal method.
-  Future loadEnsureLoadedComponents(
+  Future<void> loadEnsureLoadedComponents(
       List<LibraryBuilder> reusedLibraries) async {
     if (modulesToLoad != null) {
       bool loadedAnything = false;
@@ -742,12 +852,14 @@
         if (!isLegalIdentifier(name)) return null;
       }
 
-      KernelLibraryBuilder debugLibrary = new KernelLibraryBuilder(
-          libraryUri,
-          debugExprUri,
-          userCode.loader,
-          null,
-          library.scope.createNestedScope("expression"));
+      SourceLibraryBuilder debugLibrary = new SourceLibraryBuilder(
+        libraryUri,
+        debugExprUri,
+        userCode.loader,
+        null,
+        scope: library.scope.createNestedScope("expression"),
+        nameOrigin: library.target,
+      );
 
       if (library is DillLibraryBuilder) {
         for (LibraryDependency dependency in library.target.dependencies) {
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 691cdc7..a0ad9c1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -8,6 +8,8 @@
 
 import '../constant_context.dart' show ConstantContext;
 
+import '../dill/dill_library_builder.dart' show DillLibraryBuilder;
+
 import '../fasta_codes.dart' as fasta;
 
 import '../fasta_codes.dart' show LocatedMessage, Message, noLength, Template;
@@ -61,6 +63,10 @@
         ParserRecovery,
         ScopeListener;
 
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import '../source/value_kinds.dart';
+
 import '../type_inference/type_inferrer.dart' show TypeInferrer;
 
 import '../type_inference/type_promotion.dart'
@@ -88,6 +94,7 @@
         ParenthesizedExpressionGenerator,
         ParserErrorGenerator,
         PrefixUseGenerator,
+        PropertyAccessGenerator,
         ReadOnlyAccessGenerator,
         SendAccessGenerator,
         StaticAccessGenerator,
@@ -102,6 +109,8 @@
 
 import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
 
+import 'fangorn.dart' show Fangorn;
+
 import 'forest.dart' show Forest;
 
 import 'implicit_type_argument.dart' show ImplicitTypeArgument;
@@ -132,15 +141,17 @@
 // has been enabled by default.
 const invalidCollectionElement = const Object();
 
-abstract class BodyBuilder extends ScopeListener<JumpTarget>
-    implements ExpressionGeneratorHelper {
+class BodyBuilder extends ScopeListener<JumpTarget>
+    implements ExpressionGeneratorHelper, EnsureLoaded {
+  final Forest forest;
+
   // TODO(ahe): Rename [library] to 'part'.
   @override
-  final KernelLibraryBuilder library;
+  final SourceLibraryBuilder library;
 
   final ModifierBuilder member;
 
-  final KernelClassBuilder classBuilder;
+  final ClassBuilder classBuilder;
 
   final ClassHierarchy hierarchy;
 
@@ -206,6 +217,18 @@
   /// second in the formal parameter scope.
   bool inInitializer = false;
 
+  /// Set to `true` when we are parsing a field initializer either directly
+  /// or within an initializer list.
+  ///
+  /// For instance in `<init>` in
+  ///
+  ///    var foo = <init>;
+  ///    class Class {
+  ///      var bar = <init>;
+  ///      Class() : <init>;
+  ///    }
+  ///
+  /// This is used to determine whether instance properties are available.
   bool inFieldInitializer = false;
 
   bool inCatchClause = false;
@@ -230,7 +253,7 @@
 
   ConstantContext constantContext = ConstantContext.none;
 
-  UnresolvedType<KernelTypeBuilder> currentLocalVariableType;
+  UnresolvedType currentLocalVariableType;
 
   // Using non-null value to initialize this field based on performance advice
   // from VM engineers. TODO(ahe): Does this still apply?
@@ -252,6 +275,11 @@
   /// Their types need to be inferred late, for example, in [finishFunction].
   List<List<VariableDeclaration>> multiVariablesWithMetadata;
 
+  /// If the current member is an instance member in an extension declaration,
+  /// [extensionThis] holds the synthetically add parameter holding the value
+  /// for `this`.
+  final VariableDeclaration extensionThis;
+
   BodyBuilder(
       this.library,
       this.member,
@@ -261,9 +289,11 @@
       this.coreTypes,
       this.classBuilder,
       this.isInstanceMember,
+      this.extensionThis,
       this.uri,
       this.typeInferrer)
-      : enableNative =
+      : forest = const Fangorn(),
+        enableNative =
             library.loader.target.backendTarget.enableNative(library.uri),
         stringExpectedAfterNative =
             library.loader.target.backendTarget.nativeExtensionExpectsString,
@@ -275,8 +305,8 @@
         legacyMode = library.legacyMode,
         super(enclosingScope);
 
-  BodyBuilder.withParents(KernelFieldBuilder field, KernelLibraryBuilder part,
-      KernelClassBuilder classBuilder, TypeInferrer typeInferrer)
+  BodyBuilder.withParents(FieldBuilder field, SourceLibraryBuilder part,
+      ClassBuilder classBuilder, TypeInferrer typeInferrer)
       : this(
             part,
             field,
@@ -286,24 +316,43 @@
             part.loader.coreTypes,
             classBuilder,
             field.isInstanceMember,
+            null,
             field.fileUri,
             typeInferrer);
 
-  BodyBuilder.forField(KernelFieldBuilder field, TypeInferrer typeInferrer)
+  BodyBuilder.forField(FieldBuilder field, TypeInferrer typeInferrer)
       : this.withParents(
             field,
-            field.parent is KernelClassBuilder
-                ? field.parent.parent
-                : field.parent,
-            field.parent is KernelClassBuilder ? field.parent : null,
+            field.parent is ClassBuilder ? field.parent.parent : field.parent,
+            field.parent is ClassBuilder ? field.parent : null,
             typeInferrer);
 
+  BodyBuilder.forOutlineExpression(
+      SourceLibraryBuilder library,
+      ClassBuilder classBuilder,
+      ModifierBuilder member,
+      Scope scope,
+      Uri fileUri)
+      : this(
+            library,
+            member,
+            scope,
+            null,
+            library.loader.hierarchy,
+            library.loader.coreTypes,
+            classBuilder,
+            member?.isInstanceMember ?? false,
+            null,
+            fileUri,
+            library.loader.typeInferenceEngine?.createLocalTypeInferrer(
+                fileUri, classBuilder?.target?.thisType, library));
+
   bool get inConstructor {
-    return functionNestingLevel == 0 && member is KernelConstructorBuilder;
+    return functionNestingLevel == 0 && member is ConstructorBuilder;
   }
 
   bool get isInstanceContext {
-    return isInstanceMember || member is KernelConstructorBuilder;
+    return isInstanceMember || member is ConstructorBuilder;
   }
 
   TypeEnvironment get typeEnvironment => typeInferrer?.typeSchemaEnvironment;
@@ -389,7 +438,7 @@
     Scope outerSwitchScope = pop();
     if (switchScope.unclaimedForwardDeclarations != null) {
       switchScope.unclaimedForwardDeclarations
-          .forEach((String name, Declaration declaration) {
+          .forEach((String name, Builder declaration) {
         if (outerSwitchScope == null) {
           JumpTarget target = declaration;
           for (Statement statement in target.users) {
@@ -427,7 +476,7 @@
 
   void declareVariable(VariableDeclaration variable, Scope scope) {
     String name = variable.name;
-    Declaration existing = scope.local[name];
+    Builder existing = scope.local[name];
     if (existing != null) {
       // This reports an error for duplicated declarations in the same scope:
       // `{ var x; var x; }`
@@ -441,8 +490,7 @@
     }
     LocatedMessage context = scope.declare(
         variable.name,
-        new KernelVariableBuilder(
-            variable, member ?? classBuilder ?? library, uri),
+        new VariableBuilder(variable, member ?? classBuilder ?? library, uri),
         uri);
     if (context != null) {
       // This case is different from the above error. In this case, the problem
@@ -496,14 +544,14 @@
         expression = new UnresolvedNameGenerator(
             this,
             deprecated_extractToken(identifier),
-            new Name(identifier.name, library.library));
+            new Name(identifier.name, library.nameOrigin));
       }
       if (name?.isNotEmpty ?? false) {
         Token period = periodBeforeName ?? beginToken.next.next;
         Generator generator = expression;
         expression = generator.buildPropertyAccess(
             new IncompletePropertyAccessGenerator(
-                this, period.next, new Name(name, library.library)),
+                this, period.next, new Name(name, library.nameOrigin)),
             period.next.offset,
             false);
       }
@@ -542,7 +590,9 @@
       Token endToken) {
     debugEvent("TopLevelFields");
     // TODO(danrubel): handle NNBD 'late' modifier
-    reportNonNullableModifierError(lateToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(lateToken);
+    }
     push(count);
   }
 
@@ -551,7 +601,9 @@
       Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
     // TODO(danrubel): handle NNBD 'late' modifier
-    reportNonNullableModifierError(lateToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(lateToken);
+    }
     push(count);
   }
 
@@ -559,18 +611,18 @@
   void finishFields() {
     debugEvent("finishFields");
     int count = pop();
-    List<KernelFieldBuilder> fields = <KernelFieldBuilder>[];
+    List<FieldBuilder> fields = <FieldBuilder>[];
     for (int i = 0; i < count; i++) {
       Expression initializer = pop();
       Identifier identifier = pop();
       String name = identifier.name;
-      Declaration declaration;
+      Builder declaration;
       if (classBuilder != null) {
-        declaration = classBuilder[name];
+        declaration = classBuilder.getLocalMember(name);
       } else {
-        declaration = library[name];
+        declaration = library.getLocalMember(name);
       }
-      KernelFieldBuilder field;
+      FieldBuilder field;
       if (declaration.isField && declaration.next == null) {
         field = declaration;
       } else {
@@ -630,11 +682,12 @@
   }
 
   void prepareInitializers() {
-    ProcedureBuilder<TypeBuilder> member = this.member;
+    FunctionBuilder member = this.member;
     scope = member.computeFormalParameterInitializerScope(scope);
-    if (member is KernelConstructorBuilder) {
+    if (member is ConstructorBuilder) {
+      member.prepareInitializers();
       if (member.formals != null) {
-        for (KernelFormalParameterBuilder formal in member.formals) {
+        for (FormalParameterBuilder formal in member.formals) {
           if (formal.isInitializingFormal) {
             Initializer initializer;
             if (member.isExternal) {
@@ -716,7 +769,7 @@
       initializer = buildInvalidInitializer(node, token.charOffset);
     }
     typeInferrer?.inferInitializer(this, initializer);
-    if (member is KernelConstructorBuilder && !member.isExternal) {
+    if (member is ConstructorBuilder && !member.isExternal) {
       member.addInitializer(initializer, this);
     } else {
       addProblem(
@@ -728,10 +781,10 @@
   }
 
   DartType _computeReturnTypeContext(MemberBuilder member) {
-    if (member is KernelProcedureBuilder) {
+    if (member is ProcedureBuilder) {
       return member.procedure.function.returnType;
     } else {
-      assert(member is KernelConstructorBuilder);
+      assert(member is ConstructorBuilder);
       return const DynamicType();
     }
   }
@@ -742,10 +795,10 @@
     debugEvent("finishFunction");
     typePromoter?.finished();
 
-    KernelFunctionBuilder builder = member;
+    FunctionBuilder builder = member;
     if (formals?.parameters != null) {
       for (int i = 0; i < formals.parameters.length; i++) {
-        KernelFormalParameterBuilder parameter = formals.parameters[i];
+        FormalParameterBuilder parameter = formals.parameters[i];
         Expression initializer = parameter.target.initializer;
         if (parameter.isOptional || initializer != null) {
           VariableDeclaration realParameter = builder.formals[i].target;
@@ -848,7 +901,7 @@
           // Illegal parameters were removed by the function builder.
           // Add them as local variable to put them in scope of the body.
           List<Statement> statements = <Statement>[];
-          for (KernelFormalParameterBuilder parameter in builder.formals) {
+          for (FormalParameterBuilder parameter in builder.formals) {
             statements.add(parameter.target);
           }
           statements.add(body);
@@ -889,9 +942,9 @@
           ..fileOffset = body.fileOffset;
       }
     }
-    if (builder is KernelConstructorBuilder) {
+    if (builder is ConstructorBuilder) {
       finishConstructor(builder, asyncModifier);
-    } else if (builder is KernelProcedureBuilder) {
+    } else if (builder is ProcedureBuilder) {
       builder.asyncModifier = asyncModifier;
     } else {
       unhandled("${builder.runtimeType}", "finishFunction", builder.charOffset,
@@ -902,6 +955,44 @@
     finishVariableMetadata();
   }
 
+  /// Ensure that the containing library of the [member] has been loaded.
+  ///
+  /// This is for instance important for lazy dill library builders where this
+  /// method has to be called to ensure that
+  /// a) The library has been fully loaded (and for instance any internal
+  ///    transformation needed has been performed); and
+  /// b) The library is correctly marked as being used to allow for proper
+  ///    'dependency pruning'.
+  void ensureLoaded(Member member) {
+    if (member == null) return;
+    Library ensureLibraryLoaded = member.enclosingLibrary;
+    LibraryBuilder builder =
+        library.loader.builders[ensureLibraryLoaded.importUri] ??
+            library.loader.target.dillTarget.loader
+                .builders[ensureLibraryLoaded.importUri];
+    if (builder is DillLibraryBuilder) {
+      builder.ensureLoaded();
+    }
+  }
+
+  /// Check if the containing library of the [member] has been loaded.
+  ///
+  /// This is designed for use with asserts.
+  /// See [ensureLoaded] for a description of what 'loaded' means and the ideas
+  /// behind that.
+  bool isLoaded(Member member) {
+    if (member == null) return true;
+    Library ensureLibraryLoaded = member.enclosingLibrary;
+    LibraryBuilder builder =
+        library.loader.builders[ensureLibraryLoaded.importUri] ??
+            library.loader.target.dillTarget.loader
+                .builders[ensureLibraryLoaded.importUri];
+    if (builder is DillLibraryBuilder) {
+      return builder.isBuiltAndMarked;
+    }
+    return true;
+  }
+
   void resolveRedirectingFactoryTargets() {
     for (StaticInvocation invocation in redirectingFactoryInvocations) {
       // If the invocation was invalid, it or its parent has already been
@@ -909,7 +1000,7 @@
       // resolve anymore.  Note that in the case where the invocation's parent
       // was invalid, type inference won't reach the invocation node and won't
       // set its inferredType field.  If type inference is disabled, reach to
-      // the outtermost parent to check if the node is a dead code.
+      // the outermost parent to check if the node is a dead code.
       if (invocation.parent == null) continue;
       if (typeInferrer != null) {
         if (invocation is FactoryConstructorInvocationJudgment &&
@@ -926,7 +1017,7 @@
       Expression replacementNode;
 
       RedirectionTarget redirectionTarget =
-          getRedirectionTarget(initialTarget, legacyMode: legacyMode);
+          getRedirectionTarget(initialTarget, this, legacyMode: legacyMode);
       Member resolvedTarget = redirectionTarget?.target;
 
       if (resolvedTarget == null) {
@@ -1084,22 +1175,22 @@
   @override
   Expression parseSingleExpression(
       Parser parser, Token token, FunctionNode parameters) {
-    List<KernelTypeVariableBuilder> typeParameterBuilders;
+    List<TypeVariableBuilder> typeParameterBuilders;
     for (TypeParameter typeParameter in parameters.typeParameters) {
-      typeParameterBuilders ??= <KernelTypeVariableBuilder>[];
-      typeParameterBuilders.add(
-          new KernelTypeVariableBuilder.fromKernel(typeParameter, library));
+      typeParameterBuilders ??= <TypeVariableBuilder>[];
+      typeParameterBuilders
+          .add(new TypeVariableBuilder.fromKernel(typeParameter, library));
     }
     enterFunctionTypeScope(typeParameterBuilders);
 
-    List<KernelFormalParameterBuilder> formals =
+    List<FormalParameterBuilder> formals =
         parameters.positionalParameters.length == 0
             ? null
-            : new List<KernelFormalParameterBuilder>(
+            : new List<FormalParameterBuilder>(
                 parameters.positionalParameters.length);
     for (int i = 0; i < parameters.positionalParameters.length; i++) {
       VariableDeclaration formal = parameters.positionalParameters[i];
-      formals[i] = new KernelFormalParameterBuilder(
+      formals[i] = new FormalParameterBuilder(
           null, 0, null, formal.name, library, formal.fileOffset)
         ..declaration = formal;
     }
@@ -1128,6 +1219,19 @@
     return fakeReturn.expression;
   }
 
+  void parseInitializers(Token token) {
+    Parser parser = new Parser(this);
+    if (!token.isEof) {
+      token = parser.parseInitializers(token);
+      checkEmpty(token.charOffset);
+    } else {
+      handleNoInitializers();
+    }
+    // We are passing [AsyncMarker.Sync] because the error will be reported
+    // already.
+    finishConstructor(member, AsyncMarker.Sync);
+  }
+
   Expression parseFieldInitializer(Token token) {
     Parser parser = new Parser(this);
     token = parser.parseExpression(parser.syntheticPreviousToken(token));
@@ -1145,7 +1249,7 @@
   }
 
   void finishConstructor(
-      KernelConstructorBuilder builder, AsyncMarker asyncModifier) {
+      ConstructorBuilder builder, AsyncMarker asyncModifier) {
     /// Quotes below are from [Dart Programming Language Specification, 4th
     /// Edition](
     /// https://ecma-international.org/publications/files/ECMA-ST/ECMA-408.pdf).
@@ -1274,9 +1378,20 @@
 
   @override
   void handleSend(Token beginToken, Token endToken) {
+    assert(checkState(beginToken, [
+      ValueKind.ArgumentsOrNull,
+      ValueKind.TypeArgumentsOrNull,
+      unionOfKinds([
+        ValueKind.Expression,
+        ValueKind.Generator,
+        ValueKind.Identifier,
+        ValueKind.ParserRecovery,
+        ValueKind.ProblemBuilder
+      ])
+    ]));
     debugEvent("Send");
     Arguments arguments = pop();
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    List<UnresolvedType> typeArguments = pop();
     Object receiver = pop();
     if (arguments != null && typeArguments != null) {
       assert(forest.argumentsTypeArguments(arguments).isEmpty);
@@ -1286,7 +1401,7 @@
       assert(typeArguments == null);
     }
     if (receiver is Identifier) {
-      Name name = new Name(receiver.name, library.library);
+      Name name = new Name(receiver.name, library.nameOrigin);
       if (arguments == null) {
         push(new IncompletePropertyAccessGenerator(this, beginToken, name));
       } else {
@@ -1484,9 +1599,9 @@
     if (periodIndex != -1) {
       length -= periodIndex + 1;
     }
-    Name kernelName = new Name(name, library.library);
+    Name kernelName = new Name(name, library.nameOrigin);
     List<LocatedMessage> context;
-    if (candidate != null) {
+    if (candidate != null && candidate.location != null) {
       Uri uri = candidate.location.file;
       int offset = candidate.fileOffset;
       Message contextMessage;
@@ -1601,83 +1716,13 @@
   @override
   Member lookupInstanceMember(Name name,
       {bool isSetter: false, bool isSuper: false}) {
-    Class cls = classBuilder.cls;
-    if (classBuilder.isPatch) {
-      if (isSuper) {
-        // The super class is only correctly found through the origin class.
-        cls = classBuilder.origin.cls;
-      } else {
-        Member member =
-            hierarchy.getInterfaceMember(cls, name, setter: isSetter);
-        if (member?.parent == cls) {
-          // Only if the member is found in the patch can we use it.
-          return member;
-        } else {
-          // Otherwise, we need to keep searching in the origin class.
-          cls = classBuilder.origin.cls;
-        }
-      }
-    }
-
-    if (isSuper) {
-      cls = cls.superclass;
-      if (cls == null) return null;
-    }
-    Member target = isSuper
-        ? hierarchy.getDispatchTarget(cls, name, setter: isSetter)
-        : hierarchy.getInterfaceMember(cls, name, setter: isSetter);
-    if (isSuper && target == null) {
-      if (classBuilder.cls.isMixinDeclaration ||
-          (library.loader.target.backendTarget.enableSuperMixins &&
-              classBuilder.isAbstract)) {
-        target = hierarchy.getInterfaceMember(cls, name, setter: isSetter);
-      }
-    }
-    return target;
+    return classBuilder.lookupInstanceMember(hierarchy, name,
+        isSetter: isSetter, isSuper: isSuper);
   }
 
   @override
   Constructor lookupConstructor(Name name, {bool isSuper}) {
-    Class cls = classBuilder.cls;
-    if (isSuper) {
-      cls = cls.superclass;
-    }
-    if (cls != null) {
-      for (Constructor constructor in cls.constructors) {
-        if (constructor.name == name) return constructor;
-      }
-    }
-
-    /// Performs a similar lookup to [lookupConstructor], but using a slower
-    /// implementation.
-    Constructor lookupConstructorWithPatches(Name name, bool isSuper) {
-      ClassBuilder<TypeBuilder, Object> builder = classBuilder.origin;
-
-      ClassBuilder<TypeBuilder, Object> getSuperclass(
-          ClassBuilder<TypeBuilder, Object> builder) {
-        // This way of computing the superclass is slower than using the kernel
-        // objects directly.
-        Object supertype = builder.supertype;
-        if (supertype is NamedTypeBuilder<TypeBuilder, Object>) {
-          Object builder = supertype.declaration;
-          if (builder is ClassBuilder<TypeBuilder, Object>) return builder;
-        }
-        return null;
-      }
-
-      if (isSuper) {
-        builder = getSuperclass(builder)?.origin;
-      }
-      if (builder != null) {
-        Class target = builder.target;
-        for (Constructor constructor in target.constructors) {
-          if (constructor.name == name) return constructor;
-        }
-      }
-      return null;
-    }
-
-    return lookupConstructorWithPatches(name, isSuper);
+    return classBuilder.lookupConstructor(name, isSuper: isSuper);
   }
 
   @override
@@ -1722,6 +1767,25 @@
     }
   }
 
+  /// Helper method to create a [VariableGet] of the [variable] using
+  /// [charOffset] as the file offset.
+  VariableGet _createVariableGet(VariableDeclaration variable, int charOffset) {
+    Object fact =
+        typePromoter?.getFactForAccess(variable, functionNestingLevel);
+    Object scope = typePromoter?.currentScope;
+    return new VariableGetJudgment(variable, fact, scope)
+      ..fileOffset = charOffset;
+  }
+
+  /// Helper method to create a [ReadOnlyAccessGenerator] on the [variable]
+  /// using [token] and [charOffset] for offset information and [name]
+  /// for `ExpressionGenerator._plainNameForRead`.
+  ReadOnlyAccessGenerator _createReadOnlyVariableAccess(
+      VariableDeclaration variable, Token token, int charOffset, String name) {
+    return new ReadOnlyAccessGenerator(
+        this, token, _createVariableGet(variable, charOffset), name);
+  }
+
   /// Look up [name] in [scope] using [token] as location information (both to
   /// report problems and as the file offset in the generated kernel code).
   /// [isQualified] should be true if [name] is a qualified access (which
@@ -1734,7 +1798,7 @@
     if (token.isSynthetic) {
       return new ParserErrorGenerator(this, token, fasta.messageSyntheticToken);
     }
-    Declaration declaration = scope.lookup(name, charOffset, uri);
+    Builder declaration = scope.lookup(name, charOffset, uri);
     if (declaration is UnlinkedDeclaration) {
       return new UnlinkedGenerator(this, token, declaration);
     }
@@ -1754,14 +1818,25 @@
     }
     if (declaration == null ||
         (!isInstanceContext && declaration.isInstanceMember)) {
-      Name n = new Name(name, library.library);
+      Name n = new Name(name, library.nameOrigin);
       if (!isQualified && isInstanceContext) {
         assert(declaration == null);
         if (constantContext != ConstantContext.none || member.isField) {
           return new UnresolvedNameGenerator(this, token, n);
         }
-        return new ThisPropertyAccessGenerator(this, token, n,
-            lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
+        if (extensionThis != null) {
+          return PropertyAccessGenerator.make(
+              this,
+              token,
+              _createVariableGet(extensionThis, charOffset),
+              n,
+              null,
+              null,
+              false);
+        } else {
+          return new ThisPropertyAccessGenerator(this, token, n,
+              lookupInstanceMember(n), lookupInstanceMember(n, isSetter: true));
+        }
       } else if (ignoreMainInGetMainClosure &&
           name == "main" &&
           member?.name == "_getMainClosure") {
@@ -1783,15 +1858,8 @@
       // [ProcedureBuilder.computeFormalParameterInitializerScope]. If that
       // wasn't the case, we could always use [VariableUseGenerator].
       if (declaration.isFinal) {
-        Object fact = typePromoter?.getFactForAccess(
-            declaration.target, functionNestingLevel);
-        Object scope = typePromoter?.currentScope;
-        return new ReadOnlyAccessGenerator(
-            this,
-            token,
-            new VariableGetJudgment(declaration.target, fact, scope)
-              ..fileOffset = charOffset,
-            name);
+        return _createReadOnlyVariableAccess(
+            declaration.target, token, charOffset, name);
       } else {
         return new VariableUseGenerator(this, token, declaration.target);
       }
@@ -1806,7 +1874,7 @@
         addProblem(
             fasta.messageNotAConstantExpression, charOffset, token.length);
       }
-      Name n = new Name(name, library.library);
+      Name n = new Name(name, library.nameOrigin);
       Member getter;
       Member setter;
       if (declaration is AccessErrorBuilder) {
@@ -1828,7 +1896,7 @@
     } else {
       if (declaration.hasProblem && declaration is! AccessErrorBuilder)
         return declaration;
-      Declaration setter;
+      Builder setter;
       if (declaration.isSetter) {
         setter = declaration;
       } else if (declaration.isGetter) {
@@ -2140,8 +2208,10 @@
       Token token, Token lateToken, Token varFinalOrConst) {
     debugEvent("beginVariablesDeclaration");
     // TODO(danrubel): handle NNBD 'late' modifier
-    reportNonNullableModifierError(lateToken);
-    UnresolvedType<KernelTypeBuilder> type = pop();
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(lateToken);
+    }
+    UnresolvedType type = pop();
     int modifiers = Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme);
     super.push(currentLocalVariableModifiers);
     super.push(currentLocalVariableType ?? NullValue.Type);
@@ -2443,7 +2513,7 @@
       }
     }
 
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    List<UnresolvedType> typeArguments = pop();
 
     DartType typeArgument;
     if (typeArguments != null) {
@@ -2476,8 +2546,8 @@
     push(node);
   }
 
-  void buildLiteralSet(List<UnresolvedType<KernelTypeBuilder>> typeArguments,
-      Token constKeyword, Token leftBrace, List<dynamic> setOrMapEntries) {
+  void buildLiteralSet(List<UnresolvedType> typeArguments, Token constKeyword,
+      Token leftBrace, List<dynamic> setOrMapEntries) {
     DartType typeArgument;
     if (typeArguments != null) {
       typeArgument = buildDartType(typeArguments.single);
@@ -2539,7 +2609,7 @@
         setOrMapEntries[i] = toValue(elem);
       }
     }
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    List<UnresolvedType> typeArguments = pop();
 
     // Replicate existing behavior that has been removed from the parser.
     // This will be removed once unified collections is implemented.
@@ -2599,8 +2669,8 @@
     push(forest.literalNull(token));
   }
 
-  void buildLiteralMap(List<UnresolvedType<KernelTypeBuilder>> typeArguments,
-      Token constKeyword, Token leftBrace, List<MapEntry> entries) {
+  void buildLiteralMap(List<UnresolvedType> typeArguments, Token constKeyword,
+      Token leftBrace, List<MapEntry> entries) {
     DartType keyType;
     DartType valueType;
     if (typeArguments != null) {
@@ -2661,7 +2731,7 @@
         push(new ParserErrorGenerator(
             this, hashToken, fasta.messageSyntheticToken));
       } else {
-        push(forest.literalSymbolSingluar(
+        push(forest.literalSymbolSingular(
             symbolPartToString(part), hashToken, part));
       }
     } else {
@@ -2682,15 +2752,19 @@
 
   @override
   void handleNonNullAssertExpression(Token bang) {
-    reportNonNullAssertExpressionNotEnabled(bang);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullAssertExpressionNotEnabled(bang);
+    }
   }
 
   @override
   void handleType(Token beginToken, Token questionMark) {
     // TODO(ahe): The scope is wrong for return types of generic functions.
     debugEvent("Type");
-    reportErrorIfNullableType(questionMark);
-    List<UnresolvedType<KernelTypeBuilder>> arguments = pop();
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
+    List<UnresolvedType> arguments = pop();
     Object name = pop();
     if (name is QualifiedName) {
       QualifiedName qualified = name;
@@ -2705,9 +2779,9 @@
         Message message = fasta.templateNotAType.withArguments(displayName);
         library.addProblem(
             message, offset, lengthOfSpan(beginToken, suffix), uri);
-        push(new UnresolvedType<KernelTypeBuilder>(
-            new KernelNamedTypeBuilder(name, null)
-              ..bind(new KernelInvalidTypeBuilder(
+        push(new UnresolvedType(
+            new NamedTypeBuilder(name, null)
+              ..bind(new InvalidTypeBuilder(
                   name,
                   message.withLocation(
                       uri, offset, lengthOfSpan(beginToken, suffix)))),
@@ -2716,23 +2790,18 @@
         return;
       }
     }
-    KernelTypeBuilder result;
+    TypeBuilder result;
     if (name is Generator) {
       result = name.buildTypeWithResolvedArguments(arguments);
       if (result == null) {
         unhandled("null", "result", beginToken.charOffset, uri);
       }
-    } else if (name is TypeBuilder) {
-      result = name.build(library);
-      if (result == null) {
-        unhandled("null", "result", beginToken.charOffset, uri);
-      }
     } else if (name is ProblemBuilder) {
       // TODO(ahe): Arguments could be passed here.
       library.addProblem(
           name.message, name.charOffset, name.name.length, name.fileUri);
-      result = new KernelNamedTypeBuilder(name.name, null)
-        ..bind(new KernelInvalidTypeBuilder(
+      result = new NamedTypeBuilder(name.name, null)
+        ..bind(new InvalidTypeBuilder(
             name.name,
             name.message.withLocation(
                 name.fileUri, name.charOffset, name.name.length)));
@@ -2740,8 +2809,7 @@
       unhandled(
           "${name.runtimeType}", "handleType", beginToken.charOffset, uri);
     }
-    push(new UnresolvedType<KernelTypeBuilder>(
-        result, beginToken.charOffset, uri));
+    push(new UnresolvedType(result, beginToken.charOffset, uri));
   }
 
   @override
@@ -2749,15 +2817,15 @@
     debugEvent("beginFunctionType");
   }
 
-  void enterFunctionTypeScope(List<KernelTypeVariableBuilder> typeVariables) {
+  void enterFunctionTypeScope(List<TypeVariableBuilder> typeVariables) {
     debugEvent("enterFunctionTypeScope");
     enterLocalScope(null,
         scope.createNestedScope("function-type scope", isModifiable: true));
     if (typeVariables != null) {
       ScopeBuilder scopeBuilder = new ScopeBuilder(scope);
-      for (KernelTypeVariableBuilder builder in typeVariables) {
+      for (TypeVariableBuilder builder in typeVariables) {
         String name = builder.name;
-        KernelTypeVariableBuilder existing = scopeBuilder[name];
+        TypeVariableBuilder existing = scopeBuilder[name];
         if (existing == null) {
           scopeBuilder.addMember(name, builder);
         } else {
@@ -2770,12 +2838,13 @@
   @override
   void endFunctionType(Token functionToken, Token questionMark) {
     debugEvent("FunctionType");
-    reportErrorIfNullableType(questionMark);
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
     FormalParameters formals = pop();
-    UnresolvedType<KernelTypeBuilder> returnType = pop();
-    List<KernelTypeVariableBuilder> typeVariables = pop();
-    UnresolvedType<KernelTypeBuilder> type =
-        formals.toFunctionType(returnType, typeVariables);
+    UnresolvedType returnType = pop();
+    List<TypeVariableBuilder> typeVariables = pop();
+    UnresolvedType type = formals.toFunctionType(returnType, typeVariables);
     exitLocalScope();
     push(type);
   }
@@ -2784,10 +2853,9 @@
   void handleVoidKeyword(Token token) {
     debugEvent("VoidKeyword");
     int offset = offsetForToken(token);
-    push(new UnresolvedType<KernelTypeBuilder>(
-        new KernelNamedTypeBuilder("void", null)
-          ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
-              const VoidType(), library, offset)),
+    push(new UnresolvedType(
+        new NamedTypeBuilder("void", null)
+          ..bind(new VoidTypeBuilder(const VoidType(), library, offset)),
         offset,
         uri));
   }
@@ -2880,14 +2948,22 @@
   void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
       Token covariantToken, Token varFinalOrConst) {
     // TODO(danrubel): handle required token
-    reportNonNullableModifierError(requiredToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(requiredToken);
+    }
     push((covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     debugEvent("FormalParameter");
     if (thisKeyword != null) {
       if (!inConstructor) {
@@ -2897,7 +2973,7 @@
       }
     }
     Object nameNode = pop();
-    UnresolvedType<KernelTypeBuilder> type = pop();
+    UnresolvedType type = pop();
     if (functionNestingLevel == 0) {
       // TODO(ahe): The type we compute here may be different from what is
       // computed in the outline phase. We should make sure that the outline
@@ -2918,26 +2994,26 @@
       return;
     }
     Identifier name = nameNode;
-    KernelFormalParameterBuilder parameter;
+    FormalParameterBuilder parameter;
     if (!inCatchClause &&
         functionNestingLevel == 0 &&
         memberKind != MemberKind.GeneralizedFunctionType) {
-      ProcedureBuilder<TypeBuilder> member = this.member;
+      FunctionBuilder member = this.member;
       parameter = member.getFormal(name.name);
       if (parameter == null) {
         push(new ParserRecovery(nameToken.charOffset));
         return;
       }
     } else {
-      parameter = new KernelFormalParameterBuilder(null, modifiers,
-          type?.builder, name?.name, library, offsetForToken(nameToken));
+      parameter = new FormalParameterBuilder(null, modifiers, type?.builder,
+          name?.name, library, offsetForToken(nameToken));
     }
     VariableDeclaration variable =
         parameter.build(library, functionNestingLevel);
     Expression initializer = name?.initializer;
     if (initializer != null) {
-      if (member is KernelRedirectingFactoryBuilder) {
-        KernelRedirectingFactoryBuilder factory = member;
+      if (member is RedirectingFactoryBuilder) {
+        RedirectingFactoryBuilder factory = member;
         addProblem(
             fasta.templateDefaultValueInRedirectingFactoryConstructor
                 .withArguments(factory.redirectionTarget.fullNameForErrors),
@@ -2971,13 +3047,12 @@
     // 0. It might be simpler if the parser didn't call this method in that
     // case, however, then [beginOptionalFormalParameters] wouldn't always be
     // matched by this method.
-    List<KernelFormalParameterBuilder> parameters =
-        const FixedNullableList<KernelFormalParameterBuilder>()
-            .pop(stack, count);
+    List<FormalParameterBuilder> parameters =
+        const FixedNullableList<FormalParameterBuilder>().pop(stack, count);
     if (parameters == null) {
       push(new ParserRecovery(offsetForToken(beginToken)));
     } else {
-      for (KernelFormalParameterBuilder parameter in parameters) {
+      for (FormalParameterBuilder parameter in parameters) {
         parameter.kind = kind;
       }
       push(parameters);
@@ -2997,11 +3072,12 @@
       exitLocalScope();
     }
     FormalParameters formals = pop();
-    UnresolvedType<KernelTypeBuilder> returnType = pop();
-    List<KernelTypeVariableBuilder> typeVariables = pop();
-    reportErrorIfNullableType(question);
-    UnresolvedType<KernelTypeBuilder> type =
-        formals.toFunctionType(returnType, typeVariables);
+    UnresolvedType returnType = pop();
+    List<TypeVariableBuilder> typeVariables = pop();
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(question);
+    }
+    UnresolvedType type = formals.toFunctionType(returnType, typeVariables);
     exitLocalScope();
     push(type);
     functionNestingLevel--;
@@ -3048,15 +3124,15 @@
   void endFormalParameters(
       int count, Token beginToken, Token endToken, MemberKind kind) {
     debugEvent("FormalParameters");
-    List<KernelFormalParameterBuilder> optionals;
+    List<FormalParameterBuilder> optionals;
     int optionalsCount = 0;
-    if (count > 0 && peek() is List<KernelFormalParameterBuilder>) {
+    if (count > 0 && peek() is List<FormalParameterBuilder>) {
       optionals = pop();
       count--;
       optionalsCount = optionals.length;
     }
-    List<KernelFormalParameterBuilder> parameters =
-        const FixedNullableList<KernelFormalParameterBuilder>()
+    List<FormalParameterBuilder> parameters =
+        const FixedNullableList<FormalParameterBuilder>()
             .popPadded(stack, count, optionalsCount);
     if (optionals != null && parameters != null) {
       parameters.setRange(count, count + optionalsCount, optionals);
@@ -3100,8 +3176,8 @@
     FormalParameters catchParameters = popIfNotNull(catchKeyword);
     DartType exceptionType =
         buildDartType(popIfNotNull(onKeyword)) ?? const DynamicType();
-    KernelFormalParameterBuilder exception;
-    KernelFormalParameterBuilder stackTrace;
+    FormalParameterBuilder exception;
+    FormalParameterBuilder stackTrace;
     List<Statement> compileTimeErrors;
     if (catchParameters?.parameters != null) {
       int parameterCount = catchParameters.parameters.length;
@@ -3118,8 +3194,7 @@
         // If parameterCount is 0, the parser reported an error already.
         if (parameterCount != 0) {
           for (int i = 2; i < parameterCount; i++) {
-            KernelFormalParameterBuilder parameter =
-                catchParameters.parameters[i];
+            FormalParameterBuilder parameter = catchParameters.parameters[i];
             compileTimeErrors ??= <Statement>[];
             compileTimeErrors.add(buildProblemStatement(
                 fasta.messageCatchSyntaxExtraParameters, parameter.charOffset,
@@ -3294,7 +3369,7 @@
   void pushQualifiedReference(Token start, Token periodBeforeName) {
     Identifier suffix = popIfNotNull(periodBeforeName);
     Identifier identifier;
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    List<UnresolvedType> typeArguments = pop();
     Object type = pop();
     if (type is QualifiedName) {
       identifier = type;
@@ -3338,7 +3413,7 @@
       int charLength: noLength}) {
     // The argument checks for the initial target of redirecting factories
     // invocations are skipped in Dart 1.
-    if (!legacyMode || !isRedirectingFactory(target)) {
+    if (!legacyMode || !isRedirectingFactory(target, helper: this)) {
       List<TypeParameter> typeParameters = target.function.typeParameters;
       if (target is Constructor) {
         assert(!target.enclosingClass.isAbstract);
@@ -3558,7 +3633,7 @@
     Token nameLastToken =
         deprecated_extractToken(nameLastIdentifier) ?? nameToken;
     String name = pop();
-    List<UnresolvedType<KernelTypeBuilder>> typeArguments = pop();
+    List<UnresolvedType> typeArguments = pop();
 
     Object type = pop();
 
@@ -3590,12 +3665,12 @@
 
   @override
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder<TypeBuilder, Object> type,
+      TypeDeclarationBuilder type,
       Token nameToken,
       Token nameLastToken,
       Arguments arguments,
       String name,
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       int charOffset,
       Constness constness) {
     if (arguments == null) {
@@ -3616,13 +3691,12 @@
 
     String errorName;
     LocatedMessage message;
-    if (type is ClassBuilder<TypeBuilder, Object>) {
-      if (type is EnumBuilder<TypeBuilder, Object>) {
+    if (type is ClassBuilder) {
+      if (type is EnumBuilder) {
         return buildProblem(fasta.messageEnumInstantiation,
             nameToken.charOffset, nameToken.length);
       }
-      Declaration b =
-          type.findConstructorOrFactory(name, charOffset, uri, library);
+      Builder b = type.findConstructorOrFactory(name, charOffset, uri, library);
       Member target = b?.target;
       if (b == null) {
         // Not found. Reported below.
@@ -3647,7 +3721,7 @@
           (target is Procedure && target.kind == ProcedureKind.Factory)) {
         Expression invocation;
 
-        if (legacyMode && isRedirectingFactory(target)) {
+        if (legacyMode && isRedirectingFactory(target, helper: this)) {
           // In legacy mode the checks that are done in [buildStaticInvocation]
           // on the initial target of a redirecting factory invocation should
           // be skipped. So we build the invocation nodes directly here without
@@ -3673,7 +3747,8 @@
               charLength: nameToken.length);
         }
 
-        if (invocation is StaticInvocation && isRedirectingFactory(target)) {
+        if (invocation is StaticInvocation &&
+            isRedirectingFactory(target, helper: this)) {
           redirectingFactoryInvocations.add(invocation);
         }
 
@@ -3681,14 +3756,14 @@
       } else {
         errorName ??= debugName(type.name, name);
       }
-    } else if (type is InvalidTypeBuilder<TypeBuilder, Object>) {
+    } else if (type is InvalidTypeBuilder) {
       LocatedMessage message = type.message;
       return evaluateArgumentsBefore(
           arguments,
           buildProblem(message.messageObject, nameToken.charOffset,
               nameToken.lexeme.length));
     } else {
-      errorName = debugName(getNodeName(type), name);
+      errorName = debugName(type.fullNameForErrors, name);
     }
     errorName ??= name;
 
@@ -3877,8 +3952,7 @@
   @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
-    push(const FixedNullableList<UnresolvedType<KernelTypeBuilder>>()
-            .pop(stack, count) ??
+    push(const FixedNullableList<UnresolvedType>().pop(stack, count) ??
         NullValue.TypeArguments);
   }
 
@@ -3892,8 +3966,13 @@
   void handleThisExpression(Token token, IdentifierContext context) {
     debugEvent("ThisExpression");
     if (context.isScopeReference && isInstanceContext) {
-      push(new ThisAccessGenerator(
-          this, token, inInitializer, inFieldInitializer));
+      if (extensionThis != null) {
+        push(_createReadOnlyVariableAccess(
+            extensionThis, token, offsetForToken(token), 'this'));
+      } else {
+        push(new ThisAccessGenerator(
+            this, token, inInitializer, inFieldInitializer));
+      }
     } else {
       push(new IncompleteErrorGenerator(
           this, token, fasta.messageThisAsIdentifier));
@@ -3903,7 +3982,9 @@
   @override
   void handleSuperExpression(Token token, IdentifierContext context) {
     debugEvent("SuperExpression");
-    if (context.isScopeReference && isInstanceContext) {
+    if (context.isScopeReference &&
+        isInstanceContext &&
+        extensionThis == null) {
       Member member = this.member.target;
       member.transformerFlags |= TransformerFlag.superCalls;
       push(new ThisAccessGenerator(
@@ -3937,7 +4018,7 @@
       ..fileOffset = name.charOffset;
     // TODO(ahe): Why are we looking up in local scope, but declaring in parent
     // scope?
-    Declaration existing = scope.local[name.name];
+    Builder existing = scope.local[name.name];
     if (existing != null) {
       reportDuplicatedDeclaration(existing, name.name, name.charOffset);
     }
@@ -3963,7 +4044,7 @@
     functionNestingLevel--;
     inCatchBlock = pop();
     switchScope = pop();
-    List<KernelTypeVariableBuilder> typeVariables = pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     exitLocalScope();
     push(typeVariables ?? NullValue.TypeVariables);
   }
@@ -3977,7 +4058,7 @@
   @override
   void beginNamedFunctionExpression(Token token) {
     debugEvent("beginNamedFunctionExpression");
-    List<KernelTypeVariableBuilder> typeVariables = pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     // Create an additional scope in which the named function expression is
     // declared.
     enterLocalScope("named function");
@@ -3997,10 +4078,10 @@
     exitLocalScope();
     FormalParameters formals = pop();
     Object declaration = pop();
-    UnresolvedType<KernelTypeBuilder> returnType = pop();
+    UnresolvedType returnType = pop();
     bool hasImplicitReturnType = returnType == null;
     exitFunction();
-    List<KernelTypeVariableBuilder> typeParameters = pop();
+    List<TypeVariableBuilder> typeParameters = pop();
     List<Expression> annotations;
     if (!isFunctionExpression) {
       annotations = pop(); // Metadata.
@@ -4086,7 +4167,7 @@
     exitLocalScope();
     FormalParameters formals = pop();
     exitFunction();
-    List<KernelTypeVariableBuilder> typeParameters = pop();
+    List<TypeVariableBuilder> typeParameters = pop();
     FunctionNode function = formals.buildFunctionNode(
         library, null, typeParameters, asyncModifier, body, token.charOffset)
       ..fileOffset = beginToken.charOffset;
@@ -4675,7 +4756,7 @@
     if (hasTarget) {
       identifier = pop();
       name = identifier.name;
-      Declaration namedTarget = scope.lookupLabel(identifier.name);
+      Builder namedTarget = scope.lookupLabel(identifier.name);
       if (namedTarget != null && namedTarget is! JumpTarget) {
         Token labelToken = continueKeyword.next;
         push(problemInLoopOrSwitch = buildProblemStatement(
@@ -4728,8 +4809,8 @@
     debugEvent("beginTypeVariable");
     Identifier name = pop();
     List<Expression> annotations = pop();
-    KernelTypeVariableBuilder variable = new KernelTypeVariableBuilder(
-        name.name, library, name.charOffset, null);
+    TypeVariableBuilder variable =
+        new TypeVariableBuilder(name.name, library, name.charOffset);
     if (annotations != null) {
       inferAnnotations(annotations);
       for (Expression annotation in annotations) {
@@ -4743,8 +4824,8 @@
   void handleTypeVariablesDefined(Token token, int count) {
     debugEvent("handleTypeVariablesDefined");
     assert(count > 0);
-    List<KernelTypeVariableBuilder> typeVariables =
-        const FixedNullableList<KernelTypeVariableBuilder>().pop(stack, count);
+    List<TypeVariableBuilder> typeVariables =
+        const FixedNullableList<TypeVariableBuilder>().pop(stack, count);
     enterFunctionTypeScope(typeVariables);
     push(typeVariables);
   }
@@ -4752,11 +4833,11 @@
   @override
   void endTypeVariable(Token token, int index, Token extendsOrSuper) {
     debugEvent("TypeVariable");
-    UnresolvedType<KernelTypeBuilder> bound = pop();
+    UnresolvedType bound = pop();
     // Peek to leave type parameters on top of stack.
-    List<KernelTypeVariableBuilder> typeVariables = peek();
+    List<TypeVariableBuilder> typeVariables = peek();
 
-    KernelTypeVariableBuilder variable = typeVariables[index];
+    TypeVariableBuilder variable = typeVariables[index];
     variable.bound = bound?.builder;
   }
 
@@ -4764,10 +4845,10 @@
   void endTypeVariables(Token beginToken, Token endToken) {
     debugEvent("TypeVariables");
     // Peek to leave type parameters on top of stack.
-    List<KernelTypeVariableBuilder> typeVariables = peek();
+    List<TypeVariableBuilder> typeVariables = peek();
 
     if (!legacyMode) {
-      List<KernelTypeBuilder> calculatedBounds = calculateBounds(
+      List<TypeBuilder> calculatedBounds = calculateBounds(
           typeVariables,
           library.loader.target.dynamicType,
           library.loader.target.bottomType,
@@ -4800,13 +4881,13 @@
   }
 
   List<TypeParameter> typeVariableBuildersToKernel(
-      List<KernelTypeVariableBuilder> typeVariableBuilders) {
+      List<TypeVariableBuilder> typeVariableBuilders) {
     if (typeVariableBuilders == null) return null;
     List<TypeParameter> typeParameters = new List<TypeParameter>.filled(
         typeVariableBuilders.length, null,
         growable: true);
     int i = 0;
-    for (KernelTypeVariableBuilder builder in typeVariableBuilders) {
+    for (TypeVariableBuilder builder in typeVariableBuilders) {
       typeParameters[i++] = builder.target;
     }
     return typeParameters;
@@ -4895,8 +4976,7 @@
       [int charOffset = -1]) {
     addProblemErrorIfConst(message, charOffset, className.length);
     // TODO(ahe): The following doesn't make sense to Analyzer AST.
-    Declaration constructor =
-        library.loader.getAbstractClassInstantiationError();
+    Builder constructor = library.loader.getAbstractClassInstantiationError();
     Expression invocation = buildStaticInvocation(
         constructor.target,
         forest.arguments(<Expression>[
@@ -4969,7 +5049,7 @@
   Initializer buildFieldInitializer(bool isSynthetic, String name,
       int fieldNameOffset, int assignmentOffset, Expression expression,
       {DartType formalType}) {
-    Declaration builder =
+    Builder builder =
         classBuilder.scope.local[name] ?? classBuilder.origin.scope.local[name];
     if (builder?.next != null) {
       // Duplicated name, already reported.
@@ -4982,7 +5062,7 @@
                 ..fileOffset = fieldNameOffset)
             ..fileOffset = fieldNameOffset)
         ..fileOffset = fieldNameOffset;
-    } else if (builder is KernelFieldBuilder && builder.isInstanceMember) {
+    } else if (builder is FieldBuilder && builder.isInstanceMember) {
       initializedFields ??= <String, int>{};
       if (initializedFields.containsKey(name)) {
         return buildDuplicatedInitializer(builder.field, expression, name,
@@ -5000,7 +5080,7 @@
                   .withArguments(name)
                   .withLocation(uri, builder.charOffset, name.length)
             ]);
-        Declaration constructor =
+        Builder constructor =
             library.loader.getDuplicatedFieldInitializerError();
         Expression invocation = buildStaticInvocation(
             constructor.target,
@@ -5116,12 +5196,10 @@
   }
 
   @override
-  UnresolvedType<KernelTypeBuilder> validateTypeUse(
-      UnresolvedType<KernelTypeBuilder> unresolved,
-      bool nonInstanceAccessIsError) {
-    KernelTypeBuilder builder = unresolved.builder;
-    if (builder is KernelNamedTypeBuilder &&
-        builder.declaration.isTypeVariable) {
+  UnresolvedType validateTypeUse(
+      UnresolvedType unresolved, bool nonInstanceAccessIsError) {
+    TypeBuilder builder = unresolved.builder;
+    if (builder is NamedTypeBuilder && builder.declaration.isTypeVariable) {
       TypeParameter typeParameter = builder.declaration.target;
       LocatedMessage message;
       if (!isInstanceContext && typeParameter.parent is Class) {
@@ -5138,9 +5216,9 @@
         return unresolved;
       }
       addProblem(message.messageObject, message.charOffset, message.length);
-      return new UnresolvedType<KernelTypeBuilder>(
-          new KernelNamedTypeBuilder(typeParameter.name, null)
-            ..bind(new KernelInvalidTypeBuilder(typeParameter.name, message)),
+      return new UnresolvedType(
+          new NamedTypeBuilder(typeParameter.name, null)
+            ..bind(new InvalidTypeBuilder(typeParameter.name, message)),
           unresolved.charOffset,
           unresolved.fileUri);
     }
@@ -5262,7 +5340,7 @@
 
   @override
   void reportDuplicatedDeclaration(
-      Declaration existing, String name, int charOffset) {
+      Builder existing, String name, int charOffset) {
     List<LocatedMessage> context = existing.isSynthetic
         ? null
         : <LocatedMessage>[
@@ -5288,16 +5366,18 @@
 
   @override
   Expression wrapInDeferredCheck(
-      Expression expression, KernelPrefixBuilder prefix, int charOffset) {
+      Expression expression, PrefixBuilder prefix, int charOffset) {
     VariableDeclaration check = new VariableDeclaration.forValue(
         forest.checkLibraryIsLoaded(prefix.dependency))
       ..fileOffset = charOffset;
     return new DeferredCheckJudgment(check, expression);
   }
 
-  /// TODO(ahe): This method is temporarily implemented by subclasses. Once type
-  /// promotion is independent of shadow nodes, remove this method.
-  void enterThenForTypePromotion(Expression condition);
+  /// TODO(ahe): This method is temporarily implemented. Once type promotion is
+  /// independent of shadow nodes, remove this method.
+  void enterThenForTypePromotion(Expression condition) {
+    typePromoter?.enterThen(condition);
+  }
 
   bool isErroneousNode(TreeNode node) {
     return library.loader.handledErrors.isNotEmpty &&
@@ -5305,7 +5385,7 @@
   }
 
   @override
-  DartType buildDartType(UnresolvedType<KernelTypeBuilder> unresolvedType,
+  DartType buildDartType(UnresolvedType unresolvedType,
       {bool nonInstanceAccessIsError: false}) {
     if (unresolvedType == null) return null;
     return validateTypeUse(unresolvedType, nonInstanceAccessIsError)
@@ -5314,8 +5394,7 @@
   }
 
   @override
-  List<DartType> buildDartTypeArguments(
-      List<UnresolvedType<KernelTypeBuilder>> unresolvedTypes) {
+  List<DartType> buildDartTypeArguments(List<UnresolvedType> unresolvedTypes) {
     if (unresolvedTypes == null) return <DartType>[];
     List<DartType> types =
         new List<DartType>.filled(unresolvedTypes.length, null, growable: true);
@@ -5391,6 +5470,11 @@
   }
 }
 
+abstract class EnsureLoaded {
+  void ensureLoaded(Member member);
+  bool isLoaded(Member member);
+}
+
 class Operator {
   final Token token;
   String get name => token.stringValue;
@@ -5402,7 +5486,7 @@
   String toString() => "operator($name)";
 }
 
-class JumpTarget extends Declaration {
+class JumpTarget extends Builder {
   final List<Statement> users = <Statement>[];
 
   final JumpTargetKind kind;
@@ -5472,7 +5556,7 @@
   String get fullNameForErrors => "<jump-target>";
 }
 
-class LabelTarget extends Declaration implements JumpTarget {
+class LabelTarget extends Builder implements JumpTarget {
   @override
   final MemberBuilder parent;
 
@@ -5535,7 +5619,7 @@
 }
 
 class FormalParameters {
-  final List<KernelFormalParameterBuilder> parameters;
+  final List<FormalParameterBuilder> parameters;
   final int charOffset;
   final int length;
   final Uri uri;
@@ -5547,9 +5631,9 @@
   }
 
   FunctionNode buildFunctionNode(
-      KernelLibraryBuilder library,
-      UnresolvedType<KernelTypeBuilder> returnType,
-      List<KernelTypeVariableBuilder> typeParameters,
+      SourceLibraryBuilder library,
+      UnresolvedType returnType,
+      List<TypeVariableBuilder> typeParameters,
       AsyncMarker asyncModifier,
       Statement body,
       int fileEndOffset) {
@@ -5558,7 +5642,7 @@
     List<VariableDeclaration> positionalParameters = <VariableDeclaration>[];
     List<VariableDeclaration> namedParameters = <VariableDeclaration>[];
     if (parameters != null) {
-      for (KernelFormalParameterBuilder parameter in parameters) {
+      for (FormalParameterBuilder parameter in parameters) {
         if (parameter.isNamed) {
           namedParameters.add(parameter.target);
         } else {
@@ -5580,24 +5664,23 @@
       ..fileEndOffset = fileEndOffset;
   }
 
-  UnresolvedType<KernelTypeBuilder> toFunctionType(
-      UnresolvedType<KernelTypeBuilder> returnType,
-      [List<KernelTypeVariableBuilder> typeParameters]) {
+  UnresolvedType toFunctionType(UnresolvedType returnType,
+      [List<TypeVariableBuilder> typeParameters]) {
     return new UnresolvedType(
-        new KernelFunctionTypeBuilder(
+        new FunctionTypeBuilder(
             returnType?.builder, typeParameters, parameters),
         charOffset,
         uri);
   }
 
   Scope computeFormalParameterScope(
-      Scope parent, Declaration declaration, ExpressionGeneratorHelper helper) {
+      Scope parent, Builder declaration, ExpressionGeneratorHelper helper) {
     if (parameters == null) return parent;
     assert(parameters.isNotEmpty);
-    Map<String, Declaration> local = <String, Declaration>{};
+    Map<String, Builder> local = <String, Builder>{};
 
-    for (KernelFormalParameterBuilder parameter in parameters) {
-      Declaration existing = local[parameter.name];
+    for (FormalParameterBuilder parameter in parameters) {
+      Builder existing = local[parameter.name];
       if (existing != null) {
         helper.reportDuplicatedDeclaration(
             existing, parameter.name, parameter.charOffset);
@@ -5637,15 +5720,13 @@
   return prefix == null ? result : "$prefix.result";
 }
 
+// TODO(johnniwinther): This is a bit ad hoc. Call sites should know what kind
+// of objects can be anticipated and handle these directly.
 String getNodeName(Object node) {
   if (node is Identifier) {
     return node.name;
-  } else if (node is Declaration) {
+  } else if (node is Builder) {
     return node.fullNameForErrors;
-  } else if (node is ThisAccessGenerator) {
-    return node.isSuper ? "super" : "this";
-  } else if (node is Generator) {
-    return node.plainNameForRead;
   } else if (node is QualifiedName) {
     return flattenName(node, node.charOffset, null);
   } else {
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
index 0960fca..80dbfc9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/class_hierarchy_builder.dart
@@ -12,7 +12,6 @@
         FunctionNode,
         InterfaceType,
         InvalidType,
-        Library,
         Member,
         Name,
         Procedure,
@@ -58,6 +57,8 @@
 
 import '../scope.dart' show Scope;
 
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import '../source/source_loader.dart' show SourceLoader;
 
 import '../type_inference/standard_bounds.dart' show StandardBounds;
@@ -75,16 +76,13 @@
 
 import 'kernel_builder.dart'
     show
-        Declaration,
+        Builder,
         FormalParameterBuilder,
         ImplicitFieldType,
-        KernelClassBuilder,
-        KernelFieldBuilder,
-        KernelLibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelProcedureBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
+        ClassBuilder,
+        FieldBuilder,
+        NamedTypeBuilder,
+        ProcedureBuilder,
         LibraryBuilder,
         MemberBuilder,
         TypeBuilder,
@@ -100,7 +98,7 @@
   void log(Object message) => print(message);
 }
 
-int compareDeclarations(Declaration a, Declaration b) {
+int compareDeclarations(Builder a, Builder b) {
   return ClassHierarchy.compareMembers(a.target, b.target);
 }
 
@@ -108,8 +106,7 @@
   return member is Procedure ? member.kind : null;
 }
 
-bool isNameVisibleIn(
-    Name name, LibraryBuilder<KernelTypeBuilder, Library> library) {
+bool isNameVisibleIn(Name name, LibraryBuilder library) {
   return !name.isPrivate || name.library == library.target;
 }
 
@@ -119,7 +116,7 @@
 /// See the section named "Class Member Conflicts" in [Dart Programming
 /// Language Specification](
 /// ../../../../../../docs/language/dartLangSpec.tex#classMemberConflicts).
-bool isInheritanceConflict(Declaration a, Declaration b) {
+bool isInheritanceConflict(Builder a, Builder b) {
   if (a.isStatic) return true;
   if (memberKind(a.target) == memberKind(b.target)) return false;
   if (a.isField) return !(b.isField || b.isGetter || b.isSetter);
@@ -130,7 +127,7 @@
   return true;
 }
 
-bool impliesSetter(Declaration declaration) {
+bool impliesSetter(Builder declaration) {
   return declaration.isField && !(declaration.isFinal || declaration.isConst);
 }
 
@@ -199,9 +196,9 @@
 class ClassHierarchyBuilder {
   final Map<Class, ClassHierarchyNode> nodes = <Class, ClassHierarchyNode>{};
 
-  final KernelClassBuilder objectClass;
+  final ClassBuilder objectClass;
 
-  final Loader<Library> loader;
+  final Loader loader;
 
   final Class objectKernelClass;
 
@@ -231,13 +228,13 @@
     types = new Types(this);
   }
 
-  ClassHierarchyNode getNodeFromClass(KernelClassBuilder cls) {
+  ClassHierarchyNode getNodeFromClass(ClassBuilder cls) {
     return nodes[cls.target] ??=
         new ClassHierarchyNodeBuilder(this, cls).build();
   }
 
-  ClassHierarchyNode getNodeFromType(KernelTypeBuilder type) {
-    KernelClassBuilder cls = getClass(type);
+  ClassHierarchyNode getNodeFromType(TypeBuilder type) {
+    ClassBuilder cls = getClass(type);
     return cls == null ? null : getNodeFromClass(cls);
   }
 
@@ -246,24 +243,23 @@
         getNodeFromClass(loader.computeClassBuilderFromTargetClass(cls));
   }
 
-  KernelTypeBuilder asSupertypeOf(Class cls, Class supertype) {
+  TypeBuilder asSupertypeOf(Class cls, Class supertype) {
     ClassHierarchyNode clsNode = getNodeFromKernelClass(cls);
     if (cls == supertype) {
-      return new KernelNamedTypeBuilder(clsNode.cls.name, null)
-        ..bind(clsNode.cls);
+      return new NamedTypeBuilder(clsNode.cls.name, null)..bind(clsNode.cls);
     }
     ClassHierarchyNode supertypeNode = getNodeFromKernelClass(supertype);
-    List<KernelTypeBuilder> supertypes = clsNode.superclasses;
+    List<TypeBuilder> supertypes = clsNode.superclasses;
     int depth = supertypeNode.depth;
-    Declaration supertypeDeclaration = supertypeNode.cls;
+    Builder supertypeDeclaration = supertypeNode.cls;
     if (depth < supertypes.length) {
-      KernelTypeBuilder asSupertypeOf = supertypes[depth];
+      TypeBuilder asSupertypeOf = supertypes[depth];
       if (asSupertypeOf.declaration == supertypeDeclaration)
         return asSupertypeOf;
     }
     supertypes = clsNode.interfaces;
     for (int i = 0; i < supertypes.length; i++) {
-      KernelTypeBuilder type = supertypes[i];
+      TypeBuilder type = supertypes[i];
       if (type.declaration == supertypeDeclaration) return type;
     }
     return null;
@@ -285,7 +281,7 @@
                 superclass.typeParameters.length, nullKernelClass.rawType));
       }
     }
-    KernelNamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
+    NamedTypeBuilder supertype = asSupertypeOf(kernelClass, superclass);
     if (supertype == null) return null;
     if (supertype.arguments == null && superclass.typeParameters.isEmpty) {
       return superclass.rawType;
@@ -344,8 +340,8 @@
   }
 
   Member getCombinedMemberSignatureKernel(Class cls, Name name, bool isSetter,
-      int charOffset, KernelLibraryBuilder library) {
-    Declaration declaration =
+      int charOffset, SourceLibraryBuilder library) {
+    Builder declaration =
         getNodeFromKernelClass(cls).getInterfaceMember(name, isSetter);
     if (declaration?.isStatic ?? true) return null;
     if (declaration.next != null) {
@@ -363,15 +359,12 @@
     }
   }
 
-  static ClassHierarchyBuilder build(
-      KernelClassBuilder objectClass,
-      List<KernelClassBuilder> classes,
-      SourceLoader loader,
-      CoreTypes coreTypes) {
+  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++) {
-      KernelClassBuilder cls = classes[i];
+      ClassBuilder cls = classes[i];
       if (!cls.isPatch) {
         hierarchy.nodes[cls.target] =
             new ClassHierarchyNodeBuilder(hierarchy, cls).build();
@@ -387,15 +380,15 @@
 class ClassHierarchyNodeBuilder {
   final ClassHierarchyBuilder hierarchy;
 
-  final KernelClassBuilder cls;
+  final ClassBuilder cls;
 
   bool hasNoSuchMethod = false;
 
-  List<Declaration> abstractMembers = null;
+  List<Builder> abstractMembers = null;
 
   ClassHierarchyNodeBuilder(this.hierarchy, this.cls);
 
-  KernelClassBuilder get objectClass => hierarchy.objectClass;
+  ClassBuilder get objectClass => hierarchy.objectClass;
 
   final Map<Class, Substitution> substitutions = <Class, Substitution>{};
 
@@ -409,8 +402,7 @@
   ///
   /// If [mergeKind] is `MergeKind.supertypes`, [a] should implement [b], and
   /// [b] is implicitly abstract.
-  Declaration handleMergeConflict(
-      Declaration a, Declaration b, MergeKind mergeKind) {
+  Builder handleMergeConflict(Builder a, Builder b, MergeKind mergeKind) {
     debug?.log(
         "handleMergeConflict: ${fullName(a)} ${fullName(b)} ${mergeKind}");
     // TODO(ahe): Enable this optimization, but be careful about abstract
@@ -421,7 +413,7 @@
       // Don't check overrides involving duplicated members.
       return a;
     }
-    Declaration result = checkInheritanceConflict(a, b);
+    Builder result = checkInheritanceConflict(a, b);
     if (result != null) return result;
     result = a;
     switch (mergeKind) {
@@ -474,7 +466,7 @@
       case MergeKind.membersWithSetters:
       case MergeKind.settersWithMembers:
         if (a.parent == cls && b.parent != cls) {
-          if (a is KernelFieldBuilder) {
+          if (a is FieldBuilder) {
             if (a.isFinal && b.isSetter) {
               hierarchy.overrideChecks.add(new DelayedOverrideCheck(cls, a, b));
             } else {
@@ -483,7 +475,7 @@
                     .add(new DelayedOverrideCheck(cls, a, b));
               }
             }
-          } else if (a is KernelProcedureBuilder) {
+          } else if (a is ProcedureBuilder) {
             if (!inferMethodTypes(a, b)) {
               hierarchy.overrideChecks.add(new DelayedOverrideCheck(cls, a, b));
             }
@@ -547,19 +539,19 @@
     return result;
   }
 
-  Declaration checkInheritanceConflict(Declaration a, Declaration b) {
+  Builder checkInheritanceConflict(Builder a, Builder b) {
     if (a is DelayedMember) {
-      Declaration result;
+      Builder result;
       for (int i = 0; i < a.declarations.length; i++) {
-        Declaration d = checkInheritanceConflict(a.declarations[i], b);
+        Builder d = checkInheritanceConflict(a.declarations[i], b);
         result ??= d;
       }
       return result;
     }
     if (b is DelayedMember) {
-      Declaration result;
+      Builder result;
       for (int i = 0; i < b.declarations.length; i++) {
-        Declaration d = checkInheritanceConflict(a, b.declarations[i]);
+        Builder d = checkInheritanceConflict(a, b.declarations[i]);
         result ??= d;
       }
       return result;
@@ -571,12 +563,12 @@
     return null;
   }
 
-  bool inferMethodTypes(KernelProcedureBuilder a, Declaration b) {
+  bool inferMethodTypes(ProcedureBuilder a, Builder b) {
     debug?.log(
         "Trying to infer types for ${fullName(a)} based on ${fullName(b)}");
     if (b is DelayedMember) {
       bool hasSameSignature = true;
-      List<Declaration> declarations = b.declarations;
+      List<Builder> declarations = b.declarations;
       for (int i = 0; i < declarations.length; i++) {
         if (!inferMethodTypes(a, declarations[i])) {
           hasSameSignature = false;
@@ -590,7 +582,7 @@
       return inferSetterType(a, b);
     }
     bool hadTypesInferred = a.hadTypesInferred;
-    KernelClassBuilder aCls = a.parent;
+    ClassBuilder aCls = a.parent;
     Substitution aSubstitution;
     if (cls != aCls) {
       assert(substitutions.containsKey(aCls.target),
@@ -599,7 +591,7 @@
       debug?.log(
           "${cls.fullNameForErrors} -> ${aCls.fullNameForErrors} $aSubstitution");
     }
-    KernelClassBuilder bCls = b.parent;
+    ClassBuilder bCls = b.parent;
     Substitution bSubstitution;
     if (cls != bCls) {
       assert(substitutions.containsKey(bCls.target),
@@ -748,7 +740,7 @@
           bType = substitution.substituteType(bType);
         }
         if (aType != bType) {
-          FormalParameterBuilder<KernelTypeBuilder> parameter;
+          FormalParameterBuilder parameter;
           for (int i = aPositional.length; i < a.formals.length; ++i) {
             if (a.formals[i].name == name) {
               parameter = a.formals[i];
@@ -770,7 +762,7 @@
     return result;
   }
 
-  bool inferGetterType(KernelProcedureBuilder a, Declaration b) {
+  bool inferGetterType(ProcedureBuilder a, Builder b) {
     debug?.log(
         "Inferring getter types for ${fullName(a)} based on ${fullName(b)}");
     Member bTarget = b.target;
@@ -803,7 +795,7 @@
     return a.target.function.returnType == bType;
   }
 
-  bool inferSetterType(KernelProcedureBuilder a, Declaration b) {
+  bool inferSetterType(ProcedureBuilder a, Builder b) {
     debug?.log(
         "Inferring setter types for ${fullName(a)} based on ${fullName(b)}");
     Member bTarget = b.target;
@@ -843,10 +835,10 @@
     return aParameter.type == bType;
   }
 
-  void checkValidOverride(Declaration a, Declaration b) {
+  void checkValidOverride(Builder a, Builder b) {
     debug?.log(
         "checkValidOverride(${fullName(a)}, ${fullName(b)}) ${a.runtimeType}");
-    if (a is KernelProcedureBuilder) {
+    if (a is ProcedureBuilder) {
       if (inferMethodTypes(a, b)) return;
     } else if (a.isField) {
       if (inferFieldTypes(a, b)) return;
@@ -867,12 +859,12 @@
     }
   }
 
-  bool inferFieldTypes(MemberBuilder a, Declaration b) {
+  bool inferFieldTypes(MemberBuilder a, Builder b) {
     debug?.log(
         "Trying to infer field types for ${fullName(a)} based on ${fullName(b)}");
     if (b is DelayedMember) {
       bool hasSameSignature = true;
-      List<Declaration> declarations = b.declarations;
+      List<Builder> declarations = b.declarations;
       for (int i = 0; i < declarations.length; i++) {
         if (!inferFieldTypes(a, declarations[i])) {
           hasSameSignature = false;
@@ -904,7 +896,7 @@
       debug?.log("Giving up (inheritedType == null)\n${StackTrace.current}");
       return false;
     }
-    KernelClassBuilder aCls = a.parent;
+    ClassBuilder aCls = a.parent;
     Substitution aSubstitution;
     if (cls != aCls) {
       assert(substitutions.containsKey(aCls.target),
@@ -913,7 +905,7 @@
       debug?.log(
           "${cls.fullNameForErrors} -> ${aCls.fullNameForErrors} $aSubstitution");
     }
-    KernelClassBuilder bCls = b.parent;
+    ClassBuilder bCls = b.parent;
     Substitution bSubstitution;
     if (cls != bCls) {
       assert(substitutions.containsKey(bCls.target),
@@ -933,7 +925,7 @@
     if (declaredType == inheritedType) return true;
 
     bool result = false;
-    if (a is KernelFieldBuilder) {
+    if (a is FieldBuilder) {
       if (a.parent == cls && a.type == null) {
         if (a.hadTypesInferred) {
           reportCantInferFieldType(cls, a);
@@ -943,8 +935,8 @@
           a.hadTypesInferred = true;
         }
         if (inheritedType is ImplicitFieldType) {
-          KernelLibraryBuilder library = cls.library;
-          (library.implicitlyTypedFields ??= <KernelFieldBuilder>[]).add(a);
+          SourceLibraryBuilder library = cls.library;
+          (library.implicitlyTypedFields ??= <FieldBuilder>[]).add(a);
         }
         a.target.type = inheritedType;
       }
@@ -952,8 +944,8 @@
     return result;
   }
 
-  void copyParameterCovariance(Declaration parent,
-      VariableDeclaration aParameter, VariableDeclaration bParameter) {
+  void copyParameterCovariance(Builder parent, VariableDeclaration aParameter,
+      VariableDeclaration bParameter) {
     if (parent == cls) {
       if (bParameter.isCovariant) {
         aParameter.isCovariant = true;
@@ -965,7 +957,7 @@
   }
 
   void copyParameterCovarianceFromField(
-      Declaration parent, VariableDeclaration aParameter, Field bField) {
+      Builder parent, VariableDeclaration aParameter, Field bField) {
     if (parent == cls) {
       if (bField.isCovariant) {
         aParameter.isCovariant = true;
@@ -976,7 +968,7 @@
     }
   }
 
-  void copyFieldCovariance(Declaration parent, Field aField, Field bField) {
+  void copyFieldCovariance(Builder parent, Field aField, Field bField) {
     if (parent == cls) {
       if (bField.isCovariant) {
         aField.isCovariant = true;
@@ -988,7 +980,7 @@
   }
 
   void copyFieldCovarianceFromParameter(
-      Declaration parent, Field aField, VariableDeclaration bParameter) {
+      Builder parent, Field aField, VariableDeclaration bParameter) {
     if (parent == cls) {
       if (bParameter.isCovariant) {
         aField.isCovariant = true;
@@ -1000,7 +992,7 @@
   }
 
   void copyTypeParameterCovariance(
-      Declaration parent, TypeParameter aParameter, TypeParameter bParameter) {
+      Builder parent, TypeParameter aParameter, TypeParameter bParameter) {
     if (parent == cls) {
       if (bParameter.isGenericCovariantImpl) {
         aParameter.isGenericCovariantImpl = true;
@@ -1008,7 +1000,7 @@
     }
   }
 
-  void reportInheritanceConflict(Declaration a, Declaration b) {
+  void reportInheritanceConflict(Builder a, Builder b) {
     String name = a.fullNameForErrors;
     if (a.parent != b.parent) {
       if (a.parent == cls) {
@@ -1024,8 +1016,8 @@
             context: inheritedConflictContext(a, b));
       }
     } else if (a.isStatic != b.isStatic) {
-      Declaration staticMember;
-      Declaration instanceMember;
+      Builder staticMember;
+      Builder instanceMember;
       if (a.isStatic) {
         staticMember = a;
         instanceMember = b;
@@ -1045,8 +1037,8 @@
       // we always report the one with higher charOffset as the duplicate,
       // the message duplication logic ensures that we only report this
       // problem once.
-      Declaration existing;
-      Declaration duplicate;
+      Builder existing;
+      Builder duplicate;
       assert(a.fileUri == b.fileUri);
       if (a.charOffset < b.charOffset) {
         existing = a;
@@ -1073,7 +1065,7 @@
   ///
   /// If [mergeKind] is `MergeKind.supertypes`, [member] isn't
   /// implementing/overriding anything.
-  void handleOnlyA(Declaration member, MergeKind mergeKind) {
+  void handleOnlyA(Builder member, MergeKind mergeKind) {
     if (mergeKind == MergeKind.interfacesMembers ||
         mergeKind == MergeKind.interfacesSetters) {
       return;
@@ -1097,7 +1089,7 @@
   ///
   /// If [mergeKind] is `MergeKind.supertypes`, [member] is implicitly
   /// abstract, and not implemented.
-  Declaration handleOnlyB(Declaration member, MergeKind mergeKind) {
+  Builder handleOnlyB(Builder member, MergeKind mergeKind) {
     if (mergeKind == MergeKind.interfacesMembers ||
         mergeKind == MergeKind.interfacesSetters) {
       return member;
@@ -1128,8 +1120,8 @@
     return member;
   }
 
-  void recordAbstractMember(Declaration member) {
-    abstractMembers ??= <Declaration>[];
+  void recordAbstractMember(Builder member) {
+    abstractMembers ??= <Builder>[];
     if (member is DelayedMember) {
       abstractMembers.addAll(member.declarations);
     } else {
@@ -1150,53 +1142,51 @@
 
     Scope scope = cls.scope;
     if (cls.isMixinApplication) {
-      Declaration mixin = cls.mixedInType.declaration;
+      Builder mixin = cls.mixedInType.declaration;
       inferMixinApplication();
       // recordSupertype(cls.mixedInType);
       while (mixin.isNamedMixinApplication) {
-        KernelClassBuilder named = mixin;
+        ClassBuilder named = mixin;
         // recordSupertype(named.mixedInType);
         mixin = named.mixedInType.declaration;
       }
-      if (mixin is KernelClassBuilder) {
+      if (mixin is ClassBuilder) {
         scope = mixin.scope.computeMixinScope();
       }
     }
 
     /// Members (excluding setters) declared in [cls].
-    List<Declaration> localMembers =
-        new List<Declaration>.from(scope.local.values)
-          ..sort(compareDeclarations);
+    List<Builder> localMembers = new List<Builder>.from(scope.local.values)
+      ..sort(compareDeclarations);
 
     /// Setters declared in [cls].
-    List<Declaration> localSetters =
-        new List<Declaration>.from(scope.setters.values)
-          ..sort(compareDeclarations);
+    List<Builder> localSetters = new List<Builder>.from(scope.setters.values)
+      ..sort(compareDeclarations);
 
     // Add implied setters from fields in [localMembers].
     localSetters = mergeAccessors(localMembers, localSetters);
 
     /// Members (excluding setters) declared in [cls] or its superclasses. This
     /// includes static methods of [cls], but not its superclasses.
-    List<Declaration> classMembers;
+    List<Builder> classMembers;
 
     /// Setters declared in [cls] or its superclasses. This includes static
     /// setters of [cls], but not its superclasses.
-    List<Declaration> classSetters;
+    List<Builder> classSetters;
 
     /// Members (excluding setters) inherited from interfaces. This contains no static
     /// members. Is null if no interfaces are implemented by this class or its
     /// superclasses.
-    List<Declaration> interfaceMembers;
+    List<Builder> interfaceMembers;
 
     /// Setters inherited from interfaces. This contains no static setters. Is
     /// null if no interfaces are implemented by this class or its
     /// superclasses.
-    List<Declaration> interfaceSetters;
+    List<Builder> interfaceSetters;
 
-    List<KernelTypeBuilder> superclasses;
+    List<TypeBuilder> superclasses;
 
-    List<KernelTypeBuilder> interfaces;
+    List<TypeBuilder> interfaces;
 
     int maxInheritancePath;
 
@@ -1204,23 +1194,22 @@
       // This should be Object.
       classMembers = localMembers;
       classSetters = localSetters;
-      superclasses = new List<KernelTypeBuilder>(0);
-      interfaces = new List<KernelTypeBuilder>(0);
+      superclasses = new List<TypeBuilder>(0);
+      interfaces = new List<TypeBuilder>(0);
       maxInheritancePath = 0;
     } else {
       maxInheritancePath = supernode.maxInheritancePath + 1;
-      superclasses =
-          new List<KernelTypeBuilder>(supernode.superclasses.length + 1);
+      superclasses = new List<TypeBuilder>(supernode.superclasses.length + 1);
       superclasses.setRange(0, superclasses.length - 1,
           substSupertypes(cls.supertype, supernode.superclasses));
       superclasses[superclasses.length - 1] = recordSupertype(cls.supertype);
 
-      List<KernelTypeBuilder> directInterfaces = ignoreFunction(cls.interfaces);
+      List<TypeBuilder> directInterfaces = ignoreFunction(cls.interfaces);
       if (cls.isMixinApplication) {
         if (directInterfaces == null) {
-          directInterfaces = <KernelTypeBuilder>[cls.mixedInType];
+          directInterfaces = <TypeBuilder>[cls.mixedInType];
         } else {
-          directInterfaces = <KernelTypeBuilder>[cls.mixedInType]
+          directInterfaces = <TypeBuilder>[cls.mixedInType]
             ..addAll(directInterfaces);
         }
       }
@@ -1229,7 +1218,7 @@
           recordSupertype(directInterfaces[i]);
         }
       }
-      List<KernelTypeBuilder> superclassInterfaces = supernode.interfaces;
+      List<TypeBuilder> superclassInterfaces = supernode.interfaces;
       if (superclassInterfaces != null) {
         superclassInterfaces =
             substSupertypes(cls.supertype, superclassInterfaces);
@@ -1244,14 +1233,14 @@
         MergeResult result = mergeInterfaces(supernode, directInterfaces);
         interfaceMembers = result.mergedMembers;
         interfaceSetters = result.mergedSetters;
-        interfaces = <KernelTypeBuilder>[];
+        interfaces = <TypeBuilder>[];
         if (superclassInterfaces != null) {
           for (int i = 0; i < superclassInterfaces.length; i++) {
             addInterface(interfaces, superclasses, superclassInterfaces[i]);
           }
         }
         for (int i = 0; i < directInterfaces.length; i++) {
-          KernelTypeBuilder directInterface = directInterfaces[i];
+          TypeBuilder directInterface = directInterfaces[i];
           addInterface(interfaces, superclasses, directInterface);
           ClassHierarchyNode interfaceNode =
               hierarchy.getNodeFromType(directInterface);
@@ -1259,14 +1248,14 @@
             if (maxInheritancePath < interfaceNode.maxInheritancePath + 1) {
               maxInheritancePath = interfaceNode.maxInheritancePath + 1;
             }
-            List<KernelTypeBuilder> types =
+            List<TypeBuilder> types =
                 substSupertypes(directInterface, interfaceNode.superclasses);
             for (int i = 0; i < types.length; i++) {
               addInterface(interfaces, superclasses, types[i]);
             }
 
             if (interfaceNode.interfaces != null) {
-              List<KernelTypeBuilder> types =
+              List<TypeBuilder> types =
                   substSupertypes(directInterface, interfaceNode.interfaces);
               for (int i = 0; i < types.length; i++) {
                 addInterface(interfaces, superclasses, types[i]);
@@ -1327,23 +1316,22 @@
     );
   }
 
-  KernelTypeBuilder recordSupertype(KernelTypeBuilder supertype) {
-    if (supertype is KernelNamedTypeBuilder) {
+  TypeBuilder recordSupertype(TypeBuilder supertype) {
+    if (supertype is NamedTypeBuilder) {
       debug?.log(
           "In ${this.cls.fullNameForErrors} recordSupertype(${supertype.fullNameForErrors})");
-      Declaration declaration = supertype.declaration;
-      if (declaration is! KernelClassBuilder) return supertype;
-      KernelClassBuilder cls = declaration;
+      Builder declaration = supertype.declaration;
+      if (declaration is! ClassBuilder) return supertype;
+      ClassBuilder cls = declaration;
       if (cls.isMixinApplication) {
         recordSupertype(cls.mixedInType);
       }
-      List<TypeVariableBuilder<TypeBuilder, Object>> typeVariables =
-          cls.typeVariables;
+      List<TypeVariableBuilder> typeVariables = cls.typeVariables;
       if (typeVariables == null) {
         substitutions[cls.target] = Substitution.empty;
         assert(cls.target.typeParameters.isEmpty);
       } else {
-        List<KernelTypeBuilder> arguments =
+        List<TypeBuilder> arguments =
             supertype.arguments ?? computeDefaultTypeArguments(supertype);
         if (arguments.length != typeVariables.length) {
           arguments = computeDefaultTypeArguments(supertype);
@@ -1362,13 +1350,12 @@
     return supertype;
   }
 
-  List<KernelTypeBuilder> substSupertypes(
-      KernelNamedTypeBuilder supertype, List<KernelTypeBuilder> supertypes) {
-    Declaration declaration = supertype.declaration;
-    if (declaration is! KernelClassBuilder) return supertypes;
-    KernelClassBuilder cls = declaration;
-    List<TypeVariableBuilder<TypeBuilder, Object>> typeVariables =
-        cls.typeVariables;
+  List<TypeBuilder> substSupertypes(
+      NamedTypeBuilder supertype, List<TypeBuilder> supertypes) {
+    Builder declaration = supertype.declaration;
+    if (declaration is! ClassBuilder) return supertypes;
+    ClassBuilder cls = declaration;
+    List<TypeVariableBuilder> typeVariables = cls.typeVariables;
     if (typeVariables == null) {
       debug?.log("In ${this.cls.fullNameForErrors} $supertypes aren't substed");
       for (int i = 0; i < supertypes.length; i++) {
@@ -1376,18 +1363,17 @@
       }
       return supertypes;
     }
-    Map<TypeVariableBuilder<TypeBuilder, Object>, TypeBuilder> substitution =
-        <TypeVariableBuilder<TypeBuilder, Object>, TypeBuilder>{};
-    List<KernelTypeBuilder> arguments =
+    Map<TypeVariableBuilder, TypeBuilder> substitution =
+        <TypeVariableBuilder, TypeBuilder>{};
+    List<TypeBuilder> arguments =
         supertype.arguments ?? computeDefaultTypeArguments(supertype);
     for (int i = 0; i < typeVariables.length; i++) {
       substitution[typeVariables[i]] = arguments[i];
     }
-    List<KernelTypeBuilder> result;
+    List<TypeBuilder> result;
     for (int i = 0; i < supertypes.length; i++) {
-      KernelTypeBuilder supertype = supertypes[i];
-      KernelTypeBuilder substed =
-          recordSupertype(supertype.subst(substitution));
+      TypeBuilder supertype = supertypes[i];
+      TypeBuilder substed = recordSupertype(supertype.subst(substitution));
       if (supertype != substed) {
         debug?.log("In ${this.cls.fullNameForErrors} $supertype -> $substed");
         result ??= supertypes.toList();
@@ -1399,20 +1385,19 @@
     return result ?? supertypes;
   }
 
-  List<KernelTypeBuilder> computeDefaultTypeArguments(KernelTypeBuilder type) {
-    KernelClassBuilder cls = type.declaration;
-    List<KernelTypeBuilder> result =
-        new List<KernelTypeBuilder>(cls.typeVariables.length);
+  List<TypeBuilder> computeDefaultTypeArguments(TypeBuilder type) {
+    ClassBuilder cls = type.declaration;
+    List<TypeBuilder> result = new List<TypeBuilder>(cls.typeVariables.length);
     for (int i = 0; i < result.length; ++i) {
-      KernelTypeVariableBuilder tv = cls.typeVariables[i];
+      TypeVariableBuilder tv = cls.typeVariables[i];
       result[i] = tv.defaultType ??
           cls.library.loader.computeTypeBuilder(tv.target.defaultType);
     }
     return result;
   }
 
-  KernelTypeBuilder addInterface(List<KernelTypeBuilder> interfaces,
-      List<KernelTypeBuilder> superclasses, KernelTypeBuilder type) {
+  TypeBuilder addInterface(List<TypeBuilder> interfaces,
+      List<TypeBuilder> superclasses, TypeBuilder type) {
     ClassHierarchyNode node = hierarchy.getNodeFromType(type);
     if (node == null) return null;
     int depth = node.depth;
@@ -1435,13 +1420,13 @@
   }
 
   MergeResult mergeInterfaces(
-      ClassHierarchyNode supernode, List<KernelTypeBuilder> interfaces) {
+      ClassHierarchyNode supernode, List<TypeBuilder> interfaces) {
     debug?.log(
         "mergeInterfaces($cls (${this.cls}) ${supernode.interfaces} ${interfaces}");
-    List<List<Declaration>> memberLists =
-        new List<List<Declaration>>(interfaces.length + 1);
-    List<List<Declaration>> setterLists =
-        new List<List<Declaration>>(interfaces.length + 1);
+    List<List<Builder>> memberLists =
+        new List<List<Builder>>(interfaces.length + 1);
+    List<List<Builder>> setterLists =
+        new List<List<Builder>>(interfaces.length + 1);
     memberLists[0] = supernode.interfaceMembers;
     setterLists[0] = supernode.interfaceSetters;
     for (int i = 0; i < interfaces.length; i++) {
@@ -1461,16 +1446,15 @@
         mergeLists(setterLists, MergeKind.interfacesSetters));
   }
 
-  List<Declaration> mergeLists(
-      List<List<Declaration>> input, MergeKind mergeKind) {
+  List<Builder> mergeLists(List<List<Builder>> input, MergeKind mergeKind) {
     // This is a k-way merge sort (where k is `input.length + 1`). We merge the
     // lists pairwise, which reduces the number of lists to merge by half on
     // each iteration. Consequently, we perform O(log k) merges.
     while (input.length > 1) {
-      List<List<Declaration>> output = <List<Declaration>>[];
+      List<List<Builder>> output = <List<Builder>>[];
       for (int i = 0; i < input.length - 1; i += 2) {
-        List<Declaration> first = input[i];
-        List<Declaration> second = input[i + 1];
+        List<Builder> first = input[i];
+        List<Builder> second = input[i + 1];
         if (first == null) {
           output.add(second);
         } else if (second == null) {
@@ -1490,17 +1474,16 @@
   /// Merge [and check] accessors. This entails copying mutable fields to
   /// setters to simulate implied setters, and checking that setters don't
   /// override regular methods.
-  List<Declaration> mergeAccessors(
-      List<Declaration> members, List<Declaration> setters) {
-    final List<Declaration> mergedSetters = new List<Declaration>.filled(
+  List<Builder> mergeAccessors(List<Builder> members, List<Builder> setters) {
+    final List<Builder> mergedSetters = new List<Builder>.filled(
         members.length + setters.length, null,
         growable: true);
     int storeIndex = 0;
     int i = 0;
     int j = 0;
     while (i < members.length && j < setters.length) {
-      final Declaration member = members[i];
-      final Declaration setter = setters[j];
+      final Builder member = members[i];
+      final Builder setter = setters[j];
       final int compare = compareDeclarations(member, setter);
       if (compare == 0) {
         mergedSetters[storeIndex++] = setter;
@@ -1517,7 +1500,7 @@
       }
     }
     while (i < members.length) {
-      final Declaration member = members[i];
+      final Builder member = members[i];
       if (impliesSetter(member)) {
         mergedSetters[storeIndex++] = member;
       }
@@ -1538,7 +1521,7 @@
   void reportMissingMembers() {
     Map<String, LocatedMessage> contextMap = <String, LocatedMessage>{};
     for (int i = 0; i < abstractMembers.length; i++) {
-      Declaration declaration = abstractMembers[i];
+      Builder declaration = abstractMembers[i];
       Member target = declaration.target;
       if (isNameVisibleIn(target.name, cls.library)) {
         String name = declaration.fullNameForErrors;
@@ -1566,20 +1549,20 @@
   }
 
   void installNsmHandlers() {
-    // TOOD(ahe): Implement this.
+    // TODO(ahe): Implement this.
   }
 
-  List<Declaration> merge(
-      List<Declaration> aList, List<Declaration> bList, MergeKind mergeKind) {
-    final List<Declaration> result = new List<Declaration>.filled(
+  List<Builder> merge(
+      List<Builder> aList, List<Builder> bList, MergeKind mergeKind) {
+    final List<Builder> result = new List<Builder>.filled(
         aList.length + bList.length, null,
         growable: true);
     int storeIndex = 0;
     int i = 0;
     int j = 0;
     while (i < aList.length && j < bList.length) {
-      final Declaration a = aList[i];
-      final Declaration b = bList[j];
+      final Builder a = aList[i];
+      final Builder b = bList[j];
       if ((mergeKind == MergeKind.interfacesMembers ||
               mergeKind == MergeKind.interfacesSetters) &&
           a.isStatic) {
@@ -1605,7 +1588,7 @@
       }
     }
     while (i < aList.length) {
-      final Declaration a = aList[i];
+      final Builder a = aList[i];
       if (!(mergeKind == MergeKind.interfacesMembers ||
               mergeKind == MergeKind.interfacesSetters) ||
           !a.isStatic) {
@@ -1615,7 +1598,7 @@
       i++;
     }
     while (j < bList.length) {
-      final Declaration b = bList[j];
+      final Builder b = bList[j];
       if (!b.isStatic) {
         result[storeIndex++] = handleOnlyB(b, mergeKind);
       }
@@ -1638,22 +1621,22 @@
             new TypeBuilderConstraintGatherer(
                 hierarchy, kernelMixedInType.classNode.typeParameters))
         .infer(kernelClass);
-    List<KernelTypeBuilder> inferredArguments =
-        new List<KernelTypeBuilder>(typeArguments.length);
+    List<TypeBuilder> inferredArguments =
+        new List<TypeBuilder>(typeArguments.length);
     for (int i = 0; i < typeArguments.length; i++) {
       inferredArguments[i] =
           hierarchy.loader.computeTypeBuilder(typeArguments[i]);
     }
-    KernelNamedTypeBuilder mixedInType = cls.mixedInType;
+    NamedTypeBuilder mixedInType = cls.mixedInType;
     mixedInType.arguments = inferredArguments;
   }
 
   /// The class Function from dart:core is supposed to be ignored when used as
   /// an interface.
-  List<KernelTypeBuilder> ignoreFunction(List<KernelTypeBuilder> interfaces) {
+  List<TypeBuilder> ignoreFunction(List<TypeBuilder> interfaces) {
     if (interfaces == null) return null;
     for (int i = 0; i < interfaces.length; i++) {
-      KernelClassBuilder cls = getClass(interfaces[i]);
+      ClassBuilder cls = getClass(interfaces[i]);
       if (cls != null && cls.target == hierarchy.functionKernelClass) {
         if (interfaces.length == 1) {
           return null;
@@ -1670,14 +1653,14 @@
 
 class ClassHierarchyNode {
   /// The class corresponding to this hierarchy node.
-  final KernelClassBuilder cls;
+  final ClassBuilder cls;
 
   /// All the members of this class including [classMembers] of its
   /// superclasses. The members are sorted by [compareDeclarations].
-  final List<Declaration> classMembers;
+  final List<Builder> classMembers;
 
   /// Similar to [classMembers] but for setters.
-  final List<Declaration> classSetters;
+  final List<Builder> classSetters;
 
   /// All the interface members of this class including [interfaceMembers] of
   /// its supertypes. The members are sorted by [compareDeclarations].
@@ -1686,20 +1669,20 @@
   /// from interfaces.
   ///
   /// This may be null, in which case [classMembers] is the interface members.
-  final List<Declaration> interfaceMembers;
+  final List<Builder> interfaceMembers;
 
   /// Similar to [interfaceMembers] but for setters.
   ///
   /// This may be null, in which case [classSetters] is the interface setters.
-  final List<Declaration> interfaceSetters;
+  final List<Builder> interfaceSetters;
 
   /// All superclasses of [cls] excluding itself. The classes are sorted by
   /// depth from the root (Object) in ascending order.
-  final List<KernelTypeBuilder> superclasses;
+  final List<TypeBuilder> superclasses;
 
   /// The list of all classes implemented by [cls] and its supertypes excluding
   /// any classes from [superclasses].
-  final List<KernelTypeBuilder> interfaces;
+  final List<TypeBuilder> interfaces;
 
   /// The longest inheritance path from [cls] to `Object`.
   final int maxInheritancePath;
@@ -1725,14 +1708,14 @@
     List<ClassHierarchyNode> result = new List<ClassHierarchyNode>(
         1 + superclasses.length + interfaces.length);
     for (int i = 0; i < superclasses.length; i++) {
-      Declaration declaration = superclasses[i].declaration;
-      if (declaration is KernelClassBuilder) {
+      Builder declaration = superclasses[i].declaration;
+      if (declaration is ClassBuilder) {
         result[i] = hierarchy.getNodeFromClass(declaration);
       }
     }
     for (int i = 0; i < interfaces.length; i++) {
-      Declaration declaration = interfaces[i].declaration;
-      if (declaration is KernelClassBuilder) {
+      Builder declaration = interfaces[i].declaration;
+      if (declaration is ClassBuilder) {
         result[i + superclasses.length] =
             hierarchy.getNodeFromClass(declaration);
       }
@@ -1752,7 +1735,7 @@
     }
     sb..writeln("  superclasses:");
     int depth = 0;
-    for (KernelTypeBuilder superclass in superclasses) {
+    for (TypeBuilder superclass in superclasses) {
       sb.write("  " * (depth + 2));
       if (depth != 0) sb.write("-> ");
       superclass.printOn(sb);
@@ -1762,7 +1745,7 @@
     if (interfaces != null) {
       sb.write("  interfaces:");
       bool first = true;
-      for (KernelTypeBuilder i in interfaces) {
+      for (TypeBuilder i in interfaces) {
         if (!first) sb.write(",");
         sb.write(" ");
         i.printOn(sb);
@@ -1781,12 +1764,11 @@
     return "$sb";
   }
 
-  void printMembers(
-      List<Declaration> members, StringBuffer sb, String heading) {
+  void printMembers(List<Builder> members, StringBuffer sb, String heading) {
     sb.write("  ");
     sb.write(heading);
     sb.writeln(":");
-    for (Declaration member in members) {
+    for (Builder member in members) {
       sb
         ..write("    ")
         ..write(member.parent.fullNameForErrors)
@@ -1796,7 +1778,7 @@
     }
   }
 
-  Declaration getInterfaceMember(Name name, bool isSetter) {
+  Builder getInterfaceMember(Name name, bool isSetter) {
     return findMember(
         name,
         isSetter
@@ -1804,7 +1786,7 @@
             : interfaceMembers ?? classMembers);
   }
 
-  Declaration findMember(Name name, List<Declaration> declarations) {
+  Builder findMember(Name name, List<Builder> 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.
 
@@ -1812,7 +1794,7 @@
     int low = 0, high = declarations.length - 1;
     while (low <= high) {
       int mid = low + ((high - low) >> 1);
-      Declaration pivot = declarations[mid];
+      Builder pivot = declarations[mid];
       int comparison = ClassHierarchy.compareNames(name, pivot.target.name);
       if (comparison < 0) {
         high = mid - 1;
@@ -1828,7 +1810,7 @@
     return null;
   }
 
-  Declaration getDispatchTarget(Name name, bool isSetter) {
+  Builder getDispatchTarget(Name name, bool isSetter) {
     return findMember(name, isSetter ? classSetters : classMembers);
   }
 
@@ -1839,9 +1821,9 @@
 }
 
 class MergeResult {
-  final List<Declaration> mergedMembers;
+  final List<Builder> mergedMembers;
 
-  final List<Declaration> mergedSetters;
+  final List<Builder> mergedSetters;
 
   MergeResult(this.mergedMembers, this.mergedSetters);
 }
@@ -1872,7 +1854,7 @@
   settersWithMembers,
 }
 
-List<LocatedMessage> inheritedConflictContext(Declaration a, Declaration b) {
+List<LocatedMessage> inheritedConflictContext(Builder a, Builder b) {
   return inheritedConflictContextKernel(
       a.target, b.target, a.fullNameForErrors.length);
 }
@@ -1902,7 +1884,7 @@
 }
 
 class BuilderMixinInferrer extends MixinInferrer {
-  final KernelClassBuilder cls;
+  final ClassBuilder cls;
 
   BuilderMixinInferrer(
       this.cls, CoreTypes coreTypes, TypeBuilderConstraintGatherer gatherer)
@@ -1988,9 +1970,9 @@
 }
 
 class DelayedOverrideCheck {
-  final KernelClassBuilder cls;
-  final Declaration a;
-  final Declaration b;
+  final ClassBuilder cls;
+  final Builder a;
+  final Builder b;
 
   const DelayedOverrideCheck(this.cls, this.a, this.b);
 
@@ -2002,11 +1984,11 @@
           isInterfaceCheck: !cls.isMixinApplication);
     }
 
-    Declaration a = this.a;
+    Builder a = this.a;
     debug?.log(
         "Delayed override check of ${fullName(a)} ${fullName(b)} wrt. ${cls.fullNameForErrors}");
     if (cls == a.parent) {
-      if (a is KernelProcedureBuilder) {
+      if (a is ProcedureBuilder) {
         if (a.isGetter && !hasExplicitReturnType(a)) {
           DartType type;
           if (b.isGetter) {
@@ -2052,7 +2034,7 @@
           }
         }
         a.hadTypesInferred = true;
-      } else if (a is KernelFieldBuilder && a.type == null) {
+      } else if (a is FieldBuilder && a.type == null) {
         DartType type;
         if (b.isGetter) {
           Procedure bTarget = b.target;
@@ -2092,13 +2074,13 @@
   }
 }
 
-abstract class DelayedMember extends Declaration {
+abstract class DelayedMember extends Builder {
   /// The class which has inherited [declarations].
   @override
-  final KernelClassBuilder parent;
+  final ClassBuilder parent;
 
   /// Conflicting declarations.
-  final List<Declaration> declarations;
+  final List<Builder> declarations;
 
   final isSetter;
 
@@ -2107,7 +2089,7 @@
   DelayedMember(
       this.parent, this.declarations, this.isSetter, this.modifyKernel);
 
-  void addAllDeclarationsTo(List<Declaration> declarations) {
+  void addAllDeclarationsTo(List<Builder> declarations) {
     for (int i = 0; i < this.declarations.length; i++) {
       addDeclarationIfDifferent(this.declarations[i], declarations);
     }
@@ -2116,7 +2098,7 @@
 
   Member check(ClassHierarchyBuilder hierarchy);
 
-  DelayedMember withParent(KernelClassBuilder parent);
+  DelayedMember withParent(ClassBuilder parent);
 
   @override
   Uri get fileUri => parent.fileUri;
@@ -2142,8 +2124,8 @@
   @override
   final bool isInheritableConflict;
 
-  InheritedImplementationInterfaceConflict(KernelClassBuilder parent,
-      List<Declaration> declarations, bool isSetter, bool modifyKernel,
+  InheritedImplementationInterfaceConflict(ClassBuilder parent,
+      List<Builder> declarations, bool isSetter, bool modifyKernel,
       {this.isInheritableConflict = true})
       : super(parent, declarations, isSetter, modifyKernel);
 
@@ -2160,7 +2142,7 @@
       return combinedMemberSignatureResult;
     }
     if (!parent.isAbstract) {
-      Declaration concreteImplementation = declarations.first;
+      Builder concreteImplementation = declarations.first;
       for (int i = 1; i < declarations.length; i++) {
         new DelayedOverrideCheck(
                 parent, concreteImplementation, declarations[i])
@@ -2173,21 +2155,17 @@
   }
 
   @override
-  DelayedMember withParent(KernelClassBuilder parent) {
+  DelayedMember withParent(ClassBuilder parent) {
     return parent == this.parent
         ? this
         : new InheritedImplementationInterfaceConflict(
             parent, declarations, isSetter, modifyKernel);
   }
 
-  static Declaration combined(
-      KernelClassBuilder parent,
-      Declaration concreteImplementation,
-      Declaration other,
-      bool isSetter,
-      bool createForwarders,
+  static Builder combined(ClassBuilder parent, Builder concreteImplementation,
+      Builder other, bool isSetter, bool createForwarders,
       {bool isInheritableConflict = true}) {
-    List<Declaration> declarations = <Declaration>[];
+    List<Builder> declarations = <Builder>[];
     if (concreteImplementation is DelayedMember) {
       concreteImplementation.addAllDeclarationsTo(declarations);
     } else {
@@ -2209,7 +2187,7 @@
 }
 
 class InterfaceConflict extends DelayedMember {
-  InterfaceConflict(KernelClassBuilder parent, List<Declaration> declarations,
+  InterfaceConflict(ClassBuilder parent, List<Builder> declarations,
       bool isSetter, bool modifyKernel)
       : super(parent, declarations, isSetter, modifyKernel);
 
@@ -2256,14 +2234,14 @@
     if (combinedMemberSignatureResult != null) {
       return combinedMemberSignatureResult;
     }
-    if (parent.library is! KernelLibraryBuilder) {
+    if (parent.library is! SourceLibraryBuilder) {
       return combinedMemberSignatureResult = declarations.first.target;
     }
     DartType thisType = parent.cls.thisType;
-    Declaration bestSoFar;
+    Builder bestSoFar;
     DartType bestTypeSoFar;
     for (int i = declarations.length - 1; i >= 0; i--) {
-      Declaration candidate = declarations[i];
+      Builder candidate = declarations[i];
       Member target = candidate.target;
       DartType candidateType = computeMemberType(hierarchy, thisType, target);
       if (bestSoFar == null) {
@@ -2284,7 +2262,7 @@
     if (bestSoFar != null) {
       debug?.log("Combined Member Signature bestSoFar: ${fullName(bestSoFar)}");
       for (int i = 0; i < declarations.length; i++) {
-        Declaration candidate = declarations[i];
+        Builder candidate = declarations[i];
         Member target = candidate.target;
         DartType candidateType = computeMemberType(hierarchy, thisType, target);
         if (!isMoreSpecific(hierarchy, bestTypeSoFar, candidateType)) {
@@ -2309,7 +2287,7 @@
     if (bestSoFar == null) {
       String name = parent.fullNameForErrors;
       int length = parent.isAnonymousMixinApplication ? 1 : name.length;
-      List<LocatedMessage> context = declarations.map((Declaration d) {
+      List<LocatedMessage> context = declarations.map((Builder d) {
         return messageDeclaredMemberConflictsWithInheritedMemberCause
             .withLocation(d.fileUri, d.charOffset, d.fullNameForErrors.length);
       }).toList();
@@ -2341,7 +2319,7 @@
               .finalize();
       if (parent.cls == stub.enclosingClass) {
         parent.cls.addMember(stub);
-        KernelLibraryBuilder library = parent.library;
+        SourceLibraryBuilder library = parent.library;
         if (bestSoFar.target is Procedure) {
           library.forwardersOrigins..add(stub)..add(bestSoFar.target);
         }
@@ -2361,15 +2339,15 @@
   }
 
   @override
-  DelayedMember withParent(KernelClassBuilder parent) {
+  DelayedMember withParent(ClassBuilder parent) {
     return parent == this.parent
         ? this
         : new InterfaceConflict(parent, declarations, isSetter, modifyKernel);
   }
 
-  static Declaration combined(KernelClassBuilder parent, Declaration a,
-      Declaration b, bool isSetter, bool createForwarders) {
-    List<Declaration> declarations = <Declaration>[];
+  static Builder combined(ClassBuilder parent, Builder a, Builder b,
+      bool isSetter, bool createForwarders) {
+    List<Builder> declarations = <Builder>[];
     if (a is DelayedMember) {
       a.addAllDeclarationsTo(declarations);
     } else {
@@ -2391,17 +2369,17 @@
 
 class AbstractMemberOverridingImplementation extends DelayedMember {
   AbstractMemberOverridingImplementation(
-      KernelClassBuilder parent,
-      Declaration abstractMember,
-      Declaration concreteImplementation,
+      ClassBuilder parent,
+      Builder abstractMember,
+      Builder concreteImplementation,
       bool isSetter,
       bool modifyKernel)
-      : super(parent, <Declaration>[concreteImplementation, abstractMember],
+      : super(parent, <Builder>[concreteImplementation, abstractMember],
             isSetter, modifyKernel);
 
-  Declaration get concreteImplementation => declarations[0];
+  Builder get concreteImplementation => declarations[0];
 
-  Declaration get abstractMember => declarations[1];
+  Builder get abstractMember => declarations[1];
 
   Member check(ClassHierarchyBuilder hierarchy) {
     if (!parent.isAbstract && !hierarchy.nodes[parent.cls].hasNoSuchMethod) {
@@ -2423,14 +2401,14 @@
   }
 
   @override
-  DelayedMember withParent(KernelClassBuilder parent) {
+  DelayedMember withParent(ClassBuilder parent) {
     return parent == this.parent
         ? this
         : new AbstractMemberOverridingImplementation(parent, abstractMember,
             concreteImplementation, isSetter, modifyKernel);
   }
 
-  static Declaration selectAbstract(Declaration declaration) {
+  static Builder selectAbstract(Builder declaration) {
     if (declaration is AbstractMemberOverridingImplementation) {
       return declaration.abstractMember;
     } else {
@@ -2438,7 +2416,7 @@
     }
   }
 
-  static Declaration selectConcrete(Declaration declaration) {
+  static Builder selectConcrete(Builder declaration) {
     if (declaration is AbstractMemberOverridingImplementation) {
       return declaration.concreteImplementation;
     } else {
@@ -2448,7 +2426,7 @@
 }
 
 void addDeclarationIfDifferent(
-    Declaration declaration, List<Declaration> declarations) {
+    Builder declaration, List<Builder> declarations) {
   Member target = declaration.target;
   if (target is Procedure) {
     FunctionNode function = target.function;
@@ -2466,12 +2444,12 @@
   declarations.add(declaration);
 }
 
-String fullName(Declaration declaration) {
+String fullName(Builder declaration) {
   String suffix = declaration.isSetter ? "=" : "";
   if (declaration is DelayedMember) {
     return "${declaration.fullNameForErrors}$suffix";
   }
-  Declaration parent = declaration.parent;
+  Builder parent = declaration.parent;
   return parent == null
       ? "${declaration.fullNameForErrors}$suffix"
       : "${parent.fullNameForErrors}.${declaration.fullNameForErrors}$suffix";
@@ -2481,14 +2459,14 @@
   return a.name.compareTo(b.name);
 }
 
-bool isAbstract(Declaration declaration) {
+bool isAbstract(Builder declaration) {
   return declaration.target.isAbstract || declaration is InterfaceConflict;
 }
 
 bool inferParameterType(
-    KernelClassBuilder cls,
-    KernelProcedureBuilder member,
-    FormalParameterBuilder<KernelTypeBuilder> parameter,
+    ClassBuilder cls,
+    ProcedureBuilder member,
+    FormalParameterBuilder parameter,
     DartType type,
     bool hadTypesInferred,
     ClassHierarchyBuilder hierarchy) {
@@ -2505,11 +2483,8 @@
   return result;
 }
 
-void reportCantInferParameterType(
-    KernelClassBuilder cls,
-    MemberBuilder member,
-    FormalParameterBuilder<KernelTypeBuilder> parameter,
-    ClassHierarchyBuilder hierarchy) {
+void reportCantInferParameterType(ClassBuilder cls, MemberBuilder member,
+    FormalParameterBuilder parameter, ClassHierarchyBuilder hierarchy) {
   String name = parameter.name;
   cls.addProblem(
       templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
@@ -2518,8 +2493,8 @@
       wasHandled: true);
 }
 
-bool inferReturnType(KernelClassBuilder cls, KernelProcedureBuilder member,
-    DartType type, bool hadTypesInferred, ClassHierarchyBuilder hierarchy) {
+bool inferReturnType(ClassBuilder cls, ProcedureBuilder member, DartType type,
+    bool hadTypesInferred, ClassHierarchyBuilder hierarchy) {
   if (type == member.target.function.returnType) return true;
   bool result = true;
   if (hadTypesInferred) {
@@ -2533,8 +2508,8 @@
   return result;
 }
 
-void reportCantInferReturnType(KernelClassBuilder cls, MemberBuilder member,
-    ClassHierarchyBuilder hierarchy) {
+void reportCantInferReturnType(
+    ClassBuilder cls, MemberBuilder member, ClassHierarchyBuilder hierarchy) {
   String name = member.fullNameForErrors;
   List<LocatedMessage> context;
   // // TODO(ahe): The following is for debugging, but could be cleaned up and
@@ -2562,7 +2537,7 @@
   //             superMember.fileUri, superMember.charOffset, name.length));
   //   }
   // }
-  // List<KernelTypeBuilder> directInterfaces = cls.interfaces;
+  // List<TypeBuilder> directInterfaces = cls.interfaces;
   // for (int i = 0; i < directInterfaces.length; i++) {
   //   ClassHierarchyNode supernode =
   //       hierarchy.getNodeFromType(directInterfaces[i]);
@@ -2592,8 +2567,7 @@
       context: context);
 }
 
-void reportCantInferFieldType(
-    KernelClassBuilder cls, KernelFieldBuilder member) {
+void reportCantInferFieldType(ClassBuilder cls, FieldBuilder member) {
   String name = member.fullNameForErrors;
   cls.addProblem(
       templateCantInferTypeDueToInconsistentOverrides.withArguments(name),
@@ -2602,25 +2576,23 @@
       wasHandled: true);
 }
 
-KernelClassBuilder getClass(KernelTypeBuilder type) {
-  Declaration declaration = type.declaration;
-  return declaration is KernelClassBuilder ? declaration : null;
+ClassBuilder getClass(TypeBuilder type) {
+  Builder declaration = type.declaration;
+  return declaration is ClassBuilder ? declaration : null;
 }
 
-bool hasExplicitReturnType(Declaration declaration) {
-  assert(
-      declaration is KernelProcedureBuilder || declaration is DillMemberBuilder,
+bool hasExplicitReturnType(Builder declaration) {
+  assert(declaration is ProcedureBuilder || declaration is DillMemberBuilder,
       "${declaration.runtimeType}");
-  return declaration is KernelProcedureBuilder
+  return declaration is ProcedureBuilder
       ? declaration.returnType != null
       : true;
 }
 
-bool hasExplicitlyTypedFormalParameter(Declaration declaration, int index) {
-  assert(
-      declaration is KernelProcedureBuilder || declaration is DillMemberBuilder,
+bool hasExplicitlyTypedFormalParameter(Builder declaration, int index) {
+  assert(declaration is ProcedureBuilder || declaration is DillMemberBuilder,
       "${declaration.runtimeType}");
-  return declaration is KernelProcedureBuilder
+  return declaration is ProcedureBuilder
       ? declaration.formals[index].type != null
       : true;
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/collections.dart b/pkg/front_end/lib/src/fasta/kernel/collections.dart
index a943ece..84e251f 100644
--- a/pkg/front_end/lib/src/fasta/kernel/collections.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/collections.dart
@@ -42,7 +42,7 @@
 /// only appear as elements in list or set literals.  They are translated into
 /// a lower-level representation and never serialized to .dill files.
 mixin ControlFlowElement on Expression {
-  /// Spread and contol-flow elements are not expressions and do not have a
+  /// Spread and control-flow elements are not expressions and do not have a
   /// static type.
   @override
   DartType getStaticType(TypeEnvironment types) {
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 175f066..c672dd8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -6,8 +6,8 @@
 ///
 /// Even though it is expected that the frontend does not emit kernel AST which
 /// contains compile-time errors, this transformation still performs some
-/// valiation and throws a [ConstantEvaluationError] if there was a compile-time
-/// errors.
+/// validation and throws a [ConstantEvaluationError] if there was a
+/// compile-time errors.
 ///
 /// Due to the lack information which is is only available in the front-end,
 /// this validation is incomplete (e.g. whether an integer literal used the
@@ -69,7 +69,6 @@
 Component transformComponent(Component component, ConstantsBackend backend,
     Map<String, String> environmentDefines, ErrorReporter errorReporter,
     {bool keepFields: true,
-    bool enableAsserts: false,
     bool evaluateAnnotations: true,
     bool desugarSets: false,
     bool errorOnUnevaluatedConstant: false,
@@ -83,7 +82,6 @@
   transformLibraries(component.libraries, backend, environmentDefines,
       typeEnvironment, errorReporter,
       keepFields: keepFields,
-      enableAsserts: enableAsserts,
       desugarSets: desugarSets,
       errorOnUnevaluatedConstant: errorOnUnevaluatedConstant,
       evaluateAnnotations: evaluateAnnotations);
@@ -100,8 +98,7 @@
     bool keepVariables: false,
     bool evaluateAnnotations: true,
     bool desugarSets: false,
-    bool errorOnUnevaluatedConstant: false,
-    bool enableAsserts: false}) {
+    bool errorOnUnevaluatedConstant: false}) {
   final ConstantsTransformer constantsTransformer = new ConstantsTransformer(
       backend,
       environmentDefines,
@@ -111,7 +108,6 @@
       desugarSets,
       errorOnUnevaluatedConstant,
       typeEnvironment,
-      enableAsserts,
       errorReporter);
   for (final Library library in libraries) {
     constantsTransformer.convertLibrary(library);
@@ -155,10 +151,9 @@
       this.desugarSets,
       this.errorOnUnevaluatedConstant,
       this.typeEnvironment,
-      bool enableAsserts,
       ErrorReporter errorReporter)
-      : constantEvaluator = new ConstantEvaluator(backend, environmentDefines,
-            typeEnvironment, enableAsserts, errorReporter,
+      : constantEvaluator = new ConstantEvaluator(
+            backend, environmentDefines, typeEnvironment, errorReporter,
             desugarSets: desugarSets,
             errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
 
@@ -324,11 +319,9 @@
     return constantEvaluator.withNewEnvironment(() {
       if (node.isConst) {
         transformAnnotations(node.annotations, node);
-        if (node.initializer != null) {
-          node.initializer =
-              evaluateAndTransformWithContext(node, node.initializer)
-                ..parent = node;
-        }
+        node.initializer =
+            evaluateAndTransformWithContext(node, node.initializer)
+              ..parent = node;
 
         // If this constant is inlined, remove it.
         if (!keepFields && shouldInline(node.initializer)) {
@@ -353,14 +346,12 @@
   visitStaticGet(StaticGet node) {
     final Member target = node.target;
     if (target is Field && target.isConst) {
-      if (target.initializer != null) {
-        // Make sure the initializer is evaluated first.
-        target.initializer =
-            evaluateAndTransformWithContext(target, target.initializer)
-              ..parent = target;
-        if (shouldInline(target.initializer)) {
-          return evaluateAndTransformWithContext(node, node);
-        }
+      // Make sure the initializer is evaluated first.
+      target.initializer =
+          evaluateAndTransformWithContext(target, target.initializer)
+            ..parent = target;
+      if (shouldInline(target.initializer)) {
+        return evaluateAndTransformWithContext(node, node);
       }
     } else if (target is Procedure && target.kind == ProcedureKind.Method) {
       return evaluateAndTransformWithContext(node, node);
@@ -444,11 +435,12 @@
     }
   }
 
-  evaluateAndTransformWithContext(TreeNode treeContext, Expression node) {
+  Expression evaluateAndTransformWithContext(
+      TreeNode treeContext, Expression node) {
     return makeConstantExpression(evaluateWithContext(treeContext, node), node);
   }
 
-  evaluateWithContext(TreeNode treeContext, Expression node) {
+  Constant evaluateWithContext(TreeNode treeContext, Expression node) {
     if (treeContext == node) {
       return constantEvaluator.evaluate(node);
     }
@@ -482,7 +474,6 @@
   final bool errorOnUnevaluatedConstant;
   final CoreTypes coreTypes;
   final TypeEnvironment typeEnvironment;
-  final bool enableAsserts;
   final ErrorReporter errorReporter;
 
   final bool desugarSets;
@@ -515,7 +506,7 @@
   bool get targetingJavaScript => numberSemantics == NumberSemantics.js;
 
   ConstantEvaluator(this.backend, this.environmentDefines, this.typeEnvironment,
-      this.enableAsserts, this.errorReporter,
+      this.errorReporter,
       {this.desugarSets = false, this.errorOnUnevaluatedConstant = false})
       : numberSemantics = backend.numberSemantics,
         coreTypes = typeEnvironment.coreTypes,
@@ -526,6 +517,11 @@
             ? typeEnvironment.coreTypes.index
                 .getMember('dart:collection', '_UnmodifiableSet', '_map')
             : null {
+    if (environmentDefines == null && !backend.supportsUnevaluatedConstants) {
+      throw new ArgumentError(
+          "No 'environmentDefines' passed to the constant evaluator but the "
+          "ConstantsBackend does not support unevaluated constants.");
+    }
     primitiveEqualCache = <Class, bool>{
       coreTypes.boolClass: true,
       coreTypes.doubleClass: false,
@@ -674,7 +670,6 @@
   /// @throws _AbortDueToError or _AbortDueToInvalidExpression if expression
   /// can't be evaluated.
   Constant _evaluateSubexpression(Expression node) {
-    if (node == null) return nullConstant;
     bool wasUnevaluated = seenUnevaluatedChild;
     seenUnevaluatedChild = false;
     Constant result;
@@ -699,6 +694,11 @@
     return result;
   }
 
+  Constant _evaluateNullableSubexpression(Expression node) {
+    if (node == null) return nullConstant;
+    return _evaluateSubexpression(node);
+  }
+
   Constant runInsideContext(TreeNode node, Constant fun()) {
     try {
       pushContext(node);
@@ -875,12 +875,7 @@
     final positionals = evaluatePositionalArguments(node.arguments);
     final named = evaluateNamedArguments(node.arguments);
 
-    // Is the constructor unavailable due to separate compilation?
-    bool isUnavailable = constructor.isInExternalLibrary &&
-        constructor.initializers.isEmpty &&
-        constructor.enclosingClass.supertype != null;
-
-    if (isUnavailable || (isSymbol && shouldBeUnevaluated)) {
+    if (isSymbol && shouldBeUnevaluated) {
       return unevaluated(
           node,
           new ConstructorInvocation(constructor,
@@ -1096,12 +1091,12 @@
               function.positionalParameters[i];
           final Constant value = (i < positionalArguments.length)
               ? positionalArguments[i]
-              : _evaluateSubexpression(parameter.initializer);
+              : _evaluateNullableSubexpression(parameter.initializer);
           env.addVariableValue(parameter, value);
         }
         for (final VariableDeclaration parameter in function.namedParameters) {
           final Constant value = namedArguments[parameter.name] ??
-              _evaluateSubexpression(parameter.initializer);
+              _evaluateNullableSubexpression(parameter.initializer);
           env.addVariableValue(parameter, value);
         }
 
@@ -1109,7 +1104,7 @@
         for (final Field field in klass.fields) {
           if (!field.isStatic) {
             instanceBuilder.setFieldValue(
-                field, _evaluateSubexpression(field.initializer));
+                field, _evaluateNullableSubexpression(field.initializer));
           }
         }
         for (final Initializer init in constructor.initializers) {
@@ -1153,51 +1148,49 @@
   }
 
   void checkAssert(AssertStatement statement) {
-    if (enableAsserts) {
-      final Constant condition = _evaluateSubexpression(statement.condition);
+    final Constant condition = _evaluateSubexpression(statement.condition);
 
-      if (shouldBeUnevaluated) {
-        Expression message = null;
-        if (statement.message != null) {
-          enterLazy();
-          message = extract(_evaluateSubexpression(statement.message));
-          leaveLazy();
-        }
-        instanceBuilder.asserts.add(new AssertStatement(extract(condition),
-            message: message,
-            conditionStartOffset: statement.conditionStartOffset,
-            conditionEndOffset: statement.conditionEndOffset));
-      } else if (condition is BoolConstant) {
-        if (!condition.value) {
-          if (statement.message == null) {
-            report(statement.condition, messageConstEvalFailedAssertion);
-          }
-          final Constant message = _evaluateSubexpression(statement.message);
-          if (shouldBeUnevaluated) {
-            instanceBuilder.asserts.add(new AssertStatement(extract(condition),
-                message: extract(message),
-                conditionStartOffset: statement.conditionStartOffset,
-                conditionEndOffset: statement.conditionEndOffset));
-          } else if (message is StringConstant) {
-            report(
-                statement.condition,
-                templateConstEvalFailedAssertionWithMessage
-                    .withArguments(message.value));
-          } else {
-            report(
-                statement.message,
-                templateConstEvalInvalidType.withArguments(
-                    message,
-                    typeEnvironment.stringType,
-                    message.getType(typeEnvironment)));
-          }
-        }
-      } else {
-        report(
-            statement.condition,
-            templateConstEvalInvalidType.withArguments(condition,
-                typeEnvironment.boolType, condition.getType(typeEnvironment)));
+    if (shouldBeUnevaluated) {
+      Expression message = null;
+      if (statement.message != null) {
+        enterLazy();
+        message = extract(_evaluateSubexpression(statement.message));
+        leaveLazy();
       }
+      instanceBuilder.asserts.add(new AssertStatement(extract(condition),
+          message: message,
+          conditionStartOffset: statement.conditionStartOffset,
+          conditionEndOffset: statement.conditionEndOffset));
+    } else if (condition is BoolConstant) {
+      if (!condition.value) {
+        if (statement.message == null) {
+          report(statement.condition, messageConstEvalFailedAssertion);
+        }
+        final Constant message = _evaluateSubexpression(statement.message);
+        if (shouldBeUnevaluated) {
+          instanceBuilder.asserts.add(new AssertStatement(extract(condition),
+              message: extract(message),
+              conditionStartOffset: statement.conditionStartOffset,
+              conditionEndOffset: statement.conditionEndOffset));
+        } else if (message is StringConstant) {
+          report(
+              statement.condition,
+              templateConstEvalFailedAssertionWithMessage
+                  .withArguments(message.value));
+        } else {
+          report(
+              statement.message,
+              templateConstEvalInvalidType.withArguments(
+                  message,
+                  typeEnvironment.stringType,
+                  message.getType(typeEnvironment)));
+        }
+      }
+    } else {
+      report(
+          statement.condition,
+          templateConstEvalInvalidType.withArguments(condition,
+              typeEnvironment.boolType, condition.getType(typeEnvironment)));
     }
   }
 
@@ -1595,10 +1588,6 @@
       final Member target = node.target;
       if (target is Field) {
         if (target.isConst) {
-          if (target.isInExternalLibrary && target.initializer == null) {
-            // The variable is unavailable due to separate compilation.
-            return unevaluated(node, new StaticGet(target));
-          }
           return runInsideContext(target, () {
             return _evaluateSubexpression(target.initializer);
           });
@@ -1935,8 +1924,8 @@
   }
 
   List<DartType> evaluateDartTypes(TreeNode node, List<DartType> types) {
-    // TODO: Once the frontend gurantees that there are no free type variables
-    // left over after stubstitution, we can enable this shortcut again:
+    // TODO: Once the frontend guarantees that there are no free type variables
+    // left over after substitution, we can enable this shortcut again:
     // if (env.isEmpty) return types;
     return types.map((t) => evaluateDartType(node, t)).toList();
   }
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 9b94ff4..419b85a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator.dart
@@ -5,6 +5,23 @@
 /// A library to help generate expression.
 library fasta.expression_generator;
 
+import 'package:kernel/ast.dart'
+    show
+        Constructor,
+        Field,
+        InvalidExpression,
+        Let,
+        Node,
+        PropertyGet,
+        PropertySet,
+        StaticSet,
+        SuperMethodInvocation,
+        SuperPropertySet,
+        TreeNode,
+        TypeParameter,
+        VariableGet,
+        VariableSet;
+
 import '../../scanner/token.dart' show Token;
 
 import '../constant_context.dart' show ConstantContext;
@@ -14,25 +31,39 @@
         LocatedMessage,
         Message,
         Template,
+        messageCannotAssignToSuper,
+        messageCannotAssignToParenthesizedExpression,
         messageCantUsePrefixAsExpression,
         messageCantUsePrefixWithNullAware,
         messageIllegalAssignmentToNonAssignable,
         messageInvalidInitializer,
+        messageInvalidUseOfNullAwareAccess,
+        messageLoadLibraryTakesNoArguments,
         messageNotAConstantExpression,
+        messageNotAnLvalue,
+        messageSuperAsExpression,
         noLength,
         templateCantUseDeferredPrefixAsConstant,
+        templateConstructorNotFound,
         templateDeferredTypeAnnotation,
         templateMissingExplicitTypeArguments,
+        templateNotConstantExpression,
         templateNotAPrefixInTypeAnnotation,
         templateNotAType,
+        templateSuperclassHasNoConstructor,
+        templateThisOrSuperAccessInFieldInitializer,
         templateUnresolvedPrefixInTypeAnnotation;
 
 import '../names.dart'
     show
         ampersandName,
         barName,
+        callName,
         caretName,
         divisionName,
+        equalsName,
+        indexGetName,
+        indexSetName,
         leftShiftName,
         lengthName,
         minusName,
@@ -47,6 +78,10 @@
 
 import '../problems.dart' show unhandled, unsupported;
 
+import '../scope.dart';
+
+import 'body_builder.dart' show noLocation;
+
 import 'constness.dart' show Constness;
 
 import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
@@ -59,7 +94,7 @@
         TypeDeclarationBuilder,
         UnlinkedDeclaration;
 
-import 'kernel_api.dart' show printQualifiedNameOn;
+import 'kernel_api.dart' show NameSystem, printNodeOn, printQualifiedNameOn;
 
 import 'kernel_ast_api.dart'
     show
@@ -76,77 +111,25 @@
 import 'kernel_builder.dart'
     show
         AccessErrorBuilder,
-        Declaration,
-        KernelInvalidTypeBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder,
+        Builder,
+        ClassBuilder,
+        InvalidTypeBuilder,
+        NamedTypeBuilder,
+        TypeBuilder,
         UnresolvedType;
 
-import 'kernel_expression_generator.dart'
-    show IncompleteSendGenerator, SendAccessGenerator;
-
-export 'kernel_expression_generator.dart'
+import 'kernel_shadow_ast.dart'
     show
-        IncompleteErrorGenerator,
-        IncompletePropertyAccessGenerator,
-        IncompleteSendGenerator,
-        ParenthesizedExpressionGenerator,
-        SendAccessGenerator,
-        ThisAccessGenerator,
-        buildIsNull;
-
-abstract class ExpressionGenerator {
-  /// Builds a [Expression] representing a read from the generator.
-  Expression buildSimpleRead();
-
-  /// Builds a [Expression] representing an assignment with the generator on
-  /// the LHS and [value] on the RHS.
-  ///
-  /// The returned expression evaluates to the assigned value, unless
-  /// [voidContext] is true, in which case it may evaluate to anything.
-  Expression buildAssignment(Expression value, {bool voidContext});
-
-  /// Returns a [Expression] representing a null-aware assignment (`??=`) with
-  /// the generator on the LHS and [value] on the RHS.
-  ///
-  /// The returned expression evaluates to the assigned value, unless
-  /// [voidContext] is true, in which case it may evaluate to anything.
-  ///
-  /// [type] is the static type of the RHS.
-  Expression buildNullAwareAssignment(
-      Expression value, DartType type, int offset,
-      {bool voidContext});
-
-  /// Returns a [Expression] representing a compound assignment (e.g. `+=`)
-  /// with the generator on the LHS and [value] on the RHS.
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset,
-      bool voidContext,
-      Procedure interfaceTarget,
-      bool isPreIncDec,
-      bool isPostIncDec});
-
-  /// Returns a [Expression] representing a pre-increment or pre-decrement of
-  /// the generator.
-  Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext, Procedure interfaceTarget});
-
-  /// Returns a [Expression] representing a post-increment or post-decrement of
-  /// the generator.
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext, Procedure interfaceTarget});
-
-  /// Returns a [Expression] representing a compile-time error.
-  ///
-  /// At runtime, an exception will be thrown.
-  Expression makeInvalidRead();
-
-  /// Returns a [Expression] representing a compile-time error wrapping
-  /// [value].
-  ///
-  /// At runtime, [value] will be evaluated before throwing an exception.
-  Expression makeInvalidWrite(Expression value);
-}
+        ComplexAssignmentJudgment,
+        LoadLibraryTearOffJudgment,
+        MethodInvocationJudgment,
+        NullAwarePropertyGetJudgment,
+        PropertyAssignmentJudgment,
+        SuperMethodInvocationJudgment,
+        SuperPropertyGetJudgment,
+        SyntheticWrapper,
+        VariableDeclarationJudgment,
+        VariableGetJudgment;
 
 /// A generator represents a subexpression for which we can't yet build an
 /// expression because we don't yet know the context in which it's used.
@@ -159,91 +142,340 @@
 /// generate an invocation of `operator[]` or `operator[]=`, so we create a
 /// [Generator] object.  Later, after `= b` is parsed, [buildAssignment] will
 /// be called.
-abstract class Generator implements ExpressionGenerator {
-  final ExpressionGeneratorHelper helper;
+abstract class Generator {
+  /// Helper that provides access to contextual information.
+  final ExpressionGeneratorHelper _helper;
 
+  /// A token that defines a position subexpression that being built.
   final Token token;
 
-  Generator(this.helper, this.token);
+  Generator(this._helper, this.token);
 
-  Forest get forest => helper.forest;
+  /// Easy access to the [Forest] factory object.
+  Forest get _forest => _helper.forest;
 
-  String get plainNameForRead;
+  // TODO(johnniwinther): Improve the semantic precision of this property or
+  // remove it. It's unclear if the semantics is inconsistent. It's for instance
+  // used both for the name of a variable in [VariableUseGenerator] and for
+  // `[]` in [IndexedAccessGenerator], and while the former text occurs in the
+  // underlying source code, the latter doesn't.
+  String get _plainNameForRead;
 
-  String get debugName;
+  /// Internal name used for debugging.
+  String get _debugName;
 
-  Uri get uri => helper.uri;
+  /// The source uri for use in error messaging.
+  Uri get _uri => _helper.uri;
 
-  String get plainNameForWrite => plainNameForRead;
+  /// Builds a [Expression] representing a read from the generator.
+  ///
+  /// The read of this subexpression does _not_ need to support a simultaneous
+  /// write of the same subexpression.
+  Expression buildSimpleRead() {
+    return _finish(_makeSimpleRead(), null);
+  }
 
-  bool get isInitializer => false;
+  /// Internal implementation for [buildSimpleRead].
+  ///
+  /// The read of the this subexpression does _not_ need to support a
+  /// simultaneous write of the same subexpression.
+  ///
+  /// This is in contrast to [_makeRead] which is used for instance in compound
+  /// assignments like `a.b += c` where both a read and a write of the
+  /// subexpression `a.b` occurs.
+  ///
+  /// Subclasses that can benefit from this distinction should override this
+  /// method.
+  Expression _makeSimpleRead() => _makeRead(null);
+
+  /// Builds a [Expression] representing an assignment with the generator on
+  /// the LHS and [value] on the RHS.
+  ///
+  /// The returned expression evaluates to the assigned value, unless
+  /// [voidContext] is true, in which case it may evaluate to anything.
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    var complexAssignment = startComplexAssignment(value);
+    return _finish(_makeSimpleWrite(value, voidContext, complexAssignment),
+        complexAssignment);
+  }
+
+  /// Internal implementation for [buildAssignment].
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    return _makeWrite(value, voidContext, complexAssignment);
+  }
+
+  /// Returns a [Expression] representing a null-aware assignment (`??=`) with
+  /// the generator on the LHS and [value] on the RHS.
+  ///
+  /// The returned expression evaluates to the assigned value, unless
+  /// [voidContext] is true, in which case it may evaluate to anything.
+  ///
+  /// [type] is the static type of the RHS.
+  Expression buildNullAwareAssignment(
+      Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    var complexAssignment = startComplexAssignment(value);
+    if (voidContext) {
+      var nullAwareCombiner = _forest.conditionalExpression(
+          buildIsNull(_makeRead(complexAssignment), offset, _helper),
+          null,
+          _makeWrite(value, false, complexAssignment),
+          null,
+          _forest.literalNull(null)..fileOffset = offset)
+        ..fileOffset = offset;
+      complexAssignment?.nullAwareCombiner = nullAwareCombiner;
+      return _finish(nullAwareCombiner, complexAssignment);
+    }
+    var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    var nullAwareCombiner = _forest.conditionalExpression(
+        buildIsNull(new VariableGet(tmp), offset, _helper),
+        null,
+        _makeWrite(value, false, complexAssignment),
+        null,
+        new VariableGet(tmp))
+      ..fileOffset = offset;
+    complexAssignment?.nullAwareCombiner = nullAwareCombiner;
+    return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
+  }
+
+  /// Returns a [Expression] representing a compound assignment (e.g. `+=`)
+  /// with the generator on the LHS and [value] on the RHS.
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
+    var complexAssignment = startComplexAssignment(value);
+    complexAssignment?.isPreIncDec = isPreIncDec;
+    complexAssignment?.isPostIncDec = isPostIncDec;
+    var combiner = makeBinary(_makeRead(complexAssignment), binaryOperator,
+        interfaceTarget, value, _helper,
+        offset: offset);
+    complexAssignment?.combiner = combiner;
+    return _finish(_makeWrite(combiner, voidContext, complexAssignment),
+        complexAssignment);
+  }
+
+  /// Returns a [Expression] representing a pre-increment or pre-decrement of
+  /// the generator.
+  Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return buildCompoundAssignment(
+        binaryOperator, _forest.literalInt(1, null)..fileOffset = offset,
+        offset: offset,
+        voidContext: voidContext,
+        interfaceTarget: interfaceTarget,
+        isPreIncDec: true);
+  }
+
+  /// Returns a [Expression] representing a post-increment or post-decrement of
+  /// the generator.
+  Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    if (voidContext) {
+      return buildCompoundAssignment(
+          binaryOperator, _forest.literalInt(1, null)..fileOffset = offset,
+          offset: offset,
+          voidContext: voidContext,
+          interfaceTarget: interfaceTarget,
+          isPostIncDec: true);
+    }
+    var rhs = _forest.literalInt(1, null)..fileOffset = offset;
+    var complexAssignment = startComplexAssignment(rhs);
+    var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
+    valueAccess() => new VariableGet(value);
+    var combiner = makeBinary(
+        valueAccess(), binaryOperator, interfaceTarget, rhs, _helper,
+        offset: offset);
+    complexAssignment?.combiner = combiner;
+    complexAssignment?.isPostIncDec = true;
+    var dummy = new VariableDeclarationJudgment.forValue(
+        _makeWrite(combiner, true, complexAssignment),
+        _helper.functionNestingLevel);
+    return _finish(
+        makeLet(value, makeLet(dummy, valueAccess())), complexAssignment);
+  }
+
+  /// Returns a [Expression] representing a compile-time error.
+  ///
+  /// At runtime, an exception will be thrown.
+  Expression _makeInvalidRead() {
+    return _helper.wrapSyntheticExpression(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(token),
+            _plainNameForRead,
+            _forest.argumentsEmpty(noLocation),
+            offsetForToken(token),
+            isGetter: true),
+        offsetForToken(token));
+  }
+
+  /// Returns a [Expression] representing a compile-time error wrapping
+  /// [value].
+  ///
+  /// At runtime, [value] will be evaluated before throwing an exception.
+  Expression _makeInvalidWrite(Expression value) {
+    return _helper.wrapSyntheticExpression(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(token),
+            _plainNameForRead,
+            _forest.arguments(<Expression>[value], noLocation),
+            offsetForToken(token),
+            isSetter: true),
+        offsetForToken(token));
+  }
+
+  /// Returns an [Expression] the reads this subexpression.
+  ///
+  /// The created read expression must support a simultaneous write of the same
+  /// expression with valid semantics.
+  ///
+  /// For instance in `a.b += c`, both a read and a write of the subexpression
+  /// `a.b` is created, but `a` must _not_ be evaluated twice. For this reason
+  /// [PropertyAccessGenerator] creates a synthetic local variable for `a` and
+  /// uses this for the both the [PropertyGet] and [PropertySet] of property
+  /// `b`.
+  ///
+  /// If [complexAssignment] is provided, the created expression is registered
+  /// as the `read` of the complex assignment.
+  ///
+  /// The default implementation creates the expression through
+  /// [_makeInvalidRead]. Subclasses with valid read operations must override
+  /// this method with a valid implementation.
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    Expression read = _makeInvalidRead();
+    if (complexAssignment != null) {
+      read = _helper.desugarSyntheticExpression(read);
+      complexAssignment.read = read;
+    }
+    return read;
+  }
+
+  /// Returns an [Expression] the write [value] to this subexpression.
+  ///
+  /// The created read expression must support a simultaneous read of the same
+  /// expression with valid semantics.
+  ///
+  /// For instance in `a.b += c`, both a read and a write of the subexpression
+  /// `a.b` is created, but `a` must _not_ be evaluated twice. For this reason
+  /// [PropertyAccessGenerator] creates a synthetic local variable for `a` and
+  /// uses this for the both the [PropertyGet] and [PropertySet] of property
+  /// `b`.
+  ///
+  /// If [complexAssignment] is provided, the created expression is registered
+  /// as the `write` of the complex assignment.
+  ///
+  /// The default implementation creates the expression through
+  /// [_makeInvalidWrite]. Subclasses with valid write operations must override
+  /// this method with a valid implementation.
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    Expression write = _makeInvalidWrite(value);
+    if (complexAssignment != null) {
+      write = _helper.desugarSyntheticExpression(write);
+      complexAssignment.write = write;
+    }
+    return write;
+  }
+
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    if (!_helper.legacyMode && complexAssignment != null) {
+      complexAssignment.desugared = body;
+      return complexAssignment;
+    } else {
+      return body;
+    }
+  }
+
+  /// Creates a data structure for tracking the desugaring of a complex
+  /// assignment expression whose right hand side is [rhs].
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapIllegalAssignment(rhs);
 
   Expression buildForEffect() => buildSimpleRead();
 
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
     int offset = offsetForToken(token);
-    return helper.buildInvalidInitializer(
-        helper.desugarSyntheticExpression(helper.buildProblem(
+    return _helper.buildInvalidInitializer(
+        _helper.desugarSyntheticExpression(_helper.buildProblem(
             messageInvalidInitializer, offset, lengthForToken(token))),
         offset);
   }
 
+  /// Returns an expression, generator or initializer for an invocation of this
+  /// subexpression with [arguments] at [offset].
+  ///
+  /// For instance:
+  /// * If this is a [PropertyAccessGenerator] for `a.b`, this will create
+  ///   a [MethodInvocation] for `a.b(...)`.
+  /// * If this is a [ThisAccessGenerator] for `this` in an initializer list,
+  ///   this will create a [RedirectingInitializer] for `this(...)`.
+  /// * If this is an [IncompleteErrorGenerator], this will return the error
+  ///   generator itself.
+  ///
   /* Expression | Generator | Initializer */ doInvocation(
       int offset, Arguments arguments);
 
   /* Expression | Generator */ buildPropertyAccess(
       IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
     if (send is SendAccessGenerator) {
-      return helper.buildMethodInvocation(
-          buildSimpleRead(),
-          send.name,
-          send.arguments as dynamic /* TODO(ahe): Remove this cast. */,
-          offsetForToken(send.token),
+      return _helper.buildMethodInvocation(buildSimpleRead(), send.name,
+          send.arguments, offsetForToken(send.token),
           isNullAware: isNullAware);
     } else {
-      if (helper.constantContext != ConstantContext.none &&
+      if (_helper.constantContext != ConstantContext.none &&
           send.name != lengthName) {
-        helper.addProblem(
+        _helper.addProblem(
             messageNotAConstantExpression, offsetForToken(token), token.length);
       }
-      return PropertyAccessGenerator.make(helper, send.token, buildSimpleRead(),
-          send.name, null, null, isNullAware);
+      return PropertyAccessGenerator.make(_helper, send.token,
+          buildSimpleRead(), send.name, null, null, isNullAware);
     }
   }
 
-  KernelTypeBuilder buildTypeWithResolvedArguments(
-      List<UnresolvedType<KernelTypeBuilder>> arguments) {
-    KernelNamedTypeBuilder result =
-        new KernelNamedTypeBuilder(token.lexeme, null);
+  /// Returns a [TypeBuilder] for this subexpression instantiated with the
+  /// type [arguments]. If no type arguments are provided [arguments] is `null`.
+  ///
+  /// The type arguments have not been resolved and should be resolved to
+  /// create a [TypeBuilder] for a valid type.
+  TypeBuilder buildTypeWithResolvedArguments(List<UnresolvedType> arguments) {
+    NamedTypeBuilder result = new NamedTypeBuilder(token.lexeme, null);
     Message message = templateNotAType.withArguments(token.lexeme);
-    helper.library
-        .addProblem(message, offsetForToken(token), lengthForToken(token), uri);
+    _helper.library.addProblem(
+        message, offsetForToken(token), lengthForToken(token), _uri);
     result.bind(result.buildInvalidType(message.withLocation(
-        uri, offsetForToken(token), lengthForToken(token))));
+        _uri, offsetForToken(token), lengthForToken(token))));
     return result;
   }
 
   /* Expression | Generator */ Object qualifiedLookup(Token name) {
-    return new UnexpectedQualifiedUseGenerator(helper, name, this, false);
+    return new UnexpectedQualifiedUseGenerator(_helper, name, this, false);
   }
 
   Expression invokeConstructor(
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       String name,
       Arguments arguments,
       Token nameToken,
       Token nameLastToken,
       Constness constness) {
     if (typeArguments != null) {
-      assert(forest.argumentsTypeArguments(arguments).isEmpty);
-      forest.argumentsSetTypeArguments(
-          arguments, helper.buildDartTypeArguments(typeArguments));
+      assert(_forest.argumentsTypeArguments(arguments).isEmpty);
+      _forest.argumentsSetTypeArguments(
+          arguments, _helper.buildDartTypeArguments(typeArguments));
     }
-    return helper.wrapInvalidConstructorInvocation(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(token),
-            helper.constructorNameForDiagnostics(name,
-                className: plainNameForRead),
+    return _helper.wrapInvalidConstructorInvocation(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(token),
+            _helper.constructorNameForDiagnostics(name,
+                className: _plainNameForRead),
             arguments,
             nameToken.charOffset),
         null,
@@ -251,13 +483,11 @@
         offsetForToken(token));
   }
 
-  bool get isThisPropertyAccess => false;
-
   void printOn(StringSink sink);
 
   String toString() {
     StringBuffer buffer = new StringBuffer();
-    buffer.write(debugName);
+    buffer.write(_debugName);
     buffer.write("(offset: ");
     buffer.write("${offsetForToken(token)}");
     printOn(buffer);
@@ -266,35 +496,209 @@
   }
 }
 
-abstract class VariableUseGenerator implements Generator {
-  factory VariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
-      VariableDeclaration variable,
-      [DartType promotedType]) {
-    return helper.forest
-        .variableUseGenerator(helper, token, variable, promotedType);
+/// [VariableUseGenerator] represents the subexpression whose prefix is a
+/// local variable or parameter name.
+///
+/// For instance:
+///
+///   method(a) {
+///     var b;
+///     a;         // a VariableUseGenerator is created for `a`.
+///     b = a[];   // a VariableUseGenerator is created for `a` and `b`.
+///     b();       // a VariableUseGenerator is created for `b`.
+///     b.c = a.d; // a VariableUseGenerator is created for `a` and `b`.
+///   }
+///
+/// If the variable is final or read-only (like a parameter in a catch clause) a
+/// [ReadOnlyAccessGenerator] is created instead.
+class VariableUseGenerator extends Generator {
+  final VariableDeclaration variable;
+
+  final DartType promotedType;
+
+  VariableUseGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.variable,
+      [this.promotedType])
+      : super(helper, token);
+
+  @override
+  String get _debugName => "VariableUseGenerator";
+
+  @override
+  String get _plainNameForRead => variable.name;
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var fact = _helper.typePromoter
+        ?.getFactForAccess(variable, _helper.functionNestingLevel);
+    var scope = _helper.typePromoter?.currentScope;
+    var read = new VariableGetJudgment(variable, fact, scope)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
   }
 
   @override
-  String get debugName => "VariableUseGenerator";
-}
-
-abstract class PropertyAccessGenerator implements Generator {
-  factory PropertyAccessGenerator.internal(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiver,
-      Name name,
-      Member getter,
-      Member setter) {
-    return helper.forest
-        .propertyAccessGenerator(helper, token, receiver, name, getter, setter);
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    _helper.typePromoter
+        ?.mutateVariable(variable, _helper.functionNestingLevel);
+    Expression write;
+    if (variable.isFinal || variable.isConst) {
+      write = _makeInvalidWrite(value);
+      if (complexAssignment != null) {
+        write = _helper.desugarSyntheticExpression(write);
+        complexAssignment.write = write;
+      }
+    } else {
+      write = new VariableSet(variable, value)
+        ..fileOffset = offsetForToken(token);
+      complexAssignment?.write = write;
+    }
+    return write;
   }
 
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(buildSimpleRead(), callName, arguments,
+        adjustForImplicitCall(_plainNameForRead, offset),
+        isImplicitCall: true);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
+    return SyntheticWrapper.wrapVariableAssignment(rhs)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", variable: ");
+    printNodeOn(variable, sink, syntheticNames: syntheticNames);
+    sink.write(", promotedType: ");
+    printNodeOn(promotedType, sink, syntheticNames: syntheticNames);
+  }
+}
+
+/// A [PropertyAccessGenerator] represents a subexpression whose prefix is
+/// an explicit property access.
+///
+/// For instance
+///
+///   method(a) {
+///     a.b;      // a PropertyAccessGenerator is created for `a.b`.
+///     a.b();    // a PropertyAccessGenerator is created for `a.b`.
+///     a.b = c;  // a PropertyAccessGenerator is created for `a.b`.
+///     a.b += c; // a PropertyAccessGenerator is created for `a.b`.
+///   }
+///
+/// If the receiver is `this`, a [ThisPropertyAccessGenerator] is created
+/// instead. If the access is null-aware, e.g. `a?.b`, a
+/// [NullAwarePropertyAccessGenerator] is created instead.
+class PropertyAccessGenerator extends Generator {
+  /// The receiver expression. `a` in the examples in the class documentation.
+  final Expression receiver;
+
+  /// The name for the accessed property. `b` in the examples in the class
+  /// documentation.
+  final Name name;
+
+  // TODO(johnniwinther): Remove [getter] and [setter]? These are never
+  // passed.
+  final Member getter;
+
+  final Member setter;
+
+  /// Synthetic variable created for [receiver] if need.
+  VariableDeclaration _receiverVariable;
+
+  PropertyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.receiver, this.name, this.getter, this.setter)
+      : super(helper, token);
+
+  @override
+  String get _debugName => "PropertyAccessGenerator";
+
+  @override
+  String get _plainNameForRead => name.name;
+
+  receiverAccess() {
+    _receiverVariable ??= new VariableDeclaration.forValue(receiver);
+    return new VariableGet(_receiverVariable)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(receiver, name, arguments, offset);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapPropertyAssignment(receiver, rhs);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", _receiverVariable: ");
+    printNodeOn(_receiverVariable, sink, syntheticNames: syntheticNames);
+    sink.write(", receiver: ");
+    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
+    sink.write(", name: ");
+    sink.write(name.name);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+  }
+
+  @override
+  Expression _makeSimpleRead() {
+    return new PropertyGet(receiver, name, getter)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    var write = new PropertySet(receiver, name, value, setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new PropertyGet(receiverAccess(), name, getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    var write = new PropertySet(receiverAccess(), name, value, setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    return super._finish(makeLet(_receiverVariable, body), complexAssignment);
+  }
+
+  /// Creates a [Generator] for the access of property [name] on [receiver].
   static Generator make(
       ExpressionGeneratorHelper helper,
       Token token,
       Expression receiver,
       Name name,
+      // TODO(johnniwinther): Remove [getter] and [setter]? These are never
+      // passed.
       Member getter,
       Member setter,
       bool isNullAware) {
@@ -307,72 +711,449 @@
       return isNullAware
           ? new NullAwarePropertyAccessGenerator(
               helper, token, receiver, name, getter, setter, null)
-          : new PropertyAccessGenerator.internal(
+          : new PropertyAccessGenerator(
               helper, token, receiver, name, getter, setter);
     }
   }
+}
+
+/// A [ThisPropertyAccessGenerator] represents a subexpression whose prefix is
+/// an implicit or explicit access on `this`.
+///
+/// For instance
+///
+///   class C {
+///     var b;
+///     method() {
+///       b;           // a ThisPropertyAccessGenerator is created for `b`.
+///       b();         // a ThisPropertyAccessGenerator is created for `b`.
+///       b = c;       // a ThisPropertyAccessGenerator is created for `b`.
+///       b += c;      // a ThisPropertyAccessGenerator is created for `b`.
+///       this.b;      // a ThisPropertyAccessGenerator is created for `this.b`.
+///       this.b();    // a ThisPropertyAccessGenerator is created for `this.b`.
+///       this.b = c;  // a ThisPropertyAccessGenerator is created for `this.b`.
+///       this.b += c; // a ThisPropertyAccessGenerator is created for `this.b`.
+///     }
+///   }
+///
+/// This is a special case of [PropertyAccessGenerator] to avoid creating an
+/// indirect access to 'this' in for instance `this.b += c` which by
+/// [PropertyAccessGenerator] would have been created as
+///
+///     let #1 = this in #.b = #.b + c
+///
+/// instead of
+///
+///     this.b = this.b + c
+///
+class ThisPropertyAccessGenerator extends Generator {
+  /// The name for the accessed property. `b` in the examples in the class
+  /// documentation.
+  final Name name;
+
+  /// The member accessed if this subexpression has a read.
+  ///
+  /// This is `null` if the `this` class does not have a readable property named
+  /// [name].
+  final Member getter;
+
+  /// The member accessed if this subexpression has a write.
+  ///
+  /// This is `null` if the `this` class does not have a writable property named
+  /// [name].
+  final Member setter;
+
+  ThisPropertyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.name, this.getter, this.setter)
+      : super(helper, token);
+
+  @override
+  String get _debugName => "ThisPropertyAccessGenerator";
+
+  @override
+  String get _plainNameForRead => name.name;
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    if (getter == null) {
+      _helper.warnUnresolvedGet(name, offsetForToken(token));
+    }
+    var read = new PropertyGet(_forest.thisExpression(token), name, getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (setter == null) {
+      _helper.warnUnresolvedSet(name, offsetForToken(token));
+    }
+    var write =
+        new PropertySet(_forest.thisExpression(token), name, value, setter)
+          ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    Member interfaceTarget = getter;
+    if (interfaceTarget == null) {
+      _helper.warnUnresolvedMethod(name, offset);
+    }
+    if (interfaceTarget is Field) {
+      // TODO(ahe): In strong mode we should probably rewrite this to
+      // `this.name.call(arguments)`.
+      interfaceTarget = null;
+    }
+    return _helper.buildMethodInvocation(
+        _forest.thisExpression(null), name, arguments, offset,
+        interfaceTarget: interfaceTarget);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapPropertyAssignment(null, rhs);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", name: ");
+    sink.write(name.name);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+  }
+}
+
+class NullAwarePropertyAccessGenerator extends Generator {
+  final VariableDeclaration receiver;
+
+  final Expression receiverExpression;
+
+  final Name name;
+
+  final Member getter;
+
+  final Member setter;
+
+  final DartType type;
+
+  NullAwarePropertyAccessGenerator(
+      ExpressionGeneratorHelper helper,
+      Token token,
+      this.receiverExpression,
+      this.name,
+      this.getter,
+      this.setter,
+      this.type)
+      : this.receiver = makeOrReuseVariable(receiverExpression),
+        super(helper, token);
+
+  @override
+  String get _debugName => "NullAwarePropertyAccessGenerator";
+
+  Expression receiverAccess() => new VariableGet(receiver);
+
+  @override
+  String get _plainNameForRead => name.name;
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new PropertyGet(receiverAccess(), name, getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    var write = new PropertySet(receiverAccess(), name, value, setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    var offset = offsetForToken(token);
+    var nullAwareGuard = _forest.conditionalExpression(
+        buildIsNull(receiverAccess(), offset, _helper),
+        null,
+        _forest.literalNull(null)..fileOffset = offset,
+        null,
+        body)
+      ..fileOffset = offset;
+    if (complexAssignment != null) {
+      body = makeLet(receiver, nullAwareGuard);
+      if (_helper.legacyMode) return body;
+      PropertyAssignmentJudgment kernelPropertyAssign = complexAssignment;
+      kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
+      kernelPropertyAssign.desugared = body;
+      return kernelPropertyAssign;
+    } else {
+      return new NullAwarePropertyGetJudgment(receiver, nullAwareGuard)
+        ..fileOffset = offset;
+    }
+  }
 
   @override
-  String get debugName => "PropertyAccessGenerator";
-
-  @override
-  bool get isThisPropertyAccess => false;
-}
-
-/// Special case of [PropertyAccessGenerator] to avoid creating an indirect
-/// access to 'this'.
-abstract class ThisPropertyAccessGenerator implements Generator {
-  factory ThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, Name name, Member getter, Member setter) {
-    return helper.forest
-        .thisPropertyAccessGenerator(helper, token, name, getter, setter);
+  Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, _uri);
   }
 
   @override
-  String get debugName => "ThisPropertyAccessGenerator";
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapPropertyAssignment(receiverExpression, rhs);
 
   @override
-  bool get isThisPropertyAccess => true;
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", receiver: ");
+    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
+    sink.write(", receiverExpression: ");
+    printNodeOn(receiverExpression, sink, syntheticNames: syntheticNames);
+    sink.write(", name: ");
+    sink.write(name.name);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+    sink.write(", type: ");
+    printNodeOn(type, sink, syntheticNames: syntheticNames);
+  }
 }
 
-abstract class NullAwarePropertyAccessGenerator implements Generator {
-  factory NullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiverExpression,
-      Name name,
-      Member getter,
-      Member setter,
-      DartType type) {
-    return helper.forest.nullAwarePropertyAccessGenerator(
-        helper, token, receiverExpression, name, getter, setter, type);
+class SuperPropertyAccessGenerator extends Generator {
+  final Name name;
+
+  final Member getter;
+
+  final Member setter;
+
+  SuperPropertyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.name, this.getter, this.setter)
+      : super(helper, token);
+
+  @override
+  String get _debugName => "SuperPropertyAccessGenerator";
+
+  @override
+  String get _plainNameForRead => name.name;
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    if (getter == null) {
+      _helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
+    }
+    // TODO(ahe): Use [DirectPropertyGet] when possible.
+    var read = new SuperPropertyGetJudgment(name, interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
   }
 
   @override
-  String get debugName => "NullAwarePropertyAccessGenerator";
-}
-
-abstract class SuperPropertyAccessGenerator implements Generator {
-  factory SuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, Name name, Member getter, Member setter) {
-    return helper.forest
-        .superPropertyAccessGenerator(helper, token, name, getter, setter);
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (setter == null) {
+      _helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
+    }
+    // TODO(ahe): Use [DirectPropertySet] when possible.
+    var write = new SuperPropertySet(name, value, setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
   }
 
   @override
-  String get debugName => "SuperPropertyAccessGenerator";
+  Expression doInvocation(int offset, Arguments arguments) {
+    if (_helper.constantContext != ConstantContext.none) {
+      // TODO(brianwilkerson) Fix the length
+      _helper.addProblem(messageNotAConstantExpression, offset, 1);
+    }
+    if (getter == null || isFieldOrGetter(getter)) {
+      return _helper.buildMethodInvocation(
+          buildSimpleRead(), callName, arguments, offset,
+          // This isn't a constant expression, but we have checked if a
+          // constant expression error should be emitted already.
+          isConstantExpression: true,
+          isImplicitCall: true);
+    } else {
+      // TODO(ahe): This could be something like "super.property(...)" where
+      // property is a setter.
+      return unhandled("${getter.runtimeType}", "doInvocation", offset, _uri);
+    }
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapPropertyAssignment(null, rhs, isSuper: true);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", name: ");
+    sink.write(name.name);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+  }
 }
 
-abstract class IndexedAccessGenerator implements Generator {
-  factory IndexedAccessGenerator.internal(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiver,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
-    return helper.forest
-        .indexedAccessGenerator(helper, token, receiver, index, getter, setter);
+class IndexedAccessGenerator extends Generator {
+  final Expression receiver;
+
+  final Expression index;
+
+  final Procedure getter;
+
+  final Procedure setter;
+
+  VariableDeclaration receiverVariable;
+
+  VariableDeclaration indexVariable;
+
+  IndexedAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.receiver, this.index, this.getter, this.setter)
+      : super(helper, token);
+
+  @override
+  String get _plainNameForRead => "[]";
+
+  @override
+  String get _debugName => "IndexedAccessGenerator";
+
+  Expression indexAccess() {
+    indexVariable ??= new VariableDeclaration.forValue(index);
+    return new VariableGet(indexVariable)..fileOffset = offsetForToken(token);
+  }
+
+  Expression receiverAccess() {
+    // We cannot reuse the receiver if it is a variable since it might be
+    // reassigned in the index expression.
+    receiverVariable ??= new VariableDeclaration.forValue(receiver);
+    return new VariableGet(receiverVariable)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression _makeSimpleRead() {
+    var read = new MethodInvocationJudgment(receiver, indexGetName,
+        _forest.castArguments(_forest.arguments(<Expression>[index], token)),
+        interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+    return read;
+  }
+
+  @override
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    var write = new MethodInvocationJudgment(
+        receiver,
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[index, value], token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexGetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess()], token)),
+        interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    var write = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess(), value], token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  // TODO(dmitryas): remove this method after the "[]=" operator of the Context
+  // class is made to return a value.
+  Expression _makeWriteAndReturn(
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
+    // The call to []= does not return the value like direct-style assignments
+    // do.  We need to bind the value in a let.
+    var valueVariable = new VariableDeclaration.forValue(value);
+    var write = new MethodInvocationJudgment(
+        receiverAccess(),
+        indexSetName,
+        _forest.castArguments(_forest.arguments(
+            <Expression>[indexAccess(), new VariableGet(valueVariable)],
+            token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    var dummy = new VariableDeclarationJudgment.forValue(
+        write, _helper.functionNestingLevel);
+    return makeLet(
+        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
+  }
+
+  @override
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    int offset = offsetForToken(token);
+    return super._finish(
+        makeLet(
+            receiverVariable, makeLet(indexVariable, body)..fileOffset = offset)
+          ..fileOffset = offset,
+        complexAssignment);
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(
+        buildSimpleRead(), callName, arguments, _forest.readOffset(arguments),
+        isImplicitCall: true);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapIndexAssignment(receiver, index, rhs);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", receiver: ");
+    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
+    sink.write(", index: ");
+    printNodeOn(index, sink, syntheticNames: syntheticNames);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+    sink.write(", receiverVariable: ");
+    printNodeOn(receiverVariable, sink, syntheticNames: syntheticNames);
+    sink.write(", indexVariable: ");
+    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
   }
 
   static Generator make(
@@ -386,63 +1167,291 @@
       return new ThisIndexedAccessGenerator(
           helper, token, index, getter, setter);
     } else {
-      return new IndexedAccessGenerator.internal(
+      return new IndexedAccessGenerator(
           helper, token, receiver, index, getter, setter);
     }
   }
-
-  @override
-  String get plainNameForRead => "[]";
-
-  @override
-  String get plainNameForWrite => "[]=";
-
-  @override
-  String get debugName => "IndexedAccessGenerator";
 }
 
 /// Special case of [IndexedAccessGenerator] to avoid creating an indirect
 /// access to 'this'.
-abstract class ThisIndexedAccessGenerator implements Generator {
-  factory ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, Expression index, Procedure getter, Procedure setter) {
-    return helper.forest
-        .thisIndexedAccessGenerator(helper, token, index, getter, setter);
+class ThisIndexedAccessGenerator extends Generator {
+  final Expression index;
+
+  final Procedure getter;
+
+  final Procedure setter;
+
+  VariableDeclaration indexVariable;
+
+  ThisIndexedAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.index, this.getter, this.setter)
+      : super(helper, token);
+
+  @override
+  String get _plainNameForRead => "[]";
+
+  @override
+  String get _debugName => "ThisIndexedAccessGenerator";
+
+  Expression indexAccess() {
+    indexVariable ??= new VariableDeclaration.forValue(index);
+    return new VariableGet(indexVariable);
+  }
+
+  Expression _makeWriteAndReturn(
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
+    var valueVariable = new VariableDeclaration.forValue(value);
+    var write = new MethodInvocationJudgment(
+        _forest.thisExpression(token),
+        indexSetName,
+        _forest.castArguments(_forest.arguments(
+            <Expression>[indexAccess(), new VariableGet(valueVariable)],
+            token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    var dummy = new VariableDeclaration.forValue(write);
+    return makeLet(
+        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
   }
 
   @override
-  String get plainNameForRead => "[]";
+  Expression _makeSimpleRead() {
+    return new MethodInvocationJudgment(
+        _forest.thisExpression(token),
+        indexGetName,
+        _forest.castArguments(_forest.arguments(<Expression>[index], token)),
+        interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+  }
 
   @override
-  String get plainNameForWrite => "[]=";
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    var write = new MethodInvocationJudgment(
+        _forest.thisExpression(token),
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[index, value], token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
 
   @override
-  String get debugName => "ThisIndexedAccessGenerator";
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    var read = new MethodInvocationJudgment(
+        _forest.thisExpression(token),
+        indexGetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess()], token)),
+        interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    var write = new MethodInvocationJudgment(
+        _forest.thisExpression(token),
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess(), value], token)),
+        interfaceTarget: setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    return super._finish(makeLet(indexVariable, body), complexAssignment);
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(
+        buildSimpleRead(), callName, arguments, offset,
+        isImplicitCall: true);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapIndexAssignment(null, index, rhs);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", index: ");
+    printNodeOn(index, sink, syntheticNames: syntheticNames);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+    sink.write(", indexVariable: ");
+    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
+  }
 }
 
-abstract class SuperIndexedAccessGenerator implements Generator {
-  factory SuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, Expression index, Member getter, Member setter) {
-    return helper.forest
-        .superIndexedAccessGenerator(helper, token, index, getter, setter);
+class SuperIndexedAccessGenerator extends Generator {
+  final Expression index;
+
+  final Member getter;
+
+  final Member setter;
+
+  VariableDeclaration indexVariable;
+
+  SuperIndexedAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.index, this.getter, this.setter)
+      : super(helper, token);
+
+  String get _plainNameForRead => "[]";
+
+  String get _debugName => "SuperIndexedAccessGenerator";
+
+  Expression indexAccess() {
+    indexVariable ??= new VariableDeclaration.forValue(index);
+    return new VariableGet(indexVariable);
   }
 
-  String get plainNameForRead => "[]";
+  Expression _makeWriteAndReturn(
+      Expression value, ComplexAssignmentJudgment complexAssignment) {
+    var valueVariable = new VariableDeclaration.forValue(value);
+    if (setter == null) {
+      _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
+          isSuper: true);
+    }
+    var write = new SuperMethodInvocation(
+        indexSetName,
+        _forest.castArguments(_forest.arguments(
+            <Expression>[indexAccess(), new VariableGet(valueVariable)],
+            token)),
+        setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    var dummy = new VariableDeclaration.forValue(write);
+    return makeLet(
+        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
+  }
 
-  String get plainNameForWrite => "[]=";
+  @override
+  Expression _makeSimpleRead() {
+    if (getter == null) {
+      _helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
+          isSuper: true);
+    }
+    // TODO(ahe): Use [DirectMethodInvocation] when possible.
+    return new SuperMethodInvocationJudgment(indexGetName,
+        _forest.castArguments(_forest.arguments(<Expression>[index], token)),
+        interfaceTarget: getter)
+      ..fileOffset = offsetForToken(token);
+  }
 
-  String get debugName => "SuperIndexedAccessGenerator";
+  @override
+  Expression _makeSimpleWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    if (setter == null) {
+      _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
+          isSuper: true);
+    }
+    var write = new SuperMethodInvocation(
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[index, value], token)),
+        setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    if (getter == null) {
+      _helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
+          isSuper: true);
+    }
+    var read = new SuperMethodInvocation(
+        indexGetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess()], token)),
+        getter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
+    if (setter == null) {
+      _helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
+          isSuper: true);
+    }
+    var write = new SuperMethodInvocation(
+        indexSetName,
+        _forest.castArguments(
+            _forest.arguments(<Expression>[indexAccess(), value], token)),
+        setter)
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.write = write;
+    return write;
+  }
+
+  @override
+  Expression _finish(
+      Expression body, ComplexAssignmentJudgment complexAssignment) {
+    return super._finish(
+        makeLet(indexVariable, body)..fileOffset = offsetForToken(token),
+        complexAssignment);
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(
+        buildSimpleRead(), callName, arguments, offset,
+        isImplicitCall: true);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapIndexAssignment(null, index, rhs, isSuper: true);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", index: ");
+    printNodeOn(index, sink, syntheticNames: syntheticNames);
+    sink.write(", getter: ");
+    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
+    sink.write(", setter: ");
+    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
+    sink.write(", indexVariable: ");
+    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
+  }
 }
 
-abstract class StaticAccessGenerator implements Generator {
-  factory StaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      Member readTarget, Member writeTarget) {
-    return helper.forest
-        .staticAccessGenerator(helper, token, readTarget, writeTarget);
-  }
+class StaticAccessGenerator extends Generator {
+  final Member readTarget;
+
+  final Member writeTarget;
+
+  StaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.readTarget, this.writeTarget)
+      : assert(readTarget != null || writeTarget != null),
+        super(helper, token);
 
   factory StaticAccessGenerator.fromBuilder(ExpressionGeneratorHelper helper,
-      Declaration declaration, Token token, Declaration builderSetter) {
+      Builder declaration, Token token, Builder builderSetter) {
     if (declaration is AccessErrorBuilder) {
       AccessErrorBuilder error = declaration;
       declaration = error.builder;
@@ -466,35 +1475,154 @@
     return new StaticAccessGenerator(helper, token, getter, setter);
   }
 
-  Member get readTarget;
+  @override
+  String get _debugName => "StaticAccessGenerator";
 
   @override
-  String get debugName => "StaticAccessGenerator";
-}
+  String get _plainNameForRead => (readTarget ?? writeTarget).name.name;
 
-abstract class LoadLibraryGenerator implements Generator {
-  factory LoadLibraryGenerator(ExpressionGeneratorHelper helper, Token token,
-      LoadLibraryBuilder builder) {
-    return helper.forest.loadLibraryGenerator(helper, token, builder);
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    Expression read;
+    if (readTarget == null) {
+      read = _makeInvalidRead();
+      if (complexAssignment != null) {
+        read = _helper.desugarSyntheticExpression(read);
+      }
+    } else {
+      read = _helper.makeStaticGet(readTarget, token);
+    }
+    complexAssignment?.read = read;
+    return read;
   }
 
   @override
-  String get plainNameForRead => 'loadLibrary';
-
-  @override
-  String get debugName => "LoadLibraryGenerator";
-}
-
-abstract class DeferredAccessGenerator implements Generator {
-  factory DeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      PrefixUseGenerator prefixGenerator, Generator suffixGenerator) {
-    return helper.forest.deferredAccessGenerator(
-        helper, token, prefixGenerator, suffixGenerator);
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    Expression write;
+    if (writeTarget == null) {
+      write = _makeInvalidWrite(value);
+      if (complexAssignment != null) {
+        write = _helper.desugarSyntheticExpression(write);
+      }
+    } else {
+      write = new StaticSet(writeTarget, value);
+    }
+    complexAssignment?.write = write;
+    write.fileOffset = offsetForToken(token);
+    return write;
   }
 
-  PrefixUseGenerator get prefixGenerator;
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    if (_helper.constantContext != ConstantContext.none &&
+        !_helper.isIdentical(readTarget)) {
+      return _helper.buildProblem(
+          templateNotConstantExpression.withArguments('Method invocation'),
+          offset,
+          readTarget?.name?.name?.length ?? 0);
+    }
+    if (readTarget == null || isFieldOrGetter(readTarget)) {
+      return _helper.buildMethodInvocation(buildSimpleRead(), callName,
+          arguments, offset + (readTarget?.name?.name?.length ?? 0),
+          // This isn't a constant expression, but we have checked if a
+          // constant expression error should be emitted already.
+          isConstantExpression: true,
+          isImplicitCall: true);
+    } else {
+      return _helper.buildStaticInvocation(readTarget, arguments,
+          charOffset: offset);
+    }
+  }
 
-  Generator get suffixGenerator;
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapStaticAssignment(rhs);
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", readTarget: ");
+    printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
+    sink.write(", writeTarget: ");
+    printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
+  }
+}
+
+class LoadLibraryGenerator extends Generator {
+  final LoadLibraryBuilder builder;
+
+  LoadLibraryGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.builder)
+      : super(helper, token);
+
+  @override
+  String get _plainNameForRead => 'loadLibrary';
+
+  @override
+  String get _debugName => "LoadLibraryGenerator";
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    builder.importDependency.targetLibrary;
+    var read = new LoadLibraryTearOffJudgment(
+        builder.importDependency, builder.createTearoffMethod(_helper.forest))
+      ..fileOffset = offsetForToken(token);
+    complexAssignment?.read = read;
+    return read;
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    if (_forest.argumentsPositional(arguments).length > 0 ||
+        _forest.argumentsNamed(arguments).length > 0) {
+      _helper.addProblemErrorIfConst(
+          messageLoadLibraryTakesNoArguments, offset, 'loadLibrary'.length);
+    }
+    return builder.createLoadLibrary(offset, _forest, arguments);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", builder: ");
+    sink.write(builder);
+  }
+}
+
+class DeferredAccessGenerator extends Generator {
+  final PrefixUseGenerator prefixGenerator;
+
+  final Generator suffixGenerator;
+
+  DeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.prefixGenerator, this.suffixGenerator)
+      : super(helper, token);
+
+  @override
+  Expression _makeSimpleRead() {
+    return _helper.wrapInDeferredCheck(suffixGenerator._makeSimpleRead(),
+        prefixGenerator.prefix, token.charOffset);
+  }
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    return _helper.wrapInDeferredCheck(
+        suffixGenerator._makeRead(complexAssignment),
+        prefixGenerator.prefix,
+        token.charOffset);
+  }
+
+  @override
+  Expression _makeWrite(Expression value, bool voidContext,
+      ComplexAssignmentJudgment complexAssignment) {
+    return _helper.wrapInDeferredCheck(
+        suffixGenerator._makeWrite(value, voidContext, complexAssignment),
+        prefixGenerator.prefix,
+        token.charOffset);
+  }
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
+      SyntheticWrapper.wrapStaticAssignment(rhs);
 
   @override
   buildPropertyAccess(
@@ -503,47 +1631,44 @@
         suffixGenerator.buildPropertyAccess(send, operatorOffset, isNullAware);
     if (propertyAccess is Generator) {
       return new DeferredAccessGenerator(
-          helper, token, prefixGenerator, propertyAccess);
+          _helper, token, prefixGenerator, propertyAccess);
     } else {
       Expression expression = propertyAccess;
-      return helper.wrapInDeferredCheck(
+      return _helper.wrapInDeferredCheck(
           expression, prefixGenerator.prefix, token.charOffset);
     }
   }
 
   @override
-  String get plainNameForRead {
+  String get _plainNameForRead {
     return unsupported(
-        "deferredAccessor.plainNameForRead", offsetForToken(token), uri);
+        "deferredAccessor.plainNameForRead", offsetForToken(token), _uri);
   }
 
   @override
-  String get debugName => "DeferredAccessGenerator";
+  String get _debugName => "DeferredAccessGenerator";
 
   @override
-  KernelTypeBuilder buildTypeWithResolvedArguments(
-      List<UnresolvedType<KernelTypeBuilder>> arguments) {
-    String name =
-        "${prefixGenerator.plainNameForRead}.${suffixGenerator.plainNameForRead}";
-    KernelTypeBuilder type =
+  TypeBuilder buildTypeWithResolvedArguments(List<UnresolvedType> arguments) {
+    String name = "${prefixGenerator._plainNameForRead}."
+        "${suffixGenerator._plainNameForRead}";
+    TypeBuilder type =
         suffixGenerator.buildTypeWithResolvedArguments(arguments);
     LocatedMessage message;
-    if (type is KernelNamedTypeBuilder &&
-        type.declaration is KernelInvalidTypeBuilder) {
-      KernelInvalidTypeBuilder declaration = type.declaration;
+    if (type is NamedTypeBuilder && type.declaration is InvalidTypeBuilder) {
+      InvalidTypeBuilder declaration = type.declaration;
       message = declaration.message;
     } else {
       int charOffset = offsetForToken(prefixGenerator.token);
       message = templateDeferredTypeAnnotation
           .withArguments(
-              helper.buildDartType(
-                  new UnresolvedType<KernelTypeBuilder>(type, charOffset, uri)),
-              prefixGenerator.plainNameForRead)
+              _helper.buildDartType(new UnresolvedType(type, charOffset, _uri)),
+              prefixGenerator._plainNameForRead)
           .withLocation(
-              uri, charOffset, lengthOfSpan(prefixGenerator.token, token));
+              _uri, charOffset, lengthOfSpan(prefixGenerator.token, token));
     }
-    KernelNamedTypeBuilder result = new KernelNamedTypeBuilder(name, null);
-    helper.library.addProblem(
+    NamedTypeBuilder result = new NamedTypeBuilder(name, null);
+    _helper.library.addProblem(
         message.messageObject, message.charOffset, message.length, message.uri);
     result.bind(result.buildInvalidType(message));
     return result;
@@ -551,7 +1676,7 @@
 
   @override
   Expression doInvocation(int offset, Arguments arguments) {
-    return helper.wrapInDeferredCheck(
+    return _helper.wrapInDeferredCheck(
         suffixGenerator.doInvocation(offset, arguments),
         prefixGenerator.prefix,
         token.charOffset);
@@ -559,13 +1684,13 @@
 
   @override
   Expression invokeConstructor(
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       String name,
       Arguments arguments,
       Token nameToken,
       Token nameLastToken,
       Constness constness) {
-    return helper.wrapInDeferredCheck(
+    return _helper.wrapInDeferredCheck(
         suffixGenerator.invokeConstructor(typeArguments, name, arguments,
             nameToken, nameLastToken, constness),
         prefixGenerator.prefix,
@@ -581,27 +1706,47 @@
   }
 }
 
-abstract class TypeUseGenerator implements Generator {
-  factory TypeUseGenerator(ExpressionGeneratorHelper helper, Token token,
-      TypeDeclarationBuilder declaration, String plainNameForRead) {
-    return helper.forest
-        .typeUseGenerator(helper, token, declaration, plainNameForRead);
-  }
+/// [TypeUseGenerator] represents the subexpression whose prefix is the name of
+/// a class, enum, type variable, typedef, mixin declaration, extension
+/// declaration or built-in type, like dynamic and void.
+///
+/// For instance:
+///
+///   class A<T> {}
+///   typedef B = Function();
+///   mixin C<T> on A<T> {}
+///   extension D<T> on A<T> {}
+///
+///   method<T>() {
+///     C<B>        // a TypeUseGenerator is created for `C` and `B`.
+///     B b;        // a TypeUseGenerator is created for `B`.
+///     D.foo();    // a TypeUseGenerator is created for `D`.
+///     new A<T>(); // a TypeUseGenerator is created for `A` and `T`.
+///     T();        // a TypeUseGenerator is created for `T`.
+///   }
+///
+class TypeUseGenerator extends ReadOnlyAccessGenerator {
+  final TypeDeclarationBuilder declaration;
 
-  TypeDeclarationBuilder get declaration;
+  TypeUseGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.declaration, String plainNameForRead)
+      : super(helper, token, null, plainNameForRead);
 
   @override
-  String get debugName => "TypeUseGenerator";
+  String get _debugName => "TypeUseGenerator";
 
   @override
-  KernelTypeBuilder buildTypeWithResolvedArguments(
-      List<UnresolvedType<KernelTypeBuilder>> arguments) {
+  TypeBuilder buildTypeWithResolvedArguments(List<UnresolvedType> arguments) {
+    if (declaration.isExtension) {
+      // Extension declarations cannot be used as types.
+      return super.buildTypeWithResolvedArguments(arguments);
+    }
     if (arguments != null) {
       int expected = declaration.typeVariablesCount;
       if (arguments.length != expected) {
         // Build the type arguments to report any errors they may have.
-        helper.buildDartTypeArguments(arguments);
-        helper.warnTypeArgumentsMismatch(
+        _helper.buildDartTypeArguments(arguments);
+        _helper.warnTypeArgumentsMismatch(
             declaration.name, expected, offsetForToken(token));
         // We ignore the provided arguments, which will in turn return the
         // raw type below.
@@ -610,34 +1755,34 @@
         arguments = null;
       }
     } else if (declaration.typeVariablesCount != 0) {
-      helper.addProblem(
+      _helper.addProblem(
           templateMissingExplicitTypeArguments
               .withArguments(declaration.typeVariablesCount),
           offsetForToken(token),
           lengthForToken(token));
     }
 
-    List<KernelTypeBuilder> argumentBuilders;
+    List<TypeBuilder> argumentBuilders;
     if (arguments != null) {
-      argumentBuilders = new List<KernelTypeBuilder>(arguments.length);
+      argumentBuilders = new List<TypeBuilder>(arguments.length);
       for (int i = 0; i < argumentBuilders.length; i++) {
         argumentBuilders[i] =
-            helper.validateTypeUse(arguments[i], false).builder;
+            _helper.validateTypeUse(arguments[i], false).builder;
       }
     }
-    return new KernelNamedTypeBuilder(plainNameForRead, argumentBuilders)
+    return new NamedTypeBuilder(_plainNameForRead, argumentBuilders)
       ..bind(declaration);
   }
 
   @override
   Expression invokeConstructor(
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       String name,
       Arguments arguments,
       Token nameToken,
       Token nameLastToken,
       Constness constness) {
-    return helper.buildConstructorInvocation(
+    return _helper.buildConstructorInvocation(
         declaration,
         nameToken,
         nameLastToken,
@@ -653,39 +1798,213 @@
     sink.write(", declaration: ");
     sink.write(declaration);
     sink.write(", plainNameForRead: ");
-    sink.write(plainNameForRead);
-  }
-}
-
-abstract class ReadOnlyAccessGenerator implements Generator {
-  factory ReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      Expression expression, String plainNameForRead) {
-    return helper.forest
-        .readOnlyAccessGenerator(helper, token, expression, plainNameForRead);
+    sink.write(_plainNameForRead);
   }
 
   @override
-  String get debugName => "ReadOnlyAccessGenerator";
+  Expression get expression {
+    if (super.expression == null) {
+      int offset = offsetForToken(token);
+      if (declaration is InvalidTypeBuilder) {
+        InvalidTypeBuilder declaration = this.declaration;
+        _helper.addProblemErrorIfConst(
+            declaration.message.messageObject, offset, token.length);
+        super.expression = _helper.wrapSyntheticExpression(
+            _forest.throwExpression(
+                null, _forest.literalString(declaration.message.message, token))
+              ..fileOffset = offset,
+            offset);
+      } else {
+        super.expression = _forest.literalType(
+            _helper.buildDartType(
+                new UnresolvedType(
+                    buildTypeWithResolvedArguments(null), offset, _uri),
+                nonInstanceAccessIsError: true),
+            token);
+      }
+    }
+    return super.expression;
+  }
+
+  @override
+  Expression _makeInvalidWrite(Expression value) {
+    return _helper.wrapSyntheticExpression(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(token),
+            _plainNameForRead,
+            _forest.arguments(<Expression>[value], null)
+              ..fileOffset = value.fileOffset,
+            offsetForToken(token),
+            isSetter: true),
+        offsetForToken(token));
+  }
+
+  @override
+  buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    // `SomeType?.toString` is the same as `SomeType.toString`, not
+    // `(SomeType).toString`.
+    isNullAware = false;
+
+    Name name = send.name;
+    Arguments arguments = send.arguments;
+
+    if (declaration is ClassBuilder) {
+      ClassBuilder declaration = this.declaration;
+      Builder member = declaration.findStaticBuilder(
+          name.name, offsetForToken(send.token), _uri, _helper.library);
+
+      Generator generator;
+      if (member == null) {
+        // If we find a setter, [member] is an [AccessErrorBuilder], not null.
+        if (send is IncompletePropertyAccessGenerator) {
+          generator = new UnresolvedNameGenerator(_helper, send.token, name);
+        } else {
+          return _helper.buildConstructorInvocation(
+              declaration,
+              send.token,
+              send.token,
+              arguments,
+              name.name,
+              null,
+              token.charOffset,
+              Constness.implicit);
+        }
+      } else if (member is AmbiguousBuilder) {
+        return _helper.buildProblem(
+            member.message, member.charOffset, name.name.length);
+      } else {
+        Builder setter;
+        if (member.isSetter) {
+          setter = member;
+        } else if (member.isGetter) {
+          setter = declaration.findStaticBuilder(
+              name.name, offsetForToken(token), _uri, _helper.library,
+              isSetter: true);
+        } else if (member.isField) {
+          if (member.isFinal || member.isConst) {
+            setter = declaration.findStaticBuilder(
+                name.name, offsetForToken(token), _uri, _helper.library,
+                isSetter: true);
+          } else {
+            setter = member;
+          }
+        }
+        generator = new StaticAccessGenerator.fromBuilder(
+            _helper, member, send.token, setter);
+      }
+
+      return arguments == null
+          ? generator
+          : generator.doInvocation(offsetForToken(send.token), arguments);
+    } else {
+      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
+    }
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildConstructorInvocation(declaration, token, token,
+        arguments, "", null, token.charOffset, Constness.implicit);
+  }
 }
 
-abstract class ErroneousExpressionGenerator implements Generator {
+/// [ReadOnlyAccessGenerator] represents the subexpression whose prefix is the
+/// name of final local variable, final parameter, or catch clause variable or
+/// `this` in an instance method in an extension declaration.
+///
+/// For instance:
+///
+///   method(final a) {
+///     final b = null;
+///     a;         // a ReadOnlyAccessGenerator is created for `a`.
+///     a[];       // a ReadOnlyAccessGenerator is created for `a`.
+///     b();       // a ReadOnlyAccessGenerator is created for `b`.
+///     b.c = a.d; // a ReadOnlyAccessGenerator is created for `a` and `b`.
+///
+///     try {
+///     } catch (a) {
+///       a;       // a ReadOnlyAccessGenerator is created for `a`.
+///     }
+///   }
+///
+///   extension on Foo {
+///     method() {
+///       this;         // a ReadOnlyAccessGenerator is created for `this`.
+///       this.a;       // a ReadOnlyAccessGenerator is created for `this`.
+///       this.b();     // a ReadOnlyAccessGenerator is created for `this`.
+///     }
+///   }
+///
+class ReadOnlyAccessGenerator extends Generator {
+  @override
+  final String _plainNameForRead;
+
+  Expression expression;
+
+  VariableDeclaration value;
+
+  ReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.expression, this._plainNameForRead)
+      : super(helper, token);
+
+  @override
+  String get _debugName => "ReadOnlyAccessGenerator";
+
+  @override
+  Expression _makeSimpleRead() => expression;
+
+  @override
+  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
+    value ??= new VariableDeclaration.forValue(expression);
+    return new VariableGet(value);
+  }
+
+  @override
+  Expression _finish(
+          Expression body, ComplexAssignmentJudgment complexAssignment) =>
+      super._finish(makeLet(value, body), complexAssignment);
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return _helper.buildMethodInvocation(buildSimpleRead(), callName, arguments,
+        adjustForImplicitCall(_plainNameForRead, offset),
+        isImplicitCall: true);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    NameSystem syntheticNames = new NameSystem();
+    sink.write(", expression: ");
+    printNodeOn(expression, sink, syntheticNames: syntheticNames);
+    sink.write(", plainNameForRead: ");
+    sink.write(_plainNameForRead);
+    sink.write(", value: ");
+    printNodeOn(value, sink, syntheticNames: syntheticNames);
+  }
+}
+
+abstract class ErroneousExpressionGenerator extends Generator {
+  ErroneousExpressionGenerator(ExpressionGeneratorHelper helper, Token token)
+      : super(helper, token);
+
   /// Pass [arguments] that must be evaluated before throwing an error.  At
   /// most one of [isGetter] and [isSetter] should be true and they're passed
   /// to [ExpressionGeneratorHelper.throwNoSuchMethodError] if it is used.
   Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset});
 
-  Name get name => unsupported("name", offsetForToken(token), uri);
+  Name get name => unsupported("name", offsetForToken(token), _uri);
 
   @override
-  String get plainNameForRead => name.name;
+  String get _plainNameForRead => name.name;
 
   withReceiver(Object receiver, int operatorOffset, {bool isNullAware}) => this;
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    return helper.buildInvalidInitializer(helper.desugarSyntheticExpression(
-        buildError(forest.argumentsEmpty(token), isSetter: true)));
+    return _helper.buildInvalidInitializer(_helper.desugarSyntheticExpression(
+        buildError(_forest.argumentsEmpty(token), isSetter: true)));
   }
 
   @override
@@ -702,7 +2021,7 @@
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return buildError(forest.arguments(<Expression>[value], token),
+    return buildError(_forest.arguments(<Expression>[value], token),
         isSetter: true);
   }
 
@@ -713,7 +2032,7 @@
       Procedure interfaceTarget,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    return buildError(forest.arguments(<Expression>[value], token),
+    return buildError(_forest.arguments(<Expression>[value], token),
         isGetter: true);
   }
 
@@ -721,8 +2040,8 @@
   Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
     return buildError(
-        forest.arguments(
-            <Expression>[forest.literalInt(1, null)..fileOffset = offset],
+        _forest.arguments(
+            <Expression>[_forest.literalInt(1, null)..fileOffset = offset],
             token),
         isGetter: true)
       ..fileOffset = offset;
@@ -732,8 +2051,8 @@
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
     return buildError(
-        forest.arguments(
-            <Expression>[forest.literalInt(1, null)..fileOffset = offset],
+        _forest.arguments(
+            <Expression>[_forest.literalInt(1, null)..fileOffset = offset],
             token),
         isGetter: true)
       ..fileOffset = offset;
@@ -743,63 +2062,70 @@
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    return buildError(forest.arguments(<Expression>[value], token),
+    return buildError(_forest.arguments(<Expression>[value], token),
         isSetter: true);
   }
 
   @override
   Expression buildSimpleRead() {
-    return buildError(forest.argumentsEmpty(token), isGetter: true);
+    return buildError(_forest.argumentsEmpty(token), isGetter: true);
   }
 
   @override
-  Expression makeInvalidRead() {
-    return buildError(forest.argumentsEmpty(token), isGetter: true);
+  Expression _makeInvalidRead() {
+    return buildError(_forest.argumentsEmpty(token), isGetter: true);
   }
 
   @override
-  Expression makeInvalidWrite(Expression value) {
-    return buildError(forest.arguments(<Expression>[value], token),
+  Expression _makeInvalidWrite(Expression value) {
+    return buildError(_forest.arguments(<Expression>[value], token),
         isSetter: true);
   }
 
   @override
   Expression invokeConstructor(
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       String name,
       Arguments arguments,
       Token nameToken,
       Token nameLastToken,
       Constness constness) {
     if (typeArguments != null) {
-      assert(forest.argumentsTypeArguments(arguments).isEmpty);
-      forest.argumentsSetTypeArguments(
-          arguments, helper.buildDartTypeArguments(typeArguments));
+      assert(_forest.argumentsTypeArguments(arguments).isEmpty);
+      _forest.argumentsSetTypeArguments(
+          arguments, _helper.buildDartTypeArguments(typeArguments));
     }
-    return helper.wrapInvalidConstructorInvocation(
-        helper.desugarSyntheticExpression(buildError(arguments)),
+    return _helper.wrapInvalidConstructorInvocation(
+        _helper.desugarSyntheticExpression(buildError(arguments)),
         null,
         arguments,
         offsetForToken(token));
   }
 }
 
-abstract class UnresolvedNameGenerator implements ErroneousExpressionGenerator {
+class UnresolvedNameGenerator extends ErroneousExpressionGenerator {
+  @override
+  final Name name;
+
   factory UnresolvedNameGenerator(
       ExpressionGeneratorHelper helper, Token token, Name name) {
     if (name.name.isEmpty) {
       unhandled("empty", "name", offsetForToken(token), helper.uri);
     }
-    return helper.forest.unresolvedNameGenerator(helper, token, name);
+    return new UnresolvedNameGenerator.internal(helper, token, name);
   }
 
+  UnresolvedNameGenerator.internal(
+      ExpressionGeneratorHelper helper, Token token, this.name)
+      : super(helper, token);
+
   @override
-  String get debugName => "UnresolvedNameGenerator";
+  String get _debugName => "UnresolvedNameGenerator";
 
   @override
   Expression doInvocation(int charOffset, Arguments arguments) {
-    return helper.wrapUnresolvedTargetInvocation(
-        helper.desugarSyntheticExpression(
+    return _helper.wrapUnresolvedTargetInvocation(
+        _helper.desugarSyntheticExpression(
             buildError(arguments, offset: charOffset)),
         arguments,
         arguments.fileOffset);
@@ -809,10 +2135,10 @@
   Expression buildError(Arguments arguments,
       {bool isGetter: false, bool isSetter: false, int offset}) {
     offset ??= offsetForToken(this.token);
-    return helper.wrapSyntheticExpression(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(null)..fileOffset = offset,
-            plainNameForRead,
+    return _helper.wrapSyntheticExpression(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(null)..fileOffset = offset,
+            _plainNameForRead,
             arguments,
             offset,
             isGetter: isGetter,
@@ -822,54 +2148,118 @@
 
   @override
   /* Expression | Generator */ Object qualifiedLookup(Token name) {
-    return new UnexpectedQualifiedUseGenerator(helper, name, this, true);
+    return new UnexpectedQualifiedUseGenerator(_helper, name, this, true);
+  }
+
+  @override
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return _buildUnresolvedVariableAssignment(false, value);
+  }
+
+  @override
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
+    return _buildUnresolvedVariableAssignment(true, value);
+  }
+
+  @override
+  Expression buildSimpleRead() {
+    return buildError(_forest.argumentsEmpty(token), isGetter: true)
+      ..fileOffset = token.charOffset;
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+
+  Expression _buildUnresolvedVariableAssignment(
+      bool isCompound, Expression value) {
+    return _helper.wrapUnresolvedVariableAssignment(
+        _helper.desugarSyntheticExpression(buildError(
+            _forest.arguments(<Expression>[value], token),
+            isSetter: true)),
+        isCompound,
+        value,
+        token.charOffset);
   }
 }
 
-abstract class UnlinkedGenerator implements Generator {
-  factory UnlinkedGenerator(ExpressionGeneratorHelper helper, Token token,
-      UnlinkedDeclaration declaration) {
-    return helper.forest.unlinkedGenerator(helper, token, declaration);
-  }
+class UnlinkedGenerator extends Generator {
+  final UnlinkedDeclaration declaration;
 
-  UnlinkedDeclaration get declaration;
+  final Expression receiver;
+
+  final Name name;
+
+  UnlinkedGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.declaration)
+      : name = new Name(declaration.name, helper.library.target),
+        receiver = new InvalidExpression(declaration.name)
+          ..fileOffset = offsetForToken(token),
+        super(helper, token);
 
   @override
-  String get plainNameForRead => declaration.name;
+  String get _plainNameForRead => declaration.name;
 
   @override
-  String get debugName => "UnlinkedGenerator";
+  String get _debugName => "UnlinkedGenerator";
 
   @override
   void printOn(StringSink sink) {
     sink.write(", name: ");
     sink.write(declaration.name);
   }
-}
-
-abstract class ContextAwareGenerator implements Generator {
-  Generator get generator;
 
   @override
-  String get plainNameForRead {
-    return unsupported("plainNameForRead", token.charOffset, helper.uri);
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return new PropertySet(receiver, name, value)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression buildSimpleRead() {
+    return new PropertyGet(receiver, name)..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, _uri);
+  }
+}
+
+abstract class ContextAwareGenerator extends Generator {
+  final Generator generator;
+
+  ContextAwareGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.generator)
+      : super(helper, token);
+
+  @override
+  String get _plainNameForRead {
+    return unsupported("plainNameForRead", token.charOffset, _helper.uri);
   }
 
   @override
   Expression doInvocation(int charOffset, Arguments arguments) {
-    return unhandled("${runtimeType}", "doInvocation", charOffset, uri);
+    return unhandled("${runtimeType}", "doInvocation", charOffset, _uri);
   }
 
   @override
   Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return makeInvalidWrite(value);
+    return _makeInvalidWrite(value);
   }
 
   @override
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
       {bool voidContext: false}) {
-    return makeInvalidWrite(value);
+    return _makeInvalidWrite(value);
   }
 
   @override
@@ -879,46 +2269,44 @@
       Procedure interfaceTarget,
       bool isPreIncDec: false,
       bool isPostIncDec: false}) {
-    return makeInvalidWrite(value);
+    return _makeInvalidWrite(value);
   }
 
   @override
   Expression buildPrefixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    return makeInvalidWrite(null);
+    return _makeInvalidWrite(null);
   }
 
   @override
   Expression buildPostfixIncrement(Name binaryOperator,
       {int offset: -1, bool voidContext: false, Procedure interfaceTarget}) {
-    return makeInvalidWrite(null);
+    return _makeInvalidWrite(null);
   }
 
   @override
-  makeInvalidRead() {
-    return unsupported("makeInvalidRead", token.charOffset, helper.uri);
+  _makeInvalidRead() {
+    return unsupported("makeInvalidRead", token.charOffset, _helper.uri);
   }
 
   @override
-  Expression makeInvalidWrite(Expression value) {
-    return helper.buildProblem(messageIllegalAssignmentToNonAssignable,
+  Expression _makeInvalidWrite(Expression value) {
+    return _helper.buildProblem(messageIllegalAssignmentToNonAssignable,
         offsetForToken(token), lengthForToken(token));
   }
 }
 
-abstract class DelayedAssignment implements ContextAwareGenerator {
-  factory DelayedAssignment(ExpressionGeneratorHelper helper, Token token,
-      Generator generator, Expression value, String assignmentOperator) {
-    return helper.forest
-        .delayedAssignment(helper, token, generator, value, assignmentOperator);
-  }
+class DelayedAssignment extends ContextAwareGenerator {
+  final Expression value;
 
-  Expression get value;
+  String assignmentOperator;
 
-  String get assignmentOperator;
+  DelayedAssignment(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, this.value, this.assignmentOperator)
+      : super(helper, token, generator);
 
   @override
-  String get debugName => "DelayedAssignment";
+  String get _debugName => "DelayedAssignment";
 
   @override
   Expression buildSimpleRead() {
@@ -931,8 +2319,8 @@
   }
 
   Expression handleAssignment(bool voidContext) {
-    if (helper.constantContext != ConstantContext.none) {
-      return helper.buildProblem(
+    if (_helper.constantContext != ConstantContext.none) {
+      return _helper.buildProblem(
           messageNotAConstantExpression, offsetForToken(token), token.length);
     }
     if (identical("=", assignmentOperator)) {
@@ -978,35 +2366,41 @@
       return generator.buildCompoundAssignment(mustacheName, value,
           offset: offsetForToken(token), voidContext: voidContext);
     } else {
-      return unhandled(
-          assignmentOperator, "handleAssignment", token.charOffset, helper.uri);
+      return unhandled(assignmentOperator, "handleAssignment", token.charOffset,
+          _helper.uri);
     }
   }
 
   @override
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
     if (!identical("=", assignmentOperator) ||
-        !generator.isThisPropertyAccess) {
+        generator is! ThisPropertyAccessGenerator) {
       return generator.buildFieldInitializer(initializedFields);
     }
-    return helper.buildFieldInitializer(false, generator.plainNameForRead,
+    return _helper.buildFieldInitializer(false, generator._plainNameForRead,
         offsetForToken(generator.token), offsetForToken(token), value);
   }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", value: ");
+    printNodeOn(value, sink);
+    sink.write(", assignmentOperator: ");
+    sink.write(assignmentOperator);
+  }
 }
 
-abstract class DelayedPostfixIncrement implements ContextAwareGenerator {
-  factory DelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
-      Generator generator, Name binaryOperator, Procedure interfaceTarget) {
-    return helper.forest.delayedPostfixIncrement(
-        helper, token, generator, binaryOperator, interfaceTarget);
-  }
+class DelayedPostfixIncrement extends ContextAwareGenerator {
+  final Name binaryOperator;
 
-  Name get binaryOperator;
+  final Procedure interfaceTarget;
 
-  Procedure get interfaceTarget;
+  DelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
+      Generator generator, this.binaryOperator, this.interfaceTarget)
+      : super(helper, token, generator);
 
   @override
-  String get debugName => "DelayedPostfixIncrement";
+  String get _debugName => "DelayedPostfixIncrement";
 
   @override
   Expression buildSimpleRead() {
@@ -1033,40 +2427,38 @@
   }
 }
 
-abstract class PrefixUseGenerator implements Generator {
-  factory PrefixUseGenerator(
-      ExpressionGeneratorHelper helper, Token token, PrefixBuilder prefix) {
-    return helper.forest.prefixUseGenerator(helper, token, prefix);
-  }
+class PrefixUseGenerator extends Generator {
+  final PrefixBuilder prefix;
 
-  PrefixBuilder get prefix;
+  PrefixUseGenerator(ExpressionGeneratorHelper helper, Token token, this.prefix)
+      : super(helper, token);
 
   @override
-  String get plainNameForRead => prefix.name;
+  String get _plainNameForRead => prefix.name;
 
   @override
-  String get debugName => "PrefixUseGenerator";
+  String get _debugName => "PrefixUseGenerator";
 
   @override
-  Expression buildSimpleRead() => makeInvalidRead();
+  Expression buildSimpleRead() => _makeInvalidRead();
 
   @override
   /* Expression | Generator */ Object qualifiedLookup(Token name) {
-    if (helper.constantContext != ConstantContext.none && prefix.deferred) {
-      helper.addProblem(
+    if (_helper.constantContext != ConstantContext.none && prefix.deferred) {
+      _helper.addProblem(
           templateCantUseDeferredPrefixAsConstant.withArguments(token),
           offsetForToken(token),
           lengthForToken(token));
     }
-    Object result = helper.scopeLookup(prefix.exportScope, name.lexeme, name,
+    Object result = _helper.scopeLookup(prefix.exportScope, name.lexeme, name,
         isQualified: true, prefix: prefix);
     if (prefix.deferred) {
       if (result is Generator) {
         if (result is! LoadLibraryGenerator) {
-          result = new DeferredAccessGenerator(helper, name, this, result);
+          result = new DeferredAccessGenerator(_helper, name, this, result);
         }
       } else {
-        helper.wrapInDeferredCheck(result, prefix, offsetForToken(token));
+        _helper.wrapInDeferredCheck(result, prefix, offsetForToken(token));
       }
     }
     return result;
@@ -1075,10 +2467,10 @@
   @override
   /* Expression | Generator | Initializer */ doInvocation(
       int offset, Arguments arguments) {
-    return helper.wrapInLocatedProblem(
-        helper.evaluateArgumentsBefore(arguments, forest.literalNull(token)),
+    return _helper.wrapInLocatedProblem(
+        _helper.evaluateArgumentsBefore(arguments, _forest.literalNull(token)),
         messageCantUsePrefixAsExpression.withLocation(
-            helper.uri, offsetForToken(token), lengthForToken(token)));
+            _helper.uri, offsetForToken(token), lengthForToken(token)));
   }
 
   @override
@@ -1089,16 +2481,16 @@
           "'${send.name.name}' != ${send.token.lexeme}");
       Object result = qualifiedLookup(send.token);
       if (send is SendAccessGenerator) {
-        result = helper.finishSend(
+        result = _helper.finishSend(
             result,
             send.arguments as dynamic /* TODO(ahe): Remove this cast. */,
             offsetForToken(token));
       }
       if (isNullAware) {
-        result = helper.wrapInLocatedProblem(
-            helper.toValue(result),
+        result = _helper.wrapInLocatedProblem(
+            _helper.toValue(result),
             messageCantUsePrefixWithNullAware.withLocation(
-                helper.uri, offsetForToken(token), lengthForToken(token)));
+                _helper.uri, offsetForToken(token), lengthForToken(token)));
       }
       return result;
     } else {
@@ -1107,13 +2499,13 @@
   }
 
   @override
-  Expression makeInvalidRead() {
-    return helper.buildProblem(messageCantUsePrefixAsExpression,
+  Expression _makeInvalidRead() {
+    return _helper.buildProblem(messageCantUsePrefixAsExpression,
         offsetForToken(token), lengthForToken(token));
   }
 
   @override
-  Expression makeInvalidWrite(Expression value) => makeInvalidRead();
+  Expression _makeInvalidWrite(Expression value) => _makeInvalidRead();
 
   @override
   void printOn(StringSink sink) {
@@ -1124,53 +2516,49 @@
   }
 }
 
-abstract class UnexpectedQualifiedUseGenerator implements Generator {
-  factory UnexpectedQualifiedUseGenerator(ExpressionGeneratorHelper helper,
-      Token token, Generator prefixGenerator, bool isUnresolved) {
-    return helper.forest.unexpectedQualifiedUseGenerator(
-        helper, token, prefixGenerator, isUnresolved);
-  }
+class UnexpectedQualifiedUseGenerator extends Generator {
+  final Generator prefixGenerator;
 
-  Generator get prefixGenerator;
+  final bool isUnresolved;
 
-  bool get isUnresolved;
+  UnexpectedQualifiedUseGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.prefixGenerator, this.isUnresolved)
+      : super(helper, token);
 
   @override
-  String get plainNameForRead {
-    return "${prefixGenerator.plainNameForRead}.${token.lexeme}";
+  String get _plainNameForRead {
+    return "${prefixGenerator._plainNameForRead}.${token.lexeme}";
   }
 
   @override
-  String get debugName => "UnexpectedQualifiedUseGenerator";
+  String get _debugName => "UnexpectedQualifiedUseGenerator";
 
   @override
-  Expression buildSimpleRead() => makeInvalidRead();
+  Expression buildSimpleRead() => _makeInvalidRead();
 
   @override
   Expression doInvocation(int offset, Arguments arguments) {
-    return helper.wrapSyntheticExpression(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(null)..fileOffset = offset,
-            plainNameForRead,
+    return _helper.wrapSyntheticExpression(
+        _helper.throwNoSuchMethodError(
+            _forest.literalNull(null)..fileOffset = offset,
+            _plainNameForRead,
             arguments,
             offsetForToken(token)),
         offsetForToken(token));
   }
 
   @override
-  KernelTypeBuilder buildTypeWithResolvedArguments(
-      List<UnresolvedType<KernelTypeBuilder>> arguments) {
+  TypeBuilder buildTypeWithResolvedArguments(List<UnresolvedType> arguments) {
     Template<Message Function(String, String)> template = isUnresolved
         ? templateUnresolvedPrefixInTypeAnnotation
         : templateNotAPrefixInTypeAnnotation;
-    KernelNamedTypeBuilder result =
-        new KernelNamedTypeBuilder(plainNameForRead, null);
+    NamedTypeBuilder result = new NamedTypeBuilder(_plainNameForRead, null);
     Message message =
         template.withArguments(prefixGenerator.token.lexeme, token.lexeme);
-    helper.library.addProblem(message, offsetForToken(prefixGenerator.token),
-        lengthOfSpan(prefixGenerator.token, token), uri);
+    _helper.library.addProblem(message, offsetForToken(prefixGenerator.token),
+        lengthOfSpan(prefixGenerator.token, token), _uri);
     result.bind(result.buildInvalidType(message.withLocation(
-        uri,
+        _uri,
         offsetForToken(prefixGenerator.token),
         lengthOfSpan(prefixGenerator.token, token))));
     return result;
@@ -1183,66 +2571,69 @@
   }
 }
 
-abstract class ParserErrorGenerator implements Generator {
-  factory ParserErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, Message message) {
-    return helper.forest.parserErrorGenerator(helper, token, message);
-  }
+class ParserErrorGenerator extends Generator {
+  final Message message;
 
-  Message get message => null;
+  ParserErrorGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.message)
+      : super(helper, token);
 
   @override
-  String get plainNameForRead => "#parser-error";
+  String get _plainNameForRead => "#parser-error";
 
   @override
-  String get debugName => "ParserErrorGenerator";
+  String get _debugName => "ParserErrorGenerator";
 
   @override
   void printOn(StringSink sink) {}
 
   Expression buildProblem() {
-    return helper.buildProblem(message, offsetForToken(token), noLength,
+    return _helper.buildProblem(message, offsetForToken(token), noLength,
         suppressMessage: true);
   }
 
   Expression buildSimpleRead() => buildProblem();
 
-  Expression buildAssignment(Expression value, {bool voidContext}) {
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
     return buildProblem();
   }
 
   Expression buildNullAwareAssignment(
       Expression value, DartType type, int offset,
-      {bool voidContext}) {
+      {bool voidContext: false}) {
     return buildProblem();
   }
 
   Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset,
-      bool voidContext,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
       Procedure interfaceTarget,
-      bool isPreIncDec,
-      bool isPostIncDec}) {
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
     return buildProblem();
   }
 
   Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset, bool voidContext, Procedure interfaceTarget}) {
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
     return buildProblem();
   }
 
   Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset, bool voidContext, Procedure interfaceTarget}) {
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
     return buildProblem();
   }
 
-  Expression makeInvalidRead() => buildProblem();
+  Expression _makeInvalidRead() => buildProblem();
 
-  Expression makeInvalidWrite(Expression value) => buildProblem();
+  Expression _makeInvalidWrite(Expression value) => buildProblem();
 
   Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    return helper.buildInvalidInitializer(
-        helper.desugarSyntheticExpression(buildProblem()));
+    return _helper.buildInvalidInitializer(
+        _helper.desugarSyntheticExpression(buildProblem()));
   }
 
   Expression doInvocation(int offset, Arguments arguments) {
@@ -1254,13 +2645,11 @@
     return buildProblem();
   }
 
-  KernelTypeBuilder buildTypeWithResolvedArguments(
-      List<UnresolvedType<KernelTypeBuilder>> arguments) {
-    KernelNamedTypeBuilder result =
-        new KernelNamedTypeBuilder(token.lexeme, null);
-    helper.library.addProblem(message, offsetForToken(token), noLength, uri);
+  TypeBuilder buildTypeWithResolvedArguments(List<UnresolvedType> arguments) {
+    NamedTypeBuilder result = new NamedTypeBuilder(token.lexeme, null);
+    _helper.library.addProblem(message, offsetForToken(token), noLength, _uri);
     result.bind(result.buildInvalidType(
-        message.withLocation(uri, offsetForToken(token), noLength)));
+        message.withLocation(_uri, offsetForToken(token), noLength)));
     return result;
   }
 
@@ -1269,7 +2658,7 @@
   }
 
   Expression invokeConstructor(
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       String name,
       Arguments arguments,
       Token nameToken,
@@ -1278,3 +2667,509 @@
     return buildProblem();
   }
 }
+
+/// A [ThisAccessGenerator] represents a subexpression whose prefix is `this`
+/// or `super`.
+///
+/// For instance
+///
+///   class C {
+///     var b = this.c; // a ThisAccessGenerator is created for `this`.
+///     var c;
+///     C(this.c) :     // a ThisAccessGenerator is created for `this`.
+///       this.b = c;   // a ThisAccessGenerator is created for `this`.
+///     method() {
+///       this.b;       // a ThisAccessGenerator is created for `this`.
+///       super.b();    // a ThisAccessGenerator is created for `super`.
+///       this.b = c;   // a ThisAccessGenerator is created for `this`.
+///       this.b += c;  // a ThisAccessGenerator is created for `this`.
+///     }
+///   }
+///
+/// If this `this` occurs in an instance member on an extension declaration,
+/// a [ReadOnlyAccessGenerator] is created instead.
+///
+class ThisAccessGenerator extends Generator {
+  /// `true` if this access is in an initializer list.
+  ///
+  /// For instance in `<init>` in
+  ///
+  ///    class Class {
+  ///      Class() : <init>;
+  ///    }
+  ///
+  final bool isInitializer;
+
+  /// `true` if this access is in a field initializer either directly or within
+  /// an initializer list.
+  ///
+  /// For instance in `<init>` in
+  ///
+  ///    var foo = <init>;
+  ///    class Class {
+  ///      var bar = <init>;
+  ///      Class() : <init>;
+  ///    }
+  ///
+  final bool inFieldInitializer;
+
+  /// `true` if this subexpression represents a `super` prefix.
+  final bool isSuper;
+
+  ThisAccessGenerator(ExpressionGeneratorHelper helper, Token token,
+      this.isInitializer, this.inFieldInitializer,
+      {this.isSuper: false})
+      : super(helper, token);
+
+  String get _plainNameForRead {
+    return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead",
+        offsetForToken(token), _uri);
+  }
+
+  String get _debugName => "ThisAccessGenerator";
+
+  Expression buildSimpleRead() {
+    if (!isSuper) {
+      if (inFieldInitializer) {
+        return buildFieldInitializerError(null);
+      } else {
+        return _forest.thisExpression(token);
+      }
+    } else {
+      return _helper.buildProblem(messageSuperAsExpression,
+          offsetForToken(token), lengthForToken(token));
+    }
+  }
+
+  Expression buildFieldInitializerError(Map<String, int> initializedFields) {
+    String keyword = isSuper ? "super" : "this";
+    return _helper.buildProblem(
+        templateThisOrSuperAccessInFieldInitializer.withArguments(keyword),
+        offsetForToken(token),
+        keyword.length);
+  }
+
+  @override
+  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
+    Expression error = _helper.desugarSyntheticExpression(
+        buildFieldInitializerError(initializedFields));
+    return _helper.buildInvalidInitializer(error, error.fileOffset);
+  }
+
+  buildPropertyAccess(
+      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
+    Name name = send.name;
+    Arguments arguments = send.arguments;
+    int offset = offsetForToken(send.token);
+    if (isInitializer && send is SendAccessGenerator) {
+      if (isNullAware) {
+        _helper.addProblem(
+            messageInvalidUseOfNullAwareAccess, operatorOffset, 2);
+      }
+      return buildConstructorInitializer(offset, name, arguments);
+    }
+    if (inFieldInitializer && !isInitializer) {
+      return buildFieldInitializerError(null);
+    }
+    Member getter = _helper.lookupInstanceMember(name, isSuper: isSuper);
+    if (send is SendAccessGenerator) {
+      // Notice that 'this' or 'super' can't be null. So we can ignore the
+      // value of [isNullAware].
+      if (getter == null) {
+        _helper.warnUnresolvedMethod(name, offsetForToken(send.token),
+            isSuper: isSuper);
+      }
+      return _helper.buildMethodInvocation(_forest.thisExpression(null), name,
+          send.arguments, offsetForToken(send.token),
+          isSuper: isSuper, interfaceTarget: getter);
+    } else {
+      Member setter =
+          _helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
+      if (isSuper) {
+        return new SuperPropertyAccessGenerator(
+            _helper,
+            // TODO(ahe): This is not the 'super' token.
+            send.token,
+            name,
+            getter,
+            setter);
+      } else {
+        return new ThisPropertyAccessGenerator(
+            _helper,
+            // TODO(ahe): This is not the 'this' token.
+            send.token,
+            name,
+            getter,
+            setter);
+      }
+    }
+  }
+
+  doInvocation(int offset, Arguments arguments) {
+    if (isInitializer) {
+      return buildConstructorInitializer(offset, new Name(""), arguments);
+    } else if (isSuper) {
+      return _helper.buildProblem(messageSuperAsExpression, offset, noLength);
+    } else {
+      return _helper.buildMethodInvocation(
+          _forest.thisExpression(null), callName, arguments, offset,
+          isImplicitCall: true);
+    }
+  }
+
+  Initializer buildConstructorInitializer(
+      int offset, Name name, Arguments arguments) {
+    Constructor constructor = _helper.lookupConstructor(name, isSuper: isSuper);
+    LocatedMessage message;
+    if (constructor != null) {
+      message = _helper.checkArgumentsForFunction(
+          constructor.function, arguments, offset, <TypeParameter>[]);
+    } else {
+      String fullName =
+          _helper.constructorNameForDiagnostics(name.name, isSuper: isSuper);
+      message = (isSuper
+              ? templateSuperclassHasNoConstructor
+              : templateConstructorNotFound)
+          .withArguments(fullName)
+          .withLocation(_uri, offsetForToken(token), lengthForToken(token));
+    }
+    if (message != null) {
+      return _helper.buildInvalidInitializer(_helper.wrapSyntheticExpression(
+          _helper.throwNoSuchMethodError(
+              _forest.literalNull(null)..fileOffset = offset,
+              _helper.constructorNameForDiagnostics(name.name,
+                  isSuper: isSuper),
+              arguments,
+              offset,
+              isSuper: isSuper,
+              message: message),
+          offset));
+    } else if (isSuper) {
+      return _helper.buildSuperInitializer(
+          false, constructor, arguments, offset);
+    } else {
+      return _helper.buildRedirectingInitializer(
+          constructor, arguments, offset);
+    }
+  }
+
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return buildAssignmentError();
+  }
+
+  Expression buildNullAwareAssignment(
+      Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return buildAssignmentError();
+  }
+
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
+    return buildAssignmentError();
+  }
+
+  Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return buildAssignmentError();
+  }
+
+  Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return buildAssignmentError();
+  }
+
+  Expression buildAssignmentError() {
+    return _helper.desugarSyntheticExpression(_helper.buildProblem(
+        isSuper ? messageCannotAssignToSuper : messageNotAnLvalue,
+        offsetForToken(token),
+        token.length));
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", isInitializer: ");
+    sink.write(isInitializer);
+    sink.write(", inFieldInitializer: ");
+    sink.write(inFieldInitializer);
+    sink.write(", isSuper: ");
+    sink.write(isSuper);
+  }
+}
+
+abstract class IncompleteSendGenerator implements Generator {
+  Name get name;
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
+
+  Arguments get arguments => null;
+}
+
+class IncompleteErrorGenerator extends ErroneousExpressionGenerator
+    with IncompleteSendGenerator {
+  final Message message;
+
+  IncompleteErrorGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.message)
+      : super(helper, token);
+
+  Name get name => null;
+
+  String get _plainNameForRead => token.lexeme;
+
+  String get _debugName => "IncompleteErrorGenerator";
+
+  @override
+  Expression buildError(Arguments arguments,
+      {bool isGetter: false, bool isSetter: false, int offset}) {
+    int length = noLength;
+    if (offset == null) {
+      offset = offsetForToken(token);
+      length = lengthForToken(token);
+    }
+    return _helper.buildProblem(message, offset, length);
+  }
+
+  @override
+  doInvocation(int offset, Arguments arguments) => this;
+
+  @override
+  Expression buildSimpleRead() {
+    return buildError(_forest.argumentsEmpty(token), isGetter: true)
+      ..fileOffset = offsetForToken(token);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", message: ");
+    sink.write(message.code.name);
+  }
+}
+
+// TODO(ahe): Rename to SendGenerator.
+class SendAccessGenerator extends Generator with IncompleteSendGenerator {
+  @override
+  final Name name;
+
+  @override
+  final Arguments arguments;
+
+  SendAccessGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.name, this.arguments)
+      : super(helper, token) {
+    assert(arguments != null);
+  }
+
+  String get _plainNameForRead => name.name;
+
+  String get _debugName => "SendAccessGenerator";
+
+  Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), _uri);
+  }
+
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), _uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    return _helper.buildMethodInvocation(
+        _helper.toValue(receiver), name, arguments, offsetForToken(token),
+        isNullAware: isNullAware);
+  }
+
+  Expression buildNullAwareAssignment(
+      Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, _uri);
+  }
+
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, _uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+    sink.write(", arguments: ");
+    var node = arguments;
+    if (node is Node) {
+      printNodeOn(node, sink);
+    } else {
+      sink.write(node);
+    }
+  }
+}
+
+class IncompletePropertyAccessGenerator extends Generator
+    with IncompleteSendGenerator {
+  final Name name;
+
+  IncompletePropertyAccessGenerator(
+      ExpressionGeneratorHelper helper, Token token, this.name)
+      : super(helper, token);
+
+  String get _plainNameForRead => name.name;
+
+  String get _debugName => "IncompletePropertyAccessGenerator";
+
+  Expression buildSimpleRead() {
+    return unsupported("buildSimpleRead", offsetForToken(token), _uri);
+  }
+
+  Expression buildAssignment(Expression value, {bool voidContext: false}) {
+    return unsupported("buildAssignment", offsetForToken(token), _uri);
+  }
+
+  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
+    if (receiver is Generator) {
+      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
+    }
+    return PropertyAccessGenerator.make(_helper, token,
+        _helper.toValue(receiver), name, null, null, isNullAware);
+  }
+
+  Expression buildNullAwareAssignment(
+      Expression value, DartType type, int offset,
+      {bool voidContext: false}) {
+    return unsupported("buildNullAwareAssignment", offset, _uri);
+  }
+
+  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget,
+      bool isPreIncDec: false,
+      bool isPostIncDec: false}) {
+    return unsupported(
+        "buildCompoundAssignment", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression buildPrefixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPrefixIncrement", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression buildPostfixIncrement(Name binaryOperator,
+      {int offset: TreeNode.noOffset,
+      bool voidContext: false,
+      Procedure interfaceTarget}) {
+    return unsupported(
+        "buildPostfixIncrement", offset ?? offsetForToken(token), _uri);
+  }
+
+  Expression doInvocation(int offset, Arguments arguments) {
+    return unsupported("doInvocation", offset, _uri);
+  }
+
+  @override
+  void printOn(StringSink sink) {
+    sink.write(", name: ");
+    sink.write(name.name);
+  }
+}
+
+class ParenthesizedExpressionGenerator extends ReadOnlyAccessGenerator {
+  ParenthesizedExpressionGenerator(
+      ExpressionGeneratorHelper helper, Token token, Expression expression)
+      : super(helper, token, expression, null);
+
+  String get _debugName => "ParenthesizedExpressionGenerator";
+
+  @override
+  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
+    return SyntheticWrapper.wrapIllegalAssignment(rhs,
+        assignmentOffset: offsetForToken(token));
+  }
+
+  Expression _makeInvalidWrite(Expression value) {
+    return _helper.wrapInvalidWrite(
+        _helper.desugarSyntheticExpression(_helper.buildProblem(
+            messageCannotAssignToParenthesizedExpression,
+            offsetForToken(token),
+            lengthForToken(token))),
+        expression,
+        offsetForToken(token));
+  }
+}
+
+Expression makeLet(VariableDeclaration variable, Expression body) {
+  if (variable == null) return body;
+  return new Let(variable, body);
+}
+
+Expression makeBinary(Expression left, Name operator, Procedure interfaceTarget,
+    Expression right, ExpressionGeneratorHelper helper,
+    {int offset: TreeNode.noOffset}) {
+  return new MethodInvocationJudgment(
+      left,
+      operator,
+      helper.forest
+          .castArguments(helper.forest.arguments(<Expression>[right], null))
+            ..fileOffset = offset,
+      interfaceTarget: interfaceTarget)
+    ..fileOffset = offset;
+}
+
+Expression buildIsNull(
+    Expression value, int offset, ExpressionGeneratorHelper helper) {
+  return makeBinary(value, equalsName, null,
+      helper.forest.literalNull(null)..fileOffset = offset, helper,
+      offset: offset);
+}
+
+VariableDeclaration makeOrReuseVariable(Expression value) {
+  // TODO: Devise a way to remember if a variable declaration was reused
+  // or is fresh (hence needs a let binding).
+  return new VariableDeclaration.forValue(value);
+}
+
+int adjustForImplicitCall(String name, int offset) {
+  // Normally the offset is at the start of the token, but in this case,
+  // because we insert a '.call', we want it at the end instead.
+  return offset + (name?.length ?? 0);
+}
+
+bool isFieldOrGetter(Member member) {
+  return member is Field || (member is Procedure && member.isGetter);
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
index 8c28085..128a924 100644
--- a/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/expression_generator_helper.dart
@@ -22,8 +22,7 @@
 
 import 'forest.dart' show Forest;
 
-import 'kernel_builder.dart'
-    show Declaration, KernelTypeBuilder, PrefixBuilder, UnresolvedType;
+import 'kernel_builder.dart' show Builder, PrefixBuilder, UnresolvedType;
 
 import 'kernel_ast_api.dart'
     show
@@ -40,11 +39,7 @@
         TypeParameter;
 
 import 'kernel_builder.dart'
-    show
-        KernelPrefixBuilder,
-        LibraryBuilder,
-        PrefixBuilder,
-        TypeDeclarationBuilder;
+    show PrefixBuilder, LibraryBuilder, TypeDeclarationBuilder;
 
 abstract class ExpressionGeneratorHelper implements InferenceHelper {
   LibraryBuilder get library;
@@ -102,7 +97,7 @@
   StaticGet makeStaticGet(Member readTarget, Token token);
 
   Expression wrapInDeferredCheck(
-      Expression expression, KernelPrefixBuilder prefix, int charOffset);
+      Expression expression, PrefixBuilder prefix, int charOffset);
 
   bool isIdentical(Member member);
 
@@ -115,18 +110,17 @@
       Member interfaceTarget});
 
   Expression buildConstructorInvocation(
-      TypeDeclarationBuilder<KernelTypeBuilder, DartType> type,
+      TypeDeclarationBuilder type,
       Token nameToken,
       Token nameLastToken,
       Arguments arguments,
       String name,
-      List<UnresolvedType<KernelTypeBuilder>> typeArguments,
+      List<UnresolvedType> typeArguments,
       int charOffset,
       Constness constness);
 
-  UnresolvedType<KernelTypeBuilder> validateTypeUse(
-      UnresolvedType<KernelTypeBuilder> unresolved,
-      bool nonInstanceAccessIsError);
+  UnresolvedType validateTypeUse(
+      UnresolvedType unresolved, bool nonInstanceAccessIsError);
 
   void addProblemErrorIfConst(Message message, int charOffset, int length);
 
@@ -144,14 +138,13 @@
   Expression evaluateArgumentsBefore(
       Arguments arguments, Expression expression);
 
-  DartType buildDartType(UnresolvedType<KernelTypeBuilder> unresolvedType,
+  DartType buildDartType(UnresolvedType unresolvedType,
       {bool nonInstanceAccessIsError});
 
-  List<DartType> buildDartTypeArguments(
-      List<UnresolvedType<KernelTypeBuilder>> unresolvedTypes);
+  List<DartType> buildDartTypeArguments(List<UnresolvedType> unresolvedTypes);
 
   void reportDuplicatedDeclaration(
-      Declaration existing, String name, int charOffset);
+      Builder existing, String name, int charOffset);
 
   Expression wrapSyntheticExpression(Expression node, int charOffset);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
index 1616ce7..ecbb93e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/fangorn.dart
@@ -29,12 +29,9 @@
         LibraryDependency,
         LogicalExpression,
         MapEntry,
-        Member,
-        Name,
         NamedExpression,
         Not,
         NullLiteral,
-        Procedure,
         Rethrow,
         Statement,
         StringConcatenation,
@@ -63,29 +60,6 @@
         IfMapEntry,
         SpreadElement;
 
-import 'kernel_expression_generator.dart'
-    show
-        KernelDeferredAccessGenerator,
-        KernelDelayedAssignment,
-        KernelDelayedPostfixIncrement,
-        KernelIndexedAccessGenerator,
-        KernelLoadLibraryGenerator,
-        KernelNullAwarePropertyAccessGenerator,
-        KernelParserErrorGenerator,
-        KernelPrefixUseGenerator,
-        KernelPropertyAccessGenerator,
-        KernelReadOnlyAccessGenerator,
-        KernelStaticAccessGenerator,
-        KernelSuperIndexedAccessGenerator,
-        KernelSuperPropertyAccessGenerator,
-        KernelThisIndexedAccessGenerator,
-        KernelThisPropertyAccessGenerator,
-        KernelTypeUseGenerator,
-        KernelUnexpectedQualifiedUseGenerator,
-        KernelUnlinkedGenerator,
-        KernelUnresolvedNameGenerator,
-        KernelVariableUseGenerator;
-
 import 'kernel_shadow_ast.dart'
     show
         ArgumentsJudgment,
@@ -114,17 +88,7 @@
         WhileJudgment,
         YieldJudgment;
 
-import 'forest.dart'
-    show
-        ExpressionGeneratorHelper,
-        Forest,
-        Generator,
-        LoadLibraryBuilder,
-        Message,
-        PrefixBuilder,
-        PrefixUseGenerator,
-        TypeDeclarationBuilder,
-        UnlinkedDeclaration;
+import 'forest.dart' show Forest;
 
 /// A shadow tree factory.
 class Fangorn extends Forest {
@@ -251,7 +215,7 @@
   }
 
   @override
-  SymbolLiteralJudgment literalSymbolSingluar(String value, Token hash, _) {
+  SymbolLiteralJudgment literalSymbolSingular(String value, Token hash, _) {
     return new SymbolLiteralJudgment(value)..fileOffset = offsetForToken(hash);
   }
 
@@ -655,200 +619,6 @@
 
   @override
   bool isVariablesDeclaration(Object node) => node is _VariablesDeclaration;
-
-  @override
-  KernelVariableUseGenerator variableUseGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      VariableDeclaration variable,
-      DartType promotedType) {
-    return new KernelVariableUseGenerator(
-        helper, token, variable, promotedType);
-  }
-
-  @override
-  KernelPropertyAccessGenerator propertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiver,
-      Name name,
-      Member getter,
-      Member setter) {
-    return new KernelPropertyAccessGenerator.internal(
-        helper, token, receiver, name, getter, setter);
-  }
-
-  @override
-  KernelThisPropertyAccessGenerator thisPropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Name name,
-      Member getter,
-      Member setter) {
-    return new KernelThisPropertyAccessGenerator(
-        helper, token, name, getter, setter);
-  }
-
-  @override
-  KernelNullAwarePropertyAccessGenerator nullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiverExpression,
-      Name name,
-      Member getter,
-      Member setter,
-      DartType type) {
-    return new KernelNullAwarePropertyAccessGenerator(
-        helper, token, receiverExpression, name, getter, setter, type);
-  }
-
-  @override
-  KernelSuperPropertyAccessGenerator superPropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Name name,
-      Member getter,
-      Member setter) {
-    return new KernelSuperPropertyAccessGenerator(
-        helper, token, name, getter, setter);
-  }
-
-  @override
-  KernelIndexedAccessGenerator indexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression receiver,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
-    return new KernelIndexedAccessGenerator.internal(
-        helper, token, receiver, index, getter, setter);
-  }
-
-  @override
-  KernelThisIndexedAccessGenerator thisIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression index,
-      Procedure getter,
-      Procedure setter) {
-    return new KernelThisIndexedAccessGenerator(
-        helper, token, index, getter, setter);
-  }
-
-  @override
-  KernelSuperIndexedAccessGenerator superIndexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression index,
-      Member getter,
-      Member setter) {
-    return new KernelSuperIndexedAccessGenerator(
-        helper, token, index, getter, setter);
-  }
-
-  @override
-  KernelStaticAccessGenerator staticAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Member getter,
-      Member setter) {
-    return new KernelStaticAccessGenerator(helper, token, getter, setter);
-  }
-
-  @override
-  KernelLoadLibraryGenerator loadLibraryGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      LoadLibraryBuilder builder) {
-    return new KernelLoadLibraryGenerator(helper, token, builder);
-  }
-
-  @override
-  KernelDeferredAccessGenerator deferredAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      PrefixUseGenerator prefixGenerator,
-      Generator suffixGenerator) {
-    return new KernelDeferredAccessGenerator(
-        helper, token, prefixGenerator, suffixGenerator);
-  }
-
-  @override
-  KernelTypeUseGenerator typeUseGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      TypeDeclarationBuilder declaration,
-      String plainNameForRead) {
-    return new KernelTypeUseGenerator(
-        helper, token, declaration, plainNameForRead);
-  }
-
-  @override
-  KernelReadOnlyAccessGenerator readOnlyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Expression expression,
-      String plainNameForRead) {
-    return new KernelReadOnlyAccessGenerator(
-        helper, token, expression, plainNameForRead);
-  }
-
-  @override
-  KernelUnresolvedNameGenerator unresolvedNameGenerator(
-      ExpressionGeneratorHelper helper, Token token, Name name) {
-    return new KernelUnresolvedNameGenerator(helper, token, name);
-  }
-
-  @override
-  KernelUnlinkedGenerator unlinkedGenerator(ExpressionGeneratorHelper helper,
-      Token token, UnlinkedDeclaration declaration) {
-    return new KernelUnlinkedGenerator(helper, token, declaration);
-  }
-
-  @override
-  KernelDelayedAssignment delayedAssignment(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Generator generator,
-      Expression value,
-      String assignmentOperator) {
-    return new KernelDelayedAssignment(
-        helper, token, generator, value, assignmentOperator);
-  }
-
-  @override
-  KernelDelayedPostfixIncrement delayedPostfixIncrement(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Generator generator,
-      Name binaryOperator,
-      Procedure interfaceTarget) {
-    return new KernelDelayedPostfixIncrement(
-        helper, token, generator, binaryOperator, interfaceTarget);
-  }
-
-  @override
-  KernelPrefixUseGenerator prefixUseGenerator(
-      ExpressionGeneratorHelper helper, Token token, PrefixBuilder prefix) {
-    return new KernelPrefixUseGenerator(helper, token, prefix);
-  }
-
-  @override
-  KernelUnexpectedQualifiedUseGenerator unexpectedQualifiedUseGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      Generator prefixGenerator,
-      bool isUnresolved) {
-    return new KernelUnexpectedQualifiedUseGenerator(
-        helper, token, prefixGenerator, isUnresolved);
-  }
-
-  @override
-  KernelParserErrorGenerator parserErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, Message message) {
-    return new KernelParserErrorGenerator(helper, token, message);
-  }
 }
 
 class _VariablesDeclaration extends Statement {
diff --git a/pkg/front_end/lib/src/fasta/kernel/forest.dart b/pkg/front_end/lib/src/fasta/kernel/forest.dart
index 818a3b1..8a0136c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forest.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forest.dart
@@ -14,29 +14,14 @@
         Expression,
         LibraryDependency,
         MapEntry,
-        Member,
-        Name,
         NamedExpression,
-        Procedure,
         Statement,
         TreeNode,
         VariableDeclaration;
 
 import 'body_builder.dart' show LabelTarget;
 
-import 'expression_generator.dart' show Generator, PrefixUseGenerator;
-
-import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
-
-import 'kernel_builder.dart'
-    show
-        Identifier,
-        LoadLibraryBuilder,
-        PrefixBuilder,
-        TypeDeclarationBuilder,
-        UnlinkedDeclaration;
-
-import '../fasta_codes.dart' show Message;
+import 'kernel_builder.dart' show Identifier;
 
 import '../scanner.dart' show Token;
 
@@ -71,7 +56,7 @@
 
   List<Expression> argumentsPositional(Arguments arguments);
 
-  List argumentsTypeArguments(Arguments arguments);
+  List<DartType> argumentsTypeArguments(Arguments arguments);
 
   void argumentsSetTypeArguments(Arguments arguments, List<DartType> types);
 
@@ -170,7 +155,7 @@
   /// Return a representation of a symbol literal defined by the [hash] and the
   /// single [component]. The component can be either an [Identifier] or an
   /// [Operator]. The [value] is the string value of the symbol.
-  Expression literalSymbolSingluar(String value, Token hash, Object component);
+  Expression literalSymbolSingular(String value, Token hash, Object component);
 
   Expression literalType(DartType type, Token location);
 
@@ -385,89 +370,6 @@
 
   bool isVariablesDeclaration(Object node);
 
-  Generator variableUseGenerator(ExpressionGeneratorHelper helper,
-      Token location, VariableDeclaration variable, DartType promotedType);
-
-  Generator propertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token location,
-      Expression receiver,
-      Name name,
-      Member getter,
-      Member setter);
-
-  Generator thisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Name name, Member getter, Member setter);
-
-  Generator nullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token location,
-      Expression receiverExpression,
-      Name name,
-      Member getter,
-      Member setter,
-      DartType type);
-
-  Generator superPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Name name, Member getter, Member setter);
-
-  Generator indexedAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token location,
-      Expression receiver,
-      Expression index,
-      Procedure getter,
-      Procedure setter);
-
-  Generator thisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Expression index, Procedure getter, Procedure setter);
-
-  Generator superIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Expression index, Member getter, Member setter);
-
-  Generator staticAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Member getter, Member setter);
-
-  Generator loadLibraryGenerator(ExpressionGeneratorHelper helper,
-      Token location, LoadLibraryBuilder builder);
-
-  Generator deferredAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token location,
-      PrefixUseGenerator prefixGenerator,
-      Generator suffixGenerator);
-
-  Generator typeUseGenerator(ExpressionGeneratorHelper helper, Token location,
-      TypeDeclarationBuilder declaration, String plainNameForRead);
-
-  Generator readOnlyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token location, Expression expression, String plainNameForRead);
-
-  Generator unresolvedNameGenerator(
-      ExpressionGeneratorHelper helper, Token location, Name name);
-
-  Generator unlinkedGenerator(ExpressionGeneratorHelper helper, Token location,
-      UnlinkedDeclaration declaration);
-
-  Generator delayedAssignment(ExpressionGeneratorHelper helper, Token location,
-      Generator generator, Expression value, String assignmentOperator);
-
-  Generator delayedPostfixIncrement(
-      ExpressionGeneratorHelper helper,
-      Token location,
-      Generator generator,
-      Name binaryOperator,
-      Procedure interfaceTarget);
-
-  Generator prefixUseGenerator(
-      ExpressionGeneratorHelper helper, Token location, PrefixBuilder prefix);
-
-  Generator unexpectedQualifiedUseGenerator(ExpressionGeneratorHelper helper,
-      Token token, Generator prefixGenerator, bool isUnresolved);
-
-  Generator parserErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, Message message);
-
   // TODO(ahe): Remove this method when all users are moved here.
   Arguments castArguments(Arguments arguments) {
     return arguments;
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 441c827..764d18b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/forwarding_node.dart
@@ -32,25 +32,25 @@
 import "../problems.dart" show unhandled;
 
 import "../type_inference/type_inference_engine.dart"
-    show IncludesTypeParametersCovariantly;
+    show IncludesTypeParametersNonCovariantly, Variance;
 
 import "../type_inference/type_inferrer.dart" show getNamedFormal;
 
 import "kernel_builder.dart"
-    show ClassHierarchyBuilder, Declaration, DelayedMember, KernelClassBuilder;
+    show ClassHierarchyBuilder, Builder, DelayedMember, ClassBuilder;
 
 class ForwardingNode {
   final ClassHierarchyBuilder hierarchy;
 
-  final KernelClassBuilder parent;
+  final ClassBuilder parent;
 
-  final Declaration combinedMemberSignatureResult;
+  final Builder combinedMemberSignatureResult;
 
   final ProcedureKind kind;
 
   /// A list containing the directly implemented and directly inherited
   /// procedures of the class in question.
-  final List<Declaration> _candidates;
+  final List<Builder> _candidates;
 
   ForwardingNode(this.hierarchy, this.parent,
       this.combinedMemberSignatureResult, this._candidates, this.kind);
@@ -111,11 +111,15 @@
       isImplCreated = true;
     }
 
-    IncludesTypeParametersCovariantly needsCheckVisitor = enclosingClass
-            .typeParameters.isEmpty
-        ? null
-        // TODO(ahe): It may be necessary to cache this object.
-        : new IncludesTypeParametersCovariantly(enclosingClass.typeParameters);
+    IncludesTypeParametersNonCovariantly needsCheckVisitor =
+        enclosingClass.typeParameters.isEmpty
+            ? null
+            // TODO(ahe): It may be necessary to cache this object.
+            : new IncludesTypeParametersNonCovariantly(
+                enclosingClass.typeParameters,
+                // We are checking the parameter types and these are in a
+                // contravariant position.
+                initialVariance: Variance.contravariant);
     bool needsCheck(DartType type) => needsCheckVisitor == null
         ? false
         : substitution.substituteType(type).accept(needsCheckVisitor);
@@ -351,7 +355,7 @@
 
   /// Returns the [i]th element of [_candidates], finalizing it if necessary.
   Member getCandidateAt(int i) {
-    Declaration candidate = _candidates[i];
+    Builder candidate = _candidates[i];
     assert(candidate is! DelayedMember);
     return candidate.target;
   }
diff --git a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
index 67a503d..1c9ab5d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/inference_visitor.dart
@@ -180,7 +180,7 @@
         isConst: node.isConst);
     inferrer.storeInferredType(node, inferenceResult.type);
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       if (!hasExplicitTypeArguments) {
         library.checkBoundsInConstructorInvocation(
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
@@ -241,7 +241,7 @@
         isConst: node.isConst);
     node.inferredType = inferenceResult.type;
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       if (!hadExplicitTypeArguments) {
         library.checkBoundsInFactoryInvocation(
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
@@ -917,7 +917,7 @@
     }
     node.inferredType = new InterfaceType(listClass, [inferredTypeArgument]);
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
         library.checkBoundsInListLiteral(
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
@@ -1468,7 +1468,7 @@
     node.inferredType =
         new InterfaceType(mapClass, [inferredKeyType, inferredValueType]);
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       // Either both [_declaredKeyType] and [_declaredValueType] are omitted or
       // none of them, so we may just check one.
       if (inferenceNeeded) {
@@ -1756,7 +1756,7 @@
     }
     node.inferredType = new InterfaceType(setClass, [inferredTypeArgument]);
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       if (inferenceNeeded) {
         library.checkBoundsInSetLiteral(
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
@@ -2021,7 +2021,7 @@
       }
     }
     if (!inferrer.isTopLevel) {
-      KernelLibraryBuilder library = inferrer.library;
+      SourceLibraryBuilder library = inferrer.library;
       if (node._implicitlyTyped) {
         library.checkBoundsInVariableDeclaration(
             node, inferrer.typeSchemaEnvironment, inferrer.helper.uri,
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
deleted file mode 100644
index dedf5ae..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_body_builder.dart
+++ /dev/null
@@ -1,69 +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.kernel_body_builder;
-
-import 'package:kernel/ast.dart' show Expression;
-
-import '../type_inference/type_inferrer.dart' show TypeInferrer;
-
-import 'body_builder.dart' show BodyBuilder;
-
-import 'fangorn.dart' show Fangorn;
-
-import 'forest.dart' show Forest;
-
-import 'kernel_api.dart' show ClassHierarchy, CoreTypes;
-
-import 'kernel_builder.dart'
-    show KernelClassBuilder, KernelLibraryBuilder, ModifierBuilder, Scope;
-
-class KernelBodyBuilder extends BodyBuilder {
-  @override
-  final Forest forest;
-
-  KernelBodyBuilder(
-      KernelLibraryBuilder library,
-      ModifierBuilder member,
-      Scope scope,
-      Scope formalParameterScope,
-      ClassHierarchy hierarchy,
-      CoreTypes coreTypes,
-      KernelClassBuilder classBuilder,
-      bool isInstanceMember,
-      Uri uri,
-      TypeInferrer typeInferrer)
-      : forest = const Fangorn(),
-        super(library, member, scope, formalParameterScope, hierarchy,
-            coreTypes, classBuilder, isInstanceMember, uri, typeInferrer);
-
-  KernelBodyBuilder.forField(ModifierBuilder member, TypeInferrer typeInferrer)
-      : forest = const Fangorn(),
-        super.forField(member, typeInferrer);
-
-  KernelBodyBuilder.forOutlineExpression(
-      KernelLibraryBuilder library,
-      KernelClassBuilder classBuilder,
-      ModifierBuilder member,
-      Scope scope,
-      Uri fileUri)
-      : forest = const Fangorn(),
-        super(
-            library,
-            member,
-            scope,
-            null,
-            library.loader.hierarchy,
-            library.loader.coreTypes,
-            classBuilder,
-            member?.isInstanceMember ?? false,
-            fileUri,
-            library.loader.typeInferenceEngine
-                ?.createLocalTypeInferrer(fileUri, null, library));
-
-  @override
-  void enterThenForTypePromotion(Expression condition) {
-    typePromoter?.enterThen(condition);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
index 146b7b2..7f19f72 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_builder.dart
@@ -21,43 +21,7 @@
 
 export 'implicit_field_type.dart' show ImplicitFieldType;
 
-export 'kernel_class_builder.dart' show KernelClassBuilder;
-
-export 'kernel_enum_builder.dart' show KernelEnumBuilder;
-
-export 'kernel_field_builder.dart' show KernelFieldBuilder;
-
-export 'kernel_formal_parameter_builder.dart' show KernelFormalParameterBuilder;
-
-export 'kernel_function_type_builder.dart' show KernelFunctionTypeBuilder;
-
-export 'kernel_invalid_type_builder.dart' show KernelInvalidTypeBuilder;
-
-export 'kernel_library_builder.dart' show KernelLibraryBuilder;
-
-export 'kernel_metadata_builder.dart' show KernelMetadataBuilder;
-
-export 'kernel_mixin_application_builder.dart'
-    show KernelMixinApplicationBuilder;
-
-export 'kernel_named_type_builder.dart' show KernelNamedTypeBuilder;
-
-export 'kernel_prefix_builder.dart' show KernelPrefixBuilder;
-
-export 'kernel_procedure_builder.dart'
-    show
-        KernelConstructorBuilder,
-        KernelFunctionBuilder,
-        KernelRedirectingFactoryBuilder,
-        KernelProcedureBuilder;
-
-export 'kernel_type_alias_builder.dart' show KernelTypeAliasBuilder;
-
-export 'kernel_type_builder.dart' show KernelTypeBuilder;
-
-export 'kernel_type_variable_builder.dart' show KernelTypeVariableBuilder;
-
-export 'kernel_variable_builder.dart' show KernelVariableBuilder;
+export 'kernel_variable_builder.dart' show VariableBuilder;
 
 export 'load_library_builder.dart' show LoadLibraryBuilder;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
deleted file mode 100644
index cb9eaf8..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_class_builder.dart
+++ /dev/null
@@ -1,1582 +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.
-
-library fasta.kernel_class_builder;
-
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        AsExpression,
-        Class,
-        Constructor,
-        DartType,
-        DynamicType,
-        Expression,
-        Field,
-        FunctionNode,
-        InterfaceType,
-        InvalidType,
-        ListLiteral,
-        Member,
-        MethodInvocation,
-        Name,
-        Procedure,
-        ProcedureKind,
-        RedirectingFactoryConstructor,
-        ReturnStatement,
-        StaticGet,
-        Supertype,
-        ThisExpression,
-        TypeParameter,
-        TypeParameterType,
-        VariableDeclaration,
-        VoidType;
-
-import 'package:kernel/ast.dart' show FunctionType, TypeParameterType;
-
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-
-import 'package:kernel/clone.dart' show CloneWithoutBody;
-
-import 'package:kernel/core_types.dart' show CoreTypes;
-
-import 'package:kernel/src/bounds_checks.dart'
-    show TypeArgumentIssue, findTypeArgumentIssues, getGenericTypeName;
-
-import 'package:kernel/type_algebra.dart' show Substitution, substitute;
-
-import 'package:kernel/type_algebra.dart' as type_algebra
-    show getSubstitutionMap;
-
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
-
-import '../dill/dill_member_builder.dart' show DillMemberBuilder;
-
-import '../fasta_codes.dart'
-    show
-        LocatedMessage,
-        Message,
-        messageGenericFunctionTypeUsedAsActualTypeArgument,
-        messageImplementsFutureOr,
-        messagePatchClassOrigin,
-        messagePatchClassTypeVariablesMismatch,
-        messagePatchDeclarationMismatch,
-        messagePatchDeclarationOrigin,
-        noLength,
-        templateDuplicatedDeclarationUse,
-        templateGenericFunctionTypeInferredAsActualTypeArgument,
-        templateIllegalMixinDueToConstructors,
-        templateIllegalMixinDueToConstructorsCause,
-        templateImplementsRepeated,
-        templateImplementsSuperClass,
-        templateImplicitMixinOverrideContext,
-        templateIncompatibleRedirecteeFunctionType,
-        templateIncorrectTypeArgument,
-        templateIncorrectTypeArgumentInSupertype,
-        templateIncorrectTypeArgumentInSupertypeInferred,
-        templateInterfaceCheckContext,
-        templateMixinApplicationIncompatibleSupertype,
-        templateNamedMixinOverrideContext,
-        templateOverriddenMethodCause,
-        templateOverrideFewerNamedArguments,
-        templateOverrideFewerPositionalArguments,
-        templateOverrideMismatchNamedParameter,
-        templateOverrideMoreRequiredArguments,
-        templateOverrideTypeMismatchParameter,
-        templateOverrideTypeMismatchReturnType,
-        templateOverrideTypeVariablesMismatch,
-        templateRedirectingFactoryIncompatibleTypeArgument,
-        templateRedirectionTargetNotFound,
-        templateTypeArgumentMismatch;
-
-import '../names.dart' show noSuchMethodName;
-
-import '../problems.dart' show unexpected, unhandled, unimplemented;
-
-import '../scope.dart' show AmbiguousBuilder;
-
-import '../type_inference/type_schema.dart' show UnknownType;
-
-import 'kernel_builder.dart'
-    show
-        ClassBuilder,
-        ConstructorReferenceBuilder,
-        Declaration,
-        KernelFunctionBuilder,
-        KernelLibraryBuilder,
-        KernelMetadataBuilder,
-        KernelNamedTypeBuilder,
-        KernelProcedureBuilder,
-        KernelRedirectingFactoryBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        MemberBuilder,
-        MetadataBuilder,
-        ProcedureBuilder,
-        Scope,
-        TypeVariableBuilder;
-
-import 'redirecting_factory_body.dart'
-    show getRedirectingFactoryBody, RedirectingFactoryBody;
-
-import 'kernel_target.dart' show KernelTarget;
-
-import 'types.dart' show Types;
-
-abstract class KernelClassBuilder
-    extends ClassBuilder<KernelTypeBuilder, InterfaceType> {
-  KernelClassBuilder actualOrigin;
-
-  KernelClassBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      KernelTypeBuilder supertype,
-      List<KernelTypeBuilder> interfaces,
-      Scope scope,
-      Scope constructors,
-      LibraryBuilder parent,
-      int charOffset)
-      : super(metadata, modifiers, name, typeVariables, supertype, interfaces,
-            scope, constructors, parent, charOffset);
-
-  Class get cls;
-
-  Class get target => cls;
-
-  Class get actualCls;
-
-  @override
-  KernelClassBuilder get origin => actualOrigin ?? this;
-
-  /// [arguments] have already been built.
-  InterfaceType buildTypesWithBuiltArguments(
-      LibraryBuilder library, List<DartType> arguments) {
-    assert(arguments == null || cls.typeParameters.length == arguments.length);
-    return arguments == null ? cls.rawType : new InterfaceType(cls, arguments);
-  }
-
-  @override
-  int get typeVariablesCount => typeVariables?.length ?? 0;
-
-  List<DartType> buildTypeArguments(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    if (arguments == null && typeVariables == null) {
-      return <DartType>[];
-    }
-
-    if (arguments == null && typeVariables != null) {
-      List<DartType> result =
-          new List<DartType>.filled(typeVariables.length, null, growable: true);
-      for (int i = 0; i < result.length; ++i) {
-        result[i] = typeVariables[i].defaultType.build(library);
-      }
-      if (library is KernelLibraryBuilder) {
-        library.inferredTypes.addAll(result);
-      }
-      return result;
-    }
-
-    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
-      // That should be caught and reported as a compile-time error earlier.
-      return unhandled(
-          templateTypeArgumentMismatch
-              .withArguments(typeVariables.length)
-              .message,
-          "buildTypeArguments",
-          -1,
-          null);
-    }
-
-    // arguments.length == typeVariables.length
-    List<DartType> result =
-        new List<DartType>.filled(arguments.length, null, growable: true);
-    for (int i = 0; i < result.length; ++i) {
-      result[i] = arguments[i].build(library);
-    }
-    return result;
-  }
-
-  /// If [arguments] are null, the default types for the variables are used.
-  InterfaceType buildType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    return buildTypesWithBuiltArguments(
-        library, buildTypeArguments(library, arguments));
-  }
-
-  Supertype buildSupertype(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    Class cls = isPatch ? origin.target : this.cls;
-    return new Supertype(cls, buildTypeArguments(library, arguments));
-  }
-
-  Supertype buildMixedInType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    Class cls = isPatch ? origin.target : this.cls;
-    if (arguments != null) {
-      return new Supertype(cls, buildTypeArguments(library, arguments));
-    } else {
-      return new Supertype(
-          cls,
-          new List<DartType>.filled(
-              cls.typeParameters.length, const UnknownType(),
-              growable: true));
-    }
-  }
-
-  @override
-  void buildOutlineExpressions(LibraryBuilder library) {
-    void build(String ignore, Declaration declaration) {
-      MemberBuilder member = declaration;
-      member.buildOutlineExpressions(library);
-    }
-
-    KernelMetadataBuilder.buildAnnotations(
-        isPatch ? origin.target : cls, metadata, library, this, null);
-    constructors.forEach(build);
-    scope.forEach(build);
-  }
-
-  void checkSupertypes(CoreTypes coreTypes) {
-    // This method determines whether the class (that's being built) its super
-    // class appears both in 'extends' and 'implements' clauses and whether any
-    // interface appears multiple times in the 'implements' clause.
-    if (interfaces == null) return;
-
-    // Extract super class (if it exists).
-    ClassBuilder superClass;
-    KernelTypeBuilder superClassType = supertype;
-    if (superClassType is KernelNamedTypeBuilder) {
-      Declaration decl = superClassType.declaration;
-      if (decl is ClassBuilder) {
-        superClass = decl;
-      }
-    }
-
-    // Validate interfaces.
-    Map<ClassBuilder, int> problems;
-    Map<ClassBuilder, int> problemsOffsets;
-    Set<ClassBuilder> implemented = new Set<ClassBuilder>();
-    for (KernelTypeBuilder type in interfaces) {
-      if (type is KernelNamedTypeBuilder) {
-        int charOffset = -1; // TODO(ahe): Get offset from type.
-        Declaration decl = type.declaration;
-        if (decl is ClassBuilder) {
-          ClassBuilder interface = decl;
-          if (superClass == interface) {
-            addProblem(
-                templateImplementsSuperClass.withArguments(interface.name),
-                charOffset,
-                noLength);
-          } else if (implemented.contains(interface)) {
-            // Aggregate repetitions.
-            problems ??= new Map<ClassBuilder, int>();
-            problems[interface] ??= 0;
-            problems[interface] += 1;
-
-            problemsOffsets ??= new Map<ClassBuilder, int>();
-            problemsOffsets[interface] ??= charOffset;
-          } else if (interface.target == coreTypes.futureOrClass) {
-            addProblem(messageImplementsFutureOr, charOffset,
-                interface.target.name.length);
-          } else {
-            implemented.add(interface);
-          }
-        }
-      }
-    }
-    if (problems != null) {
-      problems.forEach((ClassBuilder interface, int repetitions) {
-        addProblem(
-            templateImplementsRepeated.withArguments(
-                interface.name, repetitions),
-            problemsOffsets[interface],
-            noLength);
-      });
-    }
-  }
-
-  void checkBoundsInSupertype(
-      Supertype supertype, TypeEnvironment typeEnvironment) {
-    KernelLibraryBuilder library = this.library;
-
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        new InterfaceType(supertype.classNode, supertype.typeArguments),
-        typeEnvironment,
-        allowSuperBounded: false);
-    if (issues != null) {
-      for (TypeArgumentIssue issue in issues) {
-        Message message;
-        DartType argument = issue.argument;
-        TypeParameter typeParameter = issue.typeParameter;
-        bool inferred = library.inferredTypes.contains(argument);
-        if (argument is FunctionType && argument.typeParameters.length > 0) {
-          if (inferred) {
-            message = templateGenericFunctionTypeInferredAsActualTypeArgument
-                .withArguments(argument);
-          } else {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-          }
-          typeParameter = null;
-        } else {
-          if (inferred) {
-            message =
-                templateIncorrectTypeArgumentInSupertypeInferred.withArguments(
-                    argument,
-                    typeParameter.bound,
-                    typeParameter.name,
-                    getGenericTypeName(issue.enclosingType),
-                    supertype.classNode.name,
-                    name);
-          } else {
-            message = templateIncorrectTypeArgumentInSupertype.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                getGenericTypeName(issue.enclosingType),
-                supertype.classNode.name,
-                name);
-          }
-        }
-
-        library.reportTypeArgumentIssue(
-            message, fileUri, charOffset, typeParameter);
-      }
-    }
-  }
-
-  void checkBoundsInOutline(TypeEnvironment typeEnvironment) {
-    KernelLibraryBuilder library = this.library;
-
-    // Check in bounds of own type variables.
-    for (TypeParameter parameter in cls.typeParameters) {
-      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-          parameter.bound, typeEnvironment,
-          allowSuperBounded: true);
-      if (issues != null) {
-        for (TypeArgumentIssue issue in issues) {
-          DartType argument = issue.argument;
-          TypeParameter typeParameter = issue.typeParameter;
-          if (library.inferredTypes.contains(argument)) {
-            // Inference in type expressions in the supertypes boils down to
-            // instantiate-to-bound which shouldn't produce anything that breaks
-            // the bounds after the non-simplicity checks are done.  So, any
-            // violation here is the result of non-simple bounds, and the error
-            // is reported elsewhere.
-            continue;
-          }
-
-          Message message;
-          if (argument is FunctionType && argument.typeParameters.length > 0) {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-            typeParameter = null;
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                getGenericTypeName(issue.enclosingType));
-          }
-
-          library.reportTypeArgumentIssue(
-              message, fileUri, parameter.fileOffset, typeParameter);
-        }
-      }
-    }
-
-    // Check in supers.
-    if (cls.supertype != null) {
-      checkBoundsInSupertype(cls.supertype, typeEnvironment);
-    }
-    if (cls.mixedInType != null) {
-      checkBoundsInSupertype(cls.mixedInType, typeEnvironment);
-    }
-    if (cls.implementedTypes != null) {
-      for (Supertype supertype in cls.implementedTypes) {
-        checkBoundsInSupertype(supertype, typeEnvironment);
-      }
-    }
-
-    // Check in members.
-    for (Field field in cls.fields) {
-      library.checkBoundsInField(field, typeEnvironment);
-    }
-    for (Procedure procedure in cls.procedures) {
-      library.checkBoundsInFunctionNode(
-          procedure.function, typeEnvironment, fileUri);
-    }
-    for (Constructor constructor in cls.constructors) {
-      library.checkBoundsInFunctionNode(
-          constructor.function, typeEnvironment, fileUri);
-    }
-    for (RedirectingFactoryConstructor redirecting
-        in cls.redirectingFactoryConstructors) {
-      library.checkBoundsInFunctionNodeParts(
-          typeEnvironment, fileUri, redirecting.fileOffset,
-          typeParameters: redirecting.typeParameters,
-          positionalParameters: redirecting.positionalParameters,
-          namedParameters: redirecting.namedParameters);
-    }
-  }
-
-  @override
-  int resolveConstructors(LibraryBuilder library) {
-    int count = super.resolveConstructors(library);
-    if (count != 0) {
-      Map<String, MemberBuilder> constructors = this.constructors.local;
-      // Copy keys to avoid concurrent modification error.
-      List<String> names = constructors.keys.toList();
-      for (String name in names) {
-        Declaration declaration = constructors[name];
-        do {
-          if (declaration.parent != this) {
-            unexpected("$fileUri", "${declaration.parent.fileUri}", charOffset,
-                fileUri);
-          }
-          if (declaration is KernelRedirectingFactoryBuilder) {
-            // Compute the immediate redirection target, not the effective.
-            ConstructorReferenceBuilder redirectionTarget =
-                declaration.redirectionTarget;
-            if (redirectionTarget != null) {
-              Declaration targetBuilder = redirectionTarget.target;
-              if (declaration.next == null) {
-                // Only the first one (that is, the last on in the linked list)
-                // is actually in the kernel tree. This call creates a StaticGet
-                // to [declaration.target] in a field `_redirecting#` which is
-                // only legal to do to things in the kernel tree.
-                addRedirectingConstructor(declaration, library);
-              }
-              if (targetBuilder is ProcedureBuilder) {
-                List<DartType> typeArguments = declaration.typeArguments;
-                if (typeArguments == null) {
-                  // TODO(32049) If type arguments aren't specified, they should
-                  // be inferred.  Currently, the inference is not performed.
-                  // The code below is a workaround.
-                  typeArguments = new List<DartType>.filled(
-                      targetBuilder.target.enclosingClass.typeParameters.length,
-                      const DynamicType(),
-                      growable: true);
-                }
-                declaration.setRedirectingFactoryBody(
-                    targetBuilder.target, typeArguments);
-              } else if (targetBuilder is DillMemberBuilder) {
-                List<DartType> typeArguments = declaration.typeArguments;
-                if (typeArguments == null) {
-                  // TODO(32049) If type arguments aren't specified, they should
-                  // be inferred.  Currently, the inference is not performed.
-                  // The code below is a workaround.
-                  typeArguments = new List<DartType>.filled(
-                      targetBuilder.target.enclosingClass.typeParameters.length,
-                      const DynamicType(),
-                      growable: true);
-                }
-                declaration.setRedirectingFactoryBody(
-                    targetBuilder.member, typeArguments);
-              } else if (targetBuilder is AmbiguousBuilder) {
-                Message message = templateDuplicatedDeclarationUse
-                    .withArguments(redirectionTarget.fullNameForErrors);
-                if (declaration.isConst) {
-                  addProblem(message, declaration.charOffset, noLength);
-                } else {
-                  addProblem(message, declaration.charOffset, noLength);
-                }
-                // CoreTypes aren't computed yet, and this is the outline
-                // phase. So we can't and shouldn't create a method body.
-                declaration.body = new RedirectingFactoryBody.unresolved(
-                    redirectionTarget.fullNameForErrors);
-              } else {
-                Message message = templateRedirectionTargetNotFound
-                    .withArguments(redirectionTarget.fullNameForErrors);
-                if (declaration.isConst) {
-                  addProblem(message, declaration.charOffset, noLength);
-                } else {
-                  addProblem(message, declaration.charOffset, noLength);
-                }
-                // CoreTypes aren't computed yet, and this is the outline
-                // phase. So we can't and shouldn't create a method body.
-                declaration.body = new RedirectingFactoryBody.unresolved(
-                    redirectionTarget.fullNameForErrors);
-              }
-            }
-          }
-          declaration = declaration.next;
-        } while (declaration != null);
-      }
-    }
-    return count;
-  }
-
-  void addRedirectingConstructor(
-      KernelProcedureBuilder constructor, KernelLibraryBuilder library) {
-    // Add a new synthetic field to this class for representing factory
-    // constructors. This is used to support resolving such constructors in
-    // source code.
-    //
-    // The synthetic field looks like this:
-    //
-    //     final _redirecting# = [c1, ..., cn];
-    //
-    // Where each c1 ... cn are an instance of [StaticGet] whose target is
-    // [constructor.target].
-    //
-    // TODO(ahe): Add a kernel node to represent redirecting factory bodies.
-    DillMemberBuilder constructorsField =
-        origin.scope.local.putIfAbsent("_redirecting#", () {
-      ListLiteral literal = new ListLiteral(<Expression>[]);
-      Name name = new Name("_redirecting#", library.library);
-      Field field = new Field(name,
-          isStatic: true, initializer: literal, fileUri: cls.fileUri)
-        ..fileOffset = cls.fileOffset;
-      cls.addMember(field);
-      return new DillMemberBuilder(field, this);
-    });
-    Field field = constructorsField.target;
-    ListLiteral literal = field.initializer;
-    literal.expressions
-        .add(new StaticGet(constructor.target)..parent = literal);
-  }
-
-  void handleSeenCovariant(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      bool isSetter,
-      callback(Member declaredMember, 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 m = types.hierarchy.getInterfaceMemberKernel(
-          supertype.classNode, interfaceMember.name, isSetter);
-      if (m != null) {
-        callback(declaredMember, m, isSetter);
-      }
-    }
-  }
-
-  void checkOverride(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      bool isSetter,
-      callback(Member declaredMember, Member interfaceMember, bool isSetter),
-      {bool isInterfaceCheck = false}) {
-    if (declaredMember == interfaceMember) {
-      return;
-    }
-    if (declaredMember is Constructor || interfaceMember is Constructor) {
-      unimplemented(
-          "Constructor in override check.", declaredMember.fileOffset, fileUri);
-    }
-    if (declaredMember is Procedure && interfaceMember is Procedure) {
-      if (declaredMember.kind == ProcedureKind.Method &&
-          interfaceMember.kind == ProcedureKind.Method) {
-        bool seenCovariant = checkMethodOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
-        if (seenCovariant) {
-          handleSeenCovariant(
-              types, declaredMember, interfaceMember, isSetter, callback);
-        }
-      }
-      if (declaredMember.kind == ProcedureKind.Getter &&
-          interfaceMember.kind == ProcedureKind.Getter) {
-        checkGetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
-      }
-      if (declaredMember.kind == ProcedureKind.Setter &&
-          interfaceMember.kind == ProcedureKind.Setter) {
-        bool seenCovariant = checkSetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
-        if (seenCovariant) {
-          handleSeenCovariant(
-              types, declaredMember, interfaceMember, isSetter, callback);
-        }
-      }
-    } else {
-      bool declaredMemberHasGetter = declaredMember is Field ||
-          declaredMember is Procedure && declaredMember.isGetter;
-      bool interfaceMemberHasGetter = interfaceMember is Field ||
-          interfaceMember is Procedure && interfaceMember.isGetter;
-      bool declaredMemberHasSetter = (declaredMember is Field &&
-              !declaredMember.isFinal &&
-              !declaredMember.isConst) ||
-          declaredMember is Procedure && declaredMember.isSetter;
-      bool interfaceMemberHasSetter = (interfaceMember is Field &&
-              !interfaceMember.isFinal &&
-              !interfaceMember.isConst) ||
-          interfaceMember is Procedure && interfaceMember.isSetter;
-      if (declaredMemberHasGetter && interfaceMemberHasGetter) {
-        checkGetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
-      }
-      if (declaredMemberHasSetter && interfaceMemberHasSetter) {
-        bool seenCovariant = checkSetterOverride(
-            types, declaredMember, interfaceMember, isInterfaceCheck);
-        if (seenCovariant) {
-          handleSeenCovariant(
-              types, declaredMember, interfaceMember, isSetter, callback);
-        }
-      }
-    }
-    // TODO(ahe): Handle other cases: accessors, operators, and fields.
-  }
-
-  void checkOverrides(
-      ClassHierarchy hierarchy, TypeEnvironment typeEnvironment) {}
-
-  void checkAbstractMembers(CoreTypes coreTypes, ClassHierarchy hierarchy,
-      TypeEnvironment typeEnvironment) {}
-
-  bool hasUserDefinedNoSuchMethod(
-      Class klass, ClassHierarchy hierarchy, Class objectClass) {
-    Member noSuchMethod = hierarchy.getDispatchTarget(klass, noSuchMethodName);
-    return noSuchMethod != null && noSuchMethod.enclosingClass != objectClass;
-  }
-
-  void transformProcedureToNoSuchMethodForwarder(
-      Member noSuchMethodInterface, KernelTarget target, Procedure procedure) {
-    String prefix =
-        procedure.isGetter ? 'get:' : procedure.isSetter ? 'set:' : '';
-    Expression invocation = target.backendTarget.instantiateInvocation(
-        target.loader.coreTypes,
-        new ThisExpression(),
-        prefix + procedure.name.name,
-        new Arguments.forwarded(procedure.function),
-        procedure.fileOffset,
-        /*isSuper=*/ false);
-    Expression result = new MethodInvocation(new ThisExpression(),
-        noSuchMethodName, new Arguments([invocation]), noSuchMethodInterface)
-      ..fileOffset = procedure.fileOffset;
-    if (procedure.function.returnType is! VoidType) {
-      result = new AsExpression(result, procedure.function.returnType)
-        ..isTypeError = true
-        ..fileOffset = procedure.fileOffset;
-    }
-    procedure.function.body = new ReturnStatement(result)
-      ..fileOffset = procedure.fileOffset;
-    procedure.function.body.parent = procedure.function;
-
-    procedure.isAbstract = false;
-    procedure.isNoSuchMethodForwarder = true;
-    procedure.isForwardingStub = false;
-    procedure.isForwardingSemiStub = false;
-  }
-
-  void addNoSuchMethodForwarderForProcedure(Member noSuchMethod,
-      KernelTarget target, Procedure procedure, ClassHierarchy hierarchy) {
-    CloneWithoutBody cloner = new CloneWithoutBody(
-        typeSubstitution: type_algebra.getSubstitutionMap(
-            hierarchy.getClassAsInstanceOf(cls, procedure.enclosingClass)),
-        cloneAnnotations: false);
-    Procedure cloned = cloner.clone(procedure)..isExternal = false;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, cloned);
-    cls.procedures.add(cloned);
-    cloned.parent = cls;
-
-    KernelLibraryBuilder library = this.library;
-    library.forwardersOrigins.add(cloned);
-    library.forwardersOrigins.add(procedure);
-  }
-
-  void addNoSuchMethodForwarderGetterForField(Member noSuchMethod,
-      KernelTarget target, Field field, ClassHierarchy hierarchy) {
-    Substitution substitution = Substitution.fromSupertype(
-        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
-    Procedure getter = new Procedure(
-        field.name,
-        ProcedureKind.Getter,
-        new FunctionNode(null,
-            typeParameters: <TypeParameter>[],
-            positionalParameters: <VariableDeclaration>[],
-            namedParameters: <VariableDeclaration>[],
-            requiredParameterCount: 0,
-            returnType: substitution.substituteType(field.type)),
-        fileUri: field.fileUri)
-      ..fileOffset = field.fileOffset;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, getter);
-    cls.procedures.add(getter);
-    getter.parent = cls;
-  }
-
-  void addNoSuchMethodForwarderSetterForField(Member noSuchMethod,
-      KernelTarget target, Field field, ClassHierarchy hierarchy) {
-    Substitution substitution = Substitution.fromSupertype(
-        hierarchy.getClassAsInstanceOf(cls, field.enclosingClass));
-    Procedure setter = new Procedure(
-        field.name,
-        ProcedureKind.Setter,
-        new FunctionNode(null,
-            typeParameters: <TypeParameter>[],
-            positionalParameters: <VariableDeclaration>[
-              new VariableDeclaration("value",
-                  type: substitution.substituteType(field.type))
-            ],
-            namedParameters: <VariableDeclaration>[],
-            requiredParameterCount: 1,
-            returnType: const VoidType()),
-        fileUri: field.fileUri)
-      ..fileOffset = field.fileOffset;
-    transformProcedureToNoSuchMethodForwarder(noSuchMethod, target, setter);
-    cls.procedures.add(setter);
-    setter.parent = cls;
-  }
-
-  /// Adds noSuchMethod forwarding stubs to this class. Returns `true` if the
-  /// class was modified.
-  bool addNoSuchMethodForwarders(
-      KernelTarget target, ClassHierarchy hierarchy) {
-    if (cls.isAbstract) return false;
-
-    Set<Name> existingForwardersNames = new Set<Name>();
-    Set<Name> existingSetterForwardersNames = new Set<Name>();
-    Class leastConcreteSuperclass = cls.superclass;
-    while (
-        leastConcreteSuperclass != null && leastConcreteSuperclass.isAbstract) {
-      leastConcreteSuperclass = leastConcreteSuperclass.superclass;
-    }
-    if (leastConcreteSuperclass != null) {
-      bool superHasUserDefinedNoSuchMethod = hasUserDefinedNoSuchMethod(
-          leastConcreteSuperclass, hierarchy, target.objectClass);
-      List<Member> concrete =
-          hierarchy.getDispatchTargets(leastConcreteSuperclass);
-      for (Member member
-          in hierarchy.getInterfaceMembers(leastConcreteSuperclass)) {
-        if ((superHasUserDefinedNoSuchMethod ||
-                leastConcreteSuperclass.enclosingLibrary.compareTo(
-                            member.enclosingClass.enclosingLibrary) !=
-                        0 &&
-                    member.name.isPrivate) &&
-            ClassHierarchy.findMemberByName(concrete, member.name) == null) {
-          existingForwardersNames.add(member.name);
-        }
-      }
-
-      List<Member> concreteSetters =
-          hierarchy.getDispatchTargets(leastConcreteSuperclass, setters: true);
-      for (Member member in hierarchy
-          .getInterfaceMembers(leastConcreteSuperclass, setters: true)) {
-        if (ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
-            null) {
-          existingSetterForwardersNames.add(member.name);
-        }
-      }
-    }
-
-    Member noSuchMethod = ClassHierarchy.findMemberByName(
-        hierarchy.getInterfaceMembers(cls), noSuchMethodName);
-
-    List<Member> concrete = hierarchy.getDispatchTargets(cls);
-    List<Member> declared = hierarchy.getDeclaredMembers(cls);
-
-    bool clsHasUserDefinedNoSuchMethod =
-        hasUserDefinedNoSuchMethod(cls, hierarchy, target.objectClass);
-    bool changed = false;
-    for (Member member in hierarchy.getInterfaceMembers(cls)) {
-      // We generate a noSuchMethod forwarder for [member] in [cls] if the
-      // following three conditions are satisfied simultaneously:
-      // 1) There is a user-defined noSuchMethod in [cls] or [member] is private
-      //    and the enclosing library of [member] is different from that of
-      //    [cls].
-      // 2) There is no implementation of [member] in [cls].
-      // 3) The superclass of [cls] has no forwarder for [member].
-      if (member is Procedure &&
-          (clsHasUserDefinedNoSuchMethod ||
-              cls.enclosingLibrary
-                          .compareTo(member.enclosingClass.enclosingLibrary) !=
-                      0 &&
-                  member.name.isPrivate) &&
-          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
-          !existingForwardersNames.contains(member.name)) {
-        if (ClassHierarchy.findMemberByName(declared, member.name) != null) {
-          transformProcedureToNoSuchMethodForwarder(
-              noSuchMethod, target, member);
-        } else {
-          addNoSuchMethodForwarderForProcedure(
-              noSuchMethod, target, member, hierarchy);
-        }
-        existingForwardersNames.add(member.name);
-        changed = true;
-        continue;
-      }
-
-      if (member is Field &&
-          ClassHierarchy.findMemberByName(concrete, member.name) == null &&
-          !existingForwardersNames.contains(member.name)) {
-        addNoSuchMethodForwarderGetterForField(
-            noSuchMethod, target, member, hierarchy);
-        existingForwardersNames.add(member.name);
-        changed = true;
-      }
-    }
-
-    List<Member> concreteSetters =
-        hierarchy.getDispatchTargets(cls, setters: true);
-    List<Member> declaredSetters =
-        hierarchy.getDeclaredMembers(cls, setters: true);
-    for (Member member in hierarchy.getInterfaceMembers(cls, setters: true)) {
-      if (member is Procedure &&
-          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
-              null &&
-          !existingSetterForwardersNames.contains(member.name)) {
-        if (ClassHierarchy.findMemberByName(declaredSetters, member.name) !=
-            null) {
-          transformProcedureToNoSuchMethodForwarder(
-              noSuchMethod, target, member);
-        } else {
-          addNoSuchMethodForwarderForProcedure(
-              noSuchMethod, target, member, hierarchy);
-        }
-        existingSetterForwardersNames.add(member.name);
-        changed = true;
-      }
-      if (member is Field &&
-          ClassHierarchy.findMemberByName(concreteSetters, member.name) ==
-              null &&
-          !existingSetterForwardersNames.contains(member.name)) {
-        addNoSuchMethodForwarderSetterForField(
-            noSuchMethod, target, member, hierarchy);
-        existingSetterForwardersNames.add(member.name);
-        changed = true;
-      }
-    }
-
-    return changed;
-  }
-
-  Uri _getMemberUri(Member member) {
-    if (member is Field) return member.fileUri;
-    if (member is Procedure) return member.fileUri;
-    // Other member types won't be seen because constructors don't participate
-    // in override relationships
-    return unhandled('${member.runtimeType}', '_getMemberUri', -1, null);
-  }
-
-  Substitution _computeInterfaceSubstitution(
-      Types types,
-      Member declaredMember,
-      Member interfaceMember,
-      FunctionNode declaredFunction,
-      FunctionNode interfaceFunction,
-      bool isInterfaceCheck) {
-    Substitution interfaceSubstitution = Substitution.empty;
-    if (interfaceMember.enclosingClass.typeParameters.isNotEmpty) {
-      interfaceSubstitution = Substitution.fromInterfaceType(types.hierarchy
-          .getKernelTypeAsInstanceOf(
-              cls.thisType, interfaceMember.enclosingClass));
-    }
-    if (declaredFunction?.typeParameters?.length !=
-        interfaceFunction?.typeParameters?.length) {
-      library.addProblem(
-          templateOverrideTypeVariablesMismatch.withArguments(
-              "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
-          declaredMember.fileOffset,
-          noLength,
-          declaredMember.fileUri,
-          context: [
-                templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
-                    .withLocation(_getMemberUri(interfaceMember),
-                        interfaceMember.fileOffset, noLength)
-              ] +
-              inheritedContext(isInterfaceCheck, declaredMember));
-    } else if (!library.loader.target.backendTarget.legacyMode &&
-        declaredFunction?.typeParameters != null) {
-      Map<TypeParameter, DartType> substitutionMap =
-          <TypeParameter, DartType>{};
-      for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
-        substitutionMap[interfaceFunction.typeParameters[i]] =
-            new TypeParameterType(declaredFunction.typeParameters[i]);
-      }
-      Substitution substitution = Substitution.fromMap(substitutionMap);
-      for (int i = 0; i < declaredFunction.typeParameters.length; ++i) {
-        TypeParameter declaredParameter = declaredFunction.typeParameters[i];
-        TypeParameter interfaceParameter = interfaceFunction.typeParameters[i];
-        if (!interfaceParameter.isGenericCovariantImpl) {
-          DartType declaredBound = declaredParameter.bound;
-          DartType interfaceBound = interfaceParameter.bound;
-          if (interfaceSubstitution != null) {
-            declaredBound = interfaceSubstitution.substituteType(declaredBound);
-            interfaceBound =
-                interfaceSubstitution.substituteType(interfaceBound);
-          }
-          if (declaredBound != substitution.substituteType(interfaceBound)) {
-            library.addProblem(
-                templateOverrideTypeVariablesMismatch.withArguments(
-                    "${declaredMember.enclosingClass.name}."
-                        "${declaredMember.name.name}",
-                    "${interfaceMember.enclosingClass.name}."
-                        "${interfaceMember.name.name}"),
-                declaredMember.fileOffset,
-                noLength,
-                declaredMember.fileUri,
-                context: [
-                      templateOverriddenMethodCause
-                          .withArguments(interfaceMember.name.name)
-                          .withLocation(_getMemberUri(interfaceMember),
-                              interfaceMember.fileOffset, noLength)
-                    ] +
-                    inheritedContext(isInterfaceCheck, declaredMember));
-          }
-        }
-      }
-      interfaceSubstitution =
-          Substitution.combine(interfaceSubstitution, substitution);
-    }
-    return interfaceSubstitution;
-  }
-
-  Substitution _computeDeclaredSubstitution(
-      Types types, Member declaredMember) {
-    Substitution declaredSubstitution = Substitution.empty;
-    if (declaredMember.enclosingClass.typeParameters.isNotEmpty) {
-      declaredSubstitution = Substitution.fromInterfaceType(types.hierarchy
-          .getKernelTypeAsInstanceOf(
-              cls.thisType, declaredMember.enclosingClass));
-    }
-    return declaredSubstitution;
-  }
-
-  void _checkTypes(
-      Types types,
-      Substitution interfaceSubstitution,
-      Substitution declaredSubstitution,
-      Member declaredMember,
-      Member interfaceMember,
-      DartType declaredType,
-      DartType interfaceType,
-      bool isCovariant,
-      VariableDeclaration declaredParameter,
-      bool isInterfaceCheck,
-      {bool asIfDeclaredParameter = false}) {
-    if (library.loader.target.backendTarget.legacyMode) return;
-
-    if (interfaceSubstitution != null) {
-      interfaceType = interfaceSubstitution.substituteType(interfaceType);
-    }
-    if (declaredSubstitution != null) {
-      declaredType = declaredSubstitution.substituteType(declaredType);
-    }
-
-    bool inParameter = declaredParameter != null || asIfDeclaredParameter;
-    DartType subtype = inParameter ? interfaceType : declaredType;
-    DartType supertype = inParameter ? declaredType : interfaceType;
-
-    if (types.isSubtypeOfKernel(subtype, supertype)) {
-      // No problem--the proper subtyping relation is satisfied.
-    } else if (isCovariant && types.isSubtypeOfKernel(supertype, subtype)) {
-      // No problem--the overriding parameter is marked "covariant" and has
-      // a type which is a subtype of the parameter it overrides.
-    } else if (subtype is InvalidType || supertype is InvalidType) {
-      // Don't report a problem as something else is wrong that has already
-      // been reported.
-    } else {
-      // Report an error.
-      String declaredMemberName =
-          '${declaredMember.enclosingClass.name}.${declaredMember.name.name}';
-      String interfaceMemberName =
-          '${interfaceMember.enclosingClass.name}.${interfaceMember.name.name}';
-      Message message;
-      int fileOffset;
-      if (declaredParameter == null) {
-        message = templateOverrideTypeMismatchReturnType.withArguments(
-            declaredMemberName,
-            declaredType,
-            interfaceType,
-            interfaceMemberName);
-        fileOffset = declaredMember.fileOffset;
-      } else {
-        message = templateOverrideTypeMismatchParameter.withArguments(
-            declaredParameter.name,
-            declaredMemberName,
-            declaredType,
-            interfaceType,
-            interfaceMemberName);
-        fileOffset = declaredParameter.fileOffset;
-      }
-      library.addProblem(message, fileOffset, noLength, declaredMember.fileUri,
-          context: [
-                templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
-                    .withLocation(_getMemberUri(interfaceMember),
-                        interfaceMember.fileOffset, noLength)
-              ] +
-              inheritedContext(isInterfaceCheck, declaredMember));
-    }
-  }
-
-  /// Returns whether a covariant parameter was seen and more methods thus have
-  /// to be checked.
-  bool checkMethodOverride(Types types, Procedure declaredMember,
-      Procedure interfaceMember, bool isInterfaceCheck) {
-    assert(declaredMember.kind == ProcedureKind.Method);
-    assert(interfaceMember.kind == ProcedureKind.Method);
-    bool seenCovariant = false;
-    FunctionNode declaredFunction = declaredMember.function;
-    FunctionNode interfaceFunction = interfaceMember.function;
-
-    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        types,
-        declaredMember,
-        interfaceMember,
-        declaredFunction,
-        interfaceFunction,
-        isInterfaceCheck);
-
-    Substitution declaredSubstitution =
-        _computeDeclaredSubstitution(types, declaredMember);
-
-    _checkTypes(
-        types,
-        interfaceSubstitution,
-        declaredSubstitution,
-        declaredMember,
-        interfaceMember,
-        declaredFunction.returnType,
-        interfaceFunction.returnType,
-        false,
-        null,
-        isInterfaceCheck);
-    if (declaredFunction.positionalParameters.length <
-        interfaceFunction.positionalParameters.length) {
-      library.addProblem(
-          templateOverrideFewerPositionalArguments.withArguments(
-              "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
-          declaredMember.fileOffset,
-          noLength,
-          declaredMember.fileUri,
-          context: [
-                templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
-                    .withLocation(interfaceMember.fileUri,
-                        interfaceMember.fileOffset, noLength)
-              ] +
-              inheritedContext(isInterfaceCheck, declaredMember));
-    }
-    if (interfaceFunction.requiredParameterCount <
-        declaredFunction.requiredParameterCount) {
-      library.addProblem(
-          templateOverrideMoreRequiredArguments.withArguments(
-              "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
-          declaredMember.fileOffset,
-          noLength,
-          declaredMember.fileUri,
-          context: [
-                templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
-                    .withLocation(interfaceMember.fileUri,
-                        interfaceMember.fileOffset, noLength)
-              ] +
-              inheritedContext(isInterfaceCheck, declaredMember));
-    }
-    for (int i = 0;
-        i < declaredFunction.positionalParameters.length &&
-            i < interfaceFunction.positionalParameters.length;
-        i++) {
-      var declaredParameter = declaredFunction.positionalParameters[i];
-      var interfaceParameter = interfaceFunction.positionalParameters[i];
-      _checkTypes(
-          types,
-          interfaceSubstitution,
-          declaredSubstitution,
-          declaredMember,
-          interfaceMember,
-          declaredParameter.type,
-          interfaceFunction.positionalParameters[i].type,
-          declaredParameter.isCovariant || interfaceParameter.isCovariant,
-          declaredParameter,
-          isInterfaceCheck);
-      if (declaredParameter.isCovariant) seenCovariant = true;
-    }
-    if (declaredFunction.namedParameters.isEmpty &&
-        interfaceFunction.namedParameters.isEmpty) {
-      return seenCovariant;
-    }
-    if (declaredFunction.namedParameters.length <
-        interfaceFunction.namedParameters.length) {
-      library.addProblem(
-          templateOverrideFewerNamedArguments.withArguments(
-              "${declaredMember.enclosingClass.name}."
-                  "${declaredMember.name.name}",
-              "${interfaceMember.enclosingClass.name}."
-                  "${interfaceMember.name.name}"),
-          declaredMember.fileOffset,
-          noLength,
-          declaredMember.fileUri,
-          context: [
-                templateOverriddenMethodCause
-                    .withArguments(interfaceMember.name.name)
-                    .withLocation(interfaceMember.fileUri,
-                        interfaceMember.fileOffset, noLength)
-              ] +
-              inheritedContext(isInterfaceCheck, declaredMember));
-    }
-    int compareNamedParameters(VariableDeclaration p0, VariableDeclaration p1) {
-      return p0.name.compareTo(p1.name);
-    }
-
-    List<VariableDeclaration> sortedFromDeclared =
-        new List.from(declaredFunction.namedParameters)
-          ..sort(compareNamedParameters);
-    List<VariableDeclaration> sortedFromInterface =
-        new List.from(interfaceFunction.namedParameters)
-          ..sort(compareNamedParameters);
-    Iterator<VariableDeclaration> declaredNamedParameters =
-        sortedFromDeclared.iterator;
-    Iterator<VariableDeclaration> interfaceNamedParameters =
-        sortedFromInterface.iterator;
-    outer:
-    while (declaredNamedParameters.moveNext() &&
-        interfaceNamedParameters.moveNext()) {
-      while (declaredNamedParameters.current.name !=
-          interfaceNamedParameters.current.name) {
-        if (!declaredNamedParameters.moveNext()) {
-          library.addProblem(
-              templateOverrideMismatchNamedParameter.withArguments(
-                  "${declaredMember.enclosingClass.name}."
-                      "${declaredMember.name.name}",
-                  interfaceNamedParameters.current.name,
-                  "${interfaceMember.enclosingClass.name}."
-                      "${interfaceMember.name.name}"),
-              declaredMember.fileOffset,
-              noLength,
-              declaredMember.fileUri,
-              context: [
-                    templateOverriddenMethodCause
-                        .withArguments(interfaceMember.name.name)
-                        .withLocation(interfaceMember.fileUri,
-                            interfaceMember.fileOffset, noLength)
-                  ] +
-                  inheritedContext(isInterfaceCheck, declaredMember));
-          break outer;
-        }
-      }
-      var declaredParameter = declaredNamedParameters.current;
-      _checkTypes(
-          types,
-          interfaceSubstitution,
-          declaredSubstitution,
-          declaredMember,
-          interfaceMember,
-          declaredParameter.type,
-          interfaceNamedParameters.current.type,
-          declaredParameter.isCovariant,
-          declaredParameter,
-          isInterfaceCheck);
-      if (declaredParameter.isCovariant) seenCovariant = true;
-    }
-    return seenCovariant;
-  }
-
-  void checkGetterOverride(Types types, Member declaredMember,
-      Member interfaceMember, bool isInterfaceCheck) {
-    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
-    Substitution declaredSubstitution =
-        _computeDeclaredSubstitution(types, declaredMember);
-    var declaredType = declaredMember.getterType;
-    var interfaceType = interfaceMember.getterType;
-    _checkTypes(
-        types,
-        interfaceSubstitution,
-        declaredSubstitution,
-        declaredMember,
-        interfaceMember,
-        declaredType,
-        interfaceType,
-        false,
-        null,
-        isInterfaceCheck);
-  }
-
-  /// Returns whether a covariant parameter was seen and more methods thus have
-  /// to be checked.
-  bool checkSetterOverride(Types types, Member declaredMember,
-      Member interfaceMember, bool isInterfaceCheck) {
-    Substitution interfaceSubstitution = _computeInterfaceSubstitution(
-        types, declaredMember, interfaceMember, null, null, isInterfaceCheck);
-    Substitution declaredSubstitution =
-        _computeDeclaredSubstitution(types, declaredMember);
-    var declaredType = declaredMember.setterType;
-    var interfaceType = interfaceMember.setterType;
-    var declaredParameter =
-        declaredMember.function?.positionalParameters?.elementAt(0);
-    bool isCovariant = declaredParameter?.isCovariant ?? false;
-    if (!isCovariant && declaredMember is Field) {
-      isCovariant = declaredMember.isCovariant;
-    }
-    if (!isCovariant && interfaceMember is Field) {
-      isCovariant = interfaceMember.isCovariant;
-    }
-    _checkTypes(
-        types,
-        interfaceSubstitution,
-        declaredSubstitution,
-        declaredMember,
-        interfaceMember,
-        declaredType,
-        interfaceType,
-        isCovariant,
-        declaredParameter,
-        isInterfaceCheck,
-        asIfDeclaredParameter: true);
-    return isCovariant;
-  }
-
-  // Extra context on override messages when the overriding member is inherited
-  List<LocatedMessage> inheritedContext(
-      bool isInterfaceCheck, Member declaredMember) {
-    if (declaredMember.enclosingClass == cls) {
-      // Ordinary override
-      return const [];
-    }
-    if (isInterfaceCheck) {
-      // Interface check
-      return [
-        templateInterfaceCheckContext
-            .withArguments(cls.name)
-            .withLocation(cls.fileUri, cls.fileOffset, cls.name.length)
-      ];
-    } else {
-      if (cls.isAnonymousMixin) {
-        // Implicit mixin application class
-        String baseName = cls.superclass.demangledName;
-        String mixinName = cls.mixedInClass.name;
-        int classNameLength = cls.nameAsMixinApplicationSubclass.length;
-        return [
-          templateImplicitMixinOverrideContext
-              .withArguments(mixinName, baseName)
-              .withLocation(cls.fileUri, cls.fileOffset, classNameLength)
-        ];
-      } else {
-        // Named mixin application class
-        return [
-          templateNamedMixinOverrideContext
-              .withArguments(cls.name)
-              .withLocation(cls.fileUri, cls.fileOffset, cls.name.length)
-        ];
-      }
-    }
-  }
-
-  String get fullNameForErrors {
-    return isMixinApplication && !isNamedMixinApplication
-        ? "${supertype.fullNameForErrors} with ${mixedInType.fullNameForErrors}"
-        : name;
-  }
-
-  void checkMixinDeclaration() {
-    assert(cls.isMixinDeclaration);
-    for (Declaration constructory in constructors.local.values) {
-      if (!constructory.isSynthetic &&
-          (constructory.isFactory || constructory.isConstructor)) {
-        addProblem(
-            templateIllegalMixinDueToConstructors
-                .withArguments(fullNameForErrors),
-            charOffset,
-            noLength,
-            context: [
-              templateIllegalMixinDueToConstructorsCause
-                  .withArguments(fullNameForErrors)
-                  .withLocation(
-                      constructory.fileUri, constructory.charOffset, noLength)
-            ]);
-      }
-    }
-  }
-
-  void checkMixinApplication(ClassHierarchy hierarchy) {
-    // A mixin declaration can only be applied to a class that implements all
-    // the declaration's superclass constraints.
-    InterfaceType supertype = cls.supertype.asInterfaceType;
-    Substitution substitution = Substitution.fromSupertype(cls.mixedInType);
-    for (Supertype constraint in cls.mixedInClass.superclassConstraints()) {
-      InterfaceType interface =
-          substitution.substituteSupertype(constraint).asInterfaceType;
-      if (hierarchy.getTypeAsInstanceOf(supertype, interface.classNode) !=
-          interface) {
-        library.addProblem(
-            templateMixinApplicationIncompatibleSupertype.withArguments(
-                supertype, interface, cls.mixedInType.asInterfaceType),
-            cls.fileOffset,
-            noLength,
-            cls.fileUri);
-      }
-    }
-  }
-
-  @override
-  void applyPatch(Declaration patch) {
-    if (patch is KernelClassBuilder) {
-      patch.actualOrigin = this;
-      // TODO(ahe): Complain if `patch.supertype` isn't null.
-      scope.local.forEach((String name, Declaration member) {
-        Declaration memberPatch = patch.scope.local[name];
-        if (memberPatch != null) {
-          member.applyPatch(memberPatch);
-        }
-      });
-      scope.setters.forEach((String name, Declaration member) {
-        Declaration memberPatch = patch.scope.setters[name];
-        if (memberPatch != null) {
-          member.applyPatch(memberPatch);
-        }
-      });
-      constructors.local.forEach((String name, Declaration member) {
-        Declaration memberPatch = patch.constructors.local[name];
-        if (memberPatch != null) {
-          member.applyPatch(memberPatch);
-        }
-      });
-
-      int originLength = typeVariables?.length ?? 0;
-      int patchLength = patch.typeVariables?.length ?? 0;
-      if (originLength != patchLength) {
-        patch.addProblem(messagePatchClassTypeVariablesMismatch,
-            patch.charOffset, noLength, context: [
-          messagePatchClassOrigin.withLocation(fileUri, charOffset, noLength)
-        ]);
-      } else if (typeVariables != null) {
-        int count = 0;
-        for (KernelTypeVariableBuilder t in patch.typeVariables) {
-          typeVariables[count++].applyPatch(t);
-        }
-      }
-    } else {
-      library.addProblem(messagePatchDeclarationMismatch, patch.charOffset,
-          noLength, patch.fileUri, context: [
-        messagePatchDeclarationOrigin.withLocation(
-            fileUri, charOffset, noLength)
-      ]);
-    }
-  }
-
-  @override
-  Declaration findStaticBuilder(
-      String name, int charOffset, Uri fileUri, LibraryBuilder accessingLibrary,
-      {bool isSetter: false}) {
-    Declaration declaration = super.findStaticBuilder(
-        name, charOffset, fileUri, accessingLibrary,
-        isSetter: isSetter);
-    if (declaration == null && isPatch) {
-      return origin.findStaticBuilder(
-          name, charOffset, fileUri, accessingLibrary,
-          isSetter: isSetter);
-    }
-    return declaration;
-  }
-
-  @override
-  Declaration findConstructorOrFactory(
-      String name, int charOffset, Uri uri, LibraryBuilder accessingLibrary) {
-    Declaration declaration =
-        super.findConstructorOrFactory(name, charOffset, uri, accessingLibrary);
-    if (declaration == null && isPatch) {
-      return origin.findConstructorOrFactory(
-          name, charOffset, uri, accessingLibrary);
-    }
-    return declaration;
-  }
-
-  // Computes the function type of a given redirection target. Returns [null] if
-  // the type of the target could not be computed.
-  FunctionType computeRedirecteeType(KernelRedirectingFactoryBuilder factory,
-      TypeEnvironment typeEnvironment) {
-    ConstructorReferenceBuilder redirectionTarget = factory.redirectionTarget;
-    FunctionNode target;
-    if (redirectionTarget.target == null) return null;
-    if (redirectionTarget.target is KernelFunctionBuilder) {
-      KernelFunctionBuilder targetBuilder = redirectionTarget.target;
-      target = targetBuilder.function;
-    } else if (redirectionTarget.target is DillMemberBuilder &&
-        (redirectionTarget.target.isConstructor ||
-            redirectionTarget.target.isFactory)) {
-      DillMemberBuilder targetBuilder = redirectionTarget.target;
-      // It seems that the [redirectionTarget.target] is an instance of
-      // [DillMemberBuilder] whenever the redirectee is an implicit constructor,
-      // e.g.
-      //
-      //   class A {
-      //     factory A() = B;
-      //   }
-      //   class B implements A {}
-      //
-      target = targetBuilder.member.function;
-    } else if (redirectionTarget.target is AmbiguousBuilder) {
-      // Multiple definitions with the same name: An error has already been
-      // issued.
-      // TODO(http://dartbug.com/35294): Unfortunate error; see also
-      // https://dart-review.googlesource.com/c/sdk/+/85390/.
-      return null;
-    } else {
-      unhandled("${redirectionTarget.target}", "computeRedirecteeType",
-          charOffset, fileUri);
-    }
-
-    List<DartType> typeArguments =
-        getRedirectingFactoryBody(factory.target).typeArguments;
-    FunctionType targetFunctionType = target.functionType;
-    if (typeArguments != null &&
-        targetFunctionType.typeParameters.length != typeArguments.length) {
-      addProblem(
-          templateTypeArgumentMismatch
-              .withArguments(targetFunctionType.typeParameters.length),
-          redirectionTarget.charOffset,
-          noLength);
-      return null;
-    }
-
-    // Compute the substitution of the target class type parameters if
-    // [redirectionTarget] has any type arguments.
-    Substitution substitution;
-    bool hasProblem = false;
-    if (typeArguments != null && typeArguments.length > 0) {
-      substitution = Substitution.fromPairs(
-          targetFunctionType.typeParameters, typeArguments);
-      for (int i = 0; i < targetFunctionType.typeParameters.length; i++) {
-        TypeParameter typeParameter = targetFunctionType.typeParameters[i];
-        DartType typeParameterBound =
-            substitution.substituteType(typeParameter.bound);
-        DartType typeArgument = typeArguments[i];
-        // Check whether the [typeArgument] respects the bounds of [typeParameter].
-        if (!typeEnvironment.isSubtypeOf(typeArgument, typeParameterBound)) {
-          addProblem(
-              templateRedirectingFactoryIncompatibleTypeArgument.withArguments(
-                  typeArgument, typeParameterBound),
-              redirectionTarget.charOffset,
-              noLength);
-          hasProblem = true;
-        }
-      }
-    } else if (typeArguments == null &&
-        targetFunctionType.typeParameters.length > 0) {
-      // TODO(hillerstrom): In this case, we need to perform type inference on
-      // the redirectee to obtain actual type arguments which would allow the
-      // following program to type check:
-      //
-      //    class A<T> {
-      //       factory A() = B;
-      //    }
-      //    class B<T> implements A<T> {
-      //       B();
-      //    }
-      //
-      return null;
-    }
-
-    // Substitute if necessary.
-    targetFunctionType = substitution == null
-        ? targetFunctionType
-        : (substitution.substituteType(targetFunctionType.withoutTypeParameters)
-            as FunctionType);
-
-    return hasProblem ? null : targetFunctionType;
-  }
-
-  String computeRedirecteeName(ConstructorReferenceBuilder redirectionTarget) {
-    String targetName = redirectionTarget.fullNameForErrors;
-    if (targetName == "") {
-      return redirectionTarget.target.parent.fullNameForErrors;
-    } else {
-      return targetName;
-    }
-  }
-
-  void checkRedirectingFactory(KernelRedirectingFactoryBuilder factory,
-      TypeEnvironment typeEnvironment) {
-    // The factory type cannot contain any type parameters other than those of
-    // its enclosing class, because constructors cannot specify type parameters
-    // of their own.
-    FunctionType factoryType =
-        factory.procedure.function.functionType.withoutTypeParameters;
-    FunctionType redirecteeType =
-        computeRedirecteeType(factory, typeEnvironment);
-
-    // TODO(hillerstrom): It would be preferable to know whether a failure
-    // happened during [_computeRedirecteeType].
-    if (redirecteeType == null) return;
-
-    // Check whether [redirecteeType] <: [factoryType].
-    if (!typeEnvironment.isSubtypeOf(redirecteeType, factoryType)) {
-      addProblem(
-          templateIncompatibleRedirecteeFunctionType.withArguments(
-              redirecteeType, factoryType),
-          factory.redirectionTarget.charOffset,
-          noLength);
-    }
-  }
-
-  void checkRedirectingFactories(TypeEnvironment typeEnvironment) {
-    Map<String, MemberBuilder> constructors = this.constructors.local;
-    Iterable<String> names = constructors.keys;
-    for (String name in names) {
-      Declaration constructor = constructors[name];
-      do {
-        if (constructor is KernelRedirectingFactoryBuilder) {
-          checkRedirectingFactory(constructor, typeEnvironment);
-        }
-        constructor = constructor.next;
-      } while (constructor != null);
-    }
-  }
-
-  /// Returns a map which maps the type variables of [superclass] to their
-  /// respective values as defined by the superclass clause of this class (and
-  /// its superclasses).
-  ///
-  /// It's assumed that [superclass] is a superclass of this class.
-  ///
-  /// For example, given:
-  ///
-  ///     class Box<T> {}
-  ///     class BeatBox extends Box<Beat> {}
-  ///     class Beat {}
-  ///
-  /// We have:
-  ///
-  ///     [[BeatBox]].getSubstitutionMap([[Box]]) -> {[[Box::T]]: Beat]]}.
-  ///
-  /// It's an error if [superclass] isn't a superclass.
-  Map<TypeParameter, DartType> getSubstitutionMap(Class superclass) {
-    Supertype supertype = target.supertype;
-    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
-    List<DartType> arguments;
-    List<TypeParameter> variables;
-    Class classNode;
-
-    while (classNode != superclass) {
-      classNode = supertype.classNode;
-      arguments = supertype.typeArguments;
-      variables = classNode.typeParameters;
-      supertype = classNode.supertype;
-      if (variables.isNotEmpty) {
-        Map<TypeParameter, DartType> directSubstitutionMap =
-            <TypeParameter, DartType>{};
-        for (int i = 0; i < variables.length; i++) {
-          DartType argument =
-              i < arguments.length ? arguments[i] : const DynamicType();
-          if (substitutionMap != null) {
-            // TODO(ahe): Investigate if requiring the caller to use
-            // `substituteDeep` from `package:kernel/type_algebra.dart` instead
-            // of `substitute` is faster. If so, we can simply this code.
-            argument = substitute(argument, substitutionMap);
-          }
-          directSubstitutionMap[variables[i]] = argument;
-        }
-        substitutionMap = directSubstitutionMap;
-      }
-    }
-
-    return substitutionMap;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
index 5f8b4f5..61f54880 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_constants.dart
@@ -4,7 +4,7 @@
 
 library fasta.kernel_constants;
 
-import 'package:kernel/ast.dart' show InvalidExpression, Library;
+import 'package:kernel/ast.dart' show InvalidExpression;
 
 import '../fasta_codes.dart' show LocatedMessage;
 
@@ -13,7 +13,7 @@
 import 'constant_evaluator.dart' show ErrorReporter;
 
 class KernelConstantErrorReporter extends ErrorReporter {
-  final Loader<Library> loader;
+  final Loader loader;
 
   KernelConstantErrorReporter(this.loader);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
deleted file mode 100644
index 8ee7d22..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_enum_builder.dart
+++ /dev/null
@@ -1,355 +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.
-
-library fasta.kernel_enum_builder;
-
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        Class,
-        Constructor,
-        ConstructorInvocation,
-        DirectPropertyGet,
-        Expression,
-        Field,
-        FieldInitializer,
-        IntLiteral,
-        InterfaceType,
-        ListLiteral,
-        ProcedureKind,
-        ReturnStatement,
-        StaticGet,
-        StringLiteral,
-        SuperInitializer,
-        ThisExpression,
-        VariableGet;
-
-import '../fasta_codes.dart'
-    show
-        LocatedMessage,
-        messageNoUnnamedConstructorInObject,
-        templateDuplicatedDeclaration,
-        templateDuplicatedDeclarationCause,
-        templateDuplicatedDeclarationSyntheticCause,
-        templateEnumConstantSameNameAsEnclosing;
-
-import '../modifier.dart'
-    show
-        constMask,
-        finalMask,
-        hasInitializerMask,
-        initializingFormalMask,
-        staticMask;
-
-import '../source/source_class_builder.dart' show SourceClassBuilder;
-
-import 'kernel_builder.dart'
-    show
-        Declaration,
-        EnumBuilder,
-        EnumConstantInfo,
-        FormalParameterBuilder,
-        KernelClassBuilder,
-        KernelConstructorBuilder,
-        KernelFieldBuilder,
-        KernelFormalParameterBuilder,
-        KernelLibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelProcedureBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        MemberBuilder,
-        MetadataBuilder,
-        Scope;
-
-import 'metadata_collector.dart';
-
-class KernelEnumBuilder extends SourceClassBuilder
-    implements EnumBuilder<KernelTypeBuilder, InterfaceType> {
-  @override
-  final List<EnumConstantInfo> enumConstantInfos;
-
-  final KernelNamedTypeBuilder intType;
-
-  final KernelNamedTypeBuilder stringType;
-
-  final KernelNamedTypeBuilder objectType;
-
-  final KernelNamedTypeBuilder listType;
-
-  KernelEnumBuilder.internal(
-      List<MetadataBuilder> metadata,
-      String name,
-      Scope scope,
-      Scope constructors,
-      Class cls,
-      this.enumConstantInfos,
-      this.intType,
-      this.listType,
-      this.objectType,
-      this.stringType,
-      LibraryBuilder parent,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset)
-      : super(metadata, 0, name, null, null, null, scope, constructors, parent,
-            null, startCharOffset, charOffset, charEndOffset,
-            cls: cls);
-
-  factory KernelEnumBuilder(
-      MetadataCollector metadataCollector,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<EnumConstantInfo> enumConstantInfos,
-      KernelLibraryBuilder parent,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset) {
-    assert(enumConstantInfos == null || enumConstantInfos.isNotEmpty);
-    // TODO(ahe): These types shouldn't be looked up in scope, they come
-    // directly from dart:core.
-    KernelTypeBuilder intType = new KernelNamedTypeBuilder("int", null);
-    KernelTypeBuilder stringType = new KernelNamedTypeBuilder("String", null);
-    KernelNamedTypeBuilder objectType =
-        new KernelNamedTypeBuilder("Object", null);
-    Class cls = new Class(name: name);
-    Map<String, MemberBuilder> members = <String, MemberBuilder>{};
-    Map<String, MemberBuilder> constructors = <String, MemberBuilder>{};
-    KernelNamedTypeBuilder selfType = new KernelNamedTypeBuilder(name, null);
-    KernelTypeBuilder listType =
-        new KernelNamedTypeBuilder("List", <KernelTypeBuilder>[selfType]);
-
-    /// metadata class E {
-    ///   final int index;
-    ///   final String _name;
-    ///   const E(this.index, this._name);
-    ///   static const E id0 = const E(0, 'E.id0');
-    ///   ...
-    ///   static const E idn-1 = const E(n - 1, 'E.idn-1');
-    ///   static const List<E> values = const <E>[id0, ..., idn-1];
-    ///   String toString() => _name;
-    /// }
-
-    members["index"] = new KernelFieldBuilder(null, intType, "index",
-        finalMask | hasInitializerMask, parent, charOffset, charOffset);
-    members["_name"] = new KernelFieldBuilder(null, stringType, "_name",
-        finalMask | hasInitializerMask, parent, charOffset, charOffset);
-    KernelConstructorBuilder constructorBuilder = new KernelConstructorBuilder(
-        null,
-        constMask,
-        null,
-        "",
-        null,
-        <FormalParameterBuilder>[
-          new KernelFormalParameterBuilder(null, initializingFormalMask,
-              intType, "index", parent, charOffset),
-          new KernelFormalParameterBuilder(null, initializingFormalMask,
-              stringType, "_name", parent, charOffset)
-        ],
-        parent,
-        charOffset,
-        charOffset,
-        charOffset,
-        charEndOffset);
-    constructors[""] = constructorBuilder;
-    KernelFieldBuilder valuesBuilder = new KernelFieldBuilder(
-        null,
-        listType,
-        "values",
-        constMask | staticMask | hasInitializerMask,
-        parent,
-        charOffset,
-        charOffset);
-    members["values"] = valuesBuilder;
-    KernelProcedureBuilder toStringBuilder = new KernelProcedureBuilder(
-        null,
-        0,
-        stringType,
-        "toString",
-        null,
-        null,
-        ProcedureKind.Method,
-        parent,
-        charOffset,
-        charOffset,
-        charOffset,
-        charEndOffset);
-    members["toString"] = toStringBuilder;
-    String className = name;
-    if (enumConstantInfos != null) {
-      for (int i = 0; i < enumConstantInfos.length; i++) {
-        EnumConstantInfo enumConstantInfo = enumConstantInfos[i];
-        List<MetadataBuilder> metadata = enumConstantInfo.metadata;
-        String name = enumConstantInfo.name;
-        String documentationComment = enumConstantInfo.documentationComment;
-        MemberBuilder existing = members[name];
-        if (existing != null) {
-          // The existing declaration is synthetic if it has the same
-          // charOffset as the enclosing enum.
-          bool isSynthetic = existing.charOffset == charOffset;
-          List<LocatedMessage> context = isSynthetic
-              ? <LocatedMessage>[
-                  templateDuplicatedDeclarationSyntheticCause
-                      .withArguments(name)
-                      .withLocation(
-                          parent.fileUri, charOffset, className.length)
-                ]
-              : <LocatedMessage>[
-                  templateDuplicatedDeclarationCause
-                      .withArguments(name)
-                      .withLocation(
-                          parent.fileUri, existing.charOffset, name.length)
-                ];
-          parent.addProblem(templateDuplicatedDeclaration.withArguments(name),
-              enumConstantInfo.charOffset, name.length, parent.fileUri,
-              context: context);
-          enumConstantInfos[i] = null;
-        } else if (name == className) {
-          parent.addProblem(
-              templateEnumConstantSameNameAsEnclosing.withArguments(name),
-              enumConstantInfo.charOffset,
-              name.length,
-              parent.fileUri);
-        }
-        KernelFieldBuilder fieldBuilder = new KernelFieldBuilder(
-            metadata,
-            selfType,
-            name,
-            constMask | staticMask | hasInitializerMask,
-            parent,
-            enumConstantInfo.charOffset,
-            enumConstantInfo.charOffset);
-        metadataCollector?.setDocumentationComment(
-            fieldBuilder.target, documentationComment);
-        members[name] = fieldBuilder..next = existing;
-      }
-    }
-    final int startCharOffsetComputed =
-        metadata == null ? startCharOffset : metadata.first.charOffset;
-    KernelEnumBuilder enumBuilder = new KernelEnumBuilder.internal(
-        metadata,
-        name,
-        new Scope(members, null, parent.scope, "enum $name",
-            isModifiable: false),
-        new Scope(constructors, null, null, name, isModifiable: false),
-        cls,
-        enumConstantInfos,
-        intType,
-        listType,
-        objectType,
-        stringType,
-        parent,
-        startCharOffsetComputed,
-        charOffset,
-        charEndOffset);
-    void setParent(String name, MemberBuilder builder) {
-      do {
-        builder.parent = enumBuilder;
-        builder = builder.next;
-      } while (builder != null);
-    }
-
-    members.forEach(setParent);
-    constructors.forEach(setParent);
-    selfType.bind(enumBuilder);
-    return enumBuilder;
-  }
-
-  KernelTypeBuilder get mixedInType => null;
-
-  InterfaceType buildType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    return cls.rawType;
-  }
-
-  @override
-  Class build(KernelLibraryBuilder libraryBuilder, LibraryBuilder coreLibrary) {
-    cls.isEnum = true;
-    intType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
-    stringType.resolveIn(
-        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
-    objectType.resolveIn(
-        coreLibrary.scope, charOffset, fileUri, libraryBuilder);
-    listType.resolveIn(coreLibrary.scope, charOffset, fileUri, libraryBuilder);
-
-    KernelFieldBuilder indexFieldBuilder = firstMemberNamed("index");
-    Field indexField = indexFieldBuilder.build(libraryBuilder);
-    KernelFieldBuilder nameFieldBuilder = firstMemberNamed("_name");
-    Field nameField = nameFieldBuilder.build(libraryBuilder);
-    KernelProcedureBuilder toStringBuilder = firstMemberNamed("toString");
-    toStringBuilder.body = new ReturnStatement(
-        new DirectPropertyGet(new ThisExpression(), nameField));
-    List<Expression> values = <Expression>[];
-    if (enumConstantInfos != null) {
-      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
-        if (enumConstantInfo != null) {
-          Declaration declaration = firstMemberNamed(enumConstantInfo.name);
-          if (declaration.isField) {
-            KernelFieldBuilder field = declaration;
-            values.add(new StaticGet(field.build(libraryBuilder)));
-          }
-        }
-      }
-    }
-    KernelFieldBuilder valuesBuilder = firstMemberNamed("values");
-    valuesBuilder.build(libraryBuilder);
-    valuesBuilder.initializer =
-        new ListLiteral(values, typeArgument: cls.rawType, isConst: true);
-    KernelConstructorBuilder constructorBuilder = constructorScopeBuilder[""];
-    Constructor constructor = constructorBuilder.build(libraryBuilder);
-    constructor.initializers.insert(
-        0,
-        new FieldInitializer(indexField,
-            new VariableGet(constructor.function.positionalParameters[0]))
-          ..parent = constructor);
-    constructor.initializers.insert(
-        1,
-        new FieldInitializer(nameField,
-            new VariableGet(constructor.function.positionalParameters[1]))
-          ..parent = constructor);
-    KernelClassBuilder objectClass = objectType.declaration;
-    MemberBuilder superConstructor = objectClass.findConstructorOrFactory(
-        "", charOffset, fileUri, libraryBuilder);
-    if (superConstructor == null || !superConstructor.isConstructor) {
-      // TODO(ahe): Ideally, we would also want to check that [Object]'s
-      // unnamed constructor requires no arguments. But that information isn't
-      // always available at this point, and it's not really a situation that
-      // can happen unless you start modifying the SDK sources.
-      library.addProblem(messageNoUnnamedConstructorInObject,
-          objectClass.charOffset, objectClass.name.length, objectClass.fileUri);
-    } else {
-      constructor.initializers.add(
-          new SuperInitializer(superConstructor.target, new Arguments.empty())
-            ..parent = constructor);
-    }
-    int index = 0;
-    if (enumConstantInfos != null) {
-      for (EnumConstantInfo enumConstantInfo in enumConstantInfos) {
-        if (enumConstantInfo != null) {
-          String constant = enumConstantInfo.name;
-          Declaration declaration = firstMemberNamed(constant);
-          KernelFieldBuilder field;
-          if (declaration.isField) {
-            field = declaration;
-          } else {
-            continue;
-          }
-          Arguments arguments = new Arguments(<Expression>[
-            new IntLiteral(index++),
-            new StringLiteral("$name.$constant")
-          ]);
-          field.initializer =
-              new ConstructorInvocation(constructor, arguments, isConst: true);
-        }
-      }
-    }
-    return super.build(libraryBuilder, coreLibrary);
-  }
-
-  @override
-  Declaration findConstructorOrFactory(
-      String name, int charOffset, Uri uri, LibraryBuilder library) {
-    return null;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
deleted file mode 100644
index 212281c..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator.dart
+++ /dev/null
@@ -1,1621 +0,0 @@
-// Copyright (c) 2018, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'package:kernel/ast.dart'
-    show Arguments, Expression, InvalidExpression, Node;
-
-import '../../scanner/token.dart' show Token;
-
-import '../constant_context.dart' show ConstantContext;
-
-import '../fasta_codes.dart'
-    show
-        LocatedMessage,
-        Message,
-        messageCannotAssignToParenthesizedExpression,
-        messageCannotAssignToSuper,
-        messageInvalidUseOfNullAwareAccess,
-        messageLoadLibraryTakesNoArguments,
-        messageNotAConstantExpression,
-        messageNotAnLvalue,
-        messageSuperAsExpression,
-        templateConstructorNotFound,
-        templateNotConstantExpression,
-        templateSuperclassHasNoConstructor,
-        templateThisOrSuperAccessInFieldInitializer;
-
-import '../messages.dart' show Message, noLength;
-
-import '../names.dart' show callName, equalsName, indexGetName, indexSetName;
-
-import '../parser.dart' show lengthForToken, offsetForToken;
-
-import '../problems.dart' show unhandled, unsupported;
-
-import '../scope.dart' show AmbiguousBuilder;
-
-import 'body_builder.dart' show noLocation;
-
-import 'constness.dart' show Constness;
-
-import 'expression_generator.dart'
-    show
-        ContextAwareGenerator,
-        DeferredAccessGenerator,
-        DelayedAssignment,
-        DelayedPostfixIncrement,
-        ErroneousExpressionGenerator,
-        ExpressionGenerator,
-        Generator,
-        IndexedAccessGenerator,
-        LoadLibraryGenerator,
-        NullAwarePropertyAccessGenerator,
-        ParserErrorGenerator,
-        PrefixUseGenerator,
-        PropertyAccessGenerator,
-        ReadOnlyAccessGenerator,
-        StaticAccessGenerator,
-        SuperIndexedAccessGenerator,
-        SuperPropertyAccessGenerator,
-        ThisIndexedAccessGenerator,
-        ThisPropertyAccessGenerator,
-        TypeUseGenerator,
-        UnexpectedQualifiedUseGenerator,
-        UnlinkedGenerator,
-        UnresolvedNameGenerator,
-        VariableUseGenerator;
-
-import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
-
-import 'forest.dart' show Forest;
-
-import 'kernel_builder.dart'
-    show
-        KernelTypeBuilder,
-        LoadLibraryBuilder,
-        PrefixBuilder,
-        UnlinkedDeclaration,
-        UnresolvedType;
-
-import 'kernel_api.dart' show NameSystem, printNodeOn, printQualifiedNameOn;
-
-import 'kernel_ast_api.dart'
-    show
-        ComplexAssignmentJudgment,
-        Constructor,
-        DartType,
-        Field,
-        Initializer,
-        Let,
-        LoadLibraryTearOffJudgment,
-        Member,
-        MethodInvocationJudgment,
-        Name,
-        NullAwarePropertyGetJudgment,
-        Procedure,
-        PropertyGet,
-        PropertySet,
-        StaticSet,
-        SuperMethodInvocation,
-        SuperMethodInvocationJudgment,
-        SuperPropertyGetJudgment,
-        SuperPropertySet,
-        TreeNode,
-        TypeParameter,
-        VariableDeclaration,
-        VariableDeclarationJudgment,
-        VariableGet,
-        VariableGetJudgment,
-        VariableSet;
-
-import 'kernel_builder.dart'
-    show
-        Declaration,
-        KernelClassBuilder,
-        KernelInvalidTypeBuilder,
-        LoadLibraryBuilder,
-        PrefixBuilder,
-        TypeDeclarationBuilder;
-
-import 'kernel_shadow_ast.dart' as shadow
-    show PropertyAssignmentJudgment, SyntheticWrapper;
-
-part 'kernel_expression_generator_impl.dart';
-
-abstract class KernelExpressionGenerator implements ExpressionGenerator {
-  ExpressionGeneratorHelper get helper;
-
-  Token get token;
-
-  Forest get forest;
-
-  String get plainNameForRead;
-
-  @override
-  Expression buildSimpleRead() {
-    return _finish(_makeSimpleRead(), null);
-  }
-
-  @override
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
-    return _finish(_makeSimpleWrite(value, voidContext, complexAssignment),
-        complexAssignment);
-  }
-
-  @override
-  Expression buildNullAwareAssignment(
-      Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    var complexAssignment = startComplexAssignment(value);
-    if (voidContext) {
-      var nullAwareCombiner = forest.conditionalExpression(
-          buildIsNull(_makeRead(complexAssignment), offset, helper),
-          null,
-          _makeWrite(value, false, complexAssignment),
-          null,
-          forest.literalNull(null)..fileOffset = offset)
-        ..fileOffset = offset;
-      complexAssignment?.nullAwareCombiner = nullAwareCombiner;
-      return _finish(nullAwareCombiner, complexAssignment);
-    }
-    var tmp = new VariableDeclaration.forValue(_makeRead(complexAssignment));
-    var nullAwareCombiner = forest.conditionalExpression(
-        buildIsNull(new VariableGet(tmp), offset, helper),
-        null,
-        _makeWrite(value, false, complexAssignment),
-        null,
-        new VariableGet(tmp))
-      ..fileOffset = offset;
-    complexAssignment?.nullAwareCombiner = nullAwareCombiner;
-    return _finish(makeLet(tmp, nullAwareCombiner), complexAssignment);
-  }
-
-  @override
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    var complexAssignment = startComplexAssignment(value);
-    complexAssignment?.isPreIncDec = isPreIncDec;
-    complexAssignment?.isPostIncDec = isPostIncDec;
-    var combiner = makeBinary(_makeRead(complexAssignment), binaryOperator,
-        interfaceTarget, value, helper,
-        offset: offset);
-    complexAssignment?.combiner = combiner;
-    return _finish(_makeWrite(combiner, voidContext, complexAssignment),
-        complexAssignment);
-  }
-
-  @override
-  Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return buildCompoundAssignment(
-        binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
-        offset: offset,
-        voidContext: voidContext,
-        interfaceTarget: interfaceTarget,
-        isPreIncDec: true);
-  }
-
-  @override
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    if (voidContext) {
-      return buildCompoundAssignment(
-          binaryOperator, forest.literalInt(1, null)..fileOffset = offset,
-          offset: offset,
-          voidContext: voidContext,
-          interfaceTarget: interfaceTarget,
-          isPostIncDec: true);
-    }
-    var rhs = forest.literalInt(1, null)..fileOffset = offset;
-    var complexAssignment = startComplexAssignment(rhs);
-    var value = new VariableDeclaration.forValue(_makeRead(complexAssignment));
-    valueAccess() => new VariableGet(value);
-    var combiner = makeBinary(
-        valueAccess(), binaryOperator, interfaceTarget, rhs, helper,
-        offset: offset);
-    complexAssignment?.combiner = combiner;
-    complexAssignment?.isPostIncDec = true;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        _makeWrite(combiner, true, complexAssignment),
-        helper.functionNestingLevel);
-    return _finish(
-        makeLet(value, makeLet(dummy, valueAccess())), complexAssignment);
-  }
-
-  @override
-  Expression makeInvalidRead() {
-    return helper.wrapSyntheticExpression(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(token),
-            plainNameForRead,
-            forest.argumentsEmpty(noLocation),
-            offsetForToken(token),
-            isGetter: true),
-        offsetForToken(token));
-  }
-
-  @override
-  Expression makeInvalidWrite(Expression value) {
-    return helper.wrapSyntheticExpression(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(token),
-            plainNameForRead,
-            forest.arguments(<Expression>[value], noLocation),
-            offsetForToken(token),
-            isSetter: true),
-        offsetForToken(token));
-  }
-
-  Expression _makeSimpleRead() => _makeRead(null);
-
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    return _makeWrite(value, voidContext, complexAssignment);
-  }
-
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    Expression read = makeInvalidRead();
-    if (complexAssignment != null) {
-      read = helper.desugarSyntheticExpression(read);
-      complexAssignment.read = read;
-    }
-    return read;
-  }
-
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    Expression write = makeInvalidWrite(value);
-    if (complexAssignment != null) {
-      write = helper.desugarSyntheticExpression(write);
-      complexAssignment.write = write;
-    }
-    return write;
-  }
-
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    if (!helper.legacyMode && complexAssignment != null) {
-      complexAssignment.desugared = body;
-      return complexAssignment;
-    } else {
-      return body;
-    }
-  }
-
-  /// Creates a data structure for tracking the desugaring of a complex
-  /// assignment expression whose right hand side is [rhs].
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapIllegalAssignment(rhs);
-}
-
-abstract class KernelGenerator = Generator with KernelExpressionGenerator;
-
-class KernelVariableUseGenerator extends KernelGenerator
-    with VariableUseGenerator {
-  final VariableDeclaration variable;
-
-  final DartType promotedType;
-
-  KernelVariableUseGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.variable, this.promotedType)
-      : super(helper, token);
-
-  @override
-  String get plainNameForRead => variable.name;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var fact = helper.typePromoter
-        ?.getFactForAccess(variable, helper.functionNestingLevel);
-    var scope = helper.typePromoter?.currentScope;
-    var read = new VariableGetJudgment(variable, fact, scope)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    helper.typePromoter?.mutateVariable(variable, helper.functionNestingLevel);
-    Expression write;
-    if (variable.isFinal || variable.isConst) {
-      write = makeInvalidWrite(value);
-      if (complexAssignment != null) {
-        write = helper.desugarSyntheticExpression(write);
-        complexAssignment.write = write;
-      }
-    } else {
-      write = new VariableSet(variable, value)
-        ..fileOffset = offsetForToken(token);
-      complexAssignment?.write = write;
-    }
-    return write;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(buildSimpleRead(), callName, arguments,
-        adjustForImplicitCall(plainNameForRead, offset),
-        isImplicitCall: true);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
-    return shadow.SyntheticWrapper.wrapVariableAssignment(rhs)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", variable: ");
-    printNodeOn(variable, sink, syntheticNames: syntheticNames);
-    sink.write(", promotedType: ");
-    printNodeOn(promotedType, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelPropertyAccessGenerator extends KernelGenerator
-    with PropertyAccessGenerator {
-  final Expression receiver;
-
-  final Name name;
-
-  final Member getter;
-
-  final Member setter;
-
-  VariableDeclaration _receiverVariable;
-
-  KernelPropertyAccessGenerator.internal(ExpressionGeneratorHelper helper,
-      Token token, this.receiver, this.name, this.getter, this.setter)
-      : super(helper, token);
-
-  @override
-  String get plainNameForRead => name.name;
-
-  receiverAccess() {
-    _receiverVariable ??= new VariableDeclaration.forValue(receiver);
-    return new VariableGet(_receiverVariable)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(receiver, name, arguments, offset);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapPropertyAssignment(receiver, rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", _receiverVariable: ");
-    printNodeOn(_receiverVariable, sink, syntheticNames: syntheticNames);
-    sink.write(", receiver: ");
-    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
-    sink.write(", name: ");
-    sink.write(name.name);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-  }
-
-  @override
-  Expression _makeSimpleRead() {
-    return new PropertyGet(receiver, name, getter)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiver, name, value, setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    return super._finish(makeLet(_receiverVariable, body), complexAssignment);
-  }
-}
-
-class KernelThisPropertyAccessGenerator extends KernelGenerator
-    with ThisPropertyAccessGenerator {
-  final Name name;
-
-  final Member getter;
-
-  final Member setter;
-
-  KernelThisPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, this.name, this.getter, this.setter)
-      : super(helper, token);
-
-  @override
-  String get plainNameForRead => name.name;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    if (getter == null) {
-      helper.warnUnresolvedGet(name, offsetForToken(token));
-    }
-    var read = new PropertyGet(forest.thisExpression(token), name, getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (setter == null) {
-      helper.warnUnresolvedSet(name, offsetForToken(token));
-    }
-    var write =
-        new PropertySet(forest.thisExpression(token), name, value, setter)
-          ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    Member interfaceTarget = getter;
-    if (interfaceTarget == null) {
-      helper.warnUnresolvedMethod(name, offset);
-    }
-    if (interfaceTarget is Field) {
-      // TODO(ahe): In strong mode we should probably rewrite this to
-      // `this.name.call(arguments)`.
-      interfaceTarget = null;
-    }
-    return helper.buildMethodInvocation(
-        forest.thisExpression(null), name, arguments, offset,
-        interfaceTarget: interfaceTarget);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapPropertyAssignment(null, rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", name: ");
-    sink.write(name.name);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelNullAwarePropertyAccessGenerator extends KernelGenerator
-    with NullAwarePropertyAccessGenerator {
-  final VariableDeclaration receiver;
-
-  final Expression receiverExpression;
-
-  final Name name;
-
-  final Member getter;
-
-  final Member setter;
-
-  final DartType type;
-
-  KernelNullAwarePropertyAccessGenerator(
-      ExpressionGeneratorHelper helper,
-      Token token,
-      this.receiverExpression,
-      this.name,
-      this.getter,
-      this.setter,
-      this.type)
-      : this.receiver = makeOrReuseVariable(receiverExpression),
-        super(helper, token);
-
-  Expression receiverAccess() => new VariableGet(receiver);
-
-  @override
-  String get plainNameForRead => name.name;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new PropertyGet(receiverAccess(), name, getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    var write = new PropertySet(receiverAccess(), name, value, setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    var offset = offsetForToken(token);
-    var nullAwareGuard = forest.conditionalExpression(
-        buildIsNull(receiverAccess(), offset, helper),
-        null,
-        forest.literalNull(null)..fileOffset = offset,
-        null,
-        body)
-      ..fileOffset = offset;
-    if (complexAssignment != null) {
-      body = makeLet(receiver, nullAwareGuard);
-      if (helper.legacyMode) return body;
-      shadow.PropertyAssignmentJudgment kernelPropertyAssign =
-          complexAssignment;
-      kernelPropertyAssign.nullAwareGuard = nullAwareGuard;
-      kernelPropertyAssign.desugared = body;
-      return kernelPropertyAssign;
-    } else {
-      return new NullAwarePropertyGetJudgment(receiver, nullAwareGuard)
-        ..fileOffset = offset;
-    }
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapPropertyAssignment(receiverExpression, rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", receiver: ");
-    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
-    sink.write(", receiverExpression: ");
-    printNodeOn(receiverExpression, sink, syntheticNames: syntheticNames);
-    sink.write(", name: ");
-    sink.write(name.name);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-    sink.write(", type: ");
-    printNodeOn(type, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelSuperPropertyAccessGenerator extends KernelGenerator
-    with SuperPropertyAccessGenerator {
-  final Name name;
-
-  final Member getter;
-
-  final Member setter;
-
-  KernelSuperPropertyAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, this.name, this.getter, this.setter)
-      : super(helper, token);
-
-  @override
-  String get plainNameForRead => name.name;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    if (getter == null) {
-      helper.warnUnresolvedGet(name, offsetForToken(token), isSuper: true);
-    }
-    // TODO(ahe): Use [DirectPropertyGet] when possible.
-    var read = new SuperPropertyGetJudgment(name, interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (setter == null) {
-      helper.warnUnresolvedSet(name, offsetForToken(token), isSuper: true);
-    }
-    // TODO(ahe): Use [DirectPropertySet] when possible.
-    var write = new SuperPropertySet(name, value, setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    if (helper.constantContext != ConstantContext.none) {
-      // TODO(brianwilkerson) Fix the length
-      helper.addProblem(messageNotAConstantExpression, offset, 1);
-    }
-    if (getter == null || isFieldOrGetter(getter)) {
-      return helper.buildMethodInvocation(
-          buildSimpleRead(), callName, arguments, offset,
-          // This isn't a constant expression, but we have checked if a
-          // constant expression error should be emitted already.
-          isConstantExpression: true,
-          isImplicitCall: true);
-    } else {
-      // TODO(ahe): This could be something like "super.property(...)" where
-      // property is a setter.
-      return unhandled("${getter.runtimeType}", "doInvocation", offset, uri);
-    }
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapPropertyAssignment(null, rhs, isSuper: true);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", name: ");
-    sink.write(name.name);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelIndexedAccessGenerator extends KernelGenerator
-    with IndexedAccessGenerator {
-  final Expression receiver;
-
-  final Expression index;
-
-  final Procedure getter;
-
-  final Procedure setter;
-
-  VariableDeclaration receiverVariable;
-
-  VariableDeclaration indexVariable;
-
-  KernelIndexedAccessGenerator.internal(ExpressionGeneratorHelper helper,
-      Token token, this.receiver, this.index, this.getter, this.setter)
-      : super(helper, token);
-
-  Expression indexAccess() {
-    indexVariable ??= new VariableDeclaration.forValue(index);
-    return new VariableGet(indexVariable)..fileOffset = offsetForToken(token);
-  }
-
-  Expression receiverAccess() {
-    // We cannot reuse the receiver if it is a variable since it might be
-    // reassigned in the index expression.
-    receiverVariable ??= new VariableDeclaration.forValue(receiver);
-    return new VariableGet(receiverVariable)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression _makeSimpleRead() {
-    var read = new MethodInvocationJudgment(receiver, indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[index], token)),
-        interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-    return read;
-  }
-
-  @override
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
-        receiver,
-        indexSetName,
-        forest
-            .castArguments(forest.arguments(<Expression>[index, value], token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(
-        receiverAccess(),
-        indexGetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess()], token)),
-        interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
-        receiverAccess(),
-        indexSetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess(), value], token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  // TODO(dmitryas): remove this method after the "[]=" operator of the Context
-  // class is made to return a value.
-  Expression _makeWriteAndReturn(
-      Expression value, ComplexAssignmentJudgment complexAssignment) {
-    // The call to []= does not return the value like direct-style assignments
-    // do.  We need to bind the value in a let.
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
-        receiverAccess(),
-        indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    var dummy = new VariableDeclarationJudgment.forValue(
-        write, helper.functionNestingLevel);
-    return makeLet(
-        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
-  }
-
-  @override
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    int offset = offsetForToken(token);
-    return super._finish(
-        makeLet(
-            receiverVariable, makeLet(indexVariable, body)..fileOffset = offset)
-          ..fileOffset = offset,
-        complexAssignment);
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(
-        buildSimpleRead(), callName, arguments, forest.readOffset(arguments),
-        isImplicitCall: true);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapIndexAssignment(receiver, index, rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", receiver: ");
-    printNodeOn(receiver, sink, syntheticNames: syntheticNames);
-    sink.write(", index: ");
-    printNodeOn(index, sink, syntheticNames: syntheticNames);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-    sink.write(", receiverVariable: ");
-    printNodeOn(receiverVariable, sink, syntheticNames: syntheticNames);
-    sink.write(", indexVariable: ");
-    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelThisIndexedAccessGenerator extends KernelGenerator
-    with ThisIndexedAccessGenerator {
-  final Expression index;
-
-  final Procedure getter;
-
-  final Procedure setter;
-
-  VariableDeclaration indexVariable;
-
-  KernelThisIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, this.index, this.getter, this.setter)
-      : super(helper, token);
-
-  Expression indexAccess() {
-    indexVariable ??= new VariableDeclaration.forValue(index);
-    return new VariableGet(indexVariable);
-  }
-
-  Expression _makeWriteAndReturn(
-      Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
-    var write = new MethodInvocationJudgment(
-        forest.thisExpression(token),
-        indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
-    return makeLet(
-        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
-  }
-
-  @override
-  Expression _makeSimpleRead() {
-    return new MethodInvocationJudgment(
-        forest.thisExpression(token),
-        indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[index], token)),
-        interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
-        forest.thisExpression(token),
-        indexSetName,
-        forest
-            .castArguments(forest.arguments(<Expression>[index, value], token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    var read = new MethodInvocationJudgment(
-        forest.thisExpression(token),
-        indexGetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess()], token)),
-        interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    var write = new MethodInvocationJudgment(
-        forest.thisExpression(token),
-        indexSetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess(), value], token)),
-        interfaceTarget: setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    return super._finish(makeLet(indexVariable, body), complexAssignment);
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(
-        buildSimpleRead(), callName, arguments, offset,
-        isImplicitCall: true);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapIndexAssignment(null, index, rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", index: ");
-    printNodeOn(index, sink, syntheticNames: syntheticNames);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-    sink.write(", indexVariable: ");
-    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelSuperIndexedAccessGenerator extends KernelGenerator
-    with SuperIndexedAccessGenerator {
-  final Expression index;
-
-  final Member getter;
-
-  final Member setter;
-
-  VariableDeclaration indexVariable;
-
-  KernelSuperIndexedAccessGenerator(ExpressionGeneratorHelper helper,
-      Token token, this.index, this.getter, this.setter)
-      : super(helper, token);
-
-  Expression indexAccess() {
-    indexVariable ??= new VariableDeclaration.forValue(index);
-    return new VariableGet(indexVariable);
-  }
-
-  Expression _makeWriteAndReturn(
-      Expression value, ComplexAssignmentJudgment complexAssignment) {
-    var valueVariable = new VariableDeclaration.forValue(value);
-    if (setter == null) {
-      helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
-          isSuper: true);
-    }
-    var write = new SuperMethodInvocation(
-        indexSetName,
-        forest.castArguments(forest.arguments(
-            <Expression>[indexAccess(), new VariableGet(valueVariable)],
-            token)),
-        setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    var dummy = new VariableDeclaration.forValue(write);
-    return makeLet(
-        valueVariable, makeLet(dummy, new VariableGet(valueVariable)));
-  }
-
-  @override
-  Expression _makeSimpleRead() {
-    if (getter == null) {
-      helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
-          isSuper: true);
-    }
-    // TODO(ahe): Use [DirectMethodInvocation] when possible.
-    return new SuperMethodInvocationJudgment(indexGetName,
-        forest.castArguments(forest.arguments(<Expression>[index], token)),
-        interfaceTarget: getter)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression _makeSimpleWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    if (setter == null) {
-      helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
-          isSuper: true);
-    }
-    var write = new SuperMethodInvocation(
-        indexSetName,
-        forest
-            .castArguments(forest.arguments(<Expression>[index, value], token)),
-        setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    if (getter == null) {
-      helper.warnUnresolvedMethod(indexGetName, offsetForToken(token),
-          isSuper: true);
-    }
-    var read = new SuperMethodInvocation(
-        indexGetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess()], token)),
-        getter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    if (!voidContext) return _makeWriteAndReturn(value, complexAssignment);
-    if (setter == null) {
-      helper.warnUnresolvedMethod(indexSetName, offsetForToken(token),
-          isSuper: true);
-    }
-    var write = new SuperMethodInvocation(
-        indexSetName,
-        forest.castArguments(
-            forest.arguments(<Expression>[indexAccess(), value], token)),
-        setter)
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.write = write;
-    return write;
-  }
-
-  @override
-  Expression _finish(
-      Expression body, ComplexAssignmentJudgment complexAssignment) {
-    return super._finish(
-        makeLet(indexVariable, body)..fileOffset = offsetForToken(token),
-        complexAssignment);
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(
-        buildSimpleRead(), callName, arguments, offset,
-        isImplicitCall: true);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapIndexAssignment(null, index, rhs,
-          isSuper: true);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", index: ");
-    printNodeOn(index, sink, syntheticNames: syntheticNames);
-    sink.write(", getter: ");
-    printQualifiedNameOn(getter, sink, syntheticNames: syntheticNames);
-    sink.write(", setter: ");
-    printQualifiedNameOn(setter, sink, syntheticNames: syntheticNames);
-    sink.write(", indexVariable: ");
-    printNodeOn(indexVariable, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelStaticAccessGenerator extends KernelGenerator
-    with StaticAccessGenerator {
-  @override
-  final Member readTarget;
-
-  final Member writeTarget;
-
-  KernelStaticAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.readTarget, this.writeTarget)
-      : assert(readTarget != null || writeTarget != null),
-        super(helper, token);
-
-  @override
-  String get plainNameForRead => (readTarget ?? writeTarget).name.name;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    Expression read;
-    if (readTarget == null) {
-      read = makeInvalidRead();
-      if (complexAssignment != null) {
-        read = helper.desugarSyntheticExpression(read);
-      }
-    } else {
-      read = helper.makeStaticGet(readTarget, token);
-    }
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    Expression write;
-    if (writeTarget == null) {
-      write = makeInvalidWrite(value);
-      if (complexAssignment != null) {
-        write = helper.desugarSyntheticExpression(write);
-      }
-    } else {
-      write = new StaticSet(writeTarget, value);
-    }
-    complexAssignment?.write = write;
-    write.fileOffset = offsetForToken(token);
-    return write;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    if (helper.constantContext != ConstantContext.none &&
-        !helper.isIdentical(readTarget)) {
-      return helper.buildProblem(
-          templateNotConstantExpression.withArguments('Method invocation'),
-          offset,
-          readTarget?.name?.name?.length ?? 0);
-    }
-    if (readTarget == null || isFieldOrGetter(readTarget)) {
-      return helper.buildMethodInvocation(buildSimpleRead(), callName,
-          arguments, offset + (readTarget?.name?.name?.length ?? 0),
-          // This isn't a constant expression, but we have checked if a
-          // constant expression error should be emitted already.
-          isConstantExpression: true,
-          isImplicitCall: true);
-    } else {
-      return helper.buildStaticInvocation(readTarget, arguments,
-          charOffset: offset);
-    }
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapStaticAssignment(rhs);
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", readTarget: ");
-    printQualifiedNameOn(readTarget, sink, syntheticNames: syntheticNames);
-    sink.write(", writeTarget: ");
-    printQualifiedNameOn(writeTarget, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelLoadLibraryGenerator extends KernelGenerator
-    with LoadLibraryGenerator {
-  final LoadLibraryBuilder builder;
-
-  KernelLoadLibraryGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.builder)
-      : super(helper, token);
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    builder.importDependency.targetLibrary;
-    var read = new LoadLibraryTearOffJudgment(
-        builder.importDependency, builder.createTearoffMethod(helper.forest))
-      ..fileOffset = offsetForToken(token);
-    complexAssignment?.read = read;
-    return read;
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    if (forest.argumentsPositional(arguments).length > 0 ||
-        forest.argumentsNamed(arguments).length > 0) {
-      helper.addProblemErrorIfConst(
-          messageLoadLibraryTakesNoArguments, offset, 'loadLibrary'.length);
-    }
-    return builder.createLoadLibrary(offset, forest, arguments);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", builder: ");
-    sink.write(builder);
-  }
-}
-
-class KernelDeferredAccessGenerator extends KernelGenerator
-    with DeferredAccessGenerator {
-  @override
-  final KernelPrefixUseGenerator prefixGenerator;
-
-  @override
-  final KernelGenerator suffixGenerator;
-
-  KernelDeferredAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.prefixGenerator, this.suffixGenerator)
-      : super(helper, token);
-
-  @override
-  Expression _makeSimpleRead() {
-    return helper.wrapInDeferredCheck(suffixGenerator._makeSimpleRead(),
-        prefixGenerator.prefix, token.charOffset);
-  }
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    return helper.wrapInDeferredCheck(
-        suffixGenerator._makeRead(complexAssignment),
-        prefixGenerator.prefix,
-        token.charOffset);
-  }
-
-  @override
-  Expression _makeWrite(Expression value, bool voidContext,
-      ComplexAssignmentJudgment complexAssignment) {
-    return helper.wrapInDeferredCheck(
-        suffixGenerator._makeWrite(value, voidContext, complexAssignment),
-        prefixGenerator.prefix,
-        token.charOffset);
-  }
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) =>
-      shadow.SyntheticWrapper.wrapStaticAssignment(rhs);
-}
-
-class KernelTypeUseGenerator extends KernelReadOnlyAccessGenerator
-    with TypeUseGenerator {
-  @override
-  final TypeDeclarationBuilder declaration;
-
-  KernelTypeUseGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.declaration, String plainNameForRead)
-      : super(helper, token, null, plainNameForRead);
-
-  @override
-  Expression get expression {
-    if (super.expression == null) {
-      int offset = offsetForToken(token);
-      if (declaration is KernelInvalidTypeBuilder) {
-        KernelInvalidTypeBuilder declaration = this.declaration;
-        helper.addProblemErrorIfConst(
-            declaration.message.messageObject, offset, token.length);
-        super.expression = helper.wrapSyntheticExpression(
-            forest.throwExpression(
-                null, forest.literalString(declaration.message.message, token))
-              ..fileOffset = offset,
-            offset);
-      } else {
-        super.expression = forest.literalType(
-            helper.buildDartType(
-                new UnresolvedType<KernelTypeBuilder>(
-                    buildTypeWithResolvedArguments(null), offset, uri),
-                nonInstanceAccessIsError: true),
-            token);
-      }
-    }
-    return super.expression;
-  }
-
-  @override
-  Expression makeInvalidWrite(Expression value) {
-    return helper.wrapSyntheticExpression(
-        helper.throwNoSuchMethodError(
-            forest.literalNull(token),
-            plainNameForRead,
-            forest.arguments(<Expression>[value], null)
-              ..fileOffset = value.fileOffset,
-            offsetForToken(token),
-            isSetter: true),
-        offsetForToken(token));
-  }
-
-  @override
-  buildPropertyAccess(
-      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
-    // `SomeType?.toString` is the same as `SomeType.toString`, not
-    // `(SomeType).toString`.
-    isNullAware = false;
-
-    Name name = send.name;
-    Arguments arguments = send.arguments;
-
-    if (declaration is KernelClassBuilder) {
-      KernelClassBuilder declaration = this.declaration;
-      Declaration member = declaration.findStaticBuilder(
-          name.name, offsetForToken(send.token), uri, helper.library);
-
-      Generator generator;
-      if (member == null) {
-        // If we find a setter, [member] is an [AccessErrorBuilder], not null.
-        if (send is IncompletePropertyAccessGenerator) {
-          generator = new UnresolvedNameGenerator(helper, send.token, name);
-        } else {
-          return helper.buildConstructorInvocation(
-              declaration,
-              send.token,
-              send.token,
-              arguments,
-              name.name,
-              null,
-              token.charOffset,
-              Constness.implicit);
-        }
-      } else if (member is AmbiguousBuilder) {
-        return helper.buildProblem(
-            member.message, member.charOffset, name.name.length);
-      } else {
-        Declaration setter;
-        if (member.isSetter) {
-          setter = member;
-        } else if (member.isGetter) {
-          setter = declaration.findStaticBuilder(
-              name.name, offsetForToken(token), uri, helper.library,
-              isSetter: true);
-        } else if (member.isField) {
-          if (member.isFinal || member.isConst) {
-            setter = declaration.findStaticBuilder(
-                name.name, offsetForToken(token), uri, helper.library,
-                isSetter: true);
-          } else {
-            setter = member;
-          }
-        }
-        generator = new StaticAccessGenerator.fromBuilder(
-            helper, member, send.token, setter);
-      }
-
-      return arguments == null
-          ? generator
-          : generator.doInvocation(offsetForToken(send.token), arguments);
-    } else {
-      return super.buildPropertyAccess(send, operatorOffset, isNullAware);
-    }
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildConstructorInvocation(declaration, token, token,
-        arguments, "", null, token.charOffset, Constness.implicit);
-  }
-}
-
-class KernelReadOnlyAccessGenerator extends KernelGenerator
-    with ReadOnlyAccessGenerator {
-  @override
-  final String plainNameForRead;
-
-  Expression expression;
-
-  VariableDeclaration value;
-
-  KernelReadOnlyAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.expression, this.plainNameForRead)
-      : super(helper, token);
-
-  @override
-  Expression _makeSimpleRead() => expression;
-
-  @override
-  Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
-    value ??= new VariableDeclaration.forValue(expression);
-    return new VariableGet(value);
-  }
-
-  @override
-  Expression _finish(
-          Expression body, ComplexAssignmentJudgment complexAssignment) =>
-      super._finish(makeLet(value, body), complexAssignment);
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return helper.buildMethodInvocation(buildSimpleRead(), callName, arguments,
-        adjustForImplicitCall(plainNameForRead, offset),
-        isImplicitCall: true);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    NameSystem syntheticNames = new NameSystem();
-    sink.write(", expression: ");
-    printNodeOn(expression, sink, syntheticNames: syntheticNames);
-    sink.write(", plainNameForRead: ");
-    sink.write(plainNameForRead);
-    sink.write(", value: ");
-    printNodeOn(value, sink, syntheticNames: syntheticNames);
-  }
-}
-
-class KernelUnresolvedNameGenerator extends KernelGenerator
-    with ErroneousExpressionGenerator, UnresolvedNameGenerator {
-  @override
-  final Name name;
-
-  KernelUnresolvedNameGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.name)
-      : super(helper, token);
-
-  @override
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return _buildUnresolvedVariableAssignment(false, value);
-  }
-
-  @override
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    return _buildUnresolvedVariableAssignment(true, value);
-  }
-
-  @override
-  Expression buildSimpleRead() {
-    return buildError(forest.argumentsEmpty(token), isGetter: true)
-      ..fileOffset = token.charOffset;
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-
-  Expression _buildUnresolvedVariableAssignment(
-      bool isCompound, Expression value) {
-    return helper.wrapUnresolvedVariableAssignment(
-        helper.desugarSyntheticExpression(buildError(
-            forest.arguments(<Expression>[value], token),
-            isSetter: true)),
-        isCompound,
-        value,
-        token.charOffset);
-  }
-}
-
-class KernelUnlinkedGenerator extends KernelGenerator with UnlinkedGenerator {
-  @override
-  final UnlinkedDeclaration declaration;
-
-  final Expression receiver;
-
-  final Name name;
-
-  KernelUnlinkedGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.declaration)
-      : name = new Name(declaration.name, helper.library.target),
-        receiver = new InvalidExpression(declaration.name)
-          ..fileOffset = offsetForToken(token),
-        super(helper, token);
-
-  @override
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return new PropertySet(receiver, name, value)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression buildSimpleRead() {
-    return new PropertyGet(receiver, name)..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-}
-
-abstract class KernelContextAwareGenerator extends KernelGenerator
-    with ContextAwareGenerator {
-  @override
-  final Generator generator;
-
-  KernelContextAwareGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.generator)
-      : super(helper, token);
-}
-
-class KernelDelayedAssignment extends KernelContextAwareGenerator
-    with DelayedAssignment {
-  @override
-  final Expression value;
-
-  @override
-  String assignmentOperator;
-
-  KernelDelayedAssignment(ExpressionGeneratorHelper helper, Token token,
-      Generator generator, this.value, this.assignmentOperator)
-      : super(helper, token, generator);
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", value: ");
-    printNodeOn(value, sink);
-    sink.write(", assignmentOperator: ");
-    sink.write(assignmentOperator);
-  }
-}
-
-class KernelDelayedPostfixIncrement extends KernelContextAwareGenerator
-    with DelayedPostfixIncrement {
-  @override
-  final Name binaryOperator;
-
-  @override
-  final Procedure interfaceTarget;
-
-  KernelDelayedPostfixIncrement(ExpressionGeneratorHelper helper, Token token,
-      Generator generator, this.binaryOperator, this.interfaceTarget)
-      : super(helper, token, generator);
-}
-
-class KernelPrefixUseGenerator extends KernelGenerator with PrefixUseGenerator {
-  final PrefixBuilder prefix;
-
-  KernelPrefixUseGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.prefix)
-      : super(helper, token);
-}
-
-class KernelUnexpectedQualifiedUseGenerator extends KernelGenerator
-    with UnexpectedQualifiedUseGenerator {
-  @override
-  final KernelGenerator prefixGenerator;
-
-  @override
-  final bool isUnresolved;
-
-  KernelUnexpectedQualifiedUseGenerator(ExpressionGeneratorHelper helper,
-      Token token, this.prefixGenerator, this.isUnresolved)
-      : super(helper, token);
-}
-
-class KernelParserErrorGenerator extends KernelGenerator
-    with ParserErrorGenerator {
-  @override
-  final Message message;
-
-  KernelParserErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.message)
-      : super(helper, token);
-}
-
-Expression makeLet(VariableDeclaration variable, Expression body) {
-  if (variable == null) return body;
-  return new Let(variable, body);
-}
-
-Expression makeBinary(Expression left, Name operator, Procedure interfaceTarget,
-    Expression right, ExpressionGeneratorHelper helper,
-    {int offset: TreeNode.noOffset}) {
-  return new MethodInvocationJudgment(
-      left,
-      operator,
-      helper.forest
-          .castArguments(helper.forest.arguments(<Expression>[right], null))
-            ..fileOffset = offset,
-      interfaceTarget: interfaceTarget)
-    ..fileOffset = offset;
-}
-
-Expression buildIsNull(
-    Expression value, int offset, ExpressionGeneratorHelper helper) {
-  return makeBinary(value, equalsName, null,
-      helper.forest.literalNull(null)..fileOffset = offset, helper,
-      offset: offset);
-}
-
-VariableDeclaration makeOrReuseVariable(Expression value) {
-  // TODO: Devise a way to remember if a variable declaration was reused
-  // or is fresh (hence needs a let binding).
-  return new VariableDeclaration.forValue(value);
-}
-
-int adjustForImplicitCall(String name, int offset) {
-  // Normally the offset is at the start of the token, but in this case,
-  // because we insert a '.call', we want it at the end instead.
-  return offset + (name?.length ?? 0);
-}
-
-bool isFieldOrGetter(Member member) {
-  return member is Field || (member is Procedure && member.isGetter);
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
deleted file mode 100644
index be2ec5c..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_expression_generator_impl.dart
+++ /dev/null
@@ -1,430 +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.
-
-/// All classes in this file are temporary. Each class should be split in two:
-///
-/// 1. A common superclass.
-/// 2. A kernel-specific implementation class.
-///
-/// The common superclass should keep the name of the class and be moved to
-/// [expression_generator.dart]. The kernel-specific class should be moved to
-/// [kernel_expression_generator.dart] and we can eventually delete this file.
-///
-/// Take a look at [VariableUseGenerator] for an example of how the common
-/// superclass should use the forest API in a factory method.
-part of 'kernel_expression_generator.dart';
-
-class ThisAccessGenerator extends KernelGenerator {
-  final bool isInitializer;
-  final bool inFieldInitializer;
-
-  final bool isSuper;
-
-  ThisAccessGenerator(ExpressionGeneratorHelper helper, Token token,
-      this.isInitializer, this.inFieldInitializer,
-      {this.isSuper: false})
-      : super(helper, token);
-
-  String get plainNameForRead {
-    return unsupported("${isSuper ? 'super' : 'this'}.plainNameForRead",
-        offsetForToken(token), uri);
-  }
-
-  String get debugName => "ThisAccessGenerator";
-
-  Expression buildSimpleRead() {
-    if (!isSuper) {
-      if (inFieldInitializer) {
-        return buildFieldInitializerError(null);
-      } else {
-        return forest.thisExpression(token);
-      }
-    } else {
-      return helper.buildProblem(messageSuperAsExpression,
-          offsetForToken(token), lengthForToken(token));
-    }
-  }
-
-  Expression buildFieldInitializerError(Map<String, int> initializedFields) {
-    String keyword = isSuper ? "super" : "this";
-    return helper.buildProblem(
-        templateThisOrSuperAccessInFieldInitializer.withArguments(keyword),
-        offsetForToken(token),
-        keyword.length);
-  }
-
-  @override
-  Initializer buildFieldInitializer(Map<String, int> initializedFields) {
-    Expression error = helper.desugarSyntheticExpression(
-        buildFieldInitializerError(initializedFields));
-    return helper.buildInvalidInitializer(error, error.fileOffset);
-  }
-
-  buildPropertyAccess(
-      IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
-    Name name = send.name;
-    Arguments arguments = send.arguments;
-    int offset = offsetForToken(send.token);
-    if (isInitializer && send is SendAccessGenerator) {
-      if (isNullAware) {
-        helper.addProblem(
-            messageInvalidUseOfNullAwareAccess, operatorOffset, 2);
-      }
-      return buildConstructorInitializer(offset, name, arguments);
-    }
-    if (inFieldInitializer && !isInitializer) {
-      return buildFieldInitializerError(null);
-    }
-    Member getter = helper.lookupInstanceMember(name, isSuper: isSuper);
-    if (send is SendAccessGenerator) {
-      // Notice that 'this' or 'super' can't be null. So we can ignore the
-      // value of [isNullAware].
-      if (getter == null) {
-        helper.warnUnresolvedMethod(name, offsetForToken(send.token),
-            isSuper: isSuper);
-      }
-      return helper.buildMethodInvocation(forest.thisExpression(null), name,
-          send.arguments, offsetForToken(send.token),
-          isSuper: isSuper, interfaceTarget: getter);
-    } else {
-      Member setter =
-          helper.lookupInstanceMember(name, isSuper: isSuper, isSetter: true);
-      if (isSuper) {
-        return new SuperPropertyAccessGenerator(
-            helper,
-            // TODO(ahe): This is not the 'super' token.
-            send.token,
-            name,
-            getter,
-            setter);
-      } else {
-        return new ThisPropertyAccessGenerator(
-            helper,
-            // TODO(ahe): This is not the 'this' token.
-            send.token,
-            name,
-            getter,
-            setter);
-      }
-    }
-  }
-
-  doInvocation(int offset, Arguments arguments) {
-    if (isInitializer) {
-      return buildConstructorInitializer(offset, new Name(""), arguments);
-    } else if (isSuper) {
-      return helper.buildProblem(messageSuperAsExpression, offset, noLength);
-    } else {
-      return helper.buildMethodInvocation(
-          forest.thisExpression(null), callName, arguments, offset,
-          isImplicitCall: true);
-    }
-  }
-
-  Initializer buildConstructorInitializer(
-      int offset, Name name, Arguments arguments) {
-    Constructor constructor = helper.lookupConstructor(name, isSuper: isSuper);
-    LocatedMessage message;
-    if (constructor != null) {
-      message = helper.checkArgumentsForFunction(
-          constructor.function, arguments, offset, <TypeParameter>[]);
-    } else {
-      String fullName =
-          helper.constructorNameForDiagnostics(name.name, isSuper: isSuper);
-      message = (isSuper
-              ? templateSuperclassHasNoConstructor
-              : templateConstructorNotFound)
-          .withArguments(fullName)
-          .withLocation(uri, offsetForToken(token), lengthForToken(token));
-    }
-    if (message != null) {
-      return helper.buildInvalidInitializer(helper.wrapSyntheticExpression(
-          helper.throwNoSuchMethodError(
-              forest.literalNull(null)..fileOffset = offset,
-              helper.constructorNameForDiagnostics(name.name, isSuper: isSuper),
-              arguments,
-              offset,
-              isSuper: isSuper,
-              message: message),
-          offset));
-    } else if (isSuper) {
-      return helper.buildSuperInitializer(
-          false, constructor, arguments, offset);
-    } else {
-      return helper.buildRedirectingInitializer(constructor, arguments, offset);
-    }
-  }
-
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return buildAssignmentError();
-  }
-
-  Expression buildNullAwareAssignment(
-      Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return buildAssignmentError();
-  }
-
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    return buildAssignmentError();
-  }
-
-  Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return buildAssignmentError();
-  }
-
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return buildAssignmentError();
-  }
-
-  Expression buildAssignmentError() {
-    return helper.desugarSyntheticExpression(helper.buildProblem(
-        isSuper ? messageCannotAssignToSuper : messageNotAnLvalue,
-        offsetForToken(token),
-        token.length));
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", isInitializer: ");
-    sink.write(isInitializer);
-    sink.write(", isSuper: ");
-    sink.write(isSuper);
-  }
-}
-
-abstract class IncompleteSendGenerator extends KernelGenerator {
-  final Name name;
-
-  IncompleteSendGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.name)
-      : super(helper, token);
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware});
-
-  Arguments get arguments => null;
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", name: ");
-    sink.write(name.name);
-  }
-}
-
-class IncompleteErrorGenerator extends IncompleteSendGenerator
-    with ErroneousExpressionGenerator {
-  final Message message;
-
-  IncompleteErrorGenerator(
-      ExpressionGeneratorHelper helper, Token token, this.message)
-      : super(helper, token, null);
-
-  String get plainNameForRead => token.lexeme;
-
-  String get debugName => "IncompleteErrorGenerator";
-
-  @override
-  Expression buildError(Arguments arguments,
-      {bool isGetter: false, bool isSetter: false, int offset}) {
-    int length = noLength;
-    if (offset == null) {
-      offset = offsetForToken(token);
-      length = lengthForToken(token);
-    }
-    return helper.buildProblem(message, offset, length);
-  }
-
-  @override
-  doInvocation(int offset, Arguments arguments) => this;
-
-  @override
-  Expression buildSimpleRead() {
-    return buildError(forest.argumentsEmpty(token), isGetter: true)
-      ..fileOffset = offsetForToken(token);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    sink.write(", message: ");
-    sink.write(message.code.name);
-  }
-}
-
-// TODO(ahe): Rename to SendGenerator.
-class SendAccessGenerator extends IncompleteSendGenerator {
-  @override
-  final Arguments arguments;
-
-  SendAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token, Name name, this.arguments)
-      : super(helper, token, name) {
-    assert(arguments != null);
-  }
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "SendAccessGenerator";
-
-  Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is Generator) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    return helper.buildMethodInvocation(
-        helper.toValue(receiver), name, arguments, offsetForToken(token),
-        isNullAware: isNullAware);
-  }
-
-  Expression buildNullAwareAssignment(
-      Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-
-  @override
-  void printOn(StringSink sink) {
-    super.printOn(sink);
-    sink.write(", arguments: ");
-    var node = arguments;
-    if (node is Node) {
-      printNodeOn(node, sink);
-    } else {
-      sink.write(node);
-    }
-  }
-}
-
-class IncompletePropertyAccessGenerator extends IncompleteSendGenerator {
-  IncompletePropertyAccessGenerator(
-      ExpressionGeneratorHelper helper, Token token, Name name)
-      : super(helper, token, name);
-
-  String get plainNameForRead => name.name;
-
-  String get debugName => "IncompletePropertyAccessGenerator";
-
-  Expression buildSimpleRead() {
-    return unsupported("buildSimpleRead", offsetForToken(token), uri);
-  }
-
-  Expression buildAssignment(Expression value, {bool voidContext: false}) {
-    return unsupported("buildAssignment", offsetForToken(token), uri);
-  }
-
-  withReceiver(Object receiver, int operatorOffset, {bool isNullAware: false}) {
-    if (receiver is Generator) {
-      return receiver.buildPropertyAccess(this, operatorOffset, isNullAware);
-    }
-    return PropertyAccessGenerator.make(
-        helper, token, helper.toValue(receiver), name, null, null, isNullAware);
-  }
-
-  Expression buildNullAwareAssignment(
-      Expression value, DartType type, int offset,
-      {bool voidContext: false}) {
-    return unsupported("buildNullAwareAssignment", offset, uri);
-  }
-
-  Expression buildCompoundAssignment(Name binaryOperator, Expression value,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget,
-      bool isPreIncDec: false,
-      bool isPostIncDec: false}) {
-    return unsupported(
-        "buildCompoundAssignment", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression buildPrefixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPrefixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression buildPostfixIncrement(Name binaryOperator,
-      {int offset: TreeNode.noOffset,
-      bool voidContext: false,
-      Procedure interfaceTarget}) {
-    return unsupported(
-        "buildPostfixIncrement", offset ?? offsetForToken(token), uri);
-  }
-
-  Expression doInvocation(int offset, Arguments arguments) {
-    return unsupported("doInvocation", offset, uri);
-  }
-}
-
-class ParenthesizedExpressionGenerator extends KernelReadOnlyAccessGenerator {
-  ParenthesizedExpressionGenerator(
-      ExpressionGeneratorHelper helper, Token token, Expression expression)
-      : super(helper, token, expression, null);
-
-  String get debugName => "ParenthesizedExpressionGenerator";
-
-  @override
-  ComplexAssignmentJudgment startComplexAssignment(Expression rhs) {
-    return shadow.SyntheticWrapper.wrapIllegalAssignment(rhs,
-        assignmentOffset: offsetForToken(token));
-  }
-
-  Expression makeInvalidWrite(Expression value) {
-    return helper.wrapInvalidWrite(
-        helper.desugarSyntheticExpression(helper.buildProblem(
-            messageCannotAssignToParenthesizedExpression,
-            offsetForToken(token),
-            lengthForToken(token))),
-        expression,
-        offsetForToken(token));
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
deleted file mode 100644
index 3a22dbb..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_field_builder.dart
+++ /dev/null
@@ -1,208 +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.
-
-library fasta.kernel_field_builder;
-
-import 'package:kernel/ast.dart'
-    show Class, DartType, Expression, Field, InvalidType, Name, NullLiteral;
-
-import '../constant_context.dart' show ConstantContext;
-
-import '../fasta_codes.dart'
-    show
-        messageInternalProblemAlreadyInitialized,
-        templateCantInferTypeDueToCircularity;
-
-import '../problems.dart' show internalProblem;
-
-import '../scanner.dart' show Token;
-
-import '../scope.dart' show Scope;
-
-import '../source/source_loader.dart' show SourceLoader;
-
-import '../type_inference/type_inference_engine.dart'
-    show IncludesTypeParametersCovariantly;
-
-import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
-
-import '../type_inference/type_schema.dart' show UnknownType;
-
-import 'kernel_body_builder.dart' show KernelBodyBuilder;
-
-import 'kernel_builder.dart'
-    show
-        ClassBuilder,
-        Declaration,
-        FieldBuilder,
-        ImplicitFieldType,
-        KernelLibraryBuilder,
-        KernelMetadataBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        MetadataBuilder;
-
-class KernelFieldBuilder extends FieldBuilder<Expression> {
-  final Field field;
-  final List<MetadataBuilder> metadata;
-  final KernelTypeBuilder type;
-  Token constInitializerToken;
-
-  bool hadTypesInferred = false;
-
-  KernelFieldBuilder(this.metadata, this.type, String name, int modifiers,
-      Declaration compilationUnit, int charOffset, int charEndOffset)
-      : field = new Field(null, fileUri: compilationUnit?.fileUri)
-          ..fileOffset = charOffset
-          ..fileEndOffset = charEndOffset,
-        super(name, modifiers, compilationUnit, charOffset);
-
-  void set initializer(Expression value) {
-    if (!hasInitializer && value is! NullLiteral && !isConst && !isFinal) {
-      internalProblem(
-          messageInternalProblemAlreadyInitialized, charOffset, fileUri);
-    }
-    field.initializer = value..parent = field;
-  }
-
-  bool get isEligibleForInference {
-    return !library.legacyMode &&
-        type == null &&
-        (hasInitializer || isInstanceMember);
-  }
-
-  Field build(KernelLibraryBuilder library) {
-    field.name ??= new Name(name, library.target);
-    if (type != null) {
-      field.type = type.build(library);
-
-      if (!isFinal && !isConst) {
-        IncludesTypeParametersCovariantly needsCheckVisitor;
-        if (parent is ClassBuilder) {
-          Class enclosingClass = parent.target;
-          if (enclosingClass.typeParameters.isNotEmpty) {
-            needsCheckVisitor = new IncludesTypeParametersCovariantly(
-                enclosingClass.typeParameters);
-          }
-        }
-        if (needsCheckVisitor != null) {
-          if (field.type.accept(needsCheckVisitor)) {
-            field.isGenericCovariantImpl = true;
-          }
-        }
-      }
-    }
-    bool isInstanceMember = !isStatic && !isTopLevel;
-    field
-      ..isCovariant = isCovariant
-      ..isFinal = isFinal
-      ..isConst = isConst
-      ..hasImplicitGetter = isInstanceMember
-      ..hasImplicitSetter = isInstanceMember && !isConst && !isFinal
-      ..isStatic = !isInstanceMember;
-    return field;
-  }
-
-  @override
-  void buildOutlineExpressions(LibraryBuilder library) {
-    ClassBuilder classBuilder = isClassMember ? parent : null;
-    KernelMetadataBuilder.buildAnnotations(
-        field, metadata, library, classBuilder, this);
-    if (constInitializerToken != null) {
-      Scope scope = classBuilder?.scope ?? library.scope;
-      KernelBodyBuilder bodyBuilder =
-          new KernelBodyBuilder.forOutlineExpression(
-              library, classBuilder, this, scope, fileUri);
-      bodyBuilder.constantContext =
-          isConst ? ConstantContext.inferred : ConstantContext.none;
-      initializer = bodyBuilder.parseFieldInitializer(constInitializerToken)
-        ..parent = field;
-      constInitializerToken = null;
-      bodyBuilder.typeInferrer
-          ?.inferFieldInitializer(bodyBuilder, field.type, field.initializer);
-      if (library.loader is SourceLoader) {
-        SourceLoader loader = library.loader;
-        loader.transformPostInference(field, bodyBuilder.transformSetLiterals,
-            bodyBuilder.transformCollections);
-      }
-      bodyBuilder.resolveRedirectingFactoryTargets();
-    }
-  }
-
-  Field get target => field;
-
-  @override
-  void inferType() {
-    KernelLibraryBuilder library = this.library;
-    if (field.type is! ImplicitFieldType) {
-      // We have already inferred a type.
-      return;
-    }
-    ImplicitFieldType type = field.type;
-    if (type.member != this) {
-      // The implicit type was inherited.
-      KernelFieldBuilder other = type.member;
-      other.inferCopiedType(field);
-      return;
-    }
-    if (type.isStarted) {
-      library.addProblem(
-          templateCantInferTypeDueToCircularity.withArguments(name),
-          charOffset,
-          name.length,
-          fileUri);
-      field.type = const InvalidType();
-      return;
-    }
-    type.isStarted = true;
-    TypeInferrerImpl typeInferrer = library.loader.typeInferenceEngine
-        .createTopLevelTypeInferrer(
-            fileUri, field.enclosingClass?.thisType, null);
-    KernelBodyBuilder bodyBuilder =
-        new KernelBodyBuilder.forField(this, typeInferrer);
-    bodyBuilder.constantContext =
-        isConst ? ConstantContext.inferred : ConstantContext.none;
-    initializer = bodyBuilder.parseFieldInitializer(type.initializerToken);
-    type.initializerToken = null;
-
-    DartType inferredType = typeInferrer.inferDeclarationType(typeInferrer
-        .inferExpression(field.initializer, const UnknownType(), true,
-            isVoidAllowed: true));
-
-    if (field.type is ImplicitFieldType) {
-      // `field.type` may have changed if a circularity was detected when
-      // [inferredType] was computed.
-      field.type = inferredType;
-
-      IncludesTypeParametersCovariantly needsCheckVisitor;
-      if (parent is ClassBuilder) {
-        Class enclosingClass = parent.target;
-        if (enclosingClass.typeParameters.isNotEmpty) {
-          needsCheckVisitor = new IncludesTypeParametersCovariantly(
-              enclosingClass.typeParameters);
-        }
-      }
-      if (needsCheckVisitor != null) {
-        if (field.type.accept(needsCheckVisitor)) {
-          field.isGenericCovariantImpl = true;
-        }
-      }
-    }
-
-    // The following is a hack. The outline should contain the compiled
-    // initializers, however, as top-level inference is subtly different from
-    // we need to compile the field initializer again when everything else is
-    // compiled.
-    field.initializer = null;
-  }
-
-  void inferCopiedType(Field other) {
-    inferType();
-    other.type = field.type;
-    other.initializer = null;
-  }
-
-  @override
-  DartType get builtType => field.type;
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
deleted file mode 100644
index ec775ef..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_formal_parameter_builder.dart
+++ /dev/null
@@ -1,86 +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.
-
-library fasta.kernel_formal_parameter_builder;
-
-import 'package:kernel/ast.dart' show VariableDeclaration;
-
-import '../modifier.dart' show finalMask, initializingFormalMask;
-
-import 'kernel_builder.dart'
-    show
-        ClassBuilder,
-        Declaration,
-        FormalParameterBuilder,
-        KernelFieldBuilder,
-        KernelLibraryBuilder,
-        KernelTypeBuilder,
-        MetadataBuilder,
-        TypeBuilder;
-
-import 'kernel_shadow_ast.dart' show VariableDeclarationJudgment;
-
-class KernelFormalParameterBuilder
-    extends FormalParameterBuilder<KernelTypeBuilder> {
-  VariableDeclaration declaration;
-
-  KernelFormalParameterBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder type,
-      String name,
-      KernelLibraryBuilder compilationUnit,
-      int charOffset)
-      : super(metadata, modifiers, type, name, compilationUnit, charOffset);
-
-  VariableDeclaration get target => declaration;
-
-  VariableDeclaration build(
-      KernelLibraryBuilder library, int functionNestingLevel) {
-    if (declaration == null) {
-      declaration = new VariableDeclarationJudgment(name, functionNestingLevel,
-          type: type?.build(library),
-          isFinal: isFinal,
-          isConst: isConst,
-          isFieldFormal: isInitializingFormal,
-          isCovariant: isCovariant)
-        ..fileOffset = charOffset;
-    }
-    return declaration;
-  }
-
-  KernelFormalParameterBuilder clone(List<TypeBuilder> newTypes) {
-    // TODO(dmitryas):  It's not clear how [metadata] is used currently, and
-    // how it should be cloned.  Consider cloning it instead of reusing it.
-    return new KernelFormalParameterBuilder(
-        metadata, modifiers, type?.clone(newTypes), name, parent, charOffset)
-      ..kind = kind;
-  }
-
-  @override
-  FormalParameterBuilder forFormalParameterInitializerScope() {
-    assert(declaration != null);
-    return !isInitializingFormal
-        ? this
-        : (new KernelFormalParameterBuilder(
-            metadata,
-            modifiers | finalMask | initializingFormalMask,
-            type,
-            name,
-            null,
-            charOffset)
-          ..parent = parent
-          ..declaration = declaration);
-  }
-
-  void finalizeInitializingFormal() {
-    Object cls = parent.parent;
-    if (cls is ClassBuilder) {
-      Declaration field = cls.scope.lookup(name, charOffset, fileUri);
-      if (field is KernelFieldBuilder) {
-        target.type = field.target.type;
-      }
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
deleted file mode 100644
index d821ca7..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_function_type_builder.dart
+++ /dev/null
@@ -1,114 +0,0 @@
-// 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 fasta.kernel_function_type_builder;
-
-import 'package:kernel/ast.dart'
-    show
-        DartType,
-        DynamicType,
-        FunctionType,
-        NamedType,
-        Supertype,
-        TypeParameter,
-        TypedefType;
-
-import '../fasta_codes.dart'
-    show LocatedMessage, messageSupertypeIsFunction, noLength;
-
-import '../problems.dart' show unsupported;
-
-import 'kernel_builder.dart'
-    show
-        FormalParameterBuilder,
-        FunctionTypeBuilder,
-        KernelFormalParameterBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        TypeBuilder,
-        TypeVariableBuilder;
-
-class KernelFunctionTypeBuilder extends FunctionTypeBuilder
-    implements KernelTypeBuilder {
-  KernelFunctionTypeBuilder(
-      KernelTypeBuilder returnType,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder<TypeBuilder>> formals)
-      : super(returnType, typeVariables, formals);
-
-  FunctionType build(LibraryBuilder library, [TypedefType origin]) {
-    DartType builtReturnType =
-        returnType?.build(library) ?? const DynamicType();
-    List<DartType> positionalParameters = <DartType>[];
-    List<NamedType> namedParameters;
-    int requiredParameterCount = 0;
-    if (formals != null) {
-      for (KernelFormalParameterBuilder formal in formals) {
-        DartType type = formal.type?.build(library) ?? const DynamicType();
-        if (formal.isPositional) {
-          positionalParameters.add(type);
-          if (formal.isRequired) requiredParameterCount++;
-        } else if (formal.isNamed) {
-          namedParameters ??= <NamedType>[];
-          namedParameters.add(new NamedType(formal.name, type));
-        }
-      }
-      if (namedParameters != null) {
-        namedParameters.sort();
-      }
-    }
-    List<TypeParameter> typeParameters;
-    if (typeVariables != null) {
-      typeParameters = <TypeParameter>[];
-      for (KernelTypeVariableBuilder t in typeVariables) {
-        typeParameters.add(t.parameter);
-      }
-    }
-    return new FunctionType(positionalParameters, builtReturnType,
-        namedParameters: namedParameters ?? const <NamedType>[],
-        typeParameters: typeParameters ?? const <TypeParameter>[],
-        requiredParameterCount: requiredParameterCount,
-        typedefType: origin);
-  }
-
-  Supertype buildSupertype(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    library.addProblem(
-        messageSupertypeIsFunction, charOffset, noLength, fileUri);
-    return null;
-  }
-
-  Supertype buildMixedInType(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    return buildSupertype(library, charOffset, fileUri);
-  }
-
-  @override
-  buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
-    return unsupported("buildInvalidType", message.charOffset, message.uri);
-  }
-
-  KernelFunctionTypeBuilder clone(List<TypeBuilder> newTypes) {
-    List<TypeVariableBuilder> clonedTypeVariables;
-    if (typeVariables != null) {
-      clonedTypeVariables = new List<TypeVariableBuilder>(typeVariables.length);
-      for (int i = 0; i < clonedTypeVariables.length; i++) {
-        clonedTypeVariables[i] = typeVariables[i].clone(newTypes);
-      }
-    }
-    List<FormalParameterBuilder> clonedFormals;
-    if (formals != null) {
-      clonedFormals = new List<FormalParameterBuilder>(formals.length);
-      for (int i = 0; i < clonedFormals.length; i++) {
-        KernelFormalParameterBuilder formal = formals[i];
-        clonedFormals[i] = formal.clone(newTypes);
-      }
-    }
-    KernelFunctionTypeBuilder newType = new KernelFunctionTypeBuilder(
-        returnType?.clone(newTypes), clonedTypeVariables, clonedFormals);
-    newTypes.add(newType);
-    return newType;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
deleted file mode 100644
index 729323f..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_invalid_type_builder.dart
+++ /dev/null
@@ -1,45 +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.
-
-library fasta.kernel_invalid_type_builder;
-
-import 'package:kernel/ast.dart' show DartType, InvalidType;
-
-import '../fasta_codes.dart' show LocatedMessage;
-
-import 'kernel_builder.dart'
-    show InvalidTypeBuilder, KernelTypeBuilder, LibraryBuilder;
-
-class KernelInvalidTypeBuilder
-    extends InvalidTypeBuilder<KernelTypeBuilder, DartType> {
-  @override
-  final LocatedMessage message;
-
-  final List<LocatedMessage> context;
-
-  final bool suppressMessage;
-
-  KernelInvalidTypeBuilder(String name, this.message,
-      {this.context, this.suppressMessage: true})
-      : super(name, message.charOffset, message.uri);
-
-  @override
-  InvalidType get target => const InvalidType();
-
-  DartType buildType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    return buildTypesWithBuiltArguments(library, null);
-  }
-
-  /// [Arguments] have already been built.
-  DartType buildTypesWithBuiltArguments(
-      LibraryBuilder library, List<DartType> arguments) {
-    if (!suppressMessage) {
-      library.addProblem(message.messageObject, message.charOffset,
-          message.length, message.uri,
-          context: context);
-    }
-    return const InvalidType();
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
deleted file mode 100644
index 06303d6..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_library_builder.dart
+++ /dev/null
@@ -1,1877 +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.
-
-library fasta.kernel_library_builder;
-
-import 'dart:convert' show jsonEncode;
-
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        Class,
-        Constructor,
-        ConstructorInvocation,
-        DartType,
-        DynamicType,
-        Expression,
-        Field,
-        FunctionNode,
-        FunctionType,
-        InterfaceType,
-        Library,
-        LibraryDependency,
-        LibraryPart,
-        ListLiteral,
-        MapLiteral,
-        Member,
-        Name,
-        Procedure,
-        ProcedureKind,
-        SetLiteral,
-        StaticInvocation,
-        StringLiteral,
-        Supertype,
-        Typedef,
-        TypeParameter,
-        TypeParameterType,
-        VariableDeclaration,
-        VoidType;
-
-import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
-
-import 'package:kernel/clone.dart' show CloneVisitor;
-
-import 'package:kernel/src/bounds_checks.dart'
-    show
-        TypeArgumentIssue,
-        findTypeArgumentIssues,
-        findTypeArgumentIssuesForInvocation,
-        getGenericTypeName;
-
-import 'package:kernel/type_algebra.dart' show substitute;
-
-import 'package:kernel/type_environment.dart' show TypeEnvironment;
-
-import '../../scanner/token.dart' show Token;
-
-import '../export.dart' show Export;
-
-import '../fasta_codes.dart'
-    show
-        FormattedMessage,
-        LocatedMessage,
-        Message,
-        messageConflictsWithTypeVariableCause,
-        messageGenericFunctionTypeInBound,
-        messageGenericFunctionTypeUsedAsActualTypeArgument,
-        messageIncorrectTypeArgumentVariable,
-        messageTypeVariableDuplicatedName,
-        messageTypeVariableSameNameAsEnclosing,
-        noLength,
-        templateConflictsWithTypeVariable,
-        templateDuplicatedExport,
-        templateDuplicatedExportInType,
-        templateDuplicatedImport,
-        templateDuplicatedImportInType,
-        templateExportHidesExport,
-        templateGenericFunctionTypeInferredAsActualTypeArgument,
-        templateImportHidesImport,
-        templateIncorrectTypeArgument,
-        templateIncorrectTypeArgumentInReturnType,
-        templateIncorrectTypeArgumentInferred,
-        templateIncorrectTypeArgumentQualified,
-        templateIncorrectTypeArgumentQualifiedInferred,
-        templateIntersectionTypeAsTypeArgument,
-        templateLoadLibraryHidesMember,
-        templateLocalDefinitionHidesExport,
-        templateLocalDefinitionHidesImport,
-        templatePatchInjectionFailed,
-        templateTypeVariableDuplicatedNameCause;
-
-import '../import.dart' show Import;
-
-import '../loader.dart' show Loader;
-
-import '../modifier.dart'
-    show
-        abstractMask,
-        hasConstConstructorMask,
-        hasInitializerMask,
-        initializingFormalMask,
-        mixinDeclarationMask,
-        namedMixinApplicationMask,
-        staticMask;
-
-import '../names.dart' show indexSetName;
-
-import '../problems.dart' show unexpected, unhandled;
-
-import '../severity.dart' show Severity;
-
-import '../source/source_class_builder.dart' show SourceClassBuilder;
-
-import '../source/source_library_builder.dart'
-    show DeclarationBuilder, SourceLibraryBuilder;
-
-import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
-
-import 'kernel_builder.dart'
-    show
-        AccessErrorBuilder,
-        BuiltinTypeBuilder,
-        ClassBuilder,
-        ConstructorReferenceBuilder,
-        Declaration,
-        DynamicTypeBuilder,
-        EnumConstantInfo,
-        FormalParameterBuilder,
-        ImplicitFieldType,
-        InvalidTypeBuilder,
-        KernelClassBuilder,
-        KernelConstructorBuilder,
-        KernelEnumBuilder,
-        KernelFieldBuilder,
-        KernelFormalParameterBuilder,
-        KernelFunctionBuilder,
-        KernelTypeAliasBuilder,
-        KernelFunctionTypeBuilder,
-        KernelInvalidTypeBuilder,
-        KernelMetadataBuilder,
-        KernelMixinApplicationBuilder,
-        KernelNamedTypeBuilder,
-        KernelProcedureBuilder,
-        KernelRedirectingFactoryBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        LoadLibraryBuilder,
-        MemberBuilder,
-        MetadataBuilder,
-        NameIterator,
-        PrefixBuilder,
-        ProcedureBuilder,
-        QualifiedName,
-        Scope,
-        TypeBuilder,
-        TypeDeclarationBuilder,
-        TypeVariableBuilder,
-        UnresolvedType,
-        VoidTypeBuilder,
-        compareProcedures,
-        toKernelCombinators;
-
-import 'metadata_collector.dart';
-
-import 'type_algorithms.dart'
-    show
-        calculateBounds,
-        findGenericFunctionTypes,
-        getNonSimplicityIssuesForDeclaration,
-        getNonSimplicityIssuesForTypeVariables;
-
-class KernelLibraryBuilder
-    extends SourceLibraryBuilder<KernelTypeBuilder, Library> {
-  final Library library;
-
-  final KernelLibraryBuilder actualOrigin;
-
-  final List<KernelFunctionBuilder> nativeMethods = <KernelFunctionBuilder>[];
-
-  final List<KernelTypeVariableBuilder> boundlessTypeVariables =
-      <KernelTypeVariableBuilder>[];
-
-  // A list of alternating forwarders and the procedures they were generated
-  // for.  Note that it may not include a forwarder-origin pair in cases when
-  // the former does not need to be updated after the body of the latter was
-  // built.
-  final List<Procedure> forwardersOrigins = <Procedure>[];
-
-  // List of types inferred in the outline.  Errors in these should be reported
-  // differently than for specified types.
-  // TODO(dmitryas):  Find a way to mark inferred types.
-  final Set<DartType> inferredTypes = new Set<DartType>.identity();
-
-  /// Exports that can't be serialized.
-  ///
-  /// The key is the name of the exported member.
-  ///
-  /// If the name is `dynamic` or `void`, this library reexports the
-  /// corresponding type from `dart:core`, and the value is null.
-  ///
-  /// Otherwise, this represents an error (an ambiguous export). In this case,
-  /// the error message is the corresponding value in the map.
-  Map<String, String> unserializableExports;
-
-  List<KernelFormalParameterBuilder> untypedInitializingFormals;
-
-  List<KernelFieldBuilder> implicitlyTypedFields;
-
-  KernelLibraryBuilder(Uri uri, Uri fileUri, Loader loader, this.actualOrigin,
-      [Scope scope, Library target])
-      : library = target ??
-            (actualOrigin?.library ?? new Library(uri, fileUri: fileUri)),
-        super(loader, fileUri, scope);
-
-  @override
-  KernelLibraryBuilder get origin => actualOrigin ?? this;
-
-  @override
-  Library get target => library;
-
-  Uri get uri => library.importUri;
-
-  void addSyntheticDeclarationOfDynamic() {
-    addBuilder(
-        "dynamic",
-        new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
-            const DynamicType(), this, -1),
-        -1);
-  }
-
-  KernelTypeBuilder addNamedType(
-      Object name, List<KernelTypeBuilder> arguments, int charOffset) {
-    return addType(new KernelNamedTypeBuilder(name, arguments), charOffset);
-  }
-
-  KernelTypeBuilder addMixinApplication(KernelTypeBuilder supertype,
-      List<KernelTypeBuilder> mixins, int charOffset) {
-    return addType(
-        new KernelMixinApplicationBuilder(supertype, mixins), charOffset);
-  }
-
-  KernelTypeBuilder addVoidType(int charOffset) {
-    return addNamedType("void", null, charOffset)
-      ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
-          const VoidType(), this, charOffset));
-  }
-
-  @override
-  FormattedMessage addProblem(
-      Message message, int charOffset, int length, Uri fileUri,
-      {bool wasHandled: false,
-      List<LocatedMessage> context,
-      Severity severity,
-      bool problemOnLibrary: false}) {
-    FormattedMessage formattedMessage = super.addProblem(
-        message, charOffset, length, fileUri,
-        wasHandled: wasHandled,
-        context: context,
-        severity: severity,
-        problemOnLibrary: true);
-    if (formattedMessage != null) {
-      target.problemsAsJson ??= <String>[];
-      target.problemsAsJson.add(formattedMessage.toJsonString());
-    }
-    return formattedMessage;
-  }
-
-  void addClass(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      String className,
-      List<TypeVariableBuilder> typeVariables,
-      KernelTypeBuilder supertype,
-      List<KernelTypeBuilder> interfaces,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset,
-      int supertypeOffset) {
-    // Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
-    var declaration = endNestedDeclaration(className)
-      ..resolveTypes(typeVariables, this);
-    assert(declaration.parent == libraryDeclaration);
-    Map<String, MemberBuilder> members = declaration.members;
-    Map<String, MemberBuilder> constructors = declaration.constructors;
-    Map<String, MemberBuilder> setters = declaration.setters;
-
-    Scope classScope = new Scope(members, setters,
-        scope.withTypeVariables(typeVariables), "class $className",
-        isModifiable: false);
-
-    // When looking up a constructor, we don't consider type variables or the
-    // library scope.
-    Scope constructorScope =
-        new Scope(constructors, null, null, className, isModifiable: false);
-    bool isMixinDeclaration = false;
-    if (modifiers & mixinDeclarationMask != 0) {
-      isMixinDeclaration = true;
-      modifiers = (modifiers & ~mixinDeclarationMask) | abstractMask;
-    }
-    if (declaration.hasConstConstructor) {
-      modifiers |= hasConstConstructorMask;
-    }
-    ClassBuilder cls = new SourceClassBuilder(
-        metadata,
-        modifiers,
-        className,
-        typeVariables,
-        applyMixins(supertype, startCharOffset, charOffset, charEndOffset,
-            className, isMixinDeclaration,
-            typeVariables: typeVariables),
-        interfaces,
-        classScope,
-        constructorScope,
-        this,
-        new List<ConstructorReferenceBuilder>.from(constructorReferences),
-        startCharOffset,
-        charOffset,
-        charEndOffset,
-        isMixinDeclaration: isMixinDeclaration);
-    loader.target.metadataCollector
-        ?.setDocumentationComment(cls.target, documentationComment);
-
-    constructorReferences.clear();
-    Map<String, TypeVariableBuilder> typeVariablesByName =
-        checkTypeVariables(typeVariables, cls);
-    void setParent(String name, MemberBuilder member) {
-      while (member != null) {
-        member.parent = cls;
-        member = member.next;
-      }
-    }
-
-    void setParentAndCheckConflicts(String name, MemberBuilder member) {
-      if (typeVariablesByName != null) {
-        TypeVariableBuilder tv = typeVariablesByName[name];
-        if (tv != null) {
-          cls.addProblem(templateConflictsWithTypeVariable.withArguments(name),
-              member.charOffset, name.length,
-              context: [
-                messageConflictsWithTypeVariableCause.withLocation(
-                    tv.fileUri, tv.charOffset, name.length)
-              ]);
-        }
-      }
-      setParent(name, member);
-    }
-
-    members.forEach(setParentAndCheckConflicts);
-    constructors.forEach(setParentAndCheckConflicts);
-    setters.forEach(setParentAndCheckConflicts);
-    addBuilder(className, cls, charOffset);
-  }
-
-  Map<String, TypeVariableBuilder> checkTypeVariables(
-      List<TypeVariableBuilder> typeVariables, Declaration owner) {
-    if (typeVariables?.isEmpty ?? true) return null;
-    Map<String, TypeVariableBuilder> typeVariablesByName =
-        <String, TypeVariableBuilder>{};
-    for (TypeVariableBuilder tv in typeVariables) {
-      TypeVariableBuilder existing = typeVariablesByName[tv.name];
-      if (existing != null) {
-        addProblem(messageTypeVariableDuplicatedName, tv.charOffset,
-            tv.name.length, fileUri,
-            context: [
-              templateTypeVariableDuplicatedNameCause
-                  .withArguments(tv.name)
-                  .withLocation(
-                      fileUri, existing.charOffset, existing.name.length)
-            ]);
-      } else {
-        typeVariablesByName[tv.name] = tv;
-        if (owner is ClassBuilder) {
-          // Only classes and type variables can't have the same name. See
-          // [#29555](https://github.com/dart-lang/sdk/issues/29555).
-          if (tv.name == owner.name) {
-            addProblem(messageTypeVariableSameNameAsEnclosing, tv.charOffset,
-                tv.name.length, fileUri);
-          }
-        }
-      }
-    }
-    return typeVariablesByName;
-  }
-
-  KernelTypeBuilder applyMixins(
-      KernelTypeBuilder type,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset,
-      String subclassName,
-      bool isMixinDeclaration,
-      {String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      int modifiers,
-      List<KernelTypeBuilder> interfaces}) {
-    if (name == null) {
-      // The following parameters should only be used when building a named
-      // mixin application.
-      if (documentationComment != null) {
-        unhandled("documentationComment", "unnamed mixin application",
-            charOffset, fileUri);
-      } else if (metadata != null) {
-        unhandled("metadata", "unnamed mixin application", charOffset, fileUri);
-      } else if (interfaces != null) {
-        unhandled(
-            "interfaces", "unnamed mixin application", charOffset, fileUri);
-      }
-    }
-    if (type is KernelMixinApplicationBuilder) {
-      // Documentation below assumes the given mixin application is in one of
-      // these forms:
-      //
-      //     class C extends S with M1, M2, M3;
-      //     class Named = S with M1, M2, M3;
-      //
-      // When we refer to the subclass, we mean `C` or `Named`.
-
-      /// The current supertype.
-      ///
-      /// Starts out having the value `S` and on each iteration of the loop
-      /// below, it will take on the value corresponding to:
-      ///
-      /// 1. `S with M1`.
-      /// 2. `(S with M1) with M2`.
-      /// 3. `((S with M1) with M2) with M3`.
-      KernelTypeBuilder supertype = type.supertype ?? loader.target.objectType;
-
-      /// The variable part of the mixin application's synthetic name. It
-      /// starts out as the name of the superclass, but is only used after it
-      /// has been combined with the name of the current mixin. In the examples
-      /// from above, it will take these values:
-      ///
-      /// 1. `S&M1`
-      /// 2. `S&M1&M2`
-      /// 3. `S&M1&M2&M3`.
-      ///
-      /// The full name of the mixin application is obtained by prepending the
-      /// name of the subclass (`C` or `Named` in the above examples) to the
-      /// running name. For the example `C`, that leads to these full names:
-      ///
-      /// 1. `_C&S&M1`
-      /// 2. `_C&S&M1&M2`
-      /// 3. `_C&S&M1&M2&M3`.
-      ///
-      /// For a named mixin application, the last name has been given by the
-      /// programmer, so for the example `Named` we see these full names:
-      ///
-      /// 1. `_Named&S&M1`
-      /// 2. `_Named&S&M1&M2`
-      /// 3. `Named`.
-      String runningName = extractName(supertype.name);
-
-      /// True when we're building a named mixin application. Notice that for
-      /// the `Named` example above, this is only true on the last
-      /// iteration because only the full mixin application is named.
-      bool isNamedMixinApplication;
-
-      /// The names of the type variables of the subclass.
-      Set<String> typeVariableNames;
-      if (typeVariables != null) {
-        typeVariableNames = new Set<String>();
-        for (TypeVariableBuilder typeVariable in typeVariables) {
-          typeVariableNames.add(typeVariable.name);
-        }
-      }
-
-      /// Helper function that returns `true` if a type variable with a name
-      /// from [typeVariableNames] is referenced in [type].
-      bool usesTypeVariables(KernelTypeBuilder type) {
-        if (type is KernelNamedTypeBuilder) {
-          if (type.declaration is KernelTypeVariableBuilder) {
-            return typeVariableNames.contains(type.declaration.name);
-          }
-
-          List<KernelTypeBuilder> typeArguments = type.arguments;
-          if (typeArguments != null && typeVariables != null) {
-            for (KernelTypeBuilder argument in typeArguments) {
-              if (usesTypeVariables(argument)) {
-                return true;
-              }
-            }
-          }
-        } else if (type is KernelFunctionTypeBuilder) {
-          if (type.formals != null) {
-            for (FormalParameterBuilder formal in type.formals) {
-              if (usesTypeVariables(formal.type)) {
-                return true;
-              }
-            }
-          }
-          return usesTypeVariables(type.returnType);
-        }
-        return false;
-      }
-
-      /// Iterate over the mixins from left to right. At the end of each
-      /// iteration, a new [supertype] is computed that is the mixin
-      /// application of [supertype] with the current mixin.
-      for (int i = 0; i < type.mixins.length; i++) {
-        KernelTypeBuilder mixin = type.mixins[i];
-        isNamedMixinApplication = name != null && mixin == type.mixins.last;
-        bool isGeneric = false;
-        if (!isNamedMixinApplication) {
-          if (supertype is KernelNamedTypeBuilder) {
-            isGeneric = isGeneric || usesTypeVariables(supertype);
-          }
-          if (mixin is KernelNamedTypeBuilder) {
-            runningName += "&${extractName(mixin.name)}";
-            isGeneric = isGeneric || usesTypeVariables(mixin);
-          }
-        }
-        String fullname =
-            isNamedMixinApplication ? name : "_$subclassName&$runningName";
-        List<TypeVariableBuilder> applicationTypeVariables;
-        List<KernelTypeBuilder> applicationTypeArguments;
-        if (isNamedMixinApplication) {
-          // If this is a named mixin application, it must be given all the
-          // declarated type variables.
-          applicationTypeVariables = typeVariables;
-        } else {
-          // Otherwise, we pass the fresh type variables to the mixin
-          // application in the same order as they're declared on the subclass.
-          if (isGeneric) {
-            this.beginNestedDeclaration("mixin application");
-
-            applicationTypeVariables =
-                copyTypeVariables(typeVariables, currentDeclaration);
-
-            List<TypeBuilder> newTypes = <TypeBuilder>[];
-            if (supertype is KernelNamedTypeBuilder &&
-                supertype.arguments != null) {
-              for (int i = 0; i < supertype.arguments.length; ++i) {
-                supertype.arguments[i] = supertype.arguments[i].clone(newTypes);
-              }
-            }
-            if (mixin is KernelNamedTypeBuilder && mixin.arguments != null) {
-              for (int i = 0; i < mixin.arguments.length; ++i) {
-                mixin.arguments[i] = mixin.arguments[i].clone(newTypes);
-              }
-            }
-            for (TypeBuilder newType in newTypes) {
-              currentDeclaration.addType(
-                  new UnresolvedType<KernelTypeBuilder>(newType, -1, null));
-            }
-
-            DeclarationBuilder mixinDeclaration =
-                this.endNestedDeclaration("mixin application");
-            mixinDeclaration.resolveTypes(applicationTypeVariables, this);
-
-            applicationTypeArguments = <KernelTypeBuilder>[];
-            for (TypeVariableBuilder typeVariable in typeVariables) {
-              applicationTypeArguments
-                  .add(addNamedType(typeVariable.name, null, charOffset)..bind(
-                      // The type variable types passed as arguments to the
-                      // generic class representing the anonymous mixin
-                      // application should refer back to the type variables of
-                      // the class that extend the anonymous mixin application.
-                      typeVariable));
-            }
-          }
-        }
-        final int computedStartCharOffset =
-            (isNamedMixinApplication ? metadata : null) == null
-                ? startCharOffset
-                : metadata.first.charOffset;
-        SourceClassBuilder application = new SourceClassBuilder(
-            isNamedMixinApplication ? metadata : null,
-            isNamedMixinApplication
-                ? modifiers | namedMixinApplicationMask
-                : abstractMask,
-            fullname,
-            applicationTypeVariables,
-            isMixinDeclaration ? null : supertype,
-            isNamedMixinApplication
-                ? interfaces
-                : isMixinDeclaration ? [supertype, mixin] : null,
-            new Scope(<String, MemberBuilder>{}, <String, MemberBuilder>{},
-                scope.withTypeVariables(typeVariables),
-                "mixin $fullname ", isModifiable: false),
-            new Scope(<String, MemberBuilder>{}, null, null, fullname,
-                isModifiable: false),
-            this,
-            <ConstructorReferenceBuilder>[],
-            computedStartCharOffset,
-            charOffset,
-            charEndOffset,
-            mixedInType: isMixinDeclaration ? null : mixin);
-        if (isNamedMixinApplication) {
-          loader.target.metadataCollector?.setDocumentationComment(
-              application.target, documentationComment);
-        }
-        // TODO(ahe, kmillikin): Should always be true?
-        // pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart can't
-        // handle that :(
-        application.cls.isAnonymousMixin = !isNamedMixinApplication;
-        addBuilder(fullname, application, charOffset);
-        supertype =
-            addNamedType(fullname, applicationTypeArguments, charOffset);
-      }
-      return supertype;
-    } else {
-      return type;
-    }
-  }
-
-  void addNamedMixinApplication(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      int modifiers,
-      KernelTypeBuilder mixinApplication,
-      List<KernelTypeBuilder> interfaces,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset) {
-    // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
-    endNestedDeclaration(name).resolveTypes(typeVariables, this);
-    KernelNamedTypeBuilder supertype = applyMixins(mixinApplication,
-        startCharOffset, charOffset, charEndOffset, name, false,
-        documentationComment: documentationComment,
-        metadata: metadata,
-        name: name,
-        typeVariables: typeVariables,
-        modifiers: modifiers,
-        interfaces: interfaces);
-    checkTypeVariables(typeVariables, supertype.declaration);
-  }
-
-  @override
-  void addField(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder type,
-      String name,
-      int charOffset,
-      int charEndOffset,
-      Token initializerToken,
-      bool hasInitializer,
-      {Token constInitializerToken}) {
-    if (hasInitializer) {
-      modifiers |= hasInitializerMask;
-    }
-    KernelFieldBuilder field = new KernelFieldBuilder(
-        metadata, type, name, modifiers, this, charOffset, charEndOffset);
-    field.constInitializerToken = constInitializerToken;
-    addBuilder(name, field, charOffset);
-    if (!legacyMode && type == null && initializerToken != null) {
-      field.target.type = new ImplicitFieldType(field, initializerToken);
-      (implicitlyTypedFields ??= <KernelFieldBuilder>[]).add(field);
-    }
-    loader.target.metadataCollector
-        ?.setDocumentationComment(field.target, documentationComment);
-  }
-
-  void addConstructor(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      final Object name,
-      String constructorName,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName,
-      {Token beginInitializers}) {
-    MetadataCollector metadataCollector = loader.target.metadataCollector;
-    KernelConstructorBuilder procedure = new KernelConstructorBuilder(
-        metadata,
-        modifiers & ~abstractMask,
-        returnType,
-        constructorName,
-        typeVariables,
-        formals,
-        this,
-        startCharOffset,
-        charOffset,
-        charOpenParenOffset,
-        charEndOffset,
-        nativeMethodName);
-    if (formals != null) {
-      for (int i = 0; i < formals.length; i++) {
-        formals[i].parent = procedure;
-      }
-    }
-    metadataCollector?.setDocumentationComment(
-        procedure.target, documentationComment);
-    metadataCollector?.setConstructorNameOffset(procedure.target, name);
-    checkTypeVariables(typeVariables, procedure);
-    addBuilder(constructorName, procedure, charOffset);
-    if (nativeMethodName != null) {
-      addNativeMethod(procedure);
-    }
-    if (procedure.isConst) {
-      currentDeclaration?.hasConstConstructor = true;
-      // const constructors will have their initializers compiled and written
-      // into the outline.
-      procedure.beginInitializers = beginInitializers;
-    }
-  }
-
-  void addProcedure(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      ProcedureKind kind,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName,
-      {bool isTopLevel}) {
-    MetadataCollector metadataCollector = loader.target.metadataCollector;
-    if (returnType == null) {
-      if (kind == ProcedureKind.Operator &&
-          identical(name, indexSetName.name)) {
-        returnType = addVoidType(charOffset);
-      } else if (kind == ProcedureKind.Setter) {
-        returnType = addVoidType(charOffset);
-      }
-    }
-    ProcedureBuilder procedure = new KernelProcedureBuilder(
-        metadata,
-        modifiers,
-        returnType,
-        name,
-        typeVariables,
-        formals,
-        kind,
-        this,
-        startCharOffset,
-        charOffset,
-        charOpenParenOffset,
-        charEndOffset,
-        nativeMethodName);
-    metadataCollector?.setDocumentationComment(
-        procedure.target, documentationComment);
-    checkTypeVariables(typeVariables, procedure);
-    addBuilder(name, procedure, charOffset);
-    if (nativeMethodName != null) {
-      addNativeMethod(procedure);
-    }
-  }
-
-  void addFactoryMethod(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      Object name,
-      List<FormalParameterBuilder> formals,
-      ConstructorReferenceBuilder redirectionTarget,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName) {
-    KernelTypeBuilder returnType = addNamedType(
-        currentDeclaration.parent.name, <KernelTypeBuilder>[], charOffset);
-    // Nested declaration began in `OutlineBuilder.beginFactoryMethod`.
-    DeclarationBuilder<KernelTypeBuilder> factoryDeclaration =
-        endNestedDeclaration("#factory_method");
-
-    // Prepare the simple procedure name.
-    String procedureName;
-    String constructorName =
-        computeAndValidateConstructorName(name, charOffset, isFactory: true);
-    if (constructorName != null) {
-      procedureName = constructorName;
-    } else {
-      procedureName = name;
-    }
-
-    KernelProcedureBuilder procedure;
-    if (redirectionTarget != null) {
-      procedure = new KernelRedirectingFactoryBuilder(
-          metadata,
-          staticMask | modifiers,
-          returnType,
-          procedureName,
-          copyTypeVariables(
-              currentDeclaration.typeVariables ?? <TypeVariableBuilder>[],
-              factoryDeclaration),
-          formals,
-          this,
-          startCharOffset,
-          charOffset,
-          charOpenParenOffset,
-          charEndOffset,
-          nativeMethodName,
-          redirectionTarget);
-    } else {
-      procedure = new KernelProcedureBuilder(
-          metadata,
-          staticMask | modifiers,
-          returnType,
-          procedureName,
-          copyTypeVariables(
-              currentDeclaration.typeVariables ?? <TypeVariableBuilder>[],
-              factoryDeclaration),
-          formals,
-          ProcedureKind.Factory,
-          this,
-          startCharOffset,
-          charOffset,
-          charOpenParenOffset,
-          charEndOffset,
-          nativeMethodName);
-    }
-
-    var metadataCollector = loader.target.metadataCollector;
-    metadataCollector?.setDocumentationComment(
-        procedure.target, documentationComment);
-    metadataCollector?.setConstructorNameOffset(procedure.target, name);
-
-    DeclarationBuilder<TypeBuilder> savedDeclaration = currentDeclaration;
-    currentDeclaration = factoryDeclaration;
-    for (TypeVariableBuilder tv in procedure.typeVariables) {
-      KernelNamedTypeBuilder t = procedure.returnType;
-      t.arguments.add(addNamedType(tv.name, null, procedure.charOffset));
-    }
-    currentDeclaration = savedDeclaration;
-
-    factoryDeclaration.resolveTypes(procedure.typeVariables, this);
-    addBuilder(procedureName, procedure, charOffset);
-    if (nativeMethodName != null) {
-      addNativeMethod(procedure);
-    }
-  }
-
-  @override
-  void addEnum(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<EnumConstantInfo> enumConstantInfos,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset) {
-    MetadataCollector metadataCollector = loader.target.metadataCollector;
-    KernelEnumBuilder builder = new KernelEnumBuilder(
-        metadataCollector,
-        metadata,
-        name,
-        enumConstantInfos,
-        this,
-        startCharOffset,
-        charOffset,
-        charEndOffset);
-    addBuilder(name, builder, charOffset);
-    metadataCollector?.setDocumentationComment(
-        builder.target, documentationComment);
-  }
-
-  void addFunctionTypeAlias(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      covariant KernelFunctionTypeBuilder type,
-      int charOffset) {
-    KernelTypeAliasBuilder typedef = new KernelTypeAliasBuilder(
-        metadata, name, typeVariables, type, this, charOffset);
-    loader.target.metadataCollector
-        ?.setDocumentationComment(typedef.target, documentationComment);
-    checkTypeVariables(typeVariables, typedef);
-    // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`.
-    endNestedDeclaration("#typedef").resolveTypes(typeVariables, this);
-    addBuilder(name, typedef, charOffset);
-  }
-
-  KernelFunctionTypeBuilder addFunctionType(
-      KernelTypeBuilder returnType,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      int charOffset) {
-    var builder =
-        new KernelFunctionTypeBuilder(returnType, typeVariables, formals);
-    checkTypeVariables(typeVariables, null);
-    // Nested declaration began in `OutlineBuilder.beginFunctionType` or
-    // `OutlineBuilder.beginFunctionTypedFormalParameter`.
-    endNestedDeclaration("#function_type").resolveTypes(typeVariables, this);
-    return addType(builder, charOffset);
-  }
-
-  KernelFormalParameterBuilder addFormalParameter(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder type,
-      String name,
-      bool hasThis,
-      int charOffset) {
-    if (hasThis) {
-      modifiers |= initializingFormalMask;
-    }
-    KernelFormalParameterBuilder formal = new KernelFormalParameterBuilder(
-        metadata, modifiers, type, name, this, charOffset);
-    if (legacyMode && hasThis && type == null) {
-      (untypedInitializingFormals ??= <KernelFormalParameterBuilder>[])
-          .add(formal);
-    }
-    return formal;
-  }
-
-  KernelTypeVariableBuilder addTypeVariable(
-      String name, KernelTypeBuilder bound, int charOffset) {
-    var builder = new KernelTypeVariableBuilder(name, this, charOffset, bound);
-    boundlessTypeVariables.add(builder);
-    return builder;
-  }
-
-  @override
-  void buildOutlineExpressions() {
-    KernelMetadataBuilder.buildAnnotations(library, metadata, this, null, null);
-  }
-
-  @override
-  void buildBuilder(Declaration declaration, LibraryBuilder coreLibrary) {
-    Class cls;
-    Member member;
-    Typedef typedef;
-    if (declaration is SourceClassBuilder) {
-      cls = declaration.build(this, coreLibrary);
-    } else if (declaration is KernelFieldBuilder) {
-      member = declaration.build(this)..isStatic = true;
-    } else if (declaration is KernelProcedureBuilder) {
-      member = declaration.build(this)..isStatic = true;
-    } else if (declaration is KernelTypeAliasBuilder) {
-      typedef = declaration.build(this);
-    } else if (declaration is KernelEnumBuilder) {
-      cls = declaration.build(this, coreLibrary);
-    } else if (declaration is PrefixBuilder) {
-      // Ignored. Kernel doesn't represent prefixes.
-      return;
-    } else if (declaration is BuiltinTypeBuilder) {
-      // Nothing needed.
-      return;
-    } else {
-      unhandled("${declaration.runtimeType}", "buildBuilder",
-          declaration.charOffset, declaration.fileUri);
-      return;
-    }
-    if (declaration.isPatch) {
-      // The kernel node of a patch is shared with the origin declaration. We
-      // have two builders: the origin, and the patch, but only one kernel node
-      // (which corresponds to the final output). Consequently, the node
-      // shouldn't be added to its apparent kernel parent as this would create
-      // a duplicate entry in the parent's list of children/members.
-      return;
-    }
-    if (cls != null) {
-      if (declaration.next != null) {
-        int count = 0;
-        Declaration current = declaration.next;
-        while (current != null) {
-          count++;
-          current = current.next;
-        }
-        cls.name += "#$count";
-      }
-      library.addClass(cls);
-    } else if (member != null) {
-      if (declaration.next == null) {
-        library.addMember(member);
-      }
-    } else if (typedef != null) {
-      if (declaration.next == null) {
-        library.addTypedef(typedef);
-      }
-    }
-  }
-
-  void addNativeDependency(String nativeImportPath) {
-    Declaration constructor = loader.getNativeAnnotation();
-    Arguments arguments =
-        new Arguments(<Expression>[new StringLiteral(nativeImportPath)]);
-    Expression annotation;
-    if (constructor.isConstructor) {
-      annotation = new ConstructorInvocation(constructor.target, arguments)
-        ..isConst = true;
-    } else {
-      annotation = new StaticInvocation(constructor.target, arguments)
-        ..isConst = true;
-    }
-    library.addAnnotation(annotation);
-  }
-
-  void addDependencies(Library library, Set<KernelLibraryBuilder> seen) {
-    if (!seen.add(this)) {
-      return;
-    }
-
-    // Merge import and export lists to have the dependencies in source order.
-    // This is required for the DietListener to correctly match up metadata.
-    int importIndex = 0;
-    int exportIndex = 0;
-    while (importIndex < imports.length || exportIndex < exports.length) {
-      if (exportIndex >= exports.length ||
-          (importIndex < imports.length &&
-              imports[importIndex].charOffset <
-                  exports[exportIndex].charOffset)) {
-        // Add import
-        Import import = imports[importIndex++];
-
-        // Rather than add a LibraryDependency, we attach an annotation.
-        if (import.nativeImportPath != null) {
-          addNativeDependency(import.nativeImportPath);
-          continue;
-        }
-
-        if (import.deferred && import.prefixBuilder?.dependency != null) {
-          library.addDependency(import.prefixBuilder.dependency);
-        } else {
-          library.addDependency(new LibraryDependency.import(
-              import.imported.target,
-              name: import.prefix,
-              combinators: toKernelCombinators(import.combinators))
-            ..fileOffset = import.charOffset);
-        }
-      } else {
-        // Add export
-        Export export = exports[exportIndex++];
-        library.addDependency(new LibraryDependency.export(
-            export.exported.target,
-            combinators: toKernelCombinators(export.combinators))
-          ..fileOffset = export.charOffset);
-      }
-    }
-
-    for (KernelLibraryBuilder part in parts) {
-      part.addDependencies(library, seen);
-    }
-  }
-
-  @override
-  void addPart(List<MetadataBuilder> metadata, String uri, int charOffset) {
-    super.addPart(metadata, uri, charOffset);
-    // TODO(ahe): [metadata] should be stored, evaluated, and added to [part].
-    LibraryPart part = new LibraryPart(<Expression>[], uri)
-      ..fileOffset = charOffset;
-    library.addPart(part);
-  }
-
-  @override
-  Library build(LibraryBuilder coreLibrary, {bool modifyTarget}) {
-    super.build(coreLibrary);
-
-    if (modifyTarget == false) return library;
-
-    library.isSynthetic = isSynthetic;
-    addDependencies(library, new Set<KernelLibraryBuilder>());
-
-    loader.target.metadataCollector
-        ?.setDocumentationComment(library, documentationComment);
-
-    library.name = name;
-    library.procedures.sort(compareProcedures);
-
-    if (unserializableExports != null) {
-      library.addMember(new Field(new Name("_exports#", library),
-          initializer: new StringLiteral(jsonEncode(unserializableExports)),
-          isStatic: true,
-          isConst: true));
-    }
-
-    return library;
-  }
-
-  @override
-  Declaration computeAmbiguousDeclaration(
-      String name, Declaration declaration, Declaration other, int charOffset,
-      {bool isExport: false, bool isImport: false}) {
-    // TODO(ahe): Can I move this to Scope or Prefix?
-    if (declaration == other) return declaration;
-    if (declaration is InvalidTypeBuilder) return declaration;
-    if (other is InvalidTypeBuilder) return other;
-    if (declaration is AccessErrorBuilder) {
-      AccessErrorBuilder error = declaration;
-      declaration = error.builder;
-    }
-    if (other is AccessErrorBuilder) {
-      AccessErrorBuilder error = other;
-      other = error.builder;
-    }
-    bool isLocal = false;
-    bool isLoadLibrary = false;
-    Declaration preferred;
-    Uri uri;
-    Uri otherUri;
-    Uri preferredUri;
-    Uri hiddenUri;
-    if (scope.local[name] == declaration) {
-      isLocal = true;
-      preferred = declaration;
-      hiddenUri = computeLibraryUri(other);
-    } else {
-      uri = computeLibraryUri(declaration);
-      otherUri = computeLibraryUri(other);
-      if (declaration is LoadLibraryBuilder) {
-        isLoadLibrary = true;
-        preferred = declaration;
-        preferredUri = otherUri;
-      } else if (other is LoadLibraryBuilder) {
-        isLoadLibrary = true;
-        preferred = other;
-        preferredUri = uri;
-      } else if (otherUri?.scheme == "dart" && uri?.scheme != "dart") {
-        preferred = declaration;
-        preferredUri = uri;
-        hiddenUri = otherUri;
-      } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") {
-        preferred = other;
-        preferredUri = otherUri;
-        hiddenUri = uri;
-      }
-    }
-    if (preferred != null) {
-      if (isLocal) {
-        var template = isExport
-            ? templateLocalDefinitionHidesExport
-            : templateLocalDefinitionHidesImport;
-        addProblem(template.withArguments(name, hiddenUri), charOffset,
-            noLength, fileUri);
-      } else if (isLoadLibrary) {
-        addProblem(templateLoadLibraryHidesMember.withArguments(preferredUri),
-            charOffset, noLength, fileUri);
-      } else {
-        var template =
-            isExport ? templateExportHidesExport : templateImportHidesImport;
-        addProblem(template.withArguments(name, preferredUri, hiddenUri),
-            charOffset, noLength, fileUri);
-      }
-      return preferred;
-    }
-    if (declaration.next == null && other.next == null) {
-      if (isImport && declaration is PrefixBuilder && other is PrefixBuilder) {
-        // Handles the case where the same prefix is used for different
-        // imports.
-        return declaration
-          ..exportScope.merge(other.exportScope,
-              (String name, Declaration existing, Declaration member) {
-            return computeAmbiguousDeclaration(
-                name, existing, member, charOffset,
-                isExport: isExport, isImport: isImport);
-          });
-      }
-    }
-    var template =
-        isExport ? templateDuplicatedExport : templateDuplicatedImport;
-    Message message = template.withArguments(name, uri, otherUri);
-    addProblem(message, charOffset, noLength, fileUri);
-    var builderTemplate = isExport
-        ? templateDuplicatedExportInType
-        : templateDuplicatedImportInType;
-    message = builderTemplate.withArguments(
-        name,
-        // TODO(ahe): We should probably use a context object here
-        // instead of including URIs in this message.
-        uri,
-        otherUri);
-    // We report the error lazily (setting suppressMessage to false) because the
-    // spec 18.1 states that 'It is not an error if N is introduced by two or
-    // more imports but never referred to.'
-    return new KernelInvalidTypeBuilder(
-        name, message.withLocation(fileUri, charOffset, name.length),
-        suppressMessage: false);
-  }
-
-  int finishDeferredLoadTearoffs() {
-    int total = 0;
-    for (var import in imports) {
-      if (import.deferred) {
-        Procedure tearoff = import.prefixBuilder.loadLibraryBuilder.tearoff;
-        if (tearoff != null) library.addMember(tearoff);
-        total++;
-      }
-    }
-    return total;
-  }
-
-  int finishForwarders() {
-    int count = 0;
-    CloneVisitor cloner = new CloneVisitor();
-    for (int i = 0; i < forwardersOrigins.length; i += 2) {
-      Procedure forwarder = forwardersOrigins[i];
-      Procedure origin = forwardersOrigins[i + 1];
-
-      int positionalCount = origin.function.positionalParameters.length;
-      if (forwarder.function.positionalParameters.length != positionalCount) {
-        return unexpected(
-            "$positionalCount",
-            "${forwarder.function.positionalParameters.length}",
-            origin.fileOffset,
-            origin.fileUri);
-      }
-      for (int j = 0; j < positionalCount; ++j) {
-        VariableDeclaration forwarderParameter =
-            forwarder.function.positionalParameters[j];
-        VariableDeclaration originParameter =
-            origin.function.positionalParameters[j];
-        if (originParameter.initializer != null) {
-          forwarderParameter.initializer =
-              cloner.clone(originParameter.initializer);
-          forwarderParameter.initializer.parent = forwarderParameter;
-        }
-      }
-
-      Map<String, VariableDeclaration> originNamedMap =
-          <String, VariableDeclaration>{};
-      for (VariableDeclaration originNamed in origin.function.namedParameters) {
-        originNamedMap[originNamed.name] = originNamed;
-      }
-      for (VariableDeclaration forwarderNamed
-          in forwarder.function.namedParameters) {
-        VariableDeclaration originNamed = originNamedMap[forwarderNamed.name];
-        if (originNamed == null) {
-          return unhandled(
-              "null", forwarder.name.name, origin.fileOffset, origin.fileUri);
-        }
-        if (originNamed.initializer == null) continue;
-        forwarderNamed.initializer = cloner.clone(originNamed.initializer);
-        forwarderNamed.initializer.parent = forwarderNamed;
-      }
-
-      ++count;
-    }
-    forwardersOrigins.clear();
-    return count;
-  }
-
-  void addNativeMethod(KernelFunctionBuilder method) {
-    nativeMethods.add(method);
-  }
-
-  int finishNativeMethods() {
-    for (KernelFunctionBuilder method in nativeMethods) {
-      method.becomeNative(loader);
-    }
-    return nativeMethods.length;
-  }
-
-  List<TypeVariableBuilder> copyTypeVariables(
-      List<TypeVariableBuilder> original, DeclarationBuilder declaration) {
-    List<TypeBuilder> newTypes = <TypeBuilder>[];
-    List<TypeVariableBuilder> copy = <TypeVariableBuilder>[];
-    for (KernelTypeVariableBuilder variable in original) {
-      var newVariable = new KernelTypeVariableBuilder(variable.name, this,
-          variable.charOffset, variable.bound?.clone(newTypes));
-      copy.add(newVariable);
-      boundlessTypeVariables.add(newVariable);
-    }
-    for (TypeBuilder newType in newTypes) {
-      declaration
-          .addType(new UnresolvedType<KernelTypeBuilder>(newType, -1, null));
-    }
-    return copy;
-  }
-
-  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
-    int count = boundlessTypeVariables.length;
-    for (KernelTypeVariableBuilder builder in boundlessTypeVariables) {
-      builder.finish(this, object, dynamicType);
-    }
-    boundlessTypeVariables.clear();
-    return count;
-  }
-
-  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
-      ClassBuilder objectClass) {
-    int count = 0;
-
-    int computeDefaultTypesForVariables(
-        List<TypeVariableBuilder<TypeBuilder, Object>> variables,
-        bool legacyMode) {
-      if (variables == null) return 0;
-
-      bool haveErroneousBounds = false;
-      if (!legacyMode) {
-        for (int i = 0; i < variables.length; ++i) {
-          TypeVariableBuilder<TypeBuilder, Object> variable = variables[i];
-          List<TypeBuilder> genericFunctionTypes = <TypeBuilder>[];
-          findGenericFunctionTypes(variable.bound,
-              result: genericFunctionTypes);
-          if (genericFunctionTypes.length > 0) {
-            haveErroneousBounds = true;
-            addProblem(messageGenericFunctionTypeInBound, variable.charOffset,
-                variable.name.length, variable.fileUri);
-          }
-        }
-
-        if (!haveErroneousBounds) {
-          List<KernelTypeBuilder> calculatedBounds =
-              calculateBounds(variables, dynamicType, bottomType, objectClass);
-          for (int i = 0; i < variables.length; ++i) {
-            variables[i].defaultType = calculatedBounds[i];
-          }
-        }
-      }
-
-      if (legacyMode || haveErroneousBounds) {
-        // In Dart 1, put `dynamic` everywhere.
-        for (int i = 0; i < variables.length; ++i) {
-          variables[i].defaultType = dynamicType;
-        }
-      }
-
-      return variables.length;
-    }
-
-    void reportIssues(List<Object> issues) {
-      for (int i = 0; i < issues.length; i += 3) {
-        TypeDeclarationBuilder<TypeBuilder, Object> declaration = issues[i];
-        Message message = issues[i + 1];
-        List<LocatedMessage> context = issues[i + 2];
-
-        addProblem(message, declaration.charOffset, declaration.name.length,
-            declaration.fileUri,
-            context: context);
-      }
-    }
-
-    bool legacyMode = loader.target.legacyMode;
-    for (var declaration in libraryDeclaration.members.values) {
-      if (declaration is KernelClassBuilder) {
-        {
-          List<Object> issues = legacyMode
-              ? const <Object>[]
-              : getNonSimplicityIssuesForDeclaration(declaration,
-                  performErrorRecovery: true);
-          reportIssues(issues);
-          // In case of issues, use legacy mode for error recovery.
-          count += computeDefaultTypesForVariables(
-              declaration.typeVariables, legacyMode || issues.isNotEmpty);
-        }
-        declaration.forEach((String name, Declaration member) {
-          if (member is KernelProcedureBuilder) {
-            List<Object> issues = legacyMode
-                ? const <Object>[]
-                : getNonSimplicityIssuesForTypeVariables(member.typeVariables);
-            reportIssues(issues);
-            // In case of issues, use legacy mode for error recovery.
-            count += computeDefaultTypesForVariables(
-                member.typeVariables, legacyMode || issues.isNotEmpty);
-          }
-        });
-      } else if (declaration is KernelTypeAliasBuilder) {
-        List<Object> issues = legacyMode
-            ? const <Object>[]
-            : getNonSimplicityIssuesForDeclaration(declaration,
-                performErrorRecovery: true);
-        reportIssues(issues);
-        // In case of issues, use legacy mode for error recovery.
-        count += computeDefaultTypesForVariables(
-            declaration.typeVariables, legacyMode || issues.isNotEmpty);
-      } else if (declaration is KernelFunctionBuilder) {
-        List<Object> issues = legacyMode
-            ? const <Object>[]
-            : getNonSimplicityIssuesForTypeVariables(declaration.typeVariables);
-        reportIssues(issues);
-        // In case of issues, use legacy mode for error recovery.
-        count += computeDefaultTypesForVariables(
-            declaration.typeVariables, legacyMode || issues.isNotEmpty);
-      }
-    }
-
-    return count;
-  }
-
-  @override
-  bool includePart(
-      covariant KernelLibraryBuilder part, Set<Uri> usedParts, int partOffset) {
-    if (!super.includePart(part, usedParts, partOffset)) return false;
-    nativeMethods.addAll(part.nativeMethods);
-    boundlessTypeVariables.addAll(part.boundlessTypeVariables);
-    // Check that the targets are different. This is not normally a problem
-    // but is for patch files.
-    if (target != part.target && part.target.problemsAsJson != null) {
-      target.problemsAsJson ??= <String>[];
-      target.problemsAsJson.addAll(part.target.problemsAsJson);
-    }
-    List<KernelFieldBuilder> partImplicitlyTypedFields =
-        part.takeImplicitlyTypedFields();
-    if (partImplicitlyTypedFields != null) {
-      if (implicitlyTypedFields == null) {
-        implicitlyTypedFields = partImplicitlyTypedFields;
-      } else {
-        implicitlyTypedFields.addAll(partImplicitlyTypedFields);
-      }
-    }
-    return true;
-  }
-
-  @override
-  void addImportsToScope() {
-    super.addImportsToScope();
-    exportScope.forEach((String name, Declaration member) {
-      if (member.parent != this) {
-        switch (name) {
-          case "dynamic":
-          case "void":
-            unserializableExports ??= <String, String>{};
-            unserializableExports[name] = null;
-            break;
-
-          default:
-            if (member is InvalidTypeBuilder) {
-              unserializableExports ??= <String, String>{};
-              unserializableExports[name] = member.message.message;
-            } else {
-              // Eventually (in #buildBuilder) members aren't added to the
-              // library if the have 'next' pointers, so don't add them as
-              // additionalExports either. Add the last one only (the one that
-              // will eventually be added to the library).
-              Declaration memberLast = member;
-              while (memberLast.next != null) memberLast = memberLast.next;
-              library.additionalExports.add(memberLast.target.reference);
-            }
-        }
-      }
-    });
-  }
-
-  @override
-  void applyPatches() {
-    if (!isPatch) return;
-    NameIterator originDeclarations = origin.nameIterator;
-    while (originDeclarations.moveNext()) {
-      String name = originDeclarations.name;
-      Declaration member = originDeclarations.current;
-      bool isSetter = member.isSetter;
-      Declaration patch = isSetter ? scope.setters[name] : scope.local[name];
-      if (patch != null) {
-        // [patch] has the same name as a [member] in [origin] library, so it
-        // must be a patch to [member].
-        member.applyPatch(patch);
-        // TODO(ahe): Verify that patch has the @patch annotation.
-      } else {
-        // No member with [name] exists in this library already. So we need to
-        // import it into the patch library. This ensures that the origin
-        // library is in scope of the patch library.
-        if (isSetter) {
-          scopeBuilder.addSetter(name, member);
-        } else {
-          scopeBuilder.addMember(name, member);
-        }
-      }
-    }
-    NameIterator patchDeclarations = nameIterator;
-    while (patchDeclarations.moveNext()) {
-      String name = patchDeclarations.name;
-      Declaration member = patchDeclarations.current;
-      // We need to inject all non-patch members into the origin library. This
-      // should only apply to private members.
-      if (member.isPatch) {
-        // Ignore patches.
-      } else if (name.startsWith("_")) {
-        origin.injectMemberFromPatch(name, member);
-      } else {
-        origin.exportMemberFromPatch(name, member);
-      }
-    }
-  }
-
-  int finishPatchMethods() {
-    if (!isPatch) return 0;
-    int count = 0;
-    Iterator<Declaration> iterator = this.iterator;
-    while (iterator.moveNext()) {
-      count += iterator.current.finishPatch();
-    }
-    return count;
-  }
-
-  void injectMemberFromPatch(String name, Declaration member) {
-    if (member.isSetter) {
-      assert(scope.setters[name] == null);
-      scopeBuilder.addSetter(name, member);
-    } else {
-      assert(scope.local[name] == null);
-      scopeBuilder.addMember(name, member);
-    }
-  }
-
-  void exportMemberFromPatch(String name, Declaration member) {
-    if (uri.scheme != "dart" || !uri.path.startsWith("_")) {
-      addProblem(templatePatchInjectionFailed.withArguments(name, uri),
-          member.charOffset, noLength, member.fileUri);
-    }
-    // Platform-private libraries, such as "dart:_internal" have special
-    // semantics: public members are injected into the origin library.
-    // TODO(ahe): See if we can remove this special case.
-
-    // If this member already exist in the origin library scope, it should
-    // have been marked as patch.
-    assert((member.isSetter && scope.setters[name] == null) ||
-        (!member.isSetter && scope.local[name] == null));
-    addToExportScope(name, member);
-  }
-
-  void reportTypeArgumentIssues(
-      List<TypeArgumentIssue> issues, Uri fileUri, int offset,
-      {bool inferred, DartType targetReceiver, String targetName}) {
-    for (TypeArgumentIssue issue in issues) {
-      DartType argument = issue.argument;
-      TypeParameter typeParameter = issue.typeParameter;
-
-      Message message;
-      bool issueInferred = inferred ?? inferredTypes.contains(argument);
-      if (argument is FunctionType && argument.typeParameters.length > 0) {
-        if (issueInferred) {
-          message = templateGenericFunctionTypeInferredAsActualTypeArgument
-              .withArguments(argument);
-        } else {
-          message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-        }
-        typeParameter = null;
-      } else if (argument is TypeParameterType &&
-          argument.promotedBound != null) {
-        addProblem(
-            templateIntersectionTypeAsTypeArgument.withArguments(
-                typeParameter.name, argument, argument.promotedBound),
-            offset,
-            noLength,
-            fileUri);
-        continue;
-      } else {
-        if (issue.enclosingType == null && targetReceiver != null) {
-          if (issueInferred) {
-            message =
-                templateIncorrectTypeArgumentQualifiedInferred.withArguments(
-                    argument,
-                    typeParameter.bound,
-                    typeParameter.name,
-                    targetReceiver,
-                    targetName);
-          } else {
-            message = templateIncorrectTypeArgumentQualified.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                targetReceiver,
-                targetName);
-          }
-        } else {
-          String enclosingName = issue.enclosingType == null
-              ? targetName
-              : getGenericTypeName(issue.enclosingType);
-          assert(enclosingName != null);
-          if (issueInferred) {
-            message = templateIncorrectTypeArgumentInferred.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                enclosingName);
-          } else {
-            message = templateIncorrectTypeArgument.withArguments(argument,
-                typeParameter.bound, typeParameter.name, enclosingName);
-          }
-        }
-      }
-
-      reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
-    }
-  }
-
-  void reportTypeArgumentIssue(Message message, Uri fileUri, int fileOffset,
-      TypeParameter typeParameter) {
-    List<LocatedMessage> context;
-    if (typeParameter != null && typeParameter.fileOffset != -1) {
-      // It looks like when parameters come from patch files, they don't
-      // have a reportable location.
-      context = <LocatedMessage>[
-        messageIncorrectTypeArgumentVariable.withLocation(
-            typeParameter.location.file, typeParameter.fileOffset, noLength)
-      ];
-    }
-    addProblem(message, fileOffset, noLength, fileUri, context: context);
-  }
-
-  void checkBoundsInField(Field field, TypeEnvironment typeEnvironment) {
-    if (loader.target.legacyMode) return;
-    checkBoundsInType(
-        field.type, typeEnvironment, field.fileUri, field.fileOffset,
-        allowSuperBounded: true);
-  }
-
-  void checkBoundsInFunctionNodeParts(
-      TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
-      {List<TypeParameter> typeParameters,
-      List<VariableDeclaration> positionalParameters,
-      List<VariableDeclaration> namedParameters,
-      DartType returnType}) {
-    if (loader.target.legacyMode) return;
-    if (typeParameters != null) {
-      for (TypeParameter parameter in typeParameters) {
-        checkBoundsInType(
-            parameter.bound, typeEnvironment, fileUri, parameter.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (positionalParameters != null) {
-      for (VariableDeclaration formal in positionalParameters) {
-        checkBoundsInType(
-            formal.type, typeEnvironment, fileUri, formal.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (namedParameters != null) {
-      for (VariableDeclaration named in namedParameters) {
-        checkBoundsInType(
-            named.type, typeEnvironment, fileUri, named.fileOffset,
-            allowSuperBounded: true);
-      }
-    }
-    if (returnType != null) {
-      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-          returnType, typeEnvironment,
-          allowSuperBounded: true);
-      if (issues != null) {
-        int offset = fileOffset;
-        for (TypeArgumentIssue issue in issues) {
-          DartType argument = issue.argument;
-          TypeParameter typeParameter = issue.typeParameter;
-
-          // We don't need to check if [argument] was inferred or specified
-          // here, because inference in return types boils down to instantiate-
-          // -to-bound, and it can't provide a type that violates the bound.
-          Message message;
-          if (argument is FunctionType && argument.typeParameters.length > 0) {
-            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
-            typeParameter = null;
-          } else {
-            message = templateIncorrectTypeArgumentInReturnType.withArguments(
-                argument,
-                typeParameter.bound,
-                typeParameter.name,
-                getGenericTypeName(issue.enclosingType));
-          }
-
-          reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
-        }
-      }
-    }
-  }
-
-  void checkBoundsInFunctionNode(
-      FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri) {
-    if (loader.target.legacyMode) return;
-    checkBoundsInFunctionNodeParts(
-        typeEnvironment, fileUri, function.fileOffset,
-        typeParameters: function.typeParameters,
-        positionalParameters: function.positionalParameters,
-        namedParameters: function.namedParameters,
-        returnType: function.returnType);
-  }
-
-  void checkBoundsInListLiteral(
-      ListLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    checkBoundsInType(
-        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInSetLiteral(
-      SetLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    checkBoundsInType(
-        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInMapLiteral(
-      MapLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    checkBoundsInType(node.keyType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-    checkBoundsInType(node.valueType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInType(
-      DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
-      {bool inferred, bool allowSuperBounded = true}) {
-    if (loader.target.legacyMode) return;
-    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
-        type, typeEnvironment,
-        allowSuperBounded: allowSuperBounded);
-    if (issues != null) {
-      reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
-    }
-  }
-
-  void checkBoundsInVariableDeclaration(
-      VariableDeclaration node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    if (node.type == null) return;
-    checkBoundsInType(node.type, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: true);
-  }
-
-  void checkBoundsInConstructorInvocation(
-      ConstructorInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    if (node.arguments.types.isEmpty) return;
-    Constructor constructor = node.target;
-    Class klass = constructor.enclosingClass;
-    DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    checkBoundsInType(
-        constructedType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: false);
-  }
-
-  void checkBoundsInFactoryInvocation(
-      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    if (node.arguments.types.isEmpty) return;
-    Procedure factory = node.target;
-    assert(factory.isFactory);
-    Class klass = factory.enclosingClass;
-    DartType constructedType = new InterfaceType(klass, node.arguments.types);
-    checkBoundsInType(
-        constructedType, typeEnvironment, fileUri, node.fileOffset,
-        inferred: inferred, allowSuperBounded: false);
-  }
-
-  void checkBoundsInStaticInvocation(
-      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    if (node.arguments.types.isEmpty) return;
-    Class klass = node.target.enclosingClass;
-    List<TypeParameter> parameters = node.target.function.typeParameters;
-    List<DartType> arguments = node.arguments.types;
-    // The following error is to be reported elsewhere.
-    if (parameters.length != arguments.length) return;
-    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
-        parameters, arguments, typeEnvironment);
-    if (issues != null) {
-      DartType targetReceiver;
-      if (klass != null) {
-        targetReceiver = new InterfaceType(klass);
-      }
-      String targetName = node.target.name.name;
-      reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
-          inferred: inferred,
-          targetReceiver: targetReceiver,
-          targetName: targetName);
-    }
-  }
-
-  void checkBoundsInMethodInvocation(
-      DartType receiverType,
-      TypeEnvironment typeEnvironment,
-      ClassHierarchy hierarchy,
-      TypeInferrerImpl typeInferrer,
-      Name name,
-      Member interfaceTarget,
-      Arguments arguments,
-      Uri fileUri,
-      int offset,
-      {bool inferred = false}) {
-    if (loader.target.legacyMode) return;
-    if (arguments.types.isEmpty) return;
-    Class klass;
-    List<DartType> receiverTypeArguments;
-    if (receiverType is InterfaceType) {
-      klass = receiverType.classNode;
-      receiverTypeArguments = receiverType.typeArguments;
-    } else {
-      return;
-    }
-    // TODO(dmitryas): Find a better way than relying on [interfaceTarget].
-    Member method = hierarchy.getDispatchTarget(klass, name) ?? interfaceTarget;
-    if (method == null || method is! Procedure) {
-      return;
-    }
-    if (klass != method.enclosingClass) {
-      Supertype parent =
-          hierarchy.getClassAsInstanceOf(klass, method.enclosingClass);
-      klass = method.enclosingClass;
-      receiverTypeArguments = parent.typeArguments;
-    }
-    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
-    for (int i = 0; i < receiverTypeArguments.length; ++i) {
-      substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
-    }
-    List<TypeParameter> methodParameters = method.function.typeParameters;
-    // The error is to be reported elsewhere.
-    if (methodParameters.length != arguments.types.length) return;
-    List<TypeParameter> instantiatedMethodParameters =
-        new List<TypeParameter>.filled(methodParameters.length, null);
-    for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
-      instantiatedMethodParameters[i] =
-          new TypeParameter(methodParameters[i].name);
-      substitutionMap[methodParameters[i]] =
-          new TypeParameterType(instantiatedMethodParameters[i]);
-    }
-    for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
-      instantiatedMethodParameters[i].bound =
-          substitute(methodParameters[i].bound, substitutionMap);
-    }
-    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
-        instantiatedMethodParameters, arguments.types, typeEnvironment);
-    if (issues != null) {
-      reportTypeArgumentIssues(issues, fileUri, offset,
-          inferred: inferred,
-          targetReceiver: receiverType,
-          targetName: name.name);
-    }
-  }
-
-  void checkBoundsInOutline(TypeEnvironment typeEnvironment) {
-    if (loader.target.legacyMode) return;
-    Iterator<Declaration> iterator = this.iterator;
-    while (iterator.moveNext()) {
-      Declaration declaration = iterator.current;
-      if (declaration is KernelFieldBuilder) {
-        checkBoundsInField(declaration.target, typeEnvironment);
-      } else if (declaration is KernelProcedureBuilder) {
-        checkBoundsInFunctionNode(
-            declaration.target.function, typeEnvironment, declaration.fileUri);
-      } else if (declaration is KernelClassBuilder) {
-        declaration.checkBoundsInOutline(typeEnvironment);
-      }
-    }
-    inferredTypes.clear();
-  }
-
-  @override
-  int finalizeInitializingFormals() {
-    if (!legacyMode || untypedInitializingFormals == null) return 0;
-    for (int i = 0; i < untypedInitializingFormals.length; i++) {
-      untypedInitializingFormals[i].finalizeInitializingFormal();
-    }
-    int count = untypedInitializingFormals.length;
-    untypedInitializingFormals = null;
-    return count;
-  }
-
-  @override
-  List<KernelFieldBuilder> takeImplicitlyTypedFields() {
-    List<KernelFieldBuilder> result = implicitlyTypedFields;
-    implicitlyTypedFields = null;
-    return result;
-  }
-}
-
-Uri computeLibraryUri(Declaration declaration) {
-  Declaration current = declaration;
-  do {
-    if (current is LibraryBuilder) return current.uri;
-    current = current.parent;
-  } while (current != null);
-  return unhandled("no library parent", "${declaration.runtimeType}",
-      declaration.charOffset, declaration.fileUri);
-}
-
-String extractName(name) => name is QualifiedName ? name.name : name;
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
deleted file mode 100644
index 81970a0..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_metadata_builder.dart
+++ /dev/null
@@ -1,50 +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.
-
-library fasta.kernel_metadata_builder;
-
-import 'package:kernel/ast.dart' show Annotatable, Class, Library;
-
-import 'kernel_body_builder.dart' show KernelBodyBuilder;
-
-import 'kernel_builder.dart'
-    show
-        KernelClassBuilder,
-        KernelLibraryBuilder,
-        MetadataBuilder,
-        MemberBuilder;
-
-import '../scanner.dart' show Token;
-
-import '../scope.dart' show Scope;
-
-class KernelMetadataBuilder extends MetadataBuilder {
-  final Token beginToken;
-
-  int get charOffset => beginToken.charOffset;
-
-  KernelMetadataBuilder(this.beginToken);
-
-  static void buildAnnotations(
-      Annotatable parent,
-      List<MetadataBuilder> metadata,
-      KernelLibraryBuilder library,
-      KernelClassBuilder classBuilder,
-      MemberBuilder member) {
-    if (metadata == null) return;
-    Uri fileUri = member?.fileUri ?? classBuilder?.fileUri ?? library.fileUri;
-    Scope scope = parent is Library || parent is Class || classBuilder == null
-        ? library.scope
-        : classBuilder.scope;
-    KernelBodyBuilder bodyBuilder = new KernelBodyBuilder.forOutlineExpression(
-        library, classBuilder, member, scope, fileUri);
-    for (int i = 0; i < metadata.length; ++i) {
-      KernelMetadataBuilder annotationBuilder = metadata[i];
-      parent.addAnnotation(
-          bodyBuilder.parseAnnotation(annotationBuilder.beginToken));
-    }
-    bodyBuilder.inferAnnotations(parent.annotations);
-    bodyBuilder.resolveRedirectingFactoryTargets();
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
deleted file mode 100644
index c0ab216..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_mixin_application_builder.dart
+++ /dev/null
@@ -1,62 +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.
-
-library fasta.kernel_mixin_application_builder;
-
-import 'package:kernel/ast.dart' show InterfaceType, Supertype;
-
-import '../fasta_codes.dart' show LocatedMessage;
-
-import '../problems.dart' show unsupported;
-
-import 'kernel_builder.dart'
-    show
-        KernelTypeBuilder,
-        LibraryBuilder,
-        MixinApplicationBuilder,
-        TypeBuilder,
-        TypeVariableBuilder;
-
-class KernelMixinApplicationBuilder
-    extends MixinApplicationBuilder<KernelTypeBuilder>
-    implements KernelTypeBuilder {
-  Supertype builtType;
-
-  List<TypeVariableBuilder> typeVariables;
-
-  KernelMixinApplicationBuilder(
-      KernelTypeBuilder supertype, List<KernelTypeBuilder> mixins)
-      : assert(mixins != null),
-        super(supertype, mixins);
-
-  @override
-  InterfaceType build(LibraryBuilder library) {
-    int charOffset = -1; // TODO(ahe): Provide these.
-    Uri fileUri = null; // TODO(ahe): Provide these.
-    return unsupported("build", charOffset, fileUri);
-  }
-
-  @override
-  Supertype buildSupertype(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    return unsupported("buildSupertype", charOffset, fileUri);
-  }
-
-  @override
-  Supertype buildMixedInType(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    return unsupported("buildMixedInType", charOffset, fileUri);
-  }
-
-  @override
-  buildInvalidType(LocatedMessage message, {List<LocatedMessage> context}) {
-    return unsupported("buildInvalidType", message.charOffset, message.uri);
-  }
-
-  KernelMixinApplicationBuilder clone(List<TypeBuilder> newTypes) {
-    int charOffset = -1; // TODO(dmitryas): Provide these.
-    Uri fileUri = null; // TODO(dmitryas): Provide these.
-    return unsupported("clone", charOffset, fileUri);
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
deleted file mode 100644
index b548eec..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_named_type_builder.dart
+++ /dev/null
@@ -1,132 +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.
-
-library fasta.kernel_interface_type_builder;
-
-import 'package:kernel/ast.dart' show DartType, Supertype;
-
-import '../fasta_codes.dart' show LocatedMessage;
-
-import '../messages.dart'
-    show noLength, templateSupertypeIsIllegal, templateSupertypeIsTypeVariable;
-
-import '../severity.dart' show Severity;
-
-import 'kernel_builder.dart'
-    show
-        KernelClassBuilder,
-        KernelInvalidTypeBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        NamedTypeBuilder,
-        TypeBuilder,
-        TypeDeclarationBuilder,
-        TypeVariableBuilder,
-        flattenName;
-
-class KernelNamedTypeBuilder
-    extends NamedTypeBuilder<KernelTypeBuilder, DartType>
-    implements KernelTypeBuilder {
-  KernelNamedTypeBuilder(Object name, List<KernelTypeBuilder> arguments)
-      : super(name, arguments);
-
-  KernelInvalidTypeBuilder buildInvalidType(LocatedMessage message,
-      {List<LocatedMessage> context}) {
-    // TODO(ahe): Consider if it makes sense to pass a QualifiedName to
-    // KernelInvalidTypeBuilder?
-    return new KernelInvalidTypeBuilder(
-        flattenName(name, message.charOffset, message.uri), message,
-        context: context);
-  }
-
-  Supertype handleInvalidSupertype(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    var template = declaration.isTypeVariable
-        ? templateSupertypeIsTypeVariable
-        : templateSupertypeIsIllegal;
-    library.addProblem(
-        template.withArguments(flattenName(name, charOffset, fileUri)),
-        charOffset,
-        noLength,
-        fileUri);
-    return null;
-  }
-
-  DartType build(LibraryBuilder library) {
-    return declaration.buildType(library, arguments);
-  }
-
-  Supertype buildSupertype(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    TypeDeclarationBuilder declaration = this.declaration;
-    if (declaration is KernelClassBuilder) {
-      return declaration.buildSupertype(library, arguments);
-    } else if (declaration is KernelInvalidTypeBuilder) {
-      library.addProblem(
-          declaration.message.messageObject,
-          declaration.message.charOffset,
-          declaration.message.length,
-          declaration.message.uri,
-          severity: Severity.error);
-      return null;
-    } else {
-      return handleInvalidSupertype(library, charOffset, fileUri);
-    }
-  }
-
-  Supertype buildMixedInType(
-      LibraryBuilder library, int charOffset, Uri fileUri) {
-    TypeDeclarationBuilder declaration = this.declaration;
-    if (declaration is KernelClassBuilder) {
-      return declaration.buildMixedInType(library, arguments);
-    } else if (declaration is KernelInvalidTypeBuilder) {
-      library.addProblem(
-          declaration.message.messageObject,
-          declaration.message.charOffset,
-          declaration.message.length,
-          declaration.message.uri,
-          severity: Severity.error);
-      return null;
-    } else {
-      return handleInvalidSupertype(library, charOffset, fileUri);
-    }
-  }
-
-  TypeBuilder subst(Map<TypeVariableBuilder, TypeBuilder> substitution) {
-    TypeBuilder result = substitution[declaration];
-    if (result != null) {
-      assert(declaration is TypeVariableBuilder);
-      return result;
-    } else if (arguments != null) {
-      List<KernelTypeBuilder> arguments;
-      int i = 0;
-      for (KernelTypeBuilder argument in this.arguments) {
-        KernelTypeBuilder type = argument.subst(substitution);
-        if (type != argument) {
-          arguments ??= this.arguments.toList();
-          arguments[i] = type;
-        }
-        i++;
-      }
-      if (arguments != null) {
-        return new KernelNamedTypeBuilder(name, arguments)..bind(declaration);
-      }
-    }
-    return this;
-  }
-
-  KernelNamedTypeBuilder clone(List<TypeBuilder> newTypes) {
-    List<KernelTypeBuilder> clonedArguments;
-    if (arguments != null) {
-      clonedArguments = new List<KernelTypeBuilder>(arguments.length);
-      for (int i = 0; i < clonedArguments.length; i++) {
-        clonedArguments[i] = arguments[i].clone(newTypes);
-      }
-    }
-    KernelNamedTypeBuilder newType =
-        new KernelNamedTypeBuilder(name, clonedArguments);
-    newTypes.add(newType);
-    return newType;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_builder.dart
deleted file mode 100644
index 72b33f2..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_prefix_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.
-
-library fasta.kernel_prefix_builder;
-
-import 'package:kernel/ast.dart' show LibraryDependency;
-
-import '../builder/builder.dart' show LibraryBuilder, PrefixBuilder;
-
-import 'load_library_builder.dart' show LoadLibraryBuilder;
-
-class KernelPrefixBuilder extends PrefixBuilder {
-  final LibraryDependency dependency;
-
-  LoadLibraryBuilder loadLibraryBuilder;
-
-  KernelPrefixBuilder(String name, bool deferred, LibraryBuilder parent,
-      this.dependency, int charOffset, int importIndex)
-      : super(name, deferred, parent, charOffset, importIndex) {
-    if (deferred) {
-      loadLibraryBuilder =
-          new LoadLibraryBuilder(parent, dependency, charOffset);
-      addToExportScope('loadLibrary', loadLibraryBuilder, charOffset);
-    }
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
deleted file mode 100644
index 8d0df44..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_procedure_builder.dart
+++ /dev/null
@@ -1,702 +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.
-
-library fasta.kernel_procedure_builder;
-
-import 'package:kernel/ast.dart'
-    show
-        Arguments,
-        AsyncMarker,
-        Class,
-        Constructor,
-        ConstructorInvocation,
-        DartType,
-        DynamicType,
-        EmptyStatement,
-        Expression,
-        FunctionNode,
-        Initializer,
-        InterfaceType,
-        Member,
-        Name,
-        Procedure,
-        ProcedureKind,
-        RedirectingInitializer,
-        Statement,
-        StaticInvocation,
-        StringLiteral,
-        SuperInitializer,
-        TypeParameter,
-        TypeParameterType,
-        VariableDeclaration,
-        setParents;
-
-import 'package:kernel/type_algebra.dart' show containsTypeVariable, substitute;
-
-import '../../scanner/token.dart' show Token;
-
-import '../loader.dart' show Loader;
-
-import '../messages.dart'
-    show
-        Message,
-        messageConstFactoryRedirectionToNonConst,
-        messageMoreThanOneSuperOrThisInitializer,
-        messageNonInstanceTypeVariableUse,
-        messagePatchDeclarationMismatch,
-        messagePatchDeclarationOrigin,
-        messagePatchNonExternal,
-        messageSuperInitializerNotLast,
-        messageThisInitializerNotAlone,
-        noLength;
-
-import '../problems.dart' show unexpected;
-
-import '../source/source_library_builder.dart' show SourceLibraryBuilder;
-
-import '../type_inference/type_inference_engine.dart'
-    show IncludesTypeParametersCovariantly;
-
-import 'kernel_builder.dart'
-    show
-        ClassBuilder,
-        ConstructorReferenceBuilder,
-        Declaration,
-        FormalParameterBuilder,
-        KernelFormalParameterBuilder,
-        KernelLibraryBuilder,
-        KernelMetadataBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        MetadataBuilder,
-        ProcedureBuilder,
-        TypeVariableBuilder,
-        isRedirectingGenerativeConstructorImplementation;
-
-import 'kernel_shadow_ast.dart' show VariableDeclarationJudgment;
-
-import 'redirecting_factory_body.dart' show RedirectingFactoryBody;
-
-import 'expression_generator_helper.dart' show ExpressionGeneratorHelper;
-
-abstract class KernelFunctionBuilder
-    extends ProcedureBuilder<KernelTypeBuilder> {
-  final String nativeMethodName;
-
-  FunctionNode function;
-
-  Statement actualBody;
-
-  KernelFunctionBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      KernelLibraryBuilder compilationUnit,
-      int charOffset,
-      this.nativeMethodName)
-      : super(metadata, modifiers, returnType, name, typeVariables, formals,
-            compilationUnit, charOffset);
-
-  KernelFunctionBuilder get actualOrigin;
-
-  void set body(Statement newBody) {
-//    if (newBody != null) {
-//      if (isAbstract) {
-//        // TODO(danrubel): Is this check needed?
-//        return internalProblem(messageInternalProblemBodyOnAbstractMethod,
-//            newBody.fileOffset, fileUri);
-//      }
-//    }
-    actualBody = newBody;
-    if (function != null) {
-      // A forwarding semi-stub is a method that is abstract in the source code,
-      // but which needs to have a forwarding stub body in order to ensure that
-      // covariance checks occur.  We don't want to replace the forwarding stub
-      // body with null.
-      var parent = function.parent;
-      if (!(newBody == null &&
-          parent is Procedure &&
-          parent.isForwardingSemiStub)) {
-        function.body = newBody;
-        newBody?.parent = function;
-      }
-    }
-  }
-
-  void setRedirectingFactoryBody(Member target, List<DartType> typeArguments) {
-    if (actualBody != null) {
-      unexpected("null", "${actualBody.runtimeType}", charOffset, fileUri);
-    }
-    actualBody = new RedirectingFactoryBody(target, typeArguments);
-    function.body = actualBody;
-    actualBody?.parent = function;
-    if (isPatch) {
-      actualOrigin.setRedirectingFactoryBody(target, typeArguments);
-    }
-  }
-
-  Statement get body => actualBody ??= new EmptyStatement();
-
-  bool get isNative => nativeMethodName != null;
-
-  FunctionNode buildFunction(LibraryBuilder library) {
-    assert(function == null);
-    FunctionNode result = new FunctionNode(body, asyncMarker: asyncModifier);
-    IncludesTypeParametersCovariantly needsCheckVisitor;
-    if (!isConstructor && !isFactory && parent is ClassBuilder) {
-      Class enclosingClass = parent.target;
-      if (enclosingClass.typeParameters.isNotEmpty) {
-        needsCheckVisitor = new IncludesTypeParametersCovariantly(
-            enclosingClass.typeParameters);
-      }
-    }
-    if (typeVariables != null) {
-      for (KernelTypeVariableBuilder t in typeVariables) {
-        TypeParameter parameter = t.parameter;
-        result.typeParameters.add(parameter);
-        if (needsCheckVisitor != null) {
-          if (parameter.bound.accept(needsCheckVisitor)) {
-            parameter.isGenericCovariantImpl = true;
-          }
-        }
-      }
-      setParents(result.typeParameters, result);
-    }
-    if (formals != null) {
-      for (KernelFormalParameterBuilder formal in formals) {
-        VariableDeclaration parameter = formal.build(library, 0);
-        if (needsCheckVisitor != null) {
-          if (parameter.type.accept(needsCheckVisitor)) {
-            parameter.isGenericCovariantImpl = true;
-          }
-        }
-        if (formal.isNamed) {
-          result.namedParameters.add(parameter);
-        } else {
-          result.positionalParameters.add(parameter);
-        }
-        parameter.parent = result;
-        if (formal.isRequired) {
-          result.requiredParameterCount++;
-        }
-      }
-    }
-    if (isSetter && (formals?.length != 1 || formals[0].isOptional)) {
-      // Replace illegal parameters by single dummy parameter.
-      // Do this after building the parameters, since the diet listener
-      // assumes that parameters are built, even if illegal in number.
-      VariableDeclaration parameter =
-          new VariableDeclarationJudgment("#synthetic", 0);
-      result.positionalParameters.clear();
-      result.positionalParameters.add(parameter);
-      parameter.parent = result;
-      result.namedParameters.clear();
-      result.requiredParameterCount = 1;
-    }
-    if (returnType != null) {
-      result.returnType = returnType.build(library);
-    }
-    if (!isConstructor && !isInstanceMember && parent is ClassBuilder) {
-      List<TypeParameter> typeParameters = parent.target.typeParameters;
-      if (typeParameters.isNotEmpty) {
-        Map<TypeParameter, DartType> substitution;
-        DartType removeTypeVariables(DartType type) {
-          if (substitution == null) {
-            substitution = <TypeParameter, DartType>{};
-            for (TypeParameter parameter in typeParameters) {
-              substitution[parameter] = const DynamicType();
-            }
-          }
-          library.addProblem(
-              messageNonInstanceTypeVariableUse, charOffset, noLength, fileUri);
-          return substitute(type, substitution);
-        }
-
-        Set<TypeParameter> set = typeParameters.toSet();
-        for (VariableDeclaration parameter in result.positionalParameters) {
-          if (containsTypeVariable(parameter.type, set)) {
-            parameter.type = removeTypeVariables(parameter.type);
-          }
-        }
-        for (VariableDeclaration parameter in result.namedParameters) {
-          if (containsTypeVariable(parameter.type, set)) {
-            parameter.type = removeTypeVariables(parameter.type);
-          }
-        }
-        if (containsTypeVariable(result.returnType, set)) {
-          result.returnType = removeTypeVariables(result.returnType);
-        }
-      }
-    }
-    return function = result;
-  }
-
-  Member build(SourceLibraryBuilder library);
-
-  void becomeNative(Loader loader) {
-    Declaration constructor = loader.getNativeAnnotation();
-    Arguments arguments =
-        new Arguments(<Expression>[new StringLiteral(nativeMethodName)]);
-    Expression annotation;
-    if (constructor.isConstructor) {
-      annotation = new ConstructorInvocation(constructor.target, arguments)
-        ..isConst = true;
-    } else {
-      annotation = new StaticInvocation(constructor.target, arguments)
-        ..isConst = true;
-    }
-    target.addAnnotation(annotation);
-  }
-
-  bool checkPatch(KernelFunctionBuilder patch) {
-    if (!isExternal) {
-      patch.library.addProblem(
-          messagePatchNonExternal, patch.charOffset, noLength, patch.fileUri,
-          context: [
-            messagePatchDeclarationOrigin.withLocation(
-                fileUri, charOffset, noLength)
-          ]);
-      return false;
-    }
-    return true;
-  }
-
-  void reportPatchMismatch(Declaration patch) {
-    library.addProblem(messagePatchDeclarationMismatch, patch.charOffset,
-        noLength, patch.fileUri, context: [
-      messagePatchDeclarationOrigin.withLocation(fileUri, charOffset, noLength)
-    ]);
-  }
-}
-
-class KernelProcedureBuilder extends KernelFunctionBuilder {
-  final Procedure procedure;
-  final int charOpenParenOffset;
-
-  AsyncMarker actualAsyncModifier = AsyncMarker.Sync;
-
-  @override
-  KernelProcedureBuilder actualOrigin;
-
-  bool hadTypesInferred = false;
-
-  KernelProcedureBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      ProcedureKind kind,
-      KernelLibraryBuilder compilationUnit,
-      int startCharOffset,
-      int charOffset,
-      this.charOpenParenOffset,
-      int charEndOffset,
-      [String nativeMethodName])
-      : procedure =
-            new Procedure(null, kind, null, fileUri: compilationUnit?.fileUri)
-              ..startFileOffset = startCharOffset
-              ..fileOffset = charOffset
-              ..fileEndOffset = charEndOffset,
-        super(metadata, modifiers, returnType, name, typeVariables, formals,
-            compilationUnit, charOffset, nativeMethodName);
-
-  @override
-  KernelProcedureBuilder get origin => actualOrigin ?? this;
-
-  ProcedureKind get kind => procedure.kind;
-
-  AsyncMarker get asyncModifier => actualAsyncModifier;
-
-  Statement get body {
-    if (actualBody == null && !isAbstract && !isExternal) {
-      actualBody = new EmptyStatement();
-    }
-    return actualBody;
-  }
-
-  void set asyncModifier(AsyncMarker newModifier) {
-    actualAsyncModifier = newModifier;
-    if (function != null) {
-      // No parent, it's an enum.
-      function.asyncMarker = actualAsyncModifier;
-      function.dartAsyncMarker = actualAsyncModifier;
-    }
-  }
-
-  bool get isEligibleForTopLevelInference {
-    if (library.legacyMode) return false;
-    if (isInstanceMember) {
-      if (returnType == null) return true;
-      if (formals != null) {
-        for (var formal in formals) {
-          if (formal.type == null) return true;
-        }
-      }
-    }
-    return false;
-  }
-
-  Procedure build(SourceLibraryBuilder library) {
-    // TODO(ahe): I think we may call this twice on parts. Investigate.
-    if (procedure.name == null) {
-      procedure.function = buildFunction(library);
-      procedure.function.parent = procedure;
-      procedure.function.fileOffset = charOpenParenOffset;
-      procedure.function.fileEndOffset = procedure.fileEndOffset;
-      procedure.isAbstract = isAbstract;
-      procedure.isStatic = isStatic;
-      procedure.isExternal = isExternal;
-      procedure.isConst = isConst;
-      procedure.name = new Name(name, library.target);
-    }
-    return procedure;
-  }
-
-  @override
-  void buildOutlineExpressions(LibraryBuilder library) {
-    KernelMetadataBuilder.buildAnnotations(
-        target, metadata, library, isClassMember ? parent : null, this);
-  }
-
-  Procedure get target => origin.procedure;
-
-  @override
-  int finishPatch() {
-    if (!isPatch) return 0;
-
-    // TODO(ahe): restore file-offset once we track both origin and patch file
-    // URIs. See https://github.com/dart-lang/sdk/issues/31579
-    origin.procedure.fileUri = fileUri;
-    origin.procedure.startFileOffset = procedure.startFileOffset;
-    origin.procedure.fileOffset = procedure.fileOffset;
-    origin.procedure.fileEndOffset = procedure.fileEndOffset;
-    origin.procedure.annotations
-        .forEach((m) => m.fileOffset = procedure.fileOffset);
-
-    origin.procedure.isAbstract = procedure.isAbstract;
-    origin.procedure.isExternal = procedure.isExternal;
-    origin.procedure.function = procedure.function;
-    origin.procedure.function.parent = origin.procedure;
-    return 1;
-  }
-
-  @override
-  void becomeNative(Loader loader) {
-    procedure.isExternal = true;
-    super.becomeNative(loader);
-  }
-
-  @override
-  void applyPatch(Declaration patch) {
-    if (patch is KernelProcedureBuilder) {
-      if (checkPatch(patch)) {
-        patch.actualOrigin = this;
-      }
-    } else {
-      reportPatchMismatch(patch);
-    }
-  }
-}
-
-// TODO(ahe): Move this to own file?
-class KernelConstructorBuilder extends KernelFunctionBuilder {
-  final Constructor constructor;
-
-  final int charOpenParenOffset;
-
-  bool hasMovedSuperInitializer = false;
-
-  SuperInitializer superInitializer;
-
-  RedirectingInitializer redirectingInitializer;
-
-  Token beginInitializers;
-
-  @override
-  KernelConstructorBuilder actualOrigin;
-
-  KernelConstructorBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      KernelLibraryBuilder compilationUnit,
-      int startCharOffset,
-      int charOffset,
-      this.charOpenParenOffset,
-      int charEndOffset,
-      [String nativeMethodName])
-      : constructor = new Constructor(null, fileUri: compilationUnit?.fileUri)
-          ..startFileOffset = startCharOffset
-          ..fileOffset = charOffset
-          ..fileEndOffset = charEndOffset,
-        super(metadata, modifiers, returnType, name, typeVariables, formals,
-            compilationUnit, charOffset, nativeMethodName);
-
-  @override
-  KernelConstructorBuilder get origin => actualOrigin ?? this;
-
-  bool get isInstanceMember => false;
-
-  bool get isConstructor => true;
-
-  AsyncMarker get asyncModifier => AsyncMarker.Sync;
-
-  ProcedureKind get kind => null;
-
-  bool get isRedirectingGenerativeConstructor {
-    return isRedirectingGenerativeConstructorImplementation(constructor);
-  }
-
-  bool get isEligibleForTopLevelInference {
-    if (library.legacyMode) return false;
-    if (formals != null) {
-      for (var formal in formals) {
-        if (formal.type == null && formal.isInitializingFormal) return true;
-      }
-    }
-    return false;
-  }
-
-  Constructor build(SourceLibraryBuilder library) {
-    if (constructor.name == null) {
-      constructor.function = buildFunction(library);
-      constructor.function.parent = constructor;
-      constructor.function.fileOffset = charOpenParenOffset;
-      constructor.function.fileEndOffset = constructor.fileEndOffset;
-      constructor.function.typeParameters = const <TypeParameter>[];
-      constructor.isConst = isConst;
-      constructor.isExternal = isExternal;
-      constructor.name = new Name(name, library.target);
-    }
-    if (isEligibleForTopLevelInference) {
-      for (KernelFormalParameterBuilder formal in formals) {
-        if (formal.type == null && formal.isInitializingFormal) {
-          formal.declaration.type = null;
-        }
-      }
-      library.loader.typeInferenceEngine.toBeInferred[constructor] = library;
-    }
-    return constructor;
-  }
-
-  @override
-  void buildOutlineExpressions(LibraryBuilder library) {
-    KernelMetadataBuilder.buildAnnotations(
-        target, metadata, library, parent, this);
-    beginInitializers = null;
-  }
-
-  FunctionNode buildFunction(LibraryBuilder library) {
-    // According to the specification §9.3 the return type of a constructor
-    // function is its enclosing class.
-    FunctionNode functionNode = super.buildFunction(library);
-    ClassBuilder enclosingClass = parent;
-    List<DartType> typeParameterTypes = new List<DartType>();
-    for (int i = 0; i < enclosingClass.target.typeParameters.length; i++) {
-      TypeParameter typeParameter = enclosingClass.target.typeParameters[i];
-      typeParameterTypes.add(new TypeParameterType(typeParameter));
-    }
-    functionNode.returnType =
-        new InterfaceType(enclosingClass.target, typeParameterTypes);
-    return functionNode;
-  }
-
-  Constructor get target => origin.constructor;
-
-  void injectInvalidInitializer(
-      Message message, int charOffset, ExpressionGeneratorHelper helper) {
-    List<Initializer> initializers = constructor.initializers;
-    Initializer lastInitializer = initializers.removeLast();
-    assert(lastInitializer == superInitializer ||
-        lastInitializer == redirectingInitializer);
-    Initializer error = helper.buildInvalidInitializer(
-        helper.desugarSyntheticExpression(
-            helper.buildProblem(message, charOffset, noLength)),
-        charOffset);
-    initializers.add(error..parent = constructor);
-    initializers.add(lastInitializer);
-  }
-
-  void addInitializer(
-      Initializer initializer, ExpressionGeneratorHelper helper) {
-    List<Initializer> initializers = constructor.initializers;
-    if (initializer is SuperInitializer) {
-      if (superInitializer != null || redirectingInitializer != null) {
-        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
-            initializer.fileOffset, helper);
-      } else {
-        initializers.add(initializer..parent = constructor);
-        superInitializer = initializer;
-      }
-    } else if (initializer is RedirectingInitializer) {
-      if (superInitializer != null || redirectingInitializer != null) {
-        injectInvalidInitializer(messageMoreThanOneSuperOrThisInitializer,
-            initializer.fileOffset, helper);
-      } else if (constructor.initializers.isNotEmpty) {
-        Initializer first = constructor.initializers.first;
-        Initializer error = helper.buildInvalidInitializer(
-            helper.desugarSyntheticExpression(helper.buildProblem(
-                messageThisInitializerNotAlone, first.fileOffset, noLength)),
-            first.fileOffset);
-        initializers.add(error..parent = constructor);
-      } else {
-        initializers.add(initializer..parent = constructor);
-        redirectingInitializer = initializer;
-      }
-    } else if (redirectingInitializer != null) {
-      injectInvalidInitializer(
-          messageThisInitializerNotAlone, initializer.fileOffset, helper);
-    } else if (superInitializer != null) {
-      injectInvalidInitializer(
-          messageSuperInitializerNotLast, superInitializer.fileOffset, helper);
-    } else {
-      initializers.add(initializer..parent = constructor);
-    }
-  }
-
-  @override
-  int finishPatch() {
-    if (!isPatch) return 0;
-
-    // TODO(ahe): restore file-offset once we track both origin and patch file
-    // URIs. See https://github.com/dart-lang/sdk/issues/31579
-    origin.constructor.fileUri = fileUri;
-    origin.constructor.startFileOffset = constructor.startFileOffset;
-    origin.constructor.fileOffset = constructor.fileOffset;
-    origin.constructor.fileEndOffset = constructor.fileEndOffset;
-    origin.constructor.annotations
-        .forEach((m) => m.fileOffset = constructor.fileOffset);
-
-    origin.constructor.isExternal = constructor.isExternal;
-    origin.constructor.function = constructor.function;
-    origin.constructor.function.parent = origin.constructor;
-    origin.constructor.initializers = constructor.initializers;
-    setParents(origin.constructor.initializers, origin.constructor);
-    return 1;
-  }
-
-  @override
-  void becomeNative(Loader loader) {
-    constructor.isExternal = true;
-    super.becomeNative(loader);
-  }
-
-  @override
-  void applyPatch(Declaration patch) {
-    if (patch is KernelConstructorBuilder) {
-      if (checkPatch(patch)) {
-        patch.actualOrigin = this;
-      }
-    } else {
-      reportPatchMismatch(patch);
-    }
-  }
-}
-
-class KernelRedirectingFactoryBuilder extends KernelProcedureBuilder {
-  final ConstructorReferenceBuilder redirectionTarget;
-  List<DartType> typeArguments;
-
-  KernelRedirectingFactoryBuilder(
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      KernelTypeBuilder returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      KernelLibraryBuilder compilationUnit,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      [String nativeMethodName,
-      this.redirectionTarget])
-      : super(
-            metadata,
-            modifiers,
-            returnType,
-            name,
-            typeVariables,
-            formals,
-            ProcedureKind.Factory,
-            compilationUnit,
-            startCharOffset,
-            charOffset,
-            charOpenParenOffset,
-            charEndOffset,
-            nativeMethodName);
-
-  @override
-  Statement get body => actualBody;
-
-  @override
-  void setRedirectingFactoryBody(Member target, List<DartType> typeArguments) {
-    if (actualBody != null) {
-      unexpected("null", "${actualBody.runtimeType}", charOffset, fileUri);
-    }
-
-    // Ensure that constant factories only have constant targets/bodies.
-    if (isConst && !target.isConst) {
-      library.addProblem(messageConstFactoryRedirectionToNonConst, charOffset,
-          noLength, fileUri);
-    }
-
-    actualBody = new RedirectingFactoryBody(target, typeArguments);
-    function.body = actualBody;
-    actualBody?.parent = function;
-    if (isPatch) {
-      if (function.typeParameters != null) {
-        Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-        for (int i = 0; i < function.typeParameters.length; i++) {
-          substitution[function.typeParameters[i]] =
-              new TypeParameterType(actualOrigin.function.typeParameters[i]);
-        }
-        List<DartType> newTypeArguments =
-            new List<DartType>(typeArguments.length);
-        for (int i = 0; i < newTypeArguments.length; i++) {
-          newTypeArguments[i] = substitute(typeArguments[i], substitution);
-        }
-        typeArguments = newTypeArguments;
-      }
-      actualOrigin.setRedirectingFactoryBody(target, typeArguments);
-    }
-  }
-
-  @override
-  Procedure build(SourceLibraryBuilder library) {
-    Procedure result = super.build(library);
-    result.isRedirectingFactoryConstructor = true;
-    if (redirectionTarget.typeArguments != null) {
-      typeArguments =
-          new List<DartType>(redirectionTarget.typeArguments.length);
-      for (int i = 0; i < typeArguments.length; i++) {
-        typeArguments[i] = redirectionTarget.typeArguments[i].build(library);
-      }
-    }
-    return result;
-  }
-
-  @override
-  int finishPatch() {
-    if (!isPatch) return 0;
-
-    super.finishPatch();
-
-    if (origin is KernelRedirectingFactoryBuilder) {
-      KernelRedirectingFactoryBuilder redirectingOrigin = origin;
-      redirectingOrigin.typeArguments = typeArguments;
-    }
-
-    return 1;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
index 4a5bc98..cdb96b5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_shadow_ast.dart
@@ -57,10 +57,12 @@
 
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import '../type_inference/inference_helper.dart' show InferenceHelper;
 
 import '../type_inference/type_inference_engine.dart'
-    show IncludesTypeParametersCovariantly, TypeInferenceEngine;
+    show IncludesTypeParametersNonCovariantly, TypeInferenceEngine;
 
 import '../type_inference/type_inferrer.dart'
     show ExpressionInferenceResult, TypeInferrer, TypeInferrerImpl;
@@ -90,12 +92,10 @@
         SpreadMapEntry,
         convertToElement;
 
+import 'expression_generator.dart' show makeLet;
+
 import 'implicit_type_argument.dart' show ImplicitTypeArgument;
 
-import 'kernel_builder.dart' show KernelLibraryBuilder;
-
-import 'kernel_expression_generator.dart' show makeLet;
-
 part "inference_visitor.dart";
 part "inferred_type_visitor.dart";
 
@@ -126,7 +126,7 @@
 
   /// The visitor for determining if a given type makes covariant use of one of
   /// the class's generic parameters, and therefore requires covariant checks.
-  IncludesTypeParametersCovariantly needsCheckVisitor;
+  IncludesTypeParametersNonCovariantly needsCheckVisitor;
 
   /// Getters and methods in the class's API.  May include forwarding nodes.
   final gettersAndMethods = <Member>[];
@@ -1279,7 +1279,7 @@
   }
 
   @override
-  accept(ExpressionVisitor v) {
+  accept(ExpressionVisitor<dynamic> v) {
     // This is designed to throw an exception during serialization. It can also
     // lead to exceptions during transformations, but we have to accept a
     // [Transformer] as this is used to implement `replaceChild`.
@@ -1288,12 +1288,12 @@
   }
 
   @override
-  accept1(ExpressionVisitor1 v, arg) {
+  accept1(ExpressionVisitor1<dynamic, dynamic> v, arg) {
     unsupported("accept1", fileOffset, getFileUri(this));
   }
 
   @override
-  visitChildren(Visitor v) {
+  visitChildren(Visitor<dynamic> v) {
     unsupported("visitChildren", fileOffset, getFileUri(this));
   }
 }
@@ -1340,13 +1340,13 @@
 
   @override
   ShadowTypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, KernelLibraryBuilder library) {
+      Uri uri, InterfaceType thisType, SourceLibraryBuilder library) {
     return new TypeInferrer(this, uri, false, thisType, library);
   }
 
   @override
   ShadowTypeInferrer createTopLevelTypeInferrer(
-      Uri uri, InterfaceType thisType, KernelLibraryBuilder library) {
+      Uri uri, InterfaceType thisType, SourceLibraryBuilder library) {
     return new TypeInferrer(this, uri, true, thisType, library);
   }
 }
@@ -1358,7 +1358,7 @@
   final typePromoter;
 
   ShadowTypeInferrer.private(ShadowTypeInferenceEngine engine, Uri uri,
-      bool topLevel, InterfaceType thisType, KernelLibraryBuilder library)
+      bool topLevel, InterfaceType thisType, SourceLibraryBuilder library)
       : typePromoter = new TypePromoter(engine.typeSchemaEnvironment),
         super.private(engine, uri, topLevel, thisType, library);
 
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 0128ab2..9a38348 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -76,6 +76,8 @@
 
 import '../source/source_class_builder.dart' show SourceClassBuilder;
 
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import '../source/source_loader.dart' show SourceLoader;
 
 import '../target_implementation.dart' show TargetImplementation;
@@ -87,15 +89,12 @@
 import 'kernel_builder.dart'
     show
         ClassBuilder,
-        Declaration,
+        Builder,
         InvalidTypeBuilder,
-        KernelClassBuilder,
-        KernelFieldBuilder,
-        KernelLibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelProcedureBuilder,
-        LibraryBuilder,
+        FieldBuilder,
         NamedTypeBuilder,
+        ProcedureBuilder,
+        LibraryBuilder,
         TypeBuilder,
         TypeDeclarationBuilder;
 
@@ -121,12 +120,11 @@
 
   Component component;
 
-  final TypeBuilder dynamicType = new KernelNamedTypeBuilder("dynamic", null);
+  final TypeBuilder dynamicType = new NamedTypeBuilder("dynamic", null);
 
-  final NamedTypeBuilder objectType =
-      new KernelNamedTypeBuilder("Object", null);
+  final NamedTypeBuilder objectType = new NamedTypeBuilder("Object", null);
 
-  final TypeBuilder bottomType = new KernelNamedTypeBuilder("Null", null);
+  final TypeBuilder bottomType = new NamedTypeBuilder("Null", null);
 
   bool get legacyMode => backendTarget.legacyMode;
 
@@ -138,8 +136,6 @@
   final bool errorOnUnevaluatedConstant =
       CompilerContext.current.options.errorOnUnevaluatedConstant;
 
-  final bool enableAsserts = CompilerContext.current.options.enableAsserts;
-
   final List<Object> clonedFormals = <Object>[];
 
   KernelTarget(this.fileSystem, this.includeComments, DillTarget dillTarget,
@@ -177,7 +173,11 @@
           String asString = "$entryPoint";
           packagesMap ??= uriTranslator.packages.asMap();
           for (String packageName in packagesMap.keys) {
-            String prefix = "${packagesMap[packageName]}";
+            Uri packageUri = packagesMap[packageName];
+            if (packageUri?.hasFragment == true) {
+              packageUri = packageUri.removeFragment();
+            }
+            String prefix = "${packageUri}";
             if (asString.startsWith(prefix)) {
               Uri reversed = Uri.parse(
                   "package:$packageName/${asString.substring(prefix.length)}");
@@ -202,14 +202,14 @@
 
   @override
   LibraryBuilder createLibraryBuilder(
-      Uri uri, Uri fileUri, KernelLibraryBuilder origin) {
+      Uri uri, Uri fileUri, SourceLibraryBuilder origin) {
     if (dillTarget.isLoaded) {
       var builder = dillTarget.loader.builders[uri];
       if (builder != null) {
         return builder;
       }
     }
-    return new KernelLibraryBuilder(uri, fileUri, loader, origin);
+    return new SourceLibraryBuilder(uri, fileUri, loader, origin);
   }
 
   /// Returns classes defined in libraries in [loader].
@@ -217,9 +217,9 @@
     List<SourceClassBuilder> result = <SourceClassBuilder>[];
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == loader) {
-        Iterator<Declaration> iterator = library.iterator;
+        Iterator<Builder> iterator = library.iterator;
         while (iterator.moveNext()) {
-          Declaration member = iterator.current;
+          Builder member = iterator.current;
           if (member is SourceClassBuilder && !member.isPatch) {
             result.add(member);
           }
@@ -234,7 +234,7 @@
     cls.implementedTypes.clear();
     cls.supertype = null;
     cls.mixedInType = null;
-    builder.supertype = new KernelNamedTypeBuilder("Object", null)
+    builder.supertype = new NamedTypeBuilder("Object", null)
       ..bind(objectClassBuilder);
     builder.interfaces = null;
     builder.mixedInType = null;
@@ -247,11 +247,11 @@
       loader.createTypeInferenceEngine();
       await loader.buildOutlines();
       loader.coreLibrary.becomeCoreLibrary();
-      dynamicType.bind(loader.coreLibrary["dynamic"]);
+      dynamicType.bind(loader.coreLibrary.getLocalMember("dynamic"));
       loader.resolveParts();
       loader.computeLibraryScopes();
-      objectType.bind(loader.coreLibrary["Object"]);
-      bottomType.bind(loader.coreLibrary["Null"]);
+      objectType.bind(loader.coreLibrary.getLocalMember("Object"));
+      bottomType.bind(loader.coreLibrary.getLocalMember("Null"));
       loader.resolveTypes();
       loader.computeDefaultTypes(dynamicType, bottomType, objectClassBuilder);
       List<SourceClassBuilder> myClasses =
@@ -341,13 +341,12 @@
         nameRoot: nameRoot, libraries: libraries, uriToSource: uriToSource));
     if (loader.first != null) {
       // TODO(sigmund): do only for full program
-      Declaration declaration =
-          loader.first.exportScope.lookup("main", -1, null);
+      Builder declaration = loader.first.exportScope.lookup("main", -1, null);
       if (declaration is AmbiguousBuilder) {
         AmbiguousBuilder problem = declaration;
         declaration = problem.getFirstDeclaration();
       }
-      if (declaration is KernelProcedureBuilder) {
+      if (declaration is ProcedureBuilder) {
         component.mainMethod = declaration.procedure;
       } else if (declaration is DillMemberBuilder) {
         if (declaration.member is Procedure) {
@@ -368,16 +367,15 @@
     Class objectClass = this.objectClass;
     loader.builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == loader) {
-        Iterator<Declaration> iterator = library.iterator;
+        Iterator<Builder> iterator = library.iterator;
         while (iterator.moveNext()) {
-          Declaration declaration = iterator.current;
+          Builder declaration = iterator.current;
           if (declaration is SourceClassBuilder) {
             Class cls = declaration.target;
             if (cls != objectClass) {
               cls.supertype ??= objectClass.asRawSupertype;
-              declaration.supertype ??=
-                  new KernelNamedTypeBuilder("Object", null)
-                    ..bind(objectClassBuilder);
+              declaration.supertype ??= new NamedTypeBuilder("Object", null)
+                ..bind(objectClassBuilder);
             }
             if (declaration.isMixinApplication) {
               cls.mixedInType = declaration.mixedInType.buildMixedInType(
@@ -394,7 +392,11 @@
     Class objectClass = this.objectClass;
     for (SourceClassBuilder builder in builders) {
       if (builder.target != objectClass && !builder.isPatch) {
-        if (builder.isPatch || builder.isMixinDeclaration) continue;
+        if (builder.isPatch ||
+            builder.isMixinDeclaration ||
+            builder.isExtension) {
+          continue;
+        }
         if (builder.isMixinApplication) {
           installForwardingConstructors(builder);
         } else {
@@ -405,13 +407,14 @@
     ticker.logMs("Installed synthetic constructors");
   }
 
-  KernelClassBuilder get objectClassBuilder => objectType.declaration;
+  ClassBuilder get objectClassBuilder => objectType.declaration;
 
   Class get objectClass => objectClassBuilder.cls;
 
   /// If [builder] doesn't have a constructors, install the defaults.
   void installDefaultConstructor(SourceClassBuilder builder) {
     assert(!builder.isMixinApplication);
+    assert(!builder.isExtension);
     // TODO(askesc): Make this check light-weight in the absence of patches.
     if (builder.target.constructors.isNotEmpty) return;
     if (builder.target.redirectingFactoryConstructors.isNotEmpty) return;
@@ -457,7 +460,7 @@
     if (supertype.isMixinApplication) {
       installForwardingConstructors(supertype);
     }
-    if (supertype is KernelClassBuilder) {
+    if (supertype is ClassBuilder) {
       if (supertype.cls.constructors.isEmpty) {
         builder.addSyntheticConstructor(makeDefaultConstructor(builder.target));
       } else {
@@ -589,11 +592,11 @@
         libraries.add(library.target);
       }
     }
-    Component plaformLibraries =
+    Component platformLibraries =
         backendTarget.configureComponent(new Component());
     // Add libraries directly to prevent that their parents are changed.
-    plaformLibraries.libraries.addAll(libraries);
-    loader.computeCoreTypes(plaformLibraries);
+    platformLibraries.libraries.addAll(libraries);
+    loader.computeCoreTypes(platformLibraries);
   }
 
   void finishAllConstructors(List<SourceClassBuilder> builders) {
@@ -683,9 +686,9 @@
         for (VariableDeclaration formal
             in constructor.function.positionalParameters) {
           if (formal.isFieldFormal) {
-            Declaration fieldBuilder = builder.scope.local[formal.name] ??
+            Builder fieldBuilder = builder.scope.local[formal.name] ??
                 builder.origin.scope.local[formal.name];
-            if (fieldBuilder is KernelFieldBuilder) {
+            if (fieldBuilder is FieldBuilder) {
               myInitializedFields.add(fieldBuilder.field);
             }
           }
@@ -786,7 +789,6 @@
           environmentDefines,
           environment,
           new KernelConstantErrorReporter(loader),
-          enableAsserts: enableAsserts,
           desugarSets: !backendTarget.supportsSetLiterals,
           errorOnUnevaluatedConstant: errorOnUnevaluatedConstant);
       ticker.logMs("Evaluated constants");
@@ -796,6 +798,7 @@
         loader.coreTypes,
         loader.hierarchy,
         loader.libraries,
+        environmentDefines,
         new KernelDiagnosticReporter(loader),
         logger: (String msg) => ticker.logMs(msg));
   }
@@ -819,11 +822,11 @@
   }
 
   @override
-  void readPatchFiles(KernelLibraryBuilder library) {
+  void readPatchFiles(SourceLibraryBuilder library) {
     assert(library.uri.scheme == "dart");
     List<Uri> patches = uriTranslator.getDartPatches(library.uri.path);
     if (patches != null) {
-      KernelLibraryBuilder first;
+      SourceLibraryBuilder first;
       for (Uri patch in patches) {
         if (first == null) {
           first = library.loader.read(patch, -1,
@@ -831,7 +834,7 @@
         } else {
           // If there's more than one patch file, it's interpreted as a part of
           // the patch library.
-          KernelLibraryBuilder part = library.loader.read(patch, -1,
+          SourceLibraryBuilder part = library.loader.read(patch, -1,
               origin: library, fileUri: patch, accessor: library);
           first.parts.add(part);
           first.partOffsets.add(-1);
@@ -861,7 +864,7 @@
 
 class KernelDiagnosticReporter
     extends DiagnosticReporter<Message, LocatedMessage> {
-  final Loader<Library> loader;
+  final Loader loader;
 
   KernelDiagnosticReporter(this.loader);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_alias_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_alias_builder.dart
deleted file mode 100644
index f5daa9d..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_alias_builder.dart
+++ /dev/null
@@ -1,201 +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.
-
-library fasta.kernel_function_type_alias_builder;
-
-import 'package:kernel/ast.dart'
-    show
-        DartType,
-        DynamicType,
-        FunctionType,
-        InvalidType,
-        Library,
-        TypeParameter,
-        Typedef,
-        VariableDeclaration;
-
-import 'package:kernel/type_algebra.dart'
-    show FreshTypeParameters, getFreshTypeParameters, substitute;
-
-import '../fasta_codes.dart'
-    show noLength, templateCyclicTypedef, templateTypeArgumentMismatch;
-
-import '../problems.dart' show unhandled;
-
-import 'kernel_builder.dart'
-    show
-        TypeAliasBuilder,
-        KernelFormalParameterBuilder,
-        KernelFunctionTypeBuilder,
-        KernelLibraryBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
-        LibraryBuilder,
-        MetadataBuilder,
-        TypeVariableBuilder;
-
-final InvalidType cyclicTypeAliasMarker = new InvalidType();
-
-class KernelTypeAliasBuilder
-    extends TypeAliasBuilder<KernelTypeBuilder, DartType> {
-  final Typedef target;
-
-  DartType thisType;
-
-  KernelTypeAliasBuilder(
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables,
-      KernelFunctionTypeBuilder type,
-      LibraryBuilder<KernelTypeBuilder, Library> parent,
-      int charOffset,
-      [Typedef target])
-      : target = target ??
-            (new Typedef(name, null,
-                typeParameters:
-                    KernelTypeVariableBuilder.kernelTypeParametersFromBuilders(
-                        typeVariables),
-                fileUri: parent.target.fileUri)
-              ..fileOffset = charOffset),
-        super(metadata, name, typeVariables, type, parent, charOffset);
-
-  Typedef build(KernelLibraryBuilder libraryBuilder) {
-    target..type ??= buildThisType(libraryBuilder);
-
-    KernelTypeBuilder type = this.type;
-    if (type is KernelFunctionTypeBuilder) {
-      List<TypeParameter> typeParameters =
-          new List<TypeParameter>(type.typeVariables?.length ?? 0);
-      for (int i = 0; i < typeParameters.length; ++i) {
-        KernelTypeVariableBuilder typeVariable = type.typeVariables[i];
-        typeParameters[i] = typeVariable.parameter;
-      }
-      FreshTypeParameters freshTypeParameters =
-          getFreshTypeParameters(typeParameters);
-      target.typeParametersOfFunctionType
-          .addAll(freshTypeParameters.freshTypeParameters);
-
-      if (type.formals != null) {
-        for (KernelFormalParameterBuilder formal in type.formals) {
-          VariableDeclaration parameter = formal.build(libraryBuilder, 0);
-          parameter.type = freshTypeParameters.substitute(parameter.type);
-          if (formal.isNamed) {
-            target.namedParameters.add(parameter);
-          } else {
-            target.positionalParameters.add(parameter);
-          }
-        }
-      }
-    } else if (type != null) {
-      unhandled("${type.fullNameForErrors}", "build", charOffset, fileUri);
-    }
-
-    return target;
-  }
-
-  DartType buildThisType(LibraryBuilder<KernelTypeBuilder, Library> library) {
-    if (thisType != null) {
-      if (identical(thisType, cyclicTypeAliasMarker)) {
-        library.addProblem(templateCyclicTypedef.withArguments(name),
-            charOffset, noLength, fileUri);
-        return const InvalidType();
-      }
-      return thisType;
-    }
-    // It is a compile-time error for an alias (typedef) to refer to itself. We
-    // detect cycles by detecting recursive calls to this method using an
-    // instance of InvalidType that isn't identical to `const InvalidType()`.
-    thisType = cyclicTypeAliasMarker;
-    KernelTypeBuilder type = this.type;
-    if (type is KernelFunctionTypeBuilder) {
-      FunctionType builtType = type?.build(library, target.thisType);
-      if (builtType != null) {
-        if (typeVariables != null) {
-          for (KernelTypeVariableBuilder tv in typeVariables) {
-            // Follow bound in order to find all cycles
-            tv.bound?.build(library);
-          }
-        }
-        return thisType = builtType;
-      } else {
-        return thisType = const InvalidType();
-      }
-    } else if (type == null) {
-      return thisType = const InvalidType();
-    } else {
-      return unhandled(
-          "${type.fullNameForErrors}", "buildThisType", charOffset, fileUri);
-    }
-  }
-
-  /// [arguments] have already been built.
-  DartType buildTypesWithBuiltArguments(
-      LibraryBuilder<KernelTypeBuilder, Object> library,
-      List<DartType> arguments) {
-    var thisType = buildThisType(library);
-    if (const DynamicType() == thisType) return thisType;
-    FunctionType result = thisType;
-    if (target.typeParameters.isEmpty && arguments == null) return result;
-    Map<TypeParameter, DartType> substitution = <TypeParameter, DartType>{};
-    for (int i = 0; i < target.typeParameters.length; i++) {
-      substitution[target.typeParameters[i]] = arguments[i];
-    }
-    return substitute(result, substitution);
-  }
-
-  List<DartType> buildTypeArguments(
-      LibraryBuilder<KernelTypeBuilder, Library> library,
-      List<KernelTypeBuilder> arguments) {
-    if (arguments == null && typeVariables == null) {
-      return <DartType>[];
-    }
-
-    if (arguments == null && typeVariables != null) {
-      List<DartType> result =
-          new List<DartType>.filled(typeVariables.length, null, growable: true);
-      for (int i = 0; i < result.length; ++i) {
-        result[i] = typeVariables[i].defaultType.build(library);
-      }
-      if (library is KernelLibraryBuilder) {
-        library.inferredTypes.addAll(result);
-      }
-      return result;
-    }
-
-    if (arguments != null && arguments.length != (typeVariables?.length ?? 0)) {
-      // That should be caught and reported as a compile-time error earlier.
-      return unhandled(
-          templateTypeArgumentMismatch
-              .withArguments(typeVariables.length)
-              .message,
-          "buildTypeArguments",
-          -1,
-          null);
-    }
-
-    // arguments.length == typeVariables.length
-    List<DartType> result =
-        new List<DartType>.filled(arguments.length, null, growable: true);
-    for (int i = 0; i < result.length; ++i) {
-      result[i] = arguments[i].build(library);
-    }
-    return result;
-  }
-
-  /// If [arguments] are null, the default types for the variables are used.
-  @override
-  int get typeVariablesCount => typeVariables?.length ?? 0;
-
-  @override
-  DartType buildType(LibraryBuilder<KernelTypeBuilder, Object> library,
-      List<KernelTypeBuilder> arguments) {
-    var thisType = buildThisType(library);
-    if (thisType is InvalidType) return thisType;
-    FunctionType result = thisType;
-    if (target.typeParameters.isEmpty && arguments == null) return result;
-    // Otherwise, substitute.
-    return buildTypesWithBuiltArguments(
-        library, buildTypeArguments(library, arguments));
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
deleted file mode 100644
index 39fe14d..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_builder.dart
+++ /dev/null
@@ -1,21 +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.
-
-library fasta.kernel_type_builder;
-
-import 'package:kernel/ast.dart' show DartType, Library, Supertype;
-
-import 'kernel_builder.dart' show LibraryBuilder, TypeBuilder;
-
-abstract class KernelTypeBuilder extends TypeBuilder {
-  const KernelTypeBuilder();
-
-  DartType build(LibraryBuilder<TypeBuilder, Object> library);
-
-  Supertype buildSupertype(LibraryBuilder<KernelTypeBuilder, Library> library,
-      int charOffset, Uri fileUri);
-
-  Supertype buildMixedInType(LibraryBuilder<KernelTypeBuilder, Library> library,
-      int charOffset, Uri fileUri);
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
deleted file mode 100644
index 9137222..0000000
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_type_variable_builder.dart
+++ /dev/null
@@ -1,127 +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.
-
-library fasta.kernel_type_variable_builder;
-
-import 'package:kernel/ast.dart'
-    show DartType, TypeParameter, TypeParameterType;
-
-import '../fasta_codes.dart' show templateTypeArgumentsOnTypeVariable;
-
-import 'kernel_builder.dart'
-    show
-        KernelClassBuilder,
-        KernelLibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder,
-        LibraryBuilder,
-        TypeBuilder,
-        TypeVariableBuilder;
-
-class KernelTypeVariableBuilder
-    extends TypeVariableBuilder<KernelTypeBuilder, DartType> {
-  final TypeParameter actualParameter;
-
-  KernelTypeVariableBuilder actualOrigin;
-
-  KernelTypeVariableBuilder(
-      String name, KernelLibraryBuilder compilationUnit, int charOffset,
-      [KernelTypeBuilder bound, TypeParameter actual])
-      // TODO(32378): We would like to use '??' here instead, but in conjuction
-      // with '..', it crashes Dart2JS.
-      : actualParameter = actual != null
-            ? (actual..fileOffset = charOffset)
-            : (new TypeParameter(name, null)..fileOffset = charOffset),
-        super(name, bound, compilationUnit, charOffset);
-
-  KernelTypeVariableBuilder.fromKernel(
-      TypeParameter parameter, LibraryBuilder compilationUnit)
-      : actualParameter = parameter,
-        super(parameter.name, null, compilationUnit, parameter.fileOffset);
-
-  @override
-  KernelTypeVariableBuilder get origin => actualOrigin ?? this;
-
-  TypeParameter get parameter => origin.actualParameter;
-
-  TypeParameter get target => parameter;
-
-  DartType buildType(
-      LibraryBuilder library, List<KernelTypeBuilder> arguments) {
-    if (arguments != null) {
-      int charOffset = -1; // TODO(ahe): Provide these.
-      Uri fileUri = null; // TODO(ahe): Provide these.
-      library.addProblem(
-          templateTypeArgumentsOnTypeVariable.withArguments(name),
-          charOffset,
-          name.length,
-          fileUri);
-    }
-    return new TypeParameterType(parameter);
-  }
-
-  DartType buildTypesWithBuiltArguments(
-      LibraryBuilder library, List<DartType> arguments) {
-    if (arguments != null) {
-      int charOffset = -1; // TODO(ahe): Provide these.
-      Uri fileUri = null; // TODO(ahe): Provide these.
-      library.addProblem(
-          templateTypeArgumentsOnTypeVariable.withArguments(name),
-          charOffset,
-          name.length,
-          fileUri);
-    }
-    return buildType(library, null);
-  }
-
-  KernelTypeBuilder asTypeBuilder() {
-    return new KernelNamedTypeBuilder(name, null)..bind(this);
-  }
-
-  void finish(LibraryBuilder library, KernelClassBuilder object,
-      TypeBuilder dynamicType) {
-    if (isPatch) return;
-    DartType objectType = object.buildType(library, null);
-    parameter.bound ??= bound?.build(library) ?? objectType;
-    // If defaultType is not set, initialize it to dynamic, unless the bound is
-    // explicitly specified as Object, in which case defaultType should also be
-    // Object. This makes sure instantiation of generic function types with an
-    // explicit Object bound results in Object as the instantiated type.
-    parameter.defaultType ??= defaultType?.build(library) ??
-        (bound != null && parameter.bound == objectType
-            ? objectType
-            : dynamicType.build(library));
-  }
-
-  void applyPatch(covariant KernelTypeVariableBuilder patch) {
-    patch.actualOrigin = this;
-  }
-
-  KernelTypeVariableBuilder clone(List<TypeBuilder> newTypes) {
-    // TODO(dmitryas): Figure out if using [charOffset] here is a good idea.
-    // An alternative is to use the offset of the node the cloned type variable
-    // is declared on.
-    return new KernelTypeVariableBuilder(
-        name, parent, charOffset, bound.clone(newTypes));
-  }
-
-  @override
-  bool operator ==(Object other) {
-    return other is KernelTypeVariableBuilder && target == other.target;
-  }
-
-  @override
-  int get hashCode => target.hashCode;
-
-  static List<TypeParameter> kernelTypeParametersFromBuilders(
-      List<TypeVariableBuilder> builders) {
-    if (builders == null) return null;
-    List<TypeParameter> result =
-        new List<TypeParameter>.filled(builders.length, null, growable: true);
-    for (int i = 0; i < builders.length; i++) {
-      result[i] = builders[i].target;
-    }
-    return result;
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
index fb688d1..6f1317a 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_variable_builder.dart
@@ -6,18 +6,18 @@
 
 import 'package:kernel/ast.dart' show VariableDeclaration;
 
-import 'kernel_builder.dart' show Declaration;
+import 'kernel_builder.dart' show Builder;
 
-class KernelVariableBuilder extends Declaration {
+class VariableBuilder extends Builder {
   @override
-  final Declaration parent;
+  final Builder parent;
 
   @override
   final Uri fileUri;
 
   final VariableDeclaration variable;
 
-  KernelVariableBuilder(this.variable, this.parent, this.fileUri);
+  VariableBuilder(this.variable, this.parent, this.fileUri);
 
   @override
   int get charOffset => variable.fileOffset;
diff --git a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
index dfa7a81..7748bdb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/load_library_builder.dart
@@ -17,13 +17,15 @@
         ProcedureKind,
         ReturnStatement;
 
-import 'kernel_builder.dart' show Declaration, KernelLibraryBuilder;
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
+import 'kernel_builder.dart' show Builder;
 
 import 'forest.dart' show Forest;
 
 /// Builder to represent the `deferLibrary.loadLibrary` calls and tear-offs.
-class LoadLibraryBuilder extends Declaration {
-  final KernelLibraryBuilder parent;
+class LoadLibraryBuilder extends Builder {
+  final SourceLibraryBuilder parent;
 
   final LibraryDependency importDependency;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
index 6a15522..82f84f5 100644
--- a/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/metadata_collector.dart
@@ -8,7 +8,7 @@
 abstract class MetadataCollector {
   /// Metadata is remembered in this repository, so that when it is added
   /// to a component, metadata is serialized with the component.
-  MetadataRepository get repository;
+  MetadataRepository<dynamic> get repository;
 
   void setConstructorNameOffset(Member node, Object name);
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
index bcd7cca..ea9f61d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/redirecting_factory_body.dart
@@ -23,6 +23,8 @@
 
 import 'package:kernel/type_algebra.dart' show Substitution;
 
+import 'body_builder.dart' show EnsureLoaded;
+
 const String letName = "#redirecting_factory";
 
 class RedirectingFactoryBody extends ExpressionStatement {
@@ -71,7 +73,7 @@
 
   static void restoreFromDill(Procedure factory) {
     // This is a hack / work around for storing redirecting constructors in
-    // dill files. See `KernelClassBuilder.addRedirectingConstructor` in
+    // dill files. See `ClassBuilder.addRedirectingConstructor` in
     // [kernel_class_builder.dart](kernel_class_builder.dart).
     FunctionNode function = factory.function;
     ExpressionStatement statement = function.body;
@@ -114,7 +116,8 @@
   }
 }
 
-bool isRedirectingFactory(Member member) {
+bool isRedirectingFactory(Member member, {EnsureLoaded helper}) {
+  assert(helper == null || helper.isLoaded(member));
   return member is Procedure && member.function.body is RedirectingFactoryBody;
 }
 
@@ -129,7 +132,8 @@
   RedirectionTarget(this.target, this.typeArguments);
 }
 
-RedirectionTarget getRedirectionTarget(Procedure member, {bool legacyMode}) {
+RedirectionTarget getRedirectionTarget(Procedure member, EnsureLoaded helper,
+    {bool legacyMode}) {
   List<DartType> typeArguments = <DartType>[]..length =
       member.function.typeParameters.length;
   for (int i = 0; i < typeArguments.length; i++) {
@@ -142,11 +146,14 @@
   Member tortoise = member;
   RedirectingFactoryBody tortoiseBody = getRedirectingFactoryBody(tortoise);
   Member hare = tortoiseBody?.target;
+  helper.ensureLoaded(hare);
   RedirectingFactoryBody hareBody = getRedirectingFactoryBody(hare);
   while (tortoise != hare) {
-    if (tortoiseBody?.isUnresolved ?? true)
+    if (tortoiseBody?.isUnresolved ?? true) {
       return new RedirectionTarget(tortoise, typeArguments);
+    }
     Member nextTortoise = tortoiseBody.target;
+    helper.ensureLoaded(nextTortoise);
     List<DartType> nextTypeArguments = tortoiseBody.typeArguments;
     if (!legacyMode && nextTypeArguments == null) {
       nextTypeArguments = <DartType>[];
@@ -173,7 +180,9 @@
 
     tortoise = nextTortoise;
     tortoiseBody = getRedirectingFactoryBody(tortoise);
+    helper.ensureLoaded(hareBody?.target);
     hare = getRedirectingFactoryBody(hareBody?.target)?.target;
+    helper.ensureLoaded(hare);
     hareBody = getRedirectingFactoryBody(hare);
   }
   return null;
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
index 6c04afb..6861ad1 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_algorithms.dart
@@ -27,16 +27,9 @@
     show
         ClassBuilder,
         FormalParameterBuilder,
-        TypeAliasBuilder,
         FunctionTypeBuilder,
-        KernelClassBuilder,
-        KernelFormalParameterBuilder,
-        KernelFunctionTypeBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeAliasBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
         NamedTypeBuilder,
+        TypeAliasBuilder,
         TypeBuilder,
         TypeDeclarationBuilder,
         TypeVariableBuilder;
@@ -61,26 +54,25 @@
 // variables.  For that case if the type has its declaration set to null and its
 // name matches that of the variable, it's interpreted as an occurrence of a
 // type variable.
-int computeVariance(
-    KernelTypeVariableBuilder variable, KernelTypeBuilder type) {
-  if (type is KernelNamedTypeBuilder) {
+int computeVariance(TypeVariableBuilder variable, TypeBuilder type) {
+  if (type is NamedTypeBuilder) {
     TypeDeclarationBuilder declaration = type.declaration;
-    if (declaration == null || declaration is KernelTypeVariableBuilder) {
+    if (declaration == null || declaration is TypeVariableBuilder) {
       if (type.name == variable.name) {
         return Variance.covariant;
       } else {
         return Variance.unrelated;
       }
     } else {
-      if (declaration is KernelClassBuilder) {
+      if (declaration is ClassBuilder) {
         int result = Variance.unrelated;
         if (type.arguments != null) {
-          for (KernelTypeBuilder argument in type.arguments) {
+          for (TypeBuilder argument in type.arguments) {
             result = Variance.meet(result, computeVariance(variable, argument));
           }
         }
         return result;
-      } else if (declaration is KernelTypeAliasBuilder) {
+      } else if (declaration is TypeAliasBuilder) {
         int result = Variance.unrelated;
         if (type.arguments != null) {
           for (int i = 0; i < type.arguments.length; ++i) {
@@ -95,14 +87,14 @@
         return result;
       }
     }
-  } else if (type is KernelFunctionTypeBuilder) {
+  } else if (type is FunctionTypeBuilder) {
     int result = Variance.unrelated;
     if (type.returnType != null) {
       result =
           Variance.meet(result, computeVariance(variable, type.returnType));
     }
     if (type.typeVariables != null) {
-      for (KernelTypeVariableBuilder typeVariable in type.typeVariables) {
+      for (TypeVariableBuilder typeVariable in type.typeVariables) {
         // If [variable] is referenced in the bound at all, it makes the
         // variance of [variable] in the entire type invariant.  The invocation
         // of [computeVariance] below is made to simply figure out if [variable]
@@ -115,7 +107,7 @@
       }
     }
     if (type.formals != null) {
-      for (KernelFormalParameterBuilder formal in type.formals) {
+      for (FormalParameterBuilder formal in type.formals) {
         result = Variance.meet(
             result,
             Variance.combine(Variance.contravariant,
@@ -127,13 +119,13 @@
   return Variance.unrelated;
 }
 
-KernelTypeBuilder substituteRange(
-    KernelTypeBuilder type,
-    Map<TypeVariableBuilder, KernelTypeBuilder> upperSubstitution,
-    Map<TypeVariableBuilder, KernelTypeBuilder> lowerSubstitution,
+TypeBuilder substituteRange(
+    TypeBuilder type,
+    Map<TypeVariableBuilder, TypeBuilder> upperSubstitution,
+    Map<TypeVariableBuilder, TypeBuilder> lowerSubstitution,
     {bool isCovariant = true}) {
-  if (type is KernelNamedTypeBuilder) {
-    if (type.declaration is KernelTypeVariableBuilder) {
+  if (type is NamedTypeBuilder) {
+    if (type.declaration is TypeVariableBuilder) {
       if (isCovariant) {
         return upperSubstitution[type.declaration] ?? type;
       }
@@ -153,34 +145,33 @@
       }
     }
     if (arguments != null) {
-      return new KernelNamedTypeBuilder(type.name, arguments)
-        ..bind(type.declaration);
+      return new NamedTypeBuilder(type.name, arguments)..bind(type.declaration);
     }
     return type;
   }
 
-  if (type is KernelFunctionTypeBuilder) {
-    List<KernelTypeVariableBuilder> variables;
+  if (type is FunctionTypeBuilder) {
+    List<TypeVariableBuilder> variables;
     if (type.typeVariables != null) {
-      variables =
-          new List<KernelTypeVariableBuilder>(type.typeVariables.length);
+      variables = new List<TypeVariableBuilder>(type.typeVariables.length);
     }
-    List<KernelFormalParameterBuilder> formals;
+    List<FormalParameterBuilder> formals;
     if (type.formals != null) {
-      formals = new List<KernelFormalParameterBuilder>(type.formals.length);
+      formals = new List<FormalParameterBuilder>(type.formals.length);
     }
-    KernelTypeBuilder returnType;
+    TypeBuilder returnType;
     bool changed = false;
 
     if (type.typeVariables != null) {
       for (int i = 0; i < variables.length; i++) {
-        KernelTypeVariableBuilder variable = type.typeVariables[i];
-        KernelTypeBuilder bound = substituteRange(
+        TypeVariableBuilder variable = type.typeVariables[i];
+        TypeBuilder bound = substituteRange(
             variable.bound, upperSubstitution, lowerSubstitution,
             isCovariant: isCovariant);
         if (bound != variable.bound) {
-          variables[i] = new KernelTypeVariableBuilder(
-              variable.name, variable.parent, variable.charOffset, bound);
+          variables[i] = new TypeVariableBuilder(
+              variable.name, variable.parent, variable.charOffset,
+              bound: bound);
           changed = true;
         } else {
           variables[i] = variable;
@@ -190,12 +181,12 @@
 
     if (type.formals != null) {
       for (int i = 0; i < formals.length; i++) {
-        KernelFormalParameterBuilder formal = type.formals[i];
-        KernelTypeBuilder parameterType = substituteRange(
+        FormalParameterBuilder formal = type.formals[i];
+        TypeBuilder parameterType = substituteRange(
             formal.type, upperSubstitution, lowerSubstitution,
             isCovariant: !isCovariant);
         if (parameterType != formal.type) {
-          formals[i] = new KernelFormalParameterBuilder(
+          formals[i] = new FormalParameterBuilder(
               formal.metadata,
               formal.modifiers,
               parameterType,
@@ -217,7 +208,7 @@
     }
 
     if (changed) {
-      return new KernelFunctionTypeBuilder(returnType, variables, formals);
+      return new FunctionTypeBuilder(returnType, variables, formals);
     }
 
     return type;
@@ -225,8 +216,8 @@
   return type;
 }
 
-KernelTypeBuilder substitute(KernelTypeBuilder type,
-    Map<TypeVariableBuilder, KernelTypeBuilder> substitution) {
+TypeBuilder substitute(
+    TypeBuilder type, Map<TypeVariableBuilder, TypeBuilder> substitution) {
   return substituteRange(type, substitution, substitution, isCovariant: true);
 }
 
@@ -236,13 +227,9 @@
 /// See the [description]
 /// (https://github.com/dart-lang/sdk/blob/master/docs/language/informal/instantiate-to-bound.md)
 /// of the algorithm for details.
-List<KernelTypeBuilder> calculateBounds(
-    List<TypeVariableBuilder> variables,
-    KernelTypeBuilder dynamicType,
-    KernelTypeBuilder bottomType,
-    KernelClassBuilder objectClass) {
-  List<KernelTypeBuilder> bounds =
-      new List<KernelTypeBuilder>(variables.length);
+List<TypeBuilder> calculateBounds(List<TypeVariableBuilder> variables,
+    TypeBuilder dynamicType, TypeBuilder bottomType, ClassBuilder objectClass) {
+  List<TypeBuilder> bounds = new List<TypeBuilder>(variables.length);
 
   for (int i = 0; i < variables.length; i++) {
     bounds[i] = variables[i].bound ?? dynamicType;
@@ -251,10 +238,10 @@
   TypeVariablesGraph graph = new TypeVariablesGraph(variables, bounds);
   List<List<int>> stronglyConnected = computeStrongComponents(graph);
   for (List<int> component in stronglyConnected) {
-    Map<TypeVariableBuilder, KernelTypeBuilder> dynamicSubstitution =
-        <TypeVariableBuilder, KernelTypeBuilder>{};
-    Map<TypeVariableBuilder, KernelTypeBuilder> nullSubstitution =
-        <TypeVariableBuilder, KernelTypeBuilder>{};
+    Map<TypeVariableBuilder, TypeBuilder> dynamicSubstitution =
+        <TypeVariableBuilder, TypeBuilder>{};
+    Map<TypeVariableBuilder, TypeBuilder> nullSubstitution =
+        <TypeVariableBuilder, TypeBuilder>{};
     for (int variableIndex in component) {
       dynamicSubstitution[variables[variableIndex]] = dynamicType;
       nullSubstitution[variables[variableIndex]] = bottomType;
@@ -267,10 +254,10 @@
   }
 
   for (int i = 0; i < variables.length; i++) {
-    Map<TypeVariableBuilder, KernelTypeBuilder> substitution =
-        <TypeVariableBuilder, KernelTypeBuilder>{};
-    Map<TypeVariableBuilder, KernelTypeBuilder> nullSubstitution =
-        <TypeVariableBuilder, KernelTypeBuilder>{};
+    Map<TypeVariableBuilder, TypeBuilder> substitution =
+        <TypeVariableBuilder, TypeBuilder>{};
+    Map<TypeVariableBuilder, TypeBuilder> nullSubstitution =
+        <TypeVariableBuilder, TypeBuilder>{};
     substitution[variables[i]] = bounds[i];
     nullSubstitution[variables[i]] = bottomType;
     for (int j = 0; j < variables.length; j++) {
@@ -348,11 +335,11 @@
 /// Finds all type builders for [variable] in [type].
 ///
 /// Returns list of the found type builders.
-List<NamedTypeBuilder<TypeBuilder, Object>> findVariableUsesInType(
-  TypeVariableBuilder<TypeBuilder, Object> variable,
+List<NamedTypeBuilder> findVariableUsesInType(
+  TypeVariableBuilder variable,
   TypeBuilder type,
 ) {
-  var uses = <NamedTypeBuilder<TypeBuilder, Object>>[];
+  var uses = <NamedTypeBuilder>[];
   if (type is NamedTypeBuilder) {
     if (type.declaration == variable) {
       uses.add(type);
@@ -366,8 +353,7 @@
   } else if (type is FunctionTypeBuilder) {
     uses.addAll(findVariableUsesInType(variable, type.returnType));
     if (type.typeVariables != null) {
-      for (TypeVariableBuilder<TypeBuilder, Object> dependentVariable
-          in type.typeVariables) {
+      for (TypeVariableBuilder dependentVariable in type.typeVariables) {
         if (dependentVariable.bound != null) {
           uses.addAll(
               findVariableUsesInType(variable, dependentVariable.bound));
@@ -379,7 +365,7 @@
       }
     }
     if (type.formals != null) {
-      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+      for (FormalParameterBuilder formal in type.formals) {
         uses.addAll(findVariableUsesInType(variable, formal.type));
       }
     }
@@ -393,13 +379,12 @@
 /// variable builder from [variables] that references other [variables] in its
 /// bound.  The second element in the pair is the list of found references
 /// represented as type builders.
-List<Object> findInboundReferences(
-    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+List<Object> findInboundReferences(List<TypeVariableBuilder> variables) {
   var variablesAndDependencies = <Object>[];
-  for (TypeVariableBuilder<TypeBuilder, Object> dependent in variables) {
-    var dependencies = <NamedTypeBuilder<TypeBuilder, Object>>[];
-    for (TypeVariableBuilder<TypeBuilder, Object> dependence in variables) {
-      List<NamedTypeBuilder<TypeBuilder, Object>> uses =
+  for (TypeVariableBuilder dependent in variables) {
+    var dependencies = <NamedTypeBuilder>[];
+    for (TypeVariableBuilder dependence in variables) {
+      List<NamedTypeBuilder> uses =
           findVariableUsesInType(dependence, dependent.bound);
       if (uses.length != 0) {
         dependencies.addAll(uses);
@@ -421,10 +406,9 @@
 /// [findInboundReferences].
 List<Object> findRawTypesWithInboundReferences(TypeBuilder type) {
   var typesAndDependencies = <Object>[];
-  if (type is NamedTypeBuilder<TypeBuilder, Object>) {
+  if (type is NamedTypeBuilder) {
     if (type.arguments == null) {
-      TypeDeclarationBuilder<TypeBuilder, Object> declaration =
-          type.declaration;
+      TypeDeclarationBuilder declaration = type.declaration;
       if (declaration is DillClassBuilder) {
         bool hasInbound = false;
         List<TypeParameter> typeParameters = declaration.target.typeParameters;
@@ -451,7 +435,7 @@
           typesAndDependencies.add(type);
           typesAndDependencies.add(const <Object>[]);
         }
-      } else if (declaration is ClassBuilder<TypeBuilder, Object> &&
+      } else if (declaration is ClassBuilder &&
           declaration.typeVariables != null) {
         List<Object> dependencies =
             findInboundReferences(declaration.typeVariables);
@@ -459,7 +443,7 @@
           typesAndDependencies.add(type);
           typesAndDependencies.add(dependencies);
         }
-      } else if (declaration is TypeAliasBuilder<TypeBuilder, Object>) {
+      } else if (declaration is TypeAliasBuilder) {
         if (declaration.typeVariables != null) {
           List<Object> dependencies =
               findInboundReferences(declaration.typeVariables);
@@ -490,8 +474,7 @@
     typesAndDependencies
         .addAll(findRawTypesWithInboundReferences(type.returnType));
     if (type.typeVariables != null) {
-      for (TypeVariableBuilder<TypeBuilder, Object> variable
-          in type.typeVariables) {
+      for (TypeVariableBuilder variable in type.typeVariables) {
         if (variable.bound != null) {
           typesAndDependencies
               .addAll(findRawTypesWithInboundReferences(variable.bound));
@@ -503,7 +486,7 @@
       }
     }
     if (type.formals != null) {
-      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+      for (FormalParameterBuilder formal in type.formals) {
         typesAndDependencies
             .addAll(findRawTypesWithInboundReferences(formal.type));
       }
@@ -518,25 +501,20 @@
 /// [TypeDeclarationBuilder] for the type variable from [variables] that has raw
 /// generic types with inbound references in its bound.  The second element of
 /// the triplet is the error message.  The third element is the context.
-List<Object> getInboundReferenceIssues(
-    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+List<Object> getInboundReferenceIssues(List<TypeVariableBuilder> variables) {
   var issues = <Object>[];
-  for (TypeVariableBuilder<TypeBuilder, Object> variable in variables) {
+  for (TypeVariableBuilder variable in variables) {
     if (variable.bound != null) {
       List<Object> rawTypesAndMutualDependencies =
           findRawTypesWithInboundReferences(variable.bound);
       for (int i = 0; i < rawTypesAndMutualDependencies.length; i += 2) {
-        NamedTypeBuilder<TypeBuilder, Object> type =
-            rawTypesAndMutualDependencies[i];
+        NamedTypeBuilder type = rawTypesAndMutualDependencies[i];
         List<Object> variablesAndDependencies =
             rawTypesAndMutualDependencies[i + 1];
         for (int j = 0; j < variablesAndDependencies.length; j += 2) {
-          TypeVariableBuilder<TypeBuilder, Object> dependent =
-              variablesAndDependencies[j];
-          List<NamedTypeBuilder<TypeBuilder, Object>> dependencies =
-              variablesAndDependencies[j + 1];
-          for (NamedTypeBuilder<TypeBuilder, Object> dependency
-              in dependencies) {
+          TypeVariableBuilder dependent = variablesAndDependencies[j];
+          List<NamedTypeBuilder> dependencies = variablesAndDependencies[j + 1];
+          for (NamedTypeBuilder dependency in dependencies) {
             issues.add(variable);
             issues.add(templateBoundIssueViaRawTypeWithNonSimpleBounds
                 .withArguments(type.declaration.name));
@@ -573,20 +551,18 @@
 /// using type for [start], and not the corresponding type declaration,
 /// is better error reporting.
 List<List<Object>> findRawTypePathsToDeclaration(
-    TypeBuilder start, TypeDeclarationBuilder<TypeBuilder, Object> end,
-    [Set<TypeDeclarationBuilder<TypeBuilder, Object>> visited]) {
-  visited ??= new Set<TypeDeclarationBuilder<TypeBuilder, Object>>.identity();
+    TypeBuilder start, TypeDeclarationBuilder end,
+    [Set<TypeDeclarationBuilder> visited]) {
+  visited ??= new Set<TypeDeclarationBuilder>.identity();
   var paths = <List<Object>>[];
-  if (start is NamedTypeBuilder<TypeBuilder, Object>) {
-    TypeDeclarationBuilder<TypeBuilder, Object> declaration = start.declaration;
+  if (start is NamedTypeBuilder) {
+    TypeDeclarationBuilder declaration = start.declaration;
     if (start.arguments == null) {
       if (start.declaration == end) {
         paths.add(<Object>[start]);
       } else if (visited.add(start.declaration)) {
-        if (declaration is ClassBuilder<TypeBuilder, Object> &&
-            declaration.typeVariables != null) {
-          for (TypeVariableBuilder<TypeBuilder, Object> variable
-              in declaration.typeVariables) {
+        if (declaration is ClassBuilder && declaration.typeVariables != null) {
+          for (TypeVariableBuilder variable in declaration.typeVariables) {
             if (variable.bound != null) {
               for (List<Object> path in findRawTypePathsToDeclaration(
                   variable.bound, end, visited)) {
@@ -594,10 +570,9 @@
               }
             }
           }
-        } else if (declaration is TypeAliasBuilder<TypeBuilder, Object>) {
+        } else if (declaration is TypeAliasBuilder) {
           if (declaration.typeVariables != null) {
-            for (TypeVariableBuilder<TypeBuilder, Object> variable
-                in declaration.typeVariables) {
+            for (TypeVariableBuilder variable in declaration.typeVariables) {
               if (variable.bound != null) {
                 for (List<Object> dependencyPath
                     in findRawTypePathsToDeclaration(
@@ -610,8 +585,7 @@
           if (declaration.type is FunctionTypeBuilder) {
             FunctionTypeBuilder type = declaration.type;
             if (type.typeVariables != null) {
-              for (TypeVariableBuilder<TypeBuilder, Object> variable
-                  in type.typeVariables) {
+              for (TypeVariableBuilder variable in type.typeVariables) {
                 if (variable.bound != null) {
                   for (List<Object> dependencyPath
                       in findRawTypePathsToDeclaration(
@@ -634,8 +608,7 @@
   } else if (start is FunctionTypeBuilder) {
     paths.addAll(findRawTypePathsToDeclaration(start.returnType, end, visited));
     if (start.typeVariables != null) {
-      for (TypeVariableBuilder<TypeBuilder, Object> variable
-          in start.typeVariables) {
+      for (TypeVariableBuilder variable in start.typeVariables) {
         if (variable.bound != null) {
           paths.addAll(
               findRawTypePathsToDeclaration(variable.bound, end, visited));
@@ -647,7 +620,7 @@
       }
     }
     if (start.formals != null) {
-      for (FormalParameterBuilder<TypeBuilder> formal in start.formals) {
+      for (FormalParameterBuilder formal in start.formals) {
         paths.addAll(findRawTypePathsToDeclaration(formal.type, end, visited));
       }
     }
@@ -665,13 +638,10 @@
 ///
 /// The reason for putting the type variables into the cycles is better error
 /// reporting.
-List<List<Object>> findRawTypeCycles(
-    TypeDeclarationBuilder<TypeBuilder, Object> declaration) {
+List<List<Object>> findRawTypeCycles(TypeDeclarationBuilder declaration) {
   var cycles = <List<Object>>[];
-  if (declaration is ClassBuilder<TypeBuilder, Object> &&
-      declaration.typeVariables != null) {
-    for (TypeVariableBuilder<TypeBuilder, Object> variable
-        in declaration.typeVariables) {
+  if (declaration is ClassBuilder && declaration.typeVariables != null) {
+    for (TypeVariableBuilder variable in declaration.typeVariables) {
       if (variable.bound != null) {
         for (List<Object> path
             in findRawTypePathsToDeclaration(variable.bound, declaration)) {
@@ -679,10 +649,9 @@
         }
       }
     }
-  } else if (declaration is TypeAliasBuilder<TypeBuilder, Object>) {
+  } else if (declaration is TypeAliasBuilder) {
     if (declaration.typeVariables != null) {
-      for (TypeVariableBuilder<TypeBuilder, Object> variable
-          in declaration.typeVariables) {
+      for (TypeVariableBuilder variable in declaration.typeVariables) {
         if (variable.bound != null) {
           for (List<Object> dependencyPath
               in findRawTypePathsToDeclaration(variable.bound, declaration)) {
@@ -694,8 +663,7 @@
     if (declaration.type is FunctionTypeBuilder) {
       FunctionTypeBuilder type = declaration.type;
       if (type.typeVariables != null) {
-        for (TypeVariableBuilder<TypeBuilder, Object> variable
-            in type.typeVariables) {
+        for (TypeVariableBuilder variable in type.typeVariables) {
           if (variable.bound != null) {
             for (List<Object> dependencyPath
                 in findRawTypePathsToDeclaration(variable.bound, declaration)) {
@@ -719,14 +687,13 @@
 /// generic types with inbound references in its bound.  The second element of
 /// the triplet is the error message.  The third element is the context.
 List<Object> convertRawTypeCyclesIntoIssues(
-    TypeDeclarationBuilder<TypeBuilder, Object> declaration,
-    List<List<Object>> cycles) {
+    TypeDeclarationBuilder declaration, List<List<Object>> cycles) {
   List<Object> issues = <Object>[];
   for (List<Object> cycle in cycles) {
     if (cycle.length == 2) {
       // Loop.
-      TypeVariableBuilder<TypeBuilder, Object> variable = cycle[0];
-      NamedTypeBuilder<TypeBuilder, Object> type = cycle[1];
+      TypeVariableBuilder variable = cycle[0];
+      NamedTypeBuilder type = cycle[1];
       issues.add(variable);
       issues.add(templateBoundIssueViaLoopNonSimplicity
           .withArguments(type.declaration.name));
@@ -734,14 +701,14 @@
     } else {
       var context = <LocatedMessage>[];
       for (int i = 0; i < cycle.length; i += 2) {
-        TypeVariableBuilder<TypeBuilder, Object> variable = cycle[i];
-        NamedTypeBuilder<TypeBuilder, Object> type = cycle[i + 1];
+        TypeVariableBuilder variable = cycle[i];
+        NamedTypeBuilder type = cycle[i + 1];
         context.add(templateNonSimpleBoundViaReference
             .withArguments(type.declaration.name)
             .withLocation(
                 variable.fileUri, variable.charOffset, variable.name.length));
       }
-      NamedTypeBuilder<TypeBuilder, Object> firstEncounteredType = cycle[1];
+      NamedTypeBuilder firstEncounteredType = cycle[1];
 
       issues.add(declaration);
       issues.add(templateBoundIssueViaCycleNonSimplicity.withArguments(
@@ -762,7 +729,7 @@
 /// The second element in the triplet is the error message.  The third element
 /// in the triplet is the context.
 List<Object> getNonSimplicityIssuesForTypeVariables(
-    List<TypeVariableBuilder<TypeBuilder, Object>> variables) {
+    List<TypeVariableBuilder> variables) {
   if (variables == null) return <Object>[];
   return getInboundReferenceIssues(variables);
 }
@@ -778,13 +745,12 @@
 /// The second element in the triplet is the error message.  The third element
 /// in the triplet is the context.
 List<Object> getNonSimplicityIssuesForDeclaration(
-    TypeDeclarationBuilder<TypeBuilder, Object> declaration,
+    TypeDeclarationBuilder declaration,
     {bool performErrorRecovery: true}) {
   var issues = <Object>[];
-  if (declaration is ClassBuilder<TypeBuilder, Object> &&
-      declaration.typeVariables != null) {
+  if (declaration is ClassBuilder && declaration.typeVariables != null) {
     issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
-  } else if (declaration is TypeAliasBuilder<TypeBuilder, Object> &&
+  } else if (declaration is TypeAliasBuilder &&
       declaration.typeVariables != null) {
     issues.addAll(getInboundReferenceIssues(declaration.typeVariables));
   }
@@ -800,7 +766,7 @@
           "${declaration.fileUri}:${declaration.name}";
       String lexMinPathAndName = null;
       for (int i = 1; i < cycle.length; i += 2) {
-        NamedTypeBuilder<TypeBuilder, Object> type = cycle[i];
+        NamedTypeBuilder type = cycle[i];
         String pathAndName =
             "${type.declaration.fileUri}:${type.declaration.name}";
         if (lexMinPathAndName == null ||
@@ -830,7 +796,7 @@
 /// of [findRawTypeCycles].
 void breakCycles(List<List<Object>> cycles) {
   for (List<Object> cycle in cycles) {
-    TypeVariableBuilder<TypeBuilder, Object> variable = cycle[0];
+    TypeVariableBuilder variable = cycle[0];
     variable.bound = null;
   }
 }
@@ -841,20 +807,18 @@
     if (type.typeVariables != null && type.typeVariables.length > 0) {
       result.add(type);
 
-      for (TypeVariableBuilder<TypeBuilder, Object> typeVariable
-          in type.typeVariables) {
+      for (TypeVariableBuilder typeVariable in type.typeVariables) {
         findGenericFunctionTypes(typeVariable.bound, result: result);
         findGenericFunctionTypes(typeVariable.defaultType, result: result);
       }
     }
     findGenericFunctionTypes(type.returnType, result: result);
     if (type.formals != null) {
-      for (FormalParameterBuilder<TypeBuilder> formal in type.formals) {
+      for (FormalParameterBuilder formal in type.formals) {
         findGenericFunctionTypes(formal.type, result: result);
       }
     }
-  } else if (type is NamedTypeBuilder<TypeBuilder, Object> &&
-      type.arguments != null) {
+  } else if (type is NamedTypeBuilder && type.arguments != null) {
     for (TypeBuilder argument in type.arguments) {
       findGenericFunctionTypes(argument, result: result);
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
index 8aad22c..ba72be2 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_builder_computer.dart
@@ -24,106 +24,101 @@
 import '../kernel/kernel_builder.dart'
     show
         DynamicTypeBuilder,
-        KernelClassBuilder,
-        KernelFormalParameterBuilder,
-        KernelFunctionTypeBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
+        FunctionTypeBuilder,
+        ClassBuilder,
+        FormalParameterBuilder,
+        NamedTypeBuilder,
+        TypeVariableBuilder,
         LibraryBuilder,
+        TypeBuilder,
         VoidTypeBuilder;
 
 import '../loader.dart' show Loader;
 
 import '../parser.dart' show FormalParameterKind;
 
-class TypeBuilderComputer implements DartTypeVisitor<KernelTypeBuilder> {
-  final Loader<Library> loader;
+class TypeBuilderComputer implements DartTypeVisitor<TypeBuilder> {
+  final Loader loader;
 
   const TypeBuilderComputer(this.loader);
 
-  KernelTypeBuilder defaultDartType(DartType node) {
+  TypeBuilder defaultDartType(DartType node) {
     throw "Unsupported";
   }
 
-  KernelTypeBuilder visitInvalidType(InvalidType node) {
+  TypeBuilder visitInvalidType(InvalidType node) {
     throw "Not implemented";
   }
 
-  KernelTypeBuilder visitDynamicType(DynamicType node) {
-    return new KernelNamedTypeBuilder("dynamic", null)
-      ..bind(new DynamicTypeBuilder<KernelTypeBuilder, DartType>(
-          const DynamicType(), loader.coreLibrary, -1));
+  TypeBuilder visitDynamicType(DynamicType node) {
+    return new NamedTypeBuilder("dynamic", null)
+      ..bind(
+          new DynamicTypeBuilder(const DynamicType(), loader.coreLibrary, -1));
   }
 
-  KernelTypeBuilder visitVoidType(VoidType node) {
-    return new KernelNamedTypeBuilder("void", null)
-      ..bind(new VoidTypeBuilder<KernelTypeBuilder, VoidType>(
-          const VoidType(), loader.coreLibrary, -1));
+  TypeBuilder visitVoidType(VoidType node) {
+    return new NamedTypeBuilder("void", null)
+      ..bind(new VoidTypeBuilder(const VoidType(), loader.coreLibrary, -1));
   }
 
-  KernelTypeBuilder visitBottomType(BottomType node) {
+  TypeBuilder visitBottomType(BottomType node) {
     throw "Not implemented";
   }
 
-  KernelTypeBuilder visitInterfaceType(InterfaceType node) {
-    KernelClassBuilder cls =
+  TypeBuilder visitInterfaceType(InterfaceType node) {
+    ClassBuilder cls =
         loader.computeClassBuilderFromTargetClass(node.classNode);
-    List<KernelTypeBuilder> arguments;
+    List<TypeBuilder> arguments;
     List<DartType> kernelArguments = node.typeArguments;
     if (kernelArguments.isNotEmpty) {
-      arguments = new List<KernelTypeBuilder>(kernelArguments.length);
+      arguments = new List<TypeBuilder>(kernelArguments.length);
       for (int i = 0; i < kernelArguments.length; i++) {
         arguments[i] = kernelArguments[i].accept(this);
       }
     }
-    return new KernelNamedTypeBuilder(cls.name, arguments)..bind(cls);
+    return new NamedTypeBuilder(cls.name, arguments)..bind(cls);
   }
 
   @override
-  KernelTypeBuilder visitFunctionType(FunctionType node) {
-    KernelTypeBuilder returnType = node.returnType.accept(this);
+  TypeBuilder visitFunctionType(FunctionType node) {
+    TypeBuilder returnType = node.returnType.accept(this);
     // We could compute the type variables here. However, the current
-    // implementation of [visitTypeParameterType] is suffient.
-    List<KernelTypeVariableBuilder> typeVariables = null;
+    // implementation of [visitTypeParameterType] is sufficient.
+    List<TypeVariableBuilder> typeVariables = null;
     List<DartType> positionalParameters = node.positionalParameters;
     List<NamedType> namedParameters = node.namedParameters;
-    List<KernelFormalParameterBuilder> formals =
-        new List<KernelFormalParameterBuilder>(
-            positionalParameters.length + namedParameters.length);
+    List<FormalParameterBuilder> formals = new List<FormalParameterBuilder>(
+        positionalParameters.length + namedParameters.length);
     for (int i = 0; i < positionalParameters.length; i++) {
-      KernelTypeBuilder type = positionalParameters[i].accept(this);
+      TypeBuilder type = positionalParameters[i].accept(this);
       FormalParameterKind kind = FormalParameterKind.mandatory;
       if (i >= node.requiredParameterCount) {
         kind = FormalParameterKind.optionalPositional;
       }
-      formals[i] =
-          new KernelFormalParameterBuilder(null, 0, type, null, null, -1)
-            ..kind = kind;
+      formals[i] = new FormalParameterBuilder(null, 0, type, null, null, -1)
+        ..kind = kind;
     }
     for (int i = 0; i < namedParameters.length; i++) {
       NamedType parameter = namedParameters[i];
-      KernelTypeBuilder type = positionalParameters[i].accept(this);
+      TypeBuilder type = positionalParameters[i].accept(this);
       formals[i + positionalParameters.length] =
-          new KernelFormalParameterBuilder(
-              null, 0, type, parameter.name, null, -1)
+          new FormalParameterBuilder(null, 0, type, parameter.name, null, -1)
             ..kind = FormalParameterKind.optionalNamed;
     }
 
-    return new KernelFunctionTypeBuilder(returnType, typeVariables, formals);
+    return new FunctionTypeBuilder(returnType, typeVariables, formals);
   }
 
-  KernelTypeBuilder visitTypeParameterType(TypeParameterType node) {
+  TypeBuilder visitTypeParameterType(TypeParameterType node) {
     TypeParameter parameter = node.parameter;
     Class kernelClass = parameter.parent;
     Library kernelLibrary = kernelClass.enclosingLibrary;
-    LibraryBuilder<KernelTypeBuilder, Library> library =
-        loader.builders[kernelLibrary.importUri];
-    return new KernelNamedTypeBuilder(parameter.name, null)
-      ..bind(new KernelTypeVariableBuilder.fromKernel(parameter, library));
+    LibraryBuilder library = loader.builders[kernelLibrary.importUri];
+    return new NamedTypeBuilder(parameter.name, null)
+      ..bind(new TypeVariableBuilder.fromKernel(parameter, library));
   }
 
-  KernelTypeBuilder visitTypedefType(TypedefType node) {
+  TypeBuilder visitTypedefType(TypedefType node) {
     throw "Not implemented";
   }
 }
diff --git a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
index 7b329bf..45d0275 100644
--- a/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/type_labeler.dart
@@ -152,7 +152,7 @@
     while (parent is! Library && parent != null) {
       parent = parent.parent;
     }
-    // Note that this can be null if, for instance, the errornious code is not
+    // Note that this can be null if, for instance, the erroneous code is not
     // actually in the tree - then we don't know where it comes from!
     Library enclosingLibrary = parent;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/types.dart b/pkg/front_end/lib/src/fasta/kernel/types.dart
index 94e0b9b..de2ee77 100644
--- a/pkg/front_end/lib/src/fasta/kernel/types.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/types.dart
@@ -284,7 +284,7 @@
   bool isInterfaceRelated(InterfaceType s, Nullability sNullability,
       InterfaceType t, Nullability tNullability, Types types) {
     if (s.classNode == types.hierarchy.nullKernelClass) {
-      // This is an optimization, to avoid instantating unnecessary type
+      // This is an optimization, to avoid instantiating unnecessary type
       // arguments in getKernelTypeAsInstanceOf.
       return true;
     }
diff --git a/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart b/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart
index 6949064..df16b06 100644
--- a/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/unlinked_scope.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.
 
-import 'kernel_builder.dart' show Declaration, Scope;
+import 'kernel_builder.dart' show Builder, Scope;
 
 /// Scope that returns an [UnlinkedDeclaration] if a name can't be resolved.
 /// This is intended to be used as the `enclosingScope` in `BodyBuilder` to
@@ -10,13 +10,13 @@
 class UnlinkedScope extends Scope {
   UnlinkedScope() : super.top(isModifiable: false);
 
-  Declaration lookupIn(String name, int charOffset, Uri fileUri,
-      Map<String, Declaration> map, bool isInstanceScope) {
+  Builder lookupIn(String name, int charOffset, Uri fileUri,
+      Map<String, Builder> map, bool isInstanceScope) {
     return new UnlinkedDeclaration(name, isInstanceScope, charOffset, fileUri);
   }
 }
 
-class UnlinkedDeclaration extends Declaration {
+class UnlinkedDeclaration extends Builder {
   final String name;
 
   final bool isInstanceScope;
@@ -31,7 +31,7 @@
       this.name, this.isInstanceScope, this.charOffset, this.fileUri);
 
   @override
-  Declaration get parent => null;
+  Builder get parent => null;
 
   @override
   String get fullNameForErrors => name;
diff --git a/pkg/front_end/lib/src/fasta/kernel/utils.dart b/pkg/front_end/lib/src/fasta/kernel/utils.dart
index c074608..c7556d8 100644
--- a/pkg/front_end/lib/src/fasta/kernel/utils.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/utils.dart
@@ -6,6 +6,8 @@
 
 import 'dart:io' show BytesBuilder, File, IOSink;
 
+import 'dart:typed_data' show Uint8List;
+
 import 'package:kernel/clone.dart' show CloneVisitor;
 
 import 'package:kernel/ast.dart'
@@ -59,7 +61,7 @@
 }
 
 /// Serialize the libraries in [component] that match [filter].
-List<int> serializeComponent(Component component,
+Uint8List serializeComponent(Component component,
     {bool filter(Library library),
     bool includeSources: true,
     bool includeOffsets: true}) {
@@ -75,7 +77,7 @@
 
 const String kDebugClassName = "#DebugClass";
 
-List<int> serializeProcedure(Procedure procedure) {
+Component createExpressionEvaluationComponent(Procedure procedure) {
   Library fakeLibrary =
       new Library(new Uri(scheme: 'evaluate', path: 'source'));
 
@@ -117,8 +119,11 @@
   }
 
   // TODO(vegorov) find a way to preserve metadata.
-  Component program = new Component(libraries: [fakeLibrary]);
-  return serializeComponent(program);
+  return new Component(libraries: [fakeLibrary]);
+}
+
+List<int> serializeProcedure(Procedure procedure) {
+  return serializeComponent(createExpressionEvaluationComponent(procedure));
 }
 
 /// A [Sink] that directly writes data into a byte builder.
diff --git a/pkg/front_end/lib/src/fasta/kernel/verifier.dart b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
index 26d6421..091020b 100644
--- a/pkg/front_end/lib/src/fasta/kernel/verifier.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/verifier.dart
@@ -48,7 +48,7 @@
 }
 
 class FastaVerifyingVisitor extends VerifyingVisitor
-    implements TypeSchemaVisitor {
+    implements TypeSchemaVisitor<void> {
   final List<LocatedMessage> errors = <LocatedMessage>[];
 
   Uri fileUri;
diff --git a/pkg/front_end/lib/src/fasta/loader.dart b/pkg/front_end/lib/src/fasta/loader.dart
index 67b5cb2..33b2bfc 100644
--- a/pkg/front_end/lib/src/fasta/loader.dart
+++ b/pkg/front_end/lib/src/fasta/loader.dart
@@ -8,8 +8,10 @@
 
 import 'dart:collection' show Queue;
 
+import 'package:kernel/ast.dart' show Library;
+
 import 'builder/builder.dart'
-    show ClassBuilder, Declaration, LibraryBuilder, TypeBuilder;
+    show ClassBuilder, Builder, LibraryBuilder, TypeBuilder;
 
 import 'crash.dart' show firstSourceUri;
 
@@ -35,12 +37,12 @@
 
 const String untranslatableUriScheme = "org-dartlang-untranslatable-uri";
 
-abstract class Loader<L> {
+abstract class Loader {
   final Map<Uri, LibraryBuilder> builders = <Uri, LibraryBuilder>{};
 
   final Queue<LibraryBuilder> unparsedLibraries = new Queue<LibraryBuilder>();
 
-  final List<L> libraries = <L>[];
+  final List<Library> libraries = <Library>[];
 
   final TargetImplementation target;
 
@@ -102,6 +104,7 @@
               fileUri.scheme == "dart-ext")) {
         fileUri = null;
       }
+      String packageFragment;
       if (fileUri == null) {
         switch (uri.scheme) {
           case "package":
@@ -110,6 +113,7 @@
                 new Uri(
                     scheme: untranslatableUriScheme,
                     path: Uri.encodeComponent("$uri"));
+            packageFragment = target.uriTranslator.getPackageFragment(uri);
             break;
 
           default:
@@ -117,8 +121,36 @@
             break;
         }
       }
+      bool hasPackageSpecifiedLanguageVersion = false;
+      int packageSpecifiedLanguageVersionMajor;
+      int packageSpecifiedLanguageVersionMinor;
+      if (packageFragment != null) {
+        List<String> properties = packageFragment.split("&");
+        for (int i = 0; i < properties.length; ++i) {
+          String property = properties[i];
+          if (property.startsWith("dart=")) {
+            hasPackageSpecifiedLanguageVersion = true;
+            String langaugeVersionString = property.substring(5);
+
+            // Verify that the version is x.y[whatever]
+            List<String> dotSeparatedParts = langaugeVersionString.split(".");
+            if (dotSeparatedParts.length >= 2) {
+              packageSpecifiedLanguageVersionMajor =
+                  int.tryParse(dotSeparatedParts[0]);
+              packageSpecifiedLanguageVersionMinor =
+                  int.tryParse(dotSeparatedParts[1]);
+            }
+            break;
+          }
+        }
+      }
       LibraryBuilder library =
           target.createLibraryBuilder(uri, fileUri, origin);
+      if (hasPackageSpecifiedLanguageVersion) {
+        library.setLanguageVersion(packageSpecifiedLanguageVersionMajor,
+            packageSpecifiedLanguageVersionMinor,
+            explicit: false);
+      }
       if (uri.scheme == "dart" && uri.path == "core") {
         coreLibrary = library;
       }
@@ -291,20 +323,19 @@
     return formattedMessage;
   }
 
-  Declaration getAbstractClassInstantiationError() {
+  Builder getAbstractClassInstantiationError() {
     return target.getAbstractClassInstantiationError(this);
   }
 
-  Declaration getCompileTimeError() => target.getCompileTimeError(this);
+  Builder getCompileTimeError() => target.getCompileTimeError(this);
 
-  Declaration getDuplicatedFieldInitializerError() {
+  Builder getDuplicatedFieldInitializerError() {
     return target.getDuplicatedFieldInitializerError(this);
   }
 
-  Declaration getNativeAnnotation() => target.getNativeAnnotation(this);
+  Builder getNativeAnnotation() => target.getNativeAnnotation(this);
 
-  ClassBuilder<TypeBuilder, Object> computeClassBuilderFromTargetClass(
-      covariant Object cls);
+  ClassBuilder computeClassBuilderFromTargetClass(covariant Object cls);
 
   TypeBuilder computeTypeBuilder(covariant Object type);
 }
diff --git a/pkg/front_end/lib/src/fasta/modifier.dart b/pkg/front_end/lib/src/fasta/modifier.dart
index 8c3f40c..44d7b1d 100644
--- a/pkg/front_end/lib/src/fasta/modifier.dart
+++ b/pkg/front_end/lib/src/fasta/modifier.dart
@@ -36,8 +36,11 @@
 /// keyword.
 const int mixinDeclarationMask = namedMixinApplicationMask << 1;
 
+/// Not a modifier, used for extension declarations.
+const int extensionDeclarationMask = mixinDeclarationMask << 1;
+
 /// Not a modifier, used by fields to track if they have an initializer.
-const int hasInitializerMask = mixinDeclarationMask << 1;
+const int hasInitializerMask = extensionDeclarationMask << 1;
 
 /// Not a modifier, used by formal parameters to track if they are initializing.
 const int initializingFormalMask = hasInitializerMask << 1;
diff --git a/pkg/front_end/lib/src/fasta/parser.dart b/pkg/front_end/lib/src/fasta/parser.dart
index 54082f1..0561820 100644
--- a/pkg/front_end/lib/src/fasta/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser.dart
@@ -24,6 +24,8 @@
 
 export 'parser/listener.dart' show Listener;
 
+export 'parser/class_kind.dart' show ClassKind;
+
 export 'parser/member_kind.dart' show MemberKind;
 
 export 'parser/parser.dart' show Parser;
diff --git a/pkg/front_end/lib/src/fasta/parser/class_kind.dart b/pkg/front_end/lib/src/fasta/parser/class_kind.dart
new file mode 100644
index 0000000..e5873ad
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/parser/class_kind.dart
@@ -0,0 +1,16 @@
+// 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 fasta.parser.class_kind;
+
+enum ClassKind {
+  /// A class declaration. Not including a named mixin declaration.
+  Class,
+
+  /// A mixin declaration. Not including a named mixin declaration.
+  Mixin,
+
+  /// An extension declaration.
+  Extension,
+}
diff --git a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
index e2471a4..ed2ea4e 100644
--- a/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/forwarding_listener.dart
@@ -71,8 +71,8 @@
   }
 
   @override
-  void beginClassOrMixinBody(Token token) {
-    listener?.beginClassOrMixinBody(token);
+  void beginClassOrMixinBody(ClassKind kind, Token token) {
+    listener?.beginClassOrMixinBody(kind, token);
   }
 
   @override
@@ -521,8 +521,9 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
-    listener?.endClassOrMixinBody(memberCount, beginToken, endToken);
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
+    listener?.endClassOrMixinBody(kind, memberCount, beginToken, endToken);
   }
 
   @override
@@ -593,8 +594,9 @@
   }
 
   @override
-  void endExtensionDeclaration(Token onKeyword, Token token) {
-    listener?.endExtensionDeclaration(onKeyword, token);
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token token) {
+    listener?.endExtensionDeclaration(extensionKeyword, onKeyword, token);
   }
 
   @override
@@ -641,10 +643,16 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
-    listener?.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, kind, memberKind);
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
+    listener?.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
+        initializerStart, initializerEnd, kind, memberKind);
   }
 
   @override
diff --git a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
index 0d0fccb..4c42056 100644
--- a/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
+++ b/pkg/front_end/lib/src/fasta/parser/identifier_context_impl.dart
@@ -885,7 +885,8 @@
       return next;
     }
     parser.reportRecoverableErrorWithToken(next, fasta.templateExpectedType);
-    if (!isOneOfOrEof(next, const ['>', ')', ']', '{', '}', ',', ';'])) {
+    if (!isOneOfOrEof(
+        next, const ['>', ')', '[', ']', '[]', '{', '}', ',', ';'])) {
       // When in doubt, consume the token to ensure we make progress
       token = next;
       next = token.next;
diff --git a/pkg/front_end/lib/src/fasta/parser/listener.dart b/pkg/front_end/lib/src/fasta/parser/listener.dart
index fcedb9b..6312ccd 100644
--- a/pkg/front_end/lib/src/fasta/parser/listener.dart
+++ b/pkg/front_end/lib/src/fasta/parser/listener.dart
@@ -19,6 +19,8 @@
 
 import 'identifier_context.dart' show IdentifierContext;
 
+import 'class_kind.dart' show ClassKind;
+
 import 'member_kind.dart' show MemberKind;
 
 import 'util.dart' show optional;
@@ -86,11 +88,17 @@
     logEvent("CaseExpression");
   }
 
-  void beginClassOrMixinBody(Token token) {}
+  /// Handle the start of the body of a class, mixin or extension declaration
+  /// beginning at [token]. The actual kind of declaration is indicated by
+  /// [kind].
+  void beginClassOrMixinBody(ClassKind kind, Token token) {}
 
-  /// Handle the end of the body of a class or mixin declaration.
-  /// The only substructures are the class or mixin members.
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  /// Handle the end of the body of a class, mixin or extension declaration.
+  /// The only substructures are the class, mixin or extension members.
+  ///
+  /// The actual kind of declaration is indicated by [kind].
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     logEvent("ClassOrMixinBody");
   }
 
@@ -194,7 +202,8 @@
   /// - substructures from [beginExtensionDeclaration]
   /// - on type
   /// - body
-  void endExtensionDeclaration(Token onKeyword, Token token) {
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token token) {
     logEvent('ExtensionDeclaration');
   }
 
@@ -294,8 +303,14 @@
   void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
       Token covariantToken, Token varFinalOrConst) {}
 
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     logEvent("FormalParameter");
   }
 
@@ -385,7 +400,7 @@
 
   /// Handle the beginning of a named function expression which isn't legal
   /// syntax in Dart.  Useful for recovering from Javascript code being pasted
-  /// into a Dart proram, as it will interpret `function foo() {}` as a named
+  /// into a Dart program, as it will interpret `function foo() {}` as a named
   /// function expression with return type `function` and name `foo`.
   ///
   /// Substructures:
@@ -394,7 +409,7 @@
 
   /// A named function expression which isn't legal syntax in Dart.
   /// Useful for recovering from Javascript code being pasted into a Dart
-  /// proram, as it will interpret `function foo() {}` as a named function
+  /// program, as it will interpret `function foo() {}` as a named function
   /// expression with return type `function` and name `foo`.
   ///
   /// Substructures:
@@ -678,7 +693,7 @@
 
   /// Called after the listener has recovered from an invalid function
   /// body. The parser expected an open curly brace `{` and will resume parsing
-  /// from [token] as if a function body had preceeded it.
+  /// from [token] as if a function body had preceded it.
   void handleInvalidFunctionBody(Token token) {
     logEvent("InvalidFunctionBody");
   }
diff --git a/pkg/front_end/lib/src/fasta/parser/parser.dart b/pkg/front_end/lib/src/fasta/parser/parser.dart
index d6a0d065..6d47cea 100644
--- a/pkg/front_end/lib/src/fasta/parser/parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/parser.dart
@@ -53,6 +53,8 @@
 
 import 'async_modifier.dart' show AsyncModifier;
 
+import 'class_kind.dart' show ClassKind;
+
 import 'directive_context.dart';
 
 import 'formal_parameter_kind.dart'
@@ -583,7 +585,7 @@
         return parseTopLevelMemberImpl(start);
       } else if (identical(nextValue, '<')) {
         if (identical(value, 'extension')) {
-          // The neame in an extension declaration is optional:
+          // The name in an extension declaration is optional:
           // `extension<T> on ...`
           Token endGroup = keyword.next.endGroup;
           if (endGroup != null && optional('on', endGroup.next)) {
@@ -1495,10 +1497,12 @@
     next = token.next;
 
     String value = next.stringValue;
+    Token initializerStart, initializerEnd;
     if ((identical('=', value)) || (identical(':', value))) {
       Token equal = next;
+      initializerStart = equal.next;
       listener.beginFormalParameterDefaultValueExpression();
-      token = parseExpression(equal);
+      token = initializerEnd = parseExpression(equal);
       next = token.next;
       listener.endFormalParameterDefaultValueExpression();
       // TODO(danrubel): Consider removing the last parameter from the
@@ -1519,8 +1523,8 @@
     } else {
       listener.handleFormalParameterWithoutValue(next);
     }
-    listener.endFormalParameter(
-        thisKeyword, periodAfterThis, nameToken, parameterKind, memberKind);
+    listener.endFormalParameter(thisKeyword, periodAfterThis, nameToken,
+        initializerStart, initializerEnd, parameterKind, memberKind);
     return token;
   }
 
@@ -1790,7 +1794,7 @@
       token = parseClassHeaderRecovery(start, begin, classKeyword);
       ensureBlock(token, null, 'class declaration');
     }
-    token = parseClassOrMixinBody(token);
+    token = parseClassOrMixinBody(ClassKind.Class, token);
     listener.endClassDeclaration(begin, token);
     return token;
   }
@@ -1956,7 +1960,7 @@
       token = parseMixinHeaderRecovery(token, mixinKeyword, headerStart);
       ensureBlock(token, null, 'mixin declaration');
     }
-    token = parseClassOrMixinBody(token);
+    token = parseClassOrMixinBody(ClassKind.Mixin, token);
     listener.endMixinDeclaration(mixinKeyword, token);
     return token;
   }
@@ -2099,7 +2103,7 @@
       }
     }
     TypeInfo typeInfo = computeType(onKeyword, true);
-    token = typeInfo.ensureTypeNotVoid(onKeyword, this);
+    token = typeInfo.ensureTypeOrVoid(onKeyword, this);
     if (!optional('{', token.next)) {
       // Recovery
       Token next = token.next;
@@ -2125,8 +2129,8 @@
       ensureBlock(token, null, 'extension declaration');
     }
     // TODO(danrubel): Do not allow fields or constructors
-    token = parseClassOrMixinBody(token);
-    listener.endExtensionDeclaration(onKeyword, token);
+    token = parseClassOrMixinBody(ClassKind.Extension, token);
+    listener.endExtensionDeclaration(extensionKeyword, onKeyword, token);
     return token;
   }
 
@@ -2893,10 +2897,10 @@
   ///   '{' classMember* '}'
   /// ;
   /// ```
-  Token parseClassOrMixinBody(Token token) {
+  Token parseClassOrMixinBody(ClassKind kind, Token token) {
     Token begin = token = token.next;
     assert(optional('{', token));
-    listener.beginClassOrMixinBody(token);
+    listener.beginClassOrMixinBody(kind, token);
     int count = 0;
     while (notEofOrValue('}', token.next)) {
       token = parseClassOrMixinMemberImpl(token);
@@ -2904,7 +2908,7 @@
     }
     token = token.next;
     assert(optional('}', token));
-    listener.endClassOrMixinBody(count, begin, token);
+    listener.endClassOrMixinBody(kind, count, begin, token);
     return token;
   }
 
@@ -4925,6 +4929,14 @@
 
   Token parseSend(Token token, IdentifierContext context) {
     Token beginToken = token = ensureIdentifier(token, context);
+    if (optional('!', token.next)) {
+      Token bang = token.next;
+      Token next = bang.next;
+      if (optional('(', next) || optional('[', next)) {
+        listener.handleNonNullAssertExpression(bang);
+        token = bang;
+      }
+    }
     TypeParamOrArgInfo typeArg = computeMethodTypeArguments(token);
     if (typeArg != noTypeParamOrArg) {
       token = typeArg.parseArguments(token, this);
@@ -5870,7 +5882,7 @@
             //   } catch (E e, t) {
             // will recover to
             //   } on E catch (e, t) {
-            // with a detailed explaination for the user in the error
+            // with a detailed explanation for the user in the error
             // indicating what they should do to fix the code.
 
             // TODO(danrubel): Consider inserting synthetic identifier if
diff --git a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
index cf47b09..e75ccc9 100644
--- a/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
+++ b/pkg/front_end/lib/src/fasta/parser/top_level_parser.dart
@@ -6,14 +6,17 @@
 
 import '../../scanner/token.dart' show Token;
 
-import 'listener.dart' show Listener;
+import 'class_kind.dart' show ClassKind;
 
 import 'class_member_parser.dart' show ClassMemberParser;
 
+import 'listener.dart' show Listener;
+
 /// Parser which only parses top-level elements, but ignores their bodies.
 /// Use [Parser] to parse everything.
 class TopLevelParser extends ClassMemberParser {
   TopLevelParser(Listener listener) : super(listener);
 
-  Token parseClassOrMixinBody(Token token) => skipClassOrMixinBody(token);
+  Token parseClassOrMixinBody(ClassKind kind, Token token) =>
+      skipClassOrMixinBody(token);
 }
diff --git a/pkg/front_end/lib/src/fasta/rewrite_severity.dart b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
index 40f5b8c..6f6edf5 100644
--- a/pkg/front_end/lib/src/fasta/rewrite_severity.dart
+++ b/pkg/front_end/lib/src/fasta/rewrite_severity.dart
@@ -32,86 +32,6 @@
       case "kernel/body_builder.dart":
         return severity;
     }
-  } else if (code == msg.codeMissingExplicitTypeArguments) {
-    // TODO(ahe): Remove the exceptions below.
-    // We're not sure if we want to require that all types have explicit type
-    // arguments in Fasta. Regardles, the strategy is to remove files from the
-    // list below one by one. To get started on cleaning up a given file,
-    // simply remove it from the list below and compile Fasta with itself to
-    // get a list of remaining call sites.
-    switch (path.substring(fastaPath.length + index)) {
-      case "builder/builtin_type_builder.dart":
-      case "builder/class_builder.dart":
-      case "builder/constructor_reference_builder.dart":
-      case "builder/dynamic_type_builder.dart":
-      case "builder/field_builder.dart":
-      case "builder/formal_parameter_builder.dart":
-      case "builder/function_type_builder.dart":
-      case "builder/library_builder.dart":
-      case "builder/member_builder.dart":
-      case "builder/mixin_application_builder.dart":
-      case "builder/named_type_builder.dart":
-      case "builder/prefix_builder.dart":
-      case "builder/procedure_builder.dart":
-      case "builder/type_builder.dart":
-      case "builder/type_variable_builder.dart":
-      case "builder/unresolved_type.dart":
-      case "builder/void_type_builder.dart":
-      case "builder_graph.dart":
-      case "compiler_context.dart":
-      case "dill/dill_class_builder.dart":
-      case "dill/dill_library_builder.dart":
-      case "dill/dill_loader.dart":
-      case "dill/dill_target.dart":
-      case "entry_points.dart":
-      case "export.dart":
-      case "fasta_codes.dart":
-      case "import.dart":
-      case "incremental_compiler.dart":
-      case "kernel/expression_generator.dart":
-      case "kernel/expression_generator_helper.dart":
-      case "kernel/fangorn.dart":
-      case "kernel/forest.dart":
-      case "kernel/kernel_class_builder.dart":
-      case "kernel/kernel_enum_builder.dart":
-      case "kernel/kernel_expression_generator.dart":
-      case "kernel/kernel_expression_generator_impl.dart":
-      case "kernel/kernel_field_builder.dart":
-      case "kernel/kernel_formal_parameter_builder.dart":
-      case "kernel/kernel_function_type_builder.dart":
-      case "kernel/kernel_invalid_type_builder.dart":
-      case "kernel/kernel_library_builder.dart":
-      case "kernel/kernel_mixin_application_builder.dart":
-      case "kernel/kernel_named_type_builder.dart":
-      case "kernel/kernel_prefix_builder.dart":
-      case "kernel/kernel_procedure_builder.dart":
-      case "kernel/kernel_shadow_ast.dart":
-      case "kernel/kernel_target.dart":
-      case "kernel/kernel_type_builder.dart":
-      case "kernel/kernel_type_variable_builder.dart":
-      case "kernel/load_library_builder.dart":
-      case "kernel/metadata_collector.dart":
-      case "kernel/type_algorithms.dart":
-      case "kernel/verifier.dart":
-      case "loader.dart":
-      case "scanner/error_token.dart":
-      case "scanner/recover.dart":
-      case "scope.dart":
-      case "source/diet_listener.dart":
-      case "source/outline_builder.dart":
-      case "source/source_class_builder.dart":
-      case "source/source_library_builder.dart":
-      case "source/source_loader.dart":
-      case "source/stack_listener.dart":
-      case "target_implementation.dart":
-      case "type_inference/interface_resolver.dart":
-      case "type_inference/type_inference_engine.dart":
-      case "type_inference/type_inferrer.dart":
-      case "type_inference/type_schema.dart":
-      case "util/link.dart":
-      case "util/link_implementation.dart":
-        return severity;
-    }
   }
   return Severity.error;
 }
diff --git a/pkg/front_end/lib/src/fasta/scanner.dart b/pkg/front_end/lib/src/fasta/scanner.dart
index b80f201..2a1e410 100644
--- a/pkg/front_end/lib/src/fasta/scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner.dart
@@ -48,7 +48,7 @@
 typedef Token Recover(List<int> bytes, Token tokens, List<int> lineStarts);
 
 abstract class Scanner {
-  /// Returns true if an error occured during [tokenize].
+  /// Returns true if an error occurred during [tokenize].
   bool get hasErrors;
 
   List<int> get lineStarts;
diff --git a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
index 21646c3..072da5e 100644
--- a/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/abstract_scanner.dart
@@ -8,11 +8,13 @@
 
 import 'dart:typed_data' show Uint16List, Uint32List;
 
-import '../../scanner/token.dart' show BeginToken, Token, TokenType;
+import '../../scanner/token.dart'
+    show BeginToken, Keyword, KeywordToken, SyntheticToken, Token, TokenType;
+
+import '../../scanner/token.dart' as analyzer show StringToken;
 
 import '../fasta_codes.dart'
     show
-        Message,
         messageExpectedHexDigit,
         messageMissingExponent,
         messageUnexpectedDollarInString,
@@ -21,12 +23,20 @@
 import '../scanner.dart'
     show ErrorToken, Keyword, Scanner, buildUnexpectedCharacterToken;
 
+import '../util/link.dart' show Link;
+
 import 'error_token.dart'
-    show UnsupportedOperator, UnterminatedString, UnterminatedToken;
+    show
+        NonAsciiIdentifierToken,
+        UnmatchedToken,
+        UnsupportedOperator,
+        UnterminatedString,
+        UnterminatedToken;
 
 import 'keyword_state.dart' show KeywordState;
 
-import 'token.dart' show CommentToken, DartDocToken, LanguageVersionToken;
+import 'token.dart'
+    show CommentToken, DartDocToken, LanguageVersionToken, StringToken;
 
 import 'token_constants.dart';
 
@@ -87,6 +97,13 @@
   Token tail;
 
   /**
+   * A pointer to the last prepended error token.
+   */
+  Token errorTail;
+
+  bool hasErrors = false;
+
+  /**
    * A pointer to the stream of comment tokens created by this scanner
    * before they are assigned to the [Token] precedingComments field
    * of a non-comment token. A value of `null` indicates no comment tokens.
@@ -100,11 +117,19 @@
 
   final List<int> lineStarts;
 
+  /**
+   * The stack of open groups, e.g [: { ... ( .. :]
+   * Each BeginToken has a pointer to the token where the group
+   * ends. This field is set when scanning the end group token.
+   */
+  Link<BeginToken> groupingStack = const Link<BeginToken>();
+
   AbstractScanner(ScannerConfiguration config, this.includeComments,
       this.languageVersionChanged,
       {int numberOfBytesHint})
       : lineStarts = new LineStarts(numberOfBytesHint) {
     this.tail = this.tokens;
+    this.errorTail = this.tokens;
     this.configuration = config;
   }
 
@@ -202,7 +227,22 @@
    * known to be ASCII.
    */
   void appendSubstringToken(TokenType type, int start, bool asciiOnly,
-      [int extraOffset]);
+      [int extraOffset = 0]) {
+    appendToken(createSubstringToken(type, start, asciiOnly, extraOffset));
+  }
+
+  /**
+   * Returns a new substring from the scan offset [start] to the current
+   * [scanOffset] plus the [extraOffset]. For example, if the current
+   * scanOffset is 10, then [appendSubstringToken(5, -1)] will append the
+   * substring string [5,9).
+   *
+   * Note that [extraOffset] can only be used if the covered character(s) are
+   * known to be ASCII.
+   */
+  analyzer.StringToken createSubstringToken(
+      TokenType type, int start, bool asciiOnly,
+      [int extraOffset = 0]);
 
   /**
    * Appends a substring from the scan offset [start] to the current
@@ -212,40 +252,189 @@
    * so as to be true to the original source.
    */
   void appendSyntheticSubstringToken(
+      TokenType type, int start, bool asciiOnly, String syntheticChars) {
+    appendToken(
+        createSyntheticSubstringToken(type, start, asciiOnly, syntheticChars));
+  }
+
+  /**
+   * Returns a new synthetic substring from the scan offset [start]
+   * to the current [scanOffset] plus the [syntheticChars].
+   * The [syntheticChars] are appended to the unterminated string
+   * literal's lexeme but the returned token's length will *not* include
+   * those additional characters so as to be true to the original source.
+   */
+  analyzer.StringToken createSyntheticSubstringToken(
       TokenType type, int start, bool asciiOnly, String syntheticChars);
+  /**
+   * Appends a fixed token whose kind and content is determined by [type].
+   * Appends an *operator* token from [type].
+   *
+   * An operator token represent operators like ':', '.', ';', '&&', '==', '--',
+   * '=>', etc.
+   */
+  void appendPrecedenceToken(TokenType type) {
+    appendToken(new Token(type, tokenStart, comments));
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendPrecedenceToken(TokenType type);
+  /**
+   * Appends a fixed token based on whether the current char is [choice] or not.
+   * If the current char is [choice] a fixed token whose kind and content
+   * is determined by [yes] is appended, otherwise a fixed token whose kind
+   * and content is determined by [no] is appended.
+   */
+  int select(int choice, TokenType yes, TokenType no) {
+    int next = advance();
+    if (identical(next, choice)) {
+      appendPrecedenceToken(yes);
+      return advance();
+    } else {
+      appendPrecedenceToken(no);
+      return next;
+    }
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  int select(int choice, TokenType yes, TokenType no);
+  /**
+   * Appends a keyword token whose kind is determined by [keyword].
+   */
+  void appendKeywordToken(Keyword keyword) {
+    String syntax = keyword.lexeme;
+    // Type parameters and arguments cannot contain 'this'.
+    if (identical(syntax, 'this')) {
+      discardOpenLt();
+    }
+    appendToken(new KeywordToken(keyword, tokenStart, comments));
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendKeywordToken(Keyword keyword);
+  void appendEofToken() {
+    beginToken();
+    discardOpenLt();
+    while (!groupingStack.isEmpty) {
+      unmatchedBeginGroup(groupingStack.head);
+      groupingStack = groupingStack.tail;
+    }
+    appendToken(new Token.eof(tokenStart, comments));
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendEofToken();
+  /**
+   * Notifies scanning a whitespace character. Note that [appendWhiteSpace] is
+   * not always invoked for [$SPACE] characters.
+   *
+   * This method is used by the scanners to track line breaks and create the
+   * [lineStarts] map.
+   */
+  void appendWhiteSpace(int next) {
+    if (next == $LF) {
+      lineStarts.add(stringOffset + 1); // +1, the line starts after the $LF.
+    }
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendWhiteSpace(int next);
+  /**
+   * Notifies on [$LF] characters in multi-line comments or strings.
+   *
+   * This method is used by the scanners to track line breaks and create the
+   * [lineStarts] map.
+   */
+  void lineFeedInMultiline() {
+    lineStarts.add(stringOffset + 1);
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void lineFeedInMultiline();
+  /**
+   * Appends a token that begins a new group, represented by [type].
+   * Group begin tokens are '{', '(', '[', '<' and '${'.
+   */
+  void appendBeginGroup(TokenType type) {
+    Token token = new BeginToken(type, tokenStart, comments);
+    appendToken(token);
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendBeginGroup(TokenType type);
+    // { [ ${ cannot appear inside a type parameters / arguments.
+    if (!identical(type.kind, LT_TOKEN) &&
+        !identical(type.kind, OPEN_PAREN_TOKEN)) {
+      discardOpenLt();
+    }
+    groupingStack = groupingStack.prepend(token);
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  int appendEndGroup(TokenType type, int openKind);
+  /**
+   * Appends a token that begins an end group, represented by [type].
+   * It handles the group end tokens '}', ')' and ']'. The tokens '>' and
+   * '>>' are handled separately by [appendGt] and [appendGtGt].
+   */
+  int appendEndGroup(TokenType type, int openKind) {
+    assert(!identical(openKind, LT_TOKEN)); // openKind is < for > and >>
+    if (!discardBeginGroupUntil(openKind)) {
+      // No begin group found. Just continue.
+      appendPrecedenceToken(type);
+      return advance();
+    }
+    appendPrecedenceToken(type);
+    Token close = tail;
+    BeginToken begin = groupingStack.head;
+    if (!identical(begin.kind, openKind) &&
+        !(begin.kind == QUESTION_PERIOD_OPEN_SQUARE_BRACKET_TOKEN &&
+            openKind == OPEN_SQUARE_BRACKET_TOKEN)) {
+      assert(begin.kind == STRING_INTERPOLATION_TOKEN &&
+          openKind == OPEN_CURLY_BRACKET_TOKEN);
+      // We're ending an interpolated expression.
+      begin.endGroup = close;
+      groupingStack = groupingStack.tail;
+      // Using "start-of-text" to signal that we're back in string
+      // scanning mode.
+      return $STX;
+    }
+    begin.endGroup = close;
+    groupingStack = groupingStack.tail;
+    return advance();
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendGt(TokenType type);
+  /**
+   * Appends a token for '>'.
+   * This method does not issue unmatched errors, because > is also the
+   * greater-than operator. It does not necessarily have to close a group.
+   */
+  void appendGt(TokenType type) {
+    appendPrecedenceToken(type);
+    if (groupingStack.isEmpty) return;
+    if (identical(groupingStack.head.kind, LT_TOKEN)) {
+      groupingStack.head.endGroup = tail;
+      groupingStack = groupingStack.tail;
+    }
+  }
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void appendGtGt(TokenType type);
+  /**
+   * Appends a token for '>>'.
+   * This method does not issue unmatched errors, because >> is also the
+   * shift operator. It does not necessarily have to close a group.
+   */
+  void appendGtGt(TokenType type) {
+    appendPrecedenceToken(type);
+    if (groupingStack.isEmpty) return;
+    if (identical(groupingStack.head.kind, LT_TOKEN)) {
+      // Don't assign endGroup: in "T<U<V>>", the '>>' token closes the outer
+      // '<', the inner '<' is left without endGroup.
+      groupingStack = groupingStack.tail;
+    }
+    if (groupingStack.isEmpty) return;
+    if (identical(groupingStack.head.kind, LT_TOKEN)) {
+      groupingStack.head.endGroup = tail;
+      groupingStack = groupingStack.tail;
+    }
+  }
 
-  /// Append [token] to the token stream.
-  void appendErrorToken(ErrorToken token);
+  /// Prepend [token] to the token stream.
+  void prependErrorToken(ErrorToken token) {
+    hasErrors = true;
+    if (errorTail == tail) {
+      appendToken(token);
+      errorTail = tail;
+    } else {
+      token.next = errorTail.next;
+      token.next.previous = token;
+      errorTail.next = token;
+      token.previous = errorTail;
+      errorTail = errorTail.next;
+    }
+  }
 
   /**
    * Returns a new comment from the scan offset [start] to the current
@@ -278,11 +467,140 @@
   LanguageVersionToken createLanguageVersionToken(
       int start, int major, int minor);
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void discardOpenLt();
+  /**
+   * If a begin group token matches [openKind],
+   * then discard begin group tokens up to that match and return `true`,
+   * otherwise return `false`.
+   * This recovers nicely from from situations like "{[}" and "{foo());}",
+   * but not "foo(() {bar());});
+   */
+  bool discardBeginGroupUntil(int openKind) {
+    Link<BeginToken> originalStack = groupingStack;
 
-  /** Documentation in subclass [ArrayBasedScanner]. */
-  void discardInterpolation();
+    bool first = true;
+    do {
+      // Don't report unmatched errors for <; it is also the less-than operator.
+      discardOpenLt();
+      if (groupingStack.isEmpty) break; // recover
+      BeginToken begin = groupingStack.head;
+      if (openKind == begin.kind ||
+          (openKind == OPEN_CURLY_BRACKET_TOKEN &&
+              begin.kind == STRING_INTERPOLATION_TOKEN) ||
+          (openKind == OPEN_SQUARE_BRACKET_TOKEN &&
+              begin.kind == QUESTION_PERIOD_OPEN_SQUARE_BRACKET_TOKEN)) {
+        if (first) {
+          // If the expected opener has been found on the first pass
+          // then no recovery necessary.
+          return true;
+        }
+        break; // recover
+      }
+      first = false;
+      groupingStack = groupingStack.tail;
+    } while (!groupingStack.isEmpty);
+
+    // If the stack does not have any opener of the given type,
+    // then return without discarding anything.
+    // This recovers nicely from from situations like "{foo());}".
+    if (groupingStack.isEmpty) {
+      groupingStack = originalStack;
+      return false;
+    }
+
+    // Insert synthetic closers and report errors for any unbalanced openers.
+    // This recovers nicely from from situations like "{[}".
+    while (!identical(originalStack, groupingStack)) {
+      // Don't report unmatched errors for <; it is also the less-than operator.
+      if (!identical(groupingStack.head.kind, LT_TOKEN))
+        unmatchedBeginGroup(originalStack.head);
+      originalStack = originalStack.tail;
+    }
+    return true;
+  }
+
+  /**
+   * This method is called to discard '<' from the "grouping" stack.
+   *
+   * [PartialParser.skipExpression] relies on the fact that we do not
+   * create groups for stuff like:
+   * [:a = b < c, d = e > f:].
+   *
+   * In other words, this method is called when the scanner recognizes
+   * something which cannot possibly be part of a type parameter/argument
+   * list, like the '=' in the above example.
+   */
+  void discardOpenLt() {
+    while (!groupingStack.isEmpty &&
+        identical(groupingStack.head.kind, LT_TOKEN)) {
+      groupingStack = groupingStack.tail;
+    }
+  }
+
+  /**
+   * This method is called to discard '${' from the "grouping" stack.
+   *
+   * This method is called when the scanner finds an unterminated
+   * interpolation expression.
+   */
+  void discardInterpolation() {
+    while (!groupingStack.isEmpty) {
+      BeginToken beginToken = groupingStack.head;
+      unmatchedBeginGroup(beginToken);
+      groupingStack = groupingStack.tail;
+      if (identical(beginToken.kind, STRING_INTERPOLATION_TOKEN)) break;
+    }
+  }
+
+  void unmatchedBeginGroup(BeginToken begin) {
+    // We want to ensure that unmatched BeginTokens are reported as
+    // errors.  However, the diet parser assumes that groups are well-balanced
+    // and will never look at the endGroup token.  This is a nice property that
+    // allows us to skip quickly over correct code. By inserting an additional
+    // synthetic token in the stream, we can keep ignoring endGroup tokens.
+    //
+    // [begin] --next--> [tail]
+    // [begin] --endG--> [synthetic] --next--> [next] --next--> [tail]
+    //
+    // This allows the diet parser to skip from [begin] via endGroup to
+    // [synthetic] and ignore the [synthetic] token (assuming it's correct),
+    // then the error will be reported when parsing the [next] token.
+    //
+    // For example, tokenize("{[1};") produces:
+    //
+    // SymbolToken({) --endGroup------------------------+
+    //      |                                           |
+    //     next                                         |
+    //      v                                           |
+    // SymbolToken([) --endGroup--+                     |
+    //      |                     |                     |
+    //     next                   |                     |
+    //      v                     |                     |
+    // StringToken(1)             |                     |
+    //      |                     |                     |
+    //     next                   |                     |
+    //      v                     |                     |
+    // SymbolToken(])<------------+ <-- Synthetic token |
+    //      |                                           |
+    //     next                                         |
+    //      v                                           |
+    // UnmatchedToken([)                                |
+    //      |                                           |
+    //     next                                         |
+    //      v                                           |
+    // SymbolToken(})<----------------------------------+
+    //      |
+    //     next
+    //      v
+    // SymbolToken(;)
+    //      |
+    //     next
+    //      v
+    //     EOF
+    TokenType type = closeBraceInfoFor(begin);
+    appendToken(new SyntheticToken(type, tokenStart)..beforeSynthetic = tail);
+    begin.endGroup = tail;
+    prependErrorToken(new UnmatchedToken(begin));
+  }
 
   /// Return true when at EOF.
   bool atEndOfFile();
@@ -667,7 +985,7 @@
       int next = advance();
       if (identical(next, $EQ)) {
         appendPrecedenceToken(TokenType.BANG_EQ_EQ);
-        appendErrorToken(new UnsupportedOperator(tail, tokenStart));
+        prependErrorToken(new UnsupportedOperator(tail, tokenStart));
         return advance();
       } else {
         appendPrecedenceToken(TokenType.BANG_EQ);
@@ -692,7 +1010,7 @@
       int next = advance();
       if (identical(next, $EQ)) {
         appendPrecedenceToken(TokenType.EQ_EQ_EQ);
-        appendErrorToken(new UnsupportedOperator(tail, tokenStart));
+        prependErrorToken(new UnsupportedOperator(tail, tokenStart));
         return advance();
       } else {
         appendPrecedenceToken(TokenType.EQ_EQ);
@@ -790,7 +1108,11 @@
         hasDigits = true;
       } else {
         if (!hasDigits) {
-          unterminated(messageExpectedHexDigit, shouldAdvance: false);
+          prependErrorToken(new UnterminatedToken(
+              messageExpectedHexDigit, start, stringOffset));
+          // Recovery
+          appendSyntheticSubstringToken(
+              TokenType.HEXADECIMAL, start, true, "0");
           return next;
         }
         appendSubstringToken(TokenType.HEXADECIMAL, start, true);
@@ -845,7 +1167,7 @@
           } else {
             if (!hasExponentDigits) {
               appendSyntheticSubstringToken(TokenType.DOUBLE, start, true, '0');
-              appendErrorToken(new UnterminatedToken(
+              prependErrorToken(new UnterminatedToken(
                   messageMissingExponent, tokenStart, stringOffset));
               return next;
             }
@@ -1026,7 +1348,9 @@
     while (true) {
       if (identical($EOF, next)) {
         if (!asciiOnlyLines) handleUnicode(unicodeStart);
-        unterminated(messageUnterminatedComment);
+        prependErrorToken(UnterminatedToken(
+            messageUnterminatedComment, tokenStart, stringOffset));
+        advanceAfterError(true);
         break;
       } else if (identical($STAR, next)) {
         next = advance();
@@ -1090,8 +1414,8 @@
    */
   void appendToken(Token token) {
     tail.next = token;
-    tail.next.previous = tail;
-    tail = tail.next;
+    token.previous = tail;
+    tail = token;
     if (comments != null && comments == token.precedingComments) {
       comments = null;
       commentsTail = null;
@@ -1168,11 +1492,7 @@
    */
   int tokenizeIdentifier(int next, int start, bool allowDollar) {
     while (true) {
-      if (($a <= next && next <= $z) ||
-          ($A <= next && next <= $Z) ||
-          ($0 <= next && next <= $9) ||
-          identical(next, $_) ||
-          (identical(next, $$) && allowDollar)) {
+      if (_isIdentifierChar(next, allowDollar)) {
         next = advance();
       } else {
         // Identifier ends here.
@@ -1296,7 +1616,8 @@
     } else {
       beginToken(); // The synthetic identifier starts here.
       appendSyntheticSubstringToken(TokenType.IDENTIFIER, scanOffset, true, '');
-      unterminated(messageUnexpectedDollarInString, shouldAdvance: false);
+      prependErrorToken(UnterminatedToken(
+          messageUnexpectedDollarInString, tokenStart, stringOffset));
     }
     beginToken(); // The string interpolation suffix starts here.
     return next;
@@ -1421,13 +1742,31 @@
   }
 
   int unexpected(int character) {
-    appendErrorToken(buildUnexpectedCharacterToken(character, tokenStart));
-    return advanceAfterError(true);
-  }
-
-  int unterminated(Message message, {bool shouldAdvance: true}) {
-    appendErrorToken(new UnterminatedToken(message, tokenStart, stringOffset));
-    return advanceAfterError(shouldAdvance);
+    var errorToken = buildUnexpectedCharacterToken(character, tokenStart);
+    if (errorToken is NonAsciiIdentifierToken) {
+      int charOffset;
+      List<int> codeUnits = <int>[];
+      if (tail.type == TokenType.IDENTIFIER && tail.charEnd == tokenStart) {
+        charOffset = tail.charOffset;
+        codeUnits.addAll(tail.lexeme.codeUnits);
+        tail = tail.previous;
+      } else {
+        charOffset = errorToken.charOffset;
+      }
+      codeUnits.add(errorToken.character);
+      prependErrorToken(errorToken);
+      int next = advanceAfterError(true);
+      while (_isIdentifierChar(next, true)) {
+        codeUnits.add(next);
+        next = advance();
+      }
+      appendToken(StringToken.fromString(TokenType.IDENTIFIER,
+          new String.fromCharCodes(codeUnits), charOffset));
+      return next;
+    } else {
+      prependErrorToken(errorToken);
+      return advanceAfterError(true);
+    }
   }
 
   void unterminatedString(int quoteChar, int quoteStart, int start,
@@ -1439,7 +1778,7 @@
     appendSyntheticSubstringToken(TokenType.STRING, start, asciiOnly, suffix);
     // Ensure that the error is reported on a visible token
     int errorStart = tokenStart < stringOffset ? tokenStart : quoteStart;
-    appendErrorToken(new UnterminatedString(prefix, errorStart, stringOffset));
+    prependErrorToken(new UnterminatedString(prefix, errorStart, stringOffset));
   }
 
   int advanceAfterError(bool shouldAdvance) {
@@ -1566,3 +1905,11 @@
         this.enableNonNullable = enableNonNullable ?? false,
         this.enableTripleShift = enableTripleShift ?? false;
 }
+
+bool _isIdentifierChar(int next, bool allowDollar) {
+  return ($a <= next && next <= $z) ||
+      ($A <= next && next <= $Z) ||
+      ($0 <= next && next <= $9) ||
+      identical(next, $_) ||
+      (identical(next, $$) && allowDollar);
+}
diff --git a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
deleted file mode 100644
index 6eadbf2..0000000
--- a/pkg/front_end/lib/src/fasta/scanner/array_based_scanner.dart
+++ /dev/null
@@ -1,379 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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.scanner.array_based_scanner;
-
-import 'error_token.dart' show ErrorToken, UnmatchedToken;
-
-import '../../scanner/token.dart'
-    show BeginToken, Keyword, KeywordToken, SyntheticToken, Token, TokenType;
-
-import '../../scanner/token.dart' as analyzer show StringToken;
-
-import 'token_constants.dart'
-    show
-        LT_TOKEN,
-        OPEN_CURLY_BRACKET_TOKEN,
-        OPEN_PAREN_TOKEN,
-        OPEN_SQUARE_BRACKET_TOKEN,
-        QUESTION_PERIOD_OPEN_SQUARE_BRACKET_TOKEN,
-        STRING_INTERPOLATION_TOKEN;
-
-import 'characters.dart' show $LF, $STX;
-
-import 'abstract_scanner.dart'
-    show
-        AbstractScanner,
-        LanguageVersionChanged,
-        ScannerConfiguration,
-        closeBraceInfoFor;
-
-import '../util/link.dart' show Link;
-
-abstract class ArrayBasedScanner extends AbstractScanner {
-  bool hasErrors = false;
-
-  ArrayBasedScanner(ScannerConfiguration config, bool includeComments,
-      LanguageVersionChanged languageVersionChanged, {int numberOfBytesHint})
-      : super(config, includeComments, languageVersionChanged,
-            numberOfBytesHint: numberOfBytesHint);
-
-  /**
-   * The stack of open groups, e.g [: { ... ( .. :]
-   * Each BeginToken has a pointer to the token where the group
-   * ends. This field is set when scanning the end group token.
-   */
-  Link<BeginToken> groupingStack = const Link<BeginToken>();
-
-  /**
-   * Appends a fixed token whose kind and content is determined by [type].
-   * Appends an *operator* token from [type].
-   *
-   * An operator token represent operators like ':', '.', ';', '&&', '==', '--',
-   * '=>', etc.
-   */
-  void appendPrecedenceToken(TokenType type) {
-    appendToken(new Token(type, tokenStart, comments));
-  }
-
-  /**
-   * Appends a fixed token based on whether the current char is [choice] or not.
-   * If the current char is [choice] a fixed token whose kind and content
-   * is determined by [yes] is appended, otherwise a fixed token whose kind
-   * and content is determined by [no] is appended.
-   */
-  int select(int choice, TokenType yes, TokenType no) {
-    int next = advance();
-    if (identical(next, choice)) {
-      appendPrecedenceToken(yes);
-      return advance();
-    } else {
-      appendPrecedenceToken(no);
-      return next;
-    }
-  }
-
-  /**
-   * Appends a keyword token whose kind is determined by [keyword].
-   */
-  void appendKeywordToken(Keyword keyword) {
-    String syntax = keyword.lexeme;
-    // Type parameters and arguments cannot contain 'this'.
-    if (identical(syntax, 'this')) {
-      discardOpenLt();
-    }
-    appendToken(new KeywordToken(keyword, tokenStart, comments));
-  }
-
-  void appendEofToken() {
-    beginToken();
-    discardOpenLt();
-    while (!groupingStack.isEmpty) {
-      unmatchedBeginGroup(groupingStack.head);
-      groupingStack = groupingStack.tail;
-    }
-    appendToken(new Token.eof(tokenStart, comments));
-  }
-
-  /**
-   * Notifies scanning a whitespace character. Note that [appendWhiteSpace] is
-   * not always invoked for [$SPACE] characters.
-   *
-   * This method is used by the scanners to track line breaks and create the
-   * [lineStarts] map.
-   */
-  void appendWhiteSpace(int next) {
-    if (next == $LF) {
-      lineStarts.add(stringOffset + 1); // +1, the line starts after the $LF.
-    }
-  }
-
-  /**
-   * Notifies on [$LF] characters in multi-line comments or strings.
-   *
-   * This method is used by the scanners to track line breaks and create the
-   * [lineStarts] map.
-   */
-  void lineFeedInMultiline() {
-    lineStarts.add(stringOffset + 1);
-  }
-
-  /**
-   * Appends a token that begins a new group, represented by [type].
-   * Group begin tokens are '{', '(', '[', '<' and '${'.
-   */
-  void appendBeginGroup(TokenType type) {
-    Token token = new BeginToken(type, tokenStart, comments);
-    appendToken(token);
-
-    // { [ ${ cannot appear inside a type parameters / arguments.
-    if (!identical(type.kind, LT_TOKEN) &&
-        !identical(type.kind, OPEN_PAREN_TOKEN)) {
-      discardOpenLt();
-    }
-    groupingStack = groupingStack.prepend(token);
-  }
-
-  /**
-   * Appends a token that begins an end group, represented by [type].
-   * It handles the group end tokens '}', ')' and ']'. The tokens '>' and
-   * '>>' are handled separately by [appendGt] and [appendGtGt].
-   */
-  int appendEndGroup(TokenType type, int openKind) {
-    assert(!identical(openKind, LT_TOKEN)); // openKind is < for > and >>
-    if (!discardBeginGroupUntil(openKind)) {
-      // No begin group found. Just continue.
-      appendPrecedenceToken(type);
-      return advance();
-    }
-    appendPrecedenceToken(type);
-    Token close = tail;
-    BeginToken begin = groupingStack.head;
-    if (!identical(begin.kind, openKind) &&
-        !(begin.kind == QUESTION_PERIOD_OPEN_SQUARE_BRACKET_TOKEN &&
-            openKind == OPEN_SQUARE_BRACKET_TOKEN)) {
-      assert(begin.kind == STRING_INTERPOLATION_TOKEN &&
-          openKind == OPEN_CURLY_BRACKET_TOKEN);
-      // We're ending an interpolated expression.
-      begin.endGroup = close;
-      groupingStack = groupingStack.tail;
-      // Using "start-of-text" to signal that we're back in string
-      // scanning mode.
-      return $STX;
-    }
-    begin.endGroup = close;
-    groupingStack = groupingStack.tail;
-    return advance();
-  }
-
-  /**
-   * If a begin group token matches [openKind],
-   * then discard begin group tokens up to that match and return `true`,
-   * otherwise return `false`.
-   * This recovers nicely from from situations like "{[}" and "{foo());}",
-   * but not "foo(() {bar());});
-   */
-  bool discardBeginGroupUntil(int openKind) {
-    Link<BeginToken> originalStack = groupingStack;
-
-    bool first = true;
-    do {
-      // Don't report unmatched errors for <; it is also the less-than operator.
-      discardOpenLt();
-      if (groupingStack.isEmpty) break; // recover
-      BeginToken begin = groupingStack.head;
-      if (openKind == begin.kind ||
-          (openKind == OPEN_CURLY_BRACKET_TOKEN &&
-              begin.kind == STRING_INTERPOLATION_TOKEN) ||
-          (openKind == OPEN_SQUARE_BRACKET_TOKEN &&
-              begin.kind == QUESTION_PERIOD_OPEN_SQUARE_BRACKET_TOKEN)) {
-        if (first) {
-          // If the expected opener has been found on the first pass
-          // then no recovery necessary.
-          return true;
-        }
-        break; // recover
-      }
-      first = false;
-      groupingStack = groupingStack.tail;
-    } while (!groupingStack.isEmpty);
-
-    // If the stack does not have any opener of the given type,
-    // then return without discarding anything.
-    // This recovers nicely from from situations like "{foo());}".
-    if (groupingStack.isEmpty) {
-      groupingStack = originalStack;
-      return false;
-    }
-
-    // Insert synthetic closers and report errors for any unbalanced openers.
-    // This recovers nicely from from situations like "{[}".
-    while (!identical(originalStack, groupingStack)) {
-      // Don't report unmatched errors for <; it is also the less-than operator.
-      if (!identical(groupingStack.head.kind, LT_TOKEN))
-        unmatchedBeginGroup(originalStack.head);
-      originalStack = originalStack.tail;
-    }
-    return true;
-  }
-
-  /**
-   * Appends a token for '>'.
-   * This method does not issue unmatched errors, because > is also the
-   * greater-than operator. It does not necessarily have to close a group.
-   */
-  void appendGt(TokenType type) {
-    appendPrecedenceToken(type);
-    if (groupingStack.isEmpty) return;
-    if (identical(groupingStack.head.kind, LT_TOKEN)) {
-      groupingStack.head.endGroup = tail;
-      groupingStack = groupingStack.tail;
-    }
-  }
-
-  /**
-   * Appends a token for '>>'.
-   * This method does not issue unmatched errors, because >> is also the
-   * shift operator. It does not necessarily have to close a group.
-   */
-  void appendGtGt(TokenType type) {
-    appendPrecedenceToken(type);
-    if (groupingStack.isEmpty) return;
-    if (identical(groupingStack.head.kind, LT_TOKEN)) {
-      // Don't assign endGroup: in "T<U<V>>", the '>>' token closes the outer
-      // '<', the inner '<' is left without endGroup.
-      groupingStack = groupingStack.tail;
-    }
-    if (groupingStack.isEmpty) return;
-    if (identical(groupingStack.head.kind, LT_TOKEN)) {
-      groupingStack.head.endGroup = tail;
-      groupingStack = groupingStack.tail;
-    }
-  }
-
-  void appendErrorToken(ErrorToken token) {
-    hasErrors = true;
-    appendToken(token);
-  }
-
-  @override
-  void appendSubstringToken(TokenType type, int start, bool asciiOnly,
-      [int extraOffset = 0]) {
-    appendToken(createSubstringToken(type, start, asciiOnly, extraOffset));
-  }
-
-  @override
-  void appendSyntheticSubstringToken(
-      TokenType type, int start, bool asciiOnly, String syntheticChars) {
-    appendToken(
-        createSyntheticSubstringToken(type, start, asciiOnly, syntheticChars));
-  }
-
-  /**
-   * Returns a new substring from the scan offset [start] to the current
-   * [scanOffset] plus the [extraOffset]. For example, if the current
-   * scanOffset is 10, then [appendSubstringToken(5, -1)] will append the
-   * substring string [5,9).
-   *
-   * Note that [extraOffset] can only be used if the covered character(s) are
-   * known to be ASCII.
-   */
-  analyzer.StringToken createSubstringToken(
-      TokenType type, int start, bool asciiOnly,
-      [int extraOffset = 0]);
-
-  /**
-   * Returns a new synthetic substring from the scan offset [start]
-   * to the current [scanOffset] plus the [syntheticChars].
-   * The [syntheticChars] are appended to the unterminated string
-   * literal's lexeme but the returned token's length will *not* include
-   * those additional characters so as to be true to the original source.
-   */
-  analyzer.StringToken createSyntheticSubstringToken(
-      TokenType type, int start, bool asciiOnly, String syntheticChars);
-
-  /**
-   * This method is called to discard '<' from the "grouping" stack.
-   *
-   * [PartialParser.skipExpression] relies on the fact that we do not
-   * create groups for stuff like:
-   * [:a = b < c, d = e > f:].
-   *
-   * In other words, this method is called when the scanner recognizes
-   * something which cannot possibly be part of a type parameter/argument
-   * list, like the '=' in the above example.
-   */
-  void discardOpenLt() {
-    while (!groupingStack.isEmpty &&
-        identical(groupingStack.head.kind, LT_TOKEN)) {
-      groupingStack = groupingStack.tail;
-    }
-  }
-
-  /**
-   * This method is called to discard '${' from the "grouping" stack.
-   *
-   * This method is called when the scanner finds an unterminated
-   * interpolation expression.
-   */
-  void discardInterpolation() {
-    while (!groupingStack.isEmpty) {
-      BeginToken beginToken = groupingStack.head;
-      unmatchedBeginGroup(beginToken);
-      groupingStack = groupingStack.tail;
-      if (identical(beginToken.kind, STRING_INTERPOLATION_TOKEN)) break;
-    }
-  }
-
-  void unmatchedBeginGroup(BeginToken begin) {
-    // We want to ensure that unmatched BeginTokens are reported as
-    // errors.  However, the diet parser assumes that groups are well-balanced
-    // and will never look at the endGroup token.  This is a nice property that
-    // allows us to skip quickly over correct code. By inserting an additional
-    // synthetic token in the stream, we can keep ignoring endGroup tokens.
-    //
-    // [begin] --next--> [tail]
-    // [begin] --endG--> [synthetic] --next--> [next] --next--> [tail]
-    //
-    // This allows the diet parser to skip from [begin] via endGroup to
-    // [synthetic] and ignore the [synthetic] token (assuming it's correct),
-    // then the error will be reported when parsing the [next] token.
-    //
-    // For example, tokenize("{[1};") produces:
-    //
-    // SymbolToken({) --endGroup------------------------+
-    //      |                                           |
-    //     next                                         |
-    //      v                                           |
-    // SymbolToken([) --endGroup--+                     |
-    //      |                     |                     |
-    //     next                   |                     |
-    //      v                     |                     |
-    // StringToken(1)             |                     |
-    //      |                     |                     |
-    //     next                   |                     |
-    //      v                     |                     |
-    // SymbolToken(])<------------+ <-- Synthetic token |
-    //      |                                           |
-    //     next                                         |
-    //      v                                           |
-    // UnmatchedToken([)                                |
-    //      |                                           |
-    //     next                                         |
-    //      v                                           |
-    // SymbolToken(})<----------------------------------+
-    //      |
-    //     next
-    //      v
-    // SymbolToken(;)
-    //      |
-    //     next
-    //      v
-    //     EOF
-    TokenType type = closeBraceInfoFor(begin);
-    appendToken(new SyntheticToken(type, tokenStart)..beforeSynthetic = tail);
-    begin.endGroup = tail;
-    appendErrorToken(new UnmatchedToken(begin));
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/scanner/error_token.dart b/pkg/front_end/lib/src/fasta/scanner/error_token.dart
index 40c54b6..f8f5f19 100644
--- a/pkg/front_end/lib/src/fasta/scanner/error_token.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/error_token.dart
@@ -1,6 +1,6 @@
 // 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 licenset hat can be found in the LICENSE file.
+// BSD-style license that can be found in the LICENSE file.
 
 library dart_scanner.error_token;
 
@@ -72,11 +72,27 @@
   @override
   int get length => 1;
 
-  String get lexeme => throw assertionMessage.message;
+  String get lexeme {
+    var errorMsg = assertionMessage.message;
+
+    // Attempt to include the location which is calling the parser
+    // in an effort to debug https://github.com/dart-lang/sdk/issues/37528
+    var pattern = RegExp('^#[0-9]* *Parser');
+    var traceLines = StackTrace.current.toString().split('\n');
+    for (int index = traceLines.length - 2; index >= 0; --index) {
+      var line = traceLines[index];
+      if (line.startsWith(pattern)) {
+        errorMsg = '$errorMsg - ${traceLines[index + 1]}';
+        break;
+      }
+    }
+
+    throw errorMsg;
+  }
 
   Message get assertionMessage;
 
-  Code get errorCode => assertionMessage.code;
+  Code<dynamic> get errorCode => assertionMessage.code;
 
   int get character => null;
 
diff --git a/pkg/front_end/lib/src/fasta/scanner/recover.dart b/pkg/front_end/lib/src/fasta/scanner/recover.dart
index e9c33e8..6bc6e87 100644
--- a/pkg/front_end/lib/src/fasta/scanner/recover.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/recover.dart
@@ -1,227 +1,53 @@
 // 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 licenset hat can be found in the LICENSE file.
+// BSD-style license that can be found in the LICENSE file.
 
 library fasta.scanner.recover;
 
 import '../../scanner/token.dart' show TokenType;
 
-import '../fasta_codes.dart'
-    show
-        Code,
-        codeAsciiControlCharacter,
-        codeEncoding,
-        codeExpectedHexDigit,
-        codeMissingExponent,
-        codeNonAsciiIdentifier,
-        codeNonAsciiWhitespace,
-        codeUnexpectedDollarInString,
-        codeUnmatchedToken,
-        codeUnterminatedComment,
-        codeUnterminatedString;
-
 import '../../scanner/token.dart' show Token;
 
 import 'token.dart' show StringToken;
 
-import 'error_token.dart' show NonAsciiIdentifierToken, ErrorToken;
+import 'error_token.dart' show ErrorToken;
 
 /// Recover from errors in [tokens]. The original sources are provided as
 /// [bytes]. [lineStarts] are the beginning character offsets of lines, and
 /// must be updated if recovery is performed rewriting the original source
 /// code.
 Token scannerRecovery(List<int> bytes, Token tokens, List<int> lineStarts) {
-  // See [Parser.reportErrorToken](../parser/src/parser.dart) for how
-  // it currently handles lexical errors. In addition, notice how the parser
-  // calls [handleInvalidExpression], [handleInvalidFunctionBody], and
-  // [handleInvalidTypeReference] to allow the listener to recover its internal
-  // state. See [package:compiler/src/parser/element_listener.dart] for an
-  // example of how these events are used.
-  //
-  // In addition, the scanner will attempt a bit of recovery when braces don't
-  // match up during brace grouping. See
-  // [ArrayBasedScanner.discardBeginGroupUntil](array_based_scanner.dart). For
-  // more details on brace grouping see
-  // [AbstractScanner.unmatchedBeginGroup](abstract_scanner.dart).
+  // Sanity check that all error tokens are prepended.
 
-  /// Tokens with errors.
-  ErrorToken error;
+  // TODO(danrubel): Remove this in a while after the dust has settled.
 
-  /// Used for appending to [error].
-  ErrorToken errorTail;
+  // Skip over prepended error tokens
+  var token = tokens;
+  while (token is ErrorToken) {
+    token = token.next;
+  }
 
-  /// Tokens without errors.
-  Token good;
-
-  /// Used for appending to [good].
-  Token goodTail;
-
-  /// The previous token appended to [good]. Since tokens are single linked
-  /// lists, this allows us to rewrite the current token without scanning all
-  /// of [good]. This is supposed to be the token immediately before
-  /// [goodTail], that is, `beforeGoodTail.next == goodTail`.
-  Token beforeGoodTail;
-
-  recoverIdentifier(NonAsciiIdentifierToken first) {
-    List<int> codeUnits = <int>[];
-
-    // True if the previous good token is an identifier and ends right where
-    // [first] starts. This is the case for input like `blåbærgrød`. In this
-    // case, the scanner produces this sequence of tokens:
-    //
-    //     [
-    //        StringToken("bl"),
-    //        NonAsciiIdentifierToken("å"),
-    //        StringToken("b"),
-    //        NonAsciiIdentifierToken("æ"),
-    //        StringToken("rgr"),
-    //        NonAsciiIdentifierToken("ø"),
-    //        StringToken("d"),
-    //        EOF,
-    //     ]
-    bool prepend = false;
-
-    // True if following token is also an identifier that starts right where
-    // [errorTail] ends. This is the case for "b" above.
-    bool append = false;
-    if (goodTail != null) {
-      if (goodTail.type == TokenType.IDENTIFIER &&
-          goodTail.charEnd == first.charOffset) {
-        prepend = true;
+  // Assert no error tokens in the remaining tokens
+  while (!token.isEof) {
+    if (token is ErrorToken) {
+      for (int count = 0; count < 3; ++count) {
+        var previous = token.previous;
+        if (previous.isEof) break;
+        token = previous;
       }
-    }
-    Token next = errorTail.next;
-    if (next.type == TokenType.IDENTIFIER &&
-        errorTail.charOffset + 1 == next.charOffset) {
-      append = true;
-    }
-    if (prepend) {
-      codeUnits.addAll(goodTail.lexeme.codeUnits);
-    }
-    NonAsciiIdentifierToken current = first;
-    while (current != errorTail) {
-      codeUnits.add(current.character);
-      current = current.next;
-    }
-    codeUnits.add(errorTail.character);
-    int charOffset = first.charOffset;
-    if (prepend) {
-      charOffset = goodTail.charOffset;
-      if (beforeGoodTail == null) {
-        // We're prepending the first good token, so the new token will become
-        // the first good token.
-        good = null;
-        goodTail = null;
-        beforeGoodTail = null;
-      } else {
-        goodTail = beforeGoodTail;
+      var msg = new StringBuffer(
+          "Internal error: All error tokens should have been prepended:");
+      for (int count = 0; count < 7; ++count) {
+        if (token.isEof) break;
+        msg.write(' ${token.runtimeType},');
+        token = token.next;
       }
+      throw msg.toString();
     }
-    if (append) {
-      codeUnits.addAll(next.lexeme.codeUnits);
-      next = next.next;
-    }
-    String value = new String.fromCharCodes(codeUnits);
-    return synthesizeToken(charOffset, value, TokenType.IDENTIFIER)
-      ..setNext(next);
+    token = token.next;
   }
 
-  recoverExponent() {
-    return errorTail.next;
-  }
-
-  recoverString() {
-    return errorTail.next;
-  }
-
-  recoverHexDigit() {
-    return synthesizeToken(errorTail.charOffset, "0", TokenType.INT)
-      ..setNext(errorTail.next);
-  }
-
-  recoverStringInterpolation() {
-    return errorTail.next;
-  }
-
-  recoverComment() {
-    // TODO(ahe): Improve this.
-    return skipToEof(errorTail);
-  }
-
-  recoverUnmatched() {
-    // TODO(ahe): Try to use top-level keywords (such as `class`, `typedef`,
-    // and `enum`) and indentation to recover.
-    return errorTail.next;
-  }
-
-  for (Token current = tokens; !current.isEof; current = current.next) {
-    while (current is ErrorToken) {
-      ErrorToken first = current;
-      Token next = current;
-      do {
-        current = next;
-        if (errorTail == null) {
-          error = next;
-        } else {
-          errorTail.setNext(next);
-        }
-        errorTail = next;
-        next = next.next;
-      } while (next is ErrorToken && first.errorCode == next.errorCode);
-
-      Code code = first.errorCode;
-      if (code == codeEncoding ||
-          code == codeNonAsciiWhitespace ||
-          code == codeAsciiControlCharacter) {
-        current = errorTail.next;
-      } else if (code == codeNonAsciiIdentifier) {
-        current = recoverIdentifier(first);
-        assert(current.next != null);
-      } else if (code == codeMissingExponent) {
-        current = recoverExponent();
-        assert(current.next != null);
-      } else if (code == codeUnterminatedString) {
-        current = recoverString();
-        assert(current.next != null);
-      } else if (code == codeExpectedHexDigit) {
-        current = recoverHexDigit();
-        assert(current.next != null);
-      } else if (code == codeUnexpectedDollarInString) {
-        current = recoverStringInterpolation();
-        assert(current.next != null);
-      } else if (code == codeUnterminatedComment) {
-        current = recoverComment();
-        assert(current.next != null);
-      } else if (code == codeUnmatchedToken) {
-        current = recoverUnmatched();
-        assert(current.next != null);
-      } else {
-        current = errorTail.next;
-      }
-    }
-    if (goodTail == null) {
-      good = current;
-    } else {
-      goodTail.setNext(current);
-    }
-    beforeGoodTail = goodTail;
-    goodTail = current;
-  }
-
-  if (error == null) {
-    // All of the errors are in the scanner's error list.
-    return tokens;
-  }
-  new Token.eof(-1).setNext(error);
-  Token tail;
-  if (good != null) {
-    errorTail.setNext(good);
-    tail = goodTail;
-  } else {
-    tail = errorTail;
-  }
-  if (!tail.isEof) tail.setNext(new Token.eof(tail.end));
-  return error;
+  return tokens;
 }
 
 Token synthesizeToken(int charOffset, String value, TokenType type) {
diff --git a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
index 7fa5203..eab5cbc 100644
--- a/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/string_scanner.dart
@@ -9,9 +9,7 @@
 import '../../scanner/token.dart' as analyzer show StringToken;
 
 import 'abstract_scanner.dart'
-    show LanguageVersionChanged, ScannerConfiguration;
-
-import 'array_based_scanner.dart' show ArrayBasedScanner;
+    show AbstractScanner, LanguageVersionChanged, ScannerConfiguration;
 
 import 'token.dart'
     show CommentToken, DartDocToken, LanguageVersionToken, StringToken;
@@ -22,7 +20,7 @@
  * Scanner that reads from a String and creates tokens that points to
  * substrings.
  */
-class StringScanner extends ArrayBasedScanner {
+class StringScanner extends AbstractScanner {
   /** The file content. */
   String string;
 
diff --git a/pkg/front_end/lib/src/fasta/scanner/token.dart b/pkg/front_end/lib/src/fasta/scanner/token.dart
index e347dc2..fb1f65f 100644
--- a/pkg/front_end/lib/src/fasta/scanner/token.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/token.dart
@@ -27,7 +27,7 @@
    */
   static const int LAZY_THRESHOLD = 4;
 
-  var /* String | LazySubtring */ valueOrLazySubstring;
+  var /* String | LazySubstring */ valueOrLazySubstring;
 
   /**
    * Creates a non-lazy string token. If [canonicalize] is true, the string
diff --git a/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart b/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
index e847390..ae2610d 100644
--- a/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
+++ b/pkg/front_end/lib/src/fasta/scanner/utf8_bytes_scanner.dart
@@ -13,18 +13,16 @@
 import '../scanner.dart' show unicodeReplacementCharacter;
 
 import 'abstract_scanner.dart'
-    show LanguageVersionChanged, ScannerConfiguration;
+    show AbstractScanner, LanguageVersionChanged, ScannerConfiguration;
 
 import 'token.dart'
     show CommentToken, DartDocToken, LanguageVersionToken, StringToken;
 
-import 'array_based_scanner.dart' show ArrayBasedScanner;
-
 /**
  * Scanner that reads from a UTF-8 encoded list of bytes and creates tokens
  * that points to substrings.
  */
-class Utf8BytesScanner extends ArrayBasedScanner {
+class Utf8BytesScanner extends AbstractScanner {
   /**
    * The file content.
    *
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index c74cc99..f3349aa 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -4,8 +4,7 @@
 
 library fasta.scope;
 
-import 'builder/builder.dart'
-    show Declaration, NameIterator, TypeVariableBuilder;
+import 'builder/builder.dart' show Builder, NameIterator, TypeVariableBuilder;
 
 import 'fasta_codes.dart'
     show
@@ -20,10 +19,10 @@
 
 class MutableScope {
   /// Names declared in this scope.
-  Map<String, Declaration> local;
+  Map<String, Builder> local;
 
   /// Setters declared in this scope.
-  Map<String, Declaration> setters;
+  Map<String, Builder> setters;
 
   /// The scope that this scope is nested within, or `null` if this is the top
   /// level scope.
@@ -44,32 +43,31 @@
   /// succeed.
   final bool isModifiable;
 
-  Map<String, Declaration> labels;
+  Map<String, Builder> labels;
 
-  Map<String, Declaration> forwardDeclaredLabels;
+  Map<String, Builder> forwardDeclaredLabels;
 
   Map<String, int> usedNames;
 
-  Scope(Map<String, Declaration> local, Map<String, Declaration> setters,
-      Scope parent, String debugName, {this.isModifiable: true})
-      : super(local, setters = setters ?? const <String, Declaration>{}, parent,
+  Scope(Map<String, Builder> local, Map<String, Builder> setters, Scope parent,
+      String debugName, {this.isModifiable: true})
+      : super(local, setters = setters ?? const <String, Builder>{}, parent,
             debugName);
 
   Scope.top({bool isModifiable: false})
-      : this(<String, Declaration>{}, <String, Declaration>{}, null, "top",
+      : this(<String, Builder>{}, <String, Builder>{}, null, "top",
             isModifiable: isModifiable);
 
   Scope.immutable()
-      : this(const <String, Declaration>{}, const <String, Declaration>{}, null,
+      : this(const <String, Builder>{}, const <String, Builder>{}, null,
             "immutable",
             isModifiable: false);
 
   Scope.nested(Scope parent, String debugName, {bool isModifiable: true})
-      : this(
-            <String, Declaration>{}, <String, Declaration>{}, parent, debugName,
+      : this(<String, Builder>{}, <String, Builder>{}, parent, debugName,
             isModifiable: isModifiable);
 
-  Iterator<Declaration> get iterator {
+  Iterator<Builder> get iterator {
     return new ScopeLocalDeclarationIterator(this);
   }
 
@@ -115,7 +113,7 @@
     return newScope;
   }
 
-  /// Create a special scope for use by labeled staments. This scope doesn't
+  /// Create a special scope for use by labeled statements. This scope doesn't
   /// introduce a new scope for local variables, only for labels. This deals
   /// with corner cases like this:
   ///
@@ -133,9 +131,9 @@
     }
   }
 
-  Declaration lookupIn(String name, int charOffset, Uri fileUri,
-      Map<String, Declaration> map, bool isInstanceScope) {
-    Declaration builder = map[name];
+  Builder lookupIn(String name, int charOffset, Uri fileUri,
+      Map<String, Builder> map, bool isInstanceScope) {
+    Builder builder = map[name];
     if (builder == null) return null;
     if (builder.next != null) {
       return new AmbiguousBuilder(name.isEmpty ? classNameOrDebugName : name,
@@ -147,10 +145,10 @@
     }
   }
 
-  Declaration lookup(String name, int charOffset, Uri fileUri,
+  Builder lookup(String name, int charOffset, Uri fileUri,
       {bool isInstanceScope: true}) {
     recordUse(name, charOffset, fileUri);
-    Declaration builder =
+    Builder builder =
         lookupIn(name, charOffset, fileUri, local, isInstanceScope);
     if (builder != null) return builder;
     builder = lookupIn(name, charOffset, fileUri, setters, isInstanceScope);
@@ -158,16 +156,16 @@
       return new AccessErrorBuilder(name, builder, charOffset, fileUri);
     }
     if (!isInstanceScope) {
-      // For static lookup, do not seach the parent scope.
+      // For static lookup, do not search the parent scope.
       return builder;
     }
     return builder ?? parent?.lookup(name, charOffset, fileUri);
   }
 
-  Declaration lookupSetter(String name, int charOffset, Uri fileUri,
+  Builder lookupSetter(String name, int charOffset, Uri fileUri,
       {bool isInstanceScope: true}) {
     recordUse(name, charOffset, fileUri);
-    Declaration builder =
+    Builder builder =
         lookupIn(name, charOffset, fileUri, setters, isInstanceScope);
     if (builder != null) return builder;
     builder = lookupIn(name, charOffset, fileUri, local, isInstanceScope);
@@ -175,7 +173,7 @@
       return new AccessErrorBuilder(name, builder, charOffset, fileUri);
     }
     if (!isInstanceScope) {
-      // For static lookup, do not seach the parent scope.
+      // For static lookup, do not search the parent scope.
       return builder;
     }
     return builder ?? parent?.lookupSetter(name, charOffset, fileUri);
@@ -183,9 +181,9 @@
 
   bool hasLocalLabel(String name) => labels != null && labels.containsKey(name);
 
-  void declareLabel(String name, Declaration target) {
+  void declareLabel(String name, Builder target) {
     if (isModifiable) {
-      labels ??= <String, Declaration>{};
+      labels ??= <String, Builder>{};
       labels[name] = target;
     } else {
       internalProblem(
@@ -193,9 +191,9 @@
     }
   }
 
-  void forwardDeclareLabel(String name, Declaration target) {
+  void forwardDeclareLabel(String name, Builder target) {
     declareLabel(name, target);
-    forwardDeclaredLabels ??= <String, Declaration>{};
+    forwardDeclaredLabels ??= <String, Builder>{};
     forwardDeclaredLabels[name] = target;
   }
 
@@ -208,11 +206,11 @@
     return true;
   }
 
-  Map<String, Declaration> get unclaimedForwardDeclarations {
+  Map<String, Builder> get unclaimedForwardDeclarations {
     return forwardDeclaredLabels;
   }
 
-  Declaration lookupLabel(String name) {
+  Builder lookupLabel(String name) {
     return (labels == null ? null : labels[name]) ?? parent?.lookupLabel(name);
   }
 
@@ -222,7 +220,7 @@
   /// that can be used as context for reporting a compile-time error about
   /// [name] being used before its declared. [fileUri] is used to bind the
   /// location of this message.
-  LocatedMessage declare(String name, Declaration builder, Uri fileUri) {
+  LocatedMessage declare(String name, Builder builder, Uri fileUri) {
     if (isModifiable) {
       if (usedNames?.containsKey(name) ?? false) {
         return templateDuplicatedNamePreviouslyUsedCause
@@ -239,12 +237,12 @@
 
   void merge(
       Scope scope,
-      Declaration computeAmbiguousDeclaration(
-          String name, Declaration existing, Declaration member)) {
-    Map<String, Declaration> map = local;
+      Builder computeAmbiguousDeclaration(
+          String name, Builder existing, Builder member)) {
+    Map<String, Builder> map = local;
 
-    void mergeMember(String name, Declaration member) {
-      Declaration existing = map[name];
+    void mergeMember(String name, Builder member) {
+      Builder existing = map[name];
       if (existing != null) {
         if (existing != member) {
           member = computeAmbiguousDeclaration(name, existing, member);
@@ -258,7 +256,7 @@
     scope.setters.forEach(mergeMember);
   }
 
-  void forEach(f(String name, Declaration member)) {
+  void forEach(f(String name, Builder member)) {
     local.forEach(f);
     setters.forEach(f);
   }
@@ -276,10 +274,10 @@
     int nestingLevel = (parent?.writeOn(sink) ?? -1) + 1;
     String indent = "  " * nestingLevel;
     sink.writeln("$indent{");
-    local.forEach((String name, Declaration member) {
+    local.forEach((String name, Builder member) {
       sink.writeln("$indent  $name");
     });
-    setters.forEach((String name, Declaration member) {
+    setters.forEach((String name, Builder member) {
       sink.writeln("$indent  $name=");
     });
     return nestingLevel;
@@ -287,11 +285,11 @@
 
   Scope computeMixinScope() {
     List<String> names = this.local.keys.toList();
-    Map<String, Declaration> local = <String, Declaration>{};
+    Map<String, Builder> local = <String, Builder>{};
     bool needsCopy = false;
     for (int i = 0; i < names.length; i++) {
       String name = names[i];
-      Declaration declaration = this.local[name];
+      Builder declaration = this.local[name];
       if (declaration.isStatic) {
         needsCopy = true;
       } else {
@@ -299,10 +297,10 @@
       }
     }
     names = this.setters.keys.toList();
-    Map<String, Declaration> setters = <String, Declaration>{};
+    Map<String, Builder> setters = <String, Builder>{};
     for (int i = 0; i < names.length; i++) {
       String name = names[i];
-      Declaration declaration = this.setters[name];
+      Builder declaration = this.setters[name];
       if (declaration.isStatic) {
         needsCopy = true;
       } else {
@@ -321,21 +319,21 @@
 
   ScopeBuilder(this.scope);
 
-  void addMember(String name, Declaration builder) {
+  void addMember(String name, Builder builder) {
     scope.local[name] = builder;
   }
 
-  void addSetter(String name, Declaration builder) {
+  void addSetter(String name, Builder builder) {
     scope.setters[name] = builder;
   }
 
-  Declaration operator [](String name) => scope.local[name];
+  Builder operator [](String name) => scope.local[name];
 }
 
-abstract class ProblemBuilder extends Declaration {
+abstract class ProblemBuilder extends Builder {
   final String name;
 
-  final Declaration builder;
+  final Builder builder;
 
   final int charOffset;
 
@@ -356,11 +354,10 @@
 /// Represents a [builder] that's being accessed incorrectly. For example, an
 /// attempt to write to a final field, or to read from a setter.
 class AccessErrorBuilder extends ProblemBuilder {
-  AccessErrorBuilder(
-      String name, Declaration builder, int charOffset, Uri fileUri)
+  AccessErrorBuilder(String name, Builder builder, int charOffset, Uri fileUri)
       : super(name, builder, charOffset, fileUri);
 
-  Declaration get parent => builder;
+  Builder get parent => builder;
 
   bool get isFinal => builder.isFinal;
 
@@ -386,18 +383,17 @@
 }
 
 class AmbiguousBuilder extends ProblemBuilder {
-  AmbiguousBuilder(
-      String name, Declaration builder, int charOffset, Uri fileUri)
+  AmbiguousBuilder(String name, Builder builder, int charOffset, Uri fileUri)
       : super(name, builder, charOffset, fileUri);
 
-  Declaration get parent => null;
+  Builder get parent => null;
 
   Message get message => templateDuplicatedDeclarationUse.withArguments(name);
 
   // TODO(ahe): Also provide context.
 
-  Declaration getFirstDeclaration() {
-    Declaration declaration = builder;
+  Builder getFirstDeclaration() {
+    Builder declaration = builder;
     while (declaration.next != null) {
       declaration = declaration.next;
     }
@@ -405,17 +401,17 @@
   }
 }
 
-class ScopeLocalDeclarationIterator implements Iterator<Declaration> {
-  Iterator<Declaration> local;
-  final Iterator<Declaration> setters;
-  Declaration current;
+class ScopeLocalDeclarationIterator implements Iterator<Builder> {
+  Iterator<Builder> local;
+  final Iterator<Builder> setters;
+  Builder current;
 
   ScopeLocalDeclarationIterator(Scope scope)
       : local = scope.local.values.iterator,
         setters = scope.setters.values.iterator;
 
   bool moveNext() {
-    Declaration next = current?.next;
+    Builder next = current?.next;
     if (next != null) {
       current = next;
       return true;
@@ -450,7 +446,7 @@
         super(scope);
 
   bool moveNext() {
-    Declaration next = current?.next;
+    Builder next = current?.next;
     if (next != null) {
       current = next;
       return true;
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 52ee5db..04476fb 100644
--- a/pkg/front_end/lib/src/fasta/source/diet_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/diet_listener.dart
@@ -37,16 +37,12 @@
 
 import '../ignored_parser_errors.dart' show isIgnoredParserError;
 
-import '../kernel/kernel_body_builder.dart' show KernelBodyBuilder;
+import '../kernel/body_builder.dart' show BodyBuilder;
 
 import '../kernel/kernel_builder.dart'
-    show
-        KernelFormalParameterBuilder,
-        KernelFunctionTypeBuilder,
-        KernelTypeAliasBuilder,
-        KernelTypeBuilder;
+    show FormalParameterBuilder, TypeAliasBuilder, TypeBuilder;
 
-import '../parser.dart' show Assert, MemberKind, Parser, optional;
+import '../parser.dart' show Assert, ClassKind, MemberKind, Parser, optional;
 
 import '../problems.dart'
     show DebugAbort, internalProblem, unexpected, unhandled;
@@ -58,6 +54,8 @@
 import 'stack_listener.dart'
     show FixedNullableList, NullValue, ParserRecovery, StackListener;
 
+import '../source/value_kinds.dart';
+
 import '../quote.dart' show unescapeString;
 
 class DietListener extends StackListener {
@@ -80,6 +78,9 @@
 
   bool currentClassIsParserRecovery = false;
 
+  /// Counter used for naming unnamed extension declarations.
+  int unnamedExtensionCounter = 0;
+
   /// For top-level declarations, this is the library scope. For class members,
   /// this is the instance scope of [currentClass].
   Scope memberScope;
@@ -99,12 +100,13 @@
 
   @override
   void endMetadataStar(int count) {
+    assert(checkState(null, repeatedKinds(ValueKind.Token, count)));
     debugEvent("MetadataStar");
     if (count > 0) {
       discard(count - 1);
-      push(pop(NullValue.Metadata));
+      push(pop(NullValue.Token) ?? NullValue.Token);
     } else {
-      push(NullValue.Metadata);
+      push(NullValue.Token);
     }
   }
 
@@ -241,15 +243,15 @@
     checkEmpty(typedefKeyword.charOffset);
     if (name is ParserRecovery) return;
 
-    Declaration typedefBuilder = lookupBuilder(typedefKeyword, null, name);
+    Builder typedefBuilder = lookupBuilder(typedefKeyword, null, name);
     parseMetadata(typedefBuilder, metadata, typedefBuilder.target);
-    if (typedefBuilder is KernelTypeAliasBuilder) {
-      KernelTypeBuilder type = typedefBuilder.type;
-      if (type is KernelFunctionTypeBuilder) {
-        List<FormalParameterBuilder<TypeBuilder>> formals = type.formals;
+    if (typedefBuilder is TypeAliasBuilder) {
+      TypeBuilder type = typedefBuilder.type;
+      if (type is FunctionTypeBuilder) {
+        List<FormalParameterBuilder> formals = type.formals;
         if (formals != null) {
           for (int i = 0; i < formals.length; ++i) {
-            KernelFormalParameterBuilder formal = formals[i];
+            FormalParameterBuilder formal = formals[i];
             List<MetadataBuilder> metadata = formal.metadata;
             if (metadata != null && metadata.length > 0) {
               // [parseMetadata] is using [Parser.parseMetadataStar] under the
@@ -539,7 +541,7 @@
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery || currentClassIsParserRecovery) return;
 
-    ProcedureBuilder builder = lookupConstructor(beginToken, name);
+    FunctionBuilder builder = lookupConstructor(beginToken, name);
     if (bodyToken == null || optional("=", bodyToken.endGroup.next)) {
       buildRedirectingFactoryMethod(
           bodyToken, builder, MemberKind.Factory, metadata);
@@ -586,7 +588,7 @@
     Token metadata = pop();
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery || currentClassIsParserRecovery) return;
-    ProcedureBuilder builder;
+    FunctionBuilder builder;
     if (name is QualifiedName ||
         (getOrSet == null && name == currentClass.name)) {
       builder = lookupConstructor(beginToken, name);
@@ -604,16 +606,19 @@
 
   StackListener createListener(
       ModifierBuilder builder, Scope memberScope, bool isInstanceMember,
-      [Scope formalParameterScope]) {
+      {VariableDeclaration extensionThis, Scope formalParameterScope}) {
     // Note: we set thisType regardless of whether we are building a static
     // member, since that provides better error recovery.
-    InterfaceType thisType = currentClass?.target?.thisType;
+    // TODO(johnniwinther): Provide a dummy this on static extension methods
+    // for better error recovery?
+    InterfaceType thisType =
+        extensionThis == null ? currentClass?.target?.thisType : null;
     var typeInferrer =
         typeInferenceEngine?.createLocalTypeInferrer(uri, thisType, library);
     ConstantContext constantContext = builder.isConstructor && builder.isConst
         ? ConstantContext.inferred
         : ConstantContext.none;
-    return new KernelBodyBuilder(
+    return new BodyBuilder(
         library,
         builder,
         memberScope,
@@ -622,12 +627,13 @@
         coreTypes,
         currentClass,
         isInstanceMember,
+        extensionThis,
         uri,
         typeInferrer)
       ..constantContext = constantContext;
   }
 
-  StackListener createFunctionListener(ProcedureBuilder builder) {
+  StackListener createFunctionListener(FunctionBuilder builder) {
     final Scope typeParameterScope =
         builder.computeTypeParameterScope(memberScope);
     final Scope formalParameterScope =
@@ -635,11 +641,12 @@
     assert(typeParameterScope != null);
     assert(formalParameterScope != null);
     return createListener(builder, typeParameterScope, builder.isInstanceMember,
-        formalParameterScope);
+        extensionThis: builder.extensionThis,
+        formalParameterScope: formalParameterScope);
   }
 
   void buildRedirectingFactoryMethod(
-      Token token, ProcedureBuilder builder, MemberKind kind, Token metadata) {
+      Token token, FunctionBuilder builder, MemberKind kind, Token metadata) {
     final StackListener listener = createFunctionListener(builder);
     try {
       Parser parser = new Parser(listener);
@@ -665,7 +672,7 @@
     checkEmpty(token.charOffset);
     if (names == null || currentClassIsParserRecovery) return;
 
-    Declaration declaration = lookupBuilder(token, null, names.first);
+    Builder declaration = lookupBuilder(token, null, names.first);
     // TODO(paulberry): don't re-parse the field if we've already parsed it
     // for type inference.
     parseFields(
@@ -696,19 +703,12 @@
   }
 
   @override
-  void beginMixinDeclaration(Token mixinKeyword, Token name) {
-    debugEvent("beginMixinDeclaration");
-    push(mixinKeyword);
-  }
-
-  @override
-  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
-    debugEvent("beginClassDeclaration");
-    push(begin);
-  }
-
-  @override
-  void beginClassOrMixinBody(Token token) {
+  void beginClassOrMixinBody(ClassKind kind, Token token) {
+    assert(checkState(token, [
+      ValueKind.Token,
+      ValueKind.NameOrParserRecovery,
+      ValueKind.TokenOrNull
+    ]));
     debugEvent("beginClassOrMixinBody");
     Token beginToken = pop();
     Object name = pop();
@@ -724,7 +724,8 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody");
     currentClass = null;
     currentClassIsParserRecovery = false;
@@ -732,18 +733,47 @@
   }
 
   @override
+  void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
+    debugEvent("beginClassDeclaration");
+    push(begin);
+  }
+
+  @override
   void endClassDeclaration(Token beginToken, Token endToken) {
-    debugEvent("ClassDeclaration");
+    debugEvent("endClassDeclaration");
     checkEmpty(beginToken.charOffset);
   }
 
   @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    debugEvent("beginMixinDeclaration");
+    push(mixinKeyword);
+  }
+
+  @override
   void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    debugEvent("MixinDeclaration");
+    debugEvent("endMixinDeclaration");
     checkEmpty(mixinKeyword.charOffset);
   }
 
   @override
+  void beginExtensionDeclaration(Token extensionKeyword, Token nameToken) {
+    debugEvent("beginExtensionDeclaration");
+    String name = nameToken?.lexeme ??
+        // Synthesized name used internally.
+        'extension#${unnamedExtensionCounter++}';
+    push(name);
+    push(extensionKeyword);
+  }
+
+  @override
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token endToken) {
+    debugEvent("endExtensionDeclaration");
+    checkEmpty(extensionKeyword.charOffset);
+  }
+
+  @override
   void endEnum(Token enumKeyword, Token leftBrace, int count) {
     debugEvent("Enum");
     const FixedNullableList<Object>().pop(stack, count * 2);
@@ -830,9 +860,9 @@
     listener.checkEmpty(token.charOffset);
   }
 
-  Declaration lookupBuilder(Token token, Token getOrSet, String name) {
+  Builder lookupBuilder(Token token, Token getOrSet, String name) {
     // TODO(ahe): Can I move this to Scope or ScopeBuilder?
-    Declaration declaration;
+    Builder declaration;
     if (currentClass != null) {
       if (uri != currentClass.fileUri) {
         unexpected("$uri", "${currentClass.fileUri}", currentClass.charOffset,
@@ -854,9 +884,9 @@
     return declaration;
   }
 
-  Declaration lookupConstructor(Token token, Object nameOrQualified) {
+  Builder lookupConstructor(Token token, Object nameOrQualified) {
     assert(currentClass != null);
-    Declaration declaration;
+    Builder declaration;
     String suffix;
     if (nameOrQualified is QualifiedName) {
       suffix = nameOrQualified.name;
@@ -869,12 +899,12 @@
     return declaration;
   }
 
-  Declaration handleDuplicatedName(Declaration declaration, Token token) {
+  Builder handleDuplicatedName(Builder declaration, Token token) {
     int offset = token.charOffset;
     if (declaration?.next == null) {
       return declaration;
     } else {
-      Declaration nearestDeclaration;
+      Builder nearestDeclaration;
       int minDistance = -1;
       do {
         // Only look at declarations from this file (part).
@@ -898,7 +928,7 @@
     }
   }
 
-  void checkBuilder(Token token, Declaration declaration, Object name) {
+  void checkBuilder(Token token, Builder declaration, Object name) {
     if (declaration == null) {
       internalProblem(templateInternalProblemNotFound.withArguments("$name"),
           token.charOffset, uri);
@@ -973,7 +1003,7 @@
   }
 
   @override
-  bool isIgnoredError(Code code, Token token) {
+  bool isIgnoredError(Code<dynamic> code, Token token) {
     return isIgnoredParserError(code, token) ||
         super.isIgnoredError(code, token);
   }
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 1ed1f9e..830352f 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -4,7 +4,7 @@
 
 library fasta.outline_builder;
 
-import 'package:kernel/ast.dart' show DartType, Library, ProcedureKind;
+import 'package:kernel/ast.dart' show ProcedureKind;
 
 import '../builder/builder.dart';
 
@@ -41,10 +41,10 @@
 // TODO(ahe): The outline isn't supposed to import kernel-specific builders.
 import '../kernel/kernel_builder.dart'
     show
-        KernelMetadataBuilder,
-        KernelMixinApplicationBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder;
+        MetadataBuilder,
+        MixinApplicationBuilder,
+        NamedTypeBuilder,
+        TypeBuilder;
 
 import '../modifier.dart'
     show
@@ -58,7 +58,9 @@
         abstractMask,
         constMask,
         covariantMask,
+        extensionDeclarationMask,
         externalMask,
+        finalMask,
         mixinDeclarationMask,
         staticMask;
 
@@ -72,6 +74,7 @@
 import '../parser.dart'
     show
         Assert,
+        ClassKind,
         FormalParameterKind,
         IdentifierContext,
         lengthOfSpan,
@@ -85,11 +88,18 @@
 
 import '../scanner.dart' show Token;
 
-import 'source_library_builder.dart' show FieldInfo, SourceLibraryBuilder;
+import 'source_library_builder.dart'
+    show
+        TypeParameterScopeBuilder,
+        TypeParameterScopeKind,
+        FieldInfo,
+        SourceLibraryBuilder;
 
 import 'stack_listener.dart'
     show FixedNullableList, NullValue, ParserRecovery, StackListener;
 
+import 'value_kinds.dart';
+
 enum MethodBody {
   Abstract,
   Regular,
@@ -97,7 +107,7 @@
 }
 
 class OutlineBuilder extends StackListener {
-  final SourceLibraryBuilder<KernelTypeBuilder, Library> library;
+  final SourceLibraryBuilder library;
 
   final bool enableNative;
   final bool stringExpectedAfterNative;
@@ -107,7 +117,10 @@
 
   String nativeMethodName;
 
-  OutlineBuilder(SourceLibraryBuilder<KernelTypeBuilder, Library> library)
+  /// Counter used for naming unnamed extension declarations.
+  int unnamedExtensionCounter = 0;
+
+  OutlineBuilder(SourceLibraryBuilder library)
       : library = library,
         enableNative =
             library.loader.target.backendTarget.enableNative(library.uri),
@@ -148,7 +161,7 @@
     Object sentinel = pop(); // prefix or constructor
     push(sentinel is ParserRecovery
         ? sentinel
-        : new KernelMetadataBuilder(beginToken));
+        : new MetadataBuilder(beginToken));
   }
 
   @override
@@ -434,55 +447,54 @@
   @override
   void beginClassOrNamedMixinApplication(Token token) {
     debugEvent("beginClassOrNamedMixinApplication");
-    library.beginNestedDeclaration("class or mixin application");
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.classOrNamedMixinApplication,
+        "class or mixin application");
   }
 
   @override
   void beginClassDeclaration(Token begin, Token abstractToken, Token name) {
-    debugEvent("beginNamedMixinApplication");
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    debugEvent("beginClassDeclaration");
+    List<TypeVariableBuilder> typeVariables = pop();
     push(typeVariables ?? NullValue.TypeVariables);
-    library.currentDeclaration
-      ..name = name.lexeme
-      ..charOffset = name.charOffset
-      ..typeVariables = typeVariables;
+    library.currentTypeParameterScopeBuilder
+        .markAsClassDeclaration(name.lexeme, name.charOffset, typeVariables);
     push(abstractToken != null ? abstractMask : 0);
   }
 
   @override
   void beginMixinDeclaration(Token mixinKeyword, Token name) {
     debugEvent("beginMixinDeclaration");
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     push(typeVariables ?? NullValue.TypeVariables);
-    library.currentDeclaration
-      ..name = name.lexeme
-      ..charOffset = name.charOffset
-      ..typeVariables = typeVariables;
+    library.currentTypeParameterScopeBuilder
+        .markAsMixinDeclaration(name.lexeme, name.charOffset, typeVariables);
   }
 
   @override
-  void beginClassOrMixinBody(Token token) {
+  void beginClassOrMixinBody(ClassKind kind, Token token) {
+    if (kind == ClassKind.Extension) {
+      assert(checkState(token, [ValueKind.TypeBuilder]));
+      TypeBuilder extensionThisType = peek();
+      library.currentTypeParameterScopeBuilder
+          .registerExtensionThisType(extensionThisType);
+    }
     debugEvent("beginClassOrMixinBody");
     // Resolve unresolved types from the class header (i.e., superclass, mixins,
     // and implemented types) before adding members from the class body which
     // should not shadow these unresolved types.
-    library.currentDeclaration
-        .resolveTypes(library.currentDeclaration.typeVariables, library);
+    library.currentTypeParameterScopeBuilder.resolveTypes(
+        library.currentTypeParameterScopeBuilder.typeVariables, library);
   }
 
   @override
   void beginNamedMixinApplication(
       Token begin, Token abstractToken, Token name) {
     debugEvent("beginNamedMixinApplication");
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     push(typeVariables ?? NullValue.TypeVariables);
-    library.currentDeclaration
-      ..name = name.lexeme
-      ..charOffset = name.charOffset
-      ..typeVariables = typeVariables;
+    library.currentTypeParameterScopeBuilder.markAsNamedMixinApplication(
+        name.lexeme, name.charOffset, typeVariables);
     push(abstractToken != null ? abstractMask : 0);
   }
 
@@ -490,7 +502,7 @@
   void handleClassOrMixinImplements(
       Token implementsKeyword, int interfacesCount) {
     debugEvent("ClassOrMixinImplements");
-    push(const FixedNullableList<KernelNamedTypeBuilder>()
+    push(const FixedNullableList<NamedTypeBuilder>()
             .pop(stack, interfacesCount) ??
         NullValue.TypeBuilderList);
   }
@@ -519,8 +531,7 @@
   @override
   void handleMixinOn(Token onKeyword, int typeCount) {
     debugEvent("handleMixinOn");
-    push(const FixedNullableList<KernelNamedTypeBuilder>()
-            .pop(stack, typeCount) ??
+    push(const FixedNullableList<NamedTypeBuilder>().pop(stack, typeCount) ??
         new ParserRecovery(offsetForToken(onKeyword)));
   }
 
@@ -532,9 +543,8 @@
     int supertypeOffset = pop();
     TypeBuilder supertype = nullIfParserRecovery(pop());
     int modifiers = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
-    int charOffset = pop();
+    List<TypeVariableBuilder> typeVariables = pop();
+    int nameOffset = pop();
     Object name = pop();
     if (typeVariables != null && supertype is MixinApplicationBuilder) {
       supertype.typeVariables = typeVariables;
@@ -542,7 +552,8 @@
     List<MetadataBuilder> metadata = pop();
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery) {
-      library.endNestedDeclaration("<syntax-error>");
+      library.endNestedDeclaration(
+          TypeParameterScopeKind.classDeclaration, "<syntax-error>");
       return;
     }
 
@@ -558,7 +569,7 @@
         supertype,
         interfaces,
         startCharOffset,
-        charOffset,
+        nameOffset,
         endToken.charOffset,
         supertypeOffset);
   }
@@ -572,15 +583,15 @@
     debugEvent("endMixinDeclaration");
     String documentationComment = getDocumentationComment(mixinToken);
     List<TypeBuilder> interfaces = pop(NullValue.TypeBuilderList);
-    List<KernelTypeBuilder> supertypeConstraints = nullIfParserRecovery(pop());
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop(NullValue.TypeVariables);
+    List<TypeBuilder> supertypeConstraints = nullIfParserRecovery(pop());
+    List<TypeVariableBuilder> typeVariables = pop(NullValue.TypeVariables);
     int nameOffset = pop();
     Object name = pop();
     List<MetadataBuilder> metadata = pop(NullValue.Metadata);
     checkEmpty(mixinToken.charOffset);
     if (name is ParserRecovery) {
-      library.endNestedDeclaration("<syntax-error>");
+      library.endNestedDeclaration(
+          TypeParameterScopeKind.mixinDeclaration, "<syntax-error>");
       return;
     }
     int startOffset =
@@ -590,11 +601,11 @@
       if (supertypeConstraints.length == 1) {
         supertype = supertypeConstraints.first;
       } else {
-        supertype = new KernelMixinApplicationBuilder(
+        supertype = new MixinApplicationBuilder(
             supertypeConstraints.first, supertypeConstraints.skip(1).toList());
       }
     }
-    library.addClass(
+    library.addMixinDeclaration(
         documentationComment,
         metadata,
         mixinDeclarationMask,
@@ -608,6 +619,62 @@
         -1);
   }
 
+  @override
+  void beginExtensionDeclaration(Token extensionKeyword, Token nameToken) {
+    assert(checkState(extensionKeyword,
+        [ValueKind.TypeVariableListOrNull, ValueKind.MetadataListOrNull]));
+    debugEvent("beginExtensionDeclaration");
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.extensionDeclaration, "extension");
+    List<TypeVariableBuilder> typeVariables = pop();
+    int offset = nameToken?.charOffset ?? extensionKeyword.charOffset;
+    String name = nameToken?.lexeme ??
+        // Synthesized name used internally.
+        'extension#${unnamedExtensionCounter++}';
+    push(name);
+    push(offset);
+    push(typeVariables ?? NullValue.TypeVariables);
+    library.currentTypeParameterScopeBuilder
+        .markAsExtensionDeclaration(name, offset, typeVariables);
+  }
+
+  @override
+  void endExtensionDeclaration(
+      Token extensionKeyword, Token onKeyword, Token endToken) {
+    assert(checkState(extensionKeyword, [
+      ValueKind.TypeBuilder,
+      ValueKind.TypeVariableListOrNull,
+      ValueKind.Integer,
+      ValueKind.NameOrNull,
+      ValueKind.MetadataListOrNull
+    ]));
+    debugEvent("endExtensionDeclaration");
+    String documentationComment = getDocumentationComment(extensionKeyword);
+    TypeBuilder supertype = pop();
+    List<TypeVariableBuilder> typeVariables = pop(NullValue.TypeVariables);
+    int nameOffset = pop();
+    String name = pop(NullValue.Name);
+    if (name == null) {
+      nameOffset = extensionKeyword.charOffset;
+      name = '$nameOffset';
+    }
+    List<MetadataBuilder> metadata = pop(NullValue.Metadata);
+    checkEmpty(extensionKeyword.charOffset);
+    int startOffset = metadata == null
+        ? extensionKeyword.charOffset
+        : metadata.first.charOffset;
+    library.addExtensionDeclaration(
+        documentationComment,
+        metadata,
+        extensionDeclarationMask,
+        name,
+        typeVariables,
+        supertype,
+        startOffset,
+        nameOffset,
+        endToken.charOffset);
+  }
+
   ProcedureKind computeProcedureKind(Token token) {
     if (token == null) return ProcedureKind.Method;
     if (optional("get", token)) return ProcedureKind.Getter;
@@ -618,7 +685,9 @@
 
   @override
   void beginTopLevelMethod(Token lastConsumed, Token externalToken) {
-    library.beginNestedDeclaration("#method", hasMembers: false);
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.topLevelMethod, "#method",
+        hasMembers: false);
     push(externalToken != null ? externalMask : 0);
   }
 
@@ -628,8 +697,7 @@
     MethodBody kind = pop();
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
     Object name = pop();
     TypeBuilder returnType = pop();
@@ -645,10 +713,13 @@
     if (isAbstract) {
       modifiers |= abstractMask;
     }
+    if (nativeMethodName != null) {
+      modifiers |= externalMask;
+    }
     List<MetadataBuilder> metadata = pop();
     checkEmpty(beginToken.charOffset);
     library
-        .endNestedDeclaration("#method")
+        .endNestedDeclaration(TypeParameterScopeKind.topLevelMethod, "#method")
         .resolveTypes(typeVariables, library);
     if (name is ParserRecovery) return;
     final int startCharOffset =
@@ -716,7 +787,8 @@
   void beginMethod(Token externalToken, Token staticToken, Token covariantToken,
       Token varFinalOrConst, Token getOrSet, Token name) {
     inConstructor =
-        name?.lexeme == library.currentDeclaration.name && getOrSet == null;
+        name?.lexeme == library.currentTypeParameterScopeBuilder.name &&
+            getOrSet == null;
     List<Modifier> modifiers;
     if (externalToken != null) {
       modifiers ??= <Modifier>[];
@@ -750,22 +822,40 @@
     }
     push(varFinalOrConst?.charOffset ?? -1);
     push(modifiers ?? NullValue.Modifiers);
-    library.beginNestedDeclaration("#method", hasMembers: false);
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.staticOrInstanceMethodOrConstructor, "#method",
+        hasMembers: false);
   }
 
   @override
   void endMethod(Token getOrSet, Token beginToken, Token beginParam,
       Token beginInitializers, Token endToken) {
+    assert(checkState(beginToken, [ValueKind.MethodBody]));
     debugEvent("Method");
     MethodBody bodyKind = pop();
     if (bodyKind == MethodBody.RedirectingFactoryBody) {
       // This will cause an error later.
       pop();
     }
+    assert(checkState(beginToken, [
+      ValueKind.FormalsOrNull,
+      ValueKind.Integer, // formals offset
+      ValueKind.TypeVariableListOrNull,
+      ValueKind.Integer, // name offset
+      unionOfKinds([
+        ValueKind.Name,
+        ValueKind.QualifiedName,
+        ValueKind.Operator,
+        ValueKind.ParserRecovery,
+      ]),
+      ValueKind.TypeBuilderOrNull,
+      ValueKind.ModifiersOrNull,
+      ValueKind.Integer, // var/final/const offset
+      ValueKind.MetadataListOrNull,
+    ]));
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
     Object nameOrOperator = pop();
     if (Operator.subtract == nameOrOperator && formals == null) {
@@ -826,6 +916,9 @@
       }
     }
     int modifiers = Modifier.validate(pop(), isAbstract: isAbstract);
+    if (nativeMethodName != null) {
+      modifiers |= externalMask;
+    }
     if ((modifiers & externalMask) != 0) {
       modifiers &= ~abstractMask;
     }
@@ -833,18 +926,62 @@
     int varFinalOrConstOffset = pop();
     List<MetadataBuilder> metadata = pop();
     String documentationComment = getDocumentationComment(beginToken);
-    library
-        .endNestedDeclaration("#method")
-        .resolveTypes(typeVariables, library);
+
+    TypeParameterScopeBuilder declarationBuilder = library.endNestedDeclaration(
+        TypeParameterScopeKind.staticOrInstanceMethodOrConstructor, "#method");
     if (name is ParserRecovery) {
       nativeMethodName = null;
       inConstructor = false;
+      declarationBuilder.resolveTypes(typeVariables, library);
       return;
     }
+
     String constructorName =
         kind == ProcedureKind.Getter || kind == ProcedureKind.Setter
             ? null
             : library.computeAndValidateConstructorName(name, charOffset);
+    if (constructorName == null &&
+        (modifiers & staticMask) == 0 &&
+        library.currentTypeParameterScopeBuilder.kind ==
+            TypeParameterScopeKind.extensionDeclaration) {
+      TypeParameterScopeBuilder extension =
+          library.currentTypeParameterScopeBuilder;
+      Map<TypeVariableBuilder, TypeBuilder> substitution;
+      if (extension.typeVariables != null) {
+        // We synthesize the names of the generated [TypeParameter]s, i.e.
+        // rename 'T' to '#T'. We cannot do it on the builders because their
+        // names are used to create the scope.
+        // TODO(johnniwinther): Handle shadowing of extension type variables.
+        List<TypeVariableBuilder> synthesizedTypeVariables = library
+            .copyTypeVariables(extension.typeVariables, declarationBuilder,
+                synthesizeTypeParameterNames: true);
+        substitution = {};
+        for (int i = 0; i < synthesizedTypeVariables.length; i++) {
+          substitution[extension.typeVariables[i]] =
+              new NamedTypeBuilder.fromTypeDeclarationBuilder(
+                  synthesizedTypeVariables[i]);
+        }
+        if (typeVariables != null) {
+          typeVariables = synthesizedTypeVariables..addAll(typeVariables);
+        } else {
+          typeVariables = synthesizedTypeVariables;
+        }
+      }
+      List<FormalParameterBuilder> synthesizedFormals = [];
+      TypeBuilder thisType = extension.extensionThisType;
+      if (substitution != null) {
+        thisType = thisType.subst(substitution);
+        declarationBuilder.addType(new UnresolvedType(thisType, -1, null));
+      }
+      synthesizedFormals.add(new FormalParameterBuilder(
+          null, finalMask, thisType, "#this", null, charOffset));
+      if (formals != null) {
+        synthesizedFormals.addAll(formals);
+      }
+      formals = synthesizedFormals;
+    }
+
+    declarationBuilder.resolveTypes(typeVariables, library);
     if (constructorName != null) {
       if (isConst && bodyKind != MethodBody.Abstract) {
         addProblem(messageConstConstructorWithBody, varFinalOrConstOffset, 5);
@@ -923,14 +1060,14 @@
     List<TypeBuilder> interfaces = popIfNotNull(implementsKeyword);
     Object mixinApplication = pop();
     int modifiers = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     int charOffset = pop();
     Object name = pop();
     List<MetadataBuilder> metadata = pop();
     checkEmpty(beginToken.charOffset);
     if (name is ParserRecovery || mixinApplication is ParserRecovery) {
-      library.endNestedDeclaration("<syntax-error>");
+      library.endNestedDeclaration(
+          TypeParameterScopeKind.namedMixinApplication, "<syntax-error>");
       return;
     }
 
@@ -952,7 +1089,7 @@
   @override
   void endTypeArguments(int count, Token beginToken, Token endToken) {
     debugEvent("TypeArguments");
-    push(const FixedNullableList<KernelTypeBuilder>().pop(stack, count) ??
+    push(const FixedNullableList<TypeBuilder>().pop(stack, count) ??
         NullValue.TypeArguments);
   }
 
@@ -969,13 +1106,17 @@
 
   @override
   void handleNonNullAssertExpression(Token bang) {
-    reportNonNullAssertExpressionNotEnabled(bang);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullAssertExpressionNotEnabled(bang);
+    }
   }
 
   @override
   void handleType(Token beginToken, Token questionMark) {
     debugEvent("Type");
-    reportErrorIfNullableType(questionMark);
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
     List<TypeBuilder> arguments = pop();
     int charOffset = pop();
     Object name = pop();
@@ -989,7 +1130,7 @@
   @override
   void endTypeList(int count) {
     debugEvent("TypeList");
-    push(const FixedNullableList<KernelNamedTypeBuilder>().pop(stack, count) ??
+    push(const FixedNullableList<NamedTypeBuilder>().pop(stack, count) ??
         new ParserRecovery(-1));
   }
 
@@ -1009,14 +1150,22 @@
   void beginFormalParameter(Token token, MemberKind kind, Token requiredToken,
       Token covariantToken, Token varFinalOrConst) {
     // TODO(danrubel): handle required token
-    reportNonNullableModifierError(requiredToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(requiredToken);
+    }
     push((covariantToken != null ? covariantMask : 0) |
         Modifier.validateVarFinalOrConst(varFinalOrConst?.lexeme));
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     debugEvent("FormalParameter");
     int charOffset = pop();
     Object name = pop();
@@ -1026,8 +1175,8 @@
     if (name is ParserRecovery) {
       push(name);
     } else {
-      push(library.addFormalParameter(
-          metadata, modifiers, type, name, thisKeyword != null, charOffset));
+      push(library.addFormalParameter(metadata, modifiers, type, name,
+          thisKeyword != null, charOffset, initializerStart));
     }
   }
 
@@ -1183,30 +1332,36 @@
 
   @override
   void beginFunctionTypeAlias(Token token) {
-    library.beginNestedDeclaration("#typedef", hasMembers: false);
+    library.beginNestedDeclaration(TypeParameterScopeKind.typedef, "#typedef",
+        hasMembers: false);
   }
 
   @override
   void beginFunctionType(Token beginToken) {
     debugEvent("beginFunctionType");
-    library.beginNestedDeclaration("#function_type", hasMembers: false);
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.functionType, "#function_type",
+        hasMembers: false);
   }
 
   @override
   void beginFunctionTypedFormalParameter(Token token) {
     debugEvent("beginFunctionTypedFormalParameter");
-    library.beginNestedDeclaration("#function_type", hasMembers: false);
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.functionType, "#function_type",
+        hasMembers: false);
   }
 
   @override
   void endFunctionType(Token functionToken, Token questionMark) {
     debugEvent("FunctionType");
-    reportErrorIfNullableType(questionMark);
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(questionMark);
+    }
     List<FormalParameterBuilder> formals = pop();
     pop(); // formals offset
     TypeBuilder returnType = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
+    List<TypeVariableBuilder> typeVariables = pop();
     push(library.addFunctionType(
         returnType, typeVariables, formals, functionToken.charOffset));
   }
@@ -1217,9 +1372,10 @@
     List<FormalParameterBuilder> formals = pop();
     int formalsOffset = pop();
     TypeBuilder returnType = pop();
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables =
-        pop();
-    reportErrorIfNullableType(question);
+    List<TypeVariableBuilder> typeVariables = pop();
+    if (!library.loader.target.enableNonNullable) {
+      reportErrorIfNullableType(question);
+    }
     push(library.addFunctionType(
         returnType, typeVariables, formals, formalsOffset));
   }
@@ -1229,7 +1385,7 @@
       Token typedefKeyword, Token equals, Token endToken) {
     debugEvent("endFunctionTypeAlias");
     String documentationComment = getDocumentationComment(typedefKeyword);
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeVariables;
+    List<TypeVariableBuilder> typeVariables;
     Object name;
     int charOffset;
     FunctionTypeBuilder functionType;
@@ -1244,10 +1400,13 @@
       // `library.addFunctionType`.
       if (name is ParserRecovery) {
         pop(); // Metadata.
-        library.endNestedDeclaration("<syntax-error>");
+        library.endNestedDeclaration(
+            TypeParameterScopeKind.typedef, "<syntax-error>");
         return;
       }
-      library.beginNestedDeclaration("#function_type", hasMembers: false);
+      library.beginNestedDeclaration(
+          TypeParameterScopeKind.functionType, "#function_type",
+          hasMembers: false);
       functionType =
           library.addFunctionType(returnType, null, formals, charOffset);
     } else {
@@ -1257,7 +1416,8 @@
       name = pop();
       if (name is ParserRecovery) {
         pop(); // Metadata.
-        library.endNestedDeclaration("<syntax-error>");
+        library.endNestedDeclaration(
+            TypeParameterScopeKind.functionType, "<syntax-error>");
         return;
       }
       if (type is FunctionTypeBuilder) {
@@ -1289,7 +1449,9 @@
       Token endToken) {
     debugEvent("endTopLevelFields");
     // TODO(danrubel): handle NNBD 'late' modifier
-    reportNonNullableModifierError(lateToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(lateToken);
+    }
     List<FieldInfo> fieldInfos = popFieldInfos(count);
     TypeBuilder type = nullIfParserRecovery(pop());
     int modifiers = (staticToken != null ? staticMask : 0) |
@@ -1308,7 +1470,9 @@
       Token varFinalOrConst, int count, Token beginToken, Token endToken) {
     debugEvent("Fields");
     // TODO(danrubel): handle NNBD 'late' modifier
-    reportNonNullableModifierError(lateToken);
+    if (!library.loader.target.enableNonNullable) {
+      reportNonNullableModifierError(lateToken);
+    }
     List<FieldInfo> fieldInfos = popFieldInfos(count);
     TypeBuilder type = pop();
     int modifiers = (staticToken != null ? staticMask : 0) |
@@ -1355,7 +1519,7 @@
     Object name = pop();
     // TODO(paulberry): type variable metadata should not be ignored.  See
     // dartbug.com/28981.
-    /* List<MetadataBuilder<KernelTypeBuilder>> metadata = */ pop();
+    /* List<MetadataBuilder<TypeBuilder>> metadata = */ pop();
     if (name is ParserRecovery) {
       push(name);
     } else {
@@ -1367,9 +1531,7 @@
   void handleTypeVariablesDefined(Token token, int count) {
     debugEvent("TypeVariablesDefined");
     assert(count > 0);
-    push(const FixedNullableList<
-                TypeVariableBuilder<KernelTypeBuilder, DartType>>()
-            .pop(stack, count) ??
+    push(const FixedNullableList<TypeVariableBuilder>().pop(stack, count) ??
         NullValue.TypeVariables);
   }
 
@@ -1378,8 +1540,7 @@
     debugEvent("endTypeVariable");
     TypeBuilder bound = nullIfParserRecovery(pop());
     // Peek to leave type parameters on top of stack.
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeParameters =
-        peek();
+    List<TypeVariableBuilder> typeParameters = peek();
     if (typeParameters != null) {
       typeParameters[index].bound = bound;
     }
@@ -1390,8 +1551,7 @@
     debugEvent("endTypeVariables");
 
     // Peek to leave type parameters on top of stack.
-    List<TypeVariableBuilder<KernelTypeBuilder, DartType>> typeParameters =
-        peek();
+    List<TypeVariableBuilder> typeParameters = peek();
 
     Map<String, TypeVariableBuilder> typeVariablesByName;
     if (typeParameters != null) {
@@ -1481,7 +1641,9 @@
   void beginFactoryMethod(
       Token lastConsumed, Token externalToken, Token constToken) {
     inConstructor = true;
-    library.beginNestedDeclaration("#factory_method", hasMembers: false);
+    library.beginNestedDeclaration(
+        TypeParameterScopeKind.factoryMethod, "#factory_method",
+        hasMembers: false);
     push((externalToken != null ? externalMask : 0) |
         (constToken != null ? constMask : 0));
   }
@@ -1501,9 +1663,13 @@
     int charOffset = pop();
     Object name = pop();
     int modifiers = pop();
+    if (nativeMethodName != null) {
+      modifiers |= externalMask;
+    }
     List<MetadataBuilder> metadata = pop();
     if (name is ParserRecovery) {
-      library.endNestedDeclaration("<syntax-error>");
+      library.endNestedDeclaration(
+          TypeParameterScopeKind.factoryMethod, "<syntax-error>");
       return;
     }
     String documentationComment = getDocumentationComment(beginToken);
@@ -1617,7 +1783,8 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody");
   }
 
@@ -1633,7 +1800,7 @@
   }
 
   @override
-  bool isIgnoredError(Code code, Token token) {
+  bool isIgnoredError(Code<dynamic> code, Token token) {
     return isIgnoredParserError(code, token) ||
         super.isIgnoredError(code, token);
   }
diff --git a/pkg/front_end/lib/src/fasta/source/scope_listener.dart b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
index 80db65e..8c6a4c1 100644
--- a/pkg/front_end/lib/src/fasta/source/scope_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/scope_listener.dart
@@ -90,7 +90,7 @@
   void beginForStatement(Token token) {
     debugEvent("beginForStatement");
     enterLoop(token.charOffset);
-    enterLocalScope("for statment");
+    enterLocalScope("for statement");
   }
 
   @override
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 3adef89..66cef5e 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
@@ -26,18 +26,15 @@
     show
         ClassBuilder,
         ConstructorReferenceBuilder,
-        Declaration,
-        KernelClassBuilder,
-        KernelFieldBuilder,
-        KernelFunctionBuilder,
-        KernelInvalidTypeBuilder,
-        KernelLibraryBuilder,
-        KernelNamedTypeBuilder,
-        KernelTypeBuilder,
-        KernelTypeVariableBuilder,
+        Builder,
+        FieldBuilder,
+        FunctionBuilder,
+        InvalidTypeBuilder,
+        NamedTypeBuilder,
         LibraryBuilder,
         MetadataBuilder,
         Scope,
+        TypeBuilder,
         TypeVariableBuilder,
         compareProcedures;
 
@@ -45,19 +42,20 @@
 
 import '../problems.dart' show unexpected, unhandled;
 
+import 'source_library_builder.dart' show SourceLibraryBuilder;
+
 Class initializeClass(
     Class cls,
     List<TypeVariableBuilder> typeVariables,
     String name,
-    KernelLibraryBuilder parent,
+    SourceLibraryBuilder parent,
     int startCharOffset,
     int charOffset,
     int charEndOffset) {
   cls ??= new Class(
       name: name,
       typeParameters:
-          KernelTypeVariableBuilder.kernelTypeParametersFromBuilders(
-              typeVariables));
+          TypeVariableBuilder.kernelTypeParametersFromBuilders(typeVariables));
   cls.fileUri ??= parent.fileUri;
   if (cls.startFileOffset == TreeNode.noOffset) {
     cls.startFileOffset = startCharOffset;
@@ -72,14 +70,14 @@
   return cls;
 }
 
-class SourceClassBuilder extends KernelClassBuilder
+class SourceClassBuilder extends ClassBuilder
     implements Comparable<SourceClassBuilder> {
   @override
   final Class actualCls;
 
   final List<ConstructorReferenceBuilder> constructorReferences;
 
-  KernelTypeBuilder mixedInType;
+  TypeBuilder mixedInType;
 
   bool isMixinDeclaration;
 
@@ -88,8 +86,9 @@
       int modifiers,
       String name,
       List<TypeVariableBuilder> typeVariables,
-      KernelTypeBuilder supertype,
-      List<KernelTypeBuilder> interfaces,
+      TypeBuilder supertype,
+      List<TypeBuilder> interfaces,
+      List<TypeBuilder> onTypes,
       Scope scope,
       Scope constructors,
       LibraryBuilder parent,
@@ -103,16 +102,16 @@
       : actualCls = initializeClass(cls, typeVariables, name, parent,
             startCharOffset, charOffset, charEndOffset),
         super(metadata, modifiers, name, typeVariables, supertype, interfaces,
-            scope, constructors, parent, charOffset);
+            onTypes, scope, constructors, parent, charOffset);
 
   @override
   Class get cls => origin.actualCls;
 
   @override
-  KernelLibraryBuilder get library => super.library;
+  SourceLibraryBuilder get library => super.library;
 
-  Class build(KernelLibraryBuilder library, LibraryBuilder coreLibrary) {
-    void buildBuilders(String name, Declaration declaration) {
+  Class build(SourceLibraryBuilder library, LibraryBuilder coreLibrary) {
+    void buildBuilders(String name, Builder declaration) {
       do {
         if (declaration.parent != this) {
           if (fileUri != declaration.parent.fileUri) {
@@ -122,18 +121,22 @@
             unexpected(fullNameForErrors, declaration.parent?.fullNameForErrors,
                 charOffset, fileUri);
           }
-        } else if (declaration is KernelFieldBuilder) {
+        } else if (declaration is FieldBuilder) {
           // TODO(ahe): It would be nice to have a common interface for the
           // build method to avoid duplicating these two cases.
           Member field = declaration.build(library);
           if (!declaration.isPatch && declaration.next == null) {
             cls.addMember(field);
           }
-        } else if (declaration is KernelFunctionBuilder) {
+        } else if (declaration is FunctionBuilder) {
           Member function = declaration.build(library);
-          function.parent = cls;
-          if (!declaration.isPatch && declaration.next == null) {
-            cls.addMember(function);
+          if (isExtension) {
+            library.target.addMember(function);
+          } else {
+            function.parent = cls;
+            if (!declaration.isPatch && declaration.next == null) {
+              cls.addMember(function);
+            }
           }
         } else {
           unhandled("${declaration.runtimeType}", "buildBuilders",
@@ -162,14 +165,13 @@
           fileUri);
       actualCls.supertype = null;
     }
-    if (actualCls.supertype == null && supertype is! KernelNamedTypeBuilder) {
+    if (actualCls.supertype == null && supertype is! NamedTypeBuilder) {
       supertype = null;
     }
     mixedInType = checkSupertype(mixedInType);
     actualCls.mixedInType =
         mixedInType?.buildMixedInType(library, charOffset, fileUri);
-    if (actualCls.mixedInType == null &&
-        mixedInType is! KernelNamedTypeBuilder) {
+    if (actualCls.mixedInType == null && mixedInType is! NamedTypeBuilder) {
       mixedInType = null;
     }
     actualCls.isMixinDeclaration = isMixinDeclaration;
@@ -188,8 +190,8 @@
       }
     }
 
-    constructors.forEach((String name, Declaration constructor) {
-      Declaration member = scopeBuilder[name];
+    constructors.forEach((String name, Builder constructor) {
+      Builder member = scopeBuilder[name];
       if (member == null) return;
       if (!member.isStatic) return;
       // TODO(ahe): Revisit these messages. It seems like the last two should
@@ -210,8 +212,8 @@
       }
     });
 
-    scope.setters.forEach((String name, Declaration setter) {
-      Declaration member = scopeBuilder[name];
+    scope.setters.forEach((String name, Builder setter) {
+      Builder member = scopeBuilder[name];
       if (member == null ||
           !(member.isField && !member.isFinal && !member.isConst ||
               member.isRegularMethod && member.isStatic && setter.isStatic)) {
@@ -232,8 +234,8 @@
       }
     });
 
-    scope.setters.forEach((String name, Declaration setter) {
-      Declaration constructor = constructorScopeBuilder[name];
+    scope.setters.forEach((String name, Builder setter) {
+      Builder constructor = constructorScopeBuilder[name];
       if (constructor == null || !setter.isStatic) return;
       addProblem(templateConflictsWithConstructor.withArguments(name),
           setter.charOffset, noLength);
@@ -245,7 +247,7 @@
     return cls;
   }
 
-  KernelTypeBuilder checkSupertype(KernelTypeBuilder supertype) {
+  TypeBuilder checkSupertype(TypeBuilder supertype) {
     if (typeVariables == null || supertype == null) return supertype;
     Message message;
     for (int i = 0; i < typeVariables.length; ++i) {
@@ -258,8 +260,8 @@
       }
     }
     if (message != null) {
-      return new KernelNamedTypeBuilder(supertype.name, null)
-        ..bind(new KernelInvalidTypeBuilder(supertype.name,
+      return new NamedTypeBuilder(supertype.name, null)
+        ..bind(new InvalidTypeBuilder(supertype.name,
             message.withLocation(fileUri, charOffset, noLength)));
     }
     return supertype;
@@ -283,31 +285,31 @@
     cls.annotations.forEach((m) => m.fileOffset = origin.cls.fileOffset);
 
     int count = 0;
-    scope.forEach((String name, Declaration declaration) {
+    scope.forEach((String name, Builder declaration) {
       count += declaration.finishPatch();
     });
-    constructors.forEach((String name, Declaration declaration) {
+    constructors.forEach((String name, Builder declaration) {
       count += declaration.finishPatch();
     });
     return count;
   }
 
-  List<Declaration> computeDirectSupertypes(ClassBuilder objectClass) {
-    final List<Declaration> result = <Declaration>[];
-    final KernelTypeBuilder supertype = this.supertype;
+  List<Builder> computeDirectSupertypes(ClassBuilder objectClass) {
+    final List<Builder> result = <Builder>[];
+    final TypeBuilder supertype = this.supertype;
     if (supertype != null) {
       result.add(supertype.declaration);
     } else if (objectClass != this) {
       result.add(objectClass);
     }
-    final List<KernelTypeBuilder> interfaces = this.interfaces;
+    final List<TypeBuilder> interfaces = this.interfaces;
     if (interfaces != null) {
       for (int i = 0; i < interfaces.length; i++) {
-        KernelTypeBuilder interface = interfaces[i];
+        TypeBuilder interface = interfaces[i];
         result.add(interface.declaration);
       }
     }
-    final KernelTypeBuilder mixedInType = this.mixedInType;
+    final TypeBuilder mixedInType = this.mixedInType;
     if (mixedInType != null) {
       result.add(mixedInType.declaration);
     }
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 77579d0..210f149 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
@@ -4,7 +4,54 @@
 
 library fasta.source_library_builder;
 
-import 'package:kernel/ast.dart' show ProcedureKind;
+import 'dart:convert' show jsonEncode;
+
+import 'package:kernel/ast.dart'
+    show
+        Arguments,
+        Class,
+        Constructor,
+        ConstructorInvocation,
+        DartType,
+        DynamicType,
+        Expression,
+        Field,
+        FunctionNode,
+        FunctionType,
+        InterfaceType,
+        Library,
+        LibraryDependency,
+        LibraryPart,
+        ListLiteral,
+        MapLiteral,
+        Member,
+        Name,
+        Procedure,
+        ProcedureKind,
+        SetLiteral,
+        StaticInvocation,
+        StringLiteral,
+        Supertype,
+        Typedef,
+        TypeParameter,
+        TypeParameterType,
+        VariableDeclaration,
+        VoidType;
+
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+
+import 'package:kernel/clone.dart' show CloneVisitor;
+
+import 'package:kernel/src/bounds_checks.dart'
+    show
+        TypeArgumentIssue,
+        findTypeArgumentIssues,
+        findTypeArgumentIssuesForInvocation,
+        getGenericTypeName;
+
+import 'package:kernel/type_algebra.dart' show substitute;
+
+import 'package:kernel/type_environment.dart' show TypeEnvironment;
 
 import '../../base/resolve_relative_uri.dart' show resolveRelativeUri;
 
@@ -14,7 +61,7 @@
     show
         ClassBuilder,
         ConstructorReferenceBuilder,
-        Declaration,
+        Builder,
         EnumConstantInfo,
         FormalParameterBuilder,
         FunctionTypeBuilder,
@@ -23,7 +70,7 @@
         MetadataBuilder,
         NameIterator,
         PrefixBuilder,
-        ProcedureBuilder,
+        FunctionBuilder,
         QualifiedName,
         Scope,
         TypeBuilder,
@@ -40,11 +87,18 @@
 
 import '../fasta_codes.dart'
     show
+        FormattedMessage,
         LocatedMessage,
         Message,
+        messageConflictsWithTypeVariableCause,
         messageConstructorWithWrongName,
         messageExpectedUri,
         messageMemberWithSameNameAsClass,
+        messageGenericFunctionTypeInBound,
+        messageGenericFunctionTypeUsedAsActualTypeArgument,
+        messageIncorrectTypeArgumentVariable,
+        messageLanguageVersionInvalidInDotPackages,
+        messageLanguageVersionMismatchInPart,
         messagePartExport,
         messagePartExportContext,
         messagePartInPart,
@@ -52,45 +106,133 @@
         messagePartOfSelf,
         messagePartOfTwoLibraries,
         messagePartOfTwoLibrariesContext,
+        messageTypeVariableDuplicatedName,
+        messageTypeVariableSameNameAsEnclosing,
         noLength,
         templateConflictsWithMember,
         templateConflictsWithSetter,
+        templateConflictsWithTypeVariable,
         templateConstructorWithWrongNameContext,
         templateCouldNotParseUri,
         templateDeferredPrefixDuplicated,
         templateDeferredPrefixDuplicatedCause,
         templateDuplicatedDeclaration,
         templateDuplicatedDeclarationCause,
+        templateDuplicatedExport,
+        templateDuplicatedExportInType,
+        templateDuplicatedImport,
+        templateDuplicatedImportInType,
+        templateExportHidesExport,
+        templateGenericFunctionTypeInferredAsActualTypeArgument,
+        templateImportHidesImport,
+        templateIncorrectTypeArgument,
+        templateIncorrectTypeArgumentInReturnType,
+        templateIncorrectTypeArgumentInferred,
+        templateIncorrectTypeArgumentQualified,
+        templateIncorrectTypeArgumentQualifiedInferred,
+        templateIntersectionTypeAsTypeArgument,
+        templateLanguageVersionTooHigh,
+        templateLoadLibraryHidesMember,
+        templateLocalDefinitionHidesExport,
+        templateLocalDefinitionHidesImport,
         templateMissingPartOf,
         templateNotAPrefixInTypeAnnotation,
         templatePartOfInLibrary,
         templatePartOfLibraryNameMismatch,
         templatePartOfUriMismatch,
         templatePartOfUseUri,
-        templatePartTwice;
+        templatePartTwice,
+        templatePatchInjectionFailed,
+        templateTypeVariableDuplicatedNameCause;
 
 import '../import.dart' show Import;
 
-import '../modifier.dart' show constMask;
+import '../kernel/kernel_builder.dart'
+    show
+        AccessErrorBuilder,
+        BuiltinTypeBuilder,
+        ClassBuilder,
+        ConstructorReferenceBuilder,
+        Builder,
+        DynamicTypeBuilder,
+        EnumConstantInfo,
+        FormalParameterBuilder,
+        FunctionTypeBuilder,
+        ImplicitFieldType,
+        InvalidTypeBuilder,
+        ConstructorBuilder,
+        EnumBuilder,
+        FunctionBuilder,
+        TypeAliasBuilder,
+        FieldBuilder,
+        MixinApplicationBuilder,
+        NamedTypeBuilder,
+        ProcedureBuilder,
+        RedirectingFactoryBuilder,
+        LibraryBuilder,
+        LoadLibraryBuilder,
+        MemberBuilder,
+        MetadataBuilder,
+        NameIterator,
+        PrefixBuilder,
+        QualifiedName,
+        Scope,
+        TypeBuilder,
+        TypeDeclarationBuilder,
+        TypeVariableBuilder,
+        UnresolvedType,
+        VoidTypeBuilder,
+        compareProcedures,
+        toKernelCombinators;
+
+import '../kernel/metadata_collector.dart';
+
+import '../kernel/type_algorithms.dart'
+    show
+        calculateBounds,
+        findGenericFunctionTypes,
+        getNonSimplicityIssuesForDeclaration,
+        getNonSimplicityIssuesForTypeVariables;
+
+import '../loader.dart' show Loader;
+
+import '../modifier.dart'
+    show
+        abstractMask,
+        constMask,
+        finalMask,
+        hasConstConstructorMask,
+        hasInitializerMask,
+        initializingFormalMask,
+        mixinDeclarationMask,
+        namedMixinApplicationMask,
+        staticMask;
+
+import '../names.dart' show indexSetName;
 
 import '../problems.dart' show unexpected, unhandled;
 
+import '../severity.dart' show Severity;
+
+import '../type_inference/type_inferrer.dart' show TypeInferrerImpl;
+
+import 'source_class_builder.dart' show SourceClassBuilder;
+
 import 'source_loader.dart' show SourceLoader;
 
-abstract class SourceLibraryBuilder<T extends TypeBuilder, R>
-    extends LibraryBuilder<T, R> {
+class SourceLibraryBuilder extends LibraryBuilder {
   static const String MALFORMED_URI_SCHEME = "org-dartlang-malformed-uri";
 
   final SourceLoader loader;
 
-  final DeclarationBuilder<T> libraryDeclaration;
+  final TypeParameterScopeBuilder libraryDeclaration;
 
   final List<ConstructorReferenceBuilder> constructorReferences =
       <ConstructorReferenceBuilder>[];
 
-  final List<SourceLibraryBuilder<T, R>> parts = <SourceLibraryBuilder<T, R>>[];
+  final List<SourceLibraryBuilder> parts = <SourceLibraryBuilder>[];
 
-  // Can I use library.parts instead? See KernelLibraryBuilder.addPart.
+  // Can I use library.parts instead? See SourceLibraryBuilder.addPart.
   final List<int> partOffsets = <int>[];
 
   final List<Import> imports = <Import>[];
@@ -101,7 +243,8 @@
 
   final Uri fileUri;
 
-  final List<List> implementationBuilders = <List<List>>[];
+  final List<ImplementationInfo> implementationBuilders =
+      <ImplementationInfo>[];
 
   final List<Object> accessors = <Object>[];
 
@@ -121,7 +264,7 @@
   /// declaration (class, method, and so on), we don't have enough information
   /// to create a builder and this object records its members and types until,
   /// for example, [addClass] is called.
-  DeclarationBuilder<T> currentDeclaration;
+  TypeParameterScopeBuilder currentTypeParameterScopeBuilder;
 
   bool canAddImplementationBuilders = false;
 
@@ -129,60 +272,159 @@
   /// an error reading its source.
   Message accessProblem;
 
-  SourceLibraryBuilder(SourceLoader loader, Uri fileUri, Scope scope)
-      : this.fromScopes(loader, fileUri, new DeclarationBuilder<T>.library(),
-            scope ?? new Scope.top());
+  final Library library;
+
+  final SourceLibraryBuilder actualOrigin;
+
+  final List<FunctionBuilder> nativeMethods = <FunctionBuilder>[];
+
+  final List<TypeVariableBuilder> boundlessTypeVariables =
+      <TypeVariableBuilder>[];
+
+  // A list of alternating forwarders and the procedures they were generated
+  // for.  Note that it may not include a forwarder-origin pair in cases when
+  // the former does not need to be updated after the body of the latter was
+  // built.
+  final List<Procedure> forwardersOrigins = <Procedure>[];
+
+  // List of types inferred in the outline.  Errors in these should be reported
+  // differently than for specified types.
+  // TODO(dmitryas):  Find a way to mark inferred types.
+  final Set<DartType> inferredTypes = new Set<DartType>.identity();
+
+  // A library to use for Names generated when compiling code in this library.
+  // This allows code generated in one library to use the private namespace of
+  // another, for example during expression compilation (debugging).
+  Library get nameOrigin => _nameOrigin ?? library;
+  final Library _nameOrigin;
+
+  /// Exports that can't be serialized.
+  ///
+  /// The key is the name of the exported member.
+  ///
+  /// If the name is `dynamic` or `void`, this library reexports the
+  /// corresponding type from `dart:core`, and the value is null.
+  ///
+  /// Otherwise, this represents an error (an ambiguous export). In this case,
+  /// the error message is the corresponding value in the map.
+  Map<String, String> unserializableExports;
+
+  List<FormalParameterBuilder> untypedInitializingFormals;
+
+  List<FieldBuilder> implicitlyTypedFields;
+
+  bool languageVersionExplicitlySet = false;
+
+  bool postponedProblemsIssued = false;
+  List<PostponedProblem> postponedProblems;
+
+  SourceLibraryBuilder.internal(SourceLoader loader, Uri fileUri, Scope scope,
+      SourceLibraryBuilder actualOrigin, Library library, Library nameOrigin)
+      : this.fromScopes(
+            loader,
+            fileUri,
+            new TypeParameterScopeBuilder.library(),
+            scope ?? new Scope.top(),
+            actualOrigin,
+            library,
+            nameOrigin);
 
   SourceLibraryBuilder.fromScopes(
-      this.loader, this.fileUri, this.libraryDeclaration, this.importScope)
-      : currentDeclaration = libraryDeclaration,
+      this.loader,
+      this.fileUri,
+      this.libraryDeclaration,
+      this.importScope,
+      this.actualOrigin,
+      this.library,
+      this._nameOrigin)
+      : currentTypeParameterScopeBuilder = libraryDeclaration,
         legacyMode = loader.target.legacyMode,
         super(
             fileUri, libraryDeclaration.toScope(importScope), new Scope.top());
 
-  Uri get uri;
+  SourceLibraryBuilder(
+      Uri uri, Uri fileUri, Loader loader, SourceLibraryBuilder actualOrigin,
+      {Scope scope, Library target, Library nameOrigin})
+      : this.internal(
+            loader,
+            fileUri,
+            scope,
+            actualOrigin,
+            target ??
+                (actualOrigin?.library ?? new Library(uri, fileUri: fileUri)),
+            nameOrigin);
 
   @override
   bool get isPart => partOfName != null || partOfUri != null;
 
-  List<UnresolvedType<T>> get types => libraryDeclaration.types;
+  List<UnresolvedType> get types => libraryDeclaration.types;
 
   @override
   bool get isSynthetic => accessProblem != null;
 
-  T addNamedType(Object name, List<T> arguments, int charOffset);
-
-  T addMixinApplication(T supertype, List<T> mixins, int charOffset);
-
-  T addType(T type, int charOffset) {
-    currentDeclaration
-        .addType(new UnresolvedType<T>(type, charOffset, fileUri));
+  TypeBuilder addType(TypeBuilder type, int charOffset) {
+    currentTypeParameterScopeBuilder
+        .addType(new UnresolvedType(type, charOffset, fileUri));
     return type;
   }
 
-  T addVoidType(int charOffset);
+  @override
+  void setLanguageVersion(int major, int minor,
+      {int offset: 0, int length: noLength, bool explicit}) {
+    if (languageVersionExplicitlySet) return;
+    if (explicit) languageVersionExplicitlySet = true;
 
-  ConstructorReferenceBuilder addConstructorReference(
-      Object name, List<T> typeArguments, String suffix, int charOffset) {
+    if (major == null || minor == null) {
+      addPostponedProblem(
+          messageLanguageVersionInvalidInDotPackages, offset, length, fileUri);
+      return;
+    }
+
+    // If no language version has been set, the default is used.
+    // If trying to set a langauge version that is higher than the "already-set"
+    // version it's an error.
+    if (major > library.languageVersionMajor ||
+        (major == library.languageVersionMajor &&
+            minor > library.languageVersionMinor)) {
+      addPostponedProblem(
+          templateLanguageVersionTooHigh.withArguments(
+              library.languageVersionMajor, library.languageVersionMinor),
+          offset,
+          length,
+          fileUri);
+      return;
+    }
+    library.setLanguageVersion(major, minor);
+  }
+
+  ConstructorReferenceBuilder addConstructorReference(Object name,
+      List<TypeBuilder> typeArguments, String suffix, int charOffset) {
     ConstructorReferenceBuilder ref = new ConstructorReferenceBuilder(
         name, typeArguments, suffix, this, charOffset);
     constructorReferences.add(ref);
     return ref;
   }
 
-  void beginNestedDeclaration(String name, {bool hasMembers: true}) {
-    currentDeclaration = currentDeclaration.createNested(name, hasMembers);
+  void beginNestedDeclaration(TypeParameterScopeKind kind, String name,
+      {bool hasMembers: true}) {
+    currentTypeParameterScopeBuilder =
+        currentTypeParameterScopeBuilder.createNested(kind, name, hasMembers);
   }
 
-  DeclarationBuilder<T> endNestedDeclaration(String name) {
+  TypeParameterScopeBuilder endNestedDeclaration(
+      TypeParameterScopeKind kind, String name) {
     assert(
-        (name?.startsWith(currentDeclaration.name) ??
-                (name == currentDeclaration.name)) ||
-            currentDeclaration.name == "operator" ||
+        currentTypeParameterScopeBuilder.kind == kind,
+        "Unexpected declaration. "
+        "Trying to end a ${currentTypeParameterScopeBuilder.kind} as a $kind.");
+    assert(
+        (name?.startsWith(currentTypeParameterScopeBuilder.name) ??
+                (name == currentTypeParameterScopeBuilder.name)) ||
+            currentTypeParameterScopeBuilder.name == "operator" ||
             identical(name, "<syntax-error>"),
-        "${name} != ${currentDeclaration.name}");
-    DeclarationBuilder<T> previous = currentDeclaration;
-    currentDeclaration = currentDeclaration.parent;
+        "${name} != ${currentTypeParameterScopeBuilder.name}");
+    TypeParameterScopeBuilder previous = currentTypeParameterScopeBuilder;
+    currentTypeParameterScopeBuilder = currentTypeParameterScopeBuilder.parent;
     return previous;
   }
 
@@ -215,7 +457,7 @@
 
   String computeAndValidateConstructorName(Object name, int charOffset,
       {isFactory: false}) {
-    String className = currentDeclaration.name;
+    String className = currentTypeParameterScopeBuilder.name;
     String prefix;
     String suffix;
     if (name is QualifiedName) {
@@ -237,9 +479,9 @@
         messageConstructorWithWrongName, charOffset, prefix.length, fileUri,
         context: [
           templateConstructorWithWrongNameContext
-              .withArguments(currentDeclaration.name)
-              .withLocation(uri, currentDeclaration.charOffset,
-                  currentDeclaration.name.length)
+              .withArguments(currentTypeParameterScopeBuilder.name)
+              .withLocation(uri, currentTypeParameterScopeBuilder.charOffset,
+                  currentTypeParameterScopeBuilder.name.length)
         ]);
 
     return suffix;
@@ -341,6 +583,11 @@
     parts.add(loader.read(resolvedUri, charOffset,
         fileUri: newFileUri, accessor: this));
     partOffsets.add(charOffset);
+
+    // TODO(ahe): [metadata] should be stored, evaluated, and added to [part].
+    LibraryPart part = new LibraryPart(<Expression>[], uri)
+      ..fileOffset = charOffset;
+    library.addPart(part);
   }
 
   void addPartOf(
@@ -359,49 +606,15 @@
     }
   }
 
-  void addClass(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      T supertype,
-      List<T> interfaces,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset,
-      int supertypeOffset);
-
-  void addNamedMixinApplication(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      int modifiers,
-      T mixinApplication,
-      List<T> interfaces,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset);
-
-  void addField(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      T type,
-      String name,
-      int charOffset,
-      int charEndOffset,
-      Token initializerToken,
-      bool hasInitializer,
-      {Token constInitializerToken});
-
   void addFields(String documentationComment, List<MetadataBuilder> metadata,
-      int modifiers, T type, List<FieldInfo> fieldInfos) {
+      int modifiers, TypeBuilder type, List<FieldInfo> fieldInfos) {
     for (FieldInfo info in fieldInfos) {
       bool isConst = modifiers & constMask != 0;
+      bool isFinal = modifiers & finalMask != 0;
+      bool potentiallyNeedInitializerInOutline = isConst || isFinal;
       Token startToken;
-      if (isConst || (type == null && !legacyMode)) {
+      if (potentiallyNeedInitializerInOutline ||
+          (type == null && !legacyMode)) {
         startToken = info.initializerToken;
       }
       if (startToken != null) {
@@ -414,91 +627,19 @@
       bool hasInitializer = info.initializerToken != null;
       addField(documentationComment, metadata, modifiers, type, info.name,
           info.charOffset, info.charEndOffset, startToken, hasInitializer,
-          constInitializerToken: isConst ? startToken : null);
+          constInitializerToken:
+              potentiallyNeedInitializerInOutline ? startToken : null);
     }
   }
 
-  void addConstructor(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      T returnType,
-      final Object name,
-      String constructorName,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName,
-      {Token beginInitializers});
-
-  void addProcedure(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      T returnType,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      ProcedureKind kind,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName,
-      {bool isTopLevel});
-
-  void addEnum(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<EnumConstantInfo> enumConstantInfos,
-      int startCharOffset,
-      int charOffset,
-      int charEndOffset);
-
-  void addFunctionTypeAlias(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      String name,
-      List<TypeVariableBuilder> typeVariables,
-      FunctionTypeBuilder type,
-      int charOffset);
-
-  FunctionTypeBuilder addFunctionType(
-      T returnType,
-      List<TypeVariableBuilder> typeVariables,
-      List<FormalParameterBuilder> formals,
-      int charOffset);
-
-  void addFactoryMethod(
-      String documentationComment,
-      List<MetadataBuilder> metadata,
-      int modifiers,
-      Object name,
-      List<FormalParameterBuilder> formals,
-      ConstructorReferenceBuilder redirectionTarget,
-      int startCharOffset,
-      int charOffset,
-      int charOpenParenOffset,
-      int charEndOffset,
-      String nativeMethodName);
-
-  FormalParameterBuilder addFormalParameter(List<MetadataBuilder> metadata,
-      int modifiers, T type, String name, bool hasThis, int charOffset);
-
-  TypeVariableBuilder addTypeVariable(String name, T bound, int charOffset);
-
-  Declaration addBuilder(String name, Declaration declaration, int charOffset) {
+  Builder addBuilder(String name, Builder declaration, int charOffset) {
     // TODO(ahe): Set the parent correctly here. Could then change the
     // implementation of MemberBuilder.isTopLevel to test explicitly for a
     // LibraryBuilder.
     if (name == null) {
       unhandled("null", "name", charOffset, fileUri);
     }
-    if (currentDeclaration == libraryDeclaration) {
+    if (currentTypeParameterScopeBuilder == libraryDeclaration) {
       if (declaration is MemberBuilder) {
         declaration.parent = this;
       } else if (declaration is TypeDeclarationBuilder) {
@@ -510,20 +651,20 @@
             "${declaration.runtimeType}", "addBuilder", charOffset, fileUri);
       }
     } else {
-      assert(currentDeclaration.parent == libraryDeclaration);
+      assert(currentTypeParameterScopeBuilder.parent == libraryDeclaration);
     }
-    bool isConstructor = declaration is ProcedureBuilder &&
+    bool isConstructor = declaration is FunctionBuilder &&
         (declaration.isConstructor || declaration.isFactory);
-    if (!isConstructor && name == currentDeclaration.name) {
+    if (!isConstructor && name == currentTypeParameterScopeBuilder.name) {
       addProblem(
           messageMemberWithSameNameAsClass, charOffset, noLength, fileUri);
     }
-    Map<String, Declaration> members = isConstructor
-        ? currentDeclaration.constructors
+    Map<String, Builder> members = isConstructor
+        ? currentTypeParameterScopeBuilder.constructors
         : (declaration.isSetter
-            ? currentDeclaration.setters
-            : currentDeclaration.members);
-    Declaration existing = members[name];
+            ? currentTypeParameterScopeBuilder.setters
+            : currentTypeParameterScopeBuilder.members);
+    Builder existing = members[name];
     if (declaration.next != null && declaration.next != existing) {
       unexpected(
           "${declaration.next.fileUri}@${declaration.next.charOffset}",
@@ -534,8 +675,8 @@
     declaration.next = existing;
     if (declaration is PrefixBuilder && existing is PrefixBuilder) {
       assert(existing.next is! PrefixBuilder);
-      Declaration deferred;
-      Declaration other;
+      Builder deferred;
+      Builder other;
       if (declaration.deferred) {
         deferred = declaration;
         other = existing;
@@ -554,7 +695,7 @@
       }
       return existing
         ..exportScope.merge(declaration.exportScope,
-            (String name, Declaration existing, Declaration member) {
+            (String name, Builder existing, Builder member) {
           return computeAmbiguousDeclaration(
               name, existing, member, charOffset);
         });
@@ -562,9 +703,9 @@
       String fullName = name;
       if (isConstructor) {
         if (name.isEmpty) {
-          fullName = currentDeclaration.name;
+          fullName = currentTypeParameterScopeBuilder.name;
         } else {
-          fullName = "${currentDeclaration.name}.$name";
+          fullName = "${currentTypeParameterScopeBuilder.name}.$name";
         }
       }
       addProblem(templateDuplicatedDeclaration.withArguments(fullName),
@@ -579,9 +720,9 @@
     return members[name] = declaration;
   }
 
-  bool isDuplicatedDeclaration(Declaration existing, Declaration other) {
+  bool isDuplicatedDeclaration(Builder existing, Builder other) {
     if (existing == null) return false;
-    Declaration next = existing.next;
+    Builder next = existing.next;
     if (next == null) {
       if (existing.isGetter && other.isSetter) return false;
       if (existing.isSetter && other.isGetter) return false;
@@ -598,26 +739,24 @@
     return true;
   }
 
-  void buildBuilder(Declaration declaration, LibraryBuilder coreLibrary);
-
-  R build(LibraryBuilder coreLibrary) {
+  Library build(LibraryBuilder coreLibrary, {bool modifyTarget}) {
     assert(implementationBuilders.isEmpty);
     canAddImplementationBuilders = true;
-    Iterator<Declaration> iterator = this.iterator;
+    Iterator<Builder> iterator = this.iterator;
     while (iterator.moveNext()) {
       buildBuilder(iterator.current, coreLibrary);
     }
-    for (List list in implementationBuilders) {
-      String name = list[0];
-      Declaration declaration = list[1];
-      int charOffset = list[2];
+    for (ImplementationInfo info in implementationBuilders) {
+      String name = info.name;
+      Builder declaration = info.declaration;
+      int charOffset = info.charOffset;
       addBuilder(name, declaration, charOffset);
       buildBuilder(declaration, coreLibrary);
     }
     canAddImplementationBuilders = false;
 
-    scope.setters.forEach((String name, Declaration setter) {
-      Declaration member = scopeBuilder[name];
+    scope.setters.forEach((String name, Builder setter) {
+      Builder member = scopeBuilder[name];
       if (member == null ||
           !member.isField ||
           member.isFinal ||
@@ -631,17 +770,36 @@
           member.charOffset, noLength, fileUri);
     });
 
-    return null;
+    if (modifyTarget == false) return library;
+
+    library.isSynthetic = isSynthetic;
+    addDependencies(library, new Set<SourceLibraryBuilder>());
+
+    loader.target.metadataCollector
+        ?.setDocumentationComment(library, documentationComment);
+
+    library.name = name;
+    library.procedures.sort(compareProcedures);
+
+    if (unserializableExports != null) {
+      library.addMember(new Field(new Name("_exports#", library),
+          initializer: new StringLiteral(jsonEncode(unserializableExports)),
+          isStatic: true,
+          isConst: true));
+    }
+
+    return library;
   }
 
   /// Used to add implementation builder during the call to [build] above.
   /// Currently, only anonymous mixins are using implementation builders (see
-  /// [KernelMixinApplicationBuilder]
+  /// [MixinApplicationBuilder]
   /// (../kernel/kernel_mixin_application_builder.dart)).
   void addImplementationBuilder(
-      String name, Declaration declaration, int charOffset) {
+      String name, Builder declaration, int charOffset) {
     assert(canAddImplementationBuilders, "$uri");
-    implementationBuilders.add([name, declaration, charOffset]);
+    implementationBuilders
+        .add(new ImplementationInfo(name, declaration, charOffset));
   }
 
   void validatePart(SourceLibraryBuilder library, Set<Uri> usedParts) {
@@ -676,7 +834,7 @@
   void includeParts(Set<Uri> usedParts) {
     Set<Uri> seenParts = new Set<Uri>();
     for (int i = 0; i < parts.length; i++) {
-      SourceLibraryBuilder<T, R> part = parts[i];
+      SourceLibraryBuilder part = parts[i];
       int partOffset = partOffsets[i];
       if (part == this) {
         addProblem(messagePartOfSelf, -1, noLength, fileUri);
@@ -705,7 +863,7 @@
   }
 
   bool includePart(
-      SourceLibraryBuilder<T, R> part, Set<Uri> usedParts, int partOffset) {
+      SourceLibraryBuilder part, Set<Uri> usedParts, int partOffset) {
     if (part.partOfUri != null) {
       if (uriIsValid(part.partOfUri) && part.partOfUri != uri) {
         // This is an error, but the part is not removed from the list of parts,
@@ -752,14 +910,29 @@
       }
       return false;
     }
+
+    // Language versions have to match.
+    if ((this.languageVersionExplicitlySet !=
+            part.languageVersionExplicitlySet) ||
+        (this.library.languageVersionMajor !=
+                part.library.languageVersionMajor ||
+            this.library.languageVersionMinor !=
+                part.library.languageVersionMinor)) {
+      // This is an error, but the part is not removed from the list of
+      // parts, so that metadata annotations can be associated with it.
+      addProblem(
+          messageLanguageVersionMismatchInPart, partOffset, noLength, fileUri);
+      return false;
+    }
+
     part.validatePart(this, usedParts);
     NameIterator partDeclarations = part.nameIterator;
     while (partDeclarations.moveNext()) {
       String name = partDeclarations.name;
-      Declaration declaration = partDeclarations.current;
+      Builder declaration = partDeclarations.current;
 
       if (declaration.next != null) {
-        List<Declaration> duplicated = <Declaration>[];
+        List<Builder> duplicated = <Builder>[];
         while (declaration.next != null) {
           duplicated.add(declaration);
           partDeclarations.moveNext();
@@ -787,7 +960,7 @@
         // part library still keeps these declarations in its scope so that
         // DietListener can find them.
         for (int i = duplicated.length; i > 0; i--) {
-          Declaration declaration = duplicated[i - 1];
+          Builder declaration = duplicated[i - 1];
           addBuilder(name, declaration, declaration.charOffset);
         }
       } else {
@@ -799,6 +972,24 @@
     part.partOfLibrary = this;
     part.scope.becomePartOf(scope);
     // TODO(ahe): Include metadata from part?
+
+    nativeMethods.addAll(part.nativeMethods);
+    boundlessTypeVariables.addAll(part.boundlessTypeVariables);
+    // Check that the targets are different. This is not normally a problem
+    // but is for patch files.
+    if (target != part.target && part.target.problemsAsJson != null) {
+      target.problemsAsJson ??= <String>[];
+      target.problemsAsJson.addAll(part.target.problemsAsJson);
+    }
+    List<FieldBuilder> partImplicitlyTypedFields =
+        part.takeImplicitlyTypedFields();
+    if (partImplicitlyTypedFields != null) {
+      if (implicitlyTypedFields == null) {
+        implicitlyTypedFields = partImplicitlyTypedFields;
+      } else {
+        implicitlyTypedFields.addAll(partImplicitlyTypedFields);
+      }
+    }
     return true;
   }
 
@@ -825,18 +1016,43 @@
       import.finalizeImports(this);
     }
     if (!explicitCoreImport) {
-      loader.coreLibrary.exportScope.forEach((String name, Declaration member) {
+      loader.coreLibrary.exportScope.forEach((String name, Builder member) {
         addToScope(name, member, -1, true);
       });
     }
+
+    exportScope.forEach((String name, Builder member) {
+      if (member.parent != this) {
+        switch (name) {
+          case "dynamic":
+          case "void":
+            unserializableExports ??= <String, String>{};
+            unserializableExports[name] = null;
+            break;
+
+          default:
+            if (member is InvalidTypeBuilder) {
+              unserializableExports ??= <String, String>{};
+              unserializableExports[name] = member.message.message;
+            } else {
+              // Eventually (in #buildBuilder) members aren't added to the
+              // library if the have 'next' pointers, so don't add them as
+              // additionalExports either. Add the last one only (the one that
+              // will eventually be added to the library).
+              Builder memberLast = member;
+              while (memberLast.next != null) memberLast = memberLast.next;
+              library.additionalExports.add(memberLast.target.reference);
+            }
+        }
+      }
+    });
   }
 
   @override
-  void addToScope(
-      String name, Declaration member, int charOffset, bool isImport) {
-    Map<String, Declaration> map =
+  void addToScope(String name, Builder member, int charOffset, bool isImport) {
+    Map<String, Builder> map =
         member.isSetter ? importScope.setters : importScope.local;
-    Declaration existing = map[name];
+    Builder existing = map[name];
     if (existing != null) {
       if (existing != member) {
         map[name] = computeAmbiguousDeclaration(
@@ -852,7 +1068,7 @@
   /// when done.
   int resolveTypes() {
     int typeCount = types.length;
-    for (UnresolvedType<T> t in types) {
+    for (UnresolvedType t in types) {
       t.resolveIn(scope, this);
       if (!loader.target.legacyMode) {
         t.checkType(this);
@@ -867,16 +1083,13 @@
   @override
   int resolveConstructors(_) {
     int count = 0;
-    Iterator<Declaration> iterator = this.iterator;
+    Iterator<Builder> iterator = this.iterator;
     while (iterator.moveNext()) {
       count += iterator.current.resolveConstructors(this);
     }
     return count;
   }
 
-  List<TypeVariableBuilder> copyTypeVariables(
-      List<TypeVariableBuilder> original, DeclarationBuilder declaration);
-
   @override
   String get fullNameForErrors {
     // TODO(ahe): Consider if we should use relativizeUri here. The downside to
@@ -914,45 +1127,1801 @@
     }
   }
 
-  void checkBoundsInOutline(covariant typeEnvironment);
+  @override
+  SourceLibraryBuilder get origin => actualOrigin ?? this;
 
-  int finalizeInitializingFormals();
+  @override
+  Library get target => library;
+
+  Uri get uri => library.importUri;
+
+  void addSyntheticDeclarationOfDynamic() {
+    addBuilder(
+        "dynamic", new DynamicTypeBuilder(const DynamicType(), this, -1), -1);
+  }
+
+  TypeBuilder addNamedType(
+      Object name, List<TypeBuilder> arguments, int charOffset) {
+    return addType(new NamedTypeBuilder(name, arguments), charOffset);
+  }
+
+  TypeBuilder addMixinApplication(
+      TypeBuilder supertype, List<TypeBuilder> mixins, int charOffset) {
+    return addType(new MixinApplicationBuilder(supertype, mixins), charOffset);
+  }
+
+  TypeBuilder addVoidType(int charOffset) {
+    return addNamedType("void", null, charOffset)
+      ..bind(new VoidTypeBuilder(const VoidType(), this, charOffset));
+  }
+
+  /// Add a problem that might not be reported immediately.
+  ///
+  /// Problems will be issued after source information has been added.
+  /// Once the problems has been issued, adding a new "postponed" problem will
+  /// be issued immediately.
+  void addPostponedProblem(
+      Message message, int charOffset, int length, Uri fileUri) {
+    if (postponedProblemsIssued) {
+      addProblem(message, charOffset, length, fileUri);
+    } else {
+      postponedProblems ??= <PostponedProblem>[];
+      postponedProblems
+          .add(new PostponedProblem(message, charOffset, length, fileUri));
+    }
+  }
+
+  void issuePostponedProblems() {
+    postponedProblemsIssued = true;
+    if (postponedProblems == null) return;
+    for (int i = 0; i < postponedProblems.length; ++i) {
+      PostponedProblem postponedProblem = postponedProblems[i];
+      addProblem(postponedProblem.message, postponedProblem.charOffset,
+          postponedProblem.length, postponedProblem.fileUri);
+    }
+    postponedProblems = null;
+  }
+
+  @override
+  FormattedMessage addProblem(
+      Message message, int charOffset, int length, Uri fileUri,
+      {bool wasHandled: false,
+      List<LocatedMessage> context,
+      Severity severity,
+      bool problemOnLibrary: false}) {
+    FormattedMessage formattedMessage = super.addProblem(
+        message, charOffset, length, fileUri,
+        wasHandled: wasHandled,
+        context: context,
+        severity: severity,
+        problemOnLibrary: true);
+    if (formattedMessage != null) {
+      target.problemsAsJson ??= <String>[];
+      target.problemsAsJson.add(formattedMessage.toJsonString());
+    }
+    return formattedMessage;
+  }
+
+  void addClass(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      String className,
+      List<TypeVariableBuilder> typeVariables,
+      TypeBuilder supertype,
+      List<TypeBuilder> interfaces,
+      int startOffset,
+      int nameOffset,
+      int endOffset,
+      int supertypeOffset) {
+    _addClass(
+        TypeParameterScopeKind.classDeclaration,
+        documentationComment,
+        metadata,
+        modifiers,
+        className,
+        typeVariables,
+        supertype,
+        interfaces,
+        startOffset,
+        nameOffset,
+        endOffset,
+        supertypeOffset);
+  }
+
+  void addMixinDeclaration(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      String className,
+      List<TypeVariableBuilder> typeVariables,
+      TypeBuilder supertype,
+      List<TypeBuilder> interfaces,
+      int startOffset,
+      int nameOffset,
+      int endOffset,
+      int supertypeOffset) {
+    _addClass(
+        TypeParameterScopeKind.mixinDeclaration,
+        documentationComment,
+        metadata,
+        modifiers,
+        className,
+        typeVariables,
+        supertype,
+        interfaces,
+        startOffset,
+        nameOffset,
+        endOffset,
+        supertypeOffset);
+  }
+
+  void _addClass(
+      TypeParameterScopeKind kind,
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      String className,
+      List<TypeVariableBuilder> typeVariables,
+      TypeBuilder supertype,
+      List<TypeBuilder> interfaces,
+      int startOffset,
+      int nameOffset,
+      int endOffset,
+      int supertypeOffset) {
+    // Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
+    TypeParameterScopeBuilder declaration =
+        endNestedDeclaration(kind, className)
+          ..resolveTypes(typeVariables, this);
+    assert(declaration.parent == libraryDeclaration);
+    Map<String, MemberBuilder> members = declaration.members;
+    Map<String, MemberBuilder> constructors = declaration.constructors;
+    Map<String, MemberBuilder> setters = declaration.setters;
+
+    Scope classScope = new Scope(members, setters,
+        scope.withTypeVariables(typeVariables), "class $className",
+        isModifiable: false);
+
+    // When looking up a constructor, we don't consider type variables or the
+    // library scope.
+    Scope constructorScope =
+        new Scope(constructors, null, null, className, isModifiable: false);
+    bool isMixinDeclaration = false;
+    if (modifiers & mixinDeclarationMask != 0) {
+      isMixinDeclaration = true;
+      modifiers = (modifiers & ~mixinDeclarationMask) | abstractMask;
+    }
+    if (declaration.hasConstConstructor) {
+      modifiers |= hasConstConstructorMask;
+    }
+    ClassBuilder cls = new SourceClassBuilder(
+        metadata,
+        modifiers,
+        className,
+        typeVariables,
+        applyMixins(supertype, startOffset, nameOffset, endOffset, className,
+            isMixinDeclaration,
+            typeVariables: typeVariables),
+        interfaces,
+        // TODO(johnniwinther): Add the `on` clause types of a mixin declaration
+        // here.
+        null,
+        classScope,
+        constructorScope,
+        this,
+        new List<ConstructorReferenceBuilder>.from(constructorReferences),
+        startOffset,
+        nameOffset,
+        endOffset,
+        isMixinDeclaration: isMixinDeclaration);
+    loader.target.metadataCollector
+        ?.setDocumentationComment(cls.target, documentationComment);
+
+    constructorReferences.clear();
+    Map<String, TypeVariableBuilder> typeVariablesByName =
+        checkTypeVariables(typeVariables, cls);
+    void setParent(String name, MemberBuilder member) {
+      while (member != null) {
+        member.parent = cls;
+        member = member.next;
+      }
+    }
+
+    void setParentAndCheckConflicts(String name, MemberBuilder member) {
+      if (typeVariablesByName != null) {
+        TypeVariableBuilder tv = typeVariablesByName[name];
+        if (tv != null) {
+          cls.addProblem(templateConflictsWithTypeVariable.withArguments(name),
+              member.charOffset, name.length,
+              context: [
+                messageConflictsWithTypeVariableCause.withLocation(
+                    tv.fileUri, tv.charOffset, name.length)
+              ]);
+        }
+      }
+      setParent(name, member);
+    }
+
+    members.forEach(setParentAndCheckConflicts);
+    constructors.forEach(setParentAndCheckConflicts);
+    setters.forEach(setParentAndCheckConflicts);
+    addBuilder(className, cls, nameOffset);
+  }
+
+  Map<String, TypeVariableBuilder> checkTypeVariables(
+      List<TypeVariableBuilder> typeVariables, Builder owner) {
+    if (typeVariables?.isEmpty ?? true) return null;
+    Map<String, TypeVariableBuilder> typeVariablesByName =
+        <String, TypeVariableBuilder>{};
+    for (TypeVariableBuilder tv in typeVariables) {
+      TypeVariableBuilder existing = typeVariablesByName[tv.name];
+      if (existing != null) {
+        addProblem(messageTypeVariableDuplicatedName, tv.charOffset,
+            tv.name.length, fileUri,
+            context: [
+              templateTypeVariableDuplicatedNameCause
+                  .withArguments(tv.name)
+                  .withLocation(
+                      fileUri, existing.charOffset, existing.name.length)
+            ]);
+      } else {
+        typeVariablesByName[tv.name] = tv;
+        if (owner is ClassBuilder) {
+          // Only classes and type variables can't have the same name. See
+          // [#29555](https://github.com/dart-lang/sdk/issues/29555).
+          if (tv.name == owner.name) {
+            addProblem(messageTypeVariableSameNameAsEnclosing, tv.charOffset,
+                tv.name.length, fileUri);
+          }
+        }
+      }
+    }
+    return typeVariablesByName;
+  }
+
+  void addExtensionDeclaration(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      String extensionName,
+      List<TypeVariableBuilder> typeVariables,
+      TypeBuilder type,
+      int startOffset,
+      int nameOffset,
+      int endOffset) {
+    // Nested declaration began in `OutlineBuilder.beginExtensionDeclaration`.
+    TypeParameterScopeBuilder declaration = endNestedDeclaration(
+        TypeParameterScopeKind.extensionDeclaration, extensionName)
+      ..resolveTypes(typeVariables, this);
+    assert(declaration.parent == libraryDeclaration);
+    Map<String, MemberBuilder> members = declaration.members;
+    Map<String, MemberBuilder> constructors = declaration.constructors;
+    Map<String, MemberBuilder> setters = declaration.setters;
+
+    Scope classScope = new Scope(members, setters,
+        scope.withTypeVariables(typeVariables), "extension $extensionName",
+        isModifiable: false);
+
+    // When looking up a constructor, we don't consider type variables or the
+    // library scope.
+    Scope constructorScope =
+        new Scope(constructors, null, null, extensionName, isModifiable: false);
+    bool isMixinDeclaration = false;
+    if (modifiers & mixinDeclarationMask != 0) {
+      isMixinDeclaration = true;
+      modifiers = (modifiers & ~mixinDeclarationMask) | abstractMask;
+    }
+    if (declaration.hasConstConstructor) {
+      modifiers |= hasConstConstructorMask;
+    }
+    ClassBuilder cls = new SourceClassBuilder(
+        metadata,
+        modifiers,
+        extensionName,
+        typeVariables,
+        null, // No explicit supertype.
+        null, // No implemented interfaces.
+        [type],
+        classScope,
+        constructorScope,
+        this,
+        new List<ConstructorReferenceBuilder>.from(constructorReferences),
+        startOffset,
+        nameOffset,
+        endOffset,
+        isMixinDeclaration: isMixinDeclaration);
+    loader.target.metadataCollector
+        ?.setDocumentationComment(cls.target, documentationComment);
+
+    constructorReferences.clear();
+    Map<String, TypeVariableBuilder> typeVariablesByName =
+        checkTypeVariables(typeVariables, cls);
+    void setParent(String name, MemberBuilder member) {
+      while (member != null) {
+        member.parent = cls;
+        member = member.next;
+      }
+    }
+
+    void setParentAndCheckConflicts(String name, MemberBuilder member) {
+      if (typeVariablesByName != null) {
+        TypeVariableBuilder tv = typeVariablesByName[name];
+        if (tv != null) {
+          cls.addProblem(templateConflictsWithTypeVariable.withArguments(name),
+              member.charOffset, name.length,
+              context: [
+                messageConflictsWithTypeVariableCause.withLocation(
+                    tv.fileUri, tv.charOffset, name.length)
+              ]);
+        }
+      }
+      setParent(name, member);
+    }
+
+    members.forEach(setParentAndCheckConflicts);
+    constructors.forEach(setParentAndCheckConflicts);
+    setters.forEach(setParentAndCheckConflicts);
+    addBuilder(extensionName, cls, nameOffset);
+  }
+
+  TypeBuilder applyMixins(TypeBuilder type, int startCharOffset, int charOffset,
+      int charEndOffset, String subclassName, bool isMixinDeclaration,
+      {String documentationComment,
+      List<MetadataBuilder> metadata,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      int modifiers,
+      List<TypeBuilder> interfaces}) {
+    if (name == null) {
+      // The following parameters should only be used when building a named
+      // mixin application.
+      if (documentationComment != null) {
+        unhandled("documentationComment", "unnamed mixin application",
+            charOffset, fileUri);
+      } else if (metadata != null) {
+        unhandled("metadata", "unnamed mixin application", charOffset, fileUri);
+      } else if (interfaces != null) {
+        unhandled(
+            "interfaces", "unnamed mixin application", charOffset, fileUri);
+      }
+    }
+    if (type is MixinApplicationBuilder) {
+      // Documentation below assumes the given mixin application is in one of
+      // these forms:
+      //
+      //     class C extends S with M1, M2, M3;
+      //     class Named = S with M1, M2, M3;
+      //
+      // When we refer to the subclass, we mean `C` or `Named`.
+
+      /// The current supertype.
+      ///
+      /// Starts out having the value `S` and on each iteration of the loop
+      /// below, it will take on the value corresponding to:
+      ///
+      /// 1. `S with M1`.
+      /// 2. `(S with M1) with M2`.
+      /// 3. `((S with M1) with M2) with M3`.
+      TypeBuilder supertype = type.supertype ?? loader.target.objectType;
+
+      /// The variable part of the mixin application's synthetic name. It
+      /// starts out as the name of the superclass, but is only used after it
+      /// has been combined with the name of the current mixin. In the examples
+      /// from above, it will take these values:
+      ///
+      /// 1. `S&M1`
+      /// 2. `S&M1&M2`
+      /// 3. `S&M1&M2&M3`.
+      ///
+      /// The full name of the mixin application is obtained by prepending the
+      /// name of the subclass (`C` or `Named` in the above examples) to the
+      /// running name. For the example `C`, that leads to these full names:
+      ///
+      /// 1. `_C&S&M1`
+      /// 2. `_C&S&M1&M2`
+      /// 3. `_C&S&M1&M2&M3`.
+      ///
+      /// For a named mixin application, the last name has been given by the
+      /// programmer, so for the example `Named` we see these full names:
+      ///
+      /// 1. `_Named&S&M1`
+      /// 2. `_Named&S&M1&M2`
+      /// 3. `Named`.
+      String runningName = extractName(supertype.name);
+
+      /// True when we're building a named mixin application. Notice that for
+      /// the `Named` example above, this is only true on the last
+      /// iteration because only the full mixin application is named.
+      bool isNamedMixinApplication;
+
+      /// The names of the type variables of the subclass.
+      Set<String> typeVariableNames;
+      if (typeVariables != null) {
+        typeVariableNames = new Set<String>();
+        for (TypeVariableBuilder typeVariable in typeVariables) {
+          typeVariableNames.add(typeVariable.name);
+        }
+      }
+
+      /// Helper function that returns `true` if a type variable with a name
+      /// from [typeVariableNames] is referenced in [type].
+      bool usesTypeVariables(TypeBuilder type) {
+        if (type is NamedTypeBuilder) {
+          if (type.declaration is TypeVariableBuilder) {
+            return typeVariableNames.contains(type.declaration.name);
+          }
+
+          List<TypeBuilder> typeArguments = type.arguments;
+          if (typeArguments != null && typeVariables != null) {
+            for (TypeBuilder argument in typeArguments) {
+              if (usesTypeVariables(argument)) {
+                return true;
+              }
+            }
+          }
+        } else if (type is FunctionTypeBuilder) {
+          if (type.formals != null) {
+            for (FormalParameterBuilder formal in type.formals) {
+              if (usesTypeVariables(formal.type)) {
+                return true;
+              }
+            }
+          }
+          return usesTypeVariables(type.returnType);
+        }
+        return false;
+      }
+
+      /// Iterate over the mixins from left to right. At the end of each
+      /// iteration, a new [supertype] is computed that is the mixin
+      /// application of [supertype] with the current mixin.
+      for (int i = 0; i < type.mixins.length; i++) {
+        TypeBuilder mixin = type.mixins[i];
+        isNamedMixinApplication = name != null && mixin == type.mixins.last;
+        bool isGeneric = false;
+        if (!isNamedMixinApplication) {
+          if (supertype is NamedTypeBuilder) {
+            isGeneric = isGeneric || usesTypeVariables(supertype);
+          }
+          if (mixin is NamedTypeBuilder) {
+            runningName += "&${extractName(mixin.name)}";
+            isGeneric = isGeneric || usesTypeVariables(mixin);
+          }
+        }
+        String fullname =
+            isNamedMixinApplication ? name : "_$subclassName&$runningName";
+        List<TypeVariableBuilder> applicationTypeVariables;
+        List<TypeBuilder> applicationTypeArguments;
+        if (isNamedMixinApplication) {
+          // If this is a named mixin application, it must be given all the
+          // declarated type variables.
+          applicationTypeVariables = typeVariables;
+        } else {
+          // Otherwise, we pass the fresh type variables to the mixin
+          // application in the same order as they're declared on the subclass.
+          if (isGeneric) {
+            this.beginNestedDeclaration(
+                TypeParameterScopeKind.unnamedMixinApplication,
+                "mixin application");
+
+            applicationTypeVariables = copyTypeVariables(
+                typeVariables, currentTypeParameterScopeBuilder);
+
+            List<TypeBuilder> newTypes = <TypeBuilder>[];
+            if (supertype is NamedTypeBuilder && supertype.arguments != null) {
+              for (int i = 0; i < supertype.arguments.length; ++i) {
+                supertype.arguments[i] = supertype.arguments[i].clone(newTypes);
+              }
+            }
+            if (mixin is NamedTypeBuilder && mixin.arguments != null) {
+              for (int i = 0; i < mixin.arguments.length; ++i) {
+                mixin.arguments[i] = mixin.arguments[i].clone(newTypes);
+              }
+            }
+            for (TypeBuilder newType in newTypes) {
+              currentTypeParameterScopeBuilder
+                  .addType(new UnresolvedType(newType, -1, null));
+            }
+
+            TypeParameterScopeBuilder mixinDeclaration = this
+                .endNestedDeclaration(
+                    TypeParameterScopeKind.unnamedMixinApplication,
+                    "mixin application");
+            mixinDeclaration.resolveTypes(applicationTypeVariables, this);
+
+            applicationTypeArguments = <TypeBuilder>[];
+            for (TypeVariableBuilder typeVariable in typeVariables) {
+              applicationTypeArguments
+                  .add(addNamedType(typeVariable.name, null, charOffset)..bind(
+                      // The type variable types passed as arguments to the
+                      // generic class representing the anonymous mixin
+                      // application should refer back to the type variables of
+                      // the class that extend the anonymous mixin application.
+                      typeVariable));
+            }
+          }
+        }
+        final int computedStartCharOffset =
+            (isNamedMixinApplication ? metadata : null) == null
+                ? startCharOffset
+                : metadata.first.charOffset;
+        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(<String, MemberBuilder>{}, <String, MemberBuilder>{},
+                scope.withTypeVariables(typeVariables),
+                "mixin $fullname ", isModifiable: false),
+            new Scope(<String, MemberBuilder>{}, null, null, fullname,
+                isModifiable: false),
+            this,
+            <ConstructorReferenceBuilder>[],
+            computedStartCharOffset,
+            charOffset,
+            charEndOffset,
+            mixedInType: isMixinDeclaration ? null : mixin);
+        if (isNamedMixinApplication) {
+          loader.target.metadataCollector?.setDocumentationComment(
+              application.target, documentationComment);
+        }
+        // TODO(ahe, kmillikin): Should always be true?
+        // pkg/analyzer/test/src/summary/resynthesize_kernel_test.dart can't
+        // handle that :(
+        application.cls.isAnonymousMixin = !isNamedMixinApplication;
+        addBuilder(fullname, application, charOffset);
+        supertype =
+            addNamedType(fullname, applicationTypeArguments, charOffset);
+      }
+      return supertype;
+    } else {
+      return type;
+    }
+  }
+
+  void addNamedMixinApplication(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      int modifiers,
+      TypeBuilder mixinApplication,
+      List<TypeBuilder> interfaces,
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset) {
+    // Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
+    endNestedDeclaration(TypeParameterScopeKind.namedMixinApplication, name)
+        .resolveTypes(typeVariables, this);
+    NamedTypeBuilder supertype = applyMixins(mixinApplication, startCharOffset,
+        charOffset, charEndOffset, name, false,
+        documentationComment: documentationComment,
+        metadata: metadata,
+        name: name,
+        typeVariables: typeVariables,
+        modifiers: modifiers,
+        interfaces: interfaces);
+    checkTypeVariables(typeVariables, supertype.declaration);
+  }
+
+  void addField(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder type,
+      String name,
+      int charOffset,
+      int charEndOffset,
+      Token initializerToken,
+      bool hasInitializer,
+      {Token constInitializerToken}) {
+    if (hasInitializer) {
+      modifiers |= hasInitializerMask;
+    }
+    FieldBuilder field = new FieldBuilder(
+        metadata, type, name, modifiers, this, charOffset, charEndOffset);
+    field.constInitializerToken = constInitializerToken;
+    addBuilder(name, field, charOffset);
+    if (!legacyMode && type == null && initializerToken != null) {
+      field.target.type = new ImplicitFieldType(field, initializerToken);
+      (implicitlyTypedFields ??= <FieldBuilder>[]).add(field);
+    }
+    loader.target.metadataCollector
+        ?.setDocumentationComment(field.target, documentationComment);
+  }
+
+  void addConstructor(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder returnType,
+      final Object name,
+      String constructorName,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      int startCharOffset,
+      int charOffset,
+      int charOpenParenOffset,
+      int charEndOffset,
+      String nativeMethodName,
+      {Token beginInitializers}) {
+    MetadataCollector metadataCollector = loader.target.metadataCollector;
+    ConstructorBuilder procedure = new ConstructorBuilder(
+        metadata,
+        modifiers & ~abstractMask,
+        returnType,
+        constructorName,
+        typeVariables,
+        formals,
+        this,
+        startCharOffset,
+        charOffset,
+        charOpenParenOffset,
+        charEndOffset,
+        nativeMethodName);
+    metadataCollector?.setDocumentationComment(
+        procedure.target, documentationComment);
+    metadataCollector?.setConstructorNameOffset(procedure.target, name);
+    checkTypeVariables(typeVariables, procedure);
+    addBuilder(constructorName, procedure, charOffset);
+    if (nativeMethodName != null) {
+      addNativeMethod(procedure);
+    }
+    if (procedure.isConst) {
+      currentTypeParameterScopeBuilder?.hasConstConstructor = true;
+      // const constructors will have their initializers compiled and written
+      // into the outline.
+      procedure.beginInitializers = beginInitializers ?? Token.eof(-1);
+    }
+  }
+
+  void addProcedure(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder returnType,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      ProcedureKind kind,
+      int startCharOffset,
+      int charOffset,
+      int charOpenParenOffset,
+      int charEndOffset,
+      String nativeMethodName,
+      {bool isTopLevel}) {
+    MetadataCollector metadataCollector = loader.target.metadataCollector;
+    if (returnType == null) {
+      if (kind == ProcedureKind.Operator &&
+          identical(name, indexSetName.name)) {
+        returnType = addVoidType(charOffset);
+      } else if (kind == ProcedureKind.Setter) {
+        returnType = addVoidType(charOffset);
+      }
+    }
+    FunctionBuilder procedure = new ProcedureBuilder(
+        metadata,
+        modifiers,
+        returnType,
+        name,
+        typeVariables,
+        formals,
+        kind,
+        this,
+        startCharOffset,
+        charOffset,
+        charOpenParenOffset,
+        charEndOffset,
+        nativeMethodName);
+    metadataCollector?.setDocumentationComment(
+        procedure.target, documentationComment);
+    checkTypeVariables(typeVariables, procedure);
+    addBuilder(name, procedure, charOffset);
+    if (nativeMethodName != null) {
+      addNativeMethod(procedure);
+    }
+  }
+
+  void addFactoryMethod(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      Object name,
+      List<FormalParameterBuilder> formals,
+      ConstructorReferenceBuilder redirectionTarget,
+      int startCharOffset,
+      int charOffset,
+      int charOpenParenOffset,
+      int charEndOffset,
+      String nativeMethodName) {
+    TypeBuilder returnType = addNamedType(
+        currentTypeParameterScopeBuilder.parent.name,
+        <TypeBuilder>[],
+        charOffset);
+    // Nested declaration began in `OutlineBuilder.beginFactoryMethod`.
+    TypeParameterScopeBuilder factoryDeclaration = endNestedDeclaration(
+        TypeParameterScopeKind.factoryMethod, "#factory_method");
+
+    // Prepare the simple procedure name.
+    String procedureName;
+    String constructorName =
+        computeAndValidateConstructorName(name, charOffset, isFactory: true);
+    if (constructorName != null) {
+      procedureName = constructorName;
+    } else {
+      procedureName = name;
+    }
+
+    ProcedureBuilder procedure;
+    if (redirectionTarget != null) {
+      procedure = new RedirectingFactoryBuilder(
+          metadata,
+          staticMask | modifiers,
+          returnType,
+          procedureName,
+          copyTypeVariables(
+              currentTypeParameterScopeBuilder.typeVariables ??
+                  const <TypeVariableBuilder>[],
+              factoryDeclaration),
+          formals,
+          this,
+          startCharOffset,
+          charOffset,
+          charOpenParenOffset,
+          charEndOffset,
+          nativeMethodName,
+          redirectionTarget);
+    } else {
+      procedure = new ProcedureBuilder(
+          metadata,
+          staticMask | modifiers,
+          returnType,
+          procedureName,
+          copyTypeVariables(
+              currentTypeParameterScopeBuilder.typeVariables ??
+                  const <TypeVariableBuilder>[],
+              factoryDeclaration),
+          formals,
+          ProcedureKind.Factory,
+          this,
+          startCharOffset,
+          charOffset,
+          charOpenParenOffset,
+          charEndOffset,
+          nativeMethodName);
+    }
+
+    var metadataCollector = loader.target.metadataCollector;
+    metadataCollector?.setDocumentationComment(
+        procedure.target, documentationComment);
+    metadataCollector?.setConstructorNameOffset(procedure.target, name);
+
+    TypeParameterScopeBuilder savedDeclaration =
+        currentTypeParameterScopeBuilder;
+    currentTypeParameterScopeBuilder = factoryDeclaration;
+    for (TypeVariableBuilder tv in procedure.typeVariables) {
+      NamedTypeBuilder t = procedure.returnType;
+      t.arguments.add(addNamedType(tv.name, null, procedure.charOffset));
+    }
+    currentTypeParameterScopeBuilder = savedDeclaration;
+
+    factoryDeclaration.resolveTypes(procedure.typeVariables, this);
+    addBuilder(procedureName, procedure, charOffset);
+    if (nativeMethodName != null) {
+      addNativeMethod(procedure);
+    }
+  }
+
+  void addEnum(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      String name,
+      List<EnumConstantInfo> enumConstantInfos,
+      int startCharOffset,
+      int charOffset,
+      int charEndOffset) {
+    MetadataCollector metadataCollector = loader.target.metadataCollector;
+    EnumBuilder builder = new EnumBuilder(metadataCollector, metadata, name,
+        enumConstantInfos, this, startCharOffset, charOffset, charEndOffset);
+    addBuilder(name, builder, charOffset);
+    metadataCollector?.setDocumentationComment(
+        builder.target, documentationComment);
+  }
+
+  void addFunctionTypeAlias(
+      String documentationComment,
+      List<MetadataBuilder> metadata,
+      String name,
+      List<TypeVariableBuilder> typeVariables,
+      FunctionTypeBuilder type,
+      int charOffset) {
+    TypeAliasBuilder typedef = new TypeAliasBuilder(
+        metadata, name, typeVariables, type, this, charOffset);
+    loader.target.metadataCollector
+        ?.setDocumentationComment(typedef.target, documentationComment);
+    checkTypeVariables(typeVariables, typedef);
+    // Nested declaration began in `OutlineBuilder.beginFunctionTypeAlias`.
+    endNestedDeclaration(TypeParameterScopeKind.typedef, "#typedef")
+        .resolveTypes(typeVariables, this);
+    addBuilder(name, typedef, charOffset);
+  }
+
+  FunctionTypeBuilder addFunctionType(
+      TypeBuilder returnType,
+      List<TypeVariableBuilder> typeVariables,
+      List<FormalParameterBuilder> formals,
+      int charOffset) {
+    var builder = new FunctionTypeBuilder(returnType, typeVariables, formals);
+    checkTypeVariables(typeVariables, null);
+    // Nested declaration began in `OutlineBuilder.beginFunctionType` or
+    // `OutlineBuilder.beginFunctionTypedFormalParameter`.
+    endNestedDeclaration(TypeParameterScopeKind.functionType, "#function_type")
+        .resolveTypes(typeVariables, this);
+    return addType(builder, charOffset);
+  }
+
+  FormalParameterBuilder addFormalParameter(
+      List<MetadataBuilder> metadata,
+      int modifiers,
+      TypeBuilder type,
+      String name,
+      bool hasThis,
+      int charOffset,
+      Token initializerToken) {
+    if (hasThis) {
+      modifiers |= initializingFormalMask;
+    }
+    FormalParameterBuilder formal = new FormalParameterBuilder(
+        metadata, modifiers, type, name, this, charOffset);
+    formal.initializerToken = initializerToken;
+    if (legacyMode && hasThis && type == null) {
+      (untypedInitializingFormals ??= <FormalParameterBuilder>[]).add(formal);
+    }
+    return formal;
+  }
+
+  TypeVariableBuilder addTypeVariable(
+      String name, TypeBuilder bound, int charOffset) {
+    var builder = new TypeVariableBuilder(name, this, charOffset, bound: bound);
+    boundlessTypeVariables.add(builder);
+    return builder;
+  }
+
+  @override
+  void buildOutlineExpressions() {
+    MetadataBuilder.buildAnnotations(library, metadata, this, null, null);
+  }
+
+  void buildBuilder(Builder declaration, LibraryBuilder coreLibrary) {
+    Class cls;
+    Member member;
+    Typedef typedef;
+    if (declaration is SourceClassBuilder) {
+      cls = declaration.build(this, coreLibrary);
+    } else if (declaration is FieldBuilder) {
+      member = declaration.build(this)..isStatic = true;
+    } else if (declaration is ProcedureBuilder) {
+      member = declaration.build(this)..isStatic = true;
+    } else if (declaration is TypeAliasBuilder) {
+      typedef = declaration.build(this);
+    } else if (declaration is EnumBuilder) {
+      cls = declaration.build(this, coreLibrary);
+    } else if (declaration is PrefixBuilder) {
+      // Ignored. Kernel doesn't represent prefixes.
+      return;
+    } else if (declaration is BuiltinTypeBuilder) {
+      // Nothing needed.
+      return;
+    } else {
+      unhandled("${declaration.runtimeType}", "buildBuilder",
+          declaration.charOffset, declaration.fileUri);
+      return;
+    }
+    if (declaration.isPatch) {
+      // The kernel node of a patch is shared with the origin declaration. We
+      // have two builders: the origin, and the patch, but only one kernel node
+      // (which corresponds to the final output). Consequently, the node
+      // shouldn't be added to its apparent kernel parent as this would create
+      // a duplicate entry in the parent's list of children/members.
+      return;
+    }
+    if (cls != null) {
+      if (declaration.next != null) {
+        int count = 0;
+        Builder current = declaration.next;
+        while (current != null) {
+          count++;
+          current = current.next;
+        }
+        cls.name += "#$count";
+      }
+      library.addClass(cls);
+    } else if (member != null) {
+      if (declaration.next == null) {
+        library.addMember(member);
+      }
+    } else if (typedef != null) {
+      if (declaration.next == null) {
+        library.addTypedef(typedef);
+      }
+    }
+  }
+
+  void addNativeDependency(String nativeImportPath) {
+    Builder constructor = loader.getNativeAnnotation();
+    Arguments arguments =
+        new Arguments(<Expression>[new StringLiteral(nativeImportPath)]);
+    Expression annotation;
+    if (constructor.isConstructor) {
+      annotation = new ConstructorInvocation(constructor.target, arguments)
+        ..isConst = true;
+    } else {
+      annotation = new StaticInvocation(constructor.target, arguments)
+        ..isConst = true;
+    }
+    library.addAnnotation(annotation);
+  }
+
+  void addDependencies(Library library, Set<SourceLibraryBuilder> seen) {
+    if (!seen.add(this)) {
+      return;
+    }
+
+    // Merge import and export lists to have the dependencies in source order.
+    // This is required for the DietListener to correctly match up metadata.
+    int importIndex = 0;
+    int exportIndex = 0;
+    while (importIndex < imports.length || exportIndex < exports.length) {
+      if (exportIndex >= exports.length ||
+          (importIndex < imports.length &&
+              imports[importIndex].charOffset <
+                  exports[exportIndex].charOffset)) {
+        // Add import
+        Import import = imports[importIndex++];
+
+        // Rather than add a LibraryDependency, we attach an annotation.
+        if (import.nativeImportPath != null) {
+          addNativeDependency(import.nativeImportPath);
+          continue;
+        }
+
+        if (import.deferred && import.prefixBuilder?.dependency != null) {
+          library.addDependency(import.prefixBuilder.dependency);
+        } else {
+          library.addDependency(new LibraryDependency.import(
+              import.imported.target,
+              name: import.prefix,
+              combinators: toKernelCombinators(import.combinators))
+            ..fileOffset = import.charOffset);
+        }
+      } else {
+        // Add export
+        Export export = exports[exportIndex++];
+        library.addDependency(new LibraryDependency.export(
+            export.exported.target,
+            combinators: toKernelCombinators(export.combinators))
+          ..fileOffset = export.charOffset);
+      }
+    }
+
+    for (SourceLibraryBuilder part in parts) {
+      part.addDependencies(library, seen);
+    }
+  }
+
+  @override
+  Builder computeAmbiguousDeclaration(
+      String name, Builder declaration, Builder other, int charOffset,
+      {bool isExport: false, bool isImport: false}) {
+    // TODO(ahe): Can I move this to Scope or Prefix?
+    if (declaration == other) return declaration;
+    if (declaration is InvalidTypeBuilder) return declaration;
+    if (other is InvalidTypeBuilder) return other;
+    if (declaration is AccessErrorBuilder) {
+      AccessErrorBuilder error = declaration;
+      declaration = error.builder;
+    }
+    if (other is AccessErrorBuilder) {
+      AccessErrorBuilder error = other;
+      other = error.builder;
+    }
+    bool isLocal = false;
+    bool isLoadLibrary = false;
+    Builder preferred;
+    Uri uri;
+    Uri otherUri;
+    Uri preferredUri;
+    Uri hiddenUri;
+    if (scope.local[name] == declaration) {
+      isLocal = true;
+      preferred = declaration;
+      hiddenUri = computeLibraryUri(other);
+    } else {
+      uri = computeLibraryUri(declaration);
+      otherUri = computeLibraryUri(other);
+      if (declaration is LoadLibraryBuilder) {
+        isLoadLibrary = true;
+        preferred = declaration;
+        preferredUri = otherUri;
+      } else if (other is LoadLibraryBuilder) {
+        isLoadLibrary = true;
+        preferred = other;
+        preferredUri = uri;
+      } else if (otherUri?.scheme == "dart" && uri?.scheme != "dart") {
+        preferred = declaration;
+        preferredUri = uri;
+        hiddenUri = otherUri;
+      } else if (uri?.scheme == "dart" && otherUri?.scheme != "dart") {
+        preferred = other;
+        preferredUri = otherUri;
+        hiddenUri = uri;
+      }
+    }
+    if (preferred != null) {
+      if (isLocal) {
+        var template = isExport
+            ? templateLocalDefinitionHidesExport
+            : templateLocalDefinitionHidesImport;
+        addProblem(template.withArguments(name, hiddenUri), charOffset,
+            noLength, fileUri);
+      } else if (isLoadLibrary) {
+        addProblem(templateLoadLibraryHidesMember.withArguments(preferredUri),
+            charOffset, noLength, fileUri);
+      } else {
+        var template =
+            isExport ? templateExportHidesExport : templateImportHidesImport;
+        addProblem(template.withArguments(name, preferredUri, hiddenUri),
+            charOffset, noLength, fileUri);
+      }
+      return preferred;
+    }
+    if (declaration.next == null && other.next == null) {
+      if (isImport && declaration is PrefixBuilder && other is PrefixBuilder) {
+        // Handles the case where the same prefix is used for different
+        // imports.
+        return declaration
+          ..exportScope.merge(other.exportScope,
+              (String name, Builder existing, Builder member) {
+            return computeAmbiguousDeclaration(
+                name, existing, member, charOffset,
+                isExport: isExport, isImport: isImport);
+          });
+      }
+    }
+    var template =
+        isExport ? templateDuplicatedExport : templateDuplicatedImport;
+    Message message = template.withArguments(name, uri, otherUri);
+    addProblem(message, charOffset, noLength, fileUri);
+    var builderTemplate = isExport
+        ? templateDuplicatedExportInType
+        : templateDuplicatedImportInType;
+    message = builderTemplate.withArguments(
+        name,
+        // TODO(ahe): We should probably use a context object here
+        // instead of including URIs in this message.
+        uri,
+        otherUri);
+    // We report the error lazily (setting suppressMessage to false) because the
+    // spec 18.1 states that 'It is not an error if N is introduced by two or
+    // more imports but never referred to.'
+    return new InvalidTypeBuilder(
+        name, message.withLocation(fileUri, charOffset, name.length),
+        suppressMessage: false);
+  }
+
+  int finishDeferredLoadTearoffs() {
+    int total = 0;
+    for (var import in imports) {
+      if (import.deferred) {
+        Procedure tearoff = import.prefixBuilder.loadLibraryBuilder.tearoff;
+        if (tearoff != null) library.addMember(tearoff);
+        total++;
+      }
+    }
+    return total;
+  }
+
+  int finishForwarders() {
+    int count = 0;
+    CloneVisitor cloner = new CloneVisitor();
+    for (int i = 0; i < forwardersOrigins.length; i += 2) {
+      Procedure forwarder = forwardersOrigins[i];
+      Procedure origin = forwardersOrigins[i + 1];
+
+      int positionalCount = origin.function.positionalParameters.length;
+      if (forwarder.function.positionalParameters.length != positionalCount) {
+        return unexpected(
+            "$positionalCount",
+            "${forwarder.function.positionalParameters.length}",
+            origin.fileOffset,
+            origin.fileUri);
+      }
+      for (int j = 0; j < positionalCount; ++j) {
+        VariableDeclaration forwarderParameter =
+            forwarder.function.positionalParameters[j];
+        VariableDeclaration originParameter =
+            origin.function.positionalParameters[j];
+        if (originParameter.initializer != null) {
+          forwarderParameter.initializer =
+              cloner.clone(originParameter.initializer);
+          forwarderParameter.initializer.parent = forwarderParameter;
+        }
+      }
+
+      Map<String, VariableDeclaration> originNamedMap =
+          <String, VariableDeclaration>{};
+      for (VariableDeclaration originNamed in origin.function.namedParameters) {
+        originNamedMap[originNamed.name] = originNamed;
+      }
+      for (VariableDeclaration forwarderNamed
+          in forwarder.function.namedParameters) {
+        VariableDeclaration originNamed = originNamedMap[forwarderNamed.name];
+        if (originNamed == null) {
+          return unhandled(
+              "null", forwarder.name.name, origin.fileOffset, origin.fileUri);
+        }
+        if (originNamed.initializer == null) continue;
+        forwarderNamed.initializer = cloner.clone(originNamed.initializer);
+        forwarderNamed.initializer.parent = forwarderNamed;
+      }
+
+      ++count;
+    }
+    forwardersOrigins.clear();
+    return count;
+  }
+
+  void addNativeMethod(FunctionBuilder method) {
+    nativeMethods.add(method);
+  }
+
+  int finishNativeMethods() {
+    for (FunctionBuilder method in nativeMethods) {
+      method.becomeNative(loader);
+    }
+    return nativeMethods.length;
+  }
+
+  /// Creates a copy of [original] into the scope of [declaration].
+  ///
+  /// This is used for adding copies of class type parameters to factory
+  /// methods and unnamed mixin applications, and for adding copies of
+  /// extension type parameters to extension instance methods.
+  ///
+  /// If [synthesizeTypeParameterNames] is `true` the names of the
+  /// [TypeParameter] are prefix with '#' to indicate that their synthesized.
+  List<TypeVariableBuilder> copyTypeVariables(
+      List<TypeVariableBuilder> original, TypeParameterScopeBuilder declaration,
+      {bool synthesizeTypeParameterNames: false}) {
+    List<TypeBuilder> newTypes = <TypeBuilder>[];
+    List<TypeVariableBuilder> copy = <TypeVariableBuilder>[];
+    for (TypeVariableBuilder variable in original) {
+      var newVariable = new TypeVariableBuilder(
+          variable.name, this, variable.charOffset,
+          bound: variable.bound?.clone(newTypes),
+          synthesizeTypeParameterName: synthesizeTypeParameterNames);
+      copy.add(newVariable);
+      boundlessTypeVariables.add(newVariable);
+    }
+    for (TypeBuilder newType in newTypes) {
+      declaration.addType(new UnresolvedType(newType, -1, null));
+    }
+    return copy;
+  }
+
+  int finishTypeVariables(ClassBuilder object, TypeBuilder dynamicType) {
+    int count = boundlessTypeVariables.length;
+    for (TypeVariableBuilder builder in boundlessTypeVariables) {
+      builder.finish(this, object, dynamicType);
+    }
+    boundlessTypeVariables.clear();
+    return count;
+  }
+
+  int computeDefaultTypes(TypeBuilder dynamicType, TypeBuilder bottomType,
+      ClassBuilder objectClass) {
+    int count = 0;
+
+    int computeDefaultTypesForVariables(
+        List<TypeVariableBuilder> variables, bool legacyMode) {
+      if (variables == null) return 0;
+
+      bool haveErroneousBounds = false;
+      if (!legacyMode) {
+        for (int i = 0; i < variables.length; ++i) {
+          TypeVariableBuilder variable = variables[i];
+          List<TypeBuilder> genericFunctionTypes = <TypeBuilder>[];
+          findGenericFunctionTypes(variable.bound,
+              result: genericFunctionTypes);
+          if (genericFunctionTypes.length > 0) {
+            haveErroneousBounds = true;
+            addProblem(messageGenericFunctionTypeInBound, variable.charOffset,
+                variable.name.length, variable.fileUri);
+          }
+        }
+
+        if (!haveErroneousBounds) {
+          List<TypeBuilder> calculatedBounds =
+              calculateBounds(variables, dynamicType, bottomType, objectClass);
+          for (int i = 0; i < variables.length; ++i) {
+            variables[i].defaultType = calculatedBounds[i];
+          }
+        }
+      }
+
+      if (legacyMode || haveErroneousBounds) {
+        // In Dart 1, put `dynamic` everywhere.
+        for (int i = 0; i < variables.length; ++i) {
+          variables[i].defaultType = dynamicType;
+        }
+      }
+
+      return variables.length;
+    }
+
+    void reportIssues(List<Object> issues) {
+      for (int i = 0; i < issues.length; i += 3) {
+        TypeDeclarationBuilder declaration = issues[i];
+        Message message = issues[i + 1];
+        List<LocatedMessage> context = issues[i + 2];
+
+        addProblem(message, declaration.charOffset, declaration.name.length,
+            declaration.fileUri,
+            context: context);
+      }
+    }
+
+    bool legacyMode = loader.target.legacyMode;
+    for (var declaration in libraryDeclaration.members.values) {
+      if (declaration is ClassBuilder) {
+        {
+          List<Object> issues = legacyMode
+              ? const <Object>[]
+              : getNonSimplicityIssuesForDeclaration(declaration,
+                  performErrorRecovery: true);
+          reportIssues(issues);
+          // In case of issues, use legacy mode for error recovery.
+          count += computeDefaultTypesForVariables(
+              declaration.typeVariables, legacyMode || issues.isNotEmpty);
+        }
+        declaration.forEach((String name, Builder member) {
+          if (member is ProcedureBuilder) {
+            List<Object> issues = legacyMode
+                ? const <Object>[]
+                : getNonSimplicityIssuesForTypeVariables(member.typeVariables);
+            reportIssues(issues);
+            // In case of issues, use legacy mode for error recovery.
+            count += computeDefaultTypesForVariables(
+                member.typeVariables, legacyMode || issues.isNotEmpty);
+          }
+        });
+      } else if (declaration is TypeAliasBuilder) {
+        List<Object> issues = legacyMode
+            ? const <Object>[]
+            : getNonSimplicityIssuesForDeclaration(declaration,
+                performErrorRecovery: true);
+        reportIssues(issues);
+        // In case of issues, use legacy mode for error recovery.
+        count += computeDefaultTypesForVariables(
+            declaration.typeVariables, legacyMode || issues.isNotEmpty);
+      } else if (declaration is FunctionBuilder) {
+        List<Object> issues = legacyMode
+            ? const <Object>[]
+            : getNonSimplicityIssuesForTypeVariables(declaration.typeVariables);
+        reportIssues(issues);
+        // In case of issues, use legacy mode for error recovery.
+        count += computeDefaultTypesForVariables(
+            declaration.typeVariables, legacyMode || issues.isNotEmpty);
+      }
+    }
+
+    return count;
+  }
+
+  @override
+  void applyPatches() {
+    if (!isPatch) return;
+    NameIterator originDeclarations = origin.nameIterator;
+    while (originDeclarations.moveNext()) {
+      String name = originDeclarations.name;
+      Builder member = originDeclarations.current;
+      bool isSetter = member.isSetter;
+      Builder patch = isSetter ? scope.setters[name] : scope.local[name];
+      if (patch != null) {
+        // [patch] has the same name as a [member] in [origin] library, so it
+        // must be a patch to [member].
+        member.applyPatch(patch);
+        // TODO(ahe): Verify that patch has the @patch annotation.
+      } else {
+        // No member with [name] exists in this library already. So we need to
+        // import it into the patch library. This ensures that the origin
+        // library is in scope of the patch library.
+        if (isSetter) {
+          scopeBuilder.addSetter(name, member);
+        } else {
+          scopeBuilder.addMember(name, member);
+        }
+      }
+    }
+    NameIterator patchDeclarations = nameIterator;
+    while (patchDeclarations.moveNext()) {
+      String name = patchDeclarations.name;
+      Builder member = patchDeclarations.current;
+      // We need to inject all non-patch members into the origin library. This
+      // should only apply to private members.
+      if (member.isPatch) {
+        // Ignore patches.
+      } else if (name.startsWith("_")) {
+        origin.injectMemberFromPatch(name, member);
+      } else {
+        origin.exportMemberFromPatch(name, member);
+      }
+    }
+  }
+
+  int finishPatchMethods() {
+    if (!isPatch) return 0;
+    int count = 0;
+    Iterator<Builder> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      count += iterator.current.finishPatch();
+    }
+    return count;
+  }
+
+  void injectMemberFromPatch(String name, Builder member) {
+    if (member.isSetter) {
+      assert(scope.setters[name] == null);
+      scopeBuilder.addSetter(name, member);
+    } else {
+      assert(scope.local[name] == null);
+      scopeBuilder.addMember(name, member);
+    }
+  }
+
+  void exportMemberFromPatch(String name, Builder member) {
+    if (uri.scheme != "dart" || !uri.path.startsWith("_")) {
+      addProblem(templatePatchInjectionFailed.withArguments(name, uri),
+          member.charOffset, noLength, member.fileUri);
+    }
+    // Platform-private libraries, such as "dart:_internal" have special
+    // semantics: public members are injected into the origin library.
+    // TODO(ahe): See if we can remove this special case.
+
+    // If this member already exist in the origin library scope, it should
+    // have been marked as patch.
+    assert((member.isSetter && scope.setters[name] == null) ||
+        (!member.isSetter && scope.local[name] == null));
+    addToExportScope(name, member);
+  }
+
+  void reportTypeArgumentIssues(
+      List<TypeArgumentIssue> issues, Uri fileUri, int offset,
+      {bool inferred, DartType targetReceiver, String targetName}) {
+    for (TypeArgumentIssue issue in issues) {
+      DartType argument = issue.argument;
+      TypeParameter typeParameter = issue.typeParameter;
+
+      Message message;
+      bool issueInferred = inferred ?? inferredTypes.contains(argument);
+      if (argument is FunctionType && argument.typeParameters.length > 0) {
+        if (issueInferred) {
+          message = templateGenericFunctionTypeInferredAsActualTypeArgument
+              .withArguments(argument);
+        } else {
+          message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+        }
+        typeParameter = null;
+      } else if (argument is TypeParameterType &&
+          argument.promotedBound != null) {
+        addProblem(
+            templateIntersectionTypeAsTypeArgument.withArguments(
+                typeParameter.name, argument, argument.promotedBound),
+            offset,
+            noLength,
+            fileUri);
+        continue;
+      } else {
+        if (issue.enclosingType == null && targetReceiver != null) {
+          if (issueInferred) {
+            message =
+                templateIncorrectTypeArgumentQualifiedInferred.withArguments(
+                    argument,
+                    typeParameter.bound,
+                    typeParameter.name,
+                    targetReceiver,
+                    targetName);
+          } else {
+            message = templateIncorrectTypeArgumentQualified.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                targetReceiver,
+                targetName);
+          }
+        } else {
+          String enclosingName = issue.enclosingType == null
+              ? targetName
+              : getGenericTypeName(issue.enclosingType);
+          assert(enclosingName != null);
+          if (issueInferred) {
+            message = templateIncorrectTypeArgumentInferred.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                enclosingName);
+          } else {
+            message = templateIncorrectTypeArgument.withArguments(argument,
+                typeParameter.bound, typeParameter.name, enclosingName);
+          }
+        }
+      }
+
+      reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
+    }
+  }
+
+  void reportTypeArgumentIssue(Message message, Uri fileUri, int fileOffset,
+      TypeParameter typeParameter) {
+    List<LocatedMessage> context;
+    if (typeParameter != null && typeParameter.fileOffset != -1) {
+      // It looks like when parameters come from patch files, they don't
+      // have a reportable location.
+      context = <LocatedMessage>[
+        messageIncorrectTypeArgumentVariable.withLocation(
+            typeParameter.location.file, typeParameter.fileOffset, noLength)
+      ];
+    }
+    addProblem(message, fileOffset, noLength, fileUri, context: context);
+  }
+
+  void checkBoundsInField(Field field, TypeEnvironment typeEnvironment) {
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(
+        field.type, typeEnvironment, field.fileUri, field.fileOffset,
+        allowSuperBounded: true);
+  }
+
+  void checkBoundsInFunctionNodeParts(
+      TypeEnvironment typeEnvironment, Uri fileUri, int fileOffset,
+      {List<TypeParameter> typeParameters,
+      List<VariableDeclaration> positionalParameters,
+      List<VariableDeclaration> namedParameters,
+      DartType returnType}) {
+    if (loader.target.legacyMode) return;
+    if (typeParameters != null) {
+      for (TypeParameter parameter in typeParameters) {
+        checkBoundsInType(
+            parameter.bound, typeEnvironment, fileUri, parameter.fileOffset,
+            allowSuperBounded: true);
+      }
+    }
+    if (positionalParameters != null) {
+      for (VariableDeclaration formal in positionalParameters) {
+        checkBoundsInType(
+            formal.type, typeEnvironment, fileUri, formal.fileOffset,
+            allowSuperBounded: true);
+      }
+    }
+    if (namedParameters != null) {
+      for (VariableDeclaration named in namedParameters) {
+        checkBoundsInType(
+            named.type, typeEnvironment, fileUri, named.fileOffset,
+            allowSuperBounded: true);
+      }
+    }
+    if (returnType != null) {
+      List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+          returnType, typeEnvironment,
+          allowSuperBounded: true);
+      if (issues != null) {
+        int offset = fileOffset;
+        for (TypeArgumentIssue issue in issues) {
+          DartType argument = issue.argument;
+          TypeParameter typeParameter = issue.typeParameter;
+
+          // We don't need to check if [argument] was inferred or specified
+          // here, because inference in return types boils down to instantiate-
+          // -to-bound, and it can't provide a type that violates the bound.
+          Message message;
+          if (argument is FunctionType && argument.typeParameters.length > 0) {
+            message = messageGenericFunctionTypeUsedAsActualTypeArgument;
+            typeParameter = null;
+          } else {
+            message = templateIncorrectTypeArgumentInReturnType.withArguments(
+                argument,
+                typeParameter.bound,
+                typeParameter.name,
+                getGenericTypeName(issue.enclosingType));
+          }
+
+          reportTypeArgumentIssue(message, fileUri, offset, typeParameter);
+        }
+      }
+    }
+  }
+
+  void checkBoundsInFunctionNode(
+      FunctionNode function, TypeEnvironment typeEnvironment, Uri fileUri) {
+    if (loader.target.legacyMode) return;
+    checkBoundsInFunctionNodeParts(
+        typeEnvironment, fileUri, function.fileOffset,
+        typeParameters: function.typeParameters,
+        positionalParameters: function.positionalParameters,
+        namedParameters: function.namedParameters,
+        returnType: function.returnType);
+  }
+
+  void checkBoundsInListLiteral(
+      ListLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(
+        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+  }
+
+  void checkBoundsInSetLiteral(
+      SetLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(
+        node.typeArgument, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+  }
+
+  void checkBoundsInMapLiteral(
+      MapLiteral node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    checkBoundsInType(node.keyType, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+    checkBoundsInType(node.valueType, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+  }
+
+  void checkBoundsInType(
+      DartType type, TypeEnvironment typeEnvironment, Uri fileUri, int offset,
+      {bool inferred, bool allowSuperBounded = true}) {
+    if (loader.target.legacyMode) return;
+    List<TypeArgumentIssue> issues = findTypeArgumentIssues(
+        type, typeEnvironment,
+        allowSuperBounded: allowSuperBounded);
+    if (issues != null) {
+      reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
+    }
+  }
+
+  void checkBoundsInVariableDeclaration(
+      VariableDeclaration node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    if (node.type == null) return;
+    checkBoundsInType(node.type, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: true);
+  }
+
+  void checkBoundsInConstructorInvocation(
+      ConstructorInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    if (node.arguments.types.isEmpty) return;
+    Constructor constructor = node.target;
+    Class klass = constructor.enclosingClass;
+    DartType constructedType = new InterfaceType(klass, node.arguments.types);
+    checkBoundsInType(
+        constructedType, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
+  }
+
+  void checkBoundsInFactoryInvocation(
+      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    if (node.arguments.types.isEmpty) return;
+    Procedure factory = node.target;
+    assert(factory.isFactory);
+    Class klass = factory.enclosingClass;
+    DartType constructedType = new InterfaceType(klass, node.arguments.types);
+    checkBoundsInType(
+        constructedType, typeEnvironment, fileUri, node.fileOffset,
+        inferred: inferred, allowSuperBounded: false);
+  }
+
+  void checkBoundsInStaticInvocation(
+      StaticInvocation node, TypeEnvironment typeEnvironment, Uri fileUri,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    if (node.arguments.types.isEmpty) return;
+    Class klass = node.target.enclosingClass;
+    List<TypeParameter> parameters = node.target.function.typeParameters;
+    List<DartType> arguments = node.arguments.types;
+    // The following error is to be reported elsewhere.
+    if (parameters.length != arguments.length) return;
+    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
+        parameters, arguments, typeEnvironment);
+    if (issues != null) {
+      DartType targetReceiver;
+      if (klass != null) {
+        targetReceiver = new InterfaceType(klass);
+      }
+      String targetName = node.target.name.name;
+      reportTypeArgumentIssues(issues, fileUri, node.fileOffset,
+          inferred: inferred,
+          targetReceiver: targetReceiver,
+          targetName: targetName);
+    }
+  }
+
+  void checkBoundsInMethodInvocation(
+      DartType receiverType,
+      TypeEnvironment typeEnvironment,
+      ClassHierarchy hierarchy,
+      TypeInferrerImpl typeInferrer,
+      Name name,
+      Member interfaceTarget,
+      Arguments arguments,
+      Uri fileUri,
+      int offset,
+      {bool inferred = false}) {
+    if (loader.target.legacyMode) return;
+    if (arguments.types.isEmpty) return;
+    Class klass;
+    List<DartType> receiverTypeArguments;
+    if (receiverType is InterfaceType) {
+      klass = receiverType.classNode;
+      receiverTypeArguments = receiverType.typeArguments;
+    } else {
+      return;
+    }
+    // TODO(dmitryas): Find a better way than relying on [interfaceTarget].
+    Member method = hierarchy.getDispatchTarget(klass, name) ?? interfaceTarget;
+    if (method == null || method is! Procedure) {
+      return;
+    }
+    if (klass != method.enclosingClass) {
+      Supertype parent =
+          hierarchy.getClassAsInstanceOf(klass, method.enclosingClass);
+      klass = method.enclosingClass;
+      receiverTypeArguments = parent.typeArguments;
+    }
+    Map<TypeParameter, DartType> substitutionMap = <TypeParameter, DartType>{};
+    for (int i = 0; i < receiverTypeArguments.length; ++i) {
+      substitutionMap[klass.typeParameters[i]] = receiverTypeArguments[i];
+    }
+    List<TypeParameter> methodParameters = method.function.typeParameters;
+    // The error is to be reported elsewhere.
+    if (methodParameters.length != arguments.types.length) return;
+    List<TypeParameter> instantiatedMethodParameters =
+        new List<TypeParameter>.filled(methodParameters.length, null);
+    for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
+      instantiatedMethodParameters[i] =
+          new TypeParameter(methodParameters[i].name);
+      substitutionMap[methodParameters[i]] =
+          new TypeParameterType(instantiatedMethodParameters[i]);
+    }
+    for (int i = 0; i < instantiatedMethodParameters.length; ++i) {
+      instantiatedMethodParameters[i].bound =
+          substitute(methodParameters[i].bound, substitutionMap);
+    }
+    List<TypeArgumentIssue> issues = findTypeArgumentIssuesForInvocation(
+        instantiatedMethodParameters, arguments.types, typeEnvironment);
+    if (issues != null) {
+      reportTypeArgumentIssues(issues, fileUri, offset,
+          inferred: inferred,
+          targetReceiver: receiverType,
+          targetName: name.name);
+    }
+  }
+
+  void checkBoundsInOutline(TypeEnvironment typeEnvironment) {
+    if (loader.target.legacyMode) return;
+    Iterator<Builder> iterator = this.iterator;
+    while (iterator.moveNext()) {
+      Builder declaration = iterator.current;
+      if (declaration is FieldBuilder) {
+        checkBoundsInField(declaration.target, typeEnvironment);
+      } else if (declaration is ProcedureBuilder) {
+        checkBoundsInFunctionNode(
+            declaration.target.function, typeEnvironment, declaration.fileUri);
+      } else if (declaration is ClassBuilder) {
+        declaration.checkBoundsInOutline(typeEnvironment);
+      }
+    }
+    inferredTypes.clear();
+  }
+
+  int finalizeInitializingFormals() {
+    if (!legacyMode || untypedInitializingFormals == null) return 0;
+    for (int i = 0; i < untypedInitializingFormals.length; i++) {
+      untypedInitializingFormals[i].finalizeInitializingFormal();
+    }
+    int count = untypedInitializingFormals.length;
+    untypedInitializingFormals = null;
+    return count;
+  }
+
+  @override
+  List<FieldBuilder> takeImplicitlyTypedFields() {
+    List<FieldBuilder> result = implicitlyTypedFields;
+    implicitlyTypedFields = null;
+    return result;
+  }
 }
 
+// The kind of type parameter scope built by a [TypeParameterScopeBuilder]
+// object.
+enum TypeParameterScopeKind {
+  library,
+  classOrNamedMixinApplication,
+  classDeclaration,
+  mixinDeclaration,
+  unnamedMixinApplication,
+  namedMixinApplication,
+  extensionDeclaration,
+  typedef,
+  staticOrInstanceMethodOrConstructor,
+  topLevelMethod,
+  factoryMethod,
+  functionType,
+}
+
+/// A builder object preparing for building declarations that can introduce type
+/// parameter and/or members.
+///
 /// Unlike [Scope], this scope is used during construction of builders to
 /// ensure types and members are added to and resolved in the correct location.
-class DeclarationBuilder<T extends TypeBuilder> {
-  final DeclarationBuilder<T> parent;
+class TypeParameterScopeBuilder {
+  TypeParameterScopeKind _kind;
 
-  final Map<String, Declaration> members;
+  final TypeParameterScopeBuilder parent;
 
-  final Map<String, Declaration> constructors;
+  final Map<String, Builder> members;
 
-  final Map<String, Declaration> setters;
+  final Map<String, Builder> constructors;
 
-  final List<UnresolvedType<T>> types = <UnresolvedType<T>>[];
+  final Map<String, Builder> setters;
 
-  String name;
+  final List<UnresolvedType> types = <UnresolvedType>[];
 
-  // Offset of name token, updated by the outline builder along
-  // with the name as the current declaration changes.
-  int charOffset;
+  // TODO(johnniwinther): Stop using [_name] for determining the declaration
+  // kind.
+  String _name;
 
-  List<TypeVariableBuilder> typeVariables;
+  /// Offset of name token, updated by the outline builder along
+  /// with the name as the current declaration changes.
+  int _charOffset;
+
+  List<TypeVariableBuilder> _typeVariables;
+
+  /// The type of `this` in instance methods declared in extension declarations.
+  ///
+  /// Instance methods declared in extension declarations methods are extended
+  /// with a synthesized parameter of this type.
+  TypeBuilder _extensionThisType;
 
   bool hasConstConstructor = false;
 
-  DeclarationBuilder(this.members, this.setters, this.constructors, this.name,
-      this.charOffset, this.parent) {
-    assert(name != null);
+  TypeParameterScopeBuilder(this._kind, this.members, this.setters,
+      this.constructors, this._name, this._charOffset, this.parent) {
+    assert(_name != null);
   }
 
-  DeclarationBuilder.library()
-      : this(<String, Declaration>{}, <String, Declaration>{}, null,
-            "<library>", -1, null);
+  TypeParameterScopeBuilder.library()
+      : this(TypeParameterScopeKind.library, <String, Builder>{},
+            <String, Builder>{}, null, "<library>", -1, null);
 
-  DeclarationBuilder createNested(String name, bool hasMembers) {
-    return new DeclarationBuilder<T>(
+  TypeParameterScopeBuilder createNested(
+      TypeParameterScopeKind kind, String name, bool hasMembers) {
+    return new TypeParameterScopeBuilder(
+        kind,
         hasMembers ? <String, MemberBuilder>{} : null,
         hasMembers ? <String, MemberBuilder>{} : null,
         hasMembers ? <String, MemberBuilder>{} : null,
@@ -961,7 +2930,112 @@
         this);
   }
 
-  void addType(UnresolvedType<T> type) {
+  /// Registers that this builder is preparing for a class declaration with the
+  /// given [name] and [typeVariables] located [charOffset].
+  void markAsClassDeclaration(
+      String name, int charOffset, List<TypeVariableBuilder> typeVariables) {
+    assert(_kind == TypeParameterScopeKind.classOrNamedMixinApplication,
+        "Unexpected declaration kind: $_kind");
+    _kind = TypeParameterScopeKind.classDeclaration;
+    _name = name;
+    _charOffset = charOffset;
+    _typeVariables = typeVariables;
+  }
+
+  /// Registers that this builder is preparing for a named mixin application
+  /// with the given [name] and [typeVariables] located [charOffset].
+  void markAsNamedMixinApplication(
+      String name, int charOffset, List<TypeVariableBuilder> typeVariables) {
+    assert(_kind == TypeParameterScopeKind.classOrNamedMixinApplication,
+        "Unexpected declaration kind: $_kind");
+    _kind = TypeParameterScopeKind.namedMixinApplication;
+    _name = name;
+    _charOffset = charOffset;
+    _typeVariables = typeVariables;
+  }
+
+  /// Registers that this builder is preparing for a mixin declaration with the
+  /// given [name] and [typeVariables] located [charOffset].
+  void markAsMixinDeclaration(
+      String name, int charOffset, List<TypeVariableBuilder> typeVariables) {
+    // TODO(johnniwinther): Avoid using 'classOrNamedMixinApplication' for mixin
+    // declaration. These are syntactically distinct so we don't need the
+    // transition.
+    assert(_kind == TypeParameterScopeKind.classOrNamedMixinApplication,
+        "Unexpected declaration kind: $_kind");
+    _kind = TypeParameterScopeKind.mixinDeclaration;
+    _name = name;
+    _charOffset = charOffset;
+    _typeVariables = typeVariables;
+  }
+
+  /// Registers that this builder is preparing for an extension declaration with
+  /// the given [name] and [typeVariables] located [charOffset].
+  void markAsExtensionDeclaration(
+      String name, int charOffset, List<TypeVariableBuilder> typeVariables) {
+    assert(_kind == TypeParameterScopeKind.extensionDeclaration,
+        "Unexpected declaration kind: $_kind");
+    _name = name;
+    _charOffset = charOffset;
+    _typeVariables = typeVariables;
+  }
+
+  /// Registers the 'extension this type' of the extension declaration prepared
+  /// for by this builder.
+  ///
+  /// See [extensionThisType] for terminology.
+  void registerExtensionThisType(TypeBuilder type) {
+    assert(_kind == TypeParameterScopeKind.extensionDeclaration,
+        "DeclarationBuilder.registerExtensionThisType is not supported $_kind");
+    assert(_extensionThisType == null,
+        "Extension this type has already been set.");
+    _extensionThisType = type;
+  }
+
+  /// Returns what kind of declaration this [TypeParameterScopeBuilder] is
+  /// preparing for.
+  ///
+  /// This information is transient for some declarations. In particular
+  /// classes and named mixin applications are initially created with the kind
+  /// [TypeParameterScopeKind.classOrNamedMixinApplication] before a call to
+  /// either [markAsClassDeclaration] or [markAsNamedMixinApplication] sets the
+  /// value to its actual kind.
+  // TODO(johnniwinther): Avoid the transition currently used on mixin
+  // declarations.
+  TypeParameterScopeKind get kind => _kind;
+
+  String get name => _name;
+
+  int get charOffset => _charOffset;
+
+  List<TypeVariableBuilder> get typeVariables => _typeVariables;
+
+  /// Returns the 'extension this type' of the extension declaration prepared
+  /// for by this builder.
+  ///
+  /// The 'extension this type' is the type mentioned in the on-clause of the
+  /// extension declaration. For instance `B` in this extension declaration:
+  ///
+  ///     extension A on B {
+  ///       B method() => this;
+  ///     }
+  ///
+  /// The 'extension this type' is the type if `this` expression in instance
+  /// methods declared in extension declarations.
+  TypeBuilder get extensionThisType {
+    assert(kind == TypeParameterScopeKind.extensionDeclaration,
+        "DeclarationBuilder.extensionThisType not supported on $kind.");
+    assert(_extensionThisType != null,
+        "DeclarationBuilder.extensionThisType has not been set on $this.");
+    return _extensionThisType;
+  }
+
+  /// Adds the yet unresolved [type] to this scope builder.
+  ///
+  /// Unresolved type will be resolved through [resolveTypes] when the scope
+  /// is fully built. This allows for resolving self-referencing types, like
+  /// type parameter used in their own bound, for instance `<T extends A<T>>`.
+  void addType(UnresolvedType type) {
     types.add(type);
   }
 
@@ -976,12 +3050,12 @@
       }
     }
     Scope scope;
-    for (UnresolvedType<T> type in types) {
+    for (UnresolvedType type in types) {
       Object nameOrQualified = type.builder.name;
       String name = nameOrQualified is QualifiedName
           ? nameOrQualified.qualifier
           : nameOrQualified;
-      Declaration declaration;
+      Builder declaration;
       if (name != null) {
         if (members != null) {
           declaration = members[name];
@@ -1017,6 +3091,9 @@
   Scope toScope(Scope parent) {
     return new Scope(members, setters, parent, name, isModifiable: false);
   }
+
+  @override
+  String toString() => 'DeclarationBuilder(${hashCode}:kind=$kind,name=$name)';
 }
 
 class FieldInfo {
@@ -1029,3 +3106,32 @@
   const FieldInfo(this.name, this.charOffset, this.initializerToken,
       this.beforeLast, this.charEndOffset);
 }
+
+class ImplementationInfo {
+  final String name;
+  final Builder declaration;
+  final int charOffset;
+
+  const ImplementationInfo(this.name, this.declaration, this.charOffset);
+}
+
+Uri computeLibraryUri(Builder declaration) {
+  Builder current = declaration;
+  do {
+    if (current is LibraryBuilder) return current.uri;
+    current = current.parent;
+  } while (current != null);
+  return unhandled("no library parent", "${declaration.runtimeType}",
+      declaration.charOffset, declaration.fileUri);
+}
+
+String extractName(name) => name is QualifiedName ? name.name : name;
+
+class PostponedProblem {
+  final Message message;
+  final int charOffset;
+  final int length;
+  final Uri fileUri;
+
+  PostponedProblem(this.message, this.charOffset, this.length, this.fileUri);
+}
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 74fcaa1..599dc2f 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -74,14 +74,12 @@
     show
         ClassBuilder,
         ClassHierarchyBuilder,
-        Declaration,
+        Builder,
         DelayedMember,
         DelayedOverrideCheck,
         EnumBuilder,
         FieldBuilder,
-        KernelClassBuilder,
-        KernelProcedureBuilder,
-        KernelTypeBuilder,
+        ProcedureBuilder,
         LibraryBuilder,
         MemberBuilder,
         NamedTypeBuilder,
@@ -106,7 +104,13 @@
 import '../problems.dart' show internalProblem;
 
 import '../scanner.dart'
-    show ErrorToken, ScannerConfiguration, ScannerResult, Token, scan;
+    show
+        ErrorToken,
+        LanguageVersionToken,
+        ScannerConfiguration,
+        ScannerResult,
+        Token,
+        scan;
 
 import 'diet_listener.dart' show DietListener;
 
@@ -118,7 +122,7 @@
 
 import 'source_library_builder.dart' show SourceLibraryBuilder;
 
-class SourceLoader extends Loader<Library> {
+class SourceLoader extends Loader {
   /// The [FileSystem] which should be used to access files.
   final FileSystem fileSystem;
 
@@ -203,14 +207,23 @@
     ScannerResult result = scan(bytes,
         includeComments: includeComments,
         configuration: new ScannerConfiguration(
-            enableTripleShift: target.enableTripleShift));
+            enableTripleShift: target.enableTripleShift,
+            enableExtensionMethods: target.enableExtensionMethods,
+            enableNonNullable: target.enableNonNullable),
+        languageVersionChanged: (_, LanguageVersionToken version) {
+      // TODO(jensj): What if we have several? What if it is unsupported?
+      // What if the language version was already set via packages and this is
+      // higher? Etc
+      library.setLanguageVersion(version.major, version.minor,
+          offset: version.offset, length: version.length, explicit: true);
+    });
     Token token = result.tokens;
     if (!suppressLexicalErrors) {
       List<int> source = getSource(bytes);
       Uri importUri = library.uri;
       if (library.isPatch) {
         // For patch files we create a "fake" import uri.
-        // We cannot use the import uri from the patched libarary because
+        // We cannot use the import uri from the patched library because
         // several different files would then have the same import uri,
         // and the VM does not support that. Also, what would, for instance,
         // setting a breakpoint on line 42 of some import uri mean, if the uri
@@ -224,6 +237,7 @@
       target.addSourceInformation(
           importUri, library.fileUri, result.lineStarts, source);
     }
+    library.issuePostponedProblems();
     while (token is ErrorToken) {
       if (!suppressLexicalErrors) {
         ErrorToken error = token;
@@ -303,10 +317,9 @@
     if (token == null) return null;
     DietListener dietListener = createDietListener(library);
 
-    Declaration parent = library;
+    Builder parent = library;
     if (enclosingClass != null) {
-      Declaration cls =
-          dietListener.memberScope.lookup(enclosingClass, -1, null);
+      Builder cls = dietListener.memberScope.lookup(enclosingClass, -1, null);
       if (cls is ClassBuilder) {
         parent = cls;
         dietListener
@@ -316,8 +329,8 @@
               "debugExpression in $enclosingClass");
       }
     }
-    KernelProcedureBuilder builder = new KernelProcedureBuilder(null, 0, null,
-        "debugExpr", null, null, ProcedureKind.Method, library, 0, 0, -1, -1)
+    ProcedureBuilder builder = new ProcedureBuilder(null, 0, null, "debugExpr",
+        null, null, ProcedureKind.Method, library, 0, 0, -1, -1)
       ..parent = parent;
     BodyBuilder listener = dietListener.createListener(
         builder, dietListener.memberScope, isInstanceMember);
@@ -396,7 +409,7 @@
       wasChanged = false;
       for (SourceLibraryBuilder exported in both) {
         for (Export export in exported.exporters) {
-          exported.exportScope.forEach((String name, Declaration member) {
+          exported.exportScope.forEach((String name, Builder member) {
             if (export.addToExportScope(name, member)) {
               wasChanged = true;
             }
@@ -422,16 +435,16 @@
   }
 
   void debugPrintExports() {
-    // TODO(sigmund): should be `covarint SourceLibraryBuilder`.
+    // TODO(sigmund): should be `covariant SourceLibraryBuilder`.
     builders.forEach((Uri uri, dynamic l) {
       SourceLibraryBuilder library = l;
-      Set<Declaration> members = new Set<Declaration>();
-      Iterator<Declaration> iterator = library.iterator;
+      Set<Builder> members = new Set<Builder>();
+      Iterator<Builder> iterator = library.iterator;
       while (iterator.moveNext()) {
         members.add(iterator.current);
       }
       List<String> exports = <String>[];
-      library.exportScope.forEach((String name, Declaration member) {
+      library.exportScope.forEach((String name, Builder member) {
         while (member != null) {
           if (!members.contains(member)) {
             exports.add(name);
@@ -563,7 +576,7 @@
   }
 
   /// Returns a list of all class builders declared in this loader.  As the
-  /// classes are sorted, any cycles in the hiearchy are reported as
+  /// 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.
@@ -572,9 +585,9 @@
     List<SourceClassBuilder> workList = <SourceClassBuilder>[];
     for (LibraryBuilder library in builders.values) {
       if (library.loader == this) {
-        Iterator<Declaration> members = library.iterator;
+        Iterator<Builder> members = library.iterator;
         while (members.moveNext()) {
-          Declaration member = members.current;
+          Builder member = members.current;
           if (member is SourceClassBuilder) {
             workList.add(member);
           }
@@ -584,7 +597,8 @@
 
     Set<ClassBuilder> blackListedClasses = new Set<ClassBuilder>();
     for (int i = 0; i < blacklistedCoreClasses.length; i++) {
-      blackListedClasses.add(coreLibrary[blacklistedCoreClasses[i]]);
+      blackListedClasses
+          .add(coreLibrary.getLocalMember(blacklistedCoreClasses[i]));
     }
 
     // Sort the classes topologically.
@@ -596,11 +610,11 @@
       workList = <SourceClassBuilder>[];
       for (int i = 0; i < previousWorkList.length; i++) {
         SourceClassBuilder cls = previousWorkList[i];
-        List<Declaration> directSupertypes =
+        List<Builder> directSupertypes =
             cls.computeDirectSupertypes(objectClass);
         bool allSupertypesProcessed = true;
         for (int i = 0; i < directSupertypes.length; i++) {
-          Declaration supertype = directSupertypes[i];
+          Builder supertype = directSupertypes[i];
           if (supertype is SourceClassBuilder &&
               supertype.library.loader == this &&
               !topologicallySortedClasses.contains(supertype)) {
@@ -642,13 +656,11 @@
     return classes;
   }
 
-  void checkClassSupertypes(
-      SourceClassBuilder cls,
-      List<Declaration> directSupertypes,
-      Set<ClassBuilder> blackListedClasses) {
+  void checkClassSupertypes(SourceClassBuilder cls,
+      List<Builder> directSupertypes, Set<ClassBuilder> blackListedClasses) {
     // Check that the direct supertypes aren't black-listed or enums.
     for (int i = 0; i < directSupertypes.length; i++) {
-      Declaration supertype = directSupertypes[i];
+      Builder supertype = directSupertypes[i];
       if (supertype is EnumBuilder) {
         cls.addProblem(templateExtendingEnum.withArguments(supertype.name),
             cls.charOffset, noLength);
@@ -670,8 +682,8 @@
         var builder = mixedInType.declaration;
         if (builder is ClassBuilder) {
           isClassBuilder = true;
-          for (Declaration constructory in builder.constructors.local.values) {
-            if (constructory.isConstructor && !constructory.isSynthetic) {
+          for (Builder constructor in builder.constructors.local.values) {
+            if (constructor.isConstructor && !constructor.isSynthetic) {
               cls.addProblem(
                   templateIllegalMixinDueToConstructors
                       .withArguments(builder.fullNameForErrors),
@@ -680,8 +692,8 @@
                   context: [
                     templateIllegalMixinDueToConstructorsCause
                         .withArguments(builder.fullNameForErrors)
-                        .withLocation(constructory.fileUri,
-                            constructory.charOffset, noLength)
+                        .withLocation(constructor.fileUri,
+                            constructor.charOffset, noLength)
                   ]);
             }
           }
@@ -816,11 +828,11 @@
   }
 
   void computeHierarchy() {
-    List<List> ambiguousTypesRecords = [];
+    List<AmbiguousTypesRecord> ambiguousTypesRecords = [];
     HandleAmbiguousSupertypes onAmbiguousSupertypes =
         (Class cls, Supertype a, Supertype b) {
       if (ambiguousTypesRecords != null) {
-        ambiguousTypesRecords.add([cls, a, b]);
+        ambiguousTypesRecords.add(new AmbiguousTypesRecord(cls, a, b));
       }
     };
     if (hierarchy == null) {
@@ -832,8 +844,8 @@
       hierarchy.applyTreeChanges(const [], component.libraries,
           reissueAmbiguousSupertypesFor: component);
     }
-    for (List record in ambiguousTypesRecords) {
-      handleAmbiguousSupertypes(record[0], record[1], record[2]);
+    for (AmbiguousTypesRecord record in ambiguousTypesRecords) {
+      handleAmbiguousSupertypes(record.cls, record.a, record.b);
     }
     ambiguousTypesRecords = null;
     ticker.logMs("Computed class hierarchy");
@@ -964,9 +976,9 @@
     builders.forEach((Uri uri, LibraryBuilder library) {
       if (library.loader == this) {
         library.buildOutlineExpressions();
-        Iterator<Declaration> iterator = library.iterator;
+        Iterator<Builder> iterator = library.iterator;
         while (iterator.moveNext()) {
-          Declaration declaration = iterator.current;
+          Builder declaration = iterator.current;
           if (declaration is ClassBuilder) {
             declaration.buildOutlineExpressions(library);
           } else if (declaration is MemberBuilder) {
@@ -1093,17 +1105,17 @@
   }
 
   @override
-  KernelClassBuilder computeClassBuilderFromTargetClass(Class cls) {
+  ClassBuilder computeClassBuilderFromTargetClass(Class cls) {
     Library kernelLibrary = cls.enclosingLibrary;
     LibraryBuilder library = builders[kernelLibrary.importUri];
     if (library == null) {
       return target.dillTarget.loader.computeClassBuilderFromTargetClass(cls);
     }
-    return library[cls.name];
+    return library.getLocalMember(cls.name);
   }
 
   @override
-  KernelTypeBuilder computeTypeBuilder(DartType type) {
+  TypeBuilder computeTypeBuilder(DartType type) {
     return type.accept(new TypeBuilderComputer(this));
   }
 }
@@ -1241,10 +1253,18 @@
 }
 """;
 
-/// A minimal implementation of dart:_internel that is sufficient to create an
+/// A minimal implementation of dart:_internal that is sufficient to create an
 /// instance of [CoreTypes] and compile program.
 const String defaultDartInternalSource = """
 class Symbol {
   const Symbol(String name);
 }
 """;
+
+class AmbiguousTypesRecord {
+  final Class cls;
+  final Supertype a;
+  final Supertype b;
+
+  const AmbiguousTypesRecord(this.cls, this.a, this.b);
+}
diff --git a/pkg/front_end/lib/src/fasta/source/stack_listener.dart b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
index 443b623..db32120 100644
--- a/pkg/front_end/lib/src/fasta/source/stack_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/stack_listener.dart
@@ -28,6 +28,8 @@
 
 import '../scanner.dart' show Token;
 
+import 'value_kinds.dart';
+
 enum NullValue {
   Arguments,
   As,
@@ -58,10 +60,12 @@
   Labels,
   Metadata,
   Modifiers,
+  Name,
   ParameterDefaultValue,
   Prefix,
   StringLiteral,
   SwitchScope,
+  Token,
   Type,
   TypeArguments,
   TypeBuilderList,
@@ -75,6 +79,109 @@
 abstract class StackListener extends Listener {
   final Stack stack = new Stack();
 
+  /// Checks the top of the current stack against [kinds]. If a mismatch is
+  /// found, a top of the current stack is print along with the expected [kinds]
+  /// marking the frames that don't match, and throws an exception.
+  ///
+  /// Use this in assert statements like `assert(checkState([ValueKind.Token]))`
+  /// to document the expected stack and get earlier errors on unexpected stack
+  /// content.
+  bool checkState(Token token, List<ValueKind> kinds) {
+    bool checkValue(ValueKind kind, Object value) {
+      return kind.check(value);
+    }
+
+    bool success = true;
+    for (int kindIndex = 0; kindIndex < kinds.length; kindIndex++) {
+      int stackIndex = stack.arrayLength - kindIndex - 1;
+      ValueKind kind = kinds[kindIndex];
+      if (stackIndex >= 0) {
+        Object value = stack.array[stackIndex];
+        if (!checkValue(kind, value)) {
+          success = false;
+        }
+      } else {
+        success = false;
+      }
+    }
+    if (!success) {
+      StringBuffer sb = new StringBuffer();
+
+      String safeToString(Object object) {
+        try {
+          return '$object';
+        } catch (e) {
+          // Judgments fail on toString.
+          return object.runtimeType.toString();
+        }
+      }
+
+      String padLeft(Object object, int length) {
+        String text = safeToString(object);
+        if (text.length < length) {
+          return ' ' * (length - text.length) + text;
+        }
+        return text;
+      }
+
+      String padRight(Object object, int length) {
+        String text = safeToString(object);
+        if (text.length < length) {
+          return text + ' ' * (length - text.length);
+        }
+        return text;
+      }
+
+      // Compute kind/stack frame information for all expected values plus 3 more
+      // stack elements if available.
+      for (int kindIndex = 0; kindIndex < kinds.length + 3; kindIndex++) {
+        int stackIndex = stack.arrayLength - kindIndex - 1;
+        if (stackIndex < 0 && kindIndex >= kinds.length) {
+          // No more stack elements nor kinds to display.
+          break;
+        }
+        sb.write(padLeft(kindIndex, 4));
+        sb.write(': ');
+        ValueKind kind;
+        if (kindIndex < kinds.length) {
+          kind = kinds[kindIndex];
+          sb.write(padRight(kind, 60));
+        } else {
+          sb.write(padRight('---', 60));
+        }
+        if (stackIndex >= 0) {
+          Object value = stack.array[stackIndex];
+          if (kind == null || checkValue(kind, value)) {
+            sb.write(' ');
+          } else {
+            sb.write('*');
+          }
+          sb.write(safeToString(value));
+          sb.write(' (${value.runtimeType})');
+        } else {
+          if (kind == null) {
+            sb.write(' ');
+          } else {
+            sb.write('*');
+          }
+          sb.write('---');
+        }
+        sb.writeln();
+      }
+
+      String message = '$runtimeType failure\n$sb';
+      if (token != null) {
+        // If offset is available report and internal problem to show the
+        // parsed code in the output.
+        throw internalProblem(
+            new Message(null, message: message), token.charOffset, uri);
+      } else {
+        throw message;
+      }
+    }
+    return success;
+  }
+
   @override
   Uri get uri;
 
@@ -364,7 +471,7 @@
         lengthOfSpan(startToken, endToken));
   }
 
-  bool isIgnoredError(Code code, Token token) {
+  bool isIgnoredError(Code<dynamic> code, Token token) {
     if (code == codeNativeClauseShouldBeAnnotation) {
       // TODO(danrubel): Ignore this error until we deprecate `native`
       // support.
diff --git a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
index a1faa23..c4de27c 100644
--- a/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
+++ b/pkg/front_end/lib/src/fasta/source/type_promotion_look_ahead_listener.dart
@@ -4,12 +4,18 @@
 
 library fasta.type_promotion_look_ahead_listener;
 
-import '../builder/builder.dart' show Declaration;
+import '../builder/builder.dart' show Builder;
 
 import '../messages.dart' show LocatedMessage, Message, MessageCode;
 
 import '../parser.dart'
-    show Assert, IdentifierContext, FormalParameterKind, Listener, MemberKind;
+    show
+        Assert,
+        ClassKind,
+        FormalParameterKind,
+        IdentifierContext,
+        Listener,
+        MemberKind;
 
 import '../problems.dart' as problems show unhandled;
 
@@ -26,7 +32,7 @@
 
   final List<Scope> scopes = <Scope>[new Scope.top(isModifiable: true)];
 
-  final List<Declaration> stack = <Declaration>[];
+  final List<Builder> stack = <Builder>[];
 
   TypePromotionState(this.uri);
 
@@ -57,19 +63,19 @@
 
   void pushReference(Token token) {
     String name = token.lexeme;
-    Declaration declaration = currentScope.lookup(name, token.charOffset, uri);
+    Builder declaration = currentScope.lookup(name, token.charOffset, uri);
     stack.add(declaration);
   }
 
-  Declaration pop() => stack.removeLast();
+  Builder pop() => stack.removeLast();
 
-  void push(Declaration declaration) {
+  void push(Builder declaration) {
     stack.add(declaration);
   }
 
-  Declaration popPushNull(String name, Token token) {
+  Builder popPushNull(String name, Token token) {
     int last = stack.length - 1;
-    Declaration declaration = stack[last];
+    Builder declaration = stack[last];
     stack[last] = nullValue(name, token);
     return declaration;
   }
@@ -82,7 +88,7 @@
     stack.add(nullValue(name, token));
   }
 
-  Declaration nullValue(String name, Token token) => null;
+  Builder nullValue(String name, Token token) => null;
 
   void report(LocatedMessage message, Severity severity,
       {List<LocatedMessage> context});
@@ -92,7 +98,7 @@
   void checkEmpty(Token token) {}
 }
 
-class UnspecifiedDeclaration extends Declaration {
+class UnspecifiedDeclaration extends Builder {
   final String name;
 
   @override
@@ -104,7 +110,7 @@
   UnspecifiedDeclaration(this.name, this.fileUri, this.charOffset);
 
   @override
-  Declaration get parent => null;
+  Builder get parent => null;
 
   @override
   String get fullNameForErrors => name;
@@ -113,7 +119,7 @@
   String toString() => "UnspecifiedDeclaration($name)";
 }
 
-class NoArguments extends Declaration {
+class NoArguments extends Builder {
   NoArguments();
 
   @override
@@ -123,7 +129,7 @@
   int get charOffset => -1;
 
   @override
-  Declaration get parent => null;
+  Builder get parent => null;
 
   @override
   String get fullNameForErrors => "<<no arguments>>";
@@ -192,7 +198,7 @@
   void handleAssignmentExpression(Token token) {
     debugEvent("AssignmentExpression", token);
     state.pop(); // Right-hand side.
-    Declaration lhs = state.popPushNull(token.lexeme, token);
+    Builder lhs = state.popPushNull(token.lexeme, token);
     if (lhs is UnspecifiedDeclaration) {
       state.registerWrite(lhs, token);
     }
@@ -307,7 +313,8 @@
   }
 
   @override
-  void endClassOrMixinBody(int memberCount, Token beginToken, Token endToken) {
+  void endClassOrMixinBody(
+      ClassKind kind, int memberCount, Token beginToken, Token endToken) {
     debugEvent("ClassOrMixinBody", beginToken);
     state.checkEmpty(endToken);
   }
@@ -619,8 +626,14 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     debugEvent("FormalParameter", thisKeyword);
     state.pop(); // Parameter name.
   }
@@ -837,7 +850,7 @@
   @override
   void handleIsOperator(Token isOperator, Token not) {
     debugEvent("IsOperator", isOperator);
-    Declaration lhs = state.popPushNull(isOperator.lexeme, isOperator);
+    Builder lhs = state.popPushNull(isOperator.lexeme, isOperator);
     if (not == null && lhs is UnspecifiedDeclaration) {
       state.registerPromotionCandidate(lhs, isOperator);
     }
@@ -1160,7 +1173,7 @@
   @override
   void handleSend(Token beginToken, Token endToken) {
     debugEvent("Send", beginToken);
-    Declaration arguments = state.pop();
+    Builder arguments = state.pop();
     if (identical(arguments, noArgumentsSentinel)) {
       // Leave the receiver on the stack.
     } else {
@@ -1326,7 +1339,7 @@
   @override
   void handleUnaryPostfixAssignmentExpression(Token token) {
     debugEvent("UnaryPostfixAssignmentExpression", token);
-    Declaration expr = state.popPushNull(token.lexeme, token);
+    Builder expr = state.popPushNull(token.lexeme, token);
     if (expr is UnspecifiedDeclaration) {
       state.registerWrite(expr, token);
     }
@@ -1335,7 +1348,7 @@
   @override
   void handleUnaryPrefixAssignmentExpression(Token token) {
     debugEvent("UnaryPrefixAssignmentExpression", token);
-    Declaration expr = state.popPushNull(token.lexeme, token);
+    Builder expr = state.popPushNull(token.lexeme, token);
     if (expr is UnspecifiedDeclaration) {
       state.registerWrite(expr, token);
     }
diff --git a/pkg/front_end/lib/src/fasta/source/value_kinds.dart b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
new file mode 100644
index 0000000..c9c5f57
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/source/value_kinds.dart
@@ -0,0 +1,138 @@
+// 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:kernel/ast.dart' as type;
+
+import '../builder/builder.dart' as type;
+
+import '../kernel/expression_generator.dart' as type;
+
+import '../modifier.dart' as type;
+
+import '../operator.dart' as type;
+
+import '../scanner.dart' as type show Token;
+
+import '../scope.dart' as type;
+
+import '../source/outline_builder.dart' as type;
+
+import 'stack_listener.dart' show NullValue;
+
+import 'stack_listener.dart' as type;
+
+/// [ValueKind] is used in [StackListener.checkState] to document and check the
+/// expected values of the stack.
+///
+/// Add new value kinds as needed for documenting and checking the various stack
+/// listener implementations.
+abstract class ValueKind {
+  const ValueKind();
+
+  /// Checks the [value] an returns `true` if the value is of the expected kind.
+  bool check(Object value);
+
+  static const ValueKind ArgumentsOrNull =
+      _SingleValueKind<type.Arguments>(NullValue.Arguments);
+  static const ValueKind Expression = _SingleValueKind<type.Expression>();
+  static const ValueKind Identifier = _SingleValueKind<type.Identifier>();
+  static const ValueKind Integer = _SingleValueKind<int>();
+  static const ValueKind Formals =
+      _SingleValueKind<List<type.FormalParameterBuilder>>();
+  static const ValueKind FormalsOrNull =
+      _SingleValueKind<List<type.FormalParameterBuilder>>(
+          NullValue.FormalParameters);
+  static const ValueKind Generator = _SingleValueKind<type.Generator>();
+  static const ValueKind MethodBody = _SingleValueKind<type.MethodBody>();
+  static const ValueKind Modifiers = _SingleValueKind<List<type.Modifier>>();
+  static const ValueKind ModifiersOrNull =
+      _SingleValueKind<List<type.Modifier>>(NullValue.Modifiers);
+  static const ValueKind Name = _SingleValueKind<String>();
+  static const ValueKind NameOrNull = _SingleValueKind<String>(NullValue.Name);
+  static const ValueKind NameOrOperator = _UnionValueKind([Name, Operator]);
+  static const ValueKind NameOrQualifiedNameOrOperator =
+      _UnionValueKind([Name, QualifiedName, Operator]);
+  static const ValueKind NameOrParserRecovery =
+      _UnionValueKind([Name, ParserRecovery]);
+  static const ValueKind MetadataListOrNull =
+      _SingleValueKind<List<type.MetadataBuilder>>(NullValue.Metadata);
+  static const ValueKind Operator = _SingleValueKind<type.Operator>();
+  static const ValueKind ParserRecovery =
+      _SingleValueKind<type.ParserRecovery>();
+  static const ValueKind ProblemBuilder =
+      _SingleValueKind<type.ProblemBuilder>();
+  static const ValueKind QualifiedName = _SingleValueKind<type.QualifiedName>();
+  static const ValueKind Token = _SingleValueKind<type.Token>();
+  static const ValueKind TokenOrNull =
+      _SingleValueKind<type.Token>(NullValue.Token);
+  static const ValueKind TypeArgumentsOrNull =
+      _SingleValueKind<List<type.UnresolvedType>>(NullValue.TypeArguments);
+  static const ValueKind TypeBuilder = _SingleValueKind<type.TypeBuilder>();
+  static const ValueKind TypeBuilderOrNull =
+      _SingleValueKind<type.TypeBuilder>(NullValue.Type);
+  static const ValueKind TypeVariableListOrNull =
+      _SingleValueKind<List<type.TypeVariableBuilder>>(NullValue.TypeVariables);
+}
+
+/// A [ValueKind] for a particular type [T], optionally with a recognized
+/// [NullValue].
+class _SingleValueKind<T> implements ValueKind {
+  final NullValue nullValue;
+
+  const _SingleValueKind([this.nullValue]);
+
+  @override
+  bool check(Object value) {
+    if (nullValue != null && value == nullValue) {
+      return true;
+    }
+    return value is T;
+  }
+
+  String toString() {
+    if (nullValue != null) {
+      return '$T or $nullValue';
+    }
+    return '$T';
+  }
+}
+
+/// A [ValueKind] for the union of a list of [ValueKind]s.
+class _UnionValueKind implements ValueKind {
+  final List<ValueKind> kinds;
+
+  const _UnionValueKind(this.kinds);
+
+  @override
+  bool check(Object value) {
+    for (ValueKind kind in kinds) {
+      if (kind.check(value)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    String or = '';
+    for (ValueKind kind in kinds) {
+      sb.write(or);
+      sb.write(kind);
+      or = ' or ';
+    }
+    return sb.toString();
+  }
+}
+
+/// Helper method for creating a list of [ValueKind]s of the given length
+/// [count].
+List<ValueKind> repeatedKinds(ValueKind kind, int count) {
+  return new List.generate(count, (_) => kind);
+}
+
+/// Helper method for creating a union of a list of [ValueKind]s.
+ValueKind unionOfKinds(List<ValueKind> kinds) {
+  return _UnionValueKind(kinds);
+}
diff --git a/pkg/front_end/lib/src/fasta/target_implementation.dart b/pkg/front_end/lib/src/fasta/target_implementation.dart
index 586100d..dd80c6f 100644
--- a/pkg/front_end/lib/src/fasta/target_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/target_implementation.dart
@@ -10,7 +10,7 @@
 
 import '../base/processed_options.dart' show ProcessedOptions;
 
-import 'builder/builder.dart' show Declaration, ClassBuilder, LibraryBuilder;
+import 'builder/builder.dart' show Builder, ClassBuilder, LibraryBuilder;
 
 import 'compiler_context.dart' show CompilerContext;
 
@@ -41,12 +41,12 @@
   /// Shared with [CompilerContext].
   final Map<Uri, Source> uriToSource = CompilerContext.current.uriToSource;
 
-  Declaration cachedAbstractClassInstantiationError;
-  Declaration cachedCompileTimeError;
-  Declaration cachedDuplicatedFieldInitializerError;
-  Declaration cachedFallThroughError;
-  Declaration cachedNativeAnnotation;
-  Declaration cachedNativeExtensionAnnotation;
+  Builder cachedAbstractClassInstantiationError;
+  Builder cachedCompileTimeError;
+  Builder cachedDuplicatedFieldInitializerError;
+  Builder cachedFallThroughError;
+  Builder cachedNativeAnnotation;
+  Builder cachedNativeExtensionAnnotation;
 
   bool enableConstantUpdate2018;
   bool enableControlFlowCollections;
@@ -91,7 +91,7 @@
   /// [AbstractClassInstantiationError] error.  The constructor is expected to
   /// accept a single argument of type String, which is the name of the
   /// abstract class.
-  Declaration getAbstractClassInstantiationError(Loader loader) {
+  Builder getAbstractClassInstantiationError(Loader loader) {
     if (cachedAbstractClassInstantiationError != null) {
       return cachedAbstractClassInstantiationError;
     }
@@ -102,7 +102,7 @@
   /// Returns a reference to the constructor used for creating a compile-time
   /// error. The constructor is expected to accept a single argument of type
   /// String, which is the compile-time error message.
-  Declaration getCompileTimeError(Loader loader) {
+  Builder getCompileTimeError(Loader loader) {
     if (cachedCompileTimeError != null) return cachedCompileTimeError;
     return cachedCompileTimeError = loader.coreLibrary
         .getConstructor("_CompileTimeError", bypassLibraryPrivacy: true);
@@ -111,7 +111,7 @@
   /// Returns a reference to the constructor used for creating a runtime error
   /// when a final field is initialized twice. The constructor is expected to
   /// accept a single argument which is the name of the field.
-  Declaration getDuplicatedFieldInitializerError(Loader loader) {
+  Builder getDuplicatedFieldInitializerError(Loader loader) {
     if (cachedDuplicatedFieldInitializerError != null) {
       return cachedDuplicatedFieldInitializerError;
     }
@@ -123,7 +123,7 @@
   /// Returns a reference to the constructor used for creating `native`
   /// annotations. The constructor is expected to accept a single argument of
   /// type String, which is the name of the native method.
-  Declaration getNativeAnnotation(Loader loader) {
+  Builder getNativeAnnotation(Loader loader) {
     if (cachedNativeAnnotation != null) return cachedNativeAnnotation;
     LibraryBuilder internal = loader.read(Uri.parse("dart:_internal"), -1,
         accessor: loader.coreLibrary);
diff --git a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
index 92c4884..8a1b4e5 100644
--- a/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
+++ b/pkg/front_end/lib/src/fasta/testing/kernel_chain.dart
@@ -52,6 +52,8 @@
 import '../fasta_codes.dart'
     show templateInternalProblemUnhandled, templateUnspecified;
 
+import '../resolve_input_uri.dart' show isWindows;
+
 import '../util/relativize.dart' show relativizeUri;
 
 final Uri platformBinariesLocation = computePlatformBinariesLocation();
@@ -230,8 +232,10 @@
       printer.writeLibraryFile(library);
       printer.endLine();
     });
+    printer.writeConstantTable(component);
     String actual = "$buffer";
-    String binariesPath = relativizeUri(platformBinariesLocation);
+    String binariesPath =
+        relativizeUri(Uri.base, platformBinariesLocation, isWindows);
     if (binariesPath.endsWith("/dart-sdk/lib/_internal/")) {
       // We are running from the built SDK.
       actual = actual.replaceAll(
diff --git a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
index 2a97c19..b77b943 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/standard_bounds.dart
@@ -141,7 +141,7 @@
       return type2;
     }
 
-    // SUB(Obect, T) = SUB(T, Object) = Object if T is not void or dynamic.
+    // SUB(Object, T) = SUB(T, Object) = Object if T is not void or dynamic.
     if (type1 == objectType) {
       return type1;
     }
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 b28fc43..e23a716 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
@@ -24,24 +24,41 @@
 import '../../base/instrumentation.dart' show Instrumentation;
 
 import '../kernel/kernel_builder.dart'
-    show
-        ClassHierarchyBuilder,
-        ImplicitFieldType,
-        LibraryBuilder,
-        KernelLibraryBuilder;
+    show ClassHierarchyBuilder, ImplicitFieldType, LibraryBuilder;
+
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
 
 import 'type_inferrer.dart' show TypeInferrer;
 
 import 'type_schema_environment.dart' show TypeSchemaEnvironment;
 
+enum Variance {
+  covariant,
+  contravariant,
+  invariant,
+}
+
+Variance invertVariance(Variance variance) {
+  switch (variance) {
+    case Variance.covariant:
+      return Variance.contravariant;
+    case Variance.contravariant:
+      return Variance.covariant;
+    case Variance.invariant:
+  }
+  return variance;
+}
+
 /// Visitor to check whether a given type mentions any of a class's type
-/// parameters in a covariant fashion.
-class IncludesTypeParametersCovariantly extends DartTypeVisitor<bool> {
-  bool inCovariantContext = true;
+/// parameters in a non-covariant fashion.
+class IncludesTypeParametersNonCovariantly extends DartTypeVisitor<bool> {
+  Variance _variance;
 
   final List<TypeParameter> _typeParametersToSearchFor;
 
-  IncludesTypeParametersCovariantly(this._typeParametersToSearchFor);
+  IncludesTypeParametersNonCovariantly(this._typeParametersToSearchFor,
+      {Variance initialVariance})
+      : _variance = initialVariance;
 
   @override
   bool defaultDartType(DartType node) => false;
@@ -49,18 +66,20 @@
   @override
   bool visitFunctionType(FunctionType node) {
     if (node.returnType.accept(this)) return true;
-    try {
-      inCovariantContext = !inCovariantContext;
-      for (var parameter in node.positionalParameters) {
-        if (parameter.accept(this)) return true;
-      }
-      for (var parameter in node.namedParameters) {
-        if (parameter.type.accept(this)) return true;
-      }
-      return false;
-    } finally {
-      inCovariantContext = !inCovariantContext;
+    Variance oldVariance = _variance;
+    _variance = Variance.invariant;
+    for (var parameter in node.typeParameters) {
+      if (parameter.bound.accept(this)) return true;
     }
+    _variance = invertVariance(oldVariance);
+    for (var parameter in node.positionalParameters) {
+      if (parameter.accept(this)) return true;
+    }
+    for (var parameter in node.namedParameters) {
+      if (parameter.type.accept(this)) return true;
+    }
+    _variance = oldVariance;
+    return false;
   }
 
   @override
@@ -78,7 +97,7 @@
 
   @override
   bool visitTypeParameterType(TypeParameterType node) {
-    return inCovariantContext &&
+    return _variance != Variance.covariant &&
         _typeParametersToSearchFor.contains(node.parameter);
   }
 }
@@ -123,12 +142,12 @@
   /// Creates a type inferrer for use inside of a method body declared in a file
   /// with the given [uri].
   TypeInferrer createLocalTypeInferrer(
-      Uri uri, InterfaceType thisType, KernelLibraryBuilder library);
+      Uri uri, InterfaceType thisType, SourceLibraryBuilder library);
 
   /// Creates a [TypeInferrer] object which is ready to perform type inference
   /// on the given [field].
   TypeInferrer createTopLevelTypeInferrer(
-      Uri uri, InterfaceType thisType, KernelLibraryBuilder library);
+      Uri uri, InterfaceType thisType, SourceLibraryBuilder library);
 
   /// Performs the third phase of top level inference, which is to visit all
   /// constructors still needing inference and infer the types of their
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 6c30926..0bd0d70 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
@@ -96,9 +96,7 @@
         templateUndefinedMethod,
         templateUndefinedSetter;
 
-import '../kernel/kernel_builder.dart' show KernelLibraryBuilder;
-
-import '../kernel/kernel_expression_generator.dart' show buildIsNull;
+import '../kernel/expression_generator.dart' show buildIsNull;
 
 import '../kernel/kernel_shadow_ast.dart'
     show
@@ -115,12 +113,14 @@
 
 import '../problems.dart' show internalProblem, unexpected, unhandled;
 
+import '../source/source_library_builder.dart' show SourceLibraryBuilder;
+
 import 'inference_helper.dart' show InferenceHelper;
 
 import 'type_constraint_gatherer.dart' show TypeConstraintGatherer;
 
 import 'type_inference_engine.dart'
-    show IncludesTypeParametersCovariantly, TypeInferenceEngine;
+    show IncludesTypeParametersNonCovariantly, TypeInferenceEngine, Variance;
 
 import 'type_promotion.dart' show TypePromoter;
 
@@ -451,9 +451,9 @@
       Uri uri,
       bool topLevel,
       InterfaceType thisType,
-      KernelLibraryBuilder library) = ShadowTypeInferrer.private;
+      SourceLibraryBuilder library) = ShadowTypeInferrer.private;
 
-  KernelLibraryBuilder get library;
+  SourceLibraryBuilder get library;
 
   /// Gets the [TypePromoter] that can be used to perform type promotion within
   /// this method body or initializer.
@@ -521,7 +521,7 @@
   final InterfaceType thisType;
 
   @override
-  final KernelLibraryBuilder library;
+  final SourceLibraryBuilder library;
 
   final Map<TreeNode, DartType> inferredTypesMap = <TreeNode, DartType>{};
 
@@ -1091,11 +1091,11 @@
         interfaceMember != null &&
         receiver is! ThisExpression) {
       if (interfaceMember is Procedure) {
-        checkReturn = typeParametersOccurNegatively(
+        checkReturn = returnedTypeParametersOccurNonCovariantly(
             interfaceMember.enclosingClass,
             interfaceMember.function.returnType);
       } else if (interfaceMember is Field) {
-        checkReturn = typeParametersOccurNegatively(
+        checkReturn = returnedTypeParametersOccurNonCovariantly(
             interfaceMember.enclosingClass, interfaceMember.type);
       }
     }
@@ -1708,16 +1708,27 @@
     return tearoffType;
   }
 
-  /// True if [type] has negative occurrences of any of [class_]'s type
-  /// parameters.
+  /// True if the returned [type] has non-covariant occurrences of any of
+  /// [class_]'s type parameters.
   ///
-  /// A negative occurrence of a type parameter is one that is to the left of
-  /// an odd number of arrows.  For example, T occurs negatively in T -> T0,
-  /// T0 -> (T -> T1), (T0 -> T) -> T1 but not in (T -> T0) -> T1.
-  static bool typeParametersOccurNegatively(Class class_, DartType type) {
+  /// A non-covariant occurrence of a type parameter is either a contravariant
+  /// or an invariant position.
+  ///
+  /// A contravariant position is to the left of an odd number of arrows. For
+  /// example, T occurs contravariantly in T -> T0, T0 -> (T -> T1),
+  /// (T0 -> T) -> T1 but not in (T -> T0) -> T1.
+  ///
+  /// An invariant position is without a bound of a type parameter. For example,
+  /// T occurs invariantly in `S Function<S extends T>()` and
+  /// `void Function<S extends C<T>>(S)`.
+  static bool returnedTypeParametersOccurNonCovariantly(
+      Class class_, DartType type) {
     if (class_.typeParameters.isEmpty) return false;
-    var checker = new IncludesTypeParametersCovariantly(class_.typeParameters)
-      ..inCovariantContext = false;
+    IncludesTypeParametersNonCovariantly checker =
+        new IncludesTypeParametersNonCovariantly(class_.typeParameters,
+            // We are checking the returned type (field/getter type or return
+            // type of a method) and this is a covariant position.
+            initialVariance: Variance.covariant);
     return type.accept(checker);
   }
 
@@ -1740,10 +1751,11 @@
       }
       if (receiver != null && receiver is! ThisExpression) {
         if ((interfaceMember is Field &&
-                typeParametersOccurNegatively(
+                returnedTypeParametersOccurNonCovariantly(
                     interfaceMember.enclosingClass, interfaceMember.type)) ||
             (interfaceMember is Procedure &&
-                typeParametersOccurNegatively(interfaceMember.enclosingClass,
+                returnedTypeParametersOccurNonCovariantly(
+                    interfaceMember.enclosingClass,
                     interfaceMember.function.returnType))) {
           return MethodContravarianceCheckKind.checkGetterReturn;
         }
@@ -1751,7 +1763,8 @@
     } else if (receiver != null &&
         receiver is! ThisExpression &&
         interfaceMember is Procedure &&
-        typeParametersOccurNegatively(interfaceMember.enclosingClass,
+        returnedTypeParametersOccurNonCovariantly(
+            interfaceMember.enclosingClass,
             interfaceMember.function.returnType)) {
       return MethodContravarianceCheckKind.checkMethodReturn;
     }
@@ -1925,7 +1938,7 @@
       // abstract class M<X0, ..., Xn> extends S0&S1<...>
       //
       // for a VM-style super mixin.  The type parameters of S0&S1 are the X0,
-      // ..., Xn that occured free in S0 and S1.  Treat S0 and S1 as separate
+      // ..., Xn that occurred free in S0 and S1.  Treat S0 and S1 as separate
       // supertype constraints by recursively calling this algorithm.
       //
       // In the Dart VM the mixin application classes themselves are all
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
index 80c10e5..69c352e 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_promotion.dart
@@ -181,7 +181,7 @@
   TypePromotionFact _trueFactsForPromotionExpression;
 
   /// Linked list of [TypePromotionScope]s describing the nesting structure that
-  /// contains the expressoin or statement that was most recently parsed.
+  /// contains the expression or statement that was most recently parsed.
   TypePromotionScope _currentScope = const _TopLevelScope();
 
   /// The sequence number of the [TypePromotionFact] that was most recently
@@ -401,7 +401,7 @@
   /// Returns the set of facts known to be true after the execution of [e]
   /// assuming it evaluates to `false`.
   ///
-  /// [e] must be the most resently parsed expression or statement.
+  /// [e] must be the most recently parsed expression or statement.
   TypePromotionFact _factsWhenFalse(Expression e) {
     // Type promotion currently only occurs when an "is" or logical expression
     // evaluates to `true`, so no special logic is required; we just use
@@ -415,7 +415,7 @@
   /// Returns the set of facts known to be true after the execution of [e]
   /// assuming it evaluates to `true`.
   ///
-  /// [e] must be the most resently parsed expression or statement.
+  /// [e] must be the most recently parsed expression or statement.
   TypePromotionFact _factsWhenTrue(Expression e) =>
       sameExpressions(_promotionExpression, e)
           ? _trueFactsForPromotionExpression
@@ -470,9 +470,9 @@
   }
 
   /// Records that after the evaluation of [expression], the facts will be
-  /// [ifTrue] on a branch where the expression evaluted to `true`, and
+  /// [ifTrue] on a branch where the expression evaluated to `true`, and
   /// [ifFalse] on a branch where the expression evaluated to `false` (or where
-  /// the truth value of the expresison doesn't matter).
+  /// the truth value of the expression doesn't matter).
   ///
   /// TODO(paulberry): when we start handling promotion in "else" clauses, we'll
   /// need to split [ifFalse] into two cases, one for when the expression
@@ -506,7 +506,7 @@
 /// the fact was deduced at a previous point in the straight line execution of
 /// the code.  It's possible that the fact will be overshadowed by a later
 /// fact, or its effect will be cancelled by a later assignment.  The final
-/// detemination of whether promotion occurs is left to [_computePromotedType].
+/// determination of whether promotion occurs is left to [_computePromotedType].
 abstract class TypePromotionFact {
   /// The variable this fact records information about, or `null` if this fact
   /// records information about general flow control.
diff --git a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
index 01418ae..a47eda7 100644
--- a/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
+++ b/pkg/front_end/lib/src/fasta/type_inference/type_schema.dart
@@ -76,8 +76,8 @@
   }
 
   @override
-  accept(DartTypeVisitor v) {
-    if (v is TypeSchemaVisitor) {
+  accept(DartTypeVisitor<dynamic> v) {
+    if (v is TypeSchemaVisitor<dynamic>) {
       return v.visitUnknownType(this);
     } else {
       // Note: in principle it seems like this should throw, since any visitor
@@ -90,10 +90,11 @@
   }
 
   @override
-  accept1(DartTypeVisitor1 v, arg) => v.defaultDartType(this, arg);
+  accept1(DartTypeVisitor1<dynamic, dynamic> v, arg) =>
+      v.defaultDartType(this, arg);
 
   @override
-  visitChildren(Visitor v) {}
+  visitChildren(Visitor<dynamic> v) {}
 }
 
 /// Visitor that computes [isKnown].
diff --git a/pkg/front_end/lib/src/fasta/uri_translator.dart b/pkg/front_end/lib/src/fasta/uri_translator.dart
index 6a3b3a9..4d0d91e 100644
--- a/pkg/front_end/lib/src/fasta/uri_translator.dart
+++ b/pkg/front_end/lib/src/fasta/uri_translator.dart
@@ -38,6 +38,18 @@
     return null;
   }
 
+  /// For a package uri, get the fragment of the uri specified for that package.
+  String getPackageFragment(Uri uri) {
+    if (packages == null) return null;
+    if (uri.scheme != "package") return null;
+    int firstSlash = uri.path.indexOf('/');
+    if (firstSlash == -1) return null;
+    String packageName = uri.path.substring(0, firstSlash);
+    Uri packageBaseUri = packages.asMap()[packageName];
+    if (packageBaseUri == null) return null;
+    return packageBaseUri.fragment;
+  }
+
   bool isLibrarySupported(String libraryName) {
     // TODO(sigmund): change this to `?? false` when all backends provide the
     // `libraries.json` file by default (Issue #32657).
diff --git a/pkg/front_end/lib/src/fasta/util/link.dart b/pkg/front_end/lib/src/fasta/util/link.dart
index 4debdc7..3f7a204 100644
--- a/pkg/front_end/lib/src/fasta/util/link.dart
+++ b/pkg/front_end/lib/src/fasta/util/link.dart
@@ -43,12 +43,12 @@
 
   /// Invokes `fn` for every item in the linked list and returns the results
   /// in a [List].
-  List mapToList(dynamic fn(T item), {bool growable: true}) {
-    List result;
+  List<E> mapToList<E>(E fn(T item), {bool growable: true}) {
+    List<E> result;
     if (!growable) {
-      result = new List(slowLength());
+      result = new List<E>(slowLength());
     } else {
-      result = new List();
+      result = new List<E>();
       result.length = slowLength();
     }
     int i = 0;
diff --git a/pkg/front_end/lib/src/fasta/util/link_implementation.dart b/pkg/front_end/lib/src/fasta/util/link_implementation.dart
index 9849ecb..091d055 100644
--- a/pkg/front_end/lib/src/fasta/util/link_implementation.dart
+++ b/pkg/front_end/lib/src/fasta/util/link_implementation.dart
@@ -74,7 +74,7 @@
   void printOn(StringBuffer buffer, [separatedBy]) {
     buffer.write(head);
     if (separatedBy == null) separatedBy = '';
-    for (Link link = tail; link.isNotEmpty; link = link.tail) {
+    for (Link<T> link = tail; link.isNotEmpty; link = link.tail) {
       buffer.write(separatedBy);
       buffer.write(link.head);
     }
@@ -142,7 +142,7 @@
 
   int slowLength() {
     int length = 0;
-    for (Link current = this; current.isNotEmpty; current = current.tail) {
+    for (Link<T> current = this; current.isNotEmpty; current = current.tail) {
       ++length;
     }
     return length;
diff --git a/pkg/front_end/lib/src/fasta/util/relativize.dart b/pkg/front_end/lib/src/fasta/util/relativize.dart
index ab7406b..df4f926 100644
--- a/pkg/front_end/lib/src/fasta/util/relativize.dart
+++ b/pkg/front_end/lib/src/fasta/util/relativize.dart
@@ -4,14 +4,70 @@
 
 library fasta.util.relativize;
 
-// TODO(ahe): Move more advanced version from dart2js here.
+import 'dart:math';
 
-final Uri currentDirectory = Uri.base;
+String relativizeUri(Uri base, Uri uri, bool isWindows) {
+  bool equalsNCS(String a, String b) {
+    return a.toLowerCase() == b.toLowerCase();
+  }
 
-String relativizeUri(Uri uri, {Uri base}) {
-  if (uri == null) return null;
-  base ??= currentDirectory;
-  String result = "$uri";
-  final prefix = "$base";
-  return result.startsWith(prefix) ? result.substring(prefix.length) : result;
+  if (!equalsNCS(base.scheme, uri.scheme) ||
+      equalsNCS(base.scheme, 'dart') ||
+      equalsNCS(base.scheme, 'package')) {
+    return uri.toString();
+  }
+
+  if (!equalsNCS(base.scheme, 'file')) {
+    isWindows = false;
+  }
+
+  String normalize(String path) {
+    if (isWindows) {
+      return path.toLowerCase();
+    } else {
+      return path;
+    }
+  }
+
+  if (base.userInfo == uri.userInfo &&
+      equalsNCS(base.host, uri.host) &&
+      base.port == uri.port &&
+      uri.query == "" &&
+      uri.fragment == "") {
+    if (normalize(uri.path).startsWith(normalize(base.path))) {
+      return uri.path.substring(base.path.lastIndexOf('/') + 1);
+    }
+
+    if (!base.path.startsWith('/') || !uri.path.startsWith('/')) {
+      return uri.toString();
+    }
+
+    List<String> uriParts = uri.path.split('/');
+    List<String> baseParts = base.path.split('/');
+    int common = 0;
+    int length = min(uriParts.length, baseParts.length);
+    while (common < length &&
+        normalize(uriParts[common]) == normalize(baseParts[common])) {
+      common++;
+    }
+    if (common == 1 || (isWindows && common == 2)) {
+      // The first part will always be an empty string because the
+      // paths are absolute. On Windows, we must also consider drive
+      // letters or hostnames.
+      if (baseParts.length > common + 1) {
+        // Avoid using '..' to go to the root, unless we are already there.
+        return uri.path;
+      }
+    }
+    StringBuffer sb = new StringBuffer();
+    for (int i = common + 1; i < baseParts.length; i++) {
+      sb.write('../');
+    }
+    for (int i = common; i < uriParts.length - 1; i++) {
+      sb.write('${uriParts[i]}/');
+    }
+    sb.write('${uriParts.last}');
+    return sb.toString();
+  }
+  return uri.toString();
 }
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index f967227..cfdf775 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -7,6 +7,7 @@
 
 import 'dart:async' show Future;
 
+import 'package:front_end/src/fasta/kernel/kernel_api.dart';
 import 'package:kernel/kernel.dart' show Component, CanonicalName;
 
 import 'base/processed_options.dart' show ProcessedOptions;
@@ -29,6 +30,8 @@
 
 import 'fasta/uri_translator.dart' show UriTranslator;
 
+import 'api_prototype/front_end.dart' show CompilerResult;
+
 /// Implementation for the
 /// `package:front_end/src/api_prototype/kernel_generator.dart` and
 /// `package:front_end/src/api_prototype/summary_generator.dart` APIs.
@@ -36,13 +39,15 @@
     {bool buildSummary: false,
     bool buildComponent: true,
     bool truncateSummary: false,
-    bool includeOffsets: true}) async {
+    bool includeOffsets: true,
+    bool includeHierarchyAndCoreTypes: false}) async {
   return await CompilerContext.runWithOptions(options, (_) async {
     return await generateKernelInternal(
         buildSummary: buildSummary,
         buildComponent: buildComponent,
         truncateSummary: truncateSummary,
-        includeOffsets: includeOffsets);
+        includeOffsets: includeOffsets,
+        includeHierarchyAndCoreTypes: includeHierarchyAndCoreTypes);
   });
 }
 
@@ -50,7 +55,9 @@
     {bool buildSummary: false,
     bool buildComponent: true,
     bool truncateSummary: false,
-    bool includeOffsets: true}) async {
+    bool includeOffsets: true,
+    bool retainDataForTesting: false,
+    bool includeHierarchyAndCoreTypes: false}) async {
   var options = CompilerContext.current.options;
   var fs = options.fileSystem;
 
@@ -156,15 +163,20 @@
       options.ticker.logMs("Generated component");
     }
 
-    return new CompilerResult(
+    return new InternalCompilerResult(
         summary: summary,
         component: component,
-        deps: new List<Uri>.from(CompilerContext.current.dependencies));
+        classHierarchy:
+            includeHierarchyAndCoreTypes ? kernelTarget.loader.hierarchy : null,
+        coreTypes:
+            includeHierarchyAndCoreTypes ? kernelTarget.loader.coreTypes : null,
+        deps: new List<Uri>.from(CompilerContext.current.dependencies),
+        kernelTargetForTesting: retainDataForTesting ? kernelTarget : null);
   }, () => sourceLoader?.currentUriForCrashReporting ?? options.inputs.first);
 }
 
 /// Result object of [generateKernel].
-class CompilerResult {
+class InternalCompilerResult implements CompilerResult {
   /// The generated summary bytes, if it was requested.
   final List<int> summary;
 
@@ -173,9 +185,24 @@
 
   /// Dependencies traversed by the compiler. Used only for generating
   /// dependency .GN files in the dart-sdk build system.
-  /// Note this might be removed when we switch to compute depencencies without
+  /// Note this might be removed when we switch to compute dependencies without
   /// using the compiler itself.
   final List<Uri> deps;
 
-  CompilerResult({this.summary, this.component, this.deps});
+  final ClassHierarchy classHierarchy;
+
+  final CoreTypes coreTypes;
+
+  /// The [KernelTarget] used to generated the component.
+  ///
+  /// This is only provided for use in testing.
+  final KernelTarget kernelTargetForTesting;
+
+  InternalCompilerResult(
+      {this.summary,
+      this.component,
+      this.deps,
+      this.classHierarchy,
+      this.coreTypes,
+      this.kernelTargetForTesting});
 }
diff --git a/pkg/front_end/lib/src/scanner/errors.dart b/pkg/front_end/lib/src/scanner/errors.dart
index 1ca75e5..ffd2d7f 100644
--- a/pkg/front_end/lib/src/scanner/errors.dart
+++ b/pkg/front_end/lib/src/scanner/errors.dart
@@ -118,8 +118,6 @@
     case "UNTERMINATED_STRING_LITERAL":
       // TODO(paulberry,ahe): Fasta reports the error location as the entire
       // string; analyzer expects the end of the string.
-      // TODO(danrubel): Remove this once all analyzer clients
-      // can process errors via the scanner's errors list.
       reportError(
           ScannerErrorCode.UNTERMINATED_STRING_LITERAL, endOffset - 1, null);
       return;
@@ -127,8 +125,9 @@
     case "UNTERMINATED_MULTI_LINE_COMMENT":
       // TODO(paulberry,ahe): Fasta reports the error location as the entire
       // comment; analyzer expects the end of the comment.
-      charOffset = endOffset;
-      return _makeError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT, null);
+      reportError(ScannerErrorCode.UNTERMINATED_MULTI_LINE_COMMENT,
+          endOffset - 1, null);
+      return;
 
     case "MISSING_DIGIT":
       // TODO(paulberry,ahe): Fasta reports the error location as the entire
diff --git a/pkg/front_end/lib/src/testing/annotated_code_helper.dart b/pkg/front_end/lib/src/testing/annotated_code_helper.dart
index 068fcca..6b16622 100644
--- a/pkg/front_end/lib/src/testing/annotated_code_helper.dart
+++ b/pkg/front_end/lib/src/testing/annotated_code_helper.dart
@@ -182,20 +182,27 @@
 /// [AnnotatedCode] objects.
 Map<String, AnnotatedCode> splitByPrefixes(
     AnnotatedCode annotatedCode, Iterable<String> prefixes) {
+  Set<String> prefixSet = prefixes.toSet();
   Map<String, List<Annotation>> map = <String, List<Annotation>>{};
-  for (String prefix in prefixes) {
+  for (String prefix in prefixSet) {
     map[prefix] = <Annotation>[];
   }
   outer:
   for (Annotation annotation in annotatedCode.annotations) {
-    for (String prefix in prefixes) {
-      if (annotation.text.startsWith(prefix)) {
-        map[prefix].add(new Annotation(annotation.lineNo, annotation.columnNo,
-            annotation.offset, annotation.text.substring(prefix.length)));
+    int dotPos = annotation.text.indexOf('.');
+    if (dotPos != -1) {
+      String annotationPrefix = annotation.text.substring(0, dotPos);
+      String annotationText = annotation.text.substring(dotPos + 1);
+      List<String> markers = annotationPrefix.split('|').toList();
+      if (prefixSet.containsAll(markers)) {
+        for (String part in markers) {
+          map[part].add(new Annotation(annotation.lineNo, annotation.columnNo,
+              annotation.offset, annotationText));
+        }
         continue outer;
       }
     }
-    for (String prefix in prefixes) {
+    for (String prefix in prefixSet) {
       map[prefix].add(annotation);
     }
   }
diff --git a/pkg/front_end/lib/src/testing/compiler_common.dart b/pkg/front_end/lib/src/testing/compiler_common.dart
index b050725..a328e0e 100644
--- a/pkg/front_end/lib/src/testing/compiler_common.dart
+++ b/pkg/front_end/lib/src/testing/compiler_common.dart
@@ -10,9 +10,15 @@
 import 'package:kernel/ast.dart' show Library, Component;
 
 import '../api_prototype/front_end.dart'
-    show CompilerOptions, kernelForComponent, kernelForProgram, summaryFor;
+    show
+        CompilerOptions,
+        CompilerResult,
+        kernelForModule,
+        kernelForProgramInternal,
+        summaryFor;
 
-import '../api_prototype/memory_file_system.dart' show MemoryFileSystem;
+import '../api_prototype/memory_file_system.dart'
+    show MemoryFileSystem, MemoryFileSystemEntity;
 
 import '../compute_platform_binaries_location.dart'
     show computePlatformBinariesLocation;
@@ -26,11 +32,12 @@
 /// compiles the entry whose name is [fileName].
 ///
 /// Wraps [kernelForProgram] with some default testing options (see [setup]).
-Future<Component> compileScript(dynamic scriptOrSources,
+Future<CompilerResult> compileScript(dynamic scriptOrSources,
     {fileName: 'main.dart',
     List<String> inputSummaries: const [],
     List<String> linkedDependencies: const [],
-    CompilerOptions options}) async {
+    CompilerOptions options,
+    bool retainDataForTesting: false}) async {
   options ??= new CompilerOptions();
   Map<String, dynamic> sources;
   if (scriptOrSources is String) {
@@ -41,12 +48,13 @@
   }
   await setup(options, sources,
       inputSummaries: inputSummaries, linkedDependencies: linkedDependencies);
-  return await kernelForProgram(toTestUri(fileName), options);
+  return await kernelForProgramInternal(toTestUri(fileName), options,
+      retainDataForTesting: retainDataForTesting);
 }
 
-/// Generate a component for a modular complation unit.
+/// Generate a component for a modular compilation unit.
 ///
-/// Wraps [kernelForComponent] with some default testing options (see [setup]).
+/// Wraps [kernelForModule] with some default testing options (see [setup]).
 Future<Component> compileUnit(List<String> inputs, Map<String, dynamic> sources,
     {List<String> inputSummaries: const [],
     List<String> linkedDependencies: const [],
@@ -54,10 +62,11 @@
   options ??= new CompilerOptions();
   await setup(options, sources,
       inputSummaries: inputSummaries, linkedDependencies: linkedDependencies);
-  return await kernelForComponent(inputs.map(toTestUri).toList(), options);
+  return (await kernelForModule(inputs.map(toTestUri).toList(), options))
+      .component;
 }
 
-/// Generate a summary for a modular complation unit.
+/// Generate a summary for a modular compilation unit.
 ///
 /// Wraps [summaryFor] with some default testing options (see [setup]).
 Future<List<int>> summarize(List<String> inputs, Map<String, dynamic> sources,
@@ -77,7 +86,7 @@
 ///   contain either source files (value is [String]) or .dill files (value
 ///   is [List<int>]).
 ///
-///   * define an empty .packages file
+///   * define an empty .packages file (if one isn't defined in sources)
 ///
 ///   * specify the location of the sdk summaries.
 Future<Null> setup(CompilerOptions options, Map<String, dynamic> sources,
@@ -92,7 +101,9 @@
       entity.writeAsBytesSync(data);
     }
   });
-  fs.entityForUri(toTestUri('.packages')).writeAsStringSync('');
+  MemoryFileSystemEntity dotPackagesFile =
+      fs.entityForUri(toTestUri('.packages'));
+  if (!await dotPackagesFile.exists()) dotPackagesFile.writeAsStringSync('');
   fs
       .entityForUri(invalidCoreLibsSpecUri)
       .writeAsStringSync(_invalidLibrariesSpec);
diff --git a/pkg/front_end/lib/src/testing/features.dart b/pkg/front_end/lib/src/testing/features.dart
new file mode 100644
index 0000000..7c6e5b8
--- /dev/null
+++ b/pkg/front_end/lib/src/testing/features.dart
@@ -0,0 +1,285 @@
+// 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 'id_testing.dart';
+
+/// Utility class for annotated testing representing a set of features.
+class Features {
+  Map<String, Object> _features = {};
+  Set<String> _unsorted = new Set<String>();
+
+  /// Mark the feature [key] as existing. If [value] is provided, the feature
+  /// [key] is set to have this value.
+  void add(String key, {var value: ''}) {
+    _features[key] = value.toString();
+  }
+
+  /// Add [value] as an element of the list values of feature [key].
+  void addElement(String key, [var value]) {
+    List<String> list = _features.putIfAbsent(key, () => <String>[]);
+    if (value != null) {
+      list.add(value.toString());
+    }
+  }
+
+  /// Marks list values of [key] as unsorted. This prevents the [getText]
+  /// representation from automatically sorting the values.
+  void markAsUnsorted(String key) {
+    _unsorted.add(key);
+  }
+
+  /// Returns `true` if feature [key] exists.
+  bool containsKey(String key) {
+    return _features.containsKey(key);
+  }
+
+  /// Set the feature [key] to exist with the [value].
+  void operator []=(String key, String value) {
+    _features[key] = value;
+  }
+
+  /// Returns the value set for feature [key].
+  Object operator [](String key) => _features[key];
+
+  /// Removes the value set for feature [key]. Returns the existing value.
+  Object remove(String key) => _features.remove(key);
+
+  /// Returns `true` if this feature set is empty.
+  bool get isEmpty => _features.isEmpty;
+
+  /// Returns `true` if this feature set is non-empty.
+  bool get isNotEmpty => _features.isNotEmpty;
+
+  /// Call [f] for each feature in this feature set with its corresponding
+  /// value.
+  void forEach(void Function(String, Object) f) {
+    _features.forEach(f);
+  }
+
+  /// Returns a string containing all features in a comma-separated list sorted
+  /// by feature names.
+  String getText() {
+    StringBuffer sb = new StringBuffer();
+    bool needsComma = false;
+    for (String name in _features.keys.toList()..sort()) {
+      dynamic value = _features[name];
+      if (value != null) {
+        if (needsComma) {
+          sb.write(',');
+        }
+        sb.write(name);
+        if (value is List<String>) {
+          if (_unsorted.contains(name)) {
+            value = '[${value.join(',')}]';
+          } else {
+            value = '[${(value..sort()).join(',')}]';
+          }
+        }
+        if (value != '') {
+          sb.write('=');
+          sb.write(value);
+        }
+        needsComma = true;
+      }
+    }
+    return sb.toString();
+  }
+
+  @override
+  String toString() => 'Features(${getText()})';
+
+  /// Creates a [Features] object by parse the [text] encoding.
+  ///
+  /// Single features will be parsed as strings and list features (features
+  /// encoded in `[...]` will be parsed as lists of strings.
+  static Features fromText(String text) {
+    Features features = new Features();
+    if (text == null) return features;
+    int index = 0;
+    while (index < text.length) {
+      int eqPos = text.indexOf('=', index);
+      int commaPos = text.indexOf(',', index);
+      String name;
+      bool hasValue = false;
+      if (eqPos != -1 && commaPos != -1) {
+        if (eqPos < commaPos) {
+          name = text.substring(index, eqPos);
+          hasValue = true;
+          index = eqPos + 1;
+        } else {
+          name = text.substring(index, commaPos);
+          index = commaPos + 1;
+        }
+      } else if (eqPos != -1) {
+        name = text.substring(index, eqPos);
+        hasValue = true;
+        index = eqPos + 1;
+      } else if (commaPos != -1) {
+        name = text.substring(index, commaPos);
+        index = commaPos + 1;
+      } else {
+        name = text.substring(index);
+        index = text.length;
+      }
+      if (hasValue) {
+        const Map<String, String> delimiters = const {
+          '[': ']',
+          '{': '}',
+          '(': ')',
+          '<': '>'
+        };
+        List<String> endDelimiters = <String>[];
+        bool isList = index < text.length && text.startsWith('[', index);
+        if (isList) {
+          features.addElement(name);
+          endDelimiters.add(']');
+          index++;
+        }
+        int valueStart = index;
+        while (index < text.length) {
+          String char = text.substring(index, index + 1);
+          if (endDelimiters.isNotEmpty && endDelimiters.last == char) {
+            endDelimiters.removeLast();
+            index++;
+          } else {
+            String endDelimiter = delimiters[char];
+            if (endDelimiter != null) {
+              endDelimiters.add(endDelimiter);
+              index++;
+            } else if (char == ',') {
+              if (endDelimiters.isEmpty) {
+                break;
+              } else if (endDelimiters.length == 1 && isList) {
+                String value = text.substring(valueStart, index);
+                features.addElement(name, value);
+                index++;
+                valueStart = index;
+              } else {
+                index++;
+              }
+            } else {
+              index++;
+            }
+          }
+        }
+        if (isList) {
+          String value = text.substring(valueStart, index - 1);
+          if (value.isNotEmpty) {
+            features.addElement(name, value);
+          }
+        } else {
+          String value = text.substring(valueStart, index);
+          features.add(name, value: value);
+        }
+        index++;
+      } else {
+        features.add(name);
+      }
+    }
+    return features;
+  }
+}
+
+class FeaturesDataInterpreter implements DataInterpreter<Features> {
+  const FeaturesDataInterpreter();
+
+  @override
+  String isAsExpected(Features actualFeatures, String expectedData) {
+    if (expectedData == '*') {
+      return null;
+    } else if (expectedData == '') {
+      return actualFeatures.isNotEmpty ? "Expected empty data." : null;
+    } else {
+      List<String> errorsFound = [];
+      Features expectedFeatures = Features.fromText(expectedData);
+      Set<String> validatedFeatures = new Set<String>();
+      expectedFeatures.forEach((String key, Object expectedValue) {
+        bool expectMatch = true;
+        if (key.startsWith('!')) {
+          key = key.substring(1);
+          expectMatch = false;
+        }
+        validatedFeatures.add(key);
+        Object actualValue = actualFeatures[key];
+        if (!expectMatch) {
+          if (actualFeatures.containsKey(key)) {
+            errorsFound.add('Unexpected data found for $key=$actualValue');
+          }
+        } else if (!actualFeatures.containsKey(key)) {
+          errorsFound.add('No data found for $key');
+        } else if (expectedValue == '') {
+          if (actualValue != '') {
+            errorsFound.add('Non-empty data found for $key');
+          }
+        } else if (expectedValue == '*') {
+          return;
+        } else if (expectedValue is List) {
+          if (actualValue is List) {
+            List actualList = actualValue.toList();
+            for (Object expectedObject in expectedValue) {
+              String expectedText = '$expectedObject';
+              bool matchFound = false;
+              if (expectedText.endsWith('*')) {
+                // Wildcard matcher.
+                String prefix =
+                    expectedText.substring(0, expectedText.indexOf('*'));
+                List matches = [];
+                for (Object actualObject in actualList) {
+                  if ('$actualObject'.startsWith(prefix)) {
+                    matches.add(actualObject);
+                    matchFound = true;
+                  }
+                }
+                for (Object match in matches) {
+                  actualList.remove(match);
+                }
+              } else {
+                for (Object actualObject in actualList) {
+                  if (expectedText == '$actualObject') {
+                    actualList.remove(actualObject);
+                    matchFound = true;
+                    break;
+                  }
+                }
+              }
+              if (!matchFound) {
+                errorsFound.add("No match found for $key=[$expectedText]");
+              }
+            }
+            if (actualList.isNotEmpty) {
+              errorsFound
+                  .add("Extra data found $key=[${actualList.join(',')}]");
+            }
+          } else {
+            errorsFound.add("List data expected for $key: "
+                "expected '$expectedValue', found '${actualValue}'");
+          }
+        } else if (expectedValue != actualValue) {
+          errorsFound.add(
+              "Mismatch for $key: expected '$expectedValue', found '${actualValue}'");
+        }
+      });
+      actualFeatures.forEach((String key, Object value) {
+        if (!validatedFeatures.contains(key)) {
+          if (value == '') {
+            errorsFound.add("Extra data found '$key'");
+          } else {
+            errorsFound.add("Extra data found $key=$value");
+          }
+        }
+      });
+      return errorsFound.isNotEmpty ? errorsFound.join('\n ') : null;
+    }
+  }
+
+  @override
+  String getText(Features actualData) {
+    return actualData.getText();
+  }
+
+  @override
+  bool isEmpty(Features actualData) {
+    return actualData == null || actualData.isEmpty;
+  }
+}
diff --git a/pkg/front_end/lib/src/testing/id.dart b/pkg/front_end/lib/src/testing/id.dart
index d8b7b77..f0b323e 100644
--- a/pkg/front_end/lib/src/testing/id.dart
+++ b/pkg/front_end/lib/src/testing/id.dart
@@ -3,20 +3,55 @@
 // BSD-style license that can be found in the LICENSE file.
 
 enum IdKind {
+  /// Id used for top level or class members. This is used in [MemberId].
   member,
+
+  /// Id used for classes. This is used in [ClassId].
   cls,
+
+  /// Id used for libraries. This is used in [LibraryId].
+  library,
+
+  /// Id used for a code point at certain offset. The id represents the default
+  /// use of the code point, often a read access. This is used in [NodeId].
   node,
+
+  /// Id used for an invocation at certain offset. This is used in [NodeId].
   invoke,
+
+  /// Id used for an assignment at certain offset. This is used in [NodeId].
   update,
+
+  /// Id used for the iterator expression of a for-in at certain offset. This is
+  /// used in [NodeId].
   iterator,
+
+  /// Id used for the implicit call to `Iterator.current` in a for-in at certain
+  /// offset. This is used in [NodeId].
   current,
+
+  /// Id used for the implicit call to `Iterator.moveNext` in a for-in at
+  /// certain offset. This is used in [NodeId].
   moveNext,
+
+  /// Id used for the implicit as expression inserted by the compiler.
+  implicitAs,
+
+  /// Id used for the statement at certain offset. This is used in [NodeId].
   stmt,
+
+  /// Id used for the error reported at certain offset. This is used in
+  /// [NodeId].
+  error,
 }
 
 /// Id for a code point or element.
 abstract class Id {
   IdKind get kind;
+
+  /// Indicates whether the id refers to an element defined outside of the test
+  /// case itself (e.g. some tests may need to refer to properties of elements
+  /// in `dart:core`).
   bool get isGlobal;
 
   /// Display name for this id.
@@ -50,6 +85,8 @@
       case IdKind.cls:
         ClassId classId = id;
         return '$classPrefix${classId.name}:$value';
+      case IdKind.library:
+        return '$libraryPrefix$value';
       case IdKind.node:
         return value;
       case IdKind.invoke:
@@ -62,8 +99,12 @@
         return '$currentPrefix$value';
       case IdKind.moveNext:
         return '$moveNextPrefix$value';
+      case IdKind.implicitAs:
+        return '$implicitAsPrefix$value';
       case IdKind.stmt:
         return '$stmtPrefix$value';
+      case IdKind.error:
+        return '$errorPrefix$value';
     }
     throw new UnsupportedError("Unexpected id kind: ${id.kind}");
   }
@@ -71,20 +112,23 @@
   static const String globalPrefix = "global#";
   static const String memberPrefix = "member: ";
   static const String classPrefix = "class: ";
+  static const String libraryPrefix = "library: ";
   static const String invokePrefix = "invoke: ";
   static const String updatePrefix = "update: ";
   static const String iteratorPrefix = "iterator: ";
   static const String currentPrefix = "current: ";
   static const String moveNextPrefix = "moveNext: ";
+  static const String implicitAsPrefix = "as: ";
   static const String stmtPrefix = "stmt: ";
+  static const String errorPrefix = "error: ";
 
-  static IdValue decode(int offset, String text) {
+  static IdValue decode(Uri sourceUri, int offset, String text) {
     Id id;
     String expected;
     if (text.startsWith(memberPrefix)) {
       text = text.substring(memberPrefix.length);
       int colonPos = text.indexOf(':');
-      if (colonPos == -1) throw "Invalid element id: '$text'";
+      if (colonPos == -1) throw "Invalid member id: '$text'";
       String name = text.substring(0, colonPos);
       bool isGlobal = name.startsWith(globalPrefix);
       if (isGlobal) {
@@ -103,6 +147,9 @@
       }
       id = new ClassId(name, isGlobal: isGlobal);
       expected = text.substring(colonPos + 1);
+    } else if (text.startsWith(libraryPrefix)) {
+      id = new LibraryId(sourceUri);
+      expected = text.substring(libraryPrefix.length);
     } else if (text.startsWith(invokePrefix)) {
       id = new NodeId(offset, IdKind.invoke);
       expected = text.substring(invokePrefix.length);
@@ -118,9 +165,15 @@
     } else if (text.startsWith(moveNextPrefix)) {
       id = new NodeId(offset, IdKind.moveNext);
       expected = text.substring(moveNextPrefix.length);
+    } else if (text.startsWith(implicitAsPrefix)) {
+      id = new NodeId(offset, IdKind.implicitAs);
+      expected = text.substring(implicitAsPrefix.length);
     } else if (text.startsWith(stmtPrefix)) {
       id = new NodeId(offset, IdKind.stmt);
       expected = text.substring(stmtPrefix.length);
+    } else if (text.startsWith(errorPrefix)) {
+      id = new NodeId(offset, IdKind.error);
+      expected = text.substring(errorPrefix.length);
     } else {
       id = new NodeId(offset, IdKind.node);
       expected = text;
@@ -202,7 +255,39 @@
   String toString() => 'class:$name';
 }
 
-/// Id for a code point.
+/// Id for a library.
+class LibraryId implements Id {
+  final Uri uri;
+
+  LibraryId(this.uri);
+
+  // TODO(johnniwinther): Support global library annotations.
+  @override
+  bool get isGlobal => false;
+
+  @override
+  int get hashCode => uri.hashCode * 13;
+
+  @override
+  bool operator ==(other) {
+    if (identical(this, other)) return true;
+    if (other is! LibraryId) return false;
+    return uri == other.uri;
+  }
+
+  @override
+  IdKind get kind => IdKind.library;
+
+  String get name => uri.toString();
+
+  @override
+  String get descriptor => 'library $name';
+
+  @override
+  String toString() => 'library:$name';
+}
+
+/// Id for a code point defined by a kind and a code offset.
 class NodeId implements Id {
   final int value;
   @override
@@ -260,23 +345,30 @@
 abstract class DataRegistry<T> {
   Map<Id, ActualData<T>> get actualMap;
 
+  /// Registers [value] with [id] in [actualMap].
+  ///
+  /// Checks for duplicate data for [id].
   void registerValue(Uri uri, int offset, Id id, T value, Object object) {
-    if (actualMap.containsKey(id)) {
-      ActualData<T> existingData = actualMap[id];
-      report(uri, offset, "Duplicate id ${id}, value=$value, object=$object");
-      report(
-          uri,
-          offset,
-          "Duplicate id ${id}, value=${existingData.value}, "
-          "object=${existingData.object}");
-      fail("Duplicate id $id.");
-    }
     if (value != null) {
+      if (actualMap.containsKey(id)) {
+        // TODO(johnniwinther): Maybe let the test supply a way to merge
+        // multiple data on the same id?
+        ActualData<T> existingData = actualMap[id];
+        report(uri, offset, "Duplicate id ${id}, value=$value, object=$object");
+        report(
+            uri,
+            offset,
+            "Duplicate id ${id}, value=${existingData.value}, "
+            "object=${existingData.object}");
+        fail("Duplicate id $id.");
+      }
       actualMap[id] = new ActualData<T>(id, value, uri, offset, object);
     }
   }
 
+  /// Called to report duplicate errors.
   void report(Uri uri, int offset, String message);
 
+  /// Called to raise an exception on duplicate errors.
   void fail(String message);
 }
diff --git a/pkg/front_end/lib/src/testing/id_extractor.dart b/pkg/front_end/lib/src/testing/id_extractor.dart
index 83007b5..9ea0e06 100644
--- a/pkg/front_end/lib/src/testing/id_extractor.dart
+++ b/pkg/front_end/lib/src/testing/id_extractor.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2017, 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 file.
 
@@ -6,7 +6,7 @@
 import 'id.dart';
 
 /// Compute a canonical [Id] for kernel-based nodes.
-Id computeEntityId(Member node) {
+Id computeMemberId(Member node) {
   String className;
   if (node.enclosingClass != null) {
     className = node.enclosingClass.name;
@@ -34,20 +34,45 @@
   @override
   final Map<Id, ActualData<T>> actualMap;
 
+  /// Implement this to compute the data corresponding to [library].
+  ///
+  /// If `null` is returned, [library] has no associated data.
+  T computeLibraryValue(Id id, Library library) => null;
+
+  /// Implement this to compute the data corresponding to [cls].
+  ///
+  /// If `null` is returned, [cls] has no associated data.
+  T computeClassValue(Id id, Class cls) => null;
+
   /// Implement this to compute the data corresponding to [member].
   ///
   /// If `null` is returned, [member] has no associated data.
-  T computeMemberValue(Id id, Member member);
+  T computeMemberValue(Id id, Member member) => null;
 
   /// Implement this to compute the data corresponding to [node].
   ///
   /// If `null` is returned, [node] has no associated data.
-  T computeNodeValue(Id id, TreeNode node);
+  T computeNodeValue(Id id, TreeNode node) => null;
 
   DataExtractor(this.actualMap);
 
+  void computeForLibrary(Library library, {bool useFileUri: false}) {
+    LibraryId id =
+        new LibraryId(useFileUri ? library.fileUri : library.importUri);
+    T value = computeLibraryValue(id, library);
+    registerValue(library.fileUri, null, id, value, library);
+  }
+
+  void computeForClass(Class cls) {
+    ClassId id = new ClassId(cls.name);
+    T value = computeClassValue(id, cls);
+    TreeNode nodeWithOffset = computeTreeNodeWithOffset(cls);
+    registerValue(nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset,
+        id, value, cls);
+  }
+
   void computeForMember(Member member) {
-    MemberId id = computeEntityId(member);
+    MemberId id = computeMemberId(member);
     if (id == null) return;
     T value = computeMemberValue(id, member);
     TreeNode nodeWithOffset = computeTreeNodeWithOffset(member);
@@ -63,7 +88,11 @@
         id, value, node);
   }
 
-  NodeId computeDefaultNodeId(TreeNode node) {
+  NodeId computeDefaultNodeId(TreeNode node,
+      {bool skipNodeWithNoOffset: false}) {
+    if (skipNodeWithNoOffset && node.fileOffset == TreeNode.noOffset) {
+      return null;
+    }
     assert(node.fileOffset != TreeNode.noOffset,
         "No fileOffset on $node (${node.runtimeType})");
     return new NodeId(node.fileOffset, IdKind.node);
@@ -107,6 +136,14 @@
   NodeId createSwitchCaseId(SwitchCase node) =>
       new NodeId(node.expressionOffsets.first, IdKind.node);
 
+  NodeId createImplicitAsId(AsExpression node) {
+    if (node.fileOffset == TreeNode.noOffset) {
+      // TODO(johnniwinther): Find out why we something have no offset.
+      return null;
+    }
+    return new NodeId(node.fileOffset, IdKind.implicitAs);
+  }
+
   void run(Node root) {
     root.accept(this);
   }
@@ -261,4 +298,141 @@
     computeForNode(node, createGotoId(node));
     super.visitContinueSwitchStatement(node);
   }
+
+  @override
+  visitConstantExpression(ConstantExpression node) {
+    // Implicit constants (for instance omitted field initializers, implicit
+    // default values) and synthetic constants (for instance in noSuchMethod
+    // forwarders) have no offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitConstantExpression(node);
+  }
+
+  @override
+  visitNullLiteral(NullLiteral node) {
+    // Synthetic null literals, for instance in locals and fields without
+    // initializers, have no offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitNullLiteral(node);
+  }
+
+  @override
+  visitBoolLiteral(BoolLiteral node) {
+    computeForNode(node, computeDefaultNodeId(node));
+    super.visitBoolLiteral(node);
+  }
+
+  @override
+  visitIntLiteral(IntLiteral node) {
+    // Synthetic ints literals, for instance in enum fields, have no offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitIntLiteral(node);
+  }
+
+  @override
+  visitDoubleLiteral(DoubleLiteral node) {
+    computeForNode(node, computeDefaultNodeId(node));
+    super.visitDoubleLiteral(node);
+  }
+
+  @override
+  visitStringLiteral(StringLiteral node) {
+    // Synthetic string literals, for instance in enum fields, have no offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitStringLiteral(node);
+  }
+
+  @override
+  visitListLiteral(ListLiteral node) {
+    // Synthetic list literals,for instance in noSuchMethod forwarders, have no
+    // offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitListLiteral(node);
+  }
+
+  @override
+  visitMapLiteral(MapLiteral node) {
+    // Synthetic map literals, for instance in noSuchMethod forwarders, have no
+    // offset.
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitMapLiteral(node);
+  }
+
+  @override
+  visitSetLiteral(SetLiteral node) {
+    computeForNode(node, computeDefaultNodeId(node));
+    super.visitSetLiteral(node);
+  }
+
+  @override
+  visitThisExpression(ThisExpression node) {
+    TreeNode parent = node.parent;
+    if (node.fileOffset == TreeNode.noOffset ||
+        (parent is PropertyGet ||
+                parent is PropertySet ||
+                parent is MethodInvocation) &&
+            parent.fileOffset == node.fileOffset) {
+      // Skip implicit this expressions.
+    } else {
+      computeForNode(node, computeDefaultNodeId(node));
+    }
+    super.visitThisExpression(node);
+  }
+
+  @override
+  visitAwaitExpression(AwaitExpression node) {
+    computeForNode(node, computeDefaultNodeId(node));
+    super.visitAwaitExpression(node);
+  }
+
+  @override
+  visitConstructorInvocation(ConstructorInvocation node) {
+    // Skip synthetic constructor invocations like for enum constants.
+    // TODO(johnniwinther): Can [skipNodeWithNoOffset] be removed when dart2js
+    // no longer test with cfe constants?
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    super.visitConstructorInvocation(node);
+  }
+
+  @override
+  visitStaticGet(StaticGet node) {
+    computeForNode(node, computeDefaultNodeId(node));
+    super.visitStaticGet(node);
+  }
+
+  @override
+  visitStaticSet(StaticSet node) {
+    computeForNode(node, createUpdateId(node));
+    super.visitStaticSet(node);
+  }
+
+  @override
+  visitStaticInvocation(StaticInvocation node) {
+    computeForNode(node, createInvokeId(node));
+    super.visitStaticInvocation(node);
+  }
+
+  @override
+  visitAsExpression(AsExpression node) {
+    if (node.isTypeError) {
+      computeForNode(node, createImplicitAsId(node));
+    } else {
+      computeForNode(node, computeDefaultNodeId(node));
+    }
+    return super.visitAsExpression(node);
+  }
+
+  @override
+  visitArguments(Arguments node) {
+    computeForNode(
+        node, computeDefaultNodeId(node, skipNodeWithNoOffset: true));
+    return super.visitArguments(node);
+  }
 }
diff --git a/pkg/front_end/lib/src/testing/id_testing.dart b/pkg/front_end/lib/src/testing/id_testing.dart
new file mode 100644
index 0000000..d8a777e
--- /dev/null
+++ b/pkg/front_end/lib/src/testing/id_testing.dart
@@ -0,0 +1,674 @@
+// 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';
+import 'annotated_code_helper.dart';
+import 'id.dart';
+import '../fasta/colors.dart' as colors;
+
+const String cfeMarker = 'cfe';
+const String dart2jsMarker = 'dart2js';
+const String analyzerMarker = 'analyzer';
+
+/// Markers used in annotated tests shard by CFE, analyzer and dart2js.
+const List<String> sharedMarkers = [
+  cfeMarker,
+  dart2jsMarker,
+  analyzerMarker,
+];
+
+/// `true` if ANSI colors are supported by stdout.
+bool useColors = stdout.supportsAnsiEscapes;
+
+/// Colorize a message [text], if ANSI colors are supported.
+String colorizeMessage(String text) {
+  if (useColors) {
+    return '${colors.YELLOW_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize a matching annotation [text], if ANSI colors are supported.
+String colorizeMatch(String text) {
+  if (useColors) {
+    return '${colors.BLUE_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize a single annotation [text], if ANSI colors are supported.
+String colorizeSingle(String text) {
+  if (useColors) {
+    return '${colors.GREEN_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize the actual annotation [text], if ANSI colors are supported.
+String colorizeActual(String text) {
+  if (useColors) {
+    return '${colors.RED_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize an expected annotation [text], if ANSI colors are supported.
+String colorizeExpected(String text) {
+  if (useColors) {
+    return '${colors.GREEN_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize delimiter [text], if ANSI colors are supported.
+String colorizeDelimiter(String text) {
+  if (useColors) {
+    return '${colors.YELLOW_COLOR}${text}${colors.DEFAULT_COLOR}';
+  } else {
+    return text;
+  }
+}
+
+/// Colorize diffs [expected] and [actual] and [delimiter], if ANSI colors are
+/// supported.
+String colorizeDiff(String expected, String delimiter, String actual) {
+  return '${colorizeExpected(expected)}'
+      '${colorizeDelimiter(delimiter)}${colorizeActual(actual)}';
+}
+
+/// Colorize annotation delimiters [start] and [end] surrounding [text], if
+/// ANSI colors are supported.
+String colorizeAnnotation(String start, String text, String end) {
+  return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
+}
+
+/// Encapsulates the member data computed for each source file of interest.
+/// It's a glorified wrapper around a map of maps, but written this way to
+/// provide a little more information about what it's doing. [DataType] refers
+/// to the type this map is holding -- it is either [IdValue] or [ActualData].
+class MemberAnnotations<DataType> {
+  /// For each Uri, we create a map associating an element id with its
+  /// corresponding annotations.
+  final Map<Uri, Map<Id, DataType>> _computedDataForEachFile =
+      new Map<Uri, Map<Id, DataType>>();
+
+  /// Member or class annotations that don't refer to any of the user files.
+  final Map<Id, DataType> globalData = <Id, DataType>{};
+
+  void operator []=(Uri file, Map<Id, DataType> computedData) {
+    _computedDataForEachFile[file] = computedData;
+  }
+
+  void forEach(void f(Uri file, Map<Id, DataType> computedData)) {
+    _computedDataForEachFile.forEach(f);
+  }
+
+  Map<Id, DataType> operator [](Uri file) {
+    if (!_computedDataForEachFile.containsKey(file)) {
+      _computedDataForEachFile[file] = <Id, DataType>{};
+    }
+    return _computedDataForEachFile[file];
+  }
+
+  @override
+  String toString() {
+    StringBuffer sb = new StringBuffer();
+    sb.write('MemberAnnotations(');
+    String comma = '';
+    if (_computedDataForEachFile.isNotEmpty &&
+        (_computedDataForEachFile.length > 1 ||
+            _computedDataForEachFile.values.single.isNotEmpty)) {
+      sb.write('data:{');
+      _computedDataForEachFile.forEach((Uri uri, Map<Id, DataType> data) {
+        sb.write(comma);
+        sb.write('$uri:');
+        sb.write(data);
+        comma = ',';
+      });
+      sb.write('}');
+    }
+    if (globalData.isNotEmpty) {
+      sb.write(comma);
+      sb.write('global:');
+      sb.write(globalData);
+    }
+    sb.write(')');
+    return sb.toString();
+  }
+}
+
+/// Compute a [MemberAnnotations] object from [code] for each marker in [maps]
+/// specifying the expected annotations.
+///
+/// If an annotation starts with a marker, it is only expected for the
+/// corresponding test configuration. Otherwise it is expected for all
+/// configurations.
+// TODO(johnniwinther): Support an empty marker set.
+void computeExpectedMap(Uri sourceUri, String filename, AnnotatedCode code,
+    Map<String, MemberAnnotations<IdValue>> maps,
+    {void onFailure(String message)}) {
+  List<String> mapKeys = maps.keys.toList();
+  Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
+
+  split.forEach((String marker, AnnotatedCode code) {
+    MemberAnnotations<IdValue> fileAnnotations = maps[marker];
+    assert(fileAnnotations != null, "No annotations for $marker in $maps");
+    Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
+    for (Annotation annotation in code.annotations) {
+      String text = annotation.text;
+      IdValue idValue = IdValue.decode(sourceUri, annotation.offset, text);
+      if (idValue.id.isGlobal) {
+        if (fileAnnotations.globalData.containsKey(idValue.id)) {
+          onFailure("Error in test '$filename': "
+              "Duplicate annotations for ${idValue.id} in $marker: "
+              "${idValue} and ${fileAnnotations.globalData[idValue.id]}.");
+        }
+        fileAnnotations.globalData[idValue.id] = idValue;
+      } else {
+        if (expectedValues.containsKey(idValue.id)) {
+          onFailure("Error in test '$filename': "
+              "Duplicate annotations for ${idValue.id} in $marker: "
+              "${idValue} and ${expectedValues[idValue.id]}.");
+        }
+        expectedValues[idValue.id] = idValue;
+      }
+    }
+  });
+}
+
+/// Creates a [TestData] object for the annotated test in [testFile].
+///
+/// If [testFile] is a file, use that directly. If it's a directory include
+/// everything in that directory.
+///
+/// If [testLibDirectory] is not `null`, files in [testLibDirectory] with the
+/// [testFile] name as a prefix are included.
+TestData computeTestData(FileSystemEntity testFile, Directory testLibDirectory,
+    {Iterable<String> supportedMarkers,
+    Uri createUriForFileName(String fileName, {bool isLib}),
+    void onFailure(String message)}) {
+  Uri entryPoint = createUriForFileName('main.dart', isLib: false);
+
+  File mainTestFile;
+  Map<String, File> additionalFiles;
+  if (testFile is File) {
+    mainTestFile = testFile;
+  } else if (testFile is Directory) {
+    additionalFiles = new Map<String, File>();
+    for (FileSystemEntity entry in testFile.listSync(recursive: true)) {
+      if (entry is! File) continue;
+      if (entry.uri.pathSegments.last == "main.dart") {
+        mainTestFile = entry;
+      } else {
+        additionalFiles[entry.uri.path.substring(testFile.uri.path.length)] =
+            entry;
+      }
+    }
+  }
+
+  String annotatedCode = new File.fromUri(mainTestFile.uri).readAsStringSync();
+  Map<Uri, AnnotatedCode> code = {
+    entryPoint:
+        new AnnotatedCode.fromText(annotatedCode, commentStart, commentEnd)
+  };
+  Map<String, MemberAnnotations<IdValue>> expectedMaps = {};
+  for (String testMarker in supportedMarkers) {
+    expectedMaps[testMarker] = new MemberAnnotations<IdValue>();
+  }
+  computeExpectedMap(entryPoint, testFile.uri.pathSegments.last,
+      code[entryPoint], expectedMaps,
+      onFailure: onFailure);
+  Map<String, String> memorySourceFiles = {
+    entryPoint.path: code[entryPoint].sourceCode
+  };
+
+  List<String> libFileNames;
+
+  addSupportingFile(String libFileName, File libEntity, bool isLib) {
+    libFileNames ??= [];
+    libFileNames.add(libFileName);
+    Uri libFileUri = createUriForFileName(libFileName, isLib: isLib);
+    String libCode = libEntity.readAsStringSync();
+    AnnotatedCode annotatedLibCode =
+        new AnnotatedCode.fromText(libCode, commentStart, commentEnd);
+    memorySourceFiles[libFileUri.path] = annotatedLibCode.sourceCode;
+    code[libFileUri] = annotatedLibCode;
+    computeExpectedMap(libFileUri, libFileName, annotatedLibCode, expectedMaps,
+        onFailure: onFailure);
+  }
+
+  if (testLibDirectory != null) {
+    String name = testFile.uri.pathSegments.last;
+    String filePrefix = name.substring(0, name.lastIndexOf('.'));
+    for (FileSystemEntity libEntity in testLibDirectory.listSync()) {
+      String libFileName = libEntity.uri.pathSegments.last;
+      if (libFileName.startsWith(filePrefix)) {
+        addSupportingFile(libFileName, libEntity, true);
+      }
+    }
+  }
+  if (additionalFiles != null) {
+    for (MapEntry<String, File> additionalFileData in additionalFiles.entries) {
+      addSupportingFile(
+          additionalFileData.key, additionalFileData.value, false);
+    }
+  }
+
+  return new TestData(testFile.uri, entryPoint, memorySourceFiles, code,
+      expectedMaps, libFileNames);
+}
+
+/// Data for an annotated test.
+class TestData {
+  final Uri testFileUri;
+  final Uri entryPoint;
+  final Map<String, String> memorySourceFiles;
+  final Map<Uri, AnnotatedCode> code;
+  final Map<String, MemberAnnotations<IdValue>> expectedMaps;
+  final List<String> libFileNames;
+
+  TestData(this.testFileUri, this.entryPoint, this.memorySourceFiles, this.code,
+      this.expectedMaps, this.libFileNames);
+
+  String get name => testFileUri.pathSegments.last;
+}
+
+/// The actual result computed for an annotated test.
+abstract class CompiledData<T> {
+  final Uri mainUri;
+
+  /// For each Uri, a map associating an element id with the instrumentation
+  /// data we've collected for it.
+  final Map<Uri, Map<Id, ActualData<T>>> actualMaps;
+
+  /// Collected instrumentation data that doesn't refer to any of the user
+  /// files.  (E.g. information the test has collected about files in
+  /// `dart:core`).
+  final Map<Id, ActualData<T>> globalData;
+
+  CompiledData(this.mainUri, this.actualMaps, this.globalData);
+
+  Map<int, List<String>> computeAnnotations(Uri uri) {
+    Map<Id, ActualData<T>> actualMap = actualMaps[uri];
+    Map<int, List<String>> annotations = <int, List<String>>{};
+    actualMap.forEach((Id id, ActualData<T> data) {
+      String value1 = '${data.value}';
+      annotations
+          .putIfAbsent(data.offset, () => [])
+          .add(colorizeActual(value1));
+    });
+    return annotations;
+  }
+
+  Map<int, List<String>> computeDiffAnnotationsAgainst(
+      Map<Id, ActualData<T>> thisMap, Map<Id, ActualData<T>> otherMap, Uri uri,
+      {bool includeMatches: false}) {
+    Map<int, List<String>> annotations = <int, List<String>>{};
+    thisMap.forEach((Id id, ActualData<T> thisData) {
+      ActualData<T> otherData = otherMap[id];
+      String thisValue = '${thisData.value}';
+      if (thisData.value != otherData?.value) {
+        String otherValue = '${otherData?.value ?? '---'}';
+        annotations
+            .putIfAbsent(thisData.offset, () => [])
+            .add(colorizeDiff(thisValue, ' | ', otherValue));
+      } else if (includeMatches) {
+        annotations
+            .putIfAbsent(thisData.offset, () => [])
+            .add(colorizeMatch(thisValue));
+      }
+    });
+    otherMap.forEach((Id id, ActualData<T> otherData) {
+      if (!thisMap.containsKey(id)) {
+        String thisValue = '---';
+        String otherValue = '${otherData.value}';
+        annotations
+            .putIfAbsent(otherData.offset, () => [])
+            .add(colorizeDiff(thisValue, ' | ', otherValue));
+      }
+    });
+    return annotations;
+  }
+
+  int getOffsetFromId(Id id, Uri uri);
+
+  void reportError(Uri uri, int offset, String message, {bool succinct: false});
+}
+
+/// Interface used for interpreting annotations.
+abstract class DataInterpreter<T> {
+  /// Returns `null` if [actualData] satisfies the [expectedData] annotation.
+  /// Otherwise, a message is returned contain the information about the
+  /// problems found.
+  String isAsExpected(T actualData, String expectedData);
+
+  /// Returns `true` if [actualData] corresponds to empty data.
+  bool isEmpty(T actualData);
+
+  /// Returns a textual representation of [actualData].
+  String getText(T actualData);
+}
+
+/// Default data interpreter for string data.
+class StringDataInterpreter implements DataInterpreter<String> {
+  const StringDataInterpreter();
+
+  @override
+  String isAsExpected(String actualData, String expectedData) {
+    actualData ??= '';
+    expectedData ??= '';
+    if (actualData != expectedData) {
+      return "Expected $expectedData, found $actualData";
+    }
+    return null;
+  }
+
+  @override
+  bool isEmpty(String actualData) {
+    return actualData == '';
+  }
+
+  @override
+  String getText(String actualData) {
+    return actualData;
+  }
+}
+
+String withAnnotations(String sourceCode, Map<int, List<String>> annotations) {
+  StringBuffer sb = new StringBuffer();
+  int end = 0;
+  for (int offset in annotations.keys.toList()..sort()) {
+    if (offset >= sourceCode.length) {
+      sb.write('...');
+      return sb.toString();
+    }
+    if (offset > end) {
+      sb.write(sourceCode.substring(end, offset));
+    }
+    for (String annotation in annotations[offset]) {
+      sb.write(colorizeAnnotation('/*', annotation, '*/'));
+    }
+    end = offset;
+  }
+  if (end < sourceCode.length) {
+    sb.write(sourceCode.substring(end));
+  }
+  return sb.toString();
+}
+
+/// Computed and expected data for an annotated test. This is used for checking
+/// and displaying results of an annotated test.
+class IdData<T> {
+  final Map<Uri, AnnotatedCode> code;
+  final MemberAnnotations<IdValue> expectedMaps;
+  final CompiledData<T> _compiledData;
+  final MemberAnnotations<ActualData<T>> _actualMaps = new MemberAnnotations();
+
+  IdData(this.code, this.expectedMaps, this._compiledData) {
+    for (Uri uri in code.keys) {
+      _actualMaps[uri] = _compiledData.actualMaps[uri] ?? <Id, ActualData<T>>{};
+    }
+    _actualMaps.globalData.addAll(_compiledData.globalData);
+  }
+
+  Uri get mainUri => _compiledData.mainUri;
+  MemberAnnotations<ActualData<T>> get actualMaps => _actualMaps;
+
+  String actualCode(Uri uri) {
+    Map<int, List<String>> annotations = <int, List<String>>{};
+    actualMaps[uri].forEach((Id id, ActualData<T> data) {
+      annotations.putIfAbsent(data.offset, () => []).add('${data.value}');
+    });
+    return withAnnotations(code[uri].sourceCode, annotations);
+  }
+
+  String diffCode(Uri uri, DataInterpreter<T> dataValidator) {
+    Map<int, List<String>> annotations = <int, List<String>>{};
+    actualMaps[uri].forEach((Id id, ActualData<T> data) {
+      IdValue expectedValue = expectedMaps[uri][id];
+      T actualValue = data.value;
+      String unexpectedMessage =
+          dataValidator.isAsExpected(actualValue, expectedValue?.value);
+      if (unexpectedMessage != null) {
+        String expected = expectedValue?.toString() ?? '';
+        String actual = dataValidator.getText(actualValue);
+        int offset = getOffsetFromId(id, uri);
+        if (offset != null) {
+          String value1 = '${expected}';
+          String value2 = IdValue.idToString(id, '${actual}');
+          annotations
+              .putIfAbsent(offset, () => [])
+              .add(colorizeDiff(value1, ' | ', value2));
+        }
+      }
+    });
+    expectedMaps[uri].forEach((Id id, IdValue expected) {
+      if (!actualMaps[uri].containsKey(id)) {
+        int offset = getOffsetFromId(id, uri);
+        if (offset != null) {
+          String value1 = '${expected}';
+          String value2 = '---';
+          annotations
+              .putIfAbsent(offset, () => [])
+              .add(colorizeDiff(value1, ' | ', value2));
+        }
+      }
+    });
+    return withAnnotations(code[uri].sourceCode, annotations);
+  }
+
+  int getOffsetFromId(Id id, Uri uri) {
+    return _compiledData.getOffsetFromId(id, uri);
+  }
+}
+
+/// Checks [compiledData] against the expected data in [expectedMaps] derived
+/// from [code].
+Future<bool> checkCode<T>(
+    String modeName,
+    Uri mainFileUri,
+    Map<Uri, AnnotatedCode> code,
+    MemberAnnotations<IdValue> expectedMaps,
+    CompiledData<T> compiledData,
+    DataInterpreter<T> dataValidator,
+    {bool filterActualData(IdValue expected, ActualData<T> actualData),
+    bool fatalErrors: true,
+    bool succinct: false,
+    void onFailure(String message)}) async {
+  IdData<T> data = new IdData<T>(code, expectedMaps, compiledData);
+  bool hasFailure = false;
+  Set<Uri> neededDiffs = new Set<Uri>();
+
+  void checkActualMap(
+      Map<Id, ActualData<T>> actualMap, Map<Id, IdValue> expectedMap,
+      [Uri uri]) {
+    bool hasLocalFailure = false;
+    actualMap.forEach((Id id, ActualData<T> actualData) {
+      T actual = actualData.value;
+      String actualText = dataValidator.getText(actual);
+
+      if (!expectedMap.containsKey(id)) {
+        if (!dataValidator.isEmpty(actual)) {
+          String actualValueText = IdValue.idToString(id, actualText);
+          compiledData.reportError(
+              actualData.uri,
+              actualData.offset,
+              succinct
+                  ? 'EXTRA $modeName DATA for ${id.descriptor}'
+                  : 'EXTRA $modeName DATA for ${id.descriptor}:\n '
+                      'object   : ${actualData.objectText}\n '
+                      'actual   : ${colorizeActual(actualValueText)}\n '
+                      'Data was expected for these ids: ${expectedMap.keys}',
+              succinct: succinct);
+          if (filterActualData == null || filterActualData(null, actualData)) {
+            hasLocalFailure = true;
+          }
+        }
+      } else {
+        IdValue expected = expectedMap[id];
+        String unexpectedMessage =
+            dataValidator.isAsExpected(actual, expected.value);
+        if (unexpectedMessage != null) {
+          String actualValueText = IdValue.idToString(id, actualText);
+          compiledData.reportError(
+              actualData.uri,
+              actualData.offset,
+              succinct
+                  ? 'UNEXPECTED $modeName DATA for ${id.descriptor}'
+                  : 'UNEXPECTED $modeName DATA for ${id.descriptor}:\n '
+                      'detail  : ${colorizeMessage(unexpectedMessage)}\n '
+                      'object  : ${actualData.objectText}\n '
+                      'expected: ${colorizeExpected('$expected')}\n '
+                      'actual  : ${colorizeActual(actualValueText)}',
+              succinct: succinct);
+          if (filterActualData == null ||
+              filterActualData(expected, actualData)) {
+            hasLocalFailure = true;
+          }
+        }
+      }
+    });
+    if (hasLocalFailure) {
+      hasFailure = true;
+      if (uri != null) {
+        neededDiffs.add(uri);
+      }
+    }
+  }
+
+  data.actualMaps.forEach((Uri uri, Map<Id, ActualData<T>> actualMap) {
+    checkActualMap(actualMap, data.expectedMaps[uri], uri);
+  });
+  checkActualMap(data.actualMaps.globalData, data.expectedMaps.globalData);
+
+  Set<Id> missingIds = new Set<Id>();
+  void checkMissing(
+      Map<Id, IdValue> expectedMap, Map<Id, ActualData<T>> actualMap,
+      [Uri uri]) {
+    expectedMap.forEach((Id id, IdValue expected) {
+      if (!actualMap.containsKey(id)) {
+        missingIds.add(id);
+        String message = 'MISSING $modeName DATA for ${id.descriptor}: '
+            'Expected ${colorizeExpected('$expected')}';
+        if (uri != null) {
+          compiledData.reportError(
+              uri, compiledData.getOffsetFromId(id, uri), message,
+              succinct: succinct);
+        } else {
+          print(message);
+        }
+      }
+    });
+    if (missingIds.isNotEmpty && uri != null) {
+      neededDiffs.add(uri);
+    }
+  }
+
+  data.expectedMaps.forEach((Uri uri, Map<Id, IdValue> expectedMap) {
+    checkMissing(expectedMap, data.actualMaps[uri], uri);
+  });
+  checkMissing(data.expectedMaps.globalData, data.actualMaps.globalData);
+  if (!succinct) {
+    for (Uri uri in neededDiffs) {
+      print('--annotations diff [${uri.pathSegments.last}]-------------');
+      print(data.diffCode(uri, dataValidator));
+      print('----------------------------------------------------------');
+    }
+  }
+  if (missingIds.isNotEmpty) {
+    print("MISSING ids: ${missingIds}.");
+    hasFailure = true;
+  }
+  if (hasFailure && fatalErrors) {
+    onFailure('Errors found.');
+  }
+  return hasFailure;
+}
+
+typedef Future<bool> RunTestFunction(TestData testData,
+    {bool testAfterFailures, bool verbose, bool succinct, bool printCode});
+
+/// Check code for all test files int [data] using [computeFromAst] and
+/// [computeFromKernel] from the respective front ends. If [skipForKernel]
+/// contains the name of the test file it isn't tested for kernel.
+///
+/// [libDirectory] contains the directory for any supporting libraries that need
+/// to be loaded. We expect supporting libraries to have the same prefix as the
+/// original test in [dataDir]. So, for example, if testing `foo.dart` in
+/// [dataDir], then this function will consider any files named `foo.*\.dart`,
+/// such as `foo2.dart`, `foo_2.dart`, and `foo_blah_blah_blah.dart` in
+/// [libDirectory] to be supporting library files for `foo.dart`.
+Future runTests(Directory dataDir,
+    {List<String> args: const <String>[],
+    Directory libDirectory: null,
+    int shards: 1,
+    int shardIndex: 0,
+    void onTest(Uri uri),
+    Iterable<String> supportedMarkers,
+    Uri createUriForFileName(String fileName, {bool isLib}),
+    void onFailure(String message),
+    RunTestFunction runTest}) async {
+  // TODO(johnniwinther): Support --show to show actual data for an input.
+  args = args.toList();
+  bool verbose = args.remove('-v');
+  bool succinct = args.remove('-s');
+  bool shouldContinue = args.remove('-c');
+  bool testAfterFailures = args.remove('-a');
+  bool printCode = args.remove('-p');
+  bool continued = false;
+  bool hasFailures = false;
+
+  var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
+  print('Data dir: ${relativeDir}');
+  List<FileSystemEntity> entities = dataDir.listSync();
+  if (shards > 1) {
+    int start = entities.length * shardIndex ~/ shards;
+    int end = entities.length * (shardIndex + 1) ~/ shards;
+    entities = entities.sublist(start, end);
+  }
+  int testCount = 0;
+  for (FileSystemEntity entity in entities) {
+    String name = entity.uri.pathSegments.last;
+    if (args.isNotEmpty && !args.contains(name) && !continued) continue;
+    if (shouldContinue) continued = true;
+    testCount++;
+
+    if (onTest != null) {
+      onTest(entity.uri);
+    }
+    print('----------------------------------------------------------------');
+
+    TestData testData = computeTestData(
+        entity, entity is File ? libDirectory : null,
+        supportedMarkers: supportedMarkers,
+        createUriForFileName: createUriForFileName,
+        onFailure: onFailure);
+    print('Test file: ${testData.testFileUri}');
+    if (!succinct && testData.libFileNames != null) {
+      print('Supporting libraries:');
+      for (String libFileName in testData.libFileNames) {
+        print('    - libs/$libFileName');
+      }
+    }
+
+    if (await runTest(testData,
+        testAfterFailures: testAfterFailures,
+        verbose: verbose,
+        succinct: succinct,
+        printCode: printCode)) {
+      hasFailures = true;
+    }
+  }
+  if (hasFailures) {
+    onFailure('Errors found.');
+  }
+  if (testCount == 0) {
+    onFailure("No files were tested.");
+  }
+}
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
new file mode 100644
index 0000000..de701d1
--- /dev/null
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -0,0 +1,412 @@
+// 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:kernel/ast.dart';
+import '../api_prototype/compiler_options.dart'
+    show CompilerOptions, DiagnosticMessage;
+import '../api_prototype/experimental_flags.dart' show ExperimentalFlag;
+import '../api_prototype/terminal_color_support.dart'
+    show printDiagnosticMessage;
+import '../fasta/messages.dart' show FormattedMessage;
+import '../fasta/severity.dart' show Severity;
+import '../kernel_generator_impl.dart' show InternalCompilerResult;
+import 'compiler_common.dart' show compileScript, toTestUri;
+import 'id.dart'
+    show ActualData, ClassId, Id, IdKind, IdValue, MemberId, NodeId;
+import 'id_extractor.dart' show DataExtractor;
+import 'id_testing.dart'
+    show
+        CompiledData,
+        DataInterpreter,
+        MemberAnnotations,
+        RunTestFunction,
+        TestData,
+        cfeMarker,
+        checkCode;
+import 'id_testing_utils.dart';
+
+export '../fasta/compiler_context.dart' show CompilerContext;
+export '../kernel_generator_impl.dart' show InternalCompilerResult;
+export '../fasta/messages.dart' show FormattedMessage;
+
+/// Test configuration used for testing CFE in its default state.
+const TestConfig defaultCfeConfig = const TestConfig(cfeMarker, 'cfe');
+
+/// Test configuration used for testing CFE with constant evaluation.
+const TestConfig cfeConstantUpdate2018Config = const TestConfig(
+    cfeMarker, 'cfe with constant-update-2018',
+    experimentalFlags: const {ExperimentalFlag.constantUpdate2018: true});
+
+/// Test configuration used for testing CFE with extension methods.
+const TestConfig cfeExtensionMethodsConfig = const TestConfig(
+    cfeMarker, 'cfe with constant-update-2018',
+    experimentalFlags: const {ExperimentalFlag.extensionMethods: true});
+
+class TestConfig {
+  final String marker;
+  final String name;
+  final Map<ExperimentalFlag, bool> experimentalFlags;
+
+  const TestConfig(this.marker, this.name, {this.experimentalFlags = const {}});
+}
+
+// TODO(johnniwinther): Support annotations for compile-time errors.
+abstract class DataComputer<T> {
+  const DataComputer();
+
+  /// Called before testing to setup flags needed for data collection.
+  void setup() {}
+
+  /// Function that computes a data mapping for [member].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+      Map<Id, ActualData<T>> actualMap,
+      {bool verbose}) {}
+
+  /// Function that computes a data mapping for [cls].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+      Map<Id, ActualData<T>> actualMap,
+      {bool verbose}) {}
+
+  /// Function that computes a data mapping for [library].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeLibraryData(InternalCompilerResult compilerResult,
+      Library library, Map<Id, ActualData<T>> actualMap,
+      {bool verbose}) {}
+
+  /// Returns `true` if this data computer supports tests with compile-time
+  /// errors.
+  ///
+  /// Unsuccessful compilation might leave the compiler in an inconsistent
+  /// state, so this testing feature is opt-in.
+  bool get supportsErrors => false;
+
+  /// Returns data corresponding to [error].
+  T computeErrorData(InternalCompilerResult compiler, Id id,
+          List<FormattedMessage> errors) =>
+      null;
+
+  /// Returns the [DataInterpreter] used to check the actual data with the
+  /// expected data.
+  DataInterpreter<T> get dataValidator;
+}
+
+class CfeCompiledData<T> extends CompiledData<T> {
+  final InternalCompilerResult compilerResult;
+
+  CfeCompiledData(
+      this.compilerResult,
+      Uri mainUri,
+      Map<Uri, Map<Id, ActualData<T>>> actualMaps,
+      Map<Id, ActualData<T>> globalData)
+      : super(mainUri, actualMaps, globalData);
+
+  @override
+  int getOffsetFromId(Id id, Uri uri) {
+    if (id is NodeId) return id.value;
+    if (id is MemberId) {
+      Library library = lookupLibrary(compilerResult.component, uri);
+      Member member;
+      int offset;
+      if (id.className != null) {
+        Class cls = lookupClass(library, id.className);
+        member = lookupClassMember(cls, id.memberName);
+        offset = member.fileOffset;
+        if (offset == -1) {
+          offset = cls.fileOffset;
+        }
+      } else {
+        member = lookupLibraryMember(library, id.memberName);
+        offset = member.fileOffset;
+      }
+      if (offset == -1) {
+        offset = 0;
+      }
+      return offset;
+    } else if (id is ClassId) {
+      Library library = lookupLibrary(compilerResult.component, uri);
+      Class cls = lookupClass(library, id.className);
+      return cls.fileOffset;
+    }
+    return null;
+  }
+
+  @override
+  void reportError(Uri uri, int offset, String message,
+      {bool succinct: false}) {
+    printMessageInLocation(
+        compilerResult.component.uriToSource, uri, offset, message,
+        succinct: succinct);
+  }
+}
+
+abstract class CfeDataExtractor<T> extends DataExtractor<T> {
+  final InternalCompilerResult compilerResult;
+
+  CfeDataExtractor(this.compilerResult, Map<Id, ActualData<T>> actualMap)
+      : super(actualMap);
+
+  @override
+  void report(Uri uri, int offset, String message) {
+    printMessageInLocation(
+        compilerResult.component.uriToSource, uri, offset, message);
+  }
+
+  @override
+  void fail(String message) {
+    onFailure(message);
+  }
+}
+
+/// Create the testing URI used for [fileName] in annotated tests.
+Uri createUriForFileName(String fileName, {bool isLib}) => toTestUri(fileName);
+
+void onFailure(String message) => throw new StateError(message);
+
+/// Creates a test runner for [dataComputer] on [testedConfigs].
+RunTestFunction runTestFor<T>(
+    DataComputer<T> dataComputer, List<TestConfig> testedConfigs) {
+  return (TestData testData,
+      {bool testAfterFailures, bool verbose, bool succinct, bool printCode}) {
+    return runTest(testData, dataComputer, testedConfigs,
+        testAfterFailures: testAfterFailures,
+        verbose: verbose,
+        succinct: succinct,
+        printCode: printCode,
+        onFailure: onFailure);
+  };
+}
+
+/// Runs [dataComputer] on [testData] for all [testedConfigs].
+///
+/// Returns `true` if an error was encountered.
+Future<bool> runTest<T>(TestData testData, DataComputer<T> dataComputer,
+    List<TestConfig> testedConfigs,
+    {bool testAfterFailures,
+    bool verbose,
+    bool succinct,
+    bool printCode,
+    bool forUserLibrariesOnly: true,
+    Iterable<Id> globalIds: const <Id>[],
+    void onFailure(String message)}) async {
+  bool hasFailures = false;
+  for (TestConfig config in testedConfigs) {
+    if (await runTestForConfig(testData, dataComputer, config,
+        fatalErrors: !testAfterFailures,
+        onFailure: onFailure,
+        verbose: verbose,
+        succinct: succinct,
+        printCode: printCode)) {
+      hasFailures = true;
+    }
+  }
+  return hasFailures;
+}
+
+/// Runs [dataComputer] on [testData] for [config].
+///
+/// Returns `true` if an error was encountered.
+Future<bool> runTestForConfig<T>(
+    TestData testData, DataComputer<T> dataComputer, TestConfig config,
+    {bool fatalErrors,
+    bool verbose,
+    bool succinct,
+    bool printCode,
+    bool forUserLibrariesOnly: true,
+    Iterable<Id> globalIds: const <Id>[],
+    void onFailure(String message)}) async {
+  MemberAnnotations<IdValue> memberAnnotations =
+      testData.expectedMaps[config.marker];
+  Iterable<Id> globalIds = memberAnnotations.globalData.keys;
+  CompilerOptions options = new CompilerOptions();
+  List<FormattedMessage> errors = [];
+  options.onDiagnostic = (DiagnosticMessage message) {
+    if (message is FormattedMessage && message.severity == Severity.error) {
+      errors.add(message);
+    }
+    if (!succinct) printDiagnosticMessage(message, print);
+  };
+  options.debugDump = printCode;
+  options.experimentalFlags.addAll(config.experimentalFlags);
+  InternalCompilerResult compilerResult = await compileScript(
+      testData.memorySourceFiles,
+      options: options,
+      retainDataForTesting: true);
+
+  Component component = compilerResult.component;
+  Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
+  Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
+
+  Map<Id, ActualData<T>> actualMapForUri(Uri uri) {
+    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
+  }
+
+  if (errors.isNotEmpty) {
+    if (!dataComputer.supportsErrors) {
+      onFailure("Compilation with compile-time errors not supported for this "
+          "testing setup.");
+    }
+
+    Map<Uri, Map<int, List<FormattedMessage>>> errorMap = {};
+    for (FormattedMessage error in errors) {
+      Map<int, List<FormattedMessage>> map =
+          errorMap.putIfAbsent(error.uri, () => {});
+      List<FormattedMessage> list = map.putIfAbsent(error.charOffset, () => []);
+      list.add(error);
+    }
+
+    errorMap.forEach((Uri uri, Map<int, List<FormattedMessage>> map) {
+      map.forEach((int offset, List<DiagnosticMessage> list) {
+        NodeId id = new NodeId(offset, IdKind.error);
+        T data = dataComputer.computeErrorData(compilerResult, id, list);
+        if (data != null) {
+          Map<Id, ActualData<T>> actualMap = actualMapForUri(uri);
+          actualMap[id] = new ActualData<T>(id, data, uri, offset, list);
+        }
+      });
+    });
+  }
+
+  Map<Id, ActualData<T>> actualMapFor(TreeNode node) {
+    Uri uri = node is Library ? node.fileUri : node.location.file;
+    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
+  }
+
+  void processMember(Member member, Map<Id, ActualData<T>> actualMap) {
+    if (member.enclosingClass != null) {
+      if (member.enclosingClass.isEnum) {
+        if (member is Constructor ||
+            member.isInstanceMember ||
+            member.name == 'values') {
+          return;
+        }
+      }
+      if (member is Constructor && member.enclosingClass.isMixinApplication) {
+        return;
+      }
+    }
+    dataComputer.computeMemberData(compilerResult, member, actualMap,
+        verbose: verbose);
+  }
+
+  void processClass(Class cls, Map<Id, ActualData<T>> actualMap) {
+    dataComputer.computeClassData(compilerResult, cls, actualMap,
+        verbose: verbose);
+  }
+
+  bool excludeLibrary(Library library) {
+    return forUserLibrariesOnly &&
+        (library.importUri.scheme == 'dart' ||
+            library.importUri.scheme == 'package');
+  }
+
+  for (Library library in component.libraries) {
+    if (excludeLibrary(library) &&
+        !testData.memorySourceFiles.containsKey(library.fileUri.path)) {
+      continue;
+    }
+    dataComputer.computeLibraryData(
+        compilerResult, library, actualMapFor(library));
+    for (Class cls in library.classes) {
+      processClass(cls, actualMapFor(cls));
+      for (Member member in cls.members) {
+        processMember(member, actualMapFor(member));
+      }
+    }
+    for (Member member in library.members) {
+      processMember(member, actualMapFor(member));
+    }
+  }
+
+  List<Uri> globalLibraries = <Uri>[
+    Uri.parse('dart:core'),
+    Uri.parse('dart:collection'),
+    Uri.parse('dart:async'),
+  ];
+
+  Class getGlobalClass(String className) {
+    Class cls;
+    for (Uri uri in globalLibraries) {
+      Library library = lookupLibrary(component, uri);
+      if (library != null) {
+        cls ??= lookupClass(library, className);
+      }
+    }
+    if (cls == null) {
+      throw "Global class '$className' not found in the global "
+          "libraries: ${globalLibraries.join(', ')}";
+    }
+    return cls;
+  }
+
+  Member getGlobalMember(String memberName) {
+    Member member;
+    for (Uri uri in globalLibraries) {
+      Library library = lookupLibrary(component, uri);
+      if (library != null) {
+        member ??= lookupLibraryMember(library, memberName);
+      }
+    }
+    if (member == null) {
+      throw "Global member '$memberName' not found in the global "
+          "libraries: ${globalLibraries.join(', ')}";
+    }
+    return member;
+  }
+
+  for (Id id in globalIds) {
+    if (id is MemberId) {
+      Member member;
+      if (id.className != null) {
+        Class cls = getGlobalClass(id.className);
+        member = lookupClassMember(cls, id.memberName);
+        if (member == null) {
+          throw "Global member '${id.memberName}' not found in class $cls.";
+        }
+      } else {
+        member = getGlobalMember(id.memberName);
+      }
+      processMember(member, globalData);
+    } else if (id is ClassId) {
+      Class cls = getGlobalClass(id.className);
+      processClass(cls, globalData);
+    } else {
+      throw new UnsupportedError("Unexpected global id: $id");
+    }
+  }
+
+  CfeCompiledData compiledData = new CfeCompiledData<T>(
+      compilerResult, testData.testFileUri, actualMaps, globalData);
+  return checkCode(config.name, testData.testFileUri, testData.code,
+      memberAnnotations, compiledData, dataComputer.dataValidator,
+      fatalErrors: fatalErrors, succinct: succinct, onFailure: onFailure);
+}
+
+void printMessageInLocation(
+    Map<Uri, Source> uriToSource, Uri uri, int offset, String message,
+    {bool succinct: false}) {
+  if (uri == null) {
+    print(message);
+  } else {
+    Source source = uriToSource[uri];
+    if (source == null) {
+      print('$uri@$offset: $message');
+    } else {
+      if (offset != null) {
+        Location location = source.getLocation(uri, offset);
+        print('$location: $message');
+        if (!succinct) {
+          print(source.getTextLine(location.line));
+          print(' ' * (location.column - 1) + '^');
+        }
+      } else {
+        print('$uri: $message');
+      }
+    }
+  }
+}
diff --git a/pkg/front_end/lib/src/testing/id_testing_utils.dart b/pkg/front_end/lib/src/testing/id_testing_utils.dart
new file mode 100644
index 0000000..37fb3ac
--- /dev/null
+++ b/pkg/front_end/lib/src/testing/id_testing_utils.dart
@@ -0,0 +1,447 @@
+// 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:kernel/ast.dart';
+import '../fasta/builder/builder.dart';
+import '../fasta/kernel/kernel_builder.dart';
+import '../fasta/messages.dart';
+import '../fasta/source/source_library_builder.dart';
+import '../fasta/source/source_loader.dart';
+import '../kernel_generator_impl.dart';
+
+/// Helper methods to use in annotated tests.
+
+/// Returns a canonical simple name for [member].
+String getMemberName(Member member) {
+  if (member is Procedure && member.isSetter) return '${member.name.name}=';
+  return member.name.name;
+}
+
+/// Returns the enclosing [Member] for [node].
+Member getEnclosingMember(TreeNode node) {
+  while (node is! Member) {
+    node = node.parent;
+  }
+  return node;
+}
+
+/// Finds the first [Library] in [component] with the given import [uri].
+///
+/// If [required] is `true` an error is thrown if no library was found.
+Library lookupLibrary(Component component, Uri uri, {bool required: true}) {
+  return component.libraries
+      .firstWhere((Library library) => library.importUri == uri, orElse: () {
+    if (required) {
+      throw new ArgumentError("Library '$uri' not found.");
+    }
+    return null;
+  });
+}
+
+/// Finds the first [Class] in [component] with the given [className].
+///
+/// If [required] is `true` an error is thrown if no class was found.
+Class lookupClass(Library library, String className, {bool required: true}) {
+  return library.classes.firstWhere((Class cls) => cls.name == className,
+      orElse: () {
+    if (required) {
+      throw new ArgumentError("Class '$className' not found in '$library'.");
+    }
+    return null;
+  });
+}
+
+/// Finds the first [Member] in [library] with the given canonical simple
+/// [memberName] as computed by [getMemberName].
+///
+/// If [required] is `true` an error is thrown if no member was found.
+Member lookupLibraryMember(Library library, String memberName,
+    {bool required: true}) {
+  return library.members.firstWhere(
+      (Member member) => getMemberName(member) == memberName, orElse: () {
+    if (required) {
+      throw new ArgumentError("Member '$memberName' not found in '$library'.");
+    }
+    return null;
+  });
+}
+
+/// Finds the first [Member] in [cls] with the given canonical simple
+/// [memberName] as computed by [getMemberName].
+///
+/// If [required] is `true` an error is thrown if no member was found.
+Member lookupClassMember(Class cls, String memberName, {bool required: true}) {
+  return cls.members.firstWhere(
+      (Member member) => getMemberName(member) == memberName, orElse: () {
+    if (required) {
+      throw new ArgumentError("Member '$memberName' not found in '$cls'.");
+    }
+    return null;
+  });
+}
+
+TypeParameterScopeBuilder lookupLibraryDeclarationBuilder(
+    InternalCompilerResult compilerResult, Library library,
+    {bool required: true}) {
+  SourceLoader loader = compilerResult.kernelTargetForTesting.loader;
+  SourceLibraryBuilder builder = loader.builders[library.importUri];
+  if (builder == null && required) {
+    throw new ArgumentError("DeclarationBuilder for $library not found.");
+  }
+  return builder.libraryDeclaration;
+}
+
+ClassBuilder lookupClassBuilder(
+    InternalCompilerResult compilerResult, Class cls,
+    {bool required: true}) {
+  TypeParameterScopeBuilder libraryBuilder = lookupLibraryDeclarationBuilder(
+      compilerResult, cls.enclosingLibrary,
+      required: required);
+  ClassBuilder clsBuilder = libraryBuilder.members[cls.name];
+  if (clsBuilder == null && required) {
+    throw new ArgumentError("ClassBuilder for $cls not found.");
+  }
+  return clsBuilder;
+}
+
+/// Look up the [MemberBuilder] for [member] through the [ClassBuilder] for
+/// [cls] using [memberName] as its name.
+MemberBuilder lookupClassMemberBuilder(InternalCompilerResult compilerResult,
+    Class cls, Member member, String memberName,
+    {bool required: true}) {
+  ClassBuilder classBuilder =
+      lookupClassBuilder(compilerResult, cls, required: required);
+  MemberBuilder memberBuilder;
+  if (classBuilder != null) {
+    if (member is Constructor) {
+      memberBuilder = classBuilder.constructors.local[memberName];
+    } else if (member is Procedure && member.isSetter) {
+      memberBuilder = classBuilder.scope.setters[memberName];
+    } else {
+      memberBuilder = classBuilder.scope.local[memberName];
+    }
+  }
+  if (memberBuilder == null && required) {
+    throw new ArgumentError("MemberBuilder for $member not found.");
+  }
+  return memberBuilder;
+}
+
+MemberBuilder lookupMemberBuilder(
+    InternalCompilerResult compilerResult, Member member,
+    {bool required: true}) {
+  MemberBuilder memberBuilder;
+  if (member.enclosingClass != null) {
+    memberBuilder = lookupClassMemberBuilder(
+        compilerResult, member.enclosingClass, member, member.name.name,
+        required: required);
+  } else {
+    TypeParameterScopeBuilder libraryBuilder = lookupLibraryDeclarationBuilder(
+        compilerResult, member.enclosingLibrary);
+    if (member is Procedure && member.isSetter) {
+      memberBuilder = libraryBuilder.members[member.name.name];
+    } else {
+      memberBuilder = libraryBuilder.setters[member.name.name];
+    }
+  }
+  if (memberBuilder == null && required) {
+    throw new ArgumentError("MemberBuilder for $member not found.");
+  }
+  return memberBuilder;
+}
+
+/// Returns a textual representation of the constant [node] to be used in
+/// testing.
+String constantToText(Constant node) {
+  StringBuffer sb = new StringBuffer();
+  new ConstantToTextVisitor(sb).visit(node);
+  return sb.toString();
+}
+
+/// Returns a textual representation of the type [node] to be used in
+/// testing.
+String typeToText(DartType node) {
+  StringBuffer sb = new StringBuffer();
+  new DartTypeToTextVisitor(sb).visit(node);
+  return sb.toString();
+}
+
+class ConstantToTextVisitor implements ConstantVisitor<void> {
+  final StringBuffer sb;
+  final DartTypeToTextVisitor typeToText;
+
+  ConstantToTextVisitor(this.sb) : typeToText = new DartTypeToTextVisitor(sb);
+
+  void visit(Constant node) => node.accept(this);
+
+  void visitList(Iterable<Constant> nodes) {
+    String comma = '';
+    for (Constant node in nodes) {
+      sb.write(comma);
+      visit(node);
+      comma = ',';
+    }
+  }
+
+  void defaultConstant(Constant node) => throw UnimplementedError(
+      'Unexpected constant $node (${node.runtimeType})');
+
+  void visitNullConstant(NullConstant node) {
+    sb.write('Null()');
+  }
+
+  void visitBoolConstant(BoolConstant node) {
+    sb.write('Bool(${node.value})');
+  }
+
+  void visitIntConstant(IntConstant node) {
+    sb.write('Int(${node.value})');
+  }
+
+  void visitDoubleConstant(DoubleConstant node) {
+    sb.write('Double(${node.value})');
+  }
+
+  void visitStringConstant(StringConstant node) {
+    sb.write('String(${node.value})');
+  }
+
+  void visitSymbolConstant(SymbolConstant node) {
+    sb.write('Symbol(${node.name})');
+  }
+
+  void visitMapConstant(MapConstant node) {
+    sb.write('Map<');
+    typeToText.visit(node.keyType);
+    sb.write(',');
+    typeToText.visit(node.valueType);
+    sb.write('>(');
+    String comma = '';
+    for (ConstantMapEntry entry in node.entries) {
+      sb.write(comma);
+      entry.key.accept(this);
+      sb.write(':');
+      entry.value.accept(this);
+      comma = ',';
+    }
+    sb.write(')');
+  }
+
+  void visitListConstant(ListConstant node) {
+    sb.write('List<');
+    typeToText.visit(node.typeArgument);
+    sb.write('>(');
+    visitList(node.entries);
+    sb.write(')');
+  }
+
+  void visitSetConstant(SetConstant node) {
+    sb.write('Set<');
+    typeToText.visit(node.typeArgument);
+    sb.write('>(');
+    visitList(node.entries);
+    sb.write(')');
+  }
+
+  void visitInstanceConstant(InstanceConstant node) {
+    sb.write('Instance(');
+    sb.write(node.classNode.name);
+    if (node.typeArguments.isNotEmpty) {
+      sb.write('<');
+      typeToText.visitList(node.typeArguments);
+      sb.write('>');
+    }
+    if (node.fieldValues.isNotEmpty) {
+      sb.write(',{');
+      String comma = '';
+      for (Reference ref in node.fieldValues.keys) {
+        sb.write(comma);
+        sb.write(getMemberName(ref.asField));
+        sb.write(':');
+        visit(node.fieldValues[ref]);
+        comma = ',';
+      }
+      sb.write('}');
+    }
+    sb.write(')');
+  }
+
+  void visitPartialInstantiationConstant(PartialInstantiationConstant node) {
+    sb.write('Instantiation(');
+    sb.write(getMemberName(node.tearOffConstant.procedure));
+    sb.write('<');
+    typeToText.visitList(node.types);
+    sb.write('>)');
+  }
+
+  void visitTearOffConstant(TearOffConstant node) {
+    sb.write('Function(');
+    sb.write(getMemberName(node.procedure));
+    sb.write(')');
+  }
+
+  void visitTypeLiteralConstant(TypeLiteralConstant node) {
+    sb.write('TypeLiteral(');
+    typeToText.visit(node.type);
+    sb.write(')');
+  }
+
+  void visitUnevaluatedConstant(UnevaluatedConstant node) {
+    sb.write('Unevaluated()');
+  }
+}
+
+class DartTypeToTextVisitor implements DartTypeVisitor<void> {
+  final StringBuffer sb;
+
+  DartTypeToTextVisitor(this.sb);
+
+  void visit(DartType node) => node.accept(this);
+
+  void visitList(Iterable<DartType> nodes) {
+    String comma = '';
+    for (DartType node in nodes) {
+      sb.write(comma);
+      visit(node);
+      comma = ',';
+    }
+  }
+
+  void defaultDartType(DartType node) =>
+      throw UnimplementedError('Unexpected type $node (${node.runtimeType})');
+
+  void visitInvalidType(InvalidType node) {
+    sb.write('<invalid>');
+  }
+
+  void visitDynamicType(DynamicType node) {
+    sb.write('dynamic');
+  }
+
+  void visitVoidType(VoidType node) {
+    sb.write('void');
+  }
+
+  void visitBottomType(BottomType node) {
+    sb.write('<bottom>');
+  }
+
+  void visitInterfaceType(InterfaceType node) {
+    sb.write(node.classNode.name);
+    if (node.typeArguments.isNotEmpty) {
+      sb.write('<');
+      visitList(node.typeArguments);
+      sb.write('>');
+    }
+  }
+
+  void visitFunctionType(FunctionType node) {
+    sb.write('(');
+    String comma = '';
+    visitList(node.positionalParameters.take(node.requiredParameterCount));
+    if (node.requiredParameterCount > 0) {
+      comma = ',';
+    }
+    if (node.requiredParameterCount < node.positionalParameters.length) {
+      sb.write(comma);
+      sb.write('[');
+      visitList(node.positionalParameters.skip(node.requiredParameterCount));
+      sb.write(']');
+      comma = ',';
+    }
+    if (node.namedParameters.isNotEmpty) {
+      sb.write(comma);
+      sb.write('{');
+      comma = '';
+      for (NamedType namedParameter in node.namedParameters) {
+        sb.write(comma);
+        visit(namedParameter.type);
+        sb.write(' ');
+        sb.write(namedParameter.name);
+        comma = ',';
+      }
+      sb.write('}');
+    }
+    sb.write(')->');
+    visit(node.returnType);
+  }
+
+  void visitTypeParameterType(TypeParameterType node) {
+    sb.write(node.parameter.name);
+    if (node.promotedBound != null) {
+      sb.write(' extends ');
+      visit(node.promotedBound);
+    }
+  }
+
+  void visitTypedefType(TypedefType node) {
+    sb.write(node.typedefNode.name);
+    if (node.typeArguments.isNotEmpty) {
+      sb.write('<');
+      visitList(node.typeArguments);
+      sb.write('>');
+    }
+  }
+}
+
+/// Returns `true` if [type] is `Object` from `dart:core`.
+bool isObject(DartType type) {
+  return type is InterfaceType &&
+      type.classNode.name == 'Object' &&
+      '${type.classNode.enclosingLibrary.importUri}' == 'dart:core';
+}
+
+/// Returns a textual representation of the [typeParameter] to be used in
+/// testing.
+String typeParameterToText(TypeParameter typeParameter) {
+  String name = typeParameter.name;
+  if (!isObject(typeParameter.bound)) {
+    return '$name extends ${typeToText(typeParameter.bound)}';
+  }
+  return name;
+}
+
+/// Returns a textual representation of the [type] to be used in testing.
+String typeBuilderToText(TypeBuilder type) {
+  StringBuffer sb = new StringBuffer();
+  _typeBuilderToText(type, sb);
+  return sb.toString();
+}
+
+void _typeBuilderToText(TypeBuilder type, StringBuffer sb) {
+  if (type is NamedTypeBuilder) {
+    sb.write(type.name);
+    if (type.arguments != null && type.arguments.isNotEmpty) {
+      sb.write('<');
+      _typeBuildersToText(type.arguments, sb);
+      sb.write('>');
+    }
+  } else {
+    throw 'Unhandled type builder $type (${type.runtimeType})';
+  }
+}
+
+void _typeBuildersToText(Iterable<TypeBuilder> types, StringBuffer sb) {
+  String comma = '';
+  for (TypeBuilder type in types) {
+    sb.write(comma);
+    _typeBuilderToText(type, sb);
+    comma = ',';
+  }
+}
+
+/// Returns a textual representation of the [typeVariable] to be used in
+/// testing.
+String typeVariableBuilderToText(TypeVariableBuilder typeVariable) {
+  String name = typeVariable.name;
+  if (typeVariable.bound != null) {
+    return '$name extends ${typeBuilderToText(typeVariable.bound)}';
+  }
+  return name;
+}
+
+/// Returns a textual representation of [errors] to be used in testing.
+String errorsToText(List<FormattedMessage> errors) {
+  return errors.map((m) => m.message).join(',');
+}
diff --git a/pkg/front_end/lib/src/testing/package_root.dart b/pkg/front_end/lib/src/testing/package_root.dart
index c337020..8905d4b 100644
--- a/pkg/front_end/lib/src/testing/package_root.dart
+++ b/pkg/front_end/lib/src/testing/package_root.dart
@@ -6,7 +6,7 @@
 
 import 'package:path/path.dart' as pathos;
 
-/// Returns a path to the directory contaning source code for packages such as
+/// Returns a path to the directory containing source code for packages such as
 /// kernel, front_end, and analyzer.
 String get packageRoot {
   // If the package root directory is specified on the command line using
diff --git a/pkg/front_end/messages.status b/pkg/front_end/messages.status
index f1fc567..76adabd 100644
--- a/pkg/front_end/messages.status
+++ b/pkg/front_end/messages.status
@@ -247,6 +247,7 @@
 FastaUsageShort/analyzerCode: Fail
 FastaUsageShort/example: Fail
 FfiFieldAnnotation/analyzerCode: Fail
+FfiFieldNoAnnotation/analyzerCode: Fail
 FfiFieldInitializer/analyzerCode: Fail
 FfiNotStatic/analyzerCode: Fail
 FfiStructAnnotation/analyzerCode: Fail
@@ -333,6 +334,12 @@
 InvalidVoid/part_wrapped_script2: Fail
 InvalidVoid/script1: Fail
 InvalidVoid/script2: Fail
+LanguageVersionInvalidInDotPackages/analyzerCode: Fail
+LanguageVersionInvalidInDotPackages/part_wrapped_script: Fail # Importing file in the (now) part.
+LanguageVersionMismatchInPart/analyzerCode: Fail
+LanguageVersionMismatchInPart/part_wrapped_script: Fail # Part in (now) part.
+LanguageVersionTooHigh/analyzerCode: Fail
+LanguageVersionTooHigh/part_wrapped_script: Fail # Content comes after "part of [...]" meaning it's not actually a language version specification.
 LibraryDirectiveNotFirst/part_wrapped_script1: Fail # Defining library name in the (now) part.
 LibraryDirectiveNotFirst/part_wrapped_script2: Fail
 LibraryDirectiveNotFirst/part_wrapped_script3: Fail
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 93da19c..b4db9e7 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -659,7 +659,7 @@
 DuplicatedModifier:
   index: 70
   template: "The modifier '#lexeme' was already specified."
-  tip: "Try removing all but one occurence of the modifier."
+  tip: "Try removing all but one occurrence of the modifier."
   analyzerCode: ParserErrorCode.DUPLICATED_MODIFIER
   script:
     - "class C { const const m; }"
@@ -1301,7 +1301,7 @@
   severity: CONTEXT
 
 ConstructorCyclic:
-  template: "Redirecting constructers can't be cyclic."
+  template: "Redirecting constructors can't be cyclic."
   tip: "Try to have all constructors eventually redirect to a non-redirecting constructor."
   analyzerCode: RECURSIVE_CONSTRUCTOR_REDIRECT
   script:
@@ -1562,7 +1562,7 @@
 
         When specified, the compiler can be invoked with inputs using the custom
         URI scheme. The compiler can ignore the exact location of files on disk
-        and as a result to produce output that is independendent of the absolute
+        and as a result to produce output that is independent of the absolute
         location of files on disk. This is mostly useful for integrating with
         build systems.
 
@@ -2505,6 +2505,7 @@
   template: "Expected identifier, but got 'this'."
   analyzerCode: INVALID_REFERENCE_TO_THIS
 
+# TODO(johnniwinther): Confusing message, it should probably mention that `super` is not available.
 SuperAsIdentifier:
   template: "Expected identifier, but got 'super'."
   analyzerCode: SUPER_AS_EXPRESSION
@@ -3462,6 +3463,11 @@
   template: "Field '#name' requires exactly one annotation to declare its C++ type, which cannot be Void. dart:ffi Structs cannot have regular Dart fields."
   external: test/ffi_test.dart
 
+FfiFieldNoAnnotation:
+  # Used by dart:ffi
+  template: "Field '#name' requires no annotation to declare its C++ type, it is a Pointer which is represented by the same type in Dart and C++."
+  external: test/ffi_test.dart
+
 FfiNotStatic:
   # Used by dart:ffi
   template: "#name expects a static function as parameter. dart:ffi only supports calling static Dart functions from c."
@@ -3607,3 +3613,27 @@
       }
 
       abstract class C implements I2, I1 {}
+
+LanguageVersionTooHigh:
+  template: "The specified language version is too high. The highest supported language version is #count.#count2."
+  script: >
+    // @dart = 100.200
+
+LanguageVersionInvalidInDotPackages:
+  template: "The language version is not specified correctly in the .packages file."
+  script:
+    main.dart: "import 'package:foo/foo.dart';"
+    lib/foo.dart: "// blah blah blah"
+    .packages: "foo:lib/#dart=arglebargle"
+
+LanguageVersionMismatchInPart:
+  template: "The language version override has to be the same in the library and its part(s)."
+  script:
+    main.dart: >
+      // @dart = 2.4
+
+      part 'part.dart';
+    part.dart: >
+      // @dart = 2.3
+
+      part of 'main.dart';
diff --git a/pkg/front_end/pubspec.yaml b/pkg/front_end/pubspec.yaml
index e4593e7..85f5f11 100644
--- a/pkg/front_end/pubspec.yaml
+++ b/pkg/front_end/pubspec.yaml
@@ -6,7 +6,7 @@
 description: Front end for compilation of Dart code.
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/front_end
 environment:
-  sdk: '>=2.1.0-dev.5.0 <3.0.0'
+  sdk: '>=2.2.2 <3.0.0'
 dependencies:
   kernel: 0.3.20
   package_config: '^1.0.1'
diff --git a/pkg/front_end/test/constants/constant_test.dart b/pkg/front_end/test/constants/constant_test.dart
new file mode 100644
index 0000000..d208927
--- /dev/null
+++ b/pkg/front_end/test/constants/constant_test.dart
@@ -0,0 +1,67 @@
+// 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 Directory, Platform;
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, StringDataInterpreter, runTests;
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart'
+    show
+        CfeDataExtractor,
+        InternalCompilerResult,
+        DataComputer,
+        cfeConstantUpdate2018Config,
+        createUriForFileName,
+        onFailure,
+        runTestFor;
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:kernel/ast.dart' show Class, Member, TreeNode;
+import 'package:kernel/ast.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const ConstantsDataComputer(), [cfeConstantUpdate2018Config]));
+}
+
+class ConstantsDataComputer extends DataComputer<String> {
+  const ConstantsDataComputer();
+
+  @override
+  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    member.accept(new ConstantsDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new ConstantsDataExtractor(compilerResult, actualMap).computeForClass(cls);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class ConstantsDataExtractor extends CfeDataExtractor<String> {
+  ConstantsDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<String>> actualMap)
+      : super(compilerResult, actualMap);
+
+  @override
+  String computeNodeValue(Id id, TreeNode node) {
+    if (node is ConstantExpression) {
+      return constantToText(node.constant);
+    }
+    return null;
+  }
+}
diff --git a/pkg/front_end/test/constants/data/basic.dart b/pkg/front_end/test/constants/data/basic.dart
new file mode 100644
index 0000000..35617d6
--- /dev/null
+++ b/pkg/front_end/test/constants/data/basic.dart
@@ -0,0 +1,24 @@
+// 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.
+
+const null0 = /*cfe.Null()*/ null;
+const bool0 = /*cfe.Bool(true)*/ true;
+const bool1 = /*cfe.Bool(false)*/ false;
+const string0 = /*cfe.String(foo)*/ 'foo';
+const int0 = /*cfe.Int(0)*/ 0;
+const double0 = /*cfe.Double(0.5)*/ 0.5;
+const symbol0 = /*cfe.Symbol(foo)*/ #foo;
+
+main() {
+  print(/*Null()*/ null0);
+  print(/*Bool(true)*/ bool0);
+  print(/*Bool(false)*/ bool1);
+  print(/*String(foo)*/ string0);
+  print(/*Int(0)*/ int0);
+  print(/*Double(0.5)*/ double0);
+  print(
+      /*cfe|analyzer.Symbol(foo)*/
+      /*dart2js.Instance(Symbol,{_name:String(foo))*/
+      symbol0);
+}
diff --git a/pkg/front_end/test/constants/data/function.dart b/pkg/front_end/test/constants/data/function.dart
new file mode 100644
index 0000000..656e0ab
--- /dev/null
+++ b/pkg/front_end/test/constants/data/function.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+T method1<T>(T t) => t;
+Map<T, S> method2<T, S>(T t, S s) => {t: s};
+
+const function0 = /*cfe.Function(method1)*/ method1;
+
+const int Function(int) instantiation0 =
+    /*cfe.Instantiation(method1<int>)*/ method1;
+
+const Map<String, int> Function(String, int) instantiation1 =
+    /*cfe.Instantiation(method2<String,int>)*/ method2;
+
+main() {
+  print(/*Function(method1)*/ function0);
+  // TODO(paulberry): analyzer should record instantiation information.  See
+  // dartbug.com/37608.
+  print(
+      /*cfe|dart2js.Instantiation(method1<int>)*/
+      /*analyzer.Function(method1)*/
+      instantiation0);
+  print(
+      /*cfe|dart2js.Instantiation(method2<String,int>)*/
+      /*analyzer.Function(method2)*/
+      instantiation1);
+}
diff --git a/pkg/front_end/test/constants/data/list.dart b/pkg/front_end/test/constants/data/list.dart
new file mode 100644
index 0000000..446475d
--- /dev/null
+++ b/pkg/front_end/test/constants/data/list.dart
@@ -0,0 +1,23 @@
+// 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.
+
+const list0 = /*cfe.List<dynamic>()*/ [];
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+const list1 = <int> /*cfe.List<int>()*/ [];
+
+const List<int> list2 = /*cfe.List<int>()*/ [];
+
+const list3 = /*cfe.List<int>(Int(42))*/ [42];
+
+const list4 = /*cfe.List<int>(Int(42),Int(87))*/ [42, 87];
+
+main() {
+  print(/*List<dynamic>()*/ list0);
+  print(/*List<int>()*/ list1);
+  print(/*List<int>()*/ list2);
+  print(/*List<int>(Int(42))*/ list3);
+  print(/*List<int>(Int(42),Int(87))*/ list4);
+}
diff --git a/pkg/front_end/test/constants/data/map.dart b/pkg/front_end/test/constants/data/map.dart
new file mode 100644
index 0000000..88cf275
--- /dev/null
+++ b/pkg/front_end/test/constants/data/map.dart
@@ -0,0 +1,24 @@
+// 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.
+
+const map0 = /*cfe.Map<dynamic,dynamic>()*/ {};
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+const map1 = <String, int> /*cfe.Map<String,int>()*/ {};
+
+const Map<String, int> map2 = /*cfe.Map<String,int>()*/ {};
+
+const map3 = /*cfe.Map<String,int>(String(foo):Int(42))*/ {'foo': 42};
+
+const map4 = /*cfe.Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/
+    {'foo': 42, 'bar': 87};
+
+main() {
+  print(/*Map<dynamic,dynamic>()*/ map0);
+  print(/*Map<String,int>()*/ map1);
+  print(/*Map<String,int>()*/ map2);
+  print(/*Map<String,int>(String(foo):Int(42))*/ map3);
+  print(/*Map<String,int>(String(foo):Int(42),String(bar):Int(87))*/ map4);
+}
diff --git a/pkg/front_end/test/constants/data/set.dart b/pkg/front_end/test/constants/data/set.dart
new file mode 100644
index 0000000..26ca6c3
--- /dev/null
+++ b/pkg/front_end/test/constants/data/set.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// ignore: sdk_version_set_literal
+const Set set0 = /*cfe.Set<dynamic>()*/ {};
+
+// TODO(johnniwinther): This seems like an odd offset for the constant. It
+// should probably be at the start of the type arguments.
+// ignore: sdk_version_set_literal
+const set1 = <int> /*cfe.Set<int>()*/ {};
+
+// ignore: sdk_version_set_literal
+const Set<int> set2 = /*cfe.Set<int>()*/ {};
+
+// ignore: sdk_version_set_literal
+const set3 = /*cfe.Set<int>(Int(42))*/ {42};
+
+// ignore: sdk_version_set_literal
+const set4 = /*cfe.Set<int>(Int(42),Int(87))*/ {42, 87};
+
+main() {
+  print(/*Set<dynamic>()*/ set0);
+  print(/*Set<int>()*/ set1);
+  print(/*Set<int>()*/ set2);
+  print(/*Set<int>(Int(42))*/ set3);
+  print(/*Set<int>(Int(42),Int(87))*/ set4);
+}
diff --git a/pkg/front_end/test/extensions/data/explicit_this.dart b/pkg/front_end/test/extensions/data/explicit_this.dart
new file mode 100644
index 0000000..8540598
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/explicit_this.dart
@@ -0,0 +1,46 @@
+// 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.
+
+class A1 {
+  Object field;
+  void method1() {}
+}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {
+  /*member: A2|method2:
+    builder-name=method2,
+    builder-params=[#this],
+    member-name=A2|method2,
+    member-params=[#this]
+  */
+  void method2() => this.method1();
+
+  /*member: A2|method3:
+   builder-name=method3,
+   builder-params=[#this],
+   member-name=A2|method3,
+   member-params=[#this]
+ */
+  Object method3() => this.field;
+
+  /*member: A2|method4:
+     builder-name=method4,
+     builder-params=[#this,o],
+     member-name=A2|method4,
+     member-params=[#this,o]
+    */
+  void method4(Object o) {
+    this.field = o;
+  }
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/extension_on_type_variable.dart b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
new file mode 100644
index 0000000..17202c4
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/extension_on_type_variable.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*class: GeneralGeneric:
+ builder-name=GeneralGeneric,
+ builder-onTypes=[T],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=GeneralGeneric,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension GeneralGeneric<T> on T {
+  /*member: GeneralGeneric|method:
+   builder-name=method,
+   builder-params=[#this],
+   builder-type-params=[T],
+   member-name=GeneralGeneric|method,
+   member-params=[#this],
+   member-type-params=[#T]
+  */
+  T method() => this;
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/implicit_this.dart b/pkg/front_end/test/extensions/data/implicit_this.dart
new file mode 100644
index 0000000..5024529
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/implicit_this.dart
@@ -0,0 +1,46 @@
+// 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.
+
+class A1 {
+  Object field;
+  void method1() {}
+}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {
+  /*member: A2|method2:
+   builder-name=method2,
+   builder-params=[#this],
+   member-name=A2|method2,
+   member-params=[#this]
+  */
+  void method2() => method1();
+
+  /*member: A2|method3:
+   builder-name=method3,
+   builder-params=[#this],
+   member-name=A2|method3,
+   member-params=[#this]
+  */
+  Object method3() => field;
+
+  /*member: A2|method4:
+   builder-name=method4,
+   builder-params=[#this,o],
+   member-name=A2|method4,
+   member-params=[#this,o]
+  */
+  void method4(Object o) {
+    field = o;
+  }
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/instance_members.dart b/pkg/front_end/test/extensions/data/instance_members.dart
new file mode 100644
index 0000000..258b2fe
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/instance_members.dart
@@ -0,0 +1,107 @@
+// 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.
+
+class A1 {}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {
+  /*member: A2|method1:
+     builder-name=method1,
+     builder-params=[#this],
+     member-name=A2|method1,
+     member-params=[#this]
+  */
+  A1 method1() {
+    return this;
+  }
+
+  /*member: A2|method2:
+     builder-name=method2,
+     builder-params=[#this,o],
+     builder-type-params=[T],
+     member-name=A2|method2,
+     member-params=[#this,o],
+     member-type-params=[T]
+  */
+  A1 method2<T>(T o) {
+    print(o);
+    return this;
+  }
+
+  /*member: A2|method3:
+     builder-name=method3,
+     builder-params=[#this],
+     builder-pos-params=[o],
+     builder-type-params=[T],
+     member-name=A2|method3,
+     member-params=[#this],
+     member-pos-params=[o],
+     member-type-params=[T]
+  */
+  A1 method3<T>([T o]) {
+    print(o);
+    return this;
+  }
+
+  /*member: A2|method4:
+     builder-name=method4,
+     builder-params=[#this],
+     builder-named-params=[o],
+     builder-type-params=[T],
+     member-name=A2|method4,
+     member-params=[#this],
+     member-named-params=[o],
+     member-type-params=[T]
+  */
+  A1 method4<T>({T o}) {
+    print(o);
+    return this;
+  }
+}
+
+class B1<T> {}
+
+/*class: B2:
+ builder-name=B2,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=B2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension B2<T> on B1<T> {
+  /*member: B2|method1:
+     builder-name=method1,
+     builder-params=[#this],
+     builder-type-params=[T],
+     member-name=B2|method1,
+     member-params=[#this],
+     member-type-params=[#T]
+  */
+  B1<T> method1() {
+    return this;
+  }
+
+  /*member: B2|method2:
+     builder-name=method2,
+     builder-params=[#this,o],
+     builder-type-params=[T,S],
+     member-name=B2|method2,
+     member-params=[#this,o],
+     member-type-params=[#T,S]
+  */
+  B1<T> method2<S>(S o) {
+    print(o);
+    return this;
+  }
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/named_declarations.dart b/pkg/front_end/test/extensions/data/named_declarations.dart
new file mode 100644
index 0000000..5123f5d
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/named_declarations.dart
@@ -0,0 +1,51 @@
+// 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.
+
+class A1 {}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {}
+
+class B1<T> {}
+
+/*class: B2:
+ builder-name=B2,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=B2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension B2<T> on B1<T> {}
+
+// TODO(johnniwinther): Remove class type parameters.
+/*class: B3:
+ builder-name=B3,
+ builder-onTypes=[B1<A1>],
+ builder-supertype=Object,
+ cls-name=B3,
+ cls-supertype=Object
+*/
+extension B3 on B1<A1> {}
+
+// TODO(johnniwinther): Remove class type parameters.
+/*class: B4:
+ builder-name=B4,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T extends A1],
+ cls-name=B4,
+ cls-supertype=Object,
+ cls-type-params=[T extends A1]
+*/
+extension B4<T extends A1> on B1<T> {}
+
+main() {}
diff --git a/pkg/front_end/test/extensions/data/static_members.dart b/pkg/front_end/test/extensions/data/static_members.dart
new file mode 100644
index 0000000..6247a80
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/static_members.dart
@@ -0,0 +1,65 @@
+// 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.
+
+class A1 {}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {
+  /*member: A2|method1:
+     builder-name=method1,
+     builder-params=[o],
+     member-name=A2|method1,
+     member-params=[o]
+  */
+  static A1 method1(A1 o) => o;
+
+  /*member: A2|method2:
+     builder-name=method2,
+     builder-params=[o],
+     builder-type-params=[T],
+     member-name=A2|method2,
+     member-params=[o],
+     member-type-params=[T]
+  */
+  static T method2<T>(T o) => o;
+}
+
+class B1<T> {}
+
+/*class: B2:
+ builder-name=B2,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=B2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension B2<T> on B1<T> {
+  /*member: B2|method1:
+     builder-name=method1,
+     builder-params=[o],
+     member-name=B2|method1,
+     member-params=[o]
+  */
+  static B1 method1(B1 o) => o;
+
+  /*member: B2|method2:
+     builder-name=method2,
+     builder-params=[o],
+     builder-type-params=[S],
+     member-name=B2|method2,
+     member-params=[o],
+     member-type-params=[S]
+  */
+  static S method2<S>(S o) => o;
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/super.dart b/pkg/front_end/test/extensions/data/super.dart
new file mode 100644
index 0000000..3f87ee3
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/super.dart
@@ -0,0 +1,29 @@
+// 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.
+
+class A1 {
+  method1() {}
+}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+*/
+extension A2 on A1 {
+  /*member: A2|method2:
+   builder-name=method2,
+   builder-params=[#this],
+   member-name=A2|method2,
+   member-params=[#this]
+  */
+  method2() {
+    /*error: errors=[SuperAsIdentifier]*/ super.method1();
+  }
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/type_variables.dart b/pkg/front_end/test/extensions/data/type_variables.dart
new file mode 100644
index 0000000..320f51a
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/type_variables.dart
@@ -0,0 +1,46 @@
+// 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.
+
+class A1<T> {}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=A2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension A2<T> on A1<T> {
+  /*member: A2|method1:
+     builder-name=method1,
+     builder-params=[#this],
+     builder-type-params=[T,S extends T],
+     member-name=A2|method1,
+     member-params=[#this],
+     member-type-params=[#T,S extends #T]
+  */
+  A1<T> method1<S extends T>() {
+    return this;
+  }
+
+  /*member: A2|method2:
+     builder-name=method2,
+     builder-params=[#this,o],
+     builder-type-params=[T,S extends A1<T>],
+     member-name=A2|method2,
+     member-params=[#this,o],
+     member-type-params=[#T,S extends A1<#T>]
+  */
+  A1<T> method2<S extends A1<T>>(S o) {
+    print(o);
+    return this;
+  }
+}
+
+// TODO(johnniwinther): Support F-bounded extensions. Currently the type
+// variable is not recognized as a type within the bound.
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/test/extensions/data/unnamed_declarations.dart b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
new file mode 100644
index 0000000..0123988
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/unnamed_declarations.dart
@@ -0,0 +1,104 @@
+// 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.
+
+class A1 {}
+
+/*class: extension#0:
+ builder-name=extension#0,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=extension#0,
+ cls-supertype=Object
+*/
+extension on A1 {
+  /*member: extension#0|method:
+     builder-name=method,
+     builder-params=[#this],
+     member-name=extension#0|method,
+     member-params=[#this]
+  */
+  method() {}
+}
+
+/*class: extension#1:
+ builder-name=extension#1,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=extension#1,
+ cls-supertype=Object
+*/
+extension on A1 {
+  /*member: extension#1|method:
+     builder-name=method,
+     builder-params=[#this],
+     member-name=extension#1|method,
+     member-params=[#this]
+  */
+  method() {}
+}
+
+class B1<T> {}
+
+/*class: extension#2:
+ builder-name=extension#2,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=extension#2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+*/
+extension <T> on B1<T> {
+  /*member: extension#2|method:
+     builder-name=method,
+     builder-params=[#this],
+     builder-type-params=[T],
+     member-name=extension#2|method,
+     member-params=[#this],
+     member-type-params=[#T]
+  */
+  method() {}
+}
+
+// TODO(johnniwinther): Remove class type parameters.
+/*class: extension#3:
+ builder-name=extension#3,
+ builder-onTypes=[B1<A1>],
+ builder-supertype=Object,
+ cls-name=extension#3,
+ cls-supertype=Object
+*/
+extension on B1<A1> {
+  /*member: extension#3|method:
+     builder-name=method,
+     builder-params=[#this],
+     member-name=extension#3|method,
+     member-params=[#this]
+  */
+  method() {}
+}
+
+// TODO(johnniwinther): Remove class type parameters.
+/*class: extension#4:
+ builder-name=extension#4,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T extends A1],
+ cls-name=extension#4,
+ cls-supertype=Object,
+ cls-type-params=[T extends A1]
+*/
+extension <T extends A1> on B1<T> {
+  /*member: extension#4|method:
+     builder-name=method,
+     builder-params=[#this],
+     builder-type-params=[T extends A1],
+     member-name=extension#4|method,
+     member-params=[#this],
+     member-type-params=[#T extends A1]
+  */
+  method() {}
+}
+
+main() {}
diff --git a/pkg/front_end/test/extensions/data/use_as_type.dart b/pkg/front_end/test/extensions/data/use_as_type.dart
new file mode 100644
index 0000000..64c0297
--- /dev/null
+++ b/pkg/front_end/test/extensions/data/use_as_type.dart
@@ -0,0 +1,45 @@
+// 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.
+
+class A1 {}
+
+/*class: A2:
+ builder-name=A2,
+ builder-onTypes=[A1],
+ builder-supertype=Object,
+ cls-name=A2,
+ cls-supertype=Object
+ */
+extension A2 on A1 {}
+
+class B1<T> {}
+
+/*class: B2:
+ builder-name=B2,
+ builder-onTypes=[B1<T>],
+ builder-supertype=Object,
+ builder-type-params=[T],
+ cls-name=B2,
+ cls-supertype=Object,
+ cls-type-params=[T]
+ */
+extension B2<T> on B1<T> {}
+
+main() {
+  /*error: errors=['A2' isn't a type.]*/
+  A2 var1;
+  /*error: errors=['B2' isn't a type.]*/
+  B2<A1> var2;
+  B1</*error: errors=['A2' isn't a type.]*/A2> var3;
+}
+
+/*error: errors=['A2' isn't a type.]*/
+A2 method1() => null;
+
+// TODO(johnniwinther): We should report an error on the number of type
+// arguments here.
+/*error: errors=['B2' isn't a type.,Expected 0 type arguments.]*/
+B2<A1> method2() => null;
+
+B1</*error: errors=['A2' isn't a type.]*/A2> method3() => null;
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
new file mode 100644
index 0000000..5303f23
--- /dev/null
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -0,0 +1,213 @@
+// 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 Directory, Platform;
+import 'package:front_end/src/fasta/builder/builder.dart';
+import 'package:front_end/src/fasta/kernel/kernel_builder.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/features.dart';
+import 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, runTests;
+import 'package:front_end/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:kernel/ast.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const ExtensionsDataComputer(), [cfeExtensionMethodsConfig]));
+}
+
+class ExtensionsDataComputer extends DataComputer<Features> {
+  const ExtensionsDataComputer();
+
+  @override
+  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose}) {
+    member.accept(new ExtensionsDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+      Map<Id, ActualData<Features>> actualMap,
+      {bool verbose}) {
+    new ExtensionsDataExtractor(compilerResult, actualMap).computeForClass(cls);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  @override
+  Features computeErrorData(
+      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+    Features features = new Features();
+    for (FormattedMessage error in errors) {
+      if (error.message.contains(',')) {
+        // TODO(johnniwinther): Support escaping of , in Features.
+        features.addElement(Tags.errors, error.code);
+      } else {
+        features.addElement(Tags.errors, error.message);
+      }
+    }
+    return features;
+  }
+
+  @override
+  DataInterpreter<Features> get dataValidator =>
+      const FeaturesDataInterpreter();
+}
+
+class Tags {
+  static const String builderName = 'builder-name';
+  static const String builderTypeParameters = 'builder-type-params';
+  static const String builderSupertype = 'builder-supertype';
+  static const String builderInterfaces = 'builder-interfaces';
+  static const String builderOnTypes = 'builder-onTypes';
+  static const String builderRequiredParameters = 'builder-params';
+  static const String builderPositionalParameters = 'builder-pos-params';
+  static const String builderNamedParameters = 'builder-named-params';
+
+  static const String clsName = 'cls-name';
+  static const String clsTypeParameters = 'cls-type-params';
+  static const String clsSupertype = 'cls-supertype';
+  static const String clsInterfaces = 'cls-interfaces';
+
+  static const String memberName = 'member-name';
+  static const String memberTypeParameters = 'member-type-params';
+  static const String memberRequiredParameters = 'member-params';
+  static const String memberPositionalParameters = 'member-pos-params';
+  static const String memberNamedParameters = 'member-named-params';
+
+  static const String errors = 'errors';
+
+  static const String hasThis = 'this';
+}
+
+class ExtensionsDataExtractor extends CfeDataExtractor<Features> {
+  ExtensionsDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<Features>> actualMap)
+      : super(compilerResult, actualMap);
+
+  @override
+  Features computeClassValue(Id id, Class cls) {
+    ClassBuilder clsBuilder = lookupClassBuilder(compilerResult, cls);
+    if (!clsBuilder.isExtension) {
+      return null;
+    }
+    Features features = new Features();
+    features[Tags.builderName] = clsBuilder.name;
+    if (clsBuilder.typeVariables != null) {
+      for (TypeVariableBuilder typeVariable in clsBuilder.typeVariables) {
+        features.addElement(Tags.builderTypeParameters,
+            typeVariableBuilderToText(typeVariable));
+      }
+    }
+
+    features[Tags.builderSupertype] = clsBuilder.supertype?.name;
+    if (clsBuilder.interfaces != null) {
+      for (TypeBuilder superinterface in clsBuilder.interfaces) {
+        features.addElement(Tags.builderInterfaces, superinterface.name);
+      }
+    }
+    if (clsBuilder.onTypes != null) {
+      for (TypeBuilder onType in clsBuilder.onTypes) {
+        features.addElement(Tags.builderOnTypes, typeBuilderToText(onType));
+      }
+    }
+
+    features[Tags.clsName] = cls.name;
+    for (TypeParameter typeParameter in cls.typeParameters) {
+      features.addElement(
+          Tags.clsTypeParameters, typeParameterToText(typeParameter));
+    }
+    features[Tags.clsSupertype] = cls.supertype?.classNode?.name;
+    for (Supertype superinterface in cls.implementedTypes) {
+      features.addElement(Tags.clsInterfaces, superinterface.classNode.name);
+    }
+    return features;
+  }
+
+  @override
+  Features computeMemberValue(Id id, Member member) {
+    if (!(member is Procedure && member.isExtensionMethod)) {
+      return null;
+    }
+    String memberName = member.name.name;
+    String extensionName = memberName.substring(0, memberName.indexOf('|'));
+    memberName = memberName.substring(extensionName.length + 1);
+    Class cls = lookupClass(member.enclosingLibrary, extensionName);
+    MemberBuilder memberBuilder =
+        lookupClassMemberBuilder(compilerResult, cls, member, memberName);
+    Features features = new Features();
+    features[Tags.builderName] = memberBuilder.name;
+    if (memberBuilder is FunctionBuilder) {
+      if (memberBuilder.formals != null) {
+        for (FormalParameterBuilder parameter in memberBuilder.formals) {
+          if (parameter.isRequired) {
+            features.addElement(Tags.builderRequiredParameters, parameter.name);
+          } else if (parameter.isPositional) {
+            features.addElement(
+                Tags.builderPositionalParameters, parameter.name);
+          } else {
+            assert(parameter.isNamed);
+            features.addElement(Tags.builderNamedParameters, parameter.name);
+          }
+        }
+        features.markAsUnsorted(Tags.builderRequiredParameters);
+        features.markAsUnsorted(Tags.builderPositionalParameters);
+        features.markAsUnsorted(Tags.builderNamedParameters);
+      }
+      if (memberBuilder.typeVariables != null) {
+        for (TypeVariableBuilder typeVariable in memberBuilder.typeVariables) {
+          features.addElement(Tags.builderTypeParameters,
+              typeVariableBuilderToText(typeVariable));
+        }
+        features.markAsUnsorted(Tags.builderTypeParameters);
+      }
+    }
+    features[Tags.memberName] = getMemberName(member);
+    if (member.function != null) {
+      for (int index = 0;
+          index < member.function.positionalParameters.length;
+          index++) {
+        VariableDeclaration parameter =
+            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) {
+        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) {
+        features.addElement(
+            Tags.memberTypeParameters, typeParameterToText(typeParameter));
+      }
+      features.markAsUnsorted(Tags.memberTypeParameters);
+    }
+    return features;
+  }
+
+  @override
+  Features computeNodeValue(Id id, TreeNode node) {
+    if (node is ThisExpression) {
+      Features features = new Features();
+      features.add(Tags.hasThis);
+      return features;
+    }
+    return null;
+  }
+}
diff --git a/pkg/front_end/test/fasta/ambiguous_export_test.dart b/pkg/front_end/test/fasta/ambiguous_export_test.dart
index 8123c39..abe0fcc 100644
--- a/pkg/front_end/test/fasta/ambiguous_export_test.dart
+++ b/pkg/front_end/test/fasta/ambiguous_export_test.dart
@@ -32,7 +32,7 @@
       target.loader.appendLibraries(component);
       DillLibraryBuilder builder = target.loader.read(library.importUri, -1);
       await target.loader.buildOutline(builder);
-      builder.finalizeExports();
+      builder.markAsReadyToFinalizeExports();
       var mainExport = builder.exportScope.local["main"];
       Expect.isTrue(mainExport is InvalidTypeBuilder);
     });
diff --git a/pkg/front_end/test/fasta/assert_locations_test.dart b/pkg/front_end/test/fasta/assert_locations_test.dart
index 16606d1..eaff73c 100644
--- a/pkg/front_end/test/fasta/assert_locations_test.dart
+++ b/pkg/front_end/test/fasta/assert_locations_test.dart
@@ -137,8 +137,9 @@
         Expect.fail(
             "Unexpected message: ${message.plainTextFormatted.join('\n')}");
       };
-    Component p = await compileScript(test.source,
-        options: options, fileName: 'synthetic-test.dart');
+    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);
diff --git a/pkg/front_end/test/fasta/expression_test.dart b/pkg/front_end/test/fasta/expression_test.dart
index 643d94c..82332e1 100644
--- a/pkg/front_end/test/fasta/expression_test.dart
+++ b/pkg/front_end/test/fasta/expression_test.dart
@@ -412,7 +412,8 @@
     ..onDiagnostic = (DiagnosticMessage message) {
       printDiagnosticMessage(message, print);
       errors.add(message);
-    };
+    }
+    ..environmentDefines = const {};
 
   final ProcessedOptions options =
       new ProcessedOptions(options: optionBuilder, inputs: [entryPoint]);
diff --git a/pkg/front_end/test/fasta/flow_analysis/flow_analysis_test.dart b/pkg/front_end/test/fasta/flow_analysis/flow_analysis_test.dart
new file mode 100644
index 0000000..7e8cd27
--- /dev/null
+++ b/pkg/front_end/test/fasta/flow_analysis/flow_analysis_test.dart
@@ -0,0 +1,640 @@
+// 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:front_end/src/fasta/flow_analysis/flow_analysis.dart';
+import 'package:test/test.dart';
+
+main() {
+  group('API', () {
+    test('conditionEqNull(notEqual: true) promotes true branch', () {
+      var h = _Harness();
+      var x = h.addAssignedVar('x', 'int?');
+      var expr = _Expression();
+      h.flow.conditionEqNull(expr, x, notEqual: true);
+      h.flow.ifStatement_thenBegin(expr);
+      expect(h.flow.promotedType(x).type, 'int');
+      h.flow.ifStatement_elseBegin();
+      expect(h.flow.promotedType(x), isNull);
+      h.flow.ifStatement_end(true);
+      h.flow.finish();
+    });
+
+    test('conditionEqNull(notEqual: false) promotes false branch', () {
+      var h = _Harness();
+      var x = h.addAssignedVar('x', 'int?');
+      var expr = _Expression();
+      h.flow.conditionEqNull(expr, x, notEqual: false);
+      h.flow.ifStatement_thenBegin(expr);
+      expect(h.flow.promotedType(x), isNull);
+      h.flow.ifStatement_elseBegin();
+      expect(h.flow.promotedType(x).type, 'int');
+      h.flow.ifStatement_end(true);
+      h.flow.finish();
+    });
+
+    test('finish checks proper nesting', () {
+      var h = _Harness();
+      var expr = _Expression();
+      h.flow.ifStatement_thenBegin(expr);
+      expect(() => h.flow.finish(), _asserts);
+    });
+
+    test('finish checks for un-added variables', () {
+      var h = _Harness();
+      var x = _Var('x', _Type('int'));
+      h.flow.isAssigned(x);
+      expect(() => h.flow.finish(), _asserts);
+    });
+
+    test('ifStatement_end(false) keeps else branch if then branch exits', () {
+      var h = _Harness();
+      var x = h.addAssignedVar('x', 'int?');
+      var expr = _Expression();
+      h.flow.conditionEqNull(expr, x);
+      h.flow.ifStatement_thenBegin(expr);
+      h.flow.handleExit();
+      h.flow.ifStatement_end(false);
+      expect(h.flow.promotedType(x).type, 'int');
+      h.flow.finish();
+    });
+
+    test('Infinite loop does not implicitly assign variables', () {
+      var h = _Harness();
+      var x = h.addUnassignedVar('x', 'int');
+      var trueCondition = _Expression();
+      h.flow.whileStatement_conditionBegin({x});
+      h.flow.booleanLiteral(trueCondition, true);
+      h.flow.whileStatement_bodyBegin(_Statement(), trueCondition);
+      h.flow.whileStatement_end();
+      expect(h.flow.isAssigned(x), false);
+    });
+
+    void _promote(_Harness h, _Var variable, String type) {
+      // if (variable is! type) {
+      var isExpression = _Expression();
+      h.flow.isExpression_end(isExpression, variable, true, _Type(type));
+      h.flow.ifStatement_thenBegin(isExpression);
+      //   return;
+      h.flow.handleExit();
+      // }
+      h.flow.ifStatement_end(false);
+    }
+
+    test('If(false) does not discard promotions', () {
+      var h = _Harness();
+      var x = h.addAssignedVar('x', 'Object');
+      _promote(h, x, 'int');
+      expect(h.flow.promotedType(x).type, 'int');
+      // if (false) {
+      var falseExpression = _Expression();
+      h.flow.booleanLiteral(falseExpression, false);
+      h.flow.ifStatement_thenBegin(falseExpression);
+      expect(h.flow.promotedType(x).type, 'int');
+      h.flow.ifStatement_end(false);
+    });
+
+    void _checkIs(String declaredType, String tryPromoteType,
+        String expectedPromotedType) {
+      var h = _Harness();
+      var x = h.addAssignedVar('x', 'int?');
+      var expr = _Expression();
+      h.flow.isExpression_end(expr, x, false, _Type(tryPromoteType));
+      h.flow.ifStatement_thenBegin(expr);
+      if (expectedPromotedType == null) {
+        expect(h.flow.promotedType(x), isNull);
+      } else {
+        expect(h.flow.promotedType(x).type, expectedPromotedType);
+      }
+      h.flow.ifStatement_elseBegin();
+      expect(h.flow.promotedType(x), isNull);
+      h.flow.ifStatement_end(true);
+      h.flow.finish();
+    }
+
+    test('isExpression_end promotes to a subtype', () {
+      _checkIs('int?', 'int', 'int');
+    });
+
+    test('isExpression_end does not promote to a supertype', () {
+      _checkIs('int', 'int?', null);
+    });
+
+    test('isExpression_end does not promote to an unrelated type', () {
+      _checkIs('int', 'String', null);
+    });
+  });
+
+  group('State', () {
+    var emptySet = FlowModel<_Var, _Type>(true).notAssigned;
+    var intVar = _Var('x', _Type('int'));
+    var intQVar = _Var('x', _Type('int?'));
+    var objectQVar = _Var('x', _Type('Object?'));
+    group('setReachable', () {
+      var unreachable = FlowModel<_Var, _Type>(false);
+      var reachable = FlowModel<_Var, _Type>(true);
+      test('unchanged', () {
+        expect(unreachable.setReachable(false), same(unreachable));
+        expect(reachable.setReachable(true), same(reachable));
+      });
+
+      test('changed', () {
+        void _check(FlowModel<_Var, _Type> initial, bool newReachability) {
+          var s = initial.setReachable(newReachability);
+          expect(s, isNot(same(initial)));
+          expect(s.reachable, newReachability);
+          expect(s.notAssigned, same(initial.notAssigned));
+          expect(s.promoted, same(initial.promoted));
+        }
+
+        _check(unreachable, true);
+        _check(reachable, false);
+      });
+    });
+
+    group('add', () {
+      test('default', () {
+        // By default, added variables are considered unassigned.
+        var s1 = FlowModel<_Var, _Type>(true);
+        var s2 = s1.add(intVar);
+        expect(s2.notAssigned.contains(intVar), true);
+        expect(s2.reachable, true);
+        expect(s2.promoted, {intVar: null});
+      });
+
+      test('unassigned', () {
+        var s1 = FlowModel<_Var, _Type>(true);
+        var s2 = s1.add(intVar, assigned: false);
+        expect(s2.notAssigned.contains(intVar), true);
+        expect(s2.reachable, true);
+        expect(s2.promoted, {intVar: null});
+      });
+
+      test('assigned', () {
+        var s1 = FlowModel<_Var, _Type>(true);
+        var s2 = s1.add(intVar, assigned: true);
+        expect(s2.notAssigned.contains(intVar), false);
+        expect(s2.promoted, {intVar: null});
+      });
+    });
+
+    group('promote', () {
+      test('unpromoted -> unchanged (same)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intVar);
+        var s2 = s1.promote(h, intVar, _Type('int'));
+        expect(s2, same(s1));
+      });
+
+      test('unpromoted -> unchanged (supertype)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intVar);
+        var s2 = s1.promote(h, intVar, _Type('Object'));
+        expect(s2, same(s1));
+      });
+
+      test('unpromoted -> unchanged (unrelated)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intVar);
+        var s2 = s1.promote(h, intVar, _Type('String'));
+        expect(s2, same(s1));
+      });
+
+      test('unpromoted -> subtype', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intQVar);
+        var s2 = s1.promote(h, intQVar, _Type('int'));
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        _Type.allowComparisons(() {
+          expect(s2.promoted, {intQVar: _Type('int')});
+        });
+      });
+
+      test('promoted -> unchanged (same)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int'));
+        var s2 = s1.promote(h, objectQVar, _Type('int'));
+        expect(s2, same(s1));
+      });
+
+      test('promoted -> unchanged (supertype)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int'));
+        var s2 = s1.promote(h, objectQVar, _Type('Object'));
+        expect(s2, same(s1));
+      });
+
+      test('promoted -> unchanged (unrelated)', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int'));
+        var s2 = s1.promote(h, objectQVar, _Type('String'));
+        expect(s2, same(s1));
+      });
+
+      test('promoted -> subtype', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int?'));
+        var s2 = s1.promote(h, objectQVar, _Type('int'));
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        _Type.allowComparisons(() {
+          expect(s2.promoted, {objectQVar: _Type('int')});
+        });
+      });
+    });
+
+    group('write', () {
+      var objectQVar = _Var('x', _Type('Object?'));
+      test('unchanged', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(objectQVar, assigned: true);
+        var s2 = s1.write(h, emptySet, objectQVar);
+        expect(s2, same(s1));
+      });
+
+      test('marks as assigned', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(objectQVar, assigned: false);
+        var s2 = s1.write(h, emptySet, objectQVar);
+        expect(s2.reachable, true);
+        expect(s2.notAssigned.contains(objectQVar), false);
+        expect(s2.promoted, same(s1.promoted));
+      });
+
+      test('un-promotes', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar, assigned: true)
+            .promote(h, objectQVar, _Type('int'));
+        expect(s1.promoted, contains(objectQVar));
+        var s2 = s1.write(h, emptySet, objectQVar);
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        expect(s2.promoted, {objectQVar: null});
+      });
+    });
+
+    group('markNonNullable', () {
+      test('unpromoted -> unchanged', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intVar);
+        var s2 = s1.markNonNullable(h, intVar);
+        expect(s2, same(s1));
+      });
+
+      test('unpromoted -> promoted', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true).add(intQVar);
+        var s2 = s1.markNonNullable(h, intQVar);
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        expect(s2.promoted[intQVar].type, 'int');
+      });
+
+      test('promoted -> unchanged', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int'));
+        var s2 = s1.markNonNullable(h, objectQVar);
+        expect(s2, same(s1));
+      });
+
+      test('promoted -> re-promoted', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .promote(h, objectQVar, _Type('int?'));
+        var s2 = s1.markNonNullable(h, objectQVar);
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        _Type.allowComparisons(() {
+          expect(s2.promoted, {objectQVar: _Type('int')});
+        });
+      });
+    });
+
+    group('removePromotedAll', () {
+      test('unchanged', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .add(intQVar)
+            .promote(h, objectQVar, _Type('int'));
+        var s2 = s1.removePromotedAll([intQVar].toSet());
+        expect(s2, same(s1));
+      });
+
+      test('changed', () {
+        var h = _Harness();
+        var s1 = FlowModel<_Var, _Type>(true)
+            .add(objectQVar)
+            .add(intQVar)
+            .promote(h, objectQVar, _Type('int'))
+            .promote(h, intQVar, _Type('int'));
+        var s2 = s1.removePromotedAll([intQVar].toSet());
+        expect(s2.reachable, true);
+        expect(s2.notAssigned, same(s1.notAssigned));
+        _Type.allowComparisons(() {
+          expect(s2.promoted, {objectQVar: _Type('int'), intQVar: null});
+        });
+      });
+    });
+
+    group('restrict', () {
+      test('reachability', () {
+        var h = _Harness();
+        var reachable = FlowModel<_Var, _Type>(true);
+        var unreachable = reachable.setReachable(false);
+        expect(
+            reachable.restrict(h, emptySet, reachable, Set()), same(reachable));
+        expect(reachable.restrict(h, emptySet, unreachable, Set()),
+            same(unreachable));
+        expect(unreachable.restrict(h, emptySet, unreachable, Set()),
+            same(unreachable));
+        expect(unreachable.restrict(h, emptySet, unreachable, Set()),
+            same(unreachable));
+      });
+
+      test('assignments', () {
+        var h = _Harness();
+        var a = _Var('a', _Type('int'));
+        var b = _Var('b', _Type('int'));
+        var c = _Var('c', _Type('int'));
+        var d = _Var('d', _Type('int'));
+        var s0 = FlowModel<_Var, _Type>(true).add(a).add(b).add(c).add(d);
+        var s1 = s0.write(h, emptySet, a).write(h, emptySet, b);
+        var s2 = s0.write(h, emptySet, a).write(h, emptySet, c);
+        var result = s1.restrict(h, emptySet, s2, Set());
+        expect(result.notAssigned.contains(a), false);
+        expect(result.notAssigned.contains(b), false);
+        expect(result.notAssigned.contains(c), false);
+        expect(result.notAssigned.contains(d), true);
+      });
+
+      test('promotion', () {
+        void _check(String thisType, String otherType, bool unsafe,
+            String expectedType) {
+          var h = _Harness();
+          var x = _Var('x', _Type('Object?'));
+          var s0 = FlowModel<_Var, _Type>(true).add(x, assigned: true);
+          var s1 = thisType == null ? s0 : s0.promote(h, x, _Type(thisType));
+          var s2 = otherType == null ? s0 : s0.promote(h, x, _Type(otherType));
+          var result =
+              s1.restrict(h, emptySet, s2, unsafe ? [x].toSet() : Set());
+          if (expectedType == null) {
+            expect(result.promoted, contains(x));
+            expect(result.promoted[x], isNull);
+          } else {
+            expect(result.promoted[x].type, expectedType);
+          }
+        }
+
+        _check(null, null, false, null);
+        _check(null, null, true, null);
+        _check('int', null, false, 'int');
+        _check('int', null, true, 'int');
+        _check(null, 'int', false, 'int');
+        _check(null, 'int', true, null);
+        _check('int?', 'int', false, 'int');
+        _check('int', 'int?', false, 'int');
+        _check('int', 'String', false, 'int');
+        _check('int?', 'int', true, 'int?');
+        _check('int', 'int?', true, 'int');
+        _check('int', 'String', true, 'int');
+      });
+
+      test('variable present in one state but not the other', () {
+        var h = _Harness();
+        var x = _Var('x', _Type('Object?'));
+        var s0 = FlowModel<_Var, _Type>(true);
+        var s1 = s0.add(x, assigned: true);
+        expect(s0.restrict(h, emptySet, s1, {}), same(s0));
+        expect(s0.restrict(h, emptySet, s1, {x}), same(s0));
+        expect(s1.restrict(h, emptySet, s0, {}), same(s1));
+        expect(s1.restrict(h, emptySet, s0, {x}), same(s1));
+      });
+    });
+  });
+
+  group('join', () {
+    group('should re-use an input if possible', () {
+      var x = _Var('x', null);
+      var y = _Var('y', null);
+      var intType = _Type('int');
+      var intQType = _Type('int?');
+      var stringType = _Type('String');
+      const emptyMap = <Null, Null>{};
+
+      test('identical inputs', () {
+        var h = _Harness();
+        var p = {x: intType, y: stringType};
+        expect(FlowModel.joinPromoted(h, p, p), same(p));
+      });
+
+      test('one input empty', () {
+        var h = _Harness();
+        var p1 = {x: intType, y: stringType};
+        var p2 = <_Var, _Type>{};
+        expect(FlowModel.joinPromoted(h, p1, p2), same(emptyMap));
+        expect(FlowModel.joinPromoted(h, p2, p1), same(emptyMap));
+      });
+
+      test('related types', () {
+        var h = _Harness();
+        var p1 = {x: intType};
+        var p2 = {x: intQType};
+        expect(FlowModel.joinPromoted(h, p1, p2), same(p2));
+        expect(FlowModel.joinPromoted(h, p2, p1), same(p2));
+      });
+
+      test('unrelated types', () {
+        var h = _Harness();
+        var p1 = {x: intType};
+        var p2 = {x: stringType};
+        expect(FlowModel.joinPromoted(h, p1, p2), {x: null});
+        expect(FlowModel.joinPromoted(h, p2, p1), {x: null});
+      });
+
+      test('sub-map', () {
+        var h = _Harness();
+        var p1 = {x: intType, y: stringType};
+        var p2 = {x: intType};
+        expect(FlowModel.joinPromoted(h, p1, p2), same(p2));
+        expect(FlowModel.joinPromoted(h, p2, p1), same(p2));
+      });
+
+      test('sub-map with matched subtype', () {
+        var h = _Harness();
+        var p1 = {x: intType, y: stringType};
+        var p2 = {x: intQType};
+        expect(FlowModel.joinPromoted(h, p1, p2), same(p2));
+        expect(FlowModel.joinPromoted(h, p2, p1), same(p2));
+      });
+
+      test('sub-map with mismatched subtype', () {
+        var h = _Harness();
+        var p1 = {x: intQType, y: stringType};
+        var p2 = {x: intType};
+        var join12 = FlowModel.joinPromoted(h, p1, p2);
+        _Type.allowComparisons(() => expect(join12, {x: intQType}));
+        var join21 = FlowModel.joinPromoted(h, p2, p1);
+        _Type.allowComparisons(() => expect(join21, {x: intQType}));
+      });
+    });
+  });
+}
+
+/// Returns the appropriate matcher for expecting an assertion error to be
+/// thrown or not, based on whether assertions are enabled.
+Matcher get _asserts {
+  var matcher = throwsA(TypeMatcher<AssertionError>());
+  bool assertionsEnabled = false;
+  assert(assertionsEnabled = true);
+  if (!assertionsEnabled) {
+    matcher = isNot(matcher);
+  }
+  return matcher;
+}
+
+class _Expression {}
+
+class _Harness
+    implements
+        NodeOperations<_Expression>,
+        TypeOperations<_Var, _Type>,
+        FunctionBodyAccess<_Var> {
+  FlowAnalysis<_Statement, _Expression, _Var, _Type> flow;
+
+  _Harness() {
+    flow = FlowAnalysis<_Statement, _Expression, _Var, _Type>(this, this, this);
+  }
+
+  _Var addAssignedVar(String name, String type) {
+    var v = _Var(name, _Type(type));
+    flow.add(v, assigned: true);
+    return v;
+  }
+
+  _Var addUnassignedVar(String name, String type) {
+    var v = _Var(name, _Type(type));
+    flow.add(v, assigned: false);
+    return v;
+  }
+
+  @override
+  bool isLocalVariable(_Var variable) {
+    // TODO(paulberry): make tests where this returns false
+    return true;
+  }
+
+  @override
+  bool isPotentiallyMutatedInClosure(_Var variable) {
+    // TODO(paulberry): make tests where this returns true
+    return false;
+  }
+
+  @override
+  bool isPotentiallyMutatedInScope(_Var variable) {
+    throw UnimplementedError('TODO(paulberry)');
+  }
+
+  @override
+  bool isSameType(_Type type1, _Type type2) {
+    return type1.type == type2.type;
+  }
+
+  @override
+  bool isSubtypeOf(_Type leftType, _Type rightType) {
+    const Map<String, bool> _subtypes = const {
+      'int <: int?': true,
+      'int <: Object': true,
+      'int <: Object?': true,
+      'int <: String': false,
+      'int? <: int': false,
+      'int? <: Object?': true,
+      'Object <: int': false,
+      'String <: int': false,
+      'String <: int?': false,
+      'String <: Object?': true,
+    };
+
+    if (leftType.type == rightType.type) return true;
+    var query = '$leftType <: $rightType';
+    return _subtypes[query] ?? fail('Unknown subtype query: $query');
+  }
+
+  @override
+  _Type promoteToNonNull(_Type type) {
+    if (type.type.endsWith('?')) {
+      return _Type(type.type.substring(0, type.type.length - 1));
+    } else {
+      return type;
+    }
+  }
+
+  @override
+  _Expression unwrapParenthesized(_Expression node) {
+    // TODO(paulberry): test cases where this matters
+    return node;
+  }
+
+  @override
+  _Type variableType(_Var variable) {
+    return variable.type;
+  }
+}
+
+class _Statement {}
+
+class _Type {
+  static bool _allowingTypeComparisons = false;
+
+  final String type;
+
+  _Type(this.type);
+
+  @override
+  bool operator ==(Object other) {
+    if (_allowingTypeComparisons) {
+      return other is _Type && other.type == this.type;
+    } else {
+      // The flow analysis engine should not compare types using operator==.  It
+      // should compare them using TypeOperations.
+      fail('Unexpected use of operator== on types');
+    }
+  }
+
+  @override
+  String toString() => type;
+
+  static T allowComparisons<T>(T callback()) {
+    var oldAllowingTypeComparisons = _allowingTypeComparisons;
+    _allowingTypeComparisons = true;
+    try {
+      return callback();
+    } finally {
+      _allowingTypeComparisons = oldAllowingTypeComparisons;
+    }
+  }
+}
+
+class _Var {
+  final String name;
+
+  final _Type type;
+
+  _Var(this.name, this.type);
+
+  @override
+  String toString() => '$type $name';
+}
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 7f59d4b..9c0ac9b 100644
--- a/pkg/front_end/test/fasta/generator_to_string_test.dart
+++ b/pkg/front_end/test/fasta/generator_to_string_test.dart
@@ -32,8 +32,7 @@
 
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
     show
-        KernelLibraryBuilder,
-        KernelTypeVariableBuilder,
+        TypeVariableBuilder,
         LoadLibraryBuilder,
         PrefixBuilder,
         TypeDeclarationBuilder,
@@ -45,41 +44,15 @@
 import 'package:front_end/src/fasta/fasta_codes.dart'
     show Message, templateUnspecified;
 
-import 'package:front_end/src/fasta/kernel/expression_generator.dart'
-    show Generator;
+import 'package:front_end/src/fasta/kernel/expression_generator.dart';
 
-import 'package:front_end/src/fasta/kernel/kernel_body_builder.dart'
-    show KernelBodyBuilder;
-
-import 'package:front_end/src/fasta/kernel/kernel_expression_generator.dart'
-    show
-        IncompleteErrorGenerator,
-        IncompletePropertyAccessGenerator,
-        KernelDeferredAccessGenerator,
-        KernelDelayedAssignment,
-        KernelDelayedPostfixIncrement,
-        KernelIndexedAccessGenerator,
-        KernelLoadLibraryGenerator,
-        KernelNullAwarePropertyAccessGenerator,
-        KernelPrefixUseGenerator,
-        KernelPropertyAccessGenerator,
-        KernelReadOnlyAccessGenerator,
-        KernelStaticAccessGenerator,
-        KernelSuperIndexedAccessGenerator,
-        KernelSuperPropertyAccessGenerator,
-        KernelThisIndexedAccessGenerator,
-        KernelThisPropertyAccessGenerator,
-        KernelTypeUseGenerator,
-        KernelUnexpectedQualifiedUseGenerator,
-        KernelUnlinkedGenerator,
-        KernelUnresolvedNameGenerator,
-        KernelVariableUseGenerator,
-        ParenthesizedExpressionGenerator,
-        SendAccessGenerator,
-        ThisAccessGenerator;
+import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
 
 import 'package:front_end/src/fasta/scanner.dart' show Token, scanString;
 
+import 'package:front_end/src/fasta/source/source_library_builder.dart'
+    show SourceLibraryBuilder;
+
 void check(String expected, Generator generator) {
   Expect.stringEquals(expected, "$generator");
 }
@@ -94,7 +67,7 @@
     Expression expression =
         new VariableGet(new VariableDeclaration("expression"));
     Expression index = new VariableGet(new VariableDeclaration("index"));
-    KernelLibraryBuilder libraryBuilder = new KernelLibraryBuilder(
+    SourceLibraryBuilder libraryBuilder = new SourceLibraryBuilder(
         uri,
         uri,
         new KernelTarget(
@@ -104,7 +77,6 @@
                     new NoneTarget(new TargetFlags(legacyMode: true))),
                 null)
             .loader,
-        null,
         null);
     LoadLibraryBuilder loadLibraryBuilder =
         new LoadLibraryBuilder(libraryBuilder, null, -1);
@@ -118,15 +90,14 @@
     Name binaryOperator = new Name("+");
     Name name = new Name("bar");
     PrefixBuilder prefixBuilder =
-        new PrefixBuilder("myPrefix", false, libraryBuilder, -1, -1);
+        new PrefixBuilder("myPrefix", false, libraryBuilder, null, -1, -1);
     String assignmentOperator = "+=";
-    TypeDeclarationBuilder declaration =
-        new KernelTypeVariableBuilder.fromKernel(
-            new TypeParameter("T"), libraryBuilder);
+    TypeDeclarationBuilder declaration = new TypeVariableBuilder.fromKernel(
+        new TypeParameter("T"), libraryBuilder);
     VariableDeclaration variable = new VariableDeclaration(null);
 
-    KernelBodyBuilder helper = new KernelBodyBuilder(
-        libraryBuilder, null, null, null, null, null, null, false, uri, null);
+    BodyBuilder helper = new BodyBuilder(libraryBuilder, null, null, null, null,
+        null, null, false, null, uri, null);
 
     Generator generator = new ThisAccessGenerator(helper, token, false, false);
 
@@ -137,72 +108,69 @@
     library.addProcedure(setter);
     cls.addMember(interfaceTarget);
 
-    KernelPrefixUseGenerator prefixUseGenerator =
-        new KernelPrefixUseGenerator(helper, token, prefixBuilder);
+    PrefixUseGenerator prefixUseGenerator =
+        new PrefixUseGenerator(helper, token, prefixBuilder);
 
     check(
         "DelayedAssignment(offset: 4, value: expression,"
         " assignmentOperator: +=)",
-        new KernelDelayedAssignment(
+        new DelayedAssignment(
             helper, token, generator, expression, assignmentOperator));
     check(
         "DelayedPostfixIncrement(offset: 4, binaryOperator: +,"
         " interfaceTarget: $uri::#class1::myInterfaceTarget)",
-        new KernelDelayedPostfixIncrement(
+        new DelayedPostfixIncrement(
             helper, token, generator, binaryOperator, interfaceTarget));
     check(
         "VariableUseGenerator(offset: 4, variable: dynamic #t1;\n,"
         " promotedType: void)",
-        new KernelVariableUseGenerator(helper, token, variable, type));
+        new VariableUseGenerator(helper, token, variable, type));
     check(
         "PropertyAccessGenerator(offset: 4, _receiverVariable: null,"
         " receiver: expression, name: bar, getter: $uri::myGetter,"
         " setter: $uri::mySetter)",
-        new KernelPropertyAccessGenerator.internal(
+        new PropertyAccessGenerator(
             helper, token, expression, name, getter, setter));
     check(
         "ThisPropertyAccessGenerator(offset: 4, name: bar,"
         " getter: $uri::myGetter, setter: $uri::mySetter)",
-        new KernelThisPropertyAccessGenerator(
-            helper, token, name, getter, setter));
+        new ThisPropertyAccessGenerator(helper, token, name, getter, setter));
     check(
         "NullAwarePropertyAccessGenerator(offset: 4,"
         " receiver: final dynamic #t1 = expression;\n,"
         " receiverExpression: expression, name: bar, getter: $uri::myGetter,"
         " setter: $uri::mySetter, type: void)",
-        new KernelNullAwarePropertyAccessGenerator(
+        new NullAwarePropertyAccessGenerator(
             helper, token, expression, name, getter, setter, type));
     check(
         "SuperPropertyAccessGenerator(offset: 4, name: bar,"
         " getter: $uri::myGetter, setter: $uri::mySetter)",
-        new KernelSuperPropertyAccessGenerator(
-            helper, token, name, getter, setter));
+        new SuperPropertyAccessGenerator(helper, token, name, getter, setter));
     check(
         "IndexedAccessGenerator(offset: 4, receiver: expression, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter,"
         " receiverVariable: null, indexVariable: null)",
-        new KernelIndexedAccessGenerator.internal(
+        new IndexedAccessGenerator(
             helper, token, expression, index, getter, setter));
     check(
         "ThisIndexedAccessGenerator(offset: 4, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter, indexVariable: null)",
-        new KernelThisIndexedAccessGenerator(
-            helper, token, index, getter, setter));
+        new ThisIndexedAccessGenerator(helper, token, index, getter, setter));
     check(
         "SuperIndexedAccessGenerator(offset: 4, index: index,"
         " getter: $uri::myGetter, setter: $uri::mySetter, indexVariable: null)",
-        new KernelSuperIndexedAccessGenerator(
-            helper, token, index, getter, setter));
+        new SuperIndexedAccessGenerator(helper, token, index, getter, setter));
     check(
         "StaticAccessGenerator(offset: 4, readTarget: $uri::myGetter,"
         " writeTarget: $uri::mySetter)",
-        new KernelStaticAccessGenerator(helper, token, getter, setter));
+        new StaticAccessGenerator(helper, token, getter, setter));
     check(
         "LoadLibraryGenerator(offset: 4,"
         " builder: Instance of 'LoadLibraryBuilder')",
-        new KernelLoadLibraryGenerator(helper, token, loadLibraryBuilder));
+        new LoadLibraryGenerator(helper, token, loadLibraryBuilder));
     check(
-        "ThisAccessGenerator(offset: 4, isInitializer: false, isSuper: false)",
+        "ThisAccessGenerator(offset: 4, isInitializer: false, "
+        "inFieldInitializer: false, isSuper: false)",
         new ThisAccessGenerator(helper, token, false, false));
     check("IncompleteErrorGenerator(offset: 4, message: Unspecified)",
         new IncompleteErrorGenerator(helper, token, message));
@@ -215,32 +183,32 @@
         " prefixGenerator: PrefixUseGenerator("
         "offset: 4, prefix: myPrefix, deferred: false),"
         " suffixGenerator: ThisAccessGenerator(offset: 4, isInitializer: false,"
-        " isSuper: false))",
-        new KernelDeferredAccessGenerator(
+        " inFieldInitializer: false, isSuper: false))",
+        new DeferredAccessGenerator(
             helper, token, prefixUseGenerator, generator));
     check(
         "ReadOnlyAccessGenerator(offset: 4, expression: expression,"
         " plainNameForRead: foo, value: null)",
-        new KernelReadOnlyAccessGenerator(helper, token, expression, "foo"));
+        new ReadOnlyAccessGenerator(helper, token, expression, "foo"));
     check(
         "ParenthesizedExpressionGenerator(offset: 4, expression: expression,"
         " plainNameForRead: null, value: null)",
         new ParenthesizedExpressionGenerator(helper, token, expression));
     check("TypeUseGenerator(offset: 4, declaration: T, plainNameForRead: foo)",
-        new KernelTypeUseGenerator(helper, token, declaration, "foo"));
+        new TypeUseGenerator(helper, token, declaration, "foo"));
     check("UnresolvedNameGenerator(offset: 4, name: bar)",
-        new KernelUnresolvedNameGenerator(helper, token, name));
+        new UnresolvedNameGenerator.internal(helper, token, name));
     check(
         "UnlinkedGenerator(offset: 4, name: foo)",
-        new KernelUnlinkedGenerator(
+        new UnlinkedGenerator(
             helper, token, new UnlinkedDeclaration("foo", false, -1, null)));
     check("PrefixUseGenerator(offset: 4, prefix: myPrefix, deferred: false)",
         prefixUseGenerator);
     check(
         "UnexpectedQualifiedUseGenerator("
-        "offset: 4, prefixGenerator: , isInitializer: false, isSuper: false)",
-        new KernelUnexpectedQualifiedUseGenerator(
-            helper, token, generator, false));
+        "offset: 4, prefixGenerator: , isInitializer: false,"
+        " inFieldInitializer: false, isSuper: false)",
+        new UnexpectedQualifiedUseGenerator(helper, token, generator, false));
     return Future<void>.value();
   });
 }
diff --git a/pkg/front_end/test/fasta/incremental_hello_test.dart b/pkg/front_end/test/fasta/incremental_hello_test.dart
index a662c8c..06004bc 100644
--- a/pkg/front_end/test/fasta/incremental_hello_test.dart
+++ b/pkg/front_end/test/fasta/incremental_hello_test.dart
@@ -38,7 +38,8 @@
     ..target = new VmTarget(new TargetFlags(legacyMode: true))
     ..legacyMode = true
     ..omitPlatform = true
-    ..onDiagnostic = diagnosticMessageHandler;
+    ..onDiagnostic = diagnosticMessageHandler
+    ..environmentDefines = const {};
 
   if (sdkFromSource) {
     optionBuilder.librariesSpecificationUri =
@@ -49,7 +50,8 @@
             .resolve("vm_platform.dill");
   }
 
-  final Uri helloDart = Uri.base.resolve("pkg/front_end/testcases/hello.dart");
+  final Uri helloDart =
+      Uri.base.resolve("pkg/front_end/testcases/general/hello.dart");
 
   final ProcessedOptions options =
       new ProcessedOptions(options: optionBuilder, inputs: [helloDart]);
diff --git a/pkg/front_end/test/fasta/messages_test.dart b/pkg/front_end/test/fasta/messages_test.dart
index f0141c1..a72f44a 100644
--- a/pkg/front_end/test/fasta/messages_test.dart
+++ b/pkg/front_end/test/fasta/messages_test.dart
@@ -39,6 +39,8 @@
 
 import "../../tool/_fasta/entry_points.dart" show BatchCompiler;
 
+import '../spell_checking_utils.dart' as spell;
+
 class MessageTestDescription extends TestDescription {
   @override
   final Uri uri;
@@ -94,13 +96,29 @@
       Severity severity;
       YamlNode badSeverity;
       YamlNode unnecessarySeverity;
+      YamlNode misspelledTemplate;
+      Set<String> misspelledTemplateWords;
+      YamlNode misspelledTip;
+      Set<String> misspelledTipWords;
 
       for (String key in message.keys) {
         YamlNode node = message.nodes[key];
         var value = node.value;
         switch (key) {
           case "template":
+            Set<String> misspelled = spell.spellcheckString(value);
+            if (misspelled != null) {
+              misspelledTemplate = node;
+              misspelledTemplateWords = misspelled;
+            }
+            break;
+
           case "tip":
+            Set<String> misspelled = spell.spellcheckString(value);
+            if (misspelled != null) {
+              misspelledTip = node;
+              misspelledTipWords = misspelled;
+            }
             break;
 
           case "severity":
@@ -215,8 +233,10 @@
       }
       // "Wrap" example as a part.
       for (Example example in examples) {
-        yield createDescription("part_wrapped_${example.name}",
-            new PartWrapExample("part_wrapped_${example.name}", name, example), null);
+        yield createDescription(
+            "part_wrapped_${example.name}",
+            new PartWrapExample("part_wrapped_${example.name}", name, example),
+            null);
       }
 
       yield createDescription(
@@ -242,12 +262,32 @@
               : null,
           location: unnecessarySeverity?.span?.start);
 
+      yield createDescription(
+          "misspelledTemplate",
+          null,
+          misspelledTemplate != null
+              ? "The template likely has the following spelling mistake(s) "
+                  "in it: ${misspelledTemplateWords.toList()}. "
+                  "If the word(s) look okay, update 'spell_checking_list.txt'."
+              : null,
+          location: misspelledTemplate?.span?.start);
+
+      yield createDescription(
+          "misspelledTip",
+          null,
+          misspelledTip != null
+              ? "The tip likely has the following spelling mistake(s) in "
+                  "it: ${misspelledTipWords.toList()}. "
+                  "If the word(s) look okay, update 'spell_checking_list.txt'."
+              : null,
+          location: misspelledTip?.span?.start);
+
       bool exampleAndAnalyzerCodeRequired = severity != Severity.context &&
           severity != Severity.internalProblem &&
           severity != Severity.ignored;
 
       yield createDescription(
-          "externalexample",
+          "externalExample",
           null,
           exampleAndAnalyzerCodeRequired &&
                   externalTest != null &&
@@ -451,7 +491,7 @@
     // TODO: Technically we should find a un-used name.
     if (scriptFiles.containsKey(mainFilename)) {
       throw "Framework failure: "
-          "Wanted to create wrapper file, but the file alread exists!";
+          "Wanted to create wrapper file, but the file already exists!";
     }
     scriptFiles[mainFilename] = new Uint8List.fromList(utf8.encode("""
       part "${example.mainFilename}";
@@ -508,6 +548,13 @@
     Uri output =
         suite.fileSystem.currentDirectory.resolve("$dir/main.dart.dill");
 
+    // Setup .packages if it doesn't exist.
+    Uri dotPackagesUri =
+        suite.fileSystem.currentDirectory.resolve("$dir/.packages");
+    if (!await suite.fileSystem.entityForUri(dotPackagesUri).exists()) {
+      suite.fileSystem.entityForUri(dotPackagesUri).writeAsBytesSync([]);
+    }
+
     print("Compiling $main");
     List<DiagnosticMessage> messages = <DiagnosticMessage>[];
 
@@ -517,7 +564,9 @@
               .resolve("vm_platform_strong.dill")
           ..target = new VmTarget(new TargetFlags())
           ..fileSystem = new HybridFileSystem(suite.fileSystem)
-          ..onDiagnostic = messages.add,
+          ..packagesFileUri = dotPackagesUri
+          ..onDiagnostic = messages.add
+          ..environmentDefines = const {},
         main,
         output);
 
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 122a125..a81e0fa 100644
--- a/pkg/front_end/test/fasta/parser/type_info_test.dart
+++ b/pkg/front_end/test/fasta/parser/type_info_test.dart
@@ -1196,7 +1196,7 @@
   }
 
   void test_computeType_identifierTypeArgRecovery() {
-    // TOOD(danrubel): dynamic, do, other keywords, malformed, recovery
+    // TODO(danrubel): dynamic, do, other keywords, malformed, recovery
     // <T>
 
     expectTypeParamOrArg(noTypeParamOrArg, 'G<int double> g');
@@ -2802,8 +2802,14 @@
   }
 
   @override
-  void endFormalParameter(Token thisKeyword, Token periodAfterThis,
-      Token nameToken, FormalParameterKind kind, MemberKind memberKind) {
+  void endFormalParameter(
+      Token thisKeyword,
+      Token periodAfterThis,
+      Token nameToken,
+      Token initializerStart,
+      Token initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
     calls.add('endFormalParameter $thisKeyword $periodAfterThis '
         '$nameToken $kind $memberKind');
   }
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 9d94241..f7c1885 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -136,8 +136,7 @@
   final Uri vm;
   final bool legacyMode;
   final bool onlyCrashes;
-  final bool enableControlFlowCollections;
-  final bool enableSpreadCollections;
+  final Map<ExperimentalFlag, bool> experimentalFlags;
   final bool skipVm;
   final Map<Component, KernelTarget> componentToTarget =
       <Component, KernelTarget>{};
@@ -161,8 +160,7 @@
       this.legacyMode,
       this.platformBinaries,
       this.onlyCrashes,
-      this.enableControlFlowCollections,
-      this.enableSpreadCollections,
+      this.experimentalFlags,
       bool ignoreExpectations,
       this.updateExpectations,
       bool updateComments,
@@ -251,10 +249,14 @@
     Uri vm = Uri.base.resolveUri(new Uri.file(Platform.resolvedExecutable));
     Uri packages = Uri.base.resolve(".packages");
     bool legacyMode = environment.containsKey(LEGACY_MODE);
-    bool enableControlFlowCollections =
-        environment["enableControlFlowCollections"] != "false" && !legacyMode;
-    bool enableSpreadCollections =
-        environment["enableSpreadCollections"] != "false" && !legacyMode;
+    Map<ExperimentalFlag, bool> experimentalFlags = <ExperimentalFlag, bool>{
+      ExperimentalFlag.controlFlowCollections:
+          environment["enableControlFlowCollections"] != "false" && !legacyMode,
+      ExperimentalFlag.spreadCollections:
+          environment["enableSpreadCollections"] != "false" && !legacyMode,
+      ExperimentalFlag.extensionMethods:
+          environment["enableExtensionMethods"] != "false" && !legacyMode,
+    };
     var options = new ProcessedOptions(
         options: new CompilerOptions()
           ..onDiagnostic = (DiagnosticMessage message) {
@@ -262,11 +264,8 @@
           }
           ..sdkRoot = sdk
           ..packagesFileUri = packages
-          ..experimentalFlags = <ExperimentalFlag, bool>{
-            ExperimentalFlag.controlFlowCollections:
-                enableControlFlowCollections,
-            ExperimentalFlag.spreadCollections: enableSpreadCollections,
-          });
+          ..environmentDefines = {}
+          ..experimentalFlags = experimentalFlags);
     UriTranslator uriTranslator = await options.getUriTranslator();
     bool onlyCrashes = environment["onlyCrashes"] == "true";
     bool ignoreExpectations = environment["ignoreExpectations"] == "true";
@@ -286,8 +285,7 @@
             ? computePlatformBinariesLocation(forceBuildDir: true)
             : Uri.base.resolve(platformBinaries),
         onlyCrashes,
-        enableControlFlowCollections,
-        enableSpreadCollections,
+        experimentalFlags,
         ignoreExpectations,
         updateExpectations,
         updateComments,
@@ -353,11 +351,8 @@
             }
             errors.writeAll(message.plainTextFormatted, "\n");
           }
-          ..experimentalFlags = <ExperimentalFlag, bool>{
-            ExperimentalFlag.controlFlowCollections:
-                context.enableControlFlowCollections,
-            ExperimentalFlag.spreadCollections: context.enableSpreadCollections,
-          },
+          ..environmentDefines = {}
+          ..experimentalFlags = context.experimentalFlags,
         inputs: <Uri>[description.uri]);
     return await CompilerContext.runWithOptions(options, (_) async {
       // Disable colors to ensure that expectation files are the same across
@@ -475,11 +470,12 @@
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<Library> libraries,
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)}) {
     if (enabled) {
-      super.performModularTransformationsOnLibraries(
-          component, coreTypes, hierarchy, libraries, diagnosticReporter,
+      super.performModularTransformationsOnLibraries(component, coreTypes,
+          hierarchy, libraries, environmentDefines, diagnosticReporter,
           logger: logger);
     }
   }
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 b323164..262886f 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
@@ -72,7 +72,7 @@
   InterfaceType get Q => classQ.rawType;
 
   void test_any_subtype_parameter() {
-    _checkConstraints(Q, T1, ['lib::Q <: T1']);
+    _checkConstraints(Q, T1, ['lib::Q* <: T1']);
   }
 
   void test_any_subtype_top() {
@@ -87,7 +87,7 @@
   }
 
   void test_different_classes() {
-    _checkConstraints(_list(T1), _iterable(Q), ['T1 <: lib::Q']);
+    _checkConstraints(_list(T1), _iterable(Q), ['T1 <: lib::Q*']);
     _checkConstraints(_iterable(T1), _list(Q), null);
   }
 
@@ -142,20 +142,20 @@
   void test_function_parameter_types() {
     // (T1) -> dynamic <: (Q) -> dynamic, under constraint Q <: T1
     _checkConstraints(new FunctionType([T1], dynamicType),
-        new FunctionType([Q], dynamicType), ['lib::Q <: T1']);
+        new FunctionType([Q], dynamicType), ['lib::Q* <: T1']);
     // ({x: T1}) -> dynamic <: ({x: Q}) -> dynamic, under constraint Q <: T1
     _checkConstraints(
         new FunctionType([], dynamicType,
             namedParameters: [new NamedType('x', T1)]),
         new FunctionType([], dynamicType,
             namedParameters: [new NamedType('x', Q)]),
-        ['lib::Q <: T1']);
+        ['lib::Q* <: T1']);
   }
 
   void test_function_return_type() {
     // () -> T1 <: () -> Q, under constraint T1 <: Q
     _checkConstraints(
-        new FunctionType([], T1), new FunctionType([], Q), ['T1 <: lib::Q']);
+        new FunctionType([], T1), new FunctionType([], Q), ['T1 <: lib::Q*']);
     // () -> P <: () -> void, always
     _checkConstraints(
         new FunctionType([], P), new FunctionType([], voidType), []);
@@ -176,25 +176,25 @@
 
   void test_nonInferredParameter_subtype_any() {
     var U = new TypeParameterType(new TypeParameter('U', _list(P)));
-    _checkConstraints(U, _list(T1), ['lib::P <: T1']);
+    _checkConstraints(U, _list(T1), ['lib::P* <: T1']);
   }
 
   void test_null_subtype_any() {
-    _checkConstraints(nullType, T1, ['dart.core::Null <: T1']);
+    _checkConstraints(nullType, T1, ['dart.core::Null* <: T1']);
     _checkConstraints(nullType, Q, []);
   }
 
   void test_parameter_subtype_any() {
-    _checkConstraints(T1, Q, ['T1 <: lib::Q']);
+    _checkConstraints(T1, Q, ['T1 <: lib::Q*']);
   }
 
   void test_same_classes() {
-    _checkConstraints(_list(T1), _list(Q), ['T1 <: lib::Q']);
+    _checkConstraints(_list(T1), _list(Q), ['T1 <: lib::Q*']);
   }
 
   void test_typeParameters() {
     _checkConstraints(
-        _map(T1, T2), _map(P, Q), ['T1 <: lib::P', 'T2 <: lib::Q']);
+        _map(T1, T2), _map(P, Q), ['T1 <: lib::P*', 'T2 <: lib::Q*']);
   }
 
   void test_unknown_subtype_any() {
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 d957370..3e79fd5 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
@@ -21,7 +21,8 @@
   final Class cls = new Class(name: 'C');
 
   bool check(DartType type, List<TypeParameter> typeParameters) {
-    return type.accept(new IncludesTypeParametersCovariantly(typeParameters));
+    return type.accept(new IncludesTypeParametersNonCovariantly(typeParameters,
+        initialVariance: Variance.contravariant));
   }
 
   bool checkContravariant(DartType type, List<TypeParameter> typeParameters) {
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 5a533af..bd78483 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
@@ -38,11 +38,11 @@
     expect(
         greatestClosure(new FunctionType([unknownType], dynamicType))
             .toString(),
-        '(dart.core::Null) → dynamic');
+        '(dart.core::Null*) →* dynamic');
     expect(
         greatestClosure(new FunctionType([], dynamicType,
             namedParameters: [new NamedType('foo', unknownType)])).toString(),
-        '({foo: dart.core::Null}) → dynamic');
+        '({foo: dart.core::Null*}) →* dynamic');
   }
 
   void test_greatestClosure_contravariant_contravariant() {
@@ -51,16 +51,16 @@
           new FunctionType([unknownType], dynamicType)
         ], dynamicType))
             .toString(),
-        '((dynamic) → dynamic) → dynamic');
+        '((dynamic) →* dynamic) →* dynamic');
   }
 
   void test_greatestClosure_covariant() {
     expect(greatestClosure(new FunctionType([], unknownType)).toString(),
-        '() → dynamic');
+        '() →* dynamic');
     expect(
         greatestClosure(new InterfaceType(coreTypes.listClass, [unknownType]))
             .toString(),
-        'dart.core::List<dynamic>');
+        'dart.core::List<dynamic>*');
   }
 
   void test_greatestClosure_function_multipleUnknown() {
@@ -71,8 +71,8 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).toString(),
-        '(dart.core::Null, dart.core::Null, {a: dart.core::Null, '
-        'b: dart.core::Null}) → dynamic');
+        '(dart.core::Null*, dart.core::Null*, {a: dart.core::Null*, '
+        'b: dart.core::Null*}) →* dynamic');
   }
 
   void test_greatestClosure_simple() {
@@ -82,11 +82,11 @@
   void test_leastClosure_contravariant() {
     expect(
         leastClosure(new FunctionType([unknownType], dynamicType)).toString(),
-        '(dynamic) → dynamic');
+        '(dynamic) →* dynamic');
     expect(
         leastClosure(new FunctionType([], dynamicType,
             namedParameters: [new NamedType('foo', unknownType)])).toString(),
-        '({foo: dynamic}) → dynamic');
+        '({foo: dynamic}) →* dynamic');
   }
 
   void test_leastClosure_contravariant_contravariant() {
@@ -95,16 +95,16 @@
           new FunctionType([unknownType], dynamicType)
         ], dynamicType))
             .toString(),
-        '((dart.core::Null) → dynamic) → dynamic');
+        '((dart.core::Null*) →* dynamic) →* dynamic');
   }
 
   void test_leastClosure_covariant() {
     expect(leastClosure(new FunctionType([], unknownType)).toString(),
-        '() → dart.core::Null');
+        '() →* dart.core::Null*');
     expect(
         leastClosure(new InterfaceType(coreTypes.listClass, [unknownType]))
             .toString(),
-        'dart.core::List<dart.core::Null>');
+        'dart.core::List<dart.core::Null*>*');
   }
 
   void test_leastClosure_function_multipleUnknown() {
@@ -114,11 +114,11 @@
               new NamedType('a', unknownType),
               new NamedType('b', unknownType)
             ])).toString(),
-        '(dynamic, dynamic, {a: dynamic, b: dynamic}) → dart.core::Null');
+        '(dynamic, dynamic, {a: dynamic, b: dynamic}) →* dart.core::Null*');
   }
 
   void test_leastClosure_simple() {
-    expect(leastClosure(unknownType).toString(), 'dart.core::Null');
+    expect(leastClosure(unknownType).toString(), 'dart.core::Null*');
   }
 }
 
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 61dc327..8bc8c5c 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
@@ -90,7 +90,7 @@
     expect(
         typeSchemaToString(
             new FunctionType([unknownType, unknownType], unknownType)),
-        '(?, ?) → ?');
+        '(?, ?) →* ?');
   }
 
   void test_visitChildren() {
diff --git a/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart b/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart
index 8b4fe9a..ebc39e7 100644
--- a/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart
+++ b/pkg/front_end/test/fasta/type_promotion_look_ahead_test.dart
@@ -7,7 +7,7 @@
 import 'package:front_end/src/base/processed_options.dart'
     show ProcessedOptions;
 
-import 'package:front_end/src/fasta/builder/builder.dart' show Declaration;
+import 'package:front_end/src/fasta/builder/builder.dart' show Builder;
 
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
@@ -133,7 +133,7 @@
   }
 
   @override
-  Declaration nullValue(String name, Token token) {
+  Builder nullValue(String name, Token token) {
     return new DebugDeclaration(name, uri, token?.charOffset ?? -1);
   }
 
@@ -188,7 +188,7 @@
   }
 }
 
-class DebugDeclaration extends Declaration {
+class DebugDeclaration extends Builder {
   final String name;
 
   @override
@@ -199,7 +199,7 @@
 
   DebugDeclaration(this.name, this.fileUri, this.charOffset);
 
-  Declaration get parent => null;
+  Builder get parent => null;
 
   String get fullNameForErrors => name;
 
diff --git a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
index 31304d3..08b6846 100644
--- a/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
+++ b/pkg/front_end/test/fasta/types/dill_hierachy_test.dart
@@ -25,13 +25,13 @@
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
 import "package:front_end/src/fasta/kernel/kernel_builder.dart"
-    show ClassHierarchyBuilder, KernelClassBuilder;
+    show ClassHierarchyBuilder, ClassBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
 
 import "kernel_type_parser.dart" show parseComponent;
 
-const String expectedHierachy = """
+const String expectedHierarchy = """
 Object:
   superclasses:
   interfaces:
@@ -119,7 +119,7 @@
         final DillLoader loader = target.loader;
         loader.appendLibraries(component);
         await target.buildOutlines();
-        KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+        ClassBuilder objectClass = loader.coreLibrary.getLocalMember("Object");
         ClassHierarchyBuilder hierarchy = new ClassHierarchyBuilder(
             objectClass, loader, new CoreTypes(component));
         Library library = component.libraries.last;
@@ -127,6 +127,6 @@
           hierarchy.getNodeFromKernelClass(cls);
         }
         Expect.stringEquals(
-            expectedHierachy, hierarchy.nodes.values.join("\n"));
+            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 5e53470..1df8f75 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
@@ -21,7 +21,7 @@
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
 import "package:front_end/src/fasta/kernel/kernel_builder.dart"
-    show ClassHierarchyBuilder, KernelClassBuilder;
+    show ClassHierarchyBuilder, ClassBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
 
@@ -46,7 +46,8 @@
     final DillLoader loader = target.loader;
     loader.appendLibraries(component);
     await target.buildOutlines();
-    KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+    ClassBuilder objectClass =
+        loader.coreLibrary.getLocalMember("Object");
     hierarchy = new ClassHierarchyBuilder(
         objectClass, loader, new CoreTypes(component));
   }
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 42ce99d..b09ff9f 100644
--- a/pkg/front_end/test/fasta/types/fasta_types_test.dart
+++ b/pkg/front_end/test/fasta/types/fasta_types_test.dart
@@ -23,7 +23,7 @@
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
 import "package:front_end/src/fasta/kernel/kernel_builder.dart"
-    show ClassHierarchyBuilder, KernelClassBuilder;
+    show ClassHierarchyBuilder, ClassBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
 
@@ -51,7 +51,8 @@
     final DillLoader loader = target.loader;
     loader.appendLibraries(sdk);
     await target.buildOutlines();
-    KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+    ClassBuilder objectClass =
+        loader.coreLibrary.getLocalMember("Object");
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, new CoreTypes(sdk));
     new FastaTypesTest(hierarchy, environment).run();
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 3280ce7..c8af98e 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
@@ -40,14 +40,14 @@
 library core;
 import self as self;
 
-typedef Typedef<T extends self::Object = dynamic> = <S extends self::Object = dynamic>(T) → S;
-typedef VoidFunction = () → void;
-typedef TestDefaultTypes = () → self::DefaultTypes<dynamic, self::Object, self::List<dynamic>, self::List<self::Object>, self::Comparable<dynamic>, (<BottomType>) → void, () → self::Comparable<dynamic>>;
-typedef Id<T extends self::Object = dynamic> = T;
-typedef TestSorting = ({a: self::int, b: self::int, c: self::int}) → void;
+typedef Typedef<T extends self::Object* = dynamic> = <S extends self::Object* = dynamic>(T*) →* S*;
+typedef VoidFunction = () →* void;
+typedef TestDefaultTypes = () →* self::DefaultTypes<dynamic, self::Object, self::List<dynamic>*, self::List<self::Object>*, self::Comparable<dynamic>*, (<BottomType>) →* void, () →* self::Comparable<dynamic>*>;
+typedef Id<T extends self::Object* = dynamic> = T*;
+typedef TestSorting = ({a: self::int, b: self::int, c: self::int}) →* void;
 class Object {
 }
-class Comparable<T extends self::Object = dynamic> extends self::Object {
+class Comparable<T extends self::Object* = dynamic> extends self::Object {
 }
 class num extends self::Object implements self::Comparable<self::num> {
 }
@@ -55,13 +55,13 @@
 }
 class double extends self::num {
 }
-class Iterable<T extends self::Object = dynamic> extends self::Object {
+class Iterable<T extends self::Object* = dynamic> extends self::Object {
 }
-class List<T extends self::Object = dynamic> extends self::Iterable<self::List::T> {
+class List<T extends self::Object* = dynamic> extends self::Iterable<self::List::T*> {
 }
-class Future<T extends self::Object = dynamic> extends self::Object {
+class Future<T extends self::Object* = dynamic> extends self::Object {
 }
-class FutureOr<T extends self::Object = dynamic> extends self::Object {
+class FutureOr<T extends self::Object* = dynamic> extends self::Object {
 }
 class Null extends self::Object {
 }
@@ -71,13 +71,13 @@
 }
 class bool extends self::Object {
 }
-class DefaultTypes<S extends self::Object = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S> = self::List<dynamic>, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>, X extends (self::DefaultTypes::W) → void = (<BottomType>) → void, Y extends () → self::DefaultTypes::W = () → self::Comparable<dynamic>> extends self::Object {
+class DefaultTypes<S extends self::Object* = dynamic, T extends self::Object = self::Object, U extends self::List<self::DefaultTypes::S*> = self::List<dynamic>*, V extends self::List<self::DefaultTypes::T> = self::List<self::Object>*, W extends self::Comparable<self::DefaultTypes::W> = self::Comparable<dynamic>*, X extends (self::DefaultTypes::W) → void = (<BottomType>) →* void, Y extends () → self::DefaultTypes::W = () →* self::Comparable<dynamic>*> extends self::Object {
 }
 class Super extends self::Object implements self::Comparable<self::Sub> {
 }
 class Sub extends self::Super {
 }
-class FBound<T extends self::FBound<self::FBound::T> = self::FBound<dynamic>> extends self::Object {
+class FBound<T extends self::FBound<self::FBound::T> = self::FBound<dynamic>*> extends self::Object {
 }
 class MixinApplication = self::Object with self::FBound<self::MixinApplication> {
 }
diff --git a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
index 26d25da..56aaef4 100644
--- a/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
+++ b/pkg/front_end/test/fasta/types/subtypes_benchmark.dart
@@ -34,7 +34,7 @@
 import "package:front_end/src/fasta/dill/dill_target.dart" show DillTarget;
 
 import "package:front_end/src/fasta/kernel/kernel_builder.dart"
-    show ClassHierarchyBuilder, KernelClassBuilder;
+    show ClassHierarchyBuilder, ClassBuilder;
 
 import "package:front_end/src/fasta/ticker.dart" show Ticker;
 
@@ -149,7 +149,7 @@
     final DillLoader loader = target.loader;
     loader.appendLibraries(c);
     await target.buildOutlines();
-    KernelClassBuilder objectClass = loader.coreLibrary["Object"];
+    ClassBuilder objectClass = loader.coreLibrary.getLocalMember("Object");
     ClassHierarchyBuilder hierarchy =
         new ClassHierarchyBuilder(objectClass, loader, coreTypes);
 
diff --git a/pkg/front_end/test/fasta/unlinked_scope_test.dart b/pkg/front_end/test/fasta/unlinked_scope_test.dart
index fb933f8..6366d5a 100644
--- a/pkg/front_end/test/fasta/unlinked_scope_test.dart
+++ b/pkg/front_end/test/fasta/unlinked_scope_test.dart
@@ -21,11 +21,10 @@
 
 import 'package:front_end/src/fasta/dill/dill_target.dart' show DillTarget;
 
-import 'package:front_end/src/fasta/kernel/kernel_body_builder.dart'
-    show KernelBodyBuilder;
+import 'package:front_end/src/fasta/kernel/body_builder.dart' show BodyBuilder;
 
 import 'package:front_end/src/fasta/kernel/kernel_builder.dart'
-    show KernelLibraryBuilder, KernelProcedureBuilder;
+    show ProcedureBuilder;
 
 import 'package:front_end/src/fasta/kernel/kernel_target.dart'
     show KernelTarget;
@@ -39,9 +38,12 @@
 
 import 'package:front_end/src/fasta/scope.dart' show Scope;
 
+import 'package:front_end/src/fasta/source/source_library_builder.dart'
+    show SourceLibraryBuilder;
+
 DiagnosticMessageHandler handler;
 
-class MockLibraryBuilder extends KernelLibraryBuilder {
+class MockLibraryBuilder extends SourceLibraryBuilder {
   MockLibraryBuilder(Uri uri)
       : super(
             uri,
@@ -53,27 +55,26 @@
                         new NoneTarget(new TargetFlags(legacyMode: true))),
                     null)
                 .loader,
-            null,
             null);
 
-  KernelProcedureBuilder mockProcedure(String name) {
-    return new KernelProcedureBuilder(null, 0, null, name, null, null,
+  ProcedureBuilder mockProcedure(String name) {
+    return new ProcedureBuilder(null, 0, null, name, null, null,
         ProcedureKind.Getter, this, -1, -1, -1, -1);
   }
 }
 
-class MockBodyBuilder extends KernelBodyBuilder {
+class MockBodyBuilder extends BodyBuilder {
   MockBodyBuilder.internal(
       MockLibraryBuilder libraryBuilder, String name, Scope scope)
       : super(libraryBuilder, libraryBuilder.mockProcedure(name), scope, scope,
-            null, null, null, false, libraryBuilder.uri, null);
+            null, null, null, false, null, libraryBuilder.uri, null);
 
   MockBodyBuilder(Uri uri, String name, Scope scope)
       : this.internal(new MockLibraryBuilder(uri), name, scope);
 }
 
 Expression compileExpression(String source) {
-  KernelBodyBuilder listener = new MockBodyBuilder(
+  BodyBuilder listener = new MockBodyBuilder(
       Uri.parse("org-dartlang-test:my_library.dart"),
       "<test>",
       new UnlinkedScope());
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/assert.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/assert.dart
new file mode 100644
index 0000000..27fab8f
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/assert.dart
@@ -0,0 +1,11 @@
+// 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.
+
+f() {
+  late int v;
+  assert((v = 0) >= 0, v);
+  // TODO(paulberry): `v` should be considered unassigned here, because the
+  // assert statement doesn't execute in release mode.
+  v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/assignment.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/assignment.dart
new file mode 100644
index 0000000..bd3472b
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/assignment.dart
@@ -0,0 +1,39 @@
+// 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.
+
+leftExpression() {
+  late List<int> v;
+  /*unassigned*/ v[0] = (v = [1, 2])[1];
+  v;
+}
+
+leftLocal_compound() {
+  late int v;
+  /*unassigned*/ v += 1;
+}
+
+leftLocal_compound_assignInRight() {
+  late int v;
+  /*unassigned*/ v += (v = /*unassigned*/ v);
+}
+
+leftLocal_pure_eq() {
+  late int v;
+  v = 0;
+}
+
+leftLocal_pure_eq_self() {
+  late int v;
+  v = /*unassigned*/ v;
+}
+
+leftLocal_pure_questionEq() {
+  late int v;
+  /*unassigned*/ v ??= 0;
+}
+
+leftLocal_pure_questionEq_self() {
+  late int v;
+  /*unassigned*/ v ??= /*unassigned*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/binary_expression.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/binary_expression.dart
new file mode 100644
index 0000000..370b2f8
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/binary_expression.dart
@@ -0,0 +1,52 @@
+// 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.
+
+ifNull_left() {
+  late int v;
+  (v = 0) ?? 0;
+  v;
+}
+
+ifNull_right(int a) {
+  late int v;
+  a ?? (v = 0);
+  /*unassigned*/ v;
+}
+
+logicalAnd_left(bool c) {
+  late int v;
+  ((v = 0) >= 0) && c;
+  v;
+}
+
+logicalAnd_right(bool c) {
+  late int v;
+  c && ((v = 0) >= 0);
+  /*unassigned*/ v;
+}
+
+logicalOr_left(bool c) {
+  late int v;
+  ((v = 0) >= 0) || c;
+  v;
+}
+
+logicalOr_right(bool c) {
+  late int v;
+  c || ((v = 0) >= 0);
+  /*unassigned*/ v;
+}
+
+plus_left() {
+  late int v;
+  (v = 0) + 1;
+  v;
+}
+
+plus_right() {
+  late int v;
+  1 + (v = 0);
+  v;
+}
+
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/conditional_expression.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/conditional_expression.dart
new file mode 100644
index 0000000..4c83e35
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/conditional_expression.dart
@@ -0,0 +1,27 @@
+// 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.
+
+in_both(bool c) {
+  late int v;
+  c ? (v = 0) : (v = 0);
+  v;
+}
+
+in_condition() {
+  late int v;
+  (v = 0) >= 0 ? 1 : 2;
+  v;
+}
+
+in_else(bool c) {
+  late int v;
+  c ? (v = 0) : 2;
+  /*unassigned*/ v;
+}
+
+in_then(bool c) {
+  late int v;
+  c ? (v = 0) : 2;
+  /*unassigned*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/do.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/do.dart
new file mode 100644
index 0000000..9b637e2
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/do.dart
@@ -0,0 +1,92 @@
+// 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.
+
+break_afterAssignment(bool c) {
+  late int v;
+  do {
+    v = 0;
+    v;
+    if (c) break;
+  } while (c);
+  v;
+}
+
+break_beforeAssignment(bool c) {
+  late int v;
+  do {
+    if (c) break;
+    v = 0;
+  } while (c);
+  /*unassigned*/ v;
+}
+
+breakOuterFromInner(bool c) {
+  late int v1, v2, v3;
+  L1: do {
+    do {
+      v1 = 0;
+      if (c) break L1;
+      v2 = 0;
+      v3 = 0;
+    } while (c);
+    v2;
+  } while (c);
+  v1;
+  /*unassigned*/ v3;
+}
+
+condition() {
+  late int v1, v2;
+  do {
+    /*unassigned*/ v1; // assigned in the condition, but not yet
+  } while ((v1 = 0) + (v2 = 0) >= 0);
+  v2;
+}
+
+condition_break(bool c) {
+  late int v;
+  do {
+    if (c) break;
+  } while ((v = 0) >= 0);
+  /*unassigned*/ v;
+}
+
+condition_break_continue(bool c1, bool c2) {
+  late int v1, v2, v3, v4, v5, v6;
+  do {
+    v1 = 0; // visible outside, visible to the condition
+    if (c1) break;
+    v2 = 0; // not visible outside, visible to the condition
+    v3 = 0; // not visible outside, visible to the condition
+    if (c2) continue;
+    v4 = 0; // not visible
+    v5 = 0; // not visible
+  } while ((v6 = v1 + v2 + /*unassigned*/ v4) == 0); // has break => v6 is not visible outside
+  v1;
+  /*unassigned*/ v3;
+  /*unassigned*/ v5;
+  /*unassigned*/ v6;
+}
+
+condition_continue(bool c) {
+  late int v1, v2, v3, v4;
+  do {
+    v1 = 0; // visible outside, visible to the condition
+    if (c) continue;
+    v2 = 0; // not visible
+    v3 = 0; // not visible
+  } while ((v4 = v1 + /*unassigned*/ v2) == 0); // no break => v4 visible outside
+  v1;
+  /*unassigned*/ v3;
+  v4;
+}
+
+continue_beforeAssignment(bool c) {
+  late int v;
+  do {
+    if (c) continue;
+    v = 0;
+  } while (c);
+  /*unassigned*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/for.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/for.dart
new file mode 100644
index 0000000..ecf3808
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/for.dart
@@ -0,0 +1,90 @@
+// 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.
+
+for_body(bool c) {
+  late int v;
+  for (; c;) {
+    v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+for_break(bool c) {
+  late int v1, v2;
+  for (; c;) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+  /*unassigned*/ v1;
+  /*unassigned*/ v2;
+}
+
+for_break_updaters(bool c) {
+  late int v1, v2;
+  for (; c; v1 + v2) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+}
+
+for_condition() {
+  late int v;
+  for (; (v = 0) >= 0;) {
+    v;
+  }
+  v;
+}
+
+for_continue(bool c) {
+  late int v1, v2;
+  for (; c;) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+  /*unassigned*/ v1;
+  /*unassigned*/ v2;
+}
+
+for_continue_updaters(bool c) {
+  late int v1, v2;
+  for (; c; v1 + /*unassigned*/ v2) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+}
+
+for_initializer_expression() {
+  late int v;
+  for (v = 0;;) {
+    v;
+  }
+  v;
+}
+
+for_initializer_variable() {
+  late int v;
+  for (var t = (v = 0);;) {
+    v;
+  }
+  v;
+}
+
+for_updaters(bool c) {
+  late int v1, v2, v3, v4;
+  for (; c; v1 = 0, v2 = 0, v3 = 0, /*unassigned*/ v4) {
+    /*unassigned*/ v1;
+  }
+  /*unassigned*/ v2;
+}
+
+for_updaters_afterBody(bool c) {
+  late int v;
+  for (; c; v) {
+    v = 0;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/for_each.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/for_each.dart
new file mode 100644
index 0000000..ab029d8
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/for_each.dart
@@ -0,0 +1,34 @@
+// 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.
+
+forEach() {
+  late Object v1, v2;
+  for (var _ in (v1 = [0, 1, 2])) {
+    v2 = 0;
+  }
+  v1;
+  /*unassigned*/ v2;
+}
+
+forEach_break(bool c) {
+  late int v1, v2;
+  for (var _ in [0, 1, 2]) {
+    v1 = 0;
+    if (c) break;
+    v2 = 0;
+  }
+  /*unassigned*/ v1;
+  /*unassigned*/ v2;
+}
+
+forEach_continue(bool c) {
+  late int v1, v2;
+  for (var _ in [0, 1, 2]) {
+    v1 = 0;
+    if (c) continue;
+    v2 = 0;
+  }
+  /*unassigned*/ v1;
+  /*unassigned*/ v2;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/function_expression.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/function_expression.dart
new file mode 100644
index 0000000..68d706b
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/function_expression.dart
@@ -0,0 +1,72 @@
+// 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.
+
+closure_read() {
+  late int v1, v2;
+  
+  v1 = 0;
+  
+  [0, 1, 2].forEach((t) {
+    v1;
+    /*unassigned*/ v2;
+  });
+}
+
+closure_write() {
+  late int v;
+  
+  [0, 1, 2].forEach((t) {
+    v = t;
+  });
+
+  /*unassigned*/ v;
+}
+
+localFunction_local() {
+  late int v;
+
+  v = 0;
+
+  void f() {
+    late int v;
+    /*unassigned*/ v;
+  }
+}
+
+localFunction_local2() {
+  late int v1;
+
+  v1 = 0;
+
+  void f() {
+    late int v2, v3;
+    v2 = 0;
+    v1;
+    v2;
+    /*unassigned*/ v3;
+  }
+}
+
+localFunction_read() {
+  late int v1, v2, v3;
+
+  v1 = 0;
+
+  void f() {
+    v1;
+    /*unassigned*/ v2;
+  }
+
+  v2 = 0;
+}
+
+localFunction_write() {
+  late int v;
+
+  void f() {
+    v = 0;
+  }
+
+  /*unassigned*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/if.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/if.dart
new file mode 100644
index 0000000..6f4abca
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/if.dart
@@ -0,0 +1,89 @@
+// 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.
+
+if_condition() {
+  late int v;
+  if ((v = 0) >= 0) {
+    v;
+  } else {
+    v;
+  }
+  v;
+}
+
+if_then(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+if_thenElse_all(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+    v;
+  } else {
+    v = 0;
+    v;
+  }
+  v;
+}
+
+if_thenElse_else(bool c) {
+  late int v;
+  if (c) {
+    // not assigned
+  } else {
+    v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+if_thenElse_then(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+  } else {
+    // not assigned
+  }
+  /*unassigned*/ v;
+}
+
+if_thenElse_then_exit_alwaysThrows(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+  } else {
+    foo();
+  }
+  // TODO(paulberry): flow analysis should understand that foo never returns, so
+  // `v` is definitely assigned here.
+  /*unassigned*/ v;
+}
+
+Never foo() {
+  throw Object();
+}
+
+if_thenElse_then_exit_return(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+  } else {
+    return;
+  }
+  v;
+}
+
+if_thenElse_then_exit_throw(bool c) {
+  late int v;
+  if (c) {
+    v = 0;
+  } else {
+    throw 42;
+  }
+  v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/switch.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/switch.dart
new file mode 100644
index 0000000..0c83ea0
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/switch.dart
@@ -0,0 +1,81 @@
+// 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.
+
+case1_default(int e) {
+  late int v;
+  switch (e) {
+    case 1:
+      v = 0;
+      break;
+    case 2:
+      // not assigned
+      break;
+    default:
+      v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+case2_default(int e) {
+  late int v1, v2;
+  switch (e) {
+    case 1:
+      v1 = 0;
+      v2 = 0;
+      v1;
+      break;
+    default:
+      v1 = 0;
+      v1;
+  }
+  v1;
+  /*unassigned*/ v2;
+}
+
+case_default_break(int e, bool c) {
+  late int v1, v2;
+  switch (e) {
+    case 1:
+      v1 = 0;
+      if (c) break;
+      v2 = 0;
+      break;
+    default:
+      v1 = 0;
+      if (c) break;
+      v2 = 0;
+  }
+  v1;
+  /*unassigned*/ v2;
+}
+
+case_default_continue(int e) {
+  late int v;
+  switch (e) {
+    L: case 1:
+      v = 0;
+      break;
+    case 2:
+      continue L;
+    default:
+      v = 0;
+  }
+  v;
+}
+
+case_noDefault(int e) {
+  late int v;
+  switch (e) {
+    case 1:
+      v = 0;
+      break;
+  }
+  /*unassigned*/ v;
+}
+
+condition() {
+  late int v;
+  switch (v = 0) {}
+  v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/try.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/try.dart
new file mode 100644
index 0000000..383e0a0
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/try.dart
@@ -0,0 +1,92 @@
+// 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.
+
+void f() {}
+
+tryCatch_all() {
+  late int v;
+  try {
+    f();
+    v = 0;
+  } catch (_) {
+    v = 0;
+  }
+  v;
+}
+
+tryCatch_catch() {
+  late int v;
+  try {
+    // not assigned
+  } catch (_) {
+    v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+tryCatch_try() {
+  late int v;
+  try {
+    v = 0;
+  } catch (_) {
+    // not assigned
+  }
+  /*unassigned*/ v;
+}
+
+tryCatchFinally_catch() {
+  late int v;
+  try {
+    // not assigned
+  } catch (_) {
+    v = 0;
+  } finally {
+    // not assigned
+  }
+  /*unassigned*/ v;
+}
+
+tryCatchFinally_finally() {
+  late int v;
+  try {
+    // not assigned
+  } catch (_) {
+    // not assigned
+  } finally {
+    v = 0;
+  }
+  v;
+}
+
+tryCatchFinally_try() {
+  late int v;
+  try {
+    v = 0;
+  } catch (_) {
+    // not assigned
+  } finally {
+    // not assigned
+  }
+  /*unassigned*/ v;
+}
+
+tryFinally_finally() {
+  late int v;
+  try {
+    // not assigned
+  } finally {
+    v = 0;
+  }
+  v;
+}
+
+tryFinally_try() {
+  late int v;
+  try {
+    v = 0;
+  } finally {
+    // not assigned
+  }
+  v;
+}
diff --git a/pkg/front_end/test/flow_analysis/definite_assignment/data/while.dart b/pkg/front_end/test/flow_analysis/definite_assignment/data/while.dart
new file mode 100644
index 0000000..487d72b
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/definite_assignment/data/while.dart
@@ -0,0 +1,123 @@
+// 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.
+
+condition() {
+  late int v;
+  while ((v = 0) >= 0) {
+    v;
+  }
+  v;
+}
+
+condition_notTrue(bool c) {
+  late int v1, v2;
+  while (c) {
+    v1 = 0;
+    v2 = 0;
+    v1;
+  }
+  /*unassigned*/ v2;
+}
+
+true_break_afterAssignment(bool c) {
+  late int v1, v2;
+  while (true) {
+    v1 = 0;
+    v1;
+    if (c) break;
+    v1;
+    v2 = 0;
+    v2;
+  }
+  v1;
+}
+
+true_break_beforeAssignment(bool c) {
+  late int v1, v2;
+  while (true) {
+    if (c) break;
+    v1 = 0;
+    v2 = 0;
+    v2;
+  }
+  /*unassigned*/ v1;
+}
+
+true_break_if(bool c) {
+  late int v;
+  while (true) {
+    if (c) {
+      v = 0;
+      break;
+    } else {
+      v = 0;
+      break;
+    }
+    v;
+  }
+  v;
+}
+
+true_break_if2(bool c) {
+  late Object v;
+  while (true) {
+    if (c) {
+      break;
+    } else {
+      v = 0;
+    }
+    v;
+  }
+}
+
+true_break_if3(bool c) {
+  late int v1, v2;
+  while (true) {
+    if (c) {
+      v1 = 0;
+      v2 = 0;
+      if (c) break;
+    } else {
+      if (c) break;
+      v1 = 0;
+      v2 = 0;
+    }
+    v1;
+  }
+  /*unassigned*/ v2;
+}
+
+true_breakOuterFromInner(bool c) {
+  late int v1, v2, v3;
+  L1: while (true) {
+    L2: while (true) {
+      v1 = 0;
+      if (c) break L1;
+      v2 = 0;
+      v3 = 0;
+      if (c) break L2;
+    }
+    v2;
+  }
+  v1;
+  /*unassigned*/ v3;
+}
+
+true_continue(bool c) {
+  late int v;
+  while (true) {
+    if (c) continue;
+    v = 0;
+  }
+  /*unassigned*/ v;
+}
+
+true_noBreak(bool c) {
+  late int v;
+  while (true) {
+    // No assignment, but not break.
+    // So, we don't exit the loop.
+  }
+  /*unassigned*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/assign.dart b/pkg/front_end/test/flow_analysis/nullability/data/assign.dart
new file mode 100644
index 0000000..f120d03
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/assign.dart
@@ -0,0 +1,32 @@
+// 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.
+
+void toNonNull(int? x) {
+  if (x != null) return;
+  x;
+  x = 0;
+  // TODO(paulberry): x should be known to be non-nullable now
+  x;
+}
+
+void toNull(int? x) {
+  if (x == null) return;
+  /*nonNullable*/ x;
+  x = null;
+  x;
+}
+
+void toUnknown_fromNotNull(int? a, int? b) {
+  if (a == null) return;
+  /*nonNullable*/ a;
+  a = b;
+  a;
+}
+
+void toUnknown_fromNull(int? a, int? b) {
+  if (a != null) return;
+  a;
+  a = b;
+  a;
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/if.dart b/pkg/front_end/test/flow_analysis/nullability/data/if.dart
new file mode 100644
index 0000000..44f2be0
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/if.dart
@@ -0,0 +1,63 @@
+// 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.
+
+void if_joinThenElse_ifNull(int? a, int? b) {
+  if (a == null) {
+    a;
+    if (b == null) return;
+    /*nonNullable*/ b;
+  } else {
+    /*nonNullable*/ a;
+    if (b == null) return;
+    /*nonNullable*/ b;
+  }
+  a;
+  /*nonNullable*/ b;
+}
+
+void if_notNull_thenExit_left(int? x) {
+  if (null != x) return;
+  x;
+}
+
+void if_notNull_thenExit_right(int? x) {
+  if (x != null) return;
+  x;
+}
+
+void if_null_thenExit_left(int? x) {
+  if (null == x) return;
+  /*nonNullable*/ x;
+}
+
+void if_null_thenExit_right(int? x) {
+  if (x == null) return;
+  /*nonNullable*/ x;
+}
+
+void if_then_else(int? x) {
+  if (x == null) {
+    x;
+  } else {
+    /*nonNullable*/ x;
+  }
+}
+
+class C {
+  void method_if_then_else(int? x) {
+    if (x == null) {
+      x;
+    } else {
+      /*nonNullable*/ x;
+    }
+  }
+
+  C.constructor_if_then_else(int? x) {
+    if (x == null) {
+      x;
+    } else {
+      /*nonNullable*/ x;
+    }
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/is.dart b/pkg/front_end/test/flow_analysis/nullability/data/is.dart
new file mode 100644
index 0000000..e922aa9
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/is.dart
@@ -0,0 +1,11 @@
+// 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.
+
+void promotes_nullability(int? x) {
+  if (x is int) {
+    /*nonNullable*/ x;
+  } else {
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/logical.dart b/pkg/front_end/test/flow_analysis/nullability/data/logical.dart
new file mode 100644
index 0000000..23b4b3c
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/logical.dart
@@ -0,0 +1,11 @@
+// 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.
+
+void logicalAnd(int? x) {
+  x == null && x!.isEven;
+}
+
+void logicalOr(int? x) {
+  x == null || /*nonNullable*/ x.isEven;
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/potentially_mutated_in_closure.dart b/pkg/front_end/test/flow_analysis/nullability/data/potentially_mutated_in_closure.dart
new file mode 100644
index 0000000..5459855
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/potentially_mutated_in_closure.dart
@@ -0,0 +1,15 @@
+// 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.
+
+f(int? a, int? b) {
+  localFunction() {
+    a = b;
+  }
+
+  if (a == null) {
+    a;
+    localFunction();
+    a;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/try_finally.dart b/pkg/front_end/test/flow_analysis/nullability/data/try_finally.dart
new file mode 100644
index 0000000..42d8f07
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/try_finally.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.
+
+void eqNullExit_body(int? x) {
+  try {
+    if (x == null) return;
+    /*nonNullable*/ x;
+  } finally {
+    x;
+  }
+  /*nonNullable*/ x;
+}
+
+void eqNullExit_finally(int? x) {
+  try {
+    x;
+  } finally {
+    if (x == null) return;
+    /*nonNullable*/ x;
+  }
+  /*nonNullable*/ x;
+}
+
+void outerEqNotNullExit_assignUnknown_body(int? a, int? b) {
+  if (a != null) return;
+  try {
+    a;
+    a = b;
+    a;
+  } finally {
+    a;
+  }
+  a;
+}
+
+void outerEqNullExit_assignUnknown_body(int? a, int? b) {
+  if (a == null) return;
+  try {
+    /*nonNullable*/ a;
+    a = b;
+    a;
+  } finally {
+    a;
+  }
+  a;
+}
+
+void outerEqNullExit_assignUnknown_finally(int? a, int? b) {
+  if (a == null) return;
+  try {
+    /*nonNullable*/ a;
+  } finally {
+    /*nonNullable*/ a;
+    a = b;
+    a;
+  }
+  a;
+}
diff --git a/pkg/front_end/test/flow_analysis/nullability/data/while.dart b/pkg/front_end/test/flow_analysis/nullability/data/while.dart
new file mode 100644
index 0000000..7e7cf10
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/nullability/data/while.dart
@@ -0,0 +1,17 @@
+// 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.
+
+void eqNull(int? x) {
+  while (x == null) {
+    x;
+  }
+  /*nonNullable*/ x;
+}
+
+void notEqNull(int? x) {
+  while (x != null) {
+    /*nonNullable*/ x;
+  }
+  x;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/conditional.dart b/pkg/front_end/test/flow_analysis/reachability/data/conditional.dart
new file mode 100644
index 0000000..d712718
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/conditional.dart
@@ -0,0 +1,11 @@
+// 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.
+
+void conditional_false() {
+  false ? /*unreachable*/ 1 : 2;
+}
+
+void conditional_true() {
+  true ? 1 : /*unreachable*/ 2;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/do.dart b/pkg/front_end/test/flow_analysis/reachability/data/do.dart
new file mode 100644
index 0000000..845af7b
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/do.dart
@@ -0,0 +1,18 @@
+// 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.
+
+void do_false() {
+  do {
+    1;
+  } while (false);
+  2;
+}
+
+/*member: do_true:doesNotComplete*/
+void do_true() {
+  do {
+    1;
+  } while (true);
+  /*stmt: unreachable*/ 2;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/early_exit.dart b/pkg/front_end/test/flow_analysis/reachability/data/early_exit.dart
new file mode 100644
index 0000000..b244972
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/early_exit.dart
@@ -0,0 +1,16 @@
+// 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.
+
+/*member: beforeSplitStatement:doesNotComplete*/
+void beforeSplitStatement(bool b, int i) {
+  return;
+  /*stmt: unreachable*/ do {} while (b);
+  /*stmt: unreachable*/ for (;;) {}
+  /*stmt: unreachable*/ for (var _ in []) {}
+  /*stmt: unreachable*/ if (b) {}
+  /*stmt: unreachable*/ switch (i) {
+  }
+  /*stmt: unreachable*/ try {} finally {}
+  /*stmt: unreachable*/ while (b) {}
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/for.dart b/pkg/front_end/test/flow_analysis/reachability/data/for.dart
new file mode 100644
index 0000000..9d09dbf
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/for.dart
@@ -0,0 +1,27 @@
+// 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.
+
+/*member: condition_true:doesNotComplete*/
+void condition_true() {
+  for (; true;) {
+    1;
+  }
+  /*stmt: unreachable*/ 2;
+}
+
+/*member: condition_true_implicit:doesNotComplete*/
+void condition_true_implicit() {
+  for (;;) {
+    1;
+  }
+  /*stmt: unreachable*/ 2;
+}
+
+void forEach() {
+  for (var _ in [0, 1, 2]) {
+    1;
+    return;
+  }
+  2;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/function_body.dart b/pkg/front_end/test/flow_analysis/reachability/data/function_body.dart
new file mode 100644
index 0000000..81c1e96
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/function_body.dart
@@ -0,0 +1,12 @@
+// 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.
+
+/*member: hasReturn:doesNotComplete*/
+int hasReturn() {
+  return 42;
+}
+
+void noReturn() {
+  1;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/switch.dart b/pkg/front_end/test/flow_analysis/reachability/data/switch.dart
new file mode 100644
index 0000000..82e0b50
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/switch.dart
@@ -0,0 +1,17 @@
+// 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.
+
+void case_never_completes(bool b, int i) {
+  switch (i) {
+    case 1:
+      1;
+      if (b) {
+        return;
+      } else {
+        return;
+      }
+      /*stmt: unreachable*/ 2;
+  }
+  3;
+}
diff --git a/pkg/front_end/test/flow_analysis/reachability/data/try_catch.dart b/pkg/front_end/test/flow_analysis/reachability/data/try_catch.dart
new file mode 100644
index 0000000..2f39774
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/reachability/data/try_catch.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.
+
+void basic() {
+  try {
+    1;
+  } catch (_) {
+    2;
+  }
+  3;
+}
+
+void return_body() {
+  try {
+    1;
+    return;
+    /*stmt: unreachable*/ 2;
+  } catch (_) {
+    3;
+  }
+  4;
+}
+
+void return_catch() {
+  try {
+    1;
+  } catch (_) {
+    2;
+    return;
+    /*stmt: unreachable*/ 3;
+  }
+  4;
+}
+
+void return_body2() {
+  try {
+    1;
+    return;
+  } catch (_) {
+    2;
+  } finally {
+    3;
+  }
+  4;
+}
+
+/*member: return_bodyCatch:doesNotComplete*/
+void return_bodyCatch() {
+  try {
+    1;
+    return;
+  } catch (_) {
+    2;
+    return;
+  } finally {
+    3;
+  }
+  /*stmt: unreachable*/ 4;
+}
+
+void return_catch2() {
+  try {
+    1;
+  } catch (_) {
+    2;
+    return;
+  } finally {
+    3;
+  }
+  4;
+}
+
+/*member: return_body3:doesNotComplete*/
+void return_body3() {
+  try {
+    1;
+    return;
+  } finally {
+    2;
+  }
+  /*stmt: unreachable*/ 3;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/assignment.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/assignment.dart
new file mode 100644
index 0000000..5e1d384
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/assignment.dart
@@ -0,0 +1,10 @@
+// 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.
+
+f(Object x) {
+  if (x is String) {
+    x = 42;
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/binary.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/binary.dart
new file mode 100644
index 0000000..addc66a
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/binary.dart
@@ -0,0 +1,21 @@
+// 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.
+
+void ifNull(Object x) {
+  ((x is num) || (throw 1)) ?? ((/*num*/ x is int) || (throw 2));
+  /*num*/ x;
+}
+
+void ifNull_rightUnPromote(Object x, Object y, Object z) {
+  if (x is int) {
+    /*int*/ x;
+    y ?? (x = z);
+    x;
+  }
+}
+
+logicalOr_throw(v) {
+  v is String || (throw 42);
+  /*String*/ v;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/conditional.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/conditional.dart
new file mode 100644
index 0000000..d138147
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/conditional.dart
@@ -0,0 +1,18 @@
+// 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.
+
+void conditional_both(bool b, Object x) {
+  b ? ((x is num) || (throw 1)) : ((x is int) || (throw 2));
+  /*num*/ x;
+}
+
+void conditional_else(bool b, Object x) {
+  b ? 0 : ((x is int) || (throw 2));
+  x;
+}
+
+void conditional_then(bool b, Object x) {
+  b ? ((x is num) || (throw 1)) : 0;
+  x;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/do.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/do.dart
new file mode 100644
index 0000000..7fb803e
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/do.dart
@@ -0,0 +1,55 @@
+// 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.
+
+void condition_isNotType(Object x) {
+  do {
+    x;
+  } while (x is! String);
+  /*String*/ x;
+}
+
+void condition_isType(Object x) {
+  do {
+    x;
+  } while (x is String);
+  x;
+}
+
+void outerIsType(bool b, Object x) {
+  if (x is String) {
+    do {
+      /*String*/ x;
+    } while (b);
+    /*String*/ x;
+  }
+}
+
+void outerIsType_loopAssigned_body(bool b, Object x) {
+  if (x is String) {
+    do {
+      x;
+      x = (x as String).length;
+    } while (b);
+    x;
+  }
+}
+
+void outerIsType_loopAssigned_condition(bool b, Object x) {
+  if (x is String) {
+    do {
+      x;
+      x = (x as String).length;
+    } while (x != 0);
+    x;
+  }
+}
+
+void outerIsType_loopAssigned_condition2(bool b, Object x) {
+  if (x is String) {
+    do {
+      x;
+    } while ((x = 1) != 0);
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/for.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/for.dart
new file mode 100644
index 0000000..33f49a6
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/for.dart
@@ -0,0 +1,58 @@
+// 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.
+
+Object g() => Null;
+
+void for_declaredVar() {
+  for (Object x = g(); x is int; x = g()) {
+    /*int*/ x;
+  }
+}
+
+void for_outerIsType(bool b, Object x) {
+  if (x is String) {
+    for (; b;) {
+      /*String*/ x;
+    }
+    /*String*/ x;
+  }
+}
+
+void for_outerIsType_loopAssigned_body(bool b, Object x) {
+  if (x is String) {
+    for (; b;) {
+      x;
+      x = 42;
+    }
+    x;
+  }
+}
+
+void for_outerIsType_loopAssigned_condition(Object x) {
+  if (x is String) {
+    for (; (x = 42) > 0;) {
+      x;
+    }
+    x;
+  }
+}
+
+void for_outerIsType_loopAssigned_updaters(bool b, Object x) {
+  if (x is String) {
+    for (; b; x = 42) {
+      x;
+    }
+    x;
+  }
+}
+
+void forEach_outerIsType_loopAssigned(Object x) {
+  if (x is String) {
+    for (var _ in [0, 1, 2]) {
+      x;
+      x = 42;
+    }
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/function_expression.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/function_expression.dart
new file mode 100644
index 0000000..98cbd9a
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/function_expression.dart
@@ -0,0 +1,40 @@
+// 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.
+
+void isType() {
+  void g(Object x) {
+    if (x is String) {
+      /*String*/ x;
+    }
+    x = 42;
+  }
+}
+
+void isType_mutatedInclosure2() {
+  void g(Object x) {
+    if (x is String) {
+      x;
+    }
+
+    void h() {
+      x = 42;
+    }
+  }
+}
+
+void outerIsType_assignedOutside(Object x) {
+  void Function() g;
+
+  if (x is String) {
+    /*String*/ x;
+
+    g = () {
+      x;
+    };
+  }
+
+  x = 42;
+  x;
+  g();
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/if.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/if.dart
new file mode 100644
index 0000000..60d1eb6
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/if.dart
@@ -0,0 +1,80 @@
+// 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.
+
+combine_empty(bool b, Object v) {
+  if (b) {
+    v is int || (throw 1);
+  } else {
+    v is String || (throw 2);
+  }
+  v;
+}
+
+conditional_isNotType(bool b, Object v) {
+  if (b ? (v is! int) : (v is! num)) {
+    v;
+  } else {
+    /*num*/ v;
+  }
+  v;
+}
+
+conditional_isType(bool b, Object v) {
+  if (b ? (v is int) : (v is num)) {
+    /*num*/ v;
+  } else {
+    v;
+  }
+  v;
+}
+
+isNotType(v) {
+  if (v is! String) {
+    v;
+  } else {
+    /*String*/ v;
+  }
+  v;
+}
+
+isNotType_return(v) {
+  if (v is! String) return;
+  /*String*/ v;
+}
+
+isNotType_throw(v) {
+  if (v is! String) throw 42;
+  /*String*/ v;
+}
+
+isType(v) {
+  if (v is String) {
+    /*String*/ v;
+  } else {
+    v;
+  }
+  v;
+}
+
+isType_thenNonBoolean(Object x) {
+  if ((x is String) != 3) {
+    x;
+  }
+}
+
+logicalNot_isType(v) {
+  if (!(v is String)) {
+    v;
+  } else {
+    /*String*/ v;
+  }
+  v;
+}
+
+void isNotType_return2(bool b, Object x) {
+  if (b) {
+    if (x is! String) return;
+  }
+  x;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/null_check.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/null_check.dart
new file mode 100644
index 0000000..e8c4389
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/null_check.dart
@@ -0,0 +1,19 @@
+// 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.
+
+doesNotPromoteNonNullableType(int x) {
+  if (x != null) {
+    x;
+  } else {
+    x;
+  }
+}
+
+promotesNullableType(int? x) {
+  if (x != null) {
+    /*int*/ x;
+  } else {
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/potentially_mutated.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/potentially_mutated.dart
new file mode 100644
index 0000000..8ad9a96
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/potentially_mutated.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.
+
+potentiallyMutatedInClosure(Object x) {
+  localFunction() {
+    x = 42;
+  }
+
+  if (x is String) {
+    localFunction();
+    x;
+  }
+}
+
+potentiallyMutatedInScope(Object x) {
+  if (x is String) {
+    /*String*/ x;
+  }
+
+  x = 42;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/switch.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/switch.dart
new file mode 100644
index 0000000..9939bb7
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/switch.dart
@@ -0,0 +1,21 @@
+// 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.
+
+void outerIsType_assignedInCase(int e, Object x) {
+  if (x is String) {
+    switch (e) {
+      L:
+      case 1:
+        x;
+        break;
+      case 2: // no label
+        /*String*/ x;
+        break;
+      case 3:
+        x = 42;
+        continue L;
+    }
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch.dart
new file mode 100644
index 0000000..0963bd4
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch.dart
@@ -0,0 +1,55 @@
+// 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.
+
+void g() {}
+
+void tryCatch_assigned_body(Object x) {
+  if (x is! String) return;
+  /*String*/ x;
+  try {
+    x = 42;
+    g(); // might throw
+    if (x is! String) return;
+    /*String*/ x;
+  } catch (_) {}
+  x;
+}
+
+void tryCatch_isNotType_exit_body(Object x) {
+  try {
+    if (x is! String) return;
+    /*String*/ x;
+  } catch (_) {}
+  x;
+}
+
+void isNotType_exit_body_catch(Object x) {
+  try {
+    if (x is! String) return;
+    /*String*/ x;
+  } catch (_) {
+    if (x is! String) return;
+    /*String*/ x;
+  }
+  /*String*/ x;
+}
+
+void isNotType_exit_body_catchRethrow(Object x) {
+  try {
+    if (x is! String) return;
+    /*String*/ x;
+  } catch (_) {
+    x;
+    rethrow;
+  }
+  /*String*/ x;
+}
+
+void isNotType_exit_catch(Object x) {
+  try {} catch (_) {
+    if (x is! String) return;
+    /*String*/ x;
+  }
+  x;
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch_finally.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch_finally.dart
new file mode 100644
index 0000000..7212d98
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/try_catch_finally.dart
@@ -0,0 +1,47 @@
+// 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.
+
+void g() {}
+
+void outerIsType(Object x) {
+  if (x is String) {
+    try {
+      /*String*/ x;
+    } catch (_) {
+      /*String*/ x;
+    } finally {
+      /*String*/ x;
+    }
+    /*String*/ x;
+  }
+}
+
+void outerIsType_assigned_body(Object x) {
+  if (x is String) {
+    try {
+      /*String*/ x;
+      x = 42;
+      g();
+    } catch (_) {
+      x;
+    } finally {
+      x;
+    }
+    x;
+  }
+}
+
+void outerIsType_assigned_catch(Object x) {
+  if (x is String) {
+    try {
+      /*String*/ x;
+    } catch (_) {
+      /*String*/ x;
+      x = 42;
+    } finally {
+      x;
+    }
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/try_finally.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/try_finally.dart
new file mode 100644
index 0000000..045e2fe
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/try_finally.dart
@@ -0,0 +1,27 @@
+// 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.
+
+void outerIsType_assigned_body(Object x) {
+  if (x is String) {
+    try {
+      /*String*/ x;
+      x = 42;
+    } finally {
+      x;
+    }
+    x;
+  }
+}
+
+void outerIsType_assigned_finally(Object x) {
+  if (x is String) {
+    try {
+      /*String*/ x;
+    } finally {
+      /*String*/ x;
+      x = 42;
+    }
+    x;
+  }
+}
diff --git a/pkg/front_end/test/flow_analysis/type_promotion/data/while.dart b/pkg/front_end/test/flow_analysis/type_promotion/data/while.dart
new file mode 100644
index 0000000..6b5de89
--- /dev/null
+++ b/pkg/front_end/test/flow_analysis/type_promotion/data/while.dart
@@ -0,0 +1,46 @@
+// 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.
+
+void condition_false(Object x) {
+  while (x is! String) {
+    x;
+  }
+  /*String*/ x;
+}
+
+void condition_true(Object x) {
+  while (x is String) {
+    /*String*/ x;
+  }
+  x;
+}
+
+void outerIsType(bool b, Object x) {
+  if (x is String) {
+    while (b) {
+      /*String*/ x;
+    }
+    /*String*/ x;
+  }
+}
+
+void outerIsType_loopAssigned_body(bool b, Object x) {
+  if (x is String) {
+    while (b) {
+      x;
+      x = (x as String).length;
+    }
+    x;
+  }
+}
+
+void outerIsType_loopAssigned_condition(bool b, Object x) {
+  if (x is String) {
+    while (x != 0) {
+      x;
+      x = (x as String).length;
+    }
+    x;
+  }
+}
diff --git a/pkg/front_end/test/id_testing/data/declarations.dart b/pkg/front_end/test/id_testing/data/declarations.dart
new file mode 100644
index 0000000..8f00ad4
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/declarations.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: file=main.dart*/
+
+/*member: main:main*/
+main() {
+  // ignore: unused_element
+  /*main.localFunction*/ localFunction() {}
+
+  /*main.<anonymous>*/
+  () {};
+
+  // Use all declarations.
+  setter = field = getter;
+  var c = new Class();
+  c = new Class.constructor();
+  c.setter = c.field = c.getter;
+  c.method();
+}
+
+/*member: field:field*/
+var field;
+
+/*member: getter:getter*/
+get getter => null;
+
+/*member: setter=:setter=*/
+set setter(_) {}
+
+/*class: Class:Class*/
+class Class {
+  /*member: Class.:Class.*/
+  Class();
+
+  /*member: Class.constructor:Class.constructor*/
+  factory Class.constructor() => new Class();
+
+  /*member: Class.field:Class.field*/
+  var field;
+
+  /*member: Class.getter:Class.getter*/
+  get getter => null;
+
+  /*member: Class.setter=:Class.setter=*/
+  set setter(_) {}
+
+  /*member: Class.method:Class.method*/
+  void method() {
+    // ignore: unused_element
+    /*Class.method.localFunction*/ localFunction() {}
+
+    /*Class.method.<anonymous>*/
+    () {};
+  }
+}
diff --git a/pkg/front_end/test/id_testing/data/directory_testing/.packages b/pkg/front_end/test/id_testing/data/directory_testing/.packages
new file mode 100644
index 0000000..554a99c
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/directory_testing/.packages
@@ -0,0 +1 @@
+foo:lib/
\ No newline at end of file
diff --git a/pkg/front_end/test/id_testing/data/directory_testing/lib/foo.dart b/pkg/front_end/test/id_testing/data/directory_testing/lib/foo.dart
new file mode 100644
index 0000000..b630b38
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/directory_testing/lib/foo.dart
@@ -0,0 +1,10 @@
+// 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: file=foo.dart*/
+
+/*member: fooMethod:fooMethod*/
+fooMethod() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/id_testing/data/directory_testing/library.dart b/pkg/front_end/test/id_testing/data/directory_testing/library.dart
new file mode 100644
index 0000000..035d476
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/directory_testing/library.dart
@@ -0,0 +1,16 @@
+// 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: file=library.dart*/
+
+import 'package:foo/foo.dart';
+
+/*member: libraryInteger:libraryInteger*/
+int libraryInteger = 42;
+
+/*member: methodFromLibrary:methodFromLibrary*/
+methodFromLibrary() {
+  print(libraryInteger);
+  fooMethod();
+}
diff --git a/pkg/front_end/test/id_testing/data/directory_testing/main.dart b/pkg/front_end/test/id_testing/data/directory_testing/main.dart
new file mode 100644
index 0000000..ea6f23f
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/directory_testing/main.dart
@@ -0,0 +1,12 @@
+// 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: file=main.dart*/
+
+import 'library.dart';
+
+/*member: main:main*/
+main() {
+  methodFromLibrary();
+}
diff --git a/pkg/front_end/test/id_testing/data/directory_testing/pubspec.yaml b/pkg/front_end/test/id_testing/data/directory_testing/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/directory_testing/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/id_testing/data/errors.dart b/pkg/front_end/test/id_testing/data/errors.dart
new file mode 100644
index 0000000..e58d6c4
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/errors.dart
@@ -0,0 +1,11 @@
+// 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.
+
+/*cfe.library: file=main.dart*/
+
+/*cfe.member: main:main*/
+main() {
+  // ignore: undefined_function
+  /*error: Method not found: 'foo'.*/ foo();
+}
diff --git a/pkg/front_end/test/id_testing/data/library_with_name.dart b/pkg/front_end/test/id_testing/data/library_with_name.dart
new file mode 100644
index 0000000..cd9b07e
--- /dev/null
+++ b/pkg/front_end/test/id_testing/data/library_with_name.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.
+
+/*library: file=main.dart,name=lib*/
+library lib;
+
+/*member: main:main*/
+main() {}
diff --git a/pkg/front_end/test/id_testing/id_testing_test.dart b/pkg/front_end/test/id_testing/id_testing_test.dart
new file mode 100644
index 0000000..07d99ba
--- /dev/null
+++ b/pkg/front_end/test/id_testing/id_testing_test.dart
@@ -0,0 +1,124 @@
+// 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 Directory, Platform;
+import 'package:front_end/src/fasta/messages.dart' show FormattedMessage;
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, StringDataInterpreter, runTests;
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart'
+    show
+        CfeDataExtractor,
+        InternalCompilerResult,
+        DataComputer,
+        defaultCfeConfig,
+        createUriForFileName,
+        onFailure,
+        runTestFor;
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:kernel/ast.dart'
+    show
+        Class,
+        Member,
+        FunctionDeclaration,
+        FunctionExpression,
+        Library,
+        TreeNode;
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: [cfeMarker],
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(const IdTestingDataComputer(), [defaultCfeConfig]));
+}
+
+class IdTestingDataComputer extends DataComputer<String> {
+  const IdTestingDataComputer();
+
+  @override
+  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    member.accept(new IdTestingDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  void computeClassData(InternalCompilerResult compilerResult, Class cls,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new IdTestingDataExtractor(compilerResult, actualMap).computeForClass(cls);
+  }
+
+  void computeLibraryData(InternalCompilerResult compilerResult,
+      Library library, Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new IdTestingDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library, useFileUri: true);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  String computeErrorData(
+      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+    return errorsToText(errors);
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class IdTestingDataExtractor extends CfeDataExtractor<String> {
+  IdTestingDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<String>> actualMap)
+      : super(compilerResult, actualMap);
+
+  @override
+  String computeLibraryValue(Id id, Library library) {
+    StringBuffer sb = new StringBuffer();
+    sb.write('file=${library.importUri.pathSegments.last}');
+    if (library.name != null) {
+      sb.write(',name=${library.name}');
+    }
+    return sb.toString();
+  }
+
+  String computeClassName(Class cls) {
+    return cls.name;
+  }
+
+  String computeMemberName(Member member) {
+    if (member.enclosingClass != null) {
+      return '${computeClassName(member.enclosingClass)}.'
+          '${getMemberName(member)}';
+    }
+    return getMemberName(member);
+  }
+
+  @override
+  String computeClassValue(Id id, Class cls) {
+    return computeClassName(cls);
+  }
+
+  @override
+  String computeNodeValue(Id id, TreeNode node) {
+    if (node is FunctionDeclaration) {
+      return '${computeMemberName(getEnclosingMember(node))}.'
+          '${node.variable.name}';
+    } else if (node is FunctionExpression) {
+      return '${computeMemberName(getEnclosingMember(node))}.'
+          '<anonymous>';
+    }
+    return null;
+  }
+
+  @override
+  String computeMemberValue(Id id, Member member) {
+    return computeMemberName(member);
+  }
+}
diff --git a/pkg/front_end/test/incremental_bulk_compiler_full.dart b/pkg/front_end/test/incremental_bulk_compiler_full.dart
index 93c39b2..cc73543 100644
--- a/pkg/front_end/test/incremental_bulk_compiler_full.dart
+++ b/pkg/front_end/test/incremental_bulk_compiler_full.dart
@@ -126,7 +126,7 @@
     if (bulkFailed || bulk2Failed) {
       if (bulkFailed != bulk2Failed) {
         throw "Bulk-compiler failed: $bulkFailed; "
-            "second bulk-comile failed: $bulk2Failed";
+            "second bulk-compile failed: $bulk2Failed";
       }
     } else {
       checkIsEqual(bulkSerialized, bulkSerialized2);
diff --git a/pkg/front_end/test/incremental_load_from_dill_test.dart b/pkg/front_end/test/incremental_load_from_dill_test.dart
index 3c68a61..dd57da3 100644
--- a/pkg/front_end/test/incremental_load_from_dill_test.dart
+++ b/pkg/front_end/test/incremental_load_from_dill_test.dart
@@ -405,6 +405,7 @@
       }
     }
     bool outlineOnly = world["outlineOnly"] == true;
+    bool skipOutlineBodyCheck = world["skipOutlineBodyCheck"] == true;
     if (brandNewWorld) {
       if (world["fromComponent"] == true) {
         compiler = new TestIncrementalCompiler.fromComponent(
@@ -427,6 +428,7 @@
     if (modulesToUse != null) {
       compiler.setModulesToLoadOnNextComputeDelta(modulesToUse);
       compiler.invalidateAllSources();
+      compiler.trackNeededDillLibraries = true;
     }
 
     Stopwatch stopwatch = new Stopwatch()..start();
@@ -434,7 +436,7 @@
         entryPoints: entries,
         fullComponent: brandNewWorld ? false : (noFullComponent ? false : true),
         simulateTransformer: world["simulateTransformer"]);
-    if (outlineOnly) {
+    if (outlineOnly && !skipOutlineBodyCheck) {
       for (Library lib in component.libraries) {
         for (Class c in lib.classes) {
           for (Procedure p in c.procedures) {
@@ -457,6 +459,7 @@
     print("Compile took ${stopwatch.elapsedMilliseconds} ms");
 
     checkExpectedContent(world, component);
+    checkNeededDillLibraries(world, compiler.neededDillLibraries, base);
 
     if (!noFullComponent) {
       Set<Library> allLibraries = new Set<Library>();
@@ -657,6 +660,36 @@
   }
 }
 
+void checkNeededDillLibraries(
+    YamlMap world, Set<Library> neededDillLibraries, Uri base) {
+  if (world["neededDillLibraries"] != null) {
+    List<Uri> actualContent = new List<Uri>();
+    for (Library lib in neededDillLibraries) {
+      if (lib.importUri.scheme == "dart") continue;
+      actualContent.add(lib.importUri);
+    }
+
+    List<Uri> expectedContent = new List<Uri>();
+    for (String entry in world["neededDillLibraries"]) {
+      expectedContent.add(base.resolve(entry));
+    }
+
+    doThrow() {
+      throw "Expected and actual content not the same.\n"
+          "Expected $expectedContent.\n"
+          "Got $actualContent";
+    }
+
+    if (actualContent.length != expectedContent.length) doThrow();
+    Set<Uri> notInExpected =
+        actualContent.toSet().difference(expectedContent.toSet());
+    Set<Uri> notInActual =
+        expectedContent.toSet().difference(actualContent.toSet());
+    if (notInExpected.isNotEmpty) doThrow();
+    if (notInActual.isNotEmpty) doThrow();
+  }
+}
+
 String componentToStringSdkFiltered(Component node) {
   Component c = new Component();
   List<Uri> dartUris = new List<Uri>();
@@ -750,8 +783,9 @@
         Expect.fail(
             "Unexpected error: ${message.plainTextFormatted.join('\n')}");
       }
-    };
-  options.sdkSummary = sdkRoot.resolve("vm_platform_strong.dill");
+    }
+    ..sdkSummary = sdkRoot.resolve("vm_platform_strong.dill")
+    ..environmentDefines = const {};
   return options;
 }
 
diff --git a/pkg/front_end/test/issue_34856_test.dart b/pkg/front_end/test/issue_34856_test.dart
index c3f6693..15f424c 100644
--- a/pkg/front_end/test/issue_34856_test.dart
+++ b/pkg/front_end/test/issue_34856_test.dart
@@ -10,7 +10,7 @@
     show CompilerOptions;
 
 import 'package:front_end/src/api_prototype/kernel_generator.dart'
-    show kernelForComponent;
+    show kernelForModule;
 
 import 'package:front_end/src/api_prototype/memory_file_system.dart'
     show MemoryFileSystem;
@@ -71,7 +71,8 @@
     ..sdkSummary = platformDill;
 
   Component component =
-      await kernelForComponent(<Uri>[base.resolve("lib.dart")], options);
+      (await kernelForModule(<Uri>[base.resolve("lib.dart")], options))
+          .component;
 
   fs = new MemoryFileSystem(base);
   fs.entityForUri(platformDill).writeAsBytesSync(platformDillBytes);
@@ -89,7 +90,7 @@
 
   List<Uri> inputs = <Uri>[base.resolve("repro.dart")];
 
-  component = await kernelForComponent(inputs, options);
+  component = (await kernelForModule(inputs, options)).component;
 
   List<Object> errors = await CompilerContext.runWithOptions(
       new ProcessedOptions(options: options, inputs: inputs),
diff --git a/pkg/front_end/test/kernel_generator_test.dart b/pkg/front_end/test/kernel_generator_test.dart
index b386663..0c5a766 100644
--- a/pkg/front_end/test/kernel_generator_test.dart
+++ b/pkg/front_end/test/kernel_generator_test.dart
@@ -43,8 +43,9 @@
         ..compileSdk = true // To prevent FE from loading an sdk-summary.
         ..onDiagnostic = errors.add;
 
-      var component =
-          await compileScript('main() => print("hi");', options: options);
+      Component component =
+          (await compileScript('main() => print("hi");', options: options))
+              ?.component;
       expect(component, isNotNull);
       expect(errors, isNotEmpty);
     });
@@ -56,8 +57,9 @@
             Uri.parse('org-dartlang-test:///not_existing_summary_file')
         ..onDiagnostic = errors.add;
 
-      var component =
-          await compileScript('main() => print("hi");', options: options);
+      Component component =
+          (await compileScript('main() => print("hi");', options: options))
+              ?.component;
       expect(component, isNotNull);
       expect(errors, isNotEmpty);
     });
@@ -69,8 +71,9 @@
         // contains broken URIs to ensure we do not attempt to lookup for
         // sources of the sdk directly.
         ..librariesSpecificationUri = invalidCoreLibsSpecUri;
-      var component =
-          await compileScript('main() => print("hi");', options: options);
+      Component component =
+          (await compileScript('main() => print("hi");', options: options))
+              ?.component;
       var core = component.libraries.firstWhere(isDartCoreLibrary);
       var printMember = core.members.firstWhere((m) => m.name.name == 'print');
 
@@ -87,8 +90,10 @@
     });
 
     test('generated program contains source-info', () async {
-      var component = await compileScript('a() => print("hi"); main() {}',
-          fileName: 'a.dart');
+      Component component = (await compileScript(
+              'a() => print("hi"); main() {}',
+              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));
@@ -98,8 +103,10 @@
     });
 
     test('code from summary dependencies are marked external', () async {
-      var component = await compileScript('a() => print("hi"); main() {}',
-          fileName: 'a.dart');
+      Component component = (await compileScript(
+              'a() => print("hi"); main() {}',
+              fileName: 'a.dart'))
+          ?.component;
       for (var lib in component.libraries) {
         if (lib.importUri.scheme == 'dart') {
           expect(lib.isExternal, isTrue);
@@ -108,13 +115,14 @@
 
       // Pretend that the compiled code is a summary
       var bytes = serializeComponent(component);
-      component = await compileScript(
-          {
-            'b.dart': 'import "a.dart" as m; b() => m.a(); main() {}',
-            'summary.dill': bytes
-          },
-          fileName: 'b.dart',
-          inputSummaries: ['summary.dill']);
+      component = (await compileScript(
+              {
+                'b.dart': 'import "a.dart" as m; b() => m.a(); main() {}',
+                'summary.dill': bytes
+              },
+              fileName: 'b.dart',
+              inputSummaries: ['summary.dill']))
+          ?.component;
 
       var aLib = component.libraries
           .firstWhere((lib) => lib.importUri.path == '/a/b/c/a.dart');
@@ -122,8 +130,10 @@
     });
 
     test('code from linked dependencies are not marked external', () async {
-      var component = await compileScript('a() => print("hi"); main() {}',
-          fileName: 'a.dart');
+      Component component = (await compileScript(
+              'a() => print("hi"); main() {}',
+              fileName: 'a.dart'))
+          ?.component;
       for (var lib in component.libraries) {
         if (lib.importUri.scheme == 'dart') {
           expect(lib.isExternal, isTrue);
@@ -131,13 +141,14 @@
       }
 
       var bytes = serializeComponent(component);
-      component = await compileScript(
-          {
-            'b.dart': 'import "a.dart" as m; b() => m.a(); main() {}',
-            'link.dill': bytes
-          },
-          fileName: 'b.dart',
-          linkedDependencies: ['link.dill']);
+      component = (await compileScript(
+              {
+                'b.dart': 'import "a.dart" as m; b() => m.a(); main() {}',
+                'link.dill': bytes
+              },
+              fileName: 'b.dart',
+              linkedDependencies: ['link.dill']))
+          ?.component;
 
       var aLib = component.libraries
           .firstWhere((lib) => lib.importUri.path == '/a/b/c/a.dart');
diff --git a/pkg/front_end/test/language_versioning/data/library_with_bad_version.dart b/pkg/front_end/test/language_versioning/data/library_with_bad_version.dart
new file mode 100644
index 0000000..46a64ed
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_bad_version.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/*error: LanguageVersionTooHigh*/
+// @dart = 3.5
+
+// If no valid language version is specified, we default to the most reason one.
+// In the tests this is hard-coded to 2.8.
+
+/*library: languageVersion=2.8*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/library_with_bad_version_before_good_version.dart b/pkg/front_end/test/language_versioning/data/library_with_bad_version_before_good_version.dart
new file mode 100644
index 0000000..310f2ef
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_bad_version_before_good_version.dart
@@ -0,0 +1,15 @@
+// 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.
+
+/*error: LanguageVersionTooHigh*/
+// @dart = 3.5
+
+// @dart = 2.5
+
+// If the first language version specified is not a valid language version,
+// we default to the most reason one.  In the tests this is hard-coded to 2.8.
+
+/*library: languageVersion=2.8*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/library_with_no_version.dart b/pkg/front_end/test/language_versioning/data/library_with_no_version.dart
new file mode 100644
index 0000000..3b64d66
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_no_version.dart
@@ -0,0 +1,10 @@
+// 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.
+
+// If no language version is specified, and none if given in a .packages file,
+// we default to the most reason one. In the tests this is hard-coded to 2.8.
+
+/*library: languageVersion=2.8*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/library_with_two_versions.dart b/pkg/front_end/test/language_versioning/data/library_with_two_versions.dart
new file mode 100644
index 0000000..5d6342b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_two_versions.dart
@@ -0,0 +1,12 @@
+// 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.
+
+// With several valid versions the first one wins.
+
+// @dart = 2.5
+// @dart = 2.4
+
+/*library: languageVersion=2.5*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/library_with_two_versions_2.dart b/pkg/front_end/test/language_versioning/data/library_with_two_versions_2.dart
new file mode 100644
index 0000000..f562d28
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_two_versions_2.dart
@@ -0,0 +1,12 @@
+// 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.
+
+// With several versions where the first one is valid, the first one wins.
+
+// @dart = 2.5
+// @dart = 42.5
+
+/*library: languageVersion=2.5*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/library_with_version.dart b/pkg/front_end/test/language_versioning/data/library_with_version.dart
new file mode 100644
index 0000000..57c3311
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/library_with_version.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.
+
+// @dart = 2.4
+
+/*library: languageVersion=2.4*/
+
+main() {}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_default_version/.packages
new file mode 100644
index 0000000..18efb0b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=2.5.3-dev.2
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo.dart
new file mode 100644
index 0000000..1c14ade
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo.dart
@@ -0,0 +1,14 @@
+// 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: languageVersion=2.5*/
+
+import 'foo2.dart';
+import 'foo3.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+  foo3();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo2.dart
new file mode 100644
index 0000000..8225d13
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo2.dart
@@ -0,0 +1,11 @@
+// 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.4
+
+/*library: languageVersion=2.4*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo3.dart b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo3.dart
new file mode 100644
index 0000000..8ff3e3c4
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/lib/foo3.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// .packages specifies 2.5, this library tries to go above that, which is an
+// error. The library stays on the .packages specified one (2.5) and an error is
+// issued.
+
+/*error: LanguageVersionTooHigh*/
+// @dart = 2.6
+
+/*library: languageVersion=2.5*/
+
+foo3() {
+  print("Hello from foo3!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_default_version/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/main.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/.packages b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/.packages
new file mode 100644
index 0000000..6eae16d
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=arglebargle
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo.dart
new file mode 100644
index 0000000..c669c23
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo.dart
@@ -0,0 +1,13 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// 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: languageVersion=2.8*/
+
+import 'foo2.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo2.dart
new file mode 100644
index 0000000..0e38837
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/lib/foo2.dart
@@ -0,0 +1,12 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// 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.4
+
+/*library: languageVersion=2.4*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/main.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/main.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/.packages b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/.packages
new file mode 100644
index 0000000..b1e458a
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=arglebargle&dart=2.5
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo.dart
new file mode 100644
index 0000000..c669c23
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo.dart
@@ -0,0 +1,13 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// 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: languageVersion=2.8*/
+
+import 'foo2.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo2.dart
new file mode 100644
index 0000000..0e38837
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/lib/foo2.dart
@@ -0,0 +1,12 @@
+/*error: LanguageVersionInvalidInDotPackages*/
+// 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.4
+
+/*library: languageVersion=2.4*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/main.dart b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/main.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_default_version_is_wrong_2/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_no_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_no_default_version/.packages
new file mode 100644
index 0000000..6cb1961
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_no_default_version/.packages
@@ -0,0 +1 @@
+foo:lib/
diff --git a/pkg/front_end/test/language_versioning/data/package_no_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_no_default_version/lib/foo.dart
new file mode 100644
index 0000000..c5ecb8b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_no_default_version/lib/foo.dart
@@ -0,0 +1,12 @@
+// 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.
+
+// If no language version is specified, and none if given in a .packages file,
+// we default to the most reason one. In the tests this is hard-coded to 2.8.
+
+/*library: languageVersion=2.8*/
+
+foo() {
+  print("Hello from foo!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_no_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_no_default_version/main.dart
new file mode 100644
index 0000000..b20c707
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_no_default_version/main.dart
@@ -0,0 +1,13 @@
+// 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.5
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.5*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_no_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_no_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_no_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/.packages b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/.packages
new file mode 100644
index 0000000..95d69af
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=2.9
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo.dart b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo.dart
new file mode 100644
index 0000000..55d8f60
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo.dart
@@ -0,0 +1,15 @@
+/*error: LanguageVersionTooHigh*/
+// 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: languageVersion=2.8*/
+
+import 'foo2.dart';
+import 'foo3.dart';
+
+foo() {
+  print("Hello from foo!");
+  foo2();
+  foo3();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo2.dart b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo2.dart
new file mode 100644
index 0000000..e657fb0
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo2.dart
@@ -0,0 +1,13 @@
+/*error: LanguageVersionTooHigh*/
+// 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.
+
+/*error: LanguageVersionTooHigh*/
+// @dart = 2.9
+
+/*library: languageVersion=2.8*/
+
+foo2() {
+  print("Hello from foo2!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo3.dart b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo3.dart
new file mode 100644
index 0000000..e3de452
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/lib/foo3.dart
@@ -0,0 +1,12 @@
+/*error: LanguageVersionTooHigh*/
+// 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.7
+
+/*library: languageVersion=2.7*/
+
+foo3() {
+  print("Hello from foo3!");
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/main.dart b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/main.dart
new file mode 100644
index 0000000..cabb316
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/main.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/package_to_high_default_version/pubspec.yaml b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/package_to_high_default_version/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/parts_agreeing/main.dart b/pkg/front_end/test/language_versioning/data/parts_agreeing/main.dart
new file mode 100644
index 0000000..42a6957
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_agreeing/main.dart
@@ -0,0 +1,13 @@
+// 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.5
+
+part 'part.dart';
+
+/*library: languageVersion=2.5*/
+
+main() {
+  // foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/parts_agreeing/part.dart b/pkg/front_end/test/language_versioning/data/parts_agreeing/part.dart
new file mode 100644
index 0000000..6a70338
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_agreeing/part.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.
+
+// @dart = 2.5
+
+part of 'main.dart';
+
+foo() {}
diff --git a/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/main.dart b/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/main.dart
new file mode 100644
index 0000000..d1b4908
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/main.dart
@@ -0,0 +1,14 @@
+// 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.5
+// @dart = 2.4
+
+part 'part.dart';
+
+/*library: languageVersion=2.5*/
+
+main() {
+  // foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/part.dart b/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/part.dart
new file mode 100644
index 0000000..6a70338
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_agreeing_two_versions/part.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.
+
+// @dart = 2.5
+
+part of 'main.dart';
+
+foo() {}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing/main.dart b/pkg/front_end/test/language_versioning/data/parts_disagreeing/main.dart
new file mode 100644
index 0000000..391adb5
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing/main.dart
@@ -0,0 +1,13 @@
+// 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.5
+
+part /*error: LanguageVersionMismatchInPart*/ 'part.dart';
+
+/*library: languageVersion=2.5*/
+
+main() {
+  /*error: MethodNotFound*/ foo();
+}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing/part.dart b/pkg/front_end/test/language_versioning/data/parts_disagreeing/part.dart
new file mode 100644
index 0000000..35f8505
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing/part.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.
+
+// @dart = 2.4
+
+part of 'main.dart';
+
+foo() {}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/.packages b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/.packages
new file mode 100644
index 0000000..6442723
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/.packages
@@ -0,0 +1 @@
+foo:lib/#dart=2.5
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/foo.dart b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/foo.dart
new file mode 100644
index 0000000..043246e
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/foo.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// The library and its part is both technically at language version 2.5,
+// but one is explicitly set, the other is not. That's an error.
+
+// @dart = 2.5
+
+part /*error: LanguageVersionMismatchInPart*/ 'part.dart';
+
+/*library: languageVersion=2.5*/
+
+foo() {
+  /*error: MethodNotFound*/ bar();
+}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/part.dart b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/part.dart
new file mode 100644
index 0000000..84bf14b
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/lib/part.dart
@@ -0,0 +1,7 @@
+// 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 'foo.dart';
+
+bar() {}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/main.dart b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/main.dart
new file mode 100644
index 0000000..16f9665
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/main.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Set version of this file (not technically in package) explicitly to test as
+// much as possibly separately.
+
+// @dart = 2.4
+
+import 'package:foo/foo.dart';
+
+/*library: languageVersion=2.4*/
+
+main() {
+  main();
+}
diff --git a/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/pubspec.yaml b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/pubspec.yaml
new file mode 100644
index 0000000..ff98642
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/data/parts_disagreeing_has_package/pubspec.yaml
@@ -0,0 +1,5 @@
+# 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.
+
+# Analyzer workaround, see https://github.com/dart-lang/sdk/issues/37513
\ No newline at end of file
diff --git a/pkg/front_end/test/language_versioning/language_versioning_test.dart b/pkg/front_end/test/language_versioning/language_versioning_test.dart
new file mode 100644
index 0000000..510bba0
--- /dev/null
+++ b/pkg/front_end/test/language_versioning/language_versioning_test.dart
@@ -0,0 +1,71 @@
+// 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 Directory, Platform;
+import 'package:front_end/src/fasta/messages.dart' show FormattedMessage;
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, StringDataInterpreter, runTests;
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:front_end/src/testing/id_testing_helper.dart'
+    show
+        CfeDataExtractor,
+        InternalCompilerResult,
+        DataComputer,
+        defaultCfeConfig,
+        createUriForFileName,
+        onFailure,
+        runTestFor;
+import 'package:kernel/ast.dart' show Library;
+
+main(List<String> args) async {
+  // Fix default/max major and minor version so we can test it.
+  Library.defaultLangaugeVersionMajor = 2;
+  Library.defaultLangaugeVersionMinor = 8;
+
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: [cfeMarker],
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(
+          const LanguageVersioningDataComputer(), [defaultCfeConfig]));
+}
+
+class LanguageVersioningDataComputer extends DataComputer<String> {
+  const LanguageVersioningDataComputer();
+
+  void computeLibraryData(InternalCompilerResult compilerResult,
+      Library library, Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    new LanguageVersioningDataExtractor(compilerResult, actualMap)
+        .computeForLibrary(library, useFileUri: true);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  String computeErrorData(
+      InternalCompilerResult compiler, Id id, List<FormattedMessage> errors) {
+    return errors.map((m) => m.code.name).join(',');
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class LanguageVersioningDataExtractor extends CfeDataExtractor<String> {
+  LanguageVersioningDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<String>> actualMap)
+      : super(compilerResult, actualMap);
+
+  @override
+  String computeLibraryValue(Id id, Library library) {
+    StringBuffer sb = new StringBuffer();
+    sb.write('languageVersion='
+        '${library.languageVersionMajor}.${library.languageVersionMinor}');
+    return sb.toString();
+  }
+}
diff --git a/pkg/front_end/test/memory_file_system_test.dart b/pkg/front_end/test/memory_file_system_test.dart
index c62dbc3..4364582 100644
--- a/pkg/front_end/test/memory_file_system_test.dart
+++ b/pkg/front_end/test/memory_file_system_test.dart
@@ -128,14 +128,14 @@
   }
 
   test_writeAsBytesSync_modifyAfterRead() async {
-    // For effeciency we do not make defensive copies.
+    // For efficiency we do not make defensive copies.
     file.writeAsBytesSync([1]);
     (await file.readAsBytes())[0] = 2;
     expect(await file.readAsBytes(), [2]);
   }
 
   test_writeAsBytesSync_modifyAfterWrite_Uint8List() async {
-    // For effeciency we do not make defensive copies.
+    // For efficiency we do not make defensive copies.
     var bytes = new Uint8List.fromList([1]);
     file.writeAsBytesSync(bytes);
     bytes[0] = 2;
@@ -143,7 +143,7 @@
   }
 
   test_writeAsBytesSync_modifyAfterWrite() async {
-    // For effeciency we generally do not make defensive copies, but on the
+    // For efficiency we generally do not make defensive copies, but on the
     // other hrand we keep everything as `Uint8List`s internally, so in this
     // case a copy is actually made.
     var bytes = [1];
diff --git a/pkg/front_end/test/relativize_test.dart b/pkg/front_end/test/relativize_test.dart
new file mode 100644
index 0000000..d7b92a9
--- /dev/null
+++ b/pkg/front_end/test/relativize_test.dart
@@ -0,0 +1,85 @@
+// 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.
+
+import 'package:test/test.dart';
+import 'package:front_end/src/fasta/util/relativize.dart';
+
+void main() {
+  test('test relativeUri', () {
+    void c(String expected, String base, String path, bool isWindows) {
+      if (isWindows == null) {
+        c(expected, base, path, true);
+        c(expected, base, path, false);
+        return;
+      }
+
+      test(Uri base, Uri uri) {
+        String r = relativizeUri(base, uri, isWindows);
+        Uri resolved = base.resolve(r);
+        expect(resolved.scheme.toLowerCase(), uri.scheme.toLowerCase());
+        if (isWindows) {
+          expect(resolved.path.toLowerCase(), uri.path.toLowerCase());
+        } else {
+          expect(resolved.path, uri.path);
+        }
+        expect(r, expected);
+      }
+
+      test(Uri.parse('file:$base'), Uri.parse('file:$path'));
+
+      test(Uri.parse('FILE:$base'), Uri.parse('FILE:$path'));
+
+      test(Uri.parse('file:$base'), Uri.parse('FILE:$path'));
+
+      test(Uri.parse('FILE:$base'), Uri.parse('file:$path'));
+    }
+
+    c('bar', '/', '/bar', null);
+    c('bar', '/foo', '/bar', null);
+    c('/bar', '/foo/', '/bar', null);
+
+    c('bar', '///c:/', '///c:/bar', true);
+    c('bar', '///c:/foo', '///c:/bar', true);
+    c('/c:/bar', '///c:/foo/', '///c:/bar', true);
+
+    c('BAR', '///c:/', '///c:/BAR', true);
+    c('BAR', '///c:/foo', '///c:/BAR', true);
+    c('/c:/BAR', '///c:/foo/', '///c:/BAR', true);
+
+    c(
+        '../sdk/lib/_internal/compiler/implementation/dart2js.dart',
+        '///C:/Users/person/dart_checkout_for_stuff/dart/ReleaseIA32/dart.exe',
+        '///c:/Users/person/dart_checkout_for_stuff/dart/sdk/lib/_internal/compiler/'
+            'implementation/dart2js.dart',
+        true);
+
+    c('/Users/person/file.dart', '/users/person/', '/Users/person/file.dart',
+        false);
+
+    c('file.dart', '/Users/person/', '/Users/person/file.dart', null);
+
+    c('../person/file.dart', '/Users/other/', '/Users/person/file.dart', false);
+
+    c('/Users/person/file.dart', '/Users/other/', '/Users/person/file.dart',
+        true);
+
+    c('out.js.map', '/Users/person/out.js', '/Users/person/out.js.map', null);
+
+    c('../person/out.js.map', '/Users/other/out.js', '/Users/person/out.js.map',
+        false);
+
+    c('/Users/person/out.js.map', '/Users/other/out.js',
+        '/Users/person/out.js.map', true);
+
+    c('out.js', '/Users/person/out.js.map', '/Users/person/out.js', null);
+
+    c('../person/out.js', '/Users/other/out.js.map', '/Users/person/out.js',
+        false);
+
+    c('/Users/person/out.js', '/Users/other/out.js.map', '/Users/person/out.js',
+        true);
+
+    c('out.js', '/out.js.map', '/out.js', null);
+  });
+}
diff --git a/pkg/front_end/test/scanner_fasta_test.dart b/pkg/front_end/test/scanner_fasta_test.dart
index 210e851..02cd12f 100644
--- a/pkg/front_end/test/scanner_fasta_test.dart
+++ b/pkg/front_end/test/scanner_fasta_test.dart
@@ -740,7 +740,7 @@
 class ScannerTest_Fasta_Direct_UTF8 extends ScannerTest_Fasta_Direct {
   ScannerResult scanSource(source, {includeComments: true}) {
     List<int> encoded = utf8.encode(source).toList(growable: true);
-    encoded.add(0); // Ensure 0 terminted bytes for UTF8 scanner
+    encoded.add(0); // Ensure 0 terminated bytes for UTF8 scanner
     return usedForFuzzTesting.scan(encoded,
         includeComments: includeComments,
         languageVersionChanged: languageVersionChanged);
diff --git a/pkg/front_end/test/scanner_test.dart b/pkg/front_end/test/scanner_test.dart
index 932d67a..62de9dc 100644
--- a/pkg/front_end/test/scanner_test.dart
+++ b/pkg/front_end/test/scanner_test.dart
@@ -303,7 +303,12 @@
   }
 
   void test_hexadecimal_missingDigit() {
-    _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 1, "0x");
+    var token = _assertError(ScannerErrorCode.MISSING_HEX_DIGIT, 5, "a = 0x");
+    expect(token.lexeme, 'a');
+    token = token.next;
+    expect(token.lexeme, '=');
+    token = token.next;
+    expect(token.lexeme, '0x0');
   }
 
   void test_identifier() {
@@ -311,12 +316,50 @@
   }
 
   void test_illegalChar_cyrillicLetter_middle() {
-    _assertError(
-        ScannerErrorCode.ILLEGAL_CHARACTER, 5, "Shche\u0433lov", [0x433]);
+    final identifier = "Shche\u0433lov";
+    final token = _assertError(
+        ScannerErrorCode.ILLEGAL_CHARACTER, 5, identifier, [0x433]);
+    expect(token.type, TokenType.IDENTIFIER);
+    expect(token.lexeme, identifier);
+  }
+
+  void test_illegalChar_cyrillicLetter_multiple() {
+    ErrorListener listener = new ErrorListener();
+    var tokens = scanWithListener("a = Shche\u0433lov\u0429x;", listener);
+    listener.assertErrors([
+      new TestError(9, ScannerErrorCode.ILLEGAL_CHARACTER, [0x433]),
+      new TestError(13, ScannerErrorCode.ILLEGAL_CHARACTER, [0x429]),
+    ]);
+    var token = tokens;
+    expect(token.lexeme, 'a');
+    token = token.next;
+    expect(token.lexeme, '=');
+    token = token.next;
+    expect(token.type, TokenType.IDENTIFIER);
+    expect(token.lexeme, "Shche\u0433lov\u0429x");
+    token = token.next;
+    expect(token.lexeme, ';');
   }
 
   void test_illegalChar_cyrillicLetter_start() {
-    _assertError(ScannerErrorCode.ILLEGAL_CHARACTER, 0, "\u0429", [0x429]);
+    final identifier = "\u0429";
+    final token = _assertError(
+        ScannerErrorCode.ILLEGAL_CHARACTER, 0, identifier, [0x429]);
+    expect(token.type, TokenType.IDENTIFIER);
+    expect(token.lexeme, identifier);
+  }
+
+  void test_illegalChar_cyrillicLetter_start_expression() {
+    var token = _assertError(
+        ScannerErrorCode.ILLEGAL_CHARACTER, 4, 'a = \u0429;', [0x429]);
+    expect(token.lexeme, 'a');
+    token = token.next;
+    expect(token.lexeme, '=');
+    token = token.next;
+    expect(token.type, TokenType.IDENTIFIER);
+    expect(token.lexeme, "\u0429");
+    token = token.next;
+    expect(token.lexeme, ';');
   }
 
   void test_illegalChar_nbsp() {
@@ -1299,13 +1342,14 @@
    * [expectedOffset] the string offset that should be associated with the error
    * [source] the source to be scanned to produce the error
    */
-  void _assertError(
+  Token _assertError(
       ScannerErrorCode expectedError, int expectedOffset, String source,
       [List<Object> arguments]) {
     ErrorListener listener = new ErrorListener();
-    scanWithListener(source, listener);
+    var tokens = scanWithListener(source, listener);
     listener.assertErrors(
         [new TestError(expectedOffset, expectedError, arguments)]);
+    return tokens;
   }
 
   /**
diff --git a/pkg/front_end/test/spell_checking_list.txt b/pkg/front_end/test/spell_checking_list.txt
new file mode 100644
index 0000000..9d17af5
--- /dev/null
+++ b/pkg/front_end/test/spell_checking_list.txt
@@ -0,0 +1,3869 @@
+# 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.
+
+# Blank lines and comments are ignored.
+# Comments can also be inline like 'correct # this is ok'.
+# Note that at least one space before the hash is required.
+
+a
+a0x
+a1x
+a2x
+aa
+aaa
+abbreviations
+abc
+abcompile
+ability
+able
+abort
+aborted
+aborts
+about
+above
+absence
+absent
+absolute
+abstract
+abstracted
+abstraction
+abstractly
+abstracts
+accept
+accepted
+accepts
+access
+accessed
+accessible
+accessing
+accessor
+accessors
+accidentally
+accordance
+according
+accordingly
+account
+accumulate
+accurate
+achieve
+across
+acting
+action
+actions
+active
+actual
+actually
+acyclic
+ad
+adapt
+add
+added
+adding
+addition
+additional
+additionally
+additive
+address
+addressed
+adds
+adjacent
+adjust
+adjusted
+adopt
+advance
+advanced
+advances
+advancing
+advice
+affect
+affected
+affects
+after
+again
+against
+aggregate
+aggressively
+ahe
+ahead
+ai
+aiki
+aka
+albeit
+algebra
+algorithm
+algorithms
+alias
+alive
+all
+allocated
+allocating
+allocation
+allocations
+allow
+allowed
+allowing
+allows
+almost
+alone
+along
+alpha
+already
+also
+alternating
+alternative
+alternatively
+although
+always
+ambiguous
+among
+amount
+ampersand
+an
+analogously
+analysis
+analyze
+analyzed
+analyzer
+analyzing
+ancestor
+ancillary
+and
+angle
+annotatable
+annotated
+annotation
+annotations
+annotator
+anon
+anonymous
+another
+ansi
+answer
+anticipated
+antisymmetric
+any
+anymore
+anything
+anyway
+anywhere
+ap
+api
+app
+apparent
+appear
+appearance
+appeared
+appearing
+appears
+append
+appended
+appends
+application
+application's
+applications
+applied
+applies
+apply
+applying
+appreciate
+approach
+appropriate
+appropriately
+approval
+approximately
+approximation
+arbitrary
+are
+aren't
+arg
+args
+argument
+argument1
+arguments
+arithmetic
+arity
+arose
+around
+array
+arrow
+arrows
+as
+ascending
+ascii
+ask
+asked
+askesc
+asks
+aspects
+assert
+asserter
+assertion
+assertions
+asserts
+assign
+assignability
+assignable
+assigned
+assignment
+assignments
+associate
+associated
+associating
+associative
+assume
+assumed
+assumes
+assuming
+assumption
+ast
+asy
+async
+asynchronous
+at
+atm
+attach
+attached
+attempt
+attempted
+attempting
+attempts
+attention
+auth
+authors
+autobianchi
+automagically
+automatically
+available
+average
+avoid
+avoided
+avoids
+await
+awaiter
+aware
+awareness
+away
+b
+b0x
+b1x
+b23d3b125e9d246e07a2b43b61740759a0dace
+b2x
+ba
+back
+backed
+backend
+backends
+backping
+backslash
+backslashes
+backspace
+backward
+backwards
+bad
+balanced
+bang
+bar
+base
+based
+bash
+basic
+bat
+batch
+baz
+bazel
+bb
+bbb
+bc
+be
+beat
+because
+become
+becomes
+been
+before
+began
+begin
+beginning
+begins
+behaved
+behaves
+behavior
+behaviors
+behaviour
+behind
+being
+belong
+belongs
+below
+bench
+benchmark
+benchmarks
+beneficial
+benefit
+besides
+best
+beta
+bets
+better
+between
+bf
+bi
+big
+bigger
+bigint
+bin
+binaries
+binary
+bind
+binding
+bit
+bits
+bitwise
+bj
+black
+blacklisted
+blah
+blindly
+blob
+block
+blocked
+blocks
+blorp
+blue
+bn
+bodied
+bodies
+body
+bof
+bogus
+boils
+bom
+bool
+boolean
+booleans
+bootstrap
+bot
+both
+bots
+bottom
+bound
+boundary
+bounded
+boundless
+bounds
+bowtie
+box
+brace
+braces
+bracket
+bracketed
+brackets
+branch
+branches
+brave
+break
+breaking
+breakpoint
+breaks
+brianwilkerson
+brittle
+broken
+brown
+browser
+bs
+bsd
+buffer
+bug
+bugs
+build
+builddir
+builder
+builder`s
+builders
+building
+builds
+built
+builtin
+bulder
+bulk
+bulk2
+bulkcompile
+bundle
+but
+by
+bypass
+byte
+bytecode
+bytes
+c
+c's
+cache
+cached
+caching
+cafebabe
+calculate
+calculated
+calculates
+calculation
+call
+callable
+callback
+called
+callee
+caller
+caller's
+callers
+calling
+calls
+came
+camel
+can
+can't
+cancel
+cancelled
+candidate
+candidates
+cannot
+canonical
+canonicalization
+canonicalize
+canonicalized
+canonicalizer
+cant
+capabilities
+capability
+capital
+capitalized
+capture
+capturing
+care
+careful
+cares
+caret
+carets
+carriage
+carry
+cascade
+cascades
+cascading
+case
+cases
+casing
+cast
+casted
+casting
+casts
+catch
+catches
+categories
+category
+caught
+cause
+caused
+causes
+causing
+cc
+ccc
+certain
+cfe
+ch
+chain
+chained
+chance
+chances
+change
+changed
+changes
+changing
+char
+character
+characters
+charcode
+chars
+charset
+charts
+chase
+check
+checked
+checker
+checking
+checkout
+checks
+child
+children
+choice
+choose
+chooses
+choosing
+chosen
+chunk
+ci
+circular
+circularities
+circularity
+circumstances
+ck
+cl
+claim
+class
+class's
+classes
+classic
+clause
+clauses
+clean
+cleaned
+cleaning
+cleans
+clear
+cleared
+clearer
+clearing
+clearly
+clears
+cli
+client
+clients
+clone
+cloneable
+cloned
+cloner
+clones
+cloning
+close
+closed
+closer
+closers
+closes
+closing
+closure
+closures
+cls
+clue
+cmp
+cn
+cnn
+code
+codebase
+codec
+coded
+codepath
+codes
+collapses
+collect
+collected
+collecting
+collection
+collections
+collector
+collects
+collisions
+colon
+colons
+color
+colorize
+colors
+column
+com
+combination
+combinator
+combinators
+combine
+combined
+combiner
+combines
+combining
+come
+comes
+comfortable
+coming
+comma
+command
+commas
+comment
+comments
+commit
+common
+commonly
+compact
+companion
+comparable
+compare
+comparing
+comparison
+comparisons
+compatibility
+compatible
+compilation
+compilations
+compile
+compiled
+compiler
+compiler's
+compilercontext.runincontext
+compilers
+compiles
+compilesdk
+compiling
+complain
+complement
+complete
+completed
+completely
+completer
+completers
+completes
+completion
+complex
+compliance
+component
+component's
+components
+composed
+composite
+composition
+compound
+comprising
+computation
+compute
+computed
+computer
+computes
+computing
+concatenated
+concatenation
+conclude
+conclusion
+concrete
+concretely
+concurrent
+cond
+condition
+conditional
+conditionally
+conditions
+config
+configs
+configurable
+configuration
+configurations
+configure
+configuring
+confirm
+conflict
+conflicting
+conflicts
+conform
+conformed
+confused
+connect
+connected
+connection
+consecutive
+consequence
+consequently
+conservatively
+consider
+considered
+considering
+considers
+consistency
+consistent
+consistently
+consisting
+consists
+console
+const
+constant
+constants
+constitutes
+constness
+constrain
+constrained
+constrains
+constraint
+constraints
+construct
+constructed
+constructing
+construction
+constructor
+constructor's
+constructor(s)
+constructors
+constructs
+consts
+constuctor
+consume
+consumed
+consuming
+contain
+contained
+containing
+contains
+content
+contents
+context
+contexts
+contextual
+contiguous
+continuation
+continue
+continued
+continues
+continuing
+contra
+contract
+contrast
+contravariance
+contravariant
+contravariantly
+control
+controller
+convenience
+convenient
+conventions
+conversion
+conversions
+convert
+converted
+convertible
+converting
+converts
+cookie
+copied
+copier
+copies
+copy
+copying
+copyright
+core
+core's
+corner
+correct
+correcting
+correction
+correctly
+correctness
+correspond
+corresponding
+corresponds
+cost
+could
+couldn't
+count
+count.#count
+counter
+counts
+couple
+covariance
+covariant
+covariantly
+cover
+covered
+covers
+cr
+crash
+crashed
+crashes
+crashing
+create
+created
+creates
+creating
+creation
+cumulative
+curly
+current
+currently
+custom
+cut
+cwd
+cyan
+cycle
+cycles
+cyclic
+d
+d11e
+dacoharkes
+daemon
+dag
+dangling
+danrubel
+daringfireball
+dart
+dart_runner
+dart:ffi
+dart2js
+dart2js_server
+dartanalyzer
+dartbug
+dartbug.com
+dartdoc
+dartfile
+dartlang
+dashes
+data
+date
+day
+db
+ddc
+ddk
+dead
+deal
+dealing
+deals
+debug
+debugging
+dec
+decide
+decided
+deciding
+decimal
+decl
+declarable
+declarated
+declaration
+declaration's
+declarations
+declare
+declared
+declares
+declaring
+decode
+decoded
+decoder
+decodes
+decoding
+decrement
+deduced
+deep
+def
+default
+defaults
+defensive
+defer
+deferred
+deferring
+defers
+definable
+define
+defined
+defines
+defining
+definite
+definitely
+definition
+definitions
+degenerate
+degrade
+del
+delayed
+delegate
+delegates
+delegation
+delete
+deliberately
+delimited
+delimiter
+delimiters
+delta
+demangle
+demangled
+denote
+denoted
+denotes
+denoting
+depend
+depended
+dependence
+dependencies
+dependency
+dependent
+depending
+depends
+depfile
+deprecate
+deprecated
+deps
+depth
+derivation
+derive
+derived
+desc
+descendants
+describe
+described
+describes
+describing
+description
+descriptions
+descriptor
+deserialization
+deserialize
+deserialized
+designed
+desugar
+desugared
+desugaring
+desugars
+detail
+detailed
+details
+detect
+detected
+detecting
+detection
+detects
+determination
+determine
+determined
+determines
+determining
+dev
+developer
+developers
+development
+deviation
+devices
+devise
+diagnostic
+diagnostics
+dictionary
+did
+didn't
+diet
+diff
+differ
+difference
+different
+differently
+differs
+diffs
+dig
+digest
+digests
+digit
+digits
+dill
+dillfile
+dir
+direct
+direction
+directive
+directives
+directly
+directories
+directory
+dirname
+disable
+disabled
+disabling
+disagree
+disambiguate
+disambiguated
+discard
+discarded
+discarding
+discards
+disconnect
+discover
+discovered
+discovering
+discovery
+disk
+dispatch
+dispatcher
+dispatches
+display
+displayed
+displaying
+distance
+distinct
+distinction
+distinguish
+divide
+division
+divisor
+dmitryas
+dname
+do
+doc
+docs
+doctype
+document
+documentation
+documented
+documenting
+does
+doesn't
+doesnt
+dog
+doing
+dollar
+dom
+dominates
+don't
+done
+dot
+dots
+dotted
+double
+doubly
+doubt
+down
+downcast
+downcasts
+downside
+downstream
+downward
+downwards
+dpkg
+dq
+drive
+driver
+drop
+dropping
+due
+dummy
+dump
+dumped
+dumping
+dupe
+duplicate
+duplicated
+duplicates
+duplicating
+duplication
+duration
+durations
+during
+dust
+dyn
+dynamic
+e
+e.g
+e's
+e2e
+each
+eagerly
+earlier
+early
+ease
+easier
+easiest
+easy
+ec
+ecma
+ecosystem
+ed
+edge
+edges
+edit
+edition
+editor
+edits
+eek
+ef
+effect
+effective
+efficiency
+efficient
+effort
+either
+elapse
+elapsed
+elem
+element
+elements
+eligible
+eliminated
+elimination
+eliminator
+ell
+else
+elsewhere
+elt
+em
+embed
+embedded
+embeds
+emit
+emitted
+empty
+en
+enable
+enabled
+enables
+enabling
+encapsulates
+enclosed
+encloses
+enclosing
+encode
+encoded
+encoder
+encodes
+encoding
+encountered
+encounters
+end
+ended
+ending
+endings
+ends
+endured
+enforcement
+engine
+engineers
+enhancing
+enough
+ensure
+ensures
+ensuring
+entails
+enter
+entering
+entire
+entirely
+entities
+entity
+entity's
+entries
+entry
+entrypoint
+entrypoints
+enum
+enum's
+enumerated
+enums
+env
+environment
+eof
+epoch
+eq
+equal
+equality
+equals
+equivalent
+equivalents
+err
+erroneous
+error
+errors
+escape
+escaped
+escapes
+escaping
+essence
+etc
+eval
+evaluate
+evaluated
+evaluates
+evaluating
+evaluation
+evaluator
+even
+event
+events
+eventually
+ever
+every
+everything
+everytime
+everywhere
+evicting
+evolution
+exact
+exactly
+examine
+examining
+example
+examples
+exceeded
+except
+exception
+exceptions
+exclamation
+exclude
+excluded
+excludes
+excluding
+exclusive
+exe
+executable
+execute
+executed
+execution
+exercise
+exercised
+exercises
+exist
+existing
+exists
+exit
+exitcode
+exited
+exiting
+exits
+exp
+expand
+expanded
+expanding
+expands
+expansion
+expansive
+expect
+expectation
+expectations
+expected
+expecting
+expects
+expensive
+experiment
+experimental
+experimentally
+experiments
+expired
+explain
+explanation
+explicit
+explicitly
+exponent
+exponential
+export
+exported
+exportee
+exportees
+exporter
+exporters
+exporting
+exports
+exposed
+expr
+expression
+expressions
+ext
+extend
+extended
+extending
+extends
+extensibility
+extensible
+extension
+extensions
+extent
+extern
+external
+externally
+extra
+extract
+extraction
+extractor
+extraneous
+f
+fac
+facilitate
+fact
+fact's
+factories
+factory
+facts
+fail
+failed
+failing
+fails
+failure
+failures
+fake
+fall
+falling
+falls
+false
+fangorn
+far
+fashion
+fast
+fasta
+faster
+fatal
+favor
+favors
+fe
+feature
+features
+feed
+feel
+feff
+few
+fewer
+ff
+ffff
+ffi
+fibonacci
+field
+field's
+fieldname
+fields
+figure
+file
+filename
+filenames
+files
+filesystem
+fill
+filled
+fills
+filter
+filtered
+final
+finalization
+finalize
+finalized
+finalizer
+finalizes
+finalizing
+finally
+find
+finder
+finding
+finds
+finish
+finished
+finishes
+finishing
+finite
+first
+fishythefish
+fisk
+fit
+five
+fix
+fixed
+fixes
+fixing
+flag
+flags
+flat
+flatten
+flattened
+flexibility
+flexible
+floitsch
+floor
+flow
+flow's
+flush
+flutter
+flutter_runner
+flux
+fn
+fo
+fold
+folded
+folder
+follow
+followed
+following
+follows
+foo
+foobar
+for
+forbidden
+force
+forces
+foreign
+forest
+forget
+fork
+form
+formal
+formalize
+formally
+formals
+format
+formats
+formatted
+formatter
+formatting
+formed
+former
+forms
+forward
+forwarded
+forwarder
+forwarders
+forwarding
+forwards
+found
+four
+fox
+fraction
+fragment
+frame
+frames
+framework
+free
+frequently
+fresh
+friendly
+from
+front
+frontend
+fs
+fulfill
+full
+fullname
+fully
+fun
+func
+function
+functionality
+functions
+further
+furthermore
+future
+futured
+futureor
+g
+gallery
+gamma
+gather
+gathered
+gatherer
+gathering
+gen
+general
+generalized
+generally
+generate
+generated
+generates
+generating
+generation
+generative
+generator
+generators
+generic
+generics
+get
+gets
+getter
+getters
+gft
+ghost
+git
+github
+give
+given
+gives
+giving
+glb
+gleaned
+global
+glorified
+gn
+go
+goes
+going
+good
+googlesource
+got
+goto
+gotos
+gotten
+governed
+gracefully
+grammar
+graph
+greater
+greatest
+greatly
+green
+greeting
+grounded
+group
+grouping
+groups
+grow
+growable
+gt
+gtgt
+guaranteed
+guarantees
+guard
+guards
+guess
+guide
+guidelines
+gulp
+gunk
+gypi
+gz
+gzip
+gzipped
+h
+hack
+hackish
+had
+hair
+half
+hand
+handle
+handled
+handler
+handlers
+handles
+handling
+happen
+happened
+happens
+hard
+hare
+harness
+has
+hash
+hasn't
+have
+haven't
+having
+head
+header
+headers
+heading
+hello
+help
+helper
+helpers
+hence
+here
+hermetic
+hest
+heuristic
+heuristics
+hex
+hexadecimal
+hfs
+hi
+hidden
+hide
+hides
+hierarchies
+hierarchy
+high
+higher
+highest
+highlighted
+hillerstrom
+hint
+hints
+historically
+hoc
+hold
+holder
+holding
+holds
+home
+hood
+hooks
+host
+hosting
+hostnames
+hot
+hotreload
+how
+however
+href
+html
+http
+https
+hunk
+hurray
+hybrid
+i
+i'm
+ia
+id
+idea
+ideally
+ideas
+identical
+identified
+identifier
+identifiers
+identify
+identity
+ideographic
+idn
+ids
+if
+iff
+ignore
+ignored
+ignores
+ignoring
+ikg
+illegal
+illustrate
+imitation
+immediate
+immediately
+immutable
+impl
+implement
+implementation
+implementations
+implemented
+implementing
+implementor
+implements
+implication
+implicit
+implicitly
+implied
+implies
+import
+important
+imported
+importer
+importing
+imports
+imposes
+impossible
+improve
+improved
+in
+inbound
+inc
+inclosure
+include
+included
+includes
+including
+inclusive
+incoming
+incompatible
+incomplete
+inconsistent
+incorrect
+incorrectly
+increase
+increased
+increases
+increment
+incremental
+incrementally
+indeed
+indent
+indentation
+indented
+independent
+index
+indexed
+indexes
+indicate
+indicated
+indicates
+indicating
+indices
+indirect
+indirectly
+individual
+induce
+infer
+inference
+inferrable
+inferred
+inferrer
+inferring
+infers
+infinite
+infix
+info
+inform
+informal
+informally
+information
+informational
+informs
+infos
+inherit
+inheritable
+inheritance
+inherited
+inherits
+init
+initial
+initialization
+initialize
+initialized
+initializer
+initializers
+initializes
+initializing
+initially
+inject
+injected
+injection
+inline
+inlined
+inlining
+inner
+innermost
+input
+inputs
+insert
+inserted
+inserting
+insertion
+inserts
+inside
+inspect
+install
+installed
+instance
+instances
+instantiate
+instantiated
+instantiates
+instantiating
+instantiation
+instantiations
+instead
+instrumentation
+instrumented
+insufficient
+int
+intact
+integer
+integers
+integrated
+integrating
+integration
+intended
+intent
+interaction
+intercept
+interceptors
+interest
+interface
+interfaces
+interferes
+intern
+internal
+internally
+internals
+international
+interned
+interner
+internet
+interpolate
+interpolated
+interpolation
+interpret
+interpreted
+interpreter
+interpreting
+intersect
+intersection
+into
+intrinsic
+introduce
+introduced
+introduces
+introducing
+ints
+inv
+invalid
+invalidate
+invalidated
+invalidates
+invalidating
+invariant
+invariantly
+invariants
+invert
+inverted
+investigate
+invocation
+invocation's
+invocations
+invoke
+invoked
+invokes
+invoking
+involved
+involving
+io
+ir
+irrelevant
+is
+isn't
+isolate
+isolates
+issue
+issued
+issues
+it
+it's
+item
+itemize
+items
+iter
+iterable
+iterate
+iteration
+iterations
+iterator
+its
+itself
+j
+java
+javascript
+jensj
+johnniwinther
+join
+joined
+joining
+joins
+js
+json
+judgment
+judgments
+jump
+jumped
+just
+juxtaposition
+juxtapositions
+k
+k’s
+keep
+keeping
+keeps
+kept
+kernel
+kernel's
+kernel2kernel
+key
+keys
+keyword
+keywords
+kind
+kinds
+klass
+kmillikin
+know
+knowing
+known
+knows
+ko
+kustermann
+l
+la
+label
+labeled
+labeler
+labelled
+labels
+lack
+lacking
+lacks
+lands
+lang
+langauge
+language
+large
+larger
+largest
+last
+late
+later
+latter
+lax
+lazily
+lazy
+lc
+ld
+le
+lead
+leading
+leads
+leaf
+leafp
+leak
+leaking
+leaks
+least
+leave
+leaves
+leaving
+led
+left
+legacy
+legal
+legally
+len
+length
+less
+let
+let's
+lets
+letter
+letters
+level
+lex
+lexeme
+lexemes
+lexical
+lexically
+lexicographical
+lf
+lhs
+lib
+libraries
+libraries.json
+library
+library's
+libs
+license
+licensing
+light
+lightly
+like
+likely
+likewise
+limit
+limited
+line
+linear
+linebreaks
+lines
+link
+linked
+linking
+links
+lint
+linux
+list
+listed
+listen
+listener
+listener's
+listeners
+listening
+lists
+literal
+literal's
+literals
+little
+live
+lived
+ll
+lm
+load
+loaded
+loader
+loaders
+loading
+loadlibrary
+loads
+local
+locally
+locals
+locate
+located
+location
+locations
+locked
+log
+logd
+logger
+logging
+logic
+logical
+logs
+long
+longer
+longest
+look
+looked
+looking
+looks
+lookup
+lookups
+loop
+loopback
+looping
+loops
+loosely
+lost
+lot
+lots
+low
+lower
+lowercase
+lowered
+lowering
+lry
+ls
+lt
+lub
+lvalue
+m
+mac
+machine
+made
+magenta
+magic
+main
+mainly
+maintain
+major
+make
+maker
+makes
+making
+malformed
+mandatory
+manipulate
+manually
+many
+map
+mapped
+mapping
+mappings
+maps
+mark
+markdown
+marked
+marker
+markers
+marking
+marks
+mask
+master
+match
+matched
+matcher
+matches
+matching
+math
+mathematical
+matter
+matters
+maturity
+max
+may
+maybe
+mb
+mc
+md
+me
+mean
+meaning
+meaningful
+means
+meant
+measurably
+measure
+measured
+mechanism
+medium
+meet
+member
+members
+memory
+mention
+mentioned
+mentions
+merge
+merged
+merges
+merging
+message
+messages
+messaging
+met
+meta
+metadata
+method
+methods
+metric
+metrics
+mf
+mi
+micro
+microseconds
+microtask
+mid
+middle
+might
+millisecond
+milliseconds
+min
+minimal
+minimum
+minor
+minus
+mirror
+mirrors
+misleading
+mismatch
+mismatched
+mismatches
+miss
+missing
+misspelled
+mistake
+mix
+mixed
+mixes
+mixin
+mixin's
+mixins
+mk
+mm
+mn
+mock
+mode
+model
+modes
+modifiable
+modification
+modifications
+modified
+modifier
+modifiers
+modifies
+modify
+modifying
+modular
+module
+modules
+modulo
+moment
+mongolian
+monomorphic
+month
+more
+most
+mostly
+motivation
+move
+moved
+moving
+ms
+msg
+much
+multi
+multiline
+multiple
+multiplicative
+multiply
+must
+mustache
+mutable
+mutate
+mutated
+mutates
+mutation
+mutations
+mutual
+mutually
+mx
+my
+mysdk
+n
+na
+naive
+name
+name.#name
+name.stack
+named
+namely
+names
+namespace
+naming
+narrow
+narrower
+native
+native('native
+nativetype
+nature
+nbsp
+ncs
+ncurses
+nd
+nearest
+necessarily
+necessary
+need
+needed
+needing
+needs
+negatable
+negate
+negated
+negation
+negative
+negatives
+neighbor
+neighbors
+neither
+nest
+nested
+nesting
+net
+never
+new
+newer
+newline
+newlines
+newly
+next
+nextnext
+ni
+nice
+nicely
+ninja
+nj
+nk
+nnbd
+no
+nobody
+node
+nodes
+non
+none
+nonexisting
+nor
+normal
+normalize
+normalized
+normalizes
+normally
+nosuchmethod
+not
+notation
+note
+notes
+nothing
+notice
+noticed
+notifies
+notion
+now
+nr
+ns
+nsm
+null
+nullability
+nullable
+nullary
+num
+num1%.3ms
+number
+numbers
+numerator
+numeric
+o
+obj
+object
+object's
+objects
+observable
+observation
+observatory
+observed
+obtain
+obtained
+obvious
+occur
+occurred
+occurrence
+occurrences
+occurring
+occurs
+odd
+of
+off
+offs
+offset
+offsets
+often
+ogham
+oh
+ok
+okay
+old
+older
+omit
+omitted
+on
+once
+one
+ones
+only
+op
+open
+opener
+openers
+opening
+operand
+operands
+operates
+operation
+operations
+operator
+operators
+opposed
+opt
+optimistically
+optimization
+optimize
+option
+optional
+optionally
+optionals
+options
+opts
+or
+oracle
+order
+ordering
+ordinal
+ordinary
+org
+organized
+origin
+original
+originally
+originate
+originated
+originating
+origins
+orphan
+orphaned
+os
+other
+others
+otherwise
+ought
+our
+out
+outcome
+outcomes
+outer
+outermost
+outgoing
+outline
+outlines
+outlining
+output
+outside
+over
+overflow
+overlay
+overloadable
+overloaded
+overloading
+overridden
+override
+overrides
+overriding
+overshadowed
+overwritten
+own
+owned
+owner
+p
+p1
+p2
+package
+packages
+pad
+padded
+padding
+page
+pain
+pair
+pairs
+pairwise
+paragraph
+param
+parameter
+parameters
+parametrized
+params
+paren
+parens
+parent
+parent's
+parentheses
+parenthesis
+parenthesized
+parents
+parse
+parsed
+parser
+parser's
+parses
+parsing
+part
+part(s)
+partial
+partially
+participate
+particular
+parts
+party
+pass
+passed
+passing
+past
+pasted
+patch
+patched
+patches
+path
+pathos
+paths
+pattern
+paulberry
+pause
+pay
+payload
+pdf
+peek
+per
+percent
+perf
+perform
+performance
+performed
+performing
+performs
+perhaps
+period
+periodic
+periodically
+periods
+permissible
+permitted
+persistent
+person
+phase
+phased
+phases
+phrase
+physical
+pi
+pick
+picked
+pink
+pipeline
+pivot
+pkg
+place
+placed
+placeholder
+placeholders
+places
+plain
+plan
+platform
+platform's
+platforms
+please
+plethora
+plus
+pm
+pn
+point
+pointer
+pointers
+pointing
+points
+pointwise
+policy
+polymorphic
+pop
+popping
+pops
+populated
+port
+portion
+portions
+pos
+position
+positional
+positionals
+positions
+positive
+positives
+possible
+possibly
+post
+postfix
+postpone
+postponed
+potential
+potentially
+pp
+practice
+practices
+pre
+prebuilt
+precede
+preceded
+precedence
+precedes
+preceding
+preceeding
+precise
+precisely
+precision
+preclude
+precondition
+predicate
+preemptively
+prefer
+preferable
+preference
+preferred
+prefix
+prefixed
+prefixes
+preliminary
+prematurely
+prepare
+prepared
+preparing
+prepend
+prepended
+prepending
+prepends
+presence
+present
+preserve
+preserved
+preserving
+presumed
+pretend
+pretends
+pretty
+prev
+prevent
+prevented
+prevents
+previous
+previously
+primary
+primitive
+principle
+print
+printed
+printer
+printf
+printing
+println
+prints
+prior
+priority
+privacy
+private
+probably
+problem
+problematic
+problems
+proc
+procedure
+procedures
+proceed
+process
+processed
+processing
+produce
+produced
+producer
+produces
+producing
+production
+profiler
+profiling
+program
+program's
+programmer
+programming
+programs
+progress
+project
+project's
+projects
+prologue
+promote
+promoted
+promoter
+promotes
+promotion
+promotions
+prop
+propagate
+propagated
+propagating
+proper
+properly
+properties
+property
+protected
+proto
+prototype
+proves
+provide
+provided
+provider
+provides
+providing
+provoked
+provokes
+pruning
+ps
+pseudo
+pub
+public
+publications
+published
+pull
+punctuation
+pure
+purely
+purpose
+purposely
+purposes
+push
+pushed
+pushes
+pushing
+put
+putting
+pv
+px
+py
+q
+q'i
+qi
+qm
+quad
+quadratic
+qualified
+qualifier
+qualifiers
+quality
+query
+question
+queue
+quick
+quickly
+quite
+quot
+quote
+quotes
+quoting
+r
+r'\s
+r"\s
+radix
+raise
+ran
+random
+range
+rare
+rather
+raw
+rd
+re
+reach
+reachability
+reachable
+reached
+reaches
+reaching
+read
+readable
+reader
+reading
+reads
+ready
+real
+reality
+realized
+really
+reason
+reasonable
+reasons
+reassigned
+rebind
+rebuild
+receive
+receiver
+recent
+recently
+recognize
+recognized
+recognizes
+recommend
+recommendations
+recompile
+recompiled
+recompiling
+recompute
+recomputed
+record
+recorded
+recording
+records
+recover
+recoverable
+recovered
+recovering
+recovers
+recovery
+recurse
+recursing
+recursive
+recursively
+red
+redir
+redirect
+redirected
+redirectee
+redirecting
+redirection
+redirections
+redirects
+reduce
+reduced
+reducer
+reduces
+redundant
+reexports
+ref
+refactor
+refer
+reference
+referenced
+references
+referencing
+referred
+referring
+refers
+refine
+refinement
+reflect
+reflectee
+reflective
+reg
+regardless
+regenerate
+region
+regions
+register
+registered
+registers
+registry
+regress
+regression
+regressions
+regular
+rehash
+reissue
+rejected
+rejects
+rejoin
+relate
+related
+relation
+relational
+relationship
+relationships
+relative
+relativize
+release
+relevant
+relies
+reload
+reloads
+rely
+relying
+remain
+remainder
+remaining
+remains
+remember
+remembered
+remembers
+remote
+remove
+removed
+removes
+removing
+rename
+renaming
+reparse
+repeated
+repeatedly
+repeating
+repetitions
+replace
+replaced
+replacement
+replacing
+replicate
+replicating
+repo
+report
+reportable
+reported
+reporter
+reporting
+reports
+repository
+represent
+representation
+representations
+represented
+representing
+represents
+repro
+request
+requested
+require
+required
+requirements
+requires
+requiring
+res
+rescan
+reserved
+reset
+resets
+resolution
+resolve
+resolved
+resolver
+resolves
+resolving
+resource
+resources
+respect
+respected
+respective
+respectively
+respects
+response
+responsibility
+responsible
+rest
+restore
+restored
+restrict
+restricted
+result
+resulting
+results
+resume
+resynthesize
+retain
+retained
+retains
+rethrow
+retrieve
+retrieved
+retrieves
+return
+returned
+returning
+returns
+retype
+reuse
+reused
+reusing
+rev
+reverse
+reversed
+review
+revise
+revision
+revisit
+rewrite
+rewriter
+rewriting
+rewritten
+rhs
+ri
+rid
+right
+rightfully
+rights
+rise
+rn
+rnystrom
+roll
+root
+roots
+round
+routed
+rule
+rules
+run
+rune
+runes
+runner
+running
+runs
+runtime
+s
+safe
+safely
+said
+sake
+same
+sanity
+satisfied
+satisfies
+satisfy
+save
+saved
+say
+says
+sb
+scalar
+scan
+scanned
+scanner
+scanner's
+scanners
+scanning
+scans
+scheglov
+schema
+scheme
+schemes
+scope
+scopes
+scratch
+screen
+script
+scripts
+sdk
+sdk's
+sdksummary
+sealed
+search
+searched
+searches
+searching
+second
+secondary
+seconds
+section
+see
+seem
+seems
+seen
+sees
+segment
+segments
+select
+selected
+selecting
+selector
+self
+semantic
+semantics
+semi
+semicolon
+send
+sending
+sends
+sense
+sent
+sentinel
+separate
+separated
+separately
+separating
+separator
+sequence
+sequences
+serialization
+serialize
+serialized
+serializes
+serializing
+serious
+server
+service
+set
+setaf
+sets
+setter
+setters
+setting
+settled
+setup
+several
+severity
+sh
+shadow
+shadowed
+shadowing
+shake
+shaken
+shape
+shard
+shards
+share
+shared
+sharing
+shas
+shell
+shift
+shipped
+short
+shortcut
+shorten
+shot
+should
+shouldn't
+show
+shown
+shrink
+si
+side
+sigmund
+sign
+signal
+signalled
+signals
+signature
+signatures
+signed
+silent
+silly
+similar
+similarly
+simple
+simpler
+simplicity
+simplified
+simplifies
+simplify
+simplifying
+simply
+simulate
+simultaneous
+simultaneously
+since
+single
+singular
+sink
+site
+sites
+situation
+situations
+six
+size
+sj
+skip
+skipped
+skipping
+skips
+slack
+slash
+slb
+slices
+slightly
+slow
+slower
+slows
+small
+smallest
+smi
+sn
+snapshot
+snapshots
+snippet
+snippets
+so
+socket
+solution
+solve
+solved
+solving
+some
+something
+sometimes
+somewhat
+somewhere
+soon
+sophisticated
+sort
+sorted
+sorting
+sorts
+source
+sources
+space
+spaces
+spacing
+span
+spanning
+spans
+spec
+spec'ed
+special
+specialize
+specialized
+specific
+specifically
+specification
+specified
+specifies
+specify
+specifying
+speed
+speedup
+spell
+spellcheck
+spelled
+spelling
+spent
+split
+splitter
+splitting
+spread
+spreadable
+spreads
+sq
+sqrt
+square
+src
+st
+stable
+stack
+stacktrace
+stage
+stamps
+standalone
+standard
+star
+start
+started
+starters
+starting
+starts
+startup
+state
+statement
+statements
+states
+static
+statically
+statics
+status
+stays
+std
+stderr
+stdin
+stdio
+stdout
+step
+steps
+still
+stmt
+stop
+stops
+stopwatch
+store
+stored
+stores
+storing
+str
+straight
+strategy
+stray
+stream
+strictly
+string
+strings
+strip
+stripped
+strong
+strongest
+strongly
+struct
+struct<#name
+structs
+structural
+structure
+structures
+stub
+stub's
+stubs
+stuff
+stx
+style
+sub
+subclass
+subclassed
+subclasses
+subclassing
+subcommand
+subexpression
+subexpression's
+subexpressions
+subject
+sublist
+subscription
+subsequence
+subsequent
+subset
+subst
+substed
+substitute
+substituted
+substituting
+substitution
+substitutions
+substring
+substrings
+substructures
+subterms
+subtly
+subtool
+subtools
+subtract
+subtree
+subtrees
+subtype
+subtypes
+subtyping
+succeed
+succeeded
+succeeds
+success
+successful
+successfully
+succinct
+such
+suffice
+sufficient
+sufficiently
+suffix
+suggested
+suitable
+suite
+sum
+summaries
+summarization
+summarize
+summarized
+summarizes
+summary
+super
+super.namedconstructor
+superclass
+superclasses
+superinitializer
+superinterface
+supermixin
+supernode
+supers
+supertype
+supertype's
+supertypes
+supplement
+supplied
+supply
+support
+supported
+supporting
+supports
+supposed
+suppress
+suppressed
+sure
+surrogate
+surrogates
+surrounding
+survives
+suspect
+svg
+sw
+swap
+swapped
+switch
+symbol
+symbols
+symmetric
+symmetry
+sync
+synchronize
+synchronous
+syntactic
+syntactical
+syntactically
+syntax
+synth
+synthesize
+synthesized
+synthetic
+synthetically
+system
+systems
+t
+tab
+table
+tabs
+tag
+tags
+tail
+take
+taken
+takes
+talking
+target
+targeted
+targeting
+targets
+task
+team
+tear
+tearing
+tearoff
+tearoffs
+technically
+technique
+tell
+tells
+temp
+template
+templates
+temporarily
+temporary
+term
+termcap
+terminal
+terminal's
+terminals
+terminate
+terminated
+terminates
+terminating
+termination
+terminator
+terminology
+ternary
+test
+testcase
+testcases
+tested
+tester
+testing
+tests
+tex
+text
+texts
+textual
+th
+than
+that
+that's
+the
+their
+them
+themselves
+then
+theory
+there
+there's
+thereafter
+therefore
+thereof
+these
+they
+they're
+thin
+thing
+things
+think
+third
+this
+this.namedconstructor
+this.x
+those
+though
+three
+threshold
+threw
+throttle
+through
+throughout
+throw
+throwing
+thrown
+throws
+thumb
+thus
+ti
+tick
+ticker
+tid
+tiki
+tilde
+till
+time
+timeout
+timer
+times
+timing
+timings
+tip
+title
+tj
+tm
+tmp
+tn
+to
+today
+todo
+together
+token
+token's
+tokenize
+tokenized
+tokens
+too
+took
+tool
+tools
+top
+toplevel
+topologically
+tortoise
+total
+touched
+tpt
+tput
+trace
+traces
+tracing
+track
+tracked
+tracking
+tracks
+trail
+trailing
+transform
+transformation
+transformations
+transformed
+transformer
+transforming
+transient
+transition
+transitional
+transitions
+transitive
+transitively
+transitivity
+translate
+translated
+translates
+translating
+translation
+translator
+traversed
+treat
+treated
+treating
+treatment
+treats
+tree
+triangle
+trick
+tried
+tries
+trigger
+triggered
+triggers
+trim
+trimmed
+trimming
+trip
+triple
+triples
+triplet
+triplets
+trivial
+trivially
+true
+truly
+truncate
+truncated
+truncating
+truth
+try
+trying
+ts
+tt
+tty
+turn
+turned
+turning
+tv
+twice
+two
+txt
+type
+type3.#name
+typeargs
+typed
+typedef
+typedefs
+typeparam
+typeparambounds
+typeref
+types
+typically
+typing
+u
+ui
+uint
+uint16
+uint32
+uint8
+un
+unable
+unalias
+unary
+unassigned
+unavailable
+unbalanced
+unbind
+unbreak
+unchanged
+unclaimed
+unclear
+uncomment
+unconstrained
+undefined
+under
+underlying
+underscore
+understand
+unequal
+unescape
+unevaluated
+unexact
+unexpected
+unfinalized
+unfinished
+unforeseen
+unfortunate
+unfuture
+unfutured
+unhandled
+unhelpful
+unicode
+unification
+unified
+unifying
+unimplemented
+uninitialized
+union
+unioned
+unique
+unit
+units
+unix
+unknown
+unless
+unlike
+unlinked
+unlower
+unmatched
+unmentioned
+unmodifiable
+unmodified
+unnamed
+unnecessarily
+unnecessary
+unordered
+unparsed
+unpromoted
+unreachable
+unread
+unrecognized
+unrecoverable
+unreferenced
+unregistered
+unrelated
+unresolved
+unsafe
+unsatisfied
+unserializable
+unsigned
+unsized
+unsorted
+unspecified
+unsplit
+unstable
+unsuccessful
+unsupported
+unterminated
+until
+untransformed
+untranslatable
+untyped
+unused
+unwrap
+unwrapped
+up
+update
+update2018
+updated
+updater
+updaters
+updates
+updating
+upon
+upper
+uppercase
+upward
+upwards
+ur
+uri
+uri's
+uris
+url
+urls
+us
+usable
+usage
+use
+used
+useful
+user
+users
+uses
+using
+usr
+usual
+utf
+utf16
+utf8
+util
+utilities
+utility
+utils
+v
+val
+valid
+validate
+validated
+validating
+validation
+validations
+validator
+validity
+value
+valued
+values
+var
+variable
+variable's
+variables
+variance
+variances
+variants
+various
+vegorov
+verbatim
+verbose
+verification
+verified
+verifier
+verifies
+verify
+verifying
+versa
+version
+versioning
+versions
+vertex
+vertical
+vertices
+very
+via
+vice
+view
+violate
+violates
+violation
+virtual
+visible
+visit
+visited
+visitor
+visual
+vm
+vm's
+void
+vowel
+vs
+vtab
+w
+wait
+waiting
+walk
+walked
+walt
+want
+wanted
+warmup
+warn
+warning
+warnings
+was
+wasn't
+way
+wc
+we
+we'd
+we'll
+we're
+we've
+web
+weight
+weird
+weirdness
+well
+were
+weren't
+werror
+what
+what's
+whatever
+whatsoever
+when
+whenever
+where
+whereas
+whether
+which
+while
+white
+whitelist
+whitelisted
+whitelisting
+whitespace
+whole
+whose
+why
+widely
+width
+wiki
+wikipedia
+wil
+wildcard
+will
+windows
+wins
+with
+with1
+within
+without
+won't
+word
+words
+work
+workaround
+worker
+workflow
+working
+worklist
+works
+world
+would
+wouldn't
+wrap
+wrapped
+wrapper
+wrapping
+wraps
+writable
+write
+writeln
+writer
+writes
+writing
+written
+wrong
+wrote
+wrt
+www
+x
+x's
+x0
+x00
+x10
+x10ffff
+x180
+x1b
+x1f
+x1ff
+x2
+x200
+x202
+x205
+x3
+x5
+x7
+xcodebuild
+xd
+xdbff
+xdc
+xdfff
+xi
+xm
+xn
+xor
+xterm
+xx
+xxx
+xxxx
+y
+y's
+yaml
+year
+yellow
+yes
+yet
+yield
+yielding
+yields
+you
+you'll
+you're
+your
+z
+zero
+zi
+zip
+zn
+zone
+zoned
\ No newline at end of file
diff --git a/pkg/front_end/test/spell_checking_utils.dart b/pkg/front_end/test/spell_checking_utils.dart
new file mode 100644
index 0000000..a06a9ff
--- /dev/null
+++ b/pkg/front_end/test/spell_checking_utils.dart
@@ -0,0 +1,189 @@
+// 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';
+
+Set<String> _dictionary;
+
+Set<String> spellcheckString(String s, {bool splitAsCode: false}) {
+  Set<String> wrongWords;
+  _dictionary ??= _loadDictionary();
+  List<String> words = splitStringIntoWords(s, splitAsCode: splitAsCode);
+  for (int i = 0; i < words.length; i++) {
+    String word = words[i].toLowerCase();
+    if (!_dictionary.contains(word)) {
+      wrongWords ??= new Set<String>();
+      wrongWords.add(word);
+    }
+  }
+  return wrongWords;
+}
+
+Set<String> _loadDictionary() {
+  Set<String> dictionary = new Set<String>();
+  addWords(Uri uri) {
+    for (String word in File.fromUri(uri)
+        .readAsStringSync()
+        .split("\n")
+        .map((s) => s.toLowerCase())) {
+      if (word.startsWith("#")) continue;
+      int indexOfHash = word.indexOf(" #");
+      if (indexOfHash >= 0) {
+        // Strip out comment.
+        word = word.substring(0, indexOfHash).trim();
+      }
+      if (word == "") continue;
+      if (word.contains(" ")) throw "'$word' contains spaces";
+      dictionary.add(word);
+    }
+  }
+
+  // TODO(jensj): Split list into several:
+  // * A common one with correctly spelled words.
+  // * A special one for messages.yaml.
+  // * A special one for source code in 'src'.
+  // * A special one for source code not in 'src'.
+  // and allow the caller to specify the combination of lists we want to use.
+  addWords(Uri.base.resolve("pkg/front_end/test/spell_checking_list.txt"));
+  return dictionary;
+}
+
+List<String> splitStringIntoWords(String s, {bool splitAsCode: false}) {
+  List<String> result = new List<String>();
+  // Match whitespace and the characters "-", "=", "|", "/", ",".
+  String regExpStringInner = r"\s-=\|\/,";
+  if (splitAsCode) {
+    // If splitting as code also split by "_", ":", ".", "(", ")", "<", ">",
+    // "[", "]", "{", "}", "@", "&", "#", "?". (As well as doing stuff to camel
+    // casing further below).
+    regExpStringInner = "${regExpStringInner}_:\\.\\(\\)<>\\[\\]\{\}@&#\\?";
+  }
+  // Match one or more of the characters specified above.
+  String regExp = "[$regExpStringInner]+";
+  if (splitAsCode) {
+    // If splitting as code we also want to remove the two characters "\n".
+    regExp = "([$regExpStringInner]|(\\\\n))+";
+  }
+
+  List<String> split = s.split(new RegExp(regExp));
+  for (int i = 0; i < split.length; i++) {
+    String word = split[i].trim();
+    if (word.isEmpty) continue;
+    int start = 0;
+    int end = word.length;
+    bool changedStart = false;
+    while (start < end) {
+      int unit = word.codeUnitAt(start);
+      if (unit >= 65 && unit <= 90) {
+        // A-Z => Good.
+        break;
+      } else if (unit >= 97 && unit <= 122) {
+        // a-z => Good.
+        break;
+      } else {
+        changedStart = true;
+        start++;
+      }
+    }
+    bool changedEnd = false;
+    while (end > start) {
+      int unit = word.codeUnitAt(end - 1);
+      if (unit >= 65 && unit <= 90) {
+        // A-Z => Good.
+        break;
+      } else if (unit >= 97 && unit <= 122) {
+        // a-z => Good.
+        break;
+      } else {
+        changedEnd = true;
+        end--;
+      }
+    }
+    if (changedEnd && word.codeUnitAt(end) == 41) {
+      // Special case trimmed ')' if there's a '(' inside the string.
+      for (int i = start; i < end; i++) {
+        if (word.codeUnitAt(i) == 40) {
+          end++;
+          break;
+        }
+      }
+    }
+    if (start == end) continue;
+
+    if (splitAsCode) {
+      bool prevCapitalized = false;
+      for (int i = start; i < end; i++) {
+        bool thisCapitalized = false;
+        int unit = word.codeUnitAt(i);
+        if (unit >= 65 && unit <= 90) {
+          thisCapitalized = true;
+        } else if (unit >= 48 && unit <= 57) {
+          // Number inside --- allow that.
+          continue;
+        }
+        if (prevCapitalized && thisCapitalized) {
+          // Sort-of-weird thing, something like "thisIsTheCNN". Carry on.
+
+          // Except if the previous was an 'A' and that both the previous
+          // (before that) and the next (if any) is not capitalized, i.e.
+          // we special-case the case of 'A' as in 'AWord' being 'a word'.
+          int prevUnit = word.codeUnitAt(i - 1);
+          if (prevUnit == 65) {
+            bool doSpecialCase = true;
+            if (i + 1 < end) {
+              int nextUnit = word.codeUnitAt(i + 1);
+              if (nextUnit >= 65 && nextUnit <= 90) {
+                // Next is capitalized too.
+                doSpecialCase = false;
+              }
+            }
+            if (i - 2 >= start) {
+              int prevPrevUnit = word.codeUnitAt(i - 2);
+              if (prevPrevUnit >= 65 && prevPrevUnit <= 90) {
+                // Prev-prev was capitalized too.
+                doSpecialCase = false;
+              }
+            }
+            if (doSpecialCase) {
+              result.add(word.substring(start, i));
+              start = i;
+            }
+          }
+
+          // And the case where the next one is not capitalized --- we must
+          // assume that "TheCNNAlso" should be "The", "CNN", "Also".
+          if (start < i && i + 1 < end) {
+            int nextUnit = word.codeUnitAt(i + 1);
+            if (nextUnit >= 97 && nextUnit <= 122) {
+              // Next is not capitalized.
+              result.add(word.substring(start, i));
+              start = i;
+            }
+          }
+        } else if (!prevCapitalized && thisCapitalized) {
+          // Starting a new camel case word.
+          if (i > start) {
+            result.add(word.substring(start, i));
+            start = i;
+          }
+        } else if (prevCapitalized && !thisCapitalized) {
+          // This should have been handled above.
+        } else if (!prevCapitalized && !thisCapitalized) {
+          // Continued word.
+        }
+        if (i + 1 == end) {
+          // End of string.
+          if (i >= start) {
+            result.add(word.substring(start, end));
+          }
+        }
+        prevCapitalized = thisCapitalized;
+      }
+    } else {
+      result.add(
+          (changedStart || changedEnd) ? word.substring(start, end) : word);
+    }
+  }
+  return result;
+}
diff --git a/pkg/front_end/test/spell_checking_utils_test.dart b/pkg/front_end/test/spell_checking_utils_test.dart
new file mode 100644
index 0000000..dd4a3bc
--- /dev/null
+++ b/pkg/front_end/test/spell_checking_utils_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 'spell_checking_utils.dart';
+
+void main() {
+  _expectList(splitStringIntoWords("Hello world"), ["Hello", "world"]);
+  _expectList(splitStringIntoWords("Hello\nworld"), ["Hello", "world"]);
+  _expectList(splitStringIntoWords("Hello 'world'"), ["Hello", "world"]);
+  _expectList(splitStringIntoWords("It's fun"), ["It's", "fun"]);
+  _expectList(splitStringIntoWords("It's 'fun'"), ["It's", "fun"]);
+  _expectList(splitStringIntoWords("exit-code"), ["exit", "code"]);
+  _expectList(splitStringIntoWords("fatal=warning"), ["fatal", "warning"]);
+  _expectList(splitStringIntoWords("vm|none"), ["vm", "none"]);
+  _expectList(splitStringIntoWords("vm/none"), ["vm", "none"]);
+  _expectList(splitStringIntoWords("vm,none"), ["vm", "none"]);
+  _expectList(splitStringIntoWords("One or more word(s)"),
+      ["One", "or", "more", "word(s)"]);
+  _expectList(splitStringIntoWords("One or more words)"),
+      ["One", "or", "more", "words"]);
+  _expectList(
+      splitStringIntoWords("It's 'fun' times 100"), ["It's", "fun", "times"]);
+
+  _expectList(splitStringIntoWords("splitCamelCase", splitAsCode: false),
+      ["splitCamelCase"]);
+  _expectList(splitStringIntoWords("splitCamelCase", splitAsCode: true),
+      ["split", "Camel", "Case"]);
+  _expectList(splitStringIntoWords("logicalAnd_end", splitAsCode: true),
+      ["logical", "And", "end"]);
+  _expectList(splitStringIntoWords("TheCNNAlso", splitAsCode: true),
+      ["The", "CNN", "Also"]);
+  _expectList(splitStringIntoWords("LOGICAL_OR_PRECEDENCE", splitAsCode: true),
+      ["LOGICAL", "OR", "PRECEDENCE"]);
+
+  _expectList(splitStringIntoWords("ThisIsTheCNN", splitAsCode: true),
+      ["This", "Is", "The", "CNN"]);
+
+  // Special-case "A".
+  _expectList(splitStringIntoWords("notAConstant", splitAsCode: true),
+      ["not", "A", "Constant"]);
+  _expectList(
+      splitStringIntoWords("notAC", splitAsCode: true), ["not", "A", "C"]);
+  _expectList(
+      splitStringIntoWords("split_etc", splitAsCode: false), ["split_etc"]);
+  _expectList(
+      splitStringIntoWords("split_etc", splitAsCode: true), ["split", "etc"]);
+  _expectList(
+      splitStringIntoWords("split:etc", splitAsCode: false), ["split:etc"]);
+  _expectList(
+      splitStringIntoWords("split:etc", splitAsCode: true), ["split", "etc"]);
+
+  _expectList(splitStringIntoWords("vm.none", splitAsCode: false), ["vm.none"]);
+  _expectList(
+      splitStringIntoWords("vm.none", splitAsCode: true), ["vm", "none"]);
+
+  _expectList(splitStringIntoWords("ActualData(foo, bar)", splitAsCode: false),
+      ["ActualData(foo", "bar"]);
+  _expectList(splitStringIntoWords("ActualData(foo, bar)", splitAsCode: true),
+      ["Actual", "Data", "foo", "bar"]);
+
+  _expectList(
+      splitStringIntoWords("List<int>", splitAsCode: false), ["List<int"]);
+  _expectList(
+      splitStringIntoWords("List<int>", splitAsCode: true), ["List", "int"]);
+
+  _expectList(
+      splitStringIntoWords("Platform.environment['TERM']", splitAsCode: false),
+      ["Platform.environment['TERM"]);
+  _expectList(
+      splitStringIntoWords("Platform.environment['TERM']", splitAsCode: true),
+      ["Platform", "environment", "TERM"]);
+
+  _expectList(splitStringIntoWords("DART2JS_PLATFORM", splitAsCode: false),
+      ["DART2JS_PLATFORM"]);
+  _expectList(splitStringIntoWords("DART2JS_PLATFORM", splitAsCode: true),
+      ["DART2JS", "PLATFORM"]);
+
+  _expectList(splitStringIntoWords("Foo\\n", splitAsCode: false), ["Foo\\n"]);
+  _expectList(splitStringIntoWords("Foo\\n", splitAsCode: true), ["Foo"]);
+
+  _expectList(
+      splitStringIntoWords("foo({bar})", splitAsCode: false), ["foo({bar"]);
+  _expectList(
+      splitStringIntoWords("foo({bar})", splitAsCode: true), ["foo", "bar"]);
+
+  _expectList(splitStringIntoWords("foo@bar", splitAsCode: false), ["foo@bar"]);
+  _expectList(
+      splitStringIntoWords("foo@bar", splitAsCode: true), ["foo", "bar"]);
+
+  _expectList(splitStringIntoWords("foo#bar", splitAsCode: false), ["foo#bar"]);
+  _expectList(
+      splitStringIntoWords("foo#bar", splitAsCode: true), ["foo", "bar"]);
+
+  _expectList(splitStringIntoWords("foo&bar", splitAsCode: false), ["foo&bar"]);
+  _expectList(
+      splitStringIntoWords("foo&bar", splitAsCode: true), ["foo", "bar"]);
+
+  _expectList(splitStringIntoWords("foo?bar", splitAsCode: false), ["foo?bar"]);
+  _expectList(
+      splitStringIntoWords("foo?bar", splitAsCode: true), ["foo", "bar"]);
+
+  print("OK");
+}
+
+void _expectList(List<String> actual, List<String> expected) {
+  if (actual.length != expected.length)
+    throw "Not the same ($actual vs $expected)";
+  for (int i = 0; i < actual.length; i++) {
+    if (actual[i] != expected[i]) throw "Not the same ($actual vs $expected)";
+  }
+}
diff --git a/pkg/front_end/test/spelling_test.dart b/pkg/front_end/test/spelling_test.dart
new file mode 100644
index 0000000..d65ed1c
--- /dev/null
+++ b/pkg/front_end/test/spelling_test.dart
@@ -0,0 +1,114 @@
+// 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' show Future;
+
+import 'dart:io' show File;
+
+import 'dart:typed_data' show Uint8List;
+
+import 'package:front_end/src/fasta/scanner.dart' show ErrorToken;
+
+import 'package:front_end/src/fasta/scanner/utf8_bytes_scanner.dart'
+    show Utf8BytesScanner;
+
+import 'package:front_end/src/scanner/token.dart'
+    show Token, KeywordToken, BeginToken;
+import 'package:front_end/src/scanner/token.dart';
+
+import 'package:testing/testing.dart'
+    show Chain, ChainContext, Result, Step, TestDescription, runMe;
+
+import 'spell_checking_utils.dart' as spell;
+
+main([List<String> arguments = const []]) =>
+    runMe(arguments, createContext, "../testing.json");
+
+Future<Context> createContext(
+    Chain suite, Map<String, String> environment) async {
+  return new Context();
+}
+
+class Context extends ChainContext {
+  final List<Step> steps = const <Step>[
+    const SpellTest(),
+  ];
+
+  // Override special handling of negative tests.
+  @override
+  Result processTestResult(
+      TestDescription description, Result result, bool last) {
+    return result;
+  }
+}
+
+class SpellTest extends Step<TestDescription, TestDescription, Context> {
+  const SpellTest();
+
+  String get name => "spell test";
+
+  Future<Result<TestDescription>> run(
+      TestDescription description, Context context) async {
+    File f = new File.fromUri(description.uri);
+    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();
+    if (firstToken == null) return null;
+    Token token = firstToken;
+
+    List<String> errors;
+
+    while (token != null) {
+      if (token is ErrorToken) {
+        // For now just accept that.
+        return pass(description);
+      }
+      if (token.precedingComments != null) {
+        Token comment = token.precedingComments;
+        while (comment != null) {
+          Set<String> misspelled =
+              spell.spellcheckString(comment.lexeme, splitAsCode: true);
+          if (misspelled != null) {
+            errors ??= new List<String>();
+            errors.add("Misspelled words around offset ${comment.offset}: "
+                "${misspelled.toList()}");
+          }
+          comment = comment.next;
+        }
+      }
+      if (token is StringToken) {
+        Set<String> misspelled =
+            spell.spellcheckString(token.lexeme, splitAsCode: true);
+        if (misspelled != null) {
+          errors ??= new List<String>();
+          errors.add("Misspelled words around offset ${token.offset}: "
+              "${misspelled.toList()}");
+        }
+      } else if (token is KeywordToken || token is BeginToken) {
+        // Ignored.
+      } else if (token.runtimeType.toString() == "SimpleToken") {
+        // Ignored.
+      } else {
+        throw "Unsupported token type: ${token.runtimeType} ($token)";
+      }
+
+      if (token.isEof) break;
+
+      token = token.next;
+    }
+
+    if (errors == null) {
+      return pass(description);
+    } else {
+      // TODO(jensj): Point properly in the source code like compilation errors
+      // do.
+      return fail(description, errors.join("\n"));
+    }
+  }
+}
diff --git a/pkg/front_end/test/spelling_test.status b/pkg/front_end/test/spelling_test.status
new file mode 100644
index 0000000..21958ca
--- /dev/null
+++ b/pkg/front_end/test/spelling_test.status
@@ -0,0 +1,6 @@
+# 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.
+
+# Note that this file should always be empty. Update "spell_checking_list.txt"
+# as needed instead.
\ No newline at end of file
diff --git a/pkg/front_end/test/static_types/data/issue37439.dart b/pkg/front_end/test/static_types/data/issue37439.dart
new file mode 100644
index 0000000..253ac53
--- /dev/null
+++ b/pkg/front_end/test/static_types/data/issue37439.dart
@@ -0,0 +1,18 @@
+// 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.
+
+class A {}
+
+class B extends A {}
+
+Future<T> func1<T extends A>(T t) async {
+  // TODO(37439): We should infer 'T' instead of '<bottom>'.
+  return /*invoke: <bottom>*/ func2/*<<bottom>>*/(/*as: <bottom>*/ /*T*/ t);
+}
+
+T func2<T extends A>(T t) => /*T*/ t;
+
+main() async {
+  /*B*/ await /*invoke: Future<B>*/ func1/*<B>*/(/*B*/ B());
+}
diff --git a/pkg/front_end/test/static_types/data/list_literals.dart b/pkg/front_end/test/static_types/data/list_literals.dart
new file mode 100644
index 0000000..1c91bbe
--- /dev/null
+++ b/pkg/front_end/test/static_types/data/list_literals.dart
@@ -0,0 +1,10 @@
+// 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.
+
+main() {
+  /*List<dynamic>*/ [];
+  /*List<int>*/ [/*int*/ 0];
+  /*List<num>*/ [/*int*/ 0, /*double*/ 0.5];
+  /*List<Object>*/ [/*int*/ 0, /*String*/ ''];
+}
diff --git a/pkg/front_end/test/static_types/data/literals.dart b/pkg/front_end/test/static_types/data/literals.dart
new file mode 100644
index 0000000..6077b43
--- /dev/null
+++ b/pkg/front_end/test/static_types/data/literals.dart
@@ -0,0 +1,13 @@
+// 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.
+
+main() {
+  /*Null*/ null;
+  /*bool*/ true;
+  /*bool*/ false;
+  /*String*/ 'foo';
+  /*int*/ 42;
+  /*double*/ 0.5;
+  /*Symbol*/ #main;
+}
diff --git a/pkg/front_end/test/static_types/data/map_literals.dart b/pkg/front_end/test/static_types/data/map_literals.dart
new file mode 100644
index 0000000..42cb934
--- /dev/null
+++ b/pkg/front_end/test/static_types/data/map_literals.dart
@@ -0,0 +1,39 @@
+// 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.
+
+main() {
+  // ignore: unused_local_variable
+  var a0 = /*Map<dynamic,dynamic>*/ {};
+  // ignore: unused_local_variable
+  var a1 = /*Map<int,double>*/ {/*int*/ 0: /*double*/ 0.5 };
+  // ignore: unused_local_variable
+  var a2 = /*Map<double,int>*/ {/*double*/ 0.5: /*int*/ 0 };
+  // ignore: unused_local_variable
+  var a3 = /*Map<int,num>*/ {/*int*/ 0: /*double*/ 0.5, /*int*/ 1: /*int*/ 2 };
+  // ignore: unused_local_variable
+  var a4 = /*Map<num,double>*/ {
+    /*int*/ 0: /*double*/ 0.5,
+    /*double*/ 0.5: /*double*/ 0.5
+  };
+  // ignore: unused_local_variable
+  var a5 = /*Map<num,num>*/ {
+    /*int*/ 0: /*double*/ 0.5,
+    /*double*/ 0.5: /*int*/ 0
+  };
+  // ignore: unused_local_variable
+  var a6 = /*Map<int,Object>*/ {
+    /*int*/ 0: /*double*/ 0.5,
+    /*int*/ 1: /*String*/ ''
+  };
+  // ignore: unused_local_variable
+  var a7 = /*Map<Object,double>*/ {
+    /*int*/ 0: /*double*/ 0.5,
+    /*String*/ '': /*double*/ 0.5
+  };
+  // ignore: unused_local_variable
+  var a8 = /*Map<Object,Object>*/ {
+    /*int*/ 0: /*double*/ 0.5,
+    /*String*/ '': /*String*/ ''
+  };
+}
diff --git a/pkg/front_end/test/static_types/data/set_literals.dart b/pkg/front_end/test/static_types/data/set_literals.dart
new file mode 100644
index 0000000..7c40277
--- /dev/null
+++ b/pkg/front_end/test/static_types/data/set_literals.dart
@@ -0,0 +1,14 @@
+// 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.
+
+main() {
+  // ignore: unused_local_variable
+  var a0 = /*Map<dynamic,dynamic>*/ {};
+  // ignore: unused_local_variable
+  var a1 = /*Set<int>*/ {/*int*/ 0};
+  // ignore: unused_local_variable
+  var a2 = /*Set<num>*/ {/*int*/ 0, /*double*/ 0.5};
+  // ignore: unused_local_variable
+  var a3 = /*Set<Object>*/ {/*int*/ 0, /*String*/ ''};
+}
diff --git a/pkg/front_end/test/static_types/static_type_test.dart b/pkg/front_end/test/static_types/static_type_test.dart
new file mode 100644
index 0000000..5a0f1f2
--- /dev/null
+++ b/pkg/front_end/test/static_types/static_type_test.dart
@@ -0,0 +1,61 @@
+// 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 Directory, Platform;
+import 'package:front_end/src/fasta/kernel/kernel_api.dart';
+import 'package:front_end/src/testing/id.dart' show ActualData, Id;
+import 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, runTests;
+import 'package:front_end/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:kernel/ast.dart';
+
+main(List<String> args) async {
+  Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+  await runTests(dataDir,
+      args: args,
+      supportedMarkers: sharedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: onFailure,
+      runTest: runTestFor(const StaticTypeDataComputer(), [defaultCfeConfig]));
+}
+
+class StaticTypeDataComputer extends DataComputer<String> {
+  const StaticTypeDataComputer();
+
+  @override
+  void computeMemberData(InternalCompilerResult compilerResult, Member member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    member.accept(new StaticTypeDataExtractor(compilerResult, actualMap));
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+class StaticTypeDataExtractor extends CfeDataExtractor<String> {
+  final TypeEnvironment _environment;
+
+  StaticTypeDataExtractor(InternalCompilerResult compilerResult,
+      Map<Id, ActualData<String>> actualMap)
+      : _environment = new TypeEnvironment(
+            new CoreTypes(compilerResult.component),
+            new ClassHierarchy(compilerResult.component)),
+        super(compilerResult, actualMap);
+
+  @override
+  String computeNodeValue(Id id, TreeNode node) {
+    if (node is Expression) {
+      DartType type = node.getStaticType(_environment);
+      return typeToText(type);
+    } else if (node is Arguments) {
+      if (node.types.isNotEmpty) {
+        return '<${node.types.map(typeToText).join(',')}>';
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/front_end/test/summary_generator_test.dart b/pkg/front_end/test/summary_generator_test.dart
index 5c30538..044f900 100644
--- a/pkg/front_end/test/summary_generator_test.dart
+++ b/pkg/front_end/test/summary_generator_test.dart
@@ -94,7 +94,7 @@
     var sourcesWithABC = new Map<String, dynamic>.from(sourcesWithA);
     sourcesWithABC['bc.dill'] = summaryBC;
 
-    // Note: unlinke the previous test now bc.dill is loaded first and contains
+    // Note: unlike the previous test now bc.dill is loaded first and contains
     // an external definition of library a.dart. Using this order also works
     // because we share a CanonicalName root to resolve names across multiple
     // dill files and because of how the kernel loader merges definitions.
diff --git a/pkg/front_end/testcases/DeltaBlue.dart b/pkg/front_end/testcases/DeltaBlue.dart
deleted file mode 100644
index d8eee80..0000000
--- a/pkg/front_end/testcases/DeltaBlue.dart
+++ /dev/null
@@ -1,705 +0,0 @@
-// Copyright 2011 Google Inc. All Rights Reserved.
-// Copyright 1996 John Maloney and Mario Wolczko
-//
-// This file is part of GNU Smalltalk.
-//
-// GNU Smalltalk is free software; you can redistribute it and/or modify it
-// under the terms of the GNU General Public License as published by the Free
-// Software Foundation; either version 2, or (at your option) any later version.
-//
-// GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
-// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
-// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
-// details.
-//
-// You should have received a copy of the GNU General Public License along with
-// GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
-// Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
-//
-// Translated first from Smalltalk to JavaScript, and finally to
-// Dart by Google 2008-2010.
-
-/**
- * A Dart implementation of the DeltaBlue constraint-solving
- * algorithm, as described in:
- *
- * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
- *   Bjorn N. Freeman-Benson and John Maloney
- *   January 1990 Communications of the ACM,
- *   also available as University of Washington TR 89-08-06.
- *
- * Beware: this benchmark is written in a grotesque style where
- * the constraint model is built by side-effects from constructors.
- * I've kept it this way to avoid deviating too much from the original
- * implementation.
- */
-
-main() {
-  new DeltaBlue().run();
-}
-
-/// Benchmark class required to report results.
-class DeltaBlue {
-  void run() {
-    chainTest(100);
-    projectionTest(100);
-  }
-}
-
-/**
- * Strengths are used to measure the relative importance of constraints.
- * New strengths may be inserted in the strength hierarchy without
- * disrupting current constraints.  Strengths cannot be created outside
- * this class, so == can be used for value comparison.
- */
-class Strength {
-  final int value;
-  final String name;
-
-  const Strength(this.value, this.name);
-
-  Strength nextWeaker() => const <Strength>[
-        STRONG_PREFERRED,
-        PREFERRED,
-        STRONG_DEFAULT,
-        NORMAL,
-        WEAK_DEFAULT,
-        WEAKEST
-      ][value];
-
-  static bool stronger(Strength s1, Strength s2) {
-    return s1.value < s2.value;
-  }
-
-  static bool weaker(Strength s1, Strength s2) {
-    return s1.value > s2.value;
-  }
-
-  static Strength weakest(Strength s1, Strength s2) {
-    return weaker(s1, s2) ? s1 : s2;
-  }
-
-  static Strength strongest(Strength s1, Strength s2) {
-    return stronger(s1, s2) ? s1 : s2;
-  }
-}
-
-// Compile time computed constants.
-const REQUIRED = const Strength(0, "required");
-const STRONG_PREFERRED = const Strength(1, "strongPreferred");
-const PREFERRED = const Strength(2, "preferred");
-const STRONG_DEFAULT = const Strength(3, "strongDefault");
-const NORMAL = const Strength(4, "normal");
-const WEAK_DEFAULT = const Strength(5, "weakDefault");
-const WEAKEST = const Strength(6, "weakest");
-
-abstract class Constraint {
-  final Strength strength;
-
-  const Constraint(this.strength);
-
-  bool isSatisfied();
-  void markUnsatisfied();
-  void addToGraph();
-  void removeFromGraph();
-  void chooseMethod(int mark);
-  void markInputs(int mark);
-  bool inputsKnown(int mark);
-  Variable output();
-  void execute();
-  void recalculate();
-
-  /// Activate this constraint and attempt to satisfy it.
-  void addConstraint() {
-    addToGraph();
-    planner.incrementalAdd(this);
-  }
-
-  /**
-   * Attempt to find a way to enforce this constraint. If successful,
-   * record the solution, perhaps modifying the current dataflow
-   * graph. Answer the constraint that this constraint overrides, if
-   * there is one, or nil, if there isn't.
-   * Assume: I am not already satisfied.
-   */
-  Constraint satisfy(mark) {
-    chooseMethod(mark);
-    if (!isSatisfied()) {
-      if (strength == REQUIRED) {
-        print("Could not satisfy a required constraint!");
-      }
-      return null;
-    }
-    markInputs(mark);
-    Variable out = output();
-    Constraint overridden = out.determinedBy;
-    if (overridden != null) overridden.markUnsatisfied();
-    out.determinedBy = this;
-    if (!planner.addPropagate(this, mark)) print("Cycle encountered");
-    out.mark = mark;
-    return overridden;
-  }
-
-  void destroyConstraint() {
-    if (isSatisfied()) planner.incrementalRemove(this);
-    removeFromGraph();
-  }
-
-  /**
-   * Normal constraints are not input constraints.  An input constraint
-   * is one that depends on external state, such as the mouse, the
-   * keybord, a clock, or some arbitrary piece of imperative code.
-   */
-  bool isInput() => false;
-}
-
-/**
- * Abstract superclass for constraints having a single possible output variable.
- */
-abstract class UnaryConstraint extends Constraint {
-  final Variable myOutput;
-  bool satisfied = false;
-
-  UnaryConstraint(this.myOutput, Strength strength) : super(strength) {
-    addConstraint();
-  }
-
-  /// Adds this constraint to the constraint graph
-  void addToGraph() {
-    myOutput.addConstraint(this);
-    satisfied = false;
-  }
-
-  /// Decides if this constraint can be satisfied and records that decision.
-  void chooseMethod(int mark) {
-    satisfied = (myOutput.mark != mark) &&
-        Strength.stronger(strength, myOutput.walkStrength);
-  }
-
-  /// Returns true if this constraint is satisfied in the current solution.
-  bool isSatisfied() => satisfied;
-
-  void markInputs(int mark) {
-    // has no inputs.
-  }
-
-  /// Returns the current output variable.
-  Variable output() => myOutput;
-
-  /**
-   * Calculate the walkabout strength, the stay flag, and, if it is
-   * 'stay', the value for the current output of this constraint. Assume
-   * this constraint is satisfied.
-   */
-  void recalculate() {
-    myOutput.walkStrength = strength;
-    myOutput.stay = !isInput();
-    if (myOutput.stay) execute(); // Stay optimization.
-  }
-
-  /// Records that this constraint is unsatisfied.
-  void markUnsatisfied() {
-    satisfied = false;
-  }
-
-  bool inputsKnown(int mark) => true;
-
-  void removeFromGraph() {
-    if (myOutput != null) myOutput.removeConstraint(this);
-    satisfied = false;
-  }
-}
-
-/**
- * Variables that should, with some level of preference, stay the same.
- * Planners may exploit the fact that instances, if satisfied, will not
- * change their output during plan execution.  This is called "stay
- * optimization".
- */
-class StayConstraint extends UnaryConstraint {
-  StayConstraint(Variable v, Strength str) : super(v, str);
-
-  void execute() {
-    // Stay constraints do nothing.
-  }
-}
-
-/**
- * A unary input constraint used to mark a variable that the client
- * wishes to change.
- */
-class EditConstraint extends UnaryConstraint {
-  EditConstraint(Variable v, Strength str) : super(v, str);
-
-  /// Edits indicate that a variable is to be changed by imperative code.
-  bool isInput() => true;
-
-  void execute() {
-    // Edit constraints do nothing.
-  }
-}
-
-// Directions.
-const int NONE = 1;
-const int FORWARD = 2;
-const int BACKWARD = 0;
-
-/**
- * Abstract superclass for constraints having two possible output
- * variables.
- */
-abstract class BinaryConstraint extends Constraint {
-  Variable v1;
-  Variable v2;
-  int direction = NONE;
-
-  BinaryConstraint(this.v1, this.v2, Strength strength) : super(strength) {
-    addConstraint();
-  }
-
-  /**
-   * Decides if this constraint can be satisfied and which way it
-   * should flow based on the relative strength of the variables related,
-   * and record that decision.
-   */
-  void chooseMethod(int mark) {
-    if (v1.mark == mark) {
-      direction =
-          (v2.mark != mark && Strength.stronger(strength, v2.walkStrength))
-              ? FORWARD
-              : NONE;
-    }
-    if (v2.mark == mark) {
-      direction =
-          (v1.mark != mark && Strength.stronger(strength, v1.walkStrength))
-              ? BACKWARD
-              : NONE;
-    }
-    if (Strength.weaker(v1.walkStrength, v2.walkStrength)) {
-      direction =
-          Strength.stronger(strength, v1.walkStrength) ? BACKWARD : NONE;
-    } else {
-      direction =
-          Strength.stronger(strength, v2.walkStrength) ? FORWARD : BACKWARD;
-    }
-  }
-
-  /// Add this constraint to the constraint graph.
-  void addToGraph() {
-    v1.addConstraint(this);
-    v2.addConstraint(this);
-    direction = NONE;
-  }
-
-  /// Answer true if this constraint is satisfied in the current solution.
-  bool isSatisfied() => direction != NONE;
-
-  /// Mark the input variable with the given mark.
-  void markInputs(int mark) {
-    input().mark = mark;
-  }
-
-  /// Returns the current input variable
-  Variable input() => direction == FORWARD ? v1 : v2;
-
-  /// Returns the current output variable.
-  Variable output() => direction == FORWARD ? v2 : v1;
-
-  /**
-   * Calculate the walkabout strength, the stay flag, and, if it is
-   * 'stay', the value for the current output of this
-   * constraint. Assume this constraint is satisfied.
-   */
-  void recalculate() {
-    Variable ihn = input(), out = output();
-    out.walkStrength = Strength.weakest(strength, ihn.walkStrength);
-    out.stay = ihn.stay;
-    if (out.stay) execute();
-  }
-
-  /// Record the fact that this constraint is unsatisfied.
-  void markUnsatisfied() {
-    direction = NONE;
-  }
-
-  bool inputsKnown(int mark) {
-    Variable i = input();
-    return i.mark == mark || i.stay || i.determinedBy == null;
-  }
-
-  void removeFromGraph() {
-    if (v1 != null) v1.removeConstraint(this);
-    if (v2 != null) v2.removeConstraint(this);
-    direction = NONE;
-  }
-}
-
-/**
- * Relates two variables by the linear scaling relationship: "v2 =
- * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
- * this relationship but the scale factor and offset are considered
- * read-only.
- */
-
-class ScaleConstraint extends BinaryConstraint {
-  final Variable scale;
-  final Variable offset;
-
-  ScaleConstraint(
-      Variable src, this.scale, this.offset, Variable dest, Strength strength)
-      : super(src, dest, strength);
-
-  /// Adds this constraint to the constraint graph.
-  void addToGraph() {
-    super.addToGraph();
-    scale.addConstraint(this);
-    offset.addConstraint(this);
-  }
-
-  void removeFromGraph() {
-    super.removeFromGraph();
-    if (scale != null) scale.removeConstraint(this);
-    if (offset != null) offset.removeConstraint(this);
-  }
-
-  void markInputs(int mark) {
-    super.markInputs(mark);
-    scale.mark = offset.mark = mark;
-  }
-
-  /// Enforce this constraint. Assume that it is satisfied.
-  void execute() {
-    if (direction == FORWARD) {
-      v2.value = v1.value * scale.value + offset.value;
-    } else {
-      v1.value = (v2.value - offset.value) ~/ scale.value;
-    }
-  }
-
-  /**
-   * Calculate the walkabout strength, the stay flag, and, if it is
-   * 'stay', the value for the current output of this constraint. Assume
-   * this constraint is satisfied.
-   */
-  void recalculate() {
-    Variable ihn = input(), out = output();
-    out.walkStrength = Strength.weakest(strength, ihn.walkStrength);
-    out.stay = ihn.stay && scale.stay && offset.stay;
-    if (out.stay) execute();
-  }
-}
-
-/**
- * Constrains two variables to have the same value.
- */
-class EqualityConstraint extends BinaryConstraint {
-  EqualityConstraint(Variable v1, Variable v2, Strength strength)
-      : super(v1, v2, strength);
-
-  /// Enforce this constraint. Assume that it is satisfied.
-  void execute() {
-    output().value = input().value;
-  }
-}
-
-/**
- * A constrained variable. In addition to its value, it maintain the
- * structure of the constraint graph, the current dataflow graph, and
- * various parameters of interest to the DeltaBlue incremental
- * constraint solver.
- **/
-class Variable {
-  List<Constraint> constraints = <Constraint>[];
-  Constraint determinedBy;
-  int mark = 0;
-  Strength walkStrength = WEAKEST;
-  bool stay = true;
-  int value;
-  final String name;
-
-  Variable(this.name, this.value);
-
-  /**
-   * Add the given constraint to the set of all constraints that refer
-   * this variable.
-   */
-  void addConstraint(Constraint c) {
-    constraints.add(c);
-  }
-
-  /// Removes all traces of c from this variable.
-  void removeConstraint(Constraint c) {
-    constraints.remove(c);
-    if (determinedBy == c) determinedBy = null;
-  }
-}
-
-class Planner {
-  int currentMark = 0;
-
-  /**
-   * Attempt to satisfy the given constraint and, if successful,
-   * incrementally update the dataflow graph.  Details: If satifying
-   * the constraint is successful, it may override a weaker constraint
-   * on its output. The algorithm attempts to resatisfy that
-   * constraint using some other method. This process is repeated
-   * until either a) it reaches a variable that was not previously
-   * determined by any constraint or b) it reaches a constraint that
-   * is too weak to be satisfied using any of its methods. The
-   * variables of constraints that have been processed are marked with
-   * a unique mark value so that we know where we've been. This allows
-   * the algorithm to avoid getting into an infinite loop even if the
-   * constraint graph has an inadvertent cycle.
-   */
-  void incrementalAdd(Constraint c) {
-    int mark = newMark();
-    for (Constraint overridden = c.satisfy(mark);
-        overridden != null;
-        overridden = overridden.satisfy(mark));
-  }
-
-  /**
-   * Entry point for retracting a constraint. Remove the given
-   * constraint and incrementally update the dataflow graph.
-   * Details: Retracting the given constraint may allow some currently
-   * unsatisfiable downstream constraint to be satisfied. We therefore collect
-   * a list of unsatisfied downstream constraints and attempt to
-   * satisfy each one in turn. This list is traversed by constraint
-   * strength, strongest first, as a heuristic for avoiding
-   * unnecessarily adding and then overriding weak constraints.
-   * Assume: [c] is satisfied.
-   */
-  void incrementalRemove(Constraint c) {
-    Variable out = c.output();
-    c.markUnsatisfied();
-    c.removeFromGraph();
-    List<Constraint> unsatisfied = removePropagateFrom(out);
-    Strength strength = REQUIRED;
-    do {
-      for (int i = 0; i < unsatisfied.length; i++) {
-        Constraint u = unsatisfied[i];
-        if (u.strength == strength) incrementalAdd(u);
-      }
-      strength = strength.nextWeaker();
-    } while (strength != WEAKEST);
-  }
-
-  /// Select a previously unused mark value.
-  int newMark() => ++currentMark;
-
-  /**
-   * Extract a plan for resatisfaction starting from the given source
-   * constraints, usually a set of input constraints. This method
-   * assumes that stay optimization is desired; the plan will contain
-   * only constraints whose output variables are not stay. Constraints
-   * that do no computation, such as stay and edit constraints, are
-   * not included in the plan.
-   * Details: The outputs of a constraint are marked when it is added
-   * to the plan under construction. A constraint may be appended to
-   * the plan when all its input variables are known. A variable is
-   * known if either a) the variable is marked (indicating that has
-   * been computed by a constraint appearing earlier in the plan), b)
-   * the variable is 'stay' (i.e. it is a constant at plan execution
-   * time), or c) the variable is not determined by any
-   * constraint. The last provision is for past states of history
-   * variables, which are not stay but which are also not computed by
-   * any constraint.
-   * Assume: [sources] are all satisfied.
-   */
-  Plan makePlan(List<Constraint> sources) {
-    int mark = newMark();
-    Plan plan = new Plan();
-    List<Constraint> todo = sources;
-    while (todo.length > 0) {
-      Constraint c = todo.removeLast();
-      if (c.output().mark != mark && c.inputsKnown(mark)) {
-        plan.addConstraint(c);
-        c.output().mark = mark;
-        addConstraintsConsumingTo(c.output(), todo);
-      }
-    }
-    return plan;
-  }
-
-  /**
-   * Extract a plan for resatisfying starting from the output of the
-   * given [constraints], usually a set of input constraints.
-   */
-  Plan extractPlanFromConstraints(List<Constraint> constraints) {
-    List<Constraint> sources = <Constraint>[];
-    for (int i = 0; i < constraints.length; i++) {
-      Constraint c = constraints[i];
-      // if not in plan already and eligible for inclusion.
-      if (c.isInput() && c.isSatisfied()) sources.add(c);
-    }
-    return makePlan(sources);
-  }
-
-  /**
-   * Recompute the walkabout strengths and stay flags of all variables
-   * downstream of the given constraint and recompute the actual
-   * values of all variables whose stay flag is true. If a cycle is
-   * detected, remove the given constraint and answer
-   * false. Otherwise, answer true.
-   * Details: Cycles are detected when a marked variable is
-   * encountered downstream of the given constraint. The sender is
-   * assumed to have marked the inputs of the given constraint with
-   * the given mark. Thus, encountering a marked node downstream of
-   * the output constraint means that there is a path from the
-   * constraint's output to one of its inputs.
-   */
-  bool addPropagate(Constraint c, int mark) {
-    List<Constraint> todo = <Constraint>[c];
-    while (todo.length > 0) {
-      Constraint d = todo.removeLast();
-      if (d.output().mark == mark) {
-        incrementalRemove(c);
-        return false;
-      }
-      d.recalculate();
-      addConstraintsConsumingTo(d.output(), todo);
-    }
-    return true;
-  }
-
-  /**
-   * Update the walkabout strengths and stay flags of all variables
-   * downstream of the given constraint. Answer a collection of
-   * unsatisfied constraints sorted in order of decreasing strength.
-   */
-  List<Constraint> removePropagateFrom(Variable out) {
-    out.determinedBy = null;
-    out.walkStrength = WEAKEST;
-    out.stay = true;
-    List<Constraint> unsatisfied = <Constraint>[];
-    List<Variable> todo = <Variable>[out];
-    while (todo.length > 0) {
-      Variable v = todo.removeLast();
-      for (int i = 0; i < v.constraints.length; i++) {
-        Constraint c = v.constraints[i];
-        if (!c.isSatisfied()) unsatisfied.add(c);
-      }
-      Constraint determining = v.determinedBy;
-      for (int i = 0; i < v.constraints.length; i++) {
-        Constraint next = v.constraints[i];
-        if (next != determining && next.isSatisfied()) {
-          next.recalculate();
-          todo.add(next.output());
-        }
-      }
-    }
-    return unsatisfied;
-  }
-
-  void addConstraintsConsumingTo(Variable v, List<Constraint> coll) {
-    Constraint determining = v.determinedBy;
-    for (int i = 0; i < v.constraints.length; i++) {
-      Constraint c = v.constraints[i];
-      if (c != determining && c.isSatisfied()) coll.add(c);
-    }
-  }
-}
-
-/**
- * A Plan is an ordered list of constraints to be executed in sequence
- * to resatisfy all currently satisfiable constraints in the face of
- * one or more changing inputs.
- */
-class Plan {
-  List<Constraint> list = <Constraint>[];
-
-  void addConstraint(Constraint c) {
-    list.add(c);
-  }
-
-  int size() => list.length;
-
-  void execute() {
-    for (int i = 0; i < list.length; i++) {
-      list[i].execute();
-    }
-  }
-}
-
-/**
- * This is the standard DeltaBlue benchmark. A long chain of equality
- * constraints is constructed with a stay constraint on one end. An
- * edit constraint is then added to the opposite end and the time is
- * measured for adding and removing this constraint, and extracting
- * and executing a constraint satisfaction plan. There are two cases.
- * In case 1, the added constraint is stronger than the stay
- * constraint and values must propagate down the entire length of the
- * chain. In case 2, the added constraint is weaker than the stay
- * constraint so it cannot be accommodated. The cost in this case is,
- * of course, very low. Typical situations lie somewhere between these
- * two extremes.
- */
-void chainTest(int n) {
-  planner = new Planner();
-  Variable prev = null, first = null, last = null;
-  // Build chain of n equality constraints.
-  for (int i = 0; i <= n; i++) {
-    Variable v = new Variable("v$i", 0);
-    if (prev != null) new EqualityConstraint(prev, v, REQUIRED);
-    if (i == 0) first = v;
-    if (i == n) last = v;
-    prev = v;
-  }
-  new StayConstraint(last, STRONG_DEFAULT);
-  EditConstraint edit = new EditConstraint(first, PREFERRED);
-  Plan plan = planner.extractPlanFromConstraints(<Constraint>[edit]);
-  for (int i = 0; i < 100; i++) {
-    first.value = i;
-    plan.execute();
-    if (last.value != i) {
-      print("Chain test failed:");
-      print("Expected last value to be $i but it was ${last.value}.");
-    }
-  }
-}
-
-/**
- * This test constructs a two sets of variables related to each
- * other by a simple linear transformation (scale and offset). The
- * time is measured to change a variable on either side of the
- * mapping and to change the scale and offset factors.
- */
-void projectionTest(int n) {
-  planner = new Planner();
-  Variable scale = new Variable("scale", 10);
-  Variable offset = new Variable("offset", 1000);
-  Variable src = null, dst = null;
-
-  List<Variable> dests = <Variable>[];
-  for (int i = 0; i < n; i++) {
-    src = new Variable("src", i);
-    dst = new Variable("dst", i);
-    dests.add(dst);
-    new StayConstraint(src, NORMAL);
-    new ScaleConstraint(src, scale, offset, dst, REQUIRED);
-  }
-  change(src, 17);
-  if (dst.value != 1170) print("Projection 1 failed");
-  change(dst, 1050);
-  if (src.value != 5) print("Projection 2 failed");
-  change(scale, 5);
-  for (int i = 0; i < n - 1; i++) {
-    if (dests[i].value != i * 5 + 1000) print("Projection 3 failed");
-  }
-  change(offset, 2000);
-  for (int i = 0; i < n - 1; i++) {
-    if (dests[i].value != i * 5 + 2000) print("Projection 4 failed");
-  }
-}
-
-void change(Variable v, int newValue) {
-  EditConstraint edit = new EditConstraint(v, PREFERRED);
-  Plan plan = planner.extractPlanFromConstraints(<EditConstraint>[edit]);
-  for (int i = 0; i < 10; i++) {
-    v.value = newValue;
-    plan.execute();
-  }
-  edit.destroyConstraint();
-}
-
-Planner planner;
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
deleted file mode 100644
index 85cc345..0000000
--- a/pkg/front_end/testcases/DeltaBlue.dart.outline.expect
+++ /dev/null
@@ -1,202 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class DeltaBlue extends core::Object {
-  synthetic constructor •() → self::DeltaBlue
-    ;
-  method run() → void
-    ;
-}
-class Strength extends core::Object {
-  final field core::int value;
-  final field core::String name;
-  const constructor •(core::int value, core::String name) → self::Strength
-    ;
-  method nextWeaker() → self::Strength
-    ;
-  static method stronger(self::Strength s1, self::Strength s2) → core::bool
-    ;
-  static method weaker(self::Strength s1, self::Strength s2) → core::bool
-    ;
-  static method weakest(self::Strength s1, self::Strength s2) → self::Strength
-    ;
-  static method strongest(self::Strength s1, self::Strength s2) → self::Strength
-    ;
-}
-abstract class Constraint extends core::Object {
-  final field self::Strength strength;
-  const constructor •(self::Strength strength) → self::Constraint
-    ;
-  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
-    ;
-  method satisfy(dynamic mark) → self::Constraint
-    ;
-  method destroyConstraint() → void
-    ;
-  method isInput() → core::bool
-    ;
-}
-abstract class UnaryConstraint extends self::Constraint {
-  final field self::Variable myOutput;
-  field core::bool satisfied;
-  constructor •(self::Variable myOutput, self::Strength strength) → self::UnaryConstraint
-    ;
-  method addToGraph() → void
-    ;
-  method chooseMethod(core::int mark) → void
-    ;
-  method isSatisfied() → core::bool
-    ;
-  method markInputs(core::int mark) → void
-    ;
-  method output() → self::Variable
-    ;
-  method recalculate() → void
-    ;
-  method markUnsatisfied() → void
-    ;
-  method inputsKnown(core::int mark) → core::bool
-    ;
-  method removeFromGraph() → void
-    ;
-}
-class StayConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → self::StayConstraint
-    ;
-  method execute() → void
-    ;
-}
-class EditConstraint extends self::UnaryConstraint {
-  constructor •(self::Variable v, self::Strength str) → self::EditConstraint
-    ;
-  method isInput() → core::bool
-    ;
-  method execute() → void
-    ;
-}
-abstract class BinaryConstraint extends self::Constraint {
-  field self::Variable v1;
-  field self::Variable v2;
-  field core::int direction;
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::BinaryConstraint
-    ;
-  method chooseMethod(core::int mark) → void
-    ;
-  method addToGraph() → void
-    ;
-  method isSatisfied() → core::bool
-    ;
-  method markInputs(core::int mark) → void
-    ;
-  method input() → self::Variable
-    ;
-  method output() → self::Variable
-    ;
-  method recalculate() → void
-    ;
-  method markUnsatisfied() → void
-    ;
-  method inputsKnown(core::int mark) → core::bool
-    ;
-  method removeFromGraph() → void
-    ;
-}
-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
-    ;
-  method addToGraph() → void
-    ;
-  method removeFromGraph() → void
-    ;
-  method markInputs(core::int mark) → void
-    ;
-  method execute() → void
-    ;
-  method recalculate() → void
-    ;
-}
-class EqualityConstraint extends self::BinaryConstraint {
-  constructor •(self::Variable v1, self::Variable v2, self::Strength strength) → self::EqualityConstraint
-    ;
-  method execute() → void
-    ;
-}
-class Variable extends core::Object {
-  field core::List<self::Constraint> constraints;
-  field self::Constraint determinedBy;
-  field core::int mark;
-  field self::Strength walkStrength;
-  field core::bool stay;
-  field core::int value;
-  final field core::String name;
-  constructor •(core::String name, core::int value) → self::Variable
-    ;
-  method addConstraint(self::Constraint c) → void
-    ;
-  method removeConstraint(self::Constraint c) → void
-    ;
-}
-class Planner extends core::Object {
-  field core::int currentMark;
-  synthetic constructor •() → self::Planner
-    ;
-  method incrementalAdd(self::Constraint c) → void
-    ;
-  method incrementalRemove(self::Constraint c) → void
-    ;
-  method newMark() → core::int
-    ;
-  method makePlan(core::List<self::Constraint> sources) → self::Plan
-    ;
-  method extractPlanFromConstraints(core::List<self::Constraint> constraints) → self::Plan
-    ;
-  method addPropagate(self::Constraint c, core::int mark) → core::bool
-    ;
-  method removePropagateFrom(self::Variable out) → core::List<self::Constraint>
-    ;
-  method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void
-    ;
-}
-class Plan extends core::Object {
-  field core::List<self::Constraint> list;
-  synthetic constructor •() → self::Plan
-    ;
-  method addConstraint(self::Constraint c) → void
-    ;
-  method size() → core::int
-    ;
-  method execute() → void
-    ;
-}
-static const field dynamic REQUIRED = const self::Strength::•(0, "required");
-static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
-static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
-static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
-static const field dynamic NORMAL = const self::Strength::•(4, "normal");
-static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
-static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
-static const field core::int NONE = 1;
-static const field core::int FORWARD = 2;
-static const field core::int BACKWARD = 0;
-static field self::Planner planner;
-static method main() → dynamic
-  ;
-static method chainTest(core::int n) → void
-  ;
-static method projectionTest(core::int n) → void
-  ;
-static method change(self::Variable v, core::int newValue) → void
-  ;
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.strong.expect b/pkg/front_end/testcases/DeltaBlue.dart.strong.expect
deleted file mode 100644
index 78e2440..0000000
--- a/pkg/front_end/testcases/DeltaBlue.dart.strong.expect
+++ /dev/null
@@ -1,450 +0,0 @@
-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);
-  }
-}
-class Strength extends core::Object {
-  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 const <self::Strength>[self::STRONG_PREFERRED, self::PREFERRED, self::STRONG_DEFAULT, self::NORMAL, self::WEAK_DEFAULT, self::WEAKEST].{core::List::[]}(this.{self::Strength::value});
-  static method stronger(self::Strength s1, self::Strength s2) → core::bool {
-    return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
-  }
-  static method weaker(self::Strength s1, self::Strength s2) → core::bool {
-    return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
-  }
-  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 class Constraint extends core::Object {
-  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}();
-    self::planner.{self::Planner::incrementalAdd}(this);
-  }
-  method satisfy(dynamic mark) → self::Constraint {
-    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int);
-    if(!this.{self::Constraint::isSatisfied}()) {
-      if(this.{self::Constraint::strength}.{core::Object::==}(self::REQUIRED)) {
-        core::print("Could not satisfy a required constraint!");
-      }
-      return null;
-    }
-    this.{self::Constraint::markInputs}(mark as{TypeError} core::int);
-    self::Variable out = this.{self::Constraint::output}();
-    self::Constraint overridden = out.{self::Variable::determinedBy};
-    if(!overridden.{core::Object::==}(null))
-      overridden.{self::Constraint::markUnsatisfied}();
-    out.{self::Variable::determinedBy} = this;
-    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int))
-      core::print("Cycle encountered");
-    out.{self::Variable::mark} = mark as{TypeError} core::int;
-    return overridden;
-  }
-  method destroyConstraint() → void {
-    if(this.{self::Constraint::isSatisfied}())
-      self::planner.{self::Planner::incrementalRemove}(this);
-    this.{self::Constraint::removeFromGraph}();
-  }
-  method isInput() → core::bool
-    return false;
-}
-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}();
-  }
-  method addToGraph() → void {
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
-    this.{self::UnaryConstraint::satisfied} = false;
-  }
-  method chooseMethod(core::int mark) → void {
-    this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
-  }
-  method isSatisfied() → core::bool
-    return this.{self::UnaryConstraint::satisfied};
-  method markInputs(core::int mark) → void {}
-  method output() → self::Variable
-    return this.{self::UnaryConstraint::myOutput};
-  method recalculate() → void {
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
-    if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
-      this.{self::Constraint::execute}();
-  }
-  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}.{core::Object::==}(null))
-      this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
-    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 = self::NONE;
-  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}();
-  }
-  method chooseMethod(core::int mark) → void {
-    if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::NONE;
-    }
-    if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
-    }
-    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
-    }
-    else {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::BACKWARD;
-    }
-  }
-  method addToGraph() → void {
-    this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
-    this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-  method isSatisfied() → core::bool
-    return !this.{self::BinaryConstraint::direction}.{core::num::==}(self::NONE);
-  method markInputs(core::int mark) → void {
-    this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
-  }
-  method input() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
-  method output() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
-  method recalculate() → void {
-    self::Variable ihn = this.{self::BinaryConstraint::input}();
-    self::Variable out = this.{self::BinaryConstraint::output}();
-    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
-    out.{self::Variable::stay} = ihn.{self::Variable::stay};
-    if(out.{self::Variable::stay})
-      this.{self::Constraint::execute}();
-  }
-  method markUnsatisfied() → void {
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-  method inputsKnown(core::int mark) → core::bool {
-    self::Variable i = this.{self::BinaryConstraint::input}();
-    return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
-  }
-  method removeFromGraph() → void {
-    if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
-      this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
-    if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
-      this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-}
-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::addConstraint}(this);
-    this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
-  }
-  method removeFromGraph() → void {
-    super.{self::BinaryConstraint::removeFromGraph}();
-    if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
-      this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
-    if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
-      this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
-  }
-  method markInputs(core::int mark) → void {
-    super.{self::BinaryConstraint::markInputs}(mark);
-    this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
-  }
-  method execute() → void {
-    if(this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD)) {
-      this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
-    }
-    else {
-      this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
-    }
-  }
-  method recalculate() → void {
-    self::Variable ihn = this.{self::BinaryConstraint::input}();
-    self::Variable out = this.{self::BinaryConstraint::output}();
-    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
-    out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
-    if(out.{self::Variable::stay})
-      this.{self::ScaleConstraint::execute}();
-  }
-}
-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::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
-  }
-}
-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 = self::WEAKEST;
-  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::add}(c);
-  }
-  method removeConstraint(self::Constraint c) → void {
-    this.{self::Variable::constraints}.{core::List::remove}(c);
-    if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
-      this.{self::Variable::determinedBy} = null;
-  }
-}
-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}();
-    for (self::Constraint overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
-      ;
-  }
-  method incrementalRemove(self::Constraint c) → void {
-    self::Variable out = c.{self::Constraint::output}();
-    c.{self::Constraint::markUnsatisfied}();
-    c.{self::Constraint::removeFromGraph}();
-    core::List<self::Constraint> unsatisfied = this.{self::Planner::removePropagateFrom}(out);
-    self::Strength strength = self::REQUIRED;
-    do {
-      for (core::int i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint u = unsatisfied.{core::List::[]}(i);
-        if(u.{self::Constraint::strength}.{core::Object::==}(strength))
-          this.{self::Planner::incrementalAdd}(u);
-      }
-      strength = strength.{self::Strength::nextWeaker}();
-    }
-    while (!strength.{core::Object::==}(self::WEAKEST))
-  }
-  method newMark() → core::int
-    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
-  method makePlan(core::List<self::Constraint> sources) → self::Plan {
-    core::int mark = this.{self::Planner::newMark}();
-    self::Plan plan = new self::Plan::•();
-    core::List<self::Constraint> todo = sources;
-    while (todo.{core::List::length}.{core::num::>}(0)) {
-      self::Constraint c = todo.{core::List::removeLast}();
-      if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
-        plan.{self::Plan::addConstraint}(c);
-        c.{self::Constraint::output}().{self::Variable::mark} = mark;
-        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
-      }
-    }
-    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}); i = i.{core::num::+}(1)) {
-      self::Constraint c = constraints.{core::List::[]}(i);
-      if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
-        sources.{core::List::add}(c);
-    }
-    return this.{self::Planner::makePlan}(sources);
-  }
-  method addPropagate(self::Constraint c, core::int mark) → core::bool {
-    core::List<self::Constraint> todo = <self::Constraint>[c];
-    while (todo.{core::List::length}.{core::num::>}(0)) {
-      self::Constraint d = todo.{core::List::removeLast}();
-      if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
-        this.{self::Planner::incrementalRemove}(c);
-        return false;
-      }
-      d.{self::Constraint::recalculate}();
-      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
-    }
-    return true;
-  }
-  method removePropagateFrom(self::Variable out) → core::List<self::Constraint> {
-    out.{self::Variable::determinedBy} = null;
-    out.{self::Variable::walkStrength} = self::WEAKEST;
-    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::num::>}(0)) {
-      self::Variable v = todo.{core::List::removeLast}();
-      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
-        if(!c.{self::Constraint::isSatisfied}())
-          unsatisfied.{core::List::add}(c);
-      }
-      self::Constraint determining = v.{self::Variable::determinedBy};
-      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint next = v.{self::Variable::constraints}.{core::List::[]}(i);
-        if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
-          next.{self::Constraint::recalculate}();
-          todo.{core::List::add}(next.{self::Constraint::output}());
-        }
-      }
-    }
-    return unsatisfied;
-  }
-  method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void {
-    self::Constraint determining = v.{self::Variable::determinedBy};
-    for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-      self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
-      if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
-        coll.{core::List::add}(c);
-    }
-  }
-}
-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::add}(c);
-  }
-  method size() → core::int
-    return this.{self::Plan::list}.{core::List::length};
-  method execute() → void {
-    for (core::int i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
-      this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
-    }
-  }
-}
-static const field self::Strength REQUIRED = const self::Strength::•(0, "required");
-static const field self::Strength STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
-static const field self::Strength PREFERRED = const self::Strength::•(2, "preferred");
-static const field self::Strength STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
-static const field self::Strength NORMAL = const self::Strength::•(4, "normal");
-static const field self::Strength WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
-static const field self::Strength WEAKEST = const self::Strength::•(6, "weakest");
-static const field core::int NONE = 1;
-static const field core::int FORWARD = 2;
-static const field core::int BACKWARD = 0;
-static field self::Planner planner;
-static method main() → dynamic {
-  new self::DeltaBlue::•().{self::DeltaBlue::run}();
-}
-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); i = i.{core::num::+}(1)) {
-    self::Variable v = new self::Variable::•("v${i}", 0);
-    if(!prev.{core::Object::==}(null))
-      new self::EqualityConstraint::•(prev, v, self::REQUIRED);
-    if(i.{core::num::==}(0))
-      first = v;
-    if(i.{core::num::==}(n))
-      last = v;
-    prev = v;
-  }
-  new self::StayConstraint::•(last, self::STRONG_DEFAULT);
-  self::EditConstraint edit = new self::EditConstraint::•(first, self::PREFERRED);
-  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint>[edit]);
-  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
-    first.{self::Variable::value} = i;
-    plan.{self::Plan::execute}();
-    if(!last.{self::Variable::value}.{core::num::==}(i)) {
-      core::print("Chain test failed:");
-      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
-    }
-  }
-}
-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); i = i.{core::num::+}(1)) {
-    src = new self::Variable::•("src", i);
-    dst = new self::Variable::•("dst", i);
-    dests.{core::List::add}(dst);
-    new self::StayConstraint::•(src, self::NORMAL);
-    new self::ScaleConstraint::•(src, scale, offset, dst, self::REQUIRED);
-  }
-  self::change(src, 17);
-  if(!dst.{self::Variable::value}.{core::num::==}(1170))
-    core::print("Projection 1 failed");
-  self::change(dst, 1050);
-  if(!src.{self::Variable::value}.{core::num::==}(5))
-    core::print("Projection 2 failed");
-  self::change(scale, 5);
-  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
-    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
-      core::print("Projection 3 failed");
-  }
-  self::change(offset, 2000);
-  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
-    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
-      core::print("Projection 4 failed");
-  }
-}
-static method change(self::Variable v, core::int newValue) → void {
-  self::EditConstraint edit = new self::EditConstraint::•(v, self::PREFERRED);
-  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint>[edit]);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
-    v.{self::Variable::value} = newValue;
-    plan.{self::Plan::execute}();
-  }
-  edit.{self::Constraint::destroyConstraint}();
-}
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect b/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect
deleted file mode 100644
index 78e2440..0000000
--- a/pkg/front_end/testcases/DeltaBlue.dart.strong.transformed.expect
+++ /dev/null
@@ -1,450 +0,0 @@
-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);
-  }
-}
-class Strength extends core::Object {
-  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 const <self::Strength>[self::STRONG_PREFERRED, self::PREFERRED, self::STRONG_DEFAULT, self::NORMAL, self::WEAK_DEFAULT, self::WEAKEST].{core::List::[]}(this.{self::Strength::value});
-  static method stronger(self::Strength s1, self::Strength s2) → core::bool {
-    return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
-  }
-  static method weaker(self::Strength s1, self::Strength s2) → core::bool {
-    return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
-  }
-  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 class Constraint extends core::Object {
-  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}();
-    self::planner.{self::Planner::incrementalAdd}(this);
-  }
-  method satisfy(dynamic mark) → self::Constraint {
-    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int);
-    if(!this.{self::Constraint::isSatisfied}()) {
-      if(this.{self::Constraint::strength}.{core::Object::==}(self::REQUIRED)) {
-        core::print("Could not satisfy a required constraint!");
-      }
-      return null;
-    }
-    this.{self::Constraint::markInputs}(mark as{TypeError} core::int);
-    self::Variable out = this.{self::Constraint::output}();
-    self::Constraint overridden = out.{self::Variable::determinedBy};
-    if(!overridden.{core::Object::==}(null))
-      overridden.{self::Constraint::markUnsatisfied}();
-    out.{self::Variable::determinedBy} = this;
-    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int))
-      core::print("Cycle encountered");
-    out.{self::Variable::mark} = mark as{TypeError} core::int;
-    return overridden;
-  }
-  method destroyConstraint() → void {
-    if(this.{self::Constraint::isSatisfied}())
-      self::planner.{self::Planner::incrementalRemove}(this);
-    this.{self::Constraint::removeFromGraph}();
-  }
-  method isInput() → core::bool
-    return false;
-}
-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}();
-  }
-  method addToGraph() → void {
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
-    this.{self::UnaryConstraint::satisfied} = false;
-  }
-  method chooseMethod(core::int mark) → void {
-    this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
-  }
-  method isSatisfied() → core::bool
-    return this.{self::UnaryConstraint::satisfied};
-  method markInputs(core::int mark) → void {}
-  method output() → self::Variable
-    return this.{self::UnaryConstraint::myOutput};
-  method recalculate() → void {
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
-    this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
-    if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
-      this.{self::Constraint::execute}();
-  }
-  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}.{core::Object::==}(null))
-      this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
-    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 = self::NONE;
-  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}();
-  }
-  method chooseMethod(core::int mark) → void {
-    if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::NONE;
-    }
-    if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
-      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
-    }
-    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int} self::BACKWARD : self::NONE;
-    }
-    else {
-      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int} self::FORWARD : self::BACKWARD;
-    }
-  }
-  method addToGraph() → void {
-    this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
-    this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-  method isSatisfied() → core::bool
-    return !this.{self::BinaryConstraint::direction}.{core::num::==}(self::NONE);
-  method markInputs(core::int mark) → void {
-    this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
-  }
-  method input() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
-  method output() → self::Variable
-    return this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD) ?{self::Variable} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
-  method recalculate() → void {
-    self::Variable ihn = this.{self::BinaryConstraint::input}();
-    self::Variable out = this.{self::BinaryConstraint::output}();
-    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
-    out.{self::Variable::stay} = ihn.{self::Variable::stay};
-    if(out.{self::Variable::stay})
-      this.{self::Constraint::execute}();
-  }
-  method markUnsatisfied() → void {
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-  method inputsKnown(core::int mark) → core::bool {
-    self::Variable i = this.{self::BinaryConstraint::input}();
-    return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
-  }
-  method removeFromGraph() → void {
-    if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
-      this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
-    if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
-      this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
-    this.{self::BinaryConstraint::direction} = self::NONE;
-  }
-}
-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::addConstraint}(this);
-    this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
-  }
-  method removeFromGraph() → void {
-    super.{self::BinaryConstraint::removeFromGraph}();
-    if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
-      this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
-    if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
-      this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
-  }
-  method markInputs(core::int mark) → void {
-    super.{self::BinaryConstraint::markInputs}(mark);
-    this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
-  }
-  method execute() → void {
-    if(this.{self::BinaryConstraint::direction}.{core::num::==}(self::FORWARD)) {
-      this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
-    }
-    else {
-      this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
-    }
-  }
-  method recalculate() → void {
-    self::Variable ihn = this.{self::BinaryConstraint::input}();
-    self::Variable out = this.{self::BinaryConstraint::output}();
-    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
-    out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
-    if(out.{self::Variable::stay})
-      this.{self::ScaleConstraint::execute}();
-  }
-}
-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::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
-  }
-}
-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 = self::WEAKEST;
-  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::add}(c);
-  }
-  method removeConstraint(self::Constraint c) → void {
-    this.{self::Variable::constraints}.{core::List::remove}(c);
-    if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
-      this.{self::Variable::determinedBy} = null;
-  }
-}
-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}();
-    for (self::Constraint overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
-      ;
-  }
-  method incrementalRemove(self::Constraint c) → void {
-    self::Variable out = c.{self::Constraint::output}();
-    c.{self::Constraint::markUnsatisfied}();
-    c.{self::Constraint::removeFromGraph}();
-    core::List<self::Constraint> unsatisfied = this.{self::Planner::removePropagateFrom}(out);
-    self::Strength strength = self::REQUIRED;
-    do {
-      for (core::int i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint u = unsatisfied.{core::List::[]}(i);
-        if(u.{self::Constraint::strength}.{core::Object::==}(strength))
-          this.{self::Planner::incrementalAdd}(u);
-      }
-      strength = strength.{self::Strength::nextWeaker}();
-    }
-    while (!strength.{core::Object::==}(self::WEAKEST))
-  }
-  method newMark() → core::int
-    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
-  method makePlan(core::List<self::Constraint> sources) → self::Plan {
-    core::int mark = this.{self::Planner::newMark}();
-    self::Plan plan = new self::Plan::•();
-    core::List<self::Constraint> todo = sources;
-    while (todo.{core::List::length}.{core::num::>}(0)) {
-      self::Constraint c = todo.{core::List::removeLast}();
-      if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
-        plan.{self::Plan::addConstraint}(c);
-        c.{self::Constraint::output}().{self::Variable::mark} = mark;
-        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
-      }
-    }
-    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}); i = i.{core::num::+}(1)) {
-      self::Constraint c = constraints.{core::List::[]}(i);
-      if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
-        sources.{core::List::add}(c);
-    }
-    return this.{self::Planner::makePlan}(sources);
-  }
-  method addPropagate(self::Constraint c, core::int mark) → core::bool {
-    core::List<self::Constraint> todo = <self::Constraint>[c];
-    while (todo.{core::List::length}.{core::num::>}(0)) {
-      self::Constraint d = todo.{core::List::removeLast}();
-      if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
-        this.{self::Planner::incrementalRemove}(c);
-        return false;
-      }
-      d.{self::Constraint::recalculate}();
-      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
-    }
-    return true;
-  }
-  method removePropagateFrom(self::Variable out) → core::List<self::Constraint> {
-    out.{self::Variable::determinedBy} = null;
-    out.{self::Variable::walkStrength} = self::WEAKEST;
-    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::num::>}(0)) {
-      self::Variable v = todo.{core::List::removeLast}();
-      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
-        if(!c.{self::Constraint::isSatisfied}())
-          unsatisfied.{core::List::add}(c);
-      }
-      self::Constraint determining = v.{self::Variable::determinedBy};
-      for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-        self::Constraint next = v.{self::Variable::constraints}.{core::List::[]}(i);
-        if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
-          next.{self::Constraint::recalculate}();
-          todo.{core::List::add}(next.{self::Constraint::output}());
-        }
-      }
-    }
-    return unsatisfied;
-  }
-  method addConstraintsConsumingTo(self::Variable v, core::List<self::Constraint> coll) → void {
-    self::Constraint determining = v.{self::Variable::determinedBy};
-    for (core::int i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
-      self::Constraint c = v.{self::Variable::constraints}.{core::List::[]}(i);
-      if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
-        coll.{core::List::add}(c);
-    }
-  }
-}
-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::add}(c);
-  }
-  method size() → core::int
-    return this.{self::Plan::list}.{core::List::length};
-  method execute() → void {
-    for (core::int i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
-      this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
-    }
-  }
-}
-static const field self::Strength REQUIRED = const self::Strength::•(0, "required");
-static const field self::Strength STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
-static const field self::Strength PREFERRED = const self::Strength::•(2, "preferred");
-static const field self::Strength STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
-static const field self::Strength NORMAL = const self::Strength::•(4, "normal");
-static const field self::Strength WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
-static const field self::Strength WEAKEST = const self::Strength::•(6, "weakest");
-static const field core::int NONE = 1;
-static const field core::int FORWARD = 2;
-static const field core::int BACKWARD = 0;
-static field self::Planner planner;
-static method main() → dynamic {
-  new self::DeltaBlue::•().{self::DeltaBlue::run}();
-}
-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); i = i.{core::num::+}(1)) {
-    self::Variable v = new self::Variable::•("v${i}", 0);
-    if(!prev.{core::Object::==}(null))
-      new self::EqualityConstraint::•(prev, v, self::REQUIRED);
-    if(i.{core::num::==}(0))
-      first = v;
-    if(i.{core::num::==}(n))
-      last = v;
-    prev = v;
-  }
-  new self::StayConstraint::•(last, self::STRONG_DEFAULT);
-  self::EditConstraint edit = new self::EditConstraint::•(first, self::PREFERRED);
-  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::Constraint>[edit]);
-  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
-    first.{self::Variable::value} = i;
-    plan.{self::Plan::execute}();
-    if(!last.{self::Variable::value}.{core::num::==}(i)) {
-      core::print("Chain test failed:");
-      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
-    }
-  }
-}
-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); i = i.{core::num::+}(1)) {
-    src = new self::Variable::•("src", i);
-    dst = new self::Variable::•("dst", i);
-    dests.{core::List::add}(dst);
-    new self::StayConstraint::•(src, self::NORMAL);
-    new self::ScaleConstraint::•(src, scale, offset, dst, self::REQUIRED);
-  }
-  self::change(src, 17);
-  if(!dst.{self::Variable::value}.{core::num::==}(1170))
-    core::print("Projection 1 failed");
-  self::change(dst, 1050);
-  if(!src.{self::Variable::value}.{core::num::==}(5))
-    core::print("Projection 2 failed");
-  self::change(scale, 5);
-  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
-    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
-      core::print("Projection 3 failed");
-  }
-  self::change(offset, 2000);
-  for (core::int i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
-    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
-      core::print("Projection 4 failed");
-  }
-}
-static method change(self::Variable v, core::int newValue) → void {
-  self::EditConstraint edit = new self::EditConstraint::•(v, self::PREFERRED);
-  self::Plan plan = self::planner.{self::Planner::extractPlanFromConstraints}(<self::EditConstraint>[edit]);
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
-    v.{self::Variable::value} = newValue;
-    plan.{self::Plan::execute}();
-  }
-  edit.{self::Constraint::destroyConstraint}();
-}
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect b/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect
deleted file mode 100644
index d99f933..0000000
--- a/pkg/front_end/testcases/DeltaBlue.dart.type_promotion.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-pkg/front_end/testcases/DeltaBlue.dart:458:20: Context: Write to overridden@13138
-        overridden = overridden.satisfy(mark));
-                   ^
-pkg/front_end/testcases/DeltaBlue.dart:479:48: Context: Write to i@14064
-      for (int i = 0; i < unsatisfied.length; i++) {
-                                               ^^
-pkg/front_end/testcases/DeltaBlue.dart:483:16: Context: Write to strength@14019
-      strength = strength.nextWeaker();
-               ^
-pkg/front_end/testcases/DeltaBlue.dart:530:46: Context: Write to i@16107
-    for (int i = 0; i < constraints.length; i++) {
-                                             ^^
-pkg/front_end/testcases/DeltaBlue.dart:578:50: Context: Write to i@17907
-      for (int i = 0; i < v.constraints.length; i++) {
-                                                 ^^
-pkg/front_end/testcases/DeltaBlue.dart:583:50: Context: Write to i@17907
-      for (int i = 0; i < v.constraints.length; i++) {
-                                                 ^^
-pkg/front_end/testcases/DeltaBlue.dart:596:48: Context: Write to i@18495
-    for (int i = 0; i < v.constraints.length; i++) {
-                                               ^^
-pkg/front_end/testcases/DeltaBlue.dart:618:39: Context: Write to i@19004
-    for (int i = 0; i < list.length; i++) {
-                                      ^^
-pkg/front_end/testcases/DeltaBlue.dart:641:28: Context: Write to i@19938
-  for (int i = 0; i <= n; i++) {
-                           ^^
-pkg/front_end/testcases/DeltaBlue.dart:644:23: Context: Write to first@19856
-    if (i == 0) first = v;
-                      ^
-pkg/front_end/testcases/DeltaBlue.dart:645:22: Context: Write to last@19870
-    if (i == n) last = v;
-                     ^
-pkg/front_end/testcases/DeltaBlue.dart:646:10: Context: Write to prev@19843
-    prev = v;
-         ^
-pkg/front_end/testcases/DeltaBlue.dart:651:29: Context: Write to i@19938
-  for (int i = 0; i < 100; i++) {
-                            ^^
-pkg/front_end/testcases/DeltaBlue.dart:674:27: Context: Write to i@21029
-  for (int i = 0; i < n; i++) {
-                          ^^
-pkg/front_end/testcases/DeltaBlue.dart:675:9: Context: Write to src@20954
-    src = new Variable("src", i);
-        ^
-pkg/front_end/testcases/DeltaBlue.dart:676:9: Context: Write to dst@20966
-    dst = new Variable("dst", i);
-        ^
-pkg/front_end/testcases/DeltaBlue.dart:686:31: Context: Write to i@21029
-  for (int i = 0; i < n - 1; i++) {
-                              ^^
-pkg/front_end/testcases/DeltaBlue.dart:690:31: Context: Write to i@21029
-  for (int i = 0; i < n - 1; i++) {
-                              ^^
-pkg/front_end/testcases/DeltaBlue.dart:698:28: Context: Write to i@21836
-  for (int i = 0; i < 10; i++) {
-                           ^^
diff --git a/pkg/front_end/testcases/abstract_members.dart.legacy.expect b/pkg/front_end/testcases/abstract_members.dart.legacy.expect
deleted file mode 100644
index 0322fcb..0000000
--- a/pkg/front_end/testcases/abstract_members.dart.legacy.expect
+++ /dev/null
@@ -1,296 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
-// abstract class A implements Interface1, Interface2, Interface3 {
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:33: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:54: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
-//   void set property2(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:64:16: Error: Can't inherit members that conflict with each other.
-// abstract class D extends C implements Interface2 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is one inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:59:8: Context: This is the other inherited member.
-//   void interfaceMethod1(_) {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:72:16: Error: Can't inherit members that conflict with each other.
-// abstract class F extends E implements Interface1 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:67:12: Context: This is the other inherited member.
-//   void set interfaceMethod1(_) {}
-//            ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:84:16: Error: Can't inherit members that conflict with each other.
-// abstract class H extends G implements Foo {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:75:8: Context: This is one inherited member.
-//   void foo() {}
-//        ^^^
-// pkg/front_end/testcases/abstract_members.dart:79:14: Context: This is the other inherited member.
-//   Object get foo => null;
-//              ^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:96:16: Error: Can't inherit members that conflict with each other.
-// abstract class J extends I implements Bar {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:87:14: Context: This is one inherited member.
-//   Object get foo => null;
-//              ^^^
-// pkg/front_end/testcases/abstract_members.dart:91: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 {}
-}
-class Interface2 extends core::Object {
-  field dynamic interfaceMethod1 = null;
-  synthetic constructor •() → self::Interface2
-    : super core::Object::•()
-    ;
-  method interfaceMethod2() → void {}
-}
-class Interface3 extends core::Object {
-  synthetic constructor •() → self::Interface3
-    : super core::Object::•()
-    ;
-  method interfaceMethod3() → void {}
-}
-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 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 {}
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method abstractMethod() → dynamic
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder method interfaceMethod1() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method interfaceMethod3() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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;
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method interfaceMethod1(dynamic _) → void {}
-}
-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 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 {}
-}
-class G extends core::Object {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  get foo() → core::Object
-    return null;
-}
-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;
-}
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  method foo() → core::Object {}
-}
-abstract class J extends self::I implements self::Bar {
-  synthetic constructor •() → self::J
-    : super self::I::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect b/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect
deleted file mode 100644
index 0322fcb..0000000
--- a/pkg/front_end/testcases/abstract_members.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,296 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
-// abstract class A implements Interface1, Interface2, Interface3 {
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:33: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:54: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
-//   void set property2(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:64:16: Error: Can't inherit members that conflict with each other.
-// abstract class D extends C implements Interface2 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is one inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:59:8: Context: This is the other inherited member.
-//   void interfaceMethod1(_) {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:72:16: Error: Can't inherit members that conflict with each other.
-// abstract class F extends E implements Interface1 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:67:12: Context: This is the other inherited member.
-//   void set interfaceMethod1(_) {}
-//            ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:84:16: Error: Can't inherit members that conflict with each other.
-// abstract class H extends G implements Foo {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:75:8: Context: This is one inherited member.
-//   void foo() {}
-//        ^^^
-// pkg/front_end/testcases/abstract_members.dart:79:14: Context: This is the other inherited member.
-//   Object get foo => null;
-//              ^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:96:16: Error: Can't inherit members that conflict with each other.
-// abstract class J extends I implements Bar {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:87:14: Context: This is one inherited member.
-//   Object get foo => null;
-//              ^^^
-// pkg/front_end/testcases/abstract_members.dart:91: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 {}
-}
-class Interface2 extends core::Object {
-  field dynamic interfaceMethod1 = null;
-  synthetic constructor •() → self::Interface2
-    : super core::Object::•()
-    ;
-  method interfaceMethod2() → void {}
-}
-class Interface3 extends core::Object {
-  synthetic constructor •() → self::Interface3
-    : super core::Object::•()
-    ;
-  method interfaceMethod3() → void {}
-}
-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 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 {}
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method abstractMethod() → dynamic
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder method interfaceMethod1() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method interfaceMethod3() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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;
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method interfaceMethod1(dynamic _) → void {}
-}
-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 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 {}
-}
-class G extends core::Object {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  get foo() → core::Object
-    return null;
-}
-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;
-}
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  method foo() → core::Object {}
-}
-abstract class J extends self::I implements self::Bar {
-  synthetic constructor •() → self::J
-    : super self::I::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_members.dart.outline.expect b/pkg/front_end/testcases/abstract_members.dart.outline.expect
deleted file mode 100644
index c54c9fb..0000000
--- a/pkg/front_end/testcases/abstract_members.dart.outline.expect
+++ /dev/null
@@ -1,292 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
-// abstract class A implements Interface1, Interface2, Interface3 {
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:33: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:54: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
-//   void set property2(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:64:16: Error: Can't inherit members that conflict with each other.
-// abstract class D extends C implements Interface2 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is one inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:59:8: Context: This is the other inherited member.
-//   void interfaceMethod1(_) {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:72:16: Error: Can't inherit members that conflict with each other.
-// abstract class F extends E implements Interface1 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:67:12: Context: This is the other inherited member.
-//   void set interfaceMethod1(_) {}
-//            ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:84:16: Error: Can't inherit members that conflict with each other.
-// abstract class H extends G implements Foo {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:75:8: Context: This is one inherited member.
-//   void foo() {}
-//        ^^^
-// pkg/front_end/testcases/abstract_members.dart:79:14: Context: This is the other inherited member.
-//   Object get foo => null;
-//              ^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:96:16: Error: Can't inherit members that conflict with each other.
-// abstract class J extends I implements Bar {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:87:14: Context: This is one inherited member.
-//   Object get foo => null;
-//              ^^^
-// pkg/front_end/testcases/abstract_members.dart:91: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
-    ;
-  method interfaceMethod1() → void
-    ;
-}
-class Interface2 extends core::Object {
-  field dynamic interfaceMethod1;
-  synthetic constructor •() → self::Interface2
-    ;
-  method interfaceMethod2() → void
-    ;
-}
-class Interface3 extends core::Object {
-  synthetic constructor •() → self::Interface3
-    ;
-  method interfaceMethod3() → void
-    ;
-}
-abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
-  synthetic constructor •() → self::A
-    ;
-  method aMethod() → dynamic
-    ;
-  abstract method abstractMethod() → dynamic;
-  abstract set property1(dynamic _) → void;
-  abstract set property2(dynamic _) → void;
-  abstract set property3(dynamic _) → void;
-}
-abstract class B extends self::A {
-  final field dynamic property1;
-  synthetic constructor •() → self::B
-    ;
-  method aMethod() → dynamic
-    ;
-  method bMethod() → dynamic
-    ;
-}
-class MyClass extends self::B {
-  field dynamic property2;
-  synthetic constructor •() → self::MyClass
-    ;
-  method aaMethod() → dynamic
-    ;
-  method aMethod() → dynamic
-    ;
-  method bMethod() → dynamic
-    ;
-  method cMethod() → dynamic
-    ;
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class MyMock1 extends self::B {
-  synthetic constructor •() → self::MyMock1
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    ;
-  no-such-method-forwarder method interfaceMethod2() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method abstractMethod() → dynamic
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder method interfaceMethod1() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method interfaceMethod3() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class MyMock2 extends self::MyMock1 {
-  synthetic constructor •() → self::MyMock2
-    ;
-  abstract method noSuchMethod(core::Invocation _) → dynamic;
-}
-class MyMock3 extends self::B {
-  synthetic constructor •() → self::MyMock3
-    ;
-  abstract method noSuchMethod(core::Invocation _) → dynamic;
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method interfaceMethod1(dynamic _) → void
-    ;
-}
-abstract class D extends self::C implements self::Interface2 {
-  synthetic constructor •() → self::D
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    ;
-  set interfaceMethod1(dynamic _) → void
-    ;
-}
-abstract class F extends self::E implements self::Interface1 {
-  synthetic constructor •() → self::F
-    ;
-}
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-  method foo() → void
-    ;
-}
-class G extends core::Object {
-  synthetic constructor •() → self::G
-    ;
-  get foo() → core::Object
-    ;
-}
-abstract class H extends self::G implements self::Foo {
-  synthetic constructor •() → self::H
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    ;
-  get foo() → core::Object
-    ;
-}
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    ;
-  method foo() → core::Object
-    ;
-}
-abstract class J extends self::I implements self::Bar {
-  synthetic constructor •() → self::J
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/abstract_members.dart.strong.expect b/pkg/front_end/testcases/abstract_members.dart.strong.expect
deleted file mode 100644
index 0322fcb..0000000
--- a/pkg/front_end/testcases/abstract_members.dart.strong.expect
+++ /dev/null
@@ -1,296 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/abstract_members.dart:19:16: Error: Can't inherit members that conflict with each other.
-// abstract class A implements Interface1, Interface2, Interface3 {
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is the other inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:33: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:54: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/abstract_members.dart:21:3: Context: 'A.abstractMethod' is defined here.
-//   abstractMethod();
-//   ^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
-//   void set property1(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
-//   void set property2(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
-//   void set property3(_);
-//            ^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
-//   void interfaceMethod2() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
-//   void interfaceMethod3() {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:64:16: Error: Can't inherit members that conflict with each other.
-// abstract class D extends C implements Interface2 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:12:7: Context: This is one inherited member.
-//   var interfaceMethod1;
-//       ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:59:8: Context: This is the other inherited member.
-//   void interfaceMethod1(_) {}
-//        ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:72:16: Error: Can't inherit members that conflict with each other.
-// abstract class F extends E implements Interface1 {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:6:8: Context: This is one inherited member.
-//   void interfaceMethod1() {}
-//        ^^^^^^^^^^^^^^^^
-// pkg/front_end/testcases/abstract_members.dart:67:12: Context: This is the other inherited member.
-//   void set interfaceMethod1(_) {}
-//            ^^^^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:84:16: Error: Can't inherit members that conflict with each other.
-// abstract class H extends G implements Foo {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:75:8: Context: This is one inherited member.
-//   void foo() {}
-//        ^^^
-// pkg/front_end/testcases/abstract_members.dart:79:14: Context: This is the other inherited member.
-//   Object get foo => null;
-//              ^^^
-//
-// pkg/front_end/testcases/abstract_members.dart:96:16: Error: Can't inherit members that conflict with each other.
-// abstract class J extends I implements Bar {}
-//                ^
-// pkg/front_end/testcases/abstract_members.dart:87:14: Context: This is one inherited member.
-//   Object get foo => null;
-//              ^^^
-// pkg/front_end/testcases/abstract_members.dart:91: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 {}
-}
-class Interface2 extends core::Object {
-  field dynamic interfaceMethod1 = null;
-  synthetic constructor •() → self::Interface2
-    : super core::Object::•()
-    ;
-  method interfaceMethod2() → void {}
-}
-class Interface3 extends core::Object {
-  synthetic constructor •() → self::Interface3
-    : super core::Object::•()
-    ;
-  method interfaceMethod3() → void {}
-}
-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 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 {}
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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(#interfaceMethod2, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method abstractMethod() → dynamic
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder method interfaceMethod1() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder method interfaceMethod3() → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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;
-  no-such-method-forwarder get interfaceMethod1() → dynamic
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-  no-such-method-forwarder set property3(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property1(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  no-such-method-forwarder set property2(dynamic _) → void
-    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method interfaceMethod1(dynamic _) → void {}
-}
-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 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 {}
-}
-class G extends core::Object {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  get foo() → core::Object
-    return null;
-}
-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;
-}
-class I extends core::Object {
-  synthetic constructor •() → self::I
-    : super core::Object::•()
-    ;
-  method foo() → core::Object {}
-}
-abstract class J extends self::I implements self::Bar {
-  synthetic constructor •() → self::J
-    : super self::I::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.expect b/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.expect
deleted file mode 100644
index f45f7c3..0000000
--- a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-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 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;
-}
-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(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} self::B;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.expect
deleted file mode 100644
index f45f7c3..0000000
--- a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-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 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;
-}
-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(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} self::B;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
deleted file mode 100644
index 5430c79..0000000
--- a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method foo() → self::A
-    ;
-}
-abstract class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-  abstract method foo() → self::B;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    ;
-}
-class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
-    ;
-  no-such-method-forwarder method foo() → self::B
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} self::B;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.expect b/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
deleted file mode 100644
index f45f7c3..0000000
--- a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-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 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;
-}
-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(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} self::B;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect b/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
deleted file mode 100644
index f45f7c3..0000000
--- a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-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 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;
-}
-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(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} self::B;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/accessors.dart.legacy.expect b/pkg/front_end/testcases/accessors.dart.legacy.expect
deleted file mode 100644
index 7de21a4..0000000
--- a/pkg/front_end/testcases/accessors.dart.legacy.expect
+++ /dev/null
@@ -1,66 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
-//       print(onlySetter);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:40:11: Warning: 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(this.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(this.onlySetter);
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-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(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "No error thrown";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("Expected error: ${e}");
-  }
-  self::onlySetter = "fisk";
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect
deleted file mode 100644
index 7de21a4..0000000
--- a/pkg/front_end/testcases/accessors.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,66 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
-//       print(onlySetter);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:40:11: Warning: 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(this.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(this.onlySetter);
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-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(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#onlySetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "No error thrown";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("Expected error: ${e}");
-  }
-  self::onlySetter = "fisk";
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/accessors.dart.outline.expect b/pkg/front_end/testcases/accessors.dart.outline.expect
deleted file mode 100644
index 5e345ad..0000000
--- a/pkg/front_end/testcases/accessors.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  set onlySetter(dynamic value) → void
-    ;
-  method testC() → dynamic
-    ;
-  method testD() → dynamic
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  get onlySetter() → core::String
-    ;
-  set onlySetter(dynamic value) → void
-    ;
-}
-static set onlySetter(dynamic value) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/accessors.dart.strong.expect b/pkg/front_end/testcases/accessors.dart.strong.expect
deleted file mode 100644
index 45fbbc5..0000000
--- a/pkg/front_end/testcases/accessors.dart.strong.expect
+++ /dev/null
@@ -1,88 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
-//       print(onlySetter);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/accessors.dart:25:11: Error: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/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/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
-      print(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/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
-    print(onlySetter);
-          ^^^^^^^^^^");
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-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/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}();
-  new self::D::•().{self::C::testD}();
-}
diff --git a/pkg/front_end/testcases/accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/accessors.dart.strong.transformed.expect
deleted file mode 100644
index 45fbbc5..0000000
--- a/pkg/front_end/testcases/accessors.dart.strong.transformed.expect
+++ /dev/null
@@ -1,88 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
-//       print(onlySetter);
-//             ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/accessors.dart:25:11: Error: Getter not found: 'onlySetter'.
-//     print(onlySetter);
-//           ^^^^^^^^^^
-//
-// pkg/front_end/testcases/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/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/accessors.dart:16:13: Error: The getter 'onlySetter' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
-      print(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/accessors.dart:25:11: Error: The getter 'onlySetter' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/accessors.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'onlySetter'.
-    print(onlySetter);
-          ^^^^^^^^^^");
-    this.{self::C::onlySetter} = "hest";
-  }
-}
-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/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}();
-  new self::D::•().{self::C::testD}();
-}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.legacy.expect b/pkg/front_end/testcases/ambiguous_exports.dart.legacy.expect
deleted file mode 100644
index f098443..0000000
--- a/pkg/front_end/testcases/ambiguous_exports.dart.legacy.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
-// export 'map.dart' show main;
-// ^
-//
-import self as self;
-
-export "org-dartlang-testcase:///hello.dart";
-export "org-dartlang-testcase:///map.dart";
-
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.\"}" /* from null */;
-
-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>());
-}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.legacy.transformed.expect b/pkg/front_end/testcases/ambiguous_exports.dart.legacy.transformed.expect
deleted file mode 100644
index f098443..0000000
--- a/pkg/front_end/testcases/ambiguous_exports.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
-// export 'map.dart' show main;
-// ^
-//
-import self as self;
-
-export "org-dartlang-testcase:///hello.dart";
-export "org-dartlang-testcase:///map.dart";
-
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.\"}" /* from null */;
-
-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>());
-}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect b/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect
deleted file mode 100644
index a158644..0000000
--- a/pkg/front_end/testcases/ambiguous_exports.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
-// export 'map.dart' show main;
-// ^
-//
-import self as self;
-
-export "org-dartlang-testcase:///hello.dart";
-export "org-dartlang-testcase:///map.dart";
-
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.\"}" /* from null */;
-
-library;
-import self as self2;
-
-static method main() → dynamic
-  ;
-
-library;
-import self as self3;
-
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect b/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect
deleted file mode 100644
index f098443..0000000
--- a/pkg/front_end/testcases/ambiguous_exports.dart.strong.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
-// export 'map.dart' show main;
-// ^
-//
-import self as self;
-
-export "org-dartlang-testcase:///hello.dart";
-export "org-dartlang-testcase:///map.dart";
-
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.\"}" /* from null */;
-
-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>());
-}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect b/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect
deleted file mode 100644
index f098443..0000000
--- a/pkg/front_end/testcases/ambiguous_exports.dart.strong.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ambiguous_exports.dart:7:1: Error: 'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.
-// export 'map.dart' show main;
-// ^
-//
-import self as self;
-
-export "org-dartlang-testcase:///hello.dart";
-export "org-dartlang-testcase:///map.dart";
-
-static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/hello.dart' and 'pkg/front_end/testcases/map.dart'.\"}" /* from null */;
-
-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>());
-}
diff --git a/pkg/front_end/testcases/annotation_eof.dart.legacy.expect b/pkg/front_end/testcases/annotation_eof.dart.legacy.expect
deleted file mode 100644
index b1392cc..0000000
--- a/pkg/front_end/testcases/annotation_eof.dart.legacy.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/annotation_eof.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.legacy.transformed.expect
deleted file mode 100644
index b1392cc..0000000
--- a/pkg/front_end/testcases/annotation_eof.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/annotation_eof.dart.outline.expect b/pkg/front_end/testcases/annotation_eof.dart.outline.expect
deleted file mode 100644
index 92138e7..0000000
--- a/pkg/front_end/testcases/annotation_eof.dart.outline.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
-//
-import self as self;
-
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/annotation_eof.dart.strong.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.expect
deleted file mode 100644
index b1392cc..0000000
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/annotation_eof.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
deleted file mode 100644
index b1392cc..0000000
--- a/pkg/front_end/testcases/annotation_eof.dart.strong.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/annotation_on_enum_values.dart b/pkg/front_end/testcases/annotation_on_enum_values.dart
deleted file mode 100644
index 29dba81..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart
+++ /dev/null
@@ -1,21 +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.
-
-// This test checks that annotations on enum values are preserved by the
-// compiler.
-
-const int hest = 42;
-
-class Fisk<T> {
-  final T x;
-  const Fisk.fisk(this.x);
-}
-
-enum Foo {
-  @hest bar,
-  @Fisk.fisk(hest) baz,
-  cafebabe,
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.expect
deleted file mode 100644
index d0e40c2..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Fisk<T extends core::Object = dynamic> extends core::Object {
-  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::•()
-    ;
-}
-class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
-  @self::hest
-  static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<dynamic>(self::hest)
-  static const field self::Foo baz = const self::Foo::•(1, "Foo.baz");
-  static const field self::Foo cafebabe = const self::Foo::•(2, "Foo.cafebabe");
-  const constructor •(core::int index, core::String _name) → self::Foo
-    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Foo::_name};
-}
-static const field core::int hest = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.transformed.expect
deleted file mode 100644
index d0e40c2..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Fisk<T extends core::Object = dynamic> extends core::Object {
-  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::•()
-    ;
-}
-class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
-  @self::hest
-  static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<dynamic>(self::hest)
-  static const field self::Foo baz = const self::Foo::•(1, "Foo.baz");
-  static const field self::Foo cafebabe = const self::Foo::•(2, "Foo.cafebabe");
-  const constructor •(core::int index, core::String _name) → self::Foo
-    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Foo::_name};
-}
-static const field core::int hest = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
deleted file mode 100644
index c705421..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.outline.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Fisk<T extends core::Object = dynamic> extends core::Object {
-  final field self::Fisk::T x;
-  const constructor fisk(self::Fisk::T x) → self::Fisk<self::Fisk::T>
-    ;
-}
-class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
-  @self::hest
-  static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<dynamic>(self::hest)
-  static const field self::Foo baz = const self::Foo::•(1, "Foo.baz");
-  static const field self::Foo cafebabe = const self::Foo::•(2, "Foo.cafebabe");
-  const constructor •(core::int index, core::String _name) → self::Foo
-    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Foo::_name};
-}
-static const field core::int hest = 42;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.expect
deleted file mode 100644
index 5d8249c..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Fisk<T extends core::Object = dynamic> extends core::Object {
-  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::•()
-    ;
-}
-class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
-  @self::hest
-  static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<core::int>(self::hest)
-  static const field self::Foo baz = const self::Foo::•(1, "Foo.baz");
-  static const field self::Foo cafebabe = const self::Foo::•(2, "Foo.cafebabe");
-  const constructor •(core::int index, core::String _name) → self::Foo
-    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Foo::_name};
-}
-static const field core::int hest = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.transformed.expect
deleted file mode 100644
index 5d8249c..0000000
--- a/pkg/front_end/testcases/annotation_on_enum_values.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Fisk<T extends core::Object = dynamic> extends core::Object {
-  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::•()
-    ;
-}
-class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
-  @self::hest
-  static const field self::Foo bar = const self::Foo::•(0, "Foo.bar");
-  @self::Fisk::fisk<core::int>(self::hest)
-  static const field self::Foo baz = const self::Foo::•(1, "Foo.baz");
-  static const field self::Foo cafebabe = const self::Foo::•(2, "Foo.cafebabe");
-  const constructor •(core::int index, core::String _name) → self::Foo
-    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Foo::_name};
-}
-static const field core::int hest = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_top.dart.legacy.expect b/pkg/front_end/testcases/annotation_top.dart.legacy.expect
deleted file mode 100644
index 3498e81..0000000
--- a/pkg/front_end/testcases/annotation_top.dart.legacy.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-@test::a
-@test::A::•(1)
-library test;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-@self::A::•(2)
-typedef F1 = () → void;
-@self::a
-@self::A::•(3)
-typedef F2 = () → void;
-class A extends core::Object {
-  const constructor •(core::int value) → self::A
-    : super core::Object::•()
-    ;
-}
-@self::a
-@self::A::•(2)
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::Object a = const core::Object::•();
-@self::a
-@self::A::•(3)
-static field core::int f1;
-@self::a
-@self::A::•(3)
-static field core::int f2;
-@self::a
-@self::A::•(4)
-static method main() → void {}
diff --git a/pkg/front_end/testcases/annotation_top.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_top.dart.legacy.transformed.expect
deleted file mode 100644
index 3498e81..0000000
--- a/pkg/front_end/testcases/annotation_top.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-@test::a
-@test::A::•(1)
-library test;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-@self::A::•(2)
-typedef F1 = () → void;
-@self::a
-@self::A::•(3)
-typedef F2 = () → void;
-class A extends core::Object {
-  const constructor •(core::int value) → self::A
-    : super core::Object::•()
-    ;
-}
-@self::a
-@self::A::•(2)
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::Object a = const core::Object::•();
-@self::a
-@self::A::•(3)
-static field core::int f1;
-@self::a
-@self::A::•(3)
-static field core::int f2;
-@self::a
-@self::A::•(4)
-static method main() → void {}
diff --git a/pkg/front_end/testcases/annotation_top.dart.outline.expect b/pkg/front_end/testcases/annotation_top.dart.outline.expect
deleted file mode 100644
index 11b2fda..0000000
--- a/pkg/front_end/testcases/annotation_top.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-@test::a
-@test::A::•(1)
-library test;
-import self as self;
-import "dart:core" as core;
-
-typedef F1 = () → void;
-typedef F2 = () → void;
-class A extends core::Object {
-  const constructor •(core::int value) → self::A
-    ;
-}
-@self::a
-@self::A::•(2)
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-}
-static const field core::Object a = const core::Object::•();
-@self::a
-@self::A::•(3)
-static field core::int f1;
-@self::a
-@self::A::•(3)
-static field core::int f2;
-@self::a
-@self::A::•(4)
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/annotation_top.dart.strong.expect b/pkg/front_end/testcases/annotation_top.dart.strong.expect
deleted file mode 100644
index 3498e81..0000000
--- a/pkg/front_end/testcases/annotation_top.dart.strong.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-@test::a
-@test::A::•(1)
-library test;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-@self::A::•(2)
-typedef F1 = () → void;
-@self::a
-@self::A::•(3)
-typedef F2 = () → void;
-class A extends core::Object {
-  const constructor •(core::int value) → self::A
-    : super core::Object::•()
-    ;
-}
-@self::a
-@self::A::•(2)
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::Object a = const core::Object::•();
-@self::a
-@self::A::•(3)
-static field core::int f1;
-@self::a
-@self::A::•(3)
-static field core::int f2;
-@self::a
-@self::A::•(4)
-static method main() → void {}
diff --git a/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect
deleted file mode 100644
index 3498e81..0000000
--- a/pkg/front_end/testcases/annotation_top.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-@test::a
-@test::A::•(1)
-library test;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-@self::A::•(2)
-typedef F1 = () → void;
-@self::a
-@self::A::•(3)
-typedef F2 = () → void;
-class A extends core::Object {
-  const constructor •(core::int value) → self::A
-    : super core::Object::•()
-    ;
-}
-@self::a
-@self::A::•(2)
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::Object a = const core::Object::•();
-@self::a
-@self::A::•(3)
-static field core::int f1;
-@self::a
-@self::A::•(3)
-static field core::int f2;
-@self::a
-@self::A::•(4)
-static method main() → void {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.expect
deleted file mode 100644
index cca0222..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::foo core::int x, core::num y, {@self::bar @self::baz core::String z, core::Object w}) → void;
-typedef G = (@self::foo core::int a, core::num b, [@self::bar @self::baz core::String c, core::Object d]) → void;
-static const field core::int foo = 21;
-static const field core::int bar = 42;
-static const field core::int baz = 84;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.transformed.expect
deleted file mode 100644
index cca0222..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::foo core::int x, core::num y, {@self::bar @self::baz core::String z, core::Object w}) → void;
-typedef G = (@self::foo core::int a, core::num b, [@self::bar @self::baz core::String c, core::Object d]) → void;
-static const field core::int foo = 21;
-static const field core::int bar = 42;
-static const field core::int baz = 84;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect
deleted file mode 100644
index 1cdad69..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.outline.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (core::int, core::num, {w: core::Object, z: core::String}) → void;
-typedef G = (core::int, core::num, [core::String, core::Object]) → void;
-static const field core::int foo = 21;
-static const field core::int bar = 42;
-static const field core::int baz = 84;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.expect
deleted file mode 100644
index cca0222..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::foo core::int x, core::num y, {@self::bar @self::baz core::String z, core::Object w}) → void;
-typedef G = (@self::foo core::int a, core::num b, [@self::bar @self::baz core::String c, core::Object d]) → void;
-static const field core::int foo = 21;
-static const field core::int bar = 42;
-static const field core::int baz = 84;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.transformed.expect
deleted file mode 100644
index cca0222..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals.dart.strong.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::foo core::int x, core::num y, {@self::bar @self::baz core::String z, core::Object w}) → void;
-typedef G = (@self::foo core::int a, core::num b, [@self::bar @self::baz core::String c, core::Object d]) → void;
-static const field core::int foo = 21;
-static const field core::int bar = 42;
-static const field core::int baz = 84;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.expect
deleted file mode 100644
index 4f8c56b..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::app core::int app) → core::int;
-static const field core::int app = 0;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.transformed.expect
deleted file mode 100644
index 4f8c56b..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::app core::int app) → core::int;
-static const field core::int app = 0;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect
deleted file mode 100644
index 8aca7b0..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.outline.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (core::int) → core::int;
-static const field core::int app = 0;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.expect
deleted file mode 100644
index 4f8c56b..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::app core::int app) → core::int;
-static const field core::int app = 0;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.transformed.expect
deleted file mode 100644
index 4f8c56b..0000000
--- a/pkg/front_end/testcases/annotation_typedef_formals_resolution.dart.strong.transformed.expect
+++ /dev/null
@@ -1,7 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef F = (@self::app core::int app) → core::int;
-static const field core::int app = 0;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.expect
deleted file mode 100644
index a437f1e..0000000
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef hest_t = ({@self::foo dynamic named}) → dynamic;
-class Bar extends core::Object {
-  const constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  const constructor named(dynamic x) → self::Bar
-    : super core::Object::•()
-    ;
-}
-class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → self::Baz
-    : super core::Object::•()
-    ;
-  static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
-    return null;
-  method fisk(@self::foo dynamic formal1, @self::Bar::•() dynamic formal2, @self::Bar::named(self::foo) dynamic formal3, @self::foo @self::Bar::named(self::foo) dynamic formal4, [@self::foo dynamic optional = null]) → dynamic {
-    @self::foo dynamic local1;
-    @self::Bar::•() dynamic local2;
-    @self::Bar::named(self::foo) dynamic local3;
-    @self::foo @self::Bar::named(self::foo) dynamic local4;
-    @self::foo dynamic localWithInitializer = "hello";
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart1;
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart2;
-    function naebdyr(@self::foo dynamic nestedFormal) → dynamic
-      return null;
-    dynamic roedmus = (@self::foo dynamic closureFormal) → dynamic => null;
-  }
-  method hest({@self::foo dynamic named = null}) → dynamic
-    return null;
-}
-static const field core::int foo = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.transformed.expect
deleted file mode 100644
index a437f1e..0000000
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef hest_t = ({@self::foo dynamic named}) → dynamic;
-class Bar extends core::Object {
-  const constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  const constructor named(dynamic x) → self::Bar
-    : super core::Object::•()
-    ;
-}
-class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → self::Baz
-    : super core::Object::•()
-    ;
-  static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
-    return null;
-  method fisk(@self::foo dynamic formal1, @self::Bar::•() dynamic formal2, @self::Bar::named(self::foo) dynamic formal3, @self::foo @self::Bar::named(self::foo) dynamic formal4, [@self::foo dynamic optional = null]) → dynamic {
-    @self::foo dynamic local1;
-    @self::Bar::•() dynamic local2;
-    @self::Bar::named(self::foo) dynamic local3;
-    @self::foo @self::Bar::named(self::foo) dynamic local4;
-    @self::foo dynamic localWithInitializer = "hello";
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart1;
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart2;
-    function naebdyr(@self::foo dynamic nestedFormal) → dynamic
-      return null;
-    dynamic roedmus = (@self::foo dynamic closureFormal) → dynamic => null;
-  }
-  method hest({@self::foo dynamic named = null}) → dynamic
-    return null;
-}
-static const field core::int foo = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
deleted file mode 100644
index faa7175..0000000
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef hest_t = ({named: dynamic}) → dynamic;
-class Bar extends core::Object {
-  const constructor •() → self::Bar
-    ;
-  const constructor named(dynamic x) → self::Bar
-    ;
-}
-class Baz extends core::Object {
-  constructor •(dynamic constructorFormal) → self::Baz
-    ;
-  static factory bazFactory(dynamic factoryFormal) → self::Baz
-    ;
-  method fisk(dynamic formal1, dynamic formal2, dynamic formal3, dynamic formal4, [dynamic optional]) → dynamic
-    ;
-  method hest({dynamic named}) → dynamic
-    ;
-}
-static const field core::int foo = 42;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect
deleted file mode 100644
index b848b38..0000000
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef hest_t = ({@self::foo dynamic named}) → dynamic;
-class Bar extends core::Object {
-  const constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  const constructor named(dynamic x) → self::Bar
-    : super core::Object::•()
-    ;
-}
-class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → self::Baz
-    : super core::Object::•()
-    ;
-  static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
-    return null;
-  method fisk(@self::foo dynamic formal1, @self::Bar::•() dynamic formal2, @self::Bar::named(self::foo) dynamic formal3, @self::foo @self::Bar::named(self::foo) dynamic formal4, [@self::foo dynamic optional = null]) → dynamic {
-    @self::foo dynamic local1;
-    @self::Bar::•() dynamic local2;
-    @self::Bar::named(self::foo) dynamic local3;
-    @self::foo @self::Bar::named(self::foo) dynamic local4;
-    @self::foo core::String localWithInitializer = "hello";
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart1;
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart2;
-    function naebdyr(@self::foo dynamic nestedFormal) → core::Null
-      return null;
-    (dynamic) → core::Null roedmus = (@self::foo dynamic closureFormal) → core::Null => null;
-  }
-  method hest({@self::foo dynamic named = null}) → dynamic
-    return null;
-}
-static const field core::int foo = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.transformed.expect
deleted file mode 100644
index b848b38..0000000
--- a/pkg/front_end/testcases/annotation_variable_declaration.dart.strong.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef hest_t = ({@self::foo dynamic named}) → dynamic;
-class Bar extends core::Object {
-  const constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  const constructor named(dynamic x) → self::Bar
-    : super core::Object::•()
-    ;
-}
-class Baz extends core::Object {
-  constructor •(@self::foo dynamic constructorFormal) → self::Baz
-    : super core::Object::•()
-    ;
-  static factory bazFactory(@self::foo dynamic factoryFormal) → self::Baz
-    return null;
-  method fisk(@self::foo dynamic formal1, @self::Bar::•() dynamic formal2, @self::Bar::named(self::foo) dynamic formal3, @self::foo @self::Bar::named(self::foo) dynamic formal4, [@self::foo dynamic optional = null]) → dynamic {
-    @self::foo dynamic local1;
-    @self::Bar::•() dynamic local2;
-    @self::Bar::named(self::foo) dynamic local3;
-    @self::foo @self::Bar::named(self::foo) dynamic local4;
-    @self::foo core::String localWithInitializer = "hello";
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart1;
-    @self::foo @self::Bar::named(self::foo) dynamic localGroupPart2;
-    function naebdyr(@self::foo dynamic nestedFormal) → core::Null
-      return null;
-    (dynamic) → core::Null roedmus = (@self::foo dynamic closureFormal) → core::Null => null;
-  }
-  method hest({@self::foo dynamic named = null}) → dynamic
-    return null;
-}
-static const field core::int foo = 42;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/argument.dart.legacy.expect b/pkg/front_end/testcases/argument.dart.legacy.expect
deleted file mode 100644
index 74df666..0000000
--- a/pkg/front_end/testcases/argument.dart.legacy.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-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.call(new self::Baz::•());
-}
-static method main() → dynamic {
-  self::foo(new self::Foo::•());
-  self::bar(new self::Bar::•());
-  self::escape(self::foo_escaped);
-  self::escape(self::bar_escaped);
-}
diff --git a/pkg/front_end/testcases/argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/argument.dart.legacy.transformed.expect
deleted file mode 100644
index 74df666..0000000
--- a/pkg/front_end/testcases/argument.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-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.call(new self::Baz::•());
-}
-static method main() → dynamic {
-  self::foo(new self::Foo::•());
-  self::bar(new self::Bar::•());
-  self::escape(self::foo_escaped);
-  self::escape(self::bar_escaped);
-}
diff --git a/pkg/front_end/testcases/argument.dart.outline.expect b/pkg/front_end/testcases/argument.dart.outline.expect
deleted file mode 100644
index 6d36e8f..0000000
--- a/pkg/front_end/testcases/argument.dart.outline.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    ;
-}
-class Foo extends self::Base {
-  synthetic constructor •() → self::Foo
-    ;
-}
-class Bar extends self::Base {
-  synthetic constructor •() → self::Bar
-    ;
-}
-class Baz extends self::Base {
-  synthetic constructor •() → self::Baz
-    ;
-}
-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
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/argument.dart.strong.expect b/pkg/front_end/testcases/argument.dart.strong.expect
deleted file mode 100644
index 74df666..0000000
--- a/pkg/front_end/testcases/argument.dart.strong.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-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.call(new self::Baz::•());
-}
-static method main() → dynamic {
-  self::foo(new self::Foo::•());
-  self::bar(new self::Bar::•());
-  self::escape(self::foo_escaped);
-  self::escape(self::bar_escaped);
-}
diff --git a/pkg/front_end/testcases/argument.dart.strong.transformed.expect b/pkg/front_end/testcases/argument.dart.strong.transformed.expect
deleted file mode 100644
index 74df666..0000000
--- a/pkg/front_end/testcases/argument.dart.strong.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    : super core::Object::•()
-    ;
-}
-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.call(new self::Baz::•());
-}
-static method main() → dynamic {
-  self::foo(new self::Foo::•());
-  self::bar(new self::Bar::•());
-  self::escape(self::foo_escaped);
-  self::escape(self::bar_escaped);
-}
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.legacy.expect b/pkg/front_end/testcases/argument_mismatch.dart.legacy.expect
deleted file mode 100644
index ac488e4..0000000
--- a/pkg/front_end/testcases/argument_mismatch.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   /*@warning=MethodNotFound*/ foo(null);
-//                                  ^
-// pkg/front_end/testcases/argument_mismatch.dart:5:1: Context: Found this candidate, but the arguments don't match.
-// foo() {}
-// ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method foo() → dynamic {}
-static method test() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect b/pkg/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
deleted file mode 100644
index ac488e4..0000000
--- a/pkg/front_end/testcases/argument_mismatch.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   /*@warning=MethodNotFound*/ foo(null);
-//                                  ^
-// pkg/front_end/testcases/argument_mismatch.dart:5:1: Context: Found this candidate, but the arguments don't match.
-// foo() {}
-// ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method foo() → dynamic {}
-static method test() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/arithmetic.dart.legacy.expect b/pkg/front_end/testcases/arithmetic.dart.legacy.expect
deleted file mode 100644
index 7c867f3..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.legacy.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo(core::int x, core::int y) → core::int {
-  dynamic z = x.+(y);
-  return z.<<(4);
-}
-static method loop(core::List<dynamic> xs) → void {
-  core::int _ = xs.length;
-  for (core::int i = 0; i.<(xs.length); i = i.+(1)) {
-  }
-}
-static method main() → dynamic {
-  self::foo(4, 5);
-  self::foo(6, 7);
-  self::loop(<dynamic>["dfg"]);
-}
diff --git a/pkg/front_end/testcases/arithmetic.dart.legacy.transformed.expect b/pkg/front_end/testcases/arithmetic.dart.legacy.transformed.expect
deleted file mode 100644
index 7c867f3..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo(core::int x, core::int y) → core::int {
-  dynamic z = x.+(y);
-  return z.<<(4);
-}
-static method loop(core::List<dynamic> xs) → void {
-  core::int _ = xs.length;
-  for (core::int i = 0; i.<(xs.length); i = i.+(1)) {
-  }
-}
-static method main() → dynamic {
-  self::foo(4, 5);
-  self::foo(6, 7);
-  self::loop(<dynamic>["dfg"]);
-}
diff --git a/pkg/front_end/testcases/arithmetic.dart.outline.expect b/pkg/front_end/testcases/arithmetic.dart.outline.expect
deleted file mode 100644
index 005581f..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.outline.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method foo(core::int x, core::int y) → core::int
-  ;
-static method loop(core::List<dynamic> xs) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/arithmetic.dart.strong.expect b/pkg/front_end/testcases/arithmetic.dart.strong.expect
deleted file mode 100644
index 0eac1ce..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.strong.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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);
-  return z.{core::int::<<}(4);
-}
-static method loop(core::List<dynamic> xs) → void {
-  core::int _ = xs.{core::List::length};
-  for (core::int i = 0; i.{core::num::<}(xs.{core::List::length}); i = i.{core::num::+}(1)) {
-  }
-}
-static method main() → dynamic {
-  self::foo(4, 5);
-  self::foo(6, 7);
-  self::loop(<dynamic>["dfg"]);
-}
diff --git a/pkg/front_end/testcases/arithmetic.dart.strong.transformed.expect b/pkg/front_end/testcases/arithmetic.dart.strong.transformed.expect
deleted file mode 100644
index 0eac1ce..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.strong.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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);
-  return z.{core::int::<<}(4);
-}
-static method loop(core::List<dynamic> xs) → void {
-  core::int _ = xs.{core::List::length};
-  for (core::int i = 0; i.{core::num::<}(xs.{core::List::length}); i = i.{core::num::+}(1)) {
-  }
-}
-static method main() → dynamic {
-  self::foo(4, 5);
-  self::foo(6, 7);
-  self::loop(<dynamic>["dfg"]);
-}
diff --git a/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect b/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect
deleted file mode 100644
index 8a5a7db..0000000
--- a/pkg/front_end/testcases/arithmetic.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/arithmetic.dart:11:35: Context: Write to i@330
-  for (int i = 0; i < xs.length; i++) {}
-                                  ^^
diff --git a/pkg/front_end/testcases/arrow_function.dart.legacy.expect b/pkg/front_end/testcases/arrow_function.dart.legacy.expect
deleted file mode 100644
index fd2c981..0000000
--- a/pkg/front_end/testcases/arrow_function.dart.legacy.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main<T extends core::Object = dynamic>() → dynamic
-  return () → dynamic => self::main::T;
diff --git a/pkg/front_end/testcases/arrow_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/arrow_function.dart.legacy.transformed.expect
deleted file mode 100644
index fd2c981..0000000
--- a/pkg/front_end/testcases/arrow_function.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main<T extends core::Object = dynamic>() → dynamic
-  return () → dynamic => self::main::T;
diff --git a/pkg/front_end/testcases/arrow_function.dart.outline.expect b/pkg/front_end/testcases/arrow_function.dart.outline.expect
deleted file mode 100644
index ebd9bdd..0000000
--- a/pkg/front_end/testcases/arrow_function.dart.outline.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main<T extends core::Object = dynamic>() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/arrow_function.dart.strong.expect b/pkg/front_end/testcases/arrow_function.dart.strong.expect
deleted file mode 100644
index b1e02d2..0000000
--- a/pkg/front_end/testcases/arrow_function.dart.strong.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-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/arrow_function.dart.strong.transformed.expect b/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect
deleted file mode 100644
index b1e02d2..0000000
--- a/pkg/front_end/testcases/arrow_function.dart.strong.transformed.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-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/async_function.dart.legacy.expect b/pkg/front_end/testcases/async_function.dart.legacy.expect
deleted file mode 100644
index 0510556..0000000
--- a/pkg/front_end/testcases/async_function.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 = <dynamic>["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/async_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/async_function.dart.legacy.transformed.expect
deleted file mode 100644
index 2ac15d8..0000000
--- a/pkg/front_end/testcases/async_function.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,205 +0,0 @@
-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 = <dynamic>["bar"];
-static method asyncString() → asy::Future<core::String> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "foo";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method asyncString2() → asy::Future<core::String> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = self::asyncString();
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L3:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
-            return null;
-          else
-            [yield] null;
-          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L4:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L5:
-      {
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String str = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/async_function.dart.outline.expect b/pkg/front_end/testcases/async_function.dart.outline.expect
deleted file mode 100644
index d9c5589..0000000
--- a/pkg/front_end/testcases/async_function.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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;
-static method asyncString() → asy::Future<core::String>
-  ;
-static method asyncString2() → asy::Future<core::String>
-  ;
-static method syncStarString() → core::Iterable<core::String>
-  ;
-static method syncStarString2() → core::Iterable<core::String>
-  ;
-static method asyncStarString() → asy::Stream<core::String>
-  ;
-static method asyncStarString2() → asy::Stream<core::String>
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/async_function.dart.strong.expect b/pkg/front_end/testcases/async_function.dart.strong.expect
deleted file mode 100644
index b4babf8..0000000
--- a/pkg/front_end/testcases/async_function.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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/async_function.dart.strong.transformed.expect b/pkg/front_end/testcases/async_function.dart.strong.transformed.expect
deleted file mode 100644
index d2dffb7..0000000
--- a/pkg/front_end/testcases/async_function.dart.strong.transformed.expect
+++ /dev/null
@@ -1,205 +0,0 @@
-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> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "foo";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method asyncString2() → asy::Future<core::String> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = self::asyncString();
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method syncStarString() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
-        [yield] true;
-      }
-      {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method syncStarString2() → core::Iterable<core::String> /* originally sync* */ {
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::String> :iterator) → core::bool yielding {
-    {
-      {
-        :iterator.{core::_SyncIterator::_current} = "foo";
-        [yield] true;
-      }
-    }
-    return false;
-  }
-  return new core::_SyncIterable::•<core::String>(:sync_op);
-}
-static method asyncStarString() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L3:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
-            return null;
-          else
-            [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
-            return null;
-          else
-            [yield] null;
-          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method asyncStarString2() → asy::Stream<core::String> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::String> :controller;
-  dynamic :controller_stream;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try
-      try {
-        #L4:
-        {
-          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
-            return null;
-          else
-            [yield] null;
-        }
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
-      }
-    finally {
-      :controller.{asy::_AsyncStarStreamController::close}();
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::String>(:async_op);
-  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
-  return :controller_stream;
-}
-static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L5:
-      {
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String str = :result;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/async_nested.dart.legacy.expect b/pkg/front_end/testcases/async_nested.dart.legacy.expect
deleted file mode 100644
index 363de24..0000000
--- a/pkg/front_end/testcases/async_nested.dart.legacy.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 = null]) → self::Node
-    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
-  method toString() → core::String
-    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
-  method toSimpleString() → dynamic {
-    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
-    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
-  }
-}
-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", <dynamic>[new self::Node::•("2", <dynamic>[]), await asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[]))])), await asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), await asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[]))])]))])), await asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[]))]);
-  core::String actual = node.toSimpleString();
-  core::print(actual);
-  if(!actual.==(expected)) {
-    throw "Expected '${expected}' but got '${actual}'";
-  }
-}
diff --git a/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect b/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect
deleted file mode 100644
index c0e22cb..0000000
--- a/pkg/front_end/testcases/async_nested.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,66 +0,0 @@
-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 = null]) → self::Node
-    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
-  method toString() → core::String
-    return "<${this.{self::Node::name}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
-  method toSimpleString() → dynamic {
-    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
-    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
-  }
-}
-static method main() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :async_temporary_0;
-  dynamic :async_temporary_1;
-  dynamic :async_temporary_2;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::String expected = "1 2 3 4 5 6 7 8 9 10";
-        :async_temporary_2 = new self::Node::•("2", <dynamic>[]);
-        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_1 = :result;
-        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
-        core::String actual = node.toSimpleString();
-        core::print(actual);
-        if(!actual.==(expected)) {
-          throw "Expected '${expected}' but got '${actual}'";
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/async_nested.dart.outline.expect b/pkg/front_end/testcases/async_nested.dart.outline.expect
deleted file mode 100644
index 57d0f20..0000000
--- a/pkg/front_end/testcases/async_nested.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-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]) → self::Node
-    ;
-  method toString() → core::String
-    ;
-  method toSimpleString() → dynamic
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.expect b/pkg/front_end/testcases/async_nested.dart.strong.expect
deleted file mode 100644
index d51ca15..0000000
--- a/pkg/front_end/testcases/async_nested.dart.strong.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 = null]) → self::Node
-    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
-  method toString() → core::String
-    return "<${this.{self::Node::name}}:[${let final core::List<self::Node> #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String} null : #t1.{core::Iterable::join}(", ")}]>";
-  method toSimpleString() → dynamic {
-    core::Iterable<dynamic> tmp = let final core::List<self::Node> #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>} null : #t2.{core::Iterable::map}<dynamic>((self::Node child) → dynamic => child.{self::Node::toSimpleString}());
-    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic> #t3 = tmp in #t3.==(null) ?{core::String} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
-  }
-}
-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}() as{TypeError} core::String;
-  core::print(actual);
-  if(!actual.{core::String::==}(expected)) {
-    throw "Expected '${expected}' but got '${actual}'";
-  }
-}
diff --git a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
deleted file mode 100644
index 246f441..0000000
--- a/pkg/front_end/testcases/async_nested.dart.strong.transformed.expect
+++ /dev/null
@@ -1,66 +0,0 @@
-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 = null]) → self::Node
-    : self::Node::name = name, self::Node::nested = nested, super core::Object::•() {}
-  method toString() → core::String
-    return "<${this.{self::Node::name}}:[${let final core::List<self::Node> #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String} null : #t1.{core::Iterable::join}(", ")}]>";
-  method toSimpleString() → dynamic {
-    core::Iterable<dynamic> tmp = let final core::List<self::Node> #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>} null : #t2.{core::Iterable::map}<dynamic>((self::Node child) → dynamic => child.{self::Node::toSimpleString}());
-    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic> #t3 = tmp in #t3.==(null) ?{core::String} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
-  }
-}
-static method main() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :async_temporary_0;
-  dynamic :async_temporary_1;
-  dynamic :async_temporary_2;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        core::String expected = "1 2 3 4 5 6 7 8 9 10";
-        :async_temporary_2 = new self::Node::•("2", <self::Node>[]);
-        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("7", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("6", <self::Node>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_1 = :result;
-        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("8", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("9", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("4", <self::Node>[new self::Node::•("5", <self::Node>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
-        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("3", <self::Node>[:result])), :async_op_then, :async_op_error, :async_op) in null;
-        :async_temporary_0 = :result;
-        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node>(new self::Node::•("10", <self::Node>[])), :async_op_then, :async_op_error, :async_op) in null;
-        self::Node node = new self::Node::•("1", <self::Node>[:async_temporary_2, :async_temporary_0, :result]);
-        core::String actual = node.{self::Node::toSimpleString}() as{TypeError} core::String;
-        core::print(actual);
-        if(!actual.{core::String::==}(expected)) {
-          throw "Expected '${expected}' but got '${actual}'";
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/await.dart.legacy.transformed.expect b/pkg/front_end/testcases/await.dart.legacy.transformed.expect
deleted file mode 100644
index 6a66550..0000000
--- a/pkg/front_end/testcases/await.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/await.dart.strong.transformed.expect b/pkg/front_end/testcases/await.dart.strong.transformed.expect
deleted file mode 100644
index 6a66550..0000000
--- a/pkg/front_end/testcases/await.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/await_in_non_async.dart.legacy.expect b/pkg/front_end/testcases/await_in_non_async.dart.legacy.expect
deleted file mode 100644
index c3d233b..0000000
--- a/pkg/front_end/testcases/await_in_non_async.dart.legacy.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/await_in_non_async.dart.legacy.transformed.expect b/pkg/front_end/testcases/await_in_non_async.dart.legacy.transformed.expect
deleted file mode 100644
index c3d233b..0000000
--- a/pkg/front_end/testcases/await_in_non_async.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/await_in_non_async.dart.strong.expect b/pkg/front_end/testcases/await_in_non_async.dart.strong.expect
deleted file mode 100644
index c3d233b..0000000
--- a/pkg/front_end/testcases/await_in_non_async.dart.strong.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/await_in_non_async.dart.strong.transformed.expect b/pkg/front_end/testcases/await_in_non_async.dart.strong.transformed.expect
deleted file mode 100644
index c3d233b..0000000
--- a/pkg/front_end/testcases/await_in_non_async.dart.strong.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/bad_setter_abstract.dart.legacy.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.expect
deleted file mode 100644
index f93d1cb..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-// set b();
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-// set c(x, y);
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Warning: 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/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/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → void {
-    invalid-expression "pkg/front_end/testcases/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/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-static set b(dynamic #synthetic) → void {
-  invalid-expression "pkg/front_end/testcases/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/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::•().a = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    new 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/bad_setter_abstract.dart.legacy.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.transformed.expect
deleted file mode 100644
index f93d1cb..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-// set b();
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-// set c(x, y);
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:66:9: Warning: 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/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/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → void {
-    invalid-expression "pkg/front_end/testcases/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/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-static set b(dynamic #synthetic) → void {
-  invalid-expression "pkg/front_end/testcases/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/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::•().a = null;
-    threw = false;
-  }
-  on dynamic catch(final dynamic e) {
-  }
-  if(!threw) {
-    throw "Expected an error above.";
-  }
-  try {
-    threw = true;
-    new 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/bad_setter_abstract.dart.outline.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
deleted file mode 100644
index 65b27e3..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.outline.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  set a(dynamic #synthetic) → void
-    ;
-  set d(dynamic #synthetic) → void
-    ;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  set a(dynamic #synthetic) → void
-    ;
-  set d(dynamic #synthetic) → void
-    ;
-}
-static set b(dynamic #synthetic) → void
-  ;
-static set c(dynamic #synthetic) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
deleted file mode 100644
index 493d45f..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-// set b();
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-// set c(x, y);
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/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/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/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → void {
-    invalid-expression "pkg/front_end/testcases/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/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-static set b(dynamic #synthetic) → void {
-  invalid-expression "pkg/front_end/testcases/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/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/bad_setter_abstract.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
deleted file mode 100644
index 493d45f..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.strong.transformed.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:8: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set b();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:12: Error: Expected a function body or '=>'.
-// Try adding {}.
-// set c(x, y);
-//            ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:5:6: Error: A setter should have exactly one formal parameter.
-// set b();
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:7:6: Error: A setter should have exactly one formal parameter.
-// set c(x, y);
-//      ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:10:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:15:8: Error: A setter should have exactly one formal parameter.
-//   set a();
-//        ^
-//
-// pkg/front_end/testcases/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-//   set d(x, y);
-//        ^
-//
-// pkg/front_end/testcases/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/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/bad_setter_abstract.dart:11:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  set a(dynamic #synthetic) → void {
-    invalid-expression "pkg/front_end/testcases/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/bad_setter_abstract.dart:16:8: Error: A setter should have exactly one formal parameter.
-  set d(x, y);
-       ^";
-    {
-      dynamic x;
-      dynamic y;
-      ;
-    }
-  }
-}
-static set b(dynamic #synthetic) → void {
-  invalid-expression "pkg/front_end/testcases/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/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/bad_setter_abstract.dart.type_promotion.expect b/pkg/front_end/testcases/bad_setter_abstract.dart.type_promotion.expect
deleted file mode 100644
index adc877f..0000000
--- a/pkg/front_end/testcases/bad_setter_abstract.dart.type_promotion.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-pkg/front_end/testcases/bad_setter_abstract.dart:22:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:24:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:32:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:34:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:42:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:44:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:55:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:57:11: Context: Write to threw@344
-    threw = false;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:65:11: Context: Write to threw@344
-    threw = true;
-          ^
-pkg/front_end/testcases/bad_setter_abstract.dart:67:11: Context: Write to threw@344
-    threw = false;
-          ^
diff --git a/pkg/front_end/testcases/bad_store.dart.legacy.expect b/pkg/front_end/testcases/bad_store.dart.legacy.expect
deleted file mode 100644
index 20204fb..0000000
--- a/pkg/front_end/testcases/bad_store.dart.legacy.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-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::•()
-    ;
-}
-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.length.>(1)) {
-    foo.field = "string";
-    dynamic first = foo.field;
-    self::use(first);
-    foo.noField = "string";
-    dynamic second = foo.noField;
-    self::use(second);
-  }
-}
diff --git a/pkg/front_end/testcases/bad_store.dart.legacy.transformed.expect b/pkg/front_end/testcases/bad_store.dart.legacy.transformed.expect
deleted file mode 100644
index 20204fb..0000000
--- a/pkg/front_end/testcases/bad_store.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-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::•()
-    ;
-}
-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.length.>(1)) {
-    foo.field = "string";
-    dynamic first = foo.field;
-    self::use(first);
-    foo.noField = "string";
-    dynamic second = foo.noField;
-    self::use(second);
-  }
-}
diff --git a/pkg/front_end/testcases/bad_store.dart.outline.expect b/pkg/front_end/testcases/bad_store.dart.outline.expect
deleted file mode 100644
index 9c57266..0000000
--- a/pkg/front_end/testcases/bad_store.dart.outline.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field dynamic field;
-  synthetic constructor •() → self::Foo
-    ;
-}
-static method identity(dynamic x) → dynamic
-  ;
-static method use(dynamic x) → void
-  ;
-static method main(core::List<core::String> args) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bad_store.dart.strong.expect b/pkg/front_end/testcases/bad_store.dart.strong.expect
deleted file mode 100644
index 0c5ebe9..0000000
--- a/pkg/front_end/testcases/bad_store.dart.strong.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-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::•()
-    ;
-}
-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::num::>}(1)) {
-    foo.field = "string";
-    dynamic first = foo.field;
-    self::use(first);
-    foo.noField = "string";
-    dynamic second = foo.noField;
-    self::use(second);
-  }
-}
diff --git a/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect
deleted file mode 100644
index 0c5ebe9..0000000
--- a/pkg/front_end/testcases/bad_store.dart.strong.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-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::•()
-    ;
-}
-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::num::>}(1)) {
-    foo.field = "string";
-    dynamic first = foo.field;
-    self::use(first);
-    foo.noField = "string";
-    dynamic second = foo.noField;
-    self::use(second);
-  }
-}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart
deleted file mode 100644
index 3816961..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart
+++ /dev/null
@@ -1,87 +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.
-
-typedef ContravariantUse<T> = Function(T);
-
-typedef InvariantUse<T> = T Function(T);
-
-class Empty {}
-
-class A<T> {}
-
-class B<T> extends A<Function(T)> {}
-
-class Bc<T> extends A<ContravariantUse<T>> {}
-
-class Bi<T> extends A<InvariantUse<T>> {}
-
-class C<T> implements A<Function(T)> {}
-
-class Cc<T> implements A<ContravariantUse<T>> {}
-
-class Ci<T> implements A<InvariantUse<T>> {}
-
-class D<T> = Object with A<Function(T)>;
-
-class Dc<T> = Object with A<ContravariantUse<T>>;
-
-class Di<T> = Object with A<InvariantUse<T>>;
-
-class E<T> = A<Function(T)> with Empty;
-
-class Ec<T> = A<ContravariantUse<T>> with Empty;
-
-class Ei<T> = A<InvariantUse<T>> with Empty;
-
-class F<T> extends Object with A<Function(T)> {}
-
-class Fc<T> extends Object with A<ContravariantUse<T>> {}
-
-class Fi<T> extends Object with A<InvariantUse<T>> {}
-
-class G<T> extends A<Function(T)> with Empty {}
-
-class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-
-class Gi<T> extends A<InvariantUse<T>> with Empty {}
-
-class Hff<T> extends A<Function(Function(T))> {}
-
-class Hfc<T> extends A<Function(ContravariantUse<T>)> {}
-
-class Hcf<T> extends A<ContravariantUse<Function(T)>> {}
-
-class Hcc<T> extends A<ContravariantUse<ContravariantUse<T>>> {}
-
-class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-
-class Iafc<T> extends A<A<Function(ContravariantUse<T>)>> {}
-
-class Iacf<T> extends A<A<ContravariantUse<Function(T)>>> {}
-
-class Ifac<T> extends A<Function(A<ContravariantUse<T>>)> {}
-
-class Ifca<T> extends A<Function(ContravariantUse<A<T>>)> {}
-
-class Icaf<T> extends A<ContravariantUse<A<Function(T)>>> {}
-
-class Icfa<T> extends A<ContravariantUse<Function(A<T>)>> {}
-
-class Jfff<T> extends A<Function(Function(Function(T)))> {}
-
-class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-
-class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-
-class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-
-class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-
-class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-
-class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-
-class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-
-main() {}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.expect b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.expect
deleted file mode 100644
index 74cdea4..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.expect
+++ /dev/null
@@ -1,343 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> extends A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bc<T> extends A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bi<T> extends A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class C<T> implements A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Cc<T> implements A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ci<T> implements A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class D<T> = Object with A<Function(T)>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Dc<T> = Object with A<ContravariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Di<T> = Object with A<InvariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class E<T> = A<Function(T)> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ec<T> = A<ContravariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ei<T> = A<InvariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class F<T> extends Object with A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fc<T> extends Object with A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fi<T> extends Object with A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class G<T> extends A<Function(T)> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gi<T> extends A<InvariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfff<T> extends A<Function(Function(Function(T)))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef ContravariantUse<T extends core::Object = dynamic> = (T) → dynamic;
-typedef InvariantUse<T extends core::Object = dynamic> = (T) → T;
-class Empty extends core::Object {
-  synthetic constructor •() → self::Empty
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class Bc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bc<self::Bc::T>
-    : super core::Object::•()
-    ;
-}
-class Bi<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bi<self::Bi::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-class Cc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Cc<self::Cc::T>
-    : super core::Object::•()
-    ;
-}
-class Ci<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Ci<self::Ci::T>
-    : super core::Object::•()
-    ;
-}
-class D<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::D<self::D::T>
-    : super core::Object::•()
-    ;
-}
-class Dc<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Dc<self::Dc::T>
-    : super core::Object::•()
-    ;
-}
-class Di<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Di<self::Di::T>
-    : super core::Object::•()
-    ;
-}
-class E<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::E<self::E::T>
-    : super core::Object::•()
-    ;
-}
-class Ec<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ec<self::Ec::T>
-    : super core::Object::•()
-    ;
-}
-class Ei<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ei<self::Ei::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _F&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Jffc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jffc<self::Jffc::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcf<self::Jfcf::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcc<self::Jfcc::T>
-    : super core::Object::•()
-    ;
-}
-class Jcff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcff<self::Jcff::T>
-    : super core::Object::•()
-    ;
-}
-class Jcfc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcfc<self::Jcfc::T>
-    : super core::Object::•()
-    ;
-}
-class Jccf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccf<self::Jccf::T>
-    : super core::Object::•()
-    ;
-}
-class Jccc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccc<self::Jccc::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect
deleted file mode 100644
index 87ac80d7..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,343 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> extends A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bc<T> extends A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bi<T> extends A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class C<T> implements A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Cc<T> implements A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ci<T> implements A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class D<T> = Object with A<Function(T)>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Dc<T> = Object with A<ContravariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Di<T> = Object with A<InvariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class E<T> = A<Function(T)> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ec<T> = A<ContravariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ei<T> = A<InvariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class F<T> extends Object with A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fc<T> extends Object with A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fi<T> extends Object with A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class G<T> extends A<Function(T)> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gi<T> extends A<InvariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfff<T> extends A<Function(Function(Function(T)))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef ContravariantUse<T extends core::Object = dynamic> = (T) → dynamic;
-typedef InvariantUse<T extends core::Object = dynamic> = (T) → T;
-class Empty extends core::Object {
-  synthetic constructor •() → self::Empty
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class Bc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bc<self::Bc::T>
-    : super core::Object::•()
-    ;
-}
-class Bi<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bi<self::Bi::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-class Cc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Cc<self::Cc::T>
-    : super core::Object::•()
-    ;
-}
-class Ci<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Ci<self::Ci::T>
-    : super core::Object::•()
-    ;
-}
-class D<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::D<self::D::T>
-    : super core::Object::•()
-    ;
-}
-class Dc<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Dc<self::Dc::T>
-    : super core::Object::•()
-    ;
-}
-class Di<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Di<self::Di::T>
-    : super core::Object::•()
-    ;
-}
-class E<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::E<self::E::T>
-    : super core::Object::•()
-    ;
-}
-class Ec<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::Ec<self::Ec::T>
-    : super core::Object::•()
-    ;
-}
-class Ei<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::Ei<self::Ei::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _F&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Jffc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jffc<self::Jffc::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcf<self::Jfcf::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcc<self::Jfcc::T>
-    : super core::Object::•()
-    ;
-}
-class Jcff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcff<self::Jcff::T>
-    : super core::Object::•()
-    ;
-}
-class Jcfc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcfc<self::Jcfc::T>
-    : super core::Object::•()
-    ;
-}
-class Jccf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccf<self::Jccf::T>
-    : super core::Object::•()
-    ;
-}
-class Jccc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccc<self::Jccc::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.outline.expect b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.outline.expect
deleted file mode 100644
index 86bc0e3..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.outline.expect
+++ /dev/null
@@ -1,305 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> extends A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bc<T> extends A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bi<T> extends A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class C<T> implements A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Cc<T> implements A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ci<T> implements A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class D<T> = Object with A<Function(T)>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Dc<T> = Object with A<ContravariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Di<T> = Object with A<InvariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class E<T> = A<Function(T)> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ec<T> = A<ContravariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ei<T> = A<InvariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class F<T> extends Object with A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fc<T> extends Object with A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fi<T> extends Object with A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class G<T> extends A<Function(T)> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gi<T> extends A<InvariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfff<T> extends A<Function(Function(Function(T)))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef ContravariantUse<T extends core::Object = dynamic> = (T) → dynamic;
-typedef InvariantUse<T extends core::Object = dynamic> = (T) → T;
-class Empty extends core::Object {
-  synthetic constructor •() → self::Empty
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    ;
-}
-class Bc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bc<self::Bc::T>
-    ;
-}
-class Bi<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bi<self::Bi::T>
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-}
-class Cc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Cc<self::Cc::T>
-    ;
-}
-class Ci<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Ci<self::Ci::T>
-    ;
-}
-class D<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::D<self::D::T>
-    : super core::Object::•()
-    ;
-}
-class Dc<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Dc<self::Dc::T>
-    : super core::Object::•()
-    ;
-}
-class Di<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Di<self::Di::T>
-    : super core::Object::•()
-    ;
-}
-class E<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::E<self::E::T>
-    ;
-}
-class Ec<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ec<self::Ec::T>
-    ;
-}
-class Ei<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ei<self::Ei::T>
-    ;
-}
-abstract class _F&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-class F<T extends core::Object = dynamic> extends self::_F&Object&A<self::F::T> {
-  synthetic constructor •() → self::F<self::F::T>
-    ;
-}
-abstract class _Fc&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-class Fc<T extends core::Object = dynamic> extends self::_Fc&Object&A<self::Fc::T> {
-  synthetic constructor •() → self::Fc<self::Fc::T>
-    ;
-}
-abstract class _Fi&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-class Fi<T extends core::Object = dynamic> extends self::_Fi&Object&A<self::Fi::T> {
-  synthetic constructor •() → self::Fi<self::Fi::T>
-    ;
-}
-abstract class _G&A&Empty<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T>
-    ;
-}
-class G<T extends core::Object = dynamic> extends self::_G&A&Empty<self::G::T> {
-  synthetic constructor •() → self::G<self::G::T>
-    ;
-}
-abstract class _Gc&A&Empty<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T>
-    ;
-}
-class Gc<T extends core::Object = dynamic> extends self::_Gc&A&Empty<self::Gc::T> {
-  synthetic constructor •() → self::Gc<self::Gc::T>
-    ;
-}
-abstract class _Gi&A&Empty<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T>
-    ;
-}
-class Gi<T extends core::Object = dynamic> extends self::_Gi&A&Empty<self::Gi::T> {
-  synthetic constructor •() → self::Gi<self::Gi::T>
-    ;
-}
-class Hff<T extends core::Object = dynamic> extends self::A<((self::Hff::T) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Hff<self::Hff::T>
-    ;
-}
-class Hfc<T extends core::Object = dynamic> extends self::A<((self::Hfc::T) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Hfc<self::Hfc::T>
-    ;
-}
-class Hcf<T extends core::Object = dynamic> extends self::A<((self::Hcf::T) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Hcf<self::Hcf::T>
-    ;
-}
-class Hcc<T extends core::Object = dynamic> extends self::A<((self::Hcc::T) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Hcc<self::Hcc::T>
-    ;
-}
-class Hii<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hii<self::Hii::T>
-    ;
-}
-class Iafc<T extends core::Object = dynamic> extends self::A<self::A<((self::Iafc::T) → dynamic) → dynamic>> {
-  synthetic constructor •() → self::Iafc<self::Iafc::T>
-    ;
-}
-class Iacf<T extends core::Object = dynamic> extends self::A<self::A<((self::Iacf::T) → dynamic) → dynamic>> {
-  synthetic constructor •() → self::Iacf<self::Iacf::T>
-    ;
-}
-class Ifac<T extends core::Object = dynamic> extends self::A<(self::A<(self::Ifac::T) → dynamic>) → dynamic> {
-  synthetic constructor •() → self::Ifac<self::Ifac::T>
-    ;
-}
-class Ifca<T extends core::Object = dynamic> extends self::A<((self::A<self::Ifca::T>) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Ifca<self::Ifca::T>
-    ;
-}
-class Icaf<T extends core::Object = dynamic> extends self::A<(self::A<(self::Icaf::T) → dynamic>) → dynamic> {
-  synthetic constructor •() → self::Icaf<self::Icaf::T>
-    ;
-}
-class Icfa<T extends core::Object = dynamic> extends self::A<((self::A<self::Icfa::T>) → dynamic) → dynamic> {
-  synthetic constructor •() → self::Icfa<self::Icfa::T>
-    ;
-}
-class Jfff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfff<self::Jfff::T>
-    ;
-}
-class Jffc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jffc<self::Jffc::T>
-    ;
-}
-class Jfcf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcf<self::Jfcf::T>
-    ;
-}
-class Jfcc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcc<self::Jfcc::T>
-    ;
-}
-class Jcff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcff<self::Jcff::T>
-    ;
-}
-class Jcfc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcfc<self::Jcfc::T>
-    ;
-}
-class Jccf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccf<self::Jccf::T>
-    ;
-}
-class Jccc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccc<self::Jccc::T>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.expect b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.expect
deleted file mode 100644
index 74cdea4..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.expect
+++ /dev/null
@@ -1,343 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> extends A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bc<T> extends A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bi<T> extends A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class C<T> implements A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Cc<T> implements A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ci<T> implements A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class D<T> = Object with A<Function(T)>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Dc<T> = Object with A<ContravariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Di<T> = Object with A<InvariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class E<T> = A<Function(T)> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ec<T> = A<ContravariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ei<T> = A<InvariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class F<T> extends Object with A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fc<T> extends Object with A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fi<T> extends Object with A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class G<T> extends A<Function(T)> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gi<T> extends A<InvariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfff<T> extends A<Function(Function(Function(T)))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef ContravariantUse<T extends core::Object = dynamic> = (T) → dynamic;
-typedef InvariantUse<T extends core::Object = dynamic> = (T) → T;
-class Empty extends core::Object {
-  synthetic constructor •() → self::Empty
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class Bc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bc<self::Bc::T>
-    : super core::Object::•()
-    ;
-}
-class Bi<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bi<self::Bi::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-class Cc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Cc<self::Cc::T>
-    : super core::Object::•()
-    ;
-}
-class Ci<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Ci<self::Ci::T>
-    : super core::Object::•()
-    ;
-}
-class D<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::D<self::D::T>
-    : super core::Object::•()
-    ;
-}
-class Dc<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Dc<self::Dc::T>
-    : super core::Object::•()
-    ;
-}
-class Di<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Di<self::Di::T>
-    : super core::Object::•()
-    ;
-}
-class E<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::E<self::E::T>
-    : super core::Object::•()
-    ;
-}
-class Ec<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ec<self::Ec::T>
-    : super core::Object::•()
-    ;
-}
-class Ei<T extends core::Object = dynamic> = core::Object with self::Empty {
-  synthetic constructor •() → self::Ei<self::Ei::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _F&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Jffc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jffc<self::Jffc::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcf<self::Jfcf::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcc<self::Jfcc::T>
-    : super core::Object::•()
-    ;
-}
-class Jcff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcff<self::Jcff::T>
-    : super core::Object::•()
-    ;
-}
-class Jcfc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcfc<self::Jcfc::T>
-    : super core::Object::•()
-    ;
-}
-class Jccf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccf<self::Jccf::T>
-    : super core::Object::•()
-    ;
-}
-class Jccc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccc<self::Jccc::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect
deleted file mode 100644
index 87ac80d7..0000000
--- a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect
+++ /dev/null
@@ -1,343 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> extends A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:15:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bc<T> extends A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:17:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Bi<T> extends A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:19:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class C<T> implements A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:21:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Cc<T> implements A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:23:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ci<T> implements A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:25:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class D<T> = Object with A<Function(T)>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:27:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Dc<T> = Object with A<ContravariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:29:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Di<T> = Object with A<InvariantUse<T>>;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:31:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class E<T> = A<Function(T)> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:33:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ec<T> = A<ContravariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:35:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Ei<T> = A<InvariantUse<T>> with Empty;
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:37:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class F<T> extends Object with A<Function(T)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:39:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fc<T> extends Object with A<ContravariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:41:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Fi<T> extends Object with A<InvariantUse<T>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:43:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class G<T> extends A<Function(T)> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:45:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gc<T> extends A<ContravariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:47:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Gi<T> extends A<InvariantUse<T>> with Empty {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:57:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:71:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfff<T> extends A<Function(Function(Function(T)))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:73:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:75:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:77:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:79:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:81:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:83:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
-//       ^
-//
-// pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart:85:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class Jccc<T> extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef ContravariantUse<T extends core::Object = dynamic> = (T) → dynamic;
-typedef InvariantUse<T extends core::Object = dynamic> = (T) → T;
-class Empty extends core::Object {
-  synthetic constructor •() → self::Empty
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class Bc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bc<self::Bc::T>
-    : super core::Object::•()
-    ;
-}
-class Bi<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bi<self::Bi::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-class Cc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Cc<self::Cc::T>
-    : super core::Object::•()
-    ;
-}
-class Ci<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Ci<self::Ci::T>
-    : super core::Object::•()
-    ;
-}
-class D<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::D<self::D::T>
-    : super core::Object::•()
-    ;
-}
-class Dc<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Dc<self::Dc::T>
-    : super core::Object::•()
-    ;
-}
-class Di<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::Di<self::Di::T>
-    : super core::Object::•()
-    ;
-}
-class E<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::E<self::E::T>
-    : super core::Object::•()
-    ;
-}
-class Ec<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::Ec<self::Ec::T>
-    : super core::Object::•()
-    ;
-}
-class Ei<T extends core::Object = dynamic> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::Ei<self::Ei::T>
-    : super core::Object::•()
-    ;
-}
-abstract class _F&Object&A<T extends core::Object = dynamic> extends core::Object {
-  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Empty {
-  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Jffc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jffc<self::Jffc::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcf<self::Jfcf::T>
-    : super core::Object::•()
-    ;
-}
-class Jfcc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jfcc<self::Jfcc::T>
-    : super core::Object::•()
-    ;
-}
-class Jcff<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcff<self::Jcff::T>
-    : super core::Object::•()
-    ;
-}
-class Jcfc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jcfc<self::Jcfc::T>
-    : super core::Object::•()
-    ;
-}
-class Jccf<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccf<self::Jccf::T>
-    : super core::Object::•()
-    ;
-}
-class Jccc<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Jccc<self::Jccc::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
deleted file mode 100644
index abff6cf..0000000
--- a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  static method foo<Y extends core::Object = dynamic>() → self::A<self::B::foo::Y>
-    return null;
-}
-static method baz() → dynamic {
-  self::B::foo<dynamic>().bar<core::String>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
deleted file mode 100644
index abff6cf..0000000
--- a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  static method foo<Y extends core::Object = dynamic>() → self::A<self::B::foo::Y>
-    return null;
-}
-static method baz() → dynamic {
-  self::B::foo<dynamic>().bar<core::String>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect
deleted file mode 100644
index 8a919db..0000000
--- a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.outline.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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>
-    ;
-  method bar<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  static method foo<Y extends core::Object = dynamic>() → self::A<self::B::foo::Y>
-    ;
-}
-static method baz() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.expect
deleted file mode 100644
index 36e4cdc..0000000
--- a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  static method foo<Y extends core::Object = core::Object>() → self::A<self::B::foo::Y>
-    return null;
-}
-static method baz() → dynamic {
-  self::B::foo<core::Object>().{self::A::bar}<core::String>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.transformed.expect
deleted file mode 100644
index 36e4cdc..0000000
--- a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  static method foo<Y extends core::Object = core::Object>() → self::A<self::B::foo::Y>
-    return null;
-}
-static method baz() → dynamic {
-  self::B::foo<core::Object>().{self::A::bar}<core::String>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug21938.dart.legacy.expect b/pkg/front_end/testcases/bug21938.dart.legacy.expect
deleted file mode 100644
index a399b1b..0000000
--- a/pkg/front_end/testcases/bug21938.dart.legacy.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::Object x;
-  core::Function f;
-  x.call();
-  x.call(3);
-  f.call(5, 2);
-  x.call();
-  f.call;
-  f.call(5, 2);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug21938.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug21938.dart.legacy.transformed.expect
deleted file mode 100644
index a399b1b..0000000
--- a/pkg/front_end/testcases/bug21938.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::Object x;
-  core::Function f;
-  x.call();
-  x.call(3);
-  f.call(5, 2);
-  x.call();
-  f.call;
-  f.call(5, 2);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug21938.dart.strong.expect b/pkg/front_end/testcases/bug21938.dart.strong.expect
deleted file mode 100644
index aa88e80..0000000
--- a/pkg/front_end/testcases/bug21938.dart.strong.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/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();
-   ^";
-  invalid-expression "pkg/front_end/testcases/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);
-   ^";
-  f.call(5, 2);
-  invalid-expression "pkg/front_end/testcases/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();
-    ^^^^";
-  f.call;
-  f.call(5, 2);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart.legacy.expect b/pkg/front_end/testcases/bug30695.dart.legacy.expect
deleted file mode 100644
index 139b859..0000000
--- a/pkg/front_end/testcases/bug30695.dart.legacy.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^^^
-// pkg/front_end/testcases/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 dynamic foo = 42;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-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/bug30695.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug30695.dart.legacy.transformed.expect
deleted file mode 100644
index 139b859..0000000
--- a/pkg/front_end/testcases/bug30695.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^^^
-// pkg/front_end/testcases/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 dynamic foo = 42;
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-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/bug30695.dart.outline.expect b/pkg/front_end/testcases/bug30695.dart.outline.expect
deleted file mode 100644
index 81e64a5..0000000
--- a/pkg/front_end/testcases/bug30695.dart.outline.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^^^
-// pkg/front_end/testcases/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 dynamic foo;
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-  method foo() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug30695.dart.strong.expect b/pkg/front_end/testcases/bug30695.dart.strong.expect
deleted file mode 100644
index 30a8c8a..0000000
--- a/pkg/front_end/testcases/bug30695.dart.strong.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug30695.dart:11:3: Error: Can't declare a member that conflicts with an inherited one.
-//   foo() => 42;
-//   ^^^
-// pkg/front_end/testcases/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::•()
-    ;
-}
-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/bug31124.dart.legacy.expect b/pkg/front_end/testcases/bug31124.dart.legacy.expect
deleted file mode 100644
index 2e4b5ac..0000000
--- a/pkg/front_end/testcases/bug31124.dart.legacy.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
-// Try adding {}.
-// var a = () => 'b';a();
-//                      ^
-//
-// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
-// var a = () => 'b';a();
-//                   ^
-// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
-// var a = () => 'b';a();
-//     ^
-//
-import self as self;
-
-static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug31124.dart.legacy.transformed.expect
deleted file mode 100644
index 2e4b5ac..0000000
--- a/pkg/front_end/testcases/bug31124.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
-// Try adding {}.
-// var a = () => 'b';a();
-//                      ^
-//
-// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
-// var a = () => 'b';a();
-//                   ^
-// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
-// var a = () => 'b';a();
-//     ^
-//
-import self as self;
-
-static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.outline.expect b/pkg/front_end/testcases/bug31124.dart.outline.expect
deleted file mode 100644
index 2e4b5ac..0000000
--- a/pkg/front_end/testcases/bug31124.dart.outline.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
-// Try adding {}.
-// var a = () => 'b';a();
-//                      ^
-//
-// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
-// var a = () => 'b';a();
-//                   ^
-// pkg/front_end/testcases/bug31124.dart:1:5: Context: Previous declaration of 'a'.
-// var a = () => 'b';a();
-//     ^
-//
-import self as self;
-
-static field dynamic a;
diff --git a/pkg/front_end/testcases/bug31124.dart.strong.expect b/pkg/front_end/testcases/bug31124.dart.strong.expect
deleted file mode 100644
index 08413bb..0000000
--- a/pkg/front_end/testcases/bug31124.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
-// Try adding {}.
-// var a = () => 'b';a();
-//                      ^
-//
-// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
-// var a = () => 'b';a();
-//                   ^
-// pkg/front_end/testcases/bug31124.dart:1: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/bug31124.dart.strong.transformed.expect b/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
deleted file mode 100644
index 08413bb..0000000
--- a/pkg/front_end/testcases/bug31124.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug31124.dart:1:22: Error: Expected a function body or '=>'.
-// Try adding {}.
-// var a = () => 'b';a();
-//                      ^
-//
-// pkg/front_end/testcases/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
-// var a = () => 'b';a();
-//                   ^
-// pkg/front_end/testcases/bug31124.dart:1: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/bug32414a.dart b/pkg/front_end/testcases/bug32414a.dart
deleted file mode 100644
index 06a517c..0000000
--- a/pkg/front_end/testcases/bug32414a.dart
+++ /dev/null
@@ -1,13 +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.
-
-/*@testedFeatures=inference*/
-
-void test() {
-  dynamic a = 5;
-  var /*@type=String*/ b = a. /*@target=Object::toString*/ toString();
-  b = 42;
-}
-
-void main() {}
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.expect b/pkg/front_end/testcases/bug32414a.dart.strong.expect
deleted file mode 100644
index 6a9c726..0000000
--- a/pkg/front_end/testcases/bug32414a.dart.strong.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to '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}();
-  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  b = 42;
-      ^" in 42 as{TypeError} core::String;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
deleted file mode 100644
index 6a9c726..0000000
--- a/pkg/front_end/testcases/bug32414a.dart.strong.transformed.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to '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}();
-  b = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/bug32414a.dart:10:7: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  b = 42;
-      ^" in 42 as{TypeError} core::String;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect b/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect
deleted file mode 100644
index 6f70c2d..0000000
--- a/pkg/front_end/testcases/bug32414a.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/bug32414a.dart:10:5: Context: Write to b@302
-  b = 42;
-    ^
diff --git a/pkg/front_end/testcases/bug32414b.dart b/pkg/front_end/testcases/bug32414b.dart
deleted file mode 100644
index a9a0a7e..0000000
--- a/pkg/front_end/testcases/bug32414b.dart
+++ /dev/null
@@ -1,16 +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.
-
-/*@testedFeatures=inference*/
-
-void test() {
-  List<dynamic> l = /*@typeArgs=dynamic*/ [1, "hello"];
-  List<String> l2 = l
-      . /*@target=Iterable::map*/ /*@typeArgs=String*/ map(
-          /*@returnType=String*/ (dynamic element) =>
-              element. /*@target=Object::toString*/ toString())
-      . /*@target=Iterable::toList*/ toList();
-}
-
-void main() {}
diff --git a/pkg/front_end/testcases/bug32414b.dart.legacy.expect b/pkg/front_end/testcases/bug32414b.dart.legacy.expect
deleted file mode 100644
index 1a8ece7..0000000
--- a/pkg/front_end/testcases/bug32414b.dart.legacy.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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.map((dynamic element) → dynamic => element.toString()).toList();
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414b.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug32414b.dart.legacy.transformed.expect
deleted file mode 100644
index 1a8ece7..0000000
--- a/pkg/front_end/testcases/bug32414b.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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.map((dynamic element) → dynamic => element.toString()).toList();
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414b.dart.strong.expect b/pkg/front_end/testcases/bug32414b.dart.strong.expect
deleted file mode 100644
index 6a5fde9..0000000
--- a/pkg/front_end/testcases/bug32414b.dart.strong.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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::Iterable::toList}();
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414b.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32414b.dart.strong.transformed.expect
deleted file mode 100644
index 6a5fde9..0000000
--- a/pkg/front_end/testcases/bug32414b.dart.strong.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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::Iterable::toList}();
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32426.dart.legacy.expect b/pkg/front_end/testcases/bug32426.dart.legacy.expect
deleted file mode 100644
index c8ce03b..0000000
--- a/pkg/front_end/testcases/bug32426.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method call([core::int x = null]) → void {}
-}
-static method main() → dynamic {
-  self::I i = new self::C::•();
-  ([core::int]) → void f = i;
-}
diff --git a/pkg/front_end/testcases/bug32426.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug32426.dart.legacy.transformed.expect
deleted file mode 100644
index c8ce03b..0000000
--- a/pkg/front_end/testcases/bug32426.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method call([core::int x = null]) → void {}
-}
-static method main() → dynamic {
-  self::I i = new self::C::•();
-  ([core::int]) → void f = i;
-}
diff --git a/pkg/front_end/testcases/bug32426.dart.outline.expect b/pkg/front_end/testcases/bug32426.dart.outline.expect
deleted file mode 100644
index a6d026f..0000000
--- a/pkg/front_end/testcases/bug32426.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    ;
-  abstract method call() → void;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    ;
-  method call([core::int x]) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug32426.dart.strong.expect b/pkg/front_end/testcases/bug32426.dart.strong.expect
deleted file mode 100644
index fe47689..0000000
--- a/pkg/front_end/testcases/bug32426.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method call([core::int x = null]) → void {}
-}
-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}) as{TypeError} ([core::int]) → void;
-}
diff --git a/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect
deleted file mode 100644
index fe47689..0000000
--- a/pkg/front_end/testcases/bug32426.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method call([core::int x = null]) → void {}
-}
-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}) as{TypeError} ([core::int]) → void;
-}
diff --git a/pkg/front_end/testcases/bug32629.dart.legacy.expect b/pkg/front_end/testcases/bug32629.dart.legacy.expect
deleted file mode 100644
index e05c341..0000000
--- a/pkg/front_end/testcases/bug32629.dart.legacy.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Reducer<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;
-  }
-}
-static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void {}
-static method main() → void {
-  self::foo<core::String>(new self::A::•());
-}
diff --git a/pkg/front_end/testcases/bug32629.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug32629.dart.legacy.transformed.expect
deleted file mode 100644
index e05c341..0000000
--- a/pkg/front_end/testcases/bug32629.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Reducer<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;
-  }
-}
-static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void {}
-static method main() → void {
-  self::foo<core::String>(new self::A::•());
-}
diff --git a/pkg/front_end/testcases/bug32629.dart.outline.expect b/pkg/front_end/testcases/bug32629.dart.outline.expect
deleted file mode 100644
index cde3d8d..0000000
--- a/pkg/front_end/testcases/bug32629.dart.outline.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Reducer<S extends core::Object = dynamic> = (S, dynamic) → S;
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method call(dynamic a, dynamic b) → dynamic
-    ;
-}
-static method foo<S extends core::Object = dynamic>((self::foo::S, dynamic) → self::foo::S v) → void
-  ;
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/bug32866.dart.legacy.expect b/pkg/front_end/testcases/bug32866.dart.legacy.expect
deleted file mode 100644
index 5cf6726..0000000
--- a/pkg/front_end/testcases/bug32866.dart.legacy.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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;
-}
-class A extends core::Object implements self::B {
-  final field core::String f;
-  constructor •(dynamic f) → self::A
-    : self::A::f = f, super core::Object::•()
-    ;
-}
-static field dynamic a = new self::A::•("foo");
-static method main() → dynamic
-  return core::print(self::a);
diff --git a/pkg/front_end/testcases/bug32866.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug32866.dart.legacy.transformed.expect
deleted file mode 100644
index 5cf6726..0000000
--- a/pkg/front_end/testcases/bug32866.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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;
-}
-class A extends core::Object implements self::B {
-  final field core::String f;
-  constructor •(dynamic f) → self::A
-    : self::A::f = f, super core::Object::•()
-    ;
-}
-static field dynamic a = new self::A::•("foo");
-static method main() → dynamic
-  return core::print(self::a);
diff --git a/pkg/front_end/testcases/bug32866.dart.outline.expect b/pkg/front_end/testcases/bug32866.dart.outline.expect
deleted file mode 100644
index c902755..0000000
--- a/pkg/front_end/testcases/bug32866.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  abstract get f() → core::String;
-}
-class A extends core::Object implements self::B {
-  final field core::String f;
-  constructor •(dynamic f) → self::A
-    ;
-}
-static field dynamic a;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug32866.dart.strong.expect b/pkg/front_end/testcases/bug32866.dart.strong.expect
deleted file mode 100644
index 4428936..0000000
--- a/pkg/front_end/testcases/bug32866.dart.strong.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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;
-}
-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::•()
-    ;
-}
-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/bug32866.dart.strong.transformed.expect b/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect
deleted file mode 100644
index 4428936..0000000
--- a/pkg/front_end/testcases/bug32866.dart.strong.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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;
-}
-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::•()
-    ;
-}
-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/bug33099.dart.legacy.expect b/pkg/front_end/testcases/bug33099.dart.legacy.expect
deleted file mode 100644
index ac82f35..0000000
--- a/pkg/front_end/testcases/bug33099.dart.legacy.expect
+++ /dev/null
@@ -1,44 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:mirrors" as mir;
-
-class _FailingTest extends core::Object {
-  const constructor •() → void
-    : super core::Object::•()
-    ;
-}
-class MyTest extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
-}
-class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
-static const field self::_FailingTest failingTest = const self::_FailingTest::•();
-static method main() → dynamic {
-  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
-  classMirror.instanceMembers.forEach((core::Symbol symbol, mir::MethodMirror memberMirror) → dynamic {
-    if(memberMirror.simpleName.==(#foo)) {
-      core::print(memberMirror);
-      core::print(self::_hasFailingTestAnnotation(memberMirror));
-    }
-  });
-}
-static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
-  dynamic r = self::_hasAnnotationInstance(method, self::failingTest);
-  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
-  return r;
-}
-static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
-  return declaration.metadata.any((mir::InstanceMirror annotation) → dynamic {
-    core::print("annotation: ${annotation.reflectee}");
-    return core::identical(annotation.reflectee, instance);
-  });
diff --git a/pkg/front_end/testcases/bug33099.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33099.dart.legacy.transformed.expect
deleted file mode 100644
index d26b033..0000000
--- a/pkg/front_end/testcases/bug33099.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:mirrors" as mir;
-
-class _FailingTest extends core::Object {
-  const constructor •() → void
-    : super core::Object::•()
-    ;
-}
-class MyTest extends core::Object {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-abstract class _MyTest2&Object&MyTest extends core::Object implements self::MyTest {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → void
-    : super core::Object::•()
-    ;
-}
-static const field self::_FailingTest failingTest = const self::_FailingTest::•();
-static method main() → dynamic {
-  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
-  classMirror.instanceMembers.forEach((core::Symbol symbol, mir::MethodMirror memberMirror) → dynamic {
-    if(memberMirror.simpleName.==(#foo)) {
-      core::print(memberMirror);
-      core::print(self::_hasFailingTestAnnotation(memberMirror));
-    }
-  });
-}
-static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
-  dynamic r = self::_hasAnnotationInstance(method, self::failingTest);
-  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
-  return r;
-}
-static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
-  return declaration.metadata.any((mir::InstanceMirror annotation) → dynamic {
-    core::print("annotation: ${annotation.reflectee}");
-    return core::identical(annotation.reflectee, instance);
-  });
diff --git a/pkg/front_end/testcases/bug33099.dart.outline.expect b/pkg/front_end/testcases/bug33099.dart.outline.expect
deleted file mode 100644
index 1753eb4..0000000
--- a/pkg/front_end/testcases/bug33099.dart.outline.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:mirrors" as mir;
-
-import "dart:mirrors";
-
-class _FailingTest extends core::Object {
-  const constructor •() → self::_FailingTest
-    ;
-}
-class MyTest extends core::Object {
-  synthetic constructor •() → self::MyTest
-    ;
-  @self::failingTest
-  method foo() → void
-    ;
-}
-abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
-  const synthetic constructor •() → self::_MyTest2&Object&MyTest
-    : super core::Object::•()
-    ;
-}
-class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → self::MyTest2
-    ;
-}
-static const field self::_FailingTest failingTest = const self::_FailingTest::•();
-static method main() → dynamic
-  ;
-static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool
-  ;
-static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
-  ;
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.expect b/pkg/front_end/testcases/bug33099.dart.strong.expect
deleted file mode 100644
index 978c12b..0000000
--- a/pkg/front_end/testcases/bug33099.dart.strong.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:mirrors" as mir;
-
-import "dart:mirrors";
-
-class _FailingTest extends core::Object {
-  const constructor •() → self::_FailingTest
-    : super core::Object::•()
-    ;
-}
-class MyTest extends core::Object {
-  synthetic constructor •() → self::MyTest
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
-  const synthetic constructor •() → self::_MyTest2&Object&MyTest
-    : super core::Object::•()
-    ;
-}
-class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → self::MyTest2
-    : super self::_MyTest2&Object&MyTest::•()
-    ;
-}
-static const field self::_FailingTest failingTest = const self::_FailingTest::•();
-static method main() → dynamic {
-  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol symbol, mir::MethodMirror memberMirror) → core::Null {
-    if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#foo)) {
-      core::print(memberMirror);
-      core::print(self::_hasFailingTestAnnotation(memberMirror));
-    }
-  });
-}
-static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
-  core::bool r = self::_hasAnnotationInstance(method, self::failingTest);
-  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
-  return r;
-}
-static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
-  return declaration.{mir::DeclarationMirror::metadata}.{core::Iterable::any}((mir::InstanceMirror annotation) → core::bool {
-    core::print("annotation: ${annotation.{mir::InstanceMirror::reflectee}}");
-    return core::identical(annotation.{mir::InstanceMirror::reflectee}, instance);
-  });
diff --git a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
deleted file mode 100644
index 1a0aaa1..0000000
--- a/pkg/front_end/testcases/bug33099.dart.strong.transformed.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:mirrors" as mir;
-
-import "dart:mirrors";
-
-class _FailingTest extends core::Object {
-  const constructor •() → self::_FailingTest
-    : super core::Object::•()
-    ;
-}
-class MyTest extends core::Object {
-  synthetic constructor •() → self::MyTest
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-abstract class _MyTest2&Object&MyTest extends core::Object implements self::MyTest {
-  const synthetic constructor •() → self::_MyTest2&Object&MyTest
-    : super core::Object::•()
-    ;
-  @self::failingTest
-  method foo() → void {}
-}
-class MyTest2 extends self::_MyTest2&Object&MyTest {
-  synthetic constructor •() → self::MyTest2
-    : super self::_MyTest2&Object&MyTest::•()
-    ;
-}
-static const field self::_FailingTest failingTest = const self::_FailingTest::•();
-static method main() → dynamic {
-  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
-  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol symbol, mir::MethodMirror memberMirror) → core::Null {
-    if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#foo)) {
-      core::print(memberMirror);
-      core::print(self::_hasFailingTestAnnotation(memberMirror));
-    }
-  });
-}
-static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
-  core::bool r = self::_hasAnnotationInstance(method, self::failingTest);
-  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
-  return r;
-}
-static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
-  return declaration.{mir::DeclarationMirror::metadata}.{core::Iterable::any}((mir::InstanceMirror annotation) → core::bool {
-    core::print("annotation: ${annotation.{mir::InstanceMirror::reflectee}}");
-    return core::identical(annotation.{mir::InstanceMirror::reflectee}, instance);
-  });
diff --git a/pkg/front_end/testcases/bug33196.dart.legacy.expect b/pkg/front_end/testcases/bug33196.dart.legacy.expect
deleted file mode 100644
index 70357f0..0000000
--- a/pkg/front_end/testcases/bug33196.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-import "dart:async";
-
-static method main() → dynamic {
-  dynamic result = self::returnsString();
-  core::print(result.runtimeType);
-}
-static method returnsString() → asy::FutureOr<core::String> async {
-  return "oh no";
-}
diff --git a/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect
deleted file mode 100644
index 00e49aa..0000000
--- a/pkg/front_end/testcases/bug33196.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-import "dart:async";
-
-static method main() → dynamic {
-  dynamic result = self::returnsString();
-  core::print(result.runtimeType);
-}
-static method returnsString() → asy::FutureOr<core::String> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "oh no";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33196.dart.outline.expect b/pkg/front_end/testcases/bug33196.dart.outline.expect
deleted file mode 100644
index 09ab950..0000000
--- a/pkg/front_end/testcases/bug33196.dart.outline.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-import "dart:async";
-
-static method main() → dynamic
-  ;
-static method returnsString() → asy::FutureOr<core::String>
-  ;
diff --git a/pkg/front_end/testcases/bug33196.dart.strong.expect b/pkg/front_end/testcases/bug33196.dart.strong.expect
deleted file mode 100644
index 95912f8..0000000
--- a/pkg/front_end/testcases/bug33196.dart.strong.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-import "dart:async";
-
-static method main() → dynamic {
-  asy::FutureOr<core::String> result = self::returnsString();
-  core::print(result.{core::Object::runtimeType});
-}
-static method returnsString() → asy::FutureOr<core::String> async {
-  return "oh no";
-}
diff --git a/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect
deleted file mode 100644
index 6e20cd1..0000000
--- a/pkg/front_end/testcases/bug33196.dart.strong.transformed.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "dart:core" as core;
-
-import "dart:async";
-
-static method main() → dynamic {
-  asy::FutureOr<core::String> result = self::returnsString();
-  core::print(result.{core::Object::runtimeType});
-}
-static method returnsString() → asy::FutureOr<core::String> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::String> :async_completer = new asy::_AsyncAwaitCompleter::•<core::String>();
-  asy::FutureOr<core::String> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = "oh no";
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33206.dart.legacy.expect b/pkg/front_end/testcases/bug33206.dart.legacy.expect
deleted file mode 100644
index 1d53254..0000000
--- a/pkg/front_end/testcases/bug33206.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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}}, ${this.{self::X::y}})";
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    : super core::Object::•()
-    ;
-  method f(dynamic _) → dynamic {}
-}
-static method f1() → asy::Future<core::List<core::Object>> async {
-  return <dynamic>[1];
-}
-static method f2() → core::List<core::Object>
-  return <dynamic>[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 dynamic #t1 = new self::Y::•() in let final dynamic #t2 = #t1.f(await self::f1()) in let final dynamic #t3 = #t1.f(self::f2()) in #t1, await self::f3());
-}
-static method main() → asy::Future<void> async {
-  core::print(await self::foo());
-}
diff --git a/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect
deleted file mode 100644
index f484e4b..0000000
--- a/pkg/front_end/testcases/bug33206.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,139 +0,0 @@
-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}}, ${this.{self::X::y}})";
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    : super core::Object::•()
-    ;
-  method f(dynamic _) → dynamic {}
-}
-static method f1() → asy::Future<core::List<core::Object>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::Object>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object>>();
-  asy::FutureOr<core::List<core::Object>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <dynamic>[1];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method f2() → core::List<core::Object>
-  return <dynamic>[2];
-static method f3() → asy::Future<core::Object> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
-  asy::FutureOr<core::Object> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = 3;
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method foo() → asy::Future<self::X> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::X> :async_completer = new asy::_AsyncAwaitCompleter::•<self::X>();
-  asy::FutureOr<self::X> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L3:
-      {
-        final dynamic #t1 = new self::Y::•();
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final dynamic #t3 = #t1.f(:result);
-        final dynamic #t4 = #t1.f(self::f2());
-        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, :result);
-        break #L3;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
-  asy::FutureOr<void> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L4:
-      {
-        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33206.dart.outline.expect b/pkg/front_end/testcases/bug33206.dart.outline.expect
deleted file mode 100644
index 3dd6634..0000000
--- a/pkg/front_end/testcases/bug33206.dart.outline.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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
-    ;
-  method toString() → core::String
-    ;
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    ;
-  method f(dynamic _) → dynamic
-    ;
-}
-static method f1() → asy::Future<core::List<core::Object>>
-  ;
-static method f2() → core::List<core::Object>
-  ;
-static method f3() → asy::Future<core::Object>
-  ;
-static method foo() → asy::Future<self::X>
-  ;
-static method main() → asy::Future<void>
-  ;
diff --git a/pkg/front_end/testcases/bug33206.dart.strong.expect b/pkg/front_end/testcases/bug33206.dart.strong.expect
deleted file mode 100644
index a95aaef..0000000
--- a/pkg/front_end/testcases/bug33206.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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}}, ${this.{self::X::y}})";
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    : super core::Object::•()
-    ;
-  method f(dynamic _) → dynamic {}
-}
-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 let final dynamic #t2 = #t1.{self::Y::f}(await self::f1()) in let final dynamic #t3 = #t1.{self::Y::f}(self::f2()) in #t1, await self::f3());
-}
-static method main() → asy::Future<void> async {
-  core::print(await self::foo());
-}
diff --git a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
deleted file mode 100644
index 750e012..0000000
--- a/pkg/front_end/testcases/bug33206.dart.strong.transformed.expect
+++ /dev/null
@@ -1,139 +0,0 @@
-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}}, ${this.{self::X::y}})";
-}
-class Y extends core::Object {
-  synthetic constructor •() → self::Y
-    : super core::Object::•()
-    ;
-  method f(dynamic _) → dynamic {}
-}
-static method f1() → asy::Future<core::List<core::Object>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::Object>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object>>();
-  asy::FutureOr<core::List<core::Object>> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        :return_value = <core::Object>[1];
-        break #L1;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method f2() → core::List<core::Object>
-  return <core::Object>[2];
-static method f3() → asy::Future<core::Object> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Object> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object>();
-  asy::FutureOr<core::Object> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L2:
-      {
-        :return_value = 3;
-        break #L2;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method foo() → asy::Future<self::X> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<self::X> :async_completer = new asy::_AsyncAwaitCompleter::•<self::X>();
-  asy::FutureOr<self::X> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L3:
-      {
-        final self::Y #t1 = new self::Y::•();
-        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
-        final dynamic #t3 = #t1.{self::Y::f}(:result);
-        final dynamic #t4 = #t1.{self::Y::f}(self::f2());
-        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
-        :return_value = new self::X::•(#t1, :result);
-        break #L3;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → asy::Future<void> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<void> :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
-  asy::FutureOr<void> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L4:
-      {
-        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
-        core::print(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
diff --git a/pkg/front_end/testcases/bug33298.dart.legacy.expect b/pkg/front_end/testcases/bug33298.dart.legacy.expect
deleted file mode 100644
index c12d485..0000000
--- a/pkg/front_end/testcases/bug33298.dart.legacy.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-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::String s) → core::String
-    return "${s}${s}";
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-  method call(generic-covariant-impl self::B::T t) → self::B::T
-    return t;
-}
-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;
-}
-static method test() → dynamic {
-  self::A a = new self::A::•();
-  core::List<core::String> list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
-  core::List<core::String> list2 = <dynamic>["a", "b", "c"].map(a).toList();
-  self::B<core::String> b = new self::B::•<dynamic>();
-  core::List<core::String> list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
-  core::List<core::String> list4 = <dynamic>["a", "b", "c"].map(b).toList();
-  self::C c = new self::C::•();
-  core::List<core::String> list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
-  core::List<core::String> list6 = <dynamic>["a", "b", "c"].map(c).toList();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug33298.dart.legacy.transformed.expect
deleted file mode 100644
index c12d485..0000000
--- a/pkg/front_end/testcases/bug33298.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-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::String s) → core::String
-    return "${s}${s}";
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-  method call(generic-covariant-impl self::B::T t) → self::B::T
-    return t;
-}
-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;
-}
-static method test() → dynamic {
-  self::A a = new self::A::•();
-  core::List<core::String> list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
-  core::List<core::String> list2 = <dynamic>["a", "b", "c"].map(a).toList();
-  self::B<core::String> b = new self::B::•<dynamic>();
-  core::List<core::String> list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
-  core::List<core::String> list4 = <dynamic>["a", "b", "c"].map(b).toList();
-  self::C c = new self::C::•();
-  core::List<core::String> list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
-  core::List<core::String> list6 = <dynamic>["a", "b", "c"].map(c).toList();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.outline.expect b/pkg/front_end/testcases/bug33298.dart.outline.expect
deleted file mode 100644
index 1d7e071..0000000
--- a/pkg/front_end/testcases/bug33298.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method call(core::String s) → core::String
-    ;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    ;
-  method call(generic-covariant-impl self::B::T t) → self::B::T
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method call<T extends core::Object = dynamic>(self::C::call::T t) → self::C::call::T
-    ;
-}
-static method test() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.expect b/pkg/front_end/testcases/bug33298.dart.strong.expect
deleted file mode 100644
index 05c9f38..0000000
--- a/pkg/front_end/testcases/bug33298.dart.strong.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-// Try changing the type of the parameter, or casting the argument to '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}";
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-  method call(generic-covariant-impl self::B::T t) → self::B::T
-    return t;
-}
-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;
-}
-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::Iterable::toList}();
-  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::Iterable::toList}();
-  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::Iterable::toList}();
-  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::Iterable::toList}();
-  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}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
-  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
-                                           ^" in (let final self::C #t4 = c in #t4.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t4.{self::C::call}) as{TypeError} (core::String) → dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
deleted file mode 100644
index 05c9f38..0000000
--- a/pkg/front_end/testcases/bug33298.dart.strong.transformed.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-// Try changing the type of the parameter, or casting the argument to '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}";
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-  method call(generic-covariant-impl self::B::T t) → self::B::T
-    return t;
-}
-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;
-}
-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::Iterable::toList}();
-  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::Iterable::toList}();
-  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::Iterable::toList}();
-  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::Iterable::toList}();
-  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}<core::String>).{core::Iterable::toList}();
-  core::List<core::String> list6 = <core::String>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/bug33298.dart:28:44: Error: The argument type 'T Function<T>(T)' can't be assigned to the parameter type 'dynamic Function(String)'.
-Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
-  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
-                                           ^" in (let final self::C #t4 = c in #t4.==(null) ?{<T extends core::Object = dynamic>(self::C::call::T) → self::C::call::T} null : #t4.{self::C::call}) as{TypeError} (core::String) → dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String>;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug34511.dart.legacy.expect b/pkg/front_end/testcases/bug34511.dart.legacy.expect
deleted file mode 100644
index 4ba96c3..0000000
--- a/pkg/front_end/testcases/bug34511.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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 class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
-  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
-    : super core::Object::•()
-    ;
-}
-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/bug34511.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug34511.dart.legacy.transformed.expect
deleted file mode 100644
index fe93483..0000000
--- a/pkg/front_end/testcases/bug34511.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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 class _B&Object&A<Z extends core::Object = dynamic> extends core::Object implements self::A<() → self::_B&Object&A::Z> {
-  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
-    : super core::Object::•()
-    ;
-}
-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/bug34511.dart.outline.expect b/pkg/front_end/testcases/bug34511.dart.outline.expect
deleted file mode 100644
index 1d6dbda..0000000
--- a/pkg/front_end/testcases/bug34511.dart.outline.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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>
-    ;
-}
-abstract class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
-  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
-    : super core::Object::•()
-    ;
-}
-class B<Z extends core::Object = dynamic> extends self::_B&Object&A<self::B::Z> {
-  synthetic constructor •() → self::B<self::B::Z>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug34511.dart.strong.expect b/pkg/front_end/testcases/bug34511.dart.strong.expect
deleted file mode 100644
index 4ba96c3..0000000
--- a/pkg/front_end/testcases/bug34511.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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 class _B&Object&A<Z extends core::Object = dynamic> = core::Object with self::A<() → self::_B&Object&A::Z> {
-  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
-    : super core::Object::•()
-    ;
-}
-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/bug34511.dart.strong.transformed.expect b/pkg/front_end/testcases/bug34511.dart.strong.transformed.expect
deleted file mode 100644
index fe93483..0000000
--- a/pkg/front_end/testcases/bug34511.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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 class _B&Object&A<Z extends core::Object = dynamic> extends core::Object implements self::A<() → self::_B&Object&A::Z> {
-  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z>
-    : super core::Object::•()
-    ;
-}
-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/bug35470.dart.legacy.expect b/pkg/front_end/testcases/bug35470.dart.legacy.expect
deleted file mode 100644
index 630df24..0000000
--- a/pkg/front_end/testcases/bug35470.dart.legacy.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic {}
-}
-class B extends self::A<dynamic> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method bar(self::B b) → dynamic {
-  b.foo();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect b/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect
deleted file mode 100644
index 630df24..0000000
--- a/pkg/front_end/testcases/bug35470.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic {}
-}
-class B extends self::A<dynamic> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method bar(self::B b) → dynamic {
-  b.foo();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.outline.expect b/pkg/front_end/testcases/bug35470.dart.outline.expect
deleted file mode 100644
index 33d29f3..0000000
--- a/pkg/front_end/testcases/bug35470.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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>
-    ;
-  method foo<generic-covariant-impl Y extends self::A::X = dynamic>() → dynamic
-    ;
-}
-class B extends self::A<dynamic> {
-  synthetic constructor •() → self::B
-    ;
-}
-static method bar(self::B b) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/bug35470.dart.strong.expect b/pkg/front_end/testcases/bug35470.dart.strong.expect
deleted file mode 100644
index 53cb0c8..0000000
--- a/pkg/front_end/testcases/bug35470.dart.strong.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic {}
-}
-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>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect b/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect
deleted file mode 100644
index 53cb0c8..0000000
--- a/pkg/front_end/testcases/bug35470.dart.strong.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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<generic-covariant-impl Y extends self::A::X = self::A::X>() → dynamic {}
-}
-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>();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/call.dart.outline.expect b/pkg/front_end/testcases/call.dart.outline.expect
deleted file mode 100644
index 7a1cd9c..0000000
--- a/pkg/front_end/testcases/call.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Callable extends core::Object {
-  synthetic constructor •() → self::Callable
-    ;
-  method call(dynamic x) → dynamic
-    ;
-}
-class CallableGetter extends core::Object {
-  synthetic constructor •() → self::CallableGetter
-    ;
-  get call() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/call.dart.strong.expect b/pkg/front_end/testcases/call.dart.strong.expect
deleted file mode 100644
index 56f00c1..0000000
--- a/pkg/front_end/testcases/call.dart.strong.expect
+++ /dev/null
@@ -1,103 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/call.dart'.
-// Try changing 'call' to a method or explicitly invoke 'call'.
-//   var string5 = callableGetter(1);
-//                               ^
-//
-// pkg/front_end/testcases/call.dart:34:25: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing1 = closure();
-//                         ^
-//
-// pkg/front_end/testcases/call.dart:35:30: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing2 = closure.call();
-//                              ^
-//
-// pkg/front_end/testcases/call.dart:36:35: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing3 = closure.call.call();
-//                                   ^
-//
-// pkg/front_end/testcases/call.dart:37:40: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing4 = closure.call.call.call();
-//                                        ^
-//
-// pkg/front_end/testcases/call.dart:39:26: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing5 = callable();
-//                          ^
-//
-// pkg/front_end/testcases/call.dart:40:31: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing6 = callable.call();
-//                               ^
-//
-// pkg/front_end/testcases/call.dart:41:36: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing7 = callable.call.call();
-//                                    ^
-//
-// pkg/front_end/testcases/call.dart:42:41: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing8 = callable.call.call.call();
-//                                         ^
-//
-// pkg/front_end/testcases/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/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";
-  }
-}
-class CallableGetter extends core::Object {
-  synthetic constructor •() → self::CallableGetter
-    : super core::Object::•()
-    ;
-  get call() → dynamic
-    return new self::Callable::•();
-}
-static method main() → dynamic {
-  (dynamic) → dynamic closure = (dynamic x) → dynamic => x;
-  dynamic int1 = closure.call(1);
-  dynamic int2 = closure.call(1);
-  dynamic int3 = closure.call.call(1);
-  dynamic int4 = closure.call.call.call(1);
-  self::Callable callable = new self::Callable::•();
-  dynamic string1 = callable.{self::Callable::call}(1);
-  dynamic string2 = callable.{self::Callable::call}(1);
-  dynamic string3 = callable.{self::Callable::call}.call(1);
-  dynamic string4 = callable.{self::Callable::call}.call.call(1);
-  self::CallableGetter callableGetter = new self::CallableGetter::•();
-  dynamic string5 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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/call.dart'.
-Try changing 'call' to a method or explicitly invoke 'call'.
-  var string5 = callableGetter(1);
-                              ^" in callableGetter.{self::CallableGetter::call}(1);
-  dynamic string6 = callableGetter.{self::CallableGetter::call}(1);
-  dynamic string7 = callableGetter.{self::CallableGetter::call}.call(1);
-  dynamic string8 = callableGetter.{self::CallableGetter::call}.call.call(1);
-  dynamic nothing1 = closure.call();
-  dynamic nothing2 = closure.call();
-  dynamic nothing3 = closure.call.call();
-  dynamic nothing4 = closure.call.call.call();
-  dynamic nothing5 = callable.{self::Callable::call}();
-  dynamic nothing6 = callable.{self::Callable::call}();
-  dynamic nothing7 = callable.{self::Callable::call}.call();
-  dynamic nothing8 = callable.{self::Callable::call}.call.call();
-  dynamic nothing9 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/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/call.dart'.
-Try changing 'call' to a method or explicitly invoke 'call'.
-  var nothing9 = callableGetter();
-                               ^" in callableGetter.{self::CallableGetter::call}();
-  dynamic nothing10 = callableGetter.{self::CallableGetter::call}();
-  dynamic nothing11 = callableGetter.{self::CallableGetter::call}.call();
-  dynamic nothing12 = callableGetter.{self::CallableGetter::call}.call.call();
-}
diff --git a/pkg/front_end/testcases/cascade.dart.strong.expect b/pkg/front_end/testcases/cascade.dart.strong.expect
deleted file mode 100644
index 410fa63..0000000
--- a/pkg/front_end/testcases/cascade.dart.strong.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     [1]
-//     ^
-//
-// pkg/front_end/testcases/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/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
-//     ..first[0].toString()
-//            ^^
-//
-// pkg/front_end/testcases/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 let final dynamic #t2 = #t1.{core::List::add}(2) in let final dynamic #t3 = #t1.{core::List::add}(3) in let final dynamic #t4 = #t1.{core::List::addAll}(<core::int>[4, 5]) in #t1;
-  core::print(list);
-  let final core::List<core::int> #t5 = list in let final dynamic #t6 = #t5.{core::List::add}(2) in let final dynamic #t7 = #t5.{core::List::length} in let final dynamic #t8 = #t5.{core::List::length} = 0 in #t5;
-  core::print(list);
-  let final core::List<core::int> #t9 = list in let final dynamic #t10 = #t9.{core::List::add}(2) in let final dynamic #t11 = #t9.{core::List::[]}(0) in let final dynamic #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
-  core::print(list);
-  list = let final core::List<core::int> #t13 = <core::int>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    [1]
-    ^" in <core::int>[1] as{TypeError} core::int] in let final dynamic #t15 = invalid-expression "pkg/front_end/testcases/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()
-            ^^^^".{core::Object::toString}() in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
-    ..first[0].toString()
-           ^^".{core::Object::toString}() in let final dynamic #t17 = invalid-expression "pkg/front_end/testcases/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();
-          ^^^^".{core::Object::toString}() in #t13;
-  core::print(list);
-}
diff --git a/pkg/front_end/testcases/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/cascade.dart.strong.transformed.expect
deleted file mode 100644
index 0c5c75b..0000000
--- a/pkg/front_end/testcases/cascade.dart.strong.transformed.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     [1]
-//     ^
-//
-// pkg/front_end/testcases/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/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
-//     ..first[0].toString()
-//            ^^
-//
-// pkg/front_end/testcases/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 let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int>[4, 5]) in #t1;
-  core::print(list);
-  let final core::List<core::int> #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final core::int #t7 = #t5.{core::List::length} in let final core::int #t8 = #t5.{core::List::length} = 0 in #t5;
-  core::print(list);
-  let final core::List<core::int> #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final core::int #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
-  core::print(list);
-  list = let final core::List<core::int> #t13 = <core::int>[let final<BottomType> #t14 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    [1]
-    ^" in <core::int>[1] as{TypeError} core::int] in let final core::String #t15 = invalid-expression "pkg/front_end/testcases/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()
-            ^^^^".{core::Object::toString}() in let final core::String #t16 = invalid-expression "pkg/front_end/testcases/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
-    ..first[0].toString()
-           ^^".{core::Object::toString}() in let final core::String #t17 = invalid-expression "pkg/front_end/testcases/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();
-          ^^^^".{core::Object::toString}() in #t13;
-  core::print(list);
-}
diff --git a/pkg/front_end/testcases/cascade.dart.type_promotion.expect b/pkg/front_end/testcases/cascade.dart.type_promotion.expect
deleted file mode 100644
index 3d3e899..0000000
--- a/pkg/front_end/testcases/cascade.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/cascade.dart:25:8: Context: Write to list@232
-  list = [
-       ^
diff --git a/pkg/front_end/testcases/casts.dart.legacy.expect b/pkg/front_end/testcases/casts.dart.legacy.expect
deleted file mode 100644
index c75d8ec..0000000
--- a/pkg/front_end/testcases/casts.dart.legacy.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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/casts.dart.legacy.transformed.expect b/pkg/front_end/testcases/casts.dart.legacy.transformed.expect
deleted file mode 100644
index c75d8ec..0000000
--- a/pkg/front_end/testcases/casts.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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/casts.dart.strong.expect b/pkg/front_end/testcases/casts.dart.strong.expect
deleted file mode 100644
index c75d8ec..0000000
--- a/pkg/front_end/testcases/casts.dart.strong.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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/casts.dart.strong.transformed.expect b/pkg/front_end/testcases/casts.dart.strong.transformed.expect
deleted file mode 100644
index c75d8ec..0000000
--- a/pkg/front_end/testcases/casts.dart.strong.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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/check_deferred_allocation.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
deleted file mode 100644
index c660edf..0000000
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
deleted file mode 100644
index c660edf..0000000
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
deleted file mode 100644
index 0a70d79..0000000
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
deleted file mode 100644
index b5040a5..0000000
--- a/pkg/front_end/testcases/check_deferred_allocation.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect
deleted file mode 100644
index 6418d22..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.transformed.expect
deleted file mode 100644
index 6418d22..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_as_check.dart:9:8: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect
deleted file mode 100644
index 830d284..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test(dynamic x) → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
deleted file mode 100644
index a3e98a8..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
deleted file mode 100644
index a3e98a8..0000000
--- a/pkg/front_end/testcases/check_deferred_as_check.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
deleted file mode 100644
index e223280..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-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 = self::m2();
-  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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
deleted file mode 100644
index e223280..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-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 = self::m2();
-  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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.outline.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.outline.expect
deleted file mode 100644
index c9dc58d..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-static method m2() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
deleted file mode 100644
index 26b5b7d..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-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} 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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
deleted file mode 100644
index 1f4e6c8..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args.dart.strong.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-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 {
-  let final core::Object #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2() as{TypeError} core::int;
-  let final core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
deleted file mode 100644
index eebc07b..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
deleted file mode 100644
index 989c4c4..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-import "deferred_lib.dart" as def;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic {}
-static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        final dynamic #t1 = CheckLibraryIsLoaded(lib);
-        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
-        def::m(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.outline.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect
deleted file mode 100644
index 512b965..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
deleted file mode 100644
index 7b3dfb1..0000000
--- a/pkg/front_end/testcases/check_deferred_before_args2.dart.strong.transformed.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-library;
-import self as self;
-import "dart:async" as asy;
-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 /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        final core::Object #t1 = CheckLibraryIsLoaded(lib);
-        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
-        def::m(:result);
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
deleted file mode 100644
index 3cf5bf4..0000000
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
deleted file mode 100644
index 3cf5bf4..0000000
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.outline.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect
deleted file mode 100644
index feb2112..0000000
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
deleted file mode 100644
index b755990..0000000
--- a/pkg/front_end/testcases/check_deferred_before_call.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 {
-  let final core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
deleted file mode 100644
index 169b56c..0000000
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
deleted file mode 100644
index 169b56c..0000000
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.outline.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect
deleted file mode 100644
index 3fa478a..0000000
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
deleted file mode 100644
index 40b7cc6..0000000
--- a/pkg/front_end/testcases/check_deferred_before_write.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 {
-  let final core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect
deleted file mode 100644
index 0c3eb41..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.transformed.expect
deleted file mode 100644
index 0c3eb41..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_is_check.dart:9:14: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect
deleted file mode 100644
index 830d284..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test(dynamic x) → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
deleted file mode 100644
index 66f4760..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
deleted file mode 100644
index 66f4760..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.strong.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect
deleted file mode 100644
index fbbe754..0000000
--- a/pkg/front_end/testcases/check_deferred_is_check.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/check_deferred_is_check.dart:9:11: Context: Possible promotion of x@279
-  print(x is lib.C);
-          ^^
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
deleted file mode 100644
index 714d35c..0000000
--- a/pkg/front_end/testcases/check_deferred_read.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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).+(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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
deleted file mode 100644
index 714d35c..0000000
--- a/pkg/front_end/testcases/check_deferred_read.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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).+(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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.outline.expect b/pkg/front_end/testcases/check_deferred_read.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_read.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read.dart.strong.expect
deleted file mode 100644
index 500b9e9..0000000
--- a/pkg/front_end/testcases/check_deferred_read.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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));
-}
-
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
deleted file mode 100644
index 1e9676c..0000000
--- a/pkg/front_end/testcases/check_deferred_read.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 core::Object #t1 = CheckLibraryIsLoaded(lib) in def::x).{core::num::+}(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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
deleted file mode 100644
index 01f9ffd..0000000
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
deleted file mode 100644
index 01f9ffd..0000000
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
deleted file mode 100644
index a454d85..0000000
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
deleted file mode 100644
index c8d8259..0000000
--- a/pkg/front_end/testcases/check_deferred_read_static_field.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
deleted file mode 100644
index 8acc0bb..0000000
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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);
-}
-
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
deleted file mode 100644
index 8acc0bb..0000000
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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);
-}
-
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
deleted file mode 100644
index 413f2f6..0000000
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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);
-}
-
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
deleted file mode 100644
index 363f918..0000000
--- a/pkg/front_end/testcases/check_deferred_read_type.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 core::Object #t1 = CheckLibraryIsLoaded(lib) in 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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
deleted file mode 100644
index 5e32eae..0000000
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
deleted file mode 100644
index 5e32eae..0000000
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
deleted file mode 100644
index cf7b29c..0000000
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
deleted file mode 100644
index 0e05e8f..0000000
--- a/pkg/front_end/testcases/check_deferred_static_method_call.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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 core::Object #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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect
deleted file mode 100644
index 28e75e9..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.transformed.expect
deleted file mode 100644
index 28e75e9..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/check_deferred_type_declaration.dart:9:3: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect
deleted file mode 100644
index 6a4b7e5..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
-
-static method main() → dynamic
-  ;
-static method test() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field core::int y;
-  synthetic constructor •() → self2::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
deleted file mode 100644
index 923df91..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
deleted file mode 100644
index 923df91..0000000
--- a/pkg/front_end/testcases/check_deferred_type_declaration.dart.strong.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.expect
deleted file mode 100644
index d5ad6ef..0000000
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field dynamic f = new self::C::_circular(null);
-  constructor _circular(dynamic f) → self::C
-    : self::C::f = f, super core::Object::•()
-    ;
-}
-static field dynamic x = new self::C::_circular(null);
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.transformed.expect
deleted file mode 100644
index d5ad6ef..0000000
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field dynamic f = new self::C::_circular(null);
-  constructor _circular(dynamic f) → self::C
-    : self::C::f = f, super core::Object::•()
-    ;
-}
-static field dynamic x = new self::C::_circular(null);
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.outline.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.outline.expect
deleted file mode 100644
index b093152..0000000
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field dynamic f;
-  constructor _circular(dynamic f) → self::C
-    ;
-}
-static field dynamic x;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
deleted file mode 100644
index f034fa3..0000000
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static field self::C x = new self::C::_circular(null);
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect b/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
deleted file mode 100644
index f034fa3..0000000
--- a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static field self::C x = new self::C::_circular(null);
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/classes.dart.legacy.expect b/pkg/front_end/testcases/classes.dart.legacy.expect
deleted file mode 100644
index 7687edb..0000000
--- a/pkg/front_end/testcases/classes.dart.legacy.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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}} y: ${this.{self::A::y}}");
-    core::print(this);
-    core::print(this.{core::Object::runtimeType});
-  }
-}
-class B extends self::A {
-  constructor •(dynamic x) → self::B
-    : super self::A::•(x)
-    ;
-  method method() → dynamic {
-    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
-    super.{self::A::method}();
-  }
-}
-static method main() → dynamic {
-  self::A a = new self::A::•(87);
-  self::B b = new self::B::•(117);
-  a.method();
-  b.method();
-}
diff --git a/pkg/front_end/testcases/classes.dart.legacy.transformed.expect b/pkg/front_end/testcases/classes.dart.legacy.transformed.expect
deleted file mode 100644
index 7687edb..0000000
--- a/pkg/front_end/testcases/classes.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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}} y: ${this.{self::A::y}}");
-    core::print(this);
-    core::print(this.{core::Object::runtimeType});
-  }
-}
-class B extends self::A {
-  constructor •(dynamic x) → self::B
-    : super self::A::•(x)
-    ;
-  method method() → dynamic {
-    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
-    super.{self::A::method}();
-  }
-}
-static method main() → dynamic {
-  self::A a = new self::A::•(87);
-  self::B b = new self::B::•(117);
-  a.method();
-  b.method();
-}
diff --git a/pkg/front_end/testcases/classes.dart.outline.expect b/pkg/front_end/testcases/classes.dart.outline.expect
deleted file mode 100644
index 6900eb7..0000000
--- a/pkg/front_end/testcases/classes.dart.outline.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-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
-    ;
-  method method() → dynamic
-    ;
-}
-class B extends self::A {
-  constructor •(dynamic x) → self::B
-    ;
-  method method() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/classes.dart.strong.expect b/pkg/front_end/testcases/classes.dart.strong.expect
deleted file mode 100644
index 05cade4..0000000
--- a/pkg/front_end/testcases/classes.dart.strong.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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}} y: ${this.{self::A::y}}");
-    core::print(this);
-    core::print(this.{core::Object::runtimeType});
-  }
-}
-class B extends self::A {
-  constructor •(dynamic x) → self::B
-    : super self::A::•(x as{TypeError} core::int)
-    ;
-  method method() → dynamic {
-    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
-    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}();
-  b.{self::B::method}();
-}
diff --git a/pkg/front_end/testcases/classes.dart.strong.transformed.expect b/pkg/front_end/testcases/classes.dart.strong.transformed.expect
deleted file mode 100644
index 05cade4..0000000
--- a/pkg/front_end/testcases/classes.dart.strong.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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}} y: ${this.{self::A::y}}");
-    core::print(this);
-    core::print(this.{core::Object::runtimeType});
-  }
-}
-class B extends self::A {
-  constructor •(dynamic x) → self::B
-    : super self::A::•(x as{TypeError} core::int)
-    ;
-  method method() → dynamic {
-    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
-    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}();
-  b.{self::B::method}();
-}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.legacy.expect b/pkg/front_end/testcases/clone_function_type.dart.legacy.expect
deleted file mode 100644
index 3b90c1f..0000000
--- a/pkg/front_end/testcases/clone_function_type.dart.legacy.expect
+++ /dev/null
@@ -1,571 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
-// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
-// class Qm1<Z> = Object with Am1<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
-// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
-// class Qm2<Z> = Object with Am2<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
-// typedef TdF = Function({int});
-//                            ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
-// class Ef1<X extends Function({int})> {
-//                                  ^
-//
-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 class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
-  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
-  const synthetic constructor •() → self::Om1<self::Om1::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
-  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
-  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
-  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
-  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
-  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
-  const synthetic constructor •() → self::Um1<self::Um1::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
-  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
-  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
-    : super core::Object::•()
-    ;
-}
-abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
-  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
-  const synthetic constructor •() → self::Om2<self::Om2::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
-  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
-  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
-  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
-  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
-  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
-  const synthetic constructor •() → self::Um2<self::Um2::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
-  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
-  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
-    : super core::Object::•()
-    ;
-}
-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 class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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 = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
-    return null;
-}
-class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
-    return null;
-}
-class Cf1<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
-    return null;
-}
-class Df1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
-    return null;
-}
-class Ef1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
-    return null;
-}
-class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
-    return null;
-}
-class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
-    return null;
-}
-class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
-    return null;
-}
-class If1<X extends core::Function = dynamic> extends core::Object {
-  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
-    return null;
-}
-class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
-    return null;
-}
-class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
-    return null;
-}
-class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
-    return null;
-}
-class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
-    return null;
-}
-class Df2<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
-    return null;
-}
-class Ef2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
-    return null;
-}
-class Ff2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
-    return null;
-}
-class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
-    return null;
-}
-class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
-    return null;
-}
-class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
-    return null;
-}
-class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
-    return null;
-}
-class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect
deleted file mode 100644
index 69865bd..0000000
--- a/pkg/front_end/testcases/clone_function_type.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,571 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
-// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
-// class Qm1<Z> = Object with Am1<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
-// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
-// class Qm2<Z> = Object with Am2<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
-// typedef TdF = Function({int});
-//                            ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
-// class Ef1<X extends Function({int})> {
-//                                  ^
-//
-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 class _Bm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::int) → dynamic, self::Mm1::Z> {
-  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Nm1::Z> {
-  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Om1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::Om1::Z> {
-  const synthetic constructor •() → self::Om1<self::Om1::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Pm1::Z> {
-  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Qm1::Z> {
-  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
-  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
-  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
-  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Um1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::Um1::Z> {
-  const synthetic constructor •() → self::Um1<self::Um1::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
-  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
-  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
-    : super core::Object::•()
-    ;
-}
-abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::int) → dynamic, self::Mm2::Z> {
-  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Nm2::Z> {
-  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Om2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::Om2::Z> {
-  const synthetic constructor •() → self::Om2<self::Om2::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Pm2::Z> {
-  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Qm2::Z> {
-  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
-  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
-  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
-  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Um2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::Um2::Z> {
-  const synthetic constructor •() → self::Um2<self::Um2::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
-  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
-  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
-    : super core::Object::•()
-    ;
-}
-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 class _Bm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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 = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
-    return null;
-}
-class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
-    return null;
-}
-class Cf1<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
-    return null;
-}
-class Df1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
-    return null;
-}
-class Ef1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
-    return null;
-}
-class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
-    return null;
-}
-class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
-    return null;
-}
-class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
-    return null;
-}
-class If1<X extends core::Function = dynamic> extends core::Object {
-  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
-    return null;
-}
-class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
-    return null;
-}
-class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
-    return null;
-}
-class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
-    return null;
-}
-class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
-    return null;
-}
-class Df2<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
-    return null;
-}
-class Ef2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
-    return null;
-}
-class Ff2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
-    return null;
-}
-class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
-    return null;
-}
-class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
-    return null;
-}
-class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
-    return null;
-}
-class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
-    return null;
-}
-class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.outline.expect b/pkg/front_end/testcases/clone_function_type.dart.outline.expect
deleted file mode 100644
index 38d30b8..0000000
--- a/pkg/front_end/testcases/clone_function_type.dart.outline.expect
+++ /dev/null
@@ -1,537 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
-// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
-// class Qm1<Z> = Object with Am1<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
-// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
-// class Qm2<Z> = Object with Am2<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
-// typedef TdF = Function({int});
-//                            ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
-// class Ef1<X extends Function({int})> {
-//                                  ^
-//
-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>
-    ;
-}
-abstract class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Bm1<Z extends core::Object = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z> {
-  synthetic constructor •() → self::Bm1<self::Bm1::Z>
-    ;
-}
-abstract class _Cm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Cm1<Z extends core::Object = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z> {
-  synthetic constructor •() → self::Cm1<self::Cm1::Z>
-    ;
-}
-abstract class _Dm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Dm1<Z extends core::Object = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z> {
-  synthetic constructor •() → self::Dm1<self::Dm1::Z>
-    ;
-}
-abstract class _Em1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Em1<Z extends core::Object = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z> {
-  synthetic constructor •() → self::Em1<self::Em1::Z>
-    ;
-}
-abstract class _Fm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Fm1<Z extends core::Object = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z> {
-  synthetic constructor •() → self::Fm1<self::Fm1::Z>
-    ;
-}
-abstract class _Gm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Gm1<Z extends core::Object = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z> {
-  synthetic constructor •() → self::Gm1<self::Gm1::Z>
-    ;
-}
-abstract class _Hm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Hm1<Z extends core::Object = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z> {
-  synthetic constructor •() → self::Hm1<self::Hm1::Z>
-    ;
-}
-abstract class _Im1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Im1<Z extends core::Object = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z> {
-  synthetic constructor •() → self::Im1<self::Im1::Z>
-    ;
-}
-abstract class _Jm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Jm1<Z extends core::Object = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z> {
-  synthetic constructor •() → self::Jm1<self::Jm1::Z>
-    ;
-}
-abstract class _Km1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Km1<Z extends core::Object = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z> {
-  synthetic constructor •() → self::Km1<self::Km1::Z>
-    ;
-}
-abstract class _Lm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-class Lm1<Z extends core::Object = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z> {
-  synthetic constructor •() → self::Lm1<self::Lm1::Z>
-    ;
-}
-class Mm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Mm1::Z> {
-  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
-  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
-  const synthetic constructor •() → self::Om1<self::Om1::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
-  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
-  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
-  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
-  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
-  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
-  const synthetic constructor •() → self::Um1<self::Um1::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
-  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
-  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Am2<X extends () → dynamic = dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
-    ;
-}
-abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Bm2<Z extends core::Object = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z> {
-  synthetic constructor •() → self::Bm2<self::Bm2::Z>
-    ;
-}
-abstract class _Cm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Cm2<Z extends core::Object = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z> {
-  synthetic constructor •() → self::Cm2<self::Cm2::Z>
-    ;
-}
-abstract class _Dm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Dm2<Z extends core::Object = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z> {
-  synthetic constructor •() → self::Dm2<self::Dm2::Z>
-    ;
-}
-abstract class _Em2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Em2<Z extends core::Object = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z> {
-  synthetic constructor •() → self::Em2<self::Em2::Z>
-    ;
-}
-abstract class _Fm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Fm2<Z extends core::Object = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z> {
-  synthetic constructor •() → self::Fm2<self::Fm2::Z>
-    ;
-}
-abstract class _Gm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Gm2<Z extends core::Object = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z> {
-  synthetic constructor •() → self::Gm2<self::Gm2::Z>
-    ;
-}
-abstract class _Hm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Hm2<Z extends core::Object = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z> {
-  synthetic constructor •() → self::Hm2<self::Hm2::Z>
-    ;
-}
-abstract class _Im2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Im2<Z extends core::Object = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z> {
-  synthetic constructor •() → self::Im2<self::Im2::Z>
-    ;
-}
-abstract class _Jm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Jm2<Z extends core::Object = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z> {
-  synthetic constructor •() → self::Jm2<self::Jm2::Z>
-    ;
-}
-abstract class _Km2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Km2<Z extends core::Object = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z> {
-  synthetic constructor •() → self::Km2<self::Km2::Z>
-    ;
-}
-abstract class _Lm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-class Lm2<Z extends core::Object = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z> {
-  synthetic constructor •() → self::Lm2<self::Lm2::Z>
-    ;
-}
-class Mm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Mm2::Z> {
-  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
-  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
-  const synthetic constructor •() → self::Om2<self::Om2::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
-  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
-  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
-  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
-  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
-  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
-  const synthetic constructor •() → self::Um2<self::Um2::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
-  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
-  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
-    : super core::Object::•()
-    ;
-}
-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>
-    ;
-}
-abstract class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Bm3<Z extends core::Object = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z> {
-  synthetic constructor •() → self::Bm3<self::Bm3::Z>
-    ;
-}
-abstract class _Cm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Cm3<Z extends core::Object = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z> {
-  synthetic constructor •() → self::Cm3<self::Cm3::Z>
-    ;
-}
-abstract class _Dm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Dm3<Z extends core::Object = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z> {
-  synthetic constructor •() → self::Dm3<self::Dm3::Z>
-    ;
-}
-abstract class _Em3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Em3<Z extends core::Object = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z> {
-  synthetic constructor •() → self::Em3<self::Em3::Z>
-    ;
-}
-abstract class _Fm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Fm3<Z extends core::Object = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z> {
-  synthetic constructor •() → self::Fm3<self::Fm3::Z>
-    ;
-}
-abstract class _Gm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Gm3<Z extends core::Object = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z> {
-  synthetic constructor •() → self::Gm3<self::Gm3::Z>
-    ;
-}
-abstract class _Hm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Hm3<Z extends core::Object = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z> {
-  synthetic constructor •() → self::Hm3<self::Hm3::Z>
-    ;
-}
-abstract class _Im3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Im3<Z extends core::Object = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z> {
-  synthetic constructor •() → self::Im3<self::Im3::Z>
-    ;
-}
-abstract class _Jm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Jm3<Z extends core::Object = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z> {
-  synthetic constructor •() → self::Jm3<self::Jm3::Z>
-    ;
-}
-abstract class _Km3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-class Km3<Z extends core::Object = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z> {
-  synthetic constructor •() → self::Km3<self::Km3::Z>
-    ;
-}
-class Af1<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
-    ;
-}
-class Bf1<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
-    ;
-}
-class Cf1<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
-    ;
-}
-class Df1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
-    ;
-}
-class Ef1<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
-    ;
-}
-class Ff1<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
-    ;
-}
-class Gf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
-    ;
-}
-class Hf1<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
-    ;
-}
-class If1<X extends core::Function = dynamic> extends core::Object {
-  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
-    ;
-}
-class Jf1<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
-    ;
-}
-class Kf1<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
-    ;
-}
-class Bf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
-    ;
-}
-class Cf2<X extends (core::int) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
-    ;
-}
-class Df2<X extends () → core::int = dynamic> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
-    ;
-}
-class Ef2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
-    ;
-}
-class Ff2<X extends () → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
-    ;
-}
-class Gf2<X extends ({x: core::int}) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
-    ;
-}
-class Hf2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
-    ;
-}
-class If2<X extends ([core::int]) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
-    ;
-}
-class Jf2<X extends (core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
-    ;
-}
-class Kf2<X extends () → (() → core::Function) → dynamic = dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/clone_function_type.dart.strong.expect b/pkg/front_end/testcases/clone_function_type.dart.strong.expect
deleted file mode 100644
index 8263903..0000000
--- a/pkg/front_end/testcases/clone_function_type.dart.strong.expect
+++ /dev/null
@@ -1,639 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
-// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
-// class Qm1<Z> = Object with Am1<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
-// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
-// class Qm2<Z> = Object with Am2<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
-// typedef TdF = Function({int});
-//                            ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
-// class Ef1<X extends Function({int})> {
-//                                  ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 class _Bm1&Object&Am1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::int) → dynamic, self::Nm1::Z> {
-  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Om1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → core::int, self::Om1::Z> {
-  const synthetic constructor •() → self::Om1<self::Om1::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Pm1::Z> {
-  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → dynamic, self::Qm1::Z> {
-  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm1<Z extends core::Object = dynamic> = core::Object with self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
-  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
-  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm1<Z extends core::Object = dynamic> = core::Object with self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
-  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Um1<Z extends core::Object = dynamic> = core::Object with self::Am1<core::Function, self::Um1::Z> {
-  const synthetic constructor •() → self::Um1<self::Um1::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm1<Z extends core::Object = dynamic> = core::Object with self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
-  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm1<Z extends core::Object = dynamic> = core::Object with self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
-  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Am2<X extends () → dynamic = () → dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
-    : super core::Object::•()
-    ;
-}
-abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::int) → dynamic, self::Nm2::Z> {
-  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Om2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → core::int, self::Om2::Z> {
-  const synthetic constructor •() → self::Om2<self::Om2::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Pm2::Z> {
-  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → dynamic, self::Qm2::Z> {
-  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm2<Z extends core::Object = dynamic> = core::Object with self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
-  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
-  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm2<Z extends core::Object = dynamic> = core::Object with self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
-  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Um2<Z extends core::Object = dynamic> = core::Object with self::Am2<core::Function, self::Um2::Z> {
-  const synthetic constructor •() → self::Um2<self::Um2::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm2<Z extends core::Object = dynamic> = core::Object with self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
-  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm2<Z extends core::Object = dynamic> = core::Object with self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
-  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
-    : super core::Object::•()
-    ;
-}
-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 class _Bm3&Object&Am3<Z extends core::Object = dynamic> = core::Object with self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> {
-  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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 = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
-    return null;
-}
-class Bf1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
-    return null;
-}
-class Cf1<X extends () → core::int = () → core::int> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
-    return null;
-}
-class Df1<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
-    return null;
-}
-class Ef1<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
-    return null;
-}
-class Ff1<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
-    return null;
-}
-class Gf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
-    return null;
-}
-class Hf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
-    return null;
-}
-class If1<X extends core::Function = core::Function> extends core::Object {
-  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
-    return null;
-}
-class Jf1<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
-    return null;
-}
-class Kf1<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
-    return null;
-}
-class Bf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
-    return null;
-}
-class Cf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
-    return null;
-}
-class Df2<X extends () → core::int = () → core::int> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
-    return null;
-}
-class Ef2<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
-    return null;
-}
-class Ff2<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
-    return null;
-}
-class Gf2<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
-    return null;
-}
-class Hf2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
-    return null;
-}
-class If2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
-    return null;
-}
-class Jf2<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
-    return null;
-}
-class Kf2<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect
deleted file mode 100644
index 30416cc..0000000
--- a/pkg/front_end/testcases/clone_function_type.dart.strong.transformed.expect
+++ /dev/null
@@ -1,639 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
-// class Fm1<Z> extends Object with Am1<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:46:45: Error: Expected an identifier, but got '}'.
-// class Qm1<Z> = Object with Am1<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:77:51: Error: Expected an identifier, but got '}'.
-// class Fm2<Z> extends Object with Am2<Function({int}), Z> {}
-//                                                   ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:105:45: Error: Expected an identifier, but got '}'.
-// class Qm2<Z> = Object with Am2<Function({int}), Z>;
-//                                             ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:134:28: Error: Expected an identifier, but got '}'.
-// typedef TdF = Function({int});
-//                            ^
-//
-// pkg/front_end/testcases/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
-// class Ef1<X extends Function({int})> {
-//                                  ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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 class _Bm1&Object&Am1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Bm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::int) → dynamic, self::_Cm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → core::int, self::_Dm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → dynamic, self::_Em1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → dynamic, self::_Fm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::_Gm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Hm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<([core::int]) → dynamic, self::_Im1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<core::Function, self::_Jm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::Function) → dynamic, self::_Km1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::_Lm1&Object&Am1::Z> {
-  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am1<(core::int) → dynamic, self::Mm1::Z> {
-  const synthetic constructor •() → self::Mm1<self::Mm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::int) → dynamic, self::Nm1::Z> {
-  const synthetic constructor •() → self::Nm1<self::Nm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Om1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → core::int, self::Om1::Z> {
-  const synthetic constructor •() → self::Om1<self::Om1::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Pm1::Z> {
-  const synthetic constructor •() → self::Pm1<self::Pm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → dynamic, self::Qm1::Z> {
-  const synthetic constructor •() → self::Qm1<self::Qm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<({x: core::int}) → dynamic, self::Rm1::Z> {
-  const synthetic constructor •() → self::Rm1<self::Rm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Sm1::Z> {
-  const synthetic constructor •() → self::Sm1<self::Sm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<([core::int]) → dynamic, self::Tm1::Z> {
-  const synthetic constructor •() → self::Tm1<self::Tm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Um1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<core::Function, self::Um1::Z> {
-  const synthetic constructor •() → self::Um1<self::Um1::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<(core::Function) → dynamic, self::Vm1::Z> {
-  const synthetic constructor •() → self::Vm1<self::Vm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm1<Z extends core::Object = dynamic> extends core::Object implements self::Am1<() → (() → core::Function) → dynamic, self::Wm1::Z> {
-  const synthetic constructor •() → self::Wm1<self::Wm1::Z>
-    : super core::Object::•()
-    ;
-}
-class Am2<X extends () → dynamic = () → dynamic, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Am2<self::Am2::X, self::Am2::Y>
-    : super core::Object::•()
-    ;
-}
-abstract class _Bm2&Object&Am2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Bm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::int) → dynamic, self::_Cm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → core::int, self::_Dm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → dynamic, self::_Em2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → dynamic, self::_Fm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::_Gm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Hm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<([core::int]) → dynamic, self::_Im2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<core::Function, self::_Jm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::Function) → dynamic, self::_Km2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::_Lm2&Object&Am2::Z> {
-  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am2<(core::int) → dynamic, self::Mm2::Z> {
-  const synthetic constructor •() → self::Mm2<self::Mm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Nm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::int) → dynamic, self::Nm2::Z> {
-  const synthetic constructor •() → self::Nm2<self::Nm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Om2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → core::int, self::Om2::Z> {
-  const synthetic constructor •() → self::Om2<self::Om2::Z>
-    : super core::Object::•()
-    ;
-}
-class Pm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Pm2::Z> {
-  const synthetic constructor •() → self::Pm2<self::Pm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Qm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → dynamic, self::Qm2::Z> {
-  const synthetic constructor •() → self::Qm2<self::Qm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Rm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<({x: core::int}) → dynamic, self::Rm2::Z> {
-  const synthetic constructor •() → self::Rm2<self::Rm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Sm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Sm2::Z> {
-  const synthetic constructor •() → self::Sm2<self::Sm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Tm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<([core::int]) → dynamic, self::Tm2::Z> {
-  const synthetic constructor •() → self::Tm2<self::Tm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Um2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<core::Function, self::Um2::Z> {
-  const synthetic constructor •() → self::Um2<self::Um2::Z>
-    : super core::Object::•()
-    ;
-}
-class Vm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<(core::Function) → dynamic, self::Vm2::Z> {
-  const synthetic constructor •() → self::Vm2<self::Vm2::Z>
-    : super core::Object::•()
-    ;
-}
-class Wm2<Z extends core::Object = dynamic> extends core::Object implements self::Am2<() → (() → core::Function) → dynamic, self::Wm2::Z> {
-  const synthetic constructor •() → self::Wm2<self::Wm2::Z>
-    : super core::Object::•()
-    ;
-}
-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 class _Bm3&Object&Am3<Z extends core::Object = dynamic> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Bm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<(core::int) → dynamic, self::_Cm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → core::int, self::_Dm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → dynamic, self::_Em3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → dynamic, self::_Fm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<({x: core::int}) → dynamic, self::_Gm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Hm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<([core::int]) → dynamic, self::_Im3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<(core::Function) → dynamic, self::_Jm3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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> extends core::Object implements self::Am3<() → (() → core::Function) → dynamic, self::_Km3&Object&Am3::Z> {
-  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z>
-    : super core::Object::•()
-    ;
-}
-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 = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Af1<self::Af1::foo::X>
-    return null;
-}
-class Bf1<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X>
-    return null;
-}
-class Cf1<X extends () → core::int = () → core::int> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Cf1<self::Cf1::foo::X>
-    return null;
-}
-class Df1<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Df1<self::Df1::foo::X>
-    return null;
-}
-class Ef1<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X>
-    return null;
-}
-class Ff1<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X>
-    return null;
-}
-class Gf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X>
-    return null;
-}
-class Hf1<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X>
-    return null;
-}
-class If1<X extends core::Function = core::Function> extends core::Object {
-  static factory foo<X extends core::Function = dynamic>() → self::If1<self::If1::foo::X>
-    return null;
-}
-class Jf1<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X>
-    return null;
-}
-class Kf1<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X>
-    return null;
-}
-class Bf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X>
-    return null;
-}
-class Cf2<X extends (core::int) → dynamic = (core::int) → dynamic> extends core::Object {
-  static factory foo<X extends (core::int) → dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X>
-    return null;
-}
-class Df2<X extends () → core::int = () → core::int> extends core::Object {
-  static factory foo<X extends () → core::int = dynamic>() → self::Df2<self::Df2::foo::X>
-    return null;
-}
-class Ef2<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X>
-    return null;
-}
-class Ff2<X extends () → dynamic = () → dynamic> extends core::Object {
-  static factory foo<X extends () → dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X>
-    return null;
-}
-class Gf2<X extends ({x: core::int}) → dynamic = ({x: core::int}) → dynamic> extends core::Object {
-  static factory foo<X extends ({x: core::int}) → dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X>
-    return null;
-}
-class Hf2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X>
-    return null;
-}
-class If2<X extends ([core::int]) → dynamic = ([core::int]) → dynamic> extends core::Object {
-  static factory foo<X extends ([core::int]) → dynamic = dynamic>() → self::If2<self::If2::foo::X>
-    return null;
-}
-class Jf2<X extends (core::Function) → dynamic = (core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends (core::Function) → dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X>
-    return null;
-}
-class Kf2<X extends () → (() → core::Function) → dynamic = () → (() → core::Function) → dynamic> extends core::Object {
-  static factory foo<X extends () → (() → core::Function) → dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X>
-    return null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/closure.dart.legacy.expect b/pkg/front_end/testcases/closure.dart.legacy.expect
deleted file mode 100644
index 3d9b113..0000000
--- a/pkg/front_end/testcases/closure.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field dynamic _field = new self::Bar::•();
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-static method useCallback(dynamic callback) → dynamic {
-  dynamic _ = callback.call();
-}
-static method main() → dynamic {
-  dynamic x;
-  function inner() → dynamic {
-    x = new self::Foo::•();
-    return new self::Foo::•();
-  }
-  self::useCallback(inner);
-  dynamic _ = inner.call()._field;
-}
diff --git a/pkg/front_end/testcases/closure.dart.legacy.transformed.expect b/pkg/front_end/testcases/closure.dart.legacy.transformed.expect
deleted file mode 100644
index 3d9b113..0000000
--- a/pkg/front_end/testcases/closure.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field dynamic _field = new self::Bar::•();
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-static method useCallback(dynamic callback) → dynamic {
-  dynamic _ = callback.call();
-}
-static method main() → dynamic {
-  dynamic x;
-  function inner() → dynamic {
-    x = new self::Foo::•();
-    return new self::Foo::•();
-  }
-  self::useCallback(inner);
-  dynamic _ = inner.call()._field;
-}
diff --git a/pkg/front_end/testcases/closure.dart.outline.expect b/pkg/front_end/testcases/closure.dart.outline.expect
deleted file mode 100644
index 3fcc86f..0000000
--- a/pkg/front_end/testcases/closure.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field dynamic _field;
-  synthetic constructor •() → self::Foo
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    ;
-}
-static method useCallback(dynamic callback) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/closure.dart.strong.expect b/pkg/front_end/testcases/closure.dart.strong.expect
deleted file mode 100644
index 0f3d05d..0000000
--- a/pkg/front_end/testcases/closure.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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::•()
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-static method useCallback(dynamic callback) → dynamic {
-  dynamic _ = callback.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.call().{self::Foo::_field};
-}
diff --git a/pkg/front_end/testcases/closure.dart.strong.transformed.expect b/pkg/front_end/testcases/closure.dart.strong.transformed.expect
deleted file mode 100644
index 0f3d05d..0000000
--- a/pkg/front_end/testcases/closure.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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::•()
-    ;
-}
-class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-static method useCallback(dynamic callback) → dynamic {
-  dynamic _ = callback.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.call().{self::Foo::_field};
-}
diff --git a/pkg/front_end/testcases/closure.dart.type_promotion.expect b/pkg/front_end/testcases/closure.dart.type_promotion.expect
deleted file mode 100644
index a0203a7..0000000
--- a/pkg/front_end/testcases/closure.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/closure.dart:18:7: Context: Write to x@336
-    x = new Foo();
-      ^
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.expect
deleted file mode 100644
index 519be36..0000000
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
-// class B {}
-// ^^^^^
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
-// A()
-// ^
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
deleted file mode 100644
index 519be36..0000000
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
-// class B {}
-// ^^^^^
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
-// A()
-// ^
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect
deleted file mode 100644
index ea4f386..0000000
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.outline.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
-// class B {}
-// ^^^^^
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
-// A()
-// ^
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect
deleted file mode 100644
index 519be36..0000000
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
-// class B {}
-// ^^^^^
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
-// A()
-// ^
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect b/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
deleted file mode 100644
index 519be36..0000000
--- a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:21:1: Error: Expected '{' before this.
-// class B {}
-// ^^^^^
-//
-// pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart:20:1: Error: 'A' is already declared in this scope.
-// A()
-// ^
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect
deleted file mode 100644
index a77011e..0000000
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.expect
+++ /dev/null
@@ -1,110 +0,0 @@
-library;
-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 D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class G<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class W extends core::Object implements self::Z {
-  synthetic constructor •() → self::W
-    : super core::Object::•()
-    ;
-}
-class GX extends core::Object implements self::G<self::A> {
-  synthetic constructor •() → self::GX
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-class GW extends core::Object implements self::Z, self::GD {
-  synthetic constructor •() → self::GW
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-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/complex_class_hierarchy.dart.legacy.transformed.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect
deleted file mode 100644
index a77011e..0000000
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,110 +0,0 @@
-library;
-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 D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class G<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class W extends core::Object implements self::Z {
-  synthetic constructor •() → self::W
-    : super core::Object::•()
-    ;
-}
-class GX extends core::Object implements self::G<self::A> {
-  synthetic constructor •() → self::GX
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-class GW extends core::Object implements self::Z, self::GD {
-  synthetic constructor •() → self::GW
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-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/complex_class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect
deleted file mode 100644
index 0d412a05..0000000
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.outline.expect
+++ /dev/null
@@ -1,90 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-}
-class G<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
-    ;
-}
-class GB extends self::G<self::B> {
-  synthetic constructor •() → self::GB
-    ;
-}
-class GC extends self::G<self::C> {
-  synthetic constructor •() → self::GC
-    ;
-}
-class GD extends self::G<self::D> {
-  synthetic constructor •() → self::GD
-    ;
-}
-class X extends core::Object implements self::A {
-  synthetic constructor •() → self::X
-    ;
-}
-class Y extends self::X {
-  synthetic constructor •() → self::Y
-    ;
-}
-class Z extends core::Object implements self::Y {
-  synthetic constructor •() → self::Z
-    ;
-}
-class W extends core::Object implements self::Z {
-  synthetic constructor •() → self::W
-    ;
-}
-class GX extends core::Object implements self::G<self::A> {
-  synthetic constructor •() → self::GX
-    ;
-}
-class GY extends self::X implements self::GB {
-  synthetic constructor •() → self::GY
-    ;
-}
-class GZ extends core::Object implements self::Y, self::GC {
-  synthetic constructor •() → self::GZ
-    ;
-}
-class GW extends core::Object implements self::Z, self::GD {
-  synthetic constructor •() → self::GW
-    ;
-}
-class GU extends self::GW {
-  synthetic constructor •() → self::GU
-    ;
-}
-class GV extends self::GU implements self::GW {
-  synthetic constructor •() → self::GV
-    ;
-}
-class ARO<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::ARO<self::ARO::S>
-    ;
-}
-class ARQ<T extends core::Object = dynamic> extends core::Object implements self::ARO<self::ARQ::T> {
-  synthetic constructor •() → self::ARQ<self::ARQ::T>
-    ;
-}
-class ARN extends self::ARQ<self::A> {
-  synthetic constructor •() → self::ARN
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect
deleted file mode 100644
index af41678..0000000
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.expect
+++ /dev/null
@@ -1,110 +0,0 @@
-library;
-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 D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class G<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class W extends core::Object implements self::Z {
-  synthetic constructor •() → self::W
-    : super core::Object::•()
-    ;
-}
-class GX extends core::Object implements self::G<self::A> {
-  synthetic constructor •() → self::GX
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-class GW extends core::Object implements self::Z, self::GD {
-  synthetic constructor •() → self::GW
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-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/complex_class_hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect
deleted file mode 100644
index af41678..0000000
--- a/pkg/front_end/testcases/complex_class_hierarchy.dart.strong.transformed.expect
+++ /dev/null
@@ -1,110 +0,0 @@
-library;
-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 D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-class G<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class W extends core::Object implements self::Z {
-  synthetic constructor •() → self::W
-    : super core::Object::•()
-    ;
-}
-class GX extends core::Object implements self::G<self::A> {
-  synthetic constructor •() → self::GX
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-class GW extends core::Object implements self::Z, self::GD {
-  synthetic constructor •() → self::GW
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-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/constructor_const_inference.dart.legacy.expect b/pkg/front_end/testcases/constructor_const_inference.dart.legacy.expect
deleted file mode 100644
index fa5e33f..0000000
--- a/pkg/front_end/testcases/constructor_const_inference.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<dynamic>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().x;
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
deleted file mode 100644
index fa5e33f..0000000
--- a/pkg/front_end/testcases/constructor_const_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<dynamic>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().x;
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect b/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
deleted file mode 100644
index 2ad0826..0000000
--- a/pkg/front_end/testcases/constructor_const_inference.dart.outline.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::_Y<self::_Y::T>
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::_Y<self::A::T> x;
-  constructor •(self::_Y<self::A::T> x) → self::A<self::A::T>
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect b/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
deleted file mode 100644
index 4bf80e9..0000000
--- a/pkg/front_end/testcases/constructor_const_inference.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<core::Null>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
deleted file mode 100644
index 4bf80e9..0000000
--- a/pkg/front_end/testcases/constructor_const_inference.dart.strong.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _Y<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<core::Null>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.legacy.expect b/pkg/front_end/testcases/constructor_cycle.dart.legacy.expect
deleted file mode 100644
index e972c9c..0000000
--- a/pkg/front_end/testcases/constructor_cycle.dart.legacy.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-// Try to have all constructors eventually redirect to a non-redirecting constructor.
-//   A.bar() : this.foo();
-//                  ^^^
-//
-// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers 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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.legacy.transformed.expect
deleted file mode 100644
index e972c9c..0000000
--- a/pkg/front_end/testcases/constructor_cycle.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-// Try to have all constructors eventually redirect to a non-redirecting constructor.
-//   A.bar() : this.foo();
-//                  ^^^
-//
-// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers 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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.outline.expect b/pkg/front_end/testcases/constructor_cycle.dart.outline.expect
deleted file mode 100644
index 6151174..0000000
--- a/pkg/front_end/testcases/constructor_cycle.dart.outline.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  constructor foo() → self::A
-    ;
-  constructor bar() → self::A
-    ;
-  constructor baz() → self::A
-    ;
-  constructor •() → self::A
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
deleted file mode 100644
index e972c9c..0000000
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-// Try to have all constructors eventually redirect to a non-redirecting constructor.
-//   A.bar() : this.foo();
-//                  ^^^
-//
-// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers 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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
deleted file mode 100644
index e972c9c..0000000
--- a/pkg/front_end/testcases/constructor_cycle.dart.strong.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_cycle.dart:7:18: Error: Redirecting constructers can't be cyclic.
-// Try to have all constructors eventually redirect to a non-redirecting constructor.
-//   A.bar() : this.foo();
-//                  ^^^
-//
-// pkg/front_end/testcases/constructor_cycle.dart:9:9: Error: Redirecting constructers 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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.legacy.expect b/pkg/front_end/testcases/constructor_function_types.dart.legacy.expect
deleted file mode 100644
index 8dfce02..0000000
--- a/pkg/front_end/testcases/constructor_function_types.dart.legacy.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-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 •(core::int x, core::double y, core::String s) → self::B
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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/constructor_function_types.dart.legacy.transformed.expect b/pkg/front_end/testcases/constructor_function_types.dart.legacy.transformed.expect
deleted file mode 100644
index 8dfce02..0000000
--- a/pkg/front_end/testcases/constructor_function_types.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-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 •(core::int x, core::double y, core::String s) → self::B
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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/constructor_function_types.dart.outline.expect b/pkg/front_end/testcases/constructor_function_types.dart.outline.expect
deleted file mode 100644
index 21f7069..0000000
--- a/pkg/front_end/testcases/constructor_function_types.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  constructor •(core::int x, core::double y, core::String s) → self::B
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::C<self::C::T>
-    ;
-}
-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>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.strong.expect b/pkg/front_end/testcases/constructor_function_types.dart.strong.expect
deleted file mode 100644
index 8dfce02..0000000
--- a/pkg/front_end/testcases/constructor_function_types.dart.strong.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-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 •(core::int x, core::double y, core::String s) → self::B
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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/constructor_function_types.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_function_types.dart.strong.transformed.expect
deleted file mode 100644
index 8dfce02..0000000
--- a/pkg/front_end/testcases/constructor_function_types.dart.strong.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-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 •(core::int x, core::double y, core::String s) → self::B
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-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/constructor_initializer_invalid.dart.legacy.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.expect
deleted file mode 100644
index af3c198..0000000
--- a/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
-// class C1 { int f; C1() : ; }
-//                        ^
-//
-// pkg/front_end/testcases/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/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/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/constructor_initializer_invalid.dart:5:26: Error: This couldn't be parsed.
-class C1 { int f; C1() : ; }
-                         ^"
-    ;
-}
-class C2 extends core::Object {
-  field core::int f;
-  constructor •() → self::C2
-    : self::C2::f = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:6:27: Error: This couldn't be parsed.
-class C2 { int f; C2() : f; }
-                          ^", super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  field core::int f = null;
-  constructor •() → self::C3
-    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:7:26: Error: This couldn't be parsed.
-class C3 { int f; C3() : f++; }
-                         ^"
-    ;
-}
-static method main() → dynamic {
-  dynamic c1 = new self::C1::•();
-  c1.toString();
-  dynamic c2 = new self::C2::•();
-  c2.toString();
-  dynamic c3 = new self::C3::•();
-  c3.toString();
-}
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.transformed.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.transformed.expect
deleted file mode 100644
index af3c198..0000000
--- a/pkg/front_end/testcases/constructor_initializer_invalid.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
-// class C1 { int f; C1() : ; }
-//                        ^
-//
-// pkg/front_end/testcases/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/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/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/constructor_initializer_invalid.dart:5:26: Error: This couldn't be parsed.
-class C1 { int f; C1() : ; }
-                         ^"
-    ;
-}
-class C2 extends core::Object {
-  field core::int f;
-  constructor •() → self::C2
-    : self::C2::f = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:6:27: Error: This couldn't be parsed.
-class C2 { int f; C2() : f; }
-                          ^", super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  field core::int f = null;
-  constructor •() → self::C3
-    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:7:26: Error: This couldn't be parsed.
-class C3 { int f; C3() : f++; }
-                         ^"
-    ;
-}
-static method main() → dynamic {
-  dynamic c1 = new self::C1::•();
-  c1.toString();
-  dynamic c2 = new self::C2::•();
-  c2.toString();
-  dynamic c3 = new self::C3::•();
-  c3.toString();
-}
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.outline.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.outline.expect
deleted file mode 100644
index 38148ab..0000000
--- a/pkg/front_end/testcases/constructor_initializer_invalid.dart.outline.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
-// class C1 { int f; C1() : ; }
-//                        ^
-//
-// pkg/front_end/testcases/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/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++; }
-//                          ^
-//
-import self as self;
-import "dart:core" as core;
-
-class C1 extends core::Object {
-  field core::int f;
-  constructor •() → self::C1
-    ;
-}
-class C2 extends core::Object {
-  field core::int f;
-  constructor •() → self::C2
-    ;
-}
-class C3 extends core::Object {
-  field core::int f;
-  constructor •() → self::C3
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.expect
deleted file mode 100644
index eb5062e..0000000
--- a/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
-// class C1 { int f; C1() : ; }
-//                        ^
-//
-// pkg/front_end/testcases/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/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/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/constructor_initializer_invalid.dart:5:26: Error: This couldn't be parsed.
-class C1 { int f; C1() : ; }
-                         ^"
-    ;
-}
-class C2 extends core::Object {
-  field core::int f;
-  constructor •() → self::C2
-    : self::C2::f = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:6:27: Error: This couldn't be parsed.
-class C2 { int f; C2() : f; }
-                          ^" as{TypeError} core::int, super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  field core::int f = null;
-  constructor •() → self::C3
-    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:7:26: Error: This couldn't be parsed.
-class C3 { int f; C3() : f++; }
-                         ^"
-    ;
-}
-static method main() → dynamic {
-  self::C1 c1 = new self::C1::•();
-  c1.{core::Object::toString}();
-  self::C2 c2 = new self::C2::•();
-  c2.{core::Object::toString}();
-  self::C3 c3 = new self::C3::•();
-  c3.{core::Object::toString}();
-}
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.transformed.expect
deleted file mode 100644
index eb5062e..0000000
--- a/pkg/front_end/testcases/constructor_initializer_invalid.dart.strong.transformed.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/constructor_initializer_invalid.dart:5:24: Error: Expected an initializer.
-// class C1 { int f; C1() : ; }
-//                        ^
-//
-// pkg/front_end/testcases/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/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/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/constructor_initializer_invalid.dart:5:26: Error: This couldn't be parsed.
-class C1 { int f; C1() : ; }
-                         ^"
-    ;
-}
-class C2 extends core::Object {
-  field core::int f;
-  constructor •() → self::C2
-    : self::C2::f = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:6:27: Error: This couldn't be parsed.
-class C2 { int f; C2() : f; }
-                          ^" as{TypeError} core::int, super core::Object::•()
-    ;
-}
-class C3 extends core::Object {
-  field core::int f = null;
-  constructor •() → self::C3
-    : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/constructor_initializer_invalid.dart:7:26: Error: This couldn't be parsed.
-class C3 { int f; C3() : f++; }
-                         ^"
-    ;
-}
-static method main() → dynamic {
-  self::C1 c1 = new self::C1::•();
-  c1.{core::Object::toString}();
-  self::C2 c2 = new self::C2::•();
-  c2.{core::Object::toString}();
-  self::C3 c3 = new self::C3::•();
-  c3.{core::Object::toString}();
-}
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.expect
deleted file mode 100644
index cc8231e..0000000
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
-//   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::•()
-    ;
-}
-static method test() → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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 #t2 = new self::C::•().missing() in null;
-}
-static method main() → dynamic {}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.transformed.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.transformed.expect
deleted file mode 100644
index cc8231e..0000000
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/continue_inference_after_error.dart:10:3: Error: A prefix can't be used as an expression.
-//   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::•()
-    ;
-}
-static method test() → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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 #t2 = new self::C::•().missing() in null;
-}
-static method main() → dynamic {}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.outline.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.outline.expect
deleted file mode 100644
index a03ecdb..0000000
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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
-    ;
-}
-static method test() → dynamic
-  ;
-static method main() → dynamic
-  ;
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect
deleted file mode 100644
index c8d3090..0000000
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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::•()
-    ;
-}
-static method test() → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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 #t2 = invalid-expression "pkg/front_end/testcases/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/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 null;
-}
-static method main() → dynamic {}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect b/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect
deleted file mode 100644
index c8d3090..0000000
--- a/pkg/front_end/testcases/continue_inference_after_error.dart.strong.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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::•()
-    ;
-}
-static method test() → dynamic {
-  let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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 #t2 = invalid-expression "pkg/front_end/testcases/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/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 null;
-}
-static method main() → dynamic {}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart b/pkg/front_end/testcases/control_flow_collection.dart
deleted file mode 100644
index 987769f..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart
+++ /dev/null
@@ -1,39 +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.
-
-main() {
-  final aList = <int>[
-      1,
-      if (oracle()) 2,
-      if (oracle()) 3 else -1,
-      if (oracle()) if (oracle()) 4,
-      for (int i in <int>[5, 6, 7]) i,
-      for (int i in <int>[8, 9, 10]) if (oracle()) i,
-      for (int i = 11; i <= 14; ++i) i,
-  ];
-  final aSet = <int>{
-      1,
-      if (oracle()) 2,
-      if (oracle()) 3 else -1,
-      if (oracle()) if (oracle()) 4,
-      for (int i in <int>[5, 6, 7]) i,
-      for (int i in <int>[8, 9, 10]) if (oracle()) i,
-      for (int i = 11; i <= 14; ++i) i,
-  };
-  final aMap = <int, int>{
-      1: 1,
-      if (oracle()) 2: 2,
-      if (oracle()) 3: 3 else -1: -1,
-      if (oracle()) if (oracle()) 4: 4,
-      for (int i in <int>[5, 6, 7]) i: i,
-      for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
-      for (int i = 11; i <= 14; ++i) i: i,
-  };
-
-  print(aList);
-  print(aSet);
-  print(aMap);
-}
-
-oracle() => true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.legacy.expect b/pkg/front_end/testcases/control_flow_collection.dart.legacy.expect
deleted file mode 100644
index 099350f..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart.legacy.expect
+++ /dev/null
@@ -1,113 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/control_flow_collection.dart:8:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:9:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3 else -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:10:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:10:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:11:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:12:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:12:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:13:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:17:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:18:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3 else -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:19:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:19:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:20:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:21:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:21:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:22:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:26:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2: 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:27:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3: 3 else -1: -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:28:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4: 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:28:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4: 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:29:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i: i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:30:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:30:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:31:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i: i,
-//       ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  final dynamic aList = <core::int>[1];
-  final dynamic aSet = <core::int>{1};
-  final dynamic aMap = <core::int, core::int>{1: 1};
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method oracle() → dynamic
-  return true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect b/pkg/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect
deleted file mode 100644
index 099350f..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,113 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/control_flow_collection.dart:8:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:9:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3 else -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:10:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:10:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:11:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:12:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:12:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:13:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:17:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:18:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3 else -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:19:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:19:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:20:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:21:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:21:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:22:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:26:7: Error: Unexpected token 'if'.
-//       if (oracle()) 2: 2,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:27:7: Error: Unexpected token 'if'.
-//       if (oracle()) 3: 3 else -1: -1,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:28:21: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4: 4,
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:28:7: Error: Unexpected token 'if'.
-//       if (oracle()) if (oracle()) 4: 4,
-//       ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:29:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[5, 6, 7]) i: i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:30:38: Error: Unexpected token 'if'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
-//                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:30:7: Error: Unexpected token 'for'.
-//       for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
-//       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection.dart:31:7: Error: Unexpected token 'for'.
-//       for (int i = 11; i <= 14; ++i) i: i,
-//       ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  final dynamic aList = <core::int>[1];
-  final dynamic aSet = <core::int>{1};
-  final dynamic aMap = <core::int, core::int>{1: 1};
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method oracle() → dynamic
-  return true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.strong.expect b/pkg/front_end/testcases/control_flow_collection.dart.strong.expect
deleted file mode 100644
index 8c19425..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart.strong.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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>[];
-    #t1.{core::List::add}(1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t1.{core::List::add}(2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t1.{core::List::add}(3);
-    else
-      #t1.{core::List::add}(1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t1.{core::List::add}(4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t1.{core::List::add}(i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t1.{core::List::add}(i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
-  } =>#t1;
-  final core::Set<core::int> aSet = block {
-    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
-    #t2.{core::Set::add}(1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t2.{core::Set::add}(2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t2.{core::Set::add}(3);
-    else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t2.{core::Set::add}(4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t2.{core::Set::add}(i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t2.{core::Set::add}(i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
-  } =>#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::[]=}(1, 1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t3.{core::Map::[]=}(2, 2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t3.{core::Map::[]=}(3, 3);
-    else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t3.{core::Map::[]=}(4, 4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t3.{core::Map::[]=}(i, i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
-  } =>#t3;
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method oracle() → dynamic
-  return true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/control_flow_collection.dart.strong.transformed.expect
deleted file mode 100644
index 8c19425..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart.strong.transformed.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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>[];
-    #t1.{core::List::add}(1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t1.{core::List::add}(2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t1.{core::List::add}(3);
-    else
-      #t1.{core::List::add}(1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t1.{core::List::add}(4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t1.{core::List::add}(i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t1.{core::List::add}(i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t1.{core::List::add}(i);
-  } =>#t1;
-  final core::Set<core::int> aSet = block {
-    final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>();
-    #t2.{core::Set::add}(1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t2.{core::Set::add}(2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t2.{core::Set::add}(3);
-    else
-      #t2.{core::Set::add}(1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t2.{core::Set::add}(4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t2.{core::Set::add}(i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t2.{core::Set::add}(i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t2.{core::Set::add}(i);
-  } =>#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::[]=}(1, 1);
-    if(self::oracle() as{TypeError} core::bool)
-      #t3.{core::Map::[]=}(2, 2);
-    if(self::oracle() as{TypeError} core::bool)
-      #t3.{core::Map::[]=}(3, 3);
-    else
-      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
-    if(self::oracle() as{TypeError} core::bool)
-      if(self::oracle() as{TypeError} core::bool)
-        #t3.{core::Map::[]=}(4, 4);
-    for (core::int i in <core::int>[5, 6, 7])
-      #t3.{core::Map::[]=}(i, i);
-    for (core::int i in <core::int>[8, 9, 10])
-      if(self::oracle() as{TypeError} core::bool)
-        #t3.{core::Map::[]=}(i, i);
-    for (core::int i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
-      #t3.{core::Map::[]=}(i, i);
-  } =>#t3;
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method oracle() → dynamic
-  return true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.type_promotion.expect b/pkg/front_end/testcases/control_flow_collection.dart.type_promotion.expect
deleted file mode 100644
index 5476097..0000000
--- a/pkg/front_end/testcases/control_flow_collection.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/control_flow_collection.dart:13:33: Context: Write to i@364
-      for (int i = 11; i <= 14; ++i) i,
-                                ^^
-pkg/front_end/testcases/control_flow_collection.dart:22:33: Context: Write to i@364
-      for (int i = 11; i <= 14; ++i) i,
-                                ^^
-pkg/front_end/testcases/control_flow_collection.dart:31:33: Context: Write to i@364
-      for (int i = 11; i <= 14; ++i) i: i,
-                                ^^
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.expect
deleted file mode 100644
index ffd86f8..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.expect
+++ /dev/null
@@ -1,2036 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
-//   var list10 = [if (oracle("foo")) 42];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
-//   var set10 = {if (oracle("foo")) 42, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
-//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
-//   var list11 = [if (oracle("foo")) dynVar];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
-//   var set11 = {if (oracle("foo")) dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
-//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
-//   var list12 = [if (oracle("foo")) [42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
-//   var set12 = {if (oracle("foo")) [42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
-//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
-//   var list20 = [if (oracle("foo")) ...[42]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
-//   var list20 = [if (oracle("foo")) ...[42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
-//   var set20 = {if (oracle("foo")) ...[42], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
-//   var set20 = {if (oracle("foo")) ...[42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
-//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
-//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
-//   var list21 = [if (oracle("foo")) ...[dynVar]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
-//   var list21 = [if (oracle("foo")) ...[dynVar]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
-//   var set21 = {if (oracle("foo")) ...[dynVar], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
-//   var set21 = {if (oracle("foo")) ...[dynVar], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
-//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
-//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
-//   var list22 = [if (oracle("foo")) ...[[42]]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
-//   var list22 = [if (oracle("foo")) ...[[42]]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
-//   var set22 = {if (oracle("foo")) ...[[42]], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
-//   var set22 = {if (oracle("foo")) ...[[42]], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
-//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
-//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
-//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
-//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
-//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
-//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
-//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
-//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
-//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
-//   List<int> list50 = [if (oracle("foo")) ...[]];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
-//   List<int> list50 = [if (oracle("foo")) ...[]];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
-//   Set<int> set50 = {if (oracle("foo")) ...[], null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
-//   Set<int> set50 = {if (oracle("foo")) ...[], null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
-//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
-//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
-//   List<int> list51 = [if (oracle("foo")) ...{}];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
-//   List<int> list51 = [if (oracle("foo")) ...{}];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
-//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
-//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
-//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
-//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
-//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
-//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
-//   List<List<int>> list70 = [if (oracle("foo")) []];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
-//   var list80 = [if (oracle("foo")) 42 else 3.14];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
-//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
-//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
-//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
-//                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
-//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
-//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
-//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
-//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
-//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
-//   List<int> list90 = [if (oracle("foo")) dynVar];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
-//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
-//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
-//   List<int> list91 = [if (oracle("foo")) ...dynVar];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
-//   List<int> list91 = [if (oracle("foo")) ...dynVar];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
-//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
-//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
-//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
-//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
-//   List<int> list100 = [if (dynVar) 42];
-//                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
-//   Set<int> set100 = {if (dynVar) 42};
-//                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
-//   Map<int, int> map100 = {if (dynVar) 42: 42};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) "bar"];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) "bar", null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...map];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...map];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//            ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//            ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...map else 42];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...map else 42];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) 42 else ...map];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) 42 else ...map];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
-//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
-//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
-//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
-//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
-//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
-//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
-//   List<int> list20 = [if (42) 42];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
-//   Set<int> set20 = {if (42) 42};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
-//   Map<int, int> map30 = {if (42) 42: 42};
-//                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:42: Error: Unexpected token 'if'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
-//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
-//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
-//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
-//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
-//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
-//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
-//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
-//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
-//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
-//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
-//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
-//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
-//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
-//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
-//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
-//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
-//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
-//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
-//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
-//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
-//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
-//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
-//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
-//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
-//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
-//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
-//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
-//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
-//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
-//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
-//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
-//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
-//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
-//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
-//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
-//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
-//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
-//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
-//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
-//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
-//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
-//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
-//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
-//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                                                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                                                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
-//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
-//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
-//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
-//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
-//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
-//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
-//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
-//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
-//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
-//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
-//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:179:16: Error: Unexpected token 'for'.
-//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:67: Error: Unexpected token '...'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
-//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
-//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
-//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
-//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
-//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
-//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
-//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
-//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
-//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
-//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
-//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
-//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-//                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
-//   var list110 = [for (var i in [1, 2, 3]) i];
-//                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
-//   var set110 = {for (var i in [1, 2, 3]) i, null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
-//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
-//   List<int> list120 = [for (var i in dynVar) i];
-//                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
-//   Set<int> set120 = {for (var i in dynVar) i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
-//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
-//                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
-//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
-//                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
-//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
-//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:12: Error: Unexpected token 'for'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:48: Error: Unexpected token 'if'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:12: Error: Unexpected token 'for'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:56: Error: Unexpected token 'if'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:20: Error: Unexpected token 'for'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:59: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:67: Error: Unexpected token '...'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:53: Error: Unexpected token 'if'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:17: Error: Unexpected token 'for'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:67: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:82: Error: Unexpected token '...'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:53: Error: Unexpected token 'if'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:17: Error: Unexpected token 'for'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:230:9: Error: Unexpected token 'for'.
-//   <int>[for (i in <int>[1]) i];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
-//   <int>{for (i in <int>[1]) i, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
-// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
-// 	              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
-//   var list10 = [for (var i in "not iterable") i];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
-//   var set10 = {for (var i in "not iterable") i, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
-//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
-//   var list30 = [await for (var i in "not stream") i];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
-//   var set30 = {await for (var i in "not stream") i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
-//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:246:23: Error: Unexpected token 'for'.
-//   var list50 = [await for (;;) 42];
-//                       ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:247:22: Error: Unexpected token 'for'.
-//   var set50 = {await for (;;) 42, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:248:22: Error: Unexpected token 'for'.
-//   var map50 = {await for (;;) "bar": 42, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
-//   var list60 = [for (; "not bool";) 42];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
-//   var set60 = {for (; "not bool";) 42, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
-//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:255:15: Error: Unexpected token 'for'.
-//   <int>[await for (int i in stream) i];
-//               ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:256:15: Error: Unexpected token 'for'.
-//   <int>{await for (int i in stream) i};
-//               ^^^
-//
-// pkg/front_end/testcases/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};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
-//   <String, int>{await for (int i in stream) "bar": i};
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
-//   List<int> list10 = [if (a is B) a.foo];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
-//   Set<int> set10 = {if (a is B) a.foo};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
-//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
-//                          ^^
-//
-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::•()
-    ;
-}
-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 = null]) → 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 {
-  dynamic list10 = <dynamic>[];
-  dynamic set10 = <dynamic>{null};
-  dynamic map10 = <dynamic, dynamic>{"baz": null};
-  dynamic list11 = <dynamic>[];
-  dynamic set11 = <dynamic>{null};
-  dynamic map11 = <dynamic, dynamic>{"baz": null};
-  dynamic list12 = <dynamic>[];
-  dynamic set12 = <dynamic>{null};
-  dynamic map12 = <dynamic, dynamic>{"baz": null};
-  dynamic list20 = <dynamic>[];
-  dynamic set20 = <dynamic>{null};
-  dynamic map20 = <dynamic, dynamic>{"baz": null};
-  dynamic list21 = <dynamic>[];
-  dynamic set21 = <dynamic>{null};
-  dynamic map21 = <dynamic, dynamic>{"baz": null};
-  dynamic list22 = <dynamic>[];
-  dynamic set22 = <dynamic>{null};
-  dynamic map22 = <dynamic, dynamic>{"baz": null};
-  dynamic list30 = <dynamic>[];
-  dynamic set30 = <dynamic>{null};
-  dynamic map30 = <dynamic, dynamic>{"baz": null};
-  dynamic list31 = <dynamic>[];
-  dynamic set31 = <dynamic>{null};
-  dynamic map31 = <dynamic, dynamic>{"baz": null};
-  dynamic list33 = <dynamic>[];
-  dynamic set33 = <dynamic>{null};
-  dynamic map33 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list40 = <dynamic>[];
-  core::Set<core::List<core::int>> set40 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list41 = <dynamic>[];
-  core::Set<core::List<core::int>> set41 = <dynamic>{null};
-  core::List<core::List<core::int>> list42 = <dynamic>[];
-  core::Set<core::List<core::int>> set42 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list50 = <dynamic>[];
-  core::Set<core::int> set50 = <dynamic>{null};
-  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list51 = <dynamic>[];
-  core::Set<core::int> set51 = <dynamic>{null};
-  core::List<core::int> list52 = <dynamic>[];
-  core::Set<core::int> set52 = <dynamic>{null};
-  core::Map<core::String, core::int> map52 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list60 = <dynamic>[];
-  core::Set<core::List<core::int>> set60 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list61 = <dynamic>[];
-  core::Set<core::List<core::int>> set61 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list70 = <dynamic>[];
-  core::Set<core::List<core::int>> set70 = <dynamic>{null};
-  core::List<core::List<core::int>> list71 = <dynamic>[];
-  core::Set<core::List<core::int>> set71 = <dynamic>{null};
-  dynamic list80 = <dynamic>[];
-  dynamic set80 = <dynamic>{null};
-  dynamic map80 = <dynamic, dynamic>{"baz": null};
-  dynamic list81 = <dynamic>[];
-  dynamic set81 = <dynamic>{null};
-  dynamic map81 = <dynamic, dynamic>{"baz": null};
-  dynamic list82 = <dynamic>[];
-  dynamic set82 = <dynamic>{null};
-  dynamic map82 = <dynamic>{null};
-  dynamic list83 = <dynamic>[];
-  dynamic set83 = <dynamic>{null};
-  dynamic map83 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list90 = <dynamic>[];
-  core::Set<core::int> set90 = <dynamic>{null};
-  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list91 = <dynamic>[];
-  core::Set<core::int> set91 = <dynamic>{null};
-  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list100 = <dynamic>[];
-  core::Set<core::int> set100 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map100 = <dynamic, dynamic>{};
-}
-static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::String>[];
-  <core::String>{null};
-  <core::String, core::String>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  core::Set<dynamic> set10 = <dynamic, dynamic>{};
-  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{};
-  core::Set<dynamic> set11 = <dynamic, dynamic>{};
-  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{};
-  dynamic map12 = <dynamic, dynamic>{};
-  dynamic map13 = <dynamic, dynamic>{};
-  core::List<core::int> list20 = <dynamic>[];
-  core::Set<core::int> set20 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map30 = <dynamic, dynamic>{};
-  core::List<core::String> list40 = <core::String>[];
-  core::Set<core::String> set40 = <core::String>{};
-  core::Map<core::String, core::int> map40 = <core::String, core::int>{};
-  core::Map<core::int, core::String> map41 = <core::int, core::String>{};
-}
-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 {
-  dynamic list10 = <dynamic>[];
-  dynamic set10 = <dynamic>{null};
-  dynamic map10 = <dynamic, dynamic>{"baz": null};
-  dynamic list11 = <dynamic>[];
-  dynamic set11 = <dynamic>{null};
-  dynamic map11 = <dynamic, dynamic>{"baz": null};
-  dynamic list12 = <dynamic>[];
-  dynamic set12 = <dynamic>{null};
-  dynamic map12 = <dynamic, dynamic>{"baz": null};
-  dynamic list20 = <dynamic>[];
-  dynamic set20 = <dynamic>{null};
-  dynamic map20 = <dynamic, dynamic>{"baz": null};
-  dynamic list21 = <dynamic>[];
-  dynamic set21 = <dynamic>{null};
-  dynamic map21 = <dynamic, dynamic>{"baz": null};
-  dynamic list22 = <dynamic>[];
-  dynamic set22 = <dynamic>{null};
-  dynamic map22 = <dynamic, dynamic>{"baz": null};
-  dynamic list30 = <dynamic>[];
-  dynamic set30 = <dynamic>{null};
-  dynamic map30 = <dynamic, dynamic>{"baz": null};
-  dynamic list31 = <dynamic>[];
-  dynamic set31 = <dynamic>{null};
-  dynamic map31 = <dynamic, dynamic>{"baz": null};
-  dynamic list33 = <dynamic>[];
-  dynamic set33 = <dynamic>{null};
-  dynamic map33 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list40 = <dynamic>[];
-  core::Set<core::List<core::int>> set40 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list41 = <dynamic>[];
-  core::Set<core::List<core::int>> set41 = <dynamic>{null};
-  core::List<core::List<core::int>> list42 = <dynamic>[];
-  core::Set<core::List<core::int>> set42 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list50 = <dynamic>[];
-  core::Set<core::int> set50 = <dynamic>{null};
-  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list51 = <dynamic>[];
-  core::Set<core::int> set51 = <dynamic>{null};
-  core::List<core::int> list52 = <dynamic>[];
-  core::Set<core::int> set52 = <dynamic>{null};
-  core::List<core::List<core::int>> list60 = <dynamic>[];
-  core::Set<core::List<core::int>> set60 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list61 = <dynamic>[];
-  core::Set<core::List<core::int>> set61 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list70 = <dynamic>[];
-  core::Set<core::List<core::int>> set70 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map70 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list71 = <dynamic>[];
-  core::Set<core::List<core::int>> set71 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map71 = <dynamic, dynamic>{"baz": null};
-  dynamic list80 = <dynamic>[];
-  dynamic set80 = <dynamic>{null};
-  dynamic map80 = <dynamic, dynamic>{"baz": null};
-  dynamic list81 = <dynamic>[];
-  dynamic set81 = <dynamic>{null};
-  dynamic map81 = <dynamic, dynamic>{"baz": null};
-  dynamic list82 = <dynamic>[];
-  dynamic set82 = <dynamic>{null};
-  dynamic map82 = <dynamic, dynamic>{"baz": null};
-  dynamic list83 = <dynamic>[];
-  dynamic set83 = <dynamic>{null};
-  dynamic map83 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list90 = <dynamic>[];
-  core::Set<core::int> set90 = <dynamic>{null};
-  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list91 = <dynamic>[];
-  core::Set<core::int> set91 = <dynamic>{null};
-  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list100 = <core::int>[];
-  core::Set<core::int> set100 = <core::int>{};
-  core::Map<core::String, core::int> map100 = <core::String, core::int>{};
-  dynamic list110 = <dynamic>[];
-  dynamic set110 = <dynamic>{null};
-  dynamic map110 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list120 = <dynamic>[];
-  core::Set<core::int> set120 = <dynamic>{null};
-  core::Map<core::String, core::int> map120 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list130 = <dynamic>[];
-  core::Set<core::int> set130 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map130 = <dynamic, dynamic>{};
-}
-static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic async {
-  <core::int>[];
-  <core::int>{null};
-  <core::int, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::int, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::int, core::int>{42: null};
-  <core::String>[];
-  <core::String>{null};
-  <core::String, core::String>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  final dynamic i = 0;
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  dynamic list10 = <dynamic>[];
-  dynamic set10 = <dynamic>{null};
-  dynamic map10 = <dynamic, dynamic>{"baz": null};
-  dynamic list20 = <dynamic>[];
-  dynamic set20 = <dynamic>{null};
-  dynamic map20 = <dynamic, dynamic>{"baz": null};
-  dynamic list30 = <dynamic>[];
-  dynamic set30 = <dynamic>{null};
-  dynamic map30 = <dynamic, dynamic>{"baz": null};
-  dynamic list40 = <dynamic>[];
-  dynamic set40 = <dynamic>{null};
-  dynamic map40 = <dynamic, dynamic>{"baz": null};
-  dynamic list50 = <dynamic>[];
-  dynamic set50 = <dynamic>{null};
-  dynamic map50 = <dynamic, dynamic>{"baz": null};
-  dynamic list60 = <dynamic>[];
-  dynamic set60 = <dynamic>{null};
-  dynamic map60 = <dynamic, dynamic>{"baz": null};
-}
-static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
-  <core::int>[];
-  <core::int>{};
-  <core::String, core::int>{};
-}
-static method testPromotion(self::A a) → dynamic {
-  core::List<core::int> list10 = <dynamic>[];
-  core::Set<core::int> set10 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map10 = <dynamic, dynamic>{};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect
deleted file mode 100644
index d384c49..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,2059 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
-//   var list10 = [if (oracle("foo")) 42];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
-//   var set10 = {if (oracle("foo")) 42, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
-//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
-//   var list11 = [if (oracle("foo")) dynVar];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
-//   var set11 = {if (oracle("foo")) dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
-//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
-//   var list12 = [if (oracle("foo")) [42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
-//   var set12 = {if (oracle("foo")) [42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
-//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
-//   var list20 = [if (oracle("foo")) ...[42]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
-//   var list20 = [if (oracle("foo")) ...[42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
-//   var set20 = {if (oracle("foo")) ...[42], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
-//   var set20 = {if (oracle("foo")) ...[42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
-//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
-//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
-//   var list21 = [if (oracle("foo")) ...[dynVar]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
-//   var list21 = [if (oracle("foo")) ...[dynVar]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
-//   var set21 = {if (oracle("foo")) ...[dynVar], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
-//   var set21 = {if (oracle("foo")) ...[dynVar], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
-//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
-//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
-//   var list22 = [if (oracle("foo")) ...[[42]]];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
-//   var list22 = [if (oracle("foo")) ...[[42]]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
-//   var set22 = {if (oracle("foo")) ...[[42]], null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
-//   var set22 = {if (oracle("foo")) ...[[42]], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
-//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
-//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
-//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
-//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
-//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
-//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
-//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
-//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
-//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
-//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
-//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
-//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
-//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
-//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
-//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
-//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
-//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
-//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
-//   List<int> list50 = [if (oracle("foo")) ...[]];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
-//   List<int> list50 = [if (oracle("foo")) ...[]];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
-//   Set<int> set50 = {if (oracle("foo")) ...[], null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
-//   Set<int> set50 = {if (oracle("foo")) ...[], null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
-//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
-//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
-//   List<int> list51 = [if (oracle("foo")) ...{}];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
-//   List<int> list51 = [if (oracle("foo")) ...{}];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
-//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
-//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
-//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
-//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
-//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
-//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
-//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
-//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
-//                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
-//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
-//                                                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
-//   List<List<int>> list70 = [if (oracle("foo")) []];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
-//                                              ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
-//   var list80 = [if (oracle("foo")) 42 else 3.14];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
-//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
-//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
-//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
-//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
-//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
-//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
-//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
-//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
-//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
-//                                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
-//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
-//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
-//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
-//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
-//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
-//   List<int> list90 = [if (oracle("foo")) dynVar];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
-//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
-//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
-//   List<int> list91 = [if (oracle("foo")) ...dynVar];
-//                                          ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
-//   List<int> list91 = [if (oracle("foo")) ...dynVar];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
-//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
-//                                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
-//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
-//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
-//                                                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
-//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
-//                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
-//   List<int> list100 = [if (dynVar) 42];
-//                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
-//   Set<int> set100 = {if (dynVar) 42};
-//                      ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
-//   Map<int, int> map100 = {if (dynVar) 42: 42};
-//                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) "bar"];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) "bar", null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...map];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...map];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//            ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//            ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) ...map else 42];
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) ...map else 42];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
-//   <int>[if (oracle("foo")) 42 else ...map];
-//                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
-//   <int>[if (oracle("foo")) 42 else ...map];
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//                            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
-//   <int>{if (oracle("foo")) ...map else 42, null};
-//         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
-//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
-//                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
-//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
-//                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
-//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
-//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
-//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
-//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
-//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
-//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
-//                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
-//   List<int> list20 = [if (42) 42];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
-//   Set<int> set20 = {if (42) 42};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
-//   Map<int, int> map30 = {if (42) 42: 42};
-//                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:42: Error: Unexpected token 'if'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                          ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
-//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
-//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
-//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
-//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
-//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
-//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
-//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
-//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
-//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
-//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
-//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
-//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
-//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
-//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
-//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
-//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
-//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
-//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
-//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
-//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
-//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
-//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-//                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
-//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
-//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
-//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
-//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-//                                                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
-//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
-//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
-//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
-//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
-//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
-//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
-//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
-//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
-//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
-//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
-//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
-//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
-//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
-//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
-//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
-//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
-//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
-//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
-//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
-//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
-//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
-//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
-//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
-//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
-//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
-//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
-//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
-//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                                                           ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
-//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                                                         ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
-//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
-//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
-//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
-//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
-//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                               ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
-//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
-//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
-//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-//                                                                 ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
-//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
-//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-//                                                               ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
-//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
-//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-//                                                                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
-//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-//                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
-//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
-//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
-//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
-//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
-//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:179:16: Error: Unexpected token 'for'.
-//   var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:67: Error: Unexpected token '...'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
-//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
-//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
-//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
-//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
-//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                                                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
-//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
-//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
-//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                                                    ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
-//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
-//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
-//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
-//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
-//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
-//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
-//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-//                                                         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
-//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-//                     ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
-//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-//                                                                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
-//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
-//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-//                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
-//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
-//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-//                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
-//   var list110 = [for (var i in [1, 2, 3]) i];
-//                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
-//   var set110 = {for (var i in [1, 2, 3]) i, null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
-//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
-//   List<int> list120 = [for (var i in dynVar) i];
-//                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
-//   Set<int> set120 = {for (var i in dynVar) i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
-//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
-//                              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
-//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
-//                        ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
-//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
-//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
-//                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-//                                             ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-//                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-//              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:12: Error: Unexpected token 'for'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:48: Error: Unexpected token 'if'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:12: Error: Unexpected token 'for'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//            ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:56: Error: Unexpected token 'if'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                        ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:20: Error: Unexpected token 'for'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                    ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:59: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//                                                           ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:67: Error: Unexpected token '...'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:53: Error: Unexpected token 'if'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:224:17: Error: Unexpected token 'for'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:67: Error: Unexpected token '...'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
-//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//                                                                   ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//                                             ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
-//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:82: Error: Unexpected token '...'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                                                                                  ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:53: Error: Unexpected token 'if'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                                                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:227:17: Error: Unexpected token 'for'.
-//   <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:230:9: Error: Unexpected token 'for'.
-//   <int>[for (i in <int>[1]) i];
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
-//   <int>{for (i in <int>[1]) i, null};
-//         ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
-// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
-// 	              ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
-//   var list10 = [for (var i in "not iterable") i];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
-//   var set10 = {for (var i in "not iterable") i, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
-//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
-//   var list30 = [await for (var i in "not stream") i];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
-//   var set30 = {await for (var i in "not stream") i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
-//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:246:23: Error: Unexpected token 'for'.
-//   var list50 = [await for (;;) 42];
-//                       ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:247:22: Error: Unexpected token 'for'.
-//   var set50 = {await for (;;) 42, null};
-//                      ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:248:22: Error: Unexpected token 'for'.
-//   var map50 = {await for (;;) "bar": 42, "baz": null};
-//                      ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
-//   var list60 = [for (; "not bool";) 42];
-//                 ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
-//   var set60 = {for (; "not bool";) 42, null};
-//                ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
-//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
-//                ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:255:15: Error: Unexpected token 'for'.
-//   <int>[await for (int i in stream) i];
-//               ^^^
-//
-// pkg/front_end/testcases/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/control_flow_collection_inference.dart:256:15: Error: Unexpected token 'for'.
-//   <int>{await for (int i in stream) i};
-//               ^^^
-//
-// pkg/front_end/testcases/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};
-//                                  ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
-//   <String, int>{await for (int i in stream) "bar": i};
-//                       ^^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
-//   List<int> list10 = [if (a is B) a.foo];
-//                       ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
-//   Set<int> set10 = {if (a is B) a.foo};
-//                     ^^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
-//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
-//                          ^^
-//
-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::•()
-    ;
-}
-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 = null]) → 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 {
-  dynamic list10 = <dynamic>[];
-  dynamic set10 = <dynamic>{null};
-  dynamic map10 = <dynamic, dynamic>{"baz": null};
-  dynamic list11 = <dynamic>[];
-  dynamic set11 = <dynamic>{null};
-  dynamic map11 = <dynamic, dynamic>{"baz": null};
-  dynamic list12 = <dynamic>[];
-  dynamic set12 = <dynamic>{null};
-  dynamic map12 = <dynamic, dynamic>{"baz": null};
-  dynamic list20 = <dynamic>[];
-  dynamic set20 = <dynamic>{null};
-  dynamic map20 = <dynamic, dynamic>{"baz": null};
-  dynamic list21 = <dynamic>[];
-  dynamic set21 = <dynamic>{null};
-  dynamic map21 = <dynamic, dynamic>{"baz": null};
-  dynamic list22 = <dynamic>[];
-  dynamic set22 = <dynamic>{null};
-  dynamic map22 = <dynamic, dynamic>{"baz": null};
-  dynamic list30 = <dynamic>[];
-  dynamic set30 = <dynamic>{null};
-  dynamic map30 = <dynamic, dynamic>{"baz": null};
-  dynamic list31 = <dynamic>[];
-  dynamic set31 = <dynamic>{null};
-  dynamic map31 = <dynamic, dynamic>{"baz": null};
-  dynamic list33 = <dynamic>[];
-  dynamic set33 = <dynamic>{null};
-  dynamic map33 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list40 = <dynamic>[];
-  core::Set<core::List<core::int>> set40 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list41 = <dynamic>[];
-  core::Set<core::List<core::int>> set41 = <dynamic>{null};
-  core::List<core::List<core::int>> list42 = <dynamic>[];
-  core::Set<core::List<core::int>> set42 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list50 = <dynamic>[];
-  core::Set<core::int> set50 = <dynamic>{null};
-  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list51 = <dynamic>[];
-  core::Set<core::int> set51 = <dynamic>{null};
-  core::List<core::int> list52 = <dynamic>[];
-  core::Set<core::int> set52 = <dynamic>{null};
-  core::Map<core::String, core::int> map52 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list60 = <dynamic>[];
-  core::Set<core::List<core::int>> set60 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list61 = <dynamic>[];
-  core::Set<core::List<core::int>> set61 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list70 = <dynamic>[];
-  core::Set<core::List<core::int>> set70 = <dynamic>{null};
-  core::List<core::List<core::int>> list71 = <dynamic>[];
-  core::Set<core::List<core::int>> set71 = <dynamic>{null};
-  dynamic list80 = <dynamic>[];
-  dynamic set80 = <dynamic>{null};
-  dynamic map80 = <dynamic, dynamic>{"baz": null};
-  dynamic list81 = <dynamic>[];
-  dynamic set81 = <dynamic>{null};
-  dynamic map81 = <dynamic, dynamic>{"baz": null};
-  dynamic list82 = <dynamic>[];
-  dynamic set82 = <dynamic>{null};
-  dynamic map82 = <dynamic>{null};
-  dynamic list83 = <dynamic>[];
-  dynamic set83 = <dynamic>{null};
-  dynamic map83 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list90 = <dynamic>[];
-  core::Set<core::int> set90 = <dynamic>{null};
-  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list91 = <dynamic>[];
-  core::Set<core::int> set91 = <dynamic>{null};
-  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list100 = <dynamic>[];
-  core::Set<core::int> set100 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map100 = <dynamic, dynamic>{};
-}
-static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::String>[];
-  <core::String>{null};
-  <core::String, core::String>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  <core::int>[];
-  <core::int>{null};
-  <core::String, core::int>{"baz": null};
-  core::Set<dynamic> set10 = <dynamic, dynamic>{};
-  core::Map<dynamic, dynamic> map10 = <dynamic, dynamic>{};
-  core::Set<dynamic> set11 = <dynamic, dynamic>{};
-  core::Map<dynamic, dynamic> map11 = <dynamic, dynamic>{};
-  dynamic map12 = <dynamic, dynamic>{};
-  dynamic map13 = <dynamic, dynamic>{};
-  core::List<core::int> list20 = <dynamic>[];
-  core::Set<core::int> set20 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map30 = <dynamic, dynamic>{};
-  core::List<core::String> list40 = <core::String>[];
-  core::Set<core::String> set40 = <core::String>{};
-  core::Map<core::String, core::int> map40 = <core::String, core::int>{};
-  core::Map<core::int, core::String> map41 = <core::int, core::String>{};
-}
-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 {
-  dynamic list10 = <dynamic>[];
-  dynamic set10 = <dynamic>{null};
-  dynamic map10 = <dynamic, dynamic>{"baz": null};
-  dynamic list11 = <dynamic>[];
-  dynamic set11 = <dynamic>{null};
-  dynamic map11 = <dynamic, dynamic>{"baz": null};
-  dynamic list12 = <dynamic>[];
-  dynamic set12 = <dynamic>{null};
-  dynamic map12 = <dynamic, dynamic>{"baz": null};
-  dynamic list20 = <dynamic>[];
-  dynamic set20 = <dynamic>{null};
-  dynamic map20 = <dynamic, dynamic>{"baz": null};
-  dynamic list21 = <dynamic>[];
-  dynamic set21 = <dynamic>{null};
-  dynamic map21 = <dynamic, dynamic>{"baz": null};
-  dynamic list22 = <dynamic>[];
-  dynamic set22 = <dynamic>{null};
-  dynamic map22 = <dynamic, dynamic>{"baz": null};
-  dynamic list30 = <dynamic>[];
-  dynamic set30 = <dynamic>{null};
-  dynamic map30 = <dynamic, dynamic>{"baz": null};
-  dynamic list31 = <dynamic>[];
-  dynamic set31 = <dynamic>{null};
-  dynamic map31 = <dynamic, dynamic>{"baz": null};
-  dynamic list33 = <dynamic>[];
-  dynamic set33 = <dynamic>{null};
-  dynamic map33 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list40 = <dynamic>[];
-  core::Set<core::List<core::int>> set40 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map40 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list41 = <dynamic>[];
-  core::Set<core::List<core::int>> set41 = <dynamic>{null};
-  core::List<core::List<core::int>> list42 = <dynamic>[];
-  core::Set<core::List<core::int>> set42 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map42 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list50 = <dynamic>[];
-  core::Set<core::int> set50 = <dynamic>{null};
-  core::Map<core::String, core::int> map50 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list51 = <dynamic>[];
-  core::Set<core::int> set51 = <dynamic>{null};
-  core::List<core::int> list52 = <dynamic>[];
-  core::Set<core::int> set52 = <dynamic>{null};
-  core::List<core::List<core::int>> list60 = <dynamic>[];
-  core::Set<core::List<core::int>> set60 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map60 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list61 = <dynamic>[];
-  core::Set<core::List<core::int>> set61 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map61 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list70 = <dynamic>[];
-  core::Set<core::List<core::int>> set70 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map70 = <dynamic, dynamic>{"baz": null};
-  core::List<core::List<core::int>> list71 = <dynamic>[];
-  core::Set<core::List<core::int>> set71 = <dynamic>{null};
-  core::Map<core::String, core::List<core::int>> map71 = <dynamic, dynamic>{"baz": null};
-  dynamic list80 = <dynamic>[];
-  dynamic set80 = <dynamic>{null};
-  dynamic map80 = <dynamic, dynamic>{"baz": null};
-  dynamic list81 = <dynamic>[];
-  dynamic set81 = <dynamic>{null};
-  dynamic map81 = <dynamic, dynamic>{"baz": null};
-  dynamic list82 = <dynamic>[];
-  dynamic set82 = <dynamic>{null};
-  dynamic map82 = <dynamic, dynamic>{"baz": null};
-  dynamic list83 = <dynamic>[];
-  dynamic set83 = <dynamic>{null};
-  dynamic map83 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list90 = <dynamic>[];
-  core::Set<core::int> set90 = <dynamic>{null};
-  core::Map<core::String, core::int> map90 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list91 = <dynamic>[];
-  core::Set<core::int> set91 = <dynamic>{null};
-  core::Map<core::String, core::int> map91 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list100 = <core::int>[];
-  core::Set<core::int> set100 = <core::int>{};
-  core::Map<core::String, core::int> map100 = <core::String, core::int>{};
-  dynamic list110 = <dynamic>[];
-  dynamic set110 = <dynamic>{null};
-  dynamic map110 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list120 = <dynamic>[];
-  core::Set<core::int> set120 = <dynamic>{null};
-  core::Map<core::String, core::int> map120 = <dynamic, dynamic>{"baz": null};
-  core::List<core::int> list130 = <dynamic>[];
-  core::Set<core::int> set130 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map130 = <dynamic, dynamic>{};
-}
-static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        <core::int>[];
-        <core::int>{null};
-        <core::int, core::int>{"baz": null};
-        <core::int>[];
-        <core::int>{null};
-        <core::int, core::int>{"baz": null};
-        <core::int>[];
-        <core::int>{null};
-        <core::int, core::int>{42: null};
-        <core::String>[];
-        <core::String>{null};
-        <core::String, core::String>{"baz": null};
-        <core::int>[];
-        <core::int>{null};
-        <core::String, core::int>{"baz": null};
-        <core::int>[];
-        <core::int>{null};
-        <core::String, core::int>{"baz": null};
-        final dynamic i = 0;
-        <core::int>[];
-        <core::int>{null};
-        <core::String, core::int>{"baz": null};
-        dynamic list10 = <dynamic>[];
-        dynamic set10 = <dynamic>{null};
-        dynamic map10 = <dynamic, dynamic>{"baz": null};
-        dynamic list20 = <dynamic>[];
-        dynamic set20 = <dynamic>{null};
-        dynamic map20 = <dynamic, dynamic>{"baz": null};
-        dynamic list30 = <dynamic>[];
-        dynamic set30 = <dynamic>{null};
-        dynamic map30 = <dynamic, dynamic>{"baz": null};
-        dynamic list40 = <dynamic>[];
-        dynamic set40 = <dynamic>{null};
-        dynamic map40 = <dynamic, dynamic>{"baz": null};
-        dynamic list50 = <dynamic>[];
-        dynamic set50 = <dynamic>{null};
-        dynamic map50 = <dynamic, dynamic>{"baz": null};
-        dynamic list60 = <dynamic>[];
-        dynamic set60 = <dynamic>{null};
-        dynamic map60 = <dynamic, dynamic>{"baz": null};
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
-  <core::int>[];
-  <core::int>{};
-  <core::String, core::int>{};
-}
-static method testPromotion(self::A a) → dynamic {
-  core::List<core::int> list10 = <dynamic>[];
-  core::Set<core::int> set10 = <dynamic, dynamic>{};
-  core::Map<core::int, core::int> map10 = <dynamic, dynamic>{};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.outline.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.outline.expect
deleted file mode 100644
index c40231f..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.outline.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:async" as asy;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-  get foo() → core::int
-    ;
-}
-static method oracle<T extends core::Object = dynamic>([self::oracle::T t]) → dynamic
-  ;
-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
-  ;
-static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic
-  ;
-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
-  ;
-static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic
-  ;
-static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic
-  ;
-static method testPromotion(self::A a) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.expect
deleted file mode 100644
index c3b0f74..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.expect
+++ /dev/null
@@ -1,2313 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[if (oracle("foo")) "bar"];
-//                            ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{if (oracle("foo")) "bar", null};
-//                            ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
-//                                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                                               ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                                                             ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   List<int> list20 = [if (42) 42];
-//                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   Set<int> set20 = {if (42) 42};
-//                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   Map<int, int> map30 = {if (42) 42: 42};
-//                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                                     ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                                   ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                                                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                                                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
-//   <int>[for (i in <int>[1]) i];
-//              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
-//   <int>{for (i in <int>[1]) i, null};
-//              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
-// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
-// 	                   ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-//                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-//                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                  ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                                     ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                                                            ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                                      ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                                                          ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var list60 = [for (; "not bool";) 42];
-//                        ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var set60 = {for (; "not bool";) 42, null};
-//                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
-//                       ^
-//
-// pkg/front_end/testcases/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/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/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::•()
-    ;
-}
-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 = null]) → 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} core::bool)
-      #t1.{core::List::add}(42);
-  } =>#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} core::bool)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
-  } =>#t3;
-  core::List<dynamic> list11 = block {
-    final core::List<dynamic> #t4 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t4.{core::List::add}(dynVar);
-  } =>#t4;
-  core::Set<dynamic> set11 = block {
-    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
-  } =>#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} core::bool)
-      #t7.{core::List::add}(<core::int>[42]);
-  } =>#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} core::bool)
-      #t8.{core::Set::add}(<core::int>[42]);
-    #t8.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t9.{core::Map::[]=}("bar", <core::int>[42]);
-    #t9.{core::Map::[]=}("baz", null);
-  } =>#t9;
-  core::List<core::int> list20 = block {
-    final core::List<core::int> #t10 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t11 in <core::int>[42])
-        #t10.{core::List::add}(#t11);
-  } =>#t10;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t13 in <core::int>[42])
-        #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(null);
-  } =>#t12;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t14 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t15 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
-    #t14.{core::Map::[]=}("baz", null);
-  } =>#t14;
-  core::List<dynamic> list21 = block {
-    final core::List<dynamic> #t16 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t17 in <dynamic>[dynVar])
-        #t16.{core::List::add}(#t17);
-  } =>#t16;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t19 in <dynamic>[dynVar])
-        #t18.{core::Set::add}(#t19);
-    #t18.{core::Set::add}(null);
-  } =>#t18;
-  core::Map<core::String, dynamic> map21 = block {
-    final core::Map<core::String, dynamic> #t20 = <core::String, dynamic>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, dynamic> #t21 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-    #t20.{core::Map::[]=}("baz", null);
-  } =>#t20;
-  core::List<core::List<core::int>> list22 = block {
-    final core::List<core::List<core::int>> #t22 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t23 in <core::List<core::int>>[<core::int>[42]])
-        #t22.{core::List::add}(#t23);
-  } =>#t22;
-  core::Set<core::List<core::int>> set22 = block {
-    final core::Set<core::List<core::int>> #t24 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t25 in <core::List<core::int>>[<core::int>[42]])
-        #t24.{core::Set::add}(#t25);
-    #t24.{core::Set::add}(null);
-  } =>#t24;
-  core::Map<core::String, core::List<core::int>> map22 = block {
-    final core::Map<core::String, core::List<core::int>> #t26 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::List<core::int>> #t27 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
-    #t26.{core::Map::[]=}("baz", null);
-  } =>#t26;
-  core::List<core::int> list30 = block {
-    final core::List<core::int> #t28 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t29 in <core::int>[42])
-          #t28.{core::List::add}(#t29);
-  } =>#t28;
-  core::Set<core::int> set30 = block {
-    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t31 in <core::int>[42])
-          #t30.{core::Set::add}(#t31);
-    #t30.{core::Set::add}(null);
-  } =>#t30;
-  core::Map<core::String, core::int> map30 = block {
-    final core::Map<core::String, core::int> #t32 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t33 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
-    #t32.{core::Map::[]=}("baz", null);
-  } =>#t32;
-  core::List<dynamic> list31 = block {
-    final core::List<dynamic> #t34 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t35 in <dynamic>[dynVar])
-          #t34.{core::List::add}(#t35);
-  } =>#t34;
-  core::Set<dynamic> set31 = block {
-    final core::Set<dynamic> #t36 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t37 in <dynamic>[dynVar])
-          #t36.{core::Set::add}(#t37);
-    #t36.{core::Set::add}(null);
-  } =>#t36;
-  core::Map<core::String, dynamic> map31 = block {
-    final core::Map<core::String, dynamic> #t38 = <core::String, dynamic>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, dynamic> #t39 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", null);
-  } =>#t38;
-  core::List<core::List<core::int>> list33 = block {
-    final core::List<core::List<core::int>> #t40 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t41 in <core::List<core::int>>[<core::int>[42]])
-          #t40.{core::List::add}(#t41);
-  } =>#t40;
-  core::Set<core::List<core::int>> set33 = block {
-    final core::Set<core::List<core::int>> #t42 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t43 in <core::List<core::int>>[<core::int>[42]])
-          #t42.{core::Set::add}(#t43);
-    #t42.{core::Set::add}(null);
-  } =>#t42;
-  core::Map<core::String, core::List<core::int>> map33 = block {
-    final core::Map<core::String, core::List<core::int>> #t44 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t45 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
-    #t44.{core::Map::[]=}("baz", null);
-  } =>#t44;
-  core::List<core::List<core::int>> list40 = block {
-    final core::List<core::List<core::int>> #t46 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t47 in <core::List<core::int>>[<core::int>[]])
-        #t46.{core::List::add}(#t47);
-  } =>#t46;
-  core::Set<core::List<core::int>> set40 = block {
-    final core::Set<core::List<core::int>> #t48 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t49 in <core::List<core::int>>[<core::int>[]])
-        #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(null);
-  } =>#t48;
-  core::Map<core::String, core::List<core::int>> map40 = invalid-expression "pkg/front_end/testcases/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>> #t50 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t51 in let final core::Set<core::List<core::int>> #t52 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t53 = #t52.{core::Set::add}(<core::int>[]) in #t52)
-        #t50.{core::List::add}(#t51);
-  } =>#t50;
-  core::Set<core::List<core::int>> set41 = block {
-    final core::Set<core::List<core::int>> #t54 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t55 in let final core::Set<core::List<core::int>> #t56 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t57 = #t56.{core::Set::add}(<core::int>[]) in #t56)
-        #t54.{core::Set::add}(#t55);
-    #t54.{core::Set::add}(null);
-  } =>#t54;
-  core::List<core::List<core::int>> list42 = block {
-    final core::List<core::List<core::int>> #t58 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t59 in <core::List<core::int>>[<core::int>[]])
-          #t58.{core::List::add}(#t59);
-  } =>#t58;
-  core::Set<core::List<core::int>> set42 = block {
-    final core::Set<core::List<core::int>> #t60 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t61 in <core::List<core::int>>[<core::int>[]])
-          #t60.{core::Set::add}(#t61);
-    #t60.{core::Set::add}(null);
-  } =>#t60;
-  core::Map<core::String, core::List<core::int>> map42 = 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} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} 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})
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
-  core::List<core::int> list50 = block {
-    final core::List<core::int> #t64 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t65 in <core::int>[])
-        #t64.{core::List::add}(#t65);
-  } =>#t64;
-  core::Set<core::int> set50 = block {
-    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t67 in <core::int>[])
-        #t66.{core::Set::add}(#t67);
-    #t66.{core::Set::add}(null);
-  } =>#t66;
-  core::Map<core::String, core::int> map50 = block {
-    final core::Map<core::String, core::int> #t68 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t69 in <core::String, core::int>{}.{core::Map::entries})
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
-  core::List<core::int> list51 = block {
-    final core::List<core::int> #t70 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t71 in let final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>() in #t72)
-        #t70.{core::List::add}(#t71);
-  } =>#t70;
-  core::Set<core::int> set51 = block {
-    final core::Set<core::int> #t73 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t74 in let final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>() in #t75)
-        #t73.{core::Set::add}(#t74);
-    #t73.{core::Set::add}(null);
-  } =>#t73;
-  core::List<core::int> list52 = block {
-    final core::List<core::int> #t76 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t77 in <core::int>[])
-          #t76.{core::List::add}(#t77);
-  } =>#t76;
-  core::Set<core::int> set52 = block {
-    final core::Set<core::int> #t78 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t79 in <core::int>[])
-          #t78.{core::Set::add}(#t79);
-    #t78.{core::Set::add}(null);
-  } =>#t78;
-  core::Map<core::String, core::int> map52 = block {
-    final core::Map<core::String, core::int> #t80 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t81 in <core::String, core::int>{}.{core::Map::entries})
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
-  core::List<core::List<core::int>> list60 = block {
-    final core::List<core::List<core::int>> #t82 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t83 in <core::List<core::int>>[<core::int>[]])
-        #t82.{core::List::add}(#t83);
-  } =>#t82;
-  core::Set<core::List<core::int>> set60 = block {
-    final core::Set<core::List<core::int>> #t84 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t85 in <core::List<core::int>>[<core::int>[]])
-        #t84.{core::Set::add}(#t85);
-    #t84.{core::Set::add}(null);
-  } =>#t84;
-  core::Map<core::String, core::List<core::int>> map60 = block {
-    final core::Map<core::String, core::List<core::int>> #t86 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::List<core::int>> #t87 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
-  core::List<core::List<core::int>> list61 = block {
-    final core::List<core::List<core::int>> #t88 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t89 in <core::List<core::int>>[<core::int>[]])
-          #t88.{core::List::add}(#t89);
-  } =>#t88;
-  core::Set<core::List<core::int>> set61 = block {
-    final core::Set<core::List<core::int>> #t90 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t91 in <core::List<core::int>>[<core::int>[]])
-          #t90.{core::Set::add}(#t91);
-    #t90.{core::Set::add}(null);
-  } =>#t90;
-  core::Map<core::String, core::List<core::int>> map61 = block {
-    final core::Map<core::String, core::List<core::int>> #t92 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t93 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
-  core::List<core::List<core::int>> list70 = block {
-    final core::List<core::List<core::int>> #t94 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t94.{core::List::add}(<core::int>[]);
-  } =>#t94;
-  core::Set<core::List<core::int>> set70 = block {
-    final core::Set<core::List<core::int>> #t95 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t95.{core::Set::add}(<core::int>[]);
-    #t95.{core::Set::add}(null);
-  } =>#t95;
-  core::List<core::List<core::int>> list71 = block {
-    final core::List<core::List<core::int>> #t96 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t96.{core::List::add}(<core::int>[]);
-  } =>#t96;
-  core::Set<core::List<core::int>> set71 = block {
-    final core::Set<core::List<core::int>> #t97 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t97.{core::Set::add}(<core::int>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
-  core::List<core::num> list80 = block {
-    final core::List<core::num> #t98 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t98.{core::List::add}(42);
-    else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
-  core::Set<core::num> set80 = block {
-    final core::Set<core::num> #t99 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t99.{core::Set::add}(42);
-    else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
-  core::Map<core::String, core::num> map80 = block {
-    final core::Map<core::String, core::num> #t100 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t100.{core::Map::[]=}("bar", 42);
-    else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
-  core::List<core::num> list81 = block {
-    final core::List<core::num> #t101 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t102 in listInt)
-        #t101.{core::List::add}(#t102);
-    else
-      for (final core::num #t103 in listDouble)
-        #t101.{core::List::add}(#t103);
-  } =>#t101;
-  core::Set<core::num> set81 = block {
-    final core::Set<core::num> #t104 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t105 in listInt)
-        #t104.{core::Set::add}(#t105);
-    else
-      for (final core::num #t106 in listDouble)
-        #t104.{core::Set::add}(#t106);
-    #t104.{core::Set::add}(null);
-  } =>#t104;
-  core::Map<core::String, core::num> map81 = block {
-    final core::Map<core::String, core::num> #t107 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::num> #t108 in mapToInt.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
-    else
-      for (final core::MapEntry<core::String, core::num> #t109 in mapToDouble.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
-  core::List<dynamic> list82 = block {
-    final core::List<dynamic> #t110 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t111 in listInt)
-        #t110.{core::List::add}(#t111);
-    else
-      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t110.{core::List::add}(#t112);
-  } =>#t110;
-  core::Set<dynamic> set82 = block {
-    final core::Set<dynamic> #t113 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t114 in listInt)
-        #t113.{core::Set::add}(#t114);
-    else
-      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t113.{core::Set::add}(#t115);
-    #t113.{core::Set::add}(null);
-  } =>#t113;
-  core::Set<dynamic> map82 = block {
-    final core::Set<dynamic> #t116 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                     ^");
-    else
-      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t116.{core::Set::add}(#t117);
-    #t116.{core::Set::add}(null);
-  } =>#t116;
-  core::List<core::num> list83 = block {
-    final core::List<core::num> #t118 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t118.{core::List::add}(42);
-    else
-      for (final core::num #t119 in listDouble)
-        #t118.{core::List::add}(#t119);
-  } =>#t118;
-  core::Set<core::num> set83 = block {
-    final core::Set<core::num> #t120 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t121 in listInt)
-        #t120.{core::Set::add}(#t121);
-    else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
-  core::Map<core::String, core::num> map83 = block {
-    final core::Map<core::String, core::num> #t122 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::num> #t123 in mapToInt.{core::Map::entries})
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
-    else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
-  core::List<core::int> list90 = block {
-    final core::List<core::int> #t124 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t124.{core::List::add}(dynVar as{TypeError} core::int);
-  } =>#t124;
-  core::Set<core::int> set90 = block {
-    final core::Set<core::int> #t125 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t125.{core::Set::add}(dynVar as{TypeError} core::int);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t126 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
-  core::List<core::int> list91 = block {
-    final core::List<core::int> #t127 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t129 = #t128 as{TypeError} core::int;
-        #t127.{core::List::add}(#t129);
-      }
-  } =>#t127;
-  core::Set<core::int> set91 = block {
-    final core::Set<core::int> #t130 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t132 = #t131 as{TypeError} core::int;
-        #t130.{core::Set::add}(#t132);
-      }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
-  core::Map<core::String, core::int> map91 = block {
-    final core::Map<core::String, core::int> #t133 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<dynamic, dynamic> #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-        final core::String #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String;
-        final core::int #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int;
-        #t133.{core::Map::[]=}(#t135, #t136);
-      }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t137 = <core::int>[];
-    if(dynVar as{TypeError} core::bool)
-      #t137.{core::List::add}(42);
-  } =>#t137;
-  core::Set<core::int> set100 = block {
-    final core::Set<core::int> #t138 = col::LinkedHashSet::•<core::int>();
-    if(dynVar as{TypeError} core::bool)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
-  core::Map<core::int, core::int> map100 = block {
-    final core::Map<core::int, core::int> #t139 = <core::int, core::int>{};
-    if(dynVar as{TypeError} core::bool)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
-}
-static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
-  block {
-    final core::List<core::int> #t140 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[if (oracle(\"foo\")) \"bar\"];
-                           ^" in "bar" as{TypeError} core::int);
-  } =>#t140;
-  block {
-    final core::Set<core::int> #t142 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{if (oracle(\"foo\")) \"bar\", null};
-                           ^" in "bar" as{TypeError} core::int);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
-  block {
-    final core::Map<core::String, core::int> #t144 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
-                                          ^" in "bar" as{TypeError} core::int);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
-  block {
-    final core::List<core::int> #t146 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t147 in <core::int>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
-                               ^" in "bar" as{TypeError} core::int])
-        #t146.{core::List::add}(#t147);
-  } =>#t146;
-  block {
-    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t150 in <core::int>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
-                               ^" in "bar" as{TypeError} core::int])
-        #t149.{core::Set::add}(#t150);
-    #t149.{core::Set::add}(null);
-  } =>#t149;
-  block {
-    final core::Map<core::String, core::int> #t152 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t153 in <core::String, core::int>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                              ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
-        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
-  block {
-    final core::List<core::int> #t155 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                              ^");
-  } =>#t155;
-  block {
-    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t157 = <core::String>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[if (oracle(\"foo\")) 42 else 3.14];
-                              ^" in 42 as{TypeError} core::String);
-    else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[if (oracle(\"foo\")) 42 else 3.14];
-                                      ^" in 3.14 as{TypeError} core::String);
-  } =>#t157;
-  block {
-    final core::Set<core::String> #t160 = col::LinkedHashSet::•<core::String>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
-                              ^" in 42 as{TypeError} core::String);
-    else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
-                                      ^" in 3.14 as{TypeError} core::String);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
-  block {
-    final core::Map<core::String, core::String> #t163 = <core::String, core::String>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
-                                             ^" in 42 as{TypeError} core::String);
-    else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
-                                                            ^" in 3.14 as{TypeError} core::String);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
-  block {
-    final core::List<core::int> #t166 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                              ^");
-    else
-      #t166.{core::List::add}(42);
-  } =>#t166;
-  block {
-    final core::Set<core::int> #t167 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t168 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t168.{core::List::add}(42);
-    else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                      ^");
-  } =>#t168;
-  block {
-    final core::Set<core::int> #t169 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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/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/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/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/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<<BottomType>, core::Null> map12 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
-  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
-                                  ^": null};
-  core::Map<<BottomType>, core::Null> map13 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/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> #t170 = <core::int>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  List<int> list20 = [if (42) 42];
-                          ^" in 42 as{TypeError} core::bool)
-      #t170.{core::List::add}(42);
-  } =>#t170;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t172 = col::LinkedHashSet::•<core::int>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  Set<int> set20 = {if (42) 42};
-                        ^" in 42 as{TypeError} core::bool)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
-  core::Map<core::int, core::int> map30 = block {
-    final core::Map<core::int, core::int> #t174 = <core::int, core::int>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  Map<int, int> map30 = {if (42) 42: 42};
-                             ^" in 42 as{TypeError} core::bool)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
-  core::List<core::String> list40 = block {
-    final core::List<core::String> #t176 = <core::String>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
-                                                    ^" in true as{TypeError} core::String);
-    else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
-                                                              ^" in 42 as{TypeError} core::String);
-  } =>#t176;
-  core::Set<core::String> set40 = block {
-    final core::Set<core::String> #t179 = col::LinkedHashSet::•<core::String>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
-                                                  ^" in true as{TypeError} core::String);
-    else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
-                                                            ^" in 42 as{TypeError} core::String);
-  } =>#t179;
-  core::Map<core::String, core::int> map40 = block {
-    final core::Map<core::String, core::int> #t182 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
-                                                            ^" in true as{TypeError} core::String, 42);
-    else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
-                                                                          ^" in 42 as{TypeError} core::String, 42);
-  } =>#t182;
-  core::Map<core::int, core::String> map41 = block {
-    final core::Map<core::int, core::String> #t185 = <core::int, core::String>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
-                                                                ^" in true as{TypeError} core::String);
-    else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
-                                                                              ^" in 42 as{TypeError} core::String);
-  } =>#t185;
-}
-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> #t188 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
-  core::Set<core::int> set10 = block {
-    final core::Set<core::int> #t189 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
-  core::Map<core::String, core::int> map10 = block {
-    final core::Map<core::String, core::int> #t190 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
-  core::List<dynamic> list11 = block {
-    final core::List<dynamic> #t191 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
-  core::Set<dynamic> set11 = block {
-    final core::Set<dynamic> #t192 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
-  core::Map<core::String, dynamic> map11 = block {
-    final core::Map<core::String, dynamic> #t193 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
-  core::List<core::List<core::int>> list12 = block {
-    final core::List<core::List<core::int>> #t194 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int>[42]);
-  } =>#t194;
-  core::Set<core::List<core::int>> set12 = block {
-    final core::Set<core::List<core::int>> #t195 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
-  core::Map<core::String, core::List<core::int>> map12 = block {
-    final core::Map<core::String, core::List<core::int>> #t196 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
-  core::List<core::int> list20 = block {
-    final core::List<core::int> #t197 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t198 in <core::int>[42])
-        #t197.{core::List::add}(#t198);
-  } =>#t197;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t199 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t200 in <core::int>[42])
-        #t199.{core::Set::add}(#t200);
-    #t199.{core::Set::add}(null);
-  } =>#t199;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t201 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::int> #t202 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
-  core::List<dynamic> list21 = block {
-    final core::List<dynamic> #t203 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t204 in <dynamic>[dynVar])
-        #t203.{core::List::add}(#t204);
-  } =>#t203;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t205 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t206 in <dynamic>[dynVar])
-        #t205.{core::Set::add}(#t206);
-    #t205.{core::Set::add}(null);
-  } =>#t205;
-  core::Map<core::String, dynamic> map21 = block {
-    final core::Map<core::String, dynamic> #t207 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, dynamic> #t208 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
-  core::List<core::List<core::int>> list22 = block {
-    final core::List<core::List<core::int>> #t209 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t210 in <core::List<core::int>>[<core::int>[42]])
-        #t209.{core::List::add}(#t210);
-  } =>#t209;
-  core::Set<core::List<core::int>> set22 = block {
-    final core::Set<core::List<core::int>> #t211 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t212 in <core::List<core::int>>[<core::int>[42]])
-        #t211.{core::Set::add}(#t212);
-    #t211.{core::Set::add}(null);
-  } =>#t211;
-  core::Map<core::String, core::List<core::int>> map22 = block {
-    final core::Map<core::String, core::List<core::int>> #t213 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t214 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
-  core::List<core::int> list30 = block {
-    final core::List<core::int> #t215 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t216 in <core::int>[42])
-          #t215.{core::List::add}(#t216);
-  } =>#t215;
-  core::Set<core::int> set30 = block {
-    final core::Set<core::int> #t217 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t218 in <core::int>[42])
-          #t217.{core::Set::add}(#t218);
-    #t217.{core::Set::add}(null);
-  } =>#t217;
-  core::Map<core::String, core::int> map30 = block {
-    final core::Map<core::String, core::int> #t219 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t220 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
-  core::List<dynamic> list31 = block {
-    final core::List<dynamic> #t221 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t222 in <dynamic>[dynVar])
-          #t221.{core::List::add}(#t222);
-  } =>#t221;
-  core::Set<dynamic> set31 = block {
-    final core::Set<dynamic> #t223 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t224 in <dynamic>[dynVar])
-          #t223.{core::Set::add}(#t224);
-    #t223.{core::Set::add}(null);
-  } =>#t223;
-  core::Map<core::String, dynamic> map31 = block {
-    final core::Map<core::String, dynamic> #t225 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, dynamic> #t226 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
-  core::List<core::List<core::int>> list33 = block {
-    final core::List<core::List<core::int>> #t227 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t228 in <core::List<core::int>>[<core::int>[42]])
-          #t227.{core::List::add}(#t228);
-  } =>#t227;
-  core::Set<core::List<core::int>> set33 = block {
-    final core::Set<core::List<core::int>> #t229 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t230 in <core::List<core::int>>[<core::int>[42]])
-          #t229.{core::Set::add}(#t230);
-    #t229.{core::Set::add}(null);
-  } =>#t229;
-  core::Map<core::String, core::List<core::int>> map33 = block {
-    final core::Map<core::String, core::List<core::int>> #t231 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t232 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
-  core::List<core::List<core::int>> list40 = block {
-    final core::List<core::List<core::int>> #t233 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t234 in <core::List<core::int>>[<core::int>[]])
-        #t233.{core::List::add}(#t234);
-  } =>#t233;
-  core::Set<core::List<core::int>> set40 = block {
-    final core::Set<core::List<core::int>> #t235 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t236 in <core::List<core::int>>[<core::int>[]])
-        #t235.{core::Set::add}(#t236);
-    #t235.{core::Set::add}(null);
-  } =>#t235;
-  core::Map<core::String, core::List<core::int>> map40 = block {
-    final core::Map<core::String, core::List<core::int>> #t237 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t238 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
-  core::List<core::List<core::int>> list41 = block {
-    final core::List<core::List<core::int>> #t239 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t240 in let final core::Set<core::List<core::int>> #t241 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t242 = #t241.{core::Set::add}(<core::int>[]) in #t241)
-        #t239.{core::List::add}(#t240);
-  } =>#t239;
-  core::Set<core::List<core::int>> set41 = block {
-    final core::Set<core::List<core::int>> #t243 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t244 in let final core::Set<core::List<core::int>> #t245 = col::LinkedHashSet::•<core::List<core::int>>() in let final dynamic #t246 = #t245.{core::Set::add}(<core::int>[]) in #t245)
-        #t243.{core::Set::add}(#t244);
-    #t243.{core::Set::add}(null);
-  } =>#t243;
-  core::List<core::List<core::int>> list42 = block {
-    final core::List<core::List<core::int>> #t247 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t248 in <core::List<core::int>>[<core::int>[]])
-          #t247.{core::List::add}(#t248);
-  } =>#t247;
-  core::Set<core::List<core::int>> set42 = block {
-    final core::Set<core::List<core::int>> #t249 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t250 in <core::List<core::int>>[<core::int>[]])
-          #t249.{core::Set::add}(#t250);
-    #t249.{core::Set::add}(null);
-  } =>#t249;
-  core::Map<core::String, core::List<core::int>> map42 = block {
-    final core::Map<core::String, core::List<core::int>> #t251 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t252 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
-  core::List<core::int> list50 = block {
-    final core::List<core::int> #t253 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t254 in <core::int>[])
-        #t253.{core::List::add}(#t254);
-  } =>#t253;
-  core::Set<core::int> set50 = block {
-    final core::Set<core::int> #t255 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t256 in <core::int>[])
-        #t255.{core::Set::add}(#t256);
-    #t255.{core::Set::add}(null);
-  } =>#t255;
-  core::Map<core::String, core::int> map50 = block {
-    final core::Map<core::String, core::int> #t257 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::int> #t258 in <core::String, core::int>{}.{core::Map::entries})
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
-  core::List<core::int> list51 = block {
-    final core::List<core::int> #t259 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t260 in let final core::Set<core::int> #t261 = col::LinkedHashSet::•<core::int>() in #t261)
-        #t259.{core::List::add}(#t260);
-  } =>#t259;
-  core::Set<core::int> set51 = block {
-    final core::Set<core::int> #t262 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t263 in let final core::Set<core::int> #t264 = col::LinkedHashSet::•<core::int>() in #t264)
-        #t262.{core::Set::add}(#t263);
-    #t262.{core::Set::add}(null);
-  } =>#t262;
-  core::List<core::int> list52 = block {
-    final core::List<core::int> #t265 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t266 in <core::int>[])
-          #t265.{core::List::add}(#t266);
-  } =>#t265;
-  core::Set<core::int> set52 = block {
-    final core::Set<core::int> #t267 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t268 in <core::int>[])
-          #t267.{core::Set::add}(#t268);
-    #t267.{core::Set::add}(null);
-  } =>#t267;
-  core::List<core::List<core::int>> list60 = block {
-    final core::List<core::List<core::int>> #t269 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t270 in <core::List<core::int>>[<core::int>[]])
-        #t269.{core::List::add}(#t270);
-  } =>#t269;
-  core::Set<core::List<core::int>> set60 = block {
-    final core::Set<core::List<core::int>> #t271 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t272 in <core::List<core::int>>[<core::int>[]])
-        #t271.{core::Set::add}(#t272);
-    #t271.{core::Set::add}(null);
-  } =>#t271;
-  core::Map<core::String, core::List<core::int>> map60 = block {
-    final core::Map<core::String, core::List<core::int>> #t273 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t274 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
-  core::List<core::List<core::int>> list61 = block {
-    final core::List<core::List<core::int>> #t275 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t276 in <core::List<core::int>>[<core::int>[]])
-          #t275.{core::List::add}(#t276);
-  } =>#t275;
-  core::Set<core::List<core::int>> set61 = block {
-    final core::Set<core::List<core::int>> #t277 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t278 in <core::List<core::int>>[<core::int>[]])
-          #t277.{core::Set::add}(#t278);
-    #t277.{core::Set::add}(null);
-  } =>#t277;
-  core::Map<core::String, core::List<core::int>> map61 = block {
-    final core::Map<core::String, core::List<core::int>> #t279 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t280 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
-    #t279.{core::Map::[]=}("baz", null);
-  } =>#t279;
-  core::List<core::List<core::int>> list70 = block {
-    final core::List<core::List<core::int>> #t281 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int>[]);
-  } =>#t281;
-  core::Set<core::List<core::int>> set70 = block {
-    final core::Set<core::List<core::int>> #t282 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
-  core::Map<core::String, core::List<core::int>> map70 = block {
-    final core::Map<core::String, core::List<core::int>> #t283 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
-  core::List<core::List<core::int>> list71 = block {
-    final core::List<core::List<core::int>> #t284 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t284.{core::List::add}(<core::int>[]);
-  } =>#t284;
-  core::Set<core::List<core::int>> set71 = block {
-    final core::Set<core::List<core::int>> #t285 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t285.{core::Set::add}(<core::int>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
-  core::Map<core::String, core::List<core::int>> map71 = block {
-    final core::Map<core::String, core::List<core::int>> #t286 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t286.{core::Map::[]=}("bar", <core::int>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
-  core::List<core::num> list80 = block {
-    final core::List<core::num> #t287 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t287.{core::List::add}(42);
-      else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
-  core::Set<core::num> set80 = block {
-    final core::Set<core::num> #t288 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t288.{core::Set::add}(42);
-      else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
-  core::Map<core::String, core::num> map80 = block {
-    final core::Map<core::String, core::num> #t289 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t289.{core::Map::[]=}("bar", 42);
-      else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
-  core::List<core::num> list81 = block {
-    final core::List<core::num> #t290 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t291 in listInt)
-          #t290.{core::List::add}(#t291);
-      else
-        for (final core::num #t292 in listDouble)
-          #t290.{core::List::add}(#t292);
-  } =>#t290;
-  core::Set<core::num> set81 = block {
-    final core::Set<core::num> #t293 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t294 in listInt)
-          #t293.{core::Set::add}(#t294);
-      else
-        for (final core::num #t295 in listDouble)
-          #t293.{core::Set::add}(#t295);
-    #t293.{core::Set::add}(null);
-  } =>#t293;
-  core::Map<core::String, core::num> map81 = block {
-    final core::Map<core::String, core::num> #t296 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::num> #t297 in mapStringInt.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<core::String, core::num> #t298 in mapStringDouble.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
-  core::List<dynamic> list82 = block {
-    final core::List<dynamic> #t299 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t300 in listInt)
-          #t299.{core::List::add}(#t300);
-      else
-        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>)
-          #t299.{core::List::add}(#t301);
-  } =>#t299;
-  core::Set<dynamic> set82 = block {
-    final core::Set<dynamic> #t302 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t303 in listInt)
-          #t302.{core::Set::add}(#t303);
-      else
-        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>)
-          #t302.{core::Set::add}(#t304);
-    #t302.{core::Set::add}(null);
-  } =>#t302;
-  core::Map<dynamic, dynamic> map82 = block {
-    final core::Map<dynamic, dynamic> #t305 = <dynamic, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<dynamic, dynamic> #t306 in mapStringInt.{core::Map::entries})
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<dynamic, dynamic> #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
-  core::List<core::num> list83 = block {
-    final core::List<core::num> #t308 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t308.{core::List::add}(42);
-      else
-        for (final core::num #t309 in listDouble)
-          #t308.{core::List::add}(#t309);
-  } =>#t308;
-  core::Set<core::num> set83 = block {
-    final core::Set<core::num> #t310 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t311 in listInt)
-          #t310.{core::Set::add}(#t311);
-      else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
-  core::Map<core::String, core::num> map83 = block {
-    final core::Map<core::String, core::num> #t312 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::num> #t313 in mapStringInt.{core::Map::entries})
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
-      else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
-  core::List<core::int> list90 = block {
-    final core::List<core::int> #t314 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError} core::int);
-  } =>#t314;
-  core::Set<core::int> set90 = block {
-    final core::Set<core::int> #t315 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError} core::int);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t316 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
-  core::List<core::int> list91 = block {
-    final core::List<core::int> #t317 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t319 = #t318 as{TypeError} core::int;
-        #t317.{core::List::add}(#t319);
-      }
-  } =>#t317;
-  core::Set<core::int> set91 = block {
-    final core::Set<core::int> #t320 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t322 = #t321 as{TypeError} core::int;
-        #t320.{core::Set::add}(#t322);
-      }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
-  core::Map<core::String, core::int> map91 = block {
-    final core::Map<core::String, core::int> #t323 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, dynamic> #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-        final core::String #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String;
-        final core::int #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int;
-        #t323.{core::Map::[]=}(#t325, #t326);
-      }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t327 = <core::int>[];
-    for (final core::int #t328 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
-  core::Set<core::int> set100 = block {
-    final core::Set<core::int> #t329 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t330 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
-  core::Map<core::String, core::int> map100 = block {
-    final core::Map<core::String, core::int> #t331 = <core::String, core::int>{};
-    for (final core::int #t332 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
-  core::List<core::int> list110 = block {
-    final core::List<core::int> #t333 = <core::int>[];
-    for (core::int i in <core::int>[1, 2, 3])
-      #t333.{core::List::add}(i);
-  } =>#t333;
-  core::Set<core::int> set110 = block {
-    final core::Set<core::int> #t334 = col::LinkedHashSet::•<core::int>();
-    for (core::int i in <core::int>[1, 2, 3])
-      #t334.{core::Set::add}(i);
-    #t334.{core::Set::add}(null);
-  } =>#t334;
-  core::Map<core::String, core::int> map110 = block {
-    final core::Map<core::String, core::int> #t335 = <core::String, core::int>{};
-    for (core::int i in <core::int>[1, 2, 3])
-      #t335.{core::Map::[]=}("bar", i);
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
-  core::List<core::int> list120 = block {
-    final core::List<core::int> #t336 = <core::int>[];
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t336.{core::List::add}(i as{TypeError} core::int);
-  } =>#t336;
-  core::Set<core::int> set120 = block {
-    final core::Set<core::int> #t337 = col::LinkedHashSet::•<core::int>();
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t337.{core::Set::add}(i as{TypeError} core::int);
-    #t337.{core::Set::add}(null);
-  } =>#t337;
-  core::Map<core::String, core::int> map120 = block {
-    final core::Map<core::String, core::int> #t338 = <core::String, core::int>{};
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int);
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
-  core::List<core::int> list130 = block {
-    final core::List<core::int> #t339 = <core::int>[];
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
-  core::Set<core::int> set130 = block {
-    final core::Set<core::int> #t340 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
-  core::Map<core::int, core::int> map130 = block {
-    final core::Map<core::int, core::int> #t341 = <core::int, core::int>{};
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
-}
-static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic async {
-  block {
-    final core::List<core::int> #t342 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
-                                            ^" in "bar" as{TypeError} core::int);
-  } =>#t342;
-  block {
-    final core::Set<core::int> #t344 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
-                                            ^" in "bar" as{TypeError} core::int);
-    #t344.{core::Set::add}(null);
-  } =>#t344;
-  block {
-    final core::Map<core::int, core::int> #t346 = <core::int, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                        ^" in "bar" as{TypeError} core::int);
-    #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                               ^" in "baz" as{TypeError} core::int, null);
-  } =>#t346;
-  block {
-    final core::List<core::int> #t350 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t351 in <core::int>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
-                                                ^" in "bar" as{TypeError} core::int])
-        #t350.{core::List::add}(#t351);
-  } =>#t350;
-  block {
-    final core::Set<core::int> #t353 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t354 in <core::int>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
-                                                ^" in "bar" as{TypeError} core::int])
-        #t353.{core::Set::add}(#t354);
-    #t353.{core::Set::add}(null);
-  } =>#t353;
-  block {
-    final core::Map<core::int, core::int> #t356 = <core::int, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::int, core::int> #t357 in <core::int, core::int>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                            ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
-        #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
-    #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                                    ^" in "baz" as{TypeError} core::int, null);
-  } =>#t356;
-  block {
-    final core::List<core::int> #t361 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                               ^");
-  } =>#t361;
-  block {
-    final core::Set<core::int> #t362 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                               ^");
-    #t362.{core::Set::add}(null);
-  } =>#t362;
-  <core::int, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t363 = <core::String>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
-                                                             ^" in 42 as{TypeError} core::String);
-      else
-        #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
-                                                                     ^" in 3.14 as{TypeError} core::String);
-  } =>#t363;
-  block {
-    final core::Set<core::String> #t366 = col::LinkedHashSet::•<core::String>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
-                                                             ^" in 42 as{TypeError} core::String);
-      else
-        #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
-                                                                     ^" in 3.14 as{TypeError} core::String);
-    #t366.{core::Set::add}(null);
-  } =>#t366;
-  block {
-    final core::Map<core::String, core::String> #t369 = <core::String, core::String>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to '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);
-      else
-        #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to '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);
-    #t369.{core::Map::[]=}("baz", null);
-  } =>#t369;
-  block {
-    final core::List<core::int> #t372 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                                             ^");
-      else
-        #t372.{core::List::add}(42);
-  } =>#t372;
-  block {
-    final core::Set<core::int> #t373 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                                             ^");
-      else
-        #t373.{core::Set::add}(42);
-    #t373.{core::Set::add}(null);
-  } =>#t373;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t374 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t374.{core::List::add}(42);
-      else
-        #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                                                     ^");
-  } =>#t374;
-  block {
-    final core::Set<core::int> #t375 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t375.{core::Set::add}(42);
-      else
-        #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                                                     ^");
-    #t375.{core::Set::add}(null);
-  } =>#t375;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t376 = <core::int>[];
-    for (final core::int #t377 in <core::int>[1]) {
-      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
-  <int>[for (i in <int>[1]) i];
-             ^";
-      #t376.{core::List::add}(i);
-    }
-  } =>#t376;
-  block {
-    final core::Set<core::int> #t378 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t379 in <core::int>[1]) {
-      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
-  <int>{for (i in <int>[1]) i, null};
-             ^";
-      #t378.{core::Set::add}(i);
-    }
-    #t378.{core::Set::add}(null);
-  } =>#t378;
-  block {
-    final core::Map<core::String, core::int> #t380 = <core::String, core::int>{};
-    for (final core::int #t381 in <core::int>[1]) {
-      invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
-\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
-\t                   ^";
-      #t380.{core::Map::[]=}("bar", i);
-    }
-    #t380.{core::Map::[]=}("baz", null);
-  } =>#t380;
-  core::List<dynamic> list10 = block {
-    final core::List<dynamic> #t382 = <dynamic>[];
-    for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/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>)
-      #t382.{core::List::add}(i);
-  } =>#t382;
-  core::Set<dynamic> set10 = block {
-    final core::Set<dynamic> #t384 = col::LinkedHashSet::•<dynamic>();
-    for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/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>)
-      #t384.{core::Set::add}(i);
-    #t384.{core::Set::add}(null);
-  } =>#t384;
-  core::Map<core::String, dynamic> map10 = block {
-    final core::Map<core::String, dynamic> #t386 = <core::String, dynamic>{};
-    for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/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>)
-      #t386.{core::Map::[]=}("bar", i);
-    #t386.{core::Map::[]=}("baz", null);
-  } =>#t386;
-  core::List<core::int> list20 = block {
-    final core::List<core::int> #t388 = <core::int>[];
-    for (core::int i in <core::int>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list20 = [for (int i in [\"not\", \"int\"]) i];
-                                      ^" in "int" as{TypeError} core::int])
-      #t388.{core::List::add}(i);
-  } =>#t388;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t391 = col::LinkedHashSet::•<core::int>();
-    for (core::int i in <core::int>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                                     ^" in "int" as{TypeError} core::int])
-      #t391.{core::Set::add}(i);
-    #t391.{core::Set::add}(null);
-  } =>#t391;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t394 = <core::String, core::int>{};
-    for (core::int i in <core::int>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                                     ^" in "int" as{TypeError} core::int])
-      #t394.{core::Map::[]=}("bar", i);
-    #t394.{core::Map::[]=}("baz", null);
-  } =>#t394;
-  core::List<dynamic> list30 = block {
-    final core::List<dynamic> #t397 = <dynamic>[];
-    await for (dynamic i in let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/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>)
-      #t397.{core::List::add}(i);
-  } =>#t397;
-  core::Set<dynamic> set30 = block {
-    final core::Set<dynamic> #t399 = col::LinkedHashSet::•<dynamic>();
-    await for (dynamic i in let final<BottomType> #t400 = invalid-expression "pkg/front_end/testcases/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>)
-      #t399.{core::Set::add}(i);
-    #t399.{core::Set::add}(null);
-  } =>#t399;
-  core::Map<core::String, dynamic> map30 = block {
-    final core::Map<core::String, dynamic> #t401 = <core::String, dynamic>{};
-    await for (dynamic i in let final<BottomType> #t402 = invalid-expression "pkg/front_end/testcases/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>)
-      #t401.{core::Map::[]=}("bar", i);
-    #t401.{core::Map::[]=}("baz", null);
-  } =>#t401;
-  core::List<core::int> list40 = block {
-    final core::List<core::int> #t403 = <core::int>[];
-    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t404 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int, let final<BottomType> #t405 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                                ^" in "int" as{TypeError} core::int]))
-      #t403.{core::List::add}(i);
-  } =>#t403;
-  core::Set<core::int> set40 = block {
-    final core::Set<core::int> #t406 = col::LinkedHashSet::•<core::int>();
-    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t407 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                               ^" in "int" as{TypeError} core::int]))
-      #t406.{core::Set::add}(i);
-    #t406.{core::Set::add}(null);
-  } =>#t406;
-  core::Map<core::String, core::int> map40 = block {
-    final core::Map<core::String, core::int> #t409 = <core::String, core::int>{};
-    await for (core::int i in asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t410 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t411 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                               ^" in "int" as{TypeError} core::int]))
-      #t409.{core::Map::[]=}("bar", i);
-    #t409.{core::Map::[]=}("baz", null);
-  } =>#t409;
-  core::List<core::int> list50 = block {
-    final core::List<core::int> #t412 = <core::int>[];
-    for (; ; )
-      #t412.{core::List::add}(42);
-  } =>#t412;
-  core::Set<core::int> set50 = block {
-    final core::Set<core::int> #t413 = col::LinkedHashSet::•<core::int>();
-    for (; ; )
-      #t413.{core::Set::add}(42);
-    #t413.{core::Set::add}(null);
-  } =>#t413;
-  core::Map<core::String, core::int> map50 = block {
-    final core::Map<core::String, core::int> #t414 = <core::String, core::int>{};
-    for (; ; )
-      #t414.{core::Map::[]=}("bar", 42);
-    #t414.{core::Map::[]=}("baz", null);
-  } =>#t414;
-  core::List<core::int> list60 = block {
-    final core::List<core::int> #t415 = <core::int>[];
-    for (; let final<BottomType> #t416 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var list60 = [for (; \"not bool\";) 42];
-                       ^" in "not bool" as{TypeError} core::bool; )
-      #t415.{core::List::add}(42);
-  } =>#t415;
-  core::Set<core::int> set60 = block {
-    final core::Set<core::int> #t417 = col::LinkedHashSet::•<core::int>();
-    for (; let final<BottomType> #t418 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var set60 = {for (; \"not bool\";) 42, null};
-                      ^" in "not bool" as{TypeError} core::bool; )
-      #t417.{core::Set::add}(42);
-    #t417.{core::Set::add}(null);
-  } =>#t417;
-  core::Map<core::String, core::int> map60 = block {
-    final core::Map<core::String, core::int> #t419 = <core::String, core::int>{};
-    for (; let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
-                      ^" in "not bool" as{TypeError} core::bool; )
-      #t419.{core::Map::[]=}("bar", 42);
-    #t419.{core::Map::[]=}("baz", null);
-  } =>#t419;
-}
-static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
-  block {
-    final core::List<core::int> #t421 = <core::int>[];
-    await for (core::int i in stream)
-      #t421.{core::List::add}(i);
-  } =>#t421;
-  block {
-    final core::Set<core::int> #t422 = col::LinkedHashSet::•<core::int>();
-    await for (core::int i in stream)
-      #t422.{core::Set::add}(i);
-  } =>#t422;
-  block {
-    final core::Map<core::String, core::int> #t423 = <core::String, core::int>{};
-    await for (core::int i in stream)
-      #t423.{core::Map::[]=}("bar", i);
-  } =>#t423;
-}
-static method testPromotion(self::A a) → dynamic {
-  core::List<core::int> list10 = block {
-    final core::List<core::int> #t424 = <core::int>[];
-    if(a is self::B)
-      #t424.{core::List::add}(a{self::B}.{self::B::foo});
-  } =>#t424;
-  core::Set<core::int> set10 = block {
-    final core::Set<core::int> #t425 = col::LinkedHashSet::•<core::int>();
-    if(a is self::B)
-      #t425.{core::Set::add}(a{self::B}.{self::B::foo});
-  } =>#t425;
-  core::Map<core::int, core::int> map10 = block {
-    final core::Map<core::int, core::int> #t426 = <core::int, core::int>{};
-    if(a is self::B)
-      #t426.{core::Map::[]=}(a{self::B}.{self::B::foo}, a{self::B}.{self::B::foo});
-  } =>#t426;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect
deleted file mode 100644
index 3c4ea93..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.strong.transformed.expect
+++ /dev/null
@@ -1,2464 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[if (oracle("foo")) "bar"];
-//                            ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{if (oracle("foo")) "bar", null};
-//                            ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
-//                                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[if (oracle("foo")) ...["bar"]];
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{if (oracle("foo")) ...["bar"], null};
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
-//                                               ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[if (oracle("foo")) 42 else 3.14];
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{if (oracle("foo")) 42 else 3.14, null};
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
-//                                                             ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   List<int> list20 = [if (42) 42];
-//                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   Set<int> set20 = {if (42) 42};
-//                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   Map<int, int> map30 = {if (42) 42: 42};
-//                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                                     ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
-//                                                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                                   ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<String, int> map40 = <String, int>{if (oracle("foo")) true: 42 else 42: 42};
-//                                                                           ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
-//                                                                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
-//   <int>[for (i in <int>[1]) i];
-//              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
-//   <int>{for (i in <int>[1]) i, null};
-//              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
-// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
-// 	                   ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-//                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-//                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                  ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-//                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-//                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-//                                                                     ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-//                                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                              ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-//                                                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                                             ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//   <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-//                                                                                            ^
-//
-// pkg/front_end/testcases/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/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/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/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/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/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/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/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/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/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list20 = [for (int i in ["not", "int"]) i];
-//                                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set20 = {for (int i in ["not", "int"]) i, null};
-//                                      ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                               ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
-//                                      ^
-//
-// pkg/front_end/testcases/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/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/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/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                                                          ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
-//                                                                 ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                                                         ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var map40 = {await for (int i in Stream.fromIterable(["not", "int"])) "bar": i, "baz": null};
-//                                                                ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var list60 = [for (; "not bool";) 42];
-//                        ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var set60 = {for (; "not bool";) 42, null};
-//                       ^
-//
-// pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-// Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-//   var map60 = {for (; "not bool";) "bar": 42, "baz": null};
-//                       ^
-//
-// pkg/front_end/testcases/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/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/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::•()
-    ;
-}
-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 = null]) → 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} core::bool)
-      #t1.{core::List::add}(42);
-  } =>#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} core::bool)
-      #t2.{core::Set::add}(42);
-    #t2.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t3.{core::Map::[]=}("bar", 42);
-    #t3.{core::Map::[]=}("baz", null);
-  } =>#t3;
-  core::List<dynamic> list11 = block {
-    final core::List<dynamic> #t4 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t4.{core::List::add}(dynVar);
-  } =>#t4;
-  core::Set<dynamic> set11 = block {
-    final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t5.{core::Set::add}(dynVar);
-    #t5.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t6.{core::Map::[]=}("bar", dynVar);
-    #t6.{core::Map::[]=}("baz", null);
-  } =>#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} core::bool)
-      #t7.{core::List::add}(<core::int>[42]);
-  } =>#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} core::bool)
-      #t8.{core::Set::add}(<core::int>[42]);
-    #t8.{core::Set::add}(null);
-  } =>#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} core::bool)
-      #t9.{core::Map::[]=}("bar", <core::int>[42]);
-    #t9.{core::Map::[]=}("baz", null);
-  } =>#t9;
-  core::List<core::int> list20 = block {
-    final core::List<core::int> #t10 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t11 in <core::int>[42])
-        #t10.{core::List::add}(#t11);
-  } =>#t10;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t13 in <core::int>[42])
-        #t12.{core::Set::add}(#t13);
-    #t12.{core::Set::add}(null);
-  } =>#t12;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t14 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t15 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
-    #t14.{core::Map::[]=}("baz", null);
-  } =>#t14;
-  core::List<dynamic> list21 = block {
-    final core::List<dynamic> #t16 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t17 in <dynamic>[dynVar])
-        #t16.{core::List::add}(#t17);
-  } =>#t16;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t18 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t19 in <dynamic>[dynVar])
-        #t18.{core::Set::add}(#t19);
-    #t18.{core::Set::add}(null);
-  } =>#t18;
-  core::Map<core::String, dynamic> map21 = block {
-    final core::Map<core::String, dynamic> #t20 = <core::String, dynamic>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, dynamic> #t21 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
-    #t20.{core::Map::[]=}("baz", null);
-  } =>#t20;
-  core::List<core::List<core::int>> list22 = block {
-    final core::List<core::List<core::int>> #t22 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t23 in <core::List<core::int>>[<core::int>[42]])
-        #t22.{core::List::add}(#t23);
-  } =>#t22;
-  core::Set<core::List<core::int>> set22 = block {
-    final core::Set<core::List<core::int>> #t24 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t25 in <core::List<core::int>>[<core::int>[42]])
-        #t24.{core::Set::add}(#t25);
-    #t24.{core::Set::add}(null);
-  } =>#t24;
-  core::Map<core::String, core::List<core::int>> map22 = block {
-    final core::Map<core::String, core::List<core::int>> #t26 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::List<core::int>> #t27 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
-    #t26.{core::Map::[]=}("baz", null);
-  } =>#t26;
-  core::List<core::int> list30 = block {
-    final core::List<core::int> #t28 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t29 in <core::int>[42])
-          #t28.{core::List::add}(#t29);
-  } =>#t28;
-  core::Set<core::int> set30 = block {
-    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t31 in <core::int>[42])
-          #t30.{core::Set::add}(#t31);
-    #t30.{core::Set::add}(null);
-  } =>#t30;
-  core::Map<core::String, core::int> map30 = block {
-    final core::Map<core::String, core::int> #t32 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t33 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
-    #t32.{core::Map::[]=}("baz", null);
-  } =>#t32;
-  core::List<dynamic> list31 = block {
-    final core::List<dynamic> #t34 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t35 in <dynamic>[dynVar])
-          #t34.{core::List::add}(#t35);
-  } =>#t34;
-  core::Set<dynamic> set31 = block {
-    final core::Set<dynamic> #t36 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t37 in <dynamic>[dynVar])
-          #t36.{core::Set::add}(#t37);
-    #t36.{core::Set::add}(null);
-  } =>#t36;
-  core::Map<core::String, dynamic> map31 = block {
-    final core::Map<core::String, dynamic> #t38 = <core::String, dynamic>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, dynamic> #t39 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
-    #t38.{core::Map::[]=}("baz", null);
-  } =>#t38;
-  core::List<core::List<core::int>> list33 = block {
-    final core::List<core::List<core::int>> #t40 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t41 in <core::List<core::int>>[<core::int>[42]])
-          #t40.{core::List::add}(#t41);
-  } =>#t40;
-  core::Set<core::List<core::int>> set33 = block {
-    final core::Set<core::List<core::int>> #t42 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t43 in <core::List<core::int>>[<core::int>[42]])
-          #t42.{core::Set::add}(#t43);
-    #t42.{core::Set::add}(null);
-  } =>#t42;
-  core::Map<core::String, core::List<core::int>> map33 = block {
-    final core::Map<core::String, core::List<core::int>> #t44 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t45 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
-    #t44.{core::Map::[]=}("baz", null);
-  } =>#t44;
-  core::List<core::List<core::int>> list40 = block {
-    final core::List<core::List<core::int>> #t46 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t47 in <core::List<core::int>>[<core::int>[]])
-        #t46.{core::List::add}(#t47);
-  } =>#t46;
-  core::Set<core::List<core::int>> set40 = block {
-    final core::Set<core::List<core::int>> #t48 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t49 in <core::List<core::int>>[<core::int>[]])
-        #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(null);
-  } =>#t48;
-  core::Map<core::String, core::List<core::int>> map40 = invalid-expression "pkg/front_end/testcases/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>> #t50 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t51 in let final core::Set<core::List<core::int>> #t52 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t53 = #t52.{core::Set::add}(<core::int>[]) in #t52)
-        #t50.{core::List::add}(#t51);
-  } =>#t50;
-  core::Set<core::List<core::int>> set41 = block {
-    final core::Set<core::List<core::int>> #t54 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t55 in let final core::Set<core::List<core::int>> #t56 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t57 = #t56.{core::Set::add}(<core::int>[]) in #t56)
-        #t54.{core::Set::add}(#t55);
-    #t54.{core::Set::add}(null);
-  } =>#t54;
-  core::List<core::List<core::int>> list42 = block {
-    final core::List<core::List<core::int>> #t58 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t59 in <core::List<core::int>>[<core::int>[]])
-          #t58.{core::List::add}(#t59);
-  } =>#t58;
-  core::Set<core::List<core::int>> set42 = block {
-    final core::Set<core::List<core::int>> #t60 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t61 in <core::List<core::int>>[<core::int>[]])
-          #t60.{core::Set::add}(#t61);
-    #t60.{core::Set::add}(null);
-  } =>#t60;
-  core::Map<core::String, core::List<core::int>> map42 = 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} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} 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})
-          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
-    #t62.{core::Map::[]=}("baz", null);
-  } =>#t62;
-  core::List<core::int> list50 = block {
-    final core::List<core::int> #t64 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t65 in <core::int>[])
-        #t64.{core::List::add}(#t65);
-  } =>#t64;
-  core::Set<core::int> set50 = block {
-    final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t67 in <core::int>[])
-        #t66.{core::Set::add}(#t67);
-    #t66.{core::Set::add}(null);
-  } =>#t66;
-  core::Map<core::String, core::int> map50 = block {
-    final core::Map<core::String, core::int> #t68 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t69 in <core::String, core::int>{}.{core::Map::entries})
-        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
-    #t68.{core::Map::[]=}("baz", null);
-  } =>#t68;
-  core::List<core::int> list51 = block {
-    final core::List<core::int> #t70 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t71 in let final core::Set<core::int> #t72 = col::LinkedHashSet::•<core::int>() in #t72)
-        #t70.{core::List::add}(#t71);
-  } =>#t70;
-  core::Set<core::int> set51 = block {
-    final core::Set<core::int> #t73 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t74 in let final core::Set<core::int> #t75 = col::LinkedHashSet::•<core::int>() in #t75)
-        #t73.{core::Set::add}(#t74);
-    #t73.{core::Set::add}(null);
-  } =>#t73;
-  core::List<core::int> list52 = block {
-    final core::List<core::int> #t76 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t77 in <core::int>[])
-          #t76.{core::List::add}(#t77);
-  } =>#t76;
-  core::Set<core::int> set52 = block {
-    final core::Set<core::int> #t78 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t79 in <core::int>[])
-          #t78.{core::Set::add}(#t79);
-    #t78.{core::Set::add}(null);
-  } =>#t78;
-  core::Map<core::String, core::int> map52 = block {
-    final core::Map<core::String, core::int> #t80 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t81 in <core::String, core::int>{}.{core::Map::entries})
-          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
-    #t80.{core::Map::[]=}("baz", null);
-  } =>#t80;
-  core::List<core::List<core::int>> list60 = block {
-    final core::List<core::List<core::int>> #t82 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t83 in <core::List<core::int>>[<core::int>[]])
-        #t82.{core::List::add}(#t83);
-  } =>#t82;
-  core::Set<core::List<core::int>> set60 = block {
-    final core::Set<core::List<core::int>> #t84 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::List<core::int> #t85 in <core::List<core::int>>[<core::int>[]])
-        #t84.{core::Set::add}(#t85);
-    #t84.{core::Set::add}(null);
-  } =>#t84;
-  core::Map<core::String, core::List<core::int>> map60 = block {
-    final core::Map<core::String, core::List<core::int>> #t86 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::List<core::int>> #t87 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-    #t86.{core::Map::[]=}("baz", null);
-  } =>#t86;
-  core::List<core::List<core::int>> list61 = block {
-    final core::List<core::List<core::int>> #t88 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t89 in <core::List<core::int>>[<core::int>[]])
-          #t88.{core::List::add}(#t89);
-  } =>#t88;
-  core::Set<core::List<core::int>> set61 = block {
-    final core::Set<core::List<core::int>> #t90 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t91 in <core::List<core::int>>[<core::int>[]])
-          #t90.{core::Set::add}(#t91);
-    #t90.{core::Set::add}(null);
-  } =>#t90;
-  core::Map<core::String, core::List<core::int>> map61 = block {
-    final core::Map<core::String, core::List<core::int>> #t92 = <core::String, core::List<core::int>>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t93 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
-    #t92.{core::Map::[]=}("baz", null);
-  } =>#t92;
-  core::List<core::List<core::int>> list70 = block {
-    final core::List<core::List<core::int>> #t94 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t94.{core::List::add}(<core::int>[]);
-  } =>#t94;
-  core::Set<core::List<core::int>> set70 = block {
-    final core::Set<core::List<core::int>> #t95 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t95.{core::Set::add}(<core::int>[]);
-    #t95.{core::Set::add}(null);
-  } =>#t95;
-  core::List<core::List<core::int>> list71 = block {
-    final core::List<core::List<core::int>> #t96 = <core::List<core::int>>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t96.{core::List::add}(<core::int>[]);
-  } =>#t96;
-  core::Set<core::List<core::int>> set71 = block {
-    final core::Set<core::List<core::int>> #t97 = col::LinkedHashSet::•<core::List<core::int>>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t97.{core::Set::add}(<core::int>[]);
-    #t97.{core::Set::add}(null);
-  } =>#t97;
-  core::List<core::num> list80 = block {
-    final core::List<core::num> #t98 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t98.{core::List::add}(42);
-    else
-      #t98.{core::List::add}(3.14);
-  } =>#t98;
-  core::Set<core::num> set80 = block {
-    final core::Set<core::num> #t99 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t99.{core::Set::add}(42);
-    else
-      #t99.{core::Set::add}(3.14);
-    #t99.{core::Set::add}(null);
-  } =>#t99;
-  core::Map<core::String, core::num> map80 = block {
-    final core::Map<core::String, core::num> #t100 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t100.{core::Map::[]=}("bar", 42);
-    else
-      #t100.{core::Map::[]=}("bar", 3.14);
-    #t100.{core::Map::[]=}("baz", null);
-  } =>#t100;
-  core::List<core::num> list81 = block {
-    final core::List<core::num> #t101 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t102 in listInt)
-        #t101.{core::List::add}(#t102);
-    else
-      for (final core::num #t103 in listDouble)
-        #t101.{core::List::add}(#t103);
-  } =>#t101;
-  core::Set<core::num> set81 = block {
-    final core::Set<core::num> #t104 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t105 in listInt)
-        #t104.{core::Set::add}(#t105);
-    else
-      for (final core::num #t106 in listDouble)
-        #t104.{core::Set::add}(#t106);
-    #t104.{core::Set::add}(null);
-  } =>#t104;
-  core::Map<core::String, core::num> map81 = block {
-    final core::Map<core::String, core::num> #t107 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::num> #t108 in mapToInt.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
-    else
-      for (final core::MapEntry<core::String, core::num> #t109 in mapToDouble.{core::Map::entries})
-        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
-    #t107.{core::Map::[]=}("baz", null);
-  } =>#t107;
-  core::List<dynamic> list82 = block {
-    final core::List<dynamic> #t110 = <dynamic>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t111 in listInt)
-        #t110.{core::List::add}(#t111);
-    else
-      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t110.{core::List::add}(#t112);
-  } =>#t110;
-  core::Set<dynamic> set82 = block {
-    final core::Set<dynamic> #t113 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t114 in listInt)
-        #t113.{core::Set::add}(#t114);
-    else
-      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t113.{core::Set::add}(#t115);
-    #t113.{core::Set::add}(null);
-  } =>#t113;
-  core::Set<dynamic> map82 = block {
-    final core::Set<dynamic> #t116 = col::LinkedHashSet::•<dynamic>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t116.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                     ^");
-    else
-      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>)
-        #t116.{core::Set::add}(#t117);
-    #t116.{core::Set::add}(null);
-  } =>#t116;
-  core::List<core::num> list83 = block {
-    final core::List<core::num> #t118 = <core::num>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t118.{core::List::add}(42);
-    else
-      for (final core::num #t119 in listDouble)
-        #t118.{core::List::add}(#t119);
-  } =>#t118;
-  core::Set<core::num> set83 = block {
-    final core::Set<core::num> #t120 = col::LinkedHashSet::•<core::num>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::num #t121 in listInt)
-        #t120.{core::Set::add}(#t121);
-    else
-      #t120.{core::Set::add}(3.14);
-    #t120.{core::Set::add}(null);
-  } =>#t120;
-  core::Map<core::String, core::num> map83 = block {
-    final core::Map<core::String, core::num> #t122 = <core::String, core::num>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::num> #t123 in mapToInt.{core::Map::entries})
-        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
-    else
-      #t122.{core::Map::[]=}("bar", 3.14);
-    #t122.{core::Map::[]=}("baz", null);
-  } =>#t122;
-  core::List<core::int> list90 = block {
-    final core::List<core::int> #t124 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t124.{core::List::add}(dynVar as{TypeError} core::int);
-  } =>#t124;
-  core::Set<core::int> set90 = block {
-    final core::Set<core::int> #t125 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t125.{core::Set::add}(dynVar as{TypeError} core::int);
-    #t125.{core::Set::add}(null);
-  } =>#t125;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t126 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
-    #t126.{core::Map::[]=}("baz", null);
-  } =>#t126;
-  core::List<core::int> list91 = block {
-    final core::List<core::int> #t127 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t129 = #t128 as{TypeError} core::int;
-        #t127.{core::List::add}(#t129);
-      }
-  } =>#t127;
-  core::Set<core::int> set91 = block {
-    final core::Set<core::int> #t130 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t132 = #t131 as{TypeError} core::int;
-        #t130.{core::Set::add}(#t132);
-      }
-    #t130.{core::Set::add}(null);
-  } =>#t130;
-  core::Map<core::String, core::int> map91 = block {
-    final core::Map<core::String, core::int> #t133 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<dynamic, dynamic> #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-        final core::String #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String;
-        final core::int #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int;
-        #t133.{core::Map::[]=}(#t135, #t136);
-      }
-    #t133.{core::Map::[]=}("baz", null);
-  } =>#t133;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t137 = <core::int>[];
-    if(dynVar as{TypeError} core::bool)
-      #t137.{core::List::add}(42);
-  } =>#t137;
-  core::Set<core::int> set100 = block {
-    final core::Set<core::int> #t138 = col::LinkedHashSet::•<core::int>();
-    if(dynVar as{TypeError} core::bool)
-      #t138.{core::Set::add}(42);
-  } =>#t138;
-  core::Map<core::int, core::int> map100 = block {
-    final core::Map<core::int, core::int> #t139 = <core::int, core::int>{};
-    if(dynVar as{TypeError} core::bool)
-      #t139.{core::Map::[]=}(42, 42);
-  } =>#t139;
-}
-static method testIfElementErrors(core::Map<core::int, core::int> map) → dynamic {
-  block {
-    final core::List<core::int> #t140 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t140.{core::List::add}(let final<BottomType> #t141 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:87:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[if (oracle(\"foo\")) \"bar\"];
-                           ^" in "bar" as{TypeError} core::int);
-  } =>#t140;
-  block {
-    final core::Set<core::int> #t142 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t142.{core::Set::add}(let final<BottomType> #t143 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:88:28: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{if (oracle(\"foo\")) \"bar\", null};
-                           ^" in "bar" as{TypeError} core::int);
-    #t142.{core::Set::add}(null);
-  } =>#t142;
-  block {
-    final core::Map<core::String, core::int> #t144 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:89:43: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
-                                          ^" in "bar" as{TypeError} core::int);
-    #t144.{core::Map::[]=}("baz", null);
-  } =>#t144;
-  block {
-    final core::List<core::int> #t146 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t147 in <core::int>[let final<BottomType> #t148 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:90:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
-                               ^" in "bar" as{TypeError} core::int])
-        #t146.{core::List::add}(#t147);
-  } =>#t146;
-  block {
-    final core::Set<core::int> #t149 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::int #t150 in <core::int>[let final<BottomType> #t151 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:91:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
-                               ^" in "bar" as{TypeError} core::int])
-        #t149.{core::Set::add}(#t150);
-    #t149.{core::Set::add}(null);
-  } =>#t149;
-  block {
-    final core::Map<core::String, core::int> #t152 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      for (final core::MapEntry<core::String, core::int> #t153 in <core::String, core::int>{"bar": let final<BottomType> #t154 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:92:47: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                              ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
-        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
-    #t152.{core::Map::[]=}("baz", null);
-  } =>#t152;
-  block {
-    final core::List<core::int> #t155 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t155.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                              ^");
-  } =>#t155;
-  block {
-    final core::Set<core::int> #t156 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t156.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    #t156.{core::Set::add}(null);
-  } =>#t156;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t157 = <core::String>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t157.{core::List::add}(let final<BottomType> #t158 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[if (oracle(\"foo\")) 42 else 3.14];
-                              ^" in 42 as{TypeError} core::String);
-    else
-      #t157.{core::List::add}(let final<BottomType> #t159 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:96:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[if (oracle(\"foo\")) 42 else 3.14];
-                                      ^" in 3.14 as{TypeError} core::String);
-  } =>#t157;
-  block {
-    final core::Set<core::String> #t160 = col::LinkedHashSet::•<core::String>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t160.{core::Set::add}(let final<BottomType> #t161 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:31: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
-                              ^" in 42 as{TypeError} core::String);
-    else
-      #t160.{core::Set::add}(let final<BottomType> #t162 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:97:39: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
-                                      ^" in 3.14 as{TypeError} core::String);
-    #t160.{core::Set::add}(null);
-  } =>#t160;
-  block {
-    final core::Map<core::String, core::String> #t163 = <core::String, core::String>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:46: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
-                                             ^" in 42 as{TypeError} core::String);
-    else
-      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:98:61: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
-                                                            ^" in 3.14 as{TypeError} core::String);
-    #t163.{core::Map::[]=}("baz", null);
-  } =>#t163;
-  block {
-    final core::List<core::int> #t166 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t166.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                              ^");
-    else
-      #t166.{core::List::add}(42);
-  } =>#t166;
-  block {
-    final core::Set<core::int> #t167 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t167.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    else
-      #t167.{core::Set::add}(42);
-    #t167.{core::Set::add}(null);
-  } =>#t167;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t168 = <core::int>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t168.{core::List::add}(42);
-    else
-      #t168.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                      ^");
-  } =>#t168;
-  block {
-    final core::Set<core::int> #t169 = col::LinkedHashSet::•<core::int>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t169.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                              ^");
-    else
-      #t169.{core::Set::add}(42);
-    #t169.{core::Set::add}(null);
-  } =>#t169;
-  <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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/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/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/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/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<<BottomType>, core::Null> map12 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:110:35: Error: Expected ':' after this.
-  var map12 = {if (oracle(\"foo\")) 42 else \"bar\": 3.14};
-                                  ^": null};
-  core::Map<<BottomType>, core::Null> map13 = <<BottomType>, core::Null>{invalid-expression "pkg/front_end/testcases/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> #t170 = <core::int>[];
-    if(let final<BottomType> #t171 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:112:27: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  List<int> list20 = [if (42) 42];
-                          ^" in 42 as{TypeError} core::bool)
-      #t170.{core::List::add}(42);
-  } =>#t170;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t172 = col::LinkedHashSet::•<core::int>();
-    if(let final<BottomType> #t173 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:113:25: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  Set<int> set20 = {if (42) 42};
-                        ^" in 42 as{TypeError} core::bool)
-      #t172.{core::Set::add}(42);
-  } =>#t172;
-  core::Map<core::int, core::int> map30 = block {
-    final core::Map<core::int, core::int> #t174 = <core::int, core::int>{};
-    if(let final<BottomType> #t175 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:114:30: Error: A value of type 'int' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  Map<int, int> map30 = {if (42) 42: 42};
-                             ^" in 42 as{TypeError} core::bool)
-      #t174.{core::Map::[]=}(42, 42);
-  } =>#t174;
-  core::List<core::String> list40 = block {
-    final core::List<core::String> #t176 = <core::String>[];
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t176.{core::List::add}(let final<BottomType> #t177 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:53: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
-                                                    ^" in true as{TypeError} core::String);
-    else
-      #t176.{core::List::add}(let final<BottomType> #t178 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:115:63: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
-                                                              ^" in 42 as{TypeError} core::String);
-  } =>#t176;
-  core::Set<core::String> set40 = block {
-    final core::Set<core::String> #t179 = col::LinkedHashSet::•<core::String>();
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t179.{core::Set::add}(let final<BottomType> #t180 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:51: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
-                                                  ^" in true as{TypeError} core::String);
-    else
-      #t179.{core::Set::add}(let final<BottomType> #t181 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:116:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
-                                                            ^" in 42 as{TypeError} core::String);
-  } =>#t179;
-  core::Map<core::String, core::int> map40 = block {
-    final core::Map<core::String, core::int> #t182 = <core::String, core::int>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t182.{core::Map::[]=}(let final<BottomType> #t183 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:61: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
-                                                            ^" in true as{TypeError} core::String, 42);
-    else
-      #t182.{core::Map::[]=}(let final<BottomType> #t184 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:117:75: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
-                                                                          ^" in 42 as{TypeError} core::String, 42);
-  } =>#t182;
-  core::Map<core::int, core::String> map41 = block {
-    final core::Map<core::int, core::String> #t185 = <core::int, core::String>{};
-    if(self::oracle<core::String>("foo") as{TypeError} core::bool)
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:65: Error: A value of type 'bool' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
-                                                                ^" in true as{TypeError} core::String);
-    else
-      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:118:79: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
-                                                                              ^" in 42 as{TypeError} core::String);
-  } =>#t185;
-}
-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> #t188 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t188.{core::List::add}(42);
-  } =>#t188;
-  core::Set<core::int> set10 = block {
-    final core::Set<core::int> #t189 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t189.{core::Set::add}(42);
-    #t189.{core::Set::add}(null);
-  } =>#t189;
-  core::Map<core::String, core::int> map10 = block {
-    final core::Map<core::String, core::int> #t190 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t190.{core::Map::[]=}("bar", 42);
-    #t190.{core::Map::[]=}("baz", null);
-  } =>#t190;
-  core::List<dynamic> list11 = block {
-    final core::List<dynamic> #t191 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t191.{core::List::add}(dynVar);
-  } =>#t191;
-  core::Set<dynamic> set11 = block {
-    final core::Set<dynamic> #t192 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t192.{core::Set::add}(dynVar);
-    #t192.{core::Set::add}(null);
-  } =>#t192;
-  core::Map<core::String, dynamic> map11 = block {
-    final core::Map<core::String, dynamic> #t193 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t193.{core::Map::[]=}("bar", dynVar);
-    #t193.{core::Map::[]=}("baz", null);
-  } =>#t193;
-  core::List<core::List<core::int>> list12 = block {
-    final core::List<core::List<core::int>> #t194 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t194.{core::List::add}(<core::int>[42]);
-  } =>#t194;
-  core::Set<core::List<core::int>> set12 = block {
-    final core::Set<core::List<core::int>> #t195 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t195.{core::Set::add}(<core::int>[42]);
-    #t195.{core::Set::add}(null);
-  } =>#t195;
-  core::Map<core::String, core::List<core::int>> map12 = block {
-    final core::Map<core::String, core::List<core::int>> #t196 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t196.{core::Map::[]=}("bar", <core::int>[42]);
-    #t196.{core::Map::[]=}("baz", null);
-  } =>#t196;
-  core::List<core::int> list20 = block {
-    final core::List<core::int> #t197 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t198 in <core::int>[42])
-        #t197.{core::List::add}(#t198);
-  } =>#t197;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t199 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t200 in <core::int>[42])
-        #t199.{core::Set::add}(#t200);
-    #t199.{core::Set::add}(null);
-  } =>#t199;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t201 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::int> #t202 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
-    #t201.{core::Map::[]=}("baz", null);
-  } =>#t201;
-  core::List<dynamic> list21 = block {
-    final core::List<dynamic> #t203 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t204 in <dynamic>[dynVar])
-        #t203.{core::List::add}(#t204);
-  } =>#t203;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t205 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t206 in <dynamic>[dynVar])
-        #t205.{core::Set::add}(#t206);
-    #t205.{core::Set::add}(null);
-  } =>#t205;
-  core::Map<core::String, dynamic> map21 = block {
-    final core::Map<core::String, dynamic> #t207 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, dynamic> #t208 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
-    #t207.{core::Map::[]=}("baz", null);
-  } =>#t207;
-  core::List<core::List<core::int>> list22 = block {
-    final core::List<core::List<core::int>> #t209 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t210 in <core::List<core::int>>[<core::int>[42]])
-        #t209.{core::List::add}(#t210);
-  } =>#t209;
-  core::Set<core::List<core::int>> set22 = block {
-    final core::Set<core::List<core::int>> #t211 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t212 in <core::List<core::int>>[<core::int>[42]])
-        #t211.{core::Set::add}(#t212);
-    #t211.{core::Set::add}(null);
-  } =>#t211;
-  core::Map<core::String, core::List<core::int>> map22 = block {
-    final core::Map<core::String, core::List<core::int>> #t213 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t214 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
-    #t213.{core::Map::[]=}("baz", null);
-  } =>#t213;
-  core::List<core::int> list30 = block {
-    final core::List<core::int> #t215 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t216 in <core::int>[42])
-          #t215.{core::List::add}(#t216);
-  } =>#t215;
-  core::Set<core::int> set30 = block {
-    final core::Set<core::int> #t217 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t218 in <core::int>[42])
-          #t217.{core::Set::add}(#t218);
-    #t217.{core::Set::add}(null);
-  } =>#t217;
-  core::Map<core::String, core::int> map30 = block {
-    final core::Map<core::String, core::int> #t219 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::int> #t220 in <core::String, core::int>{"bar": 42}.{core::Map::entries})
-          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
-    #t219.{core::Map::[]=}("baz", null);
-  } =>#t219;
-  core::List<dynamic> list31 = block {
-    final core::List<dynamic> #t221 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t222 in <dynamic>[dynVar])
-          #t221.{core::List::add}(#t222);
-  } =>#t221;
-  core::Set<dynamic> set31 = block {
-    final core::Set<dynamic> #t223 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t224 in <dynamic>[dynVar])
-          #t223.{core::Set::add}(#t224);
-    #t223.{core::Set::add}(null);
-  } =>#t223;
-  core::Map<core::String, dynamic> map31 = block {
-    final core::Map<core::String, dynamic> #t225 = <core::String, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, dynamic> #t226 in <core::String, dynamic>{"bar": dynVar}.{core::Map::entries})
-          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
-    #t225.{core::Map::[]=}("baz", null);
-  } =>#t225;
-  core::List<core::List<core::int>> list33 = block {
-    final core::List<core::List<core::int>> #t227 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t228 in <core::List<core::int>>[<core::int>[42]])
-          #t227.{core::List::add}(#t228);
-  } =>#t227;
-  core::Set<core::List<core::int>> set33 = block {
-    final core::Set<core::List<core::int>> #t229 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t230 in <core::List<core::int>>[<core::int>[42]])
-          #t229.{core::Set::add}(#t230);
-    #t229.{core::Set::add}(null);
-  } =>#t229;
-  core::Map<core::String, core::List<core::int>> map33 = block {
-    final core::Map<core::String, core::List<core::int>> #t231 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t232 in <core::String, core::List<core::int>>{"bar": <core::int>[42]}.{core::Map::entries})
-          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
-    #t231.{core::Map::[]=}("baz", null);
-  } =>#t231;
-  core::List<core::List<core::int>> list40 = block {
-    final core::List<core::List<core::int>> #t233 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t234 in <core::List<core::int>>[<core::int>[]])
-        #t233.{core::List::add}(#t234);
-  } =>#t233;
-  core::Set<core::List<core::int>> set40 = block {
-    final core::Set<core::List<core::int>> #t235 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t236 in <core::List<core::int>>[<core::int>[]])
-        #t235.{core::Set::add}(#t236);
-    #t235.{core::Set::add}(null);
-  } =>#t235;
-  core::Map<core::String, core::List<core::int>> map40 = block {
-    final core::Map<core::String, core::List<core::int>> #t237 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t238 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
-    #t237.{core::Map::[]=}("baz", null);
-  } =>#t237;
-  core::List<core::List<core::int>> list41 = block {
-    final core::List<core::List<core::int>> #t239 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t240 in let final core::Set<core::List<core::int>> #t241 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t242 = #t241.{core::Set::add}(<core::int>[]) in #t241)
-        #t239.{core::List::add}(#t240);
-  } =>#t239;
-  core::Set<core::List<core::int>> set41 = block {
-    final core::Set<core::List<core::int>> #t243 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t244 in let final core::Set<core::List<core::int>> #t245 = col::LinkedHashSet::•<core::List<core::int>>() in let final core::bool #t246 = #t245.{core::Set::add}(<core::int>[]) in #t245)
-        #t243.{core::Set::add}(#t244);
-    #t243.{core::Set::add}(null);
-  } =>#t243;
-  core::List<core::List<core::int>> list42 = block {
-    final core::List<core::List<core::int>> #t247 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t248 in <core::List<core::int>>[<core::int>[]])
-          #t247.{core::List::add}(#t248);
-  } =>#t247;
-  core::Set<core::List<core::int>> set42 = block {
-    final core::Set<core::List<core::int>> #t249 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t250 in <core::List<core::int>>[<core::int>[]])
-          #t249.{core::Set::add}(#t250);
-    #t249.{core::Set::add}(null);
-  } =>#t249;
-  core::Map<core::String, core::List<core::int>> map42 = block {
-    final core::Map<core::String, core::List<core::int>> #t251 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t252 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
-    #t251.{core::Map::[]=}("baz", null);
-  } =>#t251;
-  core::List<core::int> list50 = block {
-    final core::List<core::int> #t253 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t254 in <core::int>[])
-        #t253.{core::List::add}(#t254);
-  } =>#t253;
-  core::Set<core::int> set50 = block {
-    final core::Set<core::int> #t255 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t256 in <core::int>[])
-        #t255.{core::Set::add}(#t256);
-    #t255.{core::Set::add}(null);
-  } =>#t255;
-  core::Map<core::String, core::int> map50 = block {
-    final core::Map<core::String, core::int> #t257 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::int> #t258 in <core::String, core::int>{}.{core::Map::entries})
-        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
-    #t257.{core::Map::[]=}("baz", null);
-  } =>#t257;
-  core::List<core::int> list51 = block {
-    final core::List<core::int> #t259 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t260 in let final core::Set<core::int> #t261 = col::LinkedHashSet::•<core::int>() in #t261)
-        #t259.{core::List::add}(#t260);
-  } =>#t259;
-  core::Set<core::int> set51 = block {
-    final core::Set<core::int> #t262 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::int #t263 in let final core::Set<core::int> #t264 = col::LinkedHashSet::•<core::int>() in #t264)
-        #t262.{core::Set::add}(#t263);
-    #t262.{core::Set::add}(null);
-  } =>#t262;
-  core::List<core::int> list52 = block {
-    final core::List<core::int> #t265 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t266 in <core::int>[])
-          #t265.{core::List::add}(#t266);
-  } =>#t265;
-  core::Set<core::int> set52 = block {
-    final core::Set<core::int> #t267 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::int #t268 in <core::int>[])
-          #t267.{core::Set::add}(#t268);
-    #t267.{core::Set::add}(null);
-  } =>#t267;
-  core::List<core::List<core::int>> list60 = block {
-    final core::List<core::List<core::int>> #t269 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t270 in <core::List<core::int>>[<core::int>[]])
-        #t269.{core::List::add}(#t270);
-  } =>#t269;
-  core::Set<core::List<core::int>> set60 = block {
-    final core::Set<core::List<core::int>> #t271 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::List<core::int> #t272 in <core::List<core::int>>[<core::int>[]])
-        #t271.{core::Set::add}(#t272);
-    #t271.{core::Set::add}(null);
-  } =>#t271;
-  core::Map<core::String, core::List<core::int>> map60 = block {
-    final core::Map<core::String, core::List<core::int>> #t273 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<core::String, core::List<core::int>> #t274 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
-    #t273.{core::Map::[]=}("baz", null);
-  } =>#t273;
-  core::List<core::List<core::int>> list61 = block {
-    final core::List<core::List<core::int>> #t275 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t276 in <core::List<core::int>>[<core::int>[]])
-          #t275.{core::List::add}(#t276);
-  } =>#t275;
-  core::Set<core::List<core::int>> set61 = block {
-    final core::Set<core::List<core::int>> #t277 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::List<core::int> #t278 in <core::List<core::int>>[<core::int>[]])
-          #t277.{core::Set::add}(#t278);
-    #t277.{core::Set::add}(null);
-  } =>#t277;
-  core::Map<core::String, core::List<core::int>> map61 = block {
-    final core::Map<core::String, core::List<core::int>> #t279 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::List<core::int>> #t280 in <core::String, core::List<core::int>>{"bar": <core::int>[]}.{core::Map::entries})
-          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
-    #t279.{core::Map::[]=}("baz", null);
-  } =>#t279;
-  core::List<core::List<core::int>> list70 = block {
-    final core::List<core::List<core::int>> #t281 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t281.{core::List::add}(<core::int>[]);
-  } =>#t281;
-  core::Set<core::List<core::int>> set70 = block {
-    final core::Set<core::List<core::int>> #t282 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t282.{core::Set::add}(<core::int>[]);
-    #t282.{core::Set::add}(null);
-  } =>#t282;
-  core::Map<core::String, core::List<core::int>> map70 = block {
-    final core::Map<core::String, core::List<core::int>> #t283 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t283.{core::Map::[]=}("bar", <core::int>[]);
-    #t283.{core::Map::[]=}("baz", null);
-  } =>#t283;
-  core::List<core::List<core::int>> list71 = block {
-    final core::List<core::List<core::int>> #t284 = <core::List<core::int>>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t284.{core::List::add}(<core::int>[]);
-  } =>#t284;
-  core::Set<core::List<core::int>> set71 = block {
-    final core::Set<core::List<core::int>> #t285 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t285.{core::Set::add}(<core::int>[]);
-    #t285.{core::Set::add}(null);
-  } =>#t285;
-  core::Map<core::String, core::List<core::int>> map71 = block {
-    final core::Map<core::String, core::List<core::int>> #t286 = <core::String, core::List<core::int>>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t286.{core::Map::[]=}("bar", <core::int>[]);
-    #t286.{core::Map::[]=}("baz", null);
-  } =>#t286;
-  core::List<core::num> list80 = block {
-    final core::List<core::num> #t287 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t287.{core::List::add}(42);
-      else
-        #t287.{core::List::add}(3.14);
-  } =>#t287;
-  core::Set<core::num> set80 = block {
-    final core::Set<core::num> #t288 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t288.{core::Set::add}(42);
-      else
-        #t288.{core::Set::add}(3.14);
-    #t288.{core::Set::add}(null);
-  } =>#t288;
-  core::Map<core::String, core::num> map80 = block {
-    final core::Map<core::String, core::num> #t289 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t289.{core::Map::[]=}("bar", 42);
-      else
-        #t289.{core::Map::[]=}("bar", 3.14);
-    #t289.{core::Map::[]=}("baz", null);
-  } =>#t289;
-  core::List<core::num> list81 = block {
-    final core::List<core::num> #t290 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t291 in listInt)
-          #t290.{core::List::add}(#t291);
-      else
-        for (final core::num #t292 in listDouble)
-          #t290.{core::List::add}(#t292);
-  } =>#t290;
-  core::Set<core::num> set81 = block {
-    final core::Set<core::num> #t293 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t294 in listInt)
-          #t293.{core::Set::add}(#t294);
-      else
-        for (final core::num #t295 in listDouble)
-          #t293.{core::Set::add}(#t295);
-    #t293.{core::Set::add}(null);
-  } =>#t293;
-  core::Map<core::String, core::num> map81 = block {
-    final core::Map<core::String, core::num> #t296 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::num> #t297 in mapStringInt.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<core::String, core::num> #t298 in mapStringDouble.{core::Map::entries})
-          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
-    #t296.{core::Map::[]=}("baz", null);
-  } =>#t296;
-  core::List<dynamic> list82 = block {
-    final core::List<dynamic> #t299 = <dynamic>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t300 in listInt)
-          #t299.{core::List::add}(#t300);
-      else
-        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>)
-          #t299.{core::List::add}(#t301);
-  } =>#t299;
-  core::Set<dynamic> set82 = block {
-    final core::Set<dynamic> #t302 = col::LinkedHashSet::•<dynamic>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final dynamic #t303 in listInt)
-          #t302.{core::Set::add}(#t303);
-      else
-        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>)
-          #t302.{core::Set::add}(#t304);
-    #t302.{core::Set::add}(null);
-  } =>#t302;
-  core::Map<dynamic, dynamic> map82 = block {
-    final core::Map<dynamic, dynamic> #t305 = <dynamic, dynamic>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<dynamic, dynamic> #t306 in mapStringInt.{core::Map::entries})
-          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
-      else
-        for (final core::MapEntry<dynamic, dynamic> #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
-    #t305.{core::Map::[]=}("baz", null);
-  } =>#t305;
-  core::List<core::num> list83 = block {
-    final core::List<core::num> #t308 = <core::num>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        #t308.{core::List::add}(42);
-      else
-        for (final core::num #t309 in listDouble)
-          #t308.{core::List::add}(#t309);
-  } =>#t308;
-  core::Set<core::num> set83 = block {
-    final core::Set<core::num> #t310 = col::LinkedHashSet::•<core::num>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::num #t311 in listInt)
-          #t310.{core::Set::add}(#t311);
-      else
-        #t310.{core::Set::add}(3.14);
-    #t310.{core::Set::add}(null);
-  } =>#t310;
-  core::Map<core::String, core::num> map83 = block {
-    final core::Map<core::String, core::num> #t312 = <core::String, core::num>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      if(self::oracle<dynamic>() as{TypeError} core::bool)
-        for (final core::MapEntry<core::String, core::num> #t313 in mapStringInt.{core::Map::entries})
-          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
-      else
-        #t312.{core::Map::[]=}("bar", 3.14);
-    #t312.{core::Map::[]=}("baz", null);
-  } =>#t312;
-  core::List<core::int> list90 = block {
-    final core::List<core::int> #t314 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t314.{core::List::add}(dynVar as{TypeError} core::int);
-  } =>#t314;
-  core::Set<core::int> set90 = block {
-    final core::Set<core::int> #t315 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t315.{core::Set::add}(dynVar as{TypeError} core::int);
-    #t315.{core::Set::add}(null);
-  } =>#t315;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t316 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int);
-    #t316.{core::Map::[]=}("baz", null);
-  } =>#t316;
-  core::List<core::int> list91 = block {
-    final core::List<core::int> #t317 = <core::int>[];
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t319 = #t318 as{TypeError} core::int;
-        #t317.{core::List::add}(#t319);
-      }
-  } =>#t317;
-  core::Set<core::int> set91 = block {
-    final core::Set<core::int> #t320 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>) {
-        final core::int #t322 = #t321 as{TypeError} core::int;
-        #t320.{core::Set::add}(#t322);
-      }
-    #t320.{core::Set::add}(null);
-  } =>#t320;
-  core::Map<core::String, core::int> map91 = block {
-    final core::Map<core::String, core::int> #t323 = <core::String, core::int>{};
-    for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-      for (final core::MapEntry<dynamic, dynamic> #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-        final core::String #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String;
-        final core::int #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int;
-        #t323.{core::Map::[]=}(#t325, #t326);
-      }
-    #t323.{core::Map::[]=}("baz", null);
-  } =>#t323;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t327 = <core::int>[];
-    for (final core::int #t328 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t327.{core::List::add}(42);
-  } =>#t327;
-  core::Set<core::int> set100 = block {
-    final core::Set<core::int> #t329 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t330 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t329.{core::Set::add}(42);
-  } =>#t329;
-  core::Map<core::String, core::int> map100 = block {
-    final core::Map<core::String, core::int> #t331 = <core::String, core::int>{};
-    for (final core::int #t332 = index = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; index = index.{core::num::+}(1))
-      #t331.{core::Map::[]=}("bar", 42);
-  } =>#t331;
-  core::List<core::int> list110 = block {
-    final core::List<core::int> #t333 = <core::int>[];
-    for (core::int i in <core::int>[1, 2, 3])
-      #t333.{core::List::add}(i);
-  } =>#t333;
-  core::Set<core::int> set110 = block {
-    final core::Set<core::int> #t334 = col::LinkedHashSet::•<core::int>();
-    for (core::int i in <core::int>[1, 2, 3])
-      #t334.{core::Set::add}(i);
-    #t334.{core::Set::add}(null);
-  } =>#t334;
-  core::Map<core::String, core::int> map110 = block {
-    final core::Map<core::String, core::int> #t335 = <core::String, core::int>{};
-    for (core::int i in <core::int>[1, 2, 3])
-      #t335.{core::Map::[]=}("bar", i);
-    #t335.{core::Map::[]=}("baz", null);
-  } =>#t335;
-  core::List<core::int> list120 = block {
-    final core::List<core::int> #t336 = <core::int>[];
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t336.{core::List::add}(i as{TypeError} core::int);
-  } =>#t336;
-  core::Set<core::int> set120 = block {
-    final core::Set<core::int> #t337 = col::LinkedHashSet::•<core::int>();
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t337.{core::Set::add}(i as{TypeError} core::int);
-    #t337.{core::Set::add}(null);
-  } =>#t337;
-  core::Map<core::String, core::int> map120 = block {
-    final core::Map<core::String, core::int> #t338 = <core::String, core::int>{};
-    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>)
-      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int);
-    #t338.{core::Map::[]=}("baz", null);
-  } =>#t338;
-  core::List<core::int> list130 = block {
-    final core::List<core::int> #t339 = <core::int>[];
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t339.{core::List::add}(i);
-  } =>#t339;
-  core::Set<core::int> set130 = block {
-    final core::Set<core::int> #t340 = col::LinkedHashSet::•<core::int>();
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t340.{core::Set::add}(i);
-  } =>#t340;
-  core::Map<core::int, core::int> map130 = block {
-    final core::Map<core::int, core::int> #t341 = <core::int, core::int>{};
-    for (core::int i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
-      #t341.{core::Map::[]=}(i, i);
-  } =>#t341;
-}
-static method testForElementErrors(core::Map<core::int, core::int> map, core::List<core::int> list) → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        block {
-          final core::List<core::int> #t342 = <core::int>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            #t342.{core::List::add}(let final<BottomType> #t343 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:210:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
-                                            ^" in "bar" as{TypeError} core::int);
-        } =>#t342;
-        block {
-          final core::Set<core::int> #t344 = col::LinkedHashSet::•<core::int>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            #t344.{core::Set::add}(let final<BottomType> #t345 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:211:45: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
-                                            ^" in "bar" as{TypeError} core::int);
-          #t344.{core::Set::add}(null);
-        } =>#t344;
-        block {
-          final core::Map<core::int, core::int> #t346 = <core::int, core::int>{};
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            #t346.{core::Map::[]=}(let final<BottomType> #t347 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:50: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                 ^" in "bar" as{TypeError} core::int, let final<BottomType> #t348 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                        ^" in "bar" as{TypeError} core::int);
-          #t346.{core::Map::[]=}(let final<BottomType> #t349 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:212:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
-                                                               ^" in "baz" as{TypeError} core::int, null);
-        } =>#t346;
-        block {
-          final core::List<core::int> #t350 = <core::int>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            for (final core::int #t351 in <core::int>[let final<BottomType> #t352 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:213:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
-                                                ^" in "bar" as{TypeError} core::int])
-              #t350.{core::List::add}(#t351);
-        } =>#t350;
-        block {
-          final core::Set<core::int> #t353 = col::LinkedHashSet::•<core::int>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            for (final core::int #t354 in <core::int>[let final<BottomType> #t355 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:214:49: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
-                                                ^" in "bar" as{TypeError} core::int])
-              #t353.{core::Set::add}(#t354);
-          #t353.{core::Set::add}(null);
-        } =>#t353;
-        block {
-          final core::Map<core::int, core::int> #t356 = <core::int, core::int>{};
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            for (final core::MapEntry<core::int, core::int> #t357 in <core::int, core::int>{let final<BottomType> #t358 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:54: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                     ^" in "bar" as{TypeError} core::int: let final<BottomType> #t359 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:61: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                            ^" in "bar" as{TypeError} core::int}.{core::Map::entries})
-              #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
-          #t356.{core::Map::[]=}(let final<BottomType> #t360 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:215:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
-                                                                    ^" in "baz" as{TypeError} core::int, null);
-        } =>#t356;
-        block {
-          final core::List<core::int> #t361 = <core::int>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            #t361.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                               ^");
-        } =>#t361;
-        block {
-          final core::Set<core::int> #t362 = col::LinkedHashSet::•<core::int>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            #t362.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                               ^");
-          #t362.{core::Set::add}(null);
-        } =>#t362;
-        <core::int, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t363 = <core::String>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t363.{core::List::add}(let final<BottomType> #t364 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
-                                                             ^" in 42 as{TypeError} core::String);
-            else
-              #t363.{core::List::add}(let final<BottomType> #t365 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:219:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
-                                                                     ^" in 3.14 as{TypeError} core::String);
-        } =>#t363;
-        block {
-          final core::Set<core::String> #t366 = col::LinkedHashSet::•<core::String>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t366.{core::Set::add}(let final<BottomType> #t367 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
-                                                             ^" in 42 as{TypeError} core::String);
-            else
-              #t366.{core::Set::add}(let final<BottomType> #t368 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:220:70: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
-                                                                     ^" in 3.14 as{TypeError} core::String);
-          #t366.{core::Set::add}(null);
-        } =>#t366;
-        block {
-          final core::Map<core::String, core::String> #t369 = <core::String, core::String>{};
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to '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);
-            else
-              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:221:92: Error: A value of type 'double' can't be assigned to a variable of type 'String'.
-Try changing the type of the left hand side, or casting the right hand side to '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);
-          #t369.{core::Map::[]=}("baz", null);
-        } =>#t369;
-        block {
-          final core::List<core::int> #t372 = <core::int>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t372.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                                             ^");
-            else
-              #t372.{core::List::add}(42);
-        } =>#t372;
-        block {
-          final core::Set<core::int> #t373 = col::LinkedHashSet::•<core::int>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t373.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                                             ^");
-            else
-              #t373.{core::Set::add}(42);
-          #t373.{core::Set::add}(null);
-        } =>#t373;
-        <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t374 = <core::int>[];
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t374.{core::List::add}(42);
-            else
-              #t374.{core::List::add}(invalid-expression "pkg/front_end/testcases/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];
-                                                                     ^");
-        } =>#t374;
-        block {
-          final core::Set<core::int> #t375 = col::LinkedHashSet::•<core::int>();
-          for (core::int i = 0; self::oracle<core::String>("foo") as{TypeError} core::bool; i = i.{core::num::+}(1))
-            if(self::oracle<dynamic>() as{TypeError} core::bool)
-              #t375.{core::Set::add}(42);
-            else
-              #t375.{core::Set::add}(invalid-expression "pkg/front_end/testcases/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};
-                                                                     ^");
-          #t375.{core::Set::add}(null);
-        } =>#t375;
-        <core::String, core::int>{invalid-expression "pkg/front_end/testcases/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/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> #t376 = <core::int>[];
-          for (final core::int #t377 in <core::int>[1]) {
-            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
-  <int>[for (i in <int>[1]) i];
-             ^";
-            #t376.{core::List::add}(i);
-          }
-        } =>#t376;
-        block {
-          final core::Set<core::int> #t378 = col::LinkedHashSet::•<core::int>();
-          for (final core::int #t379 in <core::int>[1]) {
-            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
-  <int>{for (i in <int>[1]) i, null};
-             ^";
-            #t378.{core::Set::add}(i);
-          }
-          #t378.{core::Set::add}(null);
-        } =>#t378;
-        block {
-          final core::Map<core::String, core::int> #t380 = <core::String, core::int>{};
-          for (final core::int #t381 in <core::int>[1]) {
-            invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
-\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
-\t                   ^";
-            #t380.{core::Map::[]=}("bar", i);
-          }
-          #t380.{core::Map::[]=}("baz", null);
-        } =>#t380;
-        core::List<dynamic> list10 = block {
-          final core::List<dynamic> #t382 = <dynamic>[];
-          for (dynamic i in let final<BottomType> #t383 = invalid-expression "pkg/front_end/testcases/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>)
-            #t382.{core::List::add}(i);
-        } =>#t382;
-        core::Set<dynamic> set10 = block {
-          final core::Set<dynamic> #t384 = col::LinkedHashSet::•<dynamic>();
-          for (dynamic i in let final<BottomType> #t385 = invalid-expression "pkg/front_end/testcases/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>)
-            #t384.{core::Set::add}(i);
-          #t384.{core::Set::add}(null);
-        } =>#t384;
-        core::Map<core::String, dynamic> map10 = block {
-          final core::Map<core::String, dynamic> #t386 = <core::String, dynamic>{};
-          for (dynamic i in let final<BottomType> #t387 = invalid-expression "pkg/front_end/testcases/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>)
-            #t386.{core::Map::[]=}("bar", i);
-          #t386.{core::Map::[]=}("baz", null);
-        } =>#t386;
-        core::List<core::int> list20 = block {
-          final core::List<core::int> #t388 = <core::int>[];
-          for (core::int i in <core::int>[let final<BottomType> #t389 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:32: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list20 = [for (int i in [\"not\", \"int\"]) i];
-                               ^" in "not" as{TypeError} core::int, let final<BottomType> #t390 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:237:39: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list20 = [for (int i in [\"not\", \"int\"]) i];
-                                      ^" in "int" as{TypeError} core::int])
-            #t388.{core::List::add}(i);
-        } =>#t388;
-        core::Set<core::int> set20 = block {
-          final core::Set<core::int> #t391 = col::LinkedHashSet::•<core::int>();
-          for (core::int i in <core::int>[let final<BottomType> #t392 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t393 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:238:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
-                                     ^" in "int" as{TypeError} core::int])
-            #t391.{core::Set::add}(i);
-          #t391.{core::Set::add}(null);
-        } =>#t391;
-        core::Map<core::String, core::int> map20 = block {
-          final core::Map<core::String, core::int> #t394 = <core::String, core::int>{};
-          for (core::int i in <core::int>[let final<BottomType> #t395 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:31: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                              ^" in "not" as{TypeError} core::int, let final<BottomType> #t396 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:239:38: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
-                                     ^" in "int" as{TypeError} core::int])
-            #t394.{core::Map::[]=}("bar", i);
-          #t394.{core::Map::[]=}("baz", null);
-        } =>#t394;
-        final core::List<dynamic> #t397 = <dynamic>[];
-        {
-          dynamic :stream = let final<BottomType> #t398 = invalid-expression "pkg/front_end/testcases/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>;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t399 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t400 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t397.{core::List::add}(i);
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::List<dynamic> list30 = block {} =>#t397;
-        final core::Set<dynamic> #t402 = col::LinkedHashSet::•<dynamic>();
-        {
-          dynamic :stream = let final<BottomType> #t403 = invalid-expression "pkg/front_end/testcases/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>;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L3:
-            while (true) {
-              dynamic #t404 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t405 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t402.{core::Set::add}(i);
-              }
-              else
-                break #L3;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::Set<dynamic> set30 = block {
-          #t402.{core::Set::add}(null);
-        } =>#t402;
-        final core::Map<core::String, dynamic> #t407 = <core::String, dynamic>{};
-        {
-          dynamic :stream = let final<BottomType> #t408 = invalid-expression "pkg/front_end/testcases/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>;
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L4:
-            while (true) {
-              dynamic #t409 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t410 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic i = :for-iterator.{asy::_StreamIterator::current};
-                #t407.{core::Map::[]=}("bar", i);
-              }
-              else
-                break #L4;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t411 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::Map<core::String, dynamic> map30 = block {
-          #t407.{core::Map::[]=}("baz", null);
-        } =>#t407;
-        final core::List<core::int> #t412 = <core::int>[];
-        {
-          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t413 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:58: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                         ^" in "not" as{TypeError} core::int, let final<BottomType> #t414 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:243:65: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
-                                                                ^" in "int" as{TypeError} core::int]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L5:
-            while (true) {
-              dynamic #t415 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t416 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::int i = :for-iterator.{asy::_StreamIterator::current};
-                #t412.{core::List::add}(i);
-              }
-              else
-                break #L5;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::List<core::int> list40 = block {} =>#t412;
-        final core::Set<core::int> #t418 = col::LinkedHashSet::•<core::int>();
-        {
-          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t419 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t420 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:244:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
-                                                               ^" in "int" as{TypeError} core::int]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L6:
-            while (true) {
-              dynamic #t421 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t422 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::int i = :for-iterator.{asy::_StreamIterator::current};
-                #t418.{core::Set::add}(i);
-              }
-              else
-                break #L6;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::Set<core::int> set40 = block {
-          #t418.{core::Set::add}(null);
-        } =>#t418;
-        final core::Map<core::String, core::int> #t424 = <core::String, core::int>{};
-        {
-          dynamic :stream = asy::Stream::fromIterable<core::int>(<core::int>[let final<BottomType> #t425 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                        ^" in "not" as{TypeError} core::int, let final<BottomType> #t426 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:245:64: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
-                                                               ^" in "int" as{TypeError} core::int]);
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L7:
-            while (true) {
-              dynamic #t427 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t428 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                core::int i = :for-iterator.{asy::_StreamIterator::current};
-                #t424.{core::Map::[]=}("bar", i);
-              }
-              else
-                break #L7;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t429 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-        core::Map<core::String, core::int> map40 = block {
-          #t424.{core::Map::[]=}("baz", null);
-        } =>#t424;
-        core::List<core::int> list50 = block {
-          final core::List<core::int> #t430 = <core::int>[];
-          for (; ; )
-            #t430.{core::List::add}(42);
-        } =>#t430;
-        core::Set<core::int> set50 = block {
-          final core::Set<core::int> #t431 = col::LinkedHashSet::•<core::int>();
-          for (; ; )
-            #t431.{core::Set::add}(42);
-          #t431.{core::Set::add}(null);
-        } =>#t431;
-        core::Map<core::String, core::int> map50 = block {
-          final core::Map<core::String, core::int> #t432 = <core::String, core::int>{};
-          for (; ; )
-            #t432.{core::Map::[]=}("bar", 42);
-          #t432.{core::Map::[]=}("baz", null);
-        } =>#t432;
-        core::List<core::int> list60 = block {
-          final core::List<core::int> #t433 = <core::int>[];
-          for (; let final<BottomType> #t434 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:249:24: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var list60 = [for (; \"not bool\";) 42];
-                       ^" in "not bool" as{TypeError} core::bool; )
-            #t433.{core::List::add}(42);
-        } =>#t433;
-        core::Set<core::int> set60 = block {
-          final core::Set<core::int> #t435 = col::LinkedHashSet::•<core::int>();
-          for (; let final<BottomType> #t436 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:250:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var set60 = {for (; \"not bool\";) 42, null};
-                      ^" in "not bool" as{TypeError} core::bool; )
-            #t435.{core::Set::add}(42);
-          #t435.{core::Set::add}(null);
-        } =>#t435;
-        core::Map<core::String, core::int> map60 = block {
-          final core::Map<core::String, core::int> #t437 = <core::String, core::int>{};
-          for (; let final<BottomType> #t438 = invalid-expression "pkg/front_end/testcases/control_flow_collection_inference.dart:251:23: Error: A value of type 'String' can't be assigned to a variable of type 'bool'.
-Try changing the type of the left hand side, or casting the right hand side to 'bool'.
-  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
-                      ^" in "not bool" as{TypeError} core::bool; )
-            #t437.{core::Map::[]=}("bar", 42);
-          #t437.{core::Map::[]=}("baz", null);
-        } =>#t437;
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method testForElementErrorsNotAsync(asy::Stream<core::int> stream) → dynamic {
-  block {
-    final core::List<core::int> #t439 = <core::int>[];
-    await for (core::int i in stream)
-      #t439.{core::List::add}(i);
-  } =>#t439;
-  block {
-    final core::Set<core::int> #t440 = col::LinkedHashSet::•<core::int>();
-    await for (core::int i in stream)
-      #t440.{core::Set::add}(i);
-  } =>#t440;
-  block {
-    final core::Map<core::String, core::int> #t441 = <core::String, core::int>{};
-    await for (core::int i in stream)
-      #t441.{core::Map::[]=}("bar", i);
-  } =>#t441;
-}
-static method testPromotion(self::A a) → dynamic {
-  core::List<core::int> list10 = block {
-    final core::List<core::int> #t442 = <core::int>[];
-    if(a is self::B)
-      #t442.{core::List::add}(a{self::B}.{self::B::foo});
-  } =>#t442;
-  core::Set<core::int> set10 = block {
-    final core::Set<core::int> #t443 = col::LinkedHashSet::•<core::int>();
-    if(a is self::B)
-      #t443.{core::Set::add}(a{self::B}.{self::B::foo});
-  } =>#t443;
-  core::Map<core::int, core::int> map10 = block {
-    final core::Map<core::int, core::int> #t444 = <core::int, core::int>{};
-    if(a is self::B)
-      #t444.{core::Map::[]=}(a{self::B}.{self::B::foo}, a{self::B}.{self::B::foo});
-  } =>#t444;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect b/pkg/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect
deleted file mode 100644
index 648acdc..0000000
--- a/pkg/front_end/testcases/control_flow_collection_inference.dart.type_promotion.expect
+++ /dev/null
@@ -1,306 +0,0 @@
-pkg/front_end/testcases/control_flow_collection_inference.dart:123:49: Context: Write to i@7018
-  var list10 = [for (int i = 0; oracle("foo"); i++) 42];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:124:48: Context: Write to i@7018
-  var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:125:48: Context: Write to i@7018
-  var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:126:49: Context: Write to i@7018
-  var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:127:48: Context: Write to i@7018
-  var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:128:48: Context: Write to i@7018
-  var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:129:49: Context: Write to i@7018
-  var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:130:48: Context: Write to i@7018
-  var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:131:48: Context: Write to i@7018
-  var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:132:49: Context: Write to i@7018
-  var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:133:48: Context: Write to i@7018
-  var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:134:48: Context: Write to i@7018
-  var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:135:49: Context: Write to i@7018
-  var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:136:48: Context: Write to i@7018
-  var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:137:48: Context: Write to i@7018
-  var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:138:49: Context: Write to i@7018
-  var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:139:48: Context: Write to i@7018
-  var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:140:48: Context: Write to i@7018
-  var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:141:49: Context: Write to i@7018
-  var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:142:48: Context: Write to i@7018
-  var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:143:48: Context: Write to i@7018
-  var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:144:49: Context: Write to i@7018
-  var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:145:48: Context: Write to i@7018
-  var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:146:48: Context: Write to i@7018
-  var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:147:49: Context: Write to i@7018
-  var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:148:48: Context: Write to i@7018
-  var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:149:48: Context: Write to i@7018
-  var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:150:61: Context: Write to i@7018
-  List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:151:59: Context: Write to i@7018
-  Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:152:67: Context: Write to i@7018
-  Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:153:61: Context: Write to i@7018
-  List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:154:59: Context: Write to i@7018
-  Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:155:61: Context: Write to i@7018
-  List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:156:59: Context: Write to i@7018
-  Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:157:67: Context: Write to i@7018
-  Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:158:55: Context: Write to i@7018
-  List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
-                                                      ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:159:53: Context: Write to i@7018
-  Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
-                                                    ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:160:61: Context: Write to i@7018
-  Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:161:55: Context: Write to i@7018
-  List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
-                                                      ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:162:53: Context: Write to i@7018
-  Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
-                                                    ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:163:55: Context: Write to i@7018
-  List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
-                                                      ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:164:53: Context: Write to i@7018
-  Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
-                                                    ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:165:61: Context: Write to i@7018
-  List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:166:59: Context: Write to i@7018
-  Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:167:67: Context: Write to i@7018
-  Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:168:61: Context: Write to i@7018
-  List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:169:59: Context: Write to i@7018
-  Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:170:67: Context: Write to i@7018
-  Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:171:61: Context: Write to i@7018
-  List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:172:59: Context: Write to i@7018
-  Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:173:67: Context: Write to i@7018
-  Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:174:61: Context: Write to i@7018
-  List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:175:59: Context: Write to i@7018
-  Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
-                                                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:176:67: Context: Write to i@7018
-  Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
-                                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:177:49: Context: Write to i@7018
-  var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:178:48: Context: Write to i@7018
-  var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:179:48: Context: Write to i@7018
-  var map80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:180:49: Context: Write to i@7018
-  var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:181:48: Context: Write to i@7018
-  var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:182:48: Context: Write to i@7018
-  var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:183:49: Context: Write to i@7018
-  var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:184:48: Context: Write to i@7018
-  var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:185:48: Context: Write to i@7018
-  var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:186:49: Context: Write to i@7018
-  var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:187:48: Context: Write to i@7018
-  var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:188:48: Context: Write to i@7018
-  var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:189:55: Context: Write to i@7018
-  List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
-                                                      ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:190:53: Context: Write to i@7018
-  Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
-                                                    ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:191:61: Context: Write to i@7018
-  Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:192:55: Context: Write to i@7018
-  List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
-                                                      ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:193:53: Context: Write to i@7018
-  Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
-                                                    ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:194:61: Context: Write to i@7018
-  Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
-                                                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:195:40: Context: Write to index@6916
-  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-                                       ^
-pkg/front_end/testcases/control_flow_collection_inference.dart:195:65: Context: Write to index@6916
-  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
-                                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:196:38: Context: Write to index@6916
-  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-                                     ^
-pkg/front_end/testcases/control_flow_collection_inference.dart:196:63: Context: Write to index@6916
-  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
-                                                              ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:197:54: Context: Write to index@6916
-  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-                                                     ^
-pkg/front_end/testcases/control_flow_collection_inference.dart:197:79: Context: Write to index@6916
-  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
-                                                                              ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:204:48: Context: Write to i@7018
-  List<int> list130 = [for (var i = 1; i < 2; i++) i];
-                                               ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:205:46: Context: Write to i@7018
-  Set<int> set130 = {for (var i = 1; i < 2; i++) i};
-                                             ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:206:51: Context: Write to i@7018
-  Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
-                                                  ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:210:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) "bar"];
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:211:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:212:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
-                                             ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:213:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:214:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:215:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
-                                             ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:216:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) ...map];
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:217:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:218:46: Context: Write to i@13789
-  <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
-                                             ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:219:44: Context: Write to i@13789
-  <String>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
-                                           ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:220:44: Context: Write to i@13789
-  <String>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
-                                           ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:221:52: Context: Write to i@13789
-  <String, String>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else "bar": 3.14, "baz": null};
-                                                   ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:222:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:223:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:224:49: Context: Write to i@13789
-  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...list else "bar": 42, "baz": null};
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:225:41: Context: Write to i@13789
-  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:226:41: Context: Write to i@13789
-  <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
-                                        ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:227:49: Context: Write to i@13789
-  <String, int>{for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": 42 else ...list, "baz": null};
-                                                ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:267:29: Context: Possible promotion of a@16609
-  List<int> list10 = [if (a is B) a.foo];
-                            ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:268:27: Context: Possible promotion of a@16609
-  Set<int> set10 = {if (a is B) a.foo};
-                          ^^
-pkg/front_end/testcases/control_flow_collection_inference.dart:269:32: Context: Possible promotion of a@16609
-  Map<int, int> map10 = {if (a is B) a.foo: a.foo};
-                               ^^
diff --git a/pkg/front_end/testcases/covariant_generic.dart.legacy.expect b/pkg/front_end/testcases/covariant_generic.dart.legacy.expect
deleted file mode 100644
index 7070b05..0000000
--- a/pkg/front_end/testcases/covariant_generic.dart.legacy.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Callback<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;
-  field self::Foo::T mutableField = null;
-  field (self::Foo::T) → void mutableCallbackField = null;
-  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → void
-    : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
-    ;
-  method method(self::Foo::T x) → void {}
-  set setter(self::Foo::T x) → dynamic {}
-  method withCallback((self::Foo::T) → void callback) → void {
-    callback.call(this.{self::Foo::finalField});
-  }
-}
-static method main() → dynamic {
-  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → dynamic {});
-  fooInt.method(3);
-  fooInt.setter = 3;
-  fooInt.withCallback((core::int x) → dynamic {});
-  fooInt.withCallback((core::num x) → dynamic {});
-  fooInt.mutableField = 3;
-  fooInt.mutableCallbackField = (core::int x) → dynamic {};
-  self::Foo<core::num> fooNum = fooInt;
-  fooNum.method(3);
-  fooNum.method(2.5);
-  fooNum.setter = 3;
-  fooNum.setter = 2.5;
-  fooNum.withCallback((core::num x) → dynamic {});
-  fooNum.mutableField = 3;
-  fooNum.mutableField = 2.5;
-  fooNum.mutableCallbackField(3);
-  fooNum.mutableCallbackField(2.5);
-  fooNum.mutableCallbackField = (core::num x) → dynamic {};
-}
diff --git a/pkg/front_end/testcases/covariant_generic.dart.legacy.transformed.expect b/pkg/front_end/testcases/covariant_generic.dart.legacy.transformed.expect
deleted file mode 100644
index 7070b05..0000000
--- a/pkg/front_end/testcases/covariant_generic.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Callback<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;
-  field self::Foo::T mutableField = null;
-  field (self::Foo::T) → void mutableCallbackField = null;
-  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → void
-    : self::Foo::finalField = finalField, self::Foo::callbackField = callbackField, super core::Object::•()
-    ;
-  method method(self::Foo::T x) → void {}
-  set setter(self::Foo::T x) → dynamic {}
-  method withCallback((self::Foo::T) → void callback) → void {
-    callback.call(this.{self::Foo::finalField});
-  }
-}
-static method main() → dynamic {
-  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → dynamic {});
-  fooInt.method(3);
-  fooInt.setter = 3;
-  fooInt.withCallback((core::int x) → dynamic {});
-  fooInt.withCallback((core::num x) → dynamic {});
-  fooInt.mutableField = 3;
-  fooInt.mutableCallbackField = (core::int x) → dynamic {};
-  self::Foo<core::num> fooNum = fooInt;
-  fooNum.method(3);
-  fooNum.method(2.5);
-  fooNum.setter = 3;
-  fooNum.setter = 2.5;
-  fooNum.withCallback((core::num x) → dynamic {});
-  fooNum.mutableField = 3;
-  fooNum.mutableField = 2.5;
-  fooNum.mutableCallbackField(3);
-  fooNum.mutableCallbackField(2.5);
-  fooNum.mutableCallbackField = (core::num x) → dynamic {};
-}
diff --git a/pkg/front_end/testcases/covariant_generic.dart.outline.expect b/pkg/front_end/testcases/covariant_generic.dart.outline.expect
deleted file mode 100644
index da79e5c..0000000
--- a/pkg/front_end/testcases/covariant_generic.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Callback<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;
-  generic-covariant-impl field self::Foo::T mutableField;
-  field (self::Foo::T) → void mutableCallbackField;
-  constructor •(self::Foo::T finalField, (self::Foo::T) → void callbackField) → self::Foo<self::Foo::T>
-    ;
-  method method(generic-covariant-impl self::Foo::T x) → void
-    ;
-  set setter(generic-covariant-impl self::Foo::T x) → void
-    ;
-  method withCallback((self::Foo::T) → void callback) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/covariant_generic.dart.strong.expect b/pkg/front_end/testcases/covariant_generic.dart.strong.expect
deleted file mode 100644
index fdbee87..0000000
--- a/pkg/front_end/testcases/covariant_generic.dart.strong.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Callback<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;
-  generic-covariant-impl 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(generic-covariant-impl self::Foo::T x) → void {}
-  set setter(generic-covariant-impl self::Foo::T x) → void {}
-  method withCallback((self::Foo::T) → void callback) → void {
-    callback.call(this.{self::Foo::finalField});
-  }
-}
-static method main() → dynamic {
-  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → core::Null {});
-  fooInt.{self::Foo::method}(3);
-  fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int x) → core::Null {});
-  fooInt.{self::Foo::withCallback}((core::num x) → core::Null {});
-  fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int x) → core::Null {};
-  self::Foo<core::num> fooNum = fooInt;
-  fooNum.{self::Foo::method}(3);
-  fooNum.{self::Foo::method}(2.5);
-  fooNum.{self::Foo::setter} = 3;
-  fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num x) → core::Null {});
-  fooNum.{self::Foo::mutableField} = 3;
-  fooNum.{self::Foo::mutableField} = 2.5;
-  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(3);
-  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(2.5);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num x) → core::Null {};
-}
diff --git a/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect
deleted file mode 100644
index fdbee87..0000000
--- a/pkg/front_end/testcases/covariant_generic.dart.strong.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-typedef Callback<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;
-  generic-covariant-impl 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(generic-covariant-impl self::Foo::T x) → void {}
-  set setter(generic-covariant-impl self::Foo::T x) → void {}
-  method withCallback((self::Foo::T) → void callback) → void {
-    callback.call(this.{self::Foo::finalField});
-  }
-}
-static method main() → dynamic {
-  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → core::Null {});
-  fooInt.{self::Foo::method}(3);
-  fooInt.{self::Foo::setter} = 3;
-  fooInt.{self::Foo::withCallback}((core::int x) → core::Null {});
-  fooInt.{self::Foo::withCallback}((core::num x) → core::Null {});
-  fooInt.{self::Foo::mutableField} = 3;
-  fooInt.{self::Foo::mutableCallbackField} = (core::int x) → core::Null {};
-  self::Foo<core::num> fooNum = fooInt;
-  fooNum.{self::Foo::method}(3);
-  fooNum.{self::Foo::method}(2.5);
-  fooNum.{self::Foo::setter} = 3;
-  fooNum.{self::Foo::setter} = 2.5;
-  fooNum.{self::Foo::withCallback}((core::num x) → core::Null {});
-  fooNum.{self::Foo::mutableField} = 3;
-  fooNum.{self::Foo::mutableField} = 2.5;
-  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(3);
-  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num) → void).call(2.5);
-  fooNum.{self::Foo::mutableCallbackField} = (core::num x) → core::Null {};
-}
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect
deleted file mode 100644
index 17ddb30..0000000
--- a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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 core::num x) → void {}
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-abstract class _D&A&B = self::A with self::B {
-  synthetic constructor •() → self::_D&A&B
-    : super self::A::•()
-    ;
-  forwarding-stub method foo(covariant core::num x) → void
-    return super.{self::A::foo}(x);
-}
-class D extends self::_D&A&B implements self::C {
-  synthetic constructor •() → self::D
-    : super self::_D&A&B::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect
deleted file mode 100644
index cec0223..0000000
--- a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-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 core::num x) → void {}
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-abstract class _D&A&B extends self::A implements self::B {
-  synthetic constructor •() → self::_D&A&B
-    : super self::A::•()
-    ;
-  method foo(covariant core::num x) → void {}
-}
-class D extends self::_D&A&B implements self::C {
-  synthetic constructor •() → self::D
-    : super self::_D&A&B::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect b/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect
deleted file mode 100644
index 241bbe0..0000000
--- a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method foo(covariant core::num x) → void
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  method foo(core::num x) → void
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method foo(core::num x) → void
-    ;
-}
-abstract class _D&A&B = self::A with self::B {
-  synthetic constructor •() → self::_D&A&B
-    : super self::A::•()
-    ;
-  forwarding-stub method foo(covariant core::num x) → void
-    return super.{self::A::foo}(x);
-}
-class D extends self::_D&A&B implements self::C {
-  synthetic constructor •() → self::D
-    ;
-  method foo(covariant core::int x) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect b/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect
deleted file mode 100644
index 17ddb30..0000000
--- a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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 core::num x) → void {}
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-abstract class _D&A&B = self::A with self::B {
-  synthetic constructor •() → self::_D&A&B
-    : super self::A::•()
-    ;
-  forwarding-stub method foo(covariant core::num x) → void
-    return super.{self::A::foo}(x);
-}
-class D extends self::_D&A&B implements self::C {
-  synthetic constructor •() → self::D
-    : super self::_D&A&B::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect
deleted file mode 100644
index cec0223..0000000
--- a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-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 core::num x) → void {}
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method foo(core::num x) → void {}
-}
-abstract class _D&A&B extends self::A implements self::B {
-  synthetic constructor •() → self::_D&A&B
-    : super self::A::•()
-    ;
-  method foo(covariant core::num x) → void {}
-}
-class D extends self::_D&A&B implements self::C {
-  synthetic constructor •() → self::D
-    : super self::_D&A&B::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/cycles.dart.legacy.expect b/pkg/front_end/testcases/cycles.dart.legacy.expect
deleted file mode 100644
index 74c43d4..0000000
--- a/pkg/front_end/testcases/cycles.dart.legacy.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-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 extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-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/cycles.dart.legacy.transformed.expect b/pkg/front_end/testcases/cycles.dart.legacy.transformed.expect
deleted file mode 100644
index 74c43d4..0000000
--- a/pkg/front_end/testcases/cycles.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-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 extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-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/cycles.dart.outline.expect b/pkg/front_end/testcases/cycles.dart.outline.expect
deleted file mode 100644
index 6c6bd27..0000000
--- a/pkg/front_end/testcases/cycles.dart.outline.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/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
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/cycles.dart.strong.expect b/pkg/front_end/testcases/cycles.dart.strong.expect
deleted file mode 100644
index 74c43d4..0000000
--- a/pkg/front_end/testcases/cycles.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-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 extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-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/cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/cycles.dart.strong.transformed.expect
deleted file mode 100644
index 74c43d4..0000000
--- a/pkg/front_end/testcases/cycles.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/cycles.dart:5:7: Error: 'A' is a supertype of itself.
-// class A implements C {}
-//       ^
-//
-// pkg/front_end/testcases/cycles.dart:7:7: Error: 'B' is a supertype of itself.
-// class B extends A {}
-//       ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-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 extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-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/default_values.dart.legacy.expect b/pkg/front_end/testcases/default_values.dart.legacy.expect
deleted file mode 100644
index ac79608..0000000
--- a/pkg/front_end/testcases/default_values.dart.legacy.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method topLevel([dynamic a = 42]) → dynamic
-  return a;
-static method main() → dynamic {
-  core::print(self::topLevel());
-}
diff --git a/pkg/front_end/testcases/default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/default_values.dart.legacy.transformed.expect
deleted file mode 100644
index ac79608..0000000
--- a/pkg/front_end/testcases/default_values.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method topLevel([dynamic a = 42]) → dynamic
-  return a;
-static method main() → dynamic {
-  core::print(self::topLevel());
-}
diff --git a/pkg/front_end/testcases/default_values.dart.strong.expect b/pkg/front_end/testcases/default_values.dart.strong.expect
deleted file mode 100644
index ac79608..0000000
--- a/pkg/front_end/testcases/default_values.dart.strong.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method topLevel([dynamic a = 42]) → dynamic
-  return a;
-static method main() → dynamic {
-  core::print(self::topLevel());
-}
diff --git a/pkg/front_end/testcases/default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/default_values.dart.strong.transformed.expect
deleted file mode 100644
index ac79608..0000000
--- a/pkg/front_end/testcases/default_values.dart.strong.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method topLevel([dynamic a = 42]) → dynamic
-  return a;
-static method main() → dynamic {
-  core::print(self::topLevel());
-}
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
deleted file mode 100644
index 982cf85..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
deleted file mode 100644
index 982cf85..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/deferred_type_annotation.dart:7:5: Warning: 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/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;
-}
-static field dynamic x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect
deleted file mode 100644
index 592059d..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.outline.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-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;
-  synthetic constructor •() → def::C
-    ;
-  static method m() → core::int
-    ;
-}
-static field dynamic x;
-static method m(dynamic x) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
deleted file mode 100644
index 29b1b92..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
deleted file mode 100644
index 29b1b92..0000000
--- a/pkg/front_end/testcases/deferred_type_annotation.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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;
-}
-static field core::int x = 0;
-static method m(dynamic x) → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect
deleted file mode 100644
index 8d79e12..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.expect
+++ /dev/null
@@ -1,67 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-//                                             ^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: '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::•()
-    ;
-}
-class Dupe extends core::Object {
-  synthetic constructor •() → self::Dupe
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self3::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect
deleted file mode 100644
index 8d79e12..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,67 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-//                                             ^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: '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::•()
-    ;
-}
-class Dupe extends core::Object {
-  synthetic constructor •() → self::Dupe
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self3::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
deleted file mode 100644
index 1fee0d1..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.outline.expect
+++ /dev/null
@@ -1,59 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Warning: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-//                                             ^
-//
-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
-    ;
-}
-class Dupe extends core::Object {
-  synthetic constructor •() → self::Dupe
-    ;
-}
-class C extends core::Object {
-  field invalid-type b;
-  field invalid-type d;
-  synthetic constructor •() → self::C
-    ;
-}
-static method main() → dynamic
-  ;
-
-library;
-import self as self2;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self2::C
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self3::C
-    ;
-}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
deleted file mode 100644
index 9f72e139..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.expect
+++ /dev/null
@@ -1,67 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-//                                             ^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13: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::•()
-    ;
-}
-class Dupe extends core::Object {
-  synthetic constructor •() → self::Dupe
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self3::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
deleted file mode 100644
index 9f72e139..0000000
--- a/pkg/front_end/testcases/duplicated_bad_prefix.dart.strong.transformed.expect
+++ /dev/null
@@ -1,67 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
-// class Dupe {}
-//       ^^^^
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
-// class Dupe {}
-//       ^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
-//   Dupe.a b;
-//   ^^^^^^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:6:45: Error: 'C' is imported from both 'pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart' and 'pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart'.
-// import 'duplicated_bad_prefix_lib2.dart' as dupe;
-//                                             ^
-//
-// pkg/front_end/testcases/duplicated_bad_prefix.dart:13: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::•()
-    ;
-}
-class Dupe extends core::Object {
-  synthetic constructor •() → self::Dupe
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field invalid-type b = null;
-  field invalid-type d = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self3::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect
deleted file mode 100644
index 522465d..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.expect
+++ /dev/null
@@ -1,529 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "1st";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
-// var field = "3rd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = 4;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "3rd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
-// var field = 5.0;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
-// var field = 4;
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
-// import 'duplicated_declarations_lib.dart' as Typedef;
-//                                              ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Warning: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Context: This isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-//   main();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
-//   print(field);
-//         ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-//   C.s();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-//   static f() => s;
-//                 ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:66:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   Sub() : super(null);
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Warning: Superclass has no method named 'm'.
-//   m() => super.m();
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-//     "AnotherEnum._name": AnotherEnum._name,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-//     "AnotherEnum.index": AnotherEnum.index,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
-//     "AnotherEnum.toString": AnotherEnum.toString,
-//                                         ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-//     "AnotherEnum.values": AnotherEnum.values,
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  constructor _() → self::C#3
-    : super core::Object::•()
-    ;
-}
-class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  field dynamic 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/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field dynamic 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/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  method m() → dynamic
-    return super.m();
-}
-class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
-  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
-  const constructor •(core::int index, core::String _name) → self::Enum#4
-    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#4::_name};
-}
-class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
-  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
-  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
-  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#3
-    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#3::_name};
-}
-class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
-  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
-  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
-  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum#2
-    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#2::_name};
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field dynamic field;
-static method main() → dynamic {
-  "1st";
-}
-static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-  main();
-  ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/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/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-  C.s();
-  ^".s();
-}
-static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-    \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-    \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104: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/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-    \"AnotherEnum.values\": AnotherEnum.values,
-                                      ^^^^^^"};
-}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
deleted file mode 100644
index 522465d..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,529 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "1st";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
-// var field = "3rd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = 4;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "3rd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
-// var field = 5.0;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
-// var field = 4;
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
-// import 'duplicated_declarations_lib.dart' as Typedef;
-//                                              ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Warning: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Context: This isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-//   main();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
-//   print(field);
-//         ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-//   C.s();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-//   static f() => s;
-//                 ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:66:16: Warning: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   Sub() : super(null);
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Warning: Superclass has no method named 'm'.
-//   m() => super.m();
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-//     "AnotherEnum._name": AnotherEnum._name,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-//     "AnotherEnum.index": AnotherEnum.index,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
-//     "AnotherEnum.toString": AnotherEnum.toString,
-//                                         ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-//     "AnotherEnum.values": AnotherEnum.values,
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  constructor _() → self::C#3
-    : super core::Object::•()
-    ;
-}
-class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  field dynamic 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/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field dynamic 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/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Object, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  method m() → dynamic
-    return super.m();
-}
-class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
-  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
-  const constructor •(core::int index, core::String _name) → self::Enum#4
-    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#4::_name};
-}
-class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
-  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
-  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
-  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#3
-    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#3::_name};
-}
-class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
-  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
-  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
-  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum#2
-    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#2::_name};
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field dynamic field;
-static method main() → dynamic {
-  "1st";
-}
-static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-  main();
-  ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/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/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-  C.s();
-  ^".s();
-}
-static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-    \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-    \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104: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/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-    \"AnotherEnum.values\": AnotherEnum.values,
-                                      ^^^^^^"};
-}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
deleted file mode 100644
index 24178c0..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.outline.expect
+++ /dev/null
@@ -1,451 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "1st";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
-// var field = "3rd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = 4;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "3rd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
-// var field = 5.0;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
-// var field = 4;
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
-// import 'duplicated_declarations_lib.dart' as Typedef;
-//                                              ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Warning: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Context: This isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-//
-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
-    ;
-}
-class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  constructor _() → self::C#3
-    ;
-}
-class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  field dynamic field;
-  constructor •(dynamic a) → self::C#2
-    ;
-  method m() → dynamic
-    ;
-  static method s() → dynamic
-    ;
-  static method f() → dynamic
-    ;
-}
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    ;
-}
-class C extends core::Object {
-  field dynamic field;
-  constructor •(dynamic a) → self::C
-    ;
-  method m() → dynamic
-    ;
-  static method s() → dynamic
-    ;
-  static method f() → dynamic
-    ;
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    ;
-  method m() → dynamic
-    ;
-}
-class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
-  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
-  const constructor •(core::int index, core::String _name) → self::Enum#4
-    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#4::_name};
-}
-class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
-  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
-  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
-  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#3
-    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#3::_name};
-}
-class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
-  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
-  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
-  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum#2
-    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#2::_name};
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field dynamic field;
-static method main() → dynamic
-  ;
-static method foo() → dynamic
-  ;
-static method useAnotherEnum() → dynamic
-  ;
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect b/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
deleted file mode 100644
index a34ac18..0000000
--- a/pkg/front_end/testcases/duplicated_declarations.dart.strong.expect
+++ /dev/null
@@ -1,532 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = "2nd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "1st";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:25:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:75:3: Error: Name of enum constant 'Enum' can't be the same as the enum's own name.
-//   Enum,
-//   ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:77:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
-//   _name,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
-//   index,
-//   ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
-//   toString,
-//   ^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
-//   values,
-//   ^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:87:6: Context: Previous declaration of 'values' is implied by this definition.
-// enum AnotherEnum {
-//      ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Error: 'OldTypedef' is already declared in this scope.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:19:16: Context: Previous declaration of 'OldTypedef'.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Error: 'field' is already declared in this scope.
-// var field = "3rd";
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:23:5: Context: Previous declaration of 'field'.
-// var field = "2nd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:29:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations.dart:70:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations.dart:81:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/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/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/duplicated_declarations_part.dart:13:9: Error: 'Typedef' is already declared in this scope.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:11:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = void Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:19:16: Error: 'OldTypedef' is already declared in this scope.
-// typedef Object OldTypedef();
-//                ^^^^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:17:14: Context: Previous declaration of 'OldTypedef'.
-// typedef void OldTypedef();
-//              ^^^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Error: 'field' is already declared in this scope.
-// var field = 4;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:21:5: Context: Previous declaration of 'field'.
-// var field = "3rd";
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:25:5: Error: 'field' is already declared in this scope.
-// var field = 5.0;
-//     ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:23:5: Context: Previous declaration of 'field'.
-// var field = 4;
-//     ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:27:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:35:1: Error: 'main' is already declared in this scope.
-// main() {
-// ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:31:1: Context: Previous declaration of 'main'.
-// main() {
-// ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:41:3: Error: 'C' is already declared in this scope.
-//   C(a, b);
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:40:3: Context: Previous declaration of 'C'.
-//   C(a);
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:44:7: Error: 'field' is already declared in this scope.
-//   var field = "2nd";
-//       ^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:42:7: Context: Previous declaration of 'field'.
-//   var field = "1st";
-//       ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:50:3: Error: 'm' is already declared in this scope.
-//   m() {
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:46:3: Context: Previous declaration of 'm'.
-//   m() {
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:58:10: Error: 's' is already declared in this scope.
-//   static s() {
-//          ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:54:10: Context: Previous declaration of 's'.
-//   static s() {
-//          ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:39:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:69:7: Error: 'C' is already declared in this scope.
-// class C {
-//       ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:65:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_declarations_part.dart:76:3: Error: 'a' is already declared in this scope.
-//   a,
-//   ^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:75:3: Context: Previous declaration of 'a'.
-//   a,
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:73:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations_part.dart:86:6: Error: 'Enum' is already declared in this scope.
-// enum Enum {
-//      ^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:80:6: Context: Previous declaration of 'Enum'.
-// enum Enum {
-//      ^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:7:46: Error: 'Typedef' is already declared in this scope.
-// import 'duplicated_declarations_lib.dart' as Typedef;
-//                                              ^^^^^^^
-// pkg/front_end/testcases/duplicated_declarations_part.dart:13:9: Context: Previous declaration of 'Typedef'.
-// typedef Typedef = Object Function();
-//         ^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Context: This isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
-// class Sub extends C {
-//                   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-//   main();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:35:9: Error: Can't use 'field' because it is declared more than once.
-//   print(field);
-//         ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-//   C.s();
-//   ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-//   static f() => s;
-//                 ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:66:16: Error: Too many positional arguments: 0 allowed, but 1 found.
-// Try removing the extra positional arguments.
-//   Sub() : super(null);
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:67:16: Error: Superclass has no method named 'm'.
-//   m() => super.m();
-//                ^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-//     "AnotherEnum._name": AnotherEnum._name,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-//     "AnotherEnum.index": AnotherEnum.index,
-//                                      ^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:104:41: Error: Can't use 'toString' because it is declared more than once.
-//     "AnotherEnum.toString": AnotherEnum.toString,
-//                                         ^^^^^^^^
-//
-// pkg/front_end/testcases/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-//     "AnotherEnum.values": AnotherEnum.values,
-//                                       ^^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  constructor _() → self::C#3
-    : super core::Object::•()
-    ;
-}
-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/duplicated_declarations_part.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class C#1 extends core::Object {
-  constructor _() → self::C#1
-    : super core::Object::•()
-    ;
-}
-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/duplicated_declarations.dart:62:17: Error: Can't use 's' because it is declared more than once.
-  static f() => s;
-                ^";
-}
-class Sub extends core::Object {
-  constructor •() → self::Sub
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:66: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();
-}
-class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#4> values = const <self::Enum#4>[self::Enum#4::a];
-  static const field self::Enum#4 a = const self::Enum#4::•(0, "Enum.a");
-  const constructor •(core::int index, core::String _name) → self::Enum#4
-    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#4::_name};
-}
-class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#3> values = const <self::Enum#3>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
-  static const field self::Enum#3 a = const self::Enum#3::•(0, "Enum.a");
-  static const field self::Enum#3 b = const self::Enum#3::•(1, "Enum.b");
-  static const field self::Enum#3 c = const self::Enum#3::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#3
-    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#3::_name};
-}
-class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#2> values = const <self::Enum#2>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
-  static const field self::Enum#2 Enum = const self::Enum#2::•(0, "Enum.Enum");
-  static const field self::Enum#2 a = const self::Enum#2::•(1, "Enum.a");
-  static const field self::Enum#2 b = const self::Enum#2::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum#2
-    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#2::_name};
-}
-class Enum#1 extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum#1> values = const <self::Enum#1>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
-  static const field self::Enum#1 a = const self::Enum#1::•(0, "Enum.a");
-  static const field self::Enum#1 b = const self::Enum#1::•(1, "Enum.b");
-  static const field self::Enum#1 c = const self::Enum#1::•(2, "Enum.c");
-  const constructor •(core::int index, core::String _name) → self::Enum#1
-    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum#1::_name};
-}
-class Enum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Enum> values = const <self::Enum>[self::Enum::Enum, self::Enum::a, self::Enum::b];
-  static const field self::Enum Enum = const self::Enum::•(0, "Enum.Enum");
-  static const field self::Enum a = const self::Enum::•(1, "Enum.a");
-  static const field self::Enum b = const self::Enum::•(2, "Enum.b");
-  const constructor •(core::int index, core::String _name) → self::Enum
-    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::Enum::_name};
-}
-class AnotherEnum extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::AnotherEnum> values = const <self::AnotherEnum>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
-  static const field self::AnotherEnum a = const self::AnotherEnum::•(0, "AnotherEnum.a");
-  static const field self::AnotherEnum b = const self::AnotherEnum::•(1, "AnotherEnum.b");
-  static const field self::AnotherEnum c = const self::AnotherEnum::•(2, "AnotherEnum.c");
-  const constructor •(core::int index, core::String _name) → self::AnotherEnum
-    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::AnotherEnum::_name};
-}
-static field core::String field;
-static method main() → dynamic {
-  "1st";
-}
-static method foo() → dynamic {
-  invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:34:3: Error: Can't use 'main' because it is declared more than once.
-  main();
-  ^".call();
-  core::print(invalid-expression "pkg/front_end/testcases/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/duplicated_declarations.dart:36:3: Error: Can't use 'C' because it is declared more than once.
-  C.s();
-  ^".s();
-}
-static method useAnotherEnum() → dynamic {
-  <core::String, core::Object>{"AnotherEnum.a": self::AnotherEnum::a, "AnotherEnum.b": self::AnotherEnum::b, "AnotherEnum.c": self::AnotherEnum::c, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
-    \"AnotherEnum._name\": AnotherEnum._name,
-                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
-    \"AnotherEnum.index\": AnotherEnum.index,
-                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/duplicated_declarations.dart:104: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/duplicated_declarations.dart:105:39: Error: Can't use 'values' because it is declared more than once.
-    \"AnotherEnum.values\": AnotherEnum.values,
-                                      ^^^^^^"};
-}
-
-library;
-import self as self2;
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect
deleted file mode 100644
index 9be85c0..0000000
--- a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
-//   int a;
-//       ^
-// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
-//   int a;
-//       ^
-//
-// pkg/front_end/testcases/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 •(dynamic a) → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
-  A(this.a);
-         ^", super core::Object::•()
-    ;
-}
-static method main() → void {
-  new self::A::•(1);
-}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect
deleted file mode 100644
index 9be85c0..0000000
--- a/pkg/front_end/testcases/duplicated_field_initializer.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
-//   int a;
-//       ^
-// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
-//   int a;
-//       ^
-//
-// pkg/front_end/testcases/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 •(dynamic a) → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
-  A(this.a);
-         ^", super core::Object::•()
-    ;
-}
-static method main() → void {
-  new self::A::•(1);
-}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect
deleted file mode 100644
index dd9b512..0000000
--- a/pkg/front_end/testcases/duplicated_field_initializer.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
-//   int a;
-//       ^
-// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
-//   int a;
-//       ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int a;
-  constructor •(dynamic a) → self::A
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect
deleted file mode 100644
index f272e6c..0000000
--- a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
-//   int a;
-//       ^
-// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
-//   int a;
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
-  A(this.a);
-         ^", super core::Object::•()
-    ;
-}
-static method main() → void {
-  new self::A::•(1);
-}
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect
deleted file mode 100644
index f272e6c..0000000
--- a/pkg/front_end/testcases/duplicated_field_initializer.dart.strong.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_field_initializer.dart:7:7: Error: 'a' is already declared in this scope.
-//   int a;
-//       ^
-// pkg/front_end/testcases/duplicated_field_initializer.dart:6:7: Context: Previous declaration of 'a'.
-//   int a;
-//       ^
-//
-// pkg/front_end/testcases/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/duplicated_field_initializer.dart:8:10: Error: Can't use 'a' because it is declared more than once.
-  A(this.a);
-         ^", super core::Object::•()
-    ;
-}
-static method main() → void {
-  new self::A::•(1);
-}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect
deleted file mode 100644
index 2baebe3..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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 m({core::int a = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: 1, a: 2, a: 3);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect
deleted file mode 100644
index 2baebe3..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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 m({core::int a = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: 1, a: 2, a: 3);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.outline.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.outline.expect
deleted file mode 100644
index 8b09143..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library test;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  static method m({core::int a}) → dynamic
-    ;
-}
-static method test() → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
deleted file mode 100644
index 42c312a..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
-//   C.m(a: 1, a: 2, a: 3);
-//             ^
-//
-// pkg/front_end/testcases/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 = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
-  C.m(a: 1, a: 2, a: 3);
-                  ^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.transformed.expect b/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.transformed.expect
deleted file mode 100644
index 42c312a..0000000
--- a/pkg/front_end/testcases/duplicated_named_args_3.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/duplicated_named_args_3.dart:13:13: Error: Duplicated named argument 'a'.
-//   C.m(a: 1, a: 2, a: 3);
-//             ^
-//
-// pkg/front_end/testcases/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 = 0}) → dynamic {}
-}
-static method test() → void {
-  self::C::m(a: invalid-expression "pkg/front_end/testcases/duplicated_named_args_3.dart:13:19: Error: Duplicated named argument 'a'.
-  C.m(a: 1, a: 2, a: 3);
-                  ^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.legacy.expect b/pkg/front_end/testcases/dynamic_and_void.dart.legacy.expect
deleted file mode 100644
index 5606157..0000000
--- a/pkg/front_end/testcases/dynamic_and_void.dart.legacy.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
-// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
-//                           ^^^^^^^
-//
-import self as self;
-
-import "dart:core";
-
-static method testDynamic() → invalid-type
-  return 0;
-static method testVoid() → void {}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect b/pkg/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
deleted file mode 100644
index 5606157..0000000
--- a/pkg/front_end/testcases/dynamic_and_void.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
-// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
-//                           ^^^^^^^
-//
-import self as self;
-
-import "dart:core";
-
-static method testDynamic() → invalid-type
-  return 0;
-static method testVoid() → void {}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect b/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect
deleted file mode 100644
index b659017..0000000
--- a/pkg/front_end/testcases/dynamic_and_void.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
-// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
-//                           ^^^^^^^
-//
-import self as self;
-
-import "dart:core";
-
-static method testDynamic() → invalid-type
-  ;
-static method testVoid() → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/escape.dart.legacy.expect b/pkg/front_end/testcases/escape.dart.legacy.expect
deleted file mode 100644
index ec93320..0000000
--- a/pkg/front_end/testcases/escape.dart.legacy.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-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::•()
-    ;
-}
-class B extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  operator ==(dynamic x) → core::bool
-    return false;
-}
-class X extends core::Object implements self::A, self::B {
-  field dynamic field = null;
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-static method useAsA(self::A object) → void {
-  dynamic _ = object.field;
-}
-static method useAsB(self::B object) → void {
-  dynamic _ = object.field;
-  self::escape(object);
-}
-static method escape(dynamic x) → void {
-  x.==(null) ? x = "" : null;
-  x.==(null) ? x = 45 : null;
-  if(!(x is core::int) && !(x is core::String)) {
-    x.field = 45;
-  }
-}
-static method main() → dynamic {
-  dynamic 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/escape.dart.legacy.transformed.expect b/pkg/front_end/testcases/escape.dart.legacy.transformed.expect
deleted file mode 100644
index ec93320..0000000
--- a/pkg/front_end/testcases/escape.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-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::•()
-    ;
-}
-class B extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  operator ==(dynamic x) → core::bool
-    return false;
-}
-class X extends core::Object implements self::A, self::B {
-  field dynamic field = null;
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-static method useAsA(self::A object) → void {
-  dynamic _ = object.field;
-}
-static method useAsB(self::B object) → void {
-  dynamic _ = object.field;
-  self::escape(object);
-}
-static method escape(dynamic x) → void {
-  x.==(null) ? x = "" : null;
-  x.==(null) ? x = 45 : null;
-  if(!(x is core::int) && !(x is core::String)) {
-    x.field = 45;
-  }
-}
-static method main() → dynamic {
-  dynamic 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/escape.dart.outline.expect b/pkg/front_end/testcases/escape.dart.outline.expect
deleted file mode 100644
index 1bccd65..0000000
--- a/pkg/front_end/testcases/escape.dart.outline.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field dynamic field;
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  field dynamic field;
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  operator ==(dynamic x) → core::bool
-    ;
-}
-class X extends core::Object implements self::A, self::B {
-  field dynamic field;
-  synthetic constructor •() → self::X
-    ;
-}
-static method useAsA(self::A object) → void
-  ;
-static method useAsB(self::B object) → void
-  ;
-static method escape(dynamic x) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/escape.dart.strong.expect b/pkg/front_end/testcases/escape.dart.strong.expect
deleted file mode 100644
index 2a1b03e..0000000
--- a/pkg/front_end/testcases/escape.dart.strong.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-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::•()
-    ;
-}
-class B extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  operator ==(dynamic x) → core::bool
-    return false;
-}
-class X extends core::Object implements self::A, self::B {
-  field dynamic field = null;
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-static method useAsA(self::A object) → void {
-  dynamic _ = object.{self::A::field};
-}
-static method useAsB(self::B object) → void {
-  dynamic _ = object.{self::B::field};
-  self::escape(object);
-}
-static method escape(dynamic x) → void {
-  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
-  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
-  if(!(x is core::int) && !(x is core::String)) {
-    x.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/escape.dart.strong.transformed.expect b/pkg/front_end/testcases/escape.dart.strong.transformed.expect
deleted file mode 100644
index 2a1b03e..0000000
--- a/pkg/front_end/testcases/escape.dart.strong.transformed.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-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::•()
-    ;
-}
-class B extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  operator ==(dynamic x) → core::bool
-    return false;
-}
-class X extends core::Object implements self::A, self::B {
-  field dynamic field = null;
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-static method useAsA(self::A object) → void {
-  dynamic _ = object.{self::A::field};
-}
-static method useAsB(self::B object) → void {
-  dynamic _ = object.{self::B::field};
-  self::escape(object);
-}
-static method escape(dynamic x) → void {
-  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
-  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
-  if(!(x is core::int) && !(x is core::String)) {
-    x.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/escape.dart.type_promotion.expect b/pkg/front_end/testcases/escape.dart.type_promotion.expect
deleted file mode 100644
index ff163e6..0000000
--- a/pkg/front_end/testcases/escape.dart.type_promotion.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-pkg/front_end/testcases/escape.dart:31:5: Context: Write to x@483
-  x ??= "";
-    ^^^
-pkg/front_end/testcases/escape.dart:32:5: Context: Write to x@483
-  x ??= 45;
-    ^^^
diff --git a/pkg/front_end/testcases/export_test.dart.legacy.expect b/pkg/front_end/testcases/export_test.dart.legacy.expect
deleted file mode 100644
index cf3dd78..0000000
--- a/pkg/front_end/testcases/export_test.dart.legacy.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:developer" as dev;
-additionalExports = (core::print)
-
-
-import "dart:profiler";
-export "dart:core";
-
-static method main() → dynamic {
-  core::print(dev::UserTag);
-}
diff --git a/pkg/front_end/testcases/export_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/export_test.dart.legacy.transformed.expect
deleted file mode 100644
index cf3dd78..0000000
--- a/pkg/front_end/testcases/export_test.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:developer" as dev;
-additionalExports = (core::print)
-
-
-import "dart:profiler";
-export "dart:core";
-
-static method main() → dynamic {
-  core::print(dev::UserTag);
-}
diff --git a/pkg/front_end/testcases/export_test.dart.strong.expect b/pkg/front_end/testcases/export_test.dart.strong.expect
deleted file mode 100644
index cf3dd78..0000000
--- a/pkg/front_end/testcases/export_test.dart.strong.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:developer" as dev;
-additionalExports = (core::print)
-
-
-import "dart:profiler";
-export "dart:core";
-
-static method main() → dynamic {
-  core::print(dev::UserTag);
-}
diff --git a/pkg/front_end/testcases/export_test.dart.strong.transformed.expect b/pkg/front_end/testcases/export_test.dart.strong.transformed.expect
deleted file mode 100644
index cf3dd78..0000000
--- a/pkg/front_end/testcases/export_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:developer" as dev;
-additionalExports = (core::print)
-
-
-import "dart:profiler";
-export "dart:core";
-
-static method main() → dynamic {
-  core::print(dev::UserTag);
-}
diff --git a/pkg/front_end/testcases/expression/class_capture.expression.yaml.expect b/pkg/front_end/testcases/expression/class_capture.expression.yaml.expect
index e937d8c..e05b4b1 100644
--- a/pkg/front_end/testcases/expression/class_capture.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_capture.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::int {
+  return () → dart.core::int* {
     return this.{main::B::x}.{dart.core::num::+}(this.{main::B::y});
   };
diff --git a/pkg/front_end/testcases/expression/class_private_get.expression.yaml b/pkg/front_end/testcases/expression/class_private_get.expression.yaml
new file mode 100644
index 0000000..dc9214d
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_get.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#B"
+expression: |
+  _priv
diff --git a/pkg/front_end/testcases/expression/class_private_get.expression.yaml.expect b/pkg/front_end/testcases/expression/class_private_get.expression.yaml.expect
new file mode 100644
index 0000000..1b23fa1
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_get.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return this.{main::B::_priv};
diff --git a/pkg/front_end/testcases/expression/class_private_method.expression.yaml b/pkg/front_end/testcases/expression/class_private_method.expression.yaml
new file mode 100644
index 0000000..0af4443
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_method.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#B"
+expression: |
+  _privMethod
diff --git a/pkg/front_end/testcases/expression/class_private_method.expression.yaml.expect b/pkg/front_end/testcases/expression/class_private_method.expression.yaml.expect
new file mode 100644
index 0000000..d945f2e
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_method.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return this.{main::B::_privMethod};
diff --git a/pkg/front_end/testcases/expression/class_private_set.expression.yaml b/pkg/front_end/testcases/expression/class_private_set.expression.yaml
new file mode 100644
index 0000000..33b2db9
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_set.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#B"
+expression: |
+  _priv = 3
diff --git a/pkg/front_end/testcases/expression/class_private_set.expression.yaml.expect b/pkg/front_end/testcases/expression/class_private_set.expression.yaml.expect
new file mode 100644
index 0000000..dc37e63
--- /dev/null
+++ b/pkg/front_end/testcases/expression/class_private_set.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return this.{main::B::_priv} = 3;
diff --git a/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect b/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect
index cbc3e0f..65d8f24 100644
--- a/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_static3.expression.yaml.expect
@@ -4,7 +4,7 @@
               ^^^^^^^^^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n            ^^^^^^^^^" as{TypeError} dart.core::num).{dart.core::num::+}(5);
+  return #lib1::globalVar.{dart.core::num::+}(invalid-expression "org-dartlang-debug:synthetic_debug_expression:1:13: Error: Getter not found: 'staticVar'.\nglobalVar + staticVar + 5\n            ^^^^^^^^^" as{TypeError} dart.core::num*).{dart.core::num::+}(5);
 Errors: {
 }
 static method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml.expect
index 2fef29d..c21f4fd 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return main::hasBound<main::C::T>();
+  return main::hasBound<main::C::T*>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect
index 2fef29d..c21f4fd 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_2.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return main::hasBound<main::C::T>();
+  return main::hasBound<main::C::T*>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
index 2bc51ce..845e716 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal.expression.yaml.expect
@@ -6,4 +6,4 @@
   ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return main::hasBound<main::A::T>();
+  return main::hasBound<main::A::T*>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect
index 2bc51ce..845e716 100644
--- a/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_bound_illegal_2.expression.yaml.expect
@@ -6,4 +6,4 @@
   ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return main::hasBound<main::A::T>();
+  return main::hasBound<main::A::T*>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml.expect
index 4dc0e4e..bed6d1b 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return x is main::A::T;
+  return x is main::A::T*;
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml.expect
index 9e1d05d..2cb613c 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return main::id<main::A::T>(x as{TypeError} main::A::T);
+  return main::id<main::A::T*>(x as{TypeError} main::A::T*);
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
index f830c60..ee48a6d 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_arg_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     x = main::id<dynamic>(x);
   };
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml.expect
index 979c5be..5b0ed1c 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return new main::A::•<main::A::T>();
+  return new main::A::•<main::A::T*>();
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
index 5c172f4..e41764a 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_ctor_inferred.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x) → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     x = new main::A::•<dynamic>();
   };
diff --git a/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml.expect b/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml.expect
index 1404a49..dfe66d2 100644
--- a/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/class_type_param_reference_var.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → main::A::T {
-    main::A::T k = null;
+  return () → main::A::T* {
+    main::A::T* k = null;
     return k;
   };
diff --git a/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml.expect b/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml.expect
index e5db5df..1d47240b 100644
--- a/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/core_lib_internal.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return null is dart.collection::Queue<dynamic>;
+  return null is dart.collection::Queue<dynamic>*;
diff --git a/pkg/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect b/pkg/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect
index ad666aa..4436d62 100644
--- a/pkg/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/from_vm_cc_linked_hash_map.expression.yaml.expect
@@ -1,16 +1,16 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic a, dynamic b) → dynamic
-  return ((dynamic a, dynamic b) → dart.core::bool {
+  return ((dynamic a, dynamic b) → dart.core::bool* {
     if(!a._usedData.{dart.core::Object::==}(b._usedData) || !a._deletedKeys.{dart.core::Object::==}(b._deletedKeys) || !a._hashMask.{dart.core::Object::==}(b._hashMask) || !a._index.length.{dart.core::Object::==}(b._index.length) || !a._data.length.{dart.core::Object::==}(b._data.length)) {
       return false;
     }
-    for (dart.core::int i = 0; i.{dart.core::num::<}(a._index.length as{TypeError} dart.core::num); i = i.{dart.core::num::+}(1)) {
+    for (dart.core::int* i = 0; i.{dart.core::num::<}(a._index.length as{TypeError} dart.core::num*); i = i.{dart.core::num::+}(1)) {
       if(!a._index.[](i).{dart.core::Object::==}(b._index.[](i))) {
         return false;
       }
     }
-    for (dart.core::int i = 0; i.{dart.core::num::<}(a._data.length as{TypeError} dart.core::num); i = i.{dart.core::num::+}(1)) {
+    for (dart.core::int* i = 0; i.{dart.core::num::<}(a._data.length as{TypeError} dart.core::num*); i = i.{dart.core::num::+}(1)) {
       dynamic ad = a._data.[](i);
       dynamic bd = b._data.[](i);
       if(!dart.core::identical(ad, bd) && !(ad.{dart.core::Object::==}(a) && bd.{dart.core::Object::==}(b))) {
diff --git a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
index b4269a7..9398271 100644
--- a/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_ctor.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     new main::A::•<dynamic>();
     const main::A::•<dynamic>();
   };
diff --git a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
index c2d537a..f2dfa42 100644
--- a/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/lib_external_ctor.expression.yaml.expect
@@ -4,7 +4,7 @@
            ^^^^^^^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     throw new dart.core::AbstractClassInstantiationError::•("Process");
     dart.io::File::fromUri(dart.core::Uri::parse("file://test.dart"));
   };
diff --git a/pkg/front_end/testcases/expression/library_private_get.expression.yaml b/pkg/front_end/testcases/expression/library_private_get.expression.yaml
new file mode 100644
index 0000000..1420876
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_get.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart"
+expression: |
+  _globalPrivate
diff --git a/pkg/front_end/testcases/expression/library_private_get.expression.yaml.expect b/pkg/front_end/testcases/expression/library_private_get.expression.yaml.expect
new file mode 100644
index 0000000..3344ae2
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_get.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return main::_globalPrivate;
diff --git a/pkg/front_end/testcases/expression/library_private_method.expression.yaml b/pkg/front_end/testcases/expression/library_private_method.expression.yaml
new file mode 100644
index 0000000..49c6972
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_method.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart"
+expression: |
+  _privateToplevel(3)
diff --git a/pkg/front_end/testcases/expression/library_private_method.expression.yaml.expect b/pkg/front_end/testcases/expression/library_private_method.expression.yaml.expect
new file mode 100644
index 0000000..6a0e56c
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_method.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return main::_privateToplevel(3);
diff --git a/pkg/front_end/testcases/expression/library_private_set.expression.yaml b/pkg/front_end/testcases/expression/library_private_set.expression.yaml
new file mode 100644
index 0000000..5fe632f
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_set.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart"
+expression: |
+  _globalPrivate = 2
diff --git a/pkg/front_end/testcases/expression/library_private_set.expression.yaml.expect b/pkg/front_end/testcases/expression/library_private_set.expression.yaml.expect
new file mode 100644
index 0000000..e7752bf
--- /dev/null
+++ b/pkg/front_end/testcases/expression/library_private_set.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return main::_globalPrivate = 2;
diff --git a/pkg/front_end/testcases/expression/main.dart b/pkg/front_end/testcases/expression/main.dart
index a889b39..0b61f5d 100644
--- a/pkg/front_end/testcases/expression/main.dart
+++ b/pkg/front_end/testcases/expression/main.dart
@@ -7,31 +7,42 @@
 import 'dart:io' show File, Process, exit;
 
 int doitstat(int x) => x + 1;
+int _privateToplevel(int x) => x + 1;
 
 int globalVar = 6;
+int _globalPrivate = 7;
 
 class A<T> {
   const A();
   static int doit(int x) => x + 1;
   static int staticVar = 3;
   int doit_with_this(int x) => x + 1;
+
+  final int _priv = 0;
+  void _privMethod() {}
 }
 
 T id<T>(T x) => x;
 
-class B {
+class B extends A<Object> {
   int x;
   final int y = 7;
+  int _priv;
   String get z {
     return "";
   }
 
   void set z(int _) {}
+  void _privMethod() {}
 }
 
 class Bound {}
 
-class C<T extends Bound> {}
+class HasPrivate {
+  int _priv = 0;
+}
+
+class C<T extends Bound> extends HasPrivate {}
 
 void hasBound<T extends Bound>() {}
 
diff --git a/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml.expect b/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml.expect
index 6b64c73..3fed1d3 100644
--- a/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/missing_variable_types.expression.yaml.expect
@@ -1,4 +1,4 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic s) → dynamic
-  return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T>>((s = <dynamic>[]) as{TypeError} dart.core::List<main::D::T>));
+  return this.{main::D::m}(this.{main::D::id}<dart.core::List<main::D::T*>*>((s = <dynamic>[]) as{TypeError} dart.core::List<main::D::T*>*));
diff --git a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
index b8ea8d2..81af55b 100644
--- a/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/param_capture.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr(dynamic x, dynamic y) → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     x = x.+(y);
   };
diff --git a/pkg/front_end/testcases/expression/super_private_get.expression.yaml b/pkg/front_end/testcases/expression/super_private_get.expression.yaml
new file mode 100644
index 0000000..a4b1c4e
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_get.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#B"
+expression: |
+  super._priv
diff --git a/pkg/front_end/testcases/expression/super_private_get.expression.yaml.expect b/pkg/front_end/testcases/expression/super_private_get.expression.yaml.expect
new file mode 100644
index 0000000..20ec891
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_get.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return super.{main::A::_priv};
diff --git a/pkg/front_end/testcases/expression/super_private_method.expression.yaml b/pkg/front_end/testcases/expression/super_private_method.expression.yaml
new file mode 100644
index 0000000..53a1429
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_method.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#B"
+expression: |
+  super._privMethod
diff --git a/pkg/front_end/testcases/expression/super_private_method.expression.yaml.expect b/pkg/front_end/testcases/expression/super_private_method.expression.yaml.expect
new file mode 100644
index 0000000..39cb950
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_method.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return super.{main::A::_privMethod};
diff --git a/pkg/front_end/testcases/expression/super_private_set.expression.yaml b/pkg/front_end/testcases/expression/super_private_set.expression.yaml
new file mode 100644
index 0000000..f52f8c3
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_set.expression.yaml
@@ -0,0 +1,9 @@
+# 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.
+
+entry_point: "main.dart"
+definitions: []
+position: "main.dart#C"
+expression: |
+  super._priv = 0
diff --git a/pkg/front_end/testcases/expression/super_private_set.expression.yaml.expect b/pkg/front_end/testcases/expression/super_private_set.expression.yaml.expect
new file mode 100644
index 0000000..8e9d782
--- /dev/null
+++ b/pkg/front_end/testcases/expression/super_private_set.expression.yaml.expect
@@ -0,0 +1,4 @@
+Errors: {
+}
+method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr() → dynamic
+  return super.{main::HasPrivate::_priv} = 0;
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
index 865f21c..9a35069 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_ctor_inferred.expression.yaml.expect
@@ -6,6 +6,6 @@
               ^
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     main::A::debugExpr::T k = let final<BottomType> #t1 = invalid-expression "org-dartlang-debug:synthetic_debug_expression:2:13: Error: A value of type 'A<dynamic>' can't be assigned to a variable of type 'T'.\n - 'A' is from 'pkg/front_end/testcases/expression/main.dart'.\nTry changing the type of the left hand side, or casting the right hand side to 'T'.\n  T k = new A();\n            ^" in new main::A::•<dynamic>() as{TypeError} <BottomType>;
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
index 77370b6..8c299a7 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_arg_inferred.expression.yaml.expect
@@ -1,7 +1,7 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>() → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     main::A::debugExpr::T k = null;
     k = main::id<main::A::debugExpr::T>(k);
   };
diff --git a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
index 0fb5c63..4a2c0ec 100644
--- a/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
+++ b/pkg/front_end/testcases/expression/type_param_shadow_var.expression.yaml.expect
@@ -1,6 +1,6 @@
 Errors: {
 }
 method /* from org-dartlang-debug:synthetic_debug_expression */ debugExpr<T extends dynamic>(dynamic x) → dynamic
-  return () → dart.core::Null {
+  return () → dart.core::Null* {
     main::A::debugExpr::T x = null;
   };
diff --git a/pkg/front_end/testcases/expressions.dart.legacy.expect b/pkg/front_end/testcases/expressions.dart.legacy.expect
deleted file mode 100644
index 5676a4d..0000000
--- a/pkg/front_end/testcases/expressions.dart.legacy.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
-//     print(int?.toString());
-//                ^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method foo({dynamic fisk = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.==(1) ? "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; ) {
-  }
-  dynamic list = <dynamic>["Hello, World!"];
-  core::print(list.[](i));
-  list.[]=(i, "Hello, Brave New World!");
-  core::print(list.[](i));
-  i = 87;
-  core::print(i.unary-());
-  core::print(i.~());
-  core::print(!i.==(42));
-  core::print(i = i.-(1));
-  core::print(i = i.+(1));
-  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
-  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::List::•<core::String>(2).runtimeType);
-  self::foo(fisk: "Blorp gulp");
-  function f() → dynamic {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → dynamic {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → dynamic {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → dynamic {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.toString());
-  core::print(core::int);
-  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
-  try {
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "Shouldn't work";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("As expected: ${e}");
-  }
-  core::print(core::int::parse("42"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect b/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect
deleted file mode 100644
index 5a549bb..0000000
--- a/pkg/front_end/testcases/expressions.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/expressions.dart:74:16: Warning: Method not found: 'int.toString'.
-//     print(int?.toString());
-//                ^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method foo({dynamic fisk = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.==(1) ? "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; ) {
-  }
-  dynamic list = <dynamic>["Hello, World!"];
-  core::print(list.[](i));
-  list.[]=(i, "Hello, Brave New World!");
-  core::print(list.[](i));
-  i = 87;
-  core::print(i.unary-());
-  core::print(i.~());
-  core::print(!i.==(42));
-  core::print(i = i.-(1));
-  core::print(i = i.+(1));
-  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
-  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::_List::•<core::String>(2).runtimeType);
-  self::foo(fisk: "Blorp gulp");
-  function f() → dynamic {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → dynamic {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → dynamic {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → dynamic {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → dynamic {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.toString());
-  core::print(core::int);
-  core::print(let final dynamic #t5 = core::int in let final dynamic #t6 = #t5.toString() in #t5);
-  try {
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#int.toString, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw "Shouldn't work";
-  }
-  on core::NoSuchMethodError catch(final core::NoSuchMethodError e) {
-    core::print("As expected: ${e}");
-  }
-  core::print(core::int::parse("42"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.strong.expect b/pkg/front_end/testcases/expressions.dart.strong.expect
deleted file mode 100644
index 2a658a7..0000000
--- a/pkg/front_end/testcases/expressions.dart.strong.expect
+++ /dev/null
@@ -1,88 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.{core::num::==}(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.{core::Object::==}(null))
-      core::print(s);
-  }
-  for (; false; ) {
-  }
-  core::List<core::String> list = <core::String>["Hello, World!"];
-  core::print(list.{core::List::[]}(i));
-  list.{core::List::[]=}(i, "Hello, Brave New World!");
-  core::print(list.{core::List::[]}(i));
-  i = 87;
-  core::print(i.{core::int::unary-}());
-  core::print(i.{core::int::~}());
-  core::print(!i.{core::num::==}(42));
-  core::print(i = i.{core::num::-}(1));
-  core::print(i = i.{core::num::+}(1));
-  core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::-}(1) in #t1);
-  core::print(let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::List::•<core::String>(2).{core::Object::runtimeType});
-  self::foo(fisk: "Blorp gulp");
-  function f() → core::Null {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → core::Null {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → core::Null {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → core::Null {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → core::Null {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → core::Null {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.{core::Object::toString}());
-  core::print(core::int);
-  core::print(let final core::Type #t5 = core::int in let final dynamic #t6 = #t5.{core::Object::toString}() in #t5);
-  try {
-    core::print(invalid-expression "pkg/front_end/testcases/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"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
deleted file mode 100644
index 2732cf4..0000000
--- a/pkg/front_end/testcases/expressions.dart.strong.transformed.expect
+++ /dev/null
@@ -1,88 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 = null}) → dynamic {
-  core::print(fisk);
-}
-static method caller(dynamic f) → dynamic {
-  f.call();
-}
-static method main() → dynamic {
-  core::int i = 0;
-  core::print(i.{core::num::==}(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.{core::Object::==}(null))
-      core::print(s);
-  }
-  for (; false; ) {
-  }
-  core::List<core::String> list = <core::String>["Hello, World!"];
-  core::print(list.{core::List::[]}(i));
-  list.{core::List::[]=}(i, "Hello, Brave New World!");
-  core::print(list.{core::List::[]}(i));
-  i = 87;
-  core::print(i.{core::int::unary-}());
-  core::print(i.{core::int::~}());
-  core::print(!i.{core::num::==}(42));
-  core::print(i = i.{core::num::-}(1));
-  core::print(i = i.{core::num::+}(1));
-  core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::-}(1) in #t1);
-  core::print(let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3);
-  core::print(new core::Object::•());
-  core::print(const core::Object::•());
-  core::print(core::_List::•<core::String>(2).{core::Object::runtimeType});
-  self::foo(fisk: "Blorp gulp");
-  function f() → core::Null {
-    core::print("f was called");
-  }
-  self::caller(f);
-  self::caller(() → core::Null {
-    core::print("<anon> was called");
-  });
-  function g([dynamic message = null]) → core::Null {
-    core::print(message);
-  }
-  g.call("Hello, World");
-  self::caller(([dynamic x = null]) → core::Null {
-    core::print("<anon> was called with ${x}");
-  });
-  function h({dynamic message = null}) → core::Null {
-    core::print(message);
-  }
-  h.call(message: "Hello, World");
-  self::caller(({dynamic x = null}) → core::Null {
-    core::print("<anon> was called with ${x}");
-  });
-  core::print(core::int.{core::Object::toString}());
-  core::print(core::int);
-  core::print(let final core::Type #t5 = core::int in let final core::String #t6 = #t5.{core::Object::toString}() in #t5);
-  try {
-    core::print(invalid-expression "pkg/front_end/testcases/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"));
-}
diff --git a/pkg/front_end/testcases/expressions.dart.type_promotion.expect b/pkg/front_end/testcases/expressions.dart.type_promotion.expect
deleted file mode 100644
index 3692c63..0000000
--- a/pkg/front_end/testcases/expressions.dart.type_promotion.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-pkg/front_end/testcases/expressions.dart:34:5: Context: Write to i@286
-  i = 87;
-    ^
-pkg/front_end/testcases/expressions.dart:38:9: Context: Write to i@286
-  print(--i);
-        ^^
-pkg/front_end/testcases/expressions.dart:39:9: Context: Write to i@286
-  print(++i);
-        ^^
-pkg/front_end/testcases/expressions.dart:40:10: Context: Write to i@286
-  print(i--);
-         ^^
-pkg/front_end/testcases/expressions.dart:41:10: Context: Write to i@286
-  print(i++);
-         ^^
diff --git a/pkg/front_end/testcases/extension_methods.dart.hierarchy.expect b/pkg/front_end/testcases/extension_methods.dart.hierarchy.expect
deleted file mode 100644
index af7781c..0000000
--- a/pkg/front_end/testcases/extension_methods.dart.hierarchy.expect
+++ /dev/null
@@ -1,418 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-C:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-    C.one
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/extension_methods.dart.legacy.expect b/pkg/front_end/testcases/extension_methods.dart.legacy.expect
deleted file mode 100644
index 7fd1230..0000000
--- a/pkg/front_end/testcases/extension_methods.dart.legacy.expect
+++ /dev/null
@@ -1,71 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Warning: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:13: Warning: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Warning: 'extension' isn't a type.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:7: Error: Expected ';' after this.
-//   int get two => 2;
-//       ^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:15: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   int get two => 2;
-//               ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:3: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//   ^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//         ^
-//
-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;
-}
-static field invalid-type E;
-static method main() → dynamic {
-  invalid-type c = invalid-expression "pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-  C c = C();
-        ^".call();
-  dynamic result = c.one.+(c.two);
-  exp::Expect::equals(result, 3);
-}
diff --git a/pkg/front_end/testcases/extension_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/extension_methods.dart.legacy.transformed.expect
deleted file mode 100644
index 7fd1230..0000000
--- a/pkg/front_end/testcases/extension_methods.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,71 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Warning: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:13: Warning: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Warning: 'extension' isn't a type.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:7: Error: Expected ';' after this.
-//   int get two => 2;
-//       ^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:15: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   int get two => 2;
-//               ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:3: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//   ^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//         ^
-//
-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;
-}
-static field invalid-type E;
-static method main() → dynamic {
-  invalid-type c = invalid-expression "pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-  C c = C();
-        ^".call();
-  dynamic result = c.one.+(c.two);
-  exp::Expect::equals(result, 3);
-}
diff --git a/pkg/front_end/testcases/extension_methods.dart.outline.expect b/pkg/front_end/testcases/extension_methods.dart.outline.expect
deleted file mode 100644
index ccb8e3f..0000000
--- a/pkg/front_end/testcases/extension_methods.dart.outline.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Warning: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:13: Warning: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  get one() → core::int
-    ;
-}
-static field invalid-type E;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/extension_methods.dart.strong.expect b/pkg/front_end/testcases/extension_methods.dart.strong.expect
deleted file mode 100644
index b3845b4..0000000
--- a/pkg/front_end/testcases/extension_methods.dart.strong.expect
+++ /dev/null
@@ -1,71 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
-// Try enabling this experiment by adding it to the command line when compiling and running.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-// extension E on C {
-//                ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
-// extension E on C {
-//                ^
-// pkg/front_end/testcases/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
-// class C {
-//       ^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: Type 'extension' not found.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:13: Error: Type 'on' not found.
-// extension E on C {
-//             ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:13:1: Error: 'extension' isn't a type.
-// extension E on C {
-// ^^^^^^^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:7: Error: Expected ';' after this.
-//   int get two => 2;
-//       ^^^
-//
-// pkg/front_end/testcases/extension_methods.dart:14:15: Error: A function declaration needs an explicit list of parameters.
-// Try adding a parameter list to the function declaration.
-//   int get two => 2;
-//               ^^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:3: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//   ^
-//
-// pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-//   C c = C();
-//         ^
-//
-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;
-}
-static field invalid-type E;
-static method main() → dynamic {
-  invalid-type c = invalid-expression "pkg/front_end/testcases/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
-  C c = C();
-        ^".call() as{TypeError} invalid-type;
-  dynamic result = c.one.+(c.two);
-  exp::Expect::equals(result, 3);
-}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart b/pkg/front_end/testcases/extensions/explicit_this.dart
new file mode 100644
index 0000000..e8f1fb4
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart
@@ -0,0 +1,21 @@
+// 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.
+
+class A1 {
+  Object field;
+  void method1() {}
+}
+
+extension A2 on A1 {
+  void method2() => this.method1();
+
+  Object method3() => this.field;
+
+  void method4(Object o) {
+    this.field = o;
+  }
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.hierarchy.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.hierarchy.expect
new file mode 100644
index 0000000..759a8b1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.hierarchy.expect
@@ -0,0 +1,39 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    A1.field
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    A1.method1
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    A1.field
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.expect
new file mode 100644
index 0000000..566f8cd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/explicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:11:21: Error: Expected identifier, but got 'this'.
+//   void method2() => this.method1();
+//                     ^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:13:23: Error: Expected identifier, but got 'this'.
+//   Object method3() => this.field;
+//                       ^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:16:5: Error: Expected identifier, but got 'this'.
+//     this.field = o;
+//     ^^^^
+//
+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 {}
+}
+static field invalid-type A2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.transformed.expect
new file mode 100644
index 0000000..566f8cd
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.legacy.transformed.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/explicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:11:21: Error: Expected identifier, but got 'this'.
+//   void method2() => this.method1();
+//                     ^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:13:23: Error: Expected identifier, but got 'this'.
+//   Object method3() => this.field;
+//                       ^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:16:5: Error: Expected identifier, but got 'this'.
+//     this.field = o;
+//     ^^^^
+//
+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 {}
+}
+static field invalid-type A2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
new file mode 100644
index 0000000..6102ceb
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.outline.expect
@@ -0,0 +1,42 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/explicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/explicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field core::Object* field;
+  synthetic constructor •() → self::A1*
+    ;
+  method method1() → void
+    ;
+}
+static field invalid-type A2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.strong.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.strong.expect
new file mode 100644
index 0000000..391f9a2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.strong.expect
@@ -0,0 +1,21 @@
+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 {}
+}
+class A2 extends core::Object {
+}
+method A2|method2(final self::A1* #this) → void
+  return #this.{self::A1::method1}();
+method A2|method3(final self::A1* #this) → core::Object*
+  return #this.{self::A1::field};
+method A2|method4(final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/explicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/explicit_this.dart.strong.transformed.expect
new file mode 100644
index 0000000..391f9a2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/explicit_this.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+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 {}
+}
+class A2 extends core::Object {
+}
+method A2|method2(final self::A1* #this) → void
+  return #this.{self::A1::method1}();
+method A2|method3(final self::A1* #this) → core::Object*
+  return #this.{self::A1::field};
+method A2|method4(final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart b/pkg/front_end/testcases/extensions/implicit_this.dart
new file mode 100644
index 0000000..212f107
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart
@@ -0,0 +1,21 @@
+// 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.
+
+class A1 {
+  Object field;
+  void method1() {}
+}
+
+extension A2 on A1 {
+  void method2() => method1();
+
+  Object method3() => field;
+
+  void method4(Object o) {
+    field = o;
+  }
+}
+
+main() {
+}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.hierarchy.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.hierarchy.expect
new file mode 100644
index 0000000..759a8b1
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.hierarchy.expect
@@ -0,0 +1,39 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    A1.field
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    A1.method1
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    A1.field
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.expect
new file mode 100644
index 0000000..27a47ac
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/implicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:11:21: Warning: Method not found: 'method1'.
+//   void method2() => method1();
+//                     ^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:13:23: Warning: Getter not found: 'field'.
+//   Object method3() => field;
+//                       ^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:16:5: Warning: Setter not found: 'field'.
+//     field = o;
+//     ^^^^^
+//
+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 {}
+}
+static field invalid-type A2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.transformed.expect
new file mode 100644
index 0000000..27a47ac
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.legacy.transformed.expect
@@ -0,0 +1,57 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/implicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:11:21: Warning: Method not found: 'method1'.
+//   void method2() => method1();
+//                     ^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:13:23: Warning: Getter not found: 'field'.
+//   Object method3() => field;
+//                       ^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:16:5: Warning: Setter not found: 'field'.
+//     field = o;
+//     ^^^^^
+//
+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 {}
+}
+static field invalid-type A2;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
new file mode 100644
index 0000000..ba9ea5f
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.outline.expect
@@ -0,0 +1,42 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/implicit_this.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {
+//       ^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/implicit_this.dart:10:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  field core::Object* field;
+  synthetic constructor •() → self::A1*
+    ;
+  method method1() → void
+    ;
+}
+static field invalid-type A2;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.strong.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.strong.expect
new file mode 100644
index 0000000..391f9a2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.strong.expect
@@ -0,0 +1,21 @@
+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 {}
+}
+class A2 extends core::Object {
+}
+method A2|method2(final self::A1* #this) → void
+  return #this.{self::A1::method1}();
+method A2|method3(final self::A1* #this) → core::Object*
+  return #this.{self::A1::field};
+method A2|method4(final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/implicit_this.dart.strong.transformed.expect
new file mode 100644
index 0000000..391f9a2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/implicit_this.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+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 {}
+}
+class A2 extends core::Object {
+}
+method A2|method2(final self::A1* #this) → void
+  return #this.{self::A1::method1}();
+method A2|method3(final self::A1* #this) → core::Object*
+  return #this.{self::A1::field};
+method A2|method4(final self::A1* #this, core::Object* o) → void {
+  #this.{self::A1::field} = o;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart b/pkg/front_end/testcases/extensions/instance_members.dart
new file mode 100644
index 0000000..17fa4b5
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart
@@ -0,0 +1,41 @@
+// 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.
+
+class A1 {}
+
+extension A2 on A1 {
+  A1 method1() {
+    return this;
+  }
+
+  A1 method2<T>(T o) {
+    print(o);
+    return this;
+  }
+
+  A1 method3<T>([T o]) {
+    print(o);
+    return this;
+  }
+
+  A1 method4<T>({T o}) {
+    print(o);
+    return this;
+  }
+}
+
+class B1<T> {}
+
+extension B2<T> on B1<T> {
+  B1<T> method1() {
+    return this;
+  }
+
+  B1<T> method2<S>(S o) {
+    print(o);
+    return this;
+  }
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.hierarchy.expect b/pkg/front_end/testcases/extensions/instance_members.dart.hierarchy.expect
new file mode 100644
index 0000000..41cb083
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.hierarchy.expect
@@ -0,0 +1,53 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+B1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.legacy.expect b/pkg/front_end/testcases/extensions/instance_members.dart.legacy.expect
new file mode 100644
index 0000000..b19ea83
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.legacy.expect
@@ -0,0 +1,126 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:28:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:8:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:9:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:12:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method2<T>(T o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:14:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:17:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method3<T>([T o]) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:19:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:22:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method4<T>({T o}) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:24:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:31:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:32:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:35:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method2<S>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:37:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.legacy.transformed.expect b/pkg/front_end/testcases/extensions/instance_members.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b19ea83
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.legacy.transformed.expect
@@ -0,0 +1,126 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:28:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:8:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:9:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:12:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method2<T>(T o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:14:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:17:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method3<T>([T o]) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:19:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:22:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method4<T>({T o}) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:24:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:31:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:32:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:35:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method2<S>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:37:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
new file mode 100644
index 0000000..f1182fb
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.outline.expect
@@ -0,0 +1,74 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/instance_members.dart:28:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:7:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/instance_members.dart:30:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.strong.expect b/pkg/front_end/testcases/extensions/instance_members.dart.strong.expect
new file mode 100644
index 0000000..dfedda5
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.strong.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+class B2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1(final self::A1* #this) → self::A1* {
+  return #this;
+}
+method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method A2|method3<T extends core::Object* = dynamic>(final self::A1* #this = #C1, [self::A2|method3::T* o = #C1]) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method A2|method4<T extends core::Object* = dynamic>(final self::A1* #this = #C1, {self::A2|method4::T* o = #C1}) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>* {
+  return #this;
+}
+method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(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 main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/extensions/instance_members.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/instance_members.dart.strong.transformed.expect
new file mode 100644
index 0000000..dfedda5
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/instance_members.dart.strong.transformed.expect
@@ -0,0 +1,45 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+class B2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1(final self::A1* #this) → self::A1* {
+  return #this;
+}
+method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method A2|method3<T extends core::Object* = dynamic>(final self::A1* #this = #C1, [self::A2|method3::T* o = #C1]) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method A2|method4<T extends core::Object* = dynamic>(final self::A1* #this = #C1, {self::A2|method4::T* o = #C1}) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>* {
+  return #this;
+}
+method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(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 main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart b/pkg/front_end/testcases/extensions/type_variables.dart
new file mode 100644
index 0000000..0f784b7
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart
@@ -0,0 +1,25 @@
+// 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.
+
+class A1<T> {}
+
+extension A2<T> on A1<T> {
+  A1<T> method1<S extends T>() {
+    return this;
+  }
+
+  // TODO(johnniwinther): Resolve type variable uses correctly. Currently use
+  // `T` here resolve to `A2.T` and the synthetically inserted type variable.
+  A1<T> method2<S extends A1<T>>(S o) {
+    print(o);
+    print(T);
+    print(S);
+    return this;
+  }
+}
+
+// TODO(johnniwinther): Support F-bounded extensions. Currently the type
+// variable is not recognized as a type within the bound.
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.hierarchy.expect b/pkg/front_end/testcases/extensions/type_variables.dart.hierarchy.expect
new file mode 100644
index 0000000..9ac08b3
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.hierarchy.expect
@@ -0,0 +1,36 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.legacy.expect b/pkg/front_end/testcases/extensions/type_variables.dart.legacy.expect
new file mode 100644
index 0000000..05532f2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.legacy.expect
@@ -0,0 +1,63 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Error: Expected '{' before this.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: 'A1' is already declared in this scope.
+// extension A2<T> on A1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/type_variables.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:1: Warning: Type 'extension' not found.
+// extension A2<T> on A1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Warning: Type 'on' not found.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:8:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method1<S extends T>() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:9:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:14:27: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method2<S extends A1<T>>(S o) {
+//                           ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:14:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method2<S extends A1<T>>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:18:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+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::•()
+    ;
+}
+static method A2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.legacy.transformed.expect b/pkg/front_end/testcases/extensions/type_variables.dart.legacy.transformed.expect
new file mode 100644
index 0000000..05532f2
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.legacy.transformed.expect
@@ -0,0 +1,63 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Error: Expected '{' before this.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: 'A1' is already declared in this scope.
+// extension A2<T> on A1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/type_variables.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:1: Warning: Type 'extension' not found.
+// extension A2<T> on A1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Warning: Type 'on' not found.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:8:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method1<S extends T>() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:9:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:14:27: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method2<S extends A1<T>>(S o) {
+//                           ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:14:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1<T> method2<S extends A1<T>>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:18:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+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::•()
+    ;
+}
+static method A2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
new file mode 100644
index 0000000..a6d69ea
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.outline.expect
@@ -0,0 +1,44 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Error: Expected '{' before this.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2<T> on A1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:20: Error: 'A1' is already declared in this scope.
+// extension A2<T> on A1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/type_variables.dart:5:7: Context: Previous declaration of 'A1'.
+// class A1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:1: Warning: Type 'extension' not found.
+// extension A2<T> on A1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/type_variables.dart:7:17: Warning: Type 'on' not found.
+// extension A2<T> on A1<T> {
+//                 ^^
+//
+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*>*
+    ;
+}
+static method A2<T extends core::Object* = dynamic>() → invalid-type
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.strong.expect b/pkg/front_end/testcases/extensions/type_variables.dart.strong.expect
new file mode 100644
index 0000000..26ba3ea
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.strong.expect
@@ -0,0 +1,21 @@
+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::•()
+    ;
+}
+class A2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1<#T extends core::Object* = dynamic, S extends self::A2|method1::#T = dynamic>(final self::A1<self::A2|method1::#T*>* #this) → self::A1<self::A2|method1::#T*>* {
+  return #this;
+}
+method A2|method2<#T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::#T>* = self::A1<dynamic>*>(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 main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/type_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/type_variables.dart.strong.transformed.expect
new file mode 100644
index 0000000..26ba3ea
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/type_variables.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+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::•()
+    ;
+}
+class A2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1<#T extends core::Object* = dynamic, S extends self::A2|method1::#T = dynamic>(final self::A1<self::A2|method1::#T*>* #this) → self::A1<self::A2|method1::#T*>* {
+  return #this;
+}
+method A2|method2<#T extends core::Object* = dynamic, S extends self::A1<self::A2|method2::#T>* = self::A1<dynamic>*>(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 main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart b/pkg/front_end/testcases/extensions/use_this.dart
new file mode 100644
index 0000000..6843fae
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+class A1 {}
+
+extension A2 on A1 {
+  A1 method1() {
+    return this;
+  }
+
+  A1 method2<T>(T o) {
+    print(o);
+    return this;
+  }
+}
+
+class B1<T> {}
+
+extension B2<T> on B1<T> {
+  B1<T> method1() {
+    return this;
+  }
+
+  B1<T> method2<S>(S o) {
+    print(o);
+    return this;
+  }
+}
+
+main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.hierarchy.expect b/pkg/front_end/testcases/extensions/use_this.dart.hierarchy.expect
new file mode 100644
index 0000000..41cb083
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.hierarchy.expect
@@ -0,0 +1,53 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+B1:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.legacy.expect b/pkg/front_end/testcases/extensions/use_this.dart.legacy.expect
new file mode 100644
index 0000000..f2b31be
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.legacy.expect
@@ -0,0 +1,110 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/use_this.dart:7:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/use_this.dart:20:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:10:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:11:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:14:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method2<T>(T o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:16:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:23:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:24:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:27:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method2<S>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:29:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/extensions/use_this.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f2b31be
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.legacy.transformed.expect
@@ -0,0 +1,110 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/use_this.dart:7:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/use_this.dart:20:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: 'extension' isn't a type.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:10:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:11:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:14:3: Error: Can't use 'A1' because it is declared more than once.
+//   A1 method2<T>(T o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:16:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:23:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method1() {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:24:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:27:3: Error: Can't use 'B1' because it is declared more than once.
+//   B1<T> method2<S>(S o) {
+//   ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:29:12: Error: Expected identifier, but got 'this'.
+//     return this;
+//            ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.outline.expect b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
new file mode 100644
index 0000000..9c0d4ca
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.outline.expect
@@ -0,0 +1,74 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension A2 on A1 {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:17: Error: 'A1' is already declared in this scope.
+// extension A2 on A1 {
+//                 ^^
+// pkg/front_end/testcases/extensions/use_this.dart:7:7: Context: Previous declaration of 'A1'.
+// class A1 {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:11: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//           ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Error: Expected '{' before this.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension B2<T> on B1<T> {
+//                    ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:20: Error: 'B1' is already declared in this scope.
+// extension B2<T> on B1<T> {
+//                    ^^
+// pkg/front_end/testcases/extensions/use_this.dart:20:7: Context: Previous declaration of 'B1'.
+// class B1<T> {}
+//       ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:1: Warning: Type 'extension' not found.
+// extension A2 on A1 {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:9:14: Warning: Type 'on' not found.
+// extension A2 on A1 {
+//              ^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:1: Warning: Type 'extension' not found.
+// extension B2<T> on B1<T> {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/extensions/use_this.dart:22:17: Warning: Type 'on' not found.
+// extension B2<T> on B1<T> {
+//                 ^^
+//
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    ;
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    ;
+}
+static field invalid-type A2;
+static method B2<T extends core::Object* = dynamic>() → invalid-type
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.strong.expect b/pkg/front_end/testcases/extensions/use_this.dart.strong.expect
new file mode 100644
index 0000000..b8887f9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.strong.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+class B2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1(final self::A1* #this) → self::A1* {
+  return #this;
+}
+method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>* {
+  return #this;
+}
+method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(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 main() → dynamic {}
diff --git a/pkg/front_end/testcases/extensions/use_this.dart.strong.transformed.expect b/pkg/front_end/testcases/extensions/use_this.dart.strong.transformed.expect
new file mode 100644
index 0000000..b8887f9
--- /dev/null
+++ b/pkg/front_end/testcases/extensions/use_this.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    : super core::Object::•()
+    ;
+}
+class A2 extends core::Object {
+}
+class B1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B1<self::B1::T*>*
+    : super core::Object::•()
+    ;
+}
+class B2<T extends core::Object* = dynamic> extends core::Object {
+}
+method A2|method1(final self::A1* #this) → self::A1* {
+  return #this;
+}
+method A2|method2<T extends core::Object* = dynamic>(final self::A1* #this, self::A2|method2::T* o) → self::A1* {
+  core::print(o);
+  return #this;
+}
+method B2|method1<#T extends core::Object* = dynamic>(final self::B1<self::B2|method1::#T*>* #this) → self::B1<self::B2|method1::#T*>* {
+  return #this;
+}
+method B2|method2<#T extends core::Object* = dynamic, S extends core::Object* = dynamic>(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 main() → dynamic {}
diff --git a/pkg/front_end/testcases/external.dart.legacy.expect b/pkg/front_end/testcases/external.dart.legacy.expect
deleted file mode 100644
index 12cc7b1..0000000
--- a/pkg/front_end/testcases/external.dart.legacy.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:isolate" as iso;
-
-import "dart:isolate";
-
-static field dynamic subscription;
-static method onData(dynamic x) → void {
-  core::print(x);
-  self::subscription.cancel();
-}
-static method main() → dynamic {
-  dynamic string = core::String::fromCharCode(65);
-  dynamic port = iso::ReceivePort::•();
-  self::subscription = port.listen(self::onData);
-  port.sendPort.send(string);
-}
diff --git a/pkg/front_end/testcases/external.dart.legacy.transformed.expect b/pkg/front_end/testcases/external.dart.legacy.transformed.expect
deleted file mode 100644
index 12cc7b1..0000000
--- a/pkg/front_end/testcases/external.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:isolate" as iso;
-
-import "dart:isolate";
-
-static field dynamic subscription;
-static method onData(dynamic x) → void {
-  core::print(x);
-  self::subscription.cancel();
-}
-static method main() → dynamic {
-  dynamic string = core::String::fromCharCode(65);
-  dynamic port = iso::ReceivePort::•();
-  self::subscription = port.listen(self::onData);
-  port.sendPort.send(string);
-}
diff --git a/pkg/front_end/testcases/external.dart.strong.expect b/pkg/front_end/testcases/external.dart.strong.expect
deleted file mode 100644
index 8025ecf..0000000
--- a/pkg/front_end/testcases/external.dart.strong.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:isolate" as iso;
-
-import "dart:isolate";
-
-static field dynamic subscription;
-static method onData(dynamic x) → void {
-  core::print(x);
-  self::subscription.cancel();
-}
-static method main() → dynamic {
-  core::String string = core::String::fromCharCode(65);
-  iso::ReceivePort port = iso::ReceivePort::•();
-  self::subscription = port.{iso::ReceivePort::listen}(self::onData);
-  port.{iso::ReceivePort::sendPort}.{iso::SendPort::send}(string);
-}
diff --git a/pkg/front_end/testcases/external.dart.strong.transformed.expect b/pkg/front_end/testcases/external.dart.strong.transformed.expect
deleted file mode 100644
index 8025ecf..0000000
--- a/pkg/front_end/testcases/external.dart.strong.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-import "dart:isolate" as iso;
-
-import "dart:isolate";
-
-static field dynamic subscription;
-static method onData(dynamic x) → void {
-  core::print(x);
-  self::subscription.cancel();
-}
-static method main() → dynamic {
-  core::String string = core::String::fromCharCode(65);
-  iso::ReceivePort port = iso::ReceivePort::•();
-  self::subscription = port.{iso::ReceivePort::listen}(self::onData);
-  port.{iso::ReceivePort::sendPort}.{iso::SendPort::send}(string);
-}
diff --git a/pkg/front_end/testcases/external_import.dart.legacy.expect b/pkg/front_end/testcases/external_import.dart.legacy.expect
deleted file mode 100644
index 2776224..0000000
--- a/pkg/front_end/testcases/external_import.dart.legacy.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-@dart._internal::ExternalName::•("dart-ext:here")
-@dart._internal::ExternalName::•("dart-ext:foo/../there")
-@dart._internal::ExternalName::•("dart-ext:/usr/local/somewhere")
-library;
-import self as self;
-import "dart:_internal" as _in;
-
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/external_import.dart.legacy.transformed.expect b/pkg/front_end/testcases/external_import.dart.legacy.transformed.expect
deleted file mode 100644
index 2776224..0000000
--- a/pkg/front_end/testcases/external_import.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-@dart._internal::ExternalName::•("dart-ext:here")
-@dart._internal::ExternalName::•("dart-ext:foo/../there")
-@dart._internal::ExternalName::•("dart-ext:/usr/local/somewhere")
-library;
-import self as self;
-import "dart:_internal" as _in;
-
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/external_import.dart.strong.expect b/pkg/front_end/testcases/external_import.dart.strong.expect
deleted file mode 100644
index 2776224..0000000
--- a/pkg/front_end/testcases/external_import.dart.strong.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-@dart._internal::ExternalName::•("dart-ext:here")
-@dart._internal::ExternalName::•("dart-ext:foo/../there")
-@dart._internal::ExternalName::•("dart-ext:/usr/local/somewhere")
-library;
-import self as self;
-import "dart:_internal" as _in;
-
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/external_import.dart.strong.transformed.expect b/pkg/front_end/testcases/external_import.dart.strong.transformed.expect
deleted file mode 100644
index 2776224..0000000
--- a/pkg/front_end/testcases/external_import.dart.strong.transformed.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-@dart._internal::ExternalName::•("dart-ext:here")
-@dart._internal::ExternalName::•("dart-ext:foo/../there")
-@dart._internal::ExternalName::•("dart-ext:/usr/local/somewhere")
-library;
-import self as self;
-import "dart:_internal" as _in;
-
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/fallthrough.dart.outline.expect b/pkg/front_end/testcases/fallthrough.dart.outline.expect
deleted file mode 100644
index 2e24515..0000000
--- a/pkg/front_end/testcases/fallthrough.dart.outline.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main(core::List<core::String> args) → void
-  ;
diff --git a/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect b/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect
deleted file mode 100644
index a753f8b..0000000
--- a/pkg/front_end/testcases/fallthrough.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/fallthrough.dart:9:9: Context: Write to x@254
-      x = 4;
-        ^
diff --git a/pkg/front_end/testcases/fibonacci.dart.legacy.expect b/pkg/front_end/testcases/fibonacci.dart.legacy.expect
deleted file mode 100644
index c46429a..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method fibonacci(core::int n) → core::int {
-  if(n.<(2))
-    return n;
-  return self::fibonacci(n.-(1)).+(self::fibonacci(n.-(2)));
-}
-static method main() → dynamic {
-  for (core::int i = 0; i.<(20); i = i.+(1)) {
-    core::print(self::fibonacci(i));
-  }
-}
diff --git a/pkg/front_end/testcases/fibonacci.dart.legacy.transformed.expect b/pkg/front_end/testcases/fibonacci.dart.legacy.transformed.expect
deleted file mode 100644
index c46429a..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method fibonacci(core::int n) → core::int {
-  if(n.<(2))
-    return n;
-  return self::fibonacci(n.-(1)).+(self::fibonacci(n.-(2)));
-}
-static method main() → dynamic {
-  for (core::int i = 0; i.<(20); i = i.+(1)) {
-    core::print(self::fibonacci(i));
-  }
-}
diff --git a/pkg/front_end/testcases/fibonacci.dart.outline.expect b/pkg/front_end/testcases/fibonacci.dart.outline.expect
deleted file mode 100644
index 585adbb..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.outline.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method fibonacci(core::int n) → core::int
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/fibonacci.dart.strong.expect b/pkg/front_end/testcases/fibonacci.dart.strong.expect
deleted file mode 100644
index 6b654e5..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.strong.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method fibonacci(core::int n) → core::int {
-  if(n.{core::num::<}(2))
-    return n;
-  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
-}
-static method main() → dynamic {
-  for (core::int i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
-    core::print(self::fibonacci(i));
-  }
-}
diff --git a/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect b/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect
deleted file mode 100644
index 6b654e5..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.strong.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method fibonacci(core::int n) → core::int {
-  if(n.{core::num::<}(2))
-    return n;
-  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
-}
-static method main() → dynamic {
-  for (core::int i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
-    core::print(self::fibonacci(i));
-  }
-}
diff --git a/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect b/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect
deleted file mode 100644
index 42ffb08..0000000
--- a/pkg/front_end/testcases/fibonacci.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/fibonacci.dart:11:28: Context: Write to i@332
-  for (int i = 0; i < 20; i++) {
-                           ^^
diff --git a/pkg/front_end/testcases/for_in_scope.dart.legacy.expect b/pkg/front_end/testcases/for_in_scope.dart.legacy.expect
deleted file mode 100644
index 624010c..0000000
--- a/pkg/front_end/testcases/for_in_scope.dart.legacy.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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/for_in_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/for_in_scope.dart.legacy.transformed.expect
deleted file mode 100644
index 624010c..0000000
--- a/pkg/front_end/testcases/for_in_scope.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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/for_in_scope.dart.outline.expect b/pkg/front_end/testcases/for_in_scope.dart.outline.expect
deleted file mode 100644
index 09786f2..0000000
--- a/pkg/front_end/testcases/for_in_scope.dart.outline.expect
+++ /dev/null
@@ -1,6 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main(core::List<core::String> arguments) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/for_in_scope.dart.strong.expect b/pkg/front_end/testcases/for_in_scope.dart.strong.expect
deleted file mode 100644
index 624010c..0000000
--- a/pkg/front_end/testcases/for_in_scope.dart.strong.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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/for_in_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/for_in_scope.dart.strong.transformed.expect
deleted file mode 100644
index 624010c..0000000
--- a/pkg/front_end/testcases/for_in_scope.dart.strong.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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/for_in_without_declaration.dart.legacy.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.expect
deleted file mode 100644
index 9cc7892..0000000
--- a/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.expect
+++ /dev/null
@@ -1,157 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
-//     for (super.superInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
-//     for (super.untypedSuperInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
-//     for (c.instanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
-//     for (c.untypedSuperInstanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Warning: Setter not found: 'unresolved'.
-//     for (unresolved in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
-//     for (unresolved.foo in []) {}
-//                    ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
-//     for (c.unresolved in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
-//     for (main() in []) {}
-//              ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
-//     for (var x, y in <int>[]) {
-//               ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:46:10: Warning: Setter not found: 'constant'.
-//     for (constant 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::•()
-    ;
-}
-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 dynamic #t1 in <dynamic>[]) {
-      local = #t1;
-    }
-    for (final dynamic #t2 in <dynamic>[]) {
-      untypedLocal = #t2;
-    }
-    for (final dynamic #t3 in <dynamic>[]) {
-      this.{self::C::instanceField} = #t3;
-    }
-    for (final dynamic #t4 in <dynamic>[]) {
-      this.{self::C::untypedInstanceField} = #t4;
-    }
-    for (final dynamic #t5 in <dynamic>[]) {
-      self::C::staticField = #t5;
-    }
-    for (final dynamic #t6 in <dynamic>[]) {
-      self::C::untypedStaticField = #t6;
-    }
-    for (final dynamic #t7 in <dynamic>[]) {
-      self::topLevelField = #t7;
-    }
-    for (final dynamic #t8 in <dynamic>[]) {
-      self::untypedTopLevelField = #t8;
-    }
-    for (final dynamic #t9 in <dynamic>[]) {
-      super.{self::Super::superInstanceField} = #t9;
-    }
-    for (final dynamic #t10 in <dynamic>[]) {
-      super.{self::Super::untypedSuperInstanceField} = #t10;
-    }
-    self::C c = new self::C::•();
-    for (final dynamic #t11 in <dynamic>[]) {
-      c.instanceField = #t11;
-    }
-    for (final dynamic #t12 in <dynamic>[]) {
-      c.untypedSuperInstanceField = #t12;
-    }
-    for (final dynamic #t13 in <dynamic>[]) {
-      this.unresolved = #t13;
-    }
-    for (final dynamic #t14 in <dynamic>[]) {
-      this.unresolved.foo = #t14;
-    }
-    for (final dynamic #t15 in <dynamic>[]) {
-      c.unresolved = #t15;
-    }
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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 dynamic #t17 in <core::int>[]) {
-        invalid-expression "pkg/front_end/testcases/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);
-      }
-    }
-    const core::int constant = 0;
-    for (final dynamic #t18 in <dynamic>[]) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#constant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t18]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    }
-  }
-}
-static field core::bool topLevelField;
-static field dynamic untypedTopLevelField;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
deleted file mode 100644
index 9cc7892..0000000
--- a/pkg/front_end/testcases/for_in_without_declaration.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,157 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
-//     for (super.superInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
-//     for (super.untypedSuperInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
-//     for (c.instanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
-//     for (c.untypedSuperInstanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Warning: Setter not found: 'unresolved'.
-//     for (unresolved in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
-//     for (unresolved.foo in []) {}
-//                    ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
-//     for (c.unresolved in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
-//     for (main() in []) {}
-//              ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
-//     for (var x, y in <int>[]) {
-//               ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:46:10: Warning: Setter not found: 'constant'.
-//     for (constant 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::•()
-    ;
-}
-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 dynamic #t1 in <dynamic>[]) {
-      local = #t1;
-    }
-    for (final dynamic #t2 in <dynamic>[]) {
-      untypedLocal = #t2;
-    }
-    for (final dynamic #t3 in <dynamic>[]) {
-      this.{self::C::instanceField} = #t3;
-    }
-    for (final dynamic #t4 in <dynamic>[]) {
-      this.{self::C::untypedInstanceField} = #t4;
-    }
-    for (final dynamic #t5 in <dynamic>[]) {
-      self::C::staticField = #t5;
-    }
-    for (final dynamic #t6 in <dynamic>[]) {
-      self::C::untypedStaticField = #t6;
-    }
-    for (final dynamic #t7 in <dynamic>[]) {
-      self::topLevelField = #t7;
-    }
-    for (final dynamic #t8 in <dynamic>[]) {
-      self::untypedTopLevelField = #t8;
-    }
-    for (final dynamic #t9 in <dynamic>[]) {
-      super.{self::Super::superInstanceField} = #t9;
-    }
-    for (final dynamic #t10 in <dynamic>[]) {
-      super.{self::Super::untypedSuperInstanceField} = #t10;
-    }
-    self::C c = new self::C::•();
-    for (final dynamic #t11 in <dynamic>[]) {
-      c.instanceField = #t11;
-    }
-    for (final dynamic #t12 in <dynamic>[]) {
-      c.untypedSuperInstanceField = #t12;
-    }
-    for (final dynamic #t13 in <dynamic>[]) {
-      this.unresolved = #t13;
-    }
-    for (final dynamic #t14 in <dynamic>[]) {
-      this.unresolved.foo = #t14;
-    }
-    for (final dynamic #t15 in <dynamic>[]) {
-      c.unresolved = #t15;
-    }
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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 dynamic #t17 in <core::int>[]) {
-        invalid-expression "pkg/front_end/testcases/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);
-      }
-    }
-    const core::int constant = 0;
-    for (final dynamic #t18 in <dynamic>[]) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#constant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t18]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    }
-  }
-}
-static field core::bool topLevelField;
-static field dynamic untypedTopLevelField;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect
deleted file mode 100644
index c168ef6..0000000
--- a/pkg/front_end/testcases/for_in_without_declaration.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  field core::int superInstanceField;
-  field dynamic untypedSuperInstanceField;
-  synthetic constructor •() → self::Super
-    ;
-}
-class C extends self::Super {
-  field core::int instanceField;
-  field dynamic untypedInstanceField;
-  static field core::double staticField;
-  static field dynamic untypedStaticField;
-  synthetic constructor •() → self::C
-    ;
-  method m() → dynamic
-    ;
-}
-static field core::bool topLevelField;
-static field dynamic untypedTopLevelField;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect
deleted file mode 100644
index 9e758ec..0000000
--- a/pkg/front_end/testcases/for_in_without_declaration.dart.strong.expect
+++ /dev/null
@@ -1,189 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
-//     for (super.superInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
-//     for (super.untypedSuperInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
-//     for (c.instanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
-//     for (c.untypedSuperInstanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: Setter not found: 'unresolved'.
-//     for (unresolved in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
-//     for (unresolved.foo in []) {}
-//                    ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
-//     for (c.unresolved in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
-//     for (main() in []) {}
-//              ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
-//     for (var x, y in <int>[]) {
-//               ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
-//     for (constant in []) {}
-//          ^^^^^^^^
-//
-// pkg/front_end/testcases/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/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/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
-//     for (unresolved.foo in []) {}
-//                     ^^^
-//
-// pkg/front_end/testcases/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/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::•()
-    ;
-}
-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/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/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/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
-    for (unresolved.foo in []) {}
-                    ^^^";
-    }
-    for (final dynamic #t15 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/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/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);
-      }
-    }
-    const core::int constant = 0;
-    for (final dynamic #t18 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
-    for (constant in []) {}
-         ^^^^^^^^";
-    }
-  }
-}
-static field core::bool topLevelField;
-static field dynamic untypedTopLevelField;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect
deleted file mode 100644
index 9e758ec..0000000
--- a/pkg/front_end/testcases/for_in_without_declaration.dart.strong.transformed.expect
+++ /dev/null
@@ -1,189 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
-//     for (super.superInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got 'super'.
-//     for (super.untypedSuperInstanceField in []) {}
-//          ^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:35:11: Error: Unexpected token '.'.
-//     for (c.instanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:36:11: Error: Unexpected token '.'.
-//     for (c.untypedSuperInstanceField in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:37:10: Error: Setter not found: 'unresolved'.
-//     for (unresolved in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
-//     for (unresolved.foo in []) {}
-//          ^^^^^^^^^^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:38:20: Error: Unexpected token '.'.
-//     for (unresolved.foo in []) {}
-//                    ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:39:11: Error: Unexpected token '.'.
-//     for (c.unresolved in []) {}
-//           ^
-//
-// pkg/front_end/testcases/for_in_without_declaration.dart:40:14: Error: Unexpected token '('.
-//     for (main() in []) {}
-//              ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:41:15: Error: Unexpected token ','.
-//     for (var x, y in <int>[]) {
-//               ^
-//
-// pkg/front_end/testcases/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/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
-//     for (constant in []) {}
-//          ^^^^^^^^
-//
-// pkg/front_end/testcases/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/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/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
-// Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
-//     for (unresolved.foo in []) {}
-//                     ^^^
-//
-// pkg/front_end/testcases/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/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::•()
-    ;
-}
-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/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/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/for_in_without_declaration.dart:38:21: Error: The setter 'foo' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/for_in_without_declaration.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'foo'.
-    for (unresolved.foo in []) {}
-                    ^^^";
-    }
-    for (final dynamic #t15 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/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/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);
-      }
-    }
-    const core::int constant = 0;
-    for (final dynamic #t18 in <dynamic>[]) {
-      invalid-expression "pkg/front_end/testcases/for_in_without_declaration.dart:46:10: Error: Setter not found: 'constant'.
-    for (constant in []) {}
-         ^^^^^^^^";
-    }
-  }
-}
-static field core::bool topLevelField;
-static field dynamic untypedTopLevelField;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart b/pkg/front_end/testcases/forwarding_stub_for_operator.dart
deleted file mode 100644
index e604fe0..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart
+++ /dev/null
@@ -1,29 +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.
-
-//------------------------------------------------------------------------------
-
-class A {
-  dynamic operator+(covariant int a) => null;
-}
-
-class B {
-  dynamic operator+(dynamic b) => null;
-}
-
-abstract class C implements A, B {}
-
-//------------------------------------------------------------------------------
-
-class D {
-  dynamic operator+(dynamic d) => null;
-}
-
-class E extends D {
-  dynamic operator+(covariant int e);
-}
-
-//------------------------------------------------------------------------------
-
-main() {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.expect b/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.expect
deleted file mode 100644
index 84a1b42..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(covariant core::int a) → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator +(dynamic b) → dynamic
-    return null;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-  operator +(dynamic d) → dynamic
-    return null;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  forwarding-stub forwarding-semi-stub operator +(covariant core::int e) → dynamic
-    return super.{self::D::+}(e);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.transformed.expect b/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.transformed.expect
deleted file mode 100644
index 84a1b42..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(covariant core::int a) → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator +(dynamic b) → dynamic
-    return null;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-  operator +(dynamic d) → dynamic
-    return null;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  forwarding-stub forwarding-semi-stub operator +(covariant core::int e) → dynamic
-    return super.{self::D::+}(e);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.outline.expect b/pkg/front_end/testcases/forwarding_stub_for_operator.dart.outline.expect
deleted file mode 100644
index 14a8eef..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.outline.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  operator +(covariant core::int a) → dynamic
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  operator +(dynamic b) → dynamic
-    ;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    ;
-  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    ;
-  operator +(dynamic d) → dynamic
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    ;
-  forwarding-stub forwarding-semi-stub operator +(covariant core::int e) → dynamic
-    return super.{self::D::+}(e);
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.expect b/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.expect
deleted file mode 100644
index 84a1b42..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(covariant core::int a) → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator +(dynamic b) → dynamic
-    return null;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-  operator +(dynamic d) → dynamic
-    return null;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  forwarding-stub forwarding-semi-stub operator +(covariant core::int e) → dynamic
-    return super.{self::D::+}(e);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.transformed.expect b/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.transformed.expect
deleted file mode 100644
index 84a1b42..0000000
--- a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.strong.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator +(covariant core::int a) → dynamic
-    return null;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator +(dynamic b) → dynamic
-    return null;
-}
-abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-  operator +(dynamic d) → dynamic
-    return null;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  forwarding-stub forwarding-semi-stub operator +(covariant core::int e) → dynamic
-    return super.{self::D::+}(e);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_in_field.dart.strong.expect b/pkg/front_end/testcases/function_in_field.dart.strong.expect
deleted file mode 100644
index 4cbb448..0000000
--- a/pkg/front_end/testcases/function_in_field.dart.strong.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-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.call());
-}
diff --git a/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect
deleted file mode 100644
index 4cbb448..0000000
--- a/pkg/front_end/testcases/function_in_field.dart.strong.transformed.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-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.call());
-}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect b/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect
deleted file mode 100644
index fa72575..0000000
--- a/pkg/front_end/testcases/function_type_assignments.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static field core::String x = self::identity;
-static field core::String y = self::identityObject;
-static field core::String z = self::identityList;
-static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
-  return t;
-static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
-  return t;
-static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
-  return t;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect b/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect
deleted file mode 100644
index fa72575..0000000
--- a/pkg/front_end/testcases/function_type_assignments.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static field core::String x = self::identity;
-static field core::String y = self::identityObject;
-static field core::String z = self::identityList;
-static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
-  return t;
-static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
-  return t;
-static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
-  return t;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.outline.expect b/pkg/front_end/testcases/function_type_assignments.dart.outline.expect
deleted file mode 100644
index deb3a40..0000000
--- a/pkg/front_end/testcases/function_type_assignments.dart.outline.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static field core::String x;
-static field core::String y;
-static field core::String z;
-static method identity<T extends core::Object = dynamic>(self::identity::T t) → self::identity::T
-  ;
-static method identityObject<T extends core::Object = dynamic>(self::identityObject::T t) → self::identityObject::T
-  ;
-static method identityList<T extends core::List<self::identityList::T> = dynamic>(self::identityList::T t) → self::identityList::T
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.strong.expect b/pkg/front_end/testcases/function_type_assignments.dart.strong.expect
deleted file mode 100644
index 47dadba..0000000
--- a/pkg/front_end/testcases/function_type_assignments.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String x = identity; // No bound
-//            ^
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String y = identityObject; // Object bound
-//            ^
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String z = identityList; // List<T> bound
-//            ^
-//
-import self as self;
-import "dart:core" as core;
-
-static field core::String x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String x = identity; // No bound
-           ^" in self::identity as{TypeError} core::String;
-static field core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String y = identityObject; // Object bound
-           ^" in self::identityObject as{TypeError} core::String;
-static field core::String z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String z = identityList; // List<T> bound
-           ^" in self::identityList 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 = 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 {}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect
deleted file mode 100644
index 47dadba..0000000
--- a/pkg/front_end/testcases/function_type_assignments.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String x = identity; // No bound
-//            ^
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String y = identityObject; // Object bound
-//            ^
-//
-// pkg/front_end/testcases/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'.
-// Try changing the type of the left hand side, or casting the right hand side to 'String'.
-// String z = identityList; // List<T> bound
-//            ^
-//
-import self as self;
-import "dart:core" as core;
-
-static field core::String x = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String x = identity; // No bound
-           ^" in self::identity as{TypeError} core::String;
-static field core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String y = identityObject; // Object bound
-           ^" in self::identityObject as{TypeError} core::String;
-static field core::String z = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-String z = identityList; // List<T> bound
-           ^" in self::identityList 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 = 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 {}
diff --git a/pkg/front_end/testcases/function_type_default_value.dart.legacy.expect b/pkg/front_end/testcases/function_type_default_value.dart.legacy.expect
deleted file mode 100644
index 5a6a508..0000000
--- a/pkg/front_end/testcases/function_type_default_value.dart.legacy.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
-// void Function({obj: Object}) x;
-//                   ^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart:5:16: Warning: Type 'obj' not found.
-// void Function({obj: Object}) x;
-//                ^^^
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:16: Warning: '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/function_type_default_value.dart.legacy.transformed.expect b/pkg/front_end/testcases/function_type_default_value.dart.legacy.transformed.expect
deleted file mode 100644
index 5a6a508..0000000
--- a/pkg/front_end/testcases/function_type_default_value.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
-// void Function({obj: Object}) x;
-//                   ^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart:5:16: Warning: Type 'obj' not found.
-// void Function({obj: Object}) x;
-//                ^^^
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:16: Warning: '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/function_type_default_value.dart.outline.expect b/pkg/front_end/testcases/function_type_default_value.dart.outline.expect
deleted file mode 100644
index bff8898..0000000
--- a/pkg/front_end/testcases/function_type_default_value.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
-// void Function({obj: Object}) x;
-//                   ^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart:5:16: Warning: Type 'obj' not found.
-// void Function({obj: Object}) x;
-//                ^^^
-//
-import self as self;
-
-static field () → void x;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/function_type_default_value.dart.strong.expect b/pkg/front_end/testcases/function_type_default_value.dart.strong.expect
deleted file mode 100644
index 6f1c9a9..0000000
--- a/pkg/front_end/testcases/function_type_default_value.dart.strong.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
-// void Function({obj: Object}) x;
-//                   ^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart:5:16: Error: Type 'obj' not found.
-// void Function({obj: Object}) x;
-//                ^^^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_default_value.dart.strong.transformed.expect
deleted file mode 100644
index 6f1c9a9..0000000
--- a/pkg/front_end/testcases/function_type_default_value.dart.strong.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
-// void Function({obj: Object}) x;
-//                   ^
-//
-// pkg/front_end/testcases/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/function_type_default_value.dart:5:16: Error: Type 'obj' not found.
-// void Function({obj: Object}) x;
-//                ^^^
-//
-// pkg/front_end/testcases/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/function_type_is_check.dart.hierarchy.expect b/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect
deleted file mode 100644
index 8dc6d36..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.hierarchy.expect
+++ /dev/null
@@ -1,400 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.legacy.expect b/pkg/front_end/testcases/function_type_is_check.dart.legacy.expect
deleted file mode 100644
index f34e7d0..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.legacy.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-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 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(() → dynamic => null).+(self::test((core::Object o) → dynamic => null)).+(self::test((core::Object o, core::StackTrace t) → dynamic => null)));
-}
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/function_type_is_check.dart.legacy.transformed.expect
deleted file mode 100644
index f34e7d0..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-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 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(() → dynamic => null).+(self::test((core::Object o) → dynamic => null)).+(self::test((core::Object o, core::StackTrace t) → dynamic => null)));
-}
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.strong.expect b/pkg/front_end/testcases/function_type_is_check.dart.strong.expect
deleted file mode 100644
index 5fa7a1a..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.strong.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-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 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(() → core::Null => null).+(self::test((core::Object o) → core::Null => null)).+(self::test((core::Object o, core::StackTrace t) → core::Null => null)));
-}
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_is_check.dart.strong.transformed.expect
deleted file mode 100644
index 5fa7a1a..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.strong.transformed.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-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 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(() → core::Null => null).+(self::test((core::Object o) → core::Null => null)).+(self::test((core::Object o, core::StackTrace t) → core::Null => null)));
-}
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect
deleted file mode 100644
index 9ad971a..0000000
--- a/pkg/front_end/testcases/function_type_is_check.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/function_type_is_check.dart:8:9: Context: Possible promotion of f@272
-  if (f is void Function(Object, StackTrace)) return 1;
-        ^^
-pkg/front_end/testcases/function_type_is_check.dart:9:9: Context: Possible promotion of f@272
-  if (f is void Function(Object)) return 10;
-        ^^
-pkg/front_end/testcases/function_type_is_check.dart:10:9: Context: Possible promotion of f@272
-  if (f is void Function()) return 100;
-        ^^
diff --git a/pkg/front_end/testcases/function_type_recovery.dart.outline.expect b/pkg/front_end/testcases/function_type_recovery.dart.outline.expect
deleted file mode 100644
index ec474f1..0000000
--- a/pkg/front_end/testcases/function_type_recovery.dart.outline.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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));
-//                               ^
-//
-import self as self;
-import "dart:core" as core;
-
-typedef F = ((core::String) → core::int) → core::int;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/function_type_recovery.dart.strong.expect b/pkg/front_end/testcases/function_type_recovery.dart.strong.expect
deleted file mode 100644
index 4d646a1..0000000
--- a/pkg/front_end/testcases/function_type_recovery.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/function_type_recovery.dart.strong.transformed.expect b/pkg/front_end/testcases/function_type_recovery.dart.strong.transformed.expect
deleted file mode 100644
index 4d646a1..0000000
--- a/pkg/front_end/testcases/function_type_recovery.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/functions.dart.legacy.expect b/pkg/front_end/testcases/functions.dart.legacy.expect
deleted file mode 100644
index a816760..0000000
--- a/pkg/front_end/testcases/functions.dart.legacy.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function local(({a: dynamic}) → void f) → void {
-    f.call(a: "Hello, World");
-    f.call();
-  }
-  local.call(({dynamic a = "Default greeting!"}) → dynamic {
-    core::print(a);
-  });
-}
diff --git a/pkg/front_end/testcases/functions.dart.legacy.transformed.expect b/pkg/front_end/testcases/functions.dart.legacy.transformed.expect
deleted file mode 100644
index a816760..0000000
--- a/pkg/front_end/testcases/functions.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function local(({a: dynamic}) → void f) → void {
-    f.call(a: "Hello, World");
-    f.call();
-  }
-  local.call(({dynamic a = "Default greeting!"}) → dynamic {
-    core::print(a);
-  });
-}
diff --git a/pkg/front_end/testcases/functions.dart.strong.expect b/pkg/front_end/testcases/functions.dart.strong.expect
deleted file mode 100644
index 500ef71..0000000
--- a/pkg/front_end/testcases/functions.dart.strong.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function local(({a: dynamic}) → void f) → void {
-    f.call(a: "Hello, World");
-    f.call();
-  }
-  local.call(({dynamic a = "Default greeting!"}) → core::Null {
-    core::print(a);
-  });
-}
diff --git a/pkg/front_end/testcases/functions.dart.strong.transformed.expect b/pkg/front_end/testcases/functions.dart.strong.transformed.expect
deleted file mode 100644
index 500ef71..0000000
--- a/pkg/front_end/testcases/functions.dart.strong.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  function local(({a: dynamic}) → void f) → void {
-    f.call(a: "Hello, World");
-    f.call();
-  }
-  local.call(({dynamic a = "Default greeting!"}) → core::Null {
-    core::print(a);
-  });
-}
diff --git a/pkg/front_end/testcases/future_or_test.dart.legacy.expect b/pkg/front_end/testcases/future_or_test.dart.legacy.expect
deleted file mode 100644
index 4845918..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.legacy.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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;
-}
-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}.foo();
-}
-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}.bar();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect
deleted file mode 100644
index 05de994..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-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;
-}
-class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          :return_value = this.{self::B::a}.foo();
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.start(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          :return_value = this.{self::C::b}.bar();
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.start(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.outline.expect b/pkg/front_end/testcases/future_or_test.dart.outline.expect
deleted file mode 100644
index b603181..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-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
-    ;
-  method foo() → dynamic
-    ;
-}
-class B extends core::Object {
-  field self::A a;
-  synthetic constructor •() → self::B
-    ;
-  method bar() → asy::Future<dynamic>
-    ;
-}
-class C extends core::Object {
-  field self::B b;
-  synthetic constructor •() → self::C
-    ;
-  method baz() → asy::Future<core::int>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.expect b/pkg/front_end/testcases/future_or_test.dart.strong.expect
deleted file mode 100644
index f0d3199..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.strong.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-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;
-}
-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::foo}();
-}
-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::bar}() as{TypeError} asy::FutureOr<core::int>;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
deleted file mode 100644
index 4df4a38..0000000
--- a/pkg/front_end/testcases/future_or_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-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;
-}
-class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  method bar() → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L1:
-        {
-          :return_value = this.{self::B::a}.{self::A::foo}();
-          break #L1;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.start(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
-    dynamic :async_stack_trace;
-    dynamic :async_op_then;
-    dynamic :async_op_error;
-    dynamic :await_jump_var = 0;
-    dynamic :await_ctx_var;
-    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-      try {
-        #L2:
-        {
-          :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} asy::FutureOr<core::int>;
-          break #L2;
-        }
-        asy::_completeOnAsyncReturn(:async_completer, :return_value);
-        return;
-      }
-      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-      }
-    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :async_completer.start(:async_op);
-    return :async_completer.{asy::Completer::future};
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart b/pkg/front_end/testcases/general/DeltaBlue.dart
new file mode 100644
index 0000000..fc36961
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart
@@ -0,0 +1,705 @@
+// Copyright 2011 Google Inc. All Rights Reserved.
+// Copyright 1996 John Maloney and Mario Wolczko
+//
+// This file is part of GNU Smalltalk.
+//
+// GNU Smalltalk is free software; you can redistribute it and/or modify it
+// under the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2, or (at your option) any later version.
+//
+// GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+// FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
+// details.
+//
+// You should have received a copy of the GNU General Public License along with
+// GNU Smalltalk; see the file COPYING.  If not, write to the Free Software
+// Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+//
+// Translated first from Smalltalk to JavaScript, and finally to
+// Dart by Google 2008-2010.
+
+/**
+ * A Dart implementation of the DeltaBlue constraint-solving
+ * algorithm, as described in:
+ *
+ * "The DeltaBlue Algorithm: An Incremental Constraint Hierarchy Solver"
+ *   Bjorn N. Freeman-Benson and John Maloney
+ *   January 1990 Communications of the ACM,
+ *   also available as University of Washington TR 89-08-06.
+ *
+ * Beware: this benchmark is written in a grotesque style where
+ * the constraint model is built by side-effects from constructors.
+ * I've kept it this way to avoid deviating too much from the original
+ * implementation.
+ */
+
+main() {
+  new DeltaBlue().run();
+}
+
+/// Benchmark class required to report results.
+class DeltaBlue {
+  void run() {
+    chainTest(100);
+    projectionTest(100);
+  }
+}
+
+/**
+ * Strengths are used to measure the relative importance of constraints.
+ * New strengths may be inserted in the strength hierarchy without
+ * disrupting current constraints.  Strengths cannot be created outside
+ * this class, so == can be used for value comparison.
+ */
+class Strength {
+  final int value;
+  final String name;
+
+  const Strength(this.value, this.name);
+
+  Strength nextWeaker() => const <Strength>[
+        STRONG_PREFERRED,
+        PREFERRED,
+        STRONG_DEFAULT,
+        NORMAL,
+        WEAK_DEFAULT,
+        WEAKEST
+      ][value];
+
+  static bool stronger(Strength s1, Strength s2) {
+    return s1.value < s2.value;
+  }
+
+  static bool weaker(Strength s1, Strength s2) {
+    return s1.value > s2.value;
+  }
+
+  static Strength weakest(Strength s1, Strength s2) {
+    return weaker(s1, s2) ? s1 : s2;
+  }
+
+  static Strength strongest(Strength s1, Strength s2) {
+    return stronger(s1, s2) ? s1 : s2;
+  }
+}
+
+// Compile time computed constants.
+const REQUIRED = const Strength(0, "required");
+const STRONG_PREFERRED = const Strength(1, "strongPreferred");
+const PREFERRED = const Strength(2, "preferred");
+const STRONG_DEFAULT = const Strength(3, "strongDefault");
+const NORMAL = const Strength(4, "normal");
+const WEAK_DEFAULT = const Strength(5, "weakDefault");
+const WEAKEST = const Strength(6, "weakest");
+
+abstract class Constraint {
+  final Strength strength;
+
+  const Constraint(this.strength);
+
+  bool isSatisfied();
+  void markUnsatisfied();
+  void addToGraph();
+  void removeFromGraph();
+  void chooseMethod(int mark);
+  void markInputs(int mark);
+  bool inputsKnown(int mark);
+  Variable output();
+  void execute();
+  void recalculate();
+
+  /// Activate this constraint and attempt to satisfy it.
+  void addConstraint() {
+    addToGraph();
+    planner.incrementalAdd(this);
+  }
+
+  /**
+   * Attempt to find a way to enforce this constraint. If successful,
+   * record the solution, perhaps modifying the current dataflow
+   * graph. Answer the constraint that this constraint overrides, if
+   * there is one, or nil, if there isn't.
+   * Assume: I am not already satisfied.
+   */
+  Constraint satisfy(mark) {
+    chooseMethod(mark);
+    if (!isSatisfied()) {
+      if (strength == REQUIRED) {
+        print("Could not satisfy a required constraint!");
+      }
+      return null;
+    }
+    markInputs(mark);
+    Variable out = output();
+    Constraint overridden = out.determinedBy;
+    if (overridden != null) overridden.markUnsatisfied();
+    out.determinedBy = this;
+    if (!planner.addPropagate(this, mark)) print("Cycle encountered");
+    out.mark = mark;
+    return overridden;
+  }
+
+  void destroyConstraint() {
+    if (isSatisfied()) planner.incrementalRemove(this);
+    removeFromGraph();
+  }
+
+  /**
+   * Normal constraints are not input constraints.  An input constraint
+   * is one that depends on external state, such as the mouse, the
+   * keyboard, a clock, or some arbitrary piece of imperative code.
+   */
+  bool isInput() => false;
+}
+
+/**
+ * Abstract superclass for constraints having a single possible output variable.
+ */
+abstract class UnaryConstraint extends Constraint {
+  final Variable myOutput;
+  bool satisfied = false;
+
+  UnaryConstraint(this.myOutput, Strength strength) : super(strength) {
+    addConstraint();
+  }
+
+  /// Adds this constraint to the constraint graph
+  void addToGraph() {
+    myOutput.addConstraint(this);
+    satisfied = false;
+  }
+
+  /// Decides if this constraint can be satisfied and records that decision.
+  void chooseMethod(int mark) {
+    satisfied = (myOutput.mark != mark) &&
+        Strength.stronger(strength, myOutput.walkStrength);
+  }
+
+  /// Returns true if this constraint is satisfied in the current solution.
+  bool isSatisfied() => satisfied;
+
+  void markInputs(int mark) {
+    // has no inputs.
+  }
+
+  /// Returns the current output variable.
+  Variable output() => myOutput;
+
+  /**
+   * Calculate the walkabout strength, the stay flag, and, if it is
+   * 'stay', the value for the current output of this constraint. Assume
+   * this constraint is satisfied.
+   */
+  void recalculate() {
+    myOutput.walkStrength = strength;
+    myOutput.stay = !isInput();
+    if (myOutput.stay) execute(); // Stay optimization.
+  }
+
+  /// Records that this constraint is unsatisfied.
+  void markUnsatisfied() {
+    satisfied = false;
+  }
+
+  bool inputsKnown(int mark) => true;
+
+  void removeFromGraph() {
+    if (myOutput != null) myOutput.removeConstraint(this);
+    satisfied = false;
+  }
+}
+
+/**
+ * Variables that should, with some level of preference, stay the same.
+ * Planners may exploit the fact that instances, if satisfied, will not
+ * change their output during plan execution.  This is called "stay
+ * optimization".
+ */
+class StayConstraint extends UnaryConstraint {
+  StayConstraint(Variable v, Strength str) : super(v, str);
+
+  void execute() {
+    // Stay constraints do nothing.
+  }
+}
+
+/**
+ * A unary input constraint used to mark a variable that the client
+ * wishes to change.
+ */
+class EditConstraint extends UnaryConstraint {
+  EditConstraint(Variable v, Strength str) : super(v, str);
+
+  /// Edits indicate that a variable is to be changed by imperative code.
+  bool isInput() => true;
+
+  void execute() {
+    // Edit constraints do nothing.
+  }
+}
+
+// Directions.
+const int NONE = 1;
+const int FORWARD = 2;
+const int BACKWARD = 0;
+
+/**
+ * Abstract superclass for constraints having two possible output
+ * variables.
+ */
+abstract class BinaryConstraint extends Constraint {
+  Variable v1;
+  Variable v2;
+  int direction = NONE;
+
+  BinaryConstraint(this.v1, this.v2, Strength strength) : super(strength) {
+    addConstraint();
+  }
+
+  /**
+   * Decides if this constraint can be satisfied and which way it
+   * should flow based on the relative strength of the variables related,
+   * and record that decision.
+   */
+  void chooseMethod(int mark) {
+    if (v1.mark == mark) {
+      direction =
+          (v2.mark != mark && Strength.stronger(strength, v2.walkStrength))
+              ? FORWARD
+              : NONE;
+    }
+    if (v2.mark == mark) {
+      direction =
+          (v1.mark != mark && Strength.stronger(strength, v1.walkStrength))
+              ? BACKWARD
+              : NONE;
+    }
+    if (Strength.weaker(v1.walkStrength, v2.walkStrength)) {
+      direction =
+          Strength.stronger(strength, v1.walkStrength) ? BACKWARD : NONE;
+    } else {
+      direction =
+          Strength.stronger(strength, v2.walkStrength) ? FORWARD : BACKWARD;
+    }
+  }
+
+  /// Add this constraint to the constraint graph.
+  void addToGraph() {
+    v1.addConstraint(this);
+    v2.addConstraint(this);
+    direction = NONE;
+  }
+
+  /// Answer true if this constraint is satisfied in the current solution.
+  bool isSatisfied() => direction != NONE;
+
+  /// Mark the input variable with the given mark.
+  void markInputs(int mark) {
+    input().mark = mark;
+  }
+
+  /// Returns the current input variable
+  Variable input() => direction == FORWARD ? v1 : v2;
+
+  /// Returns the current output variable.
+  Variable output() => direction == FORWARD ? v2 : v1;
+
+  /**
+   * Calculate the walkabout strength, the stay flag, and, if it is
+   * 'stay', the value for the current output of this
+   * constraint. Assume this constraint is satisfied.
+   */
+  void recalculate() {
+    Variable ihn = input(), out = output();
+    out.walkStrength = Strength.weakest(strength, ihn.walkStrength);
+    out.stay = ihn.stay;
+    if (out.stay) execute();
+  }
+
+  /// Record the fact that this constraint is unsatisfied.
+  void markUnsatisfied() {
+    direction = NONE;
+  }
+
+  bool inputsKnown(int mark) {
+    Variable i = input();
+    return i.mark == mark || i.stay || i.determinedBy == null;
+  }
+
+  void removeFromGraph() {
+    if (v1 != null) v1.removeConstraint(this);
+    if (v2 != null) v2.removeConstraint(this);
+    direction = NONE;
+  }
+}
+
+/**
+ * Relates two variables by the linear scaling relationship: "v2 =
+ * (v1 * scale) + offset". Either v1 or v2 may be changed to maintain
+ * this relationship but the scale factor and offset are considered
+ * read-only.
+ */
+
+class ScaleConstraint extends BinaryConstraint {
+  final Variable scale;
+  final Variable offset;
+
+  ScaleConstraint(
+      Variable src, this.scale, this.offset, Variable dest, Strength strength)
+      : super(src, dest, strength);
+
+  /// Adds this constraint to the constraint graph.
+  void addToGraph() {
+    super.addToGraph();
+    scale.addConstraint(this);
+    offset.addConstraint(this);
+  }
+
+  void removeFromGraph() {
+    super.removeFromGraph();
+    if (scale != null) scale.removeConstraint(this);
+    if (offset != null) offset.removeConstraint(this);
+  }
+
+  void markInputs(int mark) {
+    super.markInputs(mark);
+    scale.mark = offset.mark = mark;
+  }
+
+  /// Enforce this constraint. Assume that it is satisfied.
+  void execute() {
+    if (direction == FORWARD) {
+      v2.value = v1.value * scale.value + offset.value;
+    } else {
+      v1.value = (v2.value - offset.value) ~/ scale.value;
+    }
+  }
+
+  /**
+   * Calculate the walkabout strength, the stay flag, and, if it is
+   * 'stay', the value for the current output of this constraint. Assume
+   * this constraint is satisfied.
+   */
+  void recalculate() {
+    Variable ihn = input(), out = output();
+    out.walkStrength = Strength.weakest(strength, ihn.walkStrength);
+    out.stay = ihn.stay && scale.stay && offset.stay;
+    if (out.stay) execute();
+  }
+}
+
+/**
+ * Constrains two variables to have the same value.
+ */
+class EqualityConstraint extends BinaryConstraint {
+  EqualityConstraint(Variable v1, Variable v2, Strength strength)
+      : super(v1, v2, strength);
+
+  /// Enforce this constraint. Assume that it is satisfied.
+  void execute() {
+    output().value = input().value;
+  }
+}
+
+/**
+ * A constrained variable. In addition to its value, it maintain the
+ * structure of the constraint graph, the current dataflow graph, and
+ * various parameters of interest to the DeltaBlue incremental
+ * constraint solver.
+ **/
+class Variable {
+  List<Constraint> constraints = <Constraint>[];
+  Constraint determinedBy;
+  int mark = 0;
+  Strength walkStrength = WEAKEST;
+  bool stay = true;
+  int value;
+  final String name;
+
+  Variable(this.name, this.value);
+
+  /**
+   * Add the given constraint to the set of all constraints that refer
+   * this variable.
+   */
+  void addConstraint(Constraint c) {
+    constraints.add(c);
+  }
+
+  /// Removes all traces of c from this variable.
+  void removeConstraint(Constraint c) {
+    constraints.remove(c);
+    if (determinedBy == c) determinedBy = null;
+  }
+}
+
+class Planner {
+  int currentMark = 0;
+
+  /**
+   * Attempt to satisfy the given constraint and, if successful,
+   * incrementally update the dataflow graph.  Details: If satisfying
+   * the constraint is successful, it may override a weaker constraint
+   * on its output. The algorithm attempts to resatisfy that
+   * constraint using some other method. This process is repeated
+   * until either a) it reaches a variable that was not previously
+   * determined by any constraint or b) it reaches a constraint that
+   * is too weak to be satisfied using any of its methods. The
+   * variables of constraints that have been processed are marked with
+   * a unique mark value so that we know where we've been. This allows
+   * the algorithm to avoid getting into an infinite loop even if the
+   * constraint graph has an inadvertent cycle.
+   */
+  void incrementalAdd(Constraint c) {
+    int mark = newMark();
+    for (Constraint overridden = c.satisfy(mark);
+        overridden != null;
+        overridden = overridden.satisfy(mark));
+  }
+
+  /**
+   * Entry point for retracting a constraint. Remove the given
+   * constraint and incrementally update the dataflow graph.
+   * Details: Retracting the given constraint may allow some currently
+   * unsatisfiable downstream constraint to be satisfied. We therefore collect
+   * a list of unsatisfied downstream constraints and attempt to
+   * satisfy each one in turn. This list is traversed by constraint
+   * strength, strongest first, as a heuristic for avoiding
+   * unnecessarily adding and then overriding weak constraints.
+   * Assume: [c] is satisfied.
+   */
+  void incrementalRemove(Constraint c) {
+    Variable out = c.output();
+    c.markUnsatisfied();
+    c.removeFromGraph();
+    List<Constraint> unsatisfied = removePropagateFrom(out);
+    Strength strength = REQUIRED;
+    do {
+      for (int i = 0; i < unsatisfied.length; i++) {
+        Constraint u = unsatisfied[i];
+        if (u.strength == strength) incrementalAdd(u);
+      }
+      strength = strength.nextWeaker();
+    } while (strength != WEAKEST);
+  }
+
+  /// Select a previously unused mark value.
+  int newMark() => ++currentMark;
+
+  /**
+   * Extract a plan for resatisfaction starting from the given source
+   * constraints, usually a set of input constraints. This method
+   * assumes that stay optimization is desired; the plan will contain
+   * only constraints whose output variables are not stay. Constraints
+   * that do no computation, such as stay and edit constraints, are
+   * not included in the plan.
+   * Details: The outputs of a constraint are marked when it is added
+   * to the plan under construction. A constraint may be appended to
+   * the plan when all its input variables are known. A variable is
+   * known if either a) the variable is marked (indicating that has
+   * been computed by a constraint appearing earlier in the plan), b)
+   * the variable is 'stay' (i.e. it is a constant at plan execution
+   * time), or c) the variable is not determined by any
+   * constraint. The last provision is for past states of history
+   * variables, which are not stay but which are also not computed by
+   * any constraint.
+   * Assume: [sources] are all satisfied.
+   */
+  Plan makePlan(List<Constraint> sources) {
+    int mark = newMark();
+    Plan plan = new Plan();
+    List<Constraint> todo = sources;
+    while (todo.length > 0) {
+      Constraint c = todo.removeLast();
+      if (c.output().mark != mark && c.inputsKnown(mark)) {
+        plan.addConstraint(c);
+        c.output().mark = mark;
+        addConstraintsConsumingTo(c.output(), todo);
+      }
+    }
+    return plan;
+  }
+
+  /**
+   * Extract a plan for resatisfying starting from the output of the
+   * given [constraints], usually a set of input constraints.
+   */
+  Plan extractPlanFromConstraints(List<Constraint> constraints) {
+    List<Constraint> sources = <Constraint>[];
+    for (int i = 0; i < constraints.length; i++) {
+      Constraint c = constraints[i];
+      // if not in plan already and eligible for inclusion.
+      if (c.isInput() && c.isSatisfied()) sources.add(c);
+    }
+    return makePlan(sources);
+  }
+
+  /**
+   * Recompute the walkabout strengths and stay flags of all variables
+   * downstream of the given constraint and recompute the actual
+   * values of all variables whose stay flag is true. If a cycle is
+   * detected, remove the given constraint and answer
+   * false. Otherwise, answer true.
+   * Details: Cycles are detected when a marked variable is
+   * encountered downstream of the given constraint. The sender is
+   * assumed to have marked the inputs of the given constraint with
+   * the given mark. Thus, encountering a marked node downstream of
+   * the output constraint means that there is a path from the
+   * constraint's output to one of its inputs.
+   */
+  bool addPropagate(Constraint c, int mark) {
+    List<Constraint> todo = <Constraint>[c];
+    while (todo.length > 0) {
+      Constraint d = todo.removeLast();
+      if (d.output().mark == mark) {
+        incrementalRemove(c);
+        return false;
+      }
+      d.recalculate();
+      addConstraintsConsumingTo(d.output(), todo);
+    }
+    return true;
+  }
+
+  /**
+   * Update the walkabout strengths and stay flags of all variables
+   * downstream of the given constraint. Answer a collection of
+   * unsatisfied constraints sorted in order of decreasing strength.
+   */
+  List<Constraint> removePropagateFrom(Variable out) {
+    out.determinedBy = null;
+    out.walkStrength = WEAKEST;
+    out.stay = true;
+    List<Constraint> unsatisfied = <Constraint>[];
+    List<Variable> todo = <Variable>[out];
+    while (todo.length > 0) {
+      Variable v = todo.removeLast();
+      for (int i = 0; i < v.constraints.length; i++) {
+        Constraint c = v.constraints[i];
+        if (!c.isSatisfied()) unsatisfied.add(c);
+      }
+      Constraint determining = v.determinedBy;
+      for (int i = 0; i < v.constraints.length; i++) {
+        Constraint next = v.constraints[i];
+        if (next != determining && next.isSatisfied()) {
+          next.recalculate();
+          todo.add(next.output());
+        }
+      }
+    }
+    return unsatisfied;
+  }
+
+  void addConstraintsConsumingTo(Variable v, List<Constraint> coll) {
+    Constraint determining = v.determinedBy;
+    for (int i = 0; i < v.constraints.length; i++) {
+      Constraint c = v.constraints[i];
+      if (c != determining && c.isSatisfied()) coll.add(c);
+    }
+  }
+}
+
+/**
+ * A Plan is an ordered list of constraints to be executed in sequence
+ * to resatisfy all currently satisfiable constraints in the face of
+ * one or more changing inputs.
+ */
+class Plan {
+  List<Constraint> list = <Constraint>[];
+
+  void addConstraint(Constraint c) {
+    list.add(c);
+  }
+
+  int size() => list.length;
+
+  void execute() {
+    for (int i = 0; i < list.length; i++) {
+      list[i].execute();
+    }
+  }
+}
+
+/**
+ * This is the standard DeltaBlue benchmark. A long chain of equality
+ * constraints is constructed with a stay constraint on one end. An
+ * edit constraint is then added to the opposite end and the time is
+ * measured for adding and removing this constraint, and extracting
+ * and executing a constraint satisfaction plan. There are two cases.
+ * In case 1, the added constraint is stronger than the stay
+ * constraint and values must propagate down the entire length of the
+ * chain. In case 2, the added constraint is weaker than the stay
+ * constraint so it cannot be accommodated. The cost in this case is,
+ * of course, very low. Typical situations lie somewhere between these
+ * two extremes.
+ */
+void chainTest(int n) {
+  planner = new Planner();
+  Variable prev = null, first = null, last = null;
+  // Build chain of n equality constraints.
+  for (int i = 0; i <= n; i++) {
+    Variable v = new Variable("v$i", 0);
+    if (prev != null) new EqualityConstraint(prev, v, REQUIRED);
+    if (i == 0) first = v;
+    if (i == n) last = v;
+    prev = v;
+  }
+  new StayConstraint(last, STRONG_DEFAULT);
+  EditConstraint edit = new EditConstraint(first, PREFERRED);
+  Plan plan = planner.extractPlanFromConstraints(<Constraint>[edit]);
+  for (int i = 0; i < 100; i++) {
+    first.value = i;
+    plan.execute();
+    if (last.value != i) {
+      print("Chain test failed:");
+      print("Expected last value to be $i but it was ${last.value}.");
+    }
+  }
+}
+
+/**
+ * This test constructs a two sets of variables related to each
+ * other by a simple linear transformation (scale and offset). The
+ * time is measured to change a variable on either side of the
+ * mapping and to change the scale and offset factors.
+ */
+void projectionTest(int n) {
+  planner = new Planner();
+  Variable scale = new Variable("scale", 10);
+  Variable offset = new Variable("offset", 1000);
+  Variable src = null, dst = null;
+
+  List<Variable> dests = <Variable>[];
+  for (int i = 0; i < n; i++) {
+    src = new Variable("src", i);
+    dst = new Variable("dst", i);
+    dests.add(dst);
+    new StayConstraint(src, NORMAL);
+    new ScaleConstraint(src, scale, offset, dst, REQUIRED);
+  }
+  change(src, 17);
+  if (dst.value != 1170) print("Projection 1 failed");
+  change(dst, 1050);
+  if (src.value != 5) print("Projection 2 failed");
+  change(scale, 5);
+  for (int i = 0; i < n - 1; i++) {
+    if (dests[i].value != i * 5 + 1000) print("Projection 3 failed");
+  }
+  change(offset, 2000);
+  for (int i = 0; i < n - 1; i++) {
+    if (dests[i].value != i * 5 + 2000) print("Projection 4 failed");
+  }
+}
+
+void change(Variable v, int newValue) {
+  EditConstraint edit = new EditConstraint(v, PREFERRED);
+  Plan plan = planner.extractPlanFromConstraints(<EditConstraint>[edit]);
+  for (int i = 0; i < 10; i++) {
+    v.value = newValue;
+    plan.execute();
+  }
+  edit.destroyConstraint();
+}
+
+Planner planner;
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.hierarchy.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/DeltaBlue.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/DeltaBlue.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/DeltaBlue.dart.legacy.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/DeltaBlue.dart.legacy.expect
rename to pkg/front_end/testcases/general/DeltaBlue.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
new file mode 100644
index 0000000..daecf9e
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.outline.expect
@@ -0,0 +1,204 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class DeltaBlue extends core::Object {
+  synthetic constructor •() → self::DeltaBlue*
+    ;
+  method run() → void
+    ;
+}
+class Strength extends core::Object {
+  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*
+    ;
+  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool*
+    ;
+  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool*
+    ;
+  static method weakest(self::Strength* s1, self::Strength* s2) → self::Strength*
+    ;
+  static method strongest(self::Strength* s1, self::Strength* s2) → self::Strength*
+    ;
+}
+abstract class Constraint extends core::Object {
+  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
+    ;
+  method satisfy(dynamic mark) → self::Constraint*
+    ;
+  method destroyConstraint() → void
+    ;
+  method isInput() → core::bool*
+    ;
+}
+abstract class UnaryConstraint extends self::Constraint {
+  final field self::Variable* myOutput;
+  field core::bool* satisfied;
+  constructor •(self::Variable* myOutput, self::Strength* strength) → self::UnaryConstraint*
+    ;
+  method addToGraph() → void
+    ;
+  method chooseMethod(core::int* mark) → void
+    ;
+  method isSatisfied() → core::bool*
+    ;
+  method markInputs(core::int* mark) → void
+    ;
+  method output() → self::Variable*
+    ;
+  method recalculate() → void
+    ;
+  method markUnsatisfied() → void
+    ;
+  method inputsKnown(core::int* mark) → core::bool*
+    ;
+  method removeFromGraph() → void
+    ;
+}
+class StayConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable* v, self::Strength* str) → self::StayConstraint*
+    ;
+  method execute() → void
+    ;
+}
+class EditConstraint extends self::UnaryConstraint {
+  constructor •(self::Variable* v, self::Strength* str) → self::EditConstraint*
+    ;
+  method isInput() → core::bool*
+    ;
+  method execute() → void
+    ;
+}
+abstract class BinaryConstraint extends self::Constraint {
+  field self::Variable* v1;
+  field self::Variable* v2;
+  field core::int* direction;
+  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::BinaryConstraint*
+    ;
+  method chooseMethod(core::int* mark) → void
+    ;
+  method addToGraph() → void
+    ;
+  method isSatisfied() → core::bool*
+    ;
+  method markInputs(core::int* mark) → void
+    ;
+  method input() → self::Variable*
+    ;
+  method output() → self::Variable*
+    ;
+  method recalculate() → void
+    ;
+  method markUnsatisfied() → void
+    ;
+  method inputsKnown(core::int* mark) → core::bool*
+    ;
+  method removeFromGraph() → void
+    ;
+}
+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*
+    ;
+  method addToGraph() → void
+    ;
+  method removeFromGraph() → void
+    ;
+  method markInputs(core::int* mark) → void
+    ;
+  method execute() → void
+    ;
+  method recalculate() → void
+    ;
+}
+class EqualityConstraint extends self::BinaryConstraint {
+  constructor •(self::Variable* v1, self::Variable* v2, self::Strength* strength) → self::EqualityConstraint*
+    ;
+  method execute() → void
+    ;
+}
+class Variable extends core::Object {
+  field core::List<self::Constraint*>* constraints;
+  field self::Constraint* determinedBy;
+  field core::int* mark;
+  field self::Strength* walkStrength;
+  field core::bool* stay;
+  field core::int* value;
+  final field core::String* name;
+  constructor •(core::String* name, core::int* value) → self::Variable*
+    ;
+  method addConstraint(self::Constraint* c) → void
+    ;
+  method removeConstraint(self::Constraint* c) → void
+    ;
+}
+class Planner extends core::Object {
+  field core::int* currentMark;
+  synthetic constructor •() → self::Planner*
+    ;
+  method incrementalAdd(self::Constraint* c) → void
+    ;
+  method incrementalRemove(self::Constraint* c) → void
+    ;
+  method newMark() → core::int*
+    ;
+  method makePlan(core::List<self::Constraint*>* sources) → self::Plan*
+    ;
+  method extractPlanFromConstraints(core::List<self::Constraint*>* constraints) → self::Plan*
+    ;
+  method addPropagate(self::Constraint* c, core::int* mark) → core::bool*
+    ;
+  method removePropagateFrom(self::Variable* out) → core::List<self::Constraint*>*
+    ;
+  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void
+    ;
+}
+class Plan extends core::Object {
+  field core::List<self::Constraint*>* list;
+  synthetic constructor •() → self::Plan*
+    ;
+  method addConstraint(self::Constraint* c) → void
+    ;
+  method size() → core::int*
+    ;
+  method execute() → void
+    ;
+}
+static const field dynamic REQUIRED = const self::Strength::•(0, "required");
+static const field dynamic STRONG_PREFERRED = const self::Strength::•(1, "strongPreferred");
+static const field dynamic PREFERRED = const self::Strength::•(2, "preferred");
+static const field dynamic STRONG_DEFAULT = const self::Strength::•(3, "strongDefault");
+static const field dynamic NORMAL = const self::Strength::•(4, "normal");
+static const field dynamic WEAK_DEFAULT = const self::Strength::•(5, "weakDefault");
+static const field dynamic WEAKEST = const self::Strength::•(6, "weakest");
+static const field core::int* NONE = 1;
+static const field core::int* FORWARD = 2;
+static const field core::int* BACKWARD = 0;
+static field self::Planner* planner;
+static method main() → dynamic
+  ;
+static method chainTest(core::int* n) → void
+  ;
+static method projectionTest(core::int* n) → void
+  ;
+static method change(self::Variable* v, core::int* newValue) → void
+  ;
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.strong.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.strong.expect
new file mode 100644
index 0000000..4a77a26
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.strong.expect
@@ -0,0 +1,475 @@
+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);
+  }
+}
+class Strength extends core::Object {
+  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});
+  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
+  }
+  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
+  }
+  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 class Constraint extends core::Object {
+  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}();
+    self::planner.{self::Planner::incrementalAdd}(this);
+  }
+  method satisfy(dynamic mark) → self::Constraint* {
+    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int*);
+    if(!this.{self::Constraint::isSatisfied}()) {
+      if(this.{self::Constraint::strength}.{core::Object::==}(#C22)) {
+        core::print("Could not satisfy a required constraint!");
+      }
+      return null;
+    }
+    this.{self::Constraint::markInputs}(mark as{TypeError} core::int*);
+    self::Variable* out = this.{self::Constraint::output}();
+    self::Constraint* overridden = out.{self::Variable::determinedBy};
+    if(!overridden.{core::Object::==}(null))
+      overridden.{self::Constraint::markUnsatisfied}();
+    out.{self::Variable::determinedBy} = this;
+    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int*))
+      core::print("Cycle encountered");
+    out.{self::Variable::mark} = mark as{TypeError} core::int*;
+    return overridden;
+  }
+  method destroyConstraint() → void {
+    if(this.{self::Constraint::isSatisfied}())
+      self::planner.{self::Planner::incrementalRemove}(this);
+    this.{self::Constraint::removeFromGraph}();
+  }
+  method isInput() → core::bool*
+    return false;
+}
+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}();
+  }
+  method addToGraph() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method chooseMethod(core::int* mark) → void {
+    this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
+  }
+  method isSatisfied() → core::bool*
+    return this.{self::UnaryConstraint::satisfied};
+  method markInputs(core::int* mark) → void {}
+  method output() → self::Variable*
+    return this.{self::UnaryConstraint::myOutput};
+  method recalculate() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
+    if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  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}.{core::Object::==}(null))
+      this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
+    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}();
+  }
+  method chooseMethod(core::int* mark) → void {
+    if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C1;
+    }
+    if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
+    }
+    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
+    }
+    else {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C20;
+    }
+  }
+  method addToGraph() → void {
+    this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method isSatisfied() → core::bool*
+    return !this.{self::BinaryConstraint::direction}.{core::num::==}(#C1);
+  method markInputs(core::int* mark) → void {
+    this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
+  }
+  method input() → self::Variable*
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
+  method output() → self::Variable*
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}();
+    self::Variable* out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  method markUnsatisfied() → void {
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method inputsKnown(core::int* mark) → core::bool* {
+    self::Variable* i = this.{self::BinaryConstraint::input}();
+    return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
+  }
+  method removeFromGraph() → void {
+    if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
+    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::addConstraint}(this);
+    this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
+  }
+  method removeFromGraph() → void {
+    super.{self::BinaryConstraint::removeFromGraph}();
+    if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
+  }
+  method markInputs(core::int* mark) → void {
+    super.{self::BinaryConstraint::markInputs}(mark);
+    this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
+  }
+  method execute() → void {
+    if(this.{self::BinaryConstraint::direction}.{core::num::==}(#C4)) {
+      this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
+    }
+    else {
+      this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
+    }
+  }
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}();
+    self::Variable* out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::ScaleConstraint::execute}();
+  }
+}
+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::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
+  }
+}
+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::add}(c);
+  }
+  method removeConstraint(self::Constraint* c) → void {
+    this.{self::Variable::constraints}.{core::List::remove}(c);
+    if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
+      this.{self::Variable::determinedBy} = null;
+  }
+}
+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}();
+    for (self::Constraint* overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
+      ;
+  }
+  method incrementalRemove(self::Constraint* c) → void {
+    self::Variable* out = c.{self::Constraint::output}();
+    c.{self::Constraint::markUnsatisfied}();
+    c.{self::Constraint::removeFromGraph}();
+    core::List<self::Constraint*>* unsatisfied = this.{self::Planner::removePropagateFrom}(out);
+    self::Strength* strength = #C22;
+    do {
+      for (core::int* i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* u = unsatisfied.{core::List::[]}(i);
+        if(u.{self::Constraint::strength}.{core::Object::==}(strength))
+          this.{self::Planner::incrementalAdd}(u);
+      }
+      strength = strength.{self::Strength::nextWeaker}();
+    }
+    while (!strength.{core::Object::==}(#C18))
+  }
+  method newMark() → core::int*
+    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
+  method makePlan(core::List<self::Constraint*>* sources) → self::Plan* {
+    core::int* mark = this.{self::Planner::newMark}();
+    self::Plan* plan = new self::Plan::•();
+    core::List<self::Constraint*>* todo = sources;
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint* c = todo.{core::List::removeLast}();
+      if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
+        plan.{self::Plan::addConstraint}(c);
+        c.{self::Constraint::output}().{self::Variable::mark} = mark;
+        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
+      }
+    }
+    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}); i = i.{core::num::+}(1)) {
+      self::Constraint* c = constraints.{core::List::[]}(i);
+      if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
+        sources.{core::List::add}(c);
+    }
+    return this.{self::Planner::makePlan}(sources);
+  }
+  method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
+    core::List<self::Constraint*>* todo = <self::Constraint*>[c];
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint* d = todo.{core::List::removeLast}();
+      if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
+        this.{self::Planner::incrementalRemove}(c);
+        return false;
+      }
+      d.{self::Constraint::recalculate}();
+      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
+    }
+    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::num::>}(0)) {
+      self::Variable* v = todo.{core::List::removeLast}();
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!c.{self::Constraint::isSatisfied}())
+          unsatisfied.{core::List::add}(c);
+      }
+      self::Constraint* determining = v.{self::Variable::determinedBy};
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* next = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
+          next.{self::Constraint::recalculate}();
+          todo.{core::List::add}(next.{self::Constraint::output}());
+        }
+      }
+    }
+    return unsatisfied;
+  }
+  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void {
+    self::Constraint* determining = v.{self::Variable::determinedBy};
+    for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+      self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
+      if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
+        coll.{core::List::add}(c);
+    }
+  }
+}
+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::add}(c);
+  }
+  method size() → core::int*
+    return this.{self::Plan::list}.{core::List::length};
+  method execute() → void {
+    for (core::int* i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
+      this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
+    }
+  }
+}
+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}();
+}
+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); i = i.{core::num::+}(1)) {
+    self::Variable* v = new self::Variable::•("v${i}", 0);
+    if(!prev.{core::Object::==}(null))
+      new self::EqualityConstraint::•(prev, v, #C22);
+    if(i.{core::num::==}(0))
+      first = v;
+    if(i.{core::num::==}(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]);
+  for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    first.{self::Variable::value} = i;
+    plan.{self::Plan::execute}();
+    if(!last.{self::Variable::value}.{core::num::==}(i)) {
+      core::print("Chain test failed:");
+      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
+    }
+  }
+}
+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); i = i.{core::num::+}(1)) {
+    src = new self::Variable::•("src", i);
+    dst = new self::Variable::•("dst", i);
+    dests.{core::List::add}(dst);
+    new self::StayConstraint::•(src, #C12);
+    new self::ScaleConstraint::•(src, scale, offset, dst, #C22);
+  }
+  self::change(src, 17);
+  if(!dst.{self::Variable::value}.{core::num::==}(1170))
+    core::print("Projection 1 failed");
+  self::change(dst, 1050);
+  if(!src.{self::Variable::value}.{core::num::==}(5))
+    core::print("Projection 2 failed");
+  self::change(scale, 5);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
+      core::print("Projection 3 failed");
+  }
+  self::change(offset, 2000);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
+      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]);
+  for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    v.{self::Variable::value} = newValue;
+    plan.{self::Plan::execute}();
+  }
+  edit.{self::Constraint::destroyConstraint}();
+}
+
+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}
+}
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.strong.transformed.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.strong.transformed.expect
new file mode 100644
index 0000000..4a77a26
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.strong.transformed.expect
@@ -0,0 +1,475 @@
+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);
+  }
+}
+class Strength extends core::Object {
+  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});
+  static method stronger(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}.{core::num::<}(s2.{self::Strength::value});
+  }
+  static method weaker(self::Strength* s1, self::Strength* s2) → core::bool* {
+    return s1.{self::Strength::value}.{core::num::>}(s2.{self::Strength::value});
+  }
+  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 class Constraint extends core::Object {
+  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}();
+    self::planner.{self::Planner::incrementalAdd}(this);
+  }
+  method satisfy(dynamic mark) → self::Constraint* {
+    this.{self::Constraint::chooseMethod}(mark as{TypeError} core::int*);
+    if(!this.{self::Constraint::isSatisfied}()) {
+      if(this.{self::Constraint::strength}.{core::Object::==}(#C22)) {
+        core::print("Could not satisfy a required constraint!");
+      }
+      return null;
+    }
+    this.{self::Constraint::markInputs}(mark as{TypeError} core::int*);
+    self::Variable* out = this.{self::Constraint::output}();
+    self::Constraint* overridden = out.{self::Variable::determinedBy};
+    if(!overridden.{core::Object::==}(null))
+      overridden.{self::Constraint::markUnsatisfied}();
+    out.{self::Variable::determinedBy} = this;
+    if(!self::planner.{self::Planner::addPropagate}(this, mark as{TypeError} core::int*))
+      core::print("Cycle encountered");
+    out.{self::Variable::mark} = mark as{TypeError} core::int*;
+    return overridden;
+  }
+  method destroyConstraint() → void {
+    if(this.{self::Constraint::isSatisfied}())
+      self::planner.{self::Planner::incrementalRemove}(this);
+    this.{self::Constraint::removeFromGraph}();
+  }
+  method isInput() → core::bool*
+    return false;
+}
+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}();
+  }
+  method addToGraph() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::addConstraint}(this);
+    this.{self::UnaryConstraint::satisfied} = false;
+  }
+  method chooseMethod(core::int* mark) → void {
+    this.{self::UnaryConstraint::satisfied} = !this.{self::UnaryConstraint::myOutput}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength});
+  }
+  method isSatisfied() → core::bool*
+    return this.{self::UnaryConstraint::satisfied};
+  method markInputs(core::int* mark) → void {}
+  method output() → self::Variable*
+    return this.{self::UnaryConstraint::myOutput};
+  method recalculate() → void {
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::walkStrength} = this.{self::Constraint::strength};
+    this.{self::UnaryConstraint::myOutput}.{self::Variable::stay} = !this.{self::Constraint::isInput}();
+    if(this.{self::UnaryConstraint::myOutput}.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  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}.{core::Object::==}(null))
+      this.{self::UnaryConstraint::myOutput}.{self::Variable::removeConstraint}(this);
+    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}();
+  }
+  method chooseMethod(core::int* mark) → void {
+    if(this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C1;
+    }
+    if(this.{self::BinaryConstraint::v2}.{self::Variable::mark}.{core::num::==}(mark)) {
+      this.{self::BinaryConstraint::direction} = !this.{self::BinaryConstraint::v1}.{self::Variable::mark}.{core::num::==}(mark) && self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
+    }
+    if(self::Strength::weaker(this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength})) {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v1}.{self::Variable::walkStrength}) ?{core::int*} #C20 : #C1;
+    }
+    else {
+      this.{self::BinaryConstraint::direction} = self::Strength::stronger(this.{self::Constraint::strength}, this.{self::BinaryConstraint::v2}.{self::Variable::walkStrength}) ?{core::int*} #C4 : #C20;
+    }
+  }
+  method addToGraph() → void {
+    this.{self::BinaryConstraint::v1}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::v2}.{self::Variable::addConstraint}(this);
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method isSatisfied() → core::bool*
+    return !this.{self::BinaryConstraint::direction}.{core::num::==}(#C1);
+  method markInputs(core::int* mark) → void {
+    this.{self::BinaryConstraint::input}().{self::Variable::mark} = mark;
+  }
+  method input() → self::Variable*
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v1} : this.{self::BinaryConstraint::v2};
+  method output() → self::Variable*
+    return this.{self::BinaryConstraint::direction}.{core::num::==}(#C4) ?{self::Variable*} this.{self::BinaryConstraint::v2} : this.{self::BinaryConstraint::v1};
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}();
+    self::Variable* out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::Constraint::execute}();
+  }
+  method markUnsatisfied() → void {
+    this.{self::BinaryConstraint::direction} = #C1;
+  }
+  method inputsKnown(core::int* mark) → core::bool* {
+    self::Variable* i = this.{self::BinaryConstraint::input}();
+    return i.{self::Variable::mark}.{core::num::==}(mark) || i.{self::Variable::stay} || i.{self::Variable::determinedBy}.{core::Object::==}(null);
+  }
+  method removeFromGraph() → void {
+    if(!this.{self::BinaryConstraint::v1}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v1}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::BinaryConstraint::v2}.{core::Object::==}(null))
+      this.{self::BinaryConstraint::v2}.{self::Variable::removeConstraint}(this);
+    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::addConstraint}(this);
+    this.{self::ScaleConstraint::offset}.{self::Variable::addConstraint}(this);
+  }
+  method removeFromGraph() → void {
+    super.{self::BinaryConstraint::removeFromGraph}();
+    if(!this.{self::ScaleConstraint::scale}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::scale}.{self::Variable::removeConstraint}(this);
+    if(!this.{self::ScaleConstraint::offset}.{core::Object::==}(null))
+      this.{self::ScaleConstraint::offset}.{self::Variable::removeConstraint}(this);
+  }
+  method markInputs(core::int* mark) → void {
+    super.{self::BinaryConstraint::markInputs}(mark);
+    this.{self::ScaleConstraint::scale}.{self::Variable::mark} = this.{self::ScaleConstraint::offset}.{self::Variable::mark} = mark;
+  }
+  method execute() → void {
+    if(this.{self::BinaryConstraint::direction}.{core::num::==}(#C4)) {
+      this.{self::BinaryConstraint::v2}.{self::Variable::value} = this.{self::BinaryConstraint::v1}.{self::Variable::value}.{core::num::*}(this.{self::ScaleConstraint::scale}.{self::Variable::value}).{core::num::+}(this.{self::ScaleConstraint::offset}.{self::Variable::value});
+    }
+    else {
+      this.{self::BinaryConstraint::v1}.{self::Variable::value} = this.{self::BinaryConstraint::v2}.{self::Variable::value}.{core::num::-}(this.{self::ScaleConstraint::offset}.{self::Variable::value}).{core::num::~/}(this.{self::ScaleConstraint::scale}.{self::Variable::value});
+    }
+  }
+  method recalculate() → void {
+    self::Variable* ihn = this.{self::BinaryConstraint::input}();
+    self::Variable* out = this.{self::BinaryConstraint::output}();
+    out.{self::Variable::walkStrength} = self::Strength::weakest(this.{self::Constraint::strength}, ihn.{self::Variable::walkStrength});
+    out.{self::Variable::stay} = ihn.{self::Variable::stay} && this.{self::ScaleConstraint::scale}.{self::Variable::stay} && this.{self::ScaleConstraint::offset}.{self::Variable::stay};
+    if(out.{self::Variable::stay})
+      this.{self::ScaleConstraint::execute}();
+  }
+}
+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::value} = this.{self::BinaryConstraint::input}().{self::Variable::value};
+  }
+}
+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::add}(c);
+  }
+  method removeConstraint(self::Constraint* c) → void {
+    this.{self::Variable::constraints}.{core::List::remove}(c);
+    if(this.{self::Variable::determinedBy}.{core::Object::==}(c))
+      this.{self::Variable::determinedBy} = null;
+  }
+}
+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}();
+    for (self::Constraint* overridden = c.{self::Constraint::satisfy}(mark); !overridden.{core::Object::==}(null); overridden = overridden.{self::Constraint::satisfy}(mark))
+      ;
+  }
+  method incrementalRemove(self::Constraint* c) → void {
+    self::Variable* out = c.{self::Constraint::output}();
+    c.{self::Constraint::markUnsatisfied}();
+    c.{self::Constraint::removeFromGraph}();
+    core::List<self::Constraint*>* unsatisfied = this.{self::Planner::removePropagateFrom}(out);
+    self::Strength* strength = #C22;
+    do {
+      for (core::int* i = 0; i.{core::num::<}(unsatisfied.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* u = unsatisfied.{core::List::[]}(i);
+        if(u.{self::Constraint::strength}.{core::Object::==}(strength))
+          this.{self::Planner::incrementalAdd}(u);
+      }
+      strength = strength.{self::Strength::nextWeaker}();
+    }
+    while (!strength.{core::Object::==}(#C18))
+  }
+  method newMark() → core::int*
+    return this.{self::Planner::currentMark} = this.{self::Planner::currentMark}.{core::num::+}(1);
+  method makePlan(core::List<self::Constraint*>* sources) → self::Plan* {
+    core::int* mark = this.{self::Planner::newMark}();
+    self::Plan* plan = new self::Plan::•();
+    core::List<self::Constraint*>* todo = sources;
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint* c = todo.{core::List::removeLast}();
+      if(!c.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark) && c.{self::Constraint::inputsKnown}(mark)) {
+        plan.{self::Plan::addConstraint}(c);
+        c.{self::Constraint::output}().{self::Variable::mark} = mark;
+        this.{self::Planner::addConstraintsConsumingTo}(c.{self::Constraint::output}(), todo);
+      }
+    }
+    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}); i = i.{core::num::+}(1)) {
+      self::Constraint* c = constraints.{core::List::[]}(i);
+      if(c.{self::Constraint::isInput}() && c.{self::Constraint::isSatisfied}())
+        sources.{core::List::add}(c);
+    }
+    return this.{self::Planner::makePlan}(sources);
+  }
+  method addPropagate(self::Constraint* c, core::int* mark) → core::bool* {
+    core::List<self::Constraint*>* todo = <self::Constraint*>[c];
+    while (todo.{core::List::length}.{core::num::>}(0)) {
+      self::Constraint* d = todo.{core::List::removeLast}();
+      if(d.{self::Constraint::output}().{self::Variable::mark}.{core::num::==}(mark)) {
+        this.{self::Planner::incrementalRemove}(c);
+        return false;
+      }
+      d.{self::Constraint::recalculate}();
+      this.{self::Planner::addConstraintsConsumingTo}(d.{self::Constraint::output}(), todo);
+    }
+    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::num::>}(0)) {
+      self::Variable* v = todo.{core::List::removeLast}();
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!c.{self::Constraint::isSatisfied}())
+          unsatisfied.{core::List::add}(c);
+      }
+      self::Constraint* determining = v.{self::Variable::determinedBy};
+      for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+        self::Constraint* next = v.{self::Variable::constraints}.{core::List::[]}(i);
+        if(!next.{core::Object::==}(determining) && next.{self::Constraint::isSatisfied}()) {
+          next.{self::Constraint::recalculate}();
+          todo.{core::List::add}(next.{self::Constraint::output}());
+        }
+      }
+    }
+    return unsatisfied;
+  }
+  method addConstraintsConsumingTo(self::Variable* v, core::List<self::Constraint*>* coll) → void {
+    self::Constraint* determining = v.{self::Variable::determinedBy};
+    for (core::int* i = 0; i.{core::num::<}(v.{self::Variable::constraints}.{core::List::length}); i = i.{core::num::+}(1)) {
+      self::Constraint* c = v.{self::Variable::constraints}.{core::List::[]}(i);
+      if(!c.{core::Object::==}(determining) && c.{self::Constraint::isSatisfied}())
+        coll.{core::List::add}(c);
+    }
+  }
+}
+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::add}(c);
+  }
+  method size() → core::int*
+    return this.{self::Plan::list}.{core::List::length};
+  method execute() → void {
+    for (core::int* i = 0; i.{core::num::<}(this.{self::Plan::list}.{core::List::length}); i = i.{core::num::+}(1)) {
+      this.{self::Plan::list}.{core::List::[]}(i).{self::Constraint::execute}();
+    }
+  }
+}
+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}();
+}
+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); i = i.{core::num::+}(1)) {
+    self::Variable* v = new self::Variable::•("v${i}", 0);
+    if(!prev.{core::Object::==}(null))
+      new self::EqualityConstraint::•(prev, v, #C22);
+    if(i.{core::num::==}(0))
+      first = v;
+    if(i.{core::num::==}(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]);
+  for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    first.{self::Variable::value} = i;
+    plan.{self::Plan::execute}();
+    if(!last.{self::Variable::value}.{core::num::==}(i)) {
+      core::print("Chain test failed:");
+      core::print("Expected last value to be ${i} but it was ${last.{self::Variable::value}}.");
+    }
+  }
+}
+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); i = i.{core::num::+}(1)) {
+    src = new self::Variable::•("src", i);
+    dst = new self::Variable::•("dst", i);
+    dests.{core::List::add}(dst);
+    new self::StayConstraint::•(src, #C12);
+    new self::ScaleConstraint::•(src, scale, offset, dst, #C22);
+  }
+  self::change(src, 17);
+  if(!dst.{self::Variable::value}.{core::num::==}(1170))
+    core::print("Projection 1 failed");
+  self::change(dst, 1050);
+  if(!src.{self::Variable::value}.{core::num::==}(5))
+    core::print("Projection 2 failed");
+  self::change(scale, 5);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(1000)))
+      core::print("Projection 3 failed");
+  }
+  self::change(offset, 2000);
+  for (core::int* i = 0; i.{core::num::<}(n.{core::num::-}(1)); i = i.{core::num::+}(1)) {
+    if(!dests.{core::List::[]}(i).{self::Variable::value}.{core::num::==}(i.{core::num::*}(5).{core::num::+}(2000)))
+      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]);
+  for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    v.{self::Variable::value} = newValue;
+    plan.{self::Plan::execute}();
+  }
+  edit.{self::Constraint::destroyConstraint}();
+}
+
+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}
+}
diff --git a/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect b/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect
new file mode 100644
index 0000000..1a6ab73
--- /dev/null
+++ b/pkg/front_end/testcases/general/DeltaBlue.dart.type_promotion.expect
@@ -0,0 +1,57 @@
+pkg/front_end/testcases/general/DeltaBlue.dart:458:20: Context: Write to overridden@13140
+        overridden = overridden.satisfy(mark));
+                   ^
+pkg/front_end/testcases/general/DeltaBlue.dart:479:48: Context: Write to i@14066
+      for (int i = 0; i < unsatisfied.length; i++) {
+                                               ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:483:16: Context: Write to strength@14021
+      strength = strength.nextWeaker();
+               ^
+pkg/front_end/testcases/general/DeltaBlue.dart:530:46: Context: Write to i@16109
+    for (int i = 0; i < constraints.length; i++) {
+                                             ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:578:50: Context: Write to i@17909
+      for (int i = 0; i < v.constraints.length; i++) {
+                                                 ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:583:50: Context: Write to i@17909
+      for (int i = 0; i < v.constraints.length; i++) {
+                                                 ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:596:48: Context: Write to i@18497
+    for (int i = 0; i < v.constraints.length; i++) {
+                                               ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:618:39: Context: Write to i@19006
+    for (int i = 0; i < list.length; i++) {
+                                      ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:641:28: Context: Write to i@19940
+  for (int i = 0; i <= n; i++) {
+                           ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:644:23: Context: Write to first@19858
+    if (i == 0) first = v;
+                      ^
+pkg/front_end/testcases/general/DeltaBlue.dart:645:22: Context: Write to last@19872
+    if (i == n) last = v;
+                     ^
+pkg/front_end/testcases/general/DeltaBlue.dart:646:10: Context: Write to prev@19845
+    prev = v;
+         ^
+pkg/front_end/testcases/general/DeltaBlue.dart:651:29: Context: Write to i@19940
+  for (int i = 0; i < 100; i++) {
+                            ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:674:27: Context: Write to i@21031
+  for (int i = 0; i < n; i++) {
+                          ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:675:9: Context: Write to src@20956
+    src = new Variable("src", i);
+        ^
+pkg/front_end/testcases/general/DeltaBlue.dart:676:9: Context: Write to dst@20968
+    dst = new Variable("dst", i);
+        ^
+pkg/front_end/testcases/general/DeltaBlue.dart:686:31: Context: Write to i@21031
+  for (int i = 0; i < n - 1; i++) {
+                              ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:690:31: Context: Write to i@21031
+  for (int i = 0; i < n - 1; i++) {
+                              ^^
+pkg/front_end/testcases/general/DeltaBlue.dart:698:28: Context: Write to i@21838
+  for (int i = 0; i < 10; i++) {
+                           ^^
diff --git a/pkg/front_end/testcases/abstract_members.dart b/pkg/front_end/testcases/general/abstract_members.dart
similarity index 100%
rename from pkg/front_end/testcases/abstract_members.dart
rename to pkg/front_end/testcases/general/abstract_members.dart
diff --git a/pkg/front_end/testcases/abstract_members.dart.hierarchy.expect b/pkg/front_end/testcases/general/abstract_members.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/abstract_members.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/abstract_members.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.legacy.expect b/pkg/front_end/testcases/general/abstract_members.dart.legacy.expect
new file mode 100644
index 0000000..ec953d2
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_members.dart.legacy.expect
@@ -0,0 +1,310 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_members.dart:19: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:64: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:12:7: Context: This is one inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:59:8: Context: This is the other inherited member.
+//   void interfaceMethod1(_) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:72: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:67:12: Context: This is the other inherited member.
+//   void set interfaceMethod1(_) {}
+//            ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:84: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:75:8: Context: This is one inherited member.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:79:14: Context: This is the other inherited member.
+//   Object get foo => null;
+//              ^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:96: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:87:14: Context: This is one inherited member.
+//   Object get foo => null;
+//              ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:91: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 {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3*
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+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 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 {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic 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)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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(#C8, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  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)));
+}
+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;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method interfaceMethod1(dynamic _) → void {}
+}
+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 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 {}
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  get foo() → core::Object*
+    return null;
+}
+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;
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method foo() → core::Object* {}
+}
+abstract class J extends self::I implements self::Bar {
+  synthetic constructor •() → self::J*
+    : super self::I::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #interfaceMethod1
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #property3=
+  #C6 = #interfaceMethod1=
+  #C7 = #property1=
+  #C8 = #interfaceMethod2
+  #C9 = #abstractMethod
+  #C10 = #interfaceMethod3
+  #C11 = #property2=
+}
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/abstract_members.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ec953d2
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_members.dart.legacy.transformed.expect
@@ -0,0 +1,310 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_members.dart:19: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:64: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:12:7: Context: This is one inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:59:8: Context: This is the other inherited member.
+//   void interfaceMethod1(_) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:72: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:67:12: Context: This is the other inherited member.
+//   void set interfaceMethod1(_) {}
+//            ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:84: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:75:8: Context: This is one inherited member.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:79:14: Context: This is the other inherited member.
+//   Object get foo => null;
+//              ^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:96: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:87:14: Context: This is one inherited member.
+//   Object get foo => null;
+//              ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:91: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 {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3*
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+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 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 {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic 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)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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(#C8, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  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)));
+}
+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;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method interfaceMethod1(dynamic _) → void {}
+}
+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 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 {}
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  get foo() → core::Object*
+    return null;
+}
+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;
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method foo() → core::Object* {}
+}
+abstract class J extends self::I implements self::Bar {
+  synthetic constructor •() → self::J*
+    : super self::I::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #interfaceMethod1
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #property3=
+  #C6 = #interfaceMethod1=
+  #C7 = #property1=
+  #C8 = #interfaceMethod2
+  #C9 = #abstractMethod
+  #C10 = #interfaceMethod3
+  #C11 = #property2=
+}
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.outline.expect b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
new file mode 100644
index 0000000..acc5dad
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_members.dart.outline.expect
@@ -0,0 +1,292 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_members.dart:19: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:64: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:12:7: Context: This is one inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:59:8: Context: This is the other inherited member.
+//   void interfaceMethod1(_) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:72: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:67:12: Context: This is the other inherited member.
+//   void set interfaceMethod1(_) {}
+//            ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:84: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:75:8: Context: This is one inherited member.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:79:14: Context: This is the other inherited member.
+//   Object get foo => null;
+//              ^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:96: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:87:14: Context: This is one inherited member.
+//   Object get foo => null;
+//              ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:91: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*
+    ;
+  method interfaceMethod1() → void
+    ;
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1;
+  synthetic constructor •() → self::Interface2*
+    ;
+  method interfaceMethod2() → void
+    ;
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3*
+    ;
+  method interfaceMethod3() → void
+    ;
+}
+abstract class A extends core::Object implements self::Interface1, self::Interface2, self::Interface3 {
+  synthetic constructor •() → self::A*
+    ;
+  method aMethod() → dynamic
+    ;
+  abstract method abstractMethod() → dynamic;
+  abstract set property1(dynamic _) → void;
+  abstract set property2(dynamic _) → void;
+  abstract set property3(dynamic _) → void;
+}
+abstract class B extends self::A {
+  final field dynamic property1;
+  synthetic constructor •() → self::B*
+    ;
+  method aMethod() → dynamic
+    ;
+  method bMethod() → dynamic
+    ;
+}
+class MyClass extends self::B {
+  field dynamic property2;
+  synthetic constructor •() → self::MyClass*
+    ;
+  method aaMethod() → dynamic
+    ;
+  method aMethod() → dynamic
+    ;
+  method bMethod() → dynamic
+    ;
+  method cMethod() → dynamic
+    ;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+}
+class MyMock1 extends self::B {
+  synthetic constructor •() → self::MyMock1*
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    ;
+  no-such-method-forwarder method interfaceMethod2() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod2, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#abstractMethod, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod3, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+}
+class MyMock2 extends self::MyMock1 {
+  synthetic constructor •() → self::MyMock2*
+    ;
+  abstract method noSuchMethod(core::Invocation* _) → dynamic;
+}
+class MyMock3 extends self::B {
+  synthetic constructor •() → self::MyMock3*
+    ;
+  abstract method noSuchMethod(core::Invocation* _) → dynamic;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property3=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property1=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#property2=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method interfaceMethod1(dynamic _) → void
+    ;
+}
+abstract class D extends self::C implements self::Interface2 {
+  synthetic constructor •() → self::D*
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    ;
+  set interfaceMethod1(dynamic _) → void
+    ;
+}
+abstract class F extends self::E implements self::Interface1 {
+  synthetic constructor •() → self::F*
+    ;
+}
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+  method foo() → void
+    ;
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    ;
+  get foo() → core::Object*
+    ;
+}
+abstract class H extends self::G implements self::Foo {
+  synthetic constructor •() → self::H*
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    ;
+  get foo() → core::Object*
+    ;
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  method foo() → core::Object*
+    ;
+}
+abstract class J extends self::I implements self::Bar {
+  synthetic constructor •() → self::J*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/abstract_members.dart.strong.expect b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
new file mode 100644
index 0000000..ec953d2
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_members.dart.strong.expect
@@ -0,0 +1,310 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/abstract_members.dart:19: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: This is the other inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:33: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:54: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:21:3: Context: 'A.abstractMethod' is defined here.
+//   abstractMethod();
+//   ^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:22:12: Context: 'A.property1=' is defined here.
+//   void set property1(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:23:12: Context: 'A.property2=' is defined here.
+//   void set property2(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:24:12: Context: 'A.property3=' is defined here.
+//   void set property3(_);
+//            ^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:6:8: Context: 'Interface1.interfaceMethod1' is defined here.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:12:7: Context: 'Interface2.interfaceMethod1' is defined here.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:10:8: Context: 'Interface2.interfaceMethod2' is defined here.
+//   void interfaceMethod2() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:16:8: Context: 'Interface3.interfaceMethod3' is defined here.
+//   void interfaceMethod3() {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:64: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:12:7: Context: This is one inherited member.
+//   var interfaceMethod1;
+//       ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:59:8: Context: This is the other inherited member.
+//   void interfaceMethod1(_) {}
+//        ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:72: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:6:8: Context: This is one inherited member.
+//   void interfaceMethod1() {}
+//        ^^^^^^^^^^^^^^^^
+// pkg/front_end/testcases/general/abstract_members.dart:67:12: Context: This is the other inherited member.
+//   void set interfaceMethod1(_) {}
+//            ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:84: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:75:8: Context: This is one inherited member.
+//   void foo() {}
+//        ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:79:14: Context: This is the other inherited member.
+//   Object get foo => null;
+//              ^^^
+//
+// pkg/front_end/testcases/general/abstract_members.dart:96: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:87:14: Context: This is one inherited member.
+//   Object get foo => null;
+//              ^^^
+// pkg/front_end/testcases/general/abstract_members.dart:91: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 {}
+}
+class Interface2 extends core::Object {
+  field dynamic interfaceMethod1 = null;
+  synthetic constructor •() → self::Interface2*
+    : super core::Object::•()
+    ;
+  method interfaceMethod2() → void {}
+}
+class Interface3 extends core::Object {
+  synthetic constructor •() → self::Interface3*
+    : super core::Object::•()
+    ;
+  method interfaceMethod3() → void {}
+}
+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 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 {}
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic 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)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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(#C8, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method abstractMethod() → dynamic
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C9, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder method interfaceMethod1() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder method interfaceMethod3() → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock1::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  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)));
+}
+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;
+  no-such-method-forwarder get interfaceMethod1() → dynamic
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
+  no-such-method-forwarder set property3(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set interfaceMethod1(dynamic value) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property1(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  no-such-method-forwarder set property2(dynamic _) → void
+    return this.{self::MyMock3::noSuchMethod}(new core::_InvocationMirror::_withType(#C11, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[_]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method interfaceMethod1(dynamic _) → void {}
+}
+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 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 {}
+}
+class G extends core::Object {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  get foo() → core::Object*
+    return null;
+}
+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;
+}
+class I extends core::Object {
+  synthetic constructor •() → self::I*
+    : super core::Object::•()
+    ;
+  method foo() → core::Object* {}
+}
+abstract class J extends self::I implements self::Bar {
+  synthetic constructor •() → self::J*
+    : super self::I::•()
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #interfaceMethod1
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #property3=
+  #C6 = #interfaceMethod1=
+  #C7 = #property1=
+  #C8 = #interfaceMethod2
+  #C9 = #abstractMethod
+  #C10 = #interfaceMethod3
+  #C11 = #property2=
+}
diff --git a/pkg/front_end/testcases/abstract_members.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_members.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/abstract_members.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/abstract_members.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart
similarity index 100%
rename from pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart
rename to pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart
diff --git a/pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.hierarchy.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/abstract_overrides_concrete_with_no_such_method.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.expect
new file mode 100644
index 0000000..8482063
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.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::•()
+    ;
+  method foo() → self::A*
+    return null;
+}
+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;
+}
+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))) as{TypeError} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8482063
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.legacy.transformed.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::•()
+    ;
+  method foo() → self::A*
+    return null;
+}
+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;
+}
+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))) as{TypeError} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
new file mode 100644
index 0000000..7200a65
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.outline.expect
@@ -0,0 +1,29 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method foo() → self::A*
+    ;
+}
+abstract class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  abstract method foo() → self::B*;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    ;
+}
+class D extends self::C implements self::B {
+  synthetic constructor •() → self::D*
+    ;
+  no-such-method-forwarder method foo() → self::B*
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} self::B*;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.expect
new file mode 100644
index 0000000..8482063
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.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::•()
+    ;
+  method foo() → self::A*
+    return null;
+}
+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;
+}
+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))) as{TypeError} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.expect
new file mode 100644
index 0000000..8482063
--- /dev/null
+++ b/pkg/front_end/testcases/general/abstract_overrides_concrete_with_no_such_method.dart.strong.transformed.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::•()
+    ;
+  method foo() → self::A*
+    return null;
+}
+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;
+}
+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))) as{TypeError} self::B*;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/accessors.dart b/pkg/front_end/testcases/general/accessors.dart
similarity index 100%
rename from pkg/front_end/testcases/accessors.dart
rename to pkg/front_end/testcases/general/accessors.dart
diff --git a/pkg/front_end/testcases/accessors.dart.hierarchy.expect b/pkg/front_end/testcases/general/accessors.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/accessors.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/accessors.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/accessors.dart.legacy.expect b/pkg/front_end/testcases/general/accessors.dart.legacy.expect
new file mode 100644
index 0000000..bbd4ef7
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.legacy.expect
@@ -0,0 +1,73 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:40:11: Warning: 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(this.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(this.onlySetter);
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+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(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
+
+constants  {
+  #C1 = #onlySetter
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/accessors.dart.legacy.transformed.expect
new file mode 100644
index 0000000..bbd4ef7
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.legacy.transformed.expect
@@ -0,0 +1,73 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/accessors.dart:16:13: Warning: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:25:11: Warning: Getter not found: 'onlySetter'.
+//     print(onlySetter);
+//           ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/accessors.dart:40:11: Warning: 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(this.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(this.onlySetter);
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+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(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+    throw "No error thrown";
+  }
+  on core::NoSuchMethodError* catch(final core::NoSuchMethodError* e) {
+    core::print("Expected error: ${e}");
+  }
+  self::onlySetter = "fisk";
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
+
+constants  {
+  #C1 = #onlySetter
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/accessors.dart.outline.expect b/pkg/front_end/testcases/general/accessors.dart.outline.expect
new file mode 100644
index 0000000..f5283f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  set onlySetter(dynamic value) → void
+    ;
+  method testC() → dynamic
+    ;
+  method testD() → dynamic
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  get onlySetter() → core::String*
+    ;
+  set onlySetter(dynamic value) → void
+    ;
+}
+static set onlySetter(dynamic value) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/accessors.dart.strong.expect b/pkg/front_end/testcases/general/accessors.dart.strong.expect
new file mode 100644
index 0000000..efe4a1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.strong.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// 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: Getter not found: '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);
+            ^^^^^^^^^^");
+      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);
+          ^^^^^^^^^^");
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+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}();
+  new self::D::•().{self::C::testD}();
+}
diff --git a/pkg/front_end/testcases/general/accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/general/accessors.dart.strong.transformed.expect
new file mode 100644
index 0000000..efe4a1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/accessors.dart.strong.transformed.expect
@@ -0,0 +1,88 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/accessors.dart:16:13: Error: Getter not found: 'onlySetter'.
+//       print(onlySetter);
+//             ^^^^^^^^^^
+//
+// 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: Getter not found: '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);
+            ^^^^^^^^^^");
+      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);
+          ^^^^^^^^^^");
+    this.{self::C::onlySetter} = "hest";
+  }
+}
+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}();
+  new self::D::•().{self::C::testD}();
+}
diff --git a/pkg/front_end/testcases/ambiguous_exports.dart b/pkg/front_end/testcases/general/ambiguous_exports.dart
similarity index 100%
rename from pkg/front_end/testcases/ambiguous_exports.dart
rename to pkg/front_end/testcases/general/ambiguous_exports.dart
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.legacy.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.legacy.expect
new file mode 100644
index 0000000..530c1e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.legacy.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";
+export "org-dartlang-testcase:///map.dart";
+
+static const field dynamic _exports# = #C1 /* from null */;
+
+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/ambiguous_exports.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.legacy.transformed.expect
new file mode 100644
index 0000000..530c1e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.legacy.transformed.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";
+export "org-dartlang-testcase:///map.dart";
+
+static const field dynamic _exports# = #C1 /* from null */;
+
+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/ambiguous_exports.dart.outline.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.outline.expect
new file mode 100644
index 0000000..2a2b570
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.outline.expect
@@ -0,0 +1,26 @@
+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;
+
+export "org-dartlang-testcase:///hello.dart";
+export "org-dartlang-testcase:///map.dart";
+
+static const field dynamic _exports# = "{\"main\":\"'main' is exported from both 'pkg/front_end/testcases/general/hello.dart' and 'pkg/front_end/testcases/general/map.dart'.\"}" /* from null */;
+
+library;
+import self as self2;
+
+static method main() → dynamic
+  ;
+
+library;
+import self as self3;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/ambiguous_exports.dart.strong.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.strong.expect
new file mode 100644
index 0000000..530c1e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.strong.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";
+export "org-dartlang-testcase:///map.dart";
+
+static const field dynamic _exports# = #C1 /* from null */;
+
+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/ambiguous_exports.dart.strong.transformed.expect b/pkg/front_end/testcases/general/ambiguous_exports.dart.strong.transformed.expect
new file mode 100644
index 0000000..530c1e4
--- /dev/null
+++ b/pkg/front_end/testcases/general/ambiguous_exports.dart.strong.transformed.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";
+export "org-dartlang-testcase:///map.dart";
+
+static const field dynamic _exports# = #C1 /* from null */;
+
+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/annotation_eof.dart b/pkg/front_end/testcases/general/annotation_eof.dart
similarity index 100%
rename from pkg/front_end/testcases/annotation_eof.dart
rename to pkg/front_end/testcases/general/annotation_eof.dart
diff --git a/pkg/front_end/testcases/general/annotation_eof.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_eof.dart.legacy.expect
new file mode 100644
index 0000000..f4d0e53
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.legacy.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_eof.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_eof.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f4d0e53
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.legacy.transformed.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_eof.dart.outline.expect b/pkg/front_end/testcases/general/annotation_eof.dart.outline.expect
new file mode 100644
index 0000000..6c6eddf
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/annotation_eof.dart:10:1: Error: Expected a declaration, but got ''.
+//
+import self as self;
+
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_eof.dart.strong.expect b/pkg/front_end/testcases/general/annotation_eof.dart.strong.expect
new file mode 100644
index 0000000..f4d0e53
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.strong.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_eof.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_eof.dart.strong.transformed.expect
new file mode 100644
index 0000000..f4d0e53
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_eof.dart.strong.transformed.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 b/pkg/front_end/testcases/general/annotation_on_enum_values.dart
new file mode 100644
index 0000000..7e7fca2
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// This test checks that annotations on enum values are preserved by the
+// compiler.
+
+const int hest = 42;
+
+class Fisk<T> {
+  final T x;
+  const Fisk.fisk(this.x);
+}
+
+enum Foo {
+  @hest
+  bar,
+  @Fisk.fisk(hest)
+  baz,
+  cafebabe,
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/annotation_on_enum_values.dart.hierarchy.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_on_enum_values.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/annotation_on_enum_values.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.expect
new file mode 100644
index 0000000..046e4e7
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object {
+  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::•()
+    ;
+}
+class Foo extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Foo::_name};
+}
+static const field core::int* hest = #C11;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.bar"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.baz"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "Foo.cafebabe"
+  #C9 = self::Foo {index:#C7, _name:#C8}
+  #C10 = <self::Foo*>[#C3, #C6, #C9]
+  #C11 = 42
+  #C12 = self::Fisk<dynamic> {x:#C11}
+}
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.transformed.expect
new file mode 100644
index 0000000..046e4e7
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object {
+  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::•()
+    ;
+}
+class Foo extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Foo::_name};
+}
+static const field core::int* hest = #C11;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.bar"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.baz"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "Foo.cafebabe"
+  #C9 = self::Foo {index:#C7, _name:#C8}
+  #C10 = <self::Foo*>[#C3, #C6, #C9]
+  #C11 = 42
+  #C12 = self::Fisk<dynamic> {x:#C11}
+}
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
new file mode 100644
index 0000000..466c02c
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.outline.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object {
+  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::•()
+    ;
+}
+class Foo extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::bar, self::Foo::baz, self::Foo::cafebabe];
+  @self::hest
+  static const field self::Foo* bar = const self::Foo::•(0, "Foo.bar");
+  @self::Fisk::fisk<dynamic>(self::hest)
+  static const field self::Foo* baz = const self::Foo::•(1, "Foo.baz");
+  static const field self::Foo* cafebabe = const self::Foo::•(2, "Foo.cafebabe");
+  const constructor •(core::int* index, core::String* _name) → self::Foo*
+    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Foo::_name};
+}
+static const field core::int* hest = 42;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.expect
new file mode 100644
index 0000000..b030b8a
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object {
+  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::•()
+    ;
+}
+class Foo extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Foo::_name};
+}
+static const field core::int* hest = #C11;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.bar"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.baz"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "Foo.cafebabe"
+  #C9 = self::Foo {index:#C7, _name:#C8}
+  #C10 = <self::Foo*>[#C3, #C6, #C9]
+  #C11 = 42
+  #C12 = self::Fisk<core::int*> {x:#C11}
+}
diff --git a/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.transformed.expect
new file mode 100644
index 0000000..b030b8a
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_on_enum_values.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Fisk<T extends core::Object* = dynamic> extends core::Object {
+  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::•()
+    ;
+}
+class Foo extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Foo::_name};
+}
+static const field core::int* hest = #C11;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.bar"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.baz"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "Foo.cafebabe"
+  #C9 = self::Foo {index:#C7, _name:#C8}
+  #C10 = <self::Foo*>[#C3, #C6, #C9]
+  #C11 = 42
+  #C12 = self::Fisk<core::int*> {x:#C11}
+}
diff --git a/pkg/front_end/testcases/annotation_top.dart b/pkg/front_end/testcases/general/annotation_top.dart
similarity index 100%
rename from pkg/front_end/testcases/annotation_top.dart
rename to pkg/front_end/testcases/general/annotation_top.dart
diff --git a/pkg/front_end/testcases/annotation_top.dart.hierarchy.expect b/pkg/front_end/testcases/general/annotation_top.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_top.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/annotation_top.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_top.dart.legacy.expect
new file mode 100644
index 0000000..6f2d3774
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.legacy.expect
@@ -0,0 +1,39 @@
+@#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 {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+}
+@#C1
+@#C2
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_top.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6f2d3774
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.legacy.transformed.expect
@@ -0,0 +1,39 @@
+@#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 {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+}
+@#C1
+@#C2
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.outline.expect b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
new file mode 100644
index 0000000..5fc0262
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.outline.expect
@@ -0,0 +1,30 @@
+@test::a
+@test::A::•(1)
+library test;
+import self as self;
+import "dart:core" as core;
+
+typedef F1 = () →* void;
+typedef F2 = () →* void;
+class A extends core::Object {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+}
+@self::a
+@self::A::•(2)
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+}
+static const field core::Object* a = const core::Object::•();
+@self::a
+@self::A::•(3)
+static field core::int* f1;
+@self::a
+@self::A::•(3)
+static field core::int* f2;
+@self::a
+@self::A::•(4)
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.strong.expect b/pkg/front_end/testcases/general/annotation_top.dart.strong.expect
new file mode 100644
index 0000000..6f2d3774
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.strong.expect
@@ -0,0 +1,39 @@
+@#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 {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+}
+@#C1
+@#C2
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
diff --git a/pkg/front_end/testcases/general/annotation_top.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_top.dart.strong.transformed.expect
new file mode 100644
index 0000000..6f2d3774
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_top.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+@#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 {
+  const constructor •(core::int* value) → self::A*
+    : super core::Object::•()
+    ;
+}
+@#C1
+@#C2
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
diff --git a/pkg/front_end/testcases/annotation_typedef_formals.dart b/pkg/front_end/testcases/general/annotation_typedef_formals.dart
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals.dart
rename to pkg/front_end/testcases/general/annotation_typedef_formals.dart
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.legacy.expect
new file mode 100644
index 0000000..d6f9911
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.legacy.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.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d6f9911
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.legacy.transformed.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.dart.outline.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.outline.expect
new file mode 100644
index 0000000..c1deefb
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (core::int*, core::num*, {w: core::Object*, z: core::String*}) →* void;
+typedef G = (core::int*, core::num*, [core::String*, core::Object*]) →* void;
+static const field core::int* foo = 21;
+static const field core::int* bar = 42;
+static const field core::int* baz = 84;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals.dart.strong.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.strong.expect
new file mode 100644
index 0000000..d6f9911
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.strong.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.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.strong.transformed.expect
new file mode 100644
index 0000000..d6f9911
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals.dart.strong.transformed.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/annotation_typedef_formals_resolution.dart b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart
similarity index 100%
rename from pkg/front_end/testcases/annotation_typedef_formals_resolution.dart
rename to pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.legacy.expect
new file mode 100644
index 0000000..9bab9c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.legacy.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_typedef_formals_resolution.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9bab9c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.legacy.transformed.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_typedef_formals_resolution.dart.outline.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.outline.expect
new file mode 100644
index 0000000..4c75196
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef F = (core::int*) →* core::int*;
+static const field core::int* app = 0;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.strong.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.strong.expect
new file mode 100644
index 0000000..9bab9c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.strong.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_typedef_formals_resolution.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.strong.transformed.expect
new file mode 100644
index 0000000..9bab9c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_typedef_formals_resolution.dart.strong.transformed.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/annotation_variable_declaration.dart b/pkg/front_end/testcases/general/annotation_variable_declaration.dart
similarity index 100%
rename from pkg/front_end/testcases/annotation_variable_declaration.dart
rename to pkg/front_end/testcases/general/annotation_variable_declaration.dart
diff --git a/pkg/front_end/testcases/annotation_variable_declaration.dart.hierarchy.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/annotation_variable_declaration.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/annotation_variable_declaration.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.expect
new file mode 100644
index 0000000..cbeb9b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({@#C1 dynamic named}) →* dynamic;
+class Bar extends core::Object {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+}
+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 dynamic localWithInitializer = "hello";
+    @#C1 @#C2 dynamic localGroupPart1;
+    @#C1 @#C2 dynamic localGroupPart2;
+    function naebdyr(@#C1 dynamic nestedFormal) → dynamic
+      return null;
+    dynamic roedmus = (@#C1 dynamic closureFormal) → dynamic => null;
+  }
+  method hest({@#C1 dynamic named = #C3}) → dynamic
+    return null;
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Bar {}
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cbeb9b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({@#C1 dynamic named}) →* dynamic;
+class Bar extends core::Object {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+}
+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 dynamic localWithInitializer = "hello";
+    @#C1 @#C2 dynamic localGroupPart1;
+    @#C1 @#C2 dynamic localGroupPart2;
+    function naebdyr(@#C1 dynamic nestedFormal) → dynamic
+      return null;
+    dynamic roedmus = (@#C1 dynamic closureFormal) → dynamic => null;
+  }
+  method hest({@#C1 dynamic named = #C3}) → dynamic
+    return null;
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Bar {}
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.outline.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.outline.expect
new file mode 100644
index 0000000..368f1dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({named: dynamic}) →* dynamic;
+class Bar extends core::Object {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+}
+class Baz extends core::Object {
+  constructor •(dynamic constructorFormal) → self::Baz*
+    ;
+  static factory bazFactory(dynamic factoryFormal) → self::Baz*
+    ;
+  method fisk(dynamic formal1, dynamic formal2, dynamic formal3, dynamic formal4, [dynamic optional]) → dynamic
+    ;
+  method hest({dynamic named}) → dynamic
+    ;
+}
+static const field core::int* foo = 42;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
new file mode 100644
index 0000000..18047a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({@#C1 dynamic named}) →* dynamic;
+class Bar extends core::Object {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+}
+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) → core::Null*
+      return null;
+    (dynamic) →* core::Null* roedmus = (@#C1 dynamic closureFormal) → core::Null* => null;
+  }
+  method hest({@#C1 dynamic named = #C3}) → dynamic
+    return null;
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Bar {}
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
new file mode 100644
index 0000000..18047a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/annotation_variable_declaration.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef hest_t = ({@#C1 dynamic named}) →* dynamic;
+class Bar extends core::Object {
+  const constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  const constructor named(dynamic x) → self::Bar*
+    : super core::Object::•()
+    ;
+}
+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) → core::Null*
+      return null;
+    (dynamic) →* core::Null* roedmus = (@#C1 dynamic closureFormal) → core::Null* => null;
+  }
+  method hest({@#C1 dynamic named = #C3}) → dynamic
+    return null;
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 42
+  #C2 = self::Bar {}
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/argument.dart b/pkg/front_end/testcases/general/argument.dart
similarity index 100%
rename from pkg/front_end/testcases/argument.dart
rename to pkg/front_end/testcases/general/argument.dart
diff --git a/pkg/front_end/testcases/argument.dart.hierarchy.expect b/pkg/front_end/testcases/general/argument.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/argument.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/argument.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/argument.dart.legacy.expect b/pkg/front_end/testcases/general/argument.dart.legacy.expect
new file mode 100644
index 0000000..dc04225a
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+}
+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.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 = tearoff self::foo_escaped
+  #C2 = tearoff self::bar_escaped
+}
diff --git a/pkg/front_end/testcases/general/argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/argument.dart.legacy.transformed.expect
new file mode 100644
index 0000000..dc04225a
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+}
+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.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 = tearoff self::foo_escaped
+  #C2 = tearoff self::bar_escaped
+}
diff --git a/pkg/front_end/testcases/general/argument.dart.outline.expect b/pkg/front_end/testcases/general/argument.dart.outline.expect
new file mode 100644
index 0000000..bf52159
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.outline.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    ;
+}
+class Foo extends self::Base {
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class Bar extends self::Base {
+  synthetic constructor •() → self::Bar*
+    ;
+}
+class Baz extends self::Base {
+  synthetic constructor •() → self::Baz*
+    ;
+}
+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
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/argument.dart.strong.expect b/pkg/front_end/testcases/general/argument.dart.strong.expect
new file mode 100644
index 0000000..dc04225a
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+}
+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.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 = tearoff self::foo_escaped
+  #C2 = tearoff self::bar_escaped
+}
diff --git a/pkg/front_end/testcases/general/argument.dart.strong.transformed.expect b/pkg/front_end/testcases/general/argument.dart.strong.transformed.expect
new file mode 100644
index 0000000..dc04225a
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    : super core::Object::•()
+    ;
+}
+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.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 = tearoff self::foo_escaped
+  #C2 = tearoff self::bar_escaped
+}
diff --git a/pkg/front_end/testcases/argument_mismatch.dart b/pkg/front_end/testcases/general/argument_mismatch.dart
similarity index 100%
rename from pkg/front_end/testcases/argument_mismatch.dart
rename to pkg/front_end/testcases/general/argument_mismatch.dart
diff --git a/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.expect b/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.expect
new file mode 100644
index 0000000..d5c1bd2
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   /*@warning=MethodNotFound*/ 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;
+import "dart:core" as core;
+
+static method foo() → dynamic {}
+static method test() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d5c1bd2
--- /dev/null
+++ b/pkg/front_end/testcases/general/argument_mismatch.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/argument_mismatch.dart:8:34: Warning: Too many positional arguments: 0 allowed, but 1 found.
+// Try removing the extra positional arguments.
+//   /*@warning=MethodNotFound*/ 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;
+import "dart:core" as core;
+
+static method foo() → dynamic {}
+static method test() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.outline.expect b/pkg/front_end/testcases/general/argument_mismatch.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/argument_mismatch.dart.outline.expect
rename to pkg/front_end/testcases/general/argument_mismatch.dart.outline.expect
diff --git a/pkg/front_end/testcases/argument_mismatch.dart.strong.expect b/pkg/front_end/testcases/general/argument_mismatch.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/argument_mismatch.dart.strong.expect
rename to pkg/front_end/testcases/general/argument_mismatch.dart.strong.expect
diff --git a/pkg/front_end/testcases/arithmetic.dart b/pkg/front_end/testcases/general/arithmetic.dart
similarity index 100%
rename from pkg/front_end/testcases/arithmetic.dart
rename to pkg/front_end/testcases/general/arithmetic.dart
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.legacy.expect b/pkg/front_end/testcases/general/arithmetic.dart.legacy.expect
new file mode 100644
index 0000000..e86ef65
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.legacy.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* {
+  dynamic z = x.+(y);
+  return z.<<(4);
+}
+static method loop(core::List<dynamic>* xs) → void {
+  core::int* _ = xs.length;
+  for (core::int* i = 0; i.<(xs.length); i = i.+(1)) {
+  }
+}
+static method main() → dynamic {
+  self::foo(4, 5);
+  self::foo(6, 7);
+  self::loop(<dynamic>["dfg"]);
+}
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/arithmetic.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e86ef65
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.legacy.transformed.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* {
+  dynamic z = x.+(y);
+  return z.<<(4);
+}
+static method loop(core::List<dynamic>* xs) → void {
+  core::int* _ = xs.length;
+  for (core::int* i = 0; i.<(xs.length); i = i.+(1)) {
+  }
+}
+static method main() → dynamic {
+  self::foo(4, 5);
+  self::foo(6, 7);
+  self::loop(<dynamic>["dfg"]);
+}
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.outline.expect b/pkg/front_end/testcases/general/arithmetic.dart.outline.expect
new file mode 100644
index 0000000..6a82a38
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method foo(core::int* x, core::int* y) → core::int*
+  ;
+static method loop(core::List<dynamic>* xs) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.strong.expect b/pkg/front_end/testcases/general/arithmetic.dart.strong.expect
new file mode 100644
index 0000000..ed95ed2
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.strong.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);
+  return z.{core::int::<<}(4);
+}
+static method loop(core::List<dynamic>* xs) → void {
+  core::int* _ = xs.{core::List::length};
+  for (core::int* i = 0; i.{core::num::<}(xs.{core::List::length}); i = i.{core::num::+}(1)) {
+  }
+}
+static method main() → dynamic {
+  self::foo(4, 5);
+  self::foo(6, 7);
+  self::loop(<dynamic>["dfg"]);
+}
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.expect
new file mode 100644
index 0000000..ed95ed2
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.strong.transformed.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);
+  return z.{core::int::<<}(4);
+}
+static method loop(core::List<dynamic>* xs) → void {
+  core::int* _ = xs.{core::List::length};
+  for (core::int* i = 0; i.{core::num::<}(xs.{core::List::length}); i = i.{core::num::+}(1)) {
+  }
+}
+static method main() → dynamic {
+  self::foo(4, 5);
+  self::foo(6, 7);
+  self::loop(<dynamic>["dfg"]);
+}
diff --git a/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect b/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect
new file mode 100644
index 0000000..ec473b6
--- /dev/null
+++ b/pkg/front_end/testcases/general/arithmetic.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/arithmetic.dart:11:35: Context: Write to i@330
+  for (int i = 0; i < xs.length; i++) {}
+                                  ^^
diff --git a/pkg/front_end/testcases/arrow_function.dart b/pkg/front_end/testcases/general/arrow_function.dart
similarity index 100%
rename from pkg/front_end/testcases/arrow_function.dart
rename to pkg/front_end/testcases/general/arrow_function.dart
diff --git a/pkg/front_end/testcases/general/arrow_function.dart.legacy.expect b/pkg/front_end/testcases/general/arrow_function.dart.legacy.expect
new file mode 100644
index 0000000..bf47b44
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.legacy.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 () → dynamic => self::main::T*;
diff --git a/pkg/front_end/testcases/general/arrow_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/arrow_function.dart.legacy.transformed.expect
new file mode 100644
index 0000000..bf47b44
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.legacy.transformed.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 () → dynamic => self::main::T*;
diff --git a/pkg/front_end/testcases/general/arrow_function.dart.outline.expect b/pkg/front_end/testcases/general/arrow_function.dart.outline.expect
new file mode 100644
index 0000000..5ea07d3
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.outline.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main<T extends core::Object* = dynamic>() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/arrow_function.dart.strong.expect b/pkg/front_end/testcases/general/arrow_function.dart.strong.expect
new file mode 100644
index 0000000..964b0b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.strong.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/arrow_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/arrow_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..964b0b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/arrow_function.dart.strong.transformed.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/async_function.dart b/pkg/front_end/testcases/general/async_function.dart
similarity index 100%
rename from pkg/front_end/testcases/async_function.dart
rename to pkg/front_end/testcases/general/async_function.dart
diff --git a/pkg/front_end/testcases/general/async_function.dart.legacy.expect b/pkg/front_end/testcases/general/async_function.dart.legacy.expect
new file mode 100644
index 0000000..5560cd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.legacy.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 = <dynamic>["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_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/async_function.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0b171f1
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.legacy.transformed.expect
@@ -0,0 +1,205 @@
+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 = <dynamic>["bar"];
+static method asyncString() → asy::Future<core::String*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "foo";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method asyncString2() → asy::Future<core::String*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = self::asyncString();
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method syncStarString() → core::Iterable<core::String*>* /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String*>* :iterator) → core::bool* yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String*>(:sync_op);
+}
+static method syncStarString2() → core::Iterable<core::String*>* /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String*>* :iterator) → core::bool* yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String*>(:sync_op);
+}
+static method asyncStarString() → asy::Stream<core::String*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String*>* :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L3:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
+            return null;
+          else
+            [yield] null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String*>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method asyncStarString2() → asy::Stream<core::String*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String*>* :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L4:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String*>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+        core::String* str = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/general/async_function.dart.outline.expect b/pkg/front_end/testcases/general/async_function.dart.outline.expect
new file mode 100644
index 0000000..ee58d22
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.outline.expect
@@ -0,0 +1,22 @@
+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;
+static method asyncString() → asy::Future<core::String*>*
+  ;
+static method asyncString2() → asy::Future<core::String*>*
+  ;
+static method syncStarString() → core::Iterable<core::String*>*
+  ;
+static method syncStarString2() → core::Iterable<core::String*>*
+  ;
+static method asyncStarString() → asy::Stream<core::String*>*
+  ;
+static method asyncStarString2() → asy::Stream<core::String*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/async_function.dart.strong.expect b/pkg/front_end/testcases/general/async_function.dart.strong.expect
new file mode 100644
index 0000000..4a640a9
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.strong.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_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca61355
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_function.dart.strong.transformed.expect
@@ -0,0 +1,205 @@
+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*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "foo";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method asyncString2() → asy::Future<core::String*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = self::asyncString();
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method syncStarString() → core::Iterable<core::String*>* /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String*>* :iterator) → core::bool* yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::syncStarString2();
+        [yield] true;
+      }
+      {
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = self::stringList;
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String*>(:sync_op);
+}
+static method syncStarString2() → core::Iterable<core::String*>* /* originally sync* */ {
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :sync_op(core::_SyncIterator<core::String*>* :iterator) → core::bool* yielding {
+    {
+      {
+        :iterator.{core::_SyncIterator::_current} = "foo";
+        [yield] true;
+      }
+    }
+    return false;
+  }
+  return new core::_SyncIterable::•<core::String*>(:sync_op);
+}
+static method asyncStarString() → asy::Stream<core::String*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String*>* :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L3:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("foo"))
+            return null;
+          else
+            [yield] null;
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::asyncStarString2()))
+            return null;
+          else
+            [yield] null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+          if(:controller.{asy::_AsyncStarStreamController::add}(:result))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String*>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method asyncStarString2() → asy::Stream<core::String*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::String*>* :controller;
+  dynamic :controller_stream;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try
+      try {
+        #L4:
+        {
+          if(:controller.{asy::_AsyncStarStreamController::add}("bar"))
+            return null;
+          else
+            [yield] null;
+        }
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :controller.{asy::_AsyncStarStreamController::addError}(:exception, :stack_trace);
+      }
+    finally {
+      :controller.{asy::_AsyncStarStreamController::close}();
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::String*>(:async_op);
+  :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
+  return :controller_stream;
+}
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L5:
+      {
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::asyncString(), :async_op_then, :async_op_error, :async_op) in null;
+        core::String* str = :result;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/async_nested.dart b/pkg/front_end/testcases/general/async_nested.dart
similarity index 100%
rename from pkg/front_end/testcases/async_nested.dart
rename to pkg/front_end/testcases/general/async_nested.dart
diff --git a/pkg/front_end/testcases/async_nested.dart.hierarchy.expect b/pkg/front_end/testcases/general/async_nested.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/async_nested.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/async_nested.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/async_nested.dart.legacy.expect b/pkg/front_end/testcases/general/async_nested.dart.legacy.expect
new file mode 100644
index 0000000..072ebb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.legacy.expect
@@ -0,0 +1,32 @@
+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}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
+  method toSimpleString() → dynamic {
+    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
+    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
+  }
+}
+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", <dynamic>[new self::Node::•("2", <dynamic>[]), await asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[await asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[]))])), await asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), await asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[]))])]))])), await asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[]))]);
+  core::String* actual = node.toSimpleString();
+  core::print(actual);
+  if(!actual.==(expected)) {
+    throw "Expected '${expected}' but got '${actual}'";
+  }
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/async_nested.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/async_nested.dart.legacy.transformed.expect
new file mode 100644
index 0000000..46bb29f
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.legacy.transformed.expect
@@ -0,0 +1,70 @@
+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}}:[${let final dynamic #t1 = this.{self::Node::nested} in #t1.==(null) ? null : #t1.join(", ")}]>";
+  method toSimpleString() → dynamic {
+    dynamic tmp = let final dynamic #t2 = this.{self::Node::nested} in #t2.==(null) ? null : #t2.map((dynamic child) → dynamic => child.toSimpleString());
+    return "${this.{self::Node::name}} ${let final dynamic #t3 = tmp in #t3.==(null) ? null : #t3.join(" ")}".trim();
+  }
+}
+static method main() → void /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String* expected = "1 2 3 4 5 6 7 8 9 10";
+        :async_temporary_2 = new self::Node::•("2", <dynamic>[]);
+        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("7", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("6", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_1 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("8", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("9", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("4", <dynamic>[new self::Node::•("5", <dynamic>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("3", <dynamic>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<dynamic>(new self::Node::•("10", <dynamic>[])), :async_op_then, :async_op_error, :async_op) in null;
+        self::Node* node = new self::Node::•("1", <dynamic>[:async_temporary_2, :async_temporary_0, :result]);
+        core::String* actual = node.toSimpleString();
+        core::print(actual);
+        if(!actual.==(expected)) {
+          throw "Expected '${expected}' but got '${actual}'";
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/async_nested.dart.outline.expect b/pkg/front_end/testcases/general/async_nested.dart.outline.expect
new file mode 100644
index 0000000..0f6f92e
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+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]) → self::Node*
+    ;
+  method toString() → core::String*
+    ;
+  method toSimpleString() → dynamic
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/async_nested.dart.strong.expect b/pkg/front_end/testcases/general/async_nested.dart.strong.expect
new file mode 100644
index 0000000..c01b082
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.strong.expect
@@ -0,0 +1,32 @@
+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}}:[${let final core::List<self::Node*>* #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String*} null : #t1.{core::Iterable::join}(", ")}]>";
+  method toSimpleString() → dynamic {
+    core::Iterable<dynamic>* tmp = let final core::List<self::Node*>* #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>*} null : #t2.{core::Iterable::map}<dynamic>((self::Node* child) → dynamic => child.{self::Node::toSimpleString}());
+    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic>* #t3 = tmp in #t3.==(null) ?{core::String*} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
+  }
+}
+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}() as{TypeError} core::String*;
+  core::print(actual);
+  if(!actual.{core::String::==}(expected)) {
+    throw "Expected '${expected}' but got '${actual}'";
+  }
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
new file mode 100644
index 0000000..730f857
--- /dev/null
+++ b/pkg/front_end/testcases/general/async_nested.dart.strong.transformed.expect
@@ -0,0 +1,70 @@
+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}}:[${let final core::List<self::Node*>* #t1 = this.{self::Node::nested} in #t1.==(null) ?{core::String*} null : #t1.{core::Iterable::join}(", ")}]>";
+  method toSimpleString() → dynamic {
+    core::Iterable<dynamic>* tmp = let final core::List<self::Node*>* #t2 = this.{self::Node::nested} in #t2.==(null) ?{core::Iterable<dynamic>*} null : #t2.{core::Iterable::map}<dynamic>((self::Node* child) → dynamic => child.{self::Node::toSimpleString}());
+    return "${this.{self::Node::name}} ${let final core::Iterable<dynamic>* #t3 = tmp in #t3.==(null) ?{core::String*} null : #t3.{core::Iterable::join}(" ")}".{core::String::trim}();
+  }
+}
+static method main() → void /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :async_temporary_0;
+  dynamic :async_temporary_1;
+  dynamic :async_temporary_2;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        core::String* expected = "1 2 3 4 5 6 7 8 9 10";
+        :async_temporary_2 = new self::Node::•("2", <self::Node*>[]);
+        [yield] let dynamic #t4 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("7", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t5 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("6", <self::Node*>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_1 = :result;
+        [yield] let dynamic #t6 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("8", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t7 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("9", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t8 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("4", <self::Node*>[new self::Node::•("5", <self::Node*>[:async_temporary_1, :async_temporary_0, :result])])), :async_op_then, :async_op_error, :async_op) in null;
+        [yield] let dynamic #t9 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("3", <self::Node*>[:result])), :async_op_then, :async_op_error, :async_op) in null;
+        :async_temporary_0 = :result;
+        [yield] let dynamic #t10 = asy::_awaitHelper(asy::Future::value<self::Node*>(new self::Node::•("10", <self::Node*>[])), :async_op_then, :async_op_error, :async_op) in null;
+        self::Node* node = new self::Node::•("1", <self::Node*>[:async_temporary_2, :async_temporary_0, :result]);
+        core::String* actual = node.{self::Node::toSimpleString}() as{TypeError} core::String*;
+        core::print(actual);
+        if(!actual.{core::String::==}(expected)) {
+          throw "Expected '${expected}' but got '${actual}'";
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/await.dart b/pkg/front_end/testcases/general/await.dart
similarity index 100%
rename from pkg/front_end/testcases/await.dart
rename to pkg/front_end/testcases/general/await.dart
diff --git a/pkg/front_end/testcases/await.dart.legacy.expect b/pkg/front_end/testcases/general/await.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/await.dart.legacy.expect
rename to pkg/front_end/testcases/general/await.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/await.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/await.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1e0da3e
--- /dev/null
+++ b/pkg/front_end/testcases/general/await.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/await.dart.outline.expect b/pkg/front_end/testcases/general/await.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/await.dart.outline.expect
rename to pkg/front_end/testcases/general/await.dart.outline.expect
diff --git a/pkg/front_end/testcases/await.dart.strong.expect b/pkg/front_end/testcases/general/await.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/await.dart.strong.expect
rename to pkg/front_end/testcases/general/await.dart.strong.expect
diff --git a/pkg/front_end/testcases/general/await.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await.dart.strong.transformed.expect
new file mode 100644
index 0000000..1e0da3e
--- /dev/null
+++ b/pkg/front_end/testcases/general/await.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+static method main() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        [yield] let dynamic #t1 = asy::_awaitHelper("Hello, World!", :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/await_in_non_async.dart b/pkg/front_end/testcases/general/await_in_non_async.dart
similarity index 100%
rename from pkg/front_end/testcases/await_in_non_async.dart
rename to pkg/front_end/testcases/general/await_in_non_async.dart
diff --git a/pkg/front_end/testcases/general/await_in_non_async.dart.legacy.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.legacy.expect
new file mode 100644
index 0000000..aa3b0e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_non_async.dart.legacy.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/await_in_non_async.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.legacy.transformed.expect
new file mode 100644
index 0000000..aa3b0e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_non_async.dart.legacy.transformed.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/await_in_non_async.dart.outline.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/await_in_non_async.dart.outline.expect
rename to pkg/front_end/testcases/general/await_in_non_async.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/await_in_non_async.dart.strong.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.strong.expect
new file mode 100644
index 0000000..aa3b0e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_non_async.dart.strong.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/await_in_non_async.dart.strong.transformed.expect b/pkg/front_end/testcases/general/await_in_non_async.dart.strong.transformed.expect
new file mode 100644
index 0000000..aa3b0e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/await_in_non_async.dart.strong.transformed.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/bad_setter_abstract.dart b/pkg/front_end/testcases/general/bad_setter_abstract.dart
similarity index 100%
rename from pkg/front_end/testcases/bad_setter_abstract.dart
rename to pkg/front_end/testcases/general/bad_setter_abstract.dart
diff --git a/pkg/front_end/testcases/bad_setter_abstract.dart.hierarchy.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bad_setter_abstract.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bad_setter_abstract.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.legacy.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.legacy.expect
new file mode 100644
index 0000000..81a0b91
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.legacy.expect
@@ -0,0 +1,159 @@
+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: Warning: 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 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;
+      ;
+    }
+  }
+}
+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::•().a = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    new 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_setter_abstract.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.legacy.transformed.expect
new file mode 100644
index 0000000..81a0b91
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.legacy.transformed.expect
@@ -0,0 +1,159 @@
+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: Warning: 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 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;
+      ;
+    }
+  }
+}
+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::•().a = null;
+    threw = false;
+  }
+  on dynamic catch(final dynamic e) {
+  }
+  if(!threw) {
+    throw "Expected an error above.";
+  }
+  try {
+    threw = true;
+    new 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_setter_abstract.dart.outline.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.outline.expect
new file mode 100644
index 0000000..ce6d915
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.outline.expect
@@ -0,0 +1,39 @@
+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);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  set a(dynamic #synthetic) → void
+    ;
+  set d(dynamic #synthetic) → void
+    ;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  set a(dynamic #synthetic) → void
+    ;
+  set d(dynamic #synthetic) → void
+    ;
+}
+static set b(dynamic #synthetic) → void
+  ;
+static set c(dynamic #synthetic) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bad_setter_abstract.dart.strong.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.strong.expect
new file mode 100644
index 0000000..d027435
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.strong.expect
@@ -0,0 +1,159 @@
+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 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;
+      ;
+    }
+  }
+}
+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_setter_abstract.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.strong.transformed.expect
new file mode 100644
index 0000000..d027435
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.strong.transformed.expect
@@ -0,0 +1,159 @@
+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 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;
+      ;
+    }
+  }
+}
+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_setter_abstract.dart.type_promotion.expect b/pkg/front_end/testcases/general/bad_setter_abstract.dart.type_promotion.expect
new file mode 100644
index 0000000..4ea66ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_setter_abstract.dart.type_promotion.expect
@@ -0,0 +1,30 @@
+pkg/front_end/testcases/general/bad_setter_abstract.dart:22:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:24:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:32:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:34:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:42:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:44:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:55:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:57:11: Context: Write to threw@344
+    threw = false;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:65:11: Context: Write to threw@344
+    threw = true;
+          ^
+pkg/front_end/testcases/general/bad_setter_abstract.dart:67:11: Context: Write to threw@344
+    threw = false;
+          ^
diff --git a/pkg/front_end/testcases/bad_store.dart b/pkg/front_end/testcases/general/bad_store.dart
similarity index 100%
rename from pkg/front_end/testcases/bad_store.dart
rename to pkg/front_end/testcases/general/bad_store.dart
diff --git a/pkg/front_end/testcases/bad_store.dart.hierarchy.expect b/pkg/front_end/testcases/general/bad_store.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bad_store.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bad_store.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bad_store.dart.legacy.expect b/pkg/front_end/testcases/general/bad_store.dart.legacy.expect
new file mode 100644
index 0000000..a2ace71
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.legacy.expect
@@ -0,0 +1,24 @@
+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::•()
+    ;
+}
+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.length.>(1)) {
+    foo.field = "string";
+    dynamic first = foo.field;
+    self::use(first);
+    foo.noField = "string";
+    dynamic second = foo.noField;
+    self::use(second);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_store.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bad_store.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a2ace71
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.legacy.transformed.expect
@@ -0,0 +1,24 @@
+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::•()
+    ;
+}
+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.length.>(1)) {
+    foo.field = "string";
+    dynamic first = foo.field;
+    self::use(first);
+    foo.noField = "string";
+    dynamic second = foo.noField;
+    self::use(second);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_store.dart.outline.expect b/pkg/front_end/testcases/general/bad_store.dart.outline.expect
new file mode 100644
index 0000000..fb4d3f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic field;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+static method identity(dynamic x) → dynamic
+  ;
+static method use(dynamic x) → void
+  ;
+static method main(core::List<core::String*>* args) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bad_store.dart.strong.expect b/pkg/front_end/testcases/general/bad_store.dart.strong.expect
new file mode 100644
index 0000000..2882852
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.strong.expect
@@ -0,0 +1,24 @@
+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::•()
+    ;
+}
+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::num::>}(1)) {
+    foo.field = "string";
+    dynamic first = foo.field;
+    self::use(first);
+    foo.noField = "string";
+    dynamic second = foo.noField;
+    self::use(second);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_store.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bad_store.dart.strong.transformed.expect
new file mode 100644
index 0000000..2882852
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_store.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+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::•()
+    ;
+}
+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::num::>}(1)) {
+    foo.field = "string";
+    dynamic first = foo.field;
+    self::use(first);
+    foo.noField = "string";
+    dynamic second = foo.noField;
+    self::use(second);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart
new file mode 100644
index 0000000..44f446d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart
@@ -0,0 +1,88 @@
+// 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.
+
+typedef ContravariantUse<T> = Function(T);
+
+typedef InvariantUse<T> = T Function(T);
+
+class Empty {}
+
+class A<T> {}
+
+class B<T> extends A<Function(T)> {}
+
+class Bc<T> extends A<ContravariantUse<T>> {}
+
+class Bi<T> extends A<InvariantUse<T>> {}
+
+class C<T> implements A<Function(T)> {}
+
+class Cc<T> implements A<ContravariantUse<T>> {}
+
+class Ci<T> implements A<InvariantUse<T>> {}
+
+class D<T> = Object with A<Function(T)>;
+
+class Dc<T> = Object with A<ContravariantUse<T>>;
+
+class Di<T> = Object with A<InvariantUse<T>>;
+
+class E<T> = A<Function(T)> with Empty;
+
+class Ec<T> = A<ContravariantUse<T>> with Empty;
+
+class Ei<T> = A<InvariantUse<T>> with Empty;
+
+class F<T> extends Object with A<Function(T)> {}
+
+class Fc<T> extends Object with A<ContravariantUse<T>> {}
+
+class Fi<T> extends Object with A<InvariantUse<T>> {}
+
+class G<T> extends A<Function(T)> with Empty {}
+
+class Gc<T> extends A<ContravariantUse<T>> with Empty {}
+
+class Gi<T> extends A<InvariantUse<T>> with Empty {}
+
+class Hff<T> extends A<Function(Function(T))> {}
+
+class Hfc<T> extends A<Function(ContravariantUse<T>)> {}
+
+class Hcf<T> extends A<ContravariantUse<Function(T)>> {}
+
+class Hcc<T> extends A<ContravariantUse<ContravariantUse<T>>> {}
+
+class Hii<T> extends A<InvariantUse<InvariantUse<T>>> {}
+
+class Iafc<T> extends A<A<Function(ContravariantUse<T>)>> {}
+
+class Iacf<T> extends A<A<ContravariantUse<Function(T)>>> {}
+
+class Ifac<T> extends A<Function(A<ContravariantUse<T>>)> {}
+
+class Ifca<T> extends A<Function(ContravariantUse<A<T>>)> {}
+
+class Icaf<T> extends A<ContravariantUse<A<Function(T)>>> {}
+
+class Icfa<T> extends A<ContravariantUse<Function(A<T>)>> {}
+
+class Jfff<T> extends A<Function(Function(Function(T)))> {}
+
+class Jffc<T> extends A<Function(Function(ContravariantUse<T>))> {}
+
+class Jfcf<T> extends A<Function(ContravariantUse<Function(T)>)> {}
+
+class Jfcc<T> extends A<Function(ContravariantUse<ContravariantUse<T>>)> {}
+
+class Jcff<T> extends A<ContravariantUse<Function(Function(T))>> {}
+
+class Jcfc<T> extends A<ContravariantUse<Function(ContravariantUse<T>)>> {}
+
+class Jccf<T> extends A<ContravariantUse<ContravariantUse<Function(T)>>> {}
+
+class Jccc<T>
+    extends A<ContravariantUse<ContravariantUse<ContravariantUse<T>>>> {}
+
+main() {}
diff --git a/pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.hierarchy.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bad_type_variable_uses_in_supertypes.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.expect
new file mode 100644
index 0000000..133519d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.expect
@@ -0,0 +1,343 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    : super core::Object::•()
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Di<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+}
+class E<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ec<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ei<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cf5fe36
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.legacy.transformed.expect
@@ -0,0 +1,343 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    : super core::Object::•()
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Di<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+}
+class E<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ec<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ei<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.outline.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.outline.expect
new file mode 100644
index 0000000..737b3a9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.outline.expect
@@ -0,0 +1,305 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    ;
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    ;
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Di<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+}
+class E<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    ;
+}
+class Ec<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    ;
+}
+class Ei<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    ;
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+class F<T extends core::Object* = dynamic> extends self::_F&Object&A<self::F::T*> {
+  synthetic constructor •() → self::F<self::F::T*>*
+    ;
+}
+abstract class _Fc&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+class Fc<T extends core::Object* = dynamic> extends self::_Fc&Object&A<self::Fc::T*> {
+  synthetic constructor •() → self::Fc<self::Fc::T*>*
+    ;
+}
+abstract class _Fi&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+class Fi<T extends core::Object* = dynamic> extends self::_Fi&Object&A<self::Fi::T*> {
+  synthetic constructor •() → self::Fi<self::Fi::T*>*
+    ;
+}
+abstract class _G&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    ;
+}
+class G<T extends core::Object* = dynamic> extends self::_G&A&Empty<self::G::T*> {
+  synthetic constructor •() → self::G<self::G::T*>*
+    ;
+}
+abstract class _Gc&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    ;
+}
+class Gc<T extends core::Object* = dynamic> extends self::_Gc&A&Empty<self::Gc::T*> {
+  synthetic constructor •() → self::Gc<self::Gc::T*>*
+    ;
+}
+abstract class _Gi&A&Empty<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    ;
+}
+class Gi<T extends core::Object* = dynamic> extends self::_Gi&A&Empty<self::Gi::T*> {
+  synthetic constructor •() → self::Gi<self::Gi::T*>*
+    ;
+}
+class Hff<T extends core::Object* = dynamic> extends self::A<((self::Hff::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hff<self::Hff::T*>*
+    ;
+}
+class Hfc<T extends core::Object* = dynamic> extends self::A<((self::Hfc::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hfc<self::Hfc::T*>*
+    ;
+}
+class Hcf<T extends core::Object* = dynamic> extends self::A<((self::Hcf::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hcf<self::Hcf::T*>*
+    ;
+}
+class Hcc<T extends core::Object* = dynamic> extends self::A<((self::Hcc::T*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Hcc<self::Hcc::T*>*
+    ;
+}
+class Hii<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hii<self::Hii::T*>*
+    ;
+}
+class Iafc<T extends core::Object* = dynamic> extends self::A<self::A<((self::Iafc::T*) →* dynamic) →* dynamic>*> {
+  synthetic constructor •() → self::Iafc<self::Iafc::T*>*
+    ;
+}
+class Iacf<T extends core::Object* = dynamic> extends self::A<self::A<((self::Iacf::T*) →* dynamic) →* dynamic>*> {
+  synthetic constructor •() → self::Iacf<self::Iacf::T*>*
+    ;
+}
+class Ifac<T extends core::Object* = dynamic> extends self::A<(self::A<(self::Ifac::T*) →* dynamic>*) →* dynamic> {
+  synthetic constructor •() → self::Ifac<self::Ifac::T*>*
+    ;
+}
+class Ifca<T extends core::Object* = dynamic> extends self::A<((self::A<self::Ifca::T*>*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Ifca<self::Ifca::T*>*
+    ;
+}
+class Icaf<T extends core::Object* = dynamic> extends self::A<(self::A<(self::Icaf::T*) →* dynamic>*) →* dynamic> {
+  synthetic constructor •() → self::Icaf<self::Icaf::T*>*
+    ;
+}
+class Icfa<T extends core::Object* = dynamic> extends self::A<((self::A<self::Icfa::T*>*) →* dynamic) →* dynamic> {
+  synthetic constructor •() → self::Icfa<self::Icfa::T*>*
+    ;
+}
+class Jfff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfff<self::Jfff::T*>*
+    ;
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    ;
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    ;
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    ;
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    ;
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    ;
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    ;
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.expect
new file mode 100644
index 0000000..133519d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.expect
@@ -0,0 +1,343 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    : super core::Object::•()
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Di<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+}
+class E<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ec<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ei<T extends core::Object* = dynamic> = core::Object with self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect
new file mode 100644
index 0000000..cf5fe36
--- /dev/null
+++ b/pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart.strong.transformed.expect
@@ -0,0 +1,343 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bad_type_variable_uses_in_supertypes.dart:13:7: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' in supertype 'A'.
+// class Jccc<T>
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef ContravariantUse<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef InvariantUse<T extends core::Object* = dynamic> = (T*) →* T*;
+class Empty extends core::Object {
+  synthetic constructor •() → self::Empty*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bc<self::Bc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Bi<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bi<self::Bi::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+class Cc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cc<self::Cc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ci<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Ci<self::Ci::T*>*
+    : super core::Object::•()
+    ;
+}
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::D<self::D::T*>*
+    : super core::Object::•()
+    ;
+}
+class Dc<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Dc<self::Dc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Di<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::Di<self::Di::T*>*
+    : super core::Object::•()
+    ;
+}
+class E<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::E<self::E::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ec<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::Ec<self::Ec::T*>*
+    : super core::Object::•()
+    ;
+}
+class Ei<T extends core::Object* = dynamic> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::Ei<self::Ei::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _F&Object&A<T extends core::Object* = dynamic> extends core::Object {
+  const synthetic constructor •() → self::_F&Object&A<self::_F&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fc&Object&A<self::_Fc&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_Fi&Object&A<self::_Fi&Object&A::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_G&A&Empty<self::_G&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_Gc&A&Empty<self::_Gc&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Empty {
+  synthetic constructor •() → self::_Gi&A&Empty<self::_Gi&A&Empty::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Jffc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jffc<self::Jffc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcf<self::Jfcf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jfcc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jfcc<self::Jfcc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcff<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcff<self::Jcff::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jcfc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jcfc<self::Jcfc::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccf<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccf<self::Jccf::T*>*
+    : super core::Object::•()
+    ;
+}
+class Jccc<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Jccc<self::Jccc::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/bounds_check_depends_on_inference.dart
rename to pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart
diff --git a/pkg/front_end/testcases/bounds_check_depends_on_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bounds_check_depends_on_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.expect
new file mode 100644
index 0000000..6beeebd
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.expect
@@ -0,0 +1,22 @@
+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<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  static method foo<Y extends core::Object* = dynamic>() → self::A<self::B::foo::Y*>*
+    return null;
+}
+static method baz() → dynamic {
+  self::B::foo<dynamic>().bar<core::String*>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6beeebd
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.legacy.transformed.expect
@@ -0,0 +1,22 @@
+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<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  static method foo<Y extends core::Object* = dynamic>() → self::A<self::B::foo::Y*>*
+    return null;
+}
+static method baz() → dynamic {
+  self::B::foo<dynamic>().bar<core::String*>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
new file mode 100644
index 0000000..60367e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.outline.expect
@@ -0,0 +1,20 @@
+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*>*
+    ;
+  method bar<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  static method foo<Y extends core::Object* = dynamic>() → self::A<self::B::foo::Y*>*
+    ;
+}
+static method baz() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.expect
new file mode 100644
index 0000000..b534194
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.expect
@@ -0,0 +1,22 @@
+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<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
+    return null;
+}
+static method baz() → dynamic {
+  self::B::foo<core::Object*>().{self::A::bar}<core::String*>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..b534194
--- /dev/null
+++ b/pkg/front_end/testcases/general/bounds_check_depends_on_inference.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+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<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  static method foo<Y extends core::Object* = core::Object*>() → self::A<self::B::foo::Y*>*
+    return null;
+}
+static method baz() → dynamic {
+  self::B::foo<core::Object*>().{self::A::bar}<core::String*>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug21938.dart b/pkg/front_end/testcases/general/bug21938.dart
similarity index 100%
rename from pkg/front_end/testcases/bug21938.dart
rename to pkg/front_end/testcases/general/bug21938.dart
diff --git a/pkg/front_end/testcases/general/bug21938.dart.legacy.expect b/pkg/front_end/testcases/general/bug21938.dart.legacy.expect
new file mode 100644
index 0000000..0a2796e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug21938.dart.legacy.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::Object* x;
+  core::Function* f;
+  x.call();
+  x.call(3);
+  f.call(5, 2);
+  x.call();
+  f.call;
+  f.call(5, 2);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug21938.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug21938.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0a2796e
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug21938.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::Object* x;
+  core::Function* f;
+  x.call();
+  x.call(3);
+  f.call(5, 2);
+  x.call();
+  f.call;
+  f.call(5, 2);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug21938.dart.outline.expect b/pkg/front_end/testcases/general/bug21938.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/bug21938.dart.outline.expect
rename to pkg/front_end/testcases/general/bug21938.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/bug21938.dart.strong.expect b/pkg/front_end/testcases/general/bug21938.dart.strong.expect
new file mode 100644
index 0000000..5a51904
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug21938.dart.strong.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();
+   ^";
+  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);
+   ^";
+  f.call(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();
+    ^^^^";
+  f.call;
+  f.call(5, 2);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug30695.dart b/pkg/front_end/testcases/general/bug30695.dart
similarity index 100%
rename from pkg/front_end/testcases/bug30695.dart
rename to pkg/front_end/testcases/general/bug30695.dart
diff --git a/pkg/front_end/testcases/bug30695.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug30695.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug30695.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug30695.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug30695.dart.legacy.expect b/pkg/front_end/testcases/general/bug30695.dart.legacy.expect
new file mode 100644
index 0000000..8f133c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug30695.dart.legacy.expect
@@ -0,0 +1,28 @@
+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 dynamic foo = 42;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+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/bug30695.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug30695.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8f133c6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug30695.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+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 dynamic foo = 42;
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+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/bug30695.dart.outline.expect b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
new file mode 100644
index 0000000..bb6576d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug30695.dart.outline.expect
@@ -0,0 +1,27 @@
+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 dynamic foo;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  method foo() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug30695.dart.strong.expect b/pkg/front_end/testcases/general/bug30695.dart.strong.expect
new file mode 100644
index 0000000..6036c4c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug30695.dart.strong.expect
@@ -0,0 +1,28 @@
+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::•()
+    ;
+}
+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/bug31124.dart b/pkg/front_end/testcases/general/bug31124.dart
similarity index 100%
rename from pkg/front_end/testcases/bug31124.dart
rename to pkg/front_end/testcases/general/bug31124.dart
diff --git a/pkg/front_end/testcases/general/bug31124.dart.legacy.expect b/pkg/front_end/testcases/general/bug31124.dart.legacy.expect
new file mode 100644
index 0000000..8e65e77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.legacy.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:1:5: Context: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+//
+import self as self;
+
+static field dynamic a;
diff --git a/pkg/front_end/testcases/general/bug31124.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug31124.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8e65e77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:1:5: Context: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+//
+import self as self;
+
+static field dynamic a;
diff --git a/pkg/front_end/testcases/general/bug31124.dart.outline.expect b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
new file mode 100644
index 0000000..8e65e77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:1:5: Context: Previous declaration of 'a'.
+// var a = () => 'b';a();
+//     ^
+//
+import self as self;
+
+static field dynamic a;
diff --git a/pkg/front_end/testcases/general/bug31124.dart.strong.expect b/pkg/front_end/testcases/general/bug31124.dart.strong.expect
new file mode 100644
index 0000000..7ac93d0
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:1: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/bug31124.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug31124.dart.strong.transformed.expect
new file mode 100644
index 0000000..7ac93d0
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug31124.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:22: Error: Expected a function body or '=>'.
+// Try adding {}.
+// var a = () => 'b';a();
+//                      ^
+//
+// pkg/front_end/testcases/general/bug31124.dart:1:19: Error: 'a' is already declared in this scope.
+// var a = () => 'b';a();
+//                   ^
+// pkg/front_end/testcases/general/bug31124.dart:1: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 b/pkg/front_end/testcases/general/bug32414a.dart
new file mode 100644
index 0000000..282c07d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414a.dart
@@ -0,0 +1,13 @@
+// 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.
+
+/*@testedFeatures=inference*/
+
+void test() {
+  dynamic a = 5;
+  var /*@ type=String* */ b = a. /*@target=Object::toString*/ toString();
+  b = 42;
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/bug32414a.dart.legacy.expect b/pkg/front_end/testcases/general/bug32414a.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414a.dart.legacy.expect
rename to pkg/front_end/testcases/general/bug32414a.dart.legacy.expect
diff --git a/pkg/front_end/testcases/bug32414a.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug32414a.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414a.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/bug32414a.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/bug32414a.dart.outline.expect b/pkg/front_end/testcases/general/bug32414a.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414a.dart.outline.expect
rename to pkg/front_end/testcases/general/bug32414a.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.strong.expect b/pkg/front_end/testcases/general/bug32414a.dart.strong.expect
new file mode 100644
index 0000000..ef9dfa5
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414a.dart.strong.expect
@@ -0,0 +1,21 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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}();
+  b = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  b = 42;
+      ^" in 42 as{TypeError} core::String*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect
new file mode 100644
index 0000000..ef9dfa5
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414a.dart.strong.transformed.expect
@@ -0,0 +1,21 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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}();
+  b = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  b = 42;
+      ^" in 42 as{TypeError} core::String*;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect b/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect
new file mode 100644
index 0000000..398e367
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414a.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/bug32414a.dart:10:5: Context: Write to b@305
+  b = 42;
+    ^
diff --git a/pkg/front_end/testcases/general/bug32414b.dart b/pkg/front_end/testcases/general/bug32414b.dart
new file mode 100644
index 0000000..d1c0f38
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart
@@ -0,0 +1,16 @@
+// 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.
+
+/*@testedFeatures=inference*/
+
+void test() {
+  List<dynamic> l = /*@ typeArgs=dynamic */ [1, "hello"];
+  List<String> l2 = l
+      . /*@target=Iterable::map*/ /*@ typeArgs=String* */ map(
+          /*@ returnType=String* */ (dynamic element) =>
+              element. /*@target=Object::toString*/ toString())
+      . /*@target=Iterable::toList*/ toList();
+}
+
+void main() {}
diff --git a/pkg/front_end/testcases/general/bug32414b.dart.legacy.expect b/pkg/front_end/testcases/general/bug32414b.dart.legacy.expect
new file mode 100644
index 0000000..74ec288
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart.legacy.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.map((dynamic element) → dynamic => element.toString()).toList();
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32414b.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug32414b.dart.legacy.transformed.expect
new file mode 100644
index 0000000..74ec288
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart.legacy.transformed.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.map((dynamic element) → dynamic => element.toString()).toList();
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32414b.dart.outline.expect b/pkg/front_end/testcases/general/bug32414b.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32414b.dart.outline.expect
rename to pkg/front_end/testcases/general/bug32414b.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/bug32414b.dart.strong.expect b/pkg/front_end/testcases/general/bug32414b.dart.strong.expect
new file mode 100644
index 0000000..1422239
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart.strong.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::Iterable::toList}();
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/bug32414b.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32414b.dart.strong.transformed.expect
new file mode 100644
index 0000000..1422239
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32414b.dart.strong.transformed.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::Iterable::toList}();
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/bug32426.dart b/pkg/front_end/testcases/general/bug32426.dart
similarity index 100%
rename from pkg/front_end/testcases/bug32426.dart
rename to pkg/front_end/testcases/general/bug32426.dart
diff --git a/pkg/front_end/testcases/bug32426.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug32426.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32426.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug32426.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug32426.dart.legacy.expect b/pkg/front_end/testcases/general/bug32426.dart.legacy.expect
new file mode 100644
index 0000000..cbea8ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.legacy.expect
@@ -0,0 +1,24 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call([core::int* x = #C1]) → void {}
+}
+static method main() → dynamic {
+  self::I* i = new self::C::•();
+  ([core::int*]) →* void f = i;
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bug32426.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug32426.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cbea8ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.legacy.transformed.expect
@@ -0,0 +1,24 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call([core::int* x = #C1]) → void {}
+}
+static method main() → dynamic {
+  self::I* i = new self::C::•();
+  ([core::int*]) →* void f = i;
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bug32426.dart.outline.expect b/pkg/front_end/testcases/general/bug32426.dart.outline.expect
new file mode 100644
index 0000000..87f6d25
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  abstract method call() → void;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+  method call([core::int* x]) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug32426.dart.strong.expect b/pkg/front_end/testcases/general/bug32426.dart.strong.expect
new file mode 100644
index 0000000..d97a705
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.strong.expect
@@ -0,0 +1,24 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call([core::int* x = #C1]) → void {}
+}
+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}) as{TypeError} ([core::int*]) →* void;
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/bug32426.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32426.dart.strong.transformed.expect
new file mode 100644
index 0000000..d97a705
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32426.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method call([core::int* x = #C1]) → void {}
+}
+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}) as{TypeError} ([core::int*]) →* void;
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/bug32629.dart b/pkg/front_end/testcases/general/bug32629.dart
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart
rename to pkg/front_end/testcases/general/bug32629.dart
diff --git a/pkg/front_end/testcases/bug32629.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug32629.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug32629.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug32629.dart.legacy.expect b/pkg/front_end/testcases/general/bug32629.dart.legacy.expect
new file mode 100644
index 0000000..c26ddb4
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32629.dart.legacy.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Reducer<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;
+  }
+}
+static method foo<S extends core::Object* = dynamic>((self::foo::S*, dynamic) →* self::foo::S* v) → void {}
+static method main() → void {
+  self::foo<core::String*>(new self::A::•());
+}
diff --git a/pkg/front_end/testcases/general/bug32629.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug32629.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c26ddb4
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32629.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Reducer<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;
+  }
+}
+static method foo<S extends core::Object* = dynamic>((self::foo::S*, dynamic) →* self::foo::S* v) → void {}
+static method main() → void {
+  self::foo<core::String*>(new self::A::•());
+}
diff --git a/pkg/front_end/testcases/general/bug32629.dart.outline.expect b/pkg/front_end/testcases/general/bug32629.dart.outline.expect
new file mode 100644
index 0000000..742088c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32629.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Reducer<S extends core::Object* = dynamic> = (S*, dynamic) →* S*;
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method call(dynamic a, dynamic b) → dynamic
+    ;
+}
+static method foo<S extends core::Object* = dynamic>((self::foo::S*, dynamic) →* self::foo::S* v) → void
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/bug32629.dart.strong.expect b/pkg/front_end/testcases/general/bug32629.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart.strong.expect
rename to pkg/front_end/testcases/general/bug32629.dart.strong.expect
diff --git a/pkg/front_end/testcases/bug32629.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32629.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32629.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/bug32629.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/bug32866.dart b/pkg/front_end/testcases/general/bug32866.dart
similarity index 100%
rename from pkg/front_end/testcases/bug32866.dart
rename to pkg/front_end/testcases/general/bug32866.dart
diff --git a/pkg/front_end/testcases/bug32866.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug32866.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug32866.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug32866.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug32866.dart.legacy.expect b/pkg/front_end/testcases/general/bug32866.dart.legacy.expect
new file mode 100644
index 0000000..0313d48
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.legacy.expect
@@ -0,0 +1,19 @@
+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*;
+}
+class A extends core::Object implements self::B {
+  final field core::String* f;
+  constructor •(dynamic f) → self::A*
+    : self::A::f = f, super core::Object::•()
+    ;
+}
+static field dynamic a = new self::A::•("foo");
+static method main() → dynamic
+  return core::print(self::a);
diff --git a/pkg/front_end/testcases/general/bug32866.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug32866.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0313d48
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+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*;
+}
+class A extends core::Object implements self::B {
+  final field core::String* f;
+  constructor •(dynamic f) → self::A*
+    : self::A::f = f, super core::Object::•()
+    ;
+}
+static field dynamic a = new self::A::•("foo");
+static method main() → dynamic
+  return core::print(self::a);
diff --git a/pkg/front_end/testcases/general/bug32866.dart.outline.expect b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
new file mode 100644
index 0000000..cb6153c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  abstract get f() → core::String*;
+}
+class A extends core::Object implements self::B {
+  final field core::String* f;
+  constructor •(dynamic f) → self::A*
+    ;
+}
+static field dynamic a;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug32866.dart.strong.expect b/pkg/front_end/testcases/general/bug32866.dart.strong.expect
new file mode 100644
index 0000000..03cb6b9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.strong.expect
@@ -0,0 +1,19 @@
+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*;
+}
+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::•()
+    ;
+}
+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/bug32866.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug32866.dart.strong.transformed.expect
new file mode 100644
index 0000000..03cb6b9
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug32866.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+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*;
+}
+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::•()
+    ;
+}
+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/bug33099.dart b/pkg/front_end/testcases/general/bug33099.dart
similarity index 100%
rename from pkg/front_end/testcases/bug33099.dart
rename to pkg/front_end/testcases/general/bug33099.dart
diff --git a/pkg/front_end/testcases/bug33099.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug33099.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33099.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug33099.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug33099.dart.legacy.expect b/pkg/front_end/testcases/general/bug33099.dart.legacy.expect
new file mode 100644
index 0000000..56df6ac
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.legacy.expect
@@ -0,0 +1,49 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object {
+  const constructor •() → self::_FailingTest
+    : super core::Object::•()
+    ;
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest
+    : super core::Object::•()
+    ;
+  @self::failingTest
+  method foo() → void {}
+}
+abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest
+    : super core::Object::•()
+    ;
+}
+class MyTest2 extends self::_MyTest2&Object&MyTest {
+  synthetic constructor •() → self::MyTest2
+    : super self::_MyTest2&Object&MyTest::•()
+    ;
+}
+static const field self::_FailingTest failingTest = const self::_FailingTest::•();
+static method main() → dynamic {
+  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
+  classMirror.instanceMembers.forEach((core::Symbol symbol, mir::MethodMirror memberMirror) → dynamic {
+    if(memberMirror.simpleName.==(#foo)) {
+      core::print(memberMirror);
+      core::print(self::_hasFailingTestAnnotation(memberMirror));
+    }
+  });
+}
+static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
+  dynamic r = self::_hasAnnotationInstance(method, self::failingTest);
+  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
+  return r;
+}
+static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
+  return declaration.metadata.any((mir::InstanceMirror annotation) → dynamic {
+    core::print("annotation: ${annotation.reflectee}");
+    return core::identical(annotation.reflectee, instance);
+  });
diff --git a/pkg/front_end/testcases/general/bug33099.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a8f940a
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.legacy.transformed.expect
@@ -0,0 +1,51 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object {
+  const constructor •() → self::_FailingTest
+    : super core::Object::•()
+    ;
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest
+    : super core::Object::•()
+    ;
+  @self::failingTest
+  method foo() → void {}
+}
+abstract class _MyTest2&Object&MyTest extends core::Object implements self::MyTest {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest
+    : super core::Object::•()
+    ;
+  @self::failingTest
+  method foo() → void {}
+}
+class MyTest2 extends self::_MyTest2&Object&MyTest {
+  synthetic constructor •() → self::MyTest2
+    : super self::_MyTest2&Object&MyTest::•()
+    ;
+}
+static const field self::_FailingTest failingTest = const self::_FailingTest::•();
+static method main() → dynamic {
+  mir::ClassMirror classMirror = mir::reflectClass(self::MyTest2);
+  classMirror.instanceMembers.forEach((core::Symbol symbol, mir::MethodMirror memberMirror) → dynamic {
+    if(memberMirror.simpleName.==(#foo)) {
+      core::print(memberMirror);
+      core::print(self::_hasFailingTestAnnotation(memberMirror));
+    }
+  });
+}
+static method _hasFailingTestAnnotation(mir::MethodMirror method) → core::bool {
+  dynamic r = self::_hasAnnotationInstance(method, self::failingTest);
+  core::print("[_hasFailingTestAnnotation] ${method} ${r}");
+  return r;
+}
+static method _hasAnnotationInstance(mir::DeclarationMirror declaration, dynamic instance) → core::bool
+  return declaration.metadata.any((mir::InstanceMirror annotation) → dynamic {
+    core::print("annotation: ${annotation.reflectee}");
+    return core::identical(annotation.reflectee, instance);
+  });
diff --git a/pkg/front_end/testcases/general/bug33099.dart.outline.expect b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
new file mode 100644
index 0000000..511a3f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object {
+  const constructor •() → self::_FailingTest*
+    : super core::Object::•()
+    ;
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest*
+    ;
+  @self::failingTest
+  method foo() → void
+    ;
+}
+abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest*
+    : super core::Object::•()
+    ;
+}
+class MyTest2 extends self::_MyTest2&Object&MyTest {
+  synthetic constructor •() → self::MyTest2*
+    ;
+}
+static const field self::_FailingTest* failingTest = const self::_FailingTest::•();
+static method main() → dynamic
+  ;
+static method _hasFailingTestAnnotation(mir::MethodMirror* method) → core::bool*
+  ;
+static method _hasAnnotationInstance(mir::DeclarationMirror* declaration, dynamic instance) → core::bool*
+  ;
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
new file mode 100644
index 0000000..537c6ae
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.expect
@@ -0,0 +1,54 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object {
+  const constructor •() → self::_FailingTest*
+    : super core::Object::•()
+    ;
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest*
+    : super core::Object::•()
+    ;
+  @#C1
+  method foo() → void {}
+}
+abstract class _MyTest2&Object&MyTest = core::Object with self::MyTest {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest*
+    : super core::Object::•()
+    ;
+}
+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(self::MyTest2*);
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null* {
+    if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
+      core::print(memberMirror);
+      core::print(self::_hasFailingTestAnnotation(memberMirror));
+    }
+  });
+}
+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::Iterable::any}((mir::InstanceMirror* annotation) → core::bool* {
+    core::print("annotation: ${annotation.{mir::InstanceMirror::reflectee}}");
+    return core::identical(annotation.{mir::InstanceMirror::reflectee}, instance);
+  });
+
+constants  {
+  #C1 = self::_FailingTest {}
+  #C2 = #foo
+}
diff --git a/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
new file mode 100644
index 0000000..0a95528
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33099.dart.strong.transformed.expect
@@ -0,0 +1,56 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:mirrors" as mir;
+
+import "dart:mirrors";
+
+class _FailingTest extends core::Object {
+  const constructor •() → self::_FailingTest*
+    : super core::Object::•()
+    ;
+}
+class MyTest extends core::Object {
+  synthetic constructor •() → self::MyTest*
+    : super core::Object::•()
+    ;
+  @#C1
+  method foo() → void {}
+}
+abstract class _MyTest2&Object&MyTest extends core::Object implements self::MyTest {
+  const synthetic constructor •() → self::_MyTest2&Object&MyTest*
+    : super core::Object::•()
+    ;
+  @#C1
+  method foo() → void {}
+}
+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(self::MyTest2*);
+  classMirror.{mir::ClassMirror::instanceMembers}.{core::Map::forEach}((core::Symbol* symbol, mir::MethodMirror* memberMirror) → core::Null* {
+    if(memberMirror.{mir::DeclarationMirror::simpleName}.{core::Symbol::==}(#C2)) {
+      core::print(memberMirror);
+      core::print(self::_hasFailingTestAnnotation(memberMirror));
+    }
+  });
+}
+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::Iterable::any}((mir::InstanceMirror* annotation) → core::bool* {
+    core::print("annotation: ${annotation.{mir::InstanceMirror::reflectee}}");
+    return core::identical(annotation.{mir::InstanceMirror::reflectee}, instance);
+  });
+
+constants  {
+  #C1 = self::_FailingTest {}
+  #C2 = #foo
+}
diff --git a/pkg/front_end/testcases/bug33196.dart b/pkg/front_end/testcases/general/bug33196.dart
similarity index 100%
rename from pkg/front_end/testcases/bug33196.dart
rename to pkg/front_end/testcases/general/bug33196.dart
diff --git a/pkg/front_end/testcases/general/bug33196.dart.legacy.expect b/pkg/front_end/testcases/general/bug33196.dart.legacy.expect
new file mode 100644
index 0000000..76b88fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.legacy.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method main() → dynamic {
+  dynamic result = self::returnsString();
+  core::print(result.runtimeType);
+}
+static method returnsString() → asy::FutureOr<core::String*>* async {
+  return "oh no";
+}
diff --git a/pkg/front_end/testcases/general/bug33196.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug33196.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ca33495
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.legacy.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+import "dart:async";
+
+static method main() → dynamic {
+  dynamic result = self::returnsString();
+  core::print(result.runtimeType);
+}
+static method returnsString() → asy::FutureOr<core::String*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "oh no";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/general/bug33196.dart.outline.expect b/pkg/front_end/testcases/general/bug33196.dart.outline.expect
new file mode 100644
index 0000000..628cf31
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic
+  ;
+static method returnsString() → asy::FutureOr<core::String*>*
+  ;
diff --git a/pkg/front_end/testcases/general/bug33196.dart.strong.expect b/pkg/front_end/testcases/general/bug33196.dart.strong.expect
new file mode 100644
index 0000000..83b0714
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.strong.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic {
+  asy::FutureOr<core::String*>* result = self::returnsString();
+  core::print(result.{core::Object::runtimeType});
+}
+static method returnsString() → asy::FutureOr<core::String*>* async {
+  return "oh no";
+}
diff --git a/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect
new file mode 100644
index 0000000..b555ba7
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33196.dart.strong.transformed.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "dart:core" as core;
+
+import "dart:async";
+
+static method main() → dynamic {
+  asy::FutureOr<core::String*>* result = self::returnsString();
+  core::print(result.{core::Object::runtimeType});
+}
+static method returnsString() → asy::FutureOr<core::String*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::String*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::String*>();
+  asy::FutureOr<core::String*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = "oh no";
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/bug33206.dart b/pkg/front_end/testcases/general/bug33206.dart
similarity index 100%
rename from pkg/front_end/testcases/bug33206.dart
rename to pkg/front_end/testcases/general/bug33206.dart
diff --git a/pkg/front_end/testcases/bug33206.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug33206.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33206.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug33206.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug33206.dart.legacy.expect b/pkg/front_end/testcases/general/bug33206.dart.legacy.expect
new file mode 100644
index 0000000..3b5f290
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.legacy.expect
@@ -0,0 +1,36 @@
+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}}, ${this.{self::X::y}})";
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+}
+static method f1() → asy::Future<core::List<core::Object*>*>* async {
+  return <dynamic>[1];
+}
+static method f2() → core::List<core::Object*>*
+  return <dynamic>[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 dynamic #t1 = new self::Y::•() in let final dynamic #t2 = #t1.f(await self::f1()) in let final dynamic #t3 = #t1.f(self::f2()) in #t1, await self::f3());
+}
+static method main() → asy::Future<void>* async {
+  core::print(await self::foo());
+}
diff --git a/pkg/front_end/testcases/general/bug33206.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug33206.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5691ada
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.legacy.transformed.expect
@@ -0,0 +1,139 @@
+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}}, ${this.{self::X::y}})";
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+}
+static method f1() → asy::Future<core::List<core::Object*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::Object*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object*>*>();
+  asy::FutureOr<core::List<core::Object*>*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <dynamic>[1];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method f2() → core::List<core::Object*>*
+  return <dynamic>[2];
+static method f3() → asy::Future<core::Object*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Object*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object*>();
+  asy::FutureOr<core::Object*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = 3;
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method foo() → asy::Future<self::X*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<self::X*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::X*>();
+  asy::FutureOr<self::X*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        final dynamic #t1 = new self::Y::•();
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
+        final dynamic #t3 = #t1.f(:result);
+        final dynamic #t4 = #t1.f(self::f2());
+        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        :return_value = new self::X::•(#t1, :result);
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → asy::Future<void>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  asy::FutureOr<void>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L4:
+      {
+        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/general/bug33206.dart.outline.expect b/pkg/front_end/testcases/general/bug33206.dart.outline.expect
new file mode 100644
index 0000000..e3de83d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.outline.expect
@@ -0,0 +1,31 @@
+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*
+    ;
+  method toString() → core::String*
+    ;
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    ;
+  method f(dynamic _) → dynamic
+    ;
+}
+static method f1() → asy::Future<core::List<core::Object*>*>*
+  ;
+static method f2() → core::List<core::Object*>*
+  ;
+static method f3() → asy::Future<core::Object*>*
+  ;
+static method foo() → asy::Future<self::X*>*
+  ;
+static method main() → asy::Future<void>*
+  ;
diff --git a/pkg/front_end/testcases/general/bug33206.dart.strong.expect b/pkg/front_end/testcases/general/bug33206.dart.strong.expect
new file mode 100644
index 0000000..9135f7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.strong.expect
@@ -0,0 +1,36 @@
+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}}, ${this.{self::X::y}})";
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+}
+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 let final dynamic #t2 = #t1.{self::Y::f}(await self::f1()) in let final dynamic #t3 = #t1.{self::Y::f}(self::f2()) in #t1, await self::f3());
+}
+static method main() → asy::Future<void>* async {
+  core::print(await self::foo());
+}
diff --git a/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
new file mode 100644
index 0000000..2e15c12
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33206.dart.strong.transformed.expect
@@ -0,0 +1,139 @@
+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}}, ${this.{self::X::y}})";
+}
+class Y extends core::Object {
+  synthetic constructor •() → self::Y*
+    : super core::Object::•()
+    ;
+  method f(dynamic _) → dynamic {}
+}
+static method f1() → asy::Future<core::List<core::Object*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::Object*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::Object*>*>();
+  asy::FutureOr<core::List<core::Object*>*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        :return_value = <core::Object*>[1];
+        break #L1;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method f2() → core::List<core::Object*>*
+  return <core::Object*>[2];
+static method f3() → asy::Future<core::Object*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Object*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Object*>();
+  asy::FutureOr<core::Object*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L2:
+      {
+        :return_value = 3;
+        break #L2;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method foo() → asy::Future<self::X*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<self::X*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::X*>();
+  asy::FutureOr<self::X*>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L3:
+      {
+        final self::Y* #t1 = new self::Y::•();
+        [yield] let dynamic #t2 = asy::_awaitHelper(self::f1(), :async_op_then, :async_op_error, :async_op) in null;
+        final dynamic #t3 = #t1.{self::Y::f}(:result);
+        final dynamic #t4 = #t1.{self::Y::f}(self::f2());
+        [yield] let dynamic #t5 = asy::_awaitHelper(self::f3(), :async_op_then, :async_op_error, :async_op) in null;
+        :return_value = new self::X::•(#t1, :result);
+        break #L3;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → asy::Future<void>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<void>* :async_completer = new asy::_AsyncAwaitCompleter::•<void>();
+  asy::FutureOr<void>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L4:
+      {
+        [yield] let dynamic #t6 = asy::_awaitHelper(self::foo(), :async_op_then, :async_op_error, :async_op) in null;
+        core::print(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
diff --git a/pkg/front_end/testcases/bug33298.dart b/pkg/front_end/testcases/general/bug33298.dart
similarity index 100%
rename from pkg/front_end/testcases/bug33298.dart
rename to pkg/front_end/testcases/general/bug33298.dart
diff --git a/pkg/front_end/testcases/bug33298.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug33298.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug33298.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug33298.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug33298.dart.legacy.expect b/pkg/front_end/testcases/general/bug33298.dart.legacy.expect
new file mode 100644
index 0000000..19dcf5d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.legacy.expect
@@ -0,0 +1,37 @@
+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::String* s) → core::String*
+    return "${s}${s}";
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T* t) → self::B::T*
+    return t;
+}
+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;
+}
+static method test() → dynamic {
+  self::A* a = new self::A::•();
+  core::List<core::String*>* list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
+  core::List<core::String*>* list2 = <dynamic>["a", "b", "c"].map(a).toList();
+  self::B<core::String*>* b = new self::B::•<dynamic>();
+  core::List<core::String*>* list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
+  core::List<core::String*>* list4 = <dynamic>["a", "b", "c"].map(b).toList();
+  self::C* c = new self::C::•();
+  core::List<core::String*>* list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
+  core::List<core::String*>* list6 = <dynamic>["a", "b", "c"].map(c).toList();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug33298.dart.legacy.transformed.expect
new file mode 100644
index 0000000..19dcf5d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.legacy.transformed.expect
@@ -0,0 +1,37 @@
+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::String* s) → core::String*
+    return "${s}${s}";
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T* t) → self::B::T*
+    return t;
+}
+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;
+}
+static method test() → dynamic {
+  self::A* a = new self::A::•();
+  core::List<core::String*>* list1 = <dynamic>["a", "b", "c"].map(a.call).toList();
+  core::List<core::String*>* list2 = <dynamic>["a", "b", "c"].map(a).toList();
+  self::B<core::String*>* b = new self::B::•<dynamic>();
+  core::List<core::String*>* list3 = <dynamic>["a", "b", "c"].map(b.call).toList();
+  core::List<core::String*>* list4 = <dynamic>["a", "b", "c"].map(b).toList();
+  self::C* c = new self::C::•();
+  core::List<core::String*>* list5 = <dynamic>["a", "b", "c"].map(c.call).toList();
+  core::List<core::String*>* list6 = <dynamic>["a", "b", "c"].map(c).toList();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.outline.expect b/pkg/front_end/testcases/general/bug33298.dart.outline.expect
new file mode 100644
index 0000000..751cd8d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method call(core::String* s) → core::String*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method call(generic-covariant-impl self::B::T* t) → self::B::T*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method call<T extends core::Object* = dynamic>(self::C::call::T* t) → self::C::call::T*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug33298.dart.strong.expect b/pkg/front_end/testcases/general/bug33298.dart.strong.expect
new file mode 100644
index 0000000..57354a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.strong.expect
@@ -0,0 +1,48 @@
+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)'.
+// Try changing the type of the parameter, or casting the argument to '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}";
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T* t) → self::B::T*
+    return t;
+}
+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;
+}
+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::Iterable::toList}();
+  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::Iterable::toList}();
+  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::Iterable::toList}();
+  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::Iterable::toList}();
+  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}<core::String*>).{core::Iterable::toList}();
+  core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = 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)'.
+Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+                                           ^" in (let final self::C* #t4 = c in #t4.==(null) ?{<T extends core::Object* = dynamic>(self::C::call::T*) →* self::C::call::T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect
new file mode 100644
index 0000000..57354a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug33298.dart.strong.transformed.expect
@@ -0,0 +1,48 @@
+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)'.
+// Try changing the type of the parameter, or casting the argument to '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}";
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+  method call(generic-covariant-impl self::B::T* t) → self::B::T*
+    return t;
+}
+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;
+}
+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::Iterable::toList}();
+  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::Iterable::toList}();
+  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::Iterable::toList}();
+  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::Iterable::toList}();
+  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}<core::String*>).{core::Iterable::toList}();
+  core::List<core::String*>* list6 = <core::String*>["a", "b", "c"].{core::Iterable::map}<dynamic>(let final<BottomType> #t3 = 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)'.
+Try changing the type of the parameter, or casting the argument to 'dynamic Function(String)'.
+  List<String> list6 = ['a', 'b', 'c'].map(c).toList();
+                                           ^" in (let final self::C* #t4 = c in #t4.==(null) ?{<T extends core::Object* = dynamic>(self::C::call::T*) →* self::C::call::T*} null : #t4.{self::C::call}) as{TypeError} (core::String*) →* dynamic).{core::Iterable::toList}() as{TypeError} core::List<core::String*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/bug34511.dart b/pkg/front_end/testcases/general/bug34511.dart
similarity index 100%
rename from pkg/front_end/testcases/bug34511.dart
rename to pkg/front_end/testcases/general/bug34511.dart
diff --git a/pkg/front_end/testcases/bug34511.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug34511.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug34511.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug34511.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug34511.dart.legacy.expect b/pkg/front_end/testcases/general/bug34511.dart.legacy.expect
new file mode 100644
index 0000000..f743320
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.legacy.expect
@@ -0,0 +1,20 @@
+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 class _B&Object&A<Z extends core::Object* = dynamic> = core::Object with self::A<() →* self::_B&Object&A::Z*> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+}
+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/bug34511.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug34511.dart.legacy.transformed.expect
new file mode 100644
index 0000000..534c2d3
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+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 class _B&Object&A<Z extends core::Object* = dynamic> extends core::Object implements self::A<() →* self::_B&Object&A::Z*> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+}
+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/bug34511.dart.outline.expect b/pkg/front_end/testcases/general/bug34511.dart.outline.expect
new file mode 100644
index 0000000..cf7dcd3
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.outline.expect
@@ -0,0 +1,19 @@
+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*>*
+    ;
+}
+abstract class _B&Object&A<Z extends core::Object* = dynamic> = core::Object with self::A<() →* self::_B&Object&A::Z*> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+}
+class B<Z extends core::Object* = dynamic> extends self::_B&Object&A<self::B::Z*> {
+  synthetic constructor •() → self::B<self::B::Z*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug34511.dart.strong.expect b/pkg/front_end/testcases/general/bug34511.dart.strong.expect
new file mode 100644
index 0000000..f743320
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.strong.expect
@@ -0,0 +1,20 @@
+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 class _B&Object&A<Z extends core::Object* = dynamic> = core::Object with self::A<() →* self::_B&Object&A::Z*> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+}
+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/bug34511.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug34511.dart.strong.transformed.expect
new file mode 100644
index 0000000..534c2d3
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug34511.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+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 class _B&Object&A<Z extends core::Object* = dynamic> extends core::Object implements self::A<() →* self::_B&Object&A::Z*> {
+  const synthetic constructor •() → self::_B&Object&A<self::_B&Object&A::Z*>*
+    : super core::Object::•()
+    ;
+}
+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/bug35470.dart b/pkg/front_end/testcases/general/bug35470.dart
similarity index 100%
rename from pkg/front_end/testcases/bug35470.dart
rename to pkg/front_end/testcases/general/bug35470.dart
diff --git a/pkg/front_end/testcases/bug35470.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug35470.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/bug35470.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/bug35470.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/bug35470.dart.legacy.expect b/pkg/front_end/testcases/general/bug35470.dart.legacy.expect
new file mode 100644
index 0000000..3070b77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.legacy.expect
@@ -0,0 +1,19 @@
+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<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method bar(self::B* b) → dynamic {
+  b.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug35470.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug35470.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3070b77
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+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<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic {}
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method bar(self::B* b) → dynamic {
+  b.foo();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug35470.dart.outline.expect b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
new file mode 100644
index 0000000..e3abe47
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.outline.expect
@@ -0,0 +1,18 @@
+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*>*
+    ;
+  method foo<generic-covariant-impl Y extends self::A::X* = dynamic>() → dynamic
+    ;
+}
+class B extends self::A<dynamic> {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method bar(self::B* b) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug35470.dart.strong.expect b/pkg/front_end/testcases/general/bug35470.dart.strong.expect
new file mode 100644
index 0000000..dd00a9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.strong.expect
@@ -0,0 +1,19 @@
+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<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic {}
+}
+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>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug35470.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug35470.dart.strong.transformed.expect
new file mode 100644
index 0000000..dd00a9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug35470.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+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<generic-covariant-impl Y extends self::A::X* = self::A::X*>() → dynamic {}
+}
+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>();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/bug37476.dart b/pkg/front_end/testcases/general/bug37476.dart
new file mode 100644
index 0000000..4483ee2
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart
@@ -0,0 +1,37 @@
+// 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.
+
+/*@testedFeatures=checks*/
+
+class A<T extends num> {
+  void Function<S extends T>(S x) foo() {
+    print('foo: T = $T');
+    return <S extends T>(S a) {};
+  }
+}
+
+class B<T extends num> {
+  void Function(T x) foo() {
+    print('foo: T = $T');
+    return (T a) {};
+  }
+}
+
+A<num> a = new A<int>();
+B<num> b = new B<int>();
+
+main() {
+  try {
+    a.foo /*@ checkReturn=<S extends num* = dynamic>(S) ->* void */ ();
+    throw 'Expected TypeError';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    b.foo /*@ checkReturn=(num*) ->* void */ ();
+    throw 'Expected TypeError';
+  } on TypeError catch (e) {
+    print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bug37476.dart.hierarchy.expect b/pkg/front_end/testcases/general/bug37476.dart.hierarchy.expect
new file mode 100644
index 0000000..2f145ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.hierarchy.expect
@@ -0,0 +1,55 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    A.foo
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+B:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    B.foo
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/bug37476.dart.legacy.expect b/pkg/front_end/testcases/general/bug37476.dart.legacy.expect
new file mode 100644
index 0000000..e8dd98c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.legacy.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num* = dynamic> 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* = dynamic>(S* a) → dynamic {};
+  }
+}
+class B<T extends core::num* = dynamic> 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) → dynamic {};
+  }
+}
+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.foo();
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    self::b.foo();
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bug37476.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/bug37476.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e8dd98c
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.legacy.transformed.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num* = dynamic> 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* = dynamic>(S* a) → dynamic {};
+  }
+}
+class B<T extends core::num* = dynamic> 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) → dynamic {};
+  }
+}
+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.foo();
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    self::b.foo();
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/bug37476.dart.outline.expect b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
new file mode 100644
index 0000000..6c89350
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
+    ;
+  method foo() → <S extends self::A::T* = dynamic>(S*) →* void
+    ;
+}
+class B<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method foo() → (self::B::T*) →* void
+    ;
+}
+static field self::A<core::num*>* a;
+static field self::B<core::num*>* b;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/bug37476.dart.strong.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
new file mode 100644
index 0000000..85d07b8
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num* = 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* = self::A::T*>(S* a) → core::Null* {};
+  }
+}
+class B<T extends core::num* = 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) → core::Null* {};
+  }
+}
+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}() as{TypeError} <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}() as{TypeError} (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/bug37476.dart.strong.transformed.expect b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
new file mode 100644
index 0000000..85d07b8
--- /dev/null
+++ b/pkg/front_end/testcases/general/bug37476.dart.strong.transformed.expect
@@ -0,0 +1,40 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A<T extends core::num* = 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* = self::A::T*>(S* a) → core::Null* {};
+  }
+}
+class B<T extends core::num* = 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) → core::Null* {};
+  }
+}
+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}() as{TypeError} <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}() as{TypeError} (core::num*) →* void;
+    throw "Expected TypeError";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/call.dart b/pkg/front_end/testcases/general/call.dart
similarity index 100%
rename from pkg/front_end/testcases/call.dart
rename to pkg/front_end/testcases/general/call.dart
diff --git a/pkg/front_end/testcases/call.dart.hierarchy.expect b/pkg/front_end/testcases/general/call.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/call.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/call.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/call.dart.legacy.expect b/pkg/front_end/testcases/general/call.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/call.dart.legacy.expect
rename to pkg/front_end/testcases/general/call.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/call.dart.outline.expect b/pkg/front_end/testcases/general/call.dart.outline.expect
new file mode 100644
index 0000000..5aba50d
--- /dev/null
+++ b/pkg/front_end/testcases/general/call.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Callable extends core::Object {
+  synthetic constructor •() → self::Callable*
+    ;
+  method call(dynamic x) → dynamic
+    ;
+}
+class CallableGetter extends core::Object {
+  synthetic constructor •() → self::CallableGetter*
+    ;
+  get call() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/call.dart.strong.expect b/pkg/front_end/testcases/general/call.dart.strong.expect
new file mode 100644
index 0000000..0346035
--- /dev/null
+++ b/pkg/front_end/testcases/general/call.dart.strong.expect
@@ -0,0 +1,103 @@
+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();
+//                                ^
+//
+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";
+  }
+}
+class CallableGetter extends core::Object {
+  synthetic constructor •() → self::CallableGetter*
+    : super core::Object::•()
+    ;
+  get call() → dynamic
+    return new self::Callable::•();
+}
+static method main() → dynamic {
+  (dynamic) →* dynamic closure = (dynamic x) → dynamic => x;
+  dynamic int1 = closure.call(1);
+  dynamic int2 = closure.call(1);
+  dynamic int3 = closure.call.call(1);
+  dynamic int4 = closure.call.call.call(1);
+  self::Callable* callable = new self::Callable::•();
+  dynamic string1 = callable.{self::Callable::call}(1);
+  dynamic string2 = callable.{self::Callable::call}(1);
+  dynamic string3 = callable.{self::Callable::call}.call(1);
+  dynamic string4 = callable.{self::Callable::call}.call.call(1);
+  self::CallableGetter* callableGetter = new self::CallableGetter::•();
+  dynamic string5 = let final<BottomType> #t1 = 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);
+                              ^" in callableGetter.{self::CallableGetter::call}(1);
+  dynamic string6 = callableGetter.{self::CallableGetter::call}(1);
+  dynamic string7 = callableGetter.{self::CallableGetter::call}.call(1);
+  dynamic string8 = callableGetter.{self::CallableGetter::call}.call.call(1);
+  dynamic nothing1 = closure.call();
+  dynamic nothing2 = closure.call();
+  dynamic nothing3 = closure.call.call();
+  dynamic nothing4 = closure.call.call.call();
+  dynamic nothing5 = callable.{self::Callable::call}();
+  dynamic nothing6 = callable.{self::Callable::call}();
+  dynamic nothing7 = callable.{self::Callable::call}.call();
+  dynamic nothing8 = callable.{self::Callable::call}.call.call();
+  dynamic nothing9 = let final<BottomType> #t2 = 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();
+                               ^" in callableGetter.{self::CallableGetter::call}();
+  dynamic nothing10 = callableGetter.{self::CallableGetter::call}();
+  dynamic nothing11 = callableGetter.{self::CallableGetter::call}.call();
+  dynamic nothing12 = callableGetter.{self::CallableGetter::call}.call.call();
+}
diff --git a/pkg/front_end/testcases/cascade.dart b/pkg/front_end/testcases/general/cascade.dart
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart
rename to pkg/front_end/testcases/general/cascade.dart
diff --git a/pkg/front_end/testcases/cascade.dart.legacy.expect b/pkg/front_end/testcases/general/cascade.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart.legacy.expect
rename to pkg/front_end/testcases/general/cascade.dart.legacy.expect
diff --git a/pkg/front_end/testcases/cascade.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/cascade.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/cascade.dart.outline.expect b/pkg/front_end/testcases/general/cascade.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/cascade.dart.outline.expect
rename to pkg/front_end/testcases/general/cascade.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.expect b/pkg/front_end/testcases/general/cascade.dart.strong.expect
new file mode 100644
index 0000000..b60aced
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.expect
@@ -0,0 +1,51 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     [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 method '[]' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//     ..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 let final dynamic #t2 = #t1.{core::List::add}(2) in let final dynamic #t3 = #t1.{core::List::add}(3) in let final dynamic #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::print(list);
+  let final core::List<core::int*>* #t5 = list in let final dynamic #t6 = #t5.{core::List::add}(2) in let final dynamic #t7 = #t5.{core::List::length} in let final dynamic #t8 = #t5.{core::List::length} = 0 in #t5;
+  core::print(list);
+  let final core::List<core::int*>* #t9 = list in let final dynamic #t10 = #t9.{core::List::add}(2) in let final dynamic #t11 = #t9.{core::List::[]}(0) in let final dynamic #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  core::print(list);
+  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    [1]
+    ^" in <core::int*>[1] as{TypeError} core::int*] in let final dynamic #t15 = 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()
+            ^^^^".{core::Object::toString}() in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ..first[0].toString()
+           ^^".{core::Object::toString}() in let final dynamic #t17 = 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();
+          ^^^^".{core::Object::toString}() in #t13;
+  core::print(list);
+}
diff --git a/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
new file mode 100644
index 0000000..af029ef
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     [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 method '[]' isn't defined for the class 'int'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//     ..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 let final void #t2 = #t1.{core::List::add}(2) in let final void #t3 = #t1.{core::List::add}(3) in let final void #t4 = #t1.{core::List::addAll}(<core::int*>[4, 5]) in #t1;
+  core::print(list);
+  let final core::List<core::int*>* #t5 = list in let final void #t6 = #t5.{core::List::add}(2) in let final core::int* #t7 = #t5.{core::List::length} in let final core::int* #t8 = #t5.{core::List::length} = 0 in #t5;
+  core::print(list);
+  let final core::List<core::int*>* #t9 = list in let final void #t10 = #t9.{core::List::add}(2) in let final core::int* #t11 = #t9.{core::List::[]}(0) in let final void #t12 = #t9.{core::List::[]=}(0, 87) in #t9;
+  core::print(list);
+  list = let final core::List<core::int*>* #t13 = <core::int*>[let final<BottomType> #t14 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+    [1]
+    ^" in <core::int*>[1] as{TypeError} core::int*] in let final core::String* #t15 = 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()
+            ^^^^".{core::Object::toString}() in let final core::String* #t16 = invalid-expression "pkg/front_end/testcases/general/cascade.dart:29:12: Error: The method '[]' isn't defined for the class 'int'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+    ..first[0].toString()
+           ^^".{core::Object::toString}() in let final core::String* #t17 = 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();
+          ^^^^".{core::Object::toString}() in #t13;
+  core::print(list);
+}
diff --git a/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect b/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect
new file mode 100644
index 0000000..27988f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/cascade.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/cascade.dart:25:8: Context: Write to list@232
+  list = [
+       ^
diff --git a/pkg/front_end/testcases/casts.dart b/pkg/front_end/testcases/general/casts.dart
similarity index 100%
rename from pkg/front_end/testcases/casts.dart
rename to pkg/front_end/testcases/general/casts.dart
diff --git a/pkg/front_end/testcases/general/casts.dart.legacy.expect b/pkg/front_end/testcases/general/casts.dart.legacy.expect
new file mode 100644
index 0000000..bfac5fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/casts.dart.legacy.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/casts.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/casts.dart.legacy.transformed.expect
new file mode 100644
index 0000000..bfac5fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/casts.dart.legacy.transformed.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/casts.dart.outline.expect b/pkg/front_end/testcases/general/casts.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/casts.dart.outline.expect
rename to pkg/front_end/testcases/general/casts.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/casts.dart.strong.expect b/pkg/front_end/testcases/general/casts.dart.strong.expect
new file mode 100644
index 0000000..bfac5fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/casts.dart.strong.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/casts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/casts.dart.strong.transformed.expect
new file mode 100644
index 0000000..bfac5fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/casts.dart.strong.transformed.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/check_deferred_allocation.dart b/pkg/front_end/testcases/general/check_deferred_allocation.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_allocation.dart
rename to pkg/front_end/testcases/general/check_deferred_allocation.dart
diff --git a/pkg/front_end/testcases/check_deferred_allocation.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_allocation.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_allocation.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.expect
new file mode 100644
index 0000000..40bd224
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.transformed.expect
new file mode 100644
index 0000000..40bd224
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.expect
new file mode 100644
index 0000000..c938f4c
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.transformed.expect
new file mode 100644
index 0000000..c29f5c2
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_allocation.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart b/pkg/front_end/testcases/general/check_deferred_as_check.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_as_check.dart
rename to pkg/front_end/testcases/general/check_deferred_as_check.dart
diff --git a/pkg/front_end/testcases/check_deferred_as_check.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_as_check.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_as_check.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.expect
new file mode 100644
index 0000000..3ed87a5
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_as_check.dart:9:8: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3ed87a5
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_as_check.dart:9:8: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
new file mode 100644
index 0000000..a5d2ec8
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test(dynamic x) → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_as_check.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.strong.expect
new file mode 100644
index 0000000..c5c5b9a
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.strong.expect
@@ -0,0 +1,34 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_as_check.dart.strong.transformed.expect
new file mode 100644
index 0000000..c5c5b9a
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_as_check.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart b/pkg/front_end/testcases/general/check_deferred_before_args.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args.dart
rename to pkg/front_end/testcases/general/check_deferred_before_args.dart
diff --git a/pkg/front_end/testcases/check_deferred_before_args.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_before_args.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.expect
new file mode 100644
index 0000000..3dbbc1e
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.expect
@@ -0,0 +1,29 @@
+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 = self::m2();
+  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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3dbbc1e
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+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 = self::m2();
+  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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
new file mode 100644
index 0000000..a513a65
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method m2() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.strong.expect
new file mode 100644
index 0000000..92d9353
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.strong.expect
@@ -0,0 +1,30 @@
+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} 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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_args.dart.strong.transformed.expect
new file mode 100644
index 0000000..6da0135
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+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 {
+  let final core::Object* #t1 = CheckLibraryIsLoaded(lib) in def::x = self::m2() as{TypeError} core::int*;
+  let final core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart b/pkg/front_end/testcases/general/check_deferred_before_args2.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args2.dart
rename to pkg/front_end/testcases/general/check_deferred_before_args2.dart
diff --git a/pkg/front_end/testcases/check_deferred_before_args2.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_args2.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_before_args2.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.expect
new file mode 100644
index 0000000..6f1dd92
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.expect
@@ -0,0 +1,26 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d029587
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.legacy.transformed.expect
@@ -0,0 +1,53 @@
+library;
+import self as self;
+import "dart:async" as asy;
+import "deferred_lib.dart" as def;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic {}
+static method test() → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        final dynamic #t1 = CheckLibraryIsLoaded(lib);
+        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
+        def::m(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.expect
new file mode 100644
index 0000000..4c5305e
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.expect
@@ -0,0 +1,26 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect
new file mode 100644
index 0000000..422eb51
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_args2.dart.strong.transformed.expect
@@ -0,0 +1,54 @@
+library;
+import self as self;
+import "dart:async" as asy;
+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 /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        final core::Object* #t1 = CheckLibraryIsLoaded(lib);
+        [yield] let dynamic #t2 = asy::_awaitHelper(LoadLibrary(lib), :async_op_then, :async_op_error, :async_op) in null;
+        def::m(:result);
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart b/pkg/front_end/testcases/general/check_deferred_before_call.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_call.dart
rename to pkg/front_end/testcases/general/check_deferred_before_call.dart
diff --git a/pkg/front_end/testcases/check_deferred_before_call.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_call.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_before_call.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.expect
new file mode 100644
index 0000000..298ec35
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.expect
@@ -0,0 +1,26 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.transformed.expect
new file mode 100644
index 0000000..298ec35
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.legacy.transformed.expect
@@ -0,0 +1,26 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_call.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.strong.expect
new file mode 100644
index 0000000..8f1f75e
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.strong.expect
@@ -0,0 +1,26 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_call.dart.strong.transformed.expect
new file mode 100644
index 0000000..6654a78
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_call.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 {
+  let final core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart b/pkg/front_end/testcases/general/check_deferred_before_write.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_write.dart
rename to pkg/front_end/testcases/general/check_deferred_before_write.dart
diff --git a/pkg/front_end/testcases/check_deferred_before_write.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_before_write.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_before_write.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.expect
new file mode 100644
index 0000000..4c65217
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.expect
@@ -0,0 +1,26 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4c65217
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.legacy.transformed.expect
@@ -0,0 +1,26 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_before_write.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.strong.expect
new file mode 100644
index 0000000..1c262ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.strong.expect
@@ -0,0 +1,26 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_before_write.dart.strong.transformed.expect
new file mode 100644
index 0000000..7696eb8
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_before_write.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 {
+  let final core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart b/pkg/front_end/testcases/general/check_deferred_is_check.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_is_check.dart
rename to pkg/front_end/testcases/general/check_deferred_is_check.dart
diff --git a/pkg/front_end/testcases/check_deferred_is_check.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_is_check.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_is_check.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.expect
new file mode 100644
index 0000000..42e59fc
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_is_check.dart:9:14: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.transformed.expect
new file mode 100644
index 0000000..42e59fc
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_is_check.dart:9:14: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
new file mode 100644
index 0000000..a5d2ec8
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test(dynamic x) → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_is_check.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.strong.expect
new file mode 100644
index 0000000..f778917
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.strong.expect
@@ -0,0 +1,35 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.strong.transformed.expect
new file mode 100644
index 0000000..f778917
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+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;
+}
+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.type_promotion.expect b/pkg/front_end/testcases/general/check_deferred_is_check.dart.type_promotion.expect
new file mode 100644
index 0000000..0223359
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_is_check.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/check_deferred_is_check.dart:9:11: Context: Possible promotion of x@279
+  print(x is lib.C);
+          ^^
diff --git a/pkg/front_end/testcases/check_deferred_read.dart b/pkg/front_end/testcases/general/check_deferred_read.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read.dart
rename to pkg/front_end/testcases/general/check_deferred_read.dart
diff --git a/pkg/front_end/testcases/check_deferred_read.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_read.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.expect
new file mode 100644
index 0000000..c836773
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.expect
@@ -0,0 +1,27 @@
+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).+(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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c836773
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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).+(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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.strong.expect
new file mode 100644
index 0000000..ad29577
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.strong.expect
@@ -0,0 +1,27 @@
+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));
+}
+
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read.dart.strong.transformed.expect
new file mode 100644
index 0000000..0168dc7
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 core::Object* #t1 = CheckLibraryIsLoaded(lib) in def::x).{core::num::+}(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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_static_field.dart
rename to pkg/front_end/testcases/general/check_deferred_read_static_field.dart
diff --git a/pkg/front_end/testcases/check_deferred_read_static_field.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_static_field.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_read_static_field.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.expect
new file mode 100644
index 0000000..9b7e75f
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9b7e75f
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.strong.expect
new file mode 100644
index 0000000..6a6523a
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.strong.expect
@@ -0,0 +1,27 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..3e431f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_static_field.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart b/pkg/front_end/testcases/general/check_deferred_read_type.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_type.dart
rename to pkg/front_end/testcases/general/check_deferred_read_type.dart
diff --git a/pkg/front_end/testcases/check_deferred_read_type.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_read_type.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_read_type.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.expect
new file mode 100644
index 0000000..d50ba93
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.expect
@@ -0,0 +1,27 @@
+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*);
+}
+
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d50ba93
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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*);
+}
+
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.expect
new file mode 100644
index 0000000..24e9309
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.expect
@@ -0,0 +1,27 @@
+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*);
+}
+
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..d95a89a
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_read_type.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 core::Object* #t1 = CheckLibraryIsLoaded(lib) in 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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_static_method_call.dart
rename to pkg/front_end/testcases/general/check_deferred_static_method_call.dart
diff --git a/pkg/front_end/testcases/check_deferred_static_method_call.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_static_method_call.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_static_method_call.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.expect
new file mode 100644
index 0000000..891d421
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.transformed.expect
new file mode 100644
index 0000000..891d421
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.expect
new file mode 100644
index 0000000..0bf2205
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.expect
@@ -0,0 +1,27 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.transformed.expect
new file mode 100644
index 0000000..db62ffd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_static_method_call.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 core::Object* #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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_type_declaration.dart
rename to pkg/front_end/testcases/general/check_deferred_type_declaration.dart
diff --git a/pkg/front_end/testcases/check_deferred_type_declaration.dart.hierarchy.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/check_deferred_type_declaration.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/check_deferred_type_declaration.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.expect
new file mode 100644
index 0000000..5b98de1
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_type_declaration.dart:9:3: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5b98de1
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/check_deferred_type_declaration.dart:9:3: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
new file mode 100644
index 0000000..82269cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
+
+static method main() → dynamic
+  ;
+static method test() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field core::int* y;
+  synthetic constructor •() → self2::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.strong.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.strong.expect
new file mode 100644
index 0000000..5c85c13
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.strong.expect
@@ -0,0 +1,35 @@
+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;
+}
+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.strong.transformed.expect b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.strong.transformed.expect
new file mode 100644
index 0000000..5c85c13
--- /dev/null
+++ b/pkg/front_end/testcases/general/check_deferred_type_declaration.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart
similarity index 100%
rename from pkg/front_end/testcases/circularity-via-initializing-formal.dart
rename to pkg/front_end/testcases/general/circularity-via-initializing-formal.dart
diff --git a/pkg/front_end/testcases/circularity-via-initializing-formal.dart.hierarchy.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/circularity-via-initializing-formal.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.expect
new file mode 100644
index 0000000..84a0f0e
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic f = new self::C::_circular(null);
+  constructor _circular(dynamic f) → self::C*
+    : self::C::f = f, super core::Object::•()
+    ;
+}
+static field dynamic x = new self::C::_circular(null);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.transformed.expect
new file mode 100644
index 0000000..84a0f0e
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.legacy.transformed.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic f = new self::C::_circular(null);
+  constructor _circular(dynamic f) → self::C*
+    : self::C::f = f, super core::Object::•()
+    ;
+}
+static field dynamic x = new self::C::_circular(null);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
new file mode 100644
index 0000000..297fe46
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic f;
+  constructor _circular(dynamic f) → self::C*
+    ;
+}
+static field dynamic x;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.expect
new file mode 100644
index 0000000..03b754b
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.expect
@@ -0,0 +1,20 @@
+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::•()
+    ;
+}
+static field self::C* x = new self::C::_circular(null);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.transformed.expect b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.transformed.expect
new file mode 100644
index 0000000..03b754b
--- /dev/null
+++ b/pkg/front_end/testcases/general/circularity-via-initializing-formal.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+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::•()
+    ;
+}
+static field self::C* x = new self::C::_circular(null);
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/classes.dart b/pkg/front_end/testcases/general/classes.dart
similarity index 100%
rename from pkg/front_end/testcases/classes.dart
rename to pkg/front_end/testcases/general/classes.dart
diff --git a/pkg/front_end/testcases/classes.dart.hierarchy.expect b/pkg/front_end/testcases/general/classes.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/classes.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/classes.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/classes.dart.legacy.expect b/pkg/front_end/testcases/general/classes.dart.legacy.expect
new file mode 100644
index 0000000..f924626
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.legacy.expect
@@ -0,0 +1,31 @@
+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}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    : super self::A::•(x)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    super.{self::A::method}();
+  }
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•(87);
+  self::B* b = new self::B::•(117);
+  a.method();
+  b.method();
+}
diff --git a/pkg/front_end/testcases/general/classes.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/classes.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f924626
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.legacy.transformed.expect
@@ -0,0 +1,31 @@
+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}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    : super self::A::•(x)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    super.{self::A::method}();
+  }
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•(87);
+  self::B* b = new self::B::•(117);
+  a.method();
+  b.method();
+}
diff --git a/pkg/front_end/testcases/general/classes.dart.outline.expect b/pkg/front_end/testcases/general/classes.dart.outline.expect
new file mode 100644
index 0000000..c216ad8
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.outline.expect
@@ -0,0 +1,20 @@
+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*
+    ;
+  method method() → dynamic
+    ;
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    ;
+  method method() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/classes.dart.strong.expect b/pkg/front_end/testcases/general/classes.dart.strong.expect
new file mode 100644
index 0000000..454a0a4
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.strong.expect
@@ -0,0 +1,31 @@
+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}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    : super self::A::•(x as{TypeError} core::int*)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    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}();
+  b.{self::B::method}();
+}
diff --git a/pkg/front_end/testcases/general/classes.dart.strong.transformed.expect b/pkg/front_end/testcases/general/classes.dart.strong.transformed.expect
new file mode 100644
index 0000000..454a0a4
--- /dev/null
+++ b/pkg/front_end/testcases/general/classes.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+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}} y: ${this.{self::A::y}}");
+    core::print(this);
+    core::print(this.{core::Object::runtimeType});
+  }
+}
+class B extends self::A {
+  constructor •(dynamic x) → self::B*
+    : super self::A::•(x as{TypeError} core::int*)
+    ;
+  method method() → dynamic {
+    core::print("B.method x: ${this.{self::A::x}} y: ${this.{self::A::y}}");
+    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}();
+  b.{self::B::method}();
+}
diff --git a/pkg/front_end/testcases/clone_function_type.dart b/pkg/front_end/testcases/general/clone_function_type.dart
similarity index 100%
rename from pkg/front_end/testcases/clone_function_type.dart
rename to pkg/front_end/testcases/general/clone_function_type.dart
diff --git a/pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect b/pkg/front_end/testcases/general/clone_function_type.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/clone_function_type.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/clone_function_type.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.legacy.expect b/pkg/front_end/testcases/general/clone_function_type.dart.legacy.expect
new file mode 100644
index 0000000..e247fb9
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.legacy.expect
@@ -0,0 +1,571 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+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 class _Bm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::Om1::Z*> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Pm1::Z*> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Qm1::Z*> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::Um1::Z*> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () →* dynamic = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::Om2::Z*> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Pm2::Z*> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Qm2::Z*> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::Um2::Z*> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 class _Bm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
+    return null;
+}
+class Bf1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    return null;
+}
+class Cf1<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
+    return null;
+}
+class Df1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
+    return null;
+}
+class Ef1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    return null;
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    return null;
+}
+class Gf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    return null;
+}
+class Hf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    return null;
+}
+class If1<X extends core::Function* = dynamic> extends core::Object {
+  static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
+    return null;
+}
+class Jf1<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    return null;
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    return null;
+}
+class Bf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    return null;
+}
+class Cf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    return null;
+}
+class Df2<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
+    return null;
+}
+class Ef2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    return null;
+}
+class Ff2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    return null;
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    return null;
+}
+class Hf2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    return null;
+}
+class If2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
+    return null;
+}
+class Jf2<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    return null;
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/clone_function_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c7ef2be
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.legacy.transformed.expect
@@ -0,0 +1,571 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+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 class _Bm1&Object&Am1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::_Cm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* core::int*, self::_Dm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* dynamic, self::_Em1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* dynamic, self::_Fm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<({x: core::int*}) →* dynamic, self::_Gm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::_Hm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::_Im1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<core::Function*, self::_Jm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::Function*) →* dynamic, self::_Km1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* (() →* core::Function*) →* dynamic, self::_Lm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::Mm1::Z*> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* core::int*, self::Om1::Z*> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* dynamic, self::Pm1::Z*> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* dynamic, self::Qm1::Z*> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<core::Function*, self::Um1::Z*> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () →* dynamic = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::_Cm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* core::int*, self::_Dm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* dynamic, self::_Em2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* dynamic, self::_Fm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<({x: core::int*}) →* dynamic, self::_Gm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::_Hm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::_Im2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<core::Function*, self::_Jm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::Function*) →* dynamic, self::_Km2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* (() →* core::Function*) →* dynamic, self::_Lm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::Mm2::Z*> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* core::int*, self::Om2::Z*> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* dynamic, self::Pm2::Z*> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* dynamic, self::Qm2::Z*> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<core::Function*, self::Um2::Z*> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 class _Bm3&Object&Am3<Z extends core::Object* = dynamic> extends core::Object implements self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<(core::int*) →* dynamic, self::_Cm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* core::int*, self::_Dm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* dynamic, self::_Em3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* dynamic, self::_Fm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<({x: core::int*}) →* dynamic, self::_Gm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<([core::int*]) →* dynamic, self::_Hm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<([core::int*]) →* dynamic, self::_Im3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<(core::Function*) →* dynamic, self::_Jm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* (() →* core::Function*) →* dynamic, self::_Km3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
+    return null;
+}
+class Bf1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    return null;
+}
+class Cf1<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
+    return null;
+}
+class Df1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
+    return null;
+}
+class Ef1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    return null;
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    return null;
+}
+class Gf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    return null;
+}
+class Hf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    return null;
+}
+class If1<X extends core::Function* = dynamic> extends core::Object {
+  static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
+    return null;
+}
+class Jf1<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    return null;
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    return null;
+}
+class Bf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    return null;
+}
+class Cf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    return null;
+}
+class Df2<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
+    return null;
+}
+class Ef2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    return null;
+}
+class Ff2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    return null;
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    return null;
+}
+class Hf2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    return null;
+}
+class If2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
+    return null;
+}
+class Jf2<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    return null;
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
new file mode 100644
index 0000000..a2cf5b5
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.outline.expect
@@ -0,0 +1,537 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// class Ef1<X extends Function({int})> {
+//                                  ^
+//
+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*>*
+    ;
+}
+abstract class _Bm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Bm1<Z extends core::Object* = dynamic> extends self::_Bm1&Object&Am1<self::Bm1::Z*> {
+  synthetic constructor •() → self::Bm1<self::Bm1::Z*>*
+    ;
+}
+abstract class _Cm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Cm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Cm1<Z extends core::Object* = dynamic> extends self::_Cm1&Object&Am1<self::Cm1::Z*> {
+  synthetic constructor •() → self::Cm1<self::Cm1::Z*>*
+    ;
+}
+abstract class _Dm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::_Dm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Dm1<Z extends core::Object* = dynamic> extends self::_Dm1&Object&Am1<self::Dm1::Z*> {
+  synthetic constructor •() → self::Dm1<self::Dm1::Z*>*
+    ;
+}
+abstract class _Em1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::_Em1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Em1<Z extends core::Object* = dynamic> extends self::_Em1&Object&Am1<self::Em1::Z*> {
+  synthetic constructor •() → self::Em1<self::Em1::Z*>*
+    ;
+}
+abstract class _Fm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::_Fm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Fm1<Z extends core::Object* = dynamic> extends self::_Fm1&Object&Am1<self::Fm1::Z*> {
+  synthetic constructor •() → self::Fm1<self::Fm1::Z*>*
+    ;
+}
+abstract class _Gm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::_Gm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Gm1<Z extends core::Object* = dynamic> extends self::_Gm1&Object&Am1<self::Gm1::Z*> {
+  synthetic constructor •() → self::Gm1<self::Gm1::Z*>*
+    ;
+}
+abstract class _Hm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::_Hm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Hm1<Z extends core::Object* = dynamic> extends self::_Hm1&Object&Am1<self::Hm1::Z*> {
+  synthetic constructor •() → self::Hm1<self::Hm1::Z*>*
+    ;
+}
+abstract class _Im1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::_Im1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Im1<Z extends core::Object* = dynamic> extends self::_Im1&Object&Am1<self::Im1::Z*> {
+  synthetic constructor •() → self::Im1<self::Im1::Z*>*
+    ;
+}
+abstract class _Jm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::_Jm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Jm1<Z extends core::Object* = dynamic> extends self::_Jm1&Object&Am1<self::Jm1::Z*> {
+  synthetic constructor •() → self::Jm1<self::Jm1::Z*>*
+    ;
+}
+abstract class _Km1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::_Km1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Km1<Z extends core::Object* = dynamic> extends self::_Km1&Object&Am1<self::Km1::Z*> {
+  synthetic constructor •() → self::Km1<self::Km1::Z*>*
+    ;
+}
+abstract class _Lm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::_Lm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Lm1<Z extends core::Object* = dynamic> extends self::_Lm1&Object&Am1<self::Lm1::Z*> {
+  synthetic constructor •() → self::Lm1<self::Lm1::Z*>*
+    ;
+}
+class Mm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Mm1::Z*> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::Om1::Z*> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Pm1::Z*> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Qm1::Z*> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::Um1::Z*> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () →* dynamic = dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Bm2<Z extends core::Object* = dynamic> extends self::_Bm2&Object&Am2<self::Bm2::Z*> {
+  synthetic constructor •() → self::Bm2<self::Bm2::Z*>*
+    ;
+}
+abstract class _Cm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Cm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Cm2<Z extends core::Object* = dynamic> extends self::_Cm2&Object&Am2<self::Cm2::Z*> {
+  synthetic constructor •() → self::Cm2<self::Cm2::Z*>*
+    ;
+}
+abstract class _Dm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::_Dm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Dm2<Z extends core::Object* = dynamic> extends self::_Dm2&Object&Am2<self::Dm2::Z*> {
+  synthetic constructor •() → self::Dm2<self::Dm2::Z*>*
+    ;
+}
+abstract class _Em2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::_Em2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Em2<Z extends core::Object* = dynamic> extends self::_Em2&Object&Am2<self::Em2::Z*> {
+  synthetic constructor •() → self::Em2<self::Em2::Z*>*
+    ;
+}
+abstract class _Fm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::_Fm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Fm2<Z extends core::Object* = dynamic> extends self::_Fm2&Object&Am2<self::Fm2::Z*> {
+  synthetic constructor •() → self::Fm2<self::Fm2::Z*>*
+    ;
+}
+abstract class _Gm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::_Gm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Gm2<Z extends core::Object* = dynamic> extends self::_Gm2&Object&Am2<self::Gm2::Z*> {
+  synthetic constructor •() → self::Gm2<self::Gm2::Z*>*
+    ;
+}
+abstract class _Hm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::_Hm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Hm2<Z extends core::Object* = dynamic> extends self::_Hm2&Object&Am2<self::Hm2::Z*> {
+  synthetic constructor •() → self::Hm2<self::Hm2::Z*>*
+    ;
+}
+abstract class _Im2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::_Im2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Im2<Z extends core::Object* = dynamic> extends self::_Im2&Object&Am2<self::Im2::Z*> {
+  synthetic constructor •() → self::Im2<self::Im2::Z*>*
+    ;
+}
+abstract class _Jm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::_Jm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Jm2<Z extends core::Object* = dynamic> extends self::_Jm2&Object&Am2<self::Jm2::Z*> {
+  synthetic constructor •() → self::Jm2<self::Jm2::Z*>*
+    ;
+}
+abstract class _Km2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::_Km2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Km2<Z extends core::Object* = dynamic> extends self::_Km2&Object&Am2<self::Km2::Z*> {
+  synthetic constructor •() → self::Km2<self::Km2::Z*>*
+    ;
+}
+abstract class _Lm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::_Lm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Lm2<Z extends core::Object* = dynamic> extends self::_Lm2&Object&Am2<self::Lm2::Z*> {
+  synthetic constructor •() → self::Lm2<self::Lm2::Z*>*
+    ;
+}
+class Mm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Mm2::Z*> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::Om2::Z*> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Pm2::Z*> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Qm2::Z*> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::Um2::Z*> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*>*
+    ;
+}
+abstract class _Bm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Bm3<Z extends core::Object* = dynamic> extends self::_Bm3&Object&Am3<self::Bm3::Z*> {
+  synthetic constructor •() → self::Bm3<self::Bm3::Z*>*
+    ;
+}
+abstract class _Cm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Cm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Cm3<Z extends core::Object* = dynamic> extends self::_Cm3&Object&Am3<self::Cm3::Z*> {
+  synthetic constructor •() → self::Cm3<self::Cm3::Z*>*
+    ;
+}
+abstract class _Dm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* core::int*, self::_Dm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Dm3<Z extends core::Object* = dynamic> extends self::_Dm3&Object&Am3<self::Dm3::Z*> {
+  synthetic constructor •() → self::Dm3<self::Dm3::Z*>*
+    ;
+}
+abstract class _Em3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* dynamic, self::_Em3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Em3<Z extends core::Object* = dynamic> extends self::_Em3&Object&Am3<self::Em3::Z*> {
+  synthetic constructor •() → self::Em3<self::Em3::Z*>*
+    ;
+}
+abstract class _Fm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* dynamic, self::_Fm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Fm3<Z extends core::Object* = dynamic> extends self::_Fm3&Object&Am3<self::Fm3::Z*> {
+  synthetic constructor •() → self::Fm3<self::Fm3::Z*>*
+    ;
+}
+abstract class _Gm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<({x: core::int*}) →* dynamic, self::_Gm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Gm3<Z extends core::Object* = dynamic> extends self::_Gm3&Object&Am3<self::Gm3::Z*> {
+  synthetic constructor •() → self::Gm3<self::Gm3::Z*>*
+    ;
+}
+abstract class _Hm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<([core::int*]) →* dynamic, self::_Hm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Hm3<Z extends core::Object* = dynamic> extends self::_Hm3&Object&Am3<self::Hm3::Z*> {
+  synthetic constructor •() → self::Hm3<self::Hm3::Z*>*
+    ;
+}
+abstract class _Im3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<([core::int*]) →* dynamic, self::_Im3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Im3<Z extends core::Object* = dynamic> extends self::_Im3&Object&Am3<self::Im3::Z*> {
+  synthetic constructor •() → self::Im3<self::Im3::Z*>*
+    ;
+}
+abstract class _Jm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::Function*) →* dynamic, self::_Jm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Jm3<Z extends core::Object* = dynamic> extends self::_Jm3&Object&Am3<self::Jm3::Z*> {
+  synthetic constructor •() → self::Jm3<self::Jm3::Z*>*
+    ;
+}
+abstract class _Km3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<() →* (() →* core::Function*) →* dynamic, self::_Km3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Km3<Z extends core::Object* = dynamic> extends self::_Km3&Object&Am3<self::Km3::Z*> {
+  synthetic constructor •() → self::Km3<self::Km3::Z*>*
+    ;
+}
+class Af1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
+    ;
+}
+class Bf1<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    ;
+}
+class Cf1<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
+    ;
+}
+class Df1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
+    ;
+}
+class Ef1<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    ;
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    ;
+}
+class Gf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    ;
+}
+class Hf1<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    ;
+}
+class If1<X extends core::Function* = dynamic> extends core::Object {
+  static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
+    ;
+}
+class Jf1<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    ;
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    ;
+}
+class Bf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    ;
+}
+class Cf2<X extends (core::int*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    ;
+}
+class Df2<X extends () →* core::int* = dynamic> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
+    ;
+}
+class Ef2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    ;
+}
+class Ff2<X extends () →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    ;
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    ;
+}
+class Hf2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    ;
+}
+class If2<X extends ([core::int*]) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
+    ;
+}
+class Jf2<X extends (core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    ;
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.strong.expect b/pkg/front_end/testcases/general/clone_function_type.dart.strong.expect
new file mode 100644
index 0000000..e2c3c3c
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.strong.expect
@@ -0,0 +1,639 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// 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 class _Bm1&Object&Am1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* core::int*, self::Om1::Z*> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Pm1::Z*> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* dynamic, self::Qm1::Z*> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object* = dynamic> = core::Object with self::Am1<core::Function*, self::Um1::Z*> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object* = dynamic> = core::Object with self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* core::int*, self::Om2::Z*> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Pm2::Z*> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* dynamic, self::Qm2::Z*> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object* = dynamic> = core::Object with self::Am2<core::Function*, self::Um2::Z*> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object* = dynamic> = core::Object with self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 class _Bm3&Object&Am3<Z extends core::Object* = dynamic> = core::Object with self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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*> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
+    return null;
+}
+class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    return null;
+}
+class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
+    return null;
+}
+class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
+    return null;
+}
+class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    return null;
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    return null;
+}
+class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    return null;
+}
+class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    return null;
+}
+class If1<X extends core::Function* = core::Function*> extends core::Object {
+  static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
+    return null;
+}
+class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    return null;
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    return null;
+}
+class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    return null;
+}
+class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    return null;
+}
+class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
+    return null;
+}
+class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    return null;
+}
+class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    return null;
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    return null;
+}
+class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    return null;
+}
+class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
+    return null;
+}
+class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    return null;
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/clone_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/general/clone_function_type.dart.strong.transformed.expect
new file mode 100644
index 0000000..4c9590f
--- /dev/null
+++ b/pkg/front_end/testcases/general/clone_function_type.dart.strong.transformed.expect
@@ -0,0 +1,639 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:22:51: Error: Expected an identifier, but got '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// 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 '}'.
+// typedef TdF = Function({int});
+//                            ^
+//
+// pkg/front_end/testcases/general/clone_function_type.dart:190:34: Error: Expected an identifier, but got '}'.
+// 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 class _Bm1&Object&Am1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::_Bm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Bm1&Object&Am1<self::_Bm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::_Cm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Cm1&Object&Am1<self::_Cm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* core::int*, self::_Dm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Dm1&Object&Am1<self::_Dm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* dynamic, self::_Em1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Em1&Object&Am1<self::_Em1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* dynamic, self::_Fm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Fm1&Object&Am1<self::_Fm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<({x: core::int*}) →* dynamic, self::_Gm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Gm1&Object&Am1<self::_Gm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::_Hm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Hm1&Object&Am1<self::_Hm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::_Im1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Im1&Object&Am1<self::_Im1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<core::Function*, self::_Jm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Jm1&Object&Am1<self::_Jm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::Function*) →* dynamic, self::_Km1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Km1&Object&Am1<self::_Km1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<() →* (() →* core::Function*) →* dynamic, self::_Lm1&Object&Am1::Z*> {
+  const synthetic constructor •() → self::_Lm1&Object&Am1<self::_Lm1&Object&Am1::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::Mm1::Z*> {
+  const synthetic constructor •() → self::Mm1<self::Mm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::int*) →* dynamic, self::Nm1::Z*> {
+  const synthetic constructor •() → self::Nm1<self::Nm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* core::int*, self::Om1::Z*> {
+  const synthetic constructor •() → self::Om1<self::Om1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* dynamic, self::Pm1::Z*> {
+  const synthetic constructor •() → self::Pm1<self::Pm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* dynamic, self::Qm1::Z*> {
+  const synthetic constructor •() → self::Qm1<self::Qm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<({x: core::int*}) →* dynamic, self::Rm1::Z*> {
+  const synthetic constructor •() → self::Rm1<self::Rm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::Sm1::Z*> {
+  const synthetic constructor •() → self::Sm1<self::Sm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<([core::int*]) →* dynamic, self::Tm1::Z*> {
+  const synthetic constructor •() → self::Tm1<self::Tm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<core::Function*, self::Um1::Z*> {
+  const synthetic constructor •() → self::Um1<self::Um1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<(core::Function*) →* dynamic, self::Vm1::Z*> {
+  const synthetic constructor •() → self::Vm1<self::Vm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm1<Z extends core::Object* = dynamic> extends core::Object implements self::Am1<() →* (() →* core::Function*) →* dynamic, self::Wm1::Z*> {
+  const synthetic constructor •() → self::Wm1<self::Wm1::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Am2<X extends () →* dynamic = () →* dynamic, Y extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Am2<self::Am2::X*, self::Am2::Y*>*
+    : super core::Object::•()
+    ;
+}
+abstract class _Bm2&Object&Am2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::_Bm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Bm2&Object&Am2<self::_Bm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::_Cm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Cm2&Object&Am2<self::_Cm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* core::int*, self::_Dm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Dm2&Object&Am2<self::_Dm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* dynamic, self::_Em2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Em2&Object&Am2<self::_Em2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* dynamic, self::_Fm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Fm2&Object&Am2<self::_Fm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<({x: core::int*}) →* dynamic, self::_Gm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Gm2&Object&Am2<self::_Gm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::_Hm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Hm2&Object&Am2<self::_Hm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::_Im2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Im2&Object&Am2<self::_Im2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<core::Function*, self::_Jm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Jm2&Object&Am2<self::_Jm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::Function*) →* dynamic, self::_Km2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Km2&Object&Am2<self::_Km2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<() →* (() →* core::Function*) →* dynamic, self::_Lm2&Object&Am2::Z*> {
+  const synthetic constructor •() → self::_Lm2&Object&Am2<self::_Lm2&Object&Am2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::Mm2::Z*> {
+  const synthetic constructor •() → self::Mm2<self::Mm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Nm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::int*) →* dynamic, self::Nm2::Z*> {
+  const synthetic constructor •() → self::Nm2<self::Nm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Om2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* core::int*, self::Om2::Z*> {
+  const synthetic constructor •() → self::Om2<self::Om2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Pm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* dynamic, self::Pm2::Z*> {
+  const synthetic constructor •() → self::Pm2<self::Pm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Qm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* dynamic, self::Qm2::Z*> {
+  const synthetic constructor •() → self::Qm2<self::Qm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Rm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<({x: core::int*}) →* dynamic, self::Rm2::Z*> {
+  const synthetic constructor •() → self::Rm2<self::Rm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Sm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::Sm2::Z*> {
+  const synthetic constructor •() → self::Sm2<self::Sm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Tm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<([core::int*]) →* dynamic, self::Tm2::Z*> {
+  const synthetic constructor •() → self::Tm2<self::Tm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Um2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<core::Function*, self::Um2::Z*> {
+  const synthetic constructor •() → self::Um2<self::Um2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Vm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<(core::Function*) →* dynamic, self::Vm2::Z*> {
+  const synthetic constructor •() → self::Vm2<self::Vm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+class Wm2<Z extends core::Object* = dynamic> extends core::Object implements self::Am2<() →* (() →* core::Function*) →* dynamic, self::Wm2::Z*> {
+  const synthetic constructor •() → self::Wm2<self::Wm2::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 class _Bm3&Object&Am3<Z extends core::Object* = dynamic> extends core::Object implements self::Am3<(core::int*) →* dynamic, self::_Bm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Bm3&Object&Am3<self::_Bm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<(core::int*) →* dynamic, self::_Cm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Cm3&Object&Am3<self::_Cm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* core::int*, self::_Dm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Dm3&Object&Am3<self::_Dm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* dynamic, self::_Em3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Em3&Object&Am3<self::_Em3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* dynamic, self::_Fm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Fm3&Object&Am3<self::_Fm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<({x: core::int*}) →* dynamic, self::_Gm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Gm3&Object&Am3<self::_Gm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<([core::int*]) →* dynamic, self::_Hm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Hm3&Object&Am3<self::_Hm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<([core::int*]) →* dynamic, self::_Im3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Im3&Object&Am3<self::_Im3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<(core::Function*) →* dynamic, self::_Jm3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Jm3&Object&Am3<self::_Jm3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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> extends core::Object implements self::Am3<() →* (() →* core::Function*) →* dynamic, self::_Km3&Object&Am3::Z*> {
+  const synthetic constructor •() → self::_Km3&Object&Am3<self::_Km3&Object&Am3::Z*>*
+    : super core::Object::•()
+    ;
+}
+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 = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Af1<self::Af1::foo::X*>*
+    return null;
+}
+class Bf1<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf1<self::Bf1::foo::X*>*
+    return null;
+}
+class Cf1<X extends () →* core::int* = () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Cf1<self::Cf1::foo::X*>*
+    return null;
+}
+class Df1<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Df1<self::Df1::foo::X*>*
+    return null;
+}
+class Ef1<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef1<self::Ef1::foo::X*>*
+    return null;
+}
+class Ff1<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Ff1<self::Ff1::foo::X*>*
+    return null;
+}
+class Gf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Gf1<self::Gf1::foo::X*>*
+    return null;
+}
+class Hf1<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf1<self::Hf1::foo::X*>*
+    return null;
+}
+class If1<X extends core::Function* = core::Function*> extends core::Object {
+  static factory foo<X extends core::Function* = dynamic>() → self::If1<self::If1::foo::X*>*
+    return null;
+}
+class Jf1<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf1<self::Jf1::foo::X*>*
+    return null;
+}
+class Kf1<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf1<self::Kf1::foo::X*>*
+    return null;
+}
+class Bf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Bf2<self::Bf2::foo::X*>*
+    return null;
+}
+class Cf2<X extends (core::int*) →* dynamic = (core::int*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::int*) →* dynamic = dynamic>() → self::Cf2<self::Cf2::foo::X*>*
+    return null;
+}
+class Df2<X extends () →* core::int* = () →* core::int*> extends core::Object {
+  static factory foo<X extends () →* core::int* = dynamic>() → self::Df2<self::Df2::foo::X*>*
+    return null;
+}
+class Ef2<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ef2<self::Ef2::foo::X*>*
+    return null;
+}
+class Ff2<X extends () →* dynamic = () →* dynamic> extends core::Object {
+  static factory foo<X extends () →* dynamic = dynamic>() → self::Ff2<self::Ff2::foo::X*>*
+    return null;
+}
+class Gf2<X extends ({x: core::int*}) →* dynamic = ({x: core::int*}) →* dynamic> extends core::Object {
+  static factory foo<X extends ({x: core::int*}) →* dynamic = dynamic>() → self::Gf2<self::Gf2::foo::X*>*
+    return null;
+}
+class Hf2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::Hf2<self::Hf2::foo::X*>*
+    return null;
+}
+class If2<X extends ([core::int*]) →* dynamic = ([core::int*]) →* dynamic> extends core::Object {
+  static factory foo<X extends ([core::int*]) →* dynamic = dynamic>() → self::If2<self::If2::foo::X*>*
+    return null;
+}
+class Jf2<X extends (core::Function*) →* dynamic = (core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends (core::Function*) →* dynamic = dynamic>() → self::Jf2<self::Jf2::foo::X*>*
+    return null;
+}
+class Kf2<X extends () →* (() →* core::Function*) →* dynamic = () →* (() →* core::Function*) →* dynamic> extends core::Object {
+  static factory foo<X extends () →* (() →* core::Function*) →* dynamic = dynamic>() → self::Kf2<self::Kf2::foo::X*>*
+    return null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/closure.dart b/pkg/front_end/testcases/general/closure.dart
similarity index 100%
rename from pkg/front_end/testcases/closure.dart
rename to pkg/front_end/testcases/general/closure.dart
diff --git a/pkg/front_end/testcases/closure.dart.hierarchy.expect b/pkg/front_end/testcases/general/closure.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/closure.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/closure.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/closure.dart.legacy.expect b/pkg/front_end/testcases/general/closure.dart.legacy.expect
new file mode 100644
index 0000000..b3ea310
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.legacy.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic _field = new self::Bar::•();
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback.call();
+}
+static method main() → dynamic {
+  dynamic x;
+  function inner() → dynamic {
+    x = new self::Foo::•();
+    return new self::Foo::•();
+  }
+  self::useCallback(inner);
+  dynamic _ = inner.call()._field;
+}
diff --git a/pkg/front_end/testcases/general/closure.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/closure.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b3ea310
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic _field = new self::Bar::•();
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback.call();
+}
+static method main() → dynamic {
+  dynamic x;
+  function inner() → dynamic {
+    x = new self::Foo::•();
+    return new self::Foo::•();
+  }
+  self::useCallback(inner);
+  dynamic _ = inner.call()._field;
+}
diff --git a/pkg/front_end/testcases/general/closure.dart.outline.expect b/pkg/front_end/testcases/general/closure.dart.outline.expect
new file mode 100644
index 0000000..0f97df6
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic _field;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    ;
+}
+static method useCallback(dynamic callback) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/closure.dart.strong.expect b/pkg/front_end/testcases/general/closure.dart.strong.expect
new file mode 100644
index 0000000..bb83955
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.strong.expect
@@ -0,0 +1,27 @@
+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::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback.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.call().{self::Foo::_field};
+}
diff --git a/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect b/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect
new file mode 100644
index 0000000..bb83955
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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::•()
+    ;
+}
+class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+static method useCallback(dynamic callback) → dynamic {
+  dynamic _ = callback.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.call().{self::Foo::_field};
+}
diff --git a/pkg/front_end/testcases/general/closure.dart.type_promotion.expect b/pkg/front_end/testcases/general/closure.dart.type_promotion.expect
new file mode 100644
index 0000000..82f0475
--- /dev/null
+++ b/pkg/front_end/testcases/general/closure.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/closure.dart:18:7: Context: Write to x@336
+    x = new Foo();
+      ^
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart
similarity index 100%
rename from pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart
rename to pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart
diff --git a/pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.hierarchy.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/co19_language_metadata_syntax_t04.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.expect
new file mode 100644
index 0000000..29828db
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.expect
@@ -0,0 +1,29 @@
+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 {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
new file mode 100644
index 0000000..29828db
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+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 {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.outline.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.outline.expect
new file mode 100644
index 0000000..fbca3b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.outline.expect
@@ -0,0 +1,29 @@
+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 {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.expect
new file mode 100644
index 0000000..29828db
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.expect
@@ -0,0 +1,29 @@
+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 {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.transformed.expect b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
new file mode 100644
index 0000000..29828db
--- /dev/null
+++ b/pkg/front_end/testcases/general/co19_language_metadata_syntax_t04.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+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 {
+  const constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart b/pkg/front_end/testcases/general/complex_class_hierarchy.dart
similarity index 100%
rename from pkg/front_end/testcases/complex_class_hierarchy.dart
rename to pkg/front_end/testcases/general/complex_class_hierarchy.dart
diff --git a/pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/complex_class_hierarchy.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/complex_class_hierarchy.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.legacy.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.legacy.expect
new file mode 100644
index 0000000..4be677f
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.legacy.expect
@@ -0,0 +1,110 @@
+library;
+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 D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class G<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    : super core::Object::•()
+    ;
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+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/complex_class_hierarchy.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4be677f
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.legacy.transformed.expect
@@ -0,0 +1,110 @@
+library;
+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 D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class G<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    : super core::Object::•()
+    ;
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+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/complex_class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
new file mode 100644
index 0000000..901ca71
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.outline.expect
@@ -0,0 +1,90 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+}
+class G<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    ;
+}
+class GB extends self::G<self::B*> {
+  synthetic constructor •() → self::GB*
+    ;
+}
+class GC extends self::G<self::C*> {
+  synthetic constructor •() → self::GC*
+    ;
+}
+class GD extends self::G<self::D*> {
+  synthetic constructor •() → self::GD*
+    ;
+}
+class X extends core::Object implements self::A {
+  synthetic constructor •() → self::X*
+    ;
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    ;
+}
+class Z extends core::Object implements self::Y {
+  synthetic constructor •() → self::Z*
+    ;
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    ;
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    ;
+}
+class GY extends self::X implements self::GB {
+  synthetic constructor •() → self::GY*
+    ;
+}
+class GZ extends core::Object implements self::Y, self::GC {
+  synthetic constructor •() → self::GZ*
+    ;
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    ;
+}
+class GU extends self::GW {
+  synthetic constructor •() → self::GU*
+    ;
+}
+class GV extends self::GU implements self::GW {
+  synthetic constructor •() → self::GV*
+    ;
+}
+class ARO<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ARO<self::ARO::S*>*
+    ;
+}
+class ARQ<T extends core::Object* = dynamic> extends core::Object implements self::ARO<self::ARQ::T*> {
+  synthetic constructor •() → self::ARQ<self::ARQ::T*>*
+    ;
+}
+class ARN extends self::ARQ<self::A*> {
+  synthetic constructor •() → self::ARN*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/complex_class_hierarchy.dart.strong.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.strong.expect
new file mode 100644
index 0000000..def07a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.strong.expect
@@ -0,0 +1,110 @@
+library;
+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 D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class G<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    : super core::Object::•()
+    ;
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+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/complex_class_hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.strong.transformed.expect
new file mode 100644
index 0000000..def07a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/complex_class_hierarchy.dart.strong.transformed.expect
@@ -0,0 +1,110 @@
+library;
+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 D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+class G<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class W extends core::Object implements self::Z {
+  synthetic constructor •() → self::W*
+    : super core::Object::•()
+    ;
+}
+class GX extends core::Object implements self::G<self::A*> {
+  synthetic constructor •() → self::GX*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+class GW extends core::Object implements self::Z, self::GD {
+  synthetic constructor •() → self::GW*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+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/constructor_const_inference.dart b/pkg/front_end/testcases/general/constructor_const_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/constructor_const_inference.dart
rename to pkg/front_end/testcases/general/constructor_const_inference.dart
diff --git a/pkg/front_end/testcases/constructor_const_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_const_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/constructor_const_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.expect
new file mode 100644
index 0000000..e244e2a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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>().x;
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e244e2a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.legacy.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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>().x;
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.outline.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.outline.expect
new file mode 100644
index 0000000..6cda74d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::_Y<self::A::T*>* x;
+  constructor •(self::_Y<self::A::T*>* x) → self::A<self::A::T*>*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  constructor •() → self::B<self::B::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
new file mode 100644
index 0000000..9b8bc6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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};
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<core::Null*> {}
+}
diff --git a/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..9b8bc6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_const_inference.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _Y<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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};
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<core::Null*> {}
+}
diff --git a/pkg/front_end/testcases/constructor_cycle.dart b/pkg/front_end/testcases/general/constructor_cycle.dart
similarity index 100%
rename from pkg/front_end/testcases/constructor_cycle.dart
rename to pkg/front_end/testcases/general/constructor_cycle.dart
diff --git a/pkg/front_end/testcases/constructor_cycle.dart.hierarchy.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_cycle.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/constructor_cycle.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.expect
new file mode 100644
index 0000000..d27a472
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.expect
@@ -0,0 +1,32 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d27a472
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.legacy.transformed.expect
@@ -0,0 +1,32 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.outline.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.outline.expect
new file mode 100644
index 0000000..0f4bd7a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.outline.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor foo() → self::A*
+    ;
+  constructor bar() → self::A*
+    ;
+  constructor baz() → self::A*
+    ;
+  constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.strong.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.strong.expect
new file mode 100644
index 0000000..d27a472
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.strong.expect
@@ -0,0 +1,32 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/constructor_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_cycle.dart.strong.transformed.expect
new file mode 100644
index 0000000..d27a472
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_cycle.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/constructor_function_types.dart b/pkg/front_end/testcases/general/constructor_function_types.dart
similarity index 100%
rename from pkg/front_end/testcases/constructor_function_types.dart
rename to pkg/front_end/testcases/general/constructor_function_types.dart
diff --git a/pkg/front_end/testcases/constructor_function_types.dart.hierarchy.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_function_types.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/constructor_function_types.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/constructor_function_types.dart.legacy.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.legacy.expect
new file mode 100644
index 0000000..dfca6ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.legacy.expect
@@ -0,0 +1,30 @@
+library;
+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 •(core::int* x, core::double* y, core::String* s) → self::B*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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_function_types.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.legacy.transformed.expect
new file mode 100644
index 0000000..dfca6ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.legacy.transformed.expect
@@ -0,0 +1,30 @@
+library;
+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 •(core::int* x, core::double* y, core::String* s) → self::B*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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_function_types.dart.outline.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.outline.expect
new file mode 100644
index 0000000..cdb1d5b
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  constructor •(core::int* x, core::double* y, core::String* s) → self::B*
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    ;
+}
+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*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/constructor_function_types.dart.strong.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.strong.expect
new file mode 100644
index 0000000..dfca6ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+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 •(core::int* x, core::double* y, core::String* s) → self::B*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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_function_types.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_function_types.dart.strong.transformed.expect
new file mode 100644
index 0000000..dfca6ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_function_types.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+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 •(core::int* x, core::double* y, core::String* s) → self::B*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+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/constructor_initializer_invalid.dart b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart
similarity index 100%
rename from pkg/front_end/testcases/constructor_initializer_invalid.dart
rename to pkg/front_end/testcases/general/constructor_initializer_invalid.dart
diff --git a/pkg/front_end/testcases/constructor_initializer_invalid.dart.hierarchy.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/constructor_initializer_invalid.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/constructor_initializer_invalid.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.expect
new file mode 100644
index 0000000..d8bf1be
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.expect
@@ -0,0 +1,57 @@
+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() : ; }
+                         ^"
+    ;
+}
+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::•()
+    ;
+}
+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++; }
+                         ^"
+    ;
+}
+static method main() → dynamic {
+  dynamic c1 = new self::C1::•();
+  c1.toString();
+  dynamic c2 = new self::C2::•();
+  c2.toString();
+  dynamic c3 = new self::C3::•();
+  c3.toString();
+}
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d8bf1be
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.legacy.transformed.expect
@@ -0,0 +1,57 @@
+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() : ; }
+                         ^"
+    ;
+}
+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::•()
+    ;
+}
+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++; }
+                         ^"
+    ;
+}
+static method main() → dynamic {
+  dynamic c1 = new self::C1::•();
+  c1.toString();
+  dynamic c2 = new self::C2::•();
+  c2.toString();
+  dynamic c3 = new self::C3::•();
+  c3.toString();
+}
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.outline.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.outline.expect
new file mode 100644
index 0000000..bd5723a
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.outline.expect
@@ -0,0 +1,38 @@
+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++; }
+//                          ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C1 extends core::Object {
+  field core::int* f;
+  constructor •() → self::C1*
+    ;
+}
+class C2 extends core::Object {
+  field core::int* f;
+  constructor •() → self::C2*
+    ;
+}
+class C3 extends core::Object {
+  field core::int* f;
+  constructor •() → self::C3*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.expect
new file mode 100644
index 0000000..7cf2d27
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.expect
@@ -0,0 +1,57 @@
+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() : ; }
+                         ^"
+    ;
+}
+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; }
+                          ^" as{TypeError} core::int*, super core::Object::•()
+    ;
+}
+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++; }
+                         ^"
+    ;
+}
+static method main() → dynamic {
+  self::C1* c1 = new self::C1::•();
+  c1.{core::Object::toString}();
+  self::C2* c2 = new self::C2::•();
+  c2.{core::Object::toString}();
+  self::C3* c3 = new self::C3::•();
+  c3.{core::Object::toString}();
+}
diff --git a/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.transformed.expect b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.transformed.expect
new file mode 100644
index 0000000..7cf2d27
--- /dev/null
+++ b/pkg/front_end/testcases/general/constructor_initializer_invalid.dart.strong.transformed.expect
@@ -0,0 +1,57 @@
+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() : ; }
+                         ^"
+    ;
+}
+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; }
+                          ^" as{TypeError} core::int*, super core::Object::•()
+    ;
+}
+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++; }
+                         ^"
+    ;
+}
+static method main() → dynamic {
+  self::C1* c1 = new self::C1::•();
+  c1.{core::Object::toString}();
+  self::C2* c2 = new self::C2::•();
+  c2.{core::Object::toString}();
+  self::C3* c3 = new self::C3::•();
+  c3.{core::Object::toString}();
+}
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart b/pkg/front_end/testcases/general/continue_inference_after_error.dart
similarity index 100%
rename from pkg/front_end/testcases/continue_inference_after_error.dart
rename to pkg/front_end/testcases/general/continue_inference_after_error.dart
diff --git a/pkg/front_end/testcases/continue_inference_after_error.dart.hierarchy.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/continue_inference_after_error.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/continue_inference_after_error.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.expect
new file mode 100644
index 0000000..1ebe329
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.expect
@@ -0,0 +1,27 @@
+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());
+//   ^^^
+//
+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::•()
+    ;
+}
+static method test() → dynamic {
+  let final<BottomType> #t1 = 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* #t2 = new self::C::•().missing() in null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1ebe329
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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());
+//   ^^^
+//
+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::•()
+    ;
+}
+static method test() → dynamic {
+  let final<BottomType> #t1 = 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* #t2 = new self::C::•().missing() in null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.outline.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.outline.expect
new file mode 100644
index 0000000..d71903c
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+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*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.expect
new file mode 100644
index 0000000..7976271
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.expect
@@ -0,0 +1,37 @@
+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::•()
+    ;
+}
+static method test() → dynamic {
+  let final<BottomType> #t1 = 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* #t2 = 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 null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.transformed.expect b/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.transformed.expect
new file mode 100644
index 0000000..7976271
--- /dev/null
+++ b/pkg/front_end/testcases/general/continue_inference_after_error.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+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::•()
+    ;
+}
+static method test() → dynamic {
+  let final<BottomType> #t1 = 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* #t2 = 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 null;
+}
+static method main() → dynamic {}
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/continue_inference_after_error_lib.dart b/pkg/front_end/testcases/general/continue_inference_after_error_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/continue_inference_after_error_lib.dart
rename to pkg/front_end/testcases/general/continue_inference_after_error_lib.dart
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart b/pkg/front_end/testcases/general/control_flow_collection.dart
new file mode 100644
index 0000000..63e2664
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart
@@ -0,0 +1,39 @@
+// 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.
+
+main() {
+  final aList = <int>[
+    1,
+    if (oracle()) 2,
+    if (oracle()) 3 else -1,
+    if (oracle()) if (oracle()) 4,
+    for (int i in <int>[5, 6, 7]) i,
+    for (int i in <int>[8, 9, 10]) if (oracle()) i,
+    for (int i = 11; i <= 14; ++i) i,
+  ];
+  final aSet = <int>{
+    1,
+    if (oracle()) 2,
+    if (oracle()) 3 else -1,
+    if (oracle()) if (oracle()) 4,
+    for (int i in <int>[5, 6, 7]) i,
+    for (int i in <int>[8, 9, 10]) if (oracle()) i,
+    for (int i = 11; i <= 14; ++i) i,
+  };
+  final aMap = <int, int>{
+    1: 1,
+    if (oracle()) 2: 2,
+    if (oracle()) 3: 3 else -1: -1,
+    if (oracle()) if (oracle()) 4: 4,
+    for (int i in <int>[5, 6, 7]) i: i,
+    for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+    for (int i = 11; i <= 14; ++i) i: i,
+  };
+
+  print(aList);
+  print(aSet);
+  print(aMap);
+}
+
+oracle() => true;
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.legacy.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.legacy.expect
new file mode 100644
index 0000000..2a2e0fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.legacy.expect
@@ -0,0 +1,113 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:8:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:9:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3 else -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:10:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:10:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:11:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:12:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:12:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:13:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:17:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:18:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3 else -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:19:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:19:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:20:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:21:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:21:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:22:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:26:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2: 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:27:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3: 3 else -1: -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:28:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4: 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:28:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4: 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:29:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i: i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:30:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:30:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:31:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i: i,
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int*>[1];
+  final dynamic aSet = <core::int*>{1};
+  final dynamic aMap = <core::int*, core::int*>{1: 1};
+  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.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2a2e0fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.legacy.transformed.expect
@@ -0,0 +1,113 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:8:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:9:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3 else -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:10:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:10:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:11:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:12:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:12:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:13:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:17:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:18:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3 else -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:19:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:19:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:20:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:21:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:21:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:22:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:26:5: Error: Unexpected token 'if'.
+//     if (oracle()) 2: 2,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:27:5: Error: Unexpected token 'if'.
+//     if (oracle()) 3: 3 else -1: -1,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:28:19: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4: 4,
+//                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:28:5: Error: Unexpected token 'if'.
+//     if (oracle()) if (oracle()) 4: 4,
+//     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:29:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[5, 6, 7]) i: i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:30:36: Error: Unexpected token 'if'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:30:5: Error: Unexpected token 'for'.
+//     for (int i in <int>[8, 9, 10]) if (oracle()) i: i,
+//     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection.dart:31:5: Error: Unexpected token 'for'.
+//     for (int i = 11; i <= 14; ++i) i: i,
+//     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int*>[1];
+  final dynamic aSet = <core::int*>{1};
+  final dynamic aMap = <core::int*, core::int*>{1: 1};
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method oracle() → dynamic
+  return true;
diff --git a/pkg/front_end/testcases/control_flow_collection.dart.outline.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/control_flow_collection.dart.outline.expect
rename to pkg/front_end/testcases/general/control_flow_collection.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect
new file mode 100644
index 0000000..f133a9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.expect
@@ -0,0 +1,72 @@
+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*>[];
+    #t1.{core::List::add}(1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t1.{core::List::add}(2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t1.{core::List::add}(3);
+    else
+      #t1.{core::List::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t1.{core::List::add}(4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t1.{core::List::add}(i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t1.{core::List::add}(i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t1.{core::List::add}(i);
+  } =>#t1;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    #t2.{core::Set::add}(1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t2.{core::Set::add}(2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t2.{core::Set::add}(3);
+    else
+      #t2.{core::Set::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t2.{core::Set::add}(4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t2.{core::Set::add}(i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t2.{core::Set::add}(i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t2.{core::Set::add}(i);
+  } =>#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::[]=}(1, 1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t3.{core::Map::[]=}(2, 2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t3.{core::Map::[]=}(3, 3);
+    else
+      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t3.{core::Map::[]=}(4, 4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t3.{core::Map::[]=}(i, i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t3.{core::Map::[]=}(i, i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t3.{core::Map::[]=}(i, i);
+  } =>#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.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
new file mode 100644
index 0000000..f133a9d
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+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*>[];
+    #t1.{core::List::add}(1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t1.{core::List::add}(2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t1.{core::List::add}(3);
+    else
+      #t1.{core::List::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t1.{core::List::add}(4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t1.{core::List::add}(i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t1.{core::List::add}(i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t1.{core::List::add}(i);
+  } =>#t1;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>();
+    #t2.{core::Set::add}(1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t2.{core::Set::add}(2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t2.{core::Set::add}(3);
+    else
+      #t2.{core::Set::add}(1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t2.{core::Set::add}(4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t2.{core::Set::add}(i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t2.{core::Set::add}(i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t2.{core::Set::add}(i);
+  } =>#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::[]=}(1, 1);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t3.{core::Map::[]=}(2, 2);
+    if(self::oracle() as{TypeError} core::bool*)
+      #t3.{core::Map::[]=}(3, 3);
+    else
+      #t3.{core::Map::[]=}(1.{core::int::unary-}(), 1.{core::int::unary-}());
+    if(self::oracle() as{TypeError} core::bool*)
+      if(self::oracle() as{TypeError} core::bool*)
+        #t3.{core::Map::[]=}(4, 4);
+    for (core::int* i in <core::int*>[5, 6, 7])
+      #t3.{core::Map::[]=}(i, i);
+    for (core::int* i in <core::int*>[8, 9, 10])
+      if(self::oracle() as{TypeError} core::bool*)
+        #t3.{core::Map::[]=}(i, i);
+    for (core::int* i = 11; i.{core::num::<=}(14); i = i.{core::num::+}(1))
+      #t3.{core::Map::[]=}(i, i);
+  } =>#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.dart.type_promotion.expect b/pkg/front_end/testcases/general/control_flow_collection.dart.type_promotion.expect
new file mode 100644
index 0000000..c79cbe1
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/general/control_flow_collection.dart:13:31: Context: Write to i@354
+    for (int i = 11; i <= 14; ++i) i,
+                              ^^
+pkg/front_end/testcases/general/control_flow_collection.dart:22:31: Context: Write to i@354
+    for (int i = 11; i <= 14; ++i) i,
+                              ^^
+pkg/front_end/testcases/general/control_flow_collection.dart:31:31: Context: Write to i@354
+    for (int i = 11; i <= 14; ++i) i: i,
+                              ^^
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart b/pkg/front_end/testcases/general/control_flow_collection_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/control_flow_collection_inference.dart
rename to pkg/front_end/testcases/general/control_flow_collection_inference.dart
diff --git a/pkg/front_end/testcases/control_flow_collection_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/control_flow_collection_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/control_flow_collection_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.expect
new file mode 100644
index 0000000..09377d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.expect
@@ -0,0 +1,2040 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
+//   var list10 = [if (oracle("foo")) 42];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
+//   var set10 = {if (oracle("foo")) 42, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
+//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
+//   var list11 = [if (oracle("foo")) dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
+//   var set11 = {if (oracle("foo")) dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
+//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
+//   var list12 = [if (oracle("foo")) [42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
+//   var set12 = {if (oracle("foo")) [42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                        ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
+//   List<List<int>> list70 = [if (oracle("foo")) []];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
+//   var list80 = [if (oracle("foo")) 42 else 3.14];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
+//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
+//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
+//   List<int> list90 = [if (oracle("foo")) dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
+//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
+//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
+//   List<int> list100 = [if (dynVar) 42];
+//                        ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
+//   Set<int> set100 = {if (dynVar) 42};
+//                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
+//   Map<int, int> map100 = {if (dynVar) 42: 42};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) "bar"];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) "bar", null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//            ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//            ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
+//   List<int> list20 = [if (42) 42];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
+//   Set<int> set20 = {if (42) 42};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
+//   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:42: Error: Unexpected token 'if'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
+//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
+//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
+//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
+//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
+//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
+//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
+//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
+//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
+//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
+//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
+//   var map80 = {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:179:16: Error: Unexpected token 'for'.
+//   var map80 = {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:180:67: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
+//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
+//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
+//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
+//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
+//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
+//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+//                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
+//   var list110 = [for (var i in [1, 2, 3]) i];
+//                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
+//   var set110 = {for (var i in [1, 2, 3]) i, null};
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
+//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
+//   List<int> list120 = [for (var i in dynVar) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
+//   Set<int> set120 = {for (var i in dynVar) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
+//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
+//                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
+//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
+//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
+//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
+//   <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:12: Error: Unexpected token 'for'.
+//   <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:48: Error: Unexpected token 'if'.
+//   <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:12: Error: Unexpected token 'for'.
+//   <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:56: Error: Unexpected token 'if'.
+//   <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:20: Error: Unexpected token 'for'.
+//   <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:59: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
+//   <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:67: Error: Unexpected token '...'.
+//   <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:224:53: Error: Unexpected token 'if'.
+//   <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:224:17: Error: Unexpected token 'for'.
+//   <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:67: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
+//   <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:82: Error: Unexpected token '...'.
+//   <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:227:53: Error: Unexpected token 'if'.
+//   <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:227:17: Error: Unexpected token 'for'.
+//   <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:230:9: Error: Unexpected token 'for'.
+//   <int>[for (i in <int>[1]) i];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
+//   <int>{for (i in <int>[1]) i, null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
+//   var list10 = [for (var i in "not iterable") i];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
+//   var list30 = [await for (var i in "not stream") i];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
+//   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: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:246:23: Error: Unexpected token 'for'.
+//   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:247:22: Error: Unexpected token 'for'.
+//   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:248:22: Error: Unexpected token 'for'.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
+//   var list60 = [for (; "not bool";) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
+//   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:255:15: Error: Unexpected token 'for'.
+//   <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:256:15: Error: Unexpected token 'for'.
+//   <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};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
+//   List<int> list10 = [if (a is B) a.foo];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
+//   Set<int> set10 = {if (a is B) a.foo};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
+//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+//                          ^^
+//
+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::•()
+    ;
+}
+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 {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list40 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set40 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list41 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set41 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list42 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set42 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list50 = <dynamic>[];
+  core::Set<core::int*>* set50 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list51 = <dynamic>[];
+  core::Set<core::int*>* set51 = <dynamic>{null};
+  core::List<core::int*>* list52 = <dynamic>[];
+  core::Set<core::int*>* set52 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map52 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list60 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set60 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list61 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set61 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list70 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set70 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list71 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set71 = <dynamic>{null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic>{null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list90 = <dynamic>[];
+  core::Set<core::int*>* set90 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list91 = <dynamic>[];
+  core::Set<core::int*>* set91 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list100 = <dynamic>[];
+  core::Set<core::int*>* set100 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map100 = <dynamic, dynamic>{};
+}
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::String*>[];
+  <core::String*>{null};
+  <core::String*, core::String*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  core::Set<dynamic>* set10 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic>* map10 = <dynamic, dynamic>{};
+  core::Set<dynamic>* set11 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{};
+  dynamic map12 = <dynamic, dynamic>{};
+  dynamic map13 = <dynamic, dynamic>{};
+  core::List<core::int*>* list20 = <dynamic>[];
+  core::Set<core::int*>* set20 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map30 = <dynamic, dynamic>{};
+  core::List<core::String*>* list40 = <core::String*>[];
+  core::Set<core::String*>* set40 = <core::String*>{};
+  core::Map<core::String*, core::int*>* map40 = <core::String*, core::int*>{};
+  core::Map<core::int*, core::String*>* map41 = <core::int*, core::String*>{};
+}
+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 {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list40 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set40 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list41 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set41 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list42 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set42 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list50 = <dynamic>[];
+  core::Set<core::int*>* set50 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list51 = <dynamic>[];
+  core::Set<core::int*>* set51 = <dynamic>{null};
+  core::List<core::int*>* list52 = <dynamic>[];
+  core::Set<core::int*>* set52 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list60 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set60 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list61 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set61 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list70 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set70 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map70 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list71 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set71 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map71 = <dynamic, dynamic>{"baz": null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic, dynamic>{"baz": null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list90 = <dynamic>[];
+  core::Set<core::int*>* set90 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list91 = <dynamic>[];
+  core::Set<core::int*>* set91 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list100 = <core::int*>[];
+  core::Set<core::int*>* set100 = <core::int*>{};
+  core::Map<core::String*, core::int*>* map100 = <core::String*, core::int*>{};
+  dynamic list110 = <dynamic>[];
+  dynamic set110 = <dynamic>{null};
+  dynamic map110 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list120 = <dynamic>[];
+  core::Set<core::int*>* set120 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map120 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list130 = <dynamic>[];
+  core::Set<core::int*>* set130 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map130 = <dynamic, dynamic>{};
+}
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
+  <core::int*>[];
+  <core::int*>{null};
+  <core::int*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::int*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::int*, core::int*>{42: null};
+  <core::String*>[];
+  <core::String*>{null};
+  <core::String*, core::String*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  final dynamic i = 0;
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list40 = <dynamic>[];
+  dynamic set40 = <dynamic>{null};
+  dynamic map40 = <dynamic, dynamic>{"baz": null};
+  dynamic list50 = <dynamic>[];
+  dynamic set50 = <dynamic>{null};
+  dynamic map50 = <dynamic, dynamic>{"baz": null};
+  dynamic list60 = <dynamic>[];
+  dynamic set60 = <dynamic>{null};
+  dynamic map60 = <dynamic, dynamic>{"baz": null};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
+  <core::int*>[];
+  <core::int*>{};
+  <core::String*, core::int*>{};
+}
+static method testPromotion(self::A* a) → dynamic {
+  core::List<core::int*>* list10 = <dynamic>[];
+  core::Set<core::int*>* set10 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map10 = <dynamic, dynamic>{};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..629d539
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.legacy.transformed.expect
@@ -0,0 +1,2063 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:10:17: Error: Unexpected token 'if'.
+//   var list10 = [if (oracle("foo")) 42];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:11:16: Error: Unexpected token 'if'.
+//   var set10 = {if (oracle("foo")) 42, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:12:16: Error: Unexpected token 'if'.
+//   var map10 = {if (oracle("foo")) "bar": 42, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:13:17: Error: Unexpected token 'if'.
+//   var list11 = [if (oracle("foo")) dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:14:16: Error: Unexpected token 'if'.
+//   var set11 = {if (oracle("foo")) dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:15:16: Error: Unexpected token 'if'.
+//   var map11 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:16:17: Error: Unexpected token 'if'.
+//   var list12 = [if (oracle("foo")) [42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:17:16: Error: Unexpected token 'if'.
+//   var set12 = {if (oracle("foo")) [42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:18:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) "bar": [42], "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:19:36: Error: Unexpected token '...'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:19:17: Error: Unexpected token 'if'.
+//   var list20 = [if (oracle("foo")) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:20:35: Error: Unexpected token '...'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:20:16: Error: Unexpected token 'if'.
+//   var set20 = {if (oracle("foo")) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:21:35: Error: Unexpected token '...'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:21:16: Error: Unexpected token 'if'.
+//   var map20 = {if (oracle("foo")) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:22:36: Error: Unexpected token '...'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:22:17: Error: Unexpected token 'if'.
+//   var list21 = [if (oracle("foo")) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:23:35: Error: Unexpected token '...'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:23:16: Error: Unexpected token 'if'.
+//   var set21 = {if (oracle("foo")) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:24:35: Error: Unexpected token '...'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:24:16: Error: Unexpected token 'if'.
+//   var map21 = {if (oracle("foo")) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:25:36: Error: Unexpected token '...'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:25:17: Error: Unexpected token 'if'.
+//   var list22 = [if (oracle("foo")) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:26:35: Error: Unexpected token '...'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:26:16: Error: Unexpected token 'if'.
+//   var set22 = {if (oracle("foo")) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:27:35: Error: Unexpected token '...'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:27:16: Error: Unexpected token 'if'.
+//   var map22 = {if (oracle("foo")) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:50: Error: Unexpected token '...'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:36: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:28:17: Error: Unexpected token 'if'.
+//   var list30 = [if (oracle("foo")) if (oracle()) ...[42]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:49: Error: Unexpected token '...'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:35: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:29:16: Error: Unexpected token 'if'.
+//   var set30 = {if (oracle("foo")) if (oracle()) ...[42], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:49: Error: Unexpected token '...'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:35: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:30:16: Error: Unexpected token 'if'.
+//   var map30 = {if (oracle("foo")) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:50: Error: Unexpected token '...'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:36: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:31:17: Error: Unexpected token 'if'.
+//   var list31 = [if (oracle("foo")) if (oracle()) ...[dynVar]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:49: Error: Unexpected token '...'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:35: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:32:16: Error: Unexpected token 'if'.
+//   var set31 = {if (oracle("foo")) if (oracle()) ...[dynVar], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:49: Error: Unexpected token '...'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:35: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:33:16: Error: Unexpected token 'if'.
+//   var map31 = {if (oracle("foo")) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:50: Error: Unexpected token '...'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:36: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:34:17: Error: Unexpected token 'if'.
+//   var list33 = [if (oracle("foo")) if (oracle()) ...[[42]]];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:49: Error: Unexpected token '...'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:35: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:35:16: Error: Unexpected token 'if'.
+//   var set33 = {if (oracle("foo")) if (oracle()) ...[[42]], null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:49: Error: Unexpected token '...'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:35: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:36:16: Error: Unexpected token 'if'.
+//   var map33 = {if (oracle("foo")) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:37:48: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:37:29: Error: Unexpected token 'if'.
+//   List<List<int>> list40 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:38:46: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:38:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set40 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:39:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map40 = {if (oracle("foo")) ...{"bar", []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:40:48: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:40:29: Error: Unexpected token 'if'.
+//   List<List<int>> list41 = [if (oracle("foo")) ...{[]}];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:41:46: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:41:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set41 = {if (oracle("foo")) ...{[]}, null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:62: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:48: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:42:29: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:60: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:43:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:44:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:45:42: Error: Unexpected token '...'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:45:23: Error: Unexpected token 'if'.
+//   List<int> list50 = [if (oracle("foo")) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:46:40: Error: Unexpected token '...'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:46:21: Error: Unexpected token 'if'.
+//   Set<int> set50 = {if (oracle("foo")) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:47:48: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:47:29: Error: Unexpected token 'if'.
+//   Map<String, int> map50 = {if (oracle("foo")) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:48:42: Error: Unexpected token '...'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:48:23: Error: Unexpected token 'if'.
+//   List<int> list51 = [if (oracle("foo")) ...{}];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:49:40: Error: Unexpected token '...'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:49:21: Error: Unexpected token 'if'.
+//   Set<int> set51 = {if (oracle("foo")) ...{}, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:56: Error: Unexpected token '...'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:42: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:50:23: Error: Unexpected token 'if'.
+//   List<int> list52 = [if (oracle("foo")) if (oracle()) ...[]];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:54: Error: Unexpected token '...'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:40: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                                        ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:51:21: Error: Unexpected token 'if'.
+//   Set<int> set52 = {if (oracle("foo")) if (oracle()) ...[], null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:62: Error: Unexpected token '...'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:48: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:52:29: Error: Unexpected token 'if'.
+//   Map<String, int> map52 = {if (oracle("foo")) if (oracle()) ...{}, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:53:48: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:53:29: Error: Unexpected token 'if'.
+//   List<List<int>> list60 = [if (oracle("foo")) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:54:46: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:54:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set60 = {if (oracle("foo")) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:55:54: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:55:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map60 = {if (oracle("foo")) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:62: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:48: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:56:29: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [if (oracle("foo")) if (oracle()) ...[[]]];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:60: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:57:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {if (oracle("foo")) if (oracle()) ...[[]], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:68: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:54: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:58:35: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {if (oracle("foo")) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:59:29: Error: Unexpected token 'if'.
+//   List<List<int>> list70 = [if (oracle("foo")) []];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:60:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set70 = {if (oracle("foo")) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:61:48: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:61:29: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [if (oracle("foo")) if (oracle()) []];
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:62:46: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:62:27: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {if (oracle("foo")) if (oracle()) [], null};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:63:17: Error: Unexpected token 'if'.
+//   var list80 = [if (oracle("foo")) 42 else 3.14];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:64:16: Error: Unexpected token 'if'.
+//   var set80 = {if (oracle("foo")) 42 else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:65:16: Error: Unexpected token 'if'.
+//   var map80 = {if (oracle("foo")) "bar": 42 else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:36: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:52: Error: Unexpected token '...'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:66:17: Error: Unexpected token 'if'.
+//   var list81 = [if (oracle("foo")) ...listInt else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:35: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:51: Error: Unexpected token '...'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:67:16: Error: Unexpected token 'if'.
+//   var set81 = {if (oracle("foo")) ...listInt else ...listDouble, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:35: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:52: Error: Unexpected token '...'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:68:16: Error: Unexpected token 'if'.
+//   var map81 = {if (oracle("foo")) ...mapToInt else ...mapToDouble, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:36: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:52: Error: Unexpected token '...'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:69:17: Error: Unexpected token 'if'.
+//   var list82 = [if (oracle("foo")) ...listInt else ...dynVar];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:35: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:70:16: Error: Unexpected token 'if'.
+//   var set82 = {if (oracle("foo")) ...listInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:35: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:52: Error: Unexpected token '...'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:71:16: Error: Unexpected token 'if'.
+//   var map82 = {if (oracle("foo")) ...mapToInt else ...dynVar, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:72:44: Error: Unexpected token '...'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:72:17: Error: Unexpected token 'if'.
+//   var list83 = [if (oracle("foo")) 42 else ...listDouble];
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:73:35: Error: Unexpected token '...'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:73:16: Error: Unexpected token 'if'.
+//   var set83 = {if (oracle("foo")) ...listInt else 3.14, null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:74:35: Error: Unexpected token '...'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:74:16: Error: Unexpected token 'if'.
+//   var map83 = {if (oracle("foo")) ...mapToInt else "bar": 3.14, "baz": null};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:75:23: Error: Unexpected token 'if'.
+//   List<int> list90 = [if (oracle("foo")) dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:76:21: Error: Unexpected token 'if'.
+//   Set<int> set90 = {if (oracle("foo")) dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:77:29: Error: Unexpected token 'if'.
+//   Map<String, int> map90 = {if (oracle("foo")) "bar": dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:78:42: Error: Unexpected token '...'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:78:23: Error: Unexpected token 'if'.
+//   List<int> list91 = [if (oracle("foo")) ...dynVar];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:79:40: Error: Unexpected token '...'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:79:21: Error: Unexpected token 'if'.
+//   Set<int> set91 = {if (oracle("foo")) ...dynVar, null};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:80:48: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:80:29: Error: Unexpected token 'if'.
+//   Map<String, int> map91 = {if (oracle("foo")) ...dynVar, "baz": null};
+//                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:81:24: Error: Unexpected token 'if'.
+//   List<int> list100 = [if (dynVar) 42];
+//                        ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:82:22: Error: Unexpected token 'if'.
+//   Set<int> set100 = {if (dynVar) 42};
+//                      ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:83:27: Error: Unexpected token 'if'.
+//   Map<int, int> map100 = {if (dynVar) 42: 42};
+//                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:87:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) "bar"];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:88:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) "bar", null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:89:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": "bar", "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:90:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...["bar"]];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:91:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...["bar"], null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:92:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...{"bar": "bar"}, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:93:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:94:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:95:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...["bar"], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:96:12: Error: Unexpected token 'if'.
+//   <String>[if (oracle("foo")) 42 else 3.14];
+//            ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:97:12: Error: Unexpected token 'if'.
+//   <String>{if (oracle("foo")) 42 else 3.14, null};
+//            ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:98:20: Error: Unexpected token 'if'.
+//   <String, String>{if (oracle("foo")) "bar": 42 else "baz": 3.14, "baz": null};
+//                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:28: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:99:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) ...map else 42];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:100:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:36: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:101:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) ...[42] else "bar": 42, "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:36: Error: Unexpected token '...'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:102:9: Error: Unexpected token 'if'.
+//   <int>[if (oracle("foo")) 42 else ...map];
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:28: Error: Unexpected token '...'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//                            ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:103:9: Error: Unexpected token 'if'.
+//   <int>{if (oracle("foo")) ...map else 42, null};
+//         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:51: Error: Unexpected token '...'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:104:17: Error: Unexpected token 'if'.
+//   <String, int>{if (oracle("foo")) "bar": 42 else ...[42], "baz": null};
+//                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:106:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:107:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map10 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:108:25: Error: Unexpected token 'if'.
+//   Set<dynamic> set11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:109:34: Error: Unexpected token 'if'.
+//   Map<dynamic, dynamic> map11 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:110:16: Error: Unexpected token 'if'.
+//   var map12 = {if (oracle("foo")) 42 else "bar": 3.14};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:111:16: Error: Unexpected token 'if'.
+//   var map13 = {if (oracle("foo")) "bar": 3.14 else 42};
+//                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:112:23: Error: Unexpected token 'if'.
+//   List<int> list20 = [if (42) 42];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:113:21: Error: Unexpected token 'if'.
+//   Set<int> set20 = {if (42) 42};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:114:26: Error: Unexpected token 'if'.
+//   Map<int, int> map30 = {if (42) 42: 42};
+//                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:115:34: Error: Unexpected token 'if'.
+//   List<String> list40 = <String>[if (oracle("foo")) true else 42];
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:116:32: Error: Unexpected token 'if'.
+//   Set<String> set40 = <String>{if (oracle("foo")) true else 42};
+//                                ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:117:42: Error: Unexpected token 'if'.
+//   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:42: Error: Unexpected token 'if'.
+//   Map<int, String> map41 = <int, String>{if (oracle("foo")) 42: true else 42: 42};
+//                                          ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:123:17: Error: Unexpected token 'for'.
+//   var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:124:16: Error: Unexpected token 'for'.
+//   var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:125:16: Error: Unexpected token 'for'.
+//   var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:126:17: Error: Unexpected token 'for'.
+//   var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:127:16: Error: Unexpected token 'for'.
+//   var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:128:16: Error: Unexpected token 'for'.
+//   var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:129:17: Error: Unexpected token 'for'.
+//   var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:130:16: Error: Unexpected token 'for'.
+//   var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:131:16: Error: Unexpected token 'for'.
+//   var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:53: Error: Unexpected token '...'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:52: Error: Unexpected token '...'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:52: Error: Unexpected token '...'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:53: Error: Unexpected token '...'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:17: Error: Unexpected token 'for'.
+//   var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:52: Error: Unexpected token '...'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:16: Error: Unexpected token 'for'.
+//   var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:52: Error: Unexpected token '...'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:16: Error: Unexpected token 'for'.
+//   var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:53: Error: Unexpected token '...'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:17: Error: Unexpected token 'for'.
+//   var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:52: Error: Unexpected token '...'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:16: Error: Unexpected token 'for'.
+//   var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:52: Error: Unexpected token '...'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:16: Error: Unexpected token 'for'.
+//   var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:67: Error: Unexpected token '...'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:53: Error: Unexpected token 'if'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:17: Error: Unexpected token 'for'.
+//   var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:66: Error: Unexpected token '...'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:52: Error: Unexpected token 'if'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:16: Error: Unexpected token 'for'.
+//   var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:66: Error: Unexpected token '...'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:52: Error: Unexpected token 'if'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:16: Error: Unexpected token 'for'.
+//   var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:67: Error: Unexpected token '...'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:53: Error: Unexpected token 'if'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:17: Error: Unexpected token 'for'.
+//   var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:66: Error: Unexpected token '...'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:52: Error: Unexpected token 'if'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:16: Error: Unexpected token 'for'.
+//   var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:66: Error: Unexpected token '...'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:52: Error: Unexpected token 'if'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:16: Error: Unexpected token 'for'.
+//   var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:67: Error: Unexpected token '...'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:53: Error: Unexpected token 'if'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:17: Error: Unexpected token 'for'.
+//   var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:66: Error: Unexpected token '...'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:52: Error: Unexpected token 'if'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:16: Error: Unexpected token 'for'.
+//   var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:66: Error: Unexpected token '...'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:52: Error: Unexpected token 'if'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:16: Error: Unexpected token 'for'.
+//   var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:65: Error: Unexpected token '...'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:29: Error: Unexpected token 'for'.
+//   List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:63: Error: Unexpected token '...'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:65: Error: Unexpected token '...'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:29: Error: Unexpected token 'for'.
+//   List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:63: Error: Unexpected token '...'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:79: Error: Unexpected token '...'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:65: Error: Unexpected token 'if'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:29: Error: Unexpected token 'for'.
+//   List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:77: Error: Unexpected token '...'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:59: Error: Unexpected token '...'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:23: Error: Unexpected token 'for'.
+//   List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:57: Error: Unexpected token '...'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:21: Error: Unexpected token 'for'.
+//   Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:65: Error: Unexpected token '...'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:29: Error: Unexpected token 'for'.
+//   Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:59: Error: Unexpected token '...'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:23: Error: Unexpected token 'for'.
+//   List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:57: Error: Unexpected token '...'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:21: Error: Unexpected token 'for'.
+//   Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:73: Error: Unexpected token '...'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:59: Error: Unexpected token 'if'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                                                           ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:23: Error: Unexpected token 'for'.
+//   List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:71: Error: Unexpected token '...'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:57: Error: Unexpected token 'if'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                                                         ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:21: Error: Unexpected token 'for'.
+//   Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:65: Error: Unexpected token '...'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:29: Error: Unexpected token 'for'.
+//   List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:63: Error: Unexpected token '...'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:71: Error: Unexpected token '...'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:79: Error: Unexpected token '...'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                               ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:65: Error: Unexpected token 'if'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:29: Error: Unexpected token 'for'.
+//   List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:77: Error: Unexpected token '...'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:85: Error: Unexpected token '...'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:171:29: Error: Unexpected token 'for'.
+//   List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:172:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:173:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:65: Error: Unexpected token 'if'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                                                                 ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:29: Error: Unexpected token 'for'.
+//   List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:63: Error: Unexpected token 'if'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                                                               ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:27: Error: Unexpected token 'for'.
+//   Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:71: Error: Unexpected token 'if'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                                                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:35: Error: Unexpected token 'for'.
+//   Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:53: Error: Unexpected token 'if'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:17: Error: Unexpected token 'for'.
+//   var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:52: Error: Unexpected token 'if'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:16: Error: Unexpected token 'for'.
+//   var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:179:52: Error: Unexpected token 'if'.
+//   var map80 = {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:179:16: Error: Unexpected token 'for'.
+//   var map80 = {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:180:67: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:83: Error: Unexpected token '...'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:53: Error: Unexpected token 'if'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:180:17: Error: Unexpected token 'for'.
+//   var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:66: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:82: Error: Unexpected token '...'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:52: Error: Unexpected token 'if'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:16: Error: Unexpected token 'for'.
+//   var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:66: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:87: Error: Unexpected token '...'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:52: Error: Unexpected token 'if'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:16: Error: Unexpected token 'for'.
+//   var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:67: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:83: Error: Unexpected token '...'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:53: Error: Unexpected token 'if'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:17: Error: Unexpected token 'for'.
+//   var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:66: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:82: Error: Unexpected token '...'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:52: Error: Unexpected token 'if'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:16: Error: Unexpected token 'for'.
+//   var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:66: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:87: Error: Unexpected token '...'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                                                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:52: Error: Unexpected token 'if'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:16: Error: Unexpected token 'for'.
+//   var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:75: Error: Unexpected token '...'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:53: Error: Unexpected token 'if'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                                                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:17: Error: Unexpected token 'for'.
+//   var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:66: Error: Unexpected token '...'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:52: Error: Unexpected token 'if'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:16: Error: Unexpected token 'for'.
+//   var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:66: Error: Unexpected token '...'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:52: Error: Unexpected token 'if'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                                                    ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:16: Error: Unexpected token 'for'.
+//   var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:189:23: Error: Unexpected token 'for'.
+//   List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:190:21: Error: Unexpected token 'for'.
+//   Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:191:29: Error: Unexpected token 'for'.
+//   Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:59: Error: Unexpected token '...'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:23: Error: Unexpected token 'for'.
+//   List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:57: Error: Unexpected token '...'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                                                         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:21: Error: Unexpected token 'for'.
+//   Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+//                     ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:65: Error: Unexpected token '...'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                                                                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:29: Error: Unexpected token 'for'.
+//   Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:29: Error: Unexpected token 'for'.
+//   List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:27: Error: Unexpected token 'for'.
+//   Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:43: Error: Unexpected token 'for'.
+//   Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+//                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:198:18: Error: Unexpected token 'for'.
+//   var list110 = [for (var i in [1, 2, 3]) i];
+//                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:199:17: Error: Unexpected token 'for'.
+//   var set110 = {for (var i in [1, 2, 3]) i, null};
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:200:17: Error: Unexpected token 'for'.
+//   var map110 = {for (var i in [1, 2, 3]) "bar": i, "baz": null};
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:201:24: Error: Unexpected token 'for'.
+//   List<int> list120 = [for (var i in dynVar) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:202:22: Error: Unexpected token 'for'.
+//   Set<int> set120 = {for (var i in dynVar) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:203:30: Error: Unexpected token 'for'.
+//   Map<String, int> map120 = {for (var i in dynVar) "bar": i, "baz": null};
+//                              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:204:24: Error: Unexpected token 'for'.
+//   List<int> list130 = [for (var i = 1; i < 2; i++) i];
+//                        ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:205:22: Error: Unexpected token 'for'.
+//   Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:206:27: Error: Unexpected token 'for'.
+//   Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+//                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:45: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:45: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//                                             ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:9: Error: Unexpected token 'for'.
+//   <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:50: Error: Unexpected token '...'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//                                                  ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:14: Error: Unexpected token 'for'.
+//   <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+//              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:48: Error: Unexpected token 'if'.
+//   <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:12: Error: Unexpected token 'for'.
+//   <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:48: Error: Unexpected token 'if'.
+//   <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:12: Error: Unexpected token 'for'.
+//   <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:56: Error: Unexpected token 'if'.
+//   <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:20: Error: Unexpected token 'for'.
+//   <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:59: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:222:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:59: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                                           ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:9: Error: Unexpected token 'for'.
+//   <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:67: Error: Unexpected token '...'.
+//   <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:224:53: Error: Unexpected token 'if'.
+//   <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:224:17: Error: Unexpected token 'for'.
+//   <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:67: Error: Unexpected token '...'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:45: Error: Unexpected token 'if'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:225:9: Error: Unexpected token 'for'.
+//   <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:67: Error: Unexpected token '...'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                                                   ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:45: Error: Unexpected token 'if'.
+//   <int>{for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map, null};
+//                                             ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:9: Error: Unexpected token 'for'.
+//   <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:82: Error: Unexpected token '...'.
+//   <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:227:53: Error: Unexpected token 'if'.
+//   <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:227:17: Error: Unexpected token 'for'.
+//   <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:230:9: Error: Unexpected token 'for'.
+//   <int>[for (i in <int>[1]) i];
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:9: Error: Unexpected token 'for'.
+//   <int>{for (i in <int>[1]) i, null};
+//         ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:16: Error: Unexpected token 'for'.
+// 	<String, int>{for (i in <int>[1]) "bar": i, "baz": null};
+// 	              ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:234:17: Error: Unexpected token 'for'.
+//   var list10 = [for (var i in "not iterable") i];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:235:16: Error: Unexpected token 'for'.
+//   var set10 = {for (var i in "not iterable") i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:236:16: Error: Unexpected token 'for'.
+//   var map10 = {for (var i in "not iterable") "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:237:17: Error: Unexpected token 'for'.
+//   var list20 = [for (int i in ["not", "int"]) i];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:238:16: Error: Unexpected token 'for'.
+//   var set20 = {for (int i in ["not", "int"]) i, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:239:16: Error: Unexpected token 'for'.
+//   var map20 = {for (int i in ["not", "int"]) "bar": i, "baz": null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:240:23: Error: Unexpected token 'for'.
+//   var list30 = [await for (var i in "not stream") i];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:241:22: Error: Unexpected token 'for'.
+//   var set30 = {await for (var i in "not stream") i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:242:22: Error: Unexpected token 'for'.
+//   var map30 = {await for (var i in "not stream") "bar": i, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:243:23: Error: Unexpected token 'for'.
+//   var list40 = [await for (int i in Stream.fromIterable(["not", "int"])) i];
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:244:22: Error: Unexpected token 'for'.
+//   var set40 = {await for (int i in Stream.fromIterable(["not", "int"])) i, null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:245:22: Error: Unexpected token 'for'.
+//   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: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:246:23: Error: Unexpected token 'for'.
+//   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:247:22: Error: Unexpected token 'for'.
+//   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:248:22: Error: Unexpected token 'for'.
+//   var map50 = {await for (;;) "bar": 42, "baz": null};
+//                      ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:249:17: Error: Unexpected token 'for'.
+//   var list60 = [for (; "not bool";) 42];
+//                 ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:250:16: Error: Unexpected token 'for'.
+//   var set60 = {for (; "not bool";) 42, null};
+//                ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:251:16: Error: Unexpected token 'for'.
+//   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:255:15: Error: Unexpected token 'for'.
+//   <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:256:15: Error: Unexpected token 'for'.
+//   <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};
+//                                  ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:257:23: Error: Unexpected token 'for'.
+//   <String, int>{await for (int i in stream) "bar": i};
+//                       ^^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:267:23: Error: Unexpected token 'if'.
+//   List<int> list10 = [if (a is B) a.foo];
+//                       ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:268:21: Error: Unexpected token 'if'.
+//   Set<int> set10 = {if (a is B) a.foo};
+//                     ^^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:269:26: Error: Unexpected token 'if'.
+//   Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+//                          ^^
+//
+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::•()
+    ;
+}
+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 {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list40 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set40 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list41 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set41 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list42 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set42 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list50 = <dynamic>[];
+  core::Set<core::int*>* set50 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list51 = <dynamic>[];
+  core::Set<core::int*>* set51 = <dynamic>{null};
+  core::List<core::int*>* list52 = <dynamic>[];
+  core::Set<core::int*>* set52 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map52 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list60 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set60 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list61 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set61 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list70 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set70 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list71 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set71 = <dynamic>{null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic>{null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list90 = <dynamic>[];
+  core::Set<core::int*>* set90 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list91 = <dynamic>[];
+  core::Set<core::int*>* set91 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list100 = <dynamic>[];
+  core::Set<core::int*>* set100 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map100 = <dynamic, dynamic>{};
+}
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::String*>[];
+  <core::String*>{null};
+  <core::String*, core::String*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  <core::int*>[];
+  <core::int*>{null};
+  <core::String*, core::int*>{"baz": null};
+  core::Set<dynamic>* set10 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic>* map10 = <dynamic, dynamic>{};
+  core::Set<dynamic>* set11 = <dynamic, dynamic>{};
+  core::Map<dynamic, dynamic>* map11 = <dynamic, dynamic>{};
+  dynamic map12 = <dynamic, dynamic>{};
+  dynamic map13 = <dynamic, dynamic>{};
+  core::List<core::int*>* list20 = <dynamic>[];
+  core::Set<core::int*>* set20 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map30 = <dynamic, dynamic>{};
+  core::List<core::String*>* list40 = <core::String*>[];
+  core::Set<core::String*>* set40 = <core::String*>{};
+  core::Map<core::String*, core::int*>* map40 = <core::String*, core::int*>{};
+  core::Map<core::int*, core::String*>* map41 = <core::int*, core::String*>{};
+}
+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 {
+  dynamic list10 = <dynamic>[];
+  dynamic set10 = <dynamic>{null};
+  dynamic map10 = <dynamic, dynamic>{"baz": null};
+  dynamic list11 = <dynamic>[];
+  dynamic set11 = <dynamic>{null};
+  dynamic map11 = <dynamic, dynamic>{"baz": null};
+  dynamic list12 = <dynamic>[];
+  dynamic set12 = <dynamic>{null};
+  dynamic map12 = <dynamic, dynamic>{"baz": null};
+  dynamic list20 = <dynamic>[];
+  dynamic set20 = <dynamic>{null};
+  dynamic map20 = <dynamic, dynamic>{"baz": null};
+  dynamic list21 = <dynamic>[];
+  dynamic set21 = <dynamic>{null};
+  dynamic map21 = <dynamic, dynamic>{"baz": null};
+  dynamic list22 = <dynamic>[];
+  dynamic set22 = <dynamic>{null};
+  dynamic map22 = <dynamic, dynamic>{"baz": null};
+  dynamic list30 = <dynamic>[];
+  dynamic set30 = <dynamic>{null};
+  dynamic map30 = <dynamic, dynamic>{"baz": null};
+  dynamic list31 = <dynamic>[];
+  dynamic set31 = <dynamic>{null};
+  dynamic map31 = <dynamic, dynamic>{"baz": null};
+  dynamic list33 = <dynamic>[];
+  dynamic set33 = <dynamic>{null};
+  dynamic map33 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list40 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set40 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map40 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list41 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set41 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list42 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set42 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map42 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list50 = <dynamic>[];
+  core::Set<core::int*>* set50 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map50 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list51 = <dynamic>[];
+  core::Set<core::int*>* set51 = <dynamic>{null};
+  core::List<core::int*>* list52 = <dynamic>[];
+  core::Set<core::int*>* set52 = <dynamic>{null};
+  core::List<core::List<core::int*>*>* list60 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set60 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map60 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list61 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set61 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map61 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list70 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set70 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map70 = <dynamic, dynamic>{"baz": null};
+  core::List<core::List<core::int*>*>* list71 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set71 = <dynamic>{null};
+  core::Map<core::String*, core::List<core::int*>*>* map71 = <dynamic, dynamic>{"baz": null};
+  dynamic list80 = <dynamic>[];
+  dynamic set80 = <dynamic>{null};
+  dynamic map80 = <dynamic, dynamic>{"baz": null};
+  dynamic list81 = <dynamic>[];
+  dynamic set81 = <dynamic>{null};
+  dynamic map81 = <dynamic, dynamic>{"baz": null};
+  dynamic list82 = <dynamic>[];
+  dynamic set82 = <dynamic>{null};
+  dynamic map82 = <dynamic, dynamic>{"baz": null};
+  dynamic list83 = <dynamic>[];
+  dynamic set83 = <dynamic>{null};
+  dynamic map83 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list90 = <dynamic>[];
+  core::Set<core::int*>* set90 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map90 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list91 = <dynamic>[];
+  core::Set<core::int*>* set91 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map91 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list100 = <core::int*>[];
+  core::Set<core::int*>* set100 = <core::int*>{};
+  core::Map<core::String*, core::int*>* map100 = <core::String*, core::int*>{};
+  dynamic list110 = <dynamic>[];
+  dynamic set110 = <dynamic>{null};
+  dynamic map110 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list120 = <dynamic>[];
+  core::Set<core::int*>* set120 = <dynamic>{null};
+  core::Map<core::String*, core::int*>* map120 = <dynamic, dynamic>{"baz": null};
+  core::List<core::int*>* list130 = <dynamic>[];
+  core::Set<core::int*>* set130 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map130 = <dynamic, dynamic>{};
+}
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        <core::int*>[];
+        <core::int*>{null};
+        <core::int*, core::int*>{"baz": null};
+        <core::int*>[];
+        <core::int*>{null};
+        <core::int*, core::int*>{"baz": null};
+        <core::int*>[];
+        <core::int*>{null};
+        <core::int*, core::int*>{42: null};
+        <core::String*>[];
+        <core::String*>{null};
+        <core::String*, core::String*>{"baz": null};
+        <core::int*>[];
+        <core::int*>{null};
+        <core::String*, core::int*>{"baz": null};
+        <core::int*>[];
+        <core::int*>{null};
+        <core::String*, core::int*>{"baz": null};
+        final dynamic i = 0;
+        <core::int*>[];
+        <core::int*>{null};
+        <core::String*, core::int*>{"baz": null};
+        dynamic list10 = <dynamic>[];
+        dynamic set10 = <dynamic>{null};
+        dynamic map10 = <dynamic, dynamic>{"baz": null};
+        dynamic list20 = <dynamic>[];
+        dynamic set20 = <dynamic>{null};
+        dynamic map20 = <dynamic, dynamic>{"baz": null};
+        dynamic list30 = <dynamic>[];
+        dynamic set30 = <dynamic>{null};
+        dynamic map30 = <dynamic, dynamic>{"baz": null};
+        dynamic list40 = <dynamic>[];
+        dynamic set40 = <dynamic>{null};
+        dynamic map40 = <dynamic, dynamic>{"baz": null};
+        dynamic list50 = <dynamic>[];
+        dynamic set50 = <dynamic>{null};
+        dynamic map50 = <dynamic, dynamic>{"baz": null};
+        dynamic list60 = <dynamic>[];
+        dynamic set60 = <dynamic>{null};
+        dynamic map60 = <dynamic, dynamic>{"baz": null};
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
+  <core::int*>[];
+  <core::int*>{};
+  <core::String*, core::int*>{};
+}
+static method testPromotion(self::A* a) → dynamic {
+  core::List<core::int*>* list10 = <dynamic>[];
+  core::Set<core::int*>* set10 = <dynamic, dynamic>{};
+  core::Map<core::int*, core::int*>* map10 = <dynamic, dynamic>{};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.outline.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.outline.expect
new file mode 100644
index 0000000..baa3e6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.outline.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:async" as asy;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  get foo() → core::int*
+    ;
+}
+static method oracle<T extends core::Object* = dynamic>([self::oracle::T* t]) → dynamic
+  ;
+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
+  ;
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic
+  ;
+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
+  ;
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic
+  ;
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic
+  ;
+static method testPromotion(self::A* a) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
new file mode 100644
index 0000000..5f32797
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.expect
@@ -0,0 +1,2317 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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: Setter not found: 'i'.
+//   <int>[for (i in <int>[1]) i];
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+//   <int>{for (i in <int>[1]) i, null};
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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::•()
+    ;
+}
+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} core::bool*)
+      #t1.{core::List::add}(42);
+  } =>#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} core::bool*)
+      #t2.{core::Set::add}(42);
+    #t2.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t3.{core::Map::[]=}("bar", 42);
+    #t3.{core::Map::[]=}("baz", null);
+  } =>#t3;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t4 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t4.{core::List::add}(dynVar);
+  } =>#t4;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t5.{core::Set::add}(dynVar);
+    #t5.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t6.{core::Map::[]=}("bar", dynVar);
+    #t6.{core::Map::[]=}("baz", null);
+  } =>#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} core::bool*)
+      #t7.{core::List::add}(<core::int*>[42]);
+  } =>#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} core::bool*)
+      #t8.{core::Set::add}(<core::int*>[42]);
+    #t8.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}("baz", null);
+  } =>#t9;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t10 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t11 in <core::int*>[42])
+        #t10.{core::List::add}(#t11);
+  } =>#t10;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t13 in <core::int*>[42])
+        #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(null);
+  } =>#t12;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t15 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}("baz", null);
+  } =>#t14;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t16 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t17 in <dynamic>[dynVar])
+        #t16.{core::List::add}(#t17);
+  } =>#t16;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t19 in <dynamic>[dynVar])
+        #t18.{core::Set::add}(#t19);
+    #t18.{core::Set::add}(null);
+  } =>#t18;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, dynamic>* #t21 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}("baz", null);
+  } =>#t20;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t23 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t22.{core::List::add}(#t23);
+  } =>#t22;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t25 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t24.{core::Set::add}(#t25);
+    #t24.{core::Set::add}(null);
+  } =>#t24;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}("baz", null);
+  } =>#t26;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t28 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t29 in <core::int*>[42])
+          #t28.{core::List::add}(#t29);
+  } =>#t28;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t31 in <core::int*>[42])
+          #t30.{core::Set::add}(#t31);
+    #t30.{core::Set::add}(null);
+  } =>#t30;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t33 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}("baz", null);
+  } =>#t32;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t34 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t35 in <dynamic>[dynVar])
+          #t34.{core::List::add}(#t35);
+  } =>#t34;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t37 in <dynamic>[dynVar])
+          #t36.{core::Set::add}(#t37);
+    #t36.{core::Set::add}(null);
+  } =>#t36;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t39 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}("baz", null);
+  } =>#t38;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t41 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t43 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t42.{core::Set::add}(#t43);
+    #t42.{core::Set::add}(null);
+  } =>#t42;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}("baz", null);
+  } =>#t44;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t47 in <core::List<core::int*>*>[<core::int*>[]])
+        #t46.{core::List::add}(#t47);
+  } =>#t46;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t49 in <core::List<core::int*>*>[<core::int*>[]])
+        #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(null);
+  } =>#t48;
+  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*>*>* #t50 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t51 in let final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t53 = #t52.{core::Set::add}(<core::int*>[]) in #t52)
+        #t50.{core::List::add}(#t51);
+  } =>#t50;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t55 in let final core::Set<core::List<core::int*>*>* #t56 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t57 = #t56.{core::Set::add}(<core::int*>[]) in #t56)
+        #t54.{core::Set::add}(#t55);
+    #t54.{core::Set::add}(null);
+  } =>#t54;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t59 in <core::List<core::int*>*>[<core::int*>[]])
+          #t58.{core::List::add}(#t59);
+  } =>#t58;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t61 in <core::List<core::int*>*>[<core::int*>[]])
+          #t60.{core::Set::add}(#t61);
+    #t60.{core::Set::add}(null);
+  } =>#t60;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = 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} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} 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})
+          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+    #t62.{core::Map::[]=}("baz", null);
+  } =>#t62;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t64 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t65 in <core::int*>[])
+        #t64.{core::List::add}(#t65);
+  } =>#t64;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t67 in <core::int*>[])
+        #t66.{core::Set::add}(#t67);
+    #t66.{core::Set::add}(null);
+  } =>#t66;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t69 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}("baz", null);
+  } =>#t68;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t70 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t71 in let final core::Set<core::int*>* #t72 = col::LinkedHashSet::•<core::int*>() in #t72)
+        #t70.{core::List::add}(#t71);
+  } =>#t70;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t74 in let final core::Set<core::int*>* #t75 = col::LinkedHashSet::•<core::int*>() in #t75)
+        #t73.{core::Set::add}(#t74);
+    #t73.{core::Set::add}(null);
+  } =>#t73;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t76 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t77 in <core::int*>[])
+          #t76.{core::List::add}(#t77);
+  } =>#t76;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t79 in <core::int*>[])
+          #t78.{core::Set::add}(#t79);
+    #t78.{core::Set::add}(null);
+  } =>#t78;
+  core::Map<core::String*, core::int*>* map52 = block {
+    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t81 in <core::String*, core::int*>{}.{core::Map::entries})
+          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+    #t80.{core::Map::[]=}("baz", null);
+  } =>#t80;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t83 in <core::List<core::int*>*>[<core::int*>[]])
+        #t82.{core::List::add}(#t83);
+  } =>#t82;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t85 in <core::List<core::int*>*>[<core::int*>[]])
+        #t84.{core::Set::add}(#t85);
+    #t84.{core::Set::add}(null);
+  } =>#t84;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+    #t86.{core::Map::[]=}("baz", null);
+  } =>#t86;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t89 in <core::List<core::int*>*>[<core::int*>[]])
+          #t88.{core::List::add}(#t89);
+  } =>#t88;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t91 in <core::List<core::int*>*>[<core::int*>[]])
+          #t90.{core::Set::add}(#t91);
+    #t90.{core::Set::add}(null);
+  } =>#t90;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+    #t92.{core::Map::[]=}("baz", null);
+  } =>#t92;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t94.{core::List::add}(<core::int*>[]);
+  } =>#t94;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t95.{core::Set::add}(<core::int*>[]);
+    #t95.{core::Set::add}(null);
+  } =>#t95;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t96.{core::List::add}(<core::int*>[]);
+  } =>#t96;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t97.{core::Set::add}(<core::int*>[]);
+    #t97.{core::Set::add}(null);
+  } =>#t97;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t98 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t98.{core::List::add}(42);
+    else
+      #t98.{core::List::add}(3.14);
+  } =>#t98;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t99.{core::Set::add}(42);
+    else
+      #t99.{core::Set::add}(3.14);
+    #t99.{core::Set::add}(null);
+  } =>#t99;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t100.{core::Map::[]=}("bar", 42);
+    else
+      #t100.{core::Map::[]=}("bar", 3.14);
+    #t100.{core::Map::[]=}("baz", null);
+  } =>#t100;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t101 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t102 in listInt)
+        #t101.{core::List::add}(#t102);
+    else
+      for (final core::num* #t103 in listDouble)
+        #t101.{core::List::add}(#t103);
+  } =>#t101;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t105 in listInt)
+        #t104.{core::Set::add}(#t105);
+    else
+      for (final core::num* #t106 in listDouble)
+        #t104.{core::Set::add}(#t106);
+    #t104.{core::Set::add}(null);
+  } =>#t104;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t108 in mapToInt.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+    else
+      for (final core::MapEntry<core::String*, core::num*>* #t109 in mapToDouble.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+    #t107.{core::Map::[]=}("baz", null);
+  } =>#t107;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t110 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t111 in listInt)
+        #t110.{core::List::add}(#t111);
+    else
+      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t110.{core::List::add}(#t112);
+  } =>#t110;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t114 in listInt)
+        #t113.{core::Set::add}(#t114);
+    else
+      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t113.{core::Set::add}(#t115);
+    #t113.{core::Set::add}(null);
+  } =>#t113;
+  core::Set<dynamic>* map82 = block {
+    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t116.{core::Set::add}(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};
+                                     ^");
+    else
+      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t116.{core::Set::add}(#t117);
+    #t116.{core::Set::add}(null);
+  } =>#t116;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t118 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t118.{core::List::add}(42);
+    else
+      for (final core::num* #t119 in listDouble)
+        #t118.{core::List::add}(#t119);
+  } =>#t118;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t121 in listInt)
+        #t120.{core::Set::add}(#t121);
+    else
+      #t120.{core::Set::add}(3.14);
+    #t120.{core::Set::add}(null);
+  } =>#t120;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t123 in mapToInt.{core::Map::entries})
+        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+    else
+      #t122.{core::Map::[]=}("bar", 3.14);
+    #t122.{core::Map::[]=}("baz", null);
+  } =>#t122;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t124 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t124.{core::List::add}(dynVar as{TypeError} core::int*);
+  } =>#t124;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t125.{core::Set::add}(dynVar as{TypeError} core::int*);
+    #t125.{core::Set::add}(null);
+  } =>#t125;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int*);
+    #t126.{core::Map::[]=}("baz", null);
+  } =>#t126;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t127 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t129 = #t128 as{TypeError} core::int*;
+        #t127.{core::List::add}(#t129);
+      }
+  } =>#t127;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t132 = #t131 as{TypeError} core::int*;
+        #t130.{core::Set::add}(#t132);
+      }
+    #t130.{core::Set::add}(null);
+  } =>#t130;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<dynamic, dynamic>* #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
+        #t133.{core::Map::[]=}(#t135, #t136);
+      }
+    #t133.{core::Map::[]=}("baz", null);
+  } =>#t133;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t137 = <core::int*>[];
+    if(dynVar as{TypeError} core::bool*)
+      #t137.{core::List::add}(42);
+  } =>#t137;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    if(dynVar as{TypeError} core::bool*)
+      #t138.{core::Set::add}(42);
+  } =>#t138;
+  core::Map<core::int*, core::int*>* map100 = block {
+    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    if(dynVar as{TypeError} core::bool*)
+      #t139.{core::Map::[]=}(42, 42);
+  } =>#t139;
+}
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
+  block {
+    final core::List<core::int*>* #t140 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t140.{core::List::add}(let final<BottomType> #t141 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) \"bar\"];
+                           ^" in "bar" as{TypeError} core::int*);
+  } =>#t140;
+  block {
+    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t142.{core::Set::add}(let final<BottomType> #t143 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) \"bar\", null};
+                           ^" in "bar" as{TypeError} core::int*);
+    #t142.{core::Set::add}(null);
+  } =>#t142;
+  block {
+    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
+                                          ^" in "bar" as{TypeError} core::int*);
+    #t144.{core::Map::[]=}("baz", null);
+  } =>#t144;
+  block {
+    final core::List<core::int*>* #t146 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
+                               ^" in "bar" as{TypeError} core::int*])
+        #t146.{core::List::add}(#t147);
+  } =>#t146;
+  block {
+    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
+                               ^" in "bar" as{TypeError} core::int*])
+        #t149.{core::Set::add}(#t150);
+    #t149.{core::Set::add}(null);
+  } =>#t149;
+  block {
+    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
+        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
+    #t152.{core::Map::[]=}("baz", null);
+  } =>#t152;
+  block {
+    final core::List<core::int*>* #t155 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t155.{core::List::add}(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];
+                              ^");
+  } =>#t155;
+  block {
+    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t156.{core::Set::add}(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};
+                              ^");
+    #t156.{core::Set::add}(null);
+  } =>#t156;
+  <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*>* #t157 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t157.{core::List::add}(let final<BottomType> #t158 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                              ^" in 42 as{TypeError} core::String*);
+    else
+      #t157.{core::List::add}(let final<BottomType> #t159 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                                      ^" in 3.14 as{TypeError} core::String*);
+  } =>#t157;
+  block {
+    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t160.{core::Set::add}(let final<BottomType> #t161 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                              ^" in 42 as{TypeError} core::String*);
+    else
+      #t160.{core::Set::add}(let final<BottomType> #t162 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                                      ^" in 3.14 as{TypeError} core::String*);
+    #t160.{core::Set::add}(null);
+  } =>#t160;
+  block {
+    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                             ^" in 42 as{TypeError} core::String*);
+    else
+      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                                            ^" in 3.14 as{TypeError} core::String*);
+    #t163.{core::Map::[]=}("baz", null);
+  } =>#t163;
+  block {
+    final core::List<core::int*>* #t166 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t166.{core::List::add}(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];
+                              ^");
+    else
+      #t166.{core::List::add}(42);
+  } =>#t166;
+  block {
+    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t167.{core::Set::add}(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};
+                              ^");
+    else
+      #t167.{core::Set::add}(42);
+    #t167.{core::Set::add}(null);
+  } =>#t167;
+  <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*>* #t168 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t168.{core::List::add}(42);
+    else
+      #t168.{core::List::add}(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];
+                                      ^");
+  } =>#t168;
+  block {
+    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t169.{core::Set::add}(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};
+                              ^");
+    else
+      #t169.{core::Set::add}(42);
+    #t169.{core::Set::add}(null);
+  } =>#t169;
+  <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<<BottomType>, core::Null*>* map12 = <<BottomType>, core::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<<BottomType>, core::Null*>* map13 = <<BottomType>, core::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*>* #t170 = <core::int*>[];
+    if(let final<BottomType> #t171 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  List<int> list20 = [if (42) 42];
+                          ^" in 42 as{TypeError} core::bool*)
+      #t170.{core::List::add}(42);
+  } =>#t170;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t173 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Set<int> set20 = {if (42) 42};
+                        ^" in 42 as{TypeError} core::bool*)
+      #t172.{core::Set::add}(42);
+  } =>#t172;
+  core::Map<core::int*, core::int*>* map30 = block {
+    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t175 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Map<int, int> map30 = {if (42) 42: 42};
+                             ^" in 42 as{TypeError} core::bool*)
+      #t174.{core::Map::[]=}(42, 42);
+  } =>#t174;
+  core::List<core::String*>* list40 = block {
+    final core::List<core::String*>* #t176 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t176.{core::List::add}(let final<BottomType> #t177 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                    ^" in true as{TypeError} core::String*);
+    else
+      #t176.{core::List::add}(let final<BottomType> #t178 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                              ^" in 42 as{TypeError} core::String*);
+  } =>#t176;
+  core::Set<core::String*>* set40 = block {
+    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t179.{core::Set::add}(let final<BottomType> #t180 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                  ^" in true as{TypeError} core::String*);
+    else
+      #t179.{core::Set::add}(let final<BottomType> #t181 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                            ^" in 42 as{TypeError} core::String*);
+  } =>#t179;
+  core::Map<core::String*, core::int*>* map40 = block {
+    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t182.{core::Map::[]=}(let final<BottomType> #t183 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                            ^" in true as{TypeError} core::String*, 42);
+    else
+      #t182.{core::Map::[]=}(let final<BottomType> #t184 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                                          ^" in 42 as{TypeError} core::String*, 42);
+  } =>#t182;
+  core::Map<core::int*, core::String*>* map41 = block {
+    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                ^" in true as{TypeError} core::String*);
+    else
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                              ^" in 42 as{TypeError} core::String*);
+  } =>#t185;
+}
+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*>* #t188 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t188.{core::List::add}(42);
+  } =>#t188;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t189.{core::Set::add}(42);
+    #t189.{core::Set::add}(null);
+  } =>#t189;
+  core::Map<core::String*, core::int*>* map10 = block {
+    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t190.{core::Map::[]=}("bar", 42);
+    #t190.{core::Map::[]=}("baz", null);
+  } =>#t190;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t191 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t191.{core::List::add}(dynVar);
+  } =>#t191;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t192.{core::Set::add}(dynVar);
+    #t192.{core::Set::add}(null);
+  } =>#t192;
+  core::Map<core::String*, dynamic>* map11 = block {
+    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t193.{core::Map::[]=}("bar", dynVar);
+    #t193.{core::Map::[]=}("baz", null);
+  } =>#t193;
+  core::List<core::List<core::int*>*>* list12 = block {
+    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t194.{core::List::add}(<core::int*>[42]);
+  } =>#t194;
+  core::Set<core::List<core::int*>*>* set12 = block {
+    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t195.{core::Set::add}(<core::int*>[42]);
+    #t195.{core::Set::add}(null);
+  } =>#t195;
+  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
+    #t196.{core::Map::[]=}("baz", null);
+  } =>#t196;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t197 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t198 in <core::int*>[42])
+        #t197.{core::List::add}(#t198);
+  } =>#t197;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t200 in <core::int*>[42])
+        #t199.{core::Set::add}(#t200);
+    #t199.{core::Set::add}(null);
+  } =>#t199;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::int*>* #t202 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+    #t201.{core::Map::[]=}("baz", null);
+  } =>#t201;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t203 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t204 in <dynamic>[dynVar])
+        #t203.{core::List::add}(#t204);
+  } =>#t203;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t206 in <dynamic>[dynVar])
+        #t205.{core::Set::add}(#t206);
+    #t205.{core::Set::add}(null);
+  } =>#t205;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, dynamic>* #t208 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+    #t207.{core::Map::[]=}("baz", null);
+  } =>#t207;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t210 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t209.{core::List::add}(#t210);
+  } =>#t209;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t212 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t211.{core::Set::add}(#t212);
+    #t211.{core::Set::add}(null);
+  } =>#t211;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+    #t213.{core::Map::[]=}("baz", null);
+  } =>#t213;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t215 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t216 in <core::int*>[42])
+          #t215.{core::List::add}(#t216);
+  } =>#t215;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t218 in <core::int*>[42])
+          #t217.{core::Set::add}(#t218);
+    #t217.{core::Set::add}(null);
+  } =>#t217;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t220 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+    #t219.{core::Map::[]=}("baz", null);
+  } =>#t219;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t221 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t222 in <dynamic>[dynVar])
+          #t221.{core::List::add}(#t222);
+  } =>#t221;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t224 in <dynamic>[dynVar])
+          #t223.{core::Set::add}(#t224);
+    #t223.{core::Set::add}(null);
+  } =>#t223;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t226 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+    #t225.{core::Map::[]=}("baz", null);
+  } =>#t225;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t228 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t227.{core::List::add}(#t228);
+  } =>#t227;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t230 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t229.{core::Set::add}(#t230);
+    #t229.{core::Set::add}(null);
+  } =>#t229;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+    #t231.{core::Map::[]=}("baz", null);
+  } =>#t231;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t234 in <core::List<core::int*>*>[<core::int*>[]])
+        #t233.{core::List::add}(#t234);
+  } =>#t233;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t236 in <core::List<core::int*>*>[<core::int*>[]])
+        #t235.{core::Set::add}(#t236);
+    #t235.{core::Set::add}(null);
+  } =>#t235;
+  core::Map<core::String*, core::List<core::int*>*>* map40 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+    #t237.{core::Map::[]=}("baz", null);
+  } =>#t237;
+  core::List<core::List<core::int*>*>* list41 = block {
+    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t240 in let final core::Set<core::List<core::int*>*>* #t241 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t242 = #t241.{core::Set::add}(<core::int*>[]) in #t241)
+        #t239.{core::List::add}(#t240);
+  } =>#t239;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t244 in let final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final dynamic #t246 = #t245.{core::Set::add}(<core::int*>[]) in #t245)
+        #t243.{core::Set::add}(#t244);
+    #t243.{core::Set::add}(null);
+  } =>#t243;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t248 in <core::List<core::int*>*>[<core::int*>[]])
+          #t247.{core::List::add}(#t248);
+  } =>#t247;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t250 in <core::List<core::int*>*>[<core::int*>[]])
+          #t249.{core::Set::add}(#t250);
+    #t249.{core::Set::add}(null);
+  } =>#t249;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+    #t251.{core::Map::[]=}("baz", null);
+  } =>#t251;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t253 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t254 in <core::int*>[])
+        #t253.{core::List::add}(#t254);
+  } =>#t253;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t256 in <core::int*>[])
+        #t255.{core::Set::add}(#t256);
+    #t255.{core::Set::add}(null);
+  } =>#t255;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::int*>* #t258 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+    #t257.{core::Map::[]=}("baz", null);
+  } =>#t257;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t259 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t260 in let final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>() in #t261)
+        #t259.{core::List::add}(#t260);
+  } =>#t259;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t263 in let final core::Set<core::int*>* #t264 = col::LinkedHashSet::•<core::int*>() in #t264)
+        #t262.{core::Set::add}(#t263);
+    #t262.{core::Set::add}(null);
+  } =>#t262;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t265 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t266 in <core::int*>[])
+          #t265.{core::List::add}(#t266);
+  } =>#t265;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t268 in <core::int*>[])
+          #t267.{core::Set::add}(#t268);
+    #t267.{core::Set::add}(null);
+  } =>#t267;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t270 in <core::List<core::int*>*>[<core::int*>[]])
+        #t269.{core::List::add}(#t270);
+  } =>#t269;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
+        #t271.{core::Set::add}(#t272);
+    #t271.{core::Set::add}(null);
+  } =>#t271;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+    #t273.{core::Map::[]=}("baz", null);
+  } =>#t273;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t276 in <core::List<core::int*>*>[<core::int*>[]])
+          #t275.{core::List::add}(#t276);
+  } =>#t275;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t278 in <core::List<core::int*>*>[<core::int*>[]])
+          #t277.{core::Set::add}(#t278);
+    #t277.{core::Set::add}(null);
+  } =>#t277;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+    #t279.{core::Map::[]=}("baz", null);
+  } =>#t279;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t281.{core::List::add}(<core::int*>[]);
+  } =>#t281;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t282.{core::Set::add}(<core::int*>[]);
+    #t282.{core::Set::add}(null);
+  } =>#t282;
+  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t283.{core::Map::[]=}("bar", <core::int*>[]);
+    #t283.{core::Map::[]=}("baz", null);
+  } =>#t283;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t284.{core::List::add}(<core::int*>[]);
+  } =>#t284;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t285.{core::Set::add}(<core::int*>[]);
+    #t285.{core::Set::add}(null);
+  } =>#t285;
+  core::Map<core::String*, core::List<core::int*>*>* map71 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t286.{core::Map::[]=}("bar", <core::int*>[]);
+    #t286.{core::Map::[]=}("baz", null);
+  } =>#t286;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t287 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t287.{core::List::add}(42);
+      else
+        #t287.{core::List::add}(3.14);
+  } =>#t287;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t288.{core::Set::add}(42);
+      else
+        #t288.{core::Set::add}(3.14);
+    #t288.{core::Set::add}(null);
+  } =>#t288;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t289.{core::Map::[]=}("bar", 42);
+      else
+        #t289.{core::Map::[]=}("bar", 3.14);
+    #t289.{core::Map::[]=}("baz", null);
+  } =>#t289;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t290 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t291 in listInt)
+          #t290.{core::List::add}(#t291);
+      else
+        for (final core::num* #t292 in listDouble)
+          #t290.{core::List::add}(#t292);
+  } =>#t290;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t294 in listInt)
+          #t293.{core::Set::add}(#t294);
+      else
+        for (final core::num* #t295 in listDouble)
+          #t293.{core::Set::add}(#t295);
+    #t293.{core::Set::add}(null);
+  } =>#t293;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t297 in mapStringInt.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<core::String*, core::num*>* #t298 in mapStringDouble.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+    #t296.{core::Map::[]=}("baz", null);
+  } =>#t296;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t299 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t300 in listInt)
+          #t299.{core::List::add}(#t300);
+      else
+        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>*)
+          #t299.{core::List::add}(#t301);
+  } =>#t299;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t303 in listInt)
+          #t302.{core::Set::add}(#t303);
+      else
+        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>*)
+          #t302.{core::Set::add}(#t304);
+    #t302.{core::Set::add}(null);
+  } =>#t302;
+  core::Map<dynamic, dynamic>* map82 = block {
+    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<dynamic, dynamic>* #t306 in mapStringInt.{core::Map::entries})
+          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<dynamic, dynamic>* #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
+          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+    #t305.{core::Map::[]=}("baz", null);
+  } =>#t305;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t308 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t308.{core::List::add}(42);
+      else
+        for (final core::num* #t309 in listDouble)
+          #t308.{core::List::add}(#t309);
+  } =>#t308;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t311 in listInt)
+          #t310.{core::Set::add}(#t311);
+      else
+        #t310.{core::Set::add}(3.14);
+    #t310.{core::Set::add}(null);
+  } =>#t310;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t313 in mapStringInt.{core::Map::entries})
+          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+      else
+        #t312.{core::Map::[]=}("bar", 3.14);
+    #t312.{core::Map::[]=}("baz", null);
+  } =>#t312;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t314 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t314.{core::List::add}(dynVar as{TypeError} core::int*);
+  } =>#t314;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t315.{core::Set::add}(dynVar as{TypeError} core::int*);
+    #t315.{core::Set::add}(null);
+  } =>#t315;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int*);
+    #t316.{core::Map::[]=}("baz", null);
+  } =>#t316;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t317 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t319 = #t318 as{TypeError} core::int*;
+        #t317.{core::List::add}(#t319);
+      }
+  } =>#t317;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t322 = #t321 as{TypeError} core::int*;
+        #t320.{core::Set::add}(#t322);
+      }
+    #t320.{core::Set::add}(null);
+  } =>#t320;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<dynamic, dynamic>* #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
+        #t323.{core::Map::[]=}(#t325, #t326);
+      }
+    #t323.{core::Map::[]=}("baz", null);
+  } =>#t323;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t327 = <core::int*>[];
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::List::add}(42);
+  } =>#t327;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t329.{core::Set::add}(42);
+  } =>#t329;
+  core::Map<core::String*, core::int*>* map100 = block {
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
+    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t331.{core::Map::[]=}("bar", 42);
+  } =>#t331;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t333 = <core::int*>[];
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t333.{core::List::add}(i);
+  } =>#t333;
+  core::Set<core::int*>* set110 = block {
+    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t334.{core::Set::add}(i);
+    #t334.{core::Set::add}(null);
+  } =>#t334;
+  core::Map<core::String*, core::int*>* map110 = block {
+    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t335.{core::Map::[]=}("bar", i);
+    #t335.{core::Map::[]=}("baz", null);
+  } =>#t335;
+  core::List<core::int*>* list120 = block {
+    final core::List<core::int*>* #t336 = <core::int*>[];
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t336.{core::List::add}(i as{TypeError} core::int*);
+  } =>#t336;
+  core::Set<core::int*>* set120 = block {
+    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t337.{core::Set::add}(i as{TypeError} core::int*);
+    #t337.{core::Set::add}(null);
+  } =>#t337;
+  core::Map<core::String*, core::int*>* map120 = block {
+    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int*);
+    #t338.{core::Map::[]=}("baz", null);
+  } =>#t338;
+  core::List<core::int*>* list130 = block {
+    final core::List<core::int*>* #t339 = <core::int*>[];
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t339.{core::List::add}(i);
+  } =>#t339;
+  core::Set<core::int*>* set130 = block {
+    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t340.{core::Set::add}(i);
+  } =>#t340;
+  core::Map<core::int*, core::int*>* map130 = block {
+    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t341.{core::Map::[]=}(i, i);
+  } =>#t341;
+}
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic async {
+  block {
+    final core::List<core::int*>* #t342 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t342.{core::List::add}(let final<BottomType> #t343 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
+                                            ^" in "bar" as{TypeError} core::int*);
+  } =>#t342;
+  block {
+    final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t344.{core::Set::add}(let final<BottomType> #t345 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
+                                            ^" in "bar" as{TypeError} core::int*);
+    #t344.{core::Set::add}(null);
+  } =>#t344;
+  block {
+    final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t346.{core::Map::[]=}(let final<BottomType> #t347 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                        ^" in "bar" as{TypeError} core::int*);
+    #t346.{core::Map::[]=}(let final<BottomType> #t349 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                               ^" in "baz" as{TypeError} core::int*, null);
+  } =>#t346;
+  block {
+    final core::List<core::int*>* #t350 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
+                                                ^" in "bar" as{TypeError} core::int*])
+        #t350.{core::List::add}(#t351);
+  } =>#t350;
+  block {
+    final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
+                                                ^" in "bar" as{TypeError} core::int*])
+        #t353.{core::Set::add}(#t354);
+    #t353.{core::Set::add}(null);
+  } =>#t353;
+  block {
+    final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
+        #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
+    #t356.{core::Map::[]=}(let final<BottomType> #t360 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                                    ^" in "baz" as{TypeError} core::int*, null);
+  } =>#t356;
+  block {
+    final core::List<core::int*>* #t361 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t361.{core::List::add}(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];
+                                               ^");
+  } =>#t361;
+  block {
+    final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t362.{core::Set::add}(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};
+                                               ^");
+    #t362.{core::Set::add}(null);
+  } =>#t362;
+  <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*>* #t363 = <core::String*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t363.{core::List::add}(let final<BottomType> #t364 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                             ^" in 42 as{TypeError} core::String*);
+      else
+        #t363.{core::List::add}(let final<BottomType> #t365 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                                     ^" in 3.14 as{TypeError} core::String*);
+  } =>#t363;
+  block {
+    final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t366.{core::Set::add}(let final<BottomType> #t367 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                             ^" in 42 as{TypeError} core::String*);
+      else
+        #t366.{core::Set::add}(let final<BottomType> #t368 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                                     ^" in 3.14 as{TypeError} core::String*);
+    #t366.{core::Set::add}(null);
+  } =>#t366;
+  block {
+    final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to '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*);
+      else
+        #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to '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*);
+    #t369.{core::Map::[]=}("baz", null);
+  } =>#t369;
+  block {
+    final core::List<core::int*>* #t372 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t372.{core::List::add}(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];
+                                                             ^");
+      else
+        #t372.{core::List::add}(42);
+  } =>#t372;
+  block {
+    final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t373.{core::Set::add}(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};
+                                                             ^");
+      else
+        #t373.{core::Set::add}(42);
+    #t373.{core::Set::add}(null);
+  } =>#t373;
+  <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*>* #t374 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t374.{core::List::add}(42);
+      else
+        #t374.{core::List::add}(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];
+                                                                     ^");
+  } =>#t374;
+  block {
+    final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t375.{core::Set::add}(42);
+      else
+        #t375.{core::Set::add}(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};
+                                                                     ^");
+    #t375.{core::Set::add}(null);
+  } =>#t375;
+  <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*>* #t376 = <core::int*>[];
+    for (final core::int* #t377 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+      #t376.{core::List::add}(i);
+    }
+  } =>#t376;
+  block {
+    final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t379 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+      #t378.{core::Set::add}(i);
+    }
+    #t378.{core::Set::add}(null);
+  } =>#t378;
+  block {
+    final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
+    for (final core::int* #t381 in <core::int*>[1]) {
+      invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
+\t                   ^";
+      #t380.{core::Map::[]=}("bar", i);
+    }
+    #t380.{core::Map::[]=}("baz", null);
+  } =>#t380;
+  core::List<dynamic>* list10 = block {
+    final core::List<dynamic>* #t382 = <dynamic>[];
+    for (dynamic i in let final<BottomType> #t383 = 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>*)
+      #t382.{core::List::add}(i);
+  } =>#t382;
+  core::Set<dynamic>* set10 = block {
+    final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+    for (dynamic i in let final<BottomType> #t385 = 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>*)
+      #t384.{core::Set::add}(i);
+    #t384.{core::Set::add}(null);
+  } =>#t384;
+  core::Map<core::String*, dynamic>* map10 = block {
+    final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
+    for (dynamic i in let final<BottomType> #t387 = 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>*)
+      #t386.{core::Map::[]=}("bar", i);
+    #t386.{core::Map::[]=}("baz", null);
+  } =>#t386;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t388 = <core::int*>[];
+    for (core::int* i in <core::int*>[let final<BottomType> #t389 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                                      ^" in "int" as{TypeError} core::int*])
+      #t388.{core::List::add}(i);
+  } =>#t388;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[let final<BottomType> #t392 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                                     ^" in "int" as{TypeError} core::int*])
+      #t391.{core::Set::add}(i);
+    #t391.{core::Set::add}(null);
+  } =>#t391;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[let final<BottomType> #t395 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                                     ^" in "int" as{TypeError} core::int*])
+      #t394.{core::Map::[]=}("bar", i);
+    #t394.{core::Map::[]=}("baz", null);
+  } =>#t394;
+  core::List<dynamic>* list30 = block {
+    final core::List<dynamic>* #t397 = <dynamic>[];
+    await for (dynamic i in let final<BottomType> #t398 = 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>*)
+      #t397.{core::List::add}(i);
+  } =>#t397;
+  core::Set<dynamic>* set30 = block {
+    final core::Set<dynamic>* #t399 = col::LinkedHashSet::•<dynamic>();
+    await for (dynamic i in let final<BottomType> #t400 = 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>*)
+      #t399.{core::Set::add}(i);
+    #t399.{core::Set::add}(null);
+  } =>#t399;
+  core::Map<core::String*, dynamic>* map30 = block {
+    final core::Map<core::String*, dynamic>* #t401 = <core::String*, dynamic>{};
+    await for (dynamic i in let final<BottomType> #t402 = 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>*)
+      #t401.{core::Map::[]=}("bar", i);
+    #t401.{core::Map::[]=}("baz", null);
+  } =>#t401;
+  core::List<core::int*>* list40 = block {
+    final core::List<core::int*>* #t403 = <core::int*>[];
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t404 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t405 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                                ^" in "int" as{TypeError} core::int*]))
+      #t403.{core::List::add}(i);
+  } =>#t403;
+  core::Set<core::int*>* set40 = block {
+    final core::Set<core::int*>* #t406 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t407 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t408 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                               ^" in "int" as{TypeError} core::int*]))
+      #t406.{core::Set::add}(i);
+    #t406.{core::Set::add}(null);
+  } =>#t406;
+  core::Map<core::String*, core::int*>* map40 = block {
+    final core::Map<core::String*, core::int*>* #t409 = <core::String*, core::int*>{};
+    await for (core::int* i in asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t410 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t411 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                               ^" in "int" as{TypeError} core::int*]))
+      #t409.{core::Map::[]=}("bar", i);
+    #t409.{core::Map::[]=}("baz", null);
+  } =>#t409;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t412 = <core::int*>[];
+    for (; ; )
+      #t412.{core::List::add}(42);
+  } =>#t412;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t413 = col::LinkedHashSet::•<core::int*>();
+    for (; ; )
+      #t413.{core::Set::add}(42);
+    #t413.{core::Set::add}(null);
+  } =>#t413;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t414 = <core::String*, core::int*>{};
+    for (; ; )
+      #t414.{core::Map::[]=}("bar", 42);
+    #t414.{core::Map::[]=}("baz", null);
+  } =>#t414;
+  core::List<core::int*>* list60 = block {
+    final core::List<core::int*>* #t415 = <core::int*>[];
+    for (; let final<BottomType> #t416 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var list60 = [for (; \"not bool\";) 42];
+                       ^" in "not bool" as{TypeError} core::bool*; )
+      #t415.{core::List::add}(42);
+  } =>#t415;
+  core::Set<core::int*>* set60 = block {
+    final core::Set<core::int*>* #t417 = col::LinkedHashSet::•<core::int*>();
+    for (; let final<BottomType> #t418 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var set60 = {for (; \"not bool\";) 42, null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+      #t417.{core::Set::add}(42);
+    #t417.{core::Set::add}(null);
+  } =>#t417;
+  core::Map<core::String*, core::int*>* map60 = block {
+    final core::Map<core::String*, core::int*>* #t419 = <core::String*, core::int*>{};
+    for (; let final<BottomType> #t420 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+      #t419.{core::Map::[]=}("bar", 42);
+    #t419.{core::Map::[]=}("baz", null);
+  } =>#t419;
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
+  block {
+    final core::List<core::int*>* #t421 = <core::int*>[];
+    await for (core::int* i in stream)
+      #t421.{core::List::add}(i);
+  } =>#t421;
+  block {
+    final core::Set<core::int*>* #t422 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in stream)
+      #t422.{core::Set::add}(i);
+  } =>#t422;
+  block {
+    final core::Map<core::String*, core::int*>* #t423 = <core::String*, core::int*>{};
+    await for (core::int* i in stream)
+      #t423.{core::Map::[]=}("bar", i);
+  } =>#t423;
+}
+static method testPromotion(self::A* a) → dynamic {
+  core::List<core::int*>* list10 = block {
+    final core::List<core::int*>* #t424 = <core::int*>[];
+    if(a is self::B*)
+      #t424.{core::List::add}(a{self::B*}.{self::B::foo});
+  } =>#t424;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t425 = col::LinkedHashSet::•<core::int*>();
+    if(a is self::B*)
+      #t425.{core::Set::add}(a{self::B*}.{self::B::foo});
+  } =>#t425;
+  core::Map<core::int*, core::int*>* map10 = block {
+    final core::Map<core::int*, core::int*>* #t426 = <core::int*, core::int*>{};
+    if(a is self::B*)
+      #t426.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t426;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..7f1ee70
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.strong.transformed.expect
@@ -0,0 +1,2462 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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: Setter not found: 'i'.
+//   <int>[for (i in <int>[1]) i];
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+//   <int>{for (i in <int>[1]) i, null};
+//              ^
+//
+// pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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::•()
+    ;
+}
+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} core::bool*)
+      #t1.{core::List::add}(42);
+  } =>#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} core::bool*)
+      #t2.{core::Set::add}(42);
+    #t2.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t3.{core::Map::[]=}("bar", 42);
+    #t3.{core::Map::[]=}("baz", null);
+  } =>#t3;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t4 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t4.{core::List::add}(dynVar);
+  } =>#t4;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t5.{core::Set::add}(dynVar);
+    #t5.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t6.{core::Map::[]=}("bar", dynVar);
+    #t6.{core::Map::[]=}("baz", null);
+  } =>#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} core::bool*)
+      #t7.{core::List::add}(<core::int*>[42]);
+  } =>#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} core::bool*)
+      #t8.{core::Set::add}(<core::int*>[42]);
+    #t8.{core::Set::add}(null);
+  } =>#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} core::bool*)
+      #t9.{core::Map::[]=}("bar", <core::int*>[42]);
+    #t9.{core::Map::[]=}("baz", null);
+  } =>#t9;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t10 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t11 in <core::int*>[42])
+        #t10.{core::List::add}(#t11);
+  } =>#t10;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t13 in <core::int*>[42])
+        #t12.{core::Set::add}(#t13);
+    #t12.{core::Set::add}(null);
+  } =>#t12;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t14 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t15 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t14.{core::Map::[]=}(#t15.{core::MapEntry::key}, #t15.{core::MapEntry::value});
+    #t14.{core::Map::[]=}("baz", null);
+  } =>#t14;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t16 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t17 in <dynamic>[dynVar])
+        #t16.{core::List::add}(#t17);
+  } =>#t16;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t18 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t19 in <dynamic>[dynVar])
+        #t18.{core::Set::add}(#t19);
+    #t18.{core::Set::add}(null);
+  } =>#t18;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t20 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, dynamic>* #t21 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t20.{core::Map::[]=}(#t21.{core::MapEntry::key}, #t21.{core::MapEntry::value});
+    #t20.{core::Map::[]=}("baz", null);
+  } =>#t20;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t22 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t23 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t22.{core::List::add}(#t23);
+  } =>#t22;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t24 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t25 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t24.{core::Set::add}(#t25);
+    #t24.{core::Set::add}(null);
+  } =>#t24;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t26 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t27 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t26.{core::Map::[]=}(#t27.{core::MapEntry::key}, #t27.{core::MapEntry::value});
+    #t26.{core::Map::[]=}("baz", null);
+  } =>#t26;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t28 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t29 in <core::int*>[42])
+          #t28.{core::List::add}(#t29);
+  } =>#t28;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t31 in <core::int*>[42])
+          #t30.{core::Set::add}(#t31);
+    #t30.{core::Set::add}(null);
+  } =>#t30;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t32 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t33 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t32.{core::Map::[]=}(#t33.{core::MapEntry::key}, #t33.{core::MapEntry::value});
+    #t32.{core::Map::[]=}("baz", null);
+  } =>#t32;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t34 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t35 in <dynamic>[dynVar])
+          #t34.{core::List::add}(#t35);
+  } =>#t34;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t36 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t37 in <dynamic>[dynVar])
+          #t36.{core::Set::add}(#t37);
+    #t36.{core::Set::add}(null);
+  } =>#t36;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t38 = <core::String*, dynamic>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t39 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t38.{core::Map::[]=}(#t39.{core::MapEntry::key}, #t39.{core::MapEntry::value});
+    #t38.{core::Map::[]=}("baz", null);
+  } =>#t38;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t40 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t41 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t40.{core::List::add}(#t41);
+  } =>#t40;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t42 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t43 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t42.{core::Set::add}(#t43);
+    #t42.{core::Set::add}(null);
+  } =>#t42;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t44 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t45 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t44.{core::Map::[]=}(#t45.{core::MapEntry::key}, #t45.{core::MapEntry::value});
+    #t44.{core::Map::[]=}("baz", null);
+  } =>#t44;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t46 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t47 in <core::List<core::int*>*>[<core::int*>[]])
+        #t46.{core::List::add}(#t47);
+  } =>#t46;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t48 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t49 in <core::List<core::int*>*>[<core::int*>[]])
+        #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(null);
+  } =>#t48;
+  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*>*>* #t50 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t51 in let final core::Set<core::List<core::int*>*>* #t52 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t53 = #t52.{core::Set::add}(<core::int*>[]) in #t52)
+        #t50.{core::List::add}(#t51);
+  } =>#t50;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t54 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t55 in let final core::Set<core::List<core::int*>*>* #t56 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t57 = #t56.{core::Set::add}(<core::int*>[]) in #t56)
+        #t54.{core::Set::add}(#t55);
+    #t54.{core::Set::add}(null);
+  } =>#t54;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t58 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t59 in <core::List<core::int*>*>[<core::int*>[]])
+          #t58.{core::List::add}(#t59);
+  } =>#t58;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t60 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t61 in <core::List<core::int*>*>[<core::int*>[]])
+          #t60.{core::Set::add}(#t61);
+    #t60.{core::Set::add}(null);
+  } =>#t60;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = 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} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} 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})
+          #t62.{core::Map::[]=}(#t63.{core::MapEntry::key}, #t63.{core::MapEntry::value});
+    #t62.{core::Map::[]=}("baz", null);
+  } =>#t62;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t64 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t65 in <core::int*>[])
+        #t64.{core::List::add}(#t65);
+  } =>#t64;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t67 in <core::int*>[])
+        #t66.{core::Set::add}(#t67);
+    #t66.{core::Set::add}(null);
+  } =>#t66;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t68 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t69 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t68.{core::Map::[]=}(#t69.{core::MapEntry::key}, #t69.{core::MapEntry::value});
+    #t68.{core::Map::[]=}("baz", null);
+  } =>#t68;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t70 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t71 in let final core::Set<core::int*>* #t72 = col::LinkedHashSet::•<core::int*>() in #t72)
+        #t70.{core::List::add}(#t71);
+  } =>#t70;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t73 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t74 in let final core::Set<core::int*>* #t75 = col::LinkedHashSet::•<core::int*>() in #t75)
+        #t73.{core::Set::add}(#t74);
+    #t73.{core::Set::add}(null);
+  } =>#t73;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t76 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t77 in <core::int*>[])
+          #t76.{core::List::add}(#t77);
+  } =>#t76;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t78 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t79 in <core::int*>[])
+          #t78.{core::Set::add}(#t79);
+    #t78.{core::Set::add}(null);
+  } =>#t78;
+  core::Map<core::String*, core::int*>* map52 = block {
+    final core::Map<core::String*, core::int*>* #t80 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t81 in <core::String*, core::int*>{}.{core::Map::entries})
+          #t80.{core::Map::[]=}(#t81.{core::MapEntry::key}, #t81.{core::MapEntry::value});
+    #t80.{core::Map::[]=}("baz", null);
+  } =>#t80;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t82 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t83 in <core::List<core::int*>*>[<core::int*>[]])
+        #t82.{core::List::add}(#t83);
+  } =>#t82;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t84 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::List<core::int*>* #t85 in <core::List<core::int*>*>[<core::int*>[]])
+        #t84.{core::Set::add}(#t85);
+    #t84.{core::Set::add}(null);
+  } =>#t84;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t86 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t87 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+    #t86.{core::Map::[]=}("baz", null);
+  } =>#t86;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t88 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t89 in <core::List<core::int*>*>[<core::int*>[]])
+          #t88.{core::List::add}(#t89);
+  } =>#t88;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t90 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t91 in <core::List<core::int*>*>[<core::int*>[]])
+          #t90.{core::Set::add}(#t91);
+    #t90.{core::Set::add}(null);
+  } =>#t90;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t92 = <core::String*, core::List<core::int*>*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t93 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t92.{core::Map::[]=}(#t93.{core::MapEntry::key}, #t93.{core::MapEntry::value});
+    #t92.{core::Map::[]=}("baz", null);
+  } =>#t92;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t94 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t94.{core::List::add}(<core::int*>[]);
+  } =>#t94;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t95 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t95.{core::Set::add}(<core::int*>[]);
+    #t95.{core::Set::add}(null);
+  } =>#t95;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t96 = <core::List<core::int*>*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t96.{core::List::add}(<core::int*>[]);
+  } =>#t96;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t97 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t97.{core::Set::add}(<core::int*>[]);
+    #t97.{core::Set::add}(null);
+  } =>#t97;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t98 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t98.{core::List::add}(42);
+    else
+      #t98.{core::List::add}(3.14);
+  } =>#t98;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t99 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t99.{core::Set::add}(42);
+    else
+      #t99.{core::Set::add}(3.14);
+    #t99.{core::Set::add}(null);
+  } =>#t99;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t100 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t100.{core::Map::[]=}("bar", 42);
+    else
+      #t100.{core::Map::[]=}("bar", 3.14);
+    #t100.{core::Map::[]=}("baz", null);
+  } =>#t100;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t101 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t102 in listInt)
+        #t101.{core::List::add}(#t102);
+    else
+      for (final core::num* #t103 in listDouble)
+        #t101.{core::List::add}(#t103);
+  } =>#t101;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t104 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t105 in listInt)
+        #t104.{core::Set::add}(#t105);
+    else
+      for (final core::num* #t106 in listDouble)
+        #t104.{core::Set::add}(#t106);
+    #t104.{core::Set::add}(null);
+  } =>#t104;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t107 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t108 in mapToInt.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t108.{core::MapEntry::key}, #t108.{core::MapEntry::value});
+    else
+      for (final core::MapEntry<core::String*, core::num*>* #t109 in mapToDouble.{core::Map::entries})
+        #t107.{core::Map::[]=}(#t109.{core::MapEntry::key}, #t109.{core::MapEntry::value});
+    #t107.{core::Map::[]=}("baz", null);
+  } =>#t107;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t110 = <dynamic>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t111 in listInt)
+        #t110.{core::List::add}(#t111);
+    else
+      for (final dynamic #t112 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t110.{core::List::add}(#t112);
+  } =>#t110;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t113 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t114 in listInt)
+        #t113.{core::Set::add}(#t114);
+    else
+      for (final dynamic #t115 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t113.{core::Set::add}(#t115);
+    #t113.{core::Set::add}(null);
+  } =>#t113;
+  core::Set<dynamic>* map82 = block {
+    final core::Set<dynamic>* #t116 = col::LinkedHashSet::•<dynamic>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t116.{core::Set::add}(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};
+                                     ^");
+    else
+      for (final dynamic #t117 in dynVar as{TypeError} core::Iterable<dynamic>*)
+        #t116.{core::Set::add}(#t117);
+    #t116.{core::Set::add}(null);
+  } =>#t116;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t118 = <core::num*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t118.{core::List::add}(42);
+    else
+      for (final core::num* #t119 in listDouble)
+        #t118.{core::List::add}(#t119);
+  } =>#t118;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t120 = col::LinkedHashSet::•<core::num*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::num* #t121 in listInt)
+        #t120.{core::Set::add}(#t121);
+    else
+      #t120.{core::Set::add}(3.14);
+    #t120.{core::Set::add}(null);
+  } =>#t120;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t122 = <core::String*, core::num*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::num*>* #t123 in mapToInt.{core::Map::entries})
+        #t122.{core::Map::[]=}(#t123.{core::MapEntry::key}, #t123.{core::MapEntry::value});
+    else
+      #t122.{core::Map::[]=}("bar", 3.14);
+    #t122.{core::Map::[]=}("baz", null);
+  } =>#t122;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t124 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t124.{core::List::add}(dynVar as{TypeError} core::int*);
+  } =>#t124;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t125 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t125.{core::Set::add}(dynVar as{TypeError} core::int*);
+    #t125.{core::Set::add}(null);
+  } =>#t125;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t126 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t126.{core::Map::[]=}("bar", dynVar as{TypeError} core::int*);
+    #t126.{core::Map::[]=}("baz", null);
+  } =>#t126;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t127 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t128 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t129 = #t128 as{TypeError} core::int*;
+        #t127.{core::List::add}(#t129);
+      }
+  } =>#t127;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t130 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final dynamic #t131 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t132 = #t131 as{TypeError} core::int*;
+        #t130.{core::Set::add}(#t132);
+      }
+    #t130.{core::Set::add}(null);
+  } =>#t130;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t133 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<dynamic, dynamic>* #t134 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t135 = #t134.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t136 = #t134.{core::MapEntry::value} as{TypeError} core::int*;
+        #t133.{core::Map::[]=}(#t135, #t136);
+      }
+    #t133.{core::Map::[]=}("baz", null);
+  } =>#t133;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t137 = <core::int*>[];
+    if(dynVar as{TypeError} core::bool*)
+      #t137.{core::List::add}(42);
+  } =>#t137;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t138 = col::LinkedHashSet::•<core::int*>();
+    if(dynVar as{TypeError} core::bool*)
+      #t138.{core::Set::add}(42);
+  } =>#t138;
+  core::Map<core::int*, core::int*>* map100 = block {
+    final core::Map<core::int*, core::int*>* #t139 = <core::int*, core::int*>{};
+    if(dynVar as{TypeError} core::bool*)
+      #t139.{core::Map::[]=}(42, 42);
+  } =>#t139;
+}
+static method testIfElementErrors(core::Map<core::int*, core::int*>* map) → dynamic {
+  block {
+    final core::List<core::int*>* #t140 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t140.{core::List::add}(let final<BottomType> #t141 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) \"bar\"];
+                           ^" in "bar" as{TypeError} core::int*);
+  } =>#t140;
+  block {
+    final core::Set<core::int*>* #t142 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t142.{core::Set::add}(let final<BottomType> #t143 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) \"bar\", null};
+                           ^" in "bar" as{TypeError} core::int*);
+    #t142.{core::Set::add}(null);
+  } =>#t142;
+  block {
+    final core::Map<core::String*, core::int*>* #t144 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t144.{core::Map::[]=}("bar", let final<BottomType> #t145 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) \"bar\": \"bar\", \"baz\": null};
+                                          ^" in "bar" as{TypeError} core::int*);
+    #t144.{core::Map::[]=}("baz", null);
+  } =>#t144;
+  block {
+    final core::List<core::int*>* #t146 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t147 in <core::int*>[let final<BottomType> #t148 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[if (oracle(\"foo\")) ...[\"bar\"]];
+                               ^" in "bar" as{TypeError} core::int*])
+        #t146.{core::List::add}(#t147);
+  } =>#t146;
+  block {
+    final core::Set<core::int*>* #t149 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::int* #t150 in <core::int*>[let final<BottomType> #t151 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{if (oracle(\"foo\")) ...[\"bar\"], null};
+                               ^" in "bar" as{TypeError} core::int*])
+        #t149.{core::Set::add}(#t150);
+    #t149.{core::Set::add}(null);
+  } =>#t149;
+  block {
+    final core::Map<core::String*, core::int*>* #t152 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      for (final core::MapEntry<core::String*, core::int*>* #t153 in <core::String*, core::int*>{"bar": let final<BottomType> #t154 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <String, int>{if (oracle(\"foo\")) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                              ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
+        #t152.{core::Map::[]=}(#t153.{core::MapEntry::key}, #t153.{core::MapEntry::value});
+    #t152.{core::Map::[]=}("baz", null);
+  } =>#t152;
+  block {
+    final core::List<core::int*>* #t155 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t155.{core::List::add}(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];
+                              ^");
+  } =>#t155;
+  block {
+    final core::Set<core::int*>* #t156 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t156.{core::Set::add}(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};
+                              ^");
+    #t156.{core::Set::add}(null);
+  } =>#t156;
+  <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*>* #t157 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t157.{core::List::add}(let final<BottomType> #t158 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                              ^" in 42 as{TypeError} core::String*);
+    else
+      #t157.{core::List::add}(let final<BottomType> #t159 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[if (oracle(\"foo\")) 42 else 3.14];
+                                      ^" in 3.14 as{TypeError} core::String*);
+  } =>#t157;
+  block {
+    final core::Set<core::String*>* #t160 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t160.{core::Set::add}(let final<BottomType> #t161 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                              ^" in 42 as{TypeError} core::String*);
+    else
+      #t160.{core::Set::add}(let final<BottomType> #t162 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{if (oracle(\"foo\")) 42 else 3.14, null};
+                                      ^" in 3.14 as{TypeError} core::String*);
+    #t160.{core::Set::add}(null);
+  } =>#t160;
+  block {
+    final core::Map<core::String*, core::String*>* #t163 = <core::String*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t163.{core::Map::[]=}("bar", let final<BottomType> #t164 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                             ^" in 42 as{TypeError} core::String*);
+    else
+      #t163.{core::Map::[]=}("baz", let final<BottomType> #t165 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String, String>{if (oracle(\"foo\")) \"bar\": 42 else \"baz\": 3.14, \"baz\": null};
+                                                            ^" in 3.14 as{TypeError} core::String*);
+    #t163.{core::Map::[]=}("baz", null);
+  } =>#t163;
+  block {
+    final core::List<core::int*>* #t166 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t166.{core::List::add}(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];
+                              ^");
+    else
+      #t166.{core::List::add}(42);
+  } =>#t166;
+  block {
+    final core::Set<core::int*>* #t167 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t167.{core::Set::add}(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};
+                              ^");
+    else
+      #t167.{core::Set::add}(42);
+    #t167.{core::Set::add}(null);
+  } =>#t167;
+  <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*>* #t168 = <core::int*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t168.{core::List::add}(42);
+    else
+      #t168.{core::List::add}(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];
+                                      ^");
+  } =>#t168;
+  block {
+    final core::Set<core::int*>* #t169 = col::LinkedHashSet::•<core::int*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t169.{core::Set::add}(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};
+                              ^");
+    else
+      #t169.{core::Set::add}(42);
+    #t169.{core::Set::add}(null);
+  } =>#t169;
+  <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<<BottomType>, core::Null*>* map12 = <<BottomType>, core::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<<BottomType>, core::Null*>* map13 = <<BottomType>, core::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*>* #t170 = <core::int*>[];
+    if(let final<BottomType> #t171 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  List<int> list20 = [if (42) 42];
+                          ^" in 42 as{TypeError} core::bool*)
+      #t170.{core::List::add}(42);
+  } =>#t170;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t172 = col::LinkedHashSet::•<core::int*>();
+    if(let final<BottomType> #t173 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Set<int> set20 = {if (42) 42};
+                        ^" in 42 as{TypeError} core::bool*)
+      #t172.{core::Set::add}(42);
+  } =>#t172;
+  core::Map<core::int*, core::int*>* map30 = block {
+    final core::Map<core::int*, core::int*>* #t174 = <core::int*, core::int*>{};
+    if(let final<BottomType> #t175 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  Map<int, int> map30 = {if (42) 42: 42};
+                             ^" in 42 as{TypeError} core::bool*)
+      #t174.{core::Map::[]=}(42, 42);
+  } =>#t174;
+  core::List<core::String*>* list40 = block {
+    final core::List<core::String*>* #t176 = <core::String*>[];
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t176.{core::List::add}(let final<BottomType> #t177 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                    ^" in true as{TypeError} core::String*);
+    else
+      #t176.{core::List::add}(let final<BottomType> #t178 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  List<String> list40 = <String>[if (oracle(\"foo\")) true else 42];
+                                                              ^" in 42 as{TypeError} core::String*);
+  } =>#t176;
+  core::Set<core::String*>* set40 = block {
+    final core::Set<core::String*>* #t179 = col::LinkedHashSet::•<core::String*>();
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t179.{core::Set::add}(let final<BottomType> #t180 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                  ^" in true as{TypeError} core::String*);
+    else
+      #t179.{core::Set::add}(let final<BottomType> #t181 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Set<String> set40 = <String>{if (oracle(\"foo\")) true else 42};
+                                                            ^" in 42 as{TypeError} core::String*);
+  } =>#t179;
+  core::Map<core::String*, core::int*>* map40 = block {
+    final core::Map<core::String*, core::int*>* #t182 = <core::String*, core::int*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t182.{core::Map::[]=}(let final<BottomType> #t183 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                            ^" in true as{TypeError} core::String*, 42);
+    else
+      #t182.{core::Map::[]=}(let final<BottomType> #t184 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<String, int> map40 = <String, int>{if (oracle(\"foo\")) true: 42 else 42: 42};
+                                                                          ^" in 42 as{TypeError} core::String*, 42);
+  } =>#t182;
+  core::Map<core::int*, core::String*>* map41 = block {
+    final core::Map<core::int*, core::String*>* #t185 = <core::int*, core::String*>{};
+    if(self::oracle<core::String*>("foo") as{TypeError} core::bool*)
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t186 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                ^" in true as{TypeError} core::String*);
+    else
+      #t185.{core::Map::[]=}(42, let final<BottomType> #t187 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  Map<int, String> map41 = <int, String>{if (oracle(\"foo\")) 42: true else 42: 42};
+                                                                              ^" in 42 as{TypeError} core::String*);
+  } =>#t185;
+}
+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*>* #t188 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t188.{core::List::add}(42);
+  } =>#t188;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t189 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t189.{core::Set::add}(42);
+    #t189.{core::Set::add}(null);
+  } =>#t189;
+  core::Map<core::String*, core::int*>* map10 = block {
+    final core::Map<core::String*, core::int*>* #t190 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t190.{core::Map::[]=}("bar", 42);
+    #t190.{core::Map::[]=}("baz", null);
+  } =>#t190;
+  core::List<dynamic>* list11 = block {
+    final core::List<dynamic>* #t191 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t191.{core::List::add}(dynVar);
+  } =>#t191;
+  core::Set<dynamic>* set11 = block {
+    final core::Set<dynamic>* #t192 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t192.{core::Set::add}(dynVar);
+    #t192.{core::Set::add}(null);
+  } =>#t192;
+  core::Map<core::String*, dynamic>* map11 = block {
+    final core::Map<core::String*, dynamic>* #t193 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t193.{core::Map::[]=}("bar", dynVar);
+    #t193.{core::Map::[]=}("baz", null);
+  } =>#t193;
+  core::List<core::List<core::int*>*>* list12 = block {
+    final core::List<core::List<core::int*>*>* #t194 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t194.{core::List::add}(<core::int*>[42]);
+  } =>#t194;
+  core::Set<core::List<core::int*>*>* set12 = block {
+    final core::Set<core::List<core::int*>*>* #t195 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t195.{core::Set::add}(<core::int*>[42]);
+    #t195.{core::Set::add}(null);
+  } =>#t195;
+  core::Map<core::String*, core::List<core::int*>*>* map12 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t196 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t196.{core::Map::[]=}("bar", <core::int*>[42]);
+    #t196.{core::Map::[]=}("baz", null);
+  } =>#t196;
+  core::List<core::int*>* list20 = block {
+    final core::List<core::int*>* #t197 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t198 in <core::int*>[42])
+        #t197.{core::List::add}(#t198);
+  } =>#t197;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t199 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t200 in <core::int*>[42])
+        #t199.{core::Set::add}(#t200);
+    #t199.{core::Set::add}(null);
+  } =>#t199;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t201 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::int*>* #t202 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+        #t201.{core::Map::[]=}(#t202.{core::MapEntry::key}, #t202.{core::MapEntry::value});
+    #t201.{core::Map::[]=}("baz", null);
+  } =>#t201;
+  core::List<dynamic>* list21 = block {
+    final core::List<dynamic>* #t203 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t204 in <dynamic>[dynVar])
+        #t203.{core::List::add}(#t204);
+  } =>#t203;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t205 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t206 in <dynamic>[dynVar])
+        #t205.{core::Set::add}(#t206);
+    #t205.{core::Set::add}(null);
+  } =>#t205;
+  core::Map<core::String*, dynamic>* map21 = block {
+    final core::Map<core::String*, dynamic>* #t207 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, dynamic>* #t208 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+        #t207.{core::Map::[]=}(#t208.{core::MapEntry::key}, #t208.{core::MapEntry::value});
+    #t207.{core::Map::[]=}("baz", null);
+  } =>#t207;
+  core::List<core::List<core::int*>*>* list22 = block {
+    final core::List<core::List<core::int*>*>* #t209 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t210 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t209.{core::List::add}(#t210);
+  } =>#t209;
+  core::Set<core::List<core::int*>*>* set22 = block {
+    final core::Set<core::List<core::int*>*>* #t211 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t212 in <core::List<core::int*>*>[<core::int*>[42]])
+        #t211.{core::Set::add}(#t212);
+    #t211.{core::Set::add}(null);
+  } =>#t211;
+  core::Map<core::String*, core::List<core::int*>*>* map22 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t213 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t214 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+        #t213.{core::Map::[]=}(#t214.{core::MapEntry::key}, #t214.{core::MapEntry::value});
+    #t213.{core::Map::[]=}("baz", null);
+  } =>#t213;
+  core::List<core::int*>* list30 = block {
+    final core::List<core::int*>* #t215 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t216 in <core::int*>[42])
+          #t215.{core::List::add}(#t216);
+  } =>#t215;
+  core::Set<core::int*>* set30 = block {
+    final core::Set<core::int*>* #t217 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t218 in <core::int*>[42])
+          #t217.{core::Set::add}(#t218);
+    #t217.{core::Set::add}(null);
+  } =>#t217;
+  core::Map<core::String*, core::int*>* map30 = block {
+    final core::Map<core::String*, core::int*>* #t219 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::int*>* #t220 in <core::String*, core::int*>{"bar": 42}.{core::Map::entries})
+          #t219.{core::Map::[]=}(#t220.{core::MapEntry::key}, #t220.{core::MapEntry::value});
+    #t219.{core::Map::[]=}("baz", null);
+  } =>#t219;
+  core::List<dynamic>* list31 = block {
+    final core::List<dynamic>* #t221 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t222 in <dynamic>[dynVar])
+          #t221.{core::List::add}(#t222);
+  } =>#t221;
+  core::Set<dynamic>* set31 = block {
+    final core::Set<dynamic>* #t223 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t224 in <dynamic>[dynVar])
+          #t223.{core::Set::add}(#t224);
+    #t223.{core::Set::add}(null);
+  } =>#t223;
+  core::Map<core::String*, dynamic>* map31 = block {
+    final core::Map<core::String*, dynamic>* #t225 = <core::String*, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, dynamic>* #t226 in <core::String*, dynamic>{"bar": dynVar}.{core::Map::entries})
+          #t225.{core::Map::[]=}(#t226.{core::MapEntry::key}, #t226.{core::MapEntry::value});
+    #t225.{core::Map::[]=}("baz", null);
+  } =>#t225;
+  core::List<core::List<core::int*>*>* list33 = block {
+    final core::List<core::List<core::int*>*>* #t227 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t228 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t227.{core::List::add}(#t228);
+  } =>#t227;
+  core::Set<core::List<core::int*>*>* set33 = block {
+    final core::Set<core::List<core::int*>*>* #t229 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t230 in <core::List<core::int*>*>[<core::int*>[42]])
+          #t229.{core::Set::add}(#t230);
+    #t229.{core::Set::add}(null);
+  } =>#t229;
+  core::Map<core::String*, core::List<core::int*>*>* map33 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t231 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t232 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[42]}.{core::Map::entries})
+          #t231.{core::Map::[]=}(#t232.{core::MapEntry::key}, #t232.{core::MapEntry::value});
+    #t231.{core::Map::[]=}("baz", null);
+  } =>#t231;
+  core::List<core::List<core::int*>*>* list40 = block {
+    final core::List<core::List<core::int*>*>* #t233 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t234 in <core::List<core::int*>*>[<core::int*>[]])
+        #t233.{core::List::add}(#t234);
+  } =>#t233;
+  core::Set<core::List<core::int*>*>* set40 = block {
+    final core::Set<core::List<core::int*>*>* #t235 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t236 in <core::List<core::int*>*>[<core::int*>[]])
+        #t235.{core::Set::add}(#t236);
+    #t235.{core::Set::add}(null);
+  } =>#t235;
+  core::Map<core::String*, core::List<core::int*>*>* map40 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t237 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t238 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t237.{core::Map::[]=}(#t238.{core::MapEntry::key}, #t238.{core::MapEntry::value});
+    #t237.{core::Map::[]=}("baz", null);
+  } =>#t237;
+  core::List<core::List<core::int*>*>* list41 = block {
+    final core::List<core::List<core::int*>*>* #t239 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t240 in let final core::Set<core::List<core::int*>*>* #t241 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t242 = #t241.{core::Set::add}(<core::int*>[]) in #t241)
+        #t239.{core::List::add}(#t240);
+  } =>#t239;
+  core::Set<core::List<core::int*>*>* set41 = block {
+    final core::Set<core::List<core::int*>*>* #t243 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t244 in let final core::Set<core::List<core::int*>*>* #t245 = col::LinkedHashSet::•<core::List<core::int*>*>() in let final core::bool* #t246 = #t245.{core::Set::add}(<core::int*>[]) in #t245)
+        #t243.{core::Set::add}(#t244);
+    #t243.{core::Set::add}(null);
+  } =>#t243;
+  core::List<core::List<core::int*>*>* list42 = block {
+    final core::List<core::List<core::int*>*>* #t247 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t248 in <core::List<core::int*>*>[<core::int*>[]])
+          #t247.{core::List::add}(#t248);
+  } =>#t247;
+  core::Set<core::List<core::int*>*>* set42 = block {
+    final core::Set<core::List<core::int*>*>* #t249 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t250 in <core::List<core::int*>*>[<core::int*>[]])
+          #t249.{core::Set::add}(#t250);
+    #t249.{core::Set::add}(null);
+  } =>#t249;
+  core::Map<core::String*, core::List<core::int*>*>* map42 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t251 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t252 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t251.{core::Map::[]=}(#t252.{core::MapEntry::key}, #t252.{core::MapEntry::value});
+    #t251.{core::Map::[]=}("baz", null);
+  } =>#t251;
+  core::List<core::int*>* list50 = block {
+    final core::List<core::int*>* #t253 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t254 in <core::int*>[])
+        #t253.{core::List::add}(#t254);
+  } =>#t253;
+  core::Set<core::int*>* set50 = block {
+    final core::Set<core::int*>* #t255 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t256 in <core::int*>[])
+        #t255.{core::Set::add}(#t256);
+    #t255.{core::Set::add}(null);
+  } =>#t255;
+  core::Map<core::String*, core::int*>* map50 = block {
+    final core::Map<core::String*, core::int*>* #t257 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::int*>* #t258 in <core::String*, core::int*>{}.{core::Map::entries})
+        #t257.{core::Map::[]=}(#t258.{core::MapEntry::key}, #t258.{core::MapEntry::value});
+    #t257.{core::Map::[]=}("baz", null);
+  } =>#t257;
+  core::List<core::int*>* list51 = block {
+    final core::List<core::int*>* #t259 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t260 in let final core::Set<core::int*>* #t261 = col::LinkedHashSet::•<core::int*>() in #t261)
+        #t259.{core::List::add}(#t260);
+  } =>#t259;
+  core::Set<core::int*>* set51 = block {
+    final core::Set<core::int*>* #t262 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::int* #t263 in let final core::Set<core::int*>* #t264 = col::LinkedHashSet::•<core::int*>() in #t264)
+        #t262.{core::Set::add}(#t263);
+    #t262.{core::Set::add}(null);
+  } =>#t262;
+  core::List<core::int*>* list52 = block {
+    final core::List<core::int*>* #t265 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t266 in <core::int*>[])
+          #t265.{core::List::add}(#t266);
+  } =>#t265;
+  core::Set<core::int*>* set52 = block {
+    final core::Set<core::int*>* #t267 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::int* #t268 in <core::int*>[])
+          #t267.{core::Set::add}(#t268);
+    #t267.{core::Set::add}(null);
+  } =>#t267;
+  core::List<core::List<core::int*>*>* list60 = block {
+    final core::List<core::List<core::int*>*>* #t269 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t270 in <core::List<core::int*>*>[<core::int*>[]])
+        #t269.{core::List::add}(#t270);
+  } =>#t269;
+  core::Set<core::List<core::int*>*>* set60 = block {
+    final core::Set<core::List<core::int*>*>* #t271 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::List<core::int*>* #t272 in <core::List<core::int*>*>[<core::int*>[]])
+        #t271.{core::Set::add}(#t272);
+    #t271.{core::Set::add}(null);
+  } =>#t271;
+  core::Map<core::String*, core::List<core::int*>*>* map60 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t273 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t274 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+        #t273.{core::Map::[]=}(#t274.{core::MapEntry::key}, #t274.{core::MapEntry::value});
+    #t273.{core::Map::[]=}("baz", null);
+  } =>#t273;
+  core::List<core::List<core::int*>*>* list61 = block {
+    final core::List<core::List<core::int*>*>* #t275 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t276 in <core::List<core::int*>*>[<core::int*>[]])
+          #t275.{core::List::add}(#t276);
+  } =>#t275;
+  core::Set<core::List<core::int*>*>* set61 = block {
+    final core::Set<core::List<core::int*>*>* #t277 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::List<core::int*>* #t278 in <core::List<core::int*>*>[<core::int*>[]])
+          #t277.{core::Set::add}(#t278);
+    #t277.{core::Set::add}(null);
+  } =>#t277;
+  core::Map<core::String*, core::List<core::int*>*>* map61 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t279 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t280 in <core::String*, core::List<core::int*>*>{"bar": <core::int*>[]}.{core::Map::entries})
+          #t279.{core::Map::[]=}(#t280.{core::MapEntry::key}, #t280.{core::MapEntry::value});
+    #t279.{core::Map::[]=}("baz", null);
+  } =>#t279;
+  core::List<core::List<core::int*>*>* list70 = block {
+    final core::List<core::List<core::int*>*>* #t281 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t281.{core::List::add}(<core::int*>[]);
+  } =>#t281;
+  core::Set<core::List<core::int*>*>* set70 = block {
+    final core::Set<core::List<core::int*>*>* #t282 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t282.{core::Set::add}(<core::int*>[]);
+    #t282.{core::Set::add}(null);
+  } =>#t282;
+  core::Map<core::String*, core::List<core::int*>*>* map70 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t283 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t283.{core::Map::[]=}("bar", <core::int*>[]);
+    #t283.{core::Map::[]=}("baz", null);
+  } =>#t283;
+  core::List<core::List<core::int*>*>* list71 = block {
+    final core::List<core::List<core::int*>*>* #t284 = <core::List<core::int*>*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t284.{core::List::add}(<core::int*>[]);
+  } =>#t284;
+  core::Set<core::List<core::int*>*>* set71 = block {
+    final core::Set<core::List<core::int*>*>* #t285 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t285.{core::Set::add}(<core::int*>[]);
+    #t285.{core::Set::add}(null);
+  } =>#t285;
+  core::Map<core::String*, core::List<core::int*>*>* map71 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t286 = <core::String*, core::List<core::int*>*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t286.{core::Map::[]=}("bar", <core::int*>[]);
+    #t286.{core::Map::[]=}("baz", null);
+  } =>#t286;
+  core::List<core::num*>* list80 = block {
+    final core::List<core::num*>* #t287 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t287.{core::List::add}(42);
+      else
+        #t287.{core::List::add}(3.14);
+  } =>#t287;
+  core::Set<core::num*>* set80 = block {
+    final core::Set<core::num*>* #t288 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t288.{core::Set::add}(42);
+      else
+        #t288.{core::Set::add}(3.14);
+    #t288.{core::Set::add}(null);
+  } =>#t288;
+  core::Map<core::String*, core::num*>* map80 = block {
+    final core::Map<core::String*, core::num*>* #t289 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t289.{core::Map::[]=}("bar", 42);
+      else
+        #t289.{core::Map::[]=}("bar", 3.14);
+    #t289.{core::Map::[]=}("baz", null);
+  } =>#t289;
+  core::List<core::num*>* list81 = block {
+    final core::List<core::num*>* #t290 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t291 in listInt)
+          #t290.{core::List::add}(#t291);
+      else
+        for (final core::num* #t292 in listDouble)
+          #t290.{core::List::add}(#t292);
+  } =>#t290;
+  core::Set<core::num*>* set81 = block {
+    final core::Set<core::num*>* #t293 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t294 in listInt)
+          #t293.{core::Set::add}(#t294);
+      else
+        for (final core::num* #t295 in listDouble)
+          #t293.{core::Set::add}(#t295);
+    #t293.{core::Set::add}(null);
+  } =>#t293;
+  core::Map<core::String*, core::num*>* map81 = block {
+    final core::Map<core::String*, core::num*>* #t296 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t297 in mapStringInt.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t297.{core::MapEntry::key}, #t297.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<core::String*, core::num*>* #t298 in mapStringDouble.{core::Map::entries})
+          #t296.{core::Map::[]=}(#t298.{core::MapEntry::key}, #t298.{core::MapEntry::value});
+    #t296.{core::Map::[]=}("baz", null);
+  } =>#t296;
+  core::List<dynamic>* list82 = block {
+    final core::List<dynamic>* #t299 = <dynamic>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t300 in listInt)
+          #t299.{core::List::add}(#t300);
+      else
+        for (final dynamic #t301 in dynVar as{TypeError} core::Iterable<dynamic>*)
+          #t299.{core::List::add}(#t301);
+  } =>#t299;
+  core::Set<dynamic>* set82 = block {
+    final core::Set<dynamic>* #t302 = col::LinkedHashSet::•<dynamic>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final dynamic #t303 in listInt)
+          #t302.{core::Set::add}(#t303);
+      else
+        for (final dynamic #t304 in dynVar as{TypeError} core::Iterable<dynamic>*)
+          #t302.{core::Set::add}(#t304);
+    #t302.{core::Set::add}(null);
+  } =>#t302;
+  core::Map<dynamic, dynamic>* map82 = block {
+    final core::Map<dynamic, dynamic>* #t305 = <dynamic, dynamic>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<dynamic, dynamic>* #t306 in mapStringInt.{core::Map::entries})
+          #t305.{core::Map::[]=}(#t306.{core::MapEntry::key}, #t306.{core::MapEntry::value});
+      else
+        for (final core::MapEntry<dynamic, dynamic>* #t307 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
+          #t305.{core::Map::[]=}(#t307.{core::MapEntry::key}, #t307.{core::MapEntry::value});
+    #t305.{core::Map::[]=}("baz", null);
+  } =>#t305;
+  core::List<core::num*>* list83 = block {
+    final core::List<core::num*>* #t308 = <core::num*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        #t308.{core::List::add}(42);
+      else
+        for (final core::num* #t309 in listDouble)
+          #t308.{core::List::add}(#t309);
+  } =>#t308;
+  core::Set<core::num*>* set83 = block {
+    final core::Set<core::num*>* #t310 = col::LinkedHashSet::•<core::num*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::num* #t311 in listInt)
+          #t310.{core::Set::add}(#t311);
+      else
+        #t310.{core::Set::add}(3.14);
+    #t310.{core::Set::add}(null);
+  } =>#t310;
+  core::Map<core::String*, core::num*>* map83 = block {
+    final core::Map<core::String*, core::num*>* #t312 = <core::String*, core::num*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      if(self::oracle<dynamic>() as{TypeError} core::bool*)
+        for (final core::MapEntry<core::String*, core::num*>* #t313 in mapStringInt.{core::Map::entries})
+          #t312.{core::Map::[]=}(#t313.{core::MapEntry::key}, #t313.{core::MapEntry::value});
+      else
+        #t312.{core::Map::[]=}("bar", 3.14);
+    #t312.{core::Map::[]=}("baz", null);
+  } =>#t312;
+  core::List<core::int*>* list90 = block {
+    final core::List<core::int*>* #t314 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t314.{core::List::add}(dynVar as{TypeError} core::int*);
+  } =>#t314;
+  core::Set<core::int*>* set90 = block {
+    final core::Set<core::int*>* #t315 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t315.{core::Set::add}(dynVar as{TypeError} core::int*);
+    #t315.{core::Set::add}(null);
+  } =>#t315;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t316 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      #t316.{core::Map::[]=}("bar", dynVar as{TypeError} core::int*);
+    #t316.{core::Map::[]=}("baz", null);
+  } =>#t316;
+  core::List<core::int*>* list91 = block {
+    final core::List<core::int*>* #t317 = <core::int*>[];
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t318 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t319 = #t318 as{TypeError} core::int*;
+        #t317.{core::List::add}(#t319);
+      }
+  } =>#t317;
+  core::Set<core::int*>* set91 = block {
+    final core::Set<core::int*>* #t320 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final dynamic #t321 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+        final core::int* #t322 = #t321 as{TypeError} core::int*;
+        #t320.{core::Set::add}(#t322);
+      }
+    #t320.{core::Set::add}(null);
+  } =>#t320;
+  core::Map<core::String*, core::int*>* map91 = block {
+    final core::Map<core::String*, core::int*>* #t323 = <core::String*, core::int*>{};
+    for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+      for (final core::MapEntry<dynamic, dynamic>* #t324 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+        final core::String* #t325 = #t324.{core::MapEntry::key} as{TypeError} core::String*;
+        final core::int* #t326 = #t324.{core::MapEntry::value} as{TypeError} core::int*;
+        #t323.{core::Map::[]=}(#t325, #t326);
+      }
+    #t323.{core::Map::[]=}("baz", null);
+  } =>#t323;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t327 = <core::int*>[];
+    for (final core::int* #t328 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t327.{core::List::add}(42);
+  } =>#t327;
+  core::Set<core::int*>* set100 = block {
+    final core::Set<core::int*>* #t329 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t330 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t329.{core::Set::add}(42);
+  } =>#t329;
+  core::Map<core::String*, core::int*>* map100 = block {
+    final core::Map<core::String*, core::int*>* #t331 = <core::String*, core::int*>{};
+    for (final core::int* #t332 = index = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; index = index.{core::num::+}(1))
+      #t331.{core::Map::[]=}("bar", 42);
+  } =>#t331;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t333 = <core::int*>[];
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t333.{core::List::add}(i);
+  } =>#t333;
+  core::Set<core::int*>* set110 = block {
+    final core::Set<core::int*>* #t334 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t334.{core::Set::add}(i);
+    #t334.{core::Set::add}(null);
+  } =>#t334;
+  core::Map<core::String*, core::int*>* map110 = block {
+    final core::Map<core::String*, core::int*>* #t335 = <core::String*, core::int*>{};
+    for (core::int* i in <core::int*>[1, 2, 3])
+      #t335.{core::Map::[]=}("bar", i);
+    #t335.{core::Map::[]=}("baz", null);
+  } =>#t335;
+  core::List<core::int*>* list120 = block {
+    final core::List<core::int*>* #t336 = <core::int*>[];
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t336.{core::List::add}(i as{TypeError} core::int*);
+  } =>#t336;
+  core::Set<core::int*>* set120 = block {
+    final core::Set<core::int*>* #t337 = col::LinkedHashSet::•<core::int*>();
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t337.{core::Set::add}(i as{TypeError} core::int*);
+    #t337.{core::Set::add}(null);
+  } =>#t337;
+  core::Map<core::String*, core::int*>* map120 = block {
+    final core::Map<core::String*, core::int*>* #t338 = <core::String*, core::int*>{};
+    for (dynamic i in dynVar as{TypeError} core::Iterable<dynamic>*)
+      #t338.{core::Map::[]=}("bar", i as{TypeError} core::int*);
+    #t338.{core::Map::[]=}("baz", null);
+  } =>#t338;
+  core::List<core::int*>* list130 = block {
+    final core::List<core::int*>* #t339 = <core::int*>[];
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t339.{core::List::add}(i);
+  } =>#t339;
+  core::Set<core::int*>* set130 = block {
+    final core::Set<core::int*>* #t340 = col::LinkedHashSet::•<core::int*>();
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t340.{core::Set::add}(i);
+  } =>#t340;
+  core::Map<core::int*, core::int*>* map130 = block {
+    final core::Map<core::int*, core::int*>* #t341 = <core::int*, core::int*>{};
+    for (core::int* i = 1; i.{core::num::<}(2); i = i.{core::num::+}(1))
+      #t341.{core::Map::[]=}(i, i);
+  } =>#t341;
+}
+static method testForElementErrors(core::Map<core::int*, core::int*>* map, core::List<core::int*>* list) → dynamic /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        block {
+          final core::List<core::int*>* #t342 = <core::int*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            #t342.{core::List::add}(let final<BottomType> #t343 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) \"bar\"];
+                                            ^" in "bar" as{TypeError} core::int*);
+        } =>#t342;
+        block {
+          final core::Set<core::int*>* #t344 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            #t344.{core::Set::add}(let final<BottomType> #t345 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\", null};
+                                            ^" in "bar" as{TypeError} core::int*);
+          #t344.{core::Set::add}(null);
+        } =>#t344;
+        block {
+          final core::Map<core::int*, core::int*>* #t346 = <core::int*, core::int*>{};
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            #t346.{core::Map::[]=}(let final<BottomType> #t347 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                 ^" in "bar" as{TypeError} core::int*, let final<BottomType> #t348 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                        ^" in "bar" as{TypeError} core::int*);
+          #t346.{core::Map::[]=}(let final<BottomType> #t349 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) \"bar\": \"bar\", \"baz\": null};
+                                                               ^" in "baz" as{TypeError} core::int*, null);
+        } =>#t346;
+        block {
+          final core::List<core::int*>* #t350 = <core::int*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            for (final core::int* #t351 in <core::int*>[let final<BottomType> #t352 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>[for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"]];
+                                                ^" in "bar" as{TypeError} core::int*])
+              #t350.{core::List::add}(#t351);
+        } =>#t350;
+        block {
+          final core::Set<core::int*>* #t353 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            for (final core::int* #t354 in <core::int*>[let final<BottomType> #t355 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int>{for (int i = 0; oracle(\"foo\"); i++) ...[\"bar\"], null};
+                                                ^" in "bar" as{TypeError} core::int*])
+              #t353.{core::Set::add}(#t354);
+          #t353.{core::Set::add}(null);
+        } =>#t353;
+        block {
+          final core::Map<core::int*, core::int*>* #t356 = <core::int*, core::int*>{};
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            for (final core::MapEntry<core::int*, core::int*>* #t357 in <core::int*, core::int*>{let final<BottomType> #t358 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                     ^" in "bar" as{TypeError} core::int*: let final<BottomType> #t359 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                            ^" in "bar" as{TypeError} core::int*}.{core::Map::entries})
+              #t356.{core::Map::[]=}(#t357.{core::MapEntry::key}, #t357.{core::MapEntry::value});
+          #t356.{core::Map::[]=}(let final<BottomType> #t360 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  <int, int>{for (int i = 0; oracle(\"foo\"); i++) ...{\"bar\": \"bar\"}, \"baz\": null};
+                                                                    ^" in "baz" as{TypeError} core::int*, null);
+        } =>#t356;
+        block {
+          final core::List<core::int*>* #t361 = <core::int*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            #t361.{core::List::add}(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];
+                                               ^");
+        } =>#t361;
+        block {
+          final core::Set<core::int*>* #t362 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            #t362.{core::Set::add}(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};
+                                               ^");
+          #t362.{core::Set::add}(null);
+        } =>#t362;
+        <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*>* #t363 = <core::String*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t363.{core::List::add}(let final<BottomType> #t364 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                             ^" in 42 as{TypeError} core::String*);
+            else
+              #t363.{core::List::add}(let final<BottomType> #t365 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>[for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14];
+                                                                     ^" in 3.14 as{TypeError} core::String*);
+        } =>#t363;
+        block {
+          final core::Set<core::String*>* #t366 = col::LinkedHashSet::•<core::String*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t366.{core::Set::add}(let final<BottomType> #t367 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                             ^" in 42 as{TypeError} core::String*);
+            else
+              #t366.{core::Set::add}(let final<BottomType> #t368 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+  <String>{for (int i = 0; oracle(\"foo\"); i++) if (oracle()) 42 else 3.14, null};
+                                                                     ^" in 3.14 as{TypeError} core::String*);
+          #t366.{core::Set::add}(null);
+        } =>#t366;
+        block {
+          final core::Map<core::String*, core::String*>* #t369 = <core::String*, core::String*>{};
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t369.{core::Map::[]=}("bar", let final<BottomType> #t370 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to '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*);
+            else
+              #t369.{core::Map::[]=}("bar", let final<BottomType> #t371 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to '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*);
+          #t369.{core::Map::[]=}("baz", null);
+        } =>#t369;
+        block {
+          final core::List<core::int*>* #t372 = <core::int*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t372.{core::List::add}(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];
+                                                             ^");
+            else
+              #t372.{core::List::add}(42);
+        } =>#t372;
+        block {
+          final core::Set<core::int*>* #t373 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t373.{core::Set::add}(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};
+                                                             ^");
+            else
+              #t373.{core::Set::add}(42);
+          #t373.{core::Set::add}(null);
+        } =>#t373;
+        <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*>* #t374 = <core::int*>[];
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t374.{core::List::add}(42);
+            else
+              #t374.{core::List::add}(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];
+                                                                     ^");
+        } =>#t374;
+        block {
+          final core::Set<core::int*>* #t375 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i = 0; self::oracle<core::String*>("foo") as{TypeError} core::bool*; i = i.{core::num::+}(1))
+            if(self::oracle<dynamic>() as{TypeError} core::bool*)
+              #t375.{core::Set::add}(42);
+            else
+              #t375.{core::Set::add}(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};
+                                                                     ^");
+          #t375.{core::Set::add}(null);
+        } =>#t375;
+        <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*>* #t376 = <core::int*>[];
+          for (final core::int* #t377 in <core::int*>[1]) {
+            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:230:14: Error: Setter not found: 'i'.
+  <int>[for (i in <int>[1]) i];
+             ^";
+            #t376.{core::List::add}(i);
+          }
+        } =>#t376;
+        block {
+          final core::Set<core::int*>* #t378 = col::LinkedHashSet::•<core::int*>();
+          for (final core::int* #t379 in <core::int*>[1]) {
+            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:231:14: Error: Setter not found: 'i'.
+  <int>{for (i in <int>[1]) i, null};
+             ^";
+            #t378.{core::Set::add}(i);
+          }
+          #t378.{core::Set::add}(null);
+        } =>#t378;
+        block {
+          final core::Map<core::String*, core::int*>* #t380 = <core::String*, core::int*>{};
+          for (final core::int* #t381 in <core::int*>[1]) {
+            invalid-expression "pkg/front_end/testcases/general/control_flow_collection_inference.dart:232:21: Error: Setter not found: 'i'.
+\t<String, int>{for (i in <int>[1]) \"bar\": i, \"baz\": null};
+\t                   ^";
+            #t380.{core::Map::[]=}("bar", i);
+          }
+          #t380.{core::Map::[]=}("baz", null);
+        } =>#t380;
+        core::List<dynamic>* list10 = block {
+          final core::List<dynamic>* #t382 = <dynamic>[];
+          for (dynamic i in let final<BottomType> #t383 = 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>*)
+            #t382.{core::List::add}(i);
+        } =>#t382;
+        core::Set<dynamic>* set10 = block {
+          final core::Set<dynamic>* #t384 = col::LinkedHashSet::•<dynamic>();
+          for (dynamic i in let final<BottomType> #t385 = 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>*)
+            #t384.{core::Set::add}(i);
+          #t384.{core::Set::add}(null);
+        } =>#t384;
+        core::Map<core::String*, dynamic>* map10 = block {
+          final core::Map<core::String*, dynamic>* #t386 = <core::String*, dynamic>{};
+          for (dynamic i in let final<BottomType> #t387 = 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>*)
+            #t386.{core::Map::[]=}("bar", i);
+          #t386.{core::Map::[]=}("baz", null);
+        } =>#t386;
+        core::List<core::int*>* list20 = block {
+          final core::List<core::int*>* #t388 = <core::int*>[];
+          for (core::int* i in <core::int*>[let final<BottomType> #t389 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                               ^" in "not" as{TypeError} core::int*, let final<BottomType> #t390 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list20 = [for (int i in [\"not\", \"int\"]) i];
+                                      ^" in "int" as{TypeError} core::int*])
+            #t388.{core::List::add}(i);
+        } =>#t388;
+        core::Set<core::int*>* set20 = block {
+          final core::Set<core::int*>* #t391 = col::LinkedHashSet::•<core::int*>();
+          for (core::int* i in <core::int*>[let final<BottomType> #t392 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t393 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set20 = {for (int i in [\"not\", \"int\"]) i, null};
+                                     ^" in "int" as{TypeError} core::int*])
+            #t391.{core::Set::add}(i);
+          #t391.{core::Set::add}(null);
+        } =>#t391;
+        core::Map<core::String*, core::int*>* map20 = block {
+          final core::Map<core::String*, core::int*>* #t394 = <core::String*, core::int*>{};
+          for (core::int* i in <core::int*>[let final<BottomType> #t395 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                              ^" in "not" as{TypeError} core::int*, let final<BottomType> #t396 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map20 = {for (int i in [\"not\", \"int\"]) \"bar\": i, \"baz\": null};
+                                     ^" in "int" as{TypeError} core::int*])
+            #t394.{core::Map::[]=}("bar", i);
+          #t394.{core::Map::[]=}("baz", null);
+        } =>#t394;
+        final core::List<dynamic>* #t397 = <dynamic>[];
+        {
+          dynamic :stream = let final<BottomType> #t398 = 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>*;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          try
+            #L2:
+            while (true) {
+              dynamic #t399 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t400 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t397.{core::List::add}(i);
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t401 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::List<dynamic>* list30 = block {} =>#t397;
+        final core::Set<dynamic>* #t402 = col::LinkedHashSet::•<dynamic>();
+        {
+          dynamic :stream = let final<BottomType> #t403 = 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>*;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          try
+            #L3:
+            while (true) {
+              dynamic #t404 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t405 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t402.{core::Set::add}(i);
+              }
+              else
+                break #L3;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t406 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Set<dynamic>* set30 = block {
+          #t402.{core::Set::add}(null);
+        } =>#t402;
+        final core::Map<core::String*, dynamic>* #t407 = <core::String*, dynamic>{};
+        {
+          dynamic :stream = let final<BottomType> #t408 = 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>*;
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          try
+            #L4:
+            while (true) {
+              dynamic #t409 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t410 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic i = :for-iterator.{asy::_StreamIterator::current};
+                #t407.{core::Map::[]=}("bar", i);
+              }
+              else
+                break #L4;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t411 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Map<core::String*, dynamic>* map30 = block {
+          #t407.{core::Map::[]=}("baz", null);
+        } =>#t407;
+        final core::List<core::int*>* #t412 = <core::int*>[];
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t413 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                         ^" in "not" as{TypeError} core::int*, let final<BottomType> #t414 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var list40 = [await for (int i in Stream.fromIterable([\"not\", \"int\"])) i];
+                                                                ^" in "int" as{TypeError} core::int*]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
+          try
+            #L5:
+            while (true) {
+              dynamic #t415 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t416 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int* i = :for-iterator.{asy::_StreamIterator::current};
+                #t412.{core::List::add}(i);
+              }
+              else
+                break #L5;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t417 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::List<core::int*>* list40 = block {} =>#t412;
+        final core::Set<core::int*>* #t418 = col::LinkedHashSet::•<core::int*>();
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t419 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t420 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var set40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) i, null};
+                                                               ^" in "int" as{TypeError} core::int*]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
+          try
+            #L6:
+            while (true) {
+              dynamic #t421 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t422 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int* i = :for-iterator.{asy::_StreamIterator::current};
+                #t418.{core::Set::add}(i);
+              }
+              else
+                break #L6;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t423 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Set<core::int*>* set40 = block {
+          #t418.{core::Set::add}(null);
+        } =>#t418;
+        final core::Map<core::String*, core::int*>* #t424 = <core::String*, core::int*>{};
+        {
+          dynamic :stream = asy::Stream::fromIterable<core::int*>(<core::int*>[let final<BottomType> #t425 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                        ^" in "not" as{TypeError} core::int*, let final<BottomType> #t426 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  var map40 = {await for (int i in Stream.fromIterable([\"not\", \"int\"])) \"bar\": i, \"baz\": null};
+                                                               ^" in "int" as{TypeError} core::int*]);
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
+          try
+            #L7:
+            while (true) {
+              dynamic #t427 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t428 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                core::int* i = :for-iterator.{asy::_StreamIterator::current};
+                #t424.{core::Map::[]=}("bar", i);
+              }
+              else
+                break #L7;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t429 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+        core::Map<core::String*, core::int*>* map40 = block {
+          #t424.{core::Map::[]=}("baz", null);
+        } =>#t424;
+        core::List<core::int*>* list50 = block {
+          final core::List<core::int*>* #t430 = <core::int*>[];
+          for (; ; )
+            #t430.{core::List::add}(42);
+        } =>#t430;
+        core::Set<core::int*>* set50 = block {
+          final core::Set<core::int*>* #t431 = col::LinkedHashSet::•<core::int*>();
+          for (; ; )
+            #t431.{core::Set::add}(42);
+          #t431.{core::Set::add}(null);
+        } =>#t431;
+        core::Map<core::String*, core::int*>* map50 = block {
+          final core::Map<core::String*, core::int*>* #t432 = <core::String*, core::int*>{};
+          for (; ; )
+            #t432.{core::Map::[]=}("bar", 42);
+          #t432.{core::Map::[]=}("baz", null);
+        } =>#t432;
+        core::List<core::int*>* list60 = block {
+          final core::List<core::int*>* #t433 = <core::int*>[];
+          for (; let final<BottomType> #t434 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var list60 = [for (; \"not bool\";) 42];
+                       ^" in "not bool" as{TypeError} core::bool*; )
+            #t433.{core::List::add}(42);
+        } =>#t433;
+        core::Set<core::int*>* set60 = block {
+          final core::Set<core::int*>* #t435 = col::LinkedHashSet::•<core::int*>();
+          for (; let final<BottomType> #t436 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var set60 = {for (; \"not bool\";) 42, null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+            #t435.{core::Set::add}(42);
+          #t435.{core::Set::add}(null);
+        } =>#t435;
+        core::Map<core::String*, core::int*>* map60 = block {
+          final core::Map<core::String*, core::int*>* #t437 = <core::String*, core::int*>{};
+          for (; let final<BottomType> #t438 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'bool'.
+  var map60 = {for (; \"not bool\";) \"bar\": 42, \"baz\": null};
+                      ^" in "not bool" as{TypeError} core::bool*; )
+            #t437.{core::Map::[]=}("bar", 42);
+          #t437.{core::Map::[]=}("baz", null);
+        } =>#t437;
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method testForElementErrorsNotAsync(asy::Stream<core::int*>* stream) → dynamic {
+  block {
+    final core::List<core::int*>* #t439 = <core::int*>[];
+    await for (core::int* i in stream)
+      #t439.{core::List::add}(i);
+  } =>#t439;
+  block {
+    final core::Set<core::int*>* #t440 = col::LinkedHashSet::•<core::int*>();
+    await for (core::int* i in stream)
+      #t440.{core::Set::add}(i);
+  } =>#t440;
+  block {
+    final core::Map<core::String*, core::int*>* #t441 = <core::String*, core::int*>{};
+    await for (core::int* i in stream)
+      #t441.{core::Map::[]=}("bar", i);
+  } =>#t441;
+}
+static method testPromotion(self::A* a) → dynamic {
+  core::List<core::int*>* list10 = block {
+    final core::List<core::int*>* #t442 = <core::int*>[];
+    if(a is self::B*)
+      #t442.{core::List::add}(a{self::B*}.{self::B::foo});
+  } =>#t442;
+  core::Set<core::int*>* set10 = block {
+    final core::Set<core::int*>* #t443 = col::LinkedHashSet::•<core::int*>();
+    if(a is self::B*)
+      #t443.{core::Set::add}(a{self::B*}.{self::B::foo});
+  } =>#t443;
+  core::Map<core::int*, core::int*>* map10 = block {
+    final core::Map<core::int*, core::int*>* #t444 = <core::int*, core::int*>{};
+    if(a is self::B*)
+      #t444.{core::Map::[]=}(a{self::B*}.{self::B::foo}, a{self::B*}.{self::B::foo});
+  } =>#t444;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect
new file mode 100644
index 0000000..4fe87a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/control_flow_collection_inference.dart.type_promotion.expect
@@ -0,0 +1,306 @@
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:123:49: Context: Write to i@7018
+  var list10 = [for (int i = 0; oracle("foo"); i++) 42];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:124:48: Context: Write to i@7018
+  var set10 = {for (int i = 0; oracle("foo"); i++) 42, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:125:48: Context: Write to i@7018
+  var map10 = {for (int i = 0; oracle("foo"); i++) "bar": 42, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:126:49: Context: Write to i@7018
+  var list11 = [for (int i = 0; oracle("foo"); i++) dynVar];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:127:48: Context: Write to i@7018
+  var set11 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:128:48: Context: Write to i@7018
+  var map11 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:129:49: Context: Write to i@7018
+  var list12 = [for (int i = 0; oracle("foo"); i++) [42]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:130:48: Context: Write to i@7018
+  var set12 = {for (int i = 0; oracle("foo"); i++) [42], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:131:48: Context: Write to i@7018
+  var map12 = {for (int i = 0; oracle("foo"); i++) "bar": [42], "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:132:49: Context: Write to i@7018
+  var list20 = [for (int i = 0; oracle("foo"); i++) ...[42]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:133:48: Context: Write to i@7018
+  var set20 = {for (int i = 0; oracle("foo"); i++) ...[42], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:134:48: Context: Write to i@7018
+  var map20 = {for (int i = 0; oracle("foo"); i++) ...{"bar": 42}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:135:49: Context: Write to i@7018
+  var list21 = [for (int i = 0; oracle("foo"); i++) ...[dynVar]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:136:48: Context: Write to i@7018
+  var set21 = {for (int i = 0; oracle("foo"); i++) ...[dynVar], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:137:48: Context: Write to i@7018
+  var map21 = {for (int i = 0; oracle("foo"); i++) ...{"bar": dynVar}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:138:49: Context: Write to i@7018
+  var list22 = [for (int i = 0; oracle("foo"); i++) ...[[42]]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:139:48: Context: Write to i@7018
+  var set22 = {for (int i = 0; oracle("foo"); i++) ...[[42]], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:140:48: Context: Write to i@7018
+  var map22 = {for (int i = 0; oracle("foo"); i++) ...{"bar": [42]}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:141:49: Context: Write to i@7018
+  var list30 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:142:48: Context: Write to i@7018
+  var set30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[42], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:143:48: Context: Write to i@7018
+  var map30 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": 42}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:144:49: Context: Write to i@7018
+  var list31 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:145:48: Context: Write to i@7018
+  var set31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[dynVar], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:146:48: Context: Write to i@7018
+  var map31 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": dynVar}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:147:49: Context: Write to i@7018
+  var list33 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]]];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:148:48: Context: Write to i@7018
+  var set33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[42]], null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:149:48: Context: Write to i@7018
+  var map33 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": [42]}, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:150:61: Context: Write to i@7018
+  List<List<int>> list40 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:151:59: Context: Write to i@7018
+  Set<List<int>> set40 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:152:67: Context: Write to i@7018
+  Map<String, List<int>> map40 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:153:61: Context: Write to i@7018
+  List<List<int>> list41 = [for (int i = 0; oracle("foo"); i++) ...{[]}];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:154:59: Context: Write to i@7018
+  Set<List<int>> set41 = {for (int i = 0; oracle("foo"); i++) ...{[]}, null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:155:61: Context: Write to i@7018
+  List<List<int>> list42 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:156:59: Context: Write to i@7018
+  Set<List<int>> set42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:157:67: Context: Write to i@7018
+  Map<String, List<int>> map42 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:158:55: Context: Write to i@7018
+  List<int> list50 = [for (int i = 0; oracle("foo"); i++) ...[]];
+                                                      ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:159:53: Context: Write to i@7018
+  Set<int> set50 = {for (int i = 0; oracle("foo"); i++) ...[], null};
+                                                    ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:160:61: Context: Write to i@7018
+  Map<String, int> map50 = {for (int i = 0; oracle("foo"); i++) ...{}, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:161:55: Context: Write to i@7018
+  List<int> list51 = [for (int i = 0; oracle("foo"); i++) ...{}];
+                                                      ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:162:53: Context: Write to i@7018
+  Set<int> set51 = {for (int i = 0; oracle("foo"); i++) ...{}, null};
+                                                    ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:163:55: Context: Write to i@7018
+  List<int> list52 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[]];
+                                                      ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:164:53: Context: Write to i@7018
+  Set<int> set52 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[], null};
+                                                    ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:165:61: Context: Write to i@7018
+  List<List<int>> list60 = [for (int i = 0; oracle("foo"); i++) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:166:59: Context: Write to i@7018
+  Set<List<int>> set60 = {for (int i = 0; oracle("foo"); i++) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:167:67: Context: Write to i@7018
+  Map<String, List<int>> map60 = {for (int i = 0; oracle("foo"); i++) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:168:61: Context: Write to i@7018
+  List<List<int>> list61 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]]];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:169:59: Context: Write to i@7018
+  Set<List<int>> set61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...[[]], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:170:67: Context: Write to i@7018
+  Map<String, List<int>> map61 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...{"bar": []}, "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:171:61: Context: Write to i@7018
+  List<List<int>> list70 = [for (int i = 0; oracle("foo"); i++) []];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:172:59: Context: Write to i@7018
+  Set<List<int>> set70 = {for (int i = 0; oracle("foo"); i++) [], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:173:67: Context: Write to i@7018
+  Map<String, List<int>> map70 = {for (int i = 0; oracle("foo"); i++) "bar": [], "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:174:61: Context: Write to i@7018
+  List<List<int>> list71 = [for (int i = 0; oracle("foo"); i++) if (oracle()) []];
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:175:59: Context: Write to i@7018
+  Set<List<int>> set71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) [], null};
+                                                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:176:67: Context: Write to i@7018
+  Map<String, List<int>> map71 = {for (int i = 0; oracle("foo"); i++) if (oracle()) "bar": [], "baz": null};
+                                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:177:49: Context: Write to i@7018
+  var list80 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:178:48: Context: Write to i@7018
+  var set80 = {for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else 3.14, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:179:48: Context: Write to i@7018
+  var map80 = {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:180:49: Context: Write to i@7018
+  var list81 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:181:48: Context: Write to i@7018
+  var set81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...listDouble, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:182:48: Context: Write to i@7018
+  var map81 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...mapStringDouble, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:183:49: Context: Write to i@7018
+  var list82 = [for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:184:48: Context: Write to i@7018
+  var set82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else ...dynVar, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:185:48: Context: Write to i@7018
+  var map82 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else ...dynVar, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:186:49: Context: Write to i@7018
+  var list83 = [for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...listDouble];
+                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:187:48: Context: Write to i@7018
+  var set83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...listInt else 3.14, null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:188:48: Context: Write to i@7018
+  var map83 = {for (int i = 0; oracle("foo"); i++) if (oracle()) ...mapStringInt else "bar": 3.14, "baz": null};
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:189:55: Context: Write to i@7018
+  List<int> list90 = [for (int i = 0; oracle("foo"); i++) dynVar];
+                                                      ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:190:53: Context: Write to i@7018
+  Set<int> set90 = {for (int i = 0; oracle("foo"); i++) dynVar, null};
+                                                    ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:191:61: Context: Write to i@7018
+  Map<String, int> map90 = {for (int i = 0; oracle("foo"); i++) "bar": dynVar, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:192:55: Context: Write to i@7018
+  List<int> list91 = [for (int i = 0; oracle("foo"); i++) ...dynVar];
+                                                      ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:193:53: Context: Write to i@7018
+  Set<int> set91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, null};
+                                                    ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:194:61: Context: Write to i@7018
+  Map<String, int> map91 = {for (int i = 0; oracle("foo"); i++) ...dynVar, "baz": null};
+                                                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:40: Context: Write to index@6916
+  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+                                       ^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:195:65: Context: Write to index@6916
+  List<int> list100 = <int>[for (index = 0; oracle("foo"); index++) 42];
+                                                                ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:38: Context: Write to index@6916
+  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+                                     ^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:196:63: Context: Write to index@6916
+  Set<int> set100 = <int>{for (index = 0; oracle("foo"); index++) 42};
+                                                              ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:54: Context: Write to index@6916
+  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+                                                     ^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:197:79: Context: Write to index@6916
+  Map<String, int> map100 = <String, int>{for (index = 0; oracle("foo"); index++) "bar": 42};
+                                                                              ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:204:48: Context: Write to i@7018
+  List<int> list130 = [for (var i = 1; i < 2; i++) i];
+                                               ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:205:46: Context: Write to i@7018
+  Set<int> set130 = {for (var i = 1; i < 2; i++) i};
+                                             ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:206:51: Context: Write to i@7018
+  Map<int, int> map130 = {for (var i = 1; i < 2; i++) i: i};
+                                                  ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:210:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) "bar"];
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:211:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) "bar", null};
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:212:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) "bar": "bar", "baz": null};
+                                             ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:213:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) ...["bar"]];
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:214:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) ...["bar"], null};
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:215:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...{"bar": "bar"}, "baz": null};
+                                             ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:216:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) ...map];
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:217:41: Context: Write to i@13789
+  <int>{for (int i = 0; oracle("foo"); i++) ...map, null};
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:218:46: Context: Write to i@13789
+  <int, int>{for (int i = 0; oracle("foo"); i++) ...list, 42: null};
+                                             ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:219:44: Context: Write to i@13789
+  <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:44: Context: Write to i@13789
+  <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:52: Context: Write to i@13789
+  <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:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) ...map else 42];
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:223:41: Context: Write to i@13789
+  <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:49: Context: Write to i@13789
+  <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:41: Context: Write to i@13789
+  <int>[for (int i = 0; oracle("foo"); i++) if (oracle()) 42 else ...map];
+                                        ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:226:41: Context: Write to i@13789
+  <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:49: Context: Write to i@13789
+  <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:267:29: Context: Possible promotion of a@16609
+  List<int> list10 = [if (a is B) a.foo];
+                            ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:268:27: Context: Possible promotion of a@16609
+  Set<int> set10 = {if (a is B) a.foo};
+                          ^^
+pkg/front_end/testcases/general/control_flow_collection_inference.dart:269:32: Context: Possible promotion of a@16609
+  Map<int, int> map10 = {if (a is B) a.foo: a.foo};
+                               ^^
diff --git a/pkg/front_end/testcases/covariant_generic.dart b/pkg/front_end/testcases/general/covariant_generic.dart
similarity index 100%
rename from pkg/front_end/testcases/covariant_generic.dart
rename to pkg/front_end/testcases/general/covariant_generic.dart
diff --git a/pkg/front_end/testcases/covariant_generic.dart.hierarchy.expect b/pkg/front_end/testcases/general/covariant_generic.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/covariant_generic.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/covariant_generic.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.legacy.expect b/pkg/front_end/testcases/general/covariant_generic.dart.legacy.expect
new file mode 100644
index 0000000..b72a615
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.legacy.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<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;
+  generic-covariant-impl 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(generic-covariant-impl self::Foo::T x) → void {}
+  set setter(generic-covariant-impl self::Foo::T x) → void {}
+  method withCallback((self::Foo::T) → void callback) → void {
+    callback.call(this.{self::Foo::finalField});
+  }
+}
+static method main() → dynamic {
+  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → dynamic {});
+  fooInt.method(3);
+  fooInt.setter = 3;
+  fooInt.withCallback((core::int x) → dynamic {});
+  fooInt.withCallback((core::num x) → dynamic {});
+  fooInt.mutableField = 3;
+  fooInt.mutableCallbackField = (core::int x) → dynamic {};
+  self::Foo<core::num> fooNum = fooInt;
+  fooNum.method(3);
+  fooNum.method(2.5);
+  fooNum.setter = 3;
+  fooNum.setter = 2.5;
+  fooNum.withCallback((core::num x) → dynamic {});
+  fooNum.mutableField = 3;
+  fooNum.mutableField = 2.5;
+  fooNum.mutableCallbackField(3);
+  fooNum.mutableCallbackField(2.5);
+  fooNum.mutableCallbackField = (core::num x) → dynamic {};
+}
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b72a615
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.legacy.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<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;
+  generic-covariant-impl 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(generic-covariant-impl self::Foo::T x) → void {}
+  set setter(generic-covariant-impl self::Foo::T x) → void {}
+  method withCallback((self::Foo::T) → void callback) → void {
+    callback.call(this.{self::Foo::finalField});
+  }
+}
+static method main() → dynamic {
+  self::Foo<core::int> fooInt = new self::Foo::•<core::int>(1, (core::int x) → dynamic {});
+  fooInt.method(3);
+  fooInt.setter = 3;
+  fooInt.withCallback((core::int x) → dynamic {});
+  fooInt.withCallback((core::num x) → dynamic {});
+  fooInt.mutableField = 3;
+  fooInt.mutableCallbackField = (core::int x) → dynamic {};
+  self::Foo<core::num> fooNum = fooInt;
+  fooNum.method(3);
+  fooNum.method(2.5);
+  fooNum.setter = 3;
+  fooNum.setter = 2.5;
+  fooNum.withCallback((core::num x) → dynamic {});
+  fooNum.mutableField = 3;
+  fooNum.mutableField = 2.5;
+  fooNum.mutableCallbackField(3);
+  fooNum.mutableCallbackField(2.5);
+  fooNum.mutableCallbackField = (core::num x) → dynamic {};
+}
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.outline.expect b/pkg/front_end/testcases/general/covariant_generic.dart.outline.expect
new file mode 100644
index 0000000..a516d86
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<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;
+  generic-covariant-impl field self::Foo::T* mutableField;
+  field (self::Foo::T*) →* void mutableCallbackField;
+  constructor •(self::Foo::T* finalField, (self::Foo::T*) →* void callbackField) → self::Foo<self::Foo::T*>*
+    ;
+  method method(generic-covariant-impl self::Foo::T* x) → void
+    ;
+  set setter(generic-covariant-impl self::Foo::T* x) → void
+    ;
+  method withCallback((self::Foo::T*) →* void callback) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
new file mode 100644
index 0000000..c7bba1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<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;
+  generic-covariant-impl 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(generic-covariant-impl self::Foo::T* x) → void {}
+  set setter(generic-covariant-impl self::Foo::T* x) → void {}
+  method withCallback((self::Foo::T*) →* void callback) → void {
+    callback.call(this.{self::Foo::finalField});
+  }
+}
+static method main() → dynamic {
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null* {});
+  fooInt.{self::Foo::method}(3);
+  fooInt.{self::Foo::setter} = 3;
+  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null* {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null* {});
+  fooInt.{self::Foo::mutableField} = 3;
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null* {};
+  self::Foo<core::num*>* fooNum = fooInt;
+  fooNum.{self::Foo::method}(3);
+  fooNum.{self::Foo::method}(2.5);
+  fooNum.{self::Foo::setter} = 3;
+  fooNum.{self::Foo::setter} = 2.5;
+  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null* {});
+  fooNum.{self::Foo::mutableField} = 3;
+  fooNum.{self::Foo::mutableField} = 2.5;
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num*) →* void).call(3);
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num*) →* void).call(2.5);
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null* {};
+}
diff --git a/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
new file mode 100644
index 0000000..c7bba1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_generic.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+typedef Callback<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;
+  generic-covariant-impl 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(generic-covariant-impl self::Foo::T* x) → void {}
+  set setter(generic-covariant-impl self::Foo::T* x) → void {}
+  method withCallback((self::Foo::T*) →* void callback) → void {
+    callback.call(this.{self::Foo::finalField});
+  }
+}
+static method main() → dynamic {
+  self::Foo<core::int*>* fooInt = new self::Foo::•<core::int*>(1, (core::int* x) → core::Null* {});
+  fooInt.{self::Foo::method}(3);
+  fooInt.{self::Foo::setter} = 3;
+  fooInt.{self::Foo::withCallback}((core::int* x) → core::Null* {});
+  fooInt.{self::Foo::withCallback}((core::num* x) → core::Null* {});
+  fooInt.{self::Foo::mutableField} = 3;
+  fooInt.{self::Foo::mutableCallbackField} = (core::int* x) → core::Null* {};
+  self::Foo<core::num*>* fooNum = fooInt;
+  fooNum.{self::Foo::method}(3);
+  fooNum.{self::Foo::method}(2.5);
+  fooNum.{self::Foo::setter} = 3;
+  fooNum.{self::Foo::setter} = 2.5;
+  fooNum.{self::Foo::withCallback}((core::num* x) → core::Null* {});
+  fooNum.{self::Foo::mutableField} = 3;
+  fooNum.{self::Foo::mutableField} = 2.5;
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num*) →* void).call(3);
+  (fooNum.{self::Foo::mutableCallbackField} as{TypeError} (core::num*) →* void).call(2.5);
+  fooNum.{self::Foo::mutableCallbackField} = (core::num* x) → core::Null* {};
+}
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart
similarity index 100%
rename from pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart
rename to pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart
diff --git a/pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.hierarchy.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/covariant_parameter_in_superclass_of_mixin_application.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect
new file mode 100644
index 0000000..08d745d
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.expect
@@ -0,0 +1,36 @@
+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 core::num* x) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+abstract class _D&A&B = self::A with self::B {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  forwarding-stub method foo(covariant core::num* x) → void
+    return super.{self::A::foo}(x);
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    : super self::_D&A&B::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect
new file mode 100644
index 0000000..24f8755
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+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 core::num* x) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+abstract class _D&A&B extends self::A implements self::B {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  method foo(covariant core::num* x) → void {}
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    : super self::_D&A&B::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect
new file mode 100644
index 0000000..d8dce84
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.outline.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method foo(covariant core::num* x) → void
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  method foo(core::num* x) → void
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method foo(core::num* x) → void
+    ;
+}
+abstract class _D&A&B = self::A with self::B {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  forwarding-stub method foo(covariant core::num* x) → void
+    return super.{self::A::foo}(x);
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method foo(covariant core::int* x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect
new file mode 100644
index 0000000..08d745d
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.expect
@@ -0,0 +1,36 @@
+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 core::num* x) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+abstract class _D&A&B = self::A with self::B {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  forwarding-stub method foo(covariant core::num* x) → void
+    return super.{self::A::foo}(x);
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    : super self::_D&A&B::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect
new file mode 100644
index 0000000..24f8755
--- /dev/null
+++ b/pkg/front_end/testcases/general/covariant_parameter_in_superclass_of_mixin_application.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+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 core::num* x) → void {}
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method foo(core::num* x) → void {}
+}
+abstract class _D&A&B extends self::A implements self::B {
+  synthetic constructor •() → self::_D&A&B*
+    : super self::A::•()
+    ;
+  method foo(covariant core::num* x) → void {}
+}
+class D extends self::_D&A&B implements self::C {
+  synthetic constructor •() → self::D*
+    : super self::_D&A&B::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/cycles.dart b/pkg/front_end/testcases/general/cycles.dart
similarity index 100%
rename from pkg/front_end/testcases/cycles.dart
rename to pkg/front_end/testcases/general/cycles.dart
diff --git a/pkg/front_end/testcases/cycles.dart.hierarchy.expect b/pkg/front_end/testcases/general/cycles.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/cycles.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/cycles.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/cycles.dart.legacy.expect b/pkg/front_end/testcases/general/cycles.dart.legacy.expect
new file mode 100644
index 0000000..5552472
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.legacy.expect
@@ -0,0 +1,45 @@
+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::•()
+    ;
+}
+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 extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+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/cycles.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/cycles.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5552472
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.legacy.transformed.expect
@@ -0,0 +1,45 @@
+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::•()
+    ;
+}
+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 extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+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/cycles.dart.outline.expect b/pkg/front_end/testcases/general/cycles.dart.outline.expect
new file mode 100644
index 0000000..e72a576
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.outline.expect
@@ -0,0 +1,37 @@
+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*
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/cycles.dart.strong.expect b/pkg/front_end/testcases/general/cycles.dart.strong.expect
new file mode 100644
index 0000000..5552472
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.strong.expect
@@ -0,0 +1,45 @@
+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::•()
+    ;
+}
+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 extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+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/cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/general/cycles.dart.strong.transformed.expect
new file mode 100644
index 0000000..5552472
--- /dev/null
+++ b/pkg/front_end/testcases/general/cycles.dart.strong.transformed.expect
@@ -0,0 +1,45 @@
+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::•()
+    ;
+}
+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 extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+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/default_values.dart b/pkg/front_end/testcases/general/default_values.dart
similarity index 100%
rename from pkg/front_end/testcases/default_values.dart
rename to pkg/front_end/testcases/general/default_values.dart
diff --git a/pkg/front_end/testcases/general/default_values.dart.legacy.expect b/pkg/front_end/testcases/general/default_values.dart.legacy.expect
new file mode 100644
index 0000000..7b8886e
--- /dev/null
+++ b/pkg/front_end/testcases/general/default_values.dart.legacy.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/default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/default_values.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7b8886e
--- /dev/null
+++ b/pkg/front_end/testcases/general/default_values.dart.legacy.transformed.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/default_values.dart.outline.expect b/pkg/front_end/testcases/general/default_values.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/default_values.dart.outline.expect
rename to pkg/front_end/testcases/general/default_values.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/default_values.dart.strong.expect b/pkg/front_end/testcases/general/default_values.dart.strong.expect
new file mode 100644
index 0000000..7b8886e
--- /dev/null
+++ b/pkg/front_end/testcases/general/default_values.dart.strong.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/default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general/default_values.dart.strong.transformed.expect
new file mode 100644
index 0000000..7b8886e
--- /dev/null
+++ b/pkg/front_end/testcases/general/default_values.dart.strong.transformed.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/deferred_lib.dart b/pkg/front_end/testcases/general/deferred_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/deferred_lib.dart
rename to pkg/front_end/testcases/general/deferred_lib.dart
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart b/pkg/front_end/testcases/general/deferred_type_annotation.dart
similarity index 100%
rename from pkg/front_end/testcases/deferred_type_annotation.dart
rename to pkg/front_end/testcases/general/deferred_type_annotation.dart
diff --git a/pkg/front_end/testcases/deferred_type_annotation.dart.hierarchy.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/deferred_type_annotation.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/deferred_type_annotation.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.expect
new file mode 100644
index 0000000..cef2edf
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/deferred_type_annotation.dart:7:5: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cef2edf
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/deferred_type_annotation.dart:7:5: Warning: 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;
+}
+static field dynamic x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
new file mode 100644
index 0000000..7640695
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.outline.expect
@@ -0,0 +1,25 @@
+library;
+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;
+  synthetic constructor •() → def::C*
+    ;
+  static method m() → core::int*
+    ;
+}
+static field dynamic x;
+static method m(dynamic x) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.expect
new file mode 100644
index 0000000..4079b46
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.expect
@@ -0,0 +1,33 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.transformed.expect
new file mode 100644
index 0000000..4079b46
--- /dev/null
+++ b/pkg/front_end/testcases/general/deferred_type_annotation.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+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;
+}
+static field core::int* x = 0;
+static method m(dynamic x) → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_bad_prefix.dart
rename to pkg/front_end/testcases/general/duplicated_bad_prefix.dart
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix.dart.hierarchy.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/duplicated_bad_prefix.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/duplicated_bad_prefix.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.expect
new file mode 100644
index 0000000..9f4a61e
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.expect
@@ -0,0 +1,67 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Warning: '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:13:3: Warning: '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::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9f4a61e
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.legacy.transformed.expect
@@ -0,0 +1,67 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Warning: '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:13:3: Warning: '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::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
new file mode 100644
index 0000000..bedeadd
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.outline.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Warning: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6:45: Warning: '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;
+//                                             ^
+//
+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*
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    ;
+}
+class C extends core::Object {
+  field invalid-type b;
+  field invalid-type d;
+  synthetic constructor •() → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self2::C*
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    ;
+}
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.expect
new file mode 100644
index 0000000..e78ff84
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.expect
@@ -0,0 +1,67 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6: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:13: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::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.transformed.expect
new file mode 100644
index 0000000..e78ff84
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_bad_prefix.dart.strong.transformed.expect
@@ -0,0 +1,67 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:10:7: Error: 'Dupe' is already declared in this scope.
+// class Dupe {}
+//       ^^^^
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:8:7: Context: Previous declaration of 'Dupe'.
+// class Dupe {}
+//       ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:13:3: Error: Type 'Dupe.a' not found.
+//   Dupe.a b;
+//   ^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_bad_prefix.dart:6: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:13: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::•()
+    ;
+}
+class Dupe extends core::Object {
+  synthetic constructor •() → self::Dupe*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field invalid-type b = null;
+  field invalid-type d = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self3::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart b/pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_bad_prefix_lib1.dart
rename to pkg/front_end/testcases/general/duplicated_bad_prefix_lib1.dart
diff --git a/pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart b/pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_bad_prefix_lib2.dart
rename to pkg/front_end/testcases/general/duplicated_bad_prefix_lib2.dart
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart b/pkg/front_end/testcases/general/duplicated_declarations.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_declarations.dart
rename to pkg/front_end/testcases/general/duplicated_declarations.dart
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.hierarchy.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/duplicated_declarations.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/duplicated_declarations.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.expect
new file mode 100644
index 0000000..6caf29c
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.expect
@@ -0,0 +1,569 @@
+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:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:75: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:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87: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:70: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:81: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:65:19: Warning: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// 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:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:66:16: Warning: 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:67:16: Warning: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105: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::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3*
+    : super core::Object::•()
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic 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;
+                ^";
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic 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:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#4*>* values = #C8;
+  static const field self::Enum#4* a = #C7;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#4*
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#3*>* values = #C16;
+  static const field self::Enum#3* a = #C9;
+  static const field self::Enum#3* b = #C12;
+  static const field self::Enum#3* c = #C15;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#3*
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#2*>* values = #C21;
+  static const field self::Enum#2* Enum = #C18;
+  static const field self::Enum#2* a = #C19;
+  static const field self::Enum#2* b = #C20;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#2*
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#1*>* values = #C25;
+  static const field self::Enum#1* a = #C22;
+  static const field self::Enum#1* b = #C23;
+  static const field self::Enum#1* c = #C24;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#1*
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum*>* values = #C29;
+  static const field self::Enum* Enum = #C26;
+  static const field self::Enum* a = #C27;
+  static const field self::Enum* b = #C28;
+  const constructor •(core::int* index, core::String* _name) → self::Enum*
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::AnotherEnum*>* values = #C36;
+  static const field self::AnotherEnum* a = #C31;
+  static const field self::AnotherEnum* b = #C33;
+  static const field self::AnotherEnum* c = #C35;
+  const constructor •(core::int* index, core::String* _name) → self::AnotherEnum*
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic 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();
+  ^".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();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String*, core::Object*>{"AnotherEnum.a": #C31, "AnotherEnum.b": #C33, "AnotherEnum.c": #C35, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
+
+library;
+import self as self2;
+
+
+constants  {
+  #C1 = #Object
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = 0
+  #C6 = "Enum.a"
+  #C7 = self::Enum#4 {index:#C5, _name:#C6}
+  #C8 = <self::Enum#4*>[#C7]
+  #C9 = self::Enum#3 {index:#C5, _name:#C6}
+  #C10 = 1
+  #C11 = "Enum.b"
+  #C12 = self::Enum#3 {index:#C10, _name:#C11}
+  #C13 = 2
+  #C14 = "Enum.c"
+  #C15 = self::Enum#3 {index:#C13, _name:#C14}
+  #C16 = <self::Enum#3*>[#C9, #C12, #C15]
+  #C17 = "Enum.Enum"
+  #C18 = self::Enum#2 {index:#C5, _name:#C17}
+  #C19 = self::Enum#2 {index:#C10, _name:#C6}
+  #C20 = self::Enum#2 {index:#C13, _name:#C11}
+  #C21 = <self::Enum#2*>[#C18, #C19, #C20]
+  #C22 = self::Enum#1 {index:#C5, _name:#C6}
+  #C23 = self::Enum#1 {index:#C10, _name:#C11}
+  #C24 = self::Enum#1 {index:#C13, _name:#C14}
+  #C25 = <self::Enum#1*>[#C22, #C23, #C24]
+  #C26 = self::Enum {index:#C5, _name:#C17}
+  #C27 = self::Enum {index:#C10, _name:#C6}
+  #C28 = self::Enum {index:#C13, _name:#C11}
+  #C29 = <self::Enum*>[#C26, #C27, #C28]
+  #C30 = "AnotherEnum.a"
+  #C31 = self::AnotherEnum {index:#C5, _name:#C30}
+  #C32 = "AnotherEnum.b"
+  #C33 = self::AnotherEnum {index:#C10, _name:#C32}
+  #C34 = "AnotherEnum.c"
+  #C35 = self::AnotherEnum {index:#C13, _name:#C34}
+  #C36 = <self::AnotherEnum*>[#C31, #C33, #C35]
+}
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6caf29c
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.legacy.transformed.expect
@@ -0,0 +1,569 @@
+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:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:75: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:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87: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:70: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:81: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:65:19: Warning: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// 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:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:66:16: Warning: 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:67:16: Warning: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105: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::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3*
+    : super core::Object::•()
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic 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;
+                ^";
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field dynamic 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:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  method m() → dynamic
+    return super.m();
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#4*>* values = #C8;
+  static const field self::Enum#4* a = #C7;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#4*
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#3*>* values = #C16;
+  static const field self::Enum#3* a = #C9;
+  static const field self::Enum#3* b = #C12;
+  static const field self::Enum#3* c = #C15;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#3*
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#2*>* values = #C21;
+  static const field self::Enum#2* Enum = #C18;
+  static const field self::Enum#2* a = #C19;
+  static const field self::Enum#2* b = #C20;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#2*
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#1*>* values = #C25;
+  static const field self::Enum#1* a = #C22;
+  static const field self::Enum#1* b = #C23;
+  static const field self::Enum#1* c = #C24;
+  const constructor •(core::int* index, core::String* _name) → self::Enum#1*
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum*>* values = #C29;
+  static const field self::Enum* Enum = #C26;
+  static const field self::Enum* a = #C27;
+  static const field self::Enum* b = #C28;
+  const constructor •(core::int* index, core::String* _name) → self::Enum*
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::AnotherEnum*>* values = #C36;
+  static const field self::AnotherEnum* a = #C31;
+  static const field self::AnotherEnum* b = #C33;
+  static const field self::AnotherEnum* c = #C35;
+  const constructor •(core::int* index, core::String* _name) → self::AnotherEnum*
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic 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();
+  ^".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();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String*, core::Object*>{"AnotherEnum.a": #C31, "AnotherEnum.b": #C33, "AnotherEnum.c": #C35, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105:39: Error: Can't use 'values' because it is declared more than once.
+    \"AnotherEnum.values\": AnotherEnum.values,
+                                      ^^^^^^"};
+}
+
+library;
+import self as self2;
+
+
+constants  {
+  #C1 = #Object
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = 0
+  #C6 = "Enum.a"
+  #C7 = self::Enum#4 {index:#C5, _name:#C6}
+  #C8 = <self::Enum#4*>[#C7]
+  #C9 = self::Enum#3 {index:#C5, _name:#C6}
+  #C10 = 1
+  #C11 = "Enum.b"
+  #C12 = self::Enum#3 {index:#C10, _name:#C11}
+  #C13 = 2
+  #C14 = "Enum.c"
+  #C15 = self::Enum#3 {index:#C13, _name:#C14}
+  #C16 = <self::Enum#3*>[#C9, #C12, #C15]
+  #C17 = "Enum.Enum"
+  #C18 = self::Enum#2 {index:#C5, _name:#C17}
+  #C19 = self::Enum#2 {index:#C10, _name:#C6}
+  #C20 = self::Enum#2 {index:#C13, _name:#C11}
+  #C21 = <self::Enum#2*>[#C18, #C19, #C20]
+  #C22 = self::Enum#1 {index:#C5, _name:#C6}
+  #C23 = self::Enum#1 {index:#C10, _name:#C11}
+  #C24 = self::Enum#1 {index:#C13, _name:#C14}
+  #C25 = <self::Enum#1*>[#C22, #C23, #C24]
+  #C26 = self::Enum {index:#C5, _name:#C17}
+  #C27 = self::Enum {index:#C10, _name:#C6}
+  #C28 = self::Enum {index:#C13, _name:#C11}
+  #C29 = <self::Enum*>[#C26, #C27, #C28]
+  #C30 = "AnotherEnum.a"
+  #C31 = self::AnotherEnum {index:#C5, _name:#C30}
+  #C32 = "AnotherEnum.b"
+  #C33 = self::AnotherEnum {index:#C10, _name:#C32}
+  #C34 = "AnotherEnum.c"
+  #C35 = self::AnotherEnum {index:#C13, _name:#C34}
+  #C36 = <self::AnotherEnum*>[#C31, #C33, #C35]
+}
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
new file mode 100644
index 0000000..6764ff8
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.outline.expect
@@ -0,0 +1,451 @@
+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:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:75: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:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87: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:70: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:81: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:65:19: Warning: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+//
+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*
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3*
+    ;
+}
+class C#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  field dynamic field;
+  constructor •(dynamic a) → self::C#2*
+    ;
+  method m() → dynamic
+    ;
+  static method s() → dynamic
+    ;
+  static method f() → dynamic
+    ;
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1*
+    ;
+}
+class C extends core::Object {
+  field dynamic field;
+  constructor •(dynamic a) → self::C*
+    ;
+  method m() → dynamic
+    ;
+  static method s() → dynamic
+    ;
+  static method f() → dynamic
+    ;
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub*
+    ;
+  method m() → dynamic
+    ;
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#4*>* values = const <self::Enum#4*>[self::Enum#4::a];
+  static const field self::Enum#4* a = const self::Enum#4::•(0, "Enum.a");
+  const constructor •(core::int* index, core::String* _name) → self::Enum#4*
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#3*>* values = const <self::Enum#3*>[self::Enum#3::a, self::Enum#3::b, self::Enum#3::c];
+  static const field self::Enum#3* a = const self::Enum#3::•(0, "Enum.a");
+  static const field self::Enum#3* b = const self::Enum#3::•(1, "Enum.b");
+  static const field self::Enum#3* c = const self::Enum#3::•(2, "Enum.c");
+  const constructor •(core::int* index, core::String* _name) → self::Enum#3*
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#2*>* values = const <self::Enum#2*>[self::Enum#2::Enum, self::Enum#2::a, self::Enum#2::b];
+  static const field self::Enum#2* Enum = const self::Enum#2::•(0, "Enum.Enum");
+  static const field self::Enum#2* a = const self::Enum#2::•(1, "Enum.a");
+  static const field self::Enum#2* b = const self::Enum#2::•(2, "Enum.b");
+  const constructor •(core::int* index, core::String* _name) → self::Enum#2*
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum#1*>* values = const <self::Enum#1*>[self::Enum#1::a, self::Enum#1::b, self::Enum#1::c];
+  static const field self::Enum#1* a = const self::Enum#1::•(0, "Enum.a");
+  static const field self::Enum#1* b = const self::Enum#1::•(1, "Enum.b");
+  static const field self::Enum#1* c = const self::Enum#1::•(2, "Enum.c");
+  const constructor •(core::int* index, core::String* _name) → self::Enum#1*
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Enum*>* values = const <self::Enum*>[self::Enum::Enum, self::Enum::a, self::Enum::b];
+  static const field self::Enum* Enum = const self::Enum::•(0, "Enum.Enum");
+  static const field self::Enum* a = const self::Enum::•(1, "Enum.a");
+  static const field self::Enum* b = const self::Enum::•(2, "Enum.b");
+  const constructor •(core::int* index, core::String* _name) → self::Enum*
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::AnotherEnum*>* values = const <self::AnotherEnum*>[self::AnotherEnum::a, self::AnotherEnum::b, self::AnotherEnum::c];
+  static const field self::AnotherEnum* a = const self::AnotherEnum::•(0, "AnotherEnum.a");
+  static const field self::AnotherEnum* b = const self::AnotherEnum::•(1, "AnotherEnum.b");
+  static const field self::AnotherEnum* c = const self::AnotherEnum::•(2, "AnotherEnum.c");
+  const constructor •(core::int* index, core::String* _name) → self::AnotherEnum*
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::AnotherEnum::_name};
+}
+static field dynamic field;
+static method main() → dynamic
+  ;
+static method foo() → dynamic
+  ;
+static method useAnotherEnum() → dynamic
+  ;
+
+library;
+import self as self2;
diff --git a/pkg/front_end/testcases/general/duplicated_declarations.dart.strong.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.strong.expect
new file mode 100644
index 0000000..1248ef1
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_declarations.dart.strong.expect
@@ -0,0 +1,568 @@
+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:41:3: Error: 'C' is already declared in this scope.
+//   C(a, b);
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:40:3: Context: Previous declaration of 'C'.
+//   C(a);
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:44:7: Error: 'field' is already declared in this scope.
+//   var field = "2nd";
+//       ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:42:7: Context: Previous declaration of 'field'.
+//   var field = "1st";
+//       ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:50:3: Error: 'm' is already declared in this scope.
+//   m() {
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:46:3: Context: Previous declaration of 'm'.
+//   m() {
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:58:10: Error: 's' is already declared in this scope.
+//   static s() {
+//          ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:54:10: Context: Previous declaration of 's'.
+//   static s() {
+//          ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:70:7: Error: 'C' is already declared in this scope.
+// class C {
+//       ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:39:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:75: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:77:3: Error: 'a' is already declared in this scope.
+//   a,
+//   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:76:3: Context: Previous declaration of 'a'.
+//   a,
+//   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:81:6: Error: 'Enum' is already declared in this scope.
+// enum Enum {
+//      ^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:74:6: Context: Previous declaration of 'Enum'.
+// enum Enum {
+//      ^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:91:3: Error: '_name' is already declared in this scope.
+//   _name,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of '_name' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:92:3: Error: 'index' is already declared in this scope.
+//   index,
+//   ^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'index' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:93:3: Error: 'toString' is already declared in this scope.
+//   toString,
+//   ^^^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87:6: Context: Previous declaration of 'toString' is implied by this definition.
+// enum AnotherEnum {
+//      ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:94:3: Error: 'values' is already declared in this scope.
+//   values,
+//   ^^^^^^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:87: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:70: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:81: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:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Context: This isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:65:19: Error: 'C' isn't a type.
+// class Sub extends C {
+//                   ^
+//
+// 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:62:17: Error: Can't use 's' because it is declared more than once.
+//   static f() => s;
+//                 ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:66: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:67:16: Error: Superclass has no method named 'm'.
+//   m() => super.m();
+//                ^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+//     "AnotherEnum._name": AnotherEnum._name,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+//     "AnotherEnum.index": AnotherEnum.index,
+//                                      ^^^^^
+//
+// pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105: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::•()
+    ;
+}
+class C#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  constructor _() → self::C#3*
+    : super core::Object::•()
+    ;
+}
+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;
+                ^";
+}
+class C#1 extends core::Object {
+  constructor _() → self::C#1*
+    : super core::Object::•()
+    ;
+}
+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:62:17: Error: Can't use 's' because it is declared more than once.
+  static f() => s;
+                ^";
+}
+class Sub extends core::Object {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:66: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();
+}
+class Enum#4 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Enum#4::index = index, self::Enum#4::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#4::_name};
+}
+class Enum#3 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Enum#3::index = index, self::Enum#3::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#3::_name};
+}
+class Enum#2 extends core::Object { // from org-dartlang-testcase:///duplicated_declarations_part.dart
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Enum#2::index = index, self::Enum#2::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#2::_name};
+}
+class Enum#1 extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Enum#1::index = index, self::Enum#1::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum#1::_name};
+}
+class Enum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::Enum::index = index, self::Enum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::Enum::_name};
+}
+class AnotherEnum extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::AnotherEnum*>* values = #C32;
+  static const field self::AnotherEnum* a = #C27;
+  static const field self::AnotherEnum* b = #C29;
+  static const field self::AnotherEnum* c = #C31;
+  const constructor •(core::int* index, core::String* _name) → self::AnotherEnum*
+    : self::AnotherEnum::index = index, self::AnotherEnum::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::AnotherEnum::_name};
+}
+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();
+  ^".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();
+  ^".s();
+}
+static method useAnotherEnum() → dynamic {
+  <core::String*, core::Object*>{"AnotherEnum.a": #C27, "AnotherEnum.b": #C29, "AnotherEnum.c": #C31, "AnotherEnum._name": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:102:38: Error: Can't use '_name' because it is declared more than once.
+    \"AnotherEnum._name\": AnotherEnum._name,
+                                     ^^^^^", "AnotherEnum.index": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:103:38: Error: Can't use 'index' because it is declared more than once.
+    \"AnotherEnum.index\": AnotherEnum.index,
+                                     ^^^^^", "AnotherEnum.toString": invalid-expression "pkg/front_end/testcases/general/duplicated_declarations.dart:104: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:105: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 = "Enum.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 = "Enum.b"
+  #C8 = self::Enum#3 {index:#C6, _name:#C7}
+  #C9 = 2
+  #C10 = "Enum.c"
+  #C11 = self::Enum#3 {index:#C9, _name:#C10}
+  #C12 = <self::Enum#3*>[#C5, #C8, #C11]
+  #C13 = "Enum.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 = "AnotherEnum.a"
+  #C27 = self::AnotherEnum {index:#C1, _name:#C26}
+  #C28 = "AnotherEnum.b"
+  #C29 = self::AnotherEnum {index:#C6, _name:#C28}
+  #C30 = "AnotherEnum.c"
+  #C31 = self::AnotherEnum {index:#C9, _name:#C30}
+  #C32 = <self::AnotherEnum*>[#C27, #C29, #C31]
+}
diff --git a/pkg/front_end/testcases/duplicated_declarations.dart.strong.transformed.expect b/pkg/front_end/testcases/general/duplicated_declarations.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/duplicated_declarations.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/duplicated_declarations.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/duplicated_declarations_lib.dart b/pkg/front_end/testcases/general/duplicated_declarations_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_declarations_lib.dart
rename to pkg/front_end/testcases/general/duplicated_declarations_lib.dart
diff --git a/pkg/front_end/testcases/duplicated_declarations_part.dart b/pkg/front_end/testcases/general/duplicated_declarations_part.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_declarations_part.dart
rename to pkg/front_end/testcases/general/duplicated_declarations_part.dart
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart b/pkg/front_end/testcases/general/duplicated_field_initializer.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_field_initializer.dart
rename to pkg/front_end/testcases/general/duplicated_field_initializer.dart
diff --git a/pkg/front_end/testcases/duplicated_field_initializer.dart.hierarchy.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/duplicated_field_initializer.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/duplicated_field_initializer.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.expect
new file mode 100644
index 0000000..bf73ccb
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.expect
@@ -0,0 +1,29 @@
+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 •(dynamic 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);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.transformed.expect
new file mode 100644
index 0000000..bf73ccb
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+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 •(dynamic 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);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
new file mode 100644
index 0000000..8e9604a
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.outline.expect
@@ -0,0 +1,21 @@
+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;
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a;
+  constructor •(dynamic a) → self::A*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect
new file mode 100644
index 0000000..5b798a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.expect
@@ -0,0 +1,29 @@
+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);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect
new file mode 100644
index 0000000..5b798a1
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_field_initializer.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+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);
+         ^", super core::Object::•()
+    ;
+}
+static method main() → void {
+  new self::A::•(1);
+}
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart b/pkg/front_end/testcases/general/duplicated_named_args_3.dart
similarity index 100%
rename from pkg/front_end/testcases/duplicated_named_args_3.dart
rename to pkg/front_end/testcases/general/duplicated_named_args_3.dart
diff --git a/pkg/front_end/testcases/duplicated_named_args_3.dart.hierarchy.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/duplicated_named_args_3.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/duplicated_named_args_3.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.expect
new file mode 100644
index 0000000..e2459a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.expect
@@ -0,0 +1,18 @@
+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 m({core::int* a = #C1}) → dynamic {}
+}
+static method test() → void {
+  self::C::m(a: 1, a: 2, a: 3);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e2459a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.legacy.transformed.expect
@@ -0,0 +1,18 @@
+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 m({core::int* a = #C1}) → dynamic {}
+}
+static method test() → void {
+  self::C::m(a: 1, a: 2, a: 3);
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.outline.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.outline.expect
new file mode 100644
index 0000000..e03d03a5
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.outline.expect
@@ -0,0 +1,14 @@
+library test;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method m({core::int* a}) → dynamic
+    ;
+}
+static method test() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.expect
new file mode 100644
index 0000000..301e301
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.expect
@@ -0,0 +1,31 @@
+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 {}
+}
+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);
+                  ^");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.transformed.expect b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.transformed.expect
new file mode 100644
index 0000000..301e301
--- /dev/null
+++ b/pkg/front_end/testcases/general/duplicated_named_args_3.dart.strong.transformed.expect
@@ -0,0 +1,31 @@
+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 {}
+}
+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);
+                  ^");
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+}
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart b/pkg/front_end/testcases/general/dynamic_and_void.dart
similarity index 100%
rename from pkg/front_end/testcases/dynamic_and_void.dart
rename to pkg/front_end/testcases/general/dynamic_and_void.dart
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.expect
new file mode 100644
index 0000000..fb26a44
--- /dev/null
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
+// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
+//                           ^^^^^^^
+//
+import self as self;
+
+import "dart:core";
+
+static method testDynamic() → invalid-type
+  return 0;
+static method testVoid() → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fb26a44
--- /dev/null
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.legacy.transformed.expect
@@ -0,0 +1,16 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
+// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
+//                           ^^^^^^^
+//
+import self as self;
+
+import "dart:core";
+
+static method testDynamic() → invalid-type
+  return 0;
+static method testVoid() → void {}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
new file mode 100644
index 0000000..4327762
--- /dev/null
+++ b/pkg/front_end/testcases/general/dynamic_and_void.dart.outline.expect
@@ -0,0 +1,18 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/dynamic_and_void.dart:10:27: Warning: Type 'dynamic' not found.
+// /*@warning=TypeNotFound*/ dynamic testDynamic() => 0;
+//                           ^^^^^^^
+//
+import self as self;
+
+import "dart:core";
+
+static method testDynamic() → invalid-type
+  ;
+static method testVoid() → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/dynamic_and_void.dart.strong.expect b/pkg/front_end/testcases/general/dynamic_and_void.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/dynamic_and_void.dart.strong.expect
rename to pkg/front_end/testcases/general/dynamic_and_void.dart.strong.expect
diff --git a/pkg/front_end/testcases/escape.dart b/pkg/front_end/testcases/general/escape.dart
similarity index 100%
rename from pkg/front_end/testcases/escape.dart
rename to pkg/front_end/testcases/general/escape.dart
diff --git a/pkg/front_end/testcases/escape.dart.hierarchy.expect b/pkg/front_end/testcases/general/escape.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/escape.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/escape.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/escape.dart.legacy.expect b/pkg/front_end/testcases/general/escape.dart.legacy.expect
new file mode 100644
index 0000000..9e46580
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.legacy.expect
@@ -0,0 +1,50 @@
+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::•()
+    ;
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool*
+    return false;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+static method useAsA(self::A* object) → void {
+  dynamic _ = object.field;
+}
+static method useAsB(self::B* object) → void {
+  dynamic _ = object.field;
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x.==(null) ? x = "" : null;
+  x.==(null) ? x = 45 : null;
+  if(!(x is core::int*) && !(x is core::String*)) {
+    x.field = 45;
+  }
+}
+static method main() → dynamic {
+  dynamic 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/escape.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/escape.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9e46580
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.legacy.transformed.expect
@@ -0,0 +1,50 @@
+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::•()
+    ;
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool*
+    return false;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+static method useAsA(self::A* object) → void {
+  dynamic _ = object.field;
+}
+static method useAsB(self::B* object) → void {
+  dynamic _ = object.field;
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x.==(null) ? x = "" : null;
+  x.==(null) ? x = 45 : null;
+  if(!(x is core::int*) && !(x is core::String*)) {
+    x.field = 45;
+  }
+}
+static method main() → dynamic {
+  dynamic 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/escape.dart.outline.expect b/pkg/front_end/testcases/general/escape.dart.outline.expect
new file mode 100644
index 0000000..e198e42
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.outline.expect
@@ -0,0 +1,33 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field dynamic field;
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  field dynamic field;
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  operator ==(dynamic x) → core::bool*
+    ;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field;
+  synthetic constructor •() → self::X*
+    ;
+}
+static method useAsA(self::A* object) → void
+  ;
+static method useAsB(self::B* object) → void
+  ;
+static method escape(dynamic x) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/escape.dart.strong.expect b/pkg/front_end/testcases/general/escape.dart.strong.expect
new file mode 100644
index 0000000..9a86227
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.strong.expect
@@ -0,0 +1,50 @@
+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::•()
+    ;
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool*
+    return false;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+static method useAsA(self::A* object) → void {
+  dynamic _ = object.{self::A::field};
+}
+static method useAsB(self::B* object) → void {
+  dynamic _ = object.{self::B::field};
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
+  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
+  if(!(x is core::int*) && !(x is core::String*)) {
+    x.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/escape.dart.strong.transformed.expect b/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect
new file mode 100644
index 0000000..9a86227
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.strong.transformed.expect
@@ -0,0 +1,50 @@
+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::•()
+    ;
+}
+class B extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic x) → core::bool*
+    return false;
+}
+class X extends core::Object implements self::A, self::B {
+  field dynamic field = null;
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+static method useAsA(self::A* object) → void {
+  dynamic _ = object.{self::A::field};
+}
+static method useAsB(self::B* object) → void {
+  dynamic _ = object.{self::B::field};
+  self::escape(object);
+}
+static method escape(dynamic x) → void {
+  x.{core::Object::==}(null) ?{dynamic} x = "" : null;
+  x.{core::Object::==}(null) ?{dynamic} x = 45 : null;
+  if(!(x is core::int*) && !(x is core::String*)) {
+    x.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/escape.dart.type_promotion.expect b/pkg/front_end/testcases/general/escape.dart.type_promotion.expect
new file mode 100644
index 0000000..4360f9c
--- /dev/null
+++ b/pkg/front_end/testcases/general/escape.dart.type_promotion.expect
@@ -0,0 +1,6 @@
+pkg/front_end/testcases/general/escape.dart:31:5: Context: Write to x@483
+  x ??= "";
+    ^^^
+pkg/front_end/testcases/general/escape.dart:32:5: Context: Write to x@483
+  x ??= 45;
+    ^^^
diff --git a/pkg/front_end/testcases/export_main.dart b/pkg/front_end/testcases/general/export_main.dart
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart
rename to pkg/front_end/testcases/general/export_main.dart
diff --git a/pkg/front_end/testcases/export_main.dart.legacy.expect b/pkg/front_end/testcases/general/export_main.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.legacy.expect
rename to pkg/front_end/testcases/general/export_main.dart.legacy.expect
diff --git a/pkg/front_end/testcases/export_main.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/export_main.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/export_main.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/export_main.dart.outline.expect b/pkg/front_end/testcases/general/export_main.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.outline.expect
rename to pkg/front_end/testcases/general/export_main.dart.outline.expect
diff --git a/pkg/front_end/testcases/export_main.dart.strong.expect b/pkg/front_end/testcases/general/export_main.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.strong.expect
rename to pkg/front_end/testcases/general/export_main.dart.strong.expect
diff --git a/pkg/front_end/testcases/export_main.dart.strong.transformed.expect b/pkg/front_end/testcases/general/export_main.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/export_main.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/export_main.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/export_test.dart b/pkg/front_end/testcases/general/export_test.dart
similarity index 100%
rename from pkg/front_end/testcases/export_test.dart
rename to pkg/front_end/testcases/general/export_test.dart
diff --git a/pkg/front_end/testcases/general/export_test.dart.legacy.expect b/pkg/front_end/testcases/general/export_test.dart.legacy.expect
new file mode 100644
index 0000000..96ce0dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_test.dart.legacy.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:developer" as dev;
+additionalExports = (core::print)
+
+
+import "dart:profiler";
+export "dart:core";
+
+static method main() → dynamic {
+  core::print(dev::UserTag*);
+}
diff --git a/pkg/front_end/testcases/general/export_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/export_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..96ce0dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_test.dart.legacy.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:developer" as dev;
+additionalExports = (core::print)
+
+
+import "dart:profiler";
+export "dart:core";
+
+static method main() → dynamic {
+  core::print(dev::UserTag*);
+}
diff --git a/pkg/front_end/testcases/export_test.dart.outline.expect b/pkg/front_end/testcases/general/export_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/export_test.dart.outline.expect
rename to pkg/front_end/testcases/general/export_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/export_test.dart.strong.expect b/pkg/front_end/testcases/general/export_test.dart.strong.expect
new file mode 100644
index 0000000..96ce0dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_test.dart.strong.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:developer" as dev;
+additionalExports = (core::print)
+
+
+import "dart:profiler";
+export "dart:core";
+
+static method main() → dynamic {
+  core::print(dev::UserTag*);
+}
diff --git a/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..96ce0dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/export_test.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:developer" as dev;
+additionalExports = (core::print)
+
+
+import "dart:profiler";
+export "dart:core";
+
+static method main() → dynamic {
+  core::print(dev::UserTag*);
+}
diff --git a/pkg/front_end/testcases/expressions.dart b/pkg/front_end/testcases/general/expressions.dart
similarity index 100%
rename from pkg/front_end/testcases/expressions.dart
rename to pkg/front_end/testcases/general/expressions.dart
diff --git a/pkg/front_end/testcases/general/expressions.dart.legacy.expect b/pkg/front_end/testcases/general/expressions.dart.legacy.expect
new file mode 100644
index 0000000..fce57ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.legacy.expect
@@ -0,0 +1,95 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/expressions.dart:74:16: Warning: 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.call();
+}
+static method main() → dynamic {
+  core::int* i = 0;
+  core::print(i.==(1) ? "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; ) {
+  }
+  dynamic list = <dynamic>["Hello, World!"];
+  core::print(list.[](i));
+  list.[]=(i, "Hello, Brave New World!");
+  core::print(list.[](i));
+  i = 87;
+  core::print(i.unary-());
+  core::print(i.~());
+  core::print(!i.==(42));
+  core::print(i = i.-(1));
+  core::print(i = i.+(1));
+  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
+  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(#C2);
+  core::print(core::List::•<core::String*>(2).runtimeType);
+  self::foo(fisk: "Blorp gulp");
+  function f() → dynamic {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → dynamic {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = #C1]) → dynamic {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = #C1]) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = #C1}) → dynamic {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = #C1}) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int*.toString());
+  core::print(core::int*);
+  core::print(let final dynamic #t5 = core::int* in let final dynamic #t6 = #t5.toString() in #t5);
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 32, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    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 = #int.toString
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+}
diff --git a/pkg/front_end/testcases/general/expressions.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.legacy.transformed.expect
new file mode 100644
index 0000000..eba96bc
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.legacy.transformed.expect
@@ -0,0 +1,95 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/expressions.dart:74:16: Warning: 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.call();
+}
+static method main() → dynamic {
+  core::int* i = 0;
+  core::print(i.==(1) ? "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; ) {
+  }
+  dynamic list = <dynamic>["Hello, World!"];
+  core::print(list.[](i));
+  list.[]=(i, "Hello, Brave New World!");
+  core::print(list.[](i));
+  i = 87;
+  core::print(i.unary-());
+  core::print(i.~());
+  core::print(!i.==(42));
+  core::print(i = i.-(1));
+  core::print(i = i.+(1));
+  core::print(let final dynamic #t1 = i in let final dynamic #t2 = i = #t1.-(1) in #t1);
+  core::print(let final dynamic #t3 = i in let final dynamic #t4 = i = #t3.+(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(#C2);
+  core::print(core::_List::•<core::String*>(2).runtimeType);
+  self::foo(fisk: "Blorp gulp");
+  function f() → dynamic {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → dynamic {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = #C1]) → dynamic {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = #C1]) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = #C1}) → dynamic {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = #C1}) → dynamic {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int*.toString());
+  core::print(core::int*);
+  core::print(let final dynamic #t5 = core::int* in let final dynamic #t6 = #t5.toString() in #t5);
+  try {
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 32, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    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 = #int.toString
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+}
diff --git a/pkg/front_end/testcases/expressions.dart.outline.expect b/pkg/front_end/testcases/general/expressions.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/expressions.dart.outline.expect
rename to pkg/front_end/testcases/general/expressions.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.expect b/pkg/front_end/testcases/general/expressions.dart.strong.expect
new file mode 100644
index 0000000..bc4e719
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.expect
@@ -0,0 +1,93 @@
+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.call();
+}
+static method main() → dynamic {
+  core::int* i = 0;
+  core::print(i.{core::num::==}(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.{core::Object::==}(null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  core::List<core::String*>* list = <core::String*>["Hello, World!"];
+  core::print(list.{core::List::[]}(i));
+  list.{core::List::[]=}(i, "Hello, Brave New World!");
+  core::print(list.{core::List::[]}(i));
+  i = 87;
+  core::print(i.{core::int::unary-}());
+  core::print(i.{core::int::~}());
+  core::print(!i.{core::num::==}(42));
+  core::print(i = i.{core::num::-}(1));
+  core::print(i = i.{core::num::+}(1));
+  core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::-}(1) in #t1);
+  core::print(let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(#C2);
+  core::print(core::List::•<core::String*>(2).{core::Object::runtimeType});
+  self::foo(fisk: "Blorp gulp");
+  function f() → core::Null* {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → core::Null* {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = #C1]) → core::Null* {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = #C1]) → core::Null* {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = #C1}) → core::Null* {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = #C1}) → core::Null* {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*);
+  core::print(let final core::Type* #t5 = core::int* in let final dynamic #t6 = #t5.{core::Object::toString}() in #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 {}
+}
diff --git a/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
new file mode 100644
index 0000000..741dfc4
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.strong.transformed.expect
@@ -0,0 +1,93 @@
+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.call();
+}
+static method main() → dynamic {
+  core::int* i = 0;
+  core::print(i.{core::num::==}(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.{core::Object::==}(null))
+      core::print(s);
+  }
+  for (; false; ) {
+  }
+  core::List<core::String*>* list = <core::String*>["Hello, World!"];
+  core::print(list.{core::List::[]}(i));
+  list.{core::List::[]=}(i, "Hello, Brave New World!");
+  core::print(list.{core::List::[]}(i));
+  i = 87;
+  core::print(i.{core::int::unary-}());
+  core::print(i.{core::int::~}());
+  core::print(!i.{core::num::==}(42));
+  core::print(i = i.{core::num::-}(1));
+  core::print(i = i.{core::num::+}(1));
+  core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::-}(1) in #t1);
+  core::print(let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1) in #t3);
+  core::print(new core::Object::•());
+  core::print(#C2);
+  core::print(core::_List::•<core::String*>(2).{core::Object::runtimeType});
+  self::foo(fisk: "Blorp gulp");
+  function f() → core::Null* {
+    core::print("f was called");
+  }
+  self::caller(f);
+  self::caller(() → core::Null* {
+    core::print("<anon> was called");
+  });
+  function g([dynamic message = #C1]) → core::Null* {
+    core::print(message);
+  }
+  g.call("Hello, World");
+  self::caller(([dynamic x = #C1]) → core::Null* {
+    core::print("<anon> was called with ${x}");
+  });
+  function h({dynamic message = #C1}) → core::Null* {
+    core::print(message);
+  }
+  h.call(message: "Hello, World");
+  self::caller(({dynamic x = #C1}) → core::Null* {
+    core::print("<anon> was called with ${x}");
+  });
+  core::print(core::int*.{core::Object::toString}());
+  core::print(core::int*);
+  core::print(let final core::Type* #t5 = core::int* in let final core::String* #t6 = #t5.{core::Object::toString}() in #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 {}
+}
diff --git a/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect b/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect
new file mode 100644
index 0000000..765bde0
--- /dev/null
+++ b/pkg/front_end/testcases/general/expressions.dart.type_promotion.expect
@@ -0,0 +1,15 @@
+pkg/front_end/testcases/general/expressions.dart:34:5: Context: Write to i@286
+  i = 87;
+    ^
+pkg/front_end/testcases/general/expressions.dart:38:9: Context: Write to i@286
+  print(--i);
+        ^^
+pkg/front_end/testcases/general/expressions.dart:39:9: Context: Write to i@286
+  print(++i);
+        ^^
+pkg/front_end/testcases/general/expressions.dart:40:10: Context: Write to i@286
+  print(i--);
+         ^^
+pkg/front_end/testcases/general/expressions.dart:41:10: Context: Write to i@286
+  print(i++);
+         ^^
diff --git a/pkg/front_end/testcases/extension_methods.dart b/pkg/front_end/testcases/general/extension_methods.dart
similarity index 100%
rename from pkg/front_end/testcases/extension_methods.dart
rename to pkg/front_end/testcases/general/extension_methods.dart
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.hierarchy.expect b/pkg/front_end/testcases/general/extension_methods.dart.hierarchy.expect
new file mode 100644
index 0000000..70bc80b
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.hierarchy.expect
@@ -0,0 +1,387 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+C:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+    C.one
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.legacy.expect b/pkg/front_end/testcases/general/extension_methods.dart.legacy.expect
new file mode 100644
index 0000000..a32b107
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.legacy.expect
@@ -0,0 +1,71 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E on C {
+//                ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
+// extension E on C {
+//                ^
+// pkg/front_end/testcases/general/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: Type 'extension' not found.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:13: Warning: Type 'on' not found.
+// extension E on C {
+//             ^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: 'extension' isn't a type.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:14:7: Error: Expected ';' after this.
+//   int get two => 2;
+//       ^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:14:15: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   int get two => 2;
+//               ^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:18:3: Error: Can't use 'C' because it is declared more than once.
+//   C c = C();
+//   ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
+//   C c = C();
+//         ^
+//
+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;
+}
+static field invalid-type E;
+static method main() → dynamic {
+  invalid-type c = invalid-expression "pkg/front_end/testcases/general/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
+  C c = C();
+        ^".call();
+  dynamic result = c.one.+(c.two);
+  exp::Expect::equals(result, 3);
+}
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/extension_methods.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a32b107
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.legacy.transformed.expect
@@ -0,0 +1,71 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E on C {
+//                ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
+// extension E on C {
+//                ^
+// pkg/front_end/testcases/general/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: Type 'extension' not found.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:13: Warning: Type 'on' not found.
+// extension E on C {
+//             ^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: 'extension' isn't a type.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:14:7: Error: Expected ';' after this.
+//   int get two => 2;
+//       ^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:14:15: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+//   int get two => 2;
+//               ^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:18:3: Error: Can't use 'C' because it is declared more than once.
+//   C c = C();
+//   ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
+//   C c = C();
+//         ^
+//
+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;
+}
+static field invalid-type E;
+static method main() → dynamic {
+  invalid-type c = invalid-expression "pkg/front_end/testcases/general/extension_methods.dart:18:9: Error: Can't use 'C' because it is declared more than once.
+  C c = C();
+        ^".call();
+  dynamic result = c.one.+(c.two);
+  exp::Expect::equals(result, 3);
+}
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.outline.expect b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
new file mode 100644
index 0000000..5fcae20
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.outline.expect
@@ -0,0 +1,43 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Error: This requires the 'extension-methods' experiment to be enabled.
+// Try enabling this experiment by adding it to the command line when compiling and running.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: A function declaration needs an explicit list of parameters.
+// Try adding a parameter list to the function declaration.
+// extension E on C {
+//                ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:16: Error: 'C' is already declared in this scope.
+// extension E on C {
+//                ^
+// pkg/front_end/testcases/general/extension_methods.dart:9:7: Context: Previous declaration of 'C'.
+// class C {
+//       ^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:1: Warning: Type 'extension' not found.
+// extension E on C {
+// ^^^^^^^^^
+//
+// pkg/front_end/testcases/general/extension_methods.dart:13:13: Warning: Type 'on' not found.
+// extension E on C {
+//             ^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  get one() → core::int*
+    ;
+}
+static field invalid-type E;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.strong.expect b/pkg/front_end/testcases/general/extension_methods.dart.strong.expect
new file mode 100644
index 0000000..8aa0e39
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.strong.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_methods.dart:19:26: Error: The getter 'two' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/extension_methods.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'two'.
+//   var result = c.one + c.two;
+//                          ^^^
+//
+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;
+}
+class E extends core::Object {
+}
+method E|two(final self::C* #this) → core::int*
+  return 2;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  core::num* result = c.{self::C::one}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/extension_methods.dart:19:26: Error: The getter 'two' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/extension_methods.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'two'.
+  var result = c.one + c.two;
+                         ^^^" as{TypeError} core::num*);
+  exp::Expect::equals(result, 3);
+}
diff --git a/pkg/front_end/testcases/general/extension_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/general/extension_methods.dart.strong.transformed.expect
new file mode 100644
index 0000000..8aa0e39
--- /dev/null
+++ b/pkg/front_end/testcases/general/extension_methods.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/extension_methods.dart:19:26: Error: The getter 'two' isn't defined for the class 'C'.
+//  - 'C' is from 'pkg/front_end/testcases/general/extension_methods.dart'.
+// Try correcting the name to the name of an existing getter, or defining a getter or field named 'two'.
+//   var result = c.one + c.two;
+//                          ^^^
+//
+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;
+}
+class E extends core::Object {
+}
+method E|two(final self::C* #this) → core::int*
+  return 2;
+static method main() → dynamic {
+  self::C* c = new self::C::•();
+  core::num* result = c.{self::C::one}.{core::num::+}(invalid-expression "pkg/front_end/testcases/general/extension_methods.dart:19:26: Error: The getter 'two' isn't defined for the class 'C'.
+ - 'C' is from 'pkg/front_end/testcases/general/extension_methods.dart'.
+Try correcting the name to the name of an existing getter, or defining a getter or field named 'two'.
+  var result = c.one + c.two;
+                         ^^^" as{TypeError} core::num*);
+  exp::Expect::equals(result, 3);
+}
diff --git a/pkg/front_end/testcases/external.dart b/pkg/front_end/testcases/general/external.dart
similarity index 100%
rename from pkg/front_end/testcases/external.dart
rename to pkg/front_end/testcases/general/external.dart
diff --git a/pkg/front_end/testcases/general/external.dart.legacy.expect b/pkg/front_end/testcases/general/external.dart.legacy.expect
new file mode 100644
index 0000000..357ceff
--- /dev/null
+++ b/pkg/front_end/testcases/general/external.dart.legacy.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+
+import "dart:isolate";
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription.cancel();
+}
+static method main() → dynamic {
+  dynamic string = core::String::fromCharCode(65);
+  dynamic port = iso::ReceivePort::•();
+  self::subscription = port.listen(#C1);
+  port.sendPort.send(string);
+}
+
+constants  {
+  #C1 = tearoff self::onData
+}
diff --git a/pkg/front_end/testcases/general/external.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/external.dart.legacy.transformed.expect
new file mode 100644
index 0000000..357ceff
--- /dev/null
+++ b/pkg/front_end/testcases/general/external.dart.legacy.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+
+import "dart:isolate";
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription.cancel();
+}
+static method main() → dynamic {
+  dynamic string = core::String::fromCharCode(65);
+  dynamic port = iso::ReceivePort::•();
+  self::subscription = port.listen(#C1);
+  port.sendPort.send(string);
+}
+
+constants  {
+  #C1 = tearoff self::onData
+}
diff --git a/pkg/front_end/testcases/external.dart.outline.expect b/pkg/front_end/testcases/general/external.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/external.dart.outline.expect
rename to pkg/front_end/testcases/general/external.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/external.dart.strong.expect b/pkg/front_end/testcases/general/external.dart.strong.expect
new file mode 100644
index 0000000..766ac5f
--- /dev/null
+++ b/pkg/front_end/testcases/general/external.dart.strong.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+
+import "dart:isolate";
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription.cancel();
+}
+static method main() → dynamic {
+  core::String* string = core::String::fromCharCode(65);
+  iso::ReceivePort* port = iso::ReceivePort::•();
+  self::subscription = port.{iso::ReceivePort::listen}(#C1);
+  port.{iso::ReceivePort::sendPort}.{iso::SendPort::send}(string);
+}
+
+constants  {
+  #C1 = tearoff self::onData
+}
diff --git a/pkg/front_end/testcases/general/external.dart.strong.transformed.expect b/pkg/front_end/testcases/general/external.dart.strong.transformed.expect
new file mode 100644
index 0000000..766ac5f
--- /dev/null
+++ b/pkg/front_end/testcases/general/external.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+import "dart:isolate" as iso;
+
+import "dart:isolate";
+
+static field dynamic subscription;
+static method onData(dynamic x) → void {
+  core::print(x);
+  self::subscription.cancel();
+}
+static method main() → dynamic {
+  core::String* string = core::String::fromCharCode(65);
+  iso::ReceivePort* port = iso::ReceivePort::•();
+  self::subscription = port.{iso::ReceivePort::listen}(#C1);
+  port.{iso::ReceivePort::sendPort}.{iso::SendPort::send}(string);
+}
+
+constants  {
+  #C1 = tearoff self::onData
+}
diff --git a/pkg/front_end/testcases/external_import.dart b/pkg/front_end/testcases/general/external_import.dart
similarity index 100%
rename from pkg/front_end/testcases/external_import.dart
rename to pkg/front_end/testcases/general/external_import.dart
diff --git a/pkg/front_end/testcases/general/external_import.dart.legacy.expect b/pkg/front_end/testcases/general/external_import.dart.legacy.expect
new file mode 100644
index 0000000..92724dc
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_import.dart.legacy.expect
@@ -0,0 +1,17 @@
+@#C2
+@#C4
+@#C6
+library;
+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}
+}
diff --git a/pkg/front_end/testcases/general/external_import.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/external_import.dart.legacy.transformed.expect
new file mode 100644
index 0000000..92724dc
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_import.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+@#C2
+@#C4
+@#C6
+library;
+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}
+}
diff --git a/pkg/front_end/testcases/external_import.dart.outline.expect b/pkg/front_end/testcases/general/external_import.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/external_import.dart.outline.expect
rename to pkg/front_end/testcases/general/external_import.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/external_import.dart.strong.expect b/pkg/front_end/testcases/general/external_import.dart.strong.expect
new file mode 100644
index 0000000..92724dc
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_import.dart.strong.expect
@@ -0,0 +1,17 @@
+@#C2
+@#C4
+@#C6
+library;
+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}
+}
diff --git a/pkg/front_end/testcases/general/external_import.dart.strong.transformed.expect b/pkg/front_end/testcases/general/external_import.dart.strong.transformed.expect
new file mode 100644
index 0000000..92724dc
--- /dev/null
+++ b/pkg/front_end/testcases/general/external_import.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+@#C2
+@#C4
+@#C6
+library;
+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}
+}
diff --git a/pkg/front_end/testcases/fallthrough.dart b/pkg/front_end/testcases/general/fallthrough.dart
similarity index 100%
rename from pkg/front_end/testcases/fallthrough.dart
rename to pkg/front_end/testcases/general/fallthrough.dart
diff --git a/pkg/front_end/testcases/fallthrough.dart.legacy.expect b/pkg/front_end/testcases/general/fallthrough.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/fallthrough.dart.legacy.expect
rename to pkg/front_end/testcases/general/fallthrough.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/fallthrough.dart.outline.expect b/pkg/front_end/testcases/general/fallthrough.dart.outline.expect
new file mode 100644
index 0000000..6e0a3e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/fallthrough.dart.outline.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main(core::List<core::String*>* args) → void
+  ;
diff --git a/pkg/front_end/testcases/fallthrough.dart.strong.expect b/pkg/front_end/testcases/general/fallthrough.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/fallthrough.dart.strong.expect
rename to pkg/front_end/testcases/general/fallthrough.dart.strong.expect
diff --git a/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect b/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect
new file mode 100644
index 0000000..3758346
--- /dev/null
+++ b/pkg/front_end/testcases/general/fallthrough.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/fallthrough.dart:9:9: Context: Write to x@254
+      x = 4;
+        ^
diff --git a/pkg/front_end/testcases/fibonacci.dart b/pkg/front_end/testcases/general/fibonacci.dart
similarity index 100%
rename from pkg/front_end/testcases/fibonacci.dart
rename to pkg/front_end/testcases/general/fibonacci.dart
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.legacy.expect b/pkg/front_end/testcases/general/fibonacci.dart.legacy.expect
new file mode 100644
index 0000000..656cea2
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.legacy.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.<(2))
+    return n;
+  return self::fibonacci(n.-(1)).+(self::fibonacci(n.-(2)));
+}
+static method main() → dynamic {
+  for (core::int* i = 0; i.<(20); i = i.+(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/fibonacci.dart.legacy.transformed.expect
new file mode 100644
index 0000000..656cea2
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.legacy.transformed.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.<(2))
+    return n;
+  return self::fibonacci(n.-(1)).+(self::fibonacci(n.-(2)));
+}
+static method main() → dynamic {
+  for (core::int* i = 0; i.<(20); i = i.+(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.outline.expect b/pkg/front_end/testcases/general/fibonacci.dart.outline.expect
new file mode 100644
index 0000000..4bb744f
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method fibonacci(core::int* n) → core::int*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.strong.expect b/pkg/front_end/testcases/general/fibonacci.dart.strong.expect
new file mode 100644
index 0000000..95dc207
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.strong.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))
+    return n;
+  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
+}
+static method main() → dynamic {
+  for (core::int* i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.strong.transformed.expect b/pkg/front_end/testcases/general/fibonacci.dart.strong.transformed.expect
new file mode 100644
index 0000000..95dc207
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.strong.transformed.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))
+    return n;
+  return self::fibonacci(n.{core::num::-}(1)).{core::num::+}(self::fibonacci(n.{core::num::-}(2)));
+}
+static method main() → dynamic {
+  for (core::int* i = 0; i.{core::num::<}(20); i = i.{core::num::+}(1)) {
+    core::print(self::fibonacci(i));
+  }
+}
diff --git a/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect b/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect
new file mode 100644
index 0000000..76596ca
--- /dev/null
+++ b/pkg/front_end/testcases/general/fibonacci.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/fibonacci.dart:11:28: Context: Write to i@332
+  for (int i = 0; i < 20; i++) {
+                           ^^
diff --git a/pkg/front_end/testcases/for_in_scope.dart b/pkg/front_end/testcases/general/for_in_scope.dart
similarity index 100%
rename from pkg/front_end/testcases/for_in_scope.dart
rename to pkg/front_end/testcases/general/for_in_scope.dart
diff --git a/pkg/front_end/testcases/general/for_in_scope.dart.legacy.expect b/pkg/front_end/testcases/general/for_in_scope.dart.legacy.expect
new file mode 100644
index 0000000..78f359e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.legacy.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_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/for_in_scope.dart.legacy.transformed.expect
new file mode 100644
index 0000000..78f359e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.legacy.transformed.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_scope.dart.outline.expect b/pkg/front_end/testcases/general/for_in_scope.dart.outline.expect
new file mode 100644
index 0000000..d20fd29e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.outline.expect
@@ -0,0 +1,6 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method main(core::List<core::String*>* arguments) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_scope.dart.strong.expect b/pkg/front_end/testcases/general/for_in_scope.dart.strong.expect
new file mode 100644
index 0000000..78f359e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.strong.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_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.expect
new file mode 100644
index 0000000..78f359e
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_scope.dart.strong.transformed.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/for_in_without_declaration.dart b/pkg/front_end/testcases/general/for_in_without_declaration.dart
similarity index 100%
rename from pkg/front_end/testcases/for_in_without_declaration.dart
rename to pkg/front_end/testcases/general/for_in_without_declaration.dart
diff --git a/pkg/front_end/testcases/for_in_without_declaration.dart.hierarchy.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/for_in_without_declaration.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/for_in_without_declaration.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.expect
new file mode 100644
index 0000000..d76478a
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.expect
@@ -0,0 +1,163 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got '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:37:10: Warning: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
+//     for (unresolved.foo 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: Warning: Setter not found: 'constant'.
+//     for (constant 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::•()
+    ;
+}
+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 dynamic #t1 in <dynamic>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final dynamic #t3 in <dynamic>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final dynamic #t5 in <dynamic>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final dynamic #t7 in <dynamic>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final dynamic #t9 in <dynamic>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C* c = new self::C::•();
+    for (final dynamic #t11 in <dynamic>[]) {
+      c.instanceField = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.untypedSuperInstanceField = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      this.unresolved = #t13;
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      this.unresolved.foo = #t14;
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      c.unresolved = #t15;
+    }
+    {
+      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 dynamic #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>[]) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t18]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    }
+  }
+}
+static field core::bool* topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #constant
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d76478a
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.legacy.transformed.expect
@@ -0,0 +1,163 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got '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:37:10: Warning: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Warning: Getter not found: 'unresolved'.
+//     for (unresolved.foo 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: Warning: Setter not found: 'constant'.
+//     for (constant 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::•()
+    ;
+}
+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 dynamic #t1 in <dynamic>[]) {
+      local = #t1;
+    }
+    for (final dynamic #t2 in <dynamic>[]) {
+      untypedLocal = #t2;
+    }
+    for (final dynamic #t3 in <dynamic>[]) {
+      this.{self::C::instanceField} = #t3;
+    }
+    for (final dynamic #t4 in <dynamic>[]) {
+      this.{self::C::untypedInstanceField} = #t4;
+    }
+    for (final dynamic #t5 in <dynamic>[]) {
+      self::C::staticField = #t5;
+    }
+    for (final dynamic #t6 in <dynamic>[]) {
+      self::C::untypedStaticField = #t6;
+    }
+    for (final dynamic #t7 in <dynamic>[]) {
+      self::topLevelField = #t7;
+    }
+    for (final dynamic #t8 in <dynamic>[]) {
+      self::untypedTopLevelField = #t8;
+    }
+    for (final dynamic #t9 in <dynamic>[]) {
+      super.{self::Super::superInstanceField} = #t9;
+    }
+    for (final dynamic #t10 in <dynamic>[]) {
+      super.{self::Super::untypedSuperInstanceField} = #t10;
+    }
+    self::C* c = new self::C::•();
+    for (final dynamic #t11 in <dynamic>[]) {
+      c.instanceField = #t11;
+    }
+    for (final dynamic #t12 in <dynamic>[]) {
+      c.untypedSuperInstanceField = #t12;
+    }
+    for (final dynamic #t13 in <dynamic>[]) {
+      this.unresolved = #t13;
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      this.unresolved.foo = #t14;
+    }
+    for (final dynamic #t15 in <dynamic>[]) {
+      c.unresolved = #t15;
+    }
+    {
+      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 dynamic #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>[]) {
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t18]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    }
+  }
+}
+static field core::bool* topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #constant
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.outline.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.outline.expect
new file mode 100644
index 0000000..7778ba0
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  field core::int* superInstanceField;
+  field dynamic untypedSuperInstanceField;
+  synthetic constructor •() → self::Super*
+    ;
+}
+class C extends self::Super {
+  field core::int* instanceField;
+  field dynamic untypedInstanceField;
+  static field core::double* staticField;
+  static field dynamic untypedStaticField;
+  synthetic constructor •() → self::C*
+    ;
+  method m() → dynamic
+    ;
+}
+static field core::bool* topLevelField;
+static field dynamic untypedTopLevelField;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect
new file mode 100644
index 0000000..8e90b12
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.expect
@@ -0,0 +1,188 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got '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:37:10: Error: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
+//     for (unresolved.foo 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: Setter not found: '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:21: Error: The setter 'foo' 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 'foo'.
+//     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::•()
+    ;
+}
+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 []) {}
+         ^^^^^^^^^^";
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The setter 'foo' 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 'foo'.
+    for (unresolved.foo in []) {}
+                    ^^^";
+    }
+    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 []) {}
+           ^^^^^^^^^^";
+    }
+    {
+      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: Setter not found: '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/for_in_without_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
new file mode 100644
index 0000000..8e90b12
--- /dev/null
+++ b/pkg/front_end/testcases/general/for_in_without_declaration.dart.strong.transformed.expect
@@ -0,0 +1,188 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:32:10: Error: Expected an identifier, but got 'super'.
+//     for (super.superInstanceField in []) {}
+//          ^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:33:10: Error: Expected an identifier, but got '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:37:10: Error: Setter not found: 'unresolved'.
+//     for (unresolved in []) {}
+//          ^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: Getter not found: 'unresolved'.
+//     for (unresolved.foo 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: Setter not found: '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:21: Error: The setter 'foo' 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 'foo'.
+//     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::•()
+    ;
+}
+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 []) {}
+         ^^^^^^^^^^";
+    }
+    for (final dynamic #t14 in <dynamic>[]) {
+      invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The setter 'foo' 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 'foo'.
+    for (unresolved.foo in []) {}
+                    ^^^";
+    }
+    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 []) {}
+           ^^^^^^^^^^";
+    }
+    {
+      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: Setter not found: '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_stub_for_operator.dart b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart
new file mode 100644
index 0000000..0245c54
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart
@@ -0,0 +1,29 @@
+// 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.
+
+//------------------------------------------------------------------------------
+
+class A {
+  dynamic operator +(covariant int a) => null;
+}
+
+class B {
+  dynamic operator +(dynamic b) => null;
+}
+
+abstract class C implements A, B {}
+
+//------------------------------------------------------------------------------
+
+class D {
+  dynamic operator +(dynamic d) => null;
+}
+
+class E extends D {
+  dynamic operator +(covariant int e);
+}
+
+//------------------------------------------------------------------------------
+
+main() {}
diff --git a/pkg/front_end/testcases/forwarding_stub_for_operator.dart.hierarchy.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/forwarding_stub_for_operator.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.expect
new file mode 100644
index 0000000..4f87d1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(covariant core::int* a) → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(dynamic b) → dynamic
+    return null;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  operator +(dynamic d) → dynamic
+    return null;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator +(covariant core::int* e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4f87d1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.legacy.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(covariant core::int* a) → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(dynamic b) → dynamic
+    return null;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  operator +(dynamic d) → dynamic
+    return null;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator +(covariant core::int* e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.outline.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.outline.expect
new file mode 100644
index 0000000..ccb8208
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  operator +(covariant core::int* a) → dynamic
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  operator +(dynamic b) → dynamic
+    ;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    ;
+  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+  operator +(dynamic d) → dynamic
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    ;
+  forwarding-stub forwarding-semi-stub operator +(covariant core::int* e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.expect
new file mode 100644
index 0000000..4f87d1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(covariant core::int* a) → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(dynamic b) → dynamic
+    return null;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  operator +(dynamic d) → dynamic
+    return null;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator +(covariant core::int* e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.transformed.expect b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.transformed.expect
new file mode 100644
index 0000000..4f87d1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/forwarding_stub_for_operator.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator +(covariant core::int* a) → dynamic
+    return null;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator +(dynamic b) → dynamic
+    return null;
+}
+abstract class C extends core::Object implements self::A, self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub operator +(covariant dynamic b) → dynamic;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+  operator +(dynamic d) → dynamic
+    return null;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  forwarding-stub forwarding-semi-stub operator +(covariant core::int* e) → dynamic
+    return super.{self::D::+}(e);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/function_in_field.dart b/pkg/front_end/testcases/general/function_in_field.dart
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart
rename to pkg/front_end/testcases/general/function_in_field.dart
diff --git a/pkg/front_end/testcases/function_in_field.dart.legacy.expect b/pkg/front_end/testcases/general/function_in_field.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart.legacy.expect
rename to pkg/front_end/testcases/general/function_in_field.dart.legacy.expect
diff --git a/pkg/front_end/testcases/function_in_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/function_in_field.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/function_in_field.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/function_in_field.dart.outline.expect b/pkg/front_end/testcases/general/function_in_field.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/function_in_field.dart.outline.expect
rename to pkg/front_end/testcases/general/function_in_field.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/function_in_field.dart.strong.expect b/pkg/front_end/testcases/general/function_in_field.dart.strong.expect
new file mode 100644
index 0000000..ca264d4
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_in_field.dart.strong.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.call());
+}
diff --git a/pkg/front_end/testcases/general/function_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_in_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..ca264d4
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_in_field.dart.strong.transformed.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.call());
+}
diff --git a/pkg/front_end/testcases/function_type_assignments.dart b/pkg/front_end/testcases/general/function_type_assignments.dart
similarity index 100%
rename from pkg/front_end/testcases/function_type_assignments.dart
rename to pkg/front_end/testcases/general/function_type_assignments.dart
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.expect
new file mode 100644
index 0000000..c2d61b6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x = #C1;
+static field core::String* y = #C2;
+static field core::String* z = #C3;
+static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
+  return t;
+static method identityObject<T extends core::Object* = dynamic>(self::identityObject::T* t) → self::identityObject::T*
+  return t;
+static method identityList<T extends core::List<self::identityList::T>* = dynamic>(self::identityList::T* t) → self::identityList::T*
+  return t;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::identity
+  #C2 = tearoff self::identityObject
+  #C3 = tearoff self::identityList
+}
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c2d61b6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x = #C1;
+static field core::String* y = #C2;
+static field core::String* z = #C3;
+static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
+  return t;
+static method identityObject<T extends core::Object* = dynamic>(self::identityObject::T* t) → self::identityObject::T*
+  return t;
+static method identityList<T extends core::List<self::identityList::T>* = dynamic>(self::identityList::T* t) → self::identityList::T*
+  return t;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::identity
+  #C2 = tearoff self::identityObject
+  #C3 = tearoff self::identityList
+}
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
new file mode 100644
index 0000000..055c6c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x;
+static field core::String* y;
+static field core::String* z;
+static method identity<T extends core::Object* = dynamic>(self::identity::T* t) → self::identity::T*
+  ;
+static method identityObject<T extends core::Object* = dynamic>(self::identityObject::T* t) → self::identityObject::T*
+  ;
+static method identityList<T extends core::List<self::identityList::T>* = dynamic>(self::identityList::T* t) → self::identityList::T*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect
new file mode 100644
index 0000000..2323d85
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.expect
@@ -0,0 +1,51 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// 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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// String z = identityList; // List<T> bound
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String x = identity; // No bound
+           ^" in (#C1) as{TypeError} core::String*;
+static field core::String* y = let final<BottomType> #t2 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String y = identityObject; // Object bound
+           ^" in (#C2) as{TypeError} core::String*;
+static field core::String* z = let final<BottomType> #t3 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+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* = 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 = tearoff self::identity
+  #C2 = tearoff self::identityObject
+  #C3 = tearoff self::identityList
+}
diff --git a/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect
new file mode 100644
index 0000000..2323d85
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_assignments.dart.strong.transformed.expect
@@ -0,0 +1,51 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// 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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'String'.
+// String z = identityList; // List<T> bound
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+static field core::String* x = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String x = identity; // No bound
+           ^" in (#C1) as{TypeError} core::String*;
+static field core::String* y = let final<BottomType> #t2 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+String y = identityObject; // Object bound
+           ^" in (#C2) as{TypeError} core::String*;
+static field core::String* z = let final<BottomType> #t3 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'String'.
+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* = 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 = tearoff self::identity
+  #C2 = tearoff self::identityObject
+  #C3 = tearoff self::identityList
+}
diff --git a/pkg/front_end/testcases/function_type_default_value.dart b/pkg/front_end/testcases/general/function_type_default_value.dart
similarity index 100%
rename from pkg/front_end/testcases/function_type_default_value.dart
rename to pkg/front_end/testcases/general/function_type_default_value.dart
diff --git a/pkg/front_end/testcases/general/function_type_default_value.dart.legacy.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.legacy.expect
new file mode 100644
index 0000000..493f6b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.legacy.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// 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: Warning: Type 'obj' not found.
+// void Function({obj: Object}) x;
+//                ^^^
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Warning: '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_default_value.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.legacy.transformed.expect
new file mode 100644
index 0000000..493f6b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.legacy.transformed.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// 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: Warning: Type 'obj' not found.
+// void Function({obj: Object}) x;
+//                ^^^
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:16: Warning: '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_default_value.dart.outline.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
new file mode 100644
index 0000000..9bfb098
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// 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: Warning: Type 'obj' not found.
+// 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_default_value.dart.strong.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.strong.expect
new file mode 100644
index 0000000..4e7f6a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// 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_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_default_value.dart.strong.transformed.expect
new file mode 100644
index 0000000..4e7f6a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_default_value.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/function_type_default_value.dart:5:19: Error: Expected an identifier, but got ':'.
+// 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/function_type_is_check.dart b/pkg/front_end/testcases/general/function_type_is_check.dart
similarity index 100%
rename from pkg/front_end/testcases/function_type_is_check.dart
rename to pkg/front_end/testcases/general/function_type_is_check.dart
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.hierarchy.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.hierarchy.expect
new file mode 100644
index 0000000..257f1e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.hierarchy.expect
@@ -0,0 +1,369 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.expect
new file mode 100644
index 0000000..9fe516f
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.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";
+
+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(() → dynamic => null).+(self::test((core::Object* o) → dynamic => null)).+(self::test((core::Object* o, core::StackTrace* t) → dynamic => null)));
+}
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9fe516f
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.legacy.transformed.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";
+
+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(() → dynamic => null).+(self::test((core::Object* o) → dynamic => null)).+(self::test((core::Object* o, core::StackTrace* t) → dynamic => null)));
+}
diff --git a/pkg/front_end/testcases/function_type_is_check.dart.outline.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/function_type_is_check.dart.outline.expect
rename to pkg/front_end/testcases/general/function_type_is_check.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.expect
new file mode 100644
index 0000000..7493073
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.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";
+
+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(() → core::Null* => null).+(self::test((core::Object* o) → core::Null* => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null* => null)));
+}
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.expect
new file mode 100644
index 0000000..7493073
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.strong.transformed.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";
+
+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(() → core::Null* => null).+(self::test((core::Object* o) → core::Null* => null)).+(self::test((core::Object* o, core::StackTrace* t) → core::Null* => null)));
+}
diff --git a/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect b/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect
new file mode 100644
index 0000000..30852a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_is_check.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/general/function_type_is_check.dart:8:9: Context: Possible promotion of f@272
+  if (f is void Function(Object, StackTrace)) return 1;
+        ^^
+pkg/front_end/testcases/general/function_type_is_check.dart:9:9: Context: Possible promotion of f@272
+  if (f is void Function(Object)) return 10;
+        ^^
+pkg/front_end/testcases/general/function_type_is_check.dart:10:9: Context: Possible promotion of f@272
+  if (f is void Function()) return 100;
+        ^^
diff --git a/pkg/front_end/testcases/function_type_recovery.dart b/pkg/front_end/testcases/general/function_type_recovery.dart
similarity index 100%
rename from pkg/front_end/testcases/function_type_recovery.dart
rename to pkg/front_end/testcases/general/function_type_recovery.dart
diff --git a/pkg/front_end/testcases/general/function_type_recovery.dart.outline.expect b/pkg/front_end/testcases/general/function_type_recovery.dart.outline.expect
new file mode 100644
index 0000000..56adbb4
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_recovery.dart.outline.expect
@@ -0,0 +1,15 @@
+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));
+//                               ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef F = ((core::String*) →* core::int*) →* core::int*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/function_type_recovery.dart.strong.expect b/pkg/front_end/testcases/general/function_type_recovery.dart.strong.expect
new file mode 100644
index 0000000..b221bcb
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_recovery.dart.strong.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/function_type_recovery.dart.strong.transformed.expect b/pkg/front_end/testcases/general/function_type_recovery.dart.strong.transformed.expect
new file mode 100644
index 0000000..b221bcb
--- /dev/null
+++ b/pkg/front_end/testcases/general/function_type_recovery.dart.strong.transformed.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/functions.dart b/pkg/front_end/testcases/general/functions.dart
similarity index 100%
rename from pkg/front_end/testcases/functions.dart
rename to pkg/front_end/testcases/general/functions.dart
diff --git a/pkg/front_end/testcases/general/functions.dart.legacy.expect b/pkg/front_end/testcases/general/functions.dart.legacy.expect
new file mode 100644
index 0000000..7563745
--- /dev/null
+++ b/pkg/front_end/testcases/general/functions.dart.legacy.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.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = #C1}) → dynamic {
+    core::print(a);
+  });
+}
+
+constants  {
+  #C1 = "Default greeting!"
+}
diff --git a/pkg/front_end/testcases/general/functions.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/functions.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7563745
--- /dev/null
+++ b/pkg/front_end/testcases/general/functions.dart.legacy.transformed.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.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = #C1}) → dynamic {
+    core::print(a);
+  });
+}
+
+constants  {
+  #C1 = "Default greeting!"
+}
diff --git a/pkg/front_end/testcases/functions.dart.outline.expect b/pkg/front_end/testcases/general/functions.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/functions.dart.outline.expect
rename to pkg/front_end/testcases/general/functions.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.expect b/pkg/front_end/testcases/general/functions.dart.strong.expect
new file mode 100644
index 0000000..7b58e1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/functions.dart.strong.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.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = #C1}) → core::Null* {
+    core::print(a);
+  });
+}
+
+constants  {
+  #C1 = "Default greeting!"
+}
diff --git a/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/functions.dart.strong.transformed.expect
new file mode 100644
index 0000000..7b58e1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/functions.dart.strong.transformed.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.call(a: "Hello, World");
+    f.call();
+  }
+  local.call(({dynamic a = #C1}) → core::Null* {
+    core::print(a);
+  });
+}
+
+constants  {
+  #C1 = "Default greeting!"
+}
diff --git a/pkg/front_end/testcases/future_or_test.dart b/pkg/front_end/testcases/general/future_or_test.dart
similarity index 100%
rename from pkg/front_end/testcases/future_or_test.dart
rename to pkg/front_end/testcases/general/future_or_test.dart
diff --git a/pkg/front_end/testcases/future_or_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/future_or_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/future_or_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/future_or_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.legacy.expect b/pkg/front_end/testcases/general/future_or_test.dart.legacy.expect
new file mode 100644
index 0000000..f9c56fe
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.legacy.expect
@@ -0,0 +1,31 @@
+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;
+}
+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}.foo();
+}
+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}.bar();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/future_or_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a3459c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+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;
+}
+class B extends core::Object {
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method bar() → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          :return_value = this.{self::B::a}.foo();
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+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*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          :return_value = this.{self::C::b}.bar();
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.outline.expect b/pkg/front_end/testcases/general/future_or_test.dart.outline.expect
new file mode 100644
index 0000000..3f972a0
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.outline.expect
@@ -0,0 +1,29 @@
+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*
+    ;
+  method foo() → dynamic
+    ;
+}
+class B extends core::Object {
+  field self::A* a;
+  synthetic constructor •() → self::B*
+    ;
+  method bar() → asy::Future<dynamic>*
+    ;
+}
+class C extends core::Object {
+  field self::B* b;
+  synthetic constructor •() → self::C*
+    ;
+  method baz() → asy::Future<core::int*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.strong.expect b/pkg/front_end/testcases/general/future_or_test.dart.strong.expect
new file mode 100644
index 0000000..cb66dac
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.strong.expect
@@ -0,0 +1,31 @@
+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;
+}
+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::foo}();
+}
+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::bar}() as{TypeError} asy::FutureOr<core::int*>*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..9ec74f5
--- /dev/null
+++ b/pkg/front_end/testcases/general/future_or_test.dart.strong.transformed.expect
@@ -0,0 +1,81 @@
+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;
+}
+class B extends core::Object {
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  method bar() → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L1:
+        {
+          :return_value = this.{self::B::a}.{self::A::foo}();
+          break #L1;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+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*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
+    dynamic :async_stack_trace;
+    dynamic :async_op_then;
+    dynamic :async_op_error;
+    dynamic :await_jump_var = 0;
+    dynamic :await_ctx_var;
+    function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+      try {
+        #L2:
+        {
+          :return_value = this.{self::C::b}.{self::B::bar}() as{TypeError} asy::FutureOr<core::int*>*;
+          break #L2;
+        }
+        asy::_completeOnAsyncReturn(:async_completer, :return_value);
+        return;
+      }
+      on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+        :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+      }
+    :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+    :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+    :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+    :async_completer.start(:async_op);
+    return :async_completer.{asy::Completer::future};
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart
new file mode 100644
index 0000000..603f88f
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart
@@ -0,0 +1,8 @@
+@Foo
+part 'having_part_with_part_and_annotation_lib1.dart';
+
+const int Foo = 42;
+
+void fromMain() {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.legacy.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.legacy.expect
new file mode 100644
index 0000000..9e407ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.legacy.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_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_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_part_and_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9e407ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.legacy.transformed.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_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_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_part_and_annotation.dart.outline.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.outline.expect
new file mode 100644
index 0000000..ffb8048
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_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_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;
+
+part having_part_with_part_and_annotation_lib1.dart;
+static const field core::int* Foo = 42;
+static const field core::int* Bar = 43 /* 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
+  ;
diff --git a/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.strong.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.strong.expect
new file mode 100644
index 0000000..9e407ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.strong.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_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_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_part_and_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.strong.transformed.expect
new file mode 100644
index 0000000..9e407ec
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_part_and_annotation.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/having_part_with_part_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_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/having_part_with_part_and_annotation_lib1.dart b/pkg/front_end/testcases/general/having_part_with_part_and_annotation_lib1.dart
similarity index 100%
rename from pkg/front_end/testcases/having_part_with_part_and_annotation_lib1.dart
rename to pkg/front_end/testcases/general/having_part_with_part_and_annotation_lib1.dart
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation_lib2.dart b/pkg/front_end/testcases/general/having_part_with_part_and_annotation_lib2.dart
similarity index 100%
rename from pkg/front_end/testcases/having_part_with_part_and_annotation_lib2.dart
rename to pkg/front_end/testcases/general/having_part_with_part_and_annotation_lib2.dart
diff --git a/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart
new file mode 100644
index 0000000..4af2617
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart
@@ -0,0 +1,8 @@
+@Foo
+part 'having_part_with_parts_and_annotation_lib1.dart';
+
+const int Foo = 42;
+
+void fromMain() {}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.legacy.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.legacy.expect
new file mode 100644
index 0000000..fb32300
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.legacy.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// 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 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = #C3 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /* 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/having_part_with_parts_and_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fb32300
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// 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 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = #C3 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /* 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/having_part_with_parts_and_annotation.dart.outline.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.outline.expect
new file mode 100644
index 0000000..ffe69bc
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.outline.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// 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;
+
+part having_part_with_parts_and_annotation_lib1.dart;
+static const field core::int* Foo = 42;
+static const field core::int* Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void
+  ;
+static method main() → dynamic
+  ;
+static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void
+  ;
diff --git a/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.strong.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.strong.expect
new file mode 100644
index 0000000..fb32300
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.strong.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// 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 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = #C3 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /* 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/having_part_with_parts_and_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.strong.transformed.expect
new file mode 100644
index 0000000..fb32300
--- /dev/null
+++ b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+library;
+//
+// Problems in library:
+//
+// 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 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static const field core::int* Baz = #C3 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
+static method fromMain() → void {}
+static method main() → dynamic {}
+static method /* 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/having_part_with_parts_and_annotation_lib1.dart b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib1.dart
similarity index 100%
rename from pkg/front_end/testcases/having_part_with_parts_and_annotation_lib1.dart
rename to pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib1.dart
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation_lib2.dart b/pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib2.dart
similarity index 100%
rename from pkg/front_end/testcases/having_part_with_parts_and_annotation_lib2.dart
rename to pkg/front_end/testcases/general/having_part_with_parts_and_annotation_lib2.dart
diff --git a/pkg/front_end/testcases/hello.dart b/pkg/front_end/testcases/general/hello.dart
similarity index 100%
rename from pkg/front_end/testcases/hello.dart
rename to pkg/front_end/testcases/general/hello.dart
diff --git a/pkg/front_end/testcases/hello.dart.legacy.expect b/pkg/front_end/testcases/general/hello.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.legacy.expect
rename to pkg/front_end/testcases/general/hello.dart.legacy.expect
diff --git a/pkg/front_end/testcases/hello.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/hello.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/hello.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/hello.dart.outline.expect b/pkg/front_end/testcases/general/hello.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.outline.expect
rename to pkg/front_end/testcases/general/hello.dart.outline.expect
diff --git a/pkg/front_end/testcases/hello.dart.strong.expect b/pkg/front_end/testcases/general/hello.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.strong.expect
rename to pkg/front_end/testcases/general/hello.dart.strong.expect
diff --git a/pkg/front_end/testcases/hello.dart.strong.transformed.expect b/pkg/front_end/testcases/general/hello.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/hello.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/hello.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/ignore_function.dart b/pkg/front_end/testcases/general/ignore_function.dart
similarity index 100%
rename from pkg/front_end/testcases/ignore_function.dart
rename to pkg/front_end/testcases/general/ignore_function.dart
diff --git a/pkg/front_end/testcases/ignore_function.dart.hierarchy.expect b/pkg/front_end/testcases/general/ignore_function.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/ignore_function.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/ignore_function.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.legacy.expect b/pkg/front_end/testcases/general/ignore_function.dart.legacy.expect
new file mode 100644
index 0000000..b549c23
--- /dev/null
+++ b/pkg/front_end/testcases/general/ignore_function.dart.legacy.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   operator ==(other) => false;
+//               ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as core;
+
+class A extends core::Object implements core::Function {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return false;
+}
+class B extends core::Object implements self::Function {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator ==(invalid-type other) → core::bool*
+    return false;
+}
+class Function extends core::Object {
+  synthetic constructor •() → self::Function*
+    : super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return false;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/ignore_function.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b549c23
--- /dev/null
+++ b/pkg/front_end/testcases/general/ignore_function.dart.legacy.transformed.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   operator ==(other) => false;
+//               ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as core;
+
+class A extends core::Object implements core::Function {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return false;
+}
+class B extends core::Object implements self::Function {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator ==(invalid-type other) → core::bool*
+    return false;
+}
+class Function extends core::Object {
+  synthetic constructor •() → self::Function*
+    : super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return false;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.outline.expect b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
new file mode 100644
index 0000000..4cafa21
--- /dev/null
+++ b/pkg/front_end/testcases/general/ignore_function.dart.outline.expect
@@ -0,0 +1,34 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   operator ==(other) => false;
+//               ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as core;
+
+class A extends core::Object implements core::Function {
+  synthetic constructor •() → self::A*
+    ;
+  operator ==(dynamic other) → core::bool*
+    ;
+}
+class B extends core::Object implements self::Function {
+  synthetic constructor •() → self::B*
+    ;
+  operator ==(invalid-type other) → core::bool*
+    ;
+}
+class Function extends core::Object {
+  synthetic constructor •() → self::Function*
+    ;
+  operator ==(core::Object* other) → core::bool*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/ignore_function.dart.strong.expect b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
new file mode 100644
index 0000000..b549c23
--- /dev/null
+++ b/pkg/front_end/testcases/general/ignore_function.dart.strong.expect
@@ -0,0 +1,36 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
+// Try adding an explicit type.
+//   operator ==(other) => false;
+//               ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+import "dart:core" as core;
+
+class A extends core::Object implements core::Function {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  operator ==(dynamic other) → core::bool*
+    return false;
+}
+class B extends core::Object implements self::Function {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  operator ==(invalid-type other) → core::bool*
+    return false;
+}
+class Function extends core::Object {
+  synthetic constructor •() → self::Function*
+    : super core::Object::•()
+    ;
+  operator ==(core::Object* other) → core::bool*
+    return false;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart b/pkg/front_end/testcases/general/illegal_named_function_expression.dart
similarity index 100%
rename from pkg/front_end/testcases/illegal_named_function_expression.dart
rename to pkg/front_end/testcases/general/illegal_named_function_expression.dart
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.expect
new file mode 100644
index 0000000..907fccf
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.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 {
+  dynamic x = let final <T extends core::Object* = dynamic>(T*) →* void f = <T extends core::Object* = dynamic>(T* t) → void {} in f;
+  core::print(x.runtimeType);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* void g = <T extends core::Object* = dynamic>(T* t) → void {} in g);
+}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.transformed.expect
new file mode 100644
index 0000000..907fccf
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.legacy.transformed.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 {
+  dynamic x = let final <T extends core::Object* = dynamic>(T*) →* void f = <T extends core::Object* = dynamic>(T* t) → void {} in f;
+  core::print(x.runtimeType);
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* void g = <T extends core::Object* = dynamic>(T* t) → void {} in g);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.outline.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/illegal_named_function_expression.dart.outline.expect
rename to pkg/front_end/testcases/general/illegal_named_function_expression.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.expect
new file mode 100644
index 0000000..71eaf54
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.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*) →* core::Null* x = let final <T extends core::Object* = dynamic>(T*) →* core::Null* f = <T extends core::Object* = dynamic>(T* t) → core::Null* {} in f;
+  core::print(x.{core::Object::runtimeType});
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null* g = <T extends core::Object* = dynamic>(T* t) → core::Null* {} in g);
+}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.expect
new file mode 100644
index 0000000..71eaf54
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression.dart.strong.transformed.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*) →* core::Null* x = let final <T extends core::Object* = dynamic>(T*) →* core::Null* f = <T extends core::Object* = dynamic>(T* t) → core::Null* {} in f;
+  core::print(x.{core::Object::runtimeType});
+  core::print(let final <T extends core::Object* = dynamic>(T*) →* core::Null* g = <T extends core::Object* = dynamic>(T* t) → core::Null* {} in g);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart
similarity index 100%
rename from pkg/front_end/testcases/illegal_named_function_expression_scope.dart
rename to pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.expect
new file mode 100644
index 0000000..f3eeb5b
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.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 () →* void f = () → void {} in f);
+}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f3eeb5b
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.legacy.transformed.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 () →* void f = () → void {} in f);
+}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.outline.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/illegal_named_function_expression_scope.dart.outline.expect
rename to pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.expect
new file mode 100644
index 0000000..da7462d
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.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 () →* core::Null* f = () → core::Null* {} in f);
+}
diff --git a/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.expect
new file mode 100644
index 0000000..da7462d
--- /dev/null
+++ b/pkg/front_end/testcases/general/illegal_named_function_expression_scope.dart.strong.transformed.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 () →* core::Null* f = () → core::Null* {} in f);
+}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart
similarity index 100%
rename from pkg/front_end/testcases/implicit_const_with_static_fields.dart
rename to pkg/front_end/testcases/general/implicit_const_with_static_fields.dart
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.hierarchy.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_const_with_static_fields.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.legacy.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.legacy.expect
new file mode 100644
index 0000000..1636e6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static const field dynamic constField = #C1;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic 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_const_with_static_fields.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1636e6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static const field dynamic constField = #C1;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic 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_const_with_static_fields.dart.outline.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
new file mode 100644
index 0000000..07147d2
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.outline.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static const field dynamic constField = 87;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic constTopLevelField = 42;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.strong.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.strong.expect
new file mode 100644
index 0000000..c87d93f
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static const field core::int* constField = #C1;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+}
+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_const_with_static_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.strong.transformed.expect
new file mode 100644
index 0000000..c87d93f
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_const_with_static_fields.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static const field core::int* constField = #C1;
+  const constructor •(dynamic x) → self::C*
+    : super core::Object::•()
+    ;
+}
+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/implicit_new.dart b/pkg/front_end/testcases/general/implicit_new.dart
similarity index 100%
rename from pkg/front_end/testcases/implicit_new.dart
rename to pkg/front_end/testcases/general/implicit_new.dart
diff --git a/pkg/front_end/testcases/implicit_new.dart.hierarchy.expect b/pkg/front_end/testcases/general/implicit_new.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_new.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/implicit_new.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.legacy.expect b/pkg/front_end/testcases/general/implicit_new.dart.legacy.expect
new file mode 100644
index 0000000..f027450
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.legacy.expect
@@ -0,0 +1,79 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/implicit_new.dart:19:10: Warning: Method not found: '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;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+static method f(dynamic x) → dynamic
+  return x;
+static method main() → dynamic {
+  dynamic x = new self::Foo::•();
+  x = new self::Foo::•();
+  dynamic 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());
+  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  dynamic i = new self::IndexTester::•();
+  i.[](new self::Foo::•());
+  i.[](new self::Foo::•());
+  i.[](new self::Bar::named());
+  i.[](new self::Bar::named());
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Bar::named(), null);
+  i.[]=(new self::Bar::named(), null);
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Bar::named().+(new self::Foo::•());
+  new self::Bar::named().+(new self::Foo::•());
+}
+
+constants  {
+  #C1 = #Bar
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/implicit_new.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f027450
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.legacy.transformed.expect
@@ -0,0 +1,79 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/implicit_new.dart:19:10: Warning: Method not found: '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;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+static method f(dynamic x) → dynamic
+  return x;
+static method main() → dynamic {
+  dynamic x = new self::Foo::•();
+  x = new self::Foo::•();
+  dynamic 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());
+  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
+  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
+  dynamic i = new self::IndexTester::•();
+  i.[](new self::Foo::•());
+  i.[](new self::Foo::•());
+  i.[](new self::Bar::named());
+  i.[](new self::Bar::named());
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Foo::•(), null);
+  i.[]=(new self::Bar::named(), null);
+  i.[]=(new self::Bar::named(), null);
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Foo::•().+(new self::Bar::named());
+  new self::Bar::named().+(new self::Foo::•());
+  new self::Bar::named().+(new self::Foo::•());
+}
+
+constants  {
+  #C1 = #Bar
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.outline.expect b/pkg/front_end/testcases/general/implicit_new.dart.outline.expect
new file mode 100644
index 0000000..8cc8392
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.outline.expect
@@ -0,0 +1,32 @@
+library;
+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*
+    ;
+  operator +(dynamic other) → dynamic
+    ;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    ;
+  operator +(dynamic other) → dynamic
+    ;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    ;
+  operator [](dynamic _) → dynamic
+    ;
+  operator []=(dynamic _a, dynamic _b) → void
+    ;
+}
+static method testNSM() → dynamic
+  ;
+static method f(dynamic x) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.strong.expect b/pkg/front_end/testcases/general/implicit_new.dart.strong.expect
new file mode 100644
index 0000000..add1ae8
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.strong.expect
@@ -0,0 +1,76 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Method not found: '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;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
+  var y = prefix.Bar();
+                 ^^^";
+  invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Method not found: '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::•());
+  i.{self::IndexTester::[]}(new self::Foo::•());
+  i.{self::IndexTester::[]}(new self::Bar::named());
+  i.{self::IndexTester::[]}(new self::Bar::named());
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
+}
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_new.dart.strong.transformed.expect
new file mode 100644
index 0000000..add1ae8
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.strong.transformed.expect
@@ -0,0 +1,76 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
+//   var y = prefix.Bar();
+//                  ^^^
+//
+// pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Method not found: '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;
+}
+class Bar extends core::Object {
+  constructor named() → self::Bar*
+    : super core::Object::•()
+    ;
+  operator +(dynamic other) → dynamic
+    return null;
+}
+class IndexTester extends core::Object {
+  synthetic constructor •() → self::IndexTester*
+    : super core::Object::•()
+    ;
+  operator [](dynamic _) → dynamic
+    return null;
+  operator []=(dynamic _a, dynamic _b) → void {}
+}
+static method testNSM() → dynamic {
+  dynamic y = invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
+  var y = prefix.Bar();
+                 ^^^";
+  invalid-expression "pkg/front_end/testcases/general/implicit_new.dart:19:10: Error: Method not found: '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::•());
+  i.{self::IndexTester::[]}(new self::Foo::•());
+  i.{self::IndexTester::[]}(new self::Bar::named());
+  i.{self::IndexTester::[]}(new self::Bar::named());
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
+  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
+  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
+  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
+  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
+}
diff --git a/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect b/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect
new file mode 100644
index 0000000..f455e75
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_new.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/general/implicit_new.dart:31:5: Context: Write to x@522
+  x = prefix.Foo();
+    ^
+pkg/front_end/testcases/general/implicit_new.dart:33:5: Context: Write to z@559
+  z = prefix.Bar.named();
+    ^
+pkg/front_end/testcases/general/implicit_new.dart:39:5: Context: Write to l@682
+  l = [prefix.Foo(), prefix.Bar.named()];
+    ^
+pkg/front_end/testcases/general/implicit_new.dart:41:5: Context: Write to m@756
+  m = {"foo": prefix.Foo(), "bar": prefix.Bar.named()};
+    ^
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart b/pkg/front_end/testcases/general/implicit_scope_test.dart
similarity index 100%
rename from pkg/front_end/testcases/implicit_scope_test.dart
rename to pkg/front_end/testcases/general/implicit_scope_test.dart
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.hierarchy.expect
new file mode 100644
index 0000000..ad35f25
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.hierarchy.expect
@@ -0,0 +1,388 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+ImplicitScopeTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    ImplicitScopeTest.alwaysTrue
+    Object._instanceOf
+    ImplicitScopeTest.testMain
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.expect
new file mode 100644
index 0000000..75ce31e
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.expect
@@ -0,0 +1,49 @@
+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.+(1).==(2);
+  }
+  static method testMain() → dynamic {
+    dynamic a = "foo";
+    dynamic b;
+    if(self::ImplicitScopeTest::alwaysTrue()) {
+      dynamic a = "bar";
+    }
+    else {
+      dynamic b = a;
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    while (!self::ImplicitScopeTest::alwaysTrue()) {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    for (core::int* i = 0; i.<(10); i = i.+(1)) {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    do {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    while ("black".==("white"))
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+  }
+}
+static method main() → dynamic {
+  self::ImplicitScopeTest::testMain();
+}
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..75ce31e
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.legacy.transformed.expect
@@ -0,0 +1,49 @@
+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.+(1).==(2);
+  }
+  static method testMain() → dynamic {
+    dynamic a = "foo";
+    dynamic b;
+    if(self::ImplicitScopeTest::alwaysTrue()) {
+      dynamic a = "bar";
+    }
+    else {
+      dynamic b = a;
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    while (!self::ImplicitScopeTest::alwaysTrue()) {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    for (core::int* i = 0; i.<(10); i = i.+(1)) {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+    do {
+      dynamic a = "bar";
+      dynamic b = "baz";
+    }
+    while ("black".==("white"))
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+  }
+}
+static method main() → dynamic {
+  self::ImplicitScopeTest::testMain();
+}
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.outline.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.outline.expect
new file mode 100644
index 0000000..8a823ce
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.outline.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class ImplicitScopeTest extends core::Object {
+  synthetic constructor •() → self::ImplicitScopeTest*
+    ;
+  static method alwaysTrue() → core::bool*
+    ;
+  static method testMain() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.expect
new file mode 100644
index 0000000..86e1607
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.expect
@@ -0,0 +1,49 @@
+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::==}(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); i = i.{core::num::+}(1)) {
+      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::==}("white"))
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+  }
+}
+static method main() → dynamic {
+  self::ImplicitScopeTest::testMain();
+}
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..86e1607
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+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::==}(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); i = i.{core::num::+}(1)) {
+      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::==}("white"))
+    exp::Expect::equals("foo", a);
+    exp::Expect::equals(null, b);
+  }
+}
+static method main() → dynamic {
+  self::ImplicitScopeTest::testMain();
+}
diff --git a/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect b/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect
new file mode 100644
index 0000000..ab4afb9
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_scope_test.dart.type_promotion.expect
@@ -0,0 +1,3 @@
+pkg/front_end/testcases/general/implicit_scope_test.dart:28:30: Context: Write to i@736
+    for (int i = 0; i < 10; i++) var a = "bar", b = "baz";
+                             ^^
diff --git a/pkg/front_end/testcases/implicit_this.dart b/pkg/front_end/testcases/general/implicit_this.dart
similarity index 100%
rename from pkg/front_end/testcases/implicit_this.dart
rename to pkg/front_end/testcases/general/implicit_this.dart
diff --git a/pkg/front_end/testcases/implicit_this.dart.hierarchy.expect b/pkg/front_end/testcases/general/implicit_this.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/implicit_this.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/implicit_this.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.legacy.expect b/pkg/front_end/testcases/general/implicit_this.dart.legacy.expect
new file mode 100644
index 0000000..a2346fc
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.legacy.expect
@@ -0,0 +1,27 @@
+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}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/implicit_this.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a2346fc
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+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}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().testC();
+  new self::D::•().testD();
+}
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.outline.expect b/pkg/front_end/testcases/general/implicit_this.dart.outline.expect
new file mode 100644
index 0000000..76b8764
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method m() → dynamic
+    ;
+  method testC() → dynamic
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method testD() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.strong.expect b/pkg/front_end/testcases/general/implicit_this.dart.strong.expect
new file mode 100644
index 0000000..25539c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.strong.expect
@@ -0,0 +1,27 @@
+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}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::D::testD}();
+}
diff --git a/pkg/front_end/testcases/general/implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/general/implicit_this.dart.strong.transformed.expect
new file mode 100644
index 0000000..25539c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/implicit_this.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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}();
+  }
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method testD() → dynamic {
+    this.{self::C::m}();
+  }
+}
+static method main() → dynamic {
+  new self::C::•().{self::C::testC}();
+  new self::D::•().{self::D::testD}();
+}
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart
similarity index 100%
rename from pkg/front_end/testcases/incomplete_field_formal_parameter.dart
rename to pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.hierarchy.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/incomplete_field_formal_parameter.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.expect
new file mode 100644
index 0000000..6e84730
--- /dev/null
+++ b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C*
+    : super core::Object::•()
+    ;
+  constructor b() → self::C*
+    : super core::Object::•()
+    ;
+  constructor c() → self::C*
+    : super core::Object::•()
+    ;
+  constructor d() → self::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.transformed.expect
new file mode 100644
index 0000000..6e84730
--- /dev/null
+++ b/pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart.strong.transformed.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
+//   C.a(this);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
+//   C.b(this.);
+//            ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
+//   C.c(this, p);
+//           ^
+//
+// pkg/front_end/testcases/general/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
+//   C.d(this., p);
+//            ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  constructor a() → self::C*
+    : super core::Object::•()
+    ;
+  constructor b() → self::C*
+    : super core::Object::•()
+    ;
+  constructor c() → self::C*
+    : super core::Object::•()
+    ;
+  constructor d() → self::C*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart
similarity index 100%
rename from pkg/front_end/testcases/interface_contravariant_from_class.dart
rename to pkg/front_end/testcases/general/interface_contravariant_from_class.dart
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart.hierarchy.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/interface_contravariant_from_class.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/interface_contravariant_from_class.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.expect
new file mode 100644
index 0000000..ffb8e82
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ffb8e82
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.outline.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.outline.expect
new file mode 100644
index 0000000..34b3c11
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.outline.expect
@@ -0,0 +1,33 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method f(core::int* x) → self::B::T*
+    ;
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    ;
+  abstract method f(core::Object* x) → self::I::T*;
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.expect
new file mode 100644
index 0000000..ffb8e82
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..ffb8e82
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_contravariant_from_class.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart
similarity index 100%
rename from pkg/front_end/testcases/interface_covariantImpl_from_class.dart
rename to pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.hierarchy.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/interface_covariantImpl_from_class.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.expect
new file mode 100644
index 0000000..7cca990
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7cca990
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.outline.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.outline.expect
new file mode 100644
index 0000000..8432152
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.outline.expect
@@ -0,0 +1,33 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method f((self::B::T*) →* void x, core::int* y) → void
+    ;
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    ;
+  abstract method f((self::I::T*) →* void x, core::Object* y) → void;
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.expect
new file mode 100644
index 0000000..7cca990
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..7cca990
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart
similarity index 100%
rename from pkg/front_end/testcases/interface_covariantInterface_from_class.dart
rename to pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.hierarchy.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/interface_covariantInterface_from_class.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.expect
new file mode 100644
index 0000000..abbdcd7
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.expect
@@ -0,0 +1,48 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T* x, core::int* y) → 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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.transformed.expect
new file mode 100644
index 0000000..abbdcd7
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.legacy.transformed.expect
@@ -0,0 +1,48 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T* x, core::int* y) → 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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.outline.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.outline.expect
new file mode 100644
index 0000000..2ddd767
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.outline.expect
@@ -0,0 +1,46 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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*>*
+    ;
+  abstract method f(generic-covariant-impl self::A::T* x, core::int* y) → void;
+}
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
+    ;
+  method f((self::B::T*) →* void x, core::int* y) → void
+    ;
+}
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
+    ;
+  abstract method f((self::I::T*) →* void x, core::Object* y) → void;
+}
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.expect
new file mode 100644
index 0000000..abbdcd7
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.expect
@@ -0,0 +1,48 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T* x, core::int* y) → 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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.transformed.expect
new file mode 100644
index 0000000..abbdcd7
--- /dev/null
+++ b/pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart.strong.transformed.expect
@@ -0,0 +1,48 @@
+library test;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
+// class B<T> implements A<F<T>> {
+//       ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
+// abstract class I<T> implements A<F<T>> {
+//                ^
+//
+// pkg/front_end/testcases/general/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T* x, core::int* y) → 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 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 class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+static method main() → void {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart b/pkg/front_end/testcases/general/invalid_assignment.dart
similarity index 100%
rename from pkg/front_end/testcases/invalid_assignment.dart
rename to pkg/front_end/testcases/general/invalid_assignment.dart
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.hierarchy.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_assignment.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/invalid_assignment.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.expect
new file mode 100644
index 0000000..1b30143
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+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 "";
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic {
+  i = 1;
+  i = s;
+  i.==(null) ? i = 1 : null;
+  i.==(null) ? i = s : null;
+  a = new self::A::•();
+  a = a.+(1);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1b30143
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+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 "";
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic {
+  i = 1;
+  i = s;
+  i.==(null) ? i = 1 : null;
+  i.==(null) ? i = s : null;
+  a = new self::A::•();
+  a = a.+(1);
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.outline.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.outline.expect
new file mode 100644
index 0000000..d31a4b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  operator +(core::int* i) → core::String*
+    ;
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect
new file mode 100644
index 0000000..0085ccf
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.expect
@@ -0,0 +1,49 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
+//   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 "";
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic {
+  i = 1;
+  i = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  i = s;
+      ^" in s as{TypeError} core::int*;
+  i.{core::num::==}(null) ?{core::int*} i = 1 : null;
+  i.{core::num::==}(null) ?{core::Object*} i = let final<BottomType> #t2 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  i ??= s;
+        ^" in s as{TypeError} core::int* : null;
+  a = new self::A::•();
+  a = let final<BottomType> #t3 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
+  a += 1;
+    ^" in a.{self::A::+}(1) as{TypeError} self::A*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect
new file mode 100644
index 0000000..0085ccf
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'A'.
+//   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 "";
+}
+static method test(core::int* i, core::String* s, self::A* a) → dynamic {
+  i = 1;
+  i = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  i = s;
+      ^" in s as{TypeError} core::int*;
+  i.{core::num::==}(null) ?{core::int*} i = 1 : null;
+  i.{core::num::==}(null) ?{core::Object*} i = let final<BottomType> #t2 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  i ??= s;
+        ^" in s as{TypeError} core::int* : null;
+  a = new self::A::•();
+  a = let final<BottomType> #t3 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'A'.
+  a += 1;
+    ^" in a.{self::A::+}(1) as{TypeError} self::A*;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect b/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect
new file mode 100644
index 0000000..9d791cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_assignment.dart.type_promotion.expect
@@ -0,0 +1,18 @@
+pkg/front_end/testcases/general/invalid_assignment.dart:10:5: Context: Write to i@273
+  i = 1;
+    ^
+pkg/front_end/testcases/general/invalid_assignment.dart:11:5: Context: Write to i@273
+  i = s;
+    ^
+pkg/front_end/testcases/general/invalid_assignment.dart:12:5: Context: Write to i@273
+  i ??= 1;
+    ^^^
+pkg/front_end/testcases/general/invalid_assignment.dart:13:5: Context: Write to i@273
+  i ??= s;
+    ^^^
+pkg/front_end/testcases/general/invalid_assignment.dart:14:5: Context: Write to a@288
+  a = new A();
+    ^
+pkg/front_end/testcases/general/invalid_assignment.dart:15:5: Context: Write to a@288
+  a += 1;
+    ^^
diff --git a/pkg/front_end/testcases/invalid_cast.dart b/pkg/front_end/testcases/general/invalid_cast.dart
similarity index 100%
rename from pkg/front_end/testcases/invalid_cast.dart
rename to pkg/front_end/testcases/general/invalid_cast.dart
diff --git a/pkg/front_end/testcases/invalid_cast.dart.hierarchy.expect b/pkg/front_end/testcases/general/invalid_cast.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_cast.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/invalid_cast.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.legacy.expect b/pkg/front_end/testcases/general/invalid_cast.dart.legacy.expect
new file mode 100644
index 0000000..7ab5c3f
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.legacy.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  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*
+    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+  static method staticFunction(core::int* i) → void {}
+}
+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 = <core::Object*>[];
+  core::Map<core::int*, core::String*>* b = <core::Object*, core::String*>{};
+  core::Map<core::int*, core::String*>* c = <core::int*, core::Object*>{};
+  (core::Object*) →* core::int* d = (core::int* i) → dynamic => i;
+  self::D* e = self::C::fact();
+  self::D* f = new self::D::•();
+  self::D* g = new self::C::nonFact();
+  self::D* h = new self::C::nonFact2();
+  (core::Object*) →* void i = #C1;
+  (core::Object*) →* void j = #C2;
+  (core::Object*) →* void k = 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) → dynamic => i;
+  self::D* e = self::C::fact();
+  self::D* f = new self::D::•();
+  self::C* g = new self::C::nonFact();
+  self::C* h = new self::C::nonFact2();
+  (core::int*) →* void i = #C1;
+  (core::int*) →* void j = #C2;
+  (core::int*) →* void k = localFunction;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::C::staticFunction
+  #C2 = tearoff self::topLevelFunction
+}
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/invalid_cast.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7ab5c3f
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.legacy.transformed.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  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*
+    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+  static method staticFunction(core::int* i) → void {}
+}
+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 = <core::Object*>[];
+  core::Map<core::int*, core::String*>* b = <core::Object*, core::String*>{};
+  core::Map<core::int*, core::String*>* c = <core::int*, core::Object*>{};
+  (core::Object*) →* core::int* d = (core::int* i) → dynamic => i;
+  self::D* e = self::C::fact();
+  self::D* f = new self::D::•();
+  self::D* g = new self::C::nonFact();
+  self::D* h = new self::C::nonFact2();
+  (core::Object*) →* void i = #C1;
+  (core::Object*) →* void j = #C2;
+  (core::Object*) →* void k = 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) → dynamic => i;
+  self::D* e = self::C::fact();
+  self::D* f = new self::D::•();
+  self::C* g = new self::C::nonFact();
+  self::C* h = new self::C::nonFact2();
+  (core::int*) →* void i = #C1;
+  (core::int*) →* void j = #C2;
+  (core::int*) →* void k = localFunction;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::C::staticFunction
+  #C2 = tearoff self::topLevelFunction
+}
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.outline.expect b/pkg/front_end/testcases/general/invalid_cast.dart.outline.expect
new file mode 100644
index 0000000..e56195b
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.outline.expect
@@ -0,0 +1,31 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  constructor •() → self::C*
+    ;
+  constructor nonFact() → self::C*
+    ;
+  constructor nonFact2() → self::C*
+    ;
+  static factory fact() → self::C*
+    ;
+  static factory fact2() → self::C*
+    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+  static method staticFunction(core::int* i) → void
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+}
+static method topLevelFunction(core::int* i) → void
+  ;
+static method bad() → dynamic
+  ;
+static method ok() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/general/invalid_cast.dart.strong.expect
new file mode 100644
index 0000000..6c10c2c
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.strong.expect
@@ -0,0 +1,164 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:20: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:21: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:22: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:23: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:26: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:27: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:28: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:29: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:30: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 field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  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*
+    let dynamic #redirecting_factory = self::D::• in invalid-expression;
+  static method staticFunction(core::int* i) → void {}
+}
+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 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:20: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 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:21: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 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:22: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 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:23: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 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:26: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 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:27: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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:28: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 #C1;
+  (core::Object*) →* void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:29: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 #C2;
+  (core::Object*) →* void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:30: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 = #C1;
+  (core::int*) →* void j = #C2;
+  (core::int*) →* void k = localFunction;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::C::staticFunction
+  #C2 = tearoff self::topLevelFunction
+}
diff --git a/pkg/front_end/testcases/general/invalid_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invalid_cast.dart.strong.transformed.expect
new file mode 100644
index 0000000..abeb432
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_cast.dart.strong.transformed.expect
@@ -0,0 +1,164 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/invalid_cast.dart:20: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:21: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:22: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:23: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:26: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:27: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:28: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:29: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:30: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 field dynamic _redirecting# = <dynamic>[self::C::fact2];
+  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*
+    let<BottomType> #redirecting_factory = self::D::• in invalid-expression;
+  static method staticFunction(core::int* i) → void {}
+}
+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 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:20: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 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:21: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 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:22: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 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:23: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 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:26: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 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:27: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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:28: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 #C1;
+  (core::Object*) →* void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:29: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 #C2;
+  (core::Object*) →* void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/general/invalid_cast.dart:30: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 = #C1;
+  (core::int*) →* void j = #C2;
+  (core::int*) →* void k = localFunction;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::C::staticFunction
+  #C2 = tearoff self::topLevelFunction
+}
diff --git a/pkg/front_end/testcases/invalid_type.dart b/pkg/front_end/testcases/general/invalid_type.dart
similarity index 100%
rename from pkg/front_end/testcases/invalid_type.dart
rename to pkg/front_end/testcases/general/invalid_type.dart
diff --git a/pkg/front_end/testcases/invalid_type.dart.hierarchy.expect b/pkg/front_end/testcases/general/invalid_type.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/invalid_type.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/invalid_type.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.legacy.expect b/pkg/front_end/testcases/general/invalid_type.dart.legacy.expect
new file mode 100644
index 0000000..9a71f0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.legacy.expect
@@ -0,0 +1,30 @@
+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: Warning: 'Missing' isn't a type.
+//   (null as Missing).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();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).bar();
+  null.bar();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/invalid_type.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9a71f0b
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.legacy.transformed.expect
@@ -0,0 +1,30 @@
+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: Warning: 'Missing' isn't a type.
+//   (null as Missing).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();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).bar();
+  null.bar();
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.outline.expect b/pkg/front_end/testcases/general/invalid_type.dart.outline.expect
new file mode 100644
index 0000000..4ea9e6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  static method foo() → dynamic
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/invalid_type.dart.strong.expect b/pkg/front_end/testcases/general/invalid_type.dart.strong.expect
new file mode 100644
index 0000000..b405807
--- /dev/null
+++ b/pkg/front_end/testcases/general/invalid_type.dart.strong.expect
@@ -0,0 +1,38 @@
+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();
+    ^^^^".bar();
+  }
+}
+static method test() → dynamic {
+  (null as invalid-type).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();
+       ^^^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invocations.dart b/pkg/front_end/testcases/general/invocations.dart
similarity index 100%
rename from pkg/front_end/testcases/invocations.dart
rename to pkg/front_end/testcases/general/invocations.dart
diff --git a/pkg/front_end/testcases/invocations.dart.legacy.expect b/pkg/front_end/testcases/general/invocations.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/invocations.dart.legacy.expect
rename to pkg/front_end/testcases/general/invocations.dart.legacy.expect
diff --git a/pkg/front_end/testcases/invocations.dart.outline.expect b/pkg/front_end/testcases/general/invocations.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/invocations.dart.outline.expect
rename to pkg/front_end/testcases/general/invocations.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/invocations.dart.strong.expect b/pkg/front_end/testcases/general/invocations.dart.strong.expect
new file mode 100644
index 0000000..390dc20
--- /dev/null
+++ b/pkg/front_end/testcases/general/invocations.dart.strong.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: Getter not found: 'z'.
+//   z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:9:3: Error: Getter not found: 'y'.
+//   y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:10:3: Error: Getter not found: '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: Getter not found: 'z'.
+//       z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:16:7: Error: Getter not found: 'y'.
+//       y.z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:17:7: Error: Getter not found: '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: Getter not found: 'z'.
+  z.print(\"Hello, World!\");
+  ^".print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:9:3: Error: Getter not found: 'y'.
+  y.z.print(\"Hello, World!\");
+  ^".z.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:10:3: Error: Getter not found: 'x'.
+  x.y.z.print(\"Hello, World!\");
+  ^".y.z.print("Hello, World!");
+  1.{core::num::+}(let final<BottomType> #t1 = 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::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:14:7: Error: Method not found: 'z'.
+      z(\"Hello, World!\") +
+      ^" as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:15:7: Error: Getter not found: 'z'.
+      z.print(\"Hello, World!\") +
+      ^".print("Hello, World!") as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:16:7: Error: Getter not found: 'y'.
+      y.z.print(\"Hello, World!\") +
+      ^".z.print("Hello, World!") as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:17:7: Error: Getter not found: 'x'.
+      x.y.z.print(\"Hello, World!\");
+      ^".y.z.print("Hello, World!") as{TypeError} core::num*);
+}
diff --git a/pkg/front_end/testcases/general/invocations.dart.strong.transformed.expect b/pkg/front_end/testcases/general/invocations.dart.strong.transformed.expect
new file mode 100644
index 0000000..390dc20
--- /dev/null
+++ b/pkg/front_end/testcases/general/invocations.dart.strong.transformed.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: Getter not found: 'z'.
+//   z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:9:3: Error: Getter not found: 'y'.
+//   y.z.print("Hello, World!");
+//   ^
+//
+// pkg/front_end/testcases/general/invocations.dart:10:3: Error: Getter not found: '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: Getter not found: 'z'.
+//       z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:16:7: Error: Getter not found: 'y'.
+//       y.z.print("Hello, World!") +
+//       ^
+//
+// pkg/front_end/testcases/general/invocations.dart:17:7: Error: Getter not found: '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: Getter not found: 'z'.
+  z.print(\"Hello, World!\");
+  ^".print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:9:3: Error: Getter not found: 'y'.
+  y.z.print(\"Hello, World!\");
+  ^".z.print("Hello, World!");
+  invalid-expression "pkg/front_end/testcases/general/invocations.dart:10:3: Error: Getter not found: 'x'.
+  x.y.z.print(\"Hello, World!\");
+  ^".y.z.print("Hello, World!");
+  1.{core::num::+}(let final<BottomType> #t1 = 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::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:14:7: Error: Method not found: 'z'.
+      z(\"Hello, World!\") +
+      ^" as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:15:7: Error: Getter not found: 'z'.
+      z.print(\"Hello, World!\") +
+      ^".print("Hello, World!") as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:16:7: Error: Getter not found: 'y'.
+      y.z.print(\"Hello, World!\") +
+      ^".z.print("Hello, World!") as{TypeError} core::num*).{core::num::+}(invalid-expression "pkg/front_end/testcases/general/invocations.dart:17:7: Error: Getter not found: 'x'.
+      x.y.z.print(\"Hello, World!\");
+      ^".y.z.print("Hello, World!") as{TypeError} core::num*);
+}
diff --git a/pkg/front_end/testcases/issue129167943.dart b/pkg/front_end/testcases/general/issue129167943.dart
similarity index 100%
rename from pkg/front_end/testcases/issue129167943.dart
rename to pkg/front_end/testcases/general/issue129167943.dart
diff --git a/pkg/front_end/testcases/issue129167943.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue129167943.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue129167943.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue129167943.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.legacy.expect b/pkg/front_end/testcases/general/issue129167943.dart.legacy.expect
new file mode 100644
index 0000000..e6ff2a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.legacy.expect
@@ -0,0 +1,94 @@
+library;
+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 {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo(core::num* x) → void;
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method foo(covariant 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 core::int* x) → void;
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::num* x) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::num* x) → void;
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    : super core::Object::•()
+    ;
+  set foo(covariant core::int* x) → void {}
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub set foo(covariant 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 core::int* x) → void;
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::num* x) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue129167943.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e6ff2a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.legacy.transformed.expect
@@ -0,0 +1,94 @@
+library;
+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 {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo(core::num* x) → void;
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method foo(covariant 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 core::int* x) → void;
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::num* x) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::num* x) → void;
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    : super core::Object::•()
+    ;
+  set foo(covariant core::int* x) → void {}
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub set foo(covariant 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 core::int* x) → void;
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::num* x) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.outline.expect b/pkg/front_end/testcases/general/issue129167943.dart.outline.expect
new file mode 100644
index 0000000..f8aec80
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.outline.expect
@@ -0,0 +1,82 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+abstract class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  abstract method foo(core::num* x) → void;
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    ;
+  method foo(covariant core::int* x) → void
+    ;
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    ;
+  abstract forwarding-stub method foo(covariant core::num* x) → void;
+}
+abstract class D4 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D4*
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    ;
+  abstract method foo(covariant core::num* x) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    ;
+  abstract set foo(core::num* x) → void;
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    ;
+  set foo(covariant core::int* x) → void
+    ;
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    ;
+  abstract forwarding-stub set foo(covariant core::num* x) → void;
+}
+abstract class H4 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H4*
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    ;
+  abstract set foo(covariant core::num* x) → void;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.strong.expect b/pkg/front_end/testcases/general/issue129167943.dart.strong.expect
new file mode 100644
index 0000000..e6ff2a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.strong.expect
@@ -0,0 +1,94 @@
+library;
+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 {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo(core::num* x) → void;
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method foo(covariant 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 core::int* x) → void;
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::num* x) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::num* x) → void;
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    : super core::Object::•()
+    ;
+  set foo(covariant core::int* x) → void {}
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub set foo(covariant 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 core::int* x) → void;
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::num* x) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue129167943.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue129167943.dart.strong.transformed.expect
new file mode 100644
index 0000000..e6ff2a3
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue129167943.dart.strong.transformed.expect
@@ -0,0 +1,94 @@
+library;
+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 {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+  abstract method foo(core::num* x) → void;
+}
+abstract class C extends core::Object implements self::B {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+abstract class D1 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D1*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::int* x) → void;
+}
+class D2 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D2*
+    : super core::Object::•()
+    ;
+  method foo(covariant core::int* x) → void {}
+}
+abstract class D3 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub method foo(covariant 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 core::int* x) → void;
+}
+abstract class D5 extends core::Object implements self::A, self::C, self::B {
+  synthetic constructor •() → self::D5*
+    : super core::Object::•()
+    ;
+  abstract method foo(covariant core::num* x) → void;
+}
+abstract class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+  abstract set foo(core::num* x) → void;
+}
+abstract class G extends core::Object implements self::E {
+  synthetic constructor •() → self::G*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+abstract class H1 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H1*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::int* x) → void;
+}
+class H2 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H2*
+    : super core::Object::•()
+    ;
+  set foo(covariant core::int* x) → void {}
+}
+abstract class H3 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H3*
+    : super core::Object::•()
+    ;
+  abstract forwarding-stub set foo(covariant 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 core::int* x) → void;
+}
+abstract class H5 extends core::Object implements self::A, self::E, self::G {
+  synthetic constructor •() → self::H5*
+    : super core::Object::•()
+    ;
+  abstract set foo(covariant core::num* x) → void;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue34515.dart b/pkg/front_end/testcases/general/issue34515.dart
similarity index 100%
rename from pkg/front_end/testcases/issue34515.dart
rename to pkg/front_end/testcases/general/issue34515.dart
diff --git a/pkg/front_end/testcases/issue34515.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue34515.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue34515.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue34515.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue34515.dart.legacy.expect b/pkg/front_end/testcases/general/issue34515.dart.legacy.expect
new file mode 100644
index 0000000..b075d04
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.legacy.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue34515.dart:9:3: Warning: '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: Warning: '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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue34515.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue34515.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b075d04
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.legacy.transformed.expect
@@ -0,0 +1,47 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue34515.dart:9:3: Warning: '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: Warning: '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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue34515.dart.outline.expect b/pkg/front_end/testcases/general/issue34515.dart.outline.expect
new file mode 100644
index 0000000..be30f41
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.outline.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+
+import "org-dartlang-testcase:///issue34515_lib1.dart";
+import "org-dartlang-testcase:///issue34515_lib2.dart";
+
+static method test() → void
+  ;
+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*
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue34515.dart.strong.expect b/pkg/front_end/testcases/general/issue34515.dart.strong.expect
new file mode 100644
index 0000000..712a170
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.strong.expect
@@ -0,0 +1,47 @@
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/general/issue34515.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue34515.dart.strong.transformed.expect
new file mode 100644
index 0000000..712a170
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34515.dart.strong.transformed.expect
@@ -0,0 +1,47 @@
+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::•()
+    ;
+}
+
+library;
+import self as self3;
+import "dart:core" as core;
+
+class ImportedClass extends core::Object {
+  constructor •(core::String* a) → self3::ImportedClass*
+    : super core::Object::•()
+    ;
+}
diff --git a/pkg/front_end/testcases/issue34515_lib1.dart b/pkg/front_end/testcases/general/issue34515_lib1.dart
similarity index 100%
rename from pkg/front_end/testcases/issue34515_lib1.dart
rename to pkg/front_end/testcases/general/issue34515_lib1.dart
diff --git a/pkg/front_end/testcases/issue34515_lib2.dart b/pkg/front_end/testcases/general/issue34515_lib2.dart
similarity index 100%
rename from pkg/front_end/testcases/issue34515_lib2.dart
rename to pkg/front_end/testcases/general/issue34515_lib2.dart
diff --git a/pkg/front_end/testcases/issue34899.dart b/pkg/front_end/testcases/general/issue34899.dart
similarity index 100%
rename from pkg/front_end/testcases/issue34899.dart
rename to pkg/front_end/testcases/general/issue34899.dart
diff --git a/pkg/front_end/testcases/issue34899.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue34899.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue34899.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue34899.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue34899.dart.legacy.expect b/pkg/front_end/testcases/general/issue34899.dart.legacy.expect
new file mode 100644
index 0000000..92b3948
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34899.dart.legacy.expect
@@ -0,0 +1,36 @@
+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;
+  generic-covariant-impl 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.quux().then<self::Foo::T*>((dynamic _) → dynamic => this.{self::Foo::t});
+}
+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.qux().then((dynamic baz) → dynamic => this.{self::Bar::corge}(baz)).then((dynamic grault) → dynamic => this.{self::Bar::garply}(grault));
+  method corge(self::Baz* baz) → self::Grault*
+    return null;
+  method garply(self::Grault* grault) → void {}
+}
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    : super core::Object::•()
+    ;
+}
+class Grault extends core::Object {
+  synthetic constructor •() → self::Grault*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue34899.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue34899.dart.legacy.transformed.expect
new file mode 100644
index 0000000..92b3948
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34899.dart.legacy.transformed.expect
@@ -0,0 +1,36 @@
+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;
+  generic-covariant-impl 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.quux().then<self::Foo::T*>((dynamic _) → dynamic => this.{self::Foo::t});
+}
+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.qux().then((dynamic baz) → dynamic => this.{self::Bar::corge}(baz)).then((dynamic grault) → dynamic => this.{self::Bar::garply}(grault));
+  method corge(self::Baz* baz) → self::Grault*
+    return null;
+  method garply(self::Grault* grault) → void {}
+}
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    : super core::Object::•()
+    ;
+}
+class Grault extends core::Object {
+  synthetic constructor •() → self::Grault*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue34899.dart.outline.expect b/pkg/front_end/testcases/general/issue34899.dart.outline.expect
new file mode 100644
index 0000000..be475a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34899.dart.outline.expect
@@ -0,0 +1,34 @@
+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;
+  generic-covariant-impl field self::Foo::T* t;
+  constructor •(() →* asy::Future<dynamic>* quux, self::Foo::T* t) → self::Foo<self::Foo::T*>*
+    ;
+  method call() → asy::Future<self::Foo::T*>*
+    ;
+}
+class Bar extends core::Object {
+  field self::Foo<self::Baz*>* qux;
+  synthetic constructor •() → self::Bar*
+    ;
+  method quuz() → asy::Future<void>*
+    ;
+  method corge(self::Baz* baz) → self::Grault*
+    ;
+  method garply(self::Grault* grault) → void
+    ;
+}
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    ;
+}
+class Grault extends core::Object {
+  synthetic constructor •() → self::Grault*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue34899.dart.strong.expect b/pkg/front_end/testcases/general/issue34899.dart.strong.expect
new file mode 100644
index 0000000..4af1f5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue34899.dart.strong.expect
@@ -0,0 +1,36 @@
+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;
+  generic-covariant-impl 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::then}<self::Foo::T*>((dynamic _) → self::Foo::T* => this.{self::Foo::t});
+}
+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}().{asy::Future::then}<self::Grault*>((self::Baz* baz) → self::Grault* => this.{self::Bar::corge}(baz)).{asy::Future::then}<void>((self::Grault* grault) → void => this.{self::Bar::garply}(grault));
+  method corge(self::Baz* baz) → self::Grault*
+    return null;
+  method garply(self::Grault* grault) → void {}
+}
+class Baz extends core::Object {
+  synthetic constructor •() → self::Baz*
+    : super core::Object::•()
+    ;
+}
+class Grault extends core::Object {
+  synthetic constructor •() → self::Grault*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue35875.dart b/pkg/front_end/testcases/general/issue35875.dart
similarity index 100%
rename from pkg/front_end/testcases/issue35875.dart
rename to pkg/front_end/testcases/general/issue35875.dart
diff --git a/pkg/front_end/testcases/issue35875.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue35875.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue35875.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue35875.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue35875.dart.legacy.expect b/pkg/front_end/testcases/general/issue35875.dart.legacy.expect
new file mode 100644
index 0000000..5d3fe2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.legacy.expect
@@ -0,0 +1,12 @@
+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;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue35875.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue35875.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5d3fe2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.legacy.transformed.expect
@@ -0,0 +1,12 @@
+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;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue35875.dart.outline.expect b/pkg/front_end/testcases/general/issue35875.dart.outline.expect
new file mode 100644
index 0000000..224a7b4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  field core::int* a;
+  constructor •(core::int* a) → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue35875.dart.strong.expect b/pkg/front_end/testcases/general/issue35875.dart.strong.expect
new file mode 100644
index 0000000..5d3fe2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.strong.expect
@@ -0,0 +1,12 @@
+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;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue35875.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue35875.dart.strong.transformed.expect
new file mode 100644
index 0000000..5d3fe2e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue35875.dart.strong.transformed.expect
@@ -0,0 +1,12 @@
+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;
+  }
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37027.dart b/pkg/front_end/testcases/general/issue37027.dart
similarity index 100%
rename from pkg/front_end/testcases/issue37027.dart
rename to pkg/front_end/testcases/general/issue37027.dart
diff --git a/pkg/front_end/testcases/issue37027.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue37027.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue37027.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue37027.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue37027.dart.legacy.expect b/pkg/front_end/testcases/general/issue37027.dart.legacy.expect
new file mode 100644
index 0000000..5d78861
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.legacy.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue37027.dart:6:46: Error: Unexpected token 'if'.
+//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/issue37027.dart:6:27: Error: Unexpected token 'for'.
+//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
+//                           ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::Set<core::int*>* s;
+  constructor •(core::List<core::int*>* ell) → self::C*
+    : self::C::s = <dynamic, dynamic>{}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5d78861
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.legacy.transformed.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue37027.dart:6:46: Error: Unexpected token 'if'.
+//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
+//                                              ^^
+//
+// pkg/front_end/testcases/general/issue37027.dart:6:27: Error: Unexpected token 'for'.
+//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
+//                           ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::Set<core::int*>* s;
+  constructor •(core::List<core::int*>* ell) → self::C*
+    : self::C::s = <dynamic, dynamic>{}, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.outline.expect b/pkg/front_end/testcases/general/issue37027.dart.outline.expect
new file mode 100644
index 0000000..27ec492
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.outline.expect
@@ -0,0 +1,11 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  final field core::Set<core::int*>* s;
+  constructor •(core::List<core::int*>* ell) → self::C*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.expect
new file mode 100644
index 0000000..4789444
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+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})
+          #t1.{core::Set::add}(2.{core::num::*}(e));
+    } =>#t1, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
new file mode 100644
index 0000000..4789444
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37027.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+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})
+          #t1.{core::Set::add}(2.{core::num::*}(e));
+    } =>#t1, super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37381.dart b/pkg/front_end/testcases/general/issue37381.dart
similarity index 100%
rename from pkg/front_end/testcases/issue37381.dart
rename to pkg/front_end/testcases/general/issue37381.dart
diff --git a/pkg/front_end/testcases/issue37381.dart.hierarchy.expect b/pkg/front_end/testcases/general/issue37381.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/issue37381.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/issue37381.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/issue37381.dart.legacy.expect b/pkg/front_end/testcases/general/issue37381.dart.legacy.expect
new file mode 100644
index 0000000..3bea25f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.legacy.expect
@@ -0,0 +1,15 @@
+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.call<self::A::X*>(this);
+}
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::A::•<core::int*>();
+  a.f(<X extends core::Object* = dynamic>(dynamic _) → dynamic => 42);
+}
diff --git a/pkg/front_end/testcases/general/issue37381.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/issue37381.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3bea25f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.legacy.transformed.expect
@@ -0,0 +1,15 @@
+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.call<self::A::X*>(this);
+}
+static method main() → dynamic {
+  self::A<core::num*>* a = new self::A::•<core::int*>();
+  a.f(<X extends core::Object* = dynamic>(dynamic _) → dynamic => 42);
+}
diff --git a/pkg/front_end/testcases/general/issue37381.dart.outline.expect b/pkg/front_end/testcases/general/issue37381.dart.outline.expect
new file mode 100644
index 0000000..e0704ac
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.outline.expect
@@ -0,0 +1,12 @@
+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*>*
+    ;
+  method f<R extends core::Object* = dynamic>(<X extends core::Object* = dynamic>(self::A<X*>*) →* self::A::f::R* f) → self::A::f::R*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue37381.dart.strong.expect b/pkg/front_end/testcases/general/issue37381.dart.strong.expect
new file mode 100644
index 0000000..b5d19ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.strong.expect
@@ -0,0 +1,15 @@
+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.call<self::A::X*>(this);
+}
+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);
+}
diff --git a/pkg/front_end/testcases/general/issue37381.dart.strong.transformed.expect b/pkg/front_end/testcases/general/issue37381.dart.strong.transformed.expect
new file mode 100644
index 0000000..b5d19ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue37381.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+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.call<self::A::X*>(this);
+}
+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);
+}
diff --git a/pkg/front_end/testcases/literals.dart b/pkg/front_end/testcases/general/literals.dart
similarity index 100%
rename from pkg/front_end/testcases/literals.dart
rename to pkg/front_end/testcases/general/literals.dart
diff --git a/pkg/front_end/testcases/general/literals.dart.legacy.expect b/pkg/front_end/testcases/general/literals.dart.legacy.expect
new file mode 100644
index 0000000..5c5acec
--- /dev/null
+++ b/pkg/front_end/testcases/general/literals.dart.legacy.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(<dynamic>["a", "b"]);
+}
+static method testMap() → dynamic {
+  core::print(<dynamic, dynamic>{});
+  core::print(<dynamic, dynamic>{"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/literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/literals.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5c5acec
--- /dev/null
+++ b/pkg/front_end/testcases/general/literals.dart.legacy.transformed.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(<dynamic>["a", "b"]);
+}
+static method testMap() → dynamic {
+  core::print(<dynamic, dynamic>{});
+  core::print(<dynamic, dynamic>{"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/literals.dart.outline.expect b/pkg/front_end/testcases/general/literals.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/literals.dart.outline.expect
rename to pkg/front_end/testcases/general/literals.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/literals.dart.strong.expect b/pkg/front_end/testcases/general/literals.dart.strong.expect
new file mode 100644
index 0000000..8ef3e48
--- /dev/null
+++ b/pkg/front_end/testcases/general/literals.dart.strong.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/literals.dart.strong.transformed.expect b/pkg/front_end/testcases/general/literals.dart.strong.transformed.expect
new file mode 100644
index 0000000..8ef3e48
--- /dev/null
+++ b/pkg/front_end/testcases/general/literals.dart.strong.transformed.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/local_generic_function.dart b/pkg/front_end/testcases/general/local_generic_function.dart
similarity index 100%
rename from pkg/front_end/testcases/local_generic_function.dart
rename to pkg/front_end/testcases/general/local_generic_function.dart
diff --git a/pkg/front_end/testcases/general/local_generic_function.dart.legacy.expect b/pkg/front_end/testcases/general/local_generic_function.dart.legacy.expect
new file mode 100644
index 0000000..27db2cb
--- /dev/null
+++ b/pkg/front_end/testcases/general/local_generic_function.dart.legacy.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.[](0);
+  dynamic x = f.call(<dynamic>[0]);
+}
diff --git a/pkg/front_end/testcases/general/local_generic_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/local_generic_function.dart.legacy.transformed.expect
new file mode 100644
index 0000000..27db2cb
--- /dev/null
+++ b/pkg/front_end/testcases/general/local_generic_function.dart.legacy.transformed.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.[](0);
+  dynamic x = f.call(<dynamic>[0]);
+}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.outline.expect b/pkg/front_end/testcases/general/local_generic_function.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/local_generic_function.dart.outline.expect
rename to pkg/front_end/testcases/general/local_generic_function.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/local_generic_function.dart.strong.expect b/pkg/front_end/testcases/general/local_generic_function.dart.strong.expect
new file mode 100644
index 0000000..487fec1
--- /dev/null
+++ b/pkg/front_end/testcases/general/local_generic_function.dart.strong.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* x = f.call<core::int*>(<core::int*>[0]);
+}
diff --git a/pkg/front_end/testcases/general/local_generic_function.dart.strong.transformed.expect b/pkg/front_end/testcases/general/local_generic_function.dart.strong.transformed.expect
new file mode 100644
index 0000000..487fec1
--- /dev/null
+++ b/pkg/front_end/testcases/general/local_generic_function.dart.strong.transformed.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* x = f.call<core::int*>(<core::int*>[0]);
+}
diff --git a/pkg/front_end/testcases/magic_const.dart b/pkg/front_end/testcases/general/magic_const.dart
similarity index 100%
rename from pkg/front_end/testcases/magic_const.dart
rename to pkg/front_end/testcases/general/magic_const.dart
diff --git a/pkg/front_end/testcases/magic_const.dart.hierarchy.expect b/pkg/front_end/testcases/general/magic_const.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/magic_const.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/magic_const.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/magic_const.dart.legacy.expect b/pkg/front_end/testcases/general/magic_const.dart.legacy.expect
new file mode 100644
index 0000000..baa2e58
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.legacy.expect
@@ -0,0 +1,46 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Can't have a non-constant List literal within a const context.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+// pkg/front_end/testcases/general/magic_const.dart:15:36: Context: While analyzing:
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                    ^
+//
+library;
+//
+// Problems in library:
+//
+// 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();
+//         ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    : super core::Object::•()
+    ;
+}
+static method foo({dynamic a = #C1, dynamic b = #C1, dynamic c = invalid-expression "Can't have a non-constant List literal within a const context."}) → 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 {}
+}
diff --git a/pkg/front_end/testcases/general/magic_const.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/magic_const.dart.legacy.transformed.expect
new file mode 100644
index 0000000..baa2e58
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.legacy.transformed.expect
@@ -0,0 +1,46 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Can't have a non-constant List literal within a const context.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+// pkg/front_end/testcases/general/magic_const.dart:15:36: Context: While analyzing:
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                    ^
+//
+library;
+//
+// Problems in library:
+//
+// 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();
+//         ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    : super core::Object::•()
+    ;
+}
+static method foo({dynamic a = #C1, dynamic b = #C1, dynamic c = invalid-expression "Can't have a non-constant List literal within a const context."}) → 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 {}
+}
diff --git a/pkg/front_end/testcases/general/magic_const.dart.outline.expect b/pkg/front_end/testcases/general/magic_const.dart.outline.expect
new file mode 100644
index 0000000..02428e5
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    ;
+}
+static method foo({dynamic a, dynamic b, dynamic c}) → dynamic
+  ;
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/magic_const.dart.strong.expect b/pkg/front_end/testcases/general/magic_const.dart.strong.expect
new file mode 100644
index 0000000..baa2e58
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.strong.expect
@@ -0,0 +1,46 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Can't have a non-constant List literal within a const context.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+// pkg/front_end/testcases/general/magic_const.dart:15:36: Context: While analyzing:
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                    ^
+//
+library;
+//
+// Problems in library:
+//
+// 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();
+//         ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    : super core::Object::•()
+    ;
+}
+static method foo({dynamic a = #C1, dynamic b = #C1, dynamic c = invalid-expression "Can't have a non-constant List literal within a const context."}) → 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 {}
+}
diff --git a/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
new file mode 100644
index 0000000..baa2e58
--- /dev/null
+++ b/pkg/front_end/testcases/general/magic_const.dart.strong.transformed.expect
@@ -0,0 +1,46 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/magic_const.dart:15:39: Error: Can't have a non-constant List literal within a const context.
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                       ^
+// pkg/front_end/testcases/general/magic_const.dart:15:36: Context: While analyzing:
+// foo({a: Constant(), b: Constant(), c: []}) {}
+//                                    ^
+//
+library;
+//
+// Problems in library:
+//
+// 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();
+//         ^^^^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class Constant extends core::Object {
+  const constructor •() → self::Constant*
+    : super core::Object::•()
+    ;
+}
+class NotConstant extends core::Object {
+  synthetic constructor •() → self::NotConstant*
+    : super core::Object::•()
+    ;
+}
+static method foo({dynamic a = #C1, dynamic b = #C1, dynamic c = invalid-expression "Can't have a non-constant List literal within a const context."}) → 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 {}
+}
diff --git a/pkg/front_end/testcases/many_errors.dart b/pkg/front_end/testcases/general/many_errors.dart
similarity index 100%
rename from pkg/front_end/testcases/many_errors.dart
rename to pkg/front_end/testcases/general/many_errors.dart
diff --git a/pkg/front_end/testcases/many_errors.dart.hierarchy.expect b/pkg/front_end/testcases/general/many_errors.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/many_errors.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/many_errors.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/many_errors.dart.legacy.expect b/pkg/front_end/testcases/general/many_errors.dart.legacy.expect
new file mode 100644
index 0000000..c5df351
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.legacy.expect
@@ -0,0 +1,94 @@
+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: Warning: 'x' is a final instance variable that has already been initialized.
+//   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();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+}
+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.length;
+  }
+}
+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();
+        ^";
+  (let final dynamic #t3 = new self::C::•() in #t3.==(null) ? null : let final dynamic #t4 = #t3.b in #t4.==(null) ? #t3.b = new self::B::•() : #t4).b;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/many_errors.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c5df351
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.legacy.transformed.expect
@@ -0,0 +1,94 @@
+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: Warning: 'x' is a final instance variable that has already been initialized.
+//   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();
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+}
+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.length;
+  }
+}
+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();
+        ^";
+  (let final dynamic #t3 = new self::C::•() in #t3.==(null) ? null : let final dynamic #t4 = #t3.b in #t4.==(null) ? #t3.b = new self::B::•() : #t4).b;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.outline.expect b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
new file mode 100644
index 0000000..27f485d
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.outline.expect
@@ -0,0 +1,62 @@
+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: Warning: 'x' is a final instance variable that has already been initialized.
+//   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();
+//                        ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field dynamic x = null;
+  constructor named1() → self::A*
+    ;
+  const constructor named2() → self::A*
+    : final dynamic #t1 = 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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  field self::B* b;
+  synthetic constructor •() → self::C*
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+}
+external static method foo(core::String* x) → dynamic;
+static method m() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/many_errors.dart.strong.expect b/pkg/front_end/testcases/general/many_errors.dart.strong.expect
new file mode 100644
index 0000000..0f7aef3
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.strong.expect
@@ -0,0 +1,104 @@
+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 has already been initialized.
+//   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 {
+  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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+}
+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};
+  }
+}
+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;
+                           ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/many_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/general/many_errors.dart.strong.transformed.expect
new file mode 100644
index 0000000..0f7aef3
--- /dev/null
+++ b/pkg/front_end/testcases/general/many_errors.dart.strong.transformed.expect
@@ -0,0 +1,104 @@
+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 has already been initialized.
+//   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 {
+  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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  field self::B* b = null;
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+}
+abstract class AbstractClass extends core::Object {
+  const constructor id() → self::AbstractClass*
+    : super core::Object::•()
+    ;
+}
+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};
+  }
+}
+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;
+                           ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/map.dart b/pkg/front_end/testcases/general/map.dart
similarity index 100%
rename from pkg/front_end/testcases/map.dart
rename to pkg/front_end/testcases/general/map.dart
diff --git a/pkg/front_end/testcases/map.dart.legacy.expect b/pkg/front_end/testcases/general/map.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.legacy.expect
rename to pkg/front_end/testcases/general/map.dart.legacy.expect
diff --git a/pkg/front_end/testcases/map.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/map.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/map.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/map.dart.outline.expect b/pkg/front_end/testcases/general/map.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.outline.expect
rename to pkg/front_end/testcases/general/map.dart.outline.expect
diff --git a/pkg/front_end/testcases/map.dart.strong.expect b/pkg/front_end/testcases/general/map.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.strong.expect
rename to pkg/front_end/testcases/general/map.dart.strong.expect
diff --git a/pkg/front_end/testcases/map.dart.strong.transformed.expect b/pkg/front_end/testcases/general/map.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/map.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/map.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/metadata_enum.dart b/pkg/front_end/testcases/general/metadata_enum.dart
similarity index 100%
rename from pkg/front_end/testcases/metadata_enum.dart
rename to pkg/front_end/testcases/general/metadata_enum.dart
diff --git a/pkg/front_end/testcases/metadata_enum.dart.hierarchy.expect b/pkg/front_end/testcases/general/metadata_enum.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_enum.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/metadata_enum.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.legacy.expect b/pkg/front_end/testcases/general/metadata_enum.dart.legacy.expect
new file mode 100644
index 0000000..676b355
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.legacy.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = "E.E1"
+  #C4 = self::E {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "E.E2"
+  #C7 = self::E {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "E.E3"
+  #C10 = self::E {index:#C8, _name:#C9}
+  #C11 = <self::E*>[#C4, #C7, #C10]
+}
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/metadata_enum.dart.legacy.transformed.expect
new file mode 100644
index 0000000..676b355
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.legacy.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = "E.E1"
+  #C4 = self::E {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "E.E2"
+  #C7 = self::E {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "E.E3"
+  #C10 = self::E {index:#C8, _name:#C9}
+  #C11 = <self::E*>[#C4, #C7, #C10]
+}
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
new file mode 100644
index 0000000..7c3363e
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@self::a
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::E*>* values = const <self::E*>[self::E::E1, self::E::E2, self::E::E3];
+  static const field self::E* E1 = const self::E::•(0, "E.E1");
+  static const field self::E* E2 = const self::E::•(1, "E.E2");
+  static const field self::E* E3 = const self::E::•(2, "E.E3");
+  const constructor •(core::int* index, core::String* _name) → self::E*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static const field dynamic a = null;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.strong.expect b/pkg/front_end/testcases/general/metadata_enum.dart.strong.expect
new file mode 100644
index 0000000..676b355
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.strong.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = "E.E1"
+  #C4 = self::E {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "E.E2"
+  #C7 = self::E {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "E.E3"
+  #C10 = self::E {index:#C8, _name:#C9}
+  #C11 = <self::E*>[#C4, #C7, #C10]
+}
diff --git a/pkg/front_end/testcases/general/metadata_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/general/metadata_enum.dart.strong.transformed.expect
new file mode 100644
index 0000000..676b355
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_enum.dart.strong.transformed.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class E extends core::Object {
+  final field core::int* index;
+  final field core::String* _name;
+  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*
+    : self::E::index = index, self::E::_name = _name, super core::Object::•()
+    ;
+  method toString() → core::String*
+    return this.{=self::E::_name};
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 0
+  #C3 = "E.E1"
+  #C4 = self::E {index:#C2, _name:#C3}
+  #C5 = 1
+  #C6 = "E.E2"
+  #C7 = self::E {index:#C5, _name:#C6}
+  #C8 = 2
+  #C9 = "E.E3"
+  #C10 = self::E {index:#C8, _name:#C9}
+  #C11 = <self::E*>[#C4, #C7, #C10]
+}
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart
similarity index 100%
rename from pkg/front_end/testcases/metadata_named_mixin_application.dart
rename to pkg/front_end/testcases/general/metadata_named_mixin_application.dart
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.hierarchy.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/metadata_named_mixin_application.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/metadata_named_mixin_application.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.expect
new file mode 100644
index 0000000..2e68abd
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.expect
@@ -0,0 +1,26 @@
+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::•()
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5cd5635
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.legacy.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class C extends self::D implements self::E {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
new file mode 100644
index 0000000..a8ac55c
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@self::a
+class C = self::D with self::E {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    ;
+}
+static const field dynamic a = null;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.expect
new file mode 100644
index 0000000..2e68abd
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.expect
@@ -0,0 +1,26 @@
+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::•()
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.transformed.expect
new file mode 100644
index 0000000..5cd5635
--- /dev/null
+++ b/pkg/front_end/testcases/general/metadata_named_mixin_application.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+@#C1
+class C extends self::D implements self::E {
+  synthetic constructor •() → self::C*
+    : super self::D::•()
+    ;
+}
+class D extends core::Object {
+  synthetic constructor •() → self::D*
+    : super core::Object::•()
+    ;
+}
+class E extends core::Object {
+  synthetic constructor •() → self::E*
+    : super core::Object::•()
+    ;
+}
+static const field dynamic a = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/micro.dart b/pkg/front_end/testcases/general/micro.dart
similarity index 100%
rename from pkg/front_end/testcases/micro.dart
rename to pkg/front_end/testcases/general/micro.dart
diff --git a/pkg/front_end/testcases/micro.dart.hierarchy.expect b/pkg/front_end/testcases/general/micro.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/micro.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/micro.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/micro.dart.legacy.expect b/pkg/front_end/testcases/general/micro.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/micro.dart.legacy.expect
rename to pkg/front_end/testcases/general/micro.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/micro.dart.outline.expect b/pkg/front_end/testcases/general/micro.dart.outline.expect
new file mode 100644
index 0000000..25eccc4
--- /dev/null
+++ b/pkg/front_end/testcases/general/micro.dart.outline.expect
@@ -0,0 +1,57 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+  method instanceMethod() → dynamic
+    ;
+}
+abstract class ExternalValue extends core::Object {
+  synthetic constructor •() → self::ExternalValue*
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    ;
+  abstract method externalInstanceMethod() → self::ExternalValue*;
+}
+class Box extends core::Object {
+  field dynamic field;
+  synthetic constructor •() → self::Box*
+    ;
+}
+class FinalBox extends core::Object {
+  final field dynamic finalField;
+  constructor •(dynamic finalField) → self::FinalBox*
+    ;
+}
+class SubFinalBox extends self::FinalBox {
+  constructor •(dynamic value) → self::SubFinalBox*
+    ;
+}
+class DynamicReceiver1 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver1*
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic
+    ;
+}
+class DynamicReceiver2 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver2*
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic
+    ;
+}
+static method staticMethod() → dynamic
+  ;
+external static abstract method externalStatic() → core::bool*;
+external static abstract method createBar() → self::Bar*;
+static method stringArgument(dynamic x) → dynamic
+  ;
+static method intArgument(dynamic x) → dynamic
+  ;
+static method makeDynamicCall(dynamic receiver) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/micro.dart.strong.expect b/pkg/front_end/testcases/general/micro.dart.strong.expect
new file mode 100644
index 0000000..8ee6936
--- /dev/null
+++ b/pkg/front_end/testcases/general/micro.dart.strong.expect
@@ -0,0 +1,81 @@
+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 class ExternalValue extends core::Object {
+  synthetic constructor •() → self::ExternalValue*
+    : super core::Object::•()
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method externalInstanceMethod() → self::ExternalValue*;
+}
+class Box extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Box*
+    : super core::Object::•()
+    ;
+}
+class FinalBox extends core::Object {
+  final field dynamic finalField;
+  constructor •(dynamic finalField) → self::FinalBox*
+    : self::FinalBox::finalField = finalField, super core::Object::•()
+    ;
+}
+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 {}
+}
+class DynamicReceiver2 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver2*
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+}
+static method staticMethod() → dynamic {
+  return "sdfg";
+}
+external static abstract method externalStatic() → core::bool*;
+external static abstract method createBar() → self::Bar*;
+static method stringArgument(dynamic x) → dynamic {}
+static method intArgument(dynamic x) → dynamic {}
+static method makeDynamicCall(dynamic receiver) → void {
+  receiver.dynamicallyCalled("sdfg");
+}
+static method main() → dynamic {
+  dynamic x = self::staticMethod();
+  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}();
+  core::bool* z = self::externalStatic();
+  self::ExternalValue* w = self::createBar().{self::Bar::externalInstanceMethod}();
+  self::stringArgument("sdfg");
+  self::intArgument(42);
+  self::Box* box = new self::Box::•();
+  box.{self::Box::field} = "sdfg";
+  dynamic a = box.{self::Box::field};
+  self::FinalBox* finalBox = new self::FinalBox::•("dfg");
+  dynamic b = finalBox.{self::FinalBox::finalField};
+  self::SubFinalBox* subBox = new self::SubFinalBox::•("dfg");
+  dynamic c = subBox.{self::FinalBox::finalField};
+  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);
+}
diff --git a/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect
new file mode 100644
index 0000000..8ee6936
--- /dev/null
+++ b/pkg/front_end/testcases/general/micro.dart.strong.transformed.expect
@@ -0,0 +1,81 @@
+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 class ExternalValue extends core::Object {
+  synthetic constructor •() → self::ExternalValue*
+    : super core::Object::•()
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method externalInstanceMethod() → self::ExternalValue*;
+}
+class Box extends core::Object {
+  field dynamic field = null;
+  synthetic constructor •() → self::Box*
+    : super core::Object::•()
+    ;
+}
+class FinalBox extends core::Object {
+  final field dynamic finalField;
+  constructor •(dynamic finalField) → self::FinalBox*
+    : self::FinalBox::finalField = finalField, super core::Object::•()
+    ;
+}
+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 {}
+}
+class DynamicReceiver2 extends core::Object {
+  synthetic constructor •() → self::DynamicReceiver2*
+    : super core::Object::•()
+    ;
+  method dynamicallyCalled(dynamic x) → dynamic {}
+}
+static method staticMethod() → dynamic {
+  return "sdfg";
+}
+external static abstract method externalStatic() → core::bool*;
+external static abstract method createBar() → self::Bar*;
+static method stringArgument(dynamic x) → dynamic {}
+static method intArgument(dynamic x) → dynamic {}
+static method makeDynamicCall(dynamic receiver) → void {
+  receiver.dynamicallyCalled("sdfg");
+}
+static method main() → dynamic {
+  dynamic x = self::staticMethod();
+  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}();
+  core::bool* z = self::externalStatic();
+  self::ExternalValue* w = self::createBar().{self::Bar::externalInstanceMethod}();
+  self::stringArgument("sdfg");
+  self::intArgument(42);
+  self::Box* box = new self::Box::•();
+  box.{self::Box::field} = "sdfg";
+  dynamic a = box.{self::Box::field};
+  self::FinalBox* finalBox = new self::FinalBox::•("dfg");
+  dynamic b = finalBox.{self::FinalBox::finalField};
+  self::SubFinalBox* subBox = new self::SubFinalBox::•("dfg");
+  dynamic c = subBox.{self::FinalBox::finalField};
+  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);
+}
diff --git a/pkg/front_end/testcases/minimum_int.dart b/pkg/front_end/testcases/general/minimum_int.dart
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart
rename to pkg/front_end/testcases/general/minimum_int.dart
diff --git a/pkg/front_end/testcases/minimum_int.dart.legacy.expect b/pkg/front_end/testcases/general/minimum_int.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.legacy.expect
rename to pkg/front_end/testcases/general/minimum_int.dart.legacy.expect
diff --git a/pkg/front_end/testcases/minimum_int.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/minimum_int.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/minimum_int.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/minimum_int.dart.outline.expect b/pkg/front_end/testcases/general/minimum_int.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.outline.expect
rename to pkg/front_end/testcases/general/minimum_int.dart.outline.expect
diff --git a/pkg/front_end/testcases/minimum_int.dart.strong.expect b/pkg/front_end/testcases/general/minimum_int.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.strong.expect
rename to pkg/front_end/testcases/general/minimum_int.dart.strong.expect
diff --git a/pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect b/pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/minimum_int.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/minimum_int.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/missing_constructor.dart b/pkg/front_end/testcases/general/missing_constructor.dart
similarity index 100%
rename from pkg/front_end/testcases/missing_constructor.dart
rename to pkg/front_end/testcases/general/missing_constructor.dart
diff --git a/pkg/front_end/testcases/missing_constructor.dart.hierarchy.expect b/pkg/front_end/testcases/general/missing_constructor.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/missing_constructor.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/missing_constructor.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/missing_constructor.dart.legacy.expect b/pkg/front_end/testcases/general/missing_constructor.dart.legacy.expect
new file mode 100644
index 0000000..6bdd6a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.legacy.expect
@@ -0,0 +1,81 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
+//   Sub() : super();
+//           ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
+//   Sub.foo() : super.foo();
+//               ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
+//   Bad.foo() : this();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
+//   Bad.bar() : this.baz();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
+//   MixinApplication() : super();
+//                        ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:23:28: Warning: 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::•()
+    ;
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor foo() → self::Sub*
+    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad*
+    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor bar() → self::Bad*
+    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M = self::Super with self::M {
+  synthetic constructor _() → self::_MixinApplication&Super&M*
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication*
+    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor foo() → self::MixinApplication*
+    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #Super
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #Super.foo
+  #C6 = #Bad
+  #C7 = #Bad.baz
+}
diff --git a/pkg/front_end/testcases/general/missing_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/missing_constructor.dart.legacy.transformed.expect
new file mode 100644
index 0000000..61f28dd
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.legacy.transformed.expect
@@ -0,0 +1,81 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
+//   Sub() : super();
+//           ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
+//   Sub.foo() : super.foo();
+//               ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
+//   Bad.foo() : this();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
+//   Bad.bar() : this.baz();
+//               ^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
+//   MixinApplication() : super();
+//                        ^^^^^
+//
+// pkg/front_end/testcases/general/missing_constructor.dart:23:28: Warning: 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::•()
+    ;
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub*
+    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor foo() → self::Sub*
+    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad*
+    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor bar() → self::Bad*
+    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M extends self::Super implements self::M {
+  synthetic constructor _() → self::_MixinApplication&Super&M*
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication*
+    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+  constructor foo() → self::MixinApplication*
+    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))
+    ;
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #Super
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #Super.foo
+  #C6 = #Bad
+  #C7 = #Bad.baz
+}
diff --git a/pkg/front_end/testcases/general/missing_constructor.dart.outline.expect b/pkg/front_end/testcases/general/missing_constructor.dart.outline.expect
new file mode 100644
index 0000000..4436b0d
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.outline.expect
@@ -0,0 +1,37 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Super extends core::Object {
+  constructor _() → self::Super*
+    ;
+}
+class Sub extends self::Super {
+  constructor •() → self::Sub*
+    ;
+  constructor foo() → self::Sub*
+    ;
+}
+class Bad extends core::Object {
+  constructor foo() → self::Bad*
+    ;
+  constructor bar() → self::Bad*
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    ;
+}
+abstract class _MixinApplication&Super&M = self::Super with self::M {
+  synthetic constructor _() → self::_MixinApplication&Super&M*
+    : super self::Super::_()
+    ;
+}
+class MixinApplication extends self::_MixinApplication&Super&M {
+  constructor •() → self::MixinApplication*
+    ;
+  constructor foo() → self::MixinApplication*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/missing_constructor.dart.strong.expect b/pkg/front_end/testcases/general/missing_constructor.dart.strong.expect
new file mode 100644
index 0000000..7d2527a
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.strong.expect
@@ -0,0 +1,83 @@
+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::•()
+    ;
+}
+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();
+              ^^^^"
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M = self::Super with self::M {
+  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_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/general/missing_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..756b1cf
--- /dev/null
+++ b/pkg/front_end/testcases/general/missing_constructor.dart.strong.transformed.expect
@@ -0,0 +1,83 @@
+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::•()
+    ;
+}
+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();
+              ^^^^"
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+abstract class _MixinApplication&Super&M extends self::Super implements self::M {
+  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/mixin.dart b/pkg/front_end/testcases/general/mixin.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin.dart
rename to pkg/front_end/testcases/general/mixin.dart
diff --git a/pkg/front_end/testcases/mixin.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin.dart.legacy.expect b/pkg/front_end/testcases/general/mixin.dart.legacy.expect
new file mode 100644
index 0000000..535d64d1c
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.legacy.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+}
+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 class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+}
+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 class _D&Object&G1<S extends core::Object* = dynamic> = core::Object with self::G1<self::_D&Object&G1::S*> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+}
+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).m();
+  new self::C::•(null).m();
+  new self::D::•<dynamic>().m();
+  new self::D::•<core::int*>().m();
+  new self::D::•<core::List<core::int*>*>().m();
+}
diff --git a/pkg/front_end/testcases/general/mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e06e86b
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.legacy.transformed.expect
@@ -0,0 +1,82 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+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 class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+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 class _D&Object&G1<S extends core::Object* = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S*> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::_D&Object&G1::S*);
+}
+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).m();
+  new self::C::•(null).m();
+  new self::D::•<dynamic>().m();
+  new self::D::•<core::int*>().m();
+  new self::D::•<core::List<core::int*>*>().m();
+}
diff --git a/pkg/front_end/testcases/general/mixin.dart.outline.expect b/pkg/front_end/testcases/general/mixin.dart.outline.expect
new file mode 100644
index 0000000..a53c688
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.outline.expect
@@ -0,0 +1,61 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+}
+class B extends self::_B&Object&M1&M2 {
+  constructor •(dynamic value) → self::B*
+    ;
+}
+abstract class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    ;
+  method m() → dynamic
+    ;
+}
+abstract class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    ;
+  method m() → dynamic
+    ;
+}
+abstract class _C&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+}
+class C extends self::_C&Object&M1&M2 {
+  constructor •(dynamic value) → self::C*
+    ;
+}
+abstract class G1<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G1<self::G1::T*>*
+    ;
+  method m() → dynamic
+    ;
+}
+abstract class _D&Object&G1<S extends core::Object* = dynamic> = core::Object with self::G1<self::_D&Object&G1::S*> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+}
+class D<S extends core::Object* = dynamic> extends self::_D&Object&G1<self::D::S*> {
+  synthetic constructor •() → self::D<self::D::S*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin.dart.strong.expect b/pkg/front_end/testcases/general/mixin.dart.strong.expect
new file mode 100644
index 0000000..4873d85
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.strong.expect
@@ -0,0 +1,72 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+}
+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 class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 = core::Object with self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+}
+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 class _D&Object&G1<S extends core::Object* = dynamic> = core::Object with self::G1<self::_D&Object&G1::S*> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+}
+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::M2::m}();
+  new self::C::•(null).{self::M2::m}();
+  new self::D::•<dynamic>().{self::G1::m}();
+  new self::D::•<core::int*>().{self::G1::m}();
+  new self::D::•<core::List<core::int*>*>().{self::G1::m}();
+}
diff --git a/pkg/front_end/testcases/general/mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin.dart.strong.transformed.expect
new file mode 100644
index 0000000..b36e425
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin.dart.strong.transformed.expect
@@ -0,0 +1,82 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _B&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_B&Object&M1*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_B&Object&M1&M2*
+    : super self::_B&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+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 class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+abstract class _C&Object&M1 extends core::Object implements self::M1 {
+  const synthetic constructor •() → self::_C&Object&M1*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print("M1");
+}
+abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
+  const synthetic constructor •() → self::_C&Object&M1&M2*
+    : super self::_C&Object&M1::•()
+    ;
+  method m() → dynamic
+    return core::print("M2");
+}
+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 class _D&Object&G1<S extends core::Object* = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S*> {
+  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S*>*
+    : super core::Object::•()
+    ;
+  method m() → dynamic
+    return core::print(self::_D&Object&G1::S*);
+}
+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::M2::m}();
+  new self::C::•(null).{self::M2::m}();
+  new self::D::•<dynamic>().{self::G1::m}();
+  new self::D::•<core::int*>().{self::G1::m}();
+  new self::D::•<core::List<core::int*>*>().{self::G1::m}();
+}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart b/pkg/front_end/testcases/general/mixin_application_override.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_application_override.dart
rename to pkg/front_end/testcases/general/mixin_application_override.dart
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_application_override.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin_application_override.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.legacy.expect
new file mode 100644
index 0000000..e49c255
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.legacy.expect
@@ -0,0 +1,351 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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:21:7: Context: Override was introduced in the mixin application class 'A0'.
+// class A0 = S with M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A1'.
+// class A1 = S with M1, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A2'.
+// class A2 = S with M1, M2, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class A0X = S with M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0 extends S with M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1 extends S with M1, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0X extends S with M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+//
+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 {}
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX*
+    : super core::Object::•()
+    ;
+}
+class A0 = self::S with self::M {
+  synthetic constructor •() → self::A0*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A1&S&M1 = self::S with self::M1 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_A0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M*
+    : super self::_A1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M*
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B0&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B1&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+  synthetic constructor •() → self::_B1&S&M1&M*
+    : super self::_B1&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2&S&M1&M2&M*
+    : super self::_B2&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+  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 {
+  synthetic constructor •() → self::_B1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M*
+    : super self::_B1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+  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 {
+  synthetic constructor •() → self::_B2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M*
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+  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_application_override.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7ffefd4
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.legacy.transformed.expect
@@ -0,0 +1,351 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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:21:7: Context: Override was introduced in the mixin application class 'A0'.
+// class A0 = S with M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A1'.
+// class A1 = S with M1, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A2'.
+// class A2 = S with M1, M2, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class A0X = S with M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0 extends S with M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1 extends S with M1, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0X extends S with M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+//
+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 {}
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX*
+    : super core::Object::•()
+    ;
+}
+class A0 extends self::S implements self::M {
+  synthetic constructor •() → self::A0*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A1&S&M1*
+    : super self::S::•()
+    ;
+}
+class A1 extends self::_A1&S&M1 implements self::M {
+  synthetic constructor •() → self::A1*
+    : super self::_A1&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 extends self::_A2&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_A2&S&M1&M2*
+    : super self::_A2&S&M1::•()
+    ;
+}
+class A2 extends self::_A2&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::A2*
+    : super self::_A2&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _A0X&S&M extends self::S implements self::M {
+  synthetic constructor •() → self::_A0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+class A0X extends self::_A0X&S&M implements self::MX {
+  synthetic constructor •() → self::A0X*
+    : super self::_A0X&S&M::•()
+    ;
+}
+abstract class _A1X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M extends self::_A1X&S&M1 implements self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M*
+    : super self::_A1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+class A1X extends self::_A1X&S&M1&M implements self::MX {
+  synthetic constructor •() → self::A1X*
+    : super self::_A1X&S&M1&M::•()
+    ;
+}
+abstract class _A2X&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_A2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 extends self::_A2X&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_A2X&S&M1&M2*
+    : super self::_A2X&S&M1::•()
+    ;
+}
+abstract class _A2X&S&M1&M2&M extends self::_A2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M*
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+class A2X extends self::_A2X&S&M1&M2&M implements self::MX {
+  synthetic constructor •() → self::A2X*
+    : super self::_A2X&S&M1&M2&M::•()
+    ;
+}
+abstract class _B0&S&M extends self::S implements self::M {
+  synthetic constructor •() → self::_B0&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0*
+    : super self::_B0&S&M::•()
+    ;
+}
+abstract class _B1&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B1&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M extends self::_B1&S&M1 implements self::M {
+  synthetic constructor •() → self::_B1&S&M1&M*
+    : super self::_B1&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1*
+    : super self::_B1&S&M1&M::•()
+    ;
+}
+abstract class _B2&S&M1 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 extends self::_B2&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_B2&S&M1&M2*
+    : super self::_B2&S&M1::•()
+    ;
+}
+abstract class _B2&S&M1&M2&M extends self::_B2&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_B2&S&M1&M2&M*
+    : super self::_B2&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+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 extends self::S implements self::M {
+  synthetic constructor •() → self::_B0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B0X&S&M&MX extends self::_B0X&S&M implements self::MX {
+  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 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M extends self::_B1X&S&M1 implements self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M*
+    : super self::_B1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B1X&S&M1&M&MX extends self::_B1X&S&M1&M implements self::MX {
+  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 extends self::S implements self::M1 {
+  synthetic constructor •() → self::_B2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 extends self::_B2X&S&M1 implements self::M2 {
+  synthetic constructor •() → self::_B2X&S&M1&M2*
+    : super self::_B2X&S&M1::•()
+    ;
+}
+abstract class _B2X&S&M1&M2&M extends self::_B2X&S&M1&M2 implements self::M {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M*
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = #C1]) → dynamic;
+}
+abstract class _B2X&S&M1&M2&M&MX extends self::_B2X&S&M1&M2&M implements self::MX {
+  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_application_override.dart.outline.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
new file mode 100644
index 0000000..fd825b0
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.outline.expect
@@ -0,0 +1,339 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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:21:7: Context: Override was introduced in the mixin application class 'A0'.
+// class A0 = S with M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A1'.
+// class A1 = S with M1, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced in the mixin application class 'A2'.
+// class A2 = S with M1, M2, M;
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class A0X = S with M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0 extends S with M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1 extends S with M1, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0X extends S with M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/general/mixin_application_override.dart:12:3: Warning: 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: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class S extends core::Object {
+  synthetic constructor •() → self::S*
+    ;
+  method foo([dynamic x]) → dynamic
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    ;
+  method foo() → dynamic
+    ;
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX*
+    ;
+}
+class A0 = self::S with self::M {
+  synthetic constructor •() → self::A0*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _A1&S&M1 = self::S with self::M1 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _A0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_A0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M*
+    : super self::_A1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M*
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B0&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+class B0 extends self::_B0&S&M {
+  synthetic constructor •() → self::B0*
+    ;
+}
+abstract class _B1&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B1&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+  synthetic constructor •() → self::_B1&S&M1&M*
+    : super self::_B1&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+class B1 extends self::_B1&S&M1&M {
+  synthetic constructor •() → self::B1*
+    ;
+}
+abstract class _B2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2&S&M1&M2&M*
+    : super self::_B2&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+class B2 extends self::_B2&S&M1&M2&M {
+  synthetic constructor •() → self::B2*
+    ;
+}
+abstract class _B0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_B0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+  synthetic constructor •() → self::_B0X&S&M&MX*
+    : super self::_B0X&S&M::•()
+    ;
+}
+class B0X extends self::_B0X&S&M&MX {
+  synthetic constructor •() → self::B0X*
+    ;
+}
+abstract class _B1X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M*
+    : super self::_B1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+  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*
+    ;
+}
+abstract class _B2X&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_B2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M*
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x]) → dynamic;
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+  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*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
new file mode 100644
index 0000000..2e3a3bf
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_application_override.dart.strong.expect
@@ -0,0 +1,347 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
+// class A0 = S with M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
+// class A1 = S with M1, M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
+// class A2 = S with M1, M2, M;
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class A0X = S with M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class A1X = S with M1, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class A2X = S with M1, M2, M, MX;
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0 extends S with M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1 extends S with M1, M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2 extends S with M1, M2, M {}
+//       ^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
+// class B0X extends S with M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
+// class B1X extends S with M1, M, MX {}
+//       ^^^
+//
+// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
+//   foo() {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
+//   foo([x]) {}
+//   ^
+// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
+// class B2X extends S with M1, M2, M, MX {}
+//       ^^^
+//
+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 = null]) → dynamic {}
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+class M1 extends core::Object {
+  synthetic constructor •() → self::M1*
+    : super core::Object::•()
+    ;
+}
+class M2 extends core::Object {
+  synthetic constructor •() → self::M2*
+    : super core::Object::•()
+    ;
+}
+class MX extends core::Object {
+  synthetic constructor •() → self::MX*
+    : super core::Object::•()
+    ;
+}
+class A0 = self::S with self::M {
+  synthetic constructor •() → self::A0*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _A1&S&M1 = self::S with self::M1 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _A2&S&M1 = self::S with self::M1 {
+  synthetic constructor •() → self::_A2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
+  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::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _A0X&S&M = self::S with self::M {
+  synthetic constructor •() → self::_A0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
+  synthetic constructor •() → self::_A1X&S&M1&M*
+    : super self::_A1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_A2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_A2X&S&M1&M2&M*
+    : super self::_A2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B0&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B1&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
+  synthetic constructor •() → self::_B1&S&M1&M*
+    : super self::_B1&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B2&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2&S&M1&M2&M*
+    : super self::_B2&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+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 {
+  synthetic constructor •() → self::_B0X&S&M*
+    : super self::S::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
+  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 {
+  synthetic constructor •() → self::_B1X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
+  synthetic constructor •() → self::_B1X&S&M1&M*
+    : super self::_B1X&S&M1::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
+  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 {
+  synthetic constructor •() → self::_B2X&S&M1*
+    : super self::S::•()
+    ;
+}
+abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
+  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 {
+  synthetic constructor •() → self::_B2X&S&M1&M2&M*
+    : super self::_B2X&S&M1&M2::•()
+    ;
+  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
+}
+abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
+  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 {}
diff --git a/pkg/front_end/testcases/mixin_conflicts.dart b/pkg/front_end/testcases/general/mixin_conflicts.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_conflicts.dart
rename to pkg/front_end/testcases/general/mixin_conflicts.dart
diff --git a/pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_conflicts.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin_conflicts.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin_conflicts.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.legacy.expect
new file mode 100644
index 0000000..b4e3d5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.legacy.expect
@@ -0,0 +1,93 @@
+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 {}
+}
+class N = core::Object with self::M {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&N = core::Object with self::N {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
+class N2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+}
+abstract class N3 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+}
+abstract class _C2&Object&M2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+}
+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_conflicts.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.legacy.transformed.expect
new file mode 100644
index 0000000..dcb89f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.legacy.transformed.expect
@@ -0,0 +1,99 @@
+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 {}
+}
+class N extends core::Object implements self::M {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _C&Object&N extends core::Object implements self::N {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+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 {}
+}
+class N2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+abstract class N3 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+abstract class _C2&Object&M2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+class C2 extends self::_C2&Object&M2 {
+  synthetic constructor •() → self::C2*
+    : super self::_C2&Object&M2::•()
+    ;
+}
+abstract class _C3&Object&M2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+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_conflicts.dart.outline.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.outline.expect
new file mode 100644
index 0000000..f5bee66
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.outline.expect
@@ -0,0 +1,91 @@
+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*
+    ;
+  method foo() → dynamic
+    ;
+}
+class N = core::Object with self::M {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&N = core::Object with self::N {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+}
+class C extends self::_C&Object&N {
+  synthetic constructor •() → self::C*
+    ;
+}
+abstract class M2 extends core::Object implements self::M {
+  synthetic constructor •() → self::M2*
+    ;
+  method bar() → dynamic
+    ;
+}
+class N2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+}
+abstract class N3 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+}
+abstract class _C2&Object&M2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+}
+class C2 extends self::_C2&Object&M2 {
+  synthetic constructor •() → self::C2*
+    ;
+}
+abstract class _C3&Object&M2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+}
+abstract class C3 extends self::_C3&Object&M2 {
+  synthetic constructor •() → self::C3*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_conflicts.dart.strong.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.strong.expect
new file mode 100644
index 0000000..b4e3d5a
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.strong.expect
@@ -0,0 +1,93 @@
+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 {}
+}
+class N = core::Object with self::M {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+}
+abstract class _C&Object&N = core::Object with self::N {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+}
+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 {}
+}
+class N2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+}
+abstract class N3 = core::Object with self::M2 {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+}
+abstract class _C2&Object&M2 = core::Object with self::M2 {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+}
+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 {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+}
+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_conflicts.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_conflicts.dart.strong.transformed.expect
new file mode 100644
index 0000000..dcb89f0
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_conflicts.dart.strong.transformed.expect
@@ -0,0 +1,99 @@
+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 {}
+}
+class N extends core::Object implements self::M {
+  const synthetic constructor •() → self::N*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+abstract class _C&Object&N extends core::Object implements self::N {
+  const synthetic constructor •() → self::_C&Object&N*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {}
+}
+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 {}
+}
+class N2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::N2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+abstract class N3 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::N3*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+abstract class _C2&Object&M2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::_C2&Object&M2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+class C2 extends self::_C2&Object&M2 {
+  synthetic constructor •() → self::C2*
+    : super self::_C2&Object&M2::•()
+    ;
+}
+abstract class _C3&Object&M2 extends core::Object implements self::M2 {
+  const synthetic constructor •() → self::_C3&Object&M2*
+    : super core::Object::•()
+    ;
+  method bar() → dynamic {}
+}
+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/mixin_constructors_with_default_values.dart b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_constructors_with_default_values.dart
rename to pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.hierarchy.expect
new file mode 100644
index 0000000..56e565b
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.hierarchy.expect
@@ -0,0 +1,543 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+C:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    C.trace
+
+M:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+D:
+  superclasses:
+    Object
+      -> C<String>
+  interfaces: M
+  classMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    C.trace
+  interfaceMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+    C.trace
+
+E:
+  superclasses:
+    Object
+      -> C<String>
+        -> D
+  interfaces: M
+  classMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    C.trace
+  interfaceMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+    C.trace
+
+C<int> with M:
+  superclasses:
+    Object
+      -> C<int>
+  interfaces: M
+  classMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    C.trace
+  interfaceMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+    C.trace
+
+F:
+  superclasses:
+    Object
+      -> C<int>
+        -> _F&C&M
+  interfaces: M
+  classMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    C.trace
+  interfaceMembers:
+    C.trace
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  interfaceSetters:
+    C.trace
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.expect
new file mode 100644
index 0000000..b5aaab3
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.expect
@@ -0,0 +1,61 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:12: Context: While analyzing:
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//            ^
+//
+library;
+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 = invalid-expression "The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed."}) → self::C<self::C::T*>*
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → 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*>().trace);
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
+}
+
+constants  {
+  #C1 = 0
+  #C2 = TypeLiteralConstant(dart.core::String*)
+  #C3 = TypeLiteralConstant(dart.core::int*)
+}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1dd355e
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.legacy.transformed.expect
@@ -0,0 +1,61 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:12: Context: While analyzing:
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//            ^
+//
+library;
+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 = invalid-expression "The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed."}) → self::C<self::C::T*>*
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+class D extends self::C<core::String*> implements 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 extends self::C<core::int*> implements self::M {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → 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*>().trace);
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
+}
+
+constants  {
+  #C1 = 0
+  #C2 = TypeLiteralConstant(dart.core::String*)
+  #C3 = TypeLiteralConstant(dart.core::int*)
+}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.outline.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.outline.expect
new file mode 100644
index 0000000..7c8f4ee
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.outline.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field core::String* trace;
+  constructor •({dynamic a, dynamic b}) → self::C<self::C::T*>*
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    ;
+}
+class D = self::C<core::String*> with self::M {
+  synthetic constructor •({dynamic a, dynamic b}) → self::D*
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    ;
+}
+abstract class _F&C&M = self::C<core::int*> with self::M {
+  synthetic constructor •({dynamic a, dynamic b}) → self::_F&C&M*
+    : super self::C::•(a: a, b: b)
+    ;
+}
+class F extends self::_F&C&M {
+  synthetic constructor •() → self::F*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
new file mode 100644
index 0000000..9e85373
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.expect
@@ -0,0 +1,61 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:12: Context: While analyzing:
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//            ^
+//
+library;
+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 = invalid-expression "The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed."}) → self::C<self::C::T*>*
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+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 {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → 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});
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = TypeLiteralConstant(dart.core::String*)
+  #C3 = TypeLiteralConstant(dart.core::int*)
+}
diff --git a/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
new file mode 100644
index 0000000..91cecbd
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart.strong.transformed.expect
@@ -0,0 +1,61 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:15: Error: The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed.
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//               ^
+// pkg/front_end/testcases/general/mixin_constructors_with_default_values.dart:9:12: Context: While analyzing:
+//   C({a: 0, b: T}) : trace = "a: $a, b: $b";
+//            ^
+//
+library;
+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 = invalid-expression "The type 'T' is not a constant because it depends on a type parameter, only instantiated types are allowed."}) → self::C<self::C::T*>*
+    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+}
+class D extends self::C<core::String*> implements 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 extends self::C<core::int*> implements self::M {
+  synthetic constructor •({dynamic a = #C1, dynamic b = #C3}) → 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});
+  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace});
+  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = TypeLiteralConstant(dart.core::String*)
+  #C3 = TypeLiteralConstant(dart.core::int*)
+}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart
rename to pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
new file mode 100644
index 0000000..eab87d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class C<T extends self::A* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* _field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::C::T* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+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*> {
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+}
+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 {
+  dynamic foo = new self::Foo::•();
+  foo.foo(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
new file mode 100644
index 0000000..fc31836
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.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::•()
+    ;
+}
+class C<T extends self::A* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* _field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::C::T* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+class D extends self::C<self::B*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+abstract class _Foo&Object&C extends core::Object implements self::C<self::B*> {
+  generic-covariant-impl field self::B* _field = null;
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::B* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+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 {
+  dynamic foo = new self::Foo::•();
+  foo.foo(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
new file mode 100644
index 0000000..485f78a
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class C<T extends self::A* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* _field;
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+  method foo(generic-covariant-impl self::C::T* x) → dynamic
+    ;
+}
+class D extends self::C<self::B*> {
+  synthetic constructor •() → self::D*
+    ;
+}
+abstract class _Foo&Object&C = core::Object with self::C<self::B*> {
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+}
+class Foo extends self::_Foo&Object&C {
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
new file mode 100644
index 0000000..9081947
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    : super core::Object::•()
+    ;
+}
+class C<T extends self::A* = self::A*> extends core::Object {
+  generic-covariant-impl field self::C::T* _field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::C::T* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+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*> {
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+}
+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::C::foo}(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
new file mode 100644
index 0000000..8d92589
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.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::•()
+    ;
+}
+class C<T extends self::A* = self::A*> extends core::Object {
+  generic-covariant-impl field self::C::T* _field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::C::T* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+class D extends self::C<self::B*> {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+}
+abstract class _Foo&Object&C extends core::Object implements self::C<self::B*> {
+  generic-covariant-impl field self::B* _field = null;
+  synthetic constructor •() → self::_Foo&Object&C*
+    : super core::Object::•()
+    ;
+  method foo(generic-covariant-impl self::B* x) → dynamic {
+    this.{self::C::_field} = x;
+  }
+}
+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::C::foo}(new self::B::•());
+}
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart b/pkg/front_end/testcases/general/mixin_super_repeated.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_super_repeated.dart
rename to pkg/front_end/testcases/general/mixin_super_repeated.dart
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_super_repeated.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin_super_repeated.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.expect
new file mode 100644
index 0000000..ed03d39
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.expect
@@ -0,0 +1,51 @@
+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 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 class _Named&S&M = self::S with self::M {
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+}
+abstract class _Named&S&M&N = self::_Named&S&M with self::N {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+}
+class Named = self::_Named&S&M&N with self::M {
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+}
+static method main() → dynamic {
+  self::Named* named = new self::Named::•();
+  named.m = 42;
+  named.superM = 87;
+  if(!named.m.==(42)) {
+    throw "Bad mixin translation of set:superM";
+  }
+  if(!named.superM.==(87)) {
+    throw "Bad mixin translation of get:superM";
+  }
+}
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2ac6392
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.legacy.transformed.expect
@@ -0,0 +1,58 @@
+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 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 class _Named&S&M extends self::S implements self::M {
+  field dynamic m = null;
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+}
+abstract class _Named&S&M&N extends self::_Named&S&M implements self::N {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+  set superM(dynamic value) → void {
+    super.{self::M::m} = value;
+  }
+  get superM() → dynamic
+    return super.{self::M::m};
+}
+class Named extends self::_Named&S&M&N implements self::M {
+  field dynamic m = null;
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+}
+static method main() → dynamic {
+  self::Named* named = new self::Named::•();
+  named.m = 42;
+  named.superM = 87;
+  if(!named.m.==(42)) {
+    throw "Bad mixin translation of set:superM";
+  }
+  if(!named.superM.==(87)) {
+    throw "Bad mixin translation of get:superM";
+  }
+}
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.outline.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.outline.expect
new file mode 100644
index 0000000..7e6110b
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class M extends core::Object {
+  field dynamic m;
+  synthetic constructor •() → self::M*
+    ;
+}
+abstract class N extends self::M {
+  synthetic constructor •() → self::N*
+    ;
+  set superM(dynamic value) → void
+    ;
+  get superM() → dynamic
+    ;
+}
+class S extends core::Object {
+  synthetic constructor •() → self::S*
+    ;
+}
+abstract class _Named&S&M = self::S with self::M {
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+}
+abstract class _Named&S&M&N = self::_Named&S&M with self::N {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+}
+class Named = self::_Named&S&M&N with self::M {
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.expect
new file mode 100644
index 0000000..1dc8051
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.expect
@@ -0,0 +1,51 @@
+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 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 class _Named&S&M = self::S with self::M {
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+}
+abstract class _Named&S&M&N = self::_Named&S&M with self::N {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+}
+class Named = self::_Named&S&M&N with self::M {
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+}
+static method main() → dynamic {
+  self::Named* named = new self::Named::•();
+  named.{self::M::m} = 42;
+  named.{self::N::superM} = 87;
+  if(!named.{self::M::m}.{core::Object::==}(42)) {
+    throw "Bad mixin translation of set:superM";
+  }
+  if(!named.{self::N::superM}.{core::Object::==}(87)) {
+    throw "Bad mixin translation of get:superM";
+  }
+}
diff --git a/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.transformed.expect
new file mode 100644
index 0000000..14cb42d
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_super_repeated.dart.strong.transformed.expect
@@ -0,0 +1,58 @@
+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 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 class _Named&S&M extends self::S implements self::M {
+  field dynamic m = null;
+  synthetic constructor •() → self::_Named&S&M*
+    : super self::S::•()
+    ;
+}
+abstract class _Named&S&M&N extends self::_Named&S&M implements self::N {
+  synthetic constructor •() → self::_Named&S&M&N*
+    : super self::_Named&S&M::•()
+    ;
+  set superM(dynamic value) → void {
+    super.{self::M::m} = value;
+  }
+  get superM() → dynamic
+    return super.{self::M::m};
+}
+class Named extends self::_Named&S&M&N implements self::M {
+  field dynamic m = null;
+  synthetic constructor •() → self::Named*
+    : super self::_Named&S&M&N::•()
+    ;
+}
+static method main() → dynamic {
+  self::Named* named = new self::Named::•();
+  named.{self::M::m} = 42;
+  named.{self::N::superM} = 87;
+  if(!named.{self::M::m}.{core::Object::==}(42)) {
+    throw "Bad mixin translation of set:superM";
+  }
+  if(!named.{self::N::superM}.{core::Object::==}(87)) {
+    throw "Bad mixin translation of get:superM";
+  }
+}
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart b/pkg/front_end/testcases/general/mixin_with_static_member.dart
similarity index 100%
rename from pkg/front_end/testcases/mixin_with_static_member.dart
rename to pkg/front_end/testcases/general/mixin_with_static_member.dart
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.hierarchy.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/mixin_with_static_member.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/mixin_with_static_member.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.expect
new file mode 100644
index 0000000..a6968d3
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M = self::B with self::M {
+  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::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a732858
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.legacy.transformed.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M extends self::B implements self::M {
+  synthetic constructor •() → self::_A&B&M*
+    : super self::B::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+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::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.outline.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.outline.expect
new file mode 100644
index 0000000..c82f01d
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M = self::B with self::M {
+  synthetic constructor •() → self::_A&B&M*
+    : super self::B::•()
+    ;
+}
+class A extends self::_A&B&M {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  final field core::Object* m;
+  synthetic constructor •() → self::B*
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    ;
+  static method m() → core::Object*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.expect
new file mode 100644
index 0000000..a6968d3
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M = self::B with self::M {
+  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::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect
new file mode 100644
index 0000000..a732858
--- /dev/null
+++ b/pkg/front_end/testcases/general/mixin_with_static_member.dart.strong.transformed.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class _A&B&M extends self::B implements self::M {
+  synthetic constructor •() → self::_A&B&M*
+    : super self::B::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+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::•()
+    ;
+}
+class M extends core::Object {
+  synthetic constructor •() → self::M*
+    : super core::Object::•()
+    ;
+  static method m() → core::Object*
+    return null;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/named_function_scope.dart b/pkg/front_end/testcases/general/named_function_scope.dart
similarity index 100%
rename from pkg/front_end/testcases/named_function_scope.dart
rename to pkg/front_end/testcases/general/named_function_scope.dart
diff --git a/pkg/front_end/testcases/named_function_scope.dart.hierarchy.expect b/pkg/front_end/testcases/general/named_function_scope.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/named_function_scope.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/named_function_scope.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.legacy.expect b/pkg/front_end/testcases/general/named_function_scope.dart.legacy.expect
new file mode 100644
index 0000000..d782aee
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.legacy.expect
@@ -0,0 +1,175 @@
+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: Warning: '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::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T* t;
+  self::V* v;
+  {
+    function T() → dynamic {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T* t;
+    dynamic x = let final () →* dynamic T = () → dynamic {} in T;
+  }
+  {
+    self::V* v;
+    dynamic 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;
+    dynamic V = let final<BottomType> #t1 = 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;
+  }
+  {
+    dynamic x = let final dynamic #t2 = 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 () →* self::T* T = () → self::T* {} 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;
+      ^";
+  }
+  {
+    dynamic x = let final dynamic #t3 = 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>() →* dynamic T = <T extends core::Object* = dynamic>() → dynamic {} 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_function_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/named_function_scope.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d782aee
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.legacy.transformed.expect
@@ -0,0 +1,175 @@
+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: Warning: '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::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T* t;
+  self::V* v;
+  {
+    function T() → dynamic {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T* t;
+    dynamic x = let final () →* dynamic T = () → dynamic {} in T;
+  }
+  {
+    self::V* v;
+    dynamic 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;
+    dynamic V = let final<BottomType> #t1 = 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;
+  }
+  {
+    dynamic x = let final dynamic #t2 = 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 () →* self::T* T = () → self::T* {} 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;
+      ^";
+  }
+  {
+    dynamic x = let final dynamic #t3 = 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>() →* dynamic T = <T extends core::Object* = dynamic>() → dynamic {} 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_function_scope.dart.outline.expect b/pkg/front_end/testcases/general/named_function_scope.dart.outline.expect
new file mode 100644
index 0000000..c5ead68
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.outline.expect
@@ -0,0 +1,16 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class T extends core::Object {
+  synthetic constructor •() → self::T*
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
new file mode 100644
index 0000000..982626e
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.expect
@@ -0,0 +1,175 @@
+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::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T* t;
+  self::V* v;
+  {
+    function T() → core::Null* {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T* t;
+    () →* core::Null* x = let final () →* core::Null* T = () → core::Null* {} in T;
+  }
+  {
+    self::V* v;
+    dynamic 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;
+    dynamic V = let final<BottomType> #t1 = 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;
+  }
+  {
+    dynamic x = let final dynamic #t2 = 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 () →* self::T* T = () → self::T* {} 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;
+      ^" as{TypeError} self::V*;
+  }
+  {
+    dynamic x = let final dynamic #t3 = 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>() →* dynamic T = <T extends core::Object* = dynamic>() → dynamic {} 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_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
new file mode 100644
index 0000000..982626e
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_function_scope.dart.strong.transformed.expect
@@ -0,0 +1,175 @@
+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::•()
+    ;
+}
+class V extends core::Object {
+  synthetic constructor •() → self::V*
+    : super core::Object::•()
+    ;
+}
+static method test() → dynamic {
+  self::T* t;
+  self::V* v;
+  {
+    function T() → core::Null* {}
+  }
+  {
+    dynamic v;
+  }
+  {
+    self::T* t;
+    () →* core::Null* x = let final () →* core::Null* T = () → core::Null* {} in T;
+  }
+  {
+    self::V* v;
+    dynamic 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;
+    dynamic V = let final<BottomType> #t1 = 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;
+  }
+  {
+    dynamic x = let final dynamic #t2 = 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 () →* self::T* T = () → self::T* {} 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;
+      ^" as{TypeError} self::V*;
+  }
+  {
+    dynamic x = let final dynamic #t3 = 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>() →* dynamic T = <T extends core::Object* = dynamic>() → dynamic {} 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/named_parameters.dart b/pkg/front_end/testcases/general/named_parameters.dart
similarity index 100%
rename from pkg/front_end/testcases/named_parameters.dart
rename to pkg/front_end/testcases/general/named_parameters.dart
diff --git a/pkg/front_end/testcases/named_parameters.dart.hierarchy.expect b/pkg/front_end/testcases/general/named_parameters.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/named_parameters.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/named_parameters.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/named_parameters.dart.legacy.expect b/pkg/front_end/testcases/general/named_parameters.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/named_parameters.dart.legacy.expect
rename to pkg/front_end/testcases/general/named_parameters.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/named_parameters.dart.outline.expect b/pkg/front_end/testcases/general/named_parameters.dart.outline.expect
new file mode 100644
index 0000000..a4a710f
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_parameters.dart.outline.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Superclass extends core::Object {
+  synthetic constructor •() → self::Superclass*
+    ;
+  method foo({dynamic alpha, dynamic beta}) → dynamic
+    ;
+  method bar({dynamic beta, dynamic alpha}) → dynamic
+    ;
+  method namedCallback(({alpha: core::String*, beta: core::int*}) →* dynamic callback) → dynamic
+    ;
+}
+class Subclass extends self::Superclass {
+  synthetic constructor •() → self::Subclass*
+    ;
+  method foo({dynamic beta, dynamic alpha}) → dynamic
+    ;
+  method bar({dynamic alpha, dynamic beta}) → dynamic
+    ;
+  method namedCallback(({alpha: core::String*, beta: core::int*}) →* dynamic callback) → dynamic
+    ;
+}
+static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma, dynamic delta}) → dynamic
+  ;
+static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma, dynamic delta]) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/named_parameters.dart.strong.expect b/pkg/front_end/testcases/general/named_parameters.dart.strong.expect
new file mode 100644
index 0000000..3219f16
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_parameters.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+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.call(alpha: "one", beta: 2);
+    callback.call(beta: 1, alpha: "two");
+  }
+}
+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);
+  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
+  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/named_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/named_parameters.dart.strong.transformed.expect
new file mode 100644
index 0000000..3219f16
--- /dev/null
+++ b/pkg/front_end/testcases/general/named_parameters.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+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.call(alpha: "one", beta: 2);
+    callback.call(beta: 1, alpha: "two");
+  }
+}
+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);
+  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
+  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/native_as_name.dart b/pkg/front_end/testcases/general/native_as_name.dart
similarity index 100%
rename from pkg/front_end/testcases/native_as_name.dart
rename to pkg/front_end/testcases/general/native_as_name.dart
diff --git a/pkg/front_end/testcases/native_as_name.dart.hierarchy.expect b/pkg/front_end/testcases/general/native_as_name.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/native_as_name.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/native_as_name.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.legacy.expect b/pkg/front_end/testcases/general/native_as_name.dart.legacy.expect
new file mode 100644
index 0000000..ac402b2
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.legacy.expect
@@ -0,0 +1,49 @@
+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::•()
+    ;
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method native() → core::String*
+    return "method";
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String*;
+}
+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;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().native);
+  core::print(new self::X::•().native());
+  core::print(new self::Y2::•().native);
+  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/native_as_name.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ac402b2
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.legacy.transformed.expect
@@ -0,0 +1,49 @@
+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::•()
+    ;
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method native() → core::String*
+    return "method";
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String*;
+}
+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;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().native);
+  core::print(new self::X::•().native());
+  core::print(new self::Y2::•().native);
+  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.outline.expect b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
new file mode 100644
index 0000000..b3af038
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.outline.expect
@@ -0,0 +1,36 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class W extends core::Object {
+  field core::String* native;
+  constructor •() → self::W*
+    ;
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    ;
+  method native() → core::String*
+    ;
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    ;
+  abstract get native() → core::String*;
+}
+class Y2 extends self::Y1 {
+  synthetic constructor •() → self::Y2*
+    ;
+  @core::override
+  get native() → core::String*
+    ;
+}
+class Z extends core::Object {
+  field core::String* f;
+  synthetic constructor •() → self::Z*
+    ;
+  set native(core::String* s) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.strong.expect b/pkg/front_end/testcases/general/native_as_name.dart.strong.expect
new file mode 100644
index 0000000..4fba92c
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.strong.expect
@@ -0,0 +1,49 @@
+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::•()
+    ;
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method native() → core::String*
+    return "method";
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String*;
+}
+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;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().{self::W::native});
+  core::print(new self::X::•().{self::X::native}());
+  core::print(new self::Y2::•().{self::Y2::native});
+  core::print((let final self::Z* #t1 = new self::Z::•() in let final dynamic #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect b/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect
new file mode 100644
index 0000000..067e6d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/native_as_name.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+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::•()
+    ;
+}
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+  method native() → core::String*
+    return "method";
+}
+abstract class Y1 extends core::Object {
+  synthetic constructor •() → self::Y1*
+    : super core::Object::•()
+    ;
+  abstract get native() → core::String*;
+}
+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;
+}
+static method main() → dynamic {
+  core::print(new self::W::•().{self::W::native});
+  core::print(new self::X::•().{self::X::native}());
+  core::print(new self::Y2::•().{self::Y2::native});
+  core::print((let final self::Z* #t1 = new self::Z::•() in let final core::String* #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
+}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart
similarity index 100%
rename from pkg/front_end/testcases/nested_implicit_const_with_env_var.dart
rename to pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.hierarchy.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.expect
new file mode 100644
index 0000000..6a1ea6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    new self::B::•(new self::A::•(#C1));
+  }
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6a1ea6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    new self::B::•(new self::A::•(#C1));
+  }
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
new file mode 100644
index 0000000..536cae1
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.outline.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method fun() → dynamic
+    ;
+}
+static const field core::int* foo = const core::int::fromEnvironment("fisk");
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.expect
new file mode 100644
index 0000000..6a1ea6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    new self::B::•(new self::A::•(#C1));
+  }
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.transformed.expect b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.transformed.expect
new file mode 100644
index 0000000..6a1ea6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/nested_implicit_const_with_env_var.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  final field core::int* bar;
+  const constructor •(core::int* bar) → self::A*
+    : self::A::bar = bar, super core::Object::•()
+    ;
+}
+class B extends core::Object {
+  final field self::A* baz;
+  const constructor •(self::A* baz) → self::B*
+    : self::B::baz = baz, super core::Object::•()
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method fun() → dynamic {
+    new self::B::•(new self::A::•(#C1));
+  }
+}
+static const field core::int* foo = #C1;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart b/pkg/front_end/testcases/general/no_such_method_private_setter.dart
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_private_setter.dart
rename to pkg/front_end/testcases/general/no_such_method_private_setter.dart
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_private_setter.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/no_such_method_private_setter.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.expect
new file mode 100644
index 0000000..3fa5d56
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.expect
@@ -0,0 +1,41 @@
+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::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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::•()
+    ;
+}
+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::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
+}
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3fa5d56
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.legacy.transformed.expect
@@ -0,0 +1,41 @@
+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::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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::•()
+    ;
+}
+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::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
+}
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
new file mode 100644
index 0000000..ea56f3e
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.outline.expect
@@ -0,0 +1,29 @@
+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*
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as no_;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  field core::int* _x;
+  synthetic constructor •() → no_::Bar*
+    ;
+}
+static method baz(no_::Bar* bar) → void
+  ;
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.expect
new file mode 100644
index 0000000..3fa5d56
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.expect
@@ -0,0 +1,41 @@
+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::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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::•()
+    ;
+}
+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::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
+}
diff --git a/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.transformed.expect
new file mode 100644
index 0000000..3fa5d56
--- /dev/null
+++ b/pkg/front_end/testcases/general/no_such_method_private_setter.dart.strong.transformed.expect
@@ -0,0 +1,41 @@
+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::•()
+    ;
+  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int*
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 2, #C2, core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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::•()
+    ;
+}
+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::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #org-dartlang-testcase:///no_such_method_private_setter.dart::_x=
+}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter_lib.dart b/pkg/front_end/testcases/general/no_such_method_private_setter_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/no_such_method_private_setter_lib.dart
rename to pkg/front_end/testcases/general/no_such_method_private_setter_lib.dart
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart b/pkg/front_end/testcases/general/non_covariant_checks.dart
new file mode 100644
index 0000000..bf2dac8
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart
@@ -0,0 +1,478 @@
+// 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.
+
+/*@testedFeatures=checks*/
+
+class C<T> {
+  C(this.field1)
+      : field2 = (() => field1),
+        field3 = ((T t) {}),
+        field4 = ((T t) => t),
+        field5 = (() => () => field1),
+        field6 = ((T Function() f) {}),
+        field7 = ((T Function() f) => field1),
+        field8 = ((void Function(T) f) {}),
+        field9 = ((void Function(T) f) => field1),
+        field10 = ((T Function(T) f) {}),
+        field11 = ((T Function(T) f) => field1),
+        field12 = <S extends T>() => null,
+        field13 = <S extends T>(S s) {},
+        field14 = <S extends T>(S s) => s,
+        field15 = ((S Function<S extends T>() f) {});
+
+  T field1;
+  T Function() field2;
+  void Function(/*contravariant*/ T) field3;
+  T Function(/*contravariant*/ T) field4;
+  T Function() Function() field5;
+  void Function(/*contravariant*/ T Function()) field6;
+  T Function(/*contravariant*/ T Function()) field7;
+  void Function(void Function(T)) field8;
+  T Function(void Function(T)) field9;
+  void Function(/*contravariant*/ T Function(T)) field10;
+  T Function(/*contravariant*/ T Function(T)) field11;
+
+  S Function<S extends /*invariant*/ T>() field12;
+  void Function<S extends /*invariant*/ T>(S) field13;
+  S Function<S extends /*invariant*/ T>(S) field14;
+  void Function(S Function<S extends /*invariant*/ T>()) field15;
+
+  T get getter1 => field1;
+  T Function() get getter2 => field2;
+  void Function(/*contravariant*/ T) get getter3 => field3;
+  T Function(/*contravariant*/ T) get getter4 => field4;
+  T Function() Function() get getter5 => field5;
+  void Function(/*contravariant*/ T Function()) get getter6 => field6;
+  T Function(/*contravariant*/ T Function()) get getter7 => field7;
+  void Function(void Function(T)) get getter8 => field8;
+  T Function(void Function(T)) get getter9 => field9;
+  void Function(/*contravariant*/ T Function(T)) get getter10 => field10;
+  T Function(/*contravariant*/ T Function(T)) get getter11 => field11;
+
+  S Function<S extends /*invariant*/ T>() get getter12 => field12;
+  void Function<S extends /*invariant*/ T>(S) get getter13 => field13;
+  S Function<S extends /*invariant*/ T>(S) get getter14 => field14;
+  void Function(S Function<S extends /*invariant*/ T>()) get getter15 =>
+      field15;
+
+  void set setter1(/*covariant*/ T value) {
+    field1 = value;
+  }
+
+  void set setter2(/*covariant*/ T Function() value) {
+    field2 = value;
+  }
+
+  void set setter3(void Function(T) value) {
+    field3 = value;
+  }
+
+  void set setter4(/*covariant*/ T Function(T) value) {
+    field4 = value;
+  }
+
+  void set setter5(/*covariant*/ T Function() Function() value) {
+    field5 = value;
+  }
+
+  void set setter6(void Function(T Function()) value) {
+    field6 = value;
+  }
+
+  void set setter7(/*covariant*/ T Function(T Function()) value) {
+    field7 = value;
+  }
+
+  void set setter8(void Function(void Function(/*covariant*/ T)) value) {
+    field8 = value;
+  }
+
+  void set setter9(
+      /*covariant*/ T Function(void Function(/*covariant*/ T)) value) {
+    field9 = value;
+  }
+
+  void set setter10(void Function(T Function(/*covariant*/ T)) value) {
+    field10 = value;
+  }
+
+  void set setter11(
+      /*covariant*/ T Function(T Function(/*covariant*/ T)) value) {
+    field11 = value;
+  }
+
+  void set setter12(S Function<S extends /*invariant*/ T>() value) {
+    field12 = value;
+  }
+
+  void set setter13(void Function<S extends /*invariant*/ T>(S) value) {
+    field13 = value;
+  }
+
+  void set setter14(S Function<S extends /*invariant*/ T>(S) value) {
+    field14 = value;
+  }
+
+  void set setter15(
+      void Function(S Function<S extends /*invariant*/ T>()) value) {
+    field15 = value;
+  }
+
+  void method1(/*covariant*/ T value) {
+    field1 = value;
+  }
+
+  void method2(/*covariant*/ T Function() value) {
+    field2 = value;
+  }
+
+  void method3(void Function(T) value) {
+    field3 = value;
+  }
+
+  void method4(/*covariant*/ T Function(T) value) {
+    field4 = value;
+  }
+
+  void method5(/*covariant*/ T Function() Function() value) {
+    field5 = value;
+  }
+
+  void method6(void Function(T Function()) value) {
+    field6 = value;
+  }
+
+  void method7(/*covariant*/ T Function(T Function()) value) {
+    field7 = value;
+  }
+
+  void method8(void Function(void Function(/*covariant*/ T)) value) {
+    field8 = value;
+  }
+
+  void method9(/*covariant*/ T Function(void Function(/*covariant*/ T)) value) {
+    field9 = value;
+  }
+
+  void method10(void Function(T Function(/*covariant*/ T)) value) {
+    field10 = value;
+  }
+
+  void method11(/*covariant*/ T Function(T Function(/*covariant*/ T)) value) {
+    field11 = value;
+  }
+
+  void method12(S Function<S extends /*invariant*/ T>() value) {
+    field12 = value;
+  }
+
+  void method13(void Function<S extends /*invariant*/ T>(S) value) {
+    field13 = value;
+  }
+
+  void method14(S Function<S extends /*invariant*/ T>(S) value) {
+    field14 = value;
+  }
+
+  void method15(void Function(S Function<S extends /*invariant*/ T>()) value) {
+    field15 = value;
+  }
+}
+
+main() {
+  C<num> c = new C<int>(0);
+  c.field1;
+  c.field2;
+  try {
+    c. /*@ checkReturn=(num*) ->* void */ field3;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(num*) ->* num* */ field4;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.field5;
+  try {
+    c. /*@ checkReturn=(() ->* num*) ->* void */ field6;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(() ->* num*) ->* num* */ field7;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.field8;
+  c.field9;
+  try {
+    c. /*@ checkReturn=((num*) ->* num*) ->* void */ field10;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=((num*) ->* num*) ->* num* */ field11;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>() ->* S */ field12;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>(S) ->* void */ field13;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>(S) ->* S */ field14;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(<S extends num* = dynamic>() ->* S) ->* void */ field15;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+
+  c.getter1;
+  c.getter2;
+  try {
+    c. /*@ checkReturn=(num*) ->* void */ getter3;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(num*) ->* num* */ getter4;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.getter5;
+  try {
+    c. /*@ checkReturn=(() ->* num*) ->* void */ getter6;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(() ->* num*) ->* num* */ getter7;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.getter8;
+  c.getter9;
+  try {
+    c. /*@ checkReturn=((num*) ->* num*) ->* void */ getter10;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=((num*) ->* num*) ->* num* */ getter11;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>() ->* S */ getter12;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>(S) ->* void */ getter13;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=<S extends num* = dynamic>(S) ->* S */ getter14;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c. /*@ checkReturn=(<S extends num* = dynamic>() ->* S) ->* void */ getter15;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+
+  try {
+    c.setter1 = 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter2 = () => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.setter3 = (num n) {};
+  try {
+    c.setter4 = (num n) => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter5 = () => () => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.setter6 = (num Function() f) {};
+  try {
+    c.setter7 = (num Function() f) => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter8 = (void Function(double) f) {};
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter9 = (void Function(double) f) => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter10 = (num Function(double) f) {};
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter11 = (num Function(double) f) => 0.5;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter12 = <S extends num>() => null;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter13 = <S extends num>(S s) {};
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter14 = <S extends num>(S s) => s;
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.setter15 = (S Function<S extends num>() f) {};
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+
+  try {
+    c.method1(0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method2(() => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.method3((num n) {});
+  try {
+    c.method4((num n) => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method5(() => () => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  c.method6((num Function() f) {});
+  try {
+    c.method7((num Function() f) => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method8((void Function(double) f) {});
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method9((void Function(double) f) => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method10((num Function(double) f) {});
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method11((num Function(double) f) => 0.5);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method12(<S extends num>() => null);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method13(<S extends num>(S s) {});
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method14(<S extends num>(S s) => s);
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+  try {
+    c.method15((S Function<S extends num>() f) {});
+    throw 'TypeError expected';
+  } on TypeError catch (e) {
+    print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.hierarchy.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.hierarchy.expect
new file mode 100644
index 0000000..48d8eaa
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.hierarchy.expect
@@ -0,0 +1,111 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+C:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    C.field13
+    C.getter11
+    C.getter1
+    C.method15
+    C.field1
+    C.getter15
+    C.method12
+    Object.toString
+    C.getter6
+    C.method8
+    C.field4
+    C.field12
+    C.method14
+    C.field2
+    C.method4
+    Object.runtimeType
+    Object._simpleInstanceOf
+    C.getter10
+    C.field9
+    C.getter2
+    C.method7
+    C.field15
+    C.getter7
+    C.getter14
+    C.method6
+    C.field5
+    Object._instanceOf
+    C.getter8
+    C.method13
+    C.field11
+    C.method3
+    C.method11
+    C.getter3
+    Object.noSuchMethod
+    C.getter4
+    C.method10
+    C.method9
+    C.method2
+    C.field6
+    C.field7
+    Object._identityHashCode
+    C.field14
+    C.getter13
+    C.getter12
+    Object.hashCode
+    C.field10
+    C.field3
+    C.getter9
+    Object._simpleInstanceOfFalse
+    C.getter5
+    C.method1
+    Object._simpleInstanceOfTrue
+    Object.==
+    C.field8
+    C.method5
+  classSetters:
+    C.setter11
+    C.field13
+    C.setter1
+    C.setter15
+    C.setter8
+    C.field1
+    C.setter4
+    C.field4
+    C.field12
+    C.setter10
+    C.field2
+    C.setter7
+    C.field9
+    C.setter14
+    C.field15
+    C.setter3
+    C.field5
+    C.setter9
+    C.field11
+    C.setter6
+    C.setter13
+    C.field6
+    C.field7
+    C.setter12
+    C.field14
+    C.setter2
+    C.field10
+    C.field3
+    C.setter5
+    C.field8
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.expect
new file mode 100644
index 0000000..ed53ce5
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.expect
@@ -0,0 +1,483 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* field1;
+  generic-covariant-impl field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  generic-covariant-impl field (self::C::T*) →* self::C::T* field4;
+  generic-covariant-impl field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  generic-covariant-impl field (() →* self::C::T*) →* self::C::T* field7;
+  generic-covariant-impl field ((self::C::T*) →* void) →* void field8;
+  generic-covariant-impl field ((self::C::T*) →* void) →* self::C::T* field9;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* void field10;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>() →* S* field12;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  generic-covariant-impl 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 = () → dynamic => field1, self::C::field3 = (self::C::T* t) → dynamic {}, self::C::field4 = (self::C::T* t) → dynamic => t, self::C::field5 = () → dynamic => () → dynamic => field1, self::C::field6 = (() →* self::C::T* f) → dynamic {}, self::C::field7 = (() →* self::C::T* f) → dynamic => field1, self::C::field8 = ((self::C::T*) →* void f) → dynamic {}, self::C::field9 = ((self::C::T*) →* void f) → dynamic => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → dynamic {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → dynamic => field1, self::C::field12 = <S extends self::C::T* = dynamic>() → dynamic => null, self::C::field13 = <S extends self::C::T* = dynamic>(S* s) → dynamic {}, self::C::field14 = <S extends self::C::T* = dynamic>(S* s) → dynamic => s, self::C::field15 = (<S extends self::C::T* = dynamic>() →* S* f) → dynamic {}, super core::Object::•()
+    ;
+  get getter1() → self::C::T*
+    return this.{self::C::field1};
+  get getter2() → () →* self::C::T*
+    return this.{self::C::field2};
+  get getter3() → (self::C::T*) →* void
+    return this.{self::C::field3};
+  get getter4() → (self::C::T*) →* self::C::T*
+    return this.{self::C::field4};
+  get getter5() → () →* () →* self::C::T*
+    return this.{self::C::field5};
+  get getter6() → (() →* self::C::T*) →* void
+    return this.{self::C::field6};
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    return this.{self::C::field7};
+  get getter8() → ((self::C::T*) →* void) →* void
+    return this.{self::C::field8};
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    return this.{self::C::field9};
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    return this.{self::C::field10};
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    return this.{self::C::field11};
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    return this.{self::C::field12};
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    return this.{self::C::field13};
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    return this.{self::C::field14};
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    return this.{self::C::field15};
+  set setter1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  set setter2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  set setter5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  set setter8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  set setter9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  set setter10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  set setter11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  set setter12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  set setter13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  set setter14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  set setter15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  method method1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  method method2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  method method5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  method method8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  method method9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  method method10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  method method11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  method method12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  method method13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  method method14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  method method15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+}
+static method main() → dynamic {
+  self::C<core::num*>* c = new self::C::•<core::int*>(0);
+  c.field1;
+  c.field2;
+  try {
+    c.field3;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field4;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.field5;
+  try {
+    c.field6;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field7;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.field8;
+  c.field9;
+  try {
+    c.field10;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field11;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field12;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field13;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field14;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field15;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter1;
+  c.getter2;
+  try {
+    c.getter3;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter4;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter5;
+  try {
+    c.getter6;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter7;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter8;
+  c.getter9;
+  try {
+    c.getter10;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter11;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter12;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter13;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter14;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter15;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter1 = 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter2 = () → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.setter3 = (core::num* n) → dynamic {};
+  try {
+    c.setter4 = (core::num* n) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter5 = () → dynamic => () → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.setter6 = (() →* core::num* f) → dynamic {};
+  try {
+    c.setter7 = (() →* core::num* f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter8 = ((core::double*) →* void f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter9 = ((core::double*) →* void f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter10 = ((core::double*) →* core::num* f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter11 = ((core::double*) →* core::num* f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter12 = <S extends core::num* = dynamic>() → dynamic => null;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter13 = <S extends core::num* = dynamic>(S* s) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter14 = <S extends core::num* = dynamic>(S* s) → dynamic => s;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter15 = (<S extends core::num* = dynamic>() →* S* f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method1(0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method2(() → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.method3((core::num* n) → dynamic {});
+  try {
+    c.method4((core::num* n) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method5(() → dynamic => () → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.method6((() →* core::num* f) → dynamic {});
+  try {
+    c.method7((() →* core::num* f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method8(((core::double*) →* void f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method9(((core::double*) →* void f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method10(((core::double*) →* core::num* f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method11(((core::double*) →* core::num* f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method12(<S extends core::num* = dynamic>() → dynamic => null);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method13(<S extends core::num* = dynamic>(S* s) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method14(<S extends core::num* = dynamic>(S* s) → dynamic => s);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method15((<S extends core::num* = dynamic>() →* S* f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ed53ce5
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.legacy.transformed.expect
@@ -0,0 +1,483 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* field1;
+  generic-covariant-impl field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  generic-covariant-impl field (self::C::T*) →* self::C::T* field4;
+  generic-covariant-impl field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  generic-covariant-impl field (() →* self::C::T*) →* self::C::T* field7;
+  generic-covariant-impl field ((self::C::T*) →* void) →* void field8;
+  generic-covariant-impl field ((self::C::T*) →* void) →* self::C::T* field9;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* void field10;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>() →* S* field12;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  generic-covariant-impl 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 = () → dynamic => field1, self::C::field3 = (self::C::T* t) → dynamic {}, self::C::field4 = (self::C::T* t) → dynamic => t, self::C::field5 = () → dynamic => () → dynamic => field1, self::C::field6 = (() →* self::C::T* f) → dynamic {}, self::C::field7 = (() →* self::C::T* f) → dynamic => field1, self::C::field8 = ((self::C::T*) →* void f) → dynamic {}, self::C::field9 = ((self::C::T*) →* void f) → dynamic => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → dynamic {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → dynamic => field1, self::C::field12 = <S extends self::C::T* = dynamic>() → dynamic => null, self::C::field13 = <S extends self::C::T* = dynamic>(S* s) → dynamic {}, self::C::field14 = <S extends self::C::T* = dynamic>(S* s) → dynamic => s, self::C::field15 = (<S extends self::C::T* = dynamic>() →* S* f) → dynamic {}, super core::Object::•()
+    ;
+  get getter1() → self::C::T*
+    return this.{self::C::field1};
+  get getter2() → () →* self::C::T*
+    return this.{self::C::field2};
+  get getter3() → (self::C::T*) →* void
+    return this.{self::C::field3};
+  get getter4() → (self::C::T*) →* self::C::T*
+    return this.{self::C::field4};
+  get getter5() → () →* () →* self::C::T*
+    return this.{self::C::field5};
+  get getter6() → (() →* self::C::T*) →* void
+    return this.{self::C::field6};
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    return this.{self::C::field7};
+  get getter8() → ((self::C::T*) →* void) →* void
+    return this.{self::C::field8};
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    return this.{self::C::field9};
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    return this.{self::C::field10};
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    return this.{self::C::field11};
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    return this.{self::C::field12};
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    return this.{self::C::field13};
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    return this.{self::C::field14};
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    return this.{self::C::field15};
+  set setter1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  set setter2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  set setter5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  set setter8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  set setter9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  set setter10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  set setter11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  set setter12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  set setter13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  set setter14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  set setter15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  method method1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  method method2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  method method5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  method method8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  method method9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  method method10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  method method11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  method method12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  method method13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  method method14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  method method15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+}
+static method main() → dynamic {
+  self::C<core::num*>* c = new self::C::•<core::int*>(0);
+  c.field1;
+  c.field2;
+  try {
+    c.field3;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field4;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.field5;
+  try {
+    c.field6;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field7;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.field8;
+  c.field9;
+  try {
+    c.field10;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field11;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field12;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field13;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field14;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.field15;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter1;
+  c.getter2;
+  try {
+    c.getter3;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter4;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter5;
+  try {
+    c.getter6;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter7;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.getter8;
+  c.getter9;
+  try {
+    c.getter10;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter11;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter12;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter13;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter14;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.getter15;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter1 = 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter2 = () → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.setter3 = (core::num* n) → dynamic {};
+  try {
+    c.setter4 = (core::num* n) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter5 = () → dynamic => () → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.setter6 = (() →* core::num* f) → dynamic {};
+  try {
+    c.setter7 = (() →* core::num* f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter8 = ((core::double*) →* void f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter9 = ((core::double*) →* void f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter10 = ((core::double*) →* core::num* f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter11 = ((core::double*) →* core::num* f) → dynamic => 0.5;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter12 = <S extends core::num* = dynamic>() → dynamic => null;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter13 = <S extends core::num* = dynamic>(S* s) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter14 = <S extends core::num* = dynamic>(S* s) → dynamic => s;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.setter15 = (<S extends core::num* = dynamic>() →* S* f) → dynamic {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method1(0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method2(() → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.method3((core::num* n) → dynamic {});
+  try {
+    c.method4((core::num* n) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method5(() → dynamic => () → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.method6((() →* core::num* f) → dynamic {});
+  try {
+    c.method7((() →* core::num* f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method8(((core::double*) →* void f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method9(((core::double*) →* void f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method10(((core::double*) →* core::num* f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method11(((core::double*) →* core::num* f) → dynamic => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method12(<S extends core::num* = dynamic>() → dynamic => null);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method13(<S extends core::num* = dynamic>(S* s) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method14(<S extends core::num* = dynamic>(S* s) → dynamic => s);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.method15((<S extends core::num* = dynamic>() →* S* f) → dynamic {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.outline.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.outline.expect
new file mode 100644
index 0000000..c8bde3f
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.outline.expect
@@ -0,0 +1,115 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* field1;
+  generic-covariant-impl field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  generic-covariant-impl field (self::C::T*) →* self::C::T* field4;
+  generic-covariant-impl field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  generic-covariant-impl field (() →* self::C::T*) →* self::C::T* field7;
+  generic-covariant-impl field ((self::C::T*) →* void) →* void field8;
+  generic-covariant-impl field ((self::C::T*) →* void) →* self::C::T* field9;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* void field10;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>() →* S* field12;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  generic-covariant-impl field (<S extends self::C::T* = dynamic>() →* S*) →* void field15;
+  constructor •(self::C::T* field1) → self::C<self::C::T*>*
+    ;
+  get getter1() → self::C::T*
+    ;
+  get getter2() → () →* self::C::T*
+    ;
+  get getter3() → (self::C::T*) →* void
+    ;
+  get getter4() → (self::C::T*) →* self::C::T*
+    ;
+  get getter5() → () →* () →* self::C::T*
+    ;
+  get getter6() → (() →* self::C::T*) →* void
+    ;
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    ;
+  get getter8() → ((self::C::T*) →* void) →* void
+    ;
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    ;
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    ;
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    ;
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    ;
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    ;
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    ;
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    ;
+  set setter1(generic-covariant-impl self::C::T* value) → void
+    ;
+  set setter2(generic-covariant-impl () →* self::C::T* value) → void
+    ;
+  set setter3((self::C::T*) →* void value) → void
+    ;
+  set setter4(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void
+    ;
+  set setter5(generic-covariant-impl () →* () →* self::C::T* value) → void
+    ;
+  set setter6((() →* self::C::T*) →* void value) → void
+    ;
+  set setter7(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void
+    ;
+  set setter8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void
+    ;
+  set setter9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void
+    ;
+  set setter10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void
+    ;
+  set setter11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void
+    ;
+  set setter12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void
+    ;
+  set setter13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void
+    ;
+  set setter14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void
+    ;
+  set setter15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void
+    ;
+  method method1(generic-covariant-impl self::C::T* value) → void
+    ;
+  method method2(generic-covariant-impl () →* self::C::T* value) → void
+    ;
+  method method3((self::C::T*) →* void value) → void
+    ;
+  method method4(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void
+    ;
+  method method5(generic-covariant-impl () →* () →* self::C::T* value) → void
+    ;
+  method method6((() →* self::C::T*) →* void value) → void
+    ;
+  method method7(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void
+    ;
+  method method8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void
+    ;
+  method method9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void
+    ;
+  method method10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void
+    ;
+  method method11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void
+    ;
+  method method12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void
+    ;
+  method method13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void
+    ;
+  method method14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void
+    ;
+  method method15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
new file mode 100644
index 0000000..30be3b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.expect
@@ -0,0 +1,483 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* field1;
+  generic-covariant-impl field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  generic-covariant-impl field (self::C::T*) →* self::C::T* field4;
+  generic-covariant-impl field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  generic-covariant-impl field (() →* self::C::T*) →* self::C::T* field7;
+  generic-covariant-impl field ((self::C::T*) →* void) →* void field8;
+  generic-covariant-impl field ((self::C::T*) →* void) →* self::C::T* field9;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* void field10;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>() →* S* field12;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  generic-covariant-impl 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) → core::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) → core::Null* {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null* {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null* {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null* => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null* {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null* {}, super core::Object::•()
+    ;
+  get getter1() → self::C::T*
+    return this.{self::C::field1};
+  get getter2() → () →* self::C::T*
+    return this.{self::C::field2};
+  get getter3() → (self::C::T*) →* void
+    return this.{self::C::field3};
+  get getter4() → (self::C::T*) →* self::C::T*
+    return this.{self::C::field4};
+  get getter5() → () →* () →* self::C::T*
+    return this.{self::C::field5};
+  get getter6() → (() →* self::C::T*) →* void
+    return this.{self::C::field6};
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    return this.{self::C::field7};
+  get getter8() → ((self::C::T*) →* void) →* void
+    return this.{self::C::field8};
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    return this.{self::C::field9};
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    return this.{self::C::field10};
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    return this.{self::C::field11};
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    return this.{self::C::field12};
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    return this.{self::C::field13};
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    return this.{self::C::field14};
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    return this.{self::C::field15};
+  set setter1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  set setter2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  set setter5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  set setter8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  set setter9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  set setter10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  set setter11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  set setter12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  set setter13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  set setter14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  set setter15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  method method1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  method method2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  method method5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  method method8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  method method9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  method method10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  method method11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  method method12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  method method13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  method method14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  method method15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+}
+static method main() → dynamic {
+  self::C<core::num*>* c = new self::C::•<core::int*>(0);
+  c.{self::C::field1};
+  c.{self::C::field2};
+  try {
+    c.{self::C::field3} as{TypeError} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field4} as{TypeError} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field5};
+  try {
+    c.{self::C::field6} as{TypeError} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field7} as{TypeError} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field8};
+  c.{self::C::field9};
+  try {
+    c.{self::C::field10} as{TypeError} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field11} as{TypeError} ((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} as{TypeError} <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} as{TypeError} <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} as{TypeError} <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} as{TypeError} (<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};
+  c.{self::C::getter2};
+  try {
+    c.{self::C::getter3} as{TypeError} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter4} as{TypeError} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter5};
+  try {
+    c.{self::C::getter6} as{TypeError} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter7} as{TypeError} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter8};
+  c.{self::C::getter9};
+  try {
+    c.{self::C::getter10} as{TypeError} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter11} as{TypeError} ((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} as{TypeError} <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} as{TypeError} <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} as{TypeError} <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} as{TypeError} (<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) → core::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) → core::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) → core::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) → core::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* = core::num*>() → core::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* = core::num*>(S* s) → core::Null* {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter14} = <S extends core::num* = 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* = core::num*>() →* S* f) → core::Null* {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method1}(0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method2}(() → core::double* => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method3}((core::num* n) → core::Null* {});
+  try {
+    c.{self::C::method4}((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::method5}(() → () →* core::double* => () → core::double* => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method6}((() →* core::num* f) → core::Null* {});
+  try {
+    c.{self::C::method7}((() →* 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::method8}(((core::double*) →* void f) → core::Null* {});
+    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);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null* {});
+    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);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null* => null);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null* {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method14}(<S extends core::num* = core::num*>(S* s) → S* => s);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null* {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
new file mode 100644
index 0000000..30be3b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/non_covariant_checks.dart.strong.transformed.expect
@@ -0,0 +1,483 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* field1;
+  generic-covariant-impl field () →* self::C::T* field2;
+  field (self::C::T*) →* void field3;
+  generic-covariant-impl field (self::C::T*) →* self::C::T* field4;
+  generic-covariant-impl field () →* () →* self::C::T* field5;
+  field (() →* self::C::T*) →* void field6;
+  generic-covariant-impl field (() →* self::C::T*) →* self::C::T* field7;
+  generic-covariant-impl field ((self::C::T*) →* void) →* void field8;
+  generic-covariant-impl field ((self::C::T*) →* void) →* self::C::T* field9;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* void field10;
+  generic-covariant-impl field ((self::C::T*) →* self::C::T*) →* self::C::T* field11;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>() →* S* field12;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* void field13;
+  generic-covariant-impl field <S extends self::C::T* = dynamic>(S*) →* S* field14;
+  generic-covariant-impl 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) → core::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) → core::Null* {}, self::C::field7 = (() →* self::C::T* f) → self::C::T* => field1, self::C::field8 = ((self::C::T*) →* void f) → core::Null* {}, self::C::field9 = ((self::C::T*) →* void f) → self::C::T* => field1, self::C::field10 = ((self::C::T*) →* self::C::T* f) → core::Null* {}, self::C::field11 = ((self::C::T*) →* self::C::T* f) → self::C::T* => field1, self::C::field12 = <S extends self::C::T* = self::C::T*>() → core::Null* => null, self::C::field13 = <S extends self::C::T* = self::C::T*>(S* s) → core::Null* {}, self::C::field14 = <S extends self::C::T* = self::C::T*>(S* s) → S* => s, self::C::field15 = (<S extends self::C::T* = self::C::T*>() →* S* f) → core::Null* {}, super core::Object::•()
+    ;
+  get getter1() → self::C::T*
+    return this.{self::C::field1};
+  get getter2() → () →* self::C::T*
+    return this.{self::C::field2};
+  get getter3() → (self::C::T*) →* void
+    return this.{self::C::field3};
+  get getter4() → (self::C::T*) →* self::C::T*
+    return this.{self::C::field4};
+  get getter5() → () →* () →* self::C::T*
+    return this.{self::C::field5};
+  get getter6() → (() →* self::C::T*) →* void
+    return this.{self::C::field6};
+  get getter7() → (() →* self::C::T*) →* self::C::T*
+    return this.{self::C::field7};
+  get getter8() → ((self::C::T*) →* void) →* void
+    return this.{self::C::field8};
+  get getter9() → ((self::C::T*) →* void) →* self::C::T*
+    return this.{self::C::field9};
+  get getter10() → ((self::C::T*) →* self::C::T*) →* void
+    return this.{self::C::field10};
+  get getter11() → ((self::C::T*) →* self::C::T*) →* self::C::T*
+    return this.{self::C::field11};
+  get getter12() → <S extends self::C::T* = dynamic>() →* S*
+    return this.{self::C::field12};
+  get getter13() → <S extends self::C::T* = dynamic>(S*) →* void
+    return this.{self::C::field13};
+  get getter14() → <S extends self::C::T* = dynamic>(S*) →* S*
+    return this.{self::C::field14};
+  get getter15() → (<S extends self::C::T* = dynamic>() →* S*) →* void
+    return this.{self::C::field15};
+  set setter1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  set setter2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  set setter5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  set setter8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  set setter9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  set setter10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  set setter11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  set setter12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  set setter13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  set setter14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  set setter15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+  method method1(generic-covariant-impl self::C::T* value) → void {
+    this.{self::C::field1} = value;
+  }
+  method method2(generic-covariant-impl () →* 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(generic-covariant-impl (self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field4} = value;
+  }
+  method method5(generic-covariant-impl () →* () →* 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(generic-covariant-impl (() →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field7} = value;
+  }
+  method method8(generic-covariant-impl ((self::C::T*) →* void) →* void value) → void {
+    this.{self::C::field8} = value;
+  }
+  method method9(generic-covariant-impl ((self::C::T*) →* void) →* self::C::T* value) → void {
+    this.{self::C::field9} = value;
+  }
+  method method10(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* void value) → void {
+    this.{self::C::field10} = value;
+  }
+  method method11(generic-covariant-impl ((self::C::T*) →* self::C::T*) →* self::C::T* value) → void {
+    this.{self::C::field11} = value;
+  }
+  method method12(generic-covariant-impl <S extends self::C::T* = dynamic>() →* S* value) → void {
+    this.{self::C::field12} = value;
+  }
+  method method13(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* void value) → void {
+    this.{self::C::field13} = value;
+  }
+  method method14(generic-covariant-impl <S extends self::C::T* = dynamic>(S*) →* S* value) → void {
+    this.{self::C::field14} = value;
+  }
+  method method15(generic-covariant-impl (<S extends self::C::T* = dynamic>() →* S*) →* void value) → void {
+    this.{self::C::field15} = value;
+  }
+}
+static method main() → dynamic {
+  self::C<core::num*>* c = new self::C::•<core::int*>(0);
+  c.{self::C::field1};
+  c.{self::C::field2};
+  try {
+    c.{self::C::field3} as{TypeError} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field4} as{TypeError} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field5};
+  try {
+    c.{self::C::field6} as{TypeError} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field7} as{TypeError} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::field8};
+  c.{self::C::field9};
+  try {
+    c.{self::C::field10} as{TypeError} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::field11} as{TypeError} ((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} as{TypeError} <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} as{TypeError} <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} as{TypeError} <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} as{TypeError} (<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};
+  c.{self::C::getter2};
+  try {
+    c.{self::C::getter3} as{TypeError} (core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter4} as{TypeError} (core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter5};
+  try {
+    c.{self::C::getter6} as{TypeError} (() →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter7} as{TypeError} (() →* core::num*) →* core::num*;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::getter8};
+  c.{self::C::getter9};
+  try {
+    c.{self::C::getter10} as{TypeError} ((core::num*) →* core::num*) →* void;
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::getter11} as{TypeError} ((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} as{TypeError} <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} as{TypeError} <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} as{TypeError} <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} as{TypeError} (<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) → core::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) → core::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) → core::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) → core::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* = core::num*>() → core::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* = core::num*>(S* s) → core::Null* {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::setter14} = <S extends core::num* = 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* = core::num*>() →* S* f) → core::Null* {};
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method1}(0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method2}(() → core::double* => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method3}((core::num* n) → core::Null* {});
+  try {
+    c.{self::C::method4}((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::method5}(() → () →* core::double* => () → core::double* => 0.5);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  c.{self::C::method6}((() →* core::num* f) → core::Null* {});
+  try {
+    c.{self::C::method7}((() →* 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::method8}(((core::double*) →* void f) → core::Null* {});
+    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);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method10}(((core::double*) →* core::num* f) → core::Null* {});
+    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);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method12}(<S extends core::num* = core::num*>() → core::Null* => null);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method13}(<S extends core::num* = core::num*>(S* s) → core::Null* {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method14}(<S extends core::num* = core::num*>(S* s) → S* => s);
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+  try {
+    c.{self::C::method15}((<S extends core::num* = core::num*>() →* S* f) → core::Null* {});
+    throw "TypeError expected";
+  }
+  on core::TypeError* catch(final core::TypeError* e) {
+    core::print(e);
+  }
+}
diff --git a/pkg/front_end/testcases/null_aware.dart b/pkg/front_end/testcases/general/null_aware.dart
similarity index 100%
rename from pkg/front_end/testcases/null_aware.dart
rename to pkg/front_end/testcases/general/null_aware.dart
diff --git a/pkg/front_end/testcases/null_aware.dart.hierarchy.expect b/pkg/front_end/testcases/general/null_aware.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/null_aware.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/null_aware.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/null_aware.dart.legacy.expect b/pkg/front_end/testcases/general/null_aware.dart.legacy.expect
new file mode 100644
index 0000000..d912728
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.legacy.expect
@@ -0,0 +1,22 @@
+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::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  let final dynamic #t1 = foo in #t1.==(null) ? null : #t1.field = 5;
+  self::Foo::staticField = 5;
+  let final dynamic #t2 = foo in #t2.field.==(null) ? #t2.field = 5 : null;
+  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
+  let final dynamic #t3 = foo in #t3.==(null) ? null : #t3.field.==(null) ? #t3.field = 5 : null;
+  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
+  core::int* intValue = let final dynamic #t4 = foo.field in #t4.==(null) ? 6 : #t4;
+  core::num* numValue = let final dynamic #t5 = foo.field in #t5.==(null) ? 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/general/null_aware.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/null_aware.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d912728
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.legacy.transformed.expect
@@ -0,0 +1,22 @@
+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::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  let final dynamic #t1 = foo in #t1.==(null) ? null : #t1.field = 5;
+  self::Foo::staticField = 5;
+  let final dynamic #t2 = foo in #t2.field.==(null) ? #t2.field = 5 : null;
+  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
+  let final dynamic #t3 = foo in #t3.==(null) ? null : #t3.field.==(null) ? #t3.field = 5 : null;
+  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
+  core::int* intValue = let final dynamic #t4 = foo.field in #t4.==(null) ? 6 : #t4;
+  core::num* numValue = let final dynamic #t5 = foo.field in #t5.==(null) ? 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/general/null_aware.dart.outline.expect b/pkg/front_end/testcases/general/null_aware.dart.outline.expect
new file mode 100644
index 0000000..e7c162d
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::int* field;
+  static field core::int* staticField;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/null_aware.dart.strong.expect b/pkg/front_end/testcases/general/null_aware.dart.strong.expect
new file mode 100644
index 0000000..9cdabd6
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.strong.expect
@@ -0,0 +1,22 @@
+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::•()
+    ;
+}
+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::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(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::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
+  core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
+  core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/general/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/general/null_aware.dart.strong.transformed.expect
new file mode 100644
index 0000000..9cdabd6
--- /dev/null
+++ b/pkg/front_end/testcases/general/null_aware.dart.strong.transformed.expect
@@ -0,0 +1,22 @@
+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::•()
+    ;
+}
+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::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(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::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
+  self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
+  core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
+  core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;
+}
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart b/pkg/front_end/testcases/general/operator_method_not_found.dart
similarity index 100%
rename from pkg/front_end/testcases/operator_method_not_found.dart
rename to pkg/front_end/testcases/general/operator_method_not_found.dart
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.hierarchy.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/operator_method_not_found.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/operator_method_not_found.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.legacy.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.legacy.expect
new file mode 100644
index 0000000..e7a6f6c
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.legacy.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:36:10: Warning: '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 '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   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 '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  core::print(foo.<(2));
+  core::print(foo.>(2));
+  core::print(foo.<=(2));
+  core::print(foo.>=(2));
+  core::print(foo.==(2));
+  core::print(foo.-(2));
+  core::print(foo.+(2));
+  core::print(foo./(2));
+  core::print(foo.~/(2));
+  core::print(foo.*(2));
+  core::print(foo.%(2));
+  core::print(foo.|(2));
+  core::print(foo.^(2));
+  core::print(foo.&(2));
+  core::print(foo.<<(2));
+  core::print(foo.>>(2));
+  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
+  core::print(foo.[](2));
+  core::print(foo.~());
+  core::print(foo.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);
+        ^".>(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);
+        ^".<=(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);
+        ^".>=(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);
+        ^".==(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);
+        ^".+(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);
+        ^"./(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);
+        ^".~/(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);
+        ^".*(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);
+        ^".%(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);
+        ^".|(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);
+        ^".^(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);
+        ^".&(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);
+        ^".<<(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);
+        ^".>>(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/operator_method_not_found.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.legacy.transformed.expect
new file mode 100644
index 0000000..e7a6f6c
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.legacy.transformed.expect
@@ -0,0 +1,154 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:36:10: Warning: '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 '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   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 '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   print(>>foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
+//   print(foo ~ 2);
+//             ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  core::print(foo.<(2));
+  core::print(foo.>(2));
+  core::print(foo.<=(2));
+  core::print(foo.>=(2));
+  core::print(foo.==(2));
+  core::print(foo.-(2));
+  core::print(foo.+(2));
+  core::print(foo./(2));
+  core::print(foo.~/(2));
+  core::print(foo.*(2));
+  core::print(foo.%(2));
+  core::print(foo.|(2));
+  core::print(foo.^(2));
+  core::print(foo.&(2));
+  core::print(foo.<<(2));
+  core::print(foo.>>(2));
+  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
+  core::print(foo.[](2));
+  core::print(foo.~());
+  core::print(foo.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);
+        ^".>(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);
+        ^".<=(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);
+        ^".>=(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);
+        ^".==(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);
+        ^".+(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);
+        ^"./(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);
+        ^".~/(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);
+        ^".*(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);
+        ^".%(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);
+        ^".|(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);
+        ^".^(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);
+        ^".&(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);
+        ^".<<(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);
+        ^".>>(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/operator_method_not_found.dart.outline.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.outline.expect
new file mode 100644
index 0000000..85e8d34
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
new file mode 100644
index 0000000..4860020
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.expect
@@ -0,0 +1,344 @@
+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 '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   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 '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   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 method '<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   print(foo < 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>'.
+//   print(foo > 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<='.
+//   print(foo <= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>='.
+//   print(foo >= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//   print(foo - 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//   print(foo + 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '/'.
+//   print(foo / 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+//   print(foo ~/ 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '*'.
+//   print(foo * 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '%'.
+//   print(foo % 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '|'.
+//   print(foo | 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '^'.
+//   print(foo ^ 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '&'.
+//   print(foo & 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+//   print(foo << 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+//   print(foo >> 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+//   print(foo[2] = 2);
+//            ^^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//   print(foo[2]);
+//            ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~'.
+//   print(~foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+//   print(-foo);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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 method '<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  print(foo < 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>'.
+  print(foo > 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<='.
+  print(foo <= 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>='.
+  print(foo >= 2);
+            ^^");
+  core::print(foo.{core::Object::==}(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '-'.
+  print(foo - 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '+'.
+  print(foo + 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '/'.
+  print(foo / 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~/'.
+  print(foo ~/ 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '*'.
+  print(foo * 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '%'.
+  print(foo % 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '|'.
+  print(foo | 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '^'.
+  print(foo ^ 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '&'.
+  print(foo & 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<<'.
+  print(foo << 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>>'.
+  print(foo >> 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 dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  print(foo[2] = 2);
+           ^^^" in #t3);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+  print(foo[2]);
+           ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~'.
+  print(~foo);
+        ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+  print(-foo);
+        ^");
+  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);
+        ^".>(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);
+        ^".<=(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);
+        ^".>=(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::==}(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);
+        ^".+(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);
+        ^"./(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);
+        ^".~/(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);
+        ^".*(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);
+        ^".%(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);
+        ^".|(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);
+        ^".^(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);
+        ^".&(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);
+        ^".<<(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);
+        ^".>>(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/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
new file mode 100644
index 0000000..4860020
--- /dev/null
+++ b/pkg/front_end/testcases/general/operator_method_not_found.dart.strong.transformed.expect
@@ -0,0 +1,344 @@
+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 '>'.
+//   print(>foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
+//   print(<=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
+//   print(>=foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
+//   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 '/'.
+//   print(/foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
+//   print(~/foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
+//   print(*foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
+//   print(%foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
+//   print(|foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
+//   print(^foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
+//   print(&foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
+//   print(<<foo);
+//         ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
+//   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 method '<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<'.
+//   print(foo < 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>'.
+//   print(foo > 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<='.
+//   print(foo <= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>='.
+//   print(foo >= 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '-'.
+//   print(foo - 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '+'.
+//   print(foo + 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '/'.
+//   print(foo / 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~/'.
+//   print(foo ~/ 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '*'.
+//   print(foo * 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '%'.
+//   print(foo % 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '|'.
+//   print(foo | 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '^'.
+//   print(foo ^ 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '&'.
+//   print(foo & 2);
+//             ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '<<'.
+//   print(foo << 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '>>'.
+//   print(foo >> 2);
+//             ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]='.
+//   print(foo[2] = 2);
+//            ^^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '[]'.
+//   print(foo[2]);
+//            ^^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named '~'.
+//   print(~foo);
+//         ^
+//
+// pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+//  - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+//   print(-foo);
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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 method '<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<'.
+  print(foo < 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>'.
+  print(foo > 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<='.
+  print(foo <= 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>='.
+  print(foo >= 2);
+            ^^");
+  core::print(foo.{core::Object::==}(2));
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '-'.
+  print(foo - 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '+'.
+  print(foo + 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '/'.
+  print(foo / 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~/'.
+  print(foo ~/ 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '*'.
+  print(foo * 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '%'.
+  print(foo % 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '|'.
+  print(foo | 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '^'.
+  print(foo ^ 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '&'.
+  print(foo & 2);
+            ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '<<'.
+  print(foo << 2);
+            ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '>>'.
+  print(foo >> 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 dynamic #t4 = invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]='.
+  print(foo[2] = 2);
+           ^^^" in #t3);
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '[]'.
+  print(foo[2]);
+           ^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named '~'.
+  print(~foo);
+        ^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
+ - 'Foo' is from 'pkg/front_end/testcases/general/operator_method_not_found.dart'.
+Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
+  print(-foo);
+        ^");
+  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);
+        ^".>(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);
+        ^".<=(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);
+        ^".>=(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::==}(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);
+        ^".+(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);
+        ^"./(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);
+        ^".~/(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);
+        ^".*(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);
+        ^".%(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);
+        ^".|(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);
+        ^".^(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);
+        ^".&(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);
+        ^".<<(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);
+        ^".>>(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/operators.dart b/pkg/front_end/testcases/general/operators.dart
similarity index 100%
rename from pkg/front_end/testcases/operators.dart
rename to pkg/front_end/testcases/general/operators.dart
diff --git a/pkg/front_end/testcases/operators.dart.hierarchy.expect b/pkg/front_end/testcases/general/operators.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/operators.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/operators.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/operators.dart.legacy.expect b/pkg/front_end/testcases/general/operators.dart.legacy.expect
new file mode 100644
index 0000000..4f24fdf
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.legacy.expect
@@ -0,0 +1,72 @@
+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;
+}
+static method main(dynamic arguments) → dynamic {
+  dynamic a = new self::Operators::•();
+  dynamic b = new self::Operators::•();
+  a.+(b);
+  a.&(b);
+  a.~();
+  a.|(b);
+  a.^(b);
+  a./(b);
+  a.==(b);
+  a.>(b);
+  a.>=(b);
+  a.[](0);
+  a.[]=(0, b);
+  a.<<(b);
+  a.<(b);
+  a.<=(b);
+  a.*(b);
+  a.%(b);
+  a.>>(b);
+  a.-(b);
+  a.~/(b);
+  a.unary-();
+}
diff --git a/pkg/front_end/testcases/general/operators.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/operators.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4f24fdf
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.legacy.transformed.expect
@@ -0,0 +1,72 @@
+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;
+}
+static method main(dynamic arguments) → dynamic {
+  dynamic a = new self::Operators::•();
+  dynamic b = new self::Operators::•();
+  a.+(b);
+  a.&(b);
+  a.~();
+  a.|(b);
+  a.^(b);
+  a./(b);
+  a.==(b);
+  a.>(b);
+  a.>=(b);
+  a.[](0);
+  a.[]=(0, b);
+  a.<<(b);
+  a.<(b);
+  a.<=(b);
+  a.*(b);
+  a.%(b);
+  a.>>(b);
+  a.-(b);
+  a.~/(b);
+  a.unary-();
+}
diff --git a/pkg/front_end/testcases/general/operators.dart.outline.expect b/pkg/front_end/testcases/general/operators.dart.outline.expect
new file mode 100644
index 0000000..5f34aeb
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.outline.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Operators extends core::Object {
+  synthetic constructor •() → self::Operators*
+    ;
+  operator +(dynamic other) → dynamic
+    ;
+  operator &(dynamic other) → dynamic
+    ;
+  operator ~() → dynamic
+    ;
+  operator |(dynamic other) → dynamic
+    ;
+  operator ^(dynamic other) → dynamic
+    ;
+  operator /(dynamic other) → dynamic
+    ;
+  operator ==(dynamic other) → core::bool*
+    ;
+  operator >(dynamic other) → dynamic
+    ;
+  operator >=(dynamic other) → dynamic
+    ;
+  operator [](dynamic index) → dynamic
+    ;
+  operator []=(dynamic index, dynamic value) → void
+    ;
+  operator <<(dynamic other) → dynamic
+    ;
+  operator <(dynamic other) → dynamic
+    ;
+  operator <=(dynamic other) → dynamic
+    ;
+  operator *(dynamic other) → dynamic
+    ;
+  operator %(dynamic other) → dynamic
+    ;
+  operator >>(dynamic other) → dynamic
+    ;
+  operator -(dynamic other) → dynamic
+    ;
+  operator ~/(dynamic other) → dynamic
+    ;
+  operator unary-() → dynamic
+    ;
+}
+static method main(dynamic arguments) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/operators.dart.strong.expect b/pkg/front_end/testcases/general/operators.dart.strong.expect
new file mode 100644
index 0000000..79ceba2
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.strong.expect
@@ -0,0 +1,72 @@
+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;
+}
+static method main(dynamic arguments) → dynamic {
+  self::Operators* a = new self::Operators::•();
+  self::Operators* b = new self::Operators::•();
+  a.{self::Operators::+}(b);
+  a.{self::Operators::&}(b);
+  a.{self::Operators::~}();
+  a.{self::Operators::|}(b);
+  a.{self::Operators::^}(b);
+  a.{self::Operators::/}(b);
+  a.{self::Operators::==}(b);
+  a.{self::Operators::>}(b);
+  a.{self::Operators::>=}(b);
+  a.{self::Operators::[]}(0);
+  a.{self::Operators::[]=}(0, b);
+  a.{self::Operators::<<}(b);
+  a.{self::Operators::<}(b);
+  a.{self::Operators::<=}(b);
+  a.{self::Operators::*}(b);
+  a.{self::Operators::%}(b);
+  a.{self::Operators::>>}(b);
+  a.{self::Operators::-}(b);
+  a.{self::Operators::~/}(b);
+  a.{self::Operators::unary-}();
+}
diff --git a/pkg/front_end/testcases/general/operators.dart.strong.transformed.expect b/pkg/front_end/testcases/general/operators.dart.strong.transformed.expect
new file mode 100644
index 0000000..79ceba2
--- /dev/null
+++ b/pkg/front_end/testcases/general/operators.dart.strong.transformed.expect
@@ -0,0 +1,72 @@
+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;
+}
+static method main(dynamic arguments) → dynamic {
+  self::Operators* a = new self::Operators::•();
+  self::Operators* b = new self::Operators::•();
+  a.{self::Operators::+}(b);
+  a.{self::Operators::&}(b);
+  a.{self::Operators::~}();
+  a.{self::Operators::|}(b);
+  a.{self::Operators::^}(b);
+  a.{self::Operators::/}(b);
+  a.{self::Operators::==}(b);
+  a.{self::Operators::>}(b);
+  a.{self::Operators::>=}(b);
+  a.{self::Operators::[]}(0);
+  a.{self::Operators::[]=}(0, b);
+  a.{self::Operators::<<}(b);
+  a.{self::Operators::<}(b);
+  a.{self::Operators::<=}(b);
+  a.{self::Operators::*}(b);
+  a.{self::Operators::%}(b);
+  a.{self::Operators::>>}(b);
+  a.{self::Operators::-}(b);
+  a.{self::Operators::~/}(b);
+  a.{self::Operators::unary-}();
+}
diff --git a/pkg/front_end/testcases/optional.dart b/pkg/front_end/testcases/general/optional.dart
similarity index 100%
rename from pkg/front_end/testcases/optional.dart
rename to pkg/front_end/testcases/general/optional.dart
diff --git a/pkg/front_end/testcases/optional.dart.hierarchy.expect b/pkg/front_end/testcases/general/optional.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/optional.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/optional.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/optional.dart.legacy.expect b/pkg/front_end/testcases/general/optional.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/optional.dart.legacy.expect
rename to pkg/front_end/testcases/general/optional.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/optional.dart.outline.expect b/pkg/front_end/testcases/general/optional.dart.outline.expect
new file mode 100644
index 0000000..5bfe7d5
--- /dev/null
+++ b/pkg/front_end/testcases/general/optional.dart.outline.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+  method method(dynamic x, [dynamic y, dynamic z]) → dynamic
+    ;
+}
+abstract class External extends core::Object {
+  synthetic constructor •() → self::External*
+    ;
+  abstract method externalMethod(core::int* x, [core::int* y, core::int* z]) → core::String*;
+  abstract method listen(self::Listener* listener) → void;
+}
+abstract class Listener extends core::Object {
+  synthetic constructor •() → self::Listener*
+    ;
+  abstract method event(core::String* input, [core::int* x, core::int* y]) → void;
+}
+class TestListener extends self::Listener {
+  synthetic constructor •() → self::TestListener*
+    ;
+  method event(core::String* input, [core::int* x, core::int* y]) → void
+    ;
+}
+class ExtendedListener extends self::Listener {
+  synthetic constructor •() → self::ExtendedListener*
+    ;
+  method event(core::String* input, [core::int* x, core::int* y, dynamic z]) → void
+    ;
+}
+class InvalidListener extends core::Object {
+  synthetic constructor •() → self::InvalidListener*
+    ;
+  method event(dynamic input, [dynamic x]) → void
+    ;
+}
+external static abstract method createExternal() → self::External*;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/optional.dart.strong.expect b/pkg/front_end/testcases/general/optional.dart.strong.expect
new file mode 100644
index 0000000..42a1431
--- /dev/null
+++ b/pkg/front_end/testcases/general/optional.dart.strong.expect
@@ -0,0 +1,98 @@
+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'.
+// Try changing the type of the parameter, or casting the argument to 'Listener'.
+//   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 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 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;
+}
+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 {}
+}
+external static abstract method createExternal() → self::External*;
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  dynamic string1 = foo.{self::Foo::method}(1);
+  dynamic string2 = foo.{self::Foo::method}(1, 2);
+  dynamic string3 = foo.{self::Foo::method}(1, 2, 3);
+  self::External* extern = self::createExternal();
+  core::String* string4 = extern.{self::External::externalMethod}(1);
+  core::String* string5 = extern.{self::External::externalMethod}(1, 2);
+  core::String* string6 = extern.{self::External::externalMethod}(1, 2, 3);
+  extern.{self::External::listen}(new self::TestListener::•());
+  extern.{self::External::listen}(new self::ExtendedListener::•());
+  extern.{self::External::listen}(let final<BottomType> #t1 = 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'.
+Try changing the type of the parameter, or casting the argument to 'Listener'.
+  extern.listen(new InvalidListener());
+                    ^" in new self::InvalidListener::•() as{TypeError} self::Listener*);
+  dynamic nothing1 = foo.{self::Foo::method}();
+  dynamic nothing2 = foo.{self::Foo::method}(1, 2, 3, 4);
+  core::String* nothing3 = extern.{self::External::externalMethod}();
+  core::String* nothing4 = extern.{self::External::externalMethod}(1, 2, 3, 4);
+}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/override.dart b/pkg/front_end/testcases/general/override.dart
similarity index 100%
rename from pkg/front_end/testcases/override.dart
rename to pkg/front_end/testcases/general/override.dart
diff --git a/pkg/front_end/testcases/override.dart.hierarchy.expect b/pkg/front_end/testcases/general/override.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override.dart.legacy.expect b/pkg/front_end/testcases/general/override.dart.legacy.expect
new file mode 100644
index 0000000..15d59c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.legacy.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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::•();
+  }
+}
+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 {
+  dynamic object = args.length.==(0) ? new self::Base::•() : new self::Sub::•();
+  dynamic a = object.method();
+  core::print(a);
+}
diff --git a/pkg/front_end/testcases/general/override.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override.dart.legacy.transformed.expect
new file mode 100644
index 0000000..15d59c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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::•();
+  }
+}
+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 {
+  dynamic object = args.length.==(0) ? new self::Base::•() : new self::Sub::•();
+  dynamic a = object.method();
+  core::print(a);
+}
diff --git a/pkg/front_end/testcases/general/override.dart.outline.expect b/pkg/front_end/testcases/general/override.dart.outline.expect
new file mode 100644
index 0000000..a60858d
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.outline.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class Bar extends self::Foo {
+  synthetic constructor •() → self::Bar*
+    ;
+}
+class Base extends core::Object {
+  synthetic constructor •() → self::Base*
+    ;
+  method method() → self::Foo*
+    ;
+}
+class Sub extends self::Base {
+  synthetic constructor •() → self::Sub*
+    ;
+  method method() → self::Foo*
+    ;
+}
+static method main(core::List<core::String*>* args) → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override.dart.strong.expect b/pkg/front_end/testcases/general/override.dart.strong.expect
new file mode 100644
index 0000000..f6ea171
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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::•();
+  }
+}
+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::num::==}(0) ?{self::Base*} new self::Base::•() : new self::Sub::•();
+  self::Foo* a = object.{self::Base::method}();
+  core::print(a);
+}
diff --git a/pkg/front_end/testcases/general/override.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override.dart.strong.transformed.expect
new file mode 100644
index 0000000..f6ea171
--- /dev/null
+++ b/pkg/front_end/testcases/general/override.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+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::•();
+  }
+}
+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::num::==}(0) ?{self::Base*} new self::Base::•() : new self::Sub::•();
+  self::Foo* a = object.{self::Base::method}();
+  core::print(a);
+}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_after_inference.dart
rename to pkg/front_end/testcases/general/override_check_accessor_after_inference.dart
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_after_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.legacy.expect
new file mode 100644
index 0000000..739abe0
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.legacy.expect
@@ -0,0 +1,47 @@
+library;
+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::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::B*
+    return null;
+}
+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_after_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..739abe0
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.legacy.transformed.expect
@@ -0,0 +1,47 @@
+library;
+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::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::B*
+    return null;
+}
+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_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
new file mode 100644
index 0000000..d28f088
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  set x(self::A* value) → void
+    ;
+  get y() → self::B*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  set x(self::A* value) → void
+    ;
+  get y() → self::B*
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    ;
+  set x(self::A* value) → void
+    ;
+  get y() → self::B*
+    ;
+}
+class F extends self::D {
+  synthetic constructor •() → self::F*
+    ;
+  set x(self::B* value) → void
+    ;
+  get y() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.strong.expect b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.strong.expect
new file mode 100644
index 0000000..11ba780
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_after_inference.dart.strong.expect
@@ -0,0 +1,70 @@
+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::•()
+    ;
+}
+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;
+}
+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/override_check_accessor_basic.dart b/pkg/front_end/testcases/general/override_check_accessor_basic.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_basic.dart
rename to pkg/front_end/testcases/general/override_check_accessor_basic.dart
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_basic.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_accessor_basic.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.legacy.expect
new file mode 100644
index 0000000..26bdb05
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.legacy.expect
@@ -0,0 +1,39 @@
+library;
+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::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::A*
+    return null;
+}
+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_basic.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.legacy.transformed.expect
new file mode 100644
index 0000000..26bdb05
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.legacy.transformed.expect
@@ -0,0 +1,39 @@
+library;
+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::•()
+    ;
+  set x(self::A* value) → void {}
+  get y() → self::A*
+    return null;
+}
+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_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
new file mode 100644
index 0000000..ba70391
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  set x(self::A* value) → void
+    ;
+  get y() → self::A*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  set x(core::Object* value) → void
+    ;
+  get y() → self::B*
+    ;
+}
+class E extends self::C {
+  synthetic constructor •() → self::E*
+    ;
+  set x(self::B* value) → void
+    ;
+  get y() → core::Object*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.strong.expect
new file mode 100644
index 0000000..1e508c5
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_basic.dart.strong.expect
@@ -0,0 +1,62 @@
+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::•()
+    ;
+}
+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;
+}
+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/override_check_accessor_with_covariant_modifier.dart b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart
rename to pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.expect
new file mode 100644
index 0000000..917db56
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.expect
@@ -0,0 +1,37 @@
+library;
+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::•()
+    ;
+  set x1(covariant self::A* value) → void {}
+  set x2(self::A* value) → void {}
+  set x3(covariant self::A* value) → void {}
+  set x4(self::A* value) → void {}
+  set x5(covariant self::A* value) → void {}
+  set x6(covariant self::B* value) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x1(covariant self::B* value) → void {}
+  set x2(covariant self::B* value) → void {}
+  set x3(covariant self::B* value) → void {}
+  set x4(self::B* value) → void {}
+  set x5(covariant core::String* value) → void {}
+  set x6(covariant self::A* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
new file mode 100644
index 0000000..917db56
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
@@ -0,0 +1,37 @@
+library;
+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::•()
+    ;
+  set x1(covariant self::A* value) → void {}
+  set x2(self::A* value) → void {}
+  set x3(covariant self::A* value) → void {}
+  set x4(self::A* value) → void {}
+  set x5(covariant self::A* value) → void {}
+  set x6(covariant self::B* value) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x1(covariant self::B* value) → void {}
+  set x2(covariant self::B* value) → void {}
+  set x3(covariant self::B* value) → void {}
+  set x4(self::B* value) → void {}
+  set x5(covariant core::String* value) → void {}
+  set x6(covariant self::A* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
new file mode 100644
index 0000000..a3eaa5e
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  set x1(covariant self::A* value) → void
+    ;
+  set x2(self::A* value) → void
+    ;
+  set x3(covariant self::A* value) → void
+    ;
+  set x4(self::A* value) → void
+    ;
+  set x5(covariant self::A* value) → void
+    ;
+  set x6(covariant self::B* value) → void
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  set x1(covariant self::B* value) → void
+    ;
+  set x2(covariant self::B* value) → void
+    ;
+  set x3(covariant self::B* value) → void
+    ;
+  set x4(self::B* value) → void
+    ;
+  set x5(covariant core::String* value) → void
+    ;
+  set x6(covariant self::A* value) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.strong.expect
new file mode 100644
index 0000000..bf65db5
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_accessor_with_covariant_modifier.dart.strong.expect
@@ -0,0 +1,59 @@
+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::•()
+    ;
+}
+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 self::A* value) → void {}
+  set x2(self::A* value) → void {}
+  set x3(covariant self::A* value) → void {}
+  set x4(self::A* value) → void {}
+  set x5(covariant self::A* value) → void {}
+  set x6(covariant self::B* value) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  set x1(covariant self::B* value) → void {}
+  set x2(covariant self::B* value) → void {}
+  set x3(covariant self::B* value) → void {}
+  set x4(self::B* value) → void {}
+  set x5(covariant core::String* value) → void {}
+  set x6(covariant self::A* value) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart b/pkg/front_end/testcases/general/override_check_after_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_after_inference.dart
rename to pkg/front_end/testcases/general/override_check_after_inference.dart
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_after_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_after_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_after_inference.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.legacy.expect
new file mode 100644
index 0000000..ebfa2bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.legacy.expect
@@ -0,0 +1,39 @@
+library;
+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::A* x) → void {}
+}
+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_after_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ebfa2bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.legacy.transformed.expect
@@ -0,0 +1,39 @@
+library;
+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::A* x) → void {}
+}
+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_after_inference.dart.outline.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
new file mode 100644
index 0000000..3f00110
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.outline.expect
@@ -0,0 +1,38 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f(self::A* x) → void
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method f(self::A* x) → void
+    ;
+}
+class E extends self::D {
+  synthetic constructor •() → self::E*
+    ;
+  method f(self::A* x) → void
+    ;
+}
+class F extends self::D {
+  synthetic constructor •() → self::F*
+    ;
+  method f(self::B* x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/general/override_check_after_inference.dart.strong.expect
new file mode 100644
index 0000000..531e808
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_after_inference.dart.strong.expect
@@ -0,0 +1,52 @@
+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::•()
+    ;
+}
+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 {}
+}
+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/override_check_basic.dart b/pkg/front_end/testcases/general/override_check_basic.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_basic.dart
rename to pkg/front_end/testcases/general/override_check_basic.dart
diff --git a/pkg/front_end/testcases/override_check_basic.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_basic.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_basic.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_basic.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_basic.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_basic.dart.legacy.expect
new file mode 100644
index 0000000..98dbd08
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.legacy.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::•()
+    ;
+}
+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* {}
+}
+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_basic.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_basic.dart.legacy.transformed.expect
new file mode 100644
index 0000000..98dbd08
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.legacy.transformed.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::•()
+    ;
+}
+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* {}
+}
+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_basic.dart.outline.expect b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
new file mode 100644
index 0000000..aa8593d
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.outline.expect
@@ -0,0 +1,50 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f1(self::A* x) → void
+    ;
+  method f2([self::A* x]) → void
+    ;
+  method f3({self::A* x}) → void
+    ;
+  method f4() → self::A*
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method f1(core::Object* x) → void
+    ;
+  method f2([core::Object* x]) → void
+    ;
+  method f3({core::Object* x}) → void
+    ;
+  method f4() → self::B*
+    ;
+}
+class E extends self::C {
+  synthetic constructor •() → self::E*
+    ;
+  method f1(self::B* x) → void
+    ;
+  method f2([self::B* x]) → void
+    ;
+  method f3({self::B* x}) → void
+    ;
+  method f4() → core::Object*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/general/override_check_basic.dart.strong.expect
new file mode 100644
index 0000000..a225c07
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_basic.dart.strong.expect
@@ -0,0 +1,89 @@
+library;
+//
+// Problems in library:
+//
+// 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() {}
+//     ^
+//
+// 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: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]) {}
+//        ^
+//
+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 f1(self::A* x) → void {}
+  method f2([self::A* x = #C1]) → void {}
+  method f3({self::A* x = #C1}) → void {}
+  method f4() → self::A* {}
+}
+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/override_check_generic_method_f_bounded.dart b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_generic_method_f_bounded.dart
rename to pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.expect
new file mode 100644
index 0000000..1ad8fd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends self::Foo<self::Foo::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = dynamic>() → void;
+}
+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>* = dynamic>() → void {}
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1ad8fd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends self::Foo<self::Foo::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    : super core::Object::•()
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = dynamic>() → void;
+}
+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>* = dynamic>() → void {}
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
new file mode 100644
index 0000000..6865779
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends self::Foo<self::Foo::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
+    ;
+}
+abstract class Bar extends core::Object {
+  synthetic constructor •() → self::Bar*
+    ;
+  abstract method fisk<S extends self::Foo<self::Bar::fisk::S>* = dynamic>() → void;
+}
+class Hest extends core::Object implements self::Bar {
+  synthetic constructor •() → self::Hest*
+    ;
+  @core::override
+  method fisk<U extends self::Foo<self::Hest::fisk::U>* = dynamic>() → void
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.expect
new file mode 100644
index 0000000..b606dd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.expect
@@ -0,0 +1,27 @@
+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 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;
+}
+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 {}
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.transformed.expect
new file mode 100644
index 0000000..b606dd1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_generic_method_f_bounded.dart.strong.transformed.expect
@@ -0,0 +1,27 @@
+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 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;
+}
+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 {}
+}
+static method main() → void {}
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart b/pkg/front_end/testcases/general/override_check_two_substitutions.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_two_substitutions.dart
rename to pkg/front_end/testcases/general/override_check_two_substitutions.dart
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_two_substitutions.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_two_substitutions.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.expect
new file mode 100644
index 0000000..ac75a46
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.expect
@@ -0,0 +1,17 @@
+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>(generic-covariant-impl core::Map<self::A::T*, self::A::f::U*>* m) → void {}
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f<V extends core::Object* = dynamic>(generic-covariant-impl core::Map<core::String*, self::B::f::V*>* m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ac75a46
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.legacy.transformed.expect
@@ -0,0 +1,17 @@
+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>(generic-covariant-impl core::Map<self::A::T*, self::A::f::U*>* m) → void {}
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f<V extends core::Object* = dynamic>(generic-covariant-impl core::Map<core::String*, self::B::f::V*>* m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.outline.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.outline.expect
new file mode 100644
index 0000000..3cc6944
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.outline.expect
@@ -0,0 +1,18 @@
+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*>*
+    ;
+  method f<U extends core::Object* = dynamic>(generic-covariant-impl core::Map<self::A::T*, self::A::f::U*>* m) → void
+    ;
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    ;
+  method f<V extends core::Object* = dynamic>(generic-covariant-impl core::Map<core::String*, self::B::f::V*>* m) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.expect
new file mode 100644
index 0000000..ac75a46
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.expect
@@ -0,0 +1,17 @@
+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>(generic-covariant-impl core::Map<self::A::T*, self::A::f::U*>* m) → void {}
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f<V extends core::Object* = dynamic>(generic-covariant-impl core::Map<core::String*, self::B::f::V*>* m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.transformed.expect
new file mode 100644
index 0000000..ac75a46
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_two_substitutions.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+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>(generic-covariant-impl core::Map<self::A::T*, self::A::f::U*>* m) → void {}
+}
+class B extends self::A<core::String*> {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method f<V extends core::Object* = dynamic>(generic-covariant-impl core::Map<core::String*, self::B::f::V*>* m) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart
similarity index 100%
rename from pkg/front_end/testcases/override_check_with_covariant_modifier.dart
rename to pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_check_with_covariant_modifier.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.expect
new file mode 100644
index 0000000..2e966d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.expect
@@ -0,0 +1,37 @@
+library;
+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 f1(covariant self::A* x) → void {}
+  method f2(self::A* x) → void {}
+  method f3(covariant self::A* x) → void {}
+  method f4(self::A* x) → void {}
+  method f5(covariant self::A* x) → void {}
+  method f6(covariant self::B* x) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(covariant self::B* x) → void {}
+  method f2(covariant self::B* x) → void {}
+  method f3(covariant self::B* x) → void {}
+  method f4(self::B* x) → void {}
+  method f5(covariant core::String* x) → void {}
+  method f6(covariant self::A* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2e966d1
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.legacy.transformed.expect
@@ -0,0 +1,37 @@
+library;
+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 f1(covariant self::A* x) → void {}
+  method f2(self::A* x) → void {}
+  method f3(covariant self::A* x) → void {}
+  method f4(self::A* x) → void {}
+  method f5(covariant self::A* x) → void {}
+  method f6(covariant self::B* x) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(covariant self::B* x) → void {}
+  method f2(covariant self::B* x) → void {}
+  method f3(covariant self::B* x) → void {}
+  method f4(self::B* x) → void {}
+  method f5(covariant core::String* x) → void {}
+  method f6(covariant self::A* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
new file mode 100644
index 0000000..a65975c
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.outline.expect
@@ -0,0 +1,46 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  method f1(covariant self::A* x) → void
+    ;
+  method f2(self::A* x) → void
+    ;
+  method f3(covariant self::A* x) → void
+    ;
+  method f4(self::A* x) → void
+    ;
+  method f5(covariant self::A* x) → void
+    ;
+  method f6(covariant self::B* x) → void
+    ;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method f1(covariant self::B* x) → void
+    ;
+  method f2(covariant self::B* x) → void
+    ;
+  method f3(covariant self::B* x) → void
+    ;
+  method f4(self::B* x) → void
+    ;
+  method f5(covariant core::String* x) → void
+    ;
+  method f6(covariant self::A* x) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.strong.expect
new file mode 100644
index 0000000..7b32667
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_check_with_covariant_modifier.dart.strong.expect
@@ -0,0 +1,59 @@
+library;
+//
+// Problems in library:
+//
+// 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) {}
+//        ^
+//
+// 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) {}
+//        ^
+//
+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 f1(covariant self::A* x) → void {}
+  method f2(self::A* x) → void {}
+  method f3(covariant self::A* x) → void {}
+  method f4(self::A* x) → void {}
+  method f5(covariant self::A* x) → void {}
+  method f6(covariant self::B* x) → void {}
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    : super self::C::•()
+    ;
+  method f1(covariant self::B* x) → void {}
+  method f2(covariant self::B* x) → void {}
+  method f3(covariant self::B* x) → void {}
+  method f4(self::B* x) → void {}
+  method f5(covariant core::String* x) → void {}
+  method f6(covariant self::A* x) → void {}
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_inference_for_setters.dart b/pkg/front_end/testcases/general/override_inference_for_setters.dart
similarity index 100%
rename from pkg/front_end/testcases/override_inference_for_setters.dart
rename to pkg/front_end/testcases/general/override_inference_for_setters.dart
diff --git a/pkg/front_end/testcases/override_inference_for_setters.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_inference_for_setters.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_inference_for_setters.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_inference_for_setters.dart.legacy.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.legacy.expect
new file mode 100644
index 0000000..648154f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.legacy.expect
@@ -0,0 +1,19 @@
+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 {}
+}
+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_for_setters.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.legacy.transformed.expect
new file mode 100644
index 0000000..648154f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.legacy.transformed.expect
@@ -0,0 +1,19 @@
+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 {}
+}
+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_for_setters.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.outline.expect
new file mode 100644
index 0000000..88d2cc3
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+  get foo() → core::num*
+    ;
+  set foo(dynamic newFoo) → void
+    ;
+}
+class A extends self::B {
+  synthetic constructor •() → self::A*
+    ;
+  set foo(dynamic newFoo) → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_inference_for_setters.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.strong.expect
new file mode 100644
index 0000000..648154f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.strong.expect
@@ -0,0 +1,19 @@
+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 {}
+}
+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_for_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_for_setters.dart.strong.transformed.expect
new file mode 100644
index 0000000..648154f
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_for_setters.dart.strong.transformed.expect
@@ -0,0 +1,19 @@
+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 {}
+}
+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/override_inference_named_parameters_ordering.dart b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart
similarity index 100%
rename from pkg/front_end/testcases/override_inference_named_parameters_ordering.dart
rename to pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart
diff --git a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.hierarchy.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.legacy.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.legacy.expect
new file mode 100644
index 0000000..635d689
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.legacy.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::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+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 {}
+}
+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_inference_named_parameters_ordering.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.legacy.transformed.expect
new file mode 100644
index 0000000..635d689
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.legacy.transformed.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::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+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 {}
+}
+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_inference_named_parameters_ordering.dart.outline.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.outline.expect
new file mode 100644
index 0000000..bdf6a97
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.outline.expect
@@ -0,0 +1,42 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method foo({core::bool* c = true, core::bool* a}) → dynamic
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  method foo({core::bool* c = true, core::bool* a}) → dynamic
+    ;
+}
+class C extends self::B {
+  synthetic constructor •() → self::C*
+    ;
+  method foo({core::bool* c = true, core::bool* a}) → dynamic
+    ;
+}
+class A1 extends core::Object {
+  synthetic constructor •() → self::A1*
+    ;
+  method foo({core::bool* a = true, core::bool* c}) → dynamic
+    ;
+}
+class B1 extends self::A1 {
+  synthetic constructor •() → self::B1*
+    ;
+  method foo({core::bool* a = true, core::bool* c}) → dynamic
+    ;
+}
+class C1 extends self::B1 {
+  synthetic constructor •() → self::C1*
+    ;
+  method foo({core::bool* a = true, core::bool* c}) → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.strong.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.strong.expect
new file mode 100644
index 0000000..635d689
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.strong.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::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+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 {}
+}
+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_inference_named_parameters_ordering.dart.strong.transformed.expect b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.strong.transformed.expect
new file mode 100644
index 0000000..635d689
--- /dev/null
+++ b/pkg/front_end/testcases/general/override_inference_named_parameters_ordering.dart.strong.transformed.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::•()
+    ;
+  method foo({core::bool* c = #C1, core::bool* a = #C2}) → dynamic {}
+}
+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 {}
+}
+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/part_as_entry_point.dart b/pkg/front_end/testcases/general/part_as_entry_point.dart
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart
rename to pkg/front_end/testcases/general/part_as_entry_point.dart
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.legacy.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart.legacy.expect
rename to pkg/front_end/testcases/general/part_as_entry_point.dart.legacy.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/part_as_entry_point.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.outline.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart.outline.expect
rename to pkg/front_end/testcases/general/part_as_entry_point.dart.outline.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.strong.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart.strong.expect
rename to pkg/front_end/testcases/general/part_as_entry_point.dart.strong.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point.dart.strong.transformed.expect b/pkg/front_end/testcases/general/part_as_entry_point.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/part_as_entry_point.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/part_as_entry_point_lib.dart b/pkg/front_end/testcases/general/part_as_entry_point_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/part_as_entry_point_lib.dart
rename to pkg/front_end/testcases/general/part_as_entry_point_lib.dart
diff --git a/pkg/front_end/testcases/part_not_part_of.dart b/pkg/front_end/testcases/general/part_not_part_of.dart
similarity index 100%
rename from pkg/front_end/testcases/part_not_part_of.dart
rename to pkg/front_end/testcases/general/part_not_part_of.dart
diff --git a/pkg/front_end/testcases/general/part_not_part_of.dart.legacy.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.legacy.expect
new file mode 100644
index 0000000..f22e87e
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.legacy.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.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f22e87e
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.legacy.transformed.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.dart.outline.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.outline.expect
new file mode 100644
index 0000000..022180b
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.outline.expect
@@ -0,0 +1,29 @@
+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 "org-dartlang-testcase:///part_not_part_of_lib2.dart";
+
+part part_not_part_of_lib1.dart;
+static method main() → dynamic
+  ;
+
+library;
+import self as self2;
+
+import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
+
+static method methodFromLib2() → dynamic
+  ;
+
+library;
+import self as self3;
+
+static method methodFromLib1() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/part_not_part_of.dart.strong.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.strong.expect
new file mode 100644
index 0000000..f22e87e
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.strong.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.dart.strong.transformed.expect b/pkg/front_end/testcases/general/part_not_part_of.dart.strong.transformed.expect
new file mode 100644
index 0000000..f22e87e
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of.dart.strong.transformed.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_lib1.dart b/pkg/front_end/testcases/general/part_not_part_of_lib1.dart
new file mode 100644
index 0000000..90bd84b
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_lib1.dart
@@ -0,0 +1,5 @@
+// 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.
+
+methodFromLib1() {}
diff --git a/pkg/front_end/testcases/general/part_not_part_of_lib2.dart b/pkg/front_end/testcases/general/part_not_part_of_lib2.dart
new file mode 100644
index 0000000..1dfb49c
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_lib2.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.
+
+import "part_not_part_of_lib1.dart";
+
+methodFromLib2() {
+  methodFromLib1();
+}
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart
similarity index 100%
rename from pkg/front_end/testcases/part_not_part_of_same_named_library.dart
rename to pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.legacy.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.legacy.expect
new file mode 100644
index 0000000..094c4da
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.legacy.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Warning: 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_not_part_of_same_named_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.legacy.transformed.expect
new file mode 100644
index 0000000..094c4da
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.legacy.transformed.expect
@@ -0,0 +1,30 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Warning: 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_not_part_of_same_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
new file mode 100644
index 0000000..6cf04c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.outline.expect
@@ -0,0 +1,25 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart:8:6: Warning: 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 "org-dartlang-testcase:///part_not_part_of_same_named_library_lib2.dart";
+
+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
+  ;
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.strong.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.strong.expect
new file mode 100644
index 0000000..2048308
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.strong.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_not_part_of_same_named_library.dart.strong.transformed.expect b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.strong.transformed.expect
new file mode 100644
index 0000000..2048308
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library.dart.strong.transformed.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_not_part_of_same_named_library_lib1.dart b/pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart
new file mode 100644
index 0000000..1e32330
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib1.dart
@@ -0,0 +1,7 @@
+// 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 foo;
+
+methodFromLib1() {}
diff --git a/pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib2.dart b/pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib2.dart
new file mode 100644
index 0000000..11ce0fa
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_not_part_of_same_named_library_lib2.dart
@@ -0,0 +1,11 @@
+// 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 foo;
+
+part "part_not_part_of_same_named_library_lib1.dart";
+
+methodFromLib2() {
+  methodFromLib1();
+}
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart
similarity index 100%
rename from pkg/front_end/testcases/part_part_of_different_unnamed_library.dart
rename to pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.legacy.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.legacy.expect
new file mode 100644
index 0000000..0d57452
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.legacy.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Warning: 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_different_unnamed_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0d57452
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Warning: 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_different_unnamed_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
new file mode 100644
index 0000000..de523ea
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart:8:6: Warning: 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 "org-dartlang-testcase:///part_part_of_different_unnamed_library_lib2.dart";
+
+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
+  ;
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.strong.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.strong.expect
new file mode 100644
index 0000000..693c671
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.strong.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_different_unnamed_library.dart.strong.transformed.expect b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.strong.transformed.expect
new file mode 100644
index 0000000..693c671
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library.dart.strong.transformed.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_different_unnamed_library_lib1.dart b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart
new file mode 100644
index 0000000..d507d77
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib1.dart
@@ -0,0 +1,7 @@
+// 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 "part_part_of_different_unnamed_library_lib2.dart";
+
+methodFromLib1() {}
diff --git a/pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.dart
new file mode 100644
index 0000000..e7e7b29
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_different_unnamed_library_lib2.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 "part_part_of_different_unnamed_library_lib1.dart";
+
+methodFromLib2() {
+  methodFromLib1();
+}
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart
similarity index 100%
rename from pkg/front_end/testcases/part_part_of_differently_named_library.dart
rename to pkg/front_end/testcases/general/part_part_of_differently_named_library.dart
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.legacy.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.legacy.expect
new file mode 100644
index 0000000..abc4112
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.legacy.expect
@@ -0,0 +1,29 @@
+library foo;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Warning: 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/part_part_of_differently_named_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.legacy.transformed.expect
new file mode 100644
index 0000000..abc4112
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+library foo;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Warning: 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/part_part_of_differently_named_library.dart.outline.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
new file mode 100644
index 0000000..886001a
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.outline.expect
@@ -0,0 +1,24 @@
+library foo;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/part_part_of_differently_named_library.dart:10:6: Warning: 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 "org-dartlang-testcase:///part_part_of_differently_named_library_lib2.dart";
+
+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
+  ;
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.strong.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.strong.expect
new file mode 100644
index 0000000..0ec56bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.strong.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/part_part_of_differently_named_library.dart.strong.transformed.expect b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.strong.transformed.expect
new file mode 100644
index 0000000..0ec56bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library.dart.strong.transformed.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/part_part_of_differently_named_library_lib1.dart b/pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart
new file mode 100644
index 0000000..2b7c83b
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library_lib1.dart
@@ -0,0 +1,7 @@
+// 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 bar;
+
+methodFromLib1() {}
diff --git a/pkg/front_end/testcases/general/part_part_of_differently_named_library_lib2.dart b/pkg/front_end/testcases/general/part_part_of_differently_named_library_lib2.dart
new file mode 100644
index 0000000..cccf8e2
--- /dev/null
+++ b/pkg/front_end/testcases/general/part_part_of_differently_named_library_lib2.dart
@@ -0,0 +1,11 @@
+// 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 bar;
+
+part "part_part_of_differently_named_library_lib1.dart";
+
+methodFromLib2() {
+  methodFromLib1();
+}
diff --git a/pkg/front_end/testcases/platform.dart b/pkg/front_end/testcases/general/platform.dart
similarity index 100%
rename from pkg/front_end/testcases/platform.dart
rename to pkg/front_end/testcases/general/platform.dart
diff --git a/pkg/front_end/testcases/platform.dart.legacy.expect b/pkg/front_end/testcases/general/platform.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.legacy.expect
rename to pkg/front_end/testcases/general/platform.dart.legacy.expect
diff --git a/pkg/front_end/testcases/platform.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/platform.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/platform.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/platform.dart.outline.expect b/pkg/front_end/testcases/general/platform.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.outline.expect
rename to pkg/front_end/testcases/general/platform.dart.outline.expect
diff --git a/pkg/front_end/testcases/platform.dart.strong.expect b/pkg/front_end/testcases/general/platform.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.strong.expect
rename to pkg/front_end/testcases/general/platform.dart.strong.expect
diff --git a/pkg/front_end/testcases/platform.dart.strong.transformed.expect b/pkg/front_end/testcases/general/platform.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/platform.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/platform.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart b/pkg/front_end/testcases/general/prefer_baseclass.dart
similarity index 100%
rename from pkg/front_end/testcases/prefer_baseclass.dart
rename to pkg/front_end/testcases/general/prefer_baseclass.dart
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.hierarchy.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/prefer_baseclass.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/prefer_baseclass.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/prefer_baseclass.dart.legacy.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.legacy.expect
new file mode 100644
index 0000000..d3d9325
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.legacy.expect
@@ -0,0 +1,42 @@
+library;
+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 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/prefer_baseclass.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.legacy.transformed.expect
new file mode 100644
index 0000000..d3d9325
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.legacy.transformed.expect
@@ -0,0 +1,42 @@
+library;
+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 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/prefer_baseclass.dart.outline.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.outline.expect
new file mode 100644
index 0000000..c337c34
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.outline.expect
@@ -0,0 +1,34 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+class AB1 extends self::A implements self::B {
+  synthetic constructor •() → self::AB1*
+    ;
+}
+class AB2 extends self::A implements self::B {
+  synthetic constructor •() → self::AB2*
+    ;
+}
+class BA1 extends self::B implements self::A {
+  synthetic constructor •() → self::BA1*
+    ;
+}
+class BA2 extends self::B implements self::A {
+  synthetic constructor •() → self::BA2*
+    ;
+}
+static method takeSubclassOfA(dynamic obj) → dynamic
+  ;
+static method takeSubclassOfB(dynamic obj) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/prefer_baseclass.dart.strong.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.strong.expect
new file mode 100644
index 0000000..d3d9325
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.strong.expect
@@ -0,0 +1,42 @@
+library;
+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 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/prefer_baseclass.dart.strong.transformed.expect b/pkg/front_end/testcases/general/prefer_baseclass.dart.strong.transformed.expect
new file mode 100644
index 0000000..d3d9325
--- /dev/null
+++ b/pkg/front_end/testcases/general/prefer_baseclass.dart.strong.transformed.expect
@@ -0,0 +1,42 @@
+library;
+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 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/private_method_tearoff.dart b/pkg/front_end/testcases/general/private_method_tearoff.dart
similarity index 100%
rename from pkg/front_end/testcases/private_method_tearoff.dart
rename to pkg/front_end/testcases/general/private_method_tearoff.dart
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/private_method_tearoff.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/private_method_tearoff.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.expect
new file mode 100644
index 0000000..8eaac35
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.expect
@@ -0,0 +1,43 @@
+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::•()
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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 {}
+}
+static method baz(pri::Bar* bar) → void {
+  core::print("${bar._f.runtimeType}");
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.transformed.expect
new file mode 100644
index 0000000..8eaac35
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.legacy.transformed.expect
@@ -0,0 +1,43 @@
+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::•()
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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 {}
+}
+static method baz(pri::Bar* bar) → void {
+  core::print("${bar._f.runtimeType}");
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
new file mode 100644
index 0000000..90d37ed
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.outline.expect
@@ -0,0 +1,32 @@
+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*
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+}
+class Baz extends self::Foo {
+  synthetic constructor •() → self::Baz*
+    ;
+}
+static method main() → dynamic
+  ;
+
+library;
+import self as pri;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  synthetic constructor •() → pri::Bar*
+    ;
+  method _f() → void
+    ;
+}
+static method baz(pri::Bar* bar) → void
+  ;
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.expect
new file mode 100644
index 0000000..7289dfe
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.expect
@@ -0,0 +1,43 @@
+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::•()
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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 {}
+}
+static method baz(pri::Bar* bar) → void {
+  core::print("${bar.{pri::Bar::_f}.{core::Object::runtimeType}}");
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.transformed.expect
new file mode 100644
index 0000000..7289dfe
--- /dev/null
+++ b/pkg/front_end/testcases/general/private_method_tearoff.dart.strong.transformed.expect
@@ -0,0 +1,43 @@
+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::•()
+    ;
+  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
+    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+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 {}
+}
+static method baz(pri::Bar* bar) → void {
+  core::print("${bar.{pri::Bar::_f}.{core::Object::runtimeType}}");
+}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_method_tearoff.dart::_f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/private_method_tearoff_lib.dart b/pkg/front_end/testcases/general/private_method_tearoff_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/private_method_tearoff_lib.dart
rename to pkg/front_end/testcases/general/private_method_tearoff_lib.dart
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart b/pkg/front_end/testcases/general/public_method_tearoff.dart
similarity index 100%
rename from pkg/front_end/testcases/public_method_tearoff.dart
rename to pkg/front_end/testcases/general/public_method_tearoff.dart
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.hierarchy.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/public_method_tearoff.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/public_method_tearoff.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.expect
new file mode 100644
index 0000000..59a106f
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.expect
@@ -0,0 +1,28 @@
+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 {}
+}
+static method baz(pub::Bar* bar) → void {
+  core::print("${bar.f.runtimeType}");
+}
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.transformed.expect
new file mode 100644
index 0000000..59a106f
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.legacy.transformed.expect
@@ -0,0 +1,28 @@
+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 {}
+}
+static method baz(pub::Bar* bar) → void {
+  core::print("${bar.f.runtimeType}");
+}
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.outline.expect
new file mode 100644
index 0000000..9053c8b
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.outline.expect
@@ -0,0 +1,25 @@
+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*
+    ;
+}
+static method main() → void
+  ;
+
+library;
+import self as pub;
+import "dart:core" as core;
+
+class Bar extends core::Object {
+  synthetic constructor •() → pub::Bar*
+    ;
+  method f() → void
+    ;
+}
+static method baz(pub::Bar* bar) → void
+  ;
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.expect
new file mode 100644
index 0000000..a5772cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.expect
@@ -0,0 +1,28 @@
+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 {}
+}
+static method baz(pub::Bar* bar) → void {
+  core::print("${bar.{pub::Bar::f}.{core::Object::runtimeType}}");
+}
diff --git a/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.transformed.expect
new file mode 100644
index 0000000..a5772cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/public_method_tearoff.dart.strong.transformed.expect
@@ -0,0 +1,28 @@
+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 {}
+}
+static method baz(pub::Bar* bar) → void {
+  core::print("${bar.{pub::Bar::f}.{core::Object::runtimeType}}");
+}
diff --git a/pkg/front_end/testcases/public_method_tearoff_lib.dart b/pkg/front_end/testcases/general/public_method_tearoff_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/public_method_tearoff_lib.dart
rename to pkg/front_end/testcases/general/public_method_tearoff_lib.dart
diff --git a/pkg/front_end/testcases/qualified.dart b/pkg/front_end/testcases/general/qualified.dart
similarity index 100%
rename from pkg/front_end/testcases/qualified.dart
rename to pkg/front_end/testcases/general/qualified.dart
diff --git a/pkg/front_end/testcases/qualified.dart.hierarchy.expect b/pkg/front_end/testcases/general/qualified.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/qualified.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/qualified.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/qualified.dart.legacy.expect b/pkg/front_end/testcases/general/qualified.dart.legacy.expect
new file mode 100644
index 0000000..c2cbc68
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.legacy.expect
@@ -0,0 +1,111 @@
+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: Warning: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
+// 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:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+//
+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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+}
+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::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+}
+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::•().supertypeMethod();
+  new self::WithMixin::•().foo();
+  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    : super core::Object::•()
+    ;
+  method supertypeMethod() → dynamic {
+    core::print("I'm supertypeMethod form lib.Supertype");
+  }
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/qualified.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1f969c7
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.legacy.transformed.expect
@@ -0,0 +1,114 @@
+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: Warning: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
+// 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:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+//
+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 class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
+    core::print("I'm 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::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+}
+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::•().supertypeMethod();
+  new self::WithMixin::•().foo();
+  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    : super core::Object::•()
+    ;
+  method supertypeMethod() → dynamic {
+    core::print("I'm supertypeMethod form lib.Supertype");
+  }
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.outline.expect b/pkg/front_end/testcases/general/qualified.dart.outline.expect
new file mode 100644
index 0000000..08d37e9
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.outline.expect
@@ -0,0 +1,94 @@
+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: Warning: Type 'lib.Missing' not found.
+// class Bad extends lib.Missing {
+//                   ^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
+//   lib.Missing method() {}
+//   ^^^^^^^^^^^
+//
+// 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:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+//
+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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+}
+class WithMixin extends self::_WithMixin&Supertype&Mixin {
+  synthetic constructor •() → self::WithMixin*
+    ;
+}
+class IllegalSupertype extends core::Object {
+  synthetic constructor •() → self::IllegalSupertype*
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  constructor •() → self::C<self::C::T*>*
+    ;
+  constructor a() → self::C<self::C::T*>*
+    ;
+  static factory b<T extends core::Object* = dynamic>() → self::C<self::C::b::T*>*
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+}
+static method main() → dynamic
+  ;
+
+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 field dynamic _redirecting# = <dynamic>[lib::C::b];
+  constructor •() → lib::C<lib::C::T*>*
+    ;
+  constructor a() → lib::C<lib::C::T*>*
+    ;
+  static factory b<T extends core::Object* = dynamic>() → lib::C<lib::C::b::T*>*
+    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    ;
+  method supertypeMethod() → dynamic
+    ;
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    ;
+  method foo() → dynamic
+    ;
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.strong.expect b/pkg/front_end/testcases/general/qualified.dart.strong.expect
new file mode 100644
index 0000000..5b18e11
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.strong.expect
@@ -0,0 +1,107 @@
+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' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+//
+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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+}
+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::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+}
+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}();
+  new self::WithMixin::•().{lib::Mixin::foo}();
+  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
+  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*>*
+    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    : super core::Object::•()
+    ;
+  method supertypeMethod() → dynamic {
+    core::print("I'm supertypeMethod form lib.Supertype");
+  }
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+}
diff --git a/pkg/front_end/testcases/general/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/general/qualified.dart.strong.transformed.expect
new file mode 100644
index 0000000..22e7c21
--- /dev/null
+++ b/pkg/front_end/testcases/general/qualified.dart.strong.transformed.expect
@@ -0,0 +1,110 @@
+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' can't be used as supertype.
+// class IllegalSupertype extends lib.VoidFunction {}
+//       ^
+//
+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 class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
+  synthetic constructor •() → self::_WithMixin&Supertype&Mixin*
+    : super lib::Supertype::•()
+    ;
+  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
+    core::print("I'm 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::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
+  static field dynamic _redirecting# = <dynamic>[self::C::b];
+  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*>*
+    let <T extends core::Object* = dynamic>() →* lib::C<lib::C::b::T*>* #redirecting_factory = lib::C::b in let self::C::b::T* #typeArg0 = null in invalid-expression;
+}
+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}();
+  new self::WithMixin::•().{lib::Mixin::foo}();
+  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
+  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*>*
+    let<BottomType> #redirecting_factory = lib::C::a in let lib::C::b::T* #typeArg0 = null in invalid-expression;
+}
+class Supertype extends core::Object {
+  synthetic constructor •() → lib::Supertype*
+    : super core::Object::•()
+    ;
+  method supertypeMethod() → dynamic {
+    core::print("I'm supertypeMethod form lib.Supertype");
+  }
+}
+abstract class Mixin extends core::Object {
+  synthetic constructor •() → lib::Mixin*
+    : super core::Object::•()
+    ;
+  method foo() → dynamic {
+    core::print("I'm Mixin.foo");
+  }
+}
diff --git a/pkg/front_end/testcases/qualified_lib.dart b/pkg/front_end/testcases/general/qualified_lib.dart
similarity index 100%
rename from pkg/front_end/testcases/qualified_lib.dart
rename to pkg/front_end/testcases/general/qualified_lib.dart
diff --git a/pkg/front_end/testcases/qualified_part.dart b/pkg/front_end/testcases/general/qualified_part.dart
similarity index 100%
rename from pkg/front_end/testcases/qualified_part.dart
rename to pkg/front_end/testcases/general/qualified_part.dart
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart b/pkg/front_end/testcases/general/redirecting_constructor.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_constructor.dart
rename to pkg/front_end/testcases/general/redirecting_constructor.dart
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_constructor.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_constructor.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.expect
new file mode 100644
index 0000000..64d4160
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A*
+    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.transformed.expect
new file mode 100644
index 0000000..64d4160
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A*
+    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.outline.expect
new file mode 100644
index 0000000..9914c1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A*
+    ;
+  static factory fisk() → self::A*
+    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.expect
new file mode 100644
index 0000000..64d4160
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A*
+    let dynamic #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..aa1e6b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_constructor.dart.strong.transformed.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory fisk() → self::A*
+    let<BottomType> #redirecting_factory = self::B::• in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory.dart b/pkg/front_end/testcases/general/redirecting_factory.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory.dart
rename to pkg/front_end/testcases/general/redirecting_factory.dart
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
new file mode 100644
index 0000000..c4b1096
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.outline.expect
@@ -0,0 +1,55 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class FooBase<Tf extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  abstract get x() → core::int*;
+  static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
+    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+}
+abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
+    let dynamic #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+}
+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*>*
+    ;
+}
+class Builder<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X*>*
+    ;
+  method method() → dynamic
+    ;
+}
+class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
+    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+}
+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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
+    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+}
+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*>*
+    ;
+}
+class Base<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M*>*
+    ;
+}
+class Mixin<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M*>*
+    ;
+}
+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
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.strong.expect
new file mode 100644
index 0000000..4de86d6
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.strong.expect
@@ -0,0 +1,74 @@
+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 field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  abstract get x() → core::int*;
+  static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
+    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+}
+abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
+    let dynamic #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+}
+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*}>");
+  }
+}
+class Builder<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    return new self::Bar::•<core::String*, self::Builder::X*>(4);
+  }
+}
+class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
+    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+}
+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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
+    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+}
+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::•()
+    ;
+}
+class Base<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M*>*
+    : super core::Object::•()
+    ;
+}
+class Mixin<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M*>*
+    : super core::Object::•()
+    ;
+}
+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(new self::Bar::•<core::String*, core::double*>(4).{self::FooBase::x});
+  new self::SimpleCaseImpl2::•<core::int*, core::double*>();
+  new self::Mix::•<core::double*>();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory.dart.strong.transformed.expect
new file mode 100644
index 0000000..fca2b95
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory.dart.strong.transformed.expect
@@ -0,0 +1,74 @@
+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 field dynamic _redirecting# = <dynamic>[self::FooBase::•];
+  abstract get x() → core::int*;
+  static factory •<Tf extends core::Object* = dynamic>(core::int* x) → self::FooBase<self::FooBase::•::Tf*>*
+    let <T extends core::Object* = dynamic>(core::int*) →* self::Foo<self::Foo::•::T*>* #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf* #typeArg0 = null in invalid-expression;
+}
+abstract class Foo<T extends core::Object* = dynamic> extends core::Object implements self::FooBase<dynamic> {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  static factory •<T extends core::Object* = dynamic>(core::int* x) → self::Foo<self::Foo::•::T*>*
+    let<BottomType> #redirecting_factory = self::Bar::• in let core::String* #typeArg0 = null in let self::Foo::•::T* #typeArg1 = null in invalid-expression;
+}
+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*}>");
+  }
+}
+class Builder<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Builder<self::Builder::X*>*
+    : super core::Object::•()
+    ;
+  method method() → dynamic {
+    return new self::Bar::•<core::String*, self::Builder::X*>(4);
+  }
+}
+class SimpleCase<A extends core::Object* = dynamic, B extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
+  static factory •<A extends core::Object* = dynamic, B extends core::Object* = dynamic>() → self::SimpleCase<self::SimpleCase::•::A*, self::SimpleCase::•::B*>*
+    let <Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() →* self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>* #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A* #typeArg0 = null in let self::SimpleCase::•::B* #typeArg1 = null in invalid-expression;
+}
+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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
+  static factory •<Ai extends core::Object* = dynamic, Bi extends core::Object* = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai*, self::SimpleCaseImpl::•::Bi*>*
+    let<BottomType> #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai* #typeArg0 = null in let self::SimpleCaseImpl::•::Bi* #typeArg1 = null in invalid-expression;
+}
+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::•()
+    ;
+}
+class Base<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Base<self::Base::M*>*
+    : super core::Object::•()
+    ;
+}
+class Mixin<M extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Mixin<self::Mixin::M*>*
+    : super core::Object::•()
+    ;
+}
+class Mix<M extends core::Object* = dynamic> extends self::Base<self::Mix::M*> implements self::Mixin<self::Mix::M*> {
+  synthetic constructor •() → self::Mix<self::Mix::M*>*
+    : super self::Base::•()
+    ;
+}
+static method main() → dynamic {
+  core::print(new self::Bar::•<core::String*, core::double*>(4).{self::FooBase::x});
+  new self::SimpleCaseImpl2::•<core::int*, core::double*>();
+  new self::Mix::•<core::double*>();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_chain_test.dart
rename to pkg/front_end/testcases/general/redirecting_factory_chain_test.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_chain_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_chain_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_chain_test.dart.outline.expect
rename to pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.expect
new file mode 100644
index 0000000..0acfd3a
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.expect
@@ -0,0 +1,17 @@
+library redirecting_factory_constructors.chain_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory first() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A*
+    let dynamic #redirecting_factory = self::A::first in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..147eb39
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_chain_test.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library redirecting_factory_constructors.chain_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory first() → self::A*
+    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
+  static factory second() → self::A*
+    let () →* self::A* #redirecting_factory = self::A::first in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_const_inference.dart
rename to pkg/front_end/testcases/general/redirecting_factory_const_inference.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_const_inference.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.expect
new file mode 100644
index 0000000..6a8a46f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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>().x;
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6a8a46f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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>().x;
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.outline.expect
new file mode 100644
index 0000000..2d13710
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.outline.expect
@@ -0,0 +1,25 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::_X<self::A::T*>* x;
+  constructor •(self::_X<self::A::T*>* x) → self::A<self::A::T*>*
+    ;
+}
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  constructor •() → self::B<self::B::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
new file mode 100644
index 0000000..45acdcc
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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};
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<core::Null*> {}
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..c84f680
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_const_inference.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class _X<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::_X::•];
+  static factory •<T extends core::Object* = dynamic>() → self::_X<self::_X::•::T*>*
+    let<BottomType> #redirecting_factory = self::_Y::• in let self::_X::•::T* #typeArg0 = null in invalid-expression;
+}
+class _Y<T extends core::Object* = dynamic> extends core::Object implements self::_X<self::_Y::T*> {
+  const constructor •() → self::_Y<self::_Y::T*>*
+    : super core::Object::•()
+    ;
+}
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+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};
+  if(!(x is self::_Y<core::Null*>*)) {
+    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
+  }
+}
+
+constants  {
+  #C1 = self::_Y<core::Null*> {}
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_metadata.dart
rename to pkg/front_end/testcases/general/redirecting_factory_metadata.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_metadata.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_metadata.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.expect
new file mode 100644
index 0000000..b9cfe87
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  constructor named(dynamic p) → self::Foo*
+    : super core::Object::•()
+    ;
+  @#C1
+  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+}
+static const field dynamic forParameter = #C2;
+static const field dynamic forFactoryItself = #C1;
+static const field dynamic anotherForParameter = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 2
+  #C2 = 1
+  #C3 = 3
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.transformed.expect
new file mode 100644
index 0000000..b9cfe87
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.legacy.transformed.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  constructor named(dynamic p) → self::Foo*
+    : super core::Object::•()
+    ;
+  @#C1
+  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+}
+static const field dynamic forParameter = #C2;
+static const field dynamic forFactoryItself = #C1;
+static const field dynamic anotherForParameter = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 2
+  #C2 = 1
+  #C3 = 3
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
new file mode 100644
index 0000000..8d1d812
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  constructor named(dynamic p) → self::Foo*
+    ;
+  @self::forFactoryItself
+  static factory •(dynamic p) → self::Foo*
+    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+}
+static const field dynamic forParameter = 1;
+static const field dynamic forFactoryItself = 2;
+static const field dynamic anotherForParameter = 3;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.expect
new file mode 100644
index 0000000..c3ccb98
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  constructor named(dynamic p) → self::Foo*
+    : super core::Object::•()
+    ;
+  @#C1
+  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
+}
+static const field core::int* forParameter = #C2;
+static const field core::int* forFactoryItself = #C1;
+static const field core::int* anotherForParameter = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 2
+  #C2 = 1
+  #C3 = 3
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.transformed.expect
new file mode 100644
index 0000000..b80664b
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_metadata.dart.strong.transformed.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
+  constructor named(dynamic p) → self::Foo*
+    : super core::Object::•()
+    ;
+  @#C1
+  static factory •(@#C2 @#C3 dynamic p) → self::Foo*
+    let<BottomType> #redirecting_factory = self::Foo::named in invalid-expression;
+}
+static const field core::int* forParameter = #C2;
+static const field core::int* forFactoryItself = #C1;
+static const field core::int* anotherForParameter = #C3;
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 2
+  #C2 = 1
+  #C3 = 3
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_simple_test.dart
rename to pkg/front_end/testcases/general/redirecting_factory_simple_test.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_simple_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_simple_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_simple_test.dart.outline.expect
rename to pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.expect
new file mode 100644
index 0000000..c2b0440
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.expect
@@ -0,0 +1,15 @@
+library redirecting_factory_constructors.simple_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::A::• in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..1f0102f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_simple_test.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+library redirecting_factory_constructors.simple_test;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeargs_test.dart
rename to pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.outline.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.expect
new file mode 100644
index 0000000..4c77d36
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.expect
@@ -0,0 +1,30 @@
+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::•()
+    ;
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
+}
+class B<T extends self::X* = self::X*> extends self::A {
+  constructor •() → self::B<self::B::T*>*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::Y*>();
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..fa75003
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeargs_test.dart.strong.transformed.expect
@@ -0,0 +1,30 @@
+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::•()
+    ;
+}
+class Y extends self::X {
+  synthetic constructor •() → self::Y*
+    : super self::X::•()
+    ;
+}
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::redir];
+  constructor •() → self::A*
+    : super core::Object::•()
+    ;
+  static factory redir() → self::A*
+    let<BottomType> #redirecting_factory = self::B::• in let self::Y* #typeArg0 = null in invalid-expression;
+}
+class B<T extends self::X* = self::X*> extends self::A {
+  constructor •() → self::B<self::B::T*>*
+    : super self::A::•()
+    ;
+}
+static method main() → dynamic {
+  new self::B::•<self::Y*>();
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparam_test.dart
rename to pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.outline.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.expect
new file mode 100644
index 0000000..55767fb
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.expect
@@ -0,0 +1,15 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::redir];
+  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*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<core::int*, core::String*>(42, "foobar");
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..60f8cfb
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparam_test.dart.strong.transformed.expect
@@ -0,0 +1,15 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::redir];
+  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*>*
+    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<core::int*, core::String*>(42, "foobar");
+}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart
rename to pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.legacy.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.legacy.expect
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.outline.expect
rename to pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.expect
new file mode 100644
index 0000000..3d46949
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.expect
@@ -0,0 +1,25 @@
+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::•()
+    ;
+}
+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 field dynamic _redirecting# = <dynamic>[self::A::redir];
+  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*>*
+    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<self::X*, self::Y*>(new self::X::•(), new self::Y::•());
+}
diff --git a/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..bafad0a
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
@@ -0,0 +1,25 @@
+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::•()
+    ;
+}
+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 field dynamic _redirecting# = <dynamic>[self::A::redir];
+  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*>*
+    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T* #typeArg0 = null in let self::A::redir::S* #typeArg1 = null in invalid-expression;
+}
+static method main() → dynamic {
+  new self::A::•<self::X*, self::Y*>(new self::X::•(), new self::Y::•());
+}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart
rename to pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
new file mode 100644
index 0000000..ec60811
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+class Foo<T extends self::X* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: _init)
+    ;
+  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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ec60811
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+class Foo<T extends self::X* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: _init)
+    ;
+  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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
new file mode 100644
index 0000000..f130ab6
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.outline.expect
@@ -0,0 +1,19 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    ;
+}
+class Foo<T extends self::X* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor fromX(self::X* _init) → self::Foo<self::Foo::T*>*
+    ;
+  constructor fromT(self::Foo::T* _init) → self::Foo<self::Foo::T*>*
+    ;
+  constructor _internal({self::Foo::T* x}) → self::Foo<self::Foo::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.expect
new file mode 100644
index 0000000..261b231
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+class Foo<T extends self::X* = self::X*> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..261b231
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
@@ -0,0 +1,26 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class X extends core::Object {
+  synthetic constructor •() → self::X*
+    : super core::Object::•()
+    ;
+}
+class Foo<T extends self::X* = self::X*> extends core::Object {
+  generic-covariant-impl 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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_test.dart
rename to pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.expect
new file mode 100644
index 0000000..74a8f52
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor from(core::String* _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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
new file mode 100644
index 0000000..74a8f52
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
@@ -0,0 +1,18 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor from(core::String* _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::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.outline.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.outline.expect
new file mode 100644
index 0000000..1a2189e
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.outline.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
+    ;
+  constructor _internal({self::Foo::T* x}) → self::Foo<self::Foo::T*>*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect
new file mode 100644
index 0000000..14038f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.expect
@@ -0,0 +1,29 @@
+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'.
+// Try changing the type of the parameter, or casting the argument to '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 {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: let final<BottomType> #t1 = 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'.
+Try changing the type of the parameter, or casting the argument to 'T'.
+  Foo.from(String _init) : this._internal(x: _init);
+                                             ^" in _init as{TypeError} <BottomType>)
+    ;
+  constructor _internal({self::Foo::T* x = #C1}) → self::Foo<self::Foo::T*>*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect
new file mode 100644
index 0000000..14038f4
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirecting_initializer_arguments_test.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+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'.
+// Try changing the type of the parameter, or casting the argument to '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 {
+  generic-covariant-impl field self::Foo::T* x;
+  constructor from(core::String* _init) → self::Foo<self::Foo::T*>*
+    : this self::Foo::_internal(x: let final<BottomType> #t1 = 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'.
+Try changing the type of the parameter, or casting the argument to 'T'.
+  Foo.from(String _init) : this._internal(x: _init);
+                                             ^" in _init as{TypeError} <BottomType>)
+    ;
+  constructor _internal({self::Foo::T* x = #C1}) → self::Foo<self::Foo::T*>*
+    : self::Foo::x = x, super core::Object::•()
+    ;
+}
+static method main() → void {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments.dart
rename to pkg/front_end/testcases/general/redirection_chain_type_arguments.dart
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.hierarchy.expect
new file mode 100644
index 0000000..4b4ba3b
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.hierarchy.expect
@@ -0,0 +1,427 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    A._redirecting#
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    A._redirecting#
+
+B:
+  superclasses:
+    Object
+      -> A<U>
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    B._redirecting#
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    B._redirecting#
+
+C:
+  superclasses:
+    Object
+      -> A<V>
+        -> B<V, S>
+  interfaces:
+  classMembers:
+    C.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.expect
new file mode 100644
index 0000000..cbfe339
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+}
+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");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cbfe339
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+}
+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");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.outline.expect
new file mode 100644
index 0000000..1f95ad0
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.outline.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class A<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → self::B<self::B::U*, self::B::W*>*
+    ;
+  static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+}
+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*>*
+    ;
+  method toString() → core::String*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..cbfe339
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+}
+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");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..ce90e29
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let <U extends core::Object* = dynamic, W extends core::Object* = dynamic>() →* self::B<self::B::•::U*, self::B::•::W*>* #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::num* #typeArg1 = null in invalid-expression;
+}
+class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let<BottomType> #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::String* #typeArg2 = null in invalid-expression;
+}
+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");
+}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart
similarity index 100%
rename from pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart
rename to pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.hierarchy.expect
new file mode 100644
index 0000000..4b4ba3b
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.hierarchy.expect
@@ -0,0 +1,427 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    A._redirecting#
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    A._redirecting#
+
+B:
+  superclasses:
+    Object
+      -> A<U>
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    B._redirecting#
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    B._redirecting#
+
+C:
+  superclasses:
+    Object
+      -> A<V>
+        -> B<V, S>
+  interfaces:
+  classMembers:
+    C.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.expect
new file mode 100644
index 0000000..4009f40
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+}
+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>>");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
new file mode 100644
index 0000000..4009f40
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+}
+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>>");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.outline.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.outline.expect
new file mode 100644
index 0000000..4985b32
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.outline.expect
@@ -0,0 +1,28 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  constructor empty() → self::B<self::B::U*, self::B::W*>*
+    ;
+  static factory •<U extends core::Object* = dynamic, W extends core::Object* = dynamic>() → self::B<self::B::•::U*, self::B::•::W*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+}
+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*>*
+    ;
+  method toString() → core::String*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.expect
new file mode 100644
index 0000000..4009f40
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+}
+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>>");
+}
diff --git a/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.transformed.expect
new file mode 100644
index 0000000..14e0fef
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_chain_type_arguments_subst.dart.strong.transformed.expect
@@ -0,0 +1,33 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  constructor empty() → self::A<self::A::T*>*
+    : super core::Object::•()
+    ;
+  static factory •<T extends core::Object* = dynamic>() → self::A<self::A::•::T*>*
+    let <U extends core::Object* = dynamic, W extends core::Object* = dynamic>() →* self::B<self::B::•::U*, self::B::•::W*>* #redirecting_factory = self::B::• in let self::A::•::T* #typeArg0 = null in let core::List<self::A::•::T*>* #typeArg1 = null in invalid-expression;
+}
+abstract class B<U extends core::Object* = dynamic, W extends core::Object* = dynamic> extends self::A<self::B::U*> {
+  static field dynamic _redirecting# = <dynamic>[self::B::•];
+  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*>*
+    let<BottomType> #redirecting_factory = self::C::• in let self::B::•::U* #typeArg0 = null in let self::B::•::W* #typeArg1 = null in let core::Map<self::B::•::U*, self::B::•::W*>* #typeArg2 = null in invalid-expression;
+}
+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>>");
+}
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart b/pkg/front_end/testcases/general/redirection_type_arguments.dart
similarity index 100%
rename from pkg/front_end/testcases/redirection_type_arguments.dart
rename to pkg/front_end/testcases/general/redirection_type_arguments.dart
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.hierarchy.expect
new file mode 100644
index 0000000..41b4b7f
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.hierarchy.expect
@@ -0,0 +1,406 @@
+Object:
+  superclasses:
+  interfaces:
+  classMembers:
+    Object._haveSameRuntimeType
+    Object.toString
+    Object.runtimeType
+    Object._toString
+    Object._simpleInstanceOf
+    Object._hashCodeRnd
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._objectHashCode
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+A:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    A._redirecting#
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+    A._redirecting#
+
+B:
+  superclasses:
+    Object
+      -> A
+  interfaces:
+  classMembers:
+    B.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Expect:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Expect.identical
+    Expect.throwsCastError
+    Expect._fail
+    Expect.notIdentical
+    Expect.isNotNull
+    Expect._getMessage
+    Expect.allIdentical
+    Expect._escapeSubstring
+    Expect.fail
+    Expect._truncateString
+    Expect.isFalse
+    Expect.isTrue
+    Object.toString
+    Expect.subtype
+    Expect.throwsRangeError
+    Expect._stringDifference
+    Expect.throwsArgumentError
+    Expect.stringEquals
+    Object.runtimeType
+    Expect.testError
+    Expect.throwsStateError
+    Object._simpleInstanceOf
+    Expect.isNull
+    Expect.approxEquals
+    Expect.equals
+    Object._instanceOf
+    Expect.allDistinct
+    Expect.throwsTypeError
+    Expect._subtypeAtRuntime
+    Expect.setEquals
+    Object.noSuchMethod
+    Expect.notEquals
+    Expect.listEquals
+    Expect._findEquivalences
+    Expect.mapEquals
+    Object._identityHashCode
+    Expect.throwsUnsupportedError
+    Expect.notType
+    Expect.deepEquals
+    Expect._escapeString
+    Expect.type
+    Object.hashCode
+    Expect.throwsNoSuchMethodError
+    Expect.notSubtype
+    Expect.throws
+    Object._simpleInstanceOfFalse
+    Expect._writeEquivalences
+    Expect.throwsAssertionError
+    Object._simpleInstanceOfTrue
+    Object.==
+    Expect.throwsFormatException
+  classSetters:
+
+ExpectException:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    ExpectException.message
+    ExpectException.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Immutable:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Immutable.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+Required:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Required.reason
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_AlwaysThrows:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Checked:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Experimental:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Factory:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTest:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_IsTestGroup:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Literal:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_MustCallSuper:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_OptionalTypeArgs:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Protected:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Sealed:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_Virtual:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForOverriding:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
+
+_VisibleForTesting:
+  superclasses:
+    Object
+  interfaces:
+  classMembers:
+    Object.toString
+    Object.runtimeType
+    Object._simpleInstanceOf
+    Object._instanceOf
+    Object.noSuchMethod
+    Object._identityHashCode
+    Object.hashCode
+    Object._simpleInstanceOfFalse
+    Object._simpleInstanceOfTrue
+    Object.==
+  classSetters:
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.expect
new file mode 100644
index 0000000..a87fba5
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.expect
@@ -0,0 +1,29 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+}
+class B<T extends core::Object* = dynamic> extends self::A {
+  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("${#C1}", "String");
+}
+
+constants  {
+  #C1 = self::B<core::String*> {}
+}
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a87fba5
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+}
+class B<T extends core::Object* = dynamic> extends self::A {
+  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("${#C1}", "String");
+}
+
+constants  {
+  #C1 = self::B<core::String*> {}
+}
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.outline.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.outline.expect
new file mode 100644
index 0000000..4118194
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.outline.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+import "package:expect/expect.dart";
+
+class A extends core::Object {
+  static field dynamic _redirecting# = <dynamic>[self::A::•];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+}
+class B<T extends core::Object* = dynamic> extends self::A {
+  const constructor •() → self::B<self::B::T*>*
+    : super self::A::empty()
+    ;
+  method toString() → core::String*
+    ;
+}
+static method main() → void
+  ;
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.expect
new file mode 100644
index 0000000..a87fba5
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.expect
@@ -0,0 +1,29 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    let dynamic #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+}
+class B<T extends core::Object* = dynamic> extends self::A {
+  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("${#C1}", "String");
+}
+
+constants  {
+  #C1 = self::B<core::String*> {}
+}
diff --git a/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.transformed.expect
new file mode 100644
index 0000000..d6f34c9
--- /dev/null
+++ b/pkg/front_end/testcases/general/redirection_type_arguments.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+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 field dynamic _redirecting# = <dynamic>[self::A::•];
+  const constructor empty() → self::A*
+    : super core::Object::•()
+    ;
+  static factory •() → self::A*
+    let<BottomType> #redirecting_factory = self::B::• in let core::String* #typeArg0 = null in invalid-expression;
+}
+class B<T extends core::Object* = dynamic> extends self::A {
+  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("${#C1}", "String");
+}
+
+constants  {
+  #C1 = self::B<core::String*> {}
+}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart
similarity index 100%
rename from pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart
rename to pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.hierarchy.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.expect
new file mode 100644
index 0000000..f283238
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.expect
@@ -0,0 +1,10 @@
+library;
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
new file mode 100644
index 0000000..f283238
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
@@ -0,0 +1,10 @@
+library;
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
new file mode 100644
index 0000000..af53cce
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+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*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.expect
new file mode 100644
index 0000000..8da8025
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.expect
@@ -0,0 +1,17 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
new file mode 100644
index 0000000..8da8025
--- /dev/null
+++ b/pkg/front_end/testcases/general/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+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::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart
similarity index 100%
rename from pkg/front_end/testcases/return_with_unknown_type_in_context.dart
rename to pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.expect
new file mode 100644
index 0000000..0f426a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.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.expand((dynamic y) → dynamic {
+    return y.split(",");
+  }).any((dynamic y) → dynamic => y.==("z"));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0f426a8
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.legacy.transformed.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.expand((dynamic y) → dynamic {
+    return y.split(",");
+  }).any((dynamic y) → dynamic => y.==("z"));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.outline.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.outline.expect
new file mode 100644
index 0000000..bd4829a
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method f(core::List<dynamic>* x) → core::bool*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.expect
new file mode 100644
index 0000000..18814f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.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.split(",") as{TypeError} core::Iterable<dynamic>*;
+  }).{core::Iterable::any}((dynamic y) → core::bool* => y.{core::Object::==}("z"));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.transformed.expect b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.transformed.expect
new file mode 100644
index 0000000..18814f3
--- /dev/null
+++ b/pkg/front_end/testcases/general/return_with_unknown_type_in_context.dart.strong.transformed.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.split(",") as{TypeError} core::Iterable<dynamic>*;
+  }).{core::Iterable::any}((dynamic y) → core::bool* => y.{core::Object::==}("z"));
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart b/pkg/front_end/testcases/general/sdk_diagnostic.dart
similarity index 100%
rename from pkg/front_end/testcases/sdk_diagnostic.dart
rename to pkg/front_end/testcases/general/sdk_diagnostic.dart
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.hierarchy.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/sdk_diagnostic.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/sdk_diagnostic.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.expect
new file mode 100644
index 0000000..0938a8d
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.expect
@@ -0,0 +1,44 @@
+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:154:19: Context: 'Iterable.iterator' is defined here.
+//   Iterator<E> get iterator;
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Warning: 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::•()
+    ;
+}
+static method test() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: "fisk"})));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #print
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = #incorrectArgument
+}
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.transformed.expect
new file mode 100644
index 0000000..0938a8d
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.legacy.transformed.expect
@@ -0,0 +1,44 @@
+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:154:19: Context: 'Iterable.iterator' is defined here.
+//   Iterator<E> get iterator;
+//                   ^^^^^^^^
+//
+// pkg/front_end/testcases/general/sdk_diagnostic.dart:12:8: Warning: 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::•()
+    ;
+}
+static method test() → dynamic {
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C4: "fisk"})));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #print
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = #incorrectArgument
+}
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
new file mode 100644
index 0000000..50a933c
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.outline.expect
@@ -0,0 +1,29 @@
+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:154:19: Context: 'Iterable.iterator' is defined here.
+//   Iterator<E> get iterator;
+//                   ^^^^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Iterable<core::Object*> {
+  synthetic constructor •() → self::C*
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
new file mode 100644
index 0000000..edca57d
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.expect
@@ -0,0 +1,39 @@
+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:154: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::•()
+    ;
+}
+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 {}
diff --git a/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
new file mode 100644
index 0000000..edca57d
--- /dev/null
+++ b/pkg/front_end/testcases/general/sdk_diagnostic.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+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:154: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::•()
+    ;
+}
+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 {}
diff --git a/pkg/front_end/testcases/general/spread_collection.dart b/pkg/front_end/testcases/general/spread_collection.dart
new file mode 100644
index 0000000..69ddf89
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart
@@ -0,0 +1,28 @@
+// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+main() {
+  final aList = <int>[
+    1,
+    ...[2],
+    ...?[3]
+  ];
+  final aMap = <int, int>{
+    1: 1,
+    ...{2: 2},
+    ...?{3: 3}
+  };
+  final aSet = <int>{
+    1,
+    ...[2],
+    ...?[3]
+  };
+  final aSetOrMap = {...foo()};
+
+  print(aList);
+  print(aSet);
+  print(aMap);
+}
+
+foo() => null;
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.legacy.expect b/pkg/front_end/testcases/general/spread_collection.dart.legacy.expect
new file mode 100644
index 0000000..c727b7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart.legacy.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection.dart:8:5: Error: Unexpected token '...'.
+//     ...[2],
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:9:5: Error: Unexpected token '...?'.
+//     ...?[3]
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:13:5: Error: Unexpected token '...'.
+//     ...{2: 2},
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:14:5: Error: Unexpected token '...?'.
+//     ...?{3: 3}
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:18:5: Error: Unexpected token '...'.
+//     ...[2],
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:19:5: Error: Unexpected token '...?'.
+//     ...?[3]
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:21:22: Error: Unexpected token '...'.
+//   final aSetOrMap = {...foo()};
+//                      ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int*>[1];
+  final dynamic aMap = <core::int*, core::int*>{1: 1};
+  final dynamic aSet = <core::int*>{1};
+  final dynamic aSetOrMap = <dynamic, dynamic>{};
+  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.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c727b7d
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart.legacy.transformed.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection.dart:8:5: Error: Unexpected token '...'.
+//     ...[2],
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:9:5: Error: Unexpected token '...?'.
+//     ...?[3]
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:13:5: Error: Unexpected token '...'.
+//     ...{2: 2},
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:14:5: Error: Unexpected token '...?'.
+//     ...?{3: 3}
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:18:5: Error: Unexpected token '...'.
+//     ...[2],
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:19:5: Error: Unexpected token '...?'.
+//     ...?[3]
+//     ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection.dart:21:22: Error: Unexpected token '...'.
+//   final aSetOrMap = {...foo()};
+//                      ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method main() → dynamic {
+  final dynamic aList = <core::int*>[1];
+  final dynamic aMap = <core::int*, core::int*>{1: 1};
+  final dynamic aSet = <core::int*>{1};
+  final dynamic aSetOrMap = <dynamic, dynamic>{};
+  core::print(aList);
+  core::print(aSet);
+  core::print(aMap);
+}
+static method foo() → dynamic
+  return null;
diff --git a/pkg/front_end/testcases/spread_collection.dart.outline.expect b/pkg/front_end/testcases/general/spread_collection.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/spread_collection.dart.outline.expect
rename to pkg/front_end/testcases/general/spread_collection.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/spread_collection.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.expect
new file mode 100644
index 0000000..eb0c3cc
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.expect
@@ -0,0 +1,54 @@
+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*>[];
+    #t1.{core::List::add}(1);
+    for (final core::int* #t2 in <core::int*>[2])
+      #t1.{core::List::add}(#t2);
+    final dynamic #t3 = <core::int*>[3];
+    if(!#t3.{core::Object::==}(null))
+      for (final core::int* #t4 in #t3)
+        #t1.{core::List::add}(#t4);
+  } =>#t1;
+  final core::Map<core::int*, core::int*>* aMap = block {
+    final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
+    #t5.{core::Map::[]=}(1, 1);
+    for (final core::MapEntry<core::int*, core::int*>* #t6 in <core::int*, core::int*>{2: 2}.{core::Map::entries})
+      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+    final core::Map<dynamic, dynamic>* #t7 = <core::int*, core::int*>{3: 3};
+    if(!#t7.{core::Object::==}(null))
+      for (final core::MapEntry<core::int*, core::int*>* #t8 in #t7.{core::Map::entries})
+        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+  } =>#t5;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    #t9.{core::Set::add}(1);
+    for (final core::int* #t10 in <core::int*>[2])
+      #t9.{core::Set::add}(#t10);
+    final dynamic #t11 = <core::int*>[3];
+    if(!#t11.{core::Object::==}(null))
+      for (final core::int* #t12 in #t11)
+        #t9.{core::Set::add}(#t12);
+  } =>#t9;
+  final dynamic 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.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
new file mode 100644
index 0000000..eb0c3cc
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection.dart.strong.transformed.expect
@@ -0,0 +1,54 @@
+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*>[];
+    #t1.{core::List::add}(1);
+    for (final core::int* #t2 in <core::int*>[2])
+      #t1.{core::List::add}(#t2);
+    final dynamic #t3 = <core::int*>[3];
+    if(!#t3.{core::Object::==}(null))
+      for (final core::int* #t4 in #t3)
+        #t1.{core::List::add}(#t4);
+  } =>#t1;
+  final core::Map<core::int*, core::int*>* aMap = block {
+    final core::Map<core::int*, core::int*>* #t5 = <core::int*, core::int*>{};
+    #t5.{core::Map::[]=}(1, 1);
+    for (final core::MapEntry<core::int*, core::int*>* #t6 in <core::int*, core::int*>{2: 2}.{core::Map::entries})
+      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+    final core::Map<dynamic, dynamic>* #t7 = <core::int*, core::int*>{3: 3};
+    if(!#t7.{core::Object::==}(null))
+      for (final core::MapEntry<core::int*, core::int*>* #t8 in #t7.{core::Map::entries})
+        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+  } =>#t5;
+  final core::Set<core::int*>* aSet = block {
+    final core::Set<core::int*>* #t9 = col::LinkedHashSet::•<core::int*>();
+    #t9.{core::Set::add}(1);
+    for (final core::int* #t10 in <core::int*>[2])
+      #t9.{core::Set::add}(#t10);
+    final dynamic #t11 = <core::int*>[3];
+    if(!#t11.{core::Object::==}(null))
+      for (final core::int* #t12 in #t11)
+        #t9.{core::Set::add}(#t12);
+  } =>#t9;
+  final dynamic 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 b/pkg/front_end/testcases/general/spread_collection_inference.dart
new file mode 100644
index 0000000..68981f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart
@@ -0,0 +1,166 @@
+// 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 case checks that inference works for spread collections, and that
+// the errors are reported when necessary.
+
+/*@testedFeatures=inference*/
+
+Map<K, V> bar<K, V>() => null;
+
+foo(dynamic dynVar) {
+  List<int> spread = <int>[1, 2, 3];
+  Map<String, int> mapSpread = <String, int>{"foo": 4, "bar": 2};
+  int notSpreadInt = 42;
+  int Function() notSpreadFunction = null;
+  // Note that all values are actually ints.
+  Map<int, num> mapIntNum = <int, num>{42: 42};
+  List<num> listNum = <num>[42];
+
+  var /*@ type=List<dynamic>* */ lhs10 = /*@ typeArgs=dynamic */ [
+    ...
+    /*@ typeArgs=dynamic */ []
+  ];
+
+  var /*@ type=Set<dynamic>* */ set10 = <dynamic>{
+    ... /*@ typeArgs=dynamic */ []
+  };
+
+  var /*@ type=Map<dynamic, dynamic>* */ map10 = <dynamic, dynamic>{
+    ...
+    /*@ typeArgs=dynamic, dynamic */ {}
+  };
+
+  var /*@ type=Map<dynamic, dynamic>* */ map10ambiguous =
+      /*@ typeArgs=dynamic, dynamic */ {
+    ... /*@ typeArgs=dynamic, dynamic */ {}
+  };
+
+  var /*@ type=List<int*>* */ lhs20 = /*@ typeArgs=int* */ [...spread];
+
+  var /*@ type=Set<int*>* */ set20 = /*@ typeArgs=int* */ {...spread, 42};
+
+  var /*@ type=Set<int*>* */ set20ambiguous = /*@ typeArgs=int* */ {...spread};
+
+  var /*@ type=Map<String*, int*>* */ map20 = /*@ typeArgs=String*, int* */
+      {...mapSpread, "baz": 42};
+
+  var /*@ type=Map<String*, int*>* */ map20ambiguous = /*@ typeArgs=String*, int* */
+      {...mapSpread};
+
+  var /*@ type=List<dynamic>* */ lhs21 = /*@ typeArgs=dynamic */ [
+    ...(spread as dynamic)
+  ];
+
+  var /*@ type=Set<dynamic>* */ set21 = /*@ typeArgs=dynamic */ {
+    ...(spread as dynamic),
+    42
+  };
+
+  var /*@ type=Map<dynamic, dynamic>* */ map21 = /*@ typeArgs=dynamic, dynamic */
+      {...(mapSpread as dynamic), "baz": 42};
+
+  dynamic map21ambiguous = {...(mapSpread as dynamic)};
+
+  List<int> lhs22 = /*@ typeArgs=int* */ [... /*@ typeArgs=int* */ []];
+
+  Set<int> set22 = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ [], 42};
+
+  Set<int> set22ambiguous = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ []};
+
+  Map<String, int> map22 = /*@ typeArgs=String*, int* */
+      {... /*@ typeArgs=String*, int* */ {}};
+
+  List<List<int>> lhs23 = /*@ typeArgs=List<int*>* */ [
+    ... /*@ typeArgs=List<int*>* */
+    [/*@ typeArgs=int* */ []]
+  ];
+
+  Set<List<int>> set23 = /*@ typeArgs=List<int*>* */ {
+    ... /*@ typeArgs=List<int*>* */
+    [/*@ typeArgs=int* */ []],
+    <int>[42]
+  };
+
+  Set<List<int>> set23ambiguous = /*@ typeArgs=List<int*>* */
+      {
+    ... /*@ typeArgs=List<int*>* */ [/*@ typeArgs=int* */ []]
+  };
+
+  Map<String, List<int>> map23 = /*@ typeArgs=String*, List<int*>* */
+      {
+    ... /*@ typeArgs=String*, List<int*>* */ {"baz": /*@ typeArgs=int* */ [] }
+  };
+
+  dynamic map24ambiguous = {...spread, ...mapSpread};
+
+  int lhs30 = /*@ typeArgs=int* */ [...spread];
+
+  int set30 = /*@ typeArgs=int* */ {...spread, 42};
+
+  int set30ambiguous = /*@ typeArgs=int* */
+      {...spread};
+
+  int map30 = /*@ typeArgs=String*, int* */
+      {...mapSpread, "baz": 42};
+
+  int map30ambiguous = /*@ typeArgs=String*, int* */
+      {...mapSpread};
+
+  List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
+
+  Set<dynamic> set40 = <dynamic>{...notSpreadInt};
+
+  Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
+
+  List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
+
+  Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
+
+  Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
+
+  List<String> lhs60 = <String>[...spread];
+
+  Set<String> set60 = <String>{...spread};
+
+  Map<int, int> map60 = <int, int>{...mapSpread};
+
+  Map<String, String> map61 = <String, String>{...mapSpread};
+
+  List<int> lhs70 = <int>[...null];
+
+  Set<int> set70 = <int>{...null};
+
+  var /*@ type=Set<dynamic>* */ set71ambiguous = /*@ typeArgs=dynamic */
+      {
+    ...null,
+    ... /*@ typeArgs=dynamic */
+    []
+  };
+
+  Map<String, int> map70 = <String, int>{...null};
+
+  List<int> lhs80 = <int>[...?null];
+
+  Set<int> set80 = <int>{...?null};
+
+  var /*@ type=Set<dynamic>* */ set81ambiguous = /*@ typeArgs=dynamic */
+      {...?null, ... /*@ typeArgs=dynamic */ []};
+
+  Map<String, int> map80 = <String, int>{...?null};
+
+  var /*@ type=Map<String*, int*>* */ map90 = <String, int>{
+    ... /*@ typeArgs=String*, int* */ bar()
+  };
+
+  List<int> list100 = <int>[...listNum];
+
+  Map<num, int> map100 = <num, int>{...mapIntNum};
+
+  List<int> list110 = <int>[...dynVar];
+
+  Map<num, int> map110 = <num, int>{...dynVar};
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.expect
new file mode 100644
index 0000000..6552bf4
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.expect
@@ -0,0 +1,280 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:22:5: Error: Unexpected token '...'.
+//     ...
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:27:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic */ []
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:31:5: Error: Unexpected token '...'.
+//     ...
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:37:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic, dynamic */ {}
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:40:61: Error: Unexpected token '...'.
+//   var /*@ type=List<int*>* */ lhs20 = /*@ typeArgs=int* */ [...spread];
+//                                                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:42:60: Error: Unexpected token '...'.
+//   var /*@ type=Set<int*>* */ set20 = /*@ typeArgs=int* */ {...spread, 42};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:44:69: Error: Unexpected token '...'.
+//   var /*@ type=Set<int*>* */ set20ambiguous = /*@ typeArgs=int* */ {...spread};
+//                                                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:47:8: Error: Unexpected token '...'.
+//       {...mapSpread, "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:50:8: Error: Unexpected token '...'.
+//       {...mapSpread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:53:5: Error: Unexpected token '...'.
+//     ...(spread as dynamic)
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:57:5: Error: Unexpected token '...'.
+//     ...(spread as dynamic),
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:62:8: Error: Unexpected token '...'.
+//       {...(mapSpread as dynamic), "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:64:29: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = {...(mapSpread as dynamic)};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:66:43: Error: Unexpected token '...'.
+//   List<int> lhs22 = /*@ typeArgs=int* */ [... /*@ typeArgs=int* */ []];
+//                                           ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:68:42: Error: Unexpected token '...'.
+//   Set<int> set22 = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ [], 42};
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   Set<int> set22ambiguous = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ []};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:73:8: Error: Unexpected token '...'.
+//       {... /*@ typeArgs=String*, int* */ {}};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:76:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:81:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:88:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */ [/*@ typeArgs=int* */ []]
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:93:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=String*, List<int*>* */ {"baz": /*@ typeArgs=int* */ [] }
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:96:29: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...spread, ...mapSpread};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:96:40: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...spread, ...mapSpread};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:98:37: Error: Unexpected token '...'.
+//   int lhs30 = /*@ typeArgs=int* */ [...spread];
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:100:37: Error: Unexpected token '...'.
+//   int set30 = /*@ typeArgs=int* */ {...spread, 42};
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:103:8: Error: Unexpected token '...'.
+//       {...spread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:106:8: Error: Unexpected token '...'.
+//       {...mapSpread, "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:109:8: Error: Unexpected token '...'.
+//       {...mapSpread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:111:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:113:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
+//                                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:115:52: Error: Unexpected token '...'.
+//   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:117:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:119:34: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
+//                                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:121:52: Error: Unexpected token '...'.
+//   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:123:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[...spread];
+//                                 ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:125:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{...spread};
+//                                ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:127:36: Error: Unexpected token '...'.
+//   Map<int, int> map60 = <int, int>{...mapSpread};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:129:48: Error: Unexpected token '...'.
+//   Map<String, String> map61 = <String, String>{...mapSpread};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:27: Error: Unexpected token '...'.
+//   List<int> lhs70 = <int>[...null];
+//                           ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:26: Error: Unexpected token '...'.
+//   Set<int> set70 = <int>{...null};
+//                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:5: Error: Unexpected token '...'.
+//     ...null,
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:138:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:42: Error: Unexpected token '...'.
+//   Map<String, int> map70 = <String, int>{...null};
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:144:27: Error: Unexpected token '...?'.
+//   List<int> lhs80 = <int>[...?null];
+//                           ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:146:26: Error: Unexpected token '...?'.
+//   Set<int> set80 = <int>{...?null};
+//                          ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:149:8: Error: Unexpected token '...?'.
+//       {...?null, ... /*@ typeArgs=dynamic */ []};
+//        ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:149:18: Error: Unexpected token '...'.
+//       {...?null, ... /*@ typeArgs=dynamic */ []};
+//                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:151:42: Error: Unexpected token '...?'.
+//   Map<String, int> map80 = <String, int>{...?null};
+//                                          ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:154:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=String*, int* */ bar()
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:157:29: Error: Unexpected token '...'.
+//   List<int> list100 = <int>[...listNum];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:159:37: Error: Unexpected token '...'.
+//   Map<num, int> map100 = <num, int>{...mapIntNum};
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:161:29: Error: Unexpected token '...'.
+//   List<int> list110 = <int>[...dynVar];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:163:37: Error: Unexpected token '...'.
+//   Map<num, int> map110 = <num, int>{...dynVar};
+//                                     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+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];
+  dynamic lhs10 = <dynamic>[];
+  dynamic set10 = <dynamic>{};
+  dynamic map10 = <dynamic, dynamic>{};
+  dynamic map10ambiguous = <dynamic, dynamic>{};
+  dynamic lhs20 = <dynamic>[];
+  dynamic set20 = <dynamic>{42};
+  dynamic set20ambiguous = <dynamic, dynamic>{};
+  dynamic map20 = <dynamic, dynamic>{"baz": 42};
+  dynamic map20ambiguous = <dynamic, dynamic>{};
+  dynamic lhs21 = <dynamic>[];
+  dynamic set21 = <dynamic>{42};
+  dynamic map21 = <dynamic, dynamic>{"baz": 42};
+  dynamic map21ambiguous = <dynamic, dynamic>{};
+  core::List<core::int*>* lhs22 = <dynamic>[];
+  core::Set<core::int*>* set22 = <dynamic>{42};
+  core::Set<core::int*>* set22ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map22 = <dynamic, dynamic>{};
+  core::List<core::List<core::int*>*>* lhs23 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set23 = <dynamic>{<core::int*>[42]};
+  core::Set<core::List<core::int*>*>* set23ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::List<core::int*>*>* map23 = <dynamic, dynamic>{};
+  dynamic map24ambiguous = <dynamic, dynamic>{};
+  core::int* lhs30 = <dynamic>[];
+  core::int* set30 = <dynamic>{42};
+  core::int* set30ambiguous = <dynamic, dynamic>{};
+  core::int* map30 = <dynamic, dynamic>{"baz": 42};
+  core::int* map30ambiguous = <dynamic, dynamic>{};
+  core::List<dynamic>* lhs40 = <dynamic>[];
+  core::Set<dynamic>* set40 = <dynamic>{};
+  core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{};
+  core::List<dynamic>* lhs50 = <dynamic>[];
+  core::Set<dynamic>* set50 = <dynamic>{};
+  core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{};
+  core::List<core::String*>* lhs60 = <core::String*>[];
+  core::Set<core::String*>* set60 = <core::String*>{};
+  core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{};
+  core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{};
+  core::List<core::int*>* lhs70 = <core::int*>[];
+  core::Set<core::int*>* set70 = <core::int*>{};
+  dynamic set71ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{};
+  core::List<core::int*>* lhs80 = <core::int*>[];
+  core::Set<core::int*>* set80 = <core::int*>{};
+  dynamic set81ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map80 = <core::String*, core::int*>{};
+  dynamic map90 = <core::String*, core::int*>{};
+  core::List<core::int*>* list100 = <core::int*>[];
+  core::Map<core::num*, core::int*>* map100 = <core::num*, core::int*>{};
+  core::List<core::int*>* list110 = <core::int*>[];
+  core::Map<core::num*, core::int*>* map110 = <core::num*, core::int*>{};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.transformed.expect
new file mode 100644
index 0000000..6552bf4
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.legacy.transformed.expect
@@ -0,0 +1,280 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:22:5: Error: Unexpected token '...'.
+//     ...
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:27:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic */ []
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:31:5: Error: Unexpected token '...'.
+//     ...
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:37:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic, dynamic */ {}
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:40:61: Error: Unexpected token '...'.
+//   var /*@ type=List<int*>* */ lhs20 = /*@ typeArgs=int* */ [...spread];
+//                                                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:42:60: Error: Unexpected token '...'.
+//   var /*@ type=Set<int*>* */ set20 = /*@ typeArgs=int* */ {...spread, 42};
+//                                                            ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:44:69: Error: Unexpected token '...'.
+//   var /*@ type=Set<int*>* */ set20ambiguous = /*@ typeArgs=int* */ {...spread};
+//                                                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:47:8: Error: Unexpected token '...'.
+//       {...mapSpread, "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:50:8: Error: Unexpected token '...'.
+//       {...mapSpread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:53:5: Error: Unexpected token '...'.
+//     ...(spread as dynamic)
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:57:5: Error: Unexpected token '...'.
+//     ...(spread as dynamic),
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:62:8: Error: Unexpected token '...'.
+//       {...(mapSpread as dynamic), "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:64:29: Error: Unexpected token '...'.
+//   dynamic map21ambiguous = {...(mapSpread as dynamic)};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:66:43: Error: Unexpected token '...'.
+//   List<int> lhs22 = /*@ typeArgs=int* */ [... /*@ typeArgs=int* */ []];
+//                                           ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:68:42: Error: Unexpected token '...'.
+//   Set<int> set22 = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ [], 42};
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:70:51: Error: Unexpected token '...'.
+//   Set<int> set22ambiguous = /*@ typeArgs=int* */ {... /*@ typeArgs=int* */ []};
+//                                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:73:8: Error: Unexpected token '...'.
+//       {... /*@ typeArgs=String*, int* */ {}};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:76:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:81:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:88:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=List<int*>* */ [/*@ typeArgs=int* */ []]
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:93:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=String*, List<int*>* */ {"baz": /*@ typeArgs=int* */ [] }
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:96:29: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...spread, ...mapSpread};
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:96:40: Error: Unexpected token '...'.
+//   dynamic map24ambiguous = {...spread, ...mapSpread};
+//                                        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:98:37: Error: Unexpected token '...'.
+//   int lhs30 = /*@ typeArgs=int* */ [...spread];
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:100:37: Error: Unexpected token '...'.
+//   int set30 = /*@ typeArgs=int* */ {...spread, 42};
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:103:8: Error: Unexpected token '...'.
+//       {...spread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:106:8: Error: Unexpected token '...'.
+//       {...mapSpread, "baz": 42};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:109:8: Error: Unexpected token '...'.
+//       {...mapSpread};
+//        ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:111:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs40 = <dynamic>[...notSpreadInt];
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:113:34: Error: Unexpected token '...'.
+//   Set<dynamic> set40 = <dynamic>{...notSpreadInt};
+//                                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:115:52: Error: Unexpected token '...'.
+//   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...notSpreadInt};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:117:35: Error: Unexpected token '...'.
+//   List<dynamic> lhs50 = <dynamic>[...notSpreadFunction];
+//                                   ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:119:34: Error: Unexpected token '...'.
+//   Set<dynamic> set50 = <dynamic>{...notSpreadFunction};
+//                                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:121:52: Error: Unexpected token '...'.
+//   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...notSpreadFunction};
+//                                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:123:33: Error: Unexpected token '...'.
+//   List<String> lhs60 = <String>[...spread];
+//                                 ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:125:32: Error: Unexpected token '...'.
+//   Set<String> set60 = <String>{...spread};
+//                                ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:127:36: Error: Unexpected token '...'.
+//   Map<int, int> map60 = <int, int>{...mapSpread};
+//                                    ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:129:48: Error: Unexpected token '...'.
+//   Map<String, String> map61 = <String, String>{...mapSpread};
+//                                                ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:131:27: Error: Unexpected token '...'.
+//   List<int> lhs70 = <int>[...null];
+//                           ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:133:26: Error: Unexpected token '...'.
+//   Set<int> set70 = <int>{...null};
+//                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:137:5: Error: Unexpected token '...'.
+//     ...null,
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:138:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=dynamic */
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:142:42: Error: Unexpected token '...'.
+//   Map<String, int> map70 = <String, int>{...null};
+//                                          ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:144:27: Error: Unexpected token '...?'.
+//   List<int> lhs80 = <int>[...?null];
+//                           ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:146:26: Error: Unexpected token '...?'.
+//   Set<int> set80 = <int>{...?null};
+//                          ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:149:8: Error: Unexpected token '...?'.
+//       {...?null, ... /*@ typeArgs=dynamic */ []};
+//        ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:149:18: Error: Unexpected token '...'.
+//       {...?null, ... /*@ typeArgs=dynamic */ []};
+//                  ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:151:42: Error: Unexpected token '...?'.
+//   Map<String, int> map80 = <String, int>{...?null};
+//                                          ^^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:154:5: Error: Unexpected token '...'.
+//     ... /*@ typeArgs=String*, int* */ bar()
+//     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:157:29: Error: Unexpected token '...'.
+//   List<int> list100 = <int>[...listNum];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:159:37: Error: Unexpected token '...'.
+//   Map<num, int> map100 = <num, int>{...mapIntNum};
+//                                     ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:161:29: Error: Unexpected token '...'.
+//   List<int> list110 = <int>[...dynVar];
+//                             ^^^
+//
+// pkg/front_end/testcases/general/spread_collection_inference.dart:163:37: Error: Unexpected token '...'.
+//   Map<num, int> map110 = <num, int>{...dynVar};
+//                                     ^^^
+//
+import self as self;
+import "dart:core" as core;
+
+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];
+  dynamic lhs10 = <dynamic>[];
+  dynamic set10 = <dynamic>{};
+  dynamic map10 = <dynamic, dynamic>{};
+  dynamic map10ambiguous = <dynamic, dynamic>{};
+  dynamic lhs20 = <dynamic>[];
+  dynamic set20 = <dynamic>{42};
+  dynamic set20ambiguous = <dynamic, dynamic>{};
+  dynamic map20 = <dynamic, dynamic>{"baz": 42};
+  dynamic map20ambiguous = <dynamic, dynamic>{};
+  dynamic lhs21 = <dynamic>[];
+  dynamic set21 = <dynamic>{42};
+  dynamic map21 = <dynamic, dynamic>{"baz": 42};
+  dynamic map21ambiguous = <dynamic, dynamic>{};
+  core::List<core::int*>* lhs22 = <dynamic>[];
+  core::Set<core::int*>* set22 = <dynamic>{42};
+  core::Set<core::int*>* set22ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map22 = <dynamic, dynamic>{};
+  core::List<core::List<core::int*>*>* lhs23 = <dynamic>[];
+  core::Set<core::List<core::int*>*>* set23 = <dynamic>{<core::int*>[42]};
+  core::Set<core::List<core::int*>*>* set23ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::List<core::int*>*>* map23 = <dynamic, dynamic>{};
+  dynamic map24ambiguous = <dynamic, dynamic>{};
+  core::int* lhs30 = <dynamic>[];
+  core::int* set30 = <dynamic>{42};
+  core::int* set30ambiguous = <dynamic, dynamic>{};
+  core::int* map30 = <dynamic, dynamic>{"baz": 42};
+  core::int* map30ambiguous = <dynamic, dynamic>{};
+  core::List<dynamic>* lhs40 = <dynamic>[];
+  core::Set<dynamic>* set40 = <dynamic>{};
+  core::Map<dynamic, dynamic>* map40 = <dynamic, dynamic>{};
+  core::List<dynamic>* lhs50 = <dynamic>[];
+  core::Set<dynamic>* set50 = <dynamic>{};
+  core::Map<dynamic, dynamic>* map50 = <dynamic, dynamic>{};
+  core::List<core::String*>* lhs60 = <core::String*>[];
+  core::Set<core::String*>* set60 = <core::String*>{};
+  core::Map<core::int*, core::int*>* map60 = <core::int*, core::int*>{};
+  core::Map<core::String*, core::String*>* map61 = <core::String*, core::String*>{};
+  core::List<core::int*>* lhs70 = <core::int*>[];
+  core::Set<core::int*>* set70 = <core::int*>{};
+  dynamic set71ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map70 = <core::String*, core::int*>{};
+  core::List<core::int*>* lhs80 = <core::int*>[];
+  core::Set<core::int*>* set80 = <core::int*>{};
+  dynamic set81ambiguous = <dynamic, dynamic>{};
+  core::Map<core::String*, core::int*>* map80 = <core::String*, core::int*>{};
+  dynamic map90 = <core::String*, core::int*>{};
+  core::List<core::int*>* list100 = <core::int*>[];
+  core::Map<core::num*, core::int*>* map100 = <core::num*, core::int*>{};
+  core::List<core::int*>* list110 = <core::int*>[];
+  core::Map<core::num*, core::int*>* map110 = <core::num*, core::int*>{};
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.outline.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.outline.expect
new file mode 100644
index 0000000..9f3c893
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.outline.expect
@@ -0,0 +1,10 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+static method bar<K extends core::Object* = dynamic, V extends core::Object* = dynamic>() → core::Map<self::bar::K*, self::bar::V*>*
+  ;
+static method foo(dynamic dynVar) → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
new file mode 100644
index 0000000..0013246
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.expect
@@ -0,0 +1,404 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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:137:8: Error: Expected ',' before this.
+//     ...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 = <dynamic>[];
+    for (final dynamic #t2 in <dynamic>[])
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::Set<dynamic>* set10 = block {
+    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t4 in <dynamic>[])
+      #t3.{core::Set::add}(#t4);
+  } =>#t3;
+  core::Map<dynamic, dynamic>* map10 = block {
+    final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries})
+      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+  } =>#t5;
+  core::Map<dynamic, dynamic>* map10ambiguous = block {
+    final core::Map<dynamic, dynamic>* #t7 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t8 in <dynamic, dynamic>{}.{core::Map::entries})
+      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+  } =>#t7;
+  core::List<core::int*>* lhs20 = block {
+    final core::List<core::int*>* #t9 = <core::int*>[];
+    for (final core::int* #t10 in spread)
+      #t9.{core::List::add}(#t10);
+  } =>#t9;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t12 in spread)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
+  } =>#t11;
+  core::Set<core::int*>* set20ambiguous = block {
+    final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t14 in spread) {
+      final core::int* #t15 = #t14 as{TypeError} core::int*;
+      #t13.{core::Set::add}(#t15);
+    }
+  } =>#t13;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t16 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t17 in mapSpread.{core::Map::entries})
+      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}("baz", 42);
+  } =>#t16;
+  core::Map<core::String*, core::int*>* map20ambiguous = block {
+    final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t19 in mapSpread.{core::Map::entries})
+      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+  } =>#t18;
+  core::List<dynamic>* lhs21 = block {
+    final core::List<dynamic>* #t20 = <dynamic>[];
+    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
+      #t20.{core::List::add}(#t21);
+  } =>#t20;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
+      #t22.{core::Set::add}(#t23);
+    #t22.{core::Set::add}(42);
+  } =>#t22;
+  core::Map<dynamic, dynamic>* map21 = block {
+    final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
+      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}("baz", 42);
+  } =>#t24;
+  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*>* #t26 = <core::int*>[];
+    for (final core::int* #t27 in <core::int*>[])
+      #t26.{core::List::add}(#t27);
+  } =>#t26;
+  core::Set<core::int*>* set22 = block {
+    final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t29 in <core::int*>[])
+      #t28.{core::Set::add}(#t29);
+    #t28.{core::Set::add}(42);
+  } =>#t28;
+  core::Set<core::int*>* set22ambiguous = block {
+    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t31 in <core::int*>[]) {
+      final core::int* #t32 = #t31 as{TypeError} core::int*;
+      #t30.{core::Set::add}(#t32);
+    }
+  } =>#t30;
+  core::Map<core::String*, core::int*>* map22 = block {
+    final core::Map<core::String*, core::int*>* #t33 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t34 in <core::String*, core::int*>{}.{core::Map::entries})
+      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+  } =>#t33;
+  core::List<core::List<core::int*>*>* lhs23 = block {
+    final core::List<core::List<core::int*>*>* #t35 = <core::List<core::int*>*>[];
+    for (final core::List<core::int*>* #t36 in <core::List<core::int*>*>[<core::int*>[]])
+      #t35.{core::List::add}(#t36);
+  } =>#t35;
+  core::Set<core::List<core::int*>*>* set23 = block {
+    final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (final core::List<core::int*>* #t38 in <core::List<core::int*>*>[<core::int*>[]])
+      #t37.{core::Set::add}(#t38);
+    #t37.{core::Set::add}(<core::int*>[42]);
+  } =>#t37;
+  core::Set<core::List<core::int*>*>* set23ambiguous = block {
+    final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (final dynamic #t40 in <core::List<core::int*>*>[<core::int*>[]]) {
+      final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
+      #t39.{core::Set::add}(#t41);
+    }
+  } =>#t39;
+  core::Map<core::String*, core::List<core::int*>*>* map23 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
+    for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries})
+      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+  } =>#t42;
+  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 = let final<BottomType> #t44 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int lhs30 = /*@ typeArgs=int* */ [...spread];
+                                   ^" in ( block {
+    final core::List<core::int*>* #t45 = <core::int*>[];
+    for (final core::int* #t46 in spread)
+      #t45.{core::List::add}(#t46);
+  } =>#t45) as{TypeError} core::int*;
+  core::int* set30 = let final<BottomType> #t47 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int set30 = /*@ typeArgs=int* */ {...spread, 42};
+                                   ^" in ( block {
+    final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(42);
+  } =>#t48) as{TypeError} core::int*;
+  core::int* set30ambiguous = let final<BottomType> #t50 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...spread};
+      ^" in ( block {
+    final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t52 in spread) {
+      final core::int* #t53 = #t52 as{TypeError} core::int*;
+      #t51.{core::Set::add}(#t53);
+    }
+  } =>#t51) as{TypeError} core::int*;
+  core::int* map30 = let final<BottomType> #t54 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...mapSpread, \"baz\": 42};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t56 in mapSpread.{core::Map::entries})
+      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}("baz", 42);
+  } =>#t55) as{TypeError} core::int*;
+  core::int* map30ambiguous = let final<BottomType> #t57 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...mapSpread};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t59 in mapSpread.{core::Map::entries})
+      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+  } =>#t58) 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 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t61 = #t60.{core::Set::add}(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};
+                                    ^") in #t60;
+  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 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(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};
+                                    ^") in #t62;
+  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 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final dynamic #t65 = #t64.{core::Set::add}(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};
+                                  ^") in #t64;
+  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 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final dynamic #t67 = #t66.{core::Set::add}(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};
+                            ^") in #t66;
+  core::Set<dynamic>* set71ambiguous = block {
+    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
+    ...null,
+       ^");
+    for (final dynamic #t69 in <dynamic>[]) {
+      final dynamic #t70 = #t69 as{TypeError} dynamic;
+      #t68.{core::Set::add}(#t70);
+    }
+  } =>#t68;
+  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*>* #t71 = <core::int*>[];
+    final dynamic #t72 = null;
+    if(!#t72.{core::Object::==}(null))
+      for (final core::int* #t73 in #t72)
+        #t71.{core::List::add}(#t73);
+  } =>#t71;
+  core::Set<core::int*>* set80 = block {
+    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+    final dynamic #t75 = null;
+    if(!#t75.{core::Object::==}(null))
+      for (final core::int* #t76 in #t75)
+        #t74.{core::Set::add}(#t76);
+  } =>#t74;
+  core::Set<dynamic>* set81ambiguous = block {
+    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+    final dynamic #t78 = null;
+    if(!#t78.{core::Object::==}(null))
+      for (final dynamic #t79 in #t78) {
+        final dynamic #t80 = #t79 as{TypeError} dynamic;
+        #t77.{core::Set::add}(#t80);
+      }
+    for (final dynamic #t81 in <dynamic>[]) {
+      final dynamic #t82 = #t81 as{TypeError} dynamic;
+      #t77.{core::Set::add}(#t82);
+    }
+  } =>#t77;
+  core::Map<core::String*, core::int*>* map80 = block {
+    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
+    final core::Map<dynamic, dynamic>* #t84 = null;
+    if(!#t84.{core::Object::==}(null))
+      for (final core::MapEntry<core::String*, core::int*>* #t85 in #t84.{core::Map::entries})
+        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+  } =>#t83;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t87 in self::bar<core::String*, core::int*>().{core::Map::entries})
+      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+  } =>#t86;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t88 = <core::int*>[];
+    for (final dynamic #t89 in listNum) {
+      final core::int* #t90 = #t89 as{TypeError} core::int*;
+      #t88.{core::List::add}(#t90);
+    }
+  } =>#t88;
+  core::Map<core::num*, core::int*>* map100 = block {
+    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t92 in mapIntNum.{core::Map::entries}) {
+      final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
+      #t91.{core::Map::[]=}(#t93, #t94);
+    }
+  } =>#t91;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t95 = <core::int*>[];
+    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+      final core::int* #t97 = #t96 as{TypeError} core::int*;
+      #t95.{core::List::add}(#t97);
+    }
+  } =>#t95;
+  core::Map<core::num*, core::int*>* map110 = block {
+    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+      final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
+      #t98.{core::Map::[]=}(#t100, #t101);
+    }
+  } =>#t98;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
new file mode 100644
index 0000000..00963f1
--- /dev/null
+++ b/pkg/front_end/testcases/general/spread_collection_inference.dart.strong.transformed.expect
@@ -0,0 +1,404 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//       {...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:137:8: Error: Expected ',' before this.
+//     ...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 = <dynamic>[];
+    for (final dynamic #t2 in <dynamic>[])
+      #t1.{core::List::add}(#t2);
+  } =>#t1;
+  core::Set<dynamic>* set10 = block {
+    final core::Set<dynamic>* #t3 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t4 in <dynamic>[])
+      #t3.{core::Set::add}(#t4);
+  } =>#t3;
+  core::Map<dynamic, dynamic>* map10 = block {
+    final core::Map<dynamic, dynamic>* #t5 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t6 in <dynamic, dynamic>{}.{core::Map::entries})
+      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
+  } =>#t5;
+  core::Map<dynamic, dynamic>* map10ambiguous = block {
+    final core::Map<dynamic, dynamic>* #t7 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t8 in <dynamic, dynamic>{}.{core::Map::entries})
+      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
+  } =>#t7;
+  core::List<core::int*>* lhs20 = block {
+    final core::List<core::int*>* #t9 = <core::int*>[];
+    for (final core::int* #t10 in spread)
+      #t9.{core::List::add}(#t10);
+  } =>#t9;
+  core::Set<core::int*>* set20 = block {
+    final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t12 in spread)
+      #t11.{core::Set::add}(#t12);
+    #t11.{core::Set::add}(42);
+  } =>#t11;
+  core::Set<core::int*>* set20ambiguous = block {
+    final core::Set<core::int*>* #t13 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t14 in spread) {
+      final core::int* #t15 = #t14 as{TypeError} core::int*;
+      #t13.{core::Set::add}(#t15);
+    }
+  } =>#t13;
+  core::Map<core::String*, core::int*>* map20 = block {
+    final core::Map<core::String*, core::int*>* #t16 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t17 in mapSpread.{core::Map::entries})
+      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
+    #t16.{core::Map::[]=}("baz", 42);
+  } =>#t16;
+  core::Map<core::String*, core::int*>* map20ambiguous = block {
+    final core::Map<core::String*, core::int*>* #t18 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t19 in mapSpread.{core::Map::entries})
+      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
+  } =>#t18;
+  core::List<dynamic>* lhs21 = block {
+    final core::List<dynamic>* #t20 = <dynamic>[];
+    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
+      #t20.{core::List::add}(#t21);
+  } =>#t20;
+  core::Set<dynamic>* set21 = block {
+    final core::Set<dynamic>* #t22 = col::LinkedHashSet::•<dynamic>();
+    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>*)
+      #t22.{core::Set::add}(#t23);
+    #t22.{core::Set::add}(42);
+  } =>#t22;
+  core::Map<dynamic, dynamic>* map21 = block {
+    final core::Map<dynamic, dynamic>* #t24 = <dynamic, dynamic>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries})
+      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
+    #t24.{core::Map::[]=}("baz", 42);
+  } =>#t24;
+  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*>* #t26 = <core::int*>[];
+    for (final core::int* #t27 in <core::int*>[])
+      #t26.{core::List::add}(#t27);
+  } =>#t26;
+  core::Set<core::int*>* set22 = block {
+    final core::Set<core::int*>* #t28 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t29 in <core::int*>[])
+      #t28.{core::Set::add}(#t29);
+    #t28.{core::Set::add}(42);
+  } =>#t28;
+  core::Set<core::int*>* set22ambiguous = block {
+    final core::Set<core::int*>* #t30 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t31 in <core::int*>[]) {
+      final core::int* #t32 = #t31 as{TypeError} core::int*;
+      #t30.{core::Set::add}(#t32);
+    }
+  } =>#t30;
+  core::Map<core::String*, core::int*>* map22 = block {
+    final core::Map<core::String*, core::int*>* #t33 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t34 in <core::String*, core::int*>{}.{core::Map::entries})
+      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
+  } =>#t33;
+  core::List<core::List<core::int*>*>* lhs23 = block {
+    final core::List<core::List<core::int*>*>* #t35 = <core::List<core::int*>*>[];
+    for (final core::List<core::int*>* #t36 in <core::List<core::int*>*>[<core::int*>[]])
+      #t35.{core::List::add}(#t36);
+  } =>#t35;
+  core::Set<core::List<core::int*>*>* set23 = block {
+    final core::Set<core::List<core::int*>*>* #t37 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (final core::List<core::int*>* #t38 in <core::List<core::int*>*>[<core::int*>[]])
+      #t37.{core::Set::add}(#t38);
+    #t37.{core::Set::add}(<core::int*>[42]);
+  } =>#t37;
+  core::Set<core::List<core::int*>*>* set23ambiguous = block {
+    final core::Set<core::List<core::int*>*>* #t39 = col::LinkedHashSet::•<core::List<core::int*>*>();
+    for (final dynamic #t40 in <core::List<core::int*>*>[<core::int*>[]]) {
+      final core::List<core::int*>* #t41 = #t40 as{TypeError} core::List<core::int*>*;
+      #t39.{core::Set::add}(#t41);
+    }
+  } =>#t39;
+  core::Map<core::String*, core::List<core::int*>*>* map23 = block {
+    final core::Map<core::String*, core::List<core::int*>*>* #t42 = <core::String*, core::List<core::int*>*>{};
+    for (final core::MapEntry<core::String*, core::List<core::int*>*>* #t43 in <core::String*, core::List<core::int*>*>{"baz": <core::int*>[]}.{core::Map::entries})
+      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
+  } =>#t42;
+  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 = let final<BottomType> #t44 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int lhs30 = /*@ typeArgs=int* */ [...spread];
+                                   ^" in ( block {
+    final core::List<core::int*>* #t45 = <core::int*>[];
+    for (final core::int* #t46 in spread)
+      #t45.{core::List::add}(#t46);
+  } =>#t45) as{TypeError} core::int*;
+  core::int* set30 = let final<BottomType> #t47 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+  int set30 = /*@ typeArgs=int* */ {...spread, 42};
+                                   ^" in ( block {
+    final core::Set<core::int*>* #t48 = col::LinkedHashSet::•<core::int*>();
+    for (final core::int* #t49 in spread)
+      #t48.{core::Set::add}(#t49);
+    #t48.{core::Set::add}(42);
+  } =>#t48) as{TypeError} core::int*;
+  core::int* set30ambiguous = let final<BottomType> #t50 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...spread};
+      ^" in ( block {
+    final core::Set<core::int*>* #t51 = col::LinkedHashSet::•<core::int*>();
+    for (final dynamic #t52 in spread) {
+      final core::int* #t53 = #t52 as{TypeError} core::int*;
+      #t51.{core::Set::add}(#t53);
+    }
+  } =>#t51) as{TypeError} core::int*;
+  core::int* map30 = let final<BottomType> #t54 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...mapSpread, \"baz\": 42};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t55 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t56 in mapSpread.{core::Map::entries})
+      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
+    #t55.{core::Map::[]=}("baz", 42);
+  } =>#t55) as{TypeError} core::int*;
+  core::int* map30ambiguous = let final<BottomType> #t57 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'int'.
+      {...mapSpread};
+      ^" in ( block {
+    final core::Map<core::String*, core::int*>* #t58 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t59 in mapSpread.{core::Map::entries})
+      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
+  } =>#t58) 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 = let final core::Set<dynamic>* #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool* #t61 = #t60.{core::Set::add}(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};
+                                    ^") in #t60;
+  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 = let final core::Set<dynamic>* #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool* #t63 = #t62.{core::Set::add}(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};
+                                    ^") in #t62;
+  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 = let final core::Set<core::String*>* #t64 = col::LinkedHashSet::•<core::String*>() in let final core::bool* #t65 = #t64.{core::Set::add}(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};
+                                  ^") in #t64;
+  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 = let final core::Set<core::int*>* #t66 = col::LinkedHashSet::•<core::int*>() in let final core::bool* #t67 = #t66.{core::Set::add}(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};
+                            ^") in #t66;
+  core::Set<dynamic>* set71ambiguous = block {
+    final core::Set<dynamic>* #t68 = col::LinkedHashSet::•<dynamic>();
+    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/general/spread_collection_inference.dart:137:8: Error: Expected ',' before this.
+    ...null,
+       ^");
+    for (final dynamic #t69 in <dynamic>[]) {
+      final dynamic #t70 = #t69 as{TypeError} dynamic;
+      #t68.{core::Set::add}(#t70);
+    }
+  } =>#t68;
+  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*>* #t71 = <core::int*>[];
+    final dynamic #t72 = null;
+    if(!#t72.{core::Object::==}(null))
+      for (final core::int* #t73 in #t72)
+        #t71.{core::List::add}(#t73);
+  } =>#t71;
+  core::Set<core::int*>* set80 = block {
+    final core::Set<core::int*>* #t74 = col::LinkedHashSet::•<core::int*>();
+    final dynamic #t75 = null;
+    if(!#t75.{core::Object::==}(null))
+      for (final core::int* #t76 in #t75)
+        #t74.{core::Set::add}(#t76);
+  } =>#t74;
+  core::Set<dynamic>* set81ambiguous = block {
+    final core::Set<dynamic>* #t77 = col::LinkedHashSet::•<dynamic>();
+    final dynamic #t78 = null;
+    if(!#t78.{core::Object::==}(null))
+      for (final dynamic #t79 in #t78) {
+        final dynamic #t80 = #t79 as{TypeError} dynamic;
+        #t77.{core::Set::add}(#t80);
+      }
+    for (final dynamic #t81 in <dynamic>[]) {
+      final dynamic #t82 = #t81 as{TypeError} dynamic;
+      #t77.{core::Set::add}(#t82);
+    }
+  } =>#t77;
+  core::Map<core::String*, core::int*>* map80 = block {
+    final core::Map<core::String*, core::int*>* #t83 = <core::String*, core::int*>{};
+    final core::Map<dynamic, dynamic>* #t84 = null;
+    if(!#t84.{core::Object::==}(null))
+      for (final core::MapEntry<core::String*, core::int*>* #t85 in #t84.{core::Map::entries})
+        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
+  } =>#t83;
+  core::Map<core::String*, core::int*>* map90 = block {
+    final core::Map<core::String*, core::int*>* #t86 = <core::String*, core::int*>{};
+    for (final core::MapEntry<core::String*, core::int*>* #t87 in self::bar<core::String*, core::int*>().{core::Map::entries})
+      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
+  } =>#t86;
+  core::List<core::int*>* list100 = block {
+    final core::List<core::int*>* #t88 = <core::int*>[];
+    for (final dynamic #t89 in listNum) {
+      final core::int* #t90 = #t89 as{TypeError} core::int*;
+      #t88.{core::List::add}(#t90);
+    }
+  } =>#t88;
+  core::Map<core::num*, core::int*>* map100 = block {
+    final core::Map<core::num*, core::int*>* #t91 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t92 in mapIntNum.{core::Map::entries}) {
+      final core::num* #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int*;
+      #t91.{core::Map::[]=}(#t93, #t94);
+    }
+  } =>#t91;
+  core::List<core::int*>* list110 = block {
+    final core::List<core::int*>* #t95 = <core::int*>[];
+    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>*) {
+      final core::int* #t97 = #t96 as{TypeError} core::int*;
+      #t95.{core::List::add}(#t97);
+    }
+  } =>#t95;
+  core::Map<core::num*, core::int*>* map110 = block {
+    final core::Map<core::num*, core::int*>* #t98 = <core::num*, core::int*>{};
+    for (final core::MapEntry<dynamic, dynamic>* #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>*).{core::Map::entries}) {
+      final core::num* #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num*;
+      final core::int* #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int*;
+      #t98.{core::Map::[]=}(#t100, #t101);
+    }
+  } =>#t98;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/statements.dart b/pkg/front_end/testcases/general/statements.dart
new file mode 100644
index 0000000..e5f79de
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart
@@ -0,0 +1,111 @@
+// 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.
+
+foo() {
+  try {
+    return;
+  } finally {
+    print("Hello from finally block!");
+  }
+}
+
+bar() async {
+  await for (var x in []) {
+    yield x;
+    yield* x;
+  }
+}
+
+main() {
+  do {
+    print("Hello from do-while!");
+  } while (false);
+  do var x = print("Hello from do-while!"); while (false);
+
+  for (String s in ["Hello from for-in!"]) {
+    print(s);
+  }
+  for (String s in ["Hello from for-in without block!"]) print(s);
+  var s;
+  for (s in ["Hello from for-in without decl!"]) {
+    print(s);
+  }
+  for (s in ["Hello from for-in without decl and block!"]) print(s);
+  a:
+  b:
+  c:
+  print("Hello from labeled statement!");
+  try {
+    try {
+      throw "Hello from rethrow!";
+    } catch (e) {
+      rethrow;
+    }
+  } catch (e) {
+    print(e);
+  }
+  foo();
+  bool done = false;
+  while (!done) {
+    done = true;
+    print("Hello from while!");
+  }
+  ; // Testing empty statement.
+  assert(true);
+  assert(true, "Hello from assert!");
+  try {
+    assert(false, "Hello from assert!");
+  } catch (e) {
+    print(e);
+  }
+  switch (1) {
+    case 1:
+    case 2:
+      print("Hello from switch case!");
+      break;
+    default:
+      break;
+  }
+  switch (4) {
+    L2:
+    case 2:
+      print("Hello from case 2!");
+      break;
+    L1:
+    case 1:
+      print("Hello from case 1!");
+      continue L2;
+    L0:
+    case 0:
+      print("Hello from case 0!");
+      continue L1;
+    case 4:
+      print("Hello from case 4!");
+      continue LD;
+    LD:
+    default:
+      continue L0;
+  }
+  switch (4) {
+    L0:
+    case 1:
+      print("Hello from next case 1");
+      break;
+    default:
+      continue L0;
+  }
+  int i = 0;
+  do {
+    print("Hello from do-while!");
+    if (++i < 3) continue;
+    break;
+  } while (true);
+  i = 0;
+  OUTER:
+  while (true) {
+    print("Hello from while!");
+    if (++i < 3) continue OUTER;
+    break OUTER;
+  }
+}
diff --git a/pkg/front_end/testcases/general/statements.dart.legacy.expect b/pkg/front_end/testcases/general/statements.dart.legacy.expect
new file mode 100644
index 0000000..846bd13
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart.legacy.expect
@@ -0,0 +1,169 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method foo() → dynamic {
+  try {
+    return;
+  }
+  finally {
+    core::print("Hello from finally block!");
+  }
+}
+static method bar() → dynamic async {
+  await for (dynamic x in <dynamic>[]) {
+    yield x;
+    yield* x;
+  }
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    dynamic x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String* s in <dynamic>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String* s in <dynamic>["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.+(1)).<(3))
+        break #L14;
+      break #L13;
+    }
+  while (true)
+  i = 0;
+  #L15:
+  while (true)
+    #L16:
+    {
+      core::print("Hello from while!");
+      if((i = i.+(1)).<(3))
+        break #L16;
+      break #L15;
+    }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 0
+  #C4 = 4
+}
diff --git a/pkg/front_end/testcases/general/statements.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/statements.dart.legacy.transformed.expect
new file mode 100644
index 0000000..1d1a933
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart.legacy.transformed.expect
@@ -0,0 +1,218 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+//
+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 /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
+  dynamic :async_stack_trace;
+  dynamic :async_op_then;
+  dynamic :async_op_error;
+  dynamic :await_jump_var = 0;
+  dynamic :await_ctx_var;
+  dynamic :saved_try_context_var0;
+  dynamic :saved_try_context_var1;
+  dynamic :exception0;
+  dynamic :stack_trace0;
+  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
+    try {
+      #L1:
+      {
+        {
+          dynamic :stream = <dynamic>[];
+          asy::_asyncStarListenHelper(:stream, :async_op);
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
+          try
+            #L2:
+            while (true) {
+              dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
+              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
+              if(:result) {
+                dynamic x = :for-iterator.{asy::_StreamIterator::current};
+                {
+                  yield x;
+                  yield* x;
+                }
+              }
+              else
+                break #L2;
+            }
+          finally
+            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
+              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
+              :result;
+            }
+        }
+      }
+      asy::_completeOnAsyncReturn(:async_completer, :return_value);
+      return;
+    }
+    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
+      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
+    }
+  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
+  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
+  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
+  :async_completer.start(:async_op);
+  return :async_completer.{asy::Completer::future};
+}
+static method main() → dynamic {
+  do {
+    core::print("Hello from do-while!");
+  }
+  while (false)
+  do {
+    dynamic x = core::print("Hello from do-while!");
+  }
+  while (false)
+  for (core::String* s in <dynamic>["Hello from for-in!"]) {
+    core::print(s);
+  }
+  for (core::String* s in <dynamic>["Hello from for-in without block!"])
+    core::print(s);
+  dynamic s;
+  for (final dynamic #t4 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t4;
+    core::print(s);
+  }
+  for (final dynamic #t5 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t5;
+    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);
+  }
+  #L3:
+  switch(1) {
+    #L4:
+    case #C1:
+    case #C2:
+      {
+        core::print("Hello from switch case!");
+        break #L3;
+      }
+    #L5:
+    default:
+      {
+        break #L3;
+      }
+  }
+  #L6:
+  switch(4) {
+    #L7:
+    case #C2:
+      {
+        core::print("Hello from case 2!");
+        break #L6;
+      }
+    #L8:
+    case #C1:
+      {
+        core::print("Hello from case 1!");
+        continue #L7;
+      }
+    #L9:
+    case #C3:
+      {
+        core::print("Hello from case 0!");
+        continue #L8;
+      }
+    #L10:
+    case #C4:
+      {
+        core::print("Hello from case 4!");
+        continue #L11;
+      }
+    #L11:
+    default:
+      {
+        continue #L9;
+      }
+  }
+  #L12:
+  switch(4) {
+    #L13:
+    case #C1:
+      {
+        core::print("Hello from next case 1");
+        break #L12;
+      }
+    #L14:
+    default:
+      {
+        continue #L13;
+      }
+  }
+  core::int* i = 0;
+  #L15:
+  do
+    #L16:
+    {
+      core::print("Hello from do-while!");
+      if((i = i.+(1)).<(3))
+        break #L16;
+      break #L15;
+    }
+  while (true)
+  i = 0;
+  #L17:
+  while (true)
+    #L18:
+    {
+      core::print("Hello from while!");
+      if((i = i.+(1)).<(3))
+        break #L18;
+      break #L17;
+    }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 0
+  #C4 = 4
+}
diff --git a/pkg/front_end/testcases/statements.dart.outline.expect b/pkg/front_end/testcases/general/statements.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/statements.dart.outline.expect
rename to pkg/front_end/testcases/general/statements.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/statements.dart.strong.expect b/pkg/front_end/testcases/general/statements.dart.strong.expect
new file mode 100644
index 0000000..e15d2a6
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart.strong.expect
@@ -0,0 +1,180 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
+//     yield* x;
+//     ^^^^^
+//
+// pkg/front_end/testcases/general/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
+//  - 'List' is from 'dart:core'.
+//  - 'Stream' is from 'dart:async'.
+//   await for (var x in []) {
+//                       ^
+//
+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 async {
+  await for (dynamic x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/general/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
+ - 'List' is from 'dart:core'.
+ - 'Stream' is from 'dart:async'.
+  await for (var x in []) {
+                      ^" in <dynamic>[] as{TypeError} asy::Stream<dynamic>*) {
+    yield x;
+    yield* x;
+  }
+}
+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 #t2 in <dynamic>["Hello from for-in without decl!"]) {
+    s = #t2;
+    core::print(s);
+  }
+  for (final dynamic #t3 in <dynamic>["Hello from for-in without decl and block!"]) {
+    s = #t3;
+    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::<}(3))
+        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::<}(3))
+        break #L16;
+      break #L15;
+    }
+}
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 0
+  #C4 = 4
+}
diff --git a/pkg/front_end/testcases/general/statements.dart.type_promotion.expect b/pkg/front_end/testcases/general/statements.dart.type_promotion.expect
new file mode 100644
index 0000000..5384f47
--- /dev/null
+++ b/pkg/front_end/testcases/general/statements.dart.type_promotion.expect
@@ -0,0 +1,12 @@
+pkg/front_end/testcases/general/statements.dart:51:10: Context: Write to done@988
+    done = true;
+         ^
+pkg/front_end/testcases/general/statements.dart:101:9: Context: Write to i@1834
+    if (++i < 3) continue;
+        ^^
+pkg/front_end/testcases/general/statements.dart:104:5: Context: Write to i@1834
+  i = 0;
+    ^
+pkg/front_end/testcases/general/statements.dart:108:9: Context: Write to i@1834
+    if (++i < 3) continue OUTER;
+        ^^
diff --git a/pkg/front_end/testcases/static_setter.dart b/pkg/front_end/testcases/general/static_setter.dart
similarity index 100%
rename from pkg/front_end/testcases/static_setter.dart
rename to pkg/front_end/testcases/general/static_setter.dart
diff --git a/pkg/front_end/testcases/static_setter.dart.hierarchy.expect b/pkg/front_end/testcases/general/static_setter.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/static_setter.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/static_setter.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/static_setter.dart.legacy.expect b/pkg/front_end/testcases/general/static_setter.dart.legacy.expect
new file mode 100644
index 0000000..7b5a72c
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.legacy.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static set foo(dynamic x) → void {}
+static method main() → dynamic {
+  self::foo = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/general/static_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/static_setter.dart.legacy.transformed.expect
new file mode 100644
index 0000000..7b5a72c
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.legacy.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static set foo(dynamic x) → void {}
+static method main() → dynamic {
+  self::foo = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/general/static_setter.dart.outline.expect b/pkg/front_end/testcases/general/static_setter.dart.outline.expect
new file mode 100644
index 0000000..46a8e6d
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.outline.expect
@@ -0,0 +1,12 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    ;
+}
+static set foo(dynamic x) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/static_setter.dart.strong.expect b/pkg/front_end/testcases/general/static_setter.dart.strong.expect
new file mode 100644
index 0000000..7b5a72c
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.strong.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static set foo(dynamic x) → void {}
+static method main() → dynamic {
+  self::foo = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/general/static_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/general/static_setter.dart.strong.transformed.expect
new file mode 100644
index 0000000..7b5a72c
--- /dev/null
+++ b/pkg/front_end/testcases/general/static_setter.dart.strong.transformed.expect
@@ -0,0 +1,13 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  synthetic constructor •() → self::Foo*
+    : super core::Object::•()
+    ;
+}
+static set foo(dynamic x) → void {}
+static method main() → dynamic {
+  self::foo = new self::Foo::•();
+}
diff --git a/pkg/front_end/testcases/store_load.dart b/pkg/front_end/testcases/general/store_load.dart
similarity index 100%
rename from pkg/front_end/testcases/store_load.dart
rename to pkg/front_end/testcases/general/store_load.dart
diff --git a/pkg/front_end/testcases/store_load.dart.hierarchy.expect b/pkg/front_end/testcases/general/store_load.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/store_load.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/store_load.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/store_load.dart.legacy.expect b/pkg/front_end/testcases/general/store_load.dart.legacy.expect
new file mode 100644
index 0000000..2e466ef
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.legacy.expect
@@ -0,0 +1,36 @@
+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::•()
+    ;
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic foo = new self::Foo::•();
+  foo._field = new self::FooValue::•();
+  dynamic fooValue = foo._field;
+  core::print(fooValue);
+  dynamic bar = new self::Bar::•();
+  bar._field = new self::BarValue::•();
+  dynamic barValue = bar._field;
+  core::print(barValue);
+}
diff --git a/pkg/front_end/testcases/general/store_load.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/store_load.dart.legacy.transformed.expect
new file mode 100644
index 0000000..2e466ef
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.legacy.transformed.expect
@@ -0,0 +1,36 @@
+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::•()
+    ;
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic foo = new self::Foo::•();
+  foo._field = new self::FooValue::•();
+  dynamic fooValue = foo._field;
+  core::print(fooValue);
+  dynamic bar = new self::Bar::•();
+  bar._field = new self::BarValue::•();
+  dynamic barValue = bar._field;
+  core::print(barValue);
+}
diff --git a/pkg/front_end/testcases/general/store_load.dart.outline.expect b/pkg/front_end/testcases/general/store_load.dart.outline.expect
new file mode 100644
index 0000000..7098d1b
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.outline.expect
@@ -0,0 +1,24 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field dynamic _field;
+  synthetic constructor •() → self::Foo*
+    ;
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    ;
+}
+class Bar extends core::Object {
+  field dynamic _field;
+  synthetic constructor •() → self::Bar*
+    ;
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/store_load.dart.strong.expect b/pkg/front_end/testcases/general/store_load.dart.strong.expect
new file mode 100644
index 0000000..13e718e
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.strong.expect
@@ -0,0 +1,36 @@
+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::•()
+    ;
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  foo.{self::Foo::_field} = new self::FooValue::•();
+  dynamic fooValue = foo.{self::Foo::_field};
+  core::print(fooValue);
+  self::Bar* bar = new self::Bar::•();
+  bar.{self::Bar::_field} = new self::BarValue::•();
+  dynamic barValue = bar.{self::Bar::_field};
+  core::print(barValue);
+}
diff --git a/pkg/front_end/testcases/general/store_load.dart.strong.transformed.expect b/pkg/front_end/testcases/general/store_load.dart.strong.transformed.expect
new file mode 100644
index 0000000..13e718e
--- /dev/null
+++ b/pkg/front_end/testcases/general/store_load.dart.strong.transformed.expect
@@ -0,0 +1,36 @@
+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::•()
+    ;
+}
+class FooValue extends core::Object {
+  synthetic constructor •() → self::FooValue*
+    : super core::Object::•()
+    ;
+}
+class Bar extends core::Object {
+  field dynamic _field = null;
+  synthetic constructor •() → self::Bar*
+    : super core::Object::•()
+    ;
+}
+class BarValue extends core::Object {
+  synthetic constructor •() → self::BarValue*
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {
+  self::Foo* foo = new self::Foo::•();
+  foo.{self::Foo::_field} = new self::FooValue::•();
+  dynamic fooValue = foo.{self::Foo::_field};
+  core::print(fooValue);
+  self::Bar* bar = new self::Bar::•();
+  bar.{self::Bar::_field} = new self::BarValue::•();
+  dynamic barValue = bar.{self::Bar::_field};
+  core::print(barValue);
+}
diff --git a/pkg/front_end/testcases/stringliteral.dart b/pkg/front_end/testcases/general/stringliteral.dart
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart
rename to pkg/front_end/testcases/general/stringliteral.dart
diff --git a/pkg/front_end/testcases/stringliteral.dart.legacy.expect b/pkg/front_end/testcases/general/stringliteral.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart.legacy.expect
rename to pkg/front_end/testcases/general/stringliteral.dart.legacy.expect
diff --git a/pkg/front_end/testcases/stringliteral.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/stringliteral.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/stringliteral.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/stringliteral.dart.outline.expect b/pkg/front_end/testcases/general/stringliteral.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/stringliteral.dart.outline.expect
rename to pkg/front_end/testcases/general/stringliteral.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/stringliteral.dart.strong.expect b/pkg/front_end/testcases/general/stringliteral.dart.strong.expect
new file mode 100644
index 0000000..6af4e00
--- /dev/null
+++ b/pkg/front_end/testcases/general/stringliteral.dart.strong.expect
@@ -0,0 +1,17 @@
+library;
+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/stringliteral.dart.strong.transformed.expect b/pkg/front_end/testcases/general/stringliteral.dart.strong.transformed.expect
new file mode 100644
index 0000000..6af4e00
--- /dev/null
+++ b/pkg/front_end/testcases/general/stringliteral.dart.strong.transformed.expect
@@ -0,0 +1,17 @@
+library;
+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/super_call.dart b/pkg/front_end/testcases/general/super_call.dart
similarity index 100%
rename from pkg/front_end/testcases/super_call.dart
rename to pkg/front_end/testcases/general/super_call.dart
diff --git a/pkg/front_end/testcases/super_call.dart.hierarchy.expect b/pkg/front_end/testcases/general/super_call.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/super_call.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/super_call.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/super_call.dart.legacy.expect b/pkg/front_end/testcases/general/super_call.dart.legacy.expect
new file mode 100644
index 0000000..103be3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.legacy.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+//
+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.*(2);
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.*(3);
+  method call_super() → core::int* {
+    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    return super(5);
+           ^";
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().call_super().==(10));
+}
diff --git a/pkg/front_end/testcases/general/super_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/super_call.dart.legacy.transformed.expect
new file mode 100644
index 0000000..103be3d
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.legacy.transformed.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+//
+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.*(2);
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.*(3);
+  method call_super() → core::int* {
+    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    return super(5);
+           ^";
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().call_super().==(10));
+}
diff --git a/pkg/front_end/testcases/general/super_call.dart.outline.expect b/pkg/front_end/testcases/general/super_call.dart.outline.expect
new file mode 100644
index 0000000..bf952e5
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.outline.expect
@@ -0,0 +1,20 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+  method call(core::int* x) → core::int*
+    ;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    ;
+  method call(core::int* x) → core::int*
+    ;
+  method call_super() → core::int*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/super_call.dart.strong.expect b/pkg/front_end/testcases/general/super_call.dart.strong.expect
new file mode 100644
index 0000000..a56e117
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.strong.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+//
+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);
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.{core::num::*}(3);
+  method call_super() → core::int* {
+    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    return super(5);
+           ^" as{TypeError} core::int*;
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().{self::B::call_super}().{core::num::==}(10));
+}
diff --git a/pkg/front_end/testcases/general/super_call.dart.strong.transformed.expect b/pkg/front_end/testcases/general/super_call.dart.strong.transformed.expect
new file mode 100644
index 0000000..a56e117
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_call.dart.strong.transformed.expect
@@ -0,0 +1,35 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+// To delegate a constructor to a super constructor, put the super call as an initializer.
+//     return super(5);
+//            ^
+//
+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);
+}
+class B extends self::A {
+  synthetic constructor •() → self::B*
+    : super self::A::•()
+    ;
+  method call(core::int* x) → core::int*
+    return x.{core::num::*}(3);
+  method call_super() → core::int* {
+    return invalid-expression "pkg/front_end/testcases/general/super_call.dart:14:12: Error: Can't use 'super' as an expression.
+To delegate a constructor to a super constructor, put the super call as an initializer.
+    return super(5);
+           ^" as{TypeError} core::int*;
+  }
+}
+static method main() → dynamic {
+  assert(new self::B::•().{self::B::call_super}().{core::num::==}(10));
+}
diff --git a/pkg/front_end/testcases/super_nsm.dart b/pkg/front_end/testcases/general/super_nsm.dart
similarity index 100%
rename from pkg/front_end/testcases/super_nsm.dart
rename to pkg/front_end/testcases/general/super_nsm.dart
diff --git a/pkg/front_end/testcases/super_nsm.dart.hierarchy.expect b/pkg/front_end/testcases/general/super_nsm.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/super_nsm.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/super_nsm.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.legacy.expect b/pkg/front_end/testcases/general/super_nsm.dart.legacy.expect
new file mode 100644
index 0000000..9b490c3
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.legacy.expect
@@ -0,0 +1,40 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "C";
+  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))) as{TypeError} 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::•().dMethod();
+  if(!result.==("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
+
+constants  {
+  #C1 = #interfaceMethod
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/super_nsm.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9b490c3
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.legacy.transformed.expect
@@ -0,0 +1,40 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "C";
+  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))) as{TypeError} 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::•().dMethod();
+  if(!result.==("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
+
+constants  {
+  #C1 = #interfaceMethod
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.outline.expect b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
new file mode 100644
index 0000000..2da773b
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.outline.expect
@@ -0,0 +1,27 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+abstract class I extends core::Object {
+  synthetic constructor •() → self::I*
+    ;
+  abstract method interfaceMethod() → dynamic;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    ;
+  no-such-method-forwarder method interfaceMethod() → dynamic
+    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} dynamic;
+}
+class D extends self::C {
+  synthetic constructor •() → self::D*
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    ;
+  method dMethod() → dynamic
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.strong.expect b/pkg/front_end/testcases/general/super_nsm.dart.strong.expect
new file mode 100644
index 0000000..69a6257
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.strong.expect
@@ -0,0 +1,40 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "C";
+  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))) as{TypeError} 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}();
+  if(!result.{core::Object::==}("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
+
+constants  {
+  #C1 = #interfaceMethod
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/super_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/general/super_nsm.dart.strong.transformed.expect
new file mode 100644
index 0000000..69a6257
--- /dev/null
+++ b/pkg/front_end/testcases/general/super_nsm.dart.strong.transformed.expect
@@ -0,0 +1,40 @@
+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;
+}
+class C extends core::Object implements self::I {
+  synthetic constructor •() → self::C*
+    : super core::Object::•()
+    ;
+  method noSuchMethod(core::Invocation* _) → dynamic
+    return "C";
+  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))) as{TypeError} 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}();
+  if(!result.{core::Object::==}("D"))
+    throw "Expected 'D' but got: '${result}'";
+}
+
+constants  {
+  #C1 = #interfaceMethod
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/general/tabs.dart b/pkg/front_end/testcases/general/tabs.dart
new file mode 100644
index 0000000..17daaf4
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart
@@ -0,0 +1,16 @@
+// 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.
+
+// Test that error messages are indented correctly
+// in the presence of tabs.
+
+test() {
+  print(one);
+  print(two);
+  print(three);
+  print(four);
+  print(five);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/general/tabs.dart.legacy.expect b/pkg/front_end/testcases/general/tabs.dart.legacy.expect
new file mode 100644
index 0000000..5828d2d
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart.legacy.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/tabs.dart:9:9: Warning: Getter not found: 'one'.
+//   print(one);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:10:9: Warning: Getter not found: 'two'.
+//   print(two);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:11:9: Warning: Getter not found: 'three'.
+//   print(three);
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:12:9: Warning: Getter not found: 'four'.
+//   print(four);
+//         ^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:13:9: Warning: Getter not found: 'five'.
+//   print(five);
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #one
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #two
+  #C6 = #three
+  #C7 = #four
+  #C8 = #five
+}
diff --git a/pkg/front_end/testcases/general/tabs.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/tabs.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5828d2d
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart.legacy.transformed.expect
@@ -0,0 +1,46 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/tabs.dart:9:9: Warning: Getter not found: 'one'.
+//   print(one);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:10:9: Warning: Getter not found: 'two'.
+//   print(two);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:11:9: Warning: Getter not found: 'three'.
+//   print(three);
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:12:9: Warning: Getter not found: 'four'.
+//   print(four);
+//         ^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:13:9: Warning: Getter not found: 'five'.
+//   print(five);
+//         ^^^^
+//
+import self as self;
+import "dart:core" as core;
+
+static method test() → dynamic {
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = #one
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #two
+  #C6 = #three
+  #C7 = #four
+  #C8 = #five
+}
diff --git a/pkg/front_end/testcases/tabs.dart.outline.expect b/pkg/front_end/testcases/general/tabs.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/tabs.dart.outline.expect
rename to pkg/front_end/testcases/general/tabs.dart.outline.expect
diff --git a/pkg/front_end/testcases/general/tabs.dart.strong.expect b/pkg/front_end/testcases/general/tabs.dart.strong.expect
new file mode 100644
index 0000000..217aa32
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart.strong.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/tabs.dart:9:9: Error: Getter not found: 'one'.
+//   print(one);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:10:9: Error: Getter not found: 'two'.
+//   print(two);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:11:9: Error: Getter not found: 'three'.
+//   print(three);
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:12:9: Error: Getter not found: 'four'.
+//   print(four);
+//         ^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:13:9: Error: Getter not found: '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: Getter not found: 'one'.
+  print(one);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:10:9: Error: Getter not found: 'two'.
+  print(two);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:11:9: Error: Getter not found: 'three'.
+  print(three);
+        ^^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:12:9: Error: Getter not found: 'four'.
+  print(four);
+        ^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:13:9: Error: Getter not found: 'five'.
+  print(five);
+        ^^^^");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/tabs.dart.strong.transformed.expect b/pkg/front_end/testcases/general/tabs.dart.strong.transformed.expect
new file mode 100644
index 0000000..217aa32
--- /dev/null
+++ b/pkg/front_end/testcases/general/tabs.dart.strong.transformed.expect
@@ -0,0 +1,45 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/tabs.dart:9:9: Error: Getter not found: 'one'.
+//   print(one);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:10:9: Error: Getter not found: 'two'.
+//   print(two);
+//         ^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:11:9: Error: Getter not found: 'three'.
+//   print(three);
+//         ^^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:12:9: Error: Getter not found: 'four'.
+//   print(four);
+//         ^^^^
+//
+// pkg/front_end/testcases/general/tabs.dart:13:9: Error: Getter not found: '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: Getter not found: 'one'.
+  print(one);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:10:9: Error: Getter not found: 'two'.
+  print(two);
+        ^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:11:9: Error: Getter not found: 'three'.
+  print(three);
+        ^^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:12:9: Error: Getter not found: 'four'.
+  print(four);
+        ^^^^");
+  core::print(invalid-expression "pkg/front_end/testcases/general/tabs.dart:13:9: Error: Getter not found: 'five'.
+  print(five);
+        ^^^^");
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/top_level_accessors.dart b/pkg/front_end/testcases/general/top_level_accessors.dart
similarity index 100%
rename from pkg/front_end/testcases/top_level_accessors.dart
rename to pkg/front_end/testcases/general/top_level_accessors.dart
diff --git a/pkg/front_end/testcases/general/top_level_accessors.dart.legacy.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.legacy.expect
new file mode 100644
index 0000000..9898bf6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.legacy.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_accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.legacy.transformed.expect
new file mode 100644
index 0000000..9898bf6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.legacy.transformed.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_accessors.dart.outline.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.outline.expect
new file mode 100644
index 0000000..bbdb2a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.outline.expect
@@ -0,0 +1,11 @@
+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
+  ;
+static get /* from org-dartlang-testcase:///top_level_accessors_part.dart */ exitCode() → core::int*
+  ;
+static method /* from org-dartlang-testcase:///top_level_accessors_part.dart */ main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/top_level_accessors.dart.strong.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.strong.expect
new file mode 100644
index 0000000..9898bf6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.strong.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_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/general/top_level_accessors.dart.strong.transformed.expect
new file mode 100644
index 0000000..9898bf6
--- /dev/null
+++ b/pkg/front_end/testcases/general/top_level_accessors.dart.strong.transformed.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/top_level_accessors_part.dart b/pkg/front_end/testcases/general/top_level_accessors_part.dart
similarity index 100%
rename from pkg/front_end/testcases/top_level_accessors_part.dart
rename to pkg/front_end/testcases/general/top_level_accessors_part.dart
diff --git a/pkg/front_end/testcases/top_level_library_method.dart b/pkg/front_end/testcases/general/top_level_library_method.dart
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart
rename to pkg/front_end/testcases/general/top_level_library_method.dart
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.legacy.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.legacy.expect
rename to pkg/front_end/testcases/general/top_level_library_method.dart.legacy.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.legacy.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.legacy.transformed.expect
rename to pkg/front_end/testcases/general/top_level_library_method.dart.legacy.transformed.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.outline.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.outline.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.outline.expect
rename to pkg/front_end/testcases/general/top_level_library_method.dart.outline.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.strong.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.strong.expect
rename to pkg/front_end/testcases/general/top_level_library_method.dart.strong.expect
diff --git a/pkg/front_end/testcases/top_level_library_method.dart.strong.transformed.expect b/pkg/front_end/testcases/general/top_level_library_method.dart.strong.transformed.expect
similarity index 100%
rename from pkg/front_end/testcases/top_level_library_method.dart.strong.transformed.expect
rename to pkg/front_end/testcases/general/top_level_library_method.dart.strong.transformed.expect
diff --git a/pkg/front_end/testcases/general/type_of_null.dart b/pkg/front_end/testcases/general/type_of_null.dart
new file mode 100644
index 0000000..0f7004e
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart
@@ -0,0 +1,31 @@
+// 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.
+
+/*@testedFeatures=inference*/
+T map<T>(T Function() f1, T Function() f2) {}
+
+id<T>(T t) => t;
+
+Null foo() => null;
+
+main() {
+  /*@ typeArgs=Null* */ map(/*@ returnType=Null* */ () {},
+      /*@ returnType=<BottomType> */ () => throw "hello");
+  /*@ typeArgs=Null* */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null* */ () {});
+  Null Function() f = /*@ returnType=Null* */ () {};
+  /*@ typeArgs=Null* */ map(
+      foo, /*@ returnType=<BottomType> */ () => throw "hello");
+  /*@ typeArgs=Null* */ map(
+      /*@ returnType=<BottomType> */ () => throw "hello", foo);
+  /*@ typeArgs=Null* */ map(/*@ returnType=Null* */ () {
+    return null;
+  }, /*@ returnType=<BottomType> */ () => throw "hello");
+
+  /*@ typeArgs=Null* */ map(/*@ returnType=<BottomType> */ () => throw "hello",
+      /*@ returnType=Null* */ () {
+    return null;
+  });
+  /*@ typeArgs=() ->* Null* */ id(/*@ returnType=Null* */ () {});
+}
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.legacy.expect b/pkg/front_end/testcases/general/type_of_null.dart.legacy.expect
new file mode 100644
index 0000000..3128fcb
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.legacy.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() → core::Null*
+  return null;
+static method main() → dynamic {
+  self::map<dynamic>(() → dynamic {}, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {});
+  () →* core::Null* f = () → dynamic {};
+  self::map<dynamic>(#C1, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", #C1);
+  self::map<dynamic>(() → dynamic {
+    return null;
+  }, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {
+    return null;
+  });
+  self::id<dynamic>(() → dynamic {});
+}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/type_of_null.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3128fcb
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.legacy.transformed.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() → core::Null*
+  return null;
+static method main() → dynamic {
+  self::map<dynamic>(() → dynamic {}, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {});
+  () →* core::Null* f = () → dynamic {};
+  self::map<dynamic>(#C1, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", #C1);
+  self::map<dynamic>(() → dynamic {
+    return null;
+  }, () → dynamic => throw "hello");
+  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {
+    return null;
+  });
+  self::id<dynamic>(() → dynamic {});
+}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.outline.expect b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
new file mode 100644
index 0000000..336fdab
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.outline.expect
@@ -0,0 +1,12 @@
+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
+  ;
+static method foo() → core::Null*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.expect
new file mode 100644
index 0000000..0a6f445
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.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() → core::Null*
+  return null;
+static method main() → dynamic {
+  self::map<core::Null*>(() → core::Null* {}, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", () → core::Null* {});
+  () →* core::Null* f = () → core::Null* {};
+  self::map<core::Null*>(#C1, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", #C1);
+  self::map<core::Null*>(() → core::Null* {
+    return null;
+  }, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", () → core::Null* {
+    return null;
+  });
+  self::id<() →* core::Null*>(() → core::Null* {});
+}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.expect
new file mode 100644
index 0000000..0a6f445
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_of_null.dart.strong.transformed.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() → core::Null*
+  return null;
+static method main() → dynamic {
+  self::map<core::Null*>(() → core::Null* {}, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", () → core::Null* {});
+  () →* core::Null* f = () → core::Null* {};
+  self::map<core::Null*>(#C1, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", #C1);
+  self::map<core::Null*>(() → core::Null* {
+    return null;
+  }, () → <BottomType>=> throw "hello");
+  self::map<core::Null*>(() → <BottomType>=> throw "hello", () → core::Null* {
+    return null;
+  });
+  self::id<() →* core::Null*>(() → core::Null* {});
+}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart
similarity index 100%
rename from pkg/front_end/testcases/type_parameter_type_named_int.dart
rename to pkg/front_end/testcases/general/type_parameter_type_named_int.dart
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.hierarchy.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_parameter_type_named_int.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/type_parameter_type_named_int.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.expect
new file mode 100644
index 0000000..cc56d21
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+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;
+}
+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} = value;
+  }
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.transformed.expect
new file mode 100644
index 0000000..cc56d21
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+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;
+}
+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} = value;
+  }
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.outline.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.outline.expect
new file mode 100644
index 0000000..e298634
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+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*>*
+    ;
+  abstract get list() → core::List<self::Foo::T*>*;
+  abstract method setList<T extends core::Object* = dynamic>(core::List<self::Foo::setList::T*>* value) → void;
+}
+class Bar extends core::Object implements self::Foo<core::int*> {
+  field core::List<core::int*>* list;
+  synthetic constructor •() → self::Bar*
+    ;
+  method setList<int extends core::Object* = dynamic>(core::List<self::Bar::setList::int*>* value) → void
+    ;
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect
new file mode 100644
index 0000000..b0d2afa
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.expect
@@ -0,0 +1,37 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+//     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;
+}
+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} = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+    list = value;
+           ^" in value as{TypeError} core::List<core::int*>*;
+  }
+}
diff --git a/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect
new file mode 100644
index 0000000..b0d2afa
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_parameter_type_named_int.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+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'.
+// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+//     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;
+}
+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} = let final<BottomType> #t1 = 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'.
+Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
+    list = value;
+           ^" in value as{TypeError} core::List<core::int*>*;
+  }
+}
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart b/pkg/front_end/testcases/general/type_variable_as_super.dart
similarity index 100%
rename from pkg/front_end/testcases/type_variable_as_super.dart
rename to pkg/front_end/testcases/general/type_variable_as_super.dart
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.hierarchy.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_as_super.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/type_variable_as_super.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.legacy.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_as_super.dart.legacy.expect
rename to pkg/front_end/testcases/general/type_variable_as_super.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/type_variable_as_super.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.outline.expect
new file mode 100644
index 0000000..96ee46b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_as_super.dart.outline.expect
@@ -0,0 +1,33 @@
+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 {}
+//       ^
+//
+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*>*
+    ;
+}
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T*>*
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_variable_as_super.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.strong.expect
new file mode 100644
index 0000000..43c75b3
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_as_super.dart.strong.expect
@@ -0,0 +1,47 @@
+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 class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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_as_super.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_as_super.dart.strong.transformed.expect
new file mode 100644
index 0000000..43c75b3
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_as_super.dart.strong.transformed.expect
@@ -0,0 +1,47 @@
+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 class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •() → self::B<self::B::T*>*
+    : super core::Object::•()
+    ;
+}
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+}
+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/type_variable_prefix.dart b/pkg/front_end/testcases/general/type_variable_prefix.dart
similarity index 100%
rename from pkg/front_end/testcases/type_variable_prefix.dart
rename to pkg/front_end/testcases/general/type_variable_prefix.dart
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.hierarchy.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_prefix.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/type_variable_prefix.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.expect
new file mode 100644
index 0000000..131a224
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8:3: Warning: '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!";
+}
+static method main() → dynamic {
+  core::String* s = new self::C::•<dynamic>().method();
+  core::print(s);
+}
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.transformed.expect
new file mode 100644
index 0000000..131a224
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.legacy.transformed.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8:3: Warning: '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!";
+}
+static method main() → dynamic {
+  core::String* s = new self::C::•<dynamic>().method();
+  core::print(s);
+}
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
new file mode 100644
index 0000000..8174b6c
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.outline.expect
@@ -0,0 +1,21 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8:3: Warning: '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*>*
+    ;
+  method method() → invalid-type
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.expect
new file mode 100644
index 0000000..3a5b1a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8: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!" as{TypeError} invalid-type;
+}
+static method main() → dynamic {
+  core::String* s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String*;
+  core::print(s);
+}
diff --git a/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.transformed.expect
new file mode 100644
index 0000000..3a5b1a7
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_prefix.dart.strong.transformed.expect
@@ -0,0 +1,24 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_prefix.dart:8: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!" as{TypeError} invalid-type;
+}
+static method main() → dynamic {
+  core::String* s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String*;
+  core::print(s);
+}
diff --git a/pkg/front_end/testcases/type_variable_uses.dart b/pkg/front_end/testcases/general/type_variable_uses.dart
similarity index 100%
rename from pkg/front_end/testcases/type_variable_uses.dart
rename to pkg/front_end/testcases/general/type_variable_uses.dart
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.hierarchy.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/type_variable_uses.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/type_variable_uses.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.expect
new file mode 100644
index 0000000..529bdd2
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Warning: Type variables can't be used in static members.
+//     print(T);
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Warning: Type variables can't be used in static members.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Warning: Type variables can't be used in static members.
+//     C<T> l;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Warning: Type variables can't be used in static members.
+//     C<C<T>> ll;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Warning: Type variables can't be used in static members.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Warning: Type variables can't be used in static members.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Warning: Type variables can't be used in static members.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Warning: Type variables can't be used in static members.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Warning: 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 {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<dynamic>* {
+    core::print(invalid-type);
+    invalid-type t;
+    self::C<invalid-type>* l;
+    self::C<self::C<invalid-type>*>* ll;
+    #C1;
+    #C2;
+    #C3;
+    #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;
+    #C1;
+    #C2;
+    #C3;
+    #C5;
+    #C6;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<invalid-type> {}
+  #C2 = <invalid-type>[]
+  #C3 = <self::C<invalid-type>*>[]
+  #C4 = TypeLiteralConstant(invalid-type)
+  #C5 = <core::Object*>[#C4]
+  #C6 = <core::Object*>[#C1]
+}
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.transformed.expect
new file mode 100644
index 0000000..529bdd2
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.legacy.transformed.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:8:11: Warning: Type variables can't be used in static members.
+//     print(T);
+//           ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:9:5: Warning: Type variables can't be used in static members.
+//     T t;
+//     ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:10:7: Warning: Type variables can't be used in static members.
+//     C<T> l;
+//       ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:11:9: Warning: Type variables can't be used in static members.
+//     C<C<T>> ll;
+//         ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:12:13: Warning: Type variables can't be used in static members.
+//     const C<T>();
+//             ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:13:12: Warning: Type variables can't be used in static members.
+//     const <T>[];
+//            ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:14:14: Warning: Type variables can't be used in static members.
+//     const <C<T>>[];
+//              ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:15:20: Warning: Type variables can't be used in static members.
+//     const <Object>[T];
+//                    ^
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:16:28: Warning: 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 {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<dynamic>* {
+    core::print(invalid-type);
+    invalid-type t;
+    self::C<invalid-type>* l;
+    self::C<self::C<invalid-type>*>* ll;
+    #C1;
+    #C2;
+    #C3;
+    #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;
+    #C1;
+    #C2;
+    #C3;
+    #C5;
+    #C6;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<invalid-type> {}
+  #C2 = <invalid-type>[]
+  #C3 = <self::C<invalid-type>*>[]
+  #C4 = TypeLiteralConstant(invalid-type)
+  #C5 = <core::Object*>[#C4]
+  #C6 = <core::Object*>[#C1]
+}
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
new file mode 100644
index 0000000..9bdf117
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.outline.expect
@@ -0,0 +1,22 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
+//   static C<T> staticMethod() {
+//               ^
+//
+import self as self;
+import "dart:core" as core;
+
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<dynamic>*
+    ;
+  method instanceMethod() → self::C<self::C::T*>*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect
new file mode 100644
index 0000000..71db16b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
+//   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 {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<dynamic>* {
+    core::print(invalid-type);
+    invalid-type t;
+    self::C<invalid-type>* l;
+    self::C<self::C<invalid-type>*>* ll;
+    #C1;
+    #C2;
+    #C3;
+    #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;
+    #C1;
+    #C2;
+    #C3;
+    #C5;
+    #C6;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<invalid-type> {}
+  #C2 = <invalid-type>[]
+  #C3 = <self::C<invalid-type>*>[]
+  #C4 = TypeLiteralConstant(invalid-type)
+  #C5 = <core::Object*>[#C4]
+  #C6 = <core::Object*>[#C1]
+}
diff --git a/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
new file mode 100644
index 0000000..71db16b
--- /dev/null
+++ b/pkg/front_end/testcases/general/type_variable_uses.dart.strong.transformed.expect
@@ -0,0 +1,104 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
+//   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 {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
+    ;
+  static method staticMethod() → self::C<dynamic>* {
+    core::print(invalid-type);
+    invalid-type t;
+    self::C<invalid-type>* l;
+    self::C<self::C<invalid-type>*>* ll;
+    #C1;
+    #C2;
+    #C3;
+    #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;
+    #C1;
+    #C2;
+    #C3;
+    #C5;
+    #C6;
+  }
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<invalid-type> {}
+  #C2 = <invalid-type>[]
+  #C3 = <self::C<invalid-type>*>[]
+  #C4 = TypeLiteralConstant(invalid-type)
+  #C5 = <core::Object*>[#C4]
+  #C6 = <core::Object*>[#C1]
+}
diff --git a/pkg/front_end/testcases/typedef.dart b/pkg/front_end/testcases/general/typedef.dart
similarity index 100%
rename from pkg/front_end/testcases/typedef.dart
rename to pkg/front_end/testcases/general/typedef.dart
diff --git a/pkg/front_end/testcases/general/typedef.dart.legacy.expect b/pkg/front_end/testcases/general/typedef.dart.legacy.expect
new file mode 100644
index 0000000..979f6c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.legacy.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 = tearoff self::main
+}
diff --git a/pkg/front_end/testcases/general/typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/typedef.dart.legacy.transformed.expect
new file mode 100644
index 0000000..979f6c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.legacy.transformed.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 = tearoff self::main
+}
diff --git a/pkg/front_end/testcases/general/typedef.dart.outline.expect b/pkg/front_end/testcases/general/typedef.dart.outline.expect
new file mode 100644
index 0000000..b50eefb
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.outline.expect
@@ -0,0 +1,8 @@
+library;
+import self as self;
+
+typedef _NullaryFunction = () →* dynamic;
+typedef _UnaryFunction = (dynamic) →* dynamic;
+typedef _BinaryFunction = (dynamic, dynamic) →* dynamic;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/typedef.dart.strong.expect b/pkg/front_end/testcases/general/typedef.dart.strong.expect
new file mode 100644
index 0000000..979f6c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.strong.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 = tearoff self::main
+}
diff --git a/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.expect
new file mode 100644
index 0000000..979f6c8
--- /dev/null
+++ b/pkg/front_end/testcases/general/typedef.dart.strong.transformed.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 = tearoff self::main
+}
diff --git a/pkg/front_end/testcases/undefined.dart b/pkg/front_end/testcases/general/undefined.dart
similarity index 100%
rename from pkg/front_end/testcases/undefined.dart
rename to pkg/front_end/testcases/general/undefined.dart
diff --git a/pkg/front_end/testcases/undefined.dart.hierarchy.expect b/pkg/front_end/testcases/general/undefined.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/undefined.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/undefined.dart.legacy.expect b/pkg/front_end/testcases/general/undefined.dart.legacy.expect
new file mode 100644
index 0000000..19ba3f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.legacy.expect
@@ -0,0 +1,20 @@
+library;
+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 {}
+}
+static method test(self::C* c) → void {
+  c.x;
+  c.y;
+  c.f();
+  c.g();
+  c.x = null;
+  c.y = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/undefined.dart.legacy.transformed.expect
new file mode 100644
index 0000000..19ba3f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.legacy.transformed.expect
@@ -0,0 +1,20 @@
+library;
+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 {}
+}
+static method test(self::C* c) → void {
+  c.x;
+  c.y;
+  c.f();
+  c.g();
+  c.x = null;
+  c.y = null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined.dart.outline.expect b/pkg/front_end/testcases/general/undefined.dart.outline.expect
new file mode 100644
index 0000000..26c18bd
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.outline.expect
@@ -0,0 +1,15 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic x;
+  synthetic constructor •() → self::C*
+    ;
+  method f() → void
+    ;
+}
+static method test(self::C* c) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/undefined.dart.strong.expect b/pkg/front_end/testcases/general/undefined.dart.strong.expect
new file mode 100644
index 0000000..6f35bb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.strong.expect
@@ -0,0 +1,53 @@
+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 {}
+}
+static method test(self::C* c) → void {
+  c.{self::C::x};
+  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;
+    ^";
+  c.{self::C::f}();
+  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();
+    ^";
+  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;
+    ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined.dart.strong.transformed.expect b/pkg/front_end/testcases/general/undefined.dart.strong.transformed.expect
new file mode 100644
index 0000000..6f35bb1
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined.dart.strong.transformed.expect
@@ -0,0 +1,53 @@
+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 {}
+}
+static method test(self::C* c) → void {
+  c.{self::C::x};
+  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;
+    ^";
+  c.{self::C::f}();
+  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();
+    ^";
+  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;
+    ^";
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart
similarity index 100%
rename from pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart
rename to pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.hierarchy.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.expect
new file mode 100644
index 0000000..c223555
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.expect
@@ -0,0 +1,16 @@
+library;
+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 {}
+}
+static method test(self::C* c) → void {
+  c.x = 1;
+  let final dynamic #t1 = c in #t1.x = #t1.x.+(1);
+  let final dynamic #t2 = c in #t2.x.==(null) ? #t2.x = 1 : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
new file mode 100644
index 0000000..c223555
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
@@ -0,0 +1,16 @@
+library;
+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 {}
+}
+static method test(self::C* c) → void {
+  c.x = 1;
+  let final dynamic #t1 = c in #t1.x = #t1.x.+(1);
+  let final dynamic #t2 = c in #t2.x.==(null) ? #t2.x = 1 : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.outline.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.outline.expect
new file mode 100644
index 0000000..d3b88d7
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.outline.expect
@@ -0,0 +1,14 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  synthetic constructor •() → self::C*
+    ;
+  set x(dynamic value) → void
+    ;
+}
+static method test(self::C* c) → void
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.expect
new file mode 100644
index 0000000..b2c33d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.expect
@@ -0,0 +1,39 @@
+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 {}
+}
+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;
+    ^".+(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;
+    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
new file mode 100644
index 0000000..b2c33d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
@@ -0,0 +1,39 @@
+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 {}
+}
+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;
+    ^".+(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;
+    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart b/pkg/front_end/testcases/general/uninitialized_fields.dart
similarity index 100%
rename from pkg/front_end/testcases/uninitialized_fields.dart
rename to pkg/front_end/testcases/general/uninitialized_fields.dart
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.hierarchy.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/uninitialized_fields.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/uninitialized_fields.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.legacy.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/uninitialized_fields.dart.legacy.expect
rename to pkg/front_end/testcases/general/uninitialized_fields.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/uninitialized_fields.dart.outline.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.outline.expect
new file mode 100644
index 0000000..204bee2
--- /dev/null
+++ b/pkg/front_end/testcases/general/uninitialized_fields.dart.outline.expect
@@ -0,0 +1,32 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Uninitialized extends core::Object {
+  field core::int* x;
+  synthetic constructor •() → self::Uninitialized*
+    ;
+}
+class PartiallyInitialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::PartiallyInitialized*
+    ;
+  constructor noInitializer() → self::PartiallyInitialized*
+    ;
+}
+class Initialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::Initialized*
+    ;
+}
+class Forwarding extends core::Object {
+  field core::int* x;
+  constructor initialize(core::int* x) → self::Forwarding*
+    ;
+  constructor •(core::int* arg) → self::Forwarding*
+    ;
+}
+static field core::int* uninitializedTopLevel;
+static field core::int* initializedTopLevel;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.expect
new file mode 100644
index 0000000..2585d9a
--- /dev/null
+++ b/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.expect
@@ -0,0 +1,37 @@
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Initialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::Initialized*
+    : self::Initialized::x = x, super core::Object::•()
+    ;
+}
+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)
+    ;
+}
+static field core::int* uninitializedTopLevel;
+static field core::int* initializedTopLevel = 4;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.transformed.expect
new file mode 100644
index 0000000..2585d9a
--- /dev/null
+++ b/pkg/front_end/testcases/general/uninitialized_fields.dart.strong.transformed.expect
@@ -0,0 +1,37 @@
+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::•()
+    ;
+}
+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::•()
+    ;
+}
+class Initialized extends core::Object {
+  field core::int* x;
+  constructor •(core::int* x) → self::Initialized*
+    : self::Initialized::x = x, super core::Object::•()
+    ;
+}
+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)
+    ;
+}
+static field core::int* uninitializedTopLevel;
+static field core::int* initializedTopLevel = 4;
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/unsound_promotion.dart b/pkg/front_end/testcases/general/unsound_promotion.dart
similarity index 100%
rename from pkg/front_end/testcases/unsound_promotion.dart
rename to pkg/front_end/testcases/general/unsound_promotion.dart
diff --git a/pkg/front_end/testcases/unsound_promotion.dart.hierarchy.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/unsound_promotion.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/unsound_promotion.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.expect
new file mode 100644
index 0000000..a446cb7
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+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* = dynamic>(self::g::T* t) → core::List<self::g::T*>* {
+  self::list = <self::g::T*>[];
+  core::print(self::list.runtimeType);
+  return self::list;
+}
+static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>* {
+  if(s is self::A*) {
+    dynamic list = self::g<dynamic>(s);
+    return list;
+  }
+  return null;
+}
+static method main() → dynamic {
+  self::f<self::B*>(new self::C::•());
+  core::print(self::list.runtimeType);
+  core::List<self::A*>* aList;
+  aList = self::list;
+  core::Object* o = aList;
+  aList = o;
+}
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.transformed.expect
new file mode 100644
index 0000000..a446cb7
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.legacy.transformed.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::•()
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+}
+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* = dynamic>(self::g::T* t) → core::List<self::g::T*>* {
+  self::list = <self::g::T*>[];
+  core::print(self::list.runtimeType);
+  return self::list;
+}
+static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>* {
+  if(s is self::A*) {
+    dynamic list = self::g<dynamic>(s);
+    return list;
+  }
+  return null;
+}
+static method main() → dynamic {
+  self::f<self::B*>(new self::C::•());
+  core::print(self::list.runtimeType);
+  core::List<self::A*>* aList;
+  aList = self::list;
+  core::Object* o = aList;
+  aList = o;
+}
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
new file mode 100644
index 0000000..45f6ecf
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.outline.expect
@@ -0,0 +1,23 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  synthetic constructor •() → self::A*
+    ;
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    ;
+}
+class C extends self::B implements self::A {
+  synthetic constructor •() → self::C*
+    ;
+}
+static field core::List<self::A*>* list;
+static method g<T extends self::A* = dynamic>(self::g::T* t) → core::List<self::g::T*>*
+  ;
+static method f<S extends core::Object* = dynamic>(self::f::S* s) → core::List<self::f::S*>*
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/unsound_promotion.dart.strong.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.strong.expect
new file mode 100644
index 0000000..d4ea589
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.strong.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/unsound_promotion.dart:21:16: Error: Can't infer a type for 'T', it can be either 'S' or 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/general/unsound_promotion.dart'.
+// Try adding a type argument selecting one of the options.
+//     var list = g(s);
+//                ^
+//
+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 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::A*>(self::g::T* t) → core::List<self::g::T*>* {
+  self::list = <self::g::T*>[];
+  core::print(self::list.{core::Object::runtimeType});
+  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* extends self::A*>* list = self::g<self::f::S* extends self::A*>(s{self::f::S* extends 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::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/unsound_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.strong.transformed.expect
new file mode 100644
index 0000000..d4ea589
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.strong.transformed.expect
@@ -0,0 +1,49 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/unsound_promotion.dart:21:16: Error: Can't infer a type for 'T', it can be either 'S' or 'A'.
+//  - 'A' is from 'pkg/front_end/testcases/general/unsound_promotion.dart'.
+// Try adding a type argument selecting one of the options.
+//     var list = g(s);
+//                ^
+//
+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 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::A*>(self::g::T* t) → core::List<self::g::T*>* {
+  self::list = <self::g::T*>[];
+  core::print(self::list.{core::Object::runtimeType});
+  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* extends self::A*>* list = self::g<self::f::S* extends self::A*>(s{self::f::S* extends 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::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/unsound_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/general/unsound_promotion.dart.type_promotion.expect
new file mode 100644
index 0000000..b7149e2b
--- /dev/null
+++ b/pkg/front_end/testcases/general/unsound_promotion.dart.type_promotion.expect
@@ -0,0 +1,9 @@
+pkg/front_end/testcases/general/unsound_promotion.dart:20:9: Context: Possible promotion of s@397
+  if (s is A) {
+        ^^
+pkg/front_end/testcases/general/unsound_promotion.dart:31:9: Context: Write to aList@541
+  aList = list;
+        ^
+pkg/front_end/testcases/general/unsound_promotion.dart:33:9: Context: Write to aList@541
+  aList = o;
+        ^
diff --git a/pkg/front_end/testcases/unused_methods.dart b/pkg/front_end/testcases/general/unused_methods.dart
similarity index 100%
rename from pkg/front_end/testcases/unused_methods.dart
rename to pkg/front_end/testcases/general/unused_methods.dart
diff --git a/pkg/front_end/testcases/unused_methods.dart.hierarchy.expect b/pkg/front_end/testcases/general/unused_methods.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/unused_methods.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/unused_methods.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/unused_methods.dart.legacy.expect b/pkg/front_end/testcases/general/unused_methods.dart.legacy.expect
new file mode 100644
index 0000000..5aebd62
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.legacy.expect
@@ -0,0 +1,86 @@
+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 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}();
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+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}();
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void {
+  object.usedInSubclass();
+}
+static method interfaceCall(self::UsedAsInterface* object) → void {
+  object.usedInSubclass();
+}
+static method exactCallA(self::ClassA* object) → void {
+  object.usedInSubclass();
+}
+static method exactCallB(self::ClassB* object) → void {
+  object.usedInSubclass();
+}
+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/unused_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/unused_methods.dart.legacy.transformed.expect
new file mode 100644
index 0000000..5aebd62
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.legacy.transformed.expect
@@ -0,0 +1,86 @@
+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 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}();
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+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}();
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void {
+  object.usedInSubclass();
+}
+static method interfaceCall(self::UsedAsInterface* object) → void {
+  object.usedInSubclass();
+}
+static method exactCallA(self::ClassA* object) → void {
+  object.usedInSubclass();
+}
+static method exactCallB(self::ClassB* object) → void {
+  object.usedInSubclass();
+}
+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/unused_methods.dart.outline.expect b/pkg/front_end/testcases/general/unused_methods.dart.outline.expect
new file mode 100644
index 0000000..0717113
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.outline.expect
@@ -0,0 +1,58 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class UnusedClass extends core::Object {
+  constructor •() → self::UnusedClass*
+    ;
+}
+abstract class UsedAsBaseClass extends core::Object {
+  synthetic constructor •() → self::UsedAsBaseClass*
+    ;
+  method usedInSubclass() → void
+    ;
+  method calledFromB() → void
+    ;
+  method calledFromSubclass() → void
+    ;
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    ;
+  method usedInSubclass() → void
+    ;
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    ;
+  method usedInSubclass() → void
+    ;
+}
+class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassA*
+    ;
+  method usedInSubclass() → void
+    ;
+}
+class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
+  synthetic constructor •() → self::ClassB*
+    ;
+  method usedInSubclass() → void
+    ;
+  method calledFromSubclass() → void
+    ;
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void
+  ;
+static method interfaceCall(self::UsedAsInterface* object) → void
+  ;
+static method exactCallA(self::ClassA* object) → void
+  ;
+static method exactCallB(self::ClassB* object) → void
+  ;
+static method unusedTopLevel() → dynamic
+  ;
+static method usedTopLevel() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/unused_methods.dart.strong.expect b/pkg/front_end/testcases/general/unused_methods.dart.strong.expect
new file mode 100644
index 0000000..e2c09cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.strong.expect
@@ -0,0 +1,86 @@
+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 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}();
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+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}();
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void {
+  object.{self::UsedAsBaseClass::usedInSubclass}();
+}
+static method interfaceCall(self::UsedAsInterface* object) → void {
+  object.{self::UsedAsInterface::usedInSubclass}();
+}
+static method exactCallA(self::ClassA* object) → void {
+  object.{self::ClassA::usedInSubclass}();
+}
+static method exactCallB(self::ClassB* object) → void {
+  object.{self::ClassB::usedInSubclass}();
+}
+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/unused_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/general/unused_methods.dart.strong.transformed.expect
new file mode 100644
index 0000000..e2c09cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/unused_methods.dart.strong.transformed.expect
@@ -0,0 +1,86 @@
+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 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}();
+  }
+  method calledFromSubclass() → void {
+    core::print("Unused");
+  }
+}
+class UsedAsInterface extends core::Object {
+  synthetic constructor •() → self::UsedAsInterface*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+class InstantiatedButMethodsUnused extends core::Object {
+  synthetic constructor •() → self::InstantiatedButMethodsUnused*
+    : super core::Object::•()
+    ;
+  method usedInSubclass() → void {
+    core::print("Unused");
+  }
+}
+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}();
+  }
+  method calledFromSubclass() → void {}
+}
+static method baseClassCall(self::UsedAsBaseClass* object) → void {
+  object.{self::UsedAsBaseClass::usedInSubclass}();
+}
+static method interfaceCall(self::UsedAsInterface* object) → void {
+  object.{self::UsedAsInterface::usedInSubclass}();
+}
+static method exactCallA(self::ClassA* object) → void {
+  object.{self::ClassA::usedInSubclass}();
+}
+static method exactCallB(self::ClassB* object) → void {
+  object.{self::ClassB::usedInSubclass}();
+}
+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/var_as_type_name.dart b/pkg/front_end/testcases/general/var_as_type_name.dart
similarity index 100%
rename from pkg/front_end/testcases/var_as_type_name.dart
rename to pkg/front_end/testcases/general/var_as_type_name.dart
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.hierarchy.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/var_as_type_name.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/var_as_type_name.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.expect
new file mode 100644
index 0000000..ed64e48
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.expect
@@ -0,0 +1,29 @@
+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: Warning: Type 'var' not found.
+//   Map<String, var> m;
+//               ^^^
+//
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Warning: '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::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  a.m = null;
+}
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.transformed.expect
new file mode 100644
index 0000000..ed64e48
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.legacy.transformed.expect
@@ -0,0 +1,29 @@
+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: Warning: Type 'var' not found.
+//   Map<String, var> m;
+//               ^^^
+//
+// pkg/front_end/testcases/general/var_as_type_name.dart:6:15: Warning: '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::•()
+    ;
+}
+static method main() → dynamic {
+  dynamic a = new self::A::•();
+  a.m = null;
+}
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
new file mode 100644
index 0000000..421073f
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.outline.expect
@@ -0,0 +1,22 @@
+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: Warning: Type 'var' not found.
+//   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;
+  synthetic constructor •() → self::A*
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.strong.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.strong.expect
new file mode 100644
index 0000000..4ac4fef
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.strong.expect
@@ -0,0 +1,29 @@
+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::•()
+    ;
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  a.{self::A::m} = null;
+}
diff --git a/pkg/front_end/testcases/general/var_as_type_name.dart.strong.transformed.expect b/pkg/front_end/testcases/general/var_as_type_name.dart.strong.transformed.expect
new file mode 100644
index 0000000..4ac4fef
--- /dev/null
+++ b/pkg/front_end/testcases/general/var_as_type_name.dart.strong.transformed.expect
@@ -0,0 +1,29 @@
+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::•()
+    ;
+}
+static method main() → dynamic {
+  self::A* a = new self::A::•();
+  a.{self::A::m} = null;
+}
diff --git a/pkg/front_end/testcases/void_methods.dart b/pkg/front_end/testcases/general/void_methods.dart
similarity index 100%
rename from pkg/front_end/testcases/void_methods.dart
rename to pkg/front_end/testcases/general/void_methods.dart
diff --git a/pkg/front_end/testcases/void_methods.dart.hierarchy.expect b/pkg/front_end/testcases/general/void_methods.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/void_methods.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/void_methods.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/void_methods.dart.legacy.expect b/pkg/front_end/testcases/general/void_methods.dart.legacy.expect
similarity index 100%
rename from pkg/front_end/testcases/void_methods.dart.legacy.expect
rename to pkg/front_end/testcases/general/void_methods.dart.legacy.expect
diff --git a/pkg/front_end/testcases/general/void_methods.dart.outline.expect b/pkg/front_end/testcases/general/void_methods.dart.outline.expect
new file mode 100644
index 0000000..cfecfd9
--- /dev/null
+++ b/pkg/front_end/testcases/general/void_methods.dart.outline.expect
@@ -0,0 +1,17 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class Foo extends core::Object {
+  field core::List<dynamic>* list;
+  synthetic constructor •() → self::Foo*
+    ;
+  set first(dynamic x) → void
+    ;
+  operator []=(dynamic x, dynamic y) → void
+    ;
+  method clear() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/void_methods.dart.strong.expect b/pkg/front_end/testcases/general/void_methods.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/void_methods.dart.strong.expect
rename to pkg/front_end/testcases/general/void_methods.dart.strong.expect
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart b/pkg/front_end/testcases/general/warn_unresolved_sends.dart
similarity index 100%
rename from pkg/front_end/testcases/warn_unresolved_sends.dart
rename to pkg/front_end/testcases/general/warn_unresolved_sends.dart
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.hierarchy.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.hierarchy.expect
similarity index 100%
rename from pkg/front_end/testcases/warn_unresolved_sends.dart.hierarchy.expect
rename to pkg/front_end/testcases/general/warn_unresolved_sends.dart.hierarchy.expect
diff --git a/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.expect
new file mode 100644
index 0000000..3b7e7f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.expect
@@ -0,0 +1,92 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
+//     this. /*@warning=GetterNotFound*/ missingField;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
+//     this. /*@warning=SetterNotFound*/ missingField = 0;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
+//     this. /*@warning=MethodNotFound*/ missingMethod();
+//                                       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
+//     /*@warning=GetterNotFound*/ missingField;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
+//     /*@warning=SetterNotFound*/ missingField = 0;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
+//     /*@warning=MethodNotFound*/ 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 {}
+}
+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};
+    this.{self::C::superField};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}();
+    this.{self::C::superMethod}();
+    this.{self::C::setterOnly};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly};
+    this.{self::C::getterOnly} = 0;
+    this.{self::D::field};
+    this.{self::C::superField};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}();
+    this.{self::C::superMethod}();
+    this.{self::C::setterOnly};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly};
+    this.{self::C::getterOnly} = 0;
+    this.missingField;
+    this.missingField = 0;
+    this.missingMethod();
+    this.missingField;
+    this.missingField = 0;
+    this.missingMethod();
+  }
+}
+class E extends self::D {
+  field dynamic missingField = null;
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  method missingMethod() → void {}
+}
+static method main() → dynamic {
+  new self::E::•().test();
+}
diff --git a/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.transformed.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.transformed.expect
new file mode 100644
index 0000000..3b7e7f9
--- /dev/null
+++ b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.legacy.transformed.expect
@@ -0,0 +1,92 @@
+library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
+//     this. /*@warning=GetterNotFound*/ missingField;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
+//     this. /*@warning=SetterNotFound*/ missingField = 0;
+//                                       ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
+//     this. /*@warning=MethodNotFound*/ missingMethod();
+//                                       ^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
+//     /*@warning=GetterNotFound*/ missingField;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
+//     /*@warning=SetterNotFound*/ missingField = 0;
+//                                 ^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/general/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
+//     /*@warning=MethodNotFound*/ 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 {}
+}
+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};
+    this.{self::C::superField};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}();
+    this.{self::C::superMethod}();
+    this.{self::C::setterOnly};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly};
+    this.{self::C::getterOnly} = 0;
+    this.{self::D::field};
+    this.{self::C::superField};
+    this.{self::D::field} = 0;
+    this.{self::C::superField} = 0;
+    this.{self::D::method}();
+    this.{self::C::superMethod}();
+    this.{self::C::setterOnly};
+    this.{self::D::setterOnly} = 0;
+    this.{self::D::getterOnly};
+    this.{self::C::getterOnly} = 0;
+    this.missingField;
+    this.missingField = 0;
+    this.missingMethod();
+    this.missingField;
+    this.missingField = 0;
+    this.missingMethod();
+  }
+}
+class E extends self::D {
+  field dynamic missingField = null;
+  synthetic constructor •() → self::E*
+    : super self::D::•()
+    ;
+  method missingMethod() → void {}
+}
+static method main() → dynamic {
+  new self::E::•().test();
+}
diff --git a/pkg/front_end/testcases/general/warn_unresolved_sends.dart.outline.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.outline.expect
new file mode 100644
index 0000000..72e387d
--- /dev/null
+++ b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.outline.expect
@@ -0,0 +1,41 @@
+library;
+import self as self;
+import "dart:core" as core;
+
+class C extends core::Object {
+  field dynamic superField;
+  synthetic constructor •() → self::C*
+    ;
+  method superMethod() → dynamic
+    ;
+  get setterOnly() → dynamic
+    ;
+  set setterOnly(dynamic _) → void
+    ;
+  get getterOnly() → dynamic
+    ;
+  set getterOnly(dynamic _) → void
+    ;
+}
+class D extends self::C {
+  field dynamic field;
+  synthetic constructor •() → self::D*
+    ;
+  set setterOnly(dynamic _) → void
+    ;
+  get getterOnly() → dynamic
+    ;
+  method method() → dynamic
+    ;
+  method test() → void
+    ;
+}
+class E extends self::D {
+  field dynamic missingField;
+  synthetic constructor •() → self::E*
+    ;
+  method missingMethod() → void
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect b/pkg/front_end/testcases/general/warn_unresolved_sends.dart.strong.expect
similarity index 100%
rename from pkg/front_end/testcases/warn_unresolved_sends.dart.strong.expect
rename to pkg/front_end/testcases/general/warn_unresolved_sends.dart.strong.expect
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart
deleted file mode 100644
index 9e3a783..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-@Foo
-part 'having_part_with_part_and_annotation_lib1.dart';
-
-const int Foo = 42;
-
-void fromMain() {}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.expect b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.expect
deleted file mode 100644
index 929cc78..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/having_part_with_part_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_part_and_annotation_lib2.dart';
-//      ^
-// pkg/front_end/testcases/having_part_with_part_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_part_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* 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 {}
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.transformed.expect
deleted file mode 100644
index 929cc78..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/having_part_with_part_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_part_and_annotation_lib2.dart';
-//      ^
-// pkg/front_end/testcases/having_part_with_part_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_part_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* 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 {}
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.outline.expect b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.outline.expect
deleted file mode 100644
index 6043aa4..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/having_part_with_part_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_part_and_annotation_lib2.dart';
-//      ^
-// pkg/front_end/testcases/having_part_with_part_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-part having_part_with_part_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* 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
-  ;
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.expect b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.expect
deleted file mode 100644
index 929cc78..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/having_part_with_part_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_part_and_annotation_lib2.dart';
-//      ^
-// pkg/front_end/testcases/having_part_with_part_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_part_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* 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 {}
diff --git a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.transformed.expect
deleted file mode 100644
index 929cc78..0000000
--- a/pkg/front_end/testcases/having_part_with_part_and_annotation.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/having_part_with_part_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_part_and_annotation_lib2.dart';
-//      ^
-// pkg/front_end/testcases/having_part_with_part_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_part_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* 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 {}
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart
deleted file mode 100644
index 46ba730..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart
+++ /dev/null
@@ -1,8 +0,0 @@
-@Foo
-part 'having_part_with_parts_and_annotation_lib1.dart';
-
-const int Foo = 42;
-
-void fromMain() {}
-
-main() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.expect b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.expect
deleted file mode 100644
index a33aba1..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_parts_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static const field core::int Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static method fromMain() → void {}
-static method main() → dynamic {}
-static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void {}
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.transformed.expect b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.transformed.expect
deleted file mode 100644
index a33aba1..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_parts_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static const field core::int Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static method fromMain() → void {}
-static method main() → dynamic {}
-static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void {}
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.outline.expect b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.outline.expect
deleted file mode 100644
index b6959ee..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-part having_part_with_parts_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static const field core::int Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static method fromMain() → void
-  ;
-static method main() → dynamic
-  ;
-static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void
-  ;
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.expect b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.expect
deleted file mode 100644
index a33aba1..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_parts_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static const field core::int Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static method fromMain() → void {}
-static method main() → dynamic {}
-static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void {}
diff --git a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.transformed.expect b/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.transformed.expect
deleted file mode 100644
index a33aba1..0000000
--- a/pkg/front_end/testcases/having_part_with_parts_and_annotation.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-// pkg/front_end/testcases/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/having_part_with_parts_and_annotation.dart: Context: This is the containing library.
-//
-import self as self;
-import "dart:core" as core;
-
-@self::Foo
-part having_part_with_parts_and_annotation_lib1.dart;
-static const field core::int Foo = 42;
-static const field core::int Bar = 43 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static const field core::int Baz = 44 /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */;
-static method fromMain() → void {}
-static method main() → dynamic {}
-static method /* from org-dartlang-testcase:///having_part_with_parts_and_annotation_lib1.dart */ fromLib1() → void {}
diff --git a/pkg/front_end/testcases/ignore_function.dart.legacy.expect b/pkg/front_end/testcases/ignore_function.dart.legacy.expect
deleted file mode 100644
index 5b8a8d2..0000000
--- a/pkg/front_end/testcases/ignore_function.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   operator ==(other) => false;
-//               ^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-import "dart:core" as core;
-
-class A extends core::Object implements core::Function {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator ==(dynamic other) → core::bool
-    return false;
-}
-class B extends core::Object implements self::Function {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator ==(invalid-type other) → core::bool
-    return false;
-}
-class Function extends core::Object {
-  synthetic constructor •() → self::Function
-    : super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return false;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/ignore_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/ignore_function.dart.legacy.transformed.expect
deleted file mode 100644
index 5b8a8d2..0000000
--- a/pkg/front_end/testcases/ignore_function.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   operator ==(other) => false;
-//               ^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-import "dart:core" as core;
-
-class A extends core::Object implements core::Function {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator ==(dynamic other) → core::bool
-    return false;
-}
-class B extends core::Object implements self::Function {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator ==(invalid-type other) → core::bool
-    return false;
-}
-class Function extends core::Object {
-  synthetic constructor •() → self::Function
-    : super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return false;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/ignore_function.dart.outline.expect b/pkg/front_end/testcases/ignore_function.dart.outline.expect
deleted file mode 100644
index a1585c3..0000000
--- a/pkg/front_end/testcases/ignore_function.dart.outline.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   operator ==(other) => false;
-//               ^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-import "dart:core" as core;
-
-class A extends core::Object implements core::Function {
-  synthetic constructor •() → self::A
-    ;
-  operator ==(dynamic other) → core::bool
-    ;
-}
-class B extends core::Object implements self::Function {
-  synthetic constructor •() → self::B
-    ;
-  operator ==(invalid-type other) → core::bool
-    ;
-}
-class Function extends core::Object {
-  synthetic constructor •() → self::Function
-    ;
-  operator ==(core::Object other) → core::bool
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/ignore_function.dart.strong.expect b/pkg/front_end/testcases/ignore_function.dart.strong.expect
deleted file mode 100644
index 5b8a8d2..0000000
--- a/pkg/front_end/testcases/ignore_function.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/ignore_function.dart:14:15: Error: Can't infer a type for 'other' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   operator ==(other) => false;
-//               ^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-import "dart:core" as core;
-
-class A extends core::Object implements core::Function {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-  operator ==(dynamic other) → core::bool
-    return false;
-}
-class B extends core::Object implements self::Function {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  operator ==(invalid-type other) → core::bool
-    return false;
-}
-class Function extends core::Object {
-  synthetic constructor •() → self::Function
-    : super core::Object::•()
-    ;
-  operator ==(core::Object other) → core::bool
-    return false;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect
deleted file mode 100644
index 725841d..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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 {
-  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → void {} in f;
-  core::print(x.runtimeType);
-  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → void {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect
deleted file mode 100644
index 725841d..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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 {
-  dynamic x = let final <T extends core::Object = dynamic>(T) → void f = <T extends core::Object = dynamic>(T t) → void {} in f;
-  core::print(x.runtimeType);
-  core::print(let final <T extends core::Object = dynamic>(T) → void g = <T extends core::Object = dynamic>(T t) → void {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
deleted file mode 100644
index 0be54a8..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
-  core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object = dynamic>(T) → core::Null g = <T extends core::Object = dynamic>(T t) → core::Null {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
deleted file mode 100644
index 0be54a8..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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) → core::Null x = let final <T extends core::Object = dynamic>(T) → core::Null f = <T extends core::Object = dynamic>(T t) → core::Null {} in f;
-  core::print(x.{core::Object::runtimeType});
-  core::print(let final <T extends core::Object = dynamic>(T) → core::Null g = <T extends core::Object = dynamic>(T t) → core::Null {} in g);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect
deleted file mode 100644
index 8469fb4..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 () → void f = () → void {} in f);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect
deleted file mode 100644
index 8469fb4..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 () → void f = () → void {} in f);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
deleted file mode 100644
index bb2aa3b..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 () → core::Null f = () → core::Null {} in f);
-}
diff --git a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
deleted file mode 100644
index bb2aa3b..0000000
--- a/pkg/front_end/testcases/illegal_named_function_expression_scope.dart.strong.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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 () → core::Null f = () → core::Null {} in f);
-}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.expect
deleted file mode 100644
index f090f06..0000000
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static const field dynamic constField = 87;
-  const constructor •(dynamic x) → self::C
-    : super core::Object::•()
-    ;
-}
-static const field dynamic constTopLevelField = 42;
-static method main() → dynamic {
-  new self::C::•(self::C::constField);
-  new self::C::•(self::constTopLevelField);
-}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.transformed.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.transformed.expect
deleted file mode 100644
index f090f06..0000000
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static const field dynamic constField = 87;
-  const constructor •(dynamic x) → self::C
-    : super core::Object::•()
-    ;
-}
-static const field dynamic constTopLevelField = 42;
-static method main() → dynamic {
-  new self::C::•(self::C::constField);
-  new self::C::•(self::constTopLevelField);
-}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect
deleted file mode 100644
index 8658511..0000000
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static const field dynamic constField = 87;
-  const constructor •(dynamic x) → self::C
-    ;
-}
-static const field dynamic constTopLevelField = 42;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.expect
deleted file mode 100644
index 2a08350..0000000
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static const field core::int constField = 87;
-  const constructor •(dynamic x) → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::int constTopLevelField = 42;
-static method main() → dynamic {
-  new self::C::•(self::C::constField);
-  new self::C::•(self::constTopLevelField);
-}
diff --git a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.transformed.expect
deleted file mode 100644
index 2a08350..0000000
--- a/pkg/front_end/testcases/implicit_const_with_static_fields.dart.strong.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static const field core::int constField = 87;
-  const constructor •(dynamic x) → self::C
-    : super core::Object::•()
-    ;
-}
-static const field core::int constTopLevelField = 42;
-static method main() → dynamic {
-  new self::C::•(self::C::constField);
-  new self::C::•(self::constTopLevelField);
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.legacy.expect b/pkg/front_end/testcases/implicit_new.dart.legacy.expect
deleted file mode 100644
index 2b438cf..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.legacy.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
-//   var y = prefix.Bar();
-//                  ^^^
-//
-// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: '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;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method f(dynamic x) → dynamic
-  return x;
-static method main() → dynamic {
-  dynamic x = new self::Foo::•();
-  x = new self::Foo::•();
-  dynamic 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());
-  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  dynamic i = new self::IndexTester::•();
-  i.[](new self::Foo::•());
-  i.[](new self::Foo::•());
-  i.[](new self::Bar::named());
-  i.[](new self::Bar::named());
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Bar::named(), null);
-  i.[]=(new self::Bar::named(), null);
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Bar::named().+(new self::Foo::•());
-  new self::Bar::named().+(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect
deleted file mode 100644
index 2b438cf..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/implicit_new.dart:18:18: Warning: Method not found: 'Bar'.
-//   var y = prefix.Bar();
-//                  ^^^
-//
-// pkg/front_end/testcases/implicit_new.dart:19:10: Warning: Method not found: '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;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bar, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method f(dynamic x) → dynamic
-  return x;
-static method main() → dynamic {
-  dynamic x = new self::Foo::•();
-  x = new self::Foo::•();
-  dynamic 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());
-  dynamic l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  l = <dynamic>[new self::Foo::•(), new self::Bar::named()];
-  dynamic m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  m = <dynamic, dynamic>{"foo": new self::Foo::•(), "bar": new self::Bar::named()};
-  dynamic i = new self::IndexTester::•();
-  i.[](new self::Foo::•());
-  i.[](new self::Foo::•());
-  i.[](new self::Bar::named());
-  i.[](new self::Bar::named());
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Foo::•(), null);
-  i.[]=(new self::Bar::named(), null);
-  i.[]=(new self::Bar::named(), null);
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Foo::•().+(new self::Bar::named());
-  new self::Bar::named().+(new self::Foo::•());
-  new self::Bar::named().+(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.outline.expect b/pkg/front_end/testcases/implicit_new.dart.outline.expect
deleted file mode 100644
index d976e78..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.outline.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-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
-    ;
-  operator +(dynamic other) → dynamic
-    ;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    ;
-  operator +(dynamic other) → dynamic
-    ;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    ;
-  operator [](dynamic _) → dynamic
-    ;
-  operator []=(dynamic _a, dynamic _b) → void
-    ;
-}
-static method testNSM() → dynamic
-  ;
-static method f(dynamic x) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.expect b/pkg/front_end/testcases/implicit_new.dart.strong.expect
deleted file mode 100644
index c1c5e91..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.strong.expect
+++ /dev/null
@@ -1,76 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
-//   var y = prefix.Bar();
-//                  ^^^
-//
-// pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: '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;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = invalid-expression "pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
-  var y = prefix.Bar();
-                 ^^^";
-  invalid-expression "pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: '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::•());
-  i.{self::IndexTester::[]}(new self::Foo::•());
-  i.{self::IndexTester::[]}(new self::Bar::named());
-  i.{self::IndexTester::[]}(new self::Bar::named());
-  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
-  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
-  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
-  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
-  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
-  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
-  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
-  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
deleted file mode 100644
index c1c5e91..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.strong.transformed.expect
+++ /dev/null
@@ -1,76 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
-//   var y = prefix.Bar();
-//                  ^^^
-//
-// pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: '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;
-}
-class Bar extends core::Object {
-  constructor named() → self::Bar
-    : super core::Object::•()
-    ;
-  operator +(dynamic other) → dynamic
-    return null;
-}
-class IndexTester extends core::Object {
-  synthetic constructor •() → self::IndexTester
-    : super core::Object::•()
-    ;
-  operator [](dynamic _) → dynamic
-    return null;
-  operator []=(dynamic _a, dynamic _b) → void {}
-}
-static method testNSM() → dynamic {
-  dynamic y = invalid-expression "pkg/front_end/testcases/implicit_new.dart:18:18: Error: Method not found: 'Bar'.
-  var y = prefix.Bar();
-                 ^^^";
-  invalid-expression "pkg/front_end/testcases/implicit_new.dart:19:10: Error: Method not found: '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::•());
-  i.{self::IndexTester::[]}(new self::Foo::•());
-  i.{self::IndexTester::[]}(new self::Bar::named());
-  i.{self::IndexTester::[]}(new self::Bar::named());
-  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
-  i.{self::IndexTester::[]=}(new self::Foo::•(), null);
-  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
-  i.{self::IndexTester::[]=}(new self::Bar::named(), null);
-  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
-  new self::Foo::•().{self::Foo::+}(new self::Bar::named());
-  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
-  new self::Bar::named().{self::Bar::+}(new self::Foo::•());
-}
diff --git a/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect b/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect
deleted file mode 100644
index 33f7ebc..0000000
--- a/pkg/front_end/testcases/implicit_new.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/implicit_new.dart:31:5: Context: Write to x@522
-  x = prefix.Foo();
-    ^
-pkg/front_end/testcases/implicit_new.dart:33:5: Context: Write to z@559
-  z = prefix.Bar.named();
-    ^
-pkg/front_end/testcases/implicit_new.dart:39:5: Context: Write to l@682
-  l = [prefix.Foo(), prefix.Bar.named()];
-    ^
-pkg/front_end/testcases/implicit_new.dart:41:5: Context: Write to m@756
-  m = {"foo": prefix.Foo(), "bar": prefix.Bar.named()};
-    ^
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect b/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect
deleted file mode 100644
index 15f5bfb..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.hierarchy.expect
+++ /dev/null
@@ -1,419 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ImplicitScopeTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    ImplicitScopeTest.alwaysTrue
-    Object._instanceOf
-    ImplicitScopeTest.testMain
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.legacy.expect b/pkg/front_end/testcases/implicit_scope_test.dart.legacy.expect
deleted file mode 100644
index 8f8e6ea..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.legacy.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-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.+(1).==(2);
-  }
-  static method testMain() → dynamic {
-    dynamic a = "foo";
-    dynamic b;
-    if(self::ImplicitScopeTest::alwaysTrue()) {
-      dynamic a = "bar";
-    }
-    else {
-      dynamic b = a;
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    while (!self::ImplicitScopeTest::alwaysTrue()) {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    for (core::int i = 0; i.<(10); i = i.+(1)) {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    do {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    while ("black".==("white"))
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-  }
-}
-static method main() → dynamic {
-  self::ImplicitScopeTest::testMain();
-}
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/implicit_scope_test.dart.legacy.transformed.expect
deleted file mode 100644
index 8f8e6ea..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-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.+(1).==(2);
-  }
-  static method testMain() → dynamic {
-    dynamic a = "foo";
-    dynamic b;
-    if(self::ImplicitScopeTest::alwaysTrue()) {
-      dynamic a = "bar";
-    }
-    else {
-      dynamic b = a;
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    while (!self::ImplicitScopeTest::alwaysTrue()) {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    for (core::int i = 0; i.<(10); i = i.+(1)) {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-    do {
-      dynamic a = "bar";
-      dynamic b = "baz";
-    }
-    while ("black".==("white"))
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-  }
-}
-static method main() → dynamic {
-  self::ImplicitScopeTest::testMain();
-}
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect b/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect
deleted file mode 100644
index 9257345..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.outline.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-class ImplicitScopeTest extends core::Object {
-  synthetic constructor •() → self::ImplicitScopeTest
-    ;
-  static method alwaysTrue() → core::bool
-    ;
-  static method testMain() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect b/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect
deleted file mode 100644
index bc625bc..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.strong.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-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::==}(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); i = i.{core::num::+}(1)) {
-      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::==}("white"))
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-  }
-}
-static method main() → dynamic {
-  self::ImplicitScopeTest::testMain();
-}
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_scope_test.dart.strong.transformed.expect
deleted file mode 100644
index bc625bc..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-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::==}(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); i = i.{core::num::+}(1)) {
-      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::==}("white"))
-    exp::Expect::equals("foo", a);
-    exp::Expect::equals(null, b);
-  }
-}
-static method main() → dynamic {
-  self::ImplicitScopeTest::testMain();
-}
diff --git a/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect b/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect
deleted file mode 100644
index cf8d11a..0000000
--- a/pkg/front_end/testcases/implicit_scope_test.dart.type_promotion.expect
+++ /dev/null
@@ -1,3 +0,0 @@
-pkg/front_end/testcases/implicit_scope_test.dart:28:30: Context: Write to i@736
-    for (int i = 0; i < 10; i++) var a = "bar", b = "baz";
-                             ^^
diff --git a/pkg/front_end/testcases/implicit_this.dart.legacy.expect b/pkg/front_end/testcases/implicit_this.dart.legacy.expect
deleted file mode 100644
index 44a14d4..0000000
--- a/pkg/front_end/testcases/implicit_this.dart.legacy.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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}();
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method testD() → dynamic {
-    this.{self::C::m}();
-  }
-}
-static method main() → dynamic {
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/implicit_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/implicit_this.dart.legacy.transformed.expect
deleted file mode 100644
index 44a14d4..0000000
--- a/pkg/front_end/testcases/implicit_this.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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}();
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method testD() → dynamic {
-    this.{self::C::m}();
-  }
-}
-static method main() → dynamic {
-  new self::C::•().testC();
-  new self::D::•().testD();
-}
diff --git a/pkg/front_end/testcases/implicit_this.dart.outline.expect b/pkg/front_end/testcases/implicit_this.dart.outline.expect
deleted file mode 100644
index a586749..0000000
--- a/pkg/front_end/testcases/implicit_this.dart.outline.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method m() → dynamic
-    ;
-  method testC() → dynamic
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  method testD() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/implicit_this.dart.strong.expect b/pkg/front_end/testcases/implicit_this.dart.strong.expect
deleted file mode 100644
index fca414d..0000000
--- a/pkg/front_end/testcases/implicit_this.dart.strong.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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}();
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method testD() → dynamic {
-    this.{self::C::m}();
-  }
-}
-static method main() → dynamic {
-  new self::C::•().{self::C::testC}();
-  new self::D::•().{self::D::testD}();
-}
diff --git a/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect b/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect
deleted file mode 100644
index fca414d..0000000
--- a/pkg/front_end/testcases/implicit_this.dart.strong.transformed.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-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}();
-  }
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method testD() → dynamic {
-    this.{self::C::m}();
-  }
-}
-static method main() → dynamic {
-  new self::C::•().{self::C::testC}();
-  new self::D::•().{self::D::testD}();
-}
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect
deleted file mode 100644
index 47ea45a..0000000
--- a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
-//   C.a(this);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
-//   C.a(this);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
-//   C.b(this.);
-//            ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
-//   C.c(this, p);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
-//   C.c(this, p);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
-//   C.d(this., p);
-//            ^
-//
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  constructor a() → self::C
-    : super core::Object::•()
-    ;
-  constructor b() → self::C
-    : super core::Object::•()
-    ;
-  constructor c() → self::C
-    : super core::Object::•()
-    ;
-  constructor d() → self::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect
deleted file mode 100644
index 47ea45a..0000000
--- a/pkg/front_end/testcases/incomplete_field_formal_parameter.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected '.' before this.
-//   C.a(this);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:6:11: Error: Expected an identifier, but got ')'.
-//   C.a(this);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:7:12: Error: Expected an identifier, but got ')'.
-//   C.b(this.);
-//            ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected '.' before this.
-//   C.c(this, p);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:8:11: Error: Expected an identifier, but got ','.
-//   C.c(this, p);
-//           ^
-//
-// pkg/front_end/testcases/incomplete_field_formal_parameter.dart:9:12: Error: Expected an identifier, but got ','.
-//   C.d(this., p);
-//            ^
-//
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  constructor a() → self::C
-    : super core::Object::•()
-    ;
-  constructor b() → self::C
-    : super core::Object::•()
-    ;
-  constructor c() → self::C
-    : super core::Object::•()
-    ;
-  constructor d() → self::C
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml
index 74d1d07..47752b2 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules.yaml
@@ -78,6 +78,9 @@
     modules:
       - example_0.1.0
     expectedLibraryCount: 3
+    neededDillLibraries:
+      # Needs 'b.dart' only!
+      - package:example/b.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
@@ -103,6 +106,8 @@
       - example_0.1.0
       - foo_1
     expectedLibraryCount: 4
+    neededDillLibraries:
+      - package:foo/foo.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
@@ -131,6 +136,8 @@
       - example_0.1.1
       - foo_2
     expectedLibraryCount: 5
+    neededDillLibraries:
+      - package:foo/foo.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml
index f2a10a8..201d9c0 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_2.yaml
@@ -43,6 +43,9 @@
       - foo
       - example_1
     expectedLibraryCount: 3
+    neededDillLibraries:
+      - package:foo/foo.dart
+      - package:example/a.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
@@ -62,6 +65,9 @@
       - foo
       - example_2
     expectedLibraryCount: 3
+    neededDillLibraries:
+      - package:foo/foo.dart
+      - package:example/a.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml
index c009ea1..a98a4f5 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_3.yaml
@@ -39,6 +39,8 @@
       package:foo/foo.dart:
         - Field foo
         - Field lalala_SimulateTransformer
+    neededDillLibraries:
+      - package:foo/foo.dart
   - entry: main.dart
     worldType: updated
     expectInitializeFromDill: false
@@ -54,6 +56,8 @@
     modules:
       - foo2
     expectedLibraryCount: 2
+    neededDillLibraries:
+      - package:foo/foo.dart
     expectedContent:
       org-dartlang-test:///main.dart:
         - Procedure main
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml
new file mode 100644
index 0000000..6869e85
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_4.yaml
@@ -0,0 +1,78 @@
+# 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 with a number of modules.
+# Try out "trickery" in the module dependencies to force needing more or less
+# dill libraries.
+
+type: newworld
+strong: true
+modules:
+  moduleB:
+    moduleB/b.dart: |
+      import 'package:moduleC/c.dart';
+      export 'package:moduleC/c.dart' show baz;
+
+      var mya2 = new A2();
+
+      class A2 extends A3 {
+        int bar = 42;
+      }
+    moduleB/.packages: |
+      moduleB:.
+      moduleC:../moduleC
+      moduleD:../moduleD
+  moduleC:
+    moduleC/c.dart: |
+      import 'package:moduleD/d.dart';
+
+      String baz = "42";
+      String baz2 = baz3;
+
+      class A3 {
+        int foo = 42;
+      }
+    moduleC/.packages: |
+      moduleC:.
+      moduleD:../moduleD
+  moduleD:
+    moduleD/d.dart: |
+      String baz3 = "baz3";
+    moduleD/.packages: |
+      moduleD:.
+worlds:
+  - entry: a.dart
+    fromComponent: true
+    sources:
+      a.dart: |
+        import "package:moduleB/b.dart";
+
+        String foo = baz;
+        var x = mya2.bar;
+      .packages: |
+        moduleB:moduleB
+        moduleC:moduleC
+        moduleD:moduleD
+    modules:
+      - moduleB
+      - moduleC
+      - moduleD
+    expectedLibraryCount: 4
+    neededDillLibraries:
+      # 'd.dart' not needed.
+      - package:moduleB/b.dart
+      - package:moduleC/c.dart
+    expectedContent:
+      org-dartlang-test:///a.dart:
+        - Field foo
+        - Field x
+      package:moduleB/b.dart:
+        - Class A2
+        - Field mya2
+      package:moduleC/c.dart:
+        - Class A3
+        - Field baz
+        - Field baz2
+      package:moduleD/d.dart:
+        - Field baz3
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml
new file mode 100644
index 0000000..449b319
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_5.yaml
@@ -0,0 +1,80 @@
+# 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 with a number of modules.
+# Try out "trickery" in the module dependencies to force needing more or less
+# dill libraries.
+
+type: newworld
+strong: true
+modules:
+  moduleB:
+    moduleB/b.dart: |
+      import 'package:moduleC/c.dart';
+
+      var bVar = 42;
+      var bVarFromC = baz2;
+      var mya2 = new A2();
+
+      class A2 extends A3 {
+        int bar = 42;
+      }
+    moduleB/.packages: |
+      moduleB:.
+      moduleC:../moduleC
+      moduleD:../moduleD
+  moduleC:
+    moduleC/c.dart: |
+      import 'package:moduleD/d.dart';
+
+      String baz = "42";
+      String baz2 = baz3;
+
+      class A3 {
+        int foo = 42;
+      }
+    moduleC/.packages: |
+      moduleC:.
+      moduleD:../moduleD
+  moduleD:
+    moduleD/d.dart: |
+      String baz3 = "baz3";
+    moduleD/.packages: |
+      moduleD:.
+worlds:
+  - entry: a.dart
+    fromComponent: true
+    sources:
+      a.dart: |
+        import "package:moduleB/b.dart";
+
+        var foo = bVar;
+        var foo2 = bVarFromC;
+      .packages: |
+        moduleB:moduleB
+        moduleC:moduleC
+        moduleD:moduleD
+    modules:
+      - moduleB
+      - moduleC
+      - moduleD
+    expectedLibraryCount: 4
+    neededDillLibraries:
+      # Only b.dart needed.
+      - package:moduleB/b.dart
+    expectedContent:
+      org-dartlang-test:///a.dart:
+        - Field foo
+        - Field foo2
+      package:moduleB/b.dart:
+        - Class A2
+        - Field bVar
+        - Field bVarFromC
+        - Field mya2
+      package:moduleC/c.dart:
+        - Class A3
+        - Field baz
+        - Field baz2
+      package:moduleD/d.dart:
+        - Field baz3
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml
new file mode 100644
index 0000000..89367ec
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_6.yaml
@@ -0,0 +1,86 @@
+# 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 with a number of modules.
+# Try out "trickery" in the module dependencies to force needing more or less
+# dill libraries.
+
+type: newworld
+strong: true
+modules:
+  moduleB:
+    moduleB/b.dart: |
+      import 'package:moduleC/c.dart';
+
+      var bVar = 42;
+      var bVarFromC = baz2;
+      var mya2 = new A2();
+
+      class A2 extends A3 {
+        int bar = 42;
+      }
+    moduleB/.packages: |
+      moduleB:.
+      moduleC:../moduleC
+      moduleD:../moduleD
+  moduleC:
+    moduleC/c.dart: |
+      import 'package:moduleD/d.dart';
+
+      String baz = "42";
+      String baz2 = baz3;
+
+      class A3 {
+        int foo = 42;
+      }
+    moduleC/.packages: |
+      moduleC:.
+      moduleD:../moduleD
+  moduleD:
+    moduleD/d.dart: |
+      String baz3 = "baz3";
+    moduleD/.packages: |
+      moduleD:.
+worlds:
+  - entry: a.dart
+    fromComponent: true
+    sources:
+      a.dart: |
+        import "package:moduleB/b.dart";
+
+        var foo = bVar;
+        var foo2 = bVarFromC;
+
+        class A1 extends A2 {
+          String fooMethod() => "42!";
+        }
+      .packages: |
+        moduleB:moduleB
+        moduleC:moduleC
+        moduleD:moduleD
+    modules:
+      - moduleB
+      - moduleC
+      - moduleD
+    expectedLibraryCount: 4
+    neededDillLibraries:
+      # A class in 'a.dart' has a super in 'c.dart'.
+      - package:moduleB/b.dart
+      - package:moduleC/c.dart
+    expectedContent:
+      org-dartlang-test:///a.dart:
+        - Field foo
+        - Field foo2
+        - Class A1
+      package:moduleB/b.dart:
+        - Class A2
+        - Field bVar
+        - Field bVarFromC
+        - Field mya2
+      package:moduleC/c.dart:
+        - Class A3
+        - Field baz
+        - Field baz2
+      package:moduleD/d.dart:
+        - Field baz3
\ No newline at end of file
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml
new file mode 100644
index 0000000..3ad421d
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_7.yaml
@@ -0,0 +1,123 @@
+# 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 with a number of modules.
+# Try out "trickery" in the module dependencies to force needing more or less
+# dill libraries.
+
+type: newworld
+strong: true
+modules:
+  module:
+    module/lib1.dart: |
+      import 'lib3.dart';
+
+      class Class1 {
+        Class3a get c3a {}
+      }
+    module/lib2.dart: |
+      import 'lib4.dart';
+
+      class Class2 {
+        void cl4() {
+          Class4 class4 = new Class4();
+          print(class4);
+        }
+      }
+    module/lib3.dart: |
+      class Class3a {
+        Class3b get c3b {}
+      }
+
+      class Class3b {
+        String str() {}
+      }
+    module/lib4.dart: |
+      class Class4 {}
+    module/.packages: |
+      module:.
+worlds:
+  - entry: compileme.dart
+    fromComponent: true
+    sources:
+      compileme.dart: |
+        import 'package:module/lib1.dart';
+        import 'package:module/lib2.dart';
+
+        main() {
+          Class2 class2 = new Class2();
+          print(class2);
+        }
+
+        class Foo {
+          Class1 class1() {
+            Class1 class1 = new Class1();
+            class1.c3a.c3b.str();
+            return class1;
+          }
+        }
+      .packages: |
+        module:module
+    modules:
+      - module
+    expectedLibraryCount: 5
+    neededDillLibraries:
+      - package:module/lib1.dart
+      - package:module/lib2.dart
+      - package:module/lib3.dart
+    expectedContent:
+      org-dartlang-test:///compileme.dart:
+        - Class Foo
+        - Procedure main
+      package:module/lib1.dart:
+        - Class Class1
+      package:module/lib2.dart:
+        - Class Class2
+      package:module/lib3.dart:
+        - Class Class3a
+        - Class Class3b
+      package:module/lib4.dart:
+        - Class Class4
+  - entry: compileme.dart
+    outlineOnly: true
+    skipOutlineBodyCheck: true
+    sources:
+      compileme.dart: |
+        import 'package:module/lib1.dart';
+        import 'package:module/lib2.dart';
+
+        main() {
+          Class2 class2 = new Class2();
+          print(class2);
+        }
+
+        class Foo {
+          Class1 class1() {
+            Class1 class1 = new Class1();
+            class1.c3a.c3b.str();
+            return class1;
+          }
+        }
+      .packages: |
+        module:module
+    modules:
+      - module
+    expectedLibraryCount: 5
+    neededDillLibraries:
+      # This is the outline version. It doesn't use lib3.dart.
+      - package:module/lib1.dart
+      - package:module/lib2.dart
+    expectedContent:
+      org-dartlang-test:///compileme.dart:
+        - Class Foo
+        - Procedure main
+      package:module/lib1.dart:
+        - Class Class1
+      package:module/lib2.dart:
+        - Class Class2
+      package:module/lib3.dart:
+        - Class Class3a
+        - Class Class3b
+      package:module/lib4.dart:
+        - Class Class4
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml
new file mode 100644
index 0000000..dbe8c91
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/changing_modules_8.yaml
@@ -0,0 +1,61 @@
+# 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 with a number of modules.
+# Try out "trickery" in the module dependencies to force needing more or less
+# dill libraries.
+
+type: newworld
+strong: true
+modules:
+  module:
+    module/lib1.dart: |
+      import 'lib2.dart';
+
+      abstract class XSet {
+        factory XSet.identity() = XLinkedHashSet.identity;
+      }
+    module/lib2.dart: |
+      import 'lib1.dart';
+      import 'lib3.dart';
+
+      class XLinkedHashSet implements XSet {
+        factory XLinkedHashSet.identity() = XIdentityHashSet;
+      }
+    module/lib3.dart: |
+      import 'lib2.dart';
+
+      class XIdentityHashSet implements XLinkedHashSet {
+        XIdentityHashSet();
+      }
+    module/.packages: |
+      module:.
+worlds:
+  - entry: compileme.dart
+    fromComponent: true
+    sources:
+      compileme.dart: |
+        import 'package:module/lib1.dart';
+
+        main() {
+          XSet history = new XSet.identity();
+        }
+      .packages: |
+        module:module
+    modules:
+      - module
+    expectedLibraryCount: 4
+    neededDillLibraries:
+      - package:module/lib1.dart
+      - package:module/lib2.dart
+      - package:module/lib3.dart
+    expectedContent:
+      org-dartlang-test:///compileme.dart:
+        - Procedure main
+      package:module/lib1.dart:
+        - Class XSet
+      package:module/lib2.dart:
+        - Class XLinkedHashSet
+      package:module/lib3.dart:
+        - Class XIdentityHashSet
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml
new file mode 100644
index 0000000..404e5a5
--- /dev/null
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/crash_test_1.yaml
@@ -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.
+
+# This have crashed at one point (assertion error).
+
+type: newworld
+strong: true
+worlds:
+  - entry: main.dart
+    sources:
+      main.dart: |
+        class C {
+          C();
+          factory C.e4() async = C;
+        }
+
+        void main() {
+          var c = new C.e4();
+        }
+    expectedLibraryCount: 1
+    errors: true
diff --git a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml
index e7182de..1282d0d 100644
--- a/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml
+++ b/pkg/front_end/testcases/incremental_initialize_from_dill/unused_file.yaml
@@ -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.md file.
 
-# Compile an application where we use an import, then recomile without changing
+# Compile an application where we use an import, then recompile without changing
 # the import but where we no longer use it.
 # The imported file is still included in the dill file we initialize from,
 # but shouldn't cause trouble, nor be included in the output.
diff --git a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect
index a9fa8e3..bc5a2ac 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.expect
@@ -18,18 +18,18 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::D::T* t) → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 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");
+  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/abstract_class_instantiation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.transformed.expect
index a9fa8e3..bc5a2ac 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.legacy.transformed.expect
@@ -18,18 +18,18 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::D::T* t) → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 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");
+  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/abstract_class_instantiation.dart.outline.expect b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
index fbf1880..c8cd67d 100644
--- a/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/abstract_class_instantiation.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::D::T t) → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::D::T* t) → self::D<self::D::T*>*
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/assert.dart b/pkg/front_end/testcases/inference/assert.dart
index 57e15ba..73df3a8 100644
--- a/pkg/front_end/testcases/inference/assert.dart
+++ b/pkg/front_end/testcases/inference/assert.dart
@@ -8,8 +8,8 @@
 T f<T>() => null;
 
 void test() {
-  assert(/*@typeArgs=bool*/ f());
-  assert(/*@typeArgs=bool*/ f(), /*@typeArgs=dynamic*/ f());
+  assert(/*@ typeArgs=bool* */ f());
+  assert(/*@ typeArgs=bool* */ f(), /*@ typeArgs=dynamic */ f());
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/assert.dart.legacy.expect b/pkg/front_end/testcases/inference/assert.dart.legacy.expect
index 53b9899..baa302e 100644
--- a/pkg/front_end/testcases/inference/assert.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect
index 53b9899..baa302e 100644
--- a/pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert.dart.outline.expect b/pkg/front_end/testcases/inference/assert.dart.outline.expect
index e8c03c5..dfd99e1 100644
--- a/pkg/front_end/testcases/inference/assert.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/assert.dart.strong.expect b/pkg/front_end/testcases/inference/assert.dart.strong.expect
index cfbd624..1122765 100644
--- a/pkg/front_end/testcases/inference/assert.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+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>());
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
index cfbd624..1122765 100644
--- a/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+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>());
+  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 b/pkg/front_end/testcases/inference/assert_initializer.dart
index 8f06330..aadfd0b 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart
@@ -8,14 +8,14 @@
 T f<T>() => null;
 
 class C {
-  C.expressionOnly() : assert(/*@typeArgs=bool*/ f());
+  C.expressionOnly() : assert(/*@ typeArgs=bool* */ f());
   C.expressionAndMessage()
-      : assert(/*@typeArgs=bool*/ f(), /*@typeArgs=dynamic*/ f());
+      : assert(/*@ typeArgs=bool* */ f(), /*@ typeArgs=dynamic */ f());
 }
 
 main() {
   // Test type inference of assert statements just to verify that the behavior
   // is the same.
-  assert(/*@typeArgs=bool*/ f());
-  assert(/*@typeArgs=bool*/ f(), /*@typeArgs=dynamic*/ f());
+  assert(/*@ typeArgs=bool* */ f());
+  assert(/*@ typeArgs=bool* */ f(), /*@ typeArgs=dynamic */ f());
 }
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect
index 94d8628..7d14743 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → self::C
+  constructor expressionOnly() → self::C*
     : assert(self::f<dynamic>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → self::C
+  constructor expressionAndMessage() → self::C*
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method main() → dynamic {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect
index 94d8628..7d14743 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → self::C
+  constructor expressionOnly() → self::C*
     : assert(self::f<dynamic>()), super core::Object::•()
     ;
-  constructor expressionAndMessage() → self::C
+  constructor expressionAndMessage() → self::C*
     : assert(self::f<dynamic>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method main() → dynamic {
   assert(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
index d89f3fb..77b5673 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → self::C
+  constructor expressionOnly() → self::C*
     ;
-  constructor expressionAndMessage() → self::C
+  constructor expressionAndMessage() → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
index be425b0..b50ee9e 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → self::C
-    : assert(self::f<core::bool>()), super 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::•()
+  constructor expressionAndMessage() → self::C*
+    : assert(self::f<core::bool*>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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>());
+  assert(self::f<core::bool*>());
+  assert(self::f<core::bool*>(), self::f<dynamic>());
 }
diff --git a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
index be425b0..b50ee9e 100644
--- a/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assert_initializer.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor expressionOnly() → self::C
-    : assert(self::f<core::bool>()), super 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::•()
+  constructor expressionAndMessage() → self::C*
+    : assert(self::f<core::bool*>(), self::f<dynamic>()), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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>());
+  assert(self::f<core::bool*>());
+  assert(self::f<core::bool*>(), self::f<dynamic>());
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart b/pkg/front_end/testcases/inference/assign_local.dart
index 53ef197..2b2b9cb 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart
+++ b/pkg/front_end/testcases/inference/assign_local.dart
@@ -11,10 +11,10 @@
 
 main() {
   num x;
-  var /*@type=int*/ x1 = (x = 1);
-  var /*@type=double*/ x2 = (x = 1.0);
+  var /*@ type=int* */ x1 = (x = 1);
+  var /*@ type=double* */ x2 = (x = 1.0);
 
   A<int> y;
-  var /*@type=A<int>*/ y1 = (y = new /*@typeArgs=int*/ A());
-  var /*@type=B<int>*/ y2 = (y = new /*@typeArgs=int*/ B());
+  var /*@ type=A<int*>* */ y1 = (y = new /*@ typeArgs=int* */ A());
+  var /*@ type=B<int*>* */ y2 = (y = new /*@ typeArgs=int* */ B());
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.legacy.expect b/pkg/front_end/testcases/inference/assign_local.dart.legacy.expect
index e6d03ee..51f001d 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.legacy.expect
@@ -2,21 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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::num* x;
   dynamic x1 = x = 1;
   dynamic x2 = x = 1.0;
-  self::A<core::int> y;
+  self::A<core::int*>* y;
   dynamic y1 = y = new self::A::•<dynamic>();
   dynamic y2 = y = new self::B::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect
index e6d03ee..51f001d 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.legacy.transformed.expect
@@ -2,21 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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::num* x;
   dynamic x1 = x = 1;
   dynamic x2 = x = 1.0;
-  self::A<core::int> y;
+  self::A<core::int*>* y;
   dynamic y1 = y = new self::A::•<dynamic>();
   dynamic y2 = y = new self::B::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.outline.expect b/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
index af03c8b..8b71a507 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.outline.expect
@@ -2,12 +2,12 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/assign_local.dart.strong.expect b/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
index fa3c621..b7eecf7 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.strong.expect
@@ -2,21 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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>();
+  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/assign_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
index fa3c621..b7eecf7 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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>();
+  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/assign_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
index f49cffea..68100f1 100644
--- a/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/assign_local.dart.type_promotion.expect
@@ -1,12 +1,12 @@
-pkg/front_end/testcases/inference/assign_local.dart:14:29: Context: Write to x@320
-  var /*@type=int*/ x1 = (x = 1);
-                            ^
-pkg/front_end/testcases/inference/assign_local.dart:15:32: Context: Write to x@320
-  var /*@type=double*/ x2 = (x = 1.0);
+pkg/front_end/testcases/inference/assign_local.dart:14:32: Context: Write to x@320
+  var /*@ type=int* */ x1 = (x = 1);
                                ^
-pkg/front_end/testcases/inference/assign_local.dart:18:32: Context: Write to y@406
-  var /*@type=A<int>*/ y1 = (y = new /*@typeArgs=int*/ A());
-                               ^
-pkg/front_end/testcases/inference/assign_local.dart:19:32: Context: Write to y@406
-  var /*@type=B<int>*/ y2 = (y = new /*@typeArgs=int*/ B());
-                               ^
+pkg/front_end/testcases/inference/assign_local.dart:15:35: Context: Write to x@320
+  var /*@ type=double* */ x2 = (x = 1.0);
+                                  ^
+pkg/front_end/testcases/inference/assign_local.dart:18:36: Context: Write to y@412
+  var /*@ type=A<int*>* */ y1 = (y = new /*@ typeArgs=int* */ A());
+                                   ^
+pkg/front_end/testcases/inference/assign_local.dart:19:36: Context: Write to y@412
+  var /*@ type=B<int*>* */ y2 = (y = new /*@ typeArgs=int* */ B());
+                                   ^
diff --git a/pkg/front_end/testcases/inference/async_await.dart b/pkg/front_end/testcases/inference/async_await.dart
index 4ebadb0..3b582a4 100644
--- a/pkg/front_end/testcases/inference/async_await.dart
+++ b/pkg/front_end/testcases/inference/async_await.dart
@@ -21,27 +21,27 @@
   FutureOr<MyFuture> x8;
   MyFuture x9;
 
-  /*@returnType=Future<int>*/ test0() async => x0;
-  /*@returnType=Future<int>*/ test1() async => x1;
-  /*@returnType=Future<Future<int>>*/ test2() async => x2;
-  /*@returnType=Future<FutureOr<int>>*/ test3() async => x3;
-  /*@returnType=Future<MyFuture>*/ test4() async => x4;
-  /*@returnType=Future<int>*/ test5() async => x5;
-  /*@returnType=Future<Future<int>>*/ test6() async => x6;
-  /*@returnType=Future<FutureOr<int>>*/ test7() async => x7;
-  /*@returnType=Future<MyFuture>*/ test8() async => x8;
-  /*@returnType=Future<int>*/ test9() async => x9;
+  /*@ returnType=Future<int*>* */ test0() async => x0;
+  /*@ returnType=Future<int*>* */ test1() async => x1;
+  /*@ returnType=Future<Future<int*>*>* */ test2() async => x2;
+  /*@ returnType=Future<FutureOr<int*>*>* */ test3() async => x3;
+  /*@ returnType=Future<MyFuture*>* */ test4() async => x4;
+  /*@ returnType=Future<int*>* */ test5() async => x5;
+  /*@ returnType=Future<Future<int*>*>* */ test6() async => x6;
+  /*@ returnType=Future<FutureOr<int*>*>* */ test7() async => x7;
+  /*@ returnType=Future<MyFuture*>* */ test8() async => x8;
+  /*@ returnType=Future<int*>* */ test9() async => x9;
 
-  var /*@type=int*/ y0 = await x0;
-  var /*@type=int*/ y1 = await x1;
-  var /*@type=Future<int>*/ y2 = await x2;
-  var /*@type=FutureOr<int>*/ y3 = await x3;
-  var /*@type=MyFuture*/ y4 = await x4;
-  var /*@type=int*/ y5 = await x5;
-  var /*@type=Future<int>*/ y6 = await x6;
-  var /*@type=FutureOr<int>*/ y7 = await x7;
-  var /*@type=MyFuture*/ y8 = await x8;
-  var /*@type=int*/ y9 = await x9;
+  var /*@ type=int* */ y0 = await x0;
+  var /*@ type=int* */ y1 = await x1;
+  var /*@ type=Future<int*>* */ y2 = await x2;
+  var /*@ type=FutureOr<int*>* */ y3 = await x3;
+  var /*@ type=MyFuture* */ y4 = await x4;
+  var /*@ type=int* */ y5 = await x5;
+  var /*@ type=Future<int*>* */ y6 = await x6;
+  var /*@ type=FutureOr<int*>* */ y7 = await x7;
+  var /*@ type=MyFuture* */ y8 = await x8;
+  var /*@ type=int* */ y9 = await x9;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.legacy.expect b/pkg/front_end/testcases/inference/async_await.dart.legacy.expect
index 6d20979..30b6cfb 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.legacy.expect
@@ -5,22 +5,22 @@
 
 import "dart:async";
 
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
     : super core::Object::•()
     ;
 }
 static method test() → void async {
-  core::int x0;
-  asy::Future<core::int> x1;
-  asy::Future<asy::Future<core::int>> x2;
-  asy::Future<asy::FutureOr<core::int>> x3;
-  asy::Future<self::MyFuture> x4;
-  asy::FutureOr<core::int> x5;
-  asy::FutureOr<asy::Future<core::int>> x6;
-  asy::FutureOr<asy::FutureOr<core::int>> x7;
-  asy::FutureOr<self::MyFuture> x8;
-  self::MyFuture x9;
+  core::int* x0;
+  asy::Future<core::int*>* x1;
+  asy::Future<asy::Future<core::int*>*>* x2;
+  asy::Future<asy::FutureOr<core::int*>*>* x3;
+  asy::Future<self::MyFuture*>* x4;
+  asy::FutureOr<core::int*>* x5;
+  asy::FutureOr<asy::Future<core::int*>*>* x6;
+  asy::FutureOr<asy::FutureOr<core::int*>*>* x7;
+  asy::FutureOr<self::MyFuture*>* x8;
+  self::MyFuture* x9;
   function test0() → dynamic async 
     return x0;
   function test1() → dynamic async 
diff --git a/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect
index 22a8d1b..26a880a 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.legacy.transformed.expect
@@ -5,14 +5,14 @@
 
 import "dart:async";
 
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
     : super core::Object::•()
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -23,19 +23,19 @@
     try {
       #L1:
       {
-        core::int x0;
-        asy::Future<core::int> x1;
-        asy::Future<asy::Future<core::int>> x2;
-        asy::Future<asy::FutureOr<core::int>> x3;
-        asy::Future<self::MyFuture> x4;
-        asy::FutureOr<core::int> x5;
-        asy::FutureOr<asy::Future<core::int>> x6;
-        asy::FutureOr<asy::FutureOr<core::int>> x7;
-        asy::FutureOr<self::MyFuture> x8;
-        self::MyFuture x9;
+        core::int* x0;
+        asy::Future<core::int*>* x1;
+        asy::Future<asy::Future<core::int*>*>* x2;
+        asy::Future<asy::FutureOr<core::int*>*>* x3;
+        asy::Future<self::MyFuture*>* x4;
+        asy::FutureOr<core::int*>* x5;
+        asy::FutureOr<asy::Future<core::int*>*>* x6;
+        asy::FutureOr<asy::FutureOr<core::int*>*>* x7;
+        asy::FutureOr<self::MyFuture*>* x8;
+        self::MyFuture* x9;
         function test0() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -61,8 +61,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test1() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -88,8 +88,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test2() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -115,8 +115,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test3() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -142,8 +142,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test4() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -169,8 +169,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test5() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -196,8 +196,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test6() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -223,8 +223,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test7() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -250,8 +250,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test8() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -277,8 +277,8 @@
           return :async_completer.{asy::Completer::future};
         }
         function test9() → dynamic /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_await.dart.outline.expect b/pkg/front_end/testcases/inference/async_await.dart.outline.expect
index 5d3783f..acd5eb1 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.outline.expect
@@ -5,8 +5,8 @@
 
 import "dart:async";
 
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.expect
index 7efb511..7925362 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.expect
@@ -5,51 +5,51 @@
 
 import "dart:async";
 
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
     : super core::Object::•()
     ;
 }
 static method test() → void async {
-  core::int x0;
-  asy::Future<core::int> x1;
-  asy::Future<asy::Future<core::int>> x2;
-  asy::Future<asy::FutureOr<core::int>> x3;
-  asy::Future<self::MyFuture> x4;
-  asy::FutureOr<core::int> x5;
-  asy::FutureOr<asy::Future<core::int>> x6;
-  asy::FutureOr<asy::FutureOr<core::int>> x7;
-  asy::FutureOr<self::MyFuture> x8;
-  self::MyFuture x9;
-  function test0() → asy::Future<core::int> async 
+  core::int* x0;
+  asy::Future<core::int*>* x1;
+  asy::Future<asy::Future<core::int*>*>* x2;
+  asy::Future<asy::FutureOr<core::int*>*>* x3;
+  asy::Future<self::MyFuture*>* x4;
+  asy::FutureOr<core::int*>* x5;
+  asy::FutureOr<asy::Future<core::int*>*>* x6;
+  asy::FutureOr<asy::FutureOr<core::int*>*>* x7;
+  asy::FutureOr<self::MyFuture*>* x8;
+  self::MyFuture* x9;
+  function test0() → asy::Future<core::int*>* async 
     return x0;
-  function test1() → asy::Future<core::int> async 
+  function test1() → asy::Future<core::int*>* async 
     return x1;
-  function test2() → asy::Future<asy::Future<core::int>> async 
+  function test2() → asy::Future<asy::Future<core::int*>*>* async 
     return x2;
-  function test3() → asy::Future<asy::FutureOr<core::int>> async 
+  function test3() → asy::Future<asy::FutureOr<core::int*>*>* async 
     return x3;
-  function test4() → asy::Future<self::MyFuture> async 
+  function test4() → asy::Future<self::MyFuture*>* async 
     return x4;
-  function test5() → asy::Future<core::int> async 
+  function test5() → asy::Future<core::int*>* async 
     return x5;
-  function test6() → asy::Future<asy::Future<core::int>> async 
+  function test6() → asy::Future<asy::Future<core::int*>*>* async 
     return x6;
-  function test7() → asy::Future<asy::FutureOr<core::int>> async 
+  function test7() → asy::Future<asy::FutureOr<core::int*>*>* async 
     return x7;
-  function test8() → asy::Future<self::MyFuture> async 
+  function test8() → asy::Future<self::MyFuture*>* async 
     return x8;
-  function test9() → asy::Future<core::int> async 
+  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;
-  asy::FutureOr<core::int> y3 = await x3;
-  self::MyFuture y4 = await x4;
-  core::int y5 = await x5;
-  asy::Future<core::int> y6 = await x6;
-  asy::FutureOr<core::int> y7 = await x7;
-  self::MyFuture y8 = await x8;
-  core::int y9 = await x9;
+  core::int* y0 = await x0;
+  core::int* y1 = await x1;
+  asy::Future<core::int*>* y2 = await x2;
+  asy::FutureOr<core::int*>* y3 = await x3;
+  self::MyFuture* y4 = await x4;
+  core::int* y5 = await x5;
+  asy::Future<core::int*>* y6 = await x6;
+  asy::FutureOr<core::int*>* y7 = await x7;
+  self::MyFuture* y8 = await x8;
+  core::int* y9 = await x9;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
index 2da1ed0..07361ac 100644
--- a/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_await.dart.strong.transformed.expect
@@ -5,14 +5,14 @@
 
 import "dart:async";
 
-abstract class MyFuture extends core::Object implements asy::Future<core::int> {
-  synthetic constructor •() → self::MyFuture
+abstract class MyFuture extends core::Object implements asy::Future<core::int*> {
+  synthetic constructor •() → self::MyFuture*
     : super core::Object::•()
     ;
 }
 static method test() → void /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -23,19 +23,19 @@
     try {
       #L1:
       {
-        core::int x0;
-        asy::Future<core::int> x1;
-        asy::Future<asy::Future<core::int>> x2;
-        asy::Future<asy::FutureOr<core::int>> x3;
-        asy::Future<self::MyFuture> x4;
-        asy::FutureOr<core::int> x5;
-        asy::FutureOr<asy::Future<core::int>> x6;
-        asy::FutureOr<asy::FutureOr<core::int>> x7;
-        asy::FutureOr<self::MyFuture> x8;
-        self::MyFuture x9;
-        function test0() → asy::Future<core::int> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-          asy::FutureOr<core::int> :return_value;
+        core::int* x0;
+        asy::Future<core::int*>* x1;
+        asy::Future<asy::Future<core::int*>*>* x2;
+        asy::Future<asy::FutureOr<core::int*>*>* x3;
+        asy::Future<self::MyFuture*>* x4;
+        asy::FutureOr<core::int*>* x5;
+        asy::FutureOr<asy::Future<core::int*>*>* x6;
+        asy::FutureOr<asy::FutureOr<core::int*>*>* x7;
+        asy::FutureOr<self::MyFuture*>* x8;
+        self::MyFuture* x9;
+        function test0() → asy::Future<core::int*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          asy::FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -60,9 +60,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test1() → asy::Future<core::int> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-          asy::FutureOr<core::int> :return_value;
+        function test1() → asy::Future<core::int*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          asy::FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -87,9 +87,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test2() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::Future<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int>>();
-          asy::FutureOr<asy::Future<core::int>> :return_value;
+        function test2() → asy::Future<asy::Future<core::int*>*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<asy::Future<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int*>*>();
+          asy::FutureOr<asy::Future<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -114,9 +114,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test3() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int>>();
-          asy::FutureOr<asy::FutureOr<core::int>> :return_value;
+        function test3() → asy::Future<asy::FutureOr<core::int*>*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int*>*>();
+          asy::FutureOr<asy::FutureOr<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -141,9 +141,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test4() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<self::MyFuture> :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture>();
-          asy::FutureOr<self::MyFuture> :return_value;
+        function test4() → asy::Future<self::MyFuture*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<self::MyFuture*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture*>();
+          asy::FutureOr<self::MyFuture*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -168,9 +168,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test5() → asy::Future<core::int> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-          asy::FutureOr<core::int> :return_value;
+        function test5() → asy::Future<core::int*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          asy::FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -195,9 +195,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test6() → asy::Future<asy::Future<core::int>> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::Future<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int>>();
-          asy::FutureOr<asy::Future<core::int>> :return_value;
+        function test6() → asy::Future<asy::Future<core::int*>*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<asy::Future<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::Future<core::int*>*>();
+          asy::FutureOr<asy::Future<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -222,9 +222,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test7() → asy::Future<asy::FutureOr<core::int>> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int>>();
-          asy::FutureOr<asy::FutureOr<core::int>> :return_value;
+        function test7() → asy::Future<asy::FutureOr<core::int*>*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<asy::FutureOr<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<asy::FutureOr<core::int*>*>();
+          asy::FutureOr<asy::FutureOr<core::int*>*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -249,9 +249,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test8() → asy::Future<self::MyFuture> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<self::MyFuture> :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture>();
-          asy::FutureOr<self::MyFuture> :return_value;
+        function test8() → asy::Future<self::MyFuture*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<self::MyFuture*>* :async_completer = new asy::_AsyncAwaitCompleter::•<self::MyFuture*>();
+          asy::FutureOr<self::MyFuture*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -276,9 +276,9 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         }
-        function test9() → asy::Future<core::int> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-          asy::FutureOr<core::int> :return_value;
+        function test9() → asy::Future<core::int*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+          asy::FutureOr<core::int*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -304,25 +304,25 @@
           return :async_completer.{asy::Completer::future};
         }
         [yield] let dynamic #t1 = asy::_awaitHelper(x0, :async_op_then, :async_op_error, :async_op) in null;
-        core::int y0 = :result;
+        core::int* y0 = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(x1, :async_op_then, :async_op_error, :async_op) in null;
-        core::int y1 = :result;
+        core::int* y1 = :result;
         [yield] let dynamic #t3 = asy::_awaitHelper(x2, :async_op_then, :async_op_error, :async_op) in null;
-        asy::Future<core::int> y2 = :result;
+        asy::Future<core::int*>* y2 = :result;
         [yield] let dynamic #t4 = asy::_awaitHelper(x3, :async_op_then, :async_op_error, :async_op) in null;
-        asy::FutureOr<core::int> y3 = :result;
+        asy::FutureOr<core::int*>* y3 = :result;
         [yield] let dynamic #t5 = asy::_awaitHelper(x4, :async_op_then, :async_op_error, :async_op) in null;
-        self::MyFuture y4 = :result;
+        self::MyFuture* y4 = :result;
         [yield] let dynamic #t6 = asy::_awaitHelper(x5, :async_op_then, :async_op_error, :async_op) in null;
-        core::int y5 = :result;
+        core::int* y5 = :result;
         [yield] let dynamic #t7 = asy::_awaitHelper(x6, :async_op_then, :async_op_error, :async_op) in null;
-        asy::Future<core::int> y6 = :result;
+        asy::Future<core::int*>* y6 = :result;
         [yield] let dynamic #t8 = asy::_awaitHelper(x7, :async_op_then, :async_op_error, :async_op) in null;
-        asy::FutureOr<core::int> y7 = :result;
+        asy::FutureOr<core::int*>* y7 = :result;
         [yield] let dynamic #t9 = asy::_awaitHelper(x8, :async_op_then, :async_op_error, :async_op) in null;
-        self::MyFuture y8 = :result;
+        self::MyFuture* y8 = :result;
         [yield] let dynamic #t10 = asy::_awaitHelper(x9, :async_op_then, :async_op_error, :async_op) in null;
-        core::int y9 = :result;
+        core::int* y9 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart
index 2f2fe1b..fd4b944 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart
@@ -8,8 +8,8 @@
 import 'dart:async';
 
 Future<int> futureInt = null;
-var f = /*@returnType=Future<int>*/ () => futureInt;
-var g = /*@returnType=Future<int>*/ () async => futureInt;
+var f = /*@ returnType=Future<int*>* */ () => futureInt;
+var g = /*@ returnType=Future<int*>* */ () async => futureInt;
 
 main() {
   f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect
index 90a4155..64db200 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static field asy::Future<core::int> futureInt = null;
+static field asy::Future<core::int*>* futureInt = null;
 static field dynamic f = () → dynamic => self::futureInt;
-static field dynamic g = () → asy::Future<dynamic> async => self::futureInt;
+static field dynamic g = () → asy::Future<dynamic>* async => self::futureInt;
 static method main() → dynamic {
   self::f;
   self::g;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect
index 87a2f0b..d21aa14 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.legacy.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:async";
 
-static field asy::Future<core::int> futureInt = null;
+static field asy::Future<core::int*>* futureInt = null;
 static field dynamic f = () → dynamic => self::futureInt;
-static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static field dynamic g = () → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.expect
index 7f0e444..7974c45 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.expect
@@ -5,9 +5,9 @@
 
 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 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_flatten.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
index 7f13592..2345aff 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_flatten.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 
 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> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+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*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart
index 0abd1b3..e496461 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var f = /*@returnType=Future<int>*/ () async => 0;
+var f = /*@ returnType=Future<int*>* */ () async => 0;
 
 main() {
   f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect
index 6f5edc8..119587c 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:async" as asy;
 
-static field dynamic f = () → asy::Future<dynamic> async => 0;
+static field dynamic f = () → asy::Future<dynamic>* async => 0;
 static method main() → dynamic {
   self::f;
 }
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect
index 3f444b6..4dc3764 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:async" as asy;
 
-static field dynamic f = () → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static field dynamic f = () → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.expect
index 6ee9497..6e90053 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:async" as asy;
 import "dart:core" as core;
 
-static field () → asy::Future<core::int> f = () → asy::Future<core::int> async => 0;
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
index fb23adf..63abde7 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:async" as asy;
 import "dart:core" as core;
 
-static field () → asy::Future<core::int> f = () → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static field () →* asy::Future<core::int*>* f = () → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart
index 086bedf..b88b060 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart
@@ -8,8 +8,8 @@
 import 'dart:async';
 
 FutureOr<int> futureOrInt = null;
-var f = /*@returnType=FutureOr<int>*/ () => futureOrInt;
-var g = /*@returnType=Future<int>*/ () async => futureOrInt;
+var f = /*@ returnType=FutureOr<int*>* */ () => futureOrInt;
+var g = /*@ returnType=Future<int*>* */ () async => futureOrInt;
 
 main() {
   f;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect
index ff10a71..618cc9b 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static field asy::FutureOr<core::int> futureOrInt = null;
+static field asy::FutureOr<core::int*>* futureOrInt = null;
 static field dynamic f = () → dynamic => self::futureOrInt;
-static field dynamic g = () → asy::Future<dynamic> async => self::futureOrInt;
+static field dynamic g = () → asy::Future<dynamic>* async => self::futureOrInt;
 static method main() → dynamic {
   self::f;
   self::g;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect
index 8b46926..a05afae 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.legacy.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:async";
 
-static field asy::FutureOr<core::int> futureOrInt = null;
+static field asy::FutureOr<core::int*>* futureOrInt = null;
 static field dynamic f = () → dynamic => self::futureOrInt;
-static field dynamic g = () → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static field dynamic g = () → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.expect
index bceae13..dfb8367 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static field asy::FutureOr<core::int> futureOrInt = null;
-static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
-static field () → asy::Future<core::int> g = () → asy::Future<core::int> async => self::futureOrInt;
+static field asy::FutureOr<core::int*>* futureOrInt = null;
+static field () →* asy::FutureOr<core::int*>* f = () → asy::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/async_closure_return_type_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
index 25456f3..18510a2 100644
--- a/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/async_closure_return_type_future_or.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:async";
 
-static field asy::FutureOr<core::int> futureOrInt = null;
-static field () → asy::FutureOr<core::int> f = () → asy::FutureOr<core::int> => self::futureOrInt;
-static field () → asy::Future<core::int> g = () → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static field asy::FutureOr<core::int*>* futureOrInt = null;
+static field () →* asy::FutureOr<core::int*>* f = () → asy::FutureOr<core::int*>* => self::futureOrInt;
+static field () →* asy::Future<core::int*>* g = () → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart
index 27ffefe..1aad6da0 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart
@@ -9,7 +9,7 @@
 import 'dart:math' show Random;
 
 test() {
-  var /*@type=() -> Future<num>*/ f = /*@returnType=Future<num>*/ () async {
+  var /*@ type=() ->* Future<num*>* */ f = /*@ returnType=Future<num*>* */ () async {
     if (new Random(). /*@target=dart.math::Random::nextBool*/ nextBool()) {
       return new Future<int>.value(1);
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect
index 227f268..bfc49a0 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.expect
@@ -8,15 +8,15 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> async {
+  dynamic f = () → asy::Future<dynamic>* async {
     if(math::Random::•().nextBool()) {
-      return asy::Future::value<core::int>(1);
+      return asy::Future::value<core::int*>(1);
     }
     else {
-      return asy::Future::value<core::double>(2.0);
+      return asy::Future::value<core::double*>(2.0);
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect
index 355fa11..e8f21fa 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.legacy.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  dynamic f = () → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -21,11 +21,11 @@
         #L1:
         {
           if(math::Random::•().nextBool()) {
-            :return_value = asy::Future::value<core::int>(1);
+            :return_value = asy::Future::value<core::int*>(1);
             break #L1;
           }
           else {
-            :return_value = asy::Future::value<core::double>(2.0);
+            :return_value = asy::Future::value<core::double*>(2.0);
             break #L1;
           }
         }
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.expect
index 87021eb..3145b1c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.expect
@@ -8,15 +8,15 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> async {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
     if(math::Random::•().{math::Random::nextBool}()) {
-      return asy::Future::value<core::int>(1);
+      return asy::Future::value<core::int*>(1);
     }
     else {
-      return asy::Future::value<core::double>(2.0);
+      return asy::Future::value<core::double*>(2.0);
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() 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_futures.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
index 3f27c99..0ee4ee6 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_futures.dart.strong.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
-    asy::FutureOr<core::num> :return_value;
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    asy::FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -21,11 +21,11 @@
         #L1:
         {
           if(math::Random::•().{math::Random::nextBool}()) {
-            :return_value = asy::Future::value<core::int>(1);
+            :return_value = asy::Future::value<core::int*>(1);
             break #L1;
           }
           else {
-            :return_value = asy::Future::value<core::double>(2.0);
+            :return_value = asy::Future::value<core::double*>(2.0);
             break #L1;
           }
         }
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() 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 b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart
index c5e45ec..3eeabdd 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart
@@ -9,7 +9,7 @@
 import 'dart:math' show Random;
 
 test() {
-  var /*@type=() -> Future<num>*/ f = /*@returnType=Future<num>*/ () async {
+  var /*@ type=() ->* Future<num*>* */ f = /*@ returnType=Future<num*>* */ () async {
     if (new Random(). /*@target=dart.math::Random::nextBool*/ nextBool()) {
       return 1;
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect
index 18357b5..4e4ca26 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.expect
@@ -8,7 +8,7 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> async {
+  dynamic f = () → asy::Future<dynamic>* async {
     if(math::Random::•().nextBool()) {
       return 1;
     }
@@ -16,7 +16,7 @@
       return 2.0;
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect
index 658637a..a99deb5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.legacy.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  dynamic f = () → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.expect
index ec4bf15..4e5afa1 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.expect
@@ -8,7 +8,7 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> async {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
     if(math::Random::•().{math::Random::nextBool}()) {
       return 1;
     }
@@ -16,7 +16,7 @@
       return 2.0;
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() 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.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
index c8353ca..4c207d0 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_all_returns_are_values.dart.strong.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
-    asy::FutureOr<core::num> :return_value;
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    asy::FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() 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 b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart
index 6450e3f..a438f6b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart
@@ -9,7 +9,7 @@
 import 'dart:math' show Random;
 
 test() {
-  var /*@type=() -> Future<num>*/ f = /*@returnType=Future<num>*/ () async {
+  var /*@ type=() ->* Future<num*>* */ f = /*@ returnType=Future<num*>* */ () async {
     if (new Random(). /*@target=dart.math::Random::nextBool*/ nextBool()) {
       return new Future<int>.value(1);
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect
index 8c5aa92..90f6b9b 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.expect
@@ -8,15 +8,15 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> async {
+  dynamic f = () → asy::Future<dynamic>* async {
     if(math::Random::•().nextBool()) {
-      return asy::Future::value<core::int>(1);
+      return asy::Future::value<core::int*>(1);
     }
     else {
       return 2.0;
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect
index 29946ed..164cd19 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.legacy.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  dynamic f = () → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -21,7 +21,7 @@
         #L1:
         {
           if(math::Random::•().nextBool()) {
-            :return_value = asy::Future::value<core::int>(1);
+            :return_value = asy::Future::value<core::int*>(1);
             break #L1;
           }
           else {
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call();
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.expect
index a97c985..a42adca 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.expect
@@ -8,15 +8,15 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> async {
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* async {
     if(math::Random::•().{math::Random::nextBool}()) {
-      return asy::Future::value<core::int>(1);
+      return asy::Future::value<core::int*>(1);
     }
     else {
       return 2.0;
     }
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() 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.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
index d8b9241..456e45d 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_mix_of_values_and_futures.dart.strong.transformed.expect
@@ -8,9 +8,9 @@
 import "dart:math";
 
 static method test() → dynamic {
-  () → asy::Future<core::num> f = () → asy::Future<core::num> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::num> :async_completer = new asy::_AsyncAwaitCompleter::•<core::num>();
-    asy::FutureOr<core::num> :return_value;
+  () →* asy::Future<core::num*>* f = () → asy::Future<core::num*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::num*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::num*>();
+    asy::FutureOr<core::num*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -21,7 +21,7 @@
         #L1:
         {
           if(math::Random::•().{math::Random::nextBool}()) {
-            :return_value = asy::Future::value<core::int>(1);
+            :return_value = asy::Future::value<core::int*>(1);
             break #L1;
           }
           else {
@@ -41,7 +41,7 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   };
-  asy::Future<core::num> g = f.call();
-  asy::Future<core::int> h = f.call() as{TypeError} asy::Future<core::int>;
+  asy::Future<core::num*>* g = f.call();
+  asy::Future<core::int*>* h = f.call() as{TypeError} asy::Future<core::int*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart
index 85448db..88d4ac6 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 test() {
-  var /*@type=() -> Stream<num>*/ f = /*@returnType=Stream<num>*/ () async* {
+  var /*@ type=() ->* Stream<num*>* */ f = /*@ returnType=Stream<num*>* */ () async* {
     yield 1;
     Stream<double> s;
     yield* s;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect
index fa2ff35..4e18c0c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Stream<dynamic> async* {
+  dynamic f = () → asy::Stream<dynamic>* async* {
     yield 1;
-    asy::Stream<core::double> s;
+    asy::Stream<core::double*>* s;
     yield* s;
   };
-  asy::Stream<core::num> g = f.call();
-  asy::Stream<core::int> h = f.call();
+  asy::Stream<core::num*>* g = f.call();
+  asy::Stream<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect
index 7b996c1..1643166 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.legacy.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method test() → dynamic {
-  dynamic f = () → asy::Stream<dynamic> /* originally async* */ {
-    asy::_AsyncStarStreamController<dynamic> :controller;
+  dynamic f = () → asy::Stream<dynamic>* /* originally async* */ {
+    asy::_AsyncStarStreamController<dynamic>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -25,7 +25,7 @@
               return null;
             else
               [yield] null;
-            asy::Stream<core::double> s;
+            asy::Stream<core::double*>* s;
             if(:controller.{asy::_AsyncStarStreamController::addStream}(s))
               return null;
             else
@@ -46,7 +46,7 @@
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   };
-  asy::Stream<core::num> g = f.call();
-  asy::Stream<core::int> h = f.call();
+  asy::Stream<core::num*>* g = f.call();
+  asy::Stream<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.expect
index 87f7807..056a025 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method test() → dynamic {
-  () → asy::Stream<core::num> f = () → asy::Stream<core::num> async* {
+  () →* asy::Stream<core::num*>* f = () → asy::Stream<core::num*>* async* {
     yield 1;
-    asy::Stream<core::double> s;
+    asy::Stream<core::double*>* s;
     yield* s;
   };
-  asy::Stream<core::num> g = f.call();
-  asy::Stream<core::int> h = f.call() as{TypeError} asy::Stream<core::int>;
+  asy::Stream<core::num*>* g = f.call();
+  asy::Stream<core::int*>* h = f.call() as{TypeError} asy::Stream<core::int*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.transformed.expect
index 1d6f5b6..360b2cd 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_async_star.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method test() → dynamic {
-  () → asy::Stream<core::num> f = () → asy::Stream<core::num> /* originally async* */ {
-    asy::_AsyncStarStreamController<core::num> :controller;
+  () →* asy::Stream<core::num*>* f = () → asy::Stream<core::num*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<core::num*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -25,7 +25,7 @@
               return null;
             else
               [yield] null;
-            asy::Stream<core::double> s;
+            asy::Stream<core::double*>* s;
             if(:controller.{asy::_AsyncStarStreamController::addStream}(s))
               return null;
             else
@@ -42,11 +42,11 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<core::num>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<core::num*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   };
-  asy::Stream<core::num> g = f.call();
-  asy::Stream<core::int> h = f.call() as{TypeError} asy::Stream<core::int>;
+  asy::Stream<core::num*>* g = f.call();
+  asy::Stream<core::int*>* h = f.call() as{TypeError} asy::Stream<core::int*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart
index 0e3870a..9951e54 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart
@@ -7,9 +7,9 @@
 
 test1() {
   List<int> o;
-  var /*@type=Iterable<int>*/ y =
-      o. /*@typeArgs=int*/ /*@target=Iterable::map*/ map(
-          /*@returnType=int*/ (/*@type=int*/ x) {
+  var /*@ type=Iterable<int*>* */ y =
+      o. /*@ typeArgs=int* */ /*@target=Iterable::map*/ map(
+          /*@ returnType=int* */ (/*@ type=int* */ x) {
     return x /*@target=num::+*/ + 1;
   });
   Iterable<int> z = y;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect
index aeecf2c..a80d8cd 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   dynamic y = o.map((dynamic x) → dynamic {
     return x.+(1);
   });
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect
index aeecf2c..a80d8cd 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   dynamic y = o.map((dynamic x) → dynamic {
     return x.+(1);
   });
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.expect
index e5bcf8f..1d59222 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.expect
@@ -3,10 +3,10 @@
 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 {
+  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::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.transformed.expect
index e5bcf8f..1d59222 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 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 {
+  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::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart
index 70033c9..beaf236 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart
@@ -7,7 +7,7 @@
 
 f() {
   List<int> o;
-  o. /*@target=Iterable::where*/ where(/*@returnType=bool*/ (/*@type=int*/ i) {
+  o. /*@target=Iterable::where*/ where(/*@ returnType=bool* */ (/*@ type=int* */ i) {
     return i /*@target=num::==*/ == 0;
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect
index 6a30de0..f67a02c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.where((dynamic i) → dynamic {
     return i.==(0);
   });
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect
index 6a30de0..f67a02c 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.where((dynamic i) → dynamic {
     return i.==(0);
   });
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.expect
index 86aa2ac..77b16ea 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
-  o.{core::Iterable::where}((core::int i) → core::bool {
+  core::List<core::int*>* o;
+  o.{core::Iterable::where}((core::int* i) → core::bool* {
     return i.{core::num::==}(0);
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.transformed.expect
index 86aa2ac..77b16ea 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_basic_void.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
-  o.{core::Iterable::where}((core::int i) → core::bool {
+  core::List<core::int*>* o;
+  o.{core::Iterable::where}((core::int* i) → core::bool* {
     return i.{core::num::==}(0);
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart
index ab95605..72a72cd 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart
@@ -7,8 +7,8 @@
 
 main() {
   String f() => null;
-  var /*@type=() -> String*/ g = f;
-  g = /*@returnType=String*/ () {
+  var /*@ type=() ->* String* */ g = f;
+  g = /*@ returnType=String* */ () {
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
   };
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect
index 5c8ecc1..c7e67bf 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::String
+  function f() → core::String*
     return null;
   dynamic g = f;
   g = () → dynamic {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect
index 5c8ecc1..c7e67bf 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::String
+  function f() → core::String*
     return null;
   dynamic g = f;
   g = () → dynamic {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
index c5376ec..45ab27e 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.expect
@@ -11,13 +11,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::String
+  function f() → core::String*
     return null;
-  () → core::String g = f;
-  g = () → core::String {
+  () →* core::String* g = f;
+  g = () → core::String* {
     return let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
-                                            ^" in 1 as{TypeError} core::String;
+                                            ^" in 1 as{TypeError} core::String*;
   };
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
index c5376ec..45ab27e 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.strong.transformed.expect
@@ -11,13 +11,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::String
+  function f() → core::String*
     return null;
-  () → core::String g = f;
-  g = () → core::String {
+  () →* core::String* g = f;
+  g = () → core::String* {
     return let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     return /*error:RETURN_OF_INVALID_TYPE*/ 1;
-                                            ^" in 1 as{TypeError} core::String;
+                                            ^" in 1 as{TypeError} core::String*;
   };
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
index d05a1c0..35fb3a7 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:11:5: Context: Write to g@322
-  g = /*@returnType=String*/ () {
+pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference.dart:11:5: Context: Write to g@326
+  g = /*@ returnType=String* */ () {
     ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect
index 08eb46a..463755f 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.expect
@@ -2,9 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic g = self::f;
-static method f() → core::String
+static field dynamic g = #C1;
+static method f() → core::String*
   return null;
 static method main() → dynamic {
-  self::f;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect
index 08eb46a..463755f 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.legacy.transformed.expect
@@ -2,9 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic g = self::f;
-static method f() → core::String
+static field dynamic g = #C1;
+static method f() → core::String*
   return null;
 static method main() → dynamic {
-  self::f;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.expect
index 3860922..a91da56 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.expect
@@ -2,9 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field () → core::String g = self::f;
-static method f() → core::String
+static field () →* core::String* g = #C1;
+static method f() → core::String*
   return null;
 static method main() → dynamic {
-  self::f;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.transformed.expect
index 3860922..a91da56 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_downwards_incompatible_with_upwards_inference_top_level.dart.strong.transformed.expect
@@ -2,9 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field () → core::String g = self::f;
-static method f() → core::String
+static field () →* core::String* g = #C1;
+static method f() → core::String*
   return null;
 static method main() → dynamic {
-  self::f;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
index b520fa3..bc39d50 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@type=() -> Future<Null>*/ f = /*@returnType=Future<Null>*/ () async {
+  var /*@ type=() ->* Future<Null*>* */ f = /*@ returnType=Future<Null*>* */ () async {
     return null;
   };
   Future y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect
index ff309bc..d1d19a5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.expect
@@ -6,10 +6,10 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  dynamic f = () → asy::Future<dynamic> async {
+  dynamic f = () → asy::Future<dynamic>* async {
     return null;
   };
-  asy::Future<dynamic> y = f.call();
-  asy::Future<core::String> z = f.call();
-  core::String s = await f.call();
+  asy::Future<dynamic>* y = f.call();
+  asy::Future<core::String*>* z = f.call();
+  core::String* s = await f.call();
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect
index a10c9be..18fdaf1 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.legacy.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -18,9 +18,9 @@
     try {
       #L1:
       {
-        dynamic f = () → asy::Future<dynamic> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-          asy::FutureOr<dynamic> :return_value;
+        dynamic f = () → asy::Future<dynamic>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+          asy::FutureOr<dynamic>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -45,10 +45,10 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        asy::Future<dynamic> y = f.call();
-        asy::Future<core::String> z = f.call();
+        asy::Future<dynamic>* y = f.call();
+        asy::Future<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
index 04005e7..c94fcd7 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.expect
@@ -6,10 +6,10 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () → asy::Future<core::Null> f = () → asy::Future<core::Null> async {
+  () →* asy::Future<core::Null*>* f = () → asy::Future<core::Null*>* async {
     return null;
   };
-  asy::Future<dynamic> y = f.call();
-  asy::Future<core::String> z = f.call();
-  core::String s = await f.call();
+  asy::Future<dynamic>* y = f.call();
+  asy::Future<core::String*>* z = f.call();
+  core::String* s = await f.call();
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
index a3f1182..77ac3db 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -18,9 +18,9 @@
     try {
       #L1:
       {
-        () → asy::Future<core::Null> f = () → asy::Future<core::Null> /* originally async */ {
-          final asy::_AsyncAwaitCompleter<core::Null> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null>();
-          asy::FutureOr<core::Null> :return_value;
+        () →* asy::Future<core::Null*>* f = () → asy::Future<core::Null*>* /* originally async */ {
+          final asy::_AsyncAwaitCompleter<core::Null*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Null*>();
+          asy::FutureOr<core::Null*>* :return_value;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
           dynamic :async_op_error;
@@ -45,10 +45,10 @@
           :async_completer.start(:async_op);
           return :async_completer.{asy::Completer::future};
         };
-        asy::Future<dynamic> y = f.call();
-        asy::Future<core::String> z = f.call();
+        asy::Future<dynamic>* y = f.call();
+        asy::Future<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call(), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
index 7a955a9..0fcd324 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart
@@ -8,7 +8,7 @@
 import 'dart:async';
 
 main() async {
-  var /*@type=() -> Stream<Null>*/ f = /*@returnType=Stream<Null>*/ () async* {
+  var /*@ type=() ->* Stream<Null*>* */ f = /*@ returnType=Stream<Null*>* */ () async* {
     yield null;
   };
   Stream y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect
index 371ba6c..7fb8858 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.expect
@@ -6,10 +6,10 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  dynamic f = () → asy::Stream<dynamic> async* {
+  dynamic f = () → asy::Stream<dynamic>* async* {
     yield null;
   };
-  asy::Stream<dynamic> y = f.call();
-  asy::Stream<core::String> z = f.call();
-  core::String s = await f.call().first;
+  asy::Stream<dynamic>* y = f.call();
+  asy::Stream<core::String*>* z = f.call();
+  core::String* s = await f.call().first;
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect
index 0930327..b3cf8cc 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.legacy.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -18,8 +18,8 @@
     try {
       #L1:
       {
-        dynamic f = () → asy::Stream<dynamic> /* originally async* */ {
-          asy::_AsyncStarStreamController<dynamic> :controller;
+        dynamic f = () → asy::Stream<dynamic>* /* originally async* */ {
+          asy::_AsyncStarStreamController<dynamic>* :controller;
           dynamic :controller_stream;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -53,10 +53,10 @@
           :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
           return :controller_stream;
         };
-        asy::Stream<dynamic> y = f.call();
-        asy::Stream<core::String> z = f.call();
+        asy::Stream<dynamic>* y = f.call();
+        asy::Stream<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().first, :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
index 8df15e6..399d883 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.expect
@@ -6,10 +6,10 @@
 import "dart:async";
 
 static method main() → dynamic async {
-  () → asy::Stream<core::Null> f = () → asy::Stream<core::Null> async* {
+  () →* asy::Stream<core::Null*>* f = () → asy::Stream<core::Null*>* async* {
     yield null;
   };
-  asy::Stream<dynamic> y = f.call();
-  asy::Stream<core::String> z = f.call();
-  core::String s = await f.call().{asy::Stream::first};
+  asy::Stream<dynamic>* y = f.call();
+  asy::Stream<core::String*>* z = f.call();
+  core::String* s = await f.call().{asy::Stream::first};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
index f5fafd0..1c649f3 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_async_star.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -18,8 +18,8 @@
     try {
       #L1:
       {
-        () → asy::Stream<core::Null> f = () → asy::Stream<core::Null> /* originally async* */ {
-          asy::_AsyncStarStreamController<core::Null> :controller;
+        () →* asy::Stream<core::Null*>* f = () → asy::Stream<core::Null*>* /* originally async* */ {
+          asy::_AsyncStarStreamController<core::Null*>* :controller;
           dynamic :controller_stream;
           dynamic :async_stack_trace;
           dynamic :async_op_then;
@@ -49,14 +49,14 @@
           :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
           :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
           :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-          :controller = new asy::_AsyncStarStreamController::•<core::Null>(:async_op);
+          :controller = new asy::_AsyncStarStreamController::•<core::Null*>(:async_op);
           :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
           return :controller_stream;
         };
-        asy::Stream<dynamic> y = f.call();
-        asy::Stream<core::String> z = f.call();
+        asy::Stream<dynamic>* y = f.call();
+        asy::Stream<core::String*>* z = f.call();
         [yield] let dynamic #t1 = asy::_awaitHelper(f.call().{asy::Stream::first}, :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
index 3901551..192fdd0 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart
@@ -9,18 +9,18 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@type=(Object) -> Null*/ f = /*@returnType=Null*/ (Object x) {
+  var /*@ type=(Object*) ->* Null* */ f = /*@ returnType=Null* */ (Object x) {
     return null;
   };
   String y = f(42);
 
-  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@returnType=Null*/ (/*@type=Object*/ x) =>
+  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null* */ (/*@ type=Object* */ x) =>
       'hello';
 
-  foo(/*@returnType=Null*/ (/*@type=Object*/ x) {
+  foo(/*@ returnType=Null* */ (/*@ type=Object* */ x) {
     return null;
   });
-  foo(/*@returnType=Null*/ (/*@type=Object*/ x) {
+  foo(/*@ returnType=Null* */ (/*@ type=Object* */ x) {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect
index 3287dd0..6caa863 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  dynamic f = (core::Object x) → dynamic {
+  dynamic f = (core::Object* x) → dynamic {
     return null;
   };
-  core::String y = f.call(42);
+  core::String* y = f.call(42);
   f = (dynamic x) → dynamic => "hello";
   self::foo((dynamic x) → dynamic {
     return null;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect
index 3287dd0..6caa863 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  dynamic f = (core::Object x) → dynamic {
+  dynamic f = (core::Object* x) → dynamic {
     return null;
   };
-  core::String y = f.call(42);
+  core::String* y = f.call(42);
   f = (dynamic x) → dynamic => "hello";
   self::foo((dynamic x) → dynamic {
     return null;
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
index ffc9a26..851fe91 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object) → core::Null f = (core::Object x) → core::Null {
+  (core::Object*) →* core::Null* f = (core::Object* x) → core::Null* {
     return null;
   };
-  core::String y = f.call(42);
-  f = (core::Object x) → core::Null => "hello" as{TypeError} core::Null;
-  self::foo((core::Object x) → core::Null {
+  core::String* y = f.call(42);
+  f = (core::Object* x) → core::Null* => "hello" as{TypeError} core::Null*;
+  self::foo((core::Object* x) → core::Null* {
     return null;
   });
-  self::foo((core::Object x) → core::Null {
+  self::foo((core::Object* x) → core::Null* {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
index ffc9a26..851fe91 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object) → core::Null f = (core::Object x) → core::Null {
+  (core::Object*) →* core::Null* f = (core::Object* x) → core::Null* {
     return null;
   };
-  core::String y = f.call(42);
-  f = (core::Object x) → core::Null => "hello" as{TypeError} core::Null;
-  self::foo((core::Object x) → core::Null {
+  core::String* y = f.call(42);
+  f = (core::Object* x) → core::Null* => "hello" as{TypeError} core::Null*;
+  self::foo((core::Object* x) → core::Null* {
     return null;
   });
-  self::foo((core::Object x) → core::Null {
+  self::foo((core::Object* x) → core::Null* {
     throw "not implemented";
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
index 14d415b..78cf9d6d 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@348
-  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@returnType=Null*/ (/*@type=Object*/ x) =>
+pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync.dart:17:5: Context: Write to f@353
+  f = /*error:INVALID_CAST_FUNCTION_EXPR*/ /*@ returnType=Null* */ (/*@ type=Object* */ x) =>
     ^
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
index cd461d6..e4c6fe0 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart
@@ -6,7 +6,7 @@
 library test;
 
 main() {
-  var /*@type=() -> Iterable<Null>*/ f = /*@returnType=Iterable<Null>*/ () sync* {
+  var /*@ type=() ->* Iterable<Null*>* */ f = /*@ returnType=Iterable<Null*>* */ () sync* {
     yield null;
   };
   Iterable y = f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect
index b0100dd..010e26e 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic f = () → core::Iterable<dynamic> sync* {
+  dynamic f = () → core::Iterable<dynamic>* sync* {
     yield null;
   };
-  core::Iterable<dynamic> y = f.call();
-  core::Iterable<core::String> z = f.call();
-  core::String s = f.call().first;
+  core::Iterable<dynamic>* y = f.call();
+  core::Iterable<core::String*>* z = f.call();
+  core::String* s = f.call().first;
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect
index f1c2713..63210af 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic f = () → core::Iterable<dynamic> /* originally sync* */ {
+  dynamic f = () → core::Iterable<dynamic>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = null;
@@ -17,7 +17,7 @@
     }
     return new core::_SyncIterable::•<dynamic>(:sync_op);
   };
-  core::Iterable<dynamic> y = f.call();
-  core::Iterable<core::String> z = f.call();
-  core::String s = f.call().first;
+  core::Iterable<dynamic>* y = f.call();
+  core::Iterable<core::String*>* z = f.call();
+  core::String* s = f.call().first;
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
index a5fe4f6..d55bbde 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Iterable<core::Null> f = () → core::Iterable<core::Null> sync* {
+  () →* core::Iterable<core::Null*>* f = () → core::Iterable<core::Null*>* sync* {
     yield null;
   };
-  core::Iterable<dynamic> y = f.call();
-  core::Iterable<core::String> z = f.call();
-  core::String s = f.call().{core::Iterable::first};
+  core::Iterable<dynamic>* y = f.call();
+  core::Iterable<core::String*>* z = f.call();
+  core::String* s = f.call().{core::Iterable::first};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
index ef16872..843ea40 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_infer_bottom_sync_star.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Iterable<core::Null> f = () → core::Iterable<core::Null> /* originally sync* */ {
+  () →* core::Iterable<core::Null*>* f = () → core::Iterable<core::Null*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<core::Null> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<core::Null*>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = null;
@@ -15,9 +15,9 @@
       }
       return false;
     }
-    return new core::_SyncIterable::•<core::Null>(:sync_op);
+    return new core::_SyncIterable::•<core::Null*>(:sync_op);
   };
-  core::Iterable<dynamic> y = f.call();
-  core::Iterable<core::String> z = f.call();
-  core::String s = f.call().{core::Iterable::first};
+  core::Iterable<dynamic>* y = f.call();
+  core::Iterable<core::String*>* z = f.call();
+  core::String* s = f.call().{core::Iterable::first};
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart
index 44a27d4..3907949 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart
@@ -9,9 +9,9 @@
 
 test2() {
   List<num> o;
-  var /*@type=Iterable<num>*/ y =
-      o. /*@typeArgs=num*/ /*@target=Iterable::map*/ map(
-          /*@returnType=num*/ (/*@type=num*/ x) {
+  var /*@ type=Iterable<num*>* */ y =
+      o. /*@ typeArgs=num* */ /*@target=Iterable::map*/ map(
+          /*@ returnType=num* */ (/*@ type=num* */ x) {
     if (new Random(). /*@target=dart.math::Random::nextBool*/ nextBool()) {
       return x. /*@target=num::toInt*/ toInt() /*@target=num::+*/ + 1;
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect
index b489cb1..bb20029 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.expect
@@ -6,7 +6,7 @@
 import "dart:math";
 
 static method test2() → dynamic {
-  core::List<core::num> o;
+  core::List<core::num*>* o;
   dynamic y = o.map((dynamic x) → dynamic {
     if(math::Random::•().nextBool()) {
       return x.toInt().+(1);
@@ -15,7 +15,7 @@
       return x.toDouble();
     }
   });
-  core::Iterable<core::num> w = y;
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::num*>* w = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect
index b489cb1..bb20029 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
 import "dart:math";
 
 static method test2() → dynamic {
-  core::List<core::num> o;
+  core::List<core::num*>* o;
   dynamic y = o.map((dynamic x) → dynamic {
     if(math::Random::•().nextBool()) {
       return x.toInt().+(1);
@@ -15,7 +15,7 @@
       return x.toDouble();
     }
   });
-  core::Iterable<core::num> w = y;
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::num*>* w = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.expect
index 3387e96..661f9a5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.expect
@@ -6,8 +6,8 @@
 import "dart:math";
 
 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 {
+  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}()) {
       return x.{core::num::toInt}().{core::num::+}(1);
     }
@@ -15,7 +15,7 @@
       return x.{core::num::toDouble}();
     }
   });
-  core::Iterable<core::num> w = y;
-  core::Iterable<core::int> z = y as{TypeError} core::Iterable<core::int>;
+  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_lub.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.transformed.expect
index 3387e96..661f9a5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_lub.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:math";
 
 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 {
+  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}()) {
       return x.{core::num::toInt}().{core::num::+}(1);
     }
@@ -15,7 +15,7 @@
       return x.{core::num::toDouble}();
     }
   });
-  core::Iterable<core::num> w = y;
-  core::Iterable<core::int> z = y as{TypeError} core::Iterable<core::int>;
+  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 b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart
index f0b4017..eaabb5f 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=() -> (int) -> double*/ f = /*@returnType=(int) -> double*/ () {
-    return /*@returnType=double*/ (int x) {
+  var /*@ type=() ->* (int*) ->* double* */ f = /*@ returnType=(int*) ->* double* */ () {
+    return /*@ returnType=double* */ (int x) {
       return 2.0 /*@target=double::**/ * x;
     };
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect
index c435423..bc0b688 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   dynamic f = () → dynamic {
-    return (core::int x) → dynamic {
+    return (core::int* x) → dynamic {
       return 2.0.*(x);
     };
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect
index c435423..bc0b688 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 static method main() → dynamic {
   dynamic f = () → dynamic {
-    return (core::int x) → dynamic {
+    return (core::int* x) → dynamic {
       return 2.0.*(x);
     };
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.expect
index 1939518..51f25d2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → (core::int) → core::double f = () → (core::int) → core::double {
-    return (core::int x) → core::double {
+  () →* (core::int*) →* core::double* f = () → (core::int*) →* core::double* {
+    return (core::int* x) → core::double* {
       return 2.0.{core::double::*}(x);
     };
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.transformed.expect
index 1939518..51f25d2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_nested_lambdas.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → (core::int) → core::double f = () → (core::int) → core::double {
-    return (core::int x) → core::double {
+  () →* (core::int*) →* core::double* f = () → (core::int*) →* core::double* {
+    return (core::int* x) → core::double* {
       return 2.0.{core::double::*}(x);
     };
   };
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
index 0c1dca3..44aca46 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart
@@ -7,9 +7,9 @@
 
 test1() {
   List<int> o;
-  var /*@type=Iterable<Null>*/ y =
-      o. /*@typeArgs=Null*/ /*@target=Iterable::map*/ map(
-          /*@returnType=Null*/ (/*@type=int*/ x) {});
+  var /*@ type=Iterable<Null*>* */ y =
+      o. /*@ typeArgs=Null* */ /*@target=Iterable::map*/ map(
+          /*@ returnType=Null* */ (/*@ type=int* */ x) {});
   Iterable<int> z = y;
 }
 
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect
index e318418..7b30c9a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   dynamic y = o.map((dynamic x) → dynamic {});
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect
index e318418..7b30c9a 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   dynamic y = o.map((dynamic x) → dynamic {});
-  core::Iterable<core::int> z = y;
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
index c8d8caa..a3d94e2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
-  core::Iterable<core::Null> y = o.{core::Iterable::map}<core::Null>((core::int x) → core::Null {});
-  core::Iterable<core::int> z = y;
+  core::List<core::int*>* o;
+  core::Iterable<core::Null*>* y = o.{core::Iterable::map}<core::Null*>((core::int* x) → core::Null* {});
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
index c8d8caa..a3d94e2 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_no_return.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> o;
-  core::Iterable<core::Null> y = o.{core::Iterable::map}<core::Null>((core::int x) → core::Null {});
-  core::Iterable<core::int> z = y;
+  core::List<core::int*>* o;
+  core::Iterable<core::Null*>* y = o.{core::Iterable::map}<core::Null*>((core::int* x) → core::Null* {});
+  core::Iterable<core::int*>* z = y;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
index 852fb3f..dad3714 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart
@@ -6,73 +6,73 @@
 library test;
 
 main() {
-  var /*@type=() -> Null*/ a = /*@returnType=Null*/ () {};
-  var /*@type=() -> Null*/ b = /*@returnType=Null*/ () {
+  var /*@ type=() ->* Null* */ a = /*@ returnType=Null* */ () {};
+  var /*@ type=() ->* Null* */ b = /*@ returnType=Null* */ () {
     return;
   };
-  var /*@type=() -> Null*/ c = /*@returnType=Null*/ () {
+  var /*@ type=() ->* Null* */ c = /*@ returnType=Null* */ () {
     return null;
   };
-  var /*@type=() -> int*/ d = /*@returnType=int*/ () {
+  var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@type=(bool) -> Null*/ e = /*@returnType=Null*/ (bool b) {
+  var /*@ type=(bool*) ->* Null* */ e = /*@ returnType=Null* */ (bool b) {
     if (b) {
       return;
     } else {
       return;
     }
   };
-  var /*@type=(bool) -> Null*/ f = /*@returnType=Null*/ (bool b) {
+  var /*@ type=(bool*) ->* Null* */ f = /*@ returnType=Null* */ (bool b) {
     if (b) {
       return;
     } else {
       return null;
     }
   };
-  var /*@type=(bool) -> int*/ g = /*@returnType=int*/ (bool b) {
+  var /*@ type=(bool*) ->* int* */ g = /*@ returnType=int* */ (bool b) {
     if (b) {
       return;
     } else {
       return 0;
     }
   };
-  var /*@type=(bool) -> Null*/ h = /*@returnType=Null*/ (bool b) {
+  var /*@ type=(bool*) ->* Null* */ h = /*@ returnType=Null* */ (bool b) {
     if (b) {
       return null;
     } else {
       return;
     }
   };
-  var /*@type=(bool) -> Null*/ i = /*@returnType=Null*/ (bool b) {
+  var /*@ type=(bool*) ->* Null* */ i = /*@ returnType=Null* */ (bool b) {
     if (b) {
       return null;
     } else {
       return null;
     }
   };
-  var /*@type=(bool) -> int*/ j = /*@returnType=int*/ (bool b) {
+  var /*@ type=(bool*) ->* int* */ j = /*@ returnType=int* */ (bool b) {
     if (b) {
       return null;
     } else {
       return 0;
     }
   };
-  var /*@type=(bool) -> int*/ k = /*@returnType=int*/ (bool b) {
+  var /*@ type=(bool*) ->* int* */ k = /*@ returnType=int* */ (bool b) {
     if (b) {
       return 0;
     } else {
       return;
     }
   };
-  var /*@type=(bool) -> int*/ l = /*@returnType=int*/ (bool b) {
+  var /*@ type=(bool*) ->* int* */ l = /*@ returnType=int* */ (bool b) {
     if (b) {
       return 0;
     } else {
       return null;
     }
   };
-  var /*@type=(bool) -> int*/ m = /*@returnType=int*/ (bool b) {
+  var /*@ type=(bool*) ->* int* */ m = /*@ returnType=int* */ (bool b) {
     if (b) {
       return 0;
     } else {
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect
index 895ff01..7a039b1 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.expect
@@ -13,7 +13,7 @@
   dynamic d = () → dynamic {
     return 0;
   };
-  dynamic e = (core::bool b) → dynamic {
+  dynamic e = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -21,7 +21,7 @@
       return;
     }
   };
-  dynamic f = (core::bool b) → dynamic {
+  dynamic f = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -29,7 +29,7 @@
       return null;
     }
   };
-  dynamic g = (core::bool b) → dynamic {
+  dynamic g = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -37,7 +37,7 @@
       return 0;
     }
   };
-  dynamic h = (core::bool b) → dynamic {
+  dynamic h = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -45,7 +45,7 @@
       return;
     }
   };
-  dynamic i = (core::bool b) → dynamic {
+  dynamic i = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -53,7 +53,7 @@
       return null;
     }
   };
-  dynamic j = (core::bool b) → dynamic {
+  dynamic j = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -61,7 +61,7 @@
       return 0;
     }
   };
-  dynamic k = (core::bool b) → dynamic {
+  dynamic k = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
@@ -69,7 +69,7 @@
       return;
     }
   };
-  dynamic l = (core::bool b) → dynamic {
+  dynamic l = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
@@ -77,7 +77,7 @@
       return null;
     }
   };
-  dynamic m = (core::bool b) → dynamic {
+  dynamic m = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect
index 895ff01..7a039b1 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.legacy.transformed.expect
@@ -13,7 +13,7 @@
   dynamic d = () → dynamic {
     return 0;
   };
-  dynamic e = (core::bool b) → dynamic {
+  dynamic e = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -21,7 +21,7 @@
       return;
     }
   };
-  dynamic f = (core::bool b) → dynamic {
+  dynamic f = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -29,7 +29,7 @@
       return null;
     }
   };
-  dynamic g = (core::bool b) → dynamic {
+  dynamic g = (core::bool* b) → dynamic {
     if(b) {
       return;
     }
@@ -37,7 +37,7 @@
       return 0;
     }
   };
-  dynamic h = (core::bool b) → dynamic {
+  dynamic h = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -45,7 +45,7 @@
       return;
     }
   };
-  dynamic i = (core::bool b) → dynamic {
+  dynamic i = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -53,7 +53,7 @@
       return null;
     }
   };
-  dynamic j = (core::bool b) → dynamic {
+  dynamic j = (core::bool* b) → dynamic {
     if(b) {
       return null;
     }
@@ -61,7 +61,7 @@
       return 0;
     }
   };
-  dynamic k = (core::bool b) → dynamic {
+  dynamic k = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
@@ -69,7 +69,7 @@
       return;
     }
   };
-  dynamic l = (core::bool b) → dynamic {
+  dynamic l = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
@@ -77,7 +77,7 @@
       return null;
     }
   };
-  dynamic m = (core::bool b) → dynamic {
+  dynamic m = (core::bool* b) → dynamic {
     if(b) {
       return 0;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
index 6d433ff..b6de6a5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Null a = () → core::Null {};
-  () → core::Null b = () → core::Null {
+  () →* core::Null* a = () → core::Null* {};
+  () →* core::Null* b = () → core::Null* {
     return;
   };
-  () → core::Null c = () → core::Null {
+  () →* core::Null* c = () → core::Null* {
     return null;
   };
-  () → core::int d = () → core::int {
+  () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool) → core::Null e = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* e = (core::bool* b) → core::Null* {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool) → core::Null f = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* f = (core::bool* b) → core::Null* {
     if(b) {
       return;
     }
@@ -40,7 +40,7 @@
       return null;
     }
   };
-  (core::bool) → core::int g = (core::bool b) → core::int {
+  (core::bool*) →* core::int* g = (core::bool* b) → core::int* {
     if(b) {
       return null;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool) → core::Null h = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* h = (core::bool* b) → core::Null* {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool) → core::Null i = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* i = (core::bool* b) → core::Null* {
     if(b) {
       return null;
     }
@@ -64,7 +64,7 @@
       return null;
     }
   };
-  (core::bool) → core::int j = (core::bool b) → core::int {
+  (core::bool*) →* core::int* j = (core::bool* b) → core::int* {
     if(b) {
       return null;
     }
@@ -72,7 +72,7 @@
       return 0;
     }
   };
-  (core::bool) → core::int k = (core::bool b) → core::int {
+  (core::bool*) →* core::int* k = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
@@ -80,7 +80,7 @@
       return null;
     }
   };
-  (core::bool) → core::int l = (core::bool b) → core::int {
+  (core::bool*) →* core::int* l = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
@@ -88,7 +88,7 @@
       return null;
     }
   };
-  (core::bool) → core::int m = (core::bool b) → core::int {
+  (core::bool*) →* core::int* m = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
index 6d433ff..b6de6a5 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_returns.dart.strong.transformed.expect
@@ -14,17 +14,17 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Null a = () → core::Null {};
-  () → core::Null b = () → core::Null {
+  () →* core::Null* a = () → core::Null* {};
+  () →* core::Null* b = () → core::Null* {
     return;
   };
-  () → core::Null c = () → core::Null {
+  () →* core::Null* c = () → core::Null* {
     return null;
   };
-  () → core::int d = () → core::int {
+  () →* core::int* d = () → core::int* {
     return 0;
   };
-  (core::bool) → core::Null e = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* e = (core::bool* b) → core::Null* {
     if(b) {
       return;
     }
@@ -32,7 +32,7 @@
       return;
     }
   };
-  (core::bool) → core::Null f = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* f = (core::bool* b) → core::Null* {
     if(b) {
       return;
     }
@@ -40,7 +40,7 @@
       return null;
     }
   };
-  (core::bool) → core::int g = (core::bool b) → core::int {
+  (core::bool*) →* core::int* g = (core::bool* b) → core::int* {
     if(b) {
       return null;
     }
@@ -48,7 +48,7 @@
       return 0;
     }
   };
-  (core::bool) → core::Null h = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* h = (core::bool* b) → core::Null* {
     if(b) {
       return null;
     }
@@ -56,7 +56,7 @@
       return;
     }
   };
-  (core::bool) → core::Null i = (core::bool b) → core::Null {
+  (core::bool*) →* core::Null* i = (core::bool* b) → core::Null* {
     if(b) {
       return null;
     }
@@ -64,7 +64,7 @@
       return null;
     }
   };
-  (core::bool) → core::int j = (core::bool b) → core::int {
+  (core::bool*) →* core::int* j = (core::bool* b) → core::int* {
     if(b) {
       return null;
     }
@@ -72,7 +72,7 @@
       return 0;
     }
   };
-  (core::bool) → core::int k = (core::bool b) → core::int {
+  (core::bool*) →* core::int* k = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
@@ -80,7 +80,7 @@
       return null;
     }
   };
-  (core::bool) → core::int l = (core::bool b) → core::int {
+  (core::bool*) →* core::int* l = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
@@ -88,7 +88,7 @@
       return null;
     }
   };
-  (core::bool) → core::int m = (core::bool b) → core::int {
+  (core::bool*) →* core::int* m = (core::bool* b) → core::int* {
     if(b) {
       return 0;
     }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart
index 4f78364..daf16ab 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart
@@ -6,9 +6,9 @@
 library test;
 
 test() {
-  var /*@type=() -> Iterable<num>*/ f = /*@returnType=Iterable<num>*/ () sync* {
+  var /*@ type=() ->* Iterable<num*>* */ f = /*@ returnType=Iterable<num*>* */ () sync* {
     yield 1;
-    yield* /*@typeArgs=num*/ [3, 4.0];
+    yield* /*@ typeArgs=num* */ [3, 4.0];
   };
   Iterable<num> g = f();
   Iterable<int> h = /*info:ASSIGNMENT_CAST*/ f();
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect
index e00bc64..d4df224 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  dynamic f = () → core::Iterable<dynamic> sync* {
+  dynamic f = () → core::Iterable<dynamic>* sync* {
     yield 1;
     yield*<dynamic>[3, 4.0];
   };
-  core::Iterable<core::num> g = f.call();
-  core::Iterable<core::int> h = f.call();
+  core::Iterable<core::num*>* g = f.call();
+  core::Iterable<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect
index 8a11ab5..59505bf 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  dynamic f = () → core::Iterable<dynamic> /* originally sync* */ {
+  dynamic f = () → core::Iterable<dynamic>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = 1;
@@ -21,7 +21,7 @@
     }
     return new core::_SyncIterable::•<dynamic>(:sync_op);
   };
-  core::Iterable<core::num> g = f.call();
-  core::Iterable<core::int> h = f.call();
+  core::Iterable<core::num*>* g = f.call();
+  core::Iterable<core::int*>* h = f.call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.expect
index d306538..58f8c43 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  () → core::Iterable<core::num> f = () → core::Iterable<core::num> sync* {
+  () →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* sync* {
     yield 1;
-    yield*<core::num>[3, 4.0];
+    yield*<core::num*>[3, 4.0];
   };
-  core::Iterable<core::num> g = f.call();
-  core::Iterable<core::int> h = f.call() as{TypeError} core::Iterable<core::int>;
+  core::Iterable<core::num*>* g = f.call();
+  core::Iterable<core::int*>* h = f.call() as{TypeError} core::Iterable<core::int*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
index bc47beb..f8df559 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_sync_star.dart.strong.transformed.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  () → core::Iterable<core::num> f = () → core::Iterable<core::num> /* originally sync* */ {
+  () →* core::Iterable<core::num*>* f = () → core::Iterable<core::num*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<core::num> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<core::num*>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = 1;
           [yield] true;
         }
         {
-          :iterator.{core::_SyncIterator::_yieldEachIterable} = <core::num>[3, 4.0];
+          :iterator.{core::_SyncIterator::_yieldEachIterable} = <core::num*>[3, 4.0];
           [yield] true;
         }
       }
       return false;
     }
-    return new core::_SyncIterable::•<core::num>(:sync_op);
+    return new core::_SyncIterable::•<core::num*>(:sync_op);
   };
-  core::Iterable<core::num> g = f.call();
-  core::Iterable<core::int> h = f.call() as{TypeError} core::Iterable<core::int>;
+  core::Iterable<core::num*>* g = f.call();
+  core::Iterable<core::int*>* h = f.call() as{TypeError} core::Iterable<core::int*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart
index 23d2b4e..b8e341d 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart
@@ -8,7 +8,7 @@
 f() {
   List<int> o;
   o. /*@target=Iterable::forEach*/ forEach(
-      /*@returnType=int*/ (/*@type=int*/ i) {
+      /*@ returnType=int* */ (/*@ type=int* */ i) {
     return i /*@target=num::+*/ + 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect
index 4273083..50bbcf8 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.forEach((dynamic i) → dynamic {
     return i.+(1);
   });
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect
index 4273083..50bbcf8 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.forEach((dynamic i) → dynamic {
     return i.+(1);
   });
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.expect
index 38ae920..632c733 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
-  o.{core::Iterable::forEach}((core::int i) → core::int {
+  core::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* {
     return i.{core::num::+}(1);
   });
 }
diff --git a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.transformed.expect
index 38ae920..632c733 100644
--- a/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/block_bodied_lambdas_void_context.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
-  o.{core::Iterable::forEach}((core::int i) → core::int {
+  core::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* {
     return i.{core::num::+}(1);
   });
 }
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart b/pkg/front_end/testcases/inference/bottom_in_closure.dart
index d375da9..c0f7ac8 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var v = /*@returnType=Null*/ () => null;
+var v = /*@ returnType=Null* */ () => null;
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
index 4ca225f..15c380f 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field () → core::Null v = () → core::Null => null;
+static field () →* core::Null* v = () → core::Null* => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
index 4ca225f..15c380f 100644
--- a/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bottom_in_closure.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field () → core::Null v = () → core::Null => null;
+static field () →* core::Null* v = () → core::Null* => null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/bug30251.dart b/pkg/front_end/testcases/inference/bug30251.dart
index 98c6b1e..b16ade8 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart
+++ b/pkg/front_end/testcases/inference/bug30251.dart
@@ -9,7 +9,7 @@
 
 class C {
   final x;
-  C(int p) : x = /*@typeArgs=int*/ f(1 /*@target=num::+*/ + p);
+  C(int p) : x = /*@ typeArgs=int* */ f(1 /*@target=num::+*/ + p);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30251.dart.legacy.expect
index 963af4d..7b4845b 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.legacy.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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/bug30251.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.legacy.transformed.expect
index 963af4d..7b4845b 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.legacy.transformed.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     : self::C::x = self::f<dynamic>(1.+(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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/bug30251.dart.outline.expect b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
index 8afecf1..15e312c 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.outline.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+static method f<T extends core::Object* = dynamic>(self::f::T* t) → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
index 2159bd5..93f838d 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.expect
@@ -4,10 +4,10 @@
 
 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)), super core::Object::•()
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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/bug30251.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
index 2159bd5..93f838d 100644
--- a/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30251.dart.strong.transformed.expect
@@ -4,10 +4,10 @@
 
 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)), super core::Object::•()
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(1.{core::num::+}(p)), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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 b/pkg/front_end/testcases/inference/bug30620.dart
index c59d100..f00e34f 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart
+++ b/pkg/front_end/testcases/inference/bug30620.dart
@@ -11,7 +11,7 @@
   A(this.foo);
 
   bool operator ==(Object other) =>
-      other is A && /*@promotedType=A*/ other
+      other is A && /*@ promotedType=A* */ other
               . /*@target=A::foo*/ foo /*@target=String::==*/ ==
           this. /*@target=A::foo*/ foo;
 }
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect
index d7c749f..e1c03c1 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other.foo.==(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").==(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect
index d7c749f..e1c03c1 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other.foo.==(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").==(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.outline.expect b/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
index 0bc257f..4c2c860 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
     ;
-  operator ==(core::Object other) → core::bool
+  operator ==(core::Object* other) → core::bool*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.strong.expect b/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
index 7c997a1..5d4c33b 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").{self::A::==}(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect
index 7c997a1..5d4c33b 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").{self::A::==}(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
index f995931..a6f22c3 100644
--- a/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug30620.dart.type_promotion.expect
@@ -1,3 +1,3 @@
 pkg/front_end/testcases/inference/bug30620.dart:14:13: Context: Possible promotion of other@335
-      other is A && /*@promotedType=A*/ other
+      other is A && /*@ promotedType=A* */ other
             ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart b/pkg/front_end/testcases/inference/bug30620_b.dart
index 3ed2430..1ac1495 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart
@@ -11,9 +11,9 @@
   A(this.foo);
 
   bool operator ==(Object other) =>
-      other is A && /*@promotedType=A*/ other
+      other is A && /*@ promotedType=A* */ other
               . /*@target=A::foo*/ foo /*@target=String::==*/ ==
-          this. /*@target=A::foo*/ foo && /*@promotedType=A*/ other
+          this. /*@target=A::foo*/ foo && /*@ promotedType=A* */ other
               . /*@target=A::foo*/ foo /*@target=String::==*/ ==
           this. /*@target=A::foo*/ foo;
 }
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect
index db3e6ea..5ea0147 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").==(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect
index db3e6ea..5ea0147 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other.foo.==(this.{self::A::foo}) && other.foo.==(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").==(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect
index 0bc257f..4c2c860 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
     ;
-  operator ==(core::Object other) → core::bool
+  operator ==(core::Object* other) → core::bool*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect
index 9bc7bc0..b2fff72 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo}) && other{self::A}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo}) && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").{self::A::==}(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.strong.transformed.expect
index 9bc7bc0..b2fff72 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo}) && other{self::A}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
+  operator ==(core::Object* other) → core::bool*
+    return other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo}) && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo});
 }
 static method main() → dynamic {
   core::print(new self::A::•("hello").{self::A::==}(new self::A::•("hello")));
diff --git a/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
index 85cca67..c3d4ebc 100644
--- a/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug30620_b.dart.type_promotion.expect
@@ -1,3 +1,3 @@
 pkg/front_end/testcases/inference/bug30620_b.dart:14:13: Context: Possible promotion of other@335
-      other is A && /*@promotedType=A*/ other
+      other is A && /*@ promotedType=A* */ other
             ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart b/pkg/front_end/testcases/inference/bug30620_c.dart
index 3120c7f..4cc804f 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart
@@ -11,10 +11,10 @@
   A(this.foo);
 
   bool operator ==(Object other) {
-    if (other is A && /*@promotedType=A*/ other
+    if (other is A && /*@ promotedType=A* */ other
             . /*@target=A::foo*/ foo /*@target=String::==*/ ==
         this. /*@target=A::foo*/ foo) {
-      if (/*@promotedType=A*/ other
+      if (/*@ promotedType=A* */ other
               . /*@target=A::foo*/ foo /*@target=String::==*/ ==
           this. /*@target=A::foo*/ foo) {}
     }
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect
index 6ddfcf5..274610f 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo})) {
+  operator ==(core::Object* other) → core::bool* {
+    if(other is self::A* && other.foo.==(this.{self::A::foo})) {
       if(other.foo.==(this.{self::A::foo})) {
       }
     }
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect
index 6ddfcf5..274610f 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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.foo.==(this.{self::A::foo})) {
+  operator ==(core::Object* other) → core::bool* {
+    if(other is self::A* && other.foo.==(this.{self::A::foo})) {
       if(other.foo.==(this.{self::A::foo})) {
       }
     }
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect
index 0bc257f..4c2c860 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  final field core::String* foo;
+  constructor •(core::String* foo) → self::A*
     ;
-  operator ==(core::Object other) → core::bool
+  operator ==(core::Object* other) → core::bool*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect
index e457cd0..37e2539 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo})) {
-      if(other{self::A}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
+  operator ==(core::Object* other) → core::bool* {
+    if(other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
+      if(other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
       }
     }
     return true;
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.strong.transformed.expect
index e457cd0..37e2539 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String foo;
-  constructor •(core::String foo) → self::A
+  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::==}(this.{self::A::foo})) {
-      if(other{self::A}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
+  operator ==(core::Object* other) → core::bool* {
+    if(other is self::A* && other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
+      if(other{self::A*}.{self::A::foo}.{core::String::==}(this.{self::A::foo})) {
       }
     }
     return true;
diff --git a/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
index 3a22ae1..f1d0bf3 100644
--- a/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug30620_c.dart.type_promotion.expect
@@ -1,3 +1,3 @@
 pkg/front_end/testcases/inference/bug30620_c.dart:14:15: Context: Possible promotion of other@335
-    if (other is A && /*@promotedType=A*/ other
+    if (other is A && /*@ promotedType=A* */ other
               ^^
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart b/pkg/front_end/testcases/inference/bug30620_d.dart
index df1c56a..2d25273 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart
@@ -6,7 +6,7 @@
 library test;
 
 String foo(obj) => obj is String
-    ? /*@promotedType=String*/ obj
+    ? /*@ promotedType=String* */ obj
         . /*@target=String::toUpperCase*/ toUpperCase()
     : null;
 
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect
index c5cd413..adb0648 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(dynamic obj) → core::String
-  return obj is core::String ? obj.toUpperCase() : null;
+static method foo(dynamic obj) → core::String*
+  return obj is core::String* ? obj.toUpperCase() : null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect
index c5cd413..adb0648 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(dynamic obj) → core::String
-  return obj is core::String ? obj.toUpperCase() : null;
+static method foo(dynamic obj) → core::String*
+  return obj is core::String* ? obj.toUpperCase() : null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.outline.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.outline.expect
index 714441a..abcb5f5 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo(dynamic obj) → core::String
+static method foo(dynamic obj) → core::String*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.strong.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.strong.expect
index 39bc32b..f8023a0 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.strong.expect
@@ -2,6 +2,6 @@
 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}() : null;
+static method foo(dynamic obj) → core::String*
+  return obj is core::String* ?{core::String*} obj{core::String*}.{core::String::toUpperCase}() : null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30620_d.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30620_d.dart.strong.transformed.expect
index 39bc32b..f8023a0 100644
--- a/pkg/front_end/testcases/inference/bug30620_d.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30620_d.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 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}() : null;
+static method foo(dynamic obj) → core::String*
+  return obj is core::String* ?{core::String*} obj{core::String*}.{core::String::toUpperCase}() : null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart b/pkg/front_end/testcases/inference/bug30624.dart
index 9d21ddb..39f822e 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart
+++ b/pkg/front_end/testcases/inference/bug30624.dart
@@ -9,16 +9,16 @@
 
 class C<E> {
   void barA([int cmp(E a, E b)]) {
-    /*@typeArgs=C::E*/ foo(this, cmp ?? _default);
+    /*@ typeArgs=C::E* */ foo(this, cmp ?? _default);
   }
 
   void barB([int cmp(E a, E b)]) {
-    /*@typeArgs=C::E*/ foo(this, cmp ?? (_default as int Function(E, E)));
+    /*@ typeArgs=C::E* */ foo(this, cmp ?? (_default as int Function(E, E)));
   }
 
   void barC([int cmp(E a, E b)]) {
     int Function(E, E) v = _default;
-    /*@typeArgs=C::E*/ foo(this, cmp ?? v);
+    /*@ typeArgs=C::E* */ foo(this, cmp ?? v);
   }
 
   void barD([int cmp(E a, E b)]) {
@@ -26,12 +26,12 @@
   }
 
   void barE([int cmp(E a, E b)]) {
-    /*@typeArgs=C::E*/ foo(
+    /*@ typeArgs=C::E* */ foo(
         this, cmp /*@target=Object::==*/ == null ? _default : cmp);
   }
 
   void barF([int cmp(E a, E b)]) {
-    /*@typeArgs=C::E*/ foo(
+    /*@ typeArgs=C::E* */ foo(
         this, cmp /*@target=Object::==*/ != null ? cmp : _default);
   }
 
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.legacy.expect b/pkg/front_end/testcases/inference/bug30624.dart.legacy.expect
index 18bd73b..5b40273 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.legacy.expect
@@ -2,32 +2,37 @@
 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>
+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 = null]) → void {
-    self::foo<dynamic>(this, let final dynamic #t1 = cmp in #t1.==(null) ? self::C::_default : #t1);
+  method barA([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, let final dynamic #t1 = cmp in #t1.==(null) ? #C2 : #t1);
   }
-  method barB([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, let final dynamic #t2 = cmp in #t2.==(null) ? self::C::_default as (self::C::E, self::C::E) → core::int : #t2);
+  method barB([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, let final dynamic #t2 = cmp in #t2.==(null) ? (#C2) as (self::C::E*, self::C::E*) →* core::int* : #t2);
   }
-  method barC([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    (self::C::E, self::C::E) → core::int v = self::C::_default;
+  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<dynamic>(this, let final dynamic #t3 = cmp in #t3.==(null) ? v : #t3);
   }
-  method barD([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<self::C::E>(this, let final dynamic #t4 = cmp in #t4.==(null) ? self::C::_default : #t4);
+  method barD([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, let final dynamic #t4 = cmp in #t4.==(null) ? #C2 : #t4);
   }
-  method barE([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, cmp.==(null) ? self::C::_default : cmp);
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, cmp.==(null) ? #C2 : cmp);
   }
-  method barF([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, !cmp.==(null) ? cmp : self::C::_default);
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, !cmp.==(null) ? cmp : #C2);
   }
-  static method _default(dynamic a, dynamic b) → core::int {
+  static method _default(dynamic a, dynamic b) → core::int* {
     return 1.unary-();
   }
 }
-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 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 = tearoff self::C::_default
+}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect
index 18bd73b..5b40273 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.legacy.transformed.expect
@@ -2,32 +2,37 @@
 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>
+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 = null]) → void {
-    self::foo<dynamic>(this, let final dynamic #t1 = cmp in #t1.==(null) ? self::C::_default : #t1);
+  method barA([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, let final dynamic #t1 = cmp in #t1.==(null) ? #C2 : #t1);
   }
-  method barB([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, let final dynamic #t2 = cmp in #t2.==(null) ? self::C::_default as (self::C::E, self::C::E) → core::int : #t2);
+  method barB([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, let final dynamic #t2 = cmp in #t2.==(null) ? (#C2) as (self::C::E*, self::C::E*) →* core::int* : #t2);
   }
-  method barC([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    (self::C::E, self::C::E) → core::int v = self::C::_default;
+  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<dynamic>(this, let final dynamic #t3 = cmp in #t3.==(null) ? v : #t3);
   }
-  method barD([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<self::C::E>(this, let final dynamic #t4 = cmp in #t4.==(null) ? self::C::_default : #t4);
+  method barD([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, let final dynamic #t4 = cmp in #t4.==(null) ? #C2 : #t4);
   }
-  method barE([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, cmp.==(null) ? self::C::_default : cmp);
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, cmp.==(null) ? #C2 : cmp);
   }
-  method barF([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<dynamic>(this, !cmp.==(null) ? cmp : self::C::_default);
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<dynamic>(this, !cmp.==(null) ? cmp : #C2);
   }
-  static method _default(dynamic a, dynamic b) → core::int {
+  static method _default(dynamic a, dynamic b) → core::int* {
     return 1.unary-();
   }
 }
-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 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 = tearoff self::C::_default
+}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
index b89bd19..43831bf 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class C<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::E*>*
     ;
-  method barA([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barA([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  method barB([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barB([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  method barC([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barC([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  method barD([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barD([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  method barE([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  method barF([(self::C::E, self::C::E) → core::int cmp]) → void
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp]) → void
     ;
-  static method _default(dynamic a, dynamic b) → core::int
+  static method _default(dynamic a, dynamic b) → core::int*
     ;
 }
-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 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
   ;
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
index 30ffb21..5f1bb52 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.expect
@@ -2,32 +2,37 @@
 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>
+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 = null]) → 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} self::C::_default : #t1);
+  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 = null]) → 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} self::C::_default as (self::C::E, self::C::E) → core::int : #t2);
+  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 = null]) → void {
-    (self::C::E, self::C::E) → core::int v = self::C::_default;
-    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 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 = null]) → 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} self::C::_default : #t4);
+  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 = null]) → void {
-    self::foo<self::C::E>(this, cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default : cmp);
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, cmp.{core::Object::==}(null) ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : cmp);
   }
-  method barF([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<self::C::E>(this, !cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} cmp : self::C::_default);
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, !cmp.{core::Object::==}(null) ?{(self::C::E*, self::C::E*) →* core::int*} cmp : #C2);
   }
-  static method _default(dynamic a, dynamic b) → core::int {
+  static method _default(dynamic a, dynamic b) → core::int* {
     return 1.{core::int::unary-}();
   }
 }
-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 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 = tearoff self::C::_default
+}
diff --git a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
index 30ffb21..5f1bb52 100644
--- a/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug30624.dart.strong.transformed.expect
@@ -2,32 +2,37 @@
 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>
+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 = null]) → 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} self::C::_default : #t1);
+  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 = null]) → 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} self::C::_default as (self::C::E, self::C::E) → core::int : #t2);
+  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 = null]) → void {
-    (self::C::E, self::C::E) → core::int v = self::C::_default;
-    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 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 = null]) → 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} self::C::_default : #t4);
+  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 = null]) → void {
-    self::foo<self::C::E>(this, cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} self::C::_default : cmp);
+  method barE([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, cmp.{core::Object::==}(null) ?{(self::C::E*, self::C::E*) →* core::int*} #C2 : cmp);
   }
-  method barF([(self::C::E, self::C::E) → core::int cmp = null]) → void {
-    self::foo<self::C::E>(this, !cmp.{core::Object::==}(null) ?{(self::C::E, self::C::E) → core::int} cmp : self::C::_default);
+  method barF([(self::C::E*, self::C::E*) →* core::int* cmp = #C1]) → void {
+    self::foo<self::C::E*>(this, !cmp.{core::Object::==}(null) ?{(self::C::E*, self::C::E*) →* core::int*} cmp : #C2);
   }
-  static method _default(dynamic a, dynamic b) → core::int {
+  static method _default(dynamic a, dynamic b) → core::int* {
     return 1.{core::int::unary-}();
   }
 }
-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 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 = tearoff self::C::_default
+}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart b/pkg/front_end/testcases/inference/bug31132.dart
index 234be9a..d9953e6 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart
+++ b/pkg/front_end/testcases/inference/bug31132.dart
@@ -12,7 +12,7 @@
 }
 
 void test(B x) {
-  var /*@type=C*/ y = x is C ? /*@promotedType=C*/ x : new C();
+  var /*@ type=C* */ y = x is C ? /*@ promotedType=C* */ x : new C();
   print(y. /*@target=C::z*/ z);
 }
 
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect b/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect
index abedb00..a8c4992 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method test(self::B x) → void {
-  dynamic y = x is self::C ? x : new self::C::•();
+static method test(self::B* x) → void {
+  dynamic y = x is self::C* ? x : new self::C::•();
   core::print(y.z);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect
index abedb00..a8c4992 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method test(self::B x) → void {
-  dynamic y = x is self::C ? x : new self::C::•();
+static method test(self::B* x) → void {
+  dynamic y = x is self::C* ? x : new self::C::•();
   core::print(y.z);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.outline.expect b/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
index 25d15a1..efc84bf 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::B {
   field dynamic z;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-static method test(self::B x) → void
+static method test(self::B* x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.strong.expect b/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
index c2d334d..31674c4 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → self::C
+  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::•();
+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});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect
index c2d334d..31674c4 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends self::B {
   field dynamic z = null;
-  synthetic constructor •() → self::C
+  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::•();
+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});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
index 8387b10..3713459 100644
--- a/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug31132.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/bug31132.dart:15:25: Context: Possible promotion of x@318
-  var /*@type=C*/ y = x is C ? /*@promotedType=C*/ x : new C();
-                        ^^
+pkg/front_end/testcases/inference/bug31132.dart:15:28: Context: Possible promotion of x@318
+  var /*@ type=C* */ y = x is C ? /*@ promotedType=C* */ x : new C();
+                           ^^
diff --git a/pkg/front_end/testcases/inference/bug31133.dart b/pkg/front_end/testcases/inference/bug31133.dart
index 4ba0ad7..c9680f4 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart
+++ b/pkg/front_end/testcases/inference/bug31133.dart
@@ -6,7 +6,7 @@
 library test;
 
 void test() {
-  var /*@type=int*/ i = 0;
+  var /*@ type=int* */ i = 0;
   for (i++; i /*@target=num::<*/ < 10; i++) {}
   for (++i; i /*@target=num::<*/ < 10; i++) {}
   for (i--; i /*@target=num::>=*/ >= 0; i--) {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.strong.expect b/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
index f363308..006ace8 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug31133.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::int i = 0;
-  for (final core::int #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  core::int* i = 0;
+  for (final core::int* #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final core::int #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int* #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final core::int #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int* #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
-  for (final core::int #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int* #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
index f363308..006ace8 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31133.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::int i = 0;
-  for (final core::int #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  core::int* i = 0;
+  for (final core::int* #t1 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final core::int #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+  for (final core::int* #t2 = i = i.{core::num::+}(1); i.{core::num::<}(10); i = i.{core::num::+}(1)) {
   }
-  for (final core::int #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int* #t3 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
-  for (final core::int #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
+  for (final core::int* #t4 = i = i.{core::num::-}(1); i.{core::num::>=}(0); i = i.{core::num::-}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
index 51f05ad..a8c2fb5 100644
--- a/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug31133.dart.type_promotion.expect
@@ -1,24 +1,24 @@
-pkg/front_end/testcases/inference/bug31133.dart:10:9: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:10:9: Context: Write to i@299
   for (i++; i /*@target=num::<*/ < 10; i++) {}
         ^^
-pkg/front_end/testcases/inference/bug31133.dart:10:41: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:10:41: Context: Write to i@299
   for (i++; i /*@target=num::<*/ < 10; i++) {}
                                         ^^
-pkg/front_end/testcases/inference/bug31133.dart:11:8: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:11:8: Context: Write to i@299
   for (++i; i /*@target=num::<*/ < 10; i++) {}
        ^^
-pkg/front_end/testcases/inference/bug31133.dart:11:41: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:11:41: Context: Write to i@299
   for (++i; i /*@target=num::<*/ < 10; i++) {}
                                         ^^
-pkg/front_end/testcases/inference/bug31133.dart:12:9: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:12:9: Context: Write to i@299
   for (i--; i /*@target=num::>=*/ >= 0; i--) {}
         ^^
-pkg/front_end/testcases/inference/bug31133.dart:12:42: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:12:42: Context: Write to i@299
   for (i--; i /*@target=num::>=*/ >= 0; i--) {}
                                          ^^
-pkg/front_end/testcases/inference/bug31133.dart:13:8: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:13:8: Context: Write to i@299
   for (--i; i /*@target=num::>=*/ >= 0; i--) {}
        ^^
-pkg/front_end/testcases/inference/bug31133.dart:13:42: Context: Write to i@296
+pkg/front_end/testcases/inference/bug31133.dart:13:42: Context: Write to i@299
   for (--i; i /*@target=num::>=*/ >= 0; i--) {}
                                          ^^
diff --git a/pkg/front_end/testcases/inference/bug31436.dart b/pkg/front_end/testcases/inference/bug31436.dart
index f9c8a7e..4669e5e 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart
+++ b/pkg/front_end/testcases/inference/bug31436.dart
@@ -7,14 +7,14 @@
 
 void block_test() {
   List<Object> Function() g;
-  g = /*@returnType=List<Object>*/ () {
-    return /*@typeArgs=Object*/ [3];
+  g = /*@ returnType=List<Object*>* */ () {
+    return /*@ typeArgs=Object* */ [3];
   };
   assert(g is List<Object> Function());
   assert(g is! List<int> Function());
   g(). /*@target=List::add*/ add("hello"); // No runtime error
-  List<int> l = /*@typeArgs=int*/ [3];
-  g = /*@returnType=List<int>*/ () {
+  List<int> l = /*@ typeArgs=int* */ [3];
+  g = /*@ returnType=List<int*>* */ () {
     return l;
   };
   assert(g is List<Object> Function());
@@ -24,7 +24,7 @@
     throw 'expected a runtime error';
   } on TypeError {}
   Object o = l;
-  g = /*@returnType=List<Object>*/ () {
+  g = /*@ returnType=List<Object*>* */ () {
     return o;
   }; // No implicit downcast on the assignment, implicit downcast on the return
   assert(g is List<Object> Function());
@@ -40,12 +40,12 @@
 
 void arrow_test() {
   List<Object> Function() g;
-  g = /*@returnType=List<Object>*/ () => /*@typeArgs=Object*/ [3];
+  g = /*@ returnType=List<Object*>* */ () => /*@ typeArgs=Object* */ [3];
   assert(g is List<Object> Function());
   assert(g is! List<int> Function());
   g(). /*@target=List::add*/ add("hello"); // No runtime error
-  List<int> l = /*@typeArgs=int*/ [3];
-  g = /*@returnType=List<int>*/ () => l;
+  List<int> l = /*@ typeArgs=int* */ [3];
+  g = /*@ returnType=List<int*>* */ () => l;
   assert(g is List<Object> Function());
   assert(g is List<int> Function());
   try {
@@ -53,7 +53,7 @@
     throw 'expected a runtime error';
   } on TypeError {}
   Object o = l;
-  g = /*@returnType=List<Object>*/ () =>
+  g = /*@ returnType=List<Object*>* */ () =>
       o; // No implicit downcast on the assignment, implicit downcast on the return
   assert(g is List<Object> Function());
   assert(g is! List<int> Function());
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.legacy.expect b/pkg/front_end/testcases/inference/bug31436.dart.legacy.expect
index e52bb02..836528e 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug31436.dart.legacy.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 static method block_test() → void {
-  () → core::List<core::Object> g;
+  () →* core::List<core::Object*>* g;
   g = () → dynamic {
     return <dynamic>[3];
   };
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().add("hello");
-  core::List<core::int> l = <dynamic>[3];
+  core::List<core::int*>* l = <dynamic>[3];
   g = () → dynamic {
     return l;
   };
-  assert(g is () → core::List<core::Object>);
-  assert(g is () → core::List<core::int>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().add("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
+  core::Object* o = l;
   g = () → dynamic {
     return o;
   };
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
-  assert(!(g is () → core::Object));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method arrow_test() → void {
-  () → core::List<core::Object> g;
+  () →* core::List<core::Object*>* g;
   g = () → dynamic => <dynamic>[3];
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().add("hello");
-  core::List<core::int> l = <dynamic>[3];
+  core::List<core::int*>* l = <dynamic>[3];
   g = () → dynamic => l;
-  assert(g is () → core::List<core::Object>);
-  assert(g is () → core::List<core::int>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().add("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
+  core::Object* o = l;
   g = () → dynamic => o;
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
-  assert(!(g is () → core::Object));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect
index e52bb02..836528e 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31436.dart.legacy.transformed.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 static method block_test() → void {
-  () → core::List<core::Object> g;
+  () →* core::List<core::Object*>* g;
   g = () → dynamic {
     return <dynamic>[3];
   };
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().add("hello");
-  core::List<core::int> l = <dynamic>[3];
+  core::List<core::int*>* l = <dynamic>[3];
   g = () → dynamic {
     return l;
   };
-  assert(g is () → core::List<core::Object>);
-  assert(g is () → core::List<core::int>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().add("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
+  core::Object* o = l;
   g = () → dynamic {
     return o;
   };
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
-  assert(!(g is () → core::Object));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method arrow_test() → void {
-  () → core::List<core::Object> g;
+  () →* core::List<core::Object*>* g;
   g = () → dynamic => <dynamic>[3];
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().add("hello");
-  core::List<core::int> l = <dynamic>[3];
+  core::List<core::int*>* l = <dynamic>[3];
   g = () → dynamic => l;
-  assert(g is () → core::List<core::Object>);
-  assert(g is () → core::List<core::int>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().add("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
+  core::Object* o = l;
   g = () → dynamic => o;
-  assert(g is () → core::List<core::Object>);
-  assert(!(g is () → core::List<core::int>));
-  assert(!(g is () → core::Object));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.strong.expect b/pkg/front_end/testcases/inference/bug31436.dart.strong.expect
index 1f2d373..e1194d4 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug31436.dart.strong.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 static method block_test() → void {
-  () → core::List<core::Object> g;
-  g = () → core::List<core::Object> {
-    return <core::Object>[3];
+  () →* 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>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().{core::List::add}("hello");
-  core::List<core::int> l = <core::int>[3];
-  g = () → core::List<core::int> {
+  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>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().{core::List::add}("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
-  g = () → core::List<core::Object> {
-    return o as{TypeError} core::List<core::Object>;
+  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));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  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>));
+  () →* 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.call().{core::List::add}("hello");
-  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>);
+  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.call().{core::List::add}("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  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));
+  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.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug31436.dart.strong.transformed.expect
index 1f2d373..e1194d4 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug31436.dart.strong.transformed.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 static method block_test() → void {
-  () → core::List<core::Object> g;
-  g = () → core::List<core::Object> {
-    return <core::Object>[3];
+  () →* 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>));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
   g.call().{core::List::add}("hello");
-  core::List<core::int> l = <core::int>[3];
-  g = () → core::List<core::int> {
+  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>);
+  assert(g is () →* core::List<core::Object*>*);
+  assert(g is () →* core::List<core::int*>*);
   try {
     g.call().{core::List::add}("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
-  core::Object o = l;
-  g = () → core::List<core::Object> {
-    return o as{TypeError} core::List<core::Object>;
+  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));
+  assert(g is () →* core::List<core::Object*>*);
+  assert(!(g is () →* core::List<core::int*>*));
+  assert(!(g is () →* core::Object*));
   g.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  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>));
+  () →* 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.call().{core::List::add}("hello");
-  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>);
+  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.call().{core::List::add}("hello");
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  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));
+  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.call();
   o = 3;
   try {
     g.call();
     throw "expected a runtime error";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect b/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
index c01ee24..d7cbb44 100644
--- a/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/bug31436.dart.type_promotion.expect
@@ -1,11 +1,11 @@
 pkg/front_end/testcases/inference/bug31436.dart:10:5: Context: Write to g@308
-  g = /*@returnType=List<Object>*/ () {
+  g = /*@ returnType=List<Object*>* */ () {
     ^
 pkg/front_end/testcases/inference/bug31436.dart:13:12: Context: Possible promotion of g@308
   assert(g is List<Object> Function());
            ^^
 pkg/front_end/testcases/inference/bug31436.dart:17:5: Context: Write to g@308
-  g = /*@returnType=List<int>*/ () {
+  g = /*@ returnType=List<int*>* */ () {
     ^
 pkg/front_end/testcases/inference/bug31436.dart:20:12: Context: Possible promotion of g@308
   assert(g is List<Object> Function());
@@ -14,35 +14,35 @@
   assert(g is List<int> Function());
            ^^
 pkg/front_end/testcases/inference/bug31436.dart:27:5: Context: Write to g@308
-  g = /*@returnType=List<Object>*/ () {
+  g = /*@ returnType=List<Object*>* */ () {
     ^
 pkg/front_end/testcases/inference/bug31436.dart:30:12: Context: Possible promotion of g@308
   assert(g is List<Object> Function());
            ^^
-pkg/front_end/testcases/inference/bug31436.dart:34:5: Context: Write to o@843
+pkg/front_end/testcases/inference/bug31436.dart:34:5: Context: Write to o@857
   o = 3;
     ^
-pkg/front_end/testcases/inference/bug31436.dart:43:5: Context: Write to g@1305
-  g = /*@returnType=List<Object>*/ () => /*@typeArgs=Object*/ [3];
+pkg/front_end/testcases/inference/bug31436.dart:43:5: Context: Write to g@1323
+  g = /*@ returnType=List<Object*>* */ () => /*@ typeArgs=Object* */ [3];
     ^
-pkg/front_end/testcases/inference/bug31436.dart:44:12: Context: Possible promotion of g@1305
+pkg/front_end/testcases/inference/bug31436.dart:44:12: Context: Possible promotion of g@1323
   assert(g is List<Object> Function());
            ^^
-pkg/front_end/testcases/inference/bug31436.dart:48:5: Context: Write to g@1305
-  g = /*@returnType=List<int>*/ () => l;
+pkg/front_end/testcases/inference/bug31436.dart:48:5: Context: Write to g@1323
+  g = /*@ returnType=List<int*>* */ () => l;
     ^
-pkg/front_end/testcases/inference/bug31436.dart:49:12: Context: Possible promotion of g@1305
+pkg/front_end/testcases/inference/bug31436.dart:49:12: Context: Possible promotion of g@1323
   assert(g is List<Object> Function());
            ^^
-pkg/front_end/testcases/inference/bug31436.dart:50:12: Context: Possible promotion of g@1305
+pkg/front_end/testcases/inference/bug31436.dart:50:12: Context: Possible promotion of g@1323
   assert(g is List<int> Function());
            ^^
-pkg/front_end/testcases/inference/bug31436.dart:56:5: Context: Write to g@1305
-  g = /*@returnType=List<Object>*/ () =>
+pkg/front_end/testcases/inference/bug31436.dart:56:5: Context: Write to g@1323
+  g = /*@ returnType=List<Object*>* */ () =>
     ^
-pkg/front_end/testcases/inference/bug31436.dart:58:12: Context: Possible promotion of g@1305
+pkg/front_end/testcases/inference/bug31436.dart:58:12: Context: Possible promotion of g@1323
   assert(g is List<Object> Function());
            ^^
-pkg/front_end/testcases/inference/bug31436.dart:62:5: Context: Write to o@1810
+pkg/front_end/testcases/inference/bug31436.dart:62:5: Context: Write to o@1842
   o = 3;
     ^
diff --git a/pkg/front_end/testcases/inference/bug32291.dart b/pkg/front_end/testcases/inference/bug32291.dart
index d3a62f5..e325f33 100644
--- a/pkg/front_end/testcases/inference/bug32291.dart
+++ b/pkg/front_end/testcases/inference/bug32291.dart
@@ -6,16 +6,16 @@
 library test;
 
 void main() {
-  var /*@type=List<List<String>>*/ l = /*@typeArgs=List<String>*/ [
-    /*@typeArgs=String*/ ["hi", "world"]
+  var /*@ type=List<List<String*>*>* */ l = /*@ typeArgs=List<String*>* */ [
+    /*@ typeArgs=String* */ ["hi", "world"]
   ];
-  var /*@type=Iterable<List<String>>*/ i1 =
-      l. /*@target=Iterable::map*/ /*@typeArgs=List<String>*/ map(
-          /*@returnType=List<String>*/ (/*@type=List<String>*/ ll) =>
-              ll ?? /*@typeArgs=String*/ []);
-  var /*@type=Iterable<int>*/ i2 =
-      i1. /*@target=Iterable::map*/ /*@typeArgs=int*/ map(
-          /*@returnType=int*/ (List<String> l) =>
+  var /*@ type=Iterable<List<String*>*>* */ i1 =
+      l. /*@target=Iterable::map*/ /*@ typeArgs=List<String*>* */ map(
+          /*@ returnType=List<String*>* */ (/*@ type=List<String*>* */ ll) =>
+              ll ?? /*@ typeArgs=String* */ []);
+  var /*@ type=Iterable<int*>* */ i2 =
+      i1. /*@target=Iterable::map*/ /*@ typeArgs=int* */ map(
+          /*@ returnType=int* */ (List<String> l) =>
               l. /*@target=List::length*/ length);
   print(i2);
 }
diff --git a/pkg/front_end/testcases/inference/bug32291.dart.strong.expect b/pkg/front_end/testcases/inference/bug32291.dart.strong.expect
index 6193515..6c30ca4 100644
--- a/pkg/front_end/testcases/inference/bug32291.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug32291.dart.strong.expect
@@ -3,8 +3,8 @@
 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::Iterable<core::int> i2 = i1.{core::Iterable::map}<core::int>((core::List<core::String> l) → core::int => l.{core::List::length});
+  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::Iterable<core::int*>* i2 = i1.{core::Iterable::map}<core::int*>((core::List<core::String*>* l) → core::int* => l.{core::List::length});
   core::print(i2);
 }
diff --git a/pkg/front_end/testcases/inference/bug32291.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug32291.dart.strong.transformed.expect
index 6193515..6c30ca4 100644
--- a/pkg/front_end/testcases/inference/bug32291.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug32291.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 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::Iterable<core::int> i2 = i1.{core::Iterable::map}<core::int>((core::List<core::String> l) → core::int => l.{core::List::length});
+  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::Iterable<core::int*>* i2 = i1.{core::Iterable::map}<core::int*>((core::List<core::String*>* l) → core::int* => l.{core::List::length});
   core::print(i2);
 }
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.legacy.expect b/pkg/front_end/testcases/inference/bug33324.dart.legacy.expect
index 2e1ecb9..7ebbee7 100644
--- a/pkg/front_end/testcases/inference/bug33324.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/bug33324.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo() → core::int {
-  core::Function f = (dynamic x) → dynamic => x;
+static method foo() → core::int* {
+  core::Function* f = (dynamic x) → dynamic => x;
   dynamic l = <dynamic>["bar"].map(f).toList();
   l.add(42);
   return l.first.length;
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect
index 2e1ecb9..7ebbee7 100644
--- a/pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug33324.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo() → core::int {
-  core::Function f = (dynamic x) → dynamic => x;
+static method foo() → core::int* {
+  core::Function* f = (dynamic x) → dynamic => x;
   dynamic l = <dynamic>["bar"].map(f).toList();
   l.add(42);
   return l.first.length;
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.outline.expect b/pkg/front_end/testcases/inference/bug33324.dart.outline.expect
index 06c9cfc..3270f29 100644
--- a/pkg/front_end/testcases/inference/bug33324.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/bug33324.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo() → core::int
+static method foo() → core::int*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.strong.expect b/pkg/front_end/testcases/inference/bug33324.dart.strong.expect
index f88135b..b1e4298 100644
--- a/pkg/front_end/testcases/inference/bug33324.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/bug33324.dart.strong.expect
@@ -2,10 +2,10 @@
 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::Iterable::toList}();
+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::Iterable::toList}();
   l.{core::List::add}(42);
-  return l.{core::Iterable::first}.length as{TypeError} core::int;
+  return l.{core::Iterable::first}.length as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect
index f88135b..b1e4298 100644
--- a/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/bug33324.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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::Iterable::toList}();
+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::Iterable::toList}();
   l.{core::List::add}(42);
-  return l.{core::Iterable::first}.length as{TypeError} core::int;
+  return l.{core::Iterable::first}.length as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart b/pkg/front_end/testcases/inference/call_corner_cases.dart
index 5504669..adec831 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart
@@ -21,11 +21,11 @@
 }
 
 test() {
-  var /*@type=int*/ callA = new A() /*@target=A::call*/ ();
-  var /*@type=int*/ callFieldA = new D(). /*@target=D::fieldA*/ fieldA();
-  var /*@type=int*/ callGetA = new D(). /*@target=D::getA*/ getA();
-  var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
-  var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
+  var /*@ type=int* */ callA = new A() /*@target=A::call*/ ();
+  var /*@ type=int* */ callFieldA = new D(). /*@target=D::fieldA*/ fieldA();
+  var /*@ type=int* */ callGetA = new D(). /*@target=D::getA*/ getA();
+  var /*@ type=dynamic */ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+  var /*@ type=dynamic */ callGetB = new D(). /*@target=D::getB*/ getB();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect
index 5941e27..95b8a8a 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get call() → self::A
+  get call() → self::A*
     return new self::A::•();
 }
 class D extends core::Object {
-  field self::A fieldA = new self::A::•();
-  field self::B fieldB = new self::B::•();
-  synthetic constructor •() → self::D
+  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
+  get getA() → self::A*
     return new self::A::•();
-  get getB() → self::B
+  get getB() → self::B*
     return new self::B::•();
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect
index 5941e27..95b8a8a 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.legacy.transformed.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get call() → self::A
+  get call() → self::A*
     return new self::A::•();
 }
 class D extends core::Object {
-  field self::A fieldA = new self::A::•();
-  field self::B fieldB = new self::B::•();
-  synthetic constructor •() → self::D
+  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
+  get getA() → self::A*
     return new self::A::•();
-  get getB() → self::B
+  get getB() → self::B*
     return new self::B::•();
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.outline.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.outline.expect
index dfaccdc..0f1865b 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.outline.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method call() → core::int
+  method call() → core::int*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get call() → self::A
+  get call() → self::A*
     ;
 }
 class D extends core::Object {
-  field self::A fieldA;
-  field self::B fieldB;
-  synthetic constructor •() → self::D
+  field self::A* fieldA;
+  field self::B* fieldB;
+  synthetic constructor •() → self::D*
     ;
-  get getA() → self::A
+  get getA() → self::A*
     ;
-  get getB() → self::B
+  get getB() → self::B*
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
index 3c29fc6..c3a99bc 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.expect
@@ -2,51 +2,51 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/call_corner_cases.dart:27:69: Error: 'fieldB' isn't a function or method and can't be invoked.
-//   var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
-//                                                                     ^
+// pkg/front_end/testcases/inference/call_corner_cases.dart:27:71: Error: 'fieldB' isn't a function or method and can't be invoked.
+//   var /*@ type=dynamic */ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+//                                                                       ^
 //
-// pkg/front_end/testcases/inference/call_corner_cases.dart:28:65: Error: 'getB' isn't a function or method and can't be invoked.
-//   var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
-//                                                                 ^
+// pkg/front_end/testcases/inference/call_corner_cases.dart:28:67: Error: 'getB' isn't a function or method and can't be invoked.
+//   var /*@ type=dynamic */ callGetB = new D(). /*@target=D::getB*/ getB();
+//                                                                   ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get call() → self::A
+  get call() → self::A*
     return new self::A::•();
 }
 class D extends core::Object {
-  field self::A fieldA = new self::A::•();
-  field self::B fieldB = new self::B::•();
-  synthetic constructor •() → self::D
+  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
+  get getA() → self::A*
     return new self::A::•();
-  get getB() → self::B
+  get getB() → self::B*
     return new self::B::•();
 }
 static method test() → dynamic {
-  core::int callA = new self::A::•().{self::A::call}();
-  core::int callFieldA = new self::D::•().{self::D::fieldA}();
-  core::int callGetA = new self::D::•().{self::D::getA}();
-  dynamic callFieldB = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:27:69: Error: 'fieldB' isn't a function or method and can't be invoked.
-  var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
-                                                                    ^" in new self::D::•().{self::D::fieldB}();
-  dynamic callGetB = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:28:65: Error: 'getB' isn't a function or method and can't be invoked.
-  var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
-                                                                ^" in new self::D::•().{self::D::getB}();
+  core::int* callA = new self::A::•().{self::A::call}();
+  core::int* callFieldA = new self::D::•().{self::D::fieldA}();
+  core::int* callGetA = new self::D::•().{self::D::getA}();
+  dynamic callFieldB = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:27:71: Error: 'fieldB' isn't a function or method and can't be invoked.
+  var /*@ type=dynamic */ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+                                                                      ^" in new self::D::•().{self::D::fieldB}();
+  dynamic callGetB = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:28:67: Error: 'getB' isn't a function or method and can't be invoked.
+  var /*@ type=dynamic */ callGetB = new D(). /*@target=D::getB*/ getB();
+                                                                  ^" in new self::D::•().{self::D::getB}();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.transformed.expect
index 3c29fc6..c3a99bc 100644
--- a/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/call_corner_cases.dart.strong.transformed.expect
@@ -2,51 +2,51 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/call_corner_cases.dart:27:69: Error: 'fieldB' isn't a function or method and can't be invoked.
-//   var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
-//                                                                     ^
+// pkg/front_end/testcases/inference/call_corner_cases.dart:27:71: Error: 'fieldB' isn't a function or method and can't be invoked.
+//   var /*@ type=dynamic */ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+//                                                                       ^
 //
-// pkg/front_end/testcases/inference/call_corner_cases.dart:28:65: Error: 'getB' isn't a function or method and can't be invoked.
-//   var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
-//                                                                 ^
+// pkg/front_end/testcases/inference/call_corner_cases.dart:28:67: Error: 'getB' isn't a function or method and can't be invoked.
+//   var /*@ type=dynamic */ callGetB = new D(). /*@target=D::getB*/ getB();
+//                                                                   ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get call() → self::A
+  get call() → self::A*
     return new self::A::•();
 }
 class D extends core::Object {
-  field self::A fieldA = new self::A::•();
-  field self::B fieldB = new self::B::•();
-  synthetic constructor •() → self::D
+  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
+  get getA() → self::A*
     return new self::A::•();
-  get getB() → self::B
+  get getB() → self::B*
     return new self::B::•();
 }
 static method test() → dynamic {
-  core::int callA = new self::A::•().{self::A::call}();
-  core::int callFieldA = new self::D::•().{self::D::fieldA}();
-  core::int callGetA = new self::D::•().{self::D::getA}();
-  dynamic callFieldB = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:27:69: Error: 'fieldB' isn't a function or method and can't be invoked.
-  var /*@type=dynamic*/ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
-                                                                    ^" in new self::D::•().{self::D::fieldB}();
-  dynamic callGetB = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:28:65: Error: 'getB' isn't a function or method and can't be invoked.
-  var /*@type=dynamic*/ callGetB = new D(). /*@target=D::getB*/ getB();
-                                                                ^" in new self::D::•().{self::D::getB}();
+  core::int* callA = new self::A::•().{self::A::call}();
+  core::int* callFieldA = new self::D::•().{self::D::fieldA}();
+  core::int* callGetA = new self::D::•().{self::D::getA}();
+  dynamic callFieldB = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:27:71: Error: 'fieldB' isn't a function or method and can't be invoked.
+  var /*@ type=dynamic */ callFieldB = new D(). /*@target=D::fieldB*/ fieldB();
+                                                                      ^" in new self::D::•().{self::D::fieldB}();
+  dynamic callGetB = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/call_corner_cases.dart:28:67: Error: 'getB' isn't a function or method and can't be invoked.
+  var /*@ type=dynamic */ callGetB = new D(). /*@target=D::getB*/ getB();
+                                                                  ^" in new self::D::•().{self::D::getB}();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
index 0423f11..5860845 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.expect
@@ -2,26 +2,30 @@
 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>
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
     : super core::Object::•()
     ;
-  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P* value = #C1]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → self::FooActions
+  synthetic constructor •() → self::FooActions*
     : super core::Object::•()
     ;
-  get foo() → self::ActionDispatcher<self::Bar>
-    return new self::ActionDispatcher::•<self::Bar>();
+  get foo() → self::ActionDispatcher<self::Bar*>*
+    return new self::ActionDispatcher::•<self::Bar*>();
 }
 static method main() → void {
   new self::FooActions::•().foo(new self::Bar::•());
   new self::FooActions::•().foo.call(new self::Bar::•());
   new self::FooActions::•().foo.call(new self::Bar::•());
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
index 0423f11..5860845 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.legacy.transformed.expect
@@ -2,26 +2,30 @@
 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>
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
     : super core::Object::•()
     ;
-  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P* value = #C1]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → self::FooActions
+  synthetic constructor •() → self::FooActions*
     : super core::Object::•()
     ;
-  get foo() → self::ActionDispatcher<self::Bar>
-    return new self::ActionDispatcher::•<self::Bar>();
+  get foo() → self::ActionDispatcher<self::Bar*>*
+    return new self::ActionDispatcher::•<self::Bar*>();
 }
 static method main() → void {
   new self::FooActions::•().foo(new self::Bar::•());
   new self::FooActions::•().foo.call(new self::Bar::•());
   new self::FooActions::•().foo.call(new self::Bar::•());
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
index 013bfca..0d2ffd0 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.outline.expect
@@ -2,20 +2,20 @@
 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>
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
     ;
-  method call([generic-covariant-impl self::ActionDispatcher::P value]) → void
+  method call([generic-covariant-impl self::ActionDispatcher::P* value]) → void
     ;
 }
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → self::FooActions
+  synthetic constructor •() → self::FooActions*
     ;
-  get foo() → self::ActionDispatcher<self::Bar>
+  get foo() → self::ActionDispatcher<self::Bar*>*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
index d25caeb..506525f 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.expect
@@ -2,26 +2,30 @@
 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>
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
     : super core::Object::•()
     ;
-  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P* value = #C1]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → self::FooActions
+  synthetic constructor •() → self::FooActions*
     : super core::Object::•()
     ;
-  get foo() → self::ActionDispatcher<self::Bar>
-    return new self::ActionDispatcher::•<self::Bar>();
+  get foo() → self::ActionDispatcher<self::Bar*>*
+    return new self::ActionDispatcher::•<self::Bar*>();
 }
 static method main() → void {
   new self::FooActions::•().{self::FooActions::foo}(new self::Bar::•());
   new self::FooActions::•().{self::FooActions::foo}.{self::ActionDispatcher::call}(new self::Bar::•());
   new self::FooActions::•().{self::FooActions::foo}.{self::ActionDispatcher::call}(new self::Bar::•());
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
index d25caeb..506525f 100644
--- a/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/callable_generic_class.dart.strong.transformed.expect
@@ -2,26 +2,30 @@
 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>
+class ActionDispatcher<P extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::ActionDispatcher<self::ActionDispatcher::P*>*
     : super core::Object::•()
     ;
-  method call([generic-covariant-impl self::ActionDispatcher::P value = null]) → void {}
+  method call([generic-covariant-impl self::ActionDispatcher::P* value = #C1]) → void {}
 }
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
 class FooActions extends core::Object {
-  synthetic constructor •() → self::FooActions
+  synthetic constructor •() → self::FooActions*
     : super core::Object::•()
     ;
-  get foo() → self::ActionDispatcher<self::Bar>
-    return new self::ActionDispatcher::•<self::Bar>();
+  get foo() → self::ActionDispatcher<self::Bar*>*
+    return new self::ActionDispatcher::•<self::Bar*>();
 }
 static method main() → void {
   new self::FooActions::•().{self::FooActions::foo}(new self::Bar::•());
   new self::FooActions::•().{self::FooActions::foo}.{self::ActionDispatcher::call}(new self::Bar::•());
   new self::FooActions::•().{self::FooActions::foo}.{self::ActionDispatcher::call}(new self::Bar::•());
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect
index f6fc387..2e54f4d 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect
index f6fc387..2e54f4d 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.legacy.transformed.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
index 10e9611..6b2e1ca 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.outline.expect
@@ -14,12 +14,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   abstract method f(dynamic x) → dynamic;
 }
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
index f6fc387..2e54f4d 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
diff --git a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
index f6fc387..2e54f4d 100644
--- a/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_method_inference.dart.strong.transformed.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method f(dynamic x) → dynamic;
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
index 69efb53..6d00e3a 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@returnType=() -> invalid-type*/ () => y;
-var y = /*@returnType=invalid-type*/ () => x;
+var x = /*@ returnType=() ->* invalid-type */ () => y;
+var y = /*@ returnType=invalid-type */ () => x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
index bd67e53..d1e47f9 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.expect
@@ -4,11 +4,11 @@
 //
 // 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;
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
 //     ^
 //
 import self as self;
 
-static field invalid-type x = (() → () → invalid-type => self::y) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
+static field invalid-type x = (() → () →* invalid-type => self::y) as{TypeError} invalid-type;
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
index bd67e53..d1e47f9 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures.dart.strong.transformed.expect
@@ -4,11 +4,11 @@
 //
 // 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;
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
 //     ^
 //
 import self as self;
 
-static field invalid-type x = (() → () → invalid-type => self::y) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
+static field invalid-type x = (() → () →* invalid-type => self::y) as{TypeError} invalid-type;
+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 b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
index 69efb53..6d00e3a 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@returnType=() -> invalid-type*/ () => y;
-var y = /*@returnType=invalid-type*/ () => x;
+var x = /*@ returnType=() ->* invalid-type */ () => y;
+var y = /*@ returnType=invalid-type */ () => x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
index 88a970d..758e00e 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.expect
@@ -4,11 +4,11 @@
 //
 // 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;
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
 //     ^
 //
 import self as self;
 
-static field invalid-type x = (() → () → invalid-type => self::y) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
+static field invalid-type x = (() → () →* invalid-type => self::y) as{TypeError} invalid-type;
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
index 88a970d..758e00e 100644
--- a/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/circular_reference_via_closures_initializer_types.dart.strong.transformed.expect
@@ -4,11 +4,11 @@
 //
 // 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;
+// var x = /*@ returnType=() ->* invalid-type */ () => y;
 //     ^
 //
 import self as self;
 
-static field invalid-type x = (() → () → invalid-type => self::y) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
+static field invalid-type x = (() → () →* invalid-type => self::y) as{TypeError} invalid-type;
+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 b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart
index 1226b8d..3a6055e 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart
@@ -6,7 +6,7 @@
 library test;
 
 void test() {
-  int Function(Null) f = /*@returnType=int*/ (/*@type=Object*/ x) => 1;
+  int Function(Null) f = /*@ returnType=int* */ (/*@ type=Object* */ x) => 1;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect
index 2a82c25..2ed9055 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null) → core::int f = (dynamic x) → dynamic => 1;
+  (core::Null*) →* core::int* f = (dynamic x) → dynamic => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect
index 2a82c25..2ed9055 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.legacy.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null) → core::int f = (dynamic x) → dynamic => 1;
+  (core::Null*) →* core::int* f = (dynamic x) → dynamic => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
index 8bc94ac..0bd9702 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null) → core::int f = (core::Object x) → core::int => 1;
+  (core::Null*) →* core::int* f = (core::Object* x) → core::int* => 1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
index 8bc94ac..0bd9702 100644
--- a/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/closure_param_null_to_object.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method test() → void {
-  (core::Null) → core::int f = (core::Object x) → core::int => 1;
+  (core::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 b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
index 3e2f6e2..45cfec1 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart
@@ -6,20 +6,20 @@
 library test;
 
 f() {
-  var /*@type=int*/ a = 0;
-  var /*@type=dynamic*/ b = null;
-  var /*@type=dynamic*/ c = throw 'foo';
-  var /*@type=() -> int*/ d = /*@returnType=int*/ () => 0;
-  var /*@type=() -> Null*/ e = /*@returnType=Null*/ () => null;
-  var /*@type=() -> <BottomType>*/ f = /*@returnType=<BottomType>*/ () =>
+  var /*@ type=int* */ a = 0;
+  var /*@ type=dynamic */ b = null;
+  var /*@ type=dynamic */ c = throw 'foo';
+  var /*@ type=() ->* int* */ d = /*@ returnType=int* */ () => 0;
+  var /*@ type=() ->* Null* */ e = /*@ returnType=Null* */ () => null;
+  var /*@ type=() ->* <BottomType> */ f = /*@ returnType=<BottomType> */ () =>
       throw 'foo';
-  var /*@type=() -> int*/ g = /*@returnType=int*/ () {
+  var /*@ type=() ->* int* */ g = /*@ returnType=int* */ () {
     return 0;
   };
-  var /*@type=() -> Null*/ h = /*@returnType=Null*/ () {
+  var /*@ type=() ->* Null* */ h = /*@ returnType=Null* */ () {
     return null;
   };
-  var /*@type=() -> <BottomType>*/ i = /*@returnType=<BottomType>*/ () {
+  var /*@ type=() ->* <BottomType> */ i = /*@ returnType=<BottomType> */ () {
     return (throw 'foo');
   };
 }
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
index 5f679a5..a4811d3 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::int a = 0;
+  core::int* a = 0;
   dynamic b = null;
   dynamic c = throw "foo";
-  () → core::int d = () → core::int => 0;
-  () → core::Null e = () → core::Null => null;
-  () → <BottomType>f = () → <BottomType>=> throw "foo";
-  () → core::int g = () → core::int {
+  () →* core::int* d = () → core::int* => 0;
+  () →* core::Null* e = () → core::Null* => null;
+  () →* <BottomType>f = () → <BottomType>=> throw "foo";
+  () →* core::int* g = () → core::int* {
     return 0;
   };
-  () → core::Null h = () → core::Null {
+  () →* core::Null* h = () → core::Null* {
     return null;
   };
-  () → <BottomType>i = () → <BottomType>{
+  () →* <BottomType>i = () → <BottomType>{
     return throw "foo";
   };
 }
diff --git a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
index 5f679a5..a4811d3 100644
--- a/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/coerce_bottom_and_null_types.dart.strong.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::int a = 0;
+  core::int* a = 0;
   dynamic b = null;
   dynamic c = throw "foo";
-  () → core::int d = () → core::int => 0;
-  () → core::Null e = () → core::Null => null;
-  () → <BottomType>f = () → <BottomType>=> throw "foo";
-  () → core::int g = () → core::int {
+  () →* core::int* d = () → core::int* => 0;
+  () →* core::Null* e = () → core::Null* => null;
+  () →* <BottomType>f = () → <BottomType>=> throw "foo";
+  () →* core::int* g = () → core::int* {
     return 0;
   };
-  () → core::Null h = () → core::Null {
+  () →* core::Null* h = () → core::Null* {
     return null;
   };
-  () → <BottomType>i = () → <BottomType>{
+  () →* <BottomType>i = () → <BottomType>{
     return throw "foo";
   };
 }
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart b/pkg/front_end/testcases/inference/complex_predecrement.dart
index db7ff41..ed84362 100644
--- a/pkg/front_end/testcases/inference/complex_predecrement.dart
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart
@@ -6,6 +6,6 @@
 library test;
 
 main() {
-  var /*@type=List<int>*/ foo = /*@typeArgs=int*/ [1, 2, 3];
+  var /*@ type=List<int*>* */ foo = /*@ typeArgs=int* */ [1, 2, 3];
   print(--foo /*@target=List::[]=*/ [0]);
 }
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.expect
index 4b3e283..7008291 100644
--- a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.expect
@@ -3,6 +3,6 @@
 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::num::-}(1) in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3);
+  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::num::-}(1) in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3);
 }
diff --git a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
index 4b3e283..7008291 100644
--- a/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/complex_predecrement.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 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::num::-}(1) in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3);
+  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::num::-}(1) in let final void #t4 = #t1.{core::List::[]=}(#t2, #t3) in #t3);
 }
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart b/pkg/front_end/testcases/inference/conditional_lub.dart
index a6b43a6..bd12b1b 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart
@@ -11,5 +11,5 @@
 var z = b ? x : y;
 
 main() {
-  var /*@type=num*/ z = b ? x : y;
+  var /*@ type=num* */ z = b ? x : y;
 }
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect
index 42ba544..6c395be 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.expect
@@ -2,9 +2,9 @@
 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::bool* b = true;
+static field core::int* x = 0;
+static field core::double* y = 0.0;
 static field dynamic z = self::b ? self::x : self::y;
 static method main() → dynamic {
   dynamic z = self::b ? self::x : self::y;
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect
index 42ba544..6c395be 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 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::bool* b = true;
+static field core::int* x = 0;
+static field core::double* y = 0.0;
 static field dynamic z = self::b ? self::x : self::y;
 static method main() → dynamic {
   dynamic z = self::b ? self::x : self::y;
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
index 4276893..caf7760 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool b;
-static field core::int x;
-static field core::double y;
+static field core::bool* b;
+static field core::int* x;
+static field core::double* y;
 static field dynamic z;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.strong.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.strong.expect
index 2de4bbec..0d65f10 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.strong.expect
@@ -2,10 +2,10 @@
 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 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;
+  core::num* z = self::b ?{core::num*} self::x : self::y;
 }
diff --git a/pkg/front_end/testcases/inference/conditional_lub.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conditional_lub.dart.strong.transformed.expect
index 2de4bbec..0d65f10 100644
--- a/pkg/front_end/testcases/inference/conditional_lub.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_lub.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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 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;
+  core::num* z = self::b ?{core::num*} self::x : self::y;
 }
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart
index f31287b..108c421 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart
@@ -11,9 +11,9 @@
 
 main() {
   bool b = false;
-  List<int> l1 = /*@typeArgs=int*/ [1];
-  List<int> l2 = /*@typeArgs=int*/ [2];
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(l1);
-  var /*@type=C<int>*/ y = new /*@typeArgs=int*/ C(l2);
-  var /*@type=C<int>*/ z = new /*@typeArgs=int*/ C(b ? l1 : l2);
+  List<int> l1 = /*@ typeArgs=int* */ [1];
+  List<int> l2 = /*@ typeArgs=int* */ [2];
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(l1);
+  var /*@ type=C<int*>* */ y = new /*@ typeArgs=int* */ C(l2);
+  var /*@ type=C<int*>* */ z = new /*@ typeArgs=int* */ C(b ? l1 : l2);
 }
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect
index 84ea8fc..5f57472 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
 static method main() → dynamic {
-  core::bool b = false;
-  core::List<core::int> l1 = <dynamic>[1];
-  core::List<core::int> l2 = <dynamic>[2];
+  core::bool* b = false;
+  core::List<core::int*>* l1 = <dynamic>[1];
+  core::List<core::int*>* l2 = <dynamic>[2];
   dynamic x = new self::C::•<dynamic>(l1);
   dynamic y = new self::C::•<dynamic>(l2);
   dynamic z = new self::C::•<dynamic>(b ? l1 : l2);
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect
index 84ea8fc..5f57472 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
 static method main() → dynamic {
-  core::bool b = false;
-  core::List<core::int> l1 = <dynamic>[1];
-  core::List<core::int> l2 = <dynamic>[2];
+  core::bool* b = false;
+  core::List<core::int*>* l1 = <dynamic>[1];
+  core::List<core::int*>* l2 = <dynamic>[2];
   dynamic x = new self::C::•<dynamic>(l1);
   dynamic y = new self::C::•<dynamic>(l2);
   dynamic z = new self::C::•<dynamic>(b ? l1 : l2);
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
index 87b2782..891ec7c 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.outline.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(core::List<self::C::T*>* x) → self::C<self::C::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
index 80f6174..5dbd497 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.expect
@@ -2,16 +2,16 @@
 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>
+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::•()
     ;
 }
 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);
+  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/conditional_upwards_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
index 80f6174..5dbd497 100644
--- a/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/conditional_upwards_inference.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 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>
+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::•()
     ;
 }
 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);
+  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.legacy.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.expect
index 0a84181..612b7ef 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.expect
@@ -17,25 +17,25 @@
 
 class A extends core::Object {
   field dynamic field1 = null;
-  field core::int field2 = null;
-  synthetic constructor •() → self::A
+  field core::int* field2 = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class I extends core::Object {
-  field core::int field1 = null;
+  field core::int* field1 = null;
   field dynamic field2 = null;
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get field1() → core::int
+  get field1() → core::int*
     return null;
-  get field2() → core::int
+  get field2() → core::int*
     return null;
   set field1(invalid-type value) → void {}
   set field2(invalid-type value) → void {}
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.transformed.expect
index 0a84181..612b7ef 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.legacy.transformed.expect
@@ -17,25 +17,25 @@
 
 class A extends core::Object {
   field dynamic field1 = null;
-  field core::int field2 = null;
-  synthetic constructor •() → self::A
+  field core::int* field2 = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class I extends core::Object {
-  field core::int field1 = null;
+  field core::int* field1 = null;
   field dynamic field2 = null;
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get field1() → core::int
+  get field1() → core::int*
     return null;
-  get field2() → core::int
+  get field2() → core::int*
     return null;
   set field1(invalid-type value) → void {}
   set field2(invalid-type value) → void {}
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
index 57c1e7c..3adbfae 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.outline.expect
@@ -17,22 +17,22 @@
 
 class A extends core::Object {
   field dynamic field1;
-  field core::int field2;
-  synthetic constructor •() → self::A
+  field core::int* field2;
+  synthetic constructor •() → self::A*
     ;
 }
 class I extends core::Object {
-  field core::int field1;
+  field core::int* field1;
   field dynamic field2;
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get field1() → core::int
+  get field1() → core::int*
     ;
-  get field2() → core::int
+  get field2() → core::int*
     ;
   set field1(invalid-type value) → void
     ;
diff --git a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
index 0a84181..612b7ef 100644
--- a/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicting_fields.dart.strong.expect
@@ -17,25 +17,25 @@
 
 class A extends core::Object {
   field dynamic field1 = null;
-  field core::int field2 = null;
-  synthetic constructor •() → self::A
+  field core::int* field2 = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class I extends core::Object {
-  field core::int field1 = null;
+  field core::int* field1 = null;
   field dynamic field2 = null;
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get field1() → core::int
+  get field1() → core::int*
     return null;
-  get field2() → core::int
+  get field2() → core::int*
     return null;
   set field1(invalid-type value) → void {}
   set field2(invalid-type value) → void {}
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect
index 3e2c41e..f362386 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.expect
@@ -16,38 +16,38 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  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
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
   get a() → invalid-type
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect
index 3e2c41e..f362386 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.legacy.transformed.expect
@@ -16,38 +16,38 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  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
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
   get a() → invalid-type
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
index 3e2c41e..f362386 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen.dart.strong.expect
@@ -16,38 +16,38 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends self::I1 {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  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
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
   get a() → invalid-type
     return null;
 }
 class C2 extends core::Object implements self::B, self::A {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect
index 7883099..5ca29a6 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.expect
@@ -11,45 +11,45 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  field core::int* y = null;
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
 }
 class I3 extends core::Object implements self::I1, self::I2 {
-  field core::int x = null;
-  field core::int y = null;
-  synthetic constructor •() → self::I3
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::I3*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  final field self::I1 a = null;
-  synthetic constructor •() → self::A
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get a() → self::I3
+  get a() → self::I3*
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect
index 7883099..5ca29a6 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.legacy.transformed.expect
@@ -11,45 +11,45 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  field core::int* y = null;
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
 }
 class I3 extends core::Object implements self::I1, self::I2 {
-  field core::int x = null;
-  field core::int y = null;
-  synthetic constructor •() → self::I3
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::I3*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  final field self::I1 a = null;
-  synthetic constructor •() → self::A
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get a() → self::I3
+  get a() → self::I3*
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
index 7883099..5ca29a6 100644
--- a/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/conflicts_can_happen2.dart.strong.expect
@@ -11,45 +11,45 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::I1
+  field core::int* x = null;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 class I2 extends core::Object {
-  field core::int y = null;
-  synthetic constructor •() → self::I2
+  field core::int* y = null;
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
 }
 class I3 extends core::Object implements self::I1, self::I2 {
-  field core::int x = null;
-  field core::int y = null;
-  synthetic constructor •() → self::I3
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::I3*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  final field self::I1 a = null;
-  synthetic constructor •() → self::A
+  final field self::I1* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  final field self::I2 a = null;
-  synthetic constructor •() → self::B
+  final field self::I2* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C1 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get a() → self::I3
+  get a() → self::I3*
     return null;
 }
 class C2 extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
   get a() → invalid-type
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart
index a2fdcfc..fe92588 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart
@@ -12,5 +12,5 @@
 class Foo<T extends A> {}
 
 void main() {
-  Foo<B> foo = new /*@typeArgs=B*/ Foo();
+  Foo<B> foo = new /*@ typeArgs=B* */ Foo();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect
index 60b38f6..f2eb980 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::Foo<self::B> foo = new self::Foo::•<dynamic>();
+  self::Foo<self::B*>* foo = new self::Foo::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect
index 60b38f6..f2eb980 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::Foo<self::B> foo = new self::Foo::•<dynamic>();
+  self::Foo<self::B*>* foo = new self::Foo::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
index b232ffd..4427d9c 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::Foo<self::B> foo = new self::Foo::•<self::B>();
+  self::Foo<self::B*>* foo = new self::Foo::•<self::B*>();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
index b232ffd..4427d9c 100644
--- a/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_downwards_with_constraint.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class Foo<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::Foo<self::B> foo = new self::Foo::•<self::B>();
+  self::Foo<self::B*>* foo = new self::Foo::•<self::B*>();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart
index 6cb587f..6f09c73 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart
@@ -11,18 +11,18 @@
 }
 
 test() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(42);
 
   num y;
-  C<int> c_int = new /*@typeArgs=int*/ C(
+  C<int> c_int = new /*@ typeArgs=int* */ C(
       /*info:DOWN_CAST_IMPLICIT*/ y);
 
   // These hints are not reported because we resolve with a null error listener.
-  C<num> c_num = new /*@typeArgs=num*/ C(123);
-  C<num> c_num2 = (new /*@typeArgs=num*/ C(456)).. /*@target=C::t*/ t = 1.0;
+  C<num> c_num = new /*@ typeArgs=num* */ C(123);
+  C<num> c_num2 = (new /*@ typeArgs=num* */ C(456)).. /*@target=C::t*/ t = 1.0;
 
-  // Down't infer from explicit dynamic.
-  var /*@type=C<dynamic>*/ c_dynamic = new C<dynamic>(42);
+  // Don't infer from explicit dynamic.
+  var /*@ type=C<dynamic>* */ c_dynamic = new C<dynamic>(42);
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
 }
 
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
index afd777c..d6f2973 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method test() → dynamic {
   dynamic x = new self::C::•<dynamic>(42);
-  core::num y;
-  self::C<core::int> c_int = new self::C::•<dynamic>(y);
-  self::C<core::num> c_num = new self::C::•<dynamic>(123);
-  self::C<core::num> c_num2 = let final dynamic #t1 = new self::C::•<dynamic>(456) in let final dynamic #t2 = #t1.t = 1.0 in #t1;
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<dynamic>(y);
+  self::C<core::num*>* c_num = new self::C::•<dynamic>(123);
+  self::C<core::num*>* c_num2 = let final dynamic #t1 = new self::C::•<dynamic>(456) in let final dynamic #t2 = #t1.t = 1.0 in #t1;
   dynamic c_dynamic = new self::C::•<dynamic>(42);
   x.t = "hello";
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
index afd777c..d6f2973 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method test() → dynamic {
   dynamic x = new self::C::•<dynamic>(42);
-  core::num y;
-  self::C<core::int> c_int = new self::C::•<dynamic>(y);
-  self::C<core::num> c_num = new self::C::•<dynamic>(123);
-  self::C<core::num> c_num2 = let final dynamic #t1 = new self::C::•<dynamic>(456) in let final dynamic #t2 = #t1.t = 1.0 in #t1;
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<dynamic>(y);
+  self::C<core::num*>* c_num = new self::C::•<dynamic>(123);
+  self::C<core::num*>* c_num2 = let final dynamic #t1 = new self::C::•<dynamic>(456) in let final dynamic #t2 = #t1.t = 1.0 in #t1;
   dynamic c_dynamic = new self::C::•<dynamic>(42);
   x.t = "hello";
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
index eff3c30..d506668 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.expect
@@ -10,22 +10,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 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 let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
-  self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
+  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 let final dynamic #t2 = #t1.{self::C::t} = 1.0 in #t1;
+  self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
   x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
-                                                       ^" in "hello" as{TypeError} core::int;
+                                                       ^" in "hello" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
index daed8df..095e6b5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart.strong.transformed.expect
@@ -10,22 +10,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 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 let final core::double #t2 = #t1.{self::C::t} = 1.0 in #t1;
-  self::C<dynamic> c_dynamic = new self::C::•<dynamic>(42);
+  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 let final core::double* #t2 = #t1.{self::C::t} = 1.0 in #t1;
+  self::C<dynamic>* c_dynamic = new self::C::•<dynamic>(42);
   x.{self::C::t} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments.dart:26:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
-                                                       ^" in "hello" as{TypeError} core::int;
+                                                       ^" 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 b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart
index 0bc6057..e8ebd84 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart
@@ -18,6 +18,6 @@
 NotA myF() => null;
 
 main() {
-  var /*@type=C<NotA>*/ x =
-      new /*error:COULD_NOT_INFER*/ /*@typeArgs=NotA*/ C(myF);
+  var /*@ type=C<NotA*>* */ x =
+      new /*error:COULD_NOT_INFER*/ /*@ typeArgs=NotA* */ C(myF);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect
index 4cad6f5..e80bce8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.expect
@@ -2,24 +2,28 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
+typedef F<T extends core::Object* = dynamic> = () →* T*;
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class C<T extends self::A = dynamic> extends core::Object {
-  constructor •(() → self::C::T f) → self::C<self::C::T>
+class C<T extends self::A* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → self::NotA
+  synthetic constructor •() → self::NotA*
     : super core::Object::•()
     ;
 }
-static method myF() → self::NotA
+static method myF() → self::NotA*
   return null;
 static method main() → dynamic {
-  dynamic x = new self::C::•<dynamic>(self::myF);
+  dynamic x = new self::C::•<dynamic>(#C1);
+}
+
+constants  {
+  #C1 = tearoff self::myF
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect
index 4cad6f5..e80bce8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.legacy.transformed.expect
@@ -2,24 +2,28 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
+typedef F<T extends core::Object* = dynamic> = () →* T*;
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class C<T extends self::A = dynamic> extends core::Object {
-  constructor •(() → self::C::T f) → self::C<self::C::T>
+class C<T extends self::A* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → self::NotA
+  synthetic constructor •() → self::NotA*
     : super core::Object::•()
     ;
 }
-static method myF() → self::NotA
+static method myF() → self::NotA*
   return null;
 static method main() → dynamic {
-  dynamic x = new self::C::•<dynamic>(self::myF);
+  dynamic x = new self::C::•<dynamic>(#C1);
+}
+
+constants  {
+  #C1 = tearoff self::myF
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
index ee55e81..a195c85 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
+typedef F<T extends core::Object* = dynamic> = () →* T*;
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
-class C<T extends self::A = dynamic> extends core::Object {
-  constructor •(() → self::C::T f) → self::C<self::C::T>
+class C<T extends self::A* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → self::NotA
+  synthetic constructor •() → self::NotA*
     ;
 }
-static method myF() → self::NotA
+static method myF() → self::NotA*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
index d1fa08b..94baa11 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart.strong.expect
@@ -2,22 +2,22 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/constructors_infer_from_arguments_argument_not_assignable.dart:22:56: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+// 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);
-//                                                        ^
+//       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:25: Error: Inferred type argument 'NotA' doesn't conform to the bound 'A' of the type variable 'T' on 'C'.
+// 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 =
-//                         ^
+//   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> {
 //         ^
@@ -25,24 +25,28 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
+typedef F<T extends core::Object* = dynamic> = () →* T*;
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class C<T extends self::A = self::A> extends core::Object {
-  constructor •(() → self::C::T f) → self::C<self::C::T>
+class C<T extends self::A* = self::A*> extends core::Object {
+  constructor •(() →* self::C::T* f) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class NotA extends core::Object {
-  synthetic constructor •() → self::NotA
+  synthetic constructor •() → self::NotA*
     : super core::Object::•()
     ;
 }
-static method myF() → self::NotA
+static method myF() → self::NotA*
   return null;
 static method main() → dynamic {
-  self::C<self::NotA> x = new self::C::•<self::NotA>(self::myF);
+  self::C<self::NotA*>* x = new self::C::•<self::NotA*>(#C1);
+}
+
+constants  {
+  #C1 = tearoff self::myF
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart
index 873d63e..49c4ce1 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart
@@ -11,5 +11,5 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = const /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = const /*@ typeArgs=int* */ C(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect
index 0eb5ed3..958af1b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.expect
@@ -2,12 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  final field self::C::T t;
-  const constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = const self::C::•<dynamic>(42);
+  dynamic x = #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::C<dynamic> {t:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect
index 0eb5ed3..958af1b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.legacy.transformed.expect
@@ -2,12 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  final field self::C::T t;
-  const constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = const self::C::•<dynamic>(42);
+  dynamic x = #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::C<dynamic> {t:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
index acaa923..6aa1ff0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.expect
@@ -2,12 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  final field self::C::T t;
-  const constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = const self::C::•<core::int>(42);
+  self::C<core::int*>* x = #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::C<core::int*> {t:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
index acaa923..6aa1ff0 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const.dart.strong.transformed.expect
@@ -2,12 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  final field self::C::T t;
-  const constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  final field self::C::T* t;
+  const constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = const self::C::•<core::int>(42);
+  self::C<core::int*>* x = #C2;
+}
+
+constants  {
+  #C1 = 42
+  #C2 = self::C<core::int*> {t:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart
index ca876a5..af36b86 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart
@@ -15,7 +15,7 @@
 }
 
 void main() {
-  const /*@type=C<int>*/ c = const /*@typeArgs=int*/ C(0);
+  const /*@ type=C<int*>* */ c = const /*@ typeArgs=int* */ C(0);
   C<int> c2 = c;
-  const D<int> d = const /*@typeArgs=int*/ D();
+  const D<int> d = const /*@ typeArgs=int* */ D();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect
index ffe3403..25da833 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.expect
@@ -2,19 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  final field self::C::T x;
-  const constructor •(self::C::T x) → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num = dynamic> extends core::Object {
-  const constructor •() → self::D<self::D::T>
+class D<T extends core::num* = dynamic> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  const dynamic c = const self::C::•<dynamic>(0);
-  self::C<core::int> c2 = c;
-  const self::D<core::int> d = const self::D::•<dynamic>();
+  self::C<core::int*>* c2 = #C2;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::C<dynamic> {x:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect
index ffe3403..25da833 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.legacy.transformed.expect
@@ -2,19 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  final field self::C::T x;
-  const constructor •(self::C::T x) → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num = dynamic> extends core::Object {
-  const constructor •() → self::D<self::D::T>
+class D<T extends core::num* = dynamic> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  const dynamic c = const self::C::•<dynamic>(0);
-  self::C<core::int> c2 = c;
-  const self::D<core::int> d = const self::D::•<dynamic>();
+  self::C<core::int*>* c2 = #C2;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::C<dynamic> {x:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
index eb8ade1..c6802a7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.expect
@@ -2,19 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  final field self::C::T x;
-  const constructor •(self::C::T x) → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num = core::num> extends core::Object {
-  const constructor •() → self::D<self::D::T>
+class D<T extends core::num* = core::num*> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  const self::C<core::int> c = const self::C::•<core::int>(0);
-  self::C<core::int> c2 = c;
-  const self::D<core::int> d = const self::D::•<core::int>();
+  self::C<core::int*>* c2 = #C2;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::C<core::int*> {x:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
index eb8ade1..c6802a7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_const_with_upper_bound.dart.strong.transformed.expect
@@ -2,19 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  final field self::C::T x;
-  const constructor •(self::C::T x) → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  final field self::C::T* x;
+  const constructor •(self::C::T* x) → self::C<self::C::T*>*
     : self::C::x = x, super core::Object::•()
     ;
 }
-class D<T extends core::num = core::num> extends core::Object {
-  const constructor •() → self::D<self::D::T>
+class D<T extends core::num* = core::num*> extends core::Object {
+  const constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  const self::C<core::int> c = const self::C::•<core::int>(0);
-  self::C<core::int> c2 = c;
-  const self::D<core::int> d = const self::D::•<core::int>();
+  self::C<core::int*>* c2 = #C2;
+}
+
+constants  {
+  #C1 = 0
+  #C2 = self::C<core::int*> {x:#C1}
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart
index e6c31a2..1d021ff 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart
@@ -10,11 +10,11 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(/*@typeArgs=int*/ [123]);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(/*@ typeArgs=int* */ [123]);
   C<int> y = x;
 
-  var /*@type=C<dynamic>*/ a = new C<dynamic>(/*@typeArgs=dynamic*/ [123]);
+  var /*@ type=C<dynamic>* */ a = new C<dynamic>(/*@ typeArgs=dynamic */ [123]);
 
   // This one however works.
-  var /*@type=C<Object>*/ b = new C<Object>(/*@typeArgs=Object*/ [123]);
+  var /*@ type=C<Object*>* */ b = new C<Object>(/*@ typeArgs=Object* */ [123]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect
index be85931..c41dcd8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.expect
@@ -2,14 +2,14 @@
 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>
+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::•()
     ;
 }
 static method main() → dynamic {
   dynamic x = new self::C::•<dynamic>(<dynamic>[123]);
-  self::C<core::int> y = x;
+  self::C<core::int*>* y = x;
   dynamic a = new self::C::•<dynamic>(<dynamic>[123]);
-  dynamic b = new self::C::•<core::Object>(<dynamic>[123]);
+  dynamic b = new self::C::•<core::Object*>(<dynamic>[123]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect
index be85931..c41dcd8 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 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>
+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::•()
     ;
 }
 static method main() → dynamic {
   dynamic x = new self::C::•<dynamic>(<dynamic>[123]);
-  self::C<core::int> y = x;
+  self::C<core::int*>* y = x;
   dynamic a = new self::C::•<dynamic>(<dynamic>[123]);
-  dynamic b = new self::C::•<core::Object>(<dynamic>[123]);
+  dynamic b = new self::C::•<core::Object*>(<dynamic>[123]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
index 17be81e..2bf286e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.expect
@@ -2,14 +2,14 @@
 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>
+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::•()
     ;
 }
 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]);
+  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_downwards_from_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
index 17be81e..2bf286e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_downwards_from_constructor.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 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>
+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::•()
     ;
 }
 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]);
+  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 b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart
index 16a82bb..585784f 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart
@@ -11,14 +11,14 @@
   C._();
 
   factory C(T t) {
-    var /*@type=C<C::•::T>*/ x = new C<T>._();
+    var /*@ type=C<C::•::T*>* */ x = new C<T>._();
     x. /*@target=C::t*/ t = t;
     return x;
   }
 }
 
 test() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(42);
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
 }
 
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
index 3a5a56b..fcb8d4e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor _() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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> {
-    dynamic x = new self::C::_<self::C::•::T>();
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>* {
+    dynamic x = new self::C::_<self::C::•::T*>();
     x.t = t;
     return x;
   }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
index 3a5a56b..fcb8d4e 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor _() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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> {
-    dynamic x = new self::C::_<self::C::•::T>();
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>* {
+    dynamic x = new self::C::_<self::C::•::T*>();
     x.t = t;
     return x;
   }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
index 0593a65..d2d97ba 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.expect
@@ -10,22 +10,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor _() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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*>();
     x.{self::C::t} = t;
     return x;
   }
 }
 static method test() → dynamic {
-  self::C<core::int> x = self::C::•<core::int>(42);
+  self::C<core::int*>* x = self::C::•<core::int*>(42);
   x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
-                                                       ^" in "hello" as{TypeError} core::int;
+                                                       ^" in "hello" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
index 0593a65..d2d97ba 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart.strong.transformed.expect
@@ -10,22 +10,22 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor _() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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*>();
     x.{self::C::t} = t;
     return x;
   }
 }
 static method test() → dynamic {
-  self::C<core::int> x = self::C::•<core::int>(42);
+  self::C<core::int*>* x = self::C::•<core::int*>(42);
   x.{self::C::t} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory.dart:22:56: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x. /*@target=C::t*/ t = /*error:INVALID_ASSIGNMENT*/ 'hello';
-                                                       ^" in "hello" as{TypeError} core::int;
+                                                       ^" in "hello" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart
index bfbf627..eddb435 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart
@@ -6,10 +6,10 @@
 library test;
 
 class A<T> {
-  A<T> f = new /*@typeArgs=A::T*/ A();
+  A<T> f = new /*@ typeArgs=A::T* */ A();
   A();
-  factory A.factory() => new /*@typeArgs=A::factory::T*/ A();
-  A<T> m() => new /*@typeArgs=A::T*/ A();
+  factory A.factory() => new /*@ typeArgs=A::factory::T* */ A();
+  A<T> m() => new /*@ typeArgs=A::T* */ A();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
index 523f87e..3b5c18d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<dynamic>();
-  constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A<self::A::T*>* f = new self::A::•<dynamic>();
+  constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object* = dynamic>() → self::A<self::A::factory::T*>*
     return new self::A::•<dynamic>();
-  method m() → self::A<self::A::T>
+  method m() → self::A<self::A::T*>*
     return new self::A::•<dynamic>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
index 523f87e..3b5c18d 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<dynamic>();
-  constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A<self::A::T*>* f = new self::A::•<dynamic>();
+  constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  static factory factory<T extends core::Object = dynamic>() → self::A<self::A::factory::T>
+  static factory factory<T extends core::Object* = dynamic>() → self::A<self::A::factory::T*>*
     return new self::A::•<dynamic>();
-  method m() → self::A<self::A::T>
+  method m() → self::A<self::A::T*>*
     return new self::A::•<dynamic>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
index 1a10614..d93d08a 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<self::A::T>();
-  constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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*>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
index 1a10614..d93d08a 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_factory_calls_constructor.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A<self::A::T> f = new self::A::•<self::A::T>();
-  constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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*>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart
index a8fff01..7f6edc6 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart
@@ -11,5 +11,5 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C.named(<int>[]);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C.named(<int>[]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
index 12938f7..af0e3c5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t = null;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = new self::C::named<dynamic>(<core::int>[]);
+  dynamic x = new self::C::named<dynamic>(<core::int*>[]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
index 12938f7..af0e3c5 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t = null;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = new self::C::named<dynamic>(<core::int>[]);
+  dynamic x = new self::C::named<dynamic>(<core::int*>[]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
index c0aa117..59dd1ce 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t = null;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::C::named<core::int>(<core::int>[]);
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
index c0aa117..59dd1ce 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor named(core::List<self::C::T> t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t = null;
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::C::named<core::int>(<core::int>[]);
+  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 b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart
index 11a8d59..9796dff 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart
@@ -10,12 +10,12 @@
   C();
 
   factory C.named(T t) {
-    var /*@type=C<C::named::T>*/ x = new C<T>();
+    var /*@ type=C<C::named::T*>* */ x = new C<T>();
     x. /*@target=C::t*/ t = t;
     return x;
   }
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C.named(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C.named(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
index d35dcf3..39f3419 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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> {
-    dynamic x = new self::C::•<self::C::named::T>();
+  static factory named<T extends core::Object* = dynamic>(self::C::named::T* t) → self::C<self::C::named::T*>* {
+    dynamic x = new self::C::•<self::C::named::T*>();
     x.t = t;
     return x;
   }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
index d35dcf3..39f3419 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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> {
-    dynamic x = new self::C::•<self::C::named::T>();
+  static factory named<T extends core::Object* = dynamic>(self::C::named::T* t) → self::C<self::C::named::T*>* {
+    dynamic x = new self::C::•<self::C::named::T*>();
     x.t = t;
     return x;
   }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
index a35e74f..d428352 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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;
   }
 }
 static method main() → dynamic {
-  self::C<core::int> x = self::C::named<core::int>(42);
+  self::C<core::int*>* x = self::C::named<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
index a35e74f..d428352 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_named_factory.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t = null;
-  constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>();
+  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;
   }
 }
 static method main() → dynamic {
-  self::C<core::int> x = self::C::named<core::int>(42);
+  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 b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart
index 3e8579f..f414e9b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart
@@ -12,5 +12,5 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C.named(<int>[42]);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C.named(<int>[42]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
index 6ad8fb3..fb4ae7c 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : this self::C::•(t.[](0))
     ;
 }
 static method main() → dynamic {
-  dynamic x = new self::C::named<dynamic>(<core::int>[42]);
+  dynamic x = new self::C::named<dynamic>(<core::int*>[42]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
index 6ad8fb3..fb4ae7c 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : this self::C::•(t.[](0))
     ;
 }
 static method main() → dynamic {
-  dynamic x = new self::C::named<dynamic>(<core::int>[42]);
+  dynamic x = new self::C::named<dynamic>(<core::int*>[42]);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
index 6a307ee..1969e2b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : this self::C::•(t.{core::List::[]}(0))
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::C::named<core::int>(<core::int>[42]);
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
index 6a307ee..1969e2b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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>
+  constructor named(core::List<self::C::T*>* t) → self::C<self::C::T*>*
     : this self::C::•(t.{core::List::[]}(0))
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::C::named<core::int>(<core::int>[42]);
+  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 b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart
index da3d4db..5ca5c0a 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart
@@ -18,5 +18,5 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
index a9f6850..efe6fb4 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
     : self::CImpl::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
index a9f6850..efe6fb4 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
     : self::CImpl::t = t, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
index 8b92733a..a4c13fe 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
     : self::CImpl::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::CImpl::•<core::int>(42);
+  self::C<core::int*>* x = new self::CImpl::•<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
index b20065f..abccfe3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let<BottomType> #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let<BottomType> #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor •(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor •(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
     : self::CImpl::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> x = new self::CImpl::•<core::int>(42);
+  self::C<core::int*>* x = new self::CImpl::•<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart
index b9337fa..a498a24 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart
@@ -15,9 +15,9 @@
 class CImpl<T> implements C<T> {
   T t;
   CImpl._(this.t);
-  factory CImpl(T t) => new /*@typeArgs=CImpl::•::T*/ CImpl._(t);
+  factory CImpl(T t) => new /*@ typeArgs=CImpl::•::T* */ CImpl._(t);
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
index c8c111e..ea1366b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl 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>
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
     return new self::CImpl::_<dynamic>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
index c8c111e..ea1366b 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl 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>
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
     return new self::CImpl::_<dynamic>(t);
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
index 2385460..2752751 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.outline.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl field self::CImpl::T* t;
+  constructor _(self::CImpl::T* t) → self::CImpl<self::CImpl::T*>*
     ;
-  static factory •<T extends core::Object = dynamic>(self::CImpl::•::T t) → self::CImpl<self::CImpl::•::T>
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
index dcbaf5d..083cee3 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let dynamic #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl 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);
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
+    return new self::CImpl::_<self::CImpl::•::T*>(t);
 }
 static method main() → dynamic {
-  self::C<core::int> x = self::CImpl::•<core::int>(42);
+  self::C<core::int*>* x = self::CImpl::•<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
index f7dc7a6..47257c7 100644
--- a/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_infer_from_arguments_redirecting_factory_to_factory.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class C<T extends core::Object = dynamic> extends core::Object {
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::•];
-  abstract get t() → self::C::T;
-  abstract set t(generic-covariant-impl self::C::T x) → void;
-  static factory •<T extends core::Object = dynamic>(self::C::•::T t) → self::C<self::C::•::T>
-    let <T extends core::Object = dynamic>(self::CImpl::•::T) → self::CImpl<self::CImpl::•::T> #redirecting_factory = self::CImpl::• in let self::C::•::T #typeArg0 = null in invalid-expression;
+  abstract get t() → self::C::T*;
+  abstract set t(generic-covariant-impl self::C::T* x) → void;
+  static factory •<T extends core::Object* = dynamic>(self::C::•::T* t) → self::C<self::C::•::T*>*
+    let <T extends core::Object* = dynamic>(self::CImpl::•::T*) →* self::CImpl<self::CImpl::•::T*>* #redirecting_factory = self::CImpl::• in let self::C::•::T* #typeArg0 = null in invalid-expression;
 }
-class CImpl<T extends core::Object = dynamic> extends core::Object implements self::C<self::CImpl::T> {
-  generic-covariant-impl field self::CImpl::T t;
-  constructor _(self::CImpl::T t) → self::CImpl<self::CImpl::T>
+class CImpl<T extends core::Object* = dynamic> extends core::Object implements self::C<self::CImpl::T*> {
+  generic-covariant-impl 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);
+  static factory •<T extends core::Object* = dynamic>(self::CImpl::•::T* t) → self::CImpl<self::CImpl::•::T*>*
+    return new self::CImpl::_<self::CImpl::•::T*>(t);
 }
 static method main() → dynamic {
-  self::C<core::int> x = self::CImpl::•<core::int>(42);
+  self::C<core::int*>* x = self::CImpl::•<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart
index 8f0d7da..5cedc1b 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart
@@ -5,20 +5,20 @@
 /*@testedFeatures=inference*/
 library test;
 
-class Clonable<T> {}
+class Cloneable<T> {}
 
-class Pair<T extends Clonable<T>, U extends Clonable<U>> {
+class Pair<T extends Cloneable<T>, U extends Cloneable<U>> {
   T t;
   U u;
   Pair(this.t, this.u);
   Pair._();
-  Pair<U, T> get reversed => new /*@typeArgs=Pair::U, Pair::T*/ Pair(
+  Pair<U, T> get reversed => new /*@ typeArgs=Pair::U*, Pair::T* */ Pair(
       /*@target=Pair::u*/ u,
       /*@target=Pair::t*/ t);
 }
 
 main() {
-  final /*@type=Pair<Clonable<dynamic>, Clonable<dynamic>>*/ x =
-      new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@typeArgs=Clonable<dynamic>, Clonable<dynamic>*/ Pair
+  final /*@ type=Pair<Cloneable<dynamic>*, Cloneable<dynamic>*>* */ x =
+      new /*error:COULD_NOT_INFER,error:COULD_NOT_INFER*/ /*@ typeArgs=Cloneable<dynamic>*, Cloneable<dynamic>* */ Pair
           ._();
 }
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.hierarchy.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.hierarchy.expect
index 60cd348..add5d60 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.hierarchy.expect
@@ -18,7 +18,7 @@
     Object.==
   classSetters:
 
-Clonable:
+Cloneable:
   superclasses:
     Object
   interfaces:
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
index e3c5f4a..4e7c5e3 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Clonable<self::Clonable::T>
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends self::Cloneable<self::Pair::T>* = dynamic, U extends self::Cloneable<self::Pair::U>* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  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>
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
     return new self::Pair::•<dynamic, dynamic>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
index e3c5f4a..4e7c5e3 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.legacy.transformed.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Clonable<self::Clonable::T>
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends self::Cloneable<self::Pair::T>* = dynamic, U extends self::Cloneable<self::Pair::U>* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  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>
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
     return new self::Pair::•<dynamic, dynamic>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
index 8337c9e..ee4e32e 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.outline.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Clonable<self::Clonable::T>
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T> = dynamic, U extends self::Clonable<self::Pair::U> = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends self::Cloneable<self::Pair::T>* = dynamic, U extends self::Cloneable<self::Pair::U>* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl field self::Pair::U* u;
+  constructor •(self::Pair::T* t, self::Pair::U* u) → self::Pair<self::Pair::T*, self::Pair::U*>*
     ;
-  constructor _() → self::Pair<self::Pair::T, self::Pair::U>
+  constructor _() → self::Pair<self::Pair::T*, self::Pair::U*>*
     ;
-  get reversed() → self::Pair<self::Pair::U, self::Pair::T>
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
index fa12dec..2359c4d 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.expect
@@ -2,44 +2,44 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
-//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// 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=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-//                                                                                                              ^
+//       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 Clonable<T>, U extends Clonable<U>> {
+// class Pair<T extends Cloneable<T>, U extends Cloneable<U>> {
 //            ^
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
-//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// 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=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-//                                                                                                              ^
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:35: Context: This is the type variable whose bound isn't conformed to.
-// class Pair<T extends Clonable<T>, U extends Clonable<U>> {
-//                                   ^
+//       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 Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Clonable<self::Clonable::T>
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T> = self::Clonable<dynamic>, U extends self::Clonable<self::Pair::U> = self::Clonable<dynamic>> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+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 {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  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}, this.{self::Pair::t});
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {
-  final self::Pair<self::Clonable<dynamic>, self::Clonable<dynamic>> x = new self::Pair::_<self::Clonable<dynamic>, self::Clonable<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_inference_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
index fa12dec..2359c4d 100644
--- a/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart.strong.transformed.expect
@@ -2,44 +2,44 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<T>' of the type variable 'T' on 'Pair'.
-//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// 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=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-//                                                                                                              ^
+//       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 Clonable<T>, U extends Clonable<U>> {
+// class Pair<T extends Cloneable<T>, U extends Cloneable<U>> {
 //            ^
 //
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:22:110: Error: Inferred type argument 'Clonable<dynamic>' doesn't conform to the bound 'Clonable<U>' of the type variable 'U' on 'Pair'.
-//  - 'Clonable' is from 'pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart'.
+// 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=Clonable<dynamic>, Clonable<dynamic>*/ Pair
-//                                                                                                              ^
-// pkg/front_end/testcases/inference/constructors_inference_f_bounded.dart:10:35: Context: This is the type variable whose bound isn't conformed to.
-// class Pair<T extends Clonable<T>, U extends Clonable<U>> {
-//                                   ^
+//       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 Clonable<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Clonable<self::Clonable::T>
+class Cloneable<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Cloneable<self::Cloneable::T*>*
     : super core::Object::•()
     ;
 }
-class Pair<T extends self::Clonable<self::Pair::T> = self::Clonable<dynamic>, U extends self::Clonable<self::Pair::U> = self::Clonable<dynamic>> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+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 {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  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}, this.{self::Pair::t});
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {
-  final self::Pair<self::Clonable<dynamic>, self::Clonable<dynamic>> x = new self::Pair::_<self::Clonable<dynamic>, self::Clonable<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 b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart
index 6de0915..01b6c5e 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart
@@ -9,7 +9,7 @@
   T t;
   U u;
   Pair(this.t, this.u);
-  Pair<U, T> get reversed => new /*@typeArgs=Pair::U, Pair::T*/ Pair(
+  Pair<U, T> get reversed => new /*@ typeArgs=Pair::U*, Pair::T* */ Pair(
       /*@target=Pair::u*/ u,
       /*@target=Pair::t*/ t);
 }
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
index 0a86feb..4cc018c 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
     return new self::Pair::•<dynamic, dynamic>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
index 0a86feb..4cc018c 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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>
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
     return new self::Pair::•<dynamic, dynamic>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
index 43824f3..e403c03 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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}, this.{self::Pair::t});
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
index 43824f3..e403c03 100644
--- a/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/constructors_reverse_type_parameters.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Pair<T extends core::Object = dynamic, U extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Pair::T t;
-  generic-covariant-impl field self::Pair::U u;
-  constructor •(self::Pair::T t, self::Pair::U u) → self::Pair<self::Pair::T, self::Pair::U>
+class Pair<T extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::Pair::T* t;
+  generic-covariant-impl 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}, this.{self::Pair::t});
+  get reversed() → self::Pair<self::Pair::U*, self::Pair::T*>*
+    return new self::Pair::•<self::Pair::U*, self::Pair::T*>(this.{self::Pair::u}, this.{self::Pair::t});
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect
index d203d4e..47da0bb 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect
index d203d4e..47da0bb 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
index 278c138..38a8a35 100644
--- a/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/do_not_infer_overridden_fields_that_explicitly_say_dynamic_infer.dart.strong.expect
@@ -14,21 +14,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} 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.legacy.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.expect
index 247c481..b9b027c 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.expect
@@ -7,7 +7,7 @@
   static field dynamic y = 3;
   field dynamic x2 = null;
   field dynamic y2 = 3;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect
index 247c481..b9b027c 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
   static field dynamic y = 3;
   field dynamic x2 = null;
   field dynamic y2 = 3;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.expect
index 888ea82..28a93e1 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.expect
@@ -4,15 +4,15 @@
 
 class A extends core::Object {
   static field dynamic x = null;
-  static field core::int y = 3;
+  static field core::int* y = 3;
   field dynamic x2 = null;
-  field core::int y2 = 3;
-  synthetic constructor •() → self::A
+  field core::int* y2 = 3;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static field dynamic x = null;
-static field core::int y = 3;
+static field core::int* y = 3;
 static method main() → dynamic {
   self::x;
   self::y;
diff --git a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.transformed.expect
index 888ea82..28a93e1 100644
--- a/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/dont_infer_field_type_when_initializer_is_null.dart.strong.transformed.expect
@@ -4,15 +4,15 @@
 
 class A extends core::Object {
   static field dynamic x = null;
-  static field core::int y = 3;
+  static field core::int* y = 3;
   field dynamic x2 = null;
-  field core::int y2 = 3;
-  synthetic constructor •() → self::A
+  field core::int* y2 = 3;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static field dynamic x = null;
-static field core::int y = 3;
+static field core::int* y = 3;
 static method main() → dynamic {
   self::x;
   self::y;
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart
index a795447..10a6728 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart
@@ -12,14 +12,14 @@
   num x;
   dynamic y;
 
-  num a = /*@typeArgs=num*/ max(
+  num a = /*@ typeArgs=num* */ max(
       x,
       /*info:DYNAMIC_CAST*/ y);
-  Object b = /*@typeArgs=num*/ max(
+  Object b = /*@ typeArgs=num* */ max(
       x,
       /*info:DYNAMIC_CAST*/ y);
-  dynamic c = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(x, y);
-  var /*@type=dynamic*/ d = /*error:COULD_NOT_INFER*/ /*@typeArgs=dynamic*/ max(
+  dynamic c = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(x, y);
+  var /*@ type=dynamic */ d = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(
       x, y);
 }
 
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect
index 52cb80e..ad47d30 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.expect
@@ -6,10 +6,10 @@
 import "dart:math";
 
 static method f() → dynamic {
-  core::num x;
+  core::num* x;
   dynamic y;
-  core::num a = math::max<dynamic>(x, y);
-  core::Object b = math::max<dynamic>(x, y);
+  core::num* a = math::max<dynamic>(x, y);
+  core::Object* b = math::max<dynamic>(x, y);
   dynamic c = math::max<dynamic>(x, y);
   dynamic d = math::max<dynamic>(x, y);
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect
index 52cb80e..ad47d30 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.legacy.transformed.expect
@@ -6,10 +6,10 @@
 import "dart:math";
 
 static method f() → dynamic {
-  core::num x;
+  core::num* x;
   dynamic y;
-  core::num a = math::max<dynamic>(x, y);
-  core::Object b = math::max<dynamic>(x, y);
+  core::num* a = math::max<dynamic>(x, y);
+  core::Object* b = math::max<dynamic>(x, y);
   dynamic c = math::max<dynamic>(x, y);
   dynamic d = math::max<dynamic>(x, y);
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
index ff6c037..88d238f 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// 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);
-//                                                               ^
+//   dynamic c = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(x, y);
+//                                                                 ^
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// 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(
-//                                                                             ^
+//   var /*@ type=dynamic */ d = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(
+//                                                                                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -19,10 +19,10 @@
 import "dart:math";
 
 static method f() → dynamic {
-  core::num x;
+  core::num* x;
   dynamic y;
-  core::num a = math::max<core::num>(x, y as{TypeError} core::num);
-  core::Object b = math::max<core::num>(x, y as{TypeError} core::num);
+  core::num* a = math::max<core::num*>(x, y as{TypeError} core::num*);
+  core::Object* b = math::max<core::num*>(x, y as{TypeError} core::num*);
   dynamic c = math::max<dynamic>(x, y);
   dynamic d = math::max<dynamic>(x, y);
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
index ff6c037..88d238f 100644
--- a/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:21:63: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// 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);
-//                                                               ^
+//   dynamic c = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(x, y);
+//                                                                 ^
 //
-// pkg/front_end/testcases/inference/downward_inference_fixes_no_upwards_errors.dart:22:77: Error: Inferred type argument 'dynamic' doesn't conform to the bound 'num' of the type variable 'T' on 'max'.
+// 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(
-//                                                                             ^
+//   var /*@ type=dynamic */ d = /*error:COULD_NOT_INFER*/ /*@ typeArgs=dynamic */ max(
+//                                                                                 ^
 //
 import self as self;
 import "dart:core" as core;
@@ -19,10 +19,10 @@
 import "dart:math";
 
 static method f() → dynamic {
-  core::num x;
+  core::num* x;
   dynamic y;
-  core::num a = math::max<core::num>(x, y as{TypeError} core::num);
-  core::Object b = math::max<core::num>(x, y as{TypeError} core::num);
+  core::num* a = math::max<core::num*>(x, y as{TypeError} core::num*);
+  core::Object* b = math::max<core::num*>(x, y as{TypeError} core::num*);
   dynamic c = math::max<dynamic>(x, y);
   dynamic d = math::max<dynamic>(x, y);
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart
index 2795bc9..8536965 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart
@@ -15,16 +15,16 @@
 void main() {
   {
     // Variables, nested literals
-    var /*@type=String*/ x = "hello";
-    var /*@type=int*/ y = 3;
+    var /*@ type=String* */ x = "hello";
+    var /*@ type=int* */ y = 3;
     void f(List<Map<int, String>> l) {}
     ;
-    f(/*@typeArgs=Map<int, String>*/ [
-      /*@typeArgs=int, String*/ {y: x}
+    f(/*@ typeArgs=Map<int*, String*>* */ [
+      /*@ typeArgs=int*, String* */ {y: x}
     ]);
   }
   {
     int f(int x) => 0;
-    A<int> a = new /*@typeArgs=int*/ A(f);
+    A<int> a = new /*@ typeArgs=int* */ A(f);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
index 7289b38..53daa23 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field (self::A::T) → self::A::T x;
-  constructor •((self::A::T) → self::A::T x) → self::A<self::A::T>
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
     ;
 }
 static method main() → void {
   {
-    core::String x = "hello";
-    core::int y = 3;
-    function f(core::List<core::Map<core::int, core::String>> l) → void {}
+    core::String* x = "hello";
+    core::int* y = 3;
+    function f(core::List<core::Map<core::int*, core::String*>*>* l) → void {}
     ;
-    f.call(<core::Map<core::int, core::String>>[<core::int, core::String>{y: x}]);
+    f.call(<core::Map<core::int*, core::String*>*>[<core::int*, core::String*>{y: x}]);
   }
   {
-    function f(core::int x) → core::int
+    function f(core::int* x) → core::int*
       return 0;
-    self::A<core::int> a = new self::A::•<core::int>(f);
+    self::A<core::int*>* a = new self::A::•<core::int*>(f);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
index 7289b38..53daa23 100644
--- a/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downward_inference_miscellaneous.dart.strong.transformed.expect
@@ -2,24 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field (self::A::T) → self::A::T x;
-  constructor •((self::A::T) → self::A::T x) → self::A<self::A::T>
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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::•()
     ;
 }
 static method main() → void {
   {
-    core::String x = "hello";
-    core::int y = 3;
-    function f(core::List<core::Map<core::int, core::String>> l) → void {}
+    core::String* x = "hello";
+    core::int* y = 3;
+    function f(core::List<core::Map<core::int*, core::String*>*>* l) → void {}
     ;
-    f.call(<core::Map<core::int, core::String>>[<core::int, core::String>{y: x}]);
+    f.call(<core::Map<core::int*, core::String*>*>[<core::int*, core::String*>{y: x}]);
   }
   {
-    function f(core::int x) → core::int
+    function f(core::int* x) → core::int*
       return 0;
-    self::A<core::int> a = new self::A::•<core::int>(f);
+    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 b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
index a2a520c..e9541ee 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart
@@ -10,7 +10,7 @@
 }
 
 class B implements A {
-  final foo = /*@typeArgs=String*/ const [];
+  final foo = /*@ typeArgs=String* */ const [];
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect
index ebc33e7..9dda064 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get foo() → core::Iterable<core::String>;
+  abstract get foo() → core::Iterable<core::String*>*;
 }
 class B extends core::Object implements self::A {
-  final field core::Iterable<core::String> foo = const <dynamic>[];
-  synthetic constructor •() → self::B
+  final field core::Iterable<core::String*>* foo = #C1;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method main() → void {}
+
+constants  {
+  #C1 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect
index ebc33e7..9dda064 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.legacy.transformed.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get foo() → core::Iterable<core::String>;
+  abstract get foo() → core::Iterable<core::String*>*;
 }
 class B extends core::Object implements self::A {
-  final field core::Iterable<core::String> foo = const <dynamic>[];
-  synthetic constructor •() → self::B
+  final field core::Iterable<core::String*>* foo = #C1;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method main() → void {}
+
+constants  {
+  #C1 = <dynamic>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.outline.expect
index 945a5e0..855790c 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get foo() → core::Iterable<core::String>;
+  abstract get foo() → core::Iterable<core::String*>*;
 }
 class B extends core::Object implements self::A {
-  final field core::Iterable<core::String> foo;
-  synthetic constructor •() → self::B
+  final field core::Iterable<core::String*>* foo;
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.expect
index 97ebeda..1d84a48 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get foo() → core::Iterable<core::String>;
+  abstract get foo() → core::Iterable<core::String*>*;
 }
 class B extends core::Object implements self::A {
-  final field core::Iterable<core::String> foo = const <core::String>[];
-  synthetic constructor •() → self::B
+  final field core::Iterable<core::String*>* foo = #C1;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method main() → void {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.transformed.expect
index 97ebeda..1d84a48 100644
--- a/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_context_from_inferred_field_type.dart.strong.transformed.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get foo() → core::Iterable<core::String>;
+  abstract get foo() → core::Iterable<core::String*>*;
 }
 class B extends core::Object implements self::A {
-  final field core::Iterable<core::String> foo = const <core::String>[];
-  synthetic constructor •() → self::B
+  final field core::Iterable<core::String*>* foo = #C1;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method main() → void {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart
index 24a4701..7b01cc4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart
@@ -10,10 +10,10 @@
   const Foo.named(List<String> l);
 }
 
-@Foo(/*@typeArgs=String*/ const [])
+@Foo(/*@ typeArgs=String* */ const [])
 class Bar {}
 
-@Foo.named(/*@typeArgs=String*/ const [])
+@Foo.named(/*@ typeArgs=String* */ const [])
 class Baz {}
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect
index b08a49b..0fda0a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.expect
@@ -3,23 +3,27 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → self::Foo
+  const constructor named(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <dynamic>[])
+@#C1
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
-@self::Foo::named(const <dynamic>[])
+@#C1
 class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect
index b08a49b..0fda0a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.legacy.transformed.expect
@@ -3,23 +3,27 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → self::Foo
+  const constructor named(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <dynamic>[])
+@#C1
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
-@self::Foo::named(const <dynamic>[])
+@#C1
 class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
index 6ddb363..14bb442 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.outline.expect
@@ -3,19 +3,21 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → self::Foo
+  const constructor named(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 @self::Foo::•(const <dynamic>[])
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     ;
 }
 @self::Foo::named(const <dynamic>[])
 class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.expect
index 9ebf851..0fda0a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.expect
@@ -3,23 +3,27 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → self::Foo
+  const constructor named(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <core::String>[])
+@#C1
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
-@self::Foo::named(const <core::String>[])
+@#C1
 class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.transformed.expect
index 9ebf851..0fda0a1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations.dart.strong.transformed.expect
@@ -3,23 +3,27 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
-  const constructor named(core::List<core::String> l) → self::Foo
+  const constructor named(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-@self::Foo::•(const <core::String>[])
+@#C1
 class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super core::Object::•()
     ;
 }
-@self::Foo::named(const <core::String>[])
+@#C1
 class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
index 239edeb..827422e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart
@@ -10,13 +10,13 @@
 }
 
 abstract class Bar {
-  @Foo(/*@typeArgs=String*/ const [])
+  @Foo(/*@ typeArgs=String* */ const [])
   Bar();
 
-  @Foo(/*@typeArgs=String*/ const [])
+  @Foo(/*@ typeArgs=String* */ const [])
   var x;
 
-  @Foo(/*@typeArgs=String*/ const [])
+  @Foo(/*@ typeArgs=String* */ const [])
   void f();
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect
index 7687ebe..8a2ff24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.expect
@@ -3,18 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <dynamic>[])
+  @#C1
   field dynamic x = null;
-  @self::Foo::•(const <dynamic>[])
-  constructor •() → self::Bar
+  @#C1
+  constructor •() → self::Bar*
     : super core::Object::•()
     ;
-  @self::Foo::•(const <dynamic>[])
+  @#C1
   abstract method f() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect
index 7687ebe..8a2ff24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.legacy.transformed.expect
@@ -3,18 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <dynamic>[])
+  @#C1
   field dynamic x = null;
-  @self::Foo::•(const <dynamic>[])
-  constructor •() → self::Bar
+  @#C1
+  constructor •() → self::Bar*
     : super core::Object::•()
     ;
-  @self::Foo::•(const <dynamic>[])
+  @#C1
   abstract method f() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
index 62d5559..779bc69 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.outline.expect
@@ -3,14 +3,15 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
   @self::Foo::•(const <dynamic>[])
   field dynamic x;
   @self::Foo::•(const <dynamic>[])
-  constructor •() → self::Bar
+  constructor •() → self::Bar*
     ;
   @self::Foo::•(const <dynamic>[])
   abstract method f() → void;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.expect
index 242be1c..8a2ff24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.expect
@@ -3,18 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <core::String>[])
+  @#C1
   field dynamic x = null;
-  @self::Foo::•(const <core::String>[])
-  constructor •() → self::Bar
+  @#C1
+  constructor •() → self::Bar*
     : super core::Object::•()
     ;
-  @self::Foo::•(const <core::String>[])
+  @#C1
   abstract method f() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.transformed.expect
index 242be1c..8a2ff24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_class_members.dart.strong.transformed.expect
@@ -3,18 +3,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 abstract class Bar extends core::Object {
-  @self::Foo::•(const <core::String>[])
+  @#C1
   field dynamic x = null;
-  @self::Foo::•(const <core::String>[])
-  constructor •() → self::Bar
+  @#C1
+  constructor •() → self::Bar*
     : super core::Object::•()
     ;
-  @self::Foo::•(const <core::String>[])
+  @#C1
   abstract method f() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart
index d92e8a9..5ca6726 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart
@@ -10,9 +10,9 @@
 }
 
 void test() {
-  for (@Foo(/*@typeArgs=String*/ const []) int i = 0;
+  for (@Foo(/*@ typeArgs=String* */ const []) int i = 0;
        i /*@target=num::<*/< 1; i++) {}
-  for (@Foo(/*@typeArgs=String*/ const []) int i in /*@typeArgs=int*/[0]) {}
+  for (@Foo(/*@ typeArgs=String* */ const []) int i in /*@ typeArgs=int* */[0]) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect
index fef9dfe..3efbd14 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.expect
@@ -3,14 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  for (@self::Foo::•(const <dynamic>[]) core::int i = 0; i.<(1); i = i.+(1)) {
+  for (@#C1 core::int* i = 0; i.<(1); i = i.+(1)) {
   }
-  for (@self::Foo::•(const <dynamic>[]) core::int i in <dynamic>[0]) {
+  for (@#C1 core::int* i in <dynamic>[0]) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect
index fef9dfe..3efbd14 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.legacy.transformed.expect
@@ -3,14 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  for (@self::Foo::•(const <dynamic>[]) core::int i = 0; i.<(1); i = i.+(1)) {
+  for (@#C1 core::int* i = 0; i.<(1); i = i.+(1)) {
   }
-  for (@self::Foo::•(const <dynamic>[]) core::int i in <dynamic>[0]) {
+  for (@#C1 core::int* i in <dynamic>[0]) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.outline.expect
index 30bd2d7..e9ee04c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.expect
index 4136905..2a1ae24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.expect
@@ -3,14 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  for (@self::Foo::•(const <core::String>[]) core::int i = 0; i.{core::num::<}(1); i = i.{core::num::+}(1)) {
+  for (@#C1 core::int* i = 0; i.{core::num::<}(1); i = i.{core::num::+}(1)) {
   }
-  for (@self::Foo::•(const <core::String>[]) core::int i in <core::int>[0]) {
+  for (@#C1 core::int* i in <core::int*>[0]) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
index 4136905..2a1ae24 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.strong.transformed.expect
@@ -3,14 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  for (@self::Foo::•(const <core::String>[]) core::int i = 0; i.{core::num::<}(1); i = i.{core::num::+}(1)) {
+  for (@#C1 core::int* i = 0; i.{core::num::<}(1); i = i.{core::num::+}(1)) {
   }
-  for (@self::Foo::•(const <core::String>[]) core::int i in <core::int>[0]) {
+  for (@#C1 core::int* i in <core::int*>[0]) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
index 6b72671..5b124f4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart:14:34: Context: Write to i@367
+pkg/front_end/testcases/inference/downwards_inference_annotations_for_loop_variable.dart:14:34: Context: Write to i@370
        i /*@target=num::<*/< 1; i++) {}
                                  ^^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart
index 97896c7..a9752dc 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart
@@ -10,10 +10,10 @@
 }
 
 void test() {
-  @Foo(/*@typeArgs=String*/ const [])
-  var /*@type=dynamic*/ x;
+  @Foo(/*@ typeArgs=String* */ const [])
+  var /*@ type=dynamic */ x;
 
-  @Foo(/*@typeArgs=String*/ const [])
+  @Foo(/*@ typeArgs=String* */ const [])
   void f() {}
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.outline.expect
index 30bd2d7..e9ee04c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.expect
index d5e20ee..b93b09c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  @self::Foo::•(const <core::String>[]) dynamic x;
-  @self::Foo::•(const <core::String>[])
+  @#C1 dynamic x;
+  @#C1
   function f() → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.transformed.expect
index d5e20ee..b93b09c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals.dart.strong.transformed.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  @self::Foo::•(const <core::String>[]) dynamic x;
-  @self::Foo::•(const <core::String>[])
+  @#C1 dynamic x;
+  @#C1
   function f() → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart
index b28b2ed..9de884b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart
@@ -10,15 +10,15 @@
 }
 
 void test() {
-  const /*@type=int*/ x = 0;
+  const /*@ type=int* */ x = 0;
 
-  @Foo(/*@typeArgs=int*/ const [x])
-  var /*@type=dynamic*/ y;
+  @Foo(/*@ typeArgs=int* */ const [x])
+  var /*@ type=dynamic */ y;
 
-  @Foo(/*@typeArgs=int*/ const [x])
+  @Foo(/*@ typeArgs=int* */ const [x])
   void bar() {}
 
-  void baz(@Foo(/*@typeArgs=int*/ const [x]) dynamic formal) {}
+  void baz(@Foo(/*@ typeArgs=int* */ const [x]) dynamic formal) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect
index 610a4e6..cbdc206 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.expect
@@ -3,15 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → self::Foo
+  const constructor •(dynamic l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  const dynamic x = 0;
-  @self::Foo::•(const <dynamic>[x]) dynamic y;
-  @self::Foo::•(const <dynamic>[x])
+  @#C1 dynamic y;
+  @#C1
   function bar() → void {}
-  function baz(@self::Foo::•(const <dynamic>[x]) dynamic formal) → void {}
+  function baz(@#C1 dynamic formal) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect
index 610a4e6..cbdc206 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.legacy.transformed.expect
@@ -3,15 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → self::Foo
+  const constructor •(dynamic l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  const dynamic x = 0;
-  @self::Foo::•(const <dynamic>[x]) dynamic y;
-  @self::Foo::•(const <dynamic>[x])
+  @#C1 dynamic y;
+  @#C1
   function bar() → void {}
-  function baz(@self::Foo::•(const <dynamic>[x]) dynamic formal) → void {}
+  function baz(@#C1 dynamic formal) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.outline.expect
index ee6307ed..401d558 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → self::Foo
+  const constructor •(dynamic l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.expect
index 8947a5f..cbdc206 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.expect
@@ -3,15 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → self::Foo
+  const constructor •(dynamic l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  const core::int x = 0;
-  @self::Foo::•(const <core::int>[x]) dynamic y;
-  @self::Foo::•(const <core::int>[x])
+  @#C1 dynamic y;
+  @#C1
   function bar() → void {}
-  function baz(@self::Foo::•(const <core::int>[x]) dynamic formal) → void {}
+  function baz(@#C1 dynamic formal) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.transformed.expect
index 8947a5f..cbdc206 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_locals_referring_to_locals.dart.strong.transformed.expect
@@ -3,15 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(dynamic l) → self::Foo
+  const constructor •(dynamic l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  const core::int x = 0;
-  @self::Foo::•(const <core::int>[x]) dynamic y;
-  @self::Foo::•(const <core::int>[x])
+  @#C1 dynamic y;
+  @#C1
   function bar() → void {}
-  function baz(@self::Foo::•(const <core::int>[x]) dynamic formal) → void {}
+  function baz(@#C1 dynamic formal) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
index 7b0ab28..ba74a06 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart
@@ -9,10 +9,10 @@
   const Foo(List<String> l);
 }
 
-void f(@Foo(/*@typeArgs=String*/ const []) x) {}
+void f(@Foo(/*@ typeArgs=String* */ const []) x) {}
 
 class C {
-  void m(@Foo(/*@typeArgs=String*/ const []) x) {}
+  void m(@Foo(/*@ typeArgs=String* */ const []) x) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect
index 7a9bc053..2b285f4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
+  method m(@#C1 dynamic x) → void {}
 }
-static method f(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
+static method f(@#C1 dynamic x) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect
index 7a9bc053..2b285f4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.legacy.transformed.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
+  method m(@#C1 dynamic x) → void {}
 }
-static method f(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
+static method f(@#C1 dynamic x) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.outline.expect
index 308106e..4c70c66 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.outline.expect
@@ -3,11 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method m(dynamic x) → void
     ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.expect
index 42e6f96..2b285f4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
+  method m(@#C1 dynamic x) → void {}
 }
-static method f(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
+static method f(@#C1 dynamic x) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.transformed.expect
index 42e6f96..2b285f4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter.dart.strong.transformed.expect
@@ -3,15 +3,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
+  method m(@#C1 dynamic x) → void {}
 }
-static method f(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
+static method f(@#C1 dynamic x) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
index e3198ae..c568ab4 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart
@@ -10,8 +10,8 @@
 }
 
 void test() {
-  void f(@Foo(/*@typeArgs=String*/ const []) /*@type=dynamic*/ x) {}
-  var /*@type=(dynamic) -> Null*/ x = /*@returnType=Null*/ (@Foo(/*@typeArgs=String*/ const []) /*@type=dynamic*/
+  void f(@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */ x) {}
+  var /*@ type=(dynamic) ->* Null* */ x = /*@ returnType=Null* */ (@Foo(/*@ typeArgs=String* */ const []) /*@ type=dynamic */
       x) {};
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect
index e33e87f..e22e6e2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
-  dynamic x = (@self::Foo::•(const <dynamic>[]) dynamic x) → dynamic {};
+  function f(@#C1 dynamic x) → void {}
+  dynamic x = (@#C1 dynamic x) → dynamic {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect
index e33e87f..e22e6e2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.legacy.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f(@self::Foo::•(const <dynamic>[]) dynamic x) → void {}
-  dynamic x = (@self::Foo::•(const <dynamic>[]) dynamic x) → dynamic {};
+  function f(@#C1 dynamic x) → void {}
+  dynamic x = (@#C1 dynamic x) → dynamic {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.outline.expect
index 30bd2d7..e9ee04c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
index 502e69f..8bb1470 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
-  (dynamic) → core::Null x = (@self::Foo::•(const <core::String>[]) dynamic x) → core::Null {};
+  function f(@#C1 dynamic x) → void {}
+  (dynamic) →* core::Null* x = (@#C1 dynamic x) → core::Null* {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
index 502e69f..8bb1470 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_parameter_local.dart.strong.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f(@self::Foo::•(const <core::String>[]) dynamic x) → void {}
-  (dynamic) → core::Null x = (@self::Foo::•(const <core::String>[]) dynamic x) → core::Null {};
+  function f(@#C1 dynamic x) → void {}
+  (dynamic) →* core::Null* x = (@#C1 dynamic x) → core::Null* {};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect
index 0d71de2..cf4308e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → void;
+typedef F<T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>() → void {}
+  method m<T extends core::Object* = dynamic>() → void {}
 }
-static method f<T extends core::Object = dynamic>() → void {}
+static method f<T extends core::Object* = dynamic>() → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect
index 0d71de2..cf4308e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.legacy.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → void;
+typedef F<T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>() → void {}
+  method m<T extends core::Object* = dynamic>() → void {}
 }
-static method f<T extends core::Object = dynamic>() → void {}
+static method f<T extends core::Object* = dynamic>() → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
index a850d9b..38a6f9a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable.dart.outline.expect
@@ -2,22 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → void;
+typedef F<T extends core::Object* = dynamic> = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  method m<T extends core::Object = dynamic>() → void
+  method m<T extends core::Object* = dynamic>() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → void
+static method f<T extends core::Object* = dynamic>() → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
index b048a1b..2eae17d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart
@@ -10,9 +10,9 @@
 }
 
 void test() {
-  void f<@Foo(/*@typeArgs=String*/ const []) T>() {}
-  var /*@type=<@Foo::•(const <String>[]) T extends Object = dynamic>() -> Null*/ x =
-      <@Foo(/*@typeArgs=String*/ const []) T> /*@returnType=Null*/ () {};
+  void f<@Foo(/*@ typeArgs=String* */ const []) T>() {}
+  var /*@ type=<@Foo::•(const <String*>[]) T extends Object* = dynamic>() ->* Null* */ x =
+      <@Foo(/*@ typeArgs=String* */ const []) T> /*@ returnType=Null* */ () {};
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect
index 96c9a5c..7689375 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <dynamic>[]) T extends core::Object = dynamic>() → void {}
-  dynamic x = <@self::Foo::•(const <dynamic>[]) T extends core::Object = dynamic>() → dynamic {};
+  function f<@self::Foo::•(const <dynamic>[]) T extends core::Object* = dynamic>() → void {}
+  dynamic x = <@self::Foo::•(const <dynamic>[]) T extends core::Object* = dynamic>() → dynamic {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect
index 96c9a5c..7689375 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <dynamic>[]) T extends core::Object = dynamic>() → void {}
-  dynamic x = <@self::Foo::•(const <dynamic>[]) T extends core::Object = dynamic>() → dynamic {};
+  function f<@self::Foo::•(const <dynamic>[]) T extends core::Object* = dynamic>() → void {}
+  dynamic x = <@self::Foo::•(const <dynamic>[]) T extends core::Object* = dynamic>() → dynamic {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.outline.expect
index 30bd2d7..e9ee04c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.outline.expect
@@ -3,7 +3,8 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method test() → void
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
index a438561..4fcf15f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → void {}
-  <@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → core::Null x = <@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → core::Null {};
+  function f<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void {}
+  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null* x = <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → core::Null* {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
index a438561..4fcf15f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_type_variable_local.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method test() → void {
-  function f<@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → void {}
-  <@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → core::Null x = <@self::Foo::•(const <core::String>[]) T extends core::Object = dynamic>() → core::Null {};
+  function f<@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → void {}
+  <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() →* core::Null* x = <@self::Foo::•(const <core::String*>[]) T extends core::Object* = dynamic>() → core::Null* {};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart
index 6158bc5..86d985c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart
@@ -9,7 +9,7 @@
   const Foo(List<String> l);
 }
 
-@Foo(/*@typeArgs=String*/ const [])
+@Foo(/*@ typeArgs=String* */ const [])
 typedef void F();
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect
index 96a26e4..8e70fef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-@self::Foo::•(const <dynamic>[])
-typedef F = () → void;
+@#C1
+typedef F = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect
index 96a26e4..8e70fef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-@self::Foo::•(const <dynamic>[])
-typedef F = () → void;
+@#C1
+typedef F = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.outline.expect
index bd6a29f..1f341e9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.outline.expect
@@ -2,9 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
+    : super core::Object::•()
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.expect
index dfedff2..8e70fef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-@self::Foo::•(const <core::String>[])
-typedef F = () → void;
+@#C1
+typedef F = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.transformed.expect
index dfedff2..8e70fef 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_annotations_typedef.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-@self::Foo::•(const <core::String>[])
-typedef F = () → void;
+@#C1
+typedef F = () →* void;
 class Foo extends core::Object {
-  const constructor •(core::List<core::String> l) → self::Foo
+  const constructor •(core::List<core::String*>* l) → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Foo {}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart
index b294ba1..4291ecb 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart
@@ -7,8 +7,8 @@
 
 void test() {
   List<int> l;
-  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
-  l = (l = /*@typeArgs=int*/ [1]);
+  l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
+  l = (l = /*@ typeArgs=int* */ [1]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect
index e801592..d89517b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::List<core::int> l;
+  core::List<core::int*>* l;
   l = <dynamic>["hello"];
   l = l = <dynamic>[1];
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect
index e801592..d89517b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::List<core::int> l;
+  core::List<core::int*>* l;
   l = <dynamic>["hello"];
   l = l = <dynamic>[1];
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
index c65e4ae..70d558d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.expect
@@ -2,20 +2,20 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
-//                                                                     ^
+//   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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::List<core::int*>* l;
+  l = <core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
-                                                                    ^" in "hello" as{TypeError} core::int];
-  l = l = <core::int>[1];
+  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_assignment_statements.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
index c65e4ae..70d558d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
-//                                                                     ^
+//   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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::List<core::int*>* l;
+  l = <core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"];
-                                                                    ^" in "hello" as{TypeError} core::int];
-  l = l = <core::int>[1];
+  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_assignment_statements.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
index c96c4a6..19c94fa 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart.type_promotion.expect
@@ -1,9 +1,9 @@
 pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:10:5: Context: Write to l@288
-  l = /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
+  l = /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"];
     ^
 pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:10: Context: Write to l@288
-  l = (l = /*@typeArgs=int*/ [1]);
+  l = (l = /*@ typeArgs=int* */ [1]);
          ^
 pkg/front_end/testcases/inference/downwards_inference_assignment_statements.dart:11:5: Context: Write to l@288
-  l = (l = /*@typeArgs=int*/ [1]);
+  l = (l = /*@ typeArgs=int* */ [1]);
     ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart
index 305d1d6..0854541 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart
@@ -9,7 +9,7 @@
 
 Future main() async {
   dynamic d;
-  List<int> l0 = await /*@typeArgs=int*/ [/*info:DYNAMIC_CAST*/ d];
-  List<int> l1 = await new /*@typeArgs=List<int>*/ Future.value(
-      /*@typeArgs=int*/ [d]);
+  List<int> l0 = await /*@ typeArgs=int* */ [/*info:DYNAMIC_CAST*/ d];
+  List<int> l1 = await new /*@ typeArgs=List<int*>* */ Future.value(
+      /*@ typeArgs=int* */ [d]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect
index 62b013b..2b27d150 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.expect
@@ -5,8 +5,8 @@
 
 import "dart:async";
 
-static method main() → asy::Future<dynamic> async {
+static method main() → asy::Future<dynamic>* async {
   dynamic d;
-  core::List<core::int> l0 = await<dynamic>[d];
-  core::List<core::int> l1 = await asy::Future::value<dynamic>(<dynamic>[d]);
+  core::List<core::int*>* l0 = await<dynamic>[d];
+  core::List<core::int*>* l1 = await asy::Future::value<dynamic>(<dynamic>[d]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect
index 313a2ae..3e4e983 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.legacy.transformed.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method main() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -20,9 +20,9 @@
       {
         dynamic d;
         [yield] let dynamic #t1 = asy::_awaitHelper(<dynamic>[d], :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l0 = :result;
+        core::List<core::int*>* l0 = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<dynamic>(<dynamic>[d]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l1 = :result;
+        core::List<core::int*>* l1 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.expect
index 63f6749..360f7c7 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.expect
@@ -5,8 +5,8 @@
 
 import "dart:async";
 
-static method main() → asy::Future<dynamic> async {
+static method main() → asy::Future<dynamic>* async {
   dynamic d;
-  core::List<core::int> l0 = await<core::int>[d as{TypeError} core::int];
-  core::List<core::int> l1 = await asy::Future::value<core::List<core::int>>(<core::int>[d as{TypeError} core::int]);
+  core::List<core::int*>* l0 = await<core::int*>[d as{TypeError} core::int*];
+  core::List<core::int*>* l1 = await asy::Future::value<core::List<core::int*>*>(<core::int*>[d as{TypeError} core::int*]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
index 4a8a371..bc89d37 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_async_await.dart.strong.transformed.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method main() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -19,10 +19,10 @@
       #L1:
       {
         dynamic d;
-        [yield] let dynamic #t1 = asy::_awaitHelper(<core::int>[d as{TypeError} core::int], :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l0 = :result;
-        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int>>(<core::int>[d as{TypeError} core::int]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::int> l1 = :result;
+        [yield] let dynamic #t1 = asy::_awaitHelper(<core::int*>[d as{TypeError} core::int*], :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::int*>* l0 = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::List<core::int*>*>(<core::int*>[d as{TypeError} core::int*]), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::int*>* l1 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart
index 605c8f09..2f0d7f6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart
@@ -16,22 +16,22 @@
 Future f() async {
   dynamic d;
   Object o;
-  for (var /*@type=dynamic*/ x in /*@typeArgs=Iterable<dynamic>*/ F()) {}
-  for (dynamic x in /*@typeArgs=Iterable<dynamic>*/ F()) {}
-  for (Object x in /*@typeArgs=Iterable<Object>*/ F()) {}
-  for (d in /*@typeArgs=Iterable<dynamic>*/ F()) {}
-  for (o in /*@typeArgs=Iterable<Object>*/ F()) {}
-  await for (var /*@type=dynamic*/ x in /*@typeArgs=Stream<dynamic>*/ F()) {}
-  await for (dynamic x in /*@typeArgs=Stream<dynamic>*/ F()) {}
-  await for (Object x in /*@typeArgs=Stream<Object>*/ F()) {}
-  await for (d in /*@typeArgs=Stream<dynamic>*/ F()) {}
-  await for (o in /*@typeArgs=Stream<Object>*/ F()) {}
+  for (var /*@ type=dynamic */ x in /*@ typeArgs=Iterable<dynamic>* */ F()) {}
+  for (dynamic x in /*@ typeArgs=Iterable<dynamic>* */ F()) {}
+  for (Object x in /*@ typeArgs=Iterable<Object*>* */ F()) {}
+  for (d in /*@ typeArgs=Iterable<dynamic>* */ F()) {}
+  for (o in /*@ typeArgs=Iterable<Object*>* */ F()) {}
+  await for (var /*@ type=dynamic */ x in /*@ typeArgs=Stream<dynamic>* */ F()) {}
+  await for (dynamic x in /*@ typeArgs=Stream<dynamic>* */ F()) {}
+  await for (Object x in /*@ typeArgs=Stream<Object*>* */ F()) {}
+  await for (d in /*@ typeArgs=Stream<dynamic>* */ F()) {}
+  await for (o in /*@ typeArgs=Stream<Object*>* */ F()) {}
 }
 
 Future main() async {
-  for (int x in /*@typeArgs=int*/ [1, 2, 3]) {}
-  for (num x in /*@typeArgs=num*/ [1, 2, 3]) {}
-  for (var /*@type=int*/ x in /*@typeArgs=int*/ [1, 2, 3]) {}
-  await for (int x in new /*@typeArgs=int*/ MyStream()) {}
-  await for (var /*@type=int*/ x in new MyStream<int>()) {}
+  for (int x in /*@ typeArgs=int* */ [1, 2, 3]) {}
+  for (num x in /*@ typeArgs=num* */ [1, 2, 3]) {}
+  for (var /*@ type=int* */ x in /*@ typeArgs=int* */ [1, 2, 3]) {}
+  await for (int x in new /*@ typeArgs=int* */ MyStream()) {}
+  await for (var /*@ type=int* */ x in new MyStream<int>()) {}
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect
index 9fb31e6..926fb1a 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.expect
@@ -5,20 +5,20 @@
 
 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>
+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;
 }
-static method F<T extends core::Object = dynamic>() → self::F::T
+static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
-static method f() → asy::Future<dynamic> async {
+static method f() → asy::Future<dynamic>* async {
   dynamic d;
-  core::Object o;
+  core::Object* o;
   for (dynamic x in self::F<dynamic>()) {
   }
   for (dynamic x in self::F<dynamic>()) {
   }
-  for (core::Object x in self::F<dynamic>()) {
+  for (core::Object* x in self::F<dynamic>()) {
   }
   for (final dynamic #t1 in self::F<dynamic>()) {
     d = #t1;
@@ -30,7 +30,7 @@
   }
   await for (dynamic x in self::F<dynamic>()) {
   }
-  await for (core::Object x in self::F<dynamic>()) {
+  await for (core::Object* x in self::F<dynamic>()) {
   }
   await for (final dynamic #t3 in self::F<dynamic>()) {
     d = #t3;
@@ -39,15 +39,15 @@
     o = #t4;
   }
 }
-static method main() → asy::Future<dynamic> async {
-  for (core::int x in <dynamic>[1, 2, 3]) {
+static method main() → asy::Future<dynamic>* async {
+  for (core::int* x in <dynamic>[1, 2, 3]) {
   }
-  for (core::num x in <dynamic>[1, 2, 3]) {
+  for (core::num* x in <dynamic>[1, 2, 3]) {
   }
   for (dynamic x in <dynamic>[1, 2, 3]) {
   }
-  await for (core::int x in self::MyStream::•<dynamic>()) {
+  await for (core::int* x in self::MyStream::•<dynamic>()) {
   }
-  await for (dynamic x in self::MyStream::•<core::int>()) {
+  await for (dynamic x in self::MyStream::•<core::int*>()) {
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect
index ac63b98..2dbd5a0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.legacy.transformed.expect
@@ -5,15 +5,15 @@
 
 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>
+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;
 }
-static method F<T extends core::Object = dynamic>() → self::F::T
+static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
-static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method f() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -28,12 +28,12 @@
       #L1:
       {
         dynamic d;
-        core::Object o;
+        core::Object* o;
         for (dynamic x in self::F<dynamic>()) {
         }
         for (dynamic x in self::F<dynamic>()) {
         }
-        for (core::Object x in self::F<dynamic>()) {
+        for (core::Object* x in self::F<dynamic>()) {
         }
         for (final dynamic #t1 in self::F<dynamic>()) {
           d = #t1;
@@ -44,12 +44,11 @@
         {
           dynamic :stream = self::F<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t3 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t3 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -67,12 +66,11 @@
         {
           dynamic :stream = self::F<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t6 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t6 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -90,15 +88,14 @@
         {
           dynamic :stream = self::F<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::Object> :for-iterator = new asy::_StreamIterator::•<core::Object>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t9 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::Object x = :for-iterator.{asy::_StreamIterator::current};
+                core::Object* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
@@ -113,12 +110,11 @@
         {
           dynamic :stream = self::F<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t12 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
@@ -138,12 +134,11 @@
         {
           dynamic :stream = self::F<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t16 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
@@ -173,9 +168,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method main() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -189,24 +184,23 @@
     try {
       #L7:
       {
-        for (core::int x in <dynamic>[1, 2, 3]) {
+        for (core::int* x in <dynamic>[1, 2, 3]) {
         }
-        for (core::num x in <dynamic>[1, 2, 3]) {
+        for (core::num* x in <dynamic>[1, 2, 3]) {
         }
         for (dynamic x in <dynamic>[1, 2, 3]) {
         }
         {
           dynamic :stream = self::MyStream::•<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L8:
             while (true) {
-              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t20 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
@@ -219,14 +213,13 @@
             }
         }
         {
-          dynamic :stream = self::MyStream::•<core::int>();
+          dynamic :stream = self::MyStream::•<core::int*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L9:
             while (true) {
-              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t23 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
index 1c565f6..7ed3ed3 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.expect
@@ -5,49 +5,49 @@
 
 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>
+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;
 }
-static method F<T extends core::Object = dynamic>() → self::F::T
+static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
-static method f() → asy::Future<dynamic> async {
+static method f() → asy::Future<dynamic>* async {
   dynamic d;
-  core::Object o;
-  for (dynamic x in self::F<core::Iterable<dynamic>>()) {
+  core::Object* o;
+  for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
   }
-  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 (core::Object* x in self::F<core::Iterable<core::Object*>*>()) {
   }
-  for (final dynamic #t1 in self::F<core::Iterable<dynamic>>()) {
+  for (final dynamic #t1 in self::F<core::Iterable<dynamic>*>()) {
     d = #t1;
   }
-  for (final core::Object #t2 in self::F<core::Iterable<core::Object>>()) {
+  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 (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 (core::Object* x in self::F<asy::Stream<core::Object*>*>()) {
   }
-  await for (final dynamic #t3 in self::F<asy::Stream<dynamic>>()) {
+  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>>()) {
+  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]) {
+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::num* x in <core::num*>[1, 2, 3]) {
   }
-  for (core::int x in <core::int>[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*>()) {
   }
-  await for (core::int x in self::MyStream::•<core::int>()) {
+  await for (core::int* x in self::MyStream::•<core::int*>()) {
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
index 498f778..c9450cf 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_for_each.dart.strong.transformed.expect
@@ -5,15 +5,15 @@
 
 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>
+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;
 }
-static method F<T extends core::Object = dynamic>() → self::F::T
+static method F<T extends core::Object* = dynamic>() → self::F::T*
   return null;
-static method f() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method f() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -28,28 +28,27 @@
       #L1:
       {
         dynamic d;
-        core::Object o;
-        for (dynamic x in self::F<core::Iterable<dynamic>>()) {
+        core::Object* o;
+        for (dynamic x in self::F<core::Iterable<dynamic>*>()) {
         }
-        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 (core::Object* x in self::F<core::Iterable<core::Object*>*>()) {
         }
-        for (final dynamic #t1 in self::F<core::Iterable<dynamic>>()) {
+        for (final dynamic #t1 in self::F<core::Iterable<dynamic>*>()) {
           d = #t1;
         }
-        for (final core::Object #t2 in self::F<core::Iterable<core::Object>>()) {
+        for (final core::Object* #t2 in self::F<core::Iterable<core::Object*>*>()) {
           o = #t2;
         }
         {
-          dynamic :stream = self::F<asy::Stream<dynamic>>();
+          dynamic :stream = self::F<asy::Stream<dynamic>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t3 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t3 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t4 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -65,14 +64,13 @@
             }
         }
         {
-          dynamic :stream = self::F<asy::Stream<dynamic>>();
+          dynamic :stream = self::F<asy::Stream<dynamic>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t6 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t6 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t7 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -88,17 +86,16 @@
             }
         }
         {
-          dynamic :stream = self::F<asy::Stream<core::Object>>();
+          dynamic :stream = self::F<asy::Stream<core::Object*>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::Object> :for-iterator = new asy::_StreamIterator::•<core::Object>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t9 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::Object x = :for-iterator.{asy::_StreamIterator::current};
+                core::Object* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
@@ -111,14 +108,13 @@
             }
         }
         {
-          dynamic :stream = self::F<asy::Stream<dynamic>>();
+          dynamic :stream = self::F<asy::Stream<dynamic>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t12 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
@@ -136,17 +132,16 @@
             }
         }
         {
-          dynamic :stream = self::F<asy::Stream<core::Object>>();
+          dynamic :stream = self::F<asy::Stream<core::Object*>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::Object> :for-iterator = new asy::_StreamIterator::•<core::Object>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::Object*>* :for-iterator = new asy::_StreamIterator::•<core::Object*>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t16 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final core::Object #t18 = :for-iterator.{asy::_StreamIterator::current};
+                final core::Object* #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   o = #t18;
                 }
@@ -173,9 +168,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method main() → asy::Future<dynamic> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+static method main() → asy::Future<dynamic>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -189,24 +184,23 @@
     try {
       #L7:
       {
-        for (core::int x in <core::int>[1, 2, 3]) {
+        for (core::int* x in <core::int*>[1, 2, 3]) {
         }
-        for (core::num x in <core::num>[1, 2, 3]) {
+        for (core::num* x in <core::num*>[1, 2, 3]) {
         }
-        for (core::int x in <core::int>[1, 2, 3]) {
+        for (core::int* x in <core::int*>[1, 2, 3]) {
         }
         {
-          dynamic :stream = self::MyStream::•<core::int>();
+          dynamic :stream = self::MyStream::•<core::int*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L8:
             while (true) {
-              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t20 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
@@ -219,17 +213,16 @@
             }
         }
         {
-          dynamic :stream = self::MyStream::•<core::int>();
+          dynamic :stream = self::MyStream::•<core::int*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L9:
             while (true) {
-              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t23 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart
index 2ac8ebd..8e40fda 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart
@@ -9,14 +9,14 @@
 
 class Foo {
   List<int> x;
-  Foo([this.x = /*@typeArgs=int*/ const [1]]);
-  Foo.named([List<int> x = /*@typeArgs=int*/ const [1]]);
+  Foo([this.x = /*@ typeArgs=int* */ const [1]]);
+  Foo.named([List<int> x = /*@ typeArgs=int* */ const [1]]);
 }
 
-void f([List<int> l = /*@typeArgs=int*/ const [1]]) {}
+void f([List<int> l = /*@ typeArgs=int* */ const [1]]) {}
 // We do this inference in an early task but don't preserve the infos.
-Function2<List<int>, String> g = /*@returnType=String*/ (
-        [/*@type=List<int>*/ llll = /*@typeArgs=int*/ const [1]]) =>
+Function2<List<int>, String> g = /*@ returnType=String* */ (
+        [/*@ type=List<int*>* */ llll = /*@ typeArgs=int* */ const [1]]) =>
     "hello";
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect
index d64cebd..c0ea437 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.expect
@@ -2,16 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
+typedef Function2<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 = const <dynamic>[1]]) → self::Foo
+  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 = const <dynamic>[1]]) → self::Foo
+  constructor named([core::List<core::int*>* x = #C2]) → self::Foo*
     : self::Foo::x = null, super core::Object::•()
     ;
 }
-static field ([core::List<core::int>]) → core::String g = ([dynamic llll = const <dynamic>[1]]) → dynamic => "hello";
-static method f([core::List<core::int> l = const <dynamic>[1]]) → void {}
+static field ([core::List<core::int*>*]) →* core::String* g = ([dynamic llll = #C2]) → dynamic => "hello";
+static method f([core::List<core::int*>* l = #C2]) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = <dynamic>[#C1]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect
index d64cebd..c0ea437 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.legacy.transformed.expect
@@ -2,16 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
+typedef Function2<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 = const <dynamic>[1]]) → self::Foo
+  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 = const <dynamic>[1]]) → self::Foo
+  constructor named([core::List<core::int*>* x = #C2]) → self::Foo*
     : self::Foo::x = null, super core::Object::•()
     ;
 }
-static field ([core::List<core::int>]) → core::String g = ([dynamic llll = const <dynamic>[1]]) → dynamic => "hello";
-static method f([core::List<core::int> l = const <dynamic>[1]]) → void {}
+static field ([core::List<core::int*>*]) →* core::String* g = ([dynamic llll = #C2]) → dynamic => "hello";
+static method f([core::List<core::int*>* l = #C2]) → void {}
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = <dynamic>[#C1]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
index a211ade..ae4583b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.expect
@@ -2,16 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
+typedef Function2<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 = const <core::int>[1]]) → self::Foo
+  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 = const <core::int>[1]]) → self::Foo
+  constructor named([core::List<core::int*>* x = #C2]) → self::Foo*
     : self::Foo::x = null, super core::Object::•()
     ;
 }
-static field ([core::List<core::int>]) → core::String g = ([core::List<core::int> llll = const <core::int>[1]]) → core::String => "hello";
-static method f([core::List<core::int> l = const <core::int>[1]]) → void {}
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
index a211ade..ae4583b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_initializing_formal_default_formal.dart.strong.transformed.expect
@@ -2,16 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = ([S]) → T;
+typedef Function2<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 = const <core::int>[1]]) → self::Foo
+  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 = const <core::int>[1]]) → self::Foo
+  constructor named([core::List<core::int*>* x = #C2]) → self::Foo*
     : self::Foo::x = null, super core::Object::•()
     ;
 }
-static field ([core::List<core::int>]) → core::String g = ([core::List<core::int> llll = const <core::int>[1]]) → core::String => "hello";
-static method f([core::List<core::int> l = const <core::int>[1]]) → void {}
+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_inside_top_level.dart b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart
index c50d687..ef5f40e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart
@@ -13,7 +13,7 @@
   B(T x);
 }
 
-var t1 = new A().. /*@target=A::b*/ b = new /*@typeArgs=int*/ B(1);
-var t2 = <B<int>>[new /*@typeArgs=int*/ B(2)];
+var t1 = new A().. /*@target=A::b*/ b = new /*@ typeArgs=int* */ B(1);
+var t2 = <B<int>>[new /*@ typeArgs=int* */ B(2)];
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect
index b6183be..6b51b52 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 static field dynamic t1 = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.b = new self::B::•<dynamic>(1) in #t1;
-static field dynamic t2 = <self::B<core::int>>[new self::B::•<dynamic>(2)];
+static field dynamic t2 = <self::B<core::int*>*>[new self::B::•<dynamic>(2)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect
index b6183be..6b51b52 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 static field dynamic t1 = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.b = new self::B::•<dynamic>(1) in #t1;
-static field dynamic t2 = <self::B<core::int>>[new self::B::•<dynamic>(2)];
+static field dynamic t2 = <self::B<core::int*>*>[new self::B::•<dynamic>(2)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
index d63d15a..ad0588e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A t1 = let final self::A #t1 = new self::A::•() in let final dynamic #t2 = #t1.{self::A::b} = new self::B::•<core::int>(1) in #t1;
-static field core::List<self::B<core::int>> t2 = <self::B<core::int>>[new self::B::•<core::int>(2)];
+static field self::A* t1 = let final self::A* #t1 = new self::A::•() in let final dynamic #t2 = #t1.{self::A::b} = new self::B::•<core::int*>(1) in #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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
index dbeb264..2d9066f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A t1 = let final self::A #t1 = new self::A::•() in let final self::B<core::int> #t2 = #t1.{self::A::b} = new self::B::•<core::int>(1) in #t1;
-static field core::List<self::B<core::int>> t2 = <self::B<core::int>>[new self::B::•<core::int>(2)];
+static field self::A* t1 = let final self::A* #t1 = new self::A::•() in let final self::B<core::int*>* #t2 = #t1.{self::A::b} = new self::B::•<core::int*>(1) in #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 b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
index aec027f..7bbdc9e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart
@@ -9,6 +9,6 @@
   A(T x);
 }
 
-var t1 = <A<int>>[new /*@typeArgs=int*/ A(1)];
+var t1 = <A<int>>[new /*@ typeArgs=int* */ A(1)];
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect
index a8ecab3..b119007 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic t1 = <self::A<core::int>>[new self::A::•<dynamic>(1)];
+static field dynamic t1 = <self::A<core::int*>*>[new self::A::•<dynamic>(1)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
index a8ecab3..b119007 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic t1 = <self::A<core::int>>[new self::A::•<dynamic>(1)];
+static field dynamic t1 = <self::A<core::int*>*>[new self::A::•<dynamic>(1)];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
index 6216a0d..e341531 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -2,8 +2,8 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
 static field dynamic t1;
diff --git a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
index ec108ae..4a90807 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::int>> t1 = <self::A<core::int>>[new self::A::•<core::int>(1)];
+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_inside_top_level_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
index ec108ae..4a90807 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::int>> t1 = <self::A<core::int>>[new self::A::•<core::int>(1)];
+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 b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart
index 56a93c0..d0c1913 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart
@@ -26,56 +26,56 @@
 }
 
 void test() {
-  new F0(/*@typeArgs=int*/ []);
-  new F0(/*@typeArgs=int*/ [3]);
+  new F0(/*@ typeArgs=int* */ []);
+  new F0(/*@ typeArgs=int* */ [3]);
   new F0(
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  new F0(/*@typeArgs=int*/ [
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  new F0(/*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F1(a: /*@typeArgs=int*/ []);
-  new F1(a: /*@typeArgs=int*/ [3]);
-  new F1(a: /*@typeArgs=int*/ [
+  new F1(a: /*@ typeArgs=int* */ []);
+  new F1(a: /*@ typeArgs=int* */ [3]);
+  new F1(a: /*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
   ]);
-  new F1(a: /*@typeArgs=int*/ [
+  new F1(a: /*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F2(/*@typeArgs=int*/ []);
-  new F2(/*@typeArgs=int*/ [3]);
+  new F2(/*@ typeArgs=int* */ []);
+  new F2(/*@ typeArgs=int* */ [3]);
   new F2(
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  new F2(/*@typeArgs=int*/ [
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  new F2(/*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F3(/*@typeArgs=Iterable<int>*/ []);
-  new F3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new F3(/*@ typeArgs=Iterable<int*>* */ []);
+  new F3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  new F3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  new F3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  new F3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  new F3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 
-  new F4(a: /*@typeArgs=Iterable<int>*/ []);
-  new F4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new F4(a: /*@ typeArgs=Iterable<int*>* */ []);
+  new F4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  new F4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  new F4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  new F4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  new F4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect
index 2c7378c..9974729 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → self::F0
+  constructor •(core::List<core::int*>* a) → self::F0*
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → self::F1
+  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → self::F2
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → self::F3
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
     : super core::Object::•() {}
 }
 class F4 extends core::Object {
-  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
     : super core::Object::•() {}
 }
 static method test() → void {
@@ -45,3 +45,7 @@
   new self::F4::•(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
index 2c7378c..9974729 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class F0 extends core::Object {
-  constructor •(core::List<core::int> a) → self::F0
+  constructor •(core::List<core::int*>* a) → self::F0*
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → self::F1
+  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → self::F2
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → self::F3
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
     : super core::Object::•() {}
 }
 class F4 extends core::Object {
-  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
     : super core::Object::•() {}
 }
 static method test() → void {
@@ -45,3 +45,7 @@
   new self::F4::•(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
index 9eda7db..362c6b2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
@@ -22,109 +22,113 @@
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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
+  constructor •(core::List<core::int*>* a) → self::F0*
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → self::F1
+  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → self::F2
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → self::F3
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
     : super core::Object::•() {}
 }
 class F4 extends core::Object {
-  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
     : super core::Object::•() {}
 }
 static method test() → void {
-  new self::F0::•(<core::int>[]);
-  new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  new self::F0::•(<core::int*>[]);
+  new self::F0::•(<core::int*>[3]);
+  new self::F0::•(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•(<core::int>[let final<BottomType> #t2 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•(<core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = 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'.
+                                               ^" 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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                               ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F2::•(<core::int*>[]);
+  new self::F2::•(<core::int*>[3]);
+  new self::F2::•(<core::int*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•(<core::int>[let final<BottomType> #t6 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•(<core::int*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
-                                                                  ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
+    /*@ 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_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 9eda7db..362c6b2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
@@ -22,109 +22,113 @@
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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
+  constructor •(core::List<core::int*>* a) → self::F0*
     : super core::Object::•() {}
 }
 class F1 extends core::Object {
-  constructor •({core::List<core::int> a = null}) → self::F1
+  constructor •({core::List<core::int*>* a = #C1}) → self::F1*
     : super core::Object::•() {}
 }
 class F2 extends core::Object {
-  constructor •(core::Iterable<core::int> a) → self::F2
+  constructor •(core::Iterable<core::int*>* a) → self::F2*
     : super core::Object::•() {}
 }
 class F3 extends core::Object {
-  constructor •(core::Iterable<core::Iterable<core::int>> a) → self::F3
+  constructor •(core::Iterable<core::Iterable<core::int*>*>* a) → self::F3*
     : super core::Object::•() {}
 }
 class F4 extends core::Object {
-  constructor •({core::Iterable<core::Iterable<core::int>> a = null}) → self::F4
+  constructor •({core::Iterable<core::Iterable<core::int*>*>* a = #C1}) → self::F4*
     : super core::Object::•() {}
 }
 static method test() → void {
-  new self::F0::•(<core::int>[]);
-  new self::F0::•(<core::int>[3]);
-  new self::F0::•(<core::int>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  new self::F0::•(<core::int*>[]);
+  new self::F0::•(<core::int*>[3]);
+  new self::F0::•(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•(<core::int>[let final<BottomType> #t2 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•(<core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = 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'.
+                                               ^" 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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                               ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•(a: <core::int>[let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  new self::F2::•(<core::int*>[]);
+  new self::F2::•(<core::int*>[3]);
+  new self::F2::•(<core::int*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•(<core::int>[let final<BottomType> #t6 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•(<core::int*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:65:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:74:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_constructor_arguments_infer_downwards.dart:77:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
-                                                                  ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
+    /*@ 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 b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart
index 9ba6a69..9e641cf 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart
@@ -11,46 +11,46 @@
 void f3(Iterable<Iterable<int>> a) {}
 void f4({Iterable<Iterable<int>> a}) {}
 void test() {
-  f0(/*@typeArgs=int*/ []);
-  f0(/*@typeArgs=int*/ [3]);
-  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+  f0(/*@ typeArgs=int* */ []);
+  f0(/*@ typeArgs=int* */ [3]);
+  f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  f0(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
 
-  f1(a: /*@typeArgs=int*/ []);
-  f1(a: /*@typeArgs=int*/ [3]);
-  f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  f1(a: /*@typeArgs=int*/ [
+  f1(a: /*@ typeArgs=int* */ []);
+  f1(a: /*@ typeArgs=int* */ [3]);
+  f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  f1(a: /*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  f2(/*@typeArgs=int*/ []);
-  f2(/*@typeArgs=int*/ [3]);
-  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
+  f2(/*@ typeArgs=int* */ []);
+  f2(/*@ typeArgs=int* */ [3]);
+  f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
 
-  f3(/*@typeArgs=Iterable<int>*/ []);
-  f3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  f3(/*@ typeArgs=Iterable<int*>* */ []);
+  f3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  f3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  f3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  f3(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  f3(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 
-  f4(a: /*@typeArgs=Iterable<int>*/ []);
-  f4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  f4(a: /*@ typeArgs=Iterable<int*>* */ []);
+  f4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  f4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  f4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  f4(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  f4(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect
index c1a3c1f..790b3c9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.expect
@@ -2,11 +2,11 @@
 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 = null}) → 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 = null}) → void {}
+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(<dynamic>[]);
   self::f0(<dynamic>[3]);
@@ -30,3 +30,7 @@
   self::f4(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect
index c1a3c1f..790b3c9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 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 = null}) → 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 = null}) → void {}
+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(<dynamic>[]);
   self::f0(<dynamic>[3]);
@@ -30,3 +30,7 @@
   self::f4(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
index 00e805a..25b17e9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.expect
@@ -2,114 +2,118 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to '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:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to '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:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                    ^
+//   f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
-//                                                                    ^
+//   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:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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 = null}) → 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 = null}) → void {}
+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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  self::f0(<core::int*>[]);
+  self::f0(<core::int*>[3]);
+  self::f0(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                   ^" in "hello" as{TypeError} core::int]);
-  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: 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*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21: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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                      ^" in "hello" as{TypeError} core::int]);
-  self::f1(a: <core::int>[let final<BottomType> #t4 = 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'.
+  f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                         ^" in "hello" as{TypeError} core::int*]);
+  self::f1(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  self::f2(<core::int*>[]);
+  self::f2(<core::int*>[3]);
+  self::f2(<core::int*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                   ^" in "hello" as{TypeError} core::int]);
-  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: 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*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
-                                                                  ^" in "hello" as{TypeError} core::int]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
-                                                                  ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
+    /*@ 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.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
index 00e805a..25b17e9 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart.strong.transformed.expect
@@ -2,114 +2,118 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to '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:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to '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:71: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//   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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
+// Try changing the type of the left hand side, or casting the right hand side to '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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                    ^
+//   f2(/*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+//                                                                       ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello", 3]);
-//                                                                    ^
+//   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:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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 = null}) → 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 = null}) → void {}
+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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:16:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  self::f0(<core::int*>[]);
+  self::f0(<core::int*>[3]);
+  self::f0(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f0(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                   ^" in "hello" as{TypeError} core::int]);
-  self::f0(<core::int>[let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:17:68: 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*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:21: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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f1(a: /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                      ^" in "hello" as{TypeError} core::int]);
-  self::f1(a: <core::int>[let final<BottomType> #t4 = 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'.
+  f1(a: /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                         ^" in "hello" as{TypeError} core::int*]);
+  self::f1(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:29:68: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" in "hello" as{TypeError} core::int*, 3]);
+  self::f2(<core::int*>[]);
+  self::f2(<core::int*>[3]);
+  self::f2(<core::int*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  f2(/*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                   ^" in "hello" as{TypeError} core::int]);
-  self::f2(<core::int>[let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:30:68: 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*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:37:67: 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]
-                                                                  ^" in "hello" as{TypeError} core::int]]);
-  self::f3(<core::Iterable<core::int>>[<core::int>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:40:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:49:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_arguments_infer_downwards.dart:52:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"],
-                                                                  ^" in "hello" as{TypeError} core::int], <core::int>[3]]);
+    /*@ 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 b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
index 93f4f7c..907a37c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart
@@ -9,60 +9,60 @@
 
 void test() {
   {
-    Function2<int, String> l0 = /*@returnType=Null*/ (int x) => null;
-    Function2<int, String> l1 = /*@returnType=String*/ (int x) => "hello";
+    Function2<int, String> l0 = /*@ returnType=Null* */ (int x) => null;
+    Function2<int, String> l1 = /*@ returnType=String* */ (int x) => "hello";
     Function2<int, String>
-        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
+        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
             "hello";
     Function2<int, String>
-        l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
-    Function2<int, String> l4 = /*@returnType=String*/ (int x) {
+        l3 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (int x) => 3;
+    Function2<int, String> l4 = /*@ returnType=String* */ (int x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
     };
   }
   {
-    Function2<int, String> l0 = /*@returnType=Null*/ (/*@type=int*/ x) => null;
-    Function2<int, String> l1 = /*@returnType=String*/ (/*@type=int*/ x) =>
+    Function2<int, String> l0 = /*@ returnType=Null* */ (/*@ type=int* */ x) => null;
+    Function2<int, String> l1 = /*@ returnType=String* */ (/*@ type=int* */ x) =>
         "hello";
     Function2<int, String>
-        l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (/*@type=int*/ x) =>
+        l2 = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
             3;
-    Function2<int, String> l3 = /*@returnType=String*/ (/*@type=int*/ x) {
+    Function2<int, String> l3 = /*@ returnType=String* */ (/*@ type=int* */ x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
     };
-    Function2<int, String> l4 = /*@returnType=String*/ (/*@type=int*/ x) {
+    Function2<int, String> l4 = /*@ returnType=String* */ (/*@ type=int* */ x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
     };
   }
   {
-    Function2<int, List<String>> l0 = /*@returnType=Null*/ (int x) => null;
-    Function2<int, List<String>> l1 = /*@returnType=List<String>*/ (int
-        x) => /*@typeArgs=String*/ ["hello"];
+    Function2<int, List<String>> l0 = /*@ returnType=Null* */ (int x) => null;
+    Function2<int, List<String>> l1 = /*@ returnType=List<String*>* */ (int
+        x) => /*@ typeArgs=String* */ ["hello"];
     Function2<int, List<String>>
-        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
-            x) => /*@typeArgs=String*/ ["hello"];
+        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=List<String*>* */ (String
+            x) => /*@ typeArgs=String* */ ["hello"];
     Function2<int, List<String>>
-        l3 = /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+        l3 = /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
               /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
             ];
-    Function2<int, List<String>> l4 = /*@returnType=List<String>*/ (int x) {
-      return /*@typeArgs=String*/ [
+    Function2<int, List<String>> l4 = /*@ returnType=List<String*>* */ (int x) {
+      return /*@ typeArgs=String* */ [
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
       ];
     };
   }
   {
-    Function2<int, int> l0 = /*@returnType=int*/ (/*@type=int*/ x) => x;
-    Function2<int, int> l1 = /*@returnType=int*/ (/*@type=int*/ x) =>
+    Function2<int, int> l0 = /*@ returnType=int* */ (/*@ type=int* */ x) => x;
+    Function2<int, int> l1 = /*@ returnType=int* */ (/*@ type=int* */ x) =>
         x /*@target=num::+*/ + 1;
     Function2<int, String>
-        l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (/*@type=int*/ x) =>
+        l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (/*@ type=int* */ x) =>
             x;
     Function2<int, String>
-        l3 = /*@returnType=String*/ (/*@type=int*/ x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/ x
+        l3 = /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/ x
             .substring(3);
     Function2<String, String>
-        l4 = /*@returnType=String*/ (/*@type=String*/ x) =>
+        l4 = /*@ returnType=String* */ (/*@ type=String* */ x) =>
             x. /*@target=String::substring*/ substring(3);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect
index c3123ef..110861f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.expect
@@ -2,43 +2,43 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int) → core::String l0 = (core::int x) → dynamic => null;
-    (core::int) → core::String l1 = (core::int x) → dynamic => "hello";
-    (core::int) → core::String l2 = (core::String x) → dynamic => "hello";
-    (core::int) → core::String l3 = (core::int x) → dynamic => 3;
-    (core::int) → core::String l4 = (core::int x) → dynamic {
+    (core::int*) →* core::String* l0 = (core::int* x) → dynamic => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → dynamic => "hello";
+    (core::int*) →* core::String* l2 = (core::String* x) → dynamic => "hello";
+    (core::int*) →* core::String* l3 = (core::int* x) → dynamic => 3;
+    (core::int*) →* core::String* l4 = (core::int* x) → dynamic {
       return 3;
     };
   }
   {
-    (core::int) → core::String l0 = (dynamic x) → dynamic => null;
-    (core::int) → core::String l1 = (dynamic x) → dynamic => "hello";
-    (core::int) → core::String l2 = (dynamic x) → dynamic => 3;
-    (core::int) → core::String l3 = (dynamic x) → dynamic {
+    (core::int*) →* core::String* l0 = (dynamic x) → dynamic => null;
+    (core::int*) →* core::String* l1 = (dynamic x) → dynamic => "hello";
+    (core::int*) →* core::String* l2 = (dynamic x) → dynamic => 3;
+    (core::int*) →* core::String* l3 = (dynamic x) → dynamic {
       return 3;
     };
-    (core::int) → core::String l4 = (dynamic x) → dynamic {
+    (core::int*) →* core::String* l4 = (dynamic x) → dynamic {
       return x;
     };
   }
   {
-    (core::int) → core::List<core::String> l0 = (core::int x) → dynamic => null;
-    (core::int) → core::List<core::String> l1 = (core::int x) → dynamic => <dynamic>["hello"];
-    (core::int) → core::List<core::String> l2 = (core::String x) → dynamic => <dynamic>["hello"];
-    (core::int) → core::List<core::String> l3 = (core::int x) → dynamic => <dynamic>[3];
-    (core::int) → core::List<core::String> l4 = (core::int x) → dynamic {
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → dynamic => null;
+    (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → dynamic => <dynamic>["hello"];
+    (core::int*) →* core::List<core::String*>* l2 = (core::String* x) → dynamic => <dynamic>["hello"];
+    (core::int*) →* core::List<core::String*>* l3 = (core::int* x) → dynamic => <dynamic>[3];
+    (core::int*) →* core::List<core::String*>* l4 = (core::int* x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    (core::int) → core::int l0 = (dynamic x) → dynamic => x;
-    (core::int) → core::int l1 = (dynamic x) → dynamic => x.+(1);
-    (core::int) → core::String l2 = (dynamic x) → dynamic => x;
-    (core::int) → core::String l3 = (dynamic x) → dynamic => x.substring(3);
-    (core::String) → core::String l4 = (dynamic x) → dynamic => x.substring(3);
+    (core::int*) →* core::int* l0 = (dynamic x) → dynamic => x;
+    (core::int*) →* core::int* l1 = (dynamic x) → dynamic => x.+(1);
+    (core::int*) →* core::String* l2 = (dynamic x) → dynamic => x;
+    (core::int*) →* core::String* l3 = (dynamic x) → dynamic => x.substring(3);
+    (core::String*) →* core::String* l4 = (dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect
index c3123ef..110861f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.legacy.transformed.expect
@@ -2,43 +2,43 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int) → core::String l0 = (core::int x) → dynamic => null;
-    (core::int) → core::String l1 = (core::int x) → dynamic => "hello";
-    (core::int) → core::String l2 = (core::String x) → dynamic => "hello";
-    (core::int) → core::String l3 = (core::int x) → dynamic => 3;
-    (core::int) → core::String l4 = (core::int x) → dynamic {
+    (core::int*) →* core::String* l0 = (core::int* x) → dynamic => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → dynamic => "hello";
+    (core::int*) →* core::String* l2 = (core::String* x) → dynamic => "hello";
+    (core::int*) →* core::String* l3 = (core::int* x) → dynamic => 3;
+    (core::int*) →* core::String* l4 = (core::int* x) → dynamic {
       return 3;
     };
   }
   {
-    (core::int) → core::String l0 = (dynamic x) → dynamic => null;
-    (core::int) → core::String l1 = (dynamic x) → dynamic => "hello";
-    (core::int) → core::String l2 = (dynamic x) → dynamic => 3;
-    (core::int) → core::String l3 = (dynamic x) → dynamic {
+    (core::int*) →* core::String* l0 = (dynamic x) → dynamic => null;
+    (core::int*) →* core::String* l1 = (dynamic x) → dynamic => "hello";
+    (core::int*) →* core::String* l2 = (dynamic x) → dynamic => 3;
+    (core::int*) →* core::String* l3 = (dynamic x) → dynamic {
       return 3;
     };
-    (core::int) → core::String l4 = (dynamic x) → dynamic {
+    (core::int*) →* core::String* l4 = (dynamic x) → dynamic {
       return x;
     };
   }
   {
-    (core::int) → core::List<core::String> l0 = (core::int x) → dynamic => null;
-    (core::int) → core::List<core::String> l1 = (core::int x) → dynamic => <dynamic>["hello"];
-    (core::int) → core::List<core::String> l2 = (core::String x) → dynamic => <dynamic>["hello"];
-    (core::int) → core::List<core::String> l3 = (core::int x) → dynamic => <dynamic>[3];
-    (core::int) → core::List<core::String> l4 = (core::int x) → dynamic {
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → dynamic => null;
+    (core::int*) →* core::List<core::String*>* l1 = (core::int* x) → dynamic => <dynamic>["hello"];
+    (core::int*) →* core::List<core::String*>* l2 = (core::String* x) → dynamic => <dynamic>["hello"];
+    (core::int*) →* core::List<core::String*>* l3 = (core::int* x) → dynamic => <dynamic>[3];
+    (core::int*) →* core::List<core::String*>* l4 = (core::int* x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    (core::int) → core::int l0 = (dynamic x) → dynamic => x;
-    (core::int) → core::int l1 = (dynamic x) → dynamic => x.+(1);
-    (core::int) → core::String l2 = (dynamic x) → dynamic => x;
-    (core::int) → core::String l3 = (dynamic x) → dynamic => x.substring(3);
-    (core::String) → core::String l4 = (dynamic x) → dynamic => x.substring(3);
+    (core::int*) →* core::int* l0 = (dynamic x) → dynamic => x;
+    (core::int*) →* core::int* l1 = (dynamic x) → dynamic => x.+(1);
+    (core::int*) →* core::String* l2 = (dynamic x) → dynamic => x;
+    (core::int*) →* core::String* l3 = (dynamic x) → dynamic => x.substring(3);
+    (core::String*) →* core::String* l4 = (dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
index 1788de2..65b35d1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
-//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
-//                                                                  ^
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
-//                                                                             ^
+//         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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -32,11 +32,11 @@
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
-//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
-//                                                                        ^
+//         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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -61,77 +61,77 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int) → core::String l0 = (core::int x) → core::Null => null;
-    (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+    (core::int*) →* core::String* l0 = (core::int* x) → core::Null* => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = let final<BottomType> #t1 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to '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 => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        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* => let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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 {
+        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 let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
   }
   {
-    (core::int) → core::String l0 = (core::int x) → core::Null => null;
-    (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = 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'.
+    (core::int*) →* core::String* l0 = (core::int* x) → core::Null* => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
             3;
-            ^" in 3 as{TypeError} core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String {
+            ^" in 3 as{TypeError} core::String*;
+    (core::int*) →* core::String* l3 = (core::int* x) → core::String* {
       return let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
-    (core::int) → core::String l4 = (core::int x) → core::String {
+    (core::int*) →* core::String* l4 = (core::int* x) → core::String* {
       return let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
-                                              ^" in x as{TypeError} core::String;
+                                              ^" in x as{TypeError} core::String*;
     };
   }
   {
-    (core::int) → core::List<core::String> l0 = (core::int x) → core::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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::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 = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
-        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>[let final<BottomType> #t8 = 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'.
+        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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = 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'.
+                                                         ^" in 3 as{TypeError} core::String*];
+    (core::int*) →* core::List<core::String*>* l4 = (core::int* x) → core::List<core::String*>* {
+      return <core::String*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
-                                                   ^" in 3 as{TypeError} core::String];
+                                                   ^" 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::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = 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'.
+    (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::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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'.
+            ^" 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);
-             ^^^^^^^^^" as{TypeError} core::String;
-    (core::String) → core::String l4 = (core::String x) → core::String => x.{core::String::substring}(3);
+             ^^^^^^^^^" as{TypeError} core::String*;
+    (core::String*) →* core::String* l4 = (core::String* x) → core::String* => x.{core::String::substring}(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
index 1788de2..65b35d1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String Function(int)'.
-//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (String x) =>
-//                                                                  ^
+//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@ returnType=String* */ (String x) =>
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//         l3 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=String*/ (int x) => 3;
-//                                                                             ^
+//         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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -32,11 +32,11 @@
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
-//         l2 = /*error:INVALID_ASSIGNMENT*/ /*@returnType=List<String>*/ (String
-//                                                                        ^
+//         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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -61,77 +61,77 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Function2<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → T;
+typedef Function2<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* T*;
 static method test() → void {
   {
-    (core::int) → core::String l0 = (core::int x) → core::Null => null;
-    (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:15:66: Error: A value of type 'String Function(String)' can't be assigned to a variable of type 'String Function(int)'.
+    (core::int*) →* core::String* l0 = (core::int* x) → core::Null* => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = let final<BottomType> #t1 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to '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 => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:18:77: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+        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* => let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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 {
+        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 let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
   }
   {
-    (core::int) → core::String l0 = (core::int x) → core::Null => null;
-    (core::int) → core::String l1 = (core::int x) → core::String => "hello";
-    (core::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t4 = 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'.
+    (core::int*) →* core::String* l0 = (core::int* x) → core::Null* => null;
+    (core::int*) →* core::String* l1 = (core::int* x) → core::String* => "hello";
+    (core::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
             3;
-            ^" in 3 as{TypeError} core::String;
-    (core::int) → core::String l3 = (core::int x) → core::String {
+            ^" in 3 as{TypeError} core::String*;
+    (core::int*) →* core::String* l3 = (core::int* x) → core::String* {
       return let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
-    (core::int) → core::String l4 = (core::int x) → core::String {
+    (core::int*) →* core::String* l4 = (core::int* x) → core::String* {
       return let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
-                                              ^" in x as{TypeError} core::String;
+                                              ^" in x as{TypeError} core::String*;
     };
   }
   {
-    (core::int) → core::List<core::String> l0 = (core::int x) → core::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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_function_expressions.dart:42:72: Error: A value of type 'List<String> Function(String)' can't be assigned to a variable of type 'List<String> Function(int)'.
+    (core::int*) →* core::List<core::String*>* l0 = (core::int* x) → core::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 = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function(int)'.
-        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>[let final<BottomType> #t8 = 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'.
+        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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = 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'.
+                                                         ^" in 3 as{TypeError} core::String*];
+    (core::int*) →* core::List<core::String*>* l4 = (core::int* x) → core::List<core::String*>* {
+      return <core::String*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
-                                                   ^" in 3 as{TypeError} core::String];
+                                                   ^" 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::int) → core::String l2 = (core::int x) → core::String => let final<BottomType> #t10 = 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'.
+    (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::int*) →* core::String* l2 = (core::int* x) → core::String* => let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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'.
+            ^" 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);
-             ^^^^^^^^^" as{TypeError} core::String;
-    (core::String) → core::String l4 = (core::String x) → core::String => x.{core::String::substring}(3);
+             ^^^^^^^^^" as{TypeError} core::String*;
+    (core::String*) →* core::String* l4 = (core::String* x) → core::String* => x.{core::String::substring}(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect
index 169595b..f9c9ca6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.expect
@@ -4,20 +4,20 @@
 
 static method main() → void {
   {
-    function f<T extends core::Object = dynamic>(T x) → T
+    function f<T extends core::Object* = dynamic>(T* x) → T*
       return null;
     dynamic v1 = f;
-    v1 = <S extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    v1 = <S extends core::Object* = dynamic>(dynamic x) → dynamic => x;
   }
   {
-    function f<T extends core::Object = dynamic>(T x) → core::List<T>
+    function f<T extends core::Object* = dynamic>(T* x) → core::List<T*>*
       return null;
     dynamic v2 = f;
-    v2 = <S extends core::Object = dynamic>(dynamic x) → dynamic => <dynamic>[x];
-    core::Iterable<core::int> r = v2.call(42);
-    core::Iterable<core::String> s = v2.call("hello");
-    core::Iterable<core::List<core::int>> t = v2.call(<core::int>[]);
-    core::Iterable<core::num> u = v2.call(42);
-    core::Iterable<core::num> v = v2.call<core::num>(42);
+    v2 = <S extends core::Object* = dynamic>(dynamic x) → dynamic => <dynamic>[x];
+    core::Iterable<core::int*>* r = v2.call(42);
+    core::Iterable<core::String*>* s = v2.call("hello");
+    core::Iterable<core::List<core::int*>*>* t = v2.call(<core::int*>[]);
+    core::Iterable<core::num*>* u = v2.call(42);
+    core::Iterable<core::num*>* v = v2.call<core::num*>(42);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect
index 169595b..f9c9ca6 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_function_of_t_using_the_t.dart.legacy.transformed.expect
@@ -4,20 +4,20 @@
 
 static method main() → void {
   {
-    function f<T extends core::Object = dynamic>(T x) → T
+    function f<T extends core::Object* = dynamic>(T* x) → T*
       return null;
     dynamic v1 = f;
-    v1 = <S extends core::Object = dynamic>(dynamic x) → dynamic => x;
+    v1 = <S extends core::Object* = dynamic>(dynamic x) → dynamic => x;
   }
   {
-    function f<T extends core::Object = dynamic>(T x) → core::List<T>
+    function f<T extends core::Object* = dynamic>(T* x) → core::List<T*>*
       return null;
     dynamic v2 = f;
-    v2 = <S extends core::Object = dynamic>(dynamic x) → dynamic => <dynamic>[x];
-    core::Iterable<core::int> r = v2.call(42);
-    core::Iterable<core::String> s = v2.call("hello");
-    core::Iterable<core::List<core::int>> t = v2.call(<core::int>[]);
-    core::Iterable<core::num> u = v2.call(42);
-    core::Iterable<core::num> v = v2.call<core::num>(42);
+    v2 = <S extends core::Object* = dynamic>(dynamic x) → dynamic => <dynamic>[x];
+    core::Iterable<core::int*>* r = v2.call(42);
+    core::Iterable<core::String*>* s = v2.call("hello");
+    core::Iterable<core::List<core::int*>*>* t = v2.call(<core::int*>[]);
+    core::Iterable<core::num*>* u = v2.call(42);
+    core::Iterable<core::num*>* v = v2.call<core::num*>(42);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart
index a36364b..de3af3e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart
@@ -14,6 +14,6 @@
 }
 
 void main() {
-  new /*@typeArgs=dynamic*/ F3(/*@typeArgs=Iterable<dynamic>*/ []);
-  new /*@typeArgs=dynamic*/ F4(a: /*@typeArgs=Iterable<dynamic>*/ []);
+  new /*@ typeArgs=dynamic */ F3(/*@ typeArgs=Iterable<dynamic>* */ []);
+  new /*@ typeArgs=dynamic */ F4(a: /*@ typeArgs=Iterable<dynamic>* */ []);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect
index b53e773..4630b2f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.expect
@@ -2,15 +2,19 @@
 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>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method main() → void {
   new self::F3::•<dynamic>(<dynamic>[]);
   new self::F4::•<dynamic>(a: <dynamic>[]);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect
index b53e773..4630b2f 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.legacy.transformed.expect
@@ -2,15 +2,19 @@
 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>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method main() → void {
   new self::F3::•<dynamic>(<dynamic>[]);
   new self::F4::•<dynamic>(a: <dynamic>[]);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
index 925d667..f2b4b0c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.expect
@@ -2,15 +2,19 @@
 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>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method main() → void {
-  new self::F3::•<dynamic>(<core::Iterable<dynamic>>[]);
-  new self::F4::•<dynamic>(a: <core::Iterable<dynamic>>[]);
+  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_empty_list.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
index 925d667..f2b4b0c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_empty_list.dart.strong.transformed.expect
@@ -2,15 +2,19 @@
 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>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method main() → void {
-  new self::F3::•<dynamic>(<core::Iterable<dynamic>>[]);
-  new self::F4::•<dynamic>(a: <core::Iterable<dynamic>>[]);
+  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 b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart
index f867a94..c5e21a0 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart
@@ -26,82 +26,82 @@
 }
 
 void test() {
-  new F0<int>(/*@typeArgs=int*/ []);
-  new F0<int>(/*@typeArgs=int*/ [3]);
+  new F0<int>(/*@ typeArgs=int* */ []);
+  new F0<int>(/*@ typeArgs=int* */ [3]);
   new F0<int>(
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  new F0<int>(/*@typeArgs=int*/ [
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  new F0<int>(/*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F1<int>(a: /*@typeArgs=int*/ []);
-  new F1<int>(a: /*@typeArgs=int*/ [3]);
-  new F1<int>(a: /*@typeArgs=int*/ [
+  new F1<int>(a: /*@ typeArgs=int* */ []);
+  new F1<int>(a: /*@ typeArgs=int* */ [3]);
+  new F1<int>(a: /*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
   ]);
-  new F1<int>(a: /*@typeArgs=int*/ [
+  new F1<int>(a: /*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F2<int>(/*@typeArgs=int*/ []);
-  new F2<int>(/*@typeArgs=int*/ [3]);
+  new F2<int>(/*@ typeArgs=int* */ []);
+  new F2<int>(/*@ typeArgs=int* */ [3]);
   new F2<int>(
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-  new F2<int>(/*@typeArgs=int*/ [
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
+  new F2<int>(/*@ typeArgs=int* */ [
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
     3
   ]);
 
-  new F3<int>(/*@typeArgs=Iterable<int>*/ []);
-  new F3<int>(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new F3<int>(/*@ typeArgs=Iterable<int*>* */ []);
+  new F3<int>(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  new F3<int>(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  new F3<int>(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  new F3<int>(/*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  new F3<int>(/*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 
-  new F4<int>(a: /*@typeArgs=Iterable<int>*/ []);
-  new F4<int>(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new F4<int>(a: /*@ typeArgs=Iterable<int*>* */ []);
+  new F4<int>(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  new F4<int>(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+  new F4<int>(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
   ]);
-  new F4<int>(a: /*@typeArgs=Iterable<int>*/ [
-    /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-    /*@typeArgs=int*/ [3]
+  new F4<int>(a: /*@ typeArgs=Iterable<int*>* */ [
+    /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 
-  new /*@typeArgs=dynamic*/ F3(/*@typeArgs=Iterable<dynamic>*/ []);
-  var /*@type=F3<int>*/ f31 = new /*@typeArgs=int*/ F3(/*@typeArgs=List<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new /*@ typeArgs=dynamic */ F3(/*@ typeArgs=Iterable<dynamic>* */ []);
+  var /*@ type=F3<int*>* */ f31 = new /*@ typeArgs=int* */ F3(/*@ typeArgs=List<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  var /*@type=F3<String>*/ f32 =
-      new /*@typeArgs=String*/ F3(/*@typeArgs=List<String>*/ [
-    /*@typeArgs=String*/ ["hello"]
+  var /*@ type=F3<String*>* */ f32 =
+      new /*@ typeArgs=String* */ F3(/*@ typeArgs=List<String*>* */ [
+    /*@ typeArgs=String* */ ["hello"]
   ]);
-  var /*@type=F3<Object>*/ f33 =
-      new /*@typeArgs=Object*/ F3(/*@typeArgs=List<Object>*/ [
-    /*@typeArgs=String*/ ["hello"],
-    /*@typeArgs=int*/ [3]
+  var /*@ type=F3<Object*>* */ f33 =
+      new /*@ typeArgs=Object* */ F3(/*@ typeArgs=List<Object*>* */ [
+    /*@ typeArgs=String* */ ["hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 
-  new /*@typeArgs=dynamic*/ F4(a: /*@typeArgs=Iterable<dynamic>*/ []);
-  new /*@typeArgs=int*/ F4(a: /*@typeArgs=List<int>*/ [
-    /*@typeArgs=int*/ [3]
+  new /*@ typeArgs=dynamic */ F4(a: /*@ typeArgs=Iterable<dynamic>* */ []);
+  new /*@ typeArgs=int* */ F4(a: /*@ typeArgs=List<int*>* */ [
+    /*@ typeArgs=int* */ [3]
   ]);
-  new /*@typeArgs=String*/ F4(a: /*@typeArgs=List<String>*/ [
-    /*@typeArgs=String*/ ["hello"]
+  new /*@ typeArgs=String* */ F4(a: /*@ typeArgs=List<String*>* */ [
+    /*@ typeArgs=String* */ ["hello"]
   ]);
-  new /*@typeArgs=Object*/ F4(a: /*@typeArgs=List<Object>*/ [
-    /*@typeArgs=String*/ ["hello"],
-    /*@typeArgs=int*/ [3]
+  new /*@ typeArgs=Object* */ F4(a: /*@ typeArgs=List<Object*>* */ [
+    /*@ typeArgs=String* */ ["hello"],
+    /*@ typeArgs=int* */ [3]
   ]);
 }
 
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect
index 9af9d65..d1d33f1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.expect
@@ -2,47 +2,47 @@
 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>
+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::•() {}
 }
-class F1<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::List<self::F1::T> a = null}) → self::F1<self::F1::T>
+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::•() {}
 }
-class F2<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<self::F2::T> a) → self::F2<self::F2::T>
+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::•() {}
 }
-class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → self::F3<self::F3::T>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method test() → void {
-  new self::F0::•<core::int>(<dynamic>[]);
-  new self::F0::•<core::int>(<dynamic>[3]);
-  new self::F0::•<core::int>(<dynamic>["hello"]);
-  new self::F0::•<core::int>(<dynamic>["hello", 3]);
-  new self::F1::•<core::int>(a: <dynamic>[]);
-  new self::F1::•<core::int>(a: <dynamic>[3]);
-  new self::F1::•<core::int>(a: <dynamic>["hello"]);
-  new self::F1::•<core::int>(a: <dynamic>["hello", 3]);
-  new self::F2::•<core::int>(<dynamic>[]);
-  new self::F2::•<core::int>(<dynamic>[3]);
-  new self::F2::•<core::int>(<dynamic>["hello"]);
-  new self::F2::•<core::int>(<dynamic>["hello", 3]);
-  new self::F3::•<core::int>(<dynamic>[]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>[3]]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>["hello"]]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
-  new self::F4::•<core::int>(a: <dynamic>[]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>[3]]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>["hello"]]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
+  new self::F0::•<core::int*>(<dynamic>[]);
+  new self::F0::•<core::int*>(<dynamic>[3]);
+  new self::F0::•<core::int*>(<dynamic>["hello"]);
+  new self::F0::•<core::int*>(<dynamic>["hello", 3]);
+  new self::F1::•<core::int*>(a: <dynamic>[]);
+  new self::F1::•<core::int*>(a: <dynamic>[3]);
+  new self::F1::•<core::int*>(a: <dynamic>["hello"]);
+  new self::F1::•<core::int*>(a: <dynamic>["hello", 3]);
+  new self::F2::•<core::int*>(<dynamic>[]);
+  new self::F2::•<core::int*>(<dynamic>[3]);
+  new self::F2::•<core::int*>(<dynamic>["hello"]);
+  new self::F2::•<core::int*>(<dynamic>["hello", 3]);
+  new self::F3::•<core::int*>(<dynamic>[]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>[3]]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>["hello"]]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
+  new self::F4::•<core::int*>(a: <dynamic>[]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>[3]]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>["hello"]]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
   new self::F3::•<dynamic>(<dynamic>[]);
   dynamic f31 = new self::F3::•<dynamic>(<dynamic>[<dynamic>[3]]);
   dynamic f32 = new self::F3::•<dynamic>(<dynamic>[<dynamic>["hello"]]);
@@ -53,3 +53,7 @@
   new self::F4::•<dynamic>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
index 9af9d65..d1d33f1 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.legacy.transformed.expect
@@ -2,47 +2,47 @@
 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>
+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::•() {}
 }
-class F1<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::List<self::F1::T> a = null}) → self::F1<self::F1::T>
+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::•() {}
 }
-class F2<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<self::F2::T> a) → self::F2<self::F2::T>
+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::•() {}
 }
-class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → self::F3<self::F3::T>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 static method test() → void {
-  new self::F0::•<core::int>(<dynamic>[]);
-  new self::F0::•<core::int>(<dynamic>[3]);
-  new self::F0::•<core::int>(<dynamic>["hello"]);
-  new self::F0::•<core::int>(<dynamic>["hello", 3]);
-  new self::F1::•<core::int>(a: <dynamic>[]);
-  new self::F1::•<core::int>(a: <dynamic>[3]);
-  new self::F1::•<core::int>(a: <dynamic>["hello"]);
-  new self::F1::•<core::int>(a: <dynamic>["hello", 3]);
-  new self::F2::•<core::int>(<dynamic>[]);
-  new self::F2::•<core::int>(<dynamic>[3]);
-  new self::F2::•<core::int>(<dynamic>["hello"]);
-  new self::F2::•<core::int>(<dynamic>["hello", 3]);
-  new self::F3::•<core::int>(<dynamic>[]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>[3]]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>["hello"]]);
-  new self::F3::•<core::int>(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
-  new self::F4::•<core::int>(a: <dynamic>[]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>[3]]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>["hello"]]);
-  new self::F4::•<core::int>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
+  new self::F0::•<core::int*>(<dynamic>[]);
+  new self::F0::•<core::int*>(<dynamic>[3]);
+  new self::F0::•<core::int*>(<dynamic>["hello"]);
+  new self::F0::•<core::int*>(<dynamic>["hello", 3]);
+  new self::F1::•<core::int*>(a: <dynamic>[]);
+  new self::F1::•<core::int*>(a: <dynamic>[3]);
+  new self::F1::•<core::int*>(a: <dynamic>["hello"]);
+  new self::F1::•<core::int*>(a: <dynamic>["hello", 3]);
+  new self::F2::•<core::int*>(<dynamic>[]);
+  new self::F2::•<core::int*>(<dynamic>[3]);
+  new self::F2::•<core::int*>(<dynamic>["hello"]);
+  new self::F2::•<core::int*>(<dynamic>["hello", 3]);
+  new self::F3::•<core::int*>(<dynamic>[]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>[3]]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>["hello"]]);
+  new self::F3::•<core::int*>(<dynamic>[<dynamic>["hello"], <dynamic>[3]]);
+  new self::F4::•<core::int*>(a: <dynamic>[]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>[3]]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>["hello"]]);
+  new self::F4::•<core::int*>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
   new self::F3::•<dynamic>(<dynamic>[]);
   dynamic f31 = new self::F3::•<dynamic>(<dynamic>[<dynamic>[3]]);
   dynamic f32 = new self::F3::•<dynamic>(<dynamic>[<dynamic>["hello"]]);
@@ -53,3 +53,7 @@
   new self::F4::•<dynamic>(a: <dynamic>[<dynamic>["hello"], <dynamic>[3]]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
index 7a7d29f..df3f4ac 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
@@ -22,117 +22,121 @@
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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>
+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::•() {}
 }
-class F1<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::List<self::F1::T> a = null}) → self::F1<self::F1::T>
+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::•() {}
 }
-class F2<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<self::F2::T> a) → self::F2<self::F2::T>
+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::•() {}
 }
-class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → self::F3<self::F3::T>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  new self::F0::•<core::int*>(<core::int*>[]);
+  new self::F0::•<core::int*>(<core::int*>[3]);
+  new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = 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'.
+                                               ^" 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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                               ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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]]);
+    /*@ 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_constructor_arguments_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
index 7a7d29f..df3f4ac 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
@@ -22,117 +22,121 @@
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//       /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]);
-//                                                                     ^
+//       /*@ 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
 //     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
 //                                                ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
-//                                                                   ^
+//     /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"]
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"],
-//                                                                   ^
+//     /*@ 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>
+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::•() {}
 }
-class F1<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::List<self::F1::T> a = null}) → self::F1<self::F1::T>
+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::•() {}
 }
-class F2<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<self::F2::T> a) → self::F2<self::F2::T>
+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::•() {}
 }
-class F3<T extends core::Object = dynamic> extends core::Object {
-  constructor •(core::Iterable<core::Iterable<self::F3::T>> a) → self::F3<self::F3::T>
+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::•() {}
 }
-class F4<T extends core::Object = dynamic> extends core::Object {
-  constructor •({core::Iterable<core::Iterable<self::F4::T>> a = null}) → self::F4<self::F4::T>
+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::•() {}
 }
 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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:32:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  new self::F0::•<core::int*>(<core::int*>[]);
+  new self::F0::•<core::int*>(<core::int*>[3]);
+  new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F0::•<core::int>(<core::int>[let final<BottomType> #t2 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F0::•<core::int*>(<core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t3 = 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'.
+                                               ^" 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*>[let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                               ^" in "hello" as{TypeError} core::int]);
-  new self::F1::•<core::int>(a: <core::int>[let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*]);
+  new self::F1::•<core::int*>(a: <core::int*>[let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:51:69: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-      /*@typeArgs=int*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
-                                                                    ^" in "hello" as{TypeError} core::int]);
-  new self::F2::•<core::int>(<core::int>[let final<BottomType> #t6 = 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'.
+      /*@ typeArgs=int* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"]);
+                                                                       ^" in "hello" as{TypeError} core::int*]);
+  new self::F2::•<core::int*>(<core::int*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:62:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+                                               ^" 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*>[let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:65:67: 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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:74:67: 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*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_constructor_arguments_infer_downwards.dart:77:67: 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*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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]]);
+    /*@ 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 b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
index 7ca127b..35f9b53 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart
@@ -8,45 +8,45 @@
 void test() {
   {
     String f<S>(int x) => null;
-    var /*@type=<S extends Object = dynamic>(int) -> String*/ v = f;
-    v = <T> /*@returnType=Null*/ (int x) => null;
-    v = <T> /*@returnType=String*/ (int x) => "hello";
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
+    var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
+    v = <T> /*@ returnType=Null* */ (int x) => null;
+    v = <T> /*@ returnType=String* */ (int x) => "hello";
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
         "hello";
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
-    v = <T> /*@returnType=String*/ (int x) {
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
+    v = <T> /*@ returnType=String* */ (int x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
     };
   }
   {
     String f<S>(int x) => null;
-    var /*@type=<S extends Object = dynamic>(int) -> String*/ v = f;
-    v = <T> /*@returnType=Null*/ (/*@type=int*/ x) => null;
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) => "hello";
+    var /*@ type=<S extends Object* = dynamic>(int*) ->* String* */ v = f;
+    v = <T> /*@ returnType=Null* */ (/*@ type=int* */ x) => null;
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
     v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
-            T> /*@returnType=String*/ (/*@type=int*/ x) =>
+            T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
         3;
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
     };
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
     };
   }
   {
     List<String> f<S>(int x) => null;
-    var /*@type=<S extends Object = dynamic>(int) -> List<String>*/ v = f;
-    v = <T> /*@returnType=Null*/ (int x) => null;
-    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+    var /*@ type=<S extends Object* = dynamic>(int*) ->* List<String*>* */ v = f;
+    v = <T> /*@ returnType=Null* */ (int x) => null;
+    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
           "hello"
         ];
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
-        x) => /*@typeArgs=String*/ ["hello"];
-    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
+        x) => /*@ typeArgs=String* */ ["hello"];
+    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
         ];
-    v = <T> /*@returnType=List<String>*/ (int x) {
-      return /*@typeArgs=String*/ [
+    v = <T> /*@ returnType=List<String*>* */ (int x) {
+      return /*@ typeArgs=String* */ [
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
       ];
     };
@@ -55,18 +55,18 @@
     int int2int<S>(int x) => null;
     String int2String<T>(int x) => null;
     String string2String<T>(String x) => null;
-    var /*@type=<S extends Object = dynamic>(int) -> int*/ x = int2int;
-    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x;
-    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x /*@target=num::+*/ + 1;
-    var /*@type=<T extends Object = dynamic>(int) -> String*/ y = int2String;
+    var /*@ type=<S extends Object* = dynamic>(int*) ->* int* */ x = int2int;
+    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x;
+    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x /*@target=num::+*/ + 1;
+    var /*@ type=<T extends Object* = dynamic>(int*) ->* String* */ y = int2String;
     y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
-            T> /*@returnType=String*/ (/*@type=int*/ x) =>
+            T> /*@ returnType=String* */ (/*@ type=int* */ x) =>
         x;
-    y = <T> /*@returnType=String*/ (/*@type=int*/ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
+    y = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
         .substring(3);
-    var /*@type=<T extends Object = dynamic>(String) -> String*/ z =
+    var /*@ type=<T extends Object* = dynamic>(String*) ->* String* */ z =
         string2String;
-    z = <T> /*@returnType=String*/ (/*@type=String*/ x) =>
+    z = <T> /*@ returnType=String* */ (/*@ type=String* */ x) =>
         x. /*@target=String::substring*/ substring(3);
   }
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect
index f1cf2f0..6707f83 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.expect
@@ -4,58 +4,58 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::String
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(core::String x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => 3;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(core::String* x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => 3;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic {
       return 3;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::String
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => 3;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => 3;
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic {
       return 3;
     };
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic {
       return x;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object = dynamic>(core::String x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>[3];
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object* = dynamic>(core::String* x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => <dynamic>[3];
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
+    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
+    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
+    function string2String<T extends core::Object* = dynamic>(core::String* x) → core::String*
       return null;
     dynamic x = int2int;
-    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
-    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.+(1);
+    x = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x;
+    x = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.+(1);
     dynamic y = int2String;
-    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
-    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
+    y = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x;
+    y = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.substring(3);
     dynamic z = string2String;
-    z = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
+    z = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect
index f1cf2f0..6707f83 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.legacy.transformed.expect
@@ -4,58 +4,58 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::String
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(core::String x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => 3;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(core::String* x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => 3;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic {
       return 3;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::String
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::String*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => "hello";
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic => 3;
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => "hello";
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic => 3;
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic {
       return 3;
     };
-    v = <T extends core::Object = dynamic>(dynamic x) → dynamic {
+    v = <T extends core::Object* = dynamic>(dynamic x) → dynamic {
       return x;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::List<core::String>
+    function f<S extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>*
       return null;
     dynamic v = f;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => null;
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object = dynamic>(core::String x) → dynamic => <dynamic>["hello"];
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic => <dynamic>[3];
-    v = <T extends core::Object = dynamic>(core::int x) → dynamic {
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object* = dynamic>(core::String* x) → dynamic => <dynamic>["hello"];
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic => <dynamic>[3];
+    v = <T extends core::Object* = dynamic>(core::int* x) → dynamic {
       return <dynamic>[3];
     };
   }
   {
-    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
+    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
+    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
+    function string2String<T extends core::Object* = dynamic>(core::String* x) → core::String*
       return null;
     dynamic x = int2int;
-    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
-    x = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.+(1);
+    x = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x;
+    x = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.+(1);
     dynamic y = int2String;
-    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x;
-    y = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
+    y = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x;
+    y = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.substring(3);
     dynamic z = string2String;
-    z = <T extends core::Object = dynamic>(dynamic x) → dynamic => x.substring(3);
+    z = <T extends core::Object* = dynamic>(dynamic x) → dynamic => x.substring(3);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
index c0a2ae8..e415ae5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
-//                                                                 ^
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
+//                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
-//                                                                            ^
+//     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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -32,11 +32,11 @@
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
-//                                                                       ^
+//     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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -63,92 +63,92 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object = dynamic>(core::int x) → 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) → core::Null => null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null* => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
+    v = let final<BottomType> #t1 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to '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 => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    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* => let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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 {
+    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 let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → 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) → core::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 => let final<BottomType> #t4 = 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'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::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* => let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         3;
-        ^" in 3 as{TypeError} core::String;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String {
+        ^" in 3 as{TypeError} core::String*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
       return let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
-    v = <T extends core::Object = dynamic>(core::int x) → core::String {
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
       return let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
-                                              ^" in x as{TypeError} core::String;
+                                              ^" in x as{TypeError} core::String*;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::List<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) → core::Null => null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null* => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
+    v = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
-    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>[let final<BottomType> #t8 = 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'.
+    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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = 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'.
+                                                     ^" in 3 as{TypeError} core::String*];
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* {
+      return <core::String*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
-                                                   ^" in 3 as{TypeError} core::String];
+                                                   ^" in 3 as{TypeError} core::String*];
     };
   }
   {
-    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
+    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
+    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
+    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);
-    <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = 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'.
+    <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);
+    <T extends core::Object* = dynamic>(core::int*) →* core::String* y = int2String;
+    y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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'.
+        ^" 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);
-         ^^^^^^^^^" as{TypeError} 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);
+         ^^^^^^^^^" as{TypeError} 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);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
index c0a2ae8..e415ae5 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String Function<S>(int)'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
-//                                                                 ^
+//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
+//                                                                    ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
-//                                                                            ^
+//     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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -32,11 +32,11 @@
 //       return /*error:RETURN_OF_INVALID_TYPE*/ x;
 //                                               ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
-//     v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
-//                                                                       ^
+//     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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
@@ -63,92 +63,92 @@
 
 static method test() → void {
   {
-    function f<S extends core::Object = dynamic>(core::int x) → 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) → core::Null => null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String => "hello";
-    v = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:65: Error: A value of type 'String Function<T>(String)' can't be assigned to a variable of type 'String Function<S>(int)'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null* => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* => "hello";
+    v = let final<BottomType> #t1 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to '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 => let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+    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* => let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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 {
+    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 let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → 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) → core::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 => let final<BottomType> #t4 = 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'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::String* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::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* => let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         3;
-        ^" in 3 as{TypeError} core::String;
-    v = <T extends core::Object = dynamic>(core::int x) → core::String {
+        ^" in 3 as{TypeError} core::String*;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
       return let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ 3;
-                                              ^" in 3 as{TypeError} core::String;
+                                              ^" in 3 as{TypeError} core::String*;
     };
-    v = <T extends core::Object = dynamic>(core::int x) → core::String {
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::String* {
       return let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       return /*error:RETURN_OF_INVALID_TYPE*/ x;
-                                              ^" in x as{TypeError} core::String;
+                                              ^" in x as{TypeError} core::String*;
     };
   }
   {
-    function f<S extends core::Object = dynamic>(core::int x) → core::List<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) → core::Null => null;
-    v = <T extends core::Object = dynamic>(core::int x) → core::List<core::String> => <core::String>["hello"];
-    v = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:71: Error: A value of type 'List<String> Function<T>(String)' can't be assigned to a variable of type 'List<String> Function<S>(int)'.
+    <S extends core::Object* = dynamic>(core::int*) →* core::List<core::String*>* v = f;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::Null* => null;
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* => <core::String*>["hello"];
+    v = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<String> Function<S>(int)'.
-    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>[let final<BottomType> #t8 = 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'.
+    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*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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>[let final<BottomType> #t9 = 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'.
+                                                     ^" in 3 as{TypeError} core::String*];
+    v = <T extends core::Object* = dynamic>(core::int* x) → core::List<core::String*>* {
+      return <core::String*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
         /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
-                                                   ^" in 3 as{TypeError} core::String];
+                                                   ^" in 3 as{TypeError} core::String*];
     };
   }
   {
-    function int2int<S extends core::Object = dynamic>(core::int x) → core::int
+    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
+    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
+    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);
-    <T extends core::Object = dynamic>(core::int) → core::String y = int2String;
-    y = <T extends core::Object = dynamic>(core::int x) → core::String => let final<BottomType> #t10 = 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'.
+    <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);
+    <T extends core::Object* = dynamic>(core::int*) →* core::String* y = int2String;
+    y = <T extends core::Object* = dynamic>(core::int* x) → core::String* => let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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'.
+        ^" 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);
-         ^^^^^^^^^" as{TypeError} 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);
+         ^^^^^^^^^" as{TypeError} 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);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
index 419aa7c..5f2ce87 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart.type_promotion.expect
@@ -1,60 +1,60 @@
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:12:7: Context: Write to v@374
-    v = <T> /*@returnType=Null*/ (int x) => null;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:12:7: Context: Write to v@380
+    v = <T> /*@ returnType=Null* */ (int x) => null;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:13:7: Context: Write to v@374
-    v = <T> /*@returnType=String*/ (int x) => "hello";
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:13:7: Context: Write to v@380
+    v = <T> /*@ returnType=String* */ (int x) => "hello";
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:7: Context: Write to v@374
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (String x) =>
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:14:7: Context: Write to v@380
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (String x) =>
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:7: Context: Write to v@374
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=String*/ (int x) => 3;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:16:7: Context: Write to v@380
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=String* */ (int x) => 3;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:17:7: Context: Write to v@374
-    v = <T> /*@returnType=String*/ (int x) {
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:17:7: Context: Write to v@380
+    v = <T> /*@ returnType=String* */ (int x) {
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:24:7: Context: Write to v@862
-    v = <T> /*@returnType=Null*/ (/*@type=int*/ x) => null;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:24:7: Context: Write to v@889
+    v = <T> /*@ returnType=Null* */ (/*@ type=int* */ x) => null;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:25:7: Context: Write to v@862
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) => "hello";
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:25:7: Context: Write to v@889
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => "hello";
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:26:7: Context: Write to v@862
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:26:7: Context: Write to v@889
     v = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:29:7: Context: Write to v@862
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:29:7: Context: Write to v@889
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:32:7: Context: Write to v@862
-    v = <T> /*@returnType=String*/ (/*@type=int*/ x) {
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:32:7: Context: Write to v@889
+    v = <T> /*@ returnType=String* */ (/*@ type=int* */ x) {
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:39:7: Context: Write to v@1467
-    v = <T> /*@returnType=Null*/ (int x) => null;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:39:7: Context: Write to v@1531
+    v = <T> /*@ returnType=Null* */ (int x) => null;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:40:7: Context: Write to v@1467
-    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:40:7: Context: Write to v@1531
+    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:7: Context: Write to v@1467
-    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@returnType=List<String>*/ (String
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:43:7: Context: Write to v@1531
+    v = /*error:INVALID_ASSIGNMENT*/ <T> /*@ returnType=List<String*>* */ (String
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:45:7: Context: Write to v@1467
-    v = <T> /*@returnType=List<String>*/ (int x) => /*@typeArgs=String*/ [
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:45:7: Context: Write to v@1531
+    v = <T> /*@ returnType=List<String*>* */ (int x) => /*@ typeArgs=String* */ [
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:48:7: Context: Write to v@1467
-    v = <T> /*@returnType=List<String>*/ (int x) {
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:48:7: Context: Write to v@1531
+    v = <T> /*@ returnType=List<String*>* */ (int x) {
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:59:7: Context: Write to x@2239
-    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:59:7: Context: Write to x@2340
+    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:60:7: Context: Write to x@2239
-    x = <T> /*@returnType=int*/ (/*@type=int*/ x) => x /*@target=num::+*/ + 1;
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:60:7: Context: Write to x@2340
+    x = <T> /*@ returnType=int* */ (/*@ type=int* */ x) => x /*@target=num::+*/ + 1;
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:62:7: Context: Write to y@2449
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:62:7: Context: Write to y@2568
     y = /*info:INFERRED_TYPE_CLOSURE, error:INVALID_ASSIGNMENT*/ <
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:65:7: Context: Write to y@2449
-    y = <T> /*@returnType=String*/ (/*@type=int*/ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:65:7: Context: Write to y@2568
+    y = <T> /*@ returnType=String* */ (/*@ type=int* */ x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/ x
       ^
-pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:69:7: Context: Write to z@2791
-    z = <T> /*@returnType=String*/ (/*@type=String*/ x) =>
+pkg/front_end/testcases/inference/downwards_inference_on_generic_function_expressions.dart:69:7: Context: Write to z@2928
+    z = <T> /*@ returnType=String* */ (/*@ type=String* */ x) =>
       ^
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart
index d351f9d..62b981d 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart
@@ -38,8 +38,8 @@
 
 void test() {
   {
-    A<int, String> a0 = new /*@typeArgs=int, String*/ A(3, "hello");
-    A<int, String> a1 = new /*@typeArgs=int, String*/ A.named(3, "hello");
+    A<int, String> a0 = new /*@ typeArgs=int*, String* */ A(3, "hello");
+    A<int, String> a1 = new /*@ typeArgs=int*, String* */ A.named(3, "hello");
     A<int, String> a2 = new A<int, String>(3, "hello");
     A<int, String> a3 = new A<int, String>.named(3, "hello");
     A<int, String>
@@ -49,16 +49,16 @@
             3, "hello");
   }
   {
-    A<int, String> a0 = new /*@typeArgs=int, String*/ A(
+    A<int, String> a0 = new /*@ typeArgs=int*, String* */ A(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-    A<int, String> a1 = new /*@typeArgs=int, String*/ A.named(
+    A<int, String> a1 = new /*@ typeArgs=int*, String* */ A.named(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
   }
   {
-    A<int, String> a0 = new /*@typeArgs=String, int*/ B("hello", 3);
-    A<int, String> a1 = new /*@typeArgs=String, int*/ B.named("hello", 3);
+    A<int, String> a0 = new /*@ typeArgs=String*, int* */ B("hello", 3);
+    A<int, String> a1 = new /*@ typeArgs=String*, int* */ B.named("hello", 3);
     A<int, String> a2 = new B<String, int>("hello", 3);
     A<int, String> a3 = new B<String, int>.named("hello", 3);
     A<int, String>
@@ -68,30 +68,30 @@
             "hello", 3);
   }
   {
-    A<int, String> a0 = new /*@typeArgs=String, int*/ B(
+    A<int, String> a0 = new /*@ typeArgs=String*, int* */ B(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
-    A<int, String> a1 = new /*@typeArgs=String, int*/ B.named(
+    A<int, String> a1 = new /*@ typeArgs=String*, int* */ B.named(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
   }
   {
-    A<int, int> a0 = new /*@typeArgs=int*/ C(3);
-    A<int, int> a1 = new /*@typeArgs=int*/ C.named(3);
+    A<int, int> a0 = new /*@ typeArgs=int* */ C(3);
+    A<int, int> a1 = new /*@ typeArgs=int* */ C.named(3);
     A<int, int> a2 = new C<int>(3);
     A<int, int> a3 = new C<int>.named(3);
     A<int, int> a4 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>(3);
     A<int, int> a5 = /*error:INVALID_ASSIGNMENT*/ new C<dynamic>.named(3);
   }
   {
-    A<int, int> a0 = new /*@typeArgs=int*/ C(
+    A<int, int> a0 = new /*@ typeArgs=int* */ C(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
-    A<int, int> a1 = new /*@typeArgs=int*/ C.named(
+    A<int, int> a1 = new /*@ typeArgs=int* */ C.named(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
   }
   {
-    A<int, String> a0 = new /*@typeArgs=dynamic, String*/ D("hello");
-    A<int, String> a1 = new /*@typeArgs=dynamic, String*/ D.named("hello");
+    A<int, String> a0 = new /*@ typeArgs=dynamic, String* */ D("hello");
+    A<int, String> a1 = new /*@ typeArgs=dynamic, String* */ D.named("hello");
     A<int, String> a2 = new D<int, String>("hello");
     A<int, String> a3 = new D<String, String>.named("hello");
     A<int, String>
@@ -101,34 +101,34 @@
             "hello");
   }
   {
-    A<int, String> a0 = new /*@typeArgs=dynamic, String*/ D(
+    A<int, String> a0 = new /*@ typeArgs=dynamic, String* */ D(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-    A<int, String> a1 = new /*@typeArgs=dynamic, String*/ D.named(
+    A<int, String> a1 = new /*@ typeArgs=dynamic, String* */ D.named(
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
   }
   {
-    A<C<int>, String> a0 = new /*@typeArgs=int, String*/ E("hello");
+    A<C<int>, String> a0 = new /*@ typeArgs=int*, String* */ E("hello");
   }
   {
     // Check named and optional arguments
-    A<int, String> a0 = new /*@typeArgs=int, String*/ F(3, "hello",
-        a: /*@typeArgs=int*/ [3], b: /*@typeArgs=String*/ ["hello"]);
-    A<int, String> a1 = new /*@typeArgs=int, String*/ F(3, "hello",
-        a: /*@typeArgs=int*/ [
+    A<int, String> a0 = new /*@ typeArgs=int*, String* */ F(3, "hello",
+        a: /*@ typeArgs=int* */ [3], b: /*@ typeArgs=String* */ ["hello"]);
+    A<int, String> a1 = new /*@ typeArgs=int*, String* */ F(3, "hello",
+        a: /*@ typeArgs=int* */ [
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
         ],
-        b: /*@typeArgs=String*/ [
+        b: /*@ typeArgs=String* */ [
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 3
         ]);
     A<int, String> a2 =
-        new /*@typeArgs=int, String*/ F.named(3, "hello", 3, "hello");
-    A<int, String> a3 = new /*@typeArgs=int, String*/ F.named(3, "hello");
-    A<int, String> a4 = new /*@typeArgs=int, String*/ F.named(
+        new /*@ typeArgs=int*, String* */ F.named(3, "hello", 3, "hello");
+    A<int, String> a3 = new /*@ typeArgs=int*, String* */ F.named(3, "hello");
+    A<int, String> a4 = new /*@ typeArgs=int*, String* */ F.named(
         3,
         "hello",
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-    A<int, String> a5 = new /*@typeArgs=int, String*/ F.named(
+    A<int, String> a5 = new /*@ typeArgs=int*, String* */ F.named(
         3,
         "hello",
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ "hello");
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
index c641be2..d50b939 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.expect
@@ -2,112 +2,116 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::S x;
-  generic-covariant-impl field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl 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>
+  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::•()
     ;
 }
-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>
+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>
+  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>
+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>
+  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>
+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>
+  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>
+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 = null, core::List<self::F::T> b = null}) → self::F<self::F::S, self::F::T>
+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 = null, self::F::T b = null]) → self::F<self::F::S, self::F::T>
+  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::•<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a1 = new self::A::named<dynamic, dynamic>(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 = new self::A::•<core::int, dynamic>(3, "hello");
-    self::A<core::int, core::String> a5 = new self::A::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a0 = new self::A::•<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a1 = new self::A::named<dynamic, dynamic>(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 = new self::A::•<core::int*, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a5 = new self::A::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<dynamic, dynamic>("hello", 3);
-    self::A<core::int, core::String> a1 = new self::A::named<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a0 = new self::A::•<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a1 = new self::A::named<dynamic, dynamic>("hello", 3);
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<dynamic, dynamic>("hello", 3);
-    self::A<core::int, core::String> a1 = new self::B::named<dynamic, dynamic>("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 = new self::B::•<core::String, dynamic>("hello", 3);
-    self::A<core::int, core::String> a5 = new self::B::named<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a0 = new self::B::•<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<dynamic, dynamic>("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 = new self::B::•<core::String*, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a5 = new self::B::named<dynamic, dynamic>("hello", 3);
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a1 = new self::B::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a0 = new self::B::•<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a1 = new self::B::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<dynamic>(3);
-    self::A<core::int, core::int> a1 = new self::C::named<dynamic>(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 = new self::C::•<dynamic>(3);
-    self::A<core::int, core::int> a5 = new self::C::named<dynamic>(3);
+    self::A<core::int*, core::int*>* a0 = new self::C::•<dynamic>(3);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<dynamic>(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 = new self::C::•<dynamic>(3);
+    self::A<core::int*, core::int*>* a5 = new self::C::named<dynamic>(3);
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<dynamic>("hello");
-    self::A<core::int, core::int> a1 = new self::C::named<dynamic>("hello");
+    self::A<core::int*, core::int*>* a0 = new self::C::•<dynamic>("hello");
+    self::A<core::int*, core::int*>* a1 = new self::C::named<dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, dynamic>("hello");
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, dynamic>("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 = new self::D::•<core::num, dynamic>("hello");
-    self::A<core::int, core::String> a5 = new self::D::named<dynamic, dynamic>("hello");
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, dynamic>("hello");
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, dynamic>("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 = new self::D::•<core::num*, dynamic>("hello");
+    self::A<core::int*, core::String*>* a5 = new self::D::named<dynamic, dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, dynamic>(3);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, dynamic>(3);
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, dynamic>(3);
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, dynamic>(3);
   }
   {
-    self::A<self::C<core::int>, core::String> a0 = new self::E::•<dynamic, dynamic>("hello");
+    self::A<self::C<core::int*>*, core::String*>* a0 = new self::E::•<dynamic, dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>[3], b: <dynamic>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>["hello"], b: <dynamic>[3]);
-    self::A<core::int, core::String> a2 = new self::F::named<dynamic, dynamic>(3, "hello", 3, "hello");
-    self::A<core::int, core::String> a3 = new self::F::named<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<dynamic, dynamic>(3, "hello", "hello", 3);
-    self::A<core::int, core::String> a5 = new self::F::named<dynamic, dynamic>(3, "hello", "hello");
+    self::A<core::int*, core::String*>* a0 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>[3], b: <dynamic>["hello"]);
+    self::A<core::int*, core::String*>* a1 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>["hello"], b: <dynamic>[3]);
+    self::A<core::int*, core::String*>* a2 = new self::F::named<dynamic, dynamic>(3, "hello", 3, "hello");
+    self::A<core::int*, core::String*>* a3 = new self::F::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a4 = new self::F::named<dynamic, dynamic>(3, "hello", "hello", 3);
+    self::A<core::int*, core::String*>* a5 = new self::F::named<dynamic, dynamic>(3, "hello", "hello");
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
index c641be2..d50b939 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.legacy.transformed.expect
@@ -2,112 +2,116 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::S x;
-  generic-covariant-impl field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl 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>
+  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::•()
     ;
 }
-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>
+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>
+  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>
+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>
+  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>
+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>
+  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>
+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 = null, core::List<self::F::T> b = null}) → self::F<self::F::S, self::F::T>
+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 = null, self::F::T b = null]) → self::F<self::F::S, self::F::T>
+  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::•<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a1 = new self::A::named<dynamic, dynamic>(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 = new self::A::•<core::int, dynamic>(3, "hello");
-    self::A<core::int, core::String> a5 = new self::A::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a0 = new self::A::•<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a1 = new self::A::named<dynamic, dynamic>(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 = new self::A::•<core::int*, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a5 = new self::A::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::A::•<dynamic, dynamic>("hello", 3);
-    self::A<core::int, core::String> a1 = new self::A::named<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a0 = new self::A::•<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a1 = new self::A::named<dynamic, dynamic>("hello", 3);
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<dynamic, dynamic>("hello", 3);
-    self::A<core::int, core::String> a1 = new self::B::named<dynamic, dynamic>("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 = new self::B::•<core::String, dynamic>("hello", 3);
-    self::A<core::int, core::String> a5 = new self::B::named<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a0 = new self::B::•<dynamic, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<dynamic, dynamic>("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 = new self::B::•<core::String*, dynamic>("hello", 3);
+    self::A<core::int*, core::String*>* a5 = new self::B::named<dynamic, dynamic>("hello", 3);
   }
   {
-    self::A<core::int, core::String> a0 = new self::B::•<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a1 = new self::B::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a0 = new self::B::•<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a1 = new self::B::named<dynamic, dynamic>(3, "hello");
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<dynamic>(3);
-    self::A<core::int, core::int> a1 = new self::C::named<dynamic>(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 = new self::C::•<dynamic>(3);
-    self::A<core::int, core::int> a5 = new self::C::named<dynamic>(3);
+    self::A<core::int*, core::int*>* a0 = new self::C::•<dynamic>(3);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<dynamic>(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 = new self::C::•<dynamic>(3);
+    self::A<core::int*, core::int*>* a5 = new self::C::named<dynamic>(3);
   }
   {
-    self::A<core::int, core::int> a0 = new self::C::•<dynamic>("hello");
-    self::A<core::int, core::int> a1 = new self::C::named<dynamic>("hello");
+    self::A<core::int*, core::int*>* a0 = new self::C::•<dynamic>("hello");
+    self::A<core::int*, core::int*>* a1 = new self::C::named<dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, dynamic>("hello");
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, dynamic>("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 = new self::D::•<core::num, dynamic>("hello");
-    self::A<core::int, core::String> a5 = new self::D::named<dynamic, dynamic>("hello");
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, dynamic>("hello");
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, dynamic>("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 = new self::D::•<core::num*, dynamic>("hello");
+    self::A<core::int*, core::String*>* a5 = new self::D::named<dynamic, dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::D::•<dynamic, dynamic>(3);
-    self::A<core::int, core::String> a1 = new self::D::named<dynamic, dynamic>(3);
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, dynamic>(3);
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, dynamic>(3);
   }
   {
-    self::A<self::C<core::int>, core::String> a0 = new self::E::•<dynamic, dynamic>("hello");
+    self::A<self::C<core::int*>*, core::String*>* a0 = new self::E::•<dynamic, dynamic>("hello");
   }
   {
-    self::A<core::int, core::String> a0 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>[3], b: <dynamic>["hello"]);
-    self::A<core::int, core::String> a1 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>["hello"], b: <dynamic>[3]);
-    self::A<core::int, core::String> a2 = new self::F::named<dynamic, dynamic>(3, "hello", 3, "hello");
-    self::A<core::int, core::String> a3 = new self::F::named<dynamic, dynamic>(3, "hello");
-    self::A<core::int, core::String> a4 = new self::F::named<dynamic, dynamic>(3, "hello", "hello", 3);
-    self::A<core::int, core::String> a5 = new self::F::named<dynamic, dynamic>(3, "hello", "hello");
+    self::A<core::int*, core::String*>* a0 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>[3], b: <dynamic>["hello"]);
+    self::A<core::int*, core::String*>* a1 = new self::F::•<dynamic, dynamic>(3, "hello", a: <dynamic>["hello"], b: <dynamic>[3]);
+    self::A<core::int*, core::String*>* a2 = new self::F::named<dynamic, dynamic>(3, "hello", 3, "hello");
+    self::A<core::int*, core::String*>* a3 = new self::F::named<dynamic, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a4 = new self::F::named<dynamic, dynamic>(3, "hello", "hello", 3);
+    self::A<core::int*, core::String*>* a5 = new self::F::named<dynamic, dynamic>(3, "hello", "hello");
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
index 8ca9a95..35c8e0e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.expect
@@ -144,201 +144,205 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::S x;
-  generic-covariant-impl field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl 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>
+  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::•()
     ;
 }
-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>
+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>
+  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>
+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>
+  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>
+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>
+  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>
+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 = null, core::List<self::F::T> b = null}) → self::F<self::F::S, self::F::T>
+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 = null, self::F::T b = null]) → self::F<self::F::S, self::F::T>
+  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 = let final<BottomType> #t1 = 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>'.
+    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 = let final<BottomType> #t1 = 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 = let final<BottomType> #t2 = 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>'.
+                                                 ^" in new self::A::•<core::int*, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t2 = 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>(let final<BottomType> #t3 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(let final<BottomType> #t3 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t4 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t5 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(let final<BottomType> #t5 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t6 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-                                               ^" in 3 as{TypeError} core::String);
+                                               ^" 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 = let final<BottomType> #t7 = 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>'.
+    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 = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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 = let final<BottomType> #t8 = 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>'.
+                                              ^" in new self::B::•<core::String*, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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>;
+                                              ^" 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>(let final<BottomType> #t9 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>(let final<BottomType> #t9 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = 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'.
+                                               ^" in 3 as{TypeError} core::String*, let final<BottomType> #t10 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t11 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>(let final<BottomType> #t11 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = 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'.
+                                               ^" in 3 as{TypeError} core::String*, let final<BottomType> #t12 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" 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 = let final<BottomType> #t13 = 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>'.
+    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 = let final<BottomType> #t13 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     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 = let final<BottomType> #t14 = 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>'.
+                                                      ^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
+    self::A<core::int*, core::int*>* a5 = let final<BottomType> #t14 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     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>;
+                                                      ^" 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>(let final<BottomType> #t15 = 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'.
+    self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(let final<BottomType> #t15 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t16 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(let final<BottomType> #t16 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" 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 = let final<BottomType> #t17 = 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>'.
+    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 = let final<BottomType> #t17 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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 = let final<BottomType> #t18 = 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>'.
+                                              ^" in new self::D::•<core::num*, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t18 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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>;
+                                              ^" 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>(let final<BottomType> #t19 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>(let final<BottomType> #t19 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t20 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>(let final<BottomType> #t20 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-                                               ^" in 3 as{TypeError} core::String);
+                                               ^" 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<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>[let final<BottomType> #t21 = 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'.
+    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*>[let final<BottomType> #t21 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = 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'.
+                                                     ^" in "hello" as{TypeError} core::int*], b: <core::String*>[let final<BottomType> #t22 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t23 = 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'.
+                                                     ^" 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", let final<BottomType> #t23 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t24 = 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'.
 Try changing the type of the parameter, or casting the argument to '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", let final<BottomType> #t25 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a5 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t25 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" in "hello" as{TypeError} core::int*);
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
index 8ca9a95..35c8e0e 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_instance_creations_infer_downwards.dart.strong.transformed.expect
@@ -144,201 +144,205 @@
 import self as self;
 import "dart:core" as core;
 
-class A<S extends core::Object = dynamic, T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::S x;
-  generic-covariant-impl field self::A::T y;
-  constructor •(self::A::S x, self::A::T y) → self::A<self::A::S, self::A::T>
+class A<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::S* x;
+  generic-covariant-impl 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>
+  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::•()
     ;
 }
-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>
+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>
+  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>
+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>
+  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>
+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>
+  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>
+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 = null, core::List<self::F::T> b = null}) → self::F<self::F::S, self::F::T>
+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 = null, self::F::T b = null]) → self::F<self::F::S, self::F::T>
+  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 = let final<BottomType> #t1 = 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>'.
+    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 = let final<BottomType> #t1 = 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 = let final<BottomType> #t2 = 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>'.
+                                                 ^" in new self::A::•<core::int*, dynamic>(3, "hello");
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t2 = 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>(let final<BottomType> #t3 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::A::•<core::int*, core::String*>(let final<BottomType> #t3 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t4 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t4 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t5 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::A::named<core::int*, core::String*>(let final<BottomType> #t5 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t6 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t6 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-                                               ^" in 3 as{TypeError} core::String);
+                                               ^" 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 = let final<BottomType> #t7 = 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>'.
+    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 = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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 = let final<BottomType> #t8 = 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>'.
+                                              ^" in new self::B::•<core::String*, dynamic>("hello", 3) as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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>;
+                                              ^" 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>(let final<BottomType> #t9 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::B::•<core::String*, core::int*>(let final<BottomType> #t9 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t10 = 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'.
+                                               ^" in 3 as{TypeError} core::String*, let final<BottomType> #t10 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t11 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::String*>* a1 = new self::B::named<core::String*, core::int*>(let final<BottomType> #t11 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3,
-                                               ^" in 3 as{TypeError} core::String, let final<BottomType> #t12 = 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'.
+                                               ^" in 3 as{TypeError} core::String*, let final<BottomType> #t12 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" 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 = let final<BottomType> #t13 = 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>'.
+    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 = let final<BottomType> #t13 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     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 = let final<BottomType> #t14 = 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>'.
+                                                      ^" in new self::C::•<dynamic>(3) as{TypeError} self::A<core::int*, core::int*>*;
+    self::A<core::int*, core::int*>* a5 = let final<BottomType> #t14 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, int>'.
     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>;
+                                                      ^" 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>(let final<BottomType> #t15 = 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'.
+    self::A<core::int*, core::int*>* a0 = new self::C::•<core::int*>(let final<BottomType> #t15 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t16 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*);
+    self::A<core::int*, core::int*>* a1 = new self::C::named<core::int*>(let final<BottomType> #t16 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" 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 = let final<BottomType> #t17 = 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>'.
+    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 = let final<BottomType> #t17 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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 = let final<BottomType> #t18 = 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>'.
+                                              ^" in new self::D::•<core::num*, dynamic>("hello") as{TypeError} self::A<core::int*, core::String*>*;
+    self::A<core::int*, core::String*>* a5 = let final<BottomType> #t18 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A<int, String>'.
         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>;
+                                              ^" 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>(let final<BottomType> #t19 = 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'.
+    self::A<core::int*, core::String*>* a0 = new self::D::•<dynamic, core::String*>(let final<BottomType> #t19 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t20 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a1 = new self::D::named<dynamic, core::String*>(let final<BottomType> #t20 = 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'.
 Try changing the type of the parameter, or casting the argument to 'String'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 3);
-                                               ^" in 3 as{TypeError} core::String);
+                                               ^" 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<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>[let final<BottomType> #t21 = 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'.
+    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*>[let final<BottomType> #t21 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
           /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                     ^" in "hello" as{TypeError} core::int], b: <core::String>[let final<BottomType> #t22 = 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'.
+                                                     ^" in "hello" as{TypeError} core::int*], b: <core::String*>[let final<BottomType> #t22 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t23 = 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'.
+                                                     ^" 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", let final<BottomType> #t23 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                               ^" in "hello" as{TypeError} core::int, let final<BottomType> #t24 = 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'.
+                                               ^" in "hello" as{TypeError} core::int*, let final<BottomType> #t24 = 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'.
 Try changing the type of the parameter, or casting the argument to '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", let final<BottomType> #t25 = 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'.
+                                               ^" in 3 as{TypeError} core::String*);
+    self::A<core::int*, core::String*>* a5 = new self::F::named<core::int*, core::String*>(3, "hello", let final<BottomType> #t25 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
         /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\");
-                                               ^" in "hello" as{TypeError} core::int);
+                                               ^" 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 b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart
index a92c756..d7d559b 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart
@@ -6,28 +6,28 @@
 library test;
 
 void foo(
-    [List<String> list1 = /*@typeArgs=String*/ const [],
-    List<String> list2 = /*@typeArgs=String*/ const [
+    [List<String> list1 = /*@ typeArgs=String* */ const [],
+    List<String> list2 = /*@ typeArgs=String* */ const [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
     ]]) {}
 
 void main() {
   {
-    List<int> l0 = /*@typeArgs=int*/ [];
-    List<int> l1 = /*@typeArgs=int*/ [3];
-    List<int> l2 = /*@typeArgs=int*/ [
+    List<int> l0 = /*@ typeArgs=int* */ [];
+    List<int> l1 = /*@ typeArgs=int* */ [3];
+    List<int> l2 = /*@ typeArgs=int* */ [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
     ];
-    List<int> l3 = /*@typeArgs=int*/ [
+    List<int> l3 = /*@ typeArgs=int* */ [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
       3
     ];
   }
   {
-    List<dynamic> l0 = /*@typeArgs=dynamic*/ [];
-    List<dynamic> l1 = /*@typeArgs=dynamic*/ [3];
-    List<dynamic> l2 = /*@typeArgs=dynamic*/ ["hello"];
-    List<dynamic> l3 = /*@typeArgs=dynamic*/ ["hello", 3];
+    List<dynamic> l0 = /*@ typeArgs=dynamic */ [];
+    List<dynamic> l1 = /*@ typeArgs=dynamic */ [3];
+    List<dynamic> l2 = /*@ typeArgs=dynamic */ ["hello"];
+    List<dynamic> l3 = /*@ typeArgs=dynamic */ ["hello", 3];
   }
   {
     List<int> l0 = /*error:INVALID_CAST_LITERAL_LIST*/ <num>[];
@@ -41,23 +41,23 @@
     ];
   }
   {
-    Iterable<int> i0 = /*@typeArgs=int*/ [];
-    Iterable<int> i1 = /*@typeArgs=int*/ [3];
-    Iterable<int> i2 = /*@typeArgs=int*/ [
+    Iterable<int> i0 = /*@ typeArgs=int* */ [];
+    Iterable<int> i1 = /*@ typeArgs=int* */ [3];
+    Iterable<int> i2 = /*@ typeArgs=int* */ [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
     ];
-    Iterable<int> i3 = /*@typeArgs=int*/ [
+    Iterable<int> i3 = /*@ typeArgs=int* */ [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
       3
     ];
   }
   {
-    const List<int> c0 = /*@typeArgs=int*/ const [];
-    const List<int> c1 = /*@typeArgs=int*/ const [3];
-    const List<int> c2 = /*@typeArgs=int*/ const [
+    const List<int> c0 = /*@ typeArgs=int* */ const [];
+    const List<int> c1 = /*@ typeArgs=int* */ const [3];
+    const List<int> c2 = /*@ typeArgs=int* */ const [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello"
     ];
-    const List<int> c3 = /*@typeArgs=int*/ const [
+    const List<int> c3 = /*@ typeArgs=int* */ const [
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ "hello",
       3
     ];
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect
index 764ed07..71d70fa 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.expect
@@ -2,36 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <dynamic>[], core::List<core::String> list2 = const <dynamic>[42]]) → void {}
+static method foo([core::List<core::String*>* list1 = #C1, core::List<core::String*>* list2 = #C3]) → void {}
 static method main() → void {
   {
-    core::List<core::int> l0 = <dynamic>[];
-    core::List<core::int> l1 = <dynamic>[3];
-    core::List<core::int> l2 = <dynamic>["hello"];
-    core::List<core::int> l3 = <dynamic>["hello", 3];
+    core::List<core::int*>* l0 = <dynamic>[];
+    core::List<core::int*>* l1 = <dynamic>[3];
+    core::List<core::int*>* l2 = <dynamic>["hello"];
+    core::List<core::int*>* l3 = <dynamic>["hello", 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<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 = <core::num>[];
-    core::List<core::int> l1 = <core::num>[3];
-    core::List<core::int> l2 = <core::num>["hello"];
-    core::List<core::int> l3 = <core::num>["hello", 3];
+    core::List<core::int*>* l0 = <core::num*>[];
+    core::List<core::int*>* l1 = <core::num*>[3];
+    core::List<core::int*>* l2 = <core::num*>["hello"];
+    core::List<core::int*>* l3 = <core::num*>["hello", 3];
   }
   {
-    core::Iterable<core::int> i0 = <dynamic>[];
-    core::Iterable<core::int> i1 = <dynamic>[3];
-    core::Iterable<core::int> i2 = <dynamic>["hello"];
-    core::Iterable<core::int> i3 = <dynamic>["hello", 3];
+    core::Iterable<core::int*>* i0 = <dynamic>[];
+    core::Iterable<core::int*>* i1 = <dynamic>[3];
+    core::Iterable<core::int*>* i2 = <dynamic>["hello"];
+    core::Iterable<core::int*>* i3 = <dynamic>["hello", 3];
   }
-  {
-    const core::List<core::int> c0 = const <dynamic>[];
-    const core::List<core::int> c1 = const <dynamic>[3];
-    const core::List<core::int> c2 = const <dynamic>["hello"];
-    const core::List<core::int> c3 = const <dynamic>["hello", 3];
-  }
+  {}
+}
+
+constants  {
+  #C1 = <dynamic>[]
+  #C2 = 42
+  #C3 = <dynamic>[#C2]
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect
index 764ed07..71d70fa 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.legacy.transformed.expect
@@ -2,36 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <dynamic>[], core::List<core::String> list2 = const <dynamic>[42]]) → void {}
+static method foo([core::List<core::String*>* list1 = #C1, core::List<core::String*>* list2 = #C3]) → void {}
 static method main() → void {
   {
-    core::List<core::int> l0 = <dynamic>[];
-    core::List<core::int> l1 = <dynamic>[3];
-    core::List<core::int> l2 = <dynamic>["hello"];
-    core::List<core::int> l3 = <dynamic>["hello", 3];
+    core::List<core::int*>* l0 = <dynamic>[];
+    core::List<core::int*>* l1 = <dynamic>[3];
+    core::List<core::int*>* l2 = <dynamic>["hello"];
+    core::List<core::int*>* l3 = <dynamic>["hello", 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<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 = <core::num>[];
-    core::List<core::int> l1 = <core::num>[3];
-    core::List<core::int> l2 = <core::num>["hello"];
-    core::List<core::int> l3 = <core::num>["hello", 3];
+    core::List<core::int*>* l0 = <core::num*>[];
+    core::List<core::int*>* l1 = <core::num*>[3];
+    core::List<core::int*>* l2 = <core::num*>["hello"];
+    core::List<core::int*>* l3 = <core::num*>["hello", 3];
   }
   {
-    core::Iterable<core::int> i0 = <dynamic>[];
-    core::Iterable<core::int> i1 = <dynamic>[3];
-    core::Iterable<core::int> i2 = <dynamic>["hello"];
-    core::Iterable<core::int> i3 = <dynamic>["hello", 3];
+    core::Iterable<core::int*>* i0 = <dynamic>[];
+    core::Iterable<core::int*>* i1 = <dynamic>[3];
+    core::Iterable<core::int*>* i2 = <dynamic>["hello"];
+    core::Iterable<core::int*>* i3 = <dynamic>["hello", 3];
   }
-  {
-    const core::List<core::int> c0 = const <dynamic>[];
-    const core::List<core::int> c1 = const <dynamic>[3];
-    const core::List<core::int> c2 = const <dynamic>["hello"];
-    const core::List<core::int> c3 = const <dynamic>["hello", 3];
-  }
+  {}
+}
+
+constants  {
+  #C1 = <dynamic>[]
+  #C2 = 42
+  #C3 = <dynamic>[#C2]
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
index c7a14c1..6f0f9ee 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.expect
@@ -74,79 +74,81 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = 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'.
+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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
-                                                                                        ^" in 42 as{TypeError} core::String]]) → void {}
+                                                                                        ^"]) → 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>[let final<BottomType> #t2 = 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'.
+    core::List<core::int*>* l0 = <core::int*>[];
+    core::List<core::int*>* l1 = <core::int*>[3];
+    core::List<core::int*>* l2 = <core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::int];
-    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = 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'.
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::List<core::int*>* l3 = <core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::int, 3];
+                                                 ^" 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<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 = let final<BottomType> #t4 = 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>'.
+    core::List<core::int*>* l0 = let final<BottomType> #t3 = 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 = let final<BottomType> #t5 = 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>'.
+                                                            ^" in <core::num*>[];
+    core::List<core::int*>* l1 = let final<BottomType> #t4 = 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 = let final<BottomType> #t6 = 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>'.
+                                                            ^" in <core::num*>[3];
+    core::List<core::int*>* l2 = let final<BottomType> #t5 = 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>[let final<BottomType> #t7 = 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'.
+                                                            ^" in <core::num*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::num];
-    core::List<core::int> l3 = let final<BottomType> #t8 = 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>'.
+                                                 ^" in "hello" as{TypeError} core::num*];
+    core::List<core::int*>* l3 = let final<BottomType> #t7 = 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>[let final<BottomType> #t9 = 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'.
+                                                            ^" in <core::num*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::num, 3];
+                                                 ^" 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>[let final<BottomType> #t10 = 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'.
+    core::Iterable<core::int*>* i0 = <core::int*>[];
+    core::Iterable<core::int*>* i1 = <core::int*>[3];
+    core::Iterable<core::int*>* i2 = <core::int*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::int];
-    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = 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'.
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::Iterable<core::int*>* i3 = <core::int*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::int, 3];
+                                                 ^" in "hello" as{TypeError} core::int*, 3];
   }
   {
-    const core::List<core::int> c0 = const <core::int>[];
-    const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = 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'.
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                                                        ^" in "hello" as{TypeError} core::int];
-    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = 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'.
+                                                                                        ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                                                        ^" in "hello" as{TypeError} core::int, 3];
+                                                                                        ^";
   }
 }
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
index c7a14c1..6f0f9ee 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_downwards.dart.strong.transformed.expect
@@ -74,79 +74,81 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::List<core::String> list1 = const <core::String>[], core::List<core::String> list2 = const <core::String>[let final<BottomType> #t1 = 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'.
+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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42
-                                                                                        ^" in 42 as{TypeError} core::String]]) → void {}
+                                                                                        ^"]) → 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>[let final<BottomType> #t2 = 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'.
+    core::List<core::int*>* l0 = <core::int*>[];
+    core::List<core::int*>* l1 = <core::int*>[3];
+    core::List<core::int*>* l2 = <core::int*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::int];
-    core::List<core::int> l3 = <core::int>[let final<BottomType> #t3 = 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'.
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::List<core::int*>* l3 = <core::int*>[let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::int, 3];
+                                                 ^" 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<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 = let final<BottomType> #t4 = 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>'.
+    core::List<core::int*>* l0 = let final<BottomType> #t3 = 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 = let final<BottomType> #t5 = 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>'.
+                                                            ^" in <core::num*>[];
+    core::List<core::int*>* l1 = let final<BottomType> #t4 = 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 = let final<BottomType> #t6 = 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>'.
+                                                            ^" in <core::num*>[3];
+    core::List<core::int*>* l2 = let final<BottomType> #t5 = 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>[let final<BottomType> #t7 = 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'.
+                                                            ^" in <core::num*>[let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::num];
-    core::List<core::int> l3 = let final<BottomType> #t8 = 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>'.
+                                                 ^" in "hello" as{TypeError} core::num*];
+    core::List<core::int*>* l3 = let final<BottomType> #t7 = 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>[let final<BottomType> #t9 = 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'.
+                                                            ^" in <core::num*>[let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::num, 3];
+                                                 ^" 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>[let final<BottomType> #t10 = 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'.
+    core::Iterable<core::int*>* i0 = <core::int*>[];
+    core::Iterable<core::int*>* i1 = <core::int*>[3];
+    core::Iterable<core::int*>* i2 = <core::int*>[let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                 ^" in "hello" as{TypeError} core::int];
-    core::Iterable<core::int> i3 = <core::int>[let final<BottomType> #t11 = 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'.
+                                                 ^" in "hello" as{TypeError} core::int*];
+    core::Iterable<core::int*>* i3 = <core::int*>[let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                 ^" in "hello" as{TypeError} core::int, 3];
+                                                 ^" in "hello" as{TypeError} core::int*, 3];
   }
   {
-    const core::List<core::int> c0 = const <core::int>[];
-    const core::List<core::int> c1 = const <core::int>[3];
-    const core::List<core::int> c2 = const <core::int>[let final<BottomType> #t12 = 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'.
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\"
-                                                                                        ^" in "hello" as{TypeError} core::int];
-    const core::List<core::int> c3 = const <core::int>[let final<BottomType> #t13 = 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'.
+                                                                                        ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ \"hello\",
-                                                                                        ^" in "hello" as{TypeError} core::int, 3];
+                                                                                        ^";
   }
 }
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
index 3e0ba76..9e70b2c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart
@@ -23,15 +23,15 @@
 
   method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
     /*@target=C::assertAOf*/ assertAOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     assertBOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     assertCOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     /*@target=C::assertDOf*/ assertDOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     assertEOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   }
 }
 
@@ -41,13 +41,13 @@
 
   method(AsserterBuilder<List<Asserter<DartType>>, DartType> assertEOf) {
     /*@target=G::assertAOf*/ assertAOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     this. /*@target=G::assertAOf*/ assertAOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     this. /*@target=G::assertDOf*/ assertDOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
     assertEOf(
-        /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+        /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   }
 }
 
@@ -57,27 +57,27 @@
 test() {
   AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf;
   assertAOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   assertBOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   assertCOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   C.assertBOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   C.assertCOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
 
   C c;
   c. /*@target=C::assertAOf*/ assertAOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   c. /*@target=C::assertDOf*/ assertDOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
 
   G<int> g;
   g. /*@target=G::assertAOf*/ assertAOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
   g. /*@target=G::assertDOf*/ assertDOf(
-      /*@typeArgs=(DartType) -> void*/ [_isInt, _isString]);
+      /*@ typeArgs=(DartType*) ->* void */ [_isInt, _isString]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect
index dd7f148..c0ff049 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object = dynamic> = (T) → void;
-typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
 class DartType extends core::Object {
-  synthetic constructor •() → self::DartType
+  synthetic constructor •() → self::DartType*
     : super core::Object::•()
     ;
 }
 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
+  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
+  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 {
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
     this.assertAOf(<dynamic>[self::_isInt, self::_isString]);
     self::C::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
     self::C::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
@@ -26,35 +26,35 @@
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-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>
+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 {
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
     this.assertAOf(<dynamic>[self::_isInt, self::_isString]);
     this.{self::G::assertAOf}(<dynamic>[self::_isInt, self::_isString]);
     this.{self::G::assertDOf}(<dynamic>[self::_isInt, self::_isString]);
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-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
+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;
+  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
   assertAOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::C::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::C::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
-  self::C c;
+  self::C* c;
   c.assertAOf(<dynamic>[self::_isInt, self::_isString]);
   c.assertDOf(<dynamic>[self::_isInt, self::_isString]);
-  self::G<core::int> g;
+  self::G<core::int*>* g;
   g.assertAOf(<dynamic>[self::_isInt, self::_isString]);
   g.assertDOf(<dynamic>[self::_isInt, self::_isString]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect
index dd7f148..c0ff049 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.legacy.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object = dynamic> = (T) → void;
-typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
 class DartType extends core::Object {
-  synthetic constructor •() → self::DartType
+  synthetic constructor •() → self::DartType*
     : super core::Object::•()
     ;
 }
 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
+  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
+  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 {
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
     this.assertAOf(<dynamic>[self::_isInt, self::_isString]);
     self::C::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
     self::C::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
@@ -26,35 +26,35 @@
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-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>
+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 {
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
     this.assertAOf(<dynamic>[self::_isInt, self::_isString]);
     this.{self::G::assertAOf}(<dynamic>[self::_isInt, self::_isString]);
     this.{self::G::assertDOf}(<dynamic>[self::_isInt, self::_isString]);
     assertEOf.call(<dynamic>[self::_isInt, self::_isString]);
   }
 }
-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
+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;
+  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
   assertAOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::C::assertBOf.call(<dynamic>[self::_isInt, self::_isString]);
   self::C::assertCOf.call(<dynamic>[self::_isInt, self::_isString]);
-  self::C c;
+  self::C* c;
   c.assertAOf(<dynamic>[self::_isInt, self::_isString]);
   c.assertDOf(<dynamic>[self::_isInt, self::_isString]);
-  self::G<core::int> g;
+  self::G<core::int*>* g;
   g.assertAOf(<dynamic>[self::_isInt, self::_isString]);
   g.assertDOf(<dynamic>[self::_isInt, self::_isString]);
 }
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
index 831cc39..ca17455 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.expect
@@ -2,60 +2,60 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object = dynamic> = (T) → void;
-typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
 class DartType extends core::Object {
-  synthetic constructor •() → self::DartType
+  synthetic constructor •() → self::DartType*
     : super core::Object::•()
     ;
 }
 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
+  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
+  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 {
-    this.{self::C::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    self::C::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    self::C::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::C::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    this.{self::C::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
   }
 }
-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>
+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 {
-    this.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::G::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
   }
 }
-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
+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.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C c;
-  c.{self::C::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  c.{self::C::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::G<core::int> g;
-  g.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  g.{self::G::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  assertAOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C* c;
+  c.{self::C::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  c.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::G<core::int*>* g;
+  g.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  g.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
index 831cc39..ca17455 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_list_literals_infer_if_value_types_match_context.dart.strong.transformed.expect
@@ -2,60 +2,60 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Asserter<T extends core::Object = dynamic> = (T) → void;
-typedef AsserterBuilder<S extends core::Object = dynamic, T extends core::Object = dynamic> = (S) → (T) → void;
+typedef Asserter<T extends core::Object* = dynamic> = (T*) →* void;
+typedef AsserterBuilder<S extends core::Object* = dynamic, T extends core::Object* = dynamic> = (S*) →* (T*) →* void;
 class DartType extends core::Object {
-  synthetic constructor •() → self::DartType
+  synthetic constructor •() → self::DartType*
     : super core::Object::•()
     ;
 }
 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
+  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
+  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 {
-    this.{self::C::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    self::C::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    self::C::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::C::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    this.{self::C::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
   }
 }
-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>
+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 {
-    this.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    this.{self::G::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-    assertEOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  abstract get assertDOf() → (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void;
+  method method((core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertEOf) → dynamic {
+    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    this.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+    assertEOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
   }
 }
-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
+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.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C::assertBOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C::assertCOf.call(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::C c;
-  c.{self::C::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  c.{self::C::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  self::G<core::int> g;
-  g.{self::G::assertAOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
-  g.{self::G::assertDOf}(<(self::DartType) → void>[self::_isInt, self::_isString]);
+  (core::List<(self::DartType*) →* void>*) →* (self::DartType*) →* void assertAOf;
+  assertAOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C::assertBOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C::assertCOf.call(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::C* c;
+  c.{self::C::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  c.{self::C::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  self::G<core::int*>* g;
+  g.{self::G::assertAOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
+  g.{self::G::assertDOf}(<(self::DartType*) →* void>[self::_isInt, self::_isString]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart
index 3833124..0f2ce44 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart
@@ -6,60 +6,60 @@
 library test;
 
 void foo(
-    [Map<int, String> m1 = /*@typeArgs=int, String*/ const {1: "hello"},
-    Map<int, String> m2 = /*@typeArgs=int, String*/ const {
+    [Map<int, String> m1 = /*@ typeArgs=int*, String* */ const {1: "hello"},
+    Map<int, String> m2 = /*@ typeArgs=int*, String* */ const {
       // One error is from type checking and the other is from const evaluation.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
           "world"
     }]) {}
 void test() {
   {
-    Map<int, String> l0 = /*@typeArgs=int, String*/ {};
-    Map<int, String> l1 = /*@typeArgs=int, String*/ {3: "hello"};
-    Map<int, String> l2 = /*@typeArgs=int, String*/ {
+    Map<int, String> l0 = /*@ typeArgs=int*, String* */ {};
+    Map<int, String> l1 = /*@ typeArgs=int*, String* */ {3: "hello"};
+    Map<int, String> l2 = /*@ typeArgs=int*, String* */ {
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
     };
-    Map<int, String> l3 = /*@typeArgs=int, String*/ {
+    Map<int, String> l3 = /*@ typeArgs=int*, String* */ {
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
     };
-    Map<int, String> l4 = /*@typeArgs=int, String*/ {
+    Map<int, String> l4 = /*@ typeArgs=int*, String* */ {
       3: "hello",
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
     };
   }
   {
-    Map<dynamic, dynamic> l0 = /*@typeArgs=dynamic, dynamic*/ {};
-    Map<dynamic, dynamic> l1 = /*@typeArgs=dynamic, dynamic*/ {3: "hello"};
-    Map<dynamic, dynamic> l2 = /*@typeArgs=dynamic, dynamic*/ {
+    Map<dynamic, dynamic> l0 = /*@ typeArgs=dynamic, dynamic */ {};
+    Map<dynamic, dynamic> l1 = /*@ typeArgs=dynamic, dynamic */ {3: "hello"};
+    Map<dynamic, dynamic> l2 = /*@ typeArgs=dynamic, dynamic */ {
       "hello": "hello"
     };
-    Map<dynamic, dynamic> l3 = /*@typeArgs=dynamic, dynamic*/ {3: 3};
-    Map<dynamic, dynamic> l4 = /*@typeArgs=dynamic, dynamic*/ {
+    Map<dynamic, dynamic> l3 = /*@ typeArgs=dynamic, dynamic */ {3: 3};
+    Map<dynamic, dynamic> l4 = /*@ typeArgs=dynamic, dynamic */ {
       3: "hello",
       "hello": 3
     };
   }
   {
-    Map<dynamic, String> l0 = /*@typeArgs=dynamic, String*/ {};
-    Map<dynamic, String> l1 = /*@typeArgs=dynamic, String*/ {3: "hello"};
-    Map<dynamic, String> l2 = /*@typeArgs=dynamic, String*/ {"hello": "hello"};
-    Map<dynamic, String> l3 = /*@typeArgs=dynamic, String*/ {
+    Map<dynamic, String> l0 = /*@ typeArgs=dynamic, String* */ {};
+    Map<dynamic, String> l1 = /*@ typeArgs=dynamic, String* */ {3: "hello"};
+    Map<dynamic, String> l2 = /*@ typeArgs=dynamic, String* */ {"hello": "hello"};
+    Map<dynamic, String> l3 = /*@ typeArgs=dynamic, String* */ {
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
     };
-    Map<dynamic, String> l4 = /*@typeArgs=dynamic, String*/ {
+    Map<dynamic, String> l4 = /*@ typeArgs=dynamic, String* */ {
       3: "hello",
       "hello": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
     };
   }
   {
-    Map<int, dynamic> l0 = /*@typeArgs=int, dynamic*/ {};
-    Map<int, dynamic> l1 = /*@typeArgs=int, dynamic*/ {3: "hello"};
-    Map<int, dynamic> l2 = /*@typeArgs=int, dynamic*/ {
+    Map<int, dynamic> l0 = /*@ typeArgs=int*, dynamic */ {};
+    Map<int, dynamic> l1 = /*@ typeArgs=int*, dynamic */ {3: "hello"};
+    Map<int, dynamic> l2 = /*@ typeArgs=int*, dynamic */ {
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": "hello"
     };
-    Map<int, dynamic> l3 = /*@typeArgs=int, dynamic*/ {3: 3};
-    Map<int, dynamic> l4 = /*@typeArgs=int, dynamic*/ {
+    Map<int, dynamic> l3 = /*@ typeArgs=int*, dynamic */ {3: 3};
+    Map<int, dynamic> l4 = /*@ typeArgs=int*, dynamic */ {
       3: "hello",
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello": 3
     };
@@ -74,16 +74,16 @@
     };
   }
   {
-    const Map<int, String> l0 = /*@typeArgs=int, String*/ const {};
-    const Map<int, String> l1 = /*@typeArgs=int, String*/ const {3: "hello"};
-    const Map<int, String> l2 = /*@typeArgs=int, String*/ const {
+    const Map<int, String> l0 = /*@ typeArgs=int*, String* */ const {};
+    const Map<int, String> l1 = /*@ typeArgs=int*, String* */ const {3: "hello"};
+    const Map<int, String> l2 = /*@ typeArgs=int*, String* */ const {
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
           "hello"
     };
-    const Map<int, String> l3 = /*@typeArgs=int, String*/ const {
+    const Map<int, String> l3 = /*@ typeArgs=int*, String* */ const {
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
     };
-    const Map<int, String> l4 = /*@typeArgs=int, String*/ const {
+    const Map<int, String> l4 = /*@ typeArgs=int*, String* */ const {
       3: "hello",
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ "hello":
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect
index 57c74f5..b7b89c2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.expect
@@ -2,47 +2,51 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <dynamic, dynamic>{1: "hello"}, core::Map<core::int, core::String> m2 = const <dynamic, dynamic>{"hello": "world"}]) → void {}
+static method foo([core::Map<core::int*, core::String*>* m1 = #C4, core::Map<core::int*, core::String*>* m2 = #C7]) → void {}
 static method test() → void {
   {
-    core::Map<core::int, core::String> l0 = <dynamic, dynamic>{};
-    core::Map<core::int, core::String> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<core::int, core::String> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<core::int, core::String> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<core::int*, core::String*>* l0 = <dynamic, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<core::int*, core::String*>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<core::int*, core::String*>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    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, 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, dynamic>{};
-    core::Map<dynamic, core::String> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<dynamic, core::String> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<dynamic, core::String> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<dynamic, core::String*>* l0 = <dynamic, dynamic>{};
+    core::Map<dynamic, core::String*>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<dynamic, core::String*>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<dynamic, core::String*>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<dynamic, core::String*>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    core::Map<core::int, dynamic> l0 = <dynamic, dynamic>{};
-    core::Map<core::int, dynamic> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<core::int, dynamic> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<core::int*, dynamic>* l0 = <dynamic, dynamic>{};
+    core::Map<core::int*, dynamic>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<core::int*, dynamic>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<core::int*, dynamic>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<core::int*, dynamic>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    core::Map<core::int, core::String> l0 = <core::num, dynamic>{};
-    core::Map<core::int, core::String> l1 = <core::num, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l3 = <core::num, dynamic>{3: 3};
+    core::Map<core::int*, core::String*>* l0 = <core::num*, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = <core::num*, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l3 = <core::num*, dynamic>{3: 3};
   }
-  {
-    const core::Map<core::int, core::String> l0 = const <dynamic, dynamic>{};
-    const core::Map<core::int, core::String> l1 = const <dynamic, dynamic>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <dynamic, dynamic>{"hello": "hello"};
-    const core::Map<core::int, core::String> l3 = const <dynamic, dynamic>{3: 3};
-    const core::Map<core::int, core::String> l4 = const <dynamic, dynamic>{3: "hello", "hello": 3};
-  }
+  {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "hello"
+  #C3 = <dynamic>[#C1, #C2]
+  #C4 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C3}
+  #C5 = "world"
+  #C6 = <dynamic>[#C2, #C5]
+  #C7 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C6}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect
index 57c74f5..b7b89c2 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.legacy.transformed.expect
@@ -2,47 +2,51 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <dynamic, dynamic>{1: "hello"}, core::Map<core::int, core::String> m2 = const <dynamic, dynamic>{"hello": "world"}]) → void {}
+static method foo([core::Map<core::int*, core::String*>* m1 = #C4, core::Map<core::int*, core::String*>* m2 = #C7]) → void {}
 static method test() → void {
   {
-    core::Map<core::int, core::String> l0 = <dynamic, dynamic>{};
-    core::Map<core::int, core::String> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<core::int, core::String> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<core::int, core::String> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<core::int*, core::String*>* l0 = <dynamic, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<core::int*, core::String*>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<core::int*, core::String*>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    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, 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, dynamic>{};
-    core::Map<dynamic, core::String> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<dynamic, core::String> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<dynamic, core::String> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<dynamic, core::String> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<dynamic, core::String*>* l0 = <dynamic, dynamic>{};
+    core::Map<dynamic, core::String*>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<dynamic, core::String*>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<dynamic, core::String*>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<dynamic, core::String*>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    core::Map<core::int, dynamic> l0 = <dynamic, dynamic>{};
-    core::Map<core::int, dynamic> l1 = <dynamic, dynamic>{3: "hello"};
-    core::Map<core::int, dynamic> l2 = <dynamic, dynamic>{"hello": "hello"};
-    core::Map<core::int, dynamic> l3 = <dynamic, dynamic>{3: 3};
-    core::Map<core::int, dynamic> l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
+    core::Map<core::int*, dynamic>* l0 = <dynamic, dynamic>{};
+    core::Map<core::int*, dynamic>* l1 = <dynamic, dynamic>{3: "hello"};
+    core::Map<core::int*, dynamic>* l2 = <dynamic, dynamic>{"hello": "hello"};
+    core::Map<core::int*, dynamic>* l3 = <dynamic, dynamic>{3: 3};
+    core::Map<core::int*, dynamic>* l4 = <dynamic, dynamic>{3: "hello", "hello": 3};
   }
   {
-    core::Map<core::int, core::String> l0 = <core::num, dynamic>{};
-    core::Map<core::int, core::String> l1 = <core::num, dynamic>{3: "hello"};
-    core::Map<core::int, core::String> l3 = <core::num, dynamic>{3: 3};
+    core::Map<core::int*, core::String*>* l0 = <core::num*, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = <core::num*, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l3 = <core::num*, dynamic>{3: 3};
   }
-  {
-    const core::Map<core::int, core::String> l0 = const <dynamic, dynamic>{};
-    const core::Map<core::int, core::String> l1 = const <dynamic, dynamic>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <dynamic, dynamic>{"hello": "hello"};
-    const core::Map<core::int, core::String> l3 = const <dynamic, dynamic>{3: 3};
-    const core::Map<core::int, core::String> l4 = const <dynamic, dynamic>{3: "hello", "hello": 3};
-  }
+  {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "hello"
+  #C3 = <dynamic>[#C1, #C2]
+  #C4 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C3}
+  #C5 = "world"
+  #C6 = <dynamic>[#C2, #C5]
+  #C7 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C6}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
index de242ae..a4d1d04 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.expect
@@ -88,98 +88,100 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = 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'.
+static method foo([core::Map<core::int*, core::String*>* m1 = #C4, 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: "world"}]) → void {}
+                                                                              ^"]) → 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>{let final<BottomType> #t2 = 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'.
+    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*>{let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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: let final<BottomType> #t3 = 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'.
+                                            ^" in "hello" as{TypeError} core::int*: "hello"};
+    core::Map<core::int*, core::String*>* l3 = <core::int*, core::String*>{3: let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t4 = 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'.
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<core::int*, core::String*>* l4 = <core::int*, core::String*>{3: "hello", let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = 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'.
+                                            ^" in "hello" as{TypeError} core::int*: let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                  ^" in 3 as{TypeError} core::String};
+                                                  ^" 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, 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: let final<BottomType> #t6 = 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'.
+    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: let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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": let final<BottomType> #t7 = 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'.
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<dynamic, core::String*>* l4 = <dynamic, core::String*>{3: "hello", "hello": let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                       ^" in 3 as{TypeError} core::String};
+                                                       ^" 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>{let final<BottomType> #t8 = 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'.
+    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>{let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t9 = 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'.
+                                            ^" 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", let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
-                                            ^" in "hello" as{TypeError} core::int: 3};
+                                            ^" in "hello" as{TypeError} core::int*: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = 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>'.
+    core::Map<core::int*, core::String*>* l0 = let final<BottomType> #t9 = 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 = let final<BottomType> #t11 = 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>'.
+                                                                           ^" in <core::num*, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = let final<BottomType> #t10 = 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 = let final<BottomType> #t12 = 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>'.
+                                                                           ^" in <core::num*, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l3 = let final<BottomType> #t11 = 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};
+                                                                           ^" in <core::num*, dynamic>{3: 3};
   }
   {
-    const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
-    const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = 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'.
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = 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'.
+                                                                              ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                                                     ^" in 3 as{TypeError} core::String};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = 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'.
+                                                                                     ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                                                      ^" in 3 as{TypeError} core::String};
+                                                                              ^";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "hello"
+  #C3 = <dynamic>[#C1, #C2]
+  #C4 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
index de242ae..a4d1d04 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_on_map_literals.dart.strong.transformed.expect
@@ -88,98 +88,100 @@
 import self as self;
 import "dart:core" as core;
 
-static method foo([core::Map<core::int, core::String> m1 = const <core::int, core::String>{1: "hello"}, core::Map<core::int, core::String> m2 = const <core::int, core::String>{let final<BottomType> #t1 = 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'.
+static method foo([core::Map<core::int*, core::String*>* m1 = #C4, 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: "world"}]) → void {}
+                                                                              ^"]) → 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>{let final<BottomType> #t2 = 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'.
+    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*>{let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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: let final<BottomType> #t3 = 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'.
+                                            ^" in "hello" as{TypeError} core::int*: "hello"};
+    core::Map<core::int*, core::String*>* l3 = <core::int*, core::String*>{3: let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t4 = 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'.
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<core::int*, core::String*>* l4 = <core::int*, core::String*>{3: "hello", let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                            ^" in "hello" as{TypeError} core::int: let final<BottomType> #t5 = 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'.
+                                            ^" in "hello" as{TypeError} core::int*: let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
           /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                  ^" in 3 as{TypeError} core::String};
+                                                  ^" 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, 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: let final<BottomType> #t6 = 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'.
+    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: let final<BottomType> #t5 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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": let final<BottomType> #t7 = 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'.
+                                                 ^" in 3 as{TypeError} core::String*};
+    core::Map<dynamic, core::String*>* l4 = <dynamic, core::String*>{3: "hello", "hello": let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       \"hello\": /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                       ^" in 3 as{TypeError} core::String};
+                                                       ^" 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>{let final<BottomType> #t8 = 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'.
+    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>{let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to '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", let final<BottomType> #t9 = 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'.
+                                            ^" 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", let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\": 3
-                                            ^" in "hello" as{TypeError} core::int: 3};
+                                            ^" in "hello" as{TypeError} core::int*: 3};
   }
   {
-    core::Map<core::int, core::String> l0 = let final<BottomType> #t10 = 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>'.
+    core::Map<core::int*, core::String*>* l0 = let final<BottomType> #t9 = 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 = let final<BottomType> #t11 = 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>'.
+                                                                           ^" in <core::num*, dynamic>{};
+    core::Map<core::int*, core::String*>* l1 = let final<BottomType> #t10 = 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 = let final<BottomType> #t12 = 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>'.
+                                                                           ^" in <core::num*, dynamic>{3: "hello"};
+    core::Map<core::int*, core::String*>* l3 = let final<BottomType> #t11 = 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};
+                                                                           ^" in <core::num*, dynamic>{3: 3};
   }
   {
-    const core::Map<core::int, core::String> l0 = const <core::int, core::String>{};
-    const core::Map<core::int, core::String> l1 = const <core::int, core::String>{3: "hello"};
-    const core::Map<core::int, core::String> l2 = const <core::int, core::String>{let final<BottomType> #t13 = 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'.
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: "hello"};
-    const core::Map<core::int, core::String> l3 = const <core::int, core::String>{3: let final<BottomType> #t14 = 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'.
+                                                                              ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
       3: /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                                                     ^" in 3 as{TypeError} core::String};
-    const core::Map<core::int, core::String> l4 = const <core::int, core::String>{3: "hello", let final<BottomType> #t15 = 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'.
+                                                                                     ^";
+    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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:MAP_KEY_TYPE_NOT_ASSIGNABLE,error:MAP_KEY_TYPE_NOT_ASSIGNABLE*/ \"hello\":
-                                                                              ^" in "hello" as{TypeError} core::int: let final<BottomType> #t16 = invalid-expression "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'.
-Try changing the type of the left hand side, or casting the right hand side to 'String'.
-          /*error:MAP_VALUE_TYPE_NOT_ASSIGNABLE,error:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/ 3
-                                                                                      ^" in 3 as{TypeError} core::String};
+                                                                              ^";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = "hello"
+  #C3 = <dynamic>[#C1, #C2]
+  #C4 = core::_ImmutableMap<core::int*, core::String*> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
index aafc9ff..aaa7e1c 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart
@@ -12,17 +12,17 @@
 }
 
 Stream<List<int>> foo() async* {
-  yield new /*@typeArgs=int*/ List();
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-  yield* new /*@typeArgs=List<int>*/ MyStream();
+  yield new /*@ typeArgs=int* */ List();
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+  yield* new /*@ typeArgs=List<int*>* */ MyStream();
 }
 
 Iterable<Map<int, int>> bar() sync* {
-  yield new /*@typeArgs=int, int*/ Map();
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
-  yield* new /*@typeArgs=Map<int, int>*/ List();
+  yield new /*@ typeArgs=int*, int* */ Map();
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
+  yield* new /*@ typeArgs=Map<int*, int*>* */ List();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect
index af2285b..856a4a8 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.expect
@@ -5,17 +5,17 @@
 
 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>
+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;
 }
-static method foo() → asy::Stream<core::List<core::int>> async* {
+static method foo() → asy::Stream<core::List<core::int*>*>* async* {
   yield core::List::•<dynamic>();
   yield self::MyStream::•<dynamic>();
   yield* core::List::•<dynamic>();
   yield* self::MyStream::•<dynamic>();
 }
-static method bar() → core::Iterable<core::Map<core::int, core::int>> sync* {
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* sync* {
   yield core::Map::•<dynamic, dynamic>();
   yield core::List::•<dynamic>();
   yield* core::Map::•<dynamic, dynamic>();
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect
index 25939a6..53dc234 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.legacy.transformed.expect
@@ -5,12 +5,12 @@
 
 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>
+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;
 }
-static method foo() → asy::Stream<core::List<core::int>> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::List<core::int>> :controller;
+static method foo() → asy::Stream<core::List<core::int*>*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::List<core::int*>*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -52,14 +52,14 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int>>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int*>*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
-static method bar() → core::Iterable<core::Map<core::int, core::int>> /* originally sync* */ {
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::Map<core::int, core::int>> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<core::Map<core::int*, core::int*>*>* :iterator) → core::bool* yielding {
     {
       {
         :iterator.{core::_SyncIterator::_current} = core::Map::•<dynamic, dynamic>();
@@ -80,6 +80,6 @@
     }
     return false;
   }
-  return new core::_SyncIterable::•<core::Map<core::int, core::int>>(:sync_op);
+  return new core::_SyncIterable::•<core::Map<core::int*, core::int*>*>(:sync_op);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
index 001564a..b3a5d51 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.expect
@@ -2,33 +2,33 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
-//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-//                                                                   ^
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-//                                                                    ^
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
-//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-//                                                                   ^
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
-//                                                                             ^
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
+//                                                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -36,40 +36,40 @@
 
 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>
+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;
 }
-static method foo() → asy::Stream<core::List<core::int>> async* {
-  yield core::List::•<core::int>();
-  yield let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+static method foo() → asy::Stream<core::List<core::int*>*>* async* {
+  yield core::List::•<core::int*>();
+  yield let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-                                                                  ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int>;
-  yield* let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+                                                                    ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int*>*;
+  yield* let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-                                                                   ^" in core::List::•<dynamic>() as{TypeError} asy::Stream<core::List<core::int>>;
-  yield* self::MyStream::•<core::List<core::int>>();
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+                                                                     ^" in core::List::•<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 let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* sync* {
+  yield core::Map::•<core::int*, core::int*>();
+  yield let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-                                                                  ^" in core::List::•<dynamic>() as{TypeError} core::Map<core::int, core::int>;
-  yield* let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+                                                                    ^" in core::List::•<dynamic>() as{TypeError} core::Map<core::int*, core::int*>*;
+  yield* let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
-  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::List::•<core::Map<core::int, core::int>>();
+  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::List::•<core::Map<core::int*, core::int*>*>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
index c318392..295f142 100644
--- a/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart.strong.transformed.expect
@@ -2,33 +2,33 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
-//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-//                                                                   ^
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-//                                                                    ^
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+//                                                                      ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
-//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-//                                                                   ^
+//   yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+//                                                                     ^
 //
-// pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
-//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic, dynamic*/ Map();
-//                                                                             ^
+//   yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic, dynamic */ Map();
+//                                                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -36,12 +36,12 @@
 
 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>
+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;
 }
-static method foo() → asy::Stream<core::List<core::int>> /* originally async* */ {
-  asy::_AsyncStarStreamController<core::List<core::int>> :controller;
+static method foo() → asy::Stream<core::List<core::int*>*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<core::List<core::int*>*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -55,29 +55,29 @@
       try {
         #L1:
         {
-          if(:controller.{asy::_AsyncStarStreamController::add}(core::_GrowableList::•<core::int>(0)))
+          if(:controller.{asy::_AsyncStarStreamController::add}(core::_GrowableList::•<core::int*>(0)))
             return null;
           else
             [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:16:67: Error: A value of type 'MyStream<dynamic>' can't be assigned to a variable of type 'List<int>'.
+          if(:controller.{asy::_AsyncStarStreamController::add}(let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'List<int>'.
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ MyStream();
-                                                                  ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int>))
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ MyStream();
+                                                                    ^" in self::MyStream::•<dynamic>() as{TypeError} core::List<core::int*>*))
             return null;
           else
             [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:68: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Stream<List<int>>'.
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:17:70: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Stream<List<int>>'.
-  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-                                                                   ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} asy::Stream<core::List<core::int>>))
+  yield* /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+                                                                     ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} asy::Stream<core::List<core::int*>*>*))
             return null;
           else
             [yield] null;
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::MyStream::•<core::List<core::int>>()))
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(self::MyStream::•<core::List<core::int*>*>()))
             return null;
           else
             [yield] null;
@@ -93,44 +93,44 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int>>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<core::List<core::int*>*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
-static method bar() → core::Iterable<core::Map<core::int, core::int>> /* originally sync* */ {
+static method bar() → core::Iterable<core::Map<core::int*, core::int*>*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<core::Map<core::int, core::int>> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<core::Map<core::int*, core::int*>*>* :iterator) → core::bool* yielding {
     {
       {
-        :iterator.{core::_SyncIterator::_current} = core::Map::•<core::int, core::int>();
+        :iterator.{core::_SyncIterator::_current} = core::Map::•<core::int*, core::int*>();
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_current} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:67: Error: A value of type 'List<dynamic>' can't be assigned to a variable of type 'Map<int, int>'.
+        :iterator.{core::_SyncIterator::_current} = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:23:69: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Map<int, int>'.
-  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@typeArgs=dynamic*/ List();
-                                                                  ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} core::Map<core::int, core::int>;
+  yield /*error:YIELD_OF_INVALID_TYPE*/ new /*@ typeArgs=dynamic */ List();
+                                                                    ^" in core::_GrowableList::•<dynamic>(0) as{TypeError} core::Map<core::int*, core::int*>*;
         [yield] true;
       }
       {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/downwards_inference_yield_yield_star.dart:24:77: Error: A value of type 'Map<dynamic, dynamic>' can't be assigned to a variable of type 'Iterable<Map<int, int>>'.
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Iterable<Map<int, int>>'.
-  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* /*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] true;
       }
       {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<core::Map<core::int, core::int>>(0);
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = core::_GrowableList::•<core::Map<core::int*, core::int*>*>(0);
         [yield] true;
       }
     }
     return false;
   }
-  return new core::_SyncIterable::•<core::Map<core::int, core::int>>(:sync_op);
+  return new core::_SyncIterable::•<core::Map<core::int*, core::int*>*>(:sync_op);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart b/pkg/front_end/testcases/inference/dynamic_methods.dart
index 509a8f3..4f338f1 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart
@@ -11,25 +11,25 @@
 
 test() {
   dynamic d = new Foo();
-  var /*@type=int*/ get_hashCode = d. /*@target=Object::hashCode*/ hashCode;
-  var /*@type=dynamic*/ call_hashCode =
+  var /*@ type=int* */ get_hashCode = d. /*@target=Object::hashCode*/ hashCode;
+  var /*@ type=dynamic */ call_hashCode =
       d. /*@target=Object::hashCode*/ hashCode();
-  var /*@type=String*/ call_toString =
+  var /*@ type=String* */ call_toString =
       d. /*@target=Object::toString*/ toString();
-  var /*@type=dynamic*/ call_toStringArg = d.toString(color: "pink");
-  var /*@type=dynamic*/ call_foo0 = d.foo();
-  var /*@type=dynamic*/ call_foo1 = d.foo(1);
-  var /*@type=dynamic*/ call_foo2 = d.foo(1, 2);
-  var /*@type=dynamic*/ call_nsm0 = d.noSuchMethod();
-  var /*@type=dynamic*/ call_nsm1 =
+  var /*@ type=dynamic */ call_toStringArg = d.toString(color: "pink");
+  var /*@ type=dynamic */ call_foo0 = d.foo();
+  var /*@ type=dynamic */ call_foo1 = d.foo(1);
+  var /*@ type=dynamic */ call_foo2 = d.foo(1, 2);
+  var /*@ type=dynamic */ call_nsm0 = d.noSuchMethod();
+  var /*@ type=dynamic */ call_nsm1 =
       d. /*@target=Object::noSuchMethod*/ noSuchMethod(null);
-  var /*@type=dynamic*/ call_nsm2 = d.noSuchMethod(null, null);
-  var /*@type=bool*/ equals_self = d /*@target=Object::==*/ == d;
-  var /*@type=bool*/ equals_null = d /*@target=Object::==*/ == null;
-  var /*@type=bool*/ null_equals = null /*@target=Object::==*/ == d;
-  var /*@type=bool*/ not_equals_self = d /*@target=Object::==*/ != d;
-  var /*@type=bool*/ not_equals_null = d /*@target=Object::==*/ != null;
-  var /*@type=bool*/ null_not_equals = null /*@target=Object::==*/ != d;
+  var /*@ type=dynamic */ call_nsm2 = d.noSuchMethod(null, null);
+  var /*@ type=bool* */ equals_self = d /*@target=Object::==*/ == d;
+  var /*@ type=bool* */ equals_null = d /*@target=Object::==*/ == null;
+  var /*@ type=bool* */ null_equals = null /*@target=Object::==*/ == d;
+  var /*@ type=bool* */ not_equals_self = d /*@target=Object::==*/ != d;
+  var /*@ type=bool* */ not_equals_null = d /*@target=Object::==*/ != null;
+  var /*@ type=bool* */ null_not_equals = null /*@target=Object::==*/ != d;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect
index 9a43ee8..3b06ed5 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method foo(core::int x) → core::int
+  method foo(core::int* x) → core::int*
     return x;
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect
index 9a43ee8..3b06ed5 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method foo(core::int x) → core::int
+  method foo(core::int* x) → core::int*
     return x;
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect
index 98fb899..9e3bbc2 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.outline.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
-  method foo(core::int x) → core::int
+  method foo(core::int* x) → core::int*
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
index 3b2679a..d2367f2 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.expect
@@ -10,19 +10,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method foo(core::int x) → core::int
+  method foo(core::int* x) → core::int*
     return x;
 }
 static method test() → dynamic {
   dynamic d = new self::Foo::•();
-  core::int get_hashCode = d.{core::Object::hashCode};
+  core::int* get_hashCode = d.{core::Object::hashCode};
   dynamic call_hashCode = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
       d. /*@target=Object::hashCode*/ hashCode();
                                       ^" in d.{core::Object::hashCode}();
-  core::String call_toString = d.{core::Object::toString}();
+  core::String* call_toString = d.{core::Object::toString}();
   dynamic call_toStringArg = d.toString(color: "pink");
   dynamic call_foo0 = d.foo();
   dynamic call_foo1 = d.foo(1);
@@ -30,11 +30,11 @@
   dynamic call_nsm0 = d.noSuchMethod();
   dynamic call_nsm1 = d.{core::Object::noSuchMethod}(null);
   dynamic call_nsm2 = d.noSuchMethod(null, null);
-  core::bool equals_self = d.{core::Object::==}(d);
-  core::bool equals_null = d.{core::Object::==}(null);
-  core::bool null_equals = null.{core::Object::==}(d);
-  core::bool not_equals_self = !d.{core::Object::==}(d);
-  core::bool not_equals_null = !d.{core::Object::==}(null);
-  core::bool null_not_equals = !null.{core::Object::==}(d);
+  core::bool* equals_self = d.{core::Object::==}(d);
+  core::bool* equals_null = d.{core::Object::==}(null);
+  core::bool* null_equals = null.{core::Object::==}(d);
+  core::bool* not_equals_self = !d.{core::Object::==}(d);
+  core::bool* not_equals_null = !d.{core::Object::==}(null);
+  core::bool* null_not_equals = !null.{core::Object::==}(d);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
index 3b2679a..d2367f2 100644
--- a/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/dynamic_methods.dart.strong.transformed.expect
@@ -10,19 +10,19 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method foo(core::int x) → core::int
+  method foo(core::int* x) → core::int*
     return x;
 }
 static method test() → dynamic {
   dynamic d = new self::Foo::•();
-  core::int get_hashCode = d.{core::Object::hashCode};
+  core::int* get_hashCode = d.{core::Object::hashCode};
   dynamic call_hashCode = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/dynamic_methods.dart:16:39: Error: 'hashCode' isn't a function or method and can't be invoked.
       d. /*@target=Object::hashCode*/ hashCode();
                                       ^" in d.{core::Object::hashCode}();
-  core::String call_toString = d.{core::Object::toString}();
+  core::String* call_toString = d.{core::Object::toString}();
   dynamic call_toStringArg = d.toString(color: "pink");
   dynamic call_foo0 = d.foo();
   dynamic call_foo1 = d.foo(1);
@@ -30,11 +30,11 @@
   dynamic call_nsm0 = d.noSuchMethod();
   dynamic call_nsm1 = d.{core::Object::noSuchMethod}(null);
   dynamic call_nsm2 = d.noSuchMethod(null, null);
-  core::bool equals_self = d.{core::Object::==}(d);
-  core::bool equals_null = d.{core::Object::==}(null);
-  core::bool null_equals = null.{core::Object::==}(d);
-  core::bool not_equals_self = !d.{core::Object::==}(d);
-  core::bool not_equals_null = !d.{core::Object::==}(null);
-  core::bool null_not_equals = !null.{core::Object::==}(d);
+  core::bool* equals_self = d.{core::Object::==}(d);
+  core::bool* equals_null = d.{core::Object::==}(null);
+  core::bool* null_equals = null.{core::Object::==}(d);
+  core::bool* not_equals_self = !d.{core::Object::==}(d);
+  core::bool* not_equals_null = !d.{core::Object::==}(null);
+  core::bool* null_not_equals = !null.{core::Object::==}(d);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart
index 8306cc0..f37a321 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart
@@ -9,7 +9,7 @@
 
 class C {
   final int x;
-  C() : x = /*@typeArgs=int*/ f();
+  C() : x = /*@ typeArgs=int* */ f();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect
index d0d0305..53ec0f9 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_explicit.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.transformed.expect
index d0d0305..53ec0f9 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_explicit.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
index cd397c0..1af2f47 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
index f6900f6..c6e5c99 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.expect
@@ -3,11 +3,11 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_explicit.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
index f6900f6..c6e5c99 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_explicit.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart
index 328482d..bdfe90d 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart
@@ -9,7 +9,7 @@
 
 class C implements B {
   final x;
-  C() : x = /*@typeArgs=int*/ f();
+  C() : x = /*@ typeArgs=int* */ f();
 }
 
 abstract class B {
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect
index a97723a..8216fc3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object implements self::B {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.transformed.expect
index a97723a..8216fc3 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.legacy.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object implements self::B {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
index eda87a3..c093159 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.outline.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object implements self::B {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
index 7aed82a..f1fc0d6 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.expect
@@ -3,17 +3,17 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
index 7aed82a..f1fc0d6 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_implicit.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/field_initializer_context_this.dart
index 3f92e271..33737fe 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart
@@ -9,7 +9,7 @@
 
 class C {
   final int x;
-  C() : this.x = /*@typeArgs=int*/ f();
+  C() : this.x = /*@ typeArgs=int* */ f();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect
index d0d0305..53ec0f9 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.transformed.expect
index d0d0305..53ec0f9 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     : self::C::x = self::f<dynamic>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
index cd397c0..1af2f47 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x;
-  constructor •() → self::C
+  final field core::int* x;
+  constructor •() → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
index f6900f6..c6e5c99 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.expect
@@ -3,11 +3,11 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
index f6900f6..c6e5c99 100644
--- a/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_context_this.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 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::•()
+  final field core::int* x;
+  constructor •() → self::C*
+    : self::C::x = self::f<core::int*>(), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/field_initializer_parameter.dart
index f8779f9..85c103a 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart
@@ -9,7 +9,7 @@
 
 class C {
   final x;
-  C(int p) : x = /*@typeArgs=int*/ f(p);
+  C(int p) : x = /*@ typeArgs=int* */ f(p);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect
index c44f390..551d5b1 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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_initializer_parameter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.transformed.expect
index c44f390..551d5b1 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.legacy.transformed.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     : self::C::x = self::f<dynamic>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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_initializer_parameter.dart.outline.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
index 8afecf1..15e312c 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.outline.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(core::int p) → self::C
+  constructor •(core::int* p) → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+static method f<T extends core::Object* = dynamic>(self::f::T* t) → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
index ba559bd..3c7726b 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.expect
@@ -4,10 +4,10 @@
 
 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::•()
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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_initializer_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
index ba559bd..3c7726b 100644
--- a/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_initializer_parameter.dart.strong.transformed.expect
@@ -4,10 +4,10 @@
 
 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::•()
+  constructor •(core::int* p) → self::C*
+    : self::C::x = self::f<core::int*>(p), super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T t) → self::f::T
+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.legacy.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.expect
index fc3e684..1c9d26e 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x = self::C::_x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static get _x() → core::int
+  static get _x() → core::int*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect
index fc3e684..1c9d26e 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.legacy.transformed.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x = self::C::_x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static get _x() → core::int
+  static get _x() → core::int*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.expect
index 19b6413..5a5cd25 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x = self::C::_x;
-  synthetic constructor •() → self::C
+  final field core::int* x = self::C::_x;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static get _x() → core::int
+  static get _x() → core::int*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.transformed.expect
index 19b6413..5a5cd25 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_static_getter.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x = self::C::_x;
-  synthetic constructor •() → self::C
+  final field core::int* x = self::C::_x;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static get _x() → core::int
+  static get _x() → core::int*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect
index 2703900..218176a 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static get y() → core::int
+static get y() → core::int*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect
index 2703900..218176a 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.legacy.transformed.expect
@@ -4,10 +4,10 @@
 
 class C extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static get y() → core::int
+static get y() → core::int*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.expect
index c393636..d9f973a 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x = self::y;
-  synthetic constructor •() → self::C
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static get y() → core::int
+static get y() → core::int*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.transformed.expect
index c393636..d9f973a 100644
--- a/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/field_refers_to_top_level_getter.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  final field core::int x = self::y;
-  synthetic constructor •() → self::C
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static get y() → core::int
+static get y() → core::int*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect
index a06d112..d92b12b 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method test() → dynamic async {
-  core::Object o;
+  core::Object* o;
   for (dynamic x in o) {
   }
   await for (dynamic x in o) {
   }
-  core::int y;
+  core::int* y;
   for (final dynamic #t1 in o) {
     y = #t1;
   }
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect
index 70c1eb6..4eed1a2 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.legacy.transformed.expect
@@ -4,8 +4,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -19,18 +19,17 @@
     try {
       #L1:
       {
-        core::Object o;
+        core::Object* o;
         for (dynamic x in o) {
         }
         {
           dynamic :stream = o;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -45,19 +44,18 @@
               :result;
             }
         }
-        core::int y;
+        core::int* y;
         for (final dynamic #t4 in o) {
           y = #t4;
         }
         {
           dynamic :stream = o;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.expect
index 3e530e3..34a20de 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.expect
@@ -4,17 +4,17 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::Object o;
-  for (dynamic x in o as{TypeError} core::Iterable<dynamic>) {
+  core::Object* o;
+  for (dynamic x in o as{TypeError} core::Iterable<dynamic>*) {
   }
-  await for (dynamic x in o as{TypeError} asy::Stream<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} core::int;
+  core::int* y;
+  for (final dynamic #t1 in o as{TypeError} core::Iterable<dynamic>*) {
+    y = #t1 as{TypeError} core::int*;
   }
-  await for (final dynamic #t2 in o as{TypeError} asy::Stream<dynamic>) {
-    y = #t2 as{TypeError} core::int;
+  await for (final dynamic #t2 in o as{TypeError} asy::Stream<dynamic>*) {
+    y = #t2 as{TypeError} core::int*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
index 9572d11..fb79f44 100644
--- a/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_each_downcast_iterable.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -19,18 +19,17 @@
     try {
       #L1:
       {
-        core::Object o;
-        for (dynamic x in o as{TypeError} core::Iterable<dynamic>) {
+        core::Object* o;
+        for (dynamic x in o as{TypeError} core::Iterable<dynamic>*) {
         }
         {
-          dynamic :stream = o as{TypeError} asy::Stream<dynamic>;
+          dynamic :stream = o as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
@@ -45,24 +44,23 @@
               :result;
             }
         }
-        core::int y;
-        for (final dynamic #t4 in o as{TypeError} core::Iterable<dynamic>) {
-          y = #t4 as{TypeError} core::int;
+        core::int* y;
+        for (final dynamic #t4 in o as{TypeError} core::Iterable<dynamic>*) {
+          y = #t4 as{TypeError} core::int*;
         }
         {
-          dynamic :stream = o as{TypeError} asy::Stream<dynamic>;
+          dynamic :stream = o as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  y = #t7 as{TypeError} core::int;
+                  y = #t7 as{TypeError} core::int*;
                 }
               }
               else
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart
index cca98f3..35c94be 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart
@@ -6,9 +6,9 @@
 library test;
 
 void test(List<num> nums) {
-  for (var /*@type=num*/ x in nums) {
+  for (var /*@ type=num* */ x in nums) {
     if (x is int) {
-      var /*@type=int*/ y = /*@promotedType=int*/ x;
+      var /*@ type=int* */ y = /*@ promotedType=int* */ x;
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect
index 6633f20..31dd7f7 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::List<core::num> nums) → void {
+static method test(core::List<core::num*>* nums) → void {
   for (dynamic x in nums) {
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect
index 6633f20..31dd7f7 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::List<core::num> nums) → void {
+static method test(core::List<core::num*>* nums) → void {
   for (dynamic x in nums) {
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.outline.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.outline.expect
index 8cd558f..54271984 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::List<core::num> nums) → void
+static method test(core::List<core::num*>* nums) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.expect
index 807a04e..f98e42e 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.expect
@@ -2,10 +2,10 @@
 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 test(core::List<core::num*>* nums) → void {
+  for (core::num* x in nums) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
index 807a04e..f98e42e 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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 test(core::List<core::num*>* nums) → void {
+  for (core::num* x in nums) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
index b5fe65a..10398e9 100644
--- a/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/for_in_loop_promotion.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/for_in_loop_promotion.dart:10:11: Context: Possible promotion of x@315
+pkg/front_end/testcases/inference/for_in_loop_promotion.dart:10:11: Context: Possible promotion of x@318
     if (x is int) {
           ^^
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart
index f307ea1..ee2a836 100644
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart
@@ -9,7 +9,7 @@
   for (num x = 0;; x++) {
     if (x /*@target=num::>=*/ >= 10) break;
     if (x is int) {
-      var /*@type=int*/ y = /*@promotedType=int*/ x;
+      var /*@ type=int* */ y = /*@ promotedType=int* */ x;
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect
index bf17438..824d417 100644
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.expect
@@ -4,10 +4,10 @@
 
 static method test() → void {
   #L1:
-  for (core::num x = 0; ; x = x.+(1)) {
+  for (core::num* x = 0; ; x = x.+(1)) {
     if(x.>=(10))
       break #L1;
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect
index bf17438..824d417 100644
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.legacy.transformed.expect
@@ -4,10 +4,10 @@
 
 static method test() → void {
   #L1:
-  for (core::num x = 0; ; x = x.+(1)) {
+  for (core::num* x = 0; ; x = x.+(1)) {
     if(x.>=(10))
       break #L1;
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.expect
index ab19183..be5533f 100644
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.expect
@@ -4,11 +4,11 @@
 
 static method test() → void {
   #L1:
-  for (core::num x = 0; ; x = x.{core::num::+}(1)) {
+  for (core::num* x = 0; ; x = x.{core::num::+}(1)) {
     if(x.{core::num::>=}(10))
       break #L1;
-    if(x is core::int) {
-      core::int y = x{core::int};
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.transformed.expect
index ab19183..be5533f 100644
--- a/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_empty_condition.dart.strong.transformed.expect
@@ -4,11 +4,11 @@
 
 static method test() → void {
   #L1:
-  for (core::num x = 0; ; x = x.{core::num::+}(1)) {
+  for (core::num* x = 0; ; x = x.{core::num::+}(1)) {
     if(x.{core::num::>=}(10))
       break #L1;
-    if(x is core::int) {
-      core::int y = x{core::int};
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart
index f19f250..4aa9f97 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart
@@ -9,7 +9,7 @@
   num x;
   for (x = 0; x /*@target=num::<*/ < 10; x++) {
     if (x is int) {
-      var /*@type=int*/ y = /*@promotedType=int*/ x;
+      var /*@ type=int* */ y = /*@ promotedType=int* */ x;
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect
index 3b7e21a..19ce572 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::num x;
+  core::num* x;
   for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect
index 3b7e21a..19ce572 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.legacy.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::num x;
+  core::num* x;
   for (final dynamic #t1 = x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
index 0c93fcd..e03cca6 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::num x;
-  for (final core::int #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
-    if(x is core::int) {
-      core::int y = x{core::int};
+  core::num* x;
+  for (final core::int* #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
index 0c93fcd..e03cca6 100644
--- a/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_initializer_expression.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::num x;
-  for (final core::int #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
-    if(x is core::int) {
-      core::int y = x{core::int};
+  core::num* x;
+  for (final core::int* #t1 = x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart b/pkg/front_end/testcases/inference/for_loop_promotion.dart
index 47b2e27..3aa1cd8 100644
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart
@@ -8,7 +8,7 @@
 void test() {
   for (num x = 0; x /*@target=num::<*/ < 10; x++) {
     if (x is int) {
-      var /*@type=int*/ y = /*@promotedType=int*/ x;
+      var /*@ type=int* */ y = /*@ promotedType=int* */ x;
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect
index 7f01ee0..7e23266 100644
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test() → void {
-  for (core::num x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
+  for (core::num* x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect
index 7f01ee0..7e23266 100644
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test() → void {
-  for (core::num x = 0; x.<(10); x = x.+(1)) {
-    if(x is core::int) {
+  for (core::num* x = 0; x.<(10); x = x.+(1)) {
+    if(x is core::int*) {
       dynamic y = x;
     }
   }
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.expect
index e62a156..de8249b 100644
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method test() → void {
-  for (core::num x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
-    if(x is core::int) {
-      core::int y = x{core::int};
+  for (core::num* x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.transformed.expect
index e62a156..de8249b 100644
--- a/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/for_loop_promotion.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method test() → void {
-  for (core::num x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
-    if(x is core::int) {
-      core::int y = x{core::int};
+  for (core::num* x = 0; x.{core::num::<}(10); x = x.{core::num::+}(1)) {
+    if(x is core::int*) {
+      core::int* y = x{core::int*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart b/pkg/front_end/testcases/inference/future_or_subtyping.dart
index 78752a1..b177e5e 100644
--- a/pkg/front_end/testcases/inference/future_or_subtyping.dart
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart
@@ -11,10 +11,10 @@
 add2(int y) {}
 test() {
   Future<int> f;
-  var /*@type=Future<void>*/ a =
-      f. /*@typeArgs=void*/ /*@target=Future::then*/ then(add);
-  var /*@type=Future<dynamic>*/ b =
-      f. /*@typeArgs=dynamic*/ /*@target=Future::then*/ then(add2);
+  var /*@ type=Future<void>* */ a =
+      f. /*@ typeArgs=void */ /*@target=Future::then*/ then(add);
+  var /*@ type=Future<dynamic>* */ b =
+      f. /*@ typeArgs=dynamic */ /*@target=Future::then*/ then(add2);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect
index 6af7018..e75c697 100644
--- a/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.expect
@@ -5,11 +5,16 @@
 
 import "dart:async";
 
-static method add(core::int x) → void {}
-static method add2(core::int y) → dynamic {}
+static method add(core::int* x) → void {}
+static method add2(core::int* y) → dynamic {}
 static method test() → dynamic {
-  asy::Future<core::int> f;
-  dynamic a = f.then(self::add);
-  dynamic b = f.then(self::add2);
+  asy::Future<core::int*>* f;
+  dynamic a = f.then(#C1);
+  dynamic b = f.then(#C2);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::add
+  #C2 = tearoff self::add2
+}
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect
index 6af7018..e75c697 100644
--- a/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.legacy.transformed.expect
@@ -5,11 +5,16 @@
 
 import "dart:async";
 
-static method add(core::int x) → void {}
-static method add2(core::int y) → dynamic {}
+static method add(core::int* x) → void {}
+static method add2(core::int* y) → dynamic {}
 static method test() → dynamic {
-  asy::Future<core::int> f;
-  dynamic a = f.then(self::add);
-  dynamic b = f.then(self::add2);
+  asy::Future<core::int*>* f;
+  dynamic a = f.then(#C1);
+  dynamic b = f.then(#C2);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::add
+  #C2 = tearoff self::add2
+}
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.expect
index 0f5a59a..17f4b19 100644
--- a/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.expect
@@ -5,11 +5,16 @@
 
 import "dart:async";
 
-static method add(core::int x) → void {}
-static method add2(core::int y) → dynamic {}
+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>(self::add);
-  asy::Future<dynamic> b = f.{asy::Future::then}<dynamic>(self::add2);
+  asy::Future<core::int*>* f;
+  asy::Future<void>* a = f.{asy::Future::then}<void>(#C1);
+  asy::Future<dynamic>* b = f.{asy::Future::then}<dynamic>(#C2);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::add
+  #C2 = tearoff self::add2
+}
diff --git a/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.transformed.expect
index 0f5a59a..17f4b19 100644
--- a/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_or_subtyping.dart.strong.transformed.expect
@@ -5,11 +5,16 @@
 
 import "dart:async";
 
-static method add(core::int x) → void {}
-static method add2(core::int y) → dynamic {}
+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>(self::add);
-  asy::Future<dynamic> b = f.{asy::Future::then}<dynamic>(self::add2);
+  asy::Future<core::int*>* f;
+  asy::Future<void>* a = f.{asy::Future::then}<void>(#C1);
+  asy::Future<dynamic>* b = f.{asy::Future::then}<dynamic>(#C2);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::add
+  #C2 = tearoff self::add2
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart b/pkg/front_end/testcases/inference/future_then.dart
index ec52859..67e1333 100644
--- a/pkg/front_end/testcases/inference/future_then.dart
+++ b/pkg/front_end/testcases/inference/future_then.dart
@@ -16,31 +16,31 @@
 
 void test() {
   MyFuture f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new Future<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new Future<int>.value(3);
   });
-  Future<int> t3 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  Future<int> t4 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t3 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  Future<int> t4 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) =>
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) =>
           new Future<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) {
     return new Future<int>.value(3);
   });
-  Future<int> t7 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t7 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new Future<int>.value(3));
-  Future<int> t8 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t8 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then.dart.legacy.expect
index 7126780..86579bc 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await asy::Future::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await asy::Future::value<core::int>(3);
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
index 0e46318..49572da 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.outline.expect b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
index 96beacd..65247cd 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
index 3fb8754..f53682d 100644
--- a/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart b/pkg/front_end/testcases/inference/future_then_2.dart
index 7dd9d8f..d500909 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_2.dart
@@ -16,31 +16,31 @@
 
 void test() {
   MyFuture f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new MyFuture<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new MyFuture<int>.value(3);
   });
-  Future<int> t3 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  Future<int> t4 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t3 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  Future<int> t4 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) =>
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) =>
           new MyFuture<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) {
     return new MyFuture<int>.value(3);
   });
-  Future<int> t7 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t7 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new MyFuture<int>.value(3));
-  Future<int> t8 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t8 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect
index c555879..555c176 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await new self::MyFuture::value<core::int>(3);
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
index 63c4c5c..2e6d4a4 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
index 15aa74b..ae490fd762 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => new self::MyFuture::value<core::int>(3));
-  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);
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3));
+  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);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
index 091e194..b43b873 100644
--- a/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_2.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart b/pkg/front_end/testcases/inference/future_then_3.dart
index 59ef995..b3d62b9 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_3.dart
@@ -16,31 +16,31 @@
 
 void test() {
   MyFuture f;
-  MyFuture<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  MyFuture<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new Future<int>.value(3));
-  MyFuture<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new Future<int>.value(3);
   });
-  MyFuture<int> t3 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  MyFuture<int> t4 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t3 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  MyFuture<int> t4 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  MyFuture<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) =>
+  MyFuture<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) =>
           new Future<int>.value(3));
-  MyFuture<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) {
+  MyFuture<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) {
     return new Future<int>.value(3);
   });
-  MyFuture<int> t7 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  MyFuture<int> t7 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new Future<int>.value(3));
-  MyFuture<int> t8 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t8 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect
index 075602a..82e7d57 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await asy::Future::value<core::int>(3);
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  self::MyFuture<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  self::MyFuture<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
index 895ce5a..ea29ab5 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
index 5895ddd..680db32 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
index 5fcbec7..60990e7 100644
--- a/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_3.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart b/pkg/front_end/testcases/inference/future_then_4.dart
index 81923b7..9670dc5 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart
+++ b/pkg/front_end/testcases/inference/future_then_4.dart
@@ -16,31 +16,31 @@
 
 void test() {
   MyFuture f;
-  MyFuture<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  MyFuture<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new MyFuture<int>.value(3));
-  MyFuture<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new MyFuture<int>.value(3);
   });
-  MyFuture<int> t3 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  MyFuture<int> t4 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t3 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  MyFuture<int> t4 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  MyFuture<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) =>
+  MyFuture<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) =>
           new MyFuture<int>.value(3));
-  MyFuture<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) {
+  MyFuture<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) {
     return new MyFuture<int>.value(3);
   });
-  MyFuture<int> t7 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  MyFuture<int> t7 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new MyFuture<int>.value(3));
-  MyFuture<int> t8 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  MyFuture<int> t8 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect
index 8a393fd..d804808 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await new self::MyFuture::value<core::int>(3);
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  self::MyFuture<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  self::MyFuture<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
index 98c8918..924c3f0f 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<dynamic> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
index 0f07ba1..0bfc7d0 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> async => new self::MyFuture::value<core::int>(3));
-  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);
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3));
+  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);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
index caa8542..8125700 100644
--- a/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_4.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<dynamic>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t3 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t3 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t4 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t4 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t7 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t7 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t8 = f.{self::MyFuture::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t8 = f.{self::MyFuture::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart b/pkg/front_end/testcases/inference/future_then_5.dart
index fbbcd00..f32247b 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart
+++ b/pkg/front_end/testcases/inference/future_then_5.dart
@@ -16,31 +16,31 @@
 
 void test() {
   Future f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new MyFuture<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new MyFuture<int>.value(3);
   });
-  Future<int> t3 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  Future<int> t4 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t3 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  Future<int> t4 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) =>
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) =>
           new MyFuture<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) {
     return new MyFuture<int>.value(3);
   });
-  Future<int> t7 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t7 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new MyFuture<int>.value(3));
-  Future<int> t8 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t8 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect
index 58d742b..b1fed9c 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await new self::MyFuture::value<core::int>(3);
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
index 5d553da..afe5c9d 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
index a09ade0..0fc40e9 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async => new self::MyFuture::value<core::int>(3));
-  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);
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => new self::MyFuture::value<core::int*>(3));
+  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);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
index 5c16f21..6e1684b 100644
--- a/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_5.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> => new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → self::MyFuture<core::int> {
-    return new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* => new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → self::MyFuture<core::int*>* {
+    return new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = new self::MyFuture::value<core::int>(3);
+          :return_value = new self::MyFuture::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart b/pkg/front_end/testcases/inference/future_then_6.dart
index 6731ae3..b790f4d 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart
+++ b/pkg/front_end/testcases/inference/future_then_6.dart
@@ -16,31 +16,31 @@
 
 void test() {
   Future f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           await new Future<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return await new Future<int>.value(3);
   });
-  Future<int> t3 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async => 3);
-  Future<int> t4 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t3 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async => 3);
+  Future<int> t4 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return 3;
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) =>
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) =>
           new Future<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) {
     return new Future<int>.value(3);
   });
-  Future<int> t7 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async =>
+  Future<int> t7 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async =>
           new Future<int>.value(3));
-  Future<int> t8 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) async {
+  Future<int> t8 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) async {
     return new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect
index 0cc6848..ee3027e 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> async => await asy::Future::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return await asy::Future::value<core::int>(3);
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* async => await asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return await asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> async => 3);
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> async {
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* async => 3);
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> async => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> async {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* async => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
index 6d284e6..bb51005 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<dynamic> f;
-  asy::Future<core::int> t1 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t3 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t4 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic _) → dynamic {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic _) → dynamic => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic _) → dynamic {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t7 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.then((dynamic _) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t8 = f.then((dynamic _) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
index fc6869c..e7dfa46 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.expect
@@ -5,41 +5,54 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  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);
+  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));
+  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);
   });
-  asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async => 3);
-  asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async {
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => 3);
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
     return 3;
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> async {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* async {
+    return asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
index 5025976..5a87ad0 100644
--- a/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_6.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<dynamic>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -38,7 +38,7 @@
       try {
         #L1:
         {
-          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L1;
         }
@@ -54,9 +54,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -67,7 +67,7 @@
       try {
         #L2:
         {
-          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+          [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
           :return_value = :result;
           break #L2;
         }
@@ -83,9 +83,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t3 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t3 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -110,9 +110,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t4 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t4 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -137,13 +137,13 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> => asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> {
-    return asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* => asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* {
+    return asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t7 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t7 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -153,7 +153,7 @@
       try {
         #L5:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L5;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -168,9 +168,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t8 = f.{asy::Future::then}<core::int>((dynamic _) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t8 = f.{asy::Future::then}<core::int*>((dynamic _) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -180,7 +180,7 @@
       try {
         #L6:
         {
-          :return_value = asy::Future::value<core::int>(3);
+          :return_value = asy::Future::value<core::int*>(3);
           break #L6;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -197,3 +197,16 @@
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart b/pkg/front_end/testcases/inference/future_then_conditional.dart
index 2554216..07a48f6 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart
@@ -16,19 +16,19 @@
 
 void test() {
   MyFuture<bool> f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new Future<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x ? 2 : new Future<int>.value(3);
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
       /*error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new Future<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
index d16fb57..bee904d 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await asy::Future::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : asy::Future::value<core::int>(3);
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
index 37a9eaf..6621c72 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          :return_value = :result ? 2 : asy::Future::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
index 149f271..1ce4d6d 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
index aafd0f203..c15d6b6 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart b/pkg/front_end/testcases/inference/future_then_conditional_2.dart
index ea5c226..b984016 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart
@@ -16,21 +16,21 @@
 
 void test() {
   MyFuture<bool> f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new MyFuture<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x
         ? 2
         : new MyFuture<int>.value(3);
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
       /*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new MyFuture<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
index b5e3e79..879590f 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
index e3526c6..55a472f 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
index 7c89757..f386e01 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
index fb7974e..c3baf4e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_2.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart b/pkg/front_end/testcases/inference/future_then_conditional_3.dart
index 3505a6d..28e52e8 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart
@@ -16,19 +16,19 @@
 
 void test() {
   MyFuture<bool> f;
-  MyFuture<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  MyFuture<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new Future<int>.value(3));
-  MyFuture<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  MyFuture<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x ? 2 : new Future<int>.value(3);
   });
-  MyFuture<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
+  MyFuture<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
       /*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new Future<int>.value(3));
-  MyFuture<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  MyFuture<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
index dc6b8a1..e4ac6bb 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : asy::Future::value<core::int>(3);
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : asy::Future::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
index 8031722..a7525fc 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          :return_value = :result ? 2 : asy::Future::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
index fd97d69..6d642c1 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
index 3a4604a..a1e0911 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_3.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart b/pkg/front_end/testcases/inference/future_then_conditional_4.dart
index 36ffafd..6166276 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart
@@ -16,21 +16,21 @@
 
 void test() {
   MyFuture<bool> f;
-  MyFuture<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  MyFuture<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new MyFuture<int>.value(3));
-  MyFuture<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  MyFuture<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x
         ? 2
         : new MyFuture<int>.value(3);
   });
-  MyFuture<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
+  MyFuture<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
       /*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new MyFuture<int>.value(3));
-  MyFuture<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  MyFuture<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
index ac112f8..b92553e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
index 0ebe142..3290b66 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::bool> f;
-  self::MyFuture<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  self::MyFuture<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  self::MyFuture<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  self::MyFuture<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
index 3d33f4a..37b74ef 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
index ed935aa..0ee0ff4 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_4.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::bool*>* f;
+  self::MyFuture<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  self::MyFuture<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  self::MyFuture<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  self::MyFuture<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  self::MyFuture<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart b/pkg/front_end/testcases/inference/future_then_conditional_5.dart
index 52dc987..53938d2c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart
@@ -16,21 +16,21 @@
 
 void test() {
   Future<bool> f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new MyFuture<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x
         ? 2
         : new MyFuture<int>.value(3);
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
       /*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new MyFuture<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new MyFuture<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
index f359eff..fa9c691 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : new self::MyFuture::value<core::int>(3);
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
index d73e7d4..c8132ae 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : new self::MyFuture::value<core::int>(3);
+          :return_value = :result ? 2 : new self::MyFuture::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : new self::MyFuture::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : new self::MyFuture::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : new self::MyFuture::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
index b29bf54..28e6554 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
index 396dabd..71a707c 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_5.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(new self::MyFuture::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : new self::MyFuture::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : new self::MyFuture::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart b/pkg/front_end/testcases/inference/future_then_conditional_6.dart
index b89a28b..721c2ca 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart
@@ -16,19 +16,19 @@
 
 void test() {
   Future<bool> f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async =>
           x ? 2 : await new Future<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=bool*/ x) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=bool* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x ? 2 : new Future<int>.value(3);
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
       /*info:INFERRED_TYPE_CLOSURE,error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) =>
           x ? 2 : new Future<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=bool*/ x) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=bool* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ? 2 : new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
index 6231476..6f7a509 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => x ? 2 : await asy::Future::value<core::int>(3));
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return await x ? 2 : asy::Future::value<core::int>(3);
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => x ? 2 : await asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return await x ? 2 : asy::Future::value<core::int*>(3);
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
index b10c087..a0a27e5 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::bool> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = :result ? 2 : asy::Future::value<core::int>(3);
+          :return_value = :result ? 2 : asy::Future::value<core::int*>(3);
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int>(3));
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return x ? 2 : asy::Future::value<core::int>(3);
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => x ? 2 : asy::Future::value<core::int*>(3));
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return x ? 2 : asy::Future::value<core::int*>(3);
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
index 2a444d6..da92218 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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));
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> async {
-    return (await x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  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));
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* async {
+    return (await x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
index cf2964e..7cdb74e 100644
--- a/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_conditional_6.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::bool*>* f;
+  asy::Future<core::int*>* t1 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -43,7 +43,7 @@
             :async_temporary_0 = 2;
           }
           else {
-            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           :return_value = :async_temporary_0;
@@ -61,9 +61,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{asy::Future::then}<core::int>((core::bool x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -75,7 +75,7 @@
         #L2:
         {
           [yield] let dynamic #t2 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (:result ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (:result ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -90,9 +90,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> => (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{asy::Future::then}<core::int>((core::bool x) → asy::FutureOr<core::int> {
-    return (x ?{core::Object} 2 : asy::Future::value<core::int>(3)) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* => (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{asy::Future::then}<core::int*>((core::bool* x) → asy::FutureOr<core::int*>* {
+    return (x ?{core::Object*} 2 : asy::Future::value<core::int*>(3)) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
index 5d9a04a..f7d4cd3 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart
@@ -10,12 +10,12 @@
 test() {
   Future<int> f;
   Future<List<int>> b = /*info:ASSIGNMENT_CAST should be pass*/ f
-      . /*@typeArgs=List<dynamic>*/ /*@target=Future::then*/ then(
-          /*@returnType=List<dynamic>*/ (/*@type=int*/ x) => /*@typeArgs=dynamic*/ [])
+      . /*@ typeArgs=List<dynamic>* */ /*@target=Future::then*/ then(
+          /*@ returnType=List<dynamic>* */ (/*@ type=int* */ x) => /*@ typeArgs=dynamic */ [])
       . /*@target=Future::whenComplete*/ whenComplete(
-          /*@returnType=Null*/ () {});
-  b = f. /*@typeArgs=List<int>*/ /*@target=Future::then*/ then(
-      /*@returnType=List<int>*/ (/*@type=int*/ x) => /*@typeArgs=int*/ []);
+          /*@ returnType=Null* */ () {});
+  b = f. /*@ typeArgs=List<int*>* */ /*@target=Future::then*/ then(
+      /*@ returnType=List<int*>* */ (/*@ type=int* */ x) => /*@ typeArgs=int* */ []);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect
index fa81e87..6ab63e2 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method test() → dynamic {
-  asy::Future<core::int> f;
-  asy::Future<core::List<core::int>> b = f.then((dynamic x) → dynamic => <dynamic>[]).whenComplete(() → dynamic {});
+  asy::Future<core::int*>* f;
+  asy::Future<core::List<core::int*>*>* b = f.then((dynamic x) → dynamic => <dynamic>[]).whenComplete(() → dynamic {});
   b = f.then((dynamic x) → dynamic => <dynamic>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect
index fa81e87..6ab63e2 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.legacy.transformed.expect
@@ -6,8 +6,8 @@
 import "dart:async";
 
 static method test() → dynamic {
-  asy::Future<core::int> f;
-  asy::Future<core::List<core::int>> b = f.then((dynamic x) → dynamic => <dynamic>[]).whenComplete(() → dynamic {});
+  asy::Future<core::int*>* f;
+  asy::Future<core::List<core::int*>*>* b = f.then((dynamic x) → dynamic => <dynamic>[]).whenComplete(() → dynamic {});
   b = f.then((dynamic x) → dynamic => <dynamic>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
index 7a94f25..a535e1e 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.expect
@@ -6,8 +6,8 @@
 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>[]).{asy::Future::whenComplete}(() → core::Null {}) 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>[]);
+  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>[]).{asy::Future::whenComplete}(() → core::Null* {}) 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*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
index 7a94f25..a535e1e 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.strong.transformed.expect
@@ -6,8 +6,8 @@
 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>[]).{asy::Future::whenComplete}(() → core::Null {}) 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>[]);
+  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>[]).{asy::Future::whenComplete}(() → core::Null* {}) 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*>[]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
index e254cf4..b21b39b 100644
--- a/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/future_then_downwards_method_target.dart.type_promotion.expect
@@ -1,3 +1,3 @@
 pkg/front_end/testcases/inference/future_then_downwards_method_target.dart:17:5: Context: Write to b@330
-  b = f. /*@typeArgs=List<int>*/ /*@target=Future::then*/ then(
+  b = f. /*@ typeArgs=List<int*>* */ /*@target=Future::then*/ then(
     ^
diff --git a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect
index 70f2705..482caee 100644
--- a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method m1() → dynamic {
-  asy::Future<core::int> f;
-  dynamic x = f.then<asy::Future<core::List<core::int>>>((dynamic x) → dynamic => <dynamic>[]);
-  asy::Future<core::List<core::int>> y = x;
+  asy::Future<core::int*>* f;
+  dynamic x = f.then<asy::Future<core::List<core::int*>*>*>((dynamic x) → dynamic => <dynamic>[]);
+  asy::Future<core::List<core::int*>*>* y = x;
 }
 static method m2() → dynamic {
-  asy::Future<core::int> f;
-  dynamic x = f.then<core::List<core::int>>((dynamic x) → dynamic => <dynamic>[]);
-  asy::Future<core::List<core::int>> y = x;
+  asy::Future<core::int*>* f;
+  dynamic x = f.then<core::List<core::int*>*>((dynamic x) → dynamic => <dynamic>[]);
+  asy::Future<core::List<core::int*>*>* y = x;
 }
diff --git a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.transformed.expect
index 70f2705..482caee 100644
--- a/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_explicit_future.dart.legacy.transformed.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method m1() → dynamic {
-  asy::Future<core::int> f;
-  dynamic x = f.then<asy::Future<core::List<core::int>>>((dynamic x) → dynamic => <dynamic>[]);
-  asy::Future<core::List<core::int>> y = x;
+  asy::Future<core::int*>* f;
+  dynamic x = f.then<asy::Future<core::List<core::int*>*>*>((dynamic x) → dynamic => <dynamic>[]);
+  asy::Future<core::List<core::int*>*>* y = x;
 }
 static method m2() → dynamic {
-  asy::Future<core::int> f;
-  dynamic x = f.then<core::List<core::int>>((dynamic x) → dynamic => <dynamic>[]);
-  asy::Future<core::List<core::int>> y = x;
+  asy::Future<core::int*>* f;
+  dynamic x = f.then<core::List<core::int*>*>((dynamic x) → dynamic => <dynamic>[]);
+  asy::Future<core::List<core::int*>*>* y = x;
 }
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart b/pkg/front_end/testcases/inference/future_then_ifNull.dart
index c399f90..2246903 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart
@@ -16,19 +16,19 @@
 
 void test() {
   MyFuture<int> f;
-  Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=int*/ x) async =>
+  Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=int* */ x) async =>
           x ?? await new Future<int>.value(3));
-  Future<int> t2 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=Future<int>*/ (/*@type=int*/ x) async {
+  Future<int> t2 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=Future<int*>* */ (/*@ type=int* */ x) async {
     return /*info:DOWN_CAST_COMPOSITE*/ await x ?? new Future<int>.value(3);
   });
-  Future<int> t5 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
+  Future<int> t5 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
       /*error:INVALID_CAST_FUNCTION_EXPR*/
-      /*@returnType=FutureOr<int>*/ (/*@type=int*/ x) =>
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) =>
           x ?? new Future<int>.value(3));
-  Future<int> t6 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-      /*@returnType=FutureOr<int>*/ (/*@type=int*/ x) {
+  Future<int> t6 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+      /*@ returnType=FutureOr<int*>* */ (/*@ type=int* */ x) {
     return /*info:DOWN_CAST_COMPOSITE*/ x ?? new Future<int>.value(3);
   });
 }
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
index 211f9f3..dd582d2 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::int> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> async => let final dynamic #t1 = x in #t1.==(null) ? await asy::Future::value<core::int>(3) : #t1);
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> async {
-    return let final dynamic #t2 = await x in #t2.==(null) ? asy::Future::value<core::int>(3) : #t2;
+  self::MyFuture<core::int*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* async => let final dynamic #t1 = x in #t1.==(null) ? await asy::Future::value<core::int*>(3) : #t1);
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* async {
+    return let final dynamic #t2 = await x in #t2.==(null) ? asy::Future::value<core::int*>(3) : #t2;
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t3 = x in #t3.==(null) ? asy::Future::value<core::int>(3) : #t3);
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return let final dynamic #t4 = x in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => let final dynamic #t3 = x in #t3.==(null) ? asy::Future::value<core::int*>(3) : #t3);
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return let final dynamic #t4 = x in #t4.==(null) ? asy::Future::value<core::int*>(3) : #t4;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
index a55a43b..441ff1e 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  self::MyFuture<core::int> f;
-  asy::Future<core::int> t1 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  self::MyFuture<core::int*>* f;
+  asy::Future<core::int*>* t1 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -41,7 +41,7 @@
         {
           final dynamic #t1 = x;
           if(#t1.==(null)) {
-            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           else {
@@ -62,9 +62,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.then((dynamic x) → asy::Future<dynamic> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  asy::Future<core::int*>* t2 = f.then((dynamic x) → asy::Future<dynamic>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -76,7 +76,7 @@
         #L2:
         {
           [yield] let dynamic #t3 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int>(3) : #t4;
+          :return_value = let final dynamic #t4 = :result in #t4.==(null) ? asy::Future::value<core::int*>(3) : #t4;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -91,9 +91,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int>(3) : #t5);
-  asy::Future<core::int> t6 = f.then((dynamic x) → dynamic {
-    return let final dynamic #t6 = x in #t6.==(null) ? asy::Future::value<core::int>(3) : #t6;
+  asy::Future<core::int*>* t5 = f.then((dynamic x) → dynamic => let final dynamic #t5 = x in #t5.==(null) ? asy::Future::value<core::int*>(3) : #t5);
+  asy::Future<core::int*>* t6 = f.then((dynamic x) → dynamic {
+    return let final dynamic #t6 = x in #t6.==(null) ? asy::Future::value<core::int*>(3) : #t6;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
index 6c0b0d6..20ff134 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
index fa51936..000016c 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.expect
@@ -5,33 +5,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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);
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<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} asy::FutureOr<core::int>;
+  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);
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::Future<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} asy::FutureOr<core::int*>*;
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t3 = x in #t3.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t3) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> {
-    return (let final core::int #t4 = x in #t4.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t4) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::FutureOr<core::int*>* => (let final core::int* #t3 = x in #t3.==(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t3) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::FutureOr<core::int*>* {
+    return (let final core::int* #t4 = x in #t4.==(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t4) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
index 8bc362f..ce5d23f1 100644
--- a/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_ifNull.dart.strong.transformed.expect
@@ -5,29 +5,29 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  self::MyFuture<core::int*>* f;
+  asy::Future<core::int*>* t1 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -39,9 +39,9 @@
       try {
         #L1:
         {
-          final core::int #t1 = x;
+          final core::int* #t1 = x;
           if(#t1.==(null)) {
-            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int>(3), :async_op_then, :async_op_error, :async_op) in null;
+            [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::value<core::int*>(3), :async_op_then, :async_op_error, :async_op) in null;
             :async_temporary_0 = :result;
           }
           else {
@@ -62,9 +62,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t2 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  asy::Future<core::int*>* t2 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -76,7 +76,7 @@
         #L2:
         {
           [yield] let dynamic #t3 = asy::_awaitHelper(x, :async_op_then, :async_op_error, :async_op) in null;
-          :return_value = (let final core::int #t4 = :result in #t4.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t4) as{TypeError} asy::FutureOr<core::int>;
+          :return_value = (let final core::int* #t4 = :result in #t4.==(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t4) as{TypeError} asy::FutureOr<core::int*>*;
           break #L2;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -91,9 +91,22 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   });
-  asy::Future<core::int> t5 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> => (let final core::int #t5 = x in #t5.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t5) as{TypeError} asy::FutureOr<core::int>);
-  asy::Future<core::int> t6 = f.{self::MyFuture::then}<core::int>((core::int x) → asy::FutureOr<core::int> {
-    return (let final core::int #t6 = x in #t6.==(null) ?{core::Object} asy::Future::value<core::int>(3) : #t6) as{TypeError} asy::FutureOr<core::int>;
+  asy::Future<core::int*>* t5 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::FutureOr<core::int*>* => (let final core::int* #t5 = x in #t5.==(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t5) as{TypeError} asy::FutureOr<core::int*>*);
+  asy::Future<core::int*>* t6 = f.{self::MyFuture::then}<core::int*>((core::int* x) → asy::FutureOr<core::int*>* {
+    return (let final core::int* #t6 = x in #t6.==(null) ?{core::Object*} asy::Future::value<core::int*>(3) : #t6) as{TypeError} asy::FutureOr<core::int*>*;
   });
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart b/pkg/front_end/testcases/inference/future_then_upwards.dart
index 9c33569..a54d337 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart
@@ -15,16 +15,16 @@
 }
 
 void main() {
-  var /*@type=MyFuture<double>*/ f =
-      foo(). /*@typeArgs=double*/ /*@target=MyFuture::then*/ then(
-          /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3);
+  var /*@ type=MyFuture<double*>* */ f =
+      foo(). /*@ typeArgs=double* */ /*@target=MyFuture::then*/ then(
+          /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3);
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 
   // The unnecessary cast is to illustrate that we inferred <double> for
   // the generic type args, even though we had a return type context.
   Future<num> f3 = /*info:UNNECESSARY_CAST*/ foo()
-          . /*@typeArgs=double*/ /*@target=MyFuture::then*/ then(
-              /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3)
+          . /*@ typeArgs=double* */ /*@target=MyFuture::then*/ then(
+              /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3)
       as Future<double>;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
index c131aa9..2f92869 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.expect
@@ -5,28 +5,41 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  asy::Future<core::int> f2 = f;
-  asy::Future<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double>;
+  asy::Future<core::int*>* f2 = f;
+  asy::Future<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
index c131aa9..2f92869 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.legacy.transformed.expect
@@ -5,28 +5,41 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  asy::Future<core::int> f2 = f;
-  asy::Future<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double>;
+  asy::Future<core::int*>* f2 = f;
+  asy::Future<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
index 68201b4..c40bb55 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void
   ;
-static method foo() → self::MyFuture<dynamic>
+static method foo() → self::MyFuture<dynamic>*
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
index 0e8e4f6..e0b1bf3 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.expect
@@ -15,33 +15,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
-  self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  asy::Future<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   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) as asy::Future<core::double>;
+                                                ^" 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) as asy::Future<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
index 0e8e4f6..e0b1bf3 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards.dart.strong.transformed.expect
@@ -15,33 +15,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
-  self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  asy::Future<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   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) as asy::Future<core::double>;
+                                                ^" 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) as asy::Future<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart b/pkg/front_end/testcases/inference/future_then_upwards_2.dart
index ffc3c35b..86bd56d 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart
@@ -15,16 +15,16 @@
 }
 
 void main() {
-  var /*@type=MyFuture<double>*/ f =
-      foo(). /*@typeArgs=double*/ /*@target=MyFuture::then*/ then(
-          /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3);
+  var /*@ type=MyFuture<double*>* */ f =
+      foo(). /*@ typeArgs=double* */ /*@target=MyFuture::then*/ then(
+          /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3);
   MyFuture<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 
   // The unnecessary cast is to illustrate that we inferred <double> for
   // the generic type args, even though we had a return type context.
   MyFuture<num> f3 = /*info:UNNECESSARY_CAST*/ foo()
-          . /*@typeArgs=double*/ /*@target=MyFuture::then*/ then(
-              /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3)
+          . /*@ typeArgs=double* */ /*@target=MyFuture::then*/ then(
+              /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3)
       as MyFuture<double>;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
index b418fd7..1794962 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.expect
@@ -5,28 +5,41 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  self::MyFuture<core::int> f2 = f;
-  self::MyFuture<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as self::MyFuture<core::double>;
+  self::MyFuture<core::int*>* f2 = f;
+  self::MyFuture<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as self::MyFuture<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
index b418fd7..1794962 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.legacy.transformed.expect
@@ -5,28 +5,41 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  self::MyFuture<core::int> f2 = f;
-  self::MyFuture<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as self::MyFuture<core::double>;
+  self::MyFuture<core::int*>* f2 = f;
+  self::MyFuture<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as self::MyFuture<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
index 68201b4..c40bb55 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.outline.expect
@@ -5,25 +5,29 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void
   ;
-static method foo() → self::MyFuture<dynamic>
+static method foo() → self::MyFuture<dynamic>*
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
index 8b99590..a92b944 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.expect
@@ -14,32 +14,45 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
-  self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  self::MyFuture<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
   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) as self::MyFuture<core::double>;
+                                                  ^" 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) as self::MyFuture<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
index 8b99590..a92b944 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_2.dart.strong.transformed.expect
@@ -14,32 +14,45 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method main() → void {
-  self::MyFuture<core::double> f = self::foo().{self::MyFuture::then}<core::double>((dynamic _) → core::double => 2.3);
-  self::MyFuture<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  self::MyFuture<core::double*>* f = self::foo().{self::MyFuture::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  self::MyFuture<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'MyFuture<int>'.
   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) as self::MyFuture<core::double>;
+                                                  ^" 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) as self::MyFuture<core::double*>*;
 }
-static method foo() → self::MyFuture<dynamic>
-  return new self::MyFuture::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart b/pkg/front_end/testcases/inference/future_then_upwards_3.dart
index 8351c02..f88050b 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart
@@ -15,16 +15,16 @@
 }
 
 void test() {
-  var /*@type=Future<double>*/ f =
-      foo(). /*@typeArgs=double*/ /*@target=Future::then*/ then(
-          /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3);
+  var /*@ type=Future<double*>* */ f =
+      foo(). /*@ typeArgs=double* */ /*@target=Future::then*/ then(
+          /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3);
   Future<int> f2 = /*error:INVALID_ASSIGNMENT*/ f;
 
   // The unnecessary cast is to illustrate that we inferred <double> for
   // the generic type args, even though we had a return type context.
   Future<num> f3 = /*info:UNNECESSARY_CAST*/ foo()
-          . /*@typeArgs=double*/ /*@target=Future::then*/ then(
-              /*@returnType=double*/ (/*@type=dynamic*/ _) => 2.3)
+          . /*@ typeArgs=double* */ /*@target=Future::then*/ then(
+              /*@ returnType=double* */ (/*@ type=dynamic */ _) => 2.3)
       as Future<double>;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
index 93fd95b..da56314 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.expect
@@ -5,29 +5,42 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  asy::Future<core::int> f2 = f;
-  asy::Future<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double>;
+  asy::Future<core::int*>* f2 = f;
+  asy::Future<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double*>*;
 }
-static method foo() → asy::Future<dynamic>
-  return asy::Future::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
index 93fd95b..da56314 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.legacy.transformed.expect
@@ -5,29 +5,42 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
   dynamic f = self::foo().then((dynamic _) → dynamic => 2.3);
-  asy::Future<core::int> f2 = f;
-  asy::Future<core::num> f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double>;
+  asy::Future<core::int*>* f2 = f;
+  asy::Future<core::num*>* f3 = self::foo().then((dynamic _) → dynamic => 2.3) as asy::Future<core::double*>*;
 }
-static method foo() → asy::Future<dynamic>
-  return asy::Future::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
index a644d90..f2d1f87 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.outline.expect
@@ -5,27 +5,31 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(self::MyFuture::T x) → self::MyFuture<self::MyFuture::T>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void
   ;
-static method foo() → asy::Future<dynamic>
+static method foo() → asy::Future<dynamic>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
index 54ab95a..1983524 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.expect
@@ -14,33 +14,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  asy::Future<core::double*>* f = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  asy::Future<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   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) as asy::Future<core::double>;
+                                                ^" 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) as asy::Future<core::double*>*;
 }
-static method foo() → asy::Future<dynamic>
-  return asy::Future::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
index 54ab95a..1983524 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_3.dart.strong.transformed.expect
@@ -14,33 +14,46 @@
 
 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>
+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>
+  constructor value(self::MyFuture::T* x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
 static method test() → void {
-  asy::Future<core::double> f = self::foo().{asy::Future::then}<core::double>((dynamic _) → core::double => 2.3);
-  asy::Future<core::int> f2 = let final<BottomType> #t1 = 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>'.
+  asy::Future<core::double*>* f = self::foo().{asy::Future::then}<core::double*>((dynamic _) → core::double* => 2.3);
+  asy::Future<core::int*>* f2 = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Future<int>'.
   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) as asy::Future<core::double>;
+                                                ^" 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) as asy::Future<core::double*>*;
 }
-static method foo() → asy::Future<dynamic>
-  return asy::Future::value<core::int>(1);
+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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart
index 952672a..ebb2f1a 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart
@@ -9,14 +9,14 @@
 
 test() {
   Future<int> base;
-  var /*@type=Future<bool>*/ f =
-      base. /*@typeArgs=bool*/ /*@target=Future::then*/ then(
-          /*@returnType=bool*/ (/*@type=int*/ x) {
+  var /*@ type=Future<bool*>* */ f =
+      base. /*@ typeArgs=bool* */ /*@target=Future::then*/ then(
+          /*@ returnType=bool* */ (/*@ type=int* */ x) {
     return x /*@target=num::==*/ == 0;
   });
-  var /*@type=Future<bool>*/ g =
-      base. /*@typeArgs=bool*/ /*@target=Future::then*/ then(
-          /*@returnType=bool*/ (/*@type=int*/ x) => x /*@target=num::==*/ == 0);
+  var /*@ type=Future<bool*>* */ g =
+      base. /*@ typeArgs=bool* */ /*@target=Future::then*/ then(
+          /*@ returnType=bool* */ (/*@ type=int* */ x) => x /*@target=num::==*/ == 0);
   Future<bool> b = f;
   b = g;
 }
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect
index d593943..5b23c27 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method test() → dynamic {
-  asy::Future<core::int> base;
+  asy::Future<core::int*>* base;
   dynamic f = base.then((dynamic x) → dynamic {
     return x.==(0);
   });
   dynamic g = base.then((dynamic x) → dynamic => x.==(0));
-  asy::Future<core::bool> b = f;
+  asy::Future<core::bool*>* b = f;
   b = g;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect
index d593943..5b23c27 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.legacy.transformed.expect
@@ -6,12 +6,12 @@
 import "dart:async";
 
 static method test() → dynamic {
-  asy::Future<core::int> base;
+  asy::Future<core::int*>* base;
   dynamic f = base.then((dynamic x) → dynamic {
     return x.==(0);
   });
   dynamic g = base.then((dynamic x) → dynamic => x.==(0));
-  asy::Future<core::bool> b = f;
+  asy::Future<core::bool*>* b = f;
   b = g;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.expect
index 4ce6f50..a8c0b46 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.expect
@@ -6,12 +6,12 @@
 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 {
+  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::==}(0);
   });
-  asy::Future<core::bool> g = base.{asy::Future::then}<core::bool>((core::int x) → core::bool => x.{core::num::==}(0));
-  asy::Future<core::bool> b = f;
+  asy::Future<core::bool*>* g = base.{asy::Future::then}<core::bool*>((core::int* x) → core::bool* => x.{core::num::==}(0));
+  asy::Future<core::bool*>* b = f;
   b = g;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.transformed.expect
index 4ce6f50..a8c0b46 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.strong.transformed.expect
@@ -6,12 +6,12 @@
 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 {
+  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::==}(0);
   });
-  asy::Future<core::bool> g = base.{asy::Future::then}<core::bool>((core::int x) → core::bool => x.{core::num::==}(0));
-  asy::Future<core::bool> b = f;
+  asy::Future<core::bool*>* g = base.{asy::Future::then}<core::bool*>((core::int* x) → core::bool* => x.{core::num::==}(0));
+  asy::Future<core::bool*>* b = f;
   b = g;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
index b9275fa64..37b52fb 100644
--- a/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/future_then_upwards_from_block.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/future_then_upwards_from_block.dart:21:5: Context: Write to b@695
+pkg/front_end/testcases/inference/future_then_upwards_from_block.dart:21:5: Context: Write to b@721
   b = g;
     ^
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart b/pkg/front_end/testcases/inference/future_union_async_conditional.dart
index 455dab2..74326a7 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart
@@ -17,15 +17,15 @@
 Future<int> g1(bool x) async {
   return /*info:DOWN_CAST_COMPOSITE*/ x
       ? 42
-      : new /*@typeArgs=int*/ Future.value(42);
+      : new /*@ typeArgs=int* */ Future.value(42);
 }
 
 Future<int> g2(bool x) async =>
     /*info:DOWN_CAST_COMPOSITE*/ x
         ? 42
-        : new /*@typeArgs=int*/ Future.value(42);
+        : new /*@ typeArgs=int* */ Future.value(42);
 Future<int> g3(bool x) async {
-  var /*@type=Object*/ y = x ? 42 : new /*@typeArgs=int*/ Future.value(42);
+  var /*@ type=Object* */ y = x ? 42 : new /*@ typeArgs=int* */ Future.value(42);
   return /*info:DOWN_CAST_COMPOSITE*/ y;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
index f9b1dde..6e8306a 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> async {
+static method g1(core::bool* x) → asy::Future<core::int*>* async {
   return x ? 42 : asy::Future::value<dynamic>(42);
 }
-static method g2(core::bool x) → asy::Future<core::int> async 
+static method g2(core::bool* x) → asy::Future<core::int*>* async 
   return x ? 42 : asy::Future::value<dynamic>(42);
-static method g3(core::bool x) → asy::Future<core::int> async {
+static method g3(core::bool* x) → asy::Future<core::int*>* async {
   dynamic y = x ? 42 : asy::Future::value<dynamic>(42);
   return y;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
index 24f847d..c4e4446 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.legacy.transformed.expect
@@ -5,27 +5,27 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -50,9 +50,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -77,9 +77,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -106,3 +106,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
index 3e05a12..a8a37bc 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.outline.expect
@@ -5,29 +5,33 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int>
+static method g1(core::bool* x) → asy::Future<core::int*>*
   ;
-static method g2(core::bool x) → asy::Future<core::int>
+static method g2(core::bool* x) → asy::Future<core::int*>*
   ;
-static method g3(core::bool x) → asy::Future<core::int>
+static method g3(core::bool* x) → asy::Future<core::int*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
index a5ac737..5b4785c 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.expect
@@ -5,31 +5,44 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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} asy::FutureOr<core::int>;
+static method g1(core::bool* x) → asy::Future<core::int*>* async {
+  return (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} asy::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} asy::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} asy::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} asy::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} asy::FutureOr<core::int*>*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
index a660035..0c94989 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional.dart.strong.transformed.expect
@@ -5,27 +5,27 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -35,7 +35,7 @@
     try {
       #L1:
       {
-        :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
+        :return_value = (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} asy::FutureOr<core::int*>*;
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -50,9 +50,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -62,7 +62,7 @@
     try {
       #L2:
       {
-        :return_value = (x ?{core::Object} 42 : asy::Future::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
+        :return_value = (x ?{core::Object*} 42 : asy::Future::value<core::int*>(42)) as{TypeError} asy::FutureOr<core::int*>*;
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -77,9 +77,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -89,8 +89,8 @@
     try {
       #L3:
       {
-        core::Object y = x ?{core::Object} 42 : asy::Future::value<core::int>(42);
-        :return_value = y as{TypeError} asy::FutureOr<core::int>;
+        core::Object* y = x ?{core::Object*} 42 : asy::Future::value<core::int*>(42);
+        :return_value = y as{TypeError} asy::FutureOr<core::int*>*;
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -106,3 +106,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
index 5188287..9e9e4ec 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart
@@ -17,16 +17,16 @@
 Future<int> g1(bool x) async {
   return /*info:DOWN_CAST_COMPOSITE*/ x
       ? 42
-      : new /*@typeArgs=int*/ MyFuture.value(42);
+      : new /*@ typeArgs=int* */ MyFuture.value(42);
 }
 
 Future<int> g2(bool x) async =>
     /*info:DOWN_CAST_COMPOSITE*/ x
         ? 42
-        : new /*@typeArgs=int*/ MyFuture.value(42);
+        : new /*@ typeArgs=int* */ MyFuture.value(42);
 Future<int> g3(bool x) async {
-  var /*@type=Object*/ y =
-      x ? 42 : new /*@typeArgs=dynamic*/ MyFuture.value(42);
+  var /*@ type=Object* */ y =
+      x ? 42 : new /*@ typeArgs=dynamic */ MyFuture.value(42);
   return /*info:DOWN_CAST_COMPOSITE*/ y;
 }
 
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
index 85cc477..3e7205c 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> async {
+static method g1(core::bool* x) → asy::Future<core::int*>* async {
   return x ? 42 : new self::MyFuture::value<dynamic>(42);
 }
-static method g2(core::bool x) → asy::Future<core::int> async 
+static method g2(core::bool* x) → asy::Future<core::int*>* async 
   return x ? 42 : new self::MyFuture::value<dynamic>(42);
-static method g3(core::bool x) → asy::Future<core::int> async {
+static method g3(core::bool* x) → asy::Future<core::int*>* async {
   dynamic y = x ? 42 : new self::MyFuture::value<dynamic>(42);
   return y;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
index 7395c33..c312a96 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.legacy.transformed.expect
@@ -5,27 +5,27 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -50,9 +50,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -77,9 +77,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -106,3 +106,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
index 3e05a12..a8a37bc 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.outline.expect
@@ -5,29 +5,33 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int>
+static method g1(core::bool* x) → asy::Future<core::int*>*
   ;
-static method g2(core::bool x) → asy::Future<core::int>
+static method g2(core::bool* x) → asy::Future<core::int*>*
   ;
-static method g3(core::bool x) → asy::Future<core::int>
+static method g3(core::bool* x) → asy::Future<core::int*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
index 5d5be70..e226a22 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.expect
@@ -5,31 +5,44 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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} asy::FutureOr<core::int>;
+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} asy::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} asy::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} asy::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} asy::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} asy::FutureOr<core::int*>*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
index 596a21b..8d24cfe 100644
--- a/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_async_conditional_2.dart.strong.transformed.expect
@@ -5,27 +5,27 @@
 
 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>
+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>
+  constructor value(dynamic x) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static method g1(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g1(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -35,7 +35,7 @@
     try {
       #L1:
       {
-        :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
+        :return_value = (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} asy::FutureOr<core::int*>*;
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -50,9 +50,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g2(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g2(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -62,7 +62,7 @@
     try {
       #L2:
       {
-        :return_value = (x ?{core::Object} 42 : new self::MyFuture::value<core::int>(42)) as{TypeError} asy::FutureOr<core::int>;
+        :return_value = (x ?{core::Object*} 42 : new self::MyFuture::value<core::int*>(42)) as{TypeError} asy::FutureOr<core::int*>*;
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -77,9 +77,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3(core::bool x) → asy::Future<core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-  asy::FutureOr<core::int> :return_value;
+static method g3(core::bool* x) → asy::Future<core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+  asy::FutureOr<core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -89,8 +89,8 @@
     try {
       #L3:
       {
-        core::Object y = x ?{core::Object} 42 : new self::MyFuture::value<dynamic>(42);
-        :return_value = y as{TypeError} asy::FutureOr<core::int>;
+        core::Object* y = x ?{core::Object*} 42 : new self::MyFuture::value<dynamic>(42);
+        :return_value = y as{TypeError} asy::FutureOr<core::int*>*;
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -106,3 +106,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart b/pkg/front_end/testcases/inference/future_union_downwards.dart
index 2882aa8..2516414 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart
@@ -16,23 +16,23 @@
 
 MyFuture f;
 // Instantiates Future<int>
-Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-    /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) =>
-        new /*@typeArgs=int*/ Future.value('hi'));
+Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+    /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) =>
+        new /*@ typeArgs=int* */ Future.value('hi'));
 
 // Instantiates List<int>
 Future<List<int>> t2 =
-    f. /*@typeArgs=List<int>*/ /*@target=MyFuture::then*/ then(
-        /*@returnType=List<int>*/ (/*@type=dynamic*/ _) => /*@typeArgs=int*/ [
+    f. /*@ typeArgs=List<int*>* */ /*@target=MyFuture::then*/ then(
+        /*@ returnType=List<int*>* */ (/*@ type=dynamic */ _) => /*@ typeArgs=int* */ [
               3
             ]);
 Future<List<int>> g2() async {
-  return /*@typeArgs=int*/ [3];
+  return /*@ typeArgs=int* */ [3];
 }
 
 Future<List<int>> g3() async {
-  return new /*@typeArgs=List<int>*/ Future.value(
-      /*@typeArgs=int*/ [3]);
+  return new /*@ typeArgs=List<int*>* */ Future.value(
+      /*@ typeArgs=int* */ [3]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
index 3e9e23f..ab24348 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> async {
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* async {
   return <dynamic>[3];
 }
-static method g3() → asy::Future<core::List<core::int>> async {
+static method g3() → asy::Future<core::List<core::int*>*>* async {
   return asy::Future::value<dynamic>(<dynamic>[3]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
index 86df2a1..8c8e570 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.legacy.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
index 6fbd438..1fefba5 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.outline.expect
@@ -5,30 +5,34 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1;
-static field asy::Future<core::List<core::int>> t2;
-static method g2() → asy::Future<core::List<core::int>>
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1;
+static field asy::Future<core::List<core::int*>*>* t2;
+static method g2() → asy::Future<core::List<core::int*>*>*
   ;
-static method g3() → asy::Future<core::List<core::int>>
+static method g3() → asy::Future<core::List<core::int*>*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
index f4aa39ea..81d1269 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+// 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>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-//         new /*@typeArgs=int*/ Future.value('hi'));
-//                                            ^
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,35 +14,48 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+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*>(let final<BottomType> #t1 = 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>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-        new /*@typeArgs=int*/ Future.value('hi'));
-                                           ^" in "hi" as{TypeError} asy::FutureOr<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]);
-static method g2() → asy::Future<core::List<core::int>> async {
-  return <core::int>[3];
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} asy::FutureOr<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]);
+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 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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
index b7defba..68ec181 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+// 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>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-//         new /*@typeArgs=int*/ Future.value('hi'));
-//                                            ^
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,34 +14,34 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+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*>(let final<BottomType> #t1 = 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>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-        new /*@typeArgs=int*/ Future.value('hi'));
-                                           ^" in "hi" as{TypeError} asy::FutureOr<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]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} asy::FutureOr<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]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -51,7 +51,7 @@
     try {
       #L1:
       {
-        :return_value = <core::int>[3];
+        :return_value = <core::int*>[3];
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -66,9 +66,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -78,7 +78,7 @@
     try {
       #L2:
       {
-        :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
+        :return_value = asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -94,3 +94,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart b/pkg/front_end/testcases/inference/future_union_downwards_2.dart
index 9c32e85..fbf1963 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart
@@ -16,23 +16,23 @@
 
 MyFuture f;
 // Instantiates Future<int>
-Future<int> t1 = f. /*@typeArgs=int*/ /*@target=MyFuture::then*/ then(
-    /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) =>
-        new /*@typeArgs=int*/ MyFuture.value('hi'));
+Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=MyFuture::then*/ then(
+    /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) =>
+        new /*@ typeArgs=int* */ MyFuture.value('hi'));
 
 // Instantiates List<int>
 Future<List<int>> t2 =
-    f. /*@typeArgs=List<int>*/ /*@target=MyFuture::then*/ then(
-        /*@returnType=List<int>*/ (/*@type=dynamic*/ _) => /*@typeArgs=int*/ [
+    f. /*@ typeArgs=List<int*>* */ /*@target=MyFuture::then*/ then(
+        /*@ returnType=List<int*>* */ (/*@ type=dynamic */ _) => /*@ typeArgs=int* */ [
               3
             ]);
 Future<List<int>> g2() async {
-  return /*@typeArgs=int*/ [3];
+  return /*@ typeArgs=int* */ [3];
 }
 
 Future<List<int>> g3() async {
-  return new /*@typeArgs=List<int>*/ MyFuture.value(
-      /*@typeArgs=int*/ [3]);
+  return new /*@ typeArgs=List<int*>* */ MyFuture.value(
+      /*@ typeArgs=int* */ [3]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
index 1f70652..1e35208 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> async {
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* async {
   return <dynamic>[3];
 }
-static method g3() → asy::Future<core::List<core::int>> async {
+static method g3() → asy::Future<core::List<core::int*>*>* async {
   return new self::MyFuture::value<dynamic>(<dynamic>[3]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
index 1afd6d8..7a8e5e5 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.legacy.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
index 6fbd438..1fefba5 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.outline.expect
@@ -5,30 +5,34 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field self::MyFuture<dynamic> f;
-static field asy::Future<core::int> t1;
-static field asy::Future<core::List<core::int>> t2;
-static method g2() → asy::Future<core::List<core::int>>
+static field self::MyFuture<dynamic>* f;
+static field asy::Future<core::int*>* t1;
+static field asy::Future<core::List<core::int*>*>* t2;
+static method g2() → asy::Future<core::List<core::int*>*>*
   ;
-static method g3() → asy::Future<core::List<core::int>>
+static method g3() → asy::Future<core::List<core::int*>*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
index d17cf61..7b7bf16 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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"));
-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]);
-static method g2() → asy::Future<core::List<core::int>> async {
-  return <core::int>[3];
+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"));
+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]);
+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 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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
index 41be920..5d28067 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_2.dart.strong.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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"));
-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]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+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"));
+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]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -38,7 +38,7 @@
     try {
       #L1:
       {
-        :return_value = <core::int>[3];
+        :return_value = <core::int*>[3];
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -65,7 +65,7 @@
     try {
       #L2:
       {
-        :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
+        :return_value = new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart b/pkg/front_end/testcases/inference/future_union_downwards_3.dart
index 6d421db..321b82d 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart
@@ -16,20 +16,20 @@
 
 Future f;
 // Instantiates Future<int>
-Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-    /*@returnType=Future<int>*/ (/*@type=dynamic*/ _) =>
-        new /*@typeArgs=int*/ Future.value('hi'));
+Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+    /*@ returnType=Future<int*>* */ (/*@ type=dynamic */ _) =>
+        new /*@ typeArgs=int* */ Future.value('hi'));
 
 // Instantiates List<int>
-Future<List<int>> t2 = f. /*@typeArgs=List<int>*/ /*@target=Future::then*/ then(
-    /*@returnType=List<int>*/ (/*@type=dynamic*/ _) => /*@typeArgs=int*/ [3]);
+Future<List<int>> t2 = f. /*@ typeArgs=List<int*>* */ /*@target=Future::then*/ then(
+    /*@ returnType=List<int*>* */ (/*@ type=dynamic */ _) => /*@ typeArgs=int* */ [3]);
 Future<List<int>> g2() async {
-  return /*@typeArgs=int*/ [3];
+  return /*@ typeArgs=int* */ [3];
 }
 
 Future<List<int>> g3() async {
-  return new /*@typeArgs=List<int>*/ Future.value(
-      /*@typeArgs=int*/ [3]);
+  return new /*@ typeArgs=List<int*>* */ Future.value(
+      /*@ typeArgs=int* */ [3]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
index 51e5fde..97572be 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> async {
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* async {
   return <dynamic>[3];
 }
-static method g3() → asy::Future<core::List<core::int>> async {
+static method g3() → asy::Future<core::List<core::int*>*>* async {
   return asy::Future::value<dynamic>(<dynamic>[3]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
index ec3fde4..f16a413 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.legacy.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => asy::Future::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
index 2d1e70e..239aaa9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.outline.expect
@@ -5,30 +5,34 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1;
-static field asy::Future<core::List<core::int>> t2;
-static method g2() → asy::Future<core::List<core::int>>
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1;
+static field asy::Future<core::List<core::int*>*>* t2;
+static method g2() → asy::Future<core::List<core::int*>*>*
   ;
-static method g3() → asy::Future<core::List<core::int>>
+static method g3() → asy::Future<core::List<core::int*>*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
index 2d9895a..bb00772 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+// 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>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-//         new /*@typeArgs=int*/ Future.value('hi'));
-//                                            ^
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,35 +14,48 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+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*>(let final<BottomType> #t1 = 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>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-        new /*@typeArgs=int*/ Future.value('hi'));
-                                           ^" in "hi" as{TypeError} asy::FutureOr<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]);
-static method g2() → asy::Future<core::List<core::int>> async {
-  return <core::int>[3];
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} asy::FutureOr<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]);
+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 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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
index 7c40213..66f2ce1 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_3.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+// 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>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-//         new /*@typeArgs=int*/ Future.value('hi'));
-//                                            ^
+//         new /*@ typeArgs=int* */ Future.value('hi'));
+//                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,34 +14,34 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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>(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/future_union_downwards_3.dart:21:44: Error: The argument type 'String' can't be assigned to the parameter type 'FutureOr<int>'.
+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*>(let final<BottomType> #t1 = 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>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to 'FutureOr<int>'.
-        new /*@typeArgs=int*/ Future.value('hi'));
-                                           ^" in "hi" as{TypeError} asy::FutureOr<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]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+        new /*@ typeArgs=int* */ Future.value('hi'));
+                                              ^" in "hi" as{TypeError} asy::FutureOr<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]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -51,7 +51,7 @@
     try {
       #L1:
       {
-        :return_value = <core::int>[3];
+        :return_value = <core::int*>[3];
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -66,9 +66,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -78,7 +78,7 @@
     try {
       #L2:
       {
-        :return_value = asy::Future::value<core::List<core::int>>(<core::int>[3]);
+        :return_value = asy::Future::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -94,3 +94,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart b/pkg/front_end/testcases/inference/future_union_downwards_4.dart
index e9a48fc..36a693a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart
@@ -16,20 +16,20 @@
 
 Future f;
 // Instantiates Future<int>
-Future<int> t1 = f. /*@typeArgs=int*/ /*@target=Future::then*/ then(
-    /*@returnType=MyFuture<int>*/ (/*@type=dynamic*/ _) =>
-        new /*@typeArgs=int*/ MyFuture.value('hi'));
+Future<int> t1 = f. /*@ typeArgs=int* */ /*@target=Future::then*/ then(
+    /*@ returnType=MyFuture<int*>* */ (/*@ type=dynamic */ _) =>
+        new /*@ typeArgs=int* */ MyFuture.value('hi'));
 
 // Instantiates List<int>
-Future<List<int>> t2 = f. /*@typeArgs=List<int>*/ /*@target=Future::then*/ then(
-    /*@returnType=List<int>*/ (/*@type=dynamic*/ _) => /*@typeArgs=int*/ [3]);
+Future<List<int>> t2 = f. /*@ typeArgs=List<int*>* */ /*@target=Future::then*/ then(
+    /*@ returnType=List<int*>* */ (/*@ type=dynamic */ _) => /*@ typeArgs=int* */ [3]);
 Future<List<int>> g2() async {
-  return /*@typeArgs=int*/ [3];
+  return /*@ typeArgs=int* */ [3];
 }
 
 Future<List<int>> g3() async {
-  return new /*@typeArgs=List<int>*/ MyFuture.value(
-      /*@typeArgs=int*/ [3]);
+  return new /*@ typeArgs=List<int*>* */ MyFuture.value(
+      /*@ typeArgs=int* */ [3]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
index ab6a0d3..d32ef22 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> async {
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* async {
   return <dynamic>[3];
 }
-static method g3() → asy::Future<core::List<core::int>> async {
+static method g3() → asy::Future<core::List<core::int*>*>* async {
   return new self::MyFuture::value<dynamic>(<dynamic>[3]);
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
index 7fc5179..30c8cdc 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.legacy.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
-static field asy::Future<core::List<core::int>> t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1 = self::f.then((dynamic _) → dynamic => new self::MyFuture::value<dynamic>("hi"));
+static field asy::Future<core::List<core::int*>*>* t2 = self::f.then((dynamic _) → dynamic => <dynamic>[3]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
index 2d1e70e..239aaa9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.outline.expect
@@ -5,30 +5,34 @@
 
 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>
+class MyFuture<T extends core::Object* = dynamic> extends core::Object implements asy::Future<self::MyFuture::T*> {
+  constructor •() → self::MyFuture<self::MyFuture::T*>*
     ;
-  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x]) → self::MyFuture<self::MyFuture::T*>*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError}) → self::MyFuture<self::MyFuture::then::S*>*
     ;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* action) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T*>*;
 }
-static field asy::Future<dynamic> f;
-static field asy::Future<core::int> t1;
-static field asy::Future<core::List<core::int>> t2;
-static method g2() → asy::Future<core::List<core::int>>
+static field asy::Future<dynamic>* f;
+static field asy::Future<core::int*>* t1;
+static field asy::Future<core::List<core::int*>*>* t2;
+static method g2() → asy::Future<core::List<core::int*>*>*
   ;
-static method g3() → asy::Future<core::List<core::int>>
+static method g3() → asy::Future<core::List<core::int*>*>*
   ;
 static method main() → dynamic
   ;
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
index 0de77a6..44c27d7 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.expect
@@ -5,31 +5,44 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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"));
-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]);
-static method g2() → asy::Future<core::List<core::int>> async {
-  return <core::int>[3];
+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"));
+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]);
+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 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 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
index 028521e..675a8a6 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_4.dart.strong.transformed.expect
@@ -5,30 +5,30 @@
 
 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>
+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 = null]) → self::MyFuture<self::MyFuture::T>
+  constructor value([dynamic x = #C1]) → self::MyFuture<self::MyFuture::T*>*
     : super core::Object::•() {}
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
-  method then<S extends core::Object = dynamic>((self::MyFuture::T) → asy::FutureOr<self::MyFuture::then::S> f, {core::Function onError = null}) → self::MyFuture<self::MyFuture::then::S>
+  method then<S extends core::Object* = dynamic>((self::MyFuture::T*) →* asy::FutureOr<self::MyFuture::then::S*>* f, {core::Function* onError = #C1}) → self::MyFuture<self::MyFuture::then::S*>*
     return null;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ catchError(core::Function onError, {(core::Object) → core::bool test = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#catchError, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[onError]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#test: test}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() → asy::FutureOr<dynamic> action) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#whenComplete, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[action]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration timeLimit, {generic-covariant-impl () → asy::FutureOr<self::MyFuture::T> onTimeout = null}) → asy::Future<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#timeout, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#onTimeout: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T>;
-  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T>
-    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#asStream, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} asy::Stream<self::MyFuture::T>;
+  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::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}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ whenComplete(() →* asy::FutureOr<dynamic>* 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>(#C7))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ timeout(core::Duration* timeLimit, {generic-covariant-impl () →* asy::FutureOr<self::MyFuture::T*>* onTimeout = #C1}) → asy::Future<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C8, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[timeLimit]), core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#C9: onTimeout}))) as{TypeError} asy::Future<self::MyFuture::T*>*;
+  no-such-method-forwarder method /* from org-dartlang-sdk:///sdk/lib/async/future.dart */ asStream() → asy::Stream<self::MyFuture::T*>*
+    return this.{self::MyFuture::noSuchMethod}(new core::_InvocationMirror::_withType(#C10, 0, #C3, #C6, core::Map::unmodifiable<core::Symbol*, dynamic>(#C7))) as{TypeError} asy::Stream<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"));
-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]);
-static method g2() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+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"));
+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]);
+static method g2() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -38,7 +38,7 @@
     try {
       #L1:
       {
-        :return_value = <core::int>[3];
+        :return_value = <core::int*>[3];
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -53,9 +53,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method g3() → asy::Future<core::List<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::List<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int>>();
-  asy::FutureOr<core::List<core::int>> :return_value;
+static method g3() → asy::Future<core::List<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::List<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::List<core::int*>*>();
+  asy::FutureOr<core::List<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -65,7 +65,7 @@
     try {
       #L2:
       {
-        :return_value = new self::MyFuture::value<core::List<core::int>>(<core::int>[3]);
+        :return_value = new self::MyFuture::value<core::List<core::int*>*>(<core::int*>[3]);
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -81,3 +81,16 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = #catchError
+  #C3 = <core::Type*>[]
+  #C4 = #test
+  #C5 = #whenComplete
+  #C6 = <dynamic>[]
+  #C7 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C6}
+  #C8 = #timeout
+  #C9 = #onTimeout
+  #C10 = #asStream
+}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart
index 2071a13..5259814 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart
@@ -10,8 +10,8 @@
 foo() async {
   Future<List<A>> f1 = null;
   Future<List<A>> f2 = null;
-  List<List<A>> merged = await Future. /*@typeArgs=List<A>*/ wait(
-      /*@typeArgs=Future<List<A>>*/ [f1, f2]);
+  List<List<A>> merged = await Future. /*@ typeArgs=List<A*>* */ wait(
+      /*@ typeArgs=Future<List<A*>*>* */ [f1, f2]);
 }
 
 class A {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect
index ef7f24c..3471ea5 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.expect
@@ -6,13 +6,13 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 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<dynamic>(<dynamic>[f1, f2]);
+  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<dynamic>(<dynamic>[f1, f2]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect
index 7f5bbe8..8faaeae 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.legacy.transformed.expect
@@ -6,13 +6,13 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -23,10 +23,10 @@
     try {
       #L1:
       {
-        asy::Future<core::List<self::A>> f1 = null;
-        asy::Future<core::List<self::A>> f2 = null;
+        asy::Future<core::List<self::A*>*>* f1 = null;
+        asy::Future<core::List<self::A*>*>* f2 = null;
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::List<self::A>> merged = :result;
+        core::List<core::List<self::A*>*>* merged = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect
index fa4dfd8..c0805d9 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.outline.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method foo() → dynamic
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.expect
index 69a6b1a..9e8da5a 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.expect
@@ -6,13 +6,13 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 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]);
+  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_future_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
index 74f247a..4ec9a21 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_future_return.dart.strong.transformed.expect
@@ -6,13 +6,13 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -23,10 +23,10 @@
     try {
       #L1:
       {
-        asy::Future<core::List<self::A>> f1 = null;
-        asy::Future<core::List<self::A>> f2 = null;
-        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A>>(<asy::Future<core::List<self::A>>>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<core::List<self::A>> merged = :result;
+        asy::Future<core::List<self::A*>*>* f1 = null;
+        asy::Future<core::List<self::A*>*>* f2 = null;
+        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<core::List<self::A*>*>(<asy::Future<core::List<self::A*>*>*>[f1, f2]), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<core::List<self::A*>*>* merged = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart
index 667eaef..c9dc7e1 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart
@@ -11,7 +11,7 @@
 
 test() async {
   Future<String> f;
-  String s = await /*@typeArgs=FutureOr<String>*/ id(f);
+  String s = await /*@ typeArgs=FutureOr<String*>* */ id(f);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect
index 2ddfc1a..2111b62 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.expect
@@ -5,10 +5,10 @@
 
 import "dart:async";
 
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+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<dynamic>(f);
+  asy::Future<core::String*>* f;
+  core::String* s = await self::id<dynamic>(f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect
index 69fc341..52b80bb 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.legacy.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:async";
 
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+static method id<T extends core::Object* = dynamic>(self::id::T* x) → self::id::T*
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -20,9 +20,9 @@
     try {
       #L1:
       {
-        asy::Future<core::String> f;
+        asy::Future<core::String*>* f;
         [yield] let dynamic #t1 = asy::_awaitHelper(self::id<dynamic>(f), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
index 59f0925..ffd2984 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.outline.expect
@@ -4,7 +4,7 @@
 
 import "dart:async";
 
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+static method id<T extends core::Object* = dynamic>(self::id::T* x) → self::id::T*
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
index 82aa55a..708e39c 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.expect
@@ -5,10 +5,10 @@
 
 import "dart:async";
 
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+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<asy::FutureOr<core::String>>(f);
+  asy::Future<core::String*>* f;
+  core::String* s = await self::id<asy::FutureOr<core::String*>*>(f);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
index 8b0ab47..671564f 100644
--- a/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_downwards_generic_method_with_generic_return.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:async";
 
-static method id<T extends core::Object = dynamic>(self::id::T x) → self::id::T
+static method id<T extends core::Object* = dynamic>(self::id::T* x) → self::id::T*
   return x;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -20,9 +20,9 @@
     try {
       #L1:
       {
-        asy::Future<core::String> f;
-        [yield] let dynamic #t1 = asy::_awaitHelper(self::id<asy::FutureOr<core::String>>(f), :async_op_then, :async_op_error, :async_op) in null;
-        core::String s = :result;
+        asy::Future<core::String*>* f;
+        [yield] let dynamic #t1 = asy::_awaitHelper(self::id<asy::FutureOr<core::String*>*>(f), :async_op_then, :async_op_error, :async_op) in null;
+        core::String* s = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart
index cec22b8..1f35fec 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart
@@ -8,12 +8,12 @@
 import 'dart:async';
 
 main() async {
-  var /*@type=Future<B>*/ b = new Future<B>.value(new B());
-  var /*@type=Future<C>*/ c = new Future<C>.value(new C());
-  var /*@type=List<Future<A>>*/ lll = /*@typeArgs=Future<A>*/ [b, c];
-  var /*@type=List<A>*/ result = await Future. /*@typeArgs=A*/ wait(lll);
-  var /*@type=List<A>*/ result2 = await Future. /*@typeArgs=A*/ wait(
-      /*@typeArgs=Future<A>*/ [b, c]);
+  var /*@ type=Future<B*>* */ b = new Future<B>.value(new B());
+  var /*@ type=Future<C*>* */ c = new Future<C>.value(new C());
+  var /*@ type=List<Future<A*>*>* */ lll = /*@ typeArgs=Future<A*>* */ [b, c];
+  var /*@ type=List<A*>* */ result = await Future. /*@ typeArgs=A* */ wait(lll);
+  var /*@ type=List<A*>* */ result2 = await Future. /*@ typeArgs=A* */ wait(
+      /*@ typeArgs=Future<A*>* */ [b, c]);
   List<A> list = result;
   list = result2;
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect
index 0324c10..e31e291 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.expect
@@ -6,26 +6,26 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
 static method main() → dynamic async {
-  dynamic b = asy::Future::value<self::B>(new self::B::•());
-  dynamic c = asy::Future::value<self::C>(new self::C::•());
+  dynamic b = asy::Future::value<self::B*>(new self::B::•());
+  dynamic c = asy::Future::value<self::C*>(new self::C::•());
   dynamic lll = <dynamic>[b, c];
   dynamic result = await asy::Future::wait<dynamic>(lll);
   dynamic result2 = await asy::Future::wait<dynamic>(<dynamic>[b, c]);
-  core::List<self::A> list = result;
+  core::List<self::A*>* list = result;
   list = result2;
 }
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect
index 4769915..053fc26 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.legacy.transformed.expect
@@ -6,23 +6,23 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -33,14 +33,14 @@
     try {
       #L1:
       {
-        dynamic b = asy::Future::value<self::B>(new self::B::•());
-        dynamic c = asy::Future::value<self::C>(new self::C::•());
+        dynamic b = asy::Future::value<self::B*>(new self::B::•());
+        dynamic c = asy::Future::value<self::C*>(new self::C::•());
         dynamic lll = <dynamic>[b, c];
         [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<dynamic>(lll), :async_op_then, :async_op_error, :async_op) in null;
         dynamic result = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<dynamic>(<dynamic>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
         dynamic result2 = :result;
-        core::List<self::A> list = result;
+        core::List<self::A*>* list = result;
         list = result2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect
index cf47daa..2dff872 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.outline.expect
@@ -5,15 +5,15 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.expect
index e6d8003..f38520e 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.expect
@@ -6,26 +6,26 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → self::C
+  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;
+  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/future_union_upwards_generic_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
index 53cd071..0ae7eb2 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.strong.transformed.expect
@@ -6,23 +6,23 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -33,14 +33,14 @@
     try {
       #L1:
       {
-        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];
-        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<self::A>(lll), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<self::A> result = :result;
-        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<self::A>(<asy::Future<self::A>>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
-        core::List<self::A> result2 = :result;
-        core::List<self::A> list = result;
+        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];
+        [yield] let dynamic #t1 = asy::_awaitHelper(asy::Future::wait<self::A*>(lll), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<self::A*>* result = :result;
+        [yield] let dynamic #t2 = asy::_awaitHelper(asy::Future::wait<self::A*>(<asy::Future<self::A*>*>[b, c]), :async_op_then, :async_op_error, :async_op) in null;
+        core::List<self::A*>* result2 = :result;
+        core::List<self::A*>* list = result;
         list = result2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
diff --git a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
index 8c6d411..a8f55d6 100644
--- a/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart:18:8: Context: Write to list@682
+pkg/front_end/testcases/inference/future_union_upwards_generic_methods.dart:18:8: Context: Write to list@717
   list = result2;
        ^
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart b/pkg/front_end/testcases/inference/generator_closure.dart
index ed7b973..73f34d1 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart
+++ b/pkg/front_end/testcases/inference/generator_closure.dart
@@ -10,7 +10,7 @@
 void foo(Stream<int> Function() values) {}
 
 void main() {
-  foo(/*@returnType=Stream<int>*/ () async* {
+  foo(/*@ returnType=Stream<int*>* */ () async* {
     yield 0;
     yield 1;
   });
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect
index bd8ed88..3b38d52 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static method foo(() → asy::Stream<core::int> values) → void {}
+static method foo(() →* asy::Stream<core::int*>* values) → void {}
 static method main() → void {
-  self::foo(() → asy::Stream<dynamic> async* {
+  self::foo(() → asy::Stream<dynamic>* async* {
     yield 0;
     yield 1;
   });
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect
index a5312fc..7bea27e 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.legacy.transformed.expect
@@ -5,10 +5,10 @@
 
 import "dart:async";
 
-static method foo(() → asy::Stream<core::int> values) → void {}
+static method foo(() →* asy::Stream<core::int*>* values) → void {}
 static method main() → void {
-  self::foo(() → asy::Stream<dynamic> /* originally async* */ {
-    asy::_AsyncStarStreamController<dynamic> :controller;
+  self::foo(() → asy::Stream<dynamic>* /* originally async* */ {
+    asy::_AsyncStarStreamController<dynamic>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.outline.expect b/pkg/front_end/testcases/inference/generator_closure.dart.outline.expect
index d8e3037..394f01f 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.outline.expect
@@ -5,7 +5,7 @@
 
 import "dart:async";
 
-static method foo(() → asy::Stream<core::int> values) → void
+static method foo(() →* asy::Stream<core::int*>* values) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.strong.expect b/pkg/front_end/testcases/inference/generator_closure.dart.strong.expect
index 57d4fe9..c703bed 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.strong.expect
@@ -5,9 +5,9 @@
 
 import "dart:async";
 
-static method foo(() → asy::Stream<core::int> values) → void {}
+static method foo(() →* asy::Stream<core::int*>* values) → void {}
 static method main() → void {
-  self::foo(() → asy::Stream<core::int> async* {
+  self::foo(() → asy::Stream<core::int*>* async* {
     yield 0;
     yield 1;
   });
diff --git a/pkg/front_end/testcases/inference/generator_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generator_closure.dart.strong.transformed.expect
index 003313d..2f0ff59 100644
--- a/pkg/front_end/testcases/inference/generator_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generator_closure.dart.strong.transformed.expect
@@ -5,10 +5,10 @@
 
 import "dart:async";
 
-static method foo(() → asy::Stream<core::int> values) → void {}
+static method foo(() →* asy::Stream<core::int*>* values) → void {}
 static method main() → void {
-  self::foo(() → asy::Stream<core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<core::int> :controller;
+  self::foo(() → asy::Stream<core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -42,7 +42,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   });
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect
index 53ab933f..10668cc 100644
--- a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef ToValue<T extends core::Object = dynamic> = (T) → void;
+typedef ToValue<T extends core::Object* = dynamic> = (T*) →* void;
 static method main() → dynamic {
-  function f<T extends core::Object = dynamic>(T x) → (T) → void
+  function f<T extends core::Object* = dynamic>(T* x) → (T*) →* void
     return null;
-  dynamic x = f.call<core::int>(42);
+  dynamic x = f.call<core::int*>(42);
   dynamic y = f.call(42);
-  (core::int) → void takesInt = x;
+  (core::int*) →* void takesInt = x;
   takesInt = y;
 }
diff --git a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect
index 53ab933f..10668cc 100644
--- a/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_functions_return_typedef.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-typedef ToValue<T extends core::Object = dynamic> = (T) → void;
+typedef ToValue<T extends core::Object* = dynamic> = (T*) →* void;
 static method main() → dynamic {
-  function f<T extends core::Object = dynamic>(T x) → (T) → void
+  function f<T extends core::Object* = dynamic>(T* x) → (T*) →* void
     return null;
-  dynamic x = f.call<core::int>(42);
+  dynamic x = f.call<core::int*>(42);
   dynamic y = f.call(42);
-  (core::int) → void takesInt = x;
+  (core::int*) →* void takesInt = x;
   takesInt = y;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart
index ce5e324..43e78e8 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart
@@ -7,6 +7,6 @@
 
 T f<S, T>(S s) => null;
 main() {
-  String x = /*@typeArgs=int, String*/ f(42);
-  String y = (f) /*@typeArgs=int, String*/ (42);
+  String x = /*@ typeArgs=int*, String* */ f(42);
+  String y = (f) /*@ typeArgs=int*, String* */ (42);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect
index fe1c799..4f8c568 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.expect
@@ -2,9 +2,13 @@
 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
+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<dynamic, dynamic>(42);
-  core::String y = self::f.call(42);
+  core::String* x = self::f<dynamic, dynamic>(42);
+  core::String* y = (#C1).call(42);
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect
index fe1c799..4f8c568 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.legacy.transformed.expect
@@ -2,9 +2,13 @@
 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
+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<dynamic, dynamic>(42);
-  core::String y = self::f.call(42);
+  core::String* x = self::f<dynamic, dynamic>(42);
+  core::String* y = (#C1).call(42);
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
index b410886..3d831a4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.expect
@@ -2,9 +2,13 @@
 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
+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 = self::f.call<core::int, core::String>(42);
+  core::String* x = self::f<core::int*, core::String*>(42);
+  core::String* y = (#C1).call<core::int*, core::String*>(42);
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
index b410886..3d831a4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_basic_downward_inference.dart.strong.transformed.expect
@@ -2,9 +2,13 @@
 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
+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 = self::f.call<core::int, core::String>(42);
+  core::String* x = self::f<core::int*, core::String*>(42);
+  core::String* y = (#C1).call<core::int*, core::String*>(42);
+}
+
+constants  {
+  #C1 = tearoff self::f
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart
index 801450e..cba01a4 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart
@@ -23,6 +23,6 @@
   */
 
   new Foo<String>()
-      . /*error:COULD_NOT_INFER*/ /*@typeArgs=int*/ /*@target=Foo::method*/ method(
+      . /*error:COULD_NOT_INFER*/ /*@ typeArgs=int* */ /*@target=Foo::method*/ method(
           42);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
index 39a3325..464dcd7 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class Foo<T extends core::Pattern = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends core::Pattern* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     ;
-  method method<generic-covariant-impl U extends self::Foo::T = dynamic>(self::Foo::method::U u) → self::Foo::method::U
+  method method<generic-covariant-impl U extends self::Foo::T* = dynamic>(self::Foo::method::U* u) → self::Foo::method::U*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
index fce5b7e..96c5ec2 100644
--- a/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart.strong.expect
@@ -2,22 +2,22 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:77: Error: Inferred type argument 'int' doesn't conform to the bound 'String' of the type variable 'U' on 'Foo<String>.method'.
+// pkg/front_end/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound.dart:26:80: 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(
-//                                                                             ^
+//       . /*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 = core::Pattern> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
+class Foo<T extends core::Pattern* = core::Pattern*> extends core::Object {
+  synthetic constructor •() → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
-  method method<generic-covariant-impl U extends self::Foo::T = self::Foo::T>(self::Foo::method::U u) → self::Foo::method::U
+  method method<generic-covariant-impl U extends self::Foo::T* = self::Foo::T*>(self::Foo::method::U* u) → self::Foo::method::U*
     return u;
 }
 static method main() → dynamic {
-  new self::Foo::•<core::String>().{self::Foo::method}<core::int>(42);
+  new self::Foo::•<core::String*>().{self::Foo::method}<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart
index c5494ef..e7fa359 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart
@@ -11,30 +11,30 @@
 void printDouble(double x) => print(x);
 
 num myMax(num x, num y) =>
-    /*@typeArgs=num*/ max(x, y);
+    /*@ typeArgs=num* */ max(x, y);
 
 f() {
   // Okay if static types match.
-  printInt(/*@typeArgs=int*/ max(1, 2));
-  printInt(/*@typeArgs=int*/ min(1, 2));
-  printDouble(/*@typeArgs=double*/ max(1.0, 2.0));
-  printDouble(/*@typeArgs=double*/ min(1.0, 2.0));
+  printInt(/*@ typeArgs=int* */ max(1, 2));
+  printInt(/*@ typeArgs=int* */ min(1, 2));
+  printDouble(/*@ typeArgs=double* */ max(1.0, 2.0));
+  printDouble(/*@ typeArgs=double* */ min(1.0, 2.0));
 
   // No help for user-defined functions from num->num->num.
   printInt(myMax(1, 2));
   printInt(myMax(1, 2) as int);
 
   printInt(
-      /*@typeArgs=int*/ max(1, 2.0));
+      /*@ typeArgs=int* */ max(1, 2.0));
   printInt(
-      /*@typeArgs=int*/ min(1, 2.0));
+      /*@ typeArgs=int* */ min(1, 2.0));
   printDouble(
-      /*@typeArgs=double*/ max(1, 2.0));
+      /*@ typeArgs=double* */ max(1, 2.0));
   printDouble(
-      /*@typeArgs=double*/ min(1, 2.0));
+      /*@ typeArgs=double* */ min(1, 2.0));
 
   // Types other than int and double are not accepted.
-  printInt(/*@typeArgs=int*/ min("hi", "there"));
+  printInt(/*@ typeArgs=int* */ min("hi", "there"));
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect
index cdd6a99..1af3081 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.expect
@@ -5,11 +5,11 @@
 
 import "dart:math";
 
-static method printInt(core::int x) → void
+static method printInt(core::int* x) → void
   return core::print(x);
-static method printDouble(core::double x) → void
+static method printDouble(core::double* x) → void
   return core::print(x);
-static method myMax(core::num x, core::num y) → core::num
+static method myMax(core::num* x, core::num* y) → core::num*
   return math::max<dynamic>(x, y);
 static method f() → dynamic {
   self::printInt(math::max<dynamic>(1, 2));
@@ -17,7 +17,7 @@
   self::printDouble(math::max<dynamic>(1.0, 2.0));
   self::printDouble(math::min<dynamic>(1.0, 2.0));
   self::printInt(self::myMax(1, 2));
-  self::printInt(self::myMax(1, 2) as core::int);
+  self::printInt(self::myMax(1, 2) as core::int*);
   self::printInt(math::max<dynamic>(1, 2.0));
   self::printInt(math::min<dynamic>(1, 2.0));
   self::printDouble(math::max<dynamic>(1, 2.0));
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect
index cdd6a99..1af3081 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.legacy.transformed.expect
@@ -5,11 +5,11 @@
 
 import "dart:math";
 
-static method printInt(core::int x) → void
+static method printInt(core::int* x) → void
   return core::print(x);
-static method printDouble(core::double x) → void
+static method printDouble(core::double* x) → void
   return core::print(x);
-static method myMax(core::num x, core::num y) → core::num
+static method myMax(core::num* x, core::num* y) → core::num*
   return math::max<dynamic>(x, y);
 static method f() → dynamic {
   self::printInt(math::max<dynamic>(1, 2));
@@ -17,7 +17,7 @@
   self::printDouble(math::max<dynamic>(1.0, 2.0));
   self::printDouble(math::min<dynamic>(1.0, 2.0));
   self::printInt(self::myMax(1, 2));
-  self::printInt(self::myMax(1, 2) as core::int);
+  self::printInt(self::myMax(1, 2) as core::int*);
   self::printInt(math::max<dynamic>(1, 2.0));
   self::printInt(math::min<dynamic>(1, 2.0));
   self::printDouble(math::max<dynamic>(1, 2.0));
diff --git a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
index 14e6aae..44e61bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ max(1, 2.0));
-//                                ^
+//       /*@ typeArgs=int* */ max(1, 2.0));
+//                                   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ min(1, 2.0));
-//                                ^
+//       /*@ typeArgs=int* */ min(1, 2.0));
+//                                   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//   printInt(/*@typeArgs=int*/ min("hi", "there"));
-//                                  ^
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//   printInt(/*@typeArgs=int*/ min("hi", "there"));
-//                                        ^
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -28,35 +28,35 @@
 
 import "dart:math";
 
-static method printInt(core::int x) → void
+static method printInt(core::int* x) → void
   return core::print(x);
-static method printDouble(core::double x) → void
+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 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, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  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, let final<BottomType> #t1 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ max(1, 2.0));
-                               ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: 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, let final<BottomType> #t2 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' 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*>(let final<BottomType> #t3 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
-                                 ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: 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*, let final<BottomType> #t4 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
-                                       ^" in "there" as{TypeError} core::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_dart_math_min_max.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
index 14e6aae..44e61bf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ max(1, 2.0));
-//                                ^
+//       /*@ typeArgs=int* */ max(1, 2.0));
+//                                   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//       /*@typeArgs=int*/ min(1, 2.0));
-//                                ^
+//       /*@ typeArgs=int* */ min(1, 2.0));
+//                                   ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//   printInt(/*@typeArgs=int*/ min("hi", "there"));
-//                                  ^
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                     ^
 //
-// pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
+// 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'.
 // Try changing the type of the parameter, or casting the argument to 'int'.
-//   printInt(/*@typeArgs=int*/ min("hi", "there"));
-//                                        ^
+//   printInt(/*@ typeArgs=int* */ min("hi", "there"));
+//                                           ^
 //
 import self as self;
 import "dart:core" as core;
@@ -28,35 +28,35 @@
 
 import "dart:math";
 
-static method printInt(core::int x) → void
+static method printInt(core::int* x) → void
   return core::print(x);
-static method printDouble(core::double x) → void
+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 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, let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:28:32: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
+  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, let final<BottomType> #t1 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-      /*@typeArgs=int*/ max(1, 2.0));
-                               ^" in 2.0 as{TypeError} core::int));
-  self::printInt(math::min<core::int>(1, let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:30:32: 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, let final<BottomType> #t2 = 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'.
 Try changing the type of the parameter, or casting the argument to '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>(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:34: Error: The argument type 'String' 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*>(let final<BottomType> #t3 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
-                                 ^" in "hi" as{TypeError} core::int, let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_dart_math_min_max.dart:37:40: 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*, let final<BottomType> #t4 = 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'.
 Try changing the type of the parameter, or casting the argument to 'int'.
-  printInt(/*@typeArgs=int*/ min(\"hi\", \"there\"));
-                                       ^" in "there" as{TypeError} core::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.strong.expect b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
index d79aa89..4bc55c2 100644
--- a/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_do_not_infer_invalid_override_of_generic_method.dart.strong.expect
@@ -25,20 +25,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method m(dynamic x) → dynamic
     return x;
 }
 static method main() → dynamic {
-  core::int y = new self::D::•().{self::D::m}<core::int>(42) as{TypeError} core::int;
+  core::int* y = new self::D::•().{self::D::m}<core::int*>(42) as{TypeError} core::int*;
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart
index 3abb535..ebf2789 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart
@@ -7,10 +7,10 @@
 
 T f<T>(List<T> s) => null;
 test() {
-  String x = /*@typeArgs=String*/ f(/*@typeArgs=String*/ ['hi']);
+  String x = /*@ typeArgs=String* */ f(/*@ typeArgs=String* */ ['hi']);
   String y =
-      /*@typeArgs=String*/ f(
-          /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
+      /*@ typeArgs=String* */ f(
+          /*@ typeArgs=String* */ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect
index 5ab9647..644331e 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.expect
@@ -2,10 +2,10 @@
 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
+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<dynamic>(<dynamic>["hi"]);
-  core::String y = self::f<dynamic>(<dynamic>[42]);
+  core::String* x = self::f<dynamic>(<dynamic>["hi"]);
+  core::String* y = self::f<dynamic>(<dynamic>[42]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect
index 5ab9647..644331e 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 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
+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<dynamic>(<dynamic>["hi"]);
-  core::String y = self::f<dynamic>(<dynamic>[42]);
+  core::String* x = self::f<dynamic>(<dynamic>["hi"]);
+  core::String* y = self::f<dynamic>(<dynamic>[42]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
index 3266060..ca2d8a1 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
-//                                                                            ^
+//           /*@ 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
+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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* x = self::f<core::String*>(<core::String*>["hi"]);
+  core::String* y = self::f<core::String*>(<core::String*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
-          /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
-                                                                           ^" in 42 as{TypeError} core::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_affects_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
index 3266060..ca2d8a1 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'String'.
-//           /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
-//                                                                            ^
+//           /*@ 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
+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>[let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_downwards_inference_affects_arguments.dart:13:76: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* x = self::f<core::String*>(<core::String*>["hi"]);
+  core::String* y = self::f<core::String*>(<core::String*>[let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
-          /*@typeArgs=String*/ [/*error:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/ 42]);
-                                                                           ^" in 42 as{TypeError} core::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 b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart
index 49edbd4ce..96ad3cb 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart
@@ -7,31 +7,31 @@
 
 void test() {
   List<int> o;
-  int y = o. /*@typeArgs=int*/ /*@target=Iterable::fold*/ fold(
+  int y = o. /*@ typeArgs=int* */ /*@target=Iterable::fold*/ fold(
       0,
-      /*@returnType=int*/ (/*@type=int*/ x,
-              /*@type=int*/ y) =>
+      /*@ returnType=int* */ (/*@ type=int* */ x,
+              /*@ type=int* */ y) =>
           x /*@target=num::+*/ + y);
-  var /*@type=dynamic*/ z =
-      o. /*@typeArgs=dynamic*/ /*@target=Iterable::fold*/ fold(
+  var /*@ type=dynamic */ z =
+      o. /*@ typeArgs=dynamic */ /*@target=Iterable::fold*/ fold(
           0,
-          /*@returnType=dynamic*/ (/*@type=dynamic*/ x,
-              /*@type=int*/ y) => /*info:DYNAMIC_INVOKE*/ x + y);
+          /*@ returnType=dynamic */ (/*@ type=dynamic */ x,
+              /*@ type=int* */ y) => /*info:DYNAMIC_INVOKE*/ x + y);
   y = /*info:DYNAMIC_CAST*/ z;
 }
 
 void functionExpressionInvocation() {
   List<int> o;
-  int y = (o. /*@target=Iterable::fold*/ fold) /*@typeArgs=int*/ (
+  int y = (o. /*@target=Iterable::fold*/ fold) /*@ typeArgs=int* */ (
       0,
-      /*@returnType=int*/ (/*@type=int*/ x,
-              /*@type=int*/ y) =>
+      /*@ returnType=int* */ (/*@ type=int* */ x,
+              /*@ type=int* */ y) =>
           x /*@target=num::+*/ + y);
-  var /*@type=dynamic*/ z =
-      (o. /*@target=Iterable::fold*/ fold) /*@typeArgs=dynamic*/ (
+  var /*@ type=dynamic */ z =
+      (o. /*@target=Iterable::fold*/ fold) /*@ typeArgs=dynamic */ (
           0,
-          /*@returnType=dynamic*/ (/*@type=dynamic*/ x,
-              /*@type=int*/ y) => /*info:DYNAMIC_INVOKE*/ x + y);
+          /*@ returnType=dynamic */ (/*@ type=dynamic */ x,
+              /*@ type=int* */ y) => /*info:DYNAMIC_INVOKE*/ x + y);
   y = /*info:DYNAMIC_CAST*/ z;
 }
 
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect
index f4c3fe5..89ed9d1 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::List<core::int> o;
-  core::int y = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
+  core::List<core::int*>* o;
+  core::int* y = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   dynamic z = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   y = z;
 }
 static method functionExpressionInvocation() → void {
-  core::List<core::int> o;
-  core::int y = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
+  core::List<core::int*>* o;
+  core::int* y = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   dynamic z = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   y = z;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect
index f4c3fe5..89ed9d1 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::List<core::int> o;
-  core::int y = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
+  core::List<core::int*>* o;
+  core::int* y = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   dynamic z = o.fold(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   y = z;
 }
 static method functionExpressionInvocation() → void {
-  core::List<core::int> o;
-  core::int y = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
+  core::List<core::int*>* o;
+  core::int* y = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   dynamic z = o.fold.call(0, (dynamic x, dynamic y) → dynamic => x.+(y));
   y = z;
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.expect
index 5ac4800..7eb5d33 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.expect
@@ -3,15 +3,15 @@
 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));
-  dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
-  y = z as{TypeError} core::int;
+  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));
+  dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int* y) → dynamic => x.+(y));
+  y = z as{TypeError} core::int*;
 }
 static method functionExpressionInvocation() → void {
-  core::List<core::int> o;
-  core::int y = o.{core::Iterable::fold}.call<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y));
-  dynamic z = o.{core::Iterable::fold}.call<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
-  y = z as{TypeError} core::int;
+  core::List<core::int*>* o;
+  core::int* y = o.{core::Iterable::fold}.call<core::int*>(0, (core::int* x, core::int* y) → core::int* => x.{core::num::+}(y));
+  dynamic z = o.{core::Iterable::fold}.call<dynamic>(0, (dynamic x, core::int* y) → dynamic => x.+(y));
+  y = z as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.transformed.expect
index 5ac4800..7eb5d33 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 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));
-  dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
-  y = z as{TypeError} core::int;
+  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));
+  dynamic z = o.{core::Iterable::fold}<dynamic>(0, (dynamic x, core::int* y) → dynamic => x.+(y));
+  y = z as{TypeError} core::int*;
 }
 static method functionExpressionInvocation() → void {
-  core::List<core::int> o;
-  core::int y = o.{core::Iterable::fold}.call<core::int>(0, (core::int x, core::int y) → core::int => x.{core::num::+}(y));
-  dynamic z = o.{core::Iterable::fold}.call<dynamic>(0, (dynamic x, core::int y) → dynamic => x.+(y));
-  y = z as{TypeError} core::int;
+  core::List<core::int*>* o;
+  core::int* y = o.{core::Iterable::fold}.call<core::int*>(0, (core::int* x, core::int* y) → core::int* => x.{core::num::+}(y));
+  dynamic z = o.{core::Iterable::fold}.call<dynamic>(0, (dynamic x, core::int* y) → dynamic => x.+(y));
+  y = z as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
index 6793864..c1b547d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:20:5: Context: Write to y@436
+pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:20:5: Context: Write to y@448
   y = /*info:DYNAMIC_CAST*/ z;
     ^
-pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:35:5: Context: Write to y@941
+pkg/front_end/testcases/inference/generic_methods_downwards_inference_fold.dart:35:5: Context: Write to y@976
   y = /*info:DYNAMIC_CAST*/ z;
     ^
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
index ecbdb07..fd38f67 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.expect
@@ -20,24 +20,24 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
     return x;
-  method g(core::int x) → dynamic
+  method g(core::int* x) → dynamic
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
+  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
+  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).m(42);
+  core::int* y = (new self::D::•() as self::C*).m(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
index ecbdb07..fd38f67 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.legacy.transformed.expect
@@ -20,24 +20,24 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
     return x;
-  method g(core::int x) → dynamic
+  method g(core::int* x) → dynamic
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
+  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
+  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).m(42);
+  core::int* y = (new self::D::•() as self::C*).m(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
index 9d1f921..dffe5df 100644
--- a/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_handle_override_of_non_generic_with_generic.dart.strong.expect
@@ -36,24 +36,24 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
     return x;
-  method g(core::int x) → dynamic
+  method g(core::int* x) → dynamic
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<T extends core::Object = dynamic>(self::D::m::T x) → self::D::m::T
+  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
+  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) as{TypeError} core::int;
+  core::int* y = (new self::D::•() as self::C*).{self::C::m}(42) as{TypeError} core::int*;
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect
index b9c4222..f47805d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect
index b9c4222..f47805d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
index b9c4222..f47805d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
index b9c4222..f47805d 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → (self::D::f::U*) →* void
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect
index c1d63d6..bd37b92 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.expect
@@ -2,18 +2,18 @@
 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>
+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
+  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>
+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 method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect
index c1d63d6..bd37b92 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 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>
+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
+  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>
+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 method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
index c1d63d6..bd37b92 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.expect
@@ -2,18 +2,18 @@
 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>
+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
+  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>
+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 method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
index c1d63d6..bd37b92 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_parameter_type2.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 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>
+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
+  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>
+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 method f<U extends core::Object* = dynamic>(() →* core::List<self::D::f::U*>* g) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect
index c9c76f5..5696a03 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.expect
@@ -2,18 +2,18 @@
 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>
+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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect
index c9c76f5..5696a03 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 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>
+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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
index c9c76f5..5696a03 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.expect
@@ -2,18 +2,18 @@
 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>
+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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
index c9c76f5..5696a03 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_function_return_type.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 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>
+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 {}
+  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>
+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
+  method f<U extends core::Object* = dynamic>(self::D::f::U* u) → () →* self::D::f::U*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect
index 4b8fab7..dc800ae 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.expect
@@ -1,47 +1,46 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 import "dart:math";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num* = dynamic>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
 }
 static method test() → dynamic {
-  self::takeIII(math::max);
-  self::takeDDD(math::max);
-  self::takeNNN(math::max);
-  self::takeIDN(math::max);
-  self::takeDIN(math::max);
-  self::takeIIN(math::max);
-  self::takeDDN(math::max);
-  self::takeIIO(math::max);
-  self::takeDDO(math::max);
-  self::takeOOI(math::max);
-  self::takeIDI(math::max);
-  self::takeDID(math::max);
-  self::takeOON(math::max);
-  self::takeOOO(math::max);
-  self::takeIII(math::min);
-  self::takeDDD(math::min);
-  self::takeNNN(math::min);
-  self::takeIDN(math::min);
-  self::takeDIN(math::min);
-  self::takeIIN(math::min);
-  self::takeDDN(math::min);
-  self::takeIIO(math::min);
-  self::takeDDO(math::min);
-  self::takeOOI(math::min);
-  self::takeIDI(math::min);
-  self::takeDID(math::min);
-  self::takeOON(math::min);
-  self::takeOOO(math::min);
+  self::takeIII(#C1);
+  self::takeDDD(#C1);
+  self::takeNNN(#C1);
+  self::takeIDN(#C1);
+  self::takeDIN(#C1);
+  self::takeIIN(#C1);
+  self::takeDDN(#C1);
+  self::takeIIO(#C1);
+  self::takeDDO(#C1);
+  self::takeOOI(#C1);
+  self::takeIDI(#C1);
+  self::takeDID(#C1);
+  self::takeOON(#C1);
+  self::takeOOO(#C1);
+  self::takeIII(#C2);
+  self::takeDDD(#C2);
+  self::takeNNN(#C2);
+  self::takeIDN(#C2);
+  self::takeDIN(#C2);
+  self::takeIIN(#C2);
+  self::takeDDN(#C2);
+  self::takeIIO(#C2);
+  self::takeDDO(#C2);
+  self::takeOOI(#C2);
+  self::takeIDI(#C2);
+  self::takeDID(#C2);
+  self::takeOON(#C2);
+  self::takeOOO(#C2);
   self::takeIII(new self::C::•().m);
   self::takeDDD(new self::C::•().m);
   self::takeNNN(new self::C::•().m);
@@ -57,18 +56,23 @@
   self::takeIDI(new self::C::•().m);
   self::takeDID(new self::C::•().m);
 }
-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 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 = tearoff math::max
+  #C2 = tearoff math::min
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect
index 4b8fab7..dc800ae 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.legacy.transformed.expect
@@ -1,47 +1,46 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 import "dart:math";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num = dynamic>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num* = dynamic>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
 }
 static method test() → dynamic {
-  self::takeIII(math::max);
-  self::takeDDD(math::max);
-  self::takeNNN(math::max);
-  self::takeIDN(math::max);
-  self::takeDIN(math::max);
-  self::takeIIN(math::max);
-  self::takeDDN(math::max);
-  self::takeIIO(math::max);
-  self::takeDDO(math::max);
-  self::takeOOI(math::max);
-  self::takeIDI(math::max);
-  self::takeDID(math::max);
-  self::takeOON(math::max);
-  self::takeOOO(math::max);
-  self::takeIII(math::min);
-  self::takeDDD(math::min);
-  self::takeNNN(math::min);
-  self::takeIDN(math::min);
-  self::takeDIN(math::min);
-  self::takeIIN(math::min);
-  self::takeDDN(math::min);
-  self::takeIIO(math::min);
-  self::takeDDO(math::min);
-  self::takeOOI(math::min);
-  self::takeIDI(math::min);
-  self::takeDID(math::min);
-  self::takeOON(math::min);
-  self::takeOOO(math::min);
+  self::takeIII(#C1);
+  self::takeDDD(#C1);
+  self::takeNNN(#C1);
+  self::takeIDN(#C1);
+  self::takeDIN(#C1);
+  self::takeIIN(#C1);
+  self::takeDDN(#C1);
+  self::takeIIO(#C1);
+  self::takeDDO(#C1);
+  self::takeOOI(#C1);
+  self::takeIDI(#C1);
+  self::takeDID(#C1);
+  self::takeOON(#C1);
+  self::takeOOO(#C1);
+  self::takeIII(#C2);
+  self::takeDDD(#C2);
+  self::takeNNN(#C2);
+  self::takeIDN(#C2);
+  self::takeDIN(#C2);
+  self::takeIIN(#C2);
+  self::takeDDN(#C2);
+  self::takeIIO(#C2);
+  self::takeDDO(#C2);
+  self::takeOOI(#C2);
+  self::takeIDI(#C2);
+  self::takeDID(#C2);
+  self::takeOON(#C2);
+  self::takeOOO(#C2);
   self::takeIII(new self::C::•().m);
   self::takeDDD(new self::C::•().m);
   self::takeNNN(new self::C::•().m);
@@ -57,18 +56,23 @@
   self::takeIDI(new self::C::•().m);
   self::takeDID(new self::C::•().m);
 }
-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 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 = tearoff math::max
+  #C2 = tearoff math::min
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
index 599ce81..b10198f 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.expect
@@ -34,92 +34,96 @@
 //
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 import "dart:math";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num = core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
 }
 static method test() → dynamic {
-  self::takeIII(math::max<core::int>);
-  self::takeDDD(math::max<core::double>);
-  self::takeNNN(math::max<core::num>);
-  self::takeIDN(math::max<core::num>);
-  self::takeDIN(math::max<core::num>);
-  self::takeIIN(math::max<core::int>);
-  self::takeDDN(math::max<core::double>);
-  self::takeIIO(math::max<core::int>);
-  self::takeDDO(math::max<core::double>);
-  self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+  self::takeIII(#C1<core::int*>);
+  self::takeDDD(#C1<core::double*>);
+  self::takeNNN(#C1<core::num*>);
+  self::takeIDN(#C1<core::num*>);
+  self::takeDIN(#C1<core::num*>);
+  self::takeIIN(#C1<core::int*>);
+  self::takeDDN(#C1<core::double*>);
+  self::takeIIO(#C1<core::int*>);
+  self::takeDDO(#C1<core::double*>);
+  self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t1 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (math::max<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t2 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (math::max<core::num>) as{TypeError} (core::int, core::double) → core::double);
-  self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeIII(math::min<core::int>);
-  self::takeDDD(math::min<core::double>);
-  self::takeNNN(math::min<core::num>);
-  self::takeIDN(math::min<core::num>);
-  self::takeDIN(math::min<core::num>);
-  self::takeIIN(math::min<core::int>);
-  self::takeDDN(math::min<core::double>);
-  self::takeIIO(math::min<core::int>);
-  self::takeDDO(math::min<core::double>);
-  self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(#C2<core::int*>);
+  self::takeDDD(#C2<core::double*>);
+  self::takeNNN(#C2<core::num*>);
+  self::takeIDN(#C2<core::num*>);
+  self::takeDIN(#C2<core::num*>);
+  self::takeIIN(#C2<core::int*>);
+  self::takeDDN(#C2<core::double*>);
+  self::takeIIO(#C2<core::int*>);
+  self::takeDDO(#C2<core::double*>);
+  self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t3 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (math::min<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t4 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (math::min<core::num>) as{TypeError} (core::int, core::double) → core::double);
-  self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeIII(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDD(new self::C::•().{self::C::m}<core::double>);
-  self::takeNNN(new self::C::•().{self::C::m}<core::num>);
-  self::takeIDN(new self::C::•().{self::C::m}<core::num>);
-  self::takeDIN(new self::C::•().{self::C::m}<core::num>);
-  self::takeIIN(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDN(new self::C::•().{self::C::m}<core::double>);
-  self::takeIIO(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDO(new self::C::•().{self::C::m}<core::double>);
-  self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDD(new self::C::•().{self::C::m}<core::double*>);
+  self::takeNNN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeIDN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeDIN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeIIN(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDN(new self::C::•().{self::C::m}<core::double*>);
+  self::takeIIO(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDO(new self::C::•().{self::C::m}<core::double*>);
+  self::takeOON((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOI((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
           . /*@target=C::m*/ m);
-                             ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                             ^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
           . /*@target=C::m*/ m);
-                             ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::int, core::double) → core::double);
+                             ^" in (new self::C::•().{self::C::m}<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 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 = tearoff math::max
+  #C2 = tearoff math::min
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
index 599ce81..b10198f 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart.strong.transformed.expect
@@ -34,92 +34,96 @@
 //
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 import "dart:math";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::num = core::num>(self::C::m::T x, self::C::m::T y) → self::C::m::T
+  method m<T extends core::num* = core::num*>(self::C::m::T* x, self::C::m::T* y) → self::C::m::T*
     return null;
 }
 static method test() → dynamic {
-  self::takeIII(math::max<core::int>);
-  self::takeDDD(math::max<core::double>);
-  self::takeNNN(math::max<core::num>);
-  self::takeIDN(math::max<core::num>);
-  self::takeDIN(math::max<core::num>);
-  self::takeIIN(math::max<core::int>);
-  self::takeDDN(math::max<core::double>);
-  self::takeIIO(math::max<core::int>);
-  self::takeDDO(math::max<core::double>);
-  self::takeOOI((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+  self::takeIII(#C1<core::int*>);
+  self::takeDDD(#C1<core::double*>);
+  self::takeNNN(#C1<core::num*>);
+  self::takeIDN(#C1<core::num*>);
+  self::takeDIN(#C1<core::num*>);
+  self::takeIIN(#C1<core::int*>);
+  self::takeDDN(#C1<core::double*>);
+  self::takeIIO(#C1<core::int*>);
+  self::takeDDO(#C1<core::double*>);
+  self::takeOOI((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t1 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (math::max<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t2 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
       /*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ math.max);
-                                                                        ^" in (math::max<core::num>) as{TypeError} (core::int, core::double) → core::double);
-  self::takeOON((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((math::max<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeIII(math::min<core::int>);
-  self::takeDDD(math::min<core::double>);
-  self::takeNNN(math::min<core::num>);
-  self::takeIDN(math::min<core::num>);
-  self::takeDIN(math::min<core::num>);
-  self::takeIIN(math::min<core::int>);
-  self::takeDDN(math::min<core::double>);
-  self::takeIIO(math::min<core::int>);
-  self::takeDDO(math::min<core::double>);
-  self::takeOOI((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+                                                                        ^" in (#C1<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C1<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(#C2<core::int*>);
+  self::takeDDD(#C2<core::double*>);
+  self::takeNNN(#C2<core::num*>);
+  self::takeIDN(#C2<core::num*>);
+  self::takeDIN(#C2<core::num*>);
+  self::takeIIN(#C2<core::int*>);
+  self::takeDDN(#C2<core::double*>);
+  self::takeIIO(#C2<core::int*>);
+  self::takeDDO(#C2<core::double*>);
+  self::takeOOI((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t3 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
   takeIDI(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (math::min<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t4 = 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)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
   takeDID(/*error:COULD_NOT_INFER,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ min);
-                                                                       ^" in (math::min<core::num>) as{TypeError} (core::int, core::double) → core::double);
-  self::takeOON((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((math::min<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeIII(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDD(new self::C::•().{self::C::m}<core::double>);
-  self::takeNNN(new self::C::•().{self::C::m}<core::num>);
-  self::takeIDN(new self::C::•().{self::C::m}<core::num>);
-  self::takeDIN(new self::C::•().{self::C::m}<core::num>);
-  self::takeIIN(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDN(new self::C::•().{self::C::m}<core::double>);
-  self::takeIIO(new self::C::•().{self::C::m}<core::int>);
-  self::takeDDO(new self::C::•().{self::C::m}<core::double>);
-  self::takeOON((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOO((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::num);
-  self::takeOOI((new self::C::•().{self::C::m}<core::Object>) as{TypeError} (core::Object, core::Object) → core::int);
+                                                                       ^" in (#C2<core::num*>) as{TypeError} (core::int*, core::double*) →* core::double*);
+  self::takeOON((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((#C2<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeIII(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDD(new self::C::•().{self::C::m}<core::double*>);
+  self::takeNNN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeIDN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeDIN(new self::C::•().{self::C::m}<core::num*>);
+  self::takeIIN(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDN(new self::C::•().{self::C::m}<core::double*>);
+  self::takeIIO(new self::C::•().{self::C::m}<core::int*>);
+  self::takeDDO(new self::C::•().{self::C::m}<core::double*>);
+  self::takeOON((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOO((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::num*);
+  self::takeOOI((new self::C::•().{self::C::m}<core::Object*>) as{TypeError} (core::Object*, core::Object*) →* core::int*);
   self::takeIDI(let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:86:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'int Function(double, int)'.
 Try changing the type of the parameter, or casting the argument to 'int Function(double, int)'.
           . /*@target=C::m*/ m);
-                             ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::double, core::int) → core::int);
+                             ^" in (new self::C::•().{self::C::m}<core::num*>) as{TypeError} (core::double*, core::int*) →* core::int*);
   self::takeDID(let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_infer_generic_instantiation.dart:89:30: Error: The argument type 'num Function(num, num)' can't be assigned to the parameter type 'double Function(int, double)'.
 Try changing the type of the parameter, or casting the argument to 'double Function(int, double)'.
           . /*@target=C::m*/ m);
-                             ^" in (new self::C::•().{self::C::m}<core::num>) as{TypeError} (core::int, core::double) → core::double);
+                             ^" in (new self::C::•().{self::C::m}<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 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 = tearoff math::max
+  #C2 = tearoff math::min
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect
index 0500661..a715e41 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
+  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::•().m<core::int>(42);
+  core::int* y = new self::D::•().m<core::int*>(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect
index 0500661..a715e41 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
+  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::•().m<core::int>(42);
+  core::int* y = new self::D::•().m<core::int*>(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
index 6641267..c47ff56 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
+  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* y = new self::D::•().{self::D::m}<core::int*>(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
index 6641267..c47ff56 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_generic_method_type.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m<S extends core::Object = dynamic>(self::D::m::S x) → self::D::m::S
+  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* y = new self::D::•().{self::D::m}<core::int*>(42);
   core::print(y);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect
index 24d0db0..a685b6a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.expect
@@ -20,8 +20,15 @@
 import "dart:_foreign_helper";
 
 static method main() → dynamic {
-  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  core::String* x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   y = "world";
   y = 42;
 }
+
+constants  {
+  #C1 = #JS
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect
index 24d0db0..a685b6a 100644
--- a/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_infer_js_builtin.dart.legacy.transformed.expect
@@ -20,8 +20,15 @@
 import "dart:_foreign_helper";
 
 static method main() → dynamic {
-  core::String x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#JS, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  core::String* x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["int", "42"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  dynamic y = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["String", "\"hello\""]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   y = "world";
   y = 42;
 }
+
+constants  {
+  #C1 = #JS
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart
index 8f45010..2a539d9 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart
@@ -7,8 +7,8 @@
 
 void f() {
   List<String> y;
-  Iterable<String> x = y. /*@typeArgs=String*/ /*@target=Iterable::map*/ map(
-      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
+  Iterable<String> x = y. /*@ typeArgs=String* */ /*@target=Iterable::map*/ map(
+      /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
               z) =>
           1.0);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect
index c884e38..9e482ab 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → void {
-  core::List<core::String> y;
-  core::Iterable<core::String> x = y.map((core::String z) → dynamic => 1.0);
+  core::List<core::String*>* y;
+  core::Iterable<core::String*>* x = y.map((core::String* z) → dynamic => 1.0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect
index c884e38..9e482ab 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → void {
-  core::List<core::String> y;
-  core::Iterable<core::String> x = y.map((core::String z) → dynamic => 1.0);
+  core::List<core::String*>* y;
+  core::Iterable<core::String*>* x = y.map((core::String* z) → dynamic => 1.0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
index 9b6c3be..ab233fa 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.expect
@@ -11,10 +11,10 @@
 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 => let final<BottomType> #t1 = 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'.
+  core::List<core::String*>* y;
+  core::Iterable<core::String*>* x = y.{core::Iterable::map}<core::String*>((core::String* z) → core::String* => let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
           1.0);
-          ^" in 1.0 as{TypeError} core::String);
+          ^" in 1.0 as{TypeError} core::String*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
index 9b6c3be..ab233fa 100644
--- a/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_inference_error.dart.strong.transformed.expect
@@ -11,10 +11,10 @@
 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 => let final<BottomType> #t1 = 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'.
+  core::List<core::String*>* y;
+  core::Iterable<core::String*>* x = y.{core::Iterable::map}<core::String*>((core::String* z) → core::String* => let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
           1.0);
-          ^" in 1.0 as{TypeError} core::String);
+          ^" in 1.0 as{TypeError} core::String*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart
index ab84ffd..cc0946b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart
@@ -7,40 +7,40 @@
 
 import 'dart:async';
 
-Future<int> make(int x) => (new /*@typeArgs=int*/ Future(
-    /*@returnType=int*/ () => x));
+Future<int> make(int x) => (new /*@ typeArgs=int* */ Future(
+    /*@ returnType=int* */ () => x));
 
 test() {
   Iterable<Future<int>> list = <int>[1, 2, 3]
-      . /*@typeArgs=Future<int>*/ /*@target=Iterable::map*/ map(make);
-  Future<List<int>> results = Future. /*@typeArgs=int*/ wait(list);
+      . /*@ typeArgs=Future<int*>* */ /*@target=Iterable::map*/ map(make);
+  Future<List<int>> results = Future. /*@ typeArgs=int* */ wait(list);
   Future<String> results2 =
-      results. /*@typeArgs=String*/ /*@target=Future::then*/ then(
-          /*@returnType=FutureOr<String>*/ (List<int> list) => list
-              . /*@typeArgs=FutureOr<String>*/ /*@target=Iterable::fold*/ fold(
+      results. /*@ typeArgs=String* */ /*@target=Future::then*/ then(
+          /*@ returnType=FutureOr<String*>* */ (List<int> list) => list
+              . /*@ typeArgs=FutureOr<String*>* */ /*@target=Iterable::fold*/ fold(
                   '',
-                  /*@returnType=FutureOr<String>*/ (/*@type=FutureOr<String>*/ x,
-                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+                  /*@ returnType=FutureOr<String*>* */ (/*@ type=FutureOr<String*>* */ x,
+                          /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
                       y. /*@target=int::toString*/ toString()));
 
   Future<String> results3 =
-      results. /*@typeArgs=String*/ /*@target=Future::then*/ then(
-          /*@returnType=FutureOr<String>*/ (List<int> list) => list
-              . /*@typeArgs=FutureOr<String>*/ /*@target=Iterable::fold*/ fold(
+      results. /*@ typeArgs=String* */ /*@target=Future::then*/ then(
+          /*@ returnType=FutureOr<String*>* */ (List<int> list) => list
+              . /*@ typeArgs=FutureOr<String*>* */ /*@target=Iterable::fold*/ fold(
                   '',
-                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
+                  /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
                               x,
-                          /*@type=int*/ y) =>
+                          /*@ type=int* */ y) =>
                       x /*@target=String::+*/ +
                       y. /*@target=int::toString*/ toString()));
 
   Future<String> results4 =
-      results. /*@typeArgs=String*/ /*@target=Future::then*/ then(
-          /*@returnType=String*/ (List<int> list) =>
+      results. /*@ typeArgs=String* */ /*@target=Future::then*/ then(
+          /*@ returnType=String* */ (List<int> list) =>
               list. /*@target=Iterable::fold*/ fold<String>(
                   '',
-                  /*@returnType=String*/ (/*@type=String*/ x,
-                          /*@type=int*/ y) =>
+                  /*@ returnType=String* */ (/*@ type=String* */ x,
+                          /*@ type=int* */ y) =>
                       x /*@target=String::+*/ +
                       y. /*@target=int::toString*/ toString()));
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect
index b8c72dc..cfae823 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.expect
@@ -5,13 +5,17 @@
 
 import "dart:async";
 
-static method make(core::int x) → asy::Future<core::int>
+static method make(core::int* x) → asy::Future<core::int*>*
   return asy::Future::•<dynamic>(() → dynamic => x);
 static method test() → dynamic {
-  core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].map(self::make);
-  asy::Future<core::List<core::int>> results = asy::Future::wait<dynamic>(list);
-  asy::Future<core::String> results2 = results.then((core::List<core::int> list) → dynamic => list.fold("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
-  asy::Future<core::String> results3 = results.then((core::List<core::int> list) → dynamic => list.fold("", (core::String x, dynamic y) → dynamic => x.+(y.toString())));
-  asy::Future<core::String> results4 = results.then((core::List<core::int> list) → dynamic => list.fold<core::String>("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
+  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].map(#C1);
+  asy::Future<core::List<core::int*>*>* results = asy::Future::wait<dynamic>(list);
+  asy::Future<core::String*>* results2 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
+  asy::Future<core::String*>* results3 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (core::String* x, dynamic y) → dynamic => x.+(y.toString())));
+  asy::Future<core::String*>* results4 = results.then((core::List<core::int*>* list) → dynamic => list.fold<core::String*>("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::make
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect
index b8c72dc..cfae823 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.legacy.transformed.expect
@@ -5,13 +5,17 @@
 
 import "dart:async";
 
-static method make(core::int x) → asy::Future<core::int>
+static method make(core::int* x) → asy::Future<core::int*>*
   return asy::Future::•<dynamic>(() → dynamic => x);
 static method test() → dynamic {
-  core::Iterable<asy::Future<core::int>> list = <core::int>[1, 2, 3].map(self::make);
-  asy::Future<core::List<core::int>> results = asy::Future::wait<dynamic>(list);
-  asy::Future<core::String> results2 = results.then((core::List<core::int> list) → dynamic => list.fold("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
-  asy::Future<core::String> results3 = results.then((core::List<core::int> list) → dynamic => list.fold("", (core::String x, dynamic y) → dynamic => x.+(y.toString())));
-  asy::Future<core::String> results4 = results.then((core::List<core::int> list) → dynamic => list.fold<core::String>("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
+  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].map(#C1);
+  asy::Future<core::List<core::int*>*>* results = asy::Future::wait<dynamic>(list);
+  asy::Future<core::String*>* results2 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
+  asy::Future<core::String*>* results3 = results.then((core::List<core::int*>* list) → dynamic => list.fold("", (core::String* x, dynamic y) → dynamic => x.+(y.toString())));
+  asy::Future<core::String*>* results4 = results.then((core::List<core::int*>* list) → dynamic => list.fold<core::String*>("", (dynamic x, dynamic y) → dynamic => x.+(y.toString())));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::make
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
index 6181d32..cf8de52 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try correcting the name to the name of an existing method, or defining a method named '+'.
-//                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_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:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+// 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)'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
-//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
-//                                                                                                            ^
+//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
+//                                                                                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,21 +20,25 @@
 
 import "dart:async";
 
-static method make(core::int x) → asy::Future<core::int>
-  return asy::Future::•<core::int>(() → core::int => x);
+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>>(self::make);
-  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) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
+  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) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
  - 'FutureOr' is from 'dart:async'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
-                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
-                                                                                                                       ^" as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+                          /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+                                                                                                                          ^" as{TypeError} asy::FutureOr<core::String*>*));
+  asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = 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)'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to '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}())) as{TypeError} (asy::FutureOr<core::String>, core::int) → asy::FutureOr<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}())));
+                  /*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}())) as{TypeError} (asy::FutureOr<core::String*>*, core::int*) →* asy::FutureOr<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}())));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::make
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
index 6181d32..cf8de52 100644
--- a/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+// pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try correcting the name to the name of an existing method, or defining a method named '+'.
-//                           /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_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:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+// 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)'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the parameter, or casting the argument to 'FutureOr<String> Function(FutureOr<String>, int)'.
-//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@returnType=String*/ (String
-//                                                                                                            ^
+//                   /*info:INFERRED_TYPE_CLOSURE,error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ /*@ returnType=String* */ (String
+//                                                                                                               ^
 //
 import self as self;
 import "dart:core" as core;
@@ -20,21 +20,25 @@
 
 import "dart:async";
 
-static method make(core::int x) → asy::Future<core::int>
-  return asy::Future::•<core::int>(() → core::int => x);
+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>>(self::make);
-  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) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", (asy::FutureOr<core::String> x, core::int y) → asy::FutureOr<core::String> => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:120: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
+  core::Iterable<asy::Future<core::int*>*>* list = <core::int*>[1, 2, 3].{core::Iterable::map}<asy::Future<core::int*>*>(#C1);
+  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) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", (asy::FutureOr<core::String*>* x, core::int* y) → asy::FutureOr<core::String*>* => invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:23:123: Error: The method '+' isn't defined for the class 'FutureOr<String>'.
  - 'FutureOr' is from 'dart:async'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
-                          /*@type=int*/ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
-                                                                                                                       ^" as{TypeError} asy::FutureOr<core::String>));
-  asy::Future<core::String> results3 = results.{asy::Future::then}<core::String>((core::List<core::int> list) → asy::FutureOr<core::String> => list.{core::Iterable::fold}<asy::FutureOr<core::String>>("", let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/generic_methods_iterable_and_future.dart:31:108: Error: The argument type 'String Function(String, int)' can't be assigned to the parameter type 'FutureOr<String> Function(FutureOr<String>, int)'.
+                          /*@ type=int* */ y) => /*info:DYNAMIC_CAST,info:DYNAMIC_INVOKE*/ x /*error:UNDEFINED_OPERATOR*/ +
+                                                                                                                          ^" as{TypeError} asy::FutureOr<core::String*>*));
+  asy::Future<core::String*>* results3 = results.{asy::Future::then}<core::String*>((core::List<core::int*>* list) → asy::FutureOr<core::String*>* => list.{core::Iterable::fold}<asy::FutureOr<core::String*>*>("", let final<BottomType> #t1 = 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)'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the parameter, or casting the argument to '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}())) as{TypeError} (asy::FutureOr<core::String>, core::int) → asy::FutureOr<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}())));
+                  /*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}())) as{TypeError} (asy::FutureOr<core::String*>*, core::int*) →* asy::FutureOr<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}())));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::make
+}
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart
index 3872e03..647867b 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart
@@ -8,7 +8,7 @@
 import 'dart:math' as math;
 
 class Trace {
-  List<Frame> frames = /*@typeArgs=Frame*/ [];
+  List<Frame> frames = /*@ typeArgs=Frame* */ [];
 }
 
 class Frame {
@@ -16,15 +16,15 @@
 }
 
 main() {
-  List<Trace> traces = /*@typeArgs=Trace*/ [];
-  var /*@type=int*/ longest =
-      traces. /*@typeArgs=int*/ /*@target=Iterable::map*/ map(
-          /*@returnType=int*/ (/*@type=Trace*/ trace) {
+  List<Trace> traces = /*@ typeArgs=Trace* */ [];
+  var /*@ type=int* */ longest =
+      traces. /*@ typeArgs=int* */ /*@target=Iterable::map*/ map(
+          /*@ returnType=int* */ (/*@ type=Trace* */ trace) {
     return trace. /*@target=Trace::frames*/ frames
-        . /*@typeArgs=int*/ /*@target=Iterable::map*/ map(
-            /*@returnType=int*/ (/*@type=Frame*/ frame) => frame
+        . /*@ typeArgs=int* */ /*@target=Iterable::map*/ map(
+            /*@ returnType=int* */ (/*@ type=Frame* */ frame) => frame
                 . /*@target=Frame::location*/ location
                 . /*@target=String::length*/ length)
-        . /*@typeArgs=int*/ /*@target=Iterable::fold*/ fold(0, math.max);
-  }). /*@typeArgs=int*/ /*@target=Iterable::fold*/ fold(0, math.max);
+        . /*@ typeArgs=int* */ /*@target=Iterable::fold*/ fold(0, math.max);
+  }). /*@ typeArgs=int* */ /*@target=Iterable::fold*/ fold(0, math.max);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
index 260f1f1..8490078 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.expect
@@ -1,25 +1,28 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 
 class Trace extends core::Object {
-  field core::List<self::Frame> frames = <self::Frame>[];
-  synthetic constructor •() → self::Trace
+  field core::List<self::Frame*>* frames = <self::Frame*>[];
+  synthetic constructor •() → self::Trace*
     : super core::Object::•()
     ;
 }
 class Frame extends core::Object {
-  field core::String location = "";
-  synthetic constructor •() → self::Frame
+  field core::String* location = "";
+  synthetic constructor •() → self::Frame*
     : super core::Object::•()
     ;
 }
 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::Iterable::map}<core::int>((self::Frame frame) → core::int => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
-  }).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
+  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::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int*>(0, #C1<core::int*>);
+  }).{core::Iterable::fold}<core::int*>(0, #C1<core::int*>);
+}
+
+constants  {
+  #C1 = tearoff math::max
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
index 260f1f1..8490078 100644
--- a/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_nested_generic_instantiation.dart.strong.transformed.expect
@@ -1,25 +1,28 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "dart:math" as math;
 
 import "dart:math" as math;
 
 class Trace extends core::Object {
-  field core::List<self::Frame> frames = <self::Frame>[];
-  synthetic constructor •() → self::Trace
+  field core::List<self::Frame*>* frames = <self::Frame*>[];
+  synthetic constructor •() → self::Trace*
     : super core::Object::•()
     ;
 }
 class Frame extends core::Object {
-  field core::String location = "";
-  synthetic constructor •() → self::Frame
+  field core::String* location = "";
+  synthetic constructor •() → self::Frame*
     : super core::Object::•()
     ;
 }
 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::Iterable::map}<core::int>((self::Frame frame) → core::int => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
-  }).{core::Iterable::fold}<core::int>(0, math::max<core::int>);
+  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::Iterable::map}<core::int*>((self::Frame* frame) → core::int* => frame.{self::Frame::location}.{core::String::length}).{core::Iterable::fold}<core::int*>(0, #C1<core::int*>);
+  }).{core::Iterable::fold}<core::int*>(0, #C1<core::int*>);
+}
+
+constants  {
+  #C1 = tearoff math::max
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
index a7235c9..be4bd21 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart
@@ -11,7 +11,7 @@
 T generic<T>(a(T _), b(T _)) => null;
 
 main() {
-  var /*@type=(num) -> List<int>*/ v = /*@typeArgs=(num) -> List<int>*/ generic(
-      /*@returnType=Null*/ (F f) => null,
-      /*@returnType=Null*/ (G g) => null);
+  var /*@ type=(num*) ->* List<int*>* */ v = /*@ typeArgs=(num*) ->* List<int*>* */ generic(
+      /*@ returnType=Null* */ (F f) => null,
+      /*@ returnType=Null* */ (G g) => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect
index cdb7f17..c8d4275 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.expect
@@ -2,10 +2,10 @@
 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
+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 {
-  dynamic v = self::generic<dynamic>(((core::int) → core::Iterable<core::num> f) → dynamic => null, ((core::double) → core::List<core::int> g) → dynamic => null);
+  dynamic v = self::generic<dynamic>(((core::int*) →* core::Iterable<core::num*>* f) → dynamic => null, ((core::double*) →* core::List<core::int*>* g) → dynamic => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect
index cdb7f17..c8d4275 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 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
+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 {
-  dynamic v = self::generic<dynamic>(((core::int) → core::Iterable<core::num> f) → dynamic => null, ((core::double) → core::List<core::int> g) → dynamic => null);
+  dynamic v = self::generic<dynamic>(((core::int*) →* core::Iterable<core::num*>* f) → dynamic => null, ((core::double*) →* core::List<core::int*>* g) → dynamic => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
index cd5eddc..e8ba7cf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.expect
@@ -2,10 +2,10 @@
 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
+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) → core::Null => null, ((core::double) → core::List<core::int> g) → core::Null => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null* => null, ((core::double*) →* core::List<core::int*>* g) → core::Null* => null);
 }
diff --git a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
index cd5eddc..e8ba7cf 100644
--- a/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/generic_methods_uses_greatest_lower_bound.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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
+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) → core::Null => null, ((core::double) → core::List<core::int> g) → core::Null => null);
+  (core::num*) →* core::List<core::int*>* v = self::generic<(core::num*) →* core::List<core::int*>*>(((core::int*) →* core::Iterable<core::num*>* f) → core::Null* => null, ((core::double*) →* core::List<core::int*>* g) → core::Null* => null);
 }
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
index 687fbf7..68a2344 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart
@@ -7,7 +7,7 @@
 
 abstract class C<E> {
   void sort([int compare(E a, E b)]) {
-    /*@typeArgs=C::E*/ sort2(this, compare ?? _compareAny);
+    /*@ typeArgs=C::E* */ sort2(this, compare ?? _compareAny);
   }
 
   static int _compareAny(a, b) {
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect
index 690aad1..1deed2f 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.expect
@@ -2,18 +2,23 @@
 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>
+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 = null]) → void {
-    self::C::sort2<dynamic>(this, let final dynamic #t1 = compare in #t1.==(null) ? self::C::_compareAny : #t1);
+  method sort([(self::C::E*, self::C::E*) →* core::int* compare = #C1]) → void {
+    self::C::sort2<dynamic>(this, let final dynamic #t1 = compare in #t1.==(null) ? #C2 : #t1);
   }
-  static method _compareAny(dynamic a, dynamic b) → core::int {
+  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 {
+  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";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = tearoff self::C::_compareAny
+}
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect
index 690aad1..1deed2f 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.legacy.transformed.expect
@@ -2,18 +2,23 @@
 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>
+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 = null]) → void {
-    self::C::sort2<dynamic>(this, let final dynamic #t1 = compare in #t1.==(null) ? self::C::_compareAny : #t1);
+  method sort([(self::C::E*, self::C::E*) →* core::int* compare = #C1]) → void {
+    self::C::sort2<dynamic>(this, let final dynamic #t1 = compare in #t1.==(null) ? #C2 : #t1);
   }
-  static method _compareAny(dynamic a, dynamic b) → core::int {
+  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 {
+  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";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = tearoff self::C::_compareAny
+}
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
index 2205855..95e9a4e 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.outline.expect
@@ -2,14 +2,14 @@
 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>
+abstract class C<E extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::E*>*
     ;
-  method sort([(self::C::E, self::C::E) → core::int compare]) → void
+  method sort([(self::C::E*, self::C::E*) →* core::int* compare]) → void
     ;
-  static method _compareAny(dynamic a, dynamic b) → core::int
+  static method _compareAny(dynamic a, dynamic b) → core::int*
     ;
-  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
+  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
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
index 69d3ccf..d7c1006 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.expect
@@ -2,18 +2,23 @@
 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>
+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 = null]) → 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} self::C::_compareAny : #t1);
+  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 {
+  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 {
+  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";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = tearoff self::C::_compareAny
+}
diff --git a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
index 69d3ccf..d7c1006 100644
--- a/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/greatest_closure_multiple_params.dart.strong.transformed.expect
@@ -2,18 +2,23 @@
 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>
+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 = null]) → 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} self::C::_compareAny : #t1);
+  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 {
+  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 {
+  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";
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = tearoff self::C::_compareAny
+}
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.expect
index d8b5742..bf74c35 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.expect
@@ -36,27 +36,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f(self::A x, {self::A y = null}) → self::A {}
-  method g(self::A x, {self::A y = null}) → self::A {}
-  method h(self::A x, {self::A y = null}) → self::A {}
+  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* {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  method f(invalid-type x, {invalid-type y = null}) → invalid-type {}
-  method g(invalid-type x, {invalid-type y = null}) → self::A {}
-  method h(self::A x, {invalid-type y = null}) → self::A {}
+  method f(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+  method g(invalid-type x, {invalid-type y = #C1}) → self::A* {}
+  method h(self::A* x, {invalid-type y = #C1}) → self::A* {}
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method f(self::I x, {self::I y = null}) → self::I {}
-  method g(self::I x, {self::I y = null}) → self::A {}
-  method h(self::A x, {self::I y = null}) → self::A {}
+  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* {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.transformed.expect
index d8b5742..bf74c35 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.legacy.transformed.expect
@@ -36,27 +36,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f(self::A x, {self::A y = null}) → self::A {}
-  method g(self::A x, {self::A y = null}) → self::A {}
-  method h(self::A x, {self::A y = null}) → self::A {}
+  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* {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  method f(invalid-type x, {invalid-type y = null}) → invalid-type {}
-  method g(invalid-type x, {invalid-type y = null}) → self::A {}
-  method h(self::A x, {invalid-type y = null}) → self::A {}
+  method f(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+  method g(invalid-type x, {invalid-type y = #C1}) → self::A* {}
+  method h(self::A* x, {invalid-type y = #C1}) → self::A* {}
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method f(self::I x, {self::I y = null}) → self::I {}
-  method g(self::I x, {self::I y = null}) → self::A {}
-  method h(self::A x, {self::I y = null}) → self::A {}
+  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* {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
index 26eafa0..845ab16 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.outline.expect
@@ -36,33 +36,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method f(self::A x, {self::A y}) → self::A
+  method f(self::A* x, {self::A* y}) → self::A*
     ;
-  method g(self::A x, {self::A y}) → self::A
+  method g(self::A* x, {self::A* y}) → self::A*
     ;
-  method h(self::A x, {self::A y}) → self::A
+  method h(self::A* x, {self::A* y}) → self::A*
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method f(invalid-type x, {invalid-type y}) → invalid-type
     ;
-  method g(invalid-type x, {invalid-type y}) → self::A
+  method g(invalid-type x, {invalid-type y}) → self::A*
     ;
-  method h(self::A x, {invalid-type y}) → self::A
+  method h(self::A* x, {invalid-type y}) → self::A*
     ;
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  method f(self::I x, {self::I y}) → self::I
+  method f(self::I* x, {self::I* y}) → self::I*
     ;
-  method g(self::I x, {self::I y}) → self::A
+  method g(self::I* x, {self::I* y}) → self::A*
     ;
-  method h(self::A x, {self::I y}) → self::A
+  method h(self::A* x, {self::I* y}) → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
index d8b5742..bf74c35 100644
--- a/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inconsistent_overrides.dart.strong.expect
@@ -36,27 +36,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f(self::A x, {self::A y = null}) → self::A {}
-  method g(self::A x, {self::A y = null}) → self::A {}
-  method h(self::A x, {self::A y = null}) → self::A {}
+  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* {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  method f(invalid-type x, {invalid-type y = null}) → invalid-type {}
-  method g(invalid-type x, {invalid-type y = null}) → self::A {}
-  method h(self::A x, {invalid-type y = null}) → self::A {}
+  method f(invalid-type x, {invalid-type y = #C1}) → invalid-type {}
+  method g(invalid-type x, {invalid-type y = #C1}) → self::A* {}
+  method h(self::A* x, {invalid-type y = #C1}) → self::A* {}
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method f(self::I x, {self::I y = null}) → self::I {}
-  method g(self::I x, {self::I y = null}) → self::A {}
-  method h(self::A x, {self::I y = null}) → self::A {}
+  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* {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect
index ba7aef9..d3d5c81 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect
index ba7aef9..d3d5c81 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.legacy.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
index ef008c4..8824dd4 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   operator []=(dynamic index, dynamic value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
   operator []=(dynamic index, dynamic value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   operator []=(dynamic index, dynamic value) → void
     ;
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
index ba7aef9..d3d5c81 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
index ba7aef9..d3d5c81 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type.dart.strong.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   operator []=(dynamic index, dynamic value) → void {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect
index 587faf3..ccbc46f 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect
index 587faf3..ccbc46f 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
index 68f38e5..ae3281e 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  operator []=(core::int index, dynamic value) → dynamic
+  operator []=(core::int* index, dynamic value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  operator []=(core::int index, dynamic value) → void
+  operator []=(core::int* index, dynamic value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  operator []=(core::int index, dynamic value) → void
+  operator []=(core::int* index, dynamic value) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
index 587faf3..ccbc46f 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
index 587faf3..ccbc46f 100644
--- a/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/index_assign_operator_return_type_2.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → dynamic {}
+  operator []=(core::int* index, dynamic value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  operator []=(core::int* index, dynamic value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  operator []=(core::int index, dynamic value) → void {}
+  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.legacy.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.expect
index f09f568..a90e457 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect
index f09f568..a90e457 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
index 1e5b585..4046a6c 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   get x() → dynamic
     ;
@@ -12,7 +12,7 @@
 }
 class B extends core::Object {
   field dynamic x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 static method f() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.expect
index 4ab5075..1abf208 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
-    return self::f() as{TypeError} core::int;
-  set x(core::int value) → void {}
+  get x() → core::int*
+    return self::f() as{TypeError} core::int*;
+  set x(core::int* value) → void {}
 }
 class B extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::B
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.transformed.expect
index 4ab5075..1abf208 100644
--- a/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_accessor_from_later_inferred_field.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
-    return self::f() as{TypeError} core::int;
-  set x(core::int value) → void {}
+  get x() → core::int*
+    return self::f() as{TypeError} core::int*;
+  set x(core::int* value) → void {}
 }
 class B extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::B
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
index 0ee742e..74bb832 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart
@@ -22,19 +22,19 @@
   B member;
 
   void test() {
-    /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     -- /*@target=Test::member*/ member;
     /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 = /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 = /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = -- /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 = /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 = /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = -- /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect
index a0aab3a..52e9652 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
   method test() → void {
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.transformed.expect
index a0aab3a..52e9652 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
   method test() → void {
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
index 6ffdc2b..d784a67 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
index 84f6b47..41cf1f1 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : null;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = this.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::B #t1 = this.{self::Test::member} in #t1.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : #t1;
-    self::B v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member} in #t1.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : #t1;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
index 84f6b47..41cf1f1 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this.dart.strong.transformed.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : null;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = this.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::B #t1 = this.{self::Test::member} in #t1.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : #t1;
-    self::B v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member} in #t1.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : #t1;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
index 7ea8048..d60a4c3 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart
@@ -13,11 +13,11 @@
   int t;
 
   void test() {
-    var /*@type=int*/ v1 = /*@target=Test1::t*/ t = getInt();
-    var /*@type=int*/ v4 = /*@target=Test1::t*/ t ??= getInt();
-    var /*@type=int*/ v7 = /*@target=Test1::t*/ t += getInt();
-    var /*@type=int*/ v10 = ++ /*@target=Test1::t*/ t;
-    var /*@type=int*/ v11 = /*@target=Test1::t*/ t++;
+    var /*@ type=int* */ v1 = /*@target=Test1::t*/ t = getInt();
+    var /*@ type=int* */ v4 = /*@target=Test1::t*/ t ??= getInt();
+    var /*@ type=int* */ v7 = /*@target=Test1::t*/ t += getInt();
+    var /*@ type=int* */ v10 = ++ /*@target=Test1::t*/ t;
+    var /*@ type=int* */ v11 = /*@target=Test1::t*/ t++;
   }
 }
 
@@ -25,17 +25,17 @@
   num t;
 
   void test() {
-    var /*@type=int*/ v1 = /*@target=Test2::t*/ t = getInt();
-    var /*@type=num*/ v2 = /*@target=Test2::t*/ t = getNum();
-    var /*@type=double*/ v3 = /*@target=Test2::t*/ t = getDouble();
-    var /*@type=num*/ v4 = /*@target=Test2::t*/ t ??= getInt();
-    var /*@type=num*/ v5 = /*@target=Test2::t*/ t ??= getNum();
-    var /*@type=num*/ v6 = /*@target=Test2::t*/ t ??= getDouble();
-    var /*@type=num*/ v7 = /*@target=Test2::t*/ t += getInt();
-    var /*@type=num*/ v8 = /*@target=Test2::t*/ t += getNum();
-    var /*@type=num*/ v9 = /*@target=Test2::t*/ t += getDouble();
-    var /*@type=num*/ v10 = ++ /*@target=Test2::t*/ t;
-    var /*@type=num*/ v11 = /*@target=Test2::t*/ t++;
+    var /*@ type=int* */ v1 = /*@target=Test2::t*/ t = getInt();
+    var /*@ type=num* */ v2 = /*@target=Test2::t*/ t = getNum();
+    var /*@ type=double* */ v3 = /*@target=Test2::t*/ t = getDouble();
+    var /*@ type=num* */ v4 = /*@target=Test2::t*/ t ??= getInt();
+    var /*@ type=num* */ v5 = /*@target=Test2::t*/ t ??= getNum();
+    var /*@ type=num* */ v6 = /*@target=Test2::t*/ t ??= getDouble();
+    var /*@ type=num* */ v7 = /*@target=Test2::t*/ t += getInt();
+    var /*@ type=num* */ v8 = /*@target=Test2::t*/ t += getNum();
+    var /*@ type=num* */ v9 = /*@target=Test2::t*/ t += getDouble();
+    var /*@ type=num* */ v10 = ++ /*@target=Test2::t*/ t;
+    var /*@ type=num* */ v11 = /*@target=Test2::t*/ t++;
   }
 }
 
@@ -43,13 +43,13 @@
   double t;
 
   void test3() {
-    var /*@type=double*/ v3 = /*@target=Test3::t*/ t = getDouble();
-    var /*@type=double*/ v6 = /*@target=Test3::t*/ t ??= getDouble();
-    var /*@type=double*/ v7 = /*@target=Test3::t*/ t += getInt();
-    var /*@type=double*/ v8 = /*@target=Test3::t*/ t += getNum();
-    var /*@type=double*/ v9 = /*@target=Test3::t*/ t += getDouble();
-    var /*@type=double*/ v10 = ++ /*@target=Test3::t*/ t;
-    var /*@type=double*/ v11 = /*@target=Test3::t*/ t++;
+    var /*@ type=double* */ v3 = /*@target=Test3::t*/ t = getDouble();
+    var /*@ type=double* */ v6 = /*@target=Test3::t*/ t ??= getDouble();
+    var /*@ type=double* */ v7 = /*@target=Test3::t*/ t += getInt();
+    var /*@ type=double* */ v8 = /*@target=Test3::t*/ t += getNum();
+    var /*@ type=double* */ v9 = /*@target=Test3::t*/ t += getDouble();
+    var /*@ type=double* */ v10 = ++ /*@target=Test3::t*/ t;
+    var /*@ type=double* */ v11 = /*@target=Test3::t*/ t++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect
index 41103fb..89edc17 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
   method test() → void {
@@ -16,8 +16,8 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
   method test() → void {
@@ -35,8 +35,8 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
   method test3() → void {
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t10 = this.{self::Test3::t} in let final dynamic #t11 = this.{self::Test3::t} = #t10.+(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
index 41103fb..89edc17 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
   method test() → void {
@@ -16,8 +16,8 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
   method test() → void {
@@ -35,8 +35,8 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
   method test3() → void {
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t10 = this.{self::Test3::t} in let final dynamic #t11 = this.{self::Test3::t} = #t10.+(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.outline.expect
index 865d1dd..72b8d61 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t;
-  synthetic constructor •() → self::Test1
+  field core::int* t;
+  synthetic constructor •() → self::Test1*
     ;
   method test() → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num t;
-  synthetic constructor •() → self::Test2
+  field core::num* t;
+  synthetic constructor •() → self::Test2*
     ;
   method test() → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double t;
-  synthetic constructor •() → self::Test3
+  field core::double* t;
+  synthetic constructor •() → self::Test3*
     ;
   method test3() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.expect
index 6316d7b..5f29204 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Test1::t} = self::getInt() : #t1;
-    core::int v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
-    core::int v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
-    core::int v11 = let final core::int #t2 = this.{self::Test1::t} in let final core::int #t3 = this.{self::Test1::t} = #t2.{core::num::+}(1) in #t2;
+    core::int* v1 = this.{self::Test1::t} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = this.{self::Test1::t} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::int* v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
+    core::int* v11 = let final core::int* #t2 = this.{self::Test1::t} in let final core::int* #t3 = this.{self::Test1::t} = #t2.{core::num::+}(1) in #t2;
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  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} in #t4.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getInt() : #t4;
-    core::num v5 = let final core::num #t5 = this.{self::Test2::t} in #t5.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getNum() : #t5;
-    core::num v6 = let final core::num #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getDouble() : #t6;
-    core::num v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
-    core::num v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
-    core::num v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
-    core::num v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
-    core::num v11 = let final core::num #t7 = this.{self::Test2::t} in let final core::num #t8 = this.{self::Test2::t} = #t7.{core::num::+}(1) in #t7;
+    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} in #t4.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = this.{self::Test2::t} in #t5.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t6;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
+    core::num* v11 = let final core::num* #t7 = this.{self::Test2::t} in let final core::num* #t8 = this.{self::Test2::t} = #t7.{core::num::+}(1) in #t7;
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  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} in #t9.{core::num::==}(null) ?{core::double} this.{self::Test3::t} = self::getDouble() : #t9;
-    core::double v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
-    core::double v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
-    core::double v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
-    core::double v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
-    core::double v11 = let final core::double #t10 = this.{self::Test3::t} in let final core::double #t11 = this.{self::Test3::t} = #t10.{core::double::+}(1) in #t10;
+    core::double* v3 = this.{self::Test3::t} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = this.{self::Test3::t} in #t9.{core::num::==}(null) ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t9;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
+    core::double* v11 = let final core::double* #t10 = this.{self::Test3::t} in let final core::double* #t11 = this.{self::Test3::t} = #t10.{core::double::+}(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
index 6316d7b..5f29204 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Test1::t} = self::getInt() : #t1;
-    core::int v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
-    core::int v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
-    core::int v11 = let final core::int #t2 = this.{self::Test1::t} in let final core::int #t3 = this.{self::Test1::t} = #t2.{core::num::+}(1) in #t2;
+    core::int* v1 = this.{self::Test1::t} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = this.{self::Test1::t} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::int* v7 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getInt());
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
+    core::int* v11 = let final core::int* #t2 = this.{self::Test1::t} in let final core::int* #t3 = this.{self::Test1::t} = #t2.{core::num::+}(1) in #t2;
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  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} in #t4.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getInt() : #t4;
-    core::num v5 = let final core::num #t5 = this.{self::Test2::t} in #t5.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getNum() : #t5;
-    core::num v6 = let final core::num #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getDouble() : #t6;
-    core::num v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
-    core::num v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
-    core::num v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
-    core::num v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
-    core::num v11 = let final core::num #t7 = this.{self::Test2::t} in let final core::num #t8 = this.{self::Test2::t} = #t7.{core::num::+}(1) in #t7;
+    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} in #t4.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = this.{self::Test2::t} in #t5.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t6;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
+    core::num* v11 = let final core::num* #t7 = this.{self::Test2::t} in let final core::num* #t8 = this.{self::Test2::t} = #t7.{core::num::+}(1) in #t7;
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  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} in #t9.{core::num::==}(null) ?{core::double} this.{self::Test3::t} = self::getDouble() : #t9;
-    core::double v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
-    core::double v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
-    core::double v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
-    core::double v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
-    core::double v11 = let final core::double #t10 = this.{self::Test3::t} in let final core::double #t11 = this.{self::Test3::t} = #t10.{core::double::+}(1) in #t10;
+    core::double* v3 = this.{self::Test3::t} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = this.{self::Test3::t} in #t9.{core::num::==}(null) ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t9;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
+    core::double* v11 = let final core::double* #t10 = this.{self::Test3::t} in let final core::double* #t11 = this.{self::Test3::t} = #t10.{core::double::+}(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
index 5ed8088..16a2336 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart
@@ -25,27 +25,27 @@
   void operator []=(Index i, B v) {}
 
   void test() {
-    Test t = /*@typeArgs=Test*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+    Test t = /*@ typeArgs=Test* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 = t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 = t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect
index 9411634..018ec0e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final dynamic #t40 = #t38.[](#t39) in let final dynamic #t41 = #t38.[]=(#t39, #t40.-(1)) in #t40;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.transformed.expect
index 9411634..018ec0e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.legacy.transformed.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final dynamic #t40 = #t38.[](#t39) in let final dynamic #t41 = #t38.[]=(#t39, #t40.-(1)) in #t40;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
index b6e46f4..9f0fa38 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.outline.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
index 6dd75dd7..40716cc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t3 = self::f<self::B>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final self::Test #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t13) in #t13;
-    let final self::Test #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = self::f<self::B>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v2 = let final self::Test #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index) in #t23.{core::Object::==}(null) ?{self::B} let final self::B #t24 = self::f<self::B>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index, #t24) in #t24 : #t23;
-    self::B v4 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::C v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::C #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32) in #t32;
-    self::B v6 = let final self::Test #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::B #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index).{self::B::-}(1) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index, #t36) in #t36;
-    self::B v7 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40.{self::B::-}(1)) in #t40;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t3 = self::f<self::B*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final self::Test* #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index*, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B* #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t13) in #t13;
+    let final self::Test* #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index*, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = self::f<self::B*>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v2 = let final self::Test* #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B* #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index*) in #t23.{core::Object::==}(null) ?{self::B*} let final self::B* #t24 = self::f<self::B*>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index*, #t24) in #t24 : #t23;
+    self::B* v4 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::C* v5 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::C* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32) in #t32;
+    self::B* v6 = let final self::Test* #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::B* #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index*, #t36) in #t36;
+    self::B* v7 = let final self::Test* #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B* #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index*) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index*, #t40.{self::B::-}(1)) in #t40;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
index 6dd75dd7..40716cc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_full.dart.strong.transformed.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t3 = self::f<self::B>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final self::Test #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t13) in #t13;
-    let final self::Test #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = self::f<self::B>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v2 = let final self::Test #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index) in #t23.{core::Object::==}(null) ?{self::B} let final self::B #t24 = self::f<self::B>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index, #t24) in #t24 : #t23;
-    self::B v4 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::C v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::C #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32) in #t32;
-    self::B v6 = let final self::Test #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::B #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index).{self::B::-}(1) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index, #t36) in #t36;
-    self::B v7 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40.{self::B::-}(1)) in #t40;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t3 = self::f<self::B*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final self::Test* #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index*, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B* #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t13) in #t13;
+    let final self::Test* #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index*, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = self::f<self::B*>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v2 = let final self::Test* #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B* #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index*) in #t23.{core::Object::==}(null) ?{self::B*} let final self::B* #t24 = self::f<self::B*>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index*, #t24) in #t24 : #t23;
+    self::B* v4 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::C* v5 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::C* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32) in #t32;
+    self::B* v6 = let final self::Test* #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::B* #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index*, #t36) in #t36;
+    self::B* v7 = let final self::Test* #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B* #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index*) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index*, #t40.{self::B::-}(1)) in #t40;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
index c0ca8f1..0d41509 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart
@@ -28,29 +28,29 @@
 class Test extends Base {
   void test() {
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 =
-        --super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 =
-        super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 =
+        --super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 =
+        super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect
index 9e45673..665bac9 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.expect
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -58,6 +58,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = super.{self::Base::[]}(#t27) in let final dynamic #t29 = super.{self::Base::[]=}(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.transformed.expect
index 9e45673..665bac9 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.legacy.transformed.expect
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -58,6 +58,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = super.{self::Base::[]}(#t27) in let final dynamic #t29 = super.{self::Base::[]=}(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
index 35db856..918047c 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.outline.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
index bf2a14d..88446ef 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index, super.{self::Base::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index, super.{self::Base::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index, super.{self::Base::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index, super.{self::Base::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::B v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::C v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::B v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index).{self::B::-}(1) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
+    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index*, super.{self::Base::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index*, super.{self::Base::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index*, super.{self::Base::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index*, super.{self::Base::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::B* v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::C* v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C* #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::B* v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B* #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index*) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index*, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
index bf2a14d..88446ef 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_super.dart.strong.transformed.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index, super.{self::Base::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index, super.{self::Base::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index, super.{self::Base::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index, super.{self::Base::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::B v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::C v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::B v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index).{self::B::-}(1) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
+    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index*, super.{self::Base::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index*, super.{self::Base::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index*, super.{self::Base::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index*, super.{self::Base::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::B* v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::C* v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C* #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::B* v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B* #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index*) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index*, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
index f8952e4..539a43d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart
@@ -26,29 +26,29 @@
 
   void test() {
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 =
-        --this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 =
-        this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 =
+        --this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 =
+        this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect
index d1af2b7..87640e2 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
     this.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = self::f<dynamic>() in this.[](#t1).==(null) ? let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2 : null;
@@ -53,6 +53,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = this.[](#t27) in let final dynamic #t29 = this.[]=(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.transformed.expect
index d1af2b7..87640e2 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.legacy.transformed.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
     this.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = self::f<dynamic>() in this.[](#t1).==(null) ? let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2 : null;
@@ -53,6 +53,6 @@
     dynamic v7 = let final dynamic #t27 = self::f<dynamic>() in let final dynamic #t28 = this.[](#t27) in let final dynamic #t29 = this.[]=(#t27, #t28.-(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
index b6e46f4..9f0fa38 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.outline.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
index 9cc4643..cc540e8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index, this.{self::Test::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index, this.{self::Test::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index, this.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index, this.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::B v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::C v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::B v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index).{self::B::-}(1) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
+    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index*, this.{self::Test::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index*, this.{self::Test::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index*, this.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index*, this.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::B* v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::C* v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C* #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::B* v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B* #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index*) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
index 9cc4643..cc540e8 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index, this.{self::Test::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index, this.{self::Test::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index, this.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index, this.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::B v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::C v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::B v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index).{self::B::-}(1) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28.{self::B::-}(1)) in #t28;
+    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index*, this.{self::Test::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index*, this.{self::Test::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index*, this.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index*, this.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::B* v4 = let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::C* v5 = let final dynamic #t21 = self::f<dynamic>() in let final self::C* #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::B* v6 = let final dynamic #t24 = self::f<dynamic>() in let final self::B* #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v7 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index*) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28.{self::B::-}(1)) in #t28;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_local.dart
index 5b314151..d13afe6 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart
@@ -20,19 +20,19 @@
 
 void test() {
   B local;
-  local = /*@typeArgs=B*/ f();
-  local ??= /*@typeArgs=B*/ f();
-  local += /*@typeArgs=dynamic*/ f();
-  local *= /*@typeArgs=dynamic*/ f();
-  local &= /*@typeArgs=dynamic*/ f();
+  local = /*@ typeArgs=B* */ f();
+  local ??= /*@ typeArgs=B* */ f();
+  local += /*@ typeArgs=dynamic */ f();
+  local *= /*@ typeArgs=dynamic */ f();
+  local &= /*@ typeArgs=dynamic */ f();
   --local;
   local--;
-  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
-  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --local;
-  var /*@type=B*/ v7 = local--;
+  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = local ??= /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v4 = local *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = local &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --local;
+  var /*@ type=B* */ v7 = local--;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect
index 5540464..0c4e454 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
-  self::B local;
+  self::B* local;
   local = self::f<dynamic>();
   local.==(null) ? local = self::f<dynamic>() : null;
   local = local.+(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect
index 5540464..0c4e454 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.legacy.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
-  self::B local;
+  self::B* local;
   local = self::f<dynamic>();
   local.==(null) ? local = self::f<dynamic>() : null;
   local = local.+(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
index 59620a1..228191e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.outline.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
index 0d482b4..1762f98 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : null;
-  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B* local;
+  local = self::f<self::B*>();
+  local.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   local = local.{self::B::-}(1);
   local = local.{self::B::-}(1);
-  self::B v1 = local = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = local in #t1.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : #t1;
-  self::B v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = local = local.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = local in let final self::B #t3 = local = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::B* v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = local = local.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1) in #t2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
index 0d482b4..1762f98 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.strong.transformed.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : null;
-  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B* local;
+  local = self::f<self::B*>();
+  local.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   local = local.{self::B::-}(1);
   local = local.{self::B::-}(1);
-  self::B v1 = local = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = local in #t1.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : #t1;
-  self::B v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = local = local.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = local in let final self::B #t3 = local = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::B* v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = local = local.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1) in #t2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
index b6004bf..c9be4b0 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local.dart.type_promotion.expect
@@ -1,17 +1,17 @@
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:23:9: Context: Write to local@474
-  local = /*@typeArgs=B*/ f();
+  local = /*@ typeArgs=B* */ f();
         ^
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:24:9: Context: Write to local@474
-  local ??= /*@typeArgs=B*/ f();
+  local ??= /*@ typeArgs=B* */ f();
         ^^^
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:25:9: Context: Write to local@474
-  local += /*@typeArgs=dynamic*/ f();
+  local += /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:26:9: Context: Write to local@474
-  local *= /*@typeArgs=dynamic*/ f();
+  local *= /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:27:9: Context: Write to local@474
-  local &= /*@typeArgs=dynamic*/ f();
+  local &= /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:28:3: Context: Write to local@474
   --local;
@@ -19,21 +19,21 @@
 pkg/front_end/testcases/inference/infer_assign_to_local.dart:29:8: Context: Write to local@474
   local--;
        ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:30:30: Context: Write to local@474
-  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
-                             ^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:31:30: Context: Write to local@474
-  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
-                             ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:32:30: Context: Write to local@474
-  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
-                             ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:33:30: Context: Write to local@474
-  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
-                             ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:34:24: Context: Write to local@474
-  var /*@type=B*/ v6 = --local;
-                       ^^
-pkg/front_end/testcases/inference/infer_assign_to_local.dart:35:29: Context: Write to local@474
-  var /*@type=B*/ v7 = local--;
-                            ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:30:33: Context: Write to local@474
+  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
+                                ^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:31:33: Context: Write to local@474
+  var /*@ type=B* */ v2 = local ??= /*@ typeArgs=B* */ f();
+                                ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:32:33: Context: Write to local@474
+  var /*@ type=B* */ v4 = local *= /*@ typeArgs=dynamic */ f();
+                                ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:33:33: Context: Write to local@474
+  var /*@ type=C* */ v5 = local &= /*@ typeArgs=dynamic */ f();
+                                ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:34:27: Context: Write to local@474
+  var /*@ type=B* */ v6 = --local;
+                          ^^
+pkg/front_end/testcases/inference/infer_assign_to_local.dart:35:32: Context: Write to local@474
+  var /*@ type=B* */ v7 = local--;
+                               ^^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
index 81edc03..98ac8ac 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart
@@ -10,35 +10,35 @@
 double getDouble() => 0.0;
 
 void test1(int t) {
-  var /*@type=int*/ v1 = t = getInt();
-  var /*@type=int*/ v4 = t ??= getInt();
-  var /*@type=int*/ v7 = t += getInt();
-  var /*@type=int*/ v10 = ++t;
-  var /*@type=int*/ v11 = t++;
+  var /*@ type=int* */ v1 = t = getInt();
+  var /*@ type=int* */ v4 = t ??= getInt();
+  var /*@ type=int* */ v7 = t += getInt();
+  var /*@ type=int* */ v10 = ++t;
+  var /*@ type=int* */ v11 = t++;
 }
 
 void test2(num t) {
-  var /*@type=int*/ v1 = t = getInt();
-  var /*@type=num*/ v2 = t = getNum();
-  var /*@type=double*/ v3 = t = getDouble();
-  var /*@type=num*/ v4 = t ??= getInt();
-  var /*@type=num*/ v5 = t ??= getNum();
-  var /*@type=num*/ v6 = t ??= getDouble();
-  var /*@type=num*/ v7 = t += getInt();
-  var /*@type=num*/ v8 = t += getNum();
-  var /*@type=num*/ v9 = t += getDouble();
-  var /*@type=num*/ v10 = ++t;
-  var /*@type=num*/ v11 = t++;
+  var /*@ type=int* */ v1 = t = getInt();
+  var /*@ type=num* */ v2 = t = getNum();
+  var /*@ type=double* */ v3 = t = getDouble();
+  var /*@ type=num* */ v4 = t ??= getInt();
+  var /*@ type=num* */ v5 = t ??= getNum();
+  var /*@ type=num* */ v6 = t ??= getDouble();
+  var /*@ type=num* */ v7 = t += getInt();
+  var /*@ type=num* */ v8 = t += getNum();
+  var /*@ type=num* */ v9 = t += getDouble();
+  var /*@ type=num* */ v10 = ++t;
+  var /*@ type=num* */ v11 = t++;
 }
 
 void test3(double t) {
-  var /*@type=double*/ v3 = t = getDouble();
-  var /*@type=double*/ v6 = t ??= getDouble();
-  var /*@type=double*/ v7 = t += getInt();
-  var /*@type=double*/ v8 = t += getNum();
-  var /*@type=double*/ v9 = t += getDouble();
-  var /*@type=double*/ v10 = ++t;
-  var /*@type=double*/ v11 = t++;
+  var /*@ type=double* */ v3 = t = getDouble();
+  var /*@ type=double* */ v6 = t ??= getDouble();
+  var /*@ type=double* */ v7 = t += getInt();
+  var /*@ type=double* */ v8 = t += getNum();
+  var /*@ type=double* */ v9 = t += getDouble();
+  var /*@ type=double* */ v10 = ++t;
+  var /*@ type=double* */ v11 = t++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect
index 7178159..10eba5f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(core::int t) → void {
+static method test1(core::int* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v4 = let final dynamic #t1 = t in #t1.==(null) ? t = self::getInt() : #t1;
   dynamic v7 = t = t.+(self::getInt());
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t2 = t in let final dynamic #t3 = t = #t2.+(1) in #t2;
 }
-static method test2(core::num t) → void {
+static method test2(core::num* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
@@ -28,7 +28,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t7 = t in let final dynamic #t8 = t = #t7.+(1) in #t7;
 }
-static method test3(core::double t) → void {
+static method test3(core::double* t) → void {
   dynamic v3 = t = self::getDouble();
   dynamic v6 = let final dynamic #t9 = t in #t9.==(null) ? t = self::getDouble() : #t9;
   dynamic v7 = t = t.+(self::getInt());
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect
index 7178159..10eba5f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(core::int t) → void {
+static method test1(core::int* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v4 = let final dynamic #t1 = t in #t1.==(null) ? t = self::getInt() : #t1;
   dynamic v7 = t = t.+(self::getInt());
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t2 = t in let final dynamic #t3 = t = #t2.+(1) in #t2;
 }
-static method test2(core::num t) → void {
+static method test2(core::num* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
@@ -28,7 +28,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t7 = t in let final dynamic #t8 = t = #t7.+(1) in #t7;
 }
-static method test3(core::double t) → void {
+static method test3(core::double* t) → void {
   dynamic v3 = t = self::getDouble();
   dynamic v6 = let final dynamic #t9 = t in #t9.==(null) ? t = self::getDouble() : #t9;
   dynamic v7 = t = t.+(self::getInt());
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.outline.expect
index f23d55d8..d53fd7b 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
-static method test1(core::int t) → void
+static method test1(core::int* t) → void
   ;
-static method test2(core::num t) → void
+static method test2(core::num* t) → void
   ;
-static method test3(core::double t) → void
+static method test3(core::double* t) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.expect
index fd38a10..2f274dc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.expect
@@ -2,39 +2,39 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} t = self::getInt() : #t1;
-  core::int v7 = t = t.{core::num::+}(self::getInt());
-  core::int v10 = t = t.{core::num::+}(1);
-  core::int v11 = let final core::int #t2 = t in let final core::int #t3 = t = #t2.{core::num::+}(1) in #t2;
+static method test1(core::int* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::int* v4 = let final core::int* #t1 = t in #t1.{core::num::==}(null) ?{core::int*} t = self::getInt() : #t1;
+  core::int* v7 = t = t.{core::num::+}(self::getInt());
+  core::int* v10 = t = t.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t2 = t in let final core::int* #t3 = t = #t2.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getInt() : #t4;
-  core::num v5 = let final core::num #t5 = t in #t5.{core::num::==}(null) ?{core::num} t = self::getNum() : #t5;
-  core::num v6 = let final core::num #t6 = t in #t6.{core::num::==}(null) ?{core::num} t = self::getDouble() : #t6;
-  core::num v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum());
-  core::num v9 = t = t.{core::num::+}(self::getDouble());
-  core::num v10 = t = t.{core::num::+}(1);
-  core::num v11 = let final core::num #t7 = t in let final core::num #t8 = t = #t7.{core::num::+}(1) in #t7;
+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.{core::num::==}(null) ?{core::num*} t = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = t in #t5.{core::num::==}(null) ?{core::num*} t = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = t in #t6.{core::num::==}(null) ?{core::num*} t = self::getDouble() : #t6;
+  core::num* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum());
+  core::num* v9 = t = t.{core::num::+}(self::getDouble());
+  core::num* v10 = t = t.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t7 = t in let final core::num* #t8 = t = #t7.{core::num::+}(1) 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.{core::num::==}(null) ?{core::double} t = self::getDouble() : #t9;
-  core::double v7 = t = t.{core::double::+}(self::getInt());
-  core::double v8 = t = t.{core::double::+}(self::getNum());
-  core::double v9 = t = t.{core::double::+}(self::getDouble());
-  core::double v10 = t = t.{core::double::+}(1);
-  core::double v11 = let final core::double #t10 = t in let final core::double #t11 = t = #t10.{core::double::+}(1) in #t10;
+static method test3(core::double* t) → void {
+  core::double* v3 = t = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = t in #t9.{core::num::==}(null) ?{core::double*} t = self::getDouble() : #t9;
+  core::double* v7 = t = t.{core::double::+}(self::getInt());
+  core::double* v8 = t = t.{core::double::+}(self::getNum());
+  core::double* v9 = t = t.{core::double::+}(self::getDouble());
+  core::double* v10 = t = t.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t10 = t in let final core::double* #t11 = t = #t10.{core::double::+}(1) in #t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.transformed.expect
index fd38a10..2f274dc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.strong.transformed.expect
@@ -2,39 +2,39 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} t = self::getInt() : #t1;
-  core::int v7 = t = t.{core::num::+}(self::getInt());
-  core::int v10 = t = t.{core::num::+}(1);
-  core::int v11 = let final core::int #t2 = t in let final core::int #t3 = t = #t2.{core::num::+}(1) in #t2;
+static method test1(core::int* t) → void {
+  core::int* v1 = t = self::getInt();
+  core::int* v4 = let final core::int* #t1 = t in #t1.{core::num::==}(null) ?{core::int*} t = self::getInt() : #t1;
+  core::int* v7 = t = t.{core::num::+}(self::getInt());
+  core::int* v10 = t = t.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t2 = t in let final core::int* #t3 = t = #t2.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getInt() : #t4;
-  core::num v5 = let final core::num #t5 = t in #t5.{core::num::==}(null) ?{core::num} t = self::getNum() : #t5;
-  core::num v6 = let final core::num #t6 = t in #t6.{core::num::==}(null) ?{core::num} t = self::getDouble() : #t6;
-  core::num v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum());
-  core::num v9 = t = t.{core::num::+}(self::getDouble());
-  core::num v10 = t = t.{core::num::+}(1);
-  core::num v11 = let final core::num #t7 = t in let final core::num #t8 = t = #t7.{core::num::+}(1) in #t7;
+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.{core::num::==}(null) ?{core::num*} t = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = t in #t5.{core::num::==}(null) ?{core::num*} t = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = t in #t6.{core::num::==}(null) ?{core::num*} t = self::getDouble() : #t6;
+  core::num* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum());
+  core::num* v9 = t = t.{core::num::+}(self::getDouble());
+  core::num* v10 = t = t.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t7 = t in let final core::num* #t8 = t = #t7.{core::num::+}(1) 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.{core::num::==}(null) ?{core::double} t = self::getDouble() : #t9;
-  core::double v7 = t = t.{core::double::+}(self::getInt());
-  core::double v8 = t = t.{core::double::+}(self::getNum());
-  core::double v9 = t = t.{core::double::+}(self::getDouble());
-  core::double v10 = t = t.{core::double::+}(1);
-  core::double v11 = let final core::double #t10 = t in let final core::double #t11 = t = #t10.{core::double::+}(1) in #t10;
+static method test3(core::double* t) → void {
+  core::double* v3 = t = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = t in #t9.{core::num::==}(null) ?{core::double*} t = self::getDouble() : #t9;
+  core::double* v7 = t = t.{core::double::+}(self::getInt());
+  core::double* v8 = t = t.{core::double::+}(self::getNum());
+  core::double* v9 = t = t.{core::double::+}(self::getDouble());
+  core::double* v10 = t = t.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t10 = t in let final core::double* #t11 = t = #t10.{core::double::+}(1) in #t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
index 0bddfc5..e3a6044 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart.type_promotion.expect
@@ -1,69 +1,69 @@
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:13:28: Context: Write to t@343
-  var /*@type=int*/ v1 = t = getInt();
-                           ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:14:28: Context: Write to t@343
-  var /*@type=int*/ v4 = t ??= getInt();
-                           ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:15:28: Context: Write to t@343
-  var /*@type=int*/ v7 = t += getInt();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:16:27: Context: Write to t@343
-  var /*@type=int*/ v10 = ++t;
-                          ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:17:28: Context: Write to t@343
-  var /*@type=int*/ v11 = t++;
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:21:28: Context: Write to t@343
-  var /*@type=int*/ v1 = t = getInt();
-                           ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:22:28: Context: Write to t@343
-  var /*@type=num*/ v2 = t = getNum();
-                           ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:23:31: Context: Write to t@343
-  var /*@type=double*/ v3 = t = getDouble();
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:13:31: Context: Write to t@343
+  var /*@ type=int* */ v1 = t = getInt();
                               ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:24:28: Context: Write to t@343
-  var /*@type=num*/ v4 = t ??= getInt();
-                           ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:25:28: Context: Write to t@343
-  var /*@type=num*/ v5 = t ??= getNum();
-                           ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:26:28: Context: Write to t@343
-  var /*@type=num*/ v6 = t ??= getDouble();
-                           ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:27:28: Context: Write to t@343
-  var /*@type=num*/ v7 = t += getInt();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:28:28: Context: Write to t@343
-  var /*@type=num*/ v8 = t += getNum();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:29:28: Context: Write to t@343
-  var /*@type=num*/ v9 = t += getDouble();
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:30:27: Context: Write to t@343
-  var /*@type=num*/ v10 = ++t;
-                          ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:31:28: Context: Write to t@343
-  var /*@type=num*/ v11 = t++;
-                           ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:35:31: Context: Write to t@343
-  var /*@type=double*/ v3 = t = getDouble();
-                              ^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:36:31: Context: Write to t@343
-  var /*@type=double*/ v6 = t ??= getDouble();
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:14:31: Context: Write to t@343
+  var /*@ type=int* */ v4 = t ??= getInt();
                               ^^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:37:31: Context: Write to t@343
-  var /*@type=double*/ v7 = t += getInt();
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:15:31: Context: Write to t@343
+  var /*@ type=int* */ v7 = t += getInt();
                               ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:38:31: Context: Write to t@343
-  var /*@type=double*/ v8 = t += getNum();
-                              ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:39:31: Context: Write to t@343
-  var /*@type=double*/ v9 = t += getDouble();
-                              ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:40:30: Context: Write to t@343
-  var /*@type=double*/ v10 = ++t;
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:16:30: Context: Write to t@343
+  var /*@ type=int* */ v10 = ++t;
                              ^^
-pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:41:31: Context: Write to t@343
-  var /*@type=double*/ v11 = t++;
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:17:31: Context: Write to t@343
+  var /*@ type=int* */ v11 = t++;
                               ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:21:31: Context: Write to t@343
+  var /*@ type=int* */ v1 = t = getInt();
+                              ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:22:31: Context: Write to t@343
+  var /*@ type=num* */ v2 = t = getNum();
+                              ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:23:34: Context: Write to t@343
+  var /*@ type=double* */ v3 = t = getDouble();
+                                 ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:24:31: Context: Write to t@343
+  var /*@ type=num* */ v4 = t ??= getInt();
+                              ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:25:31: Context: Write to t@343
+  var /*@ type=num* */ v5 = t ??= getNum();
+                              ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:26:31: Context: Write to t@343
+  var /*@ type=num* */ v6 = t ??= getDouble();
+                              ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:27:31: Context: Write to t@343
+  var /*@ type=num* */ v7 = t += getInt();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:28:31: Context: Write to t@343
+  var /*@ type=num* */ v8 = t += getNum();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:29:31: Context: Write to t@343
+  var /*@ type=num* */ v9 = t += getDouble();
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:30:30: Context: Write to t@343
+  var /*@ type=num* */ v10 = ++t;
+                             ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:31:31: Context: Write to t@343
+  var /*@ type=num* */ v11 = t++;
+                              ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:35:34: Context: Write to t@343
+  var /*@ type=double* */ v3 = t = getDouble();
+                                 ^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:36:34: Context: Write to t@343
+  var /*@ type=double* */ v6 = t ??= getDouble();
+                                 ^^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:37:34: Context: Write to t@343
+  var /*@ type=double* */ v7 = t += getInt();
+                                 ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:38:34: Context: Write to t@343
+  var /*@ type=double* */ v8 = t += getNum();
+                                 ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:39:34: Context: Write to t@343
+  var /*@ type=double* */ v9 = t += getDouble();
+                                 ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:40:33: Context: Write to t@343
+  var /*@ type=double* */ v10 = ++t;
+                                ^^
+pkg/front_end/testcases/inference/infer_assign_to_local_upwards.dart:41:34: Context: Write to t@343
+  var /*@ type=double* */ v11 = t++;
+                                 ^^
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
index c55fdcc..b3bffe0 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart
@@ -22,23 +22,23 @@
   B member;
 
   static void test(Test t) {
-    t. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    t. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    t. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    t. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    t. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    t. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    t. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    t. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    t. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    t. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     --t. /*@target=Test::member*/ member;
     t. /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 =
-        t. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        t. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 =
-        t. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        t. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t. /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = t. /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 =
+        t. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        t. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 =
+        t. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        t. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t. /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = t. /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect
index 4ffb6d3..0f62e41 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     t.member = self::f<dynamic>();
     let final dynamic #t1 = t in #t1.member.==(null) ? #t1.member = self::f<dynamic>() : null;
     let final dynamic #t2 = t in #t2.member = #t2.member.+(self::f<dynamic>());
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.member in let final dynamic #t14 = #t12.member = #t13.-(1) in #t13;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.transformed.expect
index 4ffb6d3..0f62e41 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.legacy.transformed.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     t.member = self::f<dynamic>();
     let final dynamic #t1 = t in #t1.member.==(null) ? #t1.member = self::f<dynamic>() : null;
     let final dynamic #t2 = t in #t2.member = #t2.member.+(self::f<dynamic>());
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t12 = t in let final dynamic #t13 = #t12.member in let final dynamic #t14 = #t12.member = #t13.-(1) in #t13;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
index f40880f..b4e3259 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
-  static method test(self::Test t) → void
+  static method test(self::Test* t) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
index 7e29252..def1efc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    let final self::Test #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    let final self::Test #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    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} in #t8.{core::Object::==}(null) ?{self::B} #t7.{self::Test::member} = self::f<self::B>() : #t8;
-    self::B v4 = let final self::Test #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t12 = t in let final self::B #t13 = #t12.{self::Test::member} in let final self::B #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    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} in #t8.{core::Object::==}(null) ?{self::B*} #t7.{self::Test::member} = self::f<self::B*>() : #t8;
+    self::B* v4 = let final self::Test* #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t12 = t in let final self::B* #t13 = #t12.{self::Test::member} in let final self::B* #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
index 7e29252..def1efc 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_full.dart.strong.transformed.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    let final self::Test #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    let final self::Test #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    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} in #t8.{core::Object::==}(null) ?{self::B} #t7.{self::Test::member} = self::f<self::B>() : #t8;
-    self::B v4 = let final self::Test #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t12 = t in let final self::B #t13 = #t12.{self::Test::member} in let final self::B #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    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} in #t8.{core::Object::==}(null) ?{self::B*} #t7.{self::Test::member} = self::f<self::B*>() : #t8;
+    self::B* v4 = let final self::Test* #t9 = t in #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t10 = t in #t10.{self::Test::member} = #t10.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t12 = t in let final self::B* #t13 = #t12.{self::Test::member} in let final self::B* #t14 = #t12.{self::Test::member} = #t13.{self::B::-}(1) in #t13;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
index b78b585..3c0dfaa 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart
@@ -22,23 +22,23 @@
   B member;
 
   static void test(Test t) {
-    t?. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    t?. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    t?. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    t?. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    t?. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    t?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     --t?. /*@target=Test::member*/ member;
     t?. /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 =
-        t?. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        t?. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 =
-        t?. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        t?. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t?. /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = t?. /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 =
+        t?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 =
+        t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect
index c97ac01..17f795f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     let final dynamic #t1 = t in #t1.==(null) ? null : #t1.member = self::f<dynamic>();
     let final dynamic #t2 = t in #t2.==(null) ? null : #t2.member.==(null) ? #t2.member = self::f<dynamic>() : null;
     let final dynamic #t3 = t in #t3.==(null) ? null : #t3.member = #t3.member.+(self::f<dynamic>());
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t14 = t in #t14.==(null) ? null : let final dynamic #t15 = #t14.member in let final dynamic #t16 = #t14.member = #t15.-(1) in #t15;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
index c97ac01..17f795f 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     let final dynamic #t1 = t in #t1.==(null) ? null : #t1.member = self::f<dynamic>();
     let final dynamic #t2 = t in #t2.==(null) ? null : #t2.member.==(null) ? #t2.member = self::f<dynamic>() : null;
     let final dynamic #t3 = t in #t3.==(null) ? null : #t3.member = #t3.member.+(self::f<dynamic>());
@@ -46,6 +46,6 @@
     dynamic v7 = let final dynamic #t14 = t in #t14.==(null) ? null : let final dynamic #t15 = #t14.member in let final dynamic #t16 = #t14.member = #t15.-(1) in #t15;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
index f40880f..b4e3259 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
-  static method test(self::Test t) → void
+  static method test(self::Test* t) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
index 0570c30..1a893e5 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t6 = t in #t6.==(null) ?{self::B} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t7 = t in #t7.==(null) ?{self::B} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = let final self::Test #t8 = t in #t8.==(null) ?{self::B} null : #t8.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::Test #t9 = t in #t9.==(null) ?{self::B} null : let final self::B #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B} #t9.{self::Test::member} = self::f<self::B>() : #t10;
-    self::B v4 = let final self::Test #t11 = t in #t11.==(null) ?{self::B} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t12 = t in #t12.==(null) ?{self::C} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t13 = t in #t13.==(null) ?{self::B} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : let final self::B #t15 = #t14.{self::Test::member} in let final self::B #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
+    self::B* v1 = let final self::Test* #t8 = t in #t8.==(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
+    self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
index 0570c30..1a893e5 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware.dart.strong.transformed.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t6 = t in #t6.==(null) ?{self::B} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t7 = t in #t7.==(null) ?{self::B} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = let final self::Test #t8 = t in #t8.==(null) ?{self::B} null : #t8.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::Test #t9 = t in #t9.==(null) ?{self::B} null : let final self::B #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B} #t9.{self::Test::member} = self::f<self::B>() : #t10;
-    self::B v4 = let final self::Test #t11 = t in #t11.==(null) ?{self::B} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t12 = t in #t12.==(null) ?{self::C} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t13 = t in #t13.==(null) ?{self::B} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : let final self::B #t15 = #t14.{self::Test::member} in let final self::B #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
+    self::B* v1 = let final self::Test* #t8 = t in #t8.==(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
+    self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
index 6f5ccec..e245dfe 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart
@@ -13,11 +13,11 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@type=int*/ v1 = t?. /*@target=Test1::prop*/ prop = getInt();
-    var /*@type=int*/ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
-    var /*@type=int*/ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
-    var /*@type=int*/ v10 = ++t?. /*@target=Test1::prop*/ prop;
-    var /*@type=int*/ v11 = t?. /*@target=Test1::prop*/ prop++;
+    var /*@ type=int* */ v1 = t?. /*@target=Test1::prop*/ prop = getInt();
+    var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
+    var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
+    var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
+    var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
   }
 }
 
@@ -25,17 +25,17 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@type=int*/ v1 = t?. /*@target=Test2::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t?. /*@target=Test2::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t?. /*@target=Test2::prop*/ prop = getDouble();
-    var /*@type=num*/ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
-    var /*@type=num*/ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
-    var /*@type=num*/ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
-    var /*@type=num*/ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
-    var /*@type=num*/ v10 = ++t?. /*@target=Test2::prop*/ prop;
-    var /*@type=num*/ v11 = t?. /*@target=Test2::prop*/ prop++;
+    var /*@ type=int* */ v1 = t?. /*@target=Test2::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t?. /*@target=Test2::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t?. /*@target=Test2::prop*/ prop = getDouble();
+    var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
+    var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
+    var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
+    var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
+    var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
+    var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
   }
 }
 
@@ -43,13 +43,13 @@
   double prop;
 
   static void test3(Test3 t) {
-    var /*@type=double*/ v3 = t?. /*@target=Test3::prop*/ prop = getDouble();
-    var /*@type=double*/ v6 = t?. /*@target=Test3::prop*/ prop ??= getDouble();
-    var /*@type=double*/ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
-    var /*@type=double*/ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
-    var /*@type=double*/ v9 = t?. /*@target=Test3::prop*/ prop += getDouble();
-    var /*@type=double*/ v10 = ++t?. /*@target=Test3::prop*/ prop;
-    var /*@type=double*/ v11 = t?. /*@target=Test3::prop*/ prop++;
+    var /*@ type=double* */ v3 = t?. /*@target=Test3::prop*/ prop = getDouble();
+    var /*@ type=double* */ v6 = t?. /*@target=Test3::prop*/ prop ??= getDouble();
+    var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
+    var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
+    var /*@ type=double* */ v9 = t?. /*@target=Test3::prop*/ prop += getDouble();
+    var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
+    var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
index c4cb694..07c651e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = let final dynamic #t1 = t in #t1.==(null) ? null : #t1.prop = self::getInt();
     dynamic v4 = let final dynamic #t2 = t in #t2.==(null) ? null : let final dynamic #t3 = #t2.prop in #t3.==(null) ? #t2.prop = self::getInt() : #t3;
     dynamic v7 = let final dynamic #t4 = t in #t4.==(null) ? null : #t4.prop = #t4.prop.+(self::getInt());
@@ -16,11 +16,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = let final dynamic #t9 = t in #t9.==(null) ? null : #t9.prop = self::getInt();
     dynamic v2 = let final dynamic #t10 = t in #t10.==(null) ? null : #t10.prop = self::getNum();
     dynamic v3 = let final dynamic #t11 = t in #t11.==(null) ? null : #t11.prop = self::getDouble();
@@ -35,11 +35,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v3 = let final dynamic #t25 = t in #t25.==(null) ? null : #t25.prop = self::getDouble();
     dynamic v6 = let final dynamic #t26 = t in #t26.==(null) ? null : let final dynamic #t27 = #t26.prop in #t27.==(null) ? #t26.prop = self::getDouble() : #t27;
     dynamic v7 = let final dynamic #t28 = t in #t28.==(null) ? null : #t28.prop = #t28.prop.+(self::getInt());
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t32 = t in #t32.==(null) ? null : let final dynamic #t33 = #t32.prop in let final dynamic #t34 = #t32.prop = #t33.+(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
index c4cb694..07c651e 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = let final dynamic #t1 = t in #t1.==(null) ? null : #t1.prop = self::getInt();
     dynamic v4 = let final dynamic #t2 = t in #t2.==(null) ? null : let final dynamic #t3 = #t2.prop in #t3.==(null) ? #t2.prop = self::getInt() : #t3;
     dynamic v7 = let final dynamic #t4 = t in #t4.==(null) ? null : #t4.prop = #t4.prop.+(self::getInt());
@@ -16,11 +16,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = let final dynamic #t9 = t in #t9.==(null) ? null : #t9.prop = self::getInt();
     dynamic v2 = let final dynamic #t10 = t in #t10.==(null) ? null : #t10.prop = self::getNum();
     dynamic v3 = let final dynamic #t11 = t in #t11.==(null) ? null : #t11.prop = self::getDouble();
@@ -35,11 +35,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v3 = let final dynamic #t25 = t in #t25.==(null) ? null : #t25.prop = self::getDouble();
     dynamic v6 = let final dynamic #t26 = t in #t26.==(null) ? null : let final dynamic #t27 = #t26.prop in #t27.==(null) ? #t26.prop = self::getDouble() : #t27;
     dynamic v7 = let final dynamic #t28 = t in #t28.==(null) ? null : #t28.prop = #t28.prop.+(self::getInt());
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t32 = t in #t32.==(null) ? null : let final dynamic #t33 = #t32.prop in let final dynamic #t34 = #t32.prop = #t33.+(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.outline.expect
index eaa82b5..2203088 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop;
-  synthetic constructor •() → self::Test1
+  field core::int* prop;
+  synthetic constructor •() → self::Test1*
     ;
-  static method test(self::Test1 t) → void
+  static method test(self::Test1* t) → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num prop;
-  synthetic constructor •() → self::Test2
+  field core::num* prop;
+  synthetic constructor •() → self::Test2*
     ;
-  static method test(self::Test2 t) → void
+  static method test(self::Test2* t) → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double prop;
-  synthetic constructor •() → self::Test3
+  field core::double* prop;
+  synthetic constructor •() → self::Test3*
     ;
-  static method test3(self::Test3 t) → void
+  static method test3(self::Test3* t) → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.expect
index 8320b4b..2b996bb 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t3.{core::num::==}(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 : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
-    core::int v10 = let final self::Test1 #t5 = t in #t5.==(null) ?{core::int} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t6 = t in #t6.==(null) ?{core::int} null : let final core::int #t7 = #t6.{self::Test1::prop} in let final core::int #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
+  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} in #t3.{core::num::==}(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 : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
+    core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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 #t9 = t in #t9.==(null) ?{core::int} null : #t9.{self::Test2::prop} = self::getInt();
-    core::num v2 = let final self::Test2 #t10 = t in #t10.==(null) ?{core::num} null : #t10.{self::Test2::prop} = self::getNum();
-    core::double v3 = let final self::Test2 #t11 = t in #t11.==(null) ?{core::double} null : #t11.{self::Test2::prop} = self::getDouble();
-    core::num v4 = let final self::Test2 #t12 = t in #t12.==(null) ?{core::num} null : let final core::num #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num} #t12.{self::Test2::prop} = self::getInt() : #t13;
-    core::num v5 = let final self::Test2 #t14 = t in #t14.==(null) ?{core::num} null : let final core::num #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num} #t14.{self::Test2::prop} = self::getNum() : #t15;
-    core::num v6 = let final self::Test2 #t16 = t in #t16.==(null) ?{core::num} null : let final core::num #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num} #t16.{self::Test2::prop} = self::getDouble() : #t17;
-    core::num v7 = let final self::Test2 #t18 = t in #t18.==(null) ?{core::num} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t19 = t in #t19.==(null) ?{core::num} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t20 = t in #t20.==(null) ?{core::num} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t21 = t in #t21.==(null) ?{core::num} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t22 = t in #t22.==(null) ?{core::num} null : let final core::num #t23 = #t22.{self::Test2::prop} in let final core::num #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = let final self::Test2* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
+    core::num* v2 = let final self::Test2* #t10 = t in #t10.==(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
+    core::double* v3 = let final self::Test2* #t11 = t in #t11.==(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
+    core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
+    core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
+    core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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 #t25 = t in #t25.==(null) ?{core::double} null : #t25.{self::Test3::prop} = self::getDouble();
-    core::double v6 = let final self::Test3 #t26 = t in #t26.==(null) ?{core::double} null : let final core::double #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double} #t26.{self::Test3::prop} = self::getDouble() : #t27;
-    core::double v7 = let final self::Test3 #t28 = t in #t28.==(null) ?{core::double} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t29 = t in #t29.==(null) ?{core::double} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::double} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t32 = t in #t32.==(null) ?{core::double} null : let final core::double #t33 = #t32.{self::Test3::prop} in let final core::double #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
+  static method test3(self::Test3* t) → void {
+    core::double* v3 = let final self::Test3* #t25 = t in #t25.==(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
+    core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
+    core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
index 8320b4b..2b996bb 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t3.{core::num::==}(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 : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
-    core::int v10 = let final self::Test1 #t5 = t in #t5.==(null) ?{core::int} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t6 = t in #t6.==(null) ?{core::int} null : let final core::int #t7 = #t6.{self::Test1::prop} in let final core::int #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
+  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} in #t3.{core::num::==}(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 : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
+    core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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 #t9 = t in #t9.==(null) ?{core::int} null : #t9.{self::Test2::prop} = self::getInt();
-    core::num v2 = let final self::Test2 #t10 = t in #t10.==(null) ?{core::num} null : #t10.{self::Test2::prop} = self::getNum();
-    core::double v3 = let final self::Test2 #t11 = t in #t11.==(null) ?{core::double} null : #t11.{self::Test2::prop} = self::getDouble();
-    core::num v4 = let final self::Test2 #t12 = t in #t12.==(null) ?{core::num} null : let final core::num #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num} #t12.{self::Test2::prop} = self::getInt() : #t13;
-    core::num v5 = let final self::Test2 #t14 = t in #t14.==(null) ?{core::num} null : let final core::num #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num} #t14.{self::Test2::prop} = self::getNum() : #t15;
-    core::num v6 = let final self::Test2 #t16 = t in #t16.==(null) ?{core::num} null : let final core::num #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num} #t16.{self::Test2::prop} = self::getDouble() : #t17;
-    core::num v7 = let final self::Test2 #t18 = t in #t18.==(null) ?{core::num} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t19 = t in #t19.==(null) ?{core::num} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t20 = t in #t20.==(null) ?{core::num} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t21 = t in #t21.==(null) ?{core::num} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t22 = t in #t22.==(null) ?{core::num} null : let final core::num #t23 = #t22.{self::Test2::prop} in let final core::num #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
+  static method test(self::Test2* t) → void {
+    core::int* v1 = let final self::Test2* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
+    core::num* v2 = let final self::Test2* #t10 = t in #t10.==(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
+    core::double* v3 = let final self::Test2* #t11 = t in #t11.==(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
+    core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
+    core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
+    core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
+    core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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 #t25 = t in #t25.==(null) ?{core::double} null : #t25.{self::Test3::prop} = self::getDouble();
-    core::double v6 = let final self::Test3 #t26 = t in #t26.==(null) ?{core::double} null : let final core::double #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double} #t26.{self::Test3::prop} = self::getDouble() : #t27;
-    core::double v7 = let final self::Test3 #t28 = t in #t28.==(null) ?{core::double} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t29 = t in #t29.==(null) ?{core::double} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::double} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t32 = t in #t32.==(null) ?{core::double} null : let final core::double #t33 = #t32.{self::Test3::prop} in let final core::double #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
+  static method test3(self::Test3* t) → void {
+    core::double* v3 = let final self::Test3* #t25 = t in #t25.==(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
+    core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
+    core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
index 25fbddb..2982026 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart
@@ -24,23 +24,23 @@
 
 class Test extends Base {
   void test() {
-    super. /*@target=Base::member*/ member = /*@typeArgs=B*/ f();
-    super. /*@target=Base::member*/ member ??= /*@typeArgs=B*/ f();
-    super. /*@target=Base::member*/ member += /*@typeArgs=dynamic*/ f();
-    super. /*@target=Base::member*/ member *= /*@typeArgs=dynamic*/ f();
-    super. /*@target=Base::member*/ member &= /*@typeArgs=dynamic*/ f();
+    super. /*@target=Base::member*/ member = /*@ typeArgs=B* */ f();
+    super. /*@target=Base::member*/ member ??= /*@ typeArgs=B* */ f();
+    super. /*@target=Base::member*/ member += /*@ typeArgs=dynamic */ f();
+    super. /*@target=Base::member*/ member *= /*@ typeArgs=dynamic */ f();
+    super. /*@target=Base::member*/ member &= /*@ typeArgs=dynamic */ f();
     --super. /*@target=Base::member*/ member;
     super. /*@target=Base::member*/ member--;
-    var /*@type=B*/ v1 =
-        super. /*@target=Base::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        super. /*@target=Base::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=B*/ v4 =
-        super. /*@target=Base::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        super. /*@target=Base::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --super. /*@target=Base::member*/ member;
-    var /*@type=B*/ v7 = super. /*@target=Base::member*/ member--;
+    var /*@ type=B* */ v1 =
+        super. /*@target=Base::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        super. /*@target=Base::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v4 =
+        super. /*@target=Base::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        super. /*@target=Base::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --super. /*@target=Base::member*/ member;
+    var /*@ type=B* */ v7 = super. /*@target=Base::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect
index 0bd4ce8..394cc10 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -51,6 +51,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.transformed.expect
index 0bd4ce8..394cc10 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.legacy.transformed.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -51,6 +51,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
index 1f7cf9f..96af9b6 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.outline.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Base extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Base
+  field self::B* member;
+  synthetic constructor •() → self::Base*
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
index b621997..50d58e2 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.expect
@@ -3,54 +3,54 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::member} = self::f<self::B>();
-    super.{self::Base::member}.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : null;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member}.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : #t1;
-    self::B v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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) in #t2;
+    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.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : #t1;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
+    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) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
index b621997..50d58e2 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super.dart.strong.transformed.expect
@@ -3,54 +3,54 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::member} = self::f<self::B>();
-    super.{self::Base::member}.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : null;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member}.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : #t1;
-    self::B v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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) in #t2;
+    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.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : #t1;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
+    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) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
index e15af91..b906755 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart
@@ -17,50 +17,50 @@
 
 class Test1 extends Base {
   void test() {
-    var /*@type=int*/ v1 = super. /*@target=Base::intProp*/ intProp = getInt();
-    var /*@type=int*/ v4 =
+    var /*@ type=int* */ v1 = super. /*@target=Base::intProp*/ intProp = getInt();
+    var /*@ type=int* */ v4 =
         super. /*@target=Base::intProp*/ intProp ??= getInt();
-    var /*@type=int*/ v7 = super. /*@target=Base::intProp*/ intProp += getInt();
-    var /*@type=int*/ v10 = ++super. /*@target=Base::intProp*/ intProp;
-    var /*@type=int*/ v11 = super. /*@target=Base::intProp*/ intProp++;
+    var /*@ type=int* */ v7 = super. /*@target=Base::intProp*/ intProp += getInt();
+    var /*@ type=int* */ v10 = ++super. /*@target=Base::intProp*/ intProp;
+    var /*@ type=int* */ v11 = super. /*@target=Base::intProp*/ intProp++;
   }
 }
 
 class Test2 extends Base {
   void test() {
-    var /*@type=int*/ v1 = super. /*@target=Base::numProp*/ numProp = getInt();
-    var /*@type=num*/ v2 = super. /*@target=Base::numProp*/ numProp = getNum();
-    var /*@type=double*/ v3 =
+    var /*@ type=int* */ v1 = super. /*@target=Base::numProp*/ numProp = getInt();
+    var /*@ type=num* */ v2 = super. /*@target=Base::numProp*/ numProp = getNum();
+    var /*@ type=double* */ v3 =
         super. /*@target=Base::numProp*/ numProp = getDouble();
-    var /*@type=num*/ v4 =
+    var /*@ type=num* */ v4 =
         super. /*@target=Base::numProp*/ numProp ??= getInt();
-    var /*@type=num*/ v5 =
+    var /*@ type=num* */ v5 =
         super. /*@target=Base::numProp*/ numProp ??= getNum();
-    var /*@type=num*/ v6 =
+    var /*@ type=num* */ v6 =
         super. /*@target=Base::numProp*/ numProp ??= getDouble();
-    var /*@type=num*/ v7 = super. /*@target=Base::numProp*/ numProp += getInt();
-    var /*@type=num*/ v8 = super. /*@target=Base::numProp*/ numProp += getNum();
-    var /*@type=num*/ v9 =
+    var /*@ type=num* */ v7 = super. /*@target=Base::numProp*/ numProp += getInt();
+    var /*@ type=num* */ v8 = super. /*@target=Base::numProp*/ numProp += getNum();
+    var /*@ type=num* */ v9 =
         super. /*@target=Base::numProp*/ numProp += getDouble();
-    var /*@type=num*/ v10 = ++super. /*@target=Base::numProp*/ numProp;
-    var /*@type=num*/ v11 = super. /*@target=Base::numProp*/ numProp++;
+    var /*@ type=num* */ v10 = ++super. /*@target=Base::numProp*/ numProp;
+    var /*@ type=num* */ v11 = super. /*@target=Base::numProp*/ numProp++;
   }
 }
 
 class Test3 extends Base {
   void test3() {
-    var /*@type=double*/ v3 =
+    var /*@ type=double* */ v3 =
         super. /*@target=Base::doubleProp*/ doubleProp = getDouble();
-    var /*@type=double*/ v6 =
+    var /*@ type=double* */ v6 =
         super. /*@target=Base::doubleProp*/ doubleProp ??= getDouble();
-    var /*@type=double*/ v7 =
+    var /*@ type=double* */ v7 =
         super. /*@target=Base::doubleProp*/ doubleProp += getInt();
-    var /*@type=double*/ v8 =
+    var /*@ type=double* */ v8 =
         super. /*@target=Base::doubleProp*/ doubleProp += getNum();
-    var /*@type=double*/ v9 =
+    var /*@ type=double* */ v9 =
         super. /*@target=Base::doubleProp*/ doubleProp += getDouble();
-    var /*@type=double*/ v10 = ++super. /*@target=Base::doubleProp*/ doubleProp;
-    var /*@type=double*/ v11 = super. /*@target=Base::doubleProp*/ doubleProp++;
+    var /*@ type=double* */ v10 = ++super. /*@target=Base::doubleProp*/ doubleProp;
+    var /*@ type=double* */ v11 = super. /*@target=Base::doubleProp*/ doubleProp++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect
index 0c7a80c..dad42a6 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.expect
@@ -3,15 +3,15 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test3() → void {
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t10 = super.{self::Base::doubleProp} in let final dynamic #t11 = super.{self::Base::doubleProp} = #t10.+(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
index 0c7a80c..dad42a6 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -23,7 +23,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -41,7 +41,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test3() → void {
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t10 = super.{self::Base::doubleProp} in let final dynamic #t11 = super.{self::Base::doubleProp} = #t10.+(1) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.outline.expect
index c58784f..b019841 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.outline.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  field core::int intProp;
-  field core::num numProp;
-  field core::double doubleProp;
-  synthetic constructor •() → self::Base
+  field core::int* intProp;
+  field core::num* numProp;
+  field core::double* doubleProp;
+  synthetic constructor •() → self::Base*
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     ;
   method test() → void
     ;
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     ;
   method test() → void
     ;
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     ;
   method test3() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.expect
index b7331a5..9641f0a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.expect
@@ -3,61 +3,61 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  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.{core::num::==}(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::int v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
-    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) in #t2;
+    core::int* v1 = super.{self::Base::intProp} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = super.{self::Base::intProp} in #t1.{core::num::==}(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::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
+    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) in #t2;
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  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.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getInt() : #t4;
-    core::num v5 = let final core::num #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getNum() : #t5;
-    core::num v6 = let final core::num #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(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 v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
-    core::num v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
-    core::num v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
-    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) in #t7;
+    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.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(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* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
+    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) in #t7;
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  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.{core::num::==}(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::double v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
-    core::double v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
-    core::double v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
-    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) in #t10;
+    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = super.{self::Base::doubleProp} in #t9.{core::num::==}(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::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
+    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) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
index b7331a5..9641f0a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
@@ -3,61 +3,61 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  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.{core::num::==}(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::int v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
-    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) in #t2;
+    core::int* v1 = super.{self::Base::intProp} = self::getInt();
+    core::int* v4 = let final core::int* #t1 = super.{self::Base::intProp} in #t1.{core::num::==}(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::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
+    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) in #t2;
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  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.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getInt() : #t4;
-    core::num v5 = let final core::num #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getNum() : #t5;
-    core::num v6 = let final core::num #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(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 v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
-    core::num v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
-    core::num v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
-    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) in #t7;
+    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.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t4;
+    core::num* v5 = let final core::num* #t5 = super.{self::Base::numProp} in #t5.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t5;
+    core::num* v6 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(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* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
+    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) in #t7;
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  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.{core::num::==}(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::double v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
-    core::double v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
-    core::double v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
-    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) in #t10;
+    core::double* v3 = super.{self::Base::doubleProp} = self::getDouble();
+    core::double* v6 = let final core::double* #t9 = super.{self::Base::doubleProp} in #t9.{core::num::==}(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::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
+    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) in #t10;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
index e739cd7..37e74b9 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart
@@ -13,11 +13,11 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@type=int*/ v1 = t. /*@target=Test1::prop*/ prop = getInt();
-    var /*@type=int*/ v4 = t. /*@target=Test1::prop*/ prop ??= getInt();
-    var /*@type=int*/ v7 = t. /*@target=Test1::prop*/ prop += getInt();
-    var /*@type=int*/ v10 = ++t. /*@target=Test1::prop*/ prop;
-    var /*@type=int*/ v11 = t. /*@target=Test1::prop*/ prop++;
+    var /*@ type=int* */ v1 = t. /*@target=Test1::prop*/ prop = getInt();
+    var /*@ type=int* */ v4 = t. /*@target=Test1::prop*/ prop ??= getInt();
+    var /*@ type=int* */ v7 = t. /*@target=Test1::prop*/ prop += getInt();
+    var /*@ type=int* */ v10 = ++t. /*@target=Test1::prop*/ prop;
+    var /*@ type=int* */ v11 = t. /*@target=Test1::prop*/ prop++;
   }
 }
 
@@ -25,17 +25,17 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@type=int*/ v1 = t. /*@target=Test2::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t. /*@target=Test2::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t. /*@target=Test2::prop*/ prop = getDouble();
-    var /*@type=num*/ v4 = t. /*@target=Test2::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t. /*@target=Test2::prop*/ prop ??= getNum();
-    var /*@type=num*/ v6 = t. /*@target=Test2::prop*/ prop ??= getDouble();
-    var /*@type=num*/ v7 = t. /*@target=Test2::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t. /*@target=Test2::prop*/ prop += getNum();
-    var /*@type=num*/ v9 = t. /*@target=Test2::prop*/ prop += getDouble();
-    var /*@type=num*/ v10 = ++t. /*@target=Test2::prop*/ prop;
-    var /*@type=num*/ v11 = t. /*@target=Test2::prop*/ prop++;
+    var /*@ type=int* */ v1 = t. /*@target=Test2::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t. /*@target=Test2::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t. /*@target=Test2::prop*/ prop = getDouble();
+    var /*@ type=num* */ v4 = t. /*@target=Test2::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t. /*@target=Test2::prop*/ prop ??= getNum();
+    var /*@ type=num* */ v6 = t. /*@target=Test2::prop*/ prop ??= getDouble();
+    var /*@ type=num* */ v7 = t. /*@target=Test2::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t. /*@target=Test2::prop*/ prop += getNum();
+    var /*@ type=num* */ v9 = t. /*@target=Test2::prop*/ prop += getDouble();
+    var /*@ type=num* */ v10 = ++t. /*@target=Test2::prop*/ prop;
+    var /*@ type=num* */ v11 = t. /*@target=Test2::prop*/ prop++;
   }
 }
 
@@ -43,13 +43,13 @@
   double prop;
 
   static void test3(Test3 t) {
-    var /*@type=double*/ v3 = t. /*@target=Test3::prop*/ prop = getDouble();
-    var /*@type=double*/ v6 = t. /*@target=Test3::prop*/ prop ??= getDouble();
-    var /*@type=double*/ v7 = t. /*@target=Test3::prop*/ prop += getInt();
-    var /*@type=double*/ v8 = t. /*@target=Test3::prop*/ prop += getNum();
-    var /*@type=double*/ v9 = t. /*@target=Test3::prop*/ prop += getDouble();
-    var /*@type=double*/ v10 = ++t. /*@target=Test3::prop*/ prop;
-    var /*@type=double*/ v11 = t. /*@target=Test3::prop*/ prop++;
+    var /*@ type=double* */ v3 = t. /*@target=Test3::prop*/ prop = getDouble();
+    var /*@ type=double* */ v6 = t. /*@target=Test3::prop*/ prop ??= getDouble();
+    var /*@ type=double* */ v7 = t. /*@target=Test3::prop*/ prop += getInt();
+    var /*@ type=double* */ v8 = t. /*@target=Test3::prop*/ prop += getNum();
+    var /*@ type=double* */ v9 = t. /*@target=Test3::prop*/ prop += getDouble();
+    var /*@ type=double* */ v10 = ++t. /*@target=Test3::prop*/ prop;
+    var /*@ type=double* */ v11 = t. /*@target=Test3::prop*/ prop++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect
index 2253586..6177905 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v4 = let final dynamic #t1 = t in let final dynamic #t2 = #t1.prop in #t2.==(null) ? #t1.prop = self::getInt() : #t2;
     dynamic v7 = let final dynamic #t3 = t in #t3.prop = #t3.prop.+(self::getInt());
@@ -16,11 +16,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
@@ -35,11 +35,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v3 = t.prop = self::getDouble();
     dynamic v6 = let final dynamic #t21 = t in let final dynamic #t22 = #t21.prop in #t22.==(null) ? #t21.prop = self::getDouble() : #t22;
     dynamic v7 = let final dynamic #t23 = t in #t23.prop = #t23.prop.+(self::getInt());
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t27 = t in let final dynamic #t28 = #t27.prop in let final dynamic #t29 = #t27.prop = #t28.+(1) in #t28;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.transformed.expect
index 2253586..6177905 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v4 = let final dynamic #t1 = t in let final dynamic #t2 = #t1.prop in #t2.==(null) ? #t1.prop = self::getInt() : #t2;
     dynamic v7 = let final dynamic #t3 = t in #t3.prop = #t3.prop.+(self::getInt());
@@ -16,11 +16,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
@@ -35,11 +35,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v3 = t.prop = self::getDouble();
     dynamic v6 = let final dynamic #t21 = t in let final dynamic #t22 = #t21.prop in #t22.==(null) ? #t21.prop = self::getDouble() : #t22;
     dynamic v7 = let final dynamic #t23 = t in #t23.prop = #t23.prop.+(self::getInt());
@@ -49,10 +49,10 @@
     dynamic v11 = let final dynamic #t27 = t in let final dynamic #t28 = #t27.prop in let final dynamic #t29 = #t27.prop = #t28.+(1) in #t28;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.outline.expect
index eaa82b5..2203088 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop;
-  synthetic constructor •() → self::Test1
+  field core::int* prop;
+  synthetic constructor •() → self::Test1*
     ;
-  static method test(self::Test1 t) → void
+  static method test(self::Test1* t) → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num prop;
-  synthetic constructor •() → self::Test2
+  field core::num* prop;
+  synthetic constructor •() → self::Test2*
     ;
-  static method test(self::Test2 t) → void
+  static method test(self::Test2* t) → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double prop;
-  synthetic constructor •() → self::Test3
+  field core::double* prop;
+  synthetic constructor •() → self::Test3*
     ;
-  static method test3(self::Test3 t) → void
+  static method test3(self::Test3* t) → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.expect
index b9366a9..6231f02 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t2.{core::num::==}(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::num::+}(self::getInt());
-    core::int v10 = let final self::Test1 #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t5 = t in let final core::int #t6 = #t5.{self::Test1::prop} in let final core::int #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1) in #t6;
+  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} in #t2.{core::num::==}(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::num::+}(self::getInt());
+    core::int* v10 = let final self::Test1* #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t5 = t in let final core::int* #t6 = #t5.{self::Test1::prop} in let final core::int* #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1) in #t6;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t9.{core::num::==}(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} in #t11.{core::num::==}(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} in #t13.{core::num::==}(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::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t18 = t in let final core::num #t19 = #t18.{self::Test2::prop} in let final core::num #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1) in #t19;
+  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} in #t9.{core::num::==}(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} in #t11.{core::num::==}(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} in #t13.{core::num::==}(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::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t18 = t in let final core::num* #t19 = #t18.{self::Test2::prop} in let final core::num* #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1) in #t19;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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} in #t22.{core::num::==}(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::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t27 = t in let final core::double #t28 = #t27.{self::Test3::prop} in let final core::double #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1) in #t28;
+  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} in #t22.{core::num::==}(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::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t27 = t in let final core::double* #t28 = #t27.{self::Test3::prop} in let final core::double* #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1) in #t28;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.transformed.expect
index b9366a9..6231f02 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_property_upwards.dart.strong.transformed.expect
@@ -3,56 +3,56 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t2.{core::num::==}(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::num::+}(self::getInt());
-    core::int v10 = let final self::Test1 #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t5 = t in let final core::int #t6 = #t5.{self::Test1::prop} in let final core::int #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1) in #t6;
+  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} in #t2.{core::num::==}(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::num::+}(self::getInt());
+    core::int* v10 = let final self::Test1* #t4 = t in #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t5 = t in let final core::int* #t6 = #t5.{self::Test1::prop} in let final core::int* #t7 = #t5.{self::Test1::prop} = #t6.{core::num::+}(1) in #t6;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t9.{core::num::==}(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} in #t11.{core::num::==}(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} in #t13.{core::num::==}(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::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t18 = t in let final core::num #t19 = #t18.{self::Test2::prop} in let final core::num #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1) in #t19;
+  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} in #t9.{core::num::==}(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} in #t11.{core::num::==}(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} in #t13.{core::num::==}(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::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t15 = t in #t15.{self::Test2::prop} = #t15.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t16 = t in #t16.{self::Test2::prop} = #t16.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t17 = t in #t17.{self::Test2::prop} = #t17.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t18 = t in let final core::num* #t19 = #t18.{self::Test2::prop} in let final core::num* #t20 = #t18.{self::Test2::prop} = #t19.{core::num::+}(1) in #t19;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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} in #t22.{core::num::==}(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::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t27 = t in let final core::double #t28 = #t27.{self::Test3::prop} in let final core::double #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1) in #t28;
+  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} in #t22.{core::num::==}(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::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t24 = t in #t24.{self::Test3::prop} = #t24.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t25 = t in #t25.{self::Test3::prop} = #t25.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t26 = t in #t26.{self::Test3::prop} = #t26.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t27 = t in let final core::double* #t28 = #t27.{self::Test3::prop} in let final core::double* #t29 = #t27.{self::Test3::prop} = #t28.{core::double::+}(1) in #t28;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.expect
index 46e31be..199d8bf 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
+static field self::A* a = new self::A::•();
 static field dynamic c = 0;
 static method main() → dynamic {
   self::a;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect
index 46e31be..199d8bf 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
+static field self::A* a = new self::A::•();
 static field dynamic c = 0;
 static method main() → dynamic {
   self::a;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.expect
index e9f2ede..ffe5d5a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
-static field core::int c = 0;
+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_ref.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.transformed.expect
index e9f2ede..ffe5d5a 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_ref.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
-static field core::int c = 0;
+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 b/pkg/front_end/testcases/inference/infer_assign_to_static.dart
index 8bde0af..56a5f89 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart
@@ -23,35 +23,35 @@
 B topLevelVariable;
 
 void test_topLevelVariable() {
-  topLevelVariable = /*@typeArgs=B*/ f();
-  topLevelVariable ??= /*@typeArgs=B*/ f();
-  topLevelVariable += /*@typeArgs=dynamic*/ f();
-  topLevelVariable *= /*@typeArgs=dynamic*/ f();
-  topLevelVariable &= /*@typeArgs=dynamic*/ f();
+  topLevelVariable = /*@ typeArgs=B* */ f();
+  topLevelVariable ??= /*@ typeArgs=B* */ f();
+  topLevelVariable += /*@ typeArgs=dynamic */ f();
+  topLevelVariable *= /*@ typeArgs=dynamic */ f();
+  topLevelVariable &= /*@ typeArgs=dynamic */ f();
   --topLevelVariable;
   topLevelVariable--;
-  var /*@type=B*/ v1 = topLevelVariable = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = topLevelVariable ??= /*@typeArgs=B*/ f();
-  var /*@type=B*/ v4 = topLevelVariable *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = topLevelVariable &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --topLevelVariable;
-  var /*@type=B*/ v7 = topLevelVariable--;
+  var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = topLevelVariable ??= /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v4 = topLevelVariable *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = topLevelVariable &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --topLevelVariable;
+  var /*@ type=B* */ v7 = topLevelVariable--;
 }
 
 void test_staticVariable() {
-  B.staticVariable = /*@typeArgs=B*/ f();
-  B.staticVariable ??= /*@typeArgs=B*/ f();
-  B.staticVariable += /*@typeArgs=dynamic*/ f();
-  B.staticVariable *= /*@typeArgs=dynamic*/ f();
-  B.staticVariable &= /*@typeArgs=dynamic*/ f();
+  B.staticVariable = /*@ typeArgs=B* */ f();
+  B.staticVariable ??= /*@ typeArgs=B* */ f();
+  B.staticVariable += /*@ typeArgs=dynamic */ f();
+  B.staticVariable *= /*@ typeArgs=dynamic */ f();
+  B.staticVariable &= /*@ typeArgs=dynamic */ f();
   --B.staticVariable;
   B.staticVariable--;
-  var /*@type=B*/ v1 = B.staticVariable = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = B.staticVariable ??= /*@typeArgs=B*/ f();
-  var /*@type=B*/ v4 = B.staticVariable *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = B.staticVariable &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --B.staticVariable;
-  var /*@type=B*/ v7 = B.staticVariable--;
+  var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = B.staticVariable ??= /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v4 = B.staticVariable *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = B.staticVariable &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --B.staticVariable;
+  var /*@ type=B* */ v7 = B.staticVariable--;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect
index 06616e3..ddb5870 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect
index 06616e3..ddb5870 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
index 7e312ee..c89d459 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.outline.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable;
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+static field self::B* topLevelVariable;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test_topLevelVariable() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
index e1a50e1..8ef6b74 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.expect
@@ -3,60 +3,60 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : null;
-  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v1 = self::topLevelVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : #t1;
-  self::B v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = self::topLevelVariable in let final self::B #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
 }
 static method test_staticVariable() → void {
-  self::B::staticVariable = self::f<self::B>();
-  self::B::staticVariable.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : null;
-  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v1 = self::B::staticVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : #t4;
-  self::B v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t5 = self::B::staticVariable in let final self::B #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
index e1a50e1..8ef6b74 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static.dart.strong.transformed.expect
@@ -3,60 +3,60 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : null;
-  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v1 = self::topLevelVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : #t1;
-  self::B v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = self::topLevelVariable in let final self::B #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
 }
 static method test_staticVariable() → void {
-  self::B::staticVariable = self::f<self::B>();
-  self::B::staticVariable.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : null;
-  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v1 = self::B::staticVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : #t4;
-  self::B v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t5 = self::B::staticVariable in let final self::B #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
index a011ed2..bfb7da2 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart
@@ -14,35 +14,35 @@
 double topLevelDouble;
 
 void test1() {
-  var /*@type=int*/ v1 = topLevelInt = getInt();
-  var /*@type=int*/ v4 = topLevelInt ??= getInt();
-  var /*@type=int*/ v7 = topLevelInt += getInt();
-  var /*@type=int*/ v10 = ++topLevelInt;
-  var /*@type=int*/ v11 = topLevelInt++;
+  var /*@ type=int* */ v1 = topLevelInt = getInt();
+  var /*@ type=int* */ v4 = topLevelInt ??= getInt();
+  var /*@ type=int* */ v7 = topLevelInt += getInt();
+  var /*@ type=int* */ v10 = ++topLevelInt;
+  var /*@ type=int* */ v11 = topLevelInt++;
 }
 
 void test2() {
-  var /*@type=int*/ v1 = topLevelNum = getInt();
-  var /*@type=num*/ v2 = topLevelNum = getNum();
-  var /*@type=double*/ v3 = topLevelNum = getDouble();
-  var /*@type=num*/ v4 = topLevelNum ??= getInt();
-  var /*@type=num*/ v5 = topLevelNum ??= getNum();
-  var /*@type=num*/ v6 = topLevelNum ??= getDouble();
-  var /*@type=num*/ v7 = topLevelNum += getInt();
-  var /*@type=num*/ v8 = topLevelNum += getNum();
-  var /*@type=num*/ v9 = topLevelNum += getDouble();
-  var /*@type=num*/ v10 = ++topLevelNum;
-  var /*@type=num*/ v11 = topLevelNum++;
+  var /*@ type=int* */ v1 = topLevelNum = getInt();
+  var /*@ type=num* */ v2 = topLevelNum = getNum();
+  var /*@ type=double* */ v3 = topLevelNum = getDouble();
+  var /*@ type=num* */ v4 = topLevelNum ??= getInt();
+  var /*@ type=num* */ v5 = topLevelNum ??= getNum();
+  var /*@ type=num* */ v6 = topLevelNum ??= getDouble();
+  var /*@ type=num* */ v7 = topLevelNum += getInt();
+  var /*@ type=num* */ v8 = topLevelNum += getNum();
+  var /*@ type=num* */ v9 = topLevelNum += getDouble();
+  var /*@ type=num* */ v10 = ++topLevelNum;
+  var /*@ type=num* */ v11 = topLevelNum++;
 }
 
 void test3() {
-  var /*@type=double*/ v3 = topLevelDouble = getDouble();
-  var /*@type=double*/ v6 = topLevelDouble ??= getDouble();
-  var /*@type=double*/ v7 = topLevelDouble += getInt();
-  var /*@type=double*/ v8 = topLevelDouble += getNum();
-  var /*@type=double*/ v9 = topLevelDouble += getDouble();
-  var /*@type=double*/ v10 = ++topLevelDouble;
-  var /*@type=double*/ v11 = topLevelDouble++;
+  var /*@ type=double* */ v3 = topLevelDouble = getDouble();
+  var /*@ type=double* */ v6 = topLevelDouble ??= getDouble();
+  var /*@ type=double* */ v7 = topLevelDouble += getInt();
+  var /*@ type=double* */ v8 = topLevelDouble += getNum();
+  var /*@ type=double* */ v9 = topLevelDouble += getDouble();
+  var /*@ type=double* */ v10 = ++topLevelDouble;
+  var /*@ type=double* */ v11 = topLevelDouble++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect
index 5998ee6..a7bd009 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.expect
@@ -2,14 +2,14 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method test1() → void {
   dynamic v1 = self::topLevelInt = self::getInt();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect
index 5998ee6..a7bd009 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method test1() → void {
   dynamic v1 = self::topLevelInt = self::getInt();
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.outline.expect
index 9f20ebc..ddb758d 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.outline.expect
@@ -2,14 +2,14 @@
 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
+static field core::int* topLevelInt;
+static field core::num* topLevelNum;
+static field core::double* topLevelDouble;
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method test1() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.expect
index 7122b49..109c102 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.expect
@@ -2,42 +2,42 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} self::topLevelInt = self::getInt() : #t1;
-  core::int v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt());
-  core::int v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
-  core::int v11 = let final core::int #t2 = self::topLevelInt in let final core::int #t3 = self::topLevelInt = #t2.{core::num::+}(1) in #t2;
+  core::int* v1 = self::topLevelInt = self::getInt();
+  core::int* v4 = let final core::int* #t1 = self::topLevelInt in #t1.{core::num::==}(null) ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::int* v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt());
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t2 = self::topLevelInt in let final core::int* #t3 = self::topLevelInt = #t2.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getInt() : #t4;
-  core::num v5 = let final core::num #t5 = self::topLevelNum in #t5.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getNum() : #t5;
-  core::num v6 = let final core::num #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getDouble() : #t6;
-  core::num v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
-  core::num v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
-  core::num v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
-  core::num v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
-  core::num v11 = let final core::num #t7 = self::topLevelNum in let final core::num #t8 = self::topLevelNum = #t7.{core::num::+}(1) in #t7;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = self::topLevelNum in #t5.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getDouble() : #t6;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t7 = self::topLevelNum in let final core::num* #t8 = self::topLevelNum = #t7.{core::num::+}(1) 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.{core::num::==}(null) ?{core::double} self::topLevelDouble = self::getDouble() : #t9;
-  core::double v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
-  core::double v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
-  core::double v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
-  core::double v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
-  core::double v11 = let final core::double #t10 = self::topLevelDouble in let final core::double #t11 = self::topLevelDouble = #t10.{core::double::+}(1) in #t10;
+  core::double* v3 = self::topLevelDouble = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = self::topLevelDouble in #t9.{core::num::==}(null) ?{core::double*} self::topLevelDouble = self::getDouble() : #t9;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t10 = self::topLevelDouble in let final core::double* #t11 = self::topLevelDouble = #t10.{core::double::+}(1) in #t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.transformed.expect
index 7122b49..109c102 100644
--- a/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_assign_to_static_upwards.dart.strong.transformed.expect
@@ -2,42 +2,42 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} self::topLevelInt = self::getInt() : #t1;
-  core::int v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt());
-  core::int v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
-  core::int v11 = let final core::int #t2 = self::topLevelInt in let final core::int #t3 = self::topLevelInt = #t2.{core::num::+}(1) in #t2;
+  core::int* v1 = self::topLevelInt = self::getInt();
+  core::int* v4 = let final core::int* #t1 = self::topLevelInt in #t1.{core::num::==}(null) ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::int* v7 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getInt());
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t2 = self::topLevelInt in let final core::int* #t3 = self::topLevelInt = #t2.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getInt() : #t4;
-  core::num v5 = let final core::num #t5 = self::topLevelNum in #t5.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getNum() : #t5;
-  core::num v6 = let final core::num #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getDouble() : #t6;
-  core::num v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
-  core::num v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
-  core::num v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
-  core::num v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
-  core::num v11 = let final core::num #t7 = self::topLevelNum in let final core::num #t8 = self::topLevelNum = #t7.{core::num::+}(1) in #t7;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getInt() : #t4;
+  core::num* v5 = let final core::num* #t5 = self::topLevelNum in #t5.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getNum() : #t5;
+  core::num* v6 = let final core::num* #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getDouble() : #t6;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t7 = self::topLevelNum in let final core::num* #t8 = self::topLevelNum = #t7.{core::num::+}(1) 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.{core::num::==}(null) ?{core::double} self::topLevelDouble = self::getDouble() : #t9;
-  core::double v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
-  core::double v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
-  core::double v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
-  core::double v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
-  core::double v11 = let final core::double #t10 = self::topLevelDouble in let final core::double #t11 = self::topLevelDouble = #t10.{core::double::+}(1) in #t10;
+  core::double* v3 = self::topLevelDouble = self::getDouble();
+  core::double* v6 = let final core::double* #t9 = self::topLevelDouble in #t9.{core::num::==}(null) ?{core::double*} self::topLevelDouble = self::getDouble() : #t9;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t10 = self::topLevelDouble in let final core::double* #t11 = self::topLevelDouble = #t10.{core::double::+}(1) in #t10;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect
index fe48a15..faa8bd9 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
 static field dynamic v_add = new self::A::•().+("foo");
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect
index fe48a15..faa8bd9 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
 static field dynamic v_add = new self::A::•().+("foo");
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.expect
index a3d0601..2aa8013 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
-static field core::int v_add = new self::A::•().{self::A::+}("foo");
-static field core::double v_minus = new self::A::•().{self::A::-}("bar");
+static field core::int* v_add = new self::A::•().{self::A::+}("foo");
+static field core::double* v_minus = new self::A::•().{self::A::-}("bar");
 static method main() → dynamic {
   self::v_add;
   self::v_minus;
diff --git a/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.transformed.expect
index a3d0601..2aa8013 100644
--- a/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_custom.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
-static field core::int v_add = new self::A::•().{self::A::+}("foo");
-static field core::double v_minus = new self::A::•().{self::A::-}("bar");
+static field core::int* v_add = new self::A::•().{self::A::+}("foo");
+static field core::double* v_minus = new self::A::•().{self::A::-}("bar");
 static method main() → dynamic {
   self::v_add;
   self::v_minus;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.expect
index b489197..ce38bb7 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.0.{core::num::==}(2.0);
-static field core::bool a_notEqual = !1.0.{core::num::==}(2.0);
-static field core::double a_add = 1.0.{core::double::+}(2.0);
-static field core::double a_subtract = 1.0.{core::double::-}(2.0);
-static field core::double a_multiply = 1.0.{core::double::*}(2.0);
-static field core::double a_divide = 1.0.{core::double::/}(2.0);
-static field core::int a_floorDivide = 1.0.{core::double::~/}(2.0);
-static field core::bool a_greater = 1.0.{core::num::>}(2.0);
-static field core::bool a_less = 1.0.{core::num::<}(2.0);
-static field core::bool a_greaterEqual = 1.0.{core::num::>=}(2.0);
-static field core::bool a_lessEqual = 1.0.{core::num::<=}(2.0);
-static field core::double a_modulo = 1.0.{core::double::%}(2.0);
+static field core::bool* a_equal = 1.0.{core::num::==}(2.0);
+static field core::bool* a_notEqual = !1.0.{core::num::==}(2.0);
+static field core::double* a_add = 1.0.{core::double::+}(2.0);
+static field core::double* a_subtract = 1.0.{core::double::-}(2.0);
+static field core::double* a_multiply = 1.0.{core::double::*}(2.0);
+static field core::double* a_divide = 1.0.{core::double::/}(2.0);
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2.0);
+static field core::bool* a_greater = 1.0.{core::num::>}(2.0);
+static field core::bool* a_less = 1.0.{core::num::<}(2.0);
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2.0);
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2.0);
+static field core::double* a_modulo = 1.0.{core::double::%}(2.0);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
index b489197..ce38bb7 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_double.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.0.{core::num::==}(2.0);
-static field core::bool a_notEqual = !1.0.{core::num::==}(2.0);
-static field core::double a_add = 1.0.{core::double::+}(2.0);
-static field core::double a_subtract = 1.0.{core::double::-}(2.0);
-static field core::double a_multiply = 1.0.{core::double::*}(2.0);
-static field core::double a_divide = 1.0.{core::double::/}(2.0);
-static field core::int a_floorDivide = 1.0.{core::double::~/}(2.0);
-static field core::bool a_greater = 1.0.{core::num::>}(2.0);
-static field core::bool a_less = 1.0.{core::num::<}(2.0);
-static field core::bool a_greaterEqual = 1.0.{core::num::>=}(2.0);
-static field core::bool a_lessEqual = 1.0.{core::num::<=}(2.0);
-static field core::double a_modulo = 1.0.{core::double::%}(2.0);
+static field core::bool* a_equal = 1.0.{core::num::==}(2.0);
+static field core::bool* a_notEqual = !1.0.{core::num::==}(2.0);
+static field core::double* a_add = 1.0.{core::double::+}(2.0);
+static field core::double* a_subtract = 1.0.{core::double::-}(2.0);
+static field core::double* a_multiply = 1.0.{core::double::*}(2.0);
+static field core::double* a_divide = 1.0.{core::double::/}(2.0);
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2.0);
+static field core::bool* a_greater = 1.0.{core::num::>}(2.0);
+static field core::bool* a_less = 1.0.{core::num::<}(2.0);
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2.0);
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2.0);
+static field core::double* a_modulo = 1.0.{core::double::%}(2.0);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.expect
index 2c6049e..4fb5e69 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.0.{core::num::==}(2);
-static field core::bool a_notEqual = !1.0.{core::num::==}(2);
-static field core::double a_add = 1.0.{core::double::+}(2);
-static field core::double a_subtract = 1.0.{core::double::-}(2);
-static field core::double a_multiply = 1.0.{core::double::*}(2);
-static field core::double a_divide = 1.0.{core::double::/}(2);
-static field core::int a_floorDivide = 1.0.{core::double::~/}(2);
-static field core::bool a_greater = 1.0.{core::num::>}(2);
-static field core::bool a_less = 1.0.{core::num::<}(2);
-static field core::bool a_greaterEqual = 1.0.{core::num::>=}(2);
-static field core::bool a_lessEqual = 1.0.{core::num::<=}(2);
-static field core::double a_modulo = 1.0.{core::double::%}(2);
+static field core::bool* a_equal = 1.0.{core::num::==}(2);
+static field core::bool* a_notEqual = !1.0.{core::num::==}(2);
+static field core::double* a_add = 1.0.{core::double::+}(2);
+static field core::double* a_subtract = 1.0.{core::double::-}(2);
+static field core::double* a_multiply = 1.0.{core::double::*}(2);
+static field core::double* a_divide = 1.0.{core::double::/}(2);
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2);
+static field core::bool* a_greater = 1.0.{core::num::>}(2);
+static field core::bool* a_less = 1.0.{core::num::<}(2);
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2);
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2);
+static field core::double* a_modulo = 1.0.{core::double::%}(2);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
index 2c6049e..4fb5e69 100644
--- a/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_double_int.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.0.{core::num::==}(2);
-static field core::bool a_notEqual = !1.0.{core::num::==}(2);
-static field core::double a_add = 1.0.{core::double::+}(2);
-static field core::double a_subtract = 1.0.{core::double::-}(2);
-static field core::double a_multiply = 1.0.{core::double::*}(2);
-static field core::double a_divide = 1.0.{core::double::/}(2);
-static field core::int a_floorDivide = 1.0.{core::double::~/}(2);
-static field core::bool a_greater = 1.0.{core::num::>}(2);
-static field core::bool a_less = 1.0.{core::num::<}(2);
-static field core::bool a_greaterEqual = 1.0.{core::num::>=}(2);
-static field core::bool a_lessEqual = 1.0.{core::num::<=}(2);
-static field core::double a_modulo = 1.0.{core::double::%}(2);
+static field core::bool* a_equal = 1.0.{core::num::==}(2);
+static field core::bool* a_notEqual = !1.0.{core::num::==}(2);
+static field core::double* a_add = 1.0.{core::double::+}(2);
+static field core::double* a_subtract = 1.0.{core::double::-}(2);
+static field core::double* a_multiply = 1.0.{core::double::*}(2);
+static field core::double* a_divide = 1.0.{core::double::/}(2);
+static field core::int* a_floorDivide = 1.0.{core::double::~/}(2);
+static field core::bool* a_greater = 1.0.{core::num::>}(2);
+static field core::bool* a_less = 1.0.{core::num::<}(2);
+static field core::bool* a_greaterEqual = 1.0.{core::num::>=}(2);
+static field core::bool* a_lessEqual = 1.0.{core::num::<=}(2);
+static field core::double* a_modulo = 1.0.{core::double::%}(2);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.expect
index c85b938..29ba83c 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.{core::num::==}(2.0);
-static field core::bool a_notEqual = !1.{core::num::==}(2.0);
-static field core::double a_add = 1.{core::num::+}(2.0);
-static field core::double a_subtract = 1.{core::num::-}(2.0);
-static field core::double a_multiply = 1.{core::num::*}(2.0);
-static field core::double a_divide = 1.{core::num::/}(2.0);
-static field core::int a_floorDivide = 1.{core::num::~/}(2.0);
-static field core::bool a_greater = 1.{core::num::>}(2.0);
-static field core::bool a_less = 1.{core::num::<}(2.0);
-static field core::bool a_greaterEqual = 1.{core::num::>=}(2.0);
-static field core::bool a_lessEqual = 1.{core::num::<=}(2.0);
-static field core::double a_modulo = 1.{core::num::%}(2.0);
+static field core::bool* a_equal = 1.{core::num::==}(2.0);
+static field core::bool* a_notEqual = !1.{core::num::==}(2.0);
+static field core::double* a_add = 1.{core::num::+}(2.0);
+static field core::double* a_subtract = 1.{core::num::-}(2.0);
+static field core::double* a_multiply = 1.{core::num::*}(2.0);
+static field core::double* a_divide = 1.{core::num::/}(2.0);
+static field core::int* a_floorDivide = 1.{core::num::~/}(2.0);
+static field core::bool* a_greater = 1.{core::num::>}(2.0);
+static field core::bool* a_less = 1.{core::num::<}(2.0);
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2.0);
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2.0);
+static field core::double* a_modulo = 1.{core::num::%}(2.0);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
index c85b938..29ba83c 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_double.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.{core::num::==}(2.0);
-static field core::bool a_notEqual = !1.{core::num::==}(2.0);
-static field core::double a_add = 1.{core::num::+}(2.0);
-static field core::double a_subtract = 1.{core::num::-}(2.0);
-static field core::double a_multiply = 1.{core::num::*}(2.0);
-static field core::double a_divide = 1.{core::num::/}(2.0);
-static field core::int a_floorDivide = 1.{core::num::~/}(2.0);
-static field core::bool a_greater = 1.{core::num::>}(2.0);
-static field core::bool a_less = 1.{core::num::<}(2.0);
-static field core::bool a_greaterEqual = 1.{core::num::>=}(2.0);
-static field core::bool a_lessEqual = 1.{core::num::<=}(2.0);
-static field core::double a_modulo = 1.{core::num::%}(2.0);
+static field core::bool* a_equal = 1.{core::num::==}(2.0);
+static field core::bool* a_notEqual = !1.{core::num::==}(2.0);
+static field core::double* a_add = 1.{core::num::+}(2.0);
+static field core::double* a_subtract = 1.{core::num::-}(2.0);
+static field core::double* a_multiply = 1.{core::num::*}(2.0);
+static field core::double* a_divide = 1.{core::num::/}(2.0);
+static field core::int* a_floorDivide = 1.{core::num::~/}(2.0);
+static field core::bool* a_greater = 1.{core::num::>}(2.0);
+static field core::bool* a_less = 1.{core::num::<}(2.0);
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2.0);
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2.0);
+static field core::double* a_modulo = 1.{core::num::%}(2.0);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.expect
index 58fb222..bee4a3d 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.{core::num::==}(2);
-static field core::bool a_notEqual = !1.{core::num::==}(2);
-static field core::int a_bitXor = 1.{core::int::^}(2);
-static field core::int a_bitAnd = 1.{core::int::&}(2);
-static field core::int a_bitOr = 1.{core::int::|}(2);
-static field core::int a_bitShiftRight = 1.{core::int::>>}(2);
-static field core::int a_bitShiftLeft = 1.{core::int::<<}(2);
-static field core::int a_add = 1.{core::num::+}(2);
-static field core::int a_subtract = 1.{core::num::-}(2);
-static field core::int a_multiply = 1.{core::num::*}(2);
-static field core::double a_divide = 1.{core::num::/}(2);
-static field core::int a_floorDivide = 1.{core::num::~/}(2);
-static field core::bool a_greater = 1.{core::num::>}(2);
-static field core::bool a_less = 1.{core::num::<}(2);
-static field core::bool a_greaterEqual = 1.{core::num::>=}(2);
-static field core::bool a_lessEqual = 1.{core::num::<=}(2);
-static field core::int a_modulo = 1.{core::num::%}(2);
+static field core::bool* a_equal = 1.{core::num::==}(2);
+static field core::bool* a_notEqual = !1.{core::num::==}(2);
+static field core::int* a_bitXor = 1.{core::int::^}(2);
+static field core::int* a_bitAnd = 1.{core::int::&}(2);
+static field core::int* a_bitOr = 1.{core::int::|}(2);
+static field core::int* a_bitShiftRight = 1.{core::int::>>}(2);
+static field core::int* a_bitShiftLeft = 1.{core::int::<<}(2);
+static field core::int* a_add = 1.{core::num::+}(2);
+static field core::int* a_subtract = 1.{core::num::-}(2);
+static field core::int* a_multiply = 1.{core::num::*}(2);
+static field core::double* a_divide = 1.{core::num::/}(2);
+static field core::int* a_floorDivide = 1.{core::num::~/}(2);
+static field core::bool* a_greater = 1.{core::num::>}(2);
+static field core::bool* a_less = 1.{core::num::<}(2);
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2);
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2);
+static field core::int* a_modulo = 1.{core::num::%}(2);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
index 58fb222..bee4a3d 100644
--- a/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_binary_int_int.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a_equal = 1.{core::num::==}(2);
-static field core::bool a_notEqual = !1.{core::num::==}(2);
-static field core::int a_bitXor = 1.{core::int::^}(2);
-static field core::int a_bitAnd = 1.{core::int::&}(2);
-static field core::int a_bitOr = 1.{core::int::|}(2);
-static field core::int a_bitShiftRight = 1.{core::int::>>}(2);
-static field core::int a_bitShiftLeft = 1.{core::int::<<}(2);
-static field core::int a_add = 1.{core::num::+}(2);
-static field core::int a_subtract = 1.{core::num::-}(2);
-static field core::int a_multiply = 1.{core::num::*}(2);
-static field core::double a_divide = 1.{core::num::/}(2);
-static field core::int a_floorDivide = 1.{core::num::~/}(2);
-static field core::bool a_greater = 1.{core::num::>}(2);
-static field core::bool a_less = 1.{core::num::<}(2);
-static field core::bool a_greaterEqual = 1.{core::num::>=}(2);
-static field core::bool a_lessEqual = 1.{core::num::<=}(2);
-static field core::int a_modulo = 1.{core::num::%}(2);
+static field core::bool* a_equal = 1.{core::num::==}(2);
+static field core::bool* a_notEqual = !1.{core::num::==}(2);
+static field core::int* a_bitXor = 1.{core::int::^}(2);
+static field core::int* a_bitAnd = 1.{core::int::&}(2);
+static field core::int* a_bitOr = 1.{core::int::|}(2);
+static field core::int* a_bitShiftRight = 1.{core::int::>>}(2);
+static field core::int* a_bitShiftLeft = 1.{core::int::<<}(2);
+static field core::int* a_add = 1.{core::num::+}(2);
+static field core::int* a_subtract = 1.{core::num::-}(2);
+static field core::int* a_multiply = 1.{core::num::*}(2);
+static field core::double* a_divide = 1.{core::num::/}(2);
+static field core::int* a_floorDivide = 1.{core::num::~/}(2);
+static field core::bool* a_greater = 1.{core::num::>}(2);
+static field core::bool* a_less = 1.{core::num::<}(2);
+static field core::bool* a_greaterEqual = 1.{core::num::>=}(2);
+static field core::bool* a_lessEqual = 1.{core::num::<=}(2);
+static field core::int* a_modulo = 1.{core::num::%}(2);
 static method main() → dynamic {
   self::a_equal;
   self::a_notEqual;
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.expect
index 7a49b3e..d539e95 100644
--- a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::num a = 1.{core::num::==}(2) ?{core::num} 1 : 2.0;
-static field core::num b = 1.{core::num::==}(2) ?{core::num} 1.0 : 2;
+static field core::num* a = 1.{core::num::==}(2) ?{core::num*} 1 : 2.0;
+static field core::num* b = 1.{core::num::==}(2) ?{core::num*} 1.0 : 2;
 static method main() → dynamic {
   self::a;
   self::b;
diff --git a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
index 7a49b3e..d539e95 100644
--- a/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_conditional.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::num a = 1.{core::num::==}(2) ?{core::num} 1 : 2.0;
-static field core::num b = 1.{core::num::==}(2) ?{core::num} 1.0 : 2;
+static field core::num* a = 1.{core::num::==}(2) ?{core::num*} 1 : 2.0;
+static field core::num* b = 1.{core::num::==}(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.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
index 80d04c7..b6d63ca 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.expect
@@ -1,34 +1,36 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field dynamic m1 = inf::a1;
-static const field dynamic m2 = inf::a2;
+static const field dynamic m1 = #C1;
+static const field dynamic m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = self::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
-import "infer_consts_transitively_2.dart" as self;
-import "infer_consts_transitively_2_b.dart" as inf2;
+import self as self2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
 
-static const field dynamic a1 = self::m2;
-static const field dynamic a2 = inf2::b1;
+static const field dynamic a1 = #C1;
+static const field dynamic a2 = #C1;
 static method main() → dynamic {}
 
 library;
-import self as inf2;
+import self as self3;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  inf2::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
index 80d04c7..b6d63ca 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.legacy.transformed.expect
@@ -1,34 +1,36 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field dynamic m1 = inf::a1;
-static const field dynamic m2 = inf::a2;
+static const field dynamic m1 = #C1;
+static const field dynamic m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = self::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
-import "infer_consts_transitively_2.dart" as self;
-import "infer_consts_transitively_2_b.dart" as inf2;
+import self as self2;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
 
-static const field dynamic a1 = self::m2;
-static const field dynamic a2 = inf2::b1;
+static const field dynamic a1 = #C1;
+static const field dynamic a2 = #C1;
 static method main() → dynamic {}
 
 library;
-import self as inf2;
+import self as self3;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  inf2::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
index d434a70..ba94200 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.expect
@@ -1,36 +1,37 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field core::int m1 = inf::a1;
-static const field core::int m2 = inf::a2;
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = self::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2.dart" as self;
-import "infer_consts_transitively_2_b.dart" as inf2;
 
 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 = self::m2;
-static const field core::int a2 = inf2::b1;
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
 static method main() → dynamic {}
 
 library;
-import self as inf2;
+import self as self3;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  inf2::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
index d434a70..ba94200 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2.dart.strong.transformed.expect
@@ -1,36 +1,37 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field core::int m1 = inf::a1;
-static const field core::int m2 = inf::a2;
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = self::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2.dart" as self;
-import "infer_consts_transitively_2_b.dart" as inf2;
 
 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 = self::m2;
-static const field core::int a2 = inf2::b1;
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
 static method main() → dynamic {}
 
 library;
-import self as inf2;
+import self as self3;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  inf2::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
index 6fa0ac1..b9e7c92 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.expect
@@ -1,34 +1,36 @@
 library;
 import self as self;
-import "infer_consts_transitively_2.dart" as test;
-import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
 
-static const field dynamic a1 = test::m2;
-static const field dynamic a2 = inf::b1;
+static const field dynamic a1 = #C1;
+static const field dynamic a2 = #C1;
 static method main() → dynamic {}
 
 library test;
-import self as test;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field dynamic m1 = self::a1;
-static const field dynamic m2 = self::a2;
+static const field dynamic m1 = #C1;
+static const field dynamic m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = test::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self3;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  inf::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
index 6fa0ac1..b9e7c92 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.legacy.transformed.expect
@@ -1,34 +1,36 @@
 library;
 import self as self;
-import "infer_consts_transitively_2.dart" as test;
-import "infer_consts_transitively_2_b.dart" as inf;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2.dart";
 import "org-dartlang-testcase:///infer_consts_transitively_2_b.dart";
 
-static const field dynamic a1 = test::m2;
-static const field dynamic a2 = inf::b1;
+static const field dynamic a1 = #C1;
+static const field dynamic a2 = #C1;
 static method main() → dynamic {}
 
 library test;
-import self as test;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field dynamic m1 = self::a1;
-static const field dynamic m2 = self::a2;
+static const field dynamic m1 = #C1;
+static const field dynamic m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = test::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self3;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  inf::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
index f548afe..7f72a48 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.expect
@@ -1,36 +1,37 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2.dart" as test;
-import "infer_consts_transitively_2_b.dart" as inf;
 
 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 = test::m2;
-static const field core::int a2 = inf::b1;
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
 static method main() → dynamic {}
 
 library test;
-import self as test;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field core::int m1 = self::a1;
-static const field core::int m2 = self::a2;
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = test::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self3;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  inf::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
index f548afe..7f72a48 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_a.dart.strong.transformed.expect
@@ -1,36 +1,37 @@
 library;
 import self as self;
 import "dart:core" as core;
-import "infer_consts_transitively_2.dart" as test;
-import "infer_consts_transitively_2_b.dart" as inf;
 
 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 = test::m2;
-static const field core::int a2 = inf::b1;
+static const field core::int* a1 = #C1;
+static const field core::int* a2 = #C1;
 static method main() → dynamic {}
 
 library test;
-import self as test;
+import self as self2;
 import "dart:core" as core;
-import "infer_consts_transitively_2_a.dart" as self;
 
 import "org-dartlang-testcase:///infer_consts_transitively_2_a.dart";
 
-static const field core::int m1 = self::a1;
-static const field core::int m2 = self::a2;
+static const field core::int* m1 = #C1;
+static const field core::int* m2 = #C1;
 static method foo() → dynamic {
-  core::int i;
-  i = test::m1;
+  core::int* i;
+  i = #C1;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self3;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  inf::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect
index 335fe8e..93728ba 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.expect
@@ -1,7 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect
index 335fe8e..93728ba 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.legacy.transformed.expect
@@ -1,7 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.expect
index b60ae23..85d3066 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.transformed.expect
index b60ae23..85d3066 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_2_b.dart.strong.transformed.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect
index 335fe8e..93728ba 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.expect
@@ -1,7 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect
index 335fe8e..93728ba 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.legacy.transformed.expect
@@ -1,7 +1,12 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic b1 = 2;
+static const field dynamic b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.expect
index b60ae23..85d3066 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.transformed.expect
index b60ae23..85d3066 100644
--- a/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_consts_transitively_b.dart.strong.transformed.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int b1 = 2;
+static const field core::int* b1 = #C1;
 static method main() → dynamic {
-  self::b1;
+  #C1;
+}
+
+constants  {
+  #C1 = 2
 }
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect
index b847473..724bed3 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.expect
@@ -6,7 +6,7 @@
   field dynamic x = null;
   field dynamic y = 2;
   field dynamic z = "hi";
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -15,13 +15,13 @@
   field dynamic y = 3;
   field dynamic z = null;
   field dynamic w = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String s;
-  core::int i;
+  core::String* s;
+  core::int* i;
   s = new self::B::•().x;
   s = new self::B::•().y;
   s = new self::B::•().z;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect
index b847473..724bed3 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   field dynamic x = null;
   field dynamic y = 2;
   field dynamic z = "hi";
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -15,13 +15,13 @@
   field dynamic y = 3;
   field dynamic z = null;
   field dynamic w = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String s;
-  core::int i;
+  core::String* s;
+  core::int* i;
   s = new self::B::•().x;
   s = new self::B::•().y;
   s = new self::B::•().z;
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
index 06929ac..2d18242 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.expect
@@ -22,40 +22,40 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  field core::int y = 2;
-  field core::String z = "hi";
-  synthetic constructor •() → self::A
+  field core::int* y = 2;
+  field core::String* z = "hi";
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 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
+  field core::int* y = 3;
+  field core::String* z = null;
+  field core::int* w = 2;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String s;
-  core::int i;
-  s = new self::B::•().{self::B::x} as{TypeError} core::String;
+  core::String* s;
+  core::int* i;
+  s = new self::B::•().{self::B::x} as{TypeError} core::String*;
   s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
-                                                             ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
+                                                             ^" in new self::B::•().{self::B::y} as{TypeError} core::String*;
   s = new self::B::•().{self::B::z};
   s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
-                                                             ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
-  i = new self::B::•().{self::B::x} as{TypeError} core::int;
+                                                             ^" in new self::B::•().{self::B::w} as{TypeError} core::String*;
+  i = new self::B::•().{self::B::x} as{TypeError} core::int*;
   i = new self::B::•().{self::B::y};
   i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
-                                                             ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
+                                                             ^" in new self::B::•().{self::B::z} as{TypeError} core::int*;
   i = new self::B::•().{self::B::w};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
index 06929ac..2d18242 100644
--- a/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart.strong.transformed.expect
@@ -22,40 +22,40 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  field core::int y = 2;
-  field core::String z = "hi";
-  synthetic constructor •() → self::A
+  field core::int* y = 2;
+  field core::String* z = "hi";
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 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
+  field core::int* y = 3;
+  field core::String* z = null;
+  field core::int* w = 2;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String s;
-  core::int i;
-  s = new self::B::•().{self::B::x} as{TypeError} core::String;
+  core::String* s;
+  core::int* i;
+  s = new self::B::•().{self::B::x} as{TypeError} core::String*;
   s = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:21:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::y*/ y;
-                                                             ^" in new self::B::•().{self::B::y} as{TypeError} core::String;
+                                                             ^" in new self::B::•().{self::B::y} as{TypeError} core::String*;
   s = new self::B::•().{self::B::z};
   s = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:23:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   s = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::w*/ w;
-                                                             ^" in new self::B::•().{self::B::w} as{TypeError} core::String;
-  i = new self::B::•().{self::B::x} as{TypeError} core::int;
+                                                             ^" in new self::B::•().{self::B::w} as{TypeError} core::String*;
+  i = new self::B::•().{self::B::x} as{TypeError} core::int*;
   i = new self::B::•().{self::B::y};
   i = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/infer_correctly_on_multiple_variables_declared_together.dart:27:62: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   i = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::z*/ z;
-                                                             ^" in new self::B::•().{self::B::z} as{TypeError} core::int;
+                                                             ^" in new self::B::•().{self::B::z} as{TypeError} core::int*;
   i = new self::B::•().{self::B::w};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect
index 651dbc3..b297f39e 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect
index 651dbc3..b297f39e 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.legacy.transformed.expect
@@ -4,13 +4,13 @@
 
 class A extends core::Object implements self::B {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
index 03923d9..218f5e9 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.outline.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object implements self::B {
   field dynamic x;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
   field dynamic x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.expect
index cedf5e1..bb1e1ca 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::B
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.transformed.expect
index cedf5e1..bb1e1ca 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_field.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::B
+  field core::int* x = 0;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect
index 4b35f0e..98f6bb4 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect
index 4b35f0e..98f6bb4 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.outline.expect
index b7b8fe3..767f51f 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x;
-  synthetic constructor •() → self::A
+  field core::int* x;
+  synthetic constructor •() → self::A*
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.expect
index 4b35f0e..98f6bb4 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.transformed.expect
index 4b35f0e..98f6bb4 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_getter.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect
index 94de153..f0ddfd0 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect
index 94de153..f0ddfd0 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.outline.expect
index 25d6786..0ed58bc 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x;
-  synthetic constructor •() → self::A
+  field core::int* x;
+  synthetic constructor •() → self::A*
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.expect
index 94de153..f0ddfd0 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.transformed.expect
index 94de153..f0ddfd0 100644
--- a/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_from_later_inferred_setter.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
index 7ba15bc..ad9f4fa 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart
@@ -21,7 +21,7 @@
   double get x;
 }
 
-// Superclasses have a consistent type for `x` so inferrence succeeds.
+// Superclasses have a consistent type for `x` so inference succeeds.
 class E extends A implements B {
   var x;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect
index b67d77f..863160b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.expect
@@ -21,50 +21,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 class E extends self::A implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::E
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field invalid-type x = null;
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect
index b67d77f..863160b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.legacy.transformed.expect
@@ -21,50 +21,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 class E extends self::A implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::E
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field invalid-type x = null;
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
index ac7a863..d186b99 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.outline.expect
@@ -21,43 +21,43 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 class E extends self::A implements self::B {
-  field core::int x;
-  synthetic constructor •() → self::E
+  field core::int* x;
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends self::A implements self::C {
   field invalid-type x;
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
 }
 class G extends self::A implements self::D {
   field invalid-type x;
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     ;
 }
 class H extends self::C implements self::D {
   field invalid-type x;
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
index b67d77f..863160b 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_multiple.dart.strong.expect
@@ -21,50 +21,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 class E extends self::A implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::E
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super self::A::•()
     ;
 }
 class F extends self::A implements self::C {
   field invalid-type x = null;
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::A::•()
     ;
 }
 class G extends self::A implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super self::A::•()
     ;
 }
 class H extends self::C implements self::D {
   field invalid-type x = null;
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect
index f9b40cd..f531a5f 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect
index f9b40cd..f531a5f 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.outline.expect
index f76fc3b..5768045 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
-  field core::int x;
-  synthetic constructor •() → self::C
+  field core::int* x;
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.expect
index f9b40cd..f531a5f 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.transformed.expect
index f9b40cd..f531a5f 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_of_override.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
index c395f30..96281e0 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → self::A<self::A::T>
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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(generic-covariant-impl core::List<self::A::T> value) → void;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(generic-covariant-impl core::List<self::A::T*>* value) → void;
 }
-class B extends self::A<core::int> {
-  field core::List<core::int> x = null;
-  generic-covariant-impl field core::List<core::int> y = null;
-  generic-covariant-impl field core::List<core::int> z = null;
-  synthetic constructor •() → self::B
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x = null;
+  generic-covariant-impl field core::List<core::int*>* y = null;
+  generic-covariant-impl field core::List<core::int*>* z = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
index c395f30..96281e0 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → self::A<self::A::T>
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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(generic-covariant-impl core::List<self::A::T> value) → void;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(generic-covariant-impl core::List<self::A::T*>* value) → void;
 }
-class B extends self::A<core::int> {
-  field core::List<core::int> x = null;
-  generic-covariant-impl field core::List<core::int> y = null;
-  generic-covariant-impl field core::List<core::int> z = null;
-  synthetic constructor •() → self::B
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x = null;
+  generic-covariant-impl field core::List<core::int*>* y = null;
+  generic-covariant-impl field core::List<core::int*>* z = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
index 711058e..7bacf95 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.outline.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> z;
-  synthetic constructor •() → self::A<self::A::T>
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* z;
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
-  abstract get x() → core::List<self::A::T>;
-  abstract set y(generic-covariant-impl core::List<self::A::T> value) → void;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(generic-covariant-impl core::List<self::A::T*>* value) → void;
 }
-class B extends self::A<core::int> {
-  field core::List<core::int> x;
-  generic-covariant-impl field core::List<core::int> y;
-  generic-covariant-impl field core::List<core::int> z;
-  synthetic constructor •() → self::B
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x;
+  generic-covariant-impl field core::List<core::int*>* y;
+  generic-covariant-impl field core::List<core::int*>* z;
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
index c395f30..96281e0 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → self::A<self::A::T>
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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(generic-covariant-impl core::List<self::A::T> value) → void;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(generic-covariant-impl core::List<self::A::T*>* value) → void;
 }
-class B extends self::A<core::int> {
-  field core::List<core::int> x = null;
-  generic-covariant-impl field core::List<core::int> y = null;
-  generic-covariant-impl field core::List<core::int> z = null;
-  synthetic constructor •() → self::B
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x = null;
+  generic-covariant-impl field core::List<core::int*>* y = null;
+  generic-covariant-impl field core::List<core::int*>* z = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
index c395f30..96281e0 100644
--- a/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_override_with_substitution.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> z = null;
-  synthetic constructor •() → self::A<self::A::T>
+abstract class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl 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(generic-covariant-impl core::List<self::A::T> value) → void;
+  abstract get x() → core::List<self::A::T*>*;
+  abstract set y(generic-covariant-impl core::List<self::A::T*>* value) → void;
 }
-class B extends self::A<core::int> {
-  field core::List<core::int> x = null;
-  generic-covariant-impl field core::List<core::int> y = null;
-  generic-covariant-impl field core::List<core::int> z = null;
-  synthetic constructor •() → self::B
+class B extends self::A<core::int*> {
+  field core::List<core::int*>* x = null;
+  generic-covariant-impl field core::List<core::int*>* y = null;
+  generic-covariant-impl field core::List<core::int*>* z = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect
index 9f9de47..a6eac70 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect
index 9f7817b..f2ba8da 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.legacy.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
index 99e2051..33d450e 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.outline.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
 }
 class C extends self::A {
-  field core::int x;
-  synthetic constructor •() → self::C
+  field core::int* x;
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::B {
-  field core::int x;
-  synthetic constructor •() → self::D
+  field core::int* x;
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object implements self::A {
-  field core::int x;
-  synthetic constructor •() → self::E
+  field core::int* x;
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x;
-  synthetic constructor •() → self::F
+  field core::int* x;
+  synthetic constructor •() → self::F*
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x;
-  synthetic constructor •() → self::G
+  field core::int* x;
+  synthetic constructor •() → self::G*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
index 9f9de47..a6eac70 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
index 9f7817b..f2ba8da 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_getter.dart.strong.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect
index 3c16ce0..15bcc2c 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect
index e3da27e..485fda2 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.legacy.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
index 0ce880d..f3a0cea 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.outline.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
 }
 class C extends self::A {
-  field core::int x;
-  synthetic constructor •() → self::C
+  field core::int* x;
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::B {
-  field core::int x;
-  synthetic constructor •() → self::D
+  field core::int* x;
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object implements self::A {
-  field core::int x;
-  synthetic constructor •() → self::E
+  field core::int* x;
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x;
-  synthetic constructor •() → self::F
+  field core::int* x;
+  synthetic constructor •() → self::F*
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x;
-  synthetic constructor •() → self::G
+  field core::int* x;
+  synthetic constructor •() → self::G*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
index 3c16ce0..15bcc2c 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
index e3da27e..485fda2 100644
--- a/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_overrides_setter.dart.strong.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class C extends self::A {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  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
+  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
+  field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object implements self::B {
-  field core::int x = null;
-  synthetic constructor •() → self::F
+  field core::int* x = null;
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 abstract class _G&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_G&Object&B
+  const synthetic constructor •() → self::_G&Object&B*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class G extends self::_G&Object&B {
-  field core::int x = null;
-  synthetic constructor •() → self::G
+  field core::int* x = null;
+  synthetic constructor •() → self::G*
     : super self::_G&Object&B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect
index a742a6d..85fb413 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  static get x() → core::int
+  static get x() → core::int*
     return 0;
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect
index a742a6d..85fb413 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  static get x() → core::int
+  static get x() → core::int*
     return 0;
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.outline.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.outline.expect
index a9eb1ec..9fd64c9 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  static get x() → core::int
+  static get x() → core::int*
     ;
 }
 class B extends self::A {
   static field dynamic x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::A {
   static field dynamic x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method f() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.strong.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.strong.expect
index a742a6d..85fb413 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  static get x() → core::int
+  static get x() → core::int*
     return 0;
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_field_static.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_field_static.dart.strong.transformed.expect
index a742a6d..85fb413 100644
--- a/pkg/front_end/testcases/inference/infer_field_static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_field_static.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  static get x() → core::int
+  static get x() → core::int*
     return 0;
 }
 class B extends self::A {
   static field dynamic x = self::f();
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::A {
   static field dynamic x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect
index e03bb9e..879e389 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  set x(core::double value) → void {}
+  abstract get x() → core::int*;
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect
index e03bb9e..879e389 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  set x(core::double value) → void {}
+  abstract get x() → core::int*;
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
index 4709de3..b917227 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::int;
-  set x(core::double value) → void
+  abstract get x() → core::int*;
+  set x(core::double* value) → void
     ;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
index 97ca47c..af85fef 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  set x(core::double value) → void {}
+  abstract get x() → core::int*;
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(core::int x) → self::B
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
index 97ca47c..af85fef 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_and_setter.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  set x(core::double value) → void {}
+  abstract get x() → core::int*;
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(core::int x) → self::B
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect
index 7dea358..f7faf92 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect
index 7dea358..f7faf92 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
index 5e18eaa..167fce8 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(dynamic x) → self::B
+  final field core::int* x;
+  constructor •(dynamic x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.expect
index cb590b2..d0875bb 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(core::int x) → self::B
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.transformed.expect
index cb590b2..d0875bb 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_getter_only.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class B extends self::A {
-  final field core::int x;
-  constructor •(core::int x) → self::B
+  final field core::int* x;
+  constructor •(core::int* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect
index 148028f..f4b12bb 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::double value) → void {}
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::double x;
-  constructor •(dynamic x) → self::B
+  final field core::double* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect
index 148028f..f4b12bb 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::double value) → void {}
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::double x;
-  constructor •(dynamic x) → self::B
+  final field core::double* x;
+  constructor •(dynamic x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
index b0206ee..afb8687 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  set x(core::double value) → void
+  set x(core::double* value) → void
     ;
 }
 class B extends self::A {
-  final field core::double x;
-  constructor •(dynamic x) → self::B
+  final field core::double* x;
+  constructor •(dynamic x) → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
index dad58c5..17c9bd8 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::double value) → void {}
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::double x;
-  constructor •(core::double x) → self::B
+  final field core::double* x;
+  constructor •(core::double* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
index dad58c5..17c9bd8 100644
--- a/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_final_field_setter_only.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::double value) → void {}
+  set x(core::double* value) → void {}
 }
 class B extends self::A {
-  final field core::double x;
-  constructor •(core::double x) → self::B
+  final field core::double* x;
+  constructor •(core::double* x) → self::B*
     : self::B::x = x, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
index ec28367..a191aef 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart
@@ -26,7 +26,7 @@
 var f =
     2 /*@target=num::+*/ + 3; // binary expressions are OK if the left operand
 // is from a library in a different strongest
-// conected component.
+// connected component.
 var g = /*@target=int::unary-*/ -3;
 var h = new A() /*@target=A::+*/ + 3;
 var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
index 7004d74..93e7e69 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.expect
@@ -14,29 +14,29 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → self::B
+  operator +(dynamic other) → self::B*
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → self::B
+  constructor •(dynamic ignore) → self::B*
     : super self::A::•()
     ;
 }
 static field dynamic a = new self::A::•();
-static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
-static field dynamic c2 = const <dynamic>[];
+static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))];
+static field dynamic c2 = #C3;
 static field dynamic d = <dynamic, dynamic>{"a": "b"};
 static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
 static field dynamic f = 2.+(3);
 static field dynamic g = 3.unary-();
 static field dynamic h = new self::A::•().+(3);
 static field dynamic i = new self::A::•().unary-();
-static field dynamic j = null as self::B;
+static field dynamic j = null as self::B*;
 static method test1() → dynamic {
   self::a = "hi";
   self::a = new self::B::•(3);
@@ -62,3 +62,10 @@
   self::j = <dynamic>[];
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #x
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
index 7004d74..93e7e69 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.legacy.transformed.expect
@@ -14,29 +14,29 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → self::B
+  operator +(dynamic other) → self::B*
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → self::B
+  constructor •(dynamic ignore) → self::B*
     : super self::A::•()
     ;
 }
 static field dynamic a = new self::A::•();
-static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))];
-static field dynamic c2 = const <dynamic>[];
+static field dynamic b = new self::B::•(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+static field dynamic c1 = <dynamic>[throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))];
+static field dynamic c2 = #C3;
 static field dynamic d = <dynamic, dynamic>{"a": "b"};
 static field dynamic e = let final dynamic #t1 = new self::A::•() in let final dynamic #t2 = #t1.x = 3 in #t1;
 static field dynamic f = 2.+(3);
 static field dynamic g = 3.unary-();
 static field dynamic h = new self::A::•().+(3);
 static field dynamic i = new self::A::•().unary-();
-static field dynamic j = null as self::B;
+static field dynamic j = null as self::B*;
 static method test1() → dynamic {
   self::a = "hi";
   self::a = new self::B::•(3);
@@ -62,3 +62,10 @@
   self::j = <dynamic>[];
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #x
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
index 4002d85..0122ef4 100644
--- a/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart.strong.expect
@@ -89,82 +89,82 @@
 import "dart:collection" as col;
 
 class A extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::A
+  field core::int* x = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → self::B
+  operator +(dynamic other) → self::B*
     return null;
 }
 class B extends self::A {
-  constructor •(dynamic ignore) → self::B
+  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: Getter not found: 'x'.
+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: Getter not found: 'x'.
 var b = new B(/*error:UNDEFINED_IDENTIFIER*/ x); // allocations
                                              ^");
-static field core::List<dynamic> c1 = <dynamic>[invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
+static field core::List<dynamic>* c1 = <dynamic>[invalid-expression "pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart:21:34: Error: Getter not found: 'x'.
   /*error:UNDEFINED_IDENTIFIER*/ x
                                  ^"];
-static field core::List<dynamic> c2 = const <dynamic>[];
-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 let final dynamic #t2 = #t1.{self::A::x} = 3 in #t1;
-static field core::int f = 2.{core::num::+}(3);
-static field core::int g = 3.{core::int::unary-}();
-static field self::B h = new self::A::•().{self::A::+}(3);
+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 let final dynamic #t2 = #t1.{self::A::x} = 3 in #t1;
+static field core::int* f = 2.{core::num::+}(3);
+static field core::int* g = 3.{core::int::unary-}();
+static field self::B* h = new self::A::•().{self::A::+}(3);
 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 method '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 name to the name of an existing method, or defining a method named 'unary-'.
 var i = /*error:UNDEFINED_OPERATOR,info:DYNAMIC_INVOKE*/ -new A();
                                                          ^";
-static field self::B j = null as self::B;
+static field self::B* j = null as self::B*;
 static method test1() → dynamic {
   self::a = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} self::A;
+                                   ^" in "hi" as{TypeError} self::A*;
   self::a = new self::B::•(3);
   self::b = let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} self::B;
+                                   ^" in "hi" as{TypeError} self::B*;
   self::b = new self::B::•(3);
   self::c1 = <dynamic>[];
-  self::c1 = let final core::Set<dynamic> #t5 = col::LinkedHashSet::•<dynamic>() in #t5;
+  self::c1 = let final core::Set<dynamic>* #t5 = col::LinkedHashSet::•<dynamic>() in #t5;
   self::c2 = <dynamic>[];
-  self::c2 = let final core::Set<dynamic> #t6 = col::LinkedHashSet::•<dynamic>() in #t6;
+  self::c2 = let final core::Set<dynamic>* #t6 = col::LinkedHashSet::•<dynamic>() in #t6;
   self::d = <dynamic, dynamic>{};
   self::d = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'Map<dynamic, dynamic>'.
   d = /*error:INVALID_ASSIGNMENT*/ 3;
-                                   ^" in 3 as{TypeError} core::Map<dynamic, dynamic>;
+                                   ^" in 3 as{TypeError} core::Map<dynamic, dynamic>*;
   self::e = new self::A::•();
   self::e = let final<BottomType> #t8 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
   e = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic, dynamic*/ {};
-                                                                  ^" in <dynamic, dynamic>{} as{TypeError} self::A;
+                                                                  ^" in <dynamic, dynamic>{} as{TypeError} self::A*;
   self::f = 3;
   self::f = let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   f = /*error:INVALID_ASSIGNMENT*/ false;
-                                   ^" in false as{TypeError} core::int;
+                                   ^" in false as{TypeError} core::int*;
   self::g = 1;
   self::g = let final<BottomType> #t10 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   g = /*error:INVALID_ASSIGNMENT*/ false;
-                                   ^" in false as{TypeError} core::int;
+                                   ^" in false as{TypeError} core::int*;
   self::h = let final<BottomType> #t11 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   h = /*error:INVALID_ASSIGNMENT*/ false;
-                                   ^" in false as{TypeError} self::B;
+                                   ^" in false as{TypeError} self::B*;
   self::h = new self::B::•("b");
   self::i = false;
   self::j = new self::B::•("b");
@@ -172,12 +172,16 @@
  - 'B' is from 'pkg/front_end/testcases/inference/infer_from_complex_expressions_if_outer_most_value_is_precise.dart'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ false;
-                                   ^" in false as{TypeError} self::B;
+                                   ^" in false as{TypeError} self::B*;
   self::j = let final<BottomType> #t13 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B'.
   j = /*error:INVALID_ASSIGNMENT*/ /*@typeArgs=dynamic*/ [];
-                                                         ^" in <dynamic>[] as{TypeError} self::B;
+                                                         ^" 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.legacy.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.expect
index 0c29668..b0c4d18 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect
index 0c29668..b0c4d18 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.legacy.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.expect
index 2ec593c..077060d 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.transformed.expect
index 2ec593c..077060d 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields.dart.strong.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} 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.legacy.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.expect
index 59b1886..484b784 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect
index 59b1886..484b784 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.legacy.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.expect
index 00c2d9a..43604a1 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} 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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.transformed.expect
index 00c2d9a..43604a1 100644
--- a/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_rhs_only_if_it_wont_conflict_with_overridden_fields2.dart.strong.transformed.expect
@@ -4,18 +4,18 @@
 
 class A extends core::Object {
   final field dynamic x = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
   final field dynamic x = 2;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} 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.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
index 9c32726..7d2880b 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.expect
@@ -7,7 +7,7 @@
 
 static field dynamic y = inf::x;
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::x;
   t = self::y;
 }
@@ -30,12 +30,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf2::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf2::A::x;
   t = self2::B::y;
 }
@@ -49,7 +49,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf2::A
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
index 9c32726..7d2880b 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
 
 static field dynamic y = inf::x;
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::x;
   t = self::y;
 }
@@ -30,12 +30,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf2::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf2::A::x;
   t = self2::B::y;
 }
@@ -49,7 +49,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf2::A
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
index 3e157ba..152d2d6 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.expect
@@ -5,9 +5,9 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
-static field core::int y = inf::x;
+static field core::int* y = inf::x;
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::x;
   t = self::y;
 }
@@ -19,7 +19,7 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {}
 
 library test;
@@ -30,13 +30,13 @@
 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
+  static field core::int* y = inf2::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf2::A::x;
   t = self2::B::y;
 }
@@ -49,8 +49,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
index 3e157ba..152d2d6 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on.dart.strong.transformed.expect
@@ -5,9 +5,9 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart";
 
-static field core::int y = inf::x;
+static field core::int* y = inf::x;
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::x;
   t = self::y;
 }
@@ -19,7 +19,7 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {}
 
 library test;
@@ -30,13 +30,13 @@
 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
+  static field core::int* y = inf2::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf2::A::x;
   t = self2::B::y;
 }
@@ -49,8 +49,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
index 11440fd..11e3dc9 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.expect
@@ -7,12 +7,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self::B::y;
 }
@@ -26,7 +26,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
index 11440fd..11e3dc9 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.legacy.transformed.expect
@@ -7,12 +7,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self::B::y;
 }
@@ -26,7 +26,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
index d23de18..3880d6f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.expect
@@ -6,13 +6,13 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self::B::y;
 }
@@ -25,8 +25,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
index d23de18..3880d6f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2.dart.strong.transformed.expect
@@ -6,13 +6,13 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self::B::y;
 }
@@ -25,8 +25,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
index 3f3d4f9..8721576 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -21,12 +21,12 @@
 
 class B extends core::Object {
   static field dynamic y = self::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = self::A::x;
   t = self2::B::y;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
index 3f3d4f9..8721576 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -21,12 +21,12 @@
 
 class B extends core::Object {
   static field dynamic y = self::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = self::A::x;
   t = self2::B::y;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
index 1ace456..a2aba38 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.expect
@@ -5,8 +5,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -20,13 +20,13 @@
 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
+  static field core::int* y = self::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = self::A::x;
   t = self2::B::y;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
index 1ace456..a2aba38 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on2_a.dart.strong.transformed.expect
@@ -5,8 +5,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -20,13 +20,13 @@
 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
+  static field core::int* y = self::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = self::A::x;
   t = self2::B::y;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
index 12230fd..c4a27d0 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.expect
@@ -15,12 +15,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self2::B::y;
 }
@@ -34,7 +34,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
index 12230fd..c4a27d0 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.legacy.transformed.expect
@@ -15,12 +15,12 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self2::B
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self2::B::y;
 }
@@ -34,7 +34,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
index f6fbc3e..562b75c 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.expect
@@ -4,7 +4,7 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {}
 
 library test;
@@ -15,13 +15,13 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self2::B::y;
 }
@@ -34,8 +34,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
index f6fbc3e..562b75c 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_cycle_libs_when_flag_is_on_a.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_cycle_libs_when_flag_is_on2.dart";
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {}
 
 library test;
@@ -15,13 +15,13 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self2::B*
     : super core::Object::•()
     ;
 }
 static method test1() → dynamic {
-  core::int t = 3;
+  core::int* t = 3;
   t = inf::A::x;
   t = self2::B::y;
 }
@@ -34,8 +34,8 @@
 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
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
index 1499bf7..a041075 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.expect
@@ -18,16 +18,16 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
 
-static field core::int y = inf::x;
+static field core::int* y = inf::x;
 static method test1() → dynamic {
   inf::x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   self::y = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
 
@@ -35,7 +35,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static field core::int x = 2;
+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_flag.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
index 1499bf7..a041075 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag.dart.strong.transformed.expect
@@ -18,16 +18,16 @@
 
 import "org-dartlang-testcase:///infer_from_variables_in_non_cycle_imports_with_flag_a.dart";
 
-static field core::int y = inf::x;
+static field core::int* y = inf::x;
 static method test1() → dynamic {
   inf::x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   self::y = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
 
@@ -35,7 +35,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static field core::int x = 2;
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
index 426906e..68f375f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.expect
@@ -7,7 +7,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -23,7 +23,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
index 426906e..68f375f 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.legacy.transformed.expect
@@ -7,7 +7,7 @@
 
 class B extends core::Object {
   static field dynamic y = inf::A::x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -23,7 +23,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
index 4d2b4b8..83a033e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.expect
@@ -19,8 +19,8 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -28,11 +28,11 @@
   inf::A::x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
   self::B::y = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
 
@@ -41,8 +41,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static field core::int x = 2;
-  synthetic constructor •() → inf::A
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
index 4d2b4b8..83a033e 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2.dart.strong.transformed.expect
@@ -19,8 +19,8 @@
 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
+  static field core::int* y = inf::A::x;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -28,11 +28,11 @@
   inf::A::x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   A.x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
   self::B::y = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   B.y = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
 
@@ -41,8 +41,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static field core::int x = 2;
-  synthetic constructor •() → inf::A
+  static field core::int* x = 2;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect
index b2d87e2..1b6a596 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect
index b2d87e2..1b6a596 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class A extends core::Object {
   static field dynamic x = 2;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.expect
index 8aca87e..dbef2a0 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static field core::int x = 2;
-  synthetic constructor •() → self::A
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.transformed.expect
index 8aca87e..dbef2a0 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag2_a.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static field core::int x = 2;
-  synthetic constructor •() → self::A
+  static field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.expect
index a76a1e1..298b12b 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.transformed.expect
index a76a1e1..298b12b 100644
--- a/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_from_variables_in_non_cycle_imports_with_flag_a.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int x = 2;
+static field core::int* x = 2;
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart
index 7da6371..3d24e87 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart
@@ -10,6 +10,6 @@
 }
 
 main() {
-  var /*@type=double*/ y =
-      new C(). /*@typeArgs=double*/ /*@target=C::m*/ m(1, b: 'bbb', c: 2.0);
+  var /*@ type=double* */ y =
+      new C(). /*@ typeArgs=double* */ /*@target=C::m*/ m(1, b: 'bbb', c: 2.0);
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect
index 75d1692..981cd81 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, b: "bbb", c: 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect
index 75d1692..981cd81 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.legacy.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, b: "bbb", c: 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
index 5346e26..0f2c452 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, b: "bbb", c: 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, b: "bbb", c: 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
index 5346e26..0f2c452 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_named.dart.strong.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, {core::String b = null, self::C::m::T c = null}) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, b: "bbb", c: 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, b: "bbb", c: 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart
index 349442a..b2c869d 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart
@@ -10,6 +10,6 @@
 }
 
 main() {
-  var /*@type=double*/ y =
-      new C(). /*@typeArgs=double*/ /*@target=C::m*/ m(1, 2.0);
+  var /*@ type=double* */ y =
+      new C(). /*@ typeArgs=double* */ /*@target=C::m*/ m(1, 2.0);
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect
index 550bac7..8fb914e 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b = #C1]) → self::C::m::T*
     return null;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect
index 550bac7..8fb914e 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.legacy.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b = #C1]) → self::C::m::T*
     return null;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
index 07c895a..97cc530 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b = #C1]) → self::C::m::T*
     return null;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
index 07c895a..97cc530 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional.dart.strong.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [self::C::m::T b = null]) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(core::int* a, [self::C::m::T* b = #C1]) → self::C::m::T*
     return null;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart
index 233a701..7da1ab4 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart
@@ -10,6 +10,6 @@
 }
 
 main() {
-  var /*@type=double*/ y =
-      new C(). /*@typeArgs=double*/ /*@target=C::m*/ m(1, 'bbb', 2.0);
+  var /*@ type=double* */ y =
+      new C(). /*@ typeArgs=double* */ /*@target=C::m*/ m(1, 'bbb', 2.0);
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect
index cca0705..d971406 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, "bbb", 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect
index cca0705..d971406 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.legacy.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
   dynamic y = new self::C::•().m(1, "bbb", 2.0);
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
index 2eacb46..27515e2 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, "bbb", 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, "bbb", 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
index 2eacb46..27515e2 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_positional2.dart.strong.transformed.expect
@@ -3,12 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(core::int a, [core::String b = null, self::C::m::T c = null]) → self::C::m::T
+  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;
 }
 static method main() → dynamic {
-  core::double y = new self::C::•().{self::C::m}<core::double>(1, "bbb", 2.0);
+  core::double* y = new self::C::•().{self::C::m}<core::double*>(1, "bbb", 2.0);
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart
index 2eb3ac8..76fa370 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart
@@ -10,5 +10,5 @@
 }
 
 main() {
-  var /*@type=int*/ y = new C(). /*@typeArgs=int*/ /*@target=C::m*/ m(42);
+  var /*@ type=int* */ y = new C(). /*@ typeArgs=int* */ /*@target=C::m*/ m(42);
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect
index d96161e..b7a43ca 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect
index d96161e..b7a43ca 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
index 0ad7439..10569dc 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 static method main() → dynamic {
-  core::int y = new self::C::•().{self::C::m}<core::int>(42);
+  core::int* y = new self::C::•().{self::C::m}<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
index 0ad7439..10569dc 100644
--- a/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_generic_method_type_required.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method m<T extends core::Object = dynamic>(self::C::m::T x) → self::C::m::T
+  method m<T extends core::Object* = dynamic>(self::C::m::T* x) → self::C::m::T*
     return x;
 }
 static method main() → dynamic {
-  core::int y = new self::C::•().{self::C::m}<core::int>(42);
+  core::int* y = new self::C::•().{self::C::m}<core::int*>(42);
 }
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect
index 1bb410b..20911c3 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect
index 1bb410b..20911c3 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.outline.expect
index 83d3f12..598bf6a 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.expect
index 1bb410b..20911c3 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.transformed.expect
index 1bb410b..20911c3 100644
--- a/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_cross_to_setter.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect
index 62a80b3..6703949 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return self::f();
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method f() → dynamic
   return null;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect
index 62a80b3..6703949 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.legacy.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return self::f();
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method f() → dynamic
   return null;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.outline.expect
index 64fa771..51dfc60 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method f() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.expect
index 3d7f3cb..0ab7323 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
-    return self::f() as{TypeError} core::int;
+  get x() → core::int*
+    return self::f() as{TypeError} core::int*;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method f() → dynamic
   return null;
diff --git a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.transformed.expect
index 3d7f3cb..0ab7323 100644
--- a/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_getter_from_later_inferred_getter.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
-    return self::f() as{TypeError} core::int;
+  get x() → core::int*
+    return self::f() as{TypeError} core::int*;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 static method f() → dynamic
   return null;
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart
index 969f512..14da75e 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart
@@ -17,26 +17,26 @@
 
 main() {
   // List inside map
-  var /*@type=Map<String, List<Folder>>*/ map = <String, List<Folder>>{
-    'pkgA': /*@typeArgs=Folder*/ [
+  var /*@ type=Map<String*, List<Folder*>*>* */ map = <String, List<Folder>>{
+    'pkgA': /*@ typeArgs=Folder* */ [
       /*info:DOWN_CAST_IMPLICIT*/ getResource('/pkgA/lib/')
     ],
-    'pkgB': /*@typeArgs=Folder*/ [
+    'pkgB': /*@ typeArgs=Folder* */ [
       /*info:DOWN_CAST_IMPLICIT*/ getResource('/pkgB/lib/')
     ]
   };
   // Also try map inside list
-  var /*@type=List<Map<String, Folder>>*/ list = <Map<String, Folder>>[
-    /*@typeArgs=String, Folder*/ {
+  var /*@ type=List<Map<String*, Folder*>*>* */ list = <Map<String, Folder>>[
+    /*@ typeArgs=String*, Folder* */ {
       'pkgA': /*info:DOWN_CAST_IMPLICIT*/ getResource('/pkgA/lib/')
     },
-    /*@typeArgs=String, Folder*/ {
+    /*@ typeArgs=String*, Folder* */ {
       'pkgB': /*info:DOWN_CAST_IMPLICIT*/ getResource('/pkgB/lib/')
     },
   ];
   // Instance creation too
-  var /*@type=Foo<List<Folder>>*/ foo = new Foo<List<Folder>>(
-      /*@typeArgs=Folder*/ [
+  var /*@ type=Foo<List<Folder*>*>* */ foo = new Foo<List<Folder>>(
+      /*@ typeArgs=Folder* */ [
         /*info:DOWN_CAST_IMPLICIT*/ getResource('/pkgA/lib/')
       ]);
 }
diff --git a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
index 23e767ca..cb98aba 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Resource extends core::Object {
-  synthetic constructor •() → self::Resource
+  synthetic constructor •() → self::Resource*
     : super core::Object::•()
     ;
 }
 class Folder extends self::Resource {
-  synthetic constructor •() → self::Folder
+  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>
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::Foo::T* t) → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
-static method getResource(core::String str) → self::Resource
+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]);
+  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_list_literal_nested_in_map_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
index 23e767ca..cb98aba 100644
--- a/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_list_literal_nested_in_map_literal.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Resource extends core::Object {
-  synthetic constructor •() → self::Resource
+  synthetic constructor •() → self::Resource*
     : super core::Object::•()
     ;
 }
 class Folder extends self::Resource {
-  synthetic constructor •() → self::Folder
+  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>
+class Foo<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::Foo::T* t) → self::Foo<self::Foo::T*>*
     : super core::Object::•()
     ;
 }
-static method getResource(core::String str) → self::Resource
+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]);
+  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 b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart
index 3250f29..e234c41 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart
@@ -6,7 +6,7 @@
 library test;
 
 test() {
-  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+  /*@ returnType=dynamic */ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
 
   // Ignore inference for g since Fasta doesn't infer it due to the circularity,
   // and that's ok.
@@ -14,7 +14,7 @@
   g() => 0;
   /*@testedFeatures=inference*/
 
-  var /*@type=() -> dynamic*/ v = f;
+  var /*@ type=() ->* dynamic */ v = f;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect
index a11e748..ff9ba55 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Warning: Method not found: 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Warning: Method not found: 'g'.
+//   /*@ returnType=dynamic */ 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:74: Context: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Context: Previous use of 'g'.
+//   /*@ returnType=dynamic */ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
 
 static method test() → dynamic {
   function f() → dynamic
-    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   {
     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;
@@ -29,3 +29,10 @@
   dynamic v = f;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #g
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect
index a11e748..ff9ba55 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.legacy.transformed.expect
@@ -2,23 +2,23 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Warning: Method not found: 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Warning: Method not found: 'g'.
+//   /*@ returnType=dynamic */ 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:74: Context: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Context: Previous use of 'g'.
+//   /*@ returnType=dynamic */ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
 
 static method test() → dynamic {
   function f() → dynamic
-    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#g, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
   {
     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;
@@ -29,3 +29,10 @@
   dynamic v = f;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #g
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
index ed09f8b..08ebecb 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.expect
@@ -2,32 +2,32 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Error: Method not found: 'g'.
+//   /*@ returnType=dynamic */ 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:74: Context: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Context: Previous use of 'g'.
+//   /*@ returnType=dynamic */ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
 
 static method test() → dynamic {
   function f() → dynamic
-    return invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
-  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-                                                                         ^";
+    return invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Error: Method not found: 'g'.
+  /*@ returnType=dynamic */ 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
+    function g() → core::int*
       return 0;
   }
-  () → dynamic v = f;
+  () →* dynamic v = f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
index ed09f8b..08ebecb 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart.strong.transformed.expect
@@ -2,32 +2,32 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Error: Method not found: 'g'.
+//   /*@ returnType=dynamic */ 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:74: Context: Previous use of 'g'.
-//   /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-//                                                                          ^
+// pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Context: Previous use of 'g'.
+//   /*@ returnType=dynamic */ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
 
 static method test() → dynamic {
   function f() → dynamic
-    return invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:74: Error: Method not found: 'g'.
-  /*@returnType=dynamic*/ f() => /*error:REFERENCED_BEFORE_DECLARATION*/ g();
-                                                                         ^";
+    return invalid-expression "pkg/front_end/testcases/inference/infer_local_function_referenced_before_declaration.dart:9:76: Error: Method not found: 'g'.
+  /*@ returnType=dynamic */ 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
+    function g() → core::int*
       return 0;
   }
-  () → dynamic v = f;
+  () →* dynamic v = f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart
index f74c0c2..46f1437 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart
@@ -6,39 +6,39 @@
 library test;
 
 test() {
-  /*@returnType=int*/ f0() => 42;
-  /*@returnType=Future<int>*/ f1() async => 42;
+  /*@ returnType=int* */ f0() => 42;
+  /*@ returnType=Future<int*>* */ f1() async => 42;
 
-  /*@returnType=int*/ f2() {
+  /*@ returnType=int* */ f2() {
     return 42;
   }
 
-  /*@returnType=Future<int>*/ f3() async {
+  /*@ returnType=Future<int*>* */ f3() async {
     return 42;
   }
 
-  /*@returnType=Iterable<int>*/ f4() sync* {
+  /*@ returnType=Iterable<int*>* */ f4() sync* {
     yield 42;
   }
 
-  /*@returnType=Stream<int>*/ f5() async* {
+  /*@ returnType=Stream<int*>* */ f5() async* {
     yield 42;
   }
 
   num f6() => 42;
 
-  /*@returnType=dynamic*/ f7() => f7();
-  /*@returnType=Stream<int>*/ f8() => f5();
+  /*@ returnType=dynamic */ f7() => f7();
+  /*@ returnType=Stream<int*>* */ f8() => f5();
 
-  var /*@type=() -> int*/ v0 = f0;
-  var /*@type=() -> Future<int>*/ v1 = f1;
-  var /*@type=() -> int*/ v2 = f2;
-  var /*@type=() -> Future<int>*/ v3 = f3;
-  var /*@type=() -> Iterable<int>*/ v4 = f4;
-  var /*@type=() -> Stream<int>*/ v5 = f5;
-  var /*@type=() -> num*/ v6 = f6;
-  var /*@type=() -> dynamic*/ v7 = f7;
-  var /*@type=() -> Stream<int>*/ v8 = f8;
+  var /*@ type=() ->* int* */ v0 = f0;
+  var /*@ type=() ->* Future<int*>* */ v1 = f1;
+  var /*@ type=() ->* int* */ v2 = f2;
+  var /*@ type=() ->* Future<int*>* */ v3 = f3;
+  var /*@ type=() ->* Iterable<int*>* */ v4 = f4;
+  var /*@ type=() ->* Stream<int*>* */ v5 = f5;
+  var /*@ type=() ->* num* */ v6 = f6;
+  var /*@ type=() ->* dynamic */ v7 = f7;
+  var /*@ type=() ->* Stream<int*>* */ v8 = f8;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect
index a759cfb9..1cc3c2f 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.expect
@@ -19,7 +19,7 @@
   function f5() → dynamic async* {
     yield 42;
   }
-  function f6() → core::num
+  function f6() → core::num*
     return 42;
   function f7() → dynamic
     return f7.call();
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect
index 256e504..76c757e 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.legacy.transformed.expect
@@ -7,8 +7,8 @@
   function f0() → dynamic
     return 42;
   function f1() → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -37,8 +37,8 @@
     return 42;
   }
   function f3() → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -66,7 +66,7 @@
   function f4() → dynamic /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = 42;
@@ -78,7 +78,7 @@
     return new core::_SyncIterable::•<dynamic>(:sync_op);
   }
   function f5() → dynamic /* originally async* */ {
-    asy::_AsyncStarStreamController<dynamic> :controller;
+    asy::_AsyncStarStreamController<dynamic>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -112,7 +112,7 @@
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
-  function f6() → core::num
+  function f6() → core::num*
     return 42;
   function f7() → dynamic
     return f7.call();
diff --git a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.expect
index 13b68a1..1f0c1f2 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.expect
@@ -4,36 +4,36 @@
 import "dart:async" as asy;
 
 static method test() → dynamic {
-  function f0() → core::int
+  function f0() → core::int*
     return 42;
-  function f1() → asy::Future<core::int> async 
+  function f1() → asy::Future<core::int*>* async 
     return 42;
-  function f2() → core::int {
+  function f2() → core::int* {
     return 42;
   }
-  function f3() → asy::Future<core::int> async {
+  function f3() → asy::Future<core::int*>* async {
     return 42;
   }
-  function f4() → core::Iterable<core::int> sync* {
+  function f4() → core::Iterable<core::int*>* sync* {
     yield 42;
   }
-  function f5() → asy::Stream<core::int> async* {
+  function f5() → asy::Stream<core::int*>* async* {
     yield 42;
   }
-  function f6() → core::num
+  function f6() → core::num*
     return 42;
   function f7() → dynamic
     return f7.call();
-  function f8() → asy::Stream<core::int>
+  function f8() → asy::Stream<core::int*>*
     return f5.call();
-  () → 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;
+  () →* 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_local_function_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
index a6f275f..5ee8e86 100644
--- a/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_local_function_return_type.dart.strong.transformed.expect
@@ -4,11 +4,11 @@
 import "dart:async" as asy;
 
 static method test() → dynamic {
-  function f0() → core::int
+  function f0() → core::int*
     return 42;
-  function f1() → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  function f1() → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -33,12 +33,12 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
-  function f2() → core::int {
+  function f2() → core::int* {
     return 42;
   }
-  function f3() → asy::Future<core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<core::int>();
-    asy::FutureOr<core::int> :return_value;
+  function f3() → asy::Future<core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::int*>();
+    asy::FutureOr<core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -63,10 +63,10 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
-  function f4() → core::Iterable<core::int> /* originally sync* */ {
+  function f4() → core::Iterable<core::int*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<core::int> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<core::int*>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = 42;
@@ -75,10 +75,10 @@
       }
       return false;
     }
-    return new core::_SyncIterable::•<core::int>(:sync_op);
+    return new core::_SyncIterable::•<core::int*>(:sync_op);
   }
-  function f5() → asy::Stream<core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<core::int> :controller;
+  function f5() → asy::Stream<core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -108,24 +108,24 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
-  function f6() → core::num
+  function f6() → core::num*
     return 42;
   function f7() → dynamic
     return f7.call();
-  function f8() → asy::Stream<core::int>
+  function f8() → asy::Stream<core::int*>*
     return f5.call();
-  () → 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;
+  () →* 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 b/pkg/front_end/testcases/inference/infer_method_function_typed.dart
index 3655a0f..92b778d 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart
@@ -21,7 +21,7 @@
 T f<T>() => null;
 
 g(B b) {
-  b. /*@target=B::x*/ x(/*@typeArgs=() -> dynamic*/ f());
+  b. /*@target=B::x*/ x(/*@ typeArgs=() ->* dynamic */ f());
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect
index 901ba43..0af8723 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method x(() → core::int value) → void;
+  abstract method x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract method x(() → dynamic value) → void;
+  abstract method x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method g(self::B b) → dynamic {
+static method g(self::B* b) → dynamic {
   b.x(self::f<dynamic>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect
index 901ba43..0af8723 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.legacy.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method x(() → core::int value) → void;
+  abstract method x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract method x(() → dynamic value) → void;
+  abstract method x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method g(self::B b) → dynamic {
+static method g(self::B* b) → dynamic {
   b.x(self::f<dynamic>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
index 4f4c2fa..339a237 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract method x(() → core::int value) → void;
+  abstract method x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract method x(() → dynamic value) → void;
+  abstract method x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static method g(self::B b) → dynamic
+static method g(self::B* b) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
index fd1195c..0a1ac45 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method x(() → core::int value) → void;
+  abstract method x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract method x(() → dynamic value) → void;
+  abstract method x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 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_method_function_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
index fd1195c..0a1ac45 100644
--- a/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_function_typed.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method x(() → core::int value) → void;
+  abstract method x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract method x(() → dynamic value) → void;
+  abstract method x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 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_method_missing_params.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
index 3c40a1e..ff72bcf 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.expect
@@ -3,27 +3,31 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  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 = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
+  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 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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 f(core::int* x) → core::int*;
+  abstract method g(core::int* x) → core::int*;
+  abstract method h(core::int* x) → core::int*;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::int y) → core::int;
-  abstract method g(core::int x, [core::int y = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
+  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*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
index 3c40a1e..ff72bcf 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.legacy.transformed.expect
@@ -3,27 +3,31 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  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 = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
+  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 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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 f(core::int* x) → core::int*;
+  abstract method g(core::int* x) → core::int*;
+  abstract method h(core::int* x) → core::int*;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::int y) → core::int;
-  abstract method g(core::int x, [core::int y = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
+  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*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
index 332234b..d5e6eac 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.outline.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract method f(core::int x, core::int y) → core::int;
-  abstract method g(core::int x, [core::int y]) → core::int;
-  abstract method h(core::int x, {core::int y}) → core::int;
+  abstract method f(core::int* x, core::int* y) → core::int*;
+  abstract method g(core::int* x, [core::int* y]) → core::int*;
+  abstract method h(core::int* x, {core::int* y}) → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  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 f(core::int* x) → core::int*;
+  abstract method g(core::int* x) → core::int*;
+  abstract method h(core::int* x) → core::int*;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract method f(core::int x, core::int y) → core::int;
-  abstract method g(core::int x, [core::int y]) → core::int;
-  abstract method h(core::int x, {core::int y}) → core::int;
+  abstract method f(core::int* x, core::int* y) → core::int*;
+  abstract method g(core::int* x, [core::int* y]) → core::int*;
+  abstract method h(core::int* x, {core::int* y}) → core::int*;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
index f4717a8..568f782 100644
--- a/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_method_missing_params.dart.strong.expect
@@ -1,54 +1,29 @@
 library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23:8: Error: Can't infer a type for 'y' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   f(x, y);
-//        ^
-//
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:25:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   h(x, {y});
-//         ^
-//
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:24:9: Error: Can't infer a type for 'y' as some of the inherited members have different types.
-// Try adding an explicit type.
-//   g(x, [y]);
-//         ^
-//
-// pkg/front_end/testcases/inference/infer_method_missing_params.dart:23: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:17: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
+  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 = null]) → core::int;
-  abstract method h(core::int x, {core::int y = null}) → core::int;
+  abstract method f(core::int* x, core::int* y) → core::int*;
+  abstract method g(core::int* x, [core::int* y = null]) → core::int*;
+  abstract method h(core::int* x, {core::int* y = null}) → core::int*;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  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 f(core::int* x) → core::int*;
+  abstract method g(core::int* x) → core::int*;
+  abstract method h(core::int* x) → core::int*;
 }
 abstract class C extends core::Object implements self::A, self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, dynamic y) → core::int;
-  abstract method g(core::int x, [dynamic y = null]) → core::int;
-  abstract method h(core::int x, {dynamic y = null}) → core::int;
+  abstract method f(core::int* x, core::int* y) → core::int*;
+  abstract method g(core::int* x, [core::int* y = null]) → core::int*;
+  abstract method h(core::int* x, {core::int* y = null}) → core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect
index 1b88745..450d23b 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::D
+  field core::int* foo = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect
index 1b88745..450d23b 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::D
+  field core::int* foo = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.expect
index 1b88745..450d23b 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::D
+  field core::int* foo = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.transformed.expect
index 1b88745..450d23b 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_field.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::D
+  field core::int* foo = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect
index 688faaf..bafdd43 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect
index 688faaf..bafdd43 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.expect
index 688faaf..bafdd43 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.transformed.expect
index 688faaf..bafdd43 100644
--- a/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_parameter_type_setter_from_setter.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::D {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::D::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int x) → void {}
+  set foo(core::int* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.expect
index 6137c7c..4d5f369 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.expect
@@ -2,9 +2,9 @@
 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::~}();
-static field core::int a_negate = 1.{core::int::unary-}();
+static field core::bool* a_not = !true;
+static field core::int* a_complement = 1.{core::int::~}();
+static field core::int* a_negate = 1.{core::int::unary-}();
 static method main() → dynamic {
   self::a_not;
   self::a_complement;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
index 6137c7c..4d5f369 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 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::~}();
-static field core::int a_negate = 1.{core::int::unary-}();
+static field core::bool* a_not = !true;
+static field core::int* a_complement = 1.{core::int::~}();
+static field core::int* a_negate = 1.{core::int::unary-}();
 static method main() → dynamic {
   self::a_not;
   self::a_complement;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect
index a8cfd10..a70d123 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator ~() → core::int
+  operator ~() → core::int*
     return 1;
-  operator unary-() → core::double
+  operator unary-() → core::double*
     return 2.0;
 }
 static field dynamic a = new self::A::•();
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect
index a8cfd10..a70d123 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator ~() → core::int
+  operator ~() → core::int*
     return 1;
-  operator unary-() → core::double
+  operator unary-() → core::double*
     return 2.0;
 }
 static field dynamic a = new self::A::•();
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.expect
index 8dd709e..6b92d46 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator ~() → core::int
+  operator ~() → core::int*
     return 1;
-  operator unary-() → core::double
+  operator unary-() → core::double*
     return 2.0;
 }
-static field self::A a = new self::A::•();
-static field core::int v_complement = self::a.{self::A::~}();
-static field core::double v_negate = self::a.{self::A::unary-}();
+static field self::A* a = new self::A::•();
+static field core::int* v_complement = self::a.{self::A::~}();
+static field core::double* v_negate = self::a.{self::A::unary-}();
 static method main() → dynamic {
   self::a;
   self::v_complement;
diff --git a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.transformed.expect
index 8dd709e..6b92d46 100644
--- a/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_prefix_expression_custom.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator ~() → core::int
+  operator ~() → core::int*
     return 1;
-  operator unary-() → core::double
+  operator unary-() → core::double*
     return 2.0;
 }
-static field self::A a = new self::A::•();
-static field core::int v_complement = self::a.{self::A::~}();
-static field core::double v_negate = self::a.{self::A::unary-}();
+static field self::A* a = new self::A::•();
+static field core::int* v_complement = self::a.{self::A::~}();
+static field core::double* v_negate = self::a.{self::A::unary-}();
 static method main() → dynamic {
   self::a;
   self::v_complement;
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect
index 5ecaf43..b45d3019 100644
--- a/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → dynamic f, () → dynamic g) → dynamic {
+static method test(() →* dynamic f, () →* dynamic g) → dynamic {
   try {
     f.call();
   }
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect
index 5ecaf43..b45d3019 100644
--- a/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → dynamic f, () → dynamic g) → dynamic {
+static method test(() →* dynamic f, () →* dynamic g) → dynamic {
   try {
     f.call();
   }
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.outline.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.outline.expect
index f1aa2fb..f5034cd 100644
--- a/pkg/front_end/testcases/inference/infer_rethrow.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.outline.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → dynamic f, () → dynamic g) → dynamic
+static method test(() →* dynamic f, () →* dynamic g) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.expect
index 5ecaf43..b45d3019 100644
--- a/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → dynamic f, () → dynamic g) → dynamic {
+static method test(() →* dynamic f, () →* dynamic g) → dynamic {
   try {
     f.call();
   }
diff --git a/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.transformed.expect
index 5ecaf43..b45d3019 100644
--- a/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_rethrow.dart.strong.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → dynamic f, () → dynamic g) → dynamic {
+static method test(() →* dynamic f, () →* dynamic g) → dynamic {
   try {
     f.call();
   }
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart
index 97e57f6..1fd2c2f 100644
--- a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart
@@ -6,9 +6,9 @@
 library test;
 
 List<String> strings() {
-  var /*@type=Iterable<String>*/ stuff = /*@typeArgs=dynamic*/ []
-      . /*@typeArgs=String*/ /*@target=Iterable::expand*/ expand(
-          /*@returnType=List<String>*/ (/*@type=dynamic*/ i) {
+  var /*@ type=Iterable<String*>* */ stuff = /*@ typeArgs=dynamic */ []
+      . /*@ typeArgs=String* */ /*@target=Iterable::expand*/ expand(
+          /*@ returnType=List<String*>* */ (/*@ type=dynamic */ i) {
     return <String>[];
   });
   return stuff. /*@target=Iterable::toList*/ toList();
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.expect
index 5e931e5..e547269 100644
--- a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.expect
@@ -2,9 +2,9 @@
 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>[];
+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*>[];
   });
   return stuff.{core::Iterable::toList}();
 }
diff --git a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.transformed.expect
index 5e931e5..e547269 100644
--- a/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_return_of_statement_lambda.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 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>[];
+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*>[];
   });
   return stuff.{core::Iterable::toList}();
 }
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect
index 6f68db4..f6981f8 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static set foo(core::int x) → void {}
+  static set foo(core::int* x) → void {}
 }
-static set bar(core::int x) → void {}
+static set bar(core::int* x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect
index 6f68db4..f6981f8 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static set foo(core::int x) → void {}
+  static set foo(core::int* x) → void {}
 }
-static set bar(core::int x) → void {}
+static set bar(core::int* x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.outline.expect
index 42e1a1a..ba34e92 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  static set foo(core::int x) → void
+  static set foo(core::int* x) → void
     ;
 }
-static set bar(core::int x) → void
+static set bar(core::int* x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.expect
index 6f68db4..f6981f8 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static set foo(core::int x) → void {}
+  static set foo(core::int* x) → void {}
 }
-static set bar(core::int x) → void {}
+static set bar(core::int* x) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.transformed.expect
index 6f68db4..f6981f8 100644
--- a/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_return_type_for_static_setter.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static set foo(core::int x) → void {}
+  static set foo(core::int* x) → void {}
 }
-static set bar(core::int x) → void {}
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.expect
index 849953f..c3c7f54 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect
index 849953f..c3c7f54 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.outline.expect
index 1d8285f..d304686 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.expect
index 849953f..c3c7f54 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::double value) → void;
+  abstract set x(core::double* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.transformed.expect
index 849953f..c3c7f54 100644
--- a/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_cross_to_getter.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::double;
+  abstract get x() → core::double*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::double value) → void;
+  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.legacy.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.expect
index d58802b..b9b64b7 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect
index d58802b..b9b64b7 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.outline.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.outline.expect
index 462e7c5..a3167ec 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.expect
index d58802b..b9b64b7 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.transformed.expect
index d58802b..b9b64b7 100644
--- a/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_from_later_inferred_setter.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object implements self::B {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 abstract class B extends core::Object implements self::C {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart
index 3737022..63e77eb 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart
@@ -21,7 +21,7 @@
 T f<T>() => null;
 
 g(B b) {
-  b. /*@target=B::x*/ x = /*@typeArgs=() -> dynamic*/ f();
+  b. /*@target=B::x*/ x = /*@ typeArgs=() ->* dynamic */ f();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect
index ff7d7dc..b08a4da 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(() → core::int value) → void;
+  abstract set x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(() → dynamic value) → void;
+  abstract set x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method g(self::B b) → dynamic {
+static method g(self::B* b) → dynamic {
   b.x = self::f<dynamic>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect
index ff7d7dc..b08a4da 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.legacy.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(() → core::int value) → void;
+  abstract set x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(() → dynamic value) → void;
+  abstract set x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method g(self::B b) → dynamic {
+static method g(self::B* b) → dynamic {
   b.x = self::f<dynamic>();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
index 8b4da4e..0a5526a 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract set x(() → core::int value) → void;
+  abstract set x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract set x(() → dynamic value) → void;
+  abstract set x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static method g(self::B b) → dynamic
+static method g(self::B* b) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
index af1aae0..1280f00 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(() → core::int value) → void;
+  abstract set x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(() → dynamic value) → void;
+  abstract set x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 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_function_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
index af1aae0..1280f00 100644
--- a/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_function_typed.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(() → core::int value) → void;
+  abstract set x(() →* core::int* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(() → dynamic value) → void;
+  abstract set x(() →* dynamic value) → void;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 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.legacy.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.expect
index 670abbd..1a70d92 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int i) → void {}
+  set x(core::int* i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  set x(core::Object o) → void {}
+  set x(core::Object* o) → void {}
 }
 static method main() → dynamic {
   new self::B::•().x = "hello";
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect
index 670abbd..1a70d92 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int i) → void {}
+  set x(core::int* i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  set x(core::Object o) → void {}
+  set x(core::Object* o) → void {}
 }
 static method main() → dynamic {
   new self::B::•().x = "hello";
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.outline.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.outline.expect
index 2f2f40b..f31bd04 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  set x(core::int i) → void
+  set x(core::int* i) → void
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  set x(core::Object o) → void
+  set x(core::Object* o) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.expect
index 56f3147..47a7891 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int i) → void {}
+  set x(core::int* i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  set x(core::Object o) → void {}
+  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_setter_return_type_only.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.transformed.expect
index 56f3147..47a7891 100644
--- a/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_setter_return_type_only.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  set x(core::int i) → void {}
+  set x(core::int* i) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  set x(core::Object o) → void {}
+  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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
index 7e55b99..187f7d9 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.expect
@@ -8,7 +8,7 @@
 static final field dynamic m1 = inf::a1;
 static final field dynamic m2 = inf::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = self::m1;
 }
 static method main() → dynamic {}
@@ -24,7 +24,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf2::b1;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
index 7e55b99..187f7d9 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.legacy.transformed.expect
@@ -8,7 +8,7 @@
 static final field dynamic m1 = inf::a1;
 static final field dynamic m2 = inf::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = self::m1;
 }
 static method main() → dynamic {}
@@ -24,7 +24,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf2::b1;
-  synthetic constructor •() → inf::A
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
index 99c4846..fe34d91 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.expect
@@ -5,10 +5,10 @@
 
 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 final field core::int* m1 = inf::a1;
+static final field core::int* m2 = inf::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = self::m1;
 }
 static method main() → dynamic {}
@@ -23,19 +23,19 @@
 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
+  static final field core::int* a2 = inf2::b1;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = self::m2;
+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 final field core::int* b1 = 2;
 static method main() → dynamic {
   inf2::b1;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
index 99c4846..fe34d91 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively.dart.strong.transformed.expect
@@ -5,10 +5,10 @@
 
 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 final field core::int* m1 = inf::a1;
+static final field core::int* m2 = inf::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = self::m1;
 }
 static method main() → dynamic {}
@@ -23,19 +23,19 @@
 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
+  static final field core::int* a2 = inf2::b1;
+  synthetic constructor •() → inf::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = self::m2;
+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 final field core::int* b1 = 2;
 static method main() → dynamic {
   inf2::b1;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect
index 7ebf828..9aa2047 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.expect
@@ -2,15 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic x1 = 1;
+static const field dynamic x1 = #C1;
 static final field dynamic x2 = 1;
-static final field dynamic y1 = self::x1;
+static final field dynamic y1 = #C1;
 static final field dynamic y2 = self::x2;
 static method foo() → dynamic {
-  core::int i;
+  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_transitively2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.transformed.expect
index 7ebf828..9aa2047 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.legacy.transformed.expect
@@ -2,15 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-static const field dynamic x1 = 1;
+static const field dynamic x1 = #C1;
 static final field dynamic x2 = 1;
-static final field dynamic y1 = self::x1;
+static final field dynamic y1 = #C1;
 static final field dynamic y2 = self::x2;
 static method foo() → dynamic {
-  core::int i;
+  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_transitively2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.expect
index 3a215e1..a530b9e 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.expect
@@ -2,15 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int x1 = 1;
-static final field core::int x2 = 1;
-static final field core::int y1 = self::x1;
-static final field core::int y2 = self::x2;
+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;
+  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_transitively2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.transformed.expect
index 3a215e1..a530b9e 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively2.dart.strong.transformed.expect
@@ -2,15 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int x1 = 1;
-static final field core::int x2 = 1;
-static final field core::int y1 = self::x1;
-static final field core::int y2 = self::x2;
+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;
+  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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
index b5b71b0..11f8b40 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.expect
@@ -1,36 +1,42 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
 
-static const field dynamic t1 = 1;
-static const field dynamic t2 = self::t1;
-static const field dynamic t3 = inf::a1;
-static const field dynamic t4 = inf::a2;
-static const field dynamic t5 = inf::A::a3;
-static const field dynamic t6 = inf::A::a3;
+static const field dynamic t1 = #C1;
+static const field dynamic t2 = #C1;
+static const field dynamic t3 = #C2;
+static const field dynamic t4 = #C3;
+static const field dynamic t5 = #C4;
+static const field dynamic t6 = #C4;
 static method foo() → dynamic {
-  core::int i;
-  i = self::t1;
-  i = self::t2;
-  i = self::t3;
-  i = self::t4;
+  core::int* i;
+  i = #C1;
+  i = #C1;
+  i = #C2;
+  i = #C3;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → inf::A
+  static const field dynamic a3 = #C4;
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
-static const field dynamic a1 = 3;
-static const field dynamic a2 = 4;
+static const field dynamic a1 = #C2;
+static const field dynamic 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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
index b5b71b0..11f8b40 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.legacy.transformed.expect
@@ -1,36 +1,42 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
 
-static const field dynamic t1 = 1;
-static const field dynamic t2 = self::t1;
-static const field dynamic t3 = inf::a1;
-static const field dynamic t4 = inf::a2;
-static const field dynamic t5 = inf::A::a3;
-static const field dynamic t6 = inf::A::a3;
+static const field dynamic t1 = #C1;
+static const field dynamic t2 = #C1;
+static const field dynamic t3 = #C2;
+static const field dynamic t4 = #C3;
+static const field dynamic t5 = #C4;
+static const field dynamic t6 = #C4;
 static method foo() → dynamic {
-  core::int i;
-  i = self::t1;
-  i = self::t2;
-  i = self::t3;
-  i = self::t4;
+  core::int* i;
+  i = #C1;
+  i = #C1;
+  i = #C2;
+  i = #C3;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → inf::A
+  static const field dynamic a3 = #C4;
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
-static const field dynamic a1 = 3;
-static const field dynamic a2 = 4;
+static const field dynamic a1 = #C2;
+static const field dynamic 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.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
index d80f5c4..1a44321 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.expect
@@ -1,36 +1,42 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
 
-static const field core::int t1 = 1;
-static const field core::int t2 = self::t1;
-static const field core::int t3 = inf::a1;
-static const field core::int t4 = inf::a2;
-static const field dynamic t5 = inf::A::a3;
-static const field dynamic t6 = inf::A::a3;
+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 = self::t1;
-  i = self::t2;
-  i = self::t3;
-  i = self::t4;
+  core::int* i;
+  i = #C1;
+  i = #C1;
+  i = #C2;
+  i = #C3;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → inf::A
+  static const field dynamic a3 = #C4;
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
-static const field core::int a1 = 3;
-static const field core::int a2 = 4;
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
index d80f5c4..1a44321 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3.dart.strong.transformed.expect
@@ -1,36 +1,42 @@
 library test;
 import self as self;
 import "dart:core" as core;
-import "infer_statics_transitively3_a.dart" as inf;
 
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart";
 import "org-dartlang-testcase:///infer_statics_transitively3_a.dart" as p;
 
-static const field core::int t1 = 1;
-static const field core::int t2 = self::t1;
-static const field core::int t3 = inf::a1;
-static const field core::int t4 = inf::a2;
-static const field dynamic t5 = inf::A::a3;
-static const field dynamic t6 = inf::A::a3;
+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 = self::t1;
-  i = self::t2;
-  i = self::t3;
-  i = self::t4;
+  core::int* i;
+  i = #C1;
+  i = #C1;
+  i = #C2;
+  i = #C3;
 }
 static method main() → dynamic {}
 
 library;
-import self as inf;
+import self as self2;
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → inf::A
+  static const field dynamic a3 = #C4;
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
-static const field core::int a1 = 3;
-static const field core::int a2 = 4;
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.expect
index 6029fc0..e0ed734 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.expect
@@ -3,11 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → self::A
+  static const field dynamic a3 = #C1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static const field dynamic a1 = 3;
-static const field dynamic a2 = 4;
+static const field dynamic a1 = #C2;
+static const field dynamic a2 = #C3;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 3
+  #C3 = 4
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect
index 6029fc0..e0ed734 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.legacy.transformed.expect
@@ -3,11 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → self::A
+  static const field dynamic a3 = #C1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static const field dynamic a1 = 3;
-static const field dynamic a2 = 4;
+static const field dynamic a1 = #C2;
+static const field dynamic a2 = #C3;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+  #C2 = 3
+  #C3 = 4
+}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.expect
index 536b87f..a72bc1b 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.expect
@@ -3,11 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → self::A
+  static const field dynamic a3 = #C1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static const field core::int a1 = 3;
-static const field core::int a2 = 4;
+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_transitively3_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.transformed.expect
index 536b87f..a72bc1b 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively3_a.dart.strong.transformed.expect
@@ -3,11 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  static const field dynamic a3 = null;
-  synthetic constructor •() → self::A
+  static const field dynamic a3 = #C1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static const field core::int a1 = 3;
-static const field core::int a2 = 4;
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
index 4e48a93..ecff101 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.expect
@@ -9,7 +9,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -28,7 +28,7 @@
 static final field dynamic m1 = inf2::a1;
 static final field dynamic m2 = inf2::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -52,7 +52,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → inf2::A
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
index 4e48a93..ecff101 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -28,7 +28,7 @@
 static final field dynamic m1 = inf2::a1;
 static final field dynamic m2 = inf2::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -52,7 +52,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → inf2::A
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
index 9891055..3a33b33 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.expect
@@ -8,12 +8,12 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+static final field core::int* a1 = test::m2;
 static method main() → dynamic {
   self::a1;
 }
@@ -25,10 +25,10 @@
 
 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 final field core::int* m1 = inf2::a1;
+static final field core::int* m2 = inf2::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -37,7 +37,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+static final field core::int* b1 = 2;
 static method main() → dynamic {
   inf::b1;
 }
@@ -52,10 +52,10 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+static final field core::int* a1 = test::m2;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
index 9891055..3a33b33 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_2_a.dart.strong.transformed.expect
@@ -8,12 +8,12 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+static final field core::int* a1 = test::m2;
 static method main() → dynamic {
   self::a1;
 }
@@ -25,10 +25,10 @@
 
 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 final field core::int* m1 = inf2::a1;
+static final field core::int* m2 = inf2::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -37,7 +37,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+static final field core::int* b1 = 2;
 static method main() → dynamic {
   inf::b1;
 }
@@ -52,10 +52,10 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → inf2::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
index 7c8af8a..e7a9250 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.expect
@@ -9,7 +9,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -26,7 +26,7 @@
 static final field dynamic m1 = self::a1;
 static final field dynamic m2 = self::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
index 7c8af8a..e7a9250 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 
 class A extends core::Object {
   static final field dynamic a2 = inf::b1;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -26,7 +26,7 @@
 static final field dynamic m1 = self::a1;
 static final field dynamic m2 = self::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
index aa6b4be..1dbafbb 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.expect
@@ -8,12 +8,12 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+static final field core::int* a1 = test::m2;
 static method main() → dynamic {}
 
 library test;
@@ -23,10 +23,10 @@
 
 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 final field core::int* m1 = self::a1;
+static final field core::int* m2 = self::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -35,7 +35,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+static final field core::int* b1 = 2;
 static method main() → dynamic {
   inf::b1;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
index aa6b4be..1dbafbb 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_a.dart.strong.transformed.expect
@@ -8,12 +8,12 @@
 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
+  static final field core::int* a2 = inf::b1;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static final field core::int a1 = test::m2;
+static final field core::int* a1 = test::m2;
 static method main() → dynamic {}
 
 library test;
@@ -23,10 +23,10 @@
 
 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 final field core::int* m1 = self::a1;
+static final field core::int* m2 = self::A::a2;
 static method foo() → dynamic {
-  core::int i;
+  core::int* i;
   i = test::m1;
 }
 static method main() → dynamic {}
@@ -35,7 +35,7 @@
 import self as inf;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+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.strong.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.expect
index 52b1783..8c80bfe 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+static final field core::int* b1 = 2;
 static method main() → dynamic {
   self::b1;
 }
diff --git a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.transformed.expect
index 52b1783..8c80bfe 100644
--- a/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_transitively_b.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field core::int b1 = 2;
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
index 1303bcc..575d442 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.expect
@@ -6,14 +6,14 @@
 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
+  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 {
+  static method m1(core::String* m) → self::T* {
     return null;
   }
-  static method m2(dynamic e) → core::String {
+  static method m2(dynamic e) → core::String* {
     return "";
   }
 }
@@ -23,5 +23,9 @@
 import self as inf;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
index 1303bcc..575d442 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.legacy.transformed.expect
@@ -6,14 +6,14 @@
 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
+  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 {
+  static method m1(core::String* m) → self::T* {
     return null;
   }
-  static method m2(dynamic e) → core::String {
+  static method m2(dynamic e) → core::String* {
     return "";
   }
 }
@@ -23,5 +23,9 @@
 import self as inf;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.dart.strong.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
index 1303bcc..575d442 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.expect
@@ -6,14 +6,14 @@
 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
+  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 {
+  static method m1(core::String* m) → self::T* {
     return null;
   }
-  static method m2(dynamic e) → core::String {
+  static method m2(dynamic e) → core::String* {
     return "";
   }
 }
@@ -23,5 +23,9 @@
 import self as inf;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
index 1303bcc..575d442 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations.dart.strong.transformed.expect
@@ -6,14 +6,14 @@
 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
+  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 {
+  static method m1(core::String* m) → self::T* {
     return null;
   }
-  static method m2(dynamic e) → core::String {
+  static method m2(dynamic e) → core::String* {
     return "";
   }
 }
@@ -23,5 +23,9 @@
 import self as inf;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.legacy.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.expect
index 60b40d3..e864516 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.expect
@@ -2,5 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.transformed.expect
index 60b40d3..e864516 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.legacy.transformed.expect
@@ -2,5 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.strong.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.expect
index 60b40d3..e864516 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.expect
@@ -2,5 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.transformed.expect
index 60b40d3..e864516 100644
--- a/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_statics_with_method_invocations_a.dart.strong.transformed.expect
@@ -2,5 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method m3(core::String a, core::String b, [dynamic a1 = null, dynamic a2 = null]) → dynamic {}
+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.strong.expect b/pkg/front_end/testcases/inference/infer_throw.dart.strong.expect
index a5ac554..8f6f2b1 100644
--- a/pkg/front_end/testcases/inference/infer_throw.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_throw.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool t = true;
+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 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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_throw.dart.strong.transformed.expect
index a5ac554..8f6f2b1 100644
--- a/pkg/front_end/testcases/inference/infer_throw.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_throw.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool t = true;
+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 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.legacy.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.expect
index 0964033..e583c2a 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect
index 0964033..e583c2a 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
index 61ee50c..1ba01ea 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x;
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method g() → void
   ;
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
index 0964033..e583c2a 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
index 0964033..e583c2a 100644
--- a/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_throw_downwards.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic x = throw self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method g() → void {
   dynamic x = throw self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect
index 2f5e471..0e2e69f 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect
index 2f5e471..0e2e69f 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
index 38bb5e2..9afb6a2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
index 38bb5e2..9afb6a2 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart.strong.transformed.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields2.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect
index 922bf72..6a36b47 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect
index 922bf72..6a36b47 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
index 9e7b8a7..d26cb7a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
index 9e7b8a7..d26cb7a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart.strong.transformed.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = 2;
-  synthetic constructor •() → self::A
+  final field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_on_overridden_fields4.dart:17:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect
index a57d0f1..79d961d 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = "hi";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect
index a57d0f1..79d961d 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = "hi";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
index de2349d..6a786ef 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.expect
@@ -11,10 +11,10 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
index de2349d..6a786ef 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var.dart.strong.transformed.expect
@@ -11,10 +11,10 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart b/pkg/front_end/testcases/inference/infer_type_on_var2.dart
index 1b576ce..a7a595b 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart
@@ -6,7 +6,7 @@
 library test;
 
 test2() {
-  var /*@type=int*/ x = 3;
+  var /*@ type=int* */ x = 3;
   x = /*error:INVALID_ASSIGNMENT*/ "hi";
 }
 
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
index d986721..3249285 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.expect
@@ -11,10 +11,10 @@
 import "dart:core" as core;
 
 static method test2() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
index d986721..3249285 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.strong.transformed.expect
@@ -11,10 +11,10 @@
 import "dart:core" as core;
 
 static method test2() → dynamic {
-  core::int x = 3;
+  core::int* x = 3;
   x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
index 23f8fc0..6b30ef6 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var2.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:5: Context: Write to x@292
+pkg/front_end/testcases/inference/infer_type_on_var2.dart:10:5: Context: Write to x@295
   x = /*error:INVALID_ASSIGNMENT*/ "hi";
     ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart
index 8301e0d..1ae4b97 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart
@@ -9,13 +9,13 @@
   int x = 0;
 
   test1() {
-    var /*@type=int*/ a = /*@target=A::x*/ x;
+    var /*@ type=int* */ a = /*@target=A::x*/ x;
     a = /*error:INVALID_ASSIGNMENT*/ "hi";
     a = 3;
-    var /*@type=int*/ b = /*@target=A::y*/ y;
+    var /*@ type=int* */ b = /*@target=A::y*/ y;
     b = /*error:INVALID_ASSIGNMENT*/ "hi";
     b = 4;
-    var /*@type=int*/ c = /*@target=A::z*/ z;
+    var /*@ type=int* */ c = /*@target=A::z*/ z;
     c = /*error:INVALID_ASSIGNMENT*/ "hi";
     c = 4;
   }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect
index 9239ef2..c54d071 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 0;
-  field core::int y = null;
+  field core::int* x = 0;
+  field core::int* y = null;
   final field dynamic z = 42;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test1() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect
index 9239ef2..c54d071 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 0;
-  field core::int y = null;
+  field core::int* x = 0;
+  field core::int* y = null;
   final field dynamic z = 42;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test1() → dynamic {
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
index 4ed1521..d3cee19 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.expect
@@ -21,30 +21,30 @@
 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
+  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 = this.{self::A::x};
     a = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     a = 3;
-    core::int b = this.{self::A::y};
+    core::int* b = this.{self::A::y};
     b = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     b = 4;
-    core::int c = this.{self::A::z};
+    core::int* c = this.{self::A::z};
     c = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     c = 4;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
index 4ed1521..d3cee19 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.strong.transformed.expect
@@ -21,30 +21,30 @@
 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
+  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 = this.{self::A::x};
     a = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     a = 3;
-    core::int b = this.{self::A::y};
+    core::int* b = this.{self::A::y};
     b = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     b = 4;
-    core::int c = this.{self::A::z};
+    core::int* c = this.{self::A::z};
     c = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
     c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                     ^" in "hi" as{TypeError} core::int;
+                                     ^" in "hi" as{TypeError} core::int*;
     c = 4;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
index 426e83a..5f2268b 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart.type_promotion.expect
@@ -1,18 +1,18 @@
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@320
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:13:7: Context: Write to a@323
     a = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@320
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:14:7: Context: Write to a@323
     a = 3;
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@420
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:16:7: Context: Write to b@426
     b = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@420
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:17:7: Context: Write to b@426
     b = 4;
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@520
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:19:7: Context: Write to c@529
     c = /*error:INVALID_ASSIGNMENT*/ "hi";
       ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@520
+pkg/front_end/testcases/inference/infer_type_on_var_from_field.dart:20:7: Context: Write to c@529
     c = 4;
       ^
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
index 6b971b5..4d1af4d 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart
@@ -8,13 +8,13 @@
 int x = 0;
 
 test1() {
-  var /*@type=int*/ a = x;
+  var /*@ type=int* */ a = x;
   a = /*error:INVALID_ASSIGNMENT*/ "hi";
   a = 3;
-  var /*@type=int*/ b = y;
+  var /*@ type=int* */ b = y;
   b = /*error:INVALID_ASSIGNMENT*/ "hi";
   b = 4;
-  var /*@type=int*/ c = z;
+  var /*@ type=int* */ c = z;
   c = /*error:INVALID_ASSIGNMENT*/ "hi";
   c = 4;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect
index 11b8cab..1e4ac2c 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int x = 0;
-static field core::int y = 0;
+static field core::int* x = 0;
+static field core::int* y = 0;
 static final field dynamic z = 42;
 static method test1() → dynamic {
   dynamic a = self::x;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect
index 11b8cab..1e4ac2c 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int x = 0;
-static field core::int y = 0;
+static field core::int* x = 0;
+static field core::int* y = 0;
 static final field dynamic z = 42;
 static method test1() → dynamic {
   dynamic a = self::x;
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
index e3486c1..347287a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.expect
@@ -20,27 +20,27 @@
 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 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;
+  core::int* a = self::x;
   a = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   a = 3;
-  core::int b = self::y;
+  core::int* b = self::y;
   b = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   b = 4;
-  core::int c = self::z;
+  core::int* c = self::z;
   c = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   c = 4;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
index e3486c1..347287a 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.strong.transformed.expect
@@ -20,27 +20,27 @@
 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 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;
+  core::int* a = self::x;
   a = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   a = 3;
-  core::int b = self::y;
+  core::int* b = self::y;
   b = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   b = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   b = 4;
-  core::int c = self::z;
+  core::int* c = self::z;
   c = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   c = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                   ^" in "hi" as{TypeError} core::int;
+                                   ^" in "hi" as{TypeError} core::int*;
   c = 4;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
index 771ee3c..b899119 100644
--- a/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart.type_promotion.expect
@@ -1,18 +1,18 @@
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:5: Context: Write to a@304
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:12:5: Context: Write to a@307
   a = /*error:INVALID_ASSIGNMENT*/ "hi";
     ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:13:5: Context: Write to a@304
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:13:5: Context: Write to a@307
   a = 3;
     ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:5: Context: Write to b@381
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:15:5: Context: Write to b@387
   b = /*error:INVALID_ASSIGNMENT*/ "hi";
     ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:16:5: Context: Write to b@381
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:16:5: Context: Write to b@387
   b = 4;
     ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:5: Context: Write to c@458
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:18:5: Context: Write to c@467
   c = /*error:INVALID_ASSIGNMENT*/ "hi";
     ^
-pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:19:5: Context: Write to c@458
+pkg/front_end/testcases/inference/infer_type_on_var_from_top_level.dart:19:5: Context: Write to c@467
   c = 4;
     ^
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
index 601e9bb..5caf115 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.expect
@@ -6,22 +6,22 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends inf::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super inf::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new self::C::•().x;
-  core::String z = new self::C::•().x;
+  core::int* y = new self::C::•().x;
+  core::String* z = new self::C::•().x;
 }
 static method main() → dynamic {
   self::foo();
@@ -34,7 +34,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends self::A {
-  synthetic constructor •() → inf::B
+  synthetic constructor •() → inf::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
index 601e9bb..5caf115 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.legacy.transformed.expect
@@ -6,22 +6,22 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends inf::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super inf::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new self::C::•().x;
-  core::String z = new self::C::•().x;
+  core::int* y = new self::C::•().x;
+  core::String* z = new self::C::•().x;
 }
 static method main() → dynamic {
   self::foo();
@@ -34,7 +34,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends self::A {
-  synthetic constructor •() → inf::B
+  synthetic constructor •() → inf::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
index ff10b61..759a5f0 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.expect
@@ -14,25 +14,25 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends inf::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super inf::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new self::C::•().{self::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::int* y = new self::C::•().{self::C::x};
+  core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
-                                                                    ^" in new self::C::•().{self::C::x} as{TypeError} core::String;
+                                                                    ^" in new self::C::•().{self::C::x} as{TypeError} core::String*;
 }
 static method main() → dynamic {
   self::foo();
@@ -45,7 +45,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends self::A {
-  synthetic constructor •() → inf::B
+  synthetic constructor •() → inf::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
index ff10b61..759a5f0 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart.strong.transformed.expect
@@ -14,25 +14,25 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends inf::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super inf::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new self::C::•().{self::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::int* y = new self::C::•().{self::C::x};
+  core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
-                                                                    ^" in new self::C::•().{self::C::x} as{TypeError} core::String;
+                                                                    ^" in new self::C::•().{self::C::x} as{TypeError} core::String*;
 }
 static method main() → dynamic {
   self::foo();
@@ -45,7 +45,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends self::A {
-  synthetic constructor •() → inf::B
+  synthetic constructor •() → inf::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
index 0b1b2b0..152515f 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends test::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super test::A::•()
     ;
 }
@@ -19,22 +19,22 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends self::B {
-  synthetic constructor •() → test::C
+  synthetic constructor •() → test::C*
     : super self::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → test::A
+  synthetic constructor •() → test::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new test::C::•().x;
-  core::String z = new test::C::•().x;
+  core::int* y = new test::C::•().x;
+  core::String* z = new test::C::•().x;
 }
 static method main() → dynamic {
   test::foo();
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
index 0b1b2b0..152515f 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.legacy.transformed.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends test::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super test::A::•()
     ;
 }
@@ -19,22 +19,22 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends self::B {
-  synthetic constructor •() → test::C
+  synthetic constructor •() → test::C*
     : super self::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → test::A
+  synthetic constructor •() → test::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new test::C::•().x;
-  core::String z = new test::C::•().x;
+  core::int* y = new test::C::•().x;
+  core::String* z = new test::C::•().x;
 }
 static method main() → dynamic {
   test::foo();
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
index 9b49051..32fb9c9 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends test::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super test::A::•()
     ;
 }
@@ -27,25 +27,25 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends self::B {
-  synthetic constructor •() → test::C
+  synthetic constructor •() → test::C*
     : super self::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → test::A
+  synthetic constructor •() → test::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new test::C::•().{test::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::int* y = new test::C::•().{test::C::x};
+  core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
-                                                                    ^" in new test::C::•().{test::C::x} as{TypeError} core::String;
+                                                                    ^" in new test::C::•().{test::C::x} as{TypeError} core::String*;
 }
 static method main() → dynamic {
   test::foo();
diff --git a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
index 9b49051..32fb9c9 100644
--- a/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles_b.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles.dart";
 
 class B extends test::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super test::A::•()
     ;
 }
@@ -27,25 +27,25 @@
 import "org-dartlang-testcase:///infer_type_regardless_of_declaration_order_or_cycles_b.dart";
 
 class C extends self::B {
-  synthetic constructor •() → test::C
+  synthetic constructor •() → test::C*
     : super self::B::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return null;
 }
 class A extends core::Object {
-  synthetic constructor •() → test::A
+  synthetic constructor •() → test::A*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static method foo() → dynamic {
-  core::int y = new test::C::•().{test::C::x};
-  core::String z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::int* y = new test::C::•().{test::C::x};
+  core::String* z = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_type_regardless_of_declaration_order_or_cycles.dart:20:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String z = /*error:INVALID_ASSIGNMENT*/ new C(). /*@target=C::x*/ x;
-                                                                    ^" in new test::C::•().{test::C::x} as{TypeError} core::String;
+                                                                    ^" in new test::C::•().{test::C::x} as{TypeError} core::String*;
 }
 static method main() → dynamic {
   test::foo();
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect
index 345abe6..7291a56 100644
--- a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic a = <core::int, core::String>{0: "aaa", 1: "bbb"};
-static field dynamic b = <core::double, core::int>{1.1: 1, 2.2: 2};
-static field dynamic c = <core::List<core::int>, core::Map<core::String, core::double>>{};
-static field dynamic d = <core::int, dynamic>{};
-static field dynamic e = <dynamic, core::int>{};
+static field dynamic a = <core::int*, core::String*>{0: "aaa", 1: "bbb"};
+static field dynamic b = <core::double*, core::int*>{1.1: 1, 2.2: 2};
+static field dynamic c = <core::List<core::int*>*, core::Map<core::String*, core::double*>*>{};
+static field dynamic d = <core::int*, dynamic>{};
+static field dynamic e = <dynamic, core::int*>{};
 static field dynamic f = <dynamic, dynamic>{};
 static method main() → dynamic {
   self::a;
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect
index 345abe6..7291a56 100644
--- a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic a = <core::int, core::String>{0: "aaa", 1: "bbb"};
-static field dynamic b = <core::double, core::int>{1.1: 1, 2.2: 2};
-static field dynamic c = <core::List<core::int>, core::Map<core::String, core::double>>{};
-static field dynamic d = <core::int, dynamic>{};
-static field dynamic e = <dynamic, core::int>{};
+static field dynamic a = <core::int*, core::String*>{0: "aaa", 1: "bbb"};
+static field dynamic b = <core::double*, core::int*>{1.1: 1, 2.2: 2};
+static field dynamic c = <core::List<core::int*>*, core::Map<core::String*, core::double*>*>{};
+static field dynamic d = <core::int*, dynamic>{};
+static field dynamic e = <dynamic, core::int*>{};
 static field dynamic f = <dynamic, dynamic>{};
 static method main() → dynamic {
   self::a;
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.expect
index 9542da0..a416db2 100644
--- a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.expect
@@ -2,12 +2,12 @@
 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 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;
diff --git a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.transformed.expect
index 9542da0..a416db2 100644
--- a/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_typed_map_literal.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 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 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;
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect
index 0360763..3514708 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.expect
@@ -2,24 +2,24 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
-  get w() → core::int
+  get w() → core::int*
     return "hello";
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect
index 0360763..3514708 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.legacy.transformed.expect
@@ -2,24 +2,24 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
-  get w() → core::int
+  get w() → core::int*
     return "hello";
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
index e8cded4..ceadc8a 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.expect
@@ -15,30 +15,30 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
-  get w() → core::int
+  get w() → core::int*
     return let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
-                                            ^" in "hello" as{TypeError} core::int;
+                                            ^" in "hello" as{TypeError} core::int*;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
index e8cded4..ceadc8a 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart.strong.transformed.expect
@@ -15,30 +15,30 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 3;
-  get w() → core::int
+  get w() → core::int*
     return let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   get w => /*error:RETURN_OF_INVALID_TYPE*/ \"hello\";
-                                            ^" in "hello" as{TypeError} core::int;
+                                            ^" in "hello" as{TypeError} core::int*;
 }
 static method foo() → dynamic {
-  core::String y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
+  core::String* y = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_3.dart:19:69: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   String y = /*error:INVALID_ASSIGNMENT*/ new B(). /*@target=B::x*/ x;
-                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x};
+                                                                    ^" in new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
index 4f44d59..045d718 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  generic-covariant-impl field self::B::E y = null;
-  synthetic constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y = null;
+  synthetic constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get x() → self::B::E
+  get x() → self::B::E*
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<core::String>().x;
-  core::String z = new self::B::•<core::String>().x;
+  core::int* y = new self::B::•<core::String*>().x;
+  core::String* z = new self::B::•<core::String*>().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
index 4f44d59..045d718 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.legacy.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  generic-covariant-impl field self::B::E y = null;
-  synthetic constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y = null;
+  synthetic constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get x() → self::B::E
+  get x() → self::B::E*
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<core::String>().x;
-  core::String z = new self::B::•<core::String>().x;
+  core::int* y = new self::B::•<core::String*>().x;
+  core::String* z = new self::B::•<core::String*>().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
index f6074a4..b926ab0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.expect
@@ -10,26 +10,26 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  generic-covariant-impl field self::B::E y = null;
-  synthetic constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y = null;
+  synthetic constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get x() → self::B::E
+  get x() → self::B::E*
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
-                                                                         ^" in new self::B::•<core::String>().{self::B::x} as{TypeError} core::int;
-  core::String z = new self::B::•<core::String>().{self::B::x};
+                                                                         ^" in new self::B::•<core::String*>().{self::B::x} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::x};
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
index f6074a4..b926ab0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart.strong.transformed.expect
@@ -10,26 +10,26 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::A::T x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::A::T* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> {
-  generic-covariant-impl field self::B::E y = null;
-  synthetic constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> {
+  generic-covariant-impl field self::B::E* y = null;
+  synthetic constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get x() → self::B::E
+  get x() → self::B::E*
     return this.{self::B::y};
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_4.dart:18:74: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   int y = /*error:INVALID_ASSIGNMENT*/ new B<String>(). /*@target=B::x*/ x;
-                                                                         ^" in new self::B::•<core::String>().{self::B::x} as{TypeError} core::int;
-  core::String z = new self::B::•<core::String>().{self::B::x};
+                                                                         ^" in new self::B::•<core::String*>().{self::B::x} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::x};
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect
index 2a0386f..5643863 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.expect
@@ -2,34 +2,34 @@
 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>
+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 method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
 }
-abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  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 method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String* {}
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<dynamic>().m(null, null);
-  core::String z = new self::B::•<dynamic>().m(null, null);
+  core::int* y = new self::B::•<dynamic>().m(null, null);
+  core::String* z = new self::B::•<dynamic>().m(null, null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect
index 2a0386f..5643863 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.legacy.transformed.expect
@@ -2,34 +2,34 @@
 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>
+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 method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
 }
-abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  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 method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String* {}
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<dynamic>().m(null, null);
-  core::String z = new self::B::•<dynamic>().m(null, null);
+  core::int* y = new self::B::•<dynamic>().m(null, null);
+  core::String* z = new self::B::•<dynamic>().m(null, null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
index ea55404..f2818be 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.expect
@@ -10,37 +10,37 @@
 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>
+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 method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
 }
-abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  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 method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=B::m*/ m(null, null);
-                         ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int;
-  core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
+                         ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int*;
+  core::String* z = new self::B::•<dynamic>().{self::B::m}(null, null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
index ea55404..f2818be 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart.strong.transformed.expect
@@ -10,37 +10,37 @@
 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>
+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 method m(dynamic a, (dynamic, self::I::E*) →* core::String* f) → core::String*;
 }
-abstract class A<E extends core::Object = dynamic> extends core::Object implements self::I<self::A::E> {
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<self::A::E*> {
+  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 method m(dynamic a, (dynamic, self::A::E*) →* core::String* f) → core::String*;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, self::B::E) → dynamic f) → core::String {}
+  method m(dynamic a, (dynamic, self::B::E*) →* dynamic f) → core::String* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_5.dart:30:26: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=B::m*/ m(null, null);
-                         ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int;
-  core::String z = new self::B::•<dynamic>().{self::B::m}(null, null);
+                         ^" in new self::B::•<dynamic>().{self::B::m}(null, null) as{TypeError} core::int*;
+  core::String* z = new self::B::•<dynamic>().{self::B::m}(null, null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
index be1a80f..d358825 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.expect
@@ -5,29 +5,29 @@
 
 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> {
-  final field self::A::E value = null;
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<core::String>().m(null, null).value;
-  core::String z = new self::B::•<core::String>().m(null, null).value;
+  core::int* y = new self::B::•<core::String*>().m(null, null).value;
+  core::String* z = new self::B::•<core::String*>().m(null, null).value;
 }
 static method main() → dynamic {}
 
@@ -38,10 +38,10 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
index be1a80f..d358825 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 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> {
-  final field self::A::E value = null;
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = new self::B::•<core::String>().m(null, null).value;
-  core::String z = new self::B::•<core::String>().m(null, null).value;
+  core::int* y = new self::B::•<core::String*>().m(null, null).value;
+  core::String* z = new self::B::•<core::String*>().m(null, null).value;
 }
 static method main() → dynamic {}
 
@@ -38,10 +38,10 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
index 1f20b42..59fb457 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.expect
@@ -13,32 +13,32 @@
 
 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> {
-  final field self::A::E value = null;
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
-                             ^" in new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int;
-  core::String z = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value};
+                             ^" in new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value};
 }
 static method main() → dynamic {}
 
@@ -49,10 +49,10 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
index 1f20b42..59fb457 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart.strong.transformed.expect
@@ -13,32 +13,32 @@
 
 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> {
-  final field self::A::E value = null;
-  const constructor •() → self::A<self::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements inf::I<self::A::E*> {
+  final field self::A::E* value = null;
+  const constructor •() → self::A<self::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → self::M
+  final field core::int* y = 0;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends self::A<self::B::E> implements self::M {
-  const constructor •() → self::B<self::B::E>
+class B<E extends core::Object* = dynamic> extends self::A<self::B::E*> implements self::M {
+  const constructor •() → self::B<self::B::E*>*
     : super self::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → self::A<self::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → self::A<self::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
-                             ^" in new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int;
-  core::String z = new self::B::•<core::String>().{self::B::m}(null, null).{self::A::value};
+                             ^" in new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value} as{TypeError} core::int*;
+  core::String* z = new self::B::•<core::String*>().{self::B::m}(null, null).{self::A::value};
 }
 static method main() → dynamic {}
 
@@ -49,10 +49,10 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → self::A<inf::I::E*>*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
index c669cd7..b0e9552 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.expect
@@ -5,11 +5,11 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
 }
 static method main() → dynamic {}
 
@@ -20,28 +20,28 @@
 
 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> {
-  final field test::A::E value = null;
-  const constructor •() → test::A<test::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → test::M
+  final field core::int* y = 0;
+  synthetic constructor •() → test::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends test::A<test::B::E> implements test::M {
-  const constructor •() → test::B<test::B::E>
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
     : super test::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → test::A<test::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = new test::B::•<core::String>().m(null, null).value;
-  core::String z = new test::B::•<core::String>().m(null, null).value;
+  core::int* y = new test::B::•<core::String*>().m(null, null).value;
+  core::String* z = new test::B::•<core::String*>().m(null, null).value;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
index c669cd7..b0e9552 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.legacy.transformed.expect
@@ -5,11 +5,11 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
 }
 static method main() → dynamic {}
 
@@ -20,28 +20,28 @@
 
 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> {
-  final field test::A::E value = null;
-  const constructor •() → test::A<test::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → test::M
+  final field core::int* y = 0;
+  synthetic constructor •() → test::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends test::A<test::B::E> implements test::M {
-  const constructor •() → test::B<test::B::E>
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
     : super test::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → test::A<test::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = new test::B::•<core::String>().m(null, null).value;
-  core::String z = new test::B::•<core::String>().m(null, null).value;
+  core::int* y = new test::B::•<core::String*>().m(null, null).value;
+  core::String* z = new test::B::•<core::String*>().m(null, null).value;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
index a10bf88..0351235 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.expect
@@ -5,11 +5,11 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
 }
 static method main() → dynamic {}
 
@@ -28,31 +28,31 @@
 
 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> {
-  final field test::A::E value = null;
-  const constructor •() → test::A<test::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → test::M
+  final field core::int* y = 0;
+  synthetic constructor •() → test::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends test::A<test::B::E> implements test::M {
-  const constructor •() → test::B<test::B::E>
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
     : super test::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → test::A<test::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
-                             ^" in new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int;
-  core::String z = new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value};
+                             ^" in new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int*;
+  core::String* z = new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
index a10bf88..0351235 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle_a.dart.strong.transformed.expect
@@ -5,11 +5,11 @@
 
 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>
+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 method m(dynamic a, (dynamic, core::int*) →* core::String* f) → test::A<self::I::E*>*;
 }
 static method main() → dynamic {}
 
@@ -28,31 +28,31 @@
 
 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> {
-  final field test::A::E value = null;
-  const constructor •() → test::A<test::A::E>
+abstract class A<E extends core::Object* = dynamic> extends core::Object implements self::I<test::A::E*> {
+  final field test::A::E* value = null;
+  const constructor •() → test::A<test::A::E*>*
     : super core::Object::•()
     ;
 }
 abstract class M extends core::Object {
-  final field core::int y = 0;
-  synthetic constructor •() → test::M
+  final field core::int* y = 0;
+  synthetic constructor •() → test::M*
     : super core::Object::•()
     ;
 }
-class B<E extends core::Object = dynamic> extends test::A<test::B::E> implements test::M {
-  const constructor •() → test::B<test::B::E>
+class B<E extends core::Object* = dynamic> extends test::A<test::B::E*> implements test::M {
+  const constructor •() → test::B<test::B::E*>*
     : super test::A::•()
     ;
-  get y() → core::int
+  get y() → core::int*
     return 0;
-  method m(dynamic a, (dynamic, core::int) → dynamic f) → test::A<test::B::E> {}
+  method m(dynamic a, (dynamic, core::int*) →* dynamic f) → test::A<test::B::E*>* {}
 }
 static method foo() → dynamic {
-  core::int y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
+  core::int* y = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_in_library_cycle.dart:30:30: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       . /*@target=A::value*/ value;
-                             ^" in new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int;
-  core::String z = new test::B::•<core::String>().{test::B::m}(null, null).{test::A::value};
+                             ^" in new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value} as{TypeError} core::int*;
+  core::String* z = new test::B::•<core::String*>().{test::B::m}(null, null).{test::A::value};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect
index 1efa9f8..d1fe270 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.expect
@@ -2,22 +2,22 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect
index 1efa9f8..d1fe270 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.legacy.transformed.expect
@@ -2,22 +2,22 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().x;
-  core::int z = new self::B::•().x;
+  core::String* y = new self::B::•().x;
+  core::int* z = new self::B::•().x;
 }
 static method main() → dynamic {
   self::foo();
diff --git a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
index e21b9d9..8038d01 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_generic_instantiations_infer.dart.strong.expect
@@ -13,22 +13,22 @@
 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>
+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::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   get x() → dynamic
     return 3;
 }
 static method foo() → dynamic {
-  core::String y = new self::B::•().{self::B::x} as{TypeError} core::String;
-  core::int z = new self::B::•().{self::B::x} as{TypeError} core::int;
+  core::String* y = new self::B::•().{self::B::x} as{TypeError} core::String*;
+  core::int* z = new self::B::•().{self::B::x} as{TypeError} 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 b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart
index 17a507c..6f21631 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart
@@ -11,7 +11,7 @@
 
 class Bar<T extends Iterable<String>> {
   void foo(T t) {
-    for (var /*@type=String*/ i in t) {
+    for (var /*@ type=String* */ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
     }
   }
@@ -19,7 +19,7 @@
 
 class Baz<T, E extends Iterable<T>, S extends E> {
   void foo(S t) {
-    for (var /*@type=Baz::T*/ i in t) {
+    for (var /*@ type=Baz::T* */ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
       T y = i;
     }
@@ -27,8 +27,8 @@
 }
 
 test() {
-  var /*@type=List<Foo>*/ list = <Foo>[];
-  for (var /*@type=Foo*/ x in list) {
+  var /*@ type=List<Foo*>* */ list = <Foo>[];
+  for (var /*@ type=Foo* */ x in list) {
     String y = /*error:INVALID_ASSIGNMENT*/ x;
   }
 
@@ -40,30 +40,30 @@
     String y = x;
   }
 
-  var /*@type=dynamic*/ z;
+  var /*@ type=dynamic */ z;
   for (z in list) {
     String y = /*info:DYNAMIC_CAST*/ z;
   }
 
   Iterable iter = list;
   for (Foo /*info:DYNAMIC_CAST*/ x in iter) {
-    var /*@type=Foo*/ y = x;
+    var /*@ type=Foo* */ y = x;
   }
 
   dynamic iter2 = list;
   for (Foo /*info:DYNAMIC_CAST*/ x in /*info:DYNAMIC_CAST*/ iter2) {
-    var /*@type=Foo*/ y = x;
+    var /*@ type=Foo* */ y = x;
   }
 
-  var /*@type=Map<String, Foo>*/ map = <String, Foo>{};
+  var /*@ type=Map<String*, Foo*>* */ map = <String, Foo>{};
   // Error: map must be an Iterable.
-  for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+  for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
     String y = /*info:DYNAMIC_CAST*/ x;
   }
 
   // We're not properly inferring that map.keys is an Iterable<String>
   // and that x is a String.
-  for (var /*@type=String*/ x in map. /*@target=Map::keys*/ keys) {
+  for (var /*@ type=String* */ x in map. /*@target=Map::keys*/ keys) {
     String y = x;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
index 5afe30e..78e3a2c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Iterable<core::String*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → void {
+  method foo(generic-covariant-impl self::Bar::T* t) → void {
     for (dynamic i in t) {
-      core::int x = i;
+      core::int* x = i;
     }
   }
 }
-class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+class Baz<T extends core::Object* = dynamic, E extends core::Iterable<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Baz::S t) → void {
+  method foo(generic-covariant-impl self::Baz::S* t) → void {
     for (dynamic i in t) {
-      core::int x = i;
-      self::Baz::T y = i;
+      core::int* x = i;
+      self::Baz::T* y = i;
     }
   }
 }
 static method test() → dynamic {
-  dynamic list = <self::Foo>[];
+  dynamic list = <self::Foo*>[];
   for (dynamic x in list) {
-    core::String y = x;
+    core::String* y = x;
   }
   for (dynamic x in list) {
-    core::String y = x;
+    core::String* y = x;
   }
-  for (core::String x in list) {
-    core::String y = x;
+  for (core::String* x in list) {
+    core::String* y = x;
   }
   dynamic z;
   for (final dynamic #t1 in list) {
     z = #t1;
-    core::String y = z;
+    core::String* y = z;
   }
-  core::Iterable<dynamic> iter = list;
-  for (self::Foo x in iter) {
+  core::Iterable<dynamic>* iter = list;
+  for (self::Foo* x in iter) {
     dynamic y = x;
   }
   dynamic iter2 = list;
-  for (self::Foo x in iter2) {
+  for (self::Foo* x in iter2) {
     dynamic y = x;
   }
-  dynamic map = <core::String, self::Foo>{};
+  dynamic map = <core::String*, self::Foo*>{};
   for (dynamic x in map) {
-    core::String y = x;
+    core::String* y = x;
   }
   for (dynamic x in map.keys) {
-    core::String y = x;
+    core::String* y = x;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
index 5afe30e..78e3a2c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.legacy.transformed.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Iterable<core::String*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → void {
+  method foo(generic-covariant-impl self::Bar::T* t) → void {
     for (dynamic i in t) {
-      core::int x = i;
+      core::int* x = i;
     }
   }
 }
-class Baz<T extends core::Object = dynamic, E extends core::Iterable<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+class Baz<T extends core::Object* = dynamic, E extends core::Iterable<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Baz::S t) → void {
+  method foo(generic-covariant-impl self::Baz::S* t) → void {
     for (dynamic i in t) {
-      core::int x = i;
-      self::Baz::T y = i;
+      core::int* x = i;
+      self::Baz::T* y = i;
     }
   }
 }
 static method test() → dynamic {
-  dynamic list = <self::Foo>[];
+  dynamic list = <self::Foo*>[];
   for (dynamic x in list) {
-    core::String y = x;
+    core::String* y = x;
   }
   for (dynamic x in list) {
-    core::String y = x;
+    core::String* y = x;
   }
-  for (core::String x in list) {
-    core::String y = x;
+  for (core::String* x in list) {
+    core::String* y = x;
   }
   dynamic z;
   for (final dynamic #t1 in list) {
     z = #t1;
-    core::String y = z;
+    core::String* y = z;
   }
-  core::Iterable<dynamic> iter = list;
-  for (self::Foo x in iter) {
+  core::Iterable<dynamic>* iter = list;
+  for (self::Foo* x in iter) {
     dynamic y = x;
   }
   dynamic iter2 = list;
-  for (self::Foo x in iter2) {
+  for (self::Foo* x in iter2) {
     dynamic y = x;
   }
-  dynamic map = <core::String, self::Foo>{};
+  dynamic map = <core::String*, self::Foo*>{};
   for (dynamic x in map) {
-    core::String y = x;
+    core::String* y = x;
   }
   for (dynamic x in map.keys) {
-    core::String y = x;
+    core::String* y = x;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
index d7b891f..cd22a1d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.expect
@@ -24,95 +24,95 @@
 //   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:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// 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) {
-//                                                                    ^
+//   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
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → void {
-    for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = 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'.
+  method foo(generic-covariant-impl self::Bar::T* t) → void {
+    for (core::String* i in t) {
+      core::int* x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
+                                           ^" in i as{TypeError} core::int*;
     }
   }
 }
-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>
+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(generic-covariant-impl self::Baz::S t) → void {
-    for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = 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'.
+  method foo(generic-covariant-impl self::Baz::S* t) → void {
+    for (self::Baz::T* i in t) {
+      core::int* x = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
-      self::Baz::T y = i;
+                                           ^" in i as{TypeError} core::int*;
+      self::Baz::T* y = i;
     }
   }
 }
 static method test() → dynamic {
-  core::List<self::Foo> list = <self::Foo>[];
-  for (self::Foo x in list) {
-    core::String y = let final<BottomType> #t3 = 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'.
+  core::List<self::Foo*>* list = <self::Foo*>[];
+  for (self::Foo* x in list) {
+    core::String* y = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
-                                            ^" in x as{TypeError} core::String;
+                                            ^" in x as{TypeError} core::String*;
   }
   for (dynamic x in list) {
-    core::String y = x as{TypeError} core::String;
+    core::String* y = x as{TypeError} core::String*;
   }
-  for (final self::Foo #t4 in list) {
-    core::String x = let final<BottomType> #t5 = 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'.
+  for (final self::Foo* #t4 in list) {
+    core::String* x = let final<BottomType> #t5 = 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 #t4 as{TypeError} core::String;
-    core::String y = x;
+              ^" in #t4 as{TypeError} core::String*;
+    core::String* y = x;
   }
   dynamic z;
-  for (final self::Foo #t6 in list) {
+  for (final self::Foo* #t6 in list) {
     z = #t6;
-    core::String y = z as{TypeError} core::String;
+    core::String* y = z as{TypeError} core::String*;
   }
-  core::Iterable<dynamic> iter = list;
+  core::Iterable<dynamic>* iter = list;
   for (final dynamic #t7 in iter) {
-    self::Foo x = #t7 as{TypeError} self::Foo;
-    self::Foo y = x;
+    self::Foo* x = #t7 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
   dynamic iter2 = list;
-  for (final dynamic #t8 in iter2 as{TypeError} core::Iterable<dynamic>) {
-    self::Foo x = #t8 as{TypeError} self::Foo;
-    self::Foo y = x;
+  for (final dynamic #t8 in iter2 as{TypeError} core::Iterable<dynamic>*) {
+    self::Foo* x = #t8 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
-  core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
+  for (dynamic x in let final<BottomType> #t9 = 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} core::String;
+  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} core::String*;
   }
-  for (core::String x in map.{core::Map::keys}) {
-    core::String y = x;
+  for (core::String* x in map.{core::Map::keys}) {
+    core::String* y = x;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
index d7b891f..cd22a1d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart.strong.transformed.expect
@@ -24,95 +24,95 @@
 //   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:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+// 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) {
-//                                                                    ^
+//   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
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends core::Iterable<core::String> = core::Iterable<core::String>> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Iterable<core::String*>* = core::Iterable<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → void {
-    for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = 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'.
+  method foo(generic-covariant-impl self::Bar::T* t) → void {
+    for (core::String* i in t) {
+      core::int* x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
+                                           ^" in i as{TypeError} core::int*;
     }
   }
 }
-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>
+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(generic-covariant-impl self::Baz::S t) → void {
-    for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = 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'.
+  method foo(generic-covariant-impl self::Baz::S* t) → void {
+    for (self::Baz::T* i in t) {
+      core::int* x = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
-      self::Baz::T y = i;
+                                           ^" in i as{TypeError} core::int*;
+      self::Baz::T* y = i;
     }
   }
 }
 static method test() → dynamic {
-  core::List<self::Foo> list = <self::Foo>[];
-  for (self::Foo x in list) {
-    core::String y = let final<BottomType> #t3 = 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'.
+  core::List<self::Foo*>* list = <self::Foo*>[];
+  for (self::Foo* x in list) {
+    core::String* y = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
-                                            ^" in x as{TypeError} core::String;
+                                            ^" in x as{TypeError} core::String*;
   }
   for (dynamic x in list) {
-    core::String y = x as{TypeError} core::String;
+    core::String* y = x as{TypeError} core::String*;
   }
-  for (final self::Foo #t4 in list) {
-    core::String x = let final<BottomType> #t5 = 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'.
+  for (final self::Foo* #t4 in list) {
+    core::String* x = let final<BottomType> #t5 = 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 #t4 as{TypeError} core::String;
-    core::String y = x;
+              ^" in #t4 as{TypeError} core::String*;
+    core::String* y = x;
   }
   dynamic z;
-  for (final self::Foo #t6 in list) {
+  for (final self::Foo* #t6 in list) {
     z = #t6;
-    core::String y = z as{TypeError} core::String;
+    core::String* y = z as{TypeError} core::String*;
   }
-  core::Iterable<dynamic> iter = list;
+  core::Iterable<dynamic>* iter = list;
   for (final dynamic #t7 in iter) {
-    self::Foo x = #t7 as{TypeError} self::Foo;
-    self::Foo y = x;
+    self::Foo* x = #t7 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
   dynamic iter2 = list;
-  for (final dynamic #t8 in iter2 as{TypeError} core::Iterable<dynamic>) {
-    self::Foo x = #t8 as{TypeError} self::Foo;
-    self::Foo y = x;
+  for (final dynamic #t8 in iter2 as{TypeError} core::Iterable<dynamic>*) {
+    self::Foo* x = #t8 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
-  core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop.dart:60:68: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Iterable<dynamic>'.
+  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
+  for (dynamic x in let final<BottomType> #t9 = 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} core::String;
+  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} core::String*;
   }
-  for (core::String x in map.{core::Map::keys}) {
-    core::String y = x;
+  for (core::String* x in map.{core::Map::keys}) {
+    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 b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
index 9b410ed..b61b344 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart
@@ -13,7 +13,7 @@
 
 class Bar<T extends Stream<String>> {
   foo(T t) async {
-    await for (var /*@type=String*/ i in t) {
+    await for (var /*@ type=String* */ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
     }
   }
@@ -21,7 +21,7 @@
 
 class Baz<T, E extends Stream<T>, S extends E> {
   foo(S t) async {
-    await for (var /*@type=Baz::T*/ i in t) {
+    await for (var /*@ type=Baz::T* */ i in t) {
       int x = /*error:INVALID_ASSIGNMENT*/ i;
       T y = i;
     }
@@ -33,8 +33,8 @@
 }
 
 test() async {
-  var /*@type=MyStream<Foo>*/ myStream = new MyStream<Foo>();
-  await for (var /*@type=Foo*/ x in myStream) {
+  var /*@ type=MyStream<Foo*>* */ myStream = new MyStream<Foo>();
+  await for (var /*@ type=Foo* */ x in myStream) {
     String y = /*error:INVALID_ASSIGNMENT*/ x;
   }
 
@@ -46,24 +46,24 @@
     String y = x;
   }
 
-  var /*@type=dynamic*/ z;
+  var /*@ type=dynamic */ z;
   await for (z in myStream) {
     String y = /*info:DYNAMIC_CAST*/ z;
   }
 
   Stream stream = myStream;
   await for (Foo /*info:DYNAMIC_CAST*/ x in stream) {
-    var /*@type=Foo*/ y = x;
+    var /*@ type=Foo* */ y = x;
   }
 
   dynamic stream2 = myStream;
   await for (Foo /*info:DYNAMIC_CAST*/ x in /*info:DYNAMIC_CAST*/ stream2) {
-    var /*@type=Foo*/ y = x;
+    var /*@ type=Foo* */ y = x;
   }
 
-  var /*@type=Map<String, Foo>*/ map = <String, Foo>{};
+  var /*@ type=Map<String*, Foo*>* */ map = <String, Foo>{};
   // Error: map must be a Stream.
-  await for (var /*@type=dynamic*/ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+  await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
     String y = /*info:DYNAMIC_CAST*/ x;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
index e4a880ef..889f286 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.expect
@@ -6,63 +6,63 @@
 import "dart:async";
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends asy::Stream<core::String*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
+  method foo(generic-covariant-impl self::Bar::T* t) → dynamic async {
     await for (dynamic i in t) {
-      core::int x = i;
+      core::int* x = i;
     }
   }
 }
-class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Baz::S t) → dynamic async {
+  method foo(generic-covariant-impl self::Baz::S* t) → dynamic async {
     await for (dynamic i in t) {
-      core::int x = i;
-      self::Baz::T y = i;
+      core::int* x = i;
+      self::Baz::T* y = i;
     }
   }
 }
-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>
+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;
 }
 static method test() → dynamic async {
-  dynamic myStream = self::MyStream::•<self::Foo>();
+  dynamic myStream = self::MyStream::•<self::Foo*>();
   await for (dynamic x in myStream) {
-    core::String y = x;
+    core::String* y = x;
   }
   await for (dynamic x in myStream) {
-    core::String y = x;
+    core::String* y = x;
   }
-  await for (core::String x in myStream) {
-    core::String y = x;
+  await for (core::String* x in myStream) {
+    core::String* y = x;
   }
   dynamic z;
   await for (final dynamic #t1 in myStream) {
     z = #t1;
-    core::String y = z;
+    core::String* y = z;
   }
-  asy::Stream<dynamic> stream = myStream;
-  await for (self::Foo x in stream) {
+  asy::Stream<dynamic>* stream = myStream;
+  await for (self::Foo* x in stream) {
     dynamic y = x;
   }
   dynamic stream2 = myStream;
-  await for (self::Foo x in stream2) {
+  await for (self::Foo* x in stream2) {
     dynamic y = x;
   }
-  dynamic map = <core::String, self::Foo>{};
+  dynamic map = <core::String*, self::Foo*>{};
   await for (dynamic x in map) {
-    core::String y = x;
+    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.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
index a26de4c..765571c 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.legacy.transformed.expect
@@ -6,18 +6,18 @@
 import "dart:async";
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends asy::Stream<core::String*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  method foo(generic-covariant-impl self::Bar::T* t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -34,17 +34,16 @@
           {
             dynamic :stream = t;
             asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
             try
               #L2:
               while (true) {
-                dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
                 if(:result) {
                   dynamic i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = i;
+                    core::int* x = i;
                   }
                 }
                 else
@@ -70,13 +69,13 @@
     return :async_completer.{asy::Completer::future};
   }
 }
-class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  method foo(generic-covariant-impl self::Baz::S* t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -93,18 +92,17 @@
           {
             dynamic :stream = t;
             asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
             try
               #L4:
               while (true) {
-                dynamic #t4 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                dynamic #t4 = asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
                 if(:result) {
                   dynamic i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = i;
-                    self::Baz::T y = i;
+                    core::int* x = i;
+                    self::Baz::T* y = i;
                   }
                 }
                 else
@@ -130,13 +128,13 @@
     return :async_completer.{asy::Completer::future};
   }
 }
-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>
+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;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -150,21 +148,20 @@
     try {
       #L5:
       {
-        dynamic myStream = self::MyStream::•<self::Foo>();
+        dynamic myStream = self::MyStream::•<self::Foo*>();
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t7 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x;
+                  core::String* y = x;
                 }
               }
               else
@@ -179,17 +176,16 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L7:
             while (true) {
-              dynamic #t10 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t10 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t11 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x;
+                  core::String* y = x;
                 }
               }
               else
@@ -204,17 +200,16 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::String> :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::String*>* :for-iterator = new asy::_StreamIterator::•<core::String*>(:stream);
           try
             #L8:
             while (true) {
-              dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t13 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::String x = :for-iterator.{asy::_StreamIterator::current};
+                core::String* x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x;
+                  core::String* y = x;
                 }
               }
               else
@@ -230,18 +225,17 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L9:
             while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t16 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   z = #t18;
-                  core::String y = z;
+                  core::String* y = z;
                 }
               }
               else
@@ -253,19 +247,18 @@
               :result;
             }
         }
-        asy::Stream<dynamic> stream = myStream;
+        asy::Stream<dynamic>* stream = myStream;
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L10:
             while (true) {
-              dynamic #t20 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t20 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t21 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
+                self::Foo* x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   dynamic y = x;
                 }
@@ -283,15 +276,14 @@
         {
           dynamic :stream = stream2;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L11:
             while (true) {
-              dynamic #t23 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t23 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t24 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
+                self::Foo* x = :for-iterator.{asy::_StreamIterator::current};
                 {
                   dynamic y = x;
                 }
@@ -305,21 +297,20 @@
               :result;
             }
         }
-        dynamic map = <core::String, self::Foo>{};
+        dynamic map = <core::String*, self::Foo*>{};
         {
           dynamic :stream = map;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L12:
             while (true) {
-              dynamic #t26 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t26 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t27 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x;
+                  core::String* y = x;
                 }
               }
               else
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
index c157ca9..15b2a4d 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.outline.expect
@@ -6,24 +6,24 @@
 import "dart:async";
 
 class Foo extends core::Object {
-  field core::int bar;
-  synthetic constructor •() → self::Foo
+  field core::int* bar;
+  synthetic constructor •() → self::Foo*
     ;
 }
-class Bar<T extends asy::Stream<core::String> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends asy::Stream<core::String*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → dynamic
+  method foo(generic-covariant-impl self::Bar::T* t) → dynamic
     ;
 }
-class Baz<T extends core::Object = dynamic, E extends asy::Stream<self::Baz::T> = dynamic, S extends self::Baz::E = dynamic> extends core::Object {
-  synthetic constructor •() → self::Baz<self::Baz::T, self::Baz::E, self::Baz::S>
+class Baz<T extends core::Object* = dynamic, E extends asy::Stream<self::Baz::T*>* = dynamic, S extends self::Baz::E* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Baz<self::Baz::T*, self::Baz::E*, self::Baz::S*>*
     ;
-  method foo(generic-covariant-impl self::Baz::S t) → dynamic
+  method foo(generic-covariant-impl self::Baz::S* t) → dynamic
     ;
 }
-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>
+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*>*
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
index 8d6871f..cf89449 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.expect
@@ -24,12 +24,12 @@
 //   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:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+// 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) {
-//                                                                          ^
+//   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -38,85 +38,85 @@
 import "dart:async";
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → dynamic async {
-    await for (core::String i in t) {
-      core::int x = let final<BottomType> #t1 = 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'.
+  method foo(generic-covariant-impl self::Bar::T* t) → dynamic async {
+    await for (core::String* i in t) {
+      core::int* x = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
+                                           ^" in i as{TypeError} core::int*;
     }
   }
 }
-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>
+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(generic-covariant-impl self::Baz::S t) → dynamic async {
-    await for (self::Baz::T i in t) {
-      core::int x = let final<BottomType> #t2 = 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'.
+  method foo(generic-covariant-impl self::Baz::S* t) → dynamic async {
+    await for (self::Baz::T* i in t) {
+      core::int* x = let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
-      self::Baz::T y = i;
+                                           ^" in i as{TypeError} core::int*;
+      self::Baz::T* y = i;
     }
   }
 }
-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>
+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;
 }
 static method test() → dynamic async {
-  self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
-  await for (self::Foo x in myStream) {
-    core::String y = let final<BottomType> #t3 = 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'.
+  self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
+  await for (self::Foo* x in myStream) {
+    core::String* y = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
-                                            ^" in x as{TypeError} core::String;
+                                            ^" in x as{TypeError} core::String*;
   }
   await for (dynamic x in myStream) {
-    core::String y = x as{TypeError} core::String;
+    core::String* y = x as{TypeError} core::String*;
   }
-  await for (final self::Foo #t4 in myStream) {
-    core::String x = let final<BottomType> #t5 = 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'.
+  await for (final self::Foo* #t4 in myStream) {
+    core::String* x = let final<BottomType> #t5 = 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 #t4 as{TypeError} core::String;
-    core::String y = x;
+                    ^" in #t4 as{TypeError} core::String*;
+    core::String* y = x;
   }
   dynamic z;
-  await for (final self::Foo #t6 in myStream) {
+  await for (final self::Foo* #t6 in myStream) {
     z = #t6;
-    core::String y = z as{TypeError} core::String;
+    core::String* y = z as{TypeError} core::String*;
   }
-  asy::Stream<dynamic> stream = myStream;
+  asy::Stream<dynamic>* stream = myStream;
   await for (final dynamic #t7 in stream) {
-    self::Foo x = #t7 as{TypeError} self::Foo;
-    self::Foo y = x;
+    self::Foo* x = #t7 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
   dynamic stream2 = myStream;
-  await for (final dynamic #t8 in stream2 as{TypeError} asy::Stream<dynamic>) {
-    self::Foo x = #t8 as{TypeError} self::Foo;
-    self::Foo y = x;
+  await for (final dynamic #t8 in stream2 as{TypeError} asy::Stream<dynamic>*) {
+    self::Foo* x = #t8 as{TypeError} self::Foo*;
+    self::Foo* y = x;
   }
-  core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
-  await for (dynamic x in let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+  core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
+  await for (dynamic x in let final<BottomType> #t9 = 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} core::String;
+  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} core::String*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
index e8b37cd..87def0a 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart.strong.transformed.expect
@@ -24,12 +24,12 @@
 //   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:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+// 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) {
-//                                                                          ^
+//   await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+//                                                                            ^
 //
 import self as self;
 import "dart:core" as core;
@@ -38,18 +38,18 @@
 import "dart:async";
 
 class Foo extends core::Object {
-  field core::int bar = 42;
-  synthetic constructor •() → self::Foo
+  field core::int* bar = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
-class Bar<T extends asy::Stream<core::String> = asy::Stream<core::String>> extends core::Object {
-  synthetic constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends asy::Stream<core::String*>* = asy::Stream<core::String*>*> extends core::Object {
+  synthetic constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
-  method foo(generic-covariant-impl self::Bar::T t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  method foo(generic-covariant-impl self::Bar::T* t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -66,20 +66,19 @@
           {
             dynamic :stream = t;
             asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<core::String> :for-iterator = new asy::_StreamIterator::•<core::String>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            asy::_StreamIterator<core::String*>* :for-iterator = new asy::_StreamIterator::•<core::String*>(:stream);
             try
               #L2:
               while (true) {
-                dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
                 if(:result) {
-                  core::String i = :for-iterator.{asy::_StreamIterator::current};
+                  core::String* i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final<BottomType> #t3 = 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'.
+                    core::int* x = let final<BottomType> #t3 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
+                                           ^" in i as{TypeError} core::int*;
                   }
                 }
                 else
@@ -105,13 +104,13 @@
     return :async_completer.{asy::Completer::future};
   }
 }
-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>
+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(generic-covariant-impl self::Baz::S t) → dynamic /* originally async */ {
-    final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-    asy::FutureOr<dynamic> :return_value;
+  method foo(generic-covariant-impl self::Baz::S* t) → dynamic /* originally async */ {
+    final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+    asy::FutureOr<dynamic>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -128,21 +127,20 @@
           {
             dynamic :stream = t;
             asy::_asyncStarListenHelper(:stream, :async_op);
-            asy::_StreamIterator<self::Baz::T> :for-iterator = new asy::_StreamIterator::•<self::Baz::T>(:stream);
-            const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+            asy::_StreamIterator<self::Baz::T*>* :for-iterator = new asy::_StreamIterator::•<self::Baz::T*>(:stream);
             try
               #L4:
               while (true) {
-                dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+                dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream);
                 [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
                 if(:result) {
-                  self::Baz::T i = :for-iterator.{asy::_StreamIterator::current};
+                  self::Baz::T* i = :for-iterator.{asy::_StreamIterator::current};
                   {
-                    core::int x = let final<BottomType> #t7 = 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'.
+                    core::int* x = let final<BottomType> #t7 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       int x = /*error:INVALID_ASSIGNMENT*/ i;
-                                           ^" in i as{TypeError} core::int;
-                    self::Baz::T y = i;
+                                           ^" in i as{TypeError} core::int*;
+                    self::Baz::T* y = i;
                   }
                 }
                 else
@@ -168,13 +166,13 @@
     return :async_completer.{asy::Completer::future};
   }
 }
-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>
+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;
 }
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -188,25 +186,24 @@
     try {
       #L5:
       {
-        self::MyStream<self::Foo> myStream = self::MyStream::•<self::Foo>();
+        self::MyStream<self::Foo*>* myStream = self::MyStream::•<self::Foo*>();
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L6:
             while (true) {
-              dynamic #t9 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t9 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t10 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                self::Foo x = :for-iterator.{asy::_StreamIterator::current};
+                self::Foo* x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = let final<BottomType> #t11 = 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'.
+                  core::String* y = let final<BottomType> #t11 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
     String y = /*error:INVALID_ASSIGNMENT*/ x;
-                                            ^" in x as{TypeError} core::String;
+                                            ^" in x as{TypeError} core::String*;
                 }
               }
               else
@@ -221,17 +218,16 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L7:
             while (true) {
-              dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t13 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x as{TypeError} core::String;
+                  core::String* y = x as{TypeError} core::String*;
                 }
               }
               else
@@ -246,22 +242,21 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L8:
             while (true) {
-              dynamic #t16 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t16 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t17 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::Foo #t18 = :for-iterator.{asy::_StreamIterator::current};
+                final self::Foo* #t18 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String x = let final<BottomType> #t19 = 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'.
+                  core::String* x = let final<BottomType> #t19 = 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 #t18 as{TypeError} core::String;
-                  core::String y = x;
+                    ^" in #t18 as{TypeError} core::String*;
+                  core::String* y = x;
                 }
               }
               else
@@ -277,18 +272,17 @@
         {
           dynamic :stream = myStream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::Foo> :for-iterator = new asy::_StreamIterator::•<self::Foo>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::Foo*>* :for-iterator = new asy::_StreamIterator::•<self::Foo*>(:stream);
           try
             #L9:
             while (true) {
-              dynamic #t21 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t21 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t22 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::Foo #t23 = :for-iterator.{asy::_StreamIterator::current};
+                final self::Foo* #t23 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   z = #t23;
-                  core::String y = z as{TypeError} core::String;
+                  core::String* y = z as{TypeError} core::String*;
                 }
               }
               else
@@ -300,22 +294,21 @@
               :result;
             }
         }
-        asy::Stream<dynamic> stream = myStream;
+        asy::Stream<dynamic>* stream = myStream;
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L10:
             while (true) {
-              dynamic #t25 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t25 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t26 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t27 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  self::Foo x = #t27 as{TypeError} self::Foo;
-                  self::Foo y = x;
+                  self::Foo* x = #t27 as{TypeError} self::Foo*;
+                  self::Foo* y = x;
                 }
               }
               else
@@ -329,20 +322,19 @@
         }
         dynamic stream2 = myStream;
         {
-          dynamic :stream = stream2 as{TypeError} asy::Stream<dynamic>;
+          dynamic :stream = stream2 as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L11:
             while (true) {
-              dynamic #t29 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t29 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t30 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t31 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  self::Foo x = #t31 as{TypeError} self::Foo;
-                  self::Foo y = x;
+                  self::Foo* x = #t31 as{TypeError} self::Foo*;
+                  self::Foo* y = x;
                 }
               }
               else
@@ -354,26 +346,25 @@
               :result;
             }
         }
-        core::Map<core::String, self::Foo> map = <core::String, self::Foo>{};
+        core::Map<core::String*, self::Foo*>* map = <core::String*, self::Foo*>{};
         {
-          dynamic :stream = let final<BottomType> #t33 = invalid-expression "pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_each_loop_async.dart:66:74: Error: The type 'Map<String, Foo>' used in the 'for' loop must implement 'Stream<dynamic>'.
+          dynamic :stream = let final<BottomType> #t33 = 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>;
+  await for (var /*@ type=dynamic */ x in /*error:FOR_IN_OF_INVALID_TYPE*/ map) {
+                                                                           ^" in map as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L12:
             while (true) {
-              dynamic #t34 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t34 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t35 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 dynamic x = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::String y = x as{TypeError} core::String;
+                  core::String* y = x as{TypeError} core::String*;
                 }
               }
               else
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart
index bb7a6ca..963a6a0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart
@@ -6,7 +6,7 @@
 library test;
 
 test() {
-  for (var /*@type=int*/ i = 0; i /*@target=num::<*/ < 10; i++) {
+  for (var /*@ type=int* */ i = 0; i /*@target=num::<*/ < 10; i++) {
     int j = i /*@target=num::+*/ + 1;
   }
 }
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect
index 0445457..06fd21c0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 static method test() → dynamic {
   for (dynamic i = 0; i.<(10); i = i.+(1)) {
-    core::int j = i.+(1);
+    core::int* j = i.+(1);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect
index 0445457..06fd21c0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 static method test() → dynamic {
   for (dynamic i = 0; i.<(10); i = i.+(1)) {
-    core::int j = i.+(1);
+    core::int* j = i.+(1);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.expect
index e3d4755..2dd29d2 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
-    core::int j = i.{core::num::+}(1);
+  for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    core::int* j = i.{core::num::+}(1);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.transformed.expect
index e3d4755..2dd29d2 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic {
-  for (core::int i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
-    core::int j = i.{core::num::+}(1);
+  for (core::int* i = 0; i.{core::num::<}(10); i = i.{core::num::+}(1)) {
+    core::int* j = i.{core::num::+}(1);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
index ab77237..5e037d0 100644
--- a/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart:9:61: Context: Write to i@296
-  for (var /*@type=int*/ i = 0; i /*@target=num::<*/ < 10; i++) {
-                                                            ^^
+pkg/front_end/testcases/inference/infer_types_on_loop_indices_for_loop_with_inference.dart:9:64: Context: Write to i@299
+  for (var /*@ type=int* */ i = 0; i /*@target=num::<*/ < 10; i++) {
+                                                               ^^
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect
index e441e9c..3b69780 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.expect
@@ -4,8 +4,12 @@
 
 class Foo extends core::Object {
   field dynamic x = 1;
-  constructor •([dynamic x = "1"]) → self::Foo
+  constructor •([dynamic x = #C1]) → self::Foo*
     : self::Foo::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = "1"
+}
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect
index e441e9c..3b69780 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.legacy.transformed.expect
@@ -4,8 +4,12 @@
 
 class Foo extends core::Object {
   field dynamic x = 1;
-  constructor •([dynamic x = "1"]) → self::Foo
+  constructor •([dynamic x = #C1]) → self::Foo*
     : self::Foo::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = "1"
+}
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
index b340fe0..3edce78 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.expect
@@ -11,11 +11,11 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int x = 1;
-  constructor •([core::int x = let final<BottomType> #t1 = 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'.
+  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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
-                                             ^" in "1" as{TypeError} core::int]) → self::Foo
+                                             ^"]) → self::Foo*
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
index b340fe0..3edce78 100644
--- a/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_initializing_formal_checks_default_value.dart.strong.transformed.expect
@@ -11,11 +11,11 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int x = 1;
-  constructor •([core::int x = let final<BottomType> #t1 = 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'.
+  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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   Foo([this.x = /*error:INVALID_ASSIGNMENT*/ \"1\"]);
-                                             ^" in "1" as{TypeError} core::int]) → self::Foo
+                                             ^"]) → self::Foo*
     : self::Foo::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
index 760375f..a1b94d7 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart
@@ -7,9 +7,9 @@
 
 class C {
   static var x = 'x';
-  var y = /*@typeArgs=String, Map<String, String>*/ {
-    'a': /*@typeArgs=String, String*/ {'b': 'c'},
-    'd': /*@typeArgs=String, String*/ {'e': x}
+  var y = /*@ typeArgs=String*, Map<String*, String*>* */ {
+    'a': /*@ typeArgs=String*, String* */ {'b': 'c'},
+    'd': /*@ typeArgs=String*, String* */ {'e': x}
   };
 }
 
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect
index a06caa5..04dea03 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic x = "x";
   field dynamic y = <dynamic, dynamic>{"a": <dynamic, dynamic>{"b": "c"}, "d": <dynamic, dynamic>{"e": self::C::x}};
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect
index a06caa5..04dea03 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.legacy.transformed.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic x = "x";
   field dynamic y = <dynamic, dynamic>{"a": <dynamic, dynamic>{"b": "c"}, "d": <dynamic, dynamic>{"e": self::C::x}};
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.expect
index e18015e..9560f0e 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.expect
@@ -3,9 +3,9 @@
 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
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.transformed.expect
index e18015e..9560f0e 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_static_field_complex.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 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
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect
index dfdd9ae..64cc3a6 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = self::x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect
index dfdd9ae..64cc3a6 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = self::x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.expect
index d7234e9..909314e 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::String y = self::x;
-  synthetic constructor •() → self::C
+  field core::String* y = self::x;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::String x = "x";
+static field core::String* x = "x";
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.transformed.expect
index d7234e9..909314e 100644
--- a/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_nonstatic_field_depends_on_top_level_var_simple.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::String y = self::x;
-  synthetic constructor •() → self::C
+  field core::String* y = self::x;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::String x = "x";
+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 b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
index 5a4f2ee..dab289a 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart
@@ -6,5 +6,5 @@
 library test;
 
 main() {
-  var /*@type=() -> Null*/ f = /*@returnType=Null*/ () {};
+  var /*@ type=() ->* Null* */ f = /*@ returnType=Null* */ () {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
index 21dc5e1..12479df 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Null f = () → core::Null {};
+  () →* core::Null* f = () → core::Null* {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
index 21dc5e1..12479df 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return.dart.strong.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → core::Null f = () → core::Null {};
+  () →* core::Null* f = () → core::Null* {};
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
index 51cc0a9..713085c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart
@@ -10,5 +10,5 @@
 }
 
 main() {
-  var /*@type=C*/ c = new C(/*@returnType=Null*/ () {});
+  var /*@ type=C* */ c = new C(/*@ returnType=Null* */ () {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect
index c7f53ab..82cbdb0 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → self::C
+  constructor •(() →* void func) → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect
index c7f53ab..82cbdb0 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → self::C
+  constructor •(() →* void func) → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.outline.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.outline.expect
index 6b18a06..5de157e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → self::C
+  constructor •(() →* void func) → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
index df6208e..b33a922 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → self::C
+  constructor •(() →* void func) → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(() → core::Null {});
+  self::C* c = new self::C::•(() → core::Null* {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
index df6208e..b33a922 100644
--- a/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_block_closure_no_args_no_return_void_context.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → void func) → self::C
+  constructor •(() →* void func) → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(() → core::Null {});
+  self::C* c = new self::C::•(() → core::Null* {});
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect
index 36eee2f..ee57bb7 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.expect
@@ -3,9 +3,9 @@
 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
+  field core::int* a = null;
+  field core::List<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method m() → void {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect
index 36eee2f..ee57bb7 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.legacy.transformed.expect
@@ -3,9 +3,9 @@
 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
+  field core::int* a = null;
+  field core::List<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method m() → void {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
index 9d1f932..1ad3fde 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.expect
@@ -3,12 +3,12 @@
 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
+  field core::int* a = null;
+  field core::List<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method m() → void {}
 }
-static field self::A v = let final self::A #t1 = new self::A::•() in let final dynamic #t2 = #t1.{self::A::a} = 1 in let final dynamic #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final dynamic #t4 = #t1.{self::A::m}() in #t1;
+static field self::A* v = let final self::A* #t1 = new self::A::•() in let final dynamic #t2 = #t1.{self::A::a} = 1 in let final dynamic #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final dynamic #t4 = #t1.{self::A::m}() in #t1;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
index c1b56b7..551c402 100644
--- a/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_cascade.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 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
+  field core::int* a = null;
+  field core::List<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method m() → void {}
 }
-static field self::A v = let final self::A #t1 = new self::A::•() in let final core::int #t2 = #t1.{self::A::a} = 1 in let final void #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final void #t4 = #t1.{self::A::m}() in #t1;
+static field self::A* v = let final self::A* #t1 = new self::A::•() in let final core::int* #t2 = #t1.{self::A::a} = 1 in let final void #t3 = #t1.{self::A::b}.{core::List::add}(2) in let final void #t4 = #t1.{self::A::m}() in #t1;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect
index 96045ee..40a93ab 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic x = self::c.*(self::c);
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect
index 96045ee..40a93ab 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic x = self::c.*(self::c);
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.expect
index 09299a3..5640154 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
-static field core::bool x = self::c.{self::C::*}(self::c);
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::*}(self::c);
 static method main() → dynamic {
   self::c;
   self::x;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.transformed.expect
index 09299a3..5640154 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
-static field core::bool x = self::c.{self::C::*}(self::c);
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::*}(self::c);
 static method main() → dynamic {
   self::c;
   self::x;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect
index 3df7290..9648784 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic x = self::c.*(self::c);
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect
index 3df7290..9648784 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic x = self::c.*(self::c);
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.expect
index 02be490..ef7e2fb 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field core::bool x = self::c.{self::I::*}(self::c);
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::*}(self::c);
 static method main() → dynamic {
   self::c;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.transformed.expect
index 02be490..ef7e2fb 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_binary_op_via_interface.dart.strong.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator *(self::C other) → core::bool
+  operator *(self::C* other) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field core::bool x = self::c.{self::I::*}(self::c);
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::*}(self::c);
 static method main() → dynamic {
   self::c;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart
index aafd040..6e3f1c4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart
@@ -11,5 +11,5 @@
 
 main() {
   C c = new C();
-  var /*@type=bool*/ x = c /*@target=C::[]*/ [0];
+  var /*@ type=bool* */ x = c /*@target=C::[]*/ [0];
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect
index 146868d..441c2d0 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   dynamic x = c.[](0);
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect
index 146868d..441c2d0 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   dynamic x = c.[](0);
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.expect
index 4cc5bda..ac50c97 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  core::bool x = c.{self::C::[]}(0);
+  self::C* c = new self::C::•();
+  core::bool* x = c.{self::C::[]}(0);
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.transformed.expect
index 4cc5bda..ac50c97 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  core::bool x = c.{self::C::[]}(0);
+  self::C* c = new self::C::•();
+  core::bool* x = c.{self::C::[]}(0);
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart
index 3ca4ef8..5d66da6 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart
@@ -13,7 +13,7 @@
 
 f() {
   C c;
-  var /*@type=bool*/ x = c /*@target=I::[]*/ [0];
+  var /*@ type=bool* */ x = c /*@target=I::[]*/ [0];
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect
index 0222121..98cc552 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method f() → dynamic {
-  self::C c;
+  self::C* c;
   dynamic x = c.[](0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect
index 0222121..98cc552 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.legacy.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method f() → dynamic {
-  self::C c;
+  self::C* c;
   dynamic x = c.[](0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.expect
index d4e9d6b..7ab0f9c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method f() → dynamic {
-  self::C c;
-  core::bool x = c.{self::I::[]}(0);
+  self::C* c;
+  core::bool* x = c.{self::I::[]}(0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.transformed.expect
index d4e9d6b..7ab0f9c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_index_op_via_interface.dart.strong.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator [](core::int index) → core::bool
+  operator [](core::int* index) → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method f() → dynamic {
-  self::C c;
-  core::bool x = c.{self::I::[]}(0);
+  self::C* c;
+  core::bool* x = c.{self::I::[]}(0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect
index b269056..8c0ca7b 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic x = self::c.unary-();
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect
index b269056..8c0ca7b 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic x = self::c.unary-();
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.expect
index 2a6dd0b..efb02c9 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
-static field core::bool x = self::c.{self::C::unary-}();
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::unary-}();
 static method main() → dynamic {
   self::c;
   self::x;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.transformed.expect
index 2a6dd0b..efb02c9 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
-static field self::C c = new self::C::•();
-static field core::bool x = self::c.{self::C::unary-}();
+static field self::C* c = new self::C::•();
+static field core::bool* x = self::c.{self::C::unary-}();
 static method main() → dynamic {
   self::c;
   self::x;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect
index 2215c66..cc0b9be 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic x = self::c.unary-();
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect
index 2215c66..cc0b9be 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic x = self::c.unary-();
 static method main() → dynamic {
   self::c;
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.expect
index 613588e..5c3dd4f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field core::bool x = self::c.{self::I::unary-}();
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::unary-}();
 static method main() → dynamic {
   self::c;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.transformed.expect
index 613588e..5c3dd4f 100644
--- a/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_custom_unary_op_via_interface.dart.strong.transformed.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  operator unary-() → core::bool
+  operator unary-() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field core::bool x = self::c.{self::I::unary-}();
+static field self::C* c;
+static field core::bool* x = self::c.{self::I::unary-}();
 static method main() → dynamic {
   self::c;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect
index dfdf7a3..84a51f4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 static field dynamic x = self::f().g;
-static method f() → self::C
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.transformed.expect
index dfdf7a3..84a51f4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 static field dynamic x = self::f().g;
-static method f() → self::C
+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.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.expect
index e7b3ed6..5f49749 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
-static field () → core::bool x = self::f().{self::C::g};
-static method f() → self::C
+static field () →* core::bool* x = self::f().{self::C::g};
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.transformed.expect
index e7b3ed6..5f49749 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
-static field () → core::bool x = self::f().{self::C::g};
-static method f() → self::C
+static field () →* core::bool* x = self::f().{self::C::g};
+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.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.expect
index 9ed9652..ffe981e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static field dynamic x = self::f().g;
-static method f() → self::C
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.transformed.expect
index 9ed9652..ffe981e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static field dynamic x = self::f().g;
-static method f() → self::C
+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.strong.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.expect
index 3c19b4c..05ac91e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field () → core::bool x = self::f().{self::I::g};
-static method f() → self::C
+static field () →* core::bool* x = self::f().{self::I::g};
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.transformed.expect
index 3c19b4c..05ac91e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_extract_method_tear_off_via_interface.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field () → core::bool x = self::f().{self::I::g};
-static method f() → self::C
+static field () →* core::bool* x = self::f().{self::I::g};
+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.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.expect
index 89c2a99..5dc20b4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = core::print;
+static field dynamic v = #C1;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff core::print
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect
index 89c2a99..5dc20b4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.legacy.transformed.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = core::print;
+static field dynamic v = #C1;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff core::print
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.expect
index 97300eb..b95e93b 100644
--- a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field (core::Object) → void v = core::print;
+static field (core::Object*) →* void v = #C1;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff core::print
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.transformed.expect
index 97300eb..b95e93b 100644
--- a/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_from_top_level_executable_tear_off.dart.strong.transformed.expect
@@ -2,7 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field (core::Object) → void v = core::print;
+static field (core::Object*) →* void v = #C1;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff core::print
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect
index 2966442..2bc2b99 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 static field dynamic x = self::f().g();
-static method f() → self::C
+static method f() → self::C*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect
index 2966442..2bc2b99 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 static field dynamic x = self::f().g();
-static method f() → self::C
+static method f() → self::C*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.expect
index 8d26a6d..3326401 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
-static field core::bool x = self::f().{self::C::g}();
-static method f() → self::C
+static field core::bool* x = self::f().{self::C::g}();
+static method f() → self::C*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.transformed.expect
index 8d26a6d..3326401 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
-static field core::bool x = self::f().{self::C::g}();
-static method f() → self::C
+static field core::bool* x = self::f().{self::C::g}();
+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.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.expect
index b45af60..f5db8e5 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static field dynamic x = self::f().g();
-static method f() → self::C
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.transformed.expect
index b45af60..f5db8e5 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static field dynamic x = self::f().g();
-static method f() → self::C
+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.strong.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.expect
index a0ada8f..ef25ea2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::bool x = self::f().{self::I::g}();
-static method f() → self::C
+static field core::bool* x = self::f().{self::I::g}();
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.transformed.expect
index a0ada8f..ef25ea2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_invoke_method_via_interface.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method g() → core::bool
+  method g() → core::bool*
     return true;
 }
 abstract class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::bool x = self::f().{self::I::g}();
-static method f() → self::C
+static field core::bool* x = self::f().{self::I::g}();
+static method f() → self::C*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect
index f91ac8f..900b983 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field dynamic x = self::E::v1;
+static final field dynamic x = #C3;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect
index f91ac8f..900b983 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.legacy.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field dynamic x = self::E::v1;
+static final field dynamic x = #C3;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.expect
index 290276b..54268ce 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field self::E x = self::E::v1;
+static final field self::E* x = #C3;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.transformed.expect
index 290276b..54268ce 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum.dart.strong.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field self::E x = self::E::v1;
+static final field self::E* x = #C3;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect
index 33f8ee3..0661f2d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field dynamic x = self::E::values;
+static final field dynamic x = #C4;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect
index 33f8ee3..0661f2d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.legacy.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field dynamic x = self::E::values;
+static final field dynamic x = #C4;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.expect
index c8a8092..8286aa9 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field core::List<self::E> x = self::E::values;
+static final field core::List<self::E*>* x = #C4;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.transformed.expect
index c8a8092..8286aa9 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_enum_values.dart.strong.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::v1];
-  static const field self::E v1 = const self::E::•(0, "E.v1");
-  const constructor •(core::int index, core::String _name) → self::E
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::E::index = index, self::E::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::E::_name};
 }
-static final field core::List<self::E> x = self::E::values;
+static final field core::List<self::E*>* x = #C4;
 static method main() → dynamic {
   self::x;
 }
+
+constants  {
+  #C1 = 0
+  #C2 = "E.v1"
+  #C3 = self::E {index:#C1, _name:#C2}
+  #C4 = <self::E*>[#C3]
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect
index b46ce39..07ed233 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field dynamic x = <core::String, () → void>{};
+typedef F = () →* void;
+static final field dynamic x = <core::String*, () →* void>{};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect
index b46ce39..07ed233 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field dynamic x = <core::String, () → void>{};
+typedef F = () →* void;
+static final field dynamic x = <core::String*, () →* void>{};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.expect
index 1e61b1d..2f74b63 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field core::Map<core::String, () → void> x = <core::String, () → void>{};
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.transformed.expect
index 1e61b1d..2f74b63 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field core::Map<core::String, () → void> x = <core::String, () → void>{};
+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.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.expect
index b9fa6d2..6ae1be2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
-static final field dynamic x = <core::String, () → core::int>{};
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+static final field dynamic x = <core::String*, () →* core::int*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect
index b9fa6d2..6ae1be2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = () → T;
-static final field dynamic x = <core::String, () → core::int>{};
+typedef F<T extends core::Object* = dynamic> = () →* T*;
+static final field dynamic x = <core::String*, () →* core::int*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
index 40eb28c..24aba57 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.expect
@@ -2,6 +2,6 @@
 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>{};
+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_is_typedef_parameterized.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
index 40eb28c..24aba57 100644
--- a/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_is_typedef_parameterized.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 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>{};
+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 b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
index 2cc5ff7..4ae7a71 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart
@@ -7,7 +7,7 @@
 
 int f() => null;
 String g() => null;
-var v = /*@typeArgs=() -> Object*/ [f, g];
+var v = /*@ typeArgs=() ->* Object* */ [f, g];
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect
index dd8b091..bb0516c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f() → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f() → core::int*
   return null;
-static method g() → core::String
+static method g() → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect
index dd8b091..bb0516c 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.legacy.transformed.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f() → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f() → core::int*
   return null;
-static method g() → core::String
+static method g() → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.expect
index 55d503c..5fbc81e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<() → core::Object> v = <() → core::Object>[self::f, self::g];
-static method f() → core::int
+static field core::List<() →* core::Object*>* v = <() →* core::Object*>[#C1, #C2];
+static method f() → core::int*
   return null;
-static method g() → core::String
+static method g() → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.transformed.expect
index 55d503c..5fbc81e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type.dart.strong.transformed.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<() → core::Object> v = <() → core::Object>[self::f, self::g];
-static method f() → core::int
+static field core::List<() →* core::Object*>* v = <() →* core::Object*>[#C1, #C2];
+static method f() → core::int*
   return null;
-static method g() → core::String
+static method g() → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
index dadf60b..ad8147d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart
@@ -7,7 +7,7 @@
 
 int f(int x(String y)) => null;
 String g(int x(String y)) => null;
-var v = /*@typeArgs=((String) -> int) -> Object*/ [f, g];
+var v = /*@ typeArgs=((String*) ->* int*) ->* Object* */ [f, g];
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect
index f4c89c0..a564b72 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f((core::String) → core::int x) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f((core::String*) →* core::int* x) → core::int*
   return null;
-static method g((core::String) → core::int x) → core::String
+static method g((core::String*) →* core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect
index f4c89c0..a564b72 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.legacy.transformed.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f((core::String) → core::int x) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f((core::String*) →* core::int* x) → core::int*
   return null;
-static method g((core::String) → core::int x) → core::String
+static method g((core::String*) →* core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.expect
index 0472a60..5db9025 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.expect
@@ -2,11 +2,16 @@
 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>[self::f, self::g];
-static method f((core::String) → core::int x) → core::int
+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
+static method g((core::String*) →* core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.transformed.expect
index 0472a60..5db9025 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_function_typed_param.dart.strong.transformed.expect
@@ -2,11 +2,16 @@
 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>[self::f, self::g];
-static method f((core::String) → core::int x) → core::int
+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
+static method g((core::String*) →* core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
index d922665..8fdab05 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart
@@ -7,7 +7,7 @@
 
 int f({int x}) => null;
 String g({int x}) => null;
-var v = /*@typeArgs=({x: int}) -> Object*/ [f, g];
+var v = /*@ typeArgs=({x: int*}) ->* Object* */ [f, g];
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect
index db32f32..226714e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f({core::int x = null}) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f({core::int* x = #C3}) → core::int*
   return null;
-static method g({core::int x = null}) → core::String
+static method g({core::int* x = #C3}) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect
index db32f32..226714e 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.legacy.transformed.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f({core::int x = null}) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f({core::int* x = #C3}) → core::int*
   return null;
-static method g({core::int x = null}) → core::String
+static method g({core::int* x = #C3}) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.expect
index 301d19a..7d05c01 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<({x: core::int}) → core::Object> v = <({x: core::int}) → core::Object>[self::f, self::g];
-static method f({core::int x = null}) → core::int
+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 = null}) → core::String
+static method g({core::int* x = #C3}) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.transformed.expect
index 301d19a..7d05c01 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_named_param.dart.strong.transformed.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<({x: core::int}) → core::Object> v = <({x: core::int}) → core::Object>[self::f, self::g];
-static method f({core::int x = null}) → core::int
+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 = null}) → core::String
+static method g({core::int* x = #C3}) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
index 1307233..05020d2 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart
@@ -7,7 +7,7 @@
 
 int f([int x]) => null;
 String g([int x]) => null;
-var v = /*@typeArgs=([int]) -> Object*/ [f, g];
+var v = /*@ typeArgs=([int*]) ->* Object* */ [f, g];
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect
index aaa6d2b..51aa529 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f([core::int x = null]) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f([core::int* x = #C3]) → core::int*
   return null;
-static method g([core::int x = null]) → core::String
+static method g([core::int* x = #C3]) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect
index aaa6d2b..51aa529 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.legacy.transformed.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f([core::int x = null]) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f([core::int* x = #C3]) → core::int*
   return null;
-static method g([core::int x = null]) → core::String
+static method g([core::int* x = #C3]) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.expect
index 8198998..2eb4e4d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<([core::int]) → core::Object> v = <([core::int]) → core::Object>[self::f, self::g];
-static method f([core::int x = null]) → core::int
+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 = null]) → core::String
+static method g([core::int* x = #C3]) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.transformed.expect
index 8198998..2eb4e4d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_positional_param.dart.strong.transformed.expect
@@ -2,11 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<([core::int]) → core::Object> v = <([core::int]) → core::Object>[self::f, self::g];
-static method f([core::int x = null]) → core::int
+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 = null]) → core::String
+static method g([core::int* x = #C3]) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
index 926a0d3..6da4ad2d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart
@@ -7,7 +7,7 @@
 
 int f(int x) => null;
 String g(int x) => null;
-var v = /*@typeArgs=(int) -> Object*/ [f, g];
+var v = /*@ typeArgs=(int*) ->* Object* */ [f, g];
 
 main() {
   v;
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect
index 336cbf6..e6fb1b4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f(core::int x) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f(core::int* x) → core::int*
   return null;
-static method g(core::int x) → core::String
+static method g(core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect
index 336cbf6..e6fb1b4 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.legacy.transformed.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = <dynamic>[self::f, self::g];
-static method f(core::int x) → core::int
+static field dynamic v = <dynamic>[#C1, #C2];
+static method f(core::int* x) → core::int*
   return null;
-static method g(core::int x) → core::String
+static method g(core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.expect
index 8e9941b..5a739ef 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<(core::int) → core::Object> v = <(core::int) → core::Object>[self::f, self::g];
-static method f(core::int x) → core::int
+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
+static method g(core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.transformed.expect
index 8e9941b..5a739ef 100644
--- a/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_uses_synthetic_function_type_required_param.dart.strong.transformed.expect
@@ -2,11 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<(core::int) → core::Object> v = <(core::int) → core::Object>[self::f, self::g];
-static method f(core::int x) → core::int
+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
+static method g(core::int* x) → core::String*
   return null;
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::g
+}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
index 11972a9..0151665 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart
@@ -6,8 +6,8 @@
 library test;
 
 class C {
-  static final f = /*@returnType=(int) -> Map<int, bool>*/ (bool
-      b) => /*@returnType=Map<int, bool>*/ (int i) => /*@typeArgs=int, bool*/ {i: b};
+  static final f = /*@ returnType=(int*) ->* Map<int*, bool*>* */ (bool
+      b) => /*@ returnType=Map<int*, bool*>* */ (int i) => /*@ typeArgs=int*, bool* */ {i: b};
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect
index be8f7a1..17fd178 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => (core::int i) → dynamic => <dynamic, dynamic>{i: b};
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => (core::int* i) → dynamic => <dynamic, dynamic>{i: b};
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect
index be8f7a1..17fd178 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => (core::int i) → dynamic => <dynamic, dynamic>{i: b};
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => (core::int* i) → dynamic => <dynamic, dynamic>{i: b};
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.expect
index 6162611..f1e5153 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.expect
@@ -3,8 +3,8 @@
 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
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.transformed.expect
index 6162611..f1e5153 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_multiple_levels_of_nesting.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 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
+  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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
index 76efa44..33bd87d 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  static final f = /*@returnType=bool*/ (bool b) => b;
+  static final f = /*@ returnType=bool* */ (bool b) => b;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect
index 4898b62..32f5ef7 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => b;
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => b;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect
index 4898b62..32f5ef7 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => b;
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => b;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.expect
index 434644d..f5dad69 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.expect
@@ -3,8 +3,8 @@
 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
+  static final field (core::bool*) →* core::bool* f = (core::bool* b) → core::bool* => b;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.transformed.expect
index 434644d..f5dad69 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_depends_on_args.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 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
+  static final field (core::bool*) →* core::bool* f = (core::bool* b) → core::bool* => b;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
index 08e3315..2351770 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C {
-  static final f = /*@returnType=int*/ (bool b) => 1;
+  static final f = /*@ returnType=int* */ (bool b) => 1;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect
index 711976d..dde9841 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => 1;
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => 1;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect
index 711976d..dde9841 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static final field dynamic f = (core::bool b) → dynamic => 1;
-  synthetic constructor •() → self::C
+  static final field dynamic f = (core::bool* b) → dynamic => 1;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.expect
index 469e2ac..4596fad 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.expect
@@ -3,8 +3,8 @@
 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
+  static final field (core::bool*) →* core::int* f = (core::bool* b) → core::int* => 1;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.transformed.expect
index 469e2ac..4596fad 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_field.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 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
+  static final field (core::bool*) →* core::int* f = (core::bool* b) → core::int* => 1;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
index 1030f5b..f094651 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-final f = /*@returnType=int*/ (bool b) => 1;
+final f = /*@ returnType=int* */ (bool b) => 1;
 
 main() {
   f;
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect
index bac7b39..46b6aaa 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field dynamic f = (core::bool b) → dynamic => 1;
+static final field dynamic f = (core::bool* b) → dynamic => 1;
 static method main() → dynamic {
   self::f;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect
index bac7b39..46b6aaa 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field dynamic f = (core::bool b) → dynamic => 1;
+static final field dynamic f = (core::bool* b) → dynamic => 1;
 static method main() → dynamic {
   self::f;
 }
diff --git a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.expect
index a28ca70..ac18ccc 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field (core::bool) → core::int f = (core::bool b) → core::int => 1;
+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/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.transformed.expect
index a28ca70..ac18ccc 100644
--- a/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inferred_type_via_closure_type_independent_of_args_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static final field (core::bool) → core::int f = (core::bool b) → core::int => 1;
+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.legacy.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.expect
index d095776..85fcbe3 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.expect
@@ -4,21 +4,21 @@
 
 class I1 extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static field dynamic y = new self::C::•().x;
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect
index d095776..85fcbe3 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.legacy.transformed.expect
@@ -4,21 +4,21 @@
 
 class I1 extends core::Object {
   final field dynamic x = self::y;
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
 static field dynamic y = new self::C::•().x;
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
index 463eb9d..3a1211f 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.outline.expect
@@ -4,18 +4,18 @@
 
 class I1 extends core::Object {
   final field dynamic x;
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
 }
 static field dynamic y;
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.expect
index b9af143..e00b94d 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  final field core::int x = self::y;
-  synthetic constructor •() → self::I1
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
-static field core::int y = new self::C::•().{self::C::x};
+static field core::int* y = new self::C::•().{self::C::x};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.transformed.expect
index b9af143..e00b94d 100644
--- a/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/inheritance_does_not_imply_circularity.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class I1 extends core::Object {
-  final field core::int x = self::y;
-  synthetic constructor •() → self::I1
+  final field core::int* x = self::y;
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
 }
-static field core::int y = new self::C::•().{self::C::x};
+static field core::int* y = new self::C::•().{self::C::x};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart b/pkg/front_end/testcases/inference/instance_creation_downwards.dart
index f066948..ba14d77 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart
@@ -12,6 +12,6 @@
 class B<T> {}
 
 main() {
-  var /*@type=A<dynamic>*/ x =
-      new /*@typeArgs=dynamic*/ A(new /*@typeArgs=List<dynamic>*/ B());
+  var /*@ type=A<dynamic>* */ x =
+      new /*@ typeArgs=dynamic */ A(new /*@ typeArgs=List<dynamic>* */ B());
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect
index 61f6a8c..b350db3 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.expect
@@ -2,13 +2,13 @@
 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>
+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::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect
index 61f6a8c..b350db3 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 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>
+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::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
index f7a2720..de9b6b5 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.outline.expect
@@ -2,12 +2,12 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B<core::List<self::A::T*>*>* b) → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
index 80c04a5..d0f7b9e 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.expect
@@ -2,16 +2,16 @@
 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>
+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::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<dynamic> x = new self::A::•<dynamic>(new self::B::•<core::List<dynamic>>());
+  self::A<dynamic>* x = new self::A::•<dynamic>(new self::B::•<core::List<dynamic>*>());
 }
diff --git a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
index 80c04a5..d0f7b9e 100644
--- a/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instance_creation_downwards.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 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>
+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::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<dynamic> x = new self::A::•<dynamic>(new self::B::•<core::List<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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.expect
index d407e0c..7f9dca8 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.expect
@@ -3,32 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
+  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
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method test() → void {
-    (core::int) → core::int func;
+    (core::int*) →* core::int* func;
     func = super.{self::C::f};
   }
 }
-static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
+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
+  function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
-  (core::int) → core::int func;
-  func = self::f;
+  (core::int*) →* core::int* func;
+  func = #C1;
   func = new self::C::•().f;
-  func = self::C::g;
+  func = #C2;
   func = h;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::C::g
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect
index d407e0c..7f9dca8 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.legacy.transformed.expect
@@ -3,32 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
+  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
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method test() → void {
-    (core::int) → core::int func;
+    (core::int*) →* core::int* func;
     func = super.{self::C::f};
   }
 }
-static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
+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
+  function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
-  (core::int) → core::int func;
-  func = self::f;
+  (core::int*) →* core::int* func;
+  func = #C1;
   func = new self::C::•().f;
-  func = self::C::g;
+  func = #C2;
   func = h;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::C::g
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
index 117d4e6..656e375 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
+  method f<T extends core::Object* = dynamic>(self::C::f::T* x) → self::C::f::T*
     ;
-  static method g<T extends core::Object = dynamic>(self::C::g::T x) → self::C::g::T
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>(self::f::T x) → self::f::T
+static method f<T extends core::Object* = dynamic>(self::f::T* x) → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
index 16af23e..44ea980 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.expect
@@ -3,32 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
+  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
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method test() → void {
-    (core::int) → core::int func;
-    func = super.{self::C::f}<core::int>;
+    (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
+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
+  function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
-  (core::int) → core::int func;
-  func = self::f<core::int>;
-  func = new self::C::•().{self::C::f}<core::int>;
-  func = self::C::g<core::int>;
-  func = h<core::int>;
+  (core::int*) →* core::int* func;
+  func = #C1<core::int*>;
+  func = new self::C::•().{self::C::f}<core::int*>;
+  func = #C2<core::int*>;
+  func = h<core::int*>;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::C::g
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
index 16af23e..44ea980 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff.dart.strong.transformed.expect
@@ -3,32 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::C::f::T x) → self::C::f::T
+  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
+  static method g<T extends core::Object* = dynamic>(self::C::g::T* x) → self::C::g::T*
     return x;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method test() → void {
-    (core::int) → core::int func;
-    func = super.{self::C::f}<core::int>;
+    (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
+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
+  function h<T extends core::Object* = dynamic>(T* x) → T*
     return x;
-  (core::int) → core::int func;
-  func = self::f<core::int>;
-  func = new self::C::•().{self::C::f}<core::int>;
-  func = self::C::g<core::int>;
-  func = h<core::int>;
+  (core::int*) →* core::int* func;
+  func = #C1<core::int*>;
+  func = new self::C::•().{self::C::f}<core::int*>;
+  func = #C2<core::int*>;
+  func = h<core::int*>;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+  #C2 = tearoff self::C::g
+}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
index d272786..afc7289 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart
@@ -6,7 +6,7 @@
 library test;
 
 class C<T> {
-  void Function(T) f<U>(U x) => /*@returnType=Null*/ (/*@type=C::T*/ y) {};
+  void Function(T) f<U>(U x) => /*@ returnType=Null* */ (/*@ type=C::T* */ y) {};
 }
 
 void test(C<String> c) {
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect
index b968cb9..39c01c6 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.expect
@@ -2,14 +2,14 @@
 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>
+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
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
     return (dynamic y) → dynamic {};
 }
-static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.f;
+static method test(self::C<core::String*>* c) → void {
+  (core::int*) →* (core::String*) →* void tearoff = c.f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect
index b968cb9..39c01c6 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 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>
+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
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
     return (dynamic y) → dynamic {};
 }
-static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.f;
+static method test(self::C<core::String*>* c) → void {
+  (core::int*) →* (core::String*) →* void tearoff = c.f;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
index ce9dfe1..d44736b 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.outline.expect
@@ -2,13 +2,13 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<U extends core::Object = dynamic>(self::C::f::U x) → (self::C::T) → void
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
     ;
 }
-static method test(self::C<core::String> c) → void
+static method test(self::C<core::String*>* c) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
index 7f6f096..cc6f9e2 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.expect
@@ -2,14 +2,14 @@
 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>
+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) → core::Null {};
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
+    return (self::C::T* y) → core::Null* {};
 }
-static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object = dynamic>(U) → (core::String) → void<core::int>;
+static method test(self::C<core::String*>* c) → void {
+  (core::int*) →* (core::String*) →* void tearoff = c.{self::C::f} as{TypeError} <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_after_contravariance_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
index 7f6f096..cc6f9e2 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_after_contravariance_check.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 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>
+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) → core::Null {};
+  method f<U extends core::Object* = dynamic>(self::C::f::U* x) → (self::C::T*) →* void
+    return (self::C::T* y) → core::Null* {};
 }
-static method test(self::C<core::String> c) → void {
-  (core::int) → (core::String) → void tearoff = c.{self::C::f} as{TypeError} <U extends core::Object = dynamic>(U) → (core::String) → void<core::int>;
+static method test(self::C<core::String*>* c) → void {
+  (core::int*) →* (core::String*) →* void tearoff = c.{self::C::f} as{TypeError} <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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.expect
index 59e7aab..eae3186 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.expect
@@ -2,8 +2,8 @@
 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;
+static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void {
+  (core::int*) →* core::int* func;
   func = f.call;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect
index 59e7aab..eae3186 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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;
+static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void {
+  (core::int*) →* core::int* func;
   func = f.call;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
index 30f8885..e25300d 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(<T extends core::Object = dynamic>(T) → T f) → void
+static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
index 68e9b92..26a93d8 100644
--- a/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_tearoff_of_call.dart.strong.expect
@@ -10,11 +10,11 @@
 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;
+static method test(<T extends core::Object* = dynamic>(T*) →* T* f) → void {
+  (core::int*) →* core::int* func;
   func = let final<BottomType> #t1 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
   func = f.call;
-           ^" in f.call as{TypeError} (core::int) → core::int;
+           ^" 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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.expect
index b55b370..ef3f334 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect
index b55b370..ef3f334 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
index aa9510c..e09cbd1 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<core::int>> v = null;
+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_after.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
index aa9510c..e09cbd1 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_after.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<core::int>> v = null;
+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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.expect
index c01d4ae..95b4fa5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* 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.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.transformed.expect
index c01d4ae..95b4fa5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* 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.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
index 112ffea..094a36d 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<core::int>> v = null;
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
index 112ffea..094a36d 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_has_bound_defined_before.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::int> = self::A<core::int>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::int*>* = self::A<core::int*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<core::int>> v = null;
+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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.expect
index cbbb55c..6516b0a 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.expect
@@ -2,17 +2,17 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect
index cbbb55c..6516b0a 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
index 9272b7b..37a2d2c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.expect
@@ -2,17 +2,17 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<dynamic>> v = null;
+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_generic2_no_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
index 9272b7b..37a2d2c 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic2_no_bound.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A<dynamic>> v = null;
+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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.expect
index d772694..f1ad536 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field 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.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.transformed.expect
index d772694..f1ad536 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field 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.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
index 82c885b..0df6200 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<core::int> v = null;
+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_after.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
index 82c885b..0df6200 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_after.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<core::int> v = null;
+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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.expect
index d772694..f1ad536 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field 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_before.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.transformed.expect
index d772694..f1ad536 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> v = null;
+static field 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_before.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
index 82c885b..0df6200 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<core::int> v = null;
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
index 82c885b..0df6200 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_generic_has_bound_defined_before.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::int = core::int> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::int* = core::int*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<core::int> v = null;
+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 b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart
index 05e0abd..d7830b1 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart
@@ -8,5 +8,5 @@
 class C<T> {}
 
 main() {
-  var /*@type=C<dynamic>*/ v = new /*@typeArgs=dynamic*/ C();
+  var /*@ type=C<dynamic>* */ v = new /*@ typeArgs=dynamic */ C();
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect
index 1d5a60e..ce1d2dc 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect
index 1d5a60e..ce1d2dc 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
index dd20b0e..69e37b3 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.expect
@@ -2,11 +2,11 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<dynamic> v = new self::C::•<dynamic>();
+  self::C<dynamic>* v = new self::C::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
index dd20b0e..69e37b3 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_no_bound.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<dynamic> v = new self::C::•<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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.expect
index accd766..5bfb7b5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic x = new self::C::•<core::int>();
+static field dynamic x = new self::C::•<core::int*>();
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect
index accd766..5bfb7b5 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic x = new self::C::•<core::int>();
+static field dynamic x = new self::C::•<core::int*>();
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
index 27f7bc8..2b5cf0e 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::int> x = new self::C::•<core::int>();
+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_invoke_constructor_type_args_exact.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
index 27f7bc8..2b5cf0e 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_invoke_constructor_type_args_exact.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::int> x = new self::C::•<core::int>();
+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.legacy.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.expect
index 96f852d..8700358 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect
index 96f852d..8700358 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> v = null;
+static field self::B<dynamic>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
index 852e3da..0b00114 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A> v = null;
+static field self::B<self::A*>* v = null;
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
index 852e3da..0b00114 100644
--- a/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/instantiate_to_bounds_not_generic.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A = self::A> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A* = self::A*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field self::B<self::A> v = null;
+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 b/pkg/front_end/testcases/inference/int_upwards_local.dart
index d4e7729..1fe9288 100644
--- a/pkg/front_end/testcases/inference/int_upwards_local.dart
+++ b/pkg/front_end/testcases/inference/int_upwards_local.dart
@@ -6,5 +6,5 @@
 library test;
 
 main() {
-  var /*@type=int*/ x = 1;
+  var /*@ type=int* */ x = 1;
 }
diff --git a/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.expect b/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.expect
index c1c47e6..bdd406c 100644
--- a/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x = 1;
+  core::int* x = 1;
 }
diff --git a/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.transformed.expect
index c1c47e6..bdd406c 100644
--- a/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/int_upwards_local.dart.strong.transformed.expect
@@ -3,5 +3,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x = 1;
+  core::int* x = 1;
 }
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart
index 6e3ee16..75c6ee2 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart
@@ -9,19 +9,19 @@
 
 void foo() {
   List myList = getListOfString();
-  myList. /*@typeArgs=int*/ /*@target=Iterable::map*/ map(
-      /*@returnType=int*/ (/*@type=dynamic*/ type) => 42);
+  myList. /*@ typeArgs=int* */ /*@target=Iterable::map*/ map(
+      /*@ returnType=int* */ (/*@ type=dynamic */ type) => 42);
 }
 
 void bar() {
-  var /*@type=dynamic*/ list;
+  var /*@ type=dynamic */ list;
   try {
     list = <String>[];
   } catch (_) {
     return;
   }
   /*info:DYNAMIC_INVOKE*/ list.map(
-      /*@returnType=String*/ (/*@type=dynamic*/ value) => '${value}');
+      /*@ returnType=String* */ (/*@ type=dynamic */ value) => '${value}');
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect
index 6462bb8..0e461c5 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static method getListOfString() → core::List<core::String>
-  return const <core::String>[];
+static method getListOfString() → core::List<core::String*>*
+  return #C1;
 static method foo() → void {
-  core::List<dynamic> myList = self::getListOfString();
+  core::List<dynamic>* myList = self::getListOfString();
   myList.map((dynamic type) → dynamic => 42);
 }
 static method bar() → void {
   dynamic list;
   try {
-    list = <core::String>[];
+    list = <core::String*>[];
   }
   on dynamic catch(final dynamic _) {
     return;
@@ -19,3 +19,7 @@
   list.map((dynamic value) → dynamic => "${value}");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect
index 6462bb8..0e461c5 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-static method getListOfString() → core::List<core::String>
-  return const <core::String>[];
+static method getListOfString() → core::List<core::String*>*
+  return #C1;
 static method foo() → void {
-  core::List<dynamic> myList = self::getListOfString();
+  core::List<dynamic>* myList = self::getListOfString();
   myList.map((dynamic type) → dynamic => 42);
 }
 static method bar() → void {
   dynamic list;
   try {
-    list = <core::String>[];
+    list = <core::String*>[];
   }
   on dynamic catch(final dynamic _) {
     return;
@@ -19,3 +19,7 @@
   list.map((dynamic value) → dynamic => "${value}");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.expect
index 1821742..f378eb9 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.expect
@@ -2,20 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-static method getListOfString() → core::List<core::String>
-  return const <core::String>[];
+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);
+  core::List<dynamic>* myList = self::getListOfString();
+  myList.{core::Iterable::map}<core::int*>((dynamic type) → core::int* => 42);
 }
 static method bar() → void {
   dynamic list;
   try {
-    list = <core::String>[];
+    list = <core::String*>[];
   }
   on dynamic catch(final dynamic _) {
     return;
   }
-  list.map((dynamic value) → core::String => "${value}");
+  list.map((dynamic value) → core::String* => "${value}");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.transformed.expect
index 1821742..f378eb9 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.strong.transformed.expect
@@ -2,20 +2,24 @@
 import self as self;
 import "dart:core" as core;
 
-static method getListOfString() → core::List<core::String>
-  return const <core::String>[];
+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);
+  core::List<dynamic>* myList = self::getListOfString();
+  myList.{core::Iterable::map}<core::int*>((dynamic type) → core::int* => 42);
 }
 static method bar() → void {
   dynamic list;
   try {
-    list = <core::String>[];
+    list = <core::String*>[];
   }
   on dynamic catch(final dynamic _) {
     return;
   }
-  list.map((dynamic value) → core::String => "${value}");
+  list.map((dynamic value) → core::String* => "${value}");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = <core::String*>[]
+}
diff --git a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
index 10fcaec..82fc53b 100644
--- a/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart.type_promotion.expect
@@ -1,3 +1,3 @@
-pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart:19:10: Context: Write to list@521
+pkg/front_end/testcases/inference/lambda_does_not_have_propagated_type_hint.dart:19:10: Context: Write to list@531
     list = <String>[];
          ^
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart b/pkg/front_end/testcases/inference/lambda_return_type.dart
index 020059b..929de7a 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart
@@ -10,12 +10,12 @@
 test() {
   int i = 1;
   Object o = 1;
-  FunctionReturningNum a = /*@returnType=int*/ () => i;
-  FunctionReturningNum b = /*@returnType=num*/ () => o;
-  FunctionReturningNum c = /*@returnType=int*/ () {
+  FunctionReturningNum a = /*@ returnType=int* */ () => i;
+  FunctionReturningNum b = /*@ returnType=num* */ () => o;
+  FunctionReturningNum c = /*@ returnType=int* */ () {
     return i;
   };
-  FunctionReturningNum d = /*@returnType=num*/ () {
+  FunctionReturningNum d = /*@ returnType=num* */ () {
     return o;
   };
 }
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect
index 93224a2..efc94f5 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningNum = () → core::num;
+typedef FunctionReturningNum = () →* core::num*;
 static method test() → dynamic {
-  core::int i = 1;
-  core::Object o = 1;
-  () → core::num a = () → dynamic => i;
-  () → core::num b = () → dynamic => o;
-  () → core::num c = () → dynamic {
+  core::int* i = 1;
+  core::Object* o = 1;
+  () →* core::num* a = () → dynamic => i;
+  () →* core::num* b = () → dynamic => o;
+  () →* core::num* c = () → dynamic {
     return i;
   };
-  () → core::num d = () → dynamic {
+  () →* core::num* d = () → dynamic {
     return o;
   };
 }
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect
index 93224a2..efc94f5 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningNum = () → core::num;
+typedef FunctionReturningNum = () →* core::num*;
 static method test() → dynamic {
-  core::int i = 1;
-  core::Object o = 1;
-  () → core::num a = () → dynamic => i;
-  () → core::num b = () → dynamic => o;
-  () → core::num c = () → dynamic {
+  core::int* i = 1;
+  core::Object* o = 1;
+  () →* core::num* a = () → dynamic => i;
+  () →* core::num* b = () → dynamic => o;
+  () →* core::num* c = () → dynamic {
     return i;
   };
-  () → core::num d = () → dynamic {
+  () →* core::num* d = () → dynamic {
     return o;
   };
 }
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.outline.expect
index f4d7afd..bdf31c5 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningNum = () → core::num;
+typedef FunctionReturningNum = () →* core::num*;
 static method test() → dynamic
   ;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.expect
index ffcd819..c4026b5 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningNum = () → core::num;
+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 {
+  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;
+  () →* core::num* d = () → core::num* {
+    return o as{TypeError} core::num*;
   };
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.transformed.expect
index ffcd819..c4026b5 100644
--- a/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_return_type.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningNum = () → core::num;
+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 {
+  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;
+  () →* 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 b/pkg/front_end/testcases/inference/lambda_void_context.dart
index cf6ddfc..96f67220 100644
--- a/pkg/front_end/testcases/inference/lambda_void_context.dart
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart
@@ -8,7 +8,7 @@
 f() {
   List<int> o;
   o. /*@target=Iterable::forEach*/ forEach(
-      /*@returnType=int*/ (/*@type=int*/ i) => i /*@target=num::+*/ + 1);
+      /*@ returnType=int* */ (/*@ type=int* */ i) => i /*@target=num::+*/ + 1);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect
index 9848403..94d378d 100644
--- a/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.forEach((dynamic i) → dynamic => i.+(1));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect
index 9848403..94d378d 100644
--- a/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method f() → dynamic {
-  core::List<core::int> o;
+  core::List<core::int*>* o;
   o.forEach((dynamic i) → dynamic => i.+(1));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.expect
index 13abe3f..45d1725 100644
--- a/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.expect
@@ -3,7 +3,7 @@
 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::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* => i.{core::num::+}(1));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.transformed.expect
index 13abe3f..45d1725 100644
--- a/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/lambda_void_context.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 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::List<core::int*>* o;
+  o.{core::Iterable::forEach}((core::int* i) → core::int* => i.{core::num::+}(1));
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart b/pkg/front_end/testcases/inference/list_literal_typed.dart
index 5182f1a..63a3ea4 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart
@@ -11,8 +11,8 @@
 var d = <dynamic>[1, 2.0, false];
 
 main() {
-  var /*@type=List<int>*/ a = <int>[];
-  var /*@type=List<double>*/ b = <double>[1.0, 2.0, 3.0];
-  var /*@type=List<List<int>>*/ c = <List<int>>[];
-  var /*@type=List<dynamic>*/ d = <dynamic>[1, 2.0, false];
+  var /*@ type=List<int*>* */ a = <int>[];
+  var /*@ type=List<double*>* */ b = <double>[1.0, 2.0, 3.0];
+  var /*@ type=List<List<int*>*>* */ c = <List<int>>[];
+  var /*@ type=List<dynamic>* */ d = <dynamic>[1, 2.0, false];
 }
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect
index 9164d78..7544593 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic a = <core::int>[];
-static field dynamic b = <core::double>[1.0, 2.0, 3.0];
-static field dynamic c = <core::List<core::int>>[];
+static field dynamic a = <core::int*>[];
+static field dynamic b = <core::double*>[1.0, 2.0, 3.0];
+static field dynamic c = <core::List<core::int*>*>[];
 static field dynamic d = <dynamic>[1, 2.0, false];
 static method main() → dynamic {
-  dynamic a = <core::int>[];
-  dynamic b = <core::double>[1.0, 2.0, 3.0];
-  dynamic c = <core::List<core::int>>[];
+  dynamic a = <core::int*>[];
+  dynamic b = <core::double*>[1.0, 2.0, 3.0];
+  dynamic c = <core::List<core::int*>*>[];
   dynamic d = <dynamic>[1, 2.0, false];
 }
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect
index 9164d78..7544593 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic a = <core::int>[];
-static field dynamic b = <core::double>[1.0, 2.0, 3.0];
-static field dynamic c = <core::List<core::int>>[];
+static field dynamic a = <core::int*>[];
+static field dynamic b = <core::double*>[1.0, 2.0, 3.0];
+static field dynamic c = <core::List<core::int*>*>[];
 static field dynamic d = <dynamic>[1, 2.0, false];
 static method main() → dynamic {
-  dynamic a = <core::int>[];
-  dynamic b = <core::double>[1.0, 2.0, 3.0];
-  dynamic c = <core::List<core::int>>[];
+  dynamic a = <core::int*>[];
+  dynamic b = <core::double*>[1.0, 2.0, 3.0];
+  dynamic c = <core::List<core::int*>*>[];
   dynamic d = <dynamic>[1, 2.0, false];
 }
diff --git a/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.expect
index 56ceed4..87ba7a9 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.expect
@@ -2,13 +2,13 @@
 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 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];
+  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_literal_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.transformed.expect
index 56ceed4..87ba7a9 100644
--- a/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literal_typed.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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 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];
+  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 b/pkg/front_end/testcases/inference/list_literals.dart
index c162ed5..64f3a1b 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart
+++ b/pkg/front_end/testcases/inference/list_literals.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@type=List<int>*/ x = /*@typeArgs=int*/ [1, 2, 3];
+  var /*@ type=List<int*>* */ x = /*@ typeArgs=int* */ [1, 2, 3];
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
   x. /*@target=List::add*/ add(4);
@@ -14,7 +14,7 @@
 }
 
 test2() {
-  var /*@type=List<num>*/ x = /*@typeArgs=num*/ [1, 2.0, 3];
+  var /*@ type=List<num*>* */ x = /*@ typeArgs=num* */ [1, 2.0, 3];
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x. /*@target=List::add*/ add(4.0);
   List<int> y = /*info:ASSIGNMENT_CAST*/ x;
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.legacy.expect b/pkg/front_end/testcases/inference/list_literals.dart.legacy.expect
index 635e4ce..f039043 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.legacy.expect
@@ -7,12 +7,12 @@
   x.add("hi");
   x.add(4.0);
   x.add(4);
-  core::List<core::num> y = x;
+  core::List<core::num*>* y = x;
 }
 static method test2() → dynamic {
   dynamic x = <dynamic>[1, 2.0, 3];
   x.add("hi");
   x.add(4.0);
-  core::List<core::int> y = x;
+  core::List<core::int*>* y = x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect
index 635e4ce..f039043 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.legacy.transformed.expect
@@ -7,12 +7,12 @@
   x.add("hi");
   x.add(4.0);
   x.add(4);
-  core::List<core::num> y = x;
+  core::List<core::num*>* y = x;
 }
 static method test2() → dynamic {
   dynamic x = <dynamic>[1, 2.0, 3];
   x.add("hi");
   x.add(4.0);
-  core::List<core::int> y = x;
+  core::List<core::int*>* y = x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
index 219a1ea..89d9a84 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.expect
@@ -21,25 +21,25 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> x = <core::int>[1, 2, 3];
+  core::List<core::int*>* x = <core::int*>[1, 2, 3];
   x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                      ^" in "hi" as{TypeError} core::int);
+                                                                      ^" in "hi" as{TypeError} core::int*);
   x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
-                                                                      ^" in 4.0 as{TypeError} core::int);
+                                                                      ^" in 4.0 as{TypeError} core::int*);
   x.{core::List::add}(4);
-  core::List<core::num> y = x;
+  core::List<core::num*>* y = x;
 }
 static method test2() → dynamic {
-  core::List<core::num> x = <core::num>[1, 2.0, 3];
+  core::List<core::num*>* x = <core::num*>[1, 2.0, 3];
   x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
 Try changing the type of the parameter, or casting the argument to 'num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                      ^" in "hi" as{TypeError} core::num);
+                                                                      ^" in "hi" as{TypeError} core::num*);
   x.{core::List::add}(4.0);
-  core::List<core::int> y = x as{TypeError} core::List<core::int>;
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
index 219a1ea..89d9a84 100644
--- a/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals.dart.strong.transformed.expect
@@ -21,25 +21,25 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::int> x = <core::int>[1, 2, 3];
+  core::List<core::int*>* x = <core::int*>[1, 2, 3];
   x.{core::List::add}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:10:71: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                      ^" in "hi" as{TypeError} core::int);
+                                                                      ^" in "hi" as{TypeError} core::int*);
   x.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:11:71: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
-                                                                      ^" in 4.0 as{TypeError} core::int);
+                                                                      ^" in 4.0 as{TypeError} core::int*);
   x.{core::List::add}(4);
-  core::List<core::num> y = x;
+  core::List<core::num*>* y = x;
 }
 static method test2() → dynamic {
-  core::List<core::num> x = <core::num>[1, 2.0, 3];
+  core::List<core::num*>* x = <core::num*>[1, 2.0, 3];
   x.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals.dart:18:71: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
 Try changing the type of the parameter, or casting the argument to 'num'.
   x. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                      ^" in "hi" as{TypeError} core::num);
+                                                                      ^" in "hi" as{TypeError} core::num*);
   x.{core::List::add}(4.0);
-  core::List<core::int> y = x as{TypeError} core::List<core::int>;
+  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 b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
index cb55e3b..3ed4a7e 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@type=List<Null>*/ x = /*@typeArgs=Null*/ [null];
+  var /*@ type=List<Null*>* */ x = /*@ typeArgs=Null* */ [null];
   x. /*@target=List::add*/ add(/*error:INVALID_CAST_LITERAL*/ 42);
 }
 
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
index 1c9dd90..11889f3 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null> x = <core::Null>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null);
+  core::List<core::Null*>* x = <core::Null*>[null];
+  x.{core::List::add}(42 as{TypeError} core::Null*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
index 1c9dd90..11889f3 100644
--- a/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_can_infer_null_bottom.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::List<core::Null> x = <core::Null>[null];
-  x.{core::List::add}(42 as{TypeError} core::Null);
+  core::List<core::Null*>* x = <core::Null*>[null];
+  x.{core::List::add}(42 as{TypeError} core::Null*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart b/pkg/front_end/testcases/inference/list_literals_top_level.dart
index 84b51a0..bcd83e2 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x1 = /*@typeArgs=int*/ [1, 2, 3];
+var x1 = /*@ typeArgs=int* */ [1, 2, 3];
 test1() {
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
@@ -13,7 +13,7 @@
   List<num> y = x1;
 }
 
-var x2 = /*@typeArgs=num*/ [1, 2.0, 3];
+var x2 = /*@ typeArgs=num* */ [1, 2.0, 3];
 test2() {
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
   x2. /*@target=List::add*/ add(4.0);
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect
index 870df2e..e92cf1f 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.expect
@@ -8,11 +8,11 @@
   self::x1.add("hi");
   self::x1.add(4.0);
   self::x1.add(4);
-  core::List<core::num> y = self::x1;
+  core::List<core::num*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.add("hi");
   self::x2.add(4.0);
-  core::List<core::int> y = self::x2;
+  core::List<core::int*>* y = self::x2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect
index 870df2e..e92cf1f 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.legacy.transformed.expect
@@ -8,11 +8,11 @@
   self::x1.add("hi");
   self::x1.add(4.0);
   self::x1.add(4);
-  core::List<core::num> y = self::x1;
+  core::List<core::num*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.add("hi");
   self::x2.add(4.0);
-  core::List<core::int> y = self::x2;
+  core::List<core::int*>* y = self::x2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
index 763b151..2578c7b 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.expect
@@ -20,26 +20,26 @@
 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 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}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                       ^" in "hi" as{TypeError} core::int);
+                                                                       ^" in "hi" as{TypeError} core::int*);
   self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
-                                                                       ^" in 4.0 as{TypeError} core::int);
+                                                                       ^" in 4.0 as{TypeError} core::int*);
   self::x1.{core::List::add}(4);
-  core::List<core::num> y = self::x1;
+  core::List<core::num*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
 Try changing the type of the parameter, or casting the argument to 'num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                       ^" in "hi" as{TypeError} core::num);
+                                                                       ^" in "hi" as{TypeError} core::num*);
   self::x2.{core::List::add}(4.0);
-  core::List<core::int> y = self::x2 as{TypeError} core::List<core::int>;
+  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/list_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
index 763b151..2578c7b 100644
--- a/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/list_literals_top_level.dart.strong.transformed.expect
@@ -20,26 +20,26 @@
 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 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}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:10:72: Error: The argument type 'String' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                       ^" in "hi" as{TypeError} core::int);
+                                                                       ^" in "hi" as{TypeError} core::int*);
   self::x1.{core::List::add}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:11:72: Error: The argument type 'double' can't be assigned to the parameter type 'int'.
 Try changing the type of the parameter, or casting the argument to 'int'.
   x1. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0);
-                                                                       ^" in 4.0 as{TypeError} core::int);
+                                                                       ^" in 4.0 as{TypeError} core::int*);
   self::x1.{core::List::add}(4);
-  core::List<core::num> y = self::x1;
+  core::List<core::num*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::List::add}(let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/list_literals_top_level.dart:18:72: Error: The argument type 'String' can't be assigned to the parameter type 'num'.
 Try changing the type of the parameter, or casting the argument to 'num'.
   x2. /*@target=List::add*/ add(/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi');
-                                                                       ^" in "hi" as{TypeError} core::num);
+                                                                       ^" in "hi" as{TypeError} core::num*);
   self::x2.{core::List::add}(4.0);
-  core::List<core::int> y = self::x2 as{TypeError} core::List<core::int>;
+  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 b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart
index b7a4bc5..efe7e31 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart
@@ -11,14 +11,14 @@
 }
 
 main() {
-  var /*@type=C<int>*/ x = new /*@typeArgs=int*/ C(42);
+  var /*@ type=C<int*>* */ x = new /*@ typeArgs=int* */ C(42);
 
   num y;
-  C<int> c_int = new /*@typeArgs=int*/ C(
+  C<int> c_int = new /*@ typeArgs=int* */ C(
       /*info:DOWN_CAST_IMPLICIT*/ y);
 
-  C<num> c_num = new /*@typeArgs=num*/ C(123);
+  C<num> c_num = new /*@ typeArgs=num* */ C(123);
 
   // Don't infer from explicit dynamic.
-  var /*@type=C<dynamic>*/ c_dynamic = new C<dynamic>(42);
+  var /*@ type=C<dynamic>* */ c_dynamic = new C<dynamic>(42);
 }
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
index f31c88e..f67a55b 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic x = new self::C::•<dynamic>(42);
-  core::num y;
-  self::C<core::int> c_int = new self::C::•<dynamic>(y);
-  self::C<core::num> c_num = new self::C::•<dynamic>(123);
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<dynamic>(y);
+  self::C<core::num*>* c_num = new self::C::•<dynamic>(123);
   dynamic c_dynamic = new self::C::•<dynamic>(42);
 }
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
index f31c88e..f67a55b 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic x = new self::C::•<dynamic>(42);
-  core::num y;
-  self::C<core::int> c_int = new self::C::•<dynamic>(y);
-  self::C<core::num> c_num = new self::C::•<dynamic>(123);
+  core::num* y;
+  self::C<core::int*>* c_int = new self::C::•<dynamic>(y);
+  self::C<core::num*>* c_num = new self::C::•<dynamic>(123);
   dynamic c_dynamic = new self::C::•<dynamic>(42);
 }
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
index cdfac01..9917a90d 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
index 95c44af..b807530 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 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);
+  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_constructor_from_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
index 95c44af..b807530 100644
--- a/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_constructor_from_arguments.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T t;
-  constructor •(self::C::T t) → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* t;
+  constructor •(self::C::T* t) → self::C<self::C::T*>*
     : self::C::t = t, super core::Object::•()
     ;
 }
 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);
+  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 b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart
index 7809b84..9370d8a 100644
--- a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart
@@ -9,5 +9,5 @@
 
 main() {
   Future<int> futureInt = null;
-  var /*@type=Future<int>*/ x = futureInt;
+  var /*@ type=Future<int*>* */ x = futureInt;
 }
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect
index 329a161..ce98814 100644
--- a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.expect
@@ -6,6 +6,6 @@
 import "dart:async";
 
 static method main() → dynamic {
-  asy::Future<core::int> futureInt = null;
+  asy::Future<core::int*>* futureInt = null;
   dynamic x = futureInt;
 }
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect
index 329a161..ce98814 100644
--- a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.legacy.transformed.expect
@@ -6,6 +6,6 @@
 import "dart:async";
 
 static method main() → dynamic {
-  asy::Future<core::int> futureInt = null;
+  asy::Future<core::int*>* futureInt = null;
   dynamic x = futureInt;
 }
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.expect
index 37687ca..220da3b 100644
--- a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.expect
@@ -6,6 +6,6 @@
 import "dart:async";
 
 static method main() → dynamic {
-  asy::Future<core::int> futureInt = null;
-  asy::Future<core::int> x = futureInt;
+  asy::Future<core::int*>* futureInt = null;
+  asy::Future<core::int*>* x = futureInt;
 }
diff --git a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.transformed.expect
index 37687ca..220da3b 100644
--- a/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_reference_upwards_local.dart.strong.transformed.expect
@@ -6,6 +6,6 @@
 import "dart:async";
 
 static method main() → dynamic {
-  asy::Future<core::int> futureInt = null;
-  asy::Future<core::int> x = futureInt;
+  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 b/pkg/front_end/testcases/inference/local_return_and_yield.dart
index 5feced1..2b42b63 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart
@@ -11,32 +11,32 @@
 
 main() {
   IntToInt a() {
-    return /*@returnType=int*/ (/*@type=int*/ x) => x;
+    return /*@ returnType=int* */ (/*@ type=int* */ x) => x;
   }
 
   Future<IntToInt> b() async {
     // TODO(paulberry): this is broken due to bug 29689.
-    return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
+    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
   }
 
   Iterable<IntToInt> c() sync* {
-    yield /*@returnType=int*/ (/*@type=int*/ x) => x;
+    yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
   }
 
   Iterable<IntToInt> d() sync* {
-    yield* /*@typeArgs=(int) -> int*/ [
-      /*@returnType=int*/ (/*@type=int*/ x) => x
+    yield* /*@ typeArgs=(int*) ->* int* */ [
+      /*@ returnType=int* */ (/*@ type=int* */ x) => x
     ];
   }
 
   Stream<IntToInt> e() async* {
-    yield /*@returnType=int*/ (/*@type=int*/ x) => x;
+    yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
   }
 
   Stream<IntToInt> f() async* {
-    yield* new /*@typeArgs=(int) -> int*/ Stream.fromIterable(
-        /*@typeArgs=(int) -> int*/ [
-          /*@returnType=int*/ (/*@type=int*/ x) => x
+    yield* new /*@ typeArgs=(int*) ->* int* */ Stream.fromIterable(
+        /*@ typeArgs=(int*) ->* int* */ [
+          /*@ returnType=int* */ (/*@ type=int* */ x) => x
         ]);
   }
 }
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect
index 6c8bac5..fcb3246 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.expect
@@ -5,24 +5,24 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
+typedef IntToInt = (core::int*) →* core::int*;
 static method main() → dynamic {
-  function a() → (core::int) → core::int {
+  function a() → (core::int*) →* core::int* {
     return (dynamic x) → dynamic => x;
   }
-  function b() → asy::Future<(core::int) → core::int> async {
+  function b() → asy::Future<(core::int*) →* core::int*>* async {
     return (dynamic x) → dynamic => x;
   }
-  function c() → core::Iterable<(core::int) → core::int> sync* {
+  function c() → core::Iterable<(core::int*) →* core::int*>* sync* {
     yield(dynamic x) → dynamic => x;
   }
-  function d() → core::Iterable<(core::int) → core::int> sync* {
+  function d() → core::Iterable<(core::int*) →* core::int*>* sync* {
     yield*<dynamic>[(dynamic x) → dynamic => x];
   }
-  function e() → asy::Stream<(core::int) → core::int> async* {
+  function e() → asy::Stream<(core::int*) →* core::int*>* async* {
     yield(dynamic x) → dynamic => x;
   }
-  function f() → asy::Stream<(core::int) → core::int> async* {
+  function f() → asy::Stream<(core::int*) →* core::int*>* async* {
     yield* asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x]);
   }
 }
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect
index 6ceeed3..969c586 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.legacy.transformed.expect
@@ -5,14 +5,14 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
+typedef IntToInt = (core::int*) →* core::int*;
 static method main() → dynamic {
-  function a() → (core::int) → core::int {
+  function a() → (core::int*) →* core::int* {
     return (dynamic x) → dynamic => x;
   }
-  function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
-    asy::FutureOr<(core::int) → core::int> :return_value;
+  function b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+    asy::FutureOr<(core::int*) →* core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -37,10 +37,10 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
-  function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  function c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
@@ -49,12 +49,12 @@
       }
       return false;
     }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
   }
-  function d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  function d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
       {
         {
           :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
@@ -63,10 +63,10 @@
       }
       return false;
     }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
   }
-  function e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  function e() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -96,12 +96,12 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
-  function f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  function f() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -131,7 +131,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.outline.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.outline.expect
index d57e83e..5b9acaa 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.outline.expect
@@ -4,6 +4,6 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
+typedef IntToInt = (core::int*) →* core::int*;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
index 4445a49..603476d 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-//     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-//                                    ^
+//     return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                      ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,28 +14,28 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
+typedef IntToInt = (core::int*) →* core::int*;
 static method main() → dynamic {
-  function a() → (core::int) → core::int {
-    return (core::int x) → core::int => x;
+  function a() → (core::int*) →* core::int* {
+    return (core::int* x) → core::int* => x;
   }
-  function b() → asy::Future<(core::int) → core::int> async {
-    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+  function b() → asy::Future<(core::int*) →* core::int*>* async {
+    return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-    return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-                                   ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
+    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                     ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
   }
-  function c() → core::Iterable<(core::int) → core::int> sync* {
-    yield(core::int x) → core::int => x;
+  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 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 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]);
+  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/local_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
index d16c079..34219f6 100644
--- a/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/local_return_and_yield.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+// pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-//     return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-//                                    ^
+//     return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                      ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,14 +14,14 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
+typedef IntToInt = (core::int*) →* core::int*;
 static method main() → dynamic {
-  function a() → (core::int) → core::int {
-    return (core::int x) → core::int => x;
+  function a() → (core::int*) →* core::int* {
+    return (core::int* x) → core::int* => x;
   }
-  function b() → asy::Future<(core::int) → core::int> /* originally async */ {
-    final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
-    asy::FutureOr<(core::int) → core::int> :return_value;
+  function b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
+    final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+    asy::FutureOr<(core::int*) →* core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -31,11 +31,11 @@
       try {
         #L1:
         {
-          :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+          :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/local_return_and_yield.dart:19:38: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-    return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-                                   ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
+    return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                     ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
           break #L1;
         }
         asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -50,36 +50,36 @@
     :async_completer.start(:async_op);
     return :async_completer.{asy::Completer::future};
   }
-  function c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  function c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
       {
         {
-          :iterator.{core::_SyncIterator::_current} = (core::int x) → core::int => x;
+          :iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
           [yield] true;
         }
       }
       return false;
     }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
   }
-  function d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+  function d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
     dynamic :await_jump_var = 0;
     dynamic :await_ctx_var;
-    function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+    function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
       {
         {
-          :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int) → core::int>[(core::int x) → core::int => x];
+          :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
           [yield] true;
         }
       }
       return false;
     }
-    return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+    return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
   }
-  function e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  function e() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -93,7 +93,7 @@
         try {
           #L2:
           {
-            if(:controller.{asy::_AsyncStarStreamController::add}((core::int x) → core::int => x))
+            if(:controller.{asy::_AsyncStarStreamController::add}((core::int* x) → core::int* => x))
               return null;
             else
               [yield] null;
@@ -109,12 +109,12 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
-  function f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-    asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+  function f() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+    asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
     dynamic :controller_stream;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
@@ -128,7 +128,7 @@
         try {
           #L3:
           {
-            if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<(core::int) → core::int>(<(core::int) → core::int>[(core::int x) → core::int => x])))
+            if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<(core::int*) →* core::int*>(<(core::int*) →* core::int*>[(core::int* x) → core::int* => x])))
               return null;
             else
               [yield] null;
@@ -144,7 +144,7 @@
     :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
     :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
     :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-    :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+    :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
     :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
     return :controller_stream;
   }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart b/pkg/front_end/testcases/inference/logical_or_promotion.dart
index 57411e0..0719422 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart
@@ -15,7 +15,7 @@
   void f(Object o) {
     if (o is A || o is B) {
       if (o is A) {
-        /*@target=C::a*/ a = /*@promotedType=A*/ o;
+        /*@target=C::a*/ a = /*@ promotedType=A* */ o;
       }
     }
   }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect
index 8ab3b1c..ad5d784 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
+  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) {
+  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;
       }
     }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect
index 8ab3b1c..ad5d784 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.legacy.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
+  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) {
+  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;
       }
     }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.outline.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.outline.expect
index 10fde61..5593d53 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends core::Object {
-  field self::A a;
-  synthetic constructor •() → self::C
+  field self::A* a;
+  synthetic constructor •() → self::C*
     ;
-  method f(core::Object o) → void
+  method f(core::Object* o) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.expect
index 9740119..db81842 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
+  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};
+  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*};
       }
     }
   }
diff --git a/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.transformed.expect
index 9740119..db81842 100644
--- a/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/logical_or_promotion.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::C
+  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};
+  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*};
       }
     }
   }
diff --git a/pkg/front_end/testcases/inference/map_literals.dart b/pkg/front_end/testcases/inference/map_literals.dart
index c60d84d..6a851c4 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart
+++ b/pkg/front_end/testcases/inference/map_literals.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@type=Map<int, String>*/ x = /*@typeArgs=int, String*/ {1: 'x', 2: 'y'};
+  var /*@ type=Map<int*, String*>* */ x = /*@ typeArgs=int*, String* */ {1: 'x', 2: 'y'};
   x /*@target=Map::[]=*/ [3] = 'z';
   x /*@target=Map::[]=*/ [
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
@@ -17,7 +17,7 @@
 }
 
 test2() {
-  var /*@type=Map<num, Pattern>*/ x = /*@typeArgs=num, Pattern*/ {
+  var /*@ type=Map<num*, Pattern*>* */ x = /*@ typeArgs=num*, Pattern* */ {
     1: 'x',
     2: 'y',
     3.0: new RegExp('.')
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.legacy.expect b/pkg/front_end/testcases/inference/map_literals.dart.legacy.expect
index d8d0587..6dd2943 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.legacy.expect
@@ -8,7 +8,7 @@
   x.[]=("hi", "w");
   x.[]=(4.0, "u");
   x.[]=(3, 42);
-  core::Map<core::num, core::String> y = x;
+  core::Map<core::num*, core::String*>* y = x;
 }
 static method test2() → dynamic {
   dynamic x = <dynamic, dynamic>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
@@ -16,8 +16,8 @@
   x.[]=("hi", "w");
   x.[]=(4.0, "u");
   x.[]=(3, 42);
-  core::Pattern p = null;
+  core::Pattern* p = null;
   x.[]=(2, p);
-  core::Map<core::int, core::String> y = x;
+  core::Map<core::int*, core::String*>* y = x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect
index d8d0587..6dd2943 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.legacy.transformed.expect
@@ -8,7 +8,7 @@
   x.[]=("hi", "w");
   x.[]=(4.0, "u");
   x.[]=(3, 42);
-  core::Map<core::num, core::String> y = x;
+  core::Map<core::num*, core::String*>* y = x;
 }
 static method test2() → dynamic {
   dynamic x = <dynamic, dynamic>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
@@ -16,8 +16,8 @@
   x.[]=("hi", "w");
   x.[]=(4.0, "u");
   x.[]=(3, 42);
-  core::Pattern p = null;
+  core::Pattern* p = null;
   x.[]=(2, p);
-  core::Map<core::int, core::String> y = x;
+  core::Map<core::int*, core::String*>* y = x;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
index 7b89247..3436fff 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.expect
@@ -32,37 +32,37 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
+  core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
   x.{core::Map::[]=}(let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                             ^" in "hi" as{TypeError} core::int, "w");
+                                             ^" in "hi" as{TypeError} core::int*, "w");
   x.{core::Map::[]=}(let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
-                                             ^" in 4.0 as{TypeError} core::int, "u");
+                                             ^" in 4.0 as{TypeError} core::int*, "u");
   x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                            ^" in 42 as{TypeError} core::String);
-  core::Map<core::num, core::String> y = x;
+                                                            ^" in 42 as{TypeError} core::String*);
+  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::•(".")};
+  core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
   x.{core::Map::[]=}(let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                             ^" in "hi" as{TypeError} core::num, "w");
+                                             ^" in "hi" as{TypeError} core::num*, "w");
   x.{core::Map::[]=}(4.0, "u");
   x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                            ^" in 42 as{TypeError} core::Pattern);
-  core::Pattern p = null;
+                                                            ^" in 42 as{TypeError} core::Pattern*);
+  core::Pattern* p = null;
   x.{core::Map::[]=}(2, p);
-  core::Map<core::int, core::String> y = x as{TypeError} core::Map<core::int, core::String>;
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
index 7b89247..3436fff 100644
--- a/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals.dart.strong.transformed.expect
@@ -32,37 +32,37 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::int, core::String> x = <core::int, core::String>{1: "x", 2: "y"};
+  core::Map<core::int*, core::String*>* x = <core::int*, core::String*>{1: "x", 2: "y"};
   x.{core::Map::[]=}(3, "z");
   x.{core::Map::[]=}(let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                             ^" in "hi" as{TypeError} core::int, "w");
+                                             ^" in "hi" as{TypeError} core::int*, "w");
   x.{core::Map::[]=}(let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
-                                             ^" in 4.0 as{TypeError} core::int, "u");
+                                             ^" in 4.0 as{TypeError} core::int*, "u");
   x.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:15:61: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                            ^" in 42 as{TypeError} core::String);
-  core::Map<core::num, core::String> y = x;
+                                                            ^" in 42 as{TypeError} core::String*);
+  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::•(".")};
+  core::Map<core::num*, core::Pattern*>* x = <core::num*, core::Pattern*>{1: "x", 2: "y", 3.0: core::RegExp::•(".")};
   x.{core::Map::[]=}(3, "z");
   x.{core::Map::[]=}(let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
       /*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                             ^" in "hi" as{TypeError} core::num, "w");
+                                             ^" in "hi" as{TypeError} core::num*, "w");
   x.{core::Map::[]=}(4.0, "u");
   x.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals.dart:29:61: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                            ^" in 42 as{TypeError} core::Pattern);
-  core::Pattern p = null;
+                                                            ^" in 42 as{TypeError} core::Pattern*);
+  core::Pattern* p = null;
   x.{core::Map::[]=}(2, p);
-  core::Map<core::int, core::String> y = x as{TypeError} core::Map<core::int, core::String>;
+  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 b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
index 7c6bff3..1d3ab85 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart
@@ -6,7 +6,7 @@
 library test;
 
 test1() {
-  var /*@type=Map<Null, Null>*/ x = /*@typeArgs=Null, Null*/ {null: null};
+  var /*@ type=Map<Null*, Null*>* */ x = /*@ typeArgs=Null*, Null* */ {null: null};
   x /*@target=Map::[]=*/ [
       /*error:INVALID_CAST_LITERAL*/ 3] = /*error:INVALID_CAST_LITERAL*/ 'z';
 }
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
index c7c099c..57e9d39 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null, core::Null> x = <core::Null, core::Null>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null, "z" as{TypeError} core::Null);
+  core::Map<core::Null*, core::Null*>* x = <core::Null*, core::Null*>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} core::Null*, "z" as{TypeError} core::Null*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
index c7c099c..57e9d39 100644
--- a/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_can_infer_null.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::Map<core::Null, core::Null> x = <core::Null, core::Null>{null: null};
-  x.{core::Map::[]=}(3 as{TypeError} core::Null, "z" as{TypeError} core::Null);
+  core::Map<core::Null*, core::Null*>* x = <core::Null*, core::Null*>{null: null};
+  x.{core::Map::[]=}(3 as{TypeError} core::Null*, "z" as{TypeError} core::Null*);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart b/pkg/front_end/testcases/inference/map_literals_top_level.dart
index 362aef1..a9338a3 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x1 = /*@typeArgs=int, String*/ {1: 'x', 2: 'y'};
+var x1 = /*@ typeArgs=int*, String* */ {1: 'x', 2: 'y'};
 test1() {
   x1 /*@target=Map::[]=*/ [3] = 'z';
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
@@ -14,7 +14,7 @@
   Map<num, String> y = x1;
 }
 
-var x2 = /*@typeArgs=num, Pattern*/ {1: 'x', 2: 'y', 3.0: new RegExp('.')};
+var x2 = /*@ typeArgs=num*, Pattern* */ {1: 'x', 2: 'y', 3.0: new RegExp('.')};
 test2() {
   x2 /*@target=Map::[]=*/ [3] = 'z';
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect
index f17ed4f..3547bf9 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.expect
@@ -9,15 +9,15 @@
   self::x1.[]=("hi", "w");
   self::x1.[]=(4.0, "u");
   self::x1.[]=(3, 42);
-  core::Map<core::num, core::String> y = self::x1;
+  core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.[]=(3, "z");
   self::x2.[]=("hi", "w");
   self::x2.[]=(4.0, "u");
   self::x2.[]=(3, 42);
-  core::Pattern p = null;
+  core::Pattern* p = null;
   self::x2.[]=(2, p);
-  core::Map<core::int, core::String> y = self::x2;
+  core::Map<core::int*, core::String*>* y = self::x2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect
index f17ed4f..3547bf9 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.legacy.transformed.expect
@@ -9,15 +9,15 @@
   self::x1.[]=("hi", "w");
   self::x1.[]=(4.0, "u");
   self::x1.[]=(3, 42);
-  core::Map<core::num, core::String> y = self::x1;
+  core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.[]=(3, "z");
   self::x2.[]=("hi", "w");
   self::x2.[]=(4.0, "u");
   self::x2.[]=(3, 42);
-  core::Pattern p = null;
+  core::Pattern* p = null;
   self::x2.[]=(2, p);
-  core::Map<core::int, core::String> y = self::x2;
+  core::Map<core::int*, core::String*>* y = self::x2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
index 9049589..0fb8116 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.expect
@@ -31,38 +31,38 @@
 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 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");
   self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                                                  ^" in "hi" as{TypeError} core::int, "w");
+                                                                  ^" in "hi" as{TypeError} core::int*, "w");
   self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
-                                                                  ^" in 4.0 as{TypeError} core::int, "u");
+                                                                  ^" in 4.0 as{TypeError} core::int*, "u");
   self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                             ^" in 42 as{TypeError} core::String);
-  core::Map<core::num, core::String> y = self::x1;
+                                                             ^" in 42 as{TypeError} core::String*);
+  core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
   self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                                                  ^" in "hi" as{TypeError} core::num, "w");
+                                                                  ^" in "hi" as{TypeError} core::num*, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
   self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                             ^" in 42 as{TypeError} core::Pattern);
-  core::Pattern p = null;
+                                                             ^" in 42 as{TypeError} core::Pattern*);
+  core::Pattern* p = null;
   self::x2.{core::Map::[]=}(2, p);
-  core::Map<core::int, core::String> y = self::x2 as{TypeError} core::Map<core::int, core::String>;
+  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/map_literals_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
index 9049589..0fb8116 100644
--- a/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/map_literals_top_level.dart.strong.transformed.expect
@@ -31,38 +31,38 @@
 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 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");
   self::x1.{core::Map::[]=}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:11:67: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                                                  ^" in "hi" as{TypeError} core::int, "w");
+                                                                  ^" in "hi" as{TypeError} core::int*, "w");
   self::x1.{core::Map::[]=}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:12:67: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   x1 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 4.0] = 'u';
-                                                                  ^" in 4.0 as{TypeError} core::int, "u");
+                                                                  ^" in 4.0 as{TypeError} core::int*, "u");
   self::x1.{core::Map::[]=}(3, let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:13:62: Error: A value of type 'int' can't be assigned to a variable of type 'String'.
 Try changing the type of the left hand side, or casting the right hand side to 'String'.
   x1 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                             ^" in 42 as{TypeError} core::String);
-  core::Map<core::num, core::String> y = self::x1;
+                                                             ^" in 42 as{TypeError} core::String*);
+  core::Map<core::num*, core::String*>* y = self::x1;
 }
 static method test2() → dynamic {
   self::x2.{core::Map::[]=}(3, "z");
   self::x2.{core::Map::[]=}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:20:67: Error: A value of type 'String' can't be assigned to a variable of type 'num'.
 Try changing the type of the left hand side, or casting the right hand side to 'num'.
   x2 /*@target=Map::[]=*/ [/*error:ARGUMENT_TYPE_NOT_ASSIGNABLE*/ 'hi'] = 'w';
-                                                                  ^" in "hi" as{TypeError} core::num, "w");
+                                                                  ^" in "hi" as{TypeError} core::num*, "w");
   self::x2.{core::Map::[]=}(4.0, "u");
   self::x2.{core::Map::[]=}(3, let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/inference/map_literals_top_level.dart:22:62: Error: A value of type 'int' can't be assigned to a variable of type 'Pattern'.
  - 'Pattern' is from 'dart:core'.
 Try changing the type of the left hand side, or casting the right hand side to 'Pattern'.
   x2 /*@target=Map::[]=*/ [3] = /*error:INVALID_ASSIGNMENT*/ 42;
-                                                             ^" in 42 as{TypeError} core::Pattern);
-  core::Pattern p = null;
+                                                             ^" in 42 as{TypeError} core::Pattern*);
+  core::Pattern* p = null;
   self::x2.{core::Map::[]=}(2, p);
-  core::Map<core::int, core::String> y = self::x2 as{TypeError} core::Map<core::int, core::String>;
+  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.legacy.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.expect
index dec508c..258b1cb 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic f = new self::C::•().f<core::int>();
+static field dynamic f = new self::C::•().f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect
index dec508c..258b1cb 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic f = new self::C::•().f<core::int>();
+static field dynamic f = new self::C::•().f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
index dc872ca..f39bd10 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> f = new self::C::•().{self::C::f}<core::int>();
+static field self::D<core::int*>* f = new self::C::•().{self::C::f}<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
index dc872ca..f39bd10 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> f = new self::C::•().{self::C::f}<core::int>();
+static field self::D<core::int*>* f = new self::C::•().{self::C::f}<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect
index 91902c1..68e9c13 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field dynamic f = self::c.f<core::int>();
+static field self::C* c;
+static field dynamic f = self::c.f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect
index 91902c1..68e9c13 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.legacy.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field dynamic f = self::c.f<core::int>();
+static field self::C* c;
+static field dynamic f = self::c.f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
index 3861ee2..6245ce0 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field self::D<core::int> f = self::c.{self::C::f}<core::int>();
+static field self::C* c;
+static field self::D<core::int*>* f = self::c.{self::C::f}<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
index 3861ee2..6245ce0 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_instance_method_identifier_sequence.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C c;
-static field self::D<core::int> f = self::c.{self::C::f}<core::int>();
+static field self::C* c;
+static field self::D<core::int*>* f = self::c.{self::C::f}<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect
index b676758..d2042f5 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic f = self::C::f<core::int>();
+static field dynamic f = self::C::f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect
index b676758..d2042f5 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic f = self::C::f<core::int>();
+static field dynamic f = self::C::f<core::int*>();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
index 0d59836..1f46bb0 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> f = self::C::f<core::int>();
+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_static_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
index 0d59836..1f46bb0 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_static_method.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f<T extends core::Object = dynamic>() → self::D<self::C::f::T>
+  static method f<T extends core::Object* = dynamic>() → self::D<self::C::f::T*>*
     return null;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> f = self::C::f<core::int>();
+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.legacy.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.expect
index ce9f3bd..dd5e284 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.expect
@@ -2,13 +2,13 @@
 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>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic g = self::f<core::int>();
-static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
+static field dynamic 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/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect
index ce9f3bd..dd5e284 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 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>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic g = self::f<core::int>();
-static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
+static field dynamic 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/method_call_with_type_arguments_top_level_function.dart.strong.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
index 6071d71..01a8d5e 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.expect
@@ -2,13 +2,13 @@
 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>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> g = self::f<core::int>();
-static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
+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/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
index 6071d71..01a8d5e 100644
--- a/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/method_call_with_type_arguments_top_level_function.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-static field self::D<core::int> g = self::f<core::int>();
-static method f<T extends core::Object = dynamic>() → self::D<self::f::T>
+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.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect
index 2fa7bf9..0c139e8 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::String* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::String> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::String*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect
index 2aeb31d..abd71d3 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.legacy.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::String* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::String> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::String*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
index 2af7824..a7ce02f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::String = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::String* = dynamic> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::String> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::String*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
index bfb7b01..826dbaa 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::String = core::String> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::String* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::String> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::String*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
index dfd7d1e..ce826f6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_1.dart.strong.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::String = core::String> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::String* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::String> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::String*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect
index db552ee..15a2b6c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::int> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::int*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect
index 6459244..dd85f9f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.legacy.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::int> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::int*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
index f91df74..6ad60a0 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::int> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::int*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
index db552ee..15a2b6c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::int> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::int*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
index 6459244..dd85f9f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_2.dart.strong.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::int> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::int*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect
index 7c6712b..a62efc99 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::Comparable<dynamic>> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::Comparable<dynamic>*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect
index 47f9f64..337105f 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.legacy.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = 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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::Comparable<dynamic>> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::Comparable<dynamic>*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
index 5e19f97..6af70be 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<X extends core::Object = dynamic, Y extends core::Comparable<self::M0::Y> = dynamic> extends self::I<self::M0::X> {
-  synthetic constructor •() → self::M0<self::M0::X, self::M0::Y>
+class M0<X extends core::Object* = dynamic, Y extends core::Comparable<self::M0::Y>* = dynamic> extends self::I<self::M0::X*> {
+  synthetic constructor •() → self::M0<self::M0::X*, self::M0::Y*>*
     ;
 }
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::Comparable<dynamic>> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::Comparable<dynamic>*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
index 78b8e48..e8afc30 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.expect
@@ -14,28 +14,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 = self::M1 with self::M0<core::int, core::Comparable<dynamic>> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 = self::M1 with self::M0<core::int*, core::Comparable<dynamic>*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
index cecd07c..5ca76b8 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_instantiate_to_bounds_3.dart.strong.transformed.expect
@@ -14,28 +14,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int, core::Comparable<dynamic>> {
-  synthetic constructor •() → self::_A&M1&M0
+abstract class _A&M1&M0 extends self::M1 implements self::M0<core::int*, core::Comparable<dynamic>*> {
+  synthetic constructor •() → self::_A&M1&M0*
     : super self::M1::•()
     ;
 }
 class A extends self::_A&M1&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M1&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect
index 9fe7a0a..a7ffa02 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.expect
@@ -2,43 +2,43 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
     : super core::Object::•()
     ;
 }
-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> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+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*> {
+  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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
+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> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2 with self::M0<core::int*, core::double*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect
index 435ce3b..c25154e4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.legacy.transformed.expect
@@ -2,43 +2,43 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::I<self::_M0&I&J::X*> implements self::J<self::_M0&I&J::Y*> {
+  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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
+class M2 extends self::M1 implements self::J<core::double*> {
+  synthetic constructor •() → self::M2*
     : super self::M1::•()
     ;
 }
-abstract class _A&M2&M0 extends self::M2 implements self::M0<core::int, core::double> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 extends self::M2 implements self::M0<core::int*, core::double*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
index da0d2c6..c0a8ae0 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.outline.expect
@@ -2,38 +2,38 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
     ;
 }
-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> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+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*> {
+  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>
+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*>*
     ;
 }
-class M1 extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::M1
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     ;
 }
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
+class M2 extends self::M1 implements self::J<core::double*> {
+  synthetic constructor •() → self::M2*
     ;
 }
-abstract class _A&M2&M0 = self::M2 with self::M0<core::int, core::double> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2 with self::M0<core::int*, core::double*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
index 9fe7a0a..a7ffa02 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.expect
@@ -2,43 +2,43 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
     : super core::Object::•()
     ;
 }
-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> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+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*> {
+  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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
+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> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2 with self::M0<core::int*, core::double*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
index 435ce3b..c25154e4 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_multiple_constraints.dart.strong.transformed.expect
@@ -2,43 +2,43 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class J<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::J<self::J::X>
+class J<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::J<self::J::X*>*
     : super core::Object::•()
     ;
 }
-abstract class _M0&I&J<X extends core::Object = dynamic, Y extends core::Object = dynamic> extends self::I<self::_M0&I&J::X> implements self::J<self::_M0&I&J::Y> {
-  synthetic constructor •() → self::_M0&I&J<self::_M0&I&J::X, self::_M0&I&J::Y>
+abstract class _M0&I&J<X extends core::Object* = dynamic, Y extends core::Object* = dynamic> extends self::I<self::_M0&I&J::X*> implements self::J<self::_M0&I&J::Y*> {
+  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>
+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
+class M1 extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
-class M2 extends self::M1 implements self::J<core::double> {
-  synthetic constructor •() → self::M2
+class M2 extends self::M1 implements self::J<core::double*> {
+  synthetic constructor •() → self::M2*
     : super self::M1::•()
     ;
 }
-abstract class _A&M2&M0 extends self::M2 implements self::M0<core::int, core::double> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 extends self::M2 implements self::M0<core::int*, core::double*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect
index 1030f6b..3512c8c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.expect
@@ -2,33 +2,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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>> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2<core::int*> with self::M0<core::Map<core::int*, core::int*>*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect
index 3eabc8f..6247867 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.legacy.transformed.expect
@@ -2,33 +2,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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 extends self::M2<core::int> implements self::M0<core::Map<core::int, core::int>> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 extends self::M2<core::int*> implements self::M0<core::Map<core::int*, core::int*>*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
index 75b4f9d..6c5c378 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.outline.expect
@@ -2,29 +2,29 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
+class M0<T extends core::Object* = dynamic> extends self::I<core::List<self::M0::T*>*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<core::List<self::M1::T>> {
-  synthetic constructor •() → self::M1<self::M1::T>
+class M1<T extends core::Object* = dynamic> extends self::I<core::List<self::M1::T*>*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
     ;
 }
-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>
+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*>*
     ;
 }
-abstract class _A&M2&M0 = self::M2<core::int> with self::M0<core::Map<core::int, core::int>> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2<core::int*> with self::M0<core::Map<core::int*, core::int*>*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
index 1030f6b..3512c8c 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.expect
@@ -2,33 +2,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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>> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 = self::M2<core::int*> with self::M0<core::Map<core::int*, core::int*>*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
index 3eabc8f..6247867 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_non_trivial_constraints.dart.strong.transformed.expect
@@ -2,33 +2,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<core::List<self::M0::T>> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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 extends self::M2<core::int> implements self::M0<core::Map<core::int, core::int>> {
-  synthetic constructor •() → self::_A&M2&M0
+abstract class _A&M2&M0 extends self::M2<core::int*> implements self::M0<core::Map<core::int*, core::int*>*> {
+  synthetic constructor •() → self::_A&M2&M0*
     : super self::M2::•()
     ;
 }
 class A extends self::_A&M2&M0 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M2&M0::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect
index b336c68..62f31c1 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect
index 75ebf9d..31c23b9 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.legacy.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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 extends self::M0<core::int> implements self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
index 641b87b..5f56095 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
     ;
 }
-abstract class _A&M0&M1 = self::M0<core::int> with self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
index b336c68..62f31c1 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
index 75ebf9d..31c23b9 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_1.dart.strong.transformed.expect
@@ -2,28 +2,28 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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 extends self::M0<core::int> implements self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
 class A extends self::_A&M0&M1 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect
index d133391..2ed4120 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.expect
@@ -2,38 +2,38 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
-abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int> {
-  synthetic constructor •() → self::_A&M0&M1&M2
+abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1&M2*
     : super self::_A&M0&M1::•()
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1&M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect
index d4edaee..d8f1efe 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.legacy.transformed.expect
@@ -2,38 +2,38 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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 extends self::M0<core::int> implements self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
-abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<core::int> {
-  synthetic constructor •() → self::_A&M0&M1&M2
+abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1&M2*
     : super self::_A&M0&M1::•()
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1&M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
index 7456cbf..523042e 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.outline.expect
@@ -2,34 +2,34 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+class M0<T extends core::Object* = dynamic> extends self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
     ;
 }
-class M2<T extends core::Object = dynamic> extends self::I<self::M2::T> {
-  synthetic constructor •() → self::M2<self::M2::T>
+class M2<T extends core::Object* = dynamic> extends self::I<self::M2::T*> {
+  synthetic constructor •() → self::M2<self::M2::T*>*
     ;
 }
-abstract class _A&M0&M1 = self::M0<core::int> with self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
-abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int> {
-  synthetic constructor •() → self::_A&M0&M1&M2
+abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1&M2*
     : super self::_A&M0&M1::•()
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
index d133391..2ed4120 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.expect
@@ -2,38 +2,38 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 = self::M0<core::int*> with self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
-abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int> {
-  synthetic constructor •() → self::_A&M0&M1&M2
+abstract class _A&M0&M1&M2 = self::_A&M0&M1 with self::M2<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1&M2*
     : super self::_A&M0&M1::•()
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1&M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
index d4edaee..d8f1efe 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_2.dart.strong.transformed.expect
@@ -2,38 +2,38 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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>
+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>
+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 extends self::M0<core::int> implements self::M1<core::int> {
-  synthetic constructor •() → self::_A&M0&M1
+abstract class _A&M0&M1 extends self::M0<core::int*> implements self::M1<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1*
     : super self::M0::•()
     ;
 }
-abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<core::int> {
-  synthetic constructor •() → self::_A&M0&M1&M2
+abstract class _A&M0&M1&M2 extends self::_A&M0&M1 implements self::M2<core::int*> {
+  synthetic constructor •() → self::_A&M0&M1&M2*
     : super self::_A&M0&M1::•()
     ;
 }
 class A extends self::_A&M0&M1&M2 {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&M0&M1&M2::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
index 0c7e099..79557a6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.expect
@@ -15,33 +15,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int*> {
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
index 4a8d005..43841f3 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.legacy.transformed.expect
@@ -15,33 +15,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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 extends core::Object implements self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
-abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<core::int> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<core::int*> {
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
index f4273b4..d520fcd 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.outline.expect
@@ -15,30 +15,30 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int*> {
+  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
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
index 0c7e099..79557a6 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_3.dart.strong.expect
@@ -15,33 +15,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
-abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<core::int*> {
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
index 969931b..26a4751 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.expect
@@ -10,33 +10,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+class A extends self::_A&Object&M0&M1 implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
index b25c51d..f944fb1 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.legacy.transformed.expect
@@ -10,33 +10,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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 extends core::Object implements self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+class A extends self::_A&Object&M0&M1 implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
index 96a22ac..1fed224 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.outline.expect
@@ -10,30 +10,30 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+class M0<T extends core::Object* = dynamic> extends core::Object implements self::I<self::M0::T*> {
+  synthetic constructor •() → self::M0<self::M0::T*>*
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+class M1<T extends core::Object* = dynamic> extends self::I<self::M1::T*> {
+  synthetic constructor •() → self::M1<self::M1::T*>*
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+class A extends self::_A&Object&M0&M1 implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
index 969931b..26a4751 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_outwards_4.dart.strong.expect
@@ -10,33 +10,33 @@
 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>
+class I<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::X*>*
     : super core::Object::•()
     ;
 }
-class M0<T extends core::Object = dynamic> extends core::Object implements self::I<self::M0::T> {
-  synthetic constructor •() → self::M0<self::M0::T>
+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::•()
     ;
 }
-class M1<T extends core::Object = dynamic> extends self::I<self::M1::T> {
-  synthetic constructor •() → self::M1<self::M1::T>
+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> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+class A extends self::_A&Object&M0&M1 implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
index 59abdc5..468cb8ce 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.expect
@@ -15,33 +15,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
index 6a20389..f084077 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.legacy.transformed.expect
@@ -15,33 +15,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
index 1858f05..9990964 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.outline.expect
@@ -15,30 +15,30 @@
 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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
index 59abdc5..468cb8ce 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_1.dart.strong.expect
@@ -15,33 +15,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
index 1ed537d..47897de 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.expect
@@ -17,33 +17,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
index 8b678a5..939245b 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.legacy.transformed.expect
@@ -17,33 +17,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 extends core::Object implements self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 extends self::_A&Object&M0 implements self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
index aa39cba..acf7065 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.outline.expect
@@ -17,30 +17,30 @@
 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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
 abstract class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
index 1ed537d..47897de 100644
--- a/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/mixin_inference_unification_2.dart.strong.expect
@@ -17,33 +17,33 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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 class _A&Object&M0 = core::Object with self::M0<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0
+  const synthetic constructor •() → self::_A&Object&M0*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&M0&M1 = self::_A&Object&M0 with self::M1<dynamic> {
-  const synthetic constructor •() → self::_A&Object&M0&M1
+  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
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M0&M1::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect
index f130963..fb95dc3 100644
--- a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::num x = 3;
+  core::num* x = 3;
   x = null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect
index f130963..fb95dc3 100644
--- a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::num x = 3;
+  core::num* x = 3;
   x = null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.expect
index f130963..fb95dc3 100644
--- a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::num x = 3;
+  core::num* x = 3;
   x = null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.transformed.expect
index f130963..fb95dc3 100644
--- a/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/no_error_when_declared_type_is_num_and_assigned_null.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method test1() → dynamic {
-  core::num x = 3;
+  core::num* x = 3;
   x = null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart b/pkg/front_end/testcases/inference/non_const_invocation.dart
index 33005b8..03c93ec 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart
@@ -8,16 +8,16 @@
 typedef V F<U, V>(U u);
 
 class Foo<T> {
-  Bar<T> get v1 => new /*@typeArgs=Foo::T*/ Bar();
-  Bar<List<T>> get v2 => new /*@typeArgs=List<Foo::T>*/ Bar();
-  Bar<F<T, T>> get v3 => new /*@typeArgs=(Foo::T) -> Foo::T*/ Bar();
+  Bar<T> get v1 => new /*@ typeArgs=Foo::T* */ Bar();
+  Bar<List<T>> get v2 => new /*@ typeArgs=List<Foo::T*>* */ Bar();
+  Bar<F<T, T>> get v3 => new /*@ typeArgs=(Foo::T*) ->* Foo::T* */ Bar();
   Bar<F<F<T, T>, T>> get v4 =>
-      new /*@typeArgs=((Foo::T) -> Foo::T) -> Foo::T*/ Bar();
-  List<T> get v5 => /*@typeArgs=Foo::T*/ [];
-  List<F<T, T>> get v6 => /*@typeArgs=(Foo::T) -> Foo::T*/ [];
-  Map<T, T> get v7 => /*@typeArgs=Foo::T, Foo::T*/ {};
-  Map<F<T, T>, T> get v8 => /*@typeArgs=(Foo::T) -> Foo::T, Foo::T*/ {};
-  Map<T, F<T, T>> get v9 => /*@typeArgs=Foo::T, (Foo::T) -> Foo::T*/ {};
+      new /*@ typeArgs=((Foo::T*) ->* Foo::T*) ->* Foo::T* */ Bar();
+  List<T> get v5 => /*@ typeArgs=Foo::T* */ [];
+  List<F<T, T>> get v6 => /*@ typeArgs=(Foo::T*) ->* Foo::T* */ [];
+  Map<T, T> get v7 => /*@ typeArgs=Foo::T*, Foo::T* */ {};
+  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Foo::T*) ->* Foo::T*, Foo::T* */ {};
+  Map<T, F<T, T>> get v9 => /*@ typeArgs=Foo::T*, (Foo::T*) ->* Foo::T* */ {};
 }
 
 class Bar<T> {
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect
index 56fd49a..80473db 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.expect
@@ -2,32 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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>
+  get v1() → self::Bar<self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
     return new self::Bar::•<dynamic>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v5() → core::List<self::Foo::T>
+  get v5() → core::List<self::Foo::T*>*
     return <dynamic>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
     return <dynamic>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
     return <dynamic, dynamic>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
     return <dynamic, dynamic>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
     return <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect
index 56fd49a..80473db 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.legacy.transformed.expect
@@ -2,32 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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>
+  get v1() → self::Bar<self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
     return new self::Bar::•<dynamic>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
     return new self::Bar::•<dynamic>();
-  get v5() → core::List<self::Foo::T>
+  get v5() → core::List<self::Foo::T*>*
     return <dynamic>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
     return <dynamic>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
     return <dynamic, dynamic>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
     return <dynamic, dynamic>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
     return <dynamic, dynamic>{};
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
index 737a958..e56ff7a 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.outline.expect
@@ -2,31 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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*>*
     ;
-  get v1() → self::Bar<self::Foo::T>
+  get v1() → self::Bar<self::Foo::T*>*
     ;
-  get v2() → self::Bar<core::List<self::Foo::T>>
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
     ;
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v5() → core::List<self::Foo::T>
+  get v5() → core::List<self::Foo::T*>*
     ;
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
     ;
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
     ;
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
     ;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
index b3e0f8e..1124614 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.expect
@@ -2,32 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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>{};
+  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*>{};
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
index b3e0f8e..1124614 100644
--- a/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_const_invocation.dart.strong.transformed.expect
@@ -2,32 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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>{};
+  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*>{};
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect
index 3820a61..1307bc3 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect
index 3820a61..1307bc3 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.outline.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.outline.expect
index f835c21..7e30a9a 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   get x() → dynamic
     ;
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.expect
index 3820a61..1307bc3 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.transformed.expect
index 3820a61..1307bc3 100644
--- a/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/non_inferrable_getter_setter.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
index efe4063..13e2704 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart
@@ -10,7 +10,7 @@
 }
 
 g(C c) {
-  var /*@type=int*/ x = c?. /*@target=C::f*/ f();
+  var /*@ type=int* */ x = c?. /*@target=C::f*/ f();
   c?. /*@target=C::f*/ f();
 }
 
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect
index 441493f..ae8bd8e 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return null;
 }
-static method g(self::C c) → dynamic {
+static method g(self::C* c) → dynamic {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f();
   let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f();
 }
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect
index 441493f..ae8bd8e 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return null;
 }
-static method g(self::C c) → dynamic {
+static method g(self::C* c) → dynamic {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f();
   let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f();
 }
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.outline.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.outline.expect
index 9f282f1..6bf2612 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method f() → core::int
+  method f() → core::int*
     ;
 }
-static method g(self::C c) → dynamic
+static method g(self::C* c) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.expect
index 393089c..718b355 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return null;
 }
-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}();
-  let final self::C #t2 = c in #t2.==(null) ?{core::int} null : #t2.{self::C::f}();
+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}();
+  let final self::C* #t2 = c in #t2.==(null) ?{core::int*} null : #t2.{self::C::f}();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.transformed.expect
index 393089c..718b355 100644
--- a/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_method_invocation.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return null;
 }
-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}();
-  let final self::C #t2 = c in #t2.==(null) ?{core::int} null : #t2.{self::C::f}();
+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}();
+  let final self::C* #t2 = c in #t2.==(null) ?{core::int*} null : #t2.{self::C::f}();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart b/pkg/front_end/testcases/inference/null_aware_property_get.dart
index 0076437..f565a26 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart
@@ -10,7 +10,7 @@
 }
 
 void f(C c) {
-  var /*@type=int*/ x = c?. /*@target=C::x*/ x;
+  var /*@ type=int* */ x = c?. /*@target=C::x*/ x;
   c?. /*@target=C::x*/ x;
 }
 
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect
index c95dc59..054273a 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static method f(self::C c) → void {
+static method f(self::C* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.x;
   let final dynamic #t2 = c in #t2.==(null) ? null : #t2.x;
 }
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect
index c95dc59..054273a 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static method f(self::C c) → void {
+static method f(self::C* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.x;
   let final dynamic #t2 = c in #t2.==(null) ? null : #t2.x;
 }
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.outline.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.outline.expect
index b3a2501..363142de 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x;
-  synthetic constructor •() → self::C
+  field core::int* x;
+  synthetic constructor •() → self::C*
     ;
 }
-static method f(self::C c) → void
+static method f(self::C* c) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.expect
index 5e197d9..4c40eb5 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-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};
-  let final self::C #t2 = c in #t2.==(null) ?{core::int} null : #t2.{self::C::x};
+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};
+  let final self::C* #t2 = c in #t2.==(null) ?{core::int*} null : #t2.{self::C::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.transformed.expect
index 5e197d9..4c40eb5 100644
--- a/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_aware_property_get.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-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};
-  let final self::C #t2 = c in #t2.==(null) ?{core::int} null : #t2.{self::C::x};
+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};
+  let final self::C* #t2 = c in #t2.==(null) ?{core::int*} null : #t2.{self::C::x};
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart b/pkg/front_end/testcases/inference/null_coalescing_operator.dart
index 952477e..ac55bb7 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart
@@ -7,6 +7,6 @@
 
 main() {
   List<int> x;
-  var /*@type=List<int>*/ y = x ?? /*@typeArgs=int*/ [];
+  var /*@ type=List<int*>* */ y = x ?? /*@ typeArgs=int* */ [];
   List<int> z = y;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect
index a976d56..9085c72 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> x;
+  core::List<core::int*>* x;
   dynamic y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
-  core::List<core::int> z = y;
+  core::List<core::int*>* z = y;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect
index a976d56..9085c72 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> x;
+  core::List<core::int*>* x;
   dynamic y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
-  core::List<core::int> z = y;
+  core::List<core::int*>* z = y;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.expect
index a6ef2bf..f2e6ea1 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.expect
@@ -3,7 +3,7 @@
 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;
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.transformed.expect
index a6ef2bf..f2e6ea1 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 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;
+  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 b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
index 5791d03..c8888a7 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart
@@ -7,5 +7,5 @@
 
 main() {
   List<int> x;
-  List<num> y = x ?? /*@typeArgs=num*/ [];
+  List<num> y = x ?? /*@ typeArgs=num* */ [];
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect
index 5e3c00d..c15c93c 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> x;
-  core::List<core::num> y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
+  core::List<core::int*>* x;
+  core::List<core::num*>* y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect
index 5e3c00d..c15c93c 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.legacy.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> x;
-  core::List<core::num> y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
+  core::List<core::int*>* x;
+  core::List<core::num*>* y = let final dynamic #t1 = x in #t1.==(null) ? <dynamic>[] : #t1;
 }
diff --git a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.expect
index 033616f..1b28952 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.expect
@@ -3,6 +3,6 @@
 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;
+  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_coalescing_operator_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.transformed.expect
index 033616f..1b28952 100644
--- a/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_coalescing_operator_2.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 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;
+  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 b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
index 2eb6926..2bcd9b9 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart
@@ -9,20 +9,20 @@
 void foo(int f(Object _)) {}
 
 test() {
-  var /*@type=(Object) -> Null*/ f = /*@returnType=Null*/ (Object x) => null;
+  var /*@ type=(Object*) ->* Null* */ f = /*@ returnType=Null* */ (Object x) => null;
   String y = /*info:DYNAMIC_CAST*/ f(42);
 
-  f = /*@returnType=Null*/ (/*@type=Object*/ x) => 'hello';
+  f = /*@ returnType=Null* */ (/*@ type=Object* */ x) => 'hello';
 
-  var /*@type=dynamic*/ g = null;
+  var /*@ type=dynamic */ g = null;
   g = 'hello';
   (/*info:DYNAMIC_INVOKE*/ g.foo());
 
   h = 'hello';
   (/*info:DYNAMIC_INVOKE*/ h.foo());
 
-  foo(/*@returnType=Null*/ (/*@type=Object*/ x) => null);
-  foo(/*@returnType=<BottomType>*/ (/*@type=Object*/ x) =>
+  foo(/*@ returnType=Null* */ (/*@ type=Object* */ x) => null);
+  foo(/*@ returnType=<BottomType> */ (/*@ type=Object* */ x) =>
       throw "not implemented");
 }
 
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect
index f592726..985c932 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  dynamic f = (core::Object x) → dynamic => null;
-  core::String y = f.call(42);
+  dynamic f = (core::Object* x) → dynamic => null;
+  core::String* y = f.call(42);
   f = (dynamic x) → dynamic => "hello";
   dynamic g = null;
   g = "hello";
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect
index f592726..985c932 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  dynamic f = (core::Object x) → dynamic => null;
-  core::String y = f.call(42);
+  dynamic f = (core::Object* x) → dynamic => null;
+  core::String* y = f.call(42);
   f = (dynamic x) → dynamic => "hello";
   dynamic g = null;
   g = "hello";
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
index 00a18ed..f63bf12 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object) → core::Null f = (core::Object x) → core::Null => null;
-  core::String y = f.call(42);
-  f = (core::Object x) → core::Null => "hello" as{TypeError} core::Null;
+  (core::Object*) →* core::Null* f = (core::Object* x) → core::Null* => null;
+  core::String* y = f.call(42);
+  f = (core::Object* x) → core::Null* => "hello" as{TypeError} core::Null*;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object x) → core::Null => null);
-  self::foo((core::Object x) → <BottomType>=> throw "not implemented");
+  self::foo((core::Object* x) → core::Null* => null);
+  self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
index 00a18ed..f63bf12 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 static field dynamic h = null;
-static method foo((core::Object) → core::int f) → void {}
+static method foo((core::Object*) →* core::int* f) → void {}
 static method test() → dynamic {
-  (core::Object) → core::Null f = (core::Object x) → core::Null => null;
-  core::String y = f.call(42);
-  f = (core::Object x) → core::Null => "hello" as{TypeError} core::Null;
+  (core::Object*) →* core::Null* f = (core::Object* x) → core::Null* => null;
+  core::String* y = f.call(42);
+  f = (core::Object* x) → core::Null* => "hello" as{TypeError} core::Null*;
   dynamic g = null;
   g = "hello";
   g.foo();
   self::h = "hello";
   self::h.foo();
-  self::foo((core::Object x) → core::Null => null);
-  self::foo((core::Object x) → <BottomType>=> throw "not implemented");
+  self::foo((core::Object* x) → core::Null* => null);
+  self::foo((core::Object* x) → <BottomType>=> throw "not implemented");
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
index 8eb4001..43e9255 100644
--- a/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@348
-  f = /*@returnType=Null*/ (/*@type=Object*/ x) => 'hello';
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:15:5: Context: Write to f@353
+  f = /*@ returnType=Null* */ (/*@ type=Object* */ x) => 'hello';
     ^
-pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@521
+pkg/front_end/testcases/inference/null_literal_should_not_infer_as_bottom.dart:18:5: Context: Write to g@537
   g = 'hello';
     ^
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart b/pkg/front_end/testcases/inference/overloaded_int_operators.dart
index 9174424..64d74b4 100644
--- a/pkg/front_end/testcases/inference/overloaded_int_operators.dart
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart
@@ -11,56 +11,56 @@
   double d = 1.0;
 
   // (double, double) -> double
-  var /*@type=double*/ ddPlus = d /*@target=double::+*/ + d;
-  var /*@type=double*/ ddMinus = d /*@target=double::-*/ - d;
-  var /*@type=double*/ ddTimes = d /*@target=double::**/ * d;
-  var /*@type=double*/ ddMod = d /*@target=double::%*/ % d;
+  var /*@ type=double* */ ddPlus = d /*@target=double::+*/ + d;
+  var /*@ type=double* */ ddMinus = d /*@target=double::-*/ - d;
+  var /*@ type=double* */ ddTimes = d /*@target=double::**/ * d;
+  var /*@ type=double* */ ddMod = d /*@target=double::%*/ % d;
 
   // (double, int) -> double
-  var /*@type=double*/ diPlus = d /*@target=double::+*/ + i;
-  var /*@type=double*/ diMinus = d /*@target=double::-*/ - i;
-  var /*@type=double*/ diTimes = d /*@target=double::**/ * i;
-  var /*@type=double*/ diMod = d /*@target=double::%*/ % i;
+  var /*@ type=double* */ diPlus = d /*@target=double::+*/ + i;
+  var /*@ type=double* */ diMinus = d /*@target=double::-*/ - i;
+  var /*@ type=double* */ diTimes = d /*@target=double::**/ * i;
+  var /*@ type=double* */ diMod = d /*@target=double::%*/ % i;
 
   // (double, num) -> double
-  var /*@type=double*/ dnPlus = d /*@target=double::+*/ + n;
-  var /*@type=double*/ dnMinus = d /*@target=double::-*/ - n;
-  var /*@type=double*/ dnTimes = d /*@target=double::**/ * n;
-  var /*@type=double*/ dnMod = d /*@target=double::%*/ % n;
+  var /*@ type=double* */ dnPlus = d /*@target=double::+*/ + n;
+  var /*@ type=double* */ dnMinus = d /*@target=double::-*/ - n;
+  var /*@ type=double* */ dnTimes = d /*@target=double::**/ * n;
+  var /*@ type=double* */ dnMod = d /*@target=double::%*/ % n;
 
   // (int, double) -> double
-  var /*@type=double*/ idPlus = i /*@target=num::+*/ + d;
-  var /*@type=double*/ idMinus = i /*@target=num::-*/ - d;
-  var /*@type=double*/ idTimes = i /*@target=num::**/ * d;
-  var /*@type=double*/ idMod = i /*@target=num::%*/ % d;
+  var /*@ type=double* */ idPlus = i /*@target=num::+*/ + d;
+  var /*@ type=double* */ idMinus = i /*@target=num::-*/ - d;
+  var /*@ type=double* */ idTimes = i /*@target=num::**/ * d;
+  var /*@ type=double* */ idMod = i /*@target=num::%*/ % d;
 
   // (int, int) -> int
-  var /*@type=int*/ iiPlus = i /*@target=num::+*/ + i;
-  var /*@type=int*/ iiMinus = i /*@target=num::-*/ - i;
-  var /*@type=int*/ iiTimes = i /*@target=num::**/ * i;
-  var /*@type=int*/ iiMod = i /*@target=num::%*/ % i;
+  var /*@ type=int* */ iiPlus = i /*@target=num::+*/ + i;
+  var /*@ type=int* */ iiMinus = i /*@target=num::-*/ - i;
+  var /*@ type=int* */ iiTimes = i /*@target=num::**/ * i;
+  var /*@ type=int* */ iiMod = i /*@target=num::%*/ % i;
 
   // (int, num) -> num
-  var /*@type=num*/ inPlus = i /*@target=num::+*/ + n;
-  var /*@type=num*/ inMinus = i /*@target=num::-*/ - n;
-  var /*@type=num*/ inTimes = i /*@target=num::**/ * n;
-  var /*@type=num*/ inMod = i /*@target=num::%*/ % n;
+  var /*@ type=num* */ inPlus = i /*@target=num::+*/ + n;
+  var /*@ type=num* */ inMinus = i /*@target=num::-*/ - n;
+  var /*@ type=num* */ inTimes = i /*@target=num::**/ * n;
+  var /*@ type=num* */ inMod = i /*@target=num::%*/ % n;
 
   // (num, double) -> num
-  var /*@type=num*/ ndPlus = n /*@target=num::+*/ + d;
-  var /*@type=num*/ ndMinus = n /*@target=num::-*/ - d;
-  var /*@type=num*/ ndTimes = n /*@target=num::**/ * d;
-  var /*@type=num*/ ndMod = n /*@target=num::%*/ % d;
+  var /*@ type=num* */ ndPlus = n /*@target=num::+*/ + d;
+  var /*@ type=num* */ ndMinus = n /*@target=num::-*/ - d;
+  var /*@ type=num* */ ndTimes = n /*@target=num::**/ * d;
+  var /*@ type=num* */ ndMod = n /*@target=num::%*/ % d;
 
   // (num, int) -> num
-  var /*@type=num*/ niPlus = n /*@target=num::+*/ + i;
-  var /*@type=num*/ niMinus = n /*@target=num::-*/ - i;
-  var /*@type=num*/ niTimes = n /*@target=num::**/ * i;
-  var /*@type=num*/ niMod = n /*@target=num::%*/ % i;
+  var /*@ type=num* */ niPlus = n /*@target=num::+*/ + i;
+  var /*@ type=num* */ niMinus = n /*@target=num::-*/ - i;
+  var /*@ type=num* */ niTimes = n /*@target=num::**/ * i;
+  var /*@ type=num* */ niMod = n /*@target=num::%*/ % i;
 
   // (num, num) -> num
-  var /*@type=num*/ nnPlus = n /*@target=num::+*/ + n;
-  var /*@type=num*/ nnMinus = n /*@target=num::-*/ - n;
-  var /*@type=num*/ nnTimes = n /*@target=num::**/ * n;
-  var /*@type=num*/ nnMod = n /*@target=num::%*/ % n;
+  var /*@ type=num* */ nnPlus = n /*@target=num::+*/ + n;
+  var /*@ type=num* */ nnMinus = n /*@target=num::-*/ - n;
+  var /*@ type=num* */ nnTimes = n /*@target=num::**/ * n;
+  var /*@ type=num* */ nnMod = n /*@target=num::%*/ % n;
 }
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect
index b45cd7e..2334b3b 100644
--- a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = 1;
-  core::int i = 1;
-  core::double d = 1.0;
+  core::num* n = 1;
+  core::int* i = 1;
+  core::double* d = 1.0;
   dynamic ddPlus = d.+(d);
   dynamic ddMinus = d.-(d);
   dynamic ddTimes = d.*(d);
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect
index b45cd7e..2334b3b 100644
--- a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.legacy.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = 1;
-  core::int i = 1;
-  core::double d = 1.0;
+  core::num* n = 1;
+  core::int* i = 1;
+  core::double* d = 1.0;
   dynamic ddPlus = d.+(d);
   dynamic ddMinus = d.-(d);
   dynamic ddTimes = d.*(d);
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.expect
index 8eaa200..6a9ab0d 100644
--- a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.expect
@@ -3,43 +3,43 @@
 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::double ddMinus = d.{core::double::-}(d);
-  core::double ddTimes = d.{core::double::*}(d);
-  core::double ddMod = d.{core::double::%}(d);
-  core::double diPlus = d.{core::double::+}(i);
-  core::double diMinus = d.{core::double::-}(i);
-  core::double diTimes = d.{core::double::*}(i);
-  core::double diMod = d.{core::double::%}(i);
-  core::double dnPlus = d.{core::double::+}(n);
-  core::double dnMinus = d.{core::double::-}(n);
-  core::double dnTimes = d.{core::double::*}(n);
-  core::double dnMod = d.{core::double::%}(n);
-  core::double idPlus = i.{core::num::+}(d);
-  core::double idMinus = i.{core::num::-}(d);
-  core::double idTimes = i.{core::num::*}(d);
-  core::double idMod = i.{core::num::%}(d);
-  core::int iiPlus = i.{core::num::+}(i);
-  core::int iiMinus = i.{core::num::-}(i);
-  core::int iiTimes = i.{core::num::*}(i);
-  core::int iiMod = i.{core::num::%}(i);
-  core::num inPlus = i.{core::num::+}(n);
-  core::num inMinus = i.{core::num::-}(n);
-  core::num inTimes = i.{core::num::*}(n);
-  core::num inMod = i.{core::num::%}(n);
-  core::num ndPlus = n.{core::num::+}(d);
-  core::num ndMinus = n.{core::num::-}(d);
-  core::num ndTimes = n.{core::num::*}(d);
-  core::num ndMod = n.{core::num::%}(d);
-  core::num niPlus = n.{core::num::+}(i);
-  core::num niMinus = n.{core::num::-}(i);
-  core::num niTimes = n.{core::num::*}(i);
-  core::num niMod = n.{core::num::%}(i);
-  core::num nnPlus = n.{core::num::+}(n);
-  core::num nnMinus = n.{core::num::-}(n);
-  core::num nnTimes = n.{core::num::*}(n);
-  core::num nnMod = n.{core::num::%}(n);
+  core::num* n = 1;
+  core::int* i = 1;
+  core::double* d = 1.0;
+  core::double* ddPlus = d.{core::double::+}(d);
+  core::double* ddMinus = d.{core::double::-}(d);
+  core::double* ddTimes = d.{core::double::*}(d);
+  core::double* ddMod = d.{core::double::%}(d);
+  core::double* diPlus = d.{core::double::+}(i);
+  core::double* diMinus = d.{core::double::-}(i);
+  core::double* diTimes = d.{core::double::*}(i);
+  core::double* diMod = d.{core::double::%}(i);
+  core::double* dnPlus = d.{core::double::+}(n);
+  core::double* dnMinus = d.{core::double::-}(n);
+  core::double* dnTimes = d.{core::double::*}(n);
+  core::double* dnMod = d.{core::double::%}(n);
+  core::double* idPlus = i.{core::num::+}(d);
+  core::double* idMinus = i.{core::num::-}(d);
+  core::double* idTimes = i.{core::num::*}(d);
+  core::double* idMod = i.{core::num::%}(d);
+  core::int* iiPlus = i.{core::num::+}(i);
+  core::int* iiMinus = i.{core::num::-}(i);
+  core::int* iiTimes = i.{core::num::*}(i);
+  core::int* iiMod = i.{core::num::%}(i);
+  core::num* inPlus = i.{core::num::+}(n);
+  core::num* inMinus = i.{core::num::-}(n);
+  core::num* inTimes = i.{core::num::*}(n);
+  core::num* inMod = i.{core::num::%}(n);
+  core::num* ndPlus = n.{core::num::+}(d);
+  core::num* ndMinus = n.{core::num::-}(d);
+  core::num* ndTimes = n.{core::num::*}(d);
+  core::num* ndMod = n.{core::num::%}(d);
+  core::num* niPlus = n.{core::num::+}(i);
+  core::num* niMinus = n.{core::num::-}(i);
+  core::num* niTimes = n.{core::num::*}(i);
+  core::num* niMod = n.{core::num::%}(i);
+  core::num* nnPlus = n.{core::num::+}(n);
+  core::num* nnMinus = n.{core::num::-}(n);
+  core::num* nnTimes = n.{core::num::*}(n);
+  core::num* nnMod = n.{core::num::%}(n);
 }
diff --git a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.transformed.expect
index 8eaa200..6a9ab0d 100644
--- a/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/overloaded_int_operators.dart.strong.transformed.expect
@@ -3,43 +3,43 @@
 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::double ddMinus = d.{core::double::-}(d);
-  core::double ddTimes = d.{core::double::*}(d);
-  core::double ddMod = d.{core::double::%}(d);
-  core::double diPlus = d.{core::double::+}(i);
-  core::double diMinus = d.{core::double::-}(i);
-  core::double diTimes = d.{core::double::*}(i);
-  core::double diMod = d.{core::double::%}(i);
-  core::double dnPlus = d.{core::double::+}(n);
-  core::double dnMinus = d.{core::double::-}(n);
-  core::double dnTimes = d.{core::double::*}(n);
-  core::double dnMod = d.{core::double::%}(n);
-  core::double idPlus = i.{core::num::+}(d);
-  core::double idMinus = i.{core::num::-}(d);
-  core::double idTimes = i.{core::num::*}(d);
-  core::double idMod = i.{core::num::%}(d);
-  core::int iiPlus = i.{core::num::+}(i);
-  core::int iiMinus = i.{core::num::-}(i);
-  core::int iiTimes = i.{core::num::*}(i);
-  core::int iiMod = i.{core::num::%}(i);
-  core::num inPlus = i.{core::num::+}(n);
-  core::num inMinus = i.{core::num::-}(n);
-  core::num inTimes = i.{core::num::*}(n);
-  core::num inMod = i.{core::num::%}(n);
-  core::num ndPlus = n.{core::num::+}(d);
-  core::num ndMinus = n.{core::num::-}(d);
-  core::num ndTimes = n.{core::num::*}(d);
-  core::num ndMod = n.{core::num::%}(d);
-  core::num niPlus = n.{core::num::+}(i);
-  core::num niMinus = n.{core::num::-}(i);
-  core::num niTimes = n.{core::num::*}(i);
-  core::num niMod = n.{core::num::%}(i);
-  core::num nnPlus = n.{core::num::+}(n);
-  core::num nnMinus = n.{core::num::-}(n);
-  core::num nnTimes = n.{core::num::*}(n);
-  core::num nnMod = n.{core::num::%}(n);
+  core::num* n = 1;
+  core::int* i = 1;
+  core::double* d = 1.0;
+  core::double* ddPlus = d.{core::double::+}(d);
+  core::double* ddMinus = d.{core::double::-}(d);
+  core::double* ddTimes = d.{core::double::*}(d);
+  core::double* ddMod = d.{core::double::%}(d);
+  core::double* diPlus = d.{core::double::+}(i);
+  core::double* diMinus = d.{core::double::-}(i);
+  core::double* diTimes = d.{core::double::*}(i);
+  core::double* diMod = d.{core::double::%}(i);
+  core::double* dnPlus = d.{core::double::+}(n);
+  core::double* dnMinus = d.{core::double::-}(n);
+  core::double* dnTimes = d.{core::double::*}(n);
+  core::double* dnMod = d.{core::double::%}(n);
+  core::double* idPlus = i.{core::num::+}(d);
+  core::double* idMinus = i.{core::num::-}(d);
+  core::double* idTimes = i.{core::num::*}(d);
+  core::double* idMod = i.{core::num::%}(d);
+  core::int* iiPlus = i.{core::num::+}(i);
+  core::int* iiMinus = i.{core::num::-}(i);
+  core::int* iiTimes = i.{core::num::*}(i);
+  core::int* iiMod = i.{core::num::%}(i);
+  core::num* inPlus = i.{core::num::+}(n);
+  core::num* inMinus = i.{core::num::-}(n);
+  core::num* inTimes = i.{core::num::*}(n);
+  core::num* inMod = i.{core::num::%}(n);
+  core::num* ndPlus = n.{core::num::+}(d);
+  core::num* ndMinus = n.{core::num::-}(d);
+  core::num* ndTimes = n.{core::num::*}(d);
+  core::num* ndMod = n.{core::num::%}(d);
+  core::num* niPlus = n.{core::num::+}(i);
+  core::num* niMinus = n.{core::num::-}(i);
+  core::num* niTimes = n.{core::num::*}(i);
+  core::num* niMod = n.{core::num::%}(i);
+  core::num* nnPlus = n.{core::num::+}(n);
+  core::num* nnMinus = n.{core::num::-}(n);
+  core::num* nnTimes = n.{core::num::*}(n);
+  core::num* nnMod = n.{core::num::%}(n);
 }
diff --git a/pkg/front_end/testcases/inference/override_equals.dart b/pkg/front_end/testcases/inference/override_equals.dart
index 3037654..02ad16f 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart
+++ b/pkg/front_end/testcases/inference/override_equals.dart
@@ -12,25 +12,25 @@
 
 class SubNullEquality extends NullEquality {
   void test() {
-    var /*@type=bool*/ super_equals_self =
+    var /*@ type=bool* */ super_equals_self =
         super /*@target=NullEquality::==*/ == this;
-    var /*@type=bool*/ super_equals_null =
+    var /*@ type=bool* */ super_equals_null =
         super /*@target=NullEquality::==*/ == null;
-    var /*@type=bool*/ super_not_equals_self =
+    var /*@ type=bool* */ super_not_equals_self =
         super /*@target=NullEquality::==*/ != this;
-    var /*@type=bool*/ super_not_equals_null =
+    var /*@ type=bool* */ super_not_equals_null =
         super /*@target=NullEquality::==*/ != null;
   }
 }
 
 test() {
   NullEquality n = new NullEquality();
-  var /*@type=bool*/ equals_self = n /*@target=NullEquality::==*/ == n;
-  var /*@type=bool*/ equals_null = n /*@target=NullEquality::==*/ == null;
-  var /*@type=bool*/ null_equals = null /*@target=Object::==*/ == n;
-  var /*@type=bool*/ not_equals_self = n /*@target=NullEquality::==*/ != n;
-  var /*@type=bool*/ not_equals_null = n /*@target=NullEquality::==*/ != null;
-  var /*@type=bool*/ null_not_equals = null /*@target=Object::==*/ != n;
+  var /*@ type=bool* */ equals_self = n /*@target=NullEquality::==*/ == n;
+  var /*@ type=bool* */ equals_null = n /*@target=NullEquality::==*/ == null;
+  var /*@ type=bool* */ null_equals = null /*@target=Object::==*/ == n;
+  var /*@ type=bool* */ not_equals_self = n /*@target=NullEquality::==*/ != n;
+  var /*@ type=bool* */ not_equals_null = n /*@target=NullEquality::==*/ != null;
+  var /*@ type=bool* */ null_not_equals = null /*@target=Object::==*/ != n;
 }
 
 main() {
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
index 41bfd6e..7a2bc9e 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → self::NullEquality
+  synthetic constructor •() → self::NullEquality*
     ;
   @core::override
-  operator ==(core::Object other) → core::Null
+  operator ==(core::Object* other) → core::Null*
     ;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → self::SubNullEquality
+  synthetic constructor •() → self::SubNullEquality*
     ;
   method test() → void
     ;
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
index fe2d4a0..83704d2 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.expect
@@ -3,34 +3,38 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → self::NullEquality
+  synthetic constructor •() → self::NullEquality*
     : super core::Object::•()
     ;
-  @core::override
-  operator ==(core::Object other) → core::Null
+  @#C1
+  operator ==(core::Object* other) → core::Null*
     return null;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → self::SubNullEquality
+  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);
+    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::==}(n);
-  core::bool equals_null = n.{self::NullEquality::==}(null);
-  core::bool null_equals = null.{core::Object::==}(n);
-  core::bool not_equals_self = !n.{self::NullEquality::==}(n);
-  core::bool not_equals_null = !n.{self::NullEquality::==}(null);
-  core::bool null_not_equals = !null.{core::Object::==}(n);
+  self::NullEquality* n = new self::NullEquality::•();
+  core::bool* equals_self = n.{self::NullEquality::==}(n);
+  core::bool* equals_null = n.{self::NullEquality::==}(null);
+  core::bool* null_equals = null.{core::Object::==}(n);
+  core::bool* not_equals_self = !n.{self::NullEquality::==}(n);
+  core::bool* not_equals_null = !n.{self::NullEquality::==}(null);
+  core::bool* null_not_equals = !null.{core::Object::==}(n);
 }
 static method main() → dynamic {
   self::test();
   new self::SubNullEquality::•().{self::SubNullEquality::test}();
 }
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
index fe2d4a0..83704d2 100644
--- a/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_equals.dart.strong.transformed.expect
@@ -3,34 +3,38 @@
 import "dart:core" as core;
 
 class NullEquality extends core::Object {
-  synthetic constructor •() → self::NullEquality
+  synthetic constructor •() → self::NullEquality*
     : super core::Object::•()
     ;
-  @core::override
-  operator ==(core::Object other) → core::Null
+  @#C1
+  operator ==(core::Object* other) → core::Null*
     return null;
 }
 class SubNullEquality extends self::NullEquality {
-  synthetic constructor •() → self::SubNullEquality
+  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);
+    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::==}(n);
-  core::bool equals_null = n.{self::NullEquality::==}(null);
-  core::bool null_equals = null.{core::Object::==}(n);
-  core::bool not_equals_self = !n.{self::NullEquality::==}(n);
-  core::bool not_equals_null = !n.{self::NullEquality::==}(null);
-  core::bool null_not_equals = !null.{core::Object::==}(n);
+  self::NullEquality* n = new self::NullEquality::•();
+  core::bool* equals_self = n.{self::NullEquality::==}(n);
+  core::bool* equals_null = n.{self::NullEquality::==}(null);
+  core::bool* null_equals = null.{core::Object::==}(n);
+  core::bool* not_equals_self = !n.{self::NullEquality::==}(n);
+  core::bool* not_equals_null = !n.{self::NullEquality::==}(null);
+  core::bool* null_not_equals = !null.{core::Object::==}(n);
 }
 static method main() → dynamic {
   self::test();
   new self::SubNullEquality::•().{self::SubNullEquality::test}();
 }
+
+constants  {
+  #C1 = core::_Override {}
+}
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.expect
index d00064e..b85f061 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = dynamic> extends core::Object {
+class A<X extends core::Object* = dynamic> extends core::Object {
   final field dynamic foo = "bar";
-  synthetic constructor •() → self::A<self::A::X>
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B<Y extends core::Object = dynamic> extends self::A<self::B::Y> {
+class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
   final field dynamic foo;
-  constructor •(dynamic foo) → self::B<self::B::Y>
+  constructor •(dynamic foo) → self::B<self::B::Y*>*
     : self::B::foo = foo, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.transformed.expect
index d00064e..b85f061 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = dynamic> extends core::Object {
+class A<X extends core::Object* = dynamic> extends core::Object {
   final field dynamic foo = "bar";
-  synthetic constructor •() → self::A<self::A::X>
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B<Y extends core::Object = dynamic> extends self::A<self::B::Y> {
+class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
   final field dynamic foo;
-  constructor •(dynamic foo) → self::B<self::B::Y>
+  constructor •(dynamic foo) → self::B<self::B::Y*>*
     : self::B::foo = foo, super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
index 0a5257b..583e980 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Object = dynamic> extends core::Object {
+class A<X extends core::Object* = dynamic> extends core::Object {
   final field dynamic foo;
-  synthetic constructor •() → self::A<self::A::X>
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class B<Y extends core::Object = dynamic> extends self::A<self::B::Y> {
+class B<Y extends core::Object* = dynamic> extends self::A<self::B::Y*> {
   final field dynamic foo;
-  constructor •(dynamic foo) → self::B<self::B::Y>
+  constructor •(dynamic foo) → self::B<self::B::Y*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.expect
index faa19da..3caa2b1 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.transformed.expect
index faa19da..3caa2b1 100644
--- a/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_inference_depends_on_field_inference.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.expect
index a036a98..9675ed5 100644
--- a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.expect
@@ -2,16 +2,20 @@
 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>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  abstract method foo({generic-covariant-impl core::Iterable<self::A::X> x = null}) → void;
+  abstract method foo({generic-covariant-impl core::Iterable<self::A::X*>* x = #C1}) → void;
 }
-class B<Y extends core::Object = dynamic> extends core::Object implements self::A<self::B::Y> {
-  synthetic constructor •() → self::B<self::B::Y>
+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({generic-covariant-impl core::Iterable<self::B::Y> x = null}) → void {}
+  method foo({generic-covariant-impl core::Iterable<self::B::Y*>* x = #C1}) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.transformed.expect
index a036a98..9675ed5 100644
--- a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.legacy.transformed.expect
@@ -2,16 +2,20 @@
 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>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  abstract method foo({generic-covariant-impl core::Iterable<self::A::X> x = null}) → void;
+  abstract method foo({generic-covariant-impl core::Iterable<self::A::X*>* x = #C1}) → void;
 }
-class B<Y extends core::Object = dynamic> extends core::Object implements self::A<self::B::Y> {
-  synthetic constructor •() → self::B<self::B::Y>
+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({generic-covariant-impl core::Iterable<self::B::Y> x = null}) → void {}
+  method foo({generic-covariant-impl core::Iterable<self::B::Y*>* x = #C1}) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.outline.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.outline.expect
index 986c56b..9960cad 100644
--- a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.outline.expect
@@ -2,15 +2,15 @@
 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>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
-  abstract method foo({generic-covariant-impl core::Iterable<self::A::X> x}) → void;
+  abstract method foo({generic-covariant-impl core::Iterable<self::A::X*>* x}) → void;
 }
-class B<Y extends core::Object = dynamic> extends core::Object implements self::A<self::B::Y> {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends core::Object* = dynamic> extends core::Object implements self::A<self::B::Y*> {
+  synthetic constructor •() → self::B<self::B::Y*>*
     ;
-  method foo({generic-covariant-impl core::Iterable<self::B::Y> x}) → void
+  method foo({generic-covariant-impl core::Iterable<self::B::Y*>* x}) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.expect
index a036a98..9675ed5 100644
--- a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.expect
@@ -2,16 +2,20 @@
 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>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  abstract method foo({generic-covariant-impl core::Iterable<self::A::X> x = null}) → void;
+  abstract method foo({generic-covariant-impl core::Iterable<self::A::X*>* x = #C1}) → void;
 }
-class B<Y extends core::Object = dynamic> extends core::Object implements self::A<self::B::Y> {
-  synthetic constructor •() → self::B<self::B::Y>
+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({generic-covariant-impl core::Iterable<self::B::Y> x = null}) → void {}
+  method foo({generic-covariant-impl core::Iterable<self::B::Y*>* x = #C1}) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.transformed.expect
index a036a98..9675ed5 100644
--- a/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/override_inference_with_type_parameters.dart.strong.transformed.expect
@@ -2,16 +2,20 @@
 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>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
-  abstract method foo({generic-covariant-impl core::Iterable<self::A::X> x = null}) → void;
+  abstract method foo({generic-covariant-impl core::Iterable<self::A::X*>* x = #C1}) → void;
 }
-class B<Y extends core::Object = dynamic> extends core::Object implements self::A<self::B::Y> {
-  synthetic constructor •() → self::B<self::B::Y>
+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({generic-covariant-impl core::Iterable<self::B::Y> x = null}) → void {}
+  method foo({generic-covariant-impl core::Iterable<self::B::Y*>* x = #C1}) → void {}
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
index 92b91b8..668875a 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart
@@ -5,15 +5,15 @@
 /*@testedFeatures=inference*/
 library test;
 
-void optional_toplevel([List<int> x = /*@typeArgs=int*/ const []]) {}
+void optional_toplevel([List<int> x = /*@ typeArgs=int* */ const []]) {}
 
-void named_toplevel({List<int> x: /*@typeArgs=int*/ const []}) {}
+void named_toplevel({List<int> x: /*@ typeArgs=int* */ const []}) {}
 
 main() {
-  void optional_local([List<int> x = /*@typeArgs=int*/ const []]) {}
-  void named_local({List<int> x: /*@typeArgs=int*/ const []}) {}
-  var /*@type=([List<int>]) -> Null*/ optional_closure = /*@returnType=Null*/ (
-      [List<int> x = /*@typeArgs=int*/ const []]) {};
-  var /*@type=({x: List<int>}) -> Null*/ name_closure = /*@returnType=Null*/ (
-      {List<int> x: /*@typeArgs=int*/ const []}) {};
+  void optional_local([List<int> x = /*@ typeArgs=int* */ const []]) {}
+  void named_local({List<int> x: /*@ typeArgs=int* */ const []}) {}
+  var /*@ type=([List<int*>*]) ->* Null* */ optional_closure = /*@ returnType=Null* */ (
+      [List<int> x = /*@ typeArgs=int* */ const []]) {};
+  var /*@ type=({x: List<int*>*}) ->* Null* */ name_closure = /*@ returnType=Null* */ (
+      {List<int> x: /*@ typeArgs=int* */ const []}) {};
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect
index 1edb995..560d25c 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method optional_toplevel([core::List<core::int> x = const <dynamic>[]]) → void {}
-static method named_toplevel({core::List<core::int> x = const <dynamic>[]}) → void {}
+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 = const <dynamic>[]]) → void {}
-  function named_local({core::List<core::int> x = const <dynamic>[]}) → void {}
-  dynamic optional_closure = ([core::List<core::int> x = const <dynamic>[]]) → dynamic {};
-  dynamic name_closure = ({core::List<core::int> x = const <dynamic>[]}) → dynamic {};
+  function optional_local([core::List<core::int*>* x = #C1]) → void {}
+  function named_local({core::List<core::int*>* x = #C1}) → void {}
+  dynamic optional_closure = ([core::List<core::int*>* x = #C1]) → dynamic {};
+  dynamic name_closure = ({core::List<core::int*>* x = #C1}) → dynamic {};
+}
+
+constants  {
+  #C1 = <dynamic>[]
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect
index 1edb995..560d25c 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method optional_toplevel([core::List<core::int> x = const <dynamic>[]]) → void {}
-static method named_toplevel({core::List<core::int> x = const <dynamic>[]}) → void {}
+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 = const <dynamic>[]]) → void {}
-  function named_local({core::List<core::int> x = const <dynamic>[]}) → void {}
-  dynamic optional_closure = ([core::List<core::int> x = const <dynamic>[]]) → dynamic {};
-  dynamic name_closure = ({core::List<core::int> x = const <dynamic>[]}) → dynamic {};
+  function optional_local([core::List<core::int*>* x = #C1]) → void {}
+  function named_local({core::List<core::int*>* x = #C1}) → void {}
+  dynamic optional_closure = ([core::List<core::int*>* x = #C1]) → dynamic {};
+  dynamic name_closure = ({core::List<core::int*>* x = #C1}) → dynamic {};
+}
+
+constants  {
+  #C1 = <dynamic>[]
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.outline.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.outline.expect
index 2a261c9..b1b05a2 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method optional_toplevel([core::List<core::int> x]) → void
+static method optional_toplevel([core::List<core::int*>* x]) → void
   ;
-static method named_toplevel({core::List<core::int> x}) → void
+static method named_toplevel({core::List<core::int*>* x}) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
index 72a4648..27d3688 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method optional_toplevel([core::List<core::int> x = const <core::int>[]]) → void {}
-static method named_toplevel({core::List<core::int> x = const <core::int>[]}) → void {}
+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 = const <core::int>[]]) → void {}
-  function named_local({core::List<core::int> x = const <core::int>[]}) → void {}
-  ([core::List<core::int>]) → core::Null optional_closure = ([core::List<core::int> x = const <core::int>[]]) → core::Null {};
-  ({x: core::List<core::int>}) → core::Null name_closure = ({core::List<core::int> x = const <core::int>[]}) → core::Null {};
+  function optional_local([core::List<core::int*>* x = #C1]) → void {}
+  function named_local({core::List<core::int*>* x = #C1}) → void {}
+  ([core::List<core::int*>*]) →* core::Null* optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null* {};
+  ({x: core::List<core::int*>*}) →* core::Null* name_closure = ({core::List<core::int*>* x = #C1}) → core::Null* {};
+}
+
+constants  {
+  #C1 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
index 72a4648..27d3688 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_downwards.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method optional_toplevel([core::List<core::int> x = const <core::int>[]]) → void {}
-static method named_toplevel({core::List<core::int> x = const <core::int>[]}) → void {}
+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 = const <core::int>[]]) → void {}
-  function named_local({core::List<core::int> x = const <core::int>[]}) → void {}
-  ([core::List<core::int>]) → core::Null optional_closure = ([core::List<core::int> x = const <core::int>[]]) → core::Null {};
-  ({x: core::List<core::int>}) → core::Null name_closure = ({core::List<core::int> x = const <core::int>[]}) → core::Null {};
+  function optional_local([core::List<core::int*>* x = #C1]) → void {}
+  function named_local({core::List<core::int*>* x = #C1}) → void {}
+  ([core::List<core::int*>*]) →* core::Null* optional_closure = ([core::List<core::int*>* x = #C1]) → core::Null* {};
+  ({x: core::List<core::int*>*}) →* core::Null* name_closure = ({core::List<core::int*>* x = #C1}) → core::Null* {};
+}
+
+constants  {
+  #C1 = <core::int*>[]
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
index a19a41c..067eba9 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart
@@ -10,25 +10,25 @@
   C.named(void func({T x})) {}
 }
 
-void optional_toplevel([x = /*@typeArgs=int*/ const [0]]) {}
+void optional_toplevel([x = /*@ typeArgs=int* */ const [0]]) {}
 
-void named_toplevel({x: /*@typeArgs=int*/ const [0]}) {}
+void named_toplevel({x: /*@ typeArgs=int* */ const [0]}) {}
 
 main() {
-  void optional_local([/*@type=dynamic*/ x = /*@typeArgs=int*/ const [0]]) {}
-  void named_local({/*@type=dynamic*/ x: /*@typeArgs=int*/ const [0]}) {}
-  var /*@type=C<dynamic>*/ c_optional_toplevel =
-      new /*@typeArgs=dynamic*/ C.optional(optional_toplevel);
-  var /*@type=C<dynamic>*/ c_named_toplevel =
-      new /*@typeArgs=dynamic*/ C.named(named_toplevel);
-  var /*@type=C<dynamic>*/ c_optional_local =
-      new /*@typeArgs=dynamic*/ C.optional(optional_local);
-  var /*@type=C<dynamic>*/ c_named_local =
-      new /*@typeArgs=dynamic*/ C.named(named_local);
-  var /*@type=C<dynamic>*/ c_optional_closure =
-      new /*@typeArgs=dynamic*/ C.optional(/*@returnType=Null*/ (
-          [/*@type=dynamic*/ x = /*@typeArgs=int*/ const [0]]) {});
-  var /*@type=C<dynamic>*/ c_named_closure = new /*@typeArgs=dynamic*/ C.named(
-      /*@returnType=Null*/ (
-          {/*@type=dynamic*/ x: /*@typeArgs=int*/ const [0]}) {});
+  void optional_local([/*@ type=dynamic */ x = /*@ typeArgs=int* */ const [0]]) {}
+  void named_local({/*@ type=dynamic */ x: /*@ typeArgs=int* */ const [0]}) {}
+  var /*@ type=C<dynamic>* */ c_optional_toplevel =
+      new /*@ typeArgs=dynamic */ C.optional(optional_toplevel);
+  var /*@ type=C<dynamic>* */ c_named_toplevel =
+      new /*@ typeArgs=dynamic */ C.named(named_toplevel);
+  var /*@ type=C<dynamic>* */ c_optional_local =
+      new /*@ typeArgs=dynamic */ C.optional(optional_local);
+  var /*@ type=C<dynamic>* */ c_named_local =
+      new /*@ typeArgs=dynamic */ C.named(named_local);
+  var /*@ type=C<dynamic>* */ c_optional_closure =
+      new /*@ typeArgs=dynamic */ C.optional(/*@ returnType=Null* */ (
+          [/*@ type=dynamic */ x = /*@ typeArgs=int* */ const [0]]) {});
+  var /*@ type=C<dynamic>* */ c_named_closure = new /*@ typeArgs=dynamic */ C.named(
+      /*@ returnType=Null* */ (
+          {/*@ type=dynamic */ x: /*@ typeArgs=int* */ const [0]}) {});
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect
index 2ec0b95..9ea779c 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.expect
@@ -2,21 +2,28 @@
 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>
+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>
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
     : super core::Object::•() {}
 }
-static method optional_toplevel([dynamic x = const <dynamic>[0]]) → void {}
-static method named_toplevel({dynamic x = const <dynamic>[0]}) → void {}
+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 = const <dynamic>[0]]) → void {}
-  function named_local({dynamic x = const <dynamic>[0]}) → void {}
-  dynamic c_optional_toplevel = new self::C::optional<dynamic>(self::optional_toplevel);
-  dynamic c_named_toplevel = new self::C::named<dynamic>(self::named_toplevel);
+  function optional_local([dynamic x = #C2]) → void {}
+  function named_local({dynamic x = #C2}) → void {}
+  dynamic c_optional_toplevel = new self::C::optional<dynamic>(#C3);
+  dynamic c_named_toplevel = new self::C::named<dynamic>(#C4);
   dynamic c_optional_local = new self::C::optional<dynamic>(optional_local);
   dynamic c_named_local = new self::C::named<dynamic>(named_local);
-  dynamic c_optional_closure = new self::C::optional<dynamic>(([dynamic x = const <dynamic>[0]]) → dynamic {});
-  dynamic c_named_closure = new self::C::named<dynamic>(({dynamic x = const <dynamic>[0]}) → dynamic {});
+  dynamic c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → dynamic {});
+  dynamic c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → dynamic {});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = <dynamic>[#C1]
+  #C3 = tearoff self::optional_toplevel
+  #C4 = tearoff self::named_toplevel
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect
index 2ec0b95..9ea779c 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.legacy.transformed.expect
@@ -2,21 +2,28 @@
 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>
+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>
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
     : super core::Object::•() {}
 }
-static method optional_toplevel([dynamic x = const <dynamic>[0]]) → void {}
-static method named_toplevel({dynamic x = const <dynamic>[0]}) → void {}
+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 = const <dynamic>[0]]) → void {}
-  function named_local({dynamic x = const <dynamic>[0]}) → void {}
-  dynamic c_optional_toplevel = new self::C::optional<dynamic>(self::optional_toplevel);
-  dynamic c_named_toplevel = new self::C::named<dynamic>(self::named_toplevel);
+  function optional_local([dynamic x = #C2]) → void {}
+  function named_local({dynamic x = #C2}) → void {}
+  dynamic c_optional_toplevel = new self::C::optional<dynamic>(#C3);
+  dynamic c_named_toplevel = new self::C::named<dynamic>(#C4);
   dynamic c_optional_local = new self::C::optional<dynamic>(optional_local);
   dynamic c_named_local = new self::C::named<dynamic>(named_local);
-  dynamic c_optional_closure = new self::C::optional<dynamic>(([dynamic x = const <dynamic>[0]]) → dynamic {});
-  dynamic c_named_closure = new self::C::named<dynamic>(({dynamic x = const <dynamic>[0]}) → dynamic {});
+  dynamic c_optional_closure = new self::C::optional<dynamic>(([dynamic x = #C2]) → dynamic {});
+  dynamic c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → dynamic {});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = <dynamic>[#C1]
+  #C3 = tearoff self::optional_toplevel
+  #C4 = tearoff self::named_toplevel
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
index adfc05a..07f4d6b 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.outline.expect
@@ -2,10 +2,10 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor optional(([self::C::T*]) →* void func) → self::C<self::C::T*>*
     ;
-  constructor named(({x: self::C::T}) → void func) → self::C<self::C::T>
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
     ;
 }
 static method optional_toplevel([dynamic x]) → void
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
index 5d1cc0f..163f232 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.expect
@@ -2,21 +2,28 @@
 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>
+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>
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
     : super core::Object::•() {}
 }
-static method optional_toplevel([dynamic x = const <core::int>[0]]) → void {}
-static method named_toplevel({dynamic x = const <core::int>[0]}) → void {}
+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 = const <core::int>[0]]) → void {}
-  function named_local({dynamic x = const <core::int>[0]}) → void {}
-  self::C<dynamic> c_optional_toplevel = new self::C::optional<dynamic>(self::optional_toplevel);
-  self::C<dynamic> c_named_toplevel = new self::C::named<dynamic>(self::named_toplevel);
-  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 = const <core::int>[0]]) → core::Null {});
-  self::C<dynamic> c_named_closure = new self::C::named<dynamic>(({dynamic x = const <core::int>[0]}) → core::Null {});
+  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]) → core::Null* {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null* {});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = <core::int*>[#C1]
+  #C3 = tearoff self::optional_toplevel
+  #C4 = tearoff self::named_toplevel
 }
diff --git a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
index 5d1cc0f..163f232 100644
--- a/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/parameter_defaults_upwards.dart.strong.transformed.expect
@@ -2,21 +2,28 @@
 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>
+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>
+  constructor named(({x: self::C::T*}) →* void func) → self::C<self::C::T*>*
     : super core::Object::•() {}
 }
-static method optional_toplevel([dynamic x = const <core::int>[0]]) → void {}
-static method named_toplevel({dynamic x = const <core::int>[0]}) → void {}
+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 = const <core::int>[0]]) → void {}
-  function named_local({dynamic x = const <core::int>[0]}) → void {}
-  self::C<dynamic> c_optional_toplevel = new self::C::optional<dynamic>(self::optional_toplevel);
-  self::C<dynamic> c_named_toplevel = new self::C::named<dynamic>(self::named_toplevel);
-  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 = const <core::int>[0]]) → core::Null {});
-  self::C<dynamic> c_named_closure = new self::C::named<dynamic>(({dynamic x = const <core::int>[0]}) → core::Null {});
+  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]) → core::Null* {});
+  self::C<dynamic>* c_named_closure = new self::C::named<dynamic>(({dynamic x = #C2}) → core::Null* {});
+}
+
+constants  {
+  #C1 = 0
+  #C2 = <core::int*>[#C1]
+  #C3 = tearoff self::optional_toplevel
+  #C4 = tearoff self::named_toplevel
 }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart b/pkg/front_end/testcases/inference/promote_bounds.dart
index 153105d..37cc023 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart
@@ -20,7 +20,7 @@
   }
   if (a is C) {
     // Promoted; we can now call bar.
-    /*@promotedType=f::T extends C*/ a. /*@target=C::bar*/ bar();
+    /*@ promotedType=f::T* extends C* */ a. /*@target=C::bar*/ bar();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect
index 9d5a74b..c167181 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B = dynamic>(self::f::T a) → void {
-  if(a is core::String) {
+static method f<T extends self::B* = dynamic>(self::f::T* a) → void {
+  if(a is core::String*) {
     a.foo();
   }
-  if(a is self::C) {
+  if(a is self::C*) {
     a.bar();
   }
 }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect
index 9d5a74b..c167181 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B = dynamic>(self::f::T a) → void {
-  if(a is core::String) {
+static method f<T extends self::B* = dynamic>(self::f::T* a) → void {
+  if(a is core::String*) {
     a.foo();
   }
-  if(a is self::C) {
+  if(a is self::C*) {
     a.bar();
   }
 }
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
index f224b46..2efb122 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.outline.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B = dynamic>(self::f::T a) → void
+static method f<T extends self::B* = dynamic>(self::f::T* a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
index a8a5d1d..a10d272 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B = self::B>(self::f::T a) → void {
-  if(a is core::String) {
+static method f<T extends self::B* = self::B*>(self::f::T* a) → void {
+  if(a is core::String*) {
     a.{self::B::foo}();
   }
-  if(a is self::C) {
-    a{self::f::T extends self::C}.{self::C::bar}();
+  if(a is self::C*) {
+    a{self::f::T* extends self::C*}.{self::C::bar}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
index a8a5d1d..a10d272 100644
--- a/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_bounds.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   abstract method bar() → void;
 }
-static method f<T extends self::B = self::B>(self::f::T a) → void {
-  if(a is core::String) {
+static method f<T extends self::B* = self::B*>(self::f::T* a) → void {
+  if(a is core::String*) {
     a.{self::B::foo}();
   }
-  if(a is self::C) {
-    a{self::f::T extends self::C}.{self::C::bar}();
+  if(a is self::C*) {
+    a{self::f::T* extends self::C*}.{self::C::bar}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart
index b159850..c8fef0b 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart
@@ -7,7 +7,7 @@
 
 void test(Object a, bool b) {
   if (b && a is int) {
-    print(/*@promotedType=int*/ a);
+    print(/*@ promotedType=int* */ a);
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect
index 4e40f86..fab0713 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.expect
@@ -2,8 +2,8 @@
 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) {
+static method test(core::Object* a, core::bool* b) → void {
+  if(b && a is core::int*) {
     core::print(a);
   }
 }
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect
index 4e40f86..fab0713 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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) {
+static method test(core::Object* a, core::bool* b) → void {
+  if(b && a is core::int*) {
     core::print(a);
   }
 }
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.outline.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.outline.expect
index 987e73f..b8059f6 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::Object a, core::bool b) → void
+static method test(core::Object* a, core::bool* b) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.expect
index ad926fb..16ae59d 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.expect
@@ -2,9 +2,9 @@
 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 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/promote_from_logical_rhs.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.transformed.expect
index ad926fb..16ae59d 100644
--- a/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/promote_from_logical_rhs.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 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 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 b/pkg/front_end/testcases/inference/promotion_subtype_check.dart
index c27016e..7691cf1 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart
@@ -7,9 +7,9 @@
 
 void f(Object x) {
   if (x is int) {
-    if (/*@promotedType=int*/ x is String) {
+    if (/*@ promotedType=int* */ x is String) {
       // Promotion blocked; String is not a subtype of int.
-      var /*@type=int*/ y = /*@promotedType=int*/ x;
+      var /*@ type=int* */ y = /*@ promotedType=int* */ x;
     }
   }
 }
@@ -17,7 +17,7 @@
 void g(int x) {
   if (x is String) {
     // Promotion blocked; String is not a subtype of int.
-    var /*@type=int*/ y = x;
+    var /*@ type=int* */ y = x;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect
index 3c04046..83b0506 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::Object x) → void {
-  if(x is core::int) {
-    if(x is core::String) {
+static method f(core::Object* x) → void {
+  if(x is core::int*) {
+    if(x is core::String*) {
       dynamic y = x;
     }
   }
 }
-static method g(core::int x) → void {
-  if(x is core::String) {
+static method g(core::int* x) → void {
+  if(x is core::String*) {
     dynamic y = x;
   }
 }
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect
index 3c04046..83b0506 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::Object x) → void {
-  if(x is core::int) {
-    if(x is core::String) {
+static method f(core::Object* x) → void {
+  if(x is core::int*) {
+    if(x is core::String*) {
       dynamic y = x;
     }
   }
 }
-static method g(core::int x) → void {
-  if(x is core::String) {
+static method g(core::int* x) → void {
+  if(x is core::String*) {
     dynamic y = x;
   }
 }
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.outline.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.outline.expect
index 4e661b9..b3d9714 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::Object x) → void
+static method f(core::Object* x) → void
   ;
-static method g(core::int x) → void
+static method g(core::int* x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.expect
index 065fb72..f240935 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.expect
@@ -2,16 +2,16 @@
 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 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 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/promotion_subtype_check.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.transformed.expect
index 065fb72..f240935 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 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 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 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/promotion_subtype_check.dart.type_promotion.expect b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
index 93c14dd..acd3603 100644
--- a/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/promotion_subtype_check.dart.type_promotion.expect
@@ -1,9 +1,9 @@
 pkg/front_end/testcases/inference/promotion_subtype_check.dart:9:9: Context: Possible promotion of x@276
   if (x is int) {
         ^^
-pkg/front_end/testcases/inference/promotion_subtype_check.dart:10:33: Context: Possible promotion of x@276
-    if (/*@promotedType=int*/ x is String) {
-                                ^^
+pkg/front_end/testcases/inference/promotion_subtype_check.dart:10:36: Context: Possible promotion of x@276
+    if (/*@ promotedType=int* */ x is String) {
+                                   ^^
 pkg/front_end/testcases/inference/promotion_subtype_check.dart:18:9: Context: Possible promotion of x@276
   if (x is String) {
         ^^
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart
index 1ce8eae..d89ab96 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart
@@ -10,7 +10,7 @@
 }
 
 main() {
-  var /*@type=A*/ a = new A();
+  var /*@ type=A* */ a = new A();
   A b = a; // doesn't require down cast
   print(a. /*@target=A::x*/ x); // doesn't require dynamic invoke
   print(a. /*@target=A::x*/ x /*@target=num::+*/ +
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect
index 2b18c7f..49ae8d3 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a;
+  self::A* b = a;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect
index 2b18c7f..49ae8d3 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a;
+  self::A* b = a;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.expect
index 704665f..8f2fc9b 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
-  self::A b = a;
+  self::A* a = new self::A::•();
+  self::A* b = a;
   core::print(a.{self::A::x});
   core::print(a.{self::A::x}.{core::num::+}(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.transformed.expect
index 704665f..8f2fc9b 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
-  self::A b = a;
+  self::A* a = new self::A::•();
+  self::A* b = a;
   core::print(a.{self::A::x});
   core::print(a.{self::A::x}.{core::num::+}(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect
index 2b18c7f..49ae8d3 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a;
+  self::A* b = a;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect
index 2b18c7f..49ae8d3 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a;
+  self::A* b = a;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.expect
index 2c346f0..29d7a60 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a as{TypeError} self::A;
+  self::A* b = a as{TypeError} self::A*;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.transformed.expect
index 2c346f0..29d7a60 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_to_field_in_class_dynamic_warnings.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   dynamic a = new self::A::•();
-  self::A b = a as{TypeError} self::A;
+  self::A* b = a as{TypeError} self::A*;
   core::print(a.x);
   core::print(a.x.+(2));
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart
index 07d4bfc..df88d78 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart
@@ -10,7 +10,7 @@
 }
 
 test5() {
-  var /*@type=A*/ a1 = new A();
+  var /*@ type=A* */ a1 = new A();
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ "hi";
 
   A a2 = new A();
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect
index 6c7bfc8..293fe43 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method test5() → dynamic {
   dynamic a1 = new self::A::•();
   a1.x = "hi";
-  self::A a2 = new self::A::•();
+  self::A* a2 = new self::A::•();
   a2.x = "hi";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect
index 6c7bfc8..293fe43 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method test5() → dynamic {
   dynamic a1 = new self::A::•();
   a1.x = "hi";
-  self::A a2 = new self::A::•();
+  self::A* a2 = new self::A::•();
   a2.x = "hi";
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
index 58c7f14..a896508 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.expect
@@ -16,21 +16,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method test5() → dynamic {
-  self::A a1 = new self::A::•();
+  self::A* a1 = new self::A::•();
   a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                                        ^" in "hi" as{TypeError} core::int;
-  self::A a2 = new self::A::•();
+                                                        ^" in "hi" as{TypeError} core::int*;
+  self::A* a2 = new self::A::•();
   a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                                        ^" in "hi" as{TypeError} core::int;
+                                                        ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
index 58c7f14..a896508 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively.dart.strong.transformed.expect
@@ -16,21 +16,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 2;
-  synthetic constructor •() → self::A
+  field core::int* x = 2;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 static method test5() → dynamic {
-  self::A a1 = new self::A::•();
+  self::A* a1 = new self::A::•();
   a1.{self::A::x} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:14:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a1. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                                        ^" in "hi" as{TypeError} core::int;
-  self::A a2 = new self::A::•();
+                                                        ^" in "hi" as{TypeError} core::int*;
+  self::A* a2 = new self::A::•();
   a2.{self::A::x} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference/propagate_inference_transitively.dart:17:57: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
   a2. /*@target=A::x*/ x = /*error:INVALID_ASSIGNMENT*/ \"hi\";
-                                                        ^" in "hi" as{TypeError} core::int;
+                                                        ^" in "hi" as{TypeError} core::int*;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart
index 4fd048d..8a461a7 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart
@@ -22,7 +22,7 @@
 }
 
 void main() {
-  var /*@type=D*/ d1 = new D();
+  var /*@ type=D* */ d1 = new D();
   print(d1. /*@target=D::c*/ c. /*@target=C::b*/ b. /*@target=B::a*/ a
       . /*@target=A::x*/ x);
 
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect
index 5b5ae81..dcee814 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 42;
-  synthetic constructor •() → self::A
+  field core::int* x = 42;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::A a = new self::A::•();
-  synthetic constructor •() → self::B
+  field self::A* a = new self::A::•();
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::B b = new self::B::•();
-  synthetic constructor •() → self::C
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  field self::C c = new self::C::•();
-  synthetic constructor •() → self::D
+  field self::C* c = new self::C::•();
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 static method main() → void {
   dynamic d1 = new self::D::•();
   core::print(d1.c.b.a.x);
-  self::D d2 = new self::D::•();
+  self::D* d2 = new self::D::•();
   core::print(d2.c.b.a.x);
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect
index 5b5ae81..dcee814 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.legacy.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 42;
-  synthetic constructor •() → self::A
+  field core::int* x = 42;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::A a = new self::A::•();
-  synthetic constructor •() → self::B
+  field self::A* a = new self::A::•();
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::B b = new self::B::•();
-  synthetic constructor •() → self::C
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  field self::C c = new self::C::•();
-  synthetic constructor •() → self::D
+  field self::C* c = new self::C::•();
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 static method main() → void {
   dynamic d1 = new self::D::•();
   core::print(d1.c.b.a.x);
-  self::D d2 = new self::D::•();
+  self::D* d2 = new self::D::•();
   core::print(d2.c.b.a.x);
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.expect
index 0c20d71..44b8e84 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 42;
-  synthetic constructor •() → self::A
+  field core::int* x = 42;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::A a = new self::A::•();
-  synthetic constructor •() → self::B
+  field self::A* a = new self::A::•();
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::B b = new self::B::•();
-  synthetic constructor •() → self::C
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  field self::C c = new self::C::•();
-  synthetic constructor •() → self::D
+  field self::C* c = new self::C::•();
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::D d1 = new self::D::•();
+  self::D* d1 = new self::D::•();
   core::print(d1.{self::D::c}.{self::C::b}.{self::B::a}.{self::A::x});
-  self::D d2 = new self::D::•();
+  self::D* d2 = new self::D::•();
   core::print(d2.{self::D::c}.{self::C::b}.{self::B::a}.{self::A::x});
 }
diff --git a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.transformed.expect
index 0c20d71..44b8e84 100644
--- a/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_inference_transitively2.dart.strong.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int x = 42;
-  synthetic constructor •() → self::A
+  field core::int* x = 42;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::A a = new self::A::•();
-  synthetic constructor •() → self::B
+  field self::A* a = new self::A::•();
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::B b = new self::B::•();
-  synthetic constructor •() → self::C
+  field self::B* b = new self::B::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  field self::C c = new self::C::•();
-  synthetic constructor •() → self::D
+  field self::C* c = new self::C::•();
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 static method main() → void {
-  self::D d1 = new self::D::•();
+  self::D* d1 = new self::D::•();
   core::print(d1.{self::D::c}.{self::C::b}.{self::B::a}.{self::A::x});
-  self::D d2 = new self::D::•();
+  self::D* d2 = new self::D::•();
   core::print(d2.{self::D::c}.{self::C::b}.{self::B::a}.{self::A::x});
 }
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart b/pkg/front_end/testcases/inference/propagate_variable_get.dart
index 6765072..e5ca243 100644
--- a/pkg/front_end/testcases/inference/propagate_variable_get.dart
+++ b/pkg/front_end/testcases/inference/propagate_variable_get.dart
@@ -6,6 +6,6 @@
 library test;
 
 main() {
-  var /*@type=int*/ a = 0;
-  var /*@type=int*/ b = a;
+  var /*@ type=int* */ a = 0;
+  var /*@ type=int* */ b = a;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.expect b/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.expect
index a5e9d73..ba60f97 100644
--- a/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int a = 0;
-  core::int b = a;
+  core::int* a = 0;
+  core::int* b = a;
 }
diff --git a/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.transformed.expect
index a5e9d73..ba60f97 100644
--- a/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/propagate_variable_get.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int a = 0;
-  core::int b = a;
+  core::int* a = 0;
+  core::int* b = a;
 }
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart b/pkg/front_end/testcases/inference/property_get_toplevel.dart
index 15b76a6..b067a2e 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart
@@ -13,7 +13,7 @@
 
 C c = new C();
 var function_ref = c. /*@target=C::function*/ function;
-var function_ref_list = /*@typeArgs=() -> int*/ [
+var function_ref_list = /*@ typeArgs=() ->* int* */ [
   c. /*@target=C::function*/ function
 ];
 
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect
index 25b8252..4ea57de 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic function_ref = self::c.function;
 static field dynamic function_ref_list = <dynamic>[self::c.function];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect
index 25b8252..4ea57de 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic function_ref = self::c.function;
 static field dynamic function_ref_list = <dynamic>[self::c.function];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
index 2039f33..1ec74b1 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field;
-  synthetic constructor •() → self::C
+  field core::int* field;
+  synthetic constructor •() → self::C*
     ;
-  get getter() → core::int
+  get getter() → core::int*
     ;
-  method function() → core::int
+  method function() → core::int*
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic function_ref;
 static field dynamic function_ref_list;
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.expect
index 194ddd1..7345889 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
-static field () → core::int function_ref = self::c.{self::C::function};
-static field core::List<() → core::int> function_ref_list = <() → core::int>[self::c.{self::C::function}];
+static field self::C* c = new self::C::•();
+static field () →* core::int* function_ref = self::c.{self::C::function};
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.transformed.expect
index 194ddd1..7345889 100644
--- a/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_get_toplevel.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
-static field () → core::int function_ref = self::c.{self::C::function};
-static field core::List<() → core::int> function_ref_list = <() → core::int>[self::c.{self::C::function}];
+static field self::C* c = new self::C::•();
+static field () →* core::int* function_ref = self::c.{self::C::function};
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart b/pkg/front_end/testcases/inference/property_set.dart
index becebf1..1dd54cf 100644
--- a/pkg/front_end/testcases/inference/property_set.dart
+++ b/pkg/front_end/testcases/inference/property_set.dart
@@ -14,38 +14,38 @@
   A<int> a_int = new A<int>();
   A<Object> a_object = new A<Object>();
   A<dynamic> a_dynamic = new A<dynamic>();
-  var /*@type=List<int>*/ x_int =
-      a_int. /*@target=A::x*/ x = /*@typeArgs=int*/ [0];
-  var /*@type=List<int>*/ y_int =
-      a_int. /*@target=A::y*/ y = /*@typeArgs=int*/ [0];
-  var /*@type=List<Object>*/ x_object =
-      a_object. /*@target=A::x*/ x = /*@typeArgs=Object*/ [0];
-  var /*@type=List<Object>*/ y_object =
-      a_object. /*@target=A::y*/ y = /*@typeArgs=Object*/ [0];
-  var /*@type=List<dynamic>*/ x_dynamic =
-      a_dynamic. /*@target=A::x*/ x = /*@typeArgs=dynamic*/ [0];
-  var /*@type=List<dynamic>*/ y_dynamic =
-      a_dynamic. /*@target=A::y*/ y = /*@typeArgs=dynamic*/ [0];
-  var /*@type=List<int>*/ x_int_explicit = a_int. /*@target=A::x*/ x = <int>[0];
-  var /*@type=List<int>*/ y_int_explicit = a_int. /*@target=A::y*/ y = <int>[0];
-  var /*@type=List<int>*/ x_object_explicit =
+  var /*@ type=List<int*>* */ x_int =
+      a_int. /*@target=A::x*/ x = /*@ typeArgs=int* */ [0];
+  var /*@ type=List<int*>* */ y_int =
+      a_int. /*@target=A::y*/ y = /*@ typeArgs=int* */ [0];
+  var /*@ type=List<Object*>* */ x_object =
+      a_object. /*@target=A::x*/ x = /*@ typeArgs=Object* */ [0];
+  var /*@ type=List<Object*>* */ y_object =
+      a_object. /*@target=A::y*/ y = /*@ typeArgs=Object* */ [0];
+  var /*@ type=List<dynamic>* */ x_dynamic =
+      a_dynamic. /*@target=A::x*/ x = /*@ typeArgs=dynamic */ [0];
+  var /*@ type=List<dynamic>* */ y_dynamic =
+      a_dynamic. /*@target=A::y*/ y = /*@ typeArgs=dynamic */ [0];
+  var /*@ type=List<int*>* */ x_int_explicit = a_int. /*@target=A::x*/ x = <int>[0];
+  var /*@ type=List<int*>* */ y_int_explicit = a_int. /*@target=A::y*/ y = <int>[0];
+  var /*@ type=List<int*>* */ x_object_explicit =
       a_object. /*@target=A::x*/ x = <int>[0];
-  var /*@type=List<int>*/ y_object_explicit =
+  var /*@ type=List<int*>* */ y_object_explicit =
       a_object. /*@target=A::y*/ y = <int>[0];
-  var /*@type=List<int>*/ x_dynamic_explicit =
+  var /*@ type=List<int*>* */ x_dynamic_explicit =
       a_dynamic. /*@target=A::x*/ x = <int>[0];
-  var /*@type=List<int>*/ y_dynamic_explicit =
+  var /*@ type=List<int*>* */ y_dynamic_explicit =
       a_dynamic. /*@target=A::y*/ y = <int>[0];
-  List<int> x_int_downward = a_int. /*@target=A::x*/ x = /*@typeArgs=int*/ [0];
-  List<int> y_int_downward = a_int. /*@target=A::y*/ y = /*@typeArgs=int*/ [0];
+  List<int> x_int_downward = a_int. /*@target=A::x*/ x = /*@ typeArgs=int* */ [0];
+  List<int> y_int_downward = a_int. /*@target=A::y*/ y = /*@ typeArgs=int* */ [0];
   List<int> x_object_downward =
-      a_object. /*@target=A::x*/ x = /*@typeArgs=Object*/ [0];
+      a_object. /*@target=A::x*/ x = /*@ typeArgs=Object* */ [0];
   List<int> y_object_downward =
-      a_object. /*@target=A::y*/ y = /*@typeArgs=Object*/ [0];
+      a_object. /*@target=A::y*/ y = /*@ typeArgs=Object* */ [0];
   List<int> x_dynamic_downward =
-      a_dynamic. /*@target=A::x*/ x = /*@typeArgs=dynamic*/ [0];
+      a_dynamic. /*@target=A::x*/ x = /*@ typeArgs=dynamic */ [0];
   List<int> y_dynamic_downward =
-      a_dynamic. /*@target=A::y*/ y = /*@typeArgs=dynamic*/ [0];
+      a_dynamic. /*@target=A::y*/ y = /*@ typeArgs=dynamic */ [0];
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart.legacy.expect b/pkg/front_end/testcases/inference/property_set.dart.legacy.expect
index dc17adc..938cc0e 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.legacy.expect
@@ -2,34 +2,34 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T*>* value) → void {}
 }
 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>();
+  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>();
   dynamic x_int = a_int.x = <dynamic>[0];
   dynamic y_int = a_int.y = <dynamic>[0];
   dynamic x_object = a_object.x = <dynamic>[0];
   dynamic y_object = a_object.y = <dynamic>[0];
   dynamic x_dynamic = a_dynamic.x = <dynamic>[0];
   dynamic y_dynamic = a_dynamic.y = <dynamic>[0];
-  dynamic x_int_explicit = a_int.x = <core::int>[0];
-  dynamic y_int_explicit = a_int.y = <core::int>[0];
-  dynamic x_object_explicit = a_object.x = <core::int>[0];
-  dynamic y_object_explicit = a_object.y = <core::int>[0];
-  dynamic x_dynamic_explicit = a_dynamic.x = <core::int>[0];
-  dynamic y_dynamic_explicit = a_dynamic.y = <core::int>[0];
-  core::List<core::int> x_int_downward = a_int.x = <dynamic>[0];
-  core::List<core::int> y_int_downward = a_int.y = <dynamic>[0];
-  core::List<core::int> x_object_downward = a_object.x = <dynamic>[0];
-  core::List<core::int> y_object_downward = a_object.y = <dynamic>[0];
-  core::List<core::int> x_dynamic_downward = a_dynamic.x = <dynamic>[0];
-  core::List<core::int> y_dynamic_downward = a_dynamic.y = <dynamic>[0];
+  dynamic x_int_explicit = a_int.x = <core::int*>[0];
+  dynamic y_int_explicit = a_int.y = <core::int*>[0];
+  dynamic x_object_explicit = a_object.x = <core::int*>[0];
+  dynamic y_object_explicit = a_object.y = <core::int*>[0];
+  dynamic x_dynamic_explicit = a_dynamic.x = <core::int*>[0];
+  dynamic y_dynamic_explicit = a_dynamic.y = <core::int*>[0];
+  core::List<core::int*>* x_int_downward = a_int.x = <dynamic>[0];
+  core::List<core::int*>* y_int_downward = a_int.y = <dynamic>[0];
+  core::List<core::int*>* x_object_downward = a_object.x = <dynamic>[0];
+  core::List<core::int*>* y_object_downward = a_object.y = <dynamic>[0];
+  core::List<core::int*>* x_dynamic_downward = a_dynamic.x = <dynamic>[0];
+  core::List<core::int*>* y_dynamic_downward = a_dynamic.y = <dynamic>[0];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
index dc17adc..938cc0e 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.legacy.transformed.expect
@@ -2,34 +2,34 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T*>* value) → void {}
 }
 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>();
+  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>();
   dynamic x_int = a_int.x = <dynamic>[0];
   dynamic y_int = a_int.y = <dynamic>[0];
   dynamic x_object = a_object.x = <dynamic>[0];
   dynamic y_object = a_object.y = <dynamic>[0];
   dynamic x_dynamic = a_dynamic.x = <dynamic>[0];
   dynamic y_dynamic = a_dynamic.y = <dynamic>[0];
-  dynamic x_int_explicit = a_int.x = <core::int>[0];
-  dynamic y_int_explicit = a_int.y = <core::int>[0];
-  dynamic x_object_explicit = a_object.x = <core::int>[0];
-  dynamic y_object_explicit = a_object.y = <core::int>[0];
-  dynamic x_dynamic_explicit = a_dynamic.x = <core::int>[0];
-  dynamic y_dynamic_explicit = a_dynamic.y = <core::int>[0];
-  core::List<core::int> x_int_downward = a_int.x = <dynamic>[0];
-  core::List<core::int> y_int_downward = a_int.y = <dynamic>[0];
-  core::List<core::int> x_object_downward = a_object.x = <dynamic>[0];
-  core::List<core::int> y_object_downward = a_object.y = <dynamic>[0];
-  core::List<core::int> x_dynamic_downward = a_dynamic.x = <dynamic>[0];
-  core::List<core::int> y_dynamic_downward = a_dynamic.y = <dynamic>[0];
+  dynamic x_int_explicit = a_int.x = <core::int*>[0];
+  dynamic y_int_explicit = a_int.y = <core::int*>[0];
+  dynamic x_object_explicit = a_object.x = <core::int*>[0];
+  dynamic y_object_explicit = a_object.y = <core::int*>[0];
+  dynamic x_dynamic_explicit = a_dynamic.x = <core::int*>[0];
+  dynamic y_dynamic_explicit = a_dynamic.y = <core::int*>[0];
+  core::List<core::int*>* x_int_downward = a_int.x = <dynamic>[0];
+  core::List<core::int*>* y_int_downward = a_int.y = <dynamic>[0];
+  core::List<core::int*>* x_object_downward = a_object.x = <dynamic>[0];
+  core::List<core::int*>* y_object_downward = a_object.y = <dynamic>[0];
+  core::List<core::int*>* x_dynamic_downward = a_dynamic.x = <dynamic>[0];
+  core::List<core::int*>* y_dynamic_downward = a_dynamic.y = <dynamic>[0];
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set.dart.outline.expect b/pkg/front_end/testcases/inference/property_set.dart.outline.expect
index e1a87aa..311761d 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> x;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* x;
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
-  set y(generic-covariant-impl core::List<self::A::T> value) → void
+  set y(generic-covariant-impl core::List<self::A::T*>* value) → void
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/inference/property_set.dart.strong.expect b/pkg/front_end/testcases/inference/property_set.dart.strong.expect
index c9ffbd9..8474fcb 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.strong.expect
@@ -2,34 +2,34 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T*>* value) → void {}
 }
 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>;
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
index c9ffbd9..8474fcb 100644
--- a/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set.dart.strong.transformed.expect
@@ -2,34 +2,34 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::T> x = null;
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::T*>* x = null;
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl core::List<self::A::T> value) → void {}
+  set y(generic-covariant-impl core::List<self::A::T*>* value) → void {}
 }
 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>;
+  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 b/pkg/front_end/testcases/inference/property_set_bad_setter.dart
index 11863b8..f57da87 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart
@@ -10,7 +10,7 @@
 }
 
 void f(A a) {
-  var /*@type=int*/ x = a. /*@target=A::x*/ x = 0;
+  var /*@ type=int* */ x = a. /*@target=A::x*/ x = 0;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect
index a0997b0..672015b 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void {
@@ -20,7 +20,7 @@
     {}
   }
 }
-static method f(self::A a) → void {
+static method f(self::A* a) → void {
   dynamic x = a.x = 0;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect
index a0997b0..672015b 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.legacy.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void {
@@ -20,7 +20,7 @@
     {}
   }
 }
-static method f(self::A a) → void {
+static method f(self::A* a) → void {
   dynamic x = a.x = 0;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.outline.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.outline.expect
index 1f080fc..7fa2027 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   set x(dynamic #synthetic) → void
     ;
 }
-static method f(self::A a) → void
+static method f(self::A* a) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
index 3d09e75..3c9abc3 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void {
@@ -20,7 +20,7 @@
     {}
   }
 }
-static method f(self::A a) → void {
-  core::int x = a.{self::A::x} = 0;
+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/property_set_bad_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
index 3d09e75..3c9abc3 100644
--- a/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/property_set_bad_setter.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set x(dynamic #synthetic) → void {
@@ -20,7 +20,7 @@
     {}
   }
 }
-static method f(self::A a) → void {
-  core::int x = a.{self::A::x} = 0;
+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 b/pkg/front_end/testcases/inference/recursive_generic_function.dart
index 82ca679..6bc67ea 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart
@@ -7,10 +7,10 @@
 
 void _mergeSort<T>(
     T Function(T) list, int compare(T a, T b), T Function(T) target) {
-  /*@typeArgs=_mergeSort::T*/ _mergeSort(list, compare, target);
-  /*@typeArgs=_mergeSort::T*/ _mergeSort(list, compare, list);
-  /*@typeArgs=_mergeSort::T*/ _mergeSort(target, compare, target);
-  /*@typeArgs=_mergeSort::T*/ _mergeSort(target, compare, list);
+  /*@ typeArgs=_mergeSort::T* */ _mergeSort(list, compare, target);
+  /*@ typeArgs=_mergeSort::T* */ _mergeSort(list, compare, list);
+  /*@ typeArgs=_mergeSort::T* */ _mergeSort(target, compare, target);
+  /*@ typeArgs=_mergeSort::T* */ _mergeSort(target, compare, list);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect
index df0ef92..92f85fd 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.expect
@@ -2,7 +2,7 @@
 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 {
+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<dynamic>(list, compare, target);
   self::_mergeSort<dynamic>(list, compare, list);
   self::_mergeSort<dynamic>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect
index df0ef92..92f85fd 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 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 {
+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<dynamic>(list, compare, target);
   self::_mergeSort<dynamic>(list, compare, list);
   self::_mergeSort<dynamic>(target, compare, target);
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
index 3b14cff..57132d9 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.outline.expect
@@ -2,7 +2,7 @@
 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
+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
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
index 60a3552..d617cd4 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.expect
@@ -2,10 +2,10 @@
 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 _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/recursive_generic_function.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
index 60a3552..d617cd4 100644
--- a/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/recursive_generic_function.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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 _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.legacy.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.expect
index 5d27835..2f6addf 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
 
-typedef F = () → void;
-static final field dynamic x = () → void;
+typedef F = () →* void;
+static final field dynamic x = () →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect
index 5d27835..2f6addf 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.legacy.transformed.expect
@@ -1,6 +1,6 @@
 library test;
 import self as self;
 
-typedef F = () → void;
-static final field dynamic x = () → void;
+typedef F = () →* void;
+static final field dynamic x = () →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.expect
index 2b0c8e6..e08b136 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field core::Type x = () → void;
+typedef F = () →* void;
+static final field core::Type* x = () →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
index 2b0c8e6..e08b136 100644
--- a/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/reference_to_typedef.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
-static final field core::Type x = () → void;
+typedef F = () →* void;
+static final field core::Type* x = () →* void;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
index 19bc37f..cae7242 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl 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}.+(b);
-    core::double r2 = this.{self::C::a}.-(b);
-    core::double r3 = this.{self::C::a}.*(b);
-    core::double r4 = this.{self::C::a}./(b);
+  method op(core::double* b) → void {
+    core::double* r1 = this.{self::C::a}.+(b);
+    core::double* r2 = this.{self::C::a}.-(b);
+    core::double* r3 = this.{self::C::a}.*(b);
+    core::double* r4 = this.{self::C::a}./(b);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
index 19bc37f..cae7242 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl 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}.+(b);
-    core::double r2 = this.{self::C::a}.-(b);
-    core::double r3 = this.{self::C::a}.*(b);
-    core::double r4 = this.{self::C::a}./(b);
+  method op(core::double* b) → void {
+    core::double* r1 = this.{self::C::a}.+(b);
+    core::double* r2 = this.{self::C::a}.-(b);
+    core::double* r3 = this.{self::C::a}.*(b);
+    core::double* r4 = this.{self::C::a}./(b);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
index 4798570..6c48e12 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl 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}.{core::num::+}(b) as{TypeError} core::double;
-    core::double r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} core::double;
-    core::double r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} core::double;
-    core::double r4 = this.{self::C::a}.{core::num::/}(b);
+  method op(core::double* b) → void {
+    core::double* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} core::double*;
+    core::double* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} core::double*;
+    core::double* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} core::double*;
+    core::double* r4 = this.{self::C::a}.{core::num::/}(b);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
index 4798570..6c48e12 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_double.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl 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}.{core::num::+}(b) as{TypeError} core::double;
-    core::double r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} core::double;
-    core::double r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} core::double;
-    core::double r4 = this.{self::C::a}.{core::num::/}(b);
+  method op(core::double* b) → void {
+    core::double* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} core::double*;
+    core::double* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} core::double*;
+    core::double* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} core::double*;
+    core::double* r4 = this.{self::C::a}.{core::num::/}(b);
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
index 9c77221..979fbf0 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl 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}.+(b);
-    self::C::T r2 = this.{self::C::a}.-(b);
-    self::C::T r3 = this.{self::C::a}.*(b);
+  method op(core::int* b) → void {
+    self::C::T* r1 = this.{self::C::a}.+(b);
+    self::C::T* r2 = this.{self::C::a}.-(b);
+    self::C::T* r3 = this.{self::C::a}.*(b);
   }
-  method opEq(core::int b) → void {
+  method opEq(core::int* b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
index 9c77221..979fbf0 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl 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}.+(b);
-    self::C::T r2 = this.{self::C::a}.-(b);
-    self::C::T r3 = this.{self::C::a}.*(b);
+  method op(core::int* b) → void {
+    self::C::T* r1 = this.{self::C::a}.+(b);
+    self::C::T* r2 = this.{self::C::a}.-(b);
+    self::C::T* r3 = this.{self::C::a}.*(b);
   }
-  method opEq(core::int b) → void {
+  method opEq(core::int* b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
index beb87c4..5295bd4 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl 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}.{core::num::+}(b) as{TypeError} self::C::T;
-    self::C::T r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    self::C::T r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method op(core::int* b) → void {
+    self::C::T* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
-  method opEq(core::int b) → void {
-    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method opEq(core::int* b) → void {
+    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
index beb87c4..5295bd4 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_int.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl 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}.{core::num::+}(b) as{TypeError} self::C::T;
-    self::C::T r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    self::C::T r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method op(core::int* b) → void {
+    self::C::T* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
-  method opEq(core::int b) → void {
-    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method opEq(core::int* b) → void {
+    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
index b4e4156..25a129f 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method op(generic-covariant-impl self::C::T b) → void {
-    self::C::T r1 = this.{self::C::a}.+(b);
-    self::C::T r2 = this.{self::C::a}.-(b);
-    self::C::T r3 = this.{self::C::a}.*(b);
+  method op(generic-covariant-impl self::C::T* b) → void {
+    self::C::T* r1 = this.{self::C::a}.+(b);
+    self::C::T* r2 = this.{self::C::a}.-(b);
+    self::C::T* r3 = this.{self::C::a}.*(b);
   }
-  method opEq(generic-covariant-impl self::C::T b) → void {
+  method opEq(generic-covariant-impl self::C::T* b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
index b4e4156..25a129f 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method op(generic-covariant-impl self::C::T b) → void {
-    self::C::T r1 = this.{self::C::a}.+(b);
-    self::C::T r2 = this.{self::C::a}.-(b);
-    self::C::T r3 = this.{self::C::a}.*(b);
+  method op(generic-covariant-impl self::C::T* b) → void {
+    self::C::T* r1 = this.{self::C::a}.+(b);
+    self::C::T* r2 = this.{self::C::a}.-(b);
+    self::C::T* r3 = this.{self::C::a}.*(b);
   }
-  method opEq(generic-covariant-impl self::C::T b) → void {
+  method opEq(generic-covariant-impl self::C::T* b) → void {
     this.{self::C::a} = this.{self::C::a}.+(b);
     this.{self::C::a} = this.{self::C::a}.-(b);
     this.{self::C::a} = this.{self::C::a}.*(b);
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
index 0a737f2..5df9117 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method op(generic-covariant-impl self::C::T b) → void {
-    self::C::T r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    self::C::T r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    self::C::T r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method op(generic-covariant-impl self::C::T* b) → void {
+    self::C::T* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
-  method opEq(generic-covariant-impl self::C::T b) → void {
-    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method opEq(generic-covariant-impl self::C::T* b) → void {
+    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
index 0a737f2..5df9117 100644
--- a/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/refine_binary_expression_type_type_parameter_t_t.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::num = core::num> extends core::Object {
-  generic-covariant-impl field self::C::T a = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::num* = core::num*> extends core::Object {
+  generic-covariant-impl field self::C::T* a = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method op(generic-covariant-impl self::C::T b) → void {
-    self::C::T r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    self::C::T r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    self::C::T r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method op(generic-covariant-impl self::C::T* b) → void {
+    self::C::T* r1 = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    self::C::T* r2 = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    self::C::T* r3 = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
-  method opEq(generic-covariant-impl self::C::T b) → void {
-    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T;
-    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T;
+  method opEq(generic-covariant-impl self::C::T* b) → void {
+    this.{self::C::a} = this.{self::C::a}.{core::num::+}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::-}(b) as{TypeError} self::C::T*;
+    this.{self::C::a} = this.{self::C::a}.{core::num::*}(b) as{TypeError} self::C::T*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect
index 7e9ace6..185c885 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int value) → dynamic {}
+  set x(core::int* value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect
index 7e9ace6..185c885 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int value) → dynamic {}
+  set x(core::int* value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
index 1ae8232..8e02e6b 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  set x(core::int value) → dynamic
+  set x(core::int* value) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
index 7e9ace6..185c885 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int value) → dynamic {}
+  set x(core::int* value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
index 7e9ace6..185c885 100644
--- a/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/setter_return_type.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::int value) → dynamic {}
+  set x(core::int* value) → dynamic {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 class D extends self::C implements self::I {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(core::int value) → void {}
+  set x(core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart b/pkg/front_end/testcases/inference/simple_literal_bool.dart
index d1f1a07..8e8ed6e 100644
--- a/pkg/front_end/testcases/inference/simple_literal_bool.dart
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart
@@ -8,5 +8,5 @@
 var a = true;
 
 main() {
-  var /*@type=bool*/ b = false;
+  var /*@ type=bool* */ b = false;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.expect
index de8e757..da6bc88 100644
--- a/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a = true;
+static field core::bool* a = true;
 static method main() → dynamic {
-  core::bool b = false;
+  core::bool* b = false;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.transformed.expect
index de8e757..da6bc88 100644
--- a/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_bool.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::bool a = true;
+static field core::bool* a = true;
 static method main() → dynamic {
-  core::bool b = false;
+  core::bool* b = false;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart b/pkg/front_end/testcases/inference/simple_literal_double.dart
index c595708..e08049f 100644
--- a/pkg/front_end/testcases/inference/simple_literal_double.dart
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart
@@ -8,5 +8,5 @@
 var a = 1.2;
 
 main() {
-  var /*@type=double*/ b = 3.4;
+  var /*@ type=double* */ b = 3.4;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.expect
index 726eddf..ce86f42 100644
--- a/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::double a = 1.2;
+static field core::double* a = 1.2;
 static method main() → dynamic {
-  core::double b = 3.4;
+  core::double* b = 3.4;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.transformed.expect
index 726eddf..ce86f42 100644
--- a/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_double.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::double a = 1.2;
+static field core::double* a = 1.2;
 static method main() → dynamic {
-  core::double b = 3.4;
+  core::double* b = 3.4;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart b/pkg/front_end/testcases/inference/simple_literal_int.dart
index c01ba89..a73905d 100644
--- a/pkg/front_end/testcases/inference/simple_literal_int.dart
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart
@@ -8,5 +8,5 @@
 var a = 1;
 
 main() {
-  var /*@type=int*/ b = 2;
+  var /*@ type=int* */ b = 2;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.expect
index f3562b0..02faaca 100644
--- a/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int a = 1;
+static field core::int* a = 1;
 static method main() → dynamic {
-  core::int b = 2;
+  core::int* b = 2;
 }
diff --git a/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.transformed.expect
index f3562b0..02faaca 100644
--- a/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/simple_literal_int.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int a = 1;
+static field core::int* a = 1;
 static method main() → dynamic {
-  core::int b = 2;
+  core::int* b = 2;
 }
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect
index 414add8..6f23c87 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f(core::String s) → core::int
+  static method f(core::String* s) → core::int*
     return null;
 }
-static const field dynamic v = self::C::f;
+static const field dynamic v = #C1;
 static method main() → dynamic {
-  self::v;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::C::f
 }
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect
index 414add8..6f23c87 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.legacy.transformed.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f(core::String s) → core::int
+  static method f(core::String* s) → core::int*
     return null;
 }
-static const field dynamic v = self::C::f;
+static const field dynamic v = #C1;
 static method main() → dynamic {
-  self::v;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::C::f
 }
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.expect
index a5d09a8..febeba1 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f(core::String s) → core::int
+  static method f(core::String* s) → core::int*
     return null;
 }
-static const field (core::String) → core::int v = self::C::f;
+static const field (core::String*) →* core::int* v = #C1;
 static method main() → dynamic {
-  self::v;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::C::f
 }
diff --git a/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.transformed.expect
index a5d09a8..febeba1 100644
--- a/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/static_method_tear_off.dart.strong.transformed.expect
@@ -3,13 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  static method f(core::String s) → core::int
+  static method f(core::String* s) → core::int*
     return null;
 }
-static const field (core::String) → core::int v = self::C::f;
+static const field (core::String*) →* core::int* v = #C1;
 static method main() → dynamic {
-  self::v;
+  #C1;
+}
+
+constants  {
+  #C1 = tearoff self::C::f
 }
diff --git a/pkg/front_end/testcases/inference/string_literal.dart b/pkg/front_end/testcases/inference/string_literal.dart
index 6eb5292..878aad4 100644
--- a/pkg/front_end/testcases/inference/string_literal.dart
+++ b/pkg/front_end/testcases/inference/string_literal.dart
@@ -11,8 +11,8 @@
 var c = 'c ${x} cc' 'ccc';
 
 main() {
-  var /*@type=int*/ x = 1;
-  var /*@type=String*/ a = 'aaa';
-  var /*@type=String*/ b = 'b ${x} bb';
-  var /*@type=String*/ c = 'c ${x} cc' 'ccc';
+  var /*@ type=int* */ x = 1;
+  var /*@ type=String* */ a = 'aaa';
+  var /*@ type=String* */ b = 'b ${x} bb';
+  var /*@ type=String* */ c = 'c ${x} cc' 'ccc';
 }
diff --git a/pkg/front_end/testcases/inference/string_literal.dart.strong.expect b/pkg/front_end/testcases/inference/string_literal.dart.strong.expect
index 316edda..c59623a 100644
--- a/pkg/front_end/testcases/inference/string_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/string_literal.dart.strong.expect
@@ -2,13 +2,13 @@
 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 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";
+  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/string_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/string_literal.dart.strong.transformed.expect
index 316edda..c59623a 100644
--- a/pkg/front_end/testcases/inference/string_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/string_literal.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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 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";
+  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 b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart
index 38ba514..bfd1c0b 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart
@@ -6,9 +6,9 @@
 library test;
 
 class C {
-  List<num> x = /*@typeArgs=num*/ [0];
+  List<num> x = /*@ typeArgs=num* */ [0];
 }
 
-List<num> y = /*@typeArgs=num*/ [0];
+List<num> y = /*@ typeArgs=num* */ [0];
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect
index cadde27..2f30437 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::List<core::num> x = <dynamic>[0];
-  synthetic constructor •() → self::C
+  field core::List<core::num*>* x = <dynamic>[0];
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::List<core::num> y = <dynamic>[0];
+static field core::List<core::num*>* y = <dynamic>[0];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect
index cadde27..2f30437 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::List<core::num> x = <dynamic>[0];
-  synthetic constructor •() → self::C
+  field core::List<core::num*>* x = <dynamic>[0];
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::List<core::num> y = <dynamic>[0];
+static field core::List<core::num*>* y = <dynamic>[0];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.outline.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.outline.expect
index 0f4e3eb..68fbc7f 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::List<core::num> x;
-  synthetic constructor •() → self::C
+  field core::List<core::num*>* x;
+  synthetic constructor •() → self::C*
     ;
 }
-static field core::List<core::num> y;
+static field core::List<core::num*>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.expect
index 8ce1794..8293a16 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::List<core::num> x = <core::num>[0];
-  synthetic constructor •() → self::C
+  field core::List<core::num*>* x = <core::num*>[0];
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::List<core::num> y = <core::num>[0];
+static field core::List<core::num*>* y = <core::num*>[0];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.transformed.expect
index 8ce1794..8293a16 100644
--- a/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/subexpressions_of_explicitly_typed_fields.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::List<core::num> x = <core::num>[0];
-  synthetic constructor •() → self::C
+  field core::List<core::num*>* x = <core::num*>[0];
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::List<core::num> y = <core::num>[0];
+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 b/pkg/front_end/testcases/inference/super_index_set.dart
index bb8511b..82ad78d 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart
+++ b/pkg/front_end/testcases/inference/super_index_set.dart
@@ -18,7 +18,7 @@
   void h() {
     // Note: the index is inferred with an empty context due to issue 31336.
     super /*@target=B::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=String*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=String* */ f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect
index 8ecdb24..0d22aaf 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator []=(core::int x, core::String y) → void {}
+  operator []=(core::int* x, core::String* y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator []=(core::Object x, core::Object y) → void {}
+  operator []=(core::Object* x, core::Object* y) → void {}
   method h() → void {
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.transformed.expect
index 8ecdb24..0d22aaf 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.legacy.transformed.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator []=(core::int x, core::String y) → void {}
+  operator []=(core::int* x, core::String* y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator []=(core::Object x, core::Object y) → void {}
+  operator []=(core::Object* x, core::Object* y) → void {}
   method h() → void {
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
index 2def119..3aaa9eb 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.outline.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator []=(core::int x, core::String y) → void
+  operator []=(core::int* x, core::String* y) → void
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  operator []=(core::Object x, core::Object y) → void
+  operator []=(core::Object* x, core::Object* y) → void
     ;
   method h() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect b/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
index 1728494..7e58394 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.strong.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator []=(core::int x, core::String y) → void {}
+  operator []=(core::int* x, core::String* y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator []=(core::Object x, core::Object y) → void {}
+  operator []=(core::Object* x, core::Object* y) → void {}
   method h() → void {
-    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int, self::f<core::String>());
+    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int*, self::f<core::String*>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
index 1728494..7e58394 100644
--- a/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set.dart.strong.transformed.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator []=(core::int x, core::String y) → void {}
+  operator []=(core::int* x, core::String* y) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator []=(core::Object x, core::Object y) → void {}
+  operator []=(core::Object* x, core::Object* y) → void {}
   method h() → void {
-    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int, self::f<core::String>());
+    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::int*, self::f<core::String*>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/super_index_set_substitution.dart
index 541b185..e686edc 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart
@@ -18,7 +18,7 @@
   void h() {
     // Note: the index is inferred with an empty context due to issue 31336.
     super /*@target=B::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=List<Future<C::U>>*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=List<Future<C::U*>*>* */ f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
index 8793d9b..bf34b84 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.expect
@@ -5,21 +5,21 @@
 
 import "dart:async";
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int*, self::B::T*>* x, generic-covariant-impl core::List<self::B::T*>* y) → void {}
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
+  operator []=(generic-covariant-impl core::Object* x, generic-covariant-impl core::Object* y) → void {}
   method h() → void {
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
index 8793d9b..bf34b84 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.legacy.transformed.expect
@@ -5,21 +5,21 @@
 
 import "dart:async";
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int*, self::B::T*>* x, generic-covariant-impl core::List<self::B::T*>* y) → void {}
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
+  operator []=(generic-covariant-impl core::Object* x, generic-covariant-impl core::Object* y) → void {}
   method h() → void {
     super.{self::B::[]=}(self::f<dynamic>(), self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
index adfd796..f0b7a13 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.outline.expect
@@ -5,21 +5,21 @@
 
 import "dart:async";
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void
+  operator []=(generic-covariant-impl core::Map<core::int*, self::B::T*>* x, generic-covariant-impl core::List<self::B::T*>* y) → void
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  operator []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void
+  operator []=(generic-covariant-impl core::Object* x, generic-covariant-impl core::Object* y) → void
     ;
   method h() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
index bc2d428..7827c2f 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.expect
@@ -5,21 +5,21 @@
 
 import "dart:async";
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int*, self::B::T*>* x, generic-covariant-impl core::List<self::B::T*>* y) → void {}
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
+  operator []=(generic-covariant-impl core::Object* x, generic-covariant-impl core::Object* y) → void {}
   method h() → void {
-    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::Map<core::int, asy::Future<self::C::U>>, self::f<core::List<asy::Future<self::C::U>>>());
+    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} 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
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
index bc2d428..7827c2f 100644
--- a/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_index_set_substitution.dart.strong.transformed.expect
@@ -5,21 +5,21 @@
 
 import "dart:async";
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator []=(generic-covariant-impl core::Map<core::int, self::B::T> x, generic-covariant-impl core::List<self::B::T> y) → void {}
+  operator []=(generic-covariant-impl core::Map<core::int*, self::B::T*>* x, generic-covariant-impl core::List<self::B::T*>* y) → void {}
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 []=(generic-covariant-impl core::Object x, generic-covariant-impl core::Object y) → void {}
+  operator []=(generic-covariant-impl core::Object* x, generic-covariant-impl core::Object* y) → void {}
   method h() → void {
-    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} core::Map<core::int, asy::Future<self::C::U>>, self::f<core::List<asy::Future<self::C::U>>>());
+    super.{self::B::[]=}(self::f<dynamic>() as{TypeError} 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
+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 b/pkg/front_end/testcases/inference/super_initializer.dart
index 1f53782..f8b10f1 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart
+++ b/pkg/front_end/testcases/inference/super_initializer.dart
@@ -8,7 +8,7 @@
 T f<T>() => null;
 
 class C extends B {
-  C() : super(/*@typeArgs=int*/ f());
+  C() : super(/*@ typeArgs=int* */ f());
 }
 
 class B {
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect
index 53ff637..195e258 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::B::•(self::f<dynamic>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → self::B
+  constructor •(core::int* x) → self::B*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.transformed.expect
index 53ff637..195e258 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::B::•(self::f<dynamic>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → self::B
+  constructor •(core::int* x) → self::B*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
index 45ea299..723d5f7 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.outline.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → self::B
+  constructor •(core::int* x) → self::B*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect b/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
index 259b742..89b8f47 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → self::C
-    : super self::B::•(self::f<core::int>())
+  constructor •() → self::C*
+    : super self::B::•(self::f<core::int*>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → self::B
+  constructor •(core::int* x) → self::B*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
index 259b742..89b8f47 100644
--- a/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends self::B {
-  constructor •() → self::C
-    : super self::B::•(self::f<core::int>())
+  constructor •() → self::C*
+    : super self::B::•(self::f<core::int*>())
     ;
 }
 class B extends core::Object {
-  constructor •(core::int x) → self::B
+  constructor •(core::int* x) → self::B*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/super_initializer_substitution.dart
index 68731e3..b9a4862 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart
@@ -12,7 +12,7 @@
 }
 
 class C<U> extends B<List<U>> {
-  C() : super(/*@typeArgs=List<C::U>*/ f());
+  C() : super(/*@ typeArgs=List<C::U*>* */ f());
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect
index 54c17dc..7778d19 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.expect
@@ -2,16 +2,16 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
-  constructor •() → self::C<self::C::U>
+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<dynamic>())
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.transformed.expect
index 54c17dc..7778d19 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
-  constructor •() → self::C<self::C::U>
+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<dynamic>())
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
index fae46ae..28a69b5 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.outline.expect
@@ -2,15 +2,15 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<core::List<self::C::U>> {
-  constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<core::List<self::C::U*>*> {
+  constructor •() → self::C<self::C::U*>*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
index 5a07b9c..885c1fb 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.expect
@@ -2,16 +2,16 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-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>>())
+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
+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.strong.transformed.expect b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
index 5a07b9c..885c1fb 100644
--- a/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_initializer_substitution.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* t) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-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>>())
+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
+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 b/pkg/front_end/testcases/inference/super_method_invocation.dart
index c81495f..21b7a9b 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart
@@ -11,7 +11,7 @@
 
 class D extends C {
   void g() {
-    var /*@type=int*/ x = super. /*@target=C::f*/ f();
+    var /*@ type=int* */ x = super. /*@target=C::f*/ f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect
index 96ef81c..ff6911d 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect
index 96ef81c..ff6911d 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.outline.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.outline.expect
index 6a98115..3e1ecf1 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method f() → core::int
+  method f() → core::int*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.expect
index e80bf31..e669dba 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int x = super.{self::C::f}();
+    core::int* x = super.{self::C::f}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.transformed.expect
index e80bf31..e669dba 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int x = super.{self::C::f}();
+    core::int* x = super.{self::C::f}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart
index 0abf21c..b9d5a78 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart
@@ -20,8 +20,8 @@
 class C<U> extends B<Future<U>> {
   E<Future<U>> g(Object x) => null;
   void h() {
-    var /*@type=D<Future<C::U>>*/ x =
-        super. /*@target=B::g*/ g(/*@typeArgs=E<Future<C::U>>*/ f());
+    var /*@ type=D<Future<C::U*>*>* */ x =
+        super. /*@target=B::g*/ g(/*@ typeArgs=E<Future<C::U*>*>* */ f());
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
index 219fa54..80ef02e 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  method g(generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     return null;
   method h() → void {
     dynamic x = super.{self::B::g}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_substitution.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
index 219fa54..80ef02e 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.legacy.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  method g(generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     return null;
   method h() → void {
     dynamic x = super.{self::B::g}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
index 07019f3..86475af 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.outline.expect
@@ -5,29 +5,29 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  method g(generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  method g(generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     ;
   method h() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
index 494df6b..f4fe221 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  method g(generic-covariant-impl 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>>>());
+    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
+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_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
index 494df6b..f4fe221 100644
--- a/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_method_invocation_substitution.dart.strong.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method g(generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  method g(generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  method g(generic-covariant-impl 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>>>());
+    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
+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 b/pkg/front_end/testcases/inference/super_property_get.dart
index d778047..3edcecd 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart
+++ b/pkg/front_end/testcases/inference/super_property_get.dart
@@ -11,7 +11,7 @@
 
 class D extends C {
   void g() {
-    var /*@type=int*/ y = super. /*@target=C::x*/ x;
+    var /*@ type=int* */ y = super. /*@target=C::x*/ x;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect
index 0620b0b..329541a 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect
index 0620b0b..329541a 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.legacy.transformed.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic x = 0;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
index 85fa11e..b8b9db0 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.outline.expect
@@ -4,11 +4,11 @@
 
 class C extends core::Object {
   field dynamic x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get.dart.strong.expect
index 2dfb475..2ac2dc30 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::C
+  field core::int* x = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::x};
+    core::int* y = super.{self::C::x};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get.dart.strong.transformed.expect
index 2dfb475..2ac2dc30 100644
--- a/pkg/front_end/testcases/inference/super_property_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int x = 0;
-  synthetic constructor •() → self::C
+  field core::int* x = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::x};
+    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 b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
index 75a68da..6c7f7da 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart
@@ -6,12 +6,12 @@
 library test;
 
 class C {
-  var f = /*@returnType=int*/ () => 0;
+  var f = /*@ returnType=int* */ () => 0;
 }
 
 class D extends C {
   void g() {
-    var /*@type=int*/ y = super. /*@target=C::f*/ f();
+    var /*@ type=int* */ y = super. /*@target=C::f*/ f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect
index 5a8878f..85dd5ca 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic f = () → dynamic => 0;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect
index 5a8878f..85dd5ca 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.legacy.transformed.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic f = () → dynamic => 0;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
index 600003c..4752269 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.outline.expect
@@ -4,11 +4,11 @@
 
 class C extends core::Object {
   field dynamic f;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.expect
index 443bec8..73d477f 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field () → core::int f = () → core::int => 0;
-  synthetic constructor •() → self::C
+  field () →* core::int* f = () → core::int* => 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::f}.call();
+    core::int* y = super.{self::C::f}.call();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.transformed.expect
index 443bec8..73d477f 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_function_typed.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field () → core::int f = () → core::int => 0;
-  synthetic constructor •() → self::C
+  field () →* core::int* f = () → core::int* => 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::f}.call();
+    core::int* y = super.{self::C::f}.call();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
index e7d11f2..75fa5b5 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart
@@ -15,7 +15,7 @@
 
 class D extends C {
   void g() {
-    var /*@type=int*/ y =
+    var /*@ type=int* */ y =
         super. /*@target=C::f*/ f /*@target=CallableClass::call*/ ();
   }
 }
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect
index 8a5e9c2..a95bbe7 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → self::CallableClass
+  synthetic constructor •() → self::CallableClass*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class C extends core::Object {
   field dynamic f = new self::CallableClass::•();
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect
index 8a5e9c2..a95bbe7 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → self::CallableClass
+  synthetic constructor •() → self::CallableClass*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class C extends core::Object {
   field dynamic f = new self::CallableClass::•();
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
index 1cb2b4d..ec6089a 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → self::CallableClass
+  synthetic constructor •() → self::CallableClass*
     ;
-  method call() → core::int
+  method call() → core::int*
     ;
 }
 class C extends core::Object {
   field dynamic f;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.expect
index 9127b67..54a2bd5 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → self::CallableClass
+  synthetic constructor •() → self::CallableClass*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class C extends core::Object {
-  field self::CallableClass f = new self::CallableClass::•();
-  synthetic constructor •() → self::C
+  field self::CallableClass* f = new self::CallableClass::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::f}.{self::CallableClass::call}();
+    core::int* y = super.{self::C::f}.{self::CallableClass::call}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.transformed.expect
index 9127b67..54a2bd5 100644
--- a/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_invoke_implicit_call.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class CallableClass extends core::Object {
-  synthetic constructor •() → self::CallableClass
+  synthetic constructor •() → self::CallableClass*
     : super core::Object::•()
     ;
-  method call() → core::int
+  method call() → core::int*
     return 0;
 }
 class C extends core::Object {
-  field self::CallableClass f = new self::CallableClass::•();
-  synthetic constructor •() → self::C
+  field self::CallableClass* f = new self::CallableClass::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    core::int y = super.{self::C::f}.{self::CallableClass::call}();
+    core::int* y = super.{self::C::f}.{self::CallableClass::call}();
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart b/pkg/front_end/testcases/inference/super_property_get_substitution.dart
index fec68f1..07eaf74 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart
@@ -19,7 +19,7 @@
   E<Future<U>> get x => null;
   void set x(Object x) {}
   void g() {
-    var /*@type=D<Future<C::U>>*/ y = super. /*@target=B::x*/ x;
+    var /*@ type=D<Future<C::U*>*>* */ y = super. /*@target=B::x*/ x;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
index 87b866d..9a53262 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.expect
@@ -5,29 +5,29 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
     dynamic y = super.{self::B::x};
   }
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
index 87b866d..9a53262 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.legacy.transformed.expect
@@ -5,29 +5,29 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
     dynamic y = super.{self::B::x};
   }
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
index 941b8de..d2f31a1 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.outline.expect
@@ -5,25 +5,25 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::D<self::B::T> x;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  get x() → self::E<asy::Future<self::C::U>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     ;
-  set x(generic-covariant-impl core::Object x) → void
+  set x(generic-covariant-impl core::Object* x) → void
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
index a65e554..55d5e7b 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.expect
@@ -5,31 +5,31 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
-    self::D<asy::Future<self::C::U>> y = super.{self::B::x};
+    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_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
index a65e554..55d5e7b 100644
--- a/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_substitution.dart.strong.transformed.expect
@@ -5,31 +5,31 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
-    self::D<asy::Future<self::C::U>> y = super.{self::B::x};
+    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 b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart
index 56d70e0..d700836 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart
@@ -11,7 +11,7 @@
 
 class D extends C {
   void g() {
-    var /*@type=() -> int*/ y = super. /*@target=C::f*/ f;
+    var /*@ type=() ->* int* */ y = super. /*@target=C::f*/ f;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect
index b002df5..880235e 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect
index b002df5..880235e 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.legacy.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.outline.expect
index 6a98115..3e1ecf1 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method f() → core::int
+  method f() → core::int*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   method g() → void
     ;
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.expect
index 9ae5e9f..48ef35d 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    () → core::int y = super.{self::C::f};
+    () →* core::int* y = super.{self::C::f};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.transformed.expect
index 9ae5e9f..48ef35d 100644
--- a/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_get_tearoff.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f() → core::int
+  method f() → core::int*
     return 0;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   method g() → void {
-    () → core::int y = super.{self::C::f};
+    () →* core::int* y = super.{self::C::f};
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart b/pkg/front_end/testcases/inference/super_property_set_substitution.dart
index 27a01bf..d917705 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart
@@ -21,7 +21,7 @@
   E<Future<U>> get x => null;
   void set x(Object x) {}
   void g() {
-    super. /*@target=B::x*/ x = /*@typeArgs=D<Future<C::U>>*/ f();
+    super. /*@target=B::x*/ x = /*@ typeArgs=D<Future<C::U*>*>* */ f();
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
index fec3618..ce6e4c3 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
     super.{self::B::x} = self::f<dynamic>();
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_set_substitution.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
index fec3618..ce6e4c3 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.legacy.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
     super.{self::B::x} = self::f<dynamic>();
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_set_substitution.dart.outline.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
index cf71077..5d06047 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.outline.expect
@@ -5,30 +5,30 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::D<self::B::T> x;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  get x() → self::E<asy::Future<self::C::U>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     ;
-  set x(generic-covariant-impl core::Object x) → void
+  set x(generic-covariant-impl core::Object* x) → void
     ;
   method g() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
index bd20e55..9cca08c 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
-    super.{self::B::x} = self::f<self::D<asy::Future<self::C::U>>>();
+    super.{self::B::x} = self::f<self::D<asy::Future<self::C::U*>*>*>();
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_set_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
index bd20e55..9cca08c 100644
--- a/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/super_property_set_substitution.dart.strong.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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 {
-  generic-covariant-impl field self::D<self::B::T> x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::D<self::B::T*>* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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>>
+  get x() → self::E<asy::Future<self::C::U*>*>*
     return null;
-  set x(generic-covariant-impl core::Object x) → void {}
+  set x(generic-covariant-impl core::Object* x) → void {}
   method g() → void {
-    super.{self::B::x} = self::f<self::D<asy::Future<self::C::U>>>();
+    super.{self::B::x} = self::f<self::D<asy::Future<self::C::U*>*>*>();
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.expect b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.expect
index 9a02ec6..17603ab 100644
--- a/pkg/front_end/testcases/inference/switch_continue.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::int x, () → void f) → void {
+static method test(core::int* x, () →* void f) → void {
   #L1:
   switch(x) {
     #L2:
-    case 0:
+    case #C1:
       {
         f.call();
         continue #L3;
       }
     #L3:
-    case 1:
+    case #C2:
       {
         f.call();
         break #L1;
@@ -20,3 +20,8 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect
index 9a02ec6..17603ab 100644
--- a/pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::int x, () → void f) → void {
+static method test(core::int* x, () →* void f) → void {
   #L1:
   switch(x) {
     #L2:
-    case 0:
+    case #C1:
       {
         f.call();
         continue #L3;
       }
     #L3:
-    case 1:
+    case #C2:
       {
         f.call();
         break #L1;
@@ -20,3 +20,8 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.outline.expect b/pkg/front_end/testcases/inference/switch_continue.dart.outline.expect
index bf80ced..972d948 100644
--- a/pkg/front_end/testcases/inference/switch_continue.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::int x, () → void f) → void
+static method test(core::int* x, () →* void f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.strong.expect b/pkg/front_end/testcases/inference/switch_continue.dart.strong.expect
index 9a02ec6..17603ab 100644
--- a/pkg/front_end/testcases/inference/switch_continue.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::int x, () → void f) → void {
+static method test(core::int* x, () →* void f) → void {
   #L1:
   switch(x) {
     #L2:
-    case 0:
+    case #C1:
       {
         f.call();
         continue #L3;
       }
     #L3:
-    case 1:
+    case #C2:
       {
         f.call();
         break #L1;
@@ -20,3 +20,8 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/inference/switch_continue.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/switch_continue.dart.strong.transformed.expect
index 9a02ec6..17603ab 100644
--- a/pkg/front_end/testcases/inference/switch_continue.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/switch_continue.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(core::int x, () → void f) → void {
+static method test(core::int* x, () →* void f) → void {
   #L1:
   switch(x) {
     #L2:
-    case 0:
+    case #C1:
       {
         f.call();
         continue #L3;
       }
     #L3:
-    case 1:
+    case #C2:
       {
         f.call();
         break #L1;
@@ -20,3 +20,8 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = 1
+}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart b/pkg/front_end/testcases/inference/symbol_literal.dart
index 7aeae82..3d30fef 100644
--- a/pkg/front_end/testcases/inference/symbol_literal.dart
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart
@@ -6,7 +6,7 @@
 library test;
 
 void test() {
-  var /*@type=Symbol*/ x = #foo;
+  var /*@ type=Symbol* */ x = #foo;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect
index 88a58fe..d3552d8 100644
--- a/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.expect
@@ -1,7 +1,12 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
 static method test() → void {
-  dynamic x = #foo;
+  dynamic x = #C1;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect
index 88a58fe..d3552d8 100644
--- a/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart.legacy.transformed.expect
@@ -1,7 +1,12 @@
 library test;
 import self as self;
+import "dart:core" as core;
 
 static method test() → void {
-  dynamic x = #foo;
+  dynamic x = #C1;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.strong.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.strong.expect
index ea090c7..1a4d6a8 100644
--- a/pkg/front_end/testcases/inference/symbol_literal.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart.strong.expect
@@ -3,6 +3,10 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::Symbol x = #foo;
+  core::Symbol* x = #C1;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+}
diff --git a/pkg/front_end/testcases/inference/symbol_literal.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/symbol_literal.dart.strong.transformed.expect
index ea090c7..1a4d6a8 100644
--- a/pkg/front_end/testcases/inference/symbol_literal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/symbol_literal.dart.strong.transformed.expect
@@ -3,6 +3,10 @@
 import "dart:core" as core;
 
 static method test() → void {
-  core::Symbol x = #foo;
+  core::Symbol* x = #C1;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+}
diff --git a/pkg/front_end/testcases/inference/this_reference.dart b/pkg/front_end/testcases/inference/this_reference.dart
index 36bd0b4..6e380dd 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart
+++ b/pkg/front_end/testcases/inference/this_reference.dart
@@ -7,7 +7,7 @@
 
 class C<T> {
   void f() {
-    var /*@type=C<C::T>*/ x = this;
+    var /*@ type=C<C::T*>* */ x = this;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.legacy.expect b/pkg/front_end/testcases/inference/this_reference.dart.legacy.expect
index 400f200..79ba558 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.legacy.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect
index 400f200..79ba558 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method f() → void {
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.outline.expect b/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
index a387a4c..ca3e5cf 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.outline.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
   method f() → void
     ;
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.strong.expect b/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
index 395a321..9240298 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.strong.expect
@@ -2,12 +2,12 @@
 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>
+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;
+    self::C<self::C::T*>* x = this;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
index 395a321..9240298 100644
--- a/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/this_reference.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 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>
+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;
+    self::C<self::C::T*>* x = this;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart
index f285b6f..9014345 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart
@@ -10,31 +10,31 @@
 typedef int IntToInt(int i);
 
 IntToInt a() {
-  return /*@returnType=int*/ (/*@type=int*/ x) => x;
+  return /*@ returnType=int* */ (/*@ type=int* */ x) => x;
 }
 
 Future<IntToInt> b() async {
   // TODO(paulberry): this is broken due to bug 29689.
-  return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
+  return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
 }
 
 Iterable<IntToInt> c() sync* {
-  yield /*@returnType=int*/ (/*@type=int*/ x) => x;
+  yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
 }
 
 Iterable<IntToInt> d() sync* {
-  yield* /*@typeArgs=(int) -> int*/ [
-    /*@returnType=int*/ (/*@type=int*/ x) => x
+  yield* /*@ typeArgs=(int*) ->* int* */ [
+    /*@ returnType=int* */ (/*@ type=int* */ x) => x
   ];
 }
 
 Stream<IntToInt> e() async* {
-  yield /*@returnType=int*/ (/*@type=int*/ x) => x;
+  yield /*@ returnType=int* */ (/*@ type=int* */ x) => x;
 }
 
 Stream<IntToInt> f() async* {
-  yield* new /*@typeArgs=(int) -> int*/ Stream.fromIterable(
-      /*@typeArgs=(int) -> int*/ [/*@returnType=int*/ (/*@type=int*/ x) => x]);
+  yield* new /*@ typeArgs=(int*) ->* int* */ Stream.fromIterable(
+      /*@ typeArgs=(int*) ->* int* */ [/*@ returnType=int* */ (/*@ type=int* */ x) => x]);
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect
index c9d9f66..5eab788 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.expect
@@ -5,23 +5,23 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int {
+typedef IntToInt = (core::int*) →* core::int*;
+static method a() → (core::int*) →* core::int* {
   return (dynamic x) → dynamic => x;
 }
-static method b() → asy::Future<(core::int) → core::int> async {
+static method b() → asy::Future<(core::int*) →* core::int*>* async {
   return (dynamic x) → dynamic => x;
 }
-static method c() → core::Iterable<(core::int) → core::int> sync* {
+static method c() → core::Iterable<(core::int*) →* core::int*>* sync* {
   yield(dynamic x) → dynamic => x;
 }
-static method d() → core::Iterable<(core::int) → core::int> sync* {
+static method d() → core::Iterable<(core::int*) →* core::int*>* sync* {
   yield*<dynamic>[(dynamic x) → dynamic => x];
 }
-static method e() → asy::Stream<(core::int) → core::int> async* {
+static method e() → asy::Stream<(core::int*) →* core::int*>* async* {
   yield(dynamic x) → dynamic => x;
 }
-static method f() → asy::Stream<(core::int) → core::int> async* {
+static method f() → asy::Stream<(core::int*) →* core::int*>* async* {
   yield* asy::Stream::fromIterable<dynamic>(<dynamic>[(dynamic x) → dynamic => x]);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect
index ecceca5..8d16e1ae 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.legacy.transformed.expect
@@ -5,13 +5,13 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int {
+typedef IntToInt = (core::int*) →* core::int*;
+static method a() → (core::int*) →* core::int* {
   return (dynamic x) → dynamic => x;
 }
-static method b() → asy::Future<(core::int) → core::int> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
-  asy::FutureOr<(core::int) → core::int> :return_value;
+static method b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+  asy::FutureOr<(core::int*) →* core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -36,10 +36,10 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+static method c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
     {
       {
         :iterator.{core::_SyncIterator::_current} = (dynamic x) → dynamic => x;
@@ -48,12 +48,12 @@
     }
     return false;
   }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
 }
-static method d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+static method d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
     {
       {
         :iterator.{core::_SyncIterator::_yieldEachIterable} = <dynamic>[(dynamic x) → dynamic => x];
@@ -62,10 +62,10 @@
     }
     return false;
   }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
 }
-static method e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+static method e() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -95,12 +95,12 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
-static method f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+static method f() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -130,7 +130,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.outline.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.outline.expect
index a5e2303..8510a42 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.outline.expect
@@ -5,18 +5,18 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int
+typedef IntToInt = (core::int*) →* core::int*;
+static method a() → (core::int*) →* core::int*
   ;
-static method b() → asy::Future<(core::int) → core::int>
+static method b() → asy::Future<(core::int*) →* core::int*>*
   ;
-static method c() → core::Iterable<(core::int) → core::int>
+static method c() → core::Iterable<(core::int*) →* core::int*>*
   ;
-static method d() → core::Iterable<(core::int) → core::int>
+static method d() → core::Iterable<(core::int*) →* core::int*>*
   ;
-static method e() → asy::Stream<(core::int) → core::int>
+static method e() → asy::Stream<(core::int*) →* core::int*>*
   ;
-static method f() → asy::Stream<(core::int) → core::int>
+static method f() → asy::Stream<(core::int*) →* core::int*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
index f39cc43..6c9873d 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-//   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-//                                  ^
+//   return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                    ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,27 +14,27 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int {
-  return (core::int x) → core::int => x;
+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 let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+static method b() → asy::Future<(core::int*) →* core::int*>* async {
+  return let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-  return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-                                 ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
+  return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                   ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
 }
-static method c() → core::Iterable<(core::int) → core::int> sync* {
-  yield(core::int x) → core::int => x;
+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 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 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 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/top_level_return_and_yield.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
index b6ef4f9..d2f7099 100644
--- a/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/top_level_return_and_yield.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+// pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
 //  - 'FutureOr' is from 'dart:async'.
 // Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-//   return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-//                                  ^
+//   return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+//                                    ^
 //
 import self as self;
 import "dart:core" as core;
@@ -14,13 +14,13 @@
 
 import "dart:async";
 
-typedef IntToInt = (core::int) → core::int;
-static method a() → (core::int) → core::int {
-  return (core::int x) → core::int => x;
+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> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<(core::int) → core::int> :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int) → core::int>();
-  asy::FutureOr<(core::int) → core::int> :return_value;
+static method b() → asy::Future<(core::int*) →* core::int*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<(core::int*) →* core::int*>* :async_completer = new asy::_AsyncAwaitCompleter::•<(core::int*) →* core::int*>();
+  asy::FutureOr<(core::int*) →* core::int*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -30,11 +30,11 @@
     try {
       #L1:
       {
-        :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:34: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
+        :return_value = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/inference/top_level_return_and_yield.dart:18:36: Error: A value of type 'dynamic Function(dynamic)' can't be assigned to a variable of type 'FutureOr<int Function(int)>'.
  - 'FutureOr' is from 'dart:async'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<int Function(int)>'.
-  return /*@returnType=dynamic*/ (/*@type=dynamic*/ x) => x;
-                                 ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int) → core::int>;
+  return /*@ returnType=dynamic */ (/*@ type=dynamic */ x) => x;
+                                   ^" in ((dynamic x) → dynamic => x) as{TypeError} asy::FutureOr<(core::int*) →* core::int*>*;
         break #L1;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -49,36 +49,36 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method c() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+static method c() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
     {
       {
-        :iterator.{core::_SyncIterator::_current} = (core::int x) → core::int => x;
+        :iterator.{core::_SyncIterator::_current} = (core::int* x) → core::int* => x;
         [yield] true;
       }
     }
     return false;
   }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
 }
-static method d() → core::Iterable<(core::int) → core::int> /* originally sync* */ {
+static method d() → core::Iterable<(core::int*) →* core::int*>* /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<(core::int) → core::int> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<(core::int*) →* core::int*>* :iterator) → core::bool* yielding {
     {
       {
-        :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int) → core::int>[(core::int x) → core::int => x];
+        :iterator.{core::_SyncIterator::_yieldEachIterable} = <(core::int*) →* core::int*>[(core::int* x) → core::int* => x];
         [yield] true;
       }
     }
     return false;
   }
-  return new core::_SyncIterable::•<(core::int) → core::int>(:sync_op);
+  return new core::_SyncIterable::•<(core::int*) →* core::int*>(:sync_op);
 }
-static method e() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+static method e() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -92,7 +92,7 @@
       try {
         #L2:
         {
-          if(:controller.{asy::_AsyncStarStreamController::add}((core::int x) → core::int => x))
+          if(:controller.{asy::_AsyncStarStreamController::add}((core::int* x) → core::int* => x))
             return null;
           else
             [yield] null;
@@ -108,12 +108,12 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
-static method f() → asy::Stream<(core::int) → core::int> /* originally async* */ {
-  asy::_AsyncStarStreamController<(core::int) → core::int> :controller;
+static method f() → asy::Stream<(core::int*) →* core::int*>* /* originally async* */ {
+  asy::_AsyncStarStreamController<(core::int*) →* core::int*>* :controller;
   dynamic :controller_stream;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
@@ -127,7 +127,7 @@
       try {
         #L3:
         {
-          if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<(core::int) → core::int>(<(core::int) → core::int>[(core::int x) → core::int => x])))
+          if(:controller.{asy::_AsyncStarStreamController::addStream}(asy::Stream::fromIterable<(core::int*) →* core::int*>(<(core::int*) →* core::int*>[(core::int* x) → core::int* => x])))
             return null;
           else
             [yield] null;
@@ -143,7 +143,7 @@
   :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
   :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
   :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :controller = new asy::_AsyncStarStreamController::•<(core::int) → core::int>(:async_op);
+  :controller = new asy::_AsyncStarStreamController::•<(core::int*) →* core::int*>(:async_op);
   :controller_stream = :controller.{asy::_AsyncStarStreamController::stream};
   return :controller_stream;
 }
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
index 80477d3..acbfe65 100644
--- a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart
@@ -8,5 +8,5 @@
 var i = 0;
 
 main() {
-  var /*@type=int*/ j = i;
+  var /*@ type=int* */ j = i;
 }
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.expect
index 2d6359d..9ab8405 100644
--- a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i = 0;
+static field core::int* i = 0;
 static method main() → dynamic {
-  core::int j = self::i;
+  core::int* j = self::i;
 }
diff --git a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.transformed.expect
index 2d6359d..9ab8405 100644
--- a/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/toplevel_inference_toplevel_var.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i = 0;
+static field core::int* i = 0;
 static method main() → dynamic {
-  core::int j = self::i;
+  core::int* j = self::i;
 }
diff --git a/pkg/front_end/testcases/inference/try_catch.dart b/pkg/front_end/testcases/inference/try_catch.dart
index 58b77eb..7b275ab 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart
+++ b/pkg/front_end/testcases/inference/try_catch.dart
@@ -13,18 +13,18 @@
 
 void test(void f()) {
   try {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
     f();
   } on C {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
   } on D catch (x) {
-    var /*@type=D*/ x2 = x;
+    var /*@ type=D* */ x2 = x;
   } on E catch (x, y) {
-    var /*@type=E*/ x2 = x;
-    var /*@type=StackTrace*/ y2 = y;
+    var /*@ type=E* */ x2 = x;
+    var /*@ type=StackTrace* */ y2 = y;
   } catch (x, y) {
-    var /*@type=dynamic*/ x2 = x;
-    var /*@type=StackTrace*/ y2 = y;
+    var /*@ type=dynamic */ x2 = x;
+    var /*@ type=StackTrace* */ y2 = y;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.legacy.expect b/pkg/front_end/testcases/inference/try_catch.dart.legacy.expect
index 93f3086..e2440e7 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.legacy.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     dynamic x = 0;
     f.call();
   }
-  on self::C catch(no-exception-var) {
+  on self::C* catch(no-exception-var) {
     dynamic x = 0;
   }
-  on self::D catch(final self::D x) {
+  on self::D* catch(final self::D* x) {
     dynamic x2 = x;
   }
-  on self::E catch(final self::E x, final core::StackTrace y) {
+  on self::E* catch(final self::E* x, final core::StackTrace* y) {
     dynamic x2 = x;
     dynamic y2 = y;
   }
-  on dynamic catch(final dynamic x, final core::StackTrace y) {
+  on dynamic catch(final dynamic x, final core::StackTrace* y) {
     dynamic x2 = x;
     dynamic y2 = y;
   }
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect
index 93f3086..e2440e7 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.legacy.transformed.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     dynamic x = 0;
     f.call();
   }
-  on self::C catch(no-exception-var) {
+  on self::C* catch(no-exception-var) {
     dynamic x = 0;
   }
-  on self::D catch(final self::D x) {
+  on self::D* catch(final self::D* x) {
     dynamic x2 = x;
   }
-  on self::E catch(final self::E x, final core::StackTrace y) {
+  on self::E* catch(final self::E* x, final core::StackTrace* y) {
     dynamic x2 = x;
     dynamic y2 = y;
   }
-  on dynamic catch(final dynamic x, final core::StackTrace y) {
+  on dynamic catch(final dynamic x, final core::StackTrace* y) {
     dynamic x2 = x;
     dynamic y2 = y;
   }
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.outline.expect b/pkg/front_end/testcases/inference/try_catch.dart.outline.expect
index 256d36b..c7fdcb4 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
-static method test(() → void f) → void
+static method test(() →* void f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.strong.expect b/pkg/front_end/testcases/inference/try_catch.dart.strong.expect
index 4e04e07..7811d3b1 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.strong.expect
@@ -3,38 +3,38 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
-    core::int x = 0;
+    core::int* x = 0;
     f.call();
   }
-  on self::C catch(no-exception-var) {
-    core::int x = 0;
+  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::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 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) {
+  on dynamic catch(final dynamic x, final core::StackTrace* y) {
     dynamic x2 = x;
-    core::StackTrace y2 = y;
+    core::StackTrace* y2 = y;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_catch.dart.strong.transformed.expect
index 4e04e07..7811d3b1 100644
--- a/pkg/front_end/testcases/inference/try_catch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch.dart.strong.transformed.expect
@@ -3,38 +3,38 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
-    core::int x = 0;
+    core::int* x = 0;
     f.call();
   }
-  on self::C catch(no-exception-var) {
-    core::int x = 0;
+  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::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 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) {
+  on dynamic catch(final dynamic x, final core::StackTrace* y) {
     dynamic x2 = x;
-    core::StackTrace y2 = y;
+    core::StackTrace* y2 = y;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart b/pkg/front_end/testcases/inference/try_catch_finally.dart
index 7cadf32..5011e4f 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart
@@ -13,20 +13,20 @@
 
 void test(void f()) {
   try {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
     f();
   } on C {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
   } on D catch (x) {
-    var /*@type=D*/ x2 = x;
+    var /*@ type=D* */ x2 = x;
   } on E catch (x, y) {
-    var /*@type=E*/ x2 = x;
-    var /*@type=StackTrace*/ y2 = y;
+    var /*@ type=E* */ x2 = x;
+    var /*@ type=StackTrace* */ y2 = y;
   } catch (x, y) {
-    var /*@type=dynamic*/ x2 = x;
-    var /*@type=StackTrace*/ y2 = y;
+    var /*@ type=dynamic */ x2 = x;
+    var /*@ type=StackTrace* */ y2 = y;
   } finally {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect
index abb2f74..ab1f326 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try
     try {
       dynamic x = 0;
       f.call();
     }
-    on self::C catch(no-exception-var) {
+    on self::C* catch(no-exception-var) {
       dynamic x = 0;
     }
-    on self::D catch(final self::D x) {
+    on self::D* catch(final self::D* x) {
       dynamic x2 = x;
     }
-    on self::E catch(final self::E x, final core::StackTrace y) {
+    on self::E* catch(final self::E* x, final core::StackTrace* y) {
       dynamic x2 = x;
       dynamic y2 = y;
     }
-    on dynamic catch(final dynamic x, final core::StackTrace y) {
+    on dynamic catch(final dynamic x, final core::StackTrace* y) {
       dynamic x2 = x;
       dynamic y2 = y;
     }
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect
index abb2f74..ab1f326 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.legacy.transformed.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try
     try {
       dynamic x = 0;
       f.call();
     }
-    on self::C catch(no-exception-var) {
+    on self::C* catch(no-exception-var) {
       dynamic x = 0;
     }
-    on self::D catch(final self::D x) {
+    on self::D* catch(final self::D* x) {
       dynamic x2 = x;
     }
-    on self::E catch(final self::E x, final core::StackTrace y) {
+    on self::E* catch(final self::E* x, final core::StackTrace* y) {
       dynamic x2 = x;
       dynamic y2 = y;
     }
-    on dynamic catch(final dynamic x, final core::StackTrace y) {
+    on dynamic catch(final dynamic x, final core::StackTrace* y) {
       dynamic x2 = x;
       dynamic y2 = y;
     }
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.outline.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.outline.expect
index 256d36b..c7fdcb4 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
-static method test(() → void f) → void
+static method test(() →* void f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.expect
index 0e79f65..49fa637 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try
     try {
-      core::int x = 0;
+      core::int* x = 0;
       f.call();
     }
-    on self::C catch(no-exception-var) {
-      core::int x = 0;
+    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::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 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) {
+    on dynamic catch(final dynamic x, final core::StackTrace* y) {
       dynamic x2 = x;
-      core::StackTrace y2 = y;
+      core::StackTrace* y2 = y;
     }
   finally {
-    core::int x = 0;
+    core::int* x = 0;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.transformed.expect
index 0e79f65..49fa637 100644
--- a/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_finally.dart.strong.transformed.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try
     try {
-      core::int x = 0;
+      core::int* x = 0;
       f.call();
     }
-    on self::C catch(no-exception-var) {
-      core::int x = 0;
+    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::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 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) {
+    on dynamic catch(final dynamic x, final core::StackTrace* y) {
       dynamic x2 = x;
-      core::StackTrace y2 = y;
+      core::StackTrace* y2 = y;
     }
   finally {
-    core::int x = 0;
+    core::int* x = 0;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart b/pkg/front_end/testcases/inference/try_catch_promotion.dart
index c29554f..7de2fde 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart
@@ -15,13 +15,13 @@
   try {
     f();
   } on C catch (x, y) {
-    var /*@type=C*/ x1 = x;
-    var /*@type=StackTrace*/ y1 = y;
+    var /*@ type=C* */ x1 = x;
+    var /*@ type=StackTrace* */ y1 = y;
     if (x is D) {
-      var /*@type=D*/ x2 = /*@promotedType=D*/ x;
+      var /*@ type=D* */ x2 = /*@ promotedType=D* */ x;
     }
     if (y is E) {
-      var /*@type=E*/ y2 = /*@promotedType=E*/ y;
+      var /*@ type=E* */ y2 = /*@ promotedType=E* */ y;
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect
index 38d33b5..0f900fe4 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     f.call();
   }
-  on self::C catch(final self::C x, final core::StackTrace y) {
+  on self::C* catch(final self::C* x, final core::StackTrace* y) {
     dynamic x1 = x;
     dynamic y1 = y;
-    if(x is self::D) {
+    if(x is self::D*) {
       dynamic x2 = x;
     }
-    if(y is self::E) {
+    if(y is self::E*) {
       dynamic y2 = y;
     }
   }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect
index 38d33b5..0f900fe4 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     f.call();
   }
-  on self::C catch(final self::C x, final core::StackTrace y) {
+  on self::C* catch(final self::C* x, final core::StackTrace* y) {
     dynamic x1 = x;
     dynamic y1 = y;
-    if(x is self::D) {
+    if(x is self::D*) {
       dynamic x2 = x;
     }
-    if(y is self::E) {
+    if(y is self::E*) {
       dynamic y2 = y;
     }
   }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
index 1fc8319..ef64e48 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
-static method test(() → void f) → void
+static method test(() →* void f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
index 390e31c..45bc116 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     f.call();
   }
-  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};
+  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};
+    if(y is self::E*) {
+      self::E* y2 = y{self::E*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
index 390e31c..45bc116 100644
--- a/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_catch_promotion.dart.strong.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::StackTrace {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::StackTrace::•()
     ;
 }
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     f.call();
   }
-  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};
+  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};
+    if(y is self::E*) {
+      self::E* y2 = y{self::E*};
     }
   }
 }
diff --git a/pkg/front_end/testcases/inference/try_finally.dart b/pkg/front_end/testcases/inference/try_finally.dart
index e8b537f..ecb45c3 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart
+++ b/pkg/front_end/testcases/inference/try_finally.dart
@@ -7,10 +7,10 @@
 
 void test(void f()) {
   try {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
     f();
   } finally {
-    var /*@type=int*/ x = 0;
+    var /*@ type=int* */ x = 0;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.legacy.expect b/pkg/front_end/testcases/inference/try_finally.dart.legacy.expect
index 8af676e..e49f188 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/try_finally.dart.legacy.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     dynamic x = 0;
     f.call();
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect
index 8af676e..e49f188 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_finally.dart.legacy.transformed.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
     dynamic x = 0;
     f.call();
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.outline.expect b/pkg/front_end/testcases/inference/try_finally.dart.outline.expect
index 3a6d9f8..c6c205c 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/try_finally.dart.outline.expect
@@ -1,7 +1,7 @@
 library test;
 import self as self;
 
-static method test(() → void f) → void
+static method test(() →* void f) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.strong.expect b/pkg/front_end/testcases/inference/try_finally.dart.strong.expect
index d84fe32..bb417be 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/try_finally.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
-    core::int x = 0;
+    core::int* x = 0;
     f.call();
   }
   finally {
-    core::int x = 0;
+    core::int* x = 0;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/try_finally.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/try_finally.dart.strong.transformed.expect
index d84fe32..bb417be 100644
--- a/pkg/front_end/testcases/inference/try_finally.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/try_finally.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method test(() → void f) → void {
+static method test(() →* void f) → void {
   try {
-    core::int x = 0;
+    core::int* x = 0;
     f.call();
   }
   finally {
-    core::int x = 0;
+    core::int* x = 0;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference/type_cast.dart b/pkg/front_end/testcases/inference/type_cast.dart
index d55a1cc..03286bd 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart
+++ b/pkg/front_end/testcases/inference/type_cast.dart
@@ -16,5 +16,5 @@
 
 main() {
   A<num> a = new B<int>();
-  var /*@type=B<int>*/ b = (a as B<int>);
+  var /*@ type=B<int*>* */ b = (a as B<int>);
 }
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.legacy.expect b/pkg/front_end/testcases/inference/type_cast.dart.legacy.expect
index adf3531..3a552a0 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.legacy.expect
@@ -2,20 +2,20 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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 dynamic b = self::a as self::B<core::int>;
+static field self::A<core::num*>* a = new self::B::•<core::int*>();
+static field dynamic b = self::a as self::B<core::int*>*;
 static method main() → dynamic {
-  self::A<core::num> a = new self::B::•<core::int>();
-  dynamic b = a as self::B<core::int>;
+  self::A<core::num*>* a = new self::B::•<core::int*>();
+  dynamic b = a as self::B<core::int*>*;
 }
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect
index adf3531..3a552a0 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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 dynamic b = self::a as self::B<core::int>;
+static field self::A<core::num*>* a = new self::B::•<core::int*>();
+static field dynamic b = self::a as self::B<core::int*>*;
 static method main() → dynamic {
-  self::A<core::num> a = new self::B::•<core::int>();
-  dynamic b = a as self::B<core::int>;
+  self::A<core::num*>* a = new self::B::•<core::int*>();
+  dynamic b = a as self::B<core::int*>*;
 }
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
index 6cb7e54..0cf1b92 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.outline.expect
@@ -2,17 +2,17 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends self::A<self::B::T*> {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
   method foo() → dynamic
     ;
 }
-static field self::A<core::num> a;
+static field self::A<core::num*>* a;
 static field dynamic b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/type_cast.dart.strong.expect b/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
index 289719f..c6dc3bb 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.strong.expect
@@ -2,20 +2,20 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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 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>;
+  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_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
index 289719f..c6dc3bb 100644
--- a/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_cast.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  synthetic constructor •() → self::B<self::B::T>
+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 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>;
+  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.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.expect
index ed2a536..6269884 100644
--- a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningInt = () → core::int;
+typedef FunctionReturningInt = () →* core::int*;
 static method main() → dynamic {
-  function f() → core::num
+  function f() → core::num*
     return 0;
-  if(f is () → core::int) {
+  if(f is () →* core::int*) {
     f;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect
index ed2a536..6269884 100644
--- a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningInt = () → core::int;
+typedef FunctionReturningInt = () →* core::int*;
 static method main() → dynamic {
-  function f() → core::num
+  function f() → core::num*
     return 0;
-  if(f is () → core::int) {
+  if(f is () →* core::int*) {
     f;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.outline.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.outline.expect
index d055413..fd0bd38 100644
--- a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.outline.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningInt = () → core::int;
+typedef FunctionReturningInt = () →* core::int*;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.expect
index ed2a536..6269884 100644
--- a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningInt = () → core::int;
+typedef FunctionReturningInt = () →* core::int*;
 static method main() → dynamic {
-  function f() → core::num
+  function f() → core::num*
     return 0;
-  if(f is () → core::int) {
+  if(f is () →* core::int*) {
     f;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.transformed.expect
index ed2a536..6269884 100644
--- a/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_ignores_local_functions.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef FunctionReturningInt = () → core::int;
+typedef FunctionReturningInt = () →* core::int*;
 static method main() → dynamic {
-  function f() → core::num
+  function f() → core::num*
     return 0;
-  if(f is () → core::int) {
+  if(f is () →* core::int*) {
     f;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect
index c1b36d9..ca793f8 100644
--- a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.expect
@@ -2,8 +2,8 @@
 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)) {
+static method f(core::Object* x) → void {
+  if(!(x is core::int*) && !(x is core::String*)) {
     core::print(x);
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect
index c1b36d9..ca793f8 100644
--- a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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)) {
+static method f(core::Object* x) → void {
+  if(!(x is core::int*) && !(x is core::String*)) {
     core::print(x);
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.outline.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.outline.expect
index 940e22f..fdb84cc 100644
--- a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::Object x) → void
+static method f(core::Object* x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.expect
index c1b36d9..ca793f8 100644
--- a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.expect
@@ -2,8 +2,8 @@
 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)) {
+static method f(core::Object* x) → void {
+  if(!(x is core::int*) && !(x is core::String*)) {
     core::print(x);
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.transformed.expect
index c1b36d9..ca793f8 100644
--- a/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_not_and_not.dart.strong.transformed.expect
@@ -2,8 +2,8 @@
 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)) {
+static method f(core::Object* x) → void {
+  if(!(x is core::int*) && !(x is core::String*)) {
     core::print(x);
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart b/pkg/front_end/testcases/inference/type_promotion_simple.dart
index 1e09fa8..a499a0f 100644
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart
@@ -8,6 +8,6 @@
 main() {
   num n = null;
   if (n is int) {
-    var /*@type=int*/ i = /*@promotedType=int*/ n;
+    var /*@ type=int* */ i = /*@ promotedType=int* */ n;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect
index ac70ded..8b5d77e 100644
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect
index ac70ded..8b5d77e 100644
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.expect
index 23b3aad..4e2acb6 100644
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::int i = n{core::int};
+  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_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.transformed.expect
index 23b3aad..4e2acb6 100644
--- a/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_simple.dart.strong.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::int i = n{core::int};
+  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 b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
index c51d581..f8fdf0b 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart
@@ -8,8 +8,8 @@
 main() {
   num n = null;
   if (n is int) {
-    var /*@type=num*/ i = n;
-    /*@returnType=Null*/ () {
+    var /*@ type=num* */ i = n;
+    /*@ returnType=Null* */ () {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect
index b17518b..1e5c83d 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
     () → dynamic {
       n;
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect
index b17518b..1e5c83d 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
     () → dynamic {
       n;
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
index c9ff1d7..ae61a78 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
-    () → core::Null {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
+    () → core::Null* {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
index c9ff1d7..ae61a78 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_access_in_a_closure.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
-    () → core::Null {
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
+    () → core::Null* {
       n;
     };
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart
index 47a1b11..3e540b0 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart
@@ -8,7 +8,7 @@
 main() {
   num n = null;
   if (n is int) {
-    var /*@type=num*/ i = n;
+    var /*@ type=num* */ i = n;
     n = null;
   }
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect
index e514dc9..348e8be 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
     n = null;
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect
index e514dc9..348e8be 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
     n = null;
   }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.expect
index 8c76b1a..ca4ba99 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
+  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_assignment_in_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.transformed.expect
index 8c76b1a..ca4ba99 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_assignment_in_scope.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
+  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 b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
index 6f4721c..17ce8b7 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart
@@ -8,9 +8,9 @@
 main() {
   num n = null;
   if (n is int) {
-    var /*@type=num*/ i = n;
+    var /*@ type=num* */ i = n;
   }
-  /*@returnType=Null*/ () {
+  /*@ returnType=Null* */ () {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect
index 94f5eec..e48bd2b 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
   }
   () → dynamic {
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect
index 94f5eec..e48bd2b 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
+  core::num* n = null;
+  if(n is core::int*) {
     dynamic i = n;
   }
   () → dynamic {
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
index 8e7c6a9..9cf4976 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
   }
-  () → core::Null {
+  () → core::Null* {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
index 8e7c6a9..9cf4976 100644
--- a/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/type_promotion_stopped_by_mutation_in_a_closure.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::num n = null;
-  if(n is core::int) {
-    core::num i = n;
+  core::num* n = null;
+  if(n is core::int*) {
+    core::num* i = n;
   }
-  () → core::Null {
+  () → core::Null* {
     n = null;
   };
 }
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect
index e054d56..de85e48 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → void {
@@ -37,6 +37,6 @@
     dynamic v5 = let final dynamic #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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/unresolved_super.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.transformed.expect
index e054d56..de85e48 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.legacy.transformed.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → void {
@@ -37,6 +37,6 @@
     dynamic v5 = let final dynamic #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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/unresolved_super.dart.outline.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
index 9286df9..862cc59 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
index eeae7d5..0addd70 100644
--- a/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unresolved_super.dart.strong.expect
@@ -26,7 +26,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → void {
@@ -34,9 +34,9 @@
     dynamic v2 = super.bar;
     dynamic v3 = super.[](0);
     dynamic v4 = super.bar = self::f<dynamic>();
-    dynamic v5 = let final core::int #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = super.[]=(#t1, #t2) in #t2;
+    dynamic v5 = let final core::int* #t1 = 0 in let final dynamic #t2 = self::f<dynamic>() in let final void #t3 = super.[]=(#t1, #t2) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart
index 2fd00ae..0889da1 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=double*/ v = (/*@returnType=double*/ (/*@type=dynamic*/ x) =>
-      1.0)(/*@returnType=int*/ () {
+  var /*@ type=double* */ v = (/*@ returnType=double* */ (/*@ type=dynamic */ x) =>
+      1.0)(/*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.expect
index 99a6a26..4fbbdae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = ((dynamic x) → core::double => 1.0).call(() → core::int {
+  core::double* v = ((dynamic x) → core::double* => 1.0).call(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.transformed.expect
index 99a6a26..4fbbdae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_closure_call.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = ((dynamic x) → core::double => 1.0).call(() → core::int {
+  core::double* v = ((dynamic x) → core::double* => 1.0).call(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
index 208b13d..2a7989f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart
@@ -9,7 +9,7 @@
   C(T x());
 }
 
-var v = new C<dynamic>(/*@returnType=int*/ () {
+var v = new C<dynamic>(/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect
index bdd7979..9f9fb0b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect
index bdd7979..9f9fb0b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
index 80ba6c8..06aefae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic> v = new self::C::•<dynamic>(() → core::int {
+static field self::C<dynamic>* v = new self::C::•<dynamic>(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
index 80ba6c8..06aefae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic> v = new self::C::•<dynamic>(() → core::int {
+static field self::C<dynamic>* v = new self::C::•<dynamic>(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
index e59070e..1095908 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart
@@ -9,7 +9,7 @@
   C(T x());
 }
 
-var v = new C<int>(/*@returnType=int*/ () {
+var v = new C<int>(/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect
index 25a19cb..51d8453 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic v = new self::C::•<core::int>(() → dynamic {
+static field dynamic v = new self::C::•<core::int*>(() → dynamic {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect
index 25a19cb..51d8453 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.legacy.transformed.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic v = new self::C::•<core::int>(() → dynamic {
+static field dynamic v = new self::C::•<core::int*>(() → dynamic {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
index 79e526f..d75a375 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::int> v = new self::C::•<core::int>(() → core::int {
+static field self::C<core::int*>* v = new self::C::•<core::int*>(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
index 79e526f..d75a375 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_explicit_type_param.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::int> v = new self::C::•<core::int>(() → core::int {
+static field self::C<core::int*>* v = new self::C::•<core::int*>(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart
index 4a18501..0d6ecc9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart
@@ -10,8 +10,8 @@
 }
 
 main() {
-  var /*@type=C<int>*/ v = new /*@typeArgs=int*/ C(
-      /*@returnType=int*/ () {
+  var /*@ type=C<int*>* */ v = new /*@ typeArgs=int* */ C(
+      /*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect
index 3f4354e..32bab58 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect
index 3f4354e..32bab58 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
index 183c40b..4590681 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.expect
@@ -2,13 +2,13 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> v = new self::C::•<core::int>(() → core::int {
+  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_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
index 183c40b..4590681 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_implicit_type_param.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(() →* self::C::T* x) → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> v = new self::C::•<core::int>(() → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
index 0c85e2f..3162d6e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart
@@ -9,7 +9,7 @@
   C(x());
 }
 
-var v = new C(/*@returnType=int*/ () {
+var v = new C(/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect
index 9fb7073..d53463e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → self::C
+  constructor •(() →* dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect
index 9fb7073..d53463e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → self::C
+  constructor •(() →* dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.expect
index b14a63e..e0bbcba 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → self::C
+  constructor •(() →* dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C v = new self::C::•(() → core::int {
+static field self::C* v = new self::C::•(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.transformed.expect
index b14a63e..e0bbcba 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_constructor_call_no_type_param.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(() → dynamic x) → self::C
+  constructor •(() →* dynamic x) → self::C*
     : super core::Object::•()
     ;
 }
-static field self::C v = new self::C::•(() → core::int {
+static field self::C* v = new self::C::•(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
index 72be85e..84a2dab 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart
@@ -7,7 +7,7 @@
 
 List<T> f<T>(T g()) => <T>[g()];
 var v = f<dynamic>(
-    /*@returnType=int*/ () {
+    /*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect
index 8fe3a76..d4a07ae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.expect
@@ -5,8 +5,8 @@
 static field dynamic v = self::f<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect
index 8fe3a76..d4a07ae 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.legacy.transformed.expect
@@ -5,8 +5,8 @@
 static field dynamic v = self::f<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
index ef5e6ca..89d0bd3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<dynamic> v = self::f<dynamic>(() → core::int {
+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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
index ef5e6ca..89d0bd3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<dynamic> v = self::f<dynamic>(() → core::int {
+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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 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.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
index ba6541a..29fa60f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.expect
@@ -14,11 +14,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
+static field dynamic v = (#C1).<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
 var v = (f<dynamic>)(() {
                    ^").call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect
index ba6541a..29fa60f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.legacy.transformed.expect
@@ -14,11 +14,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
+static field dynamic v = (#C1).<(dynamic).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart:9:20: Error: This couldn't be parsed.
 var v = (f<dynamic>)(() {
                    ^").call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
index 48a0717..67be699 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr1.dart.outline.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
index 0a3a0e2..9251f4f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f)<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
+var v = (f)<dynamic>(/*info:INFERRED_TYPE_CLOSURE*/ /*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
index ecedd4a..f2edae1 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call<dynamic>(() → dynamic {
+static field dynamic v = (#C1).call<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
index ecedd4a..f2edae1 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call<dynamic>(() → dynamic {
+static field dynamic v = (#C1).call<dynamic>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
index a43bff6..322ca8f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<dynamic> v = self::f.call<dynamic>(() → core::int {
+static field core::List<dynamic>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
index a43bff6..322ca8f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<dynamic> v = self::f.call<dynamic>(() → core::int {
+static field core::List<dynamic>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
index d332d12..984855b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = f<int>(/*@returnType=int*/ () {
+var v = f<int>(/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect
index 2e73b66..5bc5db6 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f<core::int>(() → dynamic {
+static field dynamic v = self::f<core::int*>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect
index 2e73b66..5bc5db6 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f<core::int>(() → dynamic {
+static field dynamic v = self::f<core::int*>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
index 16be853..b005e12 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f<core::int>(() → core::int {
+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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
index 16be853..b005e12 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f<core::int>(() → core::int {
+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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 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.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
index 27f915d..ac0e94c 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.expect
@@ -14,11 +14,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
+static field dynamic v = (#C1).<(core::int*).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
 var v = (f<int>)(() {
                ^").call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect
index 27f915d..ac0e94c 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.legacy.transformed.expect
@@ -14,11 +14,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.<(core::int).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
+static field dynamic v = (#C1).<(core::int*).>(invalid-expression "pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart:9:16: Error: This couldn't be parsed.
 var v = (f<int>)(() {
                ^").call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
index babb86c..8c4c41b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr1.dart.outline.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
index f8ab111..68f419a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f)<int>(/*info:INFERRED_TYPE_CLOSURE*/ /*@returnType=int*/ () {
+var v = (f)<int>(/*info:INFERRED_TYPE_CLOSURE*/ /*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
index 450cd02..7738ec9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call<core::int>(() → dynamic {
+static field dynamic v = (#C1).call<core::int*>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
index 450cd02..7738ec9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call<core::int>(() → dynamic {
+static field dynamic v = (#C1).call<core::int*>(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart
index 4e62394..85894dd 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=List<int>*/ v = /*@typeArgs=int*/ f(
-      /*@returnType=int*/ () {
+  var /*@ type=List<int*>* */ v = /*@ typeArgs=int* */ f(
+      /*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect
index e222b86..cfc4f89f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect
index e222b86..cfc4f89f 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.legacy.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
index 6e09452..4700f6a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> v = self::f<core::int>(() → core::int {
+  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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
index 6e09452..4700f6a 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> v = self::f<core::int>(() → core::int {
+  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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart
index 40cb1dc..af180d9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=List<int>*/ v = (f) /*@typeArgs=int*/ (
-      /*@returnType=int*/ () {
+  var /*@ type=List<int*>* */ v = (f) /*@ typeArgs=int* */ (
+      /*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect
index 614a9eb..157e04d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = self::f.call(() → dynamic {
+  dynamic v = (#C1).call(() → dynamic {
     return 1;
   });
 }
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect
index 614a9eb..157e04d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.legacy.transformed.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = self::f.call(() → dynamic {
+  dynamic v = (#C1).call(() → dynamic {
     return 1;
   });
 }
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
index f1a71c2..00386c6 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> v = self::f.call<core::int>(() → core::int {
+  core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
index f1a71c2..00386c6 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_implicit_type_param_via_expr.dart.strong.transformed.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<core::int> v = self::f.call<core::int>(() → core::int {
+  core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart
index 26a81c1..8e60cdf 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart
@@ -6,7 +6,7 @@
 library test;
 
 main() {
-  var /*@type=double*/ v = f(/*@returnType=int*/ () {
+  var /*@ type=double* */ v = f(/*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect
index ffbb143..9982bb7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.transformed.expect
index ffbb143..9982bb7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.legacy.transformed.expect
@@ -7,5 +7,5 @@
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+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.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.expect
index 1094b0c..715a3f3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = self::f(() → core::int {
+  core::double* v = self::f(() → core::int* {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.transformed.expect
index 1094b0c..715a3f3 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = self::f(() → core::int {
+  core::double* v = self::f(() → core::int* {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart
index e3263fb..11233ef 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart
@@ -6,7 +6,7 @@
 library test;
 
 main() {
-  var /*@type=double*/ v = (f)(/*@returnType=int*/ () {
+  var /*@ type=double* */ v = (f)(/*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect
index 5a76d33..d012b8b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = self::f.call(() → dynamic {
+  dynamic v = (#C1).call(() → dynamic {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+static method f(dynamic x) → core::double*
   return 1.0;
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect
index 5a76d33..d012b8b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.legacy.transformed.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = self::f.call(() → dynamic {
+  dynamic v = (#C1).call(() → dynamic {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+static method f(dynamic x) → core::double*
   return 1.0;
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.expect
index 2d6d957..76e37fd 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = self::f.call(() → core::int {
+  core::double* v = (#C1).call(() → core::int* {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+static method f(dynamic x) → core::double*
   return 1.0;
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.transformed.expect
index 2d6d957..76e37fd 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_function_call_no_type_param_via_expr.dart.strong.transformed.expect
@@ -3,9 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::double v = self::f.call(() → core::int {
+  core::double* v = (#C1).call(() → core::int* {
     return 1;
   });
 }
-static method f(dynamic x) → core::double
+static method f(dynamic x) → core::double*
   return 1.0;
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart
index 2cfb863..4fa88e7 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=List<dynamic>*/ v = <dynamic>[
-    /*@returnType=int*/ () {
+  var /*@ type=List<dynamic>* */ v = <dynamic>[
+    /*@ returnType=int* */ () {
       return 1;
     }
   ];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.expect
index 6fd611f..bc2b33d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<dynamic> v = <dynamic>[() → core::int {
+  core::List<dynamic>* v = <dynamic>[() → core::int* {
     return 1;
   }];
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.transformed.expect
index 6fd611f..bc2b33d 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_dynamic.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<dynamic> v = <dynamic>[() → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart
index fdf37fcf..e590625 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart
@@ -7,8 +7,8 @@
 
 typedef int F();
 main() {
-  var /*@type=List<() -> int>*/ v = <F>[
-    /*@returnType=int*/ () {
+  var /*@ type=List<() ->* int*>* */ v = <F>[
+    /*@ returnType=int* */ () {
       return 1;
     }
   ];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect
index 98cc09d..b99e662 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  dynamic v = <() → core::int>[() → dynamic {
+  dynamic v = <() →* core::int*>[() → dynamic {
     return 1;
   }];
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect
index 98cc09d..b99e662 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  dynamic v = <() → core::int>[() → dynamic {
+  dynamic v = <() →* core::int*>[() → dynamic {
     return 1;
   }];
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.expect
index 20689bc..b747c51 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  core::List<() → core::int> v = <() → core::int>[() → core::int {
+  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_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.transformed.expect
index 20689bc..b747c51 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_typed.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  core::List<() → core::int> v = <() → core::int>[() → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart
index 1c4d50d..9200f16 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=List<() -> int>*/ v = /*@typeArgs=() -> int*/ [
-    /*@returnType=int*/ () {
+  var /*@ type=List<() ->* int*>* */ v = /*@ typeArgs=() ->* int* */ [
+    /*@ returnType=int* */ () {
       return 1;
     }
   ];
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.expect
index 486e1f3..5b2da50 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<() → core::int> v = <() → core::int>[() → core::int {
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.transformed.expect
index 486e1f3..5b2da50 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_list_untyped.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::List<() → core::int> v = <() → core::int>[() → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart
index af6dc4e..19ede98 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=Map<int, dynamic>*/ v = <int, dynamic>{
-    1: /*@returnType=int*/ () {
+  var /*@ type=Map<int*, dynamic>* */ v = <int, dynamic>{
+    1: /*@ returnType=int* */ () {
       return 1;
     }
   };
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect
index 92e6fc6..eb743c65 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = <core::int, dynamic>{1: () → dynamic {
+  dynamic v = <core::int*, dynamic>{1: () → dynamic {
     return 1;
   }};
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect
index 92e6fc6..eb743c65 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  dynamic v = <core::int, dynamic>{1: () → dynamic {
+  dynamic v = <core::int*, dynamic>{1: () → dynamic {
     return 1;
   }};
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.expect
index e93a072..07d95de 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::int, dynamic> v = <core::int, dynamic>{1: () → core::int {
+  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_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.transformed.expect
index e93a072..07d95de 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_dynamic.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::int, dynamic> v = <core::int, dynamic>{1: () → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart
index 26541f8..27a7b57 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart
@@ -7,8 +7,8 @@
 
 typedef int F();
 main() {
-  var /*@type=Map<int, () -> int>*/ v = <int, F>{
-    1: /*@returnType=int*/ () {
+  var /*@ type=Map<int*, () ->* int*>* */ v = <int, F>{
+    1: /*@ returnType=int* */ () {
       return 1;
     }
   };
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.expect
index 2824231..7e2da76 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  core::Map<core::int, () → core::int> v = <core::int, () → core::int>{1: () → core::int {
+  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_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.transformed.expect
index 2824231..7e2da76 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_typed.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → core::int;
+typedef F = () →* core::int*;
 static method main() → dynamic {
-  core::Map<core::int, () → core::int> v = <core::int, () → core::int>{1: () → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart
index 2d5bbb3..e3d5bc9 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart
@@ -6,8 +6,8 @@
 library test;
 
 main() {
-  var /*@type=Map<int, () -> int>*/ v = /*@typeArgs=int, () -> int*/ {
-    1: /*@returnType=int*/ () {
+  var /*@ type=Map<int*, () ->* int*>* */ v = /*@ typeArgs=int*, () ->* int* */ {
+    1: /*@ returnType=int* */ () {
       return 1;
     }
   };
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.expect
index 20d29e8..f2aa7b1 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::int, () → core::int> v = <core::int, () → core::int>{1: () → core::int {
+  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.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.transformed.expect
index 20d29e8..f2aa7b1 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_in_map_untyped.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::int, () → core::int> v = <core::int, () → core::int>{1: () → core::int {
+  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 b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart
index 88a4b4b..6ee518e 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart
@@ -10,8 +10,8 @@
 }
 
 main() {
-  var /*@type=List<dynamic>*/ v =
-      new C(). /*@target=C::f*/ f<dynamic>(/*@returnType=int*/ () {
+  var /*@ type=List<dynamic>* */ v =
+      new C(). /*@target=C::f*/ f<dynamic>(/*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect
index dba4c95..f51aabe 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
   dynamic v = new self::C::•().f<dynamic>(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect
index dba4c95..f51aabe 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
   dynamic v = new self::C::•().f<dynamic>(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
index 64eb355..4fe014b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<dynamic> v = new self::C::•().{self::C::f}<dynamic>(() → core::int {
+  core::List<dynamic>* v = new self::C::•().{self::C::f}<dynamic>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
index 64eb355..4fe014b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_dynamic_param.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<dynamic> v = new self::C::•().{self::C::f}<dynamic>(() → core::int {
+  core::List<dynamic>* v = new self::C::•().{self::C::f}<dynamic>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart
index 3226e4f..f89acf4 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart
@@ -10,8 +10,8 @@
 }
 
 main() {
-  var /*@type=List<int>*/ v =
-      new C(). /*@target=C::f*/ f<int>(/*@returnType=int*/ () {
+  var /*@ type=List<int*>* */ v =
+      new C(). /*@target=C::f*/ f<int>(/*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
index 3db7bbe..a2c3f33 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<core::int> v = new self::C::•().{self::C::f}<core::int>(() → core::int {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
index 3db7bbe..a2c3f33 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_explicit_type_param.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<core::int> v = new self::C::•().{self::C::f}<core::int>(() → core::int {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart
index d520294..f5761bf 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart
@@ -10,8 +10,8 @@
 }
 
 main() {
-  var /*@type=List<int>*/ v = new C(). /*@typeArgs=int*/ /*@target=C::f*/ f(
-      /*@returnType=int*/ () {
+  var /*@ type=List<int*>* */ v = new C(). /*@ typeArgs=int* */ /*@target=C::f*/ f(
+      /*@ returnType=int* */ () {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect
index 9e89962..3c0e8921 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
   dynamic v = new self::C::•().f(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect
index 9e89962..3c0e8921 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
   dynamic v = new self::C::•().f(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
index 3db7bbe..a2c3f33 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<core::int> v = new self::C::•().{self::C::f}<core::int>(() → core::int {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
index 3db7bbe..a2c3f33 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_implicit_type_param.dart.strong.transformed.expect
@@ -3,14 +3,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  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.call()];
+  method f<T extends core::Object* = dynamic>(() →* self::C::f::T* g) → core::List<self::C::f::T*>*
+    return <self::C::f::T*>[g.call()];
 }
 static method main() → dynamic {
-  core::List<core::int> v = new self::C::•().{self::C::f}<core::int>(() → core::int {
+  core::List<core::int*>* v = new self::C::•().{self::C::f}<core::int*>(() → core::int* {
     return 1;
   });
 }
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
index 45e2995..7f3b9c4 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart
@@ -9,7 +9,7 @@
   double f(x) => 1.0;
 }
 
-var v = new C(). /*@target=C::f*/ f(/*@returnType=int*/ () {
+var v = new C(). /*@target=C::f*/ f(/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect
index 6efb013..c389e3b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(dynamic x) → core::double
+  method f(dynamic x) → core::double*
     return 1.0;
 }
 static field dynamic v = new self::C::•().f(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect
index 6efb013..c389e3b 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(dynamic x) → core::double
+  method f(dynamic x) → core::double*
     return 1.0;
 }
 static field dynamic v = new self::C::•().f(() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.expect
index 0b09692..a0ac725 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(dynamic x) → core::double
+  method f(dynamic x) → core::double*
     return 1.0;
 }
-static field core::double v = new self::C::•().{self::C::f}(() → core::int {
+static field core::double* v = new self::C::•().{self::C::f}(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.transformed.expect
index 0b09692..a0ac725 100644
--- a/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/unsafe_block_closure_inference_method_call_no_type_param.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(dynamic x) → core::double
+  method f(dynamic x) → core::double*
     return 1.0;
 }
-static field core::double v = new self::C::•().{self::C::f}(() → core::int {
+static field core::double* v = new self::C::•().{self::C::f}(() → core::int* {
   return 1;
 });
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
index 6e49f44..4e334ed 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart
@@ -7,7 +7,7 @@
 
 T run<T>(T f()) {
   print("running");
-  var /*@type=run::T*/ t = f();
+  var /*@ type=run::T* */ t = f();
   print("done running");
   return t;
 }
@@ -23,8 +23,8 @@
     print("running");
   }
 
-  var /*@type=dynamic*/ x = run<dynamic>(printRunning);
-  var /*@type=void*/ y = /*info:USE_OF_VOID_RESULT*/ /*@typeArgs=void*/ run(
+  var /*@ type=dynamic */ x = run<dynamic>(printRunning);
+  var /*@ type=void */ y = /*info:USE_OF_VOID_RESULT*/ /*@ typeArgs=void */ run(
       printRunning);
   x = 123;
   x = 'hi';
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect
index e9f8f19..2873ac1 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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");
   dynamic t = f.call();
   core::print("done running");
@@ -23,3 +23,7 @@
   y = 123;
   y = "hi";
 }
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
index e9f8f19..2873ac1 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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");
   dynamic t = f.call();
   core::print("done running");
@@ -23,3 +23,7 @@
   y = 123;
   y = "hi";
 }
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
index 0d3fd7d..9277df0 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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.call();
+  self::run::T* t = f.call();
   core::print("done running");
   return t;
 }
@@ -23,3 +23,7 @@
   y = 123;
   y = "hi";
 }
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
index 0d3fd7d..9277df0 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic x = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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.call();
+  self::run::T* t = f.call();
   core::print("done running");
   return t;
 }
@@ -23,3 +23,7 @@
   y = 123;
   y = "hi";
 }
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
index 0c4ff5c..36b568a 100644
--- a/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart.type_promotion.expect
@@ -1,12 +1,12 @@
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@538
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:29:5: Context: Write to x@543
   x = 123;
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@538
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:30:5: Context: Write to x@543
   x = 'hi';
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@591
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:31:5: Context: Write to y@598
   y = /*error:INVALID_ASSIGNMENT*/ 123;
     ^
-pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@591
+pkg/front_end/testcases/inference/void_return_type_subtypes_dynamic.dart:32:5: Context: Write to y@598
   y = /*error:INVALID_ASSIGNMENT*/ 'hi';
     ^
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart b/pkg/front_end/testcases/inference_new/const_invocation.dart
index 29facb7..c707af5 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart
@@ -8,16 +8,16 @@
 typedef V F<U, V>(U u);
 
 class Foo<T> {
-  Bar<T> get v1 => const /*@typeArgs=Null*/ Bar();
-  Bar<List<T>> get v2 => const /*@typeArgs=List<Null>*/ Bar();
-  Bar<F<T, T>> get v3 => const /*@typeArgs=(Object) -> Null*/ Bar();
+  Bar<T> get v1 => const /*@ typeArgs=Null* */ Bar();
+  Bar<List<T>> get v2 => const /*@ typeArgs=List<Null*>* */ Bar();
+  Bar<F<T, T>> get v3 => const /*@ typeArgs=(Object*) ->* Null* */ Bar();
   Bar<F<F<T, T>, T>> get v4 =>
-      const /*@typeArgs=((Null) -> Object) -> Null*/ Bar();
-  List<T> get v5 => /*@typeArgs=Null*/ const [];
-  List<F<T, T>> get v6 => /*@typeArgs=(Object) -> Null*/ const [];
-  Map<T, T> get v7 => /*@typeArgs=Null, Null*/ const {};
-  Map<F<T, T>, T> get v8 => /*@typeArgs=(Object) -> Null, Null*/ const {};
-  Map<T, F<T, T>> get v9 => /*@typeArgs=Null, (Object) -> Null*/ const {};
+      const /*@ typeArgs=((Null*) ->* Object*) ->* Null* */ Bar();
+  List<T> get v5 => /*@ typeArgs=Null* */ const [];
+  List<F<T, T>> get v6 => /*@ typeArgs=(Object*) ->* Null* */ const [];
+  Map<T, T> get v7 => /*@ typeArgs=Null*, Null* */ const {};
+  Map<F<T, T>, T> get v8 => /*@ typeArgs=(Object*) ->* Null*, Null* */ const {};
+  Map<T, F<T, T>> get v9 => /*@ typeArgs=Null*, (Object*) ->* Null* */ const {};
 }
 
 class Bar<T> {
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect
index 7421b05..db8a4a8 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.expect
@@ -2,33 +2,39 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 const self::Bar::•<dynamic>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
-    return const self::Bar::•<dynamic>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<dynamic>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<dynamic>();
-  get v5() → core::List<self::Foo::T>
-    return const <dynamic>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
-    return const <dynamic>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
-    return const <dynamic, dynamic>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
-    return const <dynamic, dynamic>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
-    return const <dynamic, dynamic>{};
+  get v1() → self::Bar<self::Foo::T*>*
+    return #C1;
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
+    return #C1;
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
+    return #C1;
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
+    return #C1;
+  get v5() → core::List<self::Foo::T*>*
+    return #C2;
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
+    return #C2;
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
+    return #C3;
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return #C3;
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return #C3;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Bar<dynamic> {}
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C2}
+}
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect
index 7421b05..db8a4a8 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.legacy.transformed.expect
@@ -2,33 +2,39 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 const self::Bar::•<dynamic>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
-    return const self::Bar::•<dynamic>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<dynamic>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<dynamic>();
-  get v5() → core::List<self::Foo::T>
-    return const <dynamic>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
-    return const <dynamic>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
-    return const <dynamic, dynamic>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
-    return const <dynamic, dynamic>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
-    return const <dynamic, dynamic>{};
+  get v1() → self::Bar<self::Foo::T*>*
+    return #C1;
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
+    return #C1;
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
+    return #C1;
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
+    return #C1;
+  get v5() → core::List<self::Foo::T*>*
+    return #C2;
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
+    return #C2;
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
+    return #C3;
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return #C3;
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return #C3;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Bar<dynamic> {}
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<dynamic, dynamic> {_kvPairs:#C2}
+}
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
index 737a958..e56ff7a 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.outline.expect
@@ -2,31 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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*>*
     ;
-  get v1() → self::Bar<self::Foo::T>
+  get v1() → self::Bar<self::Foo::T*>*
     ;
-  get v2() → self::Bar<core::List<self::Foo::T>>
+  get v2() → self::Bar<core::List<self::Foo::T*>*>*
     ;
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
+  get v3() → self::Bar<(self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
+  get v4() → self::Bar<((self::Foo::T*) →* self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v5() → core::List<self::Foo::T>
+  get v5() → core::List<self::Foo::T*>*
     ;
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
+  get v6() → core::List<(self::Foo::T*) →* self::Foo::T*>*
     ;
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
+  get v7() → core::Map<self::Foo::T*, self::Foo::T*>*
     ;
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
     ;
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
     ;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
+    : super core::Object::•()
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
index 6bf0f4d..6d0c538 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.expect
@@ -2,33 +2,46 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 const self::Bar::•<core::Null>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
-    return const self::Bar::•<core::List<core::Null>>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<(core::Object) → core::Null>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<((core::Null) → core::Object) → core::Null>();
-  get v5() → core::List<self::Foo::T>
-    return const <core::Null>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
-    return const <(core::Object) → core::Null>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
-    return const <core::Null, core::Null>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
-    return const <(core::Object) → core::Null, core::Null>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
-    return const <core::Null, (core::Object) → core::Null>{};
+  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 #C8;
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return #C9;
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return #C10;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Bar<core::Null*> {}
+  #C2 = self::Bar<core::List<core::Null*>*> {}
+  #C3 = self::Bar<(core::Object*) →* core::Null*> {}
+  #C4 = self::Bar<((core::Null*) →* core::Object*) →* core::Null*> {}
+  #C5 = <core::Null*>[]
+  #C6 = <(core::Object*) →* core::Null*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Null*, core::Null*> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null*, core::Null*> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<core::Null*, (core::Object*) →* core::Null*> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
index 6bf0f4d..6d0c538 100644
--- a/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/const_invocation.dart.strong.transformed.expect
@@ -2,33 +2,46 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 const self::Bar::•<core::Null>();
-  get v2() → self::Bar<core::List<self::Foo::T>>
-    return const self::Bar::•<core::List<core::Null>>();
-  get v3() → self::Bar<(self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<(core::Object) → core::Null>();
-  get v4() → self::Bar<((self::Foo::T) → self::Foo::T) → self::Foo::T>
-    return const self::Bar::•<((core::Null) → core::Object) → core::Null>();
-  get v5() → core::List<self::Foo::T>
-    return const <core::Null>[];
-  get v6() → core::List<(self::Foo::T) → self::Foo::T>
-    return const <(core::Object) → core::Null>[];
-  get v7() → core::Map<self::Foo::T, self::Foo::T>
-    return const <core::Null, core::Null>{};
-  get v8() → core::Map<(self::Foo::T) → self::Foo::T, self::Foo::T>
-    return const <(core::Object) → core::Null, core::Null>{};
-  get v9() → core::Map<self::Foo::T, (self::Foo::T) → self::Foo::T>
-    return const <core::Null, (core::Object) → core::Null>{};
+  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 #C8;
+  get v8() → core::Map<(self::Foo::T*) →* self::Foo::T*, self::Foo::T*>*
+    return #C9;
+  get v9() → core::Map<self::Foo::T*, (self::Foo::T*) →* self::Foo::T*>*
+    return #C10;
 }
-class Bar<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::Bar<self::Bar::T>
+class Bar<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::Bar<self::Bar::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::Bar<core::Null*> {}
+  #C2 = self::Bar<core::List<core::Null*>*> {}
+  #C3 = self::Bar<(core::Object*) →* core::Null*> {}
+  #C4 = self::Bar<((core::Null*) →* core::Object*) →* core::Null*> {}
+  #C5 = <core::Null*>[]
+  #C6 = <(core::Object*) →* core::Null*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Null*, core::Null*> {_kvPairs:#C7}
+  #C9 = core::_ImmutableMap<(core::Object*) →* core::Null*, core::Null*> {_kvPairs:#C7}
+  #C10 = core::_ImmutableMap<core::Null*, (core::Object*) →* core::Null*> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
index cf441f7..3fdcdcd 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart
@@ -15,16 +15,16 @@
 // There's a circularity between b and c because a.f is generic, so the type of
 // c is required to infer b, and vice versa.
 
-var b = /*@returnType=() -> invalid-type*/ () =>
-    a. /*@typeArgs=() -> invalid-type*/ /*@target=A::f*/ f(c);
-var c = /*@returnType=invalid-type*/ () =>
-    a. /*@typeArgs=invalid-type*/ /*@target=A::f*/ f(b);
+var b = /*@ returnType=() ->* invalid-type */ () =>
+    a. /*@ typeArgs=() ->* invalid-type */ /*@target=A::f*/ f(c);
+var c = /*@ returnType=invalid-type */ () =>
+    a. /*@ typeArgs=invalid-type */ /*@target=A::f*/ f(b);
 
 // e's use of a.g breaks the circularity, because a.g is not generic, therefore
 // the type of e does not depend on the type of d.
 
-var d = /*@returnType=() -> int*/ () =>
-    a. /*@typeArgs=() -> int*/ /*@target=A::f*/ f(e);
-var e = /*@returnType=int*/ () => a. /*@target=A::g*/ g(d);
+var d = /*@ returnType=() ->* int* */ () =>
+    a. /*@ typeArgs=() ->* int* */ /*@target=A::f*/ f(e);
+var e = /*@ returnType=int* */ () => a. /*@target=A::g*/ g(d);
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect
index 86fb1b2..3140105 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
     return t;
-  method g(dynamic i) → core::int
+  method g(dynamic i) → core::int*
     return 0;
 }
 static field dynamic a = new self::A::•();
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect
index 86fb1b2..3140105 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
     return t;
-  method g(dynamic i) → core::int
+  method g(dynamic i) → core::int*
     return 0;
 }
 static field dynamic a = new self::A::•();
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
index 6ee5860..a833221 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
     ;
-  method g(dynamic i) → core::int
+  method g(dynamic i) → core::int*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
index 2e9f7aa..3b1a187 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.expect
@@ -4,24 +4,24 @@
 //
 // 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*/ () =>
+// var b = /*@ returnType=() ->* invalid-type */ () =>
 //     ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
     return t;
-  method g(dynamic i) → core::int
+  method g(dynamic i) → core::int*
     return 0;
 }
-static field self::A a = new self::A::•();
-static field invalid-type b = (() → () → invalid-type => self::a.{self::A::f}<() → invalid-type>(self::c)) as{TypeError} invalid-type;
-static field () → invalid-type c = () → invalid-type => self::a.{self::A::f}<invalid-type>(self::b);
-static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
-static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
+static field self::A* a = new self::A::•();
+static field invalid-type b = (() → () →* invalid-type => self::a.{self::A::f}<() →* invalid-type>(self::c)) as{TypeError} invalid-type;
+static field () →* invalid-type c = () → invalid-type => self::a.{self::A::f}<invalid-type>(self::b);
+static field () →* () →* core::int* d = () → () →* core::int* => self::a.{self::A::f}<() →* core::int*>(self::e);
+static field () →* core::int* e = () → core::int* => self::a.{self::A::g}(self::d);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
index 2e9f7aa..3b1a187 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_generic_method.dart.strong.transformed.expect
@@ -4,24 +4,24 @@
 //
 // 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*/ () =>
+// var b = /*@ returnType=() ->* invalid-type */ () =>
 //     ^
 //
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method f<T extends core::Object = dynamic>(self::A::f::T t) → self::A::f::T
+  method f<T extends core::Object* = dynamic>(self::A::f::T* t) → self::A::f::T*
     return t;
-  method g(dynamic i) → core::int
+  method g(dynamic i) → core::int*
     return 0;
 }
-static field self::A a = new self::A::•();
-static field invalid-type b = (() → () → invalid-type => self::a.{self::A::f}<() → invalid-type>(self::c)) as{TypeError} invalid-type;
-static field () → invalid-type c = () → invalid-type => self::a.{self::A::f}<invalid-type>(self::b);
-static field () → () → core::int d = () → () → core::int => self::a.{self::A::f}<() → core::int>(self::e);
-static field () → core::int e = () → core::int => self::a.{self::A::g}(self::d);
+static field self::A* a = new self::A::•();
+static field invalid-type b = (() → () →* invalid-type => self::a.{self::A::f}<() →* invalid-type>(self::c)) as{TypeError} invalid-type;
+static field () →* invalid-type c = () → invalid-type => self::a.{self::A::f}<invalid-type>(self::b);
+static field () →* () →* core::int* d = () → () →* core::int* => self::a.{self::A::f}<() →* core::int*>(self::e);
+static field () →* core::int* e = () → core::int* => self::a.{self::A::g}(self::d);
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
index 1880cfe..0c21605 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart
@@ -12,18 +12,18 @@
 // There's a circularity between a and b because the type of `int + x` depends
 // on the type of x.
 
-var a = /*@returnType=num*/ () => intValue /*@target=num::+*/ + b;
+var a = /*@ returnType=num* */ () => intValue /*@target=num::+*/ + b;
 var b = a();
 
 // But there's no circularity between c and d because the type of `num + x` is
 // always num.
 
-var c = /*@returnType=num*/ () => numValue /*@target=num::+*/ + d;
+var c = /*@ returnType=num* */ () => numValue /*@target=num::+*/ + d;
 var d = c();
 
 // Similar for double.
 
-var e = /*@returnType=double*/ () => doubleValue /*@target=double::+*/ + f;
+var e = /*@ returnType=double* */ () => doubleValue /*@target=double::+*/ + f;
 var f = e();
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect
index 24f6d1b..ec6e18b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.expect
@@ -2,9 +2,9 @@
 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 core::int* intValue = 0;
+static field core::num* numValue = 0;
+static field core::double* doubleValue = 0.0;
 static field dynamic a = () → dynamic => self::intValue.+(self::b);
 static field dynamic b = self::a.call();
 static field dynamic c = () → dynamic => self::numValue.+(self::d);
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect
index 24f6d1b..ec6e18b 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 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 core::int* intValue = 0;
+static field core::num* numValue = 0;
+static field core::double* doubleValue = 0.0;
 static field dynamic a = () → dynamic => self::intValue.+(self::b);
 static field dynamic b = self::a.call();
 static field dynamic c = () → dynamic => self::numValue.+(self::d);
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
index 0f10321..078aa97 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int intValue;
-static field core::num numValue;
-static field core::double doubleValue;
+static field core::int* intValue;
+static field core::num* numValue;
+static field core::double* doubleValue;
 static field dynamic a;
 static field dynamic b;
 static field dynamic c;
diff --git a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
index 88b2f85..3fb8cb6 100644
--- a/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/dependency_only_if_overloaded.dart.strong.expect
@@ -4,19 +4,19 @@
 //
 // 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;
+// 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} core::num)) as{TypeError} invalid-type;
+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} core::num*)) as{TypeError} invalid-type;
 static field dynamic b = self::a.call();
-static field () → core::num c = () → core::num => self::numValue.{core::num::+}(self::d);
-static field core::num d = self::c.call();
-static field () → core::double e = () → core::double => self::doubleValue.{core::double::+}(self::f);
-static field core::double f = self::e.call();
+static field () →* core::num* c = () → core::num* => self::numValue.{core::num::+}(self::d);
+static field core::num* d = self::c.call();
+static field () →* core::double* e = () → core::double* => self::doubleValue.{core::double::+}(self::f);
+static field core::double* f = self::e.call();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart b/pkg/front_end/testcases/inference_new/do_loop.dart
index f7e1401..15ef51f 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart
@@ -9,8 +9,8 @@
 
 void test() {
   do {
-    var /*@type=int*/ x = 0;
-  } while (/*@typeArgs=bool*/ f());
+    var /*@ type=int* */ x = 0;
+  } while (/*@ typeArgs=bool* */ f());
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect
index edd314e..5f6bb54 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect
index edd314e..5f6bb54 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   do {
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
index e8c03c5..dfd99e1 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
index 5e323f3..2639877 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   do {
-    core::int x = 0;
+    core::int* x = 0;
   }
-  while (self::f<core::bool>())
+  while (self::f<core::bool*>())
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
index 5e323f3..2639877 100644
--- a/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/do_loop.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   do {
-    core::int x = 0;
+    core::int* x = 0;
   }
-  while (self::f<core::bool>())
+  while (self::f<core::bool*>())
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
index e296a6a..41cdc4e 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart
@@ -13,6 +13,6 @@
   B(T x);
 }
 
-var t3 = /*@typeArgs=B<int>*/ [new /*@typeArgs=int*/ B(3)];
+var t3 = /*@ typeArgs=B<int*>* */ [new /*@ typeArgs=int* */ B(3)];
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect
index 0201c42..ae4e6d2 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect
index 0201c42..ae4e6d2 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
index 9a9cf46..7322015 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b;
+  synthetic constructor •() → self::A*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     ;
 }
 static field dynamic t3;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
index 2c80f49..05d659a 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::B<core::int>> t3 = <self::B<core::int>>[new self::B::•<core::int>(3)];
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
index 2c80f49..05d659a 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B<core::int> b = null;
-  synthetic constructor •() → self::A
+  field self::B<core::int*>* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •(self::B::T x) → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::B::T* x) → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::B<core::int>> t3 = <self::B<core::int>>[new self::B::•<core::int>(3)];
+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 b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
index 5f75350..ef47b2e 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart
@@ -9,6 +9,6 @@
   A(T x);
 }
 
-var t2 = /*@typeArgs=A<int>*/ [new /*@typeArgs=int*/ A(2)];
+var t2 = /*@ typeArgs=A<int*>* */ [new /*@ typeArgs=int* */ A(2)];
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect
index 4be7f96..f4b450c 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.expect
@@ -2,8 +2,8 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
index 4be7f96..f4b450c 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
index 3151816..7ce484e 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.outline.expect
@@ -2,8 +2,8 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     ;
 }
 static field dynamic t2;
diff --git a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
index 053eb25..838beca 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::int>> t2 = <self::A<core::int>>[new self::A::•<core::int>(2)];
+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/downwards_inference_inside_top_level_2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
index 053eb25..838beca 100644
--- a/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/downwards_inference_inside_top_level_2.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  constructor •(self::A::T* x) → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::int>> t2 = <self::A<core::int>>[new self::A::•<core::int>(2)];
+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.legacy.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.expect
index 1645a4c..4e2e3ff 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.expect
@@ -5,14 +5,14 @@
 class A extends core::Object {
   field dynamic x = () → dynamic => new self::B::•().x;
   field dynamic y = () → dynamic => new self::B::•().x;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field dynamic y = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect
index 1645a4c..4e2e3ff 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.legacy.transformed.expect
@@ -5,14 +5,14 @@
 class A extends core::Object {
   field dynamic x = () → dynamic => new self::B::•().x;
   field dynamic y = () → dynamic => new self::B::•().x;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field dynamic x = null;
   field dynamic y = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
index 26db017..93bd955 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.outline.expect
@@ -5,13 +5,13 @@
 class A extends core::Object {
   field dynamic x;
   field dynamic y;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
   field dynamic x;
   field dynamic y;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
index 4f2a4c9..3de0169 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.expect
@@ -12,15 +12,15 @@
 
 class A extends core::Object {
   field invalid-type x = (() → invalid-type => new self::B::•().{self::B::x}) as{TypeError} invalid-type;
-  field () → invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
-  synthetic constructor •() → self::A
+  field () →* invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field invalid-type x = null;
-  field () → invalid-type y = null;
-  synthetic constructor •() → self::B
+  field () →* invalid-type y = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
index 4f2a4c9..3de0169 100644
--- a/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/field_inference_circularity.dart.strong.transformed.expect
@@ -12,15 +12,15 @@
 
 class A extends core::Object {
   field invalid-type x = (() → invalid-type => new self::B::•().{self::B::x}) as{TypeError} invalid-type;
-  field () → invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
-  synthetic constructor •() → self::A
+  field () →* invalid-type y = () → invalid-type => new self::B::•().{self::B::x};
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
   field invalid-type x = null;
-  field () → invalid-type y = null;
-  synthetic constructor •() → self::B
+  field () →* invalid-type y = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
index 0977a74..1f79cf3 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart
@@ -17,11 +17,11 @@
   void set aSetter(A value) {}
   void test() {
     A aLocal;
-    for (aLocal in /*@typeArgs=Iterable<A>*/ f()) {}
-    for (/*@target=C::aField*/ aField in /*@typeArgs=Iterable<A>*/ f()) {}
-    for (/*@target=C::aSetter*/ aSetter in /*@typeArgs=Iterable<A>*/ f()) {}
-    for (aTopLevel in /*@typeArgs=Iterable<A>*/ f()) {}
-    for (aTopLevelSetter in /*@typeArgs=Iterable<A>*/ f()) {}
+    for (aLocal in /*@ typeArgs=Iterable<A*>* */ f()) {}
+    for (/*@target=C::aField*/ aField in /*@ typeArgs=Iterable<A*>* */ f()) {}
+    for (/*@target=C::aSetter*/ aSetter in /*@ typeArgs=Iterable<A*>* */ f()) {}
+    for (aTopLevel in /*@ typeArgs=Iterable<A*>* */ f()) {}
+    for (aTopLevelSetter in /*@ typeArgs=Iterable<A*>* */ f()) {}
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect
index 6475b01..f805b67 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A aField = null;
-  synthetic constructor •() → self::C
+  field self::A* aField = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set aSetter(self::A value) → void {}
+  set aSetter(self::A* value) → void {}
   method test() → void {
-    self::A aLocal;
+    self::A* aLocal;
     for (final dynamic #t1 in self::f<dynamic>()) {
       aLocal = #t1;
     }
@@ -32,8 +32,8 @@
     }
   }
 }
-static field self::A aTopLevel;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 set aTopLevelSetter(self::A* value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect
index 6475b01..f805b67 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.legacy.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A aField = null;
-  synthetic constructor •() → self::C
+  field self::A* aField = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set aSetter(self::A value) → void {}
+  set aSetter(self::A* value) → void {}
   method test() → void {
-    self::A aLocal;
+    self::A* aLocal;
     for (final dynamic #t1 in self::f<dynamic>()) {
       aLocal = #t1;
     }
@@ -32,8 +32,8 @@
     }
   }
 }
-static field self::A aTopLevel;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 set aTopLevelSetter(self::A* value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
index 20915b0..1109d11 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.outline.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class C extends core::Object {
-  field self::A aField;
-  synthetic constructor •() → self::C
+  field self::A* aField;
+  synthetic constructor •() → self::C*
     ;
-  set aSetter(self::A value) → void
+  set aSetter(self::A* value) → void
     ;
   method test() → void
     ;
 }
-static field self::A aTopLevel;
-static method f<T extends core::Object = dynamic>() → self::f::T
+static field self::A* aTopLevel;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static set aTopLevelSetter(self::A value) → void
+static set aTopLevelSetter(self::A* value) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
index bbe79c2..b48f3df 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A aField = null;
-  synthetic constructor •() → self::C
+  field self::A* aField = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set aSetter(self::A value) → void {}
+  set aSetter(self::A* value) → void {}
   method test() → void {
-    self::A aLocal;
-    for (final self::A #t1 in self::f<core::Iterable<self::A>>()) {
+    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>>()) {
+    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>>()) {
+    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>>()) {
+    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>>()) {
+    for (final self::A* #t5 in self::f<core::Iterable<self::A*>*>()) {
       self::aTopLevelSetter = #t5;
     }
   }
 }
-static field self::A aTopLevel;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 set aTopLevelSetter(self::A* value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
index bbe79c2..b48f3df 100644
--- a/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_identifier_downwards.dart.strong.transformed.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field self::A aField = null;
-  synthetic constructor •() → self::C
+  field self::A* aField = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set aSetter(self::A value) → void {}
+  set aSetter(self::A* value) → void {}
   method test() → void {
-    self::A aLocal;
-    for (final self::A #t1 in self::f<core::Iterable<self::A>>()) {
+    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>>()) {
+    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>>()) {
+    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>>()) {
+    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>>()) {
+    for (final self::A* #t5 in self::f<core::Iterable<self::A*>*>()) {
       self::aTopLevelSetter = #t5;
     }
   }
 }
-static field self::A aTopLevel;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 set aTopLevelSetter(self::A* value) → void {}
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect
index 3e7c8ee..6076483 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method test() → dynamic async {
-  core::String s;
-  for (core::int x in s) {
+  core::String* s;
+  for (core::int* x in s) {
   }
-  await for (core::int x in s) {
+  await for (core::int* x in s) {
   }
-  core::int y;
+  core::int* y;
   for (final dynamic #t1 in s) {
     y = #t1;
   }
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect
index 0e5e658..d45b363 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.legacy.transformed.expect
@@ -4,8 +4,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -19,21 +19,20 @@
     try {
       #L1:
       {
-        core::String s;
-        for (core::int x in s) {
+        core::String* s;
+        for (core::int* x in s) {
         }
         {
           dynamic :stream = s;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<core::int> :for-iterator = new asy::_StreamIterator::•<core::int>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<core::int*>* :for-iterator = new asy::_StreamIterator::•<core::int*>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t1 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                core::int x = :for-iterator.{asy::_StreamIterator::current};
+                core::int* x = :for-iterator.{asy::_StreamIterator::current};
                 {}
               }
               else
@@ -45,19 +44,18 @@
               :result;
             }
         }
-        core::int y;
+        core::int* y;
         for (final dynamic #t4 in s) {
           y = #t4;
         }
         {
           dynamic :stream = s;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t5 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t6 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t7 = :for-iterator.{asy::_StreamIterator::current};
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
index d0463b8..13e6c5e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.expect
@@ -27,31 +27,31 @@
 import "dart:async" as asy;
 
 static method test() → dynamic async {
-  core::String s;
+  core::String* s;
   for (final dynamic #t1 in let final<BottomType> #t2 = 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} core::int;
+                ^" in s as{TypeError} core::Iterable<dynamic>*) {
+    core::int* x = #t1 as{TypeError} core::int*;
   }
   await for (final dynamic #t3 in let final<BottomType> #t4 = 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 = #t3 as{TypeError} core::int;
+                      ^" in s as{TypeError} asy::Stream<dynamic>*) {
+    core::int* x = #t3 as{TypeError} core::int*;
   }
-  core::int y;
+  core::int* y;
   for (final dynamic #t5 in let final<BottomType> #t6 = 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 = #t5 as{TypeError} core::int;
+            ^" in s as{TypeError} core::Iterable<dynamic>*) {
+    y = #t5 as{TypeError} core::int*;
   }
   await for (final dynamic #t7 in let final<BottomType> #t8 = 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 = #t7 as{TypeError} core::int;
+                  ^" in s as{TypeError} asy::Stream<dynamic>*) {
+    y = #t7 as{TypeError} core::int*;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
index 7376685..200434f 100644
--- a/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_invalid_iterable.dart.strong.transformed.expect
@@ -27,8 +27,8 @@
 import "dart:core" as core;
 
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -42,30 +42,29 @@
     try {
       #L1:
       {
-        core::String s;
+        core::String* s;
         for (final dynamic #t1 in let final<BottomType> #t2 = 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} core::int;
+                ^" in s as{TypeError} core::Iterable<dynamic>*) {
+          core::int* x = #t1 as{TypeError} core::int*;
         }
         {
           dynamic :stream = let final<BottomType> #t3 = 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>;
+                      ^" in s as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t4 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t4 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t5 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t6 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  core::int x = #t6 as{TypeError} core::int;
+                  core::int* x = #t6 as{TypeError} core::int*;
                 }
               }
               else
@@ -77,30 +76,29 @@
               :result;
             }
         }
-        core::int y;
+        core::int* y;
         for (final dynamic #t8 in let final<BottomType> #t9 = 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 = #t8 as{TypeError} core::int;
+            ^" in s as{TypeError} core::Iterable<dynamic>*) {
+          y = #t8 as{TypeError} core::int*;
         }
         {
           dynamic :stream = let final<BottomType> #t10 = 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>;
+                  ^" in s as{TypeError} asy::Stream<dynamic>*;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t11 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t11 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t12 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t13 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  y = #t13 as{TypeError} core::int;
+                  y = #t13 as{TypeError} core::int*;
                 }
               }
               else
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
index e98bf31..3dc141e 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart
@@ -25,8 +25,8 @@
   await for (b in stream) {}
   for (i in iterable) {}
   await for (i in stream) {}
-  for (a in /*@typeArgs=Iterable<A>*/ f()) {}
-  await for (a in /*@typeArgs=Stream<A>*/ f()) {}
+  for (a in /*@ typeArgs=Iterable<A*>* */ f()) {}
+  await for (a in /*@ typeArgs=Stream<A*>* */ f()) {}
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect
index 5ee26f2..c7bf1a8 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.expect
@@ -6,23 +6,23 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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;
+  core::Iterable<self::A*>* iterable;
+  asy::Stream<self::A*>* stream;
+  self::A* a;
+  self::B* b;
+  core::int* i;
   for (final dynamic #t1 in iterable) {
     a = #t1;
   }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect
index 5f786d8..5bfc930 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.legacy.transformed.expect
@@ -6,20 +6,20 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -33,23 +33,22 @@
     try {
       #L1:
       {
-        core::Iterable<self::A> iterable;
-        asy::Stream<self::A> stream;
-        self::A a;
-        self::B b;
-        core::int i;
+        core::Iterable<self::A*>* iterable;
+        asy::Stream<self::A*>* stream;
+        self::A* a;
+        self::B* b;
+        core::int* i;
         for (final dynamic #t1 in iterable) {
           a = #t1;
         }
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t2 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t4 = :for-iterator.{asy::_StreamIterator::current};
@@ -72,12 +71,11 @@
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t7 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t9 = :for-iterator.{asy::_StreamIterator::current};
@@ -100,12 +98,11 @@
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t12 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t12 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t13 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t14 = :for-iterator.{asy::_StreamIterator::current};
@@ -128,12 +125,11 @@
         {
           dynamic :stream = self::f<dynamic>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<dynamic>* :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t17 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t17 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t18 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
                 final dynamic #t19 = :for-iterator.{asy::_StreamIterator::current};
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
index 6a8d7ac..57ca95b 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.outline.expect
@@ -5,14 +5,14 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
index 01186e9..8096e30 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.expect
@@ -21,53 +21,53 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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) {
+  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) {
+  await for (final self::A* #t2 in stream) {
     a = #t2;
   }
-  for (final self::A #t3 in iterable) {
-    b = #t3 as{TypeError} self::B;
+  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;
+  await for (final self::A* #t4 in stream) {
+    b = #t4 as{TypeError} self::B*;
   }
-  for (final self::A #t5 in iterable) {
+  for (final self::A* #t5 in iterable) {
     i = let final<BottomType> #t6 = 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;
+         ^" in #t5 as{TypeError} core::int*;
   }
-  await for (final self::A #t7 in stream) {
+  await for (final self::A* #t7 in stream) {
     i = let final<BottomType> #t8 = 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 #t7 as{TypeError} core::int;
+               ^" in #t7 as{TypeError} core::int*;
   }
-  for (final self::A #t9 in self::f<core::Iterable<self::A>>()) {
+  for (final self::A* #t9 in self::f<core::Iterable<self::A*>*>()) {
     a = #t9;
   }
-  await for (final self::A #t10 in self::f<asy::Stream<self::A>>()) {
+  await for (final self::A* #t10 in self::f<asy::Stream<self::A*>*>()) {
     a = #t10;
   }
 }
diff --git a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
index 4a60fd2..650e52c 100644
--- a/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart.strong.transformed.expect
@@ -21,20 +21,20 @@
 import "dart:async";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -48,26 +48,25 @@
     try {
       #L1:
       {
-        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) {
+        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;
         }
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L2:
             while (true) {
-              dynamic #t2 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::A #t4 = :for-iterator.{asy::_StreamIterator::current};
+                final self::A* #t4 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   a = #t4;
                 }
@@ -81,23 +80,22 @@
               :result;
             }
         }
-        for (final self::A #t6 in iterable) {
-          b = #t6 as{TypeError} self::B;
+        for (final self::A* #t6 in iterable) {
+          b = #t6 as{TypeError} self::B*;
         }
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L3:
             while (true) {
-              dynamic #t7 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t7 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t8 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::A #t9 = :for-iterator.{asy::_StreamIterator::current};
+                final self::A* #t9 = :for-iterator.{asy::_StreamIterator::current};
                 {
-                  b = #t9 as{TypeError} self::B;
+                  b = #t9 as{TypeError} self::B*;
                 }
               }
               else
@@ -109,31 +107,30 @@
               :result;
             }
         }
-        for (final self::A #t11 in iterable) {
+        for (final self::A* #t11 in iterable) {
           i = let final<BottomType> #t12 = 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 #t11 as{TypeError} core::int;
+         ^" in #t11 as{TypeError} core::int*;
         }
         {
           dynamic :stream = stream;
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L4:
             while (true) {
-              dynamic #t13 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t13 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t14 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::A #t15 = :for-iterator.{asy::_StreamIterator::current};
+                final self::A* #t15 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   i = let final<BottomType> #t16 = 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 #t15 as{TypeError} core::int;
+               ^" in #t15 as{TypeError} core::int*;
                 }
               }
               else
@@ -145,21 +142,20 @@
               :result;
             }
         }
-        for (final self::A #t18 in self::f<core::Iterable<self::A>>()) {
+        for (final self::A* #t18 in self::f<core::Iterable<self::A*>*>()) {
           a = #t18;
         }
         {
-          dynamic :stream = self::f<asy::Stream<self::A>>();
+          dynamic :stream = self::f<asy::Stream<self::A*>*>();
           asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<self::A> :for-iterator = new asy::_StreamIterator::•<self::A>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
+          asy::_StreamIterator<self::A*>* :for-iterator = new asy::_StreamIterator::•<self::A*>(:stream);
           try
             #L5:
             while (true) {
-              dynamic #t19 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
+              dynamic #t19 = asy::_asyncStarMoveNextHelper(:stream);
               [yield] let dynamic #t20 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
               if(:result) {
-                final self::A #t21 = :for-iterator.{asy::_StreamIterator::current};
+                final self::A* #t21 = :for-iterator.{asy::_StreamIterator::current};
                 {
                   a = #t21;
                 }
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart
index b2e1e30..f3ca5eb 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart
@@ -32,18 +32,18 @@
 }
 
 void test1(G g) {
-  g /*@target=G::[]=*/ [0] *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ x = g /*@target=G::[]=*/ [0] *= /*@typeArgs=dynamic*/ f();
+  g /*@target=G::[]=*/ [0] *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ x = g /*@target=G::[]=*/ [0] *= /*@ typeArgs=dynamic */ f();
 }
 
 void test2(G g) {
   ++g /*@target=G::[]=*/ [0];
-  var /*@type=C*/ x = ++g /*@target=G::[]=*/ [0];
+  var /*@ type=C* */ x = ++g /*@target=G::[]=*/ [0];
 }
 
 void test3(G g) {
   g /*@target=G::[]=*/ [0]++;
-  var /*@type=A*/ x = g /*@target=G::[]=*/ [0]++;
+  var /*@ type=A* */ x = g /*@target=G::[]=*/ [0]++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect
index fc8e5b5..129a637 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  operator [](core::int i) → self::A
+  operator [](core::int* i) → self::A*
     return null;
-  operator []=(core::int i, self::B value) → void {}
+  operator []=(core::int* i, self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test1(self::G g) → void {
+static method test1(self::G* g) → void {
   let final dynamic #t1 = g in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).*(self::f<dynamic>()));
   dynamic x = let final dynamic #t3 = g in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).*(self::f<dynamic>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
 }
-static method test2(self::G g) → void {
+static method test2(self::G* g) → void {
   let final dynamic #t7 = g in let final dynamic #t8 = 0 in let final dynamic #t9 = #t7.[](#t8).+(1) in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9;
   dynamic x = let final dynamic #t11 = g in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12).+(1) in let final dynamic #t14 = #t11.[]=(#t12, #t13) in #t13;
 }
-static method test3(self::G g) → void {
+static method test3(self::G* g) → void {
   let final dynamic #t15 = g in let final dynamic #t16 = 0 in #t15.[]=(#t16, #t15.[](#t16).+(1));
   dynamic x = let final dynamic #t17 = g in let final dynamic #t18 = 0 in let final dynamic #t19 = #t17.[](#t18) in let final dynamic #t20 = #t17.[]=(#t18, #t19.+(1)) in #t19;
 }
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect
index fc8e5b5..129a637 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.legacy.transformed.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  operator [](core::int i) → self::A
+  operator [](core::int* i) → self::A*
     return null;
-  operator []=(core::int i, self::B value) → void {}
+  operator []=(core::int* i, self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test1(self::G g) → void {
+static method test1(self::G* g) → void {
   let final dynamic #t1 = g in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).*(self::f<dynamic>()));
   dynamic x = let final dynamic #t3 = g in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).*(self::f<dynamic>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
 }
-static method test2(self::G g) → void {
+static method test2(self::G* g) → void {
   let final dynamic #t7 = g in let final dynamic #t8 = 0 in let final dynamic #t9 = #t7.[](#t8).+(1) in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9;
   dynamic x = let final dynamic #t11 = g in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12).+(1) in let final dynamic #t14 = #t11.[]=(#t12, #t13) in #t13;
 }
-static method test3(self::G g) → void {
+static method test3(self::G* g) → void {
   let final dynamic #t15 = g in let final dynamic #t16 = 0 in #t15.[]=(#t16, #t15.[](#t16).+(1));
   dynamic x = let final dynamic #t17 = g in let final dynamic #t18 = 0 in let final dynamic #t19 = #t17.[](#t18) in let final dynamic #t20 = #t17.[]=(#t18, #t19.+(1)) in #t19;
 }
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
index 40dbbce..b5f40c2 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.outline.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     ;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     ;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     ;
-  operator [](core::int i) → self::A
+  operator [](core::int* i) → self::A*
     ;
-  operator []=(core::int i, self::B value) → void
+  operator []=(core::int* i, self::B* value) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static method test1(self::G g) → void
+static method test1(self::G* g) → void
   ;
-static method test2(self::G g) → void
+static method test2(self::G* g) → void
   ;
-static method test3(self::G g) → void
+static method test3(self::G* g) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
index 2aaef17..be01111 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.expect
@@ -3,63 +3,63 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  operator [](core::int i) → self::A
+  operator [](core::int* i) → self::A*
     return null;
-  operator []=(core::int i, self::B value) → void {}
+  operator []=(core::int* i, self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D));
-  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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D) in let final void #t6 = #t3.{self::G::[]=}(#t4, #t5) in #t5;
+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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D*));
+  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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D*) in let final void #t6 = #t3.{self::G::[]=}(#t4, #t5) 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).{self::A::+}(1) in let final void #t10 = #t7.{self::G::[]=}(#t8, #t9) 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).{self::A::+}(1) in let final void #t14 = #t11.{self::G::[]=}(#t12, #t13) in #t13;
+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).{self::A::+}(1) in let final void #t10 = #t7.{self::G::[]=}(#t8, #t9) 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).{self::A::+}(1) in let final void #t14 = #t11.{self::G::[]=}(#t12, #t13) 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).{self::A::+}(1));
-  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) in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1)) in #t19;
+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).{self::A::+}(1));
+  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) in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1)) in #t19;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
index 2aaef17..be01111 100644
--- a/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/indexed_assign_combiner.dart.strong.transformed.expect
@@ -3,63 +3,63 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  operator [](core::int i) → self::A
+  operator [](core::int* i) → self::A*
     return null;
-  operator []=(core::int i, self::B value) → void {}
+  operator []=(core::int* i, self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D));
-  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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D) in let final void #t6 = #t3.{self::G::[]=}(#t4, #t5) in #t5;
+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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D*));
+  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).{self::A::*}(self::f<dynamic>() as{TypeError} self::D*) in let final void #t6 = #t3.{self::G::[]=}(#t4, #t5) 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).{self::A::+}(1) in let final void #t10 = #t7.{self::G::[]=}(#t8, #t9) 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).{self::A::+}(1) in let final void #t14 = #t11.{self::G::[]=}(#t12, #t13) in #t13;
+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).{self::A::+}(1) in let final void #t10 = #t7.{self::G::[]=}(#t8, #t9) 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).{self::A::+}(1) in let final void #t14 = #t11.{self::G::[]=}(#t12, #t13) 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).{self::A::+}(1));
-  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) in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1)) in #t19;
+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).{self::A::+}(1));
+  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) in let final void #t20 = #t17.{self::G::[]=}(#t18, #t19.{self::A::+}(1)) in #t19;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
index 6d4b5e3..024d1cc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart
@@ -22,20 +22,20 @@
   B member;
 
   void test() {
-    /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     -- /*@target=Test::member*/ member;
     /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 = /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 = /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 = /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = -- /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 = /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 = /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 = /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = -- /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect
index c293859..ecaa469 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
   method test() → void {
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.transformed.expect
index c293859..ecaa469 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
   method test() → void {
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t2 = this.{self::Test::member} in let final dynamic #t3 = this.{self::Test::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
index 6ffdc2b..d784a67 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
index 534698e..9986ad5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : null;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = this.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::B #t1 = this.{self::Test::member} in #t1.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member} in #t1.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
index 534698e..9986ad5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this.dart.strong.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(null) ?{self::B} this.{self::Test::member} = self::f<self::B>() : null;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    this.{self::Test::member} = self::f<self::B*>();
+    this.{self::Test::member}.{core::Object::==}(null) ?{self::B*} this.{self::Test::member} = self::f<self::B*>() : null;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
     this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = this.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::B #t1 = this.{self::Test::member} in #t1.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::B #t2 = this.{self::Test::member} in let final self::B #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
+    self::B* v1 = this.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::B* #t1 = this.{self::Test::member} in #t1.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = this.{self::Test::member} = this.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = this.{self::Test::member} = this.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = this.{self::Test::member} = this.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::B* #t2 = this.{self::Test::member} in let final self::B* #t3 = this.{self::Test::member} = #t2.{self::B::-}(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
index 461600f..51356c8 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart
@@ -13,14 +13,14 @@
   int t;
 
   void test() {
-    var /*@type=int*/ v1 = /*@target=Test1::t*/ t = getInt();
-    var /*@type=num*/ v2 = /*@target=Test1::t*/ t = getNum();
-    var /*@type=int*/ v4 = /*@target=Test1::t*/ t ??= getInt();
-    var /*@type=num*/ v5 = /*@target=Test1::t*/ t ??= getNum();
-    var /*@type=int*/ v7 = /*@target=Test1::t*/ t += getInt();
-    var /*@type=num*/ v8 = /*@target=Test1::t*/ t += getNum();
-    var /*@type=int*/ v10 = ++ /*@target=Test1::t*/ t;
-    var /*@type=int*/ v11 = /*@target=Test1::t*/ t++;
+    var /*@ type=int* */ v1 = /*@target=Test1::t*/ t = getInt();
+    var /*@ type=num* */ v2 = /*@target=Test1::t*/ t = getNum();
+    var /*@ type=int* */ v4 = /*@target=Test1::t*/ t ??= getInt();
+    var /*@ type=num* */ v5 = /*@target=Test1::t*/ t ??= getNum();
+    var /*@ type=int* */ v7 = /*@target=Test1::t*/ t += getInt();
+    var /*@ type=num* */ v8 = /*@target=Test1::t*/ t += getNum();
+    var /*@ type=int* */ v10 = ++ /*@target=Test1::t*/ t;
+    var /*@ type=int* */ v11 = /*@target=Test1::t*/ t++;
   }
 }
 
@@ -28,17 +28,17 @@
   num t;
 
   void test() {
-    var /*@type=int*/ v1 = /*@target=Test2::t*/ t = getInt();
-    var /*@type=num*/ v2 = /*@target=Test2::t*/ t = getNum();
-    var /*@type=double*/ v3 = /*@target=Test2::t*/ t = getDouble();
-    var /*@type=num*/ v4 = /*@target=Test2::t*/ t ??= getInt();
-    var /*@type=num*/ v5 = /*@target=Test2::t*/ t ??= getNum();
-    var /*@type=num*/ v6 = /*@target=Test2::t*/ t ??= getDouble();
-    var /*@type=num*/ v7 = /*@target=Test2::t*/ t += getInt();
-    var /*@type=num*/ v8 = /*@target=Test2::t*/ t += getNum();
-    var /*@type=num*/ v9 = /*@target=Test2::t*/ t += getDouble();
-    var /*@type=num*/ v10 = ++ /*@target=Test2::t*/ t;
-    var /*@type=num*/ v11 = /*@target=Test2::t*/ t++;
+    var /*@ type=int* */ v1 = /*@target=Test2::t*/ t = getInt();
+    var /*@ type=num* */ v2 = /*@target=Test2::t*/ t = getNum();
+    var /*@ type=double* */ v3 = /*@target=Test2::t*/ t = getDouble();
+    var /*@ type=num* */ v4 = /*@target=Test2::t*/ t ??= getInt();
+    var /*@ type=num* */ v5 = /*@target=Test2::t*/ t ??= getNum();
+    var /*@ type=num* */ v6 = /*@target=Test2::t*/ t ??= getDouble();
+    var /*@ type=num* */ v7 = /*@target=Test2::t*/ t += getInt();
+    var /*@ type=num* */ v8 = /*@target=Test2::t*/ t += getNum();
+    var /*@ type=num* */ v9 = /*@target=Test2::t*/ t += getDouble();
+    var /*@ type=num* */ v10 = ++ /*@target=Test2::t*/ t;
+    var /*@ type=num* */ v11 = /*@target=Test2::t*/ t++;
   }
 }
 
@@ -46,15 +46,15 @@
   double t;
 
   void test3() {
-    var /*@type=num*/ v2 = /*@target=Test3::t*/ t = getNum();
-    var /*@type=double*/ v3 = /*@target=Test3::t*/ t = getDouble();
-    var /*@type=num*/ v5 = /*@target=Test3::t*/ t ??= getNum();
-    var /*@type=double*/ v6 = /*@target=Test3::t*/ t ??= getDouble();
-    var /*@type=double*/ v7 = /*@target=Test3::t*/ t += getInt();
-    var /*@type=double*/ v8 = /*@target=Test3::t*/ t += getNum();
-    var /*@type=double*/ v9 = /*@target=Test3::t*/ t += getDouble();
-    var /*@type=double*/ v10 = ++ /*@target=Test3::t*/ t;
-    var /*@type=double*/ v11 = /*@target=Test3::t*/ t++;
+    var /*@ type=num* */ v2 = /*@target=Test3::t*/ t = getNum();
+    var /*@ type=double* */ v3 = /*@target=Test3::t*/ t = getDouble();
+    var /*@ type=num* */ v5 = /*@target=Test3::t*/ t ??= getNum();
+    var /*@ type=double* */ v6 = /*@target=Test3::t*/ t ??= getDouble();
+    var /*@ type=double* */ v7 = /*@target=Test3::t*/ t += getInt();
+    var /*@ type=double* */ v8 = /*@target=Test3::t*/ t += getNum();
+    var /*@ type=double* */ v9 = /*@target=Test3::t*/ t += getDouble();
+    var /*@ type=double* */ v10 = ++ /*@target=Test3::t*/ t;
+    var /*@ type=double* */ v11 = /*@target=Test3::t*/ t++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect
index bb15472..d08f06b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
   method test() → void {
@@ -19,8 +19,8 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
   method test() → void {
@@ -38,8 +38,8 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
   method test3() → void {
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t12 = this.{self::Test3::t} in let final dynamic #t13 = this.{self::Test3::t} = #t12.+(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
index bb15472..d08f06b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  field core::int* t = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
   method test() → void {
@@ -19,8 +19,8 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  field core::num* t = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
   method test() → void {
@@ -38,8 +38,8 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  field core::double* t = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
   method test3() → void {
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t12 = this.{self::Test3::t} in let final dynamic #t13 = this.{self::Test3::t} = #t12.+(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.outline.expect
index 865d1dd..72b8d61 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t;
-  synthetic constructor •() → self::Test1
+  field core::int* t;
+  synthetic constructor •() → self::Test1*
     ;
   method test() → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num t;
-  synthetic constructor •() → self::Test2
+  field core::num* t;
+  synthetic constructor •() → self::Test2*
     ;
   method test() → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double t;
-  synthetic constructor •() → self::Test3
+  field core::double* t;
+  synthetic constructor •() → self::Test3*
     ;
   method test3() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.expect
index 9bcdb7d..e9abced 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Test1::t} = self::getInt() : #t1;
-    core::num v5 = let final core::int #t2 = this.{self::Test1::t} in #t2.{core::num::==}(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::num::+}(self::getInt());
-    core::num v8 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
-    core::int v11 = let final core::int #t3 = this.{self::Test1::t} in let final core::int #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1) in #t3;
+    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} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = this.{self::Test1::t} in #t2.{core::num::==}(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::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
+    core::int* v11 = let final core::int* #t3 = this.{self::Test1::t} in let final core::int* #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1) in #t3;
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  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} in #t5.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getInt() : #t5;
-    core::num v5 = let final core::num #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getNum() : #t6;
-    core::num v6 = let final core::num #t7 = this.{self::Test2::t} in #t7.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getDouble() : #t7;
-    core::num v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
-    core::num v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
-    core::num v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
-    core::num v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
-    core::num v11 = let final core::num #t8 = this.{self::Test2::t} in let final core::num #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1) in #t8;
+    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} in #t5.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = this.{self::Test2::t} in #t7.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t7;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
+    core::num* v11 = let final core::num* #t8 = this.{self::Test2::t} in let final core::num* #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1) in #t8;
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  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} in #t10.{core::num::==}(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} in #t11.{core::num::==}(null) ?{core::double} this.{self::Test3::t} = self::getDouble() : #t11;
-    core::double v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
-    core::double v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
-    core::double v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
-    core::double v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
-    core::double v11 = let final core::double #t12 = this.{self::Test3::t} in let final core::double #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1) in #t12;
+    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} in #t10.{core::num::==}(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} in #t11.{core::num::==}(null) ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t11;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
+    core::double* v11 = let final core::double* #t12 = this.{self::Test3::t} in let final core::double* #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
index 9bcdb7d..e9abced 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_implicit_this_upwards.dart.strong.transformed.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int t = null;
-  synthetic constructor •() → self::Test1
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Test1::t} = self::getInt() : #t1;
-    core::num v5 = let final core::int #t2 = this.{self::Test1::t} in #t2.{core::num::==}(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::num::+}(self::getInt());
-    core::num v8 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
-    core::int v11 = let final core::int #t3 = this.{self::Test1::t} in let final core::int #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1) in #t3;
+    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} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Test1::t} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = this.{self::Test1::t} in #t2.{core::num::==}(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::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = this.{self::Test1::t} = this.{self::Test1::t}.{core::num::+}(1);
+    core::int* v11 = let final core::int* #t3 = this.{self::Test1::t} in let final core::int* #t4 = this.{self::Test1::t} = #t3.{core::num::+}(1) in #t3;
   }
 }
 class Test2 extends core::Object {
-  field core::num t = null;
-  synthetic constructor •() → self::Test2
+  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} in #t5.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getInt() : #t5;
-    core::num v5 = let final core::num #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getNum() : #t6;
-    core::num v6 = let final core::num #t7 = this.{self::Test2::t} in #t7.{core::num::==}(null) ?{core::num} this.{self::Test2::t} = self::getDouble() : #t7;
-    core::num v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
-    core::num v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
-    core::num v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
-    core::num v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
-    core::num v11 = let final core::num #t8 = this.{self::Test2::t} in let final core::num #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1) in #t8;
+    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} in #t5.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = this.{self::Test2::t} in #t6.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = this.{self::Test2::t} in #t7.{core::num::==}(null) ?{core::num*} this.{self::Test2::t} = self::getDouble() : #t7;
+    core::num* v7 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getInt());
+    core::num* v8 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getNum());
+    core::num* v9 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(self::getDouble());
+    core::num* v10 = this.{self::Test2::t} = this.{self::Test2::t}.{core::num::+}(1);
+    core::num* v11 = let final core::num* #t8 = this.{self::Test2::t} in let final core::num* #t9 = this.{self::Test2::t} = #t8.{core::num::+}(1) in #t8;
   }
 }
 class Test3 extends core::Object {
-  field core::double t = null;
-  synthetic constructor •() → self::Test3
+  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} in #t10.{core::num::==}(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} in #t11.{core::num::==}(null) ?{core::double} this.{self::Test3::t} = self::getDouble() : #t11;
-    core::double v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
-    core::double v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
-    core::double v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
-    core::double v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
-    core::double v11 = let final core::double #t12 = this.{self::Test3::t} in let final core::double #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1) in #t12;
+    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} in #t10.{core::num::==}(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} in #t11.{core::num::==}(null) ?{core::double*} this.{self::Test3::t} = self::getDouble() : #t11;
+    core::double* v7 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getInt());
+    core::double* v8 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getNum());
+    core::double* v9 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(self::getDouble());
+    core::double* v10 = this.{self::Test3::t} = this.{self::Test3::t}.{core::double::+}(1);
+    core::double* v11 = let final core::double* #t12 = this.{self::Test3::t} in let final core::double* #t13 = this.{self::Test3::t} = #t12.{core::double::+}(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.expect
index 650665c..decafe7 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::double> a = <core::double>[];
+static field core::List<core::double*>* a = <core::double*>[];
 static field dynamic b = let final dynamic #t1 = self::a in let final dynamic #t2 = 0 in let final dynamic #t3 = 1.0 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect
index 650665c..decafe7 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::double> a = <core::double>[];
+static field core::List<core::double*>* a = <core::double*>[];
 static field dynamic b = let final dynamic #t1 = self::a in let final dynamic #t2 = 0 in let final dynamic #t3 = 1.0 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
index 951b046..4f84fb6 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::double> a;
+static field core::List<core::double*>* a;
 static field dynamic b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.expect
index 52eb394..7d38c0b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.expect
@@ -2,6 +2,6 @@
 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) in #t3;
+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) in #t3;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
index 52eb394..7d38c0b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 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) in #t3;
+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) in #t3;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
index a50bd36..8271a08 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart
@@ -25,29 +25,29 @@
   void operator []=(Index i, B v) {}
 
   void test() {
-    Test t = /*@typeArgs=Test*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+    Test t = /*@ typeArgs=Test* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 = t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 = t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect
index 8bac983..74b564b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -55,6 +55,6 @@
     dynamic v7 = let final dynamic #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final dynamic #t44 = #t42.[](#t43) in let final dynamic #t45 = #t42.[]=(#t43, #t44.-(1)) in #t44;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.transformed.expect
index 8bac983..74b564b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.legacy.transformed.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -55,6 +55,6 @@
     dynamic v7 = let final dynamic #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final dynamic #t44 = #t42.[](#t43) in let final dynamic #t45 = #t42.[]=(#t43, #t44.-(1)) in #t44;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
index b6e46f4..9f0fa38 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.outline.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
index 64b3d47..a86cc01 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.expect
@@ -3,58 +3,58 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t3 = self::f<self::B>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final self::Test #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t13) in #t13;
-    let final self::Test #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = self::f<self::B>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v2 = let final self::Test #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index) in #t23.{core::Object::==}(null) ?{self::B} let final self::B #t24 = self::f<self::B>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index, #t24) in #t24 : #t23;
-    self::A v3 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::A #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v4 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32) in #t32;
-    self::C v5 = let final self::Test #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::C #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index, #t36) in #t36;
-    self::B v6 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index).{self::B::-}(1) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40) in #t40;
-    self::B v7 = let final self::Test #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index, #t44.{self::B::-}(1)) in #t44;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t3 = self::f<self::B*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final self::Test* #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index*, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B* #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t13) in #t13;
+    let final self::Test* #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index*, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = self::f<self::B*>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v2 = let final self::Test* #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B* #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index*) in #t23.{core::Object::==}(null) ?{self::B*} let final self::B* #t24 = self::f<self::B*>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index*, #t24) in #t24 : #t23;
+    self::A* v3 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::A* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v4 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32) in #t32;
+    self::C* v5 = let final self::Test* #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::C* #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index*, #t36) in #t36;
+    self::B* v6 = let final self::Test* #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B* #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index*, #t40) in #t40;
+    self::B* v7 = let final self::Test* #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B* #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index*) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index*, #t44.{self::B::-}(1)) in #t44;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
index 64b3d47..a86cc01 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_full.dart.strong.transformed.expect
@@ -3,58 +3,58 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t3 = self::f<self::B>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final self::Test #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t13) in #t13;
-    let final self::Test #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = self::f<self::B>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v2 = let final self::Test #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index) in #t23.{core::Object::==}(null) ?{self::B} let final self::B #t24 = self::f<self::B>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index, #t24) in #t24 : #t23;
-    self::A v3 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::A #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v4 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32) in #t32;
-    self::C v5 = let final self::Test #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::C #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index, #t36) in #t36;
-    self::B v6 = let final self::Test #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index).{self::B::-}(1) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index, #t40) in #t40;
-    self::B v7 = let final self::Test #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index, #t44.{self::B::-}(1)) in #t44;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t3 = self::f<self::B*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final self::Test* #t9 = t in let final dynamic #t10 = self::f<dynamic>() in #t9.{self::Test::[]=}(#t10 as{TypeError} self::Index*, #t9.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in let final self::B* #t13 = #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t14 = #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t13) in #t13;
+    let final self::Test* #t15 = t in let final dynamic #t16 = self::f<dynamic>() in #t15.{self::Test::[]=}(#t16 as{TypeError} self::Index*, #t15.{self::Test::[]}(#t16 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = self::f<self::B*>() in let final void #t20 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v2 = let final self::Test* #t21 = t in let final dynamic #t22 = self::f<dynamic>() in let final self::B* #t23 = #t21.{self::Test::[]}(#t22 as{TypeError} self::Index*) in #t23.{core::Object::==}(null) ?{self::B*} let final self::B* #t24 = self::f<self::B*>() in let final void #t25 = #t21.{self::Test::[]=}(#t22 as{TypeError} self::Index*, #t24) in #t24 : #t23;
+    self::A* v3 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::A* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v4 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32) in #t32;
+    self::C* v5 = let final self::Test* #t34 = t in let final dynamic #t35 = self::f<dynamic>() in let final self::C* #t36 = #t34.{self::Test::[]}(#t35 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t37 = #t34.{self::Test::[]=}(#t35 as{TypeError} self::Index*, #t36) in #t36;
+    self::B* v6 = let final self::Test* #t38 = t in let final dynamic #t39 = self::f<dynamic>() in let final self::B* #t40 = #t38.{self::Test::[]}(#t39 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t41 = #t38.{self::Test::[]=}(#t39 as{TypeError} self::Index*, #t40) in #t40;
+    self::B* v7 = let final self::Test* #t42 = t in let final dynamic #t43 = self::f<dynamic>() in let final self::B* #t44 = #t42.{self::Test::[]}(#t43 as{TypeError} self::Index*) in let final void #t45 = #t42.{self::Test::[]=}(#t43 as{TypeError} self::Index*, #t44.{self::B::-}(1)) in #t44;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
index e0ab5e0..6857ea2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart
@@ -32,21 +32,21 @@
   void operator []=(Index i, A v) {}
 
   void test() {
-    Test t = /*@typeArgs=Test*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] = /*@typeArgs=A*/ f();
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=A*/ f();
+    Test t = /*@ typeArgs=Test* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] = /*@ typeArgs=A* */ f();
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=A* */ f();
     t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
-    --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=A*/ v1 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=A*/ f();
-    var /*@type=A*/ v2 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=A*/ f();
-    var /*@type=D*/ v3 = t /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
-    var /*@type=D*/ v4 = --t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v5 = t /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
+    --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=A* */ v1 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=A* */ f();
+    var /*@ type=A* */ v2 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=A* */ f();
+    var /*@ type=D* */ v3 = t /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
+    var /*@ type=D* */ v4 = --t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v5 = t /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect
index 67c11fe..ab063a7 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(self::F v) → self::C
+  operator +(self::F* v) → self::C*
     return null;
-  operator -(core::int i) → self::C
+  operator -(core::int* i) → self::C*
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::E v) → self::D
+  operator +(self::E* v) → self::D*
     return null;
-  operator -(core::int i) → self::D
+  operator -(core::int* i) → self::D*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::A v) → void {}
+  operator []=(self::Index* i, self::A* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -66,6 +66,6 @@
     dynamic v5 = let final dynamic #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final dynamic #t32 = #t30.[](#t31) in let final dynamic #t33 = #t30.[]=(#t31, #t32.-(1)) in #t32;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.transformed.expect
index 67c11fe..ab063a7 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.legacy.transformed.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(self::F v) → self::C
+  operator +(self::F* v) → self::C*
     return null;
-  operator -(core::int i) → self::C
+  operator -(core::int* i) → self::C*
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::E v) → self::D
+  operator +(self::E* v) → self::D*
     return null;
-  operator -(core::int i) → self::D
+  operator -(core::int* i) → self::D*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::A v) → void {}
+  operator []=(self::Index* i, self::A* v) → void {}
   method test() → void {
-    self::Test t = self::f<dynamic>();
+    self::Test* t = self::f<dynamic>();
     t.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.[](#t2).==(null) ? let final dynamic #t3 = self::f<dynamic>() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3 : null;
     let final dynamic #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.[]=(#t6, #t5.[](#t6).+(self::f<dynamic>()));
@@ -66,6 +66,6 @@
     dynamic v5 = let final dynamic #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final dynamic #t32 = #t30.[](#t31) in let final dynamic #t33 = #t30.[]=(#t31, #t32.-(1)) in #t32;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
index edbf11b..6803101 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.outline.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(self::F v) → self::C
+  operator +(self::F* v) → self::C*
     ;
-  operator -(core::int i) → self::C
+  operator -(core::int* i) → self::C*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::E v) → self::D
+  operator +(self::E* v) → self::D*
     ;
-  operator -(core::int i) → self::D
+  operator -(core::int* i) → self::D*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::A v) → void
+  operator []=(self::Index* i, self::A* v) → void
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
index 626219f..cde8b4e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(self::F v) → self::C
+  operator +(self::F* v) → self::C*
     return null;
-  operator -(core::int i) → self::C
+  operator -(core::int* i) → self::C*
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::E v) → self::D
+  operator +(self::E* v) → self::D*
     return null;
-  operator -(core::int i) → self::D
+  operator -(core::int* i) → self::D*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::A v) → void {}
+  operator []=(self::Index* i, self::A* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::A>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::A} let final self::A #t3 = self::f<self::A>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::E));
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in let final self::D #t9 = #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::-}(1) in let final void #t10 = #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t9) in #t9;
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1));
-    self::A v1 = let final self::Test #t13 = t in let final dynamic #t14 = self::f<dynamic>() in let final self::A #t15 = self::f<self::A>() in let final void #t16 = #t13.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t15) in #t15;
-    self::A v2 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = #t17.{self::Test::[]}(#t18 as{TypeError} self::Index) in #t19.{core::Object::==}(null) ?{self::A} let final self::A #t20 = self::f<self::A>() in let final void #t21 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t20) in #t20 : #t19;
-    self::D v3 = let final self::Test #t22 = t in let final dynamic #t23 = self::f<dynamic>() in let final self::D #t24 = #t22.{self::Test::[]}(#t23 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::E) in let final void #t25 = #t22.{self::Test::[]=}(#t23 as{TypeError} self::Index, #t24) in #t24;
-    self::D v4 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::D #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32.{self::B::-}(1)) in #t32;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::A*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::A*} let final self::A* #t3 = self::f<self::A*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::E*));
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in let final self::D* #t9 = #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t10 = #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t9) in #t9;
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1));
+    self::A* v1 = let final self::Test* #t13 = t in let final dynamic #t14 = self::f<dynamic>() in let final self::A* #t15 = self::f<self::A*>() in let final void #t16 = #t13.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t15) in #t15;
+    self::A* v2 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = #t17.{self::Test::[]}(#t18 as{TypeError} self::Index*) in #t19.{core::Object::==}(null) ?{self::A*} let final self::A* #t20 = self::f<self::A*>() in let final void #t21 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t20) in #t20 : #t19;
+    self::D* v3 = let final self::Test* #t22 = t in let final dynamic #t23 = self::f<dynamic>() in let final self::D* #t24 = #t22.{self::Test::[]}(#t23 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::E*) in let final void #t25 = #t22.{self::Test::[]=}(#t23 as{TypeError} self::Index*, #t24) in #t24;
+    self::D* v4 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::D* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v5 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32.{self::B::-}(1)) in #t32;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
index 626219f..cde8b4e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_set_vs_get.dart.strong.transformed.expect
@@ -3,69 +3,69 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(self::F v) → self::C
+  operator +(self::F* v) → self::C*
     return null;
-  operator -(core::int i) → self::C
+  operator -(core::int* i) → self::C*
     return null;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::E v) → self::D
+  operator +(self::E* v) → self::D*
     return null;
-  operator -(core::int i) → self::D
+  operator -(core::int* i) → self::D*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::A v) → void {}
+  operator []=(self::Index* i, self::A* v) → void {}
   method test() → void {
-    self::Test t = self::f<self::Test>();
-    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::A>());
-    let final self::Test #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index).{core::Object::==}(null) ?{self::A} let final self::A #t3 = self::f<self::A>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index, #t3) in #t3 : null;
-    let final self::Test #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::E));
-    let final self::Test #t7 = t in let final dynamic #t8 = self::f<dynamic>() in let final self::D #t9 = #t7.{self::Test::[]}(#t8 as{TypeError} self::Index).{self::B::-}(1) in let final void #t10 = #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index, #t9) in #t9;
-    let final self::Test #t11 = t in let final dynamic #t12 = self::f<dynamic>() in #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index, #t11.{self::Test::[]}(#t12 as{TypeError} self::Index).{self::B::-}(1));
-    self::A v1 = let final self::Test #t13 = t in let final dynamic #t14 = self::f<dynamic>() in let final self::A #t15 = self::f<self::A>() in let final void #t16 = #t13.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t15) in #t15;
-    self::A v2 = let final self::Test #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B #t19 = #t17.{self::Test::[]}(#t18 as{TypeError} self::Index) in #t19.{core::Object::==}(null) ?{self::A} let final self::A #t20 = self::f<self::A>() in let final void #t21 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t20) in #t20 : #t19;
-    self::D v3 = let final self::Test #t22 = t in let final dynamic #t23 = self::f<dynamic>() in let final self::D #t24 = #t22.{self::Test::[]}(#t23 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::E) in let final void #t25 = #t22.{self::Test::[]=}(#t23 as{TypeError} self::Index, #t24) in #t24;
-    self::D v4 = let final self::Test #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::D #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v5 = let final self::Test #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index, #t32.{self::B::-}(1)) in #t32;
+    self::Test* t = self::f<self::Test*>();
+    t.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::A*>());
+    let final self::Test* #t1 = t in let final dynamic #t2 = self::f<dynamic>() in #t1.{self::Test::[]}(#t2 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::A*} let final self::A* #t3 = self::f<self::A*>() in let final void #t4 = #t1.{self::Test::[]=}(#t2 as{TypeError} self::Index*, #t3) in #t3 : null;
+    let final self::Test* #t5 = t in let final dynamic #t6 = self::f<dynamic>() in #t5.{self::Test::[]=}(#t6 as{TypeError} self::Index*, #t5.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::E*));
+    let final self::Test* #t7 = t in let final dynamic #t8 = self::f<dynamic>() in let final self::D* #t9 = #t7.{self::Test::[]}(#t8 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t10 = #t7.{self::Test::[]=}(#t8 as{TypeError} self::Index*, #t9) in #t9;
+    let final self::Test* #t11 = t in let final dynamic #t12 = self::f<dynamic>() in #t11.{self::Test::[]=}(#t12 as{TypeError} self::Index*, #t11.{self::Test::[]}(#t12 as{TypeError} self::Index*).{self::B::-}(1));
+    self::A* v1 = let final self::Test* #t13 = t in let final dynamic #t14 = self::f<dynamic>() in let final self::A* #t15 = self::f<self::A*>() in let final void #t16 = #t13.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t15) in #t15;
+    self::A* v2 = let final self::Test* #t17 = t in let final dynamic #t18 = self::f<dynamic>() in let final self::B* #t19 = #t17.{self::Test::[]}(#t18 as{TypeError} self::Index*) in #t19.{core::Object::==}(null) ?{self::A*} let final self::A* #t20 = self::f<self::A*>() in let final void #t21 = #t17.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t20) in #t20 : #t19;
+    self::D* v3 = let final self::Test* #t22 = t in let final dynamic #t23 = self::f<dynamic>() in let final self::D* #t24 = #t22.{self::Test::[]}(#t23 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::E*) in let final void #t25 = #t22.{self::Test::[]=}(#t23 as{TypeError} self::Index*, #t24) in #t24;
+    self::D* v4 = let final self::Test* #t26 = t in let final dynamic #t27 = self::f<dynamic>() in let final self::D* #t28 = #t26.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = #t26.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v5 = let final self::Test* #t30 = t in let final dynamic #t31 = self::f<dynamic>() in let final self::B* #t32 = #t30.{self::Test::[]}(#t31 as{TypeError} self::Index*) in let final void #t33 = #t30.{self::Test::[]=}(#t31 as{TypeError} self::Index*, #t32.{self::B::-}(1)) in #t32;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
index 238f335..06b4ca1 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart
@@ -28,31 +28,31 @@
 class Test extends Base {
   void test() {
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = super /*@target=Base::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 =
-        --super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 =
-        super /*@target=Base::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = super /*@target=Base::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 =
+        --super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 =
+        super /*@target=Base::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect
index e769ffe..353a342 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.expect
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -59,6 +59,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = super.{self::Base::[]}(#t30) in let final dynamic #t32 = super.{self::Base::[]=}(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.transformed.expect
index e769ffe..353a342 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.legacy.transformed.expect
@@ -3,43 +3,43 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -59,6 +59,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = super.{self::Base::[]}(#t30) in let final dynamic #t32 = super.{self::Base::[]=}(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
index 35db856..918047c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.outline.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
index 6f04638..ade4cca 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index, super.{self::Base::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index, super.{self::Base::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index, super.{self::Base::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index, super.{self::Base::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::A v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::C v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
+    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index*, super.{self::Base::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index*, super.{self::Base::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index*, super.{self::Base::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index*, super.{self::Base::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::A* v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A* #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B* #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::C* v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C* #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B* #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index*) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index*, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
index 6f04638..ade4cca 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super.dart.strong.transformed.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index, super.{self::Base::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index, super.{self::Base::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index, super.{self::Base::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index, super.{self::Base::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::A v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::C v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
+    super.{self::Base::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in super.{self::Base::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = super.{self::Base::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in super.{self::Base::[]=}(#t4 as{TypeError} self::Index*, super.{self::Base::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in super.{self::Base::[]=}(#t5 as{TypeError} self::Index*, super.{self::Base::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in super.{self::Base::[]=}(#t6 as{TypeError} self::Index*, super.{self::Base::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = super.{self::Base::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = super.{self::Base::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in super.{self::Base::[]=}(#t10 as{TypeError} self::Index*, super.{self::Base::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = super.{self::Base::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = super.{self::Base::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = super.{self::Base::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::A* v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A* #t19 = super.{self::Base::[]}(#t18 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t20 = super.{self::Base::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B* #t22 = super.{self::Base::[]}(#t21 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t23 = super.{self::Base::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::C* v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C* #t25 = super.{self::Base::[]}(#t24 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t26 = super.{self::Base::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = super.{self::Base::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = super.{self::Base::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B* #t31 = super.{self::Base::[]}(#t30 as{TypeError} self::Index*) in let final void #t32 = super.{self::Base::[]=}(#t30 as{TypeError} self::Index*, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
index cc5e8d9..0ea9a12e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart
@@ -19,130 +19,130 @@
 
 abstract class Test1 extends Base<int, int> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=int*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=int* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=int* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=int* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test2 extends Base<int, num> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=int*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=int* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=int* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=int* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test3 extends Base<int, double> {
   void test() {
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=int* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=int* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test4 extends Base<num, int> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=num*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=num*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=num* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test5 extends Base<num, num> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=num*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=num*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=num*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=num* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=num* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test6 extends Base<num, double> {
   void test() {
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=num*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=num*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=num*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=num* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=num* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test7 extends Base<double, int> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=num*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=num* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test8 extends Base<double, num> {
   void test() {
-    var /*@type=int*/ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = super /*@target=Base::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v4 = super /*@target=Base::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=double* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=double* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
 abstract class Test9 extends Base<double, double> {
   void test() {
-    var /*@type=num*/ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
-    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
-    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = super /*@target=Base::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = super /*@target=Base::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = super /*@target=Base::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v6 = super /*@target=Base::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=double* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = super /*@target=Base::[]=*/ ['x'] += getDouble();
+    var /*@ type=double* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = super /*@target=Base::[]=*/ ['x']++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
index 9619672..adea090 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.expect
@@ -2,19 +2,19 @@
 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>
+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
+  operator [](core::String* s) → self::Base::T*
     return this.{self::Base::getValue}(s);
-  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
+  operator []=(core::String* s, generic-covariant-impl self::Base::U* v) → void
     return this.{self::Base::setValue}(s, v);
-  abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
+  abstract method getValue(core::String* s) → self::Base::T*;
+  abstract method setValue(core::String* s, generic-covariant-impl self::Base::U* v) → void;
 }
-abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → self::Test1
+abstract class Test1 extends self::Base<core::int*, core::int*> {
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -28,8 +28,8 @@
     dynamic v11 = let final dynamic #t24 = "x" in let final dynamic #t25 = super.{self::Base::[]}(#t24) in let final dynamic #t26 = super.{self::Base::[]=}(#t24, #t25.+(1)) in #t25;
   }
 }
-abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → self::Test2
+abstract class Test2 extends self::Base<core::int*, core::num*> {
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -46,8 +46,8 @@
     dynamic v11 = let final dynamic #t60 = "x" in let final dynamic #t61 = super.{self::Base::[]}(#t60) in let final dynamic #t62 = super.{self::Base::[]=}(#t60, #t61.+(1)) in #t61;
   }
 }
-abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → self::Test3
+abstract class Test3 extends self::Base<core::int*, core::double*> {
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test() → void {
@@ -62,8 +62,8 @@
     dynamic v11 = let final dynamic #t89 = "x" in let final dynamic #t90 = super.{self::Base::[]}(#t89) in let final dynamic #t91 = super.{self::Base::[]=}(#t89, #t90.+(1)) in #t90;
   }
 }
-abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → self::Test4
+abstract class Test4 extends self::Base<core::num*, core::int*> {
+  synthetic constructor •() → self::Test4*
     : super self::Base::•()
     ;
   method test() → void {
@@ -77,8 +77,8 @@
     dynamic v11 = let final dynamic #t115 = "x" in let final dynamic #t116 = super.{self::Base::[]}(#t115) in let final dynamic #t117 = super.{self::Base::[]=}(#t115, #t116.+(1)) in #t116;
   }
 }
-abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → self::Test5
+abstract class Test5 extends self::Base<core::num*, core::num*> {
+  synthetic constructor •() → self::Test5*
     : super self::Base::•()
     ;
   method test() → void {
@@ -95,8 +95,8 @@
     dynamic v11 = let final dynamic #t151 = "x" in let final dynamic #t152 = super.{self::Base::[]}(#t151) in let final dynamic #t153 = super.{self::Base::[]=}(#t151, #t152.+(1)) in #t152;
   }
 }
-abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → self::Test6
+abstract class Test6 extends self::Base<core::num*, core::double*> {
+  synthetic constructor •() → self::Test6*
     : super self::Base::•()
     ;
   method test() → void {
@@ -111,8 +111,8 @@
     dynamic v11 = let final dynamic #t180 = "x" in let final dynamic #t181 = super.{self::Base::[]}(#t180) in let final dynamic #t182 = super.{self::Base::[]=}(#t180, #t181.+(1)) in #t181;
   }
 }
-abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → self::Test7
+abstract class Test7 extends self::Base<core::double*, core::int*> {
+  synthetic constructor •() → self::Test7*
     : super self::Base::•()
     ;
   method test() → void {
@@ -126,8 +126,8 @@
     dynamic v11 = let final dynamic #t206 = "x" in let final dynamic #t207 = super.{self::Base::[]}(#t206) in let final dynamic #t208 = super.{self::Base::[]=}(#t206, #t207.+(1)) in #t207;
   }
 }
-abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → self::Test8
+abstract class Test8 extends self::Base<core::double*, core::num*> {
+  synthetic constructor •() → self::Test8*
     : super self::Base::•()
     ;
   method test() → void {
@@ -144,8 +144,8 @@
     dynamic v11 = let final dynamic #t242 = "x" in let final dynamic #t243 = super.{self::Base::[]}(#t242) in let final dynamic #t244 = super.{self::Base::[]=}(#t242, #t243.+(1)) in #t243;
   }
 }
-abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → self::Test9
+abstract class Test9 extends self::Base<core::double*, core::double*> {
+  synthetic constructor •() → self::Test9*
     : super self::Base::•()
     ;
   method test() → void {
@@ -160,10 +160,10 @@
     dynamic v11 = let final dynamic #t271 = "x" in let final dynamic #t272 = super.{self::Base::[]}(#t271) in let final dynamic #t273 = super.{self::Base::[]=}(#t271, #t272.+(1)) in #t272;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_super_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
index 9619672..adea090 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 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>
+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
+  operator [](core::String* s) → self::Base::T*
     return this.{self::Base::getValue}(s);
-  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
+  operator []=(core::String* s, generic-covariant-impl self::Base::U* v) → void
     return this.{self::Base::setValue}(s, v);
-  abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
+  abstract method getValue(core::String* s) → self::Base::T*;
+  abstract method setValue(core::String* s, generic-covariant-impl self::Base::U* v) → void;
 }
-abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → self::Test1
+abstract class Test1 extends self::Base<core::int*, core::int*> {
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -28,8 +28,8 @@
     dynamic v11 = let final dynamic #t24 = "x" in let final dynamic #t25 = super.{self::Base::[]}(#t24) in let final dynamic #t26 = super.{self::Base::[]=}(#t24, #t25.+(1)) in #t25;
   }
 }
-abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → self::Test2
+abstract class Test2 extends self::Base<core::int*, core::num*> {
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -46,8 +46,8 @@
     dynamic v11 = let final dynamic #t60 = "x" in let final dynamic #t61 = super.{self::Base::[]}(#t60) in let final dynamic #t62 = super.{self::Base::[]=}(#t60, #t61.+(1)) in #t61;
   }
 }
-abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → self::Test3
+abstract class Test3 extends self::Base<core::int*, core::double*> {
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test() → void {
@@ -62,8 +62,8 @@
     dynamic v11 = let final dynamic #t89 = "x" in let final dynamic #t90 = super.{self::Base::[]}(#t89) in let final dynamic #t91 = super.{self::Base::[]=}(#t89, #t90.+(1)) in #t90;
   }
 }
-abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → self::Test4
+abstract class Test4 extends self::Base<core::num*, core::int*> {
+  synthetic constructor •() → self::Test4*
     : super self::Base::•()
     ;
   method test() → void {
@@ -77,8 +77,8 @@
     dynamic v11 = let final dynamic #t115 = "x" in let final dynamic #t116 = super.{self::Base::[]}(#t115) in let final dynamic #t117 = super.{self::Base::[]=}(#t115, #t116.+(1)) in #t116;
   }
 }
-abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → self::Test5
+abstract class Test5 extends self::Base<core::num*, core::num*> {
+  synthetic constructor •() → self::Test5*
     : super self::Base::•()
     ;
   method test() → void {
@@ -95,8 +95,8 @@
     dynamic v11 = let final dynamic #t151 = "x" in let final dynamic #t152 = super.{self::Base::[]}(#t151) in let final dynamic #t153 = super.{self::Base::[]=}(#t151, #t152.+(1)) in #t152;
   }
 }
-abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → self::Test6
+abstract class Test6 extends self::Base<core::num*, core::double*> {
+  synthetic constructor •() → self::Test6*
     : super self::Base::•()
     ;
   method test() → void {
@@ -111,8 +111,8 @@
     dynamic v11 = let final dynamic #t180 = "x" in let final dynamic #t181 = super.{self::Base::[]}(#t180) in let final dynamic #t182 = super.{self::Base::[]=}(#t180, #t181.+(1)) in #t181;
   }
 }
-abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → self::Test7
+abstract class Test7 extends self::Base<core::double*, core::int*> {
+  synthetic constructor •() → self::Test7*
     : super self::Base::•()
     ;
   method test() → void {
@@ -126,8 +126,8 @@
     dynamic v11 = let final dynamic #t206 = "x" in let final dynamic #t207 = super.{self::Base::[]}(#t206) in let final dynamic #t208 = super.{self::Base::[]=}(#t206, #t207.+(1)) in #t207;
   }
 }
-abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → self::Test8
+abstract class Test8 extends self::Base<core::double*, core::num*> {
+  synthetic constructor •() → self::Test8*
     : super self::Base::•()
     ;
   method test() → void {
@@ -144,8 +144,8 @@
     dynamic v11 = let final dynamic #t242 = "x" in let final dynamic #t243 = super.{self::Base::[]}(#t242) in let final dynamic #t244 = super.{self::Base::[]=}(#t242, #t243.+(1)) in #t243;
   }
 }
-abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → self::Test9
+abstract class Test9 extends self::Base<core::double*, core::double*> {
+  synthetic constructor •() → self::Test9*
     : super self::Base::•()
     ;
   method test() → void {
@@ -160,10 +160,10 @@
     dynamic v11 = let final dynamic #t271 = "x" in let final dynamic #t272 = super.{self::Base::[]}(#t271) in let final dynamic #t273 = super.{self::Base::[]=}(#t271, #t272.+(1)) in #t272;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_super_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
index 98949ae..901687c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.outline.expect
@@ -2,75 +2,75 @@
 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>
+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*>*
     ;
-  operator [](core::String s) → self::Base::T
+  operator [](core::String* s) → self::Base::T*
     ;
-  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
+  operator []=(core::String* s, generic-covariant-impl self::Base::U* v) → void
     ;
-  abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
+  abstract method getValue(core::String* s) → self::Base::T*;
+  abstract method setValue(core::String* s, generic-covariant-impl self::Base::U* v) → void;
 }
-abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → self::Test1
+abstract class Test1 extends self::Base<core::int*, core::int*> {
+  synthetic constructor •() → self::Test1*
     ;
   method test() → void
     ;
 }
-abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → self::Test2
+abstract class Test2 extends self::Base<core::int*, core::num*> {
+  synthetic constructor •() → self::Test2*
     ;
   method test() → void
     ;
 }
-abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → self::Test3
+abstract class Test3 extends self::Base<core::int*, core::double*> {
+  synthetic constructor •() → self::Test3*
     ;
   method test() → void
     ;
 }
-abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → self::Test4
+abstract class Test4 extends self::Base<core::num*, core::int*> {
+  synthetic constructor •() → self::Test4*
     ;
   method test() → void
     ;
 }
-abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → self::Test5
+abstract class Test5 extends self::Base<core::num*, core::num*> {
+  synthetic constructor •() → self::Test5*
     ;
   method test() → void
     ;
 }
-abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → self::Test6
+abstract class Test6 extends self::Base<core::num*, core::double*> {
+  synthetic constructor •() → self::Test6*
     ;
   method test() → void
     ;
 }
-abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → self::Test7
+abstract class Test7 extends self::Base<core::double*, core::int*> {
+  synthetic constructor •() → self::Test7*
     ;
   method test() → void
     ;
 }
-abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → self::Test8
+abstract class Test8 extends self::Base<core::double*, core::num*> {
+  synthetic constructor •() → self::Test8*
     ;
   method test() → void
     ;
 }
-abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → self::Test9
+abstract class Test9 extends self::Base<core::double*, core::double*> {
+  synthetic constructor •() → self::Test9*
     ;
   method test() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
index 58dc48e..3a8ed7b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart.strong.expect
@@ -2,227 +2,227 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 // Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-//                                                              ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-//                             ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
-//                                                              ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+//     var /*@ type=int* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-//                                                                 ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:32: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//     var /*@ type=int* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
 //                                ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//     var /*@ type=int* */ v11 = super /*@target=Base::[]=*/ ['x']++;
 //                                                                 ^
 //
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:35: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+//                                   ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v11 = super /*@target=Base::[]=*/ ['x']++;
+//                                                                    ^
+//
 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>
+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
+  operator [](core::String* s) → self::Base::T*
     return this.{self::Base::getValue}(s);
-  operator []=(core::String s, generic-covariant-impl self::Base::U v) → void
+  operator []=(core::String* s, generic-covariant-impl self::Base::U* v) → void
     return this.{self::Base::setValue}(s, v);
-  abstract method getValue(core::String s) → self::Base::T;
-  abstract method setValue(core::String s, generic-covariant-impl self::Base::U v) → void;
+  abstract method getValue(core::String* s) → self::Base::T*;
+  abstract method setValue(core::String* s, generic-covariant-impl self::Base::U* v) → void;
 }
-abstract class Test1 extends self::Base<core::int, core::int> {
-  synthetic constructor •() → self::Test1
+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.{core::num::==}(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.{core::num::==}(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()) 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()) 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) 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)) in #t25;
+    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.{core::num::==}(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.{core::num::==}(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()) 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()) 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) 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)) in #t25;
   }
 }
-abstract class Test2 extends self::Base<core::int, core::num> {
-  synthetic constructor •() → self::Test2
+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.{core::num::==}(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.{core::num::==}(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.{core::num::==}(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()) 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()) 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()) 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) 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)) in #t61;
+    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.{core::num::==}(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.{core::num::==}(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.{core::num::==}(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()) 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()) 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()) 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) 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)) in #t61;
   }
 }
-abstract class Test3 extends self::Base<core::int, core::double> {
-  synthetic constructor •() → self::Test3
+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.{core::num::==}(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.{core::num::==}(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 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    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.{core::num::==}(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.{core::num::==}(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 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:55:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-                                                             ^" in super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
-    core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = super.{self::Base::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = super.{self::Base::[]=}(#t81, #t82) in #t82;
-    core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = super.{self::Base::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = super.{self::Base::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+                                                                ^" in super.{self::Base::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t80 = super.{self::Base::[]=}(#t77, #t78) in #t78;
+    core::num* v8 = let final core::String* #t81 = "x" in let final core::num* #t82 = super.{self::Base::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t83 = super.{self::Base::[]=}(#t81, #t82) in #t82;
+    core::double* v9 = let final core::String* #t84 = "x" in let final core::double* #t85 = super.{self::Base::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = super.{self::Base::[]=}(#t84, #t85) in #t85;
+    core::int* v10 = let final core::String* #t87 = "x" in let final core::int* #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:58:32: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-                            ^" in super.{self::Base::[]}(#t87).{core::num::+}(1) as{TypeError} core::double in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+                               ^" in super.{self::Base::[]}(#t87).{core::num::+}(1) as{TypeError} core::double* in let final void #t90 = super.{self::Base::[]=}(#t87, #t88) in #t88;
+    core::int* v11 = let final core::String* #t91 = "x" in let final core::int* #t92 = super.{self::Base::[]}(#t91) in let final void #t93 = super.{self::Base::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:59:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v11 = super /*@target=Base::[]=*/ ['x']++;
-                                                             ^" in #t92.{core::num::+}(1) as{TypeError} core::double) in #t92;
+    var /*@ type=int* */ v11 = super /*@target=Base::[]=*/ ['x']++;
+                                                                ^" in #t92.{core::num::+}(1) as{TypeError} core::double*) in #t92;
   }
 }
-abstract class Test4 extends self::Base<core::num, core::int> {
-  synthetic constructor •() → self::Test4
+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 #t95 = "x" in let final core::int #t96 = self::getInt() in let final void #t97 = super.{self::Base::[]=}(#t95, #t96) in #t96;
-    core::num v2 = let final core::String #t98 = "x" in let final core::num #t99 = self::getNum() as{TypeError} core::int in let final void #t100 = super.{self::Base::[]=}(#t98, #t99) in #t99;
-    core::num v4 = let final core::String #t101 = "x" in let final core::num #t102 = super.{self::Base::[]}(#t101) in #t102.{core::num::==}(null) ?{core::num} let final core::int #t103 = self::getInt() in let final void #t104 = super.{self::Base::[]=}(#t101, #t103) in #t103 : #t102;
-    core::num v5 = let final core::String #t105 = "x" in let final core::num #t106 = super.{self::Base::[]}(#t105) in #t106.{core::num::==}(null) ?{core::num} let final core::num #t107 = self::getNum() as{TypeError} core::int in let final void #t108 = super.{self::Base::[]=}(#t105, #t107) in #t107 : #t106;
-    core::num v7 = let final core::String #t109 = "x" in let final core::num #t110 = super.{self::Base::[]}(#t109).{core::num::+}(self::getInt()) as{TypeError} core::int in let final void #t111 = super.{self::Base::[]=}(#t109, #t110) in #t110;
-    core::num v8 = let final core::String #t112 = "x" in let final core::num #t113 = super.{self::Base::[]}(#t112).{core::num::+}(self::getNum()) as{TypeError} core::int in let final void #t114 = super.{self::Base::[]=}(#t112, #t113) in #t113;
-    core::num v10 = let final core::String #t115 = "x" in let final core::num #t116 = super.{self::Base::[]}(#t115).{core::num::+}(1) as{TypeError} core::int in let final void #t117 = super.{self::Base::[]=}(#t115, #t116) in #t116;
-    core::num v11 = let final core::String #t118 = "x" in let final core::num #t119 = super.{self::Base::[]}(#t118) in let final void #t120 = super.{self::Base::[]=}(#t118, #t119.{core::num::+}(1) as{TypeError} core::int) in #t119;
+    core::int* v1 = let final core::String* #t95 = "x" in let final core::int* #t96 = self::getInt() in let final void #t97 = super.{self::Base::[]=}(#t95, #t96) in #t96;
+    core::num* v2 = let final core::String* #t98 = "x" in let final core::num* #t99 = self::getNum() as{TypeError} core::int* in let final void #t100 = super.{self::Base::[]=}(#t98, #t99) in #t99;
+    core::num* v4 = let final core::String* #t101 = "x" in let final core::num* #t102 = super.{self::Base::[]}(#t101) in #t102.{core::num::==}(null) ?{core::num*} let final core::int* #t103 = self::getInt() in let final void #t104 = super.{self::Base::[]=}(#t101, #t103) in #t103 : #t102;
+    core::num* v5 = let final core::String* #t105 = "x" in let final core::num* #t106 = super.{self::Base::[]}(#t105) in #t106.{core::num::==}(null) ?{core::num*} let final core::num* #t107 = self::getNum() as{TypeError} core::int* in let final void #t108 = super.{self::Base::[]=}(#t105, #t107) in #t107 : #t106;
+    core::num* v7 = let final core::String* #t109 = "x" in let final core::num* #t110 = super.{self::Base::[]}(#t109).{core::num::+}(self::getInt()) as{TypeError} core::int* in let final void #t111 = super.{self::Base::[]=}(#t109, #t110) in #t110;
+    core::num* v8 = let final core::String* #t112 = "x" in let final core::num* #t113 = super.{self::Base::[]}(#t112).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t114 = super.{self::Base::[]=}(#t112, #t113) in #t113;
+    core::num* v10 = let final core::String* #t115 = "x" in let final core::num* #t116 = super.{self::Base::[]}(#t115).{core::num::+}(1) as{TypeError} core::int* in let final void #t117 = super.{self::Base::[]=}(#t115, #t116) in #t116;
+    core::num* v11 = let final core::String* #t118 = "x" in let final core::num* #t119 = super.{self::Base::[]}(#t118) in let final void #t120 = super.{self::Base::[]=}(#t118, #t119.{core::num::+}(1) as{TypeError} core::int*) in #t119;
   }
 }
-abstract class Test5 extends self::Base<core::num, core::num> {
-  synthetic constructor •() → self::Test5
+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 #t121 = "x" in let final core::int #t122 = self::getInt() in let final void #t123 = super.{self::Base::[]=}(#t121, #t122) in #t122;
-    core::num v2 = let final core::String #t124 = "x" in let final core::num #t125 = self::getNum() in let final void #t126 = super.{self::Base::[]=}(#t124, #t125) in #t125;
-    core::double v3 = let final core::String #t127 = "x" in let final core::double #t128 = self::getDouble() in let final void #t129 = super.{self::Base::[]=}(#t127, #t128) in #t128;
-    core::num v4 = let final core::String #t130 = "x" in let final core::num #t131 = super.{self::Base::[]}(#t130) in #t131.{core::num::==}(null) ?{core::num} let final core::int #t132 = self::getInt() in let final void #t133 = super.{self::Base::[]=}(#t130, #t132) in #t132 : #t131;
-    core::num v5 = let final core::String #t134 = "x" in let final core::num #t135 = super.{self::Base::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num} let final core::num #t136 = self::getNum() in let final void #t137 = super.{self::Base::[]=}(#t134, #t136) in #t136 : #t135;
-    core::num v6 = let final core::String #t138 = "x" in let final core::num #t139 = super.{self::Base::[]}(#t138) in #t139.{core::num::==}(null) ?{core::num} let final core::double #t140 = self::getDouble() in let final void #t141 = super.{self::Base::[]=}(#t138, #t140) in #t140 : #t139;
-    core::num v7 = let final core::String #t142 = "x" in let final core::num #t143 = super.{self::Base::[]}(#t142).{core::num::+}(self::getInt()) in let final void #t144 = super.{self::Base::[]=}(#t142, #t143) in #t143;
-    core::num v8 = let final core::String #t145 = "x" in let final core::num #t146 = super.{self::Base::[]}(#t145).{core::num::+}(self::getNum()) in let final void #t147 = super.{self::Base::[]=}(#t145, #t146) in #t146;
-    core::num v9 = let final core::String #t148 = "x" in let final core::num #t149 = super.{self::Base::[]}(#t148).{core::num::+}(self::getDouble()) in let final void #t150 = super.{self::Base::[]=}(#t148, #t149) in #t149;
-    core::num v10 = let final core::String #t151 = "x" in let final core::num #t152 = super.{self::Base::[]}(#t151).{core::num::+}(1) in let final void #t153 = super.{self::Base::[]=}(#t151, #t152) in #t152;
-    core::num v11 = let final core::String #t154 = "x" in let final core::num #t155 = super.{self::Base::[]}(#t154) in let final void #t156 = super.{self::Base::[]=}(#t154, #t155.{core::num::+}(1)) in #t155;
+    core::int* v1 = let final core::String* #t121 = "x" in let final core::int* #t122 = self::getInt() in let final void #t123 = super.{self::Base::[]=}(#t121, #t122) in #t122;
+    core::num* v2 = let final core::String* #t124 = "x" in let final core::num* #t125 = self::getNum() in let final void #t126 = super.{self::Base::[]=}(#t124, #t125) in #t125;
+    core::double* v3 = let final core::String* #t127 = "x" in let final core::double* #t128 = self::getDouble() in let final void #t129 = super.{self::Base::[]=}(#t127, #t128) in #t128;
+    core::num* v4 = let final core::String* #t130 = "x" in let final core::num* #t131 = super.{self::Base::[]}(#t130) in #t131.{core::num::==}(null) ?{core::num*} let final core::int* #t132 = self::getInt() in let final void #t133 = super.{self::Base::[]=}(#t130, #t132) in #t132 : #t131;
+    core::num* v5 = let final core::String* #t134 = "x" in let final core::num* #t135 = super.{self::Base::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num*} let final core::num* #t136 = self::getNum() in let final void #t137 = super.{self::Base::[]=}(#t134, #t136) in #t136 : #t135;
+    core::num* v6 = let final core::String* #t138 = "x" in let final core::num* #t139 = super.{self::Base::[]}(#t138) in #t139.{core::num::==}(null) ?{core::num*} let final core::double* #t140 = self::getDouble() in let final void #t141 = super.{self::Base::[]=}(#t138, #t140) in #t140 : #t139;
+    core::num* v7 = let final core::String* #t142 = "x" in let final core::num* #t143 = super.{self::Base::[]}(#t142).{core::num::+}(self::getInt()) in let final void #t144 = super.{self::Base::[]=}(#t142, #t143) in #t143;
+    core::num* v8 = let final core::String* #t145 = "x" in let final core::num* #t146 = super.{self::Base::[]}(#t145).{core::num::+}(self::getNum()) in let final void #t147 = super.{self::Base::[]=}(#t145, #t146) in #t146;
+    core::num* v9 = let final core::String* #t148 = "x" in let final core::num* #t149 = super.{self::Base::[]}(#t148).{core::num::+}(self::getDouble()) in let final void #t150 = super.{self::Base::[]=}(#t148, #t149) in #t149;
+    core::num* v10 = let final core::String* #t151 = "x" in let final core::num* #t152 = super.{self::Base::[]}(#t151).{core::num::+}(1) in let final void #t153 = super.{self::Base::[]=}(#t151, #t152) in #t152;
+    core::num* v11 = let final core::String* #t154 = "x" in let final core::num* #t155 = super.{self::Base::[]}(#t154) in let final void #t156 = super.{self::Base::[]=}(#t154, #t155.{core::num::+}(1)) in #t155;
   }
 }
-abstract class Test6 extends self::Base<core::num, core::double> {
-  synthetic constructor •() → self::Test6
+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 #t157 = "x" in let final core::num #t158 = self::getNum() as{TypeError} core::double in let final void #t159 = super.{self::Base::[]=}(#t157, #t158) in #t158;
-    core::double v3 = let final core::String #t160 = "x" in let final core::double #t161 = self::getDouble() in let final void #t162 = super.{self::Base::[]=}(#t160, #t161) in #t161;
-    core::num v5 = let final core::String #t163 = "x" in let final core::num #t164 = super.{self::Base::[]}(#t163) in #t164.{core::num::==}(null) ?{core::num} let final core::num #t165 = self::getNum() as{TypeError} core::double in let final void #t166 = super.{self::Base::[]=}(#t163, #t165) in #t165 : #t164;
-    core::num v6 = let final core::String #t167 = "x" in let final core::num #t168 = super.{self::Base::[]}(#t167) in #t168.{core::num::==}(null) ?{core::num} let final core::double #t169 = self::getDouble() in let final void #t170 = super.{self::Base::[]=}(#t167, #t169) in #t169 : #t168;
-    core::num v7 = let final core::String #t171 = "x" in let final core::num #t172 = super.{self::Base::[]}(#t171).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t173 = super.{self::Base::[]=}(#t171, #t172) in #t172;
-    core::num v8 = let final core::String #t174 = "x" in let final core::num #t175 = super.{self::Base::[]}(#t174).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t176 = super.{self::Base::[]=}(#t174, #t175) in #t175;
-    core::num v9 = let final core::String #t177 = "x" in let final core::num #t178 = super.{self::Base::[]}(#t177).{core::num::+}(self::getDouble()) as{TypeError} core::double in let final void #t179 = super.{self::Base::[]=}(#t177, #t178) in #t178;
-    core::num v10 = let final core::String #t180 = "x" in let final core::num #t181 = super.{self::Base::[]}(#t180).{core::num::+}(1) as{TypeError} core::double in let final void #t182 = super.{self::Base::[]=}(#t180, #t181) in #t181;
-    core::num v11 = let final core::String #t183 = "x" in let final core::num #t184 = super.{self::Base::[]}(#t183) in let final void #t185 = super.{self::Base::[]=}(#t183, #t184.{core::num::+}(1) as{TypeError} core::double) in #t184;
+    core::num* v2 = let final core::String* #t157 = "x" in let final core::num* #t158 = self::getNum() as{TypeError} core::double* in let final void #t159 = super.{self::Base::[]=}(#t157, #t158) in #t158;
+    core::double* v3 = let final core::String* #t160 = "x" in let final core::double* #t161 = self::getDouble() in let final void #t162 = super.{self::Base::[]=}(#t160, #t161) in #t161;
+    core::num* v5 = let final core::String* #t163 = "x" in let final core::num* #t164 = super.{self::Base::[]}(#t163) in #t164.{core::num::==}(null) ?{core::num*} let final core::num* #t165 = self::getNum() as{TypeError} core::double* in let final void #t166 = super.{self::Base::[]=}(#t163, #t165) in #t165 : #t164;
+    core::num* v6 = let final core::String* #t167 = "x" in let final core::num* #t168 = super.{self::Base::[]}(#t167) in #t168.{core::num::==}(null) ?{core::num*} let final core::double* #t169 = self::getDouble() in let final void #t170 = super.{self::Base::[]=}(#t167, #t169) in #t169 : #t168;
+    core::num* v7 = let final core::String* #t171 = "x" in let final core::num* #t172 = super.{self::Base::[]}(#t171).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t173 = super.{self::Base::[]=}(#t171, #t172) in #t172;
+    core::num* v8 = let final core::String* #t174 = "x" in let final core::num* #t175 = super.{self::Base::[]}(#t174).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t176 = super.{self::Base::[]=}(#t174, #t175) in #t175;
+    core::num* v9 = let final core::String* #t177 = "x" in let final core::num* #t178 = super.{self::Base::[]}(#t177).{core::num::+}(self::getDouble()) as{TypeError} core::double* in let final void #t179 = super.{self::Base::[]=}(#t177, #t178) in #t178;
+    core::num* v10 = let final core::String* #t180 = "x" in let final core::num* #t181 = super.{self::Base::[]}(#t180).{core::num::+}(1) as{TypeError} core::double* in let final void #t182 = super.{self::Base::[]=}(#t180, #t181) in #t181;
+    core::num* v11 = let final core::String* #t183 = "x" in let final core::num* #t184 = super.{self::Base::[]}(#t183) in let final void #t185 = super.{self::Base::[]=}(#t183, #t184.{core::num::+}(1) as{TypeError} core::double*) in #t184;
   }
 }
-abstract class Test7 extends self::Base<core::double, core::int> {
-  synthetic constructor •() → self::Test7
+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 #t186 = "x" in let final core::int #t187 = self::getInt() in let final void #t188 = super.{self::Base::[]=}(#t186, #t187) in #t187;
-    core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = super.{self::Base::[]=}(#t189, #t190) in #t190;
-    core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = super.{self::Base::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = super.{self::Base::[]=}(#t192, #t194) in #t194 : #t193;
-    core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = super.{self::Base::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = super.{self::Base::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    core::int* v1 = let final core::String* #t186 = "x" in let final core::int* #t187 = self::getInt() in let final void #t188 = super.{self::Base::[]=}(#t186, #t187) in #t187;
+    core::num* v2 = let final core::String* #t189 = "x" in let final core::num* #t190 = self::getNum() as{TypeError} core::int* in let final void #t191 = super.{self::Base::[]=}(#t189, #t190) in #t190;
+    core::num* v4 = let final core::String* #t192 = "x" in let final core::double* #t193 = super.{self::Base::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num*} let final core::int* #t194 = self::getInt() in let final void #t195 = super.{self::Base::[]=}(#t192, #t194) in #t194 : #t193;
+    core::num* v5 = let final core::String* #t196 = "x" in let final core::double* #t197 = super.{self::Base::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num*} let final core::num* #t198 = self::getNum() as{TypeError} core::int* in let final void #t199 = super.{self::Base::[]=}(#t196, #t198) in #t198 : #t197;
+    core::double* v7 = let final core::String* #t200 = "x" in let final core::double* #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:112:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
-                                                                ^" in super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v7 = super /*@target=Base::[]=*/ ['x'] += getInt();
+                                                                   ^" in super.{self::Base::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t203 = super.{self::Base::[]=}(#t200, #t201) in #t201;
+    core::double* v8 = let final core::String* #t204 = "x" in let final core::double* #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:113:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
-                                                                ^" in super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v8 = super /*@target=Base::[]=*/ ['x'] += getNum();
+                                                                   ^" in super.{self::Base::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t207 = super.{self::Base::[]=}(#t204, #t205) in #t205;
+    core::double* v10 = let final core::String* #t208 = "x" in let final core::double* #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:114:35: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v10 = ++super /*@target=Base::[]=*/ ['x'];
-                               ^" in super.{self::Base::[]}(#t208).{core::double::+}(1) as{TypeError} core::int in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v10 = ++super /*@target=Base::[]=*/ ['x'];
+                                  ^" in super.{self::Base::[]}(#t208).{core::double::+}(1) as{TypeError} core::int* in let final void #t211 = super.{self::Base::[]=}(#t208, #t209) in #t209;
+    core::double* v11 = let final core::String* #t212 = "x" in let final core::double* #t213 = super.{self::Base::[]}(#t212) in let final void #t214 = super.{self::Base::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_super_upwards.dart:115:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v11 = super /*@target=Base::[]=*/ ['x']++;
-                                                                ^" in #t213.{core::double::+}(1) as{TypeError} core::int) in #t213;
+    var /*@ type=double* */ v11 = super /*@target=Base::[]=*/ ['x']++;
+                                                                   ^" in #t213.{core::double::+}(1) as{TypeError} core::int*) in #t213;
   }
 }
-abstract class Test8 extends self::Base<core::double, core::num> {
-  synthetic constructor •() → self::Test8
+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 #t216 = "x" in let final core::int #t217 = self::getInt() in let final void #t218 = super.{self::Base::[]=}(#t216, #t217) in #t217;
-    core::num v2 = let final core::String #t219 = "x" in let final core::num #t220 = self::getNum() in let final void #t221 = super.{self::Base::[]=}(#t219, #t220) in #t220;
-    core::double v3 = let final core::String #t222 = "x" in let final core::double #t223 = self::getDouble() in let final void #t224 = super.{self::Base::[]=}(#t222, #t223) in #t223;
-    core::num v4 = let final core::String #t225 = "x" in let final core::double #t226 = super.{self::Base::[]}(#t225) in #t226.{core::num::==}(null) ?{core::num} let final core::int #t227 = self::getInt() in let final void #t228 = super.{self::Base::[]=}(#t225, #t227) in #t227 : #t226;
-    core::num v5 = let final core::String #t229 = "x" in let final core::double #t230 = super.{self::Base::[]}(#t229) in #t230.{core::num::==}(null) ?{core::num} let final core::num #t231 = self::getNum() in let final void #t232 = super.{self::Base::[]=}(#t229, #t231) in #t231 : #t230;
-    core::double v6 = let final core::String #t233 = "x" in let final core::double #t234 = super.{self::Base::[]}(#t233) in #t234.{core::num::==}(null) ?{core::double} let final core::double #t235 = self::getDouble() in let final void #t236 = super.{self::Base::[]=}(#t233, #t235) in #t235 : #t234;
-    core::double v7 = let final core::String #t237 = "x" in let final core::double #t238 = super.{self::Base::[]}(#t237).{core::double::+}(self::getInt()) in let final void #t239 = super.{self::Base::[]=}(#t237, #t238) in #t238;
-    core::double v8 = let final core::String #t240 = "x" in let final core::double #t241 = super.{self::Base::[]}(#t240).{core::double::+}(self::getNum()) in let final void #t242 = super.{self::Base::[]=}(#t240, #t241) in #t241;
-    core::double v9 = let final core::String #t243 = "x" in let final core::double #t244 = super.{self::Base::[]}(#t243).{core::double::+}(self::getDouble()) in let final void #t245 = super.{self::Base::[]=}(#t243, #t244) in #t244;
-    core::double v10 = let final core::String #t246 = "x" in let final core::double #t247 = super.{self::Base::[]}(#t246).{core::double::+}(1) in let final void #t248 = super.{self::Base::[]=}(#t246, #t247) in #t247;
-    core::double v11 = let final core::String #t249 = "x" in let final core::double #t250 = super.{self::Base::[]}(#t249) in let final void #t251 = super.{self::Base::[]=}(#t249, #t250.{core::double::+}(1)) in #t250;
+    core::int* v1 = let final core::String* #t216 = "x" in let final core::int* #t217 = self::getInt() in let final void #t218 = super.{self::Base::[]=}(#t216, #t217) in #t217;
+    core::num* v2 = let final core::String* #t219 = "x" in let final core::num* #t220 = self::getNum() in let final void #t221 = super.{self::Base::[]=}(#t219, #t220) in #t220;
+    core::double* v3 = let final core::String* #t222 = "x" in let final core::double* #t223 = self::getDouble() in let final void #t224 = super.{self::Base::[]=}(#t222, #t223) in #t223;
+    core::num* v4 = let final core::String* #t225 = "x" in let final core::double* #t226 = super.{self::Base::[]}(#t225) in #t226.{core::num::==}(null) ?{core::num*} let final core::int* #t227 = self::getInt() in let final void #t228 = super.{self::Base::[]=}(#t225, #t227) in #t227 : #t226;
+    core::num* v5 = let final core::String* #t229 = "x" in let final core::double* #t230 = super.{self::Base::[]}(#t229) in #t230.{core::num::==}(null) ?{core::num*} let final core::num* #t231 = self::getNum() in let final void #t232 = super.{self::Base::[]=}(#t229, #t231) in #t231 : #t230;
+    core::double* v6 = let final core::String* #t233 = "x" in let final core::double* #t234 = super.{self::Base::[]}(#t233) in #t234.{core::num::==}(null) ?{core::double*} let final core::double* #t235 = self::getDouble() in let final void #t236 = super.{self::Base::[]=}(#t233, #t235) in #t235 : #t234;
+    core::double* v7 = let final core::String* #t237 = "x" in let final core::double* #t238 = super.{self::Base::[]}(#t237).{core::double::+}(self::getInt()) in let final void #t239 = super.{self::Base::[]=}(#t237, #t238) in #t238;
+    core::double* v8 = let final core::String* #t240 = "x" in let final core::double* #t241 = super.{self::Base::[]}(#t240).{core::double::+}(self::getNum()) in let final void #t242 = super.{self::Base::[]=}(#t240, #t241) in #t241;
+    core::double* v9 = let final core::String* #t243 = "x" in let final core::double* #t244 = super.{self::Base::[]}(#t243).{core::double::+}(self::getDouble()) in let final void #t245 = super.{self::Base::[]=}(#t243, #t244) in #t244;
+    core::double* v10 = let final core::String* #t246 = "x" in let final core::double* #t247 = super.{self::Base::[]}(#t246).{core::double::+}(1) in let final void #t248 = super.{self::Base::[]=}(#t246, #t247) in #t247;
+    core::double* v11 = let final core::String* #t249 = "x" in let final core::double* #t250 = super.{self::Base::[]}(#t249) in let final void #t251 = super.{self::Base::[]=}(#t249, #t250.{core::double::+}(1)) in #t250;
   }
 }
-abstract class Test9 extends self::Base<core::double, core::double> {
-  synthetic constructor •() → self::Test9
+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 #t252 = "x" in let final core::num #t253 = self::getNum() as{TypeError} core::double in let final void #t254 = super.{self::Base::[]=}(#t252, #t253) in #t253;
-    core::double v3 = let final core::String #t255 = "x" in let final core::double #t256 = self::getDouble() in let final void #t257 = super.{self::Base::[]=}(#t255, #t256) in #t256;
-    core::num v5 = let final core::String #t258 = "x" in let final core::double #t259 = super.{self::Base::[]}(#t258) in #t259.{core::num::==}(null) ?{core::num} let final core::num #t260 = self::getNum() as{TypeError} core::double in let final void #t261 = super.{self::Base::[]=}(#t258, #t260) in #t260 : #t259;
-    core::double v6 = let final core::String #t262 = "x" in let final core::double #t263 = super.{self::Base::[]}(#t262) in #t263.{core::num::==}(null) ?{core::double} let final core::double #t264 = self::getDouble() in let final void #t265 = super.{self::Base::[]=}(#t262, #t264) in #t264 : #t263;
-    core::double v7 = let final core::String #t266 = "x" in let final core::double #t267 = super.{self::Base::[]}(#t266).{core::double::+}(self::getInt()) in let final void #t268 = super.{self::Base::[]=}(#t266, #t267) in #t267;
-    core::double v8 = let final core::String #t269 = "x" in let final core::double #t270 = super.{self::Base::[]}(#t269).{core::double::+}(self::getNum()) in let final void #t271 = super.{self::Base::[]=}(#t269, #t270) in #t270;
-    core::double v9 = let final core::String #t272 = "x" in let final core::double #t273 = super.{self::Base::[]}(#t272).{core::double::+}(self::getDouble()) in let final void #t274 = super.{self::Base::[]=}(#t272, #t273) in #t273;
-    core::double v10 = let final core::String #t275 = "x" in let final core::double #t276 = super.{self::Base::[]}(#t275).{core::double::+}(1) in let final void #t277 = super.{self::Base::[]=}(#t275, #t276) in #t276;
-    core::double v11 = let final core::String #t278 = "x" in let final core::double #t279 = super.{self::Base::[]}(#t278) in let final void #t280 = super.{self::Base::[]=}(#t278, #t279.{core::double::+}(1)) in #t279;
+    core::num* v2 = let final core::String* #t252 = "x" in let final core::num* #t253 = self::getNum() as{TypeError} core::double* in let final void #t254 = super.{self::Base::[]=}(#t252, #t253) in #t253;
+    core::double* v3 = let final core::String* #t255 = "x" in let final core::double* #t256 = self::getDouble() in let final void #t257 = super.{self::Base::[]=}(#t255, #t256) in #t256;
+    core::num* v5 = let final core::String* #t258 = "x" in let final core::double* #t259 = super.{self::Base::[]}(#t258) in #t259.{core::num::==}(null) ?{core::num*} let final core::num* #t260 = self::getNum() as{TypeError} core::double* in let final void #t261 = super.{self::Base::[]=}(#t258, #t260) in #t260 : #t259;
+    core::double* v6 = let final core::String* #t262 = "x" in let final core::double* #t263 = super.{self::Base::[]}(#t262) in #t263.{core::num::==}(null) ?{core::double*} let final core::double* #t264 = self::getDouble() in let final void #t265 = super.{self::Base::[]=}(#t262, #t264) in #t264 : #t263;
+    core::double* v7 = let final core::String* #t266 = "x" in let final core::double* #t267 = super.{self::Base::[]}(#t266).{core::double::+}(self::getInt()) in let final void #t268 = super.{self::Base::[]=}(#t266, #t267) in #t267;
+    core::double* v8 = let final core::String* #t269 = "x" in let final core::double* #t270 = super.{self::Base::[]}(#t269).{core::double::+}(self::getNum()) in let final void #t271 = super.{self::Base::[]=}(#t269, #t270) in #t270;
+    core::double* v9 = let final core::String* #t272 = "x" in let final core::double* #t273 = super.{self::Base::[]}(#t272).{core::double::+}(self::getDouble()) in let final void #t274 = super.{self::Base::[]=}(#t272, #t273) in #t273;
+    core::double* v10 = let final core::String* #t275 = "x" in let final core::double* #t276 = super.{self::Base::[]}(#t275).{core::double::+}(1) in let final void #t277 = super.{self::Base::[]=}(#t275, #t276) in #t276;
+    core::double* v11 = let final core::String* #t278 = "x" in let final core::double* #t279 = super.{self::Base::[]}(#t278) in let final void #t280 = super.{self::Base::[]=}(#t278, #t279.{core::double::+}(1)) in #t279;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
index f290054..ccccceb 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart
@@ -26,31 +26,31 @@
 
   void test() {
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
     this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    --this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
-    var /*@type=B*/ v1 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 = this /*@target=Test::[]=*/ [
-        /*@typeArgs=dynamic*/ f()] &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 =
-        --this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()];
-    var /*@type=B*/ v7 =
-        this /*@target=Test::[]=*/ [/*@typeArgs=dynamic*/ f()]--;
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    --this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
+    var /*@ type=B* */ v1 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 = this /*@target=Test::[]=*/ [
+        /*@ typeArgs=dynamic */ f()] &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 =
+        --this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()];
+    var /*@ type=B* */ v7 =
+        this /*@target=Test::[]=*/ [/*@ typeArgs=dynamic */ f()]--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect
index ca8e893..8563b64 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
     this.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = self::f<dynamic>() in this.[](#t1).==(null) ? let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2 : null;
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = this.[](#t30) in let final dynamic #t32 = this.[]=(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.transformed.expect
index ca8e893..8563b64 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.legacy.transformed.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
     this.[]=(self::f<dynamic>(), self::f<dynamic>());
     let final dynamic #t1 = self::f<dynamic>() in this.[](#t1).==(null) ? let final dynamic #t2 = self::f<dynamic>() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2 : null;
@@ -54,6 +54,6 @@
     dynamic v7 = let final dynamic #t30 = self::f<dynamic>() in let final dynamic #t31 = this.[](#t30) in let final dynamic #t32 = this.[]=(#t30, #t31.-(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
index b6e46f4..9f0fa38 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.outline.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     ;
-  operator []=(self::Index i, self::B v) → void
+  operator []=(self::Index* i, self::B* v) → void
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
index 7c0f229..036a9c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index, this.{self::Test::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index, this.{self::Test::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index, this.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index, this.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::A v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::C v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
+    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index*, this.{self::Test::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index*, this.{self::Test::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index*, this.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index*, this.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::A* v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A* #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B* #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::C* v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C* #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B* #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index*) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index*, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
index 7c0f229..036a9c0 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this.dart.strong.transformed.expect
@@ -3,57 +3,57 @@
 import "dart:core" as core;
 
 class Index extends core::Object {
-  synthetic constructor •() → self::Index
+  synthetic constructor •() → self::Index*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  operator [](self::Index i) → self::B
+  operator [](self::Index* i) → self::B*
     return null;
-  operator []=(self::Index i, self::B v) → void {}
+  operator []=(self::Index* i, self::B* v) → void {}
   method test() → void {
-    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index, self::f<self::B>());
-    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index).{core::Object::==}(null) ?{self::B} let final self::B #t2 = self::f<self::B>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index, #t2) in #t2 : null;
-    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index, this.{self::Test::[]}(#t4 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B);
-    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index, this.{self::Test::[]}(#t5 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B));
-    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index, this.{self::Test::[]}(#t6 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A));
-    let final dynamic #t7 = self::f<dynamic>() in let final self::B #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index, #t8) in #t8;
-    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index, this.{self::Test::[]}(#t10 as{TypeError} self::Index).{self::B::-}(1));
-    self::B v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B #t12 = self::f<self::B>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index, #t12) in #t12;
-    self::B v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index) in #t15.{core::Object::==}(null) ?{self::B} let final self::B #t16 = self::f<self::B>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index, #t16) in #t16 : #t15;
-    self::A v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index).{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index, #t19) in #t19;
-    self::B v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index).{self::B::*}(self::f<dynamic>() as{TypeError} self::B) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index, #t22) in #t22;
-    self::C v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index).{self::B::&}(self::f<dynamic>() as{TypeError} self::A) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index, #t25) in #t25;
-    self::B v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index).{self::B::-}(1) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index, #t28) in #t28;
-    self::B v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index, #t31.{self::B::-}(1)) in #t31;
+    this.{self::Test::[]=}(self::f<dynamic>() as{TypeError} self::Index*, self::f<self::B*>());
+    let final dynamic #t1 = self::f<dynamic>() in this.{self::Test::[]}(#t1 as{TypeError} self::Index*).{core::Object::==}(null) ?{self::B*} let final self::B* #t2 = self::f<self::B*>() in let final void #t3 = this.{self::Test::[]=}(#t1 as{TypeError} self::Index*, #t2) in #t2 : null;
+    let final dynamic #t4 = self::f<dynamic>() in this.{self::Test::[]=}(#t4 as{TypeError} self::Index*, this.{self::Test::[]}(#t4 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*);
+    let final dynamic #t5 = self::f<dynamic>() in this.{self::Test::[]=}(#t5 as{TypeError} self::Index*, this.{self::Test::[]}(#t5 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*));
+    let final dynamic #t6 = self::f<dynamic>() in this.{self::Test::[]=}(#t6 as{TypeError} self::Index*, this.{self::Test::[]}(#t6 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*));
+    let final dynamic #t7 = self::f<dynamic>() in let final self::B* #t8 = this.{self::Test::[]}(#t7 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t9 = this.{self::Test::[]=}(#t7 as{TypeError} self::Index*, #t8) in #t8;
+    let final dynamic #t10 = self::f<dynamic>() in this.{self::Test::[]=}(#t10 as{TypeError} self::Index*, this.{self::Test::[]}(#t10 as{TypeError} self::Index*).{self::B::-}(1));
+    self::B* v1 = let final dynamic #t11 = self::f<dynamic>() in let final self::B* #t12 = self::f<self::B*>() in let final void #t13 = this.{self::Test::[]=}(#t11 as{TypeError} self::Index*, #t12) in #t12;
+    self::B* v2 = let final dynamic #t14 = self::f<dynamic>() in let final self::B* #t15 = this.{self::Test::[]}(#t14 as{TypeError} self::Index*) in #t15.{core::Object::==}(null) ?{self::B*} let final self::B* #t16 = self::f<self::B*>() in let final void #t17 = this.{self::Test::[]=}(#t14 as{TypeError} self::Index*, #t16) in #t16 : #t15;
+    self::A* v3 = let final dynamic #t18 = self::f<dynamic>() in let final self::A* #t19 = this.{self::Test::[]}(#t18 as{TypeError} self::Index*).{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B* in let final void #t20 = this.{self::Test::[]=}(#t18 as{TypeError} self::Index*, #t19) in #t19;
+    self::B* v4 = let final dynamic #t21 = self::f<dynamic>() in let final self::B* #t22 = this.{self::Test::[]}(#t21 as{TypeError} self::Index*).{self::B::*}(self::f<dynamic>() as{TypeError} self::B*) in let final void #t23 = this.{self::Test::[]=}(#t21 as{TypeError} self::Index*, #t22) in #t22;
+    self::C* v5 = let final dynamic #t24 = self::f<dynamic>() in let final self::C* #t25 = this.{self::Test::[]}(#t24 as{TypeError} self::Index*).{self::B::&}(self::f<dynamic>() as{TypeError} self::A*) in let final void #t26 = this.{self::Test::[]=}(#t24 as{TypeError} self::Index*, #t25) in #t25;
+    self::B* v6 = let final dynamic #t27 = self::f<dynamic>() in let final self::B* #t28 = this.{self::Test::[]}(#t27 as{TypeError} self::Index*).{self::B::-}(1) in let final void #t29 = this.{self::Test::[]=}(#t27 as{TypeError} self::Index*, #t28) in #t28;
+    self::B* v7 = let final dynamic #t30 = self::f<dynamic>() in let final self::B* #t31 = this.{self::Test::[]}(#t30 as{TypeError} self::Index*) in let final void #t32 = this.{self::Test::[]=}(#t30 as{TypeError} self::Index*, #t31.{self::B::-}(1)) in #t31;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
index cc9c38b..4656c2b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart
@@ -14,14 +14,14 @@
   void operator []=(String s, int v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test1::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test1::[]=*/ ['x'] = getNum();
-    var /*@type=int*/ v4 = this /*@target=Test1::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test1::[]=*/ ['x'] ??= getNum();
-    var /*@type=int*/ v7 = this /*@target=Test1::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test1::[]=*/ ['x'] += getNum();
-    var /*@type=int*/ v10 = ++this /*@target=Test1::[]=*/ ['x'];
-    var /*@type=int*/ v11 = this /*@target=Test1::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test1::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test1::[]=*/ ['x'] = getNum();
+    var /*@ type=int* */ v4 = this /*@target=Test1::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test1::[]=*/ ['x'] ??= getNum();
+    var /*@ type=int* */ v7 = this /*@target=Test1::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test1::[]=*/ ['x'] += getNum();
+    var /*@ type=int* */ v10 = ++this /*@target=Test1::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = this /*@target=Test1::[]=*/ ['x']++;
   }
 }
 
@@ -30,17 +30,17 @@
   void operator []=(String s, num v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test2::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test2::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test2::[]=*/ ['x'] = getDouble();
-    var /*@type=int*/ v4 = this /*@target=Test2::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test2::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = this /*@target=Test2::[]=*/ ['x'] ??= getDouble();
-    var /*@type=int*/ v7 = this /*@target=Test2::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test2::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = this /*@target=Test2::[]=*/ ['x'] += getDouble();
-    var /*@type=int*/ v10 = ++this /*@target=Test2::[]=*/ ['x'];
-    var /*@type=int*/ v11 = this /*@target=Test2::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test2::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test2::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test2::[]=*/ ['x'] = getDouble();
+    var /*@ type=int* */ v4 = this /*@target=Test2::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test2::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = this /*@target=Test2::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=int* */ v7 = this /*@target=Test2::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test2::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = this /*@target=Test2::[]=*/ ['x'] += getDouble();
+    var /*@ type=int* */ v10 = ++this /*@target=Test2::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = this /*@target=Test2::[]=*/ ['x']++;
   }
 }
 
@@ -49,15 +49,15 @@
   void operator []=(String s, double v);
 
   void test() {
-    var /*@type=num*/ v2 = this /*@target=Test3::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test3::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = this /*@target=Test3::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = this /*@target=Test3::[]=*/ ['x'] ??= getDouble();
-    var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test3::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = this /*@target=Test3::[]=*/ ['x'] += getDouble();
-    var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
-    var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = this /*@target=Test3::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test3::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = this /*@target=Test3::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = this /*@target=Test3::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=int* */ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test3::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = this /*@target=Test3::[]=*/ ['x'] += getDouble();
+    var /*@ type=int* */ v10 = ++this /*@target=Test3::[]=*/ ['x'];
+    var /*@ type=int* */ v11 = this /*@target=Test3::[]=*/ ['x']++;
   }
 }
 
@@ -66,14 +66,14 @@
   void operator []=(String s, int v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test4::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test4::[]=*/ ['x'] = getNum();
-    var /*@type=num*/ v4 = this /*@target=Test4::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test4::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v7 = this /*@target=Test4::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test4::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v10 = ++this /*@target=Test4::[]=*/ ['x'];
-    var /*@type=num*/ v11 = this /*@target=Test4::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test4::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test4::[]=*/ ['x'] = getNum();
+    var /*@ type=num* */ v4 = this /*@target=Test4::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test4::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v7 = this /*@target=Test4::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test4::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v10 = ++this /*@target=Test4::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = this /*@target=Test4::[]=*/ ['x']++;
   }
 }
 
@@ -82,17 +82,17 @@
   void operator []=(String s, num v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test5::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test5::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test5::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v4 = this /*@target=Test5::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test5::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = this /*@target=Test5::[]=*/ ['x'] ??= getDouble();
-    var /*@type=num*/ v7 = this /*@target=Test5::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test5::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v9 = this /*@target=Test5::[]=*/ ['x'] += getDouble();
-    var /*@type=num*/ v10 = ++this /*@target=Test5::[]=*/ ['x'];
-    var /*@type=num*/ v11 = this /*@target=Test5::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test5::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test5::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test5::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v4 = this /*@target=Test5::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test5::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = this /*@target=Test5::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=num* */ v7 = this /*@target=Test5::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test5::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v9 = this /*@target=Test5::[]=*/ ['x'] += getDouble();
+    var /*@ type=num* */ v10 = ++this /*@target=Test5::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = this /*@target=Test5::[]=*/ ['x']++;
   }
 }
 
@@ -101,15 +101,15 @@
   void operator []=(String s, double v);
 
   void test() {
-    var /*@type=num*/ v2 = this /*@target=Test6::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test6::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = this /*@target=Test6::[]=*/ ['x'] ??= getNum();
-    var /*@type=num*/ v6 = this /*@target=Test6::[]=*/ ['x'] ??= getDouble();
-    var /*@type=num*/ v7 = this /*@target=Test6::[]=*/ ['x'] += getInt();
-    var /*@type=num*/ v8 = this /*@target=Test6::[]=*/ ['x'] += getNum();
-    var /*@type=num*/ v9 = this /*@target=Test6::[]=*/ ['x'] += getDouble();
-    var /*@type=num*/ v10 = ++this /*@target=Test6::[]=*/ ['x'];
-    var /*@type=num*/ v11 = this /*@target=Test6::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = this /*@target=Test6::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test6::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = this /*@target=Test6::[]=*/ ['x'] ??= getNum();
+    var /*@ type=num* */ v6 = this /*@target=Test6::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=num* */ v7 = this /*@target=Test6::[]=*/ ['x'] += getInt();
+    var /*@ type=num* */ v8 = this /*@target=Test6::[]=*/ ['x'] += getNum();
+    var /*@ type=num* */ v9 = this /*@target=Test6::[]=*/ ['x'] += getDouble();
+    var /*@ type=num* */ v10 = ++this /*@target=Test6::[]=*/ ['x'];
+    var /*@ type=num* */ v11 = this /*@target=Test6::[]=*/ ['x']++;
   }
 }
 
@@ -118,14 +118,14 @@
   void operator []=(String s, int v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test7::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test7::[]=*/ ['x'] = getNum();
-    var /*@type=num*/ v4 = this /*@target=Test7::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test7::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
-    var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test7::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test7::[]=*/ ['x'] = getNum();
+    var /*@ type=num* */ v4 = this /*@target=Test7::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test7::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v10 = ++this /*@target=Test7::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = this /*@target=Test7::[]=*/ ['x']++;
   }
 }
 
@@ -134,17 +134,17 @@
   void operator []=(String s, num v);
 
   void test() {
-    var /*@type=int*/ v1 = this /*@target=Test8::[]=*/ ['x'] = getInt();
-    var /*@type=num*/ v2 = this /*@target=Test8::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test8::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v4 = this /*@target=Test8::[]=*/ ['x'] ??= getInt();
-    var /*@type=num*/ v5 = this /*@target=Test8::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v6 = this /*@target=Test8::[]=*/ ['x'] ??= getDouble();
-    var /*@type=double*/ v7 = this /*@target=Test8::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = this /*@target=Test8::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = this /*@target=Test8::[]=*/ ['x'] += getDouble();
-    var /*@type=double*/ v10 = ++this /*@target=Test8::[]=*/ ['x'];
-    var /*@type=double*/ v11 = this /*@target=Test8::[]=*/ ['x']++;
+    var /*@ type=int* */ v1 = this /*@target=Test8::[]=*/ ['x'] = getInt();
+    var /*@ type=num* */ v2 = this /*@target=Test8::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test8::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v4 = this /*@target=Test8::[]=*/ ['x'] ??= getInt();
+    var /*@ type=num* */ v5 = this /*@target=Test8::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v6 = this /*@target=Test8::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=double* */ v7 = this /*@target=Test8::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = this /*@target=Test8::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = this /*@target=Test8::[]=*/ ['x'] += getDouble();
+    var /*@ type=double* */ v10 = ++this /*@target=Test8::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = this /*@target=Test8::[]=*/ ['x']++;
   }
 }
 
@@ -153,15 +153,15 @@
   void operator []=(String s, double v);
 
   void test() {
-    var /*@type=num*/ v2 = this /*@target=Test9::[]=*/ ['x'] = getNum();
-    var /*@type=double*/ v3 = this /*@target=Test9::[]=*/ ['x'] = getDouble();
-    var /*@type=num*/ v5 = this /*@target=Test9::[]=*/ ['x'] ??= getNum();
-    var /*@type=double*/ v6 = this /*@target=Test9::[]=*/ ['x'] ??= getDouble();
-    var /*@type=double*/ v7 = this /*@target=Test9::[]=*/ ['x'] += getInt();
-    var /*@type=double*/ v8 = this /*@target=Test9::[]=*/ ['x'] += getNum();
-    var /*@type=double*/ v9 = this /*@target=Test9::[]=*/ ['x'] += getDouble();
-    var /*@type=double*/ v10 = ++this /*@target=Test9::[]=*/ ['x'];
-    var /*@type=double*/ v11 = this /*@target=Test9::[]=*/ ['x']++;
+    var /*@ type=num* */ v2 = this /*@target=Test9::[]=*/ ['x'] = getNum();
+    var /*@ type=double* */ v3 = this /*@target=Test9::[]=*/ ['x'] = getDouble();
+    var /*@ type=num* */ v5 = this /*@target=Test9::[]=*/ ['x'] ??= getNum();
+    var /*@ type=double* */ v6 = this /*@target=Test9::[]=*/ ['x'] ??= getDouble();
+    var /*@ type=double* */ v7 = this /*@target=Test9::[]=*/ ['x'] += getInt();
+    var /*@ type=double* */ v8 = this /*@target=Test9::[]=*/ ['x'] += getNum();
+    var /*@ type=double* */ v9 = this /*@target=Test9::[]=*/ ['x'] += getDouble();
+    var /*@ type=double* */ v10 = ++this /*@target=Test9::[]=*/ ['x'];
+    var /*@ type=double* */ v11 = this /*@target=Test9::[]=*/ ['x']++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect
index 3b475c2..0c652b5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t1 = "x" in let final dynamic #t2 = self::getInt() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2;
     dynamic v2 = let final dynamic #t4 = "x" in let final dynamic #t5 = self::getNum() in let final dynamic #t6 = this.[]=(#t4, #t5) in #t5;
@@ -20,11 +20,11 @@
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t27 = "x" in let final dynamic #t28 = self::getInt() in let final dynamic #t29 = this.[]=(#t27, #t28) in #t28;
     dynamic v2 = let final dynamic #t30 = "x" in let final dynamic #t31 = self::getNum() in let final dynamic #t32 = this.[]=(#t30, #t31) in #t31;
@@ -40,11 +40,11 @@
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t63 = "x" in let final dynamic #t64 = self::getNum() in let final dynamic #t65 = this.[]=(#t63, #t64) in #t64;
     dynamic v3 = let final dynamic #t66 = "x" in let final dynamic #t67 = self::getDouble() in let final dynamic #t68 = this.[]=(#t66, #t67) in #t67;
@@ -58,11 +58,11 @@
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → self::Test4
+  synthetic constructor •() → self::Test4*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t92 = "x" in let final dynamic #t93 = self::getInt() in let final dynamic #t94 = this.[]=(#t92, #t93) in #t93;
     dynamic v2 = let final dynamic #t95 = "x" in let final dynamic #t96 = self::getNum() in let final dynamic #t97 = this.[]=(#t95, #t96) in #t96;
@@ -75,11 +75,11 @@
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → self::Test5
+  synthetic constructor •() → self::Test5*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t118 = "x" in let final dynamic #t119 = self::getInt() in let final dynamic #t120 = this.[]=(#t118, #t119) in #t119;
     dynamic v2 = let final dynamic #t121 = "x" in let final dynamic #t122 = self::getNum() in let final dynamic #t123 = this.[]=(#t121, #t122) in #t122;
@@ -95,11 +95,11 @@
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → self::Test6
+  synthetic constructor •() → self::Test6*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t154 = "x" in let final dynamic #t155 = self::getNum() in let final dynamic #t156 = this.[]=(#t154, #t155) in #t155;
     dynamic v3 = let final dynamic #t157 = "x" in let final dynamic #t158 = self::getDouble() in let final dynamic #t159 = this.[]=(#t157, #t158) in #t158;
@@ -113,11 +113,11 @@
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → self::Test7
+  synthetic constructor •() → self::Test7*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t183 = "x" in let final dynamic #t184 = self::getInt() in let final dynamic #t185 = this.[]=(#t183, #t184) in #t184;
     dynamic v2 = let final dynamic #t186 = "x" in let final dynamic #t187 = self::getNum() in let final dynamic #t188 = this.[]=(#t186, #t187) in #t187;
@@ -130,11 +130,11 @@
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → self::Test8
+  synthetic constructor •() → self::Test8*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t209 = "x" in let final dynamic #t210 = self::getInt() in let final dynamic #t211 = this.[]=(#t209, #t210) in #t210;
     dynamic v2 = let final dynamic #t212 = "x" in let final dynamic #t213 = self::getNum() in let final dynamic #t214 = this.[]=(#t212, #t213) in #t213;
@@ -150,11 +150,11 @@
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → self::Test9
+  synthetic constructor •() → self::Test9*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t245 = "x" in let final dynamic #t246 = self::getNum() in let final dynamic #t247 = this.[]=(#t245, #t246) in #t246;
     dynamic v3 = let final dynamic #t248 = "x" in let final dynamic #t249 = self::getDouble() in let final dynamic #t250 = this.[]=(#t248, #t249) in #t249;
@@ -167,10 +167,10 @@
     dynamic v11 = let final dynamic #t271 = "x" in let final dynamic #t272 = this.[](#t271) in let final dynamic #t273 = this.[]=(#t271, #t272.+(1)) in #t272;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.transformed.expect
index 3b475c2..0c652b5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t1 = "x" in let final dynamic #t2 = self::getInt() in let final dynamic #t3 = this.[]=(#t1, #t2) in #t2;
     dynamic v2 = let final dynamic #t4 = "x" in let final dynamic #t5 = self::getNum() in let final dynamic #t6 = this.[]=(#t4, #t5) in #t5;
@@ -20,11 +20,11 @@
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t27 = "x" in let final dynamic #t28 = self::getInt() in let final dynamic #t29 = this.[]=(#t27, #t28) in #t28;
     dynamic v2 = let final dynamic #t30 = "x" in let final dynamic #t31 = self::getNum() in let final dynamic #t32 = this.[]=(#t30, #t31) in #t31;
@@ -40,11 +40,11 @@
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t63 = "x" in let final dynamic #t64 = self::getNum() in let final dynamic #t65 = this.[]=(#t63, #t64) in #t64;
     dynamic v3 = let final dynamic #t66 = "x" in let final dynamic #t67 = self::getDouble() in let final dynamic #t68 = this.[]=(#t66, #t67) in #t67;
@@ -58,11 +58,11 @@
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → self::Test4
+  synthetic constructor •() → self::Test4*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t92 = "x" in let final dynamic #t93 = self::getInt() in let final dynamic #t94 = this.[]=(#t92, #t93) in #t93;
     dynamic v2 = let final dynamic #t95 = "x" in let final dynamic #t96 = self::getNum() in let final dynamic #t97 = this.[]=(#t95, #t96) in #t96;
@@ -75,11 +75,11 @@
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → self::Test5
+  synthetic constructor •() → self::Test5*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t118 = "x" in let final dynamic #t119 = self::getInt() in let final dynamic #t120 = this.[]=(#t118, #t119) in #t119;
     dynamic v2 = let final dynamic #t121 = "x" in let final dynamic #t122 = self::getNum() in let final dynamic #t123 = this.[]=(#t121, #t122) in #t122;
@@ -95,11 +95,11 @@
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → self::Test6
+  synthetic constructor •() → self::Test6*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t154 = "x" in let final dynamic #t155 = self::getNum() in let final dynamic #t156 = this.[]=(#t154, #t155) in #t155;
     dynamic v3 = let final dynamic #t157 = "x" in let final dynamic #t158 = self::getDouble() in let final dynamic #t159 = this.[]=(#t157, #t158) in #t158;
@@ -113,11 +113,11 @@
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → self::Test7
+  synthetic constructor •() → self::Test7*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t183 = "x" in let final dynamic #t184 = self::getInt() in let final dynamic #t185 = this.[]=(#t183, #t184) in #t184;
     dynamic v2 = let final dynamic #t186 = "x" in let final dynamic #t187 = self::getNum() in let final dynamic #t188 = this.[]=(#t186, #t187) in #t187;
@@ -130,11 +130,11 @@
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → self::Test8
+  synthetic constructor •() → self::Test8*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void {
     dynamic v1 = let final dynamic #t209 = "x" in let final dynamic #t210 = self::getInt() in let final dynamic #t211 = this.[]=(#t209, #t210) in #t210;
     dynamic v2 = let final dynamic #t212 = "x" in let final dynamic #t213 = self::getNum() in let final dynamic #t214 = this.[]=(#t212, #t213) in #t213;
@@ -150,11 +150,11 @@
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → self::Test9
+  synthetic constructor •() → self::Test9*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void {
     dynamic v2 = let final dynamic #t245 = "x" in let final dynamic #t246 = self::getNum() in let final dynamic #t247 = this.[]=(#t245, #t246) in #t246;
     dynamic v3 = let final dynamic #t248 = "x" in let final dynamic #t249 = self::getDouble() in let final dynamic #t250 = this.[]=(#t248, #t249) in #t249;
@@ -167,10 +167,10 @@
     dynamic v11 = let final dynamic #t271 = "x" in let final dynamic #t272 = this.[](#t271) in let final dynamic #t273 = this.[]=(#t271, #t272.+(1)) in #t272;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.outline.expect
index e48e9e6..8251adc 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.outline.expect
@@ -3,82 +3,82 @@
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void
     ;
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void
     ;
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::int*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void
     ;
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → self::Test4
+  synthetic constructor •() → self::Test4*
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void
     ;
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → self::Test5
+  synthetic constructor •() → self::Test5*
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void
     ;
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → self::Test6
+  synthetic constructor •() → self::Test6*
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::num*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void
     ;
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → self::Test7
+  synthetic constructor •() → self::Test7*
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::int v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::int* v) → void;
   method test() → void
     ;
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → self::Test8
+  synthetic constructor •() → self::Test8*
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::num v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::num* v) → void;
   method test() → void
     ;
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → self::Test9
+  synthetic constructor •() → self::Test9*
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::double v) → void;
+  abstract operator [](core::String* s) → core::double*;
+  abstract operator []=(core::String* s, core::double* v) → void;
   method test() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
index 135f152..2baa260 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart.strong.expect
@@ -2,234 +2,234 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 // Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
-//                                                              ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
-//                             ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//     var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
-//                                                              ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
+//     var /*@ type=int* */ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
 //                                                                 ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
-//                                                                 ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:32: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//     var /*@ type=int* */ v10 = ++this /*@target=Test3::[]=*/ ['x'];
 //                                ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//     var /*@ type=int* */ v11 = this /*@target=Test3::[]=*/ ['x']++;
 //                                                                 ^
 //
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
+//                                                                    ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:35: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v10 = ++this /*@target=Test7::[]=*/ ['x'];
+//                                   ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//     var /*@ type=double* */ v11 = this /*@target=Test7::[]=*/ ['x']++;
+//                                                                    ^
+//
 import self as self;
 import "dart:core" as core;
 
 abstract class Test1 extends core::Object {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::int v) → void;
+  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) 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) in #t5;
-    core::int v4 = let final core::String #t7 = "x" in let final core::int #t8 = this.{self::Test1::[]}(#t7) in #t8.{core::num::==}(null) ?{core::int} let final core::int #t9 = self::getInt() in let final void #t10 = this.{self::Test1::[]=}(#t7, #t9) in #t9 : #t8;
-    core::num v5 = let final core::String #t11 = "x" in let final core::int #t12 = this.{self::Test1::[]}(#t11) in #t12.{core::num::==}(null) ?{core::num} let final core::num #t13 = self::getNum() as{TypeError} core::int in let final void #t14 = this.{self::Test1::[]=}(#t11, #t13) in #t13 : #t12;
-    core::int v7 = let final core::String #t15 = "x" in let final core::int #t16 = this.{self::Test1::[]}(#t15).{core::num::+}(self::getInt()) in let final void #t17 = this.{self::Test1::[]=}(#t15, #t16) in #t16;
-    core::num v8 = let final core::String #t18 = "x" in let final core::num #t19 = this.{self::Test1::[]}(#t18).{core::num::+}(self::getNum()) as{TypeError} core::int in let final void #t20 = this.{self::Test1::[]=}(#t18, #t19) in #t19;
-    core::int v10 = let final core::String #t21 = "x" in let final core::int #t22 = this.{self::Test1::[]}(#t21).{core::num::+}(1) in let final void #t23 = this.{self::Test1::[]=}(#t21, #t22) in #t22;
-    core::int v11 = let final core::String #t24 = "x" in let final core::int #t25 = this.{self::Test1::[]}(#t24) in let final void #t26 = this.{self::Test1::[]=}(#t24, #t25.{core::num::+}(1)) in #t25;
+    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) 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) in #t5;
+    core::int* v4 = let final core::String* #t7 = "x" in let final core::int* #t8 = this.{self::Test1::[]}(#t7) in #t8.{core::num::==}(null) ?{core::int*} let final core::int* #t9 = self::getInt() in let final void #t10 = this.{self::Test1::[]=}(#t7, #t9) in #t9 : #t8;
+    core::num* v5 = let final core::String* #t11 = "x" in let final core::int* #t12 = this.{self::Test1::[]}(#t11) in #t12.{core::num::==}(null) ?{core::num*} let final core::num* #t13 = self::getNum() as{TypeError} core::int* in let final void #t14 = this.{self::Test1::[]=}(#t11, #t13) in #t13 : #t12;
+    core::int* v7 = let final core::String* #t15 = "x" in let final core::int* #t16 = this.{self::Test1::[]}(#t15).{core::num::+}(self::getInt()) in let final void #t17 = this.{self::Test1::[]=}(#t15, #t16) in #t16;
+    core::num* v8 = let final core::String* #t18 = "x" in let final core::num* #t19 = this.{self::Test1::[]}(#t18).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t20 = this.{self::Test1::[]=}(#t18, #t19) in #t19;
+    core::int* v10 = let final core::String* #t21 = "x" in let final core::int* #t22 = this.{self::Test1::[]}(#t21).{core::num::+}(1) in let final void #t23 = this.{self::Test1::[]=}(#t21, #t22) in #t22;
+    core::int* v11 = let final core::String* #t24 = "x" in let final core::int* #t25 = this.{self::Test1::[]}(#t24) in let final void #t26 = this.{self::Test1::[]=}(#t24, #t25.{core::num::+}(1)) in #t25;
   }
 }
 abstract class Test2 extends core::Object {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::num v) → void;
+  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) 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) 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) in #t34;
-    core::int v4 = let final core::String #t36 = "x" in let final core::int #t37 = this.{self::Test2::[]}(#t36) in #t37.{core::num::==}(null) ?{core::int} let final core::int #t38 = self::getInt() in let final void #t39 = this.{self::Test2::[]=}(#t36, #t38) in #t38 : #t37;
-    core::num v5 = let final core::String #t40 = "x" in let final core::int #t41 = this.{self::Test2::[]}(#t40) in #t41.{core::num::==}(null) ?{core::num} let final core::num #t42 = self::getNum() in let final void #t43 = this.{self::Test2::[]=}(#t40, #t42) in #t42 : #t41;
-    core::num v6 = let final core::String #t44 = "x" in let final core::int #t45 = this.{self::Test2::[]}(#t44) in #t45.{core::num::==}(null) ?{core::num} let final core::double #t46 = self::getDouble() in let final void #t47 = this.{self::Test2::[]=}(#t44, #t46) in #t46 : #t45;
-    core::int v7 = let final core::String #t48 = "x" in let final core::int #t49 = this.{self::Test2::[]}(#t48).{core::num::+}(self::getInt()) in let final void #t50 = this.{self::Test2::[]=}(#t48, #t49) in #t49;
-    core::num v8 = let final core::String #t51 = "x" in let final core::num #t52 = this.{self::Test2::[]}(#t51).{core::num::+}(self::getNum()) in let final void #t53 = this.{self::Test2::[]=}(#t51, #t52) in #t52;
-    core::double v9 = let final core::String #t54 = "x" in let final core::double #t55 = this.{self::Test2::[]}(#t54).{core::num::+}(self::getDouble()) in let final void #t56 = this.{self::Test2::[]=}(#t54, #t55) in #t55;
-    core::int v10 = let final core::String #t57 = "x" in let final core::int #t58 = this.{self::Test2::[]}(#t57).{core::num::+}(1) in let final void #t59 = this.{self::Test2::[]=}(#t57, #t58) in #t58;
-    core::int v11 = let final core::String #t60 = "x" in let final core::int #t61 = this.{self::Test2::[]}(#t60) in let final void #t62 = this.{self::Test2::[]=}(#t60, #t61.{core::num::+}(1)) in #t61;
+    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) 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) 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) in #t34;
+    core::int* v4 = let final core::String* #t36 = "x" in let final core::int* #t37 = this.{self::Test2::[]}(#t36) in #t37.{core::num::==}(null) ?{core::int*} let final core::int* #t38 = self::getInt() in let final void #t39 = this.{self::Test2::[]=}(#t36, #t38) in #t38 : #t37;
+    core::num* v5 = let final core::String* #t40 = "x" in let final core::int* #t41 = this.{self::Test2::[]}(#t40) in #t41.{core::num::==}(null) ?{core::num*} let final core::num* #t42 = self::getNum() in let final void #t43 = this.{self::Test2::[]=}(#t40, #t42) in #t42 : #t41;
+    core::num* v6 = let final core::String* #t44 = "x" in let final core::int* #t45 = this.{self::Test2::[]}(#t44) in #t45.{core::num::==}(null) ?{core::num*} let final core::double* #t46 = self::getDouble() in let final void #t47 = this.{self::Test2::[]=}(#t44, #t46) in #t46 : #t45;
+    core::int* v7 = let final core::String* #t48 = "x" in let final core::int* #t49 = this.{self::Test2::[]}(#t48).{core::num::+}(self::getInt()) in let final void #t50 = this.{self::Test2::[]=}(#t48, #t49) in #t49;
+    core::num* v8 = let final core::String* #t51 = "x" in let final core::num* #t52 = this.{self::Test2::[]}(#t51).{core::num::+}(self::getNum()) in let final void #t53 = this.{self::Test2::[]=}(#t51, #t52) in #t52;
+    core::double* v9 = let final core::String* #t54 = "x" in let final core::double* #t55 = this.{self::Test2::[]}(#t54).{core::num::+}(self::getDouble()) in let final void #t56 = this.{self::Test2::[]=}(#t54, #t55) in #t55;
+    core::int* v10 = let final core::String* #t57 = "x" in let final core::int* #t58 = this.{self::Test2::[]}(#t57).{core::num::+}(1) in let final void #t59 = this.{self::Test2::[]=}(#t57, #t58) in #t58;
+    core::int* v11 = let final core::String* #t60 = "x" in let final core::int* #t61 = this.{self::Test2::[]}(#t60) in let final void #t62 = this.{self::Test2::[]=}(#t60, #t61.{core::num::+}(1)) in #t61;
   }
 }
 abstract class Test3 extends core::Object {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::int;
-  abstract operator []=(core::String s, core::double v) → void;
+  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) 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) in #t67;
-    core::num v5 = let final core::String #t69 = "x" in let final core::int #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num} let final core::num #t71 = self::getNum() as{TypeError} core::double in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
-    core::num v6 = let final core::String #t73 = "x" in let final core::int #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num} let final core::double #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
-    core::int v7 = let final core::String #t77 = "x" in let final core::int #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    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) 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) in #t67;
+    core::num* v5 = let final core::String* #t69 = "x" in let final core::int* #t70 = this.{self::Test3::[]}(#t69) in #t70.{core::num::==}(null) ?{core::num*} let final core::num* #t71 = self::getNum() as{TypeError} core::double* in let final void #t72 = this.{self::Test3::[]=}(#t69, #t71) in #t71 : #t70;
+    core::num* v6 = let final core::String* #t73 = "x" in let final core::int* #t74 = this.{self::Test3::[]}(#t73) in #t74.{core::num::==}(null) ?{core::num*} let final core::double* #t75 = self::getDouble() in let final void #t76 = this.{self::Test3::[]=}(#t73, #t75) in #t75 : #t74;
+    core::int* v7 = let final core::String* #t77 = "x" in let final core::int* #t78 = let final<BottomType> #t79 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:56:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
-                                                             ^" in this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
-    core::num v8 = let final core::String #t81 = "x" in let final core::num #t82 = this.{self::Test3::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t83 = this.{self::Test3::[]=}(#t81, #t82) in #t82;
-    core::double v9 = let final core::String #t84 = "x" in let final core::double #t85 = this.{self::Test3::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
-    core::int v10 = let final core::String #t87 = "x" in let final core::int #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:29: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v7 = this /*@target=Test3::[]=*/ ['x'] += getInt();
+                                                                ^" in this.{self::Test3::[]}(#t77).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t80 = this.{self::Test3::[]=}(#t77, #t78) in #t78;
+    core::num* v8 = let final core::String* #t81 = "x" in let final core::num* #t82 = this.{self::Test3::[]}(#t81).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t83 = this.{self::Test3::[]=}(#t81, #t82) in #t82;
+    core::double* v9 = let final core::String* #t84 = "x" in let final core::double* #t85 = this.{self::Test3::[]}(#t84).{core::num::+}(self::getDouble()) in let final void #t86 = this.{self::Test3::[]=}(#t84, #t85) in #t85;
+    core::int* v10 = let final core::String* #t87 = "x" in let final core::int* #t88 = let final<BottomType> #t89 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:59:32: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v10 = ++this /*@target=Test3::[]=*/ ['x'];
-                            ^" in this.{self::Test3::[]}(#t87).{core::num::+}(1) as{TypeError} core::double in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
-    core::int v11 = let final core::String #t91 = "x" in let final core::int #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:62: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+    var /*@ type=int* */ v10 = ++this /*@target=Test3::[]=*/ ['x'];
+                               ^" in this.{self::Test3::[]}(#t87).{core::num::+}(1) as{TypeError} core::double* in let final void #t90 = this.{self::Test3::[]=}(#t87, #t88) in #t88;
+    core::int* v11 = let final core::String* #t91 = "x" in let final core::int* #t92 = this.{self::Test3::[]}(#t91) in let final void #t93 = this.{self::Test3::[]=}(#t91, let final<BottomType> #t94 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:60:65: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-    var /*@type=int*/ v11 = this /*@target=Test3::[]=*/ ['x']++;
-                                                             ^" in #t92.{core::num::+}(1) as{TypeError} core::double) in #t92;
+    var /*@ type=int* */ v11 = this /*@target=Test3::[]=*/ ['x']++;
+                                                                ^" in #t92.{core::num::+}(1) as{TypeError} core::double*) in #t92;
   }
 }
 abstract class Test4 extends core::Object {
-  synthetic constructor •() → self::Test4
+  synthetic constructor •() → self::Test4*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::int v) → void;
+  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 #t95 = "x" in let final core::int #t96 = self::getInt() in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96) in #t96;
-    core::num v2 = let final core::String #t98 = "x" in let final core::num #t99 = self::getNum() as{TypeError} core::int in let final void #t100 = this.{self::Test4::[]=}(#t98, #t99) in #t99;
-    core::num v4 = let final core::String #t101 = "x" in let final core::num #t102 = this.{self::Test4::[]}(#t101) in #t102.{core::num::==}(null) ?{core::num} let final core::int #t103 = self::getInt() in let final void #t104 = this.{self::Test4::[]=}(#t101, #t103) in #t103 : #t102;
-    core::num v5 = let final core::String #t105 = "x" in let final core::num #t106 = this.{self::Test4::[]}(#t105) in #t106.{core::num::==}(null) ?{core::num} let final core::num #t107 = self::getNum() as{TypeError} core::int in let final void #t108 = this.{self::Test4::[]=}(#t105, #t107) in #t107 : #t106;
-    core::num v7 = let final core::String #t109 = "x" in let final core::num #t110 = this.{self::Test4::[]}(#t109).{core::num::+}(self::getInt()) as{TypeError} core::int in let final void #t111 = this.{self::Test4::[]=}(#t109, #t110) in #t110;
-    core::num v8 = let final core::String #t112 = "x" in let final core::num #t113 = this.{self::Test4::[]}(#t112).{core::num::+}(self::getNum()) as{TypeError} core::int in let final void #t114 = this.{self::Test4::[]=}(#t112, #t113) in #t113;
-    core::num v10 = let final core::String #t115 = "x" in let final core::num #t116 = this.{self::Test4::[]}(#t115).{core::num::+}(1) as{TypeError} core::int in let final void #t117 = this.{self::Test4::[]=}(#t115, #t116) in #t116;
-    core::num v11 = let final core::String #t118 = "x" in let final core::num #t119 = this.{self::Test4::[]}(#t118) in let final void #t120 = this.{self::Test4::[]=}(#t118, #t119.{core::num::+}(1) as{TypeError} core::int) in #t119;
+    core::int* v1 = let final core::String* #t95 = "x" in let final core::int* #t96 = self::getInt() in let final void #t97 = this.{self::Test4::[]=}(#t95, #t96) in #t96;
+    core::num* v2 = let final core::String* #t98 = "x" in let final core::num* #t99 = self::getNum() as{TypeError} core::int* in let final void #t100 = this.{self::Test4::[]=}(#t98, #t99) in #t99;
+    core::num* v4 = let final core::String* #t101 = "x" in let final core::num* #t102 = this.{self::Test4::[]}(#t101) in #t102.{core::num::==}(null) ?{core::num*} let final core::int* #t103 = self::getInt() in let final void #t104 = this.{self::Test4::[]=}(#t101, #t103) in #t103 : #t102;
+    core::num* v5 = let final core::String* #t105 = "x" in let final core::num* #t106 = this.{self::Test4::[]}(#t105) in #t106.{core::num::==}(null) ?{core::num*} let final core::num* #t107 = self::getNum() as{TypeError} core::int* in let final void #t108 = this.{self::Test4::[]=}(#t105, #t107) in #t107 : #t106;
+    core::num* v7 = let final core::String* #t109 = "x" in let final core::num* #t110 = this.{self::Test4::[]}(#t109).{core::num::+}(self::getInt()) as{TypeError} core::int* in let final void #t111 = this.{self::Test4::[]=}(#t109, #t110) in #t110;
+    core::num* v8 = let final core::String* #t112 = "x" in let final core::num* #t113 = this.{self::Test4::[]}(#t112).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t114 = this.{self::Test4::[]=}(#t112, #t113) in #t113;
+    core::num* v10 = let final core::String* #t115 = "x" in let final core::num* #t116 = this.{self::Test4::[]}(#t115).{core::num::+}(1) as{TypeError} core::int* in let final void #t117 = this.{self::Test4::[]=}(#t115, #t116) in #t116;
+    core::num* v11 = let final core::String* #t118 = "x" in let final core::num* #t119 = this.{self::Test4::[]}(#t118) in let final void #t120 = this.{self::Test4::[]=}(#t118, #t119.{core::num::+}(1) as{TypeError} core::int*) in #t119;
   }
 }
 abstract class Test5 extends core::Object {
-  synthetic constructor •() → self::Test5
+  synthetic constructor •() → self::Test5*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::num v) → void;
+  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 #t121 = "x" in let final core::int #t122 = self::getInt() in let final void #t123 = this.{self::Test5::[]=}(#t121, #t122) in #t122;
-    core::num v2 = let final core::String #t124 = "x" in let final core::num #t125 = self::getNum() in let final void #t126 = this.{self::Test5::[]=}(#t124, #t125) in #t125;
-    core::double v3 = let final core::String #t127 = "x" in let final core::double #t128 = self::getDouble() in let final void #t129 = this.{self::Test5::[]=}(#t127, #t128) in #t128;
-    core::num v4 = let final core::String #t130 = "x" in let final core::num #t131 = this.{self::Test5::[]}(#t130) in #t131.{core::num::==}(null) ?{core::num} let final core::int #t132 = self::getInt() in let final void #t133 = this.{self::Test5::[]=}(#t130, #t132) in #t132 : #t131;
-    core::num v5 = let final core::String #t134 = "x" in let final core::num #t135 = this.{self::Test5::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num} let final core::num #t136 = self::getNum() in let final void #t137 = this.{self::Test5::[]=}(#t134, #t136) in #t136 : #t135;
-    core::num v6 = let final core::String #t138 = "x" in let final core::num #t139 = this.{self::Test5::[]}(#t138) in #t139.{core::num::==}(null) ?{core::num} let final core::double #t140 = self::getDouble() in let final void #t141 = this.{self::Test5::[]=}(#t138, #t140) in #t140 : #t139;
-    core::num v7 = let final core::String #t142 = "x" in let final core::num #t143 = this.{self::Test5::[]}(#t142).{core::num::+}(self::getInt()) in let final void #t144 = this.{self::Test5::[]=}(#t142, #t143) in #t143;
-    core::num v8 = let final core::String #t145 = "x" in let final core::num #t146 = this.{self::Test5::[]}(#t145).{core::num::+}(self::getNum()) in let final void #t147 = this.{self::Test5::[]=}(#t145, #t146) in #t146;
-    core::num v9 = let final core::String #t148 = "x" in let final core::num #t149 = this.{self::Test5::[]}(#t148).{core::num::+}(self::getDouble()) in let final void #t150 = this.{self::Test5::[]=}(#t148, #t149) in #t149;
-    core::num v10 = let final core::String #t151 = "x" in let final core::num #t152 = this.{self::Test5::[]}(#t151).{core::num::+}(1) in let final void #t153 = this.{self::Test5::[]=}(#t151, #t152) in #t152;
-    core::num v11 = let final core::String #t154 = "x" in let final core::num #t155 = this.{self::Test5::[]}(#t154) in let final void #t156 = this.{self::Test5::[]=}(#t154, #t155.{core::num::+}(1)) in #t155;
+    core::int* v1 = let final core::String* #t121 = "x" in let final core::int* #t122 = self::getInt() in let final void #t123 = this.{self::Test5::[]=}(#t121, #t122) in #t122;
+    core::num* v2 = let final core::String* #t124 = "x" in let final core::num* #t125 = self::getNum() in let final void #t126 = this.{self::Test5::[]=}(#t124, #t125) in #t125;
+    core::double* v3 = let final core::String* #t127 = "x" in let final core::double* #t128 = self::getDouble() in let final void #t129 = this.{self::Test5::[]=}(#t127, #t128) in #t128;
+    core::num* v4 = let final core::String* #t130 = "x" in let final core::num* #t131 = this.{self::Test5::[]}(#t130) in #t131.{core::num::==}(null) ?{core::num*} let final core::int* #t132 = self::getInt() in let final void #t133 = this.{self::Test5::[]=}(#t130, #t132) in #t132 : #t131;
+    core::num* v5 = let final core::String* #t134 = "x" in let final core::num* #t135 = this.{self::Test5::[]}(#t134) in #t135.{core::num::==}(null) ?{core::num*} let final core::num* #t136 = self::getNum() in let final void #t137 = this.{self::Test5::[]=}(#t134, #t136) in #t136 : #t135;
+    core::num* v6 = let final core::String* #t138 = "x" in let final core::num* #t139 = this.{self::Test5::[]}(#t138) in #t139.{core::num::==}(null) ?{core::num*} let final core::double* #t140 = self::getDouble() in let final void #t141 = this.{self::Test5::[]=}(#t138, #t140) in #t140 : #t139;
+    core::num* v7 = let final core::String* #t142 = "x" in let final core::num* #t143 = this.{self::Test5::[]}(#t142).{core::num::+}(self::getInt()) in let final void #t144 = this.{self::Test5::[]=}(#t142, #t143) in #t143;
+    core::num* v8 = let final core::String* #t145 = "x" in let final core::num* #t146 = this.{self::Test5::[]}(#t145).{core::num::+}(self::getNum()) in let final void #t147 = this.{self::Test5::[]=}(#t145, #t146) in #t146;
+    core::num* v9 = let final core::String* #t148 = "x" in let final core::num* #t149 = this.{self::Test5::[]}(#t148).{core::num::+}(self::getDouble()) in let final void #t150 = this.{self::Test5::[]=}(#t148, #t149) in #t149;
+    core::num* v10 = let final core::String* #t151 = "x" in let final core::num* #t152 = this.{self::Test5::[]}(#t151).{core::num::+}(1) in let final void #t153 = this.{self::Test5::[]=}(#t151, #t152) in #t152;
+    core::num* v11 = let final core::String* #t154 = "x" in let final core::num* #t155 = this.{self::Test5::[]}(#t154) in let final void #t156 = this.{self::Test5::[]=}(#t154, #t155.{core::num::+}(1)) in #t155;
   }
 }
 abstract class Test6 extends core::Object {
-  synthetic constructor •() → self::Test6
+  synthetic constructor •() → self::Test6*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::num;
-  abstract operator []=(core::String s, core::double v) → void;
+  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 #t157 = "x" in let final core::num #t158 = self::getNum() as{TypeError} core::double in let final void #t159 = this.{self::Test6::[]=}(#t157, #t158) in #t158;
-    core::double v3 = let final core::String #t160 = "x" in let final core::double #t161 = self::getDouble() in let final void #t162 = this.{self::Test6::[]=}(#t160, #t161) in #t161;
-    core::num v5 = let final core::String #t163 = "x" in let final core::num #t164 = this.{self::Test6::[]}(#t163) in #t164.{core::num::==}(null) ?{core::num} let final core::num #t165 = self::getNum() as{TypeError} core::double in let final void #t166 = this.{self::Test6::[]=}(#t163, #t165) in #t165 : #t164;
-    core::num v6 = let final core::String #t167 = "x" in let final core::num #t168 = this.{self::Test6::[]}(#t167) in #t168.{core::num::==}(null) ?{core::num} let final core::double #t169 = self::getDouble() in let final void #t170 = this.{self::Test6::[]=}(#t167, #t169) in #t169 : #t168;
-    core::num v7 = let final core::String #t171 = "x" in let final core::num #t172 = this.{self::Test6::[]}(#t171).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t173 = this.{self::Test6::[]=}(#t171, #t172) in #t172;
-    core::num v8 = let final core::String #t174 = "x" in let final core::num #t175 = this.{self::Test6::[]}(#t174).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t176 = this.{self::Test6::[]=}(#t174, #t175) in #t175;
-    core::num v9 = let final core::String #t177 = "x" in let final core::num #t178 = this.{self::Test6::[]}(#t177).{core::num::+}(self::getDouble()) as{TypeError} core::double in let final void #t179 = this.{self::Test6::[]=}(#t177, #t178) in #t178;
-    core::num v10 = let final core::String #t180 = "x" in let final core::num #t181 = this.{self::Test6::[]}(#t180).{core::num::+}(1) as{TypeError} core::double in let final void #t182 = this.{self::Test6::[]=}(#t180, #t181) in #t181;
-    core::num v11 = let final core::String #t183 = "x" in let final core::num #t184 = this.{self::Test6::[]}(#t183) in let final void #t185 = this.{self::Test6::[]=}(#t183, #t184.{core::num::+}(1) as{TypeError} core::double) in #t184;
+    core::num* v2 = let final core::String* #t157 = "x" in let final core::num* #t158 = self::getNum() as{TypeError} core::double* in let final void #t159 = this.{self::Test6::[]=}(#t157, #t158) in #t158;
+    core::double* v3 = let final core::String* #t160 = "x" in let final core::double* #t161 = self::getDouble() in let final void #t162 = this.{self::Test6::[]=}(#t160, #t161) in #t161;
+    core::num* v5 = let final core::String* #t163 = "x" in let final core::num* #t164 = this.{self::Test6::[]}(#t163) in #t164.{core::num::==}(null) ?{core::num*} let final core::num* #t165 = self::getNum() as{TypeError} core::double* in let final void #t166 = this.{self::Test6::[]=}(#t163, #t165) in #t165 : #t164;
+    core::num* v6 = let final core::String* #t167 = "x" in let final core::num* #t168 = this.{self::Test6::[]}(#t167) in #t168.{core::num::==}(null) ?{core::num*} let final core::double* #t169 = self::getDouble() in let final void #t170 = this.{self::Test6::[]=}(#t167, #t169) in #t169 : #t168;
+    core::num* v7 = let final core::String* #t171 = "x" in let final core::num* #t172 = this.{self::Test6::[]}(#t171).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t173 = this.{self::Test6::[]=}(#t171, #t172) in #t172;
+    core::num* v8 = let final core::String* #t174 = "x" in let final core::num* #t175 = this.{self::Test6::[]}(#t174).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t176 = this.{self::Test6::[]=}(#t174, #t175) in #t175;
+    core::num* v9 = let final core::String* #t177 = "x" in let final core::num* #t178 = this.{self::Test6::[]}(#t177).{core::num::+}(self::getDouble()) as{TypeError} core::double* in let final void #t179 = this.{self::Test6::[]=}(#t177, #t178) in #t178;
+    core::num* v10 = let final core::String* #t180 = "x" in let final core::num* #t181 = this.{self::Test6::[]}(#t180).{core::num::+}(1) as{TypeError} core::double* in let final void #t182 = this.{self::Test6::[]=}(#t180, #t181) in #t181;
+    core::num* v11 = let final core::String* #t183 = "x" in let final core::num* #t184 = this.{self::Test6::[]}(#t183) in let final void #t185 = this.{self::Test6::[]=}(#t183, #t184.{core::num::+}(1) as{TypeError} core::double*) in #t184;
   }
 }
 abstract class Test7 extends core::Object {
-  synthetic constructor •() → self::Test7
+  synthetic constructor •() → self::Test7*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::int v) → void;
+  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 #t186 = "x" in let final core::int #t187 = self::getInt() in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187) in #t187;
-    core::num v2 = let final core::String #t189 = "x" in let final core::num #t190 = self::getNum() as{TypeError} core::int in let final void #t191 = this.{self::Test7::[]=}(#t189, #t190) in #t190;
-    core::num v4 = let final core::String #t192 = "x" in let final core::double #t193 = this.{self::Test7::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num} let final core::int #t194 = self::getInt() in let final void #t195 = this.{self::Test7::[]=}(#t192, #t194) in #t194 : #t193;
-    core::num v5 = let final core::String #t196 = "x" in let final core::double #t197 = this.{self::Test7::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num} let final core::num #t198 = self::getNum() as{TypeError} core::int in let final void #t199 = this.{self::Test7::[]=}(#t196, #t198) in #t198 : #t197;
-    core::double v7 = let final core::String #t200 = "x" in let final core::double #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    core::int* v1 = let final core::String* #t186 = "x" in let final core::int* #t187 = self::getInt() in let final void #t188 = this.{self::Test7::[]=}(#t186, #t187) in #t187;
+    core::num* v2 = let final core::String* #t189 = "x" in let final core::num* #t190 = self::getNum() as{TypeError} core::int* in let final void #t191 = this.{self::Test7::[]=}(#t189, #t190) in #t190;
+    core::num* v4 = let final core::String* #t192 = "x" in let final core::double* #t193 = this.{self::Test7::[]}(#t192) in #t193.{core::num::==}(null) ?{core::num*} let final core::int* #t194 = self::getInt() in let final void #t195 = this.{self::Test7::[]=}(#t192, #t194) in #t194 : #t193;
+    core::num* v5 = let final core::String* #t196 = "x" in let final core::double* #t197 = this.{self::Test7::[]}(#t196) in #t197.{core::num::==}(null) ?{core::num*} let final core::num* #t198 = self::getNum() as{TypeError} core::int* in let final void #t199 = this.{self::Test7::[]=}(#t196, #t198) in #t198 : #t197;
+    core::double* v7 = let final core::String* #t200 = "x" in let final core::double* #t201 = let final<BottomType> #t202 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:125:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
-                                                                ^" in this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
-    core::double v8 = let final core::String #t204 = "x" in let final core::double #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v7 = this /*@target=Test7::[]=*/ ['x'] += getInt();
+                                                                   ^" in this.{self::Test7::[]}(#t200).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t203 = this.{self::Test7::[]=}(#t200, #t201) in #t201;
+    core::double* v8 = let final core::String* #t204 = "x" in let final core::double* #t205 = let final<BottomType> #t206 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:126:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
-                                                                ^" in this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
-    core::double v10 = let final core::String #t208 = "x" in let final core::double #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:32: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v8 = this /*@target=Test7::[]=*/ ['x'] += getNum();
+                                                                   ^" in this.{self::Test7::[]}(#t204).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t207 = this.{self::Test7::[]=}(#t204, #t205) in #t205;
+    core::double* v10 = let final core::String* #t208 = "x" in let final core::double* #t209 = let final<BottomType> #t210 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:127:35: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v10 = ++this /*@target=Test7::[]=*/ ['x'];
-                               ^" in this.{self::Test7::[]}(#t208).{core::double::+}(1) as{TypeError} core::int in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
-    core::double v11 = let final core::String #t212 = "x" in let final core::double #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:65: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+    var /*@ type=double* */ v10 = ++this /*@target=Test7::[]=*/ ['x'];
+                                  ^" in this.{self::Test7::[]}(#t208).{core::double::+}(1) as{TypeError} core::int* in let final void #t211 = this.{self::Test7::[]=}(#t208, #t209) in #t209;
+    core::double* v11 = let final core::String* #t212 = "x" in let final core::double* #t213 = this.{self::Test7::[]}(#t212) in let final void #t214 = this.{self::Test7::[]=}(#t212, let final<BottomType> #t215 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_this_upwards.dart:128:68: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    var /*@type=double*/ v11 = this /*@target=Test7::[]=*/ ['x']++;
-                                                                ^" in #t213.{core::double::+}(1) as{TypeError} core::int) in #t213;
+    var /*@ type=double* */ v11 = this /*@target=Test7::[]=*/ ['x']++;
+                                                                   ^" in #t213.{core::double::+}(1) as{TypeError} core::int*) in #t213;
   }
 }
 abstract class Test8 extends core::Object {
-  synthetic constructor •() → self::Test8
+  synthetic constructor •() → self::Test8*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::num v) → void;
+  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 #t216 = "x" in let final core::int #t217 = self::getInt() in let final void #t218 = this.{self::Test8::[]=}(#t216, #t217) in #t217;
-    core::num v2 = let final core::String #t219 = "x" in let final core::num #t220 = self::getNum() in let final void #t221 = this.{self::Test8::[]=}(#t219, #t220) in #t220;
-    core::double v3 = let final core::String #t222 = "x" in let final core::double #t223 = self::getDouble() in let final void #t224 = this.{self::Test8::[]=}(#t222, #t223) in #t223;
-    core::num v4 = let final core::String #t225 = "x" in let final core::double #t226 = this.{self::Test8::[]}(#t225) in #t226.{core::num::==}(null) ?{core::num} let final core::int #t227 = self::getInt() in let final void #t228 = this.{self::Test8::[]=}(#t225, #t227) in #t227 : #t226;
-    core::num v5 = let final core::String #t229 = "x" in let final core::double #t230 = this.{self::Test8::[]}(#t229) in #t230.{core::num::==}(null) ?{core::num} let final core::num #t231 = self::getNum() in let final void #t232 = this.{self::Test8::[]=}(#t229, #t231) in #t231 : #t230;
-    core::double v6 = let final core::String #t233 = "x" in let final core::double #t234 = this.{self::Test8::[]}(#t233) in #t234.{core::num::==}(null) ?{core::double} let final core::double #t235 = self::getDouble() in let final void #t236 = this.{self::Test8::[]=}(#t233, #t235) in #t235 : #t234;
-    core::double v7 = let final core::String #t237 = "x" in let final core::double #t238 = this.{self::Test8::[]}(#t237).{core::double::+}(self::getInt()) in let final void #t239 = this.{self::Test8::[]=}(#t237, #t238) in #t238;
-    core::double v8 = let final core::String #t240 = "x" in let final core::double #t241 = this.{self::Test8::[]}(#t240).{core::double::+}(self::getNum()) in let final void #t242 = this.{self::Test8::[]=}(#t240, #t241) in #t241;
-    core::double v9 = let final core::String #t243 = "x" in let final core::double #t244 = this.{self::Test8::[]}(#t243).{core::double::+}(self::getDouble()) in let final void #t245 = this.{self::Test8::[]=}(#t243, #t244) in #t244;
-    core::double v10 = let final core::String #t246 = "x" in let final core::double #t247 = this.{self::Test8::[]}(#t246).{core::double::+}(1) in let final void #t248 = this.{self::Test8::[]=}(#t246, #t247) in #t247;
-    core::double v11 = let final core::String #t249 = "x" in let final core::double #t250 = this.{self::Test8::[]}(#t249) in let final void #t251 = this.{self::Test8::[]=}(#t249, #t250.{core::double::+}(1)) in #t250;
+    core::int* v1 = let final core::String* #t216 = "x" in let final core::int* #t217 = self::getInt() in let final void #t218 = this.{self::Test8::[]=}(#t216, #t217) in #t217;
+    core::num* v2 = let final core::String* #t219 = "x" in let final core::num* #t220 = self::getNum() in let final void #t221 = this.{self::Test8::[]=}(#t219, #t220) in #t220;
+    core::double* v3 = let final core::String* #t222 = "x" in let final core::double* #t223 = self::getDouble() in let final void #t224 = this.{self::Test8::[]=}(#t222, #t223) in #t223;
+    core::num* v4 = let final core::String* #t225 = "x" in let final core::double* #t226 = this.{self::Test8::[]}(#t225) in #t226.{core::num::==}(null) ?{core::num*} let final core::int* #t227 = self::getInt() in let final void #t228 = this.{self::Test8::[]=}(#t225, #t227) in #t227 : #t226;
+    core::num* v5 = let final core::String* #t229 = "x" in let final core::double* #t230 = this.{self::Test8::[]}(#t229) in #t230.{core::num::==}(null) ?{core::num*} let final core::num* #t231 = self::getNum() in let final void #t232 = this.{self::Test8::[]=}(#t229, #t231) in #t231 : #t230;
+    core::double* v6 = let final core::String* #t233 = "x" in let final core::double* #t234 = this.{self::Test8::[]}(#t233) in #t234.{core::num::==}(null) ?{core::double*} let final core::double* #t235 = self::getDouble() in let final void #t236 = this.{self::Test8::[]=}(#t233, #t235) in #t235 : #t234;
+    core::double* v7 = let final core::String* #t237 = "x" in let final core::double* #t238 = this.{self::Test8::[]}(#t237).{core::double::+}(self::getInt()) in let final void #t239 = this.{self::Test8::[]=}(#t237, #t238) in #t238;
+    core::double* v8 = let final core::String* #t240 = "x" in let final core::double* #t241 = this.{self::Test8::[]}(#t240).{core::double::+}(self::getNum()) in let final void #t242 = this.{self::Test8::[]=}(#t240, #t241) in #t241;
+    core::double* v9 = let final core::String* #t243 = "x" in let final core::double* #t244 = this.{self::Test8::[]}(#t243).{core::double::+}(self::getDouble()) in let final void #t245 = this.{self::Test8::[]=}(#t243, #t244) in #t244;
+    core::double* v10 = let final core::String* #t246 = "x" in let final core::double* #t247 = this.{self::Test8::[]}(#t246).{core::double::+}(1) in let final void #t248 = this.{self::Test8::[]=}(#t246, #t247) in #t247;
+    core::double* v11 = let final core::String* #t249 = "x" in let final core::double* #t250 = this.{self::Test8::[]}(#t249) in let final void #t251 = this.{self::Test8::[]=}(#t249, #t250.{core::double::+}(1)) in #t250;
   }
 }
 abstract class Test9 extends core::Object {
-  synthetic constructor •() → self::Test9
+  synthetic constructor •() → self::Test9*
     : super core::Object::•()
     ;
-  abstract operator [](core::String s) → core::double;
-  abstract operator []=(core::String s, core::double v) → void;
+  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 #t252 = "x" in let final core::num #t253 = self::getNum() as{TypeError} core::double in let final void #t254 = this.{self::Test9::[]=}(#t252, #t253) in #t253;
-    core::double v3 = let final core::String #t255 = "x" in let final core::double #t256 = self::getDouble() in let final void #t257 = this.{self::Test9::[]=}(#t255, #t256) in #t256;
-    core::num v5 = let final core::String #t258 = "x" in let final core::double #t259 = this.{self::Test9::[]}(#t258) in #t259.{core::num::==}(null) ?{core::num} let final core::num #t260 = self::getNum() as{TypeError} core::double in let final void #t261 = this.{self::Test9::[]=}(#t258, #t260) in #t260 : #t259;
-    core::double v6 = let final core::String #t262 = "x" in let final core::double #t263 = this.{self::Test9::[]}(#t262) in #t263.{core::num::==}(null) ?{core::double} let final core::double #t264 = self::getDouble() in let final void #t265 = this.{self::Test9::[]=}(#t262, #t264) in #t264 : #t263;
-    core::double v7 = let final core::String #t266 = "x" in let final core::double #t267 = this.{self::Test9::[]}(#t266).{core::double::+}(self::getInt()) in let final void #t268 = this.{self::Test9::[]=}(#t266, #t267) in #t267;
-    core::double v8 = let final core::String #t269 = "x" in let final core::double #t270 = this.{self::Test9::[]}(#t269).{core::double::+}(self::getNum()) in let final void #t271 = this.{self::Test9::[]=}(#t269, #t270) in #t270;
-    core::double v9 = let final core::String #t272 = "x" in let final core::double #t273 = this.{self::Test9::[]}(#t272).{core::double::+}(self::getDouble()) in let final void #t274 = this.{self::Test9::[]=}(#t272, #t273) in #t273;
-    core::double v10 = let final core::String #t275 = "x" in let final core::double #t276 = this.{self::Test9::[]}(#t275).{core::double::+}(1) in let final void #t277 = this.{self::Test9::[]=}(#t275, #t276) in #t276;
-    core::double v11 = let final core::String #t278 = "x" in let final core::double #t279 = this.{self::Test9::[]}(#t278) in let final void #t280 = this.{self::Test9::[]=}(#t278, #t279.{core::double::+}(1)) in #t279;
+    core::num* v2 = let final core::String* #t252 = "x" in let final core::num* #t253 = self::getNum() as{TypeError} core::double* in let final void #t254 = this.{self::Test9::[]=}(#t252, #t253) in #t253;
+    core::double* v3 = let final core::String* #t255 = "x" in let final core::double* #t256 = self::getDouble() in let final void #t257 = this.{self::Test9::[]=}(#t255, #t256) in #t256;
+    core::num* v5 = let final core::String* #t258 = "x" in let final core::double* #t259 = this.{self::Test9::[]}(#t258) in #t259.{core::num::==}(null) ?{core::num*} let final core::num* #t260 = self::getNum() as{TypeError} core::double* in let final void #t261 = this.{self::Test9::[]=}(#t258, #t260) in #t260 : #t259;
+    core::double* v6 = let final core::String* #t262 = "x" in let final core::double* #t263 = this.{self::Test9::[]}(#t262) in #t263.{core::num::==}(null) ?{core::double*} let final core::double* #t264 = self::getDouble() in let final void #t265 = this.{self::Test9::[]=}(#t262, #t264) in #t264 : #t263;
+    core::double* v7 = let final core::String* #t266 = "x" in let final core::double* #t267 = this.{self::Test9::[]}(#t266).{core::double::+}(self::getInt()) in let final void #t268 = this.{self::Test9::[]=}(#t266, #t267) in #t267;
+    core::double* v8 = let final core::String* #t269 = "x" in let final core::double* #t270 = this.{self::Test9::[]}(#t269).{core::double::+}(self::getNum()) in let final void #t271 = this.{self::Test9::[]=}(#t269, #t270) in #t270;
+    core::double* v9 = let final core::String* #t272 = "x" in let final core::double* #t273 = this.{self::Test9::[]}(#t272).{core::double::+}(self::getDouble()) in let final void #t274 = this.{self::Test9::[]=}(#t272, #t273) in #t273;
+    core::double* v10 = let final core::String* #t275 = "x" in let final core::double* #t276 = this.{self::Test9::[]}(#t275).{core::double::+}(1) in let final void #t277 = this.{self::Test9::[]=}(#t275, #t276) in #t276;
+    core::double* v11 = let final core::String* #t278 = "x" in let final core::double* #t279 = this.{self::Test9::[]}(#t278) in let final void #t280 = this.{self::Test9::[]=}(#t278, #t279.{core::double::+}(1)) in #t279;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
index a56c590..27c4248 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart
@@ -15,114 +15,114 @@
 }
 
 void test1(Test<int, int> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=int*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=int* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=int* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=int* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=int* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test2(Test<int, num> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=int*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=num*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=double*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=int* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=num* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=int* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=double* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=int* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=int* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test3(Test<int, double> t) {
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=num*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=double*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=num* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=int* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=double* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=int* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=int* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test4(Test<num, int> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=num*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=num*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=num*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=num*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=num* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=num* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=num* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=num* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test5(Test<num, num> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=num*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=num*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=num*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=num*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=num*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=num*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=num* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=num* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=num* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=num* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=num* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=num* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test6(Test<num, double> t) {
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=num*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=num*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=num*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=num*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=num*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=num*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=num* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=num* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=num* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=num* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=num* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=num* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test7(Test<double, int> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=num*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=num* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=double* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=double* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=double* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=double* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test8(Test<double, num> t) {
-  var /*@type=int*/ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=num*/ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=double*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=double*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=int* */ v1 = t /*@target=Test::[]=*/ ['x'] = getInt();
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=num* */ v4 = t /*@target=Test::[]=*/ ['x'] ??= getInt();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=double* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=double* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=double* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=double* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=double* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=double* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 void test9(Test<double, double> t) {
-  var /*@type=num*/ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
-  var /*@type=double*/ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
-  var /*@type=num*/ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
-  var /*@type=double*/ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
-  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-  var /*@type=double*/ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
-  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+  var /*@ type=num* */ v2 = t /*@target=Test::[]=*/ ['x'] = getNum();
+  var /*@ type=double* */ v3 = t /*@target=Test::[]=*/ ['x'] = getDouble();
+  var /*@ type=num* */ v5 = t /*@target=Test::[]=*/ ['x'] ??= getNum();
+  var /*@ type=double* */ v6 = t /*@target=Test::[]=*/ ['x'] ??= getDouble();
+  var /*@ type=double* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+  var /*@ type=double* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+  var /*@ type=double* */ v9 = t /*@target=Test::[]=*/ ['x'] += getDouble();
+  var /*@ type=double* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+  var /*@ type=double* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
index bab4ea5..17b808c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.expect
@@ -2,20 +2,20 @@
 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>
+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, generic-covariant-impl self::Test::U v) → void;
+  abstract operator [](core::String* s) → self::Test::T*;
+  abstract operator []=(core::String* s, generic-covariant-impl self::Test::U* v) → void;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(self::Test<core::int, core::int> t) → void {
+static method test1(self::Test<core::int*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t1 = t in let final dynamic #t2 = "x" in let final dynamic #t3 = self::getInt() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
   dynamic v2 = let final dynamic #t5 = t in let final dynamic #t6 = "x" in let final dynamic #t7 = self::getNum() in let final dynamic #t8 = #t5.[]=(#t6, #t7) in #t7;
   dynamic v4 = let final dynamic #t9 = t in let final dynamic #t10 = "x" in let final dynamic #t11 = #t9.[](#t10) in #t11.==(null) ? let final dynamic #t12 = self::getInt() in let final dynamic #t13 = #t9.[]=(#t10, #t12) in #t12 : #t11;
@@ -25,7 +25,7 @@
   dynamic v10 = let final dynamic #t27 = t in let final dynamic #t28 = "x" in let final dynamic #t29 = #t27.[](#t28).+(1) in let final dynamic #t30 = #t27.[]=(#t28, #t29) in #t29;
   dynamic v11 = let final dynamic #t31 = t in let final dynamic #t32 = "x" in let final dynamic #t33 = #t31.[](#t32) in let final dynamic #t34 = #t31.[]=(#t32, #t33.+(1)) in #t33;
 }
-static method test2(self::Test<core::int, core::num> t) → void {
+static method test2(self::Test<core::int*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t35 = t in let final dynamic #t36 = "x" in let final dynamic #t37 = self::getInt() in let final dynamic #t38 = #t35.[]=(#t36, #t37) in #t37;
   dynamic v2 = let final dynamic #t39 = t in let final dynamic #t40 = "x" in let final dynamic #t41 = self::getNum() in let final dynamic #t42 = #t39.[]=(#t40, #t41) in #t41;
   dynamic v3 = let final dynamic #t43 = t in let final dynamic #t44 = "x" in let final dynamic #t45 = self::getDouble() in let final dynamic #t46 = #t43.[]=(#t44, #t45) in #t45;
@@ -38,7 +38,7 @@
   dynamic v10 = let final dynamic #t74 = t in let final dynamic #t75 = "x" in let final dynamic #t76 = #t74.[](#t75).+(1) in let final dynamic #t77 = #t74.[]=(#t75, #t76) in #t76;
   dynamic v11 = let final dynamic #t78 = t in let final dynamic #t79 = "x" in let final dynamic #t80 = #t78.[](#t79) in let final dynamic #t81 = #t78.[]=(#t79, #t80.+(1)) in #t80;
 }
-static method test3(self::Test<core::int, core::double> t) → void {
+static method test3(self::Test<core::int*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t82 = t in let final dynamic #t83 = "x" in let final dynamic #t84 = self::getNum() in let final dynamic #t85 = #t82.[]=(#t83, #t84) in #t84;
   dynamic v3 = let final dynamic #t86 = t in let final dynamic #t87 = "x" in let final dynamic #t88 = self::getDouble() in let final dynamic #t89 = #t86.[]=(#t87, #t88) in #t88;
   dynamic v5 = let final dynamic #t90 = t in let final dynamic #t91 = "x" in let final dynamic #t92 = #t90.[](#t91) in #t92.==(null) ? let final dynamic #t93 = self::getNum() in let final dynamic #t94 = #t90.[]=(#t91, #t93) in #t93 : #t92;
@@ -49,7 +49,7 @@
   dynamic v10 = let final dynamic #t112 = t in let final dynamic #t113 = "x" in let final dynamic #t114 = #t112.[](#t113).+(1) in let final dynamic #t115 = #t112.[]=(#t113, #t114) in #t114;
   dynamic v11 = let final dynamic #t116 = t in let final dynamic #t117 = "x" in let final dynamic #t118 = #t116.[](#t117) in let final dynamic #t119 = #t116.[]=(#t117, #t118.+(1)) in #t118;
 }
-static method test4(self::Test<core::num, core::int> t) → void {
+static method test4(self::Test<core::num*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t120 = t in let final dynamic #t121 = "x" in let final dynamic #t122 = self::getInt() in let final dynamic #t123 = #t120.[]=(#t121, #t122) in #t122;
   dynamic v2 = let final dynamic #t124 = t in let final dynamic #t125 = "x" in let final dynamic #t126 = self::getNum() in let final dynamic #t127 = #t124.[]=(#t125, #t126) in #t126;
   dynamic v4 = let final dynamic #t128 = t in let final dynamic #t129 = "x" in let final dynamic #t130 = #t128.[](#t129) in #t130.==(null) ? let final dynamic #t131 = self::getInt() in let final dynamic #t132 = #t128.[]=(#t129, #t131) in #t131 : #t130;
@@ -59,7 +59,7 @@
   dynamic v10 = let final dynamic #t146 = t in let final dynamic #t147 = "x" in let final dynamic #t148 = #t146.[](#t147).+(1) in let final dynamic #t149 = #t146.[]=(#t147, #t148) in #t148;
   dynamic v11 = let final dynamic #t150 = t in let final dynamic #t151 = "x" in let final dynamic #t152 = #t150.[](#t151) in let final dynamic #t153 = #t150.[]=(#t151, #t152.+(1)) in #t152;
 }
-static method test5(self::Test<core::num, core::num> t) → void {
+static method test5(self::Test<core::num*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t154 = t in let final dynamic #t155 = "x" in let final dynamic #t156 = self::getInt() in let final dynamic #t157 = #t154.[]=(#t155, #t156) in #t156;
   dynamic v2 = let final dynamic #t158 = t in let final dynamic #t159 = "x" in let final dynamic #t160 = self::getNum() in let final dynamic #t161 = #t158.[]=(#t159, #t160) in #t160;
   dynamic v3 = let final dynamic #t162 = t in let final dynamic #t163 = "x" in let final dynamic #t164 = self::getDouble() in let final dynamic #t165 = #t162.[]=(#t163, #t164) in #t164;
@@ -72,7 +72,7 @@
   dynamic v10 = let final dynamic #t193 = t in let final dynamic #t194 = "x" in let final dynamic #t195 = #t193.[](#t194).+(1) in let final dynamic #t196 = #t193.[]=(#t194, #t195) in #t195;
   dynamic v11 = let final dynamic #t197 = t in let final dynamic #t198 = "x" in let final dynamic #t199 = #t197.[](#t198) in let final dynamic #t200 = #t197.[]=(#t198, #t199.+(1)) in #t199;
 }
-static method test6(self::Test<core::num, core::double> t) → void {
+static method test6(self::Test<core::num*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t201 = t in let final dynamic #t202 = "x" in let final dynamic #t203 = self::getNum() in let final dynamic #t204 = #t201.[]=(#t202, #t203) in #t203;
   dynamic v3 = let final dynamic #t205 = t in let final dynamic #t206 = "x" in let final dynamic #t207 = self::getDouble() in let final dynamic #t208 = #t205.[]=(#t206, #t207) in #t207;
   dynamic v5 = let final dynamic #t209 = t in let final dynamic #t210 = "x" in let final dynamic #t211 = #t209.[](#t210) in #t211.==(null) ? let final dynamic #t212 = self::getNum() in let final dynamic #t213 = #t209.[]=(#t210, #t212) in #t212 : #t211;
@@ -83,7 +83,7 @@
   dynamic v10 = let final dynamic #t231 = t in let final dynamic #t232 = "x" in let final dynamic #t233 = #t231.[](#t232).+(1) in let final dynamic #t234 = #t231.[]=(#t232, #t233) in #t233;
   dynamic v11 = let final dynamic #t235 = t in let final dynamic #t236 = "x" in let final dynamic #t237 = #t235.[](#t236) in let final dynamic #t238 = #t235.[]=(#t236, #t237.+(1)) in #t237;
 }
-static method test7(self::Test<core::double, core::int> t) → void {
+static method test7(self::Test<core::double*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t239 = t in let final dynamic #t240 = "x" in let final dynamic #t241 = self::getInt() in let final dynamic #t242 = #t239.[]=(#t240, #t241) in #t241;
   dynamic v2 = let final dynamic #t243 = t in let final dynamic #t244 = "x" in let final dynamic #t245 = self::getNum() in let final dynamic #t246 = #t243.[]=(#t244, #t245) in #t245;
   dynamic v4 = let final dynamic #t247 = t in let final dynamic #t248 = "x" in let final dynamic #t249 = #t247.[](#t248) in #t249.==(null) ? let final dynamic #t250 = self::getInt() in let final dynamic #t251 = #t247.[]=(#t248, #t250) in #t250 : #t249;
@@ -93,7 +93,7 @@
   dynamic v10 = let final dynamic #t265 = t in let final dynamic #t266 = "x" in let final dynamic #t267 = #t265.[](#t266).+(1) in let final dynamic #t268 = #t265.[]=(#t266, #t267) in #t267;
   dynamic v11 = let final dynamic #t269 = t in let final dynamic #t270 = "x" in let final dynamic #t271 = #t269.[](#t270) in let final dynamic #t272 = #t269.[]=(#t270, #t271.+(1)) in #t271;
 }
-static method test8(self::Test<core::double, core::num> t) → void {
+static method test8(self::Test<core::double*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t273 = t in let final dynamic #t274 = "x" in let final dynamic #t275 = self::getInt() in let final dynamic #t276 = #t273.[]=(#t274, #t275) in #t275;
   dynamic v2 = let final dynamic #t277 = t in let final dynamic #t278 = "x" in let final dynamic #t279 = self::getNum() in let final dynamic #t280 = #t277.[]=(#t278, #t279) in #t279;
   dynamic v3 = let final dynamic #t281 = t in let final dynamic #t282 = "x" in let final dynamic #t283 = self::getDouble() in let final dynamic #t284 = #t281.[]=(#t282, #t283) in #t283;
@@ -106,7 +106,7 @@
   dynamic v10 = let final dynamic #t312 = t in let final dynamic #t313 = "x" in let final dynamic #t314 = #t312.[](#t313).+(1) in let final dynamic #t315 = #t312.[]=(#t313, #t314) in #t314;
   dynamic v11 = let final dynamic #t316 = t in let final dynamic #t317 = "x" in let final dynamic #t318 = #t316.[](#t317) in let final dynamic #t319 = #t316.[]=(#t317, #t318.+(1)) in #t318;
 }
-static method test9(self::Test<core::double, core::double> t) → void {
+static method test9(self::Test<core::double*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t320 = t in let final dynamic #t321 = "x" in let final dynamic #t322 = self::getNum() in let final dynamic #t323 = #t320.[]=(#t321, #t322) in #t322;
   dynamic v3 = let final dynamic #t324 = t in let final dynamic #t325 = "x" in let final dynamic #t326 = self::getDouble() in let final dynamic #t327 = #t324.[]=(#t325, #t326) in #t326;
   dynamic v5 = let final dynamic #t328 = t in let final dynamic #t329 = "x" in let final dynamic #t330 = #t328.[](#t329) in #t330.==(null) ? let final dynamic #t331 = self::getNum() in let final dynamic #t332 = #t328.[]=(#t329, #t331) in #t331 : #t330;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
index bab4ea5..17b808c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 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>
+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, generic-covariant-impl self::Test::U v) → void;
+  abstract operator [](core::String* s) → self::Test::T*;
+  abstract operator []=(core::String* s, generic-covariant-impl self::Test::U* v) → void;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(self::Test<core::int, core::int> t) → void {
+static method test1(self::Test<core::int*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t1 = t in let final dynamic #t2 = "x" in let final dynamic #t3 = self::getInt() in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3;
   dynamic v2 = let final dynamic #t5 = t in let final dynamic #t6 = "x" in let final dynamic #t7 = self::getNum() in let final dynamic #t8 = #t5.[]=(#t6, #t7) in #t7;
   dynamic v4 = let final dynamic #t9 = t in let final dynamic #t10 = "x" in let final dynamic #t11 = #t9.[](#t10) in #t11.==(null) ? let final dynamic #t12 = self::getInt() in let final dynamic #t13 = #t9.[]=(#t10, #t12) in #t12 : #t11;
@@ -25,7 +25,7 @@
   dynamic v10 = let final dynamic #t27 = t in let final dynamic #t28 = "x" in let final dynamic #t29 = #t27.[](#t28).+(1) in let final dynamic #t30 = #t27.[]=(#t28, #t29) in #t29;
   dynamic v11 = let final dynamic #t31 = t in let final dynamic #t32 = "x" in let final dynamic #t33 = #t31.[](#t32) in let final dynamic #t34 = #t31.[]=(#t32, #t33.+(1)) in #t33;
 }
-static method test2(self::Test<core::int, core::num> t) → void {
+static method test2(self::Test<core::int*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t35 = t in let final dynamic #t36 = "x" in let final dynamic #t37 = self::getInt() in let final dynamic #t38 = #t35.[]=(#t36, #t37) in #t37;
   dynamic v2 = let final dynamic #t39 = t in let final dynamic #t40 = "x" in let final dynamic #t41 = self::getNum() in let final dynamic #t42 = #t39.[]=(#t40, #t41) in #t41;
   dynamic v3 = let final dynamic #t43 = t in let final dynamic #t44 = "x" in let final dynamic #t45 = self::getDouble() in let final dynamic #t46 = #t43.[]=(#t44, #t45) in #t45;
@@ -38,7 +38,7 @@
   dynamic v10 = let final dynamic #t74 = t in let final dynamic #t75 = "x" in let final dynamic #t76 = #t74.[](#t75).+(1) in let final dynamic #t77 = #t74.[]=(#t75, #t76) in #t76;
   dynamic v11 = let final dynamic #t78 = t in let final dynamic #t79 = "x" in let final dynamic #t80 = #t78.[](#t79) in let final dynamic #t81 = #t78.[]=(#t79, #t80.+(1)) in #t80;
 }
-static method test3(self::Test<core::int, core::double> t) → void {
+static method test3(self::Test<core::int*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t82 = t in let final dynamic #t83 = "x" in let final dynamic #t84 = self::getNum() in let final dynamic #t85 = #t82.[]=(#t83, #t84) in #t84;
   dynamic v3 = let final dynamic #t86 = t in let final dynamic #t87 = "x" in let final dynamic #t88 = self::getDouble() in let final dynamic #t89 = #t86.[]=(#t87, #t88) in #t88;
   dynamic v5 = let final dynamic #t90 = t in let final dynamic #t91 = "x" in let final dynamic #t92 = #t90.[](#t91) in #t92.==(null) ? let final dynamic #t93 = self::getNum() in let final dynamic #t94 = #t90.[]=(#t91, #t93) in #t93 : #t92;
@@ -49,7 +49,7 @@
   dynamic v10 = let final dynamic #t112 = t in let final dynamic #t113 = "x" in let final dynamic #t114 = #t112.[](#t113).+(1) in let final dynamic #t115 = #t112.[]=(#t113, #t114) in #t114;
   dynamic v11 = let final dynamic #t116 = t in let final dynamic #t117 = "x" in let final dynamic #t118 = #t116.[](#t117) in let final dynamic #t119 = #t116.[]=(#t117, #t118.+(1)) in #t118;
 }
-static method test4(self::Test<core::num, core::int> t) → void {
+static method test4(self::Test<core::num*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t120 = t in let final dynamic #t121 = "x" in let final dynamic #t122 = self::getInt() in let final dynamic #t123 = #t120.[]=(#t121, #t122) in #t122;
   dynamic v2 = let final dynamic #t124 = t in let final dynamic #t125 = "x" in let final dynamic #t126 = self::getNum() in let final dynamic #t127 = #t124.[]=(#t125, #t126) in #t126;
   dynamic v4 = let final dynamic #t128 = t in let final dynamic #t129 = "x" in let final dynamic #t130 = #t128.[](#t129) in #t130.==(null) ? let final dynamic #t131 = self::getInt() in let final dynamic #t132 = #t128.[]=(#t129, #t131) in #t131 : #t130;
@@ -59,7 +59,7 @@
   dynamic v10 = let final dynamic #t146 = t in let final dynamic #t147 = "x" in let final dynamic #t148 = #t146.[](#t147).+(1) in let final dynamic #t149 = #t146.[]=(#t147, #t148) in #t148;
   dynamic v11 = let final dynamic #t150 = t in let final dynamic #t151 = "x" in let final dynamic #t152 = #t150.[](#t151) in let final dynamic #t153 = #t150.[]=(#t151, #t152.+(1)) in #t152;
 }
-static method test5(self::Test<core::num, core::num> t) → void {
+static method test5(self::Test<core::num*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t154 = t in let final dynamic #t155 = "x" in let final dynamic #t156 = self::getInt() in let final dynamic #t157 = #t154.[]=(#t155, #t156) in #t156;
   dynamic v2 = let final dynamic #t158 = t in let final dynamic #t159 = "x" in let final dynamic #t160 = self::getNum() in let final dynamic #t161 = #t158.[]=(#t159, #t160) in #t160;
   dynamic v3 = let final dynamic #t162 = t in let final dynamic #t163 = "x" in let final dynamic #t164 = self::getDouble() in let final dynamic #t165 = #t162.[]=(#t163, #t164) in #t164;
@@ -72,7 +72,7 @@
   dynamic v10 = let final dynamic #t193 = t in let final dynamic #t194 = "x" in let final dynamic #t195 = #t193.[](#t194).+(1) in let final dynamic #t196 = #t193.[]=(#t194, #t195) in #t195;
   dynamic v11 = let final dynamic #t197 = t in let final dynamic #t198 = "x" in let final dynamic #t199 = #t197.[](#t198) in let final dynamic #t200 = #t197.[]=(#t198, #t199.+(1)) in #t199;
 }
-static method test6(self::Test<core::num, core::double> t) → void {
+static method test6(self::Test<core::num*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t201 = t in let final dynamic #t202 = "x" in let final dynamic #t203 = self::getNum() in let final dynamic #t204 = #t201.[]=(#t202, #t203) in #t203;
   dynamic v3 = let final dynamic #t205 = t in let final dynamic #t206 = "x" in let final dynamic #t207 = self::getDouble() in let final dynamic #t208 = #t205.[]=(#t206, #t207) in #t207;
   dynamic v5 = let final dynamic #t209 = t in let final dynamic #t210 = "x" in let final dynamic #t211 = #t209.[](#t210) in #t211.==(null) ? let final dynamic #t212 = self::getNum() in let final dynamic #t213 = #t209.[]=(#t210, #t212) in #t212 : #t211;
@@ -83,7 +83,7 @@
   dynamic v10 = let final dynamic #t231 = t in let final dynamic #t232 = "x" in let final dynamic #t233 = #t231.[](#t232).+(1) in let final dynamic #t234 = #t231.[]=(#t232, #t233) in #t233;
   dynamic v11 = let final dynamic #t235 = t in let final dynamic #t236 = "x" in let final dynamic #t237 = #t235.[](#t236) in let final dynamic #t238 = #t235.[]=(#t236, #t237.+(1)) in #t237;
 }
-static method test7(self::Test<core::double, core::int> t) → void {
+static method test7(self::Test<core::double*, core::int*>* t) → void {
   dynamic v1 = let final dynamic #t239 = t in let final dynamic #t240 = "x" in let final dynamic #t241 = self::getInt() in let final dynamic #t242 = #t239.[]=(#t240, #t241) in #t241;
   dynamic v2 = let final dynamic #t243 = t in let final dynamic #t244 = "x" in let final dynamic #t245 = self::getNum() in let final dynamic #t246 = #t243.[]=(#t244, #t245) in #t245;
   dynamic v4 = let final dynamic #t247 = t in let final dynamic #t248 = "x" in let final dynamic #t249 = #t247.[](#t248) in #t249.==(null) ? let final dynamic #t250 = self::getInt() in let final dynamic #t251 = #t247.[]=(#t248, #t250) in #t250 : #t249;
@@ -93,7 +93,7 @@
   dynamic v10 = let final dynamic #t265 = t in let final dynamic #t266 = "x" in let final dynamic #t267 = #t265.[](#t266).+(1) in let final dynamic #t268 = #t265.[]=(#t266, #t267) in #t267;
   dynamic v11 = let final dynamic #t269 = t in let final dynamic #t270 = "x" in let final dynamic #t271 = #t269.[](#t270) in let final dynamic #t272 = #t269.[]=(#t270, #t271.+(1)) in #t271;
 }
-static method test8(self::Test<core::double, core::num> t) → void {
+static method test8(self::Test<core::double*, core::num*>* t) → void {
   dynamic v1 = let final dynamic #t273 = t in let final dynamic #t274 = "x" in let final dynamic #t275 = self::getInt() in let final dynamic #t276 = #t273.[]=(#t274, #t275) in #t275;
   dynamic v2 = let final dynamic #t277 = t in let final dynamic #t278 = "x" in let final dynamic #t279 = self::getNum() in let final dynamic #t280 = #t277.[]=(#t278, #t279) in #t279;
   dynamic v3 = let final dynamic #t281 = t in let final dynamic #t282 = "x" in let final dynamic #t283 = self::getDouble() in let final dynamic #t284 = #t281.[]=(#t282, #t283) in #t283;
@@ -106,7 +106,7 @@
   dynamic v10 = let final dynamic #t312 = t in let final dynamic #t313 = "x" in let final dynamic #t314 = #t312.[](#t313).+(1) in let final dynamic #t315 = #t312.[]=(#t313, #t314) in #t314;
   dynamic v11 = let final dynamic #t316 = t in let final dynamic #t317 = "x" in let final dynamic #t318 = #t316.[](#t317) in let final dynamic #t319 = #t316.[]=(#t317, #t318.+(1)) in #t318;
 }
-static method test9(self::Test<core::double, core::double> t) → void {
+static method test9(self::Test<core::double*, core::double*>* t) → void {
   dynamic v2 = let final dynamic #t320 = t in let final dynamic #t321 = "x" in let final dynamic #t322 = self::getNum() in let final dynamic #t323 = #t320.[]=(#t321, #t322) in #t322;
   dynamic v3 = let final dynamic #t324 = t in let final dynamic #t325 = "x" in let final dynamic #t326 = self::getDouble() in let final dynamic #t327 = #t324.[]=(#t325, #t326) in #t326;
   dynamic v5 = let final dynamic #t328 = t in let final dynamic #t329 = "x" in let final dynamic #t330 = #t328.[](#t329) in #t330.==(null) ? let final dynamic #t331 = self::getNum() in let final dynamic #t332 = #t328.[]=(#t329, #t331) in #t331 : #t330;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
index 2be1f6f..8b96d90 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.outline.expect
@@ -2,35 +2,35 @@
 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>
+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*>*
     ;
-  abstract operator [](core::String s) → self::Test::T;
-  abstract operator []=(core::String s, generic-covariant-impl self::Test::U v) → void;
+  abstract operator [](core::String* s) → self::Test::T*;
+  abstract operator []=(core::String* s, generic-covariant-impl self::Test::U* v) → void;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
-static method test1(self::Test<core::int, core::int> t) → void
+static method test1(self::Test<core::int*, core::int*>* t) → void
   ;
-static method test2(self::Test<core::int, core::num> t) → void
+static method test2(self::Test<core::int*, core::num*>* t) → void
   ;
-static method test3(self::Test<core::int, core::double> t) → void
+static method test3(self::Test<core::int*, core::double*>* t) → void
   ;
-static method test4(self::Test<core::num, core::int> t) → void
+static method test4(self::Test<core::num*, core::int*>* t) → void
   ;
-static method test5(self::Test<core::num, core::num> t) → void
+static method test5(self::Test<core::num*, core::num*>* t) → void
   ;
-static method test6(self::Test<core::num, core::double> t) → void
+static method test6(self::Test<core::num*, core::double*>* t) → void
   ;
-static method test7(self::Test<core::double, core::int> t) → void
+static method test7(self::Test<core::double*, core::int*>* t) → void
   ;
-static method test8(self::Test<core::double, core::num> t) → void
+static method test8(self::Test<core::double*, core::num*>* t) → void
   ;
-static method test9(self::Test<core::double, core::double> t) → void
+static method test9(self::Test<core::double*, core::double*>* t) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
index 784bbce..4b07b83 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart.strong.expect
@@ -2,178 +2,178 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:59: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 // Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//   var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-//                                                        ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//   var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-//                           ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
-// Try changing the type of the left hand side, or casting the right hand side to 'double'.
-//   var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
-//                                                        ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+//   var /*@ type=int* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
 //                                                           ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-//                                                           ^
-//
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:30: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//   var /*@ type=int* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
 //                              ^
 //
-// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:59: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+// Try changing the type of the left hand side, or casting the right hand side to 'double'.
+//   var /*@ type=int* */ v11 = t /*@target=Test::[]=*/ ['x']++;
 //                                                           ^
 //
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var /*@ type=double* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var /*@ type=double* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+//                                                              ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:33: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var /*@ type=double* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+//                                 ^
+//
+// pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+// Try changing the type of the left hand side, or casting the right hand side to 'int'.
+//   var /*@ type=double* */ v11 = t /*@target=Test::[]=*/ ['x']++;
+//                                                              ^
+//
 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>
+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, generic-covariant-impl self::Test::U v) → void;
+  abstract operator [](core::String* s) → self::Test::T*;
+  abstract operator []=(core::String* s, generic-covariant-impl self::Test::U* v) → void;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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) 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) 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) in #t11.{core::num::==}(null) ?{core::int} let final core::int #t12 = self::getInt() in let final void #t13 = #t9.{self::Test::[]=}(#t10, #t12) 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) in #t16.{core::num::==}(null) ?{core::num} let final core::num #t17 = self::getNum() as{TypeError} core::int in let final void #t18 = #t14.{self::Test::[]=}(#t15, #t17) 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::num::+}(self::getInt()) in let final void #t22 = #t19.{self::Test::[]=}(#t20, #t21) 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::num::+}(self::getNum()) as{TypeError} core::int in let final void #t26 = #t23.{self::Test::[]=}(#t24, #t25) 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::num::+}(1) in let final void #t30 = #t27.{self::Test::[]=}(#t28, #t29) 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) in let final void #t34 = #t31.{self::Test::[]=}(#t32, #t33.{core::num::+}(1)) in #t33;
+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) 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) 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) in #t11.{core::num::==}(null) ?{core::int*} let final core::int* #t12 = self::getInt() in let final void #t13 = #t9.{self::Test::[]=}(#t10, #t12) 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) in #t16.{core::num::==}(null) ?{core::num*} let final core::num* #t17 = self::getNum() as{TypeError} core::int* in let final void #t18 = #t14.{self::Test::[]=}(#t15, #t17) 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::num::+}(self::getInt()) in let final void #t22 = #t19.{self::Test::[]=}(#t20, #t21) 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::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t26 = #t23.{self::Test::[]=}(#t24, #t25) 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::num::+}(1) in let final void #t30 = #t27.{self::Test::[]=}(#t28, #t29) 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) in let final void #t34 = #t31.{self::Test::[]=}(#t32, #t33.{core::num::+}(1)) 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) 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) 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) 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) in #t49.{core::num::==}(null) ?{core::int} let final core::int #t50 = self::getInt() in let final void #t51 = #t47.{self::Test::[]=}(#t48, #t50) 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) in #t54.{core::num::==}(null) ?{core::num} let final core::num #t55 = self::getNum() in let final void #t56 = #t52.{self::Test::[]=}(#t53, #t55) 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) in #t59.{core::num::==}(null) ?{core::num} let final core::double #t60 = self::getDouble() in let final void #t61 = #t57.{self::Test::[]=}(#t58, #t60) 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::num::+}(self::getInt()) in let final void #t65 = #t62.{self::Test::[]=}(#t63, #t64) 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::num::+}(self::getNum()) in let final void #t69 = #t66.{self::Test::[]=}(#t67, #t68) 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::num::+}(self::getDouble()) in let final void #t73 = #t70.{self::Test::[]=}(#t71, #t72) 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::num::+}(1) in let final void #t77 = #t74.{self::Test::[]=}(#t75, #t76) 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) in let final void #t81 = #t78.{self::Test::[]=}(#t79, #t80.{core::num::+}(1)) in #t80;
+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) 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) 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) 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) in #t49.{core::num::==}(null) ?{core::int*} let final core::int* #t50 = self::getInt() in let final void #t51 = #t47.{self::Test::[]=}(#t48, #t50) 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) in #t54.{core::num::==}(null) ?{core::num*} let final core::num* #t55 = self::getNum() in let final void #t56 = #t52.{self::Test::[]=}(#t53, #t55) 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) in #t59.{core::num::==}(null) ?{core::num*} let final core::double* #t60 = self::getDouble() in let final void #t61 = #t57.{self::Test::[]=}(#t58, #t60) 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::num::+}(self::getInt()) in let final void #t65 = #t62.{self::Test::[]=}(#t63, #t64) 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::num::+}(self::getNum()) in let final void #t69 = #t66.{self::Test::[]=}(#t67, #t68) 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::num::+}(self::getDouble()) in let final void #t73 = #t70.{self::Test::[]=}(#t71, #t72) 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::num::+}(1) in let final void #t77 = #t74.{self::Test::[]=}(#t75, #t76) 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) in let final void #t81 = #t78.{self::Test::[]=}(#t79, #t80.{core::num::+}(1)) 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) 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) 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) in #t92.{core::num::==}(null) ?{core::num} let final core::num #t93 = self::getNum() as{TypeError} core::double in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) 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) in #t97.{core::num::==}(null) ?{core::num} let final core::double #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) 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 = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+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) 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) 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) in #t92.{core::num::==}(null) ?{core::num*} let final core::num* #t93 = self::getNum() as{TypeError} core::double* in let final void #t94 = #t90.{self::Test::[]=}(#t91, #t93) 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) in #t97.{core::num::==}(null) ?{core::num*} let final core::double* #t98 = self::getDouble() in let final void #t99 = #t95.{self::Test::[]=}(#t96, #t98) 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 = let final<BottomType> #t103 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:47:59: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-  var /*@type=int*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-                                                       ^" in #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
-  core::num v8 = let final self::Test<core::int, core::double> #t105 = t in let final core::String #t106 = "x" in let final core::num #t107 = #t105.{self::Test::[]}(#t106).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t108 = #t105.{self::Test::[]=}(#t106, #t107) in #t107;
-  core::double v9 = let final self::Test<core::int, core::double> #t109 = t in let final core::String #t110 = "x" in let final core::double #t111 = #t109.{self::Test::[]}(#t110).{core::num::+}(self::getDouble()) in let final void #t112 = #t109.{self::Test::[]=}(#t110, #t111) in #t111;
-  core::int v10 = let final self::Test<core::int, core::double> #t113 = t in let final core::String #t114 = "x" in let final core::int #t115 = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:27: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+  var /*@ type=int* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+                                                          ^" in #t100.{self::Test::[]}(#t101).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t104 = #t100.{self::Test::[]=}(#t101, #t102) in #t102;
+  core::num* v8 = let final self::Test<core::int*, core::double*>* #t105 = t in let final core::String* #t106 = "x" in let final core::num* #t107 = #t105.{self::Test::[]}(#t106).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t108 = #t105.{self::Test::[]=}(#t106, #t107) in #t107;
+  core::double* v9 = let final self::Test<core::int*, core::double*>* #t109 = t in let final core::String* #t110 = "x" in let final core::double* #t111 = #t109.{self::Test::[]}(#t110).{core::num::+}(self::getDouble()) in let final void #t112 = #t109.{self::Test::[]=}(#t110, #t111) in #t111;
+  core::int* v10 = let final self::Test<core::int*, core::double*>* #t113 = t in let final core::String* #t114 = "x" in let final core::int* #t115 = let final<BottomType> #t116 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:50:30: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-  var /*@type=int*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-                          ^" in #t113.{self::Test::[]}(#t114).{core::num::+}(1) as{TypeError} core::double in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
-  core::int v11 = let final self::Test<core::int, core::double> #t118 = t in let final core::String #t119 = "x" in let final core::int #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:56: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
+  var /*@ type=int* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+                             ^" in #t113.{self::Test::[]}(#t114).{core::num::+}(1) as{TypeError} core::double* in let final void #t117 = #t113.{self::Test::[]=}(#t114, #t115) in #t115;
+  core::int* v11 = let final self::Test<core::int*, core::double*>* #t118 = t in let final core::String* #t119 = "x" in let final core::int* #t120 = #t118.{self::Test::[]}(#t119) in let final void #t121 = #t118.{self::Test::[]=}(#t119, let final<BottomType> #t122 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:51:59: Error: A value of type 'int' can't be assigned to a variable of type 'double'.
 Try changing the type of the left hand side, or casting the right hand side to 'double'.
-  var /*@type=int*/ v11 = t /*@target=Test::[]=*/ ['x']++;
-                                                       ^" in #t120.{core::num::+}(1) as{TypeError} core::double) in #t120;
+  var /*@ type=int* */ v11 = t /*@target=Test::[]=*/ ['x']++;
+                                                          ^" in #t120.{core::num::+}(1) as{TypeError} core::double*) in #t120;
 }
-static method test4(self::Test<core::num, core::int> t) → void {
-  core::int v1 = let final self::Test<core::num, core::int> #t123 = t in let final core::String #t124 = "x" in let final core::int #t125 = self::getInt() in let final void #t126 = #t123.{self::Test::[]=}(#t124, #t125) in #t125;
-  core::num v2 = let final self::Test<core::num, core::int> #t127 = t in let final core::String #t128 = "x" in let final core::num #t129 = self::getNum() as{TypeError} core::int in let final void #t130 = #t127.{self::Test::[]=}(#t128, #t129) in #t129;
-  core::num v4 = let final self::Test<core::num, core::int> #t131 = t in let final core::String #t132 = "x" in let final core::num #t133 = #t131.{self::Test::[]}(#t132) in #t133.{core::num::==}(null) ?{core::num} let final core::int #t134 = self::getInt() in let final void #t135 = #t131.{self::Test::[]=}(#t132, #t134) in #t134 : #t133;
-  core::num v5 = let final self::Test<core::num, core::int> #t136 = t in let final core::String #t137 = "x" in let final core::num #t138 = #t136.{self::Test::[]}(#t137) in #t138.{core::num::==}(null) ?{core::num} let final core::num #t139 = self::getNum() as{TypeError} core::int in let final void #t140 = #t136.{self::Test::[]=}(#t137, #t139) in #t139 : #t138;
-  core::num v7 = let final self::Test<core::num, core::int> #t141 = t in let final core::String #t142 = "x" in let final core::num #t143 = #t141.{self::Test::[]}(#t142).{core::num::+}(self::getInt()) as{TypeError} core::int in let final void #t144 = #t141.{self::Test::[]=}(#t142, #t143) in #t143;
-  core::num v8 = let final self::Test<core::num, core::int> #t145 = t in let final core::String #t146 = "x" in let final core::num #t147 = #t145.{self::Test::[]}(#t146).{core::num::+}(self::getNum()) as{TypeError} core::int in let final void #t148 = #t145.{self::Test::[]=}(#t146, #t147) in #t147;
-  core::num v10 = let final self::Test<core::num, core::int> #t149 = t in let final core::String #t150 = "x" in let final core::num #t151 = #t149.{self::Test::[]}(#t150).{core::num::+}(1) as{TypeError} core::int in let final void #t152 = #t149.{self::Test::[]=}(#t150, #t151) in #t151;
-  core::num v11 = let final self::Test<core::num, core::int> #t153 = t in let final core::String #t154 = "x" in let final core::num #t155 = #t153.{self::Test::[]}(#t154) in let final void #t156 = #t153.{self::Test::[]=}(#t154, #t155.{core::num::+}(1) as{TypeError} core::int) in #t155;
+static method test4(self::Test<core::num*, core::int*>* t) → void {
+  core::int* v1 = let final self::Test<core::num*, core::int*>* #t123 = t in let final core::String* #t124 = "x" in let final core::int* #t125 = self::getInt() in let final void #t126 = #t123.{self::Test::[]=}(#t124, #t125) in #t125;
+  core::num* v2 = let final self::Test<core::num*, core::int*>* #t127 = t in let final core::String* #t128 = "x" in let final core::num* #t129 = self::getNum() as{TypeError} core::int* in let final void #t130 = #t127.{self::Test::[]=}(#t128, #t129) in #t129;
+  core::num* v4 = let final self::Test<core::num*, core::int*>* #t131 = t in let final core::String* #t132 = "x" in let final core::num* #t133 = #t131.{self::Test::[]}(#t132) in #t133.{core::num::==}(null) ?{core::num*} let final core::int* #t134 = self::getInt() in let final void #t135 = #t131.{self::Test::[]=}(#t132, #t134) in #t134 : #t133;
+  core::num* v5 = let final self::Test<core::num*, core::int*>* #t136 = t in let final core::String* #t137 = "x" in let final core::num* #t138 = #t136.{self::Test::[]}(#t137) in #t138.{core::num::==}(null) ?{core::num*} let final core::num* #t139 = self::getNum() as{TypeError} core::int* in let final void #t140 = #t136.{self::Test::[]=}(#t137, #t139) in #t139 : #t138;
+  core::num* v7 = let final self::Test<core::num*, core::int*>* #t141 = t in let final core::String* #t142 = "x" in let final core::num* #t143 = #t141.{self::Test::[]}(#t142).{core::num::+}(self::getInt()) as{TypeError} core::int* in let final void #t144 = #t141.{self::Test::[]=}(#t142, #t143) in #t143;
+  core::num* v8 = let final self::Test<core::num*, core::int*>* #t145 = t in let final core::String* #t146 = "x" in let final core::num* #t147 = #t145.{self::Test::[]}(#t146).{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t148 = #t145.{self::Test::[]=}(#t146, #t147) in #t147;
+  core::num* v10 = let final self::Test<core::num*, core::int*>* #t149 = t in let final core::String* #t150 = "x" in let final core::num* #t151 = #t149.{self::Test::[]}(#t150).{core::num::+}(1) as{TypeError} core::int* in let final void #t152 = #t149.{self::Test::[]=}(#t150, #t151) in #t151;
+  core::num* v11 = let final self::Test<core::num*, core::int*>* #t153 = t in let final core::String* #t154 = "x" in let final core::num* #t155 = #t153.{self::Test::[]}(#t154) in let final void #t156 = #t153.{self::Test::[]=}(#t154, #t155.{core::num::+}(1) as{TypeError} core::int*) in #t155;
 }
-static method test5(self::Test<core::num, core::num> t) → void {
-  core::int v1 = let final self::Test<core::num, core::num> #t157 = t in let final core::String #t158 = "x" in let final core::int #t159 = self::getInt() in let final void #t160 = #t157.{self::Test::[]=}(#t158, #t159) in #t159;
-  core::num v2 = let final self::Test<core::num, core::num> #t161 = t in let final core::String #t162 = "x" in let final core::num #t163 = self::getNum() in let final void #t164 = #t161.{self::Test::[]=}(#t162, #t163) in #t163;
-  core::double v3 = let final self::Test<core::num, core::num> #t165 = t in let final core::String #t166 = "x" in let final core::double #t167 = self::getDouble() in let final void #t168 = #t165.{self::Test::[]=}(#t166, #t167) in #t167;
-  core::num v4 = let final self::Test<core::num, core::num> #t169 = t in let final core::String #t170 = "x" in let final core::num #t171 = #t169.{self::Test::[]}(#t170) in #t171.{core::num::==}(null) ?{core::num} let final core::int #t172 = self::getInt() in let final void #t173 = #t169.{self::Test::[]=}(#t170, #t172) in #t172 : #t171;
-  core::num v5 = let final self::Test<core::num, core::num> #t174 = t in let final core::String #t175 = "x" in let final core::num #t176 = #t174.{self::Test::[]}(#t175) in #t176.{core::num::==}(null) ?{core::num} let final core::num #t177 = self::getNum() in let final void #t178 = #t174.{self::Test::[]=}(#t175, #t177) in #t177 : #t176;
-  core::num v6 = let final self::Test<core::num, core::num> #t179 = t in let final core::String #t180 = "x" in let final core::num #t181 = #t179.{self::Test::[]}(#t180) in #t181.{core::num::==}(null) ?{core::num} let final core::double #t182 = self::getDouble() in let final void #t183 = #t179.{self::Test::[]=}(#t180, #t182) in #t182 : #t181;
-  core::num v7 = let final self::Test<core::num, core::num> #t184 = t in let final core::String #t185 = "x" in let final core::num #t186 = #t184.{self::Test::[]}(#t185).{core::num::+}(self::getInt()) in let final void #t187 = #t184.{self::Test::[]=}(#t185, #t186) in #t186;
-  core::num v8 = let final self::Test<core::num, core::num> #t188 = t in let final core::String #t189 = "x" in let final core::num #t190 = #t188.{self::Test::[]}(#t189).{core::num::+}(self::getNum()) in let final void #t191 = #t188.{self::Test::[]=}(#t189, #t190) in #t190;
-  core::num v9 = let final self::Test<core::num, core::num> #t192 = t in let final core::String #t193 = "x" in let final core::num #t194 = #t192.{self::Test::[]}(#t193).{core::num::+}(self::getDouble()) in let final void #t195 = #t192.{self::Test::[]=}(#t193, #t194) in #t194;
-  core::num v10 = let final self::Test<core::num, core::num> #t196 = t in let final core::String #t197 = "x" in let final core::num #t198 = #t196.{self::Test::[]}(#t197).{core::num::+}(1) in let final void #t199 = #t196.{self::Test::[]=}(#t197, #t198) in #t198;
-  core::num v11 = let final self::Test<core::num, core::num> #t200 = t in let final core::String #t201 = "x" in let final core::num #t202 = #t200.{self::Test::[]}(#t201) in let final void #t203 = #t200.{self::Test::[]=}(#t201, #t202.{core::num::+}(1)) in #t202;
+static method test5(self::Test<core::num*, core::num*>* t) → void {
+  core::int* v1 = let final self::Test<core::num*, core::num*>* #t157 = t in let final core::String* #t158 = "x" in let final core::int* #t159 = self::getInt() in let final void #t160 = #t157.{self::Test::[]=}(#t158, #t159) in #t159;
+  core::num* v2 = let final self::Test<core::num*, core::num*>* #t161 = t in let final core::String* #t162 = "x" in let final core::num* #t163 = self::getNum() in let final void #t164 = #t161.{self::Test::[]=}(#t162, #t163) in #t163;
+  core::double* v3 = let final self::Test<core::num*, core::num*>* #t165 = t in let final core::String* #t166 = "x" in let final core::double* #t167 = self::getDouble() in let final void #t168 = #t165.{self::Test::[]=}(#t166, #t167) in #t167;
+  core::num* v4 = let final self::Test<core::num*, core::num*>* #t169 = t in let final core::String* #t170 = "x" in let final core::num* #t171 = #t169.{self::Test::[]}(#t170) in #t171.{core::num::==}(null) ?{core::num*} let final core::int* #t172 = self::getInt() in let final void #t173 = #t169.{self::Test::[]=}(#t170, #t172) in #t172 : #t171;
+  core::num* v5 = let final self::Test<core::num*, core::num*>* #t174 = t in let final core::String* #t175 = "x" in let final core::num* #t176 = #t174.{self::Test::[]}(#t175) in #t176.{core::num::==}(null) ?{core::num*} let final core::num* #t177 = self::getNum() in let final void #t178 = #t174.{self::Test::[]=}(#t175, #t177) in #t177 : #t176;
+  core::num* v6 = let final self::Test<core::num*, core::num*>* #t179 = t in let final core::String* #t180 = "x" in let final core::num* #t181 = #t179.{self::Test::[]}(#t180) in #t181.{core::num::==}(null) ?{core::num*} let final core::double* #t182 = self::getDouble() in let final void #t183 = #t179.{self::Test::[]=}(#t180, #t182) in #t182 : #t181;
+  core::num* v7 = let final self::Test<core::num*, core::num*>* #t184 = t in let final core::String* #t185 = "x" in let final core::num* #t186 = #t184.{self::Test::[]}(#t185).{core::num::+}(self::getInt()) in let final void #t187 = #t184.{self::Test::[]=}(#t185, #t186) in #t186;
+  core::num* v8 = let final self::Test<core::num*, core::num*>* #t188 = t in let final core::String* #t189 = "x" in let final core::num* #t190 = #t188.{self::Test::[]}(#t189).{core::num::+}(self::getNum()) in let final void #t191 = #t188.{self::Test::[]=}(#t189, #t190) in #t190;
+  core::num* v9 = let final self::Test<core::num*, core::num*>* #t192 = t in let final core::String* #t193 = "x" in let final core::num* #t194 = #t192.{self::Test::[]}(#t193).{core::num::+}(self::getDouble()) in let final void #t195 = #t192.{self::Test::[]=}(#t193, #t194) in #t194;
+  core::num* v10 = let final self::Test<core::num*, core::num*>* #t196 = t in let final core::String* #t197 = "x" in let final core::num* #t198 = #t196.{self::Test::[]}(#t197).{core::num::+}(1) in let final void #t199 = #t196.{self::Test::[]=}(#t197, #t198) in #t198;
+  core::num* v11 = let final self::Test<core::num*, core::num*>* #t200 = t in let final core::String* #t201 = "x" in let final core::num* #t202 = #t200.{self::Test::[]}(#t201) in let final void #t203 = #t200.{self::Test::[]=}(#t201, #t202.{core::num::+}(1)) in #t202;
 }
-static method test6(self::Test<core::num, core::double> t) → void {
-  core::num v2 = let final self::Test<core::num, core::double> #t204 = t in let final core::String #t205 = "x" in let final core::num #t206 = self::getNum() as{TypeError} core::double in let final void #t207 = #t204.{self::Test::[]=}(#t205, #t206) in #t206;
-  core::double v3 = let final self::Test<core::num, core::double> #t208 = t in let final core::String #t209 = "x" in let final core::double #t210 = self::getDouble() in let final void #t211 = #t208.{self::Test::[]=}(#t209, #t210) in #t210;
-  core::num v5 = let final self::Test<core::num, core::double> #t212 = t in let final core::String #t213 = "x" in let final core::num #t214 = #t212.{self::Test::[]}(#t213) in #t214.{core::num::==}(null) ?{core::num} let final core::num #t215 = self::getNum() as{TypeError} core::double in let final void #t216 = #t212.{self::Test::[]=}(#t213, #t215) in #t215 : #t214;
-  core::num v6 = let final self::Test<core::num, core::double> #t217 = t in let final core::String #t218 = "x" in let final core::num #t219 = #t217.{self::Test::[]}(#t218) in #t219.{core::num::==}(null) ?{core::num} let final core::double #t220 = self::getDouble() in let final void #t221 = #t217.{self::Test::[]=}(#t218, #t220) in #t220 : #t219;
-  core::num v7 = let final self::Test<core::num, core::double> #t222 = t in let final core::String #t223 = "x" in let final core::num #t224 = #t222.{self::Test::[]}(#t223).{core::num::+}(self::getInt()) as{TypeError} core::double in let final void #t225 = #t222.{self::Test::[]=}(#t223, #t224) in #t224;
-  core::num v8 = let final self::Test<core::num, core::double> #t226 = t in let final core::String #t227 = "x" in let final core::num #t228 = #t226.{self::Test::[]}(#t227).{core::num::+}(self::getNum()) as{TypeError} core::double in let final void #t229 = #t226.{self::Test::[]=}(#t227, #t228) in #t228;
-  core::num v9 = let final self::Test<core::num, core::double> #t230 = t in let final core::String #t231 = "x" in let final core::num #t232 = #t230.{self::Test::[]}(#t231).{core::num::+}(self::getDouble()) as{TypeError} core::double in let final void #t233 = #t230.{self::Test::[]=}(#t231, #t232) in #t232;
-  core::num v10 = let final self::Test<core::num, core::double> #t234 = t in let final core::String #t235 = "x" in let final core::num #t236 = #t234.{self::Test::[]}(#t235).{core::num::+}(1) as{TypeError} core::double in let final void #t237 = #t234.{self::Test::[]=}(#t235, #t236) in #t236;
-  core::num v11 = let final self::Test<core::num, core::double> #t238 = t in let final core::String #t239 = "x" in let final core::num #t240 = #t238.{self::Test::[]}(#t239) in let final void #t241 = #t238.{self::Test::[]=}(#t239, #t240.{core::num::+}(1) as{TypeError} core::double) in #t240;
+static method test6(self::Test<core::num*, core::double*>* t) → void {
+  core::num* v2 = let final self::Test<core::num*, core::double*>* #t204 = t in let final core::String* #t205 = "x" in let final core::num* #t206 = self::getNum() as{TypeError} core::double* in let final void #t207 = #t204.{self::Test::[]=}(#t205, #t206) in #t206;
+  core::double* v3 = let final self::Test<core::num*, core::double*>* #t208 = t in let final core::String* #t209 = "x" in let final core::double* #t210 = self::getDouble() in let final void #t211 = #t208.{self::Test::[]=}(#t209, #t210) in #t210;
+  core::num* v5 = let final self::Test<core::num*, core::double*>* #t212 = t in let final core::String* #t213 = "x" in let final core::num* #t214 = #t212.{self::Test::[]}(#t213) in #t214.{core::num::==}(null) ?{core::num*} let final core::num* #t215 = self::getNum() as{TypeError} core::double* in let final void #t216 = #t212.{self::Test::[]=}(#t213, #t215) in #t215 : #t214;
+  core::num* v6 = let final self::Test<core::num*, core::double*>* #t217 = t in let final core::String* #t218 = "x" in let final core::num* #t219 = #t217.{self::Test::[]}(#t218) in #t219.{core::num::==}(null) ?{core::num*} let final core::double* #t220 = self::getDouble() in let final void #t221 = #t217.{self::Test::[]=}(#t218, #t220) in #t220 : #t219;
+  core::num* v7 = let final self::Test<core::num*, core::double*>* #t222 = t in let final core::String* #t223 = "x" in let final core::num* #t224 = #t222.{self::Test::[]}(#t223).{core::num::+}(self::getInt()) as{TypeError} core::double* in let final void #t225 = #t222.{self::Test::[]=}(#t223, #t224) in #t224;
+  core::num* v8 = let final self::Test<core::num*, core::double*>* #t226 = t in let final core::String* #t227 = "x" in let final core::num* #t228 = #t226.{self::Test::[]}(#t227).{core::num::+}(self::getNum()) as{TypeError} core::double* in let final void #t229 = #t226.{self::Test::[]=}(#t227, #t228) in #t228;
+  core::num* v9 = let final self::Test<core::num*, core::double*>* #t230 = t in let final core::String* #t231 = "x" in let final core::num* #t232 = #t230.{self::Test::[]}(#t231).{core::num::+}(self::getDouble()) as{TypeError} core::double* in let final void #t233 = #t230.{self::Test::[]=}(#t231, #t232) in #t232;
+  core::num* v10 = let final self::Test<core::num*, core::double*>* #t234 = t in let final core::String* #t235 = "x" in let final core::num* #t236 = #t234.{self::Test::[]}(#t235).{core::num::+}(1) as{TypeError} core::double* in let final void #t237 = #t234.{self::Test::[]=}(#t235, #t236) in #t236;
+  core::num* v11 = let final self::Test<core::num*, core::double*>* #t238 = t in let final core::String* #t239 = "x" in let final core::num* #t240 = #t238.{self::Test::[]}(#t239) in let final void #t241 = #t238.{self::Test::[]=}(#t239, #t240.{core::num::+}(1) as{TypeError} core::double*) in #t240;
 }
-static method test7(self::Test<core::double, core::int> t) → void {
-  core::int v1 = let final self::Test<core::double, core::int> #t242 = t in let final core::String #t243 = "x" in let final core::int #t244 = self::getInt() in let final void #t245 = #t242.{self::Test::[]=}(#t243, #t244) in #t244;
-  core::num v2 = let final self::Test<core::double, core::int> #t246 = t in let final core::String #t247 = "x" in let final core::num #t248 = self::getNum() as{TypeError} core::int in let final void #t249 = #t246.{self::Test::[]=}(#t247, #t248) in #t248;
-  core::num v4 = let final self::Test<core::double, core::int> #t250 = t in let final core::String #t251 = "x" in let final core::double #t252 = #t250.{self::Test::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num} let final core::int #t253 = self::getInt() in let final void #t254 = #t250.{self::Test::[]=}(#t251, #t253) in #t253 : #t252;
-  core::num v5 = let final self::Test<core::double, core::int> #t255 = t in let final core::String #t256 = "x" in let final core::double #t257 = #t255.{self::Test::[]}(#t256) in #t257.{core::num::==}(null) ?{core::num} let final core::num #t258 = self::getNum() as{TypeError} core::int in let final void #t259 = #t255.{self::Test::[]=}(#t256, #t258) in #t258 : #t257;
-  core::double v7 = let final self::Test<core::double, core::int> #t260 = t in let final core::String #t261 = "x" in let final core::double #t262 = let final<BottomType> #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+static method test7(self::Test<core::double*, core::int*>* t) → void {
+  core::int* v1 = let final self::Test<core::double*, core::int*>* #t242 = t in let final core::String* #t243 = "x" in let final core::int* #t244 = self::getInt() in let final void #t245 = #t242.{self::Test::[]=}(#t243, #t244) in #t244;
+  core::num* v2 = let final self::Test<core::double*, core::int*>* #t246 = t in let final core::String* #t247 = "x" in let final core::num* #t248 = self::getNum() as{TypeError} core::int* in let final void #t249 = #t246.{self::Test::[]=}(#t247, #t248) in #t248;
+  core::num* v4 = let final self::Test<core::double*, core::int*>* #t250 = t in let final core::String* #t251 = "x" in let final core::double* #t252 = #t250.{self::Test::[]}(#t251) in #t252.{core::num::==}(null) ?{core::num*} let final core::int* #t253 = self::getInt() in let final void #t254 = #t250.{self::Test::[]=}(#t251, #t253) in #t253 : #t252;
+  core::num* v5 = let final self::Test<core::double*, core::int*>* #t255 = t in let final core::String* #t256 = "x" in let final core::double* #t257 = #t255.{self::Test::[]}(#t256) in #t257.{core::num::==}(null) ?{core::num*} let final core::num* #t258 = self::getNum() as{TypeError} core::int* in let final void #t259 = #t255.{self::Test::[]=}(#t256, #t258) in #t258 : #t257;
+  core::double* v7 = let final self::Test<core::double*, core::int*>* #t260 = t in let final core::String* #t261 = "x" in let final core::double* #t262 = let final<BottomType> #t263 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:96:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var /*@type=double*/ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
-                                                          ^" in #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) as{TypeError} core::int in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
-  core::double v8 = let final self::Test<core::double, core::int> #t265 = t in let final core::String #t266 = "x" in let final core::double #t267 = let final<BottomType> #t268 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  var /*@ type=double* */ v7 = t /*@target=Test::[]=*/ ['x'] += getInt();
+                                                             ^" in #t260.{self::Test::[]}(#t261).{core::double::+}(self::getInt()) as{TypeError} core::int* in let final void #t264 = #t260.{self::Test::[]=}(#t261, #t262) in #t262;
+  core::double* v8 = let final self::Test<core::double*, core::int*>* #t265 = t in let final core::String* #t266 = "x" in let final core::double* #t267 = let final<BottomType> #t268 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:97:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var /*@type=double*/ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
-                                                          ^" in #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) as{TypeError} core::int in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
-  core::double v10 = let final self::Test<core::double, core::int> #t270 = t in let final core::String #t271 = "x" in let final core::double #t272 = let final<BottomType> #t273 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:30: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  var /*@ type=double* */ v8 = t /*@target=Test::[]=*/ ['x'] += getNum();
+                                                             ^" in #t265.{self::Test::[]}(#t266).{core::double::+}(self::getNum()) as{TypeError} core::int* in let final void #t269 = #t265.{self::Test::[]=}(#t266, #t267) in #t267;
+  core::double* v10 = let final self::Test<core::double*, core::int*>* #t270 = t in let final core::String* #t271 = "x" in let final core::double* #t272 = let final<BottomType> #t273 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:98:33: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var /*@type=double*/ v10 = ++t /*@target=Test::[]=*/ ['x'];
-                             ^" in #t270.{self::Test::[]}(#t271).{core::double::+}(1) as{TypeError} core::int in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
-  core::double v11 = let final self::Test<core::double, core::int> #t275 = t in let final core::String #t276 = "x" in let final core::double #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final<BottomType> #t279 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:59: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
+  var /*@ type=double* */ v10 = ++t /*@target=Test::[]=*/ ['x'];
+                                ^" in #t270.{self::Test::[]}(#t271).{core::double::+}(1) as{TypeError} core::int* in let final void #t274 = #t270.{self::Test::[]=}(#t271, #t272) in #t272;
+  core::double* v11 = let final self::Test<core::double*, core::int*>* #t275 = t in let final core::String* #t276 = "x" in let final core::double* #t277 = #t275.{self::Test::[]}(#t276) in let final void #t278 = #t275.{self::Test::[]=}(#t276, let final<BottomType> #t279 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_index_upwards.dart:99:62: Error: A value of type 'double' can't be assigned to a variable of type 'int'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  var /*@type=double*/ v11 = t /*@target=Test::[]=*/ ['x']++;
-                                                          ^" in #t277.{core::double::+}(1) as{TypeError} core::int) in #t277;
+  var /*@ type=double* */ v11 = t /*@target=Test::[]=*/ ['x']++;
+                                                             ^" in #t277.{core::double::+}(1) as{TypeError} core::int*) in #t277;
 }
-static method test8(self::Test<core::double, core::num> t) → void {
-  core::int v1 = let final self::Test<core::double, core::num> #t280 = t in let final core::String #t281 = "x" in let final core::int #t282 = self::getInt() in let final void #t283 = #t280.{self::Test::[]=}(#t281, #t282) in #t282;
-  core::num v2 = let final self::Test<core::double, core::num> #t284 = t in let final core::String #t285 = "x" in let final core::num #t286 = self::getNum() in let final void #t287 = #t284.{self::Test::[]=}(#t285, #t286) in #t286;
-  core::double v3 = let final self::Test<core::double, core::num> #t288 = t in let final core::String #t289 = "x" in let final core::double #t290 = self::getDouble() in let final void #t291 = #t288.{self::Test::[]=}(#t289, #t290) in #t290;
-  core::num v4 = let final self::Test<core::double, core::num> #t292 = t in let final core::String #t293 = "x" in let final core::double #t294 = #t292.{self::Test::[]}(#t293) in #t294.{core::num::==}(null) ?{core::num} let final core::int #t295 = self::getInt() in let final void #t296 = #t292.{self::Test::[]=}(#t293, #t295) in #t295 : #t294;
-  core::num v5 = let final self::Test<core::double, core::num> #t297 = t in let final core::String #t298 = "x" in let final core::double #t299 = #t297.{self::Test::[]}(#t298) in #t299.{core::num::==}(null) ?{core::num} let final core::num #t300 = self::getNum() in let final void #t301 = #t297.{self::Test::[]=}(#t298, #t300) in #t300 : #t299;
-  core::double v6 = let final self::Test<core::double, core::num> #t302 = t in let final core::String #t303 = "x" in let final core::double #t304 = #t302.{self::Test::[]}(#t303) in #t304.{core::num::==}(null) ?{core::double} let final core::double #t305 = self::getDouble() in let final void #t306 = #t302.{self::Test::[]=}(#t303, #t305) in #t305 : #t304;
-  core::double v7 = let final self::Test<core::double, core::num> #t307 = t in let final core::String #t308 = "x" in let final core::double #t309 = #t307.{self::Test::[]}(#t308).{core::double::+}(self::getInt()) in let final void #t310 = #t307.{self::Test::[]=}(#t308, #t309) in #t309;
-  core::double v8 = let final self::Test<core::double, core::num> #t311 = t in let final core::String #t312 = "x" in let final core::double #t313 = #t311.{self::Test::[]}(#t312).{core::double::+}(self::getNum()) in let final void #t314 = #t311.{self::Test::[]=}(#t312, #t313) in #t313;
-  core::double v9 = let final self::Test<core::double, core::num> #t315 = t in let final core::String #t316 = "x" in let final core::double #t317 = #t315.{self::Test::[]}(#t316).{core::double::+}(self::getDouble()) in let final void #t318 = #t315.{self::Test::[]=}(#t316, #t317) in #t317;
-  core::double v10 = let final self::Test<core::double, core::num> #t319 = t in let final core::String #t320 = "x" in let final core::double #t321 = #t319.{self::Test::[]}(#t320).{core::double::+}(1) in let final void #t322 = #t319.{self::Test::[]=}(#t320, #t321) in #t321;
-  core::double v11 = let final self::Test<core::double, core::num> #t323 = t in let final core::String #t324 = "x" in let final core::double #t325 = #t323.{self::Test::[]}(#t324) in let final void #t326 = #t323.{self::Test::[]=}(#t324, #t325.{core::double::+}(1)) in #t325;
+static method test8(self::Test<core::double*, core::num*>* t) → void {
+  core::int* v1 = let final self::Test<core::double*, core::num*>* #t280 = t in let final core::String* #t281 = "x" in let final core::int* #t282 = self::getInt() in let final void #t283 = #t280.{self::Test::[]=}(#t281, #t282) in #t282;
+  core::num* v2 = let final self::Test<core::double*, core::num*>* #t284 = t in let final core::String* #t285 = "x" in let final core::num* #t286 = self::getNum() in let final void #t287 = #t284.{self::Test::[]=}(#t285, #t286) in #t286;
+  core::double* v3 = let final self::Test<core::double*, core::num*>* #t288 = t in let final core::String* #t289 = "x" in let final core::double* #t290 = self::getDouble() in let final void #t291 = #t288.{self::Test::[]=}(#t289, #t290) in #t290;
+  core::num* v4 = let final self::Test<core::double*, core::num*>* #t292 = t in let final core::String* #t293 = "x" in let final core::double* #t294 = #t292.{self::Test::[]}(#t293) in #t294.{core::num::==}(null) ?{core::num*} let final core::int* #t295 = self::getInt() in let final void #t296 = #t292.{self::Test::[]=}(#t293, #t295) in #t295 : #t294;
+  core::num* v5 = let final self::Test<core::double*, core::num*>* #t297 = t in let final core::String* #t298 = "x" in let final core::double* #t299 = #t297.{self::Test::[]}(#t298) in #t299.{core::num::==}(null) ?{core::num*} let final core::num* #t300 = self::getNum() in let final void #t301 = #t297.{self::Test::[]=}(#t298, #t300) in #t300 : #t299;
+  core::double* v6 = let final self::Test<core::double*, core::num*>* #t302 = t in let final core::String* #t303 = "x" in let final core::double* #t304 = #t302.{self::Test::[]}(#t303) in #t304.{core::num::==}(null) ?{core::double*} let final core::double* #t305 = self::getDouble() in let final void #t306 = #t302.{self::Test::[]=}(#t303, #t305) in #t305 : #t304;
+  core::double* v7 = let final self::Test<core::double*, core::num*>* #t307 = t in let final core::String* #t308 = "x" in let final core::double* #t309 = #t307.{self::Test::[]}(#t308).{core::double::+}(self::getInt()) in let final void #t310 = #t307.{self::Test::[]=}(#t308, #t309) in #t309;
+  core::double* v8 = let final self::Test<core::double*, core::num*>* #t311 = t in let final core::String* #t312 = "x" in let final core::double* #t313 = #t311.{self::Test::[]}(#t312).{core::double::+}(self::getNum()) in let final void #t314 = #t311.{self::Test::[]=}(#t312, #t313) in #t313;
+  core::double* v9 = let final self::Test<core::double*, core::num*>* #t315 = t in let final core::String* #t316 = "x" in let final core::double* #t317 = #t315.{self::Test::[]}(#t316).{core::double::+}(self::getDouble()) in let final void #t318 = #t315.{self::Test::[]=}(#t316, #t317) in #t317;
+  core::double* v10 = let final self::Test<core::double*, core::num*>* #t319 = t in let final core::String* #t320 = "x" in let final core::double* #t321 = #t319.{self::Test::[]}(#t320).{core::double::+}(1) in let final void #t322 = #t319.{self::Test::[]=}(#t320, #t321) in #t321;
+  core::double* v11 = let final self::Test<core::double*, core::num*>* #t323 = t in let final core::String* #t324 = "x" in let final core::double* #t325 = #t323.{self::Test::[]}(#t324) in let final void #t326 = #t323.{self::Test::[]=}(#t324, #t325.{core::double::+}(1)) in #t325;
 }
-static method test9(self::Test<core::double, core::double> t) → void {
-  core::num v2 = let final self::Test<core::double, core::double> #t327 = t in let final core::String #t328 = "x" in let final core::num #t329 = self::getNum() as{TypeError} core::double in let final void #t330 = #t327.{self::Test::[]=}(#t328, #t329) in #t329;
-  core::double v3 = let final self::Test<core::double, core::double> #t331 = t in let final core::String #t332 = "x" in let final core::double #t333 = self::getDouble() in let final void #t334 = #t331.{self::Test::[]=}(#t332, #t333) in #t333;
-  core::num v5 = let final self::Test<core::double, core::double> #t335 = t in let final core::String #t336 = "x" in let final core::double #t337 = #t335.{self::Test::[]}(#t336) in #t337.{core::num::==}(null) ?{core::num} let final core::num #t338 = self::getNum() as{TypeError} core::double in let final void #t339 = #t335.{self::Test::[]=}(#t336, #t338) in #t338 : #t337;
-  core::double v6 = let final self::Test<core::double, core::double> #t340 = t in let final core::String #t341 = "x" in let final core::double #t342 = #t340.{self::Test::[]}(#t341) in #t342.{core::num::==}(null) ?{core::double} let final core::double #t343 = self::getDouble() in let final void #t344 = #t340.{self::Test::[]=}(#t341, #t343) in #t343 : #t342;
-  core::double v7 = let final self::Test<core::double, core::double> #t345 = t in let final core::String #t346 = "x" in let final core::double #t347 = #t345.{self::Test::[]}(#t346).{core::double::+}(self::getInt()) in let final void #t348 = #t345.{self::Test::[]=}(#t346, #t347) in #t347;
-  core::double v8 = let final self::Test<core::double, core::double> #t349 = t in let final core::String #t350 = "x" in let final core::double #t351 = #t349.{self::Test::[]}(#t350).{core::double::+}(self::getNum()) in let final void #t352 = #t349.{self::Test::[]=}(#t350, #t351) in #t351;
-  core::double v9 = let final self::Test<core::double, core::double> #t353 = t in let final core::String #t354 = "x" in let final core::double #t355 = #t353.{self::Test::[]}(#t354).{core::double::+}(self::getDouble()) in let final void #t356 = #t353.{self::Test::[]=}(#t354, #t355) in #t355;
-  core::double v10 = let final self::Test<core::double, core::double> #t357 = t in let final core::String #t358 = "x" in let final core::double #t359 = #t357.{self::Test::[]}(#t358).{core::double::+}(1) in let final void #t360 = #t357.{self::Test::[]=}(#t358, #t359) in #t359;
-  core::double v11 = let final self::Test<core::double, core::double> #t361 = t in let final core::String #t362 = "x" in let final core::double #t363 = #t361.{self::Test::[]}(#t362) in let final void #t364 = #t361.{self::Test::[]=}(#t362, #t363.{core::double::+}(1)) in #t363;
+static method test9(self::Test<core::double*, core::double*>* t) → void {
+  core::num* v2 = let final self::Test<core::double*, core::double*>* #t327 = t in let final core::String* #t328 = "x" in let final core::num* #t329 = self::getNum() as{TypeError} core::double* in let final void #t330 = #t327.{self::Test::[]=}(#t328, #t329) in #t329;
+  core::double* v3 = let final self::Test<core::double*, core::double*>* #t331 = t in let final core::String* #t332 = "x" in let final core::double* #t333 = self::getDouble() in let final void #t334 = #t331.{self::Test::[]=}(#t332, #t333) in #t333;
+  core::num* v5 = let final self::Test<core::double*, core::double*>* #t335 = t in let final core::String* #t336 = "x" in let final core::double* #t337 = #t335.{self::Test::[]}(#t336) in #t337.{core::num::==}(null) ?{core::num*} let final core::num* #t338 = self::getNum() as{TypeError} core::double* in let final void #t339 = #t335.{self::Test::[]=}(#t336, #t338) in #t338 : #t337;
+  core::double* v6 = let final self::Test<core::double*, core::double*>* #t340 = t in let final core::String* #t341 = "x" in let final core::double* #t342 = #t340.{self::Test::[]}(#t341) in #t342.{core::num::==}(null) ?{core::double*} let final core::double* #t343 = self::getDouble() in let final void #t344 = #t340.{self::Test::[]=}(#t341, #t343) in #t343 : #t342;
+  core::double* v7 = let final self::Test<core::double*, core::double*>* #t345 = t in let final core::String* #t346 = "x" in let final core::double* #t347 = #t345.{self::Test::[]}(#t346).{core::double::+}(self::getInt()) in let final void #t348 = #t345.{self::Test::[]=}(#t346, #t347) in #t347;
+  core::double* v8 = let final self::Test<core::double*, core::double*>* #t349 = t in let final core::String* #t350 = "x" in let final core::double* #t351 = #t349.{self::Test::[]}(#t350).{core::double::+}(self::getNum()) in let final void #t352 = #t349.{self::Test::[]=}(#t350, #t351) in #t351;
+  core::double* v9 = let final self::Test<core::double*, core::double*>* #t353 = t in let final core::String* #t354 = "x" in let final core::double* #t355 = #t353.{self::Test::[]}(#t354).{core::double::+}(self::getDouble()) in let final void #t356 = #t353.{self::Test::[]=}(#t354, #t355) in #t355;
+  core::double* v10 = let final self::Test<core::double*, core::double*>* #t357 = t in let final core::String* #t358 = "x" in let final core::double* #t359 = #t357.{self::Test::[]}(#t358).{core::double::+}(1) in let final void #t360 = #t357.{self::Test::[]=}(#t358, #t359) in #t359;
+  core::double* v11 = let final self::Test<core::double*, core::double*>* #t361 = t in let final core::String* #t362 = "x" in let final core::double* #t363 = #t361.{self::Test::[]}(#t362) in let final void #t364 = #t361.{self::Test::[]=}(#t362, #t363.{core::double::+}(1)) in #t363;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
index c482b93..ab2cac0 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart
@@ -20,20 +20,20 @@
 
 void test() {
   B local;
-  local = /*@typeArgs=B*/ f();
-  local ??= /*@typeArgs=B*/ f();
-  local += /*@typeArgs=dynamic*/ f();
-  local *= /*@typeArgs=dynamic*/ f();
-  local &= /*@typeArgs=dynamic*/ f();
+  local = /*@ typeArgs=B* */ f();
+  local ??= /*@ typeArgs=B* */ f();
+  local += /*@ typeArgs=dynamic */ f();
+  local *= /*@ typeArgs=dynamic */ f();
+  local &= /*@ typeArgs=dynamic */ f();
   --local;
   local--;
-  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
-  var /*@type=A*/ v3 = local += /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --local;
-  var /*@type=B*/ v7 = local--;
+  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = local ??= /*@ typeArgs=B* */ f();
+  var /*@ type=A* */ v3 = local += /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v4 = local *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = local &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --local;
+  var /*@ type=B* */ v7 = local--;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect
index 73cabe2..93ed918 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
-  self::B local;
+  self::B* local;
   local = self::f<dynamic>();
   local.==(null) ? local = self::f<dynamic>() : null;
   local = local.+(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect
index 73cabe2..93ed918 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.legacy.transformed.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
-  self::B local;
+  self::B* local;
   local = self::f<dynamic>();
   local.==(null) ? local = self::f<dynamic>() : null;
   local = local.+(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
index 59620a1..228191e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.outline.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
index 17865ed..0330af0 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : null;
-  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B* local;
+  local = self::f<self::B*>();
+  local.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   local = local.{self::B::-}(1);
   local = local.{self::B::-}(1);
-  self::B v1 = local = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = local in #t1.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : #t1;
-  self::A v3 = local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = local = local.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = local in let final self::B #t3 = local = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::A* v3 = local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = local = local.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1) in #t2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
index 17865ed..0330af0 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.strong.transformed.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : null;
-  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B* local;
+  local = self::f<self::B*>();
+  local.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : null;
+  local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   local = local.{self::B::-}(1);
   local = local.{self::B::-}(1);
-  self::B v1 = local = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = local in #t1.{core::Object::==}(null) ?{self::B} local = self::f<self::B>() : #t1;
-  self::A v3 = local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = local = local.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = local in let final self::B #t3 = local = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = local = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = local in #t1.{core::Object::==}(null) ?{self::B*} local = self::f<self::B*>() : #t1;
+  self::A* v3 = local = local.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = local = local.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = local = local.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = local = local.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = local in let final self::B* #t3 = local = #t2.{self::B::-}(1) in #t2;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
index ca45342..aa57cf4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local.dart.type_promotion.expect
@@ -1,17 +1,17 @@
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:23:9: Context: Write to local@474
-  local = /*@typeArgs=B*/ f();
+  local = /*@ typeArgs=B* */ f();
         ^
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:24:9: Context: Write to local@474
-  local ??= /*@typeArgs=B*/ f();
+  local ??= /*@ typeArgs=B* */ f();
         ^^^
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:25:9: Context: Write to local@474
-  local += /*@typeArgs=dynamic*/ f();
+  local += /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:26:9: Context: Write to local@474
-  local *= /*@typeArgs=dynamic*/ f();
+  local *= /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:27:9: Context: Write to local@474
-  local &= /*@typeArgs=dynamic*/ f();
+  local &= /*@ typeArgs=dynamic */ f();
         ^^
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:28:3: Context: Write to local@474
   --local;
@@ -19,24 +19,24 @@
 pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:29:8: Context: Write to local@474
   local--;
        ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:30:30: Context: Write to local@474
-  var /*@type=B*/ v1 = local = /*@typeArgs=B*/ f();
-                             ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:31:30: Context: Write to local@474
-  var /*@type=B*/ v2 = local ??= /*@typeArgs=B*/ f();
-                             ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:32:30: Context: Write to local@474
-  var /*@type=A*/ v3 = local += /*@typeArgs=dynamic*/ f();
-                             ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:33:30: Context: Write to local@474
-  var /*@type=B*/ v4 = local *= /*@typeArgs=dynamic*/ f();
-                             ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:34:30: Context: Write to local@474
-  var /*@type=C*/ v5 = local &= /*@typeArgs=dynamic*/ f();
-                             ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:35:24: Context: Write to local@474
-  var /*@type=B*/ v6 = --local;
-                       ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:36:29: Context: Write to local@474
-  var /*@type=B*/ v7 = local--;
-                            ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:30:33: Context: Write to local@474
+  var /*@ type=B* */ v1 = local = /*@ typeArgs=B* */ f();
+                                ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:31:33: Context: Write to local@474
+  var /*@ type=B* */ v2 = local ??= /*@ typeArgs=B* */ f();
+                                ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:32:33: Context: Write to local@474
+  var /*@ type=A* */ v3 = local += /*@ typeArgs=dynamic */ f();
+                                ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:33:33: Context: Write to local@474
+  var /*@ type=B* */ v4 = local *= /*@ typeArgs=dynamic */ f();
+                                ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:34:33: Context: Write to local@474
+  var /*@ type=C* */ v5 = local &= /*@ typeArgs=dynamic */ f();
+                                ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:35:27: Context: Write to local@474
+  var /*@ type=B* */ v6 = --local;
+                          ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local.dart:36:32: Context: Write to local@474
+  var /*@ type=B* */ v7 = local--;
+                               ^^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
index c2526a2..62bba51 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart
@@ -10,40 +10,40 @@
 double getDouble() => 0.0;
 
 void test1(int t) {
-  var /*@type=int*/ v1 = t = getInt();
-  var /*@type=num*/ v2 = t = getNum();
-  var /*@type=int*/ v4 = t ??= getInt();
-  var /*@type=num*/ v5 = t ??= getNum();
-  var /*@type=int*/ v7 = t += getInt();
-  var /*@type=num*/ v8 = t += getNum();
-  var /*@type=int*/ v10 = ++t;
-  var /*@type=int*/ v11 = t++;
+  var /*@ type=int* */ v1 = t = getInt();
+  var /*@ type=num* */ v2 = t = getNum();
+  var /*@ type=int* */ v4 = t ??= getInt();
+  var /*@ type=num* */ v5 = t ??= getNum();
+  var /*@ type=int* */ v7 = t += getInt();
+  var /*@ type=num* */ v8 = t += getNum();
+  var /*@ type=int* */ v10 = ++t;
+  var /*@ type=int* */ v11 = t++;
 }
 
 void test2(num t) {
-  var /*@type=int*/ v1 = t = getInt();
-  var /*@type=num*/ v2 = t = getNum();
-  var /*@type=double*/ v3 = t = getDouble();
-  var /*@type=num*/ v4 = t ??= getInt();
-  var /*@type=num*/ v5 = t ??= getNum();
-  var /*@type=num*/ v6 = t ??= getDouble();
-  var /*@type=num*/ v7 = t += getInt();
-  var /*@type=num*/ v8 = t += getNum();
-  var /*@type=num*/ v9 = t += getDouble();
-  var /*@type=num*/ v10 = ++t;
-  var /*@type=num*/ v11 = t++;
+  var /*@ type=int* */ v1 = t = getInt();
+  var /*@ type=num* */ v2 = t = getNum();
+  var /*@ type=double* */ v3 = t = getDouble();
+  var /*@ type=num* */ v4 = t ??= getInt();
+  var /*@ type=num* */ v5 = t ??= getNum();
+  var /*@ type=num* */ v6 = t ??= getDouble();
+  var /*@ type=num* */ v7 = t += getInt();
+  var /*@ type=num* */ v8 = t += getNum();
+  var /*@ type=num* */ v9 = t += getDouble();
+  var /*@ type=num* */ v10 = ++t;
+  var /*@ type=num* */ v11 = t++;
 }
 
 void test3(double t) {
-  var /*@type=num*/ v2 = t = getNum();
-  var /*@type=double*/ v3 = t = getDouble();
-  var /*@type=num*/ v5 = t ??= getNum();
-  var /*@type=double*/ v6 = t ??= getDouble();
-  var /*@type=double*/ v7 = t += getInt();
-  var /*@type=double*/ v8 = t += getNum();
-  var /*@type=double*/ v9 = t += getDouble();
-  var /*@type=double*/ v10 = ++t;
-  var /*@type=double*/ v11 = t++;
+  var /*@ type=num* */ v2 = t = getNum();
+  var /*@ type=double* */ v3 = t = getDouble();
+  var /*@ type=num* */ v5 = t ??= getNum();
+  var /*@ type=double* */ v6 = t ??= getDouble();
+  var /*@ type=double* */ v7 = t += getInt();
+  var /*@ type=double* */ v8 = t += getNum();
+  var /*@ type=double* */ v9 = t += getDouble();
+  var /*@ type=double* */ v10 = ++t;
+  var /*@ type=double* */ v11 = t++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect
index 4b844cb..802d524 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(core::int t) → void {
+static method test1(core::int* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v4 = let final dynamic #t1 = t in #t1.==(null) ? t = self::getInt() : #t1;
@@ -18,7 +18,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t3 = t in let final dynamic #t4 = t = #t3.+(1) in #t3;
 }
-static method test2(core::num t) → void {
+static method test2(core::num* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
@@ -31,7 +31,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t8 = t in let final dynamic #t9 = t = #t8.+(1) in #t8;
 }
-static method test3(core::double t) → void {
+static method test3(core::double* t) → void {
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
   dynamic v5 = let final dynamic #t10 = t in #t10.==(null) ? t = self::getNum() : #t10;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect
index 4b844cb..802d524 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
-static method test1(core::int t) → void {
+static method test1(core::int* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v4 = let final dynamic #t1 = t in #t1.==(null) ? t = self::getInt() : #t1;
@@ -18,7 +18,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t3 = t in let final dynamic #t4 = t = #t3.+(1) in #t3;
 }
-static method test2(core::num t) → void {
+static method test2(core::num* t) → void {
   dynamic v1 = t = self::getInt();
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
@@ -31,7 +31,7 @@
   dynamic v10 = t = t.+(1);
   dynamic v11 = let final dynamic #t8 = t in let final dynamic #t9 = t = #t8.+(1) in #t8;
 }
-static method test3(core::double t) → void {
+static method test3(core::double* t) → void {
   dynamic v2 = t = self::getNum();
   dynamic v3 = t = self::getDouble();
   dynamic v5 = let final dynamic #t10 = t in #t10.==(null) ? t = self::getNum() : #t10;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.outline.expect
index f23d55d8..d53fd7b 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
-static method test1(core::int t) → void
+static method test1(core::int* t) → void
   ;
-static method test2(core::num t) → void
+static method test2(core::num* t) → void
   ;
-static method test3(core::double t) → void
+static method test3(core::double* t) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.expect
index d32aa54..a799b0f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.expect
@@ -2,44 +2,44 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} t = self::getInt() : #t1;
-  core::num v5 = let final core::int #t2 = t in #t2.{core::num::==}(null) ?{core::num} t = self::getNum() as{TypeError} core::int : #t2;
-  core::int v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum()) as{TypeError} core::int;
-  core::int v10 = t = t.{core::num::+}(1);
-  core::int v11 = let final core::int #t3 = t in let final core::int #t4 = t = #t3.{core::num::+}(1) in #t3;
+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.{core::num::==}(null) ?{core::int*} t = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = t in #t2.{core::num::==}(null) ?{core::num*} t = self::getNum() as{TypeError} core::int* : #t2;
+  core::int* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+  core::int* v10 = t = t.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t3 = t in let final core::int* #t4 = t = #t3.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getInt() : #t5;
-  core::num v5 = let final core::num #t6 = t in #t6.{core::num::==}(null) ?{core::num} t = self::getNum() : #t6;
-  core::num v6 = let final core::num #t7 = t in #t7.{core::num::==}(null) ?{core::num} t = self::getDouble() : #t7;
-  core::num v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum());
-  core::num v9 = t = t.{core::num::+}(self::getDouble());
-  core::num v10 = t = t.{core::num::+}(1);
-  core::num v11 = let final core::num #t8 = t in let final core::num #t9 = t = #t8.{core::num::+}(1) in #t8;
+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.{core::num::==}(null) ?{core::num*} t = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = t in #t6.{core::num::==}(null) ?{core::num*} t = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = t in #t7.{core::num::==}(null) ?{core::num*} t = self::getDouble() : #t7;
+  core::num* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum());
+  core::num* v9 = t = t.{core::num::+}(self::getDouble());
+  core::num* v10 = t = t.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t8 = t in let final core::num* #t9 = t = #t8.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getNum() as{TypeError} core::double : #t10;
-  core::double v6 = let final core::double #t11 = t in #t11.{core::num::==}(null) ?{core::double} t = self::getDouble() : #t11;
-  core::double v7 = t = t.{core::double::+}(self::getInt());
-  core::double v8 = t = t.{core::double::+}(self::getNum());
-  core::double v9 = t = t.{core::double::+}(self::getDouble());
-  core::double v10 = t = t.{core::double::+}(1);
-  core::double v11 = let final core::double #t12 = t in let final core::double #t13 = t = #t12.{core::double::+}(1) in #t12;
+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.{core::num::==}(null) ?{core::num*} t = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = t in #t11.{core::num::==}(null) ?{core::double*} t = self::getDouble() : #t11;
+  core::double* v7 = t = t.{core::double::+}(self::getInt());
+  core::double* v8 = t = t.{core::double::+}(self::getNum());
+  core::double* v9 = t = t.{core::double::+}(self::getDouble());
+  core::double* v10 = t = t.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t12 = t in let final core::double* #t13 = t = #t12.{core::double::+}(1) in #t12;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.transformed.expect
index d32aa54..a799b0f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.strong.transformed.expect
@@ -2,44 +2,44 @@
 import self as self;
 import "dart:core" as core;
 
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} t = self::getInt() : #t1;
-  core::num v5 = let final core::int #t2 = t in #t2.{core::num::==}(null) ?{core::num} t = self::getNum() as{TypeError} core::int : #t2;
-  core::int v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum()) as{TypeError} core::int;
-  core::int v10 = t = t.{core::num::+}(1);
-  core::int v11 = let final core::int #t3 = t in let final core::int #t4 = t = #t3.{core::num::+}(1) in #t3;
+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.{core::num::==}(null) ?{core::int*} t = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = t in #t2.{core::num::==}(null) ?{core::num*} t = self::getNum() as{TypeError} core::int* : #t2;
+  core::int* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+  core::int* v10 = t = t.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t3 = t in let final core::int* #t4 = t = #t3.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getInt() : #t5;
-  core::num v5 = let final core::num #t6 = t in #t6.{core::num::==}(null) ?{core::num} t = self::getNum() : #t6;
-  core::num v6 = let final core::num #t7 = t in #t7.{core::num::==}(null) ?{core::num} t = self::getDouble() : #t7;
-  core::num v7 = t = t.{core::num::+}(self::getInt());
-  core::num v8 = t = t.{core::num::+}(self::getNum());
-  core::num v9 = t = t.{core::num::+}(self::getDouble());
-  core::num v10 = t = t.{core::num::+}(1);
-  core::num v11 = let final core::num #t8 = t in let final core::num #t9 = t = #t8.{core::num::+}(1) in #t8;
+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.{core::num::==}(null) ?{core::num*} t = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = t in #t6.{core::num::==}(null) ?{core::num*} t = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = t in #t7.{core::num::==}(null) ?{core::num*} t = self::getDouble() : #t7;
+  core::num* v7 = t = t.{core::num::+}(self::getInt());
+  core::num* v8 = t = t.{core::num::+}(self::getNum());
+  core::num* v9 = t = t.{core::num::+}(self::getDouble());
+  core::num* v10 = t = t.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t8 = t in let final core::num* #t9 = t = #t8.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} t = self::getNum() as{TypeError} core::double : #t10;
-  core::double v6 = let final core::double #t11 = t in #t11.{core::num::==}(null) ?{core::double} t = self::getDouble() : #t11;
-  core::double v7 = t = t.{core::double::+}(self::getInt());
-  core::double v8 = t = t.{core::double::+}(self::getNum());
-  core::double v9 = t = t.{core::double::+}(self::getDouble());
-  core::double v10 = t = t.{core::double::+}(1);
-  core::double v11 = let final core::double #t12 = t in let final core::double #t13 = t = #t12.{core::double::+}(1) in #t12;
+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.{core::num::==}(null) ?{core::num*} t = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = t in #t11.{core::num::==}(null) ?{core::double*} t = self::getDouble() : #t11;
+  core::double* v7 = t = t.{core::double::+}(self::getInt());
+  core::double* v8 = t = t.{core::double::+}(self::getNum());
+  core::double* v9 = t = t.{core::double::+}(self::getDouble());
+  core::double* v10 = t = t.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t12 = t in let final core::double* #t13 = t = #t12.{core::double::+}(1) in #t12;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
index b6c751d..54a1aba 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart.type_promotion.expect
@@ -1,84 +1,84 @@
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:13:28: Context: Write to t@343
-  var /*@type=int*/ v1 = t = getInt();
-                           ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:14:28: Context: Write to t@343
-  var /*@type=num*/ v2 = t = getNum();
-                           ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:15:28: Context: Write to t@343
-  var /*@type=int*/ v4 = t ??= getInt();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:16:28: Context: Write to t@343
-  var /*@type=num*/ v5 = t ??= getNum();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:17:28: Context: Write to t@343
-  var /*@type=int*/ v7 = t += getInt();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:18:28: Context: Write to t@343
-  var /*@type=num*/ v8 = t += getNum();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:19:27: Context: Write to t@343
-  var /*@type=int*/ v10 = ++t;
-                          ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:20:28: Context: Write to t@343
-  var /*@type=int*/ v11 = t++;
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:24:28: Context: Write to t@343
-  var /*@type=int*/ v1 = t = getInt();
-                           ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:25:28: Context: Write to t@343
-  var /*@type=num*/ v2 = t = getNum();
-                           ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:26:31: Context: Write to t@343
-  var /*@type=double*/ v3 = t = getDouble();
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:13:31: Context: Write to t@343
+  var /*@ type=int* */ v1 = t = getInt();
                               ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:27:28: Context: Write to t@343
-  var /*@type=num*/ v4 = t ??= getInt();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:28:28: Context: Write to t@343
-  var /*@type=num*/ v5 = t ??= getNum();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:29:28: Context: Write to t@343
-  var /*@type=num*/ v6 = t ??= getDouble();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:30:28: Context: Write to t@343
-  var /*@type=num*/ v7 = t += getInt();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:31:28: Context: Write to t@343
-  var /*@type=num*/ v8 = t += getNum();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:32:28: Context: Write to t@343
-  var /*@type=num*/ v9 = t += getDouble();
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:33:27: Context: Write to t@343
-  var /*@type=num*/ v10 = ++t;
-                          ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:34:28: Context: Write to t@343
-  var /*@type=num*/ v11 = t++;
-                           ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:38:28: Context: Write to t@343
-  var /*@type=num*/ v2 = t = getNum();
-                           ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:39:31: Context: Write to t@343
-  var /*@type=double*/ v3 = t = getDouble();
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:14:31: Context: Write to t@343
+  var /*@ type=num* */ v2 = t = getNum();
                               ^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:40:28: Context: Write to t@343
-  var /*@type=num*/ v5 = t ??= getNum();
-                           ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:41:31: Context: Write to t@343
-  var /*@type=double*/ v6 = t ??= getDouble();
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:15:31: Context: Write to t@343
+  var /*@ type=int* */ v4 = t ??= getInt();
                               ^^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:42:31: Context: Write to t@343
-  var /*@type=double*/ v7 = t += getInt();
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:16:31: Context: Write to t@343
+  var /*@ type=num* */ v5 = t ??= getNum();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:17:31: Context: Write to t@343
+  var /*@ type=int* */ v7 = t += getInt();
                               ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:43:31: Context: Write to t@343
-  var /*@type=double*/ v8 = t += getNum();
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:18:31: Context: Write to t@343
+  var /*@ type=num* */ v8 = t += getNum();
                               ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:44:31: Context: Write to t@343
-  var /*@type=double*/ v9 = t += getDouble();
-                              ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:45:30: Context: Write to t@343
-  var /*@type=double*/ v10 = ++t;
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:19:30: Context: Write to t@343
+  var /*@ type=int* */ v10 = ++t;
                              ^^
-pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:46:31: Context: Write to t@343
-  var /*@type=double*/ v11 = t++;
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:20:31: Context: Write to t@343
+  var /*@ type=int* */ v11 = t++;
                               ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:24:31: Context: Write to t@343
+  var /*@ type=int* */ v1 = t = getInt();
+                              ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:25:31: Context: Write to t@343
+  var /*@ type=num* */ v2 = t = getNum();
+                              ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:26:34: Context: Write to t@343
+  var /*@ type=double* */ v3 = t = getDouble();
+                                 ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:27:31: Context: Write to t@343
+  var /*@ type=num* */ v4 = t ??= getInt();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:28:31: Context: Write to t@343
+  var /*@ type=num* */ v5 = t ??= getNum();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:29:31: Context: Write to t@343
+  var /*@ type=num* */ v6 = t ??= getDouble();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:30:31: Context: Write to t@343
+  var /*@ type=num* */ v7 = t += getInt();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:31:31: Context: Write to t@343
+  var /*@ type=num* */ v8 = t += getNum();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:32:31: Context: Write to t@343
+  var /*@ type=num* */ v9 = t += getDouble();
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:33:30: Context: Write to t@343
+  var /*@ type=num* */ v10 = ++t;
+                             ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:34:31: Context: Write to t@343
+  var /*@ type=num* */ v11 = t++;
+                              ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:38:31: Context: Write to t@343
+  var /*@ type=num* */ v2 = t = getNum();
+                              ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:39:34: Context: Write to t@343
+  var /*@ type=double* */ v3 = t = getDouble();
+                                 ^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:40:31: Context: Write to t@343
+  var /*@ type=num* */ v5 = t ??= getNum();
+                              ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:41:34: Context: Write to t@343
+  var /*@ type=double* */ v6 = t ??= getDouble();
+                                 ^^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:42:34: Context: Write to t@343
+  var /*@ type=double* */ v7 = t += getInt();
+                                 ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:43:34: Context: Write to t@343
+  var /*@ type=double* */ v8 = t += getNum();
+                                 ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:44:34: Context: Write to t@343
+  var /*@ type=double* */ v9 = t += getDouble();
+                                 ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:45:33: Context: Write to t@343
+  var /*@ type=double* */ v10 = ++t;
+                                ^^
+pkg/front_end/testcases/inference_new/infer_assign_to_local_upwards.dart:46:34: Context: Write to t@343
+  var /*@ type=double* */ v11 = t++;
+                                 ^^
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect
index 25e51ee..2a9f8dd 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect
index 25e51ee..2a9f8dd 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.legacy.transformed.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
index 19d362f..30d498e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.outline.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f;
-  synthetic constructor •() → self::A
+  field core::int* f;
+  synthetic constructor •() → self::A*
     ;
 }
 static field dynamic v_assign;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.expect
index 2a5cd7b..b5cb604 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-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::num::+}(1);
-static field core::int v_minus = let final self::A #t2 = new self::A::•() in #t2.{self::A::f} = #t2.{self::A::f}.{core::num::-}(1);
-static field core::int v_multiply = let final self::A #t3 = new self::A::•() in #t3.{self::A::f} = #t3.{self::A::f}.{core::num::*}(1);
-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::num::+}(1);
-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::num::-}(1);
-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} in let final core::int #t8 = #t6.{self::A::f} = #t7.{core::num::+}(1) 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} in let final core::int #t11 = #t9.{self::A::f} = #t10.{core::num::-}(1) in #t10;
+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::num::+}(1);
+static field core::int* v_minus = let final self::A* #t2 = new self::A::•() in #t2.{self::A::f} = #t2.{self::A::f}.{core::num::-}(1);
+static field core::int* v_multiply = let final self::A* #t3 = new self::A::•() in #t3.{self::A::f} = #t3.{self::A::f}.{core::num::*}(1);
+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::num::+}(1);
+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::num::-}(1);
+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} in let final core::int* #t8 = #t6.{self::A::f} = #t7.{core::num::+}(1) 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} in let final core::int* #t11 = #t9.{self::A::f} = #t10.{core::num::-}(1) in #t10;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.transformed.expect
index 2a5cd7b..b5cb604 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-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::num::+}(1);
-static field core::int v_minus = let final self::A #t2 = new self::A::•() in #t2.{self::A::f} = #t2.{self::A::f}.{core::num::-}(1);
-static field core::int v_multiply = let final self::A #t3 = new self::A::•() in #t3.{self::A::f} = #t3.{self::A::f}.{core::num::*}(1);
-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::num::+}(1);
-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::num::-}(1);
-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} in let final core::int #t8 = #t6.{self::A::f} = #t7.{core::num::+}(1) 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} in let final core::int #t11 = #t9.{self::A::f} = #t10.{core::num::-}(1) in #t10;
+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::num::+}(1);
+static field core::int* v_minus = let final self::A* #t2 = new self::A::•() in #t2.{self::A::f} = #t2.{self::A::f}.{core::num::-}(1);
+static field core::int* v_multiply = let final self::A* #t3 = new self::A::•() in #t3.{self::A::f} = #t3.{self::A::f}.{core::num::*}(1);
+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::num::+}(1);
+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::num::-}(1);
+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} in let final core::int* #t8 = #t6.{self::A::f} = #t7.{core::num::+}(1) 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} in let final core::int* #t11 = #t9.{self::A::f} = #t10.{core::num::-}(1) in #t10;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect
index b286810..038f2f9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
 class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect
index b286810..038f2f9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.legacy.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
 class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
index 4dafd7f..abd1782 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.outline.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     ;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     ;
 }
 class B extends core::Object {
-  field self::A a;
-  synthetic constructor •() → self::B
+  field self::A* a;
+  synthetic constructor •() → self::B*
     ;
 }
 static field dynamic v_prefix_pp;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
index a3ccc64..dd9255e 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart.strong.expect
@@ -30,38 +30,38 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(dynamic other) → core::int
+  operator +(dynamic other) → core::int*
     return 1;
-  operator -(dynamic other) → core::double
+  operator -(dynamic other) → core::double*
     return 2.0;
 }
 class B extends core::Object {
-  field self::A a = null;
-  synthetic constructor •() → self::B
+  field self::A* a = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-static field core::int v_prefix_pp = let final self::B #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:20: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+static field core::int* v_prefix_pp = let final self::B* #t1 = new self::B::•() in #t1.{self::B::a} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:17:20: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var v_prefix_pp = (++new B(). /*@target=B::a*/ a);
-                   ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A;
-static field core::double v_prefix_mm = let final self::B #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:20: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+                   ^" in #t1.{self::B::a}.{self::A::+}(1) as{TypeError} self::A*;
+static field core::double* v_prefix_mm = let final self::B* #t3 = new self::B::•() in #t3.{self::B::a} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:18:20: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var v_prefix_mm = (--new B(). /*@target=B::a*/ a);
-                   ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A;
-static field self::A v_postfix_pp = let final self::B #t5 = new self::B::•() in let final self::A #t6 = #t5.{self::B::a} in let final core::int #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:48: Error: A value of type 'int' can't be assigned to a variable of type 'A'.
+                   ^" in #t3.{self::B::a}.{self::A::-}(1) as{TypeError} self::A*;
+static field self::A* v_postfix_pp = let final self::B* #t5 = new self::B::•() in let final self::A* #t6 = #t5.{self::B::a} in let final core::int* #t7 = #t5.{self::B::a} = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:19:48: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var v_postfix_pp = (new B(). /*@target=B::a*/ a++);
-                                               ^" in #t6.{self::A::+}(1) as{TypeError} self::A in #t6;
-static field self::A v_postfix_mm = let final self::B #t9 = new self::B::•() in let final self::A #t10 = #t9.{self::B::a} in let final core::double #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:48: Error: A value of type 'double' can't be assigned to a variable of type 'A'.
+                                               ^" in #t6.{self::A::+}(1) as{TypeError} self::A* in #t6;
+static field self::A* v_postfix_mm = let final self::B* #t9 = new self::B::•() in let final self::A* #t10 = #t9.{self::B::a} in let final core::double* #t11 = #t9.{self::B::a} = let final<BottomType> #t12 = invalid-expression "pkg/front_end/testcases/inference_new/infer_assign_to_property_custom.dart:20:48: 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'A'.
 var v_postfix_mm = (new B(). /*@target=B::a*/ a--);
-                                               ^" in #t10.{self::A::-}(1) as{TypeError} self::A in #t10;
+                                               ^" in #t10.{self::A::-}(1) as{TypeError} self::A* in #t10;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
index 1216d91..6a0d229 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart
@@ -22,25 +22,25 @@
   B member;
 
   static void test(Test t) {
-    t. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    t. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    t. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    t. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    t. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    t. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    t. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    t. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    t. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    t. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     --t. /*@target=Test::member*/ member;
     t. /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 =
-        t. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        t. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 =
-        t. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 =
-        t. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        t. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t. /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = t. /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 =
+        t. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        t. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 =
+        t. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 =
+        t. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        t. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t. /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = t. /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect
index 288eaf3..e4830c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     t.member = self::f<dynamic>();
     let final dynamic #t1 = t in #t1.member.==(null) ? #t1.member = self::f<dynamic>() : null;
     let final dynamic #t2 = t in #t2.member = #t2.member.+(self::f<dynamic>());
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t13 = t in let final dynamic #t14 = #t13.member in let final dynamic #t15 = #t13.member = #t14.-(1) in #t14;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.transformed.expect
index 288eaf3..e4830c2 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.legacy.transformed.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     t.member = self::f<dynamic>();
     let final dynamic #t1 = t in #t1.member.==(null) ? #t1.member = self::f<dynamic>() : null;
     let final dynamic #t2 = t in #t2.member = #t2.member.+(self::f<dynamic>());
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t13 = t in let final dynamic #t14 = #t13.member in let final dynamic #t15 = #t13.member = #t14.-(1) in #t14;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
index f40880f..b4e3259 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
-  static method test(self::Test t) → void
+  static method test(self::Test* t) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
index 13cffcf..74778b8 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    let final self::Test #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    let final self::Test #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    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} in #t8.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t13 = t in let final self::B #t14 = #t13.{self::Test::member} in let final self::B #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    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} in #t8.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t13 = t in let final self::B* #t14 = #t13.{self::Test::member} in let final self::B* #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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_full.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
index 13cffcf..74778b8 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_full.dart.strong.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    let final self::Test #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    let final self::Test #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    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} in #t8.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t13 = t in let final self::B #t14 = #t13.{self::Test::member} in let final self::B #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    let final self::Test* #t3 = t in #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    let final self::Test* #t4 = t in #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t5 = t in #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t6 = t in #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    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} in #t8.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t11 = t in #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t12 = t in #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t13 = t in let final self::B* #t14 = #t13.{self::Test::member} in let final self::B* #t15 = #t13.{self::Test::member} = #t14.{self::B::-}(1) in #t14;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
index 88f773a..45300f9 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart
@@ -22,25 +22,25 @@
   B member;
 
   static void test(Test t) {
-    t?. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    t?. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    t?. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    t?. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    t?. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
+    t?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
     --t?. /*@target=Test::member*/ member;
     t?. /*@target=Test::member*/ member--;
-    var /*@type=B*/ v1 =
-        t?. /*@target=Test::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        t?. /*@target=Test::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 =
-        t?. /*@target=Test::member*/ member += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 =
-        t?. /*@target=Test::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        t?. /*@target=Test::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --t?. /*@target=Test::member*/ member;
-    var /*@type=B*/ v7 = t?. /*@target=Test::member*/ member--;
+    var /*@ type=B* */ v1 =
+        t?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 =
+        t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 =
+        t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
+    var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect
index 13020c3..80c1b3f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     let final dynamic #t1 = t in #t1.==(null) ? null : #t1.member = self::f<dynamic>();
     let final dynamic #t2 = t in #t2.==(null) ? null : #t2.member.==(null) ? #t2.member = self::f<dynamic>() : null;
     let final dynamic #t3 = t in #t3.==(null) ? null : #t3.member = #t3.member.+(self::f<dynamic>());
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t15 = t in #t15.==(null) ? null : let final dynamic #t16 = #t15.member in let final dynamic #t17 = #t15.member = #t16.-(1) in #t16;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
index 13020c3..80c1b3f 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.legacy.transformed.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  field self::B* member = null;
+  synthetic constructor •() → self::Test*
     : super core::Object::•()
     ;
-  static method test(self::Test t) → void {
+  static method test(self::Test* t) → void {
     let final dynamic #t1 = t in #t1.==(null) ? null : #t1.member = self::f<dynamic>();
     let final dynamic #t2 = t in #t2.==(null) ? null : #t2.member.==(null) ? #t2.member = self::f<dynamic>() : null;
     let final dynamic #t3 = t in #t3.==(null) ? null : #t3.member = #t3.member.+(self::f<dynamic>());
@@ -47,6 +47,6 @@
     dynamic v7 = let final dynamic #t15 = t in #t15.==(null) ? null : let final dynamic #t16 = #t15.member in let final dynamic #t17 = #t15.member = #t16.-(1) in #t16;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
index f40880f..b4e3259 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Test extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Test
+  field self::B* member;
+  synthetic constructor •() → self::Test*
     ;
-  static method test(self::Test t) → void
+  static method test(self::Test* t) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
index 7e404e5..fdee8a4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t6 = t in #t6.==(null) ?{self::B} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t7 = t in #t7.==(null) ?{self::B} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = let final self::Test #t8 = t in #t8.==(null) ?{self::B} null : #t8.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::Test #t9 = t in #t9.==(null) ?{self::B} null : let final self::B #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B} #t9.{self::Test::member} = self::f<self::B>() : #t10;
-    self::A v3 = let final self::Test #t11 = t in #t11.==(null) ?{self::A} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = let final self::Test #t12 = t in #t12.==(null) ?{self::B} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t13 = t in #t13.==(null) ?{self::C} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t15 = t in #t15.==(null) ?{self::B} null : let final self::B #t16 = #t15.{self::Test::member} in let final self::B #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
+    self::B* v1 = let final self::Test* #t8 = t in #t8.==(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
+    self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
index 7e404e5..fdee8a4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware.dart.strong.transformed.expect
@@ -3,50 +3,50 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Test extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Test
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A);
-    let final self::Test #t6 = t in #t6.==(null) ?{self::B} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
-    let final self::Test #t7 = t in #t7.==(null) ?{self::B} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
-    self::B v1 = let final self::Test #t8 = t in #t8.==(null) ?{self::B} null : #t8.{self::Test::member} = self::f<self::B>();
-    self::B v2 = let final self::Test #t9 = t in #t9.==(null) ?{self::B} null : let final self::B #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B} #t9.{self::Test::member} = self::f<self::B>() : #t10;
-    self::A v3 = let final self::Test #t11 = t in #t11.==(null) ?{self::A} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = let final self::Test #t12 = t in #t12.==(null) ?{self::B} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = let final self::Test #t13 = t in #t13.==(null) ?{self::C} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = let final self::Test #t14 = t in #t14.==(null) ?{self::B} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
-    self::B v7 = let final self::Test #t15 = t in #t15.==(null) ?{self::B} null : let final self::B #t16 = #t15.{self::Test::member} in let final self::B #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
+  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}.{core::Object::==}(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::f<dynamic>() as{TypeError} self::C*) 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::f<dynamic>() as{TypeError} 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::f<dynamic>() as{TypeError} self::A*);
+    let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
+    let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
+    self::B* v1 = let final self::Test* #t8 = t in #t8.==(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
+    self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
+    self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
+    self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
index 5fe11e9..664ca78 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart
@@ -13,14 +13,14 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@type=int*/ v1 = t?. /*@target=Test1::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t?. /*@target=Test1::prop*/ prop = getNum();
-    var /*@type=int*/ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t?. /*@target=Test1::prop*/ prop ??= getNum();
-    var /*@type=int*/ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t?. /*@target=Test1::prop*/ prop += getNum();
-    var /*@type=int*/ v10 = ++t?. /*@target=Test1::prop*/ prop;
-    var /*@type=int*/ v11 = t?. /*@target=Test1::prop*/ prop++;
+    var /*@ type=int* */ v1 = t?. /*@target=Test1::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t?. /*@target=Test1::prop*/ prop = getNum();
+    var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t?. /*@target=Test1::prop*/ prop ??= getNum();
+    var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t?. /*@target=Test1::prop*/ prop += getNum();
+    var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
+    var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
   }
 }
 
@@ -28,17 +28,17 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@type=int*/ v1 = t?. /*@target=Test2::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t?. /*@target=Test2::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t?. /*@target=Test2::prop*/ prop = getDouble();
-    var /*@type=num*/ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
-    var /*@type=num*/ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
-    var /*@type=num*/ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
-    var /*@type=num*/ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
-    var /*@type=num*/ v10 = ++t?. /*@target=Test2::prop*/ prop;
-    var /*@type=num*/ v11 = t?. /*@target=Test2::prop*/ prop++;
+    var /*@ type=int* */ v1 = t?. /*@target=Test2::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t?. /*@target=Test2::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t?. /*@target=Test2::prop*/ prop = getDouble();
+    var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
+    var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
+    var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
+    var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
+    var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
+    var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
   }
 }
 
@@ -46,15 +46,15 @@
   double prop;
 
   static void test3(Test3 t) {
-    var /*@type=num*/ v2 = t?. /*@target=Test3::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t?. /*@target=Test3::prop*/ prop = getDouble();
-    var /*@type=num*/ v5 = t?. /*@target=Test3::prop*/ prop ??= getNum();
-    var /*@type=double*/ v6 = t?. /*@target=Test3::prop*/ prop ??= getDouble();
-    var /*@type=double*/ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
-    var /*@type=double*/ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
-    var /*@type=double*/ v9 = t?. /*@target=Test3::prop*/ prop += getDouble();
-    var /*@type=double*/ v10 = ++t?. /*@target=Test3::prop*/ prop;
-    var /*@type=double*/ v11 = t?. /*@target=Test3::prop*/ prop++;
+    var /*@ type=num* */ v2 = t?. /*@target=Test3::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t?. /*@target=Test3::prop*/ prop = getDouble();
+    var /*@ type=num* */ v5 = t?. /*@target=Test3::prop*/ prop ??= getNum();
+    var /*@ type=double* */ v6 = t?. /*@target=Test3::prop*/ prop ??= getDouble();
+    var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
+    var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
+    var /*@ type=double* */ v9 = t?. /*@target=Test3::prop*/ prop += getDouble();
+    var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
+    var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
index bfd029a..72b447d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = let final dynamic #t1 = t in #t1.==(null) ? null : #t1.prop = self::getInt();
     dynamic v2 = let final dynamic #t2 = t in #t2.==(null) ? null : #t2.prop = self::getNum();
     dynamic v4 = let final dynamic #t3 = t in #t3.==(null) ? null : let final dynamic #t4 = #t3.prop in #t4.==(null) ? #t3.prop = self::getInt() : #t4;
@@ -19,11 +19,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = let final dynamic #t13 = t in #t13.==(null) ? null : #t13.prop = self::getInt();
     dynamic v2 = let final dynamic #t14 = t in #t14.==(null) ? null : #t14.prop = self::getNum();
     dynamic v3 = let final dynamic #t15 = t in #t15.==(null) ? null : #t15.prop = self::getDouble();
@@ -38,11 +38,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v2 = let final dynamic #t29 = t in #t29.==(null) ? null : #t29.prop = self::getNum();
     dynamic v3 = let final dynamic #t30 = t in #t30.==(null) ? null : #t30.prop = self::getDouble();
     dynamic v5 = let final dynamic #t31 = t in #t31.==(null) ? null : let final dynamic #t32 = #t31.prop in #t32.==(null) ? #t31.prop = self::getNum() : #t32;
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t39 = t in #t39.==(null) ? null : let final dynamic #t40 = #t39.prop in let final dynamic #t41 = #t39.prop = #t40.+(1) in #t40;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_null_aware_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
index bfd029a..72b447d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = let final dynamic #t1 = t in #t1.==(null) ? null : #t1.prop = self::getInt();
     dynamic v2 = let final dynamic #t2 = t in #t2.==(null) ? null : #t2.prop = self::getNum();
     dynamic v4 = let final dynamic #t3 = t in #t3.==(null) ? null : let final dynamic #t4 = #t3.prop in #t4.==(null) ? #t3.prop = self::getInt() : #t4;
@@ -19,11 +19,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = let final dynamic #t13 = t in #t13.==(null) ? null : #t13.prop = self::getInt();
     dynamic v2 = let final dynamic #t14 = t in #t14.==(null) ? null : #t14.prop = self::getNum();
     dynamic v3 = let final dynamic #t15 = t in #t15.==(null) ? null : #t15.prop = self::getDouble();
@@ -38,11 +38,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v2 = let final dynamic #t29 = t in #t29.==(null) ? null : #t29.prop = self::getNum();
     dynamic v3 = let final dynamic #t30 = t in #t30.==(null) ? null : #t30.prop = self::getDouble();
     dynamic v5 = let final dynamic #t31 = t in #t31.==(null) ? null : let final dynamic #t32 = #t31.prop in #t32.==(null) ? #t31.prop = self::getNum() : #t32;
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t39 = t in #t39.==(null) ? null : let final dynamic #t40 = #t39.prop in let final dynamic #t41 = #t39.prop = #t40.+(1) in #t40;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_null_aware_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.outline.expect
index eaa82b5..2203088 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop;
-  synthetic constructor •() → self::Test1
+  field core::int* prop;
+  synthetic constructor •() → self::Test1*
     ;
-  static method test(self::Test1 t) → void
+  static method test(self::Test1* t) → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num prop;
-  synthetic constructor •() → self::Test2
+  field core::num* prop;
+  synthetic constructor •() → self::Test2*
     ;
-  static method test(self::Test2 t) → void
+  static method test(self::Test2* t) → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double prop;
-  synthetic constructor •() → self::Test3
+  field core::double* prop;
+  synthetic constructor •() → self::Test3*
     ;
-  static method test3(self::Test3 t) → void
+  static method test3(self::Test3* t) → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.expect
index 795fa0c..35c7161 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t4.{core::num::==}(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} in #t6.{core::num::==}(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 : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test1 #t8 = t in #t8.==(null) ?{core::num} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = let final self::Test1 #t9 = t in #t9.==(null) ?{core::int} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t10 = t in #t10.==(null) ?{core::int} null : let final core::int #t11 = #t10.{self::Test1::prop} in let final core::int #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
+  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} in #t4.{core::num::==}(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} in #t6.{core::num::==}(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 : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t17.{core::num::==}(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} in #t19.{core::num::==}(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} in #t21.{core::num::==}(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 : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t23 = t in #t23.==(null) ?{core::num} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t24 = t in #t24.==(null) ?{core::num} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t25 = t in #t25.==(null) ?{core::num} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t26 = t in #t26.==(null) ?{core::num} null : let final core::num #t27 = #t26.{self::Test2::prop} in let final core::num #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
+  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} in #t17.{core::num::==}(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} in #t19.{core::num::==}(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} in #t21.{core::num::==}(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 : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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 #t29 = t in #t29.==(null) ?{core::num} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double;
-    core::double v3 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = self::getDouble();
-    core::num v5 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::num} null : let final core::double #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double : #t32;
-    core::double v6 = let final self::Test3 #t33 = t in #t33.==(null) ?{core::double} null : let final core::double #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double} #t33.{self::Test3::prop} = self::getDouble() : #t34;
-    core::double v7 = let final self::Test3 #t35 = t in #t35.==(null) ?{core::double} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t36 = t in #t36.==(null) ?{core::double} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t37 = t in #t37.==(null) ?{core::double} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t38 = t in #t38.==(null) ?{core::double} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t39 = t in #t39.==(null) ?{core::double} null : let final core::double #t40 = #t39.{self::Test3::prop} in let final core::double #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
+  static method test3(self::Test3* t) → void {
+    core::num* v2 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
+    core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
+    core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
+    core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_null_aware_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
index 795fa0c..35c7161 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_null_aware_upwards.dart.strong.transformed.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t4.{core::num::==}(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} in #t6.{core::num::==}(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 : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test1 #t8 = t in #t8.==(null) ?{core::num} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = let final self::Test1 #t9 = t in #t9.==(null) ?{core::int} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t10 = t in #t10.==(null) ?{core::int} null : let final core::int #t11 = #t10.{self::Test1::prop} in let final core::int #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
+  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} in #t4.{core::num::==}(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} in #t6.{core::num::==}(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 : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t17.{core::num::==}(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} in #t19.{core::num::==}(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} in #t21.{core::num::==}(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 : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t23 = t in #t23.==(null) ?{core::num} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t24 = t in #t24.==(null) ?{core::num} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t25 = t in #t25.==(null) ?{core::num} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t26 = t in #t26.==(null) ?{core::num} null : let final core::num #t27 = #t26.{self::Test2::prop} in let final core::num #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
+  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} in #t17.{core::num::==}(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} in #t19.{core::num::==}(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} in #t21.{core::num::==}(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 : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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 #t29 = t in #t29.==(null) ?{core::num} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double;
-    core::double v3 = let final self::Test3 #t30 = t in #t30.==(null) ?{core::double} null : #t30.{self::Test3::prop} = self::getDouble();
-    core::num v5 = let final self::Test3 #t31 = t in #t31.==(null) ?{core::num} null : let final core::double #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double : #t32;
-    core::double v6 = let final self::Test3 #t33 = t in #t33.==(null) ?{core::double} null : let final core::double #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double} #t33.{self::Test3::prop} = self::getDouble() : #t34;
-    core::double v7 = let final self::Test3 #t35 = t in #t35.==(null) ?{core::double} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t36 = t in #t36.==(null) ?{core::double} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t37 = t in #t37.==(null) ?{core::double} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t38 = t in #t38.==(null) ?{core::double} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t39 = t in #t39.==(null) ?{core::double} null : let final core::double #t40 = #t39.{self::Test3::prop} in let final core::double #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
+  static method test3(self::Test3* t) → void {
+    core::num* v2 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
+    core::double* v3 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
+    core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
+    core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
+    core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
index 165d895..607cd37 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart
@@ -24,25 +24,25 @@
 
 class Test extends Base {
   void test() {
-    super. /*@target=Base::member*/ member = /*@typeArgs=B*/ f();
-    super. /*@target=Base::member*/ member ??= /*@typeArgs=B*/ f();
-    super. /*@target=Base::member*/ member += /*@typeArgs=dynamic*/ f();
-    super. /*@target=Base::member*/ member *= /*@typeArgs=dynamic*/ f();
-    super. /*@target=Base::member*/ member &= /*@typeArgs=dynamic*/ f();
+    super. /*@target=Base::member*/ member = /*@ typeArgs=B* */ f();
+    super. /*@target=Base::member*/ member ??= /*@ typeArgs=B* */ f();
+    super. /*@target=Base::member*/ member += /*@ typeArgs=dynamic */ f();
+    super. /*@target=Base::member*/ member *= /*@ typeArgs=dynamic */ f();
+    super. /*@target=Base::member*/ member &= /*@ typeArgs=dynamic */ f();
     --super. /*@target=Base::member*/ member;
     super. /*@target=Base::member*/ member--;
-    var /*@type=B*/ v1 =
-        super. /*@target=Base::member*/ member = /*@typeArgs=B*/ f();
-    var /*@type=B*/ v2 =
-        super. /*@target=Base::member*/ member ??= /*@typeArgs=B*/ f();
-    var /*@type=A*/ v3 =
-        super. /*@target=Base::member*/ member += /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v4 =
-        super. /*@target=Base::member*/ member *= /*@typeArgs=dynamic*/ f();
-    var /*@type=C*/ v5 =
-        super. /*@target=Base::member*/ member &= /*@typeArgs=dynamic*/ f();
-    var /*@type=B*/ v6 = --super. /*@target=Base::member*/ member;
-    var /*@type=B*/ v7 = super. /*@target=Base::member*/ member--;
+    var /*@ type=B* */ v1 =
+        super. /*@target=Base::member*/ member = /*@ typeArgs=B* */ f();
+    var /*@ type=B* */ v2 =
+        super. /*@target=Base::member*/ member ??= /*@ typeArgs=B* */ f();
+    var /*@ type=A* */ v3 =
+        super. /*@target=Base::member*/ member += /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v4 =
+        super. /*@target=Base::member*/ member *= /*@ typeArgs=dynamic */ f();
+    var /*@ type=C* */ v5 =
+        super. /*@target=Base::member*/ member &= /*@ typeArgs=dynamic */ f();
+    var /*@ type=B* */ v6 = --super. /*@target=Base::member*/ member;
+    var /*@ type=B* */ v7 = super. /*@target=Base::member*/ member--;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect
index ac9ca97..bd125f4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -52,6 +52,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.transformed.expect
index ac9ca97..bd125f4 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.legacy.transformed.expect
@@ -3,36 +3,36 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
@@ -52,6 +52,6 @@
     dynamic v7 = let final dynamic #t2 = super.{self::Base::member} in let final dynamic #t3 = super.{self::Base::member} = #t2.-(1) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
index 1f7cf9f..96af9b6 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.outline.expect
@@ -3,37 +3,37 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class Base extends core::Object {
-  field self::B member;
-  synthetic constructor •() → self::Base
+  field self::B* member;
+  synthetic constructor •() → self::Base*
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     ;
   method test() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
index 86ab41f..18c1122 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.expect
@@ -3,55 +3,55 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::member} = self::f<self::B>();
-    super.{self::Base::member}.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : null;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member}.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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.{core::Object::==}(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<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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) in #t2;
+    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.{core::Object::==}(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<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
+    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) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
index 86ab41f..18c1122 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super.dart.strong.transformed.expect
@@ -3,55 +3,55 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class Base extends core::Object {
-  field self::B member = null;
-  synthetic constructor •() → self::Base
+  field self::B* member = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test extends self::Base {
-  synthetic constructor •() → self::Test
+  synthetic constructor •() → self::Test*
     : super self::Base::•()
     ;
   method test() → void {
-    super.{self::Base::member} = self::f<self::B>();
-    super.{self::Base::member}.{core::Object::==}(null) ?{self::B} super.{self::Base::member} = self::f<self::B>() : null;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+    super.{self::Base::member} = self::f<self::B*>();
+    super.{self::Base::member}.{core::Object::==}(null) ?{self::B*} super.{self::Base::member} = self::f<self::B*>() : null;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
     super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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.{core::Object::==}(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<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-    self::B v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-    self::C v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-    self::B v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
-    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) in #t2;
+    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.{core::Object::==}(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<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+    self::B* v4 = super.{self::Base::member} = super.{self::Base::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+    self::C* v5 = super.{self::Base::member} = super.{self::Base::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+    self::B* v6 = super.{self::Base::member} = super.{self::Base::member}.{self::B::-}(1);
+    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) in #t2;
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
index ef596e1..470276a 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart
@@ -17,58 +17,58 @@
 
 class Test1 extends Base {
   void test() {
-    var /*@type=int*/ v1 = super. /*@target=Base::intProp*/ intProp = getInt();
-    var /*@type=num*/ v2 = super. /*@target=Base::intProp*/ intProp = getNum();
-    var /*@type=int*/ v4 =
+    var /*@ type=int* */ v1 = super. /*@target=Base::intProp*/ intProp = getInt();
+    var /*@ type=num* */ v2 = super. /*@target=Base::intProp*/ intProp = getNum();
+    var /*@ type=int* */ v4 =
         super. /*@target=Base::intProp*/ intProp ??= getInt();
-    var /*@type=num*/ v5 =
+    var /*@ type=num* */ v5 =
         super. /*@target=Base::intProp*/ intProp ??= getNum();
-    var /*@type=int*/ v7 = super. /*@target=Base::intProp*/ intProp += getInt();
-    var /*@type=num*/ v8 = super. /*@target=Base::intProp*/ intProp += getNum();
-    var /*@type=int*/ v10 = ++super. /*@target=Base::intProp*/ intProp;
-    var /*@type=int*/ v11 = super. /*@target=Base::intProp*/ intProp++;
+    var /*@ type=int* */ v7 = super. /*@target=Base::intProp*/ intProp += getInt();
+    var /*@ type=num* */ v8 = super. /*@target=Base::intProp*/ intProp += getNum();
+    var /*@ type=int* */ v10 = ++super. /*@target=Base::intProp*/ intProp;
+    var /*@ type=int* */ v11 = super. /*@target=Base::intProp*/ intProp++;
   }
 }
 
 class Test2 extends Base {
   void test() {
-    var /*@type=int*/ v1 = super. /*@target=Base::numProp*/ numProp = getInt();
-    var /*@type=num*/ v2 = super. /*@target=Base::numProp*/ numProp = getNum();
-    var /*@type=double*/ v3 =
+    var /*@ type=int* */ v1 = super. /*@target=Base::numProp*/ numProp = getInt();
+    var /*@ type=num* */ v2 = super. /*@target=Base::numProp*/ numProp = getNum();
+    var /*@ type=double* */ v3 =
         super. /*@target=Base::numProp*/ numProp = getDouble();
-    var /*@type=num*/ v4 =
+    var /*@ type=num* */ v4 =
         super. /*@target=Base::numProp*/ numProp ??= getInt();
-    var /*@type=num*/ v5 =
+    var /*@ type=num* */ v5 =
         super. /*@target=Base::numProp*/ numProp ??= getNum();
-    var /*@type=num*/ v6 =
+    var /*@ type=num* */ v6 =
         super. /*@target=Base::numProp*/ numProp ??= getDouble();
-    var /*@type=num*/ v7 = super. /*@target=Base::numProp*/ numProp += getInt();
-    var /*@type=num*/ v8 = super. /*@target=Base::numProp*/ numProp += getNum();
-    var /*@type=num*/ v9 =
+    var /*@ type=num* */ v7 = super. /*@target=Base::numProp*/ numProp += getInt();
+    var /*@ type=num* */ v8 = super. /*@target=Base::numProp*/ numProp += getNum();
+    var /*@ type=num* */ v9 =
         super. /*@target=Base::numProp*/ numProp += getDouble();
-    var /*@type=num*/ v10 = ++super. /*@target=Base::numProp*/ numProp;
-    var /*@type=num*/ v11 = super. /*@target=Base::numProp*/ numProp++;
+    var /*@ type=num* */ v10 = ++super. /*@target=Base::numProp*/ numProp;
+    var /*@ type=num* */ v11 = super. /*@target=Base::numProp*/ numProp++;
   }
 }
 
 class Test3 extends Base {
   void test3() {
-    var /*@type=num*/ v2 =
+    var /*@ type=num* */ v2 =
         super. /*@target=Base::doubleProp*/ doubleProp = getNum();
-    var /*@type=double*/ v3 =
+    var /*@ type=double* */ v3 =
         super. /*@target=Base::doubleProp*/ doubleProp = getDouble();
-    var /*@type=num*/ v5 =
+    var /*@ type=num* */ v5 =
         super. /*@target=Base::doubleProp*/ doubleProp ??= getNum();
-    var /*@type=double*/ v6 =
+    var /*@ type=double* */ v6 =
         super. /*@target=Base::doubleProp*/ doubleProp ??= getDouble();
-    var /*@type=double*/ v7 =
+    var /*@ type=double* */ v7 =
         super. /*@target=Base::doubleProp*/ doubleProp += getInt();
-    var /*@type=double*/ v8 =
+    var /*@ type=double* */ v8 =
         super. /*@target=Base::doubleProp*/ doubleProp += getNum();
-    var /*@type=double*/ v9 =
+    var /*@ type=double* */ v9 =
         super. /*@target=Base::doubleProp*/ doubleProp += getDouble();
-    var /*@type=double*/ v10 = ++super. /*@target=Base::doubleProp*/ doubleProp;
-    var /*@type=double*/ v11 = super. /*@target=Base::doubleProp*/ doubleProp++;
+    var /*@ type=double* */ v10 = ++super. /*@target=Base::doubleProp*/ doubleProp;
+    var /*@ type=double* */ v11 = super. /*@target=Base::doubleProp*/ doubleProp++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect
index f682b4c..1c5f31c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.expect
@@ -3,15 +3,15 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test3() → void {
@@ -59,10 +59,10 @@
     dynamic v11 = let final dynamic #t12 = super.{self::Base::doubleProp} in let final dynamic #t13 = super.{self::Base::doubleProp} = #t12.+(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
index f682b4c..1c5f31c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.legacy.transformed.expect
@@ -3,15 +3,15 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     : super self::Base::•()
     ;
   method test() → void {
@@ -26,7 +26,7 @@
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     : super self::Base::•()
     ;
   method test() → void {
@@ -44,7 +44,7 @@
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     : super self::Base::•()
     ;
   method test3() → void {
@@ -59,10 +59,10 @@
     dynamic v11 = let final dynamic #t12 = super.{self::Base::doubleProp} in let final dynamic #t13 = super.{self::Base::doubleProp} = #t12.+(1) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.outline.expect
index c58784f..b019841 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.outline.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  field core::int intProp;
-  field core::num numProp;
-  field core::double doubleProp;
-  synthetic constructor •() → self::Base
+  field core::int* intProp;
+  field core::num* numProp;
+  field core::double* doubleProp;
+  synthetic constructor •() → self::Base*
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  synthetic constructor •() → self::Test1*
     ;
   method test() → void
     ;
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  synthetic constructor •() → self::Test2*
     ;
   method test() → void
     ;
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  synthetic constructor •() → self::Test3*
     ;
   method test3() → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.expect
index 00dc6b8..b914ec3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.expect
@@ -3,66 +3,66 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  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.{core::num::==}(null) ?{core::int} super.{self::Base::intProp} = self::getInt() : #t1;
-    core::num v5 = let final core::int #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(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 v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
-    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) in #t3;
+    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.{core::num::==}(null) ?{core::int*} super.{self::Base::intProp} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(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* v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
+    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) in #t3;
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  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.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getInt() : #t5;
-    core::num v5 = let final core::num #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getNum() : #t6;
-    core::num v6 = let final core::num #t7 = super.{self::Base::numProp} in #t7.{core::num::==}(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 v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
-    core::num v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
-    core::num v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
-    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) in #t8;
+    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.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = super.{self::Base::numProp} in #t7.{core::num::==}(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* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
+    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) in #t8;
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  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.{core::num::==}(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.{core::num::==}(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::double v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
-    core::double v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
-    core::double v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
-    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) in #t12;
+    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.{core::num::==}(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.{core::num::==}(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::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
+    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) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
index 00dc6b8..b914ec3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_super_upwards.dart.strong.transformed.expect
@@ -3,66 +3,66 @@
 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
+  field core::int* intProp = null;
+  field core::num* numProp = null;
+  field core::double* doubleProp = null;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Test1 extends self::Base {
-  synthetic constructor •() → self::Test1
+  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.{core::num::==}(null) ?{core::int} super.{self::Base::intProp} = self::getInt() : #t1;
-    core::num v5 = let final core::int #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(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 v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
-    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) in #t3;
+    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.{core::num::==}(null) ?{core::int*} super.{self::Base::intProp} = self::getInt() : #t1;
+    core::num* v5 = let final core::int* #t2 = super.{self::Base::intProp} in #t2.{core::num::==}(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* v8 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = super.{self::Base::intProp} = super.{self::Base::intProp}.{core::num::+}(1);
+    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) in #t3;
   }
 }
 class Test2 extends self::Base {
-  synthetic constructor •() → self::Test2
+  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.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getInt() : #t5;
-    core::num v5 = let final core::num #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num} super.{self::Base::numProp} = self::getNum() : #t6;
-    core::num v6 = let final core::num #t7 = super.{self::Base::numProp} in #t7.{core::num::==}(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 v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
-    core::num v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
-    core::num v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
-    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) in #t8;
+    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.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getInt() : #t5;
+    core::num* v5 = let final core::num* #t6 = super.{self::Base::numProp} in #t6.{core::num::==}(null) ?{core::num*} super.{self::Base::numProp} = self::getNum() : #t6;
+    core::num* v6 = let final core::num* #t7 = super.{self::Base::numProp} in #t7.{core::num::==}(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* v8 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getNum());
+    core::num* v9 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(self::getDouble());
+    core::num* v10 = super.{self::Base::numProp} = super.{self::Base::numProp}.{core::num::+}(1);
+    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) in #t8;
   }
 }
 class Test3 extends self::Base {
-  synthetic constructor •() → self::Test3
+  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.{core::num::==}(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.{core::num::==}(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::double v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
-    core::double v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
-    core::double v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
-    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) in #t12;
+    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.{core::num::==}(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.{core::num::==}(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::double* v8 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getNum());
+    core::double* v9 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(self::getDouble());
+    core::double* v10 = super.{self::Base::doubleProp} = super.{self::Base::doubleProp}.{core::double::+}(1);
+    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) in #t12;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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 b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
index 74878e7..5ade9c5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart
@@ -13,14 +13,14 @@
   int prop;
 
   static void test(Test1 t) {
-    var /*@type=int*/ v1 = t. /*@target=Test1::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t. /*@target=Test1::prop*/ prop = getNum();
-    var /*@type=int*/ v4 = t. /*@target=Test1::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t. /*@target=Test1::prop*/ prop ??= getNum();
-    var /*@type=int*/ v7 = t. /*@target=Test1::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t. /*@target=Test1::prop*/ prop += getNum();
-    var /*@type=int*/ v10 = ++t. /*@target=Test1::prop*/ prop;
-    var /*@type=int*/ v11 = t. /*@target=Test1::prop*/ prop++;
+    var /*@ type=int* */ v1 = t. /*@target=Test1::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t. /*@target=Test1::prop*/ prop = getNum();
+    var /*@ type=int* */ v4 = t. /*@target=Test1::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t. /*@target=Test1::prop*/ prop ??= getNum();
+    var /*@ type=int* */ v7 = t. /*@target=Test1::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t. /*@target=Test1::prop*/ prop += getNum();
+    var /*@ type=int* */ v10 = ++t. /*@target=Test1::prop*/ prop;
+    var /*@ type=int* */ v11 = t. /*@target=Test1::prop*/ prop++;
   }
 }
 
@@ -28,17 +28,17 @@
   num prop;
 
   static void test(Test2 t) {
-    var /*@type=int*/ v1 = t. /*@target=Test2::prop*/ prop = getInt();
-    var /*@type=num*/ v2 = t. /*@target=Test2::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t. /*@target=Test2::prop*/ prop = getDouble();
-    var /*@type=num*/ v4 = t. /*@target=Test2::prop*/ prop ??= getInt();
-    var /*@type=num*/ v5 = t. /*@target=Test2::prop*/ prop ??= getNum();
-    var /*@type=num*/ v6 = t. /*@target=Test2::prop*/ prop ??= getDouble();
-    var /*@type=num*/ v7 = t. /*@target=Test2::prop*/ prop += getInt();
-    var /*@type=num*/ v8 = t. /*@target=Test2::prop*/ prop += getNum();
-    var /*@type=num*/ v9 = t. /*@target=Test2::prop*/ prop += getDouble();
-    var /*@type=num*/ v10 = ++t. /*@target=Test2::prop*/ prop;
-    var /*@type=num*/ v11 = t. /*@target=Test2::prop*/ prop++;
+    var /*@ type=int* */ v1 = t. /*@target=Test2::prop*/ prop = getInt();
+    var /*@ type=num* */ v2 = t. /*@target=Test2::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t. /*@target=Test2::prop*/ prop = getDouble();
+    var /*@ type=num* */ v4 = t. /*@target=Test2::prop*/ prop ??= getInt();
+    var /*@ type=num* */ v5 = t. /*@target=Test2::prop*/ prop ??= getNum();
+    var /*@ type=num* */ v6 = t. /*@target=Test2::prop*/ prop ??= getDouble();
+    var /*@ type=num* */ v7 = t. /*@target=Test2::prop*/ prop += getInt();
+    var /*@ type=num* */ v8 = t. /*@target=Test2::prop*/ prop += getNum();
+    var /*@ type=num* */ v9 = t. /*@target=Test2::prop*/ prop += getDouble();
+    var /*@ type=num* */ v10 = ++t. /*@target=Test2::prop*/ prop;
+    var /*@ type=num* */ v11 = t. /*@target=Test2::prop*/ prop++;
   }
 }
 
@@ -46,15 +46,15 @@
   double prop;
 
   static void test3(Test3 t) {
-    var /*@type=num*/ v2 = t. /*@target=Test3::prop*/ prop = getNum();
-    var /*@type=double*/ v3 = t. /*@target=Test3::prop*/ prop = getDouble();
-    var /*@type=num*/ v5 = t. /*@target=Test3::prop*/ prop ??= getNum();
-    var /*@type=double*/ v6 = t. /*@target=Test3::prop*/ prop ??= getDouble();
-    var /*@type=double*/ v7 = t. /*@target=Test3::prop*/ prop += getInt();
-    var /*@type=double*/ v8 = t. /*@target=Test3::prop*/ prop += getNum();
-    var /*@type=double*/ v9 = t. /*@target=Test3::prop*/ prop += getDouble();
-    var /*@type=double*/ v10 = ++t. /*@target=Test3::prop*/ prop;
-    var /*@type=double*/ v11 = t. /*@target=Test3::prop*/ prop++;
+    var /*@ type=num* */ v2 = t. /*@target=Test3::prop*/ prop = getNum();
+    var /*@ type=double* */ v3 = t. /*@target=Test3::prop*/ prop = getDouble();
+    var /*@ type=num* */ v5 = t. /*@target=Test3::prop*/ prop ??= getNum();
+    var /*@ type=double* */ v6 = t. /*@target=Test3::prop*/ prop ??= getDouble();
+    var /*@ type=double* */ v7 = t. /*@target=Test3::prop*/ prop += getInt();
+    var /*@ type=double* */ v8 = t. /*@target=Test3::prop*/ prop += getNum();
+    var /*@ type=double* */ v9 = t. /*@target=Test3::prop*/ prop += getDouble();
+    var /*@ type=double* */ v10 = ++t. /*@target=Test3::prop*/ prop;
+    var /*@ type=double* */ v11 = t. /*@target=Test3::prop*/ prop++;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect
index fdf231c..6f81144 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v4 = let final dynamic #t1 = t in let final dynamic #t2 = #t1.prop in #t2.==(null) ? #t1.prop = self::getInt() : #t2;
@@ -19,11 +19,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
@@ -38,11 +38,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
     dynamic v5 = let final dynamic #t24 = t in let final dynamic #t25 = #t24.prop in #t25.==(null) ? #t24.prop = self::getNum() : #t25;
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t32 = t in let final dynamic #t33 = #t32.prop in let final dynamic #t34 = #t32.prop = #t33.+(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.transformed.expect
index fdf231c..6f81144 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  field core::int* prop = null;
+  synthetic constructor •() → self::Test1*
     : super core::Object::•()
     ;
-  static method test(self::Test1 t) → void {
+  static method test(self::Test1* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v4 = let final dynamic #t1 = t in let final dynamic #t2 = #t1.prop in #t2.==(null) ? #t1.prop = self::getInt() : #t2;
@@ -19,11 +19,11 @@
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  field core::num* prop = null;
+  synthetic constructor •() → self::Test2*
     : super core::Object::•()
     ;
-  static method test(self::Test2 t) → void {
+  static method test(self::Test2* t) → void {
     dynamic v1 = t.prop = self::getInt();
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
@@ -38,11 +38,11 @@
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  field core::double* prop = null;
+  synthetic constructor •() → self::Test3*
     : super core::Object::•()
     ;
-  static method test3(self::Test3 t) → void {
+  static method test3(self::Test3* t) → void {
     dynamic v2 = t.prop = self::getNum();
     dynamic v3 = t.prop = self::getDouble();
     dynamic v5 = let final dynamic #t24 = t in let final dynamic #t25 = #t24.prop in #t25.==(null) ? #t24.prop = self::getNum() : #t25;
@@ -54,10 +54,10 @@
     dynamic v11 = let final dynamic #t32 = t in let final dynamic #t33 = #t32.prop in let final dynamic #t34 = #t32.prop = #t33.+(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.outline.expect
index eaa82b5..2203088 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop;
-  synthetic constructor •() → self::Test1
+  field core::int* prop;
+  synthetic constructor •() → self::Test1*
     ;
-  static method test(self::Test1 t) → void
+  static method test(self::Test1* t) → void
     ;
 }
 class Test2 extends core::Object {
-  field core::num prop;
-  synthetic constructor •() → self::Test2
+  field core::num* prop;
+  synthetic constructor •() → self::Test2*
     ;
-  static method test(self::Test2 t) → void
+  static method test(self::Test2* t) → void
     ;
 }
 class Test3 extends core::Object {
-  field core::double prop;
-  synthetic constructor •() → self::Test3
+  field core::double* prop;
+  synthetic constructor •() → self::Test3*
     ;
-  static method test3(self::Test3 t) → void
+  static method test3(self::Test3* t) → void
     ;
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.expect
index 717b63a..74320c5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t2.{core::num::==}(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} in #t4.{core::num::==}(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::num::+}(self::getInt());
-    core::num v8 = let final self::Test1 #t6 = t in #t6.{self::Test1::prop} = #t6.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = let final self::Test1 #t7 = t in #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t8 = t in let final core::int #t9 = #t8.{self::Test1::prop} in let final core::int #t10 = #t8.{self::Test1::prop} = #t9.{core::num::+}(1) in #t9;
+  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} in #t2.{core::num::==}(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} in #t4.{core::num::==}(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::num::+}(self::getInt());
+    core::num* v8 = let final self::Test1* #t6 = t in #t6.{self::Test1::prop} = #t6.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = let final self::Test1* #t7 = t in #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t8 = t in let final core::int* #t9 = #t8.{self::Test1::prop} in let final core::int* #t10 = #t8.{self::Test1::prop} = #t9.{core::num::+}(1) in #t9;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t12.{core::num::==}(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} in #t14.{core::num::==}(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} in #t16.{core::num::==}(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::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t18 = t in #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t19 = t in #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t20 = t in #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t21 = t in let final core::num #t22 = #t21.{self::Test2::prop} in let final core::num #t23 = #t21.{self::Test2::prop} = #t22.{core::num::+}(1) in #t22;
+  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} in #t12.{core::num::==}(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} in #t14.{core::num::==}(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} in #t16.{core::num::==}(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::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t18 = t in #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t19 = t in #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t20 = t in #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t21 = t in let final core::num* #t22 = #t21.{self::Test2::prop} in let final core::num* #t23 = #t21.{self::Test2::prop} = #t22.{core::num::+}(1) in #t22;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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} in #t25.{core::num::==}(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} in #t27.{core::num::==}(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::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t29 = t in #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t30 = t in #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t31 = t in #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t32 = t in let final core::double #t33 = #t32.{self::Test3::prop} in let final core::double #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
+  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} in #t25.{core::num::==}(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} in #t27.{core::num::==}(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::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t29 = t in #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t30 = t in #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t31 = t in #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t32 = t in let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.transformed.expect
index 717b63a..74320c5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_property_upwards.dart.strong.transformed.expect
@@ -3,61 +3,61 @@
 import "dart:core" as core;
 
 class Test1 extends core::Object {
-  field core::int prop = null;
-  synthetic constructor •() → self::Test1
+  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} in #t2.{core::num::==}(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} in #t4.{core::num::==}(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::num::+}(self::getInt());
-    core::num v8 = let final self::Test1 #t6 = t in #t6.{self::Test1::prop} = #t6.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int;
-    core::int v10 = let final self::Test1 #t7 = t in #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(1);
-    core::int v11 = let final self::Test1 #t8 = t in let final core::int #t9 = #t8.{self::Test1::prop} in let final core::int #t10 = #t8.{self::Test1::prop} = #t9.{core::num::+}(1) in #t9;
+  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} in #t2.{core::num::==}(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} in #t4.{core::num::==}(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::num::+}(self::getInt());
+    core::num* v8 = let final self::Test1* #t6 = t in #t6.{self::Test1::prop} = #t6.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+    core::int* v10 = let final self::Test1* #t7 = t in #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(1);
+    core::int* v11 = let final self::Test1* #t8 = t in let final core::int* #t9 = #t8.{self::Test1::prop} in let final core::int* #t10 = #t8.{self::Test1::prop} = #t9.{core::num::+}(1) in #t9;
   }
 }
 class Test2 extends core::Object {
-  field core::num prop = null;
-  synthetic constructor •() → self::Test2
+  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} in #t12.{core::num::==}(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} in #t14.{core::num::==}(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} in #t16.{core::num::==}(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::+}(self::getInt());
-    core::num v8 = let final self::Test2 #t18 = t in #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getNum());
-    core::num v9 = let final self::Test2 #t19 = t in #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getDouble());
-    core::num v10 = let final self::Test2 #t20 = t in #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(1);
-    core::num v11 = let final self::Test2 #t21 = t in let final core::num #t22 = #t21.{self::Test2::prop} in let final core::num #t23 = #t21.{self::Test2::prop} = #t22.{core::num::+}(1) in #t22;
+  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} in #t12.{core::num::==}(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} in #t14.{core::num::==}(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} in #t16.{core::num::==}(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::+}(self::getInt());
+    core::num* v8 = let final self::Test2* #t18 = t in #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getNum());
+    core::num* v9 = let final self::Test2* #t19 = t in #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getDouble());
+    core::num* v10 = let final self::Test2* #t20 = t in #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(1);
+    core::num* v11 = let final self::Test2* #t21 = t in let final core::num* #t22 = #t21.{self::Test2::prop} in let final core::num* #t23 = #t21.{self::Test2::prop} = #t22.{core::num::+}(1) in #t22;
   }
 }
 class Test3 extends core::Object {
-  field core::double prop = null;
-  synthetic constructor •() → self::Test3
+  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} in #t25.{core::num::==}(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} in #t27.{core::num::==}(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::+}(self::getInt());
-    core::double v8 = let final self::Test3 #t29 = t in #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
-    core::double v9 = let final self::Test3 #t30 = t in #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
-    core::double v10 = let final self::Test3 #t31 = t in #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
-    core::double v11 = let final self::Test3 #t32 = t in let final core::double #t33 = #t32.{self::Test3::prop} in let final core::double #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
+  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} in #t25.{core::num::==}(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} in #t27.{core::num::==}(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::+}(self::getInt());
+    core::double* v8 = let final self::Test3* #t29 = t in #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
+    core::double* v9 = let final self::Test3* #t30 = t in #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
+    core::double* v10 = let final self::Test3* #t31 = t in #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
+    core::double* v11 = let final self::Test3* #t32 = t in let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
   }
 }
-static method getInt() → core::int
+static method getInt() → core::int*
   return 0;
-static method getNum() → core::num
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.expect
index 7a0f38a..ffa1f78 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
+static field self::A* a = new self::A::•();
 static field dynamic b = self::a.f = 1;
 static field dynamic c = 0;
 static field dynamic d = self::c = 1;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect
index 7a0f38a..ffa1f78 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
+static field self::A* a = new self::A::•();
 static field dynamic b = self::a.f = 1;
 static field dynamic c = 0;
 static field dynamic d = self::c = 1;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
index e1e3bae..1e6470c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f;
-  synthetic constructor •() → self::A
+  field core::int* f;
+  synthetic constructor •() → self::A*
     ;
 }
-static field self::A a;
+static field self::A* a;
 static field dynamic b;
 static field dynamic c;
 static field dynamic d;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.expect
index 02a20bc..aeff6ff 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-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 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;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.transformed.expect
index 02a20bc..aeff6ff 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_ref.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int f = null;
-  synthetic constructor •() → self::A
+  field core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-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 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;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
index 7bd6aa3..1a832b3 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart
@@ -23,37 +23,37 @@
 B topLevelVariable;
 
 void test_topLevelVariable() {
-  topLevelVariable = /*@typeArgs=B*/ f();
-  topLevelVariable ??= /*@typeArgs=B*/ f();
-  topLevelVariable += /*@typeArgs=dynamic*/ f();
-  topLevelVariable *= /*@typeArgs=dynamic*/ f();
-  topLevelVariable &= /*@typeArgs=dynamic*/ f();
+  topLevelVariable = /*@ typeArgs=B* */ f();
+  topLevelVariable ??= /*@ typeArgs=B* */ f();
+  topLevelVariable += /*@ typeArgs=dynamic */ f();
+  topLevelVariable *= /*@ typeArgs=dynamic */ f();
+  topLevelVariable &= /*@ typeArgs=dynamic */ f();
   --topLevelVariable;
   topLevelVariable--;
-  var /*@type=B*/ v1 = topLevelVariable = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = topLevelVariable ??= /*@typeArgs=B*/ f();
-  var /*@type=A*/ v3 = topLevelVariable += /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v4 = topLevelVariable *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = topLevelVariable &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --topLevelVariable;
-  var /*@type=B*/ v7 = topLevelVariable--;
+  var /*@ type=B* */ v1 = topLevelVariable = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = topLevelVariable ??= /*@ typeArgs=B* */ f();
+  var /*@ type=A* */ v3 = topLevelVariable += /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v4 = topLevelVariable *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = topLevelVariable &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --topLevelVariable;
+  var /*@ type=B* */ v7 = topLevelVariable--;
 }
 
 void test_staticVariable() {
-  B.staticVariable = /*@typeArgs=B*/ f();
-  B.staticVariable ??= /*@typeArgs=B*/ f();
-  B.staticVariable += /*@typeArgs=dynamic*/ f();
-  B.staticVariable *= /*@typeArgs=dynamic*/ f();
-  B.staticVariable &= /*@typeArgs=dynamic*/ f();
+  B.staticVariable = /*@ typeArgs=B* */ f();
+  B.staticVariable ??= /*@ typeArgs=B* */ f();
+  B.staticVariable += /*@ typeArgs=dynamic */ f();
+  B.staticVariable *= /*@ typeArgs=dynamic */ f();
+  B.staticVariable &= /*@ typeArgs=dynamic */ f();
   --B.staticVariable;
   B.staticVariable--;
-  var /*@type=B*/ v1 = B.staticVariable = /*@typeArgs=B*/ f();
-  var /*@type=B*/ v2 = B.staticVariable ??= /*@typeArgs=B*/ f();
-  var /*@type=A*/ v3 = B.staticVariable += /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v4 = B.staticVariable *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ v5 = B.staticVariable &= /*@typeArgs=dynamic*/ f();
-  var /*@type=B*/ v6 = --B.staticVariable;
-  var /*@type=B*/ v7 = B.staticVariable--;
+  var /*@ type=B* */ v1 = B.staticVariable = /*@ typeArgs=B* */ f();
+  var /*@ type=B* */ v2 = B.staticVariable ??= /*@ typeArgs=B* */ f();
+  var /*@ type=A* */ v3 = B.staticVariable += /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v4 = B.staticVariable *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ v5 = B.staticVariable &= /*@ typeArgs=dynamic */ f();
+  var /*@ type=B* */ v6 = --B.staticVariable;
+  var /*@ type=B* */ v7 = B.staticVariable--;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect
index 2b4fd4f..b6c1574 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect
index 2b4fd4f..b6c1574 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
index 7e312ee..c89d459 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.outline.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable;
+  synthetic constructor •() → self::B*
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     ;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     ;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     ;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+static field self::B* topLevelVariable;
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test_topLevelVariable() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
index 67c4486..00189a5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : null;
-  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v1 = self::topLevelVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : #t1;
-  self::A v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = self::topLevelVariable in let final self::B #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::A* v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
 }
 static method test_staticVariable() → void {
-  self::B::staticVariable = self::f<self::B>();
-  self::B::staticVariable.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : null;
-  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v1 = self::B::staticVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : #t4;
-  self::A v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t5 = self::B::staticVariable in let final self::B #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::A* v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
index 67c4486..00189a5 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static.dart.strong.transformed.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  static field self::B staticVariable = null;
-  synthetic constructor •() → self::B
+  static field self::B* staticVariable = null;
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(self::C v) → self::A
+  operator +(self::C* v) → self::A*
     return null;
-  operator -(core::int i) → self::B
+  operator -(core::int* i) → self::B*
     return null;
-  operator *(self::B v) → self::B
+  operator *(self::B* v) → self::B*
     return null;
-  operator &(self::A v) → self::C
+  operator &(self::A* v) → self::C*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static field self::B topLevelVariable;
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : null;
-  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::topLevelVariable = self::f<self::B*>();
+  self::topLevelVariable.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : null;
+  self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
   self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v1 = self::topLevelVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B} self::topLevelVariable = self::f<self::B>() : #t1;
-  self::A v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t2 = self::topLevelVariable in let final self::B #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
+  self::B* v1 = self::topLevelVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t1 = self::topLevelVariable in #t1.{core::Object::==}(null) ?{self::B*} self::topLevelVariable = self::f<self::B*>() : #t1;
+  self::A* v3 = self::topLevelVariable = self::topLevelVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = self::topLevelVariable = self::topLevelVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::topLevelVariable = self::topLevelVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::topLevelVariable = self::topLevelVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t2 = self::topLevelVariable in let final self::B* #t3 = self::topLevelVariable = #t2.{self::B::-}(1) in #t2;
 }
 static method test_staticVariable() → void {
-  self::B::staticVariable = self::f<self::B>();
-  self::B::staticVariable.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : null;
-  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
+  self::B::staticVariable = self::f<self::B*>();
+  self::B::staticVariable.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : null;
+  self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
   self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v1 = self::B::staticVariable = self::f<self::B>();
-  self::B v2 = let final self::B #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B} self::B::staticVariable = self::f<self::B>() : #t4;
-  self::A v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C) as{TypeError} self::B;
-  self::B v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B);
-  self::C v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A);
-  self::B v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
-  self::B v7 = let final self::B #t5 = self::B::staticVariable in let final self::B #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
+  self::B* v1 = self::B::staticVariable = self::f<self::B*>();
+  self::B* v2 = let final self::B* #t4 = self::B::staticVariable in #t4.{core::Object::==}(null) ?{self::B*} self::B::staticVariable = self::f<self::B*>() : #t4;
+  self::A* v3 = self::B::staticVariable = self::B::staticVariable.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
+  self::B* v4 = self::B::staticVariable = self::B::staticVariable.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
+  self::C* v5 = self::B::staticVariable = self::B::staticVariable.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
+  self::B* v6 = self::B::staticVariable = self::B::staticVariable.{self::B::-}(1);
+  self::B* v7 = let final self::B* #t5 = self::B::staticVariable in let final self::B* #t6 = self::B::staticVariable = #t5.{self::B::-}(1) in #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
index 3cebc65..93419da 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart
@@ -14,40 +14,40 @@
 double topLevelDouble;
 
 void test1() {
-  var /*@type=int*/ v1 = topLevelInt = getInt();
-  var /*@type=num*/ v2 = topLevelInt = getNum();
-  var /*@type=int*/ v4 = topLevelInt ??= getInt();
-  var /*@type=num*/ v5 = topLevelInt ??= getNum();
-  var /*@type=int*/ v7 = topLevelInt += getInt();
-  var /*@type=num*/ v8 = topLevelInt += getNum();
-  var /*@type=int*/ v10 = ++topLevelInt;
-  var /*@type=int*/ v11 = topLevelInt++;
+  var /*@ type=int* */ v1 = topLevelInt = getInt();
+  var /*@ type=num* */ v2 = topLevelInt = getNum();
+  var /*@ type=int* */ v4 = topLevelInt ??= getInt();
+  var /*@ type=num* */ v5 = topLevelInt ??= getNum();
+  var /*@ type=int* */ v7 = topLevelInt += getInt();
+  var /*@ type=num* */ v8 = topLevelInt += getNum();
+  var /*@ type=int* */ v10 = ++topLevelInt;
+  var /*@ type=int* */ v11 = topLevelInt++;
 }
 
 void test2() {
-  var /*@type=int*/ v1 = topLevelNum = getInt();
-  var /*@type=num*/ v2 = topLevelNum = getNum();
-  var /*@type=double*/ v3 = topLevelNum = getDouble();
-  var /*@type=num*/ v4 = topLevelNum ??= getInt();
-  var /*@type=num*/ v5 = topLevelNum ??= getNum();
-  var /*@type=num*/ v6 = topLevelNum ??= getDouble();
-  var /*@type=num*/ v7 = topLevelNum += getInt();
-  var /*@type=num*/ v8 = topLevelNum += getNum();
-  var /*@type=num*/ v9 = topLevelNum += getDouble();
-  var /*@type=num*/ v10 = ++topLevelNum;
-  var /*@type=num*/ v11 = topLevelNum++;
+  var /*@ type=int* */ v1 = topLevelNum = getInt();
+  var /*@ type=num* */ v2 = topLevelNum = getNum();
+  var /*@ type=double* */ v3 = topLevelNum = getDouble();
+  var /*@ type=num* */ v4 = topLevelNum ??= getInt();
+  var /*@ type=num* */ v5 = topLevelNum ??= getNum();
+  var /*@ type=num* */ v6 = topLevelNum ??= getDouble();
+  var /*@ type=num* */ v7 = topLevelNum += getInt();
+  var /*@ type=num* */ v8 = topLevelNum += getNum();
+  var /*@ type=num* */ v9 = topLevelNum += getDouble();
+  var /*@ type=num* */ v10 = ++topLevelNum;
+  var /*@ type=num* */ v11 = topLevelNum++;
 }
 
 void test3() {
-  var /*@type=num*/ v2 = topLevelDouble = getNum();
-  var /*@type=double*/ v3 = topLevelDouble = getDouble();
-  var /*@type=num*/ v5 = topLevelDouble ??= getNum();
-  var /*@type=double*/ v6 = topLevelDouble ??= getDouble();
-  var /*@type=double*/ v7 = topLevelDouble += getInt();
-  var /*@type=double*/ v8 = topLevelDouble += getNum();
-  var /*@type=double*/ v9 = topLevelDouble += getDouble();
-  var /*@type=double*/ v10 = ++topLevelDouble;
-  var /*@type=double*/ v11 = topLevelDouble++;
+  var /*@ type=num* */ v2 = topLevelDouble = getNum();
+  var /*@ type=double* */ v3 = topLevelDouble = getDouble();
+  var /*@ type=num* */ v5 = topLevelDouble ??= getNum();
+  var /*@ type=double* */ v6 = topLevelDouble ??= getDouble();
+  var /*@ type=double* */ v7 = topLevelDouble += getInt();
+  var /*@ type=double* */ v8 = topLevelDouble += getNum();
+  var /*@ type=double* */ v9 = topLevelDouble += getDouble();
+  var /*@ type=double* */ v10 = ++topLevelDouble;
+  var /*@ type=double* */ v11 = topLevelDouble++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect
index 7cf33f1..363be7c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.expect
@@ -2,14 +2,14 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method test1() → void {
   dynamic v1 = self::topLevelInt = self::getInt();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect
index 7cf33f1..363be7c 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   return 0.0;
 static method test1() → void {
   dynamic v1 = self::topLevelInt = self::getInt();
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.outline.expect
index 9f20ebc..ddb758d 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.outline.expect
@@ -2,14 +2,14 @@
 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
+static field core::int* topLevelInt;
+static field core::num* topLevelNum;
+static field core::double* topLevelDouble;
+static method getInt() → core::int*
   ;
-static method getNum() → core::num
+static method getNum() → core::num*
   ;
-static method getDouble() → core::double
+static method getDouble() → core::double*
   ;
 static method test1() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.expect
index 68bfc44..b9a69ea 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.expect
@@ -2,47 +2,47 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} self::topLevelInt = self::getInt() : #t1;
-  core::num v5 = let final core::int #t2 = self::topLevelInt in #t2.{core::num::==}(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 v8 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getNum()) as{TypeError} core::int;
-  core::int v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
-  core::int v11 = let final core::int #t3 = self::topLevelInt in let final core::int #t4 = self::topLevelInt = #t3.{core::num::+}(1) in #t3;
+  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.{core::num::==}(null) ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = self::topLevelInt in #t2.{core::num::==}(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* v8 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t3 = self::topLevelInt in let final core::int* #t4 = self::topLevelInt = #t3.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getInt() : #t5;
-  core::num v5 = let final core::num #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getNum() : #t6;
-  core::num v6 = let final core::num #t7 = self::topLevelNum in #t7.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getDouble() : #t7;
-  core::num v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
-  core::num v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
-  core::num v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
-  core::num v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
-  core::num v11 = let final core::num #t8 = self::topLevelNum in let final core::num #t9 = self::topLevelNum = #t8.{core::num::+}(1) in #t8;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = self::topLevelNum in #t7.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getDouble() : #t7;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t8 = self::topLevelNum in let final core::num* #t9 = self::topLevelNum = #t8.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelDouble = self::getNum() as{TypeError} core::double : #t10;
-  core::double v6 = let final core::double #t11 = self::topLevelDouble in #t11.{core::num::==}(null) ?{core::double} self::topLevelDouble = self::getDouble() : #t11;
-  core::double v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
-  core::double v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
-  core::double v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
-  core::double v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
-  core::double v11 = let final core::double #t12 = self::topLevelDouble in let final core::double #t13 = self::topLevelDouble = #t12.{core::double::+}(1) in #t12;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelDouble = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = self::topLevelDouble in #t11.{core::num::==}(null) ?{core::double*} self::topLevelDouble = self::getDouble() : #t11;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t12 = self::topLevelDouble in let final core::double* #t13 = self::topLevelDouble = #t12.{core::double::+}(1) in #t12;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.transformed.expect
index 68bfc44..b9a69ea 100644
--- a/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_assign_to_static_upwards.dart.strong.transformed.expect
@@ -2,47 +2,47 @@
 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
+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
+static method getNum() → core::num*
   return 0;
-static method getDouble() → core::double
+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.{core::num::==}(null) ?{core::int} self::topLevelInt = self::getInt() : #t1;
-  core::num v5 = let final core::int #t2 = self::topLevelInt in #t2.{core::num::==}(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 v8 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getNum()) as{TypeError} core::int;
-  core::int v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
-  core::int v11 = let final core::int #t3 = self::topLevelInt in let final core::int #t4 = self::topLevelInt = #t3.{core::num::+}(1) in #t3;
+  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.{core::num::==}(null) ?{core::int*} self::topLevelInt = self::getInt() : #t1;
+  core::num* v5 = let final core::int* #t2 = self::topLevelInt in #t2.{core::num::==}(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* v8 = self::topLevelInt = self::topLevelInt.{core::num::+}(self::getNum()) as{TypeError} core::int*;
+  core::int* v10 = self::topLevelInt = self::topLevelInt.{core::num::+}(1);
+  core::int* v11 = let final core::int* #t3 = self::topLevelInt in let final core::int* #t4 = self::topLevelInt = #t3.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getInt() : #t5;
-  core::num v5 = let final core::num #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getNum() : #t6;
-  core::num v6 = let final core::num #t7 = self::topLevelNum in #t7.{core::num::==}(null) ?{core::num} self::topLevelNum = self::getDouble() : #t7;
-  core::num v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
-  core::num v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
-  core::num v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
-  core::num v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
-  core::num v11 = let final core::num #t8 = self::topLevelNum in let final core::num #t9 = self::topLevelNum = #t8.{core::num::+}(1) in #t8;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getInt() : #t5;
+  core::num* v5 = let final core::num* #t6 = self::topLevelNum in #t6.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getNum() : #t6;
+  core::num* v6 = let final core::num* #t7 = self::topLevelNum in #t7.{core::num::==}(null) ?{core::num*} self::topLevelNum = self::getDouble() : #t7;
+  core::num* v7 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getInt());
+  core::num* v8 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getNum());
+  core::num* v9 = self::topLevelNum = self::topLevelNum.{core::num::+}(self::getDouble());
+  core::num* v10 = self::topLevelNum = self::topLevelNum.{core::num::+}(1);
+  core::num* v11 = let final core::num* #t8 = self::topLevelNum in let final core::num* #t9 = self::topLevelNum = #t8.{core::num::+}(1) 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.{core::num::==}(null) ?{core::num} self::topLevelDouble = self::getNum() as{TypeError} core::double : #t10;
-  core::double v6 = let final core::double #t11 = self::topLevelDouble in #t11.{core::num::==}(null) ?{core::double} self::topLevelDouble = self::getDouble() : #t11;
-  core::double v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
-  core::double v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
-  core::double v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
-  core::double v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
-  core::double v11 = let final core::double #t12 = self::topLevelDouble in let final core::double #t13 = self::topLevelDouble = #t12.{core::double::+}(1) in #t12;
+  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.{core::num::==}(null) ?{core::num*} self::topLevelDouble = self::getNum() as{TypeError} core::double* : #t10;
+  core::double* v6 = let final core::double* #t11 = self::topLevelDouble in #t11.{core::num::==}(null) ?{core::double*} self::topLevelDouble = self::getDouble() : #t11;
+  core::double* v7 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getInt());
+  core::double* v8 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getNum());
+  core::double* v9 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(self::getDouble());
+  core::double* v10 = self::topLevelDouble = self::topLevelDouble.{core::double::+}(1);
+  core::double* v11 = let final core::double* #t12 = self::topLevelDouble in let final core::double* #t13 = self::topLevelDouble = #t12.{core::double::+}(1) in #t12;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect
index 86fb4dd..4b59c09 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.expect
@@ -11,15 +11,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  abstract get x() → core::int*;
+  abstract set x(core::double* value) → void;
 }
 class B extends self::A {
   field invalid-type x = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect
index 86fb4dd..4b59c09 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.legacy.transformed.expect
@@ -11,15 +11,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  abstract get x() → core::int*;
+  abstract set x(core::double* value) → void;
 }
 class B extends self::A {
   field invalid-type x = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
index faa675a..21e5e15 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.outline.expect
@@ -11,14 +11,14 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  abstract get x() → core::int*;
+  abstract set x(core::double* value) → void;
 }
 class B extends self::A {
   field invalid-type x;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
index 86fb4dd..4b59c09 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_getter_setter_mismatch.dart.strong.expect
@@ -11,15 +11,15 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::int;
-  abstract set x(core::double value) → void;
+  abstract get x() → core::int*;
+  abstract set x(core::double* value) → void;
 }
 class B extends self::A {
   field invalid-type x = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.expect
index 0517fd9..1f6563a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  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 get x() → self::A*;
+  abstract set x(self::B* value) → void;
+  abstract get y() → self::B*;
+  abstract set y(self::A* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  field self::A x = null;
+  field self::A* x = null;
   field invalid-type y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.transformed.expect
index 0517fd9..1f6563a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.legacy.transformed.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  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 get x() → self::A*;
+  abstract set x(self::B* value) → void;
+  abstract get y() → self::B*;
+  abstract set y(self::A* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  field self::A x = null;
+  field self::A* x = null;
   field invalid-type y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
index b6f7118..2b5aaee 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.outline.expect
@@ -11,21 +11,21 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  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 get x() → self::A*;
+  abstract set x(self::B* value) → void;
+  abstract get y() → self::B*;
+  abstract set y(self::A* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::B {
-  field self::A x;
+  field self::A* x;
   field invalid-type y;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
index 0517fd9..1f6563a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_accessors.dart.strong.expect
@@ -11,23 +11,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  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 get x() → self::A*;
+  abstract set x(self::B* value) → void;
+  abstract get y() → self::B*;
+  abstract set y(self::A* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  field self::A x = null;
+  field self::A* x = null;
   field invalid-type y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect
index d21c794..cbb9102 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.expect
@@ -11,20 +11,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::num value) → void;
+  abstract set x(core::num* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
   field invalid-type x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect
index d21c794..cbb9102 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.legacy.transformed.expect
@@ -11,20 +11,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::num value) → void;
+  abstract set x(core::num* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
   field invalid-type x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
index 42cca77..b8c0502 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.outline.expect
@@ -11,18 +11,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract set x(core::num value) → void;
+  abstract set x(core::num* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
   field invalid-type x;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
index d21c794..cbb9102 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_getter_overrides_setter.dart.strong.expect
@@ -11,20 +11,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(core::num value) → void;
+  abstract set x(core::num* value) → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract get x() → core::int;
+  abstract get x() → core::int*;
 }
 class C extends self::B {
   field invalid-type x = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect
index eec7015..5cdec7f 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class C extends self::B {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect
index eec7015..5cdec7f 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class C extends self::B {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
index ef2b978..db06c2a 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class C extends self::B {
-  field core::num x;
-  synthetic constructor •() → self::C
+  field core::num* x;
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
index eec7015..5cdec7f 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class C extends self::B {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
index eec7015..5cdec7f 100644
--- a/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_field_override_setter_overrides_getter.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract get x() → core::num;
+  abstract get x() → core::num*;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  abstract set x(core::int value) → void;
+  abstract set x(core::int* value) → void;
 }
 class C extends self::B {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect
index a60c839..34dec34 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get c() → self::C
+  get c() → self::C*
     return null;
-  set c(self::C value) → void {}
+  set c(self::C* value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect
index a60c839..34dec34 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.legacy.transformed.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get c() → self::C
+  get c() → self::C*
     return null;
-  set c(self::C value) → void {}
+  set c(self::C* value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
index b71ace2..fe43c76 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.outline.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b;
-  synthetic constructor •() → self::A
+  field self::B* b;
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get c() → self::C
+  get c() → self::C*
     ;
-  set c(self::C value) → void
+  set c(self::C* value) → void
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.expect
index 1caa8a4..c9bc95a 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.expect
@@ -3,30 +3,30 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get c() → self::C
+  get c() → self::C*
     return null;
-  set c(self::C value) → void {}
+  set c(self::C* value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  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::c};
-static field self::C y = let final self::B #t1 = self::a.{self::A::b} in let final self::C #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(null) ?{self::C} #t1.{self::B::c} = new self::D::•() : #t2;
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}.{self::B::c};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b} in let final self::C* #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(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_accessor_ref.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.transformed.expect
index 1caa8a4..c9bc95a 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_accessor_ref.dart.strong.transformed.expect
@@ -3,30 +3,30 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get c() → self::C
+  get c() → self::C*
     return null;
-  set c(self::C value) → void {}
+  set c(self::C* value) → void {}
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  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::c};
-static field self::C y = let final self::B #t1 = self::a.{self::A::b} in let final self::C #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(null) ?{self::C} #t1.{self::B::c} = new self::D::•() : #t2;
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}.{self::B::c};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b} in let final self::C* #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(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.legacy.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.expect
index 87d3eb2..d55cc2e 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::C c = null;
-  synthetic constructor •() → self::B
+  field self::C* c = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect
index 87d3eb2..d55cc2e 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.legacy.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::C c = null;
-  synthetic constructor •() → self::B
+  field self::C* c = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
index a614d4a..f51db36 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b;
-  synthetic constructor •() → self::A
+  field self::B* b;
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  field self::C c;
-  synthetic constructor •() → self::B
+  field self::C* c;
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.expect
index d6a1de8..b7f79cd 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::C c = null;
-  synthetic constructor •() → self::B
+  field self::C* c = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  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::c};
-static field self::C y = let final self::B #t1 = self::a.{self::A::b} in let final self::C #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(null) ?{self::C} #t1.{self::B::c} = new self::D::•() : #t2;
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}.{self::B::c};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b} in let final self::C* #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.transformed.expect
index d6a1de8..b7f79cd 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref.dart.strong.transformed.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::A
+  field self::B* b = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  field self::C c = null;
-  synthetic constructor •() → self::B
+  field self::C* c = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  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::c};
-static field self::C y = let final self::B #t1 = self::a.{self::A::b} in let final self::C #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(null) ?{self::C} #t1.{self::B::c} = new self::D::•() : #t2;
+static field self::A* a = new self::A::•();
+static field self::C* x = self::a.{self::A::b}.{self::B::c};
+static field self::C* y = let final self::B* #t1 = self::a.{self::A::b} in let final self::C* #t2 = #t1.{self::B::c} in #t2.{core::Object::==}(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 b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
index f24c3f1..ba79be3 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart
@@ -8,12 +8,12 @@
 // In the code below, there is a circularity between A.b and x.
 
 class A {
-  var b = /*@returnType=() -> invalid-type*/ () => x;
-  var c = /*@returnType=() -> invalid-type*/ () => x;
+  var b = /*@ returnType=() ->* invalid-type */ () => x;
+  var c = /*@ returnType=() ->* invalid-type */ () => x;
 }
 
 var a = new A();
-var x = /*@returnType=invalid-type*/ () => a. /*@target=A::b*/ b;
-var y = /*@returnType=() -> () -> invalid-type*/ () => a. /*@target=A::c*/ c;
+var x = /*@ returnType=invalid-type */ () => a. /*@target=A::b*/ b;
+var y = /*@ returnType=() ->* () ->* invalid-type */ () => a. /*@target=A::c*/ c;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect
index e8693e3..94bd700 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field dynamic b = () → dynamic => self::x;
   field dynamic c = () → dynamic => self::x;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect
index e8693e3..94bd700 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.legacy.transformed.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field dynamic b = () → dynamic => self::x;
   field dynamic c = () → dynamic => self::x;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
index 13d13cb..aae5d7d 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.outline.expect
@@ -5,7 +5,7 @@
 class A extends core::Object {
   field dynamic b;
   field dynamic c;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
index 73a2dd9..e6998d8 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.expect
@@ -4,20 +4,20 @@
 //
 // 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;
+//   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) as{TypeError} invalid-type;
-  field () → () → invalid-type c = () → () → invalid-type => self::x;
-  synthetic constructor •() → self::A
+  field invalid-type b = (() → () →* invalid-type => self::x) as{TypeError} invalid-type;
+  field () →* () →* invalid-type c = () → () →* invalid-type => self::x;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
-static field () → invalid-type x = () → invalid-type => self::a.{self::A::b};
-static field () → () → () → invalid-type y = () → () → () → invalid-type => self::a.{self::A::c};
+static field self::A* a = new self::A::•();
+static field () →* invalid-type x = () → invalid-type => self::a.{self::A::b};
+static field () →* () →* () →* invalid-type y = () → () →* () →* invalid-type => self::a.{self::A::c};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
index 73a2dd9..e6998d8 100644
--- a/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_instance_field_ref_circular.dart.strong.transformed.expect
@@ -4,20 +4,20 @@
 //
 // 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;
+//   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) as{TypeError} invalid-type;
-  field () → () → invalid-type c = () → () → invalid-type => self::x;
-  synthetic constructor •() → self::A
+  field invalid-type b = (() → () →* invalid-type => self::x) as{TypeError} invalid-type;
+  field () →* () →* invalid-type c = () → () →* invalid-type => self::x;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static field self::A a = new self::A::•();
-static field () → invalid-type x = () → invalid-type => self::a.{self::A::b};
-static field () → () → () → invalid-type y = () → () → () → invalid-type => self::a.{self::A::c};
+static field self::A* a = new self::A::•();
+static field () →* invalid-type x = () → invalid-type => self::a.{self::A::b};
+static field () →* () →* () →* invalid-type y = () → () →* () →* invalid-type => self::a.{self::A::c};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart b/pkg/front_end/testcases/inference_new/infer_logical.dart
index 5cf7f8a..d7823ec 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart
@@ -7,12 +7,12 @@
 
 T f<T>() => null;
 
-var x = /*@typeArgs=bool*/ f() || /*@typeArgs=bool*/ f();
-var y = /*@typeArgs=bool*/ f() && /*@typeArgs=bool*/ f();
+var x = /*@ typeArgs=bool* */ f() || /*@ typeArgs=bool* */ f();
+var y = /*@ typeArgs=bool* */ f() && /*@ typeArgs=bool* */ f();
 
 void test() {
-  var /*@type=bool*/ x = /*@typeArgs=bool*/ f() || /*@typeArgs=bool*/ f();
-  var /*@type=bool*/ y = /*@typeArgs=bool*/ f() && /*@typeArgs=bool*/ f();
+  var /*@ type=bool* */ x = /*@ typeArgs=bool* */ f() || /*@ typeArgs=bool* */ f();
+  var /*@ type=bool* */ y = /*@ typeArgs=bool* */ f() && /*@ typeArgs=bool* */ f();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect
index 4656afd..52f3998 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x = self::f<dynamic>() || self::f<dynamic>();
 static field dynamic y = self::f<dynamic>() && self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   dynamic x = self::f<dynamic>() || self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect
index 4656afd..52f3998 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x = self::f<dynamic>() || self::f<dynamic>();
 static field dynamic y = self::f<dynamic>() && self::f<dynamic>();
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   dynamic x = self::f<dynamic>() || self::f<dynamic>();
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
index a718af3..2f9d5ce 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.outline.expect
@@ -4,7 +4,7 @@
 
 static field dynamic x;
 static field dynamic y;
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
index 1791f79..2b05154 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.expect
@@ -2,12 +2,12 @@
 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
+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>();
+  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_logical.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
index 1791f79..2b05154 100644
--- a/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_logical.dart.strong.transformed.expect
@@ -2,12 +2,12 @@
 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
+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>();
+  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.legacy.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.expect
index 3493bd8..ff91341 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect
index 3493bd8..ff91341 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
index fbaac00..093da51 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.outline.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method f() → void
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method f() → void
     ;
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.expect
index b39e8c5..35473b7 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.transformed.expect
index b39e8c5..35473b7 100644
--- a/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/infer_use_of_void.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method f() → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method f() → void {}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect
index 321c94e..d04529a 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i;
-static field core::String s;
+static field core::int* i;
+static field core::String* s;
 static field dynamic x = self::i = self::s;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect
index 321c94e..d04529a 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i;
-static field core::String s;
+static field core::int* i;
+static field core::String* s;
 static field dynamic x = self::i = self::s;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
index 52eb53b..2c1f8c3 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i;
-static field core::String s;
+static field core::int* i;
+static field core::String* s;
 static field dynamic x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
index 5768908..97a4e94 100644
--- a/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/invalid_assignment_during_toplevel_inference.dart.strong.expect
@@ -10,10 +10,10 @@
 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 = let final<BottomType> #t1 = 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'.
+static field core::int* i;
+static field core::String* s;
+static field core::String* x = self::i = let final<BottomType> #t1 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'int'.
 var x = i = s;
-            ^" in self::s as{TypeError} core::int;
+            ^" 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 b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
index 1045584..83fd2d8 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@typeArgs=Null*/ [null];
+var x = /*@ typeArgs=Null* */ [null];
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
index 566cf74..1b33259 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null> x = <core::Null>[null];
+static field core::List<core::Null*>* x = <core::Null*>[null];
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
index 566cf74..1b33259 100644
--- a/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/list_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::Null> x = <core::Null>[null];
+static field core::List<core::Null*>* x = <core::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 b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
index 04c633b..17b5a27 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart
@@ -5,7 +5,7 @@
 /*@testedFeatures=inference*/
 library test;
 
-var x = /*@typeArgs=Null, Null*/ {null: null};
+var x = /*@ typeArgs=Null*, Null* */ {null: null};
 
 main() {
   x;
diff --git a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
index 8c2f105..79c64f0 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null, core::Null> x = <core::Null, core::Null>{null: null};
+static field core::Map<core::Null*, core::Null*>* x = <core::Null*, core::Null*>{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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
index 8c2f105..79c64f0 100644
--- a/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/map_literals_can_infer_null_top_level.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::Map<core::Null, core::Null> x = <core::Null, core::Null>{null: null};
+static field core::Map<core::Null*, core::Null*>* x = <core::Null*, core::Null*>{null: null};
 static method main() → dynamic {
   self::x;
 }
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect
index e52d854..14f8b14 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
-  abstract method f(core::int i) → void;
+  abstract method f(core::int* i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract method f(core::Object o) → void;
+  abstract method f(core::Object* o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object o) → void;
+  abstract forwarding-stub method f(core::Object* o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f("hi");
 }
-static method g2(self::E e) → void {
+static method g2(self::E* e) → void {
   e.f("hi");
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect
index e52d854..14f8b14 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.legacy.transformed.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
-  abstract method f(core::int i) → void;
+  abstract method f(core::int* i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract method f(core::Object o) → void;
+  abstract method f(core::Object* o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object o) → void;
+  abstract forwarding-stub method f(core::Object* o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f("hi");
 }
-static method g2(self::E e) → void {
+static method g2(self::E* e) → void {
   e.f("hi");
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
index 68748a3..934d9e8 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.outline.expect
@@ -3,39 +3,39 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     ;
-  abstract method f(core::int i) → void;
+  abstract method f(core::int* i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     ;
-  abstract method f(core::Object o) → void;
+  abstract method f(core::Object* o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method f(core::Object o) → void;
+  abstract forwarding-stub method f(core::Object* o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  method f(core::Object o) → void
+  method f(core::Object* o) → void
     ;
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
-  method f(core::Object o) → void
+  method f(core::Object* o) → void
     ;
 }
-static method g1(self::C c) → void
+static method g1(self::C* c) → void
   ;
-static method g2(self::E e) → void
+static method g2(self::E* e) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
index 404c672..f04213d 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
-  abstract method f(core::int i) → void;
+  abstract method f(core::int* i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract method f(core::Object o) → void;
+  abstract method f(core::Object* o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object o) → void;
+  abstract forwarding-stub method f(core::Object* o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}("hi");
 }
-static method g2(self::E e) → void {
+static method g2(self::E* e) → void {
   e.{self::I2::f}("hi");
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
index 404c672..f04213d 100644
--- a/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/multiple_interface_inheritance.dart.strong.transformed.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
-  abstract method f(core::int i) → void;
+  abstract method f(core::int* i) → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
-  abstract method f(core::Object o) → void;
+  abstract method f(core::Object* o) → void;
 }
 abstract class C extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method f(core::Object o) → void;
+  abstract forwarding-stub method f(core::Object* o) → void;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
 abstract class E extends core::Object implements self::I2, self::I1 {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends self::E {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super self::E::•()
     ;
-  method f(core::Object o) → void {}
+  method f(core::Object* o) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}("hi");
 }
-static method g2(self::E e) → void {
+static method g2(self::E* e) → void {
   e.{self::I2::f}("hi");
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart
index bb380e4..b4c2286 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart
@@ -32,19 +32,19 @@
 }
 
 void test1(G g) {
-  g. /*@target=G::target*/ target *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ x =
-      g. /*@target=G::target*/ target *= /*@typeArgs=dynamic*/ f();
+  g. /*@target=G::target*/ target *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ x =
+      g. /*@target=G::target*/ target *= /*@ typeArgs=dynamic */ f();
 }
 
 void test2(G g) {
   ++g. /*@target=G::target*/ target;
-  var /*@type=C*/ x = ++g. /*@target=G::target*/ target;
+  var /*@ type=C* */ x = ++g. /*@target=G::target*/ target;
 }
 
 void test3(G g) {
   g. /*@target=G::target*/ target++;
-  var /*@type=A*/ x = g. /*@target=G::target*/ target++;
+  var /*@ type=A* */ x = g. /*@target=G::target*/ target++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect
index 19938fa..556c8d1 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  get target() → self::A
+  get target() → self::A*
     return null;
-  set target(self::B value) → void {}
+  set target(self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test1(self::G g) → void {
+static method test1(self::G* g) → void {
   let final dynamic #t1 = g in #t1.target = #t1.target.*(self::f<dynamic>());
   dynamic x = let final dynamic #t2 = g in #t2.target = #t2.target.*(self::f<dynamic>());
 }
-static method test2(self::G g) → void {
+static method test2(self::G* g) → void {
   let final dynamic #t3 = g in #t3.target = #t3.target.+(1);
   dynamic x = let final dynamic #t4 = g in #t4.target = #t4.target.+(1);
 }
-static method test3(self::G g) → void {
+static method test3(self::G* g) → void {
   let final dynamic #t5 = g in #t5.target = #t5.target.+(1);
   dynamic x = let final dynamic #t6 = g in let final dynamic #t7 = #t6.target in let final dynamic #t8 = #t6.target = #t7.+(1) in #t7;
 }
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect
index 19938fa..556c8d1 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.legacy.transformed.expect
@@ -3,62 +3,62 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  get target() → self::A
+  get target() → self::A*
     return null;
-  set target(self::B value) → void {}
+  set target(self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test1(self::G g) → void {
+static method test1(self::G* g) → void {
   let final dynamic #t1 = g in #t1.target = #t1.target.*(self::f<dynamic>());
   dynamic x = let final dynamic #t2 = g in #t2.target = #t2.target.*(self::f<dynamic>());
 }
-static method test2(self::G g) → void {
+static method test2(self::G* g) → void {
   let final dynamic #t3 = g in #t3.target = #t3.target.+(1);
   dynamic x = let final dynamic #t4 = g in #t4.target = #t4.target.+(1);
 }
-static method test3(self::G g) → void {
+static method test3(self::G* g) → void {
   let final dynamic #t5 = g in #t5.target = #t5.target.+(1);
   dynamic x = let final dynamic #t6 = g in let final dynamic #t7 = #t6.target in let final dynamic #t8 = #t6.target = #t7.+(1) in #t7;
 }
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
index 5a6c5f7..3cae436 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.outline.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     ;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     ;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     ;
-  get target() → self::A
+  get target() → self::A*
     ;
-  set target(self::B value) → void
+  set target(self::B* value) → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static method test1(self::G g) → void
+static method test1(self::G* g) → void
   ;
-static method test2(self::G g) → void
+static method test2(self::G* g) → void
   ;
-static method test3(self::G g) → void
+static method test3(self::G* g) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
index 61f2824..572f472 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.expect
@@ -3,63 +3,63 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  get target() → self::A
+  get target() → self::A*
     return null;
-  set target(self::B value) → void {}
+  set target(self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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::f<dynamic>() as{TypeError} self::D);
-  self::C x = let final self::G #t2 = g in #t2.{self::G::target} = #t2.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
+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::f<dynamic>() as{TypeError} self::D*);
+  self::C* x = let final self::G* #t2 = g in #t2.{self::G::target} = #t2.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
 }
-static method test2(self::G g) → void {
-  let final self::G #t3 = g in #t3.{self::G::target} = #t3.{self::G::target}.{self::A::+}(1);
-  self::C x = let final self::G #t4 = g in #t4.{self::G::target} = #t4.{self::G::target}.{self::A::+}(1);
+static method test2(self::G* g) → void {
+  let final self::G* #t3 = g in #t3.{self::G::target} = #t3.{self::G::target}.{self::A::+}(1);
+  self::C* x = let final self::G* #t4 = g in #t4.{self::G::target} = #t4.{self::G::target}.{self::A::+}(1);
 }
-static method test3(self::G g) → void {
-  let final self::G #t5 = g in #t5.{self::G::target} = #t5.{self::G::target}.{self::A::+}(1);
-  self::A x = let final self::G #t6 = g in let final self::A #t7 = #t6.{self::G::target} in let final self::C #t8 = #t6.{self::G::target} = #t7.{self::A::+}(1) in #t7;
+static method test3(self::G* g) → void {
+  let final self::G* #t5 = g in #t5.{self::G::target} = #t5.{self::G::target}.{self::A::+}(1);
+  self::A* x = let final self::G* #t6 = g in let final self::A* #t7 = #t6.{self::G::target} in let final self::C* #t8 = #t6.{self::G::target} = #t7.{self::A::+}(1) in #t7;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
index 61f2824..572f472 100644
--- a/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_assign_combiner.dart.strong.transformed.expect
@@ -3,63 +3,63 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  get target() → self::A
+  get target() → self::A*
     return null;
-  set target(self::B value) → void {}
+  set target(self::B* value) → void {}
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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::f<dynamic>() as{TypeError} self::D);
-  self::C x = let final self::G #t2 = g in #t2.{self::G::target} = #t2.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
+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::f<dynamic>() as{TypeError} self::D*);
+  self::C* x = let final self::G* #t2 = g in #t2.{self::G::target} = #t2.{self::G::target}.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
 }
-static method test2(self::G g) → void {
-  let final self::G #t3 = g in #t3.{self::G::target} = #t3.{self::G::target}.{self::A::+}(1);
-  self::C x = let final self::G #t4 = g in #t4.{self::G::target} = #t4.{self::G::target}.{self::A::+}(1);
+static method test2(self::G* g) → void {
+  let final self::G* #t3 = g in #t3.{self::G::target} = #t3.{self::G::target}.{self::A::+}(1);
+  self::C* x = let final self::G* #t4 = g in #t4.{self::G::target} = #t4.{self::G::target}.{self::A::+}(1);
 }
-static method test3(self::G g) → void {
-  let final self::G #t5 = g in #t5.{self::G::target} = #t5.{self::G::target}.{self::A::+}(1);
-  self::A x = let final self::G #t6 = g in let final self::A #t7 = #t6.{self::G::target} in let final self::C #t8 = #t6.{self::G::target} = #t7.{self::A::+}(1) in #t7;
+static method test3(self::G* g) → void {
+  let final self::G* #t5 = g in #t5.{self::G::target} = #t5.{self::G::target}.{self::A::+}(1);
+  self::A* x = let final self::G* #t6 = g in let final self::A* #t7 = #t6.{self::G::target} in let final self::C* #t8 = #t6.{self::G::target} = #t7.{self::A::+}(1) in #t7;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart
index e0201da..c5af4df 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart
@@ -15,9 +15,9 @@
 var field_ref = c. /*@target=C::field*/ field;
 var getter_ref = c. /*@target=C::getter*/ getter;
 var function_ref = c. /*@target=C::function*/ function;
-var field_ref_list = /*@typeArgs=int*/ [c. /*@target=C::field*/ field];
-var getter_ref_list = /*@typeArgs=int*/ [c. /*@target=C::getter*/ getter];
-var function_ref_list = /*@typeArgs=() -> int*/ [
+var field_ref_list = /*@ typeArgs=int* */ [c. /*@target=C::field*/ field];
+var getter_ref_list = /*@ typeArgs=int* */ [c. /*@target=C::getter*/ getter];
+var function_ref_list = /*@ typeArgs=() ->* int* */ [
   c. /*@target=C::function*/ function
 ];
 
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect
index f626bda..35e3047 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic field_ref = self::c.field;
 static field dynamic getter_ref = self::c.getter;
 static field dynamic function_ref = self::c.function;
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect
index f626bda..35e3047 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
+static field self::C* c = new self::C::•();
 static field dynamic field_ref = self::c.field;
 static field dynamic getter_ref = self::c.getter;
 static field dynamic function_ref = self::c.function;
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
index 7c64dbc..c49eaef 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field;
-  synthetic constructor •() → self::C
+  field core::int* field;
+  synthetic constructor •() → self::C*
     ;
-  get getter() → core::int
+  get getter() → core::int*
     ;
-  method function() → core::int
+  method function() → core::int*
     ;
 }
-static field self::C c;
+static field self::C* c;
 static field dynamic field_ref;
 static field dynamic getter_ref;
 static field dynamic function_ref;
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.expect
index 56db9bc..92a8ca1c 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
-static field core::int field_ref = self::c.{self::C::field};
-static field core::int getter_ref = self::c.{self::C::getter};
-static field () → core::int function_ref = self::c.{self::C::function};
-static field core::List<core::int> field_ref_list = <core::int>[self::c.{self::C::field}];
-static field core::List<core::int> getter_ref_list = <core::int>[self::c.{self::C::getter}];
-static field core::List<() → core::int> function_ref_list = <() → core::int>[self::c.{self::C::function}];
+static field self::C* c = new self::C::•();
+static field core::int* field_ref = self::c.{self::C::field};
+static field core::int* getter_ref = self::c.{self::C::getter};
+static field () →* core::int* function_ref = self::c.{self::C::function};
+static field core::List<core::int*>* field_ref_list = <core::int*>[self::c.{self::C::field}];
+static field core::List<core::int*>* getter_ref_list = <core::int*>[self::c.{self::C::getter}];
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.transformed.expect
index 56db9bc..92a8ca1c 100644
--- a/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/property_get_toplevel.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::int field = 0;
-  synthetic constructor •() → self::C
+  field core::int* field = 0;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  get getter() → core::int
+  get getter() → core::int*
     return 0;
-  method function() → core::int
+  method function() → core::int*
     return 0;
 }
-static field self::C c = new self::C::•();
-static field core::int field_ref = self::c.{self::C::field};
-static field core::int getter_ref = self::c.{self::C::getter};
-static field () → core::int function_ref = self::c.{self::C::function};
-static field core::List<core::int> field_ref_list = <core::int>[self::c.{self::C::field}];
-static field core::List<core::int> getter_ref_list = <core::int>[self::c.{self::C::getter}];
-static field core::List<() → core::int> function_ref_list = <() → core::int>[self::c.{self::C::function}];
+static field self::C* c = new self::C::•();
+static field core::int* field_ref = self::c.{self::C::field};
+static field core::int* getter_ref = self::c.{self::C::getter};
+static field () →* core::int* function_ref = self::c.{self::C::function};
+static field core::List<core::int*>* field_ref_list = <core::int*>[self::c.{self::C::field}];
+static field core::List<core::int*>* getter_ref_list = <core::int*>[self::c.{self::C::getter}];
+static field core::List<() →* core::int*>* function_ref_list = <() →* core::int*>[self::c.{self::C::function}];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart
index 9c13c81..2d57409 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart
@@ -30,18 +30,18 @@
 void set target(B value) {}
 
 void test1() {
-  target *= /*@typeArgs=dynamic*/ f();
-  var /*@type=C*/ x = target *= /*@typeArgs=dynamic*/ f();
+  target *= /*@ typeArgs=dynamic */ f();
+  var /*@ type=C* */ x = target *= /*@ typeArgs=dynamic */ f();
 }
 
 void test2() {
   ++target;
-  var /*@type=C*/ x = ++target;
+  var /*@ type=C* */ x = ++target;
 }
 
 void test3() {
   target++;
-  var /*@type=A*/ x = target++;
+  var /*@ type=A* */ x = target++;
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect
index eb2b193..e507598 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.expect
@@ -3,48 +3,48 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static get target() → self::A
+static get target() → self::A*
   return null;
-static set target(self::B value) → void {}
+static set target(self::B* value) → void {}
 static method test1() → void {
   self::target = self::target.*(self::f<dynamic>());
   dynamic x = self::target = self::target.*(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect
index eb2b193..e507598 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.legacy.transformed.expect
@@ -3,48 +3,48 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static get target() → self::A
+static get target() → self::A*
   return null;
-static set target(self::B value) → void {}
+static set target(self::B* value) → void {}
 static method test1() → void {
   self::target = self::target.*(self::f<dynamic>());
   dynamic x = self::target = self::target.*(self::f<dynamic>());
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
index a4277e4..fc93d6b 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.outline.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     ;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     ;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static get target() → self::A
+static get target() → self::A*
   ;
-static set target(self::B value) → void
+static set target(self::B* value) → void
   ;
 static method test1() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
index 0614d7a..c941a13 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.expect
@@ -3,58 +3,58 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static get target() → self::A
+static get target() → self::A*
   return null;
-static set target(self::B value) → void {}
+static set target(self::B* value) → void {}
 static method test1() → void {
-  self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
-  self::C x = self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
+  self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
+  self::C* x = self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
 }
 static method test2() → void {
   self::target = self::target.{self::A::+}(1);
-  self::C x = self::target = self::target.{self::A::+}(1);
+  self::C* x = self::target = self::target.{self::A::+}(1);
 }
 static method test3() → void {
   self::target = self::target.{self::A::+}(1);
-  self::A x = let final self::A #t1 = self::target in let final self::C #t2 = self::target = #t1.{self::A::+}(1) in #t1;
+  self::A* x = let final self::A* #t1 = self::target in let final self::C* #t2 = self::target = #t1.{self::A::+}(1) in #t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
index 0614d7a..c941a13 100644
--- a/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/static_assign_combiner.dart.strong.transformed.expect
@@ -3,58 +3,58 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::C
+  operator +(core::int* value) → self::C*
     return null;
-  operator *(self::D value) → self::C
+  operator *(self::D* value) → self::C*
     return null;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator +(core::int value) → self::E
+  operator +(core::int* value) → self::E*
     return null;
-  operator *(self::F value) → self::E
+  operator *(self::F* value) → self::E*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static get target() → self::A
+static get target() → self::A*
   return null;
-static set target(self::B value) → void {}
+static set target(self::B* value) → void {}
 static method test1() → void {
-  self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
-  self::C x = self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D);
+  self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
+  self::C* x = self::target = self::target.{self::A::*}(self::f<dynamic>() as{TypeError} self::D*);
 }
 static method test2() → void {
   self::target = self::target.{self::A::+}(1);
-  self::C x = self::target = self::target.{self::A::+}(1);
+  self::C* x = self::target = self::target.{self::A::+}(1);
 }
 static method test3() → void {
   self::target = self::target.{self::A::+}(1);
-  self::A x = let final self::A #t1 = self::target in let final self::C #t2 = self::target = #t1.{self::A::+}(1) in #t1;
+  self::A* x = let final self::A* #t1 = self::target in let final self::C* #t2 = self::target = #t1.{self::A::+}(1) in #t1;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
index d378992..e4e45fa 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart
@@ -14,8 +14,8 @@
 // circularity, and for error recovery their type is set to `dynamic`.
 // Thereafter, z infers without problems.
 
-var x = /*@returnType=() -> invalid-type*/ () => f() ? y : z;
-var y = /*@returnType=invalid-type*/ () => x;
-var z = /*@returnType=invalid-type*/ () => x;
+var x = /*@ returnType=() ->* invalid-type */ () => f() ? y : z;
+var y = /*@ returnType=invalid-type */ () => x;
+var z = /*@ returnType=invalid-type */ () => x;
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect
index 5124459..7897141 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.expect
@@ -5,6 +5,6 @@
 static field dynamic x = () → dynamic => self::f() ? self::y : self::z;
 static field dynamic y = () → dynamic => self::x;
 static field dynamic z = () → dynamic => self::x;
-static method f() → core::bool
+static method f() → core::bool*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect
index 5124459..7897141 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.legacy.transformed.expect
@@ -5,6 +5,6 @@
 static field dynamic x = () → dynamic => self::f() ? self::y : self::z;
 static field dynamic y = () → dynamic => self::x;
 static field dynamic z = () → dynamic => self::x;
-static method f() → core::bool
+static method f() → core::bool*
   return null;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
index 136f060..34725d5 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.outline.expect
@@ -5,7 +5,7 @@
 static field dynamic x;
 static field dynamic y;
 static field dynamic z;
-static method f() → core::bool
+static method f() → core::bool*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
index b228e01..d5891bf 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.expect
@@ -4,15 +4,15 @@
 //
 // 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;
+// 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) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
-static field () → invalid-type z = () → invalid-type => self::x;
-static method f() → core::bool
+static field invalid-type x = (() → () →* invalid-type => self::f() ?{() →* invalid-type} self::y : self::z) as{TypeError} invalid-type;
+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/strongly_connected_component.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
index b228e01..d5891bf 100644
--- a/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/strongly_connected_component.dart.strong.transformed.expect
@@ -4,15 +4,15 @@
 //
 // 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;
+// 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) as{TypeError} invalid-type;
-static field () → invalid-type y = () → invalid-type => self::x;
-static field () → invalid-type z = () → invalid-type => self::x;
-static method f() → core::bool
+static field invalid-type x = (() → () →* invalid-type => self::f() ?{() →* invalid-type} self::y : self::z) as{TypeError} invalid-type;
+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 b/pkg/front_end/testcases/inference_new/super_index_get.dart
index 09ea9c7..5bf9411 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart
@@ -16,7 +16,7 @@
 class C extends B {
   int operator [](Object x) => null;
   void h() {
-    var /*@type=num*/ x = super /*@target=B::[]*/ [/*@typeArgs=int*/ f()];
+    var /*@ type=num* */ x = super /*@target=B::[]*/ [/*@ typeArgs=int* */ f()];
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect
index 102ef4c..7ae8f9f 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.expect
@@ -5,22 +5,22 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator [](core::int x) → core::num
+  operator [](core::int* x) → core::num*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator [](core::Object x) → core::int
+  operator [](core::Object* x) → core::int*
     return null;
   method h() → void {
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.transformed.expect
index 102ef4c..7ae8f9f 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.legacy.transformed.expect
@@ -5,22 +5,22 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator [](core::int x) → core::num
+  operator [](core::int* x) → core::num*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator [](core::Object x) → core::int
+  operator [](core::Object* x) → core::int*
     return null;
   method h() → void {
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.outline.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
index 516bba1..e2f9f00 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.outline.expect
@@ -5,20 +5,20 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator [](core::int x) → core::num
+  operator [](core::int* x) → core::num*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  operator [](core::Object x) → core::int
+  operator [](core::Object* x) → core::int*
     ;
   method h() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
index 8f00549..3f1fcb0 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.expect
@@ -5,22 +5,22 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator [](core::int x) → core::num
+  operator [](core::int* x) → core::num*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator [](core::Object x) → core::int
+  operator [](core::Object* x) → core::int*
     return null;
   method h() → void {
-    core::num x = super.{self::B::[]}(self::f<core::int>());
+    core::num* x = super.{self::B::[]}(self::f<core::int*>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
index 8f00549..3f1fcb0 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get.dart.strong.transformed.expect
@@ -5,22 +5,22 @@
 import "dart:async";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  operator [](core::int x) → core::num
+  operator [](core::int* x) → core::num*
     return null;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  operator [](core::Object x) → core::int
+  operator [](core::Object* x) → core::int*
     return null;
   method h() → void {
-    core::num x = super.{self::B::[]}(self::f<core::int>());
+    core::num* x = super.{self::B::[]}(self::f<core::int*>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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 b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart
index 59da0c5..68b938a 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart
@@ -20,8 +20,8 @@
 class C<U> extends B<Future<U>> {
   E<Future<U>> operator [](Object x) => null;
   void h() {
-    var /*@type=D<Future<C::U>>*/ x =
-        super /*@target=B::[]*/ [/*@typeArgs=E<Future<C::U>>*/ f()];
+    var /*@ type=D<Future<C::U*>*>* */ x =
+        super /*@target=B::[]*/ [/*@ typeArgs=E<Future<C::U*>*>* */ f()];
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
index bae8810..021896a 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  operator [](generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     return null;
   method h() → void {
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
index bae8810..021896a 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.legacy.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  operator [](generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     return null;
   method h() → void {
     dynamic x = super.{self::B::[]}(self::f<dynamic>());
   }
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+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.outline.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
index 482f685..409c0e2 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.outline.expect
@@ -5,29 +5,29 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+class E<T extends core::Object* = dynamic> extends self::D<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::T*>*
     ;
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     ;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<asy::Future<self::C::U*>*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  operator [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  operator [](generic-covariant-impl core::Object* x) → self::E<asy::Future<self::C::U*>*>*
     ;
   method h() → void
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
index 48903a6..4a6d293 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  operator [](generic-covariant-impl 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>>>());
+    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
+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.strong.transformed.expect b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
index 48903a6..4a6d293 100644
--- a/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/super_index_get_substitution.dart.strong.transformed.expect
@@ -5,33 +5,33 @@
 
 import "dart:async";
 
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<T extends core::Object = dynamic> extends self::D<self::E::T> {
-  synthetic constructor •() → self::E<self::E::T>
+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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  operator [](generic-covariant-impl self::E<self::B::T> x) → self::D<self::B::T>
+  operator [](generic-covariant-impl self::E<self::B::T*>* x) → self::D<self::B::T*>*
     return null;
 }
-class C<U extends core::Object = dynamic> extends self::B<asy::Future<self::C::U>> {
-  synthetic constructor •() → self::C<self::C::U>
+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 [](generic-covariant-impl core::Object x) → self::E<asy::Future<self::C::U>>
+  operator [](generic-covariant-impl 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>>>());
+    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
+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 b/pkg/front_end/testcases/inference_new/switch.dart
index eb39fd8..db13296 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart
+++ b/pkg/front_end/testcases/inference_new/switch.dart
@@ -13,11 +13,11 @@
 
 void test(C<int> x) {
   switch (x) {
-    case const /*@typeArgs=int*/ C():
-      var /*@type=int*/ y = 0;
+    case const /*@ typeArgs=int* */ C():
+      var /*@ type=int* */ y = 0;
       break;
     default:
-      var /*@type=int*/ y = 0;
+      var /*@ type=int* */ y = 0;
       break;
   }
 }
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.legacy.expect b/pkg/front_end/testcases/inference_new/switch.dart.legacy.expect
index 992aba0..4a42f5e 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test(self::C<core::int> x) → void {
+static method test(self::C<core::int*>* x) → void {
   #L1:
   switch(x) {
     #L2:
-    case const self::C::•<dynamic>():
+    case #C1:
       {
         dynamic y = 0;
         break #L1;
@@ -27,3 +27,7 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect
index 992aba0..4a42f5e 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test(self::C<core::int> x) → void {
+static method test(self::C<core::int*>* x) → void {
   #L1:
   switch(x) {
     #L2:
-    case const self::C::•<dynamic>():
+    case #C1:
       {
         dynamic y = 0;
         break #L1;
@@ -27,3 +27,7 @@
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<dynamic> {}
+}
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.outline.expect b/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
index a1f4ba5..2479571 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.outline.expect
@@ -2,13 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
+    : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
-static method test(self::C<core::int> x) → void
+static method test(self::C<core::int*>* x) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.strong.expect b/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
index 4ad5b14..f3d6d77 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.strong.expect
@@ -2,28 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test(self::C<core::int> x) → void {
+static method test(self::C<core::int*>* x) → void {
   #L1:
   switch(x) {
     #L2:
-    case const self::C::•<core::int>():
+    case #C1:
       {
-        core::int y = 0;
+        core::int* y = 0;
         break #L1;
       }
     #L3:
     default:
       {
-        core::int y = 0;
+        core::int* y = 0;
         break #L1;
       }
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<core::int*> {}
+}
diff --git a/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
index 4ad5b14..f3d6d77 100644
--- a/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/switch.dart.strong.transformed.expect
@@ -2,28 +2,32 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  const constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
-static method test(self::C<core::int> x) → void {
+static method test(self::C<core::int*>* x) → void {
   #L1:
   switch(x) {
     #L2:
-    case const self::C::•<core::int>():
+    case #C1:
       {
-        core::int y = 0;
+        core::int* y = 0;
         break #L1;
       }
     #L3:
     default:
       {
-        core::int y = 0;
+        core::int* y = 0;
         break #L1;
       }
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = self::C<core::int*> {}
+}
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect
index 869fb78..1fa31ca 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract method foo() → self::A;
+  abstract method foo() → self::A*;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  abstract method foo() → self::B;
+  abstract method foo() → self::B*;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B;
+  abstract forwarding-stub method foo() → self::B*;
 }
 class H extends self::G {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::G::•()
     ;
-  method foo() → self::C
+  method foo() → self::C*
     return new self::C::•();
 }
 static field dynamic x = self::bar().foo();
-static method bar() → self::G
+static method bar() → self::G*
   return new self::H::•();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect
index 869fb78..1fa31ca 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.legacy.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract method foo() → self::A;
+  abstract method foo() → self::A*;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  abstract method foo() → self::B;
+  abstract method foo() → self::B*;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B;
+  abstract forwarding-stub method foo() → self::B*;
 }
 class H extends self::G {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::G::•()
     ;
-  method foo() → self::C
+  method foo() → self::C*
     return new self::C::•();
 }
 static field dynamic x = self::bar().foo();
-static method bar() → self::G
+static method bar() → self::G*
   return new self::H::•();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
index b028b33..3e04860 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.outline.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  abstract method foo() → self::A;
+  abstract method foo() → self::A*;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  abstract method foo() → self::B;
+  abstract method foo() → self::B*;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     ;
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     ;
-  abstract forwarding-stub method foo() → self::B;
+  abstract forwarding-stub method foo() → self::B*;
 }
 class H extends self::G {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     ;
-  method foo() → self::C
+  method foo() → self::C*
     ;
 }
 static field dynamic x;
-static method bar() → self::G
+static method bar() → self::G*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
index 2432575..05eb0f3 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract method foo() → self::A;
+  abstract method foo() → self::A*;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  abstract method foo() → self::B;
+  abstract method foo() → self::B*;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B;
+  abstract forwarding-stub method foo() → self::B*;
 }
 class H extends self::G {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::G::•()
     ;
-  method foo() → self::C
+  method foo() → self::C*
     return new self::C::•();
 }
-static field self::B x = self::bar().{self::G::foo}();
-static method bar() → self::G
+static field self::B* x = self::bar().{self::G::foo}();
+static method bar() → self::G*
   return new self::H::•();
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
index 2432575..05eb0f3 100644
--- a/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/top_level_field_depends_on_multiple_inheritance.dart.strong.transformed.expect
@@ -3,52 +3,52 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  abstract method foo() → self::A;
+  abstract method foo() → self::A*;
 }
 abstract class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  abstract method foo() → self::B;
+  abstract method foo() → self::B*;
 }
 abstract class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 abstract class G extends core::Object implements self::D, self::E, self::F {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-  abstract forwarding-stub method foo() → self::B;
+  abstract forwarding-stub method foo() → self::B*;
 }
 class H extends self::G {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super self::G::•()
     ;
-  method foo() → self::C
+  method foo() → self::C*
     return new self::C::•();
 }
-static field self::B x = self::bar().{self::G::foo}();
-static method bar() → self::G
+static field self::B* x = self::bar().{self::G::foo}();
+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 b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
index 937495a5..e5a9e2c 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
+var v = (f) /*@ typeArgs=int* */ (/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
index 9c67644..f02e2b1 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call(() → dynamic {
+static field dynamic v = (#C1).call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
index 9c67644..f02e2b1 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call(() → dynamic {
+static field dynamic v = (#C1).call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
index 49b1ecf..81dff1f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 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.strong.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_dynamic_param_via_expr2.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
index 937495a5..e5a9e2c 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart
@@ -6,7 +6,7 @@
 library test;
 
 List<T> f<T>(T g()) => <T>[g()];
-var v = (f) /*@typeArgs=int*/ (/*@returnType=int*/ () {
+var v = (f) /*@ typeArgs=int* */ (/*@ returnType=int* */ () {
   return 1;
 });
 
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
index 9c67644..f02e2b1 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call(() → dynamic {
+static field dynamic v = (#C1).call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
index 9c67644..f02e2b1 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.legacy.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic v = self::f.call(() → dynamic {
+static field dynamic v = (#C1).call(() → dynamic {
   return 1;
 });
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
-  return <self::f::T>[g.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
index 49b1ecf..81dff1f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic v;
-static method f<T extends core::Object = dynamic>(() → self::f::T g) → core::List<self::f::T>
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
index cd480b4..129610f 100644
--- a/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/unsafe_block_closure_inference_function_call_explicit_type_param_via_expr2.dart.strong.transformed.expect
@@ -2,11 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> v = self::f.call<core::int>(() → core::int {
+static field core::List<core::int*>* v = (#C1).call<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.call()];
+static method f<T extends core::Object* = dynamic>(() →* self::f::T* g) → core::List<self::f::T*>*
+  return <self::f::T*>[g.call()];
 static method main() → dynamic {
   self::v;
 }
+
+constants  {
+  #C1 = tearoff self::f
+}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
index 69ae7ee..e195763 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart
@@ -7,7 +7,7 @@
 
 T run<T>(T f()) {
   print("running");
-  var /*@type=run::T*/ t = f();
+  var /*@ type=run::T* */ t = f();
   print("done running");
   return t;
 }
@@ -16,6 +16,6 @@
   print("running");
 }
 
-var y = /*info:USE_OF_VOID_RESULT*/ /*@typeArgs=void*/ run(printRunning);
+var y = /*info:USE_OF_VOID_RESULT*/ /*@ typeArgs=void */ run(printRunning);
 
 main() {}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect
index f799565..7a588c0 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic y = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+static field dynamic y = self::run<dynamic>(#C1);
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T* {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
@@ -13,3 +13,7 @@
   core::print("running");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
index f799565..7a588c0 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-static field dynamic y = self::run<dynamic>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+static field dynamic y = self::run<dynamic>(#C1);
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T* {
   core::print("running");
   dynamic t = f.call();
   core::print("done running");
@@ -13,3 +13,7 @@
   core::print("running");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
index 4834b17..abbb66b 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static field dynamic y;
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T
+static method run<T extends core::Object* = dynamic>(() →* self::run::T* f) → self::run::T*
   ;
 static method printRunning() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
index 5417786..42f01d5 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field void y = self::run<void>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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.call();
+  self::run::T* t = f.call();
   core::print("done running");
   return t;
 }
@@ -13,3 +13,7 @@
   core::print("running");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
index 5417786..42f01d5 100644
--- a/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/void_return_type_subtypes_dynamic.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field void y = self::run<void>(self::printRunning);
-static method run<T extends core::Object = dynamic>(() → self::run::T f) → self::run::T {
+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.call();
+  self::run::T* t = f.call();
   core::print("done running");
   return t;
 }
@@ -13,3 +13,7 @@
   core::print("running");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::printRunning
+}
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart b/pkg/front_end/testcases/inference_new/while_loop.dart
index 028ea60..764e921 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart
@@ -8,8 +8,8 @@
 T f<T>() => null;
 
 void test() {
-  while (/*@typeArgs=bool*/ f()) {
-    var /*@type=int*/ x = 0;
+  while (/*@ typeArgs=bool* */ f()) {
+    var /*@ type=int* */ x = 0;
   }
 }
 
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect
index 5f1da21..6c0756a 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   while (self::f<dynamic>()) {
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect
index 5f1da21..6c0756a 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.legacy.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   return null;
 static method test() → void {
   while (self::f<dynamic>()) {
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
index e8c03c5..dfd99e1 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+static method f<T extends core::Object* = dynamic>() → self::f::T*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
index a2d0208..7469e19 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+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;
+  while (self::f<core::bool*>()) {
+    core::int* x = 0;
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
index a2d0208..7469e19 100644
--- a/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/inference_new/while_loop.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-static method f<T extends core::Object = dynamic>() → self::f::T
+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;
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.expect
index dc6b102..e97be60 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.expect
@@ -2,21 +2,21 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic, Z extends (self::D::Y*) →* self::D::X* = dynamic, W extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::D<dynamic, dynamic, dynamic, dynamic> d;
+  self::D<dynamic, dynamic, dynamic, dynamic>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect
index dc6b102..e97be60 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.legacy.transformed.expect
@@ -2,21 +2,21 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic, Z extends (self::D::Y*) →* self::D::X* = dynamic, W extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::D<dynamic, dynamic, dynamic, dynamic> d;
+  self::D<dynamic, dynamic, dynamic, dynamic>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
index 3733343..773a50f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.outline.expect
@@ -2,16 +2,16 @@
 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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic, Z extends (self::D::Y) → self::D::X = dynamic, W extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic, Z extends (self::D::Y*) →* self::D::X* = dynamic, W extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
index e94a17c..9f78ee2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.expect
@@ -2,21 +2,21 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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 = (core::Null) → self::B<dynamic, dynamic>, W extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
+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* = (core::Null*) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (core::Null) → self::B<dynamic, dynamic>, core::num> d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null*) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
index e94a17c..9f78ee2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/all_steps.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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 = (core::Null) → self::B<dynamic, dynamic>, W extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y, self::D::Z, self::D::W>
+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* = (core::Null*) →* self::B<dynamic, dynamic>*, W extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*, self::D::Z*, self::D::W*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::D<self::B<dynamic, dynamic>, self::C<dynamic, dynamic>, (core::Null) → self::B<dynamic, dynamic>, core::num> d;
+  self::D<self::B<dynamic, dynamic>*, self::C<dynamic, dynamic>*, (core::Null*) →* self::B<dynamic, dynamic>*, core::num*>* d;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect
index 7e320fc..d673e2c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.expect
@@ -6,13 +6,13 @@
 import "dart:collection";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    col::LinkedListEntry<dynamic> bar;
+    col::LinkedListEntry<dynamic>* bar;
   }
 }
 static method main() → dynamic {
-  col::LinkedListEntry<dynamic> bar;
+  col::LinkedListEntry<dynamic>* bar;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect
index 7e320fc..d673e2c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.legacy.transformed.expect
@@ -6,13 +6,13 @@
 import "dart:collection";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    col::LinkedListEntry<dynamic> bar;
+    col::LinkedListEntry<dynamic>* bar;
   }
 }
 static method main() → dynamic {
-  col::LinkedListEntry<dynamic> bar;
+  col::LinkedListEntry<dynamic>* bar;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.outline.expect
index ec44385..da836cb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.outline.expect
@@ -5,7 +5,7 @@
 import "dart:collection";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect
index 3ca1d7b..3cf1e93 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.expect
@@ -6,13 +6,13 @@
 import "dart:collection";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+    col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* bar;
   }
 }
 static method main() → dynamic {
-  col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+  col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* bar;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.transformed.expect
index 3ca1d7b..3cf1e93 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_generic_classes_from_dill.dart.strong.transformed.expect
@@ -6,13 +6,13 @@
 import "dart:collection";
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+    col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* bar;
   }
 }
 static method main() → dynamic {
-  col::LinkedListEntry<col::LinkedListEntry<dynamic>> bar;
+  col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* bar;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect
index ce1b088..60b05e4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <self::A<dynamic>>[];
+    dynamic a = <self::A<dynamic>*>[];
   }
 }
 static method main() → dynamic {
-  dynamic a = <self::A<dynamic>>[];
+  dynamic a = <self::A<dynamic>*>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect
index ce1b088..60b05e4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <self::A<dynamic>>[];
+    dynamic a = <self::A<dynamic>*>[];
   }
 }
 static method main() → dynamic {
-  dynamic a = <self::A<dynamic>>[];
+  dynamic a = <self::A<dynamic>*>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
index 476334f..1c9866f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
index 4704d96..d9e8f1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    core::List<self::A<core::num>> a = <self::A<core::num>>[];
+    core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {
-  core::List<self::A<core::num>> a = <self::A<core::num>>[];
+  core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
index 4704d96..d9e8f1c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    core::List<self::A<core::num>> a = <self::A<core::num>>[];
+    core::List<self::A<core::num*>*>* a = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {
-  core::List<self::A<core::num>> a = <self::A<core::num>>[];
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.expect
index 9fdf5a9..c180e2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.expect
@@ -2,18 +2,18 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+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>>[];
+    core::List<self::A<self::B::U*>*>* foo = <self::A<self::B::U*>*>[];
+    core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect
index 9fdf5a9..c180e2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+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>>[];
+    core::List<self::A<self::B::U*>*>* foo = <self::A<self::B::U*>*>[];
+    core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
index e9b72c2..9257cd4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.outline.expect
@@ -2,12 +2,12 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+class B<U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::U*>*
     ;
   method fun() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
index 9fdf5a9..c180e2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.expect
@@ -2,18 +2,18 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+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>>[];
+    core::List<self::A<self::B::U*>*>* foo = <self::A<self::B::U*>*>[];
+    core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
index 9fdf5a9..c180e2a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+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>>[];
+    core::List<self::A<self::B::U*>*>* foo = <self::A<self::B::U*>*>[];
+    core::List<self::A<core::num*>*>* bar = <self::A<core::num*>*>[];
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect
index 699b329..35bc6ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+    dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
   }
 }
 static method main() → dynamic {
-  dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+  dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect
index 699b329..35bc6ea 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+    dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
   }
 }
 static method main() → dynamic {
-  dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+  dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
index 476334f..1c9866f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
index 3974c9a..fc06cc7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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>>{};
+    core::Map<self::A<core::num*>*, self::A<core::num*>*>* a = <self::A<core::num*>*, self::A<core::num*>*>{};
   }
 }
 static method main() → dynamic {
-  core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+  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_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
index 3974c9a..fc06cc7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_literal_map.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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>>{};
+    core::Map<self::A<core::num*>*, self::A<core::num*>*>* a = <self::A<core::num*>*, self::A<core::num*>*>{};
   }
 }
 static method main() → dynamic {
-  core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.expect
index 3119f18..19fd0f6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.expect
@@ -5,21 +5,21 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method fun() → dynamic {
-    self::A<dynamic> a;
-    col::DoubleLinkedQueue<dynamic> c;
+    self::A<dynamic>* a;
+    col::DoubleLinkedQueue<dynamic>* c;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
-  col::DoubleLinkedQueue<dynamic> c;
+  self::A<dynamic>* a;
+  col::DoubleLinkedQueue<dynamic>* c;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect
index 3119f18..19fd0f6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.legacy.transformed.expect
@@ -5,21 +5,21 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method fun() → dynamic {
-    self::A<dynamic> a;
-    col::DoubleLinkedQueue<dynamic> c;
+    self::A<dynamic>* a;
+    col::DoubleLinkedQueue<dynamic>* c;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
-  col::DoubleLinkedQueue<dynamic> c;
+  self::A<dynamic>* a;
+  col::DoubleLinkedQueue<dynamic>* c;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
index d328d90..829ba14 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.outline.expect
@@ -4,12 +4,12 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method fun() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
index 3119f18..19fd0f6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.expect
@@ -5,21 +5,21 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method fun() → dynamic {
-    self::A<dynamic> a;
-    col::DoubleLinkedQueue<dynamic> c;
+    self::A<dynamic>* a;
+    col::DoubleLinkedQueue<dynamic>* c;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
-  col::DoubleLinkedQueue<dynamic> c;
+  self::A<dynamic>* a;
+  col::DoubleLinkedQueue<dynamic>* c;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
index 3119f18..19fd0f6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_omitted_bound.dart.strong.transformed.expect
@@ -5,21 +5,21 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method fun() → dynamic {
-    self::A<dynamic> a;
-    col::DoubleLinkedQueue<dynamic> c;
+    self::A<dynamic>* a;
+    col::DoubleLinkedQueue<dynamic>* c;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
-  col::DoubleLinkedQueue<dynamic> c;
+  self::A<dynamic>* a;
+  col::DoubleLinkedQueue<dynamic>* c;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect
index cd26665..c028064 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    self::A<dynamic> a;
+    self::A<dynamic>* a;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
+  self::A<dynamic>* a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect
index cd26665..c028064 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    self::A<dynamic> a;
+    self::A<dynamic>* a;
   }
 }
 static method main() → dynamic {
-  self::A<dynamic> a;
+  self::A<dynamic>* a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
index 27aaad2..a44d4e1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
index 5101af2..093fa07c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.expect
@@ -2,19 +2,19 @@
 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>
+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::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    self::A<self::A<dynamic>> a;
+    self::A<self::A<dynamic>*>* a;
   }
 }
 static method main() → dynamic {
-  self::A<self::A<dynamic>> a;
+  self::A<self::A<dynamic>*>* a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
index 5101af2..093fa07c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_super_bounded_type.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 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>
+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::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    self::A<self::A<dynamic>> a;
+    self::A<self::A<dynamic>*>* a;
   }
 }
 static method main() → dynamic {
-  self::A<self::A<dynamic>> a;
+  self::A<self::A<dynamic>*>* a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect
index 9a1633f..e5540da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <(dynamic) → dynamic>[];
+    dynamic a = <(dynamic) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  dynamic a = <(dynamic) → dynamic>[];
+  dynamic a = <(dynamic) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect
index 9a1633f..e5540da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <(dynamic) → dynamic>[];
+    dynamic a = <(dynamic) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  dynamic a = <(dynamic) → dynamic>[];
+  dynamic a = <(dynamic) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
index 5df48c3..44ba958 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
index 8b677de..fcd6d80 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+    core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+  core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
index 8b677de..fcd6d80 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+    core::List<(core::num*) →* dynamic>* a = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> a = <(core::num) → 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.expect
index 82f2df5..e923e16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+typedef A<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>[];
+    core::List<(self::B::U*) →* dynamic>* foo = <(self::B::U*) →* dynamic>[];
+    core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+  core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
index 82f2df5..e923e16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+typedef A<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>[];
+    core::List<(self::B::U*) →* dynamic>* foo = <(self::B::U*) →* dynamic>[];
+    core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+  core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
index 65c7e59..bcf2c7a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+class B<U extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::U*>*
     ;
   method fun() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
index 82f2df5..e923e16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+typedef A<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>[];
+    core::List<(self::B::U*) →* dynamic>* foo = <(self::B::U*) →* dynamic>[];
+    core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> bar = <(core::num) → dynamic>[];
+  core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
index 82f2df5..e923e16 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-class B<U extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::U>
+typedef A<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>[];
+    core::List<(self::B::U*) →* dynamic>* foo = <(self::B::U*) →* dynamic>[];
+    core::List<(core::num*) →* dynamic>* bar = <(core::num*) →* dynamic>[];
   }
 }
 static method main() → dynamic {
-  core::List<(core::num) → dynamic> bar = <(core::num) → 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.expect
index 3e6528c..65c68b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+    dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
   }
 }
 static method main() → dynamic {
-  dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+  dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect
index 3e6528c..65c68b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+    dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
   }
 }
 static method main() → dynamic {
-  dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+  dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
index 5df48c3..44ba958 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
index 282e860..22d342d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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>{};
+    core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
   }
 }
 static method main() → dynamic {
-  core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → 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_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
index 282e860..22d342d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_literal_map.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  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>{};
+    core::Map<(core::num*) →* dynamic, (core::num*) →* dynamic>* a = <(core::num*) →* dynamic, (core::num*) →* dynamic>{};
   }
 }
 static method main() → dynamic {
-  core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.expect
index a6c8d3d..b0dc0d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    (dynamic) → dynamic a;
+    (dynamic) →* dynamic a;
   }
 }
 static method main() → dynamic {
-  (dynamic) → dynamic a;
+  (dynamic) →* dynamic a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect
index a6c8d3d..b0dc0d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    (dynamic) → dynamic a;
+    (dynamic) →* dynamic a;
   }
 }
 static method main() → dynamic {
-  (dynamic) → dynamic a;
+  (dynamic) →* dynamic a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
index 3392ba1..f75d4ee 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
index a6c8d3d..b0dc0d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    (dynamic) → dynamic a;
+    (dynamic) →* dynamic a;
   }
 }
 static method main() → dynamic {
-  (dynamic) → dynamic a;
+  (dynamic) →* dynamic a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
index a6c8d3d..b0dc0d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_omitted_bound.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    (dynamic) → dynamic a;
+    (dynamic) →* dynamic a;
   }
 }
 static method main() → dynamic {
-  (dynamic) → dynamic a;
+  (dynamic) →* dynamic a;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
index 1f8d821..a04653f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = (dynamic) → dynamic> = (U) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<U extends (U) →* dynamic = (dynamic) →* dynamic> = (U*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    ((dynamic) → dynamic) → dynamic b;
+    ((dynamic) →* dynamic) →* dynamic b;
   }
 }
 static method main() → dynamic {
-  ((dynamic) → dynamic) → dynamic b;
+  ((dynamic) →* dynamic) →* dynamic b;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect
index 1f8d821..a04653f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/body_typedef_super_bounded_type.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<U extends (U) → dynamic = (dynamic) → dynamic> = (U) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<U extends (U) →* dynamic = (dynamic) →* dynamic> = (U*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    ((dynamic) → dynamic) → dynamic b;
+    ((dynamic) →* dynamic) →* dynamic b;
   }
 }
 static method main() → dynamic {
-  ((dynamic) → dynamic) → dynamic b;
+  ((dynamic) →* dynamic) →* dynamic b;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect
index c4bb7fc..b324e04 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
+static field self::C<dynamic, dynamic>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect
index c4bb7fc..b324e04 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
+static field self::C<dynamic, dynamic>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
index 7499e8f..5a9d18f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic> c;
+static field self::C<dynamic, dynamic>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
index a08e371..61e4ec3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::num, (core::Null) → void> c;
+static field self::C<core::num*, (core::Null*) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
index a08e371..61e4ec3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<core::num, (core::Null) → void> c;
+static field self::C<core::num*, (core::Null*) →* void>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect
index caff641..460411c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect
index caff641..460411c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
index a599fa3..38c128d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = dynamic, Y extends (self::C::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = dynamic, Y extends (self::C::X*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
 static field dynamic lc;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
index f9cf2df..72e6fc0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C<core::num, (core::Null) → void>> lc = <self::C<core::num, (core::Null) → void>>[];
-static field core::Map<self::C<core::num, (core::Null) → void>, self::C<core::num, (core::Null) → void>> mc = <self::C<core::num, (core::Null) → void>, self::C<core::num, (core::Null) → void>>{};
+static field core::List<self::C<core::num*, (core::Null*) →* void>*>* lc = <self::C<core::num*, (core::Null*) →* void>*>[];
+static field core::Map<self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>* mc = <self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
index f9cf2df..72e6fc0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class C<X extends core::num = core::num, Y extends (self::C::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::num* = core::num*, Y extends (self::C::X*) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C<core::num, (core::Null) → void>> lc = <self::C<core::num, (core::Null) → void>>[];
-static field core::Map<self::C<core::num, (core::Null) → void>, self::C<core::num, (core::Null) → void>> mc = <self::C<core::num, (core::Null) → void>, self::C<core::num, (core::Null) → void>>{};
+static field core::List<self::C<core::num*, (core::Null*) →* void>*>* lc = <self::C<core::num*, (core::Null*) →* void>*>[];
+static field core::Map<self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>* mc = <self::C<core::num*, (core::Null*) →* void>*, self::C<core::num*, (core::Null*) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect
index 49b30fe..3e40298 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic> e;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect
index 49b30fe..3e40298 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.legacy.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic> e;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
index 3df781b..42b3335 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic> e;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
index 4401dce..0867d26 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void> d;
-static field self::E<(core::Null) → void> e;
+static field self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>* d;
+static field self::E<(core::Null*) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
index 4401dce..0867d26 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void> d;
-static field self::E<(core::Null) → void> e;
+static field self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>* d;
+static field self::E<(core::Null*) →* void>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect
index 9645a88..c68a81a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic>>[];
-static field dynamic me = <self::E<dynamic>, self::E<dynamic>>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic>*>[];
+static field dynamic me = <self::E<dynamic>*, self::E<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
index 9645a88..c68a81a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic>>[];
-static field dynamic me = <self::E<dynamic>, self::E<dynamic>>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic>*>[];
+static field dynamic me = <self::E<dynamic>*, self::E<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
index 511b35e..b75263b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = dynamic, Y extends (self::D::X, self::D::Y) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = dynamic, Y extends (self::D::X*, self::D::Y) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends (self::E::X) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
 static field dynamic ld;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
index a689115..47b5906 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>> ld = <self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>>[];
-static field core::Map<self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>, self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>> md = <self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>, self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>>{};
-static field core::List<self::E<(core::Null) → void>> le = <self::E<(core::Null) → void>>[];
-static field core::Map<self::E<(core::Null) → void>, self::E<(core::Null) → void>> me = <self::E<(core::Null) → void>, self::E<(core::Null) → void>>{};
+static field core::List<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* ld = <self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>[];
+static field core::Map<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* md = <self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>{};
+static field core::List<self::E<(core::Null*) →* void>*>* le = <self::E<(core::Null*) →* void>*>[];
+static field core::Map<self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>* me = <self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index a689115..47b5906 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/contravariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class D<X extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void, Y extends (self::D::X, self::D::Y) → void = (core::Null, core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends (self::D::X, self::D::Y) →* void = (core::Null*, core::Null*) →* void, Y extends (self::D::X*, self::D::Y) →* void = (core::Null*, core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → void = (core::Null) → void> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* void = (core::Null*) →* void> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>> ld = <self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>>[];
-static field core::Map<self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>, self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>> md = <self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>, self::D<(core::Null, core::Null) → void, (core::Null, core::Null) → void>>{};
-static field core::List<self::E<(core::Null) → void>> le = <self::E<(core::Null) → void>>[];
-static field core::Map<self::E<(core::Null) → void>, self::E<(core::Null) → void>> me = <self::E<(core::Null) → void>, self::E<(core::Null) → void>>{};
+static field core::List<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* ld = <self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>[];
+static field core::Map<self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>* md = <self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*, self::D<(core::Null*, core::Null*) →* void, (core::Null*, core::Null*) →* void>*>{};
+static field core::List<self::E<(core::Null*) →* void>*>* le = <self::E<(core::Null*) →* void>*>[];
+static field core::Map<self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>* me = <self::E<(core::Null*) →* void>*, self::E<(core::Null*) →* void>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect
index 12387f5..c9a2ee9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.expect
@@ -2,33 +2,33 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic, dynamic> f;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic>* f;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect
index 12387f5..c9a2ee9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.legacy.transformed.expect
@@ -2,33 +2,33 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic, dynamic> f;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic>* f;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
index 026698c..06bc06a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.outline.expect
@@ -2,29 +2,29 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic, dynamic> f;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic>* f;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
index b1d29af..6579ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.expect
@@ -2,33 +2,33 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends core::num = 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>
+class D<X extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = 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::•()
     ;
 }
-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 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.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
index b1d29af..6579ef0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence.dart.strong.transformed.expect
@@ -2,33 +2,33 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends core::num = 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>
+class D<X extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = 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::•()
     ;
 }
-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 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.expect
index 0254060..39feb06 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.expect
@@ -2,37 +2,37 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic, dynamic>>[];
-static field dynamic me = <self::E<dynamic, dynamic>, self::E<dynamic, dynamic>>{};
-static field dynamic lf = <self::F<dynamic, dynamic>>[];
-static field dynamic mf = <self::F<dynamic, dynamic>, self::F<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic, dynamic>*>[];
+static field dynamic me = <self::E<dynamic, dynamic>*, self::E<dynamic, dynamic>*>{};
+static field dynamic lf = <self::F<dynamic, dynamic>*>[];
+static field dynamic mf = <self::F<dynamic, dynamic>*, self::F<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect
index 0254060..39feb06 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.legacy.transformed.expect
@@ -2,37 +2,37 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic, dynamic>>[];
-static field dynamic me = <self::E<dynamic, dynamic>, self::E<dynamic, dynamic>>{};
-static field dynamic lf = <self::F<dynamic, dynamic>>[];
-static field dynamic mf = <self::F<dynamic, dynamic>, self::F<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic, dynamic>*>[];
+static field dynamic me = <self::E<dynamic, dynamic>*, self::E<dynamic, dynamic>*>{};
+static field dynamic lf = <self::F<dynamic, dynamic>*>[];
+static field dynamic mf = <self::F<dynamic, dynamic>*, self::F<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
index 1136126..32d8cdb 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.outline.expect
@@ -2,24 +2,24 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object = dynamic, Y extends self::A<self::C::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends self::A<self::C::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num = dynamic, Y extends self::A<self::D::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends self::A<self::D::X*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class F<X extends core::num = dynamic, Y extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = dynamic, Y extends () →* self::F::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*, self::F::Y*>*
     ;
 }
 static field dynamic lc;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
index 376b3e8..3443bc3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.expect
@@ -2,37 +2,37 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends core::num = 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>
+class D<X extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = 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::•()
     ;
 }
-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 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_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
index 376b3e8..3443bc3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_dependence_in_literals.dart.strong.transformed.expect
@@ -2,37 +2,37 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends core::num = 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>
+class D<X extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends core::num = core::num, Y extends () → self::F::X = () → core::num> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X, self::F::Y>
+class F<X extends core::num* = 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::•()
     ;
 }
-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 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.expect
index 616a6e6..55839c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.expect
@@ -2,32 +2,32 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic> f;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<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.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.transformed.expect
index 616a6e6..55839c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.legacy.transformed.expect
@@ -2,32 +2,32 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic> f;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<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.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
index fa98f27..2c04aba 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.outline.expect
@@ -2,28 +2,28 @@
 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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic> e;
-static field self::F<dynamic> f;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<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.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
index 295f48b..9dfe27e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.expect
@@ -2,32 +2,32 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends () → self::F::X = () → dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-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 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.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
index 295f48b..9dfe27e 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence.dart.strong.transformed.expect
@@ -2,32 +2,32 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends () → self::F::X = () → dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-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 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.expect
index 930fee8..60b80f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.expect
@@ -2,35 +2,35 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic, dynamic>>[];
-static field dynamic me = <self::E<dynamic, dynamic>, self::E<dynamic, dynamic>>{};
-static field dynamic lf = <self::F<dynamic>>[];
-static field dynamic mf = <self::F<dynamic>, self::F<dynamic>>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic, dynamic>*>[];
+static field dynamic me = <self::E<dynamic, dynamic>*, self::E<dynamic, dynamic>*>{};
+static field dynamic lf = <self::F<dynamic>*>[];
+static field dynamic mf = <self::F<dynamic>*, self::F<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
index 930fee8..60b80f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.legacy.transformed.expect
@@ -2,35 +2,35 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     : super core::Object::•()
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic, dynamic>>[];
-static field dynamic me = <self::E<dynamic, dynamic>, self::E<dynamic, dynamic>>{};
-static field dynamic lf = <self::F<dynamic>>[];
-static field dynamic mf = <self::F<dynamic>, self::F<dynamic>>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic, dynamic>*>[];
+static field dynamic me = <self::E<dynamic, dynamic>*, self::E<dynamic, dynamic>*>{};
+static field dynamic lf = <self::F<dynamic>*>[];
+static field dynamic mf = <self::F<dynamic>*, self::F<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
index b439674..6cfd9f5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.outline.expect
@@ -2,24 +2,24 @@
 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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class D<X extends self::B<self::D::X, self::D::Y> = dynamic, Y extends self::C<self::D::X, self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::B<self::D::X, self::D::Y>* = dynamic, Y extends self::C<self::D::X*, self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<X extends self::B<self::E::X, self::E::Y> = dynamic, Y extends () → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X, self::E::Y>
+class E<X extends self::B<self::E::X, self::E::Y>* = dynamic, Y extends () →* self::E::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*, self::E::Y*>*
     ;
 }
-class F<X extends () → self::F::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     ;
 }
 static field dynamic ld;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
index 3484451..8818c9d4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.expect
@@ -2,35 +2,35 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends () → self::F::X = () → dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-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 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/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
index 3484451..8818c9d4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/covariant_mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,35 +2,35 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<X extends () → self::F::X = () → dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::X>
+class F<X extends () →* self::F::X = () →* dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::X*>*
     : super core::Object::•()
     ;
 }
-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 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.expect
index ae9cf1d..0ec1085 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.expect
@@ -2,21 +2,21 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect
index ae9cf1d..0ec1085 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.legacy.transformed.expect
@@ -2,21 +2,21 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
index 89a5873..1a94d9d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.outline.expect
@@ -2,19 +2,19 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-static field self::C<dynamic, dynamic> c;
-static field self::D<dynamic, dynamic> d;
+static field self::C<dynamic, dynamic>* c;
+static field self::D<dynamic, dynamic>* d;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
index 4319346..6159d34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.expect
@@ -2,21 +2,21 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, (core::Null) → dynamic> c;
-static field self::D<core::num, (core::Null) → core::num> d;
+static field self::C<dynamic, (core::Null*) →* dynamic>* c;
+static field self::D<core::num*, (core::Null*) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
index 4319346..6159d34 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence.dart.strong.transformed.expect
@@ -2,21 +2,21 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic, (core::Null) → dynamic> c;
-static field self::D<core::num, (core::Null) → core::num> d;
+static field self::C<dynamic, (core::Null*) →* dynamic>* c;
+static field self::D<core::num*, (core::Null*) →* core::num*>* d;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect
index 5615bb0..04ae9c8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.expect
@@ -2,23 +2,23 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect
index 5615bb0..04ae9c8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.legacy.transformed.expect
@@ -2,23 +2,23 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc = <self::C<dynamic, dynamic>>[];
-static field dynamic mc = <self::C<dynamic, dynamic>, self::C<dynamic, dynamic>>{};
-static field dynamic ld = <self::D<dynamic, dynamic>>[];
-static field dynamic md = <self::D<dynamic, dynamic>, self::D<dynamic, dynamic>>{};
+static field dynamic lc = <self::C<dynamic, dynamic>*>[];
+static field dynamic mc = <self::C<dynamic, dynamic>*, self::C<dynamic, dynamic>*>{};
+static field dynamic ld = <self::D<dynamic, dynamic>*>[];
+static field dynamic md = <self::D<dynamic, dynamic>*, self::D<dynamic, dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
index 9596748..e27f41f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.outline.expect
@@ -2,16 +2,16 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     ;
 }
-class D<X extends core::num = dynamic, Y extends (self::D::X) → self::D::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = dynamic, Y extends (self::D::X*) →* self::D::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
 static field dynamic lc;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
index 3d8d59b..99233e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.expect
@@ -2,23 +2,23 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C<dynamic, (core::Null) → dynamic>> lc = <self::C<dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C<dynamic, (core::Null) → dynamic>, self::C<dynamic, (core::Null) → dynamic>> mc = <self::C<dynamic, (core::Null) → dynamic>, self::C<dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::D<core::num, (core::Null) → core::num>> ld = <self::D<core::num, (core::Null) → core::num>>[];
-static field core::Map<self::D<core::num, (core::Null) → core::num>, self::D<core::num, (core::Null) → core::num>> md = <self::D<core::num, (core::Null) → core::num>, self::D<core::num, (core::Null) → core::num>>{};
+static field core::List<self::C<dynamic, (core::Null*) →* dynamic>*>* lc = <self::C<dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>* mc = <self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (core::Null*) →* core::num*>*>* ld = <self::D<core::num*, (core::Null*) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>* md = <self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
index 3d8d59b..99233e6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/dependence_in_literals.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class C<X extends core::Object = dynamic, Y extends (self::C::X) → self::C::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::X, self::C::Y>
+class C<X extends core::Object* = dynamic, Y extends (self::C::X*) →* self::C::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::X*, self::C::Y*>*
     : super core::Object::•()
     ;
 }
-class D<X extends core::num = core::num, Y extends (self::D::X) → self::D::X = (core::Null) → core::num> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends core::num* = core::num*, Y extends (self::D::X*) →* self::D::X* = (core::Null*) →* core::num*> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C<dynamic, (core::Null) → dynamic>> lc = <self::C<dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C<dynamic, (core::Null) → dynamic>, self::C<dynamic, (core::Null) → dynamic>> mc = <self::C<dynamic, (core::Null) → dynamic>, self::C<dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::D<core::num, (core::Null) → core::num>> ld = <self::D<core::num, (core::Null) → core::num>>[];
-static field core::Map<self::D<core::num, (core::Null) → core::num>, self::D<core::num, (core::Null) → core::num>> md = <self::D<core::num, (core::Null) → core::num>, self::D<core::num, (core::Null) → core::num>>{};
+static field core::List<self::C<dynamic, (core::Null*) →* dynamic>*>* lc = <self::C<dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>* mc = <self::C<dynamic, (core::Null*) →* dynamic>*, self::C<dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D<core::num*, (core::Null*) →* core::num*>*>* ld = <self::D<core::num*, (core::Null*) →* core::num*>*>[];
+static field core::Map<self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>* md = <self::D<core::num*, (core::Null*) →* core::num*>*, self::D<core::num*, (core::Null*) →* core::num*>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect
index 3f67f69..0be2e91 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.expect
@@ -4,5 +4,5 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<dynamic> y;
+static field col::LinkedListEntry<dynamic>* y;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect
index 3f67f69..0be2e91 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.legacy.transformed.expect
@@ -4,5 +4,5 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<dynamic> y;
+static field col::LinkedListEntry<dynamic>* y;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
index def491a..a014cc8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.outline.expect
@@ -4,6 +4,6 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<dynamic> y;
+static field col::LinkedListEntry<dynamic>* y;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect
index dd129de..987be1b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.expect
@@ -4,5 +4,5 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+static field col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* y;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.transformed.expect
index dd129de..987be1b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/generic_classes_from_dill.dart.strong.transformed.expect
@@ -4,5 +4,5 @@
 
 import "dart:collection";
 
-static field col::LinkedListEntry<col::LinkedListEntry<dynamic>> y;
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.expect
index d9386f5..5795761 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<dynamic> a = new self::A::•<dynamic>();
+  self::A<dynamic>* a = new self::A::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect
index d9386f5..5795761 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<dynamic> a = new self::A::•<dynamic>();
+  self::A<dynamic>* a = new self::A::•<dynamic>();
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
index 7013e1a..b01dcf6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
index 7b8c23d..5cc6710 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<core::num> a = new self::A::•<core::num>();
+  self::A<core::num*>* a = new self::A::•<core::num*>();
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
index 7b8c23d..5cc6710 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_constrained_by_bound.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::A<core::num> a = new self::A::•<core::num>();
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.expect
index d963c8d..72d2154 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect
index d963c8d..72d2154 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
index 7013e1a..b01dcf6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
index 5471b49..7e54166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  new self::A::•<core::num>();
+  new self::A::•<core::num*>();
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
index 5471b49..7e54166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_defaults_to_bound.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  new self::A::•<core::num>();
+  new self::A::•<core::num*>();
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect
index df69640..bfaa733 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.expect
@@ -2,17 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
-  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
+class B<T extends core::num* = dynamic, S extends core::List<self::B::T*>* = dynamic> 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<dynamic, dynamic> x;
+  self::B<dynamic, dynamic>* x;
   dynamic y = new self::B::•<dynamic, dynamic>(3);
-  self::A<core::int> z = new self::B::•<dynamic, dynamic>();
+  self::A<core::int*>* z = new self::B::•<dynamic, dynamic>();
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect
index df69640..bfaa733 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.legacy.transformed.expect
@@ -2,17 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
-  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
+class B<T extends core::num* = dynamic, S extends core::List<self::B::T*>* = dynamic> 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<dynamic, dynamic> x;
+  self::B<dynamic, dynamic>* x;
   dynamic y = new self::B::•<dynamic, dynamic>(3);
-  self::A<core::int> z = new self::B::•<dynamic, dynamic>();
+  self::A<core::int*>* z = new self::B::•<dynamic, dynamic>();
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
index 1e69463..8db9fc1 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.outline.expect
@@ -2,12 +2,12 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends core::num = dynamic, S extends core::List<self::B::T> = dynamic> extends self::A<self::B::T> {
-  constructor •([self::B::T x]) → self::B<self::B::T, self::B::S>
+class B<T extends core::num* = dynamic, S extends core::List<self::B::T*>* = dynamic> extends self::A<self::B::T*> {
+  constructor •([self::B::T* x]) → self::B<self::B::T*, self::B::S*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
index 9b71682..6f5ff38 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.expect
@@ -2,17 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::num = core::num, S extends core::List<self::B::T> = core::List<core::num>> extends self::A<self::B::T> {
-  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
+class B<T extends core::num* = 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>>();
+  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_gives_input.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
index 9b71682..6f5ff38 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_gives_input.dart.strong.transformed.expect
@@ -2,17 +2,21 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends core::num = core::num, S extends core::List<self::B::T> = core::List<core::num>> extends self::A<self::B::T> {
-  constructor •([self::B::T x = null]) → self::B<self::B::T, self::B::S>
+class B<T extends core::num* = 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>>();
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.expect
index 44ef58e..61b9008 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Comparable<self::B::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect
index 44ef58e..61b9008 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Comparable<self::B::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
index b5e4b59..dafb049 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Comparable<self::B::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Comparable<self::B::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static field dynamic y;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
index 09bfacb..d1590e7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.expect
@@ -14,10 +14,10 @@
 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>
+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::•()
     ;
 }
-static field self::B<core::Comparable<dynamic>> y = new self::B::•<core::Comparable<dynamic>>();
+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/inference_super_bounded_rejected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
index 09bfacb..d1590e7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/inference_super_bounded_rejected.dart.strong.transformed.expect
@@ -14,10 +14,10 @@
 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>
+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::•()
     ;
 }
-static field self::B<core::Comparable<dynamic>> y = new self::B::•<core::Comparable<dynamic>>();
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.expect
index b542f5a..ac3fd57 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(self::A<dynamic> a) → dynamic
+  method foo(self::A<dynamic>* a) → dynamic
     return null;
-  method bar() → self::A<dynamic>
+  method bar() → self::A<dynamic>*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect
index b542f5a..ac3fd57 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(self::A<dynamic> a) → dynamic
+  method foo(self::A<dynamic>* a) → dynamic
     return null;
-  method bar() → self::A<dynamic>
+  method bar() → self::A<dynamic>*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
index 96a89ef..4db0df2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method foo(self::A<dynamic> a) → dynamic
+  method foo(self::A<dynamic>* a) → dynamic
     ;
-  method bar() → self::A<dynamic>
+  method bar() → self::A<dynamic>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
index fe10cec..8fa5921 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(self::A<core::num> a) → dynamic
+  method foo(self::A<core::num*>* a) → dynamic
     return null;
-  method bar() → self::A<core::num>
+  method bar() → self::A<core::num*>*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
index fe10cec..8fa5921 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/instantiated_in_outline.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(self::A<core::num> a) → dynamic
+  method foo(self::A<core::num*>* a) → dynamic
     return null;
-  method bar() → self::A<core::num>
+  method bar() → self::A<core::num*>*
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect
index 43c7732..2e8ae5f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic a = <self::A<dynamic>>[];
+static field dynamic a = <self::A<dynamic>*>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect
index 43c7732..2e8ae5f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic a = <self::A<dynamic>>[];
+static field dynamic a = <self::A<dynamic>*>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
index 3e614bc..c7fd878 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
index f9130c5..44f906c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::num>> a = <self::A<core::num>>[];
+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.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
index f9130c5..44f906c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::A<core::num>> a = <self::A<core::num>>[];
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.expect
index 83e9a8f..20bcbed 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.expect
@@ -2,15 +2,15 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect
index 83e9a8f..20bcbed 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
index b4f46aa..cee4482 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.outline.expect
@@ -2,14 +2,14 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<S extends core::Object = dynamic> extends core::Object {
-  final field core::List<self::A<self::B::S>> foo;
-  final field core::List<self::A<core::num>> bar;
-  synthetic constructor •() → self::B<self::B::S>
+class B<S extends core::Object* = dynamic> extends core::Object {
+  final field core::List<self::A<self::B::S*>*>* foo;
+  final field core::List<self::A<core::num*>*>* bar;
+  synthetic constructor •() → self::B<self::B::S*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
index 83e9a8f..20bcbed 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.expect
@@ -2,15 +2,15 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
index 83e9a8f..20bcbed 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect
index 9bf6de4..1ca0d1a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+static field dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect
index 9bf6de4..1ca0d1a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field dynamic a = <self::A<dynamic>, self::A<dynamic>>{};
+static field dynamic a = <self::A<dynamic>*, self::A<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
index 3e614bc..c7fd878 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 static field dynamic a;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
index d5bf0b9..5112185 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+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/literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
index d5bf0b9..5112185 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/literal_map.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field core::Map<self::A<core::num>, self::A<core::num>> a = <self::A<core::num>, self::A<core::num>>{};
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.expect
index 54c9d27..c863575 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.expect
@@ -25,61 +25,61 @@
 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>
+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, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X, self::B::Y>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::A<self::D::X>* = dynamic, Y extends self::A<self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::W, self::E::X, self::E::Y, self::E::Z>
+class E<W extends self::B<self::E::W, self::E::X>* = dynamic, X extends self::C<self::E::W*, self::E::X>* = dynamic, Y extends self::B<self::E::Y, self::E::Z>* = dynamic, Z extends self::C<self::E::Y*, self::E::Z>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
     : super core::Object::•()
     ;
 }
-class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::V, self::F::W, self::F::X, self::F::Y, self::F::Z>
+class F<V extends core::num* = dynamic, W extends self::B<self::F::W, self::F::X>* = dynamic, X extends self::C<self::F::W*, self::F::X>* = dynamic, Y extends self::B<self::F::W*, self::F::X*>* = dynamic, Z extends self::C<self::F::Y*, self::F::Z>* = 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::•()
     ;
 }
-class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::V, self::G::W, self::G::X, self::G::Y, self::G::Z>
+class G<V extends core::num* = dynamic, W extends self::B<self::G::V*, self::G::X>* = dynamic, X extends self::C<self::G::W*, self::G::V*>* = dynamic, Y extends self::B<self::G::W*, self::G::X*>* = dynamic, Z extends self::C<self::G::Y*, self::G::Z>* = 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::•()
     ;
 }
-class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = 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>
+class H<S extends self::A<self::H::S>* = dynamic, T extends self::B<self::H::T, self::H::U>* = dynamic, U extends self::C<self::H::T*, self::H::U>* = dynamic, V extends self::A<self::H::V>* = dynamic, W extends self::H::S* = dynamic, X extends self::H::T* = dynamic, Y extends self::H::U* = dynamic, Z extends self::H::V* = 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::•()
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = dynamic, W extends (self::I::X) →* dynamic = dynamic, X extends (self::I::V*) →* dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = 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>
+class J<S extends (self::J::U) →* self::J::T = dynamic, T extends (self::J::S*) →* self::J::U = dynamic, U extends (self::J::T*) →* self::J::S* = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = 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::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic, dynamic, dynamic> e;
-static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic> f;
-static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic> g;
-static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> h;
-static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> i;
-static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> j;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic, dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic>* f;
+static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic>* g;
+static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* h;
+static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* i;
+static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect
index 54c9d27..c863575 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.legacy.transformed.expect
@@ -25,61 +25,61 @@
 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>
+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, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X, self::B::Y>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::A<self::D::X>* = dynamic, Y extends self::A<self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     : super core::Object::•()
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::W, self::E::X, self::E::Y, self::E::Z>
+class E<W extends self::B<self::E::W, self::E::X>* = dynamic, X extends self::C<self::E::W*, self::E::X>* = dynamic, Y extends self::B<self::E::Y, self::E::Z>* = dynamic, Z extends self::C<self::E::Y*, self::E::Z>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
     : super core::Object::•()
     ;
 }
-class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::V, self::F::W, self::F::X, self::F::Y, self::F::Z>
+class F<V extends core::num* = dynamic, W extends self::B<self::F::W, self::F::X>* = dynamic, X extends self::C<self::F::W*, self::F::X>* = dynamic, Y extends self::B<self::F::W*, self::F::X*>* = dynamic, Z extends self::C<self::F::Y*, self::F::Z>* = 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::•()
     ;
 }
-class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::V, self::G::W, self::G::X, self::G::Y, self::G::Z>
+class G<V extends core::num* = dynamic, W extends self::B<self::G::V*, self::G::X>* = dynamic, X extends self::C<self::G::W*, self::G::V*>* = dynamic, Y extends self::B<self::G::W*, self::G::X*>* = dynamic, Z extends self::C<self::G::Y*, self::G::Z>* = 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::•()
     ;
 }
-class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = 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>
+class H<S extends self::A<self::H::S>* = dynamic, T extends self::B<self::H::T, self::H::U>* = dynamic, U extends self::C<self::H::T*, self::H::U>* = dynamic, V extends self::A<self::H::V>* = dynamic, W extends self::H::S* = dynamic, X extends self::H::T* = dynamic, Y extends self::H::U* = dynamic, Z extends self::H::V* = 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::•()
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = dynamic, W extends (self::I::X) →* dynamic = dynamic, X extends (self::I::V*) →* dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = 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>
+class J<S extends (self::J::U) →* self::J::T = dynamic, T extends (self::J::S*) →* self::J::U = dynamic, U extends (self::J::T*) →* self::J::S* = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = 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::•()
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic, dynamic, dynamic> e;
-static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic> f;
-static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic> g;
-static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> h;
-static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> i;
-static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> j;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic, dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic>* f;
+static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic>* g;
+static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* h;
+static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* i;
+static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
index 717342c..81409aa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.outline.expect
@@ -25,52 +25,52 @@
 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>
+class A<X extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
-class D<X extends self::A<self::D::X> = dynamic, Y extends self::A<self::D::Y> = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::X, self::D::Y>
+class D<X extends self::A<self::D::X>* = dynamic, Y extends self::A<self::D::Y>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::X*, self::D::Y*>*
     ;
 }
-class E<W extends self::B<self::E::W, self::E::X> = dynamic, X extends self::C<self::E::W, self::E::X> = dynamic, Y extends self::B<self::E::Y, self::E::Z> = dynamic, Z extends self::C<self::E::Y, self::E::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::W, self::E::X, self::E::Y, self::E::Z>
+class E<W extends self::B<self::E::W, self::E::X>* = dynamic, X extends self::C<self::E::W*, self::E::X>* = dynamic, Y extends self::B<self::E::Y, self::E::Z>* = dynamic, Z extends self::C<self::E::Y*, self::E::Z>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::W*, self::E::X*, self::E::Y*, self::E::Z*>*
     ;
 }
-class F<V extends core::num = dynamic, W extends self::B<self::F::W, self::F::X> = dynamic, X extends self::C<self::F::W, self::F::X> = dynamic, Y extends self::B<self::F::W, self::F::X> = dynamic, Z extends self::C<self::F::Y, self::F::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::F<self::F::V, self::F::W, self::F::X, self::F::Y, self::F::Z>
+class F<V extends core::num* = dynamic, W extends self::B<self::F::W, self::F::X>* = dynamic, X extends self::C<self::F::W*, self::F::X>* = dynamic, Y extends self::B<self::F::W*, self::F::X*>* = dynamic, Z extends self::C<self::F::Y*, self::F::Z>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::F<self::F::V*, self::F::W*, self::F::X*, self::F::Y*, self::F::Z*>*
     ;
 }
-class G<V extends core::num = dynamic, W extends self::B<self::G::V, self::G::X> = dynamic, X extends self::C<self::G::W, self::G::V> = dynamic, Y extends self::B<self::G::W, self::G::X> = dynamic, Z extends self::C<self::G::Y, self::G::Z> = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::V, self::G::W, self::G::X, self::G::Y, self::G::Z>
+class G<V extends core::num* = dynamic, W extends self::B<self::G::V*, self::G::X>* = dynamic, X extends self::C<self::G::W*, self::G::V*>* = dynamic, Y extends self::B<self::G::W*, self::G::X*>* = dynamic, Z extends self::C<self::G::Y*, self::G::Z>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::V*, self::G::W*, self::G::X*, self::G::Y*, self::G::Z*>*
     ;
 }
-class H<S extends self::A<self::H::S> = dynamic, T extends self::B<self::H::T, self::H::U> = dynamic, U extends self::C<self::H::T, self::H::U> = dynamic, V extends self::A<self::H::V> = dynamic, W extends self::H::S = dynamic, X extends self::H::T = dynamic, Y extends self::H::U = dynamic, Z extends self::H::V = 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>
+class H<S extends self::A<self::H::S>* = dynamic, T extends self::B<self::H::T, self::H::U>* = dynamic, U extends self::C<self::H::T*, self::H::U>* = dynamic, V extends self::A<self::H::V>* = dynamic, W extends self::H::S* = dynamic, X extends self::H::T* = dynamic, Y extends self::H::U* = dynamic, Z extends self::H::V* = 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*>*
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = dynamic, W extends (self::I::X) → dynamic = dynamic, X extends (self::I::V) → dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = dynamic, W extends (self::I::X) →* dynamic = dynamic, X extends (self::I::V*) →* dynamic = dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>*
     ;
 }
-class J<S extends (self::J::U) → self::J::T = dynamic, T extends (self::J::S) → self::J::U = dynamic, U extends (self::J::T) → self::J::S = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = 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>
+class J<S extends (self::J::U) →* self::J::T = dynamic, T extends (self::J::S*) →* self::J::U = dynamic, U extends (self::J::T*) →* self::J::S* = dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = 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*>*
     ;
 }
-static field self::D<dynamic, dynamic> d;
-static field self::E<dynamic, dynamic, dynamic, dynamic> e;
-static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic> f;
-static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic> g;
-static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> h;
-static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> i;
-static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic> j;
+static field self::D<dynamic, dynamic>* d;
+static field self::E<dynamic, dynamic, dynamic, dynamic>* e;
+static field self::F<dynamic, dynamic, dynamic, dynamic, dynamic>* f;
+static field self::G<dynamic, dynamic, dynamic, dynamic, dynamic>* g;
+static field self::H<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* h;
+static field self::I<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* i;
+static field self::J<dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic, dynamic>* j;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
index a41b0e8..cc78f70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.expect
@@ -25,61 +25,61 @@
 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>
+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, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X, self::B::Y>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<V extends core::num = 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>
+class F<V extends core::num* = 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::•()
     ;
 }
-class G<V extends core::num = 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>
+class G<V extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = (core::Null) → dynamic, W extends (self::I::X) → dynamic = (core::Null) → dynamic, X extends (self::I::V) → dynamic = (core::Null) → dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = (core::Null*) →* dynamic, W extends (self::I::X) →* dynamic = (core::Null*) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null*) →* dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T = (core::Null) → dynamic, T extends (self::J::S) → self::J::U = (core::Null) → dynamic, U extends (self::J::T) → self::J::S = (core::Null) → dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = (core::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>
+class J<S extends (self::J::U) →* self::J::T = (core::Null*) →* dynamic, T extends (self::J::S*) →* self::J::U = (core::Null*) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null*) →* dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = (core::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::•()
     ;
 }
-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<dynamic, dynamic, (core::Null) → dynamic, (core::Null) → dynamic, (core::Null) → dynamic, dynamic, dynamic> i;
-static field self::J<(core::Null) → dynamic, (core::Null) → dynamic, (core::Null) → dynamic, dynamic, dynamic, (core::Null) → dynamic, dynamic, dynamic> j;
+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<dynamic, dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* i;
+static field self::J<(core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
index a41b0e8..cc78f70 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/multiple_strongly_connected.dart.strong.transformed.expect
@@ -25,61 +25,61 @@
 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>
+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, Y extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::X, self::B::Y>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class F<V extends core::num = 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>
+class F<V extends core::num* = 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::•()
     ;
 }
-class G<V extends core::num = 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>
+class G<V extends core::num* = 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::•()
     ;
 }
-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>
+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::•()
     ;
 }
-class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) → dynamic = (core::Null) → dynamic, W extends (self::I::X) → dynamic = (core::Null) → dynamic, X extends (self::I::V) → dynamic = (core::Null) → dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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>
+class I<T extends self::I::U = dynamic, U extends self::I::Y = dynamic, V extends (self::I::W) →* dynamic = (core::Null*) →* dynamic, W extends (self::I::X) →* dynamic = (core::Null*) →* dynamic, X extends (self::I::V*) →* dynamic = (core::Null*) →* dynamic, Y extends self::I::Z = dynamic, Z extends self::I::T = dynamic> 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::•()
     ;
 }
-class J<S extends (self::J::U) → self::J::T = (core::Null) → dynamic, T extends (self::J::S) → self::J::U = (core::Null) → dynamic, U extends (self::J::T) → self::J::S = (core::Null) → dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) → self::J::Y = (core::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>
+class J<S extends (self::J::U) →* self::J::T = (core::Null*) →* dynamic, T extends (self::J::S*) →* self::J::U = (core::Null*) →* dynamic, U extends (self::J::T*) →* self::J::S* = (core::Null*) →* dynamic, V extends self::J::W = dynamic, W extends self::J::X = dynamic, X extends (self::J::V) →* self::J::Y = (core::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::•()
     ;
 }
-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<dynamic, dynamic, (core::Null) → dynamic, (core::Null) → dynamic, (core::Null) → dynamic, dynamic, dynamic> i;
-static field self::J<(core::Null) → dynamic, (core::Null) → dynamic, (core::Null) → dynamic, dynamic, dynamic, (core::Null) → dynamic, dynamic, dynamic> j;
+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<dynamic, dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* i;
+static field self::J<(core::Null*) →* dynamic, (core::Null*) →* dynamic, (core::Null*) →* dynamic, dynamic, dynamic, (core::Null*) →* dynamic, dynamic, dynamic>* j;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect
index ac76218..9096a3f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.expect
@@ -2,63 +2,63 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::C1<dynamic, dynamic> c1;
-static field self::C2<dynamic, dynamic> c2;
-static field self::C3<dynamic, dynamic> c3;
-static field self::C4<dynamic, dynamic> c4;
-static field self::D1<dynamic, dynamic> d1;
-static field self::D2<dynamic, dynamic> d2;
-static field self::D3<dynamic, dynamic> d3;
-static field self::D4<dynamic, dynamic> d4;
-static field self::E<dynamic> e;
+static field self::C1<dynamic, dynamic>* c1;
+static field self::C2<dynamic, dynamic>* c2;
+static field self::C3<dynamic, dynamic>* c3;
+static field self::C4<dynamic, dynamic>* c4;
+static field self::D1<dynamic, dynamic>* d1;
+static field self::D2<dynamic, dynamic>* d2;
+static field self::D3<dynamic, dynamic>* d3;
+static field self::D4<dynamic, dynamic>* d4;
+static field self::E<dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect
index ac76218..9096a3f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.legacy.transformed.expect
@@ -2,63 +2,63 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::C1<dynamic, dynamic> c1;
-static field self::C2<dynamic, dynamic> c2;
-static field self::C3<dynamic, dynamic> c3;
-static field self::C4<dynamic, dynamic> c4;
-static field self::D1<dynamic, dynamic> d1;
-static field self::D2<dynamic, dynamic> d2;
-static field self::D3<dynamic, dynamic> d3;
-static field self::D4<dynamic, dynamic> d4;
-static field self::E<dynamic> e;
+static field self::C1<dynamic, dynamic>* c1;
+static field self::C2<dynamic, dynamic>* c2;
+static field self::C3<dynamic, dynamic>* c3;
+static field self::C4<dynamic, dynamic>* c4;
+static field self::D1<dynamic, dynamic>* d1;
+static field self::D2<dynamic, dynamic>* d2;
+static field self::D3<dynamic, dynamic>* d3;
+static field self::D4<dynamic, dynamic>* d4;
+static field self::E<dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
index 868083b..8c2fc53 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.outline.expect
@@ -2,54 +2,54 @@
 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>
+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*>*
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
-static field self::C1<dynamic, dynamic> c1;
-static field self::C2<dynamic, dynamic> c2;
-static field self::C3<dynamic, dynamic> c3;
-static field self::C4<dynamic, dynamic> c4;
-static field self::D1<dynamic, dynamic> d1;
-static field self::D2<dynamic, dynamic> d2;
-static field self::D3<dynamic, dynamic> d3;
-static field self::D4<dynamic, dynamic> d4;
-static field self::E<dynamic> e;
+static field self::C1<dynamic, dynamic>* c1;
+static field self::C2<dynamic, dynamic>* c2;
+static field self::C3<dynamic, dynamic>* c3;
+static field self::C4<dynamic, dynamic>* c4;
+static field self::D1<dynamic, dynamic>* d1;
+static field self::D2<dynamic, dynamic>* d2;
+static field self::D3<dynamic, dynamic>* d3;
+static field self::D4<dynamic, dynamic>* d4;
+static field self::E<dynamic>* e;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
index 4d3a793..ecb02f3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.expect
@@ -2,63 +2,63 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+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* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+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 = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::C1<(core::Null) → dynamic, (core::Null) → dynamic> c1;
-static field self::C2<(core::Null) → dynamic, (core::Null) → dynamic> c2;
-static field self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic> c3;
-static field self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic> c4;
-static field self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic> d1;
-static field self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic> d2;
-static field self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic> d3;
-static field self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic> d4;
-static field self::E<(core::Null) → dynamic> e;
+static field self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c1;
+static field self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c2;
+static field self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c3;
+static field self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d4;
+static field self::E<(core::Null*) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
index 4d3a793..ecb02f3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence.dart.strong.transformed.expect
@@ -2,63 +2,63 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+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* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+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 = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field self::C1<(core::Null) → dynamic, (core::Null) → dynamic> c1;
-static field self::C2<(core::Null) → dynamic, (core::Null) → dynamic> c2;
-static field self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic> c3;
-static field self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic> c4;
-static field self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic> d1;
-static field self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic> d2;
-static field self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic> d3;
-static field self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic> d4;
-static field self::E<(core::Null) → dynamic> e;
+static field self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c1;
+static field self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>* c2;
+static field self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c3;
+static field self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>* c4;
+static field self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d1;
+static field self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>* d2;
+static field self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d3;
+static field self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>* d4;
+static field self::E<(core::Null*) →* dynamic>* e;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect
index 9e7c87b..4c6d523 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.expect
@@ -2,72 +2,72 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc1 = <self::C1<dynamic, dynamic>>[];
-static field dynamic mc1 = <self::C1<dynamic, dynamic>, self::C1<dynamic, dynamic>>{};
-static field dynamic lc2 = <self::C2<dynamic, dynamic>>[];
-static field dynamic mc2 = <self::C2<dynamic, dynamic>, self::C2<dynamic, dynamic>>{};
-static field dynamic lc3 = <self::C3<dynamic, dynamic>>[];
-static field dynamic mc3 = <self::C3<dynamic, dynamic>, self::C3<dynamic, dynamic>>{};
-static field dynamic lc4 = <self::C4<dynamic, dynamic>>[];
-static field dynamic mc4 = <self::C4<dynamic, dynamic>, self::C4<dynamic, dynamic>>{};
-static field dynamic ld1 = <self::D1<dynamic, dynamic>>[];
-static field dynamic md1 = <self::D1<dynamic, dynamic>, self::D1<dynamic, dynamic>>{};
-static field dynamic ld2 = <self::D2<dynamic, dynamic>>[];
-static field dynamic md2 = <self::D2<dynamic, dynamic>, self::D2<dynamic, dynamic>>{};
-static field dynamic ld3 = <self::D3<dynamic, dynamic>>[];
-static field dynamic md3 = <self::D3<dynamic, dynamic>, self::D3<dynamic, dynamic>>{};
-static field dynamic ld4 = <self::D4<dynamic, dynamic>>[];
-static field dynamic md4 = <self::D4<dynamic, dynamic>, self::D4<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic>>[];
-static field dynamic me = <self::E<dynamic>, self::E<dynamic>>{};
+static field dynamic lc1 = <self::C1<dynamic, dynamic>*>[];
+static field dynamic mc1 = <self::C1<dynamic, dynamic>*, self::C1<dynamic, dynamic>*>{};
+static field dynamic lc2 = <self::C2<dynamic, dynamic>*>[];
+static field dynamic mc2 = <self::C2<dynamic, dynamic>*, self::C2<dynamic, dynamic>*>{};
+static field dynamic lc3 = <self::C3<dynamic, dynamic>*>[];
+static field dynamic mc3 = <self::C3<dynamic, dynamic>*, self::C3<dynamic, dynamic>*>{};
+static field dynamic lc4 = <self::C4<dynamic, dynamic>*>[];
+static field dynamic mc4 = <self::C4<dynamic, dynamic>*, self::C4<dynamic, dynamic>*>{};
+static field dynamic ld1 = <self::D1<dynamic, dynamic>*>[];
+static field dynamic md1 = <self::D1<dynamic, dynamic>*, self::D1<dynamic, dynamic>*>{};
+static field dynamic ld2 = <self::D2<dynamic, dynamic>*>[];
+static field dynamic md2 = <self::D2<dynamic, dynamic>*, self::D2<dynamic, dynamic>*>{};
+static field dynamic ld3 = <self::D3<dynamic, dynamic>*>[];
+static field dynamic md3 = <self::D3<dynamic, dynamic>*, self::D3<dynamic, dynamic>*>{};
+static field dynamic ld4 = <self::D4<dynamic, dynamic>*>[];
+static field dynamic md4 = <self::D4<dynamic, dynamic>*, self::D4<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic>*>[];
+static field dynamic me = <self::E<dynamic>*, self::E<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect
index 9e7c87b..4c6d523 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.legacy.transformed.expect
@@ -2,72 +2,72 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field dynamic lc1 = <self::C1<dynamic, dynamic>>[];
-static field dynamic mc1 = <self::C1<dynamic, dynamic>, self::C1<dynamic, dynamic>>{};
-static field dynamic lc2 = <self::C2<dynamic, dynamic>>[];
-static field dynamic mc2 = <self::C2<dynamic, dynamic>, self::C2<dynamic, dynamic>>{};
-static field dynamic lc3 = <self::C3<dynamic, dynamic>>[];
-static field dynamic mc3 = <self::C3<dynamic, dynamic>, self::C3<dynamic, dynamic>>{};
-static field dynamic lc4 = <self::C4<dynamic, dynamic>>[];
-static field dynamic mc4 = <self::C4<dynamic, dynamic>, self::C4<dynamic, dynamic>>{};
-static field dynamic ld1 = <self::D1<dynamic, dynamic>>[];
-static field dynamic md1 = <self::D1<dynamic, dynamic>, self::D1<dynamic, dynamic>>{};
-static field dynamic ld2 = <self::D2<dynamic, dynamic>>[];
-static field dynamic md2 = <self::D2<dynamic, dynamic>, self::D2<dynamic, dynamic>>{};
-static field dynamic ld3 = <self::D3<dynamic, dynamic>>[];
-static field dynamic md3 = <self::D3<dynamic, dynamic>, self::D3<dynamic, dynamic>>{};
-static field dynamic ld4 = <self::D4<dynamic, dynamic>>[];
-static field dynamic md4 = <self::D4<dynamic, dynamic>, self::D4<dynamic, dynamic>>{};
-static field dynamic le = <self::E<dynamic>>[];
-static field dynamic me = <self::E<dynamic>, self::E<dynamic>>{};
+static field dynamic lc1 = <self::C1<dynamic, dynamic>*>[];
+static field dynamic mc1 = <self::C1<dynamic, dynamic>*, self::C1<dynamic, dynamic>*>{};
+static field dynamic lc2 = <self::C2<dynamic, dynamic>*>[];
+static field dynamic mc2 = <self::C2<dynamic, dynamic>*, self::C2<dynamic, dynamic>*>{};
+static field dynamic lc3 = <self::C3<dynamic, dynamic>*>[];
+static field dynamic mc3 = <self::C3<dynamic, dynamic>*, self::C3<dynamic, dynamic>*>{};
+static field dynamic lc4 = <self::C4<dynamic, dynamic>*>[];
+static field dynamic mc4 = <self::C4<dynamic, dynamic>*, self::C4<dynamic, dynamic>*>{};
+static field dynamic ld1 = <self::D1<dynamic, dynamic>*>[];
+static field dynamic md1 = <self::D1<dynamic, dynamic>*, self::D1<dynamic, dynamic>*>{};
+static field dynamic ld2 = <self::D2<dynamic, dynamic>*>[];
+static field dynamic md2 = <self::D2<dynamic, dynamic>*, self::D2<dynamic, dynamic>*>{};
+static field dynamic ld3 = <self::D3<dynamic, dynamic>*>[];
+static field dynamic md3 = <self::D3<dynamic, dynamic>*, self::D3<dynamic, dynamic>*>{};
+static field dynamic ld4 = <self::D4<dynamic, dynamic>*>[];
+static field dynamic md4 = <self::D4<dynamic, dynamic>*, self::D4<dynamic, dynamic>*>{};
+static field dynamic le = <self::E<dynamic>*>[];
+static field dynamic me = <self::E<dynamic>*, self::E<dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
index 9f84a12..b742990 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.outline.expect
@@ -2,44 +2,44 @@
 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>
+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*>*
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = dynamic, Y extends (self::C1::Y) → self::C1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = dynamic, Y extends (self::C1::Y) →* self::C1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = dynamic, Y extends (self::C2::X) → self::C2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = dynamic, Y extends (self::C2::X*) →* self::C2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = dynamic, Y extends (self::D1::Y) → self::D1::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = dynamic, Y extends (self::D1::Y) →* self::D1::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = dynamic, Y extends (self::D2::X) → self::D2::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = dynamic, Y extends (self::D2::X*) →* self::D2::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     ;
 }
-class D3<X extends self::B<self::D3::X, self::D3::Y> = dynamic, Y extends (self::D3::X, self::D3::Y) → self::D3::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+class D3<X extends self::B<self::D3::X, self::D3::Y>* = dynamic, Y extends (self::D3::X*, self::D3::Y) →* self::D3::X* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     ;
 }
-class D4<X extends self::B<self::D4::X, self::D4::Y> = dynamic, Y extends (self::D4::X, self::D4::Y) → self::D4::Y = dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+class D4<X extends self::B<self::D4::X, self::D4::Y>* = dynamic, Y extends (self::D4::X*, self::D4::Y) →* self::D4::Y = dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     ;
 }
-class E<X extends (self::E::X) → self::E::X = dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     ;
 }
 static field dynamic lc1;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
index ddd75ee..f7a9579 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.expect
@@ -2,72 +2,72 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+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* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+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 = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C1<(core::Null) → dynamic, (core::Null) → dynamic>> lc1 = <self::C1<(core::Null) → dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C1<(core::Null) → dynamic, (core::Null) → dynamic>, self::C1<(core::Null) → dynamic, (core::Null) → dynamic>> mc1 = <self::C1<(core::Null) → dynamic, (core::Null) → dynamic>, self::C1<(core::Null) → dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::C2<(core::Null) → dynamic, (core::Null) → dynamic>> lc2 = <self::C2<(core::Null) → dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C2<(core::Null) → dynamic, (core::Null) → dynamic>, self::C2<(core::Null) → dynamic, (core::Null) → dynamic>> mc2 = <self::C2<(core::Null) → dynamic, (core::Null) → dynamic>, self::C2<(core::Null) → dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> lc3 = <self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> mc3 = <self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> lc4 = <self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> mc4 = <self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>> ld1 = <self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>> md1 = <self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>> ld2 = <self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>> md2 = <self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> ld3 = <self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> md3 = <self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> ld4 = <self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> md4 = <self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::E<(core::Null) → dynamic>> le = <self::E<(core::Null) → dynamic>>[];
-static field core::Map<self::E<(core::Null) → dynamic>, self::E<(core::Null) → dynamic>> me = <self::E<(core::Null) → dynamic>, self::E<(core::Null) → dynamic>>{};
+static field core::List<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc1 = <self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc1 = <self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc2 = <self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc2 = <self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc3 = <self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc3 = <self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc4 = <self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc4 = <self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::E<(core::Null*) →* dynamic>*>* le = <self::E<(core::Null*) →* dynamic>*>[];
+static field core::Map<self::E<(core::Null*) →* dynamic>*, self::E<(core::Null*) →* dynamic>*>* me = <self::E<(core::Null*) →* dynamic>*, self::E<(core::Null*) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
index ddd75ee..f7a9579 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/mutual_dependence_in_literals.dart.strong.transformed.expect
@@ -2,72 +2,72 @@
 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>
+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::•()
     ;
 }
-class C1<X extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic, Y extends (self::C1::Y) → self::C1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C1<self::C1::X, self::C1::Y>
+class C1<X extends (self::C1::Y) →* self::C1::X = (core::Null*) →* dynamic, Y extends (self::C1::Y) →* self::C1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C1<self::C1::X*, self::C1::Y*>*
     : super core::Object::•()
     ;
 }
-class C2<X extends (self::C2::Y) → self::C2::X = (core::Null) → dynamic, Y extends (self::C2::X) → self::C2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::X, self::C2::Y>
+class C2<X extends (self::C2::Y) →* self::C2::X = (core::Null*) →* dynamic, Y extends (self::C2::X*) →* self::C2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::X*, self::C2::Y*>*
     : super core::Object::•()
     ;
 }
-class C3<X extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic, Y extends (self::C3::X, self::C3::Y) → self::C3::X = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C3<self::C3::X, self::C3::Y>
+class C3<X extends (self::C3::X, self::C3::Y) →* self::C3::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C3::X*, self::C3::Y) →* self::C3::X* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C3<self::C3::X*, self::C3::Y*>*
     : super core::Object::•()
     ;
 }
-class C4<X extends (self::C4::X, self::C4::Y) → self::C4::X = (core::Null, core::Null) → dynamic, Y extends (self::C4::X, self::C4::Y) → self::C4::Y = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::C4<self::C4::X, self::C4::Y>
+class C4<X extends (self::C4::X, self::C4::Y) →* self::C4::X = (core::Null*, core::Null*) →* dynamic, Y extends (self::C4::X*, self::C4::Y) →* self::C4::Y = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::C4<self::C4::X*, self::C4::Y*>*
     : super core::Object::•()
     ;
 }
-class D1<X extends self::B<self::D1::X, self::D1::Y> = self::B<dynamic, dynamic>, Y extends (self::D1::Y) → self::D1::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D1<self::D1::X, self::D1::Y>
+class D1<X extends self::B<self::D1::X, self::D1::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D1::Y) →* self::D1::X* = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D1<self::D1::X*, self::D1::Y*>*
     : super core::Object::•()
     ;
 }
-class D2<X extends self::B<self::D2::X, self::D2::Y> = self::B<dynamic, dynamic>, Y extends (self::D2::X) → self::D2::Y = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D2<self::D2::X, self::D2::Y>
+class D2<X extends self::B<self::D2::X, self::D2::Y>* = self::B<dynamic, dynamic>*, Y extends (self::D2::X*) →* self::D2::Y = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D2<self::D2::X*, self::D2::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D3<self::D3::X, self::D3::Y>
+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* = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D3<self::D3::X*, self::D3::Y*>*
     : super core::Object::•()
     ;
 }
-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 = (core::Null, core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::D4<self::D4::X, self::D4::Y>
+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 = (core::Null*, core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::D4<self::D4::X*, self::D4::Y*>*
     : super core::Object::•()
     ;
 }
-class E<X extends (self::E::X) → self::E::X = (core::Null) → dynamic> extends core::Object {
-  synthetic constructor •() → self::E<self::E::X>
+class E<X extends (self::E::X) →* self::E::X = (core::Null*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::E<self::E::X*>*
     : super core::Object::•()
     ;
 }
-static field core::List<self::C1<(core::Null) → dynamic, (core::Null) → dynamic>> lc1 = <self::C1<(core::Null) → dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C1<(core::Null) → dynamic, (core::Null) → dynamic>, self::C1<(core::Null) → dynamic, (core::Null) → dynamic>> mc1 = <self::C1<(core::Null) → dynamic, (core::Null) → dynamic>, self::C1<(core::Null) → dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::C2<(core::Null) → dynamic, (core::Null) → dynamic>> lc2 = <self::C2<(core::Null) → dynamic, (core::Null) → dynamic>>[];
-static field core::Map<self::C2<(core::Null) → dynamic, (core::Null) → dynamic>, self::C2<(core::Null) → dynamic, (core::Null) → dynamic>> mc2 = <self::C2<(core::Null) → dynamic, (core::Null) → dynamic>, self::C2<(core::Null) → dynamic, (core::Null) → dynamic>>{};
-static field core::List<self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> lc3 = <self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> mc3 = <self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C3<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> lc4 = <self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>> mc4 = <self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>, self::C4<(core::Null, core::Null) → dynamic, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>> ld1 = <self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>>[];
-static field core::Map<self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>> md1 = <self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D1<self::B<dynamic, dynamic>, (core::Null) → dynamic>>{};
-static field core::List<self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>> ld2 = <self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>>[];
-static field core::Map<self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>> md2 = <self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>, self::D2<self::B<dynamic, dynamic>, (core::Null) → dynamic>>{};
-static field core::List<self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> ld3 = <self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> md3 = <self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D3<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> ld4 = <self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>[];
-static field core::Map<self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>> md4 = <self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>, self::D4<self::B<dynamic, dynamic>, (core::Null, core::Null) → dynamic>>{};
-static field core::List<self::E<(core::Null) → dynamic>> le = <self::E<(core::Null) → dynamic>>[];
-static field core::Map<self::E<(core::Null) → dynamic>, self::E<(core::Null) → dynamic>> me = <self::E<(core::Null) → dynamic>, self::E<(core::Null) → dynamic>>{};
+static field core::List<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc1 = <self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc1 = <self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C1<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* lc2 = <self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>* mc2 = <self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*, self::C2<(core::Null*) →* dynamic, (core::Null*) →* dynamic>*>{};
+static field core::List<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc3 = <self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc3 = <self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C3<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* lc4 = <self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>* mc4 = <self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*, self::C4<(core::Null*, core::Null*) →* dynamic, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md1 = <self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D1<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* ld2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>[];
+static field core::Map<self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>* md2 = <self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*, self::D2<self::B<dynamic, dynamic>*, (core::Null*) →* dynamic>*>{};
+static field core::List<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md3 = <self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D3<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* ld4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>[];
+static field core::Map<self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>* md4 = <self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*, self::D4<self::B<dynamic, dynamic>*, (core::Null*, core::Null*) →* dynamic>*>{};
+static field core::List<self::E<(core::Null*) →* dynamic>*>* le = <self::E<(core::Null*) →* dynamic>*>[];
+static field core::Map<self::E<(core::Null*) →* dynamic>*, self::E<(core::Null*) →* dynamic>*>* me = <self::E<(core::Null*) →* dynamic>*, self::E<(core::Null*) →* dynamic>*>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart
index b63fbe0..0ef6500 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.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.
 
-// This test checks that a compile-time error is generated when instantaite to
+// This test checks that a compile-time error is generated when instantiate to
 // bound can't be applied due to raw types with non-simple bounds.  The
 // non-simplicity in this test is due to having another raw type in the bound
 // that in its turn has type variables with non-simple bounds.
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect
index 4f15a48..b894394 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.expect
@@ -2,20 +2,20 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::TypeV>
+class C<TypeV extends self::B<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic> c;
+static field self::C<dynamic>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect
index 4f15a48..b894394 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::TypeV>
+class C<TypeV extends self::B<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
 }
-static field self::C<dynamic> c;
+static field self::C<dynamic>* c;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
index 1a4b9d6..5f6a80b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.outline.expect
@@ -2,18 +2,18 @@
 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>
+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*>*
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     ;
 }
-class C<TypeV extends self::B<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::TypeV>
+class C<TypeV extends self::B<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
     ;
 }
-static field self::C<dynamic> c;
+static field self::C<dynamic>* c;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
index 8d64011..c7f2472 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.expect
@@ -13,20 +13,20 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
-  synthetic constructor •() → self::C<self::C::TypeV>
+class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
 }
-static field self::C<self::B<dynamic>> c;
+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_non_simple.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
index 8d64011..c7f2472 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_non_simple.dart.strong.transformed.expect
@@ -13,20 +13,20 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-class C<TypeV extends self::B<dynamic> = self::B<dynamic>> extends core::Object {
-  synthetic constructor •() → self::C<self::C::TypeV>
+class C<TypeV extends self::B<dynamic>* = self::B<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::C<self::C::TypeV*>*
     : super core::Object::•()
     ;
 }
-static field self::C<self::B<dynamic>> c;
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.expect
index d280666..6f3e1f0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> b;
+static field self::B<dynamic>* b;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect
index d280666..6f3e1f0 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> b;
+static field self::B<dynamic>* b;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
index b23cd6a..81293ce 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.outline.expect
@@ -2,14 +2,14 @@
 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>
+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*>*
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     ;
 }
-static field self::B<dynamic> b;
+static field self::B<dynamic>* b;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
index 4e815e9..4668262 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.expect
@@ -13,15 +13,15 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> b;
+static field self::B<dynamic>* b;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
index 4e815e9..4668262 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_bound_due_to_variables.dart.strong.transformed.expect
@@ -13,15 +13,15 @@
 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>
+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::•()
     ;
 }
-class B<TypeU extends self::A<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::TypeU>
+class B<TypeU extends self::A<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::TypeU*>*
     : super core::Object::•()
     ;
 }
-static field self::B<dynamic> b;
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.expect
index f0579e6..b5089ba 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk = <TypeY extends self::Hest<dynamic>* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic>* = dynamic>() →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect
index f0579e6..b5089ba 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk = <TypeY extends self::Hest<dynamic>* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic>* = dynamic>() →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
index 127fe03..6729f04 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk = <TypeY extends self::Hest<dynamic> = dynamic>() → void;
-class Hest<TypeX extends <TypeY extends self::Hest<dynamic> = dynamic>() → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk = <TypeY extends self::Hest<dynamic>* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends self::Hest<dynamic>* = dynamic>() →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
index c7037fd..f4d1a2b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.expect
@@ -16,9 +16,9 @@
 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 = <TypeY extends core::Object = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
index c7037fd..f4d1a2b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_parametrized_typedef_cycle.dart.strong.transformed.expect
@@ -16,9 +16,9 @@
 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 = <TypeY extends core::Object = dynamic>() → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk = <TypeY extends core::Object* = dynamic>() →* void;
+class Hest<TypeX extends <TypeY extends core::Object* = dynamic>() →* void = <TypeY extends core::Object* = dynamic>() →* void> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect
index 8c847d1..fef748d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
-class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk<TypeY extends self::Hest<dynamic>* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect
index 8c847d1..fef748d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
-class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk<TypeY extends self::Hest<dynamic>* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
index 2000645..a6fe87c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends self::Hest<dynamic> = dynamic> = () → void;
-class Hest<TypeX extends () → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk<TypeY extends self::Hest<dynamic>* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
index e3cf58b..548d055 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.expect
@@ -16,9 +16,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends core::Object = dynamic> = () → void;
-class Hest<TypeX extends () → void = () → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk<TypeY extends core::Object* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = () →* void> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
index e3cf58b..548d055 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_class_typedef_cycle.dart.strong.transformed.expect
@@ -16,9 +16,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Fisk<TypeY extends core::Object = dynamic> = () → void;
-class Hest<TypeX extends () → void = () → void> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+typedef Fisk<TypeY extends core::Object* = dynamic> = () →* void;
+class Hest<TypeX extends () →* void = () →* void> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect
index 53f9fc1..5b4829b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect
index 53f9fc1..5b4829b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
index e8cff46..b15092d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
index 5600160..5e84789 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.expect
@@ -10,8 +10,8 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
index 5600160..5e84789 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive.dart.strong.transformed.expect
@@ -10,8 +10,8 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect
index 68d5fb4..85030b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX, self::Hest::TypeY>
+class Hest<TypeX extends self::Hest<dynamic, dynamic>* = dynamic, TypeY extends self::Hest<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*, self::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect
index 68d5fb4..85030b7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX, self::Hest::TypeY>
+class Hest<TypeX extends self::Hest<dynamic, dynamic>* = dynamic, TypeY extends self::Hest<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*, self::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
index d36fb76..2c55b6f 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<dynamic, dynamic> = dynamic, TypeY extends self::Hest<dynamic, dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX, self::Hest::TypeY>
+class Hest<TypeX extends self::Hest<dynamic, dynamic>* = dynamic, TypeY extends self::Hest<dynamic, dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*, self::Hest::TypeY*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
index c5e07d0..76889cc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.expect
@@ -15,8 +15,8 @@
 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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
index c5e07d0..76889cc 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_for_each.dart.strong.transformed.expect
@@ -15,8 +15,8 @@
 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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect
index 71f47e7..4758218 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect
index 71f47e7..4758218 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.legacy.transformed.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
index b9f1e44..ce84ab3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.outline.expect
@@ -2,8 +2,8 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
index 834692d..af231ae 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.expect
@@ -10,8 +10,8 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
index 834692d..af231ae 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_co_inductive_no_dup.dart.strong.transformed.expect
@@ -10,8 +10,8 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect
index fb0be4f..0350195 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.expect
@@ -2,13 +2,13 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect
index fb0be4f..0350195 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
index e9b8c20..39ff531 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.outline.expect
@@ -2,12 +2,12 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
index f9497f2..3192260 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.expect
@@ -2,13 +2,13 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
index f9497f2..3192260 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_folded_regress.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<core::Object>> = self::Hest<self::Hest<core::Object>>> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<core::Object*>*>* = self::Hest<self::Hest<core::Object*>*>*> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect
index c4a6a44..2e54e4c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY, self::Fisk::TypeZ>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic, TypeZ extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*, self::Fisk::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect
index c4a6a44..2e54e4c 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY, self::Fisk::TypeZ>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic, TypeZ extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*, self::Fisk::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
index 94a31c0..35c5f78 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic, TypeZ extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY, self::Fisk::TypeZ>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic, TypeZ extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*, self::Fisk::TypeZ*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
index 326f710..10af610 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.expect
@@ -21,13 +21,13 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
index 326f710..10af610 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_for_each.dart.strong.transformed.expect
@@ -21,13 +21,13 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect
index e6a55cc..5a5d415 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.expect
@@ -5,8 +5,8 @@
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::X>
+class Hest<X extends col::LinkedListEntry<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect
index e6a55cc..5a5d415 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.legacy.transformed.expect
@@ -5,8 +5,8 @@
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::X>
+class Hest<X extends col::LinkedListEntry<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
index d3b7084..286a5ac 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.outline.expect
@@ -5,8 +5,8 @@
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::X>
+class Hest<X extends col::LinkedListEntry<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
index ce101a2..19e96f7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.expect
@@ -13,8 +13,8 @@
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::X>
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
index ce101a2..19e96f7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_from_compiled.dart.strong.transformed.expect
@@ -13,8 +13,8 @@
 
 import "dart:collection";
 
-class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::X>
+class Hest<X extends col::LinkedListEntry<col::LinkedListEntry<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::X*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect
index 8f35bde..32de1c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null*>* = dynamic>(TypeZ) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect
index 8f35bde..32de1c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null*>* = dynamic>(TypeZ) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
index ca65407..760a2bd 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null*>* = dynamic>(TypeZ) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
index 6fa7b7c..4983685 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.expect
@@ -9,13 +9,13 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null*>* = dynamic>(TypeZ) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
index 6fa7b7c..4983685 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_generic_function_in_bound_regress.dart.strong.transformed.expect
@@ -9,13 +9,13 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null> = dynamic>(TypeZ) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends <TypeZ extends self::Hest<core::Null*>* = dynamic>(TypeZ) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect
index 8ece926..5699ba6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>*, self::Fisk<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect
index 8ece926..5699ba6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>*, self::Fisk<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
index c2f7339..175cfb3 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
-class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>, self::Fisk<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends core::Map<self::Hest<dynamic>*, self::Fisk<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
index 8f7b853..2e957c6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.expect
@@ -21,18 +21,18 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
index 8f7b853..2e957c6 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many.dart.strong.transformed.expect
@@ -21,18 +21,18 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Fisk<self::Fisk::TypeY> = self::Fisk<dynamic>> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
index aa682e0..293f3ac 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends non::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
@@ -19,8 +19,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → non::Hest<non::Hest::TypeY>
+class Hest<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → non::Hest<non::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
index aa682e0..293f3ac 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.legacy.transformed.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends non::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
@@ -19,8 +19,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → non::Hest<non::Hest::TypeY>
+class Hest<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → non::Hest<non::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
index 8b8c4bb..ed0fbab 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.outline.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle_lib.dart" as lib;
 
-class Hest<TypeX extends non::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends non::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
 static method main() → dynamic
@@ -19,7 +19,7 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → non::Hest<non::Hest::TypeY>
+class Hest<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → non::Hest<non::Hest::TypeY*>*
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
index 5ed003d..84e578d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.expect
@@ -18,8 +18,8 @@
 
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
@@ -32,8 +32,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → self2::Hest<self2::Hest::TypeY>
+class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
index 5ed003d..84e578d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_many_libs_same_name_cycle.dart.strong.transformed.expect
@@ -18,8 +18,8 @@
 
 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>
+class Hest<TypeX extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
@@ -32,8 +32,8 @@
 
 import "org-dartlang-testcase:///non_simple_many_libs_same_name_cycle.dart" as lib;
 
-class Hest<TypeY extends self::Hest<dynamic> = self::Hest<dynamic>> extends core::Object {
-  synthetic constructor •() → self2::Hest<self2::Hest::TypeY>
+class Hest<TypeY extends self::Hest<dynamic>* = self::Hest<dynamic>*> extends core::Object {
+  synthetic constructor •() → self2::Hest<self2::Hest::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect
index 24daf45..0efd905 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect
index 24daf45..0efd905 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
index c6e450f..a81c103 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends core::Map<self::Hest<dynamic>, self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends core::Map<self::Hest<dynamic>*, self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
index 1e42409..2950575 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.expect
@@ -13,13 +13,13 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
index 1e42409..2950575 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_no_dup.dart.strong.transformed.expect
@@ -13,13 +13,13 @@
 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>
+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::•()
     ;
 }
-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>
+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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
index 9e41974..d6b640b 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart
@@ -4,7 +4,7 @@
 
 // This test checks that in the case of an error on a class related to
 // non-simple bounds, the implied errors on other classes that reference the
-// erronious one in the bounds of their type variables is not reported.
+// erroneous one in the bounds of their type variables is not reported.
 
 class Hest<TypeX extends Hest<TypeX>> {}
 
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect
index 0b1c970..b7b9a18 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect
index 0b1c970..b7b9a18 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
index 6456ed0..57cdeed 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
index ae65387..5a73de7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.expect
@@ -13,18 +13,18 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
index ae65387..5a73de7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_suppress_consequence.dart.strong.transformed.expect
@@ -13,18 +13,18 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
-class Naebdyr<TypeZ extends self::Fisk<dynamic> = self::Fisk<dynamic>> extends core::Object {
-  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ>
+class Naebdyr<TypeZ extends self::Fisk<dynamic>* = self::Fisk<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::Naebdyr<self::Naebdyr::TypeZ*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect
index e69cd16..577bc72 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect
index e69cd16..577bc72 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     : super core::Object::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
index b3554f3..49f116a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class Hest<TypeX extends self::Hest<self::Hest::TypeX> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Hest<self::Hest::TypeX>
+class Hest<TypeX extends self::Hest<self::Hest::TypeX>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Hest<self::Hest::TypeX*>*
     ;
 }
-class Fisk<TypeY extends self::Hest<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
index b94bb61..6c8df32 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.expect
@@ -13,13 +13,13 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
index b94bb61..6c8df32 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/non_simple_variables_from_same.dart.strong.transformed.expect
@@ -13,13 +13,13 @@
 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>
+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::•()
     ;
 }
-class Fisk<TypeY extends self::Hest<self::Hest<dynamic>> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Fisk<self::Fisk::TypeY>
+class Fisk<TypeY extends self::Hest<self::Hest<dynamic>*>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Fisk<self::Fisk::TypeY*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect
index ba39350..0a60b50 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.expect
@@ -5,20 +5,20 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → self::A<dynamic>
+  method foo() → self::A<dynamic>*
     return null;
-  method baz() → col::DoubleLinkedQueue<dynamic>
+  method baz() → col::DoubleLinkedQueue<dynamic>*
     return null;
 }
-static field self::A<dynamic> a;
-static field col::DoubleLinkedQueue<dynamic> c;
+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/omitted_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.transformed.expect
index ba39350..0a60b50 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.legacy.transformed.expect
@@ -5,20 +5,20 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → self::A<dynamic>
+  method foo() → self::A<dynamic>*
     return null;
-  method baz() → col::DoubleLinkedQueue<dynamic>
+  method baz() → col::DoubleLinkedQueue<dynamic>*
     return null;
 }
-static field self::A<dynamic> a;
-static field col::DoubleLinkedQueue<dynamic> c;
+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/omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
index 3077c8b5..04f9ca4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.outline.expect
@@ -5,19 +5,19 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method foo() → self::A<dynamic>
+  method foo() → self::A<dynamic>*
     ;
-  method baz() → col::DoubleLinkedQueue<dynamic>
+  method baz() → col::DoubleLinkedQueue<dynamic>*
     ;
 }
-static field self::A<dynamic> a;
-static field col::DoubleLinkedQueue<dynamic> c;
+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/omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
index ba39350..0a60b50 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.expect
@@ -5,20 +5,20 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → self::A<dynamic>
+  method foo() → self::A<dynamic>*
     return null;
-  method baz() → col::DoubleLinkedQueue<dynamic>
+  method baz() → col::DoubleLinkedQueue<dynamic>*
     return null;
 }
-static field self::A<dynamic> a;
-static field col::DoubleLinkedQueue<dynamic> c;
+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/omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
index ba39350..0a60b50 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/omitted_bound.dart.strong.transformed.expect
@@ -5,20 +5,20 @@
 
 import "dart:collection";
 
-class A<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → self::A<dynamic>
+  method foo() → self::A<dynamic>*
     return null;
-  method baz() → col::DoubleLinkedQueue<dynamic>
+  method baz() → col::DoubleLinkedQueue<dynamic>*
     return null;
 }
-static field self::A<dynamic> a;
-static field col::DoubleLinkedQueue<dynamic> c;
+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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.expect
index 6861656..be64316 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect
index 6861656..be64316 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
index ac1da81..77163cf 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-class B<T extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
index f4f4b72..9382301 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::num> = self::A<core::num>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
index f4f4b72..9382301 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/raw_in_bound.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends core::num = core::num> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends core::num* = core::num*> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-class B<T extends self::A<core::num> = self::A<core::num>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends self::A<core::num*>* = self::A<core::num*>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.expect
index 6b8efb5..6158bfa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Comparable<self::A::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+class A<X extends core::Comparable<self::A::X>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B<Y extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.transformed.expect
index 6b8efb5..6158bfa 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Comparable<self::A::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+class A<X extends core::Comparable<self::A::X>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B<Y extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
index 9a334ff..c1cd644 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.outline.expect
@@ -2,12 +2,12 @@
 import self as self;
 import "dart:core" as core;
 
-class A<X extends core::Comparable<self::A::X> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::X>
+class A<X extends core::Comparable<self::A::X>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class B<Y extends self::A<dynamic> = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends self::A<dynamic>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.expect
index 88cbec9..2682021 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.expect
@@ -2,13 +2,13 @@
 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>
+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::•()
     ;
 }
-class B<Y extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.transformed.expect
index 88cbec9..2682021 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_in_bound.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 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>
+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::•()
     ;
 }
-class B<Y extends self::A<dynamic> = self::A<dynamic>> extends core::Object {
-  synthetic constructor •() → self::B<self::B::Y>
+class B<Y extends self::A<dynamic>* = self::A<dynamic>*> extends core::Object {
+  synthetic constructor •() → self::B<self::B::Y*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect
index 49fae2a..93c45da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> a;
+static field self::A<dynamic>* a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect
index 49fae2a..93c45da 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.legacy.transformed.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
-static field self::A<dynamic> a;
+static field self::A<dynamic>* a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
index a8e1b17..a2a9d19 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-class A<T extends self::A<self::A::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::A<self::A::T>
+class A<T extends self::A<self::A::T>* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
-static field self::A<dynamic> a;
+static field self::A<dynamic>* a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
index 1b94d92..35d7d8a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.expect
@@ -2,10 +2,10 @@
 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>
+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::•()
     ;
 }
-static field self::A<self::A<dynamic>> a;
+static field self::A<self::A<dynamic>*>* a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
index 1b94d92..35d7d8a 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/super_bounded_type.dart.strong.transformed.expect
@@ -2,10 +2,10 @@
 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>
+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::•()
     ;
 }
-static field self::A<self::A<dynamic>> a;
+static field self::A<self::A<dynamic>*>* a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
index f3dfb42..f3acb23 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.hierarchy.expect
@@ -128,29 +128,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -163,19 +145,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect
index 03d4d75..8b201f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.expect
@@ -6,20 +6,20 @@
 import "package:expect/expect.dart";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → self::X<self::X::T>
+class X<T extends self::B* = dynamic> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → self::Y
+  synthetic constructor •() → self::Y*
     : super self::X::•()
     ;
 }
 static method main() → void {
-  exp::Expect::isTrue(new self::Y::•() is self::X<dynamic>);
+  exp::Expect::isTrue(new self::Y::•() is self::X<dynamic>*);
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect
index 03d4d75..8b201f2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.legacy.transformed.expect
@@ -6,20 +6,20 @@
 import "package:expect/expect.dart";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → self::X<self::X::T>
+class X<T extends self::B* = dynamic> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → self::Y
+  synthetic constructor •() → self::Y*
     : super self::X::•()
     ;
 }
 static method main() → void {
-  exp::Expect::isTrue(new self::Y::•() is self::X<dynamic>);
+  exp::Expect::isTrue(new self::Y::•() is self::X<dynamic>*);
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
index 302cab4..c64d3c5 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.outline.expect
@@ -5,15 +5,15 @@
 import "package:expect/expect.dart";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
-class X<T extends self::B = dynamic> extends core::Object {
-  synthetic constructor •() → self::X<self::X::T>
+class X<T extends self::B* = dynamic> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
     ;
 }
 class Y extends self::X<dynamic> {
-  synthetic constructor •() → self::Y
+  synthetic constructor •() → self::Y*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
index b431071..afffa4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.expect
@@ -6,20 +6,20 @@
 import "package:expect/expect.dart";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-class X<T extends self::B = self::B> extends core::Object {
-  synthetic constructor •() → self::X<self::X::T>
+class X<T extends self::B* = self::B*> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
 }
-class Y extends self::X<self::B> {
-  synthetic constructor •() → self::Y
+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>);
+  exp::Expect::isTrue(new self::Y::•() is self::X<self::B*>*);
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
index b431071..afffa4d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/supertypes.dart.strong.transformed.expect
@@ -6,20 +6,20 @@
 import "package:expect/expect.dart";
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-class X<T extends self::B = self::B> extends core::Object {
-  synthetic constructor •() → self::X<self::X::T>
+class X<T extends self::B* = self::B*> extends core::Object {
+  synthetic constructor •() → self::X<self::X::T*>*
     : super core::Object::•()
     ;
 }
-class Y extends self::X<self::B> {
-  synthetic constructor •() → self::Y
+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>);
+  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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.expect
index 36b2665..b644e73 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo((dynamic) → dynamic a) → dynamic
+  method foo((dynamic) →* dynamic a) → dynamic
     return null;
-  method bar() → (dynamic) → dynamic
+  method bar() → (dynamic) →* dynamic
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect
index 36b2665..b644e73 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo((dynamic) → dynamic a) → dynamic
+  method foo((dynamic) →* dynamic a) → dynamic
     return null;
-  method bar() → (dynamic) → dynamic
+  method bar() → (dynamic) →* dynamic
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
index 7dc38f3..a05dade 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method foo((dynamic) → dynamic a) → dynamic
+  method foo((dynamic) →* dynamic a) → dynamic
     ;
-  method bar() → (dynamic) → dynamic
+  method bar() → (dynamic) →* dynamic
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
index 9a78514..47cd11d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo((core::num) → dynamic a) → dynamic
+  method foo((core::num*) →* dynamic a) → dynamic
     return null;
-  method bar() → (core::num) → dynamic
+  method bar() → (core::num*) →* dynamic
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
index 9a78514..47cd11d 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_instantiated_in_outline.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo((core::num) → dynamic a) → dynamic
+  method foo((core::num*) →* dynamic a) → dynamic
     return null;
-  method bar() → (core::num) → dynamic
+  method bar() → (core::num*) →* dynamic
     return null;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect
index a682c5a..45ab9a7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-static field dynamic a = <(dynamic) → dynamic>[];
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+static field dynamic a = <(dynamic) →* dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect
index a682c5a..45ab9a7 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-static field dynamic a = <(dynamic) → dynamic>[];
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+static field dynamic a = <(dynamic) →* dynamic>[];
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
index 4b19220..e1932d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 static field dynamic a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
index f3acf59..424bbbe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-static field core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+typedef A<T extends core::num* = 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.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
index f3acf59..424bbbe 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-static field core::List<(core::num) → dynamic> a = <(core::num) → dynamic>[];
+typedef A<T extends core::num* = 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.expect
index d67af0a..66e0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<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>
+typedef A<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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
index d67af0a..66e0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.legacy.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<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>
+typedef A<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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
index f0a390b..b2250e8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.outline.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<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;
-  final field core::List<(core::num) → dynamic> bar;
-  synthetic constructor •() → self::B<self::B::S>
+typedef A<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;
+  final field core::List<(core::num*) →* dynamic>* bar;
+  synthetic constructor •() → self::B<self::B::S*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
index d67af0a..66e0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<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>
+typedef A<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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
index d67af0a..66e0166 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_list_with_generic_argument.dart.strong.transformed.expect
@@ -2,11 +2,11 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<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>
+typedef A<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::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect
index cb487a9..3e9ea11 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-static field dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+static field dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect
index cb487a9..3e9ea11 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-static field dynamic a = <(dynamic) → dynamic, (dynamic) → dynamic>{};
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+static field dynamic a = <(dynamic) →* dynamic, (dynamic) →* dynamic>{};
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
index 4b19220..e1932d8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
 static field dynamic a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
index fe31568..45dc4c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-static field core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
+typedef A<T extends core::num* = 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_literal_map.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
index fe31568..45dc4c2 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_literal_map.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-static field core::Map<(core::num) → dynamic, (core::num) → dynamic> a = <(core::num) → dynamic, (core::num) → dynamic>{};
+typedef A<T extends core::num* = 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.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.expect
index 7f89969..4bca658 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → (dynamic) → dynamic
+  method foo() → (dynamic) →* dynamic
     return null;
 }
-static field (dynamic) → dynamic a;
+static field (dynamic) →* dynamic a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect
index 7f89969..4bca658 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → (dynamic) → dynamic
+  method foo() → (dynamic) →* dynamic
     return null;
 }
-static field (dynamic) → dynamic a;
+static field (dynamic) →* dynamic a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
index 9aaa7ce..aa6c819 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method foo() → (dynamic) → dynamic
+  method foo() → (dynamic) →* dynamic
     ;
 }
-static field (dynamic) → dynamic a;
+static field (dynamic) →* dynamic a;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
index 7f89969..4bca658 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → (dynamic) → dynamic
+  method foo() → (dynamic) →* dynamic
     return null;
 }
-static field (dynamic) → dynamic a;
+static field (dynamic) →* dynamic a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
index 7f89969..4bca658 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_omitted_bound.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method foo() → (dynamic) → dynamic
+  method foo() → (dynamic) →* dynamic
     return null;
 }
-static field (dynamic) → dynamic a;
+static field (dynamic) →* dynamic a;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect
index d47c9b7..14ae8a8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+class B<T extends (dynamic) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect
index d47c9b7..14ae8a8 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.legacy.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+class B<T extends (dynamic) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
index 91b8274..434a8b9 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = dynamic> = (T) → dynamic;
-class B<T extends (dynamic) → dynamic = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef A<T extends core::num* = dynamic> = (T*) →* dynamic;
+class B<T extends (dynamic) →* dynamic = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
index 334841e..4036b32 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-class B<T extends (core::num) → dynamic = (core::num) → dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
index 334841e..4036b32 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_raw_in_bound.dart.strong.transformed.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::num = core::num> = (T) → dynamic;
-class B<T extends (core::num) → dynamic = (core::num) → dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef A<T extends core::num* = core::num*> = (T*) →* dynamic;
+class B<T extends (core::num*) →* dynamic = (core::num*) →* dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
index cead8f1..9bc70a4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = (dynamic) → dynamic> = (S) → dynamic;
-static field ((dynamic) → dynamic) → dynamic b;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<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/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect
index cead8f1..9bc70a4 100644
--- a/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/instantiate_to_bound/typedef_super_bounded_type.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef A<T extends core::Object = dynamic> = (T) → dynamic;
-typedef B<S extends (S) → dynamic = (dynamic) → dynamic> = (S) → dynamic;
-static field ((dynamic) → dynamic) → dynamic b;
+typedef A<T extends core::Object* = dynamic> = (T*) →* dynamic;
+typedef B<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/interface_contravariant_from_class.dart.legacy.expect b/pkg/front_end/testcases/interface_contravariant_from_class.dart.legacy.expect
deleted file mode 100644
index cc045f3..0000000
--- a/pkg/front_end/testcases/interface_contravariant_from_class.dart.legacy.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/interface_contravariant_from_class.dart.legacy.transformed.expect
deleted file mode 100644
index cc045f3..0000000
--- a/pkg/front_end/testcases/interface_contravariant_from_class.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart.outline.expect b/pkg/front_end/testcases/interface_contravariant_from_class.dart.outline.expect
deleted file mode 100644
index 31e0650..0000000
--- a/pkg/front_end/testcases/interface_contravariant_from_class.dart.outline.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    ;
-  method f(core::int x) → self::B::T
-    ;
-}
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    ;
-  abstract method f(core::Object x) → self::I::T;
-}
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.expect b/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.expect
deleted file mode 100644
index cc045f3..0000000
--- a/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.transformed.expect
deleted file mode 100644
index cc045f3..0000000
--- a/pkg/front_end/testcases/interface_contravariant_from_class.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_contravariant_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.expect b/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.expect
deleted file mode 100644
index b886daa..0000000
--- a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.transformed.expect
deleted file mode 100644
index b886daa..0000000
--- a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.outline.expect b/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.outline.expect
deleted file mode 100644
index 3e3646c..0000000
--- a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.outline.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    ;
-  method f((self::B::T) → void x, core::int y) → void
-    ;
-}
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    ;
-  abstract method f((self::I::T) → void x, core::Object y) → void;
-}
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.expect b/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.expect
deleted file mode 100644
index b886daa..0000000
--- a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.transformed.expect
deleted file mode 100644
index b886daa..0000000
--- a/pkg/front_end/testcases/interface_covariantImpl_from_class.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantImpl_from_class.dart:17:16: Error: Found unsupported uses of 'T' 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<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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.expect b/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.expect
deleted file mode 100644
index e275052..0000000
--- a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> implements A<F<T>> {
-//       ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
-// abstract class I<T> implements A<F<T>> {
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T x, core::int y) → 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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.transformed.expect b/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.transformed.expect
deleted file mode 100644
index e275052..0000000
--- a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> implements A<F<T>> {
-//       ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
-// abstract class I<T> implements A<F<T>> {
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T x, core::int y) → 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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.outline.expect b/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.outline.expect
deleted file mode 100644
index c7028ce..0000000
--- a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.outline.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> implements A<F<T>> {
-//       ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
-// abstract class I<T> implements A<F<T>> {
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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<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>
-    ;
-  abstract method f(generic-covariant-impl self::A::T x, core::int y) → void;
-}
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
-    ;
-  method f((self::B::T) → void x, core::int y) → void
-    ;
-}
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
-    ;
-  abstract method f((self::I::T) → void x, core::Object y) → void;
-}
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.expect b/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.expect
deleted file mode 100644
index e275052..0000000
--- a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> implements A<F<T>> {
-//       ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
-// abstract class I<T> implements A<F<T>> {
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T x, core::int y) → 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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.transformed.expect b/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.transformed.expect
deleted file mode 100644
index e275052..0000000
--- a/pkg/front_end/testcases/interface_covariantInterface_from_class.dart.strong.transformed.expect
+++ /dev/null
@@ -1,48 +0,0 @@
-library test;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:13:7: Error: Found unsupported uses of 'T' in supertype 'A'.
-// class B<T> implements A<F<T>> {
-//       ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:17:16: Error: Found unsupported uses of 'T' in supertype 'A'.
-// abstract class I<T> implements A<F<T>> {
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' in supertype 'B'.
-// abstract class C<T> extends B<F<T>> implements I<F<T>> {}
-//                ^
-//
-// pkg/front_end/testcases/interface_covariantInterface_from_class.dart:21:16: Error: Found unsupported uses of 'T' 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<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(generic-covariant-impl self::A::T x, core::int y) → 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 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 class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.legacy.expect b/pkg/front_end/testcases/invalid_assignment.dart.legacy.expect
deleted file mode 100644
index 8e7a4cb..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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 "";
-}
-static method test(core::int i, core::String s, self::A a) → dynamic {
-  i = 1;
-  i = s;
-  i.==(null) ? i = 1 : null;
-  i.==(null) ? i = s : null;
-  a = new self::A::•();
-  a = a.+(1);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.legacy.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.legacy.transformed.expect
deleted file mode 100644
index 8e7a4cb..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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 "";
-}
-static method test(core::int i, core::String s, self::A a) → dynamic {
-  i = 1;
-  i = s;
-  i.==(null) ? i = 1 : null;
-  i.==(null) ? i = s : null;
-  a = new self::A::•();
-  a = a.+(1);
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.outline.expect b/pkg/front_end/testcases/invalid_assignment.dart.outline.expect
deleted file mode 100644
index 2c6df27..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  operator +(core::int i) → core::String
-    ;
-}
-static method test(core::int i, core::String s, self::A a) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
deleted file mode 100644
index 32d40adc..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i = s;
-//       ^
-//
-// pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i ??= s;
-//         ^
-//
-// pkg/front_end/testcases/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/invalid_assignment.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
-//   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 "";
-}
-static method test(core::int i, core::String s, self::A a) → dynamic {
-  i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i = s;
-      ^" in s as{TypeError} core::int;
-  i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i ??= s;
-        ^" in s as{TypeError} core::int : null;
-  a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/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/invalid_assignment.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
-  a += 1;
-    ^" in a.{self::A::+}(1) as{TypeError} self::A;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
deleted file mode 100644
index 32d40adc..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.strong.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i = s;
-//       ^
-//
-// pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   i ??= s;
-//         ^
-//
-// pkg/front_end/testcases/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/invalid_assignment.dart'.
-// Try changing the type of the left hand side, or casting the right hand side to 'A'.
-//   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 "";
-}
-static method test(core::int i, core::String s, self::A a) → dynamic {
-  i = 1;
-  i = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:11:7: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i = s;
-      ^" in s as{TypeError} core::int;
-  i.{core::num::==}(null) ?{core::int} i = 1 : null;
-  i.{core::num::==}(null) ?{core::Object} i = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_assignment.dart:13:9: Error: A value of type 'String' can't be assigned to a variable of type 'int'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  i ??= s;
-        ^" in s as{TypeError} core::int : null;
-  a = new self::A::•();
-  a = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/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/invalid_assignment.dart'.
-Try changing the type of the left hand side, or casting the right hand side to 'A'.
-  a += 1;
-    ^" in a.{self::A::+}(1) as{TypeError} self::A;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect b/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect
deleted file mode 100644
index a7b9f5a..0000000
--- a/pkg/front_end/testcases/invalid_assignment.dart.type_promotion.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-pkg/front_end/testcases/invalid_assignment.dart:10:5: Context: Write to i@273
-  i = 1;
-    ^
-pkg/front_end/testcases/invalid_assignment.dart:11:5: Context: Write to i@273
-  i = s;
-    ^
-pkg/front_end/testcases/invalid_assignment.dart:12:5: Context: Write to i@273
-  i ??= 1;
-    ^^^
-pkg/front_end/testcases/invalid_assignment.dart:13:5: Context: Write to i@273
-  i ??= s;
-    ^^^
-pkg/front_end/testcases/invalid_assignment.dart:14:5: Context: Write to a@288
-  a = new A();
-    ^
-pkg/front_end/testcases/invalid_assignment.dart:15:5: Context: Write to a@288
-  a += 1;
-    ^^
diff --git a/pkg/front_end/testcases/invalid_cast.dart.legacy.expect b/pkg/front_end/testcases/invalid_cast.dart.legacy.expect
deleted file mode 100644
index 40b3d8c..0000000
--- a/pkg/front_end/testcases/invalid_cast.dart.legacy.expect
+++ /dev/null
@@ -1,56 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  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
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  static method staticFunction(core::int i) → void {}
-}
-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 = <core::Object>[];
-  core::Map<core::int, core::String> b = <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = <core::int, core::Object>{};
-  (core::Object) → core::int d = (core::int i) → dynamic => i;
-  self::D e = self::C::fact();
-  self::D f = new self::D::•();
-  self::D g = new self::C::nonFact();
-  self::D h = new self::C::nonFact2();
-  (core::Object) → void i = self::C::staticFunction;
-  (core::Object) → void j = self::topLevelFunction;
-  (core::Object) → void k = 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) → dynamic => i;
-  self::D e = self::C::fact();
-  self::D f = new self::D::•();
-  self::C g = new self::C::nonFact();
-  self::C h = new self::C::nonFact2();
-  (core::int) → void i = self::C::staticFunction;
-  (core::int) → void j = self::topLevelFunction;
-  (core::int) → void k = localFunction;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_cast.dart.legacy.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.legacy.transformed.expect
deleted file mode 100644
index 40b3d8c..0000000
--- a/pkg/front_end/testcases/invalid_cast.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,56 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  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
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  static method staticFunction(core::int i) → void {}
-}
-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 = <core::Object>[];
-  core::Map<core::int, core::String> b = <core::Object, core::String>{};
-  core::Map<core::int, core::String> c = <core::int, core::Object>{};
-  (core::Object) → core::int d = (core::int i) → dynamic => i;
-  self::D e = self::C::fact();
-  self::D f = new self::D::•();
-  self::D g = new self::C::nonFact();
-  self::D h = new self::C::nonFact2();
-  (core::Object) → void i = self::C::staticFunction;
-  (core::Object) → void j = self::topLevelFunction;
-  (core::Object) → void k = 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) → dynamic => i;
-  self::D e = self::C::fact();
-  self::D f = new self::D::•();
-  self::C g = new self::C::nonFact();
-  self::C h = new self::C::nonFact2();
-  (core::int) → void i = self::C::staticFunction;
-  (core::int) → void j = self::topLevelFunction;
-  (core::int) → void k = localFunction;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_cast.dart.outline.expect b/pkg/front_end/testcases/invalid_cast.dart.outline.expect
deleted file mode 100644
index 52698ef..0000000
--- a/pkg/front_end/testcases/invalid_cast.dart.outline.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  constructor •() → self::C
-    ;
-  constructor nonFact() → self::C
-    ;
-  constructor nonFact2() → self::C
-    ;
-  static factory fact() → self::C
-    ;
-  static factory fact2() → self::C
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  static method staticFunction(core::int i) → void
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-}
-static method topLevelFunction(core::int i) → void
-  ;
-static method bad() → dynamic
-  ;
-static method ok() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.expect
deleted file mode 100644
index f9329e5..0000000
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_cast.dart:20: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/invalid_cast.dart:21: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/invalid_cast.dart:22: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/invalid_cast.dart:23: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/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
-//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
-//  - 'D' is from 'pkg/front_end/testcases/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/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
-//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
-//  - 'D' is from 'pkg/front_end/testcases/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/invalid_cast.dart:28: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/invalid_cast.dart:29: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/invalid_cast.dart:30: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 field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  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
-    let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  static method staticFunction(core::int i) → void {}
-}
-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 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:20: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 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:21: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 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22: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 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23: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 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
- - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
- - 'D' is from 'pkg/front_end/testcases/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 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
- - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
- - 'D' is from 'pkg/front_end/testcases/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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28: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 self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29: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 self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:30: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 = self::C::staticFunction;
-  (core::int) → void j = self::topLevelFunction;
-  (core::int) → void k = localFunction;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect b/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
deleted file mode 100644
index 6e9e1eb..0000000
--- a/pkg/front_end/testcases/invalid_cast.dart.strong.transformed.expect
+++ /dev/null
@@ -1,159 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_cast.dart:20: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/invalid_cast.dart:21: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/invalid_cast.dart:22: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/invalid_cast.dart:23: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/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
-//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
-//  - 'D' is from 'pkg/front_end/testcases/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/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
-//  - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
-//  - 'D' is from 'pkg/front_end/testcases/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/invalid_cast.dart:28: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/invalid_cast.dart:29: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/invalid_cast.dart:30: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 field dynamic _redirecting# = <dynamic>[self::C::fact2];
-  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
-    let<BottomType> #redirecting_factory = self::D::• in invalid-expression;
-  static method staticFunction(core::int i) → void {}
-}
-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 = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:20: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 = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:21: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 = let final<BottomType> #t3 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:22: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 = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:23: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 = let final<BottomType> #t5 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:26:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
- - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
- - 'D' is from 'pkg/front_end/testcases/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 = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:27:13: Error: The constructor returns type 'C' that isn't of expected type 'D'.
- - 'C' is from 'pkg/front_end/testcases/invalid_cast.dart'.
- - 'D' is from 'pkg/front_end/testcases/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 = let final<BottomType> #t7 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:28: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 self::C::staticFunction;
-  (core::Object) → void j = let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:29: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 self::topLevelFunction;
-  (core::Object) → void k = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/invalid_cast.dart:30: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 = self::C::staticFunction;
-  (core::int) → void j = self::topLevelFunction;
-  (core::int) → void k = localFunction;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_type.dart.legacy.expect b/pkg/front_end/testcases/invalid_type.dart.legacy.expect
deleted file mode 100644
index 06c896f..0000000
--- a/pkg/front_end/testcases/invalid_type.dart.legacy.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-//     this.bar();
-//     ^^^^
-//
-// pkg/front_end/testcases/invalid_type.dart:12:12: Warning: 'Missing' isn't a type.
-//   (null as Missing).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/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-    this.bar();
-    ^^^^".bar();
-  }
-}
-static method test() → dynamic {
-  (null as invalid-type).bar();
-  null.bar();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/invalid_type.dart.legacy.transformed.expect
deleted file mode 100644
index 06c896f..0000000
--- a/pkg/front_end/testcases/invalid_type.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-//     this.bar();
-//     ^^^^
-//
-// pkg/front_end/testcases/invalid_type.dart:12:12: Warning: 'Missing' isn't a type.
-//   (null as Missing).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/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-    this.bar();
-    ^^^^".bar();
-  }
-}
-static method test() → dynamic {
-  (null as invalid-type).bar();
-  null.bar();
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invalid_type.dart.outline.expect b/pkg/front_end/testcases/invalid_type.dart.outline.expect
deleted file mode 100644
index e951144..0000000
--- a/pkg/front_end/testcases/invalid_type.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  static method foo() → dynamic
-    ;
-}
-static method test() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/invalid_type.dart.strong.expect b/pkg/front_end/testcases/invalid_type.dart.strong.expect
deleted file mode 100644
index f26928f..0000000
--- a/pkg/front_end/testcases/invalid_type.dart.strong.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-//     this.bar();
-//     ^^^^
-//
-// pkg/front_end/testcases/invalid_type.dart:12:12: Error: 'Missing' isn't a type.
-//   (null as Missing).bar();
-//            ^^^^^^^
-//
-// pkg/front_end/testcases/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/invalid_type.dart:7:5: Error: Expected identifier, but got 'this'.
-    this.bar();
-    ^^^^".bar();
-  }
-}
-static method test() → dynamic {
-  (null as invalid-type).bar();
-  invalid-expression "pkg/front_end/testcases/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();
-       ^^^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/invocations.dart.strong.expect b/pkg/front_end/testcases/invocations.dart.strong.expect
deleted file mode 100644
index ee55950..0000000
--- a/pkg/front_end/testcases/invocations.dart.strong.expect
+++ /dev/null
@@ -1,69 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invocations.dart:7:3: Error: Method not found: 'z'.
-//   z("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
-//   z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
-//   y.z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
-//   x.y.z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
-//       z("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
-//       z.print("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
-//       y.z.print("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
-//       x.y.z.print("Hello, World!");
-//       ^
-//
-// pkg/front_end/testcases/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/invocations.dart:7:3: Error: Method not found: 'z'.
-  z(\"Hello, World!\");
-  ^";
-  invalid-expression "pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
-  z.print(\"Hello, World!\");
-  ^".print("Hello, World!");
-  invalid-expression "pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
-  y.z.print(\"Hello, World!\");
-  ^".z.print("Hello, World!");
-  invalid-expression "pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
-  x.y.z.print(\"Hello, World!\");
-  ^".y.z.print("Hello, World!");
-  1.{core::num::+}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
-      z(\"Hello, World!\") +
-      ^" as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
-      z.print(\"Hello, World!\") +
-      ^".print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
-      y.z.print(\"Hello, World!\") +
-      ^".z.print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
-      x.y.z.print(\"Hello, World!\");
-      ^".y.z.print("Hello, World!") as{TypeError} core::num);
-}
diff --git a/pkg/front_end/testcases/invocations.dart.strong.transformed.expect b/pkg/front_end/testcases/invocations.dart.strong.transformed.expect
deleted file mode 100644
index ee55950..0000000
--- a/pkg/front_end/testcases/invocations.dart.strong.transformed.expect
+++ /dev/null
@@ -1,69 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/invocations.dart:7:3: Error: Method not found: 'z'.
-//   z("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
-//   z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
-//   y.z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
-//   x.y.z.print("Hello, World!");
-//   ^
-//
-// pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
-//       z("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
-//       z.print("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
-//       y.z.print("Hello, World!") +
-//       ^
-//
-// pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
-//       x.y.z.print("Hello, World!");
-//       ^
-//
-// pkg/front_end/testcases/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/invocations.dart:7:3: Error: Method not found: 'z'.
-  z(\"Hello, World!\");
-  ^";
-  invalid-expression "pkg/front_end/testcases/invocations.dart:8:3: Error: Getter not found: 'z'.
-  z.print(\"Hello, World!\");
-  ^".print("Hello, World!");
-  invalid-expression "pkg/front_end/testcases/invocations.dart:9:3: Error: Getter not found: 'y'.
-  y.z.print(\"Hello, World!\");
-  ^".z.print("Hello, World!");
-  invalid-expression "pkg/front_end/testcases/invocations.dart:10:3: Error: Getter not found: 'x'.
-  x.y.z.print(\"Hello, World!\");
-  ^".y.z.print("Hello, World!");
-  1.{core::num::+}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:14:7: Error: Method not found: 'z'.
-      z(\"Hello, World!\") +
-      ^" as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:15:7: Error: Getter not found: 'z'.
-      z.print(\"Hello, World!\") +
-      ^".print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:16:7: Error: Getter not found: 'y'.
-      y.z.print(\"Hello, World!\") +
-      ^".z.print("Hello, World!") as{TypeError} core::num).{core::num::+}(invalid-expression "pkg/front_end/testcases/invocations.dart:17:7: Error: Getter not found: 'x'.
-      x.y.z.print(\"Hello, World!\");
-      ^".y.z.print("Hello, World!") as{TypeError} core::num);
-}
diff --git a/pkg/front_end/testcases/issue129167943.dart.legacy.expect b/pkg/front_end/testcases/issue129167943.dart.legacy.expect
deleted file mode 100644
index 5e60b76..0000000
--- a/pkg/front_end/testcases/issue129167943.dart.legacy.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-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 {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo(core::num x) → void;
-}
-abstract class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D1 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D1
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-class D2 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D2
-    : super core::Object::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-abstract class D3 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub method foo(covariant 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 core::int x) → void;
-}
-abstract class D5 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D5
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::num x) → void;
-}
-abstract class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-  abstract set foo(core::num x) → void;
-}
-abstract class G extends core::Object implements self::E {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H1 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H1
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-class H2 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H2
-    : super core::Object::•()
-    ;
-  set foo(covariant core::int x) → void {}
-}
-abstract class H3 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub set foo(covariant 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 core::int x) → void;
-}
-abstract class H5 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H5
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::num x) → void;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue129167943.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue129167943.dart.legacy.transformed.expect
deleted file mode 100644
index 5e60b76..0000000
--- a/pkg/front_end/testcases/issue129167943.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-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 {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo(core::num x) → void;
-}
-abstract class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D1 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D1
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-class D2 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D2
-    : super core::Object::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-abstract class D3 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub method foo(covariant 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 core::int x) → void;
-}
-abstract class D5 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D5
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::num x) → void;
-}
-abstract class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-  abstract set foo(core::num x) → void;
-}
-abstract class G extends core::Object implements self::E {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H1 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H1
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-class H2 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H2
-    : super core::Object::•()
-    ;
-  set foo(covariant core::int x) → void {}
-}
-abstract class H3 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub set foo(covariant 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 core::int x) → void;
-}
-abstract class H5 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H5
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::num x) → void;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue129167943.dart.outline.expect b/pkg/front_end/testcases/issue129167943.dart.outline.expect
deleted file mode 100644
index f6d1af6..0000000
--- a/pkg/front_end/testcases/issue129167943.dart.outline.expect
+++ /dev/null
@@ -1,82 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-abstract class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  abstract method foo(core::num x) → void;
-}
-abstract class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D1 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D1
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-class D2 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D2
-    ;
-  method foo(covariant core::int x) → void
-    ;
-}
-abstract class D3 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D3
-    ;
-  abstract forwarding-stub method foo(covariant core::num x) → void;
-}
-abstract class D4 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D4
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D5 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D5
-    ;
-  abstract method foo(covariant core::num x) → void;
-}
-abstract class E extends core::Object {
-  synthetic constructor •() → self::E
-    ;
-  abstract set foo(core::num x) → void;
-}
-abstract class G extends core::Object implements self::E {
-  synthetic constructor •() → self::G
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H1 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H1
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-class H2 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H2
-    ;
-  set foo(covariant core::int x) → void
-    ;
-}
-abstract class H3 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H3
-    ;
-  abstract forwarding-stub set foo(covariant core::num x) → void;
-}
-abstract class H4 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H4
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H5 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H5
-    ;
-  abstract set foo(covariant core::num x) → void;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/issue129167943.dart.strong.expect b/pkg/front_end/testcases/issue129167943.dart.strong.expect
deleted file mode 100644
index 5e60b76..0000000
--- a/pkg/front_end/testcases/issue129167943.dart.strong.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-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 {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo(core::num x) → void;
-}
-abstract class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D1 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D1
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-class D2 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D2
-    : super core::Object::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-abstract class D3 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub method foo(covariant 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 core::int x) → void;
-}
-abstract class D5 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D5
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::num x) → void;
-}
-abstract class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-  abstract set foo(core::num x) → void;
-}
-abstract class G extends core::Object implements self::E {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H1 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H1
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-class H2 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H2
-    : super core::Object::•()
-    ;
-  set foo(covariant core::int x) → void {}
-}
-abstract class H3 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub set foo(covariant 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 core::int x) → void;
-}
-abstract class H5 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H5
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::num x) → void;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue129167943.dart.strong.transformed.expect b/pkg/front_end/testcases/issue129167943.dart.strong.transformed.expect
deleted file mode 100644
index 5e60b76..0000000
--- a/pkg/front_end/testcases/issue129167943.dart.strong.transformed.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-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 {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-  abstract method foo(core::num x) → void;
-}
-abstract class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-abstract class D1 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D1
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::int x) → void;
-}
-class D2 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D2
-    : super core::Object::•()
-    ;
-  method foo(covariant core::int x) → void {}
-}
-abstract class D3 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub method foo(covariant 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 core::int x) → void;
-}
-abstract class D5 extends core::Object implements self::A, self::C, self::B {
-  synthetic constructor •() → self::D5
-    : super core::Object::•()
-    ;
-  abstract method foo(covariant core::num x) → void;
-}
-abstract class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-  abstract set foo(core::num x) → void;
-}
-abstract class G extends core::Object implements self::E {
-  synthetic constructor •() → self::G
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-abstract class H1 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H1
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::int x) → void;
-}
-class H2 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H2
-    : super core::Object::•()
-    ;
-  set foo(covariant core::int x) → void {}
-}
-abstract class H3 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H3
-    : super core::Object::•()
-    ;
-  abstract forwarding-stub set foo(covariant 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 core::int x) → void;
-}
-abstract class H5 extends core::Object implements self::A, self::E, self::G {
-  synthetic constructor •() → self::H5
-    : super core::Object::•()
-    ;
-  abstract set foo(covariant core::num x) → void;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue34515.dart.legacy.expect b/pkg/front_end/testcases/issue34515.dart.legacy.expect
deleted file mode 100644
index 528e442..0000000
--- a/pkg/front_end/testcases/issue34515.dart.legacy.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue34515.dart:9:3: Warning: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-//   ImportedClass(1);
-//   ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/issue34515.dart:10:3: Warning: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-  ImportedClass(1);
-  ^^^^^^^^^^^^^";
-  let final core::Object #t2 = "a" in invalid-expression "pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class ImportedClass extends core::Object {
-  constructor •(core::String a) → self3::ImportedClass
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/issue34515.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue34515.dart.legacy.transformed.expect
deleted file mode 100644
index 528e442..0000000
--- a/pkg/front_end/testcases/issue34515.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue34515.dart:9:3: Warning: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-//   ImportedClass(1);
-//   ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/issue34515.dart:10:3: Warning: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-  ImportedClass(1);
-  ^^^^^^^^^^^^^";
-  let final core::Object #t2 = "a" in invalid-expression "pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class ImportedClass extends core::Object {
-  constructor •(core::String a) → self3::ImportedClass
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/issue34515.dart.outline.expect b/pkg/front_end/testcases/issue34515.dart.outline.expect
deleted file mode 100644
index 1c038cb..0000000
--- a/pkg/front_end/testcases/issue34515.dart.outline.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-import self as self;
-
-import "org-dartlang-testcase:///issue34515_lib1.dart";
-import "org-dartlang-testcase:///issue34515_lib2.dart";
-
-static method test() → void
-  ;
-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
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class ImportedClass extends core::Object {
-  constructor •(core::String a) → self3::ImportedClass
-    ;
-}
diff --git a/pkg/front_end/testcases/issue34515.dart.strong.expect b/pkg/front_end/testcases/issue34515.dart.strong.expect
deleted file mode 100644
index d8a23b4..0000000
--- a/pkg/front_end/testcases/issue34515.dart.strong.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-//   ImportedClass(1);
-//   ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-  ImportedClass(1);
-  ^^^^^^^^^^^^^";
-  let final core::Object #t2 = "a" in invalid-expression "pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class ImportedClass extends core::Object {
-  constructor •(core::String a) → self3::ImportedClass
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/issue34515.dart.strong.transformed.expect b/pkg/front_end/testcases/issue34515.dart.strong.transformed.expect
deleted file mode 100644
index d8a23b4..0000000
--- a/pkg/front_end/testcases/issue34515.dart.strong.transformed.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-//   ImportedClass(1);
-//   ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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/issue34515.dart:9:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/issue34515_lib2.dart'.
-  ImportedClass(1);
-  ^^^^^^^^^^^^^";
-  let final core::Object #t2 = "a" in invalid-expression "pkg/front_end/testcases/issue34515.dart:10:3: Error: 'ImportedClass' is imported from both 'pkg/front_end/testcases/issue34515_lib1.dart' and 'pkg/front_end/testcases/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::•()
-    ;
-}
-
-library;
-import self as self3;
-import "dart:core" as core;
-
-class ImportedClass extends core::Object {
-  constructor •(core::String a) → self3::ImportedClass
-    : super core::Object::•()
-    ;
-}
diff --git a/pkg/front_end/testcases/issue34899.dart.legacy.expect b/pkg/front_end/testcases/issue34899.dart.legacy.expect
deleted file mode 100644
index e7b5b76..0000000
--- a/pkg/front_end/testcases/issue34899.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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;
-  generic-covariant-impl 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.quux().then<self::Foo::T>((dynamic _) → dynamic => this.{self::Foo::t});
-}
-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.qux().then((dynamic baz) → dynamic => this.{self::Bar::corge}(baz)).then((dynamic grault) → dynamic => this.{self::Bar::garply}(grault));
-  method corge(self::Baz baz) → self::Grault
-    return null;
-  method garply(self::Grault grault) → void {}
-}
-class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
-    : super core::Object::•()
-    ;
-}
-class Grault extends core::Object {
-  synthetic constructor •() → self::Grault
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue34899.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue34899.dart.legacy.transformed.expect
deleted file mode 100644
index e7b5b76..0000000
--- a/pkg/front_end/testcases/issue34899.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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;
-  generic-covariant-impl 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.quux().then<self::Foo::T>((dynamic _) → dynamic => this.{self::Foo::t});
-}
-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.qux().then((dynamic baz) → dynamic => this.{self::Bar::corge}(baz)).then((dynamic grault) → dynamic => this.{self::Bar::garply}(grault));
-  method corge(self::Baz baz) → self::Grault
-    return null;
-  method garply(self::Grault grault) → void {}
-}
-class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
-    : super core::Object::•()
-    ;
-}
-class Grault extends core::Object {
-  synthetic constructor •() → self::Grault
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue34899.dart.outline.expect b/pkg/front_end/testcases/issue34899.dart.outline.expect
deleted file mode 100644
index 48da0fa..0000000
--- a/pkg/front_end/testcases/issue34899.dart.outline.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-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;
-  generic-covariant-impl field self::Foo::T t;
-  constructor •(() → asy::Future<dynamic> quux, self::Foo::T t) → self::Foo<self::Foo::T>
-    ;
-  method call() → asy::Future<self::Foo::T>
-    ;
-}
-class Bar extends core::Object {
-  field self::Foo<self::Baz> qux;
-  synthetic constructor •() → self::Bar
-    ;
-  method quuz() → asy::Future<void>
-    ;
-  method corge(self::Baz baz) → self::Grault
-    ;
-  method garply(self::Grault grault) → void
-    ;
-}
-class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
-    ;
-}
-class Grault extends core::Object {
-  synthetic constructor •() → self::Grault
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/issue34899.dart.strong.expect b/pkg/front_end/testcases/issue34899.dart.strong.expect
deleted file mode 100644
index 67daf6b..0000000
--- a/pkg/front_end/testcases/issue34899.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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;
-  generic-covariant-impl 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::then}<self::Foo::T>((dynamic _) → self::Foo::T => this.{self::Foo::t});
-}
-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}().{asy::Future::then}<self::Grault>((self::Baz baz) → self::Grault => this.{self::Bar::corge}(baz)).{asy::Future::then}<void>((self::Grault grault) → void => this.{self::Bar::garply}(grault));
-  method corge(self::Baz baz) → self::Grault
-    return null;
-  method garply(self::Grault grault) → void {}
-}
-class Baz extends core::Object {
-  synthetic constructor •() → self::Baz
-    : super core::Object::•()
-    ;
-}
-class Grault extends core::Object {
-  synthetic constructor •() → self::Grault
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue35875.dart.legacy.expect b/pkg/front_end/testcases/issue35875.dart.legacy.expect
deleted file mode 100644
index ee54528..0000000
--- a/pkg/front_end/testcases/issue35875.dart.legacy.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue35875.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue35875.dart.legacy.transformed.expect
deleted file mode 100644
index ee54528..0000000
--- a/pkg/front_end/testcases/issue35875.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue35875.dart.outline.expect b/pkg/front_end/testcases/issue35875.dart.outline.expect
deleted file mode 100644
index 305f440..0000000
--- a/pkg/front_end/testcases/issue35875.dart.outline.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  field core::int a;
-  constructor •(core::int a) → self::A
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/issue35875.dart.strong.expect b/pkg/front_end/testcases/issue35875.dart.strong.expect
deleted file mode 100644
index ee54528..0000000
--- a/pkg/front_end/testcases/issue35875.dart.strong.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue35875.dart.strong.transformed.expect b/pkg/front_end/testcases/issue35875.dart.strong.transformed.expect
deleted file mode 100644
index ee54528..0000000
--- a/pkg/front_end/testcases/issue35875.dart.strong.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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;
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37027.dart.legacy.expect b/pkg/front_end/testcases/issue37027.dart.legacy.expect
deleted file mode 100644
index 653b194..0000000
--- a/pkg/front_end/testcases/issue37027.dart.legacy.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue37027.dart:6:46: Error: Unexpected token 'if'.
-//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
-//                                              ^^
-//
-// pkg/front_end/testcases/issue37027.dart:6:27: Error: Unexpected token 'for'.
-//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
-//                           ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  final field core::Set<core::int> s;
-  constructor •(core::List<core::int> ell) → self::C
-    : self::C::s = <dynamic, dynamic>{}, super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37027.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue37027.dart.legacy.transformed.expect
deleted file mode 100644
index 653b194..0000000
--- a/pkg/front_end/testcases/issue37027.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/issue37027.dart:6:46: Error: Unexpected token 'if'.
-//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
-//                                              ^^
-//
-// pkg/front_end/testcases/issue37027.dart:6:27: Error: Unexpected token 'for'.
-//   C(List<int> ell) : s = {for (var e in ell) if (e.isOdd) 2 * e};
-//                           ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  final field core::Set<core::int> s;
-  constructor •(core::List<core::int> ell) → self::C
-    : self::C::s = <dynamic, dynamic>{}, super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37027.dart.outline.expect b/pkg/front_end/testcases/issue37027.dart.outline.expect
deleted file mode 100644
index dc4999b..0000000
--- a/pkg/front_end/testcases/issue37027.dart.outline.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  final field core::Set<core::int> s;
-  constructor •(core::List<core::int> ell) → self::C
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/issue37027.dart.strong.expect b/pkg/front_end/testcases/issue37027.dart.strong.expect
deleted file mode 100644
index 2387135..0000000
--- a/pkg/front_end/testcases/issue37027.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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})
-          #t1.{core::Set::add}(2.{core::num::*}(e));
-    } =>#t1, super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37027.dart.strong.transformed.expect b/pkg/front_end/testcases/issue37027.dart.strong.transformed.expect
deleted file mode 100644
index 2387135..0000000
--- a/pkg/front_end/testcases/issue37027.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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})
-          #t1.{core::Set::add}(2.{core::num::*}(e));
-    } =>#t1, super core::Object::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/issue37381.dart.legacy.expect b/pkg/front_end/testcases/issue37381.dart.legacy.expect
deleted file mode 100644
index 13d9878..0000000
--- a/pkg/front_end/testcases/issue37381.dart.legacy.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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.call<self::A::X>(this);
-}
-static method main() → dynamic {
-  self::A<core::num> a = new self::A::•<core::int>();
-  a.f(<X extends core::Object = dynamic>(dynamic _) → dynamic => 42);
-}
diff --git a/pkg/front_end/testcases/issue37381.dart.legacy.transformed.expect b/pkg/front_end/testcases/issue37381.dart.legacy.transformed.expect
deleted file mode 100644
index 13d9878..0000000
--- a/pkg/front_end/testcases/issue37381.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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.call<self::A::X>(this);
-}
-static method main() → dynamic {
-  self::A<core::num> a = new self::A::•<core::int>();
-  a.f(<X extends core::Object = dynamic>(dynamic _) → dynamic => 42);
-}
diff --git a/pkg/front_end/testcases/issue37381.dart.outline.expect b/pkg/front_end/testcases/issue37381.dart.outline.expect
deleted file mode 100644
index 74b9165..0000000
--- a/pkg/front_end/testcases/issue37381.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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>
-    ;
-  method f<R extends core::Object = dynamic>(<X extends core::Object = dynamic>(self::A<X>) → self::A::f::R f) → self::A::f::R
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/issue37381.dart.strong.expect b/pkg/front_end/testcases/issue37381.dart.strong.expect
deleted file mode 100644
index 4aa8cae..0000000
--- a/pkg/front_end/testcases/issue37381.dart.strong.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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.call<self::A::X>(this);
-}
-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);
-}
diff --git a/pkg/front_end/testcases/issue37381.dart.strong.transformed.expect b/pkg/front_end/testcases/issue37381.dart.strong.transformed.expect
deleted file mode 100644
index 4aa8cae..0000000
--- a/pkg/front_end/testcases/issue37381.dart.strong.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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.call<self::A::X>(this);
-}
-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);
-}
diff --git a/pkg/front_end/testcases/legacy.status b/pkg/front_end/testcases/legacy.status
index 45b13a3..1a8f9a3 100644
--- a/pkg/front_end/testcases/legacy.status
+++ b/pkg/front_end/testcases/legacy.status
@@ -5,20 +5,42 @@
 # Status file for the legacy_test.dart test suite. This is testing generating
 # Kernel ASTs in legacy mode (Dart 1.0).
 
-DeltaBlue: Fail # Fasta and dartk disagree on static initializers
-ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-await_in_non_async: RuntimeError # Expected.
-bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
-call: Fail # Test can't run.
-constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
-constructor_initializer_invalid: RuntimeError # Fails execution after recovery
-control_flow_collection: RuntimeError
-duplicated_field_initializer: RuntimeError
-extension_methods: RuntimeError
-external_import: RuntimeError # Expected -- test uses import which doesn't exist.
-fallthrough: Fail # Missing FallThroughError.
-function_type_recovery: Fail
-incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
+general/DeltaBlue: Fail # Fasta and dartk disagree on static initializers
+general/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
+general/await_in_non_async: RuntimeError # Expected.
+general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
+general/bug37476: RuntimeError # Expected.
+general/call: Fail # Test can't run.
+general/constructor_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
+general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
+general/control_flow_collection: RuntimeError
+general/duplicated_field_initializer: RuntimeError
+general/extension_methods: RuntimeError
+general/external_import: RuntimeError # Expected -- test uses import which doesn't exist.
+general/fallthrough: Fail # Missing FallThroughError.
+general/function_type_recovery: Fail
+general/incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
+general/invocations: Fail
+general/micro: Fail # External method marked abstract.
+general/minimum_int: Crash # Min int literal not supported in non-strong mode.
+general/mixin_constructors_with_default_values: RuntimeError # Expected
+general/named_parameters: Fail # Missing types and unnecessary default values.
+general/non_covariant_checks: RuntimeError # Expected
+general/operator_method_not_found: RuntimeError # Expected
+general/optional: Fail # Unnecessary default values.
+general/redirecting_factory: Fail # Missing types on constructor parameters.
+general/redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
+general/redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/reject_generic_function_types_in_bounds: RuntimeError # Expected
+general/spread_collection: RuntimeError
+general/type_parameter_type_named_int: RuntimeError # Expected
+general/type_variable_as_super: Fail
+general/uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
+general/void_methods: Fail # Bad return from setters.
 inference/bug31436: RuntimeError # Test exercises Dart 2.0 semantics
 inference/constructors_too_many_positional_arguments: Fail
 inference/downwards_inference_annotations_locals: Fail # Issue #30031
@@ -35,13 +57,7 @@
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # May be related to Issue 33479
 instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
 instantiate_to_bound/typedef_super_bounded_type: Fail # Issue 33444
-invocations: Fail
-micro: Fail # External method marked abstract.
-minimum_int: Crash # Min int literal not supported in non-strong mode.
-named_parameters: Fail # Missing types and unnecessary default values.
 nnbd/nullable_param: RuntimeError
-operator_method_not_found: RuntimeError # Expected
-optional: Fail # Unnecessary default values.
 rasta/abstract_constructor: Fail
 rasta/bad_constructor_redirection: Fail
 rasta/bad_continue: Fail
@@ -96,13 +112,6 @@
 rasta/unresolved_constructor: Fail
 rasta/unresolved_for_in: RuntimeError # Test contains a compile-time error, signaled at run time in the JIT VM
 rasta/unresolved_recovery: Fail
-redirecting_factory: Fail # Missing types on constructor parameters.
-redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_const_inference: RuntimeError # Test exercises strong mode semantics.  See also Issue #33813.
-redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
 regress/issue_29975: Fail # Issue 29975.
 regress/issue_29976: RuntimeError # Tests runtime behavior of error recovery.
 regress/issue_29982: RuntimeError # Tests runtime behavior of error recovery.
@@ -122,7 +131,6 @@
 regress/issue_36647_2: RuntimeError # Expected
 regress/issue_36669: RuntimeError
 regress/issue_37285: RuntimeError
-reject_generic_function_types_in_bounds: RuntimeError # Expected
 runtime_checks/implicit_downcast_constructor_initializer: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_do: RuntimeError # Test exercises strong mode semantics
 runtime_checks/implicit_downcast_for_condition: RuntimeError # Test exercises strong mode semantics
@@ -136,8 +144,3 @@
 runtime_checks_new/mixin_forwarding_stub_setter: RuntimeError # Test exercises strong mode semantics
 runtime_checks_new/stub_checked_via_target: RuntimeError # Test exercises strong mode semantics
 set_literals/disambiguation_rule: RuntimeError
-spread_collection: RuntimeError
-type_parameter_type_named_int: RuntimeError # Expected
-type_variable_as_super: Fail
-uninitialized_fields: Fail # Fasta and dartk disagree on static initializers
-void_methods: Fail # Bad return from setters.
diff --git a/pkg/front_end/testcases/literals.dart.legacy.expect b/pkg/front_end/testcases/literals.dart.legacy.expect
deleted file mode 100644
index bd49a1d..0000000
--- a/pkg/front_end/testcases/literals.dart.legacy.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-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(<dynamic>["a", "b"]);
-}
-static method testMap() → dynamic {
-  core::print(<dynamic, dynamic>{});
-  core::print(<dynamic, dynamic>{"a": "b"});
-}
-static method testSymbol() → dynamic {
-  core::print(#fisk);
-  core::print(#_fisk);
-  core::print(#fisk.hest.ko);
-}
-static method main() → dynamic {
-  self::testString();
-  self::testInt();
-  self::testBool();
-  self::testDouble();
-  self::testNull();
-  self::testList();
-  self::testMap();
-  self::testSymbol();
-}
diff --git a/pkg/front_end/testcases/literals.dart.legacy.transformed.expect b/pkg/front_end/testcases/literals.dart.legacy.transformed.expect
deleted file mode 100644
index bd49a1d..0000000
--- a/pkg/front_end/testcases/literals.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-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(<dynamic>["a", "b"]);
-}
-static method testMap() → dynamic {
-  core::print(<dynamic, dynamic>{});
-  core::print(<dynamic, dynamic>{"a": "b"});
-}
-static method testSymbol() → dynamic {
-  core::print(#fisk);
-  core::print(#_fisk);
-  core::print(#fisk.hest.ko);
-}
-static method main() → dynamic {
-  self::testString();
-  self::testInt();
-  self::testBool();
-  self::testDouble();
-  self::testNull();
-  self::testList();
-  self::testMap();
-  self::testSymbol();
-}
diff --git a/pkg/front_end/testcases/literals.dart.strong.expect b/pkg/front_end/testcases/literals.dart.strong.expect
deleted file mode 100644
index 8fa18be..0000000
--- a/pkg/front_end/testcases/literals.dart.strong.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-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(#fisk);
-  core::print(#_fisk);
-  core::print(#fisk.hest.ko);
-}
-static method main() → dynamic {
-  self::testString();
-  self::testInt();
-  self::testBool();
-  self::testDouble();
-  self::testNull();
-  self::testList();
-  self::testMap();
-  self::testSymbol();
-}
diff --git a/pkg/front_end/testcases/literals.dart.strong.transformed.expect b/pkg/front_end/testcases/literals.dart.strong.transformed.expect
deleted file mode 100644
index 8fa18be..0000000
--- a/pkg/front_end/testcases/literals.dart.strong.transformed.expect
+++ /dev/null
@@ -1,43 +0,0 @@
-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(#fisk);
-  core::print(#_fisk);
-  core::print(#fisk.hest.ko);
-}
-static method main() → dynamic {
-  self::testString();
-  self::testInt();
-  self::testBool();
-  self::testDouble();
-  self::testNull();
-  self::testList();
-  self::testMap();
-  self::testSymbol();
-}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.legacy.expect b/pkg/front_end/testcases/local_generic_function.dart.legacy.expect
deleted file mode 100644
index 26709f0..0000000
--- a/pkg/front_end/testcases/local_generic_function.dart.legacy.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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.[](0);
-  dynamic x = f.call(<dynamic>[0]);
-}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.legacy.transformed.expect b/pkg/front_end/testcases/local_generic_function.dart.legacy.transformed.expect
deleted file mode 100644
index 26709f0..0000000
--- a/pkg/front_end/testcases/local_generic_function.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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.[](0);
-  dynamic x = f.call(<dynamic>[0]);
-}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.strong.expect b/pkg/front_end/testcases/local_generic_function.dart.strong.expect
deleted file mode 100644
index f3d3e87..0000000
--- a/pkg/front_end/testcases/local_generic_function.dart.strong.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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 x = f.call<core::int>(<core::int>[0]);
-}
diff --git a/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect b/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect
deleted file mode 100644
index f3d3e87..0000000
--- a/pkg/front_end/testcases/local_generic_function.dart.strong.transformed.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-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 x = f.call<core::int>(<core::int>[0]);
-}
diff --git a/pkg/front_end/testcases/magic_const.dart.legacy.expect b/pkg/front_end/testcases/magic_const.dart.legacy.expect
deleted file mode 100644
index 3b3544f..0000000
--- a/pkg/front_end/testcases/magic_const.dart.legacy.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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();
-//         ^^^^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class Constant extends core::Object {
-  const constructor •() → self::Constant
-    : super core::Object::•()
-    ;
-}
-class NotConstant extends core::Object {
-  synthetic constructor •() → self::NotConstant
-    : super core::Object::•()
-    ;
-}
-static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/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::•();
-  const dynamic x = const self::Constant::•();
-  core::bool::fromEnvironment("fisk");
-  const dynamic b = const core::bool::fromEnvironment("fisk");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect b/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
deleted file mode 100644
index 3b3544f..0000000
--- a/pkg/front_end/testcases/magic_const.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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();
-//         ^^^^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class Constant extends core::Object {
-  const constructor •() → self::Constant
-    : super core::Object::•()
-    ;
-}
-class NotConstant extends core::Object {
-  synthetic constructor •() → self::NotConstant
-    : super core::Object::•()
-    ;
-}
-static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/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::•();
-  const dynamic x = const self::Constant::•();
-  core::bool::fromEnvironment("fisk");
-  const dynamic b = const core::bool::fromEnvironment("fisk");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/magic_const.dart.outline.expect b/pkg/front_end/testcases/magic_const.dart.outline.expect
deleted file mode 100644
index cd5d302..0000000
--- a/pkg/front_end/testcases/magic_const.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Constant extends core::Object {
-  const constructor •() → self::Constant
-    ;
-}
-class NotConstant extends core::Object {
-  synthetic constructor •() → self::NotConstant
-    ;
-}
-static method foo({dynamic a, dynamic b, dynamic c}) → dynamic
-  ;
-static method test() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.expect b/pkg/front_end/testcases/magic_const.dart.strong.expect
deleted file mode 100644
index 8bd3e19..0000000
--- a/pkg/front_end/testcases/magic_const.dart.strong.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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();
-//         ^^^^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class Constant extends core::Object {
-  const constructor •() → self::Constant
-    : super core::Object::•()
-    ;
-}
-class NotConstant extends core::Object {
-  synthetic constructor •() → self::NotConstant
-    : super core::Object::•()
-    ;
-}
-static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/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::•();
-  const self::Constant x = const self::Constant::•();
-  core::bool::fromEnvironment("fisk");
-  const core::bool b = const core::bool::fromEnvironment("fisk");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect b/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
deleted file mode 100644
index 8bd3e19..0000000
--- a/pkg/front_end/testcases/magic_const.dart.strong.transformed.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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();
-//         ^^^^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class Constant extends core::Object {
-  const constructor •() → self::Constant
-    : super core::Object::•()
-    ;
-}
-class NotConstant extends core::Object {
-  synthetic constructor •() → self::NotConstant
-    : super core::Object::•()
-    ;
-}
-static method foo({dynamic a = const self::Constant::•(), dynamic b = const self::Constant::•(), dynamic c = <dynamic>[]}) → dynamic {}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/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::•();
-  const self::Constant x = const self::Constant::•();
-  core::bool::fromEnvironment("fisk");
-  const core::bool b = const core::bool::fromEnvironment("fisk");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/many_errors.dart.legacy.expect b/pkg/front_end/testcases/many_errors.dart.legacy.expect
deleted file mode 100644
index 07f53cf..0000000
--- a/pkg/front_end/testcases/many_errors.dart.legacy.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:1: Error: An external or native method can't have a body.
-// external foo(String x) {
-// ^^^^^^^^
-//
-// pkg/front_end/testcases/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
-//   const A.named1() sync* {}
-//                          ^
-//
-// pkg/front_end/testcases/many_errors.dart:10:26: Error: New expression is not a constant expression.
-//   const A.named2() : x = new Object();
-//                          ^^^
-//
-// pkg/front_end/testcases/many_errors.dart:10:24: Warning: 'x' is a final instance variable that has already been initialized.
-//   const A.named2() : x = new Object();
-//                        ^
-// pkg/front_end/testcases/many_errors.dart:6:9: Context: 'x' was initialized here.
-//   final x = null;
-//         ^
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:24: Error: An external or native method can't have a body.
-// external foo(String x) {
-//                        ^
-//
-// pkg/front_end/testcases/many_errors.dart:28:9: Error: The class 'AbstractClass' is abstract and can't be instantiated.
-//   const AbstractClass.id();
-//         ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/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();
-//         ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field dynamic x = null;
-  constructor named1() → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class AbstractClass extends core::Object {
-  const constructor id() → self::AbstractClass
-    : super core::Object::•()
-    ;
-}
-external static method foo(core::String x) → dynamic {
-  invalid-expression "pkg/front_end/testcases/many_errors.dart:13:24: Error: An external or native method can't have a body.
-external foo(String x) {
-                       ^";
-  {
-    return x.length;
-  }
-}
-static method m() → dynamic {
-  throw invalid-expression "pkg/front_end/testcases/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();
-        ^";
-  (let final dynamic #t3 = new self::C::•() in #t3.==(null) ? null : let final dynamic #t4 = #t3.b in #t4.==(null) ? #t3.b = new self::B::•() : #t4).b;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/many_errors.dart.legacy.transformed.expect b/pkg/front_end/testcases/many_errors.dart.legacy.transformed.expect
deleted file mode 100644
index 07f53cf..0000000
--- a/pkg/front_end/testcases/many_errors.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:1: Error: An external or native method can't have a body.
-// external foo(String x) {
-// ^^^^^^^^
-//
-// pkg/front_end/testcases/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
-//   const A.named1() sync* {}
-//                          ^
-//
-// pkg/front_end/testcases/many_errors.dart:10:26: Error: New expression is not a constant expression.
-//   const A.named2() : x = new Object();
-//                          ^^^
-//
-// pkg/front_end/testcases/many_errors.dart:10:24: Warning: 'x' is a final instance variable that has already been initialized.
-//   const A.named2() : x = new Object();
-//                        ^
-// pkg/front_end/testcases/many_errors.dart:6:9: Context: 'x' was initialized here.
-//   final x = null;
-//         ^
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:24: Error: An external or native method can't have a body.
-// external foo(String x) {
-//                        ^
-//
-// pkg/front_end/testcases/many_errors.dart:28:9: Error: The class 'AbstractClass' is abstract and can't be instantiated.
-//   const AbstractClass.id();
-//         ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/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();
-//         ^
-//
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field dynamic x = null;
-  constructor named1() → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class AbstractClass extends core::Object {
-  const constructor id() → self::AbstractClass
-    : super core::Object::•()
-    ;
-}
-external static method foo(core::String x) → dynamic {
-  invalid-expression "pkg/front_end/testcases/many_errors.dart:13:24: Error: An external or native method can't have a body.
-external foo(String x) {
-                       ^";
-  {
-    return x.length;
-  }
-}
-static method m() → dynamic {
-  throw invalid-expression "pkg/front_end/testcases/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();
-        ^";
-  (let final dynamic #t3 = new self::C::•() in #t3.==(null) ? null : let final dynamic #t4 = #t3.b in #t4.==(null) ? #t3.b = new self::B::•() : #t4).b;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/many_errors.dart.outline.expect b/pkg/front_end/testcases/many_errors.dart.outline.expect
deleted file mode 100644
index 4efbcd6..0000000
--- a/pkg/front_end/testcases/many_errors.dart.outline.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:1: Error: An external or native method can't have a body.
-// external foo(String x) {
-// ^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field dynamic x;
-  constructor named1() → self::A
-    ;
-  const constructor named2() → self::A
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  field self::B b;
-  synthetic constructor •() → self::C
-    ;
-}
-abstract class AbstractClass extends core::Object {
-  const constructor id() → self::AbstractClass
-    ;
-}
-external static method foo(core::String x) → dynamic;
-static method m() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/many_errors.dart.strong.expect b/pkg/front_end/testcases/many_errors.dart.strong.expect
deleted file mode 100644
index 37fcff8..0000000
--- a/pkg/front_end/testcases/many_errors.dart.strong.expect
+++ /dev/null
@@ -1,104 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:1: Error: An external or native method can't have a body.
-// external foo(String x) {
-// ^^^^^^^^
-//
-// pkg/front_end/testcases/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
-//   const A.named1() sync* {}
-//                          ^
-//
-// pkg/front_end/testcases/many_errors.dart:10:26: Error: New expression is not a constant expression.
-//   const A.named2() : x = new Object();
-//                          ^^^
-//
-// pkg/front_end/testcases/many_errors.dart:10:24: Error: 'x' is a final instance variable that has already been initialized.
-//   const A.named2() : x = new Object();
-//                        ^
-// pkg/front_end/testcases/many_errors.dart:6:9: Context: 'x' was initialized here.
-//   final x = null;
-//         ^
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:24: Error: An external or native method can't have a body.
-// external foo(String x) {
-//                        ^
-//
-// pkg/front_end/testcases/many_errors.dart:28:9: Error: The class 'AbstractClass' is abstract and can't be instantiated.
-//   const AbstractClass.id();
-//         ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/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/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
-//  - 'B' is from 'pkg/front_end/testcases/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 {
-  final field dynamic x = null;
-  constructor named1() → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class AbstractClass extends core::Object {
-  const constructor id() → self::AbstractClass
-    : super core::Object::•()
-    ;
-}
-external static method foo(core::String x) → dynamic {
-  invalid-expression "pkg/front_end/testcases/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};
-  }
-}
-static method m() → dynamic {
-  throw invalid-expression "pkg/front_end/testcases/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/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
- - 'B' is from 'pkg/front_end/testcases/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;
-                           ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/many_errors.dart.strong.transformed.expect b/pkg/front_end/testcases/many_errors.dart.strong.transformed.expect
deleted file mode 100644
index 37fcff8..0000000
--- a/pkg/front_end/testcases/many_errors.dart.strong.transformed.expect
+++ /dev/null
@@ -1,104 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:1: Error: An external or native method can't have a body.
-// external foo(String x) {
-// ^^^^^^^^
-//
-// pkg/front_end/testcases/many_errors.dart:8:26: Error: Constructor bodies can't use 'async', 'async*', or 'sync*'.
-//   const A.named1() sync* {}
-//                          ^
-//
-// pkg/front_end/testcases/many_errors.dart:10:26: Error: New expression is not a constant expression.
-//   const A.named2() : x = new Object();
-//                          ^^^
-//
-// pkg/front_end/testcases/many_errors.dart:10:24: Error: 'x' is a final instance variable that has already been initialized.
-//   const A.named2() : x = new Object();
-//                        ^
-// pkg/front_end/testcases/many_errors.dart:6:9: Context: 'x' was initialized here.
-//   final x = null;
-//         ^
-//
-// pkg/front_end/testcases/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/many_errors.dart:13:24: Error: An external or native method can't have a body.
-// external foo(String x) {
-//                        ^
-//
-// pkg/front_end/testcases/many_errors.dart:28:9: Error: The class 'AbstractClass' is abstract and can't be instantiated.
-//   const AbstractClass.id();
-//         ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/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/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
-//  - 'B' is from 'pkg/front_end/testcases/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 {
-  final field dynamic x = null;
-  constructor named1() → self::A
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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::•()
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    : super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  field self::B b = null;
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-}
-abstract class AbstractClass extends core::Object {
-  const constructor id() → self::AbstractClass
-    : super core::Object::•()
-    ;
-}
-external static method foo(core::String x) → dynamic {
-  invalid-expression "pkg/front_end/testcases/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};
-  }
-}
-static method m() → dynamic {
-  throw invalid-expression "pkg/front_end/testcases/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/many_errors.dart:29:28: Error: The getter 'b' isn't defined for the class 'B'.
- - 'B' is from 'pkg/front_end/testcases/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;
-                           ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_enum.dart.legacy.expect b/pkg/front_end/testcases/metadata_enum.dart.legacy.expect
deleted file mode 100644
index d406cf8..0000000
--- a/pkg/front_end/testcases/metadata_enum.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::E1, self::E::E2, self::E::E3];
-  static const field self::E E1 = const self::E::•(0, "E.E1");
-  static const field self::E E2 = const self::E::•(1, "E.E2");
-  static const field self::E E3 = const self::E::•(2, "E.E3");
-  const constructor •(core::int index, core::String _name) → self::E
-    : self::E::index = index, self::E::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::E::_name};
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_enum.dart.legacy.transformed.expect b/pkg/front_end/testcases/metadata_enum.dart.legacy.transformed.expect
deleted file mode 100644
index d406cf8..0000000
--- a/pkg/front_end/testcases/metadata_enum.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::E1, self::E::E2, self::E::E3];
-  static const field self::E E1 = const self::E::•(0, "E.E1");
-  static const field self::E E2 = const self::E::•(1, "E.E2");
-  static const field self::E E3 = const self::E::•(2, "E.E3");
-  const constructor •(core::int index, core::String _name) → self::E
-    : self::E::index = index, self::E::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::E::_name};
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_enum.dart.outline.expect b/pkg/front_end/testcases/metadata_enum.dart.outline.expect
deleted file mode 100644
index 16c0355..0000000
--- a/pkg/front_end/testcases/metadata_enum.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::E1, self::E::E2, self::E::E3];
-  static const field self::E E1 = const self::E::•(0, "E.E1");
-  static const field self::E E2 = const self::E::•(1, "E.E2");
-  static const field self::E E3 = const self::E::•(2, "E.E3");
-  const constructor •(core::int index, core::String _name) → self::E
-    : self::E::index = index, self::E::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::E::_name};
-}
-static const field dynamic a = null;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/metadata_enum.dart.strong.expect b/pkg/front_end/testcases/metadata_enum.dart.strong.expect
deleted file mode 100644
index d406cf8..0000000
--- a/pkg/front_end/testcases/metadata_enum.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::E1, self::E::E2, self::E::E3];
-  static const field self::E E1 = const self::E::•(0, "E.E1");
-  static const field self::E E2 = const self::E::•(1, "E.E2");
-  static const field self::E E3 = const self::E::•(2, "E.E3");
-  const constructor •(core::int index, core::String _name) → self::E
-    : self::E::index = index, self::E::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::E::_name};
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect b/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect
deleted file mode 100644
index d406cf8..0000000
--- a/pkg/front_end/testcases/metadata_enum.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class E extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::E> values = const <self::E>[self::E::E1, self::E::E2, self::E::E3];
-  static const field self::E E1 = const self::E::•(0, "E.E1");
-  static const field self::E E2 = const self::E::•(1, "E.E2");
-  static const field self::E E3 = const self::E::•(2, "E.E3");
-  const constructor •(core::int index, core::String _name) → self::E
-    : self::E::index = index, self::E::_name = _name, super core::Object::•()
-    ;
-  method toString() → core::String
-    return this.{=self::E::_name};
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.expect
deleted file mode 100644
index 43d0e37..0000000
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-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::•()
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.transformed.expect
deleted file mode 100644
index 0c681d3..0000000
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class C extends self::D implements self::E {
-  synthetic constructor •() → self::C
-    : super self::D::•()
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
deleted file mode 100644
index b3c6bd0..0000000
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class C = self::D with self::E {
-  synthetic constructor •() → self::C
-    : super self::D::•()
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    ;
-}
-static const field dynamic a = null;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.expect
deleted file mode 100644
index 43d0e37..0000000
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-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::•()
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.transformed.expect
deleted file mode 100644
index 0c681d3..0000000
--- a/pkg/front_end/testcases/metadata_named_mixin_application.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-@self::a
-class C extends self::D implements self::E {
-  synthetic constructor •() → self::C
-    : super self::D::•()
-    ;
-}
-class D extends core::Object {
-  synthetic constructor •() → self::D
-    : super core::Object::•()
-    ;
-}
-class E extends core::Object {
-  synthetic constructor •() → self::E
-    : super core::Object::•()
-    ;
-}
-static const field dynamic a = null;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/micro.dart.outline.expect b/pkg/front_end/testcases/micro.dart.outline.expect
deleted file mode 100644
index ddf99ae..0000000
--- a/pkg/front_end/testcases/micro.dart.outline.expect
+++ /dev/null
@@ -1,57 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-  method instanceMethod() → dynamic
-    ;
-}
-abstract class ExternalValue extends core::Object {
-  synthetic constructor •() → self::ExternalValue
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    ;
-  abstract method externalInstanceMethod() → self::ExternalValue;
-}
-class Box extends core::Object {
-  field dynamic field;
-  synthetic constructor •() → self::Box
-    ;
-}
-class FinalBox extends core::Object {
-  final field dynamic finalField;
-  constructor •(dynamic finalField) → self::FinalBox
-    ;
-}
-class SubFinalBox extends self::FinalBox {
-  constructor •(dynamic value) → self::SubFinalBox
-    ;
-}
-class DynamicReceiver1 extends core::Object {
-  synthetic constructor •() → self::DynamicReceiver1
-    ;
-  method dynamicallyCalled(dynamic x) → dynamic
-    ;
-}
-class DynamicReceiver2 extends core::Object {
-  synthetic constructor •() → self::DynamicReceiver2
-    ;
-  method dynamicallyCalled(dynamic x) → dynamic
-    ;
-}
-static method staticMethod() → dynamic
-  ;
-external static abstract method externalStatic() → core::bool;
-external static abstract method createBar() → self::Bar;
-static method stringArgument(dynamic x) → dynamic
-  ;
-static method intArgument(dynamic x) → dynamic
-  ;
-static method makeDynamicCall(dynamic receiver) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/micro.dart.strong.expect b/pkg/front_end/testcases/micro.dart.strong.expect
deleted file mode 100644
index 1acd17c..0000000
--- a/pkg/front_end/testcases/micro.dart.strong.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-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 class ExternalValue extends core::Object {
-  synthetic constructor •() → self::ExternalValue
-    : super core::Object::•()
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  abstract method externalInstanceMethod() → self::ExternalValue;
-}
-class Box extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Box
-    : super core::Object::•()
-    ;
-}
-class FinalBox extends core::Object {
-  final field dynamic finalField;
-  constructor •(dynamic finalField) → self::FinalBox
-    : self::FinalBox::finalField = finalField, super core::Object::•()
-    ;
-}
-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 {}
-}
-class DynamicReceiver2 extends core::Object {
-  synthetic constructor •() → self::DynamicReceiver2
-    : super core::Object::•()
-    ;
-  method dynamicallyCalled(dynamic x) → dynamic {}
-}
-static method staticMethod() → dynamic {
-  return "sdfg";
-}
-external static abstract method externalStatic() → core::bool;
-external static abstract method createBar() → self::Bar;
-static method stringArgument(dynamic x) → dynamic {}
-static method intArgument(dynamic x) → dynamic {}
-static method makeDynamicCall(dynamic receiver) → void {
-  receiver.dynamicallyCalled("sdfg");
-}
-static method main() → dynamic {
-  dynamic x = self::staticMethod();
-  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}();
-  core::bool z = self::externalStatic();
-  self::ExternalValue w = self::createBar().{self::Bar::externalInstanceMethod}();
-  self::stringArgument("sdfg");
-  self::intArgument(42);
-  self::Box box = new self::Box::•();
-  box.{self::Box::field} = "sdfg";
-  dynamic a = box.{self::Box::field};
-  self::FinalBox finalBox = new self::FinalBox::•("dfg");
-  dynamic b = finalBox.{self::FinalBox::finalField};
-  self::SubFinalBox subBox = new self::SubFinalBox::•("dfg");
-  dynamic c = subBox.{self::FinalBox::finalField};
-  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);
-}
diff --git a/pkg/front_end/testcases/micro.dart.strong.transformed.expect b/pkg/front_end/testcases/micro.dart.strong.transformed.expect
deleted file mode 100644
index 1acd17c..0000000
--- a/pkg/front_end/testcases/micro.dart.strong.transformed.expect
+++ /dev/null
@@ -1,81 +0,0 @@
-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 class ExternalValue extends core::Object {
-  synthetic constructor •() → self::ExternalValue
-    : super core::Object::•()
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  abstract method externalInstanceMethod() → self::ExternalValue;
-}
-class Box extends core::Object {
-  field dynamic field = null;
-  synthetic constructor •() → self::Box
-    : super core::Object::•()
-    ;
-}
-class FinalBox extends core::Object {
-  final field dynamic finalField;
-  constructor •(dynamic finalField) → self::FinalBox
-    : self::FinalBox::finalField = finalField, super core::Object::•()
-    ;
-}
-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 {}
-}
-class DynamicReceiver2 extends core::Object {
-  synthetic constructor •() → self::DynamicReceiver2
-    : super core::Object::•()
-    ;
-  method dynamicallyCalled(dynamic x) → dynamic {}
-}
-static method staticMethod() → dynamic {
-  return "sdfg";
-}
-external static abstract method externalStatic() → core::bool;
-external static abstract method createBar() → self::Bar;
-static method stringArgument(dynamic x) → dynamic {}
-static method intArgument(dynamic x) → dynamic {}
-static method makeDynamicCall(dynamic receiver) → void {
-  receiver.dynamicallyCalled("sdfg");
-}
-static method main() → dynamic {
-  dynamic x = self::staticMethod();
-  dynamic y = new self::Foo::•().{self::Foo::instanceMethod}();
-  core::bool z = self::externalStatic();
-  self::ExternalValue w = self::createBar().{self::Bar::externalInstanceMethod}();
-  self::stringArgument("sdfg");
-  self::intArgument(42);
-  self::Box box = new self::Box::•();
-  box.{self::Box::field} = "sdfg";
-  dynamic a = box.{self::Box::field};
-  self::FinalBox finalBox = new self::FinalBox::•("dfg");
-  dynamic b = finalBox.{self::FinalBox::finalField};
-  self::SubFinalBox subBox = new self::SubFinalBox::•("dfg");
-  dynamic c = subBox.{self::FinalBox::finalField};
-  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);
-}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.legacy.expect b/pkg/front_end/testcases/missing_constructor.dart.legacy.expect
deleted file mode 100644
index f6911cc..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.legacy.expect
+++ /dev/null
@@ -1,71 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
-//   Sub() : super();
-//           ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
-//   Sub.foo() : super.foo();
-//               ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
-//   Bad.foo() : this();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
-//   Bad.bar() : this.baz();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
-//   MixinApplication() : super();
-//                        ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:23:28: Warning: 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::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::Sub
-    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class Bad extends core::Object {
-  constructor foo() → self::Bad
-    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor bar() → self::Bad
-    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M = self::Super with self::M {
-  synthetic constructor _() → self::_MixinApplication&Super&M
-    : super self::Super::_()
-    ;
-}
-class MixinApplication extends self::_MixinApplication&Super&M {
-  constructor •() → self::MixinApplication
-    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::MixinApplication
-    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect
deleted file mode 100644
index 518277f..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,71 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/missing_constructor.dart:10:11: Warning: Superclass has no constructor named 'Super'.
-//   Sub() : super();
-//           ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:11:15: Warning: Superclass has no constructor named 'Super.foo'.
-//   Sub.foo() : super.foo();
-//               ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:15:15: Warning: Couldn't find constructor 'Bad'.
-//   Bad.foo() : this();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:16:15: Warning: Couldn't find constructor 'Bad.baz'.
-//   Bad.bar() : this.baz();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:22:24: Warning: Superclass has no constructor named 'Super'.
-//   MixinApplication() : super();
-//                        ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:23:28: Warning: 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::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::Sub
-    : final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class Bad extends core::Object {
-  constructor foo() → self::Bad
-    : final dynamic #t3 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor bar() → self::Bad
-    : final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Bad.baz, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M extends self::Super implements self::M {
-  synthetic constructor _() → self::_MixinApplication&Super&M
-    : super self::Super::_()
-    ;
-}
-class MixinApplication extends self::_MixinApplication&Super&M {
-  constructor •() → self::MixinApplication
-    : final dynamic #t5 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-  constructor foo() → self::MixinApplication
-    : final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Super.foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/missing_constructor.dart.outline.expect b/pkg/front_end/testcases/missing_constructor.dart.outline.expect
deleted file mode 100644
index 2bda841..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.outline.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Super extends core::Object {
-  constructor _() → self::Super
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    ;
-  constructor foo() → self::Sub
-    ;
-}
-class Bad extends core::Object {
-  constructor foo() → self::Bad
-    ;
-  constructor bar() → self::Bad
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    ;
-}
-abstract class _MixinApplication&Super&M = self::Super with self::M {
-  synthetic constructor _() → self::_MixinApplication&Super&M
-    : super self::Super::_()
-    ;
-}
-class MixinApplication extends self::_MixinApplication&Super&M {
-  constructor •() → self::MixinApplication
-    ;
-  constructor foo() → self::MixinApplication
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/missing_constructor.dart.strong.expect b/pkg/front_end/testcases/missing_constructor.dart.strong.expect
deleted file mode 100644
index 171f082..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.strong.expect
+++ /dev/null
@@ -1,83 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
-//   Sub() : super();
-//           ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
-//   Sub.foo() : super.foo();
-//               ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
-//   Bad.foo() : this();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
-//   Bad.bar() : this.baz();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
-//   MixinApplication() : super();
-//                        ^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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/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/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
-  Bad.bar() : this.baz();
-              ^^^^"
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M = self::Super with self::M {
-  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/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/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/missing_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/missing_constructor.dart.strong.transformed.expect
deleted file mode 100644
index 3c5ca61..0000000
--- a/pkg/front_end/testcases/missing_constructor.dart.strong.transformed.expect
+++ /dev/null
@@ -1,83 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/missing_constructor.dart:10:11: Error: Superclass has no constructor named 'Super'.
-//   Sub() : super();
-//           ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:11:15: Error: Superclass has no constructor named 'Super.foo'.
-//   Sub.foo() : super.foo();
-//               ^^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:15:15: Error: Couldn't find constructor 'Bad'.
-//   Bad.foo() : this();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
-//   Bad.bar() : this.baz();
-//               ^^^^
-//
-// pkg/front_end/testcases/missing_constructor.dart:22:24: Error: Superclass has no constructor named 'Super'.
-//   MixinApplication() : super();
-//                        ^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class Sub extends self::Super {
-  constructor •() → self::Sub
-    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/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/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/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/missing_constructor.dart:16:15: Error: Couldn't find constructor 'Bad.baz'.
-  Bad.bar() : this.baz();
-              ^^^^"
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-abstract class _MixinApplication&Super&M extends self::Super implements self::M {
-  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/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/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/mixin.dart.legacy.expect b/pkg/front_end/testcases/mixin.dart.legacy.expect
deleted file mode 100644
index 0213797..0000000
--- a/pkg/front_end/testcases/mixin.dart.legacy.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-}
-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 class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-}
-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 class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-}
-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).m();
-  new self::C::•(null).m();
-  new self::D::•<dynamic>().m();
-  new self::D::•<core::int>().m();
-  new self::D::•<core::List<core::int>>().m();
-}
diff --git a/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect
deleted file mode 100644
index 874cadf..0000000
--- a/pkg/front_end/testcases/mixin.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,82 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 extends core::Object implements self::M1 {
-  const synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
-  const synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-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 class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 extends core::Object implements self::M1 {
-  const synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
-  const synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-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 class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
-  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print(self::_D&Object&G1::S);
-}
-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).m();
-  new self::C::•(null).m();
-  new self::D::•<dynamic>().m();
-  new self::D::•<core::int>().m();
-  new self::D::•<core::List<core::int>>().m();
-}
diff --git a/pkg/front_end/testcases/mixin.dart.outline.expect b/pkg/front_end/testcases/mixin.dart.outline.expect
deleted file mode 100644
index 2ab6aaa..0000000
--- a/pkg/front_end/testcases/mixin.dart.outline.expect
+++ /dev/null
@@ -1,61 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-}
-class B extends self::_B&Object&M1&M2 {
-  constructor •(dynamic value) → self::B
-    ;
-}
-abstract class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    ;
-  method m() → dynamic
-    ;
-}
-abstract class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    ;
-  method m() → dynamic
-    ;
-}
-abstract class _C&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-}
-class C extends self::_C&Object&M1&M2 {
-  constructor •(dynamic value) → self::C
-    ;
-}
-abstract class G1<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G1<self::G1::T>
-    ;
-  method m() → dynamic
-    ;
-}
-abstract class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-}
-class D<S extends core::Object = dynamic> extends self::_D&Object&G1<self::D::S> {
-  synthetic constructor •() → self::D<self::D::S>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin.dart.strong.expect b/pkg/front_end/testcases/mixin.dart.strong.expect
deleted file mode 100644
index 3325ecd..0000000
--- a/pkg/front_end/testcases/mixin.dart.strong.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _B&Object&M1&M2 = self::_B&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-}
-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 class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 = core::Object with self::M1 {
-  const synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&M1&M2 = self::_C&Object&M1 with self::M2 {
-  const synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-}
-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 class _D&Object&G1<S extends core::Object = dynamic> = core::Object with self::G1<self::_D&Object&G1::S> {
-  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-}
-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::M2::m}();
-  new self::C::•(null).{self::M2::m}();
-  new self::D::•<dynamic>().{self::G1::m}();
-  new self::D::•<core::int>().{self::G1::m}();
-  new self::D::•<core::List<core::int>>().{self::G1::m}();
-}
diff --git a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
deleted file mode 100644
index 124f59c..0000000
--- a/pkg/front_end/testcases/mixin.dart.strong.transformed.expect
+++ /dev/null
@@ -1,82 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _B&Object&M1 extends core::Object implements self::M1 {
-  const synthetic constructor •() → self::_B&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _B&Object&M1&M2 extends self::_B&Object&M1 implements self::M2 {
-  const synthetic constructor •() → self::_B&Object&M1&M2
-    : super self::_B&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-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 class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-abstract class _C&Object&M1 extends core::Object implements self::M1 {
-  const synthetic constructor •() → self::_C&Object&M1
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print("M1");
-}
-abstract class _C&Object&M1&M2 extends self::_C&Object&M1 implements self::M2 {
-  const synthetic constructor •() → self::_C&Object&M1&M2
-    : super self::_C&Object&M1::•()
-    ;
-  method m() → dynamic
-    return core::print("M2");
-}
-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 class _D&Object&G1<S extends core::Object = dynamic> extends core::Object implements self::G1<self::_D&Object&G1::S> {
-  const synthetic constructor •() → self::_D&Object&G1<self::_D&Object&G1::S>
-    : super core::Object::•()
-    ;
-  method m() → dynamic
-    return core::print(self::_D&Object&G1::S);
-}
-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::M2::m}();
-  new self::C::•(null).{self::M2::m}();
-  new self::D::•<dynamic>().{self::G1::m}();
-  new self::D::•<core::int>().{self::G1::m}();
-  new self::D::•<core::List<core::int>>().{self::G1::m}();
-}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect b/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect
deleted file mode 100644
index 6856ac8..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.legacy.expect
+++ /dev/null
@@ -1,347 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
-// class A0 = S with M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
-// class A1 = S with M1, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
-// class A2 = S with M1, M2, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class A0X = S with M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class A1X = S with M1, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class A2X = S with M1, M2, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0 extends S with M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1 extends S with M1, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2 extends S with M1, M2, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0X extends S with M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1X extends S with M1, M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2X extends S with M1, M2, M, MX {}
-//       ^^^
-//
-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 = null]) → dynamic {}
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    : super core::Object::•()
-    ;
-}
-class A0 = self::S with self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A1&S&M1 = self::S with self::M1 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
-  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 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
-  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 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
-  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 {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect
deleted file mode 100644
index f59920c..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,347 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
-// class A0 = S with M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
-// class A1 = S with M1, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
-// class A2 = S with M1, M2, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class A0X = S with M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class A1X = S with M1, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class A2X = S with M1, M2, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0 extends S with M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1 extends S with M1, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2 extends S with M1, M2, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0X extends S with M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1X extends S with M1, M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2X extends S with M1, M2, M, MX {}
-//       ^^^
-//
-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 = null]) → dynamic {}
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    : super core::Object::•()
-    ;
-}
-class A0 extends self::S implements self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A1&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A1&S&M1
-    : super self::S::•()
-    ;
-}
-class A1 extends self::_A1&S&M1 implements self::M {
-  synthetic constructor •() → self::A1
-    : super self::_A1&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A2&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 extends self::_A2&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_A2&S&M1&M2
-    : super self::_A2&S&M1::•()
-    ;
-}
-class A2 extends self::_A2&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::A2
-    : super self::_A2&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A0X&S&M extends self::S implements self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-class A0X extends self::_A0X&S&M implements self::MX {
-  synthetic constructor •() → self::A0X
-    : super self::_A0X&S&M::•()
-    ;
-}
-abstract class _A1X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M extends self::_A1X&S&M1 implements self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-class A1X extends self::_A1X&S&M1&M implements self::MX {
-  synthetic constructor •() → self::A1X
-    : super self::_A1X&S&M1&M::•()
-    ;
-}
-abstract class _A2X&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 extends self::_A2X&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_A2X&S&M1&M2
-    : super self::_A2X&S&M1::•()
-    ;
-}
-abstract class _A2X&S&M1&M2&M extends self::_A2X&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-class A2X extends self::_A2X&S&M1&M2&M implements self::MX {
-  synthetic constructor •() → self::A2X
-    : super self::_A2X&S&M1&M2&M::•()
-    ;
-}
-abstract class _B0&S&M extends self::S implements self::M {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-class B0 extends self::_B0&S&M {
-  synthetic constructor •() → self::B0
-    : super self::_B0&S&M::•()
-    ;
-}
-abstract class _B1&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M extends self::_B1&S&M1 implements self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-class B1 extends self::_B1&S&M1&M {
-  synthetic constructor •() → self::B1
-    : super self::_B1&S&M1&M::•()
-    ;
-}
-abstract class _B2&S&M1 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 extends self::_B2&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_B2&S&M1&M2
-    : super self::_B2&S&M1::•()
-    ;
-}
-abstract class _B2&S&M1&M2&M extends self::_B2&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 extends self::S implements self::M {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B0X&S&M&MX extends self::_B0X&S&M implements self::MX {
-  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 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M extends self::_B1X&S&M1 implements self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B1X&S&M1&M&MX extends self::_B1X&S&M1&M implements self::MX {
-  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 extends self::S implements self::M1 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 extends self::_B2X&S&M1 implements self::M2 {
-  synthetic constructor •() → self::_B2X&S&M1&M2
-    : super self::_B2X&S&M1::•()
-    ;
-}
-abstract class _B2X&S&M1&M2&M extends self::_B2X&S&M1&M2 implements self::M {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B2X&S&M1&M2&M&MX extends self::_B2X&S&M1&M2&M implements self::MX {
-  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 {}
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.outline.expect b/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
deleted file mode 100644
index a241bd6..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.outline.expect
+++ /dev/null
@@ -1,339 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
-// class A0 = S with M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
-// class A1 = S with M1, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
-// class A2 = S with M1, M2, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class A0X = S with M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class A1X = S with M1, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class A2X = S with M1, M2, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0 extends S with M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1 extends S with M1, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2 extends S with M1, M2, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0X extends S with M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1X extends S with M1, M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Warning: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2X extends S with M1, M2, M, MX {}
-//       ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class S extends core::Object {
-  synthetic constructor •() → self::S
-    ;
-  method foo([dynamic x]) → dynamic
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    ;
-  method foo() → dynamic
-    ;
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    ;
-}
-class A0 = self::S with self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _A1&S&M1 = self::S with self::M1 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _A2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _A0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-class B0 extends self::_B0&S&M {
-  synthetic constructor •() → self::B0
-    ;
-}
-abstract class _B1&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-class B1 extends self::_B1&S&M1&M {
-  synthetic constructor •() → self::B1
-    ;
-}
-abstract class _B2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-class B2 extends self::_B2&S&M1&M2&M {
-  synthetic constructor •() → self::B2
-    ;
-}
-abstract class _B0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
-  synthetic constructor •() → self::_B0X&S&M&MX
-    : super self::_B0X&S&M::•()
-    ;
-}
-class B0X extends self::_B0X&S&M&MX {
-  synthetic constructor •() → self::B0X
-    ;
-}
-abstract class _B1X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
-  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
-    ;
-}
-abstract class _B2X&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x]) → dynamic;
-}
-abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
-  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
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_application_override.dart.strong.expect b/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
deleted file mode 100644
index 879c4c0..0000000
--- a/pkg/front_end/testcases/mixin_application_override.dart.strong.expect
+++ /dev/null
@@ -1,347 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:21:7: Context: Override was introduced in the mixin application class 'A0'.
-// class A0 = S with M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:22:7: Context: Override was introduced in the mixin application class 'A1'.
-// class A1 = S with M1, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:23:7: Context: Override was introduced in the mixin application class 'A2'.
-// class A2 = S with M1, M2, M;
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:25:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class A0X = S with M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:26:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class A1X = S with M1, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:27:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class A2X = S with M1, M2, M, MX;
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:29:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0 extends S with M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:31:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1 extends S with M1, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:33:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2 extends S with M1, M2, M {}
-//       ^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:35:7: Context: Override was introduced when the mixin 'M' was applied to 'S'.
-// class B0X extends S with M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:37:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1'.
-// class B1X extends S with M1, M, MX {}
-//       ^^^
-//
-// pkg/front_end/testcases/mixin_application_override.dart:12:3: Error: The method 'M.foo' has fewer positional arguments than those of overridden method 'S.foo'.
-//   foo() {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:8:3: Context: This is the overridden method ('foo').
-//   foo([x]) {}
-//   ^
-// pkg/front_end/testcases/mixin_application_override.dart:39:7: Context: Override was introduced when the mixin 'M' was applied to 'S with M1, M2'.
-// class B2X extends S with M1, M2, M, MX {}
-//       ^^^
-//
-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 = null]) → dynamic {}
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-class M1 extends core::Object {
-  synthetic constructor •() → self::M1
-    : super core::Object::•()
-    ;
-}
-class M2 extends core::Object {
-  synthetic constructor •() → self::M2
-    : super core::Object::•()
-    ;
-}
-class MX extends core::Object {
-  synthetic constructor •() → self::MX
-    : super core::Object::•()
-    ;
-}
-class A0 = self::S with self::M {
-  synthetic constructor •() → self::A0
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A1&S&M1 = self::S with self::M1 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A2&S&M1 = self::S with self::M1 {
-  synthetic constructor •() → self::_A2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2&S&M1&M2 = self::_A2&S&M1 with self::M2 {
-  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::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _A0X&S&M = self::S with self::M {
-  synthetic constructor •() → self::_A0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A1X&S&M1&M = self::_A1X&S&M1 with self::M {
-  synthetic constructor •() → self::_A1X&S&M1&M
-    : super self::_A1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_A2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _A2X&S&M1&M2 = self::_A2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_A2X&S&M1&M2&M
-    : super self::_A2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B0&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B1&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1&S&M1&M = self::_B1&S&M1 with self::M {
-  synthetic constructor •() → self::_B1&S&M1&M
-    : super self::_B1&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B2&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2&S&M1&M2 = self::_B2&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2&S&M1&M2&M
-    : super self::_B2&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-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 {
-  synthetic constructor •() → self::_B0X&S&M
-    : super self::S::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B0X&S&M&MX = self::_B0X&S&M with self::MX {
-  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 {
-  synthetic constructor •() → self::_B1X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B1X&S&M1&M = self::_B1X&S&M1 with self::M {
-  synthetic constructor •() → self::_B1X&S&M1&M
-    : super self::_B1X&S&M1::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B1X&S&M1&M&MX = self::_B1X&S&M1&M with self::MX {
-  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 {
-  synthetic constructor •() → self::_B2X&S&M1
-    : super self::S::•()
-    ;
-}
-abstract class _B2X&S&M1&M2 = self::_B2X&S&M1 with self::M2 {
-  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 {
-  synthetic constructor •() → self::_B2X&S&M1&M2&M
-    : super self::_B2X&S&M1&M2::•()
-    ;
-  abstract forwarding-stub method foo([dynamic x = null]) → dynamic;
-}
-abstract class _B2X&S&M1&M2&M&MX = self::_B2X&S&M1&M2&M with self::MX {
-  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 {}
diff --git a/pkg/front_end/testcases/mixin_conflicts.dart.legacy.expect b/pkg/front_end/testcases/mixin_conflicts.dart.legacy.expect
deleted file mode 100644
index 7c2bfa7..0000000
--- a/pkg/front_end/testcases/mixin_conflicts.dart.legacy.expect
+++ /dev/null
@@ -1,93 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
-//   foo() {}
-//   ^^^
-//
-// pkg/front_end/testcases/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/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 {}
-}
-class N = core::Object with self::M {
-  const synthetic constructor •() → self::N
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&N = core::Object with self::N {
-  const synthetic constructor •() → self::_C&Object&N
-    : super core::Object::•()
-    ;
-}
-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 {}
-}
-class N2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N2
-    : super core::Object::•()
-    ;
-}
-abstract class N3 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N3
-    : super core::Object::•()
-    ;
-}
-abstract class _C2&Object&M2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::_C2&Object&M2
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_C3&Object&M2
-    : super core::Object::•()
-    ;
-}
-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/mixin_conflicts.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_conflicts.dart.legacy.transformed.expect
deleted file mode 100644
index 7ab1118..0000000
--- a/pkg/front_end/testcases/mixin_conflicts.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,99 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
-//   foo() {}
-//   ^^^
-//
-// pkg/front_end/testcases/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/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 {}
-}
-class N extends core::Object implements self::M {
-  const synthetic constructor •() → self::N
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _C&Object&N extends core::Object implements self::N {
-  const synthetic constructor •() → self::_C&Object&N
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-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 {}
-}
-class N2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::N2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-abstract class N3 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::N3
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-abstract class _C2&Object&M2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::_C2&Object&M2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-class C2 extends self::_C2&Object&M2 {
-  synthetic constructor •() → self::C2
-    : super self::_C2&Object&M2::•()
-    ;
-}
-abstract class _C3&Object&M2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::_C3&Object&M2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-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/mixin_conflicts.dart.outline.expect b/pkg/front_end/testcases/mixin_conflicts.dart.outline.expect
deleted file mode 100644
index 50f14af..0000000
--- a/pkg/front_end/testcases/mixin_conflicts.dart.outline.expect
+++ /dev/null
@@ -1,91 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
-//   foo() {}
-//   ^^^
-//
-// pkg/front_end/testcases/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/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
-    ;
-  method foo() → dynamic
-    ;
-}
-class N = core::Object with self::M {
-  const synthetic constructor •() → self::N
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&N = core::Object with self::N {
-  const synthetic constructor •() → self::_C&Object&N
-    : super core::Object::•()
-    ;
-}
-class C extends self::_C&Object&N {
-  synthetic constructor •() → self::C
-    ;
-}
-abstract class M2 extends core::Object implements self::M {
-  synthetic constructor •() → self::M2
-    ;
-  method bar() → dynamic
-    ;
-}
-class N2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N2
-    : super core::Object::•()
-    ;
-}
-abstract class N3 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N3
-    : super core::Object::•()
-    ;
-}
-abstract class _C2&Object&M2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::_C2&Object&M2
-    : super core::Object::•()
-    ;
-}
-class C2 extends self::_C2&Object&M2 {
-  synthetic constructor •() → self::C2
-    ;
-}
-abstract class _C3&Object&M2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::_C3&Object&M2
-    : super core::Object::•()
-    ;
-}
-abstract class C3 extends self::_C3&Object&M2 {
-  synthetic constructor •() → self::C3
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_conflicts.dart.strong.expect b/pkg/front_end/testcases/mixin_conflicts.dart.strong.expect
deleted file mode 100644
index 7c2bfa7..0000000
--- a/pkg/front_end/testcases/mixin_conflicts.dart.strong.expect
+++ /dev/null
@@ -1,93 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
-//   foo() {}
-//   ^^^
-//
-// pkg/front_end/testcases/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/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 {}
-}
-class N = core::Object with self::M {
-  const synthetic constructor •() → self::N
-    : super core::Object::•()
-    ;
-}
-abstract class _C&Object&N = core::Object with self::N {
-  const synthetic constructor •() → self::_C&Object&N
-    : super core::Object::•()
-    ;
-}
-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 {}
-}
-class N2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N2
-    : super core::Object::•()
-    ;
-}
-abstract class N3 = core::Object with self::M2 {
-  const synthetic constructor •() → self::N3
-    : super core::Object::•()
-    ;
-}
-abstract class _C2&Object&M2 = core::Object with self::M2 {
-  const synthetic constructor •() → self::_C2&Object&M2
-    : super core::Object::•()
-    ;
-}
-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 {
-  const synthetic constructor •() → self::_C3&Object&M2
-    : super core::Object::•()
-    ;
-}
-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/mixin_conflicts.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_conflicts.dart.strong.transformed.expect
deleted file mode 100644
index 7ab1118..0000000
--- a/pkg/front_end/testcases/mixin_conflicts.dart.strong.transformed.expect
+++ /dev/null
@@ -1,99 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/mixin_conflicts.dart:7:3: Context: 'M.foo' is defined here.
-//   foo() {}
-//   ^^^
-//
-// pkg/front_end/testcases/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/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 {}
-}
-class N extends core::Object implements self::M {
-  const synthetic constructor •() → self::N
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-abstract class _C&Object&N extends core::Object implements self::N {
-  const synthetic constructor •() → self::_C&Object&N
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {}
-}
-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 {}
-}
-class N2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::N2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-abstract class N3 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::N3
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-abstract class _C2&Object&M2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::_C2&Object&M2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-class C2 extends self::_C2&Object&M2 {
-  synthetic constructor •() → self::C2
-    : super self::_C2&Object&M2::•()
-    ;
-}
-abstract class _C3&Object&M2 extends core::Object implements self::M2 {
-  const synthetic constructor •() → self::_C3&Object&M2
-    : super core::Object::•()
-    ;
-  method bar() → dynamic {}
-}
-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/mixin_constructors_with_default_values.dart.hierarchy.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect
deleted file mode 100644
index c71f63f..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.hierarchy.expect
+++ /dev/null
@@ -1,574 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-C:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    C.trace
-
-M:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-D:
-  superclasses:
-    Object
-      -> C<String>
-  interfaces: M
-  classMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    C.trace
-  interfaceMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-    C.trace
-
-E:
-  superclasses:
-    Object
-      -> C<String>
-        -> D
-  interfaces: M
-  classMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    C.trace
-  interfaceMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-    C.trace
-
-C<int> with M:
-  superclasses:
-    Object
-      -> C<int>
-  interfaces: M
-  classMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    C.trace
-  interfaceMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-    C.trace
-
-F:
-  superclasses:
-    Object
-      -> C<int>
-        -> _F&C&M
-  interfaces: M
-  classMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    C.trace
-  interfaceMembers:
-    C.trace
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-    C.trace
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect
deleted file mode 100644
index 0e4502f..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-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 = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D = self::C<core::String> with self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → 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 {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → 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>().trace);
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
-}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect
deleted file mode 100644
index 7809f36..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-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 = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D extends self::C<core::String> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → 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 extends self::C<core::int> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → 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>().trace);
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().trace);
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().trace);
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().trace);
-}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.outline.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.outline.expect
deleted file mode 100644
index 897a4aa..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.outline.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-class C<T extends core::Object = dynamic> extends core::Object {
-  field core::String trace;
-  constructor •({dynamic a, dynamic b}) → self::C<self::C::T>
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    ;
-}
-class D = self::C<core::String> with self::M {
-  synthetic constructor •({dynamic a, dynamic b}) → self::D
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    ;
-}
-abstract class _F&C&M = self::C<core::int> with self::M {
-  synthetic constructor •({dynamic a, dynamic b}) → self::_F&C&M
-    : super self::C::•(a: a, b: b)
-    ;
-}
-class F extends self::_F&C&M {
-  synthetic constructor •() → self::F
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect
deleted file mode 100644
index 883e7fe..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-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 = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D = self::C<core::String> with self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → 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 {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → 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});
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace});
-}
diff --git a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect
deleted file mode 100644
index 298c8c8..0000000
--- a/pkg/front_end/testcases/mixin_constructors_with_default_values.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-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 = 0, dynamic b = self::C::T}) → self::C<self::C::T>
-    : self::C::trace = "a: ${a}, b: ${b}", super core::Object::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-}
-class D extends self::C<core::String> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::String}) → 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 extends self::C<core::int> implements self::M {
-  synthetic constructor •({dynamic a = 0, dynamic b = core::int}) → 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});
-  exp::Expect::stringEquals("a: 0, b: T", new self::C::•<dynamic>().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: String", new self::D::•().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: String", new self::E::•().{self::C::trace});
-  exp::Expect::stringEquals("a: 0, b: int", new self::F::•().{self::C::trace});
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
deleted file mode 100644
index c22e364..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-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> {
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-}
-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 {
-  dynamic foo = new self::Foo::•();
-  foo.foo(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
deleted file mode 100644
index b5de22c..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-class D extends self::C<self::B> {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-abstract class _Foo&Object&C extends core::Object implements self::C<self::B> {
-  generic-covariant-impl field self::B _field = null;
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::B x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-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 {
-  dynamic foo = new self::Foo::•();
-  foo.foo(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
deleted file mode 100644
index 340756e..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.outline.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class C<T extends self::A = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T _field;
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-  method foo(generic-covariant-impl self::C::T x) → dynamic
-    ;
-}
-class D extends self::C<self::B> {
-  synthetic constructor •() → self::D
-    ;
-}
-abstract class _Foo&Object&C = core::Object with self::C<self::B> {
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-}
-class Foo extends self::_Foo&Object&C {
-  synthetic constructor •() → self::Foo
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
deleted file mode 100644
index b73697b..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = self::A> extends core::Object {
-  generic-covariant-impl field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-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> {
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-}
-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::C::foo}(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
deleted file mode 100644
index 6b38260..0000000
--- a/pkg/front_end/testcases/mixin_inherited_setter_for_mixed_in_field.dart.strong.transformed.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    : super core::Object::•()
-    ;
-}
-class C<T extends self::A = self::A> extends core::Object {
-  generic-covariant-impl field self::C::T _field = null;
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::C::T x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-class D extends self::C<self::B> {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-}
-abstract class _Foo&Object&C extends core::Object implements self::C<self::B> {
-  generic-covariant-impl field self::B _field = null;
-  synthetic constructor •() → self::_Foo&Object&C
-    : super core::Object::•()
-    ;
-  method foo(generic-covariant-impl self::B x) → dynamic {
-    this.{self::C::_field} = x;
-  }
-}
-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::C::foo}(new self::B::•());
-}
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.expect
deleted file mode 100644
index 5587bae..0000000
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-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 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 class _Named&S&M = self::S with self::M {
-  synthetic constructor •() → self::_Named&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _Named&S&M&N = self::_Named&S&M with self::N {
-  synthetic constructor •() → self::_Named&S&M&N
-    : super self::_Named&S&M::•()
-    ;
-}
-class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → self::Named
-    : super self::_Named&S&M&N::•()
-    ;
-}
-static method main() → dynamic {
-  self::Named named = new self::Named::•();
-  named.m = 42;
-  named.superM = 87;
-  if(!named.m.==(42)) {
-    throw "Bad mixin translation of set:superM";
-  }
-  if(!named.superM.==(87)) {
-    throw "Bad mixin translation of get:superM";
-  }
-}
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.transformed.expect
deleted file mode 100644
index aa897ab..0000000
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,58 +0,0 @@
-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 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 class _Named&S&M extends self::S implements self::M {
-  field dynamic m = null;
-  synthetic constructor •() → self::_Named&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _Named&S&M&N extends self::_Named&S&M implements self::N {
-  synthetic constructor •() → self::_Named&S&M&N
-    : super self::_Named&S&M::•()
-    ;
-  set superM(dynamic value) → void {
-    super.{self::M::m} = value;
-  }
-  get superM() → dynamic
-    return super.{self::M::m};
-}
-class Named extends self::_Named&S&M&N implements self::M {
-  field dynamic m = null;
-  synthetic constructor •() → self::Named
-    : super self::_Named&S&M&N::•()
-    ;
-}
-static method main() → dynamic {
-  self::Named named = new self::Named::•();
-  named.m = 42;
-  named.superM = 87;
-  if(!named.m.==(42)) {
-    throw "Bad mixin translation of set:superM";
-  }
-  if(!named.superM.==(87)) {
-    throw "Bad mixin translation of get:superM";
-  }
-}
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect
deleted file mode 100644
index d8d6683..0000000
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.outline.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class M extends core::Object {
-  field dynamic m;
-  synthetic constructor •() → self::M
-    ;
-}
-abstract class N extends self::M {
-  synthetic constructor •() → self::N
-    ;
-  set superM(dynamic value) → void
-    ;
-  get superM() → dynamic
-    ;
-}
-class S extends core::Object {
-  synthetic constructor •() → self::S
-    ;
-}
-abstract class _Named&S&M = self::S with self::M {
-  synthetic constructor •() → self::_Named&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _Named&S&M&N = self::_Named&S&M with self::N {
-  synthetic constructor •() → self::_Named&S&M&N
-    : super self::_Named&S&M::•()
-    ;
-}
-class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → self::Named
-    : super self::_Named&S&M&N::•()
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect
deleted file mode 100644
index 3ec41849..0000000
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.expect
+++ /dev/null
@@ -1,51 +0,0 @@
-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 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 class _Named&S&M = self::S with self::M {
-  synthetic constructor •() → self::_Named&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _Named&S&M&N = self::_Named&S&M with self::N {
-  synthetic constructor •() → self::_Named&S&M&N
-    : super self::_Named&S&M::•()
-    ;
-}
-class Named = self::_Named&S&M&N with self::M {
-  synthetic constructor •() → self::Named
-    : super self::_Named&S&M&N::•()
-    ;
-}
-static method main() → dynamic {
-  self::Named named = new self::Named::•();
-  named.{self::M::m} = 42;
-  named.{self::N::superM} = 87;
-  if(!named.{self::M::m}.{core::Object::==}(42)) {
-    throw "Bad mixin translation of set:superM";
-  }
-  if(!named.{self::N::superM}.{core::Object::==}(87)) {
-    throw "Bad mixin translation of get:superM";
-  }
-}
diff --git a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_super_repeated.dart.strong.transformed.expect
deleted file mode 100644
index f3795b2..0000000
--- a/pkg/front_end/testcases/mixin_super_repeated.dart.strong.transformed.expect
+++ /dev/null
@@ -1,58 +0,0 @@
-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 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 class _Named&S&M extends self::S implements self::M {
-  field dynamic m = null;
-  synthetic constructor •() → self::_Named&S&M
-    : super self::S::•()
-    ;
-}
-abstract class _Named&S&M&N extends self::_Named&S&M implements self::N {
-  synthetic constructor •() → self::_Named&S&M&N
-    : super self::_Named&S&M::•()
-    ;
-  set superM(dynamic value) → void {
-    super.{self::M::m} = value;
-  }
-  get superM() → dynamic
-    return super.{self::M::m};
-}
-class Named extends self::_Named&S&M&N implements self::M {
-  field dynamic m = null;
-  synthetic constructor •() → self::Named
-    : super self::_Named&S&M&N::•()
-    ;
-}
-static method main() → dynamic {
-  self::Named named = new self::Named::•();
-  named.{self::M::m} = 42;
-  named.{self::N::superM} = 87;
-  if(!named.{self::M::m}.{core::Object::==}(42)) {
-    throw "Bad mixin translation of set:superM";
-  }
-  if(!named.{self::N::superM}.{core::Object::==}(87)) {
-    throw "Bad mixin translation of get:superM";
-  }
-}
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.expect b/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.expect
deleted file mode 100644
index 8c1ae5e..0000000
--- a/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _A&B&M = self::B with self::M {
-  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::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.transformed.expect b/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.transformed.expect
deleted file mode 100644
index e243b45..0000000
--- a/pkg/front_end/testcases/mixin_with_static_member.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _A&B&M extends self::B implements self::M {
-  synthetic constructor •() → self::_A&B&M
-    : super self::B::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-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::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.outline.expect b/pkg/front_end/testcases/mixin_with_static_member.dart.outline.expect
deleted file mode 100644
index 2de8dc52..0000000
--- a/pkg/front_end/testcases/mixin_with_static_member.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _A&B&M = self::B with self::M {
-  synthetic constructor •() → self::_A&B&M
-    : super self::B::•()
-    ;
-}
-class A extends self::_A&B&M {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  final field core::Object m;
-  synthetic constructor •() → self::B
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    ;
-  static method m() → core::Object
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.strong.expect b/pkg/front_end/testcases/mixin_with_static_member.dart.strong.expect
deleted file mode 100644
index 8c1ae5e..0000000
--- a/pkg/front_end/testcases/mixin_with_static_member.dart.strong.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _A&B&M = self::B with self::M {
-  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::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/mixin_with_static_member.dart.strong.transformed.expect b/pkg/front_end/testcases/mixin_with_static_member.dart.strong.transformed.expect
deleted file mode 100644
index e243b45..0000000
--- a/pkg/front_end/testcases/mixin_with_static_member.dart.strong.transformed.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class _A&B&M extends self::B implements self::M {
-  synthetic constructor •() → self::_A&B&M
-    : super self::B::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-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::•()
-    ;
-}
-class M extends core::Object {
-  synthetic constructor •() → self::M
-    : super core::Object::•()
-    ;
-  static method m() → core::Object
-    return null;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/named_function_scope.dart.legacy.expect b/pkg/front_end/testcases/named_function_scope.dart.legacy.expect
deleted file mode 100644
index 69b1086..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.legacy.expect
+++ /dev/null
@@ -1,175 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
-//     var x = T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:29:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:34:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
-//     var x = T T() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:41:13: Context: Previous use of 'T'.
-//     var x = T T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:47:5: Context: Previous use of 'V'.
-//     V V;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
-//     var x = T<T>() {};
-//             ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
-//     var x = T<T>() {};
-//             ^
-// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
-//     var x = T<T>() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:55:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:59:5: Context: Previous use of 'T'.
-//     T T() {}
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:62:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:69:12: Warning: '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::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → dynamic {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    dynamic x = let final () → dynamic T = () → dynamic {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V;
-        ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V = null;
-        ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/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 () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
-    V V;
-      ^";
-  }
-  {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/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>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/named_function_scope.dart.legacy.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
deleted file mode 100644
index 69b1086..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,175 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
-//     var x = T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:29:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:34:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
-//     var x = T T() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:41:13: Context: Previous use of 'T'.
-//     var x = T T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:47:5: Context: Previous use of 'V'.
-//     V V;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
-//     var x = T<T>() {};
-//             ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
-//     var x = T<T>() {};
-//             ^
-// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
-//     var x = T<T>() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:55:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:59:5: Context: Previous use of 'T'.
-//     T T() {}
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:62:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:69:12: Warning: '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::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → dynamic {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    dynamic x = let final () → dynamic T = () → dynamic {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V;
-        ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V = null;
-        ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/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 () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
-    V V;
-      ^";
-  }
-  {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/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>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/named_function_scope.dart.outline.expect b/pkg/front_end/testcases/named_function_scope.dart.outline.expect
deleted file mode 100644
index 023ec2f..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.outline.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class T extends core::Object {
-  synthetic constructor •() → self::T
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    ;
-}
-static method test() → dynamic
-  ;
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/named_function_scope.dart.strong.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.expect
deleted file mode 100644
index ec10637..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.expect
+++ /dev/null
@@ -1,175 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
-//     var x = T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:29:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:34:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
-//     var x = T T() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:41:13: Context: Previous use of 'T'.
-//     var x = T T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:47:5: Context: Previous use of 'V'.
-//     V V;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
-//     var x = T<T>() {};
-//             ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
-//     var x = T<T>() {};
-//             ^
-// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
-//     var x = T<T>() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:55:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:59:5: Context: Previous use of 'T'.
-//     T T() {}
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:62:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → core::Null {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    () → core::Null x = let final () → core::Null T = () → core::Null {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V;
-        ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V = null;
-        ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/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 () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
-    V V;
-      ^" as{TypeError} self::V;
-  }
-  {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/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>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/named_function_scope.dart.strong.transformed.expect b/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
deleted file mode 100644
index ec10637..0000000
--- a/pkg/front_end/testcases/named_function_scope.dart.strong.transformed.expect
+++ /dev/null
@@ -1,175 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/named_function_scope.dart:26:13: Error: A function expression can't have a name.
-//     var x = T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:29:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:34:5: Context: Previous use of 'V'.
-//     V v;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:41:15: Error: A function expression can't have a name.
-//     var x = T T() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:41:13: Context: Previous use of 'T'.
-//     var x = T T() {};
-//             ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:47:5: Context: Previous use of 'V'.
-//     V V;
-//     ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: A function expression can't have a name.
-//     var x = T<T>() {};
-//             ^
-//
-// pkg/front_end/testcases/named_function_scope.dart:52:13: Error: 'T' is already declared in this scope.
-//     var x = T<T>() {};
-//             ^
-// pkg/front_end/testcases/named_function_scope.dart:52:15: Context: Previous declaration of 'T'.
-//     var x = T<T>() {};
-//               ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:55:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:59:5: Context: Previous use of 'T'.
-//     T T() {}
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:62:5: Context: Previous use of 'T'.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/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/named_function_scope.dart:66:5: Context: Previous use of 'T'.
-//     T T(T t) {}
-//     ^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-class V extends core::Object {
-  synthetic constructor •() → self::V
-    : super core::Object::•()
-    ;
-}
-static method test() → dynamic {
-  self::T t;
-  self::V v;
-  {
-    function T() → core::Null {}
-  }
-  {
-    dynamic v;
-  }
-  {
-    self::T t;
-    () → core::Null x = let final () → core::Null T = () → core::Null {} in T;
-  }
-  {
-    self::V v;
-    dynamic V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:31:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V;
-        ^";
-  }
-  {
-    self::V v;
-    dynamic V = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:36:9: Error: Can't declare 'V' because it was already used in this scope.
-    var V = null;
-        ^" in null;
-  }
-  {
-    dynamic x = let final dynamic #t2 = invalid-expression "pkg/front_end/testcases/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 () → self::T T = () → self::T {} in T;
-  }
-  {
-    self::V V = invalid-expression "pkg/front_end/testcases/named_function_scope.dart:47:7: Error: Can't declare 'V' because it was already used in this scope.
-    V V;
-      ^" as{TypeError} self::V;
-  }
-  {
-    dynamic x = let final dynamic #t3 = invalid-expression "pkg/front_end/testcases/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>() → dynamic T = <T extends core::Object = dynamic>() → dynamic {} in T;
-  }
-  {
-    self::T t;
-    {
-      invalid-expression "pkg/front_end/testcases/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/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/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/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/named_parameters.dart.outline.expect b/pkg/front_end/testcases/named_parameters.dart.outline.expect
deleted file mode 100644
index 523fb9c..0000000
--- a/pkg/front_end/testcases/named_parameters.dart.outline.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Superclass extends core::Object {
-  synthetic constructor •() → self::Superclass
-    ;
-  method foo({dynamic alpha, dynamic beta}) → dynamic
-    ;
-  method bar({dynamic beta, dynamic alpha}) → dynamic
-    ;
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic
-    ;
-}
-class Subclass extends self::Superclass {
-  synthetic constructor •() → self::Subclass
-    ;
-  method foo({dynamic beta, dynamic alpha}) → dynamic
-    ;
-  method bar({dynamic alpha, dynamic beta}) → dynamic
-    ;
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic
-    ;
-}
-static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma, dynamic delta}) → dynamic
-  ;
-static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma, dynamic delta]) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/named_parameters.dart.strong.expect b/pkg/front_end/testcases/named_parameters.dart.strong.expect
deleted file mode 100644
index 2a59b49..0000000
--- a/pkg/front_end/testcases/named_parameters.dart.strong.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-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 = null, dynamic beta = null}) → dynamic {}
-  method bar({dynamic beta = null, dynamic alpha = null}) → dynamic {}
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {
-    callback.call(alpha: "one", beta: 2);
-    callback.call(beta: 1, alpha: "two");
-  }
-}
-class Subclass extends self::Superclass {
-  synthetic constructor •() → self::Subclass
-    : super self::Superclass::•()
-    ;
-  method foo({dynamic beta = null, dynamic alpha = null}) → dynamic {}
-  method bar({dynamic alpha = null, dynamic beta = null}) → dynamic {}
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {}
-}
-static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma = null, dynamic delta = null}) → dynamic {}
-static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma = null, dynamic delta = null]) → dynamic {}
-static method main() → dynamic {
-  new self::Subclass::•().{self::Subclass::foo}(beta: 1, alpha: 2);
-  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
-  self::topLevelNamed(1, 2, gamma: 3, delta: 4);
-  self::topLevelNamed(1, 2, delta: 3, gamma: 4);
-}
diff --git a/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect b/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect
deleted file mode 100644
index 2a59b49..0000000
--- a/pkg/front_end/testcases/named_parameters.dart.strong.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-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 = null, dynamic beta = null}) → dynamic {}
-  method bar({dynamic beta = null, dynamic alpha = null}) → dynamic {}
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {
-    callback.call(alpha: "one", beta: 2);
-    callback.call(beta: 1, alpha: "two");
-  }
-}
-class Subclass extends self::Superclass {
-  synthetic constructor •() → self::Subclass
-    : super self::Superclass::•()
-    ;
-  method foo({dynamic beta = null, dynamic alpha = null}) → dynamic {}
-  method bar({dynamic alpha = null, dynamic beta = null}) → dynamic {}
-  method namedCallback(({alpha: core::String, beta: core::int}) → dynamic callback) → dynamic {}
-}
-static method topLevelNamed(dynamic beta, dynamic alpha, {dynamic gamma = null, dynamic delta = null}) → dynamic {}
-static method topLevelOptional(dynamic beta, dynamic alpha, [dynamic gamma = null, dynamic delta = null]) → dynamic {}
-static method main() → dynamic {
-  new self::Subclass::•().{self::Subclass::foo}(beta: 1, alpha: 2);
-  new self::Subclass::•().{self::Subclass::foo}(alpha: 1, beta: 2);
-  self::topLevelNamed(1, 2, gamma: 3, delta: 4);
-  self::topLevelNamed(1, 2, delta: 3, gamma: 4);
-}
diff --git a/pkg/front_end/testcases/native_as_name.dart.legacy.expect b/pkg/front_end/testcases/native_as_name.dart.legacy.expect
deleted file mode 100644
index b2691b8..0000000
--- a/pkg/front_end/testcases/native_as_name.dart.legacy.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-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::•()
-    ;
-}
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-  method native() → core::String
-    return "method";
-}
-abstract class Y1 extends core::Object {
-  synthetic constructor •() → self::Y1
-    : super core::Object::•()
-    ;
-  abstract get native() → core::String;
-}
-class Y2 extends self::Y1 {
-  synthetic constructor •() → self::Y2
-    : super self::Y1::•()
-    ;
-  @core::override
-  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;
-}
-static method main() → dynamic {
-  core::print(new self::W::•().native);
-  core::print(new self::X::•().native());
-  core::print(new self::Y2::•().native);
-  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
-}
diff --git a/pkg/front_end/testcases/native_as_name.dart.legacy.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.legacy.transformed.expect
deleted file mode 100644
index b2691b8..0000000
--- a/pkg/front_end/testcases/native_as_name.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-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::•()
-    ;
-}
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-  method native() → core::String
-    return "method";
-}
-abstract class Y1 extends core::Object {
-  synthetic constructor •() → self::Y1
-    : super core::Object::•()
-    ;
-  abstract get native() → core::String;
-}
-class Y2 extends self::Y1 {
-  synthetic constructor •() → self::Y2
-    : super self::Y1::•()
-    ;
-  @core::override
-  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;
-}
-static method main() → dynamic {
-  core::print(new self::W::•().native);
-  core::print(new self::X::•().native());
-  core::print(new self::Y2::•().native);
-  core::print((let final dynamic #t1 = new self::Z::•() in let final dynamic #t2 = #t1.native = "setter" in #t1).f);
-}
diff --git a/pkg/front_end/testcases/native_as_name.dart.outline.expect b/pkg/front_end/testcases/native_as_name.dart.outline.expect
deleted file mode 100644
index c2df01d..0000000
--- a/pkg/front_end/testcases/native_as_name.dart.outline.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class W extends core::Object {
-  field core::String native;
-  constructor •() → self::W
-    ;
-}
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    ;
-  method native() → core::String
-    ;
-}
-abstract class Y1 extends core::Object {
-  synthetic constructor •() → self::Y1
-    ;
-  abstract get native() → core::String;
-}
-class Y2 extends self::Y1 {
-  synthetic constructor •() → self::Y2
-    ;
-  @core::override
-  get native() → core::String
-    ;
-}
-class Z extends core::Object {
-  field core::String f;
-  synthetic constructor •() → self::Z
-    ;
-  set native(core::String s) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/native_as_name.dart.strong.expect b/pkg/front_end/testcases/native_as_name.dart.strong.expect
deleted file mode 100644
index f8d53d9..0000000
--- a/pkg/front_end/testcases/native_as_name.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-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::•()
-    ;
-}
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-  method native() → core::String
-    return "method";
-}
-abstract class Y1 extends core::Object {
-  synthetic constructor •() → self::Y1
-    : super core::Object::•()
-    ;
-  abstract get native() → core::String;
-}
-class Y2 extends self::Y1 {
-  synthetic constructor •() → self::Y2
-    : super self::Y1::•()
-    ;
-  @core::override
-  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;
-}
-static method main() → dynamic {
-  core::print(new self::W::•().{self::W::native});
-  core::print(new self::X::•().{self::X::native}());
-  core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z #t1 = new self::Z::•() in let final dynamic #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
-}
diff --git a/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect b/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
deleted file mode 100644
index beb0031..0000000
--- a/pkg/front_end/testcases/native_as_name.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-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::•()
-    ;
-}
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-  method native() → core::String
-    return "method";
-}
-abstract class Y1 extends core::Object {
-  synthetic constructor •() → self::Y1
-    : super core::Object::•()
-    ;
-  abstract get native() → core::String;
-}
-class Y2 extends self::Y1 {
-  synthetic constructor •() → self::Y2
-    : super self::Y1::•()
-    ;
-  @core::override
-  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;
-}
-static method main() → dynamic {
-  core::print(new self::W::•().{self::W::native});
-  core::print(new self::X::•().{self::X::native}());
-  core::print(new self::Y2::•().{self::Y2::native});
-  core::print((let final self::Z #t1 = new self::Z::•() in let final core::String #t2 = #t1.{self::Z::native} = "setter" in #t1).{self::Z::f});
-}
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.expect
deleted file mode 100644
index bbe754b..0000000
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::int bar;
-  const constructor •(core::int bar) → self::A
-    : self::A::bar = bar, super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  final field self::A baz;
-  const constructor •(self::A baz) → self::B
-    : self::B::baz = baz, super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method fun() → dynamic {
-    new self::B::•(new self::A::•(self::foo));
-  }
-}
-static const field core::int foo = const core::int::fromEnvironment("fisk");
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.transformed.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
deleted file mode 100644
index bbe754b..0000000
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::int bar;
-  const constructor •(core::int bar) → self::A
-    : self::A::bar = bar, super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  final field self::A baz;
-  const constructor •(self::A baz) → self::B
-    : self::B::baz = baz, super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method fun() → dynamic {
-    new self::B::•(new self::A::•(self::foo));
-  }
-}
-static const field core::int foo = const core::int::fromEnvironment("fisk");
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect
deleted file mode 100644
index 00b4657..0000000
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.outline.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::int bar;
-  const constructor •(core::int bar) → self::A
-    ;
-}
-class B extends core::Object {
-  final field self::A baz;
-  const constructor •(self::A baz) → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method fun() → dynamic
-    ;
-}
-static const field core::int foo = const core::int::fromEnvironment("fisk");
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.expect
deleted file mode 100644
index bbe754b..0000000
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::int bar;
-  const constructor •(core::int bar) → self::A
-    : self::A::bar = bar, super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  final field self::A baz;
-  const constructor •(self::A baz) → self::B
-    : self::B::baz = baz, super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method fun() → dynamic {
-    new self::B::•(new self::A::•(self::foo));
-  }
-}
-static const field core::int foo = const core::int::fromEnvironment("fisk");
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.transformed.expect b/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.transformed.expect
deleted file mode 100644
index bbe754b..0000000
--- a/pkg/front_end/testcases/nested_implicit_const_with_env_var.dart.strong.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  final field core::int bar;
-  const constructor •(core::int bar) → self::A
-    : self::A::bar = bar, super core::Object::•()
-    ;
-}
-class B extends core::Object {
-  final field self::A baz;
-  const constructor •(self::A baz) → self::B
-    : self::B::baz = baz, super core::Object::•()
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method fun() → dynamic {
-    new self::B::•(new self::A::•(self::foo));
-  }
-}
-static const field core::int foo = const core::int::fromEnvironment("fisk");
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect
index 19107e3..f644734 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  const constructor •(core::int x) → self::A
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
     : self::A::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::int foo = 42;
+  core::int* foo = 42;
   new self::A::•(5);
   new self::A::•(5.+(5));
   new self::A::•(foo);
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect
index 19107e3..f644734 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  const constructor •(core::int x) → self::A
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
     : self::A::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::int foo = 42;
+  core::int* foo = 42;
   new self::A::•(5);
   new self::A::•(5.+(5));
   new self::A::•(foo);
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.outline.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.outline.expect
index d6fdb25..5092f40 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.outline.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.outline.expect
@@ -3,8 +3,9 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  const constructor •(core::int x) → self::A
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
+    : self::A::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.expect
index 45e1e48..60b3c97 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  const constructor •(core::int x) → self::A
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
     : self::A::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::int foo = 42;
+  core::int* foo = 42;
   new self::A::•(5);
   new self::A::•(5.{core::num::+}(5));
   new self::A::•(foo);
diff --git a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
index 45e1e48..60b3c97 100644
--- a/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/new_const_insertion/simple.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  const constructor •(core::int x) → self::A
+  final field core::int* x;
+  const constructor •(core::int* x) → self::A*
     : self::A::x = x, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::int foo = 42;
+  core::int* foo = 42;
   new self::A::•(5);
   new self::A::•(5.{core::num::+}(5));
   new self::A::•(foo);
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.expect
index f852bba..23f6081 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.expect
@@ -40,18 +40,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int field = null;
-  synthetic constructor •() → self::Foo
+  field core::int* field = null;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  abstract method bar(core::int x) → core::int;
+  abstract method bar(core::int* x) → core::int*;
 }
 static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
+  self::Foo* foo = new self::Foo::•();
   foo.field = 5;
   foo.bar(6);
   self::test_nullable_function_type_formal_param(f: () → dynamic => 2);
 }
-static method test_nullable_function_type_formal_param({() → core::int f = null}) → core::int {
+static method test_nullable_function_type_formal_param({() →* core::int* f = #C1}) → core::int* {
   return let final dynamic #t1 = f.call() in #t1.==(null) ? 1.unary-() : #t1;
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.transformed.expect
index f852bba..23f6081 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.legacy.transformed.expect
@@ -40,18 +40,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int field = null;
-  synthetic constructor •() → self::Foo
+  field core::int* field = null;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  abstract method bar(core::int x) → core::int;
+  abstract method bar(core::int* x) → core::int*;
 }
 static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
+  self::Foo* foo = new self::Foo::•();
   foo.field = 5;
   foo.bar(6);
   self::test_nullable_function_type_formal_param(f: () → dynamic => 2);
 }
-static method test_nullable_function_type_formal_param({() → core::int f = null}) → core::int {
+static method test_nullable_function_type_formal_param({() →* core::int* f = #C1}) → core::int* {
   return let final dynamic #t1 = f.call() in #t1.==(null) ? 1.unary-() : #t1;
 }
+
+constants  {
+  #C1 = null
+}
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
index f909c50..b50f3c71 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.outline.expect
@@ -40,12 +40,12 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int field;
-  synthetic constructor •() → self::Foo
+  field core::int* field;
+  synthetic constructor •() → self::Foo*
     ;
-  abstract method bar(core::int x) → core::int;
+  abstract method bar(core::int* x) → core::int*;
 }
 static method main() → dynamic
   ;
-static method test_nullable_function_type_formal_param({() → core::int f}) → core::int
+static method test_nullable_function_type_formal_param({() →* core::int* f}) → core::int*
   ;
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.expect
index 81c9259..77fe6d8 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.expect
@@ -40,18 +40,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int field = null;
-  synthetic constructor •() → self::Foo
+  field core::int* field = null;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  abstract method bar(core::int x) → core::int;
+  abstract method bar(core::int* x) → core::int*;
 }
 static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
+  self::Foo* foo = new self::Foo::•();
   foo.{self::Foo::field} = 5;
   foo.{self::Foo::bar}(6);
-  self::test_nullable_function_type_formal_param(f: () → core::int => 2);
+  self::test_nullable_function_type_formal_param(f: () → core::int* => 2);
 }
-static method test_nullable_function_type_formal_param({() → core::int f = null}) → core::int {
-  return let final core::int #t1 = f.call() in #t1.==(null) ?{core::int} 1.{core::int::unary-}() : #t1;
+static method test_nullable_function_type_formal_param({() →* core::int* f = #C1}) → core::int* {
+  return let final core::int* #t1 = f.call() in #t1.==(null) ?{core::int*} 1.{core::int::unary-}() : #t1;
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
index 81c9259..77fe6d8 100644
--- a/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/nnbd/nullable_param.dart.strong.transformed.expect
@@ -40,18 +40,22 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  field core::int field = null;
-  synthetic constructor •() → self::Foo
+  field core::int* field = null;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  abstract method bar(core::int x) → core::int;
+  abstract method bar(core::int* x) → core::int*;
 }
 static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
+  self::Foo* foo = new self::Foo::•();
   foo.{self::Foo::field} = 5;
   foo.{self::Foo::bar}(6);
-  self::test_nullable_function_type_formal_param(f: () → core::int => 2);
+  self::test_nullable_function_type_formal_param(f: () → core::int* => 2);
 }
-static method test_nullable_function_type_formal_param({() → core::int f = null}) → core::int {
-  return let final core::int #t1 = f.call() in #t1.==(null) ?{core::int} 1.{core::int::unary-}() : #t1;
+static method test_nullable_function_type_formal_param({() →* core::int* f = #C1}) → core::int* {
+  return let final core::int* #t1 = f.call() in #t1.==(null) ?{core::int*} 1.{core::int::unary-}() : #t1;
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect
index d420935..a75eef1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::I
+  field core::int* foo = null;
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -37,3 +37,11 @@
   self::expectTypeError(() → dynamic => a.foo);
   self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect
index d420935..a75eef1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.legacy.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::I
+  field core::int* foo = null;
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -37,3 +37,11 @@
   self::expectTypeError(() → dynamic => a.foo);
   self::expectTypeError(() → dynamic => (a as dynamic).foo = "bar");
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
index e7230a4..249511a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.outline.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  field core::int foo;
-  synthetic constructor •() → self::I
+  field core::int* foo;
+  synthetic constructor •() → self::I*
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
-static method expectTypeError(() → dynamic callback) → void
+static method expectTypeError(() →* dynamic callback) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
index 8387d6d..d0abe78 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.expect
@@ -3,37 +3,45 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::I
+  field core::int* foo = null;
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  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});
-  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+  self::A* a = new self::A::•();
+  self::expectTypeError(() → core::int* => a.{self::I::foo});
+  self::expectTypeError(() → core::String* => (a as dynamic).foo = "bar");
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
index 8387d6d..d0abe78 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field.dart.strong.transformed.expect
@@ -3,37 +3,45 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::I
+  field core::int* foo = null;
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  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});
-  self::expectTypeError(() → core::String => (a as dynamic).foo = "bar");
+  self::A* a = new self::A::•();
+  self::expectTypeError(() → core::int* => a.{self::I::foo});
+  self::expectTypeError(() → core::String* => (a as dynamic).foo = "bar");
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect
index fa7bf1f..209d2fd 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.expect
@@ -3,38 +3,38 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.+(1);
     return null;
   }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 abstract class _C&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B*
     : super core::Object::•()
     ;
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&Object&B::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  set foo(core::int value) → void {}
+  set foo(core::int* value) → void {}
 }
-static field core::int count = 0;
+static field core::int* count = 0;
 static method main() → dynamic {
   dynamic c = new self::C::•();
   if(!c.foo.==(42)) {
@@ -45,3 +45,11 @@
     throw "Value mismatch: count != 0";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect
index dae5f70..8d92b84 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.legacy.transformed.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.+(1);
     return null;
   }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 abstract class _C&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.+(1);
     return null;
   }
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&Object&B::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  set foo(core::int value) → void {}
+  set foo(core::int* value) → void {}
 }
-static field core::int count = 0;
+static field core::int* count = 0;
 static method main() → dynamic {
   dynamic c = new self::C::•();
   if(!c.foo.==(42)) {
@@ -49,3 +49,11 @@
     throw "Value mismatch: count != 0";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
index 11ba2e6..d24cfba 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.outline.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo;
-  synthetic constructor •() → self::A
+  field core::int* foo;
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 abstract class _C&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B*
     : super core::Object::•()
     ;
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  get foo() → core::int
+  get foo() → core::int*
     ;
-  set foo(core::int value) → void
+  set foo(core::int* value) → void
     ;
 }
-static field core::int count;
+static field core::int* count;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
index 44c8cbf..e95119b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.{core::num::+}(1);
     return null;
   }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 abstract class _C&Object&B = core::Object with self::B {
-  const synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B*
     : super core::Object::•()
     ;
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&Object&B::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  set foo(core::int value) → void {}
+  set foo(core::int* value) → void {}
 }
-static field core::int count = 0;
+static field core::int* count = 0;
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   if(!c.{self::C::foo}.{core::num::==}(42)) {
     throw "Value mismatch: c.foo != 42.";
   }
@@ -45,3 +45,11 @@
     throw "Value mismatch: count != 0";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
index 0685d8a..8e06be7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_arent_mixed_in.dart.strong.transformed.expect
@@ -3,44 +3,44 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.{core::num::+}(1);
     return null;
   }
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} 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)));
 }
 abstract class _C&Object&B extends core::Object implements self::B {
-  const synthetic constructor •() → self::_C&Object&B
+  const synthetic constructor •() → self::_C&Object&B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     self::count = self::count.{core::num::+}(1);
     return null;
   }
 }
 class C extends self::_C&Object&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&Object&B::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  set foo(core::int value) → void {}
+  set foo(core::int* value) → void {}
 }
-static field core::int count = 0;
+static field core::int* count = 0;
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   if(!c.{self::C::foo}.{core::num::==}(42)) {
     throw "Value mismatch: c.foo != 42.";
   }
@@ -49,3 +49,11 @@
     throw "Value mismatch: count != 0";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect
index b172437..a325a2e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.expect
@@ -3,48 +3,48 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int value) → void {}
-  method noSuchMethod(core::Invocation i) → dynamic
+  set foo(core::int* value) → void {}
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -53,3 +53,11 @@
   dynamic e = new self::E::•();
   self::expectTypeError(() → dynamic => e.foo);
 }
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect
index b172437..a325a2e 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.legacy.transformed.expect
@@ -3,48 +3,48 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int value) → void {}
-  method noSuchMethod(core::Invocation i) → dynamic
+  set foo(core::int* value) → void {}
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -53,3 +53,11 @@
   dynamic e = new self::E::•();
   self::expectTypeError(() → dynamic => e.foo);
 }
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
index ed38e84..d228612 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.outline.expect
@@ -3,39 +3,39 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo;
-  synthetic constructor •() → self::A
+  field core::int* foo;
+  synthetic constructor •() → self::A*
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get foo() → core::int
+  get foo() → core::int*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  no-such-method-forwarder set foo(core::int value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder set foo(core::int* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  set foo(core::int value) → void
+  set foo(core::int* value) → void
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
 }
-static method expectTypeError(() → dynamic callback) → void
+static method expectTypeError(() →* dynamic callback) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
index 7417039..928ca75 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.expect
@@ -3,53 +3,61 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int value) → void {}
-  method noSuchMethod(core::Invocation i) → dynamic
+  set foo(core::int* value) → void {}
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
-  self::E e = new self::E::•();
-  self::expectTypeError(() → core::int => e.{self::A::foo});
+  self::C* c = new self::C::•();
+  self::expectTypeError(() → core::String* => (c as dynamic).foo = "bar");
+  self::E* e = new self::E::•();
+  self::expectTypeError(() → core::int* => e.{self::A::foo});
+}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
index 7417039..928ca75 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_one_defined.dart.strong.transformed.expect
@@ -3,53 +3,61 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  field core::int foo = null;
-  synthetic constructor •() → self::A
+  field core::int* foo = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 abstract class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get foo() → core::int
+  get foo() → core::int*
     return 42;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 abstract class D extends core::Object implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  set foo(core::int value) → void {}
-  method noSuchMethod(core::Invocation i) → dynamic
+  set foo(core::int* value) → void {}
+  method noSuchMethod(core::Invocation* i) → dynamic
     return "bar";
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  no-such-method-forwarder get foo() → core::int
-    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder get foo() → core::int*
+    return this.{self::D::noSuchMethod}(new core::_InvocationMirror::_withType(#C5, 1, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::expectTypeError(() → core::String => (c as dynamic).foo = "bar");
-  self::E e = new self::E::•();
-  self::expectTypeError(() → core::int => e.{self::A::foo});
+  self::C* c = new self::C::•();
+  self::expectTypeError(() → core::String* => (c as dynamic).foo = "bar");
+  self::E* e = new self::E::•();
+  self::expectTypeError(() → core::int* => e.{self::A::foo});
+}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
index 3daf444..1c21e69 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<X extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → self::A<self::A::X>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X*>* foo = null;
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return <dynamic>[];
-  no-such-method-forwarder get foo() → core::List<core::int>
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::List<core::int>;
-  no-such-method-forwarder set foo(core::List<core::int> value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} core::List<core::int*>*;
+  no-such-method-forwarder set foo(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)));
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -32,3 +32,11 @@
   self::expectTypeError(() → dynamic => b.foo);
   self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
index 3daf444..1c21e69 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.legacy.transformed.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<X extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → self::A<self::A::X>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X*>* foo = null;
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return <dynamic>[];
-  no-such-method-forwarder get foo() → core::List<core::int>
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::List<core::int>;
-  no-such-method-forwarder set foo(core::List<core::int> value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} core::List<core::int*>*;
+  no-such-method-forwarder set foo(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)));
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
 static method main() → dynamic {
@@ -32,3 +32,11 @@
   self::expectTypeError(() → dynamic => b.foo);
   self::expectTypeError(() → dynamic => (b as dynamic).foo = <dynamic>[]);
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
index 0cdcb88..a96d89a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.outline.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<X extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::X> foo;
-  synthetic constructor •() → self::A<self::A::X>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X*>* foo;
+  synthetic constructor •() → self::A<self::A::X*>*
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  no-such-method-forwarder get foo() → core::List<core::int>
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::List<core::int>;
-  no-such-method-forwarder set foo(core::List<core::int> value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder get foo() → core::List<core::int*>*
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::List<core::int*>*;
+  no-such-method-forwarder set foo(core::List<core::int*>* value) → void
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
-static method expectTypeError(() → dynamic callback) → void
+static method expectTypeError(() →* dynamic callback) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
index a705020..2291f79 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.expect
@@ -2,33 +2,41 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<X extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → self::A<self::A::X>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X*>* foo = null;
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return <dynamic>[];
-  no-such-method-forwarder get foo() → core::List<core::int>
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::List<core::int>;
-  no-such-method-forwarder set foo(core::List<core::int> value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} core::List<core::int*>*;
+  no-such-method-forwarder set foo(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)));
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  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});
-  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+  self::B* b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int*>* => b.{self::A::foo});
+  self::expectTypeError(() → core::List<dynamic>* => (b as dynamic).foo = <dynamic>[]);
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
index a705020..2291f79 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_accessors_from_field_with_substitution.dart.strong.transformed.expect
@@ -2,33 +2,41 @@
 import self as self;
 import "dart:core" as core;
 
-abstract class A<X extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field core::List<self::A::X> foo = null;
-  synthetic constructor •() → self::A<self::A::X>
+abstract class A<X extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field core::List<self::A::X*>* foo = null;
+  synthetic constructor •() → self::A<self::A::X*>*
     : super core::Object::•()
     ;
 }
-class B extends core::Object implements self::A<core::int> {
-  synthetic constructor •() → self::B
+class B extends core::Object implements self::A<core::int*> {
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return <dynamic>[];
-  no-such-method-forwarder get foo() → core::List<core::int>
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::List<core::int>;
-  no-such-method-forwarder set foo(core::List<core::int> value) → void
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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))) as{TypeError} core::List<core::int*>*;
+  no-such-method-forwarder set foo(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)));
 }
-static method expectTypeError(() → dynamic callback) → void {
+static method expectTypeError(() →* dynamic callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  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});
-  self::expectTypeError(() → core::List<dynamic> => (b as dynamic).foo = <dynamic>[]);
+  self::B* b = new self::B::•();
+  self::expectTypeError(() → core::List<core::int*>* => b.{self::A::foo});
+  self::expectTypeError(() → core::List<dynamic>* => (b as dynamic).foo = <dynamic>[]);
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #foo=
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect
index 70d1e0e..72551ea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect
index 70d1e0e..72551ea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.legacy.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
index aee0639..152c1b8 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
index 70d1e0e..72551ea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
index 70d1e0e..72551ea 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/abstract_interface_nsm_inherited.dart.strong.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect
index b71a516..80a80e1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.expect
@@ -3,34 +3,41 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
   no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
 }
 abstract class _C&A&B = self::A with self::B {
-  synthetic constructor •() → self::_C&A&B
+  synthetic constructor •() → self::_C&A&B*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect
index 7cd29a7..29e5abb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.legacy.transformed.expect
@@ -3,36 +3,43 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
   no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
 }
 abstract class _C&A&B extends self::A implements self::B {
-  synthetic constructor •() → self::_C&A&B
+  synthetic constructor •() → self::_C&A&B*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
index f04505e..2ad76c7 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.outline.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   method foo() → dynamic
     ;
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     ;
   no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} dynamic;
 }
 abstract class _C&A&B = self::A with self::B {
-  synthetic constructor •() → self::_C&A&B
+  synthetic constructor •() → self::_C&A&B*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
index b71a516..80a80e1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.expect
@@ -3,34 +3,41 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
   no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
 }
 abstract class _C&A&B = self::A with self::B {
-  synthetic constructor •() → self::_C&A&B
+  synthetic constructor •() → self::_C&A&B*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
index 7cd29a7..29e5abb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/concrete_method_over_forwarder_in_mixin_application.dart.strong.transformed.expect
@@ -3,36 +3,43 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {}
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
   no-such-method-forwarder method foo() → dynamic
-    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
+    return this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} dynamic;
 }
 abstract class _C&A&B extends self::A implements self::B {
-  synthetic constructor •() → self::_C&A&B
+  synthetic constructor •() → self::_C&A&B*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation _) → dynamic
+  method noSuchMethod(core::Invocation* _) → dynamic
     return null;
 }
 class C extends self::_C&A&B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&B::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect
index 3add7c4..6313c0d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    if(i.memberName.==(#foo)) {
-      return i.namedArguments.[](#bar);
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    if(i.memberName.==(#C1)) {
+      return i.namedArguments.[](#C2);
     }
     else
-      if(i.memberName.==(#hest)) {
+      if(i.memberName.==(#C3)) {
         return i.positionalArguments.[](0);
       }
     return null;
   }
-  abstract method foo({core::String bar = "baz"}) → core::String;
-  abstract method hest([core::int fisk = 42]) → core::int;
+  abstract method foo({core::String* bar = #C4}) → core::String*;
+  abstract method hest([core::int* fisk = #C5]) → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}))) as{TypeError} core::String;
-  no-such-method-forwarder method hest([core::int fisk = 42]) → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  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}))) as{TypeError} 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))) as{TypeError} core::int*;
 }
 static method main() → dynamic {
-  self::B b = new self::B::•();
+  self::B* b = new self::B::•();
   dynamic value;
   if(!(value = b.foo()).==("baz")) {
     throw "Unexpected value: '${value}'; expected 'baz'.";
@@ -38,3 +38,14 @@
     throw "Unexpected value: '${value}'; expected '42'.";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = #bar
+  #C3 = #hest
+  #C4 = "baz"
+  #C5 = 42
+  #C6 = <core::Type*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect
index 3add7c4..6313c0d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.legacy.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    if(i.memberName.==(#foo)) {
-      return i.namedArguments.[](#bar);
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    if(i.memberName.==(#C1)) {
+      return i.namedArguments.[](#C2);
     }
     else
-      if(i.memberName.==(#hest)) {
+      if(i.memberName.==(#C3)) {
         return i.positionalArguments.[](0);
       }
     return null;
   }
-  abstract method foo({core::String bar = "baz"}) → core::String;
-  abstract method hest([core::int fisk = 42]) → core::int;
+  abstract method foo({core::String* bar = #C4}) → core::String*;
+  abstract method hest([core::int* fisk = #C5]) → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}))) as{TypeError} core::String;
-  no-such-method-forwarder method hest([core::int fisk = 42]) → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  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}))) as{TypeError} 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))) as{TypeError} core::int*;
 }
 static method main() → dynamic {
-  self::B b = new self::B::•();
+  self::B* b = new self::B::•();
   dynamic value;
   if(!(value = b.foo()).==("baz")) {
     throw "Unexpected value: '${value}'; expected 'baz'.";
@@ -38,3 +38,14 @@
     throw "Unexpected value: '${value}'; expected '42'.";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = #bar
+  #C3 = #hest
+  #C4 = "baz"
+  #C5 = 42
+  #C6 = <core::Type*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
index 34ec53c..235d557 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  abstract method foo({core::String bar}) → core::String;
-  abstract method hest([core::int fisk]) → core::int;
+  abstract method foo({core::String* bar = "baz"}) → core::String*;
+  abstract method hest([core::int* fisk = 42]) → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  no-such-method-forwarder method foo({core::String bar}) → core::String
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}))) as{TypeError} core::String;
-  no-such-method-forwarder method hest([core::int fisk]) → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo({core::String* bar}) → core::String*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(<core::Symbol*, dynamic>{#bar: bar}))) as{TypeError} core::String*;
+  no-such-method-forwarder method hest([core::int* fisk]) → core::int*
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.expect
index 075405d..860c12b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    if(i.{core::Invocation::memberName}.{core::Symbol::==}(#foo)) {
-      return i.{core::Invocation::namedArguments}.{core::Map::[]}(#bar);
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    if(i.{core::Invocation::memberName}.{core::Symbol::==}(#C1)) {
+      return i.{core::Invocation::namedArguments}.{core::Map::[]}(#C2);
     }
     else
-      if(i.{core::Invocation::memberName}.{core::Symbol::==}(#hest)) {
+      if(i.{core::Invocation::memberName}.{core::Symbol::==}(#C3)) {
         return i.{core::Invocation::positionalArguments}.{core::List::[]}(0);
       }
     return null;
   }
-  abstract method foo({core::String bar = "baz"}) → core::String;
-  abstract method hest([core::int fisk = 42]) → core::int;
+  abstract method foo({core::String* bar = #C4}) → core::String*;
+  abstract method hest([core::int* fisk = #C5]) → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}))) as{TypeError} core::String;
-  no-such-method-forwarder method hest([core::int fisk = 42]) → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  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}))) as{TypeError} 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))) as{TypeError} core::int*;
 }
 static method main() → dynamic {
-  self::B b = new self::B::•();
+  self::B* b = new self::B::•();
   dynamic value;
   if(!(value = b.{self::A::foo}()).{core::String::==}("baz")) {
     throw "Unexpected value: '${value}'; expected 'baz'.";
@@ -38,3 +38,14 @@
     throw "Unexpected value: '${value}'; expected '42'.";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = #bar
+  #C3 = #hest
+  #C4 = "baz"
+  #C5 = 42
+  #C6 = <core::Type*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.transformed.expect
index 075405d..860c12b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/default_argument_values.dart.strong.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
-    if(i.{core::Invocation::memberName}.{core::Symbol::==}(#foo)) {
-      return i.{core::Invocation::namedArguments}.{core::Map::[]}(#bar);
+  method noSuchMethod(core::Invocation* i) → dynamic {
+    if(i.{core::Invocation::memberName}.{core::Symbol::==}(#C1)) {
+      return i.{core::Invocation::namedArguments}.{core::Map::[]}(#C2);
     }
     else
-      if(i.{core::Invocation::memberName}.{core::Symbol::==}(#hest)) {
+      if(i.{core::Invocation::memberName}.{core::Symbol::==}(#C3)) {
         return i.{core::Invocation::positionalArguments}.{core::List::[]}(0);
       }
     return null;
   }
-  abstract method foo({core::String bar = "baz"}) → core::String;
-  abstract method hest([core::int fisk = 42]) → core::int;
+  abstract method foo({core::String* bar = #C4}) → core::String*;
+  abstract method hest([core::int* fisk = #C5]) → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  no-such-method-forwarder method foo({core::String bar = "baz"}) → core::String
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#bar: bar}))) as{TypeError} core::String;
-  no-such-method-forwarder method hest([core::int fisk = 42]) → core::int
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#hest, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[fisk]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  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}))) as{TypeError} 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))) as{TypeError} core::int*;
 }
 static method main() → dynamic {
-  self::B b = new self::B::•();
+  self::B* b = new self::B::•();
   dynamic value;
   if(!(value = b.{self::A::foo}()).{core::String::==}("baz")) {
     throw "Unexpected value: '${value}'; expected 'baz'.";
@@ -38,3 +38,14 @@
     throw "Unexpected value: '${value}'; expected '42'.";
   }
 }
+
+constants  {
+  #C1 = #foo
+  #C2 = #bar
+  #C3 = #hest
+  #C4 = "baz"
+  #C5 = 42
+  #C6 = <core::Type*>[]
+  #C7 = <dynamic>[]
+  #C8 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C7}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect
index 6ed69b8c..62cd5e1a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect
index 6ed69b8c..62cd5e1a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.legacy.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
index 7b55b76..c6b5f2d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.outline.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.expect
index 6ed69b8c..62cd5e1a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.transformed.expect
index 6ed69b8c..62cd5e1a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/duplicated_abstract_method.dart.strong.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 abstract class I1 extends core::Object {
-  synthetic constructor •() → self::I1
+  synthetic constructor •() → self::I1*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 abstract class I2 extends core::Object {
-  synthetic constructor •() → self::I2
+  synthetic constructor •() → self::I2*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class M extends core::Object implements self::I1, self::I2 {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect
index d4ed912..238f1ad 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.expect
@@ -3,30 +3,37 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect
index a14c6c9..c985876 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.legacy.transformed.expect
@@ -3,32 +3,39 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
index 93b22a1..3f045c4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.outline.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
index d4ed912..238f1ad 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.expect
@@ -3,30 +3,37 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
index a14c6c9..c985876 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/forwarders_not_assumed_from_mixin.dart.strong.transformed.expect
@@ -3,32 +3,39 @@
 import "dart:core" as core;
 
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class A extends core::Object implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect
index b3f6383..0cbcb2c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect
index b3f6383..0cbcb2c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.legacy.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
index ff470649..6c6a433 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.outline.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
   method foo() → void
     ;
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
index b3f6383..0cbcb2c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
index b3f6383..0cbcb2c 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_concrete.dart.strong.transformed.expect
@@ -3,24 +3,31 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
   method foo() → void {}
 }
 class B extends self::A implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect
index 3dfcd26..489451d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.expect
@@ -3,43 +3,50 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect
index 4fcf0c6..3d08a75 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.legacy.transformed.expect
@@ -3,47 +3,54 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
index a887c64..f968d95 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.outline.expect
@@ -3,40 +3,40 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 abstract class _B&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
index 3dfcd26..489451d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.expect
@@ -3,43 +3,50 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
index 4fcf0c6..3d08a75 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/interface_with_nsm.dart.strong.transformed.expect
@@ -3,47 +3,54 @@
 import "dart:core" as core;
 
 class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   no-such-method-forwarder method foo() → void
-    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::I::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class A extends self::_A&Object&M implements self::I {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 abstract class _B&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_B&Object&M
+  const synthetic constructor •() → self::_B&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 class B extends self::_B&Object&M implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&M::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect
index f405f12..f979826 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect
index f405f12..f979826 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.legacy.transformed.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
index e5f2ba8..65ed57a 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.outline.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
index f405f12..f979826 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
index f405f12..f979826 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes.dart.strong.transformed.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect
index 05f2839..88de606 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.expect
@@ -3,28 +3,35 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect
index 05f2839..88de606 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.legacy.transformed.expect
@@ -3,28 +3,35 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
index df83640..3302bb8 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.outline.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
index 05f2839..88de606 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.expect
@@ -3,28 +3,35 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
index 05f2839..88de606 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/no_forwarders_for_abstract_classes_chain.dart.strong.transformed.expect
@@ -3,28 +3,35 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
   abstract method foo() → void;
 }
 abstract class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect
index 20ed588..87ea103 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → self::A
+  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(#call, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #call
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect
index 20ed588..87ea103 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.legacy.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → self::A
+  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(#call, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #call
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
index 6f23c7e..6dbde99 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.outline.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
 }
 class A extends self::M {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  no-such-method-forwarder method call(core::String s) → void
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#call, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  no-such-method-forwarder method call(core::String* s) → void
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#call, 0, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.expect
index 20ed588..87ea103 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → self::A
+  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(#call, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #call
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.transformed.expect
index 20ed588..87ea103 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_inherited.dart.strong.transformed.expect
@@ -3,17 +3,24 @@
 import "dart:core" as core;
 
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
 }
 class A extends self::M {
-  synthetic constructor •() → self::A
+  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(#call, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[s]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  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>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #call
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect
index 3ca45b1..b7294d2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.expect
@@ -3,23 +3,30 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect
index f9187d1..5da9029 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.legacy.transformed.expect
@@ -3,26 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
index 7cfd576..de8e57b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
index 3ca45b1..b7294d2 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.expect
@@ -3,23 +3,30 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _B&Object&A = core::Object with self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
index f9187d1..5da9029 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/nsm_mixed_in.dart.strong.transformed.expect
@@ -3,26 +3,33 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _B&Object&A extends core::Object implements self::A {
-  const synthetic constructor •() → self::_B&Object&A
+  const synthetic constructor •() → self::_B&Object&A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 class B extends self::_B&Object&A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::_B&Object&A::•()
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
index 3afff4b..b06986b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.expect
@@ -6,27 +6,27 @@
 import "org-dartlang-testcase:///private_module.dart";
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Bar
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Baz
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
 
@@ -35,9 +35,16 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → pri::Fisk
+  synthetic constructor •() → pri::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private.dart::_hest
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
index 3afff4b..b06986b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.legacy.transformed.expect
@@ -6,27 +6,27 @@
 import "org-dartlang-testcase:///private_module.dart";
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Bar
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Baz
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
 
@@ -35,9 +35,16 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → pri::Fisk
+  synthetic constructor •() → pri::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private.dart::_hest
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
index 518a7f4..e51936b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.outline.expect
@@ -6,24 +6,24 @@
 import "org-dartlang-testcase:///private_module.dart";
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     ;
   no-such-method-forwarder method /* from org-dartlang-testcase:///private_module.dart */ _hest() → void
-    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#_hest, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Baz
+  synthetic constructor •() → self::Baz*
     ;
   method _hest() → dynamic
     ;
   no-such-method-forwarder method /* from org-dartlang-testcase:///private_module.dart */ _hest() → void
-    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#_hest, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
@@ -33,7 +33,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → pri::Fisk
+  synthetic constructor •() → pri::Fisk*
     ;
   abstract method _hest() → void;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
index 3afff4b..b06986b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.expect
@@ -6,27 +6,27 @@
 import "org-dartlang-testcase:///private_module.dart";
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Bar
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Baz
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
 
@@ -35,9 +35,16 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → pri::Fisk
+  synthetic constructor •() → pri::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private.dart::_hest
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
index 3afff4b..b06986b 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private.dart.strong.transformed.expect
@@ -6,27 +6,27 @@
 import "org-dartlang-testcase:///private_module.dart";
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return 42;
 }
 class Bar extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Bar
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 class Baz extends self::Foo implements pri::Fisk {
-  synthetic constructor •() → self::Baz
+  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(#_hest, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Foo::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
 
@@ -35,9 +35,16 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → pri::Fisk
+  synthetic constructor •() → pri::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private.dart::_hest
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect
index c1d3571..000e1f1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect
index c1d3571..000e1f1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.outline.expect
index 4b1c326..ebf76b6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     ;
   abstract method _hest() → void;
 }
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.expect
index c1d3571..000e1f1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.transformed.expect
index c1d3571..000e1f1 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_module.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   abstract method _hest() → void;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect
index 8e690c1..37af7b9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super self::Foo::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
   no-such-method-forwarder method _foo() → void
-    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_same.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect
index 8e690c1..37af7b9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.legacy.transformed.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super self::Foo::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
   no-such-method-forwarder method _foo() → void
-    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_same.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
index 5e5185d..e23e6d5 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.outline.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     ;
   no-such-method-forwarder method _foo() → void
-    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.expect
index 8e690c1..37af7b9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super self::Foo::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
   no-such-method-forwarder method _foo() → void
-    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_same.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.transformed.expect
index 8e690c1..37af7b9 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/private_same.dart.strong.transformed.expect
@@ -3,18 +3,25 @@
 import "dart:core" as core;
 
 abstract class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   abstract method _foo() → void;
 }
 class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
+  synthetic constructor •() → self::Bar*
     : super self::Foo::•()
     ;
-  method noSuchMethod(core::Invocation invocation) → dynamic
+  method noSuchMethod(core::Invocation* invocation) → dynamic
     return null;
   no-such-method-forwarder method _foo() → void
-    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#_foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::Bar::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #org-dartlang-testcase:///private_same.dart::_foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect
index 9ce6d4f..3960a3d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.expect
@@ -3,13 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect
index 9ce6d4f..3960a3d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.legacy.transformed.expect
@@ -3,13 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
index 9681848..bce75b4 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.expect
index 9ce6d4f..3960a3d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.expect
@@ -3,13 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.transformed.expect
index 9ce6d4f..3960a3d 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/same.dart.strong.transformed.expect
@@ -3,13 +3,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
   no-such-method-forwarder method foo() → void
-    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
index 8fef0c1..9c314a6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.expect
@@ -13,13 +13,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
+  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>(#C4)));
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
index 8fef0c1..9c314a6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.legacy.transformed.expect
@@ -13,13 +13,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
+  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>(#C4)));
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
index f87c303..10a5cb6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.outline.expect
@@ -13,13 +13,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method foo(core::int x) → void
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
+  no-such-method-forwarder set foo(core::int* x) → void
+    return this.{self::A::noSuchMethod}(new core::_InvocationMirror::_withType(#foo=, 2, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
index 8fef0c1..9c314a6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.expect
@@ -13,13 +13,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
+  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>(#C4)));
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
index 8fef0c1..9c314a6 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/setter_not_shadowed_by_method.dart.strong.transformed.expect
@@ -13,13 +13,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  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(#foo=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[x]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  method noSuchMethod(core::Invocation i) → dynamic
+  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>(#C4)));
+  method noSuchMethod(core::Invocation* i) → dynamic
     return null;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo=
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect
index 7711967..ab2e7eb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.expect
@@ -2,30 +2,37 @@
 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>
+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 method foo() → self::I::T*;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
+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::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect
index eb168b2..daf083f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.legacy.transformed.expect
@@ -2,33 +2,40 @@
 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>
+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 method foo() → self::I::T*;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
+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::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
index d96e5bd..d332188 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.outline.expect
@@ -2,27 +2,27 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method foo() → self::I::T;
+  abstract method foo() → self::I::T*;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
+class A extends self::_A&Object&M implements self::I<core::int*> {
+  synthetic constructor •() → self::A*
     ;
-  no-such-method-forwarder method foo() → core::int
-    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) as{TypeError} core::int*;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
index 7711967..ab2e7eb 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.expect
@@ -2,30 +2,37 @@
 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>
+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 method foo() → self::I::T*;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _A&Object&M = core::Object with self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
 }
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
+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::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
index eb168b2..daf083f 100644
--- a/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/no_such_method_forwarders/subst_on_forwarder.dart.strong.transformed.expect
@@ -2,33 +2,40 @@
 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>
+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 method foo() → self::I::T*;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
 abstract class _A&Object&M extends core::Object implements self::M {
-  const synthetic constructor •() → self::_A&Object&M
+  const synthetic constructor •() → self::_A&Object&M*
     : super core::Object::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     return null;
   }
 }
-class A extends self::_A&Object&M implements self::I<core::int> {
-  synthetic constructor •() → self::A
+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::M::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} core::int;
+  no-such-method-forwarder method foo() → core::int*
+    return this.{self::M::noSuchMethod}(new core::_InvocationMirror::_withType(#C1, 0, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))) as{TypeError} core::int*;
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
deleted file mode 100644
index a545e64..0000000
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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::•()
-    ;
-}
-static method baz(no_::Bar bar) → void {
-  return;
-}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
deleted file mode 100644
index a545e64..0000000
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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::•()
-    ;
-}
-static method baz(no_::Bar bar) → void {
-  return;
-}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect
deleted file mode 100644
index 099c2ab..0000000
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-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
-    ;
-  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-static method main() → dynamic
-  ;
-
-library;
-import self as no_;
-import "dart:core" as core;
-
-class Bar extends core::Object {
-  field core::int _x;
-  synthetic constructor •() → no_::Bar
-    ;
-}
-static method baz(no_::Bar bar) → void
-  ;
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect
deleted file mode 100644
index a545e64..0000000
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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::•()
-    ;
-}
-static method baz(no_::Bar bar) → void {
-  return;
-}
diff --git a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
deleted file mode 100644
index a545e64..0000000
--- a/pkg/front_end/testcases/no_such_method_private_setter.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder get /* from org-dartlang-testcase:///no_such_method_private_setter_lib.dart */ _x() → core::int
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x, 1, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_x=, 2, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[value]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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::•()
-    ;
-}
-static method baz(no_::Bar bar) → void {
-  return;
-}
diff --git a/pkg/front_end/testcases/null_aware.dart.legacy.expect b/pkg/front_end/testcases/null_aware.dart.legacy.expect
deleted file mode 100644
index 5695867..0000000
--- a/pkg/front_end/testcases/null_aware.dart.legacy.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  let final dynamic #t1 = foo in #t1.==(null) ? null : #t1.field = 5;
-  self::Foo::staticField = 5;
-  let final dynamic #t2 = foo in #t2.field.==(null) ? #t2.field = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  let final dynamic #t3 = foo in #t3.==(null) ? null : #t3.field.==(null) ? #t3.field = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  core::int intValue = let final dynamic #t4 = foo.field in #t4.==(null) ? 6 : #t4;
-  core::num numValue = let final dynamic #t5 = foo.field in #t5.==(null) ? 4.5 : #t5;
-}
diff --git a/pkg/front_end/testcases/null_aware.dart.legacy.transformed.expect b/pkg/front_end/testcases/null_aware.dart.legacy.transformed.expect
deleted file mode 100644
index 5695867..0000000
--- a/pkg/front_end/testcases/null_aware.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  let final dynamic #t1 = foo in #t1.==(null) ? null : #t1.field = 5;
-  self::Foo::staticField = 5;
-  let final dynamic #t2 = foo in #t2.field.==(null) ? #t2.field = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  let final dynamic #t3 = foo in #t3.==(null) ? null : #t3.field.==(null) ? #t3.field = 5 : null;
-  self::Foo::staticField.==(null) ? self::Foo::staticField = 5 : null;
-  core::int intValue = let final dynamic #t4 = foo.field in #t4.==(null) ? 6 : #t4;
-  core::num numValue = let final dynamic #t5 = foo.field in #t5.==(null) ? 4.5 : #t5;
-}
diff --git a/pkg/front_end/testcases/null_aware.dart.outline.expect b/pkg/front_end/testcases/null_aware.dart.outline.expect
deleted file mode 100644
index 2dda472..0000000
--- a/pkg/front_end/testcases/null_aware.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field core::int field;
-  static field core::int staticField;
-  synthetic constructor •() → self::Foo
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/null_aware.dart.strong.expect b/pkg/front_end/testcases/null_aware.dart.strong.expect
deleted file mode 100644
index 3f3d5e0..0000000
--- a/pkg/front_end/testcases/null_aware.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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::•()
-    ;
-}
-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::num::==}(null) ?{core::int} #t2.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.{core::num::==}(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::num::==}(null) ?{core::int} #t3.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
-  core::int intValue = let final core::int #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int} 6 : #t4;
-  core::num numValue = let final core::int #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num} 4.5 : #t5;
-}
diff --git a/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect
deleted file mode 100644
index 3f3d5e0..0000000
--- a/pkg/front_end/testcases/null_aware.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-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::•()
-    ;
-}
-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::num::==}(null) ?{core::int} #t2.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.{core::num::==}(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::num::==}(null) ?{core::int} #t3.{self::Foo::field} = 5 : null;
-  self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 5 : null;
-  core::int intValue = let final core::int #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int} 6 : #t4;
-  core::num numValue = let final core::int #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num} 4.5 : #t5;
-}
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.legacy.expect b/pkg/front_end/testcases/operator_method_not_found.dart.legacy.expect
deleted file mode 100644
index 69ee9a4..0000000
--- a/pkg/front_end/testcases/operator_method_not_found.dart.legacy.expect
+++ /dev/null
@@ -1,154 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Warning: 'foo' isn't a type.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
-//   print(<foo);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
-//   print(>foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
-//   print(<=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
-//   print(>=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
-//   print(==foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//   print(+foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
-//   print(/foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
-//   print(~/foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
-//   print(*foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
-//   print(%foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
-//   print(|foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
-//   print(^foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
-//   print(&foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
-//   print(<<foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
-//   print(>>foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-//   print(foo ~ 2);
-//             ^
-//
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  core::print(foo.<(2));
-  core::print(foo.>(2));
-  core::print(foo.<=(2));
-  core::print(foo.>=(2));
-  core::print(foo.==(2));
-  core::print(foo.-(2));
-  core::print(foo.+(2));
-  core::print(foo./(2));
-  core::print(foo.~/(2));
-  core::print(foo.*(2));
-  core::print(foo.%(2));
-  core::print(foo.|(2));
-  core::print(foo.^(2));
-  core::print(foo.&(2));
-  core::print(foo.<<(2));
-  core::print(foo.>>(2));
-  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
-  core::print(foo.[](2));
-  core::print(foo.~());
-  core::print(foo.unary-());
-  core::print(<invalid-type>[]);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
-  print(>foo);
-        ^".>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
-  print(<=foo);
-        ^".<=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
-  print(>=foo);
-        ^".>=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
-  print(==foo);
-        ^".==(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
-  print(+foo);
-        ^".+(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
-  print(/foo);
-        ^"./(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
-  print(~/foo);
-        ^".~/(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
-  print(*foo);
-        ^".*(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
-  print(%foo);
-        ^".%(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
-  print(|foo);
-        ^".|(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
-  print(^foo);
-        ^".^(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
-  print(&foo);
-        ^".&(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
-  print(<<foo);
-        ^".<<(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
-  print(>>foo);
-        ^".>>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-  print(foo ~ 2);
-            ^");
-}
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect b/pkg/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect
deleted file mode 100644
index 69ee9a4..0000000
--- a/pkg/front_end/testcases/operator_method_not_found.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,154 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Warning: 'foo' isn't a type.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
-//   print(<foo);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
-//   print(>foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
-//   print(<=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
-//   print(>=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
-//   print(==foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//   print(+foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
-//   print(/foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
-//   print(~/foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
-//   print(*foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
-//   print(%foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
-//   print(|foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
-//   print(^foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
-//   print(&foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
-//   print(<<foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
-//   print(>>foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-//   print(foo ~ 2);
-//             ^
-//
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  core::print(foo.<(2));
-  core::print(foo.>(2));
-  core::print(foo.<=(2));
-  core::print(foo.>=(2));
-  core::print(foo.==(2));
-  core::print(foo.-(2));
-  core::print(foo.+(2));
-  core::print(foo./(2));
-  core::print(foo.~/(2));
-  core::print(foo.*(2));
-  core::print(foo.%(2));
-  core::print(foo.|(2));
-  core::print(foo.^(2));
-  core::print(foo.&(2));
-  core::print(foo.<<(2));
-  core::print(foo.>>(2));
-  core::print(let final dynamic #t1 = foo in let final dynamic #t2 = 2 in let final dynamic #t3 = 2 in let final dynamic #t4 = #t1.[]=(#t2, #t3) in #t3);
-  core::print(foo.[](2));
-  core::print(foo.~());
-  core::print(foo.unary-());
-  core::print(<invalid-type>[]);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
-  print(>foo);
-        ^".>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
-  print(<=foo);
-        ^".<=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
-  print(>=foo);
-        ^".>=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
-  print(==foo);
-        ^".==(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
-  print(+foo);
-        ^".+(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
-  print(/foo);
-        ^"./(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
-  print(~/foo);
-        ^".~/(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
-  print(*foo);
-        ^".*(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
-  print(%foo);
-        ^".%(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
-  print(|foo);
-        ^".|(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
-  print(^foo);
-        ^".^(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
-  print(&foo);
-        ^".&(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
-  print(<<foo);
-        ^".<<(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
-  print(>>foo);
-        ^".>>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-  print(foo ~ 2);
-            ^");
-}
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.outline.expect b/pkg/front_end/testcases/operator_method_not_found.dart.outline.expect
deleted file mode 100644
index 7835c54..0000000
--- a/pkg/front_end/testcases/operator_method_not_found.dart.outline.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.strong.expect b/pkg/front_end/testcases/operator_method_not_found.dart.strong.expect
deleted file mode 100644
index 5399098..0000000
--- a/pkg/front_end/testcases/operator_method_not_found.dart.strong.expect
+++ /dev/null
@@ -1,344 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: 'foo' isn't a type.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
-//   print(<foo);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
-//   print(>foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
-//   print(<=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
-//   print(>=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
-//   print(==foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//   print(+foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
-//   print(/foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
-//   print(~/foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
-//   print(*foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
-//   print(%foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
-//   print(|foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
-//   print(^foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
-//   print(&foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
-//   print(<<foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
-//   print(>>foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-//   print(foo ~ 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
-//   print(foo < 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
-//   print(foo > 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
-//   print(foo <= 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
-//   print(foo >= 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
-//   print(foo - 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
-//   print(foo + 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
-//   print(foo / 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
-//   print(foo ~/ 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
-//   print(foo * 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
-//   print(foo % 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
-//   print(foo | 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
-//   print(foo ^ 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
-//   print(foo & 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
-//   print(foo << 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
-//   print(foo >> 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
-//   print(foo[2] = 2);
-//            ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
-//   print(foo[2]);
-//            ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
-//   print(~foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-//   print(-foo);
-//         ^
-//
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
-  print(foo < 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
-  print(foo > 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
-  print(foo <= 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
-  print(foo >= 2);
-            ^^");
-  core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
-  print(foo - 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-  print(foo + 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
-  print(foo / 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
-  print(foo ~/ 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
-  print(foo * 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
-  print(foo % 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
-  print(foo | 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
-  print(foo ^ 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
-  print(foo & 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
-  print(foo << 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
-  print(foo >> 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 dynamic #t4 = invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
-  print(foo[2] = 2);
-           ^^^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
-  print(foo[2]);
-           ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
-  print(~foo);
-        ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-  print(-foo);
-        ^");
-  core::print(<invalid-type>[]);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
-  print(>foo);
-        ^".>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
-  print(<=foo);
-        ^".<=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
-  print(>=foo);
-        ^".>=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
-  print(==foo);
-        ^".{core::Object::==}(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
-  print(+foo);
-        ^".+(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
-  print(/foo);
-        ^"./(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
-  print(~/foo);
-        ^".~/(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
-  print(*foo);
-        ^".*(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
-  print(%foo);
-        ^".%(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
-  print(|foo);
-        ^".|(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
-  print(^foo);
-        ^".^(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
-  print(&foo);
-        ^".&(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
-  print(<<foo);
-        ^".<<(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
-  print(>>foo);
-        ^".>>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-  print(foo ~ 2);
-            ^");
-}
diff --git a/pkg/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect b/pkg/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect
deleted file mode 100644
index 5399098..0000000
--- a/pkg/front_end/testcases/operator_method_not_found.dart.strong.transformed.expect
+++ /dev/null
@@ -1,344 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: 'foo' isn't a type.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:10: Error: Expected '>' after this.
-//   print(<foo);
-//          ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:36:13: Error: Expected '[' before this.
-//   print(<foo);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: Expected an identifier, but got '>'.
-//   print(>foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: Expected an identifier, but got '<='.
-//   print(<=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: Expected an identifier, but got '>='.
-//   print(>=foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: Expected an identifier, but got '=='.
-//   print(==foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: '+' is not a prefix operator.
-// Try removing '+'.
-//   print(+foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: Expected an identifier, but got '/'.
-//   print(/foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: Expected an identifier, but got '~/'.
-//   print(~/foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: Expected an identifier, but got '*'.
-//   print(*foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: Expected an identifier, but got '%'.
-//   print(%foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: Expected an identifier, but got '|'.
-//   print(|foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: Expected an identifier, but got '^'.
-//   print(^foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: Expected an identifier, but got '&'.
-//   print(&foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: Expected an identifier, but got '<<'.
-//   print(<<foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: Expected an identifier, but got '>>'.
-//   print(>>foo);
-//         ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-//   print(foo ~ 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<'.
-//   print(foo < 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>'.
-//   print(foo > 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<='.
-//   print(foo <= 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>='.
-//   print(foo >= 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '-'.
-//   print(foo - 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '+'.
-//   print(foo + 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '/'.
-//   print(foo / 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~/'.
-//   print(foo ~/ 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '*'.
-//   print(foo * 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '%'.
-//   print(foo % 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '|'.
-//   print(foo | 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '^'.
-//   print(foo ^ 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '&'.
-//   print(foo & 2);
-//             ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '<<'.
-//   print(foo << 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '>>'.
-//   print(foo >> 2);
-//             ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]='.
-//   print(foo[2] = 2);
-//            ^^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '[]'.
-//   print(foo[2]);
-//            ^^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named '~'.
-//   print(~foo);
-//         ^
-//
-// pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
-//  - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-// Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-//   print(-foo);
-//         ^
-//
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:12:13: Error: The method '<' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<'.
-  print(foo < 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:13:13: Error: The method '>' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>'.
-  print(foo > 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:14:13: Error: The method '<=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<='.
-  print(foo <= 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:15:13: Error: The method '>=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>='.
-  print(foo >= 2);
-            ^^");
-  core::print(foo.{core::Object::==}(2));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:17:13: Error: The method '-' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '-'.
-  print(foo - 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:18:13: Error: The method '+' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '+'.
-  print(foo + 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:19:13: Error: The method '/' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '/'.
-  print(foo / 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:20:13: Error: The method '~/' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~/'.
-  print(foo ~/ 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:21:13: Error: The method '*' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '*'.
-  print(foo * 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:22:13: Error: The method '%' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '%'.
-  print(foo % 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:23:13: Error: The method '|' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '|'.
-  print(foo | 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:24:13: Error: The method '^' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '^'.
-  print(foo ^ 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:25:13: Error: The method '&' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '&'.
-  print(foo & 2);
-            ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:26:13: Error: The method '<<' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '<<'.
-  print(foo << 2);
-            ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:27:13: Error: The method '>>' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '>>'.
-  print(foo >> 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 dynamic #t4 = invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:29:12: Error: The method '[]=' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]='.
-  print(foo[2] = 2);
-           ^^^" in #t3);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:30:12: Error: The method '[]' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '[]'.
-  print(foo[2]);
-           ^^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:31:9: Error: The method '~' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named '~'.
-  print(~foo);
-        ^");
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:32:9: Error: The method 'unary-' isn't defined for the class 'Foo'.
- - 'Foo' is from 'pkg/front_end/testcases/operator_method_not_found.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'unary-'.
-  print(-foo);
-        ^");
-  core::print(<invalid-type>[]);
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:37:9: Error: This couldn't be parsed.
-  print(>foo);
-        ^".>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:38:9: Error: This couldn't be parsed.
-  print(<=foo);
-        ^".<=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:39:9: Error: This couldn't be parsed.
-  print(>=foo);
-        ^".>=(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:40:9: Error: This couldn't be parsed.
-  print(==foo);
-        ^".{core::Object::==}(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:41:9: Error: This couldn't be parsed.
-  print(+foo);
-        ^".+(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:42:9: Error: This couldn't be parsed.
-  print(/foo);
-        ^"./(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:43:9: Error: This couldn't be parsed.
-  print(~/foo);
-        ^".~/(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:44:9: Error: This couldn't be parsed.
-  print(*foo);
-        ^".*(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:45:9: Error: This couldn't be parsed.
-  print(%foo);
-        ^".%(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:46:9: Error: This couldn't be parsed.
-  print(|foo);
-        ^".|(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:47:9: Error: This couldn't be parsed.
-  print(^foo);
-        ^".^(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:48:9: Error: This couldn't be parsed.
-  print(&foo);
-        ^".&(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:49:9: Error: This couldn't be parsed.
-  print(<<foo);
-        ^".<<(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:50:9: Error: This couldn't be parsed.
-  print(>>foo);
-        ^".>>(foo));
-  core::print(invalid-expression "pkg/front_end/testcases/operator_method_not_found.dart:54:13: Error: '~' isn't a binary operator.
-  print(foo ~ 2);
-            ^");
-}
diff --git a/pkg/front_end/testcases/operators.dart.legacy.expect b/pkg/front_end/testcases/operators.dart.legacy.expect
deleted file mode 100644
index 639223b..0000000
--- a/pkg/front_end/testcases/operators.dart.legacy.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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;
-}
-static method main(dynamic arguments) → dynamic {
-  dynamic a = new self::Operators::•();
-  dynamic b = new self::Operators::•();
-  a.+(b);
-  a.&(b);
-  a.~();
-  a.|(b);
-  a.^(b);
-  a./(b);
-  a.==(b);
-  a.>(b);
-  a.>=(b);
-  a.[](0);
-  a.[]=(0, b);
-  a.<<(b);
-  a.<(b);
-  a.<=(b);
-  a.*(b);
-  a.%(b);
-  a.>>(b);
-  a.-(b);
-  a.~/(b);
-  a.unary-();
-}
diff --git a/pkg/front_end/testcases/operators.dart.legacy.transformed.expect b/pkg/front_end/testcases/operators.dart.legacy.transformed.expect
deleted file mode 100644
index 639223b..0000000
--- a/pkg/front_end/testcases/operators.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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;
-}
-static method main(dynamic arguments) → dynamic {
-  dynamic a = new self::Operators::•();
-  dynamic b = new self::Operators::•();
-  a.+(b);
-  a.&(b);
-  a.~();
-  a.|(b);
-  a.^(b);
-  a./(b);
-  a.==(b);
-  a.>(b);
-  a.>=(b);
-  a.[](0);
-  a.[]=(0, b);
-  a.<<(b);
-  a.<(b);
-  a.<=(b);
-  a.*(b);
-  a.%(b);
-  a.>>(b);
-  a.-(b);
-  a.~/(b);
-  a.unary-();
-}
diff --git a/pkg/front_end/testcases/operators.dart.outline.expect b/pkg/front_end/testcases/operators.dart.outline.expect
deleted file mode 100644
index 68ed1ff..0000000
--- a/pkg/front_end/testcases/operators.dart.outline.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Operators extends core::Object {
-  synthetic constructor •() → self::Operators
-    ;
-  operator +(dynamic other) → dynamic
-    ;
-  operator &(dynamic other) → dynamic
-    ;
-  operator ~() → dynamic
-    ;
-  operator |(dynamic other) → dynamic
-    ;
-  operator ^(dynamic other) → dynamic
-    ;
-  operator /(dynamic other) → dynamic
-    ;
-  operator ==(dynamic other) → core::bool
-    ;
-  operator >(dynamic other) → dynamic
-    ;
-  operator >=(dynamic other) → dynamic
-    ;
-  operator [](dynamic index) → dynamic
-    ;
-  operator []=(dynamic index, dynamic value) → void
-    ;
-  operator <<(dynamic other) → dynamic
-    ;
-  operator <(dynamic other) → dynamic
-    ;
-  operator <=(dynamic other) → dynamic
-    ;
-  operator *(dynamic other) → dynamic
-    ;
-  operator %(dynamic other) → dynamic
-    ;
-  operator >>(dynamic other) → dynamic
-    ;
-  operator -(dynamic other) → dynamic
-    ;
-  operator ~/(dynamic other) → dynamic
-    ;
-  operator unary-() → dynamic
-    ;
-}
-static method main(dynamic arguments) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/operators.dart.strong.expect b/pkg/front_end/testcases/operators.dart.strong.expect
deleted file mode 100644
index 2c8078c..0000000
--- a/pkg/front_end/testcases/operators.dart.strong.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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;
-}
-static method main(dynamic arguments) → dynamic {
-  self::Operators a = new self::Operators::•();
-  self::Operators b = new self::Operators::•();
-  a.{self::Operators::+}(b);
-  a.{self::Operators::&}(b);
-  a.{self::Operators::~}();
-  a.{self::Operators::|}(b);
-  a.{self::Operators::^}(b);
-  a.{self::Operators::/}(b);
-  a.{self::Operators::==}(b);
-  a.{self::Operators::>}(b);
-  a.{self::Operators::>=}(b);
-  a.{self::Operators::[]}(0);
-  a.{self::Operators::[]=}(0, b);
-  a.{self::Operators::<<}(b);
-  a.{self::Operators::<}(b);
-  a.{self::Operators::<=}(b);
-  a.{self::Operators::*}(b);
-  a.{self::Operators::%}(b);
-  a.{self::Operators::>>}(b);
-  a.{self::Operators::-}(b);
-  a.{self::Operators::~/}(b);
-  a.{self::Operators::unary-}();
-}
diff --git a/pkg/front_end/testcases/operators.dart.strong.transformed.expect b/pkg/front_end/testcases/operators.dart.strong.transformed.expect
deleted file mode 100644
index 2c8078c..0000000
--- a/pkg/front_end/testcases/operators.dart.strong.transformed.expect
+++ /dev/null
@@ -1,72 +0,0 @@
-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;
-}
-static method main(dynamic arguments) → dynamic {
-  self::Operators a = new self::Operators::•();
-  self::Operators b = new self::Operators::•();
-  a.{self::Operators::+}(b);
-  a.{self::Operators::&}(b);
-  a.{self::Operators::~}();
-  a.{self::Operators::|}(b);
-  a.{self::Operators::^}(b);
-  a.{self::Operators::/}(b);
-  a.{self::Operators::==}(b);
-  a.{self::Operators::>}(b);
-  a.{self::Operators::>=}(b);
-  a.{self::Operators::[]}(0);
-  a.{self::Operators::[]=}(0, b);
-  a.{self::Operators::<<}(b);
-  a.{self::Operators::<}(b);
-  a.{self::Operators::<=}(b);
-  a.{self::Operators::*}(b);
-  a.{self::Operators::%}(b);
-  a.{self::Operators::>>}(b);
-  a.{self::Operators::-}(b);
-  a.{self::Operators::~/}(b);
-  a.{self::Operators::unary-}();
-}
diff --git a/pkg/front_end/testcases/optional.dart.outline.expect b/pkg/front_end/testcases/optional.dart.outline.expect
deleted file mode 100644
index 03d2b6e..0000000
--- a/pkg/front_end/testcases/optional.dart.outline.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-  method method(dynamic x, [dynamic y, dynamic z]) → dynamic
-    ;
-}
-abstract class External extends core::Object {
-  synthetic constructor •() → self::External
-    ;
-  abstract method externalMethod(core::int x, [core::int y, core::int z]) → core::String;
-  abstract method listen(self::Listener listener) → void;
-}
-abstract class Listener extends core::Object {
-  synthetic constructor •() → self::Listener
-    ;
-  abstract method event(core::String input, [core::int x, core::int y]) → void;
-}
-class TestListener extends self::Listener {
-  synthetic constructor •() → self::TestListener
-    ;
-  method event(core::String input, [core::int x, core::int y]) → void
-    ;
-}
-class ExtendedListener extends self::Listener {
-  synthetic constructor •() → self::ExtendedListener
-    ;
-  method event(core::String input, [core::int x, core::int y, dynamic z]) → void
-    ;
-}
-class InvalidListener extends core::Object {
-  synthetic constructor •() → self::InvalidListener
-    ;
-  method event(dynamic input, [dynamic x]) → void
-    ;
-}
-external static abstract method createExternal() → self::External;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/optional.dart.strong.expect b/pkg/front_end/testcases/optional.dart.strong.expect
deleted file mode 100644
index d74b9fc..0000000
--- a/pkg/front_end/testcases/optional.dart.strong.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/optional.dart'.
-//  - 'Listener' is from 'pkg/front_end/testcases/optional.dart'.
-// Try changing the type of the parameter, or casting the argument to 'Listener'.
-//   extern.listen(new InvalidListener());
-//                     ^
-//
-// pkg/front_end/testcases/optional.dart:49:28: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing1 = foo.method();
-//                            ^
-//
-// pkg/front_end/testcases/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/optional.dart:51:39: Error: Too few positional arguments: 1 required, 0 given.
-//   var nothing3 = extern.externalMethod();
-//                                       ^
-//
-// pkg/front_end/testcases/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 = null, dynamic z = null]) → dynamic {
-    return "string";
-  }
-}
-abstract class External extends core::Object {
-  synthetic constructor •() → self::External
-    : super core::Object::•()
-    ;
-  abstract method externalMethod(core::int x, [core::int y = null, core::int z = null]) → core::String;
-  abstract method listen(self::Listener listener) → void;
-}
-abstract class Listener extends core::Object {
-  synthetic constructor •() → self::Listener
-    : super core::Object::•()
-    ;
-  abstract method event(core::String input, [core::int x = null, core::int y = null]) → void;
-}
-class TestListener extends self::Listener {
-  synthetic constructor •() → self::TestListener
-    : super self::Listener::•()
-    ;
-  method event(core::String input, [core::int x = null, core::int y = null]) → void {}
-}
-class ExtendedListener extends self::Listener {
-  synthetic constructor •() → self::ExtendedListener
-    : super self::Listener::•()
-    ;
-  method event(core::String input, [core::int x = null, core::int y = null, dynamic z = null]) → void {}
-}
-class InvalidListener extends core::Object {
-  synthetic constructor •() → self::InvalidListener
-    : super core::Object::•()
-    ;
-  method event(dynamic input, [dynamic x = null]) → void {}
-}
-external static abstract method createExternal() → self::External;
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  dynamic string1 = foo.{self::Foo::method}(1);
-  dynamic string2 = foo.{self::Foo::method}(1, 2);
-  dynamic string3 = foo.{self::Foo::method}(1, 2, 3);
-  self::External extern = self::createExternal();
-  core::String string4 = extern.{self::External::externalMethod}(1);
-  core::String string5 = extern.{self::External::externalMethod}(1, 2);
-  core::String string6 = extern.{self::External::externalMethod}(1, 2, 3);
-  extern.{self::External::listen}(new self::TestListener::•());
-  extern.{self::External::listen}(new self::ExtendedListener::•());
-  extern.{self::External::listen}(let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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/optional.dart'.
- - 'Listener' is from 'pkg/front_end/testcases/optional.dart'.
-Try changing the type of the parameter, or casting the argument to 'Listener'.
-  extern.listen(new InvalidListener());
-                    ^" in new self::InvalidListener::•() as{TypeError} self::Listener);
-  dynamic nothing1 = foo.{self::Foo::method}();
-  dynamic nothing2 = foo.{self::Foo::method}(1, 2, 3, 4);
-  core::String nothing3 = extern.{self::External::externalMethod}();
-  core::String nothing4 = extern.{self::External::externalMethod}(1, 2, 3, 4);
-}
diff --git a/pkg/front_end/testcases/outline.status b/pkg/front_end/testcases/outline.status
index 59f7d53..3b44d70 100644
--- a/pkg/front_end/testcases/outline.status
+++ b/pkg/front_end/testcases/outline.status
@@ -2,12 +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.md file.
 
-incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
-redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
-redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/incomplete_field_formal_parameter: Fail # Fasta doesn't recover well
+general/redirecting_factory_chain_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_simple_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeargs_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeparam_test: Fail # Missing support for RedirectingFactoryConstructor.
+general/redirecting_factory_typeparambounds_test: Fail # Missing support for RedirectingFactoryConstructor.
 
 inference/async_closure_return_type_flatten: Fail
 inference/async_closure_return_type_future: Fail
diff --git a/pkg/front_end/testcases/override.dart.legacy.expect b/pkg/front_end/testcases/override.dart.legacy.expect
deleted file mode 100644
index d13c10d..0000000
--- a/pkg/front_end/testcases/override.dart.legacy.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-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::•();
-  }
-}
-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 {
-  dynamic object = args.length.==(0) ? new self::Base::•() : new self::Sub::•();
-  dynamic a = object.method();
-  core::print(a);
-}
diff --git a/pkg/front_end/testcases/override.dart.legacy.transformed.expect b/pkg/front_end/testcases/override.dart.legacy.transformed.expect
deleted file mode 100644
index d13c10d..0000000
--- a/pkg/front_end/testcases/override.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-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::•();
-  }
-}
-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 {
-  dynamic object = args.length.==(0) ? new self::Base::•() : new self::Sub::•();
-  dynamic a = object.method();
-  core::print(a);
-}
diff --git a/pkg/front_end/testcases/override.dart.outline.expect b/pkg/front_end/testcases/override.dart.outline.expect
deleted file mode 100644
index 3f78064..0000000
--- a/pkg/front_end/testcases/override.dart.outline.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-}
-class Bar extends self::Foo {
-  synthetic constructor •() → self::Bar
-    ;
-}
-class Base extends core::Object {
-  synthetic constructor •() → self::Base
-    ;
-  method method() → self::Foo
-    ;
-}
-class Sub extends self::Base {
-  synthetic constructor •() → self::Sub
-    ;
-  method method() → self::Foo
-    ;
-}
-static method main(core::List<core::String> args) → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override.dart.strong.expect b/pkg/front_end/testcases/override.dart.strong.expect
deleted file mode 100644
index d83238df..0000000
--- a/pkg/front_end/testcases/override.dart.strong.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-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::•();
-  }
-}
-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::num::==}(0) ?{self::Base} new self::Base::•() : new self::Sub::•();
-  self::Foo a = object.{self::Base::method}();
-  core::print(a);
-}
diff --git a/pkg/front_end/testcases/override.dart.strong.transformed.expect b/pkg/front_end/testcases/override.dart.strong.transformed.expect
deleted file mode 100644
index d83238df..0000000
--- a/pkg/front_end/testcases/override.dart.strong.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-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::•();
-  }
-}
-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::num::==}(0) ?{self::Base} new self::Base::•() : new self::Sub::•();
-  self::Foo a = object.{self::Base::method}();
-  core::print(a);
-}
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.expect
deleted file mode 100644
index b8259ec..0000000
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-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::•()
-    ;
-  set x(self::A value) → void {}
-  get y() → self::B
-    return null;
-}
-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/override_check_accessor_after_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.transformed.expect
deleted file mode 100644
index b8259ec..0000000
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-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::•()
-    ;
-  set x(self::A value) → void {}
-  get y() → self::B
-    return null;
-}
-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/override_check_accessor_after_inference.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.outline.expect
deleted file mode 100644
index f6baaa1..0000000
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.outline.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  set x(self::A value) → void
-    ;
-  get y() → self::B
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  set x(self::A value) → void
-    ;
-  get y() → self::B
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    ;
-  set x(self::A value) → void
-    ;
-  get y() → self::B
-    ;
-}
-class F extends self::D {
-  synthetic constructor •() → self::F
-    ;
-  set x(self::B value) → void
-    ;
-  get y() → self::A
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
deleted file mode 100644
index b932a13..0000000
--- a/pkg/front_end/testcases/override_check_accessor_after_inference.dart.strong.expect
+++ /dev/null
@@ -1,70 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/override_check_accessor_after_inference.dart'.
-//  - 'B' is from 'pkg/front_end/testcases/override_check_accessor_after_inference.dart'.
-// Change to a subtype of 'B'.
-//   A get y => null;
-//         ^
-// pkg/front_end/testcases/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/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/override_check_accessor_after_inference.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/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::•()
-    ;
-}
-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;
-}
-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/override_check_accessor_basic.dart.legacy.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.expect
deleted file mode 100644
index 959f74d..0000000
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-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::•()
-    ;
-  set x(self::A value) → void {}
-  get y() → self::A
-    return null;
-}
-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/override_check_accessor_basic.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.transformed.expect
deleted file mode 100644
index 959f74d..0000000
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-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::•()
-    ;
-  set x(self::A value) → void {}
-  get y() → self::A
-    return null;
-}
-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/override_check_accessor_basic.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
deleted file mode 100644
index 19a8160..0000000
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.outline.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  set x(self::A value) → void
-    ;
-  get y() → self::A
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  set x(core::Object value) → void
-    ;
-  get y() → self::B
-    ;
-}
-class E extends self::C {
-  synthetic constructor •() → self::E
-    ;
-  set x(self::B value) → void
-    ;
-  get y() → core::Object
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
deleted file mode 100644
index 5fc117f..0000000
--- a/pkg/front_end/testcases/override_check_accessor_basic.dart.strong.expect
+++ /dev/null
@@ -1,62 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/override_check_accessor_basic.dart'.
-// Change to a subtype of 'A'.
-//   Object get y => null;
-//              ^
-// pkg/front_end/testcases/override_check_accessor_basic.dart:11:9: Context: This is the overridden method ('y').
-//   A get y => null;
-//         ^
-//
-// pkg/front_end/testcases/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/override_check_accessor_basic.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/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::•()
-    ;
-}
-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;
-}
-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/override_check_accessor_with_covariant_modifier.dart.legacy.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.expect
deleted file mode 100644
index ec9f575..0000000
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-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::•()
-    ;
-  set x1(covariant self::A value) → void {}
-  set x2(self::A value) → void {}
-  set x3(covariant self::A value) → void {}
-  set x4(self::A value) → void {}
-  set x5(covariant self::A value) → void {}
-  set x6(covariant self::B value) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  set x1(covariant self::B value) → void {}
-  set x2(covariant self::B value) → void {}
-  set x3(covariant self::B value) → void {}
-  set x4(self::B value) → void {}
-  set x5(covariant core::String value) → void {}
-  set x6(covariant self::A value) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
deleted file mode 100644
index ec9f575..0000000
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-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::•()
-    ;
-  set x1(covariant self::A value) → void {}
-  set x2(self::A value) → void {}
-  set x3(covariant self::A value) → void {}
-  set x4(self::A value) → void {}
-  set x5(covariant self::A value) → void {}
-  set x6(covariant self::B value) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  set x1(covariant self::B value) → void {}
-  set x2(covariant self::B value) → void {}
-  set x3(covariant self::B value) → void {}
-  set x4(self::B value) → void {}
-  set x5(covariant core::String value) → void {}
-  set x6(covariant self::A value) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect
deleted file mode 100644
index eb8c429..0000000
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.outline.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  set x1(covariant self::A value) → void
-    ;
-  set x2(self::A value) → void
-    ;
-  set x3(covariant self::A value) → void
-    ;
-  set x4(self::A value) → void
-    ;
-  set x5(covariant self::A value) → void
-    ;
-  set x6(covariant self::B value) → void
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  set x1(covariant self::B value) → void
-    ;
-  set x2(covariant self::B value) → void
-    ;
-  set x3(covariant self::B value) → void
-    ;
-  set x4(self::B value) → void
-    ;
-  set x5(covariant core::String value) → void
-    ;
-  set x6(covariant self::A value) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
deleted file mode 100644
index 765bd58..0000000
--- a/pkg/front_end/testcases/override_check_accessor_with_covariant_modifier.dart.strong.expect
+++ /dev/null
@@ -1,59 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/override_check_accessor_with_covariant_modifier.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/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/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/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/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::•()
-    ;
-}
-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 self::A value) → void {}
-  set x2(self::A value) → void {}
-  set x3(covariant self::A value) → void {}
-  set x4(self::A value) → void {}
-  set x5(covariant self::A value) → void {}
-  set x6(covariant self::B value) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  set x1(covariant self::B value) → void {}
-  set x2(covariant self::B value) → void {}
-  set x3(covariant self::B value) → void {}
-  set x4(self::B value) → void {}
-  set x5(covariant core::String value) → void {}
-  set x6(covariant self::A value) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.legacy.expect b/pkg/front_end/testcases/override_check_after_inference.dart.legacy.expect
deleted file mode 100644
index adf56f6..0000000
--- a/pkg/front_end/testcases/override_check_after_inference.dart.legacy.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-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::A x) → void {}
-}
-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/override_check_after_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_after_inference.dart.legacy.transformed.expect
deleted file mode 100644
index adf56f6..0000000
--- a/pkg/front_end/testcases/override_check_after_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-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::A x) → void {}
-}
-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/override_check_after_inference.dart.outline.expect b/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
deleted file mode 100644
index 6f3f1e6..0000000
--- a/pkg/front_end/testcases/override_check_after_inference.dart.outline.expect
+++ /dev/null
@@ -1,38 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method f(self::A x) → void
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  method f(self::A x) → void
-    ;
-}
-class E extends self::D {
-  synthetic constructor •() → self::E
-    ;
-  method f(self::A x) → void
-    ;
-}
-class F extends self::D {
-  synthetic constructor •() → self::F
-    ;
-  method f(self::B x) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect b/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
deleted file mode 100644
index c6fbf23..0000000
--- a/pkg/front_end/testcases/override_check_after_inference.dart.strong.expect
+++ /dev/null
@@ -1,52 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/override_check_after_inference.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/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::•()
-    ;
-}
-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 {}
-}
-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/override_check_basic.dart.legacy.expect b/pkg/front_end/testcases/override_check_basic.dart.legacy.expect
deleted file mode 100644
index e538a45..0000000
--- a/pkg/front_end/testcases/override_check_basic.dart.legacy.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 f1(self::A x) → void {}
-  method f2([self::A x = null]) → void {}
-  method f3({self::A x = null}) → void {}
-  method f4() → self::A {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(core::Object x) → void {}
-  method f2([core::Object x = null]) → void {}
-  method f3({core::Object x = null}) → 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 = null]) → void {}
-  method f3({self::B x = null}) → void {}
-  method f4() → core::Object {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_basic.dart.legacy.transformed.expect
deleted file mode 100644
index e538a45..0000000
--- a/pkg/front_end/testcases/override_check_basic.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 f1(self::A x) → void {}
-  method f2([self::A x = null]) → void {}
-  method f3({self::A x = null}) → void {}
-  method f4() → self::A {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(core::Object x) → void {}
-  method f2([core::Object x = null]) → void {}
-  method f3({core::Object x = null}) → 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 = null]) → void {}
-  method f3({self::B x = null}) → void {}
-  method f4() → core::Object {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_basic.dart.outline.expect b/pkg/front_end/testcases/override_check_basic.dart.outline.expect
deleted file mode 100644
index a3277c0..0000000
--- a/pkg/front_end/testcases/override_check_basic.dart.outline.expect
+++ /dev/null
@@ -1,50 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method f1(self::A x) → void
-    ;
-  method f2([self::A x]) → void
-    ;
-  method f3({self::A x}) → void
-    ;
-  method f4() → self::A
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  method f1(core::Object x) → void
-    ;
-  method f2([core::Object x]) → void
-    ;
-  method f3({core::Object x}) → void
-    ;
-  method f4() → self::B
-    ;
-}
-class E extends self::C {
-  synthetic constructor •() → self::E
-    ;
-  method f1(self::B x) → void
-    ;
-  method f2([self::B x]) → void
-    ;
-  method f3({self::B x}) → void
-    ;
-  method f4() → core::Object
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_basic.dart.strong.expect b/pkg/front_end/testcases/override_check_basic.dart.strong.expect
deleted file mode 100644
index e767515..0000000
--- a/pkg/front_end/testcases/override_check_basic.dart.strong.expect
+++ /dev/null
@@ -1,85 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/override_check_basic.dart'.
-// Change to a subtype of 'A'.
-//   Object f4() {}
-//          ^
-// pkg/front_end/testcases/override_check_basic.dart:13:5: Context: This is the overridden method ('f4').
-//   A f4() {}
-//     ^
-//
-// pkg/front_end/testcases/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/override_check_basic.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/override_check_basic.dart:12:8: Context: This is the overridden method ('f3').
-//   void f3({A x}) {}
-//        ^
-//
-// pkg/front_end/testcases/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/override_check_basic.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/override_check_basic.dart:10:8: Context: This is the overridden method ('f1').
-//   void f1(A x) {}
-//        ^
-//
-// pkg/front_end/testcases/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/override_check_basic.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/override_check_basic.dart:11:8: Context: This is the overridden method ('f2').
-//   void f2([A x]) {}
-//        ^
-//
-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 f1(self::A x) → void {}
-  method f2([self::A x = null]) → void {}
-  method f3({self::A x = null}) → void {}
-  method f4() → self::A {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(core::Object x) → void {}
-  method f2([core::Object x = null]) → void {}
-  method f3({core::Object x = null}) → 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 = null]) → void {}
-  method f3({self::B x = null}) → void {}
-  method f4() → core::Object {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.expect
deleted file mode 100644
index 1b50295..0000000
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
-    : super core::Object::•()
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  abstract method fisk<S extends self::Foo<self::Bar::fisk::S> = dynamic>() → void;
-}
-class Hest extends core::Object implements self::Bar {
-  synthetic constructor •() → self::Hest
-    : super core::Object::•()
-    ;
-  @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U> = dynamic>() → void {}
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
deleted file mode 100644
index 1b50295..0000000
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
-    : super core::Object::•()
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-  abstract method fisk<S extends self::Foo<self::Bar::fisk::S> = dynamic>() → void;
-}
-class Hest extends core::Object implements self::Bar {
-  synthetic constructor •() → self::Hest
-    : super core::Object::•()
-    ;
-  @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U> = dynamic>() → void {}
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.outline.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.outline.expect
deleted file mode 100644
index cc16f53..0000000
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends self::Foo<self::Foo::T> = dynamic> extends core::Object {
-  synthetic constructor •() → self::Foo<self::Foo::T>
-    ;
-}
-abstract class Bar extends core::Object {
-  synthetic constructor •() → self::Bar
-    ;
-  abstract method fisk<S extends self::Foo<self::Bar::fisk::S> = dynamic>() → void;
-}
-class Hest extends core::Object implements self::Bar {
-  synthetic constructor •() → self::Hest
-    ;
-  @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U> = dynamic>() → void
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.expect
deleted file mode 100644
index ef8c1dc..0000000
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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 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;
-}
-class Hest extends core::Object implements self::Bar {
-  synthetic constructor •() → self::Hest
-    : super core::Object::•()
-    ;
-  @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U> = self::Foo<dynamic>>() → void {}
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.transformed.expect b/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.transformed.expect
deleted file mode 100644
index ef8c1dc..0000000
--- a/pkg/front_end/testcases/override_check_generic_method_f_bounded.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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 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;
-}
-class Hest extends core::Object implements self::Bar {
-  synthetic constructor •() → self::Hest
-    : super core::Object::•()
-    ;
-  @core::override
-  method fisk<U extends self::Foo<self::Hest::fisk::U> = self::Foo<dynamic>>() → void {}
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
deleted file mode 100644
index 05d92ea..0000000
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-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>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
-}
-class B extends self::A<core::String> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
deleted file mode 100644
index 05d92ea..0000000
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-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>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
-}
-class B extends self::A<core::String> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
deleted file mode 100644
index 713595c..0000000
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.outline.expect
+++ /dev/null
@@ -1,18 +0,0 @@
-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>
-    ;
-  method f<U extends core::Object = dynamic>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void
-    ;
-}
-class B extends self::A<core::String> {
-  synthetic constructor •() → self::B
-    ;
-  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
deleted file mode 100644
index 05d92ea..0000000
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-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>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
-}
-class B extends self::A<core::String> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect b/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect
deleted file mode 100644
index 05d92ea..0000000
--- a/pkg/front_end/testcases/override_check_two_substitutions.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-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>(generic-covariant-impl core::Map<self::A::T, self::A::f::U> m) → void {}
-}
-class B extends self::A<core::String> {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method f<V extends core::Object = dynamic>(generic-covariant-impl core::Map<core::String, self::B::f::V> m) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.expect
deleted file mode 100644
index 30f268c..0000000
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-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 f1(covariant self::A x) → void {}
-  method f2(self::A x) → void {}
-  method f3(covariant self::A x) → void {}
-  method f4(self::A x) → void {}
-  method f5(covariant self::A x) → void {}
-  method f6(covariant self::B x) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(covariant self::B x) → void {}
-  method f2(covariant self::B x) → void {}
-  method f3(covariant self::B x) → void {}
-  method f4(self::B x) → void {}
-  method f5(covariant core::String x) → void {}
-  method f6(covariant self::A x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.transformed.expect
deleted file mode 100644
index 30f268c..0000000
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-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 f1(covariant self::A x) → void {}
-  method f2(self::A x) → void {}
-  method f3(covariant self::A x) → void {}
-  method f4(self::A x) → void {}
-  method f5(covariant self::A x) → void {}
-  method f6(covariant self::B x) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(covariant self::B x) → void {}
-  method f2(covariant self::B x) → void {}
-  method f3(covariant self::B x) → void {}
-  method f4(self::B x) → void {}
-  method f5(covariant core::String x) → void {}
-  method f6(covariant self::A x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect
deleted file mode 100644
index 5ff196d..0000000
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.outline.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  method f1(covariant self::A x) → void
-    ;
-  method f2(self::A x) → void
-    ;
-  method f3(covariant self::A x) → void
-    ;
-  method f4(self::A x) → void
-    ;
-  method f5(covariant self::A x) → void
-    ;
-  method f6(covariant self::B x) → void
-    ;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  method f1(covariant self::B x) → void
-    ;
-  method f2(covariant self::B x) → void
-    ;
-  method f3(covariant self::B x) → void
-    ;
-  method f4(self::B x) → void
-    ;
-  method f5(covariant core::String x) → void
-    ;
-  method f6(covariant self::A x) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect b/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
deleted file mode 100644
index 25f16c4..0000000
--- a/pkg/front_end/testcases/override_check_with_covariant_modifier.dart.strong.expect
+++ /dev/null
@@ -1,59 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/override_check_with_covariant_modifier.dart:14:8: Context: This is the overridden method ('f5').
-//   void f5(covariant A x) {}
-//        ^
-//
-// pkg/front_end/testcases/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/override_check_with_covariant_modifier.dart'.
-//  - 'A' is from 'pkg/front_end/testcases/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/override_check_with_covariant_modifier.dart:13:8: Context: This is the overridden method ('f4').
-//   void f4(A x) {}
-//        ^
-//
-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 f1(covariant self::A x) → void {}
-  method f2(self::A x) → void {}
-  method f3(covariant self::A x) → void {}
-  method f4(self::A x) → void {}
-  method f5(covariant self::A x) → void {}
-  method f6(covariant self::B x) → void {}
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    : super self::C::•()
-    ;
-  method f1(covariant self::B x) → void {}
-  method f2(covariant self::B x) → void {}
-  method f3(covariant self::B x) → void {}
-  method f4(self::B x) → void {}
-  method f5(covariant core::String x) → void {}
-  method f6(covariant self::A x) → void {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_inference_for_setters.dart.legacy.expect b/pkg/front_end/testcases/override_inference_for_setters.dart.legacy.expect
deleted file mode 100644
index fd832da..0000000
--- a/pkg/front_end/testcases/override_inference_for_setters.dart.legacy.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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 {}
-}
-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/override_inference_for_setters.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_inference_for_setters.dart.legacy.transformed.expect
deleted file mode 100644
index fd832da..0000000
--- a/pkg/front_end/testcases/override_inference_for_setters.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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 {}
-}
-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/override_inference_for_setters.dart.outline.expect b/pkg/front_end/testcases/override_inference_for_setters.dart.outline.expect
deleted file mode 100644
index 1c22d1f..0000000
--- a/pkg/front_end/testcases/override_inference_for_setters.dart.outline.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-  get foo() → core::num
-    ;
-  set foo(dynamic newFoo) → void
-    ;
-}
-class A extends self::B {
-  synthetic constructor •() → self::A
-    ;
-  set foo(dynamic newFoo) → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_inference_for_setters.dart.strong.expect b/pkg/front_end/testcases/override_inference_for_setters.dart.strong.expect
deleted file mode 100644
index fd832da..0000000
--- a/pkg/front_end/testcases/override_inference_for_setters.dart.strong.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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 {}
-}
-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/override_inference_for_setters.dart.strong.transformed.expect b/pkg/front_end/testcases/override_inference_for_setters.dart.strong.transformed.expect
deleted file mode 100644
index fd832da..0000000
--- a/pkg/front_end/testcases/override_inference_for_setters.dart.strong.transformed.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-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 {}
-}
-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/override_inference_named_parameters_ordering.dart.legacy.expect b/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.legacy.expect
deleted file mode 100644
index 498e65c..0000000
--- a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.legacy.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-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 = true, core::bool a = null}) → dynamic {}
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class A1 extends core::Object {
-  synthetic constructor •() → self::A1
-    : super core::Object::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class B1 extends self::A1 {
-  synthetic constructor •() → self::B1
-    : super self::A1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class C1 extends self::B1 {
-  synthetic constructor •() → self::C1
-    : super self::B1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.legacy.transformed.expect b/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.legacy.transformed.expect
deleted file mode 100644
index 498e65c..0000000
--- a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-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 = true, core::bool a = null}) → dynamic {}
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class A1 extends core::Object {
-  synthetic constructor •() → self::A1
-    : super core::Object::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class B1 extends self::A1 {
-  synthetic constructor •() → self::B1
-    : super self::A1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class C1 extends self::B1 {
-  synthetic constructor •() → self::C1
-    : super self::B1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.outline.expect b/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.outline.expect
deleted file mode 100644
index 7a732b2..0000000
--- a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.outline.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method foo({core::bool c, core::bool a}) → dynamic
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-  method foo({core::bool c, core::bool a}) → dynamic
-    ;
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    ;
-  method foo({core::bool c, core::bool a}) → dynamic
-    ;
-}
-class A1 extends core::Object {
-  synthetic constructor •() → self::A1
-    ;
-  method foo({core::bool a, core::bool c}) → dynamic
-    ;
-}
-class B1 extends self::A1 {
-  synthetic constructor •() → self::B1
-    ;
-  method foo({core::bool a, core::bool c}) → dynamic
-    ;
-}
-class C1 extends self::B1 {
-  synthetic constructor •() → self::C1
-    ;
-  method foo({core::bool a, core::bool c}) → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.expect b/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.expect
deleted file mode 100644
index 498e65c..0000000
--- a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-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 = true, core::bool a = null}) → dynamic {}
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class A1 extends core::Object {
-  synthetic constructor •() → self::A1
-    : super core::Object::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class B1 extends self::A1 {
-  synthetic constructor •() → self::B1
-    : super self::A1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class C1 extends self::B1 {
-  synthetic constructor •() → self::C1
-    : super self::B1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.transformed.expect b/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.transformed.expect
deleted file mode 100644
index 498e65c..0000000
--- a/pkg/front_end/testcases/override_inference_named_parameters_ordering.dart.strong.transformed.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-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 = true, core::bool a = null}) → dynamic {}
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class C extends self::B {
-  synthetic constructor •() → self::C
-    : super self::B::•()
-    ;
-  method foo({core::bool c = true, core::bool a = null}) → dynamic {}
-}
-class A1 extends core::Object {
-  synthetic constructor •() → self::A1
-    : super core::Object::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class B1 extends self::A1 {
-  synthetic constructor •() → self::B1
-    : super self::A1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-class C1 extends self::B1 {
-  synthetic constructor •() → self::C1
-    : super self::B1::•()
-    ;
-  method foo({core::bool a = true, core::bool c = null}) → dynamic {}
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect b/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect
deleted file mode 100644
index b9dac32..0000000
--- a/pkg/front_end/testcases/part_not_part_of.dart.legacy.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/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";
-
-@core::override
-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 {}
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect b/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
deleted file mode 100644
index b9dac32..0000000
--- a/pkg/front_end/testcases/part_not_part_of.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/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";
-
-@core::override
-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 {}
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.outline.expect b/pkg/front_end/testcases/part_not_part_of.dart.outline.expect
deleted file mode 100644
index 7e879ea..0000000
--- a/pkg/front_end/testcases/part_not_part_of.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/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 "org-dartlang-testcase:///part_not_part_of_lib2.dart";
-
-part part_not_part_of_lib1.dart;
-static method main() → dynamic
-  ;
-
-library;
-import self as self2;
-
-import "org-dartlang-testcase:///part_not_part_of_lib1.dart";
-
-static method methodFromLib2() → dynamic
-  ;
-
-library;
-import self as self3;
-
-static method methodFromLib1() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.strong.expect b/pkg/front_end/testcases/part_not_part_of.dart.strong.expect
deleted file mode 100644
index b9dac32..0000000
--- a/pkg/front_end/testcases/part_not_part_of.dart.strong.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/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";
-
-@core::override
-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 {}
diff --git a/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect b/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
deleted file mode 100644
index b9dac32..0000000
--- a/pkg/front_end/testcases/part_not_part_of.dart.strong.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of.dart:8:6: Error: Can't use 'pkg/front_end/testcases/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";
-
-@core::override
-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 {}
diff --git a/pkg/front_end/testcases/part_not_part_of_lib1.dart b/pkg/front_end/testcases/part_not_part_of_lib1.dart
deleted file mode 100644
index 08b4fd0..0000000
--- a/pkg/front_end/testcases/part_not_part_of_lib1.dart
+++ /dev/null
@@ -1,5 +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.
-
-methodFromLib1() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_not_part_of_lib2.dart b/pkg/front_end/testcases/part_not_part_of_lib2.dart
deleted file mode 100644
index 1892ce6..0000000
--- a/pkg/front_end/testcases/part_not_part_of_lib2.dart
+++ /dev/null
@@ -1,9 +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 "part_not_part_of_lib1.dart";
-
-methodFromLib2() {
-  methodFromLib1();
-}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.expect b/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.expect
deleted file mode 100644
index 4a5e01d..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of_same_named_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.transformed.expect
deleted file mode 100644
index 4a5e01d..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of_same_named_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.outline.expect b/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.outline.expect
deleted file mode 100644
index a32297c..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.outline.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of_same_named_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/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 "org-dartlang-testcase:///part_not_part_of_same_named_library_lib2.dart";
-
-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
-  ;
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.expect b/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.expect
deleted file mode 100644
index 7426670..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of_same_named_library.dart:8:6: Error: Using 'pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.transformed.expect b/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.transformed.expect
deleted file mode 100644
index 7426670..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library.dart.strong.transformed.expect
+++ /dev/null
@@ -1,26 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_not_part_of_same_named_library.dart:8:6: Error: Using 'pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart' as part of 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart b/pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart
deleted file mode 100644
index 00b69ee..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library_lib1.dart
+++ /dev/null
@@ -1,7 +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.
-
-part of foo;
-
-methodFromLib1() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_not_part_of_same_named_library_lib2.dart b/pkg/front_end/testcases/part_not_part_of_same_named_library_lib2.dart
deleted file mode 100644
index 97fffd5..0000000
--- a/pkg/front_end/testcases/part_not_part_of_same_named_library_lib2.dart
+++ /dev/null
@@ -1,11 +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.
-
-library foo;
-
-part "part_not_part_of_same_named_library_lib1.dart";
-
-methodFromLib2() {
-  methodFromLib1();
-}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.expect b/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.expect
deleted file mode 100644
index 85e680d..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_different_unnamed_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.transformed.expect
deleted file mode 100644
index 85e680d..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_different_unnamed_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.outline.expect b/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.outline.expect
deleted file mode 100644
index fbd6f45..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_different_unnamed_library.dart:8:6: Warning: Using 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib2.dart'.
-// part 'part_part_of_different_unnamed_library_lib1.dart';
-//      ^
-//
-import self as self;
-
-import "org-dartlang-testcase:///part_part_of_different_unnamed_library_lib2.dart";
-
-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
-  ;
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.expect b/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.expect
deleted file mode 100644
index 1fb79ff..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_different_unnamed_library.dart:8:6: Error: Using 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.transformed.expect b/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.transformed.expect
deleted file mode 100644
index 1fb79ff..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_different_unnamed_library.dart:8:6: Error: Using 'pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart' as part of 'pkg/front_end/testcases/part_part_of_different_unnamed_library.dart' but its 'part of' declaration says 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart b/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart
deleted file mode 100644
index 5aef25d..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib1.dart
+++ /dev/null
@@ -1,7 +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.
-
-part of "part_part_of_different_unnamed_library_lib2.dart";
-
-methodFromLib1() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib2.dart b/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib2.dart
deleted file mode 100644
index e5617f2..0000000
--- a/pkg/front_end/testcases/part_part_of_different_unnamed_library_lib2.dart
+++ /dev/null
@@ -1,9 +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.
-
-part "part_part_of_different_unnamed_library_lib1.dart";
-
-methodFromLib2() {
-  methodFromLib1();
-}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.expect b/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.expect
deleted file mode 100644
index 14fe275..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library foo;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_differently_named_library.dart:10:6: Warning: Using 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.transformed.expect b/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.transformed.expect
deleted file mode 100644
index 14fe275..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library foo;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_differently_named_library.dart:10:6: Warning: Using 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.outline.expect b/pkg/front_end/testcases/part_part_of_differently_named_library.dart.outline.expect
deleted file mode 100644
index 27348fa..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library foo;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_differently_named_library.dart:10:6: Warning: Using 'pkg/front_end/testcases/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 "org-dartlang-testcase:///part_part_of_differently_named_library_lib2.dart";
-
-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
-  ;
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.expect b/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.expect
deleted file mode 100644
index f506b84..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library foo;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_differently_named_library.dart:10:6: Error: Using 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.transformed.expect b/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.transformed.expect
deleted file mode 100644
index f506b84..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library foo;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/part_part_of_differently_named_library.dart:10:6: Error: Using 'pkg/front_end/testcases/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";
-
-@core::override
-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();
-}
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library_lib1.dart b/pkg/front_end/testcases/part_part_of_differently_named_library_lib1.dart
deleted file mode 100644
index 8e33c02..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library_lib1.dart
+++ /dev/null
@@ -1,7 +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.
-
-part of bar;
-
-methodFromLib1() {}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/part_part_of_differently_named_library_lib2.dart b/pkg/front_end/testcases/part_part_of_differently_named_library_lib2.dart
deleted file mode 100644
index 55171ca..0000000
--- a/pkg/front_end/testcases/part_part_of_differently_named_library_lib2.dart
+++ /dev/null
@@ -1,11 +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.
-
-library bar;
-
-part "part_part_of_differently_named_library_lib1.dart";
-
-methodFromLib2() {
-  methodFromLib1();
-}
\ No newline at end of file
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.legacy.expect b/pkg/front_end/testcases/prefer_baseclass.dart.legacy.expect
deleted file mode 100644
index 18f3480..0000000
--- a/pkg/front_end/testcases/prefer_baseclass.dart.legacy.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 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/prefer_baseclass.dart.legacy.transformed.expect b/pkg/front_end/testcases/prefer_baseclass.dart.legacy.transformed.expect
deleted file mode 100644
index 18f3480..0000000
--- a/pkg/front_end/testcases/prefer_baseclass.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 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/prefer_baseclass.dart.outline.expect b/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect
deleted file mode 100644
index 1e16047..0000000
--- a/pkg/front_end/testcases/prefer_baseclass.dart.outline.expect
+++ /dev/null
@@ -1,34 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-}
-class AB1 extends self::A implements self::B {
-  synthetic constructor •() → self::AB1
-    ;
-}
-class AB2 extends self::A implements self::B {
-  synthetic constructor •() → self::AB2
-    ;
-}
-class BA1 extends self::B implements self::A {
-  synthetic constructor •() → self::BA1
-    ;
-}
-class BA2 extends self::B implements self::A {
-  synthetic constructor •() → self::BA2
-    ;
-}
-static method takeSubclassOfA(dynamic obj) → dynamic
-  ;
-static method takeSubclassOfB(dynamic obj) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect b/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect
deleted file mode 100644
index 18f3480..0000000
--- a/pkg/front_end/testcases/prefer_baseclass.dart.strong.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 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/prefer_baseclass.dart.strong.transformed.expect b/pkg/front_end/testcases/prefer_baseclass.dart.strong.transformed.expect
deleted file mode 100644
index 18f3480..0000000
--- a/pkg/front_end/testcases/prefer_baseclass.dart.strong.transformed.expect
+++ /dev/null
@@ -1,42 +0,0 @@
-library;
-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 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/private_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
deleted file mode 100644
index 3e521af..0000000
--- a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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 {}
-}
-static method baz(pri::Bar bar) → void {
-  core::print("${bar._f.runtimeType}");
-}
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
deleted file mode 100644
index 3e521af..0000000
--- a/pkg/front_end/testcases/private_method_tearoff.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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 {}
-}
-static method baz(pri::Bar bar) → void {
-  core::print("${bar._f.runtimeType}");
-}
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect
deleted file mode 100644
index dc1a5ae..0000000
--- a/pkg/front_end/testcases/private_method_tearoff.dart.outline.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-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
-    ;
-  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-}
-class Baz extends self::Foo {
-  synthetic constructor •() → self::Baz
-    ;
-}
-static method main() → dynamic
-  ;
-
-library;
-import self as pri;
-import "dart:core" as core;
-
-class Bar extends core::Object {
-  synthetic constructor •() → pri::Bar
-    ;
-  method _f() → void
-    ;
-}
-static method baz(pri::Bar bar) → void
-  ;
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect
deleted file mode 100644
index 1422ece..0000000
--- a/pkg/front_end/testcases/private_method_tearoff.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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 {}
-}
-static method baz(pri::Bar bar) → void {
-  core::print("${bar.{pri::Bar::_f}.{core::Object::runtimeType}}");
-}
diff --git a/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
deleted file mode 100644
index 1422ece..0000000
--- a/pkg/front_end/testcases/private_method_tearoff.dart.strong.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-  no-such-method-forwarder method /* from org-dartlang-testcase:///private_method_tearoff_lib.dart */ _f() → void
-    return this.{core::Object::noSuchMethod}(new core::_InvocationMirror::_withType(#_f, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, 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 {}
-}
-static method baz(pri::Bar bar) → void {
-  core::print("${bar.{pri::Bar::_f}.{core::Object::runtimeType}}");
-}
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
deleted file mode 100644
index 4e942b2..0000000
--- a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 {}
-}
-static method baz(pub::Bar bar) → void {
-  core::print("${bar.f.runtimeType}");
-}
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect b/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
deleted file mode 100644
index 4e942b2..0000000
--- a/pkg/front_end/testcases/public_method_tearoff.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 {}
-}
-static method baz(pub::Bar bar) → void {
-  core::print("${bar.f.runtimeType}");
-}
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect b/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect
deleted file mode 100644
index 7648db6..0000000
--- a/pkg/front_end/testcases/public_method_tearoff.dart.outline.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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
-    ;
-}
-static method main() → void
-  ;
-
-library;
-import self as pub;
-import "dart:core" as core;
-
-class Bar extends core::Object {
-  synthetic constructor •() → pub::Bar
-    ;
-  method f() → void
-    ;
-}
-static method baz(pub::Bar bar) → void
-  ;
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect b/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect
deleted file mode 100644
index 32ce75e..0000000
--- a/pkg/front_end/testcases/public_method_tearoff.dart.strong.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 {}
-}
-static method baz(pub::Bar bar) → void {
-  core::print("${bar.{pub::Bar::f}.{core::Object::runtimeType}}");
-}
diff --git a/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect b/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
deleted file mode 100644
index 32ce75e..0000000
--- a/pkg/front_end/testcases/public_method_tearoff.dart.strong.transformed.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-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 {}
-}
-static method baz(pub::Bar bar) → void {
-  core::print("${bar.{pub::Bar::f}.{core::Object::runtimeType}}");
-}
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.expect b/pkg/front_end/testcases/qualified.dart.legacy.expect
deleted file mode 100644
index 6afde2e..0000000
--- a/pkg/front_end/testcases/qualified.dart.legacy.expect
+++ /dev/null
@@ -1,111 +0,0 @@
-library test.qualified.main;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Warning: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-//
-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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-}
-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::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-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::•().supertypeMethod();
-  new self::WithMixin::•().foo();
-  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
-}
-class Supertype extends core::Object {
-  synthetic constructor •() → lib::Supertype
-    : super core::Object::•()
-    ;
-  method supertypeMethod() → dynamic {
-    core::print("I'm supertypeMethod form lib.Supertype");
-  }
-}
-abstract class Mixin extends core::Object {
-  synthetic constructor •() → lib::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    core::print("I'm Mixin.foo");
-  }
-}
diff --git a/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect b/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
deleted file mode 100644
index 4da117d4c6..0000000
--- a/pkg/front_end/testcases/qualified.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,114 +0,0 @@
-library test.qualified.main;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Warning: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-//
-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 class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
-    core::print("I'm 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::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-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::•().supertypeMethod();
-  new self::WithMixin::•().foo();
-  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
-}
-class Supertype extends core::Object {
-  synthetic constructor •() → lib::Supertype
-    : super core::Object::•()
-    ;
-  method supertypeMethod() → dynamic {
-    core::print("I'm supertypeMethod form lib.Supertype");
-  }
-}
-abstract class Mixin extends core::Object {
-  synthetic constructor •() → lib::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    core::print("I'm Mixin.foo");
-  }
-}
diff --git a/pkg/front_end/testcases/qualified.dart.outline.expect b/pkg/front_end/testcases/qualified.dart.outline.expect
deleted file mode 100644
index 6df7d32..0000000
--- a/pkg/front_end/testcases/qualified.dart.outline.expect
+++ /dev/null
@@ -1,94 +0,0 @@
-library test.qualified.main;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Warning: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Warning: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-//
-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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-}
-class WithMixin extends self::_WithMixin&Supertype&Mixin {
-  synthetic constructor •() → self::WithMixin
-    ;
-}
-class IllegalSupertype extends core::Object {
-  synthetic constructor •() → self::IllegalSupertype
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  constructor •() → self::C<self::C::T>
-    ;
-  constructor a() → self::C<self::C::T>
-    ;
-  static factory b<T extends core::Object = dynamic>() → self::C<self::C::b::T>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-static method main() → dynamic
-  ;
-
-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 field dynamic _redirecting# = <dynamic>[lib::C::b];
-  constructor •() → lib::C<lib::C::T>
-    ;
-  constructor a() → lib::C<lib::C::T>
-    ;
-  static factory b<T extends core::Object = dynamic>() → lib::C<lib::C::b::T>
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
-}
-class Supertype extends core::Object {
-  synthetic constructor •() → lib::Supertype
-    ;
-  method supertypeMethod() → dynamic
-    ;
-}
-abstract class Mixin extends core::Object {
-  synthetic constructor •() → lib::Mixin
-    ;
-  method foo() → dynamic
-    ;
-}
diff --git a/pkg/front_end/testcases/qualified.dart.strong.expect b/pkg/front_end/testcases/qualified.dart.strong.expect
deleted file mode 100644
index c145d18..0000000
--- a/pkg/front_end/testcases/qualified.dart.strong.expect
+++ /dev/null
@@ -1,107 +0,0 @@
-library test.qualified.main;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-//
-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 class _WithMixin&Supertype&Mixin = lib::Supertype with lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-}
-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::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-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}();
-  new self::WithMixin::•().{lib::Mixin::foo}();
-  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
-  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>
-    let dynamic #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
-}
-class Supertype extends core::Object {
-  synthetic constructor •() → lib::Supertype
-    : super core::Object::•()
-    ;
-  method supertypeMethod() → dynamic {
-    core::print("I'm supertypeMethod form lib.Supertype");
-  }
-}
-abstract class Mixin extends core::Object {
-  synthetic constructor •() → lib::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    core::print("I'm Mixin.foo");
-  }
-}
diff --git a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect b/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
deleted file mode 100644
index 5c3bf8c..0000000
--- a/pkg/front_end/testcases/qualified.dart.strong.transformed.expect
+++ /dev/null
@@ -1,110 +0,0 @@
-library test.qualified.main;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/qualified.dart:13:11: Error: The name of a constructor must match the name of the enclosing class.
-//   factory WrongName() {}
-//           ^^^^^^^^^
-// pkg/front_end/testcases/qualified.dart:11:7: Context: The name of the enclosing class is 'Bad'.
-// class Bad extends lib.Missing {
-//       ^^^
-//
-// pkg/front_end/testcases/qualified.dart:11:19: Error: Type 'lib.Missing' not found.
-// class Bad extends lib.Missing {
-//                   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:12:3: Error: Type 'lib.Missing' not found.
-//   lib.Missing method() {}
-//   ^^^^^^^^^^^
-//
-// pkg/front_end/testcases/qualified.dart:18:7: Error: The type 'lib.VoidFunction' can't be used as supertype.
-// class IllegalSupertype extends lib.VoidFunction {}
-//       ^
-//
-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 class _WithMixin&Supertype&Mixin extends lib::Supertype implements lib::Mixin {
-  synthetic constructor •() → self::_WithMixin&Supertype&Mixin
-    : super lib::Supertype::•()
-    ;
-  method /* from org-dartlang-testcase:///qualified_lib.dart */ foo() → dynamic {
-    core::print("I'm 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::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object { // from org-dartlang-testcase:///qualified_part.dart
-  static field dynamic _redirecting# = <dynamic>[self::C::b];
-  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>
-    let <T extends core::Object = dynamic>() → lib::C<lib::C::b::T> #redirecting_factory = lib::C::b in let self::C::b::T #typeArg0 = null in invalid-expression;
-}
-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}();
-  new self::WithMixin::•().{lib::Mixin::foo}();
-  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 field dynamic _redirecting# = <dynamic>[lib::C::b];
-  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>
-    let<BottomType> #redirecting_factory = lib::C::a in let lib::C::b::T #typeArg0 = null in invalid-expression;
-}
-class Supertype extends core::Object {
-  synthetic constructor •() → lib::Supertype
-    : super core::Object::•()
-    ;
-  method supertypeMethod() → dynamic {
-    core::print("I'm supertypeMethod form lib.Supertype");
-  }
-}
-abstract class Mixin extends core::Object {
-  synthetic constructor •() → lib::Mixin
-    : super core::Object::•()
-    ;
-  method foo() → dynamic {
-    core::print("I'm Mixin.foo");
-  }
-}
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.outline.expect
index f05d10d..5751e9d 100644
--- a/pkg/front_end/testcases/rasta/abstract_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect
index 32a8cd2..96dd32b 100644
--- a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect
index 32a8cd2..96dd32b 100644
--- a/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/abstract_constructor.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
index bbe1cea..e6caacb 100644
--- a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.outline.expect
@@ -1,11 +1,24 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_constructor_redirection.dart:6:21: Warning: 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 {
-  const constructor •() → self::C
+  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
+  const constructor x() → self::C*
+    : super core::Object::•()
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect
index cfe717a..af2f9eb 100644
--- a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.expect
@@ -11,17 +11,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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
+  const constructor x() → self::C*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   new self::C::•();
-  const 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);
+                    ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect
index cfe717a..af2f9eb 100644
--- a/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_constructor_redirection.dart.strong.transformed.expect
@@ -11,17 +11,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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
+  const constructor x() → self::C*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
   new self::C::•();
-  const 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);
+                    ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.outline.expect
index 9eec648..928527c 100644
--- a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect
index 8ea402c..48bf402 100644
--- a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect
index 8ea402c..48bf402 100644
--- a/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_default_constructor.dart.strong.transformed.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect
index 6d07372..fc9f0a9 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
                    ^"
@@ -23,5 +23,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+                   ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect
index 6d07372..fc9f0a9 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.legacy.transformed.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
                    ^"
@@ -23,5 +23,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+                   ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
index 525802d..d7e7781 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.outline.expect
@@ -1,13 +1,23 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart:10:20: Warning: 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
+  constructor •(dynamic x) → self::A*
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.expect
index 122893d..1feb3f4 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
                    ^"
@@ -23,5 +23,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+                   ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.transformed.expect
index 122893d..1feb3f4 100644
--- a/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_explicit_super_constructor.dart.strong.transformed.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
                    ^"
@@ -23,5 +23,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+                   ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect
index 5f6b84a..0ddc60f 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.expect
@@ -2,26 +2,26 @@
 //
 // Problems in library:
 //
-// 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);
-//          ^
-//
 // 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
+  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);
          ^"
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
         ^"
@@ -29,5 +29,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+        ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect
index 5f6b84a..0ddc60f 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.legacy.transformed.expect
@@ -2,26 +2,26 @@
 //
 // Problems in library:
 //
-// 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);
-//          ^
-//
 // 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
+  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);
          ^"
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
         ^"
@@ -29,5 +29,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+        ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.outline.expect
index 525802d..57359a4 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.outline.expect
@@ -1,13 +1,23 @@
 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();
+//         ^
+//
 import self as self;
 import "dart:core" as core;
 
 class A extends core::Object {
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  const constructor •() → self::B*
+    : final dynamic #t1 = 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
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect
index 5f6b84a..0ddc60f 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.expect
@@ -2,26 +2,26 @@
 //
 // Problems in library:
 //
-// 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);
-//          ^
-//
 // 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
+  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);
          ^"
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
         ^"
@@ -29,5 +29,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+        ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect
index 5f6b84a..0ddc60f 100644
--- a/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_implicit_super_constructor.dart.strong.transformed.expect
@@ -2,26 +2,26 @@
 //
 // Problems in library:
 //
-// 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);
-//          ^
-//
 // 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
+  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);
          ^"
     ;
 }
 class B extends self::A {
-  const constructor •() → self::B
+  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();
         ^"
@@ -29,5 +29,7 @@
 }
 static method main() → dynamic {
   new self::B::•();
-  const 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();
+        ^";
 }
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect
index fba617b..0b4b2bd 100644
--- a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.expect
@@ -22,5 +22,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))}.);\"");
+  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))}.);\"");
+}
+
+constants  {
+  #C1 = #x
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect
index fba617b..0b4b2bd 100644
--- a/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_interpolation.dart.legacy.transformed.expect
@@ -22,5 +22,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#x, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))}.);\"");
+  core::print(" ${throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)))}.);\"");
+}
+
+constants  {
+  #C1 = #x
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
index 9bed78b..251392f 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.outline.expect
@@ -11,11 +11,11 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •() → self::Foo
+  constructor •() → self::Foo*
     ;
 }
 class Bar extends self::Foo {
-  static factory •() → self::Bar
+  static factory •() → self::Bar*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect
index 134d8c3..d0e2d04 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •() → self::Foo
+  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.
@@ -29,7 +29,7 @@
           ^";
 }
 class Bar extends self::Foo {
-  static factory •() → self::Bar
+  static factory •() → self::Bar*
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect
index 134d8c3..d0e2d04 100644
--- a/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_redirection.dart.strong.transformed.expect
@@ -21,7 +21,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •() → self::Foo
+  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.
@@ -29,7 +29,7 @@
           ^";
 }
 class Bar extends self::Foo {
-  static factory •() → self::Bar
+  static factory •() → self::Bar*
     return null;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect
index ad364e1..422f909 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect
index ad364e1..422f909 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.legacy.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.outline.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.outline.expect
index 1f58e29..429c40d 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
   set field(dynamic value) → void
     ;
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect
index ad364e1..422f909 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect
index ad364e1..422f909 100644
--- a/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/bad_setter_initializer.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.legacy.expect b/pkg/front_end/testcases/rasta/cascades.dart.legacy.expect
index 72ce722..141adf8 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method add(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect
index 72ce722..141adf8 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method add(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.outline.expect b/pkg/front_end/testcases/rasta/cascades.dart.outline.expect
index 4e10201..ae4bf85 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   method add(dynamic x) → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
index 4cbe618..aac2bc0 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method add(dynamic x) → dynamic
     return x;
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
+  self::A* a = new self::A::•();
   function f(dynamic x) → dynamic
     return x;
-  let final self::A #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+  let final self::A* #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
 }
diff --git a/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
index 4cbe618..aac2bc0 100644
--- a/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/cascades.dart.strong.transformed.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method add(dynamic x) → dynamic
     return x;
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
+  self::A* a = new self::A::•();
   function f(dynamic x) → dynamic
     return x;
-  let final self::A #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
+  let final self::A* #t1 = a in let final dynamic #t2 = #t1.{self::A::add}(f).call("WHAT") in #t1;
 }
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
index 184037de..f3e48bc 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.outline.expect
@@ -42,21 +42,21 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends core::Object {
-  const synthetic constructor •() → self::C
+  const synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::D::•];
-  static factory •() → self::D
+  static factory •() → self::D*
     let dynamic #redirecting_factory = "Missing" in invalid-expression;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect
index 06d8f86..cce1bc5 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.expect
@@ -34,23 +34,23 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  const synthetic constructor •() → self::C
+  const synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::D::•];
-  static factory •() → self::D
+  static factory •() → self::D*
     let dynamic #redirecting_factory = "Missing" in invalid-expression;
 }
 static method main() → void {
diff --git a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect
index 9184493..971b579 100644
--- a/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/class_hierarchy.dart.strong.transformed.expect
@@ -34,24 +34,24 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  const synthetic constructor •() → self::C
+  const synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::D::•];
-  static factory •() → self::D
-    let core::String #redirecting_factory = "Missing" in invalid-expression;
+  static factory •() → self::D*
+    let core::String* #redirecting_factory = "Missing" in invalid-expression;
 }
 static method main() → void {
   new self::A::•();
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.outline.expect b/pkg/front_end/testcases/rasta/class_member.dart.outline.expect
index 5719ce2..a9ff29a 100644
--- a/pkg/front_end/testcases/rasta/class_member.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/class_member.dart.outline.expect
@@ -6,11 +6,11 @@
   field dynamic field1;
   field dynamic field2;
   field dynamic field3;
-  constructor constructor1() → self::Foo
+  constructor constructor1() → self::Foo*
     ;
-  constructor constructor2() → self::Foo
+  constructor constructor2() → self::Foo*
     ;
-  constructor constructor3() → self::Foo
+  constructor constructor3() → self::Foo*
     ;
   method a() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.strong.expect b/pkg/front_end/testcases/rasta/class_member.dart.strong.expect
index 5e57d9d..34a1b6b 100644
--- a/pkg/front_end/testcases/rasta/class_member.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/class_member.dart.strong.expect
@@ -6,13 +6,13 @@
   field dynamic field1 = null;
   field dynamic field2 = null;
   field dynamic field3 = null;
-  constructor constructor1() → self::Foo
+  constructor constructor1() → self::Foo*
     : super core::Object::•()
     ;
-  constructor constructor2() → self::Foo
+  constructor constructor2() → self::Foo*
     : super core::Object::•()
     ;
-  constructor constructor3() → self::Foo
+  constructor constructor3() → self::Foo*
     : super core::Object::•()
     ;
   method a() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect
index 5e57d9d..34a1b6b 100644
--- a/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/class_member.dart.strong.transformed.expect
@@ -6,13 +6,13 @@
   field dynamic field1 = null;
   field dynamic field2 = null;
   field dynamic field3 = null;
-  constructor constructor1() → self::Foo
+  constructor constructor1() → self::Foo*
     : super core::Object::•()
     ;
-  constructor constructor2() → self::Foo
+  constructor constructor2() → self::Foo*
     : super core::Object::•()
     ;
-  constructor constructor3() → self::Foo
+  constructor constructor3() → self::Foo*
     : super core::Object::•()
     ;
   method a() → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect
index eb9688c..8747190 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.expect
@@ -1,8 +1,13 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic c = 1;
+static const field dynamic c = #C1;
 static method main() → dynamic {
-  self::c;
-  self::c.call();
+  #C1;
+  (#C1).call();
+}
+
+constants  {
+  #C1 = 1
 }
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.transformed.expect
index eb9688c..8747190 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.legacy.transformed.expect
@@ -1,8 +1,13 @@
 library;
 import self as self;
+import "dart:core" as core;
 
-static const field dynamic c = 1;
+static const field dynamic c = #C1;
 static method main() → dynamic {
-  self::c;
-  self::c.call();
+  #C1;
+  (#C1).call();
+}
+
+constants  {
+  #C1 = 1
 }
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect
index cecd01b..56e361b 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.expect
@@ -10,11 +10,15 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int c = 1;
+static const field core::int* c = #C1;
 static method main() → dynamic {
-  self::c;
+  #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();
    ^";
 }
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect
index cecd01b..56e361b 100644
--- a/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/constant_get_and_invoke.dart.strong.transformed.expect
@@ -10,11 +10,15 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int c = 1;
+static const field core::int* c = #C1;
 static method main() → dynamic {
-  self::c;
+  #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();
    ^";
 }
+
+constants  {
+  #C1 = 1
+}
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect
index 84bbb0d..23b6fa2 100644
--- a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.expect
@@ -5,10 +5,10 @@
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
 static method main() → dynamic {
-  self::__loadLibrary_lib;
+  #C1;
   LoadLibrary(lib);
 }
-static method __loadLibrary_lib() → asy::Future<dynamic>
+static method __loadLibrary_lib() → asy::Future<dynamic>*
   return LoadLibrary(lib);
 
 library deferred_lib;
@@ -16,3 +16,7 @@
 
 static method foo() → dynamic
   return null;
+
+constants  {
+  #C1 = tearoff self::__loadLibrary_lib
+}
diff --git a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect
index 84bbb0d..23b6fa2 100644
--- a/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/deferred_load.dart.strong.transformed.expect
@@ -5,10 +5,10 @@
 import "org-dartlang-testcase:///deferred_lib.dart" deferred as lib;
 
 static method main() → dynamic {
-  self::__loadLibrary_lib;
+  #C1;
   LoadLibrary(lib);
 }
-static method __loadLibrary_lib() → asy::Future<dynamic>
+static method __loadLibrary_lib() → asy::Future<dynamic>*
   return LoadLibrary(lib);
 
 library deferred_lib;
@@ -16,3 +16,7 @@
 
 static method foo() → dynamic
   return null;
+
+constants  {
+  #C1 = tearoff self::__loadLibrary_lib
+}
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect
index 7bfef12..6b3d464 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.expect
@@ -4,22 +4,22 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
     : super self::_A&Object&Mixin::•()
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect
index 25d8b41..ea7db2b 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.legacy.transformed.expect
@@ -4,24 +4,24 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin extends core::Object implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin&Mixin extends self::_A&Object&Mixin implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
     : super self::_A&Object&Mixin::•()
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect
index eb07e47..0451f5c 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.outline.expect
@@ -4,20 +4,20 @@
 
 class Mixin extends core::Object {
   field dynamic field;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     ;
 }
 abstract class _A&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
     : super self::_A&Object&Mixin::•()
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
index 7bfef12..6b3d464 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.expect
@@ -4,22 +4,22 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin&Mixin = self::_A&Object&Mixin with self::Mixin {
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
     : super self::_A&Object&Mixin::•()
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
index 25d8b41..ea7db2b 100644
--- a/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/duplicated_mixin.dart.strong.transformed.expect
@@ -4,24 +4,24 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin extends core::Object implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin*
     : super core::Object::•()
     ;
 }
 abstract class _A&Object&Mixin&Mixin extends self::_A&Object&Mixin implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_A&Object&Mixin&Mixin
+  synthetic constructor •() → self::_A&Object&Mixin&Mixin*
     : super self::_A&Object&Mixin::•()
     ;
 }
 class A extends self::_A&Object&Mixin&Mixin {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super self::_A&Object&Mixin&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/enum.dart.legacy.expect b/pkg/front_end/testcases/rasta/enum.dart.legacy.expect
index 111e2dc..ced26a8 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.legacy.expect
@@ -3,15 +3,25 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::ec1, self::Foo::ec2];
-  static const field self::Foo ec1 = const self::Foo::•(0, "Foo.ec1");
-  static const field self::Foo ec2 = const self::Foo::•(1, "Foo.ec2");
-  const constructor •(core::int index, core::String _name) → self::Foo
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::Foo::_name};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.ec1"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.ec2"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = <self::Foo*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect
index 111e2dc..ced26a8 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.legacy.transformed.expect
@@ -3,15 +3,25 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::ec1, self::Foo::ec2];
-  static const field self::Foo ec1 = const self::Foo::•(0, "Foo.ec1");
-  static const field self::Foo ec2 = const self::Foo::•(1, "Foo.ec2");
-  const constructor •(core::int index, core::String _name) → self::Foo
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::Foo::_name};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.ec1"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.ec2"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = <self::Foo*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/rasta/enum.dart.outline.expect b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
index 0a56230..984ceeb 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::ec1, self::Foo::ec2];
-  static const field self::Foo ec1 = const self::Foo::•(0, "Foo.ec1");
-  static const field self::Foo ec2 = const self::Foo::•(1, "Foo.ec2");
-  const constructor •(core::int index, core::String _name) → self::Foo
+  final field core::int* index;
+  final field core::String* _name;
+  static const field core::List<self::Foo*>* values = const <self::Foo*>[self::Foo::ec1, self::Foo::ec2];
+  static const field self::Foo* ec1 = const self::Foo::•(0, "Foo.ec1");
+  static const field self::Foo* ec2 = const self::Foo::•(1, "Foo.ec2");
+  const constructor •(core::int* index, core::String* _name) → self::Foo*
     : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::Foo::_name};
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/enum.dart.strong.expect b/pkg/front_end/testcases/rasta/enum.dart.strong.expect
index 111e2dc..ced26a8 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.strong.expect
@@ -3,15 +3,25 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::ec1, self::Foo::ec2];
-  static const field self::Foo ec1 = const self::Foo::•(0, "Foo.ec1");
-  static const field self::Foo ec2 = const self::Foo::•(1, "Foo.ec2");
-  const constructor •(core::int index, core::String _name) → self::Foo
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::Foo::_name};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.ec1"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.ec2"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = <self::Foo*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect
index 111e2dc..ced26a8 100644
--- a/pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/enum.dart.strong.transformed.expect
@@ -3,15 +3,25 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  final field core::int index;
-  final field core::String _name;
-  static const field core::List<self::Foo> values = const <self::Foo>[self::Foo::ec1, self::Foo::ec2];
-  static const field self::Foo ec1 = const self::Foo::•(0, "Foo.ec1");
-  static const field self::Foo ec2 = const self::Foo::•(1, "Foo.ec2");
-  const constructor •(core::int index, core::String _name) → self::Foo
+  final field core::int* index;
+  final field core::String* _name;
+  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*
     : self::Foo::index = index, self::Foo::_name = _name, super core::Object::•()
     ;
-  method toString() → core::String
+  method toString() → core::String*
     return this.{=self::Foo::_name};
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = 0
+  #C2 = "Foo.ec1"
+  #C3 = self::Foo {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "Foo.ec2"
+  #C6 = self::Foo {index:#C4, _name:#C5}
+  #C7 = <self::Foo*>[#C3, #C6]
+}
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect
index acf6687..8b7a99d 100644
--- a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.expect
@@ -4,5 +4,5 @@
 
 static method main() → dynamic {
   "Should redirect to LinkedHashMap constructor.";
-  core::Map::•<core::Symbol, dynamic>();
+  core::Map::•<core::Symbol*, dynamic>();
 }
diff --git a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect
index acf6687..8b7a99d 100644
--- a/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/external_factory_redirection.dart.strong.transformed.expect
@@ -4,5 +4,5 @@
 
 static method main() → dynamic {
   "Should redirect to LinkedHashMap constructor.";
-  core::Map::•<core::Symbol, dynamic>();
+  core::Map::•<core::Symbol*, dynamic>();
 }
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect b/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect
index babb8d3..e3bd4bb 100644
--- a/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
-  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
-    core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1);
+  core::int* c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
+  for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1) in #t1);
   }
-  for (core::int i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int} throw "fisk" : let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3) {
-    core::print(let final core::int #t5 = i in let final core::int #t6 = i = #t5.{core::num::+}(1) in #t5);
+  for (core::int* i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int*} throw "fisk" : let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1) in #t3) {
+    core::print(let final core::int* #t5 = i in let final core::int* #t6 = i = #t5.{core::num::+}(1) in #t5);
   }
 }
diff --git a/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect
index babb8d3..e3bd4bb 100644
--- a/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/for_loop.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
-  for (core::int i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
-    core::print(let final core::int #t1 = i in let final core::int #t2 = i = #t1.{core::num::+}(1) in #t1);
+  core::int* c = new core::DateTime::now().{core::DateTime::millisecondsSinceEpoch};
+  for (core::int* i = 0; i.{core::num::<}(100); i = i.{core::num::+}(1)) {
+    core::print(let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1) in #t1);
   }
-  for (core::int i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int} throw "fisk" : let final core::int #t3 = i in let final core::int #t4 = i = #t3.{core::num::+}(1) in #t3) {
-    core::print(let final core::int #t5 = i in let final core::int #t6 = i = #t5.{core::num::+}(1) in #t5);
+  for (core::int* i = 0; i.{core::num::<}(100); c.{core::num::<}(42) ?{core::int*} throw "fisk" : let final core::int* #t3 = i in let final core::int* #t4 = i = #t3.{core::num::+}(1) in #t3) {
+    core::print(let final core::int* #t5 = i in let final core::int* #t6 = i = #t5.{core::num::+}(1) in #t5);
   }
 }
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
index aa25435..185910f 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.outline.expect
@@ -14,39 +14,39 @@
 import "dart:core" as core;
 
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     ;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     ;
 }
-class A<T extends core::Object = dynamic> extends core::Object {
+class A<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
-  constructor internal() → self::A<self::A::T>
+  constructor internal() → self::A<self::A::T*>*
     ;
-  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
-    let dynamic #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
-  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
-    let dynamic #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
-  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
+  static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
+    let dynamic #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
+    let dynamic #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+  static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
     let dynamic #redirecting_factory = "Missing" in invalid-expression;
 }
-class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
+class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
   static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
-  constructor internal() → self::B<self::B::S>
+  constructor internal() → self::B<self::B::S*>*
     ;
-  static factory a<S extends core::Object = dynamic>() → self::B<self::B::a::S>
-    let dynamic #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
-  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
-    let dynamic #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
+  static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+  static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
+    let dynamic #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
 }
-class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
-  constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends self::B<self::C::U*> {
+  constructor •() → self::C<self::C::U*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect
index c4616c2..b712837 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.expect
@@ -32,52 +32,52 @@
 import "dart:core" as core;
 
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
-class A<T extends core::Object = dynamic> extends core::Object {
+class A<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
-  constructor internal() → self::A<self::A::T>
+  constructor internal() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
-    let dynamic #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
-  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
-    let dynamic #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
-  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
+  static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
+    let dynamic #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
+    let dynamic #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+  static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
     let dynamic #redirecting_factory = "Missing" in invalid-expression;
 }
-class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
+class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
   static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
-  constructor internal() → self::B<self::B::S>
+  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
-  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
-    let dynamic #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
+  static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
+    let dynamic #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+  static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
+    let dynamic #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
 }
-class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
-  constructor •() → self::C<self::C::U>
+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>();
-  new self::C::•<self::C1>();
-  new self::C::•<self::C3>();
-  new self::C::•<self::C2>();
+  new self::C::•<self::C3*>();
+  new self::C::•<self::C1*>();
+  new self::C::•<self::C3*>();
+  new self::C::•<self::C2*>();
   invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Method not found: 'Missing'.
   factory A.c() = Missing;
           ^^^^^^^";
diff --git a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect
index 0cb3c06..c8ebf36 100644
--- a/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/generic_factory.dart.strong.transformed.expect
@@ -32,52 +32,52 @@
 import "dart:core" as core;
 
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
-class A<T extends core::Object = dynamic> extends core::Object {
+class A<T extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::a, self::A::b, self::A::c];
-  constructor internal() → self::A<self::A::T>
+  constructor internal() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
-  static factory a<T extends core::Object = dynamic>() → self::A<self::A::a::T>
-    let <S extends core::Object = dynamic>() → self::B<self::B::a::S> #redirecting_factory = self::B::a in let self::A::a::T #typeArg0 = null in invalid-expression;
-  static factory b<T extends core::Object = dynamic>() → self::A<self::A::b::T>
-    let <S extends core::Object = dynamic>() → self::B<self::B::a::S> #redirecting_factory = self::B::a in let self::C1 #typeArg0 = null in invalid-expression;
-  static factory c<T extends core::Object = dynamic>() → self::A<self::A::c::T>
-    let core::String #redirecting_factory = "Missing" in invalid-expression;
+  static factory a<T extends core::Object* = dynamic>() → self::A<self::A::a::T*>*
+    let <S extends core::Object* = dynamic>() →* self::B<self::B::a::S*>* #redirecting_factory = self::B::a in let self::A::a::T* #typeArg0 = null in invalid-expression;
+  static factory b<T extends core::Object* = dynamic>() → self::A<self::A::b::T*>*
+    let <S extends core::Object* = dynamic>() →* self::B<self::B::a::S*>* #redirecting_factory = self::B::a in let self::C1* #typeArg0 = null in invalid-expression;
+  static factory c<T extends core::Object* = dynamic>() → self::A<self::A::c::T*>*
+    let core::String* #redirecting_factory = "Missing" in invalid-expression;
 }
-class B<S extends core::Object = dynamic> extends self::A<self::B::S> {
+class B<S extends core::Object* = dynamic> extends self::A<self::B::S*> {
   static field dynamic _redirecting# = <dynamic>[self::B::a, self::B::b];
-  constructor internal() → self::B<self::B::S>
+  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>
-    let<BottomType> #redirecting_factory = self::C::• in let self::B::a::S #typeArg0 = null in invalid-expression;
-  static factory b<S extends core::Object = dynamic>() → self::B<self::B::b::S>
-    let<BottomType> #redirecting_factory = self::C::• in let self::C2 #typeArg0 = null in invalid-expression;
+  static factory a<S extends core::Object* = dynamic>() → self::B<self::B::a::S*>*
+    let<BottomType> #redirecting_factory = self::C::• in let self::B::a::S* #typeArg0 = null in invalid-expression;
+  static factory b<S extends core::Object* = dynamic>() → self::B<self::B::b::S*>*
+    let<BottomType> #redirecting_factory = self::C::• in let self::C2* #typeArg0 = null in invalid-expression;
 }
-class C<U extends core::Object = dynamic> extends self::B<self::C::U> {
-  constructor •() → self::C<self::C::U>
+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>();
-  new self::C::•<self::C1>();
-  new self::C::•<self::C3>();
-  new self::C::•<self::C2>();
+  new self::C::•<self::C3*>();
+  new self::C::•<self::C1*>();
+  new self::C::•<self::C3*>();
+  new self::C::•<self::C2*>();
   invalid-expression "pkg/front_end/testcases/rasta/generic_factory.dart:16:11: Error: Method not found: 'Missing'.
   factory A.c() = Missing;
           ^^^^^^^";
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
index 8f4a8e0..355be78 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.hierarchy.expect
@@ -94,29 +94,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -129,19 +111,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
index 6e63e38..1e569d8 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.outline.expect
@@ -7,9 +7,9 @@
 
 class Foo extends core::Object {
   final field dynamic value;
-  constructor •(dynamic value) → self::Foo
+  constructor •(dynamic value) → self::Foo*
     ;
-  static factory fac(dynamic value) → self::Foo
+  static factory fac(dynamic value) → self::Foo*
     ;
 }
 static field dynamic list;
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect
index 25e236d..cc24038 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.expect
@@ -9,13 +9,13 @@
 
 class Foo extends core::Object {
   final field dynamic value;
-  constructor •(dynamic value) → self::Foo
+  constructor •(dynamic value) → self::Foo*
     : self::Foo::value = value, super core::Object::•() {}
-  static factory fac(dynamic value) → self::Foo {
+  static factory fac(dynamic value) → self::Foo* {
     return new self::Foo::•(value);
   }
 }
-static field core::List<core::int> list = <core::int>[1, 2, 3];
+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::num::==}(2));
   exp::Expect::isTrue(self::Foo::fac(10).{self::Foo::value}.{core::Object::==}(10));
diff --git a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect
index 25e236d..cc24038 100644
--- a/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000002.dart.strong.transformed.expect
@@ -9,13 +9,13 @@
 
 class Foo extends core::Object {
   final field dynamic value;
-  constructor •(dynamic value) → self::Foo
+  constructor •(dynamic value) → self::Foo*
     : self::Foo::value = value, super core::Object::•() {}
-  static factory fac(dynamic value) → self::Foo {
+  static factory fac(dynamic value) → self::Foo* {
     return new self::Foo::•(value);
   }
 }
-static field core::List<core::int> list = <core::int>[1, 2, 3];
+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::num::==}(2));
   exp::Expect::isTrue(self::Foo::fac(10).{self::Foo::value}.{core::Object::==}(10));
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
index 8dc6d36..257f1e9 100644
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.hierarchy.expect
@@ -76,29 +76,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -111,19 +93,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect
index 6126127..ee3a0ca 100644
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.expect
@@ -7,26 +7,26 @@
 
 static field dynamic global;
 static method fact4() → dynamic {
-  core::int f = 1;
-  for (core::int n in <core::int>[1, 2, 3, 4]) {
+  core::int* f = 1;
+  for (core::int* n in <core::int*>[1, 2, 3, 4]) {
     f = f.{core::num::*}(n);
   }
   return f;
 }
 static method fact5() → dynamic {
-  core::int f = 1;
+  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} core::num) as{TypeError} core::int;
+    f = f.{core::num::*}(n as{TypeError} core::num*) as{TypeError} core::int*;
   }
   return f;
 }
 static method fact6() → dynamic {
-  core::int f = 1;
+  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} core::num) as{TypeError} core::int;
+    f = f.{core::num::*}(self::global as{TypeError} core::num*) as{TypeError} core::int*;
   }
   return f;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
index 6126127..ee3a0ca 100644
--- a/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000004.dart.strong.transformed.expect
@@ -7,26 +7,26 @@
 
 static field dynamic global;
 static method fact4() → dynamic {
-  core::int f = 1;
-  for (core::int n in <core::int>[1, 2, 3, 4]) {
+  core::int* f = 1;
+  for (core::int* n in <core::int*>[1, 2, 3, 4]) {
     f = f.{core::num::*}(n);
   }
   return f;
 }
 static method fact5() → dynamic {
-  core::int f = 1;
+  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} core::num) as{TypeError} core::int;
+    f = f.{core::num::*}(n as{TypeError} core::num*) as{TypeError} core::int*;
   }
   return f;
 }
 static method fact6() → dynamic {
-  core::int f = 1;
+  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} core::num) as{TypeError} core::int;
+    f = f.{core::num::*}(self::global as{TypeError} core::num*) as{TypeError} core::int*;
   }
   return f;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect
index 56bb4a2..a79616d 100644
--- a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> list = <core::int>[1, 2, 3];
+static field core::List<core::int*>* list = <core::int*>[1, 2, 3];
 static method main() → dynamic {
   self::list.{core::List::add}(1);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect
index 56bb4a2..a79616d 100644
--- a/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000006.dart.strong.transformed.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::List<core::int> list = <core::int>[1, 2, 3];
+static field core::List<core::int*>* list = <core::int*>[1, 2, 3];
 static method main() → dynamic {
   self::list.{core::List::add}(1);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect
index 16d9699..b88e0b2 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
+  synthetic constructor •() → self::_Sub&Base&Mixin*
     : super self::Base::•()
     ;
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
+  synthetic constructor •() → self::Sub*
     : super self::_Sub&Base&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect
index c528ee0..492c260 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.legacy.transformed.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 abstract class _Sub&Base&Mixin extends self::Base implements self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
+  synthetic constructor •() → self::_Sub&Base&Mixin*
     : super self::Base::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
+  synthetic constructor •() → self::Sub*
     : super self::_Sub&Base&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect
index 4b04cb0..8d54f1e 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.outline.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     ;
   method foo() → dynamic
     ;
 }
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
+  synthetic constructor •() → self::_Sub&Base&Mixin*
     : super self::Base::•()
     ;
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
+  synthetic constructor •() → self::Sub*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
index 2df31da..8aea3e8 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 abstract class _Sub&Base&Mixin = self::Base with self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
+  synthetic constructor •() → self::_Sub&Base&Mixin*
     : super self::Base::•()
     ;
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
+  synthetic constructor •() → self::Sub*
     : super self::_Sub&Base&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
index 70c6e40..0c4886a 100644
--- a/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000007.dart.strong.transformed.expect
@@ -3,26 +3,26 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Mixin extends core::Object {
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 abstract class _Sub&Base&Mixin extends self::Base implements self::Mixin {
-  synthetic constructor •() → self::_Sub&Base&Mixin
+  synthetic constructor •() → self::_Sub&Base&Mixin*
     : super self::Base::•()
     ;
   method foo() → dynamic
     return core::print("foo");
 }
 class Sub extends self::_Sub&Base&Mixin {
-  synthetic constructor •() → self::Sub
+  synthetic constructor •() → self::Sub*
     : super self::_Sub&Base&Mixin::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect
index 9d954d9..14255eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → self::C
+  constructor •(dynamic x) → self::C*
     : self::C::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect
index 9d954d9..14255eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → self::C
+  constructor •(dynamic x) → self::C*
     : self::C::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.outline.expect
index b9a64e4..9db0b61 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.outline.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → self::C
+  constructor •(dynamic x) → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect
index 9d954d9..14255eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → self::C
+  constructor •(dynamic x) → self::C*
     : self::C::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect
index 9d954d9..14255eb 100644
--- a/pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000008.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   final field dynamic x;
-  constructor •(dynamic x) → self::C
+  constructor •(dynamic x) → self::C*
     : self::C::x = x, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect
index cc540eb..0cafb11 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   method m() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect
index cc540eb..0cafb11 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.legacy.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   method m() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.outline.expect
index 9ff402a..9f90a91 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.outline.expect
@@ -4,11 +4,11 @@
 
 class A extends core::Object {
   field dynamic field;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   method m() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect
index 58026e4..0ace8b9 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   method m() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect
index 58026e4..0ace8b9 100644
--- a/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000012.dart.strong.transformed.expect
@@ -4,12 +4,12 @@
 
 class A extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   method m() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect
index 8bdc9ad..a3fa7d2 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.expect
@@ -6,7 +6,7 @@
   field dynamic a = null;
   field dynamic b = 0;
   field dynamic c = 1.+(2);
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
@@ -14,7 +14,7 @@
   field dynamic a = null;
   field dynamic b = 1;
   field dynamic c = 2.-(3);
-  constructor •() → self::D
+  constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect
index 8bdc9ad..a3fa7d2 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.legacy.transformed.expect
@@ -6,7 +6,7 @@
   field dynamic a = null;
   field dynamic b = 0;
   field dynamic c = 1.+(2);
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
@@ -14,7 +14,7 @@
   field dynamic a = null;
   field dynamic b = 1;
   field dynamic c = 2.-(3);
-  constructor •() → self::D
+  constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
index d2ef05c..147a7db 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.outline.expect
@@ -6,14 +6,14 @@
   field dynamic a;
   field dynamic b;
   field dynamic c;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object {
   field dynamic a;
   field dynamic b;
   field dynamic c;
-  constructor •() → self::D
+  constructor •() → self::D*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect
index 01488e9..f07b514 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.expect
@@ -4,17 +4,17 @@
 
 class C extends core::Object {
   field dynamic a = null;
-  field core::int b = 0;
-  field core::int c = 1.{core::num::+}(2);
-  synthetic constructor •() → self::C
+  field core::int* b = 0;
+  field core::int* c = 1.{core::num::+}(2);
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field dynamic a = null;
-  field core::int b = 1;
-  field core::int c = 2.{core::num::-}(3);
-  constructor •() → self::D
+  field core::int* b = 1;
+  field core::int* c = 2.{core::num::-}(3);
+  constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
index 01488e9..f07b514 100644
--- a/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000026.dart.strong.transformed.expect
@@ -4,17 +4,17 @@
 
 class C extends core::Object {
   field dynamic a = null;
-  field core::int b = 0;
-  field core::int c = 1.{core::num::+}(2);
-  synthetic constructor •() → self::C
+  field core::int* b = 0;
+  field core::int* c = 1.{core::num::+}(2);
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object {
   field dynamic a = null;
-  field core::int b = 1;
-  field core::int c = 2.{core::num::-}(3);
-  constructor •() → self::D
+  field core::int* b = 1;
+  field core::int* c = 2.{core::num::-}(3);
+  constructor •() → self::D*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
index bd752a1..38593f7 100644
--- a/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000031.dart.strong.transformed.expect
@@ -14,5 +14,5 @@
 static method main() → dynamic {
   let final dynamic #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 let final core::String #t2 = #t1.{core::Object::toString}() in #t1;
+  ^^^^" in let final core::String* #t2 = #t1.{core::Object::toString}() in #t1;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
index 3e08a90..4045a94 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.outline.expect
@@ -23,7 +23,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
index c9b5781..0bcb6e2 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.expect
@@ -37,7 +37,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
index c9b5781..0bcb6e2 100644
--- a/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000032.dart.strong.transformed.expect
@@ -37,7 +37,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect
index 6a631bc..e901592 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.expect
@@ -15,12 +15,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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;
               ^"
     ;
 }
 static method main() → dynamic {
-  const self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect
index 6a631bc..e901592 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.legacy.transformed.expect
@@ -15,12 +15,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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;
               ^"
     ;
 }
 static method main() → dynamic {
-  const self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
index 7e1b270..02e6d34 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.outline.expect
@@ -7,11 +7,18 @@
 //   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 {
-  const constructor •() → self::C
+  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;
+              ^"
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.expect
index 6a631bc..e901592 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.expect
@@ -15,12 +15,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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;
               ^"
     ;
 }
 static method main() → dynamic {
-  const self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000034.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.transformed.expect
index 6a631bc..e901592 100644
--- a/pkg/front_end/testcases/rasta/issue_000034.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000034.dart.strong.transformed.expect
@@ -15,12 +15,14 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  const constructor •() → self::C
+  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;
               ^"
     ;
 }
 static method main() → dynamic {
-  const self::C::•();
+  invalid-expression "pkg/front_end/testcases/rasta/issue_000034.dart:6:15: Error: This couldn't be parsed.
+  const C() : this.x;
+              ^";
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect
index 793cade..3d22952 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   abstract method æøC() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect
index 793cade..3d22952 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.legacy.transformed.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   abstract method æøC() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
index 70748ad..347c841 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.outline.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   abstract method æøC() → dynamic;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect
index 793cade..3d22952 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   abstract method æøC() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect
index 793cade..3d22952 100644
--- a/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035.dart.strong.transformed.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   abstract method æøC() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect
index 6e7d2e5..a4f9fec 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect
index 6e7d2e5..a4f9fec 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.legacy.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
index b67d8e0..a7d63f3 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.outline.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect
index 6e7d2e5..a4f9fec 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect
index 6e7d2e5..a4f9fec 100644
--- a/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000035a.dart.strong.transformed.expect
@@ -14,7 +14,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000039.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000039.dart.outline.expect
index db8dbba..3b04229 100644
--- a/pkg/front_end/testcases/rasta/issue_000039.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000039.dart.outline.expect
@@ -4,10 +4,10 @@
 
 class A extends core::Object {
   field dynamic a;
-  constructor •(dynamic x) → self::A
+  constructor •(dynamic x) → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000039.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000039.dart.strong.expect
index 564c718..0e2b712 100644
--- a/pkg/front_end/testcases/rasta/issue_000039.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000039.dart.strong.expect
@@ -23,7 +23,7 @@
 
 class A extends core::Object {
   field dynamic a = null;
-  constructor •(dynamic x) → self::A
+  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 ''.
   }
@@ -31,7 +31,7 @@
   }
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect
index 564c718..0e2b712 100644
--- a/pkg/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000039.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 
 class A extends core::Object {
   field dynamic a = null;
-  constructor •(dynamic x) → self::A
+  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 ''.
   }
@@ -31,7 +31,7 @@
   }
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect
index 252265a..cc80411 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.expect
@@ -16,7 +16,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect
index 252265a..cc80411 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.legacy.transformed.expect
@@ -16,7 +16,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.outline.expect
index 7f6021d..ff49757 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method test() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
index f53740d..10c01ce 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.expect
@@ -16,7 +16,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.transformed.expect
index f53740d..10c01ce 100644
--- a/pkg/front_end/testcases/rasta/issue_000041.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000041.dart.strong.transformed.expect
@@ -16,7 +16,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
index da8f0c6..2abfb5d 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.expect
@@ -47,18 +47,23 @@
   #L3:
   switch(1) {
     #L4:
-    case 1:
+    case #C1:
       {
         break #L3;
       }
     #L5:
-    case 2:
+    case #C2:
       {
         break #L3;
       }
   }
   try {
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
index da8f0c6..2abfb5d 100644
--- a/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000042.dart.strong.transformed.expect
@@ -47,18 +47,23 @@
   #L3:
   switch(1) {
     #L4:
-    case 1:
+    case #C1:
       {
         break #L3;
       }
     #L5:
-    case 2:
+    case #C2:
       {
         break #L3;
       }
   }
   try {
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.outline.expect
index c9f2a90..5117eb3 100644
--- a/pkg/front_end/testcases/rasta/issue_000043.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   get x() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect
index 84c90c8..15d107d 100644
--- a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
-    return "${self::C}".{core::String::hashCode};
+    return "${self::C*}".{core::String::hashCode};
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
index 84c90c8..15d107d 100644
--- a/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000043.dart.strong.transformed.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
-    return "${self::C}".{core::String::hashCode};
+    return "${self::C*}".{core::String::hashCode};
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
index 5d12971..35d0544 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.outline.expect
@@ -30,13 +30,14 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::good];
-  const constructor constant() → self::C
+  const constructor constant() → self::C*
+    : super core::Object::•()
     ;
-  constructor missingFactoryKeyword() → self::C
+  constructor missingFactoryKeyword() → self::C*
     ;
-  static factory good() → self::C
+  static factory good() → self::C*
     let dynamic #redirecting_factory = self::C::constant in invalid-expression;
-  method notEvenAConstructor(dynamic a) → self::C
+  method notEvenAConstructor(dynamic a) → self::C*
     ;
 }
 static method b(dynamic c) → invalid-type
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect
index 801849b..c7e3f5b 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.expect
@@ -68,35 +68,39 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::good];
-  const constructor constant() → self::C
+  const constructor constant() → self::C*
     : super core::Object::•()
     ;
-  constructor missingFactoryKeyword() → self::C
+  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
+  static factory good() → self::C*
     let dynamic #redirecting_factory = self::C::constant in invalid-expression;
-  method notEvenAConstructor(dynamic a) → self::C
+  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;
-                             ^" as{TypeError} self::C;
+                             ^" as{TypeError} self::C*;
 }
 static method b(dynamic c) → invalid-type
   return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Getter not found: 'd'.
 a b(c) = d;
          ^" as{TypeError} invalid-type;
 static method main() → dynamic {
-  self::C c = null;
-  core::print(const self::C::constant());
+  self::C* c = null;
+  core::print(#C1);
   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(const self::C::constant());
+  core::print(#C1);
   core::print(new self::C::constant().{self::C::notEvenAConstructor}(null));
 }
+
+constants  {
+  #C1 = self::C {}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect
index 6ea0318..2430f63 100644
--- a/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000044.dart.strong.transformed.expect
@@ -68,35 +68,39 @@
 
 class C extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::good];
-  const constructor constant() → self::C
+  const constructor constant() → self::C*
     : super core::Object::•()
     ;
-  constructor missingFactoryKeyword() → self::C
+  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
+  static factory good() → self::C*
     let<BottomType> #redirecting_factory = self::C::constant in invalid-expression;
-  method notEvenAConstructor(dynamic a) → self::C
+  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;
-                             ^" as{TypeError} self::C;
+                             ^" as{TypeError} self::C*;
 }
 static method b(dynamic c) → invalid-type
   return invalid-expression "pkg/front_end/testcases/rasta/issue_000044.dart:7:10: Error: Getter not found: 'd'.
 a b(c) = d;
          ^" as{TypeError} invalid-type;
 static method main() → dynamic {
-  self::C c = null;
-  core::print(const self::C::constant());
+  self::C* c = null;
+  core::print(#C1);
   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(const self::C::constant());
+  core::print(#C1);
   core::print(new self::C::constant().{self::C::notEvenAConstructor}(null));
 }
+
+constants  {
+  #C1 = self::C {}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect
index 03e6bea..5ba14a8 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.expect
@@ -22,8 +22,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field self::C c = new core::Object::•();
-  synthetic constructor •() → self::C
+  field self::C* c = new core::Object::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect
index 03e6bea..5ba14a8 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.legacy.transformed.expect
@@ -22,8 +22,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field self::C c = new core::Object::•();
-  synthetic constructor •() → self::C
+  field self::C* c = new core::Object::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
index dace12b..c437b27 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.outline.expect
@@ -22,7 +22,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field self::C c;
-  synthetic constructor •() → self::C
+  field self::C* c;
+  synthetic constructor •() → self::C*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect
index 5bc1e07..82f0aca 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.expect
@@ -29,13 +29,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field self::C c = let final<BottomType> #t1 = 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'.
+  field self::C* c = let final<BottomType> #t1 = 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
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect
index 5bc1e07..82f0aca 100644
--- a/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000046.dart.strong.transformed.expect
@@ -29,13 +29,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field self::C c = let final<BottomType> #t1 = 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'.
+  field self::C* c = let final<BottomType> #t1 = 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
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect
index 2683e8b..2ae0040 100644
--- a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.expect
@@ -8,6 +8,6 @@
 //
 import self as self;
 
-typedef T = (dynamic) → void;
-static method main() → (dynamic) → void
+typedef T = (dynamic) →* void;
+static method main() → (dynamic) →* void
   return null;
diff --git a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect
index 2683e8b..2ae0040 100644
--- a/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000047.dart.strong.transformed.expect
@@ -8,6 +8,6 @@
 //
 import self as self;
 
-typedef T = (dynamic) → void;
-static method main() → (dynamic) → void
+typedef T = (dynamic) →* void;
+static method main() → (dynamic) →* void
   return null;
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect
index 06247c1..544c828 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.expect
@@ -3,23 +3,23 @@
 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
+  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::•()
     ;
 }
 class M1 extends core::Object {
-  field core::num v2 = 0;
-  synthetic constructor •() → self::M1
+  field core::num* v2 = 0;
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
 class C = self::A with self::M1 {
-  synthetic constructor •(core::bool v1, core::num v2) → self::C
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
     : super self::A::•(v1, v2)
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(true, 2);
+  self::C* c = new self::C::•(true, 2);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect
index 4a79310..ed8c072 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.legacy.transformed.expect
@@ -3,24 +3,24 @@
 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
+  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::•()
     ;
 }
 class M1 extends core::Object {
-  field core::num v2 = 0;
-  synthetic constructor •() → self::M1
+  field core::num* v2 = 0;
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
 class C extends self::A implements self::M1 {
-  field core::num v2 = 0;
-  synthetic constructor •(core::bool v1, core::num v2) → self::C
+  field core::num* v2 = 0;
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
     : super self::A::•(v1, v2)
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(true, 2);
+  self::C* c = new self::C::•(true, 2);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
index 08c49b2..a0d3453 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.outline.expect
@@ -3,18 +3,18 @@
 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
+  field core::bool* v1;
+  field core::num* v2;
+  constructor •(core::bool* v1, core::num* v2) → self::A*
     ;
 }
 class M1 extends core::Object {
-  field core::num v2;
-  synthetic constructor •() → self::M1
+  field core::num* v2;
+  synthetic constructor •() → self::M1*
     ;
 }
 class C = self::A with self::M1 {
-  synthetic constructor •(core::bool v1, core::num v2) → self::C
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
     : super self::A::•(v1, v2)
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect
index 06247c1..544c828 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.expect
@@ -3,23 +3,23 @@
 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
+  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::•()
     ;
 }
 class M1 extends core::Object {
-  field core::num v2 = 0;
-  synthetic constructor •() → self::M1
+  field core::num* v2 = 0;
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
 class C = self::A with self::M1 {
-  synthetic constructor •(core::bool v1, core::num v2) → self::C
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
     : super self::A::•(v1, v2)
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(true, 2);
+  self::C* c = new self::C::•(true, 2);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect
index 4a79310..ed8c072 100644
--- a/pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000048.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 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
+  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::•()
     ;
 }
 class M1 extends core::Object {
-  field core::num v2 = 0;
-  synthetic constructor •() → self::M1
+  field core::num* v2 = 0;
+  synthetic constructor •() → self::M1*
     : super core::Object::•()
     ;
 }
 class C extends self::A implements self::M1 {
-  field core::num v2 = 0;
-  synthetic constructor •(core::bool v1, core::num v2) → self::C
+  field core::num* v2 = 0;
+  synthetic constructor •(core::bool* v1, core::num* v2) → self::C*
     : super self::A::•(v1, v2)
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•(true, 2);
+  self::C* c = new self::C::•(true, 2);
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
index 8b500e6..ed31e8d 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null {
+  function f() → core::Null* {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
index 8b500e6..ed31e8d 100644
--- a/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000052.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  function f() → core::Null {
+  function f() → core::Null* {
     core::print("hello");
   }
   f.call();
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect
index 4dbd973..461f258 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return throw "x";
   method test() → dynamic {
     super.{core::Object::==}(null);
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect
index 4dbd973..461f258 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return throw "x";
   method test() → dynamic {
     super.{core::Object::==}(null);
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect
index f3f1fd5..c5a10b7 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.outline.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     ;
   method test() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect
index c3a0237..8272737 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return throw "x";
   method test() → dynamic {
     super.{core::Object::==}(null);
diff --git a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect
index c3a0237..8272737 100644
--- a/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000053.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return throw "x";
   method test() → dynamic {
     super.{core::Object::==}(null);
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
index e760d0a..7f642c2 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.hierarchy.expect
@@ -137,29 +137,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -172,19 +154,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect
index ad715d1..a79fae9 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.expect
@@ -7,31 +7,31 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•() {}
-  static factory foo() → self::A
+  static factory foo() → self::A*
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
-  method m() → core::int {}
+  method m() → core::int* {}
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::A::•() {}
-  static factory bar() → self::C
+  static factory bar() → self::C*
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  method m() → core::int {
+  method m() → core::int* {
     return 1;
   }
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m() → core::int {
+  method m() → core::int* {
     return 2;
   }
 }
 static method main() → dynamic {
-  self::A a = new self::D::•();
+  self::A* a = new self::D::•();
   exp::Expect::equals(2, a.m());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect
index ad715d1..a79fae9 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.legacy.transformed.expect
@@ -7,31 +7,31 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•() {}
-  static factory foo() → self::A
+  static factory foo() → self::A*
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
-  method m() → core::int {}
+  method m() → core::int* {}
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::A::•() {}
-  static factory bar() → self::C
+  static factory bar() → self::C*
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  method m() → core::int {
+  method m() → core::int* {
     return 1;
   }
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m() → core::int {
+  method m() → core::int* {
     return 2;
   }
 }
 static method main() → dynamic {
-  self::A a = new self::D::•();
+  self::A* a = new self::D::•();
   exp::Expect::equals(2, a.m());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect
index 2416e8c..fc028dd 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.outline.expect
@@ -6,26 +6,26 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → self::A
+  constructor •() → self::A*
     ;
-  static factory foo() → self::A
+  static factory foo() → self::A*
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
-  method m() → core::int
+  method m() → core::int*
     ;
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
-  static factory bar() → self::C
+  static factory bar() → self::C*
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  method m() → core::int
+  method m() → core::int*
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  method m() → core::int
+  method m() → core::int*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect
index 936c23e..b56a0be 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.expect
@@ -7,31 +7,31 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•() {}
-  static factory foo() → self::A
+  static factory foo() → self::A*
     let dynamic #redirecting_factory = self::C::bar in invalid-expression;
-  method m() → core::int {}
+  method m() → core::int* {}
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::A::•() {}
-  static factory bar() → self::C
+  static factory bar() → self::C*
     let dynamic #redirecting_factory = self::D::• in invalid-expression;
-  method m() → core::int {
+  method m() → core::int* {
     return 1;
   }
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m() → core::int {
+  method m() → core::int* {
     return 2;
   }
 }
 static method main() → dynamic {
-  self::A a = new self::D::•();
+  self::A* a = new self::D::•();
   exp::Expect::equals(2, a.{self::A::m}());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect
index 25a5efa..0c73e75 100644
--- a/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000067.dart.strong.transformed.expect
@@ -7,31 +7,31 @@
 
 class A extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::A::foo];
-  constructor •() → self::A
+  constructor •() → self::A*
     : super core::Object::•() {}
-  static factory foo() → self::A
-    let () → self::C #redirecting_factory = self::C::bar in invalid-expression;
-  method m() → core::int {}
+  static factory foo() → self::A*
+    let () →* self::C* #redirecting_factory = self::C::bar in invalid-expression;
+  method m() → core::int* {}
 }
 class C extends self::A {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C
+  constructor •() → self::C*
     : super self::A::•() {}
-  static factory bar() → self::C
+  static factory bar() → self::C*
     let<BottomType> #redirecting_factory = self::D::• in invalid-expression;
-  method m() → core::int {
+  method m() → core::int* {
     return 1;
   }
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method m() → core::int {
+  method m() → core::int* {
     return 2;
   }
 }
 static method main() → dynamic {
-  self::A a = new self::D::•();
+  self::A* a = new self::D::•();
   exp::Expect::equals(2, a.{self::A::m}());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
index cfd122c..4f43eef 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.hierarchy.expect
@@ -147,29 +147,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -182,19 +164,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect
index 8148c18..e2d49f4 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.expect
@@ -5,32 +5,32 @@
 
 import "package:expect/expect.dart";
 
-class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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>);
+  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_000068.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.transformed.expect
index 8148c18..e2d49f4 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.legacy.transformed.expect
@@ -5,32 +5,32 @@
 
 import "package:expect/expect.dart";
 
-class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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>);
+  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_000068.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
index ba0bd39..abf46bf 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.outline.expect
@@ -4,20 +4,20 @@
 
 import "package:expect/expect.dart";
 
-class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect
index 8148c18..e2d49f4 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.expect
@@ -5,32 +5,32 @@
 
 import "package:expect/expect.dart";
 
-class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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>);
+  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_000068.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.transformed.expect
index 8148c18..e2d49f4 100644
--- a/pkg/front_end/testcases/rasta/issue_000068.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000068.dart.strong.transformed.expect
@@ -5,32 +5,32 @@
 
 import "package:expect/expect.dart";
 
-class G<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::G<self::G::T>
+class G<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::G<self::G::T*>*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  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>);
+  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.strong.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect
index ec1feb2..12a916f 100644
--- a/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.expect
@@ -4,8 +4,8 @@
 
 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) in #t1).{core::num::<}(5)) {
-    core::int x = i;
+  core::int* i = 0;
+  while ((let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1) in #t1).{core::num::<}(5)) {
+    core::int* x = i;
   }
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect
index ec1feb2..12a916f 100644
--- a/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000069.dart.strong.transformed.expect
@@ -4,8 +4,8 @@
 
 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) in #t1).{core::num::<}(5)) {
-    core::int x = i;
+  core::int* i = 0;
+  while ((let final core::int* #t1 = i in let final core::int* #t2 = i = #t1.{core::num::+}(1) in #t1).{core::num::<}(5)) {
+    core::int* x = i;
   }
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
index dbe120e..2c66573 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.hierarchy.expect
@@ -131,29 +131,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -166,19 +148,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect
index 1deecbc..661cea2 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.expect
@@ -5,41 +5,47 @@
 
 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 {
-  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 = core::List::•<self::A::U>(), super core::Object::•() {
-    exp::Expect::isTrue(n is self::A::N);
-    exp::Expect::isTrue(s is self::A::S);
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  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 = core::List::•<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>
+  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 = const <dynamic>[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);
+  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<dynamic, dynamic, dynamic>();
   }
-  get getter() → core::List<self::A::U> {
+  get getter() → core::List<self::A::U*>* {
     return this.{self::A::field};
   }
-  set setter(generic-covariant-impl self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S* s) → void {}
 }
-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>
+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 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>
+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);
-  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
+  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;
   dynamic z = a.getter;
   a.setter = 1;
 }
+
+constants  {
+  #C1 = null
+  #C2 = <dynamic>[#C1]
+  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
index 6f8f772..ebadef3 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.legacy.transformed.expect
@@ -5,41 +5,47 @@
 
 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 {
-  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 = core::_GrowableList::•<self::A::U>(0), super core::Object::•() {
-    exp::Expect::isTrue(n is self::A::N);
-    exp::Expect::isTrue(s is self::A::S);
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  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 = core::_GrowableList::•<self::A::U*>(0), 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>
+  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 = const <dynamic>[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);
+  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<dynamic, dynamic, dynamic>();
   }
-  get getter() → core::List<self::A::U> {
+  get getter() → core::List<self::A::U*>* {
     return this.{self::A::field};
   }
-  set setter(generic-covariant-impl self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S* s) → void {}
 }
-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>
+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 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>
+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);
-  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
+  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;
   dynamic z = a.getter;
   a.setter = 1;
 }
+
+constants  {
+  #C1 = null
+  #C2 = <dynamic>[#C1]
+  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
index 89051be..45c7070 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.outline.expect
@@ -4,27 +4,28 @@
 
 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 {
-  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>
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  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*>*
     ;
-  constructor empty() → self::A<self::A::N, self::A::S, self::A::U>
+  constructor empty() → self::A<self::A::N*, self::A::S*, self::A::U*>*
     ;
-  const constructor c(self::A::U u, self::A::S s) → self::A<self::A::N, self::A::S, self::A::U>
+  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 = const <dynamic>[null], 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>
+  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*>*
     ;
-  get getter() → core::List<self::A::U>
+  get getter() → core::List<self::A::U*>*
     ;
-  set setter(generic-covariant-impl self::A::S s) → void
+  set setter(generic-covariant-impl self::A::S* s) → void
     ;
 }
-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>
+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*>*
     ;
 }
-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>
+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*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
index 82beacc..c9aa9ff 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.expect
@@ -5,41 +5,47 @@
 
 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 {
-  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 = core::List::•<self::A::U>(), super core::Object::•() {
-    exp::Expect::isTrue(n is self::A::N);
-    exp::Expect::isTrue(s is self::A::S);
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  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 = core::List::•<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>
+  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 = const <core::Null>[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>();
+  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> {
+  get getter() → core::List<self::A::U*>* {
     return this.{self::A::field};
   }
-  set setter(generic-covariant-impl self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S* s) → void {}
 }
-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>
+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 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>
+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);
-  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
-  core::List<dynamic> z = a.{self::A::getter};
+  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};
   a.{self::A::setter} = 1;
 }
+
+constants  {
+  #C1 = null
+  #C2 = <core::Null*>[#C1]
+  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
index e99b7e6..9a4571e 100644
--- a/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000070.dart.strong.transformed.expect
@@ -5,41 +5,47 @@
 
 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 {
-  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 = core::_GrowableList::•<self::A::U>(0), super core::Object::•() {
-    exp::Expect::isTrue(n is self::A::N);
-    exp::Expect::isTrue(s is self::A::S);
+class A<N extends core::Object* = dynamic, S extends core::Object* = dynamic, U extends core::Object* = dynamic> extends core::Object {
+  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 = core::_GrowableList::•<self::A::U*>(0), 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>
+  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 = const <core::Null>[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>();
+  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> {
+  get getter() → core::List<self::A::U*>* {
     return this.{self::A::field};
   }
-  set setter(generic-covariant-impl self::A::S s) → void {}
+  set setter(generic-covariant-impl self::A::S* s) → void {}
 }
-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>
+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 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>
+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);
-  const self::A::c<core::int, core::int, core::List<dynamic>>(const <dynamic>[], 1);
-  core::List<dynamic> z = a.{self::A::getter};
+  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};
   a.{self::A::setter} = 1;
 }
+
+constants  {
+  #C1 = null
+  #C2 = <core::Null*>[#C1]
+  #C3 = self::A<core::int*, core::int*, core::List<dynamic>*> {field:#C2}
+}
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect
index 3a5b253..ea8de52 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.expect
@@ -4,19 +4,19 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return 87;
 }
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_Foo&Object&Mixin
+  synthetic constructor •() → self::_Foo&Object&Mixin*
     : super core::Object::•()
     ;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect
index 290a349..1b1ac3d 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,14 +12,14 @@
 }
 abstract class _Foo&Object&Mixin extends core::Object implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_Foo&Object&Mixin
+  synthetic constructor •() → self::_Foo&Object&Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return 87;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect
index 140dcbb..ef15719 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.outline.expect
@@ -4,18 +4,18 @@
 
 class Mixin extends core::Object {
   field dynamic field;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     ;
   method foo() → dynamic
     ;
 }
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_Foo&Object&Mixin
+  synthetic constructor •() → self::_Foo&Object&Mixin*
     : super core::Object::•()
     ;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
index b027643..c7b2aaa 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.expect
@@ -4,19 +4,19 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return 87;
 }
 abstract class _Foo&Object&Mixin = core::Object with self::Mixin {
-  synthetic constructor •() → self::_Foo&Object&Mixin
+  synthetic constructor •() → self::_Foo&Object&Mixin*
     : super core::Object::•()
     ;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
@@ -25,7 +25,7 @@
     return super.{self::Mixin::field};
 }
 static method main() → dynamic {
-  self::Foo f = new self::Foo::•();
+  self::Foo* f = new self::Foo::•();
   f.{self::Mixin::field} = 42;
   core::print(f.{self::Foo::bar}());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
index 060831f..37e2112 100644
--- a/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000080.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class Mixin extends core::Object {
   field dynamic field = null;
-  synthetic constructor •() → self::Mixin
+  synthetic constructor •() → self::Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -12,14 +12,14 @@
 }
 abstract class _Foo&Object&Mixin extends core::Object implements self::Mixin {
   field dynamic field = null;
-  synthetic constructor •() → self::_Foo&Object&Mixin
+  synthetic constructor •() → self::_Foo&Object&Mixin*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return 87;
 }
 class Foo extends self::_Foo&Object&Mixin {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super self::_Foo&Object&Mixin::•()
     ;
   method foo() → dynamic
@@ -28,7 +28,7 @@
     return super.{self::Mixin::field};
 }
 static method main() → dynamic {
-  self::Foo f = new self::Foo::•();
+  self::Foo* f = new self::Foo::•();
   f.{self::Mixin::field} = 42;
   core::print(f.{self::Foo::bar}());
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect
index b12559d..407d063 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.outline.expect
@@ -3,15 +3,15 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  field core::int hashCode;
-  synthetic constructor •() → self::Base
+  field core::int* hashCode;
+  synthetic constructor •() → self::Base*
     ;
 }
 class Sub extends self::Base {
-  field core::int _hashCode;
-  synthetic constructor •() → self::Sub
+  field core::int* _hashCode;
+  synthetic constructor •() → self::Sub*
     ;
-  get hashCode() → core::int
+  get hashCode() → core::int*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
index eb53a96..17c277f 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  field core::int hashCode = 42;
-  synthetic constructor •() → self::Base
+  field core::int* hashCode = 42;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Sub extends self::Base {
-  field core::int _hashCode = null;
-  synthetic constructor •() → self::Sub
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
+  get hashCode() → core::int*
+    return let final core::int* #t1 = this.{self::Sub::_hashCode} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
   method foo() → dynamic {
-    this.{self::Sub::_hashCode}.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : null;
+    this.{self::Sub::_hashCode}.{core::num::==}(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::List<core::Null> l = <core::Null>[null];
-  let final core::List<core::Null> #t2 = l in let final core::int #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String} let final core::String #t4 = "fisk" as{TypeError} core::Null in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
+  core::List<core::Null*>* l = <core::Null*>[null];
+  let final core::List<core::Null*>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} let final core::String* #t4 = "fisk" as{TypeError} core::Null* in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
 }
diff --git a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
index eb53a96..17c277f 100644
--- a/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/issue_000081.dart.strong.transformed.expect
@@ -3,24 +3,24 @@
 import "dart:core" as core;
 
 class Base extends core::Object {
-  field core::int hashCode = 42;
-  synthetic constructor •() → self::Base
+  field core::int* hashCode = 42;
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
 class Sub extends self::Base {
-  field core::int _hashCode = null;
-  synthetic constructor •() → self::Sub
+  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} in #t1.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
+  get hashCode() → core::int*
+    return let final core::int* #t1 = this.{self::Sub::_hashCode} in #t1.{core::num::==}(null) ?{core::int*} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : #t1;
   method foo() → dynamic {
-    this.{self::Sub::_hashCode}.{core::num::==}(null) ?{core::int} this.{self::Sub::_hashCode} = super.{self::Base::hashCode} : null;
+    this.{self::Sub::_hashCode}.{core::num::==}(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::List<core::Null> l = <core::Null>[null];
-  let final core::List<core::Null> #t2 = l in let final core::int #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String} let final core::String #t4 = "fisk" as{TypeError} core::Null in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
+  core::List<core::Null*>* l = <core::Null*>[null];
+  let final core::List<core::Null*>* #t2 = l in let final core::int* #t3 = 0 in #t2.{core::List::[]}(#t3).{core::Object::==}(null) ?{core::String*} let final core::String* #t4 = "fisk" as{TypeError} core::Null* in let final void #t5 = #t2.{core::List::[]=}(#t3, #t4) in #t4 : null;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
index d9be9b4..a53eb28 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.outline.expect
@@ -25,7 +25,7 @@
 
 class A extends core::Object {
   field dynamic x;
-  constructor •() → self::A
+  constructor •() → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect
index f279790..efff4dd 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.expect
@@ -29,8 +29,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::String x = "foo";
-  constructor •() → self::A
+  field core::String* x = "foo";
+  constructor •() → self::A*
     : self::A::x = "foo", super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect
index f279790..efff4dd 100644
--- a/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_const_constructor.dart.strong.transformed.expect
@@ -29,8 +29,8 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::String x = "foo";
-  constructor •() → self::A
+  field core::String* x = "foo";
+  constructor •() → self::A*
     : self::A::x = "foo", super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect
index a560042..1cb9f39 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → invalid-type;
+typedef Handle = (core::String*) →* invalid-type;
 static method main() → dynamic {
-  (core::String) → invalid-type h;
+  (core::String*) →* invalid-type h;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect
index a560042..1cb9f39 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → invalid-type;
+typedef Handle = (core::String*) →* invalid-type;
 static method main() → dynamic {
-  (core::String) → invalid-type h;
+  (core::String*) →* invalid-type h;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
index b38e97e..6c35ab9 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.outline.expect
@@ -9,6 +9,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → invalid-type;
+typedef Handle = (core::String*) →* invalid-type;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
index a560042..1cb9f39 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → invalid-type;
+typedef Handle = (core::String*) →* invalid-type;
 static method main() → dynamic {
-  (core::String) → invalid-type h;
+  (core::String*) →* invalid-type h;
 }
diff --git a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
index a560042..1cb9f39 100644
--- a/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/malformed_function_type.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Handle = (core::String) → invalid-type;
+typedef Handle = (core::String*) →* invalid-type;
 static method main() → dynamic {
-  (core::String) → invalid-type h;
+  (core::String*) →* invalid-type h;
 }
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect
index f49eacf..8fc1e32 100644
--- a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.expect
@@ -1,3 +1,13 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:18: Error: Can't have a non-constant List literal within a const context.
+// main(arguments = [x]) {
+//                  ^
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:6: Context: While analyzing:
+// main(arguments = [x]) {
+//      ^
+//
 library;
 //
 // Problems in library:
@@ -13,6 +23,4 @@
 //
 import self as self;
 
-static method main(dynamic arguments = <dynamic>[invalid-expression "pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Getter not found: 'x'.
-main(arguments = [x]) {
-                  ^"]) → dynamic {}
+static method main(dynamic arguments = invalid-expression "Can't have a non-constant List literal within a const context.") → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect
index f49eacf..8fc1e32 100644
--- a/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart.strong.transformed.expect
@@ -1,3 +1,13 @@
+//
+// Problems in component:
+//
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:18: Error: Can't have a non-constant List literal within a const context.
+// main(arguments = [x]) {
+//                  ^
+// pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:6: Context: While analyzing:
+// main(arguments = [x]) {
+//      ^
+//
 library;
 //
 // Problems in library:
@@ -13,6 +23,4 @@
 //
 import self as self;
 
-static method main(dynamic arguments = <dynamic>[invalid-expression "pkg/front_end/testcases/rasta/mandatory_parameter_initializer.dart:5:19: Error: Getter not found: 'x'.
-main(arguments = [x]) {
-                  ^"]) → dynamic {}
+static method main(dynamic arguments = invalid-expression "Can't have a non-constant List literal within a const context.") → dynamic {}
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
index 47e7cdf..17b2ebb 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.outline.expect
@@ -2,16 +2,16 @@
 import self as self;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x;
   field dynamic y;
   field dynamic z;
-  generic-covariant-impl field self::Mixin::T t;
-  synthetic constructor •() → self::Mixin<self::Mixin::T>
+  generic-covariant-impl field self::Mixin::T* t;
+  synthetic constructor •() → self::Mixin<self::Mixin::T*>*
     ;
   method foo() → dynamic
     ;
-  method g(generic-covariant-impl self::Mixin::T a) → self::Mixin::T
+  method g(generic-covariant-impl self::Mixin::T* a) → self::Mixin::T*
     ;
   method h() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
index e919718..a5e12f1 100644
--- a/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/mixin_library.dart.strong.expect
@@ -9,17 +9,17 @@
 import self as self;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x = self::f();
   field dynamic y = null;
   field dynamic z = null;
-  generic-covariant-impl field self::Mixin::T t = null;
-  synthetic constructor •() → self::Mixin<self::Mixin::T>
+  generic-covariant-impl field self::Mixin::T* t = null;
+  synthetic constructor •() → self::Mixin<self::Mixin::T*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(self::f());
-  method g(generic-covariant-impl self::Mixin::T a) → self::Mixin::T
+  method g(generic-covariant-impl self::Mixin::T* a) → self::Mixin::T*
     return null;
   method h() → dynamic
     return self::V();
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.outline.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.outline.expect
index fc3831b..efae6ca 100644
--- a/pkg/front_end/testcases/rasta/native_is_illegal.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.outline.expect
@@ -3,14 +3,9 @@
 import "dart:core" as core;
 
 class Bar extends core::Object {
-  get x() → self::Bar
-    ;
-  set x(self::Bar value) → void
-    ;
-  method f() → dynamic
-    ;
-  static factory •() → self::Bar
-    ;
+  external get x() → self::Bar*;
+  external set x(self::Bar* value) → void;
+  external method f() → dynamic;
+  external static factory •() → self::Bar*;
 }
-static method foo() → dynamic
-  ;
+external static method foo() → dynamic;
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect
index 12904aa..84eda80 100644
--- a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.expect
@@ -4,14 +4,27 @@
 import "dart:_internal" as _in;
 
 class Bar extends core::Object {
-  @_in::ExternalName::•("Bar_get_x")
-  external get x() → self::Bar;
-  @_in::ExternalName::•("Bar_set_x")
-  external set x(self::Bar value) → void;
-  @_in::ExternalName::•("Bar_f")
+  @#C2
+  external get x() → self::Bar*;
+  @#C4
+  external set x(self::Bar* value) → void;
+  @#C6
   external method f() → dynamic;
-  @_in::ExternalName::•("Bar_constructor")
-  external static factory •() → self::Bar;
+  @#C8
+  external static factory •() → self::Bar*;
 }
-@_in::ExternalName::•("foo")
+@#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}
+}
diff --git a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect
index 12904aa..84eda80 100644
--- a/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/native_is_illegal.dart.strong.transformed.expect
@@ -4,14 +4,27 @@
 import "dart:_internal" as _in;
 
 class Bar extends core::Object {
-  @_in::ExternalName::•("Bar_get_x")
-  external get x() → self::Bar;
-  @_in::ExternalName::•("Bar_set_x")
-  external set x(self::Bar value) → void;
-  @_in::ExternalName::•("Bar_f")
+  @#C2
+  external get x() → self::Bar*;
+  @#C4
+  external set x(self::Bar* value) → void;
+  @#C6
   external method f() → dynamic;
-  @_in::ExternalName::•("Bar_constructor")
-  external static factory •() → self::Bar;
+  @#C8
+  external static factory •() → self::Bar*;
 }
-@_in::ExternalName::•("foo")
+@#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}
+}
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect b/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
index 8dc6d36..257f1e9 100644
--- a/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.hierarchy.expect
@@ -76,29 +76,11 @@
     Expect.throwsFormatException
   classSetters:
 
-Exception:
+ExpectException:
   superclasses:
     Object
   interfaces:
   classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
     ExpectException.message
     ExpectException.toString
     Object.runtimeType
@@ -111,19 +93,6 @@
     Object._simpleInstanceOfTrue
     Object.==
   classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
 
 Immutable:
   superclasses:
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.outline.expect b/pkg/front_end/testcases/rasta/parser_error.dart.outline.expect
index 58835f8..0beef0a 100644
--- a/pkg/front_end/testcases/rasta/parser_error.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.outline.expect
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 
-static method test(dynamic a, {dynamic b, dynamic c}) → core::int
+static method test(dynamic a, {dynamic b, dynamic c}) → core::int*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect b/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect
index 1e7100e..d620e90 100644
--- a/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.strong.expect
@@ -20,15 +20,19 @@
 
 import "package:expect/expect.dart";
 
-static method test(dynamic a, {dynamic b = null, dynamic c = null}) → core::int {
+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
-      ^" as{TypeError} core::bool ?{dynamic} b : invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: This couldn't be parsed.
+      ^" as{TypeError} core::bool* ?{dynamic} 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
-        ^") as{TypeError} core::bool)
-    return b as{TypeError} core::int;
-  return a.+(b).+(c) as{TypeError} core::int;
+        ^") as{TypeError} core::bool*)
+    return b as{TypeError} core::int*;
+  return a.+(b).+(c) as{TypeError} 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/parser_error.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect
index 1e7100e..d620e90 100644
--- a/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/parser_error.dart.strong.transformed.expect
@@ -20,15 +20,19 @@
 
 import "package:expect/expect.dart";
 
-static method test(dynamic a, {dynamic b = null, dynamic c = null}) → core::int {
+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
-      ^" as{TypeError} core::bool ?{dynamic} b : invalid-expression "pkg/front_end/testcases/rasta/parser_error.dart:10:9: Error: This couldn't be parsed.
+      ^" as{TypeError} core::bool* ?{dynamic} 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
-        ^") as{TypeError} core::bool)
-    return b as{TypeError} core::int;
-  return a.+(b).+(c) as{TypeError} core::int;
+        ^") as{TypeError} core::bool*)
+    return b as{TypeError} core::int*;
+  return a.+(b).+(c) as{TypeError} 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.strong.transformed.expect b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
index 601cdae..15f8439 100644
--- a/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/previsit_deferred.dart.strong.transformed.expect
@@ -7,7 +7,7 @@
 
 static method main() → dynamic {}
 static method test() → dynamic {
-  let final core::Object #t1 = CheckLibraryIsLoaded(lib) in def::foo();
+  let final core::Object* #t1 = CheckLibraryIsLoaded(lib) in def::foo();
 }
 
 library deferred_lib;
diff --git a/pkg/front_end/testcases/rasta/static.dart.legacy.expect b/pkg/front_end/testcases/rasta/static.dart.legacy.expect
index b9c1b3e..4abbd71 100644
--- a/pkg/front_end/testcases/rasta/static.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.legacy.expect
@@ -142,9 +142,9 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field dynamic staticConstant = 42;
+  static const field dynamic staticConstant = #C1;
   static field dynamic staticField = 42;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
@@ -158,67 +158,79 @@
 }
 static method main() → dynamic {
   try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
+    #C1;
+    self::use(#C1);
     self::Foo::staticField;
     self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
+    #C2;
+    self::use(#C2);
     self::Foo::staticGetter;
     self::use(self::Foo::staticGetter);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t1 = #C1 in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t1);
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
-    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t5 = #C2 in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t5);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t7);
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1);
+    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(self::Foo::staticField = self::Foo::staticField.+(1));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
-    self::Foo::staticConstant.call();
-    self::use(self::Foo::staticConstant.call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1);
+    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1));
+    (#C1).call();
+    self::use((#C1).call());
     self::Foo::staticField.call();
     self::use(self::Foo::staticField.call());
     self::Foo::staticFunction();
     self::use(self::Foo::staticFunction());
     self::Foo::staticGetter.call();
     self::use(self::Foo::staticGetter.call());
-    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
-    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).call();
+    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticField = 87;
     self::use(self::Foo::staticField = 87);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticSetter = 87;
     self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
+    (#C1).==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t11 = #C1 in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t11);
     self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
     self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
-    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
-    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
-    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
+    (#C2).==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t13 = #C2 in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t13);
+    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t14);
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).==(null) ? self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff self::Foo::staticFunction
+  #C3 = #staticSetter
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #staticConstant
+  #C8 = #staticFunction
+  #C9 = #staticGetter
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect
index b9c1b3e..4abbd71 100644
--- a/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.legacy.transformed.expect
@@ -142,9 +142,9 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field dynamic staticConstant = 42;
+  static const field dynamic staticConstant = #C1;
   static field dynamic staticField = 42;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
@@ -158,67 +158,79 @@
 }
 static method main() → dynamic {
   try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
+    #C1;
+    self::use(#C1);
     self::Foo::staticField;
     self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
+    #C2;
+    self::use(#C2);
     self::Foo::staticGetter;
     self::use(self::Foo::staticGetter);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t1 = self::Foo::staticConstant in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t1);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t1 = #C1 in let final dynamic #t2 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t1);
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(let final dynamic #t3 = self::Foo::staticField in let final dynamic #t4 = self::Foo::staticField = #t3.+(1) in #t3);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t5 = self::Foo::staticFunction in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t5);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t7);
-    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticConstant.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t5 = #C2 in let final dynamic #t6 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t5);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(let final dynamic #t7 = self::Foo::staticGetter in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t7);
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1);
+    self::use(let final dynamic #t9 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in let final dynamic #t10 = self::Foo::staticSetter = #t9.+(1) in #t9);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C1).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticField = self::Foo::staticField.+(1);
     self::use(self::Foo::staticField = self::Foo::staticField.+(1));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticFunction.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1);
-    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).+(1));
-    self::Foo::staticConstant.call();
-    self::use(self::Foo::staticConstant.call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[(#C2).+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[self::Foo::staticGetter.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1);
+    self::use(self::Foo::staticSetter = (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).+(1));
+    (#C1).call();
+    self::use((#C1).call());
     self::Foo::staticField.call();
     self::use(self::Foo::staticField.call());
     self::Foo::staticFunction();
     self::use(self::Foo::staticFunction());
     self::Foo::staticGetter.call();
     self::use(self::Foo::staticGetter.call());
-    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call();
-    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).call());
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).call();
+    self::use((throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).call());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticField = 87;
     self::use(self::Foo::staticField = 87);
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))));
     self::Foo::staticSetter = 87;
     self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t11 = self::Foo::staticConstant in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticConstant, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t11);
+    (#C1).==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t11 = #C1 in #t11.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C7, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t11);
     self::Foo::staticField.==(null) ? self::Foo::staticField = 87 : null;
     self::use(let final dynamic #t12 = self::Foo::staticField in #t12.==(null) ? self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t13 = self::Foo::staticFunction in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t13);
-    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : null;
-    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticGetter, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) : #t14);
-    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})))).==(null) ? self::Foo::staticSetter = 87 : null;
-    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#staticSetter, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
+    (#C2).==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t13 = #C2 in #t13.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C8, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t13);
+    self::Foo::staticGetter.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : null;
+    self::use(let final dynamic #t14 = self::Foo::staticGetter in #t14.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C9, 34, #C4, core::List::unmodifiable<dynamic>(<dynamic>[87]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) : #t14);
+    (throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6)))).==(null) ? self::Foo::staticSetter = 87 : null;
+    self::use(let final dynamic #t15 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C3, 33, #C4, #C5, core::Map::unmodifiable<core::Symbol*, dynamic>(#C6))) in #t15.==(null) ? self::Foo::staticSetter = 87 : #t15);
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff self::Foo::staticFunction
+  #C3 = #staticSetter
+  #C4 = <core::Type*>[]
+  #C5 = <dynamic>[]
+  #C6 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C5}
+  #C7 = #staticConstant
+  #C8 = #staticFunction
+  #C9 = #staticGetter
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.outline.expect b/pkg/front_end/testcases/rasta/static.dart.outline.expect
index 2e9d362..eac130a 100644
--- a/pkg/front_end/testcases/rasta/static.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.outline.expect
@@ -5,7 +5,7 @@
 class Foo extends core::Object {
   static const field dynamic staticConstant = 42;
   static field dynamic staticField;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
   static method staticFunction() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.expect b/pkg/front_end/testcases/rasta/static.dart.strong.expect
index 34a6ee1..30a8714 100644
--- a/pkg/front_end/testcases/rasta/static.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.expect
@@ -182,9 +182,9 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field core::int staticConstant = 42;
-  static field core::int staticField = 42;
-  synthetic constructor •() → self::Foo
+  static const field core::int* staticConstant = #C1;
+  static field core::int* staticField = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
@@ -198,12 +198,12 @@
 }
 static method main() → dynamic {
   try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
+    #C1;
+    self::use(#C1);
     self::Foo::staticField;
     self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
+    #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'.
@@ -215,15 +215,15 @@
     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 = self::Foo::staticConstant in let final core::int #t2 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+    self::use(let final core::int* #t1 = #C1 in let final core::int* #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);
-    self::use(let final core::int #t3 = self::Foo::staticField in let final core::int #t4 = self::Foo::staticField = #t3.{core::num::+}(1) in #t3);
+    self::use(let final core::int* #t3 = self::Foo::staticField in let final core::int* #t4 = self::Foo::staticField = #t3.{core::num::+}(1) 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 = self::Foo::staticFunction in let final dynamic #t6 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+    self::use(let final () →* dynamic #t5 = #C2 in let final dynamic #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'.
@@ -312,18 +312,18 @@
             ^^^^^^^^^^^^");
     self::Foo::staticSetter = 87;
     self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+    (#C1).{core::Object::==}(null) ?{core::int*} 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 = self::Foo::staticConstant in #t11.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+    self::use(let final core::int* #t11 = #C1 in #t11.{core::Object::==}(null) ?{core::int*} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
     use(Foo.staticConstant ??= 87);
             ^^^^^^^^^^^^^^" : #t11);
-    self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : null;
-    self::use(let final core::int #t12 = self::Foo::staticField in #t12.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+    self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 87 : null;
+    self::use(let final core::int* #t12 = self::Foo::staticField in #t12.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 87 : #t12);
+    (#C2).{core::Object::==}(null) ?{core::Object*} 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 = self::Foo::staticFunction in #t13.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+    self::use(let final () →* dynamic #t13 = #C2 in #t13.{core::Object::==}(null) ?{core::Object*} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
     use(Foo.staticFunction ??= 87);
             ^^^^^^^^^^^^^^" : #t13);
     self::Foo::staticGetter.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
@@ -339,6 +339,11 @@
     use(Foo.staticSetter ??= 87);
             ^^^^^^^^^^^^" in #t15.{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : #t15);
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff self::Foo::staticFunction
+}
diff --git a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
index 34a6ee1..30a8714 100644
--- a/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/static.dart.strong.transformed.expect
@@ -182,9 +182,9 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  static const field core::int staticConstant = 42;
-  static field core::int staticField = 42;
-  synthetic constructor •() → self::Foo
+  static const field core::int* staticConstant = #C1;
+  static field core::int* staticField = 42;
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
   static method staticFunction() → dynamic {}
@@ -198,12 +198,12 @@
 }
 static method main() → dynamic {
   try {
-    self::Foo::staticConstant;
-    self::use(self::Foo::staticConstant);
+    #C1;
+    self::use(#C1);
     self::Foo::staticField;
     self::use(self::Foo::staticField);
-    self::Foo::staticFunction;
-    self::use(self::Foo::staticFunction);
+    #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'.
@@ -215,15 +215,15 @@
     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 = self::Foo::staticConstant in let final core::int #t2 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:32:13: Error: Setter not found: 'staticConstant'.
+    self::use(let final core::int* #t1 = #C1 in let final core::int* #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);
-    self::use(let final core::int #t3 = self::Foo::staticField in let final core::int #t4 = self::Foo::staticField = #t3.{core::num::+}(1) in #t3);
+    self::use(let final core::int* #t3 = self::Foo::staticField in let final core::int* #t4 = self::Foo::staticField = #t3.{core::num::+}(1) 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 = self::Foo::staticFunction in let final dynamic #t6 = invalid-expression "pkg/front_end/testcases/rasta/static.dart:36:13: Error: Setter not found: 'staticFunction'.
+    self::use(let final () →* dynamic #t5 = #C2 in let final dynamic #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'.
@@ -312,18 +312,18 @@
             ^^^^^^^^^^^^");
     self::Foo::staticSetter = 87;
     self::use(self::Foo::staticSetter = 87);
-    self::Foo::staticConstant.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:75:9: Error: Setter not found: 'staticConstant'.
+    (#C1).{core::Object::==}(null) ?{core::int*} 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 = self::Foo::staticConstant in #t11.{core::Object::==}(null) ?{core::int} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
+    self::use(let final core::int* #t11 = #C1 in #t11.{core::Object::==}(null) ?{core::int*} invalid-expression "pkg/front_end/testcases/rasta/static.dart:76:13: Error: Setter not found: 'staticConstant'.
     use(Foo.staticConstant ??= 87);
             ^^^^^^^^^^^^^^" : #t11);
-    self::Foo::staticField.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : null;
-    self::use(let final core::int #t12 = self::Foo::staticField in #t12.{core::num::==}(null) ?{core::int} self::Foo::staticField = 87 : #t12);
-    self::Foo::staticFunction.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:79:9: Error: Setter not found: 'staticFunction'.
+    self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 87 : null;
+    self::use(let final core::int* #t12 = self::Foo::staticField in #t12.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 87 : #t12);
+    (#C2).{core::Object::==}(null) ?{core::Object*} 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 = self::Foo::staticFunction in #t13.{core::Object::==}(null) ?{core::Object} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
+    self::use(let final () →* dynamic #t13 = #C2 in #t13.{core::Object::==}(null) ?{core::Object*} invalid-expression "pkg/front_end/testcases/rasta/static.dart:80:13: Error: Setter not found: 'staticFunction'.
     use(Foo.staticFunction ??= 87);
             ^^^^^^^^^^^^^^" : #t13);
     self::Foo::staticGetter.{core::Object::==}(null) ?{dynamic} invalid-expression "pkg/front_end/testcases/rasta/static.dart:81:9: Error: Setter not found: 'staticGetter'.
@@ -339,6 +339,11 @@
     use(Foo.staticSetter ??= 87);
             ^^^^^^^^^^^^" in #t15.{core::Object::==}(null) ?{dynamic} self::Foo::staticSetter = 87 : #t15);
   }
-  on core::NoSuchMethodError catch(no-exception-var) {
+  on core::NoSuchMethodError* catch(no-exception-var) {
   }
 }
+
+constants  {
+  #C1 = 42
+  #C2 = tearoff self::Foo::staticFunction
+}
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
index dbd7908..81bbdff 100644
--- a/pkg/front_end/testcases/rasta/super.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.expect
@@ -248,7 +248,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -266,7 +266,7 @@
     return 117;
   operator unary-() → dynamic
     return 117;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return true;
   method m() → void {}
   method n() → void {}
@@ -274,7 +274,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   get b() → dynamic
@@ -283,7 +283,7 @@
   set i(dynamic x) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
index dbd7908..81bbdff 100644
--- a/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.legacy.transformed.expect
@@ -248,7 +248,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -266,7 +266,7 @@
     return 117;
   operator unary-() → dynamic
     return 117;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return true;
   method m() → void {}
   method n() → void {}
@@ -274,7 +274,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   get b() → dynamic
@@ -283,7 +283,7 @@
   set i(dynamic x) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method test() → dynamic {
diff --git a/pkg/front_end/testcases/rasta/super.dart.outline.expect b/pkg/front_end/testcases/rasta/super.dart.outline.expect
index 9b0da41..8a38586 100644
--- a/pkg/front_end/testcases/rasta/super.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.outline.expect
@@ -18,7 +18,7 @@
   field dynamic c;
   field dynamic d;
   final field dynamic f;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   get e() → dynamic
     ;
@@ -38,7 +38,7 @@
     ;
   operator unary-() → dynamic
     ;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     ;
   method m() → void
     ;
@@ -49,7 +49,7 @@
 }
 class B extends self::A {
   final field dynamic d;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
   get b() → dynamic
     ;
@@ -59,7 +59,7 @@
     ;
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method test() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/super.dart.strong.expect b/pkg/front_end/testcases/rasta/super.dart.strong.expect
index 72a069a..7ac227e 100644
--- a/pkg/front_end/testcases/rasta/super.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super.dart.strong.expect
@@ -360,7 +360,7 @@
   field dynamic c = null;
   field dynamic d = null;
   final field dynamic f = null;
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get e() → dynamic
@@ -378,7 +378,7 @@
     return 117;
   operator unary-() → dynamic
     return 117;
-  operator ==(dynamic other) → core::bool
+  operator ==(dynamic other) → core::bool*
     return true;
   method m() → void {}
   method n() → void {}
@@ -386,7 +386,7 @@
 }
 class B extends self::A {
   final field dynamic d = null;
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
   get b() → dynamic
@@ -395,7 +395,7 @@
   set i(dynamic x) → void {}
 }
 class C extends self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
   method test() → dynamic {
@@ -461,13 +461,13 @@
     self::use(let final dynamic #t15 = super.{self::A::h} in let final dynamic #t16 = super.{self::A::h} = #t15.+(1) in #t15);
     super.{self::B::i} = super.{self::A::i}.+(1);
     self::use(let final dynamic #t17 = super.{self::A::i} in let final dynamic #t18 = super.{self::B::i} = #t17.+(1) in #t17);
-    let final core::int #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(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.+(1)) in #t21);
+    let final core::int* #t19 = 87 in super.{self::A::[]=}(#t19, super.{self::A::[]}(#t19).+(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.+(1)) in #t21);
     super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:95:12: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.m++;
            ^";
-    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 method '+' isn't defined for the class 'void Function()'.
+    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 method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.m++);
                ^" in #t23);
@@ -475,7 +475,7 @@
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.n++;
            ^";
-    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 method '+' isn't defined for the class 'void Function()'.
+    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 method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     use(super.n++);
                ^" in #t25);
@@ -497,8 +497,8 @@
     self::use(super.{self::A::h} = super.{self::A::h}.+(1));
     super.{self::B::i} = super.{self::A::i}.+(1);
     self::use(super.{self::B::i} = super.{self::A::i}.+(1));
-    let final core::int #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(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).+(1) in let final void #t32 = super.{self::A::[]=}(#t30, #t31) in #t31);
+    let final core::int* #t27 = 87 in let final dynamic #t28 = super.{self::A::[]}(#t27).+(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).+(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 method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     ++super.m;
@@ -566,7 +566,7 @@
     super.{self::B::i} = 42;
     self::use(super.{self::B::i} = 42);
     super.{self::A::[]=}(87, 42);
-    self::use(let final core::int #t36 = 87 in let final core::int #t37 = 42 in let final void #t38 = super.{self::A::[]=}(#t36, #t37) in #t37);
+    self::use(let final core::int* #t36 = 87 in let final core::int* #t37 = 42 in let final void #t38 = super.{self::A::[]=}(#t36, #t37) in #t37);
     super.m = 42;
     self::use(super.m = 42);
     super.{self::A::n} = 42;
@@ -589,12 +589,12 @@
     self::use(let final dynamic #t46 = super.{self::A::h} in #t46.{core::Object::==}(null) ?{dynamic} super.{self::A::h} = 42 : #t46);
     super.{self::A::i}.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : null;
     self::use(let final dynamic #t47 = super.{self::A::i} in #t47.{core::Object::==}(null) ?{dynamic} super.{self::B::i} = 42 : #t47);
-    let final core::int #t48 = 87 in super.{self::A::[]}(#t48).{core::Object::==}(null) ?{dynamic} let final core::int #t49 = 42 in let final void #t50 = super.{self::A::[]=}(#t48, #t49) in #t49 : null;
-    self::use(let final core::int #t51 = 87 in let final dynamic #t52 = super.{self::A::[]}(#t51) in #t52.{core::Object::==}(null) ?{dynamic} let final core::int #t53 = 42 in let final void #t54 = super.{self::A::[]=}(#t51, #t53) in #t53 : #t52);
-    super.{self::A::m}.{core::Object::==}(null) ?{core::Object} super.m = 42 : null;
-    self::use(let final () → void #t55 = super.{self::A::m} in #t55.{core::Object::==}(null) ?{core::Object} super.m = 42 : #t55);
-    super.{self::A::n}.{core::Object::==}(null) ?{core::Object} super.{self::A::n} = 42 : null;
-    self::use(let final () → void #t56 = super.{self::A::n} in #t56.{core::Object::==}(null) ?{core::Object} super.{self::A::n} = 42 : #t56);
+    let final core::int* #t48 = 87 in super.{self::A::[]}(#t48).{core::Object::==}(null) ?{dynamic} let final core::int* #t49 = 42 in let final void #t50 = super.{self::A::[]=}(#t48, #t49) in #t49 : null;
+    self::use(let final core::int* #t51 = 87 in let final dynamic #t52 = super.{self::A::[]}(#t51) in #t52.{core::Object::==}(null) ?{dynamic} let final core::int* #t53 = 42 in let final void #t54 = super.{self::A::[]=}(#t51, #t53) in #t53 : #t52);
+    super.{self::A::m}.{core::Object::==}(null) ?{core::Object*} super.m = 42 : null;
+    self::use(let final () →* void #t55 = super.{self::A::m} in #t55.{core::Object::==}(null) ?{core::Object*} super.m = 42 : #t55);
+    super.{self::A::n}.{core::Object::==}(null) ?{core::Object*} super.{self::A::n} = 42 : null;
+    self::use(let final () →* void #t56 = super.{self::A::n} in #t56.{core::Object::==}(null) ?{core::Object*} super.{self::A::n} = 42 : #t56);
     super.{self::A::a} = super.{self::A::a}.+(42);
     self::use(super.{self::A::a} = super.{self::A::a}.+(42));
     super.{self::A::b} = super.{self::B::b}.+(42);
@@ -613,8 +613,8 @@
     self::use(super.{self::A::h} = super.{self::A::h}.+(42));
     super.{self::B::i} = super.{self::A::i}.+(42);
     self::use(super.{self::B::i} = super.{self::A::i}.+(42));
-    let final core::int #t57 = 87 in super.{self::A::[]=}(#t57, super.{self::A::[]}(#t57).+(42));
-    self::use(let final core::int #t58 = 87 in let final dynamic #t59 = super.{self::A::[]}(#t58).+(42) in let final void #t60 = super.{self::A::[]=}(#t58, #t59) in #t59);
+    let final core::int* #t57 = 87 in super.{self::A::[]=}(#t57, super.{self::A::[]}(#t57).+(42));
+    self::use(let final core::int* #t58 = 87 in let final dynamic #t59 = super.{self::A::[]}(#t58).+(42) in let final void #t60 = super.{self::A::[]=}(#t58, #t59) in #t59);
     super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:222:13: Error: The method '+' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '+'.
     super.m += 42;
@@ -649,8 +649,8 @@
     self::use(super.{self::A::h} = super.{self::A::h}.-(42));
     super.{self::B::i} = super.{self::A::i}.-(42);
     self::use(super.{self::B::i} = super.{self::A::i}.-(42));
-    let final core::int #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
-    self::use(let final core::int #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
+    let final core::int* #t61 = 87 in super.{self::A::[]=}(#t61, super.{self::A::[]}(#t61).-(42));
+    self::use(let final core::int* #t62 = 87 in let final dynamic #t63 = super.{self::A::[]}(#t62).-(42) in let final void #t64 = super.{self::A::[]=}(#t62, #t63) in #t63);
     super.m = invalid-expression "pkg/front_end/testcases/rasta/super.dart:247:13: Error: The method '-' isn't defined for the class 'void Function()'.
 Try correcting the name to the name of an existing method, or defining a method named '-'.
     super.m -= 42;
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.outline.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.outline.expect
index 7e735ba..01ea8c6 100644
--- a/pkg/front_end/testcases/rasta/super_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class Super extends core::Object {
-  constructor arg0() → self::Super
+  constructor arg0() → self::Super*
     ;
-  constructor arg1(dynamic a) → self::Super
+  constructor arg1(dynamic a) → self::Super*
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Super
+  constructor arg2(dynamic a, dynamic b) → self::Super*
     ;
 }
 class Sub extends self::Super {
   field dynamic field;
-  constructor arg0() → self::Sub
+  constructor arg0() → self::Sub*
     ;
-  constructor arg1(dynamic a) → self::Sub
+  constructor arg1(dynamic a) → self::Sub*
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Sub
+  constructor arg2(dynamic a, dynamic b) → self::Sub*
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect
index c1c4755..c03b1a6 100644
--- a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.expect
@@ -18,29 +18,29 @@
 import "dart:core" as core;
 
 class Super extends core::Object {
-  constructor arg0() → self::Super
+  constructor arg0() → self::Super*
     : super core::Object::•()
     ;
-  constructor arg1(dynamic a) → self::Super
+  constructor arg1(dynamic a) → self::Super*
     : super core::Object::•()
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Super
+  constructor arg2(dynamic a, dynamic b) → self::Super*
     : super core::Object::•()
     ;
 }
 class Sub extends self::Super {
   field dynamic field = null;
-  constructor arg0() → self::Sub
+  constructor arg0() → self::Sub*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:14:15: Error: Can't have initializers after 'super'.
       : super.arg0(),
               ^", super self::Super::arg0()
     ;
-  constructor arg1(dynamic a) → self::Sub
+  constructor arg1(dynamic a) → self::Sub*
     : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:17:15: Error: Can't have initializers after 'super'.
       : super.arg1(a),
               ^", super self::Super::arg1(a)
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Sub
+  constructor arg2(dynamic a, dynamic b) → self::Sub*
     : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:20:15: Error: Can't have initializers after 'super'.
       : super.arg2(a, b),
               ^", super self::Super::arg2(a, b)
diff --git a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect
index c1c4755..c03b1a6 100644
--- a/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super_initializer.dart.strong.transformed.expect
@@ -18,29 +18,29 @@
 import "dart:core" as core;
 
 class Super extends core::Object {
-  constructor arg0() → self::Super
+  constructor arg0() → self::Super*
     : super core::Object::•()
     ;
-  constructor arg1(dynamic a) → self::Super
+  constructor arg1(dynamic a) → self::Super*
     : super core::Object::•()
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Super
+  constructor arg2(dynamic a, dynamic b) → self::Super*
     : super core::Object::•()
     ;
 }
 class Sub extends self::Super {
   field dynamic field = null;
-  constructor arg0() → self::Sub
+  constructor arg0() → self::Sub*
     : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:14:15: Error: Can't have initializers after 'super'.
       : super.arg0(),
               ^", super self::Super::arg0()
     ;
-  constructor arg1(dynamic a) → self::Sub
+  constructor arg1(dynamic a) → self::Sub*
     : final dynamic #t2 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:17:15: Error: Can't have initializers after 'super'.
       : super.arg1(a),
               ^", super self::Super::arg1(a)
     ;
-  constructor arg2(dynamic a, dynamic b) → self::Sub
+  constructor arg2(dynamic a, dynamic b) → self::Sub*
     : final dynamic #t3 = invalid-expression "pkg/front_end/testcases/rasta/super_initializer.dart:20:15: Error: Can't have initializers after 'super'.
       : super.arg2(a, b),
               ^", super self::Super::arg2(a, b)
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
index bbd2127..d7c85a7 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
+class Super<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -14,33 +14,33 @@
   method f() → dynamic
     return 3;
 }
-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> {
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+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*> {
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V*>*
     : super self::Super::•()
     ;
 }
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
+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> {
-  synthetic constructor •() → self::_D&Super&Mixin
+  synthetic constructor •() → self::_D&Super&Mixin*
     : super self::Super::•()
     ;
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
+  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>
+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::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::D2
+  synthetic constructor •() → self::D2*
     : super self::Super::•()
     ;
 }
@@ -60,17 +60,17 @@
 import self as mix;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x = mix::f();
   field dynamic y = null;
   field dynamic z = null;
-  generic-covariant-impl field mix::Mixin::T t = null;
-  synthetic constructor •() → mix::Mixin<mix::Mixin::T>
+  generic-covariant-impl field mix::Mixin::T* t = null;
+  synthetic constructor •() → mix::Mixin<mix::Mixin::T*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(mix::f());
-  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T* a) → mix::Mixin::T*
     return null;
   method h() → dynamic
     return mix::V();
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
index 90e3685..3c08588 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.legacy.transformed.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
+class Super<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -14,17 +14,17 @@
   method f() → dynamic
     return 3;
 }
-abstract class _C&Super&Mixin<V extends core::Object = dynamic> extends self::Super<self::_C&Super&Mixin::V> implements mix::Mixin<self::_C&Super&Mixin::V> {
+abstract class _C&Super&Mixin<V extends core::Object* = dynamic> extends self::Super<self::_C&Super&Mixin::V*> implements mix::Mixin<self::_C&Super&Mixin::V*> {
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  generic-covariant-impl field self::_C&Super&Mixin::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+  generic-covariant-impl field self::_C&Super&Mixin::V* t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V*>*
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::_C&Super&Mixin::V a) → self::_C&Super&Mixin::V
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::_C&Super&Mixin::V* a) → self::_C&Super&Mixin::V*
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -35,8 +35,8 @@
   method /* from org-dartlang-testcase:///mixin_library.dart */ publicMethod() → dynamic
     return this.{mix::Mixin::_privateMethod}();
 }
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
+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::•()
     ;
 }
@@ -45,7 +45,7 @@
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
   generic-covariant-impl field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::_D&Super&Mixin
+  synthetic constructor •() → self::_D&Super&Mixin*
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
@@ -62,21 +62,21 @@
     return this.{mix::Mixin::_privateMethod}();
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::_D&Super&Mixin::•()
     ;
 }
-class C2<V extends core::Object = dynamic> extends self::Super<self::C2::V> implements mix::Mixin<self::C2::V> {
+class C2<V extends core::Object* = dynamic> extends self::Super<self::C2::V*> implements mix::Mixin<self::C2::V*> {
   field dynamic x = mix::f()/* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  generic-covariant-impl field self::C2::V t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::C2<self::C2::V>
+  generic-covariant-impl field self::C2::V* t = null /* from org-dartlang-testcase:///mixin_library.dart */;
+  synthetic constructor •() → self::C2<self::C2::V*>*
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
     return super.foo().+(mix::f());
-  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::C2::V a) → self::C2::V
+  method /* from org-dartlang-testcase:///mixin_library.dart */ g(generic-covariant-impl self::C2::V* a) → self::C2::V*
     return null;
   method /* from org-dartlang-testcase:///mixin_library.dart */ h() → dynamic
     return mix::V();
@@ -92,7 +92,7 @@
   field dynamic y = null /* from org-dartlang-testcase:///mixin_library.dart */;
   field dynamic z = null /* from org-dartlang-testcase:///mixin_library.dart */;
   generic-covariant-impl field dynamic t = null /* from org-dartlang-testcase:///mixin_library.dart */;
-  synthetic constructor •() → self::D2
+  synthetic constructor •() → self::D2*
     : super self::Super::•()
     ;
   method /* from org-dartlang-testcase:///mixin_library.dart */ foo() → dynamic
@@ -124,17 +124,17 @@
 import self as mix;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x = mix::f();
   field dynamic y = null;
   field dynamic z = null;
-  generic-covariant-impl field mix::Mixin::T t = null;
-  synthetic constructor •() → mix::Mixin<mix::Mixin::T>
+  generic-covariant-impl field mix::Mixin::T* t = null;
+  synthetic constructor •() → mix::Mixin<mix::Mixin::T*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(mix::f());
-  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T* a) → mix::Mixin::T*
     return null;
   method h() → dynamic
     return mix::V();
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
index f8efb4c..4d67319 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.outline.expect
@@ -5,39 +5,39 @@
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
+class Super<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S*>*
     ;
   method foo() → dynamic
     ;
   method f() → dynamic
     ;
 }
-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> {
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+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*> {
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V*>*
     : super self::Super::•()
     ;
 }
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
+class C<V extends core::Object* = dynamic> extends self::_C&Super&Mixin<self::C::V*> {
+  synthetic constructor •() → self::C<self::C::V*>*
     ;
 }
 abstract class _D&Super&Mixin = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::_D&Super&Mixin
+  synthetic constructor •() → self::_D&Super&Mixin*
     : super self::Super::•()
     ;
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
 }
-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>
+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::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::D2
+  synthetic constructor •() → self::D2*
     : super self::Super::•()
     ;
 }
@@ -48,16 +48,16 @@
 import self as mix;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x;
   field dynamic y;
   field dynamic z;
-  generic-covariant-impl field mix::Mixin::T t;
-  synthetic constructor •() → mix::Mixin<mix::Mixin::T>
+  generic-covariant-impl field mix::Mixin::T* t;
+  synthetic constructor •() → mix::Mixin<mix::Mixin::T*>*
     ;
   method foo() → dynamic
     ;
-  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T* a) → mix::Mixin::T*
     ;
   method h() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
index aba8974..70eed77 100644
--- a/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_mixin.dart.strong.expect
@@ -5,8 +5,8 @@
 
 import "org-dartlang-testcase:///mixin_library.dart";
 
-class Super<S extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Super<self::Super::S>
+class Super<S extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::Super<self::Super::S*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
@@ -14,33 +14,33 @@
   method f() → dynamic
     return 3;
 }
-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> {
-  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V>
+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*> {
+  synthetic constructor •() → self::_C&Super&Mixin<self::_C&Super&Mixin::V*>*
     : super self::Super::•()
     ;
 }
-class C<V extends core::Object = dynamic> extends self::_C&Super&Mixin<self::C::V> {
-  synthetic constructor •() → self::C<self::C::V>
+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> {
-  synthetic constructor •() → self::_D&Super&Mixin
+  synthetic constructor •() → self::_D&Super&Mixin*
     : super self::Super::•()
     ;
 }
 class D extends self::_D&Super&Mixin {
-  synthetic constructor •() → self::D
+  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>
+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::•()
     ;
 }
 class D2 = self::Super<dynamic> with mix::Mixin<dynamic> {
-  synthetic constructor •() → self::D2
+  synthetic constructor •() → self::D2*
     : super self::Super::•()
     ;
 }
@@ -60,17 +60,17 @@
 import self as mix;
 import "dart:core" as core;
 
-class Mixin<T extends core::Object = dynamic> extends core::Object {
+class Mixin<T extends core::Object* = dynamic> extends core::Object {
   field dynamic x = mix::f();
   field dynamic y = null;
   field dynamic z = null;
-  generic-covariant-impl field mix::Mixin::T t = null;
-  synthetic constructor •() → mix::Mixin<mix::Mixin::T>
+  generic-covariant-impl field mix::Mixin::T* t = null;
+  synthetic constructor •() → mix::Mixin<mix::Mixin::T*>*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return super.foo().+(mix::f());
-  method g(generic-covariant-impl mix::Mixin::T a) → mix::Mixin::T
+  method g(generic-covariant-impl mix::Mixin::T* a) → mix::Mixin::T*
     return null;
   method h() → dynamic
     return mix::V();
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect b/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect
index 01e59ad..9b45223 100644
--- a/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.outline.expect
@@ -3,9 +3,9 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  operator +(core::String s) → dynamic
+  operator +(core::String* s) → dynamic
     ;
   operator [](dynamic i) → dynamic
     ;
@@ -13,9 +13,9 @@
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  operator +(core::String s) → dynamic
+  operator +(core::String* s) → dynamic
     ;
   operator [](dynamic i) → dynamic
     ;
@@ -23,7 +23,7 @@
     ;
 }
 class Autobianchi extends core::Object {
-  synthetic constructor •() → self::Autobianchi
+  synthetic constructor •() → self::Autobianchi*
     ;
   method g() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect b/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect
index c49d683..4b99eb9 100644
--- a/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/super_operator.dart.strong.expect
@@ -10,20 +10,20 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  operator +(core::String s) → dynamic
+  operator +(core::String* s) → dynamic
     return null;
   operator [](dynamic i) → dynamic
     return null;
   operator []=(dynamic i, dynamic val) → void {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-  operator +(core::String s) → dynamic
+  operator +(core::String* s) → dynamic
     return super.{self::A::+}("${s}${s}");
   operator [](dynamic i) → dynamic
     return super.{self::A::[]}(i);
@@ -31,7 +31,7 @@
     return let final dynamic #t1 = let final dynamic #t2 = i in let final dynamic #t3 = i = #t2.+(1) in #t2 in let final dynamic #t4 = super.{self::A::[]}(#t1).+(val) in let final void #t5 = super.{self::A::[]=}(#t1, #t4) in #t4;
 }
 class Autobianchi extends core::Object {
-  synthetic constructor •() → self::Autobianchi
+  synthetic constructor •() → self::Autobianchi*
     : super core::Object::•()
     ;
   method g() → dynamic
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect
index b7bfa56..d2d46a3 100644
--- a/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.expect
@@ -3,5 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(const core::bool::fromEnvironment("dart.library.mirrors"));
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
 }
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect
index b7bfa56..d2d46a3 100644
--- a/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.legacy.transformed.expect
@@ -3,5 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(const core::bool::fromEnvironment("dart.library.mirrors"));
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
 }
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect
index b7bfa56..d2d46a3 100644
--- a/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.expect
@@ -3,5 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(const core::bool::fromEnvironment("dart.library.mirrors"));
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
 }
diff --git a/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.transformed.expect
index b7bfa56..d2d46a3 100644
--- a/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/supports_reflection.dart.strong.transformed.expect
@@ -3,5 +3,9 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(const core::bool::fromEnvironment("dart.library.mirrors"));
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = false
 }
diff --git a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect
index 3dec981..27733bb 100644
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.expect
@@ -22,19 +22,19 @@
   #L1:
   switch(value) {
     #L2:
-    case 1:
+    case #C1:
       {
         result = 1;
         break #L1;
       }
     #L3:
-    case 2:
+    case #C2:
       {
         result = 2;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         result = 3;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
@@ -52,25 +52,34 @@
   #L6:
   switch(value) {
     #L7:
-    case 1:
-    case 2:
+    case #C1:
+    case #C2:
       {
         result = 1;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
       }
     #L8:
-    case 3:
-    case 4:
+    case #C3:
+    case #C4:
       {
         result = 2;
         break #L6;
       }
     #L9:
-    case 5:
-    case 6:
+    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_execution_case_t02.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.transformed.expect
index 3dec981..27733bb 100644
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.legacy.transformed.expect
@@ -22,19 +22,19 @@
   #L1:
   switch(value) {
     #L2:
-    case 1:
+    case #C1:
       {
         result = 1;
         break #L1;
       }
     #L3:
-    case 2:
+    case #C2:
       {
         result = 2;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         result = 3;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
@@ -52,25 +52,34 @@
   #L6:
   switch(value) {
     #L7:
-    case 1:
-    case 2:
+    case #C1:
+    case #C2:
       {
         result = 1;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
       }
     #L8:
-    case 3:
-    case 4:
+    case #C3:
+    case #C4:
       {
         result = 2;
         break #L6;
       }
     #L9:
-    case 5:
-    case 6:
+    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_execution_case_t02.dart.strong.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect
index 4ad744c..4a25d3e 100644
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.expect
@@ -22,19 +22,19 @@
   #L1:
   switch(value) {
     #L2:
-    case 1:
+    case #C1:
       {
         result = 1;
         break #L1;
       }
     #L3:
-    case 2:
+    case #C2:
       {
         result = 2;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         result = 3;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
@@ -52,25 +52,34 @@
   #L6:
   switch(value) {
     #L7:
-    case 1:
-    case 2:
+    case #C1:
+    case #C2:
       {
         result = 1;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
       }
     #L8:
-    case 3:
-    case 4:
+    case #C3:
+    case #C4:
       {
         result = 2;
         break #L6;
       }
     #L9:
-    case 5:
-    case 6:
+    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_execution_case_t02.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect
index 4ad744c..4a25d3e 100644
--- a/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/switch_execution_case_t02.dart.strong.transformed.expect
@@ -22,19 +22,19 @@
   #L1:
   switch(value) {
     #L2:
-    case 1:
+    case #C1:
       {
         result = 1;
         break #L1;
       }
     #L3:
-    case 2:
+    case #C2:
       {
         result = 2;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 35);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         result = 3;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 36);
@@ -52,25 +52,34 @@
   #L6:
   switch(value) {
     #L7:
-    case 1:
-    case 2:
+    case #C1:
+    case #C2:
       {
         result = 1;
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_execution_case_t02.dart", 46);
       }
     #L8:
-    case 3:
-    case 4:
+    case #C3:
+    case #C4:
       {
         result = 2;
         break #L6;
       }
     #L9:
-    case 5:
-    case 6:
+    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.legacy.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.expect
index 917a871..0c7824e 100644
--- a/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.expect
@@ -29,7 +29,7 @@
   #L1:
   switch(1) {
     #L2:
-    case 1:
+    case #C1:
       {
         {
           "No fall-through error needed.";
@@ -39,7 +39,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
       }
     #L3:
-    case 2:
+    case #C2:
       {
         {
           "Fall-through error needed.";
@@ -50,7 +50,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         try {
           "No fall-through error needed.";
@@ -61,7 +61,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
       }
     #L5:
-    case 4:
+    case #C4:
       {
         try {
           "No fall-through error needed.";
@@ -72,7 +72,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
       }
     #L6:
-    case 5:
+    case #C5:
       {
         try {
           "Fall-through error needed.";
@@ -82,9 +82,18 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
       }
     #L7:
-    case 10000:
+    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/switch_fall_through.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.transformed.expect
index 917a871..0c7824e 100644
--- a/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.legacy.transformed.expect
@@ -29,7 +29,7 @@
   #L1:
   switch(1) {
     #L2:
-    case 1:
+    case #C1:
       {
         {
           "No fall-through error needed.";
@@ -39,7 +39,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
       }
     #L3:
-    case 2:
+    case #C2:
       {
         {
           "Fall-through error needed.";
@@ -50,7 +50,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         try {
           "No fall-through error needed.";
@@ -61,7 +61,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
       }
     #L5:
-    case 4:
+    case #C4:
       {
         try {
           "No fall-through error needed.";
@@ -72,7 +72,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
       }
     #L6:
-    case 5:
+    case #C5:
       {
         try {
           "Fall-through error needed.";
@@ -82,9 +82,18 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
       }
     #L7:
-    case 10000:
+    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/switch_fall_through.dart.strong.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect
index 4370b01..c69920c 100644
--- a/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.expect
@@ -29,7 +29,7 @@
   #L1:
   switch(1) {
     #L2:
-    case 1:
+    case #C1:
       {
         {
           "No fall-through error needed.";
@@ -39,7 +39,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
       }
     #L3:
-    case 2:
+    case #C2:
       {
         {
           "Fall-through error needed.";
@@ -50,7 +50,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         try {
           "No fall-through error needed.";
@@ -61,7 +61,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
       }
     #L5:
-    case 4:
+    case #C4:
       {
         try {
           "No fall-through error needed.";
@@ -72,7 +72,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
       }
     #L6:
-    case 5:
+    case #C5:
       {
         try {
           "Fall-through error needed.";
@@ -82,9 +82,18 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
       }
     #L7:
-    case 10000:
+    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/switch_fall_through.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect
index 4370b01..c69920c 100644
--- a/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/switch_fall_through.dart.strong.transformed.expect
@@ -29,7 +29,7 @@
   #L1:
   switch(1) {
     #L2:
-    case 1:
+    case #C1:
       {
         {
           "No fall-through error needed.";
@@ -39,7 +39,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 7);
       }
     #L3:
-    case 2:
+    case #C2:
       {
         {
           "Fall-through error needed.";
@@ -50,7 +50,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 13);
       }
     #L4:
-    case 3:
+    case #C3:
       {
         try {
           "No fall-through error needed.";
@@ -61,7 +61,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 20);
       }
     #L5:
-    case 4:
+    case #C4:
       {
         try {
           "No fall-through error needed.";
@@ -72,7 +72,7 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 26);
       }
     #L6:
-    case 5:
+    case #C5:
       {
         try {
           "Fall-through error needed.";
@@ -82,9 +82,18 @@
         throw new core::FallThroughError::_create("org-dartlang-testcase:///switch_fall_through.dart", 31);
       }
     #L7:
-    case 10000:
+    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.legacy.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.expect
index 7341259..c619705 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect
index 7341259..c619705 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.legacy.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.outline.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.outline.expect
index eb198e5..9fadbbf 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method m(dynamic x) → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect
index e025609..d9b8ae60 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect
index e025609..d9b8ae60 100644
--- a/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/this_invoke.dart.strong.transformed.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method m(dynamic x) → dynamic
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect b/pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect
index 7f2a332..e6948d5 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.legacy.expect
@@ -1,93 +1,376 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:22:5: Warning: Method not found: 'dynamic'.
+//     dynamic();
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:23:9: Warning: Method not found: 'dynamic'.
+//     use(dynamic());
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:24:5: Warning: Method not found: 'T'.
+//     T();
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:25:9: Warning: Method not found: 'T'.
+//     use(T());
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:26:5: Warning: Method not found: 'Func'.
+//     Func();
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:27:9: Warning: Method not found: 'Func'.
+//     use(Func());
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:29:5: Warning: Setter not found: 'C'.
+//     C = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:30:9: Warning: Setter not found: 'C'.
+//     use(C = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:31:5: Warning: Setter not found: 'dynamic'.
+//     dynamic = 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:32:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic = 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:33:5: Warning: Setter not found: 'T'.
+//     T = 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:34:9: Warning: Setter not found: 'T'.
+//     use(T = 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:35:5: Warning: Setter not found: 'Func'.
+//     Func = 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:36:9: Warning: Setter not found: 'Func'.
+//     use(Func = 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:38:5: Warning: Setter not found: 'C'.
+//     C++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:39:9: Warning: Setter not found: 'C'.
+//     use(C++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:40:5: Warning: Setter not found: 'dynamic'.
+//     dynamic++;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:41:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic++);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:42:5: Warning: Setter not found: 'T'.
+//     T++;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:43:9: Warning: Setter not found: 'T'.
+//     use(T++);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:44:5: Warning: Setter not found: 'Func'.
+//     Func++;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:45:9: Warning: Setter not found: 'Func'.
+//     use(Func++);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:47:7: Warning: Setter not found: 'C'.
+//     ++C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:48:11: Warning: Setter not found: 'C'.
+//     use(++C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:49:7: Warning: Setter not found: 'dynamic'.
+//     ++dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:50:11: Warning: Setter not found: 'dynamic'.
+//     use(++dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:51:7: Warning: Setter not found: 'T'.
+//     ++T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:52:11: Warning: Setter not found: 'T'.
+//     use(++T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:53:7: Warning: Setter not found: 'Func'.
+//     ++Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:54:11: Warning: Setter not found: 'Func'.
+//     use(++Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:56:5: Warning: Setter not found: 'C'.
+//     C--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:57:9: Warning: Setter not found: 'C'.
+//     use(C--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:58:5: Warning: Setter not found: 'dynamic'.
+//     dynamic--;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:59:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic--);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:60:5: Warning: Setter not found: 'T'.
+//     T--;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:61:9: Warning: Setter not found: 'T'.
+//     use(T--);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:62:5: Warning: Setter not found: 'Func'.
+//     Func--;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:63:9: Warning: Setter not found: 'Func'.
+//     use(Func--);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:65:7: Warning: Setter not found: 'C'.
+//     --C;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:66:11: Warning: Setter not found: 'C'.
+//     use(--C);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:67:7: Warning: Setter not found: 'dynamic'.
+//     --dynamic;
+//       ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:68:11: Warning: Setter not found: 'dynamic'.
+//     use(--dynamic);
+//           ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:69:7: Warning: Setter not found: 'T'.
+//     --T;
+//       ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:70:11: Warning: Setter not found: 'T'.
+//     use(--T);
+//           ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:71:7: Warning: Setter not found: 'Func'.
+//     --Func;
+//       ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:72:11: Warning: Setter not found: 'Func'.
+//     use(--Func);
+//           ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:74:5: Warning: Setter not found: 'C'.
+//     C ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:75:9: Warning: Setter not found: 'C'.
+//     use(C ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:76:5: Warning: Setter not found: 'dynamic'.
+//     dynamic ??= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:77:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic ??= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:78:5: Warning: Setter not found: 'T'.
+//     T ??= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:79:9: Warning: Setter not found: 'T'.
+//     use(T ??= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:80:5: Warning: Setter not found: 'Func'.
+//     Func ??= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:81:9: Warning: Setter not found: 'Func'.
+//     use(Func ??= 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:83:5: Warning: Setter not found: 'C'.
+//     C += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:84:9: Warning: Setter not found: 'C'.
+//     use(C += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:85:5: Warning: Setter not found: 'dynamic'.
+//     dynamic += 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:86:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic += 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:87:5: Warning: Setter not found: 'T'.
+//     T += 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:88:9: Warning: Setter not found: 'T'.
+//     use(T += 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:89:5: Warning: Setter not found: 'Func'.
+//     Func += 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:90:9: Warning: Setter not found: 'Func'.
+//     use(Func += 42);
+//         ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:92:5: Warning: Setter not found: 'C'.
+//     C -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:93:9: Warning: Setter not found: 'C'.
+//     use(C -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:94:5: Warning: Setter not found: 'dynamic'.
+//     dynamic -= 42;
+//     ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:95:9: Warning: Setter not found: 'dynamic'.
+//     use(dynamic -= 42);
+//         ^^^^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:96:5: Warning: Setter not found: 'T'.
+//     T -= 42;
+//     ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:97:9: Warning: Setter not found: 'T'.
+//     use(T -= 42);
+//         ^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:98:5: Warning: Setter not found: 'Func'.
+//     Func -= 42;
+//     ^^^^
+//
+// pkg/front_end/testcases/rasta/type_literals.dart:99:9: Warning: Setter not found: 'Func'.
+//     use(Func -= 42);
+//         ^^^^
+//
 import self as self;
 import "dart:core" as core;
 
-typedef Func = () → void;
-class C<T extends core::Object> extends core::Object {
-  synthetic constructor •() → void
+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 {
-    self::C<dynamic>;
-    self::use(self::C<dynamic>);
+    self::C<dynamic>*;
+    self::use(self::C<dynamic>*);
     dynamic;
     self::use(dynamic);
-    self::C::T;
-    self::use(self::C::T);
-    () → void;
-    self::use(() → void);
-    self::C<dynamic>.call();
-    self::use(self::C<dynamic>.call());
-    dynamic.call();
-    self::use(dynamic.call());
-    self::C::T.call();
-    self::use(self::C::T.call());
-    () → void.call();
-    self::use(() → void.call());
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})));
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t1 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t1.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t2 = self::C<dynamic> in let final dynamic #t3 = #t2 in let final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t3.+(1)].toList(growable: false), <dynamic, dynamic>{})) in #t3);
-    let final dynamic #t5 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t5.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t6 = dynamic in let final dynamic #t7 = #t6 in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t7.+(1)].toList(growable: false), <dynamic, dynamic>{})) in #t7);
-    let final dynamic #t9 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t9.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t10 = self::C::T in let final dynamic #t11 = #t10 in let final dynamic #t12 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t11.+(1)].toList(growable: false), <dynamic, dynamic>{})) in #t11);
-    let final dynamic #t13 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t13.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t14 = () → void in let final dynamic #t15 = #t14 in let final dynamic #t16 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t15.+(1)].toList(growable: false), <dynamic, dynamic>{})) in #t15);
-    let final dynamic #t17 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t17.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t18 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t18.+(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t19 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t19.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t20 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t20.+(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t21 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t21.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t22 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t22.+(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t23 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t23.+(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t24 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t24.+(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t25 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t25.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t26 = self::C<dynamic> in let final dynamic #t27 = #t26 in let final dynamic #t28 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t27.-(1)].toList(growable: false), <dynamic, dynamic>{})) in #t27);
-    let final dynamic #t29 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t29.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t30 = dynamic in let final dynamic #t31 = #t30 in let final dynamic #t32 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t31.-(1)].toList(growable: false), <dynamic, dynamic>{})) in #t31);
-    let final dynamic #t33 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t33.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t34 = self::C::T in let final dynamic #t35 = #t34 in let final dynamic #t36 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t35.-(1)].toList(growable: false), <dynamic, dynamic>{})) in #t35);
-    let final dynamic #t37 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t37.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t38 = () → void in let final dynamic #t39 = #t38 in let final dynamic #t40 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t39.-(1)].toList(growable: false), <dynamic, dynamic>{})) in #t39);
-    let final dynamic #t41 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t41.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t42 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t42.-(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t43 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t43.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t44 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t44.-(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t45 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t45.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t46 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t46.-(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t47 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t47.-(1)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t48 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t48.-(1)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t49 = self::C<dynamic> in #t49.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : null;
-    self::use(let final dynamic #t50 = self::C<dynamic> in let final dynamic #t51 = #t50 in #t51.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : #t51);
-    let final dynamic #t52 = dynamic in #t52.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : null;
-    self::use(let final dynamic #t53 = dynamic in let final dynamic #t54 = #t53 in #t54.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : #t54);
-    let final dynamic #t55 = self::C::T in #t55.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : null;
-    self::use(let final dynamic #t56 = self::C::T in let final dynamic #t57 = #t56 in #t57.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : #t57);
-    let final dynamic #t58 = () → void in #t58.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : null;
-    self::use(let final dynamic #t59 = () → void in let final dynamic #t60 = #t59 in #t60.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[42].toList(growable: false), <dynamic, dynamic>{})) : #t60);
-    let final dynamic #t61 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t61.+(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t62 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t62.+(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t63 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t63.+(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t64 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t64.+(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t65 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t65.+(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t66 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t66.+(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t67 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t67.+(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t68 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t68.+(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t69 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t69.-(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t70 = self::C<dynamic> in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, null, <dynamic>[#t70.-(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t71 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t71.-(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t72 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, null, <dynamic>[#t72.-(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t73 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t73.-(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t74 = self::C::T in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, null, <dynamic>[#t74.-(42)].toList(growable: false), <dynamic, dynamic>{})));
-    let final dynamic #t75 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t75.-(42)].toList(growable: false), <dynamic, dynamic>{}));
-    self::use(let final dynamic #t76 = () → void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, null, <dynamic>[#t76.-(42)].toList(growable: false), <dynamic, dynamic>{})));
+    self::C::T*;
+    self::use(self::C::T*);
+    () →* void;
+    self::use(() →* void);
+    new self::C::•<dynamic>();
+    self::use(new self::C::•<dynamic>());
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t1 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t1.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t2 = self::C<dynamic>* in let final dynamic #t3 = #t2 in let final dynamic #t4 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t3.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t3);
+    let final dynamic #t5 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t5.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t6 = dynamic in let final dynamic #t7 = #t6 in let final dynamic #t8 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t7);
+    let final dynamic #t9 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t10 = self::C::T* in let final dynamic #t11 = #t10 in let final dynamic #t12 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t11.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t11);
+    let final dynamic #t13 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t13.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t14 = () →* void in let final dynamic #t15 = #t14 in let final dynamic #t16 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t15.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t15);
+    let final dynamic #t17 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t17.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t18 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t18.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t19 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t19.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t20 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t20.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t21 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t21.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t22 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t22.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t23 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t23.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t24 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t24.+(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t25 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t25.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t26 = self::C<dynamic>* in let final dynamic #t27 = #t26 in let final dynamic #t28 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t27.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t27);
+    let final dynamic #t29 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t29.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t30 = dynamic in let final dynamic #t31 = #t30 in let final dynamic #t32 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t31.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t31);
+    let final dynamic #t33 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t33.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t34 = self::C::T* in let final dynamic #t35 = #t34 in let final dynamic #t36 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t35.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t35);
+    let final dynamic #t37 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t37.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t38 = () →* void in let final dynamic #t39 = #t38 in let final dynamic #t40 = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t39.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) in #t39);
+    let final dynamic #t41 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t41.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t42 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t42.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t43 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t43.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t44 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t44.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t45 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t45.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t46 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t46.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t47 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t47.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t48 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t48.-(1)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t49 = self::C<dynamic>* in #t49.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : null;
+    self::use(let final dynamic #t50 = self::C<dynamic>* in let final dynamic #t51 = #t50 in #t51.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : #t51);
+    let final dynamic #t52 = dynamic in #t52.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : null;
+    self::use(let final dynamic #t53 = dynamic in let final dynamic #t54 = #t53 in #t54.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : #t54);
+    let final dynamic #t55 = self::C::T* in #t55.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : null;
+    self::use(let final dynamic #t56 = self::C::T* in let final dynamic #t57 = #t56 in #t57.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : #t57);
+    let final dynamic #t58 = () →* void in #t58.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : null;
+    self::use(let final dynamic #t59 = () →* void in let final dynamic #t60 = #t59 in #t60.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : #t60);
+    let final dynamic #t61 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t61.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t62 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t62.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t63 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t63.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t64 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t64.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t65 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t65.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t66 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t66.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t67 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t67.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t68 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t68.+(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t69 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t69.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t70 = self::C<dynamic>* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t70.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t71 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t71.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t72 = dynamic in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#dynamic, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t72.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t73 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t73.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t74 = self::C::T* in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#T, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t74.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
+    let final dynamic #t75 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t75.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+    self::use(let final dynamic #t76 = () →* void in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Func, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[#t76.-(42)]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))));
   }
 }
 static method use(dynamic x) → dynamic {
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect b/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
index 75c1fa6..74b02e7 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.outline.expect
@@ -2,9 +2,9 @@
 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>
+typedef Func = () →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
   method test() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
index c0e22e1..47838e6 100644
--- a/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/type_literals.dart.strong.expect
@@ -285,20 +285,20 @@
 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>
+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 {
-    self::C<dynamic>;
-    self::use(self::C<dynamic>);
+    self::C<dynamic>*;
+    self::use(self::C<dynamic>*);
     dynamic;
     self::use(dynamic);
-    self::C::T;
-    self::use(self::C::T);
-    () → void;
-    self::use(() → void);
+    self::C::T*;
+    self::use(self::C::T*);
+    () →* void;
+    self::use(() →* void);
     new self::C::•<dynamic>();
     self::use(new self::C::•<dynamic>());
     invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:22:5: Error: Method not found: 'dynamic'.
@@ -343,10 +343,10 @@
     self::use(invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:36:9: Error: Setter not found: 'Func'.
     use(Func = 42);
         ^^^^");
-    let final dynamic #t1 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Setter not found: 'C'.
+    let final dynamic #t1 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:38:5: Error: Setter not found: 'C'.
     C++;
     ^";
-    self::use(let final dynamic #t2 = self::C<dynamic> in let final dynamic #t3 = #t2 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t2 = self::C<dynamic>* in let final dynamic #t3 = #t2 in let final dynamic #t4 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:39:9: Error: Setter not found: 'C'.
     use(C++);
         ^" in #t3);
     let final dynamic #t5 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:40:5: Error: Setter not found: 'dynamic'.
@@ -355,22 +355,22 @@
     self::use(let final dynamic #t6 = dynamic in let final dynamic #t7 = #t6 in let final dynamic #t8 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:41:9: Error: Setter not found: 'dynamic'.
     use(dynamic++);
         ^^^^^^^" in #t7);
-    let final dynamic #t9 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Setter not found: 'T'.
+    let final dynamic #t9 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:42:5: Error: Setter not found: 'T'.
     T++;
     ^";
-    self::use(let final dynamic #t10 = self::C::T in let final dynamic #t11 = #t10 in let final dynamic #t12 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t10 = self::C::T* in let final dynamic #t11 = #t10 in let final dynamic #t12 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:43:9: Error: Setter not found: 'T'.
     use(T++);
         ^" in #t11);
-    let final dynamic #t13 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Setter not found: 'Func'.
+    let final dynamic #t13 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:44:5: Error: Setter not found: 'Func'.
     Func++;
     ^^^^";
-    self::use(let final dynamic #t14 = () → void in let final dynamic #t15 = #t14 in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t14 = () →* void in let final dynamic #t15 = #t14 in let final dynamic #t16 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:45:9: Error: Setter not found: 'Func'.
     use(Func++);
         ^^^^" in #t15);
-    let final dynamic #t17 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Setter not found: 'C'.
+    let final dynamic #t17 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:47:7: Error: Setter not found: 'C'.
     ++C;
       ^";
-    self::use(let final dynamic #t18 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t18 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:48:11: Error: Setter not found: 'C'.
     use(++C);
           ^");
     let final dynamic #t19 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:49:7: Error: Setter not found: 'dynamic'.
@@ -379,22 +379,22 @@
     self::use(let final dynamic #t20 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:50:11: Error: Setter not found: 'dynamic'.
     use(++dynamic);
           ^^^^^^^");
-    let final dynamic #t21 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Setter not found: 'T'.
+    let final dynamic #t21 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:51:7: Error: Setter not found: 'T'.
     ++T;
       ^";
-    self::use(let final dynamic #t22 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t22 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:52:11: Error: Setter not found: 'T'.
     use(++T);
           ^");
-    let final dynamic #t23 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Setter not found: 'Func'.
+    let final dynamic #t23 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:53:7: Error: Setter not found: 'Func'.
     ++Func;
       ^^^^";
-    self::use(let final dynamic #t24 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t24 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:54:11: Error: Setter not found: 'Func'.
     use(++Func);
           ^^^^");
-    let final dynamic #t25 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Setter not found: 'C'.
+    let final dynamic #t25 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:56:5: Error: Setter not found: 'C'.
     C--;
     ^";
-    self::use(let final dynamic #t26 = self::C<dynamic> in let final dynamic #t27 = #t26 in let final dynamic #t28 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t26 = self::C<dynamic>* in let final dynamic #t27 = #t26 in let final dynamic #t28 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:57:9: Error: Setter not found: 'C'.
     use(C--);
         ^" in #t27);
     let final dynamic #t29 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:58:5: Error: Setter not found: 'dynamic'.
@@ -403,22 +403,22 @@
     self::use(let final dynamic #t30 = dynamic in let final dynamic #t31 = #t30 in let final dynamic #t32 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:59:9: Error: Setter not found: 'dynamic'.
     use(dynamic--);
         ^^^^^^^" in #t31);
-    let final dynamic #t33 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Setter not found: 'T'.
+    let final dynamic #t33 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:60:5: Error: Setter not found: 'T'.
     T--;
     ^";
-    self::use(let final dynamic #t34 = self::C::T in let final dynamic #t35 = #t34 in let final dynamic #t36 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t34 = self::C::T* in let final dynamic #t35 = #t34 in let final dynamic #t36 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:61:9: Error: Setter not found: 'T'.
     use(T--);
         ^" in #t35);
-    let final dynamic #t37 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Setter not found: 'Func'.
+    let final dynamic #t37 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:62:5: Error: Setter not found: 'Func'.
     Func--;
     ^^^^";
-    self::use(let final dynamic #t38 = () → void in let final dynamic #t39 = #t38 in let final dynamic #t40 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t38 = () →* void in let final dynamic #t39 = #t38 in let final dynamic #t40 = invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:63:9: Error: Setter not found: 'Func'.
     use(Func--);
         ^^^^" in #t39);
-    let final dynamic #t41 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Setter not found: 'C'.
+    let final dynamic #t41 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:65:7: Error: Setter not found: 'C'.
     --C;
       ^";
-    self::use(let final dynamic #t42 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t42 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:66:11: Error: Setter not found: 'C'.
     use(--C);
           ^");
     let final dynamic #t43 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:67:7: Error: Setter not found: 'dynamic'.
@@ -427,22 +427,22 @@
     self::use(let final dynamic #t44 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:68:11: Error: Setter not found: 'dynamic'.
     use(--dynamic);
           ^^^^^^^");
-    let final dynamic #t45 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Setter not found: 'T'.
+    let final dynamic #t45 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:69:7: Error: Setter not found: 'T'.
     --T;
       ^";
-    self::use(let final dynamic #t46 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t46 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:70:11: Error: Setter not found: 'T'.
     use(--T);
           ^");
-    let final dynamic #t47 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Setter not found: 'Func'.
+    let final dynamic #t47 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:71:7: Error: Setter not found: 'Func'.
     --Func;
       ^^^^";
-    self::use(let final dynamic #t48 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t48 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:72:11: Error: Setter not found: 'Func'.
     use(--Func);
           ^^^^");
-    let final dynamic #t49 = self::C<dynamic> in #t49.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Setter not found: 'C'.
+    let final dynamic #t49 = self::C<dynamic>* in #t49.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:74:5: Error: Setter not found: 'C'.
     C ??= 42;
     ^" : null;
-    self::use(let final dynamic #t50 = self::C<dynamic> in let final dynamic #t51 = #t50 in #t51.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t50 = self::C<dynamic>* in let final dynamic #t51 = #t50 in #t51.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:75:9: Error: Setter not found: 'C'.
     use(C ??= 42);
         ^" : #t51);
     let final dynamic #t52 = dynamic in #t52.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:76:5: Error: Setter not found: 'dynamic'.
@@ -451,22 +451,22 @@
     self::use(let final dynamic #t53 = dynamic in let final dynamic #t54 = #t53 in #t54.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:77:9: Error: Setter not found: 'dynamic'.
     use(dynamic ??= 42);
         ^^^^^^^" : #t54);
-    let final dynamic #t55 = self::C::T in #t55.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Setter not found: 'T'.
+    let final dynamic #t55 = self::C::T* in #t55.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:78:5: Error: Setter not found: 'T'.
     T ??= 42;
     ^" : null;
-    self::use(let final dynamic #t56 = self::C::T in let final dynamic #t57 = #t56 in #t57.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t56 = self::C::T* in let final dynamic #t57 = #t56 in #t57.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:79:9: Error: Setter not found: 'T'.
     use(T ??= 42);
         ^" : #t57);
-    let final dynamic #t58 = () → void in #t58.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Setter not found: 'Func'.
+    let final dynamic #t58 = () →* void in #t58.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:80:5: Error: Setter not found: 'Func'.
     Func ??= 42;
     ^^^^" : null;
-    self::use(let final dynamic #t59 = () → void in let final dynamic #t60 = #t59 in #t60.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t59 = () →* void in let final dynamic #t60 = #t59 in #t60.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:81:9: Error: Setter not found: 'Func'.
     use(Func ??= 42);
         ^^^^" : #t60);
-    let final dynamic #t61 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Setter not found: 'C'.
+    let final dynamic #t61 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:83:5: Error: Setter not found: 'C'.
     C += 42;
     ^";
-    self::use(let final dynamic #t62 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t62 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:84:9: Error: Setter not found: 'C'.
     use(C += 42);
         ^");
     let final dynamic #t63 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:85:5: Error: Setter not found: 'dynamic'.
@@ -475,22 +475,22 @@
     self::use(let final dynamic #t64 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:86:9: Error: Setter not found: 'dynamic'.
     use(dynamic += 42);
         ^^^^^^^");
-    let final dynamic #t65 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Setter not found: 'T'.
+    let final dynamic #t65 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:87:5: Error: Setter not found: 'T'.
     T += 42;
     ^";
-    self::use(let final dynamic #t66 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t66 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:88:9: Error: Setter not found: 'T'.
     use(T += 42);
         ^");
-    let final dynamic #t67 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Setter not found: 'Func'.
+    let final dynamic #t67 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:89:5: Error: Setter not found: 'Func'.
     Func += 42;
     ^^^^";
-    self::use(let final dynamic #t68 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t68 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:90:9: Error: Setter not found: 'Func'.
     use(Func += 42);
         ^^^^");
-    let final dynamic #t69 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Setter not found: 'C'.
+    let final dynamic #t69 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:92:5: Error: Setter not found: 'C'.
     C -= 42;
     ^";
-    self::use(let final dynamic #t70 = self::C<dynamic> in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Setter not found: 'C'.
+    self::use(let final dynamic #t70 = self::C<dynamic>* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:93:9: Error: Setter not found: 'C'.
     use(C -= 42);
         ^");
     let final dynamic #t71 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:94:5: Error: Setter not found: 'dynamic'.
@@ -499,16 +499,16 @@
     self::use(let final dynamic #t72 = dynamic in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:95:9: Error: Setter not found: 'dynamic'.
     use(dynamic -= 42);
         ^^^^^^^");
-    let final dynamic #t73 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Setter not found: 'T'.
+    let final dynamic #t73 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:96:5: Error: Setter not found: 'T'.
     T -= 42;
     ^";
-    self::use(let final dynamic #t74 = self::C::T in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Setter not found: 'T'.
+    self::use(let final dynamic #t74 = self::C::T* in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:97:9: Error: Setter not found: 'T'.
     use(T -= 42);
         ^");
-    let final dynamic #t75 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Setter not found: 'Func'.
+    let final dynamic #t75 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:98:5: Error: Setter not found: 'Func'.
     Func -= 42;
     ^^^^";
-    self::use(let final dynamic #t76 = () → void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Setter not found: 'Func'.
+    self::use(let final dynamic #t76 = () →* void in invalid-expression "pkg/front_end/testcases/rasta/type_literals.dart:99:9: Error: Setter not found: 'Func'.
     use(Func -= 42);
         ^^^^");
   }
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect
index e5baaab..18a9ac7 100644
--- a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.expect
@@ -10,19 +10,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    new self::B::•<self::A>();
+    new self::B::•<self::A*>();
   }
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  field core::int i = null;
-  synthetic constructor •() → self::B<self::B::T>
+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::•()
     ;
 }
 static method main() → dynamic {
-  new self::B::•<self::A>();
+  new self::B::•<self::A*>();
 }
diff --git a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect
index e5baaab..18a9ac7 100644
--- a/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/type_with_parse_error.dart.strong.transformed.expect
@@ -10,19 +10,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic {
-    new self::B::•<self::A>();
+    new self::B::•<self::A*>();
   }
 }
-class B<T extends core::Object = dynamic> extends core::Object {
-  field core::int i = null;
-  synthetic constructor •() → self::B<self::B::T>
+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::•()
     ;
 }
 static method main() → dynamic {
-  new self::B::•<self::A>();
+  new self::B::•<self::A*>();
 }
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.legacy.expect b/pkg/front_end/testcases/rasta/typedef.dart.legacy.expect
index 5e87a7f..e46aaa3 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.legacy.expect
@@ -1,11 +1,26 @@
 library;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/rasta/typedef.dart:9:3: Warning: Setter not found: 'Foo'.
+//   Foo = null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:10:3: Warning: Setter not found: 'Foo'.
+//   Foo ??= null;
+//   ^^^
+//
+// pkg/front_end/testcases/rasta/typedef.dart:11:3: Warning: Method not found: 'Foo'.
+//   Foo();
+//   ^^^
+//
 import self as self;
 import "dart:core" as core;
 
-typedef Foo = () → void;
+typedef Foo = () →* void;
 static method main() → dynamic {
-  core::print(() → void);
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Foo, 34, null, <dynamic>[null].toList(growable: false), <dynamic, dynamic>{}));
-  let final dynamic #t1 = () → void in #t1.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Foo, 34, null, <dynamic>[null].toList(growable: false), <dynamic, dynamic>{})) : null;
-  () → void.call();
+  core::print(() →* void);
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Foo, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
+  let final dynamic #t1 = () →* void in #t1.==(null) ? throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Foo, 34, const <core::Type*>[], core::List::unmodifiable<dynamic>(<dynamic>[null]), core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{}))) : null;
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Foo, 32, const <core::Type*>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol*, dynamic>(const <core::Symbol*, dynamic>{})));
 }
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.outline.expect b/pkg/front_end/testcases/rasta/typedef.dart.outline.expect
index f4b16f1..e00807a 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.outline.expect
@@ -1,6 +1,6 @@
 library;
 import self as self;
 
-typedef Foo = () → void;
+typedef Foo = () →* void;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
index d703c59..92d39b4 100644
--- a/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/typedef.dart.strong.expect
@@ -17,13 +17,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo = () → void;
+typedef Foo = () →* void;
 static method main() → dynamic {
-  core::print(() → void);
+  core::print(() →* void);
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:9:3: Error: Setter not found: 'Foo'.
   Foo = null;
   ^^^";
-  let final dynamic #t1 = () → void in #t1.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Setter not found: 'Foo'.
+  let final dynamic #t1 = () →* void in #t1.==(null) ? invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:10:3: Error: Setter not found: 'Foo'.
   Foo ??= null;
   ^^^" : null;
   invalid-expression "pkg/front_end/testcases/rasta/typedef.dart:11:3: Error: Method not found: 'Foo'.
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.outline.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.outline.expect
index 8e86896..6014110 100644
--- a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •(dynamic x, dynamic y) → self::Foo
+  constructor •(dynamic x, dynamic y) → self::Foo*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect
index 0173ed6..2a5dbf9 100644
--- a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •(dynamic x, dynamic y) → self::Foo
+  constructor •(dynamic x, dynamic y) → self::Foo*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect
index 0173ed6..2a5dbf9 100644
--- a/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_constructor.dart.strong.transformed.expect
@@ -17,7 +17,7 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  constructor •(dynamic x, dynamic y) → self::Foo
+  constructor •(dynamic x, dynamic y) → self::Foo*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect
index ceda317..f58d04d 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.expect
@@ -79,9 +79,9 @@
 
 import "dart:collection" as collection;
 
-typedef VoidFunction = () → void;
+typedef VoidFunction = () →* void;
 class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
@@ -90,8 +90,8 @@
       core::print(this.key);
     }
     for (final dynamic #t2 in x) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(self::Fisk);
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+      core::print(self::Fisk*);
     }
     for (final dynamic #t3 in x) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
@@ -102,8 +102,8 @@
             ^^^^^^^^^^");
     }
     for (final dynamic #t4 in x) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(() → void);
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+      core::print(() →* void);
     }
     {
       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.
@@ -122,12 +122,12 @@
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
   for (final dynamic #t6 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
   }
   for (final dynamic #t7 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(self::Fisk);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(self::Fisk*);
   }
   for (final dynamic #t8 in arguments) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
@@ -138,8 +138,8 @@
           ^^^^^^^^^^");
   }
   for (final dynamic #t9 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(() → void);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(() →* void);
   }
   {
     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.
@@ -150,7 +150,16 @@
   for (1 in arguments) {
        ^";
       1;
-      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
     }
   }
 }
+
+constants  {
+  #C1 = #Fisk
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #VoidFunction
+  #C6 = #key
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect
index ceda317..f58d04d 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.legacy.transformed.expect
@@ -79,9 +79,9 @@
 
 import "dart:collection" as collection;
 
-typedef VoidFunction = () → void;
+typedef VoidFunction = () →* void;
 class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
@@ -90,8 +90,8 @@
       core::print(this.key);
     }
     for (final dynamic #t2 in x) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(self::Fisk);
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t2]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+      core::print(self::Fisk*);
     }
     for (final dynamic #t3 in x) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:17:10: Error: A prefix can't be used as an expression.
@@ -102,8 +102,8 @@
             ^^^^^^^^^^");
     }
     for (final dynamic #t4 in x) {
-      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-      core::print(() → void);
+      throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t4]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+      core::print(() →* void);
     }
     {
       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.
@@ -122,12 +122,12 @@
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
   for (final dynamic #t6 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t6]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
   }
   for (final dynamic #t7 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Fisk, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(self::Fisk);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t7]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(self::Fisk*);
   }
   for (final dynamic #t8 in arguments) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:37:8: Error: A prefix can't be used as an expression.
@@ -138,8 +138,8 @@
           ^^^^^^^^^^");
   }
   for (final dynamic #t9 in arguments) {
-    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#VoidFunction, 34, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-    core::print(() → void);
+    throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 34, #C2, core::List::unmodifiable<dynamic>(<dynamic>[#t9]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+    core::print(() →* void);
   }
   {
     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.
@@ -150,7 +150,16 @@
   for (1 in arguments) {
        ^";
       1;
-      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#key, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+      core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
     }
   }
 }
+
+constants  {
+  #C1 = #Fisk
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #VoidFunction
+  #C6 = #key
+}
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.outline.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.outline.expect
index a27da5c..b910ef9 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.outline.expect
@@ -4,9 +4,9 @@
 
 import "dart:collection" as collection;
 
-typedef VoidFunction = () → void;
+typedef VoidFunction = () →* void;
 class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     ;
   method it1(dynamic x) → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
index 54fcd03..ad3c1dc 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.expect
@@ -97,13 +97,13 @@
 
 import "dart:collection" as collection;
 
-typedef VoidFunction = () → void;
+typedef VoidFunction = () →* void;
 class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
-    for (final dynamic #t1 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t1 in x as{TypeError} 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'.
@@ -115,13 +115,13 @@
       print(key);
             ^^^");
     }
-    for (final dynamic #t2 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t2 in x as{TypeError} core::Iterable<dynamic>*) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
     for (Fisk in x) {
          ^^^^";
-      core::print(self::Fisk);
+      core::print(self::Fisk*);
     }
-    for (final dynamic #t3 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t3 in x as{TypeError} 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) {
          ^^^^^^^^^^";
@@ -129,17 +129,17 @@
       print(collection);
             ^^^^^^^^^^");
     }
-    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>*) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
     for (VoidFunction in x) {
          ^^^^^^^^^^^^";
-      core::print(() → void);
+      core::print(() →* void);
     }
     {
       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} core::Iterable<dynamic>) {
+      for (final dynamic #t5 in x as{TypeError} 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) {
          ^";
@@ -155,7 +155,7 @@
 }
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
-  for (final dynamic #t6 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t6 in arguments as{TypeError} 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) {
        ^^^";
@@ -163,13 +163,13 @@
     print(key);
           ^^^");
   }
-  for (final dynamic #t7 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t7 in arguments as{TypeError} core::Iterable<dynamic>*) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
   for (Fisk in arguments) {
        ^^^^";
-    core::print(self::Fisk);
+    core::print(self::Fisk*);
   }
-  for (final dynamic #t8 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t8 in arguments as{TypeError} 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) {
        ^^^^^^^^^^";
@@ -177,17 +177,17 @@
     print(collection);
           ^^^^^^^^^^");
   }
-  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>*) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
   for (VoidFunction in arguments) {
        ^^^^^^^^^^^^";
-    core::print(() → void);
+    core::print(() →* void);
   }
   {
     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} core::Iterable<dynamic>) {
+    for (final dynamic #t10 in arguments as{TypeError} 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) {
        ^";
diff --git a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
index 54fcd03..ad3c1dc 100644
--- a/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_for_in.dart.strong.transformed.expect
@@ -97,13 +97,13 @@
 
 import "dart:collection" as collection;
 
-typedef VoidFunction = () → void;
+typedef VoidFunction = () →* void;
 class Fisk extends core::Object {
-  synthetic constructor •() → self::Fisk
+  synthetic constructor •() → self::Fisk*
     : super core::Object::•()
     ;
   method it1(dynamic x) → dynamic {
-    for (final dynamic #t1 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t1 in x as{TypeError} 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'.
@@ -115,13 +115,13 @@
       print(key);
             ^^^");
     }
-    for (final dynamic #t2 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t2 in x as{TypeError} core::Iterable<dynamic>*) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:14:10: Error: Setter not found: 'Fisk'.
     for (Fisk in x) {
          ^^^^";
-      core::print(self::Fisk);
+      core::print(self::Fisk*);
     }
-    for (final dynamic #t3 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t3 in x as{TypeError} 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) {
          ^^^^^^^^^^";
@@ -129,17 +129,17 @@
       print(collection);
             ^^^^^^^^^^");
     }
-    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>) {
+    for (final dynamic #t4 in x as{TypeError} core::Iterable<dynamic>*) {
       invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:20:10: Error: Setter not found: 'VoidFunction'.
     for (VoidFunction in x) {
          ^^^^^^^^^^^^";
-      core::print(() → void);
+      core::print(() →* void);
     }
     {
       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} core::Iterable<dynamic>) {
+      for (final dynamic #t5 in x as{TypeError} 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) {
          ^";
@@ -155,7 +155,7 @@
 }
 static method main(dynamic arguments) → dynamic {
   new self::Fisk::•();
-  for (final dynamic #t6 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t6 in arguments as{TypeError} 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) {
        ^^^";
@@ -163,13 +163,13 @@
     print(key);
           ^^^");
   }
-  for (final dynamic #t7 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t7 in arguments as{TypeError} core::Iterable<dynamic>*) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:34:8: Error: Setter not found: 'Fisk'.
   for (Fisk in arguments) {
        ^^^^";
-    core::print(self::Fisk);
+    core::print(self::Fisk*);
   }
-  for (final dynamic #t8 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t8 in arguments as{TypeError} 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) {
        ^^^^^^^^^^";
@@ -177,17 +177,17 @@
     print(collection);
           ^^^^^^^^^^");
   }
-  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>) {
+  for (final dynamic #t9 in arguments as{TypeError} core::Iterable<dynamic>*) {
     invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:40:8: Error: Setter not found: 'VoidFunction'.
   for (VoidFunction in arguments) {
        ^^^^^^^^^^^^";
-    core::print(() → void);
+    core::print(() →* void);
   }
   {
     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} core::Iterable<dynamic>) {
+    for (final dynamic #t10 in arguments as{TypeError} 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) {
        ^";
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.outline.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.outline.expect
index 3cc4558..5cfc5c8 100644
--- a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.outline.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect
index bcaa50f..ff2cc72 100644
--- a/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect
+++ b/pkg/front_end/testcases/rasta/unresolved_recovery.dart.strong.expect
@@ -46,12 +46,12 @@
 import "dart:core" as core;
 
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
   method foo() → dynamic {
     super.[]=(4, 42);
-    let final core::int #t1 = 4 in super.[]=(#t1, super.[](#t1).+(5));
+    let final core::int* #t1 = 4 in super.[]=(#t1, super.[](#t1).+(5));
     return super.[](2);
   }
 }
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.legacy.expect b/pkg/front_end/testcases/redirecting_constructor.dart.legacy.expect
deleted file mode 100644
index 618bd6b..0000000
--- a/pkg/front_end/testcases/redirecting_constructor.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory fisk() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirecting_constructor.dart.legacy.transformed.expect
deleted file mode 100644
index 618bd6b..0000000
--- a/pkg/front_end/testcases/redirecting_constructor.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory fisk() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect b/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect
deleted file mode 100644
index 874062c..0000000
--- a/pkg/front_end/testcases/redirecting_constructor.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → self::A
-    ;
-  static factory fisk() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.strong.expect b/pkg/front_end/testcases/redirecting_constructor.dart.strong.expect
deleted file mode 100644
index 618bd6b..0000000
--- a/pkg/front_end/testcases/redirecting_constructor.dart.strong.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory fisk() → self::A
-    let dynamic #redirecting_factory = self::B::• in invalid-expression;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect
deleted file mode 100644
index 5376db1..0000000
--- a/pkg/front_end/testcases/redirecting_constructor.dart.strong.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::fisk];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory fisk() → self::A
-    let<BottomType> #redirecting_factory = self::B::• in invalid-expression;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
deleted file mode 100644
index a3e5543..0000000
--- a/pkg/front_end/testcases/redirecting_factory.dart.outline.expect
+++ /dev/null
@@ -1,55 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class FooBase<Tf extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::FooBase::•];
-  abstract get x() → core::int;
-  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
-    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
-}
-abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
-    let dynamic #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
-}
-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>
-    ;
-}
-class Builder<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Builder<self::Builder::X>
-    ;
-  method method() → dynamic
-    ;
-}
-class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
-  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
-    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
-}
-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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
-  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
-    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
-}
-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>
-    ;
-}
-class Base<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Base<self::Base::M>
-    ;
-}
-class Mixin<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Mixin<self::Mixin::M>
-    ;
-}
-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
-  ;
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory.dart.strong.expect
deleted file mode 100644
index 76a019a..0000000
--- a/pkg/front_end/testcases/redirecting_factory.dart.strong.expect
+++ /dev/null
@@ -1,74 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/redirecting_factory.dart'.
-//  - 'FooBase' is from 'pkg/front_end/testcases/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 field dynamic _redirecting# = <dynamic>[self::FooBase::•];
-  abstract get x() → core::int;
-  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
-    let dynamic #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
-}
-abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
-    let dynamic #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
-}
-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}>");
-  }
-}
-class Builder<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Builder<self::Builder::X>
-    : super core::Object::•()
-    ;
-  method method() → dynamic {
-    return new self::Bar::•<core::String, self::Builder::X>(4);
-  }
-}
-class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
-  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
-    let dynamic #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
-}
-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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
-  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
-    let dynamic #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
-}
-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::•()
-    ;
-}
-class Base<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Base<self::Base::M>
-    : super core::Object::•()
-    ;
-}
-class Mixin<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Mixin<self::Mixin::M>
-    : super core::Object::•()
-    ;
-}
-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(new self::Bar::•<core::String, core::double>(4).{self::FooBase::x});
-  new self::SimpleCaseImpl2::•<core::int, core::double>();
-  new self::Mix::•<core::double>();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect
deleted file mode 100644
index ab86769..0000000
--- a/pkg/front_end/testcases/redirecting_factory.dart.strong.transformed.expect
+++ /dev/null
@@ -1,74 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/redirecting_factory.dart'.
-//  - 'FooBase' is from 'pkg/front_end/testcases/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 field dynamic _redirecting# = <dynamic>[self::FooBase::•];
-  abstract get x() → core::int;
-  static factory •<Tf extends core::Object = dynamic>(core::int x) → self::FooBase<self::FooBase::•::Tf>
-    let <T extends core::Object = dynamic>(core::int) → self::Foo<self::Foo::•::T> #redirecting_factory = self::Foo::• in let self::FooBase::•::Tf #typeArg0 = null in invalid-expression;
-}
-abstract class Foo<T extends core::Object = dynamic> extends core::Object implements self::FooBase<dynamic> {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  static factory •<T extends core::Object = dynamic>(core::int x) → self::Foo<self::Foo::•::T>
-    let<BottomType> #redirecting_factory = self::Bar::• in let core::String #typeArg0 = null in let self::Foo::•::T #typeArg1 = null in invalid-expression;
-}
-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}>");
-  }
-}
-class Builder<X extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Builder<self::Builder::X>
-    : super core::Object::•()
-    ;
-  method method() → dynamic {
-    return new self::Bar::•<core::String, self::Builder::X>(4);
-  }
-}
-class SimpleCase<A extends core::Object = dynamic, B extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::SimpleCase::•];
-  static factory •<A extends core::Object = dynamic, B extends core::Object = dynamic>() → self::SimpleCase<self::SimpleCase::•::A, self::SimpleCase::•::B>
-    let <Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi> #redirecting_factory = self::SimpleCaseImpl::• in let self::SimpleCase::•::A #typeArg0 = null in let self::SimpleCase::•::B #typeArg1 = null in invalid-expression;
-}
-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 field dynamic _redirecting# = <dynamic>[self::SimpleCaseImpl::•];
-  static factory •<Ai extends core::Object = dynamic, Bi extends core::Object = dynamic>() → self::SimpleCaseImpl<self::SimpleCaseImpl::•::Ai, self::SimpleCaseImpl::•::Bi>
-    let<BottomType> #redirecting_factory = self::SimpleCaseImpl2::• in let self::SimpleCaseImpl::•::Ai #typeArg0 = null in let self::SimpleCaseImpl::•::Bi #typeArg1 = null in invalid-expression;
-}
-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::•()
-    ;
-}
-class Base<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Base<self::Base::M>
-    : super core::Object::•()
-    ;
-}
-class Mixin<M extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::Mixin<self::Mixin::M>
-    : super core::Object::•()
-    ;
-}
-class Mix<M extends core::Object = dynamic> extends self::Base<self::Mix::M> implements self::Mixin<self::Mix::M> {
-  synthetic constructor •() → self::Mix<self::Mix::M>
-    : super self::Base::•()
-    ;
-}
-static method main() → dynamic {
-  core::print(new self::Bar::•<core::String, core::double>(4).{self::FooBase::x});
-  new self::SimpleCaseImpl2::•<core::int, core::double>();
-  new self::Mix::•<core::double>();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect
deleted file mode 100644
index 1e1549a..0000000
--- a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library redirecting_factory_constructors.chain_test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory first() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
-  static factory second() → self::A
-    let dynamic #redirecting_factory = self::A::first in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect
deleted file mode 100644
index eba9d32..0000000
--- a/pkg/front_end/testcases/redirecting_factory_chain_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library redirecting_factory_constructors.chain_test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::first, self::A::second];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory first() → self::A
-    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
-  static factory second() → self::A
-    let () → self::A #redirecting_factory = self::A::first in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
deleted file mode 100644
index 97f89e1..0000000
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _X<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::_X::•];
-  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
-}
-class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<dynamic>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().x;
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
deleted file mode 100644
index 97f89e1..0000000
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _X<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::_X::•];
-  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
-}
-class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<dynamic>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().x;
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.runtimeType}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
deleted file mode 100644
index 25ec287..0000000
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _X<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::_X::•];
-  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
-}
-class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
-  const constructor •() → self::_Y<self::_Y::T>
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::_X<self::A::T> x;
-  constructor •(self::_X<self::A::T> x) → self::A<self::A::T>
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
deleted file mode 100644
index 0b4d35b..0000000
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _X<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::_X::•];
-  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
-    let dynamic #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
-}
-class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<core::Null>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect
deleted file mode 100644
index ee3ea48..0000000
--- a/pkg/front_end/testcases/redirecting_factory_const_inference.dart.strong.transformed.expect
+++ /dev/null
@@ -1,31 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class _X<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::_X::•];
-  static factory •<T extends core::Object = dynamic>() → self::_X<self::_X::•::T>
-    let<BottomType> #redirecting_factory = self::_Y::• in let self::_X::•::T #typeArg0 = null in invalid-expression;
-}
-class _Y<T extends core::Object = dynamic> extends core::Object implements self::_X<self::_Y::T> {
-  const constructor •() → self::_Y<self::_Y::T>
-    : super core::Object::•()
-    ;
-}
-class A<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl 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::•()
-    ;
-}
-class B<T extends core::Object = dynamic> extends self::A<self::B::T> {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•(const self::_Y::•<core::Null>())
-    ;
-}
-static method main() → dynamic {
-  dynamic x = new self::B::•<dynamic>().{self::A::x};
-  if(!(x is self::_Y<core::Null>)) {
-    throw "Unexpected run-time type: `new B().x` is ${x.{core::Object::runtimeType}}, but `_Y<Null>` expected";
-  }
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.expect
deleted file mode 100644
index 166f99e..0000000
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → self::Foo
-    : super core::Object::•()
-    ;
-  @self::forFactoryItself
-  static factory •(@self::forParameter @self::anotherForParameter dynamic p) → self::Foo
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
-}
-static const field dynamic forParameter = 1;
-static const field dynamic forFactoryItself = 2;
-static const field dynamic anotherForParameter = 3;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.transformed.expect
deleted file mode 100644
index 166f99e..0000000
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → self::Foo
-    : super core::Object::•()
-    ;
-  @self::forFactoryItself
-  static factory •(@self::forParameter @self::anotherForParameter dynamic p) → self::Foo
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
-}
-static const field dynamic forParameter = 1;
-static const field dynamic forFactoryItself = 2;
-static const field dynamic anotherForParameter = 3;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
deleted file mode 100644
index 4830e5f..0000000
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → self::Foo
-    ;
-  @self::forFactoryItself
-  static factory •(dynamic p) → self::Foo
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
-}
-static const field dynamic forParameter = 1;
-static const field dynamic forFactoryItself = 2;
-static const field dynamic anotherForParameter = 3;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect
deleted file mode 100644
index f6f89a4..0000000
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → self::Foo
-    : super core::Object::•()
-    ;
-  @self::forFactoryItself
-  static factory •(@self::forParameter @self::anotherForParameter dynamic p) → self::Foo
-    let dynamic #redirecting_factory = self::Foo::named in invalid-expression;
-}
-static const field core::int forParameter = 1;
-static const field core::int forFactoryItself = 2;
-static const field core::int anotherForParameter = 3;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.transformed.expect
deleted file mode 100644
index a4f3bab..0000000
--- a/pkg/front_end/testcases/redirecting_factory_metadata.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::Foo::•];
-  constructor named(dynamic p) → self::Foo
-    : super core::Object::•()
-    ;
-  @self::forFactoryItself
-  static factory •(@self::forParameter @self::anotherForParameter dynamic p) → self::Foo
-    let<BottomType> #redirecting_factory = self::Foo::named in invalid-expression;
-}
-static const field core::int forParameter = 1;
-static const field core::int forFactoryItself = 2;
-static const field core::int anotherForParameter = 3;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect
deleted file mode 100644
index 45ed39e..0000000
--- a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library redirecting_factory_constructors.simple_test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::redir];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory redir() → self::A
-    let dynamic #redirecting_factory = self::A::• in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect
deleted file mode 100644
index f34fced..0000000
--- a/pkg/front_end/testcases/redirecting_factory_simple_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library redirecting_factory_constructors.simple_test;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::redir];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory redir() → self::A
-    let<BottomType> #redirecting_factory = self::A::• in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect
deleted file mode 100644
index 3c6fa9b..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-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::•()
-    ;
-}
-class Y extends self::X {
-  synthetic constructor •() → self::Y
-    : super self::X::•()
-    ;
-}
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::redir];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory redir() → self::A
-    let dynamic #redirecting_factory = self::B::• in let self::Y #typeArg0 = null in invalid-expression;
-}
-class B<T extends self::X = self::X> extends self::A {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•<self::Y>();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect
deleted file mode 100644
index 75b7a4f..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeargs_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,30 +0,0 @@
-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::•()
-    ;
-}
-class Y extends self::X {
-  synthetic constructor •() → self::Y
-    : super self::X::•()
-    ;
-}
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::redir];
-  constructor •() → self::A
-    : super core::Object::•()
-    ;
-  static factory redir() → self::A
-    let<BottomType> #redirecting_factory = self::B::• in let self::Y #typeArg0 = null in invalid-expression;
-}
-class B<T extends self::X = self::X> extends self::A {
-  constructor •() → self::B<self::B::T>
-    : super self::A::•()
-    ;
-}
-static method main() → dynamic {
-  new self::B::•<self::Y>();
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect
deleted file mode 100644
index e36afbb..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::redir];
-  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>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•<core::int, core::String>(42, "foobar");
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect
deleted file mode 100644
index d9346de..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeparam_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::redir];
-  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>
-    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•<core::int, core::String>(42, "foobar");
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect
deleted file mode 100644
index 780300b..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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::•()
-    ;
-}
-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 field dynamic _redirecting# = <dynamic>[self::A::redir];
-  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>
-    let dynamic #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•<self::X, self::Y>(new self::X::•(), new self::Y::•());
-}
diff --git a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
deleted file mode 100644
index 7d68623..0000000
--- a/pkg/front_end/testcases/redirecting_factory_typeparambounds_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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::•()
-    ;
-}
-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 field dynamic _redirecting# = <dynamic>[self::A::redir];
-  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>
-    let<BottomType> #redirecting_factory = self::A::• in let self::A::redir::T #typeArg0 = null in let self::A::redir::S #typeArg1 = null in invalid-expression;
-}
-static method main() → dynamic {
-  new self::A::•<self::X, self::Y>(new self::X::•(), new self::Y::•());
-}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
deleted file mode 100644
index f3bfb14..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-class Foo<T extends self::X = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
deleted file mode 100644
index f3bfb14..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-class Foo<T extends self::X = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
deleted file mode 100644
index ba06dee..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.outline.expect
+++ /dev/null
@@ -1,19 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    ;
-}
-class Foo<T extends self::X = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor fromX(self::X _init) → self::Foo<self::Foo::T>
-    ;
-  constructor fromT(self::Foo::T _init) → self::Foo<self::Foo::T>
-    ;
-  constructor _internal({self::Foo::T x}) → self::Foo<self::Foo::T>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect
deleted file mode 100644
index 224bb84..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-class Foo<T extends self::X = self::X> extends core::Object {
-  generic-covariant-impl 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 = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
deleted file mode 100644
index 224bb84..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_assignable_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class X extends core::Object {
-  synthetic constructor •() → self::X
-    : super core::Object::•()
-    ;
-}
-class Foo<T extends self::X = self::X> extends core::Object {
-  generic-covariant-impl 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 = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
deleted file mode 100644
index b36d718..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
deleted file mode 100644
index b36d718..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: _init)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
deleted file mode 100644
index 36894d5..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.outline.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → self::Foo<self::Foo::T>
-    ;
-  constructor _internal({self::Foo::T x}) → self::Foo<self::Foo::T>
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
deleted file mode 100644
index 2856067..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-// Try changing the type of the parameter, or casting the argument to '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 {
-  generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-Try changing the type of the parameter, or casting the argument to 'T'.
-  Foo.from(String _init) : this._internal(x: _init);
-                                             ^" in _init as{TypeError} <BottomType>)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect b/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
deleted file mode 100644
index 2856067..0000000
--- a/pkg/front_end/testcases/redirecting_initializer_arguments_test.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-// Try changing the type of the parameter, or casting the argument to '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 {
-  generic-covariant-impl field self::Foo::T x;
-  constructor from(core::String _init) → self::Foo<self::Foo::T>
-    : this self::Foo::_internal(x: let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/redirecting_initializer_arguments_test.dart:12:46: Error: The argument type 'String' can't be assigned to the parameter type 'T'.
-Try changing the type of the parameter, or casting the argument to 'T'.
-  Foo.from(String _init) : this._internal(x: _init);
-                                             ^" in _init as{TypeError} <BottomType>)
-    ;
-  constructor _internal({self::Foo::T x = null}) → self::Foo<self::Foo::T>
-    : self::Foo::x = x, super core::Object::•()
-    ;
-}
-static method main() → void {}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect
deleted file mode 100644
index 137a8fe..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.hierarchy.expect
+++ /dev/null
@@ -1,458 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-A:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    A._redirecting#
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    A._redirecting#
-
-B:
-  superclasses:
-    Object
-      -> A<U>
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    B._redirecting#
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    B._redirecting#
-
-C:
-  superclasses:
-    Object
-      -> A<V>
-        -> B<V, S>
-  interfaces:
-  classMembers:
-    C.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.expect
deleted file mode 100644
index 32a5b17..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
-}
-class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
-}
-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");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.transformed.expect
deleted file mode 100644
index 32a5b17..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
-}
-class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
-}
-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");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
deleted file mode 100644
index d4a0e63..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.outline.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-class A<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
-}
-class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  constructor empty() → self::B<self::B::U, self::B::W>
-    ;
-  static factory •<U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
-}
-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>
-    ;
-  method toString() → core::String
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect
deleted file mode 100644
index 32a5b17..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
-}
-class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
-}
-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");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.transformed.expect
deleted file mode 100644
index 5e6a996..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let <U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W> #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::num #typeArg1 = null in invalid-expression;
-}
-class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let<BottomType> #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::String #typeArg2 = null in invalid-expression;
-}
-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");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect
deleted file mode 100644
index 137a8fe..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.hierarchy.expect
+++ /dev/null
@@ -1,458 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-A:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    A._redirecting#
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    A._redirecting#
-
-B:
-  superclasses:
-    Object
-      -> A<U>
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    B._redirecting#
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    B._redirecting#
-
-C:
-  superclasses:
-    Object
-      -> A<V>
-        -> B<V, S>
-  interfaces:
-  classMembers:
-    C.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.expect
deleted file mode 100644
index 09e1d27..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
-}
-abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
-}
-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>>");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
deleted file mode 100644
index 09e1d27..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
-}
-abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
-}
-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>>");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect
deleted file mode 100644
index f9db296..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.outline.expect
+++ /dev/null
@@ -1,28 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-abstract class A<T extends core::Object = dynamic> extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
-}
-abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  constructor empty() → self::B<self::B::U, self::B::W>
-    ;
-  static factory •<U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
-}
-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>
-    ;
-  method toString() → core::String
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.expect
deleted file mode 100644
index 09e1d27..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let dynamic #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
-}
-abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let dynamic #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
-}
-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>>");
-}
diff --git a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.transformed.expect b/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.transformed.expect
deleted file mode 100644
index eae9cec..0000000
--- a/pkg/front_end/testcases/redirection_chain_type_arguments_subst.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  constructor empty() → self::A<self::A::T>
-    : super core::Object::•()
-    ;
-  static factory •<T extends core::Object = dynamic>() → self::A<self::A::•::T>
-    let <U extends core::Object = dynamic, W extends core::Object = dynamic>() → self::B<self::B::•::U, self::B::•::W> #redirecting_factory = self::B::• in let self::A::•::T #typeArg0 = null in let core::List<self::A::•::T> #typeArg1 = null in invalid-expression;
-}
-abstract class B<U extends core::Object = dynamic, W extends core::Object = dynamic> extends self::A<self::B::U> {
-  static field dynamic _redirecting# = <dynamic>[self::B::•];
-  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>
-    let<BottomType> #redirecting_factory = self::C::• in let self::B::•::U #typeArg0 = null in let self::B::•::W #typeArg1 = null in let core::Map<self::B::•::U, self::B::•::W> #typeArg2 = null in invalid-expression;
-}
-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>>");
-}
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect
deleted file mode 100644
index d2d552d..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.hierarchy.expect
+++ /dev/null
@@ -1,437 +0,0 @@
-Object:
-  superclasses:
-  interfaces:
-  classMembers:
-    Object._haveSameRuntimeType
-    Object.toString
-    Object.runtimeType
-    Object._toString
-    Object._simpleInstanceOf
-    Object._hashCodeRnd
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._objectHashCode
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-A:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    A._redirecting#
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-    A._redirecting#
-
-B:
-  superclasses:
-    Object
-      -> A
-  interfaces:
-  classMembers:
-    B.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Expect:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Expect.identical
-    Expect.throwsCastError
-    Expect._fail
-    Expect.notIdentical
-    Expect.isNotNull
-    Expect._getMessage
-    Expect.allIdentical
-    Expect._escapeSubstring
-    Expect.fail
-    Expect._truncateString
-    Expect.isFalse
-    Expect.isTrue
-    Object.toString
-    Expect.subtype
-    Expect.throwsRangeError
-    Expect._stringDifference
-    Expect.throwsArgumentError
-    Expect.stringEquals
-    Object.runtimeType
-    Expect.testError
-    Expect.throwsStateError
-    Object._simpleInstanceOf
-    Expect.isNull
-    Expect.approxEquals
-    Expect.equals
-    Object._instanceOf
-    Expect.allDistinct
-    Expect.throwsTypeError
-    Expect._subtypeAtRuntime
-    Expect.setEquals
-    Object.noSuchMethod
-    Expect.notEquals
-    Expect.listEquals
-    Expect._findEquivalences
-    Expect.mapEquals
-    Object._identityHashCode
-    Expect.throwsUnsupportedError
-    Expect.notType
-    Expect.deepEquals
-    Expect._escapeString
-    Expect.type
-    Object.hashCode
-    Expect.throwsNoSuchMethodError
-    Expect.notSubtype
-    Expect.throws
-    Object._simpleInstanceOfFalse
-    Expect._writeEquivalences
-    Expect.throwsAssertionError
-    Object._simpleInstanceOfTrue
-    Object.==
-    Expect.throwsFormatException
-  classSetters:
-
-Exception:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-ExpectException:
-  Longest path to Object: 2
-  superclasses:
-    Object
-  interfaces: Exception
-  classMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-  interfaceMembers:
-    ExpectException.message
-    ExpectException.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  interfaceSetters:
-
-Immutable:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Immutable.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-Required:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Required.reason
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_AlwaysThrows:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Checked:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Experimental:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Factory:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTest:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_IsTestGroup:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Literal:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_MustCallSuper:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_OptionalTypeArgs:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Protected:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Sealed:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_Virtual:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForOverriding:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
-
-_VisibleForTesting:
-  superclasses:
-    Object
-  interfaces:
-  classMembers:
-    Object.toString
-    Object.runtimeType
-    Object._simpleInstanceOf
-    Object._instanceOf
-    Object.noSuchMethod
-    Object._identityHashCode
-    Object.hashCode
-    Object._simpleInstanceOfFalse
-    Object._simpleInstanceOfTrue
-    Object.==
-  classSetters:
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.expect
deleted file mode 100644
index 0dc1e9e..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → self::A
-    : super core::Object::•()
-    ;
-  static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
-}
-class B<T extends core::Object = dynamic> extends self::A {
-  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("${const self::B::•<core::String>()}", "String");
-}
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.transformed.expect
deleted file mode 100644
index 0dc1e9e..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → self::A
-    : super core::Object::•()
-    ;
-  static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
-}
-class B<T extends core::Object = dynamic> extends self::A {
-  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("${const self::B::•<core::String>()}", "String");
-}
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
deleted file mode 100644
index 0fcea3e..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-import "package:expect/expect.dart";
-
-class A extends core::Object {
-  static field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → self::A
-    ;
-  static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
-}
-class B<T extends core::Object = dynamic> extends self::A {
-  const constructor •() → self::B<self::B::T>
-    ;
-  method toString() → core::String
-    ;
-}
-static method main() → void
-  ;
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
deleted file mode 100644
index 0dc1e9e..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → self::A
-    : super core::Object::•()
-    ;
-  static factory •() → self::A
-    let dynamic #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
-}
-class B<T extends core::Object = dynamic> extends self::A {
-  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("${const self::B::•<core::String>()}", "String");
-}
diff --git a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect b/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
deleted file mode 100644
index d3d9485..0000000
--- a/pkg/front_end/testcases/redirection_type_arguments.dart.strong.transformed.expect
+++ /dev/null
@@ -1,25 +0,0 @@
-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 field dynamic _redirecting# = <dynamic>[self::A::•];
-  const constructor empty() → self::A
-    : super core::Object::•()
-    ;
-  static factory •() → self::A
-    let<BottomType> #redirecting_factory = self::B::• in let core::String #typeArg0 = null in invalid-expression;
-}
-class B<T extends core::Object = dynamic> extends self::A {
-  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("${const self::B::•<core::String>()}", "String");
-}
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect
index c900857..4a39bb8 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.expect
@@ -9,5 +9,5 @@
 import self as self;
 
 static method main() → dynamic {
-  <dynamic>[let final () → dynamic f = () → dynamic {} in f];
+  <dynamic>[let final () →* dynamic f = () → dynamic {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect
index c900857..4a39bb8 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.legacy.transformed.expect
@@ -9,5 +9,5 @@
 import self as self;
 
 static method main() → dynamic {
-  <dynamic>[let final () → dynamic f = () → dynamic {} in f];
+  <dynamic>[let final () →* dynamic f = () → dynamic {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
index 5f4a24f..976b248 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.expect
@@ -10,5 +10,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <() → core::Null>[let final () → core::Null f = () → core::Null {} in f];
+  <() →* core::Null*>[let final () →* core::Null* f = () → core::Null* {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
index 5f4a24f..976b248 100644
--- a/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29937.dart.strong.transformed.expect
@@ -10,5 +10,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  <() → core::Null>[let final () → core::Null f = () → core::Null {} in f];
+  <() →* core::Null*>[let final () →* core::Null* f = () → core::Null* {} in f];
 }
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
index 106be2a..eee3efe 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.expect
@@ -10,6 +10,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::String a = "";
+  core::String* a = "";
   invalid-type c = null;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
index 106be2a..eee3efe 100644
--- a/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29940.dart.strong.transformed.expect
@@ -10,6 +10,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::String a = "";
+  core::String* a = "";
   invalid-type c = null;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
index d9bc977..5fc0850 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  core::String a = "";
+  core::String* a = "";
   invalid-expression "pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.
   a.\"\";
     ^^";
diff --git a/pkg/front_end/testcases/regress/issue_29941.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29941.dart.strong.transformed.expect
index d9bc977..5fc0850 100644
--- a/pkg/front_end/testcases/regress/issue_29941.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29941.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  core::String a = "";
+  core::String* a = "";
   invalid-expression "pkg/front_end/testcases/regress/issue_29941.dart:7:5: Error: Expected an identifier, but got '\"\"'.
   a.\"\";
     ^^";
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect
index e96195a..2462f6d 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.expect
@@ -15,4 +15,4 @@
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () → dynamic h = () → dynamic => null in h;
+  return let final () →* dynamic h = () → dynamic => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect
index e96195a..2462f6d 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.legacy.transformed.expect
@@ -15,4 +15,4 @@
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () → dynamic h = () → dynamic => null in h;
+  return let final () →* dynamic h = () → dynamic => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
index 277a448..de81539 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.expect
@@ -16,4 +16,4 @@
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () → core::Null h = () → core::Null => null in h;
+  return let final () →* core::Null* h = () → core::Null* => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
index 277a448..de81539 100644
--- a/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29942.dart.strong.transformed.expect
@@ -16,4 +16,4 @@
 
 static method main() → dynamic {}
 static method f() → dynamic
-  return let final () → core::Null h = () → core::Null => null in h;
+  return let final () →* core::Null* h = () → core::Null* => null in h;
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect
index f598d94..5cb1717 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect
index f598d94..5cb1717 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.legacy.transformed.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
index 33037ab..9533487 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.outline.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field dynamic C;
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
index f598d94..5cb1717 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
index f598d94..5cb1717 100644
--- a/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29944.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 
 class C extends core::Object {
   field dynamic C = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
index 4ebde45..caabaf6 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.outline.expect
@@ -11,6 +11,6 @@
 //
 import self as self;
 
-typedef F = () → void;
+typedef F = () →* void;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
index 44014e5..cb75715 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.expect
@@ -11,5 +11,5 @@
 //
 import self as self;
 
-typedef F = () → void;
+typedef F = () →* void;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect
index 44014e5..cb75715 100644
--- a/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29975.dart.strong.transformed.expect
@@ -11,5 +11,5 @@
 //
 import self as self;
 
-typedef F = () → void;
+typedef F = () →* void;
 static method main() → void {}
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect
index 467f45c..7e1ffbb 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.expect
@@ -43,5 +43,12 @@
 static get x() → dynamic
   return null;
 static method main() → void {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect
index 467f45c..7e1ffbb 100644
--- a/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29976.dart.legacy.transformed.expect
@@ -43,5 +43,12 @@
 static get x() → dynamic
   return null;
 static method main() → void {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#f, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>["x${self::x.*("'")}"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #f
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect
index fee49f7..cebc27b 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.expect
@@ -11,5 +11,5 @@
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () → dynamic f = () → dynamic {} in f);
+  self::foo(null, let final () →* dynamic f = () → dynamic {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect
index fee49f7..cebc27b 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.legacy.transformed.expect
@@ -11,5 +11,5 @@
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () → dynamic f = () → dynamic {} in f);
+  self::foo(null, let final () →* dynamic f = () → dynamic {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
index e9b8c86..01dbc9a 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.expect
@@ -12,5 +12,5 @@
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () → core::Null f = () → core::Null {} in f);
+  self::foo(null, let final () →* core::Null* f = () → core::Null* {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
index e9b8c86..01dbc9a 100644
--- a/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29978.dart.strong.transformed.expect
@@ -12,5 +12,5 @@
 static method foo(dynamic a, dynamic b) → dynamic
   return null;
 static method main() → dynamic {
-  self::foo(null, let final () → core::Null f = () → core::Null {} in f);
+  self::foo(null, let final () →* core::Null* f = () → core::Null* {} in f);
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect
index a77e172..b662e6d 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.expect
@@ -9,5 +9,5 @@
 import self as self;
 
 static method main() → dynamic {
-  (let final () → dynamic f = () → dynamic {} in f).call();
+  (let final () →* dynamic f = () → dynamic {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect
index a77e172..b662e6d 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.legacy.transformed.expect
@@ -9,5 +9,5 @@
 import self as self;
 
 static method main() → dynamic {
-  (let final () → dynamic f = () → dynamic {} in f).call();
+  (let final () →* dynamic f = () → dynamic {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
index c9e4888..cdc5774 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.expect
@@ -10,5 +10,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () → core::Null f = () → core::Null {} in f).call();
+  (let final () →* core::Null* f = () → core::Null* {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
index c9e4888..cdc5774 100644
--- a/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29979.dart.strong.transformed.expect
@@ -10,5 +10,5 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  (let final () → core::Null f = () → core::Null {} in f).call();
+  (let final () →* core::Null* f = () → core::Null* {} in f).call();
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect
index 1019310..5dc072c 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.expect
@@ -9,9 +9,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C<dynamic> field = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field self::C<dynamic>* field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect
index 1019310..5dc072c 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.legacy.transformed.expect
@@ -9,9 +9,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C<dynamic> field = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field self::C<dynamic>* field = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
index 39e6ac5..bdc4a96 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  field self::C<dynamic> field;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field self::C<dynamic>* field;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
index 02e45d1..109d467 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.expect
@@ -9,9 +9,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
+class C<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type field = null;
-  synthetic constructor •() → self::C<self::C::T>
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
index 02e45d1..109d467 100644
--- a/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29981.dart.strong.transformed.expect
@@ -9,9 +9,9 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
+class C<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type field = null;
-  synthetic constructor •() → self::C<self::C::T>
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect
index e7b79bd..45ebe35 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.expect
@@ -42,5 +42,12 @@
 
 static method main() → dynamic {
   dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
-  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))))}");
+}
+
+constants  {
+  #C1 = #éh
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect
index e7b79bd..45ebe35 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.legacy.transformed.expect
@@ -42,5 +42,12 @@
 
 static method main() → dynamic {
   dynamic eh = <dynamic, dynamic>{"\u0233h": "\u0233h"};
-  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#éh, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))))}");
+  core::print("${eh.[](throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))))}");
+}
+
+constants  {
+  #C1 = #éh
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
index b69a45b..89f62f2 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.strong.expect
@@ -41,7 +41,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
+  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: Getter not found: '\u0233h'.
   print('\${eh[\u0233h']}');
               ^^")}");
diff --git a/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect
index b69a45b..89f62f2 100644
--- a/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29982.dart.strong.transformed.expect
@@ -41,7 +41,7 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Map<core::String, core::String> eh = <core::String, core::String>{"\u0233h": "\u0233h"};
+  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: Getter not found: '\u0233h'.
   print('\${eh[\u0233h']}');
               ^^")}");
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect
index 61df937..75f631b 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.legacy.transformed.expect
@@ -24,7 +24,7 @@
 static method f() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     {
       invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
   return missing;
@@ -37,7 +37,7 @@
 static method g() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
 g() sync* => dummy;
              ^";
@@ -48,7 +48,7 @@
 static method h() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     {
       (() → dynamic => "return").call();
     }
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
index 0d6e066..0c6a13d 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.expect
@@ -31,6 +31,6 @@
 g() sync* => dummy;
              ^";
 static method h() → dynamic sync* {
-  (() → core::String => "return").call();
+  (() → core::String* => "return").call();
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
index fbf6dd3..2908e6c 100644
--- a/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29983.dart.strong.transformed.expect
@@ -24,7 +24,7 @@
 static method f() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     {
       invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:7:3: Error: 'sync*' and 'async*' can't return a value.
   return missing;
@@ -37,7 +37,7 @@
 static method g() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     invalid-expression "pkg/front_end/testcases/regress/issue_29983.dart:11:14: Error: 'sync*' and 'async*' can't return a value.
 g() sync* => dummy;
              ^";
@@ -48,9 +48,9 @@
 static method h() → dynamic /* originally sync* */ {
   dynamic :await_jump_var = 0;
   dynamic :await_ctx_var;
-  function :sync_op(core::_SyncIterator<dynamic> :iterator) → core::bool yielding {
+  function :sync_op(core::_SyncIterator<dynamic>* :iterator) → core::bool* yielding {
     {
-      (() → core::String => "return").call();
+      (() → core::String* => "return").call();
     }
     return false;
   }
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect
index bbf49cd..ddee8cf 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.expect
@@ -17,9 +17,16 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  for (core::int i = let final<BottomType> #t1 = 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 (core::int* i = let final<BottomType> #t1 = 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 throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
+           ^" in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))); ; false) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #i
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect
index bbf49cd..ddee8cf 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.legacy.transformed.expect
@@ -17,9 +17,16 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  for (core::int i = let final<BottomType> #t1 = 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 (core::int* i = let final<BottomType> #t1 = 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 throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#i, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))); ; false) {
+           ^" in throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))); ; false) {
   }
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #i
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
index d7f4891..4b691f5 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.expect
@@ -17,11 +17,11 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  for (core::int i = (let final<BottomType> #t1 = 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 (core::int* i = (let final<BottomType> #t1 = 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: Getter not found: 'i'.
   for (int i = i;; false) {}
-               ^") as{TypeError} core::int; ; false) {
+               ^") as{TypeError} core::int*; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
index d7f4891..4b691f5 100644
--- a/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29984.dart.strong.transformed.expect
@@ -17,11 +17,11 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  for (core::int i = (let final<BottomType> #t1 = 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 (core::int* i = (let final<BottomType> #t1 = 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: Getter not found: 'i'.
   for (int i = i;; false) {}
-               ^") as{TypeError} core::int; ; false) {
+               ^") as{TypeError} core::int*; ; false) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect
index f483f0394..ccd6d9d 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.expect
@@ -19,6 +19,13 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #🔛
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect
index f483f0394..ccd6d9d 100644
--- a/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_29985.dart.legacy.transformed.expect
@@ -19,6 +19,13 @@
 import "dart:core" as core;
 
 static method bad() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#🔛, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #🔛
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect
index 2f3e686..073f1bc 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect
index 2f3e686..073f1bc 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.legacy.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
index f48580b..6935294 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.outline.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   set A(dynamic v) → void
     ;
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
index 5a1e38f..615c5f3 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
+  self::A* a = new self::A::•();
   a.{self::A::A} = 5;
 }
diff --git a/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
index 5a1e38f..615c5f3 100644
--- a/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30834.dart.strong.transformed.expect
@@ -10,12 +10,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   set A(dynamic v) → void {}
 }
 static method main() → dynamic {
-  self::A a = new self::A::•();
+  self::A* a = new self::A::•();
   a.{self::A::A} = 5;
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect
index 5d14926..c06a2df 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = null;
-  constructor •() → self::A
+  final field core::int* x = null;
+  constructor •() → self::A*
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect
index 5d14926..c06a2df 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.legacy.transformed.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = null;
-  constructor •() → self::A
+  final field core::int* x = null;
+  constructor •() → self::A*
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect
index b1048d5..0af78b3 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x;
-  constructor •() → self::A
+  final field core::int* x;
+  constructor •() → self::A*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
index 5d14926..c06a2df 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = null;
-  constructor •() → self::A
+  final field core::int* x = null;
+  constructor •() → self::A*
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
index 5d14926..c06a2df 100644
--- a/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30836.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::int x = null;
-  constructor •() → self::A
+  final field core::int* x = null;
+  constructor •() → self::A*
     : super core::Object::•() {}
 }
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect
index 01ce7fe..1c1d323 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.expect
@@ -2,21 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
+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
+  field <T extends core::Object* = dynamic>(T) →* core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test() → void {
-    this.f<core::String>("hello");
+    this.f<core::String*>("hello");
   }
 }
-static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
+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 self::foo;
+static method bar() → <T extends core::Object* = dynamic>(T) →* core::int*
+  return #C1;
 static method test1() → void {
-  self::bar().call<core::String>("hello");
+  self::bar().call<core::String*>("hello");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect
index 01ce7fe..1c1d323 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.legacy.transformed.expect
@@ -2,21 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
+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
+  field <T extends core::Object* = dynamic>(T) →* core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test() → void {
-    this.f<core::String>("hello");
+    this.f<core::String*>("hello");
   }
 }
-static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
+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 self::foo;
+static method bar() → <T extends core::Object* = dynamic>(T) →* core::int*
+  return #C1;
 static method test1() → void {
-  self::bar().call<core::String>("hello");
+  self::bar().call<core::String*>("hello");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
index a756f96..d54f1ce 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
+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;
-  synthetic constructor •() → self::A
+  field <T extends core::Object* = dynamic>(T) →* core::int* f;
+  synthetic constructor •() → self::A*
     ;
   method test() → void
     ;
 }
-static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
+static method foo<T extends core::Object* = dynamic>(self::foo::T* x) → core::int*
   ;
-static method bar() → <T extends core::Object = dynamic>(T) → core::int
+static method bar() → <T extends core::Object* = dynamic>(T) →* core::int*
   ;
 static method test1() → void
   ;
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
index a856d1f..f47c10a 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.expect
@@ -2,21 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
+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
+  field <T extends core::Object* = dynamic>(T) →* core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test() → void {
-    this.{self::A::f}<core::String>("hello");
+    this.{self::A::f}<core::String*>("hello");
   }
 }
-static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
+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 self::foo;
+static method bar() → <T extends core::Object* = dynamic>(T) →* core::int*
+  return #C1;
 static method test1() → void {
-  self::bar().call<core::String>("hello");
+  self::bar().call<core::String*>("hello");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
index a856d1f..f47c10a 100644
--- a/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30838.dart.strong.transformed.expect
@@ -2,21 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<S extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → S;
+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
+  field <T extends core::Object* = dynamic>(T) →* core::int* f = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method test() → void {
-    this.{self::A::f}<core::String>("hello");
+    this.{self::A::f}<core::String*>("hello");
   }
 }
-static method foo<T extends core::Object = dynamic>(self::foo::T x) → core::int
+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 self::foo;
+static method bar() → <T extends core::Object* = dynamic>(T) →* core::int*
+  return #C1;
 static method test1() → void {
-  self::bar().call<core::String>("hello");
+  self::bar().call<core::String*>("hello");
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::foo
+}
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect
index 8a1164f..c31c737 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect
index 8a1164f..c31c737 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.legacy.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect b/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
index e9dde73..0168eb6 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.outline.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   get A() → dynamic
     ;
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
index 8a1164f..c31c737 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
index 8a1164f..c31c737 100644
--- a/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_30981.dart.strong.transformed.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect
index 35b1ddf..2ee2402 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.expect
@@ -28,19 +28,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic f = core::Map<dynamic, dynamic>*.<(self::A*);
   field dynamic B = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
index 35b1ddf..2ee2402 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.legacy.transformed.expect
@@ -28,19 +28,19 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field dynamic f = core::Map<dynamic, dynamic>.<(self::A);
+  field dynamic f = core::Map<dynamic, dynamic>*.<(self::A*);
   field dynamic B = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
index 368d30d..e7e1f37 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.outline.expect
@@ -28,17 +28,17 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends core::Object {
   field dynamic f;
   field dynamic B;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   operator >() → dynamic
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
index e6f0d60..abdf3cd 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.expect
@@ -34,12 +34,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -50,7 +50,7 @@
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
index e6f0d60..abdf3cd 100644
--- a/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31155.dart.strong.transformed.expect
@@ -34,12 +34,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -50,7 +50,7 @@
   var f = Map<A, B> {};
              ^";
   field dynamic B = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator >() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect
index 9be6ce1..2c87a2a 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.expect
@@ -18,5 +18,5 @@
 import "dart:core" as core;
 
 typedef T = invalid-type;
-typedef F = () → core::Map<core::String, dynamic>;
+typedef F = () →* core::Map<core::String*, dynamic>*;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect
index 9be6ce1..2c87a2a 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.legacy.transformed.expect
@@ -18,5 +18,5 @@
 import "dart:core" as core;
 
 typedef T = invalid-type;
-typedef F = () → core::Map<core::String, dynamic>;
+typedef F = () →* core::Map<core::String*, dynamic>*;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
index 796d473..0528f74 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.outline.expect
@@ -18,6 +18,6 @@
 import "dart:core" as core;
 
 typedef T = invalid-type;
-typedef F = () → core::Map<core::String, dynamic>;
+typedef F = () →* core::Map<core::String*, dynamic>*;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
index 9be6ce1..2c87a2a 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.expect
@@ -18,5 +18,5 @@
 import "dart:core" as core;
 
 typedef T = invalid-type;
-typedef F = () → core::Map<core::String, dynamic>;
+typedef F = () →* core::Map<core::String*, dynamic>*;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
index 9be6ce1..2c87a2a 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.strong.transformed.expect
@@ -18,5 +18,5 @@
 import "dart:core" as core;
 
 typedef T = invalid-type;
-typedef F = () → core::Map<core::String, dynamic>;
+typedef F = () →* core::Map<core::String*, dynamic>*;
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect
index 28d2985..f1a3bea 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
-static field <T extends core::Object = dynamic>(T) → T x;
+typedef Foo<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_31181.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.transformed.expect
index 28d2985..f1a3bea 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.legacy.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
-static field <T extends core::Object = dynamic>(T) → T x;
+typedef Foo<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_31181.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
index b2e2e71..8187fe8 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.outline.expect
@@ -2,7 +2,7 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
-static field <T extends core::Object = dynamic>(T) → T x;
+typedef Foo<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_31181.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
index 28d2985..f1a3bea 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.strong.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
-static field <T extends core::Object = dynamic>(T) → T x;
+typedef Foo<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_31181.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
index 28d2985..f1a3bea 100644
--- a/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31181.dart.strong.transformed.expect
@@ -2,6 +2,6 @@
 import self as self;
 import "dart:core" as core;
 
-typedef Foo<T extends core::Object = dynamic> = <T extends core::Object = dynamic>(T) → T;
-static field <T extends core::Object = dynamic>(T) → T x;
+typedef Foo<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.legacy.expect b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.expect
index aac5171..4a48715 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect
index aac5171..4a48715 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.legacy.transformed.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
index 5b125a0..83c661f0d 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.outline.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   operator unary-() → dynamic
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
index aac5171..4a48715 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
index aac5171..4a48715 100644
--- a/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31183.dart.strong.transformed.expect
@@ -15,7 +15,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   operator unary-() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect
index 6b6b0e4..81eb8cc 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.expect
@@ -21,7 +21,7 @@
 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 (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++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect
index 6b6b0e4..81eb8cc 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.legacy.transformed.expect
@@ -21,7 +21,7 @@
 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 (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++) {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
index a3c59b2..ffc6739 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.expect
@@ -21,11 +21,11 @@
 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 (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++) {}
-                  ^" as{TypeError} core::int; invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: This couldn't be parsed.
+                  ^" as{TypeError} core::int*; 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++) {}
-                    ^".>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+                    ^".>(10) as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31184.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31184.dart.strong.transformed.expect
index a3c59b2..ffc6739 100644
--- a/pkg/front_end/testcases/regress/issue_31184.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31184.dart.strong.transformed.expect
@@ -21,11 +21,11 @@
 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 (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++) {}
-                  ^" as{TypeError} core::int; invalid-expression "pkg/front_end/testcases/regress/issue_31184.dart:6:21: Error: This couldn't be parsed.
+                  ^" as{TypeError} core::int*; 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++) {}
-                    ^".>(10) as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+                    ^".>(10) as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
   }
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect
index 53b6c90..92d46a0 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.expect
@@ -17,12 +17,12 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i = 5;
-static method test1() → core::int {
+static field core::int* i = 5;
+static method test1() → core::int* {
   return let final dynamic #t1 = self::i in let final dynamic #t2 = self::i = #t1.+(1) in #t1;
   self::i;
 }
-static method test2() → core::int {
+static method test2() → core::int* {
   return let final dynamic #t3 = self::i in let final dynamic #t4 = #t3 in let final dynamic #t5 = invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
   return (i) ++ (i);
            ^" in #t4;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect
index 53b6c90..92d46a0 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.legacy.transformed.expect
@@ -17,12 +17,12 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i = 5;
-static method test1() → core::int {
+static field core::int* i = 5;
+static method test1() → core::int* {
   return let final dynamic #t1 = self::i in let final dynamic #t2 = self::i = #t1.+(1) in #t1;
   self::i;
 }
-static method test2() → core::int {
+static method test2() → core::int* {
   return let final dynamic #t3 = self::i in let final dynamic #t4 = #t3 in let final dynamic #t5 = invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
   return (i) ++ (i);
            ^" in #t4;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31185.dart.outline.expect
index 608d890..2dca69f 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.outline.expect
@@ -2,10 +2,10 @@
 import self as self;
 import "dart:core" as core;
 
-static field core::int i;
-static method test1() → core::int
+static field core::int* i;
+static method test1() → core::int*
   ;
-static method test2() → core::int
+static method test2() → core::int*
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
index f399b3a..cf09cb2 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.expect
@@ -17,15 +17,15 @@
 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) in #t1;
+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) in #t1;
   self::i;
 }
-static method test2() → core::int {
+static method test2() → core::int* {
   return (let final dynamic #t3 = self::i in let final dynamic #t4 = #t3 in let final dynamic #t5 = invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
   return (i) ++ (i);
-           ^" in #t4) as{TypeError} core::int;
+           ^" in #t4) as{TypeError} core::int*;
   self::i;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
index d1b5634..3d41703 100644
--- a/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31185.dart.strong.transformed.expect
@@ -17,15 +17,15 @@
 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) in #t1;
+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) in #t1;
   self::i;
 }
-static method test2() → core::int {
-  return (let final core::int #t3 = self::i in let final core::int #t4 = #t3 in let final dynamic #t5 = invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
+static method test2() → core::int* {
+  return (let final core::int* #t3 = self::i in let final core::int* #t4 = #t3 in let final dynamic #t5 = invalid-expression "pkg/front_end/testcases/regress/issue_31185.dart:12:12: Error: Can't assign to a parenthesized expression.
   return (i) ++ (i);
-           ^" in #t4) as{TypeError} core::int;
+           ^" in #t4) as{TypeError} core::int*;
   self::i;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect
index 8220450..8f4d364 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.expect
@@ -25,6 +25,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type T = core::Map<dynamic, dynamic>*.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 static field invalid-type B;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #A
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect
index 8220450..8f4d364 100644
--- a/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31188.dart.legacy.transformed.expect
@@ -25,6 +25,13 @@
 import self as self;
 import "dart:core" as core;
 
-static field invalid-type T = core::Map<dynamic, dynamic>.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#A, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+static field invalid-type T = core::Map<dynamic, dynamic>*.<(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 33, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
 static field invalid-type B;
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #A
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect
index 7bfc382..31707d1 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.expect
@@ -22,9 +22,9 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object = dynamic> extends core::Object {
+class Typed<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type v = null;
-  synthetic constructor •() → self::Typed<self::Typed::T>
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect
index 7bfc382..31707d1 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.legacy.transformed.expect
@@ -22,9 +22,9 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object = dynamic> extends core::Object {
+class Typed<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type v = null;
-  synthetic constructor •() → self::Typed<self::Typed::T>
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
index 5820107..7a2a75f 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.outline.expect
@@ -14,9 +14,9 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object = dynamic> extends core::Object {
+class Typed<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type v;
-  synthetic constructor •() → self::Typed<self::Typed::T>
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
index 3ccd713..c840d50 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.expect
@@ -22,9 +22,9 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object = dynamic> extends core::Object {
+class Typed<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type v = null;
-  synthetic constructor •() → self::Typed<self::Typed::T>
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
index 3ccd713..c840d50 100644
--- a/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31190.dart.strong.transformed.expect
@@ -22,9 +22,9 @@
 import self as self;
 import "dart:core" as core;
 
-class Typed<T extends core::Object = dynamic> extends core::Object {
+class Typed<T extends core::Object* = dynamic> extends core::Object {
   field invalid-type v = null;
-  synthetic constructor •() → self::Typed<self::Typed::T>
+  synthetic constructor •() → self::Typed<self::Typed::T*>*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect
index 5e16fda..b90922e 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.expect
@@ -15,8 +15,8 @@
 import "dart:core" as core;
 
 class Increment extends core::Object {
-  field core::int x = null;
-  constructor •() → self::Increment
+  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++ {}
                 ^" {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect
index 5e16fda..b90922e 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.legacy.transformed.expect
@@ -15,8 +15,8 @@
 import "dart:core" as core;
 
 class Increment extends core::Object {
-  field core::int x = null;
-  constructor •() → self::Increment
+  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++ {}
                 ^" {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
index 42415db..ada6bd1 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.outline.expect
@@ -11,8 +11,8 @@
 import "dart:core" as core;
 
 class Increment extends core::Object {
-  field core::int x;
-  constructor •() → self::Increment
+  field core::int* x;
+  constructor •() → self::Increment*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
index 5e16fda..b90922e 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.expect
@@ -15,8 +15,8 @@
 import "dart:core" as core;
 
 class Increment extends core::Object {
-  field core::int x = null;
-  constructor •() → self::Increment
+  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++ {}
                 ^" {}
diff --git a/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
index 5e16fda..b90922e 100644
--- a/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31192.dart.strong.transformed.expect
@@ -15,8 +15,8 @@
 import "dart:core" as core;
 
 class Increment extends core::Object {
-  field core::int x = null;
-  constructor •() → self::Increment
+  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++ {}
                 ^" {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect
index 895d3bb..c23342a 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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() {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect
index 895d3bb..c23342a 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.legacy.transformed.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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() {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31198.dart.outline.expect
index 08a7214..4e20cb0 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.outline.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  constructor •() → self::B*
     ;
 }
 static method bad() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
index 895d3bb..c23342a 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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() {}
diff --git a/pkg/front_end/testcases/regress/issue_31198.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31198.dart.strong.transformed.expect
index 895d3bb..c23342a 100644
--- a/pkg/front_end/testcases/regress/issue_31198.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31198.dart.strong.transformed.expect
@@ -15,12 +15,12 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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() {}
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect
index da2a301..a61f604 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<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) → dynamic {
-    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
+typedef C<A extends core::Object* = dynamic, K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<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) → dynamic {
+    return <B extends core::Object* = dynamic>(A* v2, self::producer::K* v3, B* v4) → dynamic => 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);
+  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_31213.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.transformed.expect
index da2a301..a61f604 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<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) → dynamic {
-    return <B extends core::Object = dynamic>(A v2, self::producer::K v3, B v4) → dynamic => 0;
+typedef C<A extends core::Object* = dynamic, K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<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) → dynamic {
+    return <B extends core::Object* = dynamic>(A* v2, self::producer::K* v3, B* v4) → dynamic => 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);
+  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_31213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
index a1d78e7..64d7ec6 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.outline.expect
@@ -2,9 +2,9 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<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
+typedef C<A extends core::Object* = dynamic, K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<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
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
index 2bb9fe5..b01d4ea 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<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;
+typedef C<A extends core::Object* = dynamic, K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<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);
+  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_31213.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
index 2bb9fe5..b01d4ea 100644
--- a/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31213.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef C<A extends core::Object = dynamic, K extends core::Object = dynamic> = <B extends core::Object = dynamic>(A, K, B) → core::int;
-typedef D<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;
+typedef C<A extends core::Object* = dynamic, K extends core::Object* = dynamic> = <B extends core::Object* = dynamic>(A*, K*, B*) →* core::int*;
+typedef D<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);
+  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.legacy.expect b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.expect
index 00cb07e..ed264d8 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.expect
@@ -14,20 +14,27 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int m;
-  constructor •() → self::A
+  field core::int* m;
+  constructor •() → self::A*
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → self::A
+  constructor foo() → self::A*
     : self::A::m = 2, super core::Object::•()
     ;
-  method foo(core::int a, core::int b) → core::int
+  method foo(core::int* a, core::int* b) → core::int*
     return a.+(b.*(this.{self::A::m}));
 }
 static method test() → dynamic {
   new self::A::•().foo();
   new self::A::•().foo(1, 2);
   new self::A::foo();
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[1, 2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[1, 2]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect
index 00cb07e..ed264d8 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.legacy.transformed.expect
@@ -14,20 +14,27 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int m;
-  constructor •() → self::A
+  field core::int* m;
+  constructor •() → self::A*
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → self::A
+  constructor foo() → self::A*
     : self::A::m = 2, super core::Object::•()
     ;
-  method foo(core::int a, core::int b) → core::int
+  method foo(core::int* a, core::int* b) → core::int*
     return a.+(b.*(this.{self::A::m}));
 }
 static method test() → dynamic {
   new self::A::•().foo();
   new self::A::•().foo(1, 2);
   new self::A::foo();
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[1, 2]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[1, 2]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = #foo
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+}
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
index 286af56..85ce004 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int m;
-  constructor •() → self::A
+  field core::int* m;
+  constructor •() → self::A*
     ;
-  constructor foo() → self::A
+  constructor foo() → self::A*
     ;
-  method foo(core::int a, core::int b) → core::int
+  method foo(core::int* a, core::int* b) → core::int*
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
index f42f82a..1c5c821 100644
--- a/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31299.dart.strong.expect
@@ -18,14 +18,14 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int m;
-  constructor •() → self::A
+  field core::int* m;
+  constructor •() → self::A*
     : self::A::m = 1, super core::Object::•()
     ;
-  constructor foo() → self::A
+  constructor foo() → self::A*
     : self::A::m = 2, super core::Object::•()
     ;
-  method foo(core::int a, core::int b) → core::int
+  method foo(core::int* a, core::int* b) → core::int*
     return a.{core::num::+}(b.{core::num::*}(this.{self::A::m}));
 }
 static method test() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
index 6d52cfc..9868e6f 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   method foo() → dynamic
     ;
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
index d0f5eb8..cf83ecf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A = self::A>(T t) → void {
+  function bar<T extends self::A* = self::A*>(T* t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
-  bar.call<self::A>(new self::A::•());
-  (<S extends self::A = self::A>(S s) → core::Null {
+  bar.call<self::A*>(new self::A::•());
+  (<S extends self::A* = self::A*>(S* s) → core::Null* {
     core::print("s.foo()=${s.{self::A::foo}()}");
-  }).call<self::A>(new self::A::•());
+  }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
index d0f5eb8..cf83ecf 100644
--- a/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31766.dart.strong.transformed.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   method foo() → dynamic
     return null;
 }
 static method main() → dynamic {
-  function bar<T extends self::A = self::A>(T t) → void {
+  function bar<T extends self::A* = self::A*>(T* t) → void {
     core::print("t.foo()=${t.{self::A::foo}()}");
   }
-  bar.call<self::A>(new self::A::•());
-  (<S extends self::A = self::A>(S s) → core::Null {
+  bar.call<self::A*>(new self::A::•());
+  (<S extends self::A* = self::A*>(S* s) → core::Null* {
     core::print("s.foo()=${s.{self::A::foo}()}");
-  }).call<self::A>(new self::A::•());
+  }).call<self::A*>(new self::A::•());
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect
index f71d395..c366149 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.expect
@@ -3,11 +3,15 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<S> = dynamic, S extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends (T) → dynamic = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::List<core::List<T>> = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((#C1) is () →* dynamic);
+  core::print((<T extends core::Object* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::num* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<T>* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<S>* = dynamic, S extends core::Object* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends (T) →* dynamic = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::List<core::List<T>*>* = dynamic>(T* x) → dynamic => x).runtimeType);
+}
+
+constants  {
+  #C1 = tearoff self::main
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect
index f71d395..c366149 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.legacy.transformed.expect
@@ -3,11 +3,15 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::num = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<T> = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::Comparable<S> = dynamic, S extends core::Object = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends (T) → dynamic = dynamic>(T x) → dynamic => x).runtimeType);
-  core::print((<T extends core::List<core::List<T>> = dynamic>(T x) → dynamic => x).runtimeType);
+  core::print((#C1) is () →* dynamic);
+  core::print((<T extends core::Object* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::num* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<T>* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::Comparable<S>* = dynamic, S extends core::Object* = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends (T) →* dynamic = dynamic>(T* x) → dynamic => x).runtimeType);
+  core::print((<T extends core::List<core::List<T>*>* = dynamic>(T* x) → dynamic => x).runtimeType);
+}
+
+constants  {
+  #C1 = tearoff self::main
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
index b07df45..f501b52 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.expect
@@ -3,11 +3,15 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::num = core::num>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<T> = core::Comparable<dynamic>>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<S> = core::Comparable<dynamic>, S extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends (T) → dynamic = (core::Null) → dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::List<core::List<T>> = core::List<core::List<dynamic>>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((#C1) is () →* dynamic);
+  core::print((<T extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<T>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<S>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T) →* dynamic = (core::Null*) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::List<core::List<T>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
+}
+
+constants  {
+  #C1 = tearoff self::main
 }
diff --git a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
index b07df45..f501b52 100644
--- a/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31846.dart.strong.transformed.expect
@@ -3,11 +3,15 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::print(self::main is () → dynamic);
-  core::print((<T extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::num = core::num>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<T> = core::Comparable<dynamic>>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::Comparable<S> = core::Comparable<dynamic>, S extends core::Object = dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends (T) → dynamic = (core::Null) → dynamic>(T x) → T => x).{core::Object::runtimeType});
-  core::print((<T extends core::List<core::List<T>> = core::List<core::List<dynamic>>>(T x) → T => x).{core::Object::runtimeType});
+  core::print((#C1) is () →* dynamic);
+  core::print((<T extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::num* = core::num*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<T>* = core::Comparable<dynamic>*>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::Comparable<S>* = core::Comparable<dynamic>*, S extends core::Object* = dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends (T) →* dynamic = (core::Null*) →* dynamic>(T* x) → T* => x).{core::Object::runtimeType});
+  core::print((<T extends core::List<core::List<T>*>* = core::List<core::List<dynamic>*>*>(T* x) → T* => x).{core::Object::runtimeType});
+}
+
+constants  {
+  #C1 = tearoff self::main
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect
index 10f5e32..bbe2de8 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.expect
@@ -2,28 +2,28 @@
 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>
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
-class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → self::Child1
+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
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect
index 10f5e32..bbe2de8 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.legacy.transformed.expect
@@ -2,28 +2,28 @@
 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>
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
-class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → self::Child1
+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
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect b/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
index 67628e9..2e18f24 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.outline.expect
@@ -2,24 +2,24 @@
 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>
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     ;
 }
-class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → self::Child1
+class Child1 extends self::Base implements self::C<core::int*> {
+  synthetic constructor •() → self::Child1*
     ;
 }
-class Child2 extends self::Base implements self::C<core::double> {
-  synthetic constructor •() → self::Child2
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect b/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
index 10f5e32..bbe2de8 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.strong.expect
@@ -2,28 +2,28 @@
 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>
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
-class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → self::Child1
+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
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
index 10f5e32..bbe2de8 100644
--- a/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31996.dart.strong.transformed.expect
@@ -2,28 +2,28 @@
 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>
+abstract class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
 class Base extends core::Object implements self::B<dynamic> {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
 }
-class Child1 extends self::Base implements self::C<core::int> {
-  synthetic constructor •() → self::Child1
+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
+class Child2 extends self::Base implements self::C<core::double*> {
+  synthetic constructor •() → self::Child2*
     : super self::Base::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect
index 628ada3..d994bc5 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.expect
@@ -4,25 +4,25 @@
 
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
   method m() → dynamic
     return 42;
 }
-abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
-  synthetic constructor •() → self::_C&A&M
+abstract class _C&A&M = self::A<self::A<dynamic>*> with self::M {
+  synthetic constructor •() → self::_C&A&M*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&M::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect
index 1ce00d2..2407be7 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.legacy.transformed.expect
@@ -4,27 +4,27 @@
 
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
   method m() → dynamic
     return 42;
 }
-abstract class _C&A&M extends self::A<self::A<dynamic>> implements self::M {
-  synthetic constructor •() → self::_C&A&M
+abstract class _C&A&M extends self::A<self::A<dynamic>*> implements self::M {
+  synthetic constructor •() → self::_C&A&M*
     : super self::A::•()
     ;
   method m() → dynamic
     return 42;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&M::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
index 96244c9..426b983 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.outline.expect
@@ -4,23 +4,23 @@
 
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
   method m() → dynamic
     ;
 }
-abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
-  synthetic constructor •() → self::_C&A&M
+abstract class _C&A&M = self::A<self::A<dynamic>*> with self::M {
+  synthetic constructor •() → self::_C&A&M*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
index e0b348f..e8d1b92 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.expect
@@ -4,25 +4,25 @@
 
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
   method m() → dynamic
     return 42;
 }
-abstract class _C&A&M = self::A<self::A<dynamic>> with self::M {
-  synthetic constructor •() → self::_C&A&M
+abstract class _C&A&M = self::A<self::A<dynamic>*> with self::M {
+  synthetic constructor •() → self::_C&A&M*
     : super self::A::•()
     ;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&M::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
index 5b387e9..2369578 100644
--- a/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32182.dart.strong.transformed.expect
@@ -4,27 +4,27 @@
 
 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>
+class A<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::A<self::A::T*>*
     : super core::Object::•()
     ;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
   method m() → dynamic
     return 42;
 }
-abstract class _C&A&M extends self::A<self::A<dynamic>> implements self::M {
-  synthetic constructor •() → self::_C&A&M
+abstract class _C&A&M extends self::A<self::A<dynamic>*> implements self::M {
+  synthetic constructor •() → self::_C&A&M*
     : super self::A::•()
     ;
   method m() → dynamic
     return 42;
 }
 class C extends self::_C&A&M {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::_C&A&M::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect
index 296b485..a9d3c84 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String name;
-  constructor get(core::String name) → self::A
+  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
+  constructor set(core::String* name) → self::A*
     : self::A::name = name, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect
index 296b485..a9d3c84 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String name;
-  constructor get(core::String name) → self::A
+  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
+  constructor set(core::String* name) → self::A*
     : self::A::name = name, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect
index 1cfa044..5a455c3 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.outline.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String name;
-  constructor get(core::String name) → self::A
+  final field core::String* name;
+  constructor get(core::String* name) → self::A*
     ;
-  constructor set(core::String name) → self::A
+  constructor set(core::String* name) → self::A*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect
index 296b485..a9d3c84 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String name;
-  constructor get(core::String name) → self::A
+  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
+  constructor set(core::String* name) → self::A*
     : self::A::name = name, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32196.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32196.dart.strong.transformed.expect
index 296b485..a9d3c84 100644
--- a/pkg/front_end/testcases/regress/issue_32196.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32196.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  final field core::String name;
-  constructor get(core::String name) → self::A
+  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
+  constructor set(core::String* name) → self::A*
     : self::A::name = name, super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect
index 4e36d19..41bf04c 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.expect
@@ -13,11 +13,11 @@
 
 class Foo extends core::Object {
   field invalid-type self = null;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::Foo instance = new self::Foo::•();
+  self::Foo* instance = new self::Foo::•();
   instance.self = instance;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect
index 4e36d19..41bf04c 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.legacy.transformed.expect
@@ -13,11 +13,11 @@
 
 class Foo extends core::Object {
   field invalid-type self = null;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::Foo instance = new self::Foo::•();
+  self::Foo* instance = new self::Foo::•();
   instance.self = instance;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
index d111290..496a079 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.outline.expect
@@ -13,7 +13,7 @@
 
 class Foo extends core::Object {
   field invalid-type self;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
index 667cb8d..99cd03a 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.expect
@@ -13,11 +13,11 @@
 
 class Foo extends core::Object {
   field invalid-type self = null;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::Foo instance = new self::Foo::•();
+  self::Foo* instance = new self::Foo::•();
   instance.{self::Foo::self} = instance as{TypeError} invalid-type;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
index 667cb8d..99cd03a 100644
--- a/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32200.dart.strong.transformed.expect
@@ -13,11 +13,11 @@
 
 class Foo extends core::Object {
   field invalid-type self = null;
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::Foo instance = new self::Foo::•();
+  self::Foo* instance = new self::Foo::•();
   instance.{self::Foo::self} = instance as{TypeError} invalid-type;
 }
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect
index e4d64d6..a2e90b8 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.expect
@@ -26,47 +26,51 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::int x, {core::int y = null}) → dynamic
+  method foo(core::int* x, {core::int* y = #C1}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
+  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  abstract method foo(core::int x, {core::int y = null}) → dynamic;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  abstract method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print(i.namedArguments);
     return 42;
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::E e = new self::E::•();
+  self::C* c = new self::C::•();
+  self::E* e = new self::E::•();
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect
index e4d64d6..a2e90b8 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.legacy.transformed.expect
@@ -26,47 +26,51 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::int x, {core::int y = null}) → dynamic
+  method foo(core::int* x, {core::int* y = #C1}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
+  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  abstract method foo(core::int x, {core::int y = null}) → dynamic;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  abstract method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print(i.namedArguments);
     return 42;
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::E e = new self::E::•();
+  self::C* c = new self::C::•();
+  self::E* e = new self::E::•();
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
index 7b9f48b..6a0f6b8 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.outline.expect
@@ -26,35 +26,35 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     ;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method foo(core::int x, {core::int y}) → dynamic
+  method foo(core::int* x, {core::int* y}) → dynamic
     ;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method noSuchMethod(core::Invocation i) → dynamic
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
-  abstract forwarding-stub method foo(core::int x, {core::int y}) → dynamic;
+  abstract forwarding-stub method foo(core::int* x, {core::int* y}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  abstract method foo(core::int x, {core::int y}) → dynamic;
-  method noSuchMethod(core::Invocation i) → dynamic
+  abstract method foo(core::int* x, {core::int* y}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
index 73b1b6a..6827b4c 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.expect
@@ -26,47 +26,51 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::int x, {core::int y = null}) → dynamic
+  method foo(core::int* x, {core::int* y = #C1}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
+  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  abstract method foo(core::int x, {core::int y = null}) → dynamic;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  abstract method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print(i.{core::Invocation::namedArguments});
     return 42;
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::E e = new self::E::•();
+  self::C* c = new self::C::•();
+  self::E* e = new self::E::•();
+}
+
+constants  {
+  #C1 = null
 }
diff --git a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
index 73b1b6a..6827b4c 100644
--- a/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32660.dart.strong.transformed.expect
@@ -26,47 +26,51 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method foo(core::int x, {core::int y = null}) → dynamic
+  method foo(core::int* x, {core::int* y = #C1}) → dynamic
     return y;
 }
 class C extends self::A implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::A::•()
     ;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print("No such method!");
     return 42;
   }
-  abstract forwarding-stub method foo(core::int x, {core::int y = null}) → dynamic;
+  abstract forwarding-stub method foo(core::int* x, {core::int* y = #C1}) → dynamic;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-  method foo(core::int x) → dynamic
+  method foo(core::int* x) → dynamic
     return x;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  abstract method foo(core::int x, {core::int y = null}) → dynamic;
-  method noSuchMethod(core::Invocation i) → dynamic {
+  abstract method foo(core::int* x, {core::int* y = #C1}) → dynamic;
+  method noSuchMethod(core::Invocation* i) → dynamic {
     core::print(i.{core::Invocation::namedArguments});
     return 42;
   }
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
-  self::E e = new self::E::•();
+  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.legacy.expect b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.expect
index d112e29..fe7df5c 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.expect
@@ -27,32 +27,39 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
+  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 {
+  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic {
     core::print(i);
   }
 }
-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>
+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::•()
     ;
 }
-static method foo<X extends core::Object = dynamic>(self::foo::X i) → void {
+static method foo<X extends core::Object* = dynamic>(self::foo::X* i) → void {
   core::print(i);
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), core::List::unmodifiable<dynamic>(<dynamic>["hello world"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  self::foo<core::String>("hello world");
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::int, core::int]), core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  self::Foo::foo<core::int>(42);
-  self::Foo f = new self::Foo::•();
-  f.bar<core::double, core::double>(42.42);
-  f.bar<core::double>(42.42);
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  new self::Bar::•<core::String, core::String>();
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*, core::String*]), core::List::unmodifiable<dynamic>(<dynamic>["hello world"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  self::foo<core::String*>("hello world");
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::int*, core::int*]), core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  self::Foo::foo<core::int*>(42);
+  self::Foo* f = new self::Foo::•();
+  f.bar<core::double*, core::double*>(42.42);
+  f.bar<core::double*>(42.42);
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C4, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C2, core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  new self::Bar::•<core::String*, core::String*>();
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C2}
+  #C4 = #
 }
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect
index d112e29..fe7df5c 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.legacy.transformed.expect
@@ -27,32 +27,39 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
+  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 {
+  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic {
     core::print(i);
   }
 }
-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>
+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::•()
     ;
 }
-static method foo<X extends core::Object = dynamic>(self::foo::X i) → void {
+static method foo<X extends core::Object* = dynamic>(self::foo::X* i) → void {
   core::print(i);
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), core::List::unmodifiable<dynamic>(<dynamic>["hello world"]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  self::foo<core::String>("hello world");
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::int, core::int]), core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  self::Foo::foo<core::int>(42);
-  self::Foo f = new self::Foo::•();
-  f.bar<core::double, core::double>(42.42);
-  f.bar<core::double>(42.42);
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  new self::Bar::•<core::String, core::String>();
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*, core::String*]), core::List::unmodifiable<dynamic>(<dynamic>["hello world"]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  self::foo<core::String*>("hello world");
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::int*, core::int*]), core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  self::Foo::foo<core::int*>(42);
+  self::Foo* f = new self::Foo::•();
+  f.bar<core::double*, core::double*>(42.42);
+  f.bar<core::double*>(42.42);
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C4, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C2, core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+  new self::Bar::•<core::String*, core::String*>();
+}
+
+constants  {
+  #C1 = #foo
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C2}
+  #C4 = #
 }
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect b/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect
index c7e2e5d..34d6138 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
-  static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic
+  static method foo<X extends core::Object* = dynamic>(self::Foo::foo::X* i) → dynamic
     ;
-  method bar<X extends core::Object = dynamic>(self::Foo::bar::X i) → dynamic
+  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic
     ;
 }
-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>
+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*>*
     ;
 }
-static method foo<X extends core::Object = dynamic>(self::foo::X i) → void
+static method foo<X extends core::Object* = dynamic>(self::foo::X* i) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect b/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
index 28ddd81..98ebef5 100644
--- a/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_32972.dart.strong.expect
@@ -31,38 +31,38 @@
 import "dart:core" as core;
 
 class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : super core::Object::•()
     ;
-  static method foo<X extends core::Object = dynamic>(self::Foo::foo::X i) → dynamic {
+  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 {
+  method bar<X extends core::Object* = dynamic>(self::Foo::bar::X* i) → dynamic {
     core::print(i);
   }
 }
-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>
+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::•()
     ;
 }
-static method foo<X extends core::Object = dynamic>(self::foo::X i) → void {
+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");
+  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::•();
-  f.{self::Foo::bar}<core::double, core::double>(42.42);
-  f.{self::Foo::bar}<core::double>(42.42);
+  self::Foo::foo<core::int*>(42);
+  self::Foo* f = new self::Foo::•();
+  f.{self::Foo::bar}<core::double*, core::double*>(42.42);
+  f.{self::Foo::bar}<core::double*>(42.42);
   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>();
+  new self::Bar::•<core::String*, core::String*>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect
index 12ba7ad..e0113f6 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.expect
@@ -30,15 +30,24 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
+  constructor existingConstructor() → self::ExistingClass*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*, core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #ExistingClass.nonExistingConstructor
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #ExistingClass
+  #C6 = #NonExistingClass
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect
index 12ba7ad..e0113f6 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.legacy.transformed.expect
@@ -30,15 +30,24 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
+  constructor existingConstructor() → self::ExistingClass*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#ExistingClass.nonExistingConstructor, 32, core::List::unmodifiable<dynamic>(<core::Type>[core::String, core::String]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
-  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#NonExistingClass, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  dynamic x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C5, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[core::String*, core::String*]), #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+  x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C6, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #ExistingClass.nonExistingConstructor
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
+  #C5 = #ExistingClass
+  #C6 = #NonExistingClass
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
index c5db3ed7..1c7cc91 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
+  constructor existingConstructor() → self::ExistingClass*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
index ef7a4f5..8df228e 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
+  constructor existingConstructor() → self::ExistingClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
index ef7a4f5..8df228e 100644
--- a/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33452.dart.strong.transformed.expect
@@ -30,7 +30,7 @@
 import "dart:core" as core;
 
 class ExistingClass extends core::Object {
-  constructor existingConstructor() → self::ExistingClass
+  constructor existingConstructor() → self::ExistingClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect
index 4f58db1..e805d8f 100644
--- a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int count = 0;
+  core::int* count = 0;
   #L1:
-  for (core::int a = 0; a.<(10); a = a.+(1)) {
-    for (core::int b = 0; b.<(10); b = b.+(1)) {
+  for (core::int* a = 0; a.<(10); a = a.+(1)) {
+    for (core::int* b = 0; b.<(10); b = b.+(1)) {
       count = count.+(1);
       if(count.==(27))
         break #L1;
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect
index 4f58db1..e805d8f 100644
--- a/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.legacy.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int count = 0;
+  core::int* count = 0;
   #L1:
-  for (core::int a = 0; a.<(10); a = a.+(1)) {
-    for (core::int b = 0; b.<(10); b = b.+(1)) {
+  for (core::int* a = 0; a.<(10); a = a.+(1)) {
+    for (core::int* b = 0; b.<(10); b = b.+(1)) {
       count = count.+(1);
       if(count.==(27))
         break #L1;
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect b/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect
index 2a2bd06..e759d28 100644
--- a/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.strong.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int count = 0;
+  core::int* count = 0;
   #L1:
-  for (core::int a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
-    for (core::int b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
+  for (core::int* a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
+    for (core::int* b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
       count = count.{core::num::+}(1);
       if(count.{core::num::==}(27))
         break #L1;
diff --git a/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect
index 2a2bd06..e759d28 100644
--- a/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_33672.dart.strong.transformed.expect
@@ -3,10 +3,10 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int count = 0;
+  core::int* count = 0;
   #L1:
-  for (core::int a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
-    for (core::int b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
+  for (core::int* a = 0; a.{core::num::<}(10); a = a.{core::num::+}(1)) {
+    for (core::int* b = 0; b.{core::num::<}(10); b = b.{core::num::+}(1)) {
       count = count.{core::num::+}(1);
       if(count.{core::num::==}(27))
         break #L1;
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect
index 1b764c6..4e0472e 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect
index 1b764c6..4e0472e 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.legacy.transformed.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
index 5cfdb48..68a215f 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.outline.expect
@@ -14,13 +14,13 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   static set C(dynamic v) → void
     ;
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
   set D(dynamic v) → void
     ;
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
index 413e604..413bd07 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.expect
@@ -20,24 +20,24 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  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;
     ^";
-  self::D d = new self::D::•();
+  self::D* d = new self::D::•();
   d.{self::D::D} = 5;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
index 413e604..413bd07 100644
--- a/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34225.dart.strong.transformed.expect
@@ -20,24 +20,24 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set C(dynamic v) → void {}
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
   set D(dynamic v) → void {}
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  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;
     ^";
-  self::D d = new self::D::•();
+  self::D* d = new self::D::•();
   d.{self::D::D} = 5;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
index 16fd29e..80650e7 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.expect
@@ -6,11 +6,11 @@
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-static method foo() → iss::A {}
+static method foo() → iss::A* {}
 static method main() → dynamic {}
 
 library;
@@ -18,7 +18,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → iss::A
+  synthetic constructor •() → iss::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
index 16fd29e..80650e7 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.legacy.transformed.expect
@@ -6,11 +6,11 @@
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-static method foo() → iss::A {}
+static method foo() → iss::A* {}
 static method main() → dynamic {}
 
 library;
@@ -18,7 +18,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → iss::A
+  synthetic constructor •() → iss::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
index 7e0d3a3..40c4590 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.outline.expect
@@ -6,10 +6,10 @@
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
-static method foo() → iss::A
+static method foo() → iss::A*
   ;
 static method main() → dynamic
   ;
@@ -19,6 +19,6 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → iss::A
+  synthetic constructor •() → iss::A*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
index 1fe88d2..e44ce2d 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.strong.expect
@@ -12,7 +12,7 @@
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -24,7 +24,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self2::A
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
index 1fe88d2..e44ce2d 100644
--- a/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34291.dart.strong.transformed.expect
@@ -12,7 +12,7 @@
 import "org-dartlang-testcase:///issue_34291_lib.dart" as lib;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
@@ -24,7 +24,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self2::A
+  synthetic constructor •() → self2::A*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
index 6411f4c..d01627e 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.expect
@@ -88,62 +88,62 @@
 
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic c1 = new self::C::bar<core::int>();
+  dynamic c1 = new self::C::bar<core::int*>();
   c1.toString();
-  dynamic c2 = new self::C::bar<core::int>();
+  dynamic c2 = new self::C::bar<core::int*>();
   c2.toString();
-  dynamic c3 = new self::C::bar<core::String>();
+  dynamic c3 = new self::C::bar<core::String*>();
   c3.toString();
-  dynamic c4 = new self::C::bar<core::String>();
+  dynamic c4 = new self::C::bar<core::String*>();
   c4.toString();
-  const dynamic d1 = const self::D::foo<core::int>();
-  d1.toString();
-  const dynamic d2 = const self::D::foo<core::int>();
-  d2.toString();
-  const dynamic d3 = const self::D::foo<core::String>();
-  d3.toString();
-  const dynamic d4 = const self::D::foo<core::String>();
-  d4.toString();
-  dynamic e1 = new iss::E::bar<core::int>();
+  (#C1).toString();
+  (#C1).toString();
+  (#C2).toString();
+  (#C2).toString();
+  dynamic e1 = new iss::E::bar<core::int*>();
   e1.toString();
   dynamic e2 = new iss::E::bar<dynamic>();
   e2.toString();
-  dynamic e3 = new iss::E::bar<core::String>();
+  dynamic e3 = new iss::E::bar<core::String*>();
   e3.toString();
-  dynamic e4 = new iss::E::bar<core::String>();
+  dynamic e4 = new iss::E::bar<core::String*>();
   e4.toString();
-  const dynamic f1 = const iss::F::foo<core::int>();
-  f1.toString();
-  const dynamic f2 = const iss::F::foo<dynamic>();
-  f2.toString();
-  const dynamic f3 = const iss::F::foo<core::String>();
-  f3.toString();
-  const dynamic f4 = const iss::F::foo<core::String>();
-  f4.toString();
+  (#C3).toString();
+  (#C4).toString();
+  (#C5).toString();
+  (#C5).toString();
 }
 
 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>
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → iss::E<iss::E::T*>*
     : super core::Object::•()
     ;
 }
-class F<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → iss::F<iss::F::T>
+class F<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → iss::F<iss::F::T*>*
     : super core::Object::•()
     ;
 }
+
+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*> {}
+}
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
index 6411f4c..d01627e 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.legacy.transformed.expect
@@ -88,62 +88,62 @@
 
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  dynamic c1 = new self::C::bar<core::int>();
+  dynamic c1 = new self::C::bar<core::int*>();
   c1.toString();
-  dynamic c2 = new self::C::bar<core::int>();
+  dynamic c2 = new self::C::bar<core::int*>();
   c2.toString();
-  dynamic c3 = new self::C::bar<core::String>();
+  dynamic c3 = new self::C::bar<core::String*>();
   c3.toString();
-  dynamic c4 = new self::C::bar<core::String>();
+  dynamic c4 = new self::C::bar<core::String*>();
   c4.toString();
-  const dynamic d1 = const self::D::foo<core::int>();
-  d1.toString();
-  const dynamic d2 = const self::D::foo<core::int>();
-  d2.toString();
-  const dynamic d3 = const self::D::foo<core::String>();
-  d3.toString();
-  const dynamic d4 = const self::D::foo<core::String>();
-  d4.toString();
-  dynamic e1 = new iss::E::bar<core::int>();
+  (#C1).toString();
+  (#C1).toString();
+  (#C2).toString();
+  (#C2).toString();
+  dynamic e1 = new iss::E::bar<core::int*>();
   e1.toString();
   dynamic e2 = new iss::E::bar<dynamic>();
   e2.toString();
-  dynamic e3 = new iss::E::bar<core::String>();
+  dynamic e3 = new iss::E::bar<core::String*>();
   e3.toString();
-  dynamic e4 = new iss::E::bar<core::String>();
+  dynamic e4 = new iss::E::bar<core::String*>();
   e4.toString();
-  const dynamic f1 = const iss::F::foo<core::int>();
-  f1.toString();
-  const dynamic f2 = const iss::F::foo<dynamic>();
-  f2.toString();
-  const dynamic f3 = const iss::F::foo<core::String>();
-  f3.toString();
-  const dynamic f4 = const iss::F::foo<core::String>();
-  f4.toString();
+  (#C3).toString();
+  (#C4).toString();
+  (#C5).toString();
+  (#C5).toString();
 }
 
 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>
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → iss::E<iss::E::T*>*
     : super core::Object::•()
     ;
 }
-class F<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → iss::F<iss::F::T>
+class F<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → iss::F<iss::F::T*>*
     : super core::Object::•()
     ;
 }
+
+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*> {}
+}
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34403.dart.outline.expect
index e33bf06..0983f99 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.outline.expect
@@ -4,12 +4,13 @@
 
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
     ;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self::D<self::D::T*>*
+    : super core::Object::•()
     ;
 }
 static method main() → dynamic
@@ -19,11 +20,12 @@
 import self as self2;
 import "dart:core" as core;
 
-class E<T extends core::Object = dynamic> extends core::Object {
-  constructor bar() → self2::E<self2::E::T>
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self2::E<self2::E::T*>*
     ;
 }
-class F<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self2::F<self2::F::T>
+class F<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self2::F<self2::F::T*>*
+    : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
index ae029a9..cd83b08 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.strong.expect
@@ -88,62 +88,62 @@
 
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> c1 = new self::C::bar<core::int>();
+  self::C<core::int*>* c1 = new self::C::bar<core::int*>();
   c1.{core::Object::toString}();
-  self::C<core::int> c2 = new self::C::bar<core::int>();
+  self::C<core::int*>* c2 = new self::C::bar<core::int*>();
   c2.{core::Object::toString}();
-  self::C<core::String> c3 = new self::C::bar<core::String>();
+  self::C<core::String*>* c3 = new self::C::bar<core::String*>();
   c3.{core::Object::toString}();
-  self::C<core::String> c4 = new self::C::bar<core::String>();
+  self::C<core::String*>* c4 = new self::C::bar<core::String*>();
   c4.{core::Object::toString}();
-  const self::D<core::int> d1 = const self::D::foo<core::int>();
-  d1.{core::Object::toString}();
-  const self::D<core::int> d2 = const self::D::foo<core::int>();
-  d2.{core::Object::toString}();
-  const self::D<core::String> d3 = const self::D::foo<core::String>();
-  d3.{core::Object::toString}();
-  const self::D<core::String> d4 = const self::D::foo<core::String>();
-  d4.{core::Object::toString}();
-  iss::E<core::int> e1 = new iss::E::bar<core::int>();
+  (#C1).{core::Object::toString}();
+  (#C1).{core::Object::toString}();
+  (#C2).{core::Object::toString}();
+  (#C2).{core::Object::toString}();
+  iss::E<core::int*>* e1 = new iss::E::bar<core::int*>();
   e1.{core::Object::toString}();
-  iss::E<dynamic> e2 = new iss::E::bar<dynamic>();
+  iss::E<dynamic>* e2 = new iss::E::bar<dynamic>();
   e2.{core::Object::toString}();
-  iss::E<core::String> e3 = new iss::E::bar<core::String>();
+  iss::E<core::String*>* e3 = new iss::E::bar<core::String*>();
   e3.{core::Object::toString}();
-  iss::E<core::String> e4 = new iss::E::bar<core::String>();
+  iss::E<core::String*>* e4 = new iss::E::bar<core::String*>();
   e4.{core::Object::toString}();
-  const iss::F<core::int> f1 = const iss::F::foo<core::int>();
-  f1.{core::Object::toString}();
-  const iss::F<dynamic> f2 = const iss::F::foo<dynamic>();
-  f2.{core::Object::toString}();
-  const iss::F<core::String> f3 = const iss::F::foo<core::String>();
-  f3.{core::Object::toString}();
-  const iss::F<core::String> f4 = const iss::F::foo<core::String>();
-  f4.{core::Object::toString}();
+  (#C3).{core::Object::toString}();
+  (#C4).{core::Object::toString}();
+  (#C5).{core::Object::toString}();
+  (#C5).{core::Object::toString}();
 }
 
 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>
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → iss::E<iss::E::T*>*
     : super core::Object::•()
     ;
 }
-class F<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → iss::F<iss::F::T>
+class F<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → iss::F<iss::F::T*>*
     : super core::Object::•()
     ;
 }
+
+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*> {}
+}
diff --git a/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
index ae029a9..cd83b08 100644
--- a/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34403.dart.strong.transformed.expect
@@ -88,62 +88,62 @@
 
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C<core::int> c1 = new self::C::bar<core::int>();
+  self::C<core::int*>* c1 = new self::C::bar<core::int*>();
   c1.{core::Object::toString}();
-  self::C<core::int> c2 = new self::C::bar<core::int>();
+  self::C<core::int*>* c2 = new self::C::bar<core::int*>();
   c2.{core::Object::toString}();
-  self::C<core::String> c3 = new self::C::bar<core::String>();
+  self::C<core::String*>* c3 = new self::C::bar<core::String*>();
   c3.{core::Object::toString}();
-  self::C<core::String> c4 = new self::C::bar<core::String>();
+  self::C<core::String*>* c4 = new self::C::bar<core::String*>();
   c4.{core::Object::toString}();
-  const self::D<core::int> d1 = const self::D::foo<core::int>();
-  d1.{core::Object::toString}();
-  const self::D<core::int> d2 = const self::D::foo<core::int>();
-  d2.{core::Object::toString}();
-  const self::D<core::String> d3 = const self::D::foo<core::String>();
-  d3.{core::Object::toString}();
-  const self::D<core::String> d4 = const self::D::foo<core::String>();
-  d4.{core::Object::toString}();
-  iss::E<core::int> e1 = new iss::E::bar<core::int>();
+  (#C1).{core::Object::toString}();
+  (#C1).{core::Object::toString}();
+  (#C2).{core::Object::toString}();
+  (#C2).{core::Object::toString}();
+  iss::E<core::int*>* e1 = new iss::E::bar<core::int*>();
   e1.{core::Object::toString}();
-  iss::E<dynamic> e2 = new iss::E::bar<dynamic>();
+  iss::E<dynamic>* e2 = new iss::E::bar<dynamic>();
   e2.{core::Object::toString}();
-  iss::E<core::String> e3 = new iss::E::bar<core::String>();
+  iss::E<core::String*>* e3 = new iss::E::bar<core::String*>();
   e3.{core::Object::toString}();
-  iss::E<core::String> e4 = new iss::E::bar<core::String>();
+  iss::E<core::String*>* e4 = new iss::E::bar<core::String*>();
   e4.{core::Object::toString}();
-  const iss::F<core::int> f1 = const iss::F::foo<core::int>();
-  f1.{core::Object::toString}();
-  const iss::F<dynamic> f2 = const iss::F::foo<dynamic>();
-  f2.{core::Object::toString}();
-  const iss::F<core::String> f3 = const iss::F::foo<core::String>();
-  f3.{core::Object::toString}();
-  const iss::F<core::String> f4 = const iss::F::foo<core::String>();
-  f4.{core::Object::toString}();
+  (#C3).{core::Object::toString}();
+  (#C4).{core::Object::toString}();
+  (#C5).{core::Object::toString}();
+  (#C5).{core::Object::toString}();
 }
 
 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>
+class E<T extends core::Object* = dynamic> extends core::Object {
+  constructor bar() → iss::E<iss::E::T*>*
     : super core::Object::•()
     ;
 }
-class F<T extends core::Object = dynamic> extends core::Object {
-  const constructor foo() → iss::F<iss::F::T>
+class F<T extends core::Object* = dynamic> extends core::Object {
+  const constructor foo() → iss::F<iss::F::T*>*
     : super core::Object::•()
     ;
 }
+
+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*> {}
+}
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect
index 0922a4f..6418917 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.expect
@@ -28,7 +28,7 @@
 import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get lib() → invalid-type
@@ -37,17 +37,17 @@
   method bar() → invalid-type {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method foo() → invalid-type {}
 }
-static final field self::A a = null;
+static final field self::A* a = null;
 static method main() → dynamic {}
 
 library;
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class MyClass extends core::Object {
-  synthetic constructor •() → self2::MyClass
+  synthetic constructor •() → self2::MyClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect
index 0922a4f..6418917 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.legacy.transformed.expect
@@ -28,7 +28,7 @@
 import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get lib() → invalid-type
@@ -37,17 +37,17 @@
   method bar() → invalid-type {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method foo() → invalid-type {}
 }
-static final field self::A a = null;
+static final field self::A* a = null;
 static method main() → dynamic {}
 
 library;
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class MyClass extends core::Object {
-  synthetic constructor •() → self2::MyClass
+  synthetic constructor •() → self2::MyClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
index 9a8a1f8..da300e9 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.outline.expect
@@ -28,7 +28,7 @@
 import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   get lib() → invalid-type
     ;
@@ -38,16 +38,16 @@
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
   method foo() → invalid-type
     ;
 }
-static final field self::A a;
+static final field self::A* a;
 static method main() → dynamic
   ;
 
@@ -56,6 +56,6 @@
 import "dart:core" as core;
 
 class MyClass extends core::Object {
-  synthetic constructor •() → self2::MyClass
+  synthetic constructor •() → self2::MyClass*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34498.dart.strong.expect
index a72249c..0393f5f 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.strong.expect
@@ -28,7 +28,7 @@
 import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get lib() → invalid-type
@@ -37,17 +37,17 @@
   method bar() → invalid-type {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method foo() → invalid-type {}
 }
-static final field self::A a = null;
+static final field self::A* a = null;
 static method main() → dynamic {}
 
 library;
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class MyClass extends core::Object {
-  synthetic constructor •() → self2::MyClass
+  synthetic constructor •() → self2::MyClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34498.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34498.dart.strong.transformed.expect
index a72249c..0393f5f 100644
--- a/pkg/front_end/testcases/regress/issue_34498.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34498.dart.strong.transformed.expect
@@ -28,7 +28,7 @@
 import "org-dartlang-testcase:///issue_34498_lib.dart" as lib;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get lib() → invalid-type
@@ -37,17 +37,17 @@
   method bar() → invalid-type {}
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
   method foo() → invalid-type {}
 }
-static final field self::A a = null;
+static final field self::A* a = null;
 static method main() → dynamic {}
 
 library;
@@ -55,7 +55,7 @@
 import "dart:core" as core;
 
 class MyClass extends core::Object {
-  synthetic constructor •() → self2::MyClass
+  synthetic constructor •() → self2::MyClass*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect
index d287b8c..9c7a765 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.expect
@@ -22,7 +22,7 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  get m() → core::int
+  get m() → core::int*
     return 1;
 }
 abstract class M2 extends core::Object {
@@ -30,19 +30,19 @@
 abstract class M3 extends core::Object {
 }
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get c() → core::int
+  get c() → core::int*
     return 2;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect
index d287b8c..9c7a765 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.legacy.transformed.expect
@@ -22,7 +22,7 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  get m() → core::int
+  get m() → core::int*
     return 1;
 }
 abstract class M2 extends core::Object {
@@ -30,19 +30,19 @@
 abstract class M3 extends core::Object {
 }
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get c() → core::int
+  get c() → core::int*
     return 2;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
index 7e6e9d9..1988ac5 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.outline.expect
@@ -22,7 +22,7 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  get m() → core::int
+  get m() → core::int*
     ;
 }
 abstract class M2 extends core::Object {
@@ -30,17 +30,17 @@
 abstract class M3 extends core::Object {
 }
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     ;
-  get c() → core::int
+  get c() → core::int*
     ;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
index a1ba851..4410636 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  get m() → core::int
+  get m() → core::int*
     return 1;
 }
 abstract class M2 extends core::Object {
@@ -54,24 +54,24 @@
 abstract class M3 extends core::Object {
 }
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get c() → core::int
+  get c() → core::int*
     return 2;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C2 c2 = new self::C2::•();
+  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'.
@@ -81,7 +81,7 @@
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c2.m + c2.c;
             ^");
-  self::C3 c3 = new self::C3::•();
+  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'.
diff --git a/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
index a1ba851..4410636 100644
--- a/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34563.dart.strong.transformed.expect
@@ -46,7 +46,7 @@
 import "dart:core" as core;
 
 abstract class M1 extends core::Object {
-  get m() → core::int
+  get m() → core::int*
     return 1;
 }
 abstract class M2 extends core::Object {
@@ -54,24 +54,24 @@
 abstract class M3 extends core::Object {
 }
 class C1 extends core::Object {
-  synthetic constructor •() → self::C1
+  synthetic constructor •() → self::C1*
     : super core::Object::•()
     ;
-  get c() → core::int
+  get c() → core::int*
     return 2;
 }
 class C2 extends core::Object {
-  synthetic constructor •() → self::C2
+  synthetic constructor •() → self::C2*
     : super core::Object::•()
     ;
 }
 class C3 extends core::Object {
-  synthetic constructor •() → self::C3
+  synthetic constructor •() → self::C3*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C2 c2 = new self::C2::•();
+  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'.
@@ -81,7 +81,7 @@
 Try correcting the name to the name of an existing getter, or defining a getter or field named 'c'.
   c2.m + c2.c;
             ^");
-  self::C3 c3 = new self::C3::•();
+  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'.
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect
index 6a16c4e..719513c 100644
--- a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.expect
@@ -38,7 +38,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {}
@@ -48,14 +48,14 @@
     return 1;
 }
 class B extends core::Object {
-  constructor named() → self::B
+  constructor named() → self::B*
     : super core::Object::•()
     ;
   get bar() → dynamic
     return 1;
 }
 class C extends core::Object {
-  constructor named() → self::C
+  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.
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect
index 6a16c4e..719513c 100644
--- a/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.legacy.transformed.expect
@@ -38,7 +38,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {}
@@ -48,14 +48,14 @@
     return 1;
 }
 class B extends core::Object {
-  constructor named() → self::B
+  constructor named() → self::B*
     : super core::Object::•()
     ;
   get bar() → dynamic
     return 1;
 }
 class C extends core::Object {
-  constructor named() → self::C
+  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.
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect
index 6f92c1f..9315b49 100644
--- a/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.outline.expect
@@ -33,7 +33,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
   get A() → dynamic
     ;
@@ -43,13 +43,13 @@
     ;
 }
 class B extends core::Object {
-  constructor named() → self::B
+  constructor named() → self::B*
     ;
   get bar() → dynamic
     ;
 }
 class C extends core::Object {
-  constructor named() → self::C
+  constructor named() → self::C*
     ;
   get bar() → dynamic
     ;
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect
index c127bbc..5ab44b7 100644
--- a/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.strong.expect
@@ -38,7 +38,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {}
@@ -48,14 +48,14 @@
     return 1;
 }
 class B extends core::Object {
-  constructor named() → self::B
+  constructor named() → self::B*
     : super core::Object::•()
     ;
   get bar() → dynamic
     return 1;
 }
 class C extends core::Object {
-  constructor named() → self::C
+  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.
diff --git a/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect
index c127bbc..5ab44b7 100644
--- a/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34610.dart.strong.transformed.expect
@@ -38,7 +38,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   get A() → dynamic {}
@@ -48,14 +48,14 @@
     return 1;
 }
 class B extends core::Object {
-  constructor named() → self::B
+  constructor named() → self::B*
     : super core::Object::•()
     ;
   get bar() → dynamic
     return 1;
 }
 class C extends core::Object {
-  constructor named() → self::C
+  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.
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect
index 702299b..8610e2f 100644
--- a/pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.expect
@@ -19,7 +19,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect
index 702299b..8610e2f 100644
--- a/pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.legacy.transformed.expect
@@ -19,7 +19,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect
index 2b58976..ec6bce3 100644
--- a/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.outline.expect
@@ -19,7 +19,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34614.dart.strong.expect
index a8a4eff..37cd370 100644
--- a/pkg/front_end/testcases/regress/issue_34614.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.strong.expect
@@ -19,11 +19,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.{core::Object::toString}();
 }
diff --git a/pkg/front_end/testcases/regress/issue_34614.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34614.dart.strong.transformed.expect
index a8a4eff..37cd370 100644
--- a/pkg/front_end/testcases/regress/issue_34614.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34614.dart.strong.transformed.expect
@@ -19,11 +19,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.{core::Object::toString}();
 }
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect
index 477d5fd..b757c0e 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.expect
@@ -48,7 +48,7 @@
 static method f1() → invalid-type {
   return null;
 }
-static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method Future<List extends core::Object* = dynamic>() → invalid-type {}
 static method f2() → dynamic async 
   return null;
 static method f3() → invalid-type async {
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect
index e3ef37d..e483173 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.legacy.transformed.expect
@@ -49,10 +49,10 @@
 static method f1() → invalid-type {
   return null;
 }
-static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method Future<List extends core::Object* = dynamic>() → invalid-type {}
 static method f2() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -78,8 +78,8 @@
   return :async_completer.{asy::Completer::future};
 }
 static method f3() → invalid-type /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -105,8 +105,8 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
index d7332cd..8f7f0f5 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.outline.expect
@@ -47,7 +47,7 @@
 
 static method f1() → invalid-type
   ;
-static method Future<List extends core::Object = dynamic>() → invalid-type
+static method Future<List extends core::Object* = dynamic>() → invalid-type
   ;
 static method f2() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect b/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect
index f79536d..356eb8e 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.strong.expect
@@ -60,7 +60,7 @@
 static method f1() → invalid-type {
   return null;
 }
-static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method Future<List extends core::Object* = dynamic>() → invalid-type {}
 static method f2() → dynamic async 
   return null;
 static method f3() → invalid-type async {
diff --git a/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
index b0cda7b..26c459c 100644
--- a/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_34850.dart.strong.transformed.expect
@@ -61,10 +61,10 @@
 static method f1() → invalid-type {
   return null;
 }
-static method Future<List extends core::Object = dynamic>() → invalid-type {}
+static method Future<List extends core::Object* = dynamic>() → invalid-type {}
 static method f2() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -90,8 +90,8 @@
   return :async_completer.{asy::Completer::future};
 }
 static method f3() → invalid-type /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -117,8 +117,8 @@
   return :async_completer.{asy::Completer::future};
 }
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect
index 29b35f0..7402261 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.expect
@@ -20,13 +20,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int a = null;
-  synthetic constructor •() → self::A
+  field core::int* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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;
@@ -34,7 +34,7 @@
     ;
 }
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect
index 29b35f0..7402261 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.legacy.transformed.expect
@@ -20,13 +20,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int a = null;
-  synthetic constructor •() → self::A
+  field core::int* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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;
@@ -34,7 +34,7 @@
     ;
 }
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
index 314a508..fc08a34 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.outline.expect
@@ -11,16 +11,16 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int a;
-  synthetic constructor •() → self::A
+  field core::int* a;
+  synthetic constructor •() → self::A*
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  constructor •() → self::B*
     ;
 }
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
index b8a15c7..38d2b3a 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.expect
@@ -20,13 +20,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int a = null;
-  synthetic constructor •() → self::A
+  field core::int* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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;
@@ -34,7 +34,7 @@
     ;
 }
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
@@ -42,12 +42,12 @@
 }
 static method main() → dynamic {
   try {
-    self::B b = new self::B::•();
+    self::B* b = new self::B::•();
   }
   on dynamic catch(final dynamic _) {
   }
   try {
-    self::C c = new self::C::•();
+    self::C* c = new self::C::•();
   }
   on dynamic catch(final dynamic _) {
   }
diff --git a/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
index b8a15c7..38d2b3a 100644
--- a/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35151.dart.strong.transformed.expect
@@ -20,13 +20,13 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  field core::int a = null;
-  synthetic constructor •() → self::A
+  field core::int* a = null;
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  constructor •() → self::B
+  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;
@@ -34,7 +34,7 @@
     ;
 }
 class C extends core::Object {
-  constructor •() → self::C
+  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;
         ^^^^^"
@@ -42,12 +42,12 @@
 }
 static method main() → dynamic {
   try {
-    self::B b = new self::B::•();
+    self::B* b = new self::B::•();
   }
   on dynamic catch(final dynamic _) {
   }
   try {
-    self::C c = new self::C::•();
+    self::C* c = new self::C::•();
   }
   on dynamic catch(final dynamic _) {
   }
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect
index 7e392f3..74f9a1f 100644
--- a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → dynamic f;
-  f.call().call<core::int>();
+  () →* dynamic f;
+  f.call().call<core::int*>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect
index 7e392f3..74f9a1f 100644
--- a/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.legacy.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → dynamic f;
-  f.call().call<core::int>();
+  () →* dynamic f;
+  f.call().call<core::int*>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect
index 7e392f3..74f9a1f 100644
--- a/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.strong.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → dynamic f;
-  f.call().call<core::int>();
+  () →* dynamic f;
+  f.call().call<core::int*>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect
index 7e392f3..74f9a1f 100644
--- a/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35177.dart.strong.transformed.expect
@@ -3,6 +3,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  () → dynamic f;
-  f.call().call<core::int>();
+  () →* dynamic f;
+  f.call().call<core::int*>();
 }
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect
index 59d39ba..e97491d 100644
--- a/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::int a, core::int b) → dynamic {}
+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_35213.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect
index 59d39ba..e97491d 100644
--- a/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.legacy.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::int a, core::int b) → dynamic {}
+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_35213.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect
index 27fe4c0..0a51465 100644
--- a/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.outline.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::int a, core::int b) → dynamic
+static method f(core::int* a, core::int* b) → dynamic
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect
index 59d39ba..e97491d 100644
--- a/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.strong.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::int a, core::int b) → dynamic {}
+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_35213.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect
index 59d39ba..e97491d 100644
--- a/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35213.dart.strong.transformed.expect
@@ -9,7 +9,7 @@
 import self as self;
 import "dart:core" as core;
 
-static method f(core::int a, core::int b) → dynamic {}
+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_35258.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect
index f3cf819..c371025 100644
--- a/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.expect
@@ -23,9 +23,16 @@
 
 class C extends core::Object {
   final field dynamic d = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #C
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect
index f3cf819..c371025 100644
--- a/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.legacy.transformed.expect
@@ -23,9 +23,16 @@
 
 class C extends core::Object {
   final field dynamic d = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C, 32, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, core::List::unmodifiable<dynamic>(<dynamic>[42]), core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #C
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect
index 1d44eb7..e41d391 100644
--- a/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.outline.expect
@@ -14,7 +14,7 @@
 
 class C extends core::Object {
   final field dynamic d;
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect
index cd8f0cb..9248a5a 100644
--- a/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.strong.expect
@@ -23,7 +23,7 @@
 
 class C extends core::Object {
   final field dynamic d = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect
index cd8f0cb..9248a5a 100644
--- a/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35258.dart.strong.transformed.expect
@@ -23,7 +23,7 @@
 
 class C extends core::Object {
   final field dynamic d = null;
-  constructor •() → self::C
+  constructor •() → self::C*
     : super core::Object::•() {}
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect
index 0360cf4..55a5f23 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.expect
@@ -34,9 +34,16 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
 }
 static method main() → dynamic {
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+}
+
+constants  {
+  #C1 = #Supertype
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect
index 0360cf4..55a5f23 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.legacy.transformed.expect
@@ -34,9 +34,16 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
 }
 static method main() → dynamic {
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4))));
+}
+
+constants  {
+  #C1 = #Supertype
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
index 7137976..67e0fdb 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.outline.expect
@@ -30,7 +30,7 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect
index f3d633c..56694a5 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.strong.expect
@@ -34,7 +34,7 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = "Unresolved" in invalid-expression;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect
index 6b7b15d..3d6ee63 100644
--- a/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35259.dart.strong.transformed.expect
@@ -34,8 +34,8 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
-    let core::String #redirecting_factory = "Unresolved" in invalid-expression;
+  static factory •() → self::Supertype*
+    let core::String* #redirecting_factory = "Unresolved" in invalid-expression;
 }
 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.
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect
index 381ea3c..ca20b94 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.expect
@@ -18,14 +18,21 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = self::X::• in invalid-expression;
 }
 class X extends core::Object implements self::Supertype {
-  constructor •() → self::X
+  constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::X x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  self::X* x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #Supertype
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect
index 381ea3c..ca20b94 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.legacy.transformed.expect
@@ -18,14 +18,21 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = self::X::• in invalid-expression;
 }
 class X extends core::Object implements self::Supertype {
-  constructor •() → self::X
+  constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  self::X x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#Supertype, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  self::X* x = throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, #C2, #C3, core::Map::unmodifiable<core::Symbol*, dynamic>(#C4)));
+}
+
+constants  {
+  #C1 = #Supertype
+  #C2 = <core::Type*>[]
+  #C3 = <dynamic>[]
+  #C4 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C3}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect
index a489ec3..1595524 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.outline.expect
@@ -14,11 +14,11 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = self::X::• in invalid-expression;
 }
 class X extends core::Object implements self::Supertype {
-  constructor •() → self::X
+  constructor •() → self::X*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect
index d65aef7..d7c940a 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.strong.expect
@@ -18,16 +18,16 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let dynamic #redirecting_factory = self::X::• in invalid-expression;
 }
 class X extends core::Object implements self::Supertype {
-  constructor •() → self::X
+  constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 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.
+  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();
-            ^" as{TypeError} self::X;
+            ^" as{TypeError} self::X*;
 }
diff --git a/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect
index bedcb24..a5bb9cf 100644
--- a/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35260.dart.strong.transformed.expect
@@ -18,16 +18,16 @@
 
 class Supertype extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::Supertype::•];
-  static factory •() → self::Supertype
+  static factory •() → self::Supertype*
     let<BottomType> #redirecting_factory = self::X::• in invalid-expression;
 }
 class X extends core::Object implements self::Supertype {
-  constructor •() → self::X
+  constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 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.
+  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();
-            ^" as{TypeError} self::X;
+            ^" as{TypeError} self::X*;
 }
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect
index 7821553..056241c 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.expect
@@ -20,22 +20,28 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
   static field dynamic _redirecting# = <dynamic>[self::B::foo];
-  constructor •() → self::B<self::B::T>
+  constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
-  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
 }
-class C<K extends core::Object = dynamic> extends core::Object {
+class C<K extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C<self::C::K>
+  constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
-  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
     let dynamic #redirecting_factory = "B.foo" in invalid-expression;
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#B.foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[dynamic]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[dynamic]), #C2, core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+}
+
+constants  {
+  #C1 = #B.foo
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C2}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect
index 7821553..056241c 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.legacy.transformed.expect
@@ -20,22 +20,28 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
   static field dynamic _redirecting# = <dynamic>[self::B::foo];
-  constructor •() → self::B<self::B::T>
+  constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
-  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
 }
-class C<K extends core::Object = dynamic> extends core::Object {
+class C<K extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C<self::C::K>
+  constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
-  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
     let dynamic #redirecting_factory = "B.foo" in invalid-expression;
 }
 static method main() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#B.foo, 32, core::List::unmodifiable<dynamic>(<core::Type>[dynamic]), const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{})));
+  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#C1, 32, core::List::unmodifiable<dynamic>(<core::Type*>[dynamic]), #C2, core::Map::unmodifiable<core::Symbol*, dynamic>(#C3)));
+}
+
+constants  {
+  #C1 = #B.foo
+  #C2 = <dynamic>[]
+  #C3 = core::_ImmutableMap<core::Symbol*, dynamic> {_kvPairs:#C2}
 }
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect b/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect
index 1ea14fd..1c17a6b 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.outline.expect
@@ -16,18 +16,18 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
   static field dynamic _redirecting# = <dynamic>[self::B::foo];
-  constructor •() → self::B<self::B::T>
+  constructor •() → self::B<self::B::T*>*
     ;
-  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
 }
-class C<K extends core::Object = dynamic> extends core::Object {
+class C<K extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C<self::C::K>
+  constructor •() → self::C<self::C::K*>*
     ;
-  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
     let dynamic #redirecting_factory = "B.foo" in invalid-expression;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect
index edf8e9a..6a17040 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.strong.expect
@@ -20,20 +20,20 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
   static field dynamic _redirecting# = <dynamic>[self::B::foo];
-  constructor •() → self::B<self::B::T>
+  constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
-  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
-    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    let dynamic #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
 }
-class C<K extends core::Object = dynamic> extends core::Object {
+class C<K extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C<self::C::K>
+  constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
-  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
     let dynamic #redirecting_factory = "B.foo" in invalid-expression;
 }
 static method main() → dynamic {
diff --git a/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect
index 82b4544..1ec6209 100644
--- a/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35266.dart.strong.transformed.expect
@@ -20,21 +20,21 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends self::C<self::B::T> {
+class B<T extends core::Object* = dynamic> extends self::C<self::B::T*> {
   static field dynamic _redirecting# = <dynamic>[self::B::foo];
-  constructor •() → self::B<self::B::T>
+  constructor •() → self::B<self::B::T*>*
     : super self::C::•()
     ;
-  static factory foo<T extends core::Object = dynamic>() → self::B<self::B::foo::T>
-    let<BottomType> #redirecting_factory = self::B::• in let self::B::foo::T #typeArg0 = null in invalid-expression;
+  static factory foo<T extends core::Object* = dynamic>() → self::B<self::B::foo::T*>*
+    let<BottomType> #redirecting_factory = self::B::• in let self::B::foo::T* #typeArg0 = null in invalid-expression;
 }
-class C<K extends core::Object = dynamic> extends core::Object {
+class C<K extends core::Object* = dynamic> extends core::Object {
   static field dynamic _redirecting# = <dynamic>[self::C::bar];
-  constructor •() → self::C<self::C::K>
+  constructor •() → self::C<self::C::K*>*
     : super core::Object::•()
     ;
-  static factory bar<K extends core::Object = dynamic>() → self::C<self::C::bar::K>
-    let core::String #redirecting_factory = "B.foo" in invalid-expression;
+  static factory bar<K extends core::Object* = dynamic>() → self::C<self::C::bar::K*>*
+    let core::String* #redirecting_factory = "B.foo" in invalid-expression;
 }
 static method main() → dynamic {
   invalid-expression "pkg/front_end/testcases/regress/issue_35266.dart:13:11: Error: Method not found: 'B.foo'.
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect
index 34c8236..c6fc9e6 100644
--- a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.expect
@@ -24,6 +24,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x;
+  core::int* x;
   core::print("${x}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect
index 34c8236..c6fc9e6 100644
--- a/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.legacy.transformed.expect
@@ -24,6 +24,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x;
+  core::int* x;
   core::print("${x}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect b/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect
index 34c8236..c6fc9e6 100644
--- a/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.strong.expect
@@ -24,6 +24,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x;
+  core::int* x;
   core::print("${x}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect
index 34c8236..c6fc9e6 100644
--- a/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_35900.dart.strong.transformed.expect
@@ -24,6 +24,6 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::int x;
+  core::int* x;
   core::print("${x}");
 }
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_36400.dart.legacy.expect
index e63b720..5e6fa5b 100644
--- a/pkg/front_end/testcases/regress/issue_36400.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.legacy.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class Test extends core::Object {
-  static factory •() → self::Test {
+  static factory •() → self::Test* {
     return null;
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect
index e63b720..5e6fa5b 100644
--- a/pkg/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.legacy.transformed.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class Test extends core::Object {
-  static factory •() → self::Test {
+  static factory •() → self::Test* {
     return null;
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36400.dart.outline.expect
index 2f39e53..4c6df802 100644
--- a/pkg/front_end/testcases/regress/issue_36400.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.outline.expect
@@ -11,6 +11,6 @@
 import "dart:core" as core;
 
 class Test extends core::Object {
-  static factory •() → self::Test
+  static factory •() → self::Test*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36400.dart.strong.expect
index e63b720..5e6fa5b 100644
--- a/pkg/front_end/testcases/regress/issue_36400.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.strong.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class Test extends core::Object {
-  static factory •() → self::Test {
+  static factory •() → self::Test* {
     return null;
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect
index e63b720..5e6fa5b 100644
--- a/pkg/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36400.dart.strong.transformed.expect
@@ -11,7 +11,7 @@
 import "dart:core" as core;
 
 class Test extends core::Object {
-  static factory •() → self::Test {
+  static factory •() → self::Test* {
     return null;
   }
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_36647.dart.legacy.expect
index b965c9b..26ab204 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.legacy.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class xxx extends core::Object {
-  synthetic constructor •() → iss::xxx
+  synthetic constructor •() → iss::xxx*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect
index b965c9b..26ab204 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.legacy.transformed.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class xxx extends core::Object {
-  synthetic constructor •() → iss::xxx
+  synthetic constructor •() → iss::xxx*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
index 69a888f..b7df60a 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.outline.expect
@@ -61,7 +61,7 @@
 import "dart:core" as core;
 
 class xxx extends core::Object {
-  synthetic constructor •() → iss::xxx
+  synthetic constructor •() → iss::xxx*
     ;
 }
 static field invalid-type XXX;
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
index b99e909..1b4838c 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class xxx extends core::Object {
-  synthetic constructor •() → iss::xxx
+  synthetic constructor •() → iss::xxx*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
index b99e909..1b4838c 100644
--- a/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647.dart.strong.transformed.expect
@@ -65,7 +65,7 @@
 import "dart:core" as core;
 
 class xxx extends core::Object {
-  synthetic constructor •() → iss::xxx
+  synthetic constructor •() → iss::xxx*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.expect
index e040789..ec50b22 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.expect
@@ -37,8 +37,8 @@
 import self as iss;
 import "dart:core" as core;
 
-typedef bar = () → core::bool;
-static field core::int foo;
-static method baz() → core::int {
+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_36647_2.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect
index e040789..ec50b22 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.legacy.transformed.expect
@@ -37,8 +37,8 @@
 import self as iss;
 import "dart:core" as core;
 
-typedef bar = () → core::bool;
-static field core::int foo;
-static method baz() → core::int {
+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_36647_2.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
index af81823..8311ba7 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.outline.expect
@@ -37,7 +37,7 @@
 import self as iss;
 import "dart:core" as core;
 
-typedef bar = () → core::bool;
-static field core::int foo;
-static method baz() → core::int
+typedef bar = () →* core::bool*;
+static field core::int* foo;
+static method baz() → core::int*
   ;
diff --git a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
index e040789..ec50b22 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.expect
@@ -37,8 +37,8 @@
 import self as iss;
 import "dart:core" as core;
 
-typedef bar = () → core::bool;
-static field core::int foo;
-static method baz() → core::int {
+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_36647_2.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
index e040789..ec50b22 100644
--- a/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36647_2.dart.strong.transformed.expect
@@ -37,8 +37,8 @@
 import self as iss;
 import "dart:core" as core;
 
-typedef bar = () → core::bool;
-static field core::int foo;
-static method baz() → core::int {
+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.legacy.expect b/pkg/front_end/testcases/regress/issue_36669.dart.legacy.expect
index 104dfea..175b974 100644
--- a/pkg/front_end/testcases/regress/issue_36669.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.legacy.expect
@@ -10,22 +10,22 @@
 import "dart:core" as core;
 
 class NoUnnamedConstuctor extends core::Object {
-  constructor _() → self::NoUnnamedConstuctor
+  constructor _() → self::NoUnnamedConstuctor*
     : super core::Object::•()
     ;
 }
 class MixMeIn extends core::Object {
-  synthetic constructor •() → self::MixMeIn
+  synthetic constructor •() → self::MixMeIn*
     : super core::Object::•()
     ;
 }
 abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
-  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
     : super self::NoUnnamedConstuctor::_()
     ;
 }
 class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect
index 25e5cab..f15581b 100644
--- a/pkg/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.legacy.transformed.expect
@@ -10,22 +10,22 @@
 import "dart:core" as core;
 
 class NoUnnamedConstuctor extends core::Object {
-  constructor _() → self::NoUnnamedConstuctor
+  constructor _() → self::NoUnnamedConstuctor*
     : super core::Object::•()
     ;
 }
 class MixMeIn extends core::Object {
-  synthetic constructor •() → self::MixMeIn
+  synthetic constructor •() → self::MixMeIn*
     : super core::Object::•()
     ;
 }
 abstract class _Foo&NoUnnamedConstuctor&MixMeIn extends self::NoUnnamedConstuctor implements self::MixMeIn {
-  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
     : super self::NoUnnamedConstuctor::_()
     ;
 }
 class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36669.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36669.dart.outline.expect
index ea21227..9684d36 100644
--- a/pkg/front_end/testcases/regress/issue_36669.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class NoUnnamedConstuctor extends core::Object {
-  constructor _() → self::NoUnnamedConstuctor
+  constructor _() → self::NoUnnamedConstuctor*
     ;
 }
 class MixMeIn extends core::Object {
-  synthetic constructor •() → self::MixMeIn
+  synthetic constructor •() → self::MixMeIn*
     ;
 }
 abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
-  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
     : super self::NoUnnamedConstuctor::_()
     ;
 }
 class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36669.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36669.dart.strong.expect
index 104dfea..175b974 100644
--- a/pkg/front_end/testcases/regress/issue_36669.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.strong.expect
@@ -10,22 +10,22 @@
 import "dart:core" as core;
 
 class NoUnnamedConstuctor extends core::Object {
-  constructor _() → self::NoUnnamedConstuctor
+  constructor _() → self::NoUnnamedConstuctor*
     : super core::Object::•()
     ;
 }
 class MixMeIn extends core::Object {
-  synthetic constructor •() → self::MixMeIn
+  synthetic constructor •() → self::MixMeIn*
     : super core::Object::•()
     ;
 }
 abstract class _Foo&NoUnnamedConstuctor&MixMeIn = self::NoUnnamedConstuctor with self::MixMeIn {
-  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
     : super self::NoUnnamedConstuctor::_()
     ;
 }
 class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect
index 25e5cab..f15581b 100644
--- a/pkg/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36669.dart.strong.transformed.expect
@@ -10,22 +10,22 @@
 import "dart:core" as core;
 
 class NoUnnamedConstuctor extends core::Object {
-  constructor _() → self::NoUnnamedConstuctor
+  constructor _() → self::NoUnnamedConstuctor*
     : super core::Object::•()
     ;
 }
 class MixMeIn extends core::Object {
-  synthetic constructor •() → self::MixMeIn
+  synthetic constructor •() → self::MixMeIn*
     : super core::Object::•()
     ;
 }
 abstract class _Foo&NoUnnamedConstuctor&MixMeIn extends self::NoUnnamedConstuctor implements self::MixMeIn {
-  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn
+  synthetic constructor _() → self::_Foo&NoUnnamedConstuctor&MixMeIn*
     : super self::NoUnnamedConstuctor::_()
     ;
 }
 class Foo extends self::_Foo&NoUnnamedConstuctor&MixMeIn {
-  synthetic constructor •() → self::Foo
+  synthetic constructor •() → self::Foo*
     : invalid-initializer
     ;
 }
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_36793.dart.legacy.expect
index 69ebf3f..ac733f1 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.legacy.expect
@@ -12,9 +12,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y = 42;
-@self::y
-static field core::int x;
+static const field core::int* y = #C1;
+@#C1
+static field core::int* x;
 static method main() → dynamic {
-  core::print(self::y);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = 42
 }
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect
index 69ebf3f..ac733f1 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.legacy.transformed.expect
@@ -12,9 +12,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y = 42;
-@self::y
-static field core::int x;
+static const field core::int* y = #C1;
+@#C1
+static field core::int* x;
 static method main() → dynamic {
-  core::print(self::y);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = 42
 }
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
index bd4a7de..99368e0 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.outline.expect
@@ -12,8 +12,8 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y = 42;
+static const field core::int* y = 42;
 @self::y
-static field core::int x;
+static field core::int* x;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.strong.expect b/pkg/front_end/testcases/regress/issue_36793.dart.strong.expect
index 69ebf3f..ac733f1 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.strong.expect
@@ -12,9 +12,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y = 42;
-@self::y
-static field core::int x;
+static const field core::int* y = #C1;
+@#C1
+static field core::int* x;
 static method main() → dynamic {
-  core::print(self::y);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = 42
 }
diff --git a/pkg/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect
index 69ebf3f..ac733f1 100644
--- a/pkg/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_36793.dart.strong.transformed.expect
@@ -12,9 +12,13 @@
 import self as self;
 import "dart:core" as core;
 
-static const field core::int y = 42;
-@self::y
-static field core::int x;
+static const field core::int* y = #C1;
+@#C1
+static field core::int* x;
 static method main() → dynamic {
-  core::print(self::y);
+  core::print(#C1);
+}
+
+constants  {
+  #C1 = 42
 }
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.legacy.expect b/pkg/front_end/testcases/regress/issue_37285.dart.legacy.expect
index f7de288..ac39a3d 100644
--- a/pkg/front_end/testcases/regress/issue_37285.dart.legacy.expect
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.legacy.expect
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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()[];
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.legacy.transformed.expect b/pkg/front_end/testcases/regress/issue_37285.dart.legacy.transformed.expect
index f7de288..ac39a3d 100644
--- a/pkg/front_end/testcases/regress/issue_37285.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.legacy.transformed.expect
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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()[];
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.outline.expect b/pkg/front_end/testcases/regress/issue_37285.dart.outline.expect
index 2437d0c..8d0ff52 100644
--- a/pkg/front_end/testcases/regress/issue_37285.dart.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.outline.expect
@@ -10,7 +10,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  constructor •() → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.strong.expect b/pkg/front_end/testcases/regress/issue_37285.dart.strong.expect
index f7de288..ac39a3d 100644
--- a/pkg/front_end/testcases/regress/issue_37285.dart.strong.expect
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.strong.expect
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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()[];
diff --git a/pkg/front_end/testcases/regress/issue_37285.dart.strong.transformed.expect b/pkg/front_end/testcases/regress/issue_37285.dart.strong.transformed.expect
index f7de288..ac39a3d 100644
--- a/pkg/front_end/testcases/regress/issue_37285.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_37285.dart.strong.transformed.expect
@@ -20,7 +20,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •() → self::C
+  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()[];
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.expect
deleted file mode 100644
index d5e9850..0000000
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
deleted file mode 100644
index d5e9850..0000000
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect
deleted file mode 100644
index 7910f91..0000000
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.outline.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-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>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect
deleted file mode 100644
index 5cbc6bf..0000000
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect b/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
deleted file mode 100644
index 5cbc6bf..0000000
--- a/pkg/front_end/testcases/reject_generic_function_types_in_bounds.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.expect
deleted file mode 100644
index 309defd..0000000
--- a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method f(core::List<dynamic> x) → core::bool {
-  return x.expand((dynamic y) → dynamic {
-    return y.split(",");
-  }).any((dynamic y) → dynamic => y.==("z"));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.transformed.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.transformed.expect
deleted file mode 100644
index 309defd..0000000
--- a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method f(core::List<dynamic> x) → core::bool {
-  return x.expand((dynamic y) → dynamic {
-    return y.split(",");
-  }).any((dynamic y) → dynamic => y.==("z"));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.outline.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.outline.expect
deleted file mode 100644
index 3e5e6dd..0000000
--- a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.outline.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method f(core::List<dynamic> x) → core::bool
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.expect
deleted file mode 100644
index 47fe398..0000000
--- a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-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.split(",") as{TypeError} core::Iterable<dynamic>;
-  }).{core::Iterable::any}((dynamic y) → core::bool => y.{core::Object::==}("z"));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.transformed.expect b/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.transformed.expect
deleted file mode 100644
index 47fe398..0000000
--- a/pkg/front_end/testcases/return_with_unknown_type_in_context.dart.strong.transformed.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-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.split(",") as{TypeError} core::Iterable<dynamic>;
-  }).{core::Iterable::any}((dynamic y) → core::bool => y.{core::Object::==}("z"));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect
index 4500d24..23e080a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method f() → void {}
-  get g() → () → void
+  get g() → () →* void
     return null;
   get h() → dynamic
     return null;
@@ -21,7 +21,7 @@
     this.{self::C::h}();
   }
 }
-static method test(self::C c, () → void f, dynamic d) → void {
+static method test(self::C* c, () →* void f, dynamic d) → void {
   c.f();
   f.call();
   d.call();
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect
index 4500d24..23e080a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.legacy.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method f() → void {}
-  get g() → () → void
+  get g() → () →* void
     return null;
   get h() → dynamic
     return null;
@@ -21,7 +21,7 @@
     this.{self::C::h}();
   }
 }
-static method test(self::C c, () → void f, dynamic d) → void {
+static method test(self::C* c, () →* void f, dynamic d) → void {
   c.f();
   f.call();
   d.call();
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.outline.expect
index 3dc3997..059aefb 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method f() → void
     ;
-  get g() → () → void
+  get g() → () →* void
     ;
   get h() → dynamic
     ;
   method test() → void
     ;
 }
-static method test(self::C c, () → void f, dynamic d) → void
+static method test(self::C* c, () →* void f, dynamic d) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.expect
index 097b531..57af34ef 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method f() → void {}
-  get g() → () → void
+  get g() → () →* void
     return null;
   get h() → dynamic
     return null;
@@ -21,7 +21,7 @@
     this.{self::C::h}();
   }
 }
-static method test(self::C c, () → void f, dynamic d) → void {
+static method test(self::C* c, () →* void f, dynamic d) → void {
   c.{self::C::f}();
   f.call();
   d.call();
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.transformed.expect
index 097b531..57af34ef 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds.dart.strong.transformed.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F = () → void;
+typedef F = () →* void;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method f() → void {}
-  get g() → () → void
+  get g() → () →* void
     return null;
   get h() → dynamic
     return null;
@@ -21,7 +21,7 @@
     this.{self::C::h}();
   }
 }
-static method test(self::C c, () → void f, dynamic d) → void {
+static method test(self::C* c, () →* void f, dynamic d) → void {
   c.{self::C::f}();
   f.call();
   d.call();
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect
index c8baa14..f904786 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -16,7 +16,7 @@
     dynamic v4 = this.{self::C::y};
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   dynamic v1 = c.x;
   dynamic v2 = c.y;
   dynamic v3 = d.x;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect
index c8baa14..f904786 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -16,7 +16,7 @@
     dynamic v4 = this.{self::C::y};
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   dynamic v1 = c.x;
   dynamic v2 = c.y;
   dynamic v3 = d.x;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.outline.expect
index 40f5e62..7e0ce98 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.outline.expect
@@ -4,14 +4,14 @@
 
 class C extends core::Object {
   field dynamic y;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   get x() → dynamic
     ;
   method test() → void
     ;
 }
-static method test(self::C c, dynamic d) → void
+static method test(self::C* c, dynamic d) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.expect
index 66a4e65..5853cb4 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -16,7 +16,7 @@
     dynamic v4 = this.{self::C::y};
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   dynamic v1 = c.{self::C::x};
   dynamic v2 = c.{self::C::y};
   dynamic v3 = d.x;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.transformed.expect
index 66a4e65..5853cb4 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_get.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   get x() → dynamic
@@ -16,7 +16,7 @@
     dynamic v4 = this.{self::C::y};
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   dynamic v1 = c.{self::C::x};
   dynamic v2 = c.{self::C::y};
   dynamic v3 = d.x;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect
index d39871fd..3d747e1 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
@@ -15,7 +15,7 @@
     this.{self::C::y} = null;
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   c.x = null;
   c.y = null;
   d.x = null;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect
index d39871fd..3d747e1 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.legacy.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
@@ -15,7 +15,7 @@
     this.{self::C::y} = null;
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   c.x = null;
   c.y = null;
   d.x = null;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.outline.expect
index fe02523..4f04414 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.outline.expect
@@ -4,14 +4,14 @@
 
 class C extends core::Object {
   field dynamic y;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   set x(dynamic value) → void
     ;
   method test() → void
     ;
 }
-static method test(self::C c, dynamic d) → void
+static method test(self::C* c, dynamic d) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.expect
index 9524a9d..3e911d7 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
@@ -15,7 +15,7 @@
     this.{self::C::y} = null;
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   c.{self::C::x} = null;
   c.{self::C::y} = null;
   d.x = null;
diff --git a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.transformed.expect
index 9524a9d..3e911d7 100644
--- a/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_kinds_set.dart.strong.transformed.expect
@@ -4,7 +4,7 @@
 
 class C extends core::Object {
   field dynamic y = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   set x(dynamic value) → void {}
@@ -15,7 +15,7 @@
     this.{self::C::y} = null;
   }
 }
-static method test(self::C c, dynamic d) → void {
+static method test(self::C* c, dynamic d) → void {
   c.{self::C::x} = null;
   c.{self::C::y} = null;
   d.x = null;
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect
index 1d689ba..b77ba5a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  () → void x = new self::C::•();
+  () →* void x = new self::C::•();
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect
index 1d689ba..b77ba5a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  () → void x = new self::C::•();
+  () →* void x = new self::C::•();
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.outline.expect
index 3f4889b..dbe6a3a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method call() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.expect
index b8d731a..c0a850ef 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  () → void x = let final self::C #t1 = new self::C::•() in #t1.==(null) ?{() → void} null : #t1.{self::C::call};
+  () →* void x = let final self::C* #t1 = new self::C::•() in #t1.==(null) ?{() →* void} null : #t1.{self::C::call};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.transformed.expect
index b8d731a..c0a850ef 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  () → void x = let final self::C #t1 = new self::C::•() in #t1.==(null) ?{() → void} null : #t1.{self::C::call};
+  () →* void x = let final self::C* #t1 = new self::C::•() in #t1.==(null) ?{() →* void} null : #t1.{self::C::call};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect
index b806941..7fddc0b 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.expect
@@ -6,11 +6,11 @@
 import "dart:async";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  asy::FutureOr<() → void> x = new self::C::•();
+  asy::FutureOr<() →* void>* x = new self::C::•();
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect
index b806941..7fddc0b 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.legacy.transformed.expect
@@ -6,11 +6,11 @@
 import "dart:async";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  asy::FutureOr<() → void> x = new self::C::•();
+  asy::FutureOr<() →* void>* x = new self::C::•();
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.outline.expect
index c1ceccf..389e36a 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.outline.expect
@@ -5,7 +5,7 @@
 import "dart:async";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   method call() → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.expect
index ee98bf3..203dd57 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.expect
@@ -6,11 +6,11 @@
 import "dart:async";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  asy::FutureOr<() → void> x = let final self::C #t1 = new self::C::•() in #t1.==(null) ?{() → void} null : #t1.{self::C::call};
+  asy::FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1.==(null) ?{() →* void} null : #t1.{self::C::call};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.transformed.expect
index ee98bf3..203dd57 100644
--- a/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/call_method_implicit_tear_off_future_or.dart.strong.transformed.expect
@@ -6,11 +6,11 @@
 import "dart:async";
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   method call() → void {}
 }
 static method main() → dynamic {
-  asy::FutureOr<() → void> x = let final self::C #t1 = new self::C::•() in #t1.==(null) ?{() → void} null : #t1.{self::C::call};
+  asy::FutureOr<() →* void>* x = let final self::C* #t1 = new self::C::•() in #t1.==(null) ?{() →* void} null : #t1.{self::C::call};
 }
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
index e953f32..40d9bcc 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart
@@ -15,7 +15,7 @@
 }
 
 void g(C<num> c) {
-  var x = c. /*@checkReturn=(num) -> void*/ y;
+  var x = c. /*@ checkReturn=(num*) ->* void */ y;
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect
index 77c7ebd..c50e6eb 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {
     dynamic x = this.{self::C::y};
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   dynamic x = c.y;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect
index 77c7ebd..c50e6eb 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 {
     dynamic x = this.{self::C::y};
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   dynamic x = c.y;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
index a14c9fc..e75c3f5 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  field (self::C::T) → void y;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field (self::C::T*) →* void y;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
   method f() → void
     ;
 }
-static method g(self::C<core::num> c) → void
+static method g(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
index 8cec95f..a570c3b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 x = this.{self::C::y};
   }
 }
-static method g(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::y} as{TypeError} (core::num) → void;
+static method g(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::y} as{TypeError} (core::num*) →* void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
index 8cec95f..a570c3b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_field.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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 x = this.{self::C::y};
   }
 }
-static method g(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::y} as{TypeError} (core::num) → void;
+static method g(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::y} as{TypeError} (core::num*) →* void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect
index 766b438..8afb28f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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 = dynamic>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T*) →* void = dynamic>(self::C::f::U* x) → void {}
 }
-static method g(self::C<core::num> c) → void {
-  c.f<(core::Object) → void>((core::Object o) → dynamic {});
+static method g(self::C<core::num*>* c) → void {
+  c.f<(core::Object*) →* void>((core::Object* o) → dynamic {});
 }
 static method test() → void {
-  self::g(new self::C::•<core::int>());
+  self::g(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect
index 766b438..8afb28f 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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 = dynamic>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T*) →* void = dynamic>(self::C::f::U* x) → void {}
 }
-static method g(self::C<core::num> c) → void {
-  c.f<(core::Object) → void>((core::Object o) → dynamic {});
+static method g(self::C<core::num*>* c) → void {
+  c.f<(core::Object*) →* void>((core::Object* o) → dynamic {});
 }
 static method test() → void {
-  self::g(new self::C::•<core::int>());
+  self::g(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
index 05796c2..ddce3da 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<U extends (self::C::T) → void = dynamic>(self::C::f::U x) → void
+  method f<U extends (self::C::T*) →* void = dynamic>(self::C::f::U* x) → void
     ;
 }
-static method g(self::C<core::num> c) → void
+static method g(self::C<core::num*>* c) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
index 0eace1e..1f1240e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void {}
 }
-static method g(self::C<core::num> c) → void {
-  c.{self::C::f}<(core::Object) → void>((core::Object o) → core::Null {});
+static method g(self::C<core::num*>* c) → void {
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null* {});
 }
 static method test() → void {
-  self::g(new self::C::•<core::int>());
+  self::g(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
index 0eace1e..1f1240e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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::T) → void>(self::C::f::U x) → void {}
+  method f<U extends (self::C::T*) →* void = (self::C::T*) →* void>(self::C::f::U* x) → void {}
 }
-static method g(self::C<core::num> c) → void {
-  c.{self::C::f}<(core::Object) → void>((core::Object o) → core::Null {});
+static method g(self::C<core::num*>* c) → void {
+  c.{self::C::f}<(core::Object*) →* void>((core::Object* o) → core::Null* {});
 }
 static method test() → void {
-  self::g(new self::C::•<core::int>());
+  self::g(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
index 8072cc9..dbc47cd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart
@@ -15,18 +15,18 @@
 }
 
 void g1(C<num> c) {
-  var x = c.f1 /*@checkReturn=(num) -> void*/ ();
+  var x = c.f1 /*@ checkReturn=(num*) ->* void */ ();
   print('hello');
   x(1.5);
 }
 
 void g2(C<num> c) {
-  F<int> x = c.f1 /*@checkReturn=(num) -> void*/ ();
+  F<int> x = c.f1 /*@ checkReturn=(num*) ->* void */ ();
   x(1);
 }
 
 void g3(C<num> c) {
-  var x = c.f2 /*@checkReturn=List<(num) -> void>*/ ();
+  var x = c.f2 /*@ checkReturn=List<(num*) ->* void>* */ ();
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect
index dcfbb1a..4a14ba5 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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> {
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = c.f1();
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.f1();
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.f1();
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = c.f2();
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect
index dcfbb1a..4a14ba5 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.legacy.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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> {
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = c.f1();
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.f1();
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.f1();
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = c.f2();
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
index 7e23e51..e0dbc15 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f1() → (self::C::T) → void
+  method f1() → (self::C::T*) →* void
     ;
-  method f2() → core::List<(self::C::T) → void>
+  method f2() → core::List<(self::C::T*) →* void>*
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::C<core::num> c) → void
+static method g2(self::C<core::num*>* c) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
index 118f770..45979f9 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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}()];
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::f1}() as{TypeError} (core::num) → void;
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1}() as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.{self::C::f1}() as{TypeError} (core::num) → void;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1}() as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
-  core::List<(core::num) → void> x = c.{self::C::f2}() as{TypeError} core::List<(core::num) → void>;
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2}() as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
index 118f770..45979f9 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return.dart.strong.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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}()];
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::f1}() as{TypeError} (core::num) → void;
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1}() as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.{self::C::f1}() as{TypeError} (core::num) → void;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1}() as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
-  core::List<(core::num) → void> x = c.{self::C::f2}() as{TypeError} core::List<(core::num) → void>;
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2}() as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
index 24609f7..bd39c36 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart
@@ -15,18 +15,18 @@
 }
 
 void g1(C<num> c) {
-  var x = c?.f1 /*@checkReturn=(num) -> void*/ ();
+  var x = c?.f1 /*@ checkReturn=(num*) ->* void */ ();
   print('hello');
   x(1.5);
 }
 
 void g2(C<num> c) {
-  F<int> x = c?.f1 /*@checkReturn=(num) -> void*/ ();
+  F<int> x = c?.f1 /*@ checkReturn=(num*) ->* void */ ();
   x(1);
 }
 
 void g3(C<num> c) {
-  var x = c?.f2 /*@checkReturn=List<(num) -> void>*/ ();
+  var x = c?.f2 /*@ checkReturn=List<(num*) ->* void>* */ ();
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect
index eb6429b..7af7a89 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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> {
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f1();
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1();
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1();
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t3 = c in #t3.==(null) ? null : #t3.f2();
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect
index eb6429b..7af7a89 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.legacy.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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> {
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}()];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f1();
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1();
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1();
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t3 = c in #t3.==(null) ? null : #t3.f2();
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
index 7e23e51..e0dbc15 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f1() → (self::C::T) → void
+  method f1() → (self::C::T*) →* void
     ;
-  method f2() → core::List<(self::C::T) → void>
+  method f2() → core::List<(self::C::T*) →* void>*
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::C<core::num> c) → void
+static method g2(self::C<core::num*>* c) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
index 7f26200..dd9a3f3 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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}()];
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}()];
   }
 }
-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}() as{TypeError} (core::num) → void;
+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}() as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-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}() as{TypeError} (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}() as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-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}() as{TypeError} core::List<(core::num) → 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}() as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
index 7f26200..dd9a3f3 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_null_aware.dart.strong.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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}()];
+  method f1() → (self::C::T*) →* void {}
+  method f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}()];
   }
 }
-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}() as{TypeError} (core::num) → void;
+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}() as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-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}() as{TypeError} (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}() as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-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}() as{TypeError} core::List<(core::num) → 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}() as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
index 4b202f2..35f1929 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart
@@ -15,7 +15,7 @@
 }
 
 G<num> g(C<num> c) {
-  return c. /*@checkReturn=() -> (num) -> void*/ f;
+  return c. /*@ checkReturn=() ->* (num*) ->* void */ f;
 }
 
 void h(int i) {
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect
index a07805e..d15559d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.expect
@@ -2,23 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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
+  method f() → (self::C::T*) →* void
     return this.{self::C::_x};
 }
-static method g(self::C<core::num> c) → () → (core::num) → void {
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void {
   return c.f;
 }
-static method h(core::int i) → void {
+static method h(core::int* i) → void {
   core::print("${i}");
 }
 static method test() → void {
-  dynamic x = self::g(new self::C::•<core::int>(self::h));
+  dynamic x = self::g(new self::C::•<core::int*>(#C1));
 }
 static method main() → void {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect
index a07805e..d15559d 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.legacy.transformed.expect
@@ -2,23 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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
+  method f() → (self::C::T*) →* void
     return this.{self::C::_x};
 }
-static method g(self::C<core::num> c) → () → (core::num) → void {
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void {
   return c.f;
 }
-static method h(core::int i) → void {
+static method h(core::int* i) → void {
   core::print("${i}");
 }
 static method test() → void {
-  dynamic x = self::g(new self::C::•<core::int>(self::h));
+  dynamic x = self::g(new self::C::•<core::int*>(#C1));
 }
 static method main() → void {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
index 1172f3c..20694a1 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.outline.expect
@@ -2,18 +2,18 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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*>*
     ;
-  method f() → (self::C::T) → void
+  method f() → (self::C::T*) →* void
     ;
 }
-static method g(self::C<core::num> c) → () → (core::num) → void
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void
   ;
-static method h(core::int i) → void
+static method h(core::int* i) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
index de2d0dc..70de15e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.expect
@@ -2,23 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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
+  method f() → (self::C::T*) →* void
     return this.{self::C::_x};
 }
-static method g(self::C<core::num> c) → () → (core::num) → void {
-  return c.{self::C::f} as{TypeError} () → (core::num) → void;
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void {
+  return c.{self::C::f} as{TypeError} () →* (core::num*) →* void;
 }
-static method h(core::int i) → 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>(self::h));
+  () →* (core::num*) →* void x = self::g(new self::C::•<core::int*>(#C1));
 }
 static method main() → void {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
index de2d0dc..70de15e 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_generic_return_tear_off.dart.strong.transformed.expect
@@ -2,23 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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
+  method f() → (self::C::T*) →* void
     return this.{self::C::_x};
 }
-static method g(self::C<core::num> c) → () → (core::num) → void {
-  return c.{self::C::f} as{TypeError} () → (core::num) → void;
+static method g(self::C<core::num*>* c) → () →* (core::num*) →* void {
+  return c.{self::C::f} as{TypeError} () →* (core::num*) →* void;
 }
-static method h(core::int i) → 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>(self::h));
+  () →* (core::num*) →* void x = self::g(new self::C::•<core::int*>(#C1));
 }
 static method main() → void {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
index b8ff15c..9845d5c 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart
@@ -15,7 +15,7 @@
 }
 
 void g(C<num> c) {
-  c.y /*@checkGetterReturn=(num) -> void*/ (1.5);
+  c.y /*@ checkGetterReturn=(num*) ->* void */ (1.5);
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
index 79b167b..8a7fbe6 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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(generic-covariant-impl self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::y}(value);
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.y(1.5);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
index 79b167b..8a7fbe6 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.legacy.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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(generic-covariant-impl self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::y}(value);
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.y(1.5);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
index 7657ab7..1a27346 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.outline.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  field (self::C::T) → void y;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  field (self::C::T*) →* void y;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f(generic-covariant-impl self::C::T value) → void
+  method f(generic-covariant-impl self::C::T* value) → void
     ;
 }
-static method g(self::C<core::num> c) → void
+static method g(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
index e8b71dc..98d67c0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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(generic-covariant-impl self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::y}(value);
   }
 }
-static method g(self::C<core::num> c) → void {
-  (c.{self::C::y} as{TypeError} (core::num) → void).call(1.5);
+static method g(self::C<core::num*>* c) → void {
+  (c.{self::C::y} as{TypeError} (core::num*) →* void).call(1.5);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
index e8b71dc..98d67c0 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter.dart.strong.transformed.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<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>
+typedef F<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(generic-covariant-impl self::C::T value) → void {
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::y}(value);
   }
 }
-static method g(self::C<core::num> c) → void {
-  (c.{self::C::y} as{TypeError} (core::num) → void).call(1.5);
+static method g(self::C<core::num*>* c) → void {
+  (c.{self::C::y} as{TypeError} (core::num*) →* void).call(1.5);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
index 8900412..b9c82ef 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart
@@ -15,18 +15,18 @@
 }
 
 void g1(C<num> c) {
-  var x = c. /*@checkReturn=(num) -> void*/ f1;
+  var x = c. /*@ checkReturn=(num*) ->* void */ f1;
   print('hello');
   x(1.5);
 }
 
 void g2(C<num> c) {
-  F<int> x = c. /*@checkReturn=(num) -> void*/ f1;
+  F<int> x = c. /*@ checkReturn=(num*) ->* void */ f1;
   x(1);
 }
 
 void g3(C<num> c) {
-  var x = c. /*@checkReturn=List<(num) -> void>*/ f2;
+  var x = c. /*@ checkReturn=List<(num*) ->* void>* */ f2;
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect
index 844dc6d..5de3ec9 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  get f1() → (self::C::T*) →* void
     return null;
-  get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = c.f1;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.f1;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.f1;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = c.f2;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect
index 844dc6d..5de3ec9 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  get f1() → (self::C::T*) →* void
     return null;
-  get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = c.f1;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.f1;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.f1;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = c.f2;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
index cc0b97a..a2ffb5b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  get f1() → (self::C::T) → void
+  get f1() → (self::C::T*) →* void
     ;
-  get f2() → core::List<(self::C::T) → void>
+  get f2() → core::List<(self::C::T*) →* void>*
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::C<core::num> c) → void
+static method g2(self::C<core::num*>* c) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
index fbbc155..20544dd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  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}];
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::f1} as{TypeError} (core::num) → void;
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1} as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.{self::C::f1} as{TypeError} (core::num) → void;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1} as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
-  core::List<(core::num) → void> x = c.{self::C::f2} as{TypeError} core::List<(core::num) → void>;
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2} as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
index fbbc155..20544dd 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  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}];
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
-  (core::num) → void x = c.{self::C::f1} as{TypeError} (core::num) → void;
+static method g1(self::C<core::num*>* c) → void {
+  (core::num*) →* void x = c.{self::C::f1} as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = c.{self::C::f1} as{TypeError} (core::num) → void;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = c.{self::C::f1} as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
-  core::List<(core::num) → void> x = c.{self::C::f2} as{TypeError} core::List<(core::num) → void>;
+static method g3(self::C<core::num*>* c) → void {
+  core::List<(core::num*) →* void>* x = c.{self::C::f2} as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
index a8cd708..f10066c 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart
@@ -15,18 +15,18 @@
 }
 
 void g1(C<num> c) {
-  var x = c?. /*@checkReturn=(num) -> void*/ f1;
+  var x = c?. /*@ checkReturn=(num*) ->* void */ f1;
   print('hello');
   x(1.5);
 }
 
 void g2(C<num> c) {
-  F<int> x = c?. /*@checkReturn=(num) -> void*/ f1;
+  F<int> x = c?. /*@ checkReturn=(num*) ->* void */ f1;
   x(1);
 }
 
 void g3(C<num> c) {
-  var x = c?. /*@checkReturn=List<(num) -> void>*/ f2;
+  var x = c?. /*@ checkReturn=List<(num*) ->* void>* */ f2;
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect
index bdcc90a..a34afd3 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  get f1() → (self::C::T*) →* void
     return null;
-  get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f1;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t3 = c in #t3.==(null) ? null : #t3.f2;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect
index bdcc90a..a34afd3 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  get f1() → (self::C::T*) →* void
     return null;
-  get f2() → core::List<(self::C::T) → void> {
+  get f2() → core::List<(self::C::T*) →* void>* {
     return <dynamic>[this.{self::C::f1}];
   }
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t1 = c in #t1.==(null) ? null : #t1.f1;
   core::print("hello");
   x.call(1.5);
 }
-static method g2(self::C<core::num> c) → void {
-  (core::int) → void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1;
+static method g2(self::C<core::num*>* c) → void {
+  (core::int*) →* void x = let final dynamic #t2 = c in #t2.==(null) ? null : #t2.f1;
   x.call(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   dynamic x = let final dynamic #t3 = c in #t3.==(null) ? null : #t3.f2;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
index cc0b97a..a2ffb5b 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  get f1() → (self::C::T) → void
+  get f1() → (self::C::T*) →* void
     ;
-  get f2() → core::List<(self::C::T) → void>
+  get f2() → core::List<(self::C::T*) →* void>*
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::C<core::num> c) → void
+static method g2(self::C<core::num*>* c) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
index faea41a..c4f2438 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  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}];
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}];
   }
 }
-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} as{TypeError} (core::num) → void;
+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} as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-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} as{TypeError} (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} as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-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} as{TypeError} core::List<(core::num) → 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} as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
index faea41a..c4f2438 100644
--- a/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/contravariant_getter_return_null_aware.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  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}];
+  get f2() → core::List<(self::C::T*) →* void>* {
+    return <(self::C::T*) →* void>[this.{self::C::f1}];
   }
 }
-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} as{TypeError} (core::num) → void;
+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} as{TypeError} (core::num*) →* void;
   core::print("hello");
   x.call(1.5);
 }
-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} as{TypeError} (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} as{TypeError} (core::num*) →* void;
   x.call(1);
 }
-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} as{TypeError} core::List<(core::num) → 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} as{TypeError} core::List<(core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
index f6a34fb..1bc8ae7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void {
-    this.{self::C::f}<self::C::g1::U>(1.5);
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T* = dynamic>() → void {
+    this.{self::C::f}<self::C::g1::U*>(1.5);
   }
 }
-static method g2(self::C<core::Object> c) → void {
-  c.f<core::num>(1.5);
+static method g2(self::C<core::Object*>* c) → void {
+  c.f<core::num*>(1.5);
 }
 static method test() → void {
-  new self::C::•<core::int>().g1<core::num>();
-  self::g2(new self::C::•<core::int>());
+  new self::C::•<core::int*>().g1<core::num*>();
+  self::g2(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
index f6a34fb..1bc8ae7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void {
-    this.{self::C::f}<self::C::g1::U>(1.5);
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T* = dynamic>() → void {
+    this.{self::C::f}<self::C::g1::U*>(1.5);
   }
 }
-static method g2(self::C<core::Object> c) → void {
-  c.f<core::num>(1.5);
+static method g2(self::C<core::Object*>* c) → void {
+  c.f<core::num*>(1.5);
 }
 static method test() → void {
-  new self::C::•<core::int>().g1<core::num>();
-  self::g2(new self::C::•<core::int>());
+  new self::C::•<core::int*>().g1<core::num*>();
+  self::g2(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
index 9f98ab1..717c2fb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.outline.expect
@@ -2,15 +2,15 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void
     ;
-  method g1<generic-covariant-impl U extends self::C::T = dynamic>() → void
+  method g1<generic-covariant-impl U extends self::C::T* = dynamic>() → void
     ;
 }
-static method g2(self::C<core::Object> c) → void
+static method g2(self::C<core::Object*>* c) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
index 4b7f896..d90577e 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.expect
@@ -16,23 +16,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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = 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'.
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
+    this.{self::C::f}<self::C::g1::U*>(let final<BottomType> #t1 = 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'.
 Try changing the type of the parameter, or casting the argument to 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} <BottomType>);
   }
 }
-static method g2(self::C<core::Object> c) → void {
-  c.{self::C::f}<core::num>(1.5);
+static method g2(self::C<core::Object*>* c) → void {
+  c.{self::C::f}<core::num*>(1.5);
 }
 static method test() → void {
-  new self::C::•<core::int>().{self::C::g1}<core::num>();
-  self::g2(new self::C::•<core::int>());
+  new self::C::•<core::int*>().{self::C::g1}<core::num*>();
+  self::g2(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
index 4b7f896..d90577e 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_method_type_parameter.dart.strong.transformed.expect
@@ -16,23 +16,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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
-  method g1<generic-covariant-impl U extends self::C::T = self::C::T>() → void {
-    this.{self::C::f}<self::C::g1::U>(let final<BottomType> #t1 = 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'.
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
+  method g1<generic-covariant-impl U extends self::C::T* = self::C::T*>() → void {
+    this.{self::C::f}<self::C::g1::U*>(let final<BottomType> #t1 = 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'.
 Try changing the type of the parameter, or casting the argument to 'U'.
     this.f<U>(1.5);
               ^" in 1.5 as{TypeError} <BottomType>);
   }
 }
-static method g2(self::C<core::Object> c) → void {
-  c.{self::C::f}<core::num>(1.5);
+static method g2(self::C<core::Object*>* c) → void {
+  c.{self::C::f}<core::num*>(1.5);
 }
 static method test() → void {
-  new self::C::•<core::int>().{self::C::g1}<core::num>();
-  self::g2(new self::C::•<core::int>());
+  new self::C::•<core::int*>().{self::C::g1}<core::num*>();
+  self::g2(new self::C::•<core::int*>());
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
index 35df363..9bdab97 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.expect
@@ -2,19 +2,19 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T* x) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.f(1.5);
 }
-static method g2(self::C<core::int> c) → void {
+static method g2(self::C<core::int*>* c) → void {
   c.f(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.f(null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
index 35df363..9bdab97 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T* x) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.f(1.5);
 }
-static method g2(self::C<core::int> c) → void {
+static method g2(self::C<core::int*>* c) → void {
   c.f(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.f(null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
index 755eea6..1eca40d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.outline.expect
@@ -2,17 +2,17 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f(generic-covariant-impl self::C::T x) → void
+  method f(generic-covariant-impl self::C::T* x) → void
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::C<core::int> c) → void
+static method g2(self::C<core::int*>* c) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
index 1533f83..33acfb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.expect
@@ -2,19 +2,19 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T* x) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.{self::C::f}(1.5);
 }
-static method g2(self::C<core::int> c) → void {
+static method g2(self::C<core::int*>* c) → void {
   c.{self::C::f}(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.{self::C::f}(null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
index 1533f83..33acfb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::C::T x) → void {}
+  method f(generic-covariant-impl self::C::T* x) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.{self::C::f}(1.5);
 }
-static method g2(self::C<core::int> c) → void {
+static method g2(self::C<core::int*>* c) → void {
   c.{self::C::f}(1);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.{self::C::f}(null);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
index d0cf71d..62384ef 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.expect
@@ -2,25 +2,25 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
-  method f2(generic-covariant-impl () → self::C::T callback) → void {}
-  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
-  method f4((self::C::T) → void callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T*>* x) → void {}
+  method f2(generic-covariant-impl () →* self::C::T* callback) → void {}
+  method f3(generic-covariant-impl (self::C::T*) →* self::C::T* callback) → void {}
+  method f4((self::C::T*) →* void callback) → void {}
 }
-static method g1(self::C<core::num> c, core::List<core::num> l) → void {
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void {
   c.f1(l);
 }
-static method g2(self::C<core::num> c, () → core::num callback) → void {
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void {
   c.f2(callback);
 }
-static method g3(self::C<core::num> c, (core::num) → core::num callback) → void {
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void {
   c.f3(callback);
 }
-static method g4(self::C<core::num> c, (core::num) → void callback) → void {
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void {
   c.f4(callback);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
index d0cf71d..62384ef 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.legacy.transformed.expect
@@ -2,25 +2,25 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
-  method f2(generic-covariant-impl () → self::C::T callback) → void {}
-  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
-  method f4((self::C::T) → void callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T*>* x) → void {}
+  method f2(generic-covariant-impl () →* self::C::T* callback) → void {}
+  method f3(generic-covariant-impl (self::C::T*) →* self::C::T* callback) → void {}
+  method f4((self::C::T*) →* void callback) → void {}
 }
-static method g1(self::C<core::num> c, core::List<core::num> l) → void {
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void {
   c.f1(l);
 }
-static method g2(self::C<core::num> c, () → core::num callback) → void {
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void {
   c.f2(callback);
 }
-static method g3(self::C<core::num> c, (core::num) → core::num callback) → void {
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void {
   c.f3(callback);
 }
-static method g4(self::C<core::num> c, (core::num) → void callback) → void {
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void {
   c.f4(callback);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
index 49d3ebd..6c1ddbc 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.outline.expect
@@ -2,25 +2,25 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f1(generic-covariant-impl core::List<self::C::T> x) → void
+  method f1(generic-covariant-impl core::List<self::C::T*>* x) → void
     ;
-  method f2(generic-covariant-impl () → self::C::T callback) → void
+  method f2(generic-covariant-impl () →* self::C::T* callback) → void
     ;
-  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void
+  method f3(generic-covariant-impl (self::C::T*) →* self::C::T* callback) → void
     ;
-  method f4((self::C::T) → void callback) → void
+  method f4((self::C::T*) →* void callback) → void
     ;
 }
-static method g1(self::C<core::num> c, core::List<core::num> l) → void
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void
   ;
-static method g2(self::C<core::num> c, () → core::num callback) → void
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void
   ;
-static method g3(self::C<core::num> c, (core::num) → core::num callback) → void
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void
   ;
-static method g4(self::C<core::num> c, (core::num) → void callback) → void
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
index 19bc917..5a27535 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.expect
@@ -2,25 +2,25 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
-  method f2(generic-covariant-impl () → self::C::T callback) → void {}
-  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
-  method f4((self::C::T) → void callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T*>* x) → void {}
+  method f2(generic-covariant-impl () →* self::C::T* callback) → void {}
+  method f3(generic-covariant-impl (self::C::T*) →* self::C::T* callback) → void {}
+  method f4((self::C::T*) →* void callback) → void {}
 }
-static method g1(self::C<core::num> c, core::List<core::num> l) → void {
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void {
   c.{self::C::f1}(l);
 }
-static method g2(self::C<core::num> c, () → core::num callback) → void {
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void {
   c.{self::C::f2}(callback);
 }
-static method g3(self::C<core::num> c, (core::num) → core::num callback) → void {
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void {
   c.{self::C::f3}(callback);
 }
-static method g4(self::C<core::num> c, (core::num) → void callback) → void {
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void {
   c.{self::C::f4}(callback);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
index 19bc917..5a27535 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_complex.dart.strong.transformed.expect
@@ -2,25 +2,25 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl core::List<self::C::T> x) → void {}
-  method f2(generic-covariant-impl () → self::C::T callback) → void {}
-  method f3(generic-covariant-impl (self::C::T) → self::C::T callback) → void {}
-  method f4((self::C::T) → void callback) → void {}
+  method f1(generic-covariant-impl core::List<self::C::T*>* x) → void {}
+  method f2(generic-covariant-impl () →* self::C::T* callback) → void {}
+  method f3(generic-covariant-impl (self::C::T*) →* self::C::T* callback) → void {}
+  method f4((self::C::T*) →* void callback) → void {}
 }
-static method g1(self::C<core::num> c, core::List<core::num> l) → void {
+static method g1(self::C<core::num*>* c, core::List<core::num*>* l) → void {
   c.{self::C::f1}(l);
 }
-static method g2(self::C<core::num> c, () → core::num callback) → void {
+static method g2(self::C<core::num*>* c, () →* core::num* callback) → void {
   c.{self::C::f2}(callback);
 }
-static method g3(self::C<core::num> c, (core::num) → core::num callback) → void {
+static method g3(self::C<core::num*>* c, (core::num*) →* core::num* callback) → void {
   c.{self::C::f3}(callback);
 }
-static method g4(self::C<core::num> c, (core::num) → void callback) → void {
+static method g4(self::C<core::num*>* c, (core::num*) →* void callback) → void {
   c.{self::C::f4}(callback);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
index 2092b43..85b7cdc 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.expect
@@ -2,43 +2,47 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f1(generic-covariant-impl self::I::T x) → void;
-  abstract method f2(generic-covariant-impl self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T* x) → void;
+  abstract method f2(generic-covariant-impl self::I::T* x) → void;
 }
-class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::C::U* y = #C1]) → void {}
 }
-class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → self::D<self::D::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::D::U* y = #C1]) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.f1(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f1(1.5);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.f2(1, 1.5);
 }
-static method g4(self::D<core::num> d) → void {
+static method g4(self::D<core::num*>* d) → void {
   d.f1(1);
 }
-static method g5(self::D<core::num> d) → void {
+static method g5(self::D<core::num*>* d) → void {
   d.f2(1, 1.5);
 }
 static method test() → void {
-  self::g2(new self::C::•<core::num>());
+  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.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
index 2092b43..85b7cdc 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.legacy.transformed.expect
@@ -2,43 +2,47 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f1(generic-covariant-impl self::I::T x) → void;
-  abstract method f2(generic-covariant-impl self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T* x) → void;
+  abstract method f2(generic-covariant-impl self::I::T* x) → void;
 }
-class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::C::U* y = #C1]) → void {}
 }
-class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → self::D<self::D::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::D::U* y = #C1]) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.f1(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f1(1.5);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.f2(1, 1.5);
 }
-static method g4(self::D<core::num> d) → void {
+static method g4(self::D<core::num*>* d) → void {
   d.f1(1);
 }
-static method g5(self::D<core::num> d) → void {
+static method g5(self::D<core::num*>* d) → void {
   d.f2(1, 1.5);
 }
 static method test() → void {
-  self::g2(new self::C::•<core::num>());
+  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.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
index 9779f69..a5efe71 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.outline.expect
@@ -2,37 +2,37 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f1(generic-covariant-impl self::I::T x) → void;
-  abstract method f2(generic-covariant-impl self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T* x) → void;
+  abstract method f2(generic-covariant-impl self::I::T* x) → void;
 }
-class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::C<self::C::U>
+class C<U extends core::Object* = dynamic> extends core::Object implements self::I<core::int*> {
+  synthetic constructor •() → self::C<self::C::U*>*
     ;
-  method f1(generic-covariant-impl core::int x) → void
+  method f1(generic-covariant-impl core::int* x) → void
     ;
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::C::U y]) → void
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::C::U* y]) → void
     ;
 }
-class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → self::D<self::D::U>
+class D<U extends core::Object* = dynamic> extends self::C<self::D::U*> {
+  synthetic constructor •() → self::D<self::D::U*>*
     ;
-  method f1(generic-covariant-impl core::int x) → void
+  method f1(generic-covariant-impl core::int* x) → void
     ;
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::D::U y]) → void
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::D::U* y]) → void
     ;
 }
-static method g1(self::C<core::num> c) → void
+static method g1(self::C<core::num*>* c) → void
   ;
-static method g2(self::I<core::num> i) → void
+static method g2(self::I<core::num*>* i) → void
   ;
-static method g3(self::C<core::num> c) → void
+static method g3(self::C<core::num*>* c) → void
   ;
-static method g4(self::D<core::num> d) → void
+static method g4(self::D<core::num*>* d) → void
   ;
-static method g5(self::D<core::num> d) → void
+static method g5(self::D<core::num*>* d) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
index a04329b..a8d3af1 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.expect
@@ -2,43 +2,47 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f1(generic-covariant-impl self::I::T x) → void;
-  abstract method f2(generic-covariant-impl self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T* x) → void;
+  abstract method f2(generic-covariant-impl self::I::T* x) → void;
 }
-class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::C::U* y = #C1]) → void {}
 }
-class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → self::D<self::D::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::D::U* y = #C1]) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.{self::C::f1}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f1}(1.5);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.{self::C::f2}(1, 1.5);
 }
-static method g4(self::D<core::num> d) → void {
+static method g4(self::D<core::num*>* d) → void {
   d.{self::D::f1}(1);
 }
-static method g5(self::D<core::num> d) → void {
+static method g5(self::D<core::num*>* d) → void {
   d.{self::D::f2}(1, 1.5);
 }
 static method test() → void {
-  self::g2(new self::C::•<core::num>());
+  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.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
index a04329b..a8d3af1 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface.dart.strong.transformed.expect
@@ -2,43 +2,47 @@
 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>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f1(generic-covariant-impl self::I::T x) → void;
-  abstract method f2(generic-covariant-impl self::I::T x) → void;
+  abstract method f1(generic-covariant-impl self::I::T* x) → void;
+  abstract method f2(generic-covariant-impl self::I::T* x) → void;
 }
-class C<U extends core::Object = dynamic> extends core::Object implements self::I<core::int> {
-  synthetic constructor •() → self::C<self::C::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::C::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::C::U* y = #C1]) → void {}
 }
-class D<U extends core::Object = dynamic> extends self::C<self::D::U> {
-  synthetic constructor •() → self::D<self::D::U>
+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(generic-covariant-impl core::int x) → void {}
-  method f2(generic-covariant-impl core::int x, [generic-covariant-impl self::D::U y = null]) → void {}
+  method f1(generic-covariant-impl core::int* x) → void {}
+  method f2(generic-covariant-impl core::int* x, [generic-covariant-impl self::D::U* y = #C1]) → void {}
 }
-static method g1(self::C<core::num> c) → void {
+static method g1(self::C<core::num*>* c) → void {
   c.{self::C::f1}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f1}(1.5);
 }
-static method g3(self::C<core::num> c) → void {
+static method g3(self::C<core::num*>* c) → void {
   c.{self::C::f2}(1, 1.5);
 }
-static method g4(self::D<core::num> d) → void {
+static method g4(self::D<core::num*>* d) → void {
   d.{self::D::f1}(1);
 }
-static method g5(self::D<core::num> d) → void {
+static method g5(self::D<core::num*>* d) → void {
   d.{self::D::f2}(1, 1.5);
 }
 static method test() → void {
-  self::g2(new self::C::•<core::num>());
+  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.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
index 226d14a..3c03ed0 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
index 9af26fa..7717981 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.legacy.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*>, self::M {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  method f(generic-covariant-impl core::int x) → void {}
+  method f(generic-covariant-impl core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
index db72bce..96518fb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.outline.expect
@@ -3,32 +3,32 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x) → void
+  method f(core::int* x) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  method f(core::int x) → void
+  method f(core::int* x) → void
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void
+static method g1(self::C* c) → void
   ;
-static method g2(self::I<core::num> i) → void
+static method g2(self::I<core::num*>* i) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
index 74b04625..42af4f0 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::M::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
index e1d9d67..e63cbdb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_mixin.dart.strong.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*>, self::M {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  method f(generic-covariant-impl core::int x) → void {}
+  method f(generic-covariant-impl core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::M::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
index dd05793..b05cfd0 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
index dd05793..b05cfd0 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.legacy.transformed.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
index bd1c5ab..787c4b6 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.outline.expect
@@ -3,25 +3,25 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x) → void
+  method f(core::int* x) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void
+static method g1(self::C* c) → void
   ;
-static method g2(self::I<core::num> i) → void
+static method g2(self::I<core::num*>* i) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
index 104c6af..6ab80f5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
index 104c6af..6ab80f5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super.dart.strong.transformed.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
index b31bd2e..ca8dcbc 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
index 1fb19f0..a91b30d 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.legacy.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*>, self::M {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.f(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
index 97f802d..5437b35 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.outline.expect
@@ -3,30 +3,30 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x) → void
+  method f(core::int* x) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void
+static method g1(self::C* c) → void
   ;
-static method g2(self::I<core::num> i) → void
+static method g2(self::I<core::num*>* i) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
index ab6b4b0..8a57aae 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::B::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
index 7b3a731..fc8cb4a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_in_interface_super_mixin.dart.strong.transformed.expect
@@ -3,33 +3,33 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → void {}
+  method f(core::int* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class C extends self::B implements self::I<core::int>, self::M {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*>, self::M {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x) → void
     return super.{self::B::f}(x);
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::B::f}(1);
 }
-static method g2(self::I<core::num> i) → void {
+static method g2(self::I<core::num*>* i) → void {
   i.{self::I::f}(1.5);
 }
 static method test() → void {
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
index 173ea04..955ac0b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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(generic-covariant-impl self::C::T x) → void {}
-  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
     return x.first;
 }
-static method g1(self::C<core::num> c) → (core::num) → void {
+static method g1(self::C<core::num*>* c) → (core::num*) →* void {
   return c.f1;
 }
-static method g2(self::C<core::int> c, core::Object x) → void {
-  (core::Object) → void f = self::g1(c) as (core::Object) → 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.call(x);
 }
-static method g3(self::C<core::num> c) → (core::List<core::num>) → core::num {
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
   return c.f2;
 }
 static method test() → void {
-  dynamic x = self::g1(new self::C::•<core::int>());
+  dynamic x = self::g1(new self::C::•<core::int*>());
   x.call(1.5);
-  self::g3(new self::C::•<core::int>());
+  self::g3(new self::C::•<core::int*>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
index 173ea04..955ac0b 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.legacy.transformed.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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(generic-covariant-impl self::C::T x) → void {}
-  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
     return x.first;
 }
-static method g1(self::C<core::num> c) → (core::num) → void {
+static method g1(self::C<core::num*>* c) → (core::num*) →* void {
   return c.f1;
 }
-static method g2(self::C<core::int> c, core::Object x) → void {
-  (core::Object) → void f = self::g1(c) as (core::Object) → 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.call(x);
 }
-static method g3(self::C<core::num> c) → (core::List<core::num>) → core::num {
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
   return c.f2;
 }
 static method test() → void {
-  dynamic x = self::g1(new self::C::•<core::int>());
+  dynamic x = self::g1(new self::C::•<core::int*>());
   x.call(1.5);
-  self::g3(new self::C::•<core::int>());
+  self::g3(new self::C::•<core::int*>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
index 3983048..0362716 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.outline.expect
@@ -2,21 +2,21 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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*>*
     ;
-  method f1(generic-covariant-impl self::C::T x) → void
+  method f1(generic-covariant-impl self::C::T* x) → void
     ;
-  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
+  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
     ;
 }
-static method g1(self::C<core::num> c) → (core::num) → void
+static method g1(self::C<core::num*>* c) → (core::num*) →* void
   ;
-static method g2(self::C<core::int> c, core::Object x) → void
+static method g2(self::C<core::int*>* c, core::Object* x) → void
   ;
-static method g3(self::C<core::num> c) → (core::List<core::num>) → core::num
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num*
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
index f172d58..80bd16a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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(generic-covariant-impl self::C::T x) → void {}
-  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
     return x.{core::Iterable::first};
 }
-static method g1(self::C<core::num> c) → (core::num) → void {
+static method g1(self::C<core::num*>* c) → (core::num*) →* void {
   return c.{self::C::f1};
 }
-static method g2(self::C<core::int> c, core::Object x) → void {
-  (core::Object) → void f = self::g1(c) as (core::Object) → 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.call(x);
 }
-static method g3(self::C<core::num> c) → (core::List<core::num>) → core::num {
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
   return c.{self::C::f2};
 }
 static method test() → void {
-  (core::num) → void x = self::g1(new self::C::•<core::int>());
+  (core::num*) →* void x = self::g1(new self::C::•<core::int*>());
   x.call(1.5);
-  self::g3(new self::C::•<core::int>());
+  self::g3(new self::C::•<core::int*>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
index f172d58..80bd16a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_generic_parameter_tear_off.dart.strong.transformed.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-typedef G<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>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+typedef G<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(generic-covariant-impl self::C::T x) → void {}
-  method f2(generic-covariant-impl core::List<self::C::T> x) → self::C::T
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(generic-covariant-impl core::List<self::C::T*>* x) → self::C::T*
     return x.{core::Iterable::first};
 }
-static method g1(self::C<core::num> c) → (core::num) → void {
+static method g1(self::C<core::num*>* c) → (core::num*) →* void {
   return c.{self::C::f1};
 }
-static method g2(self::C<core::int> c, core::Object x) → void {
-  (core::Object) → void f = self::g1(c) as (core::Object) → 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.call(x);
 }
-static method g3(self::C<core::num> c) → (core::List<core::num>) → core::num {
+static method g3(self::C<core::num*>* c) → (core::List<core::num*>*) →* core::num* {
   return c.{self::C::f2};
 }
 static method test() → void {
-  (core::num) → void x = self::g1(new self::C::•<core::int>());
+  (core::num*) →* void x = self::g1(new self::C::•<core::int*>());
   x.call(1.5);
-  self::g3(new self::C::•<core::int>());
+  self::g3(new self::C::•<core::int*>());
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect
index 9faa7e3..278b2d7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.expect
@@ -2,33 +2,33 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1.5);
 }
-static method g2(self::C c) → (core::num) → dynamic {
+static method g2(self::C* c) → (core::num*) →* dynamic {
   return c.f;
 }
 static method test() → dynamic {
   self::g1(new self::D::•());
-  (core::num) → dynamic x = self::g2(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.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.transformed.expect
index 9faa7e3..278b2d7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.legacy.transformed.expect
@@ -2,33 +2,33 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.f(1.5);
 }
-static method g2(self::C c) → (core::num) → dynamic {
+static method g2(self::C* c) → (core::num*) →* dynamic {
   return c.f;
 }
 static method test() → dynamic {
   self::g1(new self::D::•());
-  (core::num) → dynamic x = self::g2(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.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
index dd2a7ad..bbf9deb 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.outline.expect
@@ -2,28 +2,28 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  method f(core::num x) → void
+  method f(core::num* x) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  method f(covariant core::int x) → void
+  method f(covariant core::int* x) → void
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  method f(covariant core::int x) → void
+  method f(covariant core::int* x) → void
     ;
 }
-static method g1(self::C c) → void
+static method g1(self::C* c) → void
   ;
-static method g2(self::C c) → (core::num) → dynamic
+static method g2(self::C* c) → (core::num*) →* dynamic
   ;
 static method test() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
index 057c2e6..c335d83 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.expect
@@ -2,33 +2,33 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}(1.5);
 }
-static method g2(self::C c) → (core::num) → dynamic {
+static method g2(self::C* c) → (core::num*) →* dynamic {
   return c.{self::C::f};
 }
 static method test() → dynamic {
   self::g1(new self::D::•());
-  (core::num) → dynamic x = self::g2(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.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
index 057c2e6..c335d83 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword.dart.strong.transformed.expect
@@ -2,33 +2,33 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  method f(covariant core::int x) → void {}
+  method f(covariant core::int* x) → void {}
 }
-static method g1(self::C c) → void {
+static method g1(self::C* c) → void {
   c.{self::C::f}(1.5);
 }
-static method g2(self::C c) → (core::num) → dynamic {
+static method g2(self::C* c) → (core::num*) →* dynamic {
   return c.{self::C::f};
 }
 static method test() → dynamic {
   self::g1(new self::D::•());
-  (core::num) → dynamic x = self::g2(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.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.expect
index 1f3710c..f40cd15 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect
index 1f3710c..f40cd15 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.outline.expect
index 063eafe..e36612c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.outline.expect
@@ -3,18 +3,18 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x;
-  synthetic constructor •() → self::C
+  field core::num* x;
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x;
-  synthetic constructor •() → self::D
+  covariant field core::int* x;
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x;
-  synthetic constructor •() → self::E
+  covariant field core::int* x;
+  synthetic constructor •() → self::E*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.expect
index 1f3710c..f40cd15 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.transformed.expect
index 1f3710c..f40cd15 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect
index 760a9dc..9adfddf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect
index 760a9dc..9adfddf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.legacy.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.outline.expect
index 0bc780e..b329b9f 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x;
-  synthetic constructor •() → self::C
+  field core::num* x;
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x;
-  synthetic constructor •() → self::D
+  covariant field core::int* x;
+  synthetic constructor •() → self::D*
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
-  set x(covariant core::int value) → void
+  set x(covariant core::int* value) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.expect
index 760a9dc..9adfddf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.transformed.expect
index 760a9dc..9adfddf 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_field_inherited_by_setter.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends core::Object implements self::C {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::D
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class E extends core::Object implements self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 0;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect
index cc9e3d7..ecb8eb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect
index cc9e3d7..ecb8eb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.outline.expect
index 840f751..0de5729 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.outline.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  set x(core::num value) → void
+  set x(core::num* value) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  set x(covariant core::int value) → void
+  set x(covariant core::int* value) → void
     ;
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     ;
-  set x(covariant core::int value) → void
+  set x(covariant core::int* value) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.expect
index cc9e3d7..ecb8eb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.transformed.expect
index cc9e3d7..ecb8eb5 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends self::D {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::D::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect
index 492c9a2..56cba3c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect
index 492c9a2..56cba3c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.legacy.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.outline.expect
index 809ec55..a0800d2 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  set x(core::num value) → void
+  set x(core::num* value) → void
     ;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  set x(covariant core::int value) → void
+  set x(covariant core::int* value) → void
     ;
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x;
-  synthetic constructor •() → self::E
+  covariant field core::int* x;
+  synthetic constructor •() → self::E*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.expect
index 492c9a2..56cba3c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.transformed.expect
index 492c9a2..56cba3c 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_keyword_setter_inherited_by_field.dart.strong.transformed.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-  set x(core::num value) → void {}
+  set x(core::num* value) → void {}
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  set x(covariant core::int value) → void {}
+  set x(covariant core::int* value) → void {}
 }
 class E extends core::Object implements self::D {
-  covariant field core::int x = null;
-  synthetic constructor •() → self::E
+  covariant field core::int* x = null;
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
index 3fb057f..5f46237 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl self::C::T value) → void {}
-  method f(generic-covariant-impl self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T* value) → void {}
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.x = 1.5;
   c.y = 1.5;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
index 3fb057f..5f46237 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.legacy.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl self::C::T value) → void {}
-  method f(generic-covariant-impl self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T* value) → void {}
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.x = 1.5;
   c.y = 1.5;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
index 034ccc0..8f154d7 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.outline.expect
@@ -2,17 +2,17 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T x;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* x;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  set y(generic-covariant-impl self::C::T value) → void
+  set y(generic-covariant-impl self::C::T* value) → void
     ;
-  method f(generic-covariant-impl self::C::T value) → void
+  method f(generic-covariant-impl self::C::T* value) → void
     ;
 }
-static method g(self::C<core::num> c) → void
+static method g(self::C<core::num*>* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
index 54237f9..771601a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl self::C::T value) → void {}
-  method f(generic-covariant-impl self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T* value) → void {}
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.{self::C::x} = 1.5;
   c.{self::C::y} = 1.5;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
index 54237f9..771601a 100644
--- a/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/covariant_setter.dart.strong.transformed.expect
@@ -2,19 +2,19 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set y(generic-covariant-impl self::C::T value) → void {}
-  method f(generic-covariant-impl self::C::T value) → void {
+  set y(generic-covariant-impl self::C::T* value) → void {}
+  method f(generic-covariant-impl self::C::T* value) → void {
     this.{self::C::x} = value;
     this.{self::C::y} = value;
   }
 }
-static method g(self::C<core::num> c) → void {
+static method g(self::C<core::num*>* c) → void {
   c.{self::C::x} = 1.5;
   c.{self::C::y} = 1.5;
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
index a6d4f4c..764de18 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.expect
@@ -2,18 +2,18 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl self::C::T x) → void {}
-  method f2(core::int x) → void {}
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(core::int* x) → void {}
 }
-class D extends self::C<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f1(covariant generic-covariant-impl core::int x) → void {}
+  method f1(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f1(1.5);
@@ -22,7 +22,7 @@
   d.f2(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
+  self::g1(new self::C::•<core::int*>());
   self::g2(new self::C::•<dynamic>());
   self::g1(new self::D::•());
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
index a6d4f4c..764de18 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.legacy.transformed.expect
@@ -2,18 +2,18 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl self::C::T x) → void {}
-  method f2(core::int x) → void {}
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(core::int* x) → void {}
 }
-class D extends self::C<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f1(covariant generic-covariant-impl core::int x) → void {}
+  method f1(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f1(1.5);
@@ -22,7 +22,7 @@
   d.f2(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
+  self::g1(new self::C::•<core::int*>());
   self::g2(new self::C::•<dynamic>());
   self::g1(new self::D::•());
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
index 6d8aa4a..f9f6fb7 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.outline.expect
@@ -2,18 +2,18 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f1(generic-covariant-impl self::C::T x) → void
+  method f1(generic-covariant-impl self::C::T* x) → void
     ;
-  method f2(core::int x) → void
+  method f2(core::int* x) → void
     ;
 }
-class D extends self::C<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
     ;
-  method f1(covariant generic-covariant-impl core::int x) → void
+  method f1(covariant generic-covariant-impl core::int* x) → void
     ;
 }
 static method g1(dynamic d) → void
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
index a6d4f4c..764de18 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.expect
@@ -2,18 +2,18 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl self::C::T x) → void {}
-  method f2(core::int x) → void {}
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(core::int* x) → void {}
 }
-class D extends self::C<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f1(covariant generic-covariant-impl core::int x) → void {}
+  method f1(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f1(1.5);
@@ -22,7 +22,7 @@
   d.f2(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
+  self::g1(new self::C::•<core::int*>());
   self::g2(new self::C::•<dynamic>());
   self::g1(new self::D::•());
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
index a6d4f4c..764de18 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation.dart.strong.transformed.expect
@@ -2,18 +2,18 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f1(generic-covariant-impl self::C::T x) → void {}
-  method f2(core::int x) → void {}
+  method f1(generic-covariant-impl self::C::T* x) → void {}
+  method f2(core::int* x) → void {}
 }
-class D extends self::C<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  method f1(covariant generic-covariant-impl core::int x) → void {}
+  method f1(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method g1(dynamic d) → void {
   d.f1(1.5);
@@ -22,7 +22,7 @@
   d.f2(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
+  self::g1(new self::C::•<core::int*>());
   self::g2(new self::C::•<dynamic>());
   self::g1(new self::D::•());
 }
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
index 205ca75..464fd94 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void {}
 }
 static method g1(dynamic d) → void {
-  d.f<core::num>(1.5);
+  d.f<core::num*>(1.5);
 }
 static method g2(dynamic d) → void {
   d.f(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
-  self::g2(new self::C::•<core::int>());
+  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_generic.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
index 205ca75..464fd94 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.legacy.transformed.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void {}
 }
 static method g1(dynamic d) → void {
-  d.f<core::num>(1.5);
+  d.f<core::num*>(1.5);
 }
 static method g2(dynamic d) → void {
   d.f(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
-  self::g2(new self::C::•<core::int>());
+  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_generic.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
index 65c7be8..ebf34c1 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.outline.expect
@@ -2,10 +2,10 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f<generic-covariant-impl U extends self::C::T = dynamic>(self::C::f::U x) → void
+  method f<generic-covariant-impl U extends self::C::T* = dynamic>(self::C::f::U* x) → void
     ;
 }
 static method g1(dynamic d) → void
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
index a88f0d1..e10d3a6 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
 }
 static method g1(dynamic d) → void {
-  d.f<core::num>(1.5);
+  d.f<core::num*>(1.5);
 }
 static method g2(dynamic d) → void {
   d.f(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
-  self::g2(new self::C::•<core::int>());
+  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_generic.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
index a88f0d1..e10d3a6 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_generic.dart.strong.transformed.expect
@@ -2,20 +2,20 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f<generic-covariant-impl U extends self::C::T = self::C::T>(self::C::f::U x) → void {}
+  method f<generic-covariant-impl U extends self::C::T* = self::C::T*>(self::C::f::U* x) → void {}
 }
 static method g1(dynamic d) → void {
-  d.f<core::num>(1.5);
+  d.f<core::num*>(1.5);
 }
 static method g2(dynamic d) → void {
   d.f(1.5);
 }
 static method test() → void {
-  self::g1(new self::C::•<core::int>());
-  self::g2(new self::C::•<core::int>());
+  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.legacy.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.expect
index 1fe2ff5..3da2151 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.expect
@@ -4,15 +4,19 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → self::C
+  constructor •(dynamic f) → self::C*
     : self::C::f = f, super core::Object::•()
     ;
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.f(1.5);
 }
-static method h(core::int i) → void {}
+static method h(core::int* i) → void {}
 static method test() → void {
-  self::g(new self::C::•(self::h));
+  self::g(new self::C::•(#C1));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect
index 1fe2ff5..3da2151 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.legacy.transformed.expect
@@ -4,15 +4,19 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → self::C
+  constructor •(dynamic f) → self::C*
     : self::C::f = f, super core::Object::•()
     ;
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.f(1.5);
 }
-static method h(core::int i) → void {}
+static method h(core::int* i) → void {}
 static method test() → void {
-  self::g(new self::C::•(self::h));
+  self::g(new self::C::•(#C1));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.outline.expect
index a96d631..8cb9905 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.outline.expect
@@ -4,12 +4,12 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → self::C
+  constructor •(dynamic f) → self::C*
     ;
 }
-static method g(self::C c) → void
+static method g(self::C* c) → void
   ;
-static method h(core::int i) → void
+static method h(core::int* i) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.expect
index 1431719..97552e1 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.expect
@@ -4,15 +4,19 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → self::C
+  constructor •(dynamic f) → self::C*
     : self::C::f = f, super core::Object::•()
     ;
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.{self::C::f}(1.5);
 }
-static method h(core::int i) → void {}
+static method h(core::int* i) → void {}
 static method test() → void {
-  self::g(new self::C::•(self::h));
+  self::g(new self::C::•(#C1));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
index 1431719..97552e1 100644
--- a/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/dynamic_invocation_of_getter.dart.strong.transformed.expect
@@ -4,15 +4,19 @@
 
 class C extends core::Object {
   field dynamic f;
-  constructor •(dynamic f) → self::C
+  constructor •(dynamic f) → self::C*
     : self::C::f = f, super core::Object::•()
     ;
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.{self::C::f}(1.5);
 }
-static method h(core::int i) → void {}
+static method h(core::int* i) → void {}
 static method test() → void {
-  self::g(new self::C::•(self::h));
+  self::g(new self::C::•(#C1));
 }
 static method main() → dynamic {}
+
+constants  {
+  #C1 = tearoff self::h
+}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
index 4a50297..c6b72a6 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num _) → void
+  forwarding-stub set x(generic-covariant-impl core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
index 4a50297..c6b72a6 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.legacy.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num _) → void
+  forwarding-stub set x(generic-covariant-impl core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
index 8bf7b77..c0fc717 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.outline.expect
@@ -2,20 +2,20 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
 class C extends core::Object {
-  field core::num x;
-  synthetic constructor •() → self::C
+  field core::num* x;
+  synthetic constructor •() → self::C*
     ;
 }
-class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(generic-covariant-impl core::num _) → void
+  forwarding-stub set x(generic-covariant-impl core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
index 4a50297..c6b72a6 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num _) → void
+  forwarding-stub set x(generic-covariant-impl core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
index 4a50297..c6b72a6 100644
--- a/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/field_forwarding_stub_generic_covariant.dart.strong.transformed.expect
@@ -2,23 +2,23 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::num x = null;
-  synthetic constructor •() → self::C
+  field core::num* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-class D extends self::C implements self::B<core::num> {
-  synthetic constructor •() → self::D
+class D extends self::C implements self::B<core::num*> {
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(generic-covariant-impl core::num _) → void
+  forwarding-stub set x(generic-covariant-impl core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
index 339d3dc..82351e5 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.expect
@@ -3,42 +3,48 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  field core::Object _x = null;
-  synthetic constructor •() → self::B
+  field core::Object* _x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f([core::num x = 10]) → void {
+  method f([core::num* x = #C1]) → void {
     this.{self::B::_x} = x;
   }
-  method g({core::num x = 20}) → void {
+  method g({core::num* x = #C2}) → void {
     this.{self::B::_x} = x;
   }
-  method check(core::Object expectedValue) → void {
+  method check(core::Object* expectedValue) → void {
     if(!this.{self::B::_x}.==(expectedValue)) {
       throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}}";
     }
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
-  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T* x = #C3]) → void;
+  abstract method g({generic-covariant-impl self::I::T* x = #C3}) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
+  forwarding-stub method f([generic-covariant-impl core::num* x = #C1]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
+  forwarding-stub method g({generic-covariant-impl core::num* x = #C2}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.f();
   c.check(10);
   c.g();
   c.check(20);
 }
+
+constants  {
+  #C1 = 10
+  #C2 = 20
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
index 339d3dc..82351e5 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.legacy.transformed.expect
@@ -3,42 +3,48 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  field core::Object _x = null;
-  synthetic constructor •() → self::B
+  field core::Object* _x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f([core::num x = 10]) → void {
+  method f([core::num* x = #C1]) → void {
     this.{self::B::_x} = x;
   }
-  method g({core::num x = 20}) → void {
+  method g({core::num* x = #C2}) → void {
     this.{self::B::_x} = x;
   }
-  method check(core::Object expectedValue) → void {
+  method check(core::Object* expectedValue) → void {
     if(!this.{self::B::_x}.==(expectedValue)) {
       throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}}";
     }
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
-  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T* x = #C3]) → void;
+  abstract method g({generic-covariant-impl self::I::T* x = #C3}) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
+  forwarding-stub method f([generic-covariant-impl core::num* x = #C1]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
+  forwarding-stub method g({generic-covariant-impl core::num* x = #C2}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.f();
   c.check(10);
   c.g();
   c.check(20);
 }
+
+constants  {
+  #C1 = 10
+  #C2 = 20
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
index d95ebff..dbb26c4 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.outline.expect
@@ -3,28 +3,28 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  field core::Object _x;
-  synthetic constructor •() → self::B
+  field core::Object* _x;
+  synthetic constructor •() → self::B*
     ;
-  method f([core::num x]) → void
+  method f([core::num* x = 10]) → void
     ;
-  method g({core::num x}) → void
+  method g({core::num* x = 20}) → void
     ;
-  method check(core::Object expectedValue) → void
+  method check(core::Object* expectedValue) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f([generic-covariant-impl self::I::T x]) → void;
-  abstract method g({generic-covariant-impl self::I::T x}) → void;
+  abstract method f([generic-covariant-impl self::I::T* x]) → void;
+  abstract method g({generic-covariant-impl self::I::T* x}) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x]) → void
+  forwarding-stub method f([generic-covariant-impl core::num* x]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x}) → void
+  forwarding-stub method g({generic-covariant-impl core::num* x}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
index 3474b5d..66ee36e 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.expect
@@ -3,42 +3,48 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  field core::Object _x = null;
-  synthetic constructor •() → self::B
+  field core::Object* _x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f([core::num x = 10]) → void {
+  method f([core::num* x = #C1]) → void {
     this.{self::B::_x} = x;
   }
-  method g({core::num x = 20}) → void {
+  method g({core::num* x = #C2}) → void {
     this.{self::B::_x} = x;
   }
-  method check(core::Object expectedValue) → void {
+  method check(core::Object* expectedValue) → void {
     if(!this.{self::B::_x}.{core::Object::==}(expectedValue)) {
       throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}}";
     }
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
-  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T* x = #C3]) → void;
+  abstract method g({generic-covariant-impl self::I::T* x = #C3}) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
+  forwarding-stub method f([generic-covariant-impl core::num* x = #C1]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
+  forwarding-stub method g({generic-covariant-impl core::num* x = #C2}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.{self::C::f}();
   c.{self::B::check}(10);
   c.{self::C::g}();
   c.{self::B::check}(20);
 }
+
+constants  {
+  #C1 = 10
+  #C2 = 20
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
index 3474b5d..66ee36e 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_default_values.dart.strong.transformed.expect
@@ -3,42 +3,48 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  field core::Object _x = null;
-  synthetic constructor •() → self::B
+  field core::Object* _x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f([core::num x = 10]) → void {
+  method f([core::num* x = #C1]) → void {
     this.{self::B::_x} = x;
   }
-  method g({core::num x = 20}) → void {
+  method g({core::num* x = #C2}) → void {
     this.{self::B::_x} = x;
   }
-  method check(core::Object expectedValue) → void {
+  method check(core::Object* expectedValue) → void {
     if(!this.{self::B::_x}.{core::Object::==}(expectedValue)) {
       throw "Expected _x == ${expectedValue}; got ${this.{self::B::_x}}";
     }
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f([generic-covariant-impl self::I::T x = null]) → void;
-  abstract method g({generic-covariant-impl self::I::T x = null}) → void;
+  abstract method f([generic-covariant-impl self::I::T* x = #C3]) → void;
+  abstract method g({generic-covariant-impl self::I::T* x = #C3}) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f([generic-covariant-impl core::num x = 10]) → void
+  forwarding-stub method f([generic-covariant-impl core::num* x = #C1]) → void
     return super.{self::B::f}(x);
-  forwarding-stub method g({generic-covariant-impl core::num x = 20}) → void
+  forwarding-stub method g({generic-covariant-impl core::num* x = #C2}) → void
     return super.{self::B::g}(x: x);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   c.{self::C::f}();
   c.{self::B::check}(10);
   c.{self::C::g}();
   c.{self::B::check}(20);
 }
+
+constants  {
+  #C1 = 10
+  #C2 = 20
+  #C3 = null
+}
diff --git a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
index 760fd0e..38a7f20 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::int* y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
+  forwarding-stub method f(generic-covariant-impl 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/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
index 760fd0e..38a7f20 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::int* y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
+  forwarding-stub method f(generic-covariant-impl 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/forwarding_stub_with_non_covariant_param.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
index 32a8732..d246713 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x, core::int y) → void
+  method f(core::int* x, core::int* y) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::int* y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
+  forwarding-stub method f(generic-covariant-impl 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/forwarding_stub_with_non_covariant_param.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
index 760fd0e..38a7f20 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::int* y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
+  forwarding-stub method f(generic-covariant-impl 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/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
index 760fd0e..38a7f20 100644
--- a/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/forwarding_stub_with_non_covariant_param.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::int y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::int* y) → void;
 }
-class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::int y) → void
+  forwarding-stub method f(generic-covariant-impl 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.legacy.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
index add41b9..d003b4d 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T* t) → void {}
 }
-class D extends core::Object implements self::C<core::num> {
-  generic-covariant-impl field core::num x = null;
-  generic-covariant-impl field core::num y = null;
-  synthetic constructor •() → self::D
+class D extends core::Object implements self::C<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  generic-covariant-impl field core::num* y = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
-class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl core::num t) → void {}
-  get y() → core::num
+  set x(generic-covariant-impl core::num* t) → void {}
+  get y() → core::num*
     return null;
-  set y(generic-covariant-impl core::num t) → void {}
+  set y(generic-covariant-impl core::num* t) → void {}
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
index add41b9..d003b4d 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T* t) → void {}
 }
-class D extends core::Object implements self::C<core::num> {
-  generic-covariant-impl field core::num x = null;
-  generic-covariant-impl field core::num y = null;
-  synthetic constructor •() → self::D
+class D extends core::Object implements self::C<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  generic-covariant-impl field core::num* y = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
-class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl core::num t) → void {}
-  get y() → core::num
+  set x(generic-covariant-impl core::num* t) → void {}
+  get y() → core::num*
     return null;
-  set y(generic-covariant-impl core::num t) → void {}
+  set y(generic-covariant-impl core::num* t) → void {}
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
index 53b0ab7..85f9256 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.outline.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T y;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* y;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  set x(generic-covariant-impl self::C::T t) → void
+  set x(generic-covariant-impl self::C::T* t) → void
     ;
 }
-class D extends core::Object implements self::C<core::num> {
-  generic-covariant-impl field core::num x;
-  generic-covariant-impl field core::num y;
-  synthetic constructor •() → self::D
+class D extends core::Object implements self::C<core::num*> {
+  generic-covariant-impl field core::num* x;
+  generic-covariant-impl field core::num* y;
+  synthetic constructor •() → self::D*
     ;
 }
-class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
     ;
-  set x(generic-covariant-impl core::num t) → void
+  set x(generic-covariant-impl core::num* t) → void
     ;
-  get y() → core::num
+  get y() → core::num*
     ;
-  set y(generic-covariant-impl core::num t) → void
+  set y(generic-covariant-impl core::num* t) → void
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
index add41b9..d003b4d 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T* t) → void {}
 }
-class D extends core::Object implements self::C<core::num> {
-  generic-covariant-impl field core::num x = null;
-  generic-covariant-impl field core::num y = null;
-  synthetic constructor •() → self::D
+class D extends core::Object implements self::C<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  generic-covariant-impl field core::num* y = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
-class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl core::num t) → void {}
-  get y() → core::num
+  set x(generic-covariant-impl core::num* t) → void {}
+  get y() → core::num*
     return null;
-  set y(generic-covariant-impl core::num t) → void {}
+  set y(generic-covariant-impl core::num* t) → void {}
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
index add41b9..d003b4d 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_covariance_inheritance_setter_field.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::C::T y = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::C::T* y = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl self::C::T t) → void {}
+  set x(generic-covariant-impl self::C::T* t) → void {}
 }
-class D extends core::Object implements self::C<core::num> {
-  generic-covariant-impl field core::num x = null;
-  generic-covariant-impl field core::num y = null;
-  synthetic constructor •() → self::D
+class D extends core::Object implements self::C<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  generic-covariant-impl field core::num* y = null;
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
-class E extends core::Object implements self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends core::Object implements self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-  set x(generic-covariant-impl core::num t) → void {}
-  get y() → core::num
+  set x(generic-covariant-impl core::num* t) → void {}
+  get y() → core::num*
     return null;
-  set y(generic-covariant-impl core::num t) → void {}
+  set y(generic-covariant-impl core::num* t) → void {}
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
index d50d07e..a2deda6 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(covariant core::Object value) → void;
+  abstract set x(covariant core::Object* value) → void;
 }
 class B extends core::Object implements self::A {
-  covariant field core::Object x = null;
-  synthetic constructor •() → self::B
+  covariant field core::Object* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::Object x) → void {}
+  method f(covariant core::Object* x) → void {}
 }
-class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  covariant generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(covariant generic-covariant-impl self::C::T x) → void {}
+  method f(covariant generic-covariant-impl self::C::T* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
index d50d07e..a2deda6 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.legacy.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(covariant core::Object value) → void;
+  abstract set x(covariant core::Object* value) → void;
 }
 class B extends core::Object implements self::A {
-  covariant field core::Object x = null;
-  synthetic constructor •() → self::B
+  covariant field core::Object* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::Object x) → void {}
+  method f(covariant core::Object* x) → void {}
 }
-class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  covariant generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(covariant generic-covariant-impl self::C::T x) → void {}
+  method f(covariant generic-covariant-impl self::C::T* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
index 037ffa8..16f729e 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.outline.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     ;
-  abstract set x(covariant core::Object value) → void;
+  abstract set x(covariant core::Object* value) → void;
 }
 class B extends core::Object implements self::A {
-  covariant field core::Object x;
-  synthetic constructor •() → self::B
+  covariant field core::Object* x;
+  synthetic constructor •() → self::B*
     ;
-  method f(covariant core::Object x) → void
+  method f(covariant core::Object* x) → void
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  covariant generic-covariant-impl field self::C::T x;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant generic-covariant-impl field self::C::T* x;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f(covariant generic-covariant-impl self::C::T x) → void
+  method f(covariant generic-covariant-impl self::C::T* x) → void
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
index d50d07e..a2deda6 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(covariant core::Object value) → void;
+  abstract set x(covariant core::Object* value) → void;
 }
 class B extends core::Object implements self::A {
-  covariant field core::Object x = null;
-  synthetic constructor •() → self::B
+  covariant field core::Object* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::Object x) → void {}
+  method f(covariant core::Object* x) → void {}
 }
-class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  covariant generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(covariant generic-covariant-impl self::C::T x) → void {}
+  method f(covariant generic-covariant-impl self::C::T* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
index d50d07e..a2deda6 100644
--- a/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/generic_vs_explicit_covariance.dart.strong.transformed.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract set x(covariant core::Object value) → void;
+  abstract set x(covariant core::Object* value) → void;
 }
 class B extends core::Object implements self::A {
-  covariant field core::Object x = null;
-  synthetic constructor •() → self::B
+  covariant field core::Object* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::Object x) → void {}
+  method f(covariant core::Object* x) → void {}
 }
-class C<T extends core::Object = dynamic> extends core::Object implements self::B {
-  covariant generic-covariant-impl field self::C::T x = null;
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object implements self::B {
+  covariant generic-covariant-impl field self::C::T* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  method f(covariant generic-covariant-impl self::C::T x) → void {}
+  method f(covariant generic-covariant-impl self::C::T* x) → void {}
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect
index 4624a30..2ccfa95 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → self::C
+  constructor •(core::Object* o) → self::C*
     : assert(o), super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect
index 4624a30..2ccfa95 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.legacy.transformed.expect
@@ -3,16 +3,16 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → self::C
+  constructor •(core::Object* o) → self::C*
     : assert(o), super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.outline.expect
index 25e616e..a0650ea 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.outline.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  constructor •(core::Object o) → self::C
+  constructor •(core::Object* o) → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.expect
index d9d3799..406e636 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.expect
@@ -3,16 +3,16 @@
 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::•()
+  constructor •(core::Object* o) → self::C*
+    : assert(o as{TypeError} core::bool*), super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.transformed.expect
index d9d3799..406e636 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_initializer.dart.strong.transformed.expect
@@ -3,16 +3,16 @@
 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::•()
+  constructor •(core::Object* o) → self::C*
+    : assert(o as{TypeError} core::bool*), super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect
index c773ddb..abc2a40 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     assert(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect
index c773ddb..abc2a40 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     assert(o);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.expect
index 00b7aeb..c4e012c 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    assert(o as{TypeError} core::bool);
+    assert(o as{TypeError} core::bool*);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.transformed.expect
index 00b7aeb..c4e012c 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_assert_statement.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    assert(o as{TypeError} core::bool);
+    assert(o as{TypeError} core::bool*);
     assert(false, "no exception");
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect
index c7d9f2f6..c640c24 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::bool b;
-  constructor •(core::Object o) → self::C
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
     : self::C::b = o, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect
index c7d9f2f6..c640c24 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.legacy.transformed.expect
@@ -3,17 +3,17 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::bool b;
-  constructor •(core::Object o) → self::C
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
     : self::C::b = o, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.outline.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.outline.expect
index 993ccb0..5824cc2 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.outline.expect
@@ -3,8 +3,8 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  field core::bool b;
-  constructor •(core::Object o) → self::C
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
     ;
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.expect
index 45d49ea..d1fac5e 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.expect
@@ -3,17 +3,17 @@
 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::•()
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
+    : self::C::b = o as{TypeError} core::bool*, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.transformed.expect
index 45d49ea..d1fac5e 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_constructor_initializer.dart.strong.transformed.expect
@@ -3,17 +3,17 @@
 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::•()
+  field core::bool* b;
+  constructor •(core::Object* o) → self::C*
+    : self::C::b = o as{TypeError} core::bool*, super core::Object::•()
     ;
 }
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     new self::C::•(o);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect
index 5601fbc..f734ce5 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     do {
     }
     while (o)
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect
index 5601fbc..f734ce5 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.legacy.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     do {
     }
     while (o)
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.expect
index 675bb70..21783cf 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     do {
     }
-    while (o as{TypeError} core::bool)
+    while (o as{TypeError} core::bool*)
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.transformed.expect
index 675bb70..21783cf 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_do.dart.strong.transformed.expect
@@ -3,13 +3,13 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     do {
     }
-    while (o as{TypeError} core::bool)
+    while (o as{TypeError} core::bool*)
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect
index 4b976d7..98b73a7 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    for (core::int i = 0; o; i = i.+(1)) {
+    for (core::int* i = 0; o; i = i.+(1)) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect
index 4b976d7..98b73a7 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    for (core::int i = 0; o; i = i.+(1)) {
+    for (core::int* i = 0; o; i = i.+(1)) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.expect
index 4689743..0cd35c4 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    for (core::int i = 0; o as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; o as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.transformed.expect
index 4689743..0cd35c4 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_for_condition.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    for (core::int i = 0; o as{TypeError} core::bool; i = i.{core::num::+}(1)) {
+    for (core::int* i = 0; o as{TypeError} core::bool*; i = i.{core::num::+}(1)) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect
index 9178d2a..3dc2277 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     if(o) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect
index 9178d2a..3dc2277 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     if(o) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.expect
index 3b1beed..dae4331 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    if(o as{TypeError} core::bool) {
+    if(o as{TypeError} core::bool*) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.transformed.expect
index 3b1beed..dae4331 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_if.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    if(o as{TypeError} core::bool) {
+    if(o as{TypeError} core::bool*) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect
index 5278cf9..a4cb6f1 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     !o;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect
index 5278cf9..a4cb6f1 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.legacy.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     !o;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.expect
index e60450a..84171e4 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    !(o as{TypeError} core::bool);
+    !(o as{TypeError} core::bool*);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.transformed.expect
index e60450a..84171e4 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_not.dart.strong.transformed.expect
@@ -3,11 +3,11 @@
 import "dart:core" as core;
 
 static method main() → void {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    !(o as{TypeError} core::bool);
+    !(o as{TypeError} core::bool*);
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect
index 2f67581..cc096f9 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     while (o) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect
index 2f67581..cc096f9 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.legacy.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
     while (o) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.expect
index 70f751d..f63e717 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    while (o as{TypeError} core::bool) {
+    while (o as{TypeError} core::bool*) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.transformed.expect
index 70f751d..f63e717 100644
--- a/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks/implicit_downcast_while.dart.strong.transformed.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 static method main() → dynamic {
-  core::Object o = 1;
+  core::Object* o = 1;
   try {
-    while (o as{TypeError} core::bool) {
+    while (o as{TypeError} core::bool*) {
     }
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
index 5862850..d6e919e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
+  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num* x) → void
     return super.{self::B::f}(x);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
index 5862850..d6e919e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
+  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num* x) → void
     return super.{self::B::f}(x);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
index c8141fe..1f230f5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::num x) → void
+  method f(core::num* x) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
+  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num* x) → void
     return super.{self::B::f}(x);
 }
 static method main() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
index 5862850..d6e919e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
+  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num* x) → void
     return super.{self::B::f}(x);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
index 5862850..d6e919e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/abstract_override_becomes_forwarding_stub.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::num x) → void {}
+  method f(core::num* x) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x) → void;
+  abstract method f(generic-covariant-impl self::I::T* x) → void;
 }
-class C extends self::B implements self::I<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B implements self::I<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl core::num x) → void
+  forwarding-stub forwarding-semi-stub method f(generic-covariant-impl 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 b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
index fa5945b..d08fb41 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart
@@ -31,7 +31,7 @@
 }
 
 test() {
-  var x = new D().g4 /*@checkReturn=(int) -> dynamic*/ () as F<Object>;
+  var x = new D().g4 /*@ checkReturn=(int*) ->* dynamic */ () as F<Object>;
   x('hi');
   new E().g1(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
index 2a7623e..3bfd6e1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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(generic-covariant-impl self::C::T x) → void {}
-  method g1(generic-covariant-impl self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T* x) → void {}
+  method g1(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g2(generic-covariant-impl self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T*>* c, generic-covariant-impl self::C::T* x) → void {
     c.f(x);
   }
-  method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T*) →* dynamic
     return this.{self::C::f};
 }
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
+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
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super self::C::•()
     ;
-  method f(covariant generic-covariant-impl core::int x) → void {}
+  method f(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method test() → dynamic {
-  dynamic x = new self::D::•().g4() as (core::Object) → dynamic;
+  dynamic x = new self::D::•().g4() as (core::Object*) →* dynamic;
   x.call("hi");
   new self::E::•().g1(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
index 2a7623e..3bfd6e1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.legacy.transformed.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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(generic-covariant-impl self::C::T x) → void {}
-  method g1(generic-covariant-impl self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T* x) → void {}
+  method g1(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g2(generic-covariant-impl self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T*>* c, generic-covariant-impl self::C::T* x) → void {
     c.f(x);
   }
-  method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T*) →* dynamic
     return this.{self::C::f};
 }
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
+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
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super self::C::•()
     ;
-  method f(covariant generic-covariant-impl core::int x) → void {}
+  method f(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method test() → dynamic {
-  dynamic x = new self::D::•().g4() as (core::Object) → dynamic;
+  dynamic x = new self::D::•().g4() as (core::Object*) →* dynamic;
   x.call("hi");
   new self::E::•().g1(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
index 1f6aacf..44e4b15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.outline.expect
@@ -2,29 +2,29 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* dynamic;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  method f(generic-covariant-impl self::C::T x) → void
+  method f(generic-covariant-impl self::C::T* x) → void
     ;
-  method g1(generic-covariant-impl self::C::T x) → void
+  method g1(generic-covariant-impl self::C::T* x) → void
     ;
-  method g2(generic-covariant-impl self::C::T x) → void
+  method g2(generic-covariant-impl self::C::T* x) → void
     ;
-  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void
+  method g3(generic-covariant-impl self::C<self::C::T*>* c, generic-covariant-impl self::C::T* x) → void
     ;
-  method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T*) →* dynamic
     ;
 }
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
+class D extends self::C<core::int*> {
+  synthetic constructor •() → self::D*
     ;
 }
-class E extends self::C<core::num> {
-  synthetic constructor •() → self::E
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
     ;
-  method f(covariant generic-covariant-impl core::int x) → void
+  method f(covariant generic-covariant-impl core::int* x) → void
     ;
 }
 static method test() → dynamic
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
index 50189fa..1bbff9a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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(generic-covariant-impl self::C::T x) → void {}
-  method g1(generic-covariant-impl self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T* x) → void {}
+  method g1(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g2(generic-covariant-impl self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T*>* c, generic-covariant-impl self::C::T* x) → void {
     c.{self::C::f}(x);
   }
-  method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T*) →* dynamic
     return this.{self::C::f};
 }
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
+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
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super self::C::•()
     ;
-  method f(covariant generic-covariant-impl core::int x) → void {}
+  method f(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method test() → dynamic {
-  (core::Object) → dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int) → dynamic) as (core::Object) → dynamic;
+  (core::Object*) →* dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int*) →* dynamic) as (core::Object*) →* dynamic;
   x.call("hi");
   new self::E::•().{self::C::g1}(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
index 50189fa..1bbff9a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/call_through_this.dart.strong.transformed.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → dynamic;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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(generic-covariant-impl self::C::T x) → void {}
-  method g1(generic-covariant-impl self::C::T x) → void {
+  method f(generic-covariant-impl self::C::T* x) → void {}
+  method g1(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g2(generic-covariant-impl self::C::T x) → void {
+  method g2(generic-covariant-impl self::C::T* x) → void {
     this.{self::C::f}(x);
   }
-  method g3(generic-covariant-impl self::C<self::C::T> c, generic-covariant-impl self::C::T x) → void {
+  method g3(generic-covariant-impl self::C<self::C::T*>* c, generic-covariant-impl self::C::T* x) → void {
     c.{self::C::f}(x);
   }
-  method g4() → (self::C::T) → dynamic
+  method g4() → (self::C::T*) →* dynamic
     return this.{self::C::f};
 }
-class D extends self::C<core::int> {
-  synthetic constructor •() → self::D
+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
+class E extends self::C<core::num*> {
+  synthetic constructor •() → self::E*
     : super self::C::•()
     ;
-  method f(covariant generic-covariant-impl core::int x) → void {}
+  method f(covariant generic-covariant-impl core::int* x) → void {}
 }
 static method test() → dynamic {
-  (core::Object) → dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int) → dynamic) as (core::Object) → dynamic;
+  (core::Object*) →* dynamic x = (new self::D::•().{self::C::g4}() as{TypeError} (core::int*) →* dynamic) as (core::Object*) →* dynamic;
   x.call("hi");
   new self::E::•().{self::C::g1}(1.5);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
index d272d69..961c46a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart
@@ -19,23 +19,23 @@
 }
 
 void test1(B<num, F<num>> b) {
-  b /*@checkReturn=B<num, (num) -> void>*/ += 1;
-  var x = b /*@checkReturn=B<num, (num) -> void>*/ += 2;
+  b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
+  var x = b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
 }
 
 void test2(C c) {
-  c[0] /*@checkReturn=B<num, (num) -> void>*/ += 1;
-  var x = c[0] /*@checkReturn=B<num, (num) -> void>*/ += 2;
+  c[0] /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
+  var x = c[0] /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
 }
 
 void test3(C c) {
-  c.x /*@checkReturn=B<num, (num) -> void>*/ += 1;
-  var x = c.x /*@checkReturn=B<num, (num) -> void>*/ += 2;
+  c.x /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
+  var x = c.x /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
 }
 
 void test4(C c) {
-  C.y /*@checkReturn=B<num, (num) -> void>*/ += 1;
-  var x = C.y /*@checkReturn=B<num, (num) -> void>*/ += 2;
+  C.y /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
+  var x = C.y /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
 }
 
 void main() {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect
index 96ac7ed..8cf1630 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T, self::B::U>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = dynamic> 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>
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
     return null;
 }
 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
+  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>
+  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 {}
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void {}
 }
-static method test1(self::B<core::num, (core::num) → void> b) → void {
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void {
   b = b.+(1);
   dynamic x = b = b.+(2);
 }
-static method test2(self::C c) → void {
+static method test2(self::C* c) → void {
   let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(1));
   dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(2) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
 }
-static method test3(self::C c) → void {
+static method test3(self::C* c) → void {
   let final dynamic #t7 = c in #t7.x = #t7.x.+(1);
   dynamic x = let final dynamic #t8 = c in #t8.x = #t8.x.+(2);
 }
-static method test4(self::C c) → void {
+static method test4(self::C* c) → void {
   self::C::y = self::C::y.+(1);
   dynamic x = self::C::y = self::C::y.+(2);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect
index 96ac7ed..8cf1630 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.legacy.transformed.expect
@@ -2,37 +2,37 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T, self::B::U>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = dynamic> 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>
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
     return null;
 }
 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
+  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>
+  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 {}
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void {}
 }
-static method test1(self::B<core::num, (core::num) → void> b) → void {
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void {
   b = b.+(1);
   dynamic x = b = b.+(2);
 }
-static method test2(self::C c) → void {
+static method test2(self::C* c) → void {
   let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(1));
   dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(2) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
 }
-static method test3(self::C c) → void {
+static method test3(self::C* c) → void {
   let final dynamic #t7 = c in #t7.x = #t7.x.+(1);
   dynamic x = let final dynamic #t8 = c in #t8.x = #t8.x.+(2);
 }
-static method test4(self::C c) → void {
+static method test4(self::C* c) → void {
   self::C::y = self::C::y.+(1);
   dynamic x = self::C::y = self::C::y.+(2);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
index a7fef48..2f68f15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.outline.expect
@@ -2,30 +2,30 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic, U extends (self::B::T) → void = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T, self::B::U>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*, self::B::U*>*
     ;
-  operator +(dynamic other) → self::B<self::B::T, (self::B::T) → void>
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
     ;
 }
 class C extends core::Object {
-  field self::B<core::num, (core::num) → void> x;
-  static field self::B<core::num, (core::num) → void> y;
-  synthetic constructor •() → self::C
+  field self::B<core::num*, (core::num*) →* void>* x;
+  static field self::B<core::num*, (core::num*) →* void>* y;
+  synthetic constructor •() → self::C*
     ;
-  operator [](core::int i) → self::B<core::num, (core::num) → void>
+  operator [](core::int* i) → self::B<core::num*, (core::num*) →* void>*
     ;
-  operator []=(core::int i, self::B<core::num, (core::num) → void> v) → void
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void
     ;
 }
-static method test1(self::B<core::num, (core::num) → void> b) → void
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void
   ;
-static method test2(self::C c) → void
+static method test2(self::C* c) → void
   ;
-static method test3(self::C c) → void
+static method test3(self::C* c) → void
   ;
-static method test4(self::C c) → void
+static method test4(self::C* c) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
index 5cb600d..2eba38e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.expect
@@ -2,38 +2,38 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic, U extends (self::B::T) → void = (dynamic) → void> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T, self::B::U>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (dynamic) →* 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>
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
     return null;
 }
 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
+  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>
+  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 {}
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void {}
 }
-static method test1(self::B<core::num, (core::num) → void> b) → void {
-  b = b.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
-  self::B<core::num, (core::num) → void> x = b = b.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void {
+  b = b.{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = b = b.{self::B::+}(2) as{TypeError} 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).{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → 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).{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void> in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
+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).{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* 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).{self::B::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>* in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) 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::+}(1) as{TypeError} 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::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test3(self::C* c) → void {
+  let final self::C* #t7 = c in #t7.{self::C::x} = #t7.{self::C::x}.{self::B::+}(1) as{TypeError} 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::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
 }
-static method test4(self::C c) → void {
-  self::C::y = self::C::y.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
-  self::B<core::num, (core::num) → void> x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test4(self::C* c) → void {
+  self::C::y = self::C::y.{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
index 5cb600d..2eba38e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.strong.transformed.expect
@@ -2,38 +2,38 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic, U extends (self::B::T) → void = (dynamic) → void> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T, self::B::U>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic, U extends (self::B::T*) →* void = (dynamic) →* 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>
+  operator +(dynamic other) → self::B<self::B::T*, (self::B::T*) →* void>*
     return null;
 }
 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
+  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>
+  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 {}
+  operator []=(core::int* i, self::B<core::num*, (core::num*) →* void>* v) → void {}
 }
-static method test1(self::B<core::num, (core::num) → void> b) → void {
-  b = b.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
-  self::B<core::num, (core::num) → void> x = b = b.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test1(self::B<core::num*, (core::num*) →* void>* b) → void {
+  b = b.{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = b = b.{self::B::+}(2) as{TypeError} 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).{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → 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).{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void> in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
+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).{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* 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).{self::B::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>* in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) 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::+}(1) as{TypeError} 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::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test3(self::C* c) → void {
+  let final self::C* #t7 = c in #t7.{self::C::x} = #t7.{self::C::x}.{self::B::+}(1) as{TypeError} 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::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
 }
-static method test4(self::C c) → void {
-  self::C::y = self::C::y.{self::B::+}(1) as{TypeError} self::B<core::num, (core::num) → void>;
-  self::B<core::num, (core::num) → void> x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError} self::B<core::num, (core::num) → void>;
+static method test4(self::C* c) → void {
+  self::C::y = self::C::y.{self::B::+}(1) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
+  self::B<core::num*, (core::num*) →* void>* x = self::C::y = self::C::y.{self::B::+}(2) as{TypeError} self::B<core::num*, (core::num*) →* void>*;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
index d9c1892..0a2841f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart.type_promotion.expect
@@ -1,6 +1,6 @@
-pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:22:44: Context: Write to b@535
-  b /*@checkReturn=B<num, (num) -> void>*/ += 1;
-                                           ^^
-pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:23:52: Context: Write to b@535
-  var x = b /*@checkReturn=B<num, (num) -> void>*/ += 2;
-                                                   ^^
+pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:22:50: Context: Write to b@535
+  b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 1;
+                                                 ^^
+pkg/front_end/testcases/runtime_checks_new/contravariant_combiner.dart:23:58: Context: Write to b@535
+  var x = b /*@ checkReturn=B<num*, (num*) ->* void>* */ += 2;
+                                                         ^^
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
index ed38b37..f1fa94d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart
@@ -46,11 +46,11 @@
   // But not this one:
   //   (num)->num
   D d = new D(new C(numToInt));
-  d.value /*@checkReturn=(num) -> num*/ += 1;
+  d.value /*@ checkReturn=(num*) ->* num* */ += 1;
   expect(d.setValue(0), 1);
   d = new D(new C(numToNum));
   expectTypeError(() {
-    d.value /*@checkReturn=(num) -> num*/ += 1;
+    d.value /*@ checkReturn=(num*) ->* num* */ += 1;
   });
   expect(d.setValue, null);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
index 519326d..0b87491 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.outline.expect
@@ -2,30 +2,30 @@
 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>
+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*>*
     ;
-  operator +(core::int i) → (self::C::T) → core::num
+  operator +(core::int* i) → (self::C::T*) →* core::num*
     ;
 }
 class D extends core::Object {
-  final field self::C<core::num> getValue;
-  field (core::int) → core::int setValue;
-  constructor •(self::C<core::num> getValue) → self::D
+  final field self::C<core::num*>* getValue;
+  field (core::int*) →* core::int* setValue;
+  constructor •(self::C<core::num*>* getValue) → self::D*
     ;
-  get value() → self::C<core::num>
+  get value() → self::C<core::num*>*
     ;
-  set value((core::int) → core::int value) → void
+  set value((core::int*) →* core::int* value) → void
     ;
 }
-static method expectTypeError(() → void callback) → void
+static method expectTypeError(() →* void callback) → void
   ;
-static method expect(core::Object value, core::Object expected) → void
+static method expect(core::Object* value, core::Object* expected) → void
   ;
-static method numToInt(core::num n) → core::int
+static method numToInt(core::num* n) → core::int*
   ;
-static method numToNum(core::num n) → core::num
+static method numToNum(core::num* n) → core::num*
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
index 4e19f32..6c00c8a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.expect
@@ -2,69 +2,74 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-//   d.value /*@checkReturn=(num) -> num*/ += 1;
-//                                         ^
+//   d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+//                                              ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-//     d.value /*@checkReturn=(num) -> num*/ += 1;
-//                                           ^
+//     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>
+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
+  operator +(core::int* i) → (self::C::T*) →* core::num*
     return this.{self::C::plusResult};
 }
 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
+  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>
+  get value() → self::C<core::num*>*
     return this.{self::D::getValue};
-  set value((core::int) → core::int value) → void {
+  set value((core::int*) →* core::int* value) → void {
     this.{self::D::setValue} = value;
   }
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method numToInt(core::num n) → core::int
+static method numToInt(core::num* n) → core::int*
   return 1;
-static method numToNum(core::num n) → core::num
+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>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+  self::D* d = new self::D::•(new self::C::•<core::num*>(#C1));
+  let final self::D* #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-  d.value /*@checkReturn=(num) -> num*/ += 1;
-                                        ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
+  d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                             ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(d.{self::D::setValue}(0), 1);
-  d = new self::D::•(new self::C::•<core::num>(self::numToNum));
-  self::expectTypeError(() → core::Null {
-    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+  d = new self::D::•(new self::C::•<core::num*>(#C2));
+  self::expectTypeError(() → core::Null* {
+    let final self::D* #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-    d.value /*@checkReturn=(num) -> num*/ += 1;
-                                          ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
+    d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                               ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   });
   self::expect(d.{self::D::setValue}, null);
 }
+
+constants  {
+  #C1 = tearoff self::numToInt
+  #C2 = tearoff self::numToNum
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
index 4e19f32..6c00c8a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart.strong.transformed.expect
@@ -2,69 +2,74 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-//   d.value /*@checkReturn=(num) -> num*/ += 1;
-//                                         ^
+//   d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+//                                              ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+// 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)'.
 // Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-//     d.value /*@checkReturn=(num) -> num*/ += 1;
-//                                           ^
+//     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>
+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
+  operator +(core::int* i) → (self::C::T*) →* core::num*
     return this.{self::C::plusResult};
 }
 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
+  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>
+  get value() → self::C<core::num*>*
     return this.{self::D::getValue};
-  set value((core::int) → core::int value) → void {
+  set value((core::int*) →* core::int* value) → void {
     this.{self::D::setValue} = value;
   }
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method numToInt(core::num n) → core::int
+static method numToInt(core::num* n) → core::int*
   return 1;
-static method numToNum(core::num n) → core::num
+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>(self::numToInt));
-  let final self::D #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:49:41: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+  self::D* d = new self::D::•(new self::C::•<core::num*>(#C1));
+  let final self::D* #t1 = d in #t1.{self::D::value} = let final<BottomType> #t2 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-  d.value /*@checkReturn=(num) -> num*/ += 1;
-                                        ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
+  d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                             ^" in (#t1.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   self::expect(d.{self::D::setValue}(0), 1);
-  d = new self::D::•(new self::C::•<core::num>(self::numToNum));
-  self::expectTypeError(() → core::Null {
-    let final self::D #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast.dart:53:43: Error: A value of type 'num Function(num)' can't be assigned to a variable of type 'int Function(int)'.
+  d = new self::D::•(new self::C::•<core::num*>(#C2));
+  self::expectTypeError(() → core::Null* {
+    let final self::D* #t3 = d in #t3.{self::D::value} = let final<BottomType> #t4 = 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)'.
 Try changing the type of the left hand side, or casting the right hand side to 'int Function(int)'.
-    d.value /*@checkReturn=(num) -> num*/ += 1;
-                                          ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num) → core::num) as{TypeError} (core::int) → core::int;
+    d.value /*@ checkReturn=(num*) ->* num* */ += 1;
+                                               ^" in (#t3.{self::D::value}.{self::C::+}(1) as{TypeError} (core::num*) →* core::num*) as{TypeError} (core::int*) →* core::int*;
   });
   self::expect(d.{self::D::setValue}, null);
 }
+
+constants  {
+  #C1 = tearoff self::numToInt
+  #C2 = tearoff self::numToNum
+}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
index 0aeccbf..f68ef5b 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart
@@ -17,10 +17,10 @@
 }
 
 void test(C<num> c) {
-  c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-  var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-  c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-  var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
+  c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+  var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+  c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+  var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
index 5b0622b..57734d4 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  get x() → self::B<(self::C::T*) →* void>*
     return null;
-  set x(self::B<(self::C::T) → void> value) → void {}
+  set x(self::B<(self::C::T*) →* void>* value) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  let final dynamic #t1 = c in #t1.x = #t1.x.+(new self::B::•<core::num>());
-  dynamic y = let final dynamic #t2 = c in #t2.x = #t2.x.+(new self::B::•<core::num>());
-  let final dynamic #t3 = c in #t3.x.==(null) ? #t3.x = new self::B::•<core::num>() : null;
-  dynamic z = let final dynamic #t4 = c in let final dynamic #t5 = #t4.x in #t5.==(null) ? #t4.x = new self::B::•<core::num>() : #t5;
+static method test(self::C<core::num*>* c) → void {
+  let final dynamic #t1 = c in #t1.x = #t1.x.+(new self::B::•<core::num*>());
+  dynamic y = let final dynamic #t2 = c in #t2.x = #t2.x.+(new self::B::•<core::num*>());
+  let final dynamic #t3 = c in #t3.x.==(null) ? #t3.x = new self::B::•<core::num*>() : null;
+  dynamic z = let final dynamic #t4 = c in let final dynamic #t5 = #t4.x in #t5.==(null) ? #t4.x = new self::B::•<core::num*>() : #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
index 5b0622b..57734d4 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.legacy.transformed.expect
@@ -2,26 +2,26 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  get x() → self::B<(self::C::T*) →* void>*
     return null;
-  set x(self::B<(self::C::T) → void> value) → void {}
+  set x(self::B<(self::C::T*) →* void>* value) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  let final dynamic #t1 = c in #t1.x = #t1.x.+(new self::B::•<core::num>());
-  dynamic y = let final dynamic #t2 = c in #t2.x = #t2.x.+(new self::B::•<core::num>());
-  let final dynamic #t3 = c in #t3.x.==(null) ? #t3.x = new self::B::•<core::num>() : null;
-  dynamic z = let final dynamic #t4 = c in let final dynamic #t5 = #t4.x in #t5.==(null) ? #t4.x = new self::B::•<core::num>() : #t5;
+static method test(self::C<core::num*>* c) → void {
+  let final dynamic #t1 = c in #t1.x = #t1.x.+(new self::B::•<core::num*>());
+  dynamic y = let final dynamic #t2 = c in #t2.x = #t2.x.+(new self::B::•<core::num*>());
+  let final dynamic #t3 = c in #t3.x.==(null) ? #t3.x = new self::B::•<core::num*>() : null;
+  dynamic z = let final dynamic #t4 = c in let final dynamic #t5 = #t4.x in #t5.==(null) ? #t4.x = new self::B::•<core::num*>() : #t5;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
index 2df9ad8f..49528d6 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.outline.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  get x() → self::B<(self::C::T) → void>
+  get x() → self::B<(self::C::T*) →* void>*
     ;
-  set x(self::B<(self::C::T) → void> value) → void
+  set x(self::B<(self::C::T*) →* void>* value) → void
     ;
 }
-static method test(self::C<core::num> c) → void
+static method test(self::C<core::num*>* c) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
index 8b146df..09538b1 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-//                                                 ^
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+//                                                      ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-//                                                         ^
+//   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:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-//                                                  ^
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                       ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-//                                                          ^
+//   var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                               ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  get x() → self::B<(self::C::T*) →* void>*
     return null;
-  set x(self::B<(self::C::T) → void> value) → void {}
+  set x(self::B<(self::C::T*) →* void>* value) → void {}
 }
-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} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+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} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  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> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  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>* y = let final self::C<core::num*>* #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-                                                        ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+                                                             ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
+  let final self::C<core::num*>* #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<core::Object*>*} #t5.{self::C::x} = let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  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> #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  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*>* #t7 = c in let final dynamic #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num*) →* void>* in #t8.{core::Object::==}(null) ?{self::B<core::Object*>*} #t7.{self::C::x} = let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-                                                         ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : #t8;
+  var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+                                                              ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : #t8;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
index 4f445ca..3b5cd11 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart.strong.transformed.expect
@@ -2,69 +2,69 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+// 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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-//                                                 ^
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+//                                                      ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-//                                                         ^
+//   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:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-//                                                  ^
+//   c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                       ^
 //
-// pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(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'.
 // Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-//   var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-//                                                          ^
+//   var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+//                                                               ^
 //
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  get x() → self::B<(self::C::T*) →* void>*
     return null;
-  set x(self::B<(self::C::T) → void> value) → void {}
+  set x(self::B<(self::C::T*) →* void>* value) → void {}
 }
-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} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t2 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:20:49: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+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} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t2 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  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> y = let final self::C<core::num> #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num) → void>).{self::B::+}(let final<BottomType> #t4 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:21:57: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  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>* y = let final self::C<core::num*>* #t3 = c in #t3.{self::C::x} = (#t3.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(let final<BottomType> #t4 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  var y = c. /*@checkReturn=B<(num) -> void>*/ x += new B<num>();
-                                                        ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void>);
-  let final self::C<core::num> #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<core::Object>} #t5.{self::C::x} = let final<BottomType> #t6 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:22:50: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  var y = c. /*@ checkReturn=B<(num*) ->* void>* */ x += new B<num>();
+                                                             ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>*);
+  let final self::C<core::num*>* #t5 = c in (#t5.{self::C::x} as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<core::Object*>*} #t5.{self::C::x} = let final<BottomType> #t6 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  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> #t7 = c in let final self::B<(core::num) → void> #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num) → void> in #t8.{core::Object::==}(null) ?{self::B<core::Object>} #t7.{self::C::x} = let final<BottomType> #t9 = invalid-expression "pkg/front_end/testcases/runtime_checks_new/contravariant_getter_return_compound_assign.dart:23:58: Error: A value of type 'B<num>' can't be assigned to a variable of type 'B<void Function(num)>'.
+  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*>* #t7 = c in let final self::B<(core::num*) →* void>* #t8 = #t7.{self::C::x} as{TypeError} self::B<(core::num*) →* void>* in #t8.{core::Object::==}(null) ?{self::B<core::Object*>*} #t7.{self::C::x} = let final<BottomType> #t9 = 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'.
 Try changing the type of the left hand side, or casting the right hand side to 'B<void Function(num)>'.
-  var z = c. /*@checkReturn=B<(num) -> void>*/ x ??= new B<num>();
-                                                         ^" in new self::B::•<core::num>() as{TypeError} self::B<(core::num) → void> : #t8;
+  var z = c. /*@ checkReturn=B<(num*) ->* void>* */ x ??= new B<num>();
+                                                              ^" in new self::B::•<core::num*>() as{TypeError} self::B<(core::num*) →* void>* : #t8;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
index ea53d03..ea34543 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart
@@ -18,10 +18,10 @@
 
 void test(C<num> c) {
   c[0] = new B<F<num>>();
-  c /*@checkReturn=B<(num) -> void>*/ [0] += new B<F<num>>();
-  var x = c /*@checkReturn=B<(num) -> void>*/ [0] += new B<F<num>>();
-  c /*@checkReturn=B<(num) -> void>*/ [0] ??= new B<F<num>>();
-  var y = c /*@checkReturn=B<(num) -> void>*/ [0] ??= new B<F<num>>();
+  c /*@ checkReturn=B<(num*) ->* void>* */ [0] += new B<F<num>>();
+  var x = c /*@ checkReturn=B<(num*) ->* void>* */ [0] += new B<F<num>>();
+  c /*@ checkReturn=B<(num*) ->* void>* */ [0] ??= new B<F<num>>();
+  var y = c /*@ checkReturn=B<(num*) ->* void>* */ [0] ??= new B<F<num>>();
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
index 3345c98..1749a5d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
     return null;
-  operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  c.[]=(0, new self::B::•<(core::num) → void>());
-  let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(new self::B::•<(core::num) → void>()));
-  dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(new self::B::•<(core::num) → void>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
-  let final dynamic #t7 = c in let final dynamic #t8 = 0 in #t7.[](#t8).==(null) ? let final dynamic #t9 = new self::B::•<(core::num) → void>() in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9 : null;
-  dynamic y = let final dynamic #t11 = c in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12) in #t13.==(null) ? let final dynamic #t14 = new self::B::•<(core::num) → void>() in let final dynamic #t15 = #t11.[]=(#t12, #t14) in #t14 : #t13;
+static method test(self::C<core::num*>* c) → void {
+  c.[]=(0, new self::B::•<(core::num*) →* void>());
+  let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(new self::B::•<(core::num*) →* void>()));
+  dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(new self::B::•<(core::num*) →* void>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
+  let final dynamic #t7 = c in let final dynamic #t8 = 0 in #t7.[](#t8).==(null) ? let final dynamic #t9 = new self::B::•<(core::num*) →* void>() in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9 : null;
+  dynamic y = let final dynamic #t11 = c in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12) in #t13.==(null) ? let final dynamic #t14 = new self::B::•<(core::num*) →* void>() in let final dynamic #t15 = #t11.[]=(#t12, #t14) in #t14 : #t13;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
index 3345c98..1749a5d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
     return null;
-  operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  c.[]=(0, new self::B::•<(core::num) → void>());
-  let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(new self::B::•<(core::num) → void>()));
-  dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(new self::B::•<(core::num) → void>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
-  let final dynamic #t7 = c in let final dynamic #t8 = 0 in #t7.[](#t8).==(null) ? let final dynamic #t9 = new self::B::•<(core::num) → void>() in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9 : null;
-  dynamic y = let final dynamic #t11 = c in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12) in #t13.==(null) ? let final dynamic #t14 = new self::B::•<(core::num) → void>() in let final dynamic #t15 = #t11.[]=(#t12, #t14) in #t14 : #t13;
+static method test(self::C<core::num*>* c) → void {
+  c.[]=(0, new self::B::•<(core::num*) →* void>());
+  let final dynamic #t1 = c in let final dynamic #t2 = 0 in #t1.[]=(#t2, #t1.[](#t2).+(new self::B::•<(core::num*) →* void>()));
+  dynamic x = let final dynamic #t3 = c in let final dynamic #t4 = 0 in let final dynamic #t5 = #t3.[](#t4).+(new self::B::•<(core::num*) →* void>()) in let final dynamic #t6 = #t3.[]=(#t4, #t5) in #t5;
+  let final dynamic #t7 = c in let final dynamic #t8 = 0 in #t7.[](#t8).==(null) ? let final dynamic #t9 = new self::B::•<(core::num*) →* void>() in let final dynamic #t10 = #t7.[]=(#t8, #t9) in #t9 : null;
+  dynamic y = let final dynamic #t11 = c in let final dynamic #t12 = 0 in let final dynamic #t13 = #t11.[](#t12) in #t13.==(null) ? let final dynamic #t14 = new self::B::•<(core::num*) →* void>() in let final dynamic #t15 = #t11.[]=(#t12, #t14) in #t14 : #t13;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
index bb5426d..cc2df81 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.outline.expect
@@ -2,22 +2,22 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  operator +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     ;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  operator [](core::int i) → self::B<(self::C::T) → void>
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
     ;
-  operator []=(core::int i, self::B<(self::C::T) → void> x) → void
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void
     ;
 }
-static method test(self::C<core::num> c) → void
+static method test(self::C<core::num*>* c) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
index f00a907..1f89703 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
     return null;
-  operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  c.{self::C::[]=}(0, new self::B::•<(core::num) → 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) as{TypeError} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → 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) as{TypeError} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → void>()) in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
-  let final self::C<core::num> #t7 = c in let final core::int #t8 = 0 in (#t7.{self::C::[]}(#t8) as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<(core::num) → void>} let final self::B<(core::num) → void> #t9 = new self::B::•<(core::num) → void>() in let final void #t10 = #t7.{self::C::[]=}(#t8, #t9) in #t9 : null;
-  self::B<(core::num) → void> y = let final self::C<core::num> #t11 = c in let final core::int #t12 = 0 in let final self::B<(core::num) → void> #t13 = #t11.{self::C::[]}(#t12) as{TypeError} self::B<(core::num) → void> in #t13.{core::Object::==}(null) ?{self::B<(core::num) → void>} let final self::B<(core::num) → void> #t14 = new self::B::•<(core::num) → void>() in let final void #t15 = #t11.{self::C::[]=}(#t12, #t14) in #t14 : #t13;
+static method test(self::C<core::num*>* c) → void {
+  c.{self::C::[]=}(0, new self::B::•<(core::num*) →* 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) as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* 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) as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* void>()) in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
+  let final self::C<core::num*>* #t7 = c in let final core::int* #t8 = 0 in (#t7.{self::C::[]}(#t8) as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t9 = new self::B::•<(core::num*) →* void>() in let final void #t10 = #t7.{self::C::[]=}(#t8, #t9) in #t9 : null;
+  self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t11 = c in let final core::int* #t12 = 0 in let final self::B<(core::num*) →* void>* #t13 = #t11.{self::C::[]}(#t12) as{TypeError} self::B<(core::num*) →* void>* in #t13.{core::Object::==}(null) ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t14 = new self::B::•<(core::num*) →* void>() in let final void #t15 = #t11.{self::C::[]=}(#t12, #t14) in #t14 : #t13;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
index f00a907..1f89703 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_assign.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class B<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::B<self::B::T>
+typedef F<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 +(generic-covariant-impl self::B<self::B::T> other) → self::B<self::B::T>
+  operator +(generic-covariant-impl self::B<self::B::T*>* other) → self::B<self::B::T*>*
     return null;
 }
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+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>
+  operator [](core::int* i) → self::B<(self::C::T*) →* void>*
     return null;
-  operator []=(core::int i, self::B<(self::C::T) → void> x) → void {}
+  operator []=(core::int* i, self::B<(self::C::T*) →* void>* x) → void {}
 }
-static method test(self::C<core::num> c) → void {
-  c.{self::C::[]=}(0, new self::B::•<(core::num) → 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) as{TypeError} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → 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) as{TypeError} self::B<(core::num) → void>).{self::B::+}(new self::B::•<(core::num) → void>()) in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
-  let final self::C<core::num> #t7 = c in let final core::int #t8 = 0 in (#t7.{self::C::[]}(#t8) as{TypeError} self::B<(core::num) → void>).{core::Object::==}(null) ?{self::B<(core::num) → void>} let final self::B<(core::num) → void> #t9 = new self::B::•<(core::num) → void>() in let final void #t10 = #t7.{self::C::[]=}(#t8, #t9) in #t9 : null;
-  self::B<(core::num) → void> y = let final self::C<core::num> #t11 = c in let final core::int #t12 = 0 in let final self::B<(core::num) → void> #t13 = #t11.{self::C::[]}(#t12) as{TypeError} self::B<(core::num) → void> in #t13.{core::Object::==}(null) ?{self::B<(core::num) → void>} let final self::B<(core::num) → void> #t14 = new self::B::•<(core::num) → void>() in let final void #t15 = #t11.{self::C::[]=}(#t12, #t14) in #t14 : #t13;
+static method test(self::C<core::num*>* c) → void {
+  c.{self::C::[]=}(0, new self::B::•<(core::num*) →* 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) as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* 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) as{TypeError} self::B<(core::num*) →* void>*).{self::B::+}(new self::B::•<(core::num*) →* void>()) in let final void #t6 = #t3.{self::C::[]=}(#t4, #t5) in #t5;
+  let final self::C<core::num*>* #t7 = c in let final core::int* #t8 = 0 in (#t7.{self::C::[]}(#t8) as{TypeError} self::B<(core::num*) →* void>*).{core::Object::==}(null) ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t9 = new self::B::•<(core::num*) →* void>() in let final void #t10 = #t7.{self::C::[]=}(#t8, #t9) in #t9 : null;
+  self::B<(core::num*) →* void>* y = let final self::C<core::num*>* #t11 = c in let final core::int* #t12 = 0 in let final self::B<(core::num*) →* void>* #t13 = #t11.{self::C::[]}(#t12) as{TypeError} self::B<(core::num*) →* void>* in #t13.{core::Object::==}(null) ?{self::B<(core::num*) →* void>*} let final self::B<(core::num*) →* void>* #t14 = new self::B::•<(core::num*) →* void>() in let final void #t15 = #t11.{self::C::[]=}(#t12, #t14) in #t14 : #t13;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
index 722ec8b..adf83c0 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart
@@ -12,7 +12,7 @@
 }
 
 F<num> test(C<num> c) {
-  return c /*@checkReturn=(num) -> void*/ [0];
+  return c /*@ checkReturn=(num*) ->* void */ [0];
 }
 
 main() {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect
index c364e4f..c966117 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  operator [](core::int* i) → (self::C::T*) →* void
     return null;
 }
-static method test(self::C<core::num> c) → (core::num) → void {
+static method test(self::C<core::num*>* c) → (core::num*) →* void {
   return c.[](0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect
index c364e4f..c966117 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.legacy.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  operator [](core::int* i) → (self::C::T*) →* void
     return null;
 }
-static method test(self::C<core::num> c) → (core::num) → void {
+static method test(self::C<core::num*>* c) → (core::num*) →* void {
   return c.[](0);
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
index ea44fde..2a81a13 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.outline.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<T extends core::Object* = dynamic> = (T*) →* void;
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  operator [](core::int i) → (self::C::T) → void
+  operator [](core::int* i) → (self::C::T*) →* void
     ;
 }
-static method test(self::C<core::num> c) → (core::num) → void
+static method test(self::C<core::num*>* c) → (core::num*) →* void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
index e373f2c..d4e90dc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  operator [](core::int* i) → (self::C::T*) →* void
     return null;
 }
-static method test(self::C<core::num> c) → (core::num) → void {
-  return c.{self::C::[]}(0) as{TypeError} (core::num) → void;
+static method test(self::C<core::num*>* c) → (core::num*) →* void {
+  return c.{self::C::[]}(0) as{TypeError} (core::num*) →* void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
index e373f2c..d4e90dc 100644
--- a/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/contravariant_index_get.dart.strong.transformed.expect
@@ -2,15 +2,15 @@
 import self as self;
 import "dart:core" as core;
 
-typedef F<T extends core::Object = dynamic> = (T) → void;
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+typedef F<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
+  operator [](core::int* i) → (self::C::T*) →* void
     return null;
 }
-static method test(self::C<core::num> c) → (core::num) → void {
-  return c.{self::C::[]}(0) as{TypeError} (core::num) → void;
+static method test(self::C<core::num*>* c) → (core::num*) →* void {
+  return c.{self::C::[]}(0) as{TypeError} (core::num*) →* void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
index 9addeea..3ebdc3a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.expect
@@ -2,26 +2,30 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x) → void {}
-  method g({generic-covariant-impl self::B::T x = null}) → void {}
-  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void {}
+  method f(generic-covariant-impl self::B::T* x) → void {}
+  method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
+  method h<generic-covariant-impl U extends self::B::T* = dynamic>() → void {}
 }
-class C extends self::B<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method g1(self::B<core::num> b) → void {
+static method g1(self::B<core::num*>* b) → void {
   b.f(1.5);
 }
-static method g2(self::C c) → void {
+static method g2(self::C* c) → void {
   c.f(1);
 }
 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/derived_class_typed.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
index 9addeea..3ebdc3a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.legacy.transformed.expect
@@ -2,26 +2,30 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x) → void {}
-  method g({generic-covariant-impl self::B::T x = null}) → void {}
-  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void {}
+  method f(generic-covariant-impl self::B::T* x) → void {}
+  method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
+  method h<generic-covariant-impl U extends self::B::T* = dynamic>() → void {}
 }
-class C extends self::B<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method g1(self::B<core::num> b) → void {
+static method g1(self::B<core::num*>* b) → void {
   b.f(1.5);
 }
-static method g2(self::C c) → void {
+static method g2(self::C* c) → void {
   c.f(1);
 }
 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/derived_class_typed.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
index 88a2113..63c538e 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.outline.expect
@@ -2,23 +2,23 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  method f(generic-covariant-impl self::B::T x) → void
+  method f(generic-covariant-impl self::B::T* x) → void
     ;
-  method g({generic-covariant-impl self::B::T x}) → void
+  method g({generic-covariant-impl self::B::T* x}) → void
     ;
-  method h<generic-covariant-impl U extends self::B::T = dynamic>() → void
+  method h<generic-covariant-impl U extends self::B::T* = dynamic>() → void
     ;
 }
-class C extends self::B<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
     ;
 }
-static method g1(self::B<core::num> b) → void
+static method g1(self::B<core::num*>* b) → void
   ;
-static method g2(self::C c) → void
+static method g2(self::C* c) → void
   ;
 static method test() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
index abc52e0..8c00f76 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.expect
@@ -2,26 +2,30 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x) → void {}
-  method g({generic-covariant-impl self::B::T x = null}) → void {}
-  method h<generic-covariant-impl U extends self::B::T = self::B::T>() → void {}
+  method f(generic-covariant-impl self::B::T* x) → void {}
+  method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
+  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void {}
 }
-class C extends self::B<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method g1(self::B<core::num> b) → void {
+static method g1(self::B<core::num*>* b) → void {
   b.{self::B::f}(1.5);
 }
-static method g2(self::C c) → void {
+static method g2(self::C* c) → void {
   c.{self::B::f}(1);
 }
 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/derived_class_typed.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
index abc52e0..8c00f76 100644
--- a/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/derived_class_typed.dart.strong.transformed.expect
@@ -2,26 +2,30 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x) → void {}
-  method g({generic-covariant-impl self::B::T x = null}) → void {}
-  method h<generic-covariant-impl U extends self::B::T = self::B::T>() → void {}
+  method f(generic-covariant-impl self::B::T* x) → void {}
+  method g({generic-covariant-impl self::B::T* x = #C1}) → void {}
+  method h<generic-covariant-impl U extends self::B::T* = self::B::T*>() → void {}
 }
-class C extends self::B<core::int> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
-static method g1(self::B<core::num> b) → void {
+static method g1(self::B<core::num*>* b) → void {
   b.{self::B::f}(1.5);
 }
-static method g2(self::C c) → void {
+static method g2(self::C* c) → void {
   c.{self::B::f}(1);
 }
 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.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
index ff86372..12d5924 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C extends self::B<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
index ff86372..12d5924 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.legacy.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C extends self::B<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
index 8403e2a..d7a550f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.outline.expect
@@ -2,13 +2,13 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-class C extends self::B<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
     ;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
index ff86372..12d5924 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C extends self::B<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
index ff86372..12d5924 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_abstract_generic_covariant.dart.strong.transformed.expect
@@ -2,14 +2,14 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-class C extends self::B<core::num> {
-  synthetic constructor •() → self::C
+class C extends self::B<core::num*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect
index eea0f36..c636b55 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  covariant field core::num x = null;
-  synthetic constructor •() → self::B
+  covariant field core::num* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num _) → void
+  forwarding-stub set x(covariant core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect
index eea0f36..c636b55 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  covariant field core::num x = null;
-  synthetic constructor •() → self::B
+  covariant field core::num* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num _) → void
+  forwarding-stub set x(covariant core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
index d8da134..0f12e09 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.outline.expect
@@ -3,19 +3,19 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  covariant field core::num x;
-  synthetic constructor •() → self::B
+  covariant field core::num* x;
+  synthetic constructor •() → self::B*
     ;
 }
 class C extends core::Object {
-  field core::int x;
-  synthetic constructor •() → self::C
+  field core::int* x;
+  synthetic constructor •() → self::C*
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     ;
-  forwarding-stub set x(covariant core::num _) → void
+  forwarding-stub set x(covariant core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
index eea0f36..c636b55 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  covariant field core::num x = null;
-  synthetic constructor •() → self::B
+  covariant field core::num* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num _) → void
+  forwarding-stub set x(covariant core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
index eea0f36..c636b55 100644
--- a/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/field_forwarding_stub_explicit_covariant.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  covariant field core::num x = null;
-  synthetic constructor •() → self::B
+  covariant field core::num* x = null;
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
 class C extends core::Object {
-  field core::int x = null;
-  synthetic constructor •() → self::C
+  field core::int* x = null;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
 class D extends self::C implements self::B {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
-  forwarding-stub set x(covariant core::num _) → void
+  forwarding-stub set x(covariant core::num* _) → void
     return super.{self::C::x} = _;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect
index 63b5c84..7c5b3c9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set staticSetter(dynamic x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect
index 63b5c84..7c5b3c9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.legacy.transformed.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set staticSetter(dynamic x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.outline.expect
index 7c9daac..1068972 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.outline.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField;
   field dynamic instanceField;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
   static set staticSetter(dynamic x) → void
     ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.expect
index 63b5c84..7c5b3c9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set staticSetter(dynamic x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
index 63b5c84..7c5b3c9 100644
--- a/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/for_in_call_kinds.dart.strong.transformed.expect
@@ -5,7 +5,7 @@
 class C extends core::Object {
   static field dynamic staticField = null;
   field dynamic instanceField = null;
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
   static set staticSetter(dynamic x) → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
index f6be89d..7b0cc15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  generic-covariant-impl field self::B::T y = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  generic-covariant-impl field self::B::T* y = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
-  generic-covariant-impl field core::num x = null;
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  abstract get y() → core::num;
-  abstract set y(generic-covariant-impl core::num value) → void;
+  abstract get y() → core::num*;
+  abstract set y(generic-covariant-impl core::num* value) → void;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
-  generic-covariant-impl field self::D::T x = null;
-  synthetic constructor •() → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  generic-covariant-impl 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(generic-covariant-impl self::D::T value) → void;
+  abstract get y() → self::D::T*;
+  abstract set y(generic-covariant-impl self::D::T* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
index f6be89d..7b0cc15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.legacy.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  generic-covariant-impl field self::B::T y = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  generic-covariant-impl field self::B::T* y = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
-  generic-covariant-impl field core::num x = null;
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  abstract get y() → core::num;
-  abstract set y(generic-covariant-impl core::num value) → void;
+  abstract get y() → core::num*;
+  abstract set y(generic-covariant-impl core::num* value) → void;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
-  generic-covariant-impl field self::D::T x = null;
-  synthetic constructor •() → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  generic-covariant-impl 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(generic-covariant-impl self::D::T value) → void;
+  abstract get y() → self::D::T*;
+  abstract set y(generic-covariant-impl self::D::T* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
index 2696bf4..60a7f87 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.outline.expect
@@ -2,25 +2,25 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x;
-  generic-covariant-impl field self::B::T y;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x;
+  generic-covariant-impl field self::B::T* y;
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
-  generic-covariant-impl field core::num x;
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  generic-covariant-impl field core::num* x;
+  synthetic constructor •() → self::C<self::C::T*>*
     ;
-  abstract get y() → core::num;
-  abstract set y(generic-covariant-impl core::num value) → void;
+  abstract get y() → core::num*;
+  abstract set y(generic-covariant-impl core::num* value) → void;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
-  generic-covariant-impl field self::D::T x;
-  synthetic constructor •() → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  generic-covariant-impl field self::D::T* x;
+  synthetic constructor •() → self::D<self::D::T*>*
     ;
-  abstract get y() → self::D::T;
-  abstract set y(generic-covariant-impl self::D::T value) → void;
+  abstract get y() → self::D::T*;
+  abstract set y(generic-covariant-impl self::D::T* value) → void;
 }
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
index f6be89d..7b0cc15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  generic-covariant-impl field self::B::T y = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  generic-covariant-impl field self::B::T* y = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
-  generic-covariant-impl field core::num x = null;
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  abstract get y() → core::num;
-  abstract set y(generic-covariant-impl core::num value) → void;
+  abstract get y() → core::num*;
+  abstract set y(generic-covariant-impl core::num* value) → void;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
-  generic-covariant-impl field self::D::T x = null;
-  synthetic constructor •() → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  generic-covariant-impl 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(generic-covariant-impl self::D::T value) → void;
+  abstract get y() → self::D::T*;
+  abstract set y(generic-covariant-impl self::D::T* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
index f6be89d..7b0cc15 100644
--- a/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/generic_covariance_based_on_inference.dart.strong.transformed.expect
@@ -2,27 +2,27 @@
 import self as self;
 import "dart:core" as core;
 
-class B<T extends core::Object = dynamic> extends core::Object {
-  generic-covariant-impl field self::B::T x = null;
-  generic-covariant-impl field self::B::T y = null;
-  synthetic constructor •() → self::B<self::B::T>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  generic-covariant-impl field self::B::T* x = null;
+  generic-covariant-impl field self::B::T* y = null;
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
 }
-abstract class C<T extends core::Object = dynamic> extends core::Object implements self::B<core::num> {
-  generic-covariant-impl field core::num x = null;
-  synthetic constructor •() → self::C<self::C::T>
+abstract class C<T extends core::Object* = dynamic> extends core::Object implements self::B<core::num*> {
+  generic-covariant-impl field core::num* x = null;
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-  abstract get y() → core::num;
-  abstract set y(generic-covariant-impl core::num value) → void;
+  abstract get y() → core::num*;
+  abstract set y(generic-covariant-impl core::num* value) → void;
 }
-abstract class D<T extends core::Object = dynamic> extends core::Object implements self::B<self::D::T> {
-  generic-covariant-impl field self::D::T x = null;
-  synthetic constructor •() → self::D<self::D::T>
+abstract class D<T extends core::Object* = dynamic> extends core::Object implements self::B<self::D::T*> {
+  generic-covariant-impl 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(generic-covariant-impl self::D::T value) → void;
+  abstract get y() → self::D::T*;
+  abstract set y(generic-covariant-impl self::D::T* value) → void;
 }
 static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect
index b7d7a8b..79df80c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static field core::bool staticValue = self::o;
-  field core::bool instanceValue = self::o;
-  synthetic constructor •() → self::C
+  static field core::bool* staticValue = self::o;
+  field core::bool* instanceValue = self::o;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::Object o = 1;
-static field core::bool topLevelValue = self::o;
+static field core::Object* o = 1;
+static field core::bool* topLevelValue = self::o;
 static method main() → dynamic {
   try {
     self::topLevelValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     self::C::staticValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     new self::C::•();
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect
index b7d7a8b..79df80c 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.legacy.transformed.expect
@@ -3,31 +3,31 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static field core::bool staticValue = self::o;
-  field core::bool instanceValue = self::o;
-  synthetic constructor •() → self::C
+  static field core::bool* staticValue = self::o;
+  field core::bool* instanceValue = self::o;
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-static field core::Object o = 1;
-static field core::bool topLevelValue = self::o;
+static field core::Object* o = 1;
+static field core::bool* topLevelValue = self::o;
 static method main() → dynamic {
   try {
     self::topLevelValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     self::C::staticValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     new self::C::•();
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.outline.expect
index bc5261e..adf1570 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.outline.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class C extends core::Object {
-  static field core::bool staticValue;
-  field core::bool instanceValue;
-  synthetic constructor •() → self::C
+  static field core::bool* staticValue;
+  field core::bool* instanceValue;
+  synthetic constructor •() → self::C*
     ;
 }
-static field core::Object o;
-static field core::bool topLevelValue;
+static field core::Object* o;
+static field core::bool* topLevelValue;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.expect
index 9148470..56dbcc5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.expect
@@ -3,31 +3,31 @@
 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
+  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::•()
     ;
 }
-static field core::Object o = 1;
-static field core::bool topLevelValue = self::o as{TypeError} core::bool;
+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) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     self::C::staticValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     new self::C::•();
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.transformed.expect
index 9148470..56dbcc5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/implicit_downcast_field.dart.strong.transformed.expect
@@ -3,31 +3,31 @@
 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
+  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::•()
     ;
 }
-static field core::Object o = 1;
-static field core::bool topLevelValue = self::o as{TypeError} core::bool;
+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) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     self::C::staticValue;
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
   try {
     new self::C::•();
     throw "no exception";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
index b99aea3..c22b5fd 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.outline.expect
@@ -3,45 +3,45 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
-  get y() → core::int
+  get y() → core::int*
     ;
-  set y(core::int value) → void
+  set y(core::int* value) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract get x() → self::I::T;
-  abstract set x(generic-covariant-impl self::I::T value) → void;
-  abstract get y() → core::Object;
-  abstract set y(covariant core::Object value) → void;
+  abstract get x() → self::I::T*;
+  abstract set x(generic-covariant-impl self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant core::Object* value) → void;
 }
 class M extends core::Object {
-  field core::int x;
-  field core::int y;
-  synthetic constructor •() → self::M
+  field core::int* x;
+  field core::int* y;
+  synthetic constructor •() → self::M*
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set y(covariant core::Object value) → void
+  forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
-  forwarding-stub set x(generic-covariant-impl core::int _) → void
+  forwarding-stub set x(generic-covariant-impl core::int* _) → void
     return super.{self::B::x} = _;
 }
-static method expectTypeError(() → void callback) → void
+static method expectTypeError(() →* void callback) → void
   ;
-static method expect(core::Object value, core::Object expected) → void
+static method expect(core::Object* value, core::Object* expected) → void
   ;
-static method test(self::I<core::Object> i) → void
+static method test(self::I<core::Object*>* i) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
index 79e85ab..2d7f586 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_field.dart.strong.expect
@@ -18,67 +18,67 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int {
+  get x() → core::int* {
     throw "Should not be reached";
   }
-  set x(core::int value) → void {
+  set x(core::int* value) → void {
     throw "Should not be reached";
   }
-  get y() → core::int {
+  get y() → core::int* {
     throw "Should not be reached";
   }
-  set y(core::int value) → void {
+  set y(core::int* value) → void {
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+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(generic-covariant-impl self::I::T value) → void;
-  abstract get y() → core::Object;
-  abstract set y(covariant core::Object value) → void;
+  abstract get x() → self::I::T*;
+  abstract set x(generic-covariant-impl self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant core::Object* value) → void;
 }
 class M extends core::Object {
-  field core::int x = null;
-  field core::int y = null;
-  synthetic constructor •() → self::M
+  field core::int* x = null;
+  field core::int* y = null;
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set y(covariant core::Object value) → void
+  forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
-  forwarding-stub set x(generic-covariant-impl core::int _) → void
+  forwarding-stub set x(generic-covariant-impl core::int* _) → void
     return super.{self::B::x} = _;
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method test(self::I<core::Object> i) → void {
-  self::expectTypeError(() → core::Null {
+static method test(self::I<core::Object*>* i) → void {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 1;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 2;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
index 782ccf3..9b609d2 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.outline.expect
@@ -3,51 +3,51 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
-  get y() → core::int
+  get y() → core::int*
     ;
-  set y(core::int value) → void
+  set y(core::int* value) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract get x() → self::I::T;
-  abstract set x(generic-covariant-impl self::I::T value) → void;
-  abstract get y() → core::Object;
-  abstract set y(covariant core::Object value) → void;
+  abstract get x() → self::I::T*;
+  abstract set x(generic-covariant-impl self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant core::Object* value) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     ;
-  get x() → core::int
+  get x() → core::int*
     ;
-  set x(core::int value) → void
+  set x(core::int* value) → void
     ;
-  get y() → core::int
+  get y() → core::int*
     ;
-  set y(core::int value) → void
+  set y(core::int* value) → void
     ;
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set y(covariant core::Object value) → void
+  forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
-  forwarding-stub set x(generic-covariant-impl core::int value) → void
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
     return super.{self::B::x} = value;
 }
-static method expectTypeError(() → void callback) → void
+static method expectTypeError(() →* void callback) → void
   ;
-static method expect(core::Object value, core::Object expected) → void
+static method expect(core::Object* value, core::Object* expected) → void
   ;
-static method test(self::I<core::Object> i) → void
+static method test(self::I<core::Object*>* i) → void
   ;
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
index 693230f..a3d75db 100644
--- a/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/mixin_forwarding_stub_setter.dart.strong.expect
@@ -18,75 +18,75 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  get x() → core::int {
+  get x() → core::int* {
     throw "Should not be reached";
   }
-  set x(core::int value) → void {
+  set x(core::int* value) → void {
     throw "Should not be reached";
   }
-  get y() → core::int {
+  get y() → core::int* {
     throw "Should not be reached";
   }
-  set y(core::int value) → void {
+  set y(core::int* value) → void {
     throw "Should not be reached";
   }
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+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(generic-covariant-impl self::I::T value) → void;
-  abstract get y() → core::Object;
-  abstract set y(covariant core::Object value) → void;
+  abstract get x() → self::I::T*;
+  abstract set x(generic-covariant-impl self::I::T* value) → void;
+  abstract get y() → core::Object*;
+  abstract set y(covariant core::Object* value) → void;
 }
 class M extends core::Object {
-  synthetic constructor •() → self::M
+  synthetic constructor •() → self::M*
     : super core::Object::•()
     ;
-  get x() → core::int
+  get x() → core::int*
     return 1;
-  set x(core::int value) → void {
+  set x(core::int* value) → void {
     self::expect(value, 2);
   }
-  get y() → core::int
+  get y() → core::int*
     return 3;
-  set y(core::int value) → void {
+  set y(core::int* value) → void {
     self::expect(value, 4);
   }
 }
-class C = self::B with self::M implements self::I<core::int> {
-  synthetic constructor •() → self::C
+class C = self::B with self::M implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub set y(covariant core::Object value) → void
+  forwarding-stub set y(covariant core::Object* value) → void
     return super.{self::B::y} = value;
-  forwarding-stub set x(generic-covariant-impl core::int value) → void
+  forwarding-stub set x(generic-covariant-impl core::int* value) → void
     return super.{self::B::x} = value;
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method test(self::I<core::Object> i) → void {
-  self::expectTypeError(() → core::Null {
+static method test(self::I<core::Object*>* i) → void {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::x} = "hello";
   });
   i.{self::I::x} = 2;
   self::expect(i.{self::I::x}, 1);
-  self::expectTypeError(() → core::Null {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::y} = "hello";
   });
   i.{self::I::y} = 4;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.outline.expect
index 91a76ee..2d21fedf 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.outline.expect
@@ -3,29 +3,29 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x) → core::int
+  method f(core::int* x) → core::int*
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  abstract method f(covariant core::Object x) → core::int;
+  abstract method f(covariant core::Object* x) → core::int*;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f(covariant core::Object x) → core::int
+  forwarding-stub method f(covariant core::Object* x) → core::int*
     return super.{self::B::f}(x);
 }
-static method expectTypeError(() → void callback) → void
+static method expectTypeError(() →* void callback) → void
   ;
-static method expect(core::Object value, core::Object expected) → void
+static method expect(core::Object* value, core::Object* expected) → void
   ;
-static method g(self::C c) → void
+static method g(self::C* c) → void
   ;
-static method test(self::C c, self::I i) → void
+static method test(self::C* c, self::I* i) → void
   ;
 static method main() → dynamic
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
index 1fe3ea5..c533269 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.expect
@@ -3,54 +3,54 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → core::int {
+  method f(core::int* x) → core::int* {
     self::expect(x, 1);
     return 2;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::Object x) → core::int;
+  abstract method f(covariant core::Object* x) → core::int*;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::Object x) → core::int
+  forwarding-stub method f(covariant core::Object* x) → core::int*
     return super.{self::B::f}(x);
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.{self::C::f}("hello");
 }
-static method test(self::C c, self::I i) → void {
-  self::expectTypeError(() → core::Null {
+static method test(self::C* c, self::I* i) → void {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null {
+  self::expectTypeError(() → core::Null* {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  self::C* c = new self::C::•();
   self::test(c, c);
 }
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
index 1fe3ea5..c533269 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_checked_via_target.dart.strong.transformed.expect
@@ -3,54 +3,54 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x) → core::int {
+  method f(core::int* x) → core::int* {
     self::expect(x, 1);
     return 2;
   }
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::Object x) → core::int;
+  abstract method f(covariant core::Object* x) → core::int*;
 }
 class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::Object x) → core::int
+  forwarding-stub method f(covariant core::Object* x) → core::int*
     return super.{self::B::f}(x);
 }
-static method expectTypeError(() → void callback) → void {
+static method expectTypeError(() →* void callback) → void {
   try {
     callback.call();
     throw "Expected TypeError, did not occur";
   }
-  on core::TypeError catch(no-exception-var) {
+  on core::TypeError* catch(no-exception-var) {
   }
 }
-static method expect(core::Object value, core::Object expected) → void {
+static method expect(core::Object* value, core::Object* expected) → void {
   if(!value.{core::Object::==}(expected)) {
     throw "Expected ${expected}, got ${value}";
   }
 }
-static method g(self::C c) → void {
+static method g(self::C* c) → void {
   c.{self::C::f}("hello");
 }
-static method test(self::C c, self::I i) → void {
-  self::expectTypeError(() → core::Null {
+static method test(self::C* c, self::I* i) → void {
+  self::expectTypeError(() → core::Null* {
     i.{self::I::f}("hello");
   });
   self::expect(i.{self::I::f}(1), 2);
-  self::expectTypeError(() → core::Null {
+  self::expectTypeError(() → core::Null* {
     c.{self::C::f}("hello");
   });
   self::expect(c.{self::C::f}(1), 2);
 }
 static method main() → dynamic {
-  self::C c = new self::C::•();
+  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.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
index 082a15f..ac4f277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::Object* y) → void;
 }
-abstract class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
index 082a15f..ac4f277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::Object* y) → void;
 }
-abstract class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
index 5890db1..29bae7f 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x, core::int y) → void
+  method f(core::int* x, core::int* y) → void
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::Object* y) → void;
 }
-abstract class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
index 082a15f..ac4f277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::Object* y) → void;
 }
-abstract class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
index 082a15f..ac4f277 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_interface.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::I<self::I::T>
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::I<self::I::T*>*
     : super core::Object::•()
     ;
-  abstract method f(generic-covariant-impl self::I::T x, core::Object y) → void;
+  abstract method f(generic-covariant-impl self::I::T* x, core::Object* y) → void;
 }
-abstract class C extends self::B implements self::I<core::int> {
-  synthetic constructor •() → self::C
+abstract class C extends self::B implements self::I<core::int*> {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void
+  forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
index 04bbcf3..104716d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.expect
@@ -2,22 +2,22 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
-abstract class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → self::C
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
index 04bbcf3..104716d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.legacy.transformed.expect
@@ -2,22 +2,22 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
-abstract class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → self::C
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
index 5c37f4b..da13fbd 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.outline.expect
@@ -2,21 +2,21 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     ;
-  method f(generic-covariant-impl self::B::T x, core::int y) → void
+  method f(generic-covariant-impl self::B::T* x, core::int* y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
-abstract class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → self::C
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void;
 }
 static method main() → void
   ;
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
index 04bbcf3..104716d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.expect
@@ -2,22 +2,22 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
-abstract class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → self::C
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(generic-covariant-impl core::int* x, core::Object* y) → void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.transformed.expect
index 04bbcf3..104716d 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariantImpl_from_super.dart.strong.transformed.expect
@@ -2,22 +2,22 @@
 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>
+class B<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::B<self::B::T*>*
     : super core::Object::•()
     ;
-  method f(generic-covariant-impl self::B::T x, core::int y) → void {}
+  method f(generic-covariant-impl self::B::T* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
-abstract class C extends self::B<core::int> implements self::I {
-  synthetic constructor •() → self::C
+abstract class C extends self::B<core::int*> implements self::I {
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(generic-covariant-impl core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(generic-covariant-impl 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.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.expect
index ed5aa28..9fb5fe5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::int x, core::Object y) → void;
+  abstract method f(covariant core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::int x, core::Object y) → void
+  forwarding-stub method f(covariant core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect
index ed5aa28..9fb5fe5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.legacy.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::int x, core::Object y) → void;
+  abstract method f(covariant core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::int x, core::Object y) → void
+  forwarding-stub method f(covariant core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.outline.expect
index ac22acd..14d58ab 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(core::int x, core::int y) → void
+  method f(core::int* x, core::int* y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  abstract method f(covariant core::int x, core::Object y) → void;
+  abstract method f(covariant core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  forwarding-stub method f(covariant core::int x, core::Object y) → void
+  forwarding-stub method f(covariant core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.expect
index ed5aa28..9fb5fe5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::int x, core::Object y) → void;
+  abstract method f(covariant core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::int x, core::Object y) → void
+  forwarding-stub method f(covariant core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.transformed.expect
index ed5aa28..9fb5fe5 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_interface.dart.strong.transformed.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(core::int x, core::int y) → void {}
+  method f(core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(covariant core::int x, core::Object y) → void;
+  abstract method f(covariant core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  forwarding-stub method f(covariant core::int x, core::Object y) → void
+  forwarding-stub method f(covariant core::int* x, core::Object* y) → void
     return super.{self::B::f}(x, y);
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect
index 1ce982c..03e32ba 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::int x, core::int y) → void {}
+  method f(covariant core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(covariant 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_super.dart.legacy.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.transformed.expect
index 1ce982c..03e32ba 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.legacy.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::int x, core::int y) → void {}
+  method f(covariant core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(covariant 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_super.dart.outline.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.outline.expect
index 9c7aa8f..630aa3a 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.outline.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.outline.expect
@@ -3,20 +3,20 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     ;
-  method f(covariant core::int x, core::int y) → void
+  method f(covariant core::int* x, core::int* y) → void
     ;
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     ;
-  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(covariant 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_super.dart.strong.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.expect
index 1ce982c..03e32ba 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::int x, core::int y) → void {}
+  method f(covariant core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(covariant 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_super.dart.strong.transformed.expect b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.transformed.expect
index 1ce982c..03e32ba 100644
--- a/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/runtime_checks_new/stub_from_interface_covariant_from_super.dart.strong.transformed.expect
@@ -3,21 +3,21 @@
 import "dart:core" as core;
 
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-  method f(covariant core::int x, core::int y) → void {}
+  method f(covariant core::int* x, core::int* y) → void {}
 }
 abstract class I extends core::Object {
-  synthetic constructor •() → self::I
+  synthetic constructor •() → self::I*
     : super core::Object::•()
     ;
-  abstract method f(core::int x, core::Object y) → void;
+  abstract method f(core::int* x, core::Object* y) → void;
 }
 abstract class C extends self::B implements self::I {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super self::B::•()
     ;
-  abstract forwarding-stub method f(covariant core::int x, core::Object y) → void;
+  abstract forwarding-stub method f(covariant core::int* x, core::Object* y) → void;
 }
 static method main() → void {}
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.expect b/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.expect
deleted file mode 100644
index 15c2801..0000000
--- a/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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:154:19: Context: 'Iterable.iterator' is defined here.
-//   Iterator<E> get iterator;
-//                   ^^^^^^^^
-//
-// pkg/front_end/testcases/sdk_diagnostic.dart:12:8: Warning: 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::•()
-    ;
-}
-static method test() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#print, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#incorrectArgument: "fisk"})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.transformed.expect b/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.transformed.expect
deleted file mode 100644
index 15c2801..0000000
--- a/pkg/front_end/testcases/sdk_diagnostic.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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:154:19: Context: 'Iterable.iterator' is defined here.
-//   Iterator<E> get iterator;
-//                   ^^^^^^^^
-//
-// pkg/front_end/testcases/sdk_diagnostic.dart:12:8: Warning: 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::•()
-    ;
-}
-static method test() → dynamic {
-  throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#print, 32, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(<core::Symbol, dynamic>{#incorrectArgument: "fisk"})));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.outline.expect b/pkg/front_end/testcases/sdk_diagnostic.dart.outline.expect
deleted file mode 100644
index a472835..0000000
--- a/pkg/front_end/testcases/sdk_diagnostic.dart.outline.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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:154:19: Context: 'Iterable.iterator' is defined here.
-//   Iterator<E> get iterator;
-//                   ^^^^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Iterable<core::Object> {
-  synthetic constructor •() → self::C
-    ;
-}
-static method test() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.strong.expect b/pkg/front_end/testcases/sdk_diagnostic.dart.strong.expect
deleted file mode 100644
index eb45ae6..0000000
--- a/pkg/front_end/testcases/sdk_diagnostic.dart.strong.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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:154:19: Context: 'Iterable.iterator' is defined here.
-//   Iterator<E> get iterator;
-//                   ^^^^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
-  print(incorrectArgument: \"fisk\");
-       ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/sdk_diagnostic.dart.strong.transformed.expect b/pkg/front_end/testcases/sdk_diagnostic.dart.strong.transformed.expect
deleted file mode 100644
index eb45ae6..0000000
--- a/pkg/front_end/testcases/sdk_diagnostic.dart.strong.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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:154:19: Context: 'Iterable.iterator' is defined here.
-//   Iterator<E> get iterator;
-//                   ^^^^^^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method test() → dynamic {
-  invalid-expression "pkg/front_end/testcases/sdk_diagnostic.dart:12:8: Error: Too few positional arguments: 1 required, 0 given.
-  print(incorrectArgument: \"fisk\");
-       ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect
index 08f59f7..f0312aa 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.expect
@@ -8,39 +8,39 @@
 import "dart:collection";
 
 static method main() → dynamic async {
-  core::Map<core::int, core::bool> m = <dynamic, dynamic>{};
-  core::Set<core::int> s = <dynamic, dynamic>{};
-  core::Iterable<core::int> i = <dynamic, dynamic>{};
-  col::LinkedHashSet<core::int> lhs = <dynamic, dynamic>{};
-  col::LinkedHashMap<core::int, core::bool> lhm = <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();
+  core::Map<core::int*, core::bool*>* m = <dynamic, dynamic>{};
+  core::Set<core::int*>* s = <dynamic, dynamic>{};
+  core::Iterable<core::int*>* i = <dynamic, dynamic>{};
+  col::LinkedHashSet<core::int*>* lhs = <dynamic, dynamic>{};
+  col::LinkedHashMap<core::int*, core::bool*>* lhm = <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 
+static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* async 
   return <dynamic, dynamic>{};
-static method setfun() → asy::Future<core::Set<core::int>> async 
+static method setfun() → asy::Future<core::Set<core::int*>*>* async 
   return <dynamic, dynamic>{};
-static method iterablefun() → asy::Future<core::Iterable<core::int>> async 
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* async 
   return <dynamic, dynamic>{};
-static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> async 
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* async 
   return <dynamic, dynamic>{};
-static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> async 
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* async 
   return <dynamic, dynamic>{};
-static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+static method mapfun2() → asy::FutureOr<core::Map<core::int*, core::bool*>*>*
   return <dynamic, dynamic>{};
-static method setfun2() → asy::FutureOr<core::Set<core::int>>
+static method setfun2() → asy::FutureOr<core::Set<core::int*>*>*
   return <dynamic, dynamic>{};
-static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int*>*>*
   return <dynamic, dynamic>{};
-static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int*>*>*
   return <dynamic, dynamic>{};
-static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect
index 192875a..3b04358 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.legacy.transformed.expect
@@ -8,8 +8,8 @@
 import "dart:collection";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -20,31 +20,31 @@
     try {
       #L1:
       {
-        core::Map<core::int, core::bool> m = <dynamic, dynamic>{};
-        core::Set<core::int> s = <dynamic, dynamic>{};
-        core::Iterable<core::int> i = <dynamic, dynamic>{};
-        col::LinkedHashSet<core::int> lhs = <dynamic, dynamic>{};
-        col::LinkedHashMap<core::int, core::bool> lhm = <dynamic, dynamic>{};
+        core::Map<core::int*, core::bool*>* m = <dynamic, dynamic>{};
+        core::Set<core::int*>* s = <dynamic, dynamic>{};
+        core::Iterable<core::int*>* i = <dynamic, dynamic>{};
+        col::LinkedHashSet<core::int*>* lhs = <dynamic, dynamic>{};
+        col::LinkedHashMap<core::int*, core::bool*>* lhm = <dynamic, dynamic>{};
         [yield] let dynamic #t1 = asy::_awaitHelper(self::mapfun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Map<core::int, core::bool> fm = :result;
+        core::Map<core::int*, core::bool*>* fm = :result;
         [yield] let dynamic #t2 = asy::_awaitHelper(self::setfun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Set<core::int> fs = :result;
+        core::Set<core::int*>* fs = :result;
         [yield] let dynamic #t3 = asy::_awaitHelper(self::iterablefun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Iterable<core::int> fi = :result;
+        core::Iterable<core::int*>* fi = :result;
         [yield] let dynamic #t4 = asy::_awaitHelper(self::lhsfun(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashSet<core::int> flhs = :result;
+        col::LinkedHashSet<core::int*>* flhs = :result;
         [yield] let dynamic #t5 = asy::_awaitHelper(self::lhmfun(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashMap<core::int, core::bool> flhm = :result;
+        col::LinkedHashMap<core::int*, core::bool*>* flhm = :result;
         [yield] let dynamic #t6 = asy::_awaitHelper(self::mapfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Map<core::int, core::bool> fm2 = :result;
+        core::Map<core::int*, core::bool*>* fm2 = :result;
         [yield] let dynamic #t7 = asy::_awaitHelper(self::setfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Set<core::int> fs2 = :result;
+        core::Set<core::int*>* fs2 = :result;
         [yield] let dynamic #t8 = asy::_awaitHelper(self::iterablefun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Iterable<core::int> fi2 = :result;
+        core::Iterable<core::int*>* fi2 = :result;
         [yield] let dynamic #t9 = asy::_awaitHelper(self::lhsfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashSet<core::int> flhs2 = :result;
+        col::LinkedHashSet<core::int*>* flhs2 = :result;
         [yield] let dynamic #t10 = asy::_awaitHelper(self::lhmfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashMap<core::int, core::bool> flhm2 = :result;
+        col::LinkedHashMap<core::int*, core::bool*>* flhm2 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
@@ -58,9 +58,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method mapfun() → asy::Future<core::Map<core::int, core::bool>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Map<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int, core::bool>>();
-  asy::FutureOr<core::Map<core::int, core::bool>> :return_value;
+static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Map<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int*, core::bool*>*>();
+  asy::FutureOr<core::Map<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -85,9 +85,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method setfun() → asy::Future<core::Set<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Set<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int>>();
-  asy::FutureOr<core::Set<core::int>> :return_value;
+static method setfun() → asy::Future<core::Set<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Set<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int*>*>();
+  asy::FutureOr<core::Set<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -112,9 +112,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method iterablefun() → asy::Future<core::Iterable<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Iterable<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int>>();
-  asy::FutureOr<core::Iterable<core::int>> :return_value;
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Iterable<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int*>*>();
+  asy::FutureOr<core::Iterable<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -139,9 +139,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int>>();
-  asy::FutureOr<col::LinkedHashSet<core::int>> :return_value;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int*>*>();
+  asy::FutureOr<col::LinkedHashSet<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -166,9 +166,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int, core::bool>>();
-  asy::FutureOr<col::LinkedHashMap<core::int, core::bool>> :return_value;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int*, core::bool*>*>();
+  asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -193,13 +193,13 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+static method mapfun2() → asy::FutureOr<core::Map<core::int*, core::bool*>*>*
   return <dynamic, dynamic>{};
-static method setfun2() → asy::FutureOr<core::Set<core::int>>
+static method setfun2() → asy::FutureOr<core::Set<core::int*>*>*
   return <dynamic, dynamic>{};
-static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int*>*>*
   return <dynamic, dynamic>{};
-static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int*>*>*
   return <dynamic, dynamic>{};
-static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return <dynamic, dynamic>{};
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect
index 3267afb..b9db314 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.outline.expect
@@ -9,23 +9,23 @@
 
 static method main() → dynamic
   ;
-static method mapfun() → asy::Future<core::Map<core::int, core::bool>>
+static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>*
   ;
-static method setfun() → asy::Future<core::Set<core::int>>
+static method setfun() → asy::Future<core::Set<core::int*>*>*
   ;
-static method iterablefun() → asy::Future<core::Iterable<core::int>>
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>*
   ;
-static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>>
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>*
   ;
-static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>>
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>*
   ;
-static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
+static method mapfun2() → asy::FutureOr<core::Map<core::int*, core::bool*>*>*
   ;
-static method setfun2() → asy::FutureOr<core::Set<core::int>>
+static method setfun2() → asy::FutureOr<core::Set<core::int*>*>*
   ;
-static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int*>*>*
   ;
-static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int*>*>*
   ;
-static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   ;
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
index 2e3dd40..7a16814 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.expect
@@ -55,71 +55,71 @@
 import "dart:collection";
 
 static method main() → dynamic async {
-  core::Map<core::int, core::bool> m = <core::int, core::bool>{};
-  core::Set<core::int> s = let final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>() in #t1;
-  core::Iterable<core::int> i = let final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>() in #t2;
-  col::LinkedHashSet<core::int> lhs = let final<BottomType> #t3 = 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>'.
+  core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
+  core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>() in #t1;
+  core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>() in #t2;
+  col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = 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 let final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
-  col::LinkedHashMap<core::int, core::bool> lhm = let final<BottomType> #t5 = 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>'.
+                           ^" in let final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
+  col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = 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();
+  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 let final core::Set<core::int> #t6 = col::LinkedHashSet::•<core::int>() in #t6;
-static method iterablefun() → asy::Future<core::Iterable<core::int>> async 
-  return let final core::Set<core::int> #t7 = col::LinkedHashSet::•<core::int>() in #t7;
-static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> async 
+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 let final core::Set<core::int*>* #t6 = col::LinkedHashSet::•<core::int*>() in #t6;
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* async 
+  return let final core::Set<core::int*>* #t7 = col::LinkedHashSet::•<core::int*>() in #t7;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* async 
   return let final<BottomType> #t8 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:32:46: 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.
 Future<LinkedHashSet<int>> lhsfun() async => {};
-                                             ^" in let final core::Set<dynamic> #t9 = col::LinkedHashSet::•<dynamic>() in #t9;
-static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> async 
+                                             ^" in let final core::Set<dynamic>* #t9 = col::LinkedHashSet::•<dynamic>() in #t9;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* async 
   return let final<BottomType> #t10 = invalid-expression "pkg/front_end/testcases/set_literals/disambiguation_rule.dart:33:52: 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.
 Future<LinkedHashMap<int, bool>> lhmfun() async => {};
                                                    ^" in <dynamic, dynamic>{};
-static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
-  return <core::int, core::bool>{};
-static method setfun2() → asy::FutureOr<core::Set<core::int>>
-  return let final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>() in #t11;
-static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
-  return let final core::Set<core::int> #t12 = col::LinkedHashSet::•<core::int>() in #t12;
-static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+static method mapfun2() → asy::FutureOr<core::Map<core::int*, core::bool*>*>*
+  return <core::int*, core::bool*>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int*>*>*
+  return let final core::Set<core::int*>* #t11 = col::LinkedHashSet::•<core::int*>() in #t11;
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int*>*>*
+  return let final core::Set<core::int*>* #t12 = col::LinkedHashSet::•<core::int*>() in #t12;
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int*>*>*
   return let final<BottomType> #t13 = 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'.
  - 'FutureOr' is from 'dart:async'.
  - 'LinkedHashSet' is from 'dart:collection'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
 FutureOr<LinkedHashSet<int>> lhsfun2() => {};
-                                          ^" in (let final core::Set<dynamic> #t14 = col::LinkedHashSet::•<dynamic>() in #t14) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
-static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+                                          ^" in (let final core::Set<dynamic>* #t14 = col::LinkedHashSet::•<dynamic>() in #t14) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int*>*>*;
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return let final<BottomType> #t15 = 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'.
  - 'FutureOr' is from 'dart:async'.
  - 'LinkedHashMap' is from 'dart:collection'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
 FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
-                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>;
+                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*;
diff --git a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
index 072636a..2dce7db 100644
--- a/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
+++ b/pkg/front_end/testcases/set_literals/disambiguation_rule.dart.strong.transformed.expect
@@ -55,8 +55,8 @@
 import "dart:collection";
 
 static method main() → dynamic /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
+  final asy::_AsyncAwaitCompleter<dynamic>* :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
+  asy::FutureOr<dynamic>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -67,41 +67,41 @@
     try {
       #L1:
       {
-        core::Map<core::int, core::bool> m = <core::int, core::bool>{};
-        core::Set<core::int> s = let final core::Set<core::int> #t1 = col::LinkedHashSet::•<core::int>() in #t1;
-        core::Iterable<core::int> i = let final core::Set<core::int> #t2 = col::LinkedHashSet::•<core::int>() in #t2;
-        col::LinkedHashSet<core::int> lhs = let final<BottomType> #t3 = 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>'.
+        core::Map<core::int*, core::bool*>* m = <core::int*, core::bool*>{};
+        core::Set<core::int*>* s = let final core::Set<core::int*>* #t1 = col::LinkedHashSet::•<core::int*>() in #t1;
+        core::Iterable<core::int*>* i = let final core::Set<core::int*>* #t2 = col::LinkedHashSet::•<core::int*>() in #t2;
+        col::LinkedHashSet<core::int*>* lhs = let final<BottomType> #t3 = 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 let final core::Set<dynamic> #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
-        col::LinkedHashMap<core::int, core::bool> lhm = let final<BottomType> #t5 = 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>'.
+                           ^" in let final core::Set<dynamic>* #t4 = col::LinkedHashSet::•<dynamic>() in #t4;
+        col::LinkedHashMap<core::int*, core::bool*>* lhm = let final<BottomType> #t5 = 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>{};
         [yield] let dynamic #t6 = asy::_awaitHelper(self::mapfun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Map<core::int, core::bool> fm = :result;
+        core::Map<core::int*, core::bool*>* fm = :result;
         [yield] let dynamic #t7 = asy::_awaitHelper(self::setfun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Set<core::int> fs = :result;
+        core::Set<core::int*>* fs = :result;
         [yield] let dynamic #t8 = asy::_awaitHelper(self::iterablefun(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Iterable<core::int> fi = :result;
+        core::Iterable<core::int*>* fi = :result;
         [yield] let dynamic #t9 = asy::_awaitHelper(self::lhsfun(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashSet<core::int> flhs = :result;
+        col::LinkedHashSet<core::int*>* flhs = :result;
         [yield] let dynamic #t10 = asy::_awaitHelper(self::lhmfun(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashMap<core::int, core::bool> flhm = :result;
+        col::LinkedHashMap<core::int*, core::bool*>* flhm = :result;
         [yield] let dynamic #t11 = asy::_awaitHelper(self::mapfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Map<core::int, core::bool> fm2 = :result;
+        core::Map<core::int*, core::bool*>* fm2 = :result;
         [yield] let dynamic #t12 = asy::_awaitHelper(self::setfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Set<core::int> fs2 = :result;
+        core::Set<core::int*>* fs2 = :result;
         [yield] let dynamic #t13 = asy::_awaitHelper(self::iterablefun2(), :async_op_then, :async_op_error, :async_op) in null;
-        core::Iterable<core::int> fi2 = :result;
+        core::Iterable<core::int*>* fi2 = :result;
         [yield] let dynamic #t14 = asy::_awaitHelper(self::lhsfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashSet<core::int> flhs2 = :result;
+        col::LinkedHashSet<core::int*>* flhs2 = :result;
         [yield] let dynamic #t15 = asy::_awaitHelper(self::lhmfun2(), :async_op_then, :async_op_error, :async_op) in null;
-        col::LinkedHashMap<core::int, core::bool> flhm2 = :result;
+        col::LinkedHashMap<core::int*, core::bool*>* flhm2 = :result;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
       return;
@@ -115,9 +115,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method mapfun() → asy::Future<core::Map<core::int, core::bool>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Map<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int, core::bool>>();
-  asy::FutureOr<core::Map<core::int, core::bool>> :return_value;
+static method mapfun() → asy::Future<core::Map<core::int*, core::bool*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Map<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Map<core::int*, core::bool*>*>();
+  asy::FutureOr<core::Map<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -127,7 +127,7 @@
     try {
       #L2:
       {
-        :return_value = <core::int, core::bool>{};
+        :return_value = <core::int*, core::bool*>{};
         break #L2;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -142,9 +142,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method setfun() → asy::Future<core::Set<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Set<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int>>();
-  asy::FutureOr<core::Set<core::int>> :return_value;
+static method setfun() → asy::Future<core::Set<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Set<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Set<core::int*>*>();
+  asy::FutureOr<core::Set<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -154,7 +154,7 @@
     try {
       #L3:
       {
-        :return_value = let final core::Set<core::int> #t16 = col::LinkedHashSet::•<core::int>() in #t16;
+        :return_value = let final core::Set<core::int*>* #t16 = col::LinkedHashSet::•<core::int*>() in #t16;
         break #L3;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -169,9 +169,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method iterablefun() → asy::Future<core::Iterable<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<core::Iterable<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int>>();
-  asy::FutureOr<core::Iterable<core::int>> :return_value;
+static method iterablefun() → asy::Future<core::Iterable<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<core::Iterable<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<core::Iterable<core::int*>*>();
+  asy::FutureOr<core::Iterable<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -181,7 +181,7 @@
     try {
       #L4:
       {
-        :return_value = let final core::Set<core::int> #t17 = col::LinkedHashSet::•<core::int>() in #t17;
+        :return_value = let final core::Set<core::int*>* #t17 = col::LinkedHashSet::•<core::int*>() in #t17;
         break #L4;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -196,9 +196,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method lhsfun() → asy::Future<col::LinkedHashSet<core::int>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int>>();
-  asy::FutureOr<col::LinkedHashSet<core::int>> :return_value;
+static method lhsfun() → asy::Future<col::LinkedHashSet<core::int*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashSet<core::int*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashSet<core::int*>*>();
+  asy::FutureOr<col::LinkedHashSet<core::int*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -213,7 +213,7 @@
  - '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 let final core::Set<dynamic> #t19 = col::LinkedHashSet::•<dynamic>() in #t19;
+                                             ^" in let final core::Set<dynamic>* #t19 = col::LinkedHashSet::•<dynamic>() in #t19;
         break #L5;
       }
       asy::_completeOnAsyncReturn(:async_completer, :return_value);
@@ -228,9 +228,9 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method lhmfun() → asy::Future<col::LinkedHashMap<core::int, core::bool>> /* originally async */ {
-  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int, core::bool>> :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int, core::bool>>();
-  asy::FutureOr<col::LinkedHashMap<core::int, core::bool>> :return_value;
+static method lhmfun() → asy::Future<col::LinkedHashMap<core::int*, core::bool*>*>* /* originally async */ {
+  final asy::_AsyncAwaitCompleter<col::LinkedHashMap<core::int*, core::bool*>*>* :async_completer = new asy::_AsyncAwaitCompleter::•<col::LinkedHashMap<core::int*, core::bool*>*>();
+  asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>* :return_value;
   dynamic :async_stack_trace;
   dynamic :async_op_then;
   dynamic :async_op_error;
@@ -260,25 +260,25 @@
   :async_completer.start(:async_op);
   return :async_completer.{asy::Completer::future};
 }
-static method mapfun2() → asy::FutureOr<core::Map<core::int, core::bool>>
-  return <core::int, core::bool>{};
-static method setfun2() → asy::FutureOr<core::Set<core::int>>
-  return let final core::Set<core::int> #t21 = col::LinkedHashSet::•<core::int>() in #t21;
-static method iterablefun2() → asy::FutureOr<core::Iterable<core::int>>
-  return let final core::Set<core::int> #t22 = col::LinkedHashSet::•<core::int>() in #t22;
-static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int>>
+static method mapfun2() → asy::FutureOr<core::Map<core::int*, core::bool*>*>*
+  return <core::int*, core::bool*>{};
+static method setfun2() → asy::FutureOr<core::Set<core::int*>*>*
+  return let final core::Set<core::int*>* #t21 = col::LinkedHashSet::•<core::int*>() in #t21;
+static method iterablefun2() → asy::FutureOr<core::Iterable<core::int*>*>*
+  return let final core::Set<core::int*>* #t22 = col::LinkedHashSet::•<core::int*>() in #t22;
+static method lhsfun2() → asy::FutureOr<col::LinkedHashSet<core::int*>*>*
   return let final<BottomType> #t23 = 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'.
  - 'FutureOr' is from 'dart:async'.
  - 'LinkedHashSet' is from 'dart:collection'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashSet<int>>'.
 FutureOr<LinkedHashSet<int>> lhsfun2() => {};
-                                          ^" in (let final core::Set<dynamic> #t24 = col::LinkedHashSet::•<dynamic>() in #t24) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int>>;
-static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>
+                                          ^" in (let final core::Set<dynamic>* #t24 = col::LinkedHashSet::•<dynamic>() in #t24) as{TypeError} asy::FutureOr<col::LinkedHashSet<core::int*>*>*;
+static method lhmfun2() → asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*
   return let final<BottomType> #t25 = 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'.
  - 'FutureOr' is from 'dart:async'.
  - 'LinkedHashMap' is from 'dart:collection'.
 Try changing the type of the left hand side, or casting the right hand side to 'FutureOr<LinkedHashMap<int, bool>>'.
 FutureOr<LinkedHashMap<int, bool>> lhmfun2() => {};
-                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int, core::bool>>;
+                                                ^" in <dynamic, dynamic>{} as{TypeError} asy::FutureOr<col::LinkedHashMap<core::int*, core::bool*>*>*;
diff --git a/pkg/front_end/testcases/spread_collection.dart b/pkg/front_end/testcases/spread_collection.dart
deleted file mode 100644
index 333331b..0000000
--- a/pkg/front_end/testcases/spread_collection.dart
+++ /dev/null
@@ -1,16 +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.
-
-main() {
-  final aList = <int>[1, ...[2], ...?[3]];
-  final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-  final aSet = <int>{1, ...[2], ...?[3]};
-  final aSetOrMap = {...foo()};
-
-  print(aList);
-  print(aSet);
-  print(aMap);
-}
-
-foo() => null;
\ No newline at end of file
diff --git a/pkg/front_end/testcases/spread_collection.dart.legacy.expect b/pkg/front_end/testcases/spread_collection.dart.legacy.expect
deleted file mode 100644
index ce54701..0000000
--- a/pkg/front_end/testcases/spread_collection.dart.legacy.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:6:26: Error: Unexpected token '...'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:34: Error: Unexpected token '...?'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                  ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:33: Error: Unexpected token '...'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:44: Error: Unexpected token '...?'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                            ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                         ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:33: Error: Unexpected token '...?'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                 ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:9:22: Error: Unexpected token '...'.
-//   final aSetOrMap = {...foo()};
-//                      ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  final dynamic aList = <core::int>[1];
-  final dynamic aMap = <core::int, core::int>{1: 1};
-  final dynamic aSet = <core::int>{1};
-  final dynamic aSetOrMap = <dynamic, dynamic>{};
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method foo() → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect b/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect
deleted file mode 100644
index ce54701..0000000
--- a/pkg/front_end/testcases/spread_collection.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,46 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:6:26: Error: Unexpected token '...'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:6:34: Error: Unexpected token '...?'.
-//   final aList = <int>[1, ...[2], ...?[3]];
-//                                  ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:33: Error: Unexpected token '...'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:7:44: Error: Unexpected token '...?'.
-//   final aMap = <int, int>{1: 1, ...{2: 2}, ...?{3: 3}};
-//                                            ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:25: Error: Unexpected token '...'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                         ^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:8:33: Error: Unexpected token '...?'.
-//   final aSet = <int>{1, ...[2], ...?[3]};
-//                                 ^^^^
-//
-// pkg/front_end/testcases/spread_collection.dart:9:22: Error: Unexpected token '...'.
-//   final aSetOrMap = {...foo()};
-//                      ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method main() → dynamic {
-  final dynamic aList = <core::int>[1];
-  final dynamic aMap = <core::int, core::int>{1: 1};
-  final dynamic aSet = <core::int>{1};
-  final dynamic aSetOrMap = <dynamic, dynamic>{};
-  core::print(aList);
-  core::print(aSet);
-  core::print(aMap);
-}
-static method foo() → dynamic
-  return null;
diff --git a/pkg/front_end/testcases/spread_collection.dart.strong.expect b/pkg/front_end/testcases/spread_collection.dart.strong.expect
deleted file mode 100644
index dbfd7b4..0000000
--- a/pkg/front_end/testcases/spread_collection.dart.strong.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:9: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>[];
-    #t1.{core::List::add}(1);
-    for (final core::int #t2 in <core::int>[2])
-      #t1.{core::List::add}(#t2);
-    final dynamic #t3 = <core::int>[3];
-    if(!#t3.{core::Object::==}(null))
-      for (final core::int #t4 in #t3)
-        #t1.{core::List::add}(#t4);
-  } =>#t1;
-  final core::Map<core::int, core::int> aMap = block {
-    final core::Map<core::int, core::int> #t5 = <core::int, core::int>{};
-    #t5.{core::Map::[]=}(1, 1);
-    for (final core::MapEntry<core::int, core::int> #t6 in <core::int, core::int>{2: 2}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-    final core::Map<dynamic, dynamic> #t7 = <core::int, core::int>{3: 3};
-    if(!#t7.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t8 in #t7.{core::Map::entries})
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
-  } =>#t5;
-  final core::Set<core::int> aSet = block {
-    final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
-    #t9.{core::Set::add}(1);
-    for (final core::int #t10 in <core::int>[2])
-      #t9.{core::Set::add}(#t10);
-    final dynamic #t11 = <core::int>[3];
-    if(!#t11.{core::Object::==}(null))
-      for (final core::int #t12 in #t11)
-        #t9.{core::Set::add}(#t12);
-  } =>#t9;
-  final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/spread_collection.dart:9: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/spread_collection.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
deleted file mode 100644
index dbfd7b4..0000000
--- a/pkg/front_end/testcases/spread_collection.dart.strong.transformed.expect
+++ /dev/null
@@ -1,54 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection.dart:9: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>[];
-    #t1.{core::List::add}(1);
-    for (final core::int #t2 in <core::int>[2])
-      #t1.{core::List::add}(#t2);
-    final dynamic #t3 = <core::int>[3];
-    if(!#t3.{core::Object::==}(null))
-      for (final core::int #t4 in #t3)
-        #t1.{core::List::add}(#t4);
-  } =>#t1;
-  final core::Map<core::int, core::int> aMap = block {
-    final core::Map<core::int, core::int> #t5 = <core::int, core::int>{};
-    #t5.{core::Map::[]=}(1, 1);
-    for (final core::MapEntry<core::int, core::int> #t6 in <core::int, core::int>{2: 2}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-    final core::Map<dynamic, dynamic> #t7 = <core::int, core::int>{3: 3};
-    if(!#t7.{core::Object::==}(null))
-      for (final core::MapEntry<core::int, core::int> #t8 in #t7.{core::Map::entries})
-        #t5.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
-  } =>#t5;
-  final core::Set<core::int> aSet = block {
-    final core::Set<core::int> #t9 = col::LinkedHashSet::•<core::int>();
-    #t9.{core::Set::add}(1);
-    for (final core::int #t10 in <core::int>[2])
-      #t9.{core::Set::add}(#t10);
-    final dynamic #t11 = <core::int>[3];
-    if(!#t11.{core::Object::==}(null))
-      for (final core::int #t12 in #t11)
-        #t9.{core::Set::add}(#t12);
-  } =>#t9;
-  final dynamic aSetOrMap = invalid-expression "pkg/front_end/testcases/spread_collection.dart:9: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/spread_collection_inference.dart b/pkg/front_end/testcases/spread_collection_inference.dart
deleted file mode 100644
index 60c1032..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart
+++ /dev/null
@@ -1,153 +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 case checks that inference works for spread collections, and that
-// the errors are reported when necessary.
-
-/*@testedFeatures=inference*/
-
-Map<K, V> bar<K, V>() => null;
-
-foo(dynamic dynVar) {
-  List<int> spread = <int>[1, 2, 3];
-  Map<String, int> mapSpread = <String, int>{"foo": 4, "bar": 2};
-  int notSpreadInt = 42;
-  int Function() notSpreadFunction = null;
-  // Note that all values are actually ints.
-  Map<int, num> mapIntNum = <int, num>{42: 42};
-  List<num> listNum = <num>[42];
-
-  var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
-    /*@typeArgs=dynamic*/ []];
-
-  var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
-
-  var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
-    /*@typeArgs=dynamic, dynamic*/ {}};
-
-  var /*@type=Map<dynamic, dynamic>*/ map10ambiguous =
-    /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
-
-  var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
-
-  var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
-
-  var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
-
-  var /*@type=Map<String, int>*/ map20 = /*@typeArgs=String, int*/
-    {...mapSpread, "baz": 42};
-
-  var /*@type=Map<String, int>*/ map20ambiguous = /*@typeArgs=String, int*/
-    {...mapSpread};
-
-  var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
-      dynamic)];
-
-  var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
-      dynamic), 42};
-
-  var /*@type=Map<dynamic, dynamic>*/ map21 = /*@typeArgs=dynamic, dynamic*/
-    {...(mapSpread as dynamic), "baz": 42};
-
-  dynamic map21ambiguous = {...
-    (mapSpread as dynamic)};
-
-  List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
-
-  Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
-
-  Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
-
-  Map<String, int> map22 = /*@typeArgs=String, int*/
-    {... /*@typeArgs=String, int*/ {}};
-
-  List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
-    [/*@typeArgs=int*/ []]];
-
-  Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
-    [/*@typeArgs=int*/ []], <int>[42]};
-
-  Set<List<int>> set23ambiguous = /*@typeArgs=List<int>*/
-    {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
-
-  Map<String, List<int>> map23 = /*@typeArgs=String, List<int>*/
-    {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
-
-  dynamic map24ambiguous = {...
-    spread, ...mapSpread};
-
-  int lhs30 = /*@typeArgs=int*/ [...spread];
-
-  int set30 = /*@typeArgs=int*/ {...spread, 42};
-
-  int set30ambiguous = /*@typeArgs=int*/
-    {...spread};
-
-  int map30 = /*@typeArgs=String, int*/
-    {...mapSpread, "baz": 42};
-
-  int map30ambiguous = /*@typeArgs=String, int*/
-    {...mapSpread};
-
-  List<dynamic> lhs40 = <dynamic>[...
-    notSpreadInt];
-
-  Set<dynamic> set40 = <dynamic>{...
-    notSpreadInt};
-
-  Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
- notSpreadInt};
-
-  List<dynamic> lhs50 = <dynamic> [...
-    notSpreadFunction];
-
-  Set<dynamic> set50 = <dynamic> {...
-    notSpreadFunction};
-
-  Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
- notSpreadFunction};
-
-  List<String> lhs60 = <String>[...
-    spread];
-
-  Set<String> set60 = <String>{... spread};
-
-  Map<int, int> map60 = <int, int>{...
- mapSpread};
-
-  Map<String, String> map61 = <String, String>{...
- mapSpread};
-
-  List<int> lhs70 = <int>[... null];
-
-  Set<int> set70 = <int>{... null};
-
-  var /*@type=Set<dynamic>*/ set71ambiguous = /*@typeArgs=dynamic*/
-    {... null, ... /*@typeArgs=dynamic*/
-      []};
-
-  Map<String, int> map70 = <String, int>{...
-    null};
-
-  List<int> lhs80 = <int>[...?null];
-
-  Set<int> set80 = <int>{...?null};
-
-  var /*@type=Set<dynamic>*/ set81ambiguous = /*@typeArgs=dynamic*/
-    {...?null, ... /*@typeArgs=dynamic*/ []};
-
-  Map<String, int> map80 = <String, int>{...?null};
-
-  var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
-
-  List<int> list100 = <int>[...listNum];
-
-  Map<num, int> map100 = <num, int>{...mapIntNum};
-
-  List<int> list110 = <int>[...dynVar];
-
-  Map<num, int> map110 = <num, int>{...dynVar};
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
deleted file mode 100644
index 4eac9e2..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.expect
+++ /dev/null
@@ -1,280 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:21:62: Error: Unexpected token '...'.
-//   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:24:48: Error: Unexpected token '...'.
-//   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:26:66: Error: Unexpected token '...'.
-//   var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:30:37: Error: Unexpected token '...'.
-//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
-//                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:32:54: Error: Unexpected token '...'.
-//   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
-//                                                      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:34:53: Error: Unexpected token '...'.
-//   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
-//                                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:36:62: Error: Unexpected token '...'.
-//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:39:6: Error: Unexpected token '...'.
-//     {...mapSpread, "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:42:6: Error: Unexpected token '...'.
-//     {...mapSpread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:44:62: Error: Unexpected token '...'.
-//   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:47:61: Error: Unexpected token '...'.
-//   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
-//                                                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:51:6: Error: Unexpected token '...'.
-//     {...(mapSpread as dynamic), "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:53:29: Error: Unexpected token '...'.
-//   dynamic map21ambiguous = {...
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:56:40: Error: Unexpected token '...'.
-//   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
-//                                        ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:58:39: Error: Unexpected token '...'.
-//   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
-//                                       ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:60:48: Error: Unexpected token '...'.
-//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:63:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=String, int*/ {}};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:65:52: Error: Unexpected token '...'.
-//   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:68:51: Error: Unexpected token '...'.
-//   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
-//                                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:72:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:75:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:77:29: Error: Unexpected token '...'.
-//   dynamic map24ambiguous = {...
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:78:13: Error: Unexpected token '...'.
-//     spread, ...mapSpread};
-//             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:80:34: Error: Unexpected token '...'.
-//   int lhs30 = /*@typeArgs=int*/ [...spread];
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:82:34: Error: Unexpected token '...'.
-//   int set30 = /*@typeArgs=int*/ {...spread, 42};
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:85:6: Error: Unexpected token '...'.
-//     {...spread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:88:6: Error: Unexpected token '...'.
-//     {...mapSpread, "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:91:6: Error: Unexpected token '...'.
-//     {...mapSpread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:93:35: Error: Unexpected token '...'.
-//   List<dynamic> lhs40 = <dynamic>[...
-//                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:96:34: Error: Unexpected token '...'.
-//   Set<dynamic> set40 = <dynamic>{...
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:99:52: Error: Unexpected token '...'.
-//   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:102:36: Error: Unexpected token '...'.
-//   List<dynamic> lhs50 = <dynamic> [...
-//                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:105:35: Error: Unexpected token '...'.
-//   Set<dynamic> set50 = <dynamic> {...
-//                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:108:52: Error: Unexpected token '...'.
-//   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:111:33: Error: Unexpected token '...'.
-//   List<String> lhs60 = <String>[...
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:114:32: Error: Unexpected token '...'.
-//   Set<String> set60 = <String>{... spread};
-//                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:116:36: Error: Unexpected token '...'.
-//   Map<int, int> map60 = <int, int>{...
-//                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:119:48: Error: Unexpected token '...'.
-//   Map<String, String> map61 = <String, String>{...
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:122:27: Error: Unexpected token '...'.
-//   List<int> lhs70 = <int>[... null];
-//                           ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:124:26: Error: Unexpected token '...'.
-//   Set<int> set70 = <int>{... null};
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:6: Error: Unexpected token '...'.
-//     {... null, ... /*@typeArgs=dynamic*/
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:16: Error: Unexpected token '...'.
-//     {... null, ... /*@typeArgs=dynamic*/
-//                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:130:42: Error: Unexpected token '...'.
-//   Map<String, int> map70 = <String, int>{...
-//                                          ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:133:27: Error: Unexpected token '...?'.
-//   List<int> lhs80 = <int>[...?null];
-//                           ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:135:26: Error: Unexpected token '...?'.
-//   Set<int> set80 = <int>{...?null};
-//                          ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:138:6: Error: Unexpected token '...?'.
-//     {...?null, ... /*@typeArgs=dynamic*/ []};
-//      ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:138:16: Error: Unexpected token '...'.
-//     {...?null, ... /*@typeArgs=dynamic*/ []};
-//                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:140:42: Error: Unexpected token '...?'.
-//   Map<String, int> map80 = <String, int>{...?null};
-//                                          ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:142:56: Error: Unexpected token '...'.
-//   var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
-//                                                        ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:144:29: Error: Unexpected token '...'.
-//   List<int> list100 = <int>[...listNum];
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:146:37: Error: Unexpected token '...'.
-//   Map<num, int> map100 = <num, int>{...mapIntNum};
-//                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:148:29: Error: Unexpected token '...'.
-//   List<int> list110 = <int>[...dynVar];
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:150:37: Error: Unexpected token '...'.
-//   Map<num, int> map110 = <num, int>{...dynVar};
-//                                     ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-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];
-  dynamic lhs10 = <dynamic>[];
-  dynamic set10 = <dynamic>{};
-  dynamic map10 = <dynamic, dynamic>{};
-  dynamic map10ambiguous = <dynamic, dynamic>{};
-  dynamic lhs20 = <dynamic>[];
-  dynamic set20 = <dynamic>{42};
-  dynamic set20ambiguous = <dynamic, dynamic>{};
-  dynamic map20 = <dynamic, dynamic>{"baz": 42};
-  dynamic map20ambiguous = <dynamic, dynamic>{};
-  dynamic lhs21 = <dynamic>[];
-  dynamic set21 = <dynamic>{42};
-  dynamic map21 = <dynamic, dynamic>{"baz": 42};
-  dynamic map21ambiguous = <dynamic, dynamic>{};
-  core::List<core::int> lhs22 = <dynamic>[];
-  core::Set<core::int> set22 = <dynamic>{42};
-  core::Set<core::int> set22ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map22 = <dynamic, dynamic>{};
-  core::List<core::List<core::int>> lhs23 = <dynamic>[];
-  core::Set<core::List<core::int>> set23 = <dynamic>{<core::int>[42]};
-  core::Set<core::List<core::int>> set23ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::List<core::int>> map23 = <dynamic, dynamic>{};
-  dynamic map24ambiguous = <dynamic, dynamic>{};
-  core::int lhs30 = <dynamic>[];
-  core::int set30 = <dynamic>{42};
-  core::int set30ambiguous = <dynamic, dynamic>{};
-  core::int map30 = <dynamic, dynamic>{"baz": 42};
-  core::int map30ambiguous = <dynamic, dynamic>{};
-  core::List<dynamic> lhs40 = <dynamic>[];
-  core::Set<dynamic> set40 = <dynamic>{};
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{};
-  core::List<dynamic> lhs50 = <dynamic>[];
-  core::Set<dynamic> set50 = <dynamic>{};
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{};
-  core::List<core::String> lhs60 = <core::String>[];
-  core::Set<core::String> set60 = <core::String>{};
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{};
-  core::List<core::int> lhs70 = <core::int>[];
-  core::Set<core::int> set70 = <core::int>{};
-  dynamic set71ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{};
-  core::List<core::int> lhs80 = <core::int>[];
-  core::Set<core::int> set80 = <core::int>{};
-  dynamic set81ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map80 = <core::String, core::int>{};
-  dynamic map90 = <core::String, core::int>{};
-  core::List<core::int> list100 = <core::int>[];
-  core::Map<core::num, core::int> map100 = <core::num, core::int>{};
-  core::List<core::int> list110 = <core::int>[];
-  core::Map<core::num, core::int> map110 = <core::num, core::int>{};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
deleted file mode 100644
index 4eac9e2..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,280 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:21:62: Error: Unexpected token '...'.
-//   var /*@type=List<dynamic>*/ lhs10 = /*@typeArgs=dynamic*/ [...
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:24:48: Error: Unexpected token '...'.
-//   var /*@type=Set<dynamic>*/ set10 = <dynamic>{... /*@typeArgs=dynamic*/ []};
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:26:66: Error: Unexpected token '...'.
-//   var /*@type=Map<dynamic, dynamic>*/ map10 = <dynamic, dynamic>{...
-//                                                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:30:37: Error: Unexpected token '...'.
-//     /*@typeArgs=dynamic, dynamic*/ {...  /*@typeArgs=dynamic, dynamic*/ {}};
-//                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:32:54: Error: Unexpected token '...'.
-//   var /*@type=List<int>*/ lhs20 = /*@typeArgs=int*/ [...spread];
-//                                                      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:34:53: Error: Unexpected token '...'.
-//   var /*@type=Set<int>*/ set20 = /*@typeArgs=int*/ {...spread, 42};
-//                                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:36:62: Error: Unexpected token '...'.
-//   var /*@type=Set<int>*/ set20ambiguous = /*@typeArgs=int*/ {...spread};
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:39:6: Error: Unexpected token '...'.
-//     {...mapSpread, "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:42:6: Error: Unexpected token '...'.
-//     {...mapSpread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:44:62: Error: Unexpected token '...'.
-//   var /*@type=List<dynamic>*/ lhs21 = /*@typeArgs=dynamic*/ [...(spread as
-//                                                              ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:47:61: Error: Unexpected token '...'.
-//   var /*@type=Set<dynamic>*/ set21 = /*@typeArgs=dynamic*/ {...(spread as
-//                                                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:51:6: Error: Unexpected token '...'.
-//     {...(mapSpread as dynamic), "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:53:29: Error: Unexpected token '...'.
-//   dynamic map21ambiguous = {...
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:56:40: Error: Unexpected token '...'.
-//   List<int> lhs22 = /*@typeArgs=int*/ [... /*@typeArgs=int*/ []];
-//                                        ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:58:39: Error: Unexpected token '...'.
-//   Set<int> set22 = /*@typeArgs=int*/ {... /*@typeArgs=int*/ [], 42};
-//                                       ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:60:48: Error: Unexpected token '...'.
-//   Set<int> set22ambiguous = /*@typeArgs=int*/ {... /*@typeArgs=int*/ []};
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:63:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=String, int*/ {}};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:65:52: Error: Unexpected token '...'.
-//   List<List<int>> lhs23 = /*@typeArgs=List<int>*/ [... /*@typeArgs=List<int>*/
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:68:51: Error: Unexpected token '...'.
-//   Set<List<int>> set23 = /*@typeArgs=List<int>*/ {... /*@typeArgs=List<int>*/
-//                                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:72:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=List<int>*/ [/*@typeArgs=int*/ []]};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:75:6: Error: Unexpected token '...'.
-//     {... /*@typeArgs=String, List<int>*/ {"baz": /*@typeArgs=int*/ []}};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:77:29: Error: Unexpected token '...'.
-//   dynamic map24ambiguous = {...
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:78:13: Error: Unexpected token '...'.
-//     spread, ...mapSpread};
-//             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:80:34: Error: Unexpected token '...'.
-//   int lhs30 = /*@typeArgs=int*/ [...spread];
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:82:34: Error: Unexpected token '...'.
-//   int set30 = /*@typeArgs=int*/ {...spread, 42};
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:85:6: Error: Unexpected token '...'.
-//     {...spread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:88:6: Error: Unexpected token '...'.
-//     {...mapSpread, "baz": 42};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:91:6: Error: Unexpected token '...'.
-//     {...mapSpread};
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:93:35: Error: Unexpected token '...'.
-//   List<dynamic> lhs40 = <dynamic>[...
-//                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:96:34: Error: Unexpected token '...'.
-//   Set<dynamic> set40 = <dynamic>{...
-//                                  ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:99:52: Error: Unexpected token '...'.
-//   Map<dynamic, dynamic> map40 = <dynamic, dynamic>{...
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:102:36: Error: Unexpected token '...'.
-//   List<dynamic> lhs50 = <dynamic> [...
-//                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:105:35: Error: Unexpected token '...'.
-//   Set<dynamic> set50 = <dynamic> {...
-//                                   ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:108:52: Error: Unexpected token '...'.
-//   Map<dynamic, dynamic> map50 = <dynamic, dynamic>{...
-//                                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:111:33: Error: Unexpected token '...'.
-//   List<String> lhs60 = <String>[...
-//                                 ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:114:32: Error: Unexpected token '...'.
-//   Set<String> set60 = <String>{... spread};
-//                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:116:36: Error: Unexpected token '...'.
-//   Map<int, int> map60 = <int, int>{...
-//                                    ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:119:48: Error: Unexpected token '...'.
-//   Map<String, String> map61 = <String, String>{...
-//                                                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:122:27: Error: Unexpected token '...'.
-//   List<int> lhs70 = <int>[... null];
-//                           ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:124:26: Error: Unexpected token '...'.
-//   Set<int> set70 = <int>{... null};
-//                          ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:6: Error: Unexpected token '...'.
-//     {... null, ... /*@typeArgs=dynamic*/
-//      ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:16: Error: Unexpected token '...'.
-//     {... null, ... /*@typeArgs=dynamic*/
-//                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:130:42: Error: Unexpected token '...'.
-//   Map<String, int> map70 = <String, int>{...
-//                                          ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:133:27: Error: Unexpected token '...?'.
-//   List<int> lhs80 = <int>[...?null];
-//                           ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:135:26: Error: Unexpected token '...?'.
-//   Set<int> set80 = <int>{...?null};
-//                          ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:138:6: Error: Unexpected token '...?'.
-//     {...?null, ... /*@typeArgs=dynamic*/ []};
-//      ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:138:16: Error: Unexpected token '...'.
-//     {...?null, ... /*@typeArgs=dynamic*/ []};
-//                ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:140:42: Error: Unexpected token '...?'.
-//   Map<String, int> map80 = <String, int>{...?null};
-//                                          ^^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:142:56: Error: Unexpected token '...'.
-//   var /*@type=Map<String, int>*/ map90 = <String, int>{... /*@typeArgs=String, int*/ bar()};
-//                                                        ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:144:29: Error: Unexpected token '...'.
-//   List<int> list100 = <int>[...listNum];
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:146:37: Error: Unexpected token '...'.
-//   Map<num, int> map100 = <num, int>{...mapIntNum};
-//                                     ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:148:29: Error: Unexpected token '...'.
-//   List<int> list110 = <int>[...dynVar];
-//                             ^^^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:150:37: Error: Unexpected token '...'.
-//   Map<num, int> map110 = <num, int>{...dynVar};
-//                                     ^^^
-//
-import self as self;
-import "dart:core" as core;
-
-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];
-  dynamic lhs10 = <dynamic>[];
-  dynamic set10 = <dynamic>{};
-  dynamic map10 = <dynamic, dynamic>{};
-  dynamic map10ambiguous = <dynamic, dynamic>{};
-  dynamic lhs20 = <dynamic>[];
-  dynamic set20 = <dynamic>{42};
-  dynamic set20ambiguous = <dynamic, dynamic>{};
-  dynamic map20 = <dynamic, dynamic>{"baz": 42};
-  dynamic map20ambiguous = <dynamic, dynamic>{};
-  dynamic lhs21 = <dynamic>[];
-  dynamic set21 = <dynamic>{42};
-  dynamic map21 = <dynamic, dynamic>{"baz": 42};
-  dynamic map21ambiguous = <dynamic, dynamic>{};
-  core::List<core::int> lhs22 = <dynamic>[];
-  core::Set<core::int> set22 = <dynamic>{42};
-  core::Set<core::int> set22ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map22 = <dynamic, dynamic>{};
-  core::List<core::List<core::int>> lhs23 = <dynamic>[];
-  core::Set<core::List<core::int>> set23 = <dynamic>{<core::int>[42]};
-  core::Set<core::List<core::int>> set23ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::List<core::int>> map23 = <dynamic, dynamic>{};
-  dynamic map24ambiguous = <dynamic, dynamic>{};
-  core::int lhs30 = <dynamic>[];
-  core::int set30 = <dynamic>{42};
-  core::int set30ambiguous = <dynamic, dynamic>{};
-  core::int map30 = <dynamic, dynamic>{"baz": 42};
-  core::int map30ambiguous = <dynamic, dynamic>{};
-  core::List<dynamic> lhs40 = <dynamic>[];
-  core::Set<dynamic> set40 = <dynamic>{};
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{};
-  core::List<dynamic> lhs50 = <dynamic>[];
-  core::Set<dynamic> set50 = <dynamic>{};
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{};
-  core::List<core::String> lhs60 = <core::String>[];
-  core::Set<core::String> set60 = <core::String>{};
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{};
-  core::List<core::int> lhs70 = <core::int>[];
-  core::Set<core::int> set70 = <core::int>{};
-  dynamic set71ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{};
-  core::List<core::int> lhs80 = <core::int>[];
-  core::Set<core::int> set80 = <core::int>{};
-  dynamic set81ambiguous = <dynamic, dynamic>{};
-  core::Map<core::String, core::int> map80 = <core::String, core::int>{};
-  dynamic map90 = <core::String, core::int>{};
-  core::List<core::int> list100 = <core::int>[];
-  core::Map<core::num, core::int> map100 = <core::num, core::int>{};
-  core::List<core::int> list110 = <core::int>[];
-  core::Map<core::num, core::int> map110 = <core::num, core::int>{};
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect b/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect
deleted file mode 100644
index e8acddb..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart.outline.expect
+++ /dev/null
@@ -1,10 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-static method bar<K extends core::Object = dynamic, V extends core::Object = dynamic>() → core::Map<self::bar::K, self::bar::V>
-  ;
-static method foo(dynamic dynVar) → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
deleted file mode 100644
index 27a3664..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart.strong.expect
+++ /dev/null
@@ -1,404 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:53: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 = {...
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-//   dynamic map24ambiguous = {...
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int lhs30 = /*@typeArgs=int*/ [...spread];
-//                                 ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
-//  - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int set30 = /*@typeArgs=int*/ {...spread, 42};
-//                                 ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
-//  - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...spread};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
-//  - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...mapSpread, "baz": 42};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
-//  - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...mapSpread};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadInt];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadInt};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-//  notSpreadInt};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadFunction];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadFunction};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-//  notSpreadFunction};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//     spread];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//   Set<String> set60 = <String>{... spread};
-//                                    ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-//  mapSpread};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-//  mapSpread};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
-//   List<int> lhs70 = <int>[... null];
-//                               ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
-//   Set<int> set70 = <int>{... null};
-//                              ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Can't spread a value with static type Null.
-//     {... null, ... /*@typeArgs=dynamic*/
-//          ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
-//     {... null, ... /*@typeArgs=dynamic*/
-//          ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
-//     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 = <dynamic>[];
-    for (final dynamic #t2 in <dynamic>[])
-      #t1.{core::List::add}(#t2);
-  } =>#t1;
-  core::Set<dynamic> set10 = block {
-    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t4 in <dynamic>[])
-      #t3.{core::Set::add}(#t4);
-  } =>#t3;
-  core::Map<dynamic, dynamic> map10 = block {
-    final core::Map<dynamic, dynamic> #t5 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t6 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-  } =>#t5;
-  core::Map<dynamic, dynamic> map10ambiguous = block {
-    final core::Map<dynamic, dynamic> #t7 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t8 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
-  } =>#t7;
-  core::List<core::int> lhs20 = block {
-    final core::List<core::int> #t9 = <core::int>[];
-    for (final core::int #t10 in spread)
-      #t9.{core::List::add}(#t10);
-  } =>#t9;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t12 in spread)
-      #t11.{core::Set::add}(#t12);
-    #t11.{core::Set::add}(42);
-  } =>#t11;
-  core::Set<core::int> set20ambiguous = block {
-    final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t14 in spread) {
-      final core::int #t15 = #t14 as{TypeError} core::int;
-      #t13.{core::Set::add}(#t15);
-    }
-  } =>#t13;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t17 in mapSpread.{core::Map::entries})
-      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
-    #t16.{core::Map::[]=}("baz", 42);
-  } =>#t16;
-  core::Map<core::String, core::int> map20ambiguous = block {
-    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t19 in mapSpread.{core::Map::entries})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
-  } =>#t18;
-  core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t20 = <dynamic>[];
-    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t20.{core::List::add}(#t21);
-  } =>#t20;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t22.{core::Set::add}(#t23);
-    #t22.{core::Set::add}(42);
-  } =>#t22;
-  core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t24 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
-    #t24.{core::Map::[]=}("baz", 42);
-  } =>#t24;
-  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:53: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 = {...
-                           ^";
-  core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t26 = <core::int>[];
-    for (final core::int #t27 in <core::int>[])
-      #t26.{core::List::add}(#t27);
-  } =>#t26;
-  core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t29 in <core::int>[])
-      #t28.{core::Set::add}(#t29);
-    #t28.{core::Set::add}(42);
-  } =>#t28;
-  core::Set<core::int> set22ambiguous = block {
-    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t31 in <core::int>[]) {
-      final core::int #t32 = #t31 as{TypeError} core::int;
-      #t30.{core::Set::add}(#t32);
-    }
-  } =>#t30;
-  core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t33 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t34 in <core::String, core::int>{}.{core::Map::entries})
-      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
-  } =>#t33;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t35 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
-      #t35.{core::List::add}(#t36);
-  } =>#t35;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
-      #t37.{core::Set::add}(#t38);
-    #t37.{core::Set::add}(<core::int>[42]);
-  } =>#t37;
-  core::Set<core::List<core::int>> set23ambiguous = block {
-    final core::Set<core::List<core::int>> #t39 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final dynamic #t40 in <core::List<core::int>>[<core::int>[]]) {
-      final core::List<core::int> #t41 = #t40 as{TypeError} core::List<core::int>;
-      #t39.{core::Set::add}(#t41);
-    }
-  } =>#t39;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t42 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t43 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
-      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
-  } =>#t42;
-  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-  dynamic map24ambiguous = {...
-                           ^";
-  core::int lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int lhs30 = /*@typeArgs=int*/ [...spread];
-                                ^" in ( block {
-    final core::List<core::int> #t45 = <core::int>[];
-    for (final core::int #t46 in spread)
-      #t45.{core::List::add}(#t46);
-  } =>#t45) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- - 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int set30 = /*@typeArgs=int*/ {...spread, 42};
-                                ^" in ( block {
-    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(42);
-  } =>#t48) as{TypeError} core::int;
-  core::int set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- - 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...spread};
-    ^" in ( block {
-    final core::Set<core::int> #t51 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t52 in spread) {
-      final core::int #t53 = #t52 as{TypeError} core::int;
-      #t51.{core::Set::add}(#t53);
-    }
-  } =>#t51) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- - 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...mapSpread, \"baz\": 42};
-    ^" in ( block {
-    final core::Map<core::String, core::int> #t55 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t56 in mapSpread.{core::Map::entries})
-      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-    #t55.{core::Map::[]=}("baz", 42);
-  } =>#t55) as{TypeError} core::int;
-  core::int map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- - 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...mapSpread};
-    ^" in ( block {
-    final core::Map<core::String, core::int> #t58 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t59 in mapSpread.{core::Map::entries})
-      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
-  } =>#t58) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadInt];
-    ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t60 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadInt};
-    ^") in #t60;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
- notSpreadInt};
- ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadFunction];
-    ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final dynamic #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadFunction};
-    ^") in #t62;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
- notSpreadFunction};
- ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-    spread];
-    ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t64 = col::LinkedHashSet::•<core::String>() in let final dynamic #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-  Set<String> set60 = <String>{... spread};
-                                   ^") in #t64;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
- mapSpread};
- ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
- mapSpread};
- ^"};
-  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
-  List<int> lhs70 = <int>[... null];
-                              ^"];
-  core::Set<core::int> set70 = let final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>() in let final dynamic #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
-  Set<int> set70 = <int>{... null};
-                             ^") in #t66;
-  core::Set<dynamic> set71ambiguous = block {
-    final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
-    {... null, ... /*@typeArgs=dynamic*/
-         ^");
-    for (final dynamic #t69 in <dynamic>[]) {
-      final dynamic #t70 = #t69 as{TypeError} dynamic;
-      #t68.{core::Set::add}(#t70);
-    }
-  } =>#t68;
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
-    null};
-    ^": null};
-  core::List<core::int> lhs80 = block {
-    final core::List<core::int> #t71 = <core::int>[];
-    final dynamic #t72 = null;
-    if(!#t72.{core::Object::==}(null))
-      for (final core::int #t73 in #t72)
-        #t71.{core::List::add}(#t73);
-  } =>#t71;
-  core::Set<core::int> set80 = block {
-    final core::Set<core::int> #t74 = col::LinkedHashSet::•<core::int>();
-    final dynamic #t75 = null;
-    if(!#t75.{core::Object::==}(null))
-      for (final core::int #t76 in #t75)
-        #t74.{core::Set::add}(#t76);
-  } =>#t74;
-  core::Set<dynamic> set81ambiguous = block {
-    final core::Set<dynamic> #t77 = col::LinkedHashSet::•<dynamic>();
-    final dynamic #t78 = null;
-    if(!#t78.{core::Object::==}(null))
-      for (final dynamic #t79 in #t78) {
-        final dynamic #t80 = #t79 as{TypeError} dynamic;
-        #t77.{core::Set::add}(#t80);
-      }
-    for (final dynamic #t81 in <dynamic>[]) {
-      final dynamic #t82 = #t81 as{TypeError} dynamic;
-      #t77.{core::Set::add}(#t82);
-    }
-  } =>#t77;
-  core::Map<core::String, core::int> map80 = block {
-    final core::Map<core::String, core::int> #t83 = <core::String, core::int>{};
-    final core::Map<dynamic, dynamic> #t84 = null;
-    if(!#t84.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t85 in #t84.{core::Map::entries})
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
-  } =>#t83;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t86 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t87 in self::bar<core::String, core::int>().{core::Map::entries})
-      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-  } =>#t86;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t88 = <core::int>[];
-    for (final dynamic #t89 in listNum) {
-      final core::int #t90 = #t89 as{TypeError} core::int;
-      #t88.{core::List::add}(#t90);
-    }
-  } =>#t88;
-  core::Map<core::num, core::int> map100 = block {
-    final core::Map<core::num, core::int> #t91 = <core::num, core::int>{};
-    for (final core::MapEntry<dynamic, dynamic> #t92 in mapIntNum.{core::Map::entries}) {
-      final core::num #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num;
-      final core::int #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int;
-      #t91.{core::Map::[]=}(#t93, #t94);
-    }
-  } =>#t91;
-  core::List<core::int> list110 = block {
-    final core::List<core::int> #t95 = <core::int>[];
-    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>) {
-      final core::int #t97 = #t96 as{TypeError} core::int;
-      #t95.{core::List::add}(#t97);
-    }
-  } =>#t95;
-  core::Map<core::num, core::int> map110 = block {
-    final core::Map<core::num, core::int> #t98 = <core::num, core::int>{};
-    for (final core::MapEntry<dynamic, dynamic> #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-      final core::num #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num;
-      final core::int #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int;
-      #t98.{core::Map::[]=}(#t100, #t101);
-    }
-  } =>#t98;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect b/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
deleted file mode 100644
index 838f328..0000000
--- a/pkg/front_end/testcases/spread_collection_inference.dart.strong.transformed.expect
+++ /dev/null
@@ -1,404 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:53: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 = {...
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-//   dynamic map24ambiguous = {...
-//                            ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
-//  - 'List' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int lhs30 = /*@typeArgs=int*/ [...spread];
-//                                 ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
-//  - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//   int set30 = /*@typeArgs=int*/ {...spread, 42};
-//                                 ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
-//  - 'Set' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...spread};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
-//  - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...mapSpread, "baz": 42};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
-//  - 'Map' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'int'.
-//     {...mapSpread};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadInt];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadInt};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
-//  notSpreadInt};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadFunction];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-//     notSpreadFunction};
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
-//  notSpreadFunction};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//     spread];
-//     ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-//   Set<String> set60 = <String>{... spread};
-//                                    ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
-//  mapSpread};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
-//  mapSpread};
-//  ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
-//   List<int> lhs70 = <int>[... null];
-//                               ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
-//   Set<int> set70 = <int>{... null};
-//                              ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Can't spread a value with static type Null.
-//     {... null, ... /*@typeArgs=dynamic*/
-//          ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
-//     {... null, ... /*@typeArgs=dynamic*/
-//          ^
-//
-// pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
-//     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 = <dynamic>[];
-    for (final dynamic #t2 in <dynamic>[])
-      #t1.{core::List::add}(#t2);
-  } =>#t1;
-  core::Set<dynamic> set10 = block {
-    final core::Set<dynamic> #t3 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t4 in <dynamic>[])
-      #t3.{core::Set::add}(#t4);
-  } =>#t3;
-  core::Map<dynamic, dynamic> map10 = block {
-    final core::Map<dynamic, dynamic> #t5 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t6 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t5.{core::Map::[]=}(#t6.{core::MapEntry::key}, #t6.{core::MapEntry::value});
-  } =>#t5;
-  core::Map<dynamic, dynamic> map10ambiguous = block {
-    final core::Map<dynamic, dynamic> #t7 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t8 in <dynamic, dynamic>{}.{core::Map::entries})
-      #t7.{core::Map::[]=}(#t8.{core::MapEntry::key}, #t8.{core::MapEntry::value});
-  } =>#t7;
-  core::List<core::int> lhs20 = block {
-    final core::List<core::int> #t9 = <core::int>[];
-    for (final core::int #t10 in spread)
-      #t9.{core::List::add}(#t10);
-  } =>#t9;
-  core::Set<core::int> set20 = block {
-    final core::Set<core::int> #t11 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t12 in spread)
-      #t11.{core::Set::add}(#t12);
-    #t11.{core::Set::add}(42);
-  } =>#t11;
-  core::Set<core::int> set20ambiguous = block {
-    final core::Set<core::int> #t13 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t14 in spread) {
-      final core::int #t15 = #t14 as{TypeError} core::int;
-      #t13.{core::Set::add}(#t15);
-    }
-  } =>#t13;
-  core::Map<core::String, core::int> map20 = block {
-    final core::Map<core::String, core::int> #t16 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t17 in mapSpread.{core::Map::entries})
-      #t16.{core::Map::[]=}(#t17.{core::MapEntry::key}, #t17.{core::MapEntry::value});
-    #t16.{core::Map::[]=}("baz", 42);
-  } =>#t16;
-  core::Map<core::String, core::int> map20ambiguous = block {
-    final core::Map<core::String, core::int> #t18 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t19 in mapSpread.{core::Map::entries})
-      #t18.{core::Map::[]=}(#t19.{core::MapEntry::key}, #t19.{core::MapEntry::value});
-  } =>#t18;
-  core::List<dynamic> lhs21 = block {
-    final core::List<dynamic> #t20 = <dynamic>[];
-    for (final dynamic #t21 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t20.{core::List::add}(#t21);
-  } =>#t20;
-  core::Set<dynamic> set21 = block {
-    final core::Set<dynamic> #t22 = col::LinkedHashSet::•<dynamic>();
-    for (final dynamic #t23 in (spread as dynamic) as{TypeError} core::Iterable<dynamic>)
-      #t22.{core::Set::add}(#t23);
-    #t22.{core::Set::add}(42);
-  } =>#t22;
-  core::Map<dynamic, dynamic> map21 = block {
-    final core::Map<dynamic, dynamic> #t24 = <dynamic, dynamic>{};
-    for (final core::MapEntry<dynamic, dynamic> #t25 in ((mapSpread as dynamic) as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries})
-      #t24.{core::Map::[]=}(#t25.{core::MapEntry::key}, #t25.{core::MapEntry::value});
-    #t24.{core::Map::[]=}("baz", 42);
-  } =>#t24;
-  dynamic map21ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:53: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 = {...
-                           ^";
-  core::List<core::int> lhs22 = block {
-    final core::List<core::int> #t26 = <core::int>[];
-    for (final core::int #t27 in <core::int>[])
-      #t26.{core::List::add}(#t27);
-  } =>#t26;
-  core::Set<core::int> set22 = block {
-    final core::Set<core::int> #t28 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t29 in <core::int>[])
-      #t28.{core::Set::add}(#t29);
-    #t28.{core::Set::add}(42);
-  } =>#t28;
-  core::Set<core::int> set22ambiguous = block {
-    final core::Set<core::int> #t30 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t31 in <core::int>[]) {
-      final core::int #t32 = #t31 as{TypeError} core::int;
-      #t30.{core::Set::add}(#t32);
-    }
-  } =>#t30;
-  core::Map<core::String, core::int> map22 = block {
-    final core::Map<core::String, core::int> #t33 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t34 in <core::String, core::int>{}.{core::Map::entries})
-      #t33.{core::Map::[]=}(#t34.{core::MapEntry::key}, #t34.{core::MapEntry::value});
-  } =>#t33;
-  core::List<core::List<core::int>> lhs23 = block {
-    final core::List<core::List<core::int>> #t35 = <core::List<core::int>>[];
-    for (final core::List<core::int> #t36 in <core::List<core::int>>[<core::int>[]])
-      #t35.{core::List::add}(#t36);
-  } =>#t35;
-  core::Set<core::List<core::int>> set23 = block {
-    final core::Set<core::List<core::int>> #t37 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final core::List<core::int> #t38 in <core::List<core::int>>[<core::int>[]])
-      #t37.{core::Set::add}(#t38);
-    #t37.{core::Set::add}(<core::int>[42]);
-  } =>#t37;
-  core::Set<core::List<core::int>> set23ambiguous = block {
-    final core::Set<core::List<core::int>> #t39 = col::LinkedHashSet::•<core::List<core::int>>();
-    for (final dynamic #t40 in <core::List<core::int>>[<core::int>[]]) {
-      final core::List<core::int> #t41 = #t40 as{TypeError} core::List<core::int>;
-      #t39.{core::Set::add}(#t41);
-    }
-  } =>#t39;
-  core::Map<core::String, core::List<core::int>> map23 = block {
-    final core::Map<core::String, core::List<core::int>> #t42 = <core::String, core::List<core::int>>{};
-    for (final core::MapEntry<core::String, core::List<core::int>> #t43 in <core::String, core::List<core::int>>{"baz": <core::int>[]}.{core::Map::entries})
-      #t42.{core::Map::[]=}(#t43.{core::MapEntry::key}, #t43.{core::MapEntry::value});
-  } =>#t42;
-  dynamic map24ambiguous = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:77:28: Error: Both Iterable and Map spread elements encountered in ambiguous literal.
-  dynamic map24ambiguous = {...
-                           ^";
-  core::int lhs30 = let final<BottomType> #t44 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:80:33: Error: A value of type 'List<int>' can't be assigned to a variable of type 'int'.
- - 'List' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int lhs30 = /*@typeArgs=int*/ [...spread];
-                                ^" in ( block {
-    final core::List<core::int> #t45 = <core::int>[];
-    for (final core::int #t46 in spread)
-      #t45.{core::List::add}(#t46);
-  } =>#t45) as{TypeError} core::int;
-  core::int set30 = let final<BottomType> #t47 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:82:33: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- - 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-  int set30 = /*@typeArgs=int*/ {...spread, 42};
-                                ^" in ( block {
-    final core::Set<core::int> #t48 = col::LinkedHashSet::•<core::int>();
-    for (final core::int #t49 in spread)
-      #t48.{core::Set::add}(#t49);
-    #t48.{core::Set::add}(42);
-  } =>#t48) as{TypeError} core::int;
-  core::int set30ambiguous = let final<BottomType> #t50 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:85:5: Error: A value of type 'Set<int>' can't be assigned to a variable of type 'int'.
- - 'Set' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...spread};
-    ^" in ( block {
-    final core::Set<core::int> #t51 = col::LinkedHashSet::•<core::int>();
-    for (final dynamic #t52 in spread) {
-      final core::int #t53 = #t52 as{TypeError} core::int;
-      #t51.{core::Set::add}(#t53);
-    }
-  } =>#t51) as{TypeError} core::int;
-  core::int map30 = let final<BottomType> #t54 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:88:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- - 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...mapSpread, \"baz\": 42};
-    ^" in ( block {
-    final core::Map<core::String, core::int> #t55 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t56 in mapSpread.{core::Map::entries})
-      #t55.{core::Map::[]=}(#t56.{core::MapEntry::key}, #t56.{core::MapEntry::value});
-    #t55.{core::Map::[]=}("baz", 42);
-  } =>#t55) as{TypeError} core::int;
-  core::int map30ambiguous = let final<BottomType> #t57 = invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:91:5: Error: A value of type 'Map<String, int>' can't be assigned to a variable of type 'int'.
- - 'Map' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'int'.
-    {...mapSpread};
-    ^" in ( block {
-    final core::Map<core::String, core::int> #t58 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t59 in mapSpread.{core::Map::entries})
-      #t58.{core::Map::[]=}(#t59.{core::MapEntry::key}, #t59.{core::MapEntry::value});
-  } =>#t58) as{TypeError} core::int;
-  core::List<dynamic> lhs40 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:94:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadInt];
-    ^"];
-  core::Set<dynamic> set40 = let final core::Set<dynamic> #t60 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t61 = #t60.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:97:5: Error: Unexpected type 'int' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadInt};
-    ^") in #t60;
-  core::Map<dynamic, dynamic> map40 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:100:2: Error: Unexpected type 'int' of a map spread entry.  Expected 'dynamic' or a Map.
- notSpreadInt};
- ^": null};
-  core::List<dynamic> lhs50 = <dynamic>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:103:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadFunction];
-    ^"];
-  core::Set<dynamic> set50 = let final core::Set<dynamic> #t62 = col::LinkedHashSet::•<dynamic>() in let final core::bool #t63 = #t62.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:106:5: Error: Unexpected type 'int Function()' of a spread.  Expected 'dynamic' or an Iterable.
-    notSpreadFunction};
-    ^") in #t62;
-  core::Map<dynamic, dynamic> map50 = <dynamic, dynamic>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:109:2: Error: Unexpected type 'int Function()' of a map spread entry.  Expected 'dynamic' or a Map.
- notSpreadFunction};
- ^": null};
-  core::List<core::String> lhs60 = <core::String>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:112:5: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-    spread];
-    ^"];
-  core::Set<core::String> set60 = let final core::Set<core::String> #t64 = col::LinkedHashSet::•<core::String>() in let final core::bool #t65 = #t64.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:114:36: Error: Can't assign spread elements of type 'int' to collection elements of type 'String'.
-  Set<String> set60 = <String>{... spread};
-                                   ^") in #t64;
-  core::Map<core::int, core::int> map60 = <core::int, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:117:2: Error: Can't assign spread entry keys of type 'String' to map entry keys of type 'int'.
- mapSpread};
- ^": null};
-  core::Map<core::String, core::String> map61 = <core::String, core::String>{null: invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:120:2: Error: Can't assign spread entry values of type 'int' to map entry values of type 'String'.
- mapSpread};
- ^"};
-  core::List<core::int> lhs70 = <core::int>[invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:122:31: Error: Can't spread a value with static type Null.
-  List<int> lhs70 = <int>[... null];
-                              ^"];
-  core::Set<core::int> set70 = let final core::Set<core::int> #t66 = col::LinkedHashSet::•<core::int>() in let final core::bool #t67 = #t66.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:124:30: Error: Can't spread a value with static type Null.
-  Set<int> set70 = <int>{... null};
-                             ^") in #t66;
-  core::Set<dynamic> set71ambiguous = block {
-    final core::Set<dynamic> #t68 = col::LinkedHashSet::•<dynamic>();
-    #t68.{core::Set::add}(invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:127:10: Error: Expected ',' before this.
-    {... null, ... /*@typeArgs=dynamic*/
-         ^");
-    for (final dynamic #t69 in <dynamic>[]) {
-      final dynamic #t70 = #t69 as{TypeError} dynamic;
-      #t68.{core::Set::add}(#t70);
-    }
-  } =>#t68;
-  core::Map<core::String, core::int> map70 = <core::String, core::int>{invalid-expression "pkg/front_end/testcases/spread_collection_inference.dart:131:5: Error: Can't spread a value with static type Null.
-    null};
-    ^": null};
-  core::List<core::int> lhs80 = block {
-    final core::List<core::int> #t71 = <core::int>[];
-    final dynamic #t72 = null;
-    if(!#t72.{core::Object::==}(null))
-      for (final core::int #t73 in #t72)
-        #t71.{core::List::add}(#t73);
-  } =>#t71;
-  core::Set<core::int> set80 = block {
-    final core::Set<core::int> #t74 = col::LinkedHashSet::•<core::int>();
-    final dynamic #t75 = null;
-    if(!#t75.{core::Object::==}(null))
-      for (final core::int #t76 in #t75)
-        #t74.{core::Set::add}(#t76);
-  } =>#t74;
-  core::Set<dynamic> set81ambiguous = block {
-    final core::Set<dynamic> #t77 = col::LinkedHashSet::•<dynamic>();
-    final dynamic #t78 = null;
-    if(!#t78.{core::Object::==}(null))
-      for (final dynamic #t79 in #t78) {
-        final dynamic #t80 = #t79 as{TypeError} dynamic;
-        #t77.{core::Set::add}(#t80);
-      }
-    for (final dynamic #t81 in <dynamic>[]) {
-      final dynamic #t82 = #t81 as{TypeError} dynamic;
-      #t77.{core::Set::add}(#t82);
-    }
-  } =>#t77;
-  core::Map<core::String, core::int> map80 = block {
-    final core::Map<core::String, core::int> #t83 = <core::String, core::int>{};
-    final core::Map<dynamic, dynamic> #t84 = null;
-    if(!#t84.{core::Object::==}(null))
-      for (final core::MapEntry<core::String, core::int> #t85 in #t84.{core::Map::entries})
-        #t83.{core::Map::[]=}(#t85.{core::MapEntry::key}, #t85.{core::MapEntry::value});
-  } =>#t83;
-  core::Map<core::String, core::int> map90 = block {
-    final core::Map<core::String, core::int> #t86 = <core::String, core::int>{};
-    for (final core::MapEntry<core::String, core::int> #t87 in self::bar<core::String, core::int>().{core::Map::entries})
-      #t86.{core::Map::[]=}(#t87.{core::MapEntry::key}, #t87.{core::MapEntry::value});
-  } =>#t86;
-  core::List<core::int> list100 = block {
-    final core::List<core::int> #t88 = <core::int>[];
-    for (final dynamic #t89 in listNum) {
-      final core::int #t90 = #t89 as{TypeError} core::int;
-      #t88.{core::List::add}(#t90);
-    }
-  } =>#t88;
-  core::Map<core::num, core::int> map100 = block {
-    final core::Map<core::num, core::int> #t91 = <core::num, core::int>{};
-    for (final core::MapEntry<dynamic, dynamic> #t92 in mapIntNum.{core::Map::entries}) {
-      final core::num #t93 = #t92.{core::MapEntry::key} as{TypeError} core::num;
-      final core::int #t94 = #t92.{core::MapEntry::value} as{TypeError} core::int;
-      #t91.{core::Map::[]=}(#t93, #t94);
-    }
-  } =>#t91;
-  core::List<core::int> list110 = block {
-    final core::List<core::int> #t95 = <core::int>[];
-    for (final dynamic #t96 in dynVar as{TypeError} core::Iterable<dynamic>) {
-      final core::int #t97 = #t96 as{TypeError} core::int;
-      #t95.{core::List::add}(#t97);
-    }
-  } =>#t95;
-  core::Map<core::num, core::int> map110 = block {
-    final core::Map<core::num, core::int> #t98 = <core::num, core::int>{};
-    for (final core::MapEntry<dynamic, dynamic> #t99 in (dynVar as{TypeError} core::Map<dynamic, dynamic>).{core::Map::entries}) {
-      final core::num #t100 = #t99.{core::MapEntry::key} as{TypeError} core::num;
-      final core::int #t101 = #t99.{core::MapEntry::value} as{TypeError} core::int;
-      #t98.{core::Map::[]=}(#t100, #t101);
-    }
-  } =>#t98;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/statements.dart b/pkg/front_end/testcases/statements.dart
deleted file mode 100644
index 9fa72f6..0000000
--- a/pkg/front_end/testcases/statements.dart
+++ /dev/null
@@ -1,104 +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.
-
-foo() {
-  try {
-    return;
-  } finally {
-    print("Hello from finally block!");
-  }
-}
-
-bar() async {
-  await for (var x in []) {
-    yield x;
-    yield* x;
-  }
-}
-
-main() {
-  do {
-    print("Hello from do-while!");
-  } while(false);
-  do var x = print("Hello from do-while!"); while(false);
-
-  for (String s in ["Hello from for-in!"]) {
-    print(s);
-  }
-  for (String s in ["Hello from for-in without block!"])
-    print(s);
-  var s;
-  for (s in ["Hello from for-in without decl!"]) {
-    print(s);
-  }
-  for (s in ["Hello from for-in without decl and block!"])
-    print(s);
-  a: b: c: print("Hello from labeled statement!");
-  try {
-    try {
-      throw "Hello from rethrow!";
-    } catch (e) {
-      rethrow;
-    }
-  } catch (e) {
-    print(e);
-  }
-  foo();
-  bool done = false;
-  while (!done) {
-    done = true;
-    print("Hello from while!");
-  }
-  ; // Testing empty statement.
-  assert(true);
-  assert(true, "Hello from assert!");
-  try {
-    assert(false, "Hello from assert!");
-  } catch (e) {
-    print(e);
-  }
-  switch (1) {
-    case 1:
-    case 2:
-      print("Hello from switch case!");
-      break;
-    default:
-      break;
-  }
-  switch (4) {
-    L2: case 2:
-      print("Hello from case 2!");
-      break;
-    L1: case 1:
-      print("Hello from case 1!");
-      continue L2;
-    L0: case 0:
-      print("Hello from case 0!");
-      continue L1;
-    case 4:
-      print("Hello from case 4!");
-      continue LD;
-    LD: default:
-      continue L0;
-  }
-  switch (4) {
-    L0: case 1:
-      print("Hello from next case 1");
-      break;
-    default:
-      continue L0;
-  }
-  int i = 0;
-  do {
-    print("Hello from do-while!");
-    if (++i < 3) continue;
-    break;
-  } while (true);
-  i = 0;
-  OUTER: while (true) {
-    print("Hello from while!");
-    if (++i < 3) continue OUTER;
-    break OUTER;
-  }
-}
diff --git a/pkg/front_end/testcases/statements.dart.legacy.expect b/pkg/front_end/testcases/statements.dart.legacy.expect
deleted file mode 100644
index 412bb2d..0000000
--- a/pkg/front_end/testcases/statements.dart.legacy.expect
+++ /dev/null
@@ -1,162 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield x;
-//     ^^^^^
-//
-// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield* x;
-//     ^^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method foo() → dynamic {
-  try {
-    return;
-  }
-  finally {
-    core::print("Hello from finally block!");
-  }
-}
-static method bar() → dynamic async {
-  await for (dynamic x in <dynamic>[]) {
-    yield x;
-    yield* x;
-  }
-}
-static method main() → dynamic {
-  do {
-    core::print("Hello from do-while!");
-  }
-  while (false)
-  do {
-    dynamic x = core::print("Hello from do-while!");
-  }
-  while (false)
-  for (core::String s in <dynamic>["Hello from for-in!"]) {
-    core::print(s);
-  }
-  for (core::String s in <dynamic>["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 1:
-    case 2:
-      {
-        core::print("Hello from switch case!");
-        break #L1;
-      }
-    #L3:
-    default:
-      {
-        break #L1;
-      }
-  }
-  #L4:
-  switch(4) {
-    #L5:
-    case 2:
-      {
-        core::print("Hello from case 2!");
-        break #L4;
-      }
-    #L6:
-    case 1:
-      {
-        core::print("Hello from case 1!");
-        continue #L5;
-      }
-    #L7:
-    case 0:
-      {
-        core::print("Hello from case 0!");
-        continue #L6;
-      }
-    #L8:
-    case 4:
-      {
-        core::print("Hello from case 4!");
-        continue #L9;
-      }
-    #L9:
-    default:
-      {
-        continue #L7;
-      }
-  }
-  #L10:
-  switch(4) {
-    #L11:
-    case 1:
-      {
-        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.+(1)).<(3))
-        break #L14;
-      break #L13;
-    }
-  while (true)
-  i = 0;
-  #L15:
-  while (true)
-    #L16:
-    {
-      core::print("Hello from while!");
-      if((i = i.+(1)).<(3))
-        break #L16;
-      break #L15;
-    }
-}
diff --git a/pkg/front_end/testcases/statements.dart.legacy.transformed.expect b/pkg/front_end/testcases/statements.dart.legacy.transformed.expect
deleted file mode 100644
index 606cb49..0000000
--- a/pkg/front_end/testcases/statements.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,212 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield x;
-//     ^^^^^
-//
-// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield* x;
-//     ^^^^^
-//
-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 /* originally async */ {
-  final asy::_AsyncAwaitCompleter<dynamic> :async_completer = new asy::_AsyncAwaitCompleter::•<dynamic>();
-  asy::FutureOr<dynamic> :return_value;
-  dynamic :async_stack_trace;
-  dynamic :async_op_then;
-  dynamic :async_op_error;
-  dynamic :await_jump_var = 0;
-  dynamic :await_ctx_var;
-  dynamic :saved_try_context_var0;
-  dynamic :saved_try_context_var1;
-  dynamic :exception0;
-  dynamic :stack_trace0;
-  function :async_op([dynamic :result, dynamic :exception, dynamic :stack_trace]) → dynamic yielding 
-    try {
-      #L1:
-      {
-        {
-          dynamic :stream = <dynamic>[];
-          asy::_asyncStarListenHelper(:stream, :async_op);
-          asy::_StreamIterator<dynamic> :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
-          const core::bool :product-mode = const core::bool::fromEnvironment("dart.vm.product");
-          try
-            #L2:
-            while (true) {
-              dynamic #t1 = :product-mode ?{dynamic} null : asy::_asyncStarMoveNextHelper(:stream);
-              [yield] let dynamic #t2 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::moveNext}(), :async_op_then, :async_op_error, :async_op) in null;
-              if(:result) {
-                dynamic x = :for-iterator.{asy::_StreamIterator::current};
-                {
-                  yield x;
-                  yield* x;
-                }
-              }
-              else
-                break #L2;
-            }
-          finally
-            if(!:for-iterator.{asy::_StreamIterator::_subscription}.{core::Object::==}(null)) {
-              [yield] let dynamic #t3 = asy::_awaitHelper(:for-iterator.{asy::_StreamIterator::cancel}(), :async_op_then, :async_op_error, :async_op) in null;
-              :result;
-            }
-        }
-      }
-      asy::_completeOnAsyncReturn(:async_completer, :return_value);
-      return;
-    }
-    on dynamic catch(dynamic :exception, dynamic :stack_trace) {
-      :async_completer.{asy::Completer::completeError}(:exception, :stack_trace);
-    }
-  :async_stack_trace = asy::_asyncStackTraceHelper(:async_op);
-  :async_op_then = asy::_asyncThenWrapperHelper(:async_op);
-  :async_op_error = asy::_asyncErrorWrapperHelper(:async_op);
-  :async_completer.start(:async_op);
-  return :async_completer.{asy::Completer::future};
-}
-static method main() → dynamic {
-  do {
-    core::print("Hello from do-while!");
-  }
-  while (false)
-  do {
-    dynamic x = core::print("Hello from do-while!");
-  }
-  while (false)
-  for (core::String s in <dynamic>["Hello from for-in!"]) {
-    core::print(s);
-  }
-  for (core::String s in <dynamic>["Hello from for-in without block!"])
-    core::print(s);
-  dynamic s;
-  for (final dynamic #t4 in <dynamic>["Hello from for-in without decl!"]) {
-    s = #t4;
-    core::print(s);
-  }
-  for (final dynamic #t5 in <dynamic>["Hello from for-in without decl and block!"]) {
-    s = #t5;
-    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);
-  }
-  #L3:
-  switch(1) {
-    #L4:
-    case 1:
-    case 2:
-      {
-        core::print("Hello from switch case!");
-        break #L3;
-      }
-    #L5:
-    default:
-      {
-        break #L3;
-      }
-  }
-  #L6:
-  switch(4) {
-    #L7:
-    case 2:
-      {
-        core::print("Hello from case 2!");
-        break #L6;
-      }
-    #L8:
-    case 1:
-      {
-        core::print("Hello from case 1!");
-        continue #L7;
-      }
-    #L9:
-    case 0:
-      {
-        core::print("Hello from case 0!");
-        continue #L8;
-      }
-    #L10:
-    case 4:
-      {
-        core::print("Hello from case 4!");
-        continue #L11;
-      }
-    #L11:
-    default:
-      {
-        continue #L9;
-      }
-  }
-  #L12:
-  switch(4) {
-    #L13:
-    case 1:
-      {
-        core::print("Hello from next case 1");
-        break #L12;
-      }
-    #L14:
-    default:
-      {
-        continue #L13;
-      }
-  }
-  core::int i = 0;
-  #L15:
-  do
-    #L16:
-    {
-      core::print("Hello from do-while!");
-      if((i = i.+(1)).<(3))
-        break #L16;
-      break #L15;
-    }
-  while (true)
-  i = 0;
-  #L17:
-  while (true)
-    #L18:
-    {
-      core::print("Hello from while!");
-      if((i = i.+(1)).<(3))
-        break #L18;
-      break #L17;
-    }
-}
diff --git a/pkg/front_end/testcases/statements.dart.strong.expect b/pkg/front_end/testcases/statements.dart.strong.expect
deleted file mode 100644
index e8366ee..0000000
--- a/pkg/front_end/testcases/statements.dart.strong.expect
+++ /dev/null
@@ -1,173 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/statements.dart:15:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield x;
-//     ^^^^^
-//
-// pkg/front_end/testcases/statements.dart:16:5: Error: 'yield' can only be used in 'sync*' or 'async*' methods.
-//     yield* x;
-//     ^^^^^
-//
-// pkg/front_end/testcases/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
-//  - 'List' is from 'dart:core'.
-//  - 'Stream' is from 'dart:async'.
-//   await for (var x in []) {
-//                       ^
-//
-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 async {
-  await for (dynamic x in let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/statements.dart:14:23: Error: The type 'List<dynamic>' used in the 'for' loop must implement 'Stream<dynamic>'.
- - 'List' is from 'dart:core'.
- - 'Stream' is from 'dart:async'.
-  await for (var x in []) {
-                      ^" in <dynamic>[] as{TypeError} asy::Stream<dynamic>) {
-    yield x;
-    yield* x;
-  }
-}
-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 #t2 in <dynamic>["Hello from for-in without decl!"]) {
-    s = #t2;
-    core::print(s);
-  }
-  for (final dynamic #t3 in <dynamic>["Hello from for-in without decl and block!"]) {
-    s = #t3;
-    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 1:
-    case 2:
-      {
-        core::print("Hello from switch case!");
-        break #L1;
-      }
-    #L3:
-    default:
-      {
-        break #L1;
-      }
-  }
-  #L4:
-  switch(4) {
-    #L5:
-    case 2:
-      {
-        core::print("Hello from case 2!");
-        break #L4;
-      }
-    #L6:
-    case 1:
-      {
-        core::print("Hello from case 1!");
-        continue #L5;
-      }
-    #L7:
-    case 0:
-      {
-        core::print("Hello from case 0!");
-        continue #L6;
-      }
-    #L8:
-    case 4:
-      {
-        core::print("Hello from case 4!");
-        continue #L9;
-      }
-    #L9:
-    default:
-      {
-        continue #L7;
-      }
-  }
-  #L10:
-  switch(4) {
-    #L11:
-    case 1:
-      {
-        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::<}(3))
-        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::<}(3))
-        break #L16;
-      break #L15;
-    }
-}
diff --git a/pkg/front_end/testcases/statements.dart.type_promotion.expect b/pkg/front_end/testcases/statements.dart.type_promotion.expect
deleted file mode 100644
index f1b6150..0000000
--- a/pkg/front_end/testcases/statements.dart.type_promotion.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-pkg/front_end/testcases/statements.dart:50:10: Context: Write to done@988
-    done = true;
-         ^
-pkg/front_end/testcases/statements.dart:95:9: Context: Write to i@1814
-    if (++i < 3) continue;
-        ^^
-pkg/front_end/testcases/statements.dart:98:5: Context: Write to i@1814
-  i = 0;
-    ^
-pkg/front_end/testcases/statements.dart:101:9: Context: Write to i@1814
-    if (++i < 3) continue OUTER;
-        ^^
diff --git a/pkg/front_end/testcases/static_setter.dart.legacy.expect b/pkg/front_end/testcases/static_setter.dart.legacy.expect
deleted file mode 100644
index 055ed11..0000000
--- a/pkg/front_end/testcases/static_setter.dart.legacy.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static set foo(dynamic x) → void {}
-static method main() → dynamic {
-  self::foo = new self::Foo::•();
-}
diff --git a/pkg/front_end/testcases/static_setter.dart.legacy.transformed.expect b/pkg/front_end/testcases/static_setter.dart.legacy.transformed.expect
deleted file mode 100644
index 055ed11..0000000
--- a/pkg/front_end/testcases/static_setter.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static set foo(dynamic x) → void {}
-static method main() → dynamic {
-  self::foo = new self::Foo::•();
-}
diff --git a/pkg/front_end/testcases/static_setter.dart.outline.expect b/pkg/front_end/testcases/static_setter.dart.outline.expect
deleted file mode 100644
index 0c46d4c..0000000
--- a/pkg/front_end/testcases/static_setter.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    ;
-}
-static set foo(dynamic x) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/static_setter.dart.strong.expect b/pkg/front_end/testcases/static_setter.dart.strong.expect
deleted file mode 100644
index 055ed11..0000000
--- a/pkg/front_end/testcases/static_setter.dart.strong.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static set foo(dynamic x) → void {}
-static method main() → dynamic {
-  self::foo = new self::Foo::•();
-}
diff --git a/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect b/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect
deleted file mode 100644
index 055ed11..0000000
--- a/pkg/front_end/testcases/static_setter.dart.strong.transformed.expect
+++ /dev/null
@@ -1,13 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  synthetic constructor •() → self::Foo
-    : super core::Object::•()
-    ;
-}
-static set foo(dynamic x) → void {}
-static method main() → dynamic {
-  self::foo = new self::Foo::•();
-}
diff --git a/pkg/front_end/testcases/store_load.dart.legacy.expect b/pkg/front_end/testcases/store_load.dart.legacy.expect
deleted file mode 100644
index 51b4dc2..0000000
--- a/pkg/front_end/testcases/store_load.dart.legacy.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-}
-class FooValue extends core::Object {
-  synthetic constructor •() → self::FooValue
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  field dynamic _field = null;
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-class BarValue extends core::Object {
-  synthetic constructor •() → self::BarValue
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic foo = new self::Foo::•();
-  foo._field = new self::FooValue::•();
-  dynamic fooValue = foo._field;
-  core::print(fooValue);
-  dynamic bar = new self::Bar::•();
-  bar._field = new self::BarValue::•();
-  dynamic barValue = bar._field;
-  core::print(barValue);
-}
diff --git a/pkg/front_end/testcases/store_load.dart.legacy.transformed.expect b/pkg/front_end/testcases/store_load.dart.legacy.transformed.expect
deleted file mode 100644
index 51b4dc2..0000000
--- a/pkg/front_end/testcases/store_load.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-}
-class FooValue extends core::Object {
-  synthetic constructor •() → self::FooValue
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  field dynamic _field = null;
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-class BarValue extends core::Object {
-  synthetic constructor •() → self::BarValue
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic foo = new self::Foo::•();
-  foo._field = new self::FooValue::•();
-  dynamic fooValue = foo._field;
-  core::print(fooValue);
-  dynamic bar = new self::Bar::•();
-  bar._field = new self::BarValue::•();
-  dynamic barValue = bar._field;
-  core::print(barValue);
-}
diff --git a/pkg/front_end/testcases/store_load.dart.outline.expect b/pkg/front_end/testcases/store_load.dart.outline.expect
deleted file mode 100644
index 3fc47e2..0000000
--- a/pkg/front_end/testcases/store_load.dart.outline.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field dynamic _field;
-  synthetic constructor •() → self::Foo
-    ;
-}
-class FooValue extends core::Object {
-  synthetic constructor •() → self::FooValue
-    ;
-}
-class Bar extends core::Object {
-  field dynamic _field;
-  synthetic constructor •() → self::Bar
-    ;
-}
-class BarValue extends core::Object {
-  synthetic constructor •() → self::BarValue
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/store_load.dart.strong.expect b/pkg/front_end/testcases/store_load.dart.strong.expect
deleted file mode 100644
index f3426e5..0000000
--- a/pkg/front_end/testcases/store_load.dart.strong.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-}
-class FooValue extends core::Object {
-  synthetic constructor •() → self::FooValue
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  field dynamic _field = null;
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-class BarValue extends core::Object {
-  synthetic constructor •() → self::BarValue
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  foo.{self::Foo::_field} = new self::FooValue::•();
-  dynamic fooValue = foo.{self::Foo::_field};
-  core::print(fooValue);
-  self::Bar bar = new self::Bar::•();
-  bar.{self::Bar::_field} = new self::BarValue::•();
-  dynamic barValue = bar.{self::Bar::_field};
-  core::print(barValue);
-}
diff --git a/pkg/front_end/testcases/store_load.dart.strong.transformed.expect b/pkg/front_end/testcases/store_load.dart.strong.transformed.expect
deleted file mode 100644
index f3426e5..0000000
--- a/pkg/front_end/testcases/store_load.dart.strong.transformed.expect
+++ /dev/null
@@ -1,36 +0,0 @@
-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::•()
-    ;
-}
-class FooValue extends core::Object {
-  synthetic constructor •() → self::FooValue
-    : super core::Object::•()
-    ;
-}
-class Bar extends core::Object {
-  field dynamic _field = null;
-  synthetic constructor •() → self::Bar
-    : super core::Object::•()
-    ;
-}
-class BarValue extends core::Object {
-  synthetic constructor •() → self::BarValue
-    : super core::Object::•()
-    ;
-}
-static method main() → dynamic {
-  self::Foo foo = new self::Foo::•();
-  foo.{self::Foo::_field} = new self::FooValue::•();
-  dynamic fooValue = foo.{self::Foo::_field};
-  core::print(fooValue);
-  self::Bar bar = new self::Bar::•();
-  bar.{self::Bar::_field} = new self::BarValue::•();
-  dynamic barValue = bar.{self::Bar::_field};
-  core::print(barValue);
-}
diff --git a/pkg/front_end/testcases/stringliteral.dart.strong.expect b/pkg/front_end/testcases/stringliteral.dart.strong.expect
deleted file mode 100644
index fd90ff9..0000000
--- a/pkg/front_end/testcases/stringliteral.dart.strong.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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/stringliteral.dart.strong.transformed.expect b/pkg/front_end/testcases/stringliteral.dart.strong.transformed.expect
deleted file mode 100644
index fd90ff9..0000000
--- a/pkg/front_end/testcases/stringliteral.dart.strong.transformed.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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/strong.status b/pkg/front_end/testcases/strong.status
index 45003af..80b9301 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -6,28 +6,51 @@
 # Kernel ASTs directly, that is, code in pkg/fasta/lib/src/kernel/ with
 # strong-mode enabled.
 
-abstract_members: TypeCheckError
-accessors: RuntimeError
-ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
-argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
-await_in_non_async: RuntimeError # Expected.
-bug21938: TypeCheckError
-bug30695: TypeCheckError
-bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
-bug32629: InstrumentationMismatch # Test has an intentional error
-call: TypeCheckError
-cascade: RuntimeError
-constructor_initializer_invalid: RuntimeError # Fails execution after recovery
-covariant_generic: RuntimeError
-duplicated_declarations: TypeCheckError
-duplicated_field_initializer: RuntimeError
-dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
-expressions: RuntimeError
-extension_methods: TypeCheckError
-external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
-fallthrough: ExpectationFileMismatch
-ignore_function: TypeCheckError
-incomplete_field_formal_parameter: RuntimeError
+general/abstract_members: TypeCheckError
+general/accessors: RuntimeError
+general/ambiguous_exports: RuntimeError # Expected, this file exports two main methods.
+general/argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+general/await_in_non_async: RuntimeError # Expected.
+general/bug21938: TypeCheckError
+general/bug30695: TypeCheckError
+general/bug31124: RuntimeError # Test has no main method (and we shouldn't add one).
+general/bug32629: InstrumentationMismatch # Test has an intentional error
+general/call: TypeCheckError
+general/cascade: RuntimeError
+general/constructor_initializer_invalid: RuntimeError # Fails execution after recovery
+general/covariant_generic: RuntimeError
+general/duplicated_declarations: TypeCheckError
+general/duplicated_field_initializer: RuntimeError
+general/dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+general/expressions: RuntimeError
+general/extension_methods: RuntimeError
+general/external_import: RuntimeError # The native extension to import doesn't exist. This is ok.
+general/fallthrough: ExpectationFileMismatch
+general/ignore_function: TypeCheckError
+general/incomplete_field_formal_parameter: RuntimeError
+general/invalid_type: TypeCheckError
+general/invocations: RuntimeError
+general/issue34899: TypeCheckError
+general/micro: RuntimeError
+general/mixin_application_override: ExpectationFileMismatch # Too many errors.
+general/mixin_application_override: TypeCheckError
+general/mixin_constructors_with_default_values: RuntimeError # Expected
+general/operator_method_not_found: RuntimeError # Expected
+general/optional: 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/reject_generic_function_types_in_bounds: RuntimeError # Expected
+general/spread_collection: RuntimeError
+general/statements: Crash
+general/type_parameter_type_named_int: RuntimeError # Expected
+general/type_variable_as_super: RuntimeError
+general/unsound_promotion: RuntimeError
+general/void_methods: ExpectationFileMismatch
+general/warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 inference/abstract_class_instantiation: InstrumentationMismatch # Issue #30040
 inference/conflicting_fields: TypeCheckError
 inference/conflicts_can_happen2: TypeCheckError
@@ -76,21 +99,7 @@
 inference_new/invalid_assignment_during_toplevel_inference: TypeCheckError
 instantiate_to_bound/non_simple_class_parametrized_typedef_cycle: RuntimeError # Expected
 instantiate_to_bound/non_simple_generic_function_in_bound_regress: RuntimeError # Expected
-invalid_type: TypeCheckError
-invocations: RuntimeError
-issue34899: TypeCheckError
-micro: RuntimeError
-mixin_application_override: ExpectationFileMismatch # Too many errors.
-mixin_application_override: TypeCheckError
 nnbd/nullable_param: RuntimeError
-operator_method_not_found: RuntimeError # Expected
-optional: TypeCheckError
-override_check_accessor_after_inference: TypeCheckError # Issue #31620
-override_check_accessor_basic: TypeCheckError # Issue #31620
-override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
-override_check_after_inference: TypeCheckError # Issue #31620
-override_check_basic: TypeCheckError # Issue #31620
-override_check_with_covariant_modifier: TypeCheckError # Issue #31620
 rasta/abstract_constructor: RuntimeError
 rasta/bad_constructor_redirection: RuntimeError
 rasta/bad_continue: RuntimeError
@@ -154,16 +163,8 @@
 regress/issue_36647_2: RuntimeError # Expected
 regress/issue_36669: RuntimeError
 regress/issue_37285: RuntimeError
-reject_generic_function_types_in_bounds: RuntimeError # Expected
 runtime_checks_new/contravariant_generic_return_with_compound_assign_implicit_downcast: RuntimeError
 runtime_checks_new/mixin_forwarding_stub_field: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_getter: TypeCheckError
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 set_literals/disambiguation_rule: RuntimeError
-spread_collection: RuntimeError
-statements: Crash
-type_parameter_type_named_int: RuntimeError # Expected
-type_variable_as_super: RuntimeError
-unsound_promotion: RuntimeError
-void_methods: ExpectationFileMismatch
-warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
diff --git a/pkg/front_end/testcases/super_call.dart.legacy.expect b/pkg/front_end/testcases/super_call.dart.legacy.expect
deleted file mode 100644
index 4e4dd69..0000000
--- a/pkg/front_end/testcases/super_call.dart.legacy.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
-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.*(2);
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method call(core::int x) → core::int
-    return x.*(3);
-  method call_super() → core::int {
-    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^";
-  }
-}
-static method main() → dynamic {
-  assert(new self::B::•().call_super().==(10));
-}
diff --git a/pkg/front_end/testcases/super_call.dart.legacy.transformed.expect b/pkg/front_end/testcases/super_call.dart.legacy.transformed.expect
deleted file mode 100644
index 4e4dd69..0000000
--- a/pkg/front_end/testcases/super_call.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
-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.*(2);
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method call(core::int x) → core::int
-    return x.*(3);
-  method call_super() → core::int {
-    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^";
-  }
-}
-static method main() → dynamic {
-  assert(new self::B::•().call_super().==(10));
-}
diff --git a/pkg/front_end/testcases/super_call.dart.outline.expect b/pkg/front_end/testcases/super_call.dart.outline.expect
deleted file mode 100644
index 8b792be..0000000
--- a/pkg/front_end/testcases/super_call.dart.outline.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-  method call(core::int x) → core::int
-    ;
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    ;
-  method call(core::int x) → core::int
-    ;
-  method call_super() → core::int
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/super_call.dart.strong.expect b/pkg/front_end/testcases/super_call.dart.strong.expect
deleted file mode 100644
index 3342243..0000000
--- a/pkg/front_end/testcases/super_call.dart.strong.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
-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);
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method call(core::int x) → core::int
-    return x.{core::num::*}(3);
-  method call_super() → core::int {
-    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^" as{TypeError} core::int;
-  }
-}
-static method main() → dynamic {
-  assert(new self::B::•().{self::B::call_super}().{core::num::==}(10));
-}
diff --git a/pkg/front_end/testcases/super_call.dart.strong.transformed.expect b/pkg/front_end/testcases/super_call.dart.strong.transformed.expect
deleted file mode 100644
index 3342243..0000000
--- a/pkg/front_end/testcases/super_call.dart.strong.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-// To delegate a constructor to a super constructor, put the super call as an initializer.
-//     return super(5);
-//            ^
-//
-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);
-}
-class B extends self::A {
-  synthetic constructor •() → self::B
-    : super self::A::•()
-    ;
-  method call(core::int x) → core::int
-    return x.{core::num::*}(3);
-  method call_super() → core::int {
-    return invalid-expression "pkg/front_end/testcases/super_call.dart:14:12: Error: Can't use 'super' as an expression.
-To delegate a constructor to a super constructor, put the super call as an initializer.
-    return super(5);
-           ^" as{TypeError} core::int;
-  }
-}
-static method main() → dynamic {
-  assert(new self::B::•().{self::B::call_super}().{core::num::==}(10));
-}
diff --git a/pkg/front_end/testcases/super_nsm.dart.legacy.expect b/pkg/front_end/testcases/super_nsm.dart.legacy.expect
deleted file mode 100644
index eb7ebeb..0000000
--- a/pkg/front_end/testcases/super_nsm.dart.legacy.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    return "C";
-  no-such-method-forwarder method interfaceMethod() → dynamic
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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::•().dMethod();
-  if(!result.==("D"))
-    throw "Expected 'D' but got: '${result}'";
-}
diff --git a/pkg/front_end/testcases/super_nsm.dart.legacy.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.legacy.transformed.expect
deleted file mode 100644
index eb7ebeb..0000000
--- a/pkg/front_end/testcases/super_nsm.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    return "C";
-  no-such-method-forwarder method interfaceMethod() → dynamic
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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::•().dMethod();
-  if(!result.==("D"))
-    throw "Expected 'D' but got: '${result}'";
-}
diff --git a/pkg/front_end/testcases/super_nsm.dart.outline.expect b/pkg/front_end/testcases/super_nsm.dart.outline.expect
deleted file mode 100644
index 6ec8595..0000000
--- a/pkg/front_end/testcases/super_nsm.dart.outline.expect
+++ /dev/null
@@ -1,27 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-abstract class I extends core::Object {
-  synthetic constructor •() → self::I
-    ;
-  abstract method interfaceMethod() → dynamic;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    ;
-  no-such-method-forwarder method interfaceMethod() → dynamic
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} dynamic;
-}
-class D extends self::C {
-  synthetic constructor •() → self::D
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    ;
-  method dMethod() → dynamic
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.expect b/pkg/front_end/testcases/super_nsm.dart.strong.expect
deleted file mode 100644
index 679fbdd..0000000
--- a/pkg/front_end/testcases/super_nsm.dart.strong.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    return "C";
-  no-such-method-forwarder method interfaceMethod() → dynamic
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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}();
-  if(!result.{core::Object::==}("D"))
-    throw "Expected 'D' but got: '${result}'";
-}
diff --git a/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect b/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
deleted file mode 100644
index 679fbdd..0000000
--- a/pkg/front_end/testcases/super_nsm.dart.strong.transformed.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-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;
-}
-class C extends core::Object implements self::I {
-  synthetic constructor •() → self::C
-    : super core::Object::•()
-    ;
-  method noSuchMethod(core::Invocation _) → dynamic
-    return "C";
-  no-such-method-forwarder method interfaceMethod() → dynamic
-    return this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#interfaceMethod, 0, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))) as{TypeError} 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}();
-  if(!result.{core::Object::==}("D"))
-    throw "Expected 'D' but got: '${result}'";
-}
diff --git a/pkg/front_end/testcases/tabs.dart b/pkg/front_end/testcases/tabs.dart
deleted file mode 100644
index 28a958f..0000000
--- a/pkg/front_end/testcases/tabs.dart
+++ /dev/null
@@ -1,16 +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.
-
-// Test that error messages are indented correctly
-// in the presence of tabs.
-
-test() {
-	print(one);
-		print(two);
-		  print(three);
-	   	print(four);
-	   	  print(five);
-}
-
-main() {}
diff --git a/pkg/front_end/testcases/tabs.dart.legacy.expect b/pkg/front_end/testcases/tabs.dart.legacy.expect
deleted file mode 100644
index 7397272..0000000
--- a/pkg/front_end/testcases/tabs.dart.legacy.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/tabs.dart:9:8: Warning: Getter not found: 'one'.
-// 	print(one);
-// 	      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:10:9: Warning: Getter not found: 'two'.
-// 		print(two);
-// 		      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:11:11: Warning: Getter not found: 'three'.
-// 		  print(three);
-// 		        ^^^^^
-//
-// pkg/front_end/testcases/tabs.dart:12:12: Warning: Getter not found: 'four'.
-// 	   	print(four);
-// 	   	      ^^^^
-//
-// pkg/front_end/testcases/tabs.dart:13:14: Warning: Getter not found: 'five'.
-// 	   	  print(five);
-// 	   	        ^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect b/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect
deleted file mode 100644
index 7397272..0000000
--- a/pkg/front_end/testcases/tabs.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,35 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/tabs.dart:9:8: Warning: Getter not found: 'one'.
-// 	print(one);
-// 	      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:10:9: Warning: Getter not found: 'two'.
-// 		print(two);
-// 		      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:11:11: Warning: Getter not found: 'three'.
-// 		  print(three);
-// 		        ^^^^^
-//
-// pkg/front_end/testcases/tabs.dart:12:12: Warning: Getter not found: 'four'.
-// 	   	print(four);
-// 	   	      ^^^^
-//
-// pkg/front_end/testcases/tabs.dart:13:14: Warning: Getter not found: 'five'.
-// 	   	  print(five);
-// 	   	        ^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#one, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#two, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#three, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#four, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-  core::print(throw new core::NoSuchMethodError::withInvocation(null, new core::_InvocationMirror::_withType(#five, 33, const <core::Type>[], const <dynamic>[], core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.strong.expect b/pkg/front_end/testcases/tabs.dart.strong.expect
deleted file mode 100644
index d8b5c84..0000000
--- a/pkg/front_end/testcases/tabs.dart.strong.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-// 	print(one);
-// 	      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-// 		print(two);
-// 		      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-// 		  print(three);
-// 		        ^^^^^
-//
-// pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-// 	   	print(four);
-// 	   	      ^^^^
-//
-// pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-// 	   	  print(five);
-// 	   	        ^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-\tprint(one);
-\t      ^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-\t\tprint(two);
-\t\t      ^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-\t\t  print(three);
-\t\t        ^^^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-\t   \tprint(four);
-\t   \t      ^^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-\t   \t  print(five);
-\t   \t        ^^^^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect b/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
deleted file mode 100644
index d8b5c84..0000000
--- a/pkg/front_end/testcases/tabs.dart.strong.transformed.expect
+++ /dev/null
@@ -1,45 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-// 	print(one);
-// 	      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-// 		print(two);
-// 		      ^^^
-//
-// pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-// 		  print(three);
-// 		        ^^^^^
-//
-// pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-// 	   	print(four);
-// 	   	      ^^^^
-//
-// pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-// 	   	  print(five);
-// 	   	        ^^^^
-//
-import self as self;
-import "dart:core" as core;
-
-static method test() → dynamic {
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:9:8: Error: Getter not found: 'one'.
-\tprint(one);
-\t      ^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:10:9: Error: Getter not found: 'two'.
-\t\tprint(two);
-\t\t      ^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:11:11: Error: Getter not found: 'three'.
-\t\t  print(three);
-\t\t        ^^^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:12:12: Error: Getter not found: 'four'.
-\t   \tprint(four);
-\t   \t      ^^^^");
-  core::print(invalid-expression "pkg/front_end/testcases/tabs.dart:13:14: Error: Getter not found: 'five'.
-\t   \t  print(five);
-\t   \t        ^^^^");
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 74c01f5..b2a5c08 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,119 +6,236 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
-DeltaBlue: TextSerializationFailure # Was: Pass
-abstract_members: TypeCheckError
-abstract_overrides_concrete_with_no_such_method: TextSerializationFailure
-accessors: TextSerializationFailure # Was: RuntimeError
-ambiguous_exports: TextSerializationFailure # Was: RuntimeError # Expected, this file exports two main methods.
-annotation_eof: TextSerializationFailure # Was: Pass
-annotation_on_enum_values: TextSerializationFailure # Was: Pass
-annotation_top: TextSerializationFailure # Was: Pass
-annotation_typedef_formals: TextSerializationFailure # Was: Pass
-annotation_typedef_formals_resolution: TextSerializationFailure # Was: Pass
-annotation_variable_declaration: TextSerializationFailure # Was: Pass
-argument: TextSerializationFailure # Was: Pass
-argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
-arithmetic: TextSerializationFailure # Was: Pass
-arrow_function: TextSerializationFailure # Was: Pass
-async_function: TextSerializationFailure # Was: Pass
-async_nested: TextSerializationFailure # Was: Pass
-await: TextSerializationFailure # Was: Pass
-await_in_non_async: TextSerializationFailure
-bad_setter_abstract: TextSerializationFailure # Was: Pass
-bad_store: TextSerializationFailure # Was: Pass
-bad_type_variable_uses_in_supertypes: TextSerializationFailure
-bounds_check_depends_on_inference: TextSerializationFailure # Was: Pass
-bug21938: TypeCheckError
-bug30695: TypeCheckError
-bug31124: TextSerializationFailure # Was: RuntimeError # Test has no main method (and we shouldn't add one).
-bug32414a: TextSerializationFailure # Was: Pass
-bug32414b: TextSerializationFailure # Was: Pass
-bug32426: TextSerializationFailure # Was: Pass
-bug32629: InstrumentationMismatch # Test has an intentional error
-bug32866: TextSerializationFailure # Was: Pass
-bug33099: TextSerializationFailure # Was: Pass
-bug33196: TextSerializationFailure # Was: Pass
-bug33206: TextSerializationFailure # Was: Pass
-bug33298: TextSerializationFailure # Was: Pass
-bug34511: TextSerializationFailure # Was: Pass
-bug35470: TextSerializationFailure # Was: Pass
-call: TypeCheckError
-cascade: TextSerializationFailure # Was: RuntimeError
-casts: TextSerializationFailure # Was: Pass
-check_deferred_allocation: TextSerializationFailure # Was: Pass
-check_deferred_as_check: TextSerializationFailure # Was: Pass
-check_deferred_before_args2: TextSerializationFailure # Was: Pass
-check_deferred_before_args: TextSerializationFailure # Was: Pass
-check_deferred_before_call: TextSerializationFailure # Was: Pass
-check_deferred_before_write: TextSerializationFailure # Was: Pass
-check_deferred_is_check: TextSerializationFailure # Was: Pass
-check_deferred_read: TextSerializationFailure # Was: Pass
-check_deferred_read_static_field: TextSerializationFailure # Was: Pass
-check_deferred_read_type: TextSerializationFailure # Was: Pass
-check_deferred_static_method_call: TextSerializationFailure # Was: Pass
-check_deferred_type_declaration: TextSerializationFailure # Was: Pass
-circularity-via-initializing-formal: TextSerializationFailure # Was: Pass
-classes: TextSerializationFailure # Was: Pass
-clone_function_type: TextSerializationFailure # Was: Pass
-closure: TextSerializationFailure # Was: Pass
-co19_language_metadata_syntax_t04: TextSerializationFailure # Was: Pass
-complex_class_hierarchy: TextSerializationFailure
-constructor_const_inference: TextSerializationFailure # Was: Pass
-constructor_cycle: TextSerializationFailure # Was: Pass
-constructor_function_types: TextSerializationFailure # Was: Pass
-constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
-continue_inference_after_error: TextSerializationFailure # Was: Pass
-continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
-control_flow_collection: TextSerializationFailure
-control_flow_collection_inference: TextSerializationFailure
-covariant_generic: TextSerializationFailure # Was: RuntimeError
-covariant_parameter_in_superclass_of_mixin_application: TextSerializationFailure
-cycles: TextSerializationFailure # Was: Pass
-default_values: TextSerializationFailure # Was: Pass
-deferred_lib: TextSerializationFailure # Was: Pass
-deferred_type_annotation: TextSerializationFailure # Was: Pass
-duplicated_bad_prefix: TextSerializationFailure # Was: Pass
-duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
-duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
-duplicated_declarations: TypeCheckError
-duplicated_declarations_lib: TextSerializationFailure # Was: Pass
-duplicated_declarations_part: TextSerializationFailure # Was: Pass
-duplicated_field_initializer: TextSerializationFailure # Was: RuntimeError
-duplicated_named_args_3: TextSerializationFailure # Was: Pass
-dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
-escape: TextSerializationFailure # Was: Pass
-export_main: TextSerializationFailure # Was: Pass
-export_test: TextSerializationFailure # Was: Pass
 expression/eval: TextSerializationFailure # Was: Pass
 expression/main: TextSerializationFailure # Was: Pass
-expressions: TextSerializationFailure # Was: RuntimeError
-extension_methods: TypeCheckError
-external: TextSerializationFailure # Was: Pass
-external_import: TextSerializationFailure # Was: RuntimeError # The native extension to import doesn't exist. This is ok.
-fallthrough: ExpectationFileMismatch
-fibonacci: TextSerializationFailure # Was: Pass
-for_in_scope: TextSerializationFailure # Was: Pass
-for_in_without_declaration: TextSerializationFailure
-forwarding_stub_for_operator: TextSerializationFailure
-function_in_field: TextSerializationFailure # Was: Pass
-function_type_assignments: TextSerializationFailure # Was: Pass
-function_type_default_value: TextSerializationFailure
-function_type_is_check: TextSerializationFailure # Was: Pass
-function_type_recovery: TextSerializationFailure # Was: Pass
-functions: TextSerializationFailure # Was: Pass
-future_or_test: TextSerializationFailure # Was: Pass
-having_part_with_part_and_annotation: TextSerializationFailure
-having_part_with_parts_and_annotation: TextSerializationFailure
-hello: TextSerializationFailure # Was: Pass
-ignore_function: TypeCheckError
-illegal_named_function_expression: TextSerializationFailure # Was: Pass
-illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
-implicit_const_with_static_fields: TextSerializationFailure # Was: Pass
-implicit_new: TextSerializationFailure # Was: Pass
-implicit_scope_test: TextSerializationFailure # Was: Pass
-implicit_this: TextSerializationFailure # Was: Pass
-incomplete_field_formal_parameter: TextSerializationFailure # Was: RuntimeError
+extensions/instance_members: TextSerializationFailure
+extensions/implicit_this: TextSerializationFailure
+extensions/explicit_this: TextSerializationFailure
+extensions/type_variables: TextSerializationFailure
+extensions/use_this: TextSerializationFailure
+general/abstract_members: TypeCheckError
+general/abstract_overrides_concrete_with_no_such_method: TextSerializationFailure
+general/accessors: TextSerializationFailure # Was: RuntimeError
+general/ambiguous_exports: TextSerializationFailure # Was: RuntimeError # Expected, this file exports two main methods.
+general/annotation_eof: TextSerializationFailure # Was: Pass
+general/annotation_on_enum_values: TextSerializationFailure # Was: Pass
+general/annotation_top: TextSerializationFailure # Was: Pass
+general/annotation_typedef_formals: TextSerializationFailure # Was: Pass
+general/annotation_typedef_formals_resolution: TextSerializationFailure # Was: Pass
+general/annotation_variable_declaration: TextSerializationFailure # Was: Pass
+general/argument: TextSerializationFailure # Was: Pass
+general/argument_mismatch: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+general/arithmetic: TextSerializationFailure # Was: Pass
+general/arrow_function: TextSerializationFailure # Was: Pass
+general/async_function: TextSerializationFailure # Was: Pass
+general/async_nested: TextSerializationFailure # Was: Pass
+general/await: TextSerializationFailure # Was: Pass
+general/await_in_non_async: TextSerializationFailure
+general/bad_setter_abstract: TextSerializationFailure # Was: Pass
+general/bad_store: TextSerializationFailure # Was: Pass
+general/bad_type_variable_uses_in_supertypes: TextSerializationFailure
+general/bounds_check_depends_on_inference: TextSerializationFailure # Was: Pass
+general/bug21938: TypeCheckError
+general/bug30695: TypeCheckError
+general/bug31124: TextSerializationFailure # Was: RuntimeError # Test has no main method (and we shouldn't add one).
+general/bug32414a: TextSerializationFailure # Was: Pass
+general/bug32414b: TextSerializationFailure # Was: Pass
+general/bug32426: TextSerializationFailure # Was: Pass
+general/bug32629: InstrumentationMismatch # Test has an intentional error
+general/bug32866: TextSerializationFailure # Was: Pass
+general/bug33099: TextSerializationFailure # Was: Pass
+general/bug33196: TextSerializationFailure # Was: Pass
+general/bug33206: TextSerializationFailure # Was: Pass
+general/bug33298: TextSerializationFailure # Was: Pass
+general/bug34511: TextSerializationFailure # Was: Pass
+general/bug35470: TextSerializationFailure # Was: Pass
+general/bug37476: TextSerializationFailure
+general/call: TypeCheckError
+general/cascade: TextSerializationFailure # Was: RuntimeError
+general/casts: TextSerializationFailure # Was: Pass
+general/check_deferred_allocation: TextSerializationFailure # Was: Pass
+general/check_deferred_as_check: TextSerializationFailure # Was: Pass
+general/check_deferred_before_args2: TextSerializationFailure # Was: Pass
+general/check_deferred_before_args: TextSerializationFailure # Was: Pass
+general/check_deferred_before_call: TextSerializationFailure # Was: Pass
+general/check_deferred_before_write: TextSerializationFailure # Was: Pass
+general/check_deferred_is_check: TextSerializationFailure # Was: Pass
+general/check_deferred_read: TextSerializationFailure # Was: Pass
+general/check_deferred_read_static_field: TextSerializationFailure # Was: Pass
+general/check_deferred_read_type: TextSerializationFailure # Was: Pass
+general/check_deferred_static_method_call: TextSerializationFailure # Was: Pass
+general/check_deferred_type_declaration: TextSerializationFailure # Was: Pass
+general/circularity-via-initializing-formal: TextSerializationFailure # Was: Pass
+general/classes: TextSerializationFailure # Was: Pass
+general/clone_function_type: TextSerializationFailure # Was: Pass
+general/closure: TextSerializationFailure # Was: Pass
+general/co19_language_metadata_syntax_t04: TextSerializationFailure # Was: Pass
+general/complex_class_hierarchy: TextSerializationFailure
+general/constructor_const_inference: TextSerializationFailure # Was: Pass
+general/constructor_cycle: TextSerializationFailure # Was: Pass
+general/constructor_function_types: TextSerializationFailure # Was: Pass
+general/constructor_initializer_invalid: TextSerializationFailure # Was: RuntimeError # Fails execution after recovery
+general/continue_inference_after_error: TextSerializationFailure # Was: Pass
+general/continue_inference_after_error_lib: TextSerializationFailure # Was: Pass
+general/control_flow_collection: TextSerializationFailure
+general/control_flow_collection_inference: TextSerializationFailure
+general/covariant_generic: TextSerializationFailure # Was: RuntimeError
+general/covariant_parameter_in_superclass_of_mixin_application: TextSerializationFailure
+general/cycles: TextSerializationFailure # Was: Pass
+general/default_values: TextSerializationFailure # Was: Pass
+general/deferred_lib: TextSerializationFailure # Was: Pass
+general/deferred_type_annotation: TextSerializationFailure # Was: Pass
+general/DeltaBlue: TextSerializationFailure # Was: Pass
+general/duplicated_bad_prefix: TextSerializationFailure # Was: Pass
+general/duplicated_bad_prefix_lib1: TextSerializationFailure # Was: Pass
+general/duplicated_bad_prefix_lib2: TextSerializationFailure # Was: Pass
+general/duplicated_declarations: TypeCheckError
+general/duplicated_declarations_lib: TextSerializationFailure # Was: Pass
+general/duplicated_declarations_part: TextSerializationFailure # Was: Pass
+general/duplicated_field_initializer: TextSerializationFailure # Was: RuntimeError
+general/duplicated_named_args_3: TextSerializationFailure # Was: Pass
+general/dynamic_and_void: InstrumentationMismatch # Test assumes Dart 1.0 semantics
+general/escape: TextSerializationFailure # Was: Pass
+general/export_main: TextSerializationFailure # Was: Pass
+general/export_test: TextSerializationFailure # Was: Pass
+general/expressions: TextSerializationFailure # Was: RuntimeError
+general/extension_methods: TextSerializationFailure
+general/external: TextSerializationFailure # Was: Pass
+general/external_import: TextSerializationFailure # Was: RuntimeError # The native extension to import doesn't exist. This is ok.
+general/fallthrough: ExpectationFileMismatch
+general/fibonacci: TextSerializationFailure # Was: Pass
+general/for_in_scope: TextSerializationFailure # Was: Pass
+general/for_in_without_declaration: TextSerializationFailure
+general/forwarding_stub_for_operator: TextSerializationFailure
+general/function_in_field: TextSerializationFailure # Was: Pass
+general/function_type_assignments: TextSerializationFailure # Was: Pass
+general/function_type_default_value: TextSerializationFailure
+general/function_type_is_check: TextSerializationFailure # Was: Pass
+general/function_type_recovery: TextSerializationFailure # Was: Pass
+general/functions: TextSerializationFailure # Was: Pass
+general/future_or_test: TextSerializationFailure # Was: Pass
+general/having_part_with_part_and_annotation: TextSerializationFailure
+general/having_part_with_parts_and_annotation: TextSerializationFailure
+general/hello: TextSerializationFailure # Was: Pass
+general/ignore_function: TypeCheckError
+general/illegal_named_function_expression: TextSerializationFailure # Was: Pass
+general/illegal_named_function_expression_scope: TextSerializationFailure # Was: Pass
+general/implicit_const_with_static_fields: TextSerializationFailure # Was: Pass
+general/implicit_new: TextSerializationFailure # Was: Pass
+general/implicit_scope_test: TextSerializationFailure # Was: Pass
+general/implicit_this: TextSerializationFailure # Was: Pass
+general/incomplete_field_formal_parameter: TextSerializationFailure # Was: RuntimeError
+general/interface_contravariant_from_class: TextSerializationFailure
+general/interface_covariantImpl_from_class: TextSerializationFailure
+general/interface_covariantInterface_from_class: TextSerializationFailure
+general/invalid_assignment: TextSerializationFailure # Was: Pass
+general/invalid_cast: TextSerializationFailure # Was: Pass
+general/invalid_type: TypeCheckError
+general/invocations: TextSerializationFailure # Was: RuntimeError
+general/issue129167943: TextSerializationFailure
+general/issue34515: TextSerializationFailure
+general/issue34899: TypeCheckError
+general/issue35875: TextSerializationFailure
+general/issue37027: TextSerializationFailure
+general/issue37381: TextSerializationFailure
+general/literals: TextSerializationFailure # Was: Pass
+general/local_generic_function: TextSerializationFailure # Was: Pass
+general/magic_const: TextSerializationFailure # Was: Pass
+general/many_errors: TextSerializationFailure
+general/map: TextSerializationFailure # Was: Pass
+general/metadata_enum: TextSerializationFailure # Was: Pass
+general/metadata_named_mixin_application: TextSerializationFailure # Was: Pass
+general/micro: TextSerializationFailure # Was: RuntimeError
+general/minimum_int: TextSerializationFailure # Was: Pass
+general/missing_constructor: TextSerializationFailure # Was: Pass
+general/mixin: TextSerializationFailure # Was: Pass
+general/mixin_application_override: ExpectationFileMismatch
+general/mixin_application_override: TypeCheckError
+general/mixin_conflicts: TextSerializationFailure
+general/mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
+general/mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
+general/mixin_super_repeated: TextSerializationFailure # Was: Pass
+general/mixin_with_static_member: TextSerializationFailure
+general/named_function_scope: TextSerializationFailure # Was: Pass
+general/named_parameters: TextSerializationFailure # Was: Pass
+general/native_as_name: TextSerializationFailure # Was: Pass
+general/nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
+general/no_such_method_private_setter: TextSerializationFailure # Was: Pass
+general/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
+general/non_covariant_checks: TextSerializationFailure
+general/null_aware: TextSerializationFailure # Was: Pass
+general/operator_method_not_found: TextSerializationFailure
+general/operators: TextSerializationFailure # Was: Pass
+general/optional: TypeCheckError
+general/override: TextSerializationFailure # Was: Pass
+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_generic_method_f_bounded: TextSerializationFailure # Was: Pass
+general/override_check_two_substitutions: TextSerializationFailure # Was: Pass
+general/override_check_with_covariant_modifier: TypeCheckError # Issue #31620
+general/override_inference_for_setters: TextSerializationFailure
+general/override_inference_named_parameters_ordering: TextSerializationFailure
+general/part_as_entry_point: TextSerializationFailure # Was: Pass
+general/part_as_entry_point_lib: TextSerializationFailure # Was: Pass
+general/part_not_part_of: TextSerializationFailure
+general/part_not_part_of_same_named_library: TextSerializationFailure
+general/part_part_of_different_unnamed_library: TextSerializationFailure
+general/part_part_of_differently_named_library: TextSerializationFailure
+general/platform: TextSerializationFailure
+general/prefer_baseclass: TextSerializationFailure # Was: Pass
+general/private_method_tearoff: TextSerializationFailure # Was: Pass
+general/private_method_tearoff_lib: TextSerializationFailure # Was: Pass
+general/public_method_tearoff: TextSerializationFailure # Was: Pass
+general/public_method_tearoff_lib: TextSerializationFailure # Was: Pass
+general/qualified: TextSerializationFailure # Was: Pass
+general/qualified_lib: TextSerializationFailure # Was: Pass
+general/qualified_part: TextSerializationFailure # Was: Pass
+general/redirecting_constructor: TextSerializationFailure # Was: Pass
+general/redirecting_factory: TextSerializationFailure # Was: Pass
+general/redirecting_factory_chain_test: TextSerializationFailure # Was: Pass
+general/redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
+general/redirecting_factory_metadata: TextSerializationFailure # Was: Pass
+general/redirecting_factory_simple_test: TextSerializationFailure # Was: Pass
+general/redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
+general/redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
+general/redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
+general/redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
+general/redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
+general/redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
+general/redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
+general/redirection_type_arguments: TextSerializationFailure # Was: Pass
+general/reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
+general/return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
+general/sdk_diagnostic: TextSerializationFailure
+general/spread_collection: TextSerializationFailure # Should be fixed as part of implementing spread collection support
+general/spread_collection_inference: TextSerializationFailure # Should be fixed as part of implementing spread collection support
+general/statements: Crash
+general/static_setter: TextSerializationFailure # Was: Pass
+general/store_load: TextSerializationFailure # Was: Pass
+general/stringliteral: TextSerializationFailure # Was: Pass
+general/super_call: TextSerializationFailure # Was: Pass
+general/super_nsm: TextSerializationFailure # Was: Pass
+general/tabs: TextSerializationFailure # Was: Pass
+general/top_level_accessors: TextSerializationFailure # Was: Pass
+general/top_level_accessors_part: TextSerializationFailure # Was: Pass
+general/top_level_library_method: TextSerializationFailure # Was: Pass
+general/type_of_null: TextSerializationFailure
+general/type_parameter_type_named_int: TextSerializationFailure
+general/type_variable_as_super: TextSerializationFailure # Was: RuntimeError
+general/type_variable_prefix: TextSerializationFailure # Was: RuntimeError
+general/type_variable_uses: TextSerializationFailure # Was: Pass
+general/typedef: TextSerializationFailure # Was: Pass
+general/undefined: TextSerializationFailure # Was: Pass
+general/undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
+general/uninitialized_fields: TextSerializationFailure # Was: Pass
+general/unsound_promotion: TextSerializationFailure
+general/unused_methods: TextSerializationFailure # Was: Pass
+general/var_as_type_name: TextSerializationFailure # Was: Pass
+general/void_methods: ExpectationFileMismatch
+general/warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
 inference/abstract_class_instantiation: InstrumentationMismatch # Issue #30040
 inference/assert: TextSerializationFailure # Was: Pass
 inference/assert_initializer: TextSerializationFailure # Was: Pass
@@ -686,41 +803,6 @@
 instantiate_to_bound/typedef_omitted_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_raw_in_bound: TextSerializationFailure # Was: Pass
 instantiate_to_bound/typedef_super_bounded_type: TextSerializationFailure # Was: Pass
-interface_contravariant_from_class: TextSerializationFailure
-interface_covariantImpl_from_class: TextSerializationFailure
-interface_covariantInterface_from_class: TextSerializationFailure
-invalid_assignment: TextSerializationFailure # Was: Pass
-invalid_cast: TextSerializationFailure # Was: Pass
-invalid_type: TypeCheckError
-invocations: TextSerializationFailure # Was: RuntimeError
-issue129167943: TextSerializationFailure
-issue34515: TextSerializationFailure
-issue34899: TypeCheckError
-issue35875: TextSerializationFailure
-issue37027: TextSerializationFailure
-issue37381: TextSerializationFailure
-literals: TextSerializationFailure # Was: Pass
-local_generic_function: TextSerializationFailure # Was: Pass
-magic_const: TextSerializationFailure # Was: Pass
-many_errors: TextSerializationFailure
-map: TextSerializationFailure # Was: Pass
-metadata_enum: TextSerializationFailure # Was: Pass
-metadata_named_mixin_application: TextSerializationFailure # Was: Pass
-micro: TextSerializationFailure # Was: RuntimeError
-minimum_int: TextSerializationFailure # Was: Pass
-missing_constructor: TextSerializationFailure # Was: Pass
-mixin: TextSerializationFailure # Was: Pass
-mixin_application_override: ExpectationFileMismatch
-mixin_application_override: TypeCheckError
-mixin_conflicts: TextSerializationFailure
-mixin_constructors_with_default_values: TextSerializationFailure # Was: Pass
-mixin_inherited_setter_for_mixed_in_field: TextSerializationFailure # Was: Pass
-mixin_super_repeated: TextSerializationFailure # Was: Pass
-mixin_with_static_member: TextSerializationFailure
-named_function_scope: TextSerializationFailure # Was: Pass
-named_parameters: TextSerializationFailure # Was: Pass
-native_as_name: TextSerializationFailure # Was: Pass
-nested_implicit_const_with_env_var: TextSerializationFailure # Was: Pass
 new_const_insertion/simple: TextSerializationFailure # Was: Pass
 nnbd/nullable_param: TextSerializationFailure
 no_such_method_forwarders/abstract_accessors_from_field: TextSerializationFailure # Was: Pass
@@ -744,38 +826,6 @@
 no_such_method_forwarders/same: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/setter_not_shadowed_by_method: TextSerializationFailure # Was: Pass
 no_such_method_forwarders/subst_on_forwarder: TextSerializationFailure # Was: Pass
-no_such_method_private_setter: TextSerializationFailure # Was: Pass
-no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
-null_aware: TextSerializationFailure # Was: Pass
-operator_method_not_found: TextSerializationFailure
-operators: TextSerializationFailure # Was: Pass
-optional: TypeCheckError
-override: TextSerializationFailure # Was: Pass
-override_check_accessor_after_inference: TypeCheckError # Issue #31620
-override_check_accessor_basic: TypeCheckError # Issue #31620
-override_check_accessor_with_covariant_modifier: TypeCheckError # Issue #31620
-override_check_after_inference: TypeCheckError # Issue #31620
-override_check_basic: TypeCheckError # Issue #31620
-override_check_generic_method_f_bounded: TextSerializationFailure # Was: Pass
-override_check_two_substitutions: TextSerializationFailure # Was: Pass
-override_check_with_covariant_modifier: TypeCheckError # Issue #31620
-override_inference_for_setters: TextSerializationFailure
-override_inference_named_parameters_ordering: TextSerializationFailure
-part_as_entry_point: TextSerializationFailure # Was: Pass
-part_as_entry_point_lib: TextSerializationFailure # Was: Pass
-part_not_part_of: TextSerializationFailure
-part_not_part_of_same_named_library: TextSerializationFailure
-part_part_of_different_unnamed_library: TextSerializationFailure
-part_part_of_differently_named_library: TextSerializationFailure
-platform: TextSerializationFailure
-prefer_baseclass: TextSerializationFailure # Was: Pass
-private_method_tearoff: TextSerializationFailure # Was: Pass
-private_method_tearoff_lib: TextSerializationFailure # Was: Pass
-public_method_tearoff: TextSerializationFailure # Was: Pass
-public_method_tearoff_lib: TextSerializationFailure # Was: Pass
-qualified: TextSerializationFailure # Was: Pass
-qualified_lib: TextSerializationFailure # Was: Pass
-qualified_part: TextSerializationFailure # Was: Pass
 rasta/abstract_constructor: TextSerializationFailure # Was: RuntimeError
 rasta/bad_constructor_redirection: TextSerializationFailure # Was: RuntimeError
 rasta/bad_continue: TextSerializationFailure # Was: RuntimeError
@@ -862,20 +912,6 @@
 rasta/unresolved_for_in: TextSerializationFailure # Was: RuntimeError
 rasta/unresolved_recovery: TypeCheckError
 rasta/unsupported_platform_library: TextSerializationFailure
-redirecting_constructor: TextSerializationFailure # Was: Pass
-redirecting_factory: TextSerializationFailure # Was: Pass
-redirecting_factory_chain_test: TextSerializationFailure # Was: Pass
-redirecting_factory_const_inference: TextSerializationFailure # Was: Pass
-redirecting_factory_metadata: TextSerializationFailure # Was: Pass
-redirecting_factory_simple_test: TextSerializationFailure # Was: Pass
-redirecting_factory_typeargs_test: TextSerializationFailure # Was: Pass
-redirecting_factory_typeparam_test: TextSerializationFailure # Was: Pass
-redirecting_factory_typeparambounds_test: TextSerializationFailure # Was: Pass
-redirecting_initializer_arguments_assignable_test: TextSerializationFailure # Was: Pass
-redirecting_initializer_arguments_test: TextSerializationFailure # Was: Pass
-redirection_chain_type_arguments: TextSerializationFailure # Was: Pass
-redirection_chain_type_arguments_subst: TextSerializationFailure # Was: Pass
-redirection_type_arguments: TextSerializationFailure # Was: Pass
 regress/issue_29937: TextSerializationFailure # Was: Pass
 regress/issue_29940: TextSerializationFailure # Was: Pass
 regress/issue_29941: TextSerializationFailure # Was: Pass
@@ -952,8 +988,6 @@
 regress/issue_36669: TextSerializationFailure
 regress/issue_36793: TextSerializationFailure
 regress/issue_37285: TextSerializationFailure
-reject_generic_function_types_in_bounds: TextSerializationFailure # Was: RuntimeError # Expected
-return_with_unknown_type_in_context: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds_get: TextSerializationFailure # Was: Pass
 runtime_checks/call_kinds_set: TextSerializationFailure # Was: Pass
@@ -1020,37 +1054,10 @@
 runtime_checks_new/mixin_forwarding_stub_setter: TypeCheckError
 runtime_checks_new/stub_checked_via_target: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_contravariant_from_class: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
+runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_class: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_interface: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantImpl_from_super: TextSerializationFailure # Was: Pass
 runtime_checks_new/stub_from_interface_covariantInterface_from_class: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariant_from_interface: TextSerializationFailure # Was: Pass
-runtime_checks_new/stub_from_interface_covariant_from_super: TextSerializationFailure # Was: Pass
-sdk_diagnostic: TextSerializationFailure
 set_literals/disambiguation_rule: TextSerializationFailure # Was: RuntimeError
-spread_collection: TextSerializationFailure # Should be fixed as part of implementing spread collection support
-spread_collection_inference: TextSerializationFailure # Should be fixed as part of implementing spread collection support
-statements: Crash
-static_setter: TextSerializationFailure # Was: Pass
-store_load: TextSerializationFailure # Was: Pass
-stringliteral: TextSerializationFailure # Was: Pass
-super_call: TextSerializationFailure # Was: Pass
-super_nsm: TextSerializationFailure # Was: Pass
-tabs: TextSerializationFailure # Was: Pass
-top_level_accessors: TextSerializationFailure # Was: Pass
-top_level_accessors_part: TextSerializationFailure # Was: Pass
-top_level_library_method: TextSerializationFailure # Was: Pass
-type_of_null: TextSerializationFailure
-type_parameter_type_named_int: TextSerializationFailure
-type_variable_as_super: TextSerializationFailure # Was: RuntimeError
-type_variable_prefix: TextSerializationFailure # Was: RuntimeError
-type_variable_uses: TextSerializationFailure # Was: Pass
-typedef: TextSerializationFailure # Was: Pass
-undefined: TextSerializationFailure # Was: Pass
-undefined_getter_in_compound_assignment: TextSerializationFailure # Was: Pass
-uninitialized_fields: TextSerializationFailure # Was: Pass
-unsound_promotion: TextSerializationFailure
-unused_methods: TextSerializationFailure # Was: Pass
-var_as_type_name: TextSerializationFailure # Was: Pass
-void_methods: ExpectationFileMismatch
-warn_unresolved_sends: InstrumentationMismatch # Test assumes Dart 1.0 semantics
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.legacy.expect b/pkg/front_end/testcases/top_level_accessors.dart.legacy.expect
deleted file mode 100644
index 55f39bd..0000000
--- a/pkg/front_end/testcases/top_level_accessors.dart.legacy.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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/top_level_accessors.dart.legacy.transformed.expect b/pkg/front_end/testcases/top_level_accessors.dart.legacy.transformed.expect
deleted file mode 100644
index 55f39bd..0000000
--- a/pkg/front_end/testcases/top_level_accessors.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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/top_level_accessors.dart.outline.expect b/pkg/front_end/testcases/top_level_accessors.dart.outline.expect
deleted file mode 100644
index 88e4404..0000000
--- a/pkg/front_end/testcases/top_level_accessors.dart.outline.expect
+++ /dev/null
@@ -1,11 +0,0 @@
-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
-  ;
-static get /* from org-dartlang-testcase:///top_level_accessors_part.dart */ exitCode() → core::int
-  ;
-static method /* from org-dartlang-testcase:///top_level_accessors_part.dart */ main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/top_level_accessors.dart.strong.expect b/pkg/front_end/testcases/top_level_accessors.dart.strong.expect
deleted file mode 100644
index 55f39bd..0000000
--- a/pkg/front_end/testcases/top_level_accessors.dart.strong.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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/top_level_accessors.dart.strong.transformed.expect b/pkg/front_end/testcases/top_level_accessors.dart.strong.transformed.expect
deleted file mode 100644
index 55f39bd..0000000
--- a/pkg/front_end/testcases/top_level_accessors.dart.strong.transformed.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-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/type_of_null.dart b/pkg/front_end/testcases/type_of_null.dart
deleted file mode 100644
index 859c3db..0000000
--- a/pkg/front_end/testcases/type_of_null.dart
+++ /dev/null
@@ -1,26 +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.
-
-/*@testedFeatures=inference*/
-T map<T>(T Function() f1, T Function() f2) {}
-
-id<T>(T t) => t;
-
-Null foo() => null;
-
-main() {
-  /*@typeArgs=Null*/map(/*@returnType=Null*/() {}, /*@returnType=<BottomType>*/() => throw "hello");
-  /*@typeArgs=Null*/map(/*@returnType=<BottomType>*/() => throw "hello", /*@returnType=Null*/() {});
-  Null Function() f = /*@returnType=Null*/() {};
-  /*@typeArgs=Null*/map(foo, /*@returnType=<BottomType>*/() => throw "hello");
-  /*@typeArgs=Null*/map(/*@returnType=<BottomType>*/() => throw "hello", foo);
-  /*@typeArgs=Null*/map(/*@returnType=Null*/() {
-    return null;
-  }, /*@returnType=<BottomType>*/() => throw "hello");
-
-  /*@typeArgs=Null*/map(/*@returnType=<BottomType>*/() => throw "hello", /*@returnType=Null*/() {
-    return null;
-  });
-  /*@typeArgs=() -> Null*/id(/*@returnType=Null*/() {});
-}
diff --git a/pkg/front_end/testcases/type_of_null.dart.legacy.expect b/pkg/front_end/testcases/type_of_null.dart.legacy.expect
deleted file mode 100644
index 83e584c..0000000
--- a/pkg/front_end/testcases/type_of_null.dart.legacy.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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() → core::Null
-  return null;
-static method main() → dynamic {
-  self::map<dynamic>(() → dynamic {}, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {});
-  () → core::Null f = () → dynamic {};
-  self::map<dynamic>(self::foo, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", self::foo);
-  self::map<dynamic>(() → dynamic {
-    return null;
-  }, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {
-    return null;
-  });
-  self::id<dynamic>(() → dynamic {});
-}
diff --git a/pkg/front_end/testcases/type_of_null.dart.legacy.transformed.expect b/pkg/front_end/testcases/type_of_null.dart.legacy.transformed.expect
deleted file mode 100644
index 83e584c..0000000
--- a/pkg/front_end/testcases/type_of_null.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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() → core::Null
-  return null;
-static method main() → dynamic {
-  self::map<dynamic>(() → dynamic {}, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {});
-  () → core::Null f = () → dynamic {};
-  self::map<dynamic>(self::foo, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", self::foo);
-  self::map<dynamic>(() → dynamic {
-    return null;
-  }, () → dynamic => throw "hello");
-  self::map<dynamic>(() → dynamic => throw "hello", () → dynamic {
-    return null;
-  });
-  self::id<dynamic>(() → dynamic {});
-}
diff --git a/pkg/front_end/testcases/type_of_null.dart.outline.expect b/pkg/front_end/testcases/type_of_null.dart.outline.expect
deleted file mode 100644
index c42aee1..0000000
--- a/pkg/front_end/testcases/type_of_null.dart.outline.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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
-  ;
-static method foo() → core::Null
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/type_of_null.dart.strong.expect b/pkg/front_end/testcases/type_of_null.dart.strong.expect
deleted file mode 100644
index 5bee3f8..0000000
--- a/pkg/front_end/testcases/type_of_null.dart.strong.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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() → core::Null
-  return null;
-static method main() → dynamic {
-  self::map<core::Null>(() → core::Null {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", () → core::Null {});
-  () → core::Null f = () → core::Null {};
-  self::map<core::Null>(self::foo, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", self::foo);
-  self::map<core::Null>(() → core::Null {
-    return null;
-  }, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", () → core::Null {
-    return null;
-  });
-  self::id<() → core::Null>(() → core::Null {});
-}
diff --git a/pkg/front_end/testcases/type_of_null.dart.strong.transformed.expect b/pkg/front_end/testcases/type_of_null.dart.strong.transformed.expect
deleted file mode 100644
index 5bee3f8..0000000
--- a/pkg/front_end/testcases/type_of_null.dart.strong.transformed.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-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() → core::Null
-  return null;
-static method main() → dynamic {
-  self::map<core::Null>(() → core::Null {}, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", () → core::Null {});
-  () → core::Null f = () → core::Null {};
-  self::map<core::Null>(self::foo, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", self::foo);
-  self::map<core::Null>(() → core::Null {
-    return null;
-  }, () → <BottomType>=> throw "hello");
-  self::map<core::Null>(() → <BottomType>=> throw "hello", () → core::Null {
-    return null;
-  });
-  self::id<() → core::Null>(() → core::Null {});
-}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect b/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect
deleted file mode 100644
index 1e2cdd2..0000000
--- a/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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;
-}
-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} = value;
-  }
-}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect b/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect
deleted file mode 100644
index 1e2cdd2..0000000
--- a/pkg/front_end/testcases/type_parameter_type_named_int.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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;
-}
-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} = value;
-  }
-}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.outline.expect b/pkg/front_end/testcases/type_parameter_type_named_int.dart.outline.expect
deleted file mode 100644
index c6ca162..0000000
--- a/pkg/front_end/testcases/type_parameter_type_named_int.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-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>
-    ;
-  abstract get list() → core::List<self::Foo::T>;
-  abstract method setList<T extends core::Object = dynamic>(core::List<self::Foo::setList::T> value) → void;
-}
-class Bar extends core::Object implements self::Foo<core::int> {
-  field core::List<core::int> list;
-  synthetic constructor •() → self::Bar
-    ;
-  method setList<int extends core::Object = dynamic>(core::List<self::Bar::setList::int> value) → void
-    ;
-}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.expect b/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.expect
deleted file mode 100644
index 37066d6..0000000
--- a/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/type_parameter_type_named_int.dart'.
-//  - 'int/*2*/' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
-//     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;
-}
-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} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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/type_parameter_type_named_int.dart'.
- - 'int/*2*/' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
-    list = value;
-           ^" in value as{TypeError} core::List<core::int>;
-  }
-}
diff --git a/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect b/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect
deleted file mode 100644
index 37066d6..0000000
--- a/pkg/front_end/testcases/type_parameter_type_named_int.dart.strong.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/type_parameter_type_named_int.dart'.
-//  - 'int/*2*/' is from 'dart:core'.
-// Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
-//     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;
-}
-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} = let final<BottomType> #t1 = invalid-expression "pkg/front_end/testcases/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/type_parameter_type_named_int.dart'.
- - 'int/*2*/' is from 'dart:core'.
-Try changing the type of the left hand side, or casting the right hand side to 'List<int/*2*/>'.
-    list = value;
-           ^" in value as{TypeError} core::List<core::int>;
-  }
-}
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect b/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
deleted file mode 100644
index 9b48c25..0000000
--- a/pkg/front_end/testcases/type_variable_as_super.dart.outline.expect
+++ /dev/null
@@ -1,33 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/type_variable_as_super.dart:11:7: Error: The type variable 'T' can't be used as supertype.
-// class C<T> extends T {}
-//       ^
-//
-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>
-    ;
-}
-abstract class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::B<self::B::T>
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect b/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect
deleted file mode 100644
index 37ea872..0000000
--- a/pkg/front_end/testcases/type_variable_as_super.dart.strong.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
-//   new A();
-//       ^
-//
-// pkg/front_end/testcases/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 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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/type_variable_as_super.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_as_super.dart.strong.transformed.expect
deleted file mode 100644
index 37ea872..0000000
--- a/pkg/front_end/testcases/type_variable_as_super.dart.strong.transformed.expect
+++ /dev/null
@@ -1,47 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/type_variable_as_super.dart:14:7: Error: The class 'A' is abstract and can't be instantiated.
-//   new A();
-//       ^
-//
-// pkg/front_end/testcases/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 class B<T extends core::Object = dynamic> extends core::Object {
-  constructor •() → self::B<self::B::T>
-    : super core::Object::•()
-    ;
-}
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-}
-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/type_variable_prefix.dart.legacy.expect b/pkg/front_end/testcases/type_variable_prefix.dart.legacy.expect
deleted file mode 100644
index e409640..0000000
--- a/pkg/front_end/testcases/type_variable_prefix.dart.legacy.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Warning: '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!";
-}
-static method main() → dynamic {
-  core::String s = new self::C::•<dynamic>().method();
-  core::print(s);
-}
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.legacy.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.legacy.transformed.expect
deleted file mode 100644
index e409640..0000000
--- a/pkg/front_end/testcases/type_variable_prefix.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Warning: '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!";
-}
-static method main() → dynamic {
-  core::String s = new self::C::•<dynamic>().method();
-  core::print(s);
-}
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect b/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
deleted file mode 100644
index 16cecb0..0000000
--- a/pkg/front_end/testcases/type_variable_prefix.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:8:3: Warning: '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>
-    ;
-  method method() → invalid-type
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
deleted file mode 100644
index 019571a..0000000
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:8: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!" as{TypeError} invalid-type;
-}
-static method main() → dynamic {
-  core::String s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
-  core::print(s);
-}
diff --git a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
deleted file mode 100644
index 019571a..0000000
--- a/pkg/front_end/testcases/type_variable_prefix.dart.strong.transformed.expect
+++ /dev/null
@@ -1,24 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_prefix.dart:8: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!" as{TypeError} invalid-type;
-}
-static method main() → dynamic {
-  core::String s = new self::C::•<dynamic>().{self::C::method}() as{TypeError} core::String;
-  core::print(s);
-}
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.legacy.expect b/pkg/front_end/testcases/type_variable_uses.dart.legacy.expect
deleted file mode 100644
index 57ef641..0000000
--- a/pkg/front_end/testcases/type_variable_uses.dart.legacy.expect
+++ /dev/null
@@ -1,95 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
-//   static C<T> staticMethod() {
-//               ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:8:11: Warning: Type variables can't be used in static members.
-//     print(T);
-//           ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:9:5: Warning: Type variables can't be used in static members.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:10:7: Warning: Type variables can't be used in static members.
-//     C<T> l;
-//       ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:11:9: Warning: Type variables can't be used in static members.
-//     C<C<T>> ll;
-//         ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:12:13: Warning: Type variables can't be used in static members.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:13:12: Warning: Type variables can't be used in static members.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:14:14: Warning: Type variables can't be used in static members.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:15:20: Warning: Type variables can't be used in static members.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:16:28: Warning: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
-//                            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static method staticMethod() → self::C<dynamic> {
-    core::print(invalid-type);
-    invalid-type t;
-    self::C<invalid-type> l;
-    self::C<self::C<invalid-type>> ll;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-  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;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.legacy.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.legacy.transformed.expect
deleted file mode 100644
index 57ef641..0000000
--- a/pkg/front_end/testcases/type_variable_uses.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,95 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
-//   static C<T> staticMethod() {
-//               ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:8:11: Warning: Type variables can't be used in static members.
-//     print(T);
-//           ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:9:5: Warning: Type variables can't be used in static members.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:10:7: Warning: Type variables can't be used in static members.
-//     C<T> l;
-//       ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:11:9: Warning: Type variables can't be used in static members.
-//     C<C<T>> ll;
-//         ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:12:13: Warning: Type variables can't be used in static members.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:13:12: Warning: Type variables can't be used in static members.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:14:14: Warning: Type variables can't be used in static members.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:15:20: Warning: Type variables can't be used in static members.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:16:28: Warning: Type variables can't be used in static members.
-//     const <Object>[const C<T>()];
-//                            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static method staticMethod() → self::C<dynamic> {
-    core::print(invalid-type);
-    invalid-type t;
-    self::C<invalid-type> l;
-    self::C<self::C<invalid-type>> ll;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-  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;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.outline.expect b/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
deleted file mode 100644
index 3843eac..0000000
--- a/pkg/front_end/testcases/type_variable_uses.dart.outline.expect
+++ /dev/null
@@ -1,21 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_uses.dart:7:15: Warning: Can only use type variables in instance methods.
-//   static C<T> staticMethod() {
-//               ^
-//
-import self as self;
-import "dart:core" as core;
-
-class C<T extends core::Object = dynamic> extends core::Object {
-  const constructor •() → self::C<self::C::T>
-    ;
-  static method staticMethod() → self::C<dynamic>
-    ;
-  method instanceMethod() → self::C<self::C::T>
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.strong.expect b/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
deleted file mode 100644
index e393464..0000000
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.expect
+++ /dev/null
@@ -1,95 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
-//   static C<T> staticMethod() {
-//               ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
-//           ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
-//       ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
-//         ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static method staticMethod() → self::C<dynamic> {
-    core::print(invalid-type);
-    invalid-type t;
-    self::C<invalid-type> l;
-    self::C<self::C<invalid-type>> ll;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-  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;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect b/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
deleted file mode 100644
index e393464..0000000
--- a/pkg/front_end/testcases/type_variable_uses.dart.strong.transformed.expect
+++ /dev/null
@@ -1,95 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/type_variable_uses.dart:7:15: Error: Can only use type variables in instance methods.
-//   static C<T> staticMethod() {
-//               ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:8:11: Error: Type variables can't be used in static members.
-//     print(T);
-//           ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:9:5: Error: Type variables can't be used in static members.
-//     T t;
-//     ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:10:7: Error: Type variables can't be used in static members.
-//     C<T> l;
-//       ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:11:9: Error: Type variables can't be used in static members.
-//     C<C<T>> ll;
-//         ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:12:13: Error: Type variables can't be used in static members.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:13:12: Error: Type variables can't be used in static members.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:14:14: Error: Type variables can't be used in static members.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:15:20: Error: Type variables can't be used in static members.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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/type_variable_uses.dart:24:13: Error: Type variables can't be used as constants.
-//     const C<T>();
-//             ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:25:12: Error: Type variables can't be used as constants.
-//     const <T>[];
-//            ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:26:14: Error: Type variables can't be used as constants.
-//     const <C<T>>[];
-//              ^
-//
-// pkg/front_end/testcases/type_variable_uses.dart:27:20: Error: Type variables can't be used as constants.
-//     const <Object>[T];
-//                    ^
-//
-// pkg/front_end/testcases/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 {
-  const constructor •() → self::C<self::C::T>
-    : super core::Object::•()
-    ;
-  static method staticMethod() → self::C<dynamic> {
-    core::print(invalid-type);
-    invalid-type t;
-    self::C<invalid-type> l;
-    self::C<self::C<invalid-type>> ll;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-  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;
-    const self::C::•<invalid-type>();
-    const <invalid-type>[];
-    const <self::C<invalid-type>>[];
-    const <core::Object>[invalid-type];
-    const <core::Object>[const self::C::•<invalid-type>()];
-  }
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/typedef.dart.legacy.expect b/pkg/front_end/testcases/typedef.dart.legacy.expect
deleted file mode 100644
index 03c71df..0000000
--- a/pkg/front_end/testcases/typedef.dart.legacy.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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(self::main is () → dynamic);
-  core::print(self::main is (dynamic) → dynamic);
-  core::print(self::main is (dynamic, dynamic) → dynamic);
-}
diff --git a/pkg/front_end/testcases/typedef.dart.legacy.transformed.expect b/pkg/front_end/testcases/typedef.dart.legacy.transformed.expect
deleted file mode 100644
index 03c71df..0000000
--- a/pkg/front_end/testcases/typedef.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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(self::main is () → dynamic);
-  core::print(self::main is (dynamic) → dynamic);
-  core::print(self::main is (dynamic, dynamic) → dynamic);
-}
diff --git a/pkg/front_end/testcases/typedef.dart.outline.expect b/pkg/front_end/testcases/typedef.dart.outline.expect
deleted file mode 100644
index fa3c15d..0000000
--- a/pkg/front_end/testcases/typedef.dart.outline.expect
+++ /dev/null
@@ -1,8 +0,0 @@
-library;
-import self as self;
-
-typedef _NullaryFunction = () → dynamic;
-typedef _UnaryFunction = (dynamic) → dynamic;
-typedef _BinaryFunction = (dynamic, dynamic) → dynamic;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/typedef.dart.strong.expect b/pkg/front_end/testcases/typedef.dart.strong.expect
deleted file mode 100644
index 03c71df..0000000
--- a/pkg/front_end/testcases/typedef.dart.strong.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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(self::main is () → dynamic);
-  core::print(self::main is (dynamic) → dynamic);
-  core::print(self::main is (dynamic, dynamic) → dynamic);
-}
diff --git a/pkg/front_end/testcases/typedef.dart.strong.transformed.expect b/pkg/front_end/testcases/typedef.dart.strong.transformed.expect
deleted file mode 100644
index 03c71df..0000000
--- a/pkg/front_end/testcases/typedef.dart.strong.transformed.expect
+++ /dev/null
@@ -1,12 +0,0 @@
-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(self::main is () → dynamic);
-  core::print(self::main is (dynamic) → dynamic);
-  core::print(self::main is (dynamic, dynamic) → dynamic);
-}
diff --git a/pkg/front_end/testcases/undefined.dart.legacy.expect b/pkg/front_end/testcases/undefined.dart.legacy.expect
deleted file mode 100644
index f7eb342..0000000
--- a/pkg/front_end/testcases/undefined.dart.legacy.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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 {}
-}
-static method test(self::C c) → void {
-  c.x;
-  c.y;
-  c.f();
-  c.g();
-  c.x = null;
-  c.y = null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined.dart.legacy.transformed.expect b/pkg/front_end/testcases/undefined.dart.legacy.transformed.expect
deleted file mode 100644
index f7eb342..0000000
--- a/pkg/front_end/testcases/undefined.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,20 +0,0 @@
-library;
-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 {}
-}
-static method test(self::C c) → void {
-  c.x;
-  c.y;
-  c.f();
-  c.g();
-  c.x = null;
-  c.y = null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined.dart.outline.expect b/pkg/front_end/testcases/undefined.dart.outline.expect
deleted file mode 100644
index 235d055..0000000
--- a/pkg/front_end/testcases/undefined.dart.outline.expect
+++ /dev/null
@@ -1,15 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field dynamic x;
-  synthetic constructor •() → self::C
-    ;
-  method f() → void
-    ;
-}
-static method test(self::C c) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/undefined.dart.strong.expect b/pkg/front_end/testcases/undefined.dart.strong.expect
deleted file mode 100644
index cf77098..0000000
--- a/pkg/front_end/testcases/undefined.dart.strong.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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 {}
-}
-static method test(self::C c) → void {
-  c.{self::C::x};
-  invalid-expression "pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-  c.y;
-    ^";
-  c.{self::C::f}();
-  invalid-expression "pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'g'.
-  c.g();
-    ^";
-  c.{self::C::x} = null;
-  invalid-expression "pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-  c.y = null;
-    ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
deleted file mode 100644
index cf77098..0000000
--- a/pkg/front_end/testcases/undefined.dart.strong.transformed.expect
+++ /dev/null
@@ -1,53 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
-//  - 'C' is from 'pkg/front_end/testcases/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 {}
-}
-static method test(self::C c) → void {
-  c.{self::C::x};
-  invalid-expression "pkg/front_end/testcases/undefined.dart:12:5: Error: The getter 'y' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing getter, or defining a getter or field named 'y'.
-  c.y;
-    ^";
-  c.{self::C::f}();
-  invalid-expression "pkg/front_end/testcases/undefined.dart:14:5: Error: The method 'g' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing method, or defining a method named 'g'.
-  c.g();
-    ^";
-  c.{self::C::x} = null;
-  invalid-expression "pkg/front_end/testcases/undefined.dart:16:5: Error: The setter 'y' isn't defined for the class 'C'.
- - 'C' is from 'pkg/front_end/testcases/undefined.dart'.
-Try correcting the name to the name of an existing setter, or defining a setter or field named 'y'.
-  c.y = null;
-    ^";
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.expect
deleted file mode 100644
index b349e27..0000000
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-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 {}
-}
-static method test(self::C c) → void {
-  c.x = 1;
-  let final dynamic #t1 = c in #t1.x = #t1.x.+(1);
-  let final dynamic #t2 = c in #t2.x.==(null) ? #t2.x = 1 : null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
deleted file mode 100644
index b349e27..0000000
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,16 +0,0 @@
-library;
-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 {}
-}
-static method test(self::C c) → void {
-  c.x = 1;
-  let final dynamic #t1 = c in #t1.x = #t1.x.+(1);
-  let final dynamic #t2 = c in #t2.x.==(null) ? #t2.x = 1 : null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect
deleted file mode 100644
index c63f24c..0000000
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.outline.expect
+++ /dev/null
@@ -1,14 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  synthetic constructor •() → self::C
-    ;
-  set x(dynamic value) → void
-    ;
-}
-static method test(self::C c) → void
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
deleted file mode 100644
index 35fb71c..0000000
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/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 {}
-}
-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/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/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;
-    ^".+(1);
-  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/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/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;
-    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect b/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
deleted file mode 100644
index 35fb71c..0000000
--- a/pkg/front_end/testcases/undefined_getter_in_compound_assignment.dart.strong.transformed.expect
+++ /dev/null
@@ -1,39 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/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/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/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 {}
-}
-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/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/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;
-    ^".+(1);
-  let final self::C #t2 = c in invalid-expression "pkg/front_end/testcases/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/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;
-    ^".{core::Object::==}(null) ?{dynamic} #t2.{self::C::x} = 1 : null;
-}
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect b/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect
deleted file mode 100644
index 8e795ce..0000000
--- a/pkg/front_end/testcases/uninitialized_fields.dart.outline.expect
+++ /dev/null
@@ -1,32 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Uninitialized extends core::Object {
-  field core::int x;
-  synthetic constructor •() → self::Uninitialized
-    ;
-}
-class PartiallyInitialized extends core::Object {
-  field core::int x;
-  constructor •(core::int x) → self::PartiallyInitialized
-    ;
-  constructor noInitializer() → self::PartiallyInitialized
-    ;
-}
-class Initialized extends core::Object {
-  field core::int x;
-  constructor •(core::int x) → self::Initialized
-    ;
-}
-class Forwarding extends core::Object {
-  field core::int x;
-  constructor initialize(core::int x) → self::Forwarding
-    ;
-  constructor •(core::int arg) → self::Forwarding
-    ;
-}
-static field core::int uninitializedTopLevel;
-static field core::int initializedTopLevel;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect b/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect
deleted file mode 100644
index 843de869..0000000
--- a/pkg/front_end/testcases/uninitialized_fields.dart.strong.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Initialized extends core::Object {
-  field core::int x;
-  constructor •(core::int x) → self::Initialized
-    : self::Initialized::x = x, super core::Object::•()
-    ;
-}
-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)
-    ;
-}
-static field core::int uninitializedTopLevel;
-static field core::int initializedTopLevel = 4;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect b/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect
deleted file mode 100644
index 843de869..0000000
--- a/pkg/front_end/testcases/uninitialized_fields.dart.strong.transformed.expect
+++ /dev/null
@@ -1,37 +0,0 @@
-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::•()
-    ;
-}
-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::•()
-    ;
-}
-class Initialized extends core::Object {
-  field core::int x;
-  constructor •(core::int x) → self::Initialized
-    : self::Initialized::x = x, super core::Object::•()
-    ;
-}
-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)
-    ;
-}
-static field core::int uninitializedTopLevel;
-static field core::int initializedTopLevel = 4;
-static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/unsound_promotion.dart.legacy.expect b/pkg/front_end/testcases/unsound_promotion.dart.legacy.expect
deleted file mode 100644
index fc1dfe0..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.legacy.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-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 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 = dynamic>(self::g::T t) → core::List<self::g::T> {
-  self::list = <self::g::T>[];
-  core::print(self::list.runtimeType);
-  return self::list;
-}
-static method f<S extends core::Object = dynamic>(self::f::S s) → core::List<self::f::S> {
-  if(s is self::A) {
-    dynamic list = self::g<dynamic>(s);
-    return list;
-  }
-  return null;
-}
-static method main() → dynamic {
-  self::f<self::B>(new self::C::•());
-  core::print(self::list.runtimeType);
-  core::List<self::A> aList;
-  aList = self::list;
-  core::Object o = aList;
-  aList = o;
-}
diff --git a/pkg/front_end/testcases/unsound_promotion.dart.legacy.transformed.expect b/pkg/front_end/testcases/unsound_promotion.dart.legacy.transformed.expect
deleted file mode 100644
index fc1dfe0..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,40 +0,0 @@
-library;
-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 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 = dynamic>(self::g::T t) → core::List<self::g::T> {
-  self::list = <self::g::T>[];
-  core::print(self::list.runtimeType);
-  return self::list;
-}
-static method f<S extends core::Object = dynamic>(self::f::S s) → core::List<self::f::S> {
-  if(s is self::A) {
-    dynamic list = self::g<dynamic>(s);
-    return list;
-  }
-  return null;
-}
-static method main() → dynamic {
-  self::f<self::B>(new self::C::•());
-  core::print(self::list.runtimeType);
-  core::List<self::A> aList;
-  aList = self::list;
-  core::Object o = aList;
-  aList = o;
-}
diff --git a/pkg/front_end/testcases/unsound_promotion.dart.outline.expect b/pkg/front_end/testcases/unsound_promotion.dart.outline.expect
deleted file mode 100644
index 9503f5c..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.outline.expect
+++ /dev/null
@@ -1,23 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class A extends core::Object {
-  synthetic constructor •() → self::A
-    ;
-}
-class B extends core::Object {
-  synthetic constructor •() → self::B
-    ;
-}
-class C extends self::B implements self::A {
-  synthetic constructor •() → self::C
-    ;
-}
-static field core::List<self::A> list;
-static method g<T extends self::A = dynamic>(self::g::T t) → core::List<self::g::T>
-  ;
-static method f<S extends core::Object = dynamic>(self::f::S s) → core::List<self::f::S>
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/unsound_promotion.dart.strong.expect b/pkg/front_end/testcases/unsound_promotion.dart.strong.expect
deleted file mode 100644
index 4f9cda5..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.strong.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unsound_promotion.dart:21:16: Error: Can't infer a type for 'T', it can be either 'S' or 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/unsound_promotion.dart'.
-// Try adding a type argument selecting one of the options.
-//     var list = g(s);
-//                ^
-//
-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 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::A>(self::g::T t) → core::List<self::g::T> {
-  self::list = <self::g::T>[];
-  core::print(self::list.{core::Object::runtimeType});
-  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 extends self::A> list = self::g<self::f::S extends self::A>(s{self::f::S extends 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::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/unsound_promotion.dart.strong.transformed.expect b/pkg/front_end/testcases/unsound_promotion.dart.strong.transformed.expect
deleted file mode 100644
index 4f9cda5..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.strong.transformed.expect
+++ /dev/null
@@ -1,49 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/unsound_promotion.dart:21:16: Error: Can't infer a type for 'T', it can be either 'S' or 'A'.
-//  - 'A' is from 'pkg/front_end/testcases/unsound_promotion.dart'.
-// Try adding a type argument selecting one of the options.
-//     var list = g(s);
-//                ^
-//
-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 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::A>(self::g::T t) → core::List<self::g::T> {
-  self::list = <self::g::T>[];
-  core::print(self::list.{core::Object::runtimeType});
-  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 extends self::A> list = self::g<self::f::S extends self::A>(s{self::f::S extends 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::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/unsound_promotion.dart.type_promotion.expect b/pkg/front_end/testcases/unsound_promotion.dart.type_promotion.expect
deleted file mode 100644
index c175828..0000000
--- a/pkg/front_end/testcases/unsound_promotion.dart.type_promotion.expect
+++ /dev/null
@@ -1,9 +0,0 @@
-pkg/front_end/testcases/unsound_promotion.dart:20:9: Context: Possible promotion of s@397
-  if (s is A) {
-        ^^
-pkg/front_end/testcases/unsound_promotion.dart:31:9: Context: Write to aList@541
-  aList = list;
-        ^
-pkg/front_end/testcases/unsound_promotion.dart:33:9: Context: Write to aList@541
-  aList = o;
-        ^
diff --git a/pkg/front_end/testcases/unused_methods.dart.legacy.expect b/pkg/front_end/testcases/unused_methods.dart.legacy.expect
deleted file mode 100644
index 323ddb0..0000000
--- a/pkg/front_end/testcases/unused_methods.dart.legacy.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-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 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}();
-  }
-  method calledFromSubclass() → void {
-    core::print("Unused");
-  }
-}
-class UsedAsInterface extends core::Object {
-  synthetic constructor •() → self::UsedAsInterface
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → self::InstantiatedButMethodsUnused
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-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}();
-  }
-  method calledFromSubclass() → void {}
-}
-static method baseClassCall(self::UsedAsBaseClass object) → void {
-  object.usedInSubclass();
-}
-static method interfaceCall(self::UsedAsInterface object) → void {
-  object.usedInSubclass();
-}
-static method exactCallA(self::ClassA object) → void {
-  object.usedInSubclass();
-}
-static method exactCallB(self::ClassB object) → void {
-  object.usedInSubclass();
-}
-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/unused_methods.dart.legacy.transformed.expect b/pkg/front_end/testcases/unused_methods.dart.legacy.transformed.expect
deleted file mode 100644
index 323ddb0..0000000
--- a/pkg/front_end/testcases/unused_methods.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-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 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}();
-  }
-  method calledFromSubclass() → void {
-    core::print("Unused");
-  }
-}
-class UsedAsInterface extends core::Object {
-  synthetic constructor •() → self::UsedAsInterface
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → self::InstantiatedButMethodsUnused
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-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}();
-  }
-  method calledFromSubclass() → void {}
-}
-static method baseClassCall(self::UsedAsBaseClass object) → void {
-  object.usedInSubclass();
-}
-static method interfaceCall(self::UsedAsInterface object) → void {
-  object.usedInSubclass();
-}
-static method exactCallA(self::ClassA object) → void {
-  object.usedInSubclass();
-}
-static method exactCallB(self::ClassB object) → void {
-  object.usedInSubclass();
-}
-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/unused_methods.dart.outline.expect b/pkg/front_end/testcases/unused_methods.dart.outline.expect
deleted file mode 100644
index a08de38..0000000
--- a/pkg/front_end/testcases/unused_methods.dart.outline.expect
+++ /dev/null
@@ -1,58 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class UnusedClass extends core::Object {
-  constructor •() → self::UnusedClass
-    ;
-}
-abstract class UsedAsBaseClass extends core::Object {
-  synthetic constructor •() → self::UsedAsBaseClass
-    ;
-  method usedInSubclass() → void
-    ;
-  method calledFromB() → void
-    ;
-  method calledFromSubclass() → void
-    ;
-}
-class UsedAsInterface extends core::Object {
-  synthetic constructor •() → self::UsedAsInterface
-    ;
-  method usedInSubclass() → void
-    ;
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → self::InstantiatedButMethodsUnused
-    ;
-  method usedInSubclass() → void
-    ;
-}
-class ClassA extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → self::ClassA
-    ;
-  method usedInSubclass() → void
-    ;
-}
-class ClassB extends self::UsedAsBaseClass implements self::UsedAsInterface, self::InstantiatedButMethodsUnused {
-  synthetic constructor •() → self::ClassB
-    ;
-  method usedInSubclass() → void
-    ;
-  method calledFromSubclass() → void
-    ;
-}
-static method baseClassCall(self::UsedAsBaseClass object) → void
-  ;
-static method interfaceCall(self::UsedAsInterface object) → void
-  ;
-static method exactCallA(self::ClassA object) → void
-  ;
-static method exactCallB(self::ClassB object) → void
-  ;
-static method unusedTopLevel() → dynamic
-  ;
-static method usedTopLevel() → dynamic
-  ;
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/unused_methods.dart.strong.expect b/pkg/front_end/testcases/unused_methods.dart.strong.expect
deleted file mode 100644
index d57f97d..0000000
--- a/pkg/front_end/testcases/unused_methods.dart.strong.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-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 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}();
-  }
-  method calledFromSubclass() → void {
-    core::print("Unused");
-  }
-}
-class UsedAsInterface extends core::Object {
-  synthetic constructor •() → self::UsedAsInterface
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → self::InstantiatedButMethodsUnused
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-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}();
-  }
-  method calledFromSubclass() → void {}
-}
-static method baseClassCall(self::UsedAsBaseClass object) → void {
-  object.{self::UsedAsBaseClass::usedInSubclass}();
-}
-static method interfaceCall(self::UsedAsInterface object) → void {
-  object.{self::UsedAsInterface::usedInSubclass}();
-}
-static method exactCallA(self::ClassA object) → void {
-  object.{self::ClassA::usedInSubclass}();
-}
-static method exactCallB(self::ClassB object) → void {
-  object.{self::ClassB::usedInSubclass}();
-}
-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/unused_methods.dart.strong.transformed.expect b/pkg/front_end/testcases/unused_methods.dart.strong.transformed.expect
deleted file mode 100644
index d57f97d..0000000
--- a/pkg/front_end/testcases/unused_methods.dart.strong.transformed.expect
+++ /dev/null
@@ -1,86 +0,0 @@
-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 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}();
-  }
-  method calledFromSubclass() → void {
-    core::print("Unused");
-  }
-}
-class UsedAsInterface extends core::Object {
-  synthetic constructor •() → self::UsedAsInterface
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-class InstantiatedButMethodsUnused extends core::Object {
-  synthetic constructor •() → self::InstantiatedButMethodsUnused
-    : super core::Object::•()
-    ;
-  method usedInSubclass() → void {
-    core::print("Unused");
-  }
-}
-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}();
-  }
-  method calledFromSubclass() → void {}
-}
-static method baseClassCall(self::UsedAsBaseClass object) → void {
-  object.{self::UsedAsBaseClass::usedInSubclass}();
-}
-static method interfaceCall(self::UsedAsInterface object) → void {
-  object.{self::UsedAsInterface::usedInSubclass}();
-}
-static method exactCallA(self::ClassA object) → void {
-  object.{self::ClassA::usedInSubclass}();
-}
-static method exactCallB(self::ClassB object) → void {
-  object.{self::ClassB::usedInSubclass}();
-}
-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/var_as_type_name.dart.legacy.expect b/pkg/front_end/testcases/var_as_type_name.dart.legacy.expect
deleted file mode 100644
index 3807e34..0000000
--- a/pkg/front_end/testcases/var_as_type_name.dart.legacy.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/var_as_type_name.dart:6:15: Warning: Type 'var' not found.
-//   Map<String, var> m;
-//               ^^^
-//
-// pkg/front_end/testcases/var_as_type_name.dart:6:15: Warning: '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::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic a = new self::A::•();
-  a.m = null;
-}
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.legacy.transformed.expect b/pkg/front_end/testcases/var_as_type_name.dart.legacy.transformed.expect
deleted file mode 100644
index 3807e34..0000000
--- a/pkg/front_end/testcases/var_as_type_name.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/var_as_type_name.dart:6:15: Warning: Type 'var' not found.
-//   Map<String, var> m;
-//               ^^^
-//
-// pkg/front_end/testcases/var_as_type_name.dart:6:15: Warning: '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::•()
-    ;
-}
-static method main() → dynamic {
-  dynamic a = new self::A::•();
-  a.m = null;
-}
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.outline.expect b/pkg/front_end/testcases/var_as_type_name.dart.outline.expect
deleted file mode 100644
index dc6939d..0000000
--- a/pkg/front_end/testcases/var_as_type_name.dart.outline.expect
+++ /dev/null
@@ -1,22 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/var_as_type_name.dart:6:15: Warning: Type 'var' not found.
-//   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;
-  synthetic constructor •() → self::A
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.strong.expect b/pkg/front_end/testcases/var_as_type_name.dart.strong.expect
deleted file mode 100644
index 8c534a9..0000000
--- a/pkg/front_end/testcases/var_as_type_name.dart.strong.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/var_as_type_name.dart:6:15: Error: Type 'var' not found.
-//   Map<String, var> m;
-//               ^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method main() → dynamic {
-  self::A a = new self::A::•();
-  a.{self::A::m} = null;
-}
diff --git a/pkg/front_end/testcases/var_as_type_name.dart.strong.transformed.expect b/pkg/front_end/testcases/var_as_type_name.dart.strong.transformed.expect
deleted file mode 100644
index 8c534a9..0000000
--- a/pkg/front_end/testcases/var_as_type_name.dart.strong.transformed.expect
+++ /dev/null
@@ -1,29 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/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/var_as_type_name.dart:6:15: Error: Type 'var' not found.
-//   Map<String, var> m;
-//               ^^^
-//
-// pkg/front_end/testcases/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::•()
-    ;
-}
-static method main() → dynamic {
-  self::A a = new self::A::•();
-  a.{self::A::m} = null;
-}
diff --git a/pkg/front_end/testcases/void_methods.dart.outline.expect b/pkg/front_end/testcases/void_methods.dart.outline.expect
deleted file mode 100644
index 881f4a6..0000000
--- a/pkg/front_end/testcases/void_methods.dart.outline.expect
+++ /dev/null
@@ -1,17 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class Foo extends core::Object {
-  field core::List<dynamic> list;
-  synthetic constructor •() → self::Foo
-    ;
-  set first(dynamic x) → void
-    ;
-  operator []=(dynamic x, dynamic y) → void
-    ;
-  method clear() → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
deleted file mode 100644
index a170b83..0000000
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.expect
+++ /dev/null
@@ -1,92 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
-//     this. /*@warning=GetterNotFound*/ missingField;
-//                                       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
-//     this. /*@warning=SetterNotFound*/ missingField = 0;
-//                                       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
-//     this. /*@warning=MethodNotFound*/ missingMethod();
-//                                       ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
-//     /*@warning=GetterNotFound*/ missingField;
-//                                 ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
-//     /*@warning=SetterNotFound*/ missingField = 0;
-//                                 ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
-//     /*@warning=MethodNotFound*/ 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 {}
-}
-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};
-    this.{self::C::superField};
-    this.{self::D::field} = 0;
-    this.{self::C::superField} = 0;
-    this.{self::D::method}();
-    this.{self::C::superMethod}();
-    this.{self::C::setterOnly};
-    this.{self::D::setterOnly} = 0;
-    this.{self::D::getterOnly};
-    this.{self::C::getterOnly} = 0;
-    this.{self::D::field};
-    this.{self::C::superField};
-    this.{self::D::field} = 0;
-    this.{self::C::superField} = 0;
-    this.{self::D::method}();
-    this.{self::C::superMethod}();
-    this.{self::C::setterOnly};
-    this.{self::D::setterOnly} = 0;
-    this.{self::D::getterOnly};
-    this.{self::C::getterOnly} = 0;
-    this.missingField;
-    this.missingField = 0;
-    this.missingMethod();
-    this.missingField;
-    this.missingField = 0;
-    this.missingMethod();
-  }
-}
-class E extends self::D {
-  field dynamic missingField = null;
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  method missingMethod() → void {}
-}
-static method main() → dynamic {
-  new self::E::•().test();
-}
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
deleted file mode 100644
index a170b83..0000000
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.legacy.transformed.expect
+++ /dev/null
@@ -1,92 +0,0 @@
-library;
-//
-// Problems in library:
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:48:39: Warning: Getter not found: 'missingField'.
-//     this. /*@warning=GetterNotFound*/ missingField;
-//                                       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:49:39: Warning: Setter not found: 'missingField'.
-//     this. /*@warning=SetterNotFound*/ missingField = 0;
-//                                       ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:50:39: Warning: Method not found: 'missingMethod'.
-//     this. /*@warning=MethodNotFound*/ missingMethod();
-//                                       ^^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:52:33: Warning: Getter not found: 'missingField'.
-//     /*@warning=GetterNotFound*/ missingField;
-//                                 ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:53:33: Warning: Setter not found: 'missingField'.
-//     /*@warning=SetterNotFound*/ missingField = 0;
-//                                 ^^^^^^^^^^^^
-//
-// pkg/front_end/testcases/warn_unresolved_sends.dart:54:33: Warning: Method not found: 'missingMethod'.
-//     /*@warning=MethodNotFound*/ 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 {}
-}
-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};
-    this.{self::C::superField};
-    this.{self::D::field} = 0;
-    this.{self::C::superField} = 0;
-    this.{self::D::method}();
-    this.{self::C::superMethod}();
-    this.{self::C::setterOnly};
-    this.{self::D::setterOnly} = 0;
-    this.{self::D::getterOnly};
-    this.{self::C::getterOnly} = 0;
-    this.{self::D::field};
-    this.{self::C::superField};
-    this.{self::D::field} = 0;
-    this.{self::C::superField} = 0;
-    this.{self::D::method}();
-    this.{self::C::superMethod}();
-    this.{self::C::setterOnly};
-    this.{self::D::setterOnly} = 0;
-    this.{self::D::getterOnly};
-    this.{self::C::getterOnly} = 0;
-    this.missingField;
-    this.missingField = 0;
-    this.missingMethod();
-    this.missingField;
-    this.missingField = 0;
-    this.missingMethod();
-  }
-}
-class E extends self::D {
-  field dynamic missingField = null;
-  synthetic constructor •() → self::E
-    : super self::D::•()
-    ;
-  method missingMethod() → void {}
-}
-static method main() → dynamic {
-  new self::E::•().test();
-}
diff --git a/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect b/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect
deleted file mode 100644
index ba36f3f..0000000
--- a/pkg/front_end/testcases/warn_unresolved_sends.dart.outline.expect
+++ /dev/null
@@ -1,41 +0,0 @@
-library;
-import self as self;
-import "dart:core" as core;
-
-class C extends core::Object {
-  field dynamic superField;
-  synthetic constructor •() → self::C
-    ;
-  method superMethod() → dynamic
-    ;
-  get setterOnly() → dynamic
-    ;
-  set setterOnly(dynamic _) → void
-    ;
-  get getterOnly() → dynamic
-    ;
-  set getterOnly(dynamic _) → void
-    ;
-}
-class D extends self::C {
-  field dynamic field;
-  synthetic constructor •() → self::D
-    ;
-  set setterOnly(dynamic _) → void
-    ;
-  get getterOnly() → dynamic
-    ;
-  method method() → dynamic
-    ;
-  method test() → void
-    ;
-}
-class E extends self::D {
-  field dynamic missingField;
-  synthetic constructor •() → self::E
-    ;
-  method missingMethod() → void
-    ;
-}
-static method main() → dynamic
-  ;
diff --git a/pkg/front_end/testing.json b/pkg/front_end/testing.json
index a1457fc..0c35782 100644
--- a/pkg/front_end/testing.json
+++ b/pkg/front_end/testing.json
@@ -80,8 +80,8 @@
       "exclude": [
         "/testcases/.*_part[0-9]*\\.dart$",
         "/testcases/.*_lib[0-9]*\\.dart$",
-	"/testcases/bug33099",
-	"/testcases/covariant_generic",
+	"/testcases/general/bug33099",
+	"/testcases/general/covariant_generic",
 	"/testcases/inference/bug32291",
 	"/testcases/inference/downward_inference_miscellaneous",
 	"/testcases/inference/generic_methods_correctly_recognize_generic_upper_bound",
@@ -221,6 +221,54 @@
     },
 
     {
+      "name": "spelling_test",
+      "kind": "Chain",
+      "source": "test/spelling_test.dart",
+      "path": ".",
+      "status": "test/spelling_test.status",
+      "pattern": [
+        ".*\\.dart$"
+      ],
+      "exclude": [
+        "src/fasta/fasta_codes_generated\\.dart$",
+        "test/fasta/super_mixins_test\\.dart$",
+        "test/fasta/types/subtypes_benchmark\\.dart$",
+        "test/fasta/unlinked_scope_test\\.dart$",
+        "test/incremental_load_from_dill_test\\.dart$",
+        "test/incremental_load_from_invalid_dill_test\\.dart$",
+        "test/memory_file_system_test\\.dart$",
+        "test/scanner_fasta_test\\.dart$",
+        "test/scanner_test\\.dart$",
+        "test/standard_file_system_test\\.dart$",
+        "test/tool/reload\\.dart$",
+        "test/type_labeler_test\\.dart$",
+        "testcases/expression/main\\.dart$",
+        "testcases/general/DeltaBlue\\.dart$",
+        "testcases/general/annotation_variable_declaration\\.dart$",
+        "testcases/general/arithmetic\\.dart$",
+        "testcases/general/bad_type_variable_uses_in_supertypes\\.dart$",
+        "testcases/general/clone_function_type\\.dart$",
+        "testcases/general/co19_language_metadata_syntax_t04\\.dart$",
+        "testcases/general/complex_class_hierarchy\\.dart$",
+        "testcases/general/issue34899\\.dart$",
+        "testcases/general/micro\\.dart$",
+        "testcases/general/redirecting_factory\\.dart$",
+        "testcases/general/spread_collection_inference\\.dart$",
+        "testcases/inference/downwards_inference_initializing_formal_default_formal\\.dart$",
+        "testcases/inference/downwards_inference_on_generic_function_expressions\\.dart$",
+        "testcases/inference/for_in_loop_promotion\\.dart$",
+        "testcases/inference/future_union_upwards_generic_methods\\.dart$",
+        "testcases/inference/generic_methods_infer_generic_instantiation\\.dart$",
+        "testcases/inference/overloaded_int_operators\\.dart$",
+        "testcases/instantiate_to_bound/non_simple_many\\.dart$",
+        "testcases/instantiate_to_bound/non_simple_suppress_consequence\\.dart$",
+        "testcases/rasta/switch_execution_case_t02\\.dart$",
+        "testcases/set_literals/disambiguation_rule\\.dart$",
+        "tool/_fasta/abcompile\\.dart$"
+      ]
+    },
+
+    {
       "name": "sdk",
       "kind": "Chain",
       "source": "test/fasta/sdk_test.dart",
@@ -346,7 +394,14 @@
     },
 
     "exclude": [
-      "^pkg/analysis_server/lib/src/analysis_server\\.dart"
+      "^pkg/analysis_server/lib/src/analysis_server\\.dart",
+      "test/extensions/data/",
+      "test/id_testing/data/",
+      "test/language_versioning/data/",
+      "test/flow_analysis/definite_assignment/data/",
+      "test/flow_analysis/nullability/data/",
+      "test/flow_analysis/reachability/data/",
+      "test/flow_analysis/type_promotion/data/"
     ]
   }
 }
diff --git a/pkg/front_end/tool/_fasta/bulk_compile.dart b/pkg/front_end/tool/_fasta/bulk_compile.dart
index c89d769..79ec59a 100644
--- a/pkg/front_end/tool/_fasta/bulk_compile.dart
+++ b/pkg/front_end/tool/_fasta/bulk_compile.dart
@@ -24,7 +24,7 @@
 import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
 
 import 'package:front_end/src/kernel_generator_impl.dart'
-    show CompilerResult, generateKernelInternal;
+    show InternalCompilerResult, generateKernelInternal;
 
 const String customScheme = "org-dartlang-bulkcompile";
 
@@ -51,7 +51,7 @@
     return CompilerContext.runWithOptions(options,
         (CompilerContext context) async {
       (await context.options.loadSdkSummary(null))?.computeCanonicalNames();
-      CompilerResult result = await generateKernelInternal();
+      InternalCompilerResult result = await generateKernelInternal();
       result?.component?.unbindCanonicalNames();
       return null;
     });
diff --git a/pkg/front_end/tool/_fasta/command_line.dart b/pkg/front_end/tool/_fasta/command_line.dart
index ae7650d..d6c0bbf 100644
--- a/pkg/front_end/tool/_fasta/command_line.dart
+++ b/pkg/front_end/tool/_fasta/command_line.dart
@@ -13,6 +13,7 @@
 
 import 'package:front_end/src/api_prototype/compiler_options.dart'
     show CompilerOptions, parseExperimentalFlags;
+import 'package:front_end/src/api_prototype/compiler_options.dart';
 
 import 'package:front_end/src/api_prototype/experimental_flags.dart'
     show ExperimentalFlag;
@@ -313,8 +314,6 @@
 
   final bool noDefines = options["--no-defines"];
 
-  final bool enableAsserts = options["--enable-asserts"];
-
   final bool verify = options["--verify"];
 
   final bool dumpIr = options["--dump-ir"];
@@ -353,7 +352,9 @@
   }
 
   Map<ExperimentalFlag, bool> experimentalFlags = parseExperimentalFlags(
-      options["--enable-experiment"], throwCommandLineProblem);
+      parseExperimentalArguments(options["--enable-experiment"]),
+      onError: throwCommandLineProblem,
+      onWarning: print);
 
   if (programName == "compile_platform") {
     if (arguments.length != 5) {
@@ -378,7 +379,6 @@
           ..packagesFileUri = packages
           ..legacyMode = legacyMode
           ..target = target
-          ..enableAsserts = enableAsserts
           ..throwOnErrorsForDebugging = errorsAreFatal
           ..throwOnWarningsForDebugging = warningsAreFatal
           ..embedSourceText = !excludeSource
@@ -415,7 +415,6 @@
     ..packagesFileUri = packages
     ..legacyMode = legacyMode
     ..target = target
-    ..enableAsserts = enableAsserts
     ..throwOnErrorsForDebugging = errorsAreFatal
     ..throwOnWarningsForDebugging = warningsAreFatal
     ..embedSourceText = !excludeSource
diff --git a/pkg/front_end/tool/_fasta/entry_points.dart b/pkg/front_end/tool/_fasta/entry_points.dart
index 18b7445..b11e457 100644
--- a/pkg/front_end/tool/_fasta/entry_points.dart
+++ b/pkg/front_end/tool/_fasta/entry_points.dart
@@ -10,6 +10,7 @@
 
 import 'dart:io' show File, Platform, exitCode, stderr, stdin, stdout;
 
+import 'package:front_end/src/fasta/resolve_input_uri.dart';
 import 'package:kernel/kernel.dart'
     show CanonicalName, Library, Component, Source, loadComponentFromBytes;
 
@@ -115,7 +116,7 @@
 }
 
 class BatchCompiler {
-  final Stream lines;
+  final Stream<String> lines;
 
   Uri platformUri;
 
@@ -299,7 +300,7 @@
   dillTarget.loader.appendLibraries(platformComponent, byteCount: bytes.length);
 }
 
-Future compilePlatform(List<String> arguments) async {
+Future<void> compilePlatform(List<String> arguments) async {
   await withGlobalOptions("compile_platform", arguments, false,
       (CompilerContext c, List<String> restArguments) {
     Uri hostPlatform = Uri.base.resolveUri(new Uri.file(restArguments[2]));
@@ -309,7 +310,7 @@
   });
 }
 
-Future compilePlatformInternal(CompilerContext c, Uri fullOutput,
+Future<void> compilePlatformInternal(CompilerContext c, Uri fullOutput,
     Uri outlineOutput, Uri hostPlatform) async {
   if (c.options.verbose) {
     print("Generating outline of ${c.options.sdkRoot} into $outlineOutput");
@@ -360,7 +361,7 @@
       platform: hostPlatform, target: hostTarget);
 }
 
-Future writeDepsFile(
+Future<void> writeDepsFile(
     Uri output, Uri depsFile, List<Uri> allDependencies) async {
   if (allDependencies.isEmpty) return;
   String toRelativeFilePath(Uri uri) {
@@ -383,7 +384,7 @@
     //
     //     ninja explain: expected depfile 'vm_platform.dill.d' to mention \
     //     'vm_platform.dill', got '/.../xcodebuild/ReleaseX64/vm_platform.dill'
-    return Uri.parse(relativizeUri(uri, base: Uri.base)).toFilePath();
+    return Uri.parse(relativizeUri(Uri.base, uri, isWindows)).toFilePath();
   }
 
   StringBuffer sb = new StringBuffer();
diff --git a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
index 82918cf..096b051 100644
--- a/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
+++ b/pkg/front_end/tool/_fasta/generate_experimental_flags.dart
@@ -51,41 +51,18 @@
 enum ExperimentalFlag {
 ''');
   for (var key in keys) {
-    var expired = (yaml[key] as YamlMap)['expired'];
-    if (expired == true) continue;
     sb.writeln('  ${keyToIdentifier(key)},');
   }
   sb.write('''
-
-  // A placeholder representing an "expired" flag which has been removed
-  // from the codebase but still needs to be gracefully ignored
-  // when specified on the command line.
-  expiredFlag,
 }
 
 ExperimentalFlag parseExperimentalFlag(String flag) {
   switch (flag) {
 ''');
-  var expiredKeys = <String>[];
   for (var key in keys) {
-    var expired = (yaml[key] as YamlMap)['expired'];
-    if (expired == true) {
-      expiredKeys.add(key);
-      continue;
-    }
     sb.writeln('    case "$key":');
     sb.writeln('     return ExperimentalFlag.${keyToIdentifier(key)};');
   }
-  if (expiredKeys.isNotEmpty) {
-    sb.write('''
-
-    // Expired flags
-''');
-    for (var key in expiredKeys) {
-      sb.writeln('    case "$key":');
-      sb.writeln('     return ExperimentalFlag.expiredFlag;');
-    }
-  }
   sb.write('''  }
   return null;
 }
@@ -94,7 +71,6 @@
 ''');
   for (var key in keys) {
     var expired = (yaml[key] as YamlMap)['expired'];
-    if (expired == true) continue;
     bool shipped = (yaml[key] as YamlMap)['enabledIn'] != null;
     sb.writeln('  ExperimentalFlag.${keyToIdentifier(key)}: ${shipped},');
     if (shipped) {
@@ -103,6 +79,15 @@
       }
     }
   }
+  sb.write('''
+};
+
+const Map<ExperimentalFlag, bool> expiredExperimentalFlags = {
+''');
+  for (var key in keys) {
+    bool expired = (yaml[key] as YamlMap)['expired'] == true;
+    sb.writeln('  ExperimentalFlag.${keyToIdentifier(key)}: ${expired},');
+  }
   sb.writeln('};');
 
   return new DartFormatter().format("$sb");
diff --git a/pkg/front_end/tool/fasta_perf.dart b/pkg/front_end/tool/fasta_perf.dart
index 9bb4e6e..624c3ac 100644
--- a/pkg/front_end/tool/fasta_perf.dart
+++ b/pkg/front_end/tool/fasta_perf.dart
@@ -236,7 +236,8 @@
     ..legacyMode = legacyMode
     ..target = createTarget(isFlutter: false, legacyMode: legacyMode)
     ..packagesFileUri = Uri.base.resolve('.packages')
-    ..compileSdk = compileSdk;
+    ..compileSdk = compileSdk
+    ..environmentDefines = const {};
   if (!compileSdk) {
     // TODO(sigmund): fix this: this is broken since the change to move .dill
     // files out of the patched_sdk folder. It is not failing anywhere because
@@ -244,7 +245,7 @@
     options.sdkSummary = sdkRoot.resolve('outline.dill');
   }
 
-  var program = await kernelForComponent([entryUri], options);
+  var program = await kernelForModule([entryUri], options);
 
   timer.stop();
   var name = 'kernel_gen_e2e${compileSdk ? "" : "_sum"}';
diff --git a/pkg/front_end/tool/incremental_perf.dart b/pkg/front_end/tool/incremental_perf.dart
index 5851526..1d1ddfd 100644
--- a/pkg/front_end/tool/incremental_perf.dart
+++ b/pkg/front_end/tool/incremental_perf.dart
@@ -30,7 +30,7 @@
 ///      ]
 ///    },
 ///    {
-///      "name" : "small_chnage",
+///      "name" : "small_change",
 ///      "edits" : [
 ///        ["input1.dart", "green", "blue"]
 ///      ]
@@ -113,7 +113,8 @@
     ..fileSystem = overlayFs
     ..legacyMode = legacyMode
     ..onDiagnostic = onDiagnosticMessageHandler(legacyMode: legacyMode)
-    ..target = createTarget(isFlutter: isFlutter, legacyMode: legacyMode);
+    ..target = createTarget(isFlutter: isFlutter, legacyMode: legacyMode)
+    ..environmentDefines = const {};
   if (sdkSummary != null) {
     compilerOptions.sdkSummary = _resolveOverlayUri(sdkSummary);
   }
diff --git a/pkg/js_ast/lib/src/builder.dart b/pkg/js_ast/lib/src/builder.dart
index bf9e94a..9ec3bfe 100644
--- a/pkg/js_ast/lib/src/builder.dart
+++ b/pkg/js_ast/lib/src/builder.dart
@@ -318,6 +318,7 @@
         case "\v":
           return r"\v";
       }
+      throw new UnsupportedError("Unexpected match: ${match.group(0)}");
     });
     LiteralString result = string(escaped);
     // We don't escape ' under the assumption that the string is wrapped
diff --git a/pkg/js_ast/lib/src/template.dart b/pkg/js_ast/lib/src/template.dart
index a7dcf48..3cfc133 100644
--- a/pkg/js_ast/lib/src/template.dart
+++ b/pkg/js_ast/lib/src/template.dart
@@ -199,7 +199,8 @@
       var value = arguments[nameOrPosition];
       if (value is Expression) return value;
       if (value is String) return convertStringToVariableUse(value);
-      error('Interpolated value #$nameOrPosition is not an Expression: $value');
+      throw error(
+          'Interpolated value #$nameOrPosition is not an Expression: $value');
     };
   }
 
@@ -209,7 +210,8 @@
       var value = arguments[nameOrPosition];
       if (value is Declaration) return value;
       if (value is String) return convertStringToVariableDeclaration(value);
-      error('Interpolated value #$nameOrPosition is not a declaration: $value');
+      throw error(
+          'Interpolated value #$nameOrPosition is not a declaration: $value');
     };
   }
 
@@ -221,7 +223,7 @@
         Expression toExpression(item) {
           if (item is Expression) return item;
           if (item is String) return convertStringToVariableUse(item);
-          return error('Interpolated value #$nameOrPosition is not '
+          throw error('Interpolated value #$nameOrPosition is not '
               'an Expression or List of Expressions: $value');
         }
 
@@ -249,7 +251,7 @@
       Parameter toParameter(item) {
         if (item is Parameter) return item;
         if (item is String) return new Parameter(item);
-        return error('Interpolated value #$nameOrPosition is not a Parameter or'
+        throw error('Interpolated value #$nameOrPosition is not a Parameter or'
             ' List of Parameters: $value');
       }
 
@@ -267,7 +269,8 @@
       var value = arguments[nameOrPosition];
       if (value is Expression) return value;
       if (value is String) return new LiteralString('"$value"');
-      error('Interpolated value #$nameOrPosition is not a selector: $value');
+      throw error(
+          'Interpolated value #$nameOrPosition is not a selector: $value');
     };
   }
 
@@ -276,7 +279,8 @@
     return (arguments) {
       var value = arguments[nameOrPosition];
       if (value is Node) return value.toStatement();
-      error('Interpolated value #$nameOrPosition is not a Statement: $value');
+      throw error(
+          'Interpolated value #$nameOrPosition is not a Statement: $value');
     };
   }
 
@@ -288,7 +292,7 @@
         Statement toStatement(item) {
           if (item is Statement) return item;
           if (item is Expression) return item.toStatement();
-          return error('Interpolated value #$nameOrPosition is not '
+          throw error('Interpolated value #$nameOrPosition is not '
               'a Statement or List of Statements: $value');
         }
 
@@ -370,7 +374,7 @@
         if (value is bool) return value;
         if (value is Expression) return value;
         if (value is String) return convertStringToVariableUse(value);
-        error('Interpolated value #$nameOrPosition '
+        throw error('Interpolated value #$nameOrPosition '
             'is not an Expression: $value');
       };
     }
diff --git a/pkg/kernel/bin/transform.dart b/pkg/kernel/bin/transform.dart
index f384400..81bfe53 100755
--- a/pkg/kernel/bin/transform.dart
+++ b/pkg/kernel/bin/transform.dart
@@ -90,7 +90,9 @@
   final hierarchy = new ClassHierarchy(component);
   switch (options['transformation']) {
     case 'continuation':
-      component = cont.transformComponent(coreTypes, component);
+      bool productMode = defines["dart.vm.product"] == "true";
+      component = cont.transformComponent(coreTypes, component,
+          productMode: productMode);
       break;
     case 'resolve-mixins':
       mix.transformLibraries(
@@ -102,8 +104,7 @@
     case 'constants':
       final VmConstantsBackend backend = new VmConstantsBackend(coreTypes);
       component = constants.transformComponent(
-          component, backend, defines, const constants.SimpleErrorReporter(),
-          enableAsserts: true);
+          component, backend, defines, const constants.SimpleErrorReporter());
       break;
     case 'methodcall':
       component =
diff --git a/pkg/kernel/binary.md b/pkg/kernel/binary.md
index 9dc8a27..df1c4c0 100644
--- a/pkg/kernel/binary.md
+++ b/pkg/kernel/binary.md
@@ -139,7 +139,7 @@
 
 type ComponentFile {
   UInt32 magic = 0x90ABCDEF;
-  UInt32 formatVersion = 26;
+  UInt32 formatVersion = 28;
   List<String> problemsAsJson; // Described in problems.md.
   Library[] libraries;
   UriSource sourceMap;
@@ -224,6 +224,8 @@
 
 type Library {
   Byte flags (isExternal, isSynthetic);
+  UInt languageVersionMajor;
+  UInt languageVersionMinor;
   CanonicalNameReference canonicalName;
   StringReference name;
   // An absolute path URI to the .dart file from which the library was created.
@@ -1195,6 +1197,8 @@
   FunctionNode function;
 }
 
+enum Nullability { nullable = 0, nonNullable = 1, neither = 2, legacy = 3, }
+
 abstract type DartType extends Node {}
 
 type InvalidType extends DartType {
@@ -1211,18 +1215,21 @@
 
 type InterfaceType extends DartType {
   Byte tag = 93;
+  Byte nullability; // Index into the Nullability enum above.
   ClassReference class;
   List<DartType> typeArguments;
 }
 
 type SimpleInterfaceType extends DartType {
   Byte tag = 96; // Note: tag is out of order.
+  Byte nullability; // Index into the Nullability enum above.
   ClassReference class;
   // Equivalent to InterfaceType with empty list of type arguments.
 }
 
 type FunctionType extends DartType {
   Byte tag = 94;
+  Byte nullability; // Index into the Nullability enum above.
   List<TypeParameter> typeParameters;
   UInt requiredParameterCount;
   // positionalParameters.length + namedParameters.length
@@ -1235,6 +1242,7 @@
 
 type SimpleFunctionType extends DartType {
   Byte tag = 97; // Note: tag is out of order.
+  Byte nullability; // Index into the Nullability enum above.
   List<DartType> positionalParameters;
   List<StringReference> positionalParameterNames;
   DartType returnType;
@@ -1249,6 +1257,7 @@
 
 type TypeParameterType extends DartType {
   Byte tag = 95;
+  Byte nullability; // Index into the Nullability enum above.
 
   // Reference to the Nth type parameter in scope (with some caveats about
   // type parameter bounds).
@@ -1273,6 +1282,7 @@
 
 type TypedefType {
   Byte tag = 87;
+  Byte nullability; // Index into the Nullability enum above.
   TypedefReference typedefReference;
   List<DartType> typeArguments;
 }
diff --git a/pkg/kernel/lib/ast.dart b/pkg/kernel/lib/ast.dart
index 45fa1d8..da28c4c 100644
--- a/pkg/kernel/lib/ast.dart
+++ b/pkg/kernel/lib/ast.dart
@@ -284,6 +284,24 @@
   /// The URI of the source file this library was loaded from.
   Uri fileUri;
 
+  // TODO(jensj): Do we have a better option than this?
+  static int defaultLangaugeVersionMajor = 2;
+  static int defaultLangaugeVersionMinor = 4;
+
+  int _languageVersionMajor;
+  int _languageVersionMinor;
+  int get languageVersionMajor =>
+      _languageVersionMajor ?? defaultLangaugeVersionMajor;
+  int get languageVersionMinor =>
+      _languageVersionMinor ?? defaultLangaugeVersionMinor;
+  void setLanguageVersion(int languageVersionMajor, int languageVersionMinor) {
+    if (languageVersionMajor == null || languageVersionMinor == null) {
+      throw new StateError("Trying to set langauge version 'null'");
+    }
+    _languageVersionMajor = languageVersionMajor;
+    _languageVersionMinor = languageVersionMinor;
+  }
+
   static const int ExternalFlag = 1 << 0;
   static const int SyntheticFlag = 1 << 1;
 
@@ -1631,6 +1649,7 @@
       bool isConst: false,
       bool isForwardingStub: false,
       bool isForwardingSemiStub: false,
+      bool isExtensionMethod: false,
       int transformerFlags: 0,
       Uri fileUri,
       Reference reference,
@@ -1643,6 +1662,7 @@
             isConst: isConst,
             isForwardingStub: isForwardingStub,
             isForwardingSemiStub: isForwardingSemiStub,
+            isExtensionMethod: isExtensionMethod,
             transformerFlags: transformerFlags,
             fileUri: fileUri,
             reference: reference,
@@ -1658,6 +1678,7 @@
       bool isConst: false,
       bool isForwardingStub: false,
       bool isForwardingSemiStub: false,
+      bool isExtensionMethod: false,
       int transformerFlags: 0,
       Uri fileUri,
       Reference reference,
@@ -1671,6 +1692,7 @@
     this.isConst = isConst;
     this.isForwardingStub = isForwardingStub;
     this.isForwardingSemiStub = isForwardingSemiStub;
+    this.isExtensionMethod = isExtensionMethod;
     this.transformerFlags = transformerFlags;
   }
 
@@ -1683,6 +1705,7 @@
   // TODO(29841): Remove this flag after the issue is resolved.
   static const int FlagRedirectingFactoryConstructor = 1 << 6;
   static const int FlagNoSuchMethodForwarder = 1 << 7;
+  static const int FlagExtensionMethod = 1 << 8;
 
   bool get isStatic => flags & FlagStatic != 0;
   bool get isAbstract => flags & FlagAbstract != 0;
@@ -1719,6 +1742,18 @@
 
   bool get isNoSuchMethodForwarder => flags & FlagNoSuchMethodForwarder != 0;
 
+  /// If `true` this procedure is compiled from a method declared in
+  /// an extension declaration.
+  ///
+  /// For instance `method1` and `method2` in:
+  ///
+  ///     extension A on B {
+  ///       B method1() => this;
+  ///       static B method2() => new B();
+  ///     }
+  ///
+  bool get isExtensionMethod => flags & FlagExtensionMethod != 0;
+
   void set isStatic(bool value) {
     flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
   }
@@ -1758,6 +1793,11 @@
         : (flags & ~FlagNoSuchMethodForwarder);
   }
 
+  void set isExtensionMethod(bool value) {
+    flags =
+        value ? (flags | FlagExtensionMethod) : (flags & ~FlagExtensionMethod);
+  }
+
   bool get isInstanceMember => !isStatic;
   bool get isGetter => kind == ProcedureKind.Getter;
   bool get isSetter => kind == ProcedureKind.Setter;
@@ -4801,12 +4841,6 @@
 
 /// Represents nullability of a type.
 enum Nullability {
-  /// Types in opt-out libraries are 'legacy' types.
-  ///
-  /// They are both subtypes and supertypes of the nullable and non-nullable
-  /// versions of the type.
-  legacy,
-
   /// Nullable types are marked with the '?' modifier.
   ///
   /// Null, dynamic, and void are nullable by default.
@@ -4831,7 +4865,13 @@
   ///       Object y = x;  // Compile-time error.
   ///     }
   ///   }
-  neither
+  neither,
+
+  /// Types in opt-out libraries are 'legacy' types.
+  ///
+  /// They are both subtypes and supertypes of the nullable and non-nullable
+  /// versions of the type.
+  legacy
 }
 
 /// A syntax-independent notion of a type.
@@ -5220,6 +5260,28 @@
 /// is the same as the [TypeParameter]'s bound.  This allows one to detect
 /// whether the bound has been promoted.
 class TypeParameterType extends DartType {
+  /// Declared by the programmer on the type.
+  final Nullability declaredNullability;
+
+  /// Actual nullability of the type, calculated from its parts.
+  ///
+  /// [nullability] is calculated from [declaredNullability] and the
+  /// nullabilities of [promotedBound] and the bound of [parameter].
+  ///
+  /// For example, in the following program [declaredNullability] both `x` and
+  /// `y` is [Nullability.nullable], because it's copied from that of `bar`.
+  /// However, despite [nullability] of `x` is [Nullability.nullable],
+  /// [nullability] of `y` is [Nullability.nonNullable] because of its
+  /// [promotedBound].
+  ///
+  ///     class A<T extends Object?> {
+  ///       foo(T? bar) {
+  ///         var x = bar;
+  ///         if (bar is int) {
+  ///           var y = bar;
+  ///         }
+  ///       }
+  ///     }
   final Nullability nullability;
 
   TypeParameter parameter;
@@ -5231,9 +5293,9 @@
   DartType promotedBound;
 
   TypeParameterType(this.parameter,
-      [this.promotedBound, Nullability nullability])
+      [this.promotedBound, this.declaredNullability = Nullability.legacy])
       : this.nullability =
-            getNullability(parameter, promotedBound, nullability);
+            getNullability(parameter, promotedBound, declaredNullability);
 
   accept(DartTypeVisitor v) => v.visitTypeParameterType(this);
   accept1(DartTypeVisitor1 v, arg) => v.visitTypeParameterType(this, arg);
@@ -5255,7 +5317,7 @@
   /// [TypeParameterType] to compute the value of
   /// [TypeParameterType.nullability] from the arguments passed to the constructor.
   static Nullability getNullability(TypeParameter parameter,
-      DartType promotedBound, Nullability nullability) {
+      DartType promotedBound, Nullability declaredNullability) {
     // If promotedBound is null, getNullability returns the nullability of
     // either T or T? where T is parameter and the presence of '?' is determined
     // by nullability.
@@ -5273,7 +5335,7 @@
     // If the nullability is explicitly nullable, that is, if the type parameter
     // type is followed by '?' in the code, the nullability of the type is
     // 'nullable.'
-    if (nullability == Nullability.nullable) {
+    if (declaredNullability == Nullability.nullable) {
       lhsNullability = Nullability.nullable;
     } else {
       // If the bound is nullable, both nullable and non-nullable types can be
@@ -5604,7 +5666,7 @@
         : '#$name';
   }
 
-  int get hashCode => name.hashCode ^ libraryReference.hashCode;
+  int get hashCode => _Hash.hash2(name, libraryReference);
 
   bool operator ==(Object other) =>
       identical(this, other) ||
@@ -5636,12 +5698,10 @@
 
   String toString() => '${this.runtimeType}<$keyType, $valueType>($entries)';
 
-  // TODO(kustermann): Consider combining the hash codes in a better way (also
-  // below and in [listHashCode]/[mapHashCode].
   int _cachedHashCode;
   int get hashCode {
-    return _cachedHashCode ??=
-        keyType.hashCode ^ valueType.hashCode ^ listHashCode(entries);
+    return _cachedHashCode ??= _Hash.combine2Finish(
+        keyType.hashCode, valueType.hashCode, _Hash.combineListHash(entries));
   }
 
   bool operator ==(Object other) =>
@@ -5662,7 +5722,7 @@
 
   String toString() => '$key: $value';
 
-  int get hashCode => key.hashCode ^ value.hashCode;
+  int get hashCode => _Hash.hash2(key, value);
 
   bool operator ==(Object other) =>
       other is ConstantMapEntry && other.key == key && other.value == value;
@@ -5688,7 +5748,8 @@
 
   int _cachedHashCode;
   int get hashCode {
-    return _cachedHashCode ??= typeArgument.hashCode ^ listHashCode(entries);
+    return _cachedHashCode ??= _Hash.combineFinish(
+        typeArgument.hashCode, _Hash.combineListHash(entries));
   }
 
   bool operator ==(Object other) =>
@@ -5721,7 +5782,8 @@
 
   int _cachedHashCode;
   int get hashCode {
-    return _cachedHashCode ??= typeArgument.hashCode ^ listHashCode(entries);
+    return _cachedHashCode ??= _Hash.combineFinish(
+        typeArgument.hashCode, _Hash.combineListHash(entries));
   }
 
   bool operator ==(Object other) =>
@@ -5774,9 +5836,10 @@
 
   int _cachedHashCode;
   int get hashCode {
-    return _cachedHashCode ??= classReference.hashCode ^
-        listHashCode(typeArguments) ^
-        mapHashCode(fieldValues);
+    return _cachedHashCode ??= _Hash.combine2Finish(
+        classReference.hashCode,
+        listHashCode(typeArguments),
+        _Hash.combineMapHashUnordered(fieldValues));
   }
 
   bool operator ==(Object other) {
@@ -5810,7 +5873,8 @@
     return '${runtimeType}(${tearOffConstant.procedure}<${types.join(', ')}>)';
   }
 
-  int get hashCode => tearOffConstant.hashCode ^ listHashCode(types);
+  int get hashCode => _Hash.combineFinish(
+      tearOffConstant.hashCode, _Hash.combineListHash(types));
 
   bool operator ==(Object other) {
     return other is PartialInstantiationConstant &&
@@ -6307,15 +6371,112 @@
   return library.canonicalName;
 }
 
+/// Murmur-inspired hashing, with a fall-back to Jenkins-inspired hashing when
+/// compiled to JavaScript.
+///
+/// A hash function should be constructed of several [combine] calls followed by
+/// a [finish] call.
+class _Hash {
+  static const int M = 0x9ddfea08eb382000 + 0xd69;
+  static const bool intIs64Bit = (1 << 63) != 0;
+
+  /// Primitive hash combining step.
+  static int combine(int value, int hash) {
+    if (intIs64Bit) {
+      value *= M;
+      value ^= _shru(value, 47);
+      value *= M;
+      hash ^= value;
+      hash *= M;
+    } else {
+      // Fall back to Jenkins-inspired hashing on JavaScript platforms.
+      hash = 0x1fffffff & (hash + value);
+      hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
+      hash = hash ^ (hash >> 6);
+    }
+    return hash;
+  }
+
+  /// Primitive hash finalization step.
+  static int finish(int hash) {
+    if (intIs64Bit) {
+      hash ^= _shru(hash, 44);
+      hash *= M;
+      hash ^= _shru(hash, 41);
+    } else {
+      // Fall back to Jenkins-inspired hashing on JavaScript platforms.
+      hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+      hash = hash ^ (hash >> 11);
+      hash = 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
+    }
+    return hash;
+  }
+
+  static int combineFinish(int value, int hash) {
+    return finish(combine(value, hash));
+  }
+
+  static int combine2(int value1, int value2, int hash) {
+    return combine(value2, combine(value1, hash));
+  }
+
+  static int combine2Finish(int value1, int value2, int hash) {
+    return finish(combine2(value1, value2, hash));
+  }
+
+  static int hash2(Object object1, Object object2) {
+    return combine2Finish(object2.hashCode, object2.hashCode, 0);
+  }
+
+  static int combineListHash(List list, [int hash = 1]) {
+    for (var item in list) {
+      hash = _Hash.combine(item.hashCode, hash);
+    }
+    return hash;
+  }
+
+  static int combineList(List<int> hashes, int hash) {
+    for (var item in hashes) {
+      hash = combine(item, hash);
+    }
+    return hash;
+  }
+
+  static int combineMapHashUnordered(Map map, [int hash = 2]) {
+    if (map == null || map.isEmpty) return hash;
+    List<int> entryHashes = List(map.length);
+    int i = 0;
+    for (var entry in map.entries) {
+      entryHashes[i++] = combine(entry.key.hashCode, entry.value.hashCode);
+    }
+    entryHashes.sort();
+    return combineList(entryHashes, hash);
+  }
+
+  // TODO(sra): Replace with '>>>'.
+  static int _shru(int v, int n) {
+    assert(n >= 1);
+    assert(intIs64Bit);
+    return ((v >> 1) & (0x7fffFFFFffffF000 + 0xFFF)) >> (n - 1);
+  }
+}
+
 int listHashCode(List list) {
-  return list.fold(0, (int value, Object item) => value ^ item.hashCode);
+  return _Hash.finish(_Hash.combineListHash(list));
 }
 
 int mapHashCode(Map map) {
-  int value = 0;
-  for (final Object x in map.keys) value ^= x.hashCode;
-  for (final Object x in map.values) value ^= x.hashCode;
-  return value;
+  return mapHashCodeUnordered(map);
+}
+
+int mapHashCodeOrdered(Map map, [int hash = 2]) {
+  for (final Object x in map.keys) hash = _Hash.combine(x.hashCode, hash);
+  for (final Object x in map.values) hash = _Hash.combine(x.hashCode, hash);
+  return _Hash.finish(hash);
+}
+
+int mapHashCodeUnordered(Map map) {
+  return _Hash.finish(_Hash.combineMapHashUnordered(map));
 }
 
 bool listEquals(List a, List b) {
diff --git a/pkg/kernel/lib/binary/ast_from_binary.dart b/pkg/kernel/lib/binary/ast_from_binary.dart
index f1996a9..aca0b12 100644
--- a/pkg/kernel/lib/binary/ast_from_binary.dart
+++ b/pkg/kernel/lib/binary/ast_from_binary.dart
@@ -820,6 +820,10 @@
     int flags = readByte();
     bool isExternal = (flags & Library.ExternalFlag) != 0;
     _isReadingLibraryImplementation = !isExternal;
+
+    int languageVersionMajor = readUInt();
+    int languageVersionMinor = readUInt();
+
     var canonicalName = readCanonicalNameReference();
     Reference reference = canonicalName.getReference();
     Library library = reference.node;
@@ -842,6 +846,7 @@
 
     if (shouldWriteData) {
       library.flags = flags;
+      library.setLanguageVersion(languageVersionMajor, languageVersionMinor);
       library.name = name;
       library.fileUri = fileUri;
       library.problemsAsJson = problemsAsJson;
@@ -1956,8 +1961,9 @@
     int tag = readByte();
     switch (tag) {
       case Tag.TypedefType:
-        return new TypedefType.byReference(
-            readTypedefReference(), readDartTypeList());
+        int nullabilityIndex = readByte();
+        return new TypedefType.byReference(readTypedefReference(),
+            readDartTypeList(), Nullability.values[nullabilityIndex]);
       case Tag.BottomType:
         return const BottomType();
       case Tag.InvalidType:
@@ -1967,13 +1973,16 @@
       case Tag.VoidType:
         return const VoidType();
       case Tag.InterfaceType:
-        return new InterfaceType.byReference(
-            readClassReference(), readDartTypeList());
+        int nullabilityIndex = readByte();
+        return new InterfaceType.byReference(readClassReference(),
+            readDartTypeList(), Nullability.values[nullabilityIndex]);
       case Tag.SimpleInterfaceType:
-        return new InterfaceType.byReference(
-            readClassReference(), const <DartType>[]);
+        int nullabilityIndex = readByte();
+        return new InterfaceType.byReference(readClassReference(),
+            const <DartType>[], Nullability.values[nullabilityIndex]);
       case Tag.FunctionType:
         int typeParameterStackHeight = typeParameterStack.length;
+        int nullabilityIndex = readByte();
         var typeParameters = readAndPushTypeParameterList();
         var requiredParameterCount = readUInt();
         var totalParameterCount = readUInt();
@@ -1987,15 +1996,20 @@
             typeParameters: typeParameters,
             requiredParameterCount: requiredParameterCount,
             namedParameters: named,
-            typedefType: typedefType);
+            typedefType: typedefType,
+            nullability: Nullability.values[nullabilityIndex]);
       case Tag.SimpleFunctionType:
+        int nullabilityIndex = readByte();
         var positional = readDartTypeList();
         var returnType = readDartType();
-        return new FunctionType(positional, returnType);
+        return new FunctionType(positional, returnType,
+            nullability: Nullability.values[nullabilityIndex]);
       case Tag.TypeParameterType:
+        int declaredNullabilityIndex = readByte();
         int index = readUInt();
         var bound = readDartTypeOption();
-        return new TypeParameterType(typeParameterStack[index], bound);
+        return new TypeParameterType(typeParameterStack[index], bound,
+            Nullability.values[declaredNullabilityIndex]);
       default:
         throw fail('unexpected dart type tag: $tag');
     }
diff --git a/pkg/kernel/lib/binary/ast_to_binary.dart b/pkg/kernel/lib/binary/ast_to_binary.dart
index 35337ea..8a5762b 100644
--- a/pkg/kernel/lib/binary/ast_to_binary.dart
+++ b/pkg/kernel/lib/binary/ast_to_binary.dart
@@ -912,6 +912,10 @@
     insideExternalLibrary = node.isExternal;
     libraryOffsets.add(getBufferOffset());
     writeByte(node.flags);
+
+    writeUInt30(node.languageVersionMajor);
+    writeUInt30(node.languageVersionMinor);
+
     writeNonNullCanonicalNameReference(getCanonicalNameOfLibrary(node));
     writeStringReference(node.name ?? '');
     writeUriReference(node.fileUri);
@@ -2002,9 +2006,11 @@
   void visitInterfaceType(InterfaceType node) {
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
+      writeByte(node.nullability.index);
       writeNonNullReference(node.className);
     } else {
       writeByte(Tag.InterfaceType);
+      writeByte(node.nullability.index);
       writeNonNullReference(node.className);
       writeNodeList(node.typeArguments);
     }
@@ -2012,11 +2018,17 @@
 
   @override
   void visitSupertype(Supertype node) {
+    // Writing nullability below is only necessary because
+    // BinaryBuilder.readSupertype reads the supertype as an InterfaceType and
+    // breaks it into components afterwards, and reading an InterfaceType
+    // requires the nullability byte.
     if (node.typeArguments.isEmpty) {
       writeByte(Tag.SimpleInterfaceType);
+      writeByte(Nullability.nonNullable.index);
       writeNonNullReference(node.className);
     } else {
       writeByte(Tag.InterfaceType);
+      writeByte(Nullability.nonNullable.index);
       writeNonNullReference(node.className);
       writeNodeList(node.typeArguments);
     }
@@ -2029,10 +2041,12 @@
         node.namedParameters.isEmpty &&
         node.typedefType == null) {
       writeByte(Tag.SimpleFunctionType);
+      writeByte(node.nullability.index);
       writeNodeList(node.positionalParameters);
       writeNode(node.returnType);
     } else {
       writeByte(Tag.FunctionType);
+      writeByte(node.nullability.index);
       enterScope(typeParameters: node.typeParameters);
       writeNodeList(node.typeParameters);
       writeUInt30(node.requiredParameterCount);
@@ -2055,6 +2069,7 @@
   @override
   void visitTypeParameterType(TypeParameterType node) {
     writeByte(Tag.TypeParameterType);
+    writeByte(node.declaredNullability.index);
     writeUInt30(_typeParameterIndexer[node.parameter]);
     writeOptionalNode(node.promotedBound);
   }
@@ -2062,6 +2077,7 @@
   @override
   void visitTypedefType(TypedefType node) {
     writeByte(Tag.TypedefType);
+    writeByte(node.nullability.index);
     writeNullAllowedReference(node.typedefReference);
     writeNodeList(node.typeArguments);
   }
diff --git a/pkg/kernel/lib/binary/tag.dart b/pkg/kernel/lib/binary/tag.dart
index 8e52b70..c84eba7 100644
--- a/pkg/kernel/lib/binary/tag.dart
+++ b/pkg/kernel/lib/binary/tag.dart
@@ -150,7 +150,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 = 25;
+  static const int BinaryFormatVersion = 28;
 }
 
 abstract class ConstantTag {
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index ed156b1..7be58d1 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -332,17 +332,18 @@
 class _ClosedWorldClassHierarchySubtypes implements ClassHierarchySubtypes {
   final ClosedWorldClassHierarchy hierarchy;
   final List<Class> _classesByTopDownIndex;
-  final Map<Class, _ClassInfoSubtype> _infoFor = <Class, _ClassInfoSubtype>{};
+  final Map<Class, _ClassInfoSubtype> _infoMap = <Class, _ClassInfoSubtype>{};
   bool invalidated = false;
 
   _ClosedWorldClassHierarchySubtypes(this.hierarchy)
-      : _classesByTopDownIndex = new List<Class>(hierarchy._infoFor.length) {
-    if (hierarchy._infoFor.isNotEmpty) {
-      for (Class class_ in hierarchy._infoFor.keys) {
-        _infoFor[class_] = new _ClassInfoSubtype(hierarchy._infoFor[class_]);
+      : _classesByTopDownIndex = new List<Class>(hierarchy._infoMap.length) {
+    hierarchy.allBetsOff = true;
+    if (hierarchy._infoMap.isNotEmpty) {
+      for (Class class_ in hierarchy._infoMap.keys) {
+        _infoMap[class_] = new _ClassInfoSubtype(hierarchy._infoMap[class_]);
       }
 
-      _topDownSortVisit(_infoFor[hierarchy._infoFor.keys.first]);
+      _topDownSortVisit(_infoMap[hierarchy._infoMap.keys.first]);
     }
   }
 
@@ -356,17 +357,17 @@
     _classesByTopDownIndex[index] = subInfo.classInfo.classNode;
     var subtypeSetBuilder = new _IntervalListBuilder()..addSingleton(index);
     for (_ClassInfo subtype in subInfo.classInfo.directExtenders) {
-      _ClassInfoSubtype subtypeInfo = _infoFor[subtype.classNode];
+      _ClassInfoSubtype subtypeInfo = _infoMap[subtype.classNode];
       _topDownSortVisit(subtypeInfo);
       subtypeSetBuilder.addIntervalList(subtypeInfo.subtypeIntervalList);
     }
     for (_ClassInfo subtype in subInfo.classInfo.directMixers) {
-      _ClassInfoSubtype subtypeInfo = _infoFor[subtype.classNode];
+      _ClassInfoSubtype subtypeInfo = _infoMap[subtype.classNode];
       _topDownSortVisit(subtypeInfo);
       subtypeSetBuilder.addIntervalList(subtypeInfo.subtypeIntervalList);
     }
     for (_ClassInfo subtype in subInfo.classInfo.directImplementers) {
-      _ClassInfoSubtype subtypeInfo = _infoFor[subtype.classNode];
+      _ClassInfoSubtype subtypeInfo = _infoMap[subtype.classNode];
       _topDownSortVisit(subtypeInfo);
       subtypeSetBuilder.addIntervalList(subtypeInfo.subtypeIntervalList);
     }
@@ -399,7 +400,7 @@
   ClassSet getSubtypesOf(Class class_) {
     if (invalidated) throw "This datastructure has been invalidated";
     Set<Class> result = new Set<Class>();
-    Uint32List list = _infoFor[class_].subtypeIntervalList;
+    Uint32List list = _infoMap[class_].subtypeIntervalList;
     for (int i = 0; i < list.length; i += 2) {
       int from = list[i];
       int to = list[i + 1];
@@ -433,17 +434,49 @@
   }
 
   /// The insert order is important.
-  final Map<Class, _ClassInfo> _infoFor =
+  final Map<Class, _ClassInfo> _infoMap =
       new LinkedHashMap<Class, _ClassInfo>();
+
+  _ClassInfo infoFor(Class c) {
+    _ClassInfo info = _infoMap[c];
+    info?.used = true;
+    return info;
+  }
+
+  List<Class> getUsedClasses() {
+    List<Class> result = new List<Class>();
+    for (_ClassInfo classInfo in _infoMap.values) {
+      if (classInfo.used) {
+        result.add(classInfo.classNode);
+      }
+    }
+    return result;
+  }
+
+  void resetUsed() {
+    for (_ClassInfo classInfo in _infoMap.values) {
+      classInfo.used = false;
+    }
+    allBetsOff = false;
+  }
+
   final Set<Library> knownLibraries = new Set<Library>();
+  bool allBetsOff = false;
 
   /// Recorded errors for classes we have already calculated the class hierarchy
   /// for, but will have to be reissued when re-using the calculation.
   final Map<Class, List<Supertype>> _recordedAmbiguousSupertypes =
       new LinkedHashMap<Class, List<Supertype>>();
 
-  Iterable<Class> get classes => _infoFor.keys;
-  int get numberOfClasses => _infoFor.length;
+  Iterable<Class> get classes {
+    allBetsOff = true;
+    return _infoMap.keys;
+  }
+
+  int get numberOfClasses {
+    allBetsOff = true;
+    return _infoMap.length;
+  }
 
   _ClosedWorldClassHierarchySubtypes _cachedClassHierarchySubtypes;
 
@@ -461,24 +494,25 @@
   @override
   Iterable<Class> getOrderedClasses(Iterable<Class> unordered) {
     var unorderedSet = unordered.toSet();
-    return _infoFor.keys.where(unorderedSet.contains);
+    for (Class c in unordered) _infoMap[c]?.used = true;
+    return _infoMap.keys.where(unorderedSet.contains);
   }
 
   @override
   bool isSubclassOf(Class subclass, Class superclass) {
     if (identical(subclass, superclass)) return true;
-    return _infoFor[subclass].isSubclassOf(_infoFor[superclass]);
+    return infoFor(subclass).isSubclassOf(infoFor(superclass));
   }
 
   @override
   bool isSubtypeOf(Class subtype, Class superclass) {
     if (identical(subtype, superclass)) return true;
-    return _infoFor[subtype].isSubtypeOf(_infoFor[superclass]);
+    return infoFor(subtype).isSubtypeOf(infoFor(superclass));
   }
 
   @override
   bool isUsedAsMixin(Class class_) {
-    return _infoFor[class_].directMixers.isNotEmpty;
+    return infoFor(class_).directMixers.isNotEmpty;
   }
 
   List<_ClassInfo> _getRankedSuperclassInfos(_ClassInfo info) {
@@ -494,7 +528,7 @@
       lastInfo = nextInfo;
       var classNode = nextInfo.classNode;
       void addToHeap(Supertype supertype) {
-        heap.add(_infoFor[supertype.classNode]);
+        heap.add(infoFor(supertype.classNode));
       }
 
       if (classNode.supertype != null) addToHeap(classNode.supertype);
@@ -526,8 +560,8 @@
 
     // Compute the list of superclasses for both types, with the above
     // optimization.
-    _ClassInfo info1 = _infoFor[type1.classNode];
-    _ClassInfo info2 = _infoFor[type2.classNode];
+    _ClassInfo info1 = infoFor(type1.classNode);
+    _ClassInfo info2 = infoFor(type2.classNode);
     List<_ClassInfo> classes1;
     List<_ClassInfo> classes2;
     if (identical(info1, info2) || info1.isSubtypeOf(info2)) {
@@ -603,11 +637,11 @@
   @override
   Supertype getClassAsInstanceOf(Class class_, Class superclass) {
     if (identical(class_, superclass)) return class_.asThisSupertype;
-    _ClassInfo info = _infoFor[class_];
+    _ClassInfo info = infoFor(class_);
     if (info == null) {
       throw "${class_.fileUri}: No class info for ${class_.name}";
     }
-    _ClassInfo superInfo = _infoFor[superclass];
+    _ClassInfo superInfo = infoFor(superclass);
     if (superInfo == null) {
       throw "${superclass.fileUri}: No class info for ${superclass.name}";
     }
@@ -626,7 +660,7 @@
 
   @override
   Member getDispatchTarget(Class class_, Name name, {bool setter: false}) {
-    _ClassInfo info = _infoFor[class_];
+    _ClassInfo info = infoFor(class_);
     List<Member> list =
         setter ? info.implementedSetters : info.implementedGettersAndCalls;
     return ClassHierarchy.findMemberByName(list, name);
@@ -634,7 +668,7 @@
 
   @override
   List<Member> getDispatchTargets(Class class_, {bool setters: false}) {
-    _ClassInfo info = _infoFor[class_];
+    _ClassInfo info = infoFor(class_);
     return setters ? info.implementedSetters : info.implementedGettersAndCalls;
   }
 
@@ -646,12 +680,12 @@
 
   @override
   List<Member> getInterfaceMembers(Class class_, {bool setters: false}) {
-    return _buildInterfaceMembers(class_, _infoFor[class_], setters: setters);
+    return _buildInterfaceMembers(class_, infoFor(class_), setters: setters);
   }
 
   @override
   List<Member> getDeclaredMembers(Class class_, {bool setters: false}) {
-    var info = _infoFor[class_];
+    var info = infoFor(class_);
     return setters ? info.declaredSetters : info.declaredGettersAndCalls;
   }
 
@@ -659,7 +693,7 @@
   void forEachOverridePair(Class class_,
       callback(Member declaredMember, Member interfaceMember, bool isSetter),
       {bool crossGettersSetters: false}) {
-    _ClassInfo info = _infoFor[class_];
+    _ClassInfo info = infoFor(class_);
     for (var supertype in class_.supers) {
       var superclass = supertype.classNode;
       var superGetters = getInterfaceMembers(superclass);
@@ -697,7 +731,7 @@
 
   @override
   List<Supertype> genericSupertypesOf(Class class_) {
-    final supertypes = _infoFor[class_].genericSuperTypes;
+    final supertypes = infoFor(class_).genericSuperTypes;
     if (supertypes == null) return const <Supertype>[];
     // Multiple supertypes can arise from ambiguous supertypes. The first
     // supertype is the real one; the others are purely informational.
@@ -712,18 +746,18 @@
     for (Library lib in removedLibraries) {
       if (!knownLibraries.contains(lib)) continue;
       for (Class class_ in lib.classes) {
-        _ClassInfo info = _infoFor[class_];
+        _ClassInfo info = _infoMap[class_];
         if (class_.supertype != null) {
-          _infoFor[class_.supertype.classNode]?.directExtenders?.remove(info);
+          _infoMap[class_.supertype.classNode]?.directExtenders?.remove(info);
         }
         if (class_.mixedInType != null) {
-          _infoFor[class_.mixedInType.classNode]?.directMixers?.remove(info);
+          _infoMap[class_.mixedInType.classNode]?.directMixers?.remove(info);
         }
         for (var supertype in class_.implementedTypes) {
-          _infoFor[supertype.classNode]?.directImplementers?.remove(info);
+          _infoMap[supertype.classNode]?.directImplementers?.remove(info);
         }
 
-        _infoFor.remove(class_);
+        _infoMap.remove(class_);
         _recordedAmbiguousSupertypes.remove(class_);
       }
       knownLibraries.remove(lib);
@@ -776,7 +810,7 @@
       Set<_ClassInfo> processedClasses = new Set<_ClassInfo>();
       List<_ClassInfo> worklist = <_ClassInfo>[];
       for (Class class_ in classes) {
-        _ClassInfo info = _infoFor[class_];
+        _ClassInfo info = infoFor(class_);
         worklist.add(info);
       }
 
@@ -791,7 +825,7 @@
       infos.addAll(processedClasses);
     } else {
       for (Class class_ in classes) {
-        _ClassInfo info = _infoFor[class_];
+        _ClassInfo info = infoFor(class_);
         infos.add(info);
       }
     }
@@ -816,11 +850,11 @@
   }
 
   bool sanityCheckAlsoKnowsParentAndLibrary() {
-    for (Class c in _infoFor.keys) {
+    for (Class c in _infoMap.keys) {
       if (!knownLibraries.contains(c.enclosingLibrary)) {
         throw new StateError("Didn't know library of $c (from ${c.fileUri})");
       }
-      if (c.supertype != null && _infoFor[c.supertype.classNode] == null) {
+      if (c.supertype != null && _infoMap[c.supertype.classNode] == null) {
         throw new StateError("Didn't know parent of $c (from ${c.fileUri})");
       }
     }
@@ -837,7 +871,7 @@
     if (type.classNode == superclass) {
       return superclass.asThisSupertype;
     }
-    var map = _infoFor[type.classNode]?.genericSuperTypes;
+    var map = infoFor(type.classNode)?.genericSuperTypes;
     return map == null ? null : map[superclass]?.first;
   }
 
@@ -850,7 +884,7 @@
       knownLibraries.add(library);
     }
 
-    _initializeTopologicallySortedClasses(_infoFor.keys, 0);
+    _initializeTopologicallySortedClasses(_infoMap.keys, 0);
   }
 
   /// - Build index of direct children.
@@ -864,15 +898,15 @@
       Iterable<Class> classes, int expectedStartingTopologicalIndex) {
     int i = expectedStartingTopologicalIndex;
     for (Class class_ in classes) {
-      _ClassInfo info = _infoFor[class_];
+      _ClassInfo info = _infoMap[class_];
       if (class_.supertype != null) {
-        _infoFor[class_.supertype.classNode].directExtenders.add(info);
+        _infoMap[class_.supertype.classNode].directExtenders.add(info);
       }
       if (class_.mixedInType != null) {
-        _infoFor[class_.mixedInType.classNode].directMixers.add(info);
+        _infoMap[class_.mixedInType.classNode].directMixers.add(info);
       }
       for (var supertype in class_.implementedTypes) {
-        _infoFor[supertype.classNode].directImplementers.add(info);
+        _infoMap[supertype.classNode].directImplementers.add(info);
       }
       _collectSupersForClass(class_);
 
@@ -909,7 +943,7 @@
   int _topSortIndex = 0;
   int _topologicalSortVisit(Class classNode, Set<Class> beingVisited,
       {List<Class> orderedList}) {
-    var info = _infoFor[classNode];
+    var info = _infoMap[classNode];
     if (info != null) {
       return info.depth;
     }
@@ -943,7 +977,7 @@
     _buildImplementedMembers(classNode, info);
     info.topologicalIndex = _topSortIndex++;
 
-    _infoFor[classNode] = info;
+    _infoMap[classNode] = info;
     orderedList?.add(classNode);
     beingVisited.remove(classNode);
     return info.depth = superDepth + 1;
@@ -951,7 +985,7 @@
 
   void _buildDeclaredMembers(Class classNode, _ClassInfo info) {
     if (classNode.mixedInType != null) {
-      _ClassInfo mixedInfo = _infoFor[classNode.mixedInType.classNode];
+      _ClassInfo mixedInfo = _infoMap[classNode.mixedInType.classNode];
 
       List<Member> declaredGettersAndCalls = <Member>[];
       for (Member mixinMember in mixedInfo.declaredGettersAndCalls) {
@@ -1004,7 +1038,7 @@
     if (classNode.supertype == null) {
       inheritedMembers = inheritedSetters = const <Member>[];
     } else {
-      _ClassInfo superInfo = _infoFor[classNode.supertype.classNode];
+      _ClassInfo superInfo = _infoMap[classNode.supertype.classNode];
       inheritedMembers = superInfo.implementedGettersAndCalls;
       inheritedSetters = superInfo.implementedSetters;
     }
@@ -1030,7 +1064,7 @@
     void inheritFrom(Supertype type) {
       if (type == null) return;
       List<Member> inherited = _buildInterfaceMembers(
-          type.classNode, _infoFor[type.classNode],
+          type.classNode, _infoMap[type.classNode],
           setters: setters);
       inherited = _getUnshadowedInheritedMembers(declared, inherited);
       allInheritedMembers =
@@ -1136,7 +1170,7 @@
   }
 
   void _recordSuperTypes(_ClassInfo subInfo, Supertype supertype) {
-    _ClassInfo superInfo = _infoFor[supertype.classNode];
+    _ClassInfo superInfo = _infoMap[supertype.classNode];
     if (supertype.typeArguments.isEmpty) {
       if (superInfo.genericSuperTypes == null) return;
       // Copy over the super type entries.
@@ -1169,7 +1203,7 @@
   /// Note that the super class and super types of the class must already have
   /// had their supers collected.
   void _collectSupersForClass(Class class_) {
-    _ClassInfo info = _infoFor[class_];
+    _ClassInfo info = _infoMap[class_];
 
     var superclassSetBuilder = new _IntervalListBuilder()
       ..addSingleton(info.topologicalIndex);
@@ -1177,20 +1211,20 @@
       ..addSingleton(info.topologicalIndex);
 
     if (class_.supertype != null) {
-      _ClassInfo supertypeInfo = _infoFor[class_.supertype.classNode];
+      _ClassInfo supertypeInfo = _infoMap[class_.supertype.classNode];
       superclassSetBuilder
           .addIntervalList(supertypeInfo.superclassIntervalList);
       supertypeSetBuilder.addIntervalList(supertypeInfo.supertypeIntervalList);
     }
 
     if (class_.mixedInType != null) {
-      _ClassInfo mixedInTypeInfo = _infoFor[class_.mixedInType.classNode];
+      _ClassInfo mixedInTypeInfo = _infoMap[class_.mixedInType.classNode];
       supertypeSetBuilder
           .addIntervalList(mixedInTypeInfo.supertypeIntervalList);
     }
 
     for (Supertype supertype in class_.implementedTypes) {
-      _ClassInfo supertypeInfo = _infoFor[supertype.classNode];
+      _ClassInfo supertypeInfo = _infoMap[supertype.classNode];
       supertypeSetBuilder.addIntervalList(supertypeInfo.supertypeIntervalList);
     }
 
@@ -1205,8 +1239,8 @@
   /// internal data structure is.
   List<int> getExpenseHistogram() {
     var result = <int>[];
-    for (Class class_ in _infoFor.keys) {
-      var info = _infoFor[class_];
+    for (Class class_ in _infoMap.keys) {
+      var info = _infoMap[class_];
       int intervals = info.supertypeIntervalList.length ~/ 2;
       if (intervals >= result.length) {
         int oldLength = result.length;
@@ -1226,8 +1260,8 @@
   double getCompressionRatio() {
     int intervals = 0;
     int sizes = 0;
-    for (Class class_ in _infoFor.keys) {
-      var info = _infoFor[class_];
+    for (Class class_ in _infoMap.keys) {
+      var info = _infoMap[class_];
       intervals += (info.superclassIntervalList.length +
               info.supertypeIntervalList.length) ~/
           2;
@@ -1241,8 +1275,8 @@
   /// Returns the number of entries in hash tables storing hierarchy data.
   int getSuperTypeHashTableSize() {
     int sum = 0;
-    for (Class class_ in _infoFor.keys) {
-      sum += _infoFor[class_].genericSuperTypes?.length ?? 0;
+    for (Class class_ in _infoMap.keys) {
+      sum += _infoMap[class_].genericSuperTypes?.length ?? 0;
     }
     return sum;
   }
@@ -1334,6 +1368,7 @@
 }
 
 class _ClassInfo {
+  bool used = false;
   final Class classNode;
   int topologicalIndex = 0;
   int depth = 0;
diff --git a/pkg/kernel/lib/target/targets.dart b/pkg/kernel/lib/target/targets.dart
index c5c5363..6b88491 100644
--- a/pkg/kernel/lib/target/targets.dart
+++ b/pkg/kernel/lib/target/targets.dart
@@ -66,6 +66,15 @@
   /// This method must be deterministic, i.e. it must always return the same
   /// value for the same constant value and place in the AST.
   bool shouldInlineConstant(ConstantExpression initializer) => true;
+
+  /// Whether this target supports unevaluated constants.
+  ///
+  /// If not, then trying to perform constant evaluation without an environment
+  /// raises an exception.
+  ///
+  /// This defaults to `false` since it requires additional work for a backend
+  /// to support unevaluated constants.
+  bool get supportsUnevaluatedConstants => false;
 }
 
 /// A target provides backend-specific options for generating kernel IR.
@@ -140,6 +149,9 @@
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<Library> libraries,
+      // TODO(askesc): Consider how to generally pass compiler options to
+      // transformations.
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)});
 
@@ -197,7 +209,7 @@
   /// literals are not supported by the target, they will be desugared into
   /// explicit `Set` creation (for non-const set literals) or wrapped map
   /// literals (for const set literals).
-  bool get supportsSetLiterals => false;
+  bool get supportsSetLiterals => true;
 
   /// Builds an expression that instantiates an [Invocation] that can be passed
   /// to [noSuchMethod].
@@ -235,6 +247,13 @@
   ConstantsBackend constantsBackend(CoreTypes coreTypes);
 }
 
+class NoneConstantsBackend extends ConstantsBackend {
+  @override
+  final bool supportsUnevaluatedConstants;
+
+  const NoneConstantsBackend({this.supportsUnevaluatedConstants});
+}
+
 class NoneTarget extends Target {
   final TargetFlags flags;
 
@@ -248,6 +267,7 @@
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<Library> libraries,
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)}) {}
 
@@ -275,5 +295,6 @@
 
   @override
   ConstantsBackend constantsBackend(CoreTypes coreTypes) =>
-      const ConstantsBackend();
+      // TODO(johnniwinther): Should this vary with the use case?
+      const NoneConstantsBackend(supportsUnevaluatedConstants: true);
 }
diff --git a/pkg/kernel/lib/text/ast_to_text.dart b/pkg/kernel/lib/text/ast_to_text.dart
index 4578819..eef51ff 100644
--- a/pkg/kernel/lib/text/ast_to_text.dart
+++ b/pkg/kernel/lib/text/ast_to_text.dart
@@ -817,7 +817,10 @@
       writeSymbol('}');
     }
     writeSymbol(')');
-    writeSpaced('→');
+    ensureSpace();
+    write('→');
+    writeNullability(node.nullability);
+    writeSpace();
     writeType(node.returnType);
   }
 
@@ -1303,19 +1306,20 @@
   }
 
   visitInstanceCreation(InstanceCreation node) {
-    write('${node.classNode}');
+    writeClassReferenceFromReference(node.classReference);
     if (node.typeArguments.isNotEmpty) {
       writeSymbol('<');
       writeList(node.typeArguments, writeType);
       writeSymbol('>');
     }
-    write(' {');
+    writeSymbol('{');
     bool first = true;
     node.fieldValues.forEach((Reference fieldRef, Expression value) {
       if (!first) {
         writeComma();
       }
-      write('${fieldRef.asField.name}: ');
+      writeWord('${fieldRef.asField.name.name}');
+      writeSymbol(':');
       writeExpression(value);
       first = false;
     });
@@ -1339,8 +1343,7 @@
       writeExpression(unusedArgument);
       first = false;
     }
-
-    write('}');
+    writeSymbol('}');
   }
 
   visitIsExpression(IsExpression node) {
@@ -1946,6 +1949,22 @@
     endLine(': ${node.runtimeType}');
   }
 
+  writeNullability(Nullability nullability) {
+    switch (nullability) {
+      case Nullability.legacy:
+        writeSymbol('*');
+        state = WORD; // Disallow a word immediately after the '*'.
+        break;
+      case Nullability.nullable:
+        writeSymbol('?'); // Disallow a word immediately after the '?'.
+        break;
+      case Nullability.neither:
+      case Nullability.nonNullable:
+        // Do nothing.
+        break;
+    }
+  }
+
   visitInvalidType(InvalidType node) {
     writeWord('invalid-type');
   }
@@ -1966,6 +1985,7 @@
       writeSymbol('>');
       state = WORD; // Disallow a word immediately after the '>'.
     }
+    writeNullability(node.nullability);
   }
 
   visitFunctionType(FunctionType node) {
@@ -1981,6 +2001,7 @@
 
   visitTypeParameterType(TypeParameterType node) {
     writeTypeParameterReference(node.parameter);
+    writeNullability(node.nullability);
     if (node.promotedBound != null) {
       writeSpace();
       writeWord('extends');
@@ -2001,79 +2022,116 @@
     }
   }
 
+  void writeConstantReference(Constant node) {
+    writeWord(syntheticNames.nameConstant(node));
+  }
+
   visitConstantExpression(ConstantExpression node) {
-    writeWord(syntheticNames.nameConstant(node.constant));
+    writeConstantReference(node.constant);
   }
 
   defaultConstant(Constant node) {
-    final String name = syntheticNames.nameConstant(node);
-    endLine('  $name = $node');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    endLine('$node');
   }
 
   visitListConstant(ListConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    write('  $name = ');
-    final String entries = node.entries.map((Constant constant) {
-      return syntheticNames.nameConstant(constant);
-    }).join(', ');
-    endLine('${node.runtimeType}<${node.typeArgument}>($entries)');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeSymbol('<');
+    writeType(node.typeArgument);
+    writeSymbol('>[');
+    writeList(node.entries, writeConstantReference);
+    endLine(']');
   }
 
   visitSetConstant(SetConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    write('  $name = ');
-    final String entries = node.entries.map((Constant constant) {
-      return syntheticNames.nameConstant(constant);
-    }).join(', ');
-    endLine('${node.runtimeType}<${node.typeArgument}>($entries)');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeSymbol('<');
+    writeType(node.typeArgument);
+    writeSymbol('>{');
+    writeList(node.entries, writeConstantReference);
+    endLine('}');
   }
 
   visitMapConstant(MapConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    write('  $name = ');
-    final String entries = node.entries.map((ConstantMapEntry entry) {
-      final String key = syntheticNames.nameConstant(entry.key);
-      final String value = syntheticNames.nameConstant(entry.value);
-      return '$key: $value';
-    }).join(', ');
-    endLine(
-        '${node.runtimeType}<${node.keyType}, ${node.valueType}>($entries)');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeSymbol('<');
+    writeList([node.keyType, node.valueType], writeType);
+    writeSymbol('>{');
+    writeList(node.entries, (entry) {
+      writeConstantReference(entry.key);
+      writeSymbol(':');
+      writeConstantReference(entry.value);
+    });
+    endLine(')');
   }
 
   visitInstanceConstant(InstanceConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    write('  $name = ');
-    final sb = new StringBuffer();
-    sb.write('${node.classNode}');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeClassReferenceFromReference(node.classReference);
     if (!node.classNode.typeParameters.isEmpty) {
-      sb.write('<');
-      sb.write(node.typeArguments.map((type) => type.toString()).join(', '));
-      sb.write('>');
+      writeSymbol('<');
+      writeList(node.typeArguments, writeType);
+      writeSymbol('>');
     }
-    sb.write(' {');
-    bool first = true;
-    node.fieldValues.forEach((Reference fieldRef, Constant constant) {
-      final String name = syntheticNames.nameConstant(constant);
-      if (!first) {
-        sb.write(', ');
-      }
-      sb.write('${fieldRef.asField.name}: $name');
-      first = false;
+    writeSymbol(' {');
+    writeList(node.fieldValues.entries, (entry) {
+      writeWord('${entry.key.asField.name.name}');
+      writeSymbol(':');
+      writeConstantReference(entry.value);
     });
-    sb.write('}');
-    endLine(sb.toString());
+    endLine('}');
+  }
+
+  visitPartialInstantiationConstant(PartialInstantiationConstant node) {
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeWord('partial-instantiation');
+    writeSpace();
+    writeMemberReferenceFromReference(node.tearOffConstant.procedureReference);
+    writeSpace();
+    writeSymbol('<');
+    writeList(node.types, writeType);
+    writeSymbol('>');
+    endLine();
   }
 
   visitStringConstant(StringConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    endLine('  $name = "${escapeString(node.value)}"');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    endLine('"${escapeString(node.value)}"');
+  }
+
+  visitTearOffConstant(TearOffConstant node) {
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeWord('tearoff');
+    writeSpace();
+    writeMemberReferenceFromReference(node.procedureReference);
+    endLine();
   }
 
   visitUnevaluatedConstant(UnevaluatedConstant node) {
-    final String name = syntheticNames.nameConstant(node);
-    write('  $name = (');
+    writeIndentation();
+    writeConstantReference(node);
+    writeSpaced('=');
+    writeSymbol('eval');
+    writeSpace();
     writeExpression(node.expression);
-    endLine(')');
+    endLine();
   }
 
   defaultNode(Node node) {
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/kernel/lib/transformations/continuation.dart
index 8cb5c3f..a45f713 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/kernel/lib/transformations/continuation.dart
@@ -24,22 +24,25 @@
   static String stackTraceVar(int depth) => ':stack_trace$depth';
 }
 
-void transformLibraries(CoreTypes coreTypes, List<Library> libraries) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes);
+void transformLibraries(CoreTypes coreTypes, List<Library> libraries,
+    {bool productMode}) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, productMode);
   var rewriter = new RecursiveContinuationRewriter(helper);
   for (var library in libraries) {
     rewriter.rewriteLibrary(library);
   }
 }
 
-Component transformComponent(CoreTypes coreTypes, Component component) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes);
+Component transformComponent(CoreTypes coreTypes, Component component,
+    {bool productMode}) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, productMode);
   var rewriter = new RecursiveContinuationRewriter(helper);
   return rewriter.rewriteComponent(component);
 }
 
-Procedure transformProcedure(CoreTypes coreTypes, Procedure procedure) {
-  var helper = new HelperNodes.fromCoreTypes(coreTypes);
+Procedure transformProcedure(CoreTypes coreTypes, Procedure procedure,
+    {bool productMode}) {
+  var helper = new HelperNodes.fromCoreTypes(coreTypes, productMode);
   var rewriter = new RecursiveContinuationRewriter(helper);
   return rewriter.visitProcedure(procedure);
 }
@@ -694,17 +697,31 @@
       //
       //   await for (T variable in <stream-expression>) { ... }
       //
-      // To:
+      // To (in product mode):
       //
       //   {
       //     :stream = <stream-expression>;
       //     _asyncStarListenHelper(:stream, :async_op);
       //     _StreamIterator<T> :for-iterator = new _StreamIterator<T>(:stream);
-      //     const bool :product-mode =
-      //         const bool.fromEnvironment("dart.vm.product");
       //     try {
-      //       while (let _ = :product-mode ?
-      //           null : _asyncStarMoveNextHelper(:stream) in
+      //       while (await :for-iterator.moveNext()) {
+      //         T <variable> = :for-iterator.current;
+      //         ...
+      //       }
+      //     } finally {
+      //       if (:for-iterator._subscription != null)
+      //           await :for-iterator.cancel();
+      //     }
+      //   }
+      //
+      // Or (in non-product mode):
+      //
+      //   {
+      //     :stream = <stream-expression>;
+      //     _asyncStarListenHelper(:stream, :async_op);
+      //     _StreamIterator<T> :for-iterator = new _StreamIterator<T>(:stream);
+      //     try {
+      //       while (let _ = _asyncStarMoveNextHelper(:stream) in
       //           await :for-iterator.moveNext()) {
       //         T <variable> = :for-iterator.current;
       //         ...
@@ -734,15 +751,6 @@
           type: new InterfaceType(
               helper.streamIteratorClass, [valueVariable.type]));
 
-      // const bool :product-mode =
-      //    const bool.fromEnvironment("dart.vm.product");
-      var productMode = new VariableDeclaration(':product-mode',
-          isConst: true,
-          type: new InterfaceType(helper.boolClass),
-          initializer: new StaticInvocation(helper.boolFromEnvironment,
-              new Arguments([new StringLiteral("dart.vm.product")]),
-              isConst: true));
-
       // await :for-iterator.moveNext()
       var condition = new AwaitExpression(new MethodInvocation(
           new VariableGet(iteratorVariable),
@@ -751,21 +759,21 @@
           helper.streamIteratorMoveNext))
         ..fileOffset = stmt.fileOffset;
 
-      // _asyncStarMoveNextHelper(:stream)
-      var asyncStarMoveNextCall = new StaticInvocation(
-          helper.asyncStarMoveNextHelper,
-          new Arguments([new VariableGet(streamVariable)]))
-        ..fileOffset = stmt.fileOffset;
+      Expression whileCondition;
+      if (helper.productMode) {
+        whileCondition = condition;
+      } else {
+        // _asyncStarMoveNextHelper(:stream)
+        var asyncStarMoveNextCall = new StaticInvocation(
+            helper.asyncStarMoveNextHelper,
+            new Arguments([new VariableGet(streamVariable)]))
+          ..fileOffset = stmt.fileOffset;
 
-      // let _ = :product-mode ? null : asyncStarMoveNextCall in (condition)
-      var whileCondition = new Let(
-          new VariableDeclaration(null,
-              initializer: new ConditionalExpression(
-                  new VariableGet(productMode),
-                  new NullLiteral(),
-                  asyncStarMoveNextCall,
-                  new DynamicType())),
-          condition);
+        // let _ = asyncStarMoveNextCall in (condition)
+        whileCondition = new Let(
+            new VariableDeclaration(null, initializer: asyncStarMoveNextCall),
+            condition);
+      }
 
       // T <variable> = :for-iterator.current;
       valueVariable.initializer = new PropertyGet(
@@ -801,7 +809,6 @@
         streamVariable,
         asyncStarListenHelper,
         iteratorVariable,
-        productMode,
         tryFinally
       ]);
       block.accept(this);
@@ -1141,7 +1148,8 @@
   final Member syncIteratorCurrent;
   final Member syncIteratorYieldEachIterable;
   final Class boolClass;
-  final Member boolFromEnvironment;
+
+  bool productMode;
 
   HelperNodes._(
       this.asyncErrorWrapper,
@@ -1179,9 +1187,9 @@
       this.syncIteratorCurrent,
       this.syncIteratorYieldEachIterable,
       this.boolClass,
-      this.boolFromEnvironment);
+      this.productMode);
 
-  factory HelperNodes.fromCoreTypes(CoreTypes coreTypes) {
+  factory HelperNodes.fromCoreTypes(CoreTypes coreTypes, bool productMode) {
     return new HelperNodes._(
         coreTypes.asyncErrorWrapperHelperProcedure,
         coreTypes.asyncLibrary,
@@ -1218,6 +1226,6 @@
         coreTypes.syncIteratorCurrent,
         coreTypes.syncIteratorYieldEachIterable,
         coreTypes.boolClass,
-        coreTypes.boolFromEnvironment);
+        productMode);
   }
 }
diff --git a/pkg/kernel/lib/verifier.dart b/pkg/kernel/lib/verifier.dart
index 39ee540..1bfcb8b 100644
--- a/pkg/kernel/lib/verifier.dart
+++ b/pkg/kernel/lib/verifier.dart
@@ -43,7 +43,7 @@
 /// Checks that a kernel component is well-formed.
 ///
 /// This does not include any kind of type checking.
-class VerifyingVisitor extends RecursiveVisitor {
+class VerifyingVisitor extends RecursiveVisitor<void> {
   final Set<Class> classes = new Set<Class>();
   final Set<Typedef> typedefs = new Set<Typedef>();
   Set<TypeParameter> typeParametersInScope = new Set<TypeParameter>();
diff --git a/pkg/kernel/lib/visitor.dart b/pkg/kernel/lib/visitor.dart
index b1a9938..e016e0a 100644
--- a/pkg/kernel/lib/visitor.dart
+++ b/pkg/kernel/lib/visitor.dart
@@ -4,6 +4,7 @@
 library kernel.ast.visitor;
 
 import 'dart:core' hide MapEntry;
+import 'dart:collection';
 
 import 'ast.dart';
 
@@ -289,6 +290,14 @@
   R visitTypedefType(TypedefType node, T arg) => defaultDartType(node, arg);
 }
 
+/// Visitor for [Constant] nodes.
+///
+/// Note: Constant nodes are _not_ trees but directed acyclic graphs. This
+/// means that visiting a constant node without tracking which subnodes that
+/// have already been visited might lead to exponential running times.
+///
+/// Use [ComputeOnceConstantVisitor] or [VisitOnceConstantVisitor] to visit
+/// a constant node while ensuring each subnode is only visited once.
 class ConstantVisitor<R> {
   const ConstantVisitor();
 
@@ -311,6 +320,167 @@
   R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
 }
 
+abstract class _ConstantCallback<R> {
+  R defaultConstant(Constant node);
+
+  R visitNullConstant(NullConstant node);
+  R visitBoolConstant(BoolConstant node);
+  R visitIntConstant(IntConstant node);
+  R visitDoubleConstant(DoubleConstant node);
+  R visitStringConstant(StringConstant node);
+  R visitSymbolConstant(SymbolConstant node);
+  R visitMapConstant(MapConstant node);
+  R visitListConstant(ListConstant node);
+  R visitSetConstant(SetConstant node);
+  R visitInstanceConstant(InstanceConstant node);
+  R visitPartialInstantiationConstant(PartialInstantiationConstant node);
+  R visitTearOffConstant(TearOffConstant node);
+  R visitTypeLiteralConstant(TypeLiteralConstant node);
+  R visitUnevaluatedConstant(UnevaluatedConstant node);
+}
+
+class _ConstantCallbackVisitor<R> implements ConstantVisitor<R> {
+  final _ConstantCallback _callback;
+
+  _ConstantCallbackVisitor(this._callback);
+
+  @override
+  R visitUnevaluatedConstant(UnevaluatedConstant node) =>
+      _callback.visitUnevaluatedConstant(node);
+
+  @override
+  R visitTypeLiteralConstant(TypeLiteralConstant node) =>
+      _callback.visitTypeLiteralConstant(node);
+
+  @override
+  R visitTearOffConstant(TearOffConstant node) =>
+      _callback.visitTearOffConstant(node);
+
+  @override
+  R visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
+      _callback.visitPartialInstantiationConstant(node);
+
+  @override
+  R visitInstanceConstant(InstanceConstant node) =>
+      _callback.visitInstanceConstant(node);
+
+  @override
+  R visitSetConstant(SetConstant node) => _callback.visitSetConstant(node);
+
+  @override
+  R visitListConstant(ListConstant node) => _callback.visitListConstant(node);
+
+  @override
+  R visitMapConstant(MapConstant node) => _callback.visitMapConstant(node);
+
+  @override
+  R visitSymbolConstant(SymbolConstant node) =>
+      _callback.visitSymbolConstant(node);
+
+  @override
+  R visitStringConstant(StringConstant node) =>
+      _callback.visitStringConstant(node);
+
+  @override
+  R visitDoubleConstant(DoubleConstant node) =>
+      _callback.visitDoubleConstant(node);
+
+  @override
+  R visitIntConstant(IntConstant node) => _callback.visitIntConstant(node);
+
+  @override
+  R visitBoolConstant(BoolConstant node) => _callback.visitBoolConstant(node);
+
+  @override
+  R visitNullConstant(NullConstant node) => _callback.visitNullConstant(node);
+
+  @override
+  R defaultConstant(Constant node) => _callback.defaultConstant(node);
+}
+
+/// Visitor-like class used for visiting a [Constant] node while computing a
+/// value for each subnode. The visitor caches the computed values ensuring that
+/// each subnode is only visited once.
+class ComputeOnceConstantVisitor<R> implements _ConstantCallback<R> {
+  _ConstantCallbackVisitor _visitor;
+  Map<Constant, R> cache = new LinkedHashMap.identity();
+
+  ComputeOnceConstantVisitor() {
+    _visitor = new _ConstantCallbackVisitor<R>(this);
+  }
+
+  /// Visits [node] if not already visited to compute a value for [node].
+  ///
+  /// If the value has already been computed the cached value is returned immediately.
+  ///
+  /// Call this method to compute values for subnodes recursively, while only
+  /// visiting each subnode once.
+  R visitConstant(Constant node) {
+    return cache[node] ??= node.accept(_visitor);
+  }
+
+  R defaultConstant(Constant node) => null;
+
+  R visitNullConstant(NullConstant node) => defaultConstant(node);
+  R visitBoolConstant(BoolConstant node) => defaultConstant(node);
+  R visitIntConstant(IntConstant node) => defaultConstant(node);
+  R visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
+  R visitStringConstant(StringConstant node) => defaultConstant(node);
+  R visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
+  R visitMapConstant(MapConstant node) => defaultConstant(node);
+  R visitListConstant(ListConstant node) => defaultConstant(node);
+  R visitSetConstant(SetConstant node) => defaultConstant(node);
+  R visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
+  R visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
+      defaultConstant(node);
+  R visitTearOffConstant(TearOffConstant node) => defaultConstant(node);
+  R visitTypeLiteralConstant(TypeLiteralConstant node) => defaultConstant(node);
+  R visitUnevaluatedConstant(UnevaluatedConstant node) => defaultConstant(node);
+}
+
+/// Visitor-like class used for visiting each subnode of a [Constant] node once.
+///
+/// The visitor records the visited node to ensure that each subnode is only
+/// visited once.
+class VisitOnceConstantVisitor implements _ConstantCallback<void> {
+  _ConstantCallbackVisitor<void> _visitor;
+  Set<Constant> cache = new LinkedHashSet.identity();
+
+  VisitOnceConstantVisitor() {
+    _visitor = new _ConstantCallbackVisitor<void>(this);
+  }
+
+  /// Visits [node] if not already visited.
+  ///
+  /// Call this method to visit subnodes recursively, while only visiting each
+  /// subnode once.
+  void visitConstant(Constant node) {
+    if (cache.add(node)) {
+      node.accept(_visitor);
+    }
+  }
+
+  void defaultConstant(Constant node) => null;
+
+  void visitNullConstant(NullConstant node) => defaultConstant(node);
+  void visitBoolConstant(BoolConstant node) => defaultConstant(node);
+  void visitIntConstant(IntConstant node) => defaultConstant(node);
+  void visitDoubleConstant(DoubleConstant node) => defaultConstant(node);
+  void visitStringConstant(StringConstant node) => defaultConstant(node);
+  void visitSymbolConstant(SymbolConstant node) => defaultConstant(node);
+  void visitMapConstant(MapConstant node) => defaultConstant(node);
+  void visitListConstant(ListConstant node) => defaultConstant(node);
+  void visitSetConstant(SetConstant node) => defaultConstant(node);
+  void visitInstanceConstant(InstanceConstant node) => defaultConstant(node);
+  void visitPartialInstantiationConstant(PartialInstantiationConstant node) =>
+      defaultConstant(node);
+  void visitTearOffConstant(TearOffConstant node) => defaultConstant(node);
+  void visitTypeLiteralConstant(TypeLiteralConstant node) =>
+      defaultConstant(node);
+  void visitUnevaluatedConstant(UnevaluatedConstant node) =>
+      defaultConstant(node);
+}
+
 class MemberReferenceVisitor<R> {
   const MemberReferenceVisitor();
 
diff --git a/pkg/kernel/pubspec.yaml b/pkg/kernel/pubspec.yaml
index 0365260..397b746 100644
--- a/pkg/kernel/pubspec.yaml
+++ b/pkg/kernel/pubspec.yaml
@@ -6,7 +6,7 @@
 description: Dart IR (Intermediate Representation)
 homepage: https://github.com/dart-lang/sdk/tree/master/pkg/kernel
 environment:
-  sdk: '>=2.0.0-dev.48.0 <3.0.0'
+  sdk: '>=2.2.2 <3.0.0'
 dependencies:
   args: '>=0.13.4 <2.0.0'
 dev_dependencies:
diff --git a/pkg/kernel/test/class_hierarchy_test.dart b/pkg/kernel/test/class_hierarchy_test.dart
index 469b603..6253f4d 100644
--- a/pkg/kernel/test/class_hierarchy_test.dart
+++ b/pkg/kernel/test/class_hierarchy_test.dart
@@ -536,9 +536,9 @@
     var c = addClass(new Class(name: 'C', supertype: new Supertype(b, [int])));
 
     _assertTestLibraryText('''
-class A<T, U> {}
-class B<T> extends self::A<self::B::T, core::bool> {}
-class C extends self::B<core::int> {}
+class A<T*, U*> {}
+class B<T*> extends self::A<self::B::T*, core::bool*> {}
+class C extends self::B<core::int*> {}
 ''');
 
     expect(hierarchy.getClassAsInstanceOf(a, objectClass), objectSuper);
@@ -570,9 +570,9 @@
     ]));
 
     _assertTestLibraryText('''
-class A<T, U> {}
-class B<T> implements self::A<self::B::T, core::bool> {}
-class C implements self::B<core::int> {}
+class A<T*, U*> {}
+class B<T*> implements self::A<self::B::T*, core::bool*> {}
+class C implements self::B<core::int*> {}
 ''');
 
     expect(hierarchy.getClassAsInstanceOf(a, objectClass), objectSuper);
@@ -602,9 +602,9 @@
         mixedInType: new Supertype(b, [int])));
 
     _assertTestLibraryText('''
-class A<T, U> {}
-class B<T> = core::Object with self::A<self::B::T, core::bool> {}
-class C = core::Object with self::B<core::int> {}
+class A<T*, U*> {}
+class B<T*> = core::Object with self::A<self::B::T*, core::bool*> {}
+class C = core::Object with self::B<core::int*> {}
 ''');
 
     expect(hierarchy.getClassAsInstanceOf(a, objectClass), objectSuper);
@@ -1208,8 +1208,8 @@
         supertype: new Supertype(a, [bTT, bool])));
 
     _assertTestLibraryText('''
-class A<T, U> {}
-class B<T> extends self::A<self::B::T, core::bool> {}
+class A<T*, U*> {}
+class B<T*> extends self::A<self::B::T*, core::bool*> {}
 ''');
 
     var b_int = new InterfaceType(b, [int]);
diff --git a/pkg/kernel/test/verify_test.dart b/pkg/kernel/test/verify_test.dart
index 5286c82..affbf9f 100644
--- a/pkg/kernel/test/verify_test.dart
+++ b/pkg/kernel/test/verify_test.dart
@@ -146,13 +146,13 @@
   });
   negativeTest(
       'Interface type arity too low',
-      "Type test_lib::OtherClass provides 0 type arguments"
+      "Type test_lib::OtherClass* provides 0 type arguments"
       " but the class declares 1 parameters.", (TestHarness test) {
     test.addNode(TypeLiteral(new InterfaceType(test.otherClass, [])));
   });
   negativeTest(
       'Interface type arity too high',
-      "Type test_lib::OtherClass<dynamic, dynamic> provides 2 type arguments"
+      "Type test_lib::OtherClass<dynamic, dynamic>* provides 2 type arguments"
       " but the class declares 1 parameters.", (TestHarness test) {
     test.addNode(TypeLiteral(new InterfaceType(
         test.otherClass, [new DynamicType(), new DynamicType()])));
@@ -316,7 +316,7 @@
   });
   negativeTest(
       'Invalid typedef Foo = `(Foo) => void`',
-      "The typedef 'typedef Foo = (test_lib::Foo) → void;\n'"
+      "The typedef 'typedef Foo = (test_lib::Foo) →* void;\n'"
       " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
     typedef_.type =
@@ -325,7 +325,7 @@
   });
   negativeTest(
       'Invalid typedef Foo = `() => Foo`',
-      "The typedef 'typedef Foo = () → test_lib::Foo;\n'"
+      "The typedef 'typedef Foo = () →* test_lib::Foo;\n'"
       " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
     typedef_.type = new FunctionType([], new TypedefType(typedef_));
@@ -333,7 +333,7 @@
   });
   negativeTest(
       'Invalid typedef Foo = C<Foo>',
-      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Foo>;\n'"
+      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Foo>*;\n'"
       " refers to itself", (TestHarness test) {
     var typedef_ = new Typedef('Foo', null);
     typedef_.type =
@@ -364,7 +364,7 @@
   });
   negativeTest(
       'Invalid typedefs Foo = C<Bar>, Bar = C<Foo>',
-      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Bar>;\n'"
+      "The typedef 'typedef Foo = test_lib::OtherClass<test_lib::Bar>*;\n'"
       " refers to itself", (TestHarness test) {
     var foo = new Typedef('Foo', null);
     var bar = new Typedef('Bar', null);
@@ -426,7 +426,7 @@
   });
   negativeTest(
       'Invalid typedefs Foo<T extends Bar<T>>, Bar<T extends Foo<T>>',
-      "The typedef 'typedef Foo<T extends test_lib::Bar<T>> = dynamic;\n'"
+      "The typedef 'typedef Foo<T extends test_lib::Bar<T*>> = dynamic;\n'"
       " refers to itself", (TestHarness test) {
     var fooParam = test.makeTypeParameter('T');
     var foo =
@@ -443,7 +443,7 @@
   negativeTest(
       'Invalid typedef Foo<T extends Foo<dynamic> = C<T>',
       "The typedef 'typedef Foo<T extends test_lib::Foo<dynamic>> = "
-      "test_lib::OtherClass<T>;\n'"
+      "test_lib::OtherClass<T>*;\n'"
       " refers to itself", (TestHarness test) {
     var param = new TypeParameter('T', null);
     var foo = new Typedef('Foo',
@@ -466,7 +466,7 @@
   });
   negativeTest(
       'Dangling typedef reference',
-      "Dangling reference to 'typedef Foo = test_lib::OtherClass<dynamic>;\n'"
+      "Dangling reference to 'typedef Foo = test_lib::OtherClass<dynamic>*;\n'"
       ", parent is: 'null'", (TestHarness test) {
     var foo = new Typedef('Foo', test.otherClass.rawType, typeParameters: []);
     var field = new Field(new Name('field'),
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 9fd9fca..eefb621 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -11,11 +11,11 @@
 /// of a function that's been marked `@deprecated`, or it might display the
 /// function's name differently.
 ///
-/// For information on installing and importing this library, see the
-/// [meta package on pub.dartlang.org] (https://pub.dartlang.org/packages/meta).
-/// For examples of using annotations, see
-/// [Metadata](https://www.dartlang.org/docs/dart-up-and-running/ch02.html#metadata)
-/// in the language tour.
+/// For information on installing and importing this library, see the [meta
+/// package on pub.dev](https://pub.dev/packages/meta).  For examples of using
+/// annotations, see
+/// [Metadata](https://dart.dev/guides/language/language-tour#metadata) in the
+/// language tour.
 library meta;
 
 /// Used to annotate a function `f`. Indicates that `f` always throws an
diff --git a/pkg/nnbd_migration/analysis_options.yaml b/pkg/nnbd_migration/analysis_options.yaml
new file mode 100644
index 0000000..7d525d0
--- /dev/null
+++ b/pkg/nnbd_migration/analysis_options.yaml
@@ -0,0 +1,9 @@
+analyzer:
+  strong-mode:
+    implicit-casts: false
+linter:
+  rules:
+    - empty_constructor_bodies
+    - empty_statements
+    - unnecessary_brace_in_string_interps
+    - valid_regexps
diff --git a/pkg/nnbd_migration/lib/nnbd_migration.dart b/pkg/nnbd_migration/lib/nnbd_migration.dart
index 33afb82..21a929c 100644
--- a/pkg/nnbd_migration/lib/nnbd_migration.dart
+++ b/pkg/nnbd_migration/lib/nnbd_migration.dart
@@ -8,43 +8,50 @@
 import 'package:meta/meta.dart';
 import 'package:nnbd_migration/src/nullability_migration_impl.dart';
 
-/// Kinds of fixes that might be performed by nullability migration.
-class NullabilityFixKind {
-  /// An import needs to be added.
-  static const addImport =
-      const NullabilityFixKind._(appliedMessage: 'Add an import');
-
-  /// A formal parameter needs to have a required annotation added.
-  static const addRequired =
-      const NullabilityFixKind._(appliedMessage: 'Add a required annotation');
-
-  /// An expression's value needs to be null-checked.
-  static const checkExpression = const NullabilityFixKind._(
-    appliedMessage: 'Added a null check to an expression',
-  );
-
-  /// An explicit type mentioned in the source program needs to be made
-  /// nullable.
-  static const makeTypeNullable = const NullabilityFixKind._(
-    appliedMessage: 'Changed a type to be nullable',
-  );
-
+/// Description of fixes that might be performed by nullability migration.
+class NullabilityFixDescription {
   /// An if-test or conditional expression needs to have its "then" branch
   /// discarded.
-  static const discardThen = const NullabilityFixKind._(
+  static const discardThen = const NullabilityFixDescription._(
     appliedMessage: 'Discarded an unreachable conditional then branch',
   );
 
   /// An if-test or conditional expression needs to have its "else" branch
   /// discarded.
-  static const discardElse = const NullabilityFixKind._(
+  static const discardElse = const NullabilityFixDescription._(
     appliedMessage: 'Discarded an unreachable conditional else branch',
   );
 
+  /// An expression's value needs to be null-checked.
+  static const checkExpression = const NullabilityFixDescription._(
+    appliedMessage: 'Added a non-null assertion to nullable expression',
+  );
+
   /// A message used by dartfix to indicate a fix has been applied.
   final String appliedMessage;
 
-  const NullabilityFixKind._({@required this.appliedMessage});
+  /// An import needs to be added.
+  factory NullabilityFixDescription.addImport(String uri) =>
+      NullabilityFixDescription._(appliedMessage: 'Add import $uri');
+
+  /// A formal parameter needs to have a required modifier added.
+  factory NullabilityFixDescription.addRequired(
+          String className, String functionName, String paramName) =>
+      NullabilityFixDescription._(
+          appliedMessage:
+              "Add 'required' modifier to parameter $paramName in " +
+                  (className == null
+                      ? functionName
+                      : '$className.$functionName'));
+
+  /// An explicit type mentioned in the source program needs to be made
+  /// nullable.
+  factory NullabilityFixDescription.makeTypeNullable(String type) =>
+      NullabilityFixDescription._(
+        appliedMessage: 'Changed type $type to be nullable',
+      );
+
+  const NullabilityFixDescription._({@required this.appliedMessage});
 }
 
 /// Provisional API for DartFix to perform nullability migration.
@@ -89,7 +96,7 @@
 /// achieve.
 abstract class SingleNullabilityFix {
   /// What kind of fix this is.
-  NullabilityFixKind get kind;
+  NullabilityFixDescription get description;
 
   /// Location of the change, for reporting to the user.
   Location get location;
diff --git a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
index 368bfbd..40a4d8d 100644
--- a/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_class_hierarchy.dart
@@ -36,6 +36,7 @@
   /// nullable.
   DecoratedType getDecoratedSupertype(
       ClassElement class_, ClassElement superclass) {
+    assert(!(class_.library.isDartCore && class_.name == 'Null'));
     assert(class_ is! ClassElementHandle);
     assert(superclass is! ClassElementHandle);
     if (superclass.typeParameters.isEmpty) {
@@ -45,6 +46,22 @@
         (throw StateError('Unrelated types'));
   }
 
+  /// Retrieves a [DecoratedType] describing how [type] implements [superclass].
+  ///
+  /// If [type] is not an interface type, or it does not implement [superclass],
+  /// raises an exception.
+  DecoratedType asInstanceOf(DecoratedType type, ClassElement superclass) {
+    var typeType = type.type as InterfaceType;
+    var class_ = typeType.element;
+    if (class_ == superclass) return type;
+    var result = getDecoratedSupertype(class_, superclass);
+    if (result.typeArguments.isNotEmpty && type.typeArguments.isNotEmpty) {
+      // TODO(paulberry): test
+      result = result.substitute(type.asSubstitution);
+    }
+    return result.withNode(type.node);
+  }
+
   /// Computes a map whose keys are all the superclasses of [class_], and whose
   /// values indicate how [class_] implements each superclass.
   Map<ClassElement, DecoratedType> _getGenericSupertypeDecorations(
diff --git a/pkg/nnbd_migration/lib/src/decorated_type.dart b/pkg/nnbd_migration/lib/src/decorated_type.dart
index 3387fbf..41ebf51 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type.dart
@@ -269,7 +269,7 @@
       var name = type.element.name;
       var args = '';
       if (type.typeArguments.isNotEmpty) {
-        args = '<${type.typeArguments.join(', ')}>';
+        args = '<${typeArguments.join(', ')}>';
       }
       return '$name$args$trailing';
     } else if (type is FunctionType) {
@@ -300,6 +300,8 @@
       return '$returnType Function$formals($args)$trailing';
     } else if (type is DynamicTypeImpl) {
       return 'dynamic';
+    } else if (type.isBottom) {
+      return 'Never$trailing';
     } else {
       throw '$type'; // TODO(paulberry)
     }
diff --git a/pkg/nnbd_migration/lib/src/decorated_type_operations.dart b/pkg/nnbd_migration/lib/src/decorated_type_operations.dart
index 0b7a04c..d39bcbf 100644
--- a/pkg/nnbd_migration/lib/src/decorated_type_operations.dart
+++ b/pkg/nnbd_migration/lib/src/decorated_type_operations.dart
@@ -4,7 +4,7 @@
 
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type_system.dart';
-import 'package:analyzer/src/dart/resolver/flow_analysis.dart';
+import 'package:front_end/src/fasta/flow_analysis/flow_analysis.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/node_builder.dart';
 
@@ -17,17 +17,27 @@
   DecoratedTypeOperations(this._typeSystem, this._variableRepository);
 
   @override
-  DecoratedType elementType(VariableElement element) {
-    return _variableRepository.decoratedElementType(element);
-  }
-
-  @override
   bool isLocalVariable(VariableElement element) {
     return element is LocalVariableElement;
   }
 
   @override
+  bool isSameType(DecoratedType type1, DecoratedType type2) {
+    throw new UnimplementedError('TODO(paulberry)');
+  }
+
+  @override
   bool isSubtypeOf(DecoratedType leftType, DecoratedType rightType) {
     return _typeSystem.isSubtypeOf(leftType.type, rightType.type);
   }
+
+  @override
+  DecoratedType promoteToNonNull(DecoratedType type) {
+    throw new UnimplementedError('TODO(paulberry)');
+  }
+
+  @override
+  DecoratedType variableType(VariableElement variable) {
+    return _variableRepository.decoratedElementType(variable);
+  }
 }
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 08c3f80..6b58890 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -7,8 +7,9 @@
 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/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/handle.dart';
-import 'package:analyzer/src/dart/element/inheritance_manager2.dart';
+import 'package:analyzer/src/dart/element/inheritance_manager3.dart';
 import 'package:analyzer/src/dart/element/member.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/resolver.dart';
@@ -22,6 +23,48 @@
 import 'package:nnbd_migration/src/expression_checks.dart';
 import 'package:nnbd_migration/src/node_builder.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
+import 'package:nnbd_migration/src/utilities/scoped_set.dart';
+
+/// Test class mixing in _AssignmentChecker, to allow [checkAssignment] to be
+/// more easily unit tested.
+@visibleForTesting
+class AssignmentCheckerForTesting extends Object with _AssignmentChecker {
+  @override
+  final TypeSystem _typeSystem;
+
+  final NullabilityGraph _graph;
+
+  /// Tests should fill in this map with the bounds of any type parameters being
+  /// tested.
+  final Map<TypeParameterElement, DecoratedType> bounds = {};
+
+  @override
+  final DecoratedClassHierarchy _decoratedClassHierarchy;
+
+  AssignmentCheckerForTesting(
+      this._typeSystem, this._graph, this._decoratedClassHierarchy);
+
+  void checkAssignment(EdgeOrigin origin,
+      {@required DecoratedType source,
+      @required DecoratedType destination,
+      @required bool hard}) {
+    super._checkAssignment(origin,
+        source: source, destination: destination, hard: hard);
+  }
+
+  @override
+  void _connect(
+      NullabilityNode source, NullabilityNode destination, EdgeOrigin origin,
+      {bool hard = false}) {
+    _graph.connect(source, destination, origin, hard: hard);
+  }
+
+  @override
+  DecoratedType _getTypeParameterTypeBound(DecoratedType type) {
+    return bounds[(type.type as TypeParameterType).element] ??
+        (throw StateError('Unknown bound for $type'));
+  }
+}
 
 /// Visitor that builds nullability graph edges by examining code to be
 /// migrated.
@@ -30,8 +73,11 @@
 /// the static type of the visited expression, along with the constraint
 /// variables that will determine its nullability.  For `visit...` methods that
 /// don't visit expressions, `null` will be returned.
-class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType> {
-  final InheritanceManager2 _inheritanceManager;
+class EdgeBuilder extends GeneralizingAstVisitor<DecoratedType>
+    with _AssignmentChecker {
+  final TypeSystem _typeSystem;
+
+  final InheritanceManager3 _inheritanceManager;
 
   /// The repository of constraint variables and decorated types (from a
   /// previous pass over the source code).
@@ -44,6 +90,7 @@
   /// The file being analyzed.
   final Source _source;
 
+  @override
   final DecoratedClassHierarchy _decoratedClassHierarchy;
 
   /// For convenience, a [DecoratedType] representing non-nullable `Object`.
@@ -77,18 +124,20 @@
   /// code that can be proven unreachable by the migration tool.
   final _guards = <NullabilityNode>[];
 
-  /// Indicates whether the statement or expression being visited is within
-  /// conditional control flow.  If `true`, this means that the enclosing
-  /// function might complete normally without executing the current statement
-  /// or expression.
-  bool _inConditionalControlFlow = false;
+  /// The scope of locals (parameters, variables) that are post-dominated by the
+  /// current node as we walk the AST. We use a [ScopedSet] so that outer
+  /// scopes may track their post-dominators separately from inner scopes.
+  ///
+  /// Note that this is not guaranteed to be complete. It is used to make hard
+  /// edges on a best-effort basis.
+  final _postDominatedLocals = _ScopedLocalSet();
 
   NullabilityNode _lastConditionalNode;
 
-  EdgeBuilder(TypeProvider typeProvider, TypeSystem typeSystem, this._variables,
+  EdgeBuilder(TypeProvider typeProvider, this._typeSystem, this._variables,
       this._graph, this._source, this.listener)
       : _decoratedClassHierarchy = DecoratedClassHierarchy(_variables, _graph),
-        _inheritanceManager = InheritanceManager2(typeSystem),
+        _inheritanceManager = InheritanceManager3(_typeSystem),
         _notNullType = DecoratedType(typeProvider.objectType, _graph.never),
         _nonNullableBoolType =
             DecoratedType(typeProvider.boolType, _graph.never),
@@ -108,7 +157,7 @@
       var targetTypeType = targetType.type;
       if (targetTypeType is InterfaceType &&
           baseElement is ClassMemberElement) {
-        var enclosingClass = baseElement.enclosingElement;
+        var enclosingClass = baseElement.enclosingElement as ClassElement;
         assert(targetTypeType.element == enclosingClass); // TODO(paulberry)
         substitution = <TypeParameterElement, DecoratedType>{};
         assert(enclosingClass.typeParameters.length ==
@@ -164,8 +213,8 @@
   DecoratedType visitAssertStatement(AssertStatement node) {
     _handleAssignment(node.condition, _notNullType);
     if (identical(_conditionInfo?.condition, node.condition)) {
-      if (!_inConditionalControlFlow &&
-          _conditionInfo.trueDemonstratesNonNullIntent != null) {
+      var intentNode = _conditionInfo.trueDemonstratesNonNullIntent;
+      if (intentNode != null && _conditionInfo.postDominatingIntent) {
         _graph.connect(_conditionInfo.trueDemonstratesNonNullIntent,
             _graph.never, NonNullAssertionOrigin(_source, node.offset),
             hard: true);
@@ -181,6 +230,7 @@
       // TODO(paulberry)
       _unimplemented(node, 'Assignment with operator ${node.operator.lexeme}');
     }
+    _postDominatedLocals.removeReferenceFromAllScopes(node.leftHandSide);
     var leftType = node.leftHandSide.accept(this);
     var conditionalNode = _lastConditionalNode;
     _lastConditionalNode = null;
@@ -218,6 +268,8 @@
         bool isPure = node.leftOperand is SimpleIdentifier;
         var conditionInfo = _ConditionInfo(node,
             isPure: isPure,
+            postDominatingIntent:
+                _postDominatedLocals.isReferenceInScope(node.leftOperand),
             trueGuard: leftType.node,
             falseDemonstratesNonNullIntent: leftType.node);
         _conditionInfo = operatorType == TokenType.EQ_EQ
@@ -228,7 +280,8 @@
     } else if (operatorType == TokenType.AMPERSAND_AMPERSAND ||
         operatorType == TokenType.BAR_BAR) {
       _handleAssignment(node.leftOperand, _notNullType);
-      _handleAssignment(node.rightOperand, _notNullType);
+      _postDominatedLocals.doScoped(
+          action: () => _handleAssignment(node.rightOperand, _notNullType));
       return _nonNullableBoolType;
     } else if (operatorType == TokenType.QUESTION_QUESTION) {
       DecoratedType expressionType;
@@ -238,9 +291,8 @@
         var rightType = node.rightOperand.accept(this);
         var ifNullNode = NullabilityNode.forIfNotNull();
         expressionType = DecoratedType(node.staticType, ifNullNode);
-        _graph.connect(rightType.node, expressionType.node,
-            IfNullOrigin(_source, node.offset),
-            guards: _guards);
+        _connect(rightType.node, expressionType.node,
+            IfNullOrigin(_source, node.offset));
       } finally {
         _guards.removeLast();
       }
@@ -250,14 +302,15 @@
       _handleAssignment(node.leftOperand, _notNullType);
       var callee = node.staticElement;
       assert(!(callee is ClassMemberElement &&
-          callee
-              .enclosingElement.typeParameters.isNotEmpty)); // TODO(paulberry)
+          (callee.enclosingElement as ClassElement)
+              .typeParameters
+              .isNotEmpty)); // TODO(paulberry)
       assert(callee != null); // TODO(paulberry)
       var calleeType = getOrComputeElementType(callee);
       // TODO(paulberry): substitute if necessary
       assert(calleeType.positionalParameters.length > 0); // TODO(paulberry)
       _handleAssignment(node.rightOperand, calleeType.positionalParameters[0]);
-      return calleeType.returnType;
+      return _fixNumericTypes(calleeType.returnType, node.staticType);
     } else {
       // TODO(paulberry)
       node.leftOperand.accept(this);
@@ -273,6 +326,16 @@
   }
 
   @override
+  DecoratedType visitBreakStatement(BreakStatement node) {
+    // Later statements no longer post-dominate the declarations because we
+    // exited (or, in parent scopes, conditionally exited).
+    // TODO(mfairhurst): don't clear post-dominators beyond the current loop.
+    _postDominatedLocals.clearEachScope();
+
+    return null;
+  }
+
+  @override
   DecoratedType visitCascadeExpression(CascadeExpression node) {
     var type = node.target.accept(this);
     node.cascadeSections.accept(this);
@@ -320,9 +383,19 @@
   @override
   DecoratedType visitConditionalExpression(ConditionalExpression node) {
     _handleAssignment(node.condition, _notNullType);
+
+    DecoratedType thenType;
+    DecoratedType elseType;
+
     // TODO(paulberry): guard anything inside the true and false branches
-    var thenType = node.thenExpression.accept(this);
-    var elseType = node.elseExpression.accept(this);
+
+    // Post-dominators diverge as we branch in the conditional.
+    // Note: we don't have to create a scope for each branch because they can't
+    // define variables.
+    _postDominatedLocals.doScoped(action: () {
+      thenType = node.thenExpression.accept(this);
+      elseType = node.elseExpression.accept(this);
+    });
 
     var overallType = _decorateUpperOrLowerBound(
         node, node.staticType, thenType, elseType, true);
@@ -345,6 +418,24 @@
   }
 
   @override
+  DecoratedType visitConstructorFieldInitializer(
+      ConstructorFieldInitializer node) {
+    _handleAssignment(
+        node.expression, getOrComputeElementType(node.fieldName.staticElement));
+    return null;
+  }
+
+  @override
+  DecoratedType visitContinueStatement(ContinueStatement node) {
+    // Later statements no longer post-dominate the declarations because we
+    // exited (or, in parent scopes, conditionally exited).
+    // TODO(mfairhurst): don't clear post-dominators beyond the current loop.
+    _postDominatedLocals.clearEachScope();
+
+    return null;
+  }
+
+  @override
   DecoratedType visitDefaultFormalParameter(DefaultFormalParameter node) {
     node.parameter.accept(this);
     var defaultValue = node.defaultValue;
@@ -353,11 +444,10 @@
         // Nothing to do; the implicit default value of `null` will never be
         // reached.
       } else {
-        _graph.connect(
+        _connect(
             _graph.always,
             getOrComputeElementType(node.declaredElement).node,
-            OptionalFormalParameterOrigin(_source, node.offset),
-            guards: _guards);
+            OptionalFormalParameterOrigin(_source, node.offset));
       }
     } else {
       _handleAssignment(
@@ -368,6 +458,13 @@
   }
 
   @override
+  DecoratedType visitDoStatement(DoStatement node) {
+    node.body.accept(this);
+    _handleAssignment(node.condition, _notNullType);
+    return null;
+  }
+
+  @override
   DecoratedType visitDoubleLiteral(DoubleLiteral node) {
     return DecoratedType(node.staticType, _graph.never);
   }
@@ -400,14 +497,53 @@
   }
 
   @override
+  DecoratedType visitForStatement(ForStatement node) {
+    // TODO do special condition handling
+    // TODO do create true/false guards?
+    // Create a scope of for new initializers etc, which includes previous
+    // post-dominators.
+    _postDominatedLocals.doScoped(
+        copyCurrent: true,
+        action: () {
+          final parts = node.forLoopParts;
+          if (parts is ForParts) {
+            if (parts is ForPartsWithDeclarations) {
+              parts.variables.accept(this);
+            }
+            if (parts is ForPartsWithExpression) {
+              parts.initialization.accept(this);
+            }
+            parts.condition.accept(this);
+          }
+          if (parts is ForEachParts) {
+            parts.iterable.accept(this);
+          }
+
+          // The condition may fail/iterable may be empty, so the body does not
+          // post-dominate the parts, or the outer scope.
+          _postDominatedLocals.popScope();
+          _postDominatedLocals.pushScope();
+
+          if (parts is ForParts) {
+            parts.updaters.accept(this);
+          }
+
+          node.body.accept(this);
+        });
+    return null;
+  }
+
+  @override
   DecoratedType visitFunctionDeclaration(FunctionDeclaration node) {
     node.functionExpression.parameters?.accept(this);
     assert(_currentFunctionType == null);
     _currentFunctionType =
         _variables.decoratedElementType(node.declaredElement);
-    _inConditionalControlFlow = false;
+    // Initialize a new postDominator scope that contains only the parameters.
     try {
-      node.functionExpression.body.accept(this);
+      _postDominatedLocals.doScoped(
+          elements: node.functionExpression.declaredElement.parameters,
+          action: () => node.functionExpression.body.accept(this));
     } finally {
       _currentFunctionType = null;
     }
@@ -417,6 +553,7 @@
   @override
   DecoratedType visitFunctionExpression(FunctionExpression node) {
     // TODO(brianwilkerson)
+    // TODO(mfairhurst): enable edge builder "_insideFunction" hard edge tests.
     _unimplemented(node, 'FunctionExpression');
   }
 
@@ -433,7 +570,6 @@
     // TODO(paulberry): should the use of a boolean in an if-statement be
     // treated like an implicit `assert(b != null)`?  Probably.
     _handleAssignment(node.condition, _notNullType);
-    _inConditionalControlFlow = true;
     NullabilityNode trueGuard;
     NullabilityNode falseGuard;
     if (identical(_conditionInfo?.condition, node.condition)) {
@@ -446,7 +582,9 @@
       _guards.add(trueGuard);
     }
     try {
-      node.thenStatement.accept(this);
+      // We branched, so create a new scope for post-dominators.
+      _postDominatedLocals.doScoped(
+          action: () => node.thenStatement.accept(this));
     } finally {
       if (trueGuard != null) {
         _guards.removeLast();
@@ -456,7 +594,9 @@
       _guards.add(falseGuard);
     }
     try {
-      node.elseStatement?.accept(this);
+      // We branched, so create a new scope for post-dominators.
+      _postDominatedLocals.doScoped(
+          action: () => node.elseStatement?.accept(this));
     } finally {
       if (falseGuard != null) {
         _guards.removeLast();
@@ -649,7 +789,7 @@
       _handleAssignment(node.operand, _notNullType);
       var callee = node.staticElement;
       if (callee is ClassMemberElement &&
-          callee.enclosingElement.typeParameters.isNotEmpty) {
+          (callee.enclosingElement as ClassElement).typeParameters.isNotEmpty) {
         // TODO(paulberry)
         _unimplemented(node,
             'Operator ${operatorType.lexeme} defined on a class with type parameters');
@@ -660,7 +800,7 @@
       }
       var calleeType = getOrComputeElementType(callee);
       // TODO(paulberry): substitute if necessary
-      return calleeType.returnType;
+      return _fixNumericTypes(calleeType.returnType, node.staticType);
     }
     _unimplemented(
         node, 'Postfix expression with operator ${node.operator.lexeme}');
@@ -686,7 +826,7 @@
         operatorType == TokenType.MINUS_MINUS) {
       var callee = node.staticElement;
       if (callee is ClassMemberElement &&
-          callee.enclosingElement.typeParameters.isNotEmpty) {
+          (callee.enclosingElement as ClassElement).typeParameters.isNotEmpty) {
         // TODO(paulberry)
         _unimplemented(node,
             'Operator ${operatorType.lexeme} defined on a class with type parameters');
@@ -697,7 +837,7 @@
       }
       var calleeType = getOrComputeElementType(callee);
       // TODO(paulberry): substitute if necessary
-      return calleeType.returnType;
+      return _fixNumericTypes(calleeType.returnType, node.staticType);
     } else {
       var callee = node.staticElement;
       var calleeType = getOrComputeElementType(callee, targetType: targetType);
@@ -713,7 +853,7 @@
   @override
   DecoratedType visitRedirectingConstructorInvocation(
       RedirectingConstructorInvocation node) {
-    var callee = node.constructorName.staticElement;
+    var callee = node.staticElement;
     var calleeType = _variables.decoratedElementType(callee);
     _handleInvocationArguments(
         node, node.argumentList.arguments, null, calleeType, null);
@@ -741,6 +881,12 @@
     } else {
       _handleAssignment(returnValue, returnType);
     }
+
+    // Later statements no longer post-dominate the declarations because we
+    // exited (or, in parent scopes, conditionally exited).
+    // TODO(mfairhurst): don't clear post-dominators beyond the current function.
+    _postDominatedLocals.clearEachScope();
+
     return null;
   }
 
@@ -903,67 +1049,18 @@
         }
       }
     }
+    _postDominatedLocals
+        .addAll(node.variables.map((variable) => variable.declaredElement));
     return null;
   }
 
-  /// Creates the necessary constraint(s) for an assignment from [source] to
-  /// [destination].  [origin] should be used as the origin for any edges
-  /// created.  [hard] indicates whether a hard edge should be created.
-  void _checkAssignment(EdgeOrigin origin,
-      {@required DecoratedType source,
-      @required DecoratedType destination,
-      @required bool hard}) {
-    var edge = _graph.connect(source.node, destination.node, origin,
-        guards: _guards, hard: hard);
-    if (origin is ExpressionChecks) {
-      origin.edges.add(edge);
-    }
-    // TODO(paulberry): generalize this.
-    if ((_isSimple(source) || destination.type.isObject) &&
-        _isSimple(destination)) {
-      // Ok; nothing further to do.
-    } else if (source.type is InterfaceType &&
-        destination.type is InterfaceType &&
-        source.type.element == destination.type.element) {
-      assert(source.typeArguments.length == destination.typeArguments.length);
-      for (int i = 0; i < source.typeArguments.length; i++) {
-        _checkAssignment(origin,
-            source: source.typeArguments[i],
-            destination: destination.typeArguments[i],
-            hard: false);
-      }
-    } else if (source.type is FunctionType &&
-        destination.type is FunctionType) {
-      _checkAssignment(origin,
-          source: source.returnType,
-          destination: destination.returnType,
-          hard: hard);
-      if (source.typeArguments.isNotEmpty ||
-          destination.typeArguments.isNotEmpty) {
-        throw UnimplementedError('TODO(paulberry)');
-      }
-      for (int i = 0;
-          i < source.positionalParameters.length &&
-              i < destination.positionalParameters.length;
-          i++) {
-        // Note: source and destination are swapped due to contravariance.
-        _checkAssignment(origin,
-            source: destination.positionalParameters[i],
-            destination: source.positionalParameters[i],
-            hard: hard);
-      }
-      for (var entry in destination.namedParameters.entries) {
-        // Note: source and destination are swapped due to contravariance.
-        _checkAssignment(origin,
-            source: entry.value,
-            destination: source.namedParameters[entry.key],
-            hard: hard);
-      }
-    } else if (destination.type.isDynamic || source.type.isDynamic) {
-      // ok; nothing further to do.
-    } else {
-      throw '$destination <= $source'; // TODO(paulberry)
-    }
+  @override
+  DecoratedType visitWhileStatement(WhileStatement node) {
+    // TODO do special condition handling
+    // TODO do create true/false guards?
+    _handleAssignment(node.condition, _notNullType);
+    _postDominatedLocals.doScoped(action: () => node.body.accept(this));
+    return null;
   }
 
   /// Double checks that [name] is not the name of a method or getter declared
@@ -978,6 +1075,17 @@
     assert(name != 'runtimeType');
   }
 
+  @override
+  void _connect(
+      NullabilityNode source, NullabilityNode destination, EdgeOrigin origin,
+      {bool hard = false}) {
+    var edge = _graph.connect(source, destination, origin,
+        hard: hard, guards: _guards);
+    if (origin is ExpressionChecks) {
+      origin.edges.add(edge);
+    }
+  }
+
   DecoratedType _decorateUpperOrLowerBound(AstNode astNode, DartType type,
       DecoratedType left, DecoratedType right, bool isLUB,
       {NullabilityNode node}) {
@@ -1064,6 +1172,26 @@
     _unimplemented(astNode, '_decorateUpperOrLowerBound');
   }
 
+  DecoratedType _fixNumericTypes(
+      DecoratedType decoratedType, DartType undecoratedType) {
+    if (decoratedType.type.isDartCoreNum && undecoratedType.isDartCoreInt) {
+      // In a few cases the type computed by normal method lookup is `num`,
+      // but special rules kick in to cause the type to be `int` instead.  If
+      // that is the case, we need to fix up the decorated type.
+      return DecoratedType(undecoratedType, decoratedType.node);
+    } else {
+      return decoratedType;
+    }
+  }
+
+  @override
+  DecoratedType _getTypeParameterTypeBound(DecoratedType type) {
+    // TODO(paulberry): once we've wired up flow analysis, return promoted
+    // bounds if applicable.
+    return _variables
+        .decoratedElementType((type.type as TypeParameterType).element);
+  }
+
   /// Creates the necessary constraint(s) for an assignment of the given
   /// [expression] to a destination whose type is [destinationType].
   DecoratedType _handleAssignment(
@@ -1082,8 +1210,7 @@
     _checkAssignment(expressionChecks,
         source: sourceType,
         destination: destinationType,
-        hard: _isVariableOrParameterReference(expression) &&
-            !_inConditionalControlFlow);
+        hard: _postDominatedLocals.isReferenceInScope(expression));
     return sourceType;
   }
 
@@ -1117,7 +1244,8 @@
     returnType?.accept(this);
     parameters?.accept(this);
     _currentFunctionType = _variables.decoratedElementType(declaredElement);
-    _inConditionalControlFlow = false;
+    // Push a scope of post-dominated declarations on the stack.
+    _postDominatedLocals.pushScope(elements: declaredElement.parameters);
     try {
       initializers?.accept(this);
       body.accept(this);
@@ -1127,12 +1255,14 @@
       if (declaredElement is! ConstructorElement) {
         var classElement = declaredElement.enclosingElement as ClassElement;
         var origin = InheritanceOrigin(_source, node.offset);
-        for (var overridden in _inheritanceManager.getOverridden(
+        for (var overriddenElement in _inheritanceManager.getOverridden(
                 classElement.type,
                 Name(classElement.library.source.uri, declaredElement.name)) ??
-            const []) {
-          var overriddenElement = overridden.element as ExecutableElement;
-          assert(overriddenElement is! ExecutableMember);
+            const <ExecutableElement>[]) {
+          if (overriddenElement is ExecutableMember) {
+            var member = overriddenElement as ExecutableMember;
+            overriddenElement = member.baseElement;
+          }
           var overriddenClass =
               overriddenElement.enclosingElement as ClassElement;
           var decoratedOverriddenFunctionType =
@@ -1199,6 +1329,7 @@
       }
     } finally {
       _currentFunctionType = null;
+      _postDominatedLocals.popScope();
     }
   }
 
@@ -1244,7 +1375,7 @@
         }
         expression = argument.identifier;
       } else {
-        expression = argument;
+        expression = argument as Expression;
       }
       DecoratedType parameterType;
       if (name != null) {
@@ -1330,20 +1461,6 @@
     }
   }
 
-  /// Double checks that [type] is sufficiently simple for this naive prototype
-  /// implementation.
-  ///
-  /// TODO(paulberry): get rid of this method and put the correct logic into the
-  /// call sites.
-  bool _isSimple(DecoratedType type) {
-    if (type.type.isBottom) return true;
-    if (type.type.isVoid) return true;
-    if (type.type is TypeParameterType) return true;
-    if (type.type is! InterfaceType) return false;
-    if ((type.type as InterfaceType).typeParameters.isNotEmpty) return false;
-    return true;
-  }
-
   bool _isUntypedParameter(NormalFormalParameter parameter) {
     if (parameter is SimpleFormalParameter) {
       return parameter.type == null;
@@ -1352,15 +1469,6 @@
     } else {
       return false;
     }
-  }
-
-  bool _isVariableOrParameterReference(Expression expression) {
-    expression = expression.unParenthesized;
-    if (expression is SimpleIdentifier) {
-      var element = expression.staticElement;
-      if (element is LocalVariableElement) return true;
-      if (element is ParameterElement) return true;
-    }
     return false;
   }
 
@@ -1420,6 +1528,127 @@
   }
 }
 
+/// Implementation of [_checkAssignment] for [EdgeBuilder].
+///
+/// This has been moved to its own mixin to allow it to be more easily unit
+/// tested.
+mixin _AssignmentChecker {
+  DecoratedClassHierarchy get _decoratedClassHierarchy;
+
+  NullabilityGraph get _graph;
+
+  TypeSystem get _typeSystem;
+
+  /// Creates the necessary constraint(s) for an assignment from [source] to
+  /// [destination].  [origin] should be used as the origin for any edges
+  /// created.  [hard] indicates whether a hard edge should be created.
+  void _checkAssignment(EdgeOrigin origin,
+      {@required DecoratedType source,
+      @required DecoratedType destination,
+      @required bool hard}) {
+    _connect(source.node, destination.node, origin, hard: hard);
+    var sourceType = source.type;
+    var destinationType = destination.type;
+    if (sourceType.isBottom || sourceType.isDartCoreNull) {
+      // No further edges need to be created, since all types are trivially
+      // supertypes of bottom (and of Null, in the pre-migration world).
+    } else if (destinationType.isDynamic || destinationType.isVoid) {
+      // No further edges need to be created, since all types are trivially
+      // subtypes of dynamic (and of void, since void is treated as equivalent
+      // to dynamic for subtyping purposes).
+    } else if (sourceType is TypeParameterType) {
+      if (destinationType is TypeParameterType) {
+        // No further edges need to be created, since type parameter types
+        // aren't made up of other types.
+      } else {
+        // Effectively this is an assignment from the type parameter's bound to
+        // the destination type.
+        _checkAssignment(origin,
+            source: _getTypeParameterTypeBound(source),
+            destination: destination,
+            hard: false);
+        return;
+      }
+    } else if (destinationType is TypeParameterType) {
+      // Effectively this is a downcast assignment from the source type to the
+      // type parameter's bound.
+      _checkAssignment(origin,
+          source: source,
+          destination:
+              _getTypeParameterTypeBound(destination).withNode(_graph.always),
+          hard: false);
+    } else if (sourceType is InterfaceType &&
+        destinationType is InterfaceType) {
+      if (_typeSystem.isSubtypeOf(sourceType, destinationType)) {
+        // Ordinary (upcast) assignment.  No cast necessary.
+        var rewrittenSource = _decoratedClassHierarchy.asInstanceOf(
+            source, destinationType.element);
+        assert(rewrittenSource.typeArguments.length ==
+            destination.typeArguments.length);
+        for (int i = 0; i < rewrittenSource.typeArguments.length; i++) {
+          _checkAssignment(origin,
+              source: rewrittenSource.typeArguments[i],
+              destination: destination.typeArguments[i],
+              hard: false);
+        }
+      } else if (_typeSystem.isSubtypeOf(destinationType, sourceType)) {
+        // Implicit downcast assignment.
+        // TODO(paulberry): the migration tool should insert a cast.
+        var rewrittenDestination = _decoratedClassHierarchy.asInstanceOf(
+            destination, sourceType.element);
+        assert(rewrittenDestination.typeArguments.length ==
+            source.typeArguments.length);
+        for (int i = 0; i < rewrittenDestination.typeArguments.length; i++) {
+          _checkAssignment(origin,
+              source: source.typeArguments[i],
+              destination: rewrittenDestination.typeArguments[i],
+              hard: false);
+        }
+      } else {
+        // This should never arise for correct code; if it does arise, recover
+        // from the error by just not creating any additional edges.
+      }
+    } else if (sourceType is FunctionType && destinationType is FunctionType) {
+      _checkAssignment(origin,
+          source: source.returnType,
+          destination: destination.returnType,
+          hard: false);
+      if (source.typeArguments.isNotEmpty ||
+          destination.typeArguments.isNotEmpty) {
+        throw UnimplementedError('TODO(paulberry)');
+      }
+      for (int i = 0;
+          i < source.positionalParameters.length &&
+              i < destination.positionalParameters.length;
+          i++) {
+        // Note: source and destination are swapped due to contravariance.
+        _checkAssignment(origin,
+            source: destination.positionalParameters[i],
+            destination: source.positionalParameters[i],
+            hard: false);
+      }
+      for (var entry in destination.namedParameters.entries) {
+        // Note: source and destination are swapped due to contravariance.
+        _checkAssignment(origin,
+            source: entry.value,
+            destination: source.namedParameters[entry.key],
+            hard: false);
+      }
+    } else if (destinationType.isDynamic || sourceType.isDynamic) {
+      // ok; nothing further to do.
+    } else {
+      throw '$destination <= $source'; // TODO(paulberry)
+    }
+  }
+
+  void _connect(
+      NullabilityNode source, NullabilityNode destination, EdgeOrigin origin,
+      {bool hard = false});
+
+  /// Given a [type] representing a type parameter, retrieves the type's bound.
+  DecoratedType _getTypeParameterTypeBound(DecoratedType type);
+}
+
 /// Information about a binary expression whose boolean value could possibly
 /// affect nullability analysis.
 class _ConditionInfo {
@@ -1433,6 +1662,9 @@
   /// effect other than returning a boolean value.
   final bool isPure;
 
+  /// Indicates whether the intents postdominate the intent node declarations.
+  final bool postDominatingIntent;
+
   /// If not `null`, the [NullabilityNode] that would need to be nullable in
   /// order for [condition] to evaluate to `true`.
   final NullabilityNode trueGuard;
@@ -1442,7 +1674,7 @@
   final NullabilityNode falseGuard;
 
   /// If not `null`, the [NullabilityNode] that should be asserted to have
-  //  /// non-null intent if [condition] is asserted to be `true`.
+  /// non-null intent if [condition] is asserted to be `true`.
   final NullabilityNode trueDemonstratesNonNullIntent;
 
   /// If not `null`, the [NullabilityNode] that should be asserted to have
@@ -1451,6 +1683,7 @@
 
   _ConditionInfo(this.condition,
       {@required this.isPure,
+      this.postDominatingIntent,
       this.trueGuard,
       this.falseGuard,
       this.trueDemonstratesNonNullIntent,
@@ -1459,8 +1692,31 @@
   /// Returns a new [_ConditionInfo] describing the boolean "not" of `this`.
   _ConditionInfo not(Expression condition) => _ConditionInfo(condition,
       isPure: isPure,
+      postDominatingIntent: postDominatingIntent,
       trueGuard: falseGuard,
       falseGuard: trueGuard,
       trueDemonstratesNonNullIntent: falseDemonstratesNonNullIntent,
       falseDemonstratesNonNullIntent: trueDemonstratesNonNullIntent);
 }
+
+/// A [ScopedSet] specific to the [Element]s of locals/parameters.
+///
+/// Contains helpers for dealing with expressions as if they were elements.
+class _ScopedLocalSet extends ScopedSet<Element> {
+  bool isReferenceInScope(Expression expression) {
+    expression = expression.unParenthesized;
+    if (expression is SimpleIdentifier) {
+      var element = expression.staticElement;
+      return isInScope(element);
+    }
+    return false;
+  }
+
+  void removeReferenceFromAllScopes(Expression expression) {
+    expression = expression.unParenthesized;
+    if (expression is SimpleIdentifier) {
+      var element = expression.staticElement;
+      removeFromAllScopes(element);
+    }
+  }
+}
diff --git a/pkg/nnbd_migration/lib/src/edge_origin.dart b/pkg/nnbd_migration/lib/src/edge_origin.dart
index db1c8c5..9c52df8 100644
--- a/pkg/nnbd_migration/lib/src/edge_origin.dart
+++ b/pkg/nnbd_migration/lib/src/edge_origin.dart
@@ -19,7 +19,9 @@
 /// Common interface for classes providing information about how an edge came
 /// to be; that is, what was found in the source code that led the migration
 /// tool to create the edge.
-abstract class EdgeOrigin {}
+abstract class EdgeOrigin {
+  const EdgeOrigin();
+}
 
 /// Common base class for edge origins that are associated with a single
 /// location in the source code.
diff --git a/pkg/nnbd_migration/lib/src/node_builder.dart b/pkg/nnbd_migration/lib/src/node_builder.dart
index 43c9143..306ac47 100644
--- a/pkg/nnbd_migration/lib/src/node_builder.dart
+++ b/pkg/nnbd_migration/lib/src/node_builder.dart
@@ -125,8 +125,15 @@
 
   @override
   DecoratedType visitConstructorDeclaration(ConstructorDeclaration node) {
-    _handleExecutableDeclaration(node.declaredElement, null, node.parameters,
-        node.body, node.redirectedConstructor, node);
+    _handleExecutableDeclaration(
+        node.declaredElement,
+        node.metadata,
+        null,
+        node.parameters,
+        node.initializers,
+        node.body,
+        node.redirectedConstructor,
+        node);
     return null;
   }
 
@@ -171,8 +178,10 @@
   DecoratedType visitFunctionDeclaration(FunctionDeclaration node) {
     _handleExecutableDeclaration(
         node.declaredElement,
+        node.metadata,
         node.returnType,
         node.functionExpression.parameters,
+        null,
         node.functionExpression.body,
         null,
         node);
@@ -194,8 +203,8 @@
 
   @override
   DecoratedType visitMethodDeclaration(MethodDeclaration node) {
-    _handleExecutableDeclaration(node.declaredElement, node.returnType,
-        node.parameters, node.body, null, node);
+    _handleExecutableDeclaration(node.declaredElement, node.metadata,
+        node.returnType, node.parameters, null, node.body, null, node);
     return null;
   }
 
@@ -376,11 +385,14 @@
   /// Common handling of function and method declarations.
   void _handleExecutableDeclaration(
       ExecutableElement declaredElement,
+      NodeList<Annotation> metadata,
       TypeAnnotation returnType,
       FormalParameterList parameters,
+      NodeList<ConstructorInitializer> initializers,
       FunctionBody body,
       ConstructorName redirectedConstructor,
       AstNode enclosingNode) {
+    metadata.accept(this);
     var functionType = declaredElement.type;
     DecoratedType decoratedReturnType;
     if (returnType != null) {
@@ -403,6 +415,7 @@
     try {
       parameters?.accept(this);
       redirectedConstructor?.accept(this);
+      initializers?.accept(this);
       decoratedFunctionType = DecoratedType(functionType, _graph.never,
           returnType: decoratedReturnType,
           positionalParameters: _positionalParameters,
diff --git a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
index 6fede39..22af1a0 100644
--- a/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_migration_impl.dart
@@ -5,6 +5,7 @@
 import 'package:analysis_server/src/protocol_server.dart';
 import 'package:analyzer/dart/analysis/results.dart';
 import 'package:analyzer/src/generated/source.dart';
+import 'package:meta/meta.dart';
 import 'package:nnbd_migration/nnbd_migration.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/edge_builder.dart';
@@ -39,16 +40,14 @@
 
   void finish() {
     _graph.propagate();
-    for (var entry in _variables.getPotentialModifications().entries) {
-      var source = entry.key;
-      for (var potentialModification in entry.value) {
-        var fix = _SingleNullabilityFix(source, potentialModification);
-        listener.addFix(fix);
-        for (var edit in potentialModification.modifications) {
-          listener.addEdit(fix, edit);
-        }
-      }
+    if (_graph.unsatisfiedSubstitutions.isNotEmpty) {
+      throw new UnimplementedError('Need to report unsatisfied substitutions');
     }
+    // TODO(paulberry): it would be nice to report on unsatisfied edges as well,
+    // however, since every `!` we add has an unsatisfied edge associated with
+    // it, we can't report on every unsatisfied edge.  We need to figure out a
+    // way to report unsatisfied edges that isn't too overwhelming.
+    broadcast(_variables, listener);
   }
 
   void prepareInput(ResolvedUnitResult result) {
@@ -62,6 +61,27 @@
     unit.accept(EdgeBuilder(result.typeProvider, result.typeSystem, _variables,
         _graph, unit.declaredElement.source, _permissive ? listener : null));
   }
+
+  @visibleForTesting
+  static void broadcast(
+      Variables variables, NullabilityMigrationListener listener) {
+    for (var entry in variables.getPotentialModifications().entries) {
+      var source = entry.key;
+      final lineInfo = LineInfo.fromContent(source.contents.data);
+      for (var potentialModification in entry.value) {
+        var modifications = potentialModification.modifications;
+        if (modifications.isEmpty) {
+          continue;
+        }
+        var fix =
+            _SingleNullabilityFix(source, potentialModification, lineInfo);
+        listener.addFix(fix);
+        for (var edit in modifications) {
+          listener.addEdit(fix, edit);
+        }
+      }
+    }
+  }
 }
 
 /// Implementation of [SingleNullabilityFix] used internally by
@@ -71,35 +91,57 @@
   final Source source;
 
   @override
-  final NullabilityFixKind kind;
+  final NullabilityFixDescription description;
 
-  factory _SingleNullabilityFix(
-      Source source, PotentialModification potentialModification) {
+  Location _location;
+
+  factory _SingleNullabilityFix(Source source,
+      PotentialModification potentialModification, LineInfo lineInfo) {
     // TODO(paulberry): once everything is migrated into the analysis server,
     // the migration engine can just create SingleNullabilityFix objects
     // directly and set their kind appropriately; we won't need to translate the
     // kinds using a bunch of `is` checks.
-    NullabilityFixKind kind;
+    NullabilityFixDescription desc;
     if (potentialModification is ExpressionChecks) {
-      kind = NullabilityFixKind.checkExpression;
+      desc = NullabilityFixDescription.checkExpression;
     } else if (potentialModification is DecoratedTypeAnnotation) {
-      kind = NullabilityFixKind.makeTypeNullable;
+      desc = NullabilityFixDescription.makeTypeNullable(
+          potentialModification.type.toString());
     } else if (potentialModification is ConditionalModification) {
-      kind = potentialModification.discard.keepFalse
-          ? NullabilityFixKind.discardThen
-          : NullabilityFixKind.discardElse;
+      desc = potentialModification.discard.keepFalse
+          ? NullabilityFixDescription.discardThen
+          : NullabilityFixDescription.discardElse;
     } else if (potentialModification is PotentiallyAddImport) {
-      kind = NullabilityFixKind.addImport;
+      desc =
+          NullabilityFixDescription.addImport(potentialModification.importPath);
     } else if (potentialModification is PotentiallyAddRequired) {
-      kind = NullabilityFixKind.addRequired;
+      desc = NullabilityFixDescription.addRequired(
+          potentialModification.className,
+          potentialModification.methodName,
+          potentialModification.parameterName);
     } else {
       throw new UnimplementedError('TODO(paulberry)');
     }
-    return _SingleNullabilityFix._(source, kind);
+
+    Location location;
+
+    if (potentialModification.modifications.isNotEmpty) {
+      final locationInfo = lineInfo
+          .getLocation(potentialModification.modifications.first.offset);
+      location = new Location(
+        source.fullName,
+        potentialModification.modifications.first.offset,
+        potentialModification.modifications.first.length,
+        locationInfo.lineNumber,
+        locationInfo.columnNumber,
+      );
+    }
+
+    return _SingleNullabilityFix._(source, desc, location: location);
   }
 
-  _SingleNullabilityFix._(this.source, this.kind);
+  _SingleNullabilityFix._(this.source, this.description, {Location location})
+      : this._location = location;
 
-  /// TODO(paulberry): do something better
-  Location get location => null;
+  Location get location => _location;
 }
diff --git a/pkg/nnbd_migration/lib/src/nullability_node.dart b/pkg/nnbd_migration/lib/src/nullability_node.dart
index 6e345f4..81bd9e6 100644
--- a/pkg/nnbd_migration/lib/src/nullability_node.dart
+++ b/pkg/nnbd_migration/lib/src/nullability_node.dart
@@ -100,6 +100,35 @@
   /// Set containing all sources being migrated.
   final _sourcesBeingMigrated = <Source>{};
 
+  /// After execution of [_propagateAlways], a list of all nodes reachable from
+  /// [always] via zero or more edges of kind [_NullabilityEdgeKind.union].
+  final List<NullabilityNode> _unionedWithAlways = [];
+
+  /// During any given stage of nullability propagation, a list of all the edges
+  /// that need to be examined before the stage is complete.
+  final List<NullabilityEdge> _pendingEdges = [];
+
+  /// During and after nullability propagation, a list of all edges that
+  /// couldn't be satisfied.
+  final List<NullabilityEdge> _unsatisfiedEdges = [];
+
+  /// During and after nullability propagation, a list of all substitution nodes
+  /// that couldn't be satisfied.
+  final List<NullabilityNodeForSubstitution> _unsatisfiedSubstitutions = [];
+
+  /// During execution of [_propagateDownstream], a list of all the substitution
+  /// nodes that have not yet been resolved.
+  List<NullabilityNodeForSubstitution> _pendingSubstitutions = [];
+
+  /// After calling [propagate], this getter may be queried to access the set of
+  /// edges that could not be satisfied.
+  Iterable<NullabilityEdge> get unsatisfiedEdges => _unsatisfiedEdges;
+
+  /// After calling [propagate], this getter may be queried to access the set of
+  /// substitution nodes that could not be satisfied.
+  Iterable<NullabilityNodeForSubstitution> get unsatisfiedSubstitutions =>
+      _unsatisfiedSubstitutions;
+
   /// Records that [sourceNode] is immediately upstream from [destinationNode].
   ///
   /// Returns the edge created by the connection.
@@ -123,13 +152,11 @@
 
   /// Determines the nullability of each node in the graph by propagating
   /// nullability information from one node to another.
-  ///
-  /// Returns a list of edges that couldn't be satisfied.
-  List<NullabilityEdge> propagate() {
+  void propagate() {
     if (_debugBeforePropagation) _debugDump();
-    var nullableNodes = _propagateAlways();
+    _propagateAlways();
     _propagateUpstream();
-    return _propagateDownstream(nullableNodes);
+    _propagateDownstream();
   }
 
   /// Records that nodes [x] and [y] should have exactly the same nullability.
@@ -182,79 +209,62 @@
   }
 
   /// Propagates nullability downstream along union edges from "always".
-  ///
-  /// Returns a list of nodes that are nullable after this operation (including
-  /// "always")
-  List<NullabilityNode> _propagateAlways() {
-    var nullableNodes = <NullabilityNode>[always];
-    var pendingEdges = always._downstreamEdges.toList();
-    while (pendingEdges.isNotEmpty) {
-      var edge = pendingEdges.removeLast();
+  void _propagateAlways() {
+    _unionedWithAlways.add(always);
+    _pendingEdges.addAll(always._downstreamEdges);
+    while (_pendingEdges.isNotEmpty) {
+      var edge = _pendingEdges.removeLast();
       if (!edge.isUnion) continue;
       // Union edges always have exactly one source, so we don't need to check
       // whether all sources are nullable.
       assert(edge.sources.length == 1);
       var node = edge.destinationNode;
       if (node is NullabilityNodeMutable && !node.isNullable) {
-        nullableNodes.add(node);
+        _unionedWithAlways.add(node);
         node._state = _NullabilityState.ordinaryNullable;
         // Was not previously nullable, so we need to propagate.
-        pendingEdges.addAll(node._downstreamEdges);
+        _pendingEdges.addAll(node._downstreamEdges);
       }
     }
-    return nullableNodes;
   }
 
   /// Propagates nullability downstream.
-  List<NullabilityEdge> _propagateDownstream(
-      List<NullabilityNode> nullableNodes) {
-    var unsatisfiedEdges = <NullabilityEdge>[];
-    var pendingEdges = <NullabilityEdge>[];
-    for (var node in nullableNodes) {
-      pendingEdges.addAll(node._downstreamEdges);
+  void _propagateDownstream() {
+    assert(_pendingEdges.isEmpty);
+    for (var node in _unionedWithAlways) {
+      _pendingEdges.addAll(node._downstreamEdges);
     }
-    var pendingSubstitutions = <NullabilityNodeForSubstitution>[];
     while (true) {
-      while (pendingEdges.isNotEmpty) {
-        var edge = pendingEdges.removeLast();
+      while (_pendingEdges.isNotEmpty) {
+        var edge = _pendingEdges.removeLast();
         if (!edge._isTriggered) continue;
         var node = edge.destinationNode;
         if (node._state == _NullabilityState.nonNullable) {
           // The node has already been marked as non-nullable, so the edge can't
           // be satisfied.
-          unsatisfiedEdges.add(edge);
+          _unsatisfiedEdges.add(edge);
           continue;
         }
         if (node is NullabilityNodeMutable && !node.isNullable) {
-          node._state = _NullabilityState.ordinaryNullable;
-          // Was not previously nullable, so we need to propagate.
-          pendingEdges.addAll(node._downstreamEdges);
-          if (node is NullabilityNodeForSubstitution) {
-            pendingSubstitutions.add(node);
-          }
+          _setNullable(node);
         }
       }
-      if (pendingSubstitutions.isEmpty) break;
-      var node = pendingSubstitutions.removeLast();
-      if (node.innerNode.isNullable || node.outerNode.isNullable) {
-        // No further propagation is needed, since some other connection already
-        // propagated nullability to either the inner or outer node.
-        continue;
+      if (_pendingSubstitutions.isEmpty) break;
+      var oldPendingSubstitutions = _pendingSubstitutions;
+      _pendingSubstitutions = [];
+      for (var node in oldPendingSubstitutions) {
+        _resolvePendingSubstitution(node);
       }
-      // Heuristically choose to propagate to the inner node since this seems
-      // to lead to better quality migrations.
-      pendingEdges.add(NullabilityEdge._(node.innerNode, const [],
-          _NullabilityEdgeKind.soft, _SubstitutionHeuristicOrigin()));
     }
-    return unsatisfiedEdges;
   }
 
   /// Propagates non-null intent upstream along unconditional control flow
   /// lines.
   void _propagateUpstream() {
-    var pendingEdges = never._upstreamEdges.toList();
-    while (pendingEdges.isNotEmpty) {
-      var edge = pendingEdges.removeLast();
+    assert(_pendingEdges.isEmpty);
+    _pendingEdges.addAll(never._upstreamEdges);
+    while (_pendingEdges.isNotEmpty) {
+      var edge = _pendingEdges.removeLast();
       if (!edge.hard) continue;
       var node = edge.primarySource;
       if (node is NullabilityNodeMutable &&
@@ -262,10 +272,72 @@
         node._state = _NullabilityState.nonNullable;
         // Was not previously in the set of non-null intent nodes, so we need to
         // propagate.
-        pendingEdges.addAll(node._upstreamEdges);
+        _pendingEdges.addAll(node._upstreamEdges);
       }
     }
   }
+
+  void _resolvePendingSubstitution(
+      NullabilityNodeForSubstitution substitutionNode) {
+    assert(substitutionNode._state.isNullable);
+    // If both nodes pointed to by the substitution node are in the non-nullable
+    // state, then no resolution is needed; the substitution node can’t be
+    // satisfied.
+    if (substitutionNode.innerNode._state == _NullabilityState.nonNullable &&
+        substitutionNode.outerNode._state == _NullabilityState.nonNullable) {
+      _unsatisfiedSubstitutions.add(substitutionNode);
+      return;
+    }
+
+    // Otherwise, if the outer node is in a nullable state, then no resolution
+    // is needed because the substitution node is already satisfied.
+    if (substitutionNode.outerNode.isNullable) {
+      return;
+    }
+
+    // Otherwise, if the inner node is in the non-nullable state, then we set
+    // the outer node to the ordinary nullable state.
+    if (substitutionNode.innerNode._state == _NullabilityState.nonNullable) {
+      _setNullable(substitutionNode.outerNode as NullabilityNodeMutable);
+      return;
+    }
+
+    // Otherwise, we set the inner node to the exact nullable state, and we
+    // propagate this state upstream as far as possible using the following
+    // rule: if there is an edge A → B, where A is in the undetermined or
+    // ordinary nullable state, and B is in the exact nullable state, then A’s
+    // state is changed to exact nullable.
+    var pendingNodes = [substitutionNode.innerNode];
+    while (pendingNodes.isNotEmpty) {
+      var node = pendingNodes.removeLast();
+      if (node is NullabilityNodeMutable) {
+        var oldState =
+            _setNullable(node, newState: _NullabilityState.exactNullable);
+        if (oldState != _NullabilityState.exactNullable) {
+          // Was not previously in the "exact nullable" state.  Need to
+          // propagate.
+          for (var edge in node._upstreamEdges) {
+            pendingNodes.add(edge.primarySource);
+          }
+        }
+      }
+    }
+  }
+
+  _NullabilityState _setNullable(NullabilityNodeMutable node,
+      {_NullabilityState newState = _NullabilityState.ordinaryNullable}) {
+    assert(newState.isNullable);
+    var oldState = node._state;
+    node._state = newState;
+    if (!oldState.isNullable) {
+      // Was not previously nullable, so we need to propagate.
+      _pendingEdges.addAll(node._downstreamEdges);
+      if (node is NullabilityNodeForSubstitution) {
+        _pendingSubstitutions.add(node);
+      }
+    }
+    return oldState;
+  }
 }
 
 /// Same as [NullabilityGraph], but extended with extra methods for easier
@@ -360,6 +432,11 @@
   String get debugSuffix => '?($this)';
 
   /// After nullability propagation, this getter can be used to query whether
+  /// the type associated with this node should be considered "exact nullable".
+  @visibleForTesting
+  bool get isExactNullable;
+
+  /// After nullability propagation, this getter can be used to query whether
   /// the type associated with this node should be considered nullable.
   bool get isNullable;
 
@@ -467,6 +544,9 @@
         super._();
 
   @override
+  bool get isExactNullable => _state == _NullabilityState.exactNullable;
+
+  @override
   bool get isNullable => _state.isNullable;
 }
 
@@ -488,6 +568,9 @@
   _NullabilityNodeCompound() : super._();
 
   @override
+  bool get isExactNullable => _components.any((c) => c.isExactNullable);
+
+  @override
   bool get isNullable => _components.any((c) => c.isNullable);
 
   Iterable<NullabilityNode> get _components;
@@ -506,8 +589,11 @@
   String get debugSuffix => isNullable ? '?' : '';
 
   @override
+  bool get isExactNullable => isNullable;
+
+  @override
   _NullabilityState get _state => isNullable
-      ? _NullabilityState.ordinaryNullable
+      ? _NullabilityState.exactNullable
       : _NullabilityState.nonNullable;
 }
 
@@ -552,5 +638,3 @@
   @override
   String toString() => name;
 }
-
-class _SubstitutionHeuristicOrigin extends EdgeOrigin {}
diff --git a/pkg/nnbd_migration/lib/src/potential_modification.dart b/pkg/nnbd_migration/lib/src/potential_modification.dart
index c6059e8..72b4562 100644
--- a/pkg/nnbd_migration/lib/src/potential_modification.dart
+++ b/pkg/nnbd_migration/lib/src/potential_modification.dart
@@ -82,22 +82,23 @@
   }
 }
 
-/// Records information about the possible addition of an import
-/// to the source code.
+/// Records information about the possible addition of an import to the source
+/// code.
 class PotentiallyAddImport extends PotentialModification {
   final _usages = <PotentialModification>[];
 
   final int _offset;
-  final String _importPath;
+  final String importPath;
 
   PotentiallyAddImport(
-      AstNode beforeNode, this._importPath, PotentialModification usage)
-      : _offset = beforeNode.offset {
+      AstNode beforeNode, String importPath, PotentialModification usage)
+      : this.forOffset(beforeNode.offset, importPath, usage);
+
+  PotentiallyAddImport.forOffset(
+      this._offset, this.importPath, PotentialModification usage) {
     _usages.add(usage);
   }
 
-  get importPath => _importPath;
-
   @override
   bool get isEmpty {
     for (PotentialModification usage in _usages) {
@@ -111,7 +112,7 @@
   // TODO(danrubel): change all of dartfix NNBD to use DartChangeBuilder
   @override
   Iterable<SourceEdit> get modifications =>
-      isEmpty ? const [] : [SourceEdit(_offset, 0, "import '$_importPath';\n")];
+      isEmpty ? const [] : [SourceEdit(_offset, 0, "import '$importPath';\n")];
 
   void addUsage(PotentialModification usage) {
     _usages.add(usage);
@@ -124,9 +125,21 @@
   final NullabilityNode _node;
 
   final int _offset;
+  final String className;
+  final String methodName;
+  final String parameterName;
 
-  PotentiallyAddRequired(DefaultFormalParameter parameter, this._node)
-      : _offset = parameter.offset;
+  factory PotentiallyAddRequired(
+      DefaultFormalParameter parameter, NullabilityNode node) {
+    final element = parameter.declaredElement;
+    final method = element.enclosingElement;
+    final cls = method.enclosingElement;
+    return PotentiallyAddRequired._(
+        node, parameter.offset, cls.name, method.name, element.name);
+  }
+
+  PotentiallyAddRequired._(this._node, this._offset, this.className,
+      this.methodName, this.parameterName);
 
   @override
   bool get isEmpty => _node.isNullable;
diff --git a/pkg/nnbd_migration/lib/src/utilities/scoped_set.dart b/pkg/nnbd_migration/lib/src/utilities/scoped_set.dart
new file mode 100644
index 0000000..972f590
--- /dev/null
+++ b/pkg/nnbd_migration/lib/src/utilities/scoped_set.dart
@@ -0,0 +1,80 @@
+// 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/dart/element/element.dart';
+
+/// Tracks scopes of instances to be used by the [EdgeBuilder] for certain
+/// analyses.
+///
+/// For example, [EdgeBuilder] uses this to find post-dominating usages of
+/// locals and parameters to decide where to insert hard edges.
+///
+/// Currently does not implement Set<T> because this has properties undesirable
+/// of a Set, such as state that means different things at different times, and
+/// some of the methods (such as `removeAll()`) may be ambiguous. However, it
+/// may be reasonable to do so, carefully, in the future.
+class ScopedSet<T> {
+  /// The scope stack, where the last element is the current scope, and each
+  /// scope is a list of elements in that scope.
+  final _scopeStack = <Set<T>>[];
+
+  /// Get the current scope. Private so as not to expose to clients.
+  Set<T> get _currentScope => _scopeStack.last;
+
+  /// Add an element to the current scope (and not its parent scopes).
+  void add(T element) {
+    if (_scopeStack.isNotEmpty) {
+      _currentScope.add(element);
+    }
+  }
+
+  /// Add many elements to the current scope (and not its parent scopes).
+  void addAll(Iterable<T> elements) {
+    if (_scopeStack.isNotEmpty) {
+      _currentScope.addAll(elements);
+    }
+  }
+
+  /// Clear each scope in the stack (the stack itself is not affected).
+  ///
+  /// This is useful in post-dominator analysis. Upon non-convergent branching,
+  /// all scopes of potentially post-dominated elements becomes empty.
+  void clearEachScope() => _scopeStack.forEach((scope) => scope.clear());
+
+  /// Create a scope like [pushScope], and use it to perform some [action]
+  /// before popping it.
+  void doScoped(
+      {List<T> elements = const [],
+      bool copyCurrent: false,
+      void Function() action}) {
+    pushScope(elements: elements, copyCurrent: copyCurrent);
+    try {
+      action();
+    } finally {
+      popScope();
+    }
+  }
+
+  /// Look up if the element is in the scope.
+  bool isInScope(T element) =>
+      _scopeStack.isNotEmpty && _currentScope.contains(element);
+
+  /// End the current scope.
+  void popScope() {
+    assert(_scopeStack.isNotEmpty);
+    _scopeStack.removeLast();
+  }
+
+  /// Begin a new scope, optionally with some known starting [elements], or
+  /// copying the current scope, as a starting state.
+  void pushScope({List<T> elements = const [], bool copyCurrent: false}) =>
+      _scopeStack.add({
+        ...elements,
+        if (copyCurrent) ..._currentScope,
+      });
+
+  /// Remove element from the current scope and all containing scopes.
+  void removeFromAllScopes(T t) =>
+      _scopeStack.forEach((scope) => scope.remove(t));
+}
diff --git a/pkg/nnbd_migration/pubspec.yaml b/pkg/nnbd_migration/pubspec.yaml
index bacb556..a91a24f 100644
--- a/pkg/nnbd_migration/pubspec.yaml
+++ b/pkg/nnbd_migration/pubspec.yaml
@@ -3,4 +3,4 @@
 environment:
   sdk: '>=2.2.2 <3.0.0'
 dependencies:
-  analyzer: ^0.36.3
+  analyzer: ^0.37.0
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index e53b981..44d2eac 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -76,6 +76,20 @@
 
 /// Mixin containing test cases for the provisional API.
 mixin _ProvisionalApiTestCases on _ProvisionalApiTestBase {
+  test_assign_null_to_generic_type() async {
+    var content = '''
+main() {
+  List<int> x = null;
+}
+''';
+    var expected = '''
+main() {
+  List<int>? x = null;
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_class_alias_synthetic_constructor_with_parameters() async {
     var content = '''
 void main() {
@@ -474,10 +488,6 @@
     // propagate to a field in the class, and thence (via return values of other
     // methods) to most users of the class.  Whereas if we add nullability at
     // the call site it's possible that other call sites won't need it.
-    //
-    // TODO(paulberry): possible improvement: detect that since C uses T in a
-    // contravariant way, and deduce that test should change to
-    // `void test(C<int?> c)`
     var expected = '''
 class C<T> {
   void f(T t) {}
@@ -485,7 +495,7 @@
 void g(C<int?> c, int? i) {
   c.f(i);
 }
-void test(C<int> c) {
+void test(C<int?> c) {
   g(c, null);
 }
 ''';
@@ -524,14 +534,11 @@
   f(x, null);
 }
 ''';
-    // TODO(paulberry): possible improvement: detect that since add uses T in
-    // a contravariant way, and deduce that test should change to
-    // `void test(List<int?> x)`
     var expected = '''
 void f(List<int?> x, int? i) {
   x.add(i);
 }
-void test(List<int> x) {
+void test(List<int?> x) {
   f(x, null);
 }
 ''';
@@ -889,6 +896,44 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_field_initializer_simple() async {
+    var content = '''
+class C {
+  int f;
+  C(int i) : f = i;
+}
+main() {
+  C(null);
+}
+''';
+    var expected = '''
+class C {
+  int? f;
+  C(int? i) : f = i;
+}
+main() {
+  C(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_field_initializer_typed_list_literal() async {
+    var content = '''
+class C {
+  List<int> f;
+  C() : f = <int>[null];
+}
+''';
+    var expected = '''
+class C {
+  List<int?> f;
+  C() : f = <int?>[null];
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_field_type_inferred() async {
     var content = '''
 int f() => null;
@@ -1008,6 +1053,40 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_generic_exact_propagation() async {
+    var content = '''
+class C<T> {
+  List<T> values;
+  C() : values = <T>[];
+  void add(T t) => values.add(t);
+  T operator[](int i) => values[i];
+}
+void f() {
+  C<int> x = new C<int>();
+  g(x);
+}
+void g(C<int> y) {
+  y.add(null);
+}
+''';
+    var expected = '''
+class C<T> {
+  List<T> values;
+  C() : values = <T>[];
+  void add(T t) => values.add(t);
+  T operator[](int i) => values[i];
+}
+void f() {
+  C<int?> x = new C<int?>();
+  g(x);
+}
+void g(C<int?> y) {
+  y.add(null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_generic_function_type_syntax_inferred_dynamic_return() async {
     var content = '''
 abstract class C {
@@ -1837,6 +1916,28 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_redirecting_constructor_ordinary_to_unnamed() async {
+    var content = '''
+class C {
+  C.named(int i, int j) : this(j, i);
+  C(int j, int i);
+}
+main() {
+  C.named(null, 1);
+}
+''';
+    var expected = '''
+class C {
+  C.named(int? i, int j) : this(j, i);
+  C(int j, int? i);
+}
+main() {
+  C.named(null, 1);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_single_file_multiple_changes() async {
     var content = '''
 int f() => null;
@@ -2124,6 +2225,72 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  test_unconditional_method_call_implies_non_null_intent_after_conditions() async {
+    var content = '''
+void g(bool b, int i1, int i2) {
+  int i3 = i1;
+  if (b) {
+    b;
+  }
+  i3.toDouble();
+  int i4 = i2;
+  if (b) {
+    b;
+    return;
+  }
+  i4.toDouble();
+}
+main() {
+  g(false, null, null);
+}
+''';
+    var expected = '''
+void g(bool b, int i1, int? i2) {
+  int i3 = i1;
+  if (b) {
+    b;
+  }
+  i3.toDouble();
+  int? i4 = i2;
+  if (b) {
+    b;
+    return;
+  }
+  i4!.toDouble();
+}
+main() {
+  g(false, null!, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  test_unconditional_method_call_implies_non_null_intent_in_condition() async {
+    var content = '''
+void g(bool b, int _i) {
+  if (b) {
+    int i = _i;
+    i.toDouble();
+  }
+}
+main() {
+  g(false, null);
+}
+''';
+    var expected = '''
+void g(bool b, int? _i) {
+  if (b) {
+    int i = _i!;
+    i.toDouble();
+  }
+}
+main() {
+  g(false, null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   test_unconditional_non_null_usage_implies_non_null_intent() async {
     var content = '''
 void f(int i, int j) {
diff --git a/pkg/nnbd_migration/test/decorated_class_hierarchy_test.dart b/pkg/nnbd_migration/test/decorated_class_hierarchy_test.dart
index 9e09dca..f244c5a 100644
--- a/pkg/nnbd_migration/test/decorated_class_hierarchy_test.dart
+++ b/pkg/nnbd_migration/test/decorated_class_hierarchy_test.dart
@@ -27,6 +27,25 @@
     return unit;
   }
 
+  test_asInstanceOf_complex() async {
+    await analyze('''
+class Base<T> {}
+class Derived<U> extends Base<List<U>> {}
+Derived<int> x;
+''');
+    var decoratedType = decoratedTypeAnnotation('Derived<int>');
+    var asInstanceOfBase =
+        _hierarchy.asInstanceOf(decoratedType, findElement.class_('Base'));
+    expect(asInstanceOfBase.type.toString(), 'Base<List<int>>');
+    expect(asInstanceOfBase.node, same(decoratedType.node));
+    var listOfUType = decoratedTypeAnnotation('List<U>');
+    expect(asInstanceOfBase.typeArguments[0].node, same(listOfUType.node));
+    var substitution = asInstanceOfBase.typeArguments[0].typeArguments[0].node
+        as NullabilityNodeForSubstitution;
+    expect(substitution.innerNode, same(decoratedType.typeArguments[0].node));
+    expect(substitution.outerNode, same(listOfUType.typeArguments[0].node));
+  }
+
   test_getDecoratedSupertype_complex() async {
     await analyze('''
 class Base<T> {}
diff --git a/pkg/nnbd_migration/test/decorated_type_test.dart b/pkg/nnbd_migration/test/decorated_type_test.dart
index bd63ab4..7e94d86 100644
--- a/pkg/nnbd_migration/test/decorated_type_test.dart
+++ b/pkg/nnbd_migration/test/decorated_type_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/element/type.dart';
+import 'package:analyzer/src/dart/element/type.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:test/test.dart';
@@ -27,6 +29,19 @@
     super.setUp();
   }
 
+  test_toString_bottom() async {
+    var decoratedType = DecoratedType(BottomTypeImpl.instance, _node(1));
+    expect(decoratedType.toString(), 'Never?(type(1))');
+  }
+
+  test_toString_interface_type_argument() async {
+    await resolveTestUnit('''List<int> x;''');
+    var type = findElement.topVar('x').type as InterfaceType;
+    var decoratedType = DecoratedType(type, always,
+        typeArguments: [DecoratedType(type.typeArguments[0], _node(1))]);
+    expect(decoratedType.toString(), 'List<int?(type(1))>?');
+  }
+
   test_toString_named_parameter() async {
     await resolveTestUnit('''dynamic f({int x}) {}''');
     var type = findElement.function('f').type;
diff --git a/pkg/nnbd_migration/test/edge_builder_test.dart b/pkg/nnbd_migration/test/edge_builder_test.dart
index 0996ae3..cd1f159 100644
--- a/pkg/nnbd_migration/test/edge_builder_test.dart
+++ b/pkg/nnbd_migration/test/edge_builder_test.dart
@@ -4,9 +4,17 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
+import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/member.dart';
+import 'package:analyzer/src/dart/element/type.dart';
+import 'package:analyzer/src/generated/resolver.dart';
+import 'package:analyzer/src/generated/testing/test_type_provider.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
+import 'package:nnbd_migration/src/decorated_class_hierarchy.dart';
 import 'package:nnbd_migration/src/decorated_type.dart';
 import 'package:nnbd_migration/src/edge_builder.dart';
+import 'package:nnbd_migration/src/edge_origin.dart';
 import 'package:nnbd_migration/src/expression_checks.dart';
 import 'package:nnbd_migration/src/nullability_node.dart';
 import 'package:test/test.dart';
@@ -16,11 +24,335 @@
 
 main() {
   defineReflectiveSuite(() {
+    defineReflectiveTests(AssignmentCheckerTest);
     defineReflectiveTests(EdgeBuilderTest);
   });
 }
 
 @reflectiveTest
+class AssignmentCheckerTest extends Object with EdgeTester {
+  static const EdgeOrigin origin = const _TestEdgeOrigin();
+
+  ClassElement _myListOfListClass;
+
+  DecoratedType _myListOfListSupertype;
+
+  final TypeProvider typeProvider;
+
+  final NullabilityGraphForTesting graph;
+
+  final AssignmentCheckerForTesting checker;
+
+  int offset = 0;
+
+  factory AssignmentCheckerTest() {
+    var typeProvider = TestTypeProvider();
+    var graph = NullabilityGraphForTesting();
+    var decoratedClassHierarchy = _DecoratedClassHierarchyForTesting();
+    var checker = AssignmentCheckerForTesting(
+        Dart2TypeSystem(typeProvider), graph, decoratedClassHierarchy);
+    var assignmentCheckerTest =
+        AssignmentCheckerTest._(typeProvider, graph, checker);
+    decoratedClassHierarchy.assignmentCheckerTest = assignmentCheckerTest;
+    return assignmentCheckerTest;
+  }
+
+  AssignmentCheckerTest._(this.typeProvider, this.graph, this.checker);
+
+  NullabilityNode get always => graph.always;
+
+  DecoratedType get bottom => DecoratedType(typeProvider.bottomType, never);
+
+  DecoratedType get dynamic_ => DecoratedType(typeProvider.dynamicType, always);
+
+  NullabilityNode get never => graph.never;
+
+  DecoratedType get null_ => DecoratedType(typeProvider.nullType, always);
+
+  DecoratedType get void_ => DecoratedType(typeProvider.voidType, always);
+
+  void assign(DecoratedType source, DecoratedType destination,
+      {bool hard = false}) {
+    checker.checkAssignment(origin,
+        source: source, destination: destination, hard: hard);
+  }
+
+  DecoratedType function(DecoratedType returnType,
+      {List<DecoratedType> required = const [],
+      List<DecoratedType> positional = const [],
+      Map<String, DecoratedType> named = const {}}) {
+    int i = 0;
+    var parameters = required
+        .map((t) => ParameterElementImpl.synthetic(
+            'p${i++}', t.type, ParameterKind.REQUIRED))
+        .toList();
+    parameters.addAll(positional.map((t) => ParameterElementImpl.synthetic(
+        'p${i++}', t.type, ParameterKind.POSITIONAL)));
+    parameters.addAll(named.entries.map((e) => ParameterElementImpl.synthetic(
+        e.key, e.value.type, ParameterKind.NAMED)));
+    return DecoratedType(
+        FunctionTypeImpl.synthetic(returnType.type, const [], parameters),
+        NullabilityNode.forTypeAnnotation(offset++),
+        returnType: returnType,
+        positionalParameters: required.toList()..addAll(positional),
+        namedParameters: named);
+  }
+
+  DecoratedType list(DecoratedType elementType) => DecoratedType(
+      typeProvider.listType.instantiate([elementType.type]),
+      NullabilityNode.forTypeAnnotation(offset++),
+      typeArguments: [elementType]);
+
+  DecoratedType myListOfList(DecoratedType elementType) {
+    if (_myListOfListClass == null) {
+      var t = TypeParameterElementImpl.synthetic('T')..bound = object().type;
+      _myListOfListSupertype = list(list(typeParameterType(t)));
+      _myListOfListClass = ClassElementImpl('MyListOfList', 0)
+        ..typeParameters = [t]
+        ..supertype = _myListOfListSupertype.type as InterfaceType;
+    }
+    return DecoratedType(
+        InterfaceTypeImpl(_myListOfListClass)
+          ..typeArguments = [elementType.type],
+        NullabilityNode.forTypeAnnotation(offset++),
+        typeArguments: [elementType]);
+  }
+
+  DecoratedType object() => DecoratedType(
+      typeProvider.objectType, NullabilityNode.forTypeAnnotation(offset++));
+
+  void test_bottom_to_generic() {
+    var t = list(object());
+    assign(bottom, t);
+    assertEdge(never, t.node, hard: false);
+    expect(graph.getUpstreamEdges(t.typeArguments[0].node), isEmpty);
+  }
+
+  void test_bottom_to_simple() {
+    var t = object();
+    assign(bottom, t);
+    assertEdge(never, t.node, hard: false);
+  }
+
+  void test_complex_to_typeParam() {
+    var bound = list(object());
+    var t = TypeParameterElementImpl.synthetic('T')..bound = bound.type;
+    checker.bounds[t] = bound;
+    var t1 = list(object());
+    var t2 = typeParameterType(t);
+    assign(t1, t2, hard: true);
+    assertEdge(t1.node, t2.node, hard: true);
+    assertNoEdge(t1.node, bound.node);
+    assertEdge(t1.typeArguments[0].node, bound.typeArguments[0].node,
+        hard: false);
+  }
+
+  void test_dynamic_to_dynamic() {
+    assign(dynamic_, dynamic_);
+    // Note: no assertions to do; just need to make sure there wasn't a crash.
+  }
+
+  void test_function_type_named_parameter() {
+    var t1 = function(dynamic_, named: {'x': object()});
+    var t2 = function(dynamic_, named: {'x': object()});
+    assign(t1, t2, hard: true);
+    // Note: t1 and t2 are swapped due to contravariance.
+    assertEdge(t2.namedParameters['x'].node, t1.namedParameters['x'].node,
+        hard: false);
+  }
+
+  void test_function_type_named_to_no_parameter() {
+    var t1 = function(dynamic_, named: {'x': object()});
+    var t2 = function(dynamic_);
+    assign(t1, t2);
+    // Note: no assertions to do; just need to make sure there wasn't a crash.
+  }
+
+  void test_function_type_positional_parameter() {
+    var t1 = function(dynamic_, positional: [object()]);
+    var t2 = function(dynamic_, positional: [object()]);
+    assign(t1, t2, hard: true);
+    // Note: t1 and t2 are swapped due to contravariance.
+    assertEdge(t2.positionalParameters[0].node, t1.positionalParameters[0].node,
+        hard: false);
+  }
+
+  void test_function_type_positional_to_no_parameter() {
+    var t1 = function(dynamic_, positional: [object()]);
+    var t2 = function(dynamic_);
+    assign(t1, t2);
+    // Note: no assertions to do; just need to make sure there wasn't a crash.
+  }
+
+  void test_function_type_positional_to_required_parameter() {
+    var t1 = function(dynamic_, positional: [object()]);
+    var t2 = function(dynamic_, required: [object()]);
+    assign(t1, t2, hard: true);
+    // Note: t1 and t2 are swapped due to contravariance.
+    assertEdge(t2.positionalParameters[0].node, t1.positionalParameters[0].node,
+        hard: false);
+  }
+
+  void test_function_type_required_parameter() {
+    var t1 = function(dynamic_, required: [object()]);
+    var t2 = function(dynamic_, required: [object()]);
+    assign(t1, t2);
+    // Note: t1 and t2 are swapped due to contravariance.
+    assertEdge(t2.positionalParameters[0].node, t1.positionalParameters[0].node,
+        hard: false);
+  }
+
+  void test_function_type_return_type() {
+    var t1 = function(object());
+    var t2 = function(object());
+    assign(t1, t2, hard: true);
+    assertEdge(t1.returnType.node, t2.returnType.node, hard: false);
+  }
+
+  test_generic_to_dynamic() {
+    var t = list(object());
+    assign(t, dynamic_);
+    assertEdge(t.node, always, hard: false);
+    expect(graph.getDownstreamEdges(t.typeArguments[0].node), isEmpty);
+  }
+
+  test_generic_to_generic_downcast() {
+    var t1 = list(list(object()));
+    var t2 = myListOfList(object());
+    assign(t1, t2, hard: true);
+    assertEdge(t1.node, t2.node, hard: true);
+    // Let A, B, and C be nullability nodes such that:
+    // - t2 is MyListOfList<Object?A>
+    var a = t2.typeArguments[0].node;
+    // - t1 is List<List<Object?B>>
+    var b = t1.typeArguments[0].typeArguments[0].node;
+    // - the supertype of MyListOfList<T> is List<List<T?C>>
+    var c = _myListOfListSupertype.typeArguments[0].typeArguments[0].node;
+    // Then there should be an edge from b to substitute(a, c)
+    var substitutionNode = graph.getDownstreamEdges(b).single.destinationNode
+        as NullabilityNodeForSubstitution;
+    expect(substitutionNode.innerNode, same(a));
+    expect(substitutionNode.outerNode, same(c));
+  }
+
+  test_generic_to_generic_same_element() {
+    var t1 = list(object());
+    var t2 = list(object());
+    assign(t1, t2, hard: true);
+    assertEdge(t1.node, t2.node, hard: true);
+    assertEdge(t1.typeArguments[0].node, t2.typeArguments[0].node, hard: false);
+  }
+
+  test_generic_to_generic_upcast() {
+    var t1 = myListOfList(object());
+    var t2 = list(list(object()));
+    assign(t1, t2);
+    assertEdge(t1.node, t2.node, hard: false);
+    // Let A, B, and C be nullability nodes such that:
+    // - t1 is MyListOfList<Object?A>
+    var a = t1.typeArguments[0].node;
+    // - t2 is List<List<Object?B>>
+    var b = t2.typeArguments[0].typeArguments[0].node;
+    // - the supertype of MyListOfList<T> is List<List<T?C>>
+    var c = _myListOfListSupertype.typeArguments[0].typeArguments[0].node;
+    // Then there should be an edge from substitute(a, c) to b.
+    var substitutionNode = graph.getUpstreamEdges(b).single.primarySource
+        as NullabilityNodeForSubstitution;
+    expect(substitutionNode.innerNode, same(a));
+    expect(substitutionNode.outerNode, same(c));
+  }
+
+  test_generic_to_object() {
+    var t1 = list(object());
+    var t2 = object();
+    assign(t1, t2);
+    assertEdge(t1.node, t2.node, hard: false);
+    expect(graph.getDownstreamEdges(t1.typeArguments[0].node), isEmpty);
+  }
+
+  test_generic_to_void() {
+    var t = list(object());
+    assign(t, void_);
+    assertEdge(t.node, always, hard: false);
+    expect(graph.getDownstreamEdges(t.typeArguments[0].node), isEmpty);
+  }
+
+  void test_null_to_generic() {
+    var t = list(object());
+    assign(null_, t);
+    assertEdge(always, t.node, hard: false);
+    expect(graph.getUpstreamEdges(t.typeArguments[0].node), isEmpty);
+  }
+
+  void test_null_to_simple() {
+    var t = object();
+    assign(null_, t);
+    assertEdge(always, t.node, hard: false);
+  }
+
+  test_simple_to_dynamic() {
+    var t = object();
+    assign(t, dynamic_);
+    assertEdge(t.node, always, hard: false);
+  }
+
+  test_simple_to_simple() {
+    var t1 = object();
+    var t2 = object();
+    assign(t1, t2);
+    assertEdge(t1.node, t2.node, hard: false);
+  }
+
+  test_simple_to_simple_hard() {
+    var t1 = object();
+    var t2 = object();
+    assign(t1, t2, hard: true);
+    assertEdge(t1.node, t2.node, hard: true);
+  }
+
+  test_simple_to_void() {
+    var t = object();
+    assign(t, void_);
+    assertEdge(t.node, always, hard: false);
+  }
+
+  void test_typeParam_to_complex() {
+    var bound = list(object());
+    var t = TypeParameterElementImpl.synthetic('T')..bound = bound.type;
+    checker.bounds[t] = bound;
+    var t1 = typeParameterType(t);
+    var t2 = list(object());
+    assign(t1, t2, hard: true);
+    assertEdge(t1.node, t2.node, hard: true);
+    assertEdge(bound.node, t2.node, hard: false);
+    assertEdge(bound.typeArguments[0].node, t2.typeArguments[0].node,
+        hard: false);
+  }
+
+  void test_typeParam_to_object() {
+    var bound = object();
+    var t = TypeParameterElementImpl.synthetic('T')..bound = bound.type;
+    checker.bounds[t] = bound;
+    var t1 = typeParameterType(t);
+    var t2 = object();
+    assign(t1, t2);
+    assertEdge(t1.node, t2.node, hard: false);
+  }
+
+  void test_typeParam_to_typeParam() {
+    var t = TypeParameterElementImpl.synthetic('T')..bound = object().type;
+    var t1 = typeParameterType(t);
+    var t2 = typeParameterType(t);
+    assign(t1, t2);
+    assertEdge(t1.node, t2.node, hard: false);
+  }
+
+  DecoratedType typeParameterType(TypeParameterElement typeParameter) =>
+      DecoratedType(
+          typeParameter.type, NullabilityNode.forTypeAnnotation(offset++));
+}
+
+@reflectiveTest
 class EdgeBuilderTest extends MigrationVisitorTestBase {
   /// Analyzes the given source code, producing constraint variables and
   /// constraints for it.
@@ -92,6 +424,48 @@
     assertEdge(decoratedTypeAnnotation('int i').node, never, hard: true);
   }
 
+  test_assign_bound_to_type_parameter() async {
+    await analyze('''
+class C<T extends List<int>> {
+  T f(List<int> x) => x;
+}
+''');
+    var boundType = decoratedTypeAnnotation('List<int>>');
+    var parameterType = decoratedTypeAnnotation('List<int> x');
+    var tType = decoratedTypeAnnotation('T f');
+    assertEdge(parameterType.node, tType.node, hard: true);
+    assertNoEdge(parameterType.node, boundType.node);
+    assertEdge(
+        parameterType.typeArguments[0].node, boundType.typeArguments[0].node,
+        hard: false);
+  }
+
+  test_assign_null_to_generic_type() async {
+    await analyze('''
+main() {
+  List<int> x = null;
+}
+''');
+    // TODO(paulberry): edge should be hard.
+    assertEdge(always, decoratedTypeAnnotation('List').node, hard: false);
+  }
+
+  test_assign_type_parameter_to_bound() async {
+    await analyze('''
+class C<T extends List<int>> {
+  List<int> f(T x) => x;
+}
+''');
+    var boundType = decoratedTypeAnnotation('List<int>>');
+    var returnType = decoratedTypeAnnotation('List<int> f');
+    var tType = decoratedTypeAnnotation('T x');
+    assertEdge(tType.node, returnType.node, hard: true);
+    assertEdge(boundType.node, returnType.node, hard: false);
+    assertEdge(
+        boundType.typeArguments[0].node, returnType.typeArguments[0].node,
+        hard: false);
+  }
+
   test_assignmentExpression_field() async {
     await analyze('''
 class C {
@@ -925,6 +1299,53 @@
     expect(constructorDecoratedType.returnType.typeArguments, isEmpty);
   }
 
+  test_constructorFieldInitializer_generic() async {
+    await analyze('''
+class C<T> {
+  C(T/*1*/ x) : f = x;
+  T/*2*/ f;
+}
+''');
+    assertEdge(decoratedTypeAnnotation('T/*1*/').node,
+        decoratedTypeAnnotation('T/*2*/').node,
+        hard: true);
+  }
+
+  test_constructorFieldInitializer_simple() async {
+    await analyze('''
+class C {
+  C(int/*1*/ i) : f = i;
+  int/*2*/ f;
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int/*1*/').node,
+        decoratedTypeAnnotation('int/*2*/').node,
+        hard: true);
+  }
+
+  test_constructorFieldInitializer_via_this() async {
+    await analyze('''
+class C {
+  C(int/*1*/ i) : this.f = i;
+  int/*2*/ f;
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int/*1*/').node,
+        decoratedTypeAnnotation('int/*2*/').node,
+        hard: true);
+  }
+
+  test_do_while_condition() async {
+    await analyze('''
+void f(bool b) {
+  do {} while (b);
+}
+''');
+
+    assertNullCheck(checkExpression('b);'),
+        assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+  }
+
   test_doubleLiteral() async {
     await analyze('''
 double f() {
@@ -959,13 +1380,13 @@
     var fieldType = variables.decoratedElementType(findElement.field('f'));
     assertEdge(ctorParamType.node, fieldType.node, hard: true);
     assertEdge(ctorParamType.returnType.node, fieldType.returnType.node,
-        hard: true);
+        hard: false);
     assertEdge(fieldType.positionalParameters[0].node,
         ctorParamType.positionalParameters[0].node,
-        hard: true);
+        hard: false);
     assertEdge(fieldType.namedParameters['j'].node,
         ctorParamType.namedParameters['j'].node,
-        hard: true);
+        hard: false);
   }
 
   test_fieldFormalParameter_typed() async {
@@ -1632,6 +2053,24 @@
     assertUnion(bReturnType.node, cReturnType.node);
   }
 
+  test_methodDeclaration_doesntAffect_unconditional_control_flow() async {
+    await analyze('''
+class C {
+  void f(bool b, int i, int j) {
+    assert(i != null);
+    if (b) {}
+    assert(j != null);
+  }
+  void g(int k) {
+    assert(k != null);
+  }
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int i').node, never, hard: true);
+    assertNoEdge(always, decoratedTypeAnnotation('int j').node);
+    assertEdge(decoratedTypeAnnotation('int k').node, never, hard: true);
+  }
+
   test_methodDeclaration_resets_unconditional_control_flow() async {
     await analyze('''
 class C {
@@ -2047,6 +2486,445 @@
         assertEdge(always, decoratedTypeAnnotation('int').node, hard: false));
   }
 
+  test_postDominators_assert() async {
+    await analyze('''
+void test(bool b1, bool b2, bool b3, bool _b) {
+  assert(b1 != null);
+  if (_b) {
+    assert(b2 != null);
+  }
+  assert(b3 != null);
+}
+''');
+
+    assertEdge(decoratedTypeAnnotation('bool b1').node, never, hard: true);
+    assertNoEdge(decoratedTypeAnnotation('bool b2').node, never);
+    assertEdge(decoratedTypeAnnotation('bool b3').node, never, hard: true);
+  }
+
+  test_postDominators_break() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b1, C _c) {
+  while (b1/*check*/) {
+    bool b2 = b1;
+    C c = _c;
+    if (b2/*check*/) {
+      break;
+    }
+    c.m();
+  }
+}
+''');
+
+    // TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b1/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b1').node, never, hard: true));
+    assertNullCheck(checkExpression('b2/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b2').node, never, hard: true));
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: false));
+  }
+
+  test_postDominators_continue() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b1, C _c) {
+  while (b1/*check*/) {
+    bool b2 = b1;
+    C c = _c;
+    if (b2/*check*/) {
+      continue;
+    }
+    c.m();
+  }
+}
+''');
+
+    // TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b1/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b1').node, never, hard: true));
+    assertNullCheck(checkExpression('b2/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b2').node, never, hard: true));
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: false));
+  }
+
+  test_postDominators_doWhileStatement_conditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b, C c) {
+  do {
+    return;
+  } while(b/*check*/);
+
+  c.m();
+}
+''');
+
+    // TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: false));
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: false));
+  }
+
+  test_postDominators_doWhileStatement_unconditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b, C c1, C c2) {
+  do {
+    C c3 = C();
+    c1.m();
+    c3.m();
+  } while(b/*check*/);
+
+  c2.m();
+}
+''');
+
+    // TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: true));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: true));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: true));
+  }
+
+  test_postDominators_forInStatement_unconditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(List<C> l, C c1, C c2) {
+  for (C c3 in l) {
+    c1.m();
+    c3.m();
+  }
+
+  c2.m();
+}
+''');
+
+    //TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('l/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('List<C> l').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: true));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: false));
+  }
+
+  test_postDominators_forStatement_unconditional() async {
+    await analyze('''
+
+class C {
+  void m() {}
+}
+void test(bool b1, C c1, C c2, C c3) {
+  for (bool b2 = b1, b3 = b1; b1/*check*/ & b2/*check*/; c3.m()) {
+    c1.m();
+    assert(b3 != null);
+  }
+
+  c2.m();
+}
+''');
+
+    //TODO(mfairhurst): enable this check
+    assertNullCheck(checkExpression('b1/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b1').node, never, hard: true));
+    //assertNullCheck(checkExpression('b2/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b2').node, never, hard: true));
+    //assertEdge(decoratedTypeAnnotation('b3 =').node, never, hard: false);
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: true));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: false));
+  }
+
+  test_postDominators_ifStatement_conditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b, C c1, C c2) {
+  if (b/*check*/) {
+    C c3 = C();
+    C c4 = C();
+    c1.m();
+    c3.m();
+
+    // Divergence breaks post-dominance.
+    return;
+    c4.m();
+
+  }
+  c2.m();
+}
+''');
+
+    assertNullCheck(checkExpression('b/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: false));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: true));
+    assertNullCheck(checkExpression('c4.m'),
+        assertEdge(decoratedTypeAnnotation('C c4').node, never, hard: false));
+  }
+
+  test_postDominators_ifStatement_unconditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b, C c1, C c2) {
+  if (b/*check*/) {
+    C c3 = C();
+    C c4 = C();
+    c1.m();
+    c3.m();
+
+    // We ignore exceptions for post-dominance.
+    throw '';
+    c4.m();
+
+  }
+  c2.m();
+}
+''');
+
+    assertNullCheck(checkExpression('b/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: true));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: true));
+    assertNullCheck(checkExpression('c4.m'),
+        assertEdge(decoratedTypeAnnotation('C c4').node, never, hard: true));
+  }
+
+  test_postDominators_inReturn_local() async {
+    await analyze('''
+class C {
+  int m() => 0;
+}
+int test(C c) {
+  return c.m();
+}
+''');
+
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: true));
+  }
+
+  test_postDominators_loopReturn() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b1, C _c) {
+  C c1 = _c;
+  while (b1/*check*/) {
+    bool b2 = b1;
+    C c2 = _c;
+    if (b2/*check*/) {
+      return;
+    }
+    c2.m();
+  }
+  c1.m();
+}
+''');
+
+    // TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b1/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b1').node, never, hard: true));
+    assertNullCheck(checkExpression('b2/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b2').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: false));
+  }
+
+  test_postDominators_reassign() async {
+    await analyze('''
+void test(bool b, int i1, int i2) {
+  i1 = null;
+  i1.toDouble();
+  if (b) {
+    i2 = null;
+  }
+  i2.toDouble();
+}
+''');
+
+    assertNullCheck(checkExpression('i1.toDouble'),
+        assertEdge(decoratedTypeAnnotation('int i1').node, never, hard: false));
+
+    assertNullCheck(checkExpression('i2.toDouble'),
+        assertEdge(decoratedTypeAnnotation('int i2').node, never, hard: false));
+  }
+
+  test_postDominators_shortCircuitOperators() async {
+    await analyze('''
+class C {
+  bool m() => true;
+}
+void test(C c1, C c2, C c3, C c4) {
+  c1.m() && c2.m();
+  c3.m() || c4.m();
+}
+''');
+
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: true));
+
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: true));
+
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: false));
+
+    assertNullCheck(checkExpression('c4.m'),
+        assertEdge(decoratedTypeAnnotation('C c4').node, never, hard: false));
+  }
+
+  @failingTest
+  test_postDominators_subFunction() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test() {
+  (C c) {
+    c.m();
+  };
+}
+''');
+
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: true));
+  }
+
+  @failingTest
+  test_postDominators_subFunction_ifStatement_conditional() async {
+    // Failing because function expressions aren't implemented
+    await analyze('''
+class C {
+  void m() {}
+}
+void test() {
+  (bool b, C c) {
+    if (b/*check*/) {
+      return;
+    }
+    c.m();
+  };
+}
+''');
+
+    assertNullCheck(checkExpression('b/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: false));
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: false));
+  }
+
+  @failingTest
+  test_postDominators_subFunction_ifStatement_unconditional() async {
+    // Failing because function expressions aren't implemented
+    await analyze('''
+class C {
+  void m() {}
+}
+void test() {
+  (bool b, C c) {
+    if (b/*check*/) {
+    }
+    c.m();
+  };
+}
+''');
+
+    assertNullCheck(checkExpression('b/*check*/'),
+        assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+    assertNullCheck(checkExpression('c.m'),
+        assertEdge(decoratedTypeAnnotation('C c').node, never, hard: true));
+  }
+
+  test_postDominators_ternaryOperator() async {
+    await analyze('''
+class C {
+  bool m() => true;
+}
+void test(C c1, C c2, C c3, C c4) {
+  c1.m() ? c2.m() : c3.m();
+
+  c4.m();
+}
+''');
+
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: true));
+
+    assertNullCheck(checkExpression('c4.m'),
+        assertEdge(decoratedTypeAnnotation('C c4').node, never, hard: true));
+
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: false));
+
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: false));
+  }
+
+  test_postDominators_whileStatement_unconditional() async {
+    await analyze('''
+class C {
+  void m() {}
+}
+void test(bool b, C c1, C c2) {
+  while (b/*check*/) {
+    C c3 = C();
+    c1.m();
+    c3.m();
+  }
+
+  c2.m();
+}
+''');
+
+    //TODO(mfairhurst): enable this check
+    //assertNullCheck(checkExpression('b/*check*/'),
+    //    assertEdge(decoratedTypeAnnotation('bool b').node, never, hard: true));
+    assertNullCheck(checkExpression('c1.m'),
+        assertEdge(decoratedTypeAnnotation('C c1').node, never, hard: false));
+    assertNullCheck(checkExpression('c2.m'),
+        assertEdge(decoratedTypeAnnotation('C c2').node, never, hard: true));
+    assertNullCheck(checkExpression('c3.m'),
+        assertEdge(decoratedTypeAnnotation('C c3').node, never, hard: true));
+  }
+
   test_postfixExpression_minusMinus() async {
     await analyze('''
 int f(int i) {
@@ -2317,6 +3195,21 @@
         hard: true);
   }
 
+  test_redirecting_constructor_ordinary_to_unnamed() async {
+    await analyze('''
+class C {
+  C.named(int/*1*/ i, int/*2*/ j) : this(j, i);
+  C(int/*3*/ j, int/*4*/ i);
+}
+''');
+    assertEdge(decoratedTypeAnnotation('int/*1*/').node,
+        decoratedTypeAnnotation('int/*4*/').node,
+        hard: true);
+    assertEdge(decoratedTypeAnnotation('int/*2*/').node,
+        decoratedTypeAnnotation('int/*3*/').node,
+        hard: true);
+  }
+
   test_return_from_async_future() async {
     await analyze('''
 Future<int> f() async {
@@ -2344,7 +3237,7 @@
 ''');
     var int1 = decoratedTypeAnnotation('int/*1*/');
     var int2 = decoratedTypeAnnotation('int/*2*/');
-    assertEdge(int2.node, int1.node, hard: true);
+    assertEdge(int2.node, int1.node, hard: false);
   }
 
   test_return_implicit_null() async {
@@ -2803,3 +3696,32 @@
         hard: true);
   }
 }
+
+class _DecoratedClassHierarchyForTesting implements DecoratedClassHierarchy {
+  AssignmentCheckerTest assignmentCheckerTest;
+
+  @override
+  DecoratedType asInstanceOf(DecoratedType type, ClassElement superclass) {
+    var class_ = (type.type as InterfaceType).element;
+    if (class_ == superclass) return type;
+    if (superclass.name == 'Object') {
+      return DecoratedType(superclass.type, type.node);
+    }
+    if (class_.name == 'MyListOfList' && superclass.name == 'List') {
+      return assignmentCheckerTest._myListOfListSupertype
+          .substitute({class_.typeParameters[0]: type.typeArguments[0]});
+    }
+    throw UnimplementedError(
+        'TODO(paulberry): asInstanceOf($type, $superclass)');
+  }
+
+  @override
+  DecoratedType getDecoratedSupertype(
+      ClassElement class_, ClassElement superclass) {
+    throw UnimplementedError('TODO(paulberry)');
+  }
+}
+
+class _TestEdgeOrigin extends EdgeOrigin {
+  const _TestEdgeOrigin();
+}
diff --git a/pkg/nnbd_migration/test/migration_visitor_test_base.dart b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
index f1c70ba..76bf6a1 100644
--- a/pkg/nnbd_migration/test/migration_visitor_test_base.dart
+++ b/pkg/nnbd_migration/test/migration_visitor_test_base.dart
@@ -17,6 +17,52 @@
 
 import 'abstract_single_unit.dart';
 
+/// Mixin allowing unit tests to check for the presence of graph edges.
+mixin EdgeTester {
+  NullabilityGraphForTesting get graph;
+
+  NullabilityEdge assertEdge(
+      NullabilityNode source, NullabilityNode destination,
+      {@required bool hard, List<NullabilityNode> guards = const []}) {
+    var edges = getEdges(source, destination);
+    if (edges.length == 0) {
+      fail('Expected edge $source -> $destination, found none');
+    } else if (edges.length != 1) {
+      fail('Found multiple edges $source -> $destination');
+    } else {
+      var edge = edges[0];
+      expect(edge.hard, hard);
+      expect(edge.guards, unorderedEquals(guards));
+      return edge;
+    }
+  }
+
+  void assertNoEdge(NullabilityNode source, NullabilityNode destination) {
+    var edges = getEdges(source, destination);
+    if (edges.isNotEmpty) {
+      fail('Expected no edge $source -> $destination, found ${edges.length}');
+    }
+  }
+
+  void assertUnion(NullabilityNode x, NullabilityNode y) {
+    var edges = getEdges(x, y);
+    for (var edge in edges) {
+      if (edge.isUnion) {
+        expect(edge.sources, hasLength(1));
+        return;
+      }
+    }
+    fail('Expected union between $x and $y, not found');
+  }
+
+  List<NullabilityEdge> getEdges(
+          NullabilityNode source, NullabilityNode destination) =>
+      graph
+          .getUpstreamEdges(destination)
+          .where((e) => e.primarySource == source)
+          .toList();
+}
+
 /// Mock representation of constraint variables.
 class InstrumentedVariables extends Variables {
   final _conditionalDiscard = <AstNode, ConditionalDiscard>{};
@@ -81,7 +127,7 @@
   }
 }
 
-class MigrationVisitorTestBase extends AbstractSingleUnitTest {
+class MigrationVisitorTestBase extends AbstractSingleUnitTest with EdgeTester {
   final InstrumentedVariables variables;
 
   final NullabilityGraphForTesting graph;
@@ -106,40 +152,6 @@
     return testUnit;
   }
 
-  NullabilityEdge assertEdge(
-      NullabilityNode source, NullabilityNode destination,
-      {@required bool hard, List<NullabilityNode> guards = const []}) {
-    var edges = getEdges(source, destination);
-    if (edges.length == 0) {
-      fail('Expected edge $source -> $destination, found none');
-    } else if (edges.length != 1) {
-      fail('Found multiple edges $source -> $destination');
-    } else {
-      var edge = edges[0];
-      expect(edge.hard, hard);
-      expect(edge.guards, unorderedEquals(guards));
-      return edge;
-    }
-  }
-
-  void assertNoEdge(NullabilityNode source, NullabilityNode destination) {
-    var edges = getEdges(source, destination);
-    if (edges.isNotEmpty) {
-      fail('Expected no edge $source -> $destination, found ${edges.length}');
-    }
-  }
-
-  void assertUnion(NullabilityNode x, NullabilityNode y) {
-    var edges = getEdges(x, y);
-    for (var edge in edges) {
-      if (edge.isUnion) {
-        expect(edge.sources, hasLength(1));
-        return;
-      }
-    }
-    fail('Expected union between $x and $y, not found');
-  }
-
   /// Gets the [DecoratedType] associated with the constructor declaration whose
   /// name matches [search].
   DecoratedType decoratedConstructorDeclaration(String search) => variables
@@ -168,13 +180,6 @@
         testSource, findNode.typeAnnotation(text));
   }
 
-  List<NullabilityEdge> getEdges(
-          NullabilityNode source, NullabilityNode destination) =>
-      graph
-          .getUpstreamEdges(destination)
-          .where((e) => e.primarySource == source)
-          .toList();
-
   NullabilityNode possiblyOptionalParameter(String text) {
     return variables.possiblyOptionalParameter(findNode.defaultParameter(text));
   }
diff --git a/pkg/nnbd_migration/test/node_builder_test.dart b/pkg/nnbd_migration/test/node_builder_test.dart
index fbfab3b..19a2546 100644
--- a/pkg/nnbd_migration/test/node_builder_test.dart
+++ b/pkg/nnbd_migration/test/node_builder_test.dart
@@ -191,6 +191,21 @@
     expect(decoratedType.node, same(never));
   }
 
+  test_constructor_metadata() async {
+    await analyze('''
+class A {
+  final Object x;
+  const A(this.x);
+}
+class C {
+  @A(<int>[])
+  C();
+}
+''');
+    var node = decoratedTypeAnnotation('int').node;
+    expect(node, TypeMatcher<NullabilityNodeMutable>());
+  }
+
   test_constructor_returnType_implicit_dynamic() async {
     await analyze('''
 class C {
@@ -201,6 +216,17 @@
     expect(decoratedType.node, same(never));
   }
 
+  test_constructorFieldInitializer_visit_expression() async {
+    await analyze('''
+class C {
+  C() : f = <int>[];
+  Object f;
+}
+''');
+    var node = decoratedTypeAnnotation('int').node;
+    expect(node, TypeMatcher<NullabilityNodeMutable>());
+  }
+
   test_directSupertypes_class_extends() async {
     await analyze('''
 class C<T, U> {}
@@ -545,6 +571,19 @@
     // field.
   }
 
+  test_function_metadata() async {
+    await analyze('''
+class A {
+  final Object x;
+  const A(this.x);
+}
+@A(<int>[])
+f() {}
+''');
+    var node = decoratedTypeAnnotation('int').node;
+    expect(node, TypeMatcher<NullabilityNodeMutable>());
+  }
+
   test_functionTypedFormalParameter_namedParameter_typed() async {
     await analyze('''
 void f(void g({int i})) {}
@@ -847,6 +886,21 @@
     expect(decoratedType.node, same(always));
   }
 
+  test_method_metadata() async {
+    await analyze('''
+class A {
+  final Object x;
+  const A(this.x);
+}
+class C {
+  @A(<int>[])
+  f() {}
+}
+''');
+    var node = decoratedTypeAnnotation('int').node;
+    expect(node, TypeMatcher<NullabilityNodeMutable>());
+  }
+
   test_method_parameterType_implicit_dynamic() async {
     await analyze('''
 class C {
diff --git a/pkg/nnbd_migration/test/nullability_migration_impl_test.dart b/pkg/nnbd_migration/test/nullability_migration_impl_test.dart
new file mode 100644
index 0000000..1a00cf0
--- /dev/null
+++ b/pkg/nnbd_migration/test/nullability_migration_impl_test.dart
@@ -0,0 +1,104 @@
+// 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/src/generated/source.dart';
+import 'package:analyzer/src/generated/timestamped_data.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:mockito/mockito.dart';
+import 'package:nnbd_migration/nnbd_migration.dart';
+import 'package:nnbd_migration/src/nullability_migration_impl.dart';
+import 'package:nnbd_migration/src/potential_modification.dart';
+import 'package:nnbd_migration/src/variables.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(NullabilityMigrationImplTest);
+  });
+}
+
+@reflectiveTest
+class NullabilityMigrationImplTest {
+  VariablesMock variables;
+
+  void setUp() {
+    variables = VariablesMock();
+  }
+
+  void test_modification_columnLineInfo() {
+    final innerModification = PotentialModificationMock();
+    final potentialModification =
+        PotentiallyAddImport.forOffset(10, 'foo', innerModification);
+    final listener = NullabilityMigrationListenerMock();
+    final source = SourceMock('0123456\n8910');
+    when(variables.getPotentialModifications()).thenReturn({
+      source: [potentialModification]
+    });
+
+    when(innerModification.isEmpty).thenReturn(false);
+
+    NullabilityMigrationImpl.broadcast(variables, listener);
+
+    final fix = verify(listener.addFix(captureAny)).captured.single
+        as SingleNullabilityFix;
+    expect(fix.description.appliedMessage, 'Add import foo');
+    expect(fix.source, source);
+    expect(fix.location.offset, 10);
+    expect(fix.location.length, 0);
+    expect(fix.location.file, '/test.dart');
+    expect(fix.location.startLine, 2);
+    expect(fix.location.startColumn, 3);
+    verifyNever(listener.addDetail(any));
+    final edit =
+        verify(listener.addEdit(fix, captureAny)).captured.single as SourceEdit;
+    expect(edit.offset, 10);
+    expect(edit.length, 0);
+    expect(edit.replacement, "import 'foo';\n");
+  }
+
+  void test_noModifications_notReported() {
+    final potentialModification = PotentialModificationMock();
+    final listener = NullabilityMigrationListenerMock();
+    final source = SourceMock('');
+    when(variables.getPotentialModifications()).thenReturn({
+      source: [potentialModification]
+    });
+
+    when(potentialModification.modifications).thenReturn([]);
+
+    NullabilityMigrationImpl.broadcast(variables, listener);
+
+    verifyNever(listener.addFix(any));
+    verifyNever(listener.addDetail(any));
+    verifyNever(listener.addEdit(any, any));
+  }
+
+  void test_noPotentialChanges_notReported() {
+    final listener = NullabilityMigrationListenerMock();
+    final source = SourceMock('');
+    when(variables.getPotentialModifications()).thenReturn({source: []});
+
+    NullabilityMigrationImpl.broadcast(variables, listener);
+
+    verifyNever(listener.addFix(any));
+    verifyNever(listener.addDetail(any));
+    verifyNever(listener.addEdit(any, any));
+  }
+}
+
+class NullabilityMigrationListenerMock extends Mock
+    implements NullabilityMigrationListener {}
+
+class PotentialModificationMock extends Mock implements PotentialModification {}
+
+class SourceMock extends Mock implements Source {
+  final String _contents;
+
+  SourceMock(this._contents);
+  TimestampedData<String> get contents => TimestampedData<String>(0, _contents);
+  String get fullName => '/test.dart';
+}
+
+class VariablesMock extends Mock implements Variables {}
diff --git a/pkg/nnbd_migration/test/nullability_node_test.dart b/pkg/nnbd_migration/test/nullability_node_test.dart
index 9cc8d36..6c18b23 100644
--- a/pkg/nnbd_migration/test/nullability_node_test.dart
+++ b/pkg/nnbd_migration/test/nullability_node_test.dart
@@ -19,6 +19,8 @@
 
   List<NullabilityEdge> unsatisfiedEdges;
 
+  List<NullabilityNodeForSubstitution> unsatisfiedSubstitutions;
+
   NullabilityNode get always => graph.always;
 
   NullabilityNode get never => graph.never;
@@ -41,7 +43,9 @@
       NullabilityNode.forTypeAnnotation(offset);
 
   void propagate() {
-    unsatisfiedEdges = graph.propagate();
+    graph.propagate();
+    unsatisfiedEdges = graph.unsatisfiedEdges.toList();
+    unsatisfiedSubstitutions = graph.unsatisfiedSubstitutions.toList();
   }
 
   NullabilityNode subst(NullabilityNode inner, NullabilityNode outer) {
@@ -253,6 +257,78 @@
     assertUnsatisfied([]);
   }
 
+  test_propagation_downstream_reverse_substitution_exact() {
+    // always -> subst(1, 2)
+    // 3 -> 1
+    // 4 -> 3
+    var n1 = newNode(1);
+    var n2 = newNode(2);
+    var n3 = newNode(3);
+    var n4 = newNode(4);
+    connect(always, subst(n1, n2));
+    connect(n3, n1);
+    connect(n4, n3);
+    propagate();
+    expect(n1.isNullable, true);
+    expect(n1.isExactNullable, true);
+    expect(n2.isNullable, false);
+    expect(n3.isNullable, true);
+    expect(n3.isExactNullable, true);
+    expect(n4.isNullable, true);
+    expect(n4.isExactNullable, true);
+  }
+
+  test_propagation_downstream_reverse_substitution_inner_non_nullable() {
+    // 1 -> never (hard)
+    // always -> subst(1, 2)
+    // 3 -> 2
+    var n1 = newNode(1);
+    var n2 = newNode(2);
+    var n3 = newNode(3);
+    connect(n1, never, hard: true);
+    connect(always, subst(n1, n2));
+    connect(n3, n2);
+    propagate();
+    expect(n1.isNullable, false);
+    expect(n2.isNullable, true);
+    expect(n2.isExactNullable, false);
+    expect(n3.isNullable, false);
+  }
+
+  test_propagation_downstream_reverse_substitution_outer_already_nullable() {
+    // always -> 2
+    // always -> subst(1, 2)
+    // 3 -> 2
+    var n1 = newNode(1);
+    var n2 = newNode(2);
+    var n3 = newNode(3);
+    connect(always, n2);
+    connect(always, subst(n1, n2));
+    connect(n3, n2);
+    propagate();
+    expect(n1.isNullable, false);
+    expect(n2.isNullable, true);
+    expect(n2.isExactNullable, false);
+    expect(n3.isNullable, false);
+  }
+
+  test_propagation_downstream_reverse_substitution_unsatisfiable() {
+    // 1 -> never (hard)
+    // 2 -> never (hard)
+    // always -> subst(1, 2)
+    var n1 = newNode(1);
+    var n2 = newNode(2);
+    connect(n1, never, hard: true);
+    connect(n2, never, hard: true);
+    var substitutionNode = subst(n1, n2);
+    connect(always, substitutionNode);
+    propagate();
+    expect(n1.isNullable, false);
+    expect(n2.isNullable, false);
+    expect(unsatisfiedSubstitutions, hasLength(1));
+    expect(unsatisfiedSubstitutions[0], same(substitutionNode));
+  }
+
   test_propagation_downstream_through_lub_both() {
     // always -> 1
     // always -> 2
@@ -336,7 +412,7 @@
 
   test_propagation_downstream_through_substitution_cascaded() {
     // always -> 1
-    // LUB(LUB(1, 2), 3) -> 4
+    // subst(subst(1, 2), 3) -> 4
     var n1 = newNode(1);
     var n2 = newNode(2);
     var n3 = newNode(3);
@@ -350,7 +426,7 @@
 
   test_propagation_downstream_through_substitution_inner() {
     // always -> 1
-    // LUB(1, 2) -> 3
+    // subst(1, 2) -> 3
     var n1 = newNode(1);
     var n2 = newNode(2);
     var n3 = newNode(3);
@@ -362,7 +438,7 @@
   }
 
   test_propagation_downstream_through_substitution_neither() {
-    // LUB(1, 2) -> 3
+    // subst(1, 2) -> 3
     var n1 = newNode(1);
     var n2 = newNode(2);
     var n3 = newNode(3);
@@ -374,7 +450,7 @@
 
   test_propagation_downstream_through_substitution_outer() {
     // always -> 2
-    // LUB(1, 2) -> 3
+    // subst(1, 2) -> 3
     var n1 = newNode(1);
     var n2 = newNode(2);
     var n3 = newNode(3);
diff --git a/pkg/nnbd_migration/test/test_all.dart b/pkg/nnbd_migration/test/test_all.dart
index e8b5c72..2272dea 100644
--- a/pkg/nnbd_migration/test/test_all.dart
+++ b/pkg/nnbd_migration/test/test_all.dart
@@ -10,6 +10,7 @@
 import 'edge_builder_test.dart' as edge_builder_test;
 import 'node_builder_test.dart' as node_builder_test;
 import 'nullability_node_test.dart' as nullability_node_test;
+import 'utilities/test_all.dart' as utilities;
 
 main() {
   defineReflectiveSuite(() {
@@ -19,5 +20,6 @@
     edge_builder_test.main();
     node_builder_test.main();
     nullability_node_test.main();
+    utilities.main();
   });
 }
diff --git a/pkg/nnbd_migration/test/utilities/scoped_set_test.dart b/pkg/nnbd_migration/test/utilities/scoped_set_test.dart
new file mode 100644
index 0000000..47a8661
--- /dev/null
+++ b/pkg/nnbd_migration/test/utilities/scoped_set_test.dart
@@ -0,0 +1,182 @@
+// 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:nnbd_migration/src/utilities/scoped_set.dart';
+import 'package:test/test.dart';
+import 'package:test_reflective_loader/test_reflective_loader.dart';
+
+main() {
+  defineReflectiveSuite(() {
+    defineReflectiveTests(ScopedSetTest);
+  });
+}
+
+@reflectiveTest
+class ScopedSetTest {
+  test_clearEachScope() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.pushScope(copyCurrent: true);
+    set.clearEachScope();
+    expect(set.isInScope(0), false);
+    set.popScope();
+    expect(set.isInScope(0), false);
+  }
+
+  test_doScoped_actionPerformed() {
+    final set = ScopedSet<int>();
+    bool ran = false;
+    set.doScoped(action: () {
+      ran = true;
+    });
+    expect(ran, true);
+  }
+
+  test_doScoped_actionThrows() {
+    final set = ScopedSet<int>();
+    bool threw;
+    try {
+      set.doScoped(action: () {
+        set.add(0);
+        throw '';
+      });
+    } catch (_) {
+      threw = true;
+    }
+
+    expect(threw, true);
+    expect(set.isInScope(0), false);
+  }
+
+  test_doScoped_copyCurrent() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.doScoped(
+        copyCurrent: true,
+        action: () {
+          set.add(1);
+          expect(set.isInScope(0), true);
+          expect(set.isInScope(1), true);
+        });
+    expect(set.isInScope(0), true);
+    expect(set.isInScope(1), false);
+  }
+
+  test_doScoped_elements() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.doScoped(
+        elements: [0, 1],
+        action: () {
+          expect(set.isInScope(0), true);
+          expect(set.isInScope(1), true);
+        });
+    expect(set.isInScope(0), false);
+    expect(set.isInScope(1), false);
+  }
+
+  test_doScoped_newScope() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.doScoped(action: () {
+      set.add(1);
+      expect(set.isInScope(0), false);
+      expect(set.isInScope(1), true);
+    });
+    expect(set.isInScope(0), true);
+    expect(set.isInScope(1), false);
+  }
+
+  test_initiallyEmpty() {
+    final set = ScopedSet<int>();
+    expect(set.isInScope(0), false);
+    expect(set.isInScope(1), false);
+  }
+
+  test_popScope_copyCurrent() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.pushScope(copyCurrent: true);
+    set.popScope();
+    expect(set.isInScope(0), true);
+  }
+
+  test_popScope_element() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.pushScope();
+    set.popScope();
+    expect(set.isInScope(0), true);
+  }
+
+  test_popScope_empty() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.pushScope();
+    set.add(0);
+    set.popScope();
+    expect(set.isInScope(0), false);
+  }
+
+  test_pushScope_add() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    expect(set.isInScope(0), true);
+  }
+
+  test_pushScope_addAll() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.addAll([0, 1]);
+    expect(set.isInScope(0), true);
+    expect(set.isInScope(1), true);
+  }
+
+  test_pushScope_copyCurrent() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.pushScope(copyCurrent: true);
+    expect(set.isInScope(0), true);
+  }
+
+  test_pushScope_empty() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    expect(set.isInScope(0), false);
+  }
+
+  test_pushScope_empty2() {
+    final set = ScopedSet<int>();
+    set.pushScope();
+    set.add(0);
+    set.pushScope();
+    expect(set.isInScope(0), false);
+  }
+
+  test_pushScope_withElements() {
+    final set = ScopedSet<int>();
+    set.pushScope(elements: [0, 1]);
+    expect(set.isInScope(0), true);
+    expect(set.isInScope(1), true);
+  }
+
+  test_removeFromAllScopes() {
+    final set = ScopedSet<int>();
+    set.pushScope(elements: [0, 1]);
+    set.pushScope(copyCurrent: true);
+    set.removeFromAllScopes(0);
+    expect(set.isInScope(0), false);
+    expect(set.isInScope(1), true);
+    set.popScope();
+    expect(set.isInScope(0), false);
+    expect(set.isInScope(1), true);
+  }
+}
diff --git a/pkg/nnbd_migration/test/utilities/test_all.dart b/pkg/nnbd_migration/test/utilities/test_all.dart
new file mode 100644
index 0000000..7c14545
--- /dev/null
+++ b/pkg/nnbd_migration/test/utilities/test_all.dart
@@ -0,0 +1,13 @@
+// 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_reflective_loader/test_reflective_loader.dart';
+
+import 'scoped_set_test.dart' as scoped_set_test;
+
+main() {
+  defineReflectiveSuite(() {
+    scoped_set_test.main();
+  });
+}
diff --git a/pkg/nnbd_migration/tool/trial_migration.dart b/pkg/nnbd_migration/tool/trial_migration.dart
new file mode 100644
index 0000000..e425e17
--- /dev/null
+++ b/pkg/nnbd_migration/tool/trial_migration.dart
@@ -0,0 +1,139 @@
+// 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 is a hacked-together client of the NNBD migration API, intended for
+// early testing of the migration process.  It runs a small hardcoded set of
+// packages through the migration engine and outputs statistics about the
+// result of migration, as well as categories (and counts) of exceptions that
+// occurred.
+
+import 'dart:io';
+
+import 'package:analyzer/dart/analysis/analysis_context_collection.dart';
+import 'package:analyzer_plugin/protocol/protocol_common.dart';
+import 'package:nnbd_migration/nnbd_migration.dart';
+
+main() async {
+  var rootUri = Platform.script.resolve('../../..');
+  var listener = _Listener();
+  for (var testPath in [
+    'third_party/pkg/charcode',
+    'third_party/pkg/collection',
+    'third_party/pkg/logging',
+    'pkg/meta',
+    'third_party/pkg/path',
+    'third_party/pkg/term_glyph',
+//    'third_party/pkg/typed_data', - TODO(paulberry): fatal exception
+    'third_party/pkg/async',
+    'third_party/pkg/source_span',
+    'third_party/pkg/stack_trace',
+    'third_party/pkg/matcher',
+    'third_party/pkg/stream_channel',
+    'third_party/pkg/boolean_selector',
+    'third_party/pkg/test/pkgs/test_api',
+  ]) {
+    print('Migrating $testPath');
+    var testUri = rootUri.resolve(testPath);
+    var contextCollection =
+        AnalysisContextCollection(includedPaths: [testUri.toFilePath()]);
+    var context = contextCollection.contexts.single;
+    var files = context.contextRoot
+        .analyzedFiles()
+        .where((s) => s.endsWith('.dart'))
+        .toList();
+    print('  ${files.length} files found');
+    var migration = NullabilityMigration(listener, permissive: true);
+    for (var file in files) {
+      var resolvedUnit = await context.currentSession.getResolvedUnit(file);
+      migration.prepareInput(resolvedUnit);
+    }
+    for (var file in files) {
+      var resolvedUnit = await context.currentSession.getResolvedUnit(file);
+      migration.processInput(resolvedUnit);
+    }
+    migration.finish();
+  }
+  print('${listener.numTypesMadeNullable} types made nullable');
+  print('${listener.numNullChecksAdded} null checks added');
+  print('${listener.numMetaImportsAdded} meta imports added');
+  print('${listener.numRequiredAnnotationsAdded} required annotations added');
+  print('${listener.numDeadCodeSegmentsFound} dead code segments found');
+  print('${listener.numExceptions} exceptions in '
+      '${listener.groupedExceptions.length} categories');
+  print('Exception categories:');
+  var sortedExceptions = listener.groupedExceptions.entries.toList();
+  sortedExceptions.sort((e1, e2) => e2.value.length.compareTo(e1.value.length));
+  for (var entry in sortedExceptions) {
+    print('  ${entry.key} (x${entry.value.length})');
+  }
+}
+
+class _Listener implements NullabilityMigrationListener {
+  final groupedExceptions = <String, List<String>>{};
+
+  int numExceptions = 0;
+
+  int numTypesMadeNullable = 0;
+
+  int numNullChecksAdded = 0;
+
+  int numMetaImportsAdded = 0;
+
+  int numRequiredAnnotationsAdded = 0;
+
+  int numDeadCodeSegmentsFound = 0;
+
+  @override
+  void addDetail(String detail) {
+    var breakLocation = detail.indexOf('\n\n');
+    if (breakLocation == -1)
+      throw StateError('Could not decode exception $detail');
+    var stackTrace = detail.substring(breakLocation + 2).split('\n');
+    var category = _classifyStackTrace(stackTrace);
+    (groupedExceptions[category] ??= []).add(detail);
+    ++numExceptions;
+  }
+
+  @override
+  void addEdit(SingleNullabilityFix fix, SourceEdit edit) {
+    if (edit.replacement == '?' && edit.length == 0) {
+      ++numTypesMadeNullable;
+    } else if (edit.replacement == '!' && edit.length == 0) {
+      ++numNullChecksAdded;
+    } else if (edit.replacement == "import 'package:meta/meta.dart';\n" &&
+        edit.length == 0) {
+      ++numMetaImportsAdded;
+    } else if (edit.replacement == '@required ' && edit.length == 0) {
+      ++numRequiredAnnotationsAdded;
+    } else if ((edit.replacement == '/* ' ||
+            edit.replacement == ' /*' ||
+            edit.replacement == '; /*') &&
+        edit.length == 0) {
+      ++numDeadCodeSegmentsFound;
+    } else if ((edit.replacement == '*/ ' || edit.replacement == ' */') &&
+        edit.length == 0) {
+      // Already counted
+    } else {
+      print('addEdit($fix, $edit)');
+    }
+  }
+
+  @override
+  void addFix(SingleNullabilityFix fix) {}
+
+  String _classifyStackTrace(List<String> stackTrace) {
+    for (var entry in stackTrace) {
+      if (entry.contains('EdgeBuilder._unimplemented')) continue;
+      if (entry.contains('_AssertionError._doThrowNew')) continue;
+      if (entry.contains('_AssertionError._throwNew')) continue;
+      if (entry.contains('NodeBuilder._unimplemented')) continue;
+      if (entry.contains('Object.noSuchMethod')) continue;
+      if (entry.contains('List.[] (dart:core-patch/growable_array.dart')) {
+        continue;
+      }
+      return entry;
+    }
+    return '???';
+  }
+}
diff --git a/pkg/test_runner/analysis_options.yaml b/pkg/test_runner/analysis_options.yaml
index 1a46de2..66cdb5c 100644
--- a/pkg/test_runner/analysis_options.yaml
+++ b/pkg/test_runner/analysis_options.yaml
@@ -1,3 +1,85 @@
 analyzer:
   strong-mode:
     implicit-casts: false
+  errors:
+    override_on_non_overriding_method: error
+linter:
+  rules:
+    # TODO: Enable these once the existing violations have been fixed.
+#    - annotate_overrides
+#    - avoid_renaming_method_parameters
+#    - non_constant_identifier_names
+#    - omit_local_variable_types
+#    - only_throw_errors
+#    - prefer_initializing_formals
+#    - prefer_interpolation_to_compose_strings
+#    - prefer_is_empty
+#    - prefer_is_not_empty
+#    - prefer_single_quotes
+    - avoid_bool_literals_in_conditional_expressions
+    - avoid_empty_else
+    - avoid_function_literals_in_foreach_calls
+    - avoid_init_to_null
+    - avoid_null_checks_in_equality_operators
+    - avoid_relative_lib_imports
+    - avoid_return_types_on_setters
+    - avoid_returning_null
+    - avoid_returning_null_for_void
+    - avoid_shadowing_type_parameters
+    - avoid_single_cascade_in_expression_statements
+    - avoid_types_as_parameter_names
+    - avoid_unused_constructor_parameters
+    - await_only_futures
+    - camel_case_types
+    - cancel_subscriptions
+    - comment_references
+    - constant_identifier_names
+    - control_flow_in_finally
+    - curly_braces_in_flow_control_structures
+    - directives_ordering
+    - empty_catches
+    - empty_constructor_bodies
+    - empty_statements
+    - file_names
+    - hash_and_equals
+    - implementation_imports
+    - invariant_booleans
+    - iterable_contains_unrelated_type
+    - library_names
+    - library_prefixes
+    - list_remove_unrelated_type
+    - no_duplicate_case_values
+    - null_closures
+    - overridden_fields
+    - package_api_docs
+    - package_names
+    - package_prefixed_library_names
+    - prefer_adjacent_string_concatenation
+    - prefer_collection_literals
+    - prefer_conditional_assignment
+    - prefer_const_constructors
+    - prefer_contains
+    - prefer_equal_for_default_values
+    - prefer_final_fields
+    - prefer_generic_function_type_aliases
+    - prefer_null_aware_operators
+    - prefer_typing_uninitialized_variables
+    - recursive_getters
+    - slash_for_doc_comments
+    - throw_in_finally
+    - type_init_formals
+    - unnecessary_brace_in_string_interps
+    - unnecessary_const
+    - unnecessary_getters_setters
+    - unnecessary_lambdas
+    - unnecessary_new
+    - unnecessary_null_aware_assignments
+    - unnecessary_null_in_if_null_operators
+    - unnecessary_parenthesis
+    - unnecessary_statements
+    - unnecessary_this
+    - unnecessary_overrides
+    - unrelated_type_equality_checks
+    - use_rethrow_when_possible
+    - valid_regexps
+    - void_checks
diff --git a/pkg/test_runner/lib/src/android.dart b/pkg/test_runner/lib/src/android.dart
index ab133aa..12d3b16 100644
--- a/pkg/test_runner/lib/src/android.dart
+++ b/pkg/test_runner/lib/src/android.dart
@@ -2,9 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 import "dart:async";
+import "dart:collection";
 import "dart:convert" show LineSplitter, utf8;
 import "dart:core";
-import "dart:collection";
 import "dart:io";
 
 import "path.dart";
@@ -102,13 +102,9 @@
 /// New emulators can be launched by calling the static [launchNewEmulator]
 /// method.
 class AndroidEmulator {
-  int _port;
-  Process _emulatorProcess;
-  AdbDevice _adbDevice;
-
-  int get port => _port;
-
-  AdbDevice get adbDevice => _adbDevice;
+  final int port;
+  final AdbDevice adbDevice;
+  final Process _emulatorProcess;
 
   static Future<AndroidEmulator> launchNewEmulator(String avdName) {
     var portNumber = AdbServerPortPool.next();
@@ -119,9 +115,9 @@
     });
   }
 
-  AndroidEmulator._private(this._port, this._adbDevice, this._emulatorProcess) {
+  AndroidEmulator._private(this.port, this.adbDevice, this._emulatorProcess) {
     Stream<String> getLines(Stream s) {
-      return s.transform(utf8.decoder).transform(LineSplitter());
+      return s.transform(utf8.decoder).transform(const LineSplitter());
     }
 
     getLines(_emulatorProcess.stdout).listen((line) {
@@ -150,7 +146,7 @@
   }
 
   void log(String msg) {
-    DebugLogger.info("AndroidEmulator(${_adbDevice.deviceId}): $msg");
+    DebugLogger.info("AndroidEmulator(${adbDevice.deviceId}): $msg");
   }
 }
 
@@ -178,12 +174,11 @@
 /// Used for communicating with an emulator or with a real device.
 class AdbDevice {
   static const _adbServerStartupTime = Duration(seconds: 3);
-  String _deviceId;
-  Map<String, String> _cachedData = {};
 
-  String get deviceId => _deviceId;
+  final String deviceId;
+  final Map<String, String> _cachedData = {};
 
-  AdbDevice(this._deviceId);
+  AdbDevice(this.deviceId);
 
   /// Blocks execution until the device is online.
   Future waitForDevice() {
@@ -337,8 +332,8 @@
   }
 
   List<String> _deviceSpecificArgs(List<String> adbArgs) {
-    if (_deviceId != null) {
-      var extendedAdbArgs = ['-s', _deviceId];
+    if (deviceId != null) {
+      var extendedAdbArgs = ['-s', deviceId];
       extendedAdbArgs.addAll(adbArgs);
       adbArgs = extendedAdbArgs;
     }
@@ -348,7 +343,7 @@
 
 /// Helper to list all adb devices available.
 class AdbHelper {
-  static RegExp _deviceLineRegexp =
+  static final RegExp _deviceLineRegexp =
       RegExp(r'^([a-zA-Z0-9_-]+)[ \t]+device$', multiLine: true);
 
   static Future<List<String>> listDevices() {
diff --git a/pkg/test_runner/lib/src/browser.dart b/pkg/test_runner/lib/src/browser.dart
index 1a5747e..5d7427e 100644
--- a/pkg/test_runner/lib/src/browser.dart
+++ b/pkg/test_runner/lib/src/browser.dart
@@ -2,8 +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 'utils.dart';
+import 'package:path/path.dart' as p;
 import 'configuration.dart' show Compiler;
+import 'utils.dart';
 
 String dart2jsHtml(String title, String scriptPath) {
   return """
@@ -33,12 +34,28 @@
 </html>""";
 }
 
+/// Transforms a path to a valid JS identifier.
+///
+/// This logic must be synchronized with [pathToJSIdentifier] in DDC at:
+/// pkg/dev_compiler/lib/src/compiler/module_builder.dart
+String pathToJSIdentifier(String path) {
+  path = p.normalize(path);
+  if (path.startsWith('/') || path.startsWith('\\')) {
+    path = path.substring(1, path.length);
+  }
+  return _toJSIdentifier(path
+      .replaceAll('\\', '__')
+      .replaceAll('/', '__')
+      .replaceAll('..', '__')
+      .replaceAll('-', '_'));
+}
+
 /// Escape [name] to make it into a valid identifier.
 String _toJSIdentifier(String name) {
   if (name.length == 0) return r'$';
 
   // Escape any invalid characters
-  StringBuffer buffer = null;
+  StringBuffer buffer;
   for (int i = 0; i < name.length; i++) {
     var ch = name[i];
     var needsEscape = ch == r'$' || _invalidCharInIdentifier.hasMatch(ch);
@@ -108,7 +125,6 @@
     // http://www.ecma-international.org/ecma-262/6.0/#sec-identifiers-static-semantics-early-errors
     case "implements":
     case "interface":
-    case "let":
     case "package":
     case "private":
     case "protected":
@@ -123,11 +139,15 @@
 /// Generates the HTML template file needed to load and run a dartdevc test in
 /// the browser.
 ///
-/// The [testName] is the short name of the test without any subdirectory path
-/// or extension, like "math_test". The [testJSDir] is the relative path to the
-/// build directory where the dartdevc-generated JS file is stored.
-String dartdevcHtml(String testName, String testJSDir, Compiler compiler) {
-  var testId = _toJSIdentifier(testName);
+/// [testName] is the short name of the test without any subdirectory path
+/// or extension, like "math_test". [testNameAlias] is the alias of the
+/// test variable used for import/export (usually relative to its module root).
+/// [testJSDir] is the relative path to the build directory where the
+/// dartdevc-generated JS file is stored.
+String dartdevcHtml(String testName, String testNameAlias, String testJSDir,
+    Compiler compiler) {
+  var testId = pathToJSIdentifier(testName);
+  var testIdAlias = pathToJSIdentifier(testNameAlias);
   var isKernel = compiler == Compiler.dartdevk;
   var sdkPath = isKernel ? 'kernel/amd/dart_sdk' : 'js/amd/dart_sdk';
   var pkgDir = isKernel ? 'pkg_kernel' : 'pkg';
@@ -230,7 +250,7 @@
     // Some callbacks are not scheduled with timers/microtasks, so they don't
     // go through our async tracking (e.g. DOM events). For those tests, check
     // if the result of calling `main()` is a Future, and if so, wait for it.
-    let result = $testId.$testId.main();
+    let result = $testId.$testIdAlias.main();
     if (sdk.async.Future.is(result)) {
       sdk.dart.addAsyncCallback();
       result.whenComplete(sdk.dart.removeAsyncCallback);
diff --git a/pkg/test_runner/lib/src/browser_controller.dart b/pkg/test_runner/lib/src/browser_controller.dart
index afd23cb..9f7cabc 100644
--- a/pkg/test_runner/lib/src/browser_controller.dart
+++ b/pkg/test_runner/lib/src/browser_controller.dart
@@ -27,7 +27,8 @@
 
 /// Class describing the interface for communicating with browsers.
 abstract class Browser {
-  BrowserOutput _allBrowserOutput = BrowserOutput();
+  /// Get the output that was written so far to stdout/stderr/eventLog.
+  BrowserOutput get testBrowserOutput => _testBrowserOutput;
   BrowserOutput _testBrowserOutput = BrowserOutput();
 
   /// This is called after the process is closed, before the done future
@@ -67,8 +68,7 @@
 
   Browser();
 
-  factory Browser.byRuntime(Runtime runtime, String executablePath,
-      [bool checkedMode = false]) {
+  factory Browser.byRuntime(Runtime runtime, String executablePath) {
     Browser browser;
     switch (runtime) {
       case Runtime.firefox:
@@ -117,21 +117,18 @@
     if (debugPrint) print("usageLog: $toLog");
     if (logger != null) logger(toLog);
 
-    _allBrowserOutput.eventLog.write(toLog);
     _testBrowserOutput.eventLog.write(toLog);
   }
 
   void _addStdout(String output) {
     if (debugPrint) print("stdout: $output");
 
-    _allBrowserOutput.stdout.write(output);
     _testBrowserOutput.stdout.write(output);
   }
 
   void _addStderr(String output) {
     if (debugPrint) print("stderr: $output");
 
-    _allBrowserOutput.stderr.write(output);
     _testBrowserOutput.stderr.write(output);
   }
 
@@ -198,19 +195,17 @@
         }
       }
 
-      stdoutSubscription =
-          process.stdout.transform(utf8.decoder).listen((data) {
-        _addStdout(data);
-      }, onError: (error) {
+      stdoutSubscription = process.stdout
+          .transform(utf8.decoder)
+          .listen(_addStdout, onError: (error) {
         // This should _never_ happen, but we really want this in the log
         // if it actually does due to dart:io or vm bug.
         _logEvent("An error occured in the process stdout handling: $error");
       }, onDone: closeStdout);
 
-      stderrSubscription =
-          process.stderr.transform(utf8.decoder).listen((data) {
-        _addStderr(data);
-      }, onError: (error) {
+      stderrSubscription = process.stderr
+          .transform(utf8.decoder)
+          .listen(_addStderr, onError: (error) {
         // This should _never_ happen, but we really want this in the log
         // if it actually does due to dart:io or vm bug.
         _logEvent("An error occured in the process stderr handling: $error");
@@ -246,10 +241,6 @@
     });
   }
 
-  /// Get the output that was written so far to stdout/stderr/eventLog.
-  BrowserOutput get allBrowserOutput => _allBrowserOutput;
-  BrowserOutput get testBrowserOutput => _testBrowserOutput;
-
   void resetTestBrowserOutput() {
     _testBrowserOutput = BrowserOutput();
   }
@@ -460,7 +451,7 @@
             _logEvent(
                 "Error: failed to delete Chrome user-data-dir ${userDir.path}"
                 ", will try again in 40 seconds: $e");
-            Timer(Duration(seconds: 40), () {
+            Timer(const Duration(seconds: 40), () {
               try {
                 userDir.deleteSync(recursive: true);
               } catch (e) {
@@ -571,7 +562,7 @@
   static const String turnScreenOnPackage = 'com.google.dart.turnscreenon';
   static const String turnScreenOnActivity = '.Main';
 
-  AdbDevice _adbDevice;
+  final AdbDevice _adbDevice;
 
   AndroidChrome(this._adbDevice);
 
@@ -696,7 +687,7 @@
   Timer nextTestTimeout;
   Stopwatch timeSinceRestart = Stopwatch()..start();
 
-  BrowserStatus(Browser this.browser);
+  BrowserStatus(this.browser);
 }
 
 /// Describes a single test to be run in the browser.
@@ -866,8 +857,7 @@
       browser = AndroidChrome(device);
     } else {
       var path = configuration.browserLocation;
-      browser = Browser.byRuntime(
-          configuration.runtime, path, configuration.isChecked);
+      browser = Browser.byRuntime(configuration.runtime, path);
       browser.logger = logger;
     }
 
@@ -898,10 +888,10 @@
       if (status.currentTest.id != testId) {
         print("Expected test id ${status.currentTest.id} for"
             "${status.currentTest.url}");
-        print("Got test id ${testId}");
+        print("Got test id $testId");
         print("Last test id was ${status.lastTest.id} for "
             "${status.currentTest.url}");
-        throw ("This should never happen, wrong test id");
+        throw "This should never happen, wrong test id";
       }
       testCache[testId] = status.currentTest.url;
 
@@ -1206,9 +1196,7 @@
         request.response.close();
         DebugLogger.error("Error from browser on : "
             "${request.uri.path}, data:  $back");
-      }, onError: (error) {
-        print(error);
-      });
+      }, onError: print);
     }
 
     void errorHandler(e) {
@@ -1498,11 +1486,11 @@
           current_id = next_id;
           test_started = true;
           contactBrowserController(
-            'POST', '$startedPath/${browserId}?id=' + current_id,
+            'POST', '$startedPath/$browserId?id=' + current_id,
             function () {}, msg, true);
         } else if (isStatusUpdate) {
             contactBrowserController(
-              'POST', '$statusUpdatePath/${browserId}?id=' + current_id,
+              'POST', '$statusUpdatePath/$browserId?id=' + current_id,
               function() {}, msg, true);
         } else {
           var is_double_report = test_completed;
@@ -1511,7 +1499,7 @@
 
           function reportDoneMessage() {
             contactBrowserController(
-                'POST', '$reportPath/${browserId}?id=' + current_id,
+                'POST', '$reportPath/$browserId?id=' + current_id,
                 handleReady, msg, true);
           }
 
diff --git a/pkg/test_runner/lib/src/command.dart b/pkg/test_runner/lib/src/command.dart
index d8707ab..c3427a2 100644
--- a/pkg/test_runner/lib/src/command.dart
+++ b/pkg/test_runner/lib/src/command.dart
@@ -561,7 +561,7 @@
   VmBatchCommand._(String executable, String dartFile, List<String> arguments,
       Map<String, String> environmentOverrides,
       {this.checked = true, int index = 0})
-      : this.dartFile = dartFile,
+      : dartFile = dartFile,
         super._('vm-batch', executable, arguments, environmentOverrides, null,
             index);
 
@@ -632,14 +632,6 @@
     extraLibraries.forEach(builder.add);
   }
 
-  static bool _listEquals(List<String> x, List<String> y) {
-    if (x.length != y.length) return false;
-    for (int i = 0; i < x.length; ++i) {
-      if (x[i] != y[i]) return false;
-    }
-    return true;
-  }
-
   bool _equal(AdbPrecompilationCommand other) =>
       super._equal(other) &&
       buildPath == other.buildPath &&
@@ -647,7 +639,7 @@
       useElf == other.useElf &&
       arguments == other.arguments &&
       precompiledTestDirectory == other.precompiledTestDirectory &&
-      _listEquals(extraLibraries, other.extraLibraries);
+      deepJsonCompare(extraLibraries, other.extraLibraries);
 
   String toString() => 'Steps to push precompiled runner and precompiled code '
       'to an attached device. Uses (and requires) adb.';
@@ -690,7 +682,7 @@
 class JSCommandlineCommand extends ProcessCommand {
   JSCommandlineCommand._(
       String displayName, String executable, List<String> arguments,
-      [Map<String, String> environmentOverrides = null, int index = 0])
+      [Map<String, String> environmentOverrides, int index = 0])
       : super._(displayName, executable, arguments, environmentOverrides, null,
             index);
 
@@ -758,8 +750,8 @@
 
 /// Makes a symbolic link to another directory.
 class MakeSymlinkCommand extends ScriptCommand {
-  String _link;
-  String _target;
+  final String _link;
+  final String _target;
 
   MakeSymlinkCommand._(this._link, this._target, {int index = 0})
       : super._('make_symlink', index: index);
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index f3be68f..f02ba26 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -8,13 +8,14 @@
 import 'dart:io' as io;
 
 import 'package:status_file/expectation.dart';
+import 'package:test_runner/src/test_file.dart';
 
 import 'browser_controller.dart';
 import 'command.dart';
 import 'configuration.dart';
 import 'process_queue.dart';
-import 'test_progress.dart';
 import 'test_case.dart';
+import 'test_progress.dart';
 import 'utils.dart';
 
 /// CommandOutput records the output of a completed command: the process's exit
@@ -128,7 +129,7 @@
   }
 
   /// Called when producing output for a test failure to describe this output.
-  void describe(Progress progress, OutputWriter output) {
+  void describe(TestCase testCase, Progress progress, OutputWriter output) {
     output.subsection("exit code");
     output.write(exitCode.toString());
 
@@ -180,8 +181,7 @@
       if (events != null) {
         validate("Message must be a List", events is List);
 
-        var messagesByType = <String, List<String>>{};
-        _allowedTypes.forEach((type) => messagesByType[type] = <String>[]);
+        var messagesByType = {for (var type in _allowedTypes) type: <String>[]};
 
         for (var entry in events) {
           validate("Entry must be a Map", entry is Map);
@@ -279,7 +279,7 @@
 }
 
 class BrowserCommandOutput extends CommandOutput
-    with UnittestSuiteMessagesMixin {
+    with _UnittestSuiteMessagesMixin {
   final BrowserTestJsonResult _jsonResult;
   final BrowserTestOutput _result;
   final Expectation _rawOutcome;
@@ -351,7 +351,7 @@
     return _rawOutcome;
   }
 
-  void describe(Progress progress, OutputWriter output) {
+  void describe(TestCase testCase, Progress progress, OutputWriter output) {
     if (_jsonResult != null) {
       _describeEvents(progress, output);
     } else {
@@ -360,7 +360,7 @@
       output.write(_result.lastKnownMessage);
     }
 
-    super.describe(progress, output);
+    super.describe(testCase, progress, output);
 
     if (_result.browserOutput.stdout.isNotEmpty) {
       output.subsection("Browser stdout");
@@ -433,101 +433,9 @@
   }
 }
 
-class AnalysisCommandOutput extends CommandOutput {
-  // An error line has 8 fields that look like:
-  // ERROR|COMPILER|MISSING_SOURCE|file:/tmp/t.dart|15|1|24|Missing source.
-  static const int _errorLevel = 0;
-  static const int _formattedError = 7;
-
-  AnalysisCommandOutput(
-      Command command,
-      int exitCode,
-      bool timedOut,
-      List<int> stdout,
-      List<int> stderr,
-      Duration time,
-      bool compilationSkipped)
-      : super(command, exitCode, timedOut, stdout, stderr, time,
-            compilationSkipped, 0);
-
-  Expectation result(TestCase testCase) {
-    // TODO(kustermann): If we run the analyzer not in batch mode, make sure
-    // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings,
-    // no errors)
-
-    // Handle crashes and timeouts first
-    if (hasCrashed) return Expectation.crash;
-    if (hasTimedOut) return Expectation.timeout;
-    if (hasNonUtf8) return Expectation.nonUtf8Error;
-
-    // Get the errors/warnings from the analyzer
-    var errors = <String>[];
-    var warnings = <String>[];
-    parseAnalyzerOutput(errors, warnings);
-
-    // Handle negative
-    if (testCase.isNegative) {
-      return errors.isNotEmpty
-          ? Expectation.pass
-          : Expectation.missingCompileTimeError;
-    }
-
-    // Handle errors / missing errors
-    if (testCase.hasCompileError) {
-      if (errors.isNotEmpty) {
-        return Expectation.pass;
-      }
-      return Expectation.missingCompileTimeError;
-    }
-    if (errors.isNotEmpty) {
-      return Expectation.compileTimeError;
-    }
-
-    // Handle static warnings / missing static warnings
-    if (testCase.hasStaticWarning) {
-      if (warnings.isNotEmpty) {
-        return Expectation.pass;
-      }
-      return Expectation.missingStaticWarning;
-    }
-    if (warnings.isNotEmpty) {
-      return Expectation.staticWarning;
-    }
-
-    assert(errors.isEmpty && warnings.isEmpty);
-    assert(!testCase.hasCompileError && !testCase.hasStaticWarning);
-    return Expectation.pass;
-  }
-
-  /// Cloned code from member result(), with changes.
-  /// Delete existing result() function and rename, when status files are gone.
-  Expectation realResult(TestCase testCase) {
-    // TODO(kustermann): If we run the analyzer not in batch mode, make sure
-    // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings,
-    // no errors)
-
-    // Handle crashes and timeouts first
-    if (hasCrashed) return Expectation.crash;
-    if (hasTimedOut) return Expectation.timeout;
-    if (hasNonUtf8) return Expectation.nonUtf8Error;
-
-    // Get the errors/warnings from the analyzer
-    var errors = <String>[];
-    var warnings = <String>[];
-    parseAnalyzerOutput(errors, warnings);
-
-    if (errors.isNotEmpty) {
-      return Expectation.compileTimeError;
-    }
-    if (warnings.isNotEmpty) {
-      return Expectation.staticWarning;
-    }
-    return Expectation.pass;
-  }
-
-  void parseAnalyzerOutput(List<String> outErrors, List<String> outWarnings) {
-    // Parse a line delimited by the | character using \ as an escape character
-    // like:  FOO|BAR|FOO\|BAR|FOO\\BAZ as 4 fields: FOO BAR FOO|BAR FOO\BAZ
+class AnalysisCommandOutput extends CommandOutput with _StaticErrorOutput {
+  static void parseErrors(String stderr, List<StaticError> errors,
+      [List<StaticError> warnings]) {
     List<String> splitMachineError(String line) {
       var field = StringBuffer();
       var result = <String>[];
@@ -550,21 +458,147 @@
       return result;
     }
 
-    for (String line in decodeUtf8(super.stderr).split("\n")) {
+    for (var line in stderr.split("\n")) {
       if (line.isEmpty) continue;
 
-      List<String> fields = splitMachineError(line);
-      // We only consider errors/warnings for files of interest.
-      if (fields.length > _formattedError) {
-        if (fields[_errorLevel] == 'ERROR') {
-          outErrors.add(fields[_formattedError]);
-        } else if (fields[_errorLevel] == 'WARNING') {
-          outWarnings.add(fields[_formattedError]);
+      var fields = splitMachineError(line);
+
+      // Lines without enough fields are other output we don't care about.
+      if (fields.length >= 8) {
+        var severity = fields[0];
+        var errorCode = "${fields[1]}.${fields[2]}";
+        var line = int.parse(fields[4]);
+        var column = int.parse(fields[5]);
+        var length = int.parse(fields[6]);
+
+        var error = StaticError(
+            line: line, column: column, length: length, code: errorCode);
+
+        if (severity == 'ERROR') {
+          errors.add(error);
+        } else if (severity == 'WARNING') {
+          warnings?.add(error);
         }
-        // OK to Skip error output that doesn't match the machine format.
       }
     }
   }
+
+  AnalysisCommandOutput(
+      Command command,
+      int exitCode,
+      bool timedOut,
+      List<int> stdout,
+      List<int> stderr,
+      Duration time,
+      bool compilationSkipped)
+      : super(command, exitCode, timedOut, stdout, stderr, time,
+            compilationSkipped, 0);
+
+  @override
+  void describe(TestCase testCase, Progress progress, OutputWriter output) {
+    if (testCase.testFile.isStaticErrorTest) {
+      _validateExpectedErrors(testCase, output);
+    }
+
+    if (!testCase.testFile.isStaticErrorTest || progress == Progress.verbose) {
+      super.describe(testCase, progress, output);
+    }
+  }
+
+  Expectation result(TestCase testCase) {
+    // TODO(kustermann): If we run the analyzer not in batch mode, make sure
+    // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings,
+    // no errors)
+
+    // Handle crashes and timeouts first.
+    if (hasCrashed) return Expectation.crash;
+    if (hasTimedOut) return Expectation.timeout;
+    if (hasNonUtf8) return Expectation.nonUtf8Error;
+
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
+    // Handle negative.
+    if (testCase.isNegative) {
+      return errors.isNotEmpty
+          ? Expectation.pass
+          : Expectation.missingCompileTimeError;
+    }
+
+    // Handle errors / missing errors.
+    if (testCase.hasCompileError) {
+      if (errors.isNotEmpty) {
+        return Expectation.pass;
+      }
+      return Expectation.missingCompileTimeError;
+    }
+    if (errors.isNotEmpty) {
+      return Expectation.compileTimeError;
+    }
+
+    // Handle static warnings / missing static warnings.
+    if (testCase.hasStaticWarning) {
+      if (warnings.isNotEmpty) {
+        return Expectation.pass;
+      }
+      return Expectation.missingStaticWarning;
+    }
+    if (warnings.isNotEmpty) {
+      return Expectation.staticWarning;
+    }
+
+    assert(errors.isEmpty && warnings.isEmpty);
+    assert(!testCase.hasCompileError && !testCase.hasStaticWarning);
+    return Expectation.pass;
+  }
+
+  /// Cloned code from member result(), with changes.
+  /// Delete existing result() function and rename, when status files are gone.
+  Expectation realResult(TestCase testCase) {
+    // TODO(kustermann): If we run the analyzer not in batch mode, make sure
+    // that command.exitCodes matches 2 (errors), 1 (warnings), 0 (no warnings,
+    // no errors)
+
+    // Handle crashes and timeouts first.
+    if (hasCrashed) return Expectation.crash;
+    if (hasTimedOut) return Expectation.timeout;
+    if (hasNonUtf8) return Expectation.nonUtf8Error;
+
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
+    if (errors.isNotEmpty) {
+      return Expectation.compileTimeError;
+    }
+    if (warnings.isNotEmpty) {
+      return Expectation.staticWarning;
+    }
+    return Expectation.pass;
+  }
+
+  /// Parses the machine-readable output of analyzer, which looks like:
+  ///
+  ///     ERROR|STATIC_TYPE_WARNING|SOME_ERROR_CODE|/path/to/some_test.dart|9|26|1|Error message.
+  ///
+  /// Pipes can be escaped with backslashes:
+  ///
+  ///     FOO|BAR|FOO\|BAR|FOO\\BAZ
+  ///
+  /// Is parsed as:
+  ///
+  ///     FOO BAR FOO|BAR FOO\BAZ
+  @override
+  void _parseErrors() {
+    var errors = <StaticError>[];
+    var warnings = <StaticError>[];
+    parseErrors(decodeUtf8(stderr), errors, warnings);
+    errors.forEach(addError);
+    warnings.forEach(addWarning);
+  }
 }
 
 class CompareAnalyzerCfeCommandOutput extends CommandOutput {
@@ -586,9 +620,9 @@
     if (hasNonUtf8) return Expectation.nonUtf8Error;
 
     if (exitCode != 0) return Expectation.fail;
-    for (var line in decodeUtf8(this.stdout).split('\n')) {
-      if (line.indexOf('No differences found') != -1) return Expectation.pass;
-      if (line.indexOf('Differences found') != -1) return Expectation.fail;
+    for (var line in decodeUtf8(stdout).split('\n')) {
+      if (line.contains('No differences found')) return Expectation.pass;
+      if (line.contains('Differences found')) return Expectation.fail;
     }
     return Expectation.fail;
   }
@@ -602,9 +636,9 @@
     if (hasNonUtf8) return Expectation.nonUtf8Error;
 
     if (exitCode != 0) return Expectation.fail;
-    for (var line in decodeUtf8(this.stdout).split('\n')) {
-      if (line.indexOf('No differences found') != -1) return Expectation.pass;
-      if (line.indexOf('Differences found') != -1) return Expectation.fail;
+    for (var line in decodeUtf8(stdout).split('\n')) {
+      if (line.contains('No differences found')) return Expectation.pass;
+      if (line.contains('Differences found')) return Expectation.fail;
     }
     return Expectation.fail;
   }
@@ -660,7 +694,7 @@
   }
 }
 
-class VMCommandOutput extends CommandOutput with UnittestSuiteMessagesMixin {
+class VMCommandOutput extends CommandOutput with _UnittestSuiteMessagesMixin {
   static const _dfeErrorExitCode = 252;
   static const _compileErrorExitCode = 254;
   static const _uncaughtExceptionExitCode = 255;
@@ -963,7 +997,7 @@
 }
 
 class JSCommandLineOutput extends CommandOutput
-    with UnittestSuiteMessagesMixin {
+    with _UnittestSuiteMessagesMixin {
   JSCommandLineOutput(Command command, int exitCode, bool timedOut,
       List<int> stdout, List<int> stderr, Duration time)
       : super(command, exitCode, timedOut, stdout, stderr, time, false, 0);
@@ -1019,6 +1053,50 @@
   bool get successful => _result == Expectation.pass;
 }
 
+class FastaCommandOutput extends CompilationCommandOutput
+    with _StaticErrorOutput {
+  static void parseErrors(String stdout, List<StaticError> errors,
+      [List<StaticError> warnings]) {
+    for (var match in _errorRegexp.allMatches(stdout)) {
+      var line = int.parse(match.group(2));
+      var column = int.parse(match.group(3));
+      var message = match.group(4);
+      errors.add(StaticError(line: line, column: column, message: message));
+    }
+  }
+
+  /// Matches the first line of a Fasta error message. Fasta prints errors to
+  /// stdout that look like:
+  ///
+  ///     tests/language_2/some_test.dart:7:21: Error: Some message.
+  ///     Try fixing the code to be less bad.
+  ///       var _ = <int>[if (1) 2];
+  ///                    ^
+  ///
+  /// The test runner only validates the main error message, and not the
+  /// suggested fixes, so we only parse the first line.
+  static final _errorRegexp =
+      RegExp(r"^([^:]+):(\d+):(\d+): Error: (.*)$", multiLine: true);
+
+  FastaCommandOutput(
+      Command command,
+      int exitCode,
+      bool hasTimedOut,
+      List<int> stdout,
+      List<int> stderr,
+      Duration time,
+      bool compilationSkipped)
+      : super(command, exitCode, hasTimedOut, stdout, stderr, time,
+            compilationSkipped);
+
+  @override
+  void _parseErrors() {
+    var errors = <StaticError>[];
+    parseErrors(decodeUtf8(stdout), errors);
+    errors.forEach(addError);
+  }
+}
+
 CommandOutput createCommandOutput(Command command, int exitCode, bool timedOut,
     List<int> stdout, List<int> stderr, Duration time, bool compilationSkipped,
     [int pid = 0]) {
@@ -1040,6 +1118,9 @@
   } else if (command is AdbPrecompilationCommand) {
     return VMCommandOutput(
         command, exitCode, timedOut, stdout, stderr, time, pid);
+  } else if (command is FastaCompilationCommand) {
+    return FastaCommandOutput(
+        command, exitCode, timedOut, stdout, stderr, time, compilationSkipped);
   } else if (command is CompilationCommand) {
     if (command.displayName == 'precompiler' ||
         command.displayName == 'app_jit') {
@@ -1060,7 +1141,140 @@
       compilationSkipped, pid);
 }
 
-class UnittestSuiteMessagesMixin {
+/// Mixin for outputs from a command that implement a Dart front end which
+/// reports static errors.
+mixin _StaticErrorOutput on CommandOutput {
+  /// Reported static errors, parsed from [stderr].
+  List<StaticError> get errors {
+    if (!_parsedErrors) {
+      _parseErrors();
+      _parsedErrors = true;
+    }
+    return _errors;
+  }
+
+  /// Don't access this from outside of the mixin. It gets populated lazily by
+  /// going through the [errors] getter.
+  final List<StaticError> _errors = [];
+
+  /// Reported static warnings, parsed from [stderr].
+  List<StaticError> get warnings {
+    if (!_parsedErrors) {
+      _parseErrors();
+      _parsedErrors = true;
+    }
+    return _warnings;
+  }
+
+  /// Don't access this from outside of the mixin. It gets populated lazily by
+  /// going through the [warnings] getter.
+  final List<StaticError> _warnings = [];
+
+  bool _parsedErrors = false;
+
+  @override
+  void describe(TestCase testCase, Progress progress, OutputWriter output) {
+    if (testCase.testFile.isStaticErrorTest) {
+      _validateExpectedErrors(testCase, output);
+    }
+
+    if (!testCase.testFile.isStaticErrorTest || progress == Progress.verbose) {
+      super.describe(testCase, progress, output);
+    }
+  }
+
+  Expectation result(TestCase testCase) {
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
+    return super.result(testCase);
+  }
+
+  Expectation realResult(TestCase testCase) {
+    // If it's a static error test, validate the exact errors.
+    if (testCase.testFile.isStaticErrorTest) {
+      return _validateExpectedErrors(testCase);
+    }
+
+    return super.realResult(testCase);
+  }
+
+  /// A subclass should override this to parse the command's output for any
+  /// reported errors and warnings.
+  ///
+  /// It should read [stderr] and [stdout] and call [addError] and [addWarning].
+  void _parseErrors();
+
+  void addError(StaticError error) {
+    _errors.add(error);
+  }
+
+  void addWarning(StaticError error) {
+    _warnings.add(error);
+  }
+
+  /// Compare the actual errors produced to the expected static errors parsed
+  /// from the test file.
+  ///
+  /// Returns [Expectation.pass] if all expected errors were correctly
+  /// reported.
+  ///
+  /// If [writer] is given, outputs a description of any error mismatches.
+  Expectation _validateExpectedErrors(TestCase testCase,
+      [OutputWriter writer]) {
+    // Filter out errors that aren't for this configuration.
+    var expected = testCase.testFile.expectedErrors
+        .where((error) =>
+            testCase.configuration.compiler == Compiler.dart2analyzer
+                ? error.isAnalyzer
+                : error.isCfe)
+        .toList();
+    var actual = errors.toList();
+
+    // Don't require the test or analyzer to output in any specific order.
+    expected.sort();
+    actual.sort();
+
+    writer?.subsection("incorrect static errors");
+
+    var success = expected.length == actual.length;
+    for (var i = 0; i < expected.length && i < actual.length; i++) {
+      var differences = expected[i].describeDifferences(actual[i]);
+      if (differences == null) continue;
+
+      if (writer != null) {
+        writer.write(actual[i].location);
+        for (var difference in differences) {
+          writer.write("- $difference");
+        }
+        writer.separator();
+      }
+
+      success = false;
+    }
+
+    if (writer != null) {
+      writer.subsection("missing expected static errors");
+      for (var i = actual.length; i < expected.length; i++) {
+        writer.write(expected[i].toString());
+        writer.separator();
+      }
+
+      writer.subsection("reported unexpected static errors");
+      for (var i = expected.length; i < actual.length; i++) {
+        writer.write(actual[i].toString());
+        writer.separator();
+      }
+    }
+
+    // TODO(rnystrom): Is there a better expectation we can use?
+    return success ? Expectation.pass : Expectation.missingCompileTimeError;
+  }
+}
+
+mixin _UnittestSuiteMessagesMixin {
   bool _isAsyncTest(String testOutput) {
     return testOutput.contains("unittest-suite-wait-for-done");
   }
diff --git a/pkg/test_runner/lib/src/compiler_configuration.dart b/pkg/test_runner/lib/src/compiler_configuration.dart
index 3758033..7a54fce 100644
--- a/pkg/test_runner/lib/src/compiler_configuration.dart
+++ b/pkg/test_runner/lib/src/compiler_configuration.dart
@@ -22,7 +22,7 @@
 class CommandArtifact {
   final List<Command> commands;
 
-  /// Expected result of running [command].
+  /// Expected result of running [commands].
   final String filename;
 
   /// MIME type of [filename].
@@ -36,8 +36,6 @@
 
   bool get _isDebug => _configuration.mode.isDebug;
 
-  bool get _isChecked => _configuration.isChecked;
-
   bool get _isHostChecked => _configuration.isHostChecked;
 
   bool get _useSdk => _configuration.useSdk;
@@ -114,8 +112,6 @@
 
   bool get hasCompiler => true;
 
-  String get executableScriptSuffix => Platform.isWindows ? '.bat' : '';
-
   List<Uri> bootstrapDependencies() => const <Uri>[];
 
   CommandArtifact computeCompilationArtifact(
@@ -234,7 +230,7 @@
     if (runtimeConfiguration is DartkAdbRuntimeConfiguration) {
       // On Android the Dill file will be pushed to a different directory on the
       // device. Use that one instead.
-      filename = "${DartkAdbRuntimeConfiguration.DeviceTestDir}/out.dill";
+      filename = "${DartkAdbRuntimeConfiguration.deviceTestDir}/out.dill";
     }
 
     return [
@@ -362,15 +358,16 @@
 
 /// Common configuration for dart2js-based tools, such as dart2js.
 class Dart2xCompilerConfiguration extends CompilerConfiguration {
+  static final Map<String, List<Uri>> _bootstrapDependenciesCache = {};
+
   final String moniker;
-  static Map<String, List<Uri>> _bootstrapDependenciesCache = {};
 
   Dart2xCompilerConfiguration(this.moniker, TestConfiguration configuration)
       : super._subclass(configuration);
 
   String computeCompilerPath() {
     var prefix = 'sdk/bin';
-    var suffix = executableScriptSuffix;
+    var suffix = shellScriptExtension;
 
     if (_isHostChecked) {
       if (_useSdk) {
@@ -441,7 +438,7 @@
     // TODO(athom): input filename extraction is copied from DDC. Maybe this
     // should be passed to computeCompilationArtifact, instead?
     var inputFile = arguments.last;
-    var inputFilename = (Uri.file(inputFile)).pathSegments.last;
+    var inputFilename = Uri.file(inputFile).pathSegments.last;
     var out = "$tempDir/${inputFilename.replaceAll('.dart', '.js')}";
     var babel = _configuration.babel;
     var babelOut = out;
@@ -497,7 +494,7 @@
 
   String computeCompilerPath() {
     var dir = _useSdk ? "${_configuration.buildDirectory}/dart-sdk" : "sdk";
-    return "$dir/bin/dartdevc$executableScriptSuffix";
+    return "$dir/bin/dartdevc$shellScriptExtension";
   }
 
   List<String> computeCompilerArguments(
@@ -555,11 +552,6 @@
     }
     args.addAll(sharedOptions);
     args.addAll(_configuration.sharedOptions);
-    if (!useKernel) {
-      // TODO(jmesserly): library-root needs to be removed.
-      args.addAll(
-          ["--library-root", Path(inputFile).directoryPath.toNativePath()]);
-    }
 
     args.addAll([
       "--ignore-unrecognized-flags",
@@ -603,7 +595,7 @@
     // computeCompilerArguments() to here seems hacky. Is there a cleaner way?
     var sharedOptions = arguments.sublist(0, arguments.length - 1);
     var inputFile = arguments.last;
-    var inputFilename = (Uri.file(inputFile)).pathSegments.last;
+    var inputFilename = Uri.file(inputFile).pathSegments.last;
     var outputFile = "$tempDir/${inputFilename.replaceAll('.dart', '.js')}";
 
     return CommandArtifact(
@@ -621,6 +613,10 @@
 
   bool get _isArm64 => _configuration.architecture == Architecture.arm64;
 
+  bool get _isX64 => _configuration.architecture == Architecture.x64;
+
+  bool get _isIA32 => _configuration.architecture == Architecture.ia32;
+
   bool get _isAot => true;
 
   PrecompilerCompilerConfiguration(TestConfiguration configuration)
@@ -690,10 +686,14 @@
     var exec = _configuration.genSnapshotPath;
     if (exec == null) {
       if (_isAndroid) {
-        if (_isArm) {
+        if (_isArm || _isIA32) {
           exec = "$buildDir/clang_x86/gen_snapshot";
-        } else if (_configuration.architecture == Architecture.arm64) {
+        } else if (_isArm64 || _isX64) {
           exec = "$buildDir/clang_x64/gen_snapshot";
+        } else {
+          // Guaranteed by package:test_runner/src/configuration.dart's
+          // TestConfiguration.validate().
+          assert(false);
         }
       } else {
         exec = "$buildDir/gen_snapshot";
@@ -832,7 +832,7 @@
     if (runtimeConfiguration is DartPrecompiledAdbRuntimeConfiguration) {
       // On android the precompiled snapshot will be pushed to a different
       // directory on the device, use that one instead.
-      dir = DartPrecompiledAdbRuntimeConfiguration.DeviceTestDir;
+      dir = DartPrecompiledAdbRuntimeConfiguration.deviceTestDir;
     }
     originalArguments =
         _replaceDartFiles(originalArguments, "$dir/out.aotsnapshot");
@@ -924,7 +924,6 @@
 
   String computeCompilerPath() {
     var prefix = 'sdk/bin';
-    var suffix = executableScriptSuffix;
     if (_isHostChecked) {
       if (_useSdk) {
         throw "--host-checked and --use-sdk cannot be used together";
@@ -932,12 +931,12 @@
       // The script dartanalyzer_developer is not included in the
       // shipped SDK, that is the script is not installed in
       // "$buildDir/dart-sdk/bin/"
-      return '$prefix/dartanalyzer_developer$suffix';
+      return '$prefix/dartanalyzer_developer$shellScriptExtension';
     }
     if (_useSdk) {
       prefix = '${_configuration.buildDirectory}/dart-sdk/bin';
     }
-    return '$prefix/dartanalyzer$suffix';
+    return '$prefix/dartanalyzer$shellScriptExtension';
   }
 
   CommandArtifact computeCompilationArtifact(String tempDir,
@@ -977,11 +976,11 @@
   int get timeoutMultiplier => 4;
 
   String computeCompilerPath() {
-    String suffix = executableScriptSuffix;
     if (_useSdk) {
       throw "--use-sdk cannot be used with compiler compare_analyzer_cfe";
     }
-    return 'pkg/analyzer_fe_comparison/bin/compare_sdk_tests$suffix';
+    return 'pkg/analyzer_fe_comparison/bin/'
+        'compare_sdk_tests$shellScriptExtension';
   }
 
   CommandArtifact computeCompilationArtifact(String tempDir,
@@ -1046,8 +1045,6 @@
 
   bool get _useEnableAsserts;
 
-  String get executableScriptSuffix;
-
   List<Uri> bootstrapDependencies();
 
   String tempKernelFile(String tempDir) =>
@@ -1056,7 +1053,7 @@
   Command computeCompileToKernelCommand(String tempDir, List<String> arguments,
       Map<String, String> environmentOverrides) {
     final pkgVmDir = Platform.script.resolve('../../../pkg/vm').toFilePath();
-    final genKernel = '${pkgVmDir}/tool/gen_kernel${executableScriptSuffix}';
+    final genKernel = '$pkgVmDir/tool/gen_kernel$shellScriptExtension';
 
     final String useAbiVersion = arguments.firstWhere(
         (arg) => arg.startsWith('--use-abi-version='),
diff --git a/pkg/test_runner/lib/src/configuration.dart b/pkg/test_runner/lib/src/configuration.dart
index e37b2f3..da4bfbc 100644
--- a/pkg/test_runner/lib/src/configuration.dart
+++ b/pkg/test_runner/lib/src/configuration.dart
@@ -7,7 +7,6 @@
 import 'dart:io';
 
 import 'package:smith/smith.dart';
-export 'package:smith/smith.dart';
 
 import 'compiler_configuration.dart';
 import 'path.dart';
@@ -15,6 +14,8 @@
 import 'runtime_configuration.dart';
 import 'testing_servers.dart';
 
+export 'package:smith/smith.dart';
+
 /// All of the contextual information to determine how a test suite should be
 /// run.
 ///
@@ -200,11 +201,7 @@
 
   String get configurationDirectory {
     // Lazy initialize and cache since it requires hitting the file system.
-    if (_configurationDirectory == null) {
-      _configurationDirectory = _calculateDirectory();
-    }
-
-    return _configurationDirectory;
+    return _configurationDirectory ??= _calculateDirectory();
   }
 
   /// The build directory path for this configuration, like:
@@ -363,6 +360,21 @@
       isValid = false;
     }
 
+    if (architecture == Architecture.ia32 && compiler == Compiler.dartkp) {
+      print("Warning: IA32 does not support AOT mode.");
+      isValid = false;
+    }
+
+    if (system == System.android &&
+        !(architecture == Architecture.ia32 ||
+            architecture == Architecture.x64 ||
+            architecture == Architecture.arm ||
+            architecture == Architecture.arm64)) {
+      print("Warning: Android only supports the following "
+          "architectures: ia32/x64/arm/arm64.");
+      isValid = false;
+    }
+
     if (shard < 1 || shard > shardCount) {
       print("Error: shard index is $shard out of $shardCount shards");
       isValid = false;
@@ -433,37 +445,34 @@
   /// of a test. Flags and properties used for output are not included.
   /// The summary map can be used to serialize to json for test-output logging.
   Map toSummaryMap() {
-    if (_summaryMap == null) {
-      _summaryMap = {
-        'mode': mode.name,
-        'arch': architecture.name,
-        'compiler': compiler.name,
-        'runtime': runtime.name,
-        'checked': isChecked,
-        'host_checked': isHostChecked,
-        'minified': isMinified,
-        'csp': isCsp,
-        'system': system.name,
-        'vm_options': vmOptions,
-        'dart2js_options': dart2jsOptions,
-        'fasta': usesFasta,
-        'use_sdk': useSdk,
-        'builder_tag': builderTag,
-        'timeout': timeout,
-        'no_preview_dart_2': noPreviewDart2,
-        'use_cfe': useAnalyzerCfe,
-        'analyzer_use_fasta_parser': useAnalyzerFastaParser,
-        'enable_asserts': useEnableAsserts,
-        'hot_reload': hotReload,
-        'hot_reload_rollback': hotReloadRollback,
-        'batch': batch,
-        'batch_dart2js': batchDart2JS,
-        'reset_browser_configuration': resetBrowser,
-        'selectors': selectors.keys.toList(),
-        'use_kernel_bytecode': useKernelBytecode,
-      };
-    }
-    return _summaryMap;
+    return _summaryMap ??= {
+      'mode': mode.name,
+      'arch': architecture.name,
+      'compiler': compiler.name,
+      'runtime': runtime.name,
+      'checked': isChecked,
+      'host_checked': isHostChecked,
+      'minified': isMinified,
+      'csp': isCsp,
+      'system': system.name,
+      'vm_options': vmOptions,
+      'dart2js_options': dart2jsOptions,
+      'fasta': usesFasta,
+      'use_sdk': useSdk,
+      'builder_tag': builderTag,
+      'timeout': timeout,
+      'no_preview_dart_2': noPreviewDart2,
+      'use_cfe': useAnalyzerCfe,
+      'analyzer_use_fasta_parser': useAnalyzerFastaParser,
+      'enable_asserts': useEnableAsserts,
+      'hot_reload': hotReload,
+      'hot_reload_rollback': hotReloadRollback,
+      'batch': batch,
+      'batch_dart2js': batchDart2JS,
+      'reset_browser_configuration': resetBrowser,
+      'selectors': selectors.keys.toList(),
+      'use_kernel_bytecode': useKernelBytecode,
+    };
   }
 }
 
diff --git a/pkg/test_runner/lib/src/expectation_set.dart b/pkg/test_runner/lib/src/expectation_set.dart
index 40f84af..f896cd0 100644
--- a/pkg/test_runner/lib/src/expectation_set.dart
+++ b/pkg/test_runner/lib/src/expectation_set.dart
@@ -19,7 +19,7 @@
 /// and the test is considered to pass if the outcome is any of those
 /// expectations.
 class ExpectationSet {
-  static final _passSet = [Expectation.pass].toSet();
+  static final _passSet = {Expectation.pass};
 
   /// A cache of path component glob strings (like "b*r") that we've previously
   /// converted to regexes. This ensures we collapse multiple globs from the
diff --git a/pkg/test_runner/lib/src/multitest.dart b/pkg/test_runner/lib/src/multitest.dart
index ec1a0cf..fad45a9 100644
--- a/pkg/test_runner/lib/src/multitest.dart
+++ b/pkg/test_runner/lib/src/multitest.dart
@@ -17,7 +17,7 @@
 /// untagged lines of the file, with key "none", which is expected to pass. This
 /// library extracts these tests, writes them into a temporary directory, and
 /// passes them to the test runner. These tests may be referred to in the status
-/// files with the pattern [test name]/[key].
+/// files with the pattern `[test name]/[key]`.
 ///
 /// For example, file i_am_a_multitest.dart:
 ///
@@ -79,7 +79,7 @@
 /// Until legacy multitests are ported we need to support both /// and //#
 final _multitestMarker = RegExp(r"//[/#]");
 
-final _multitestOutcomes = [
+final _multitestOutcomes = {
   'ok',
   'syntax error',
   'compile-time error',
@@ -88,7 +88,7 @@
   'static type warning', // This is still a valid analyzer test
   'dynamic type error', // This is now a no-op
   'checked mode compile-time error' // This is now a no-op
-].toSet();
+};
 
 void _generateTestsFromMultitest(Path filePath, Map<String, String> tests,
     Map<String, Set<String>> outcomes) {
@@ -132,7 +132,9 @@
         }
       }
     } else {
-      for (var test in testsAsLines.values) test.add(line);
+      for (var test in testsAsLines.values) {
+        test.add(line);
+      }
     }
   }
 
@@ -141,7 +143,9 @@
   var marker =
       '// Test created from multitest named ${filePath.toNativePath()}.'
       '$lineSeparator';
-  for (var test in testsAsLines.values) test.add(marker);
+  for (var test in testsAsLines.values) {
+    test.add(marker);
+  }
 
   // Check that every test (other than the none case) has at least one outcome.
   var invalidTests = outcomes.keys
diff --git a/pkg/test_runner/lib/src/options.dart b/pkg/test_runner/lib/src/options.dart
index 59f4f59..c819037 100644
--- a/pkg/test_runner/lib/src/options.dart
+++ b/pkg/test_runner/lib/src/options.dart
@@ -2,8 +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:io';
 import 'dart:convert';
+import 'dart:io';
 
 import 'package:smith/smith.dart';
 
@@ -32,7 +32,7 @@
 /// Specifies a single command line option.
 ///
 /// The name of the specification is used as the key for the option in the Map
-/// returned from the [TestOptionParser] parse method.
+/// returned from [OptionsParser.parse].
 class _Option {
   // TODO(rnystrom): Some string options use "" to mean "no value" and others
   // use null. Clean that up.
@@ -328,7 +328,7 @@
 
   /// For printing out reproducing command lines, we don't want to add these
   /// options.
-  static final _blacklistedOptions = [
+  static final _blacklistedOptions = {
     'build_directory',
     'chrome',
     'clean_exit',
@@ -355,16 +355,16 @@
     'write_debug_log',
     'write_logs',
     'write_results',
-  ].toSet();
+  };
 
   /// The set of objects which the named configuration should imply.
-  static final _namedConfigurationOptions = [
+  static final _namedConfigurationOptions = {
     'system',
     'arch',
     'mode',
     'compiler',
     'runtime',
-  ].toSet();
+  };
 
   /// Parses a list of strings as test options.
   ///
diff --git a/pkg/test_runner/lib/src/output_log.dart b/pkg/test_runner/lib/src/output_log.dart
index 54d9aff..35b5b258 100644
--- a/pkg/test_runner/lib/src/output_log.dart
+++ b/pkg/test_runner/lib/src/output_log.dart
@@ -87,7 +87,7 @@
 
   @override
   Future addStream(Stream<List<int>> stream) {
-    _subscription = stream.listen(this.add);
+    _subscription = stream.listen(add);
     return _subscription.asFuture();
   }
 
@@ -104,7 +104,7 @@
 
 /// An [OutputLog] that tees the output to a file as well.
 class FileOutputLog extends OutputLog {
-  File _outputFile;
+  final File _outputFile;
   IOSink _sink;
 
   FileOutputLog(this._outputFile);
diff --git a/pkg/test_runner/lib/src/path.dart b/pkg/test_runner/lib/src/path.dart
index 9152d14..301adfa 100644
--- a/pkg/test_runner/lib/src/path.dart
+++ b/pkg/test_runner/lib/src/path.dart
@@ -19,7 +19,7 @@
       : _path = source,
         isWindowsShare = false;
 
-  Path._internal(String this._path, bool this.isWindowsShare);
+  Path._internal(this._path, this.isWindowsShare);
 
   static String _clean(String source) {
     if (Platform.operatingSystem == 'windows') return _cleanWindows(source);
@@ -47,6 +47,8 @@
     return Platform.operatingSystem == 'windows' && source.startsWith('\\\\');
   }
 
+  bool operator ==(other) => other is Path && _path == other._path;
+
   int get hashCode => _path.hashCode;
   bool get isEmpty => _path.isEmpty;
   bool get isAbsolute => _path.startsWith('/');
@@ -127,7 +129,7 @@
     while (common < length && pathSegments[common] == baseSegments[common]) {
       common++;
     }
-    final segments = List<String>();
+    final segments = <String>[];
 
     if (common < baseSegments.length && baseSegments[common] == '..') {
       throw ArgumentError("Invalid case of Path.relativeTo(base):\n"
@@ -157,10 +159,10 @@
       return further.canonicalize();
     }
     if (hasTrailingSeparator) {
-      var joined = Path._internal('$_path${further}', isWindowsShare);
+      var joined = Path._internal('$_path$further', isWindowsShare);
       return joined.canonicalize();
     }
-    var joined = Path._internal('$_path/${further}', isWindowsShare);
+    var joined = Path._internal('$_path/$further', isWindowsShare);
     return joined.canonicalize();
   }
 
@@ -304,7 +306,9 @@
   Path get directoryPath {
     int pos = _path.lastIndexOf('/');
     if (pos < 0) return Path('');
-    while (pos > 0 && _path[pos - 1] == '/') --pos;
+    while (pos > 0 && _path[pos - 1] == '/') {
+      --pos;
+    }
     var dirPath = (pos > 0) ? _path.substring(0, pos) : '/';
     return Path._internal(dirPath, isWindowsShare);
   }
diff --git a/pkg/test_runner/lib/src/process_queue.dart b/pkg/test_runner/lib/src/process_queue.dart
index 9df9cb5..8e660b0 100644
--- a/pkg/test_runner/lib/src/process_queue.dart
+++ b/pkg/test_runner/lib/src/process_queue.dart
@@ -33,17 +33,15 @@
 typedef _StepFunction = Future<AdbCommandResult> Function();
 
 class ProcessQueue {
-  TestConfiguration _globalConfiguration;
-
-  Function _allDone;
+  final TestConfiguration _globalConfiguration;
+  final void Function() _allDone;
   final Graph<Command> _graph = Graph();
-  List<EventListener> _eventListener;
+  final List<EventListener> _eventListener;
 
   ProcessQueue(
       this._globalConfiguration,
       int maxProcesses,
       int maxBrowserProcesses,
-      DateTime startTime,
       List<TestSuite> testSuites,
       this._eventListener,
       this._allDone,
@@ -166,9 +164,7 @@
     }
 
     // Build up the dependency graph
-    testCaseEnqueuer = TestCaseEnqueuer(_graph, (TestCase newTestCase) {
-      eventTestAdded(newTestCase);
-    });
+    testCaseEnqueuer = TestCaseEnqueuer(_graph, eventTestAdded);
 
     // Either list or run the tests
     if (_globalConfiguration.listTests) {
@@ -358,11 +354,11 @@
 /// to a state of NodeState.Successful or NodeState.failed.
 ///
 /// It provides a synchronous stream [completedCommands] which provides the
-/// [CommandOutputs] for the finished commands.
+/// [CommandOutput]s for the finished commands.
 ///
 /// It provides a [done] future, which will complete once there are no more
 /// nodes left in the states Initialized/Waiting/Enqueing/Processing
-/// and the [executor] has cleaned up it's resources.
+/// and the [executor] has cleaned up its resources.
 class CommandQueue {
   final Graph<Command> graph;
   final CommandExecutor executor;
@@ -373,11 +369,11 @@
   final _completer = Completer<Null>();
 
   int _numProcesses = 0;
-  int _maxProcesses;
+  final int _maxProcesses;
   int _numBrowserProcesses = 0;
-  int _maxBrowserProcesses;
+  final int _maxBrowserProcesses;
   bool _finishing = false;
-  bool _verbose = false;
+  final bool _verbose;
 
   CommandQueue(this.graph, this.enqueuer, this.executor, this._maxProcesses,
       this._maxBrowserProcesses, this._verbose) {
@@ -392,7 +388,7 @@
         } else {
           _runQueue.add(command);
         }
-        Timer.run(() => _tryRunNextCommand());
+        Timer.run(_tryRunNextCommand);
       } else if (event.to == NodeState.unableToRun) {
         _checkDone();
       }
@@ -422,7 +418,7 @@
         // If there is no free browser runner, put it back into the queue.
         _runQueue.add(command);
         // Don't lose a process.
-        Timer(Duration(milliseconds: 100), _tryRunNextCommand);
+        Timer(const Duration(milliseconds: 100), _tryRunNextCommand);
         return;
       }
 
@@ -434,9 +430,8 @@
       // If a command is part of many TestCases we set the timeout to be
       // the maximum over all [TestCase.timeout]s. At some point, we might
       // eliminate [TestCase.timeout] completely and move it to [Command].
-      int timeout = testCases
-          .map((TestCase test) => test.timeout)
-          .fold(0, (int a, b) => math.max(a, b));
+      int timeout =
+          testCases.map((TestCase test) => test.timeout).fold(0, math.max);
 
       if (_verbose) {
         print('Running "${command.displayName}" command: $command');
@@ -456,7 +451,7 @@
         if (isBrowserCommand) _numBrowserProcesses--;
 
         // Don't lose a process
-        Timer.run(() => _tryRunNextCommand());
+        Timer.run(_tryRunNextCommand);
       });
     }
   }
@@ -607,7 +602,7 @@
                 device, command as AdbDartkCommand, timeout);
           }
         } finally {
-          await adbDevicePool.releaseDevice(device);
+          adbDevicePool.releaseDevice(device);
         }
       });
     } else if (command is VmBatchCommand) {
@@ -633,7 +628,7 @@
       String deviceDir, String deviceTestDir) {
     final List<_StepFunction> steps = [];
     for (var lib in command.extraLibraries) {
-      var libName = "lib${lib}.so";
+      var libName = "lib$lib.so";
       steps.add(() => device.runAdbCommand([
             'push',
             '${command.buildPath}/$libName',
@@ -649,8 +644,8 @@
     var processTest = command.processTestFilename;
     var testdir = command.precompiledTestDirectory;
     var arguments = command.arguments;
-    var devicedir = DartPrecompiledAdbRuntimeConfiguration.DeviceDir;
-    var deviceTestDir = DartPrecompiledAdbRuntimeConfiguration.DeviceTestDir;
+    var devicedir = DartPrecompiledAdbRuntimeConfiguration.deviceDir;
+    var deviceTestDir = DartPrecompiledAdbRuntimeConfiguration.deviceTestDir;
 
     // We copy all the files which the vm precompiler puts into the test
     // directory.
@@ -687,6 +682,7 @@
         [
           'export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$deviceTestDir;'
               '$devicedir/dart_precompiled_runtime',
+          '--android-log-to-stderr'
         ]..addAll(arguments),
         timeout: timeoutDuration));
 
@@ -726,8 +722,8 @@
     final String buildPath = command.buildPath;
     final String hostKernelFile = command.kernelFile;
     final List<String> arguments = command.arguments;
-    final String devicedir = DartkAdbRuntimeConfiguration.DeviceDir;
-    final String deviceTestDir = DartkAdbRuntimeConfiguration.DeviceTestDir;
+    final String devicedir = DartkAdbRuntimeConfiguration.deviceDir;
+    final String deviceTestDir = DartkAdbRuntimeConfiguration.deviceTestDir;
 
     final timeoutDuration = Duration(seconds: timeout);
 
@@ -735,8 +731,8 @@
 
     steps.add(() => device.runAdbShellCommand(['rm', '-Rf', deviceTestDir]));
     steps.add(() => device.runAdbShellCommand(['mkdir', '-p', deviceTestDir]));
-    steps.add(
-        () => device.pushCachedData("${buildPath}/dart", '$devicedir/dart'));
+    steps
+        .add(() => device.pushCachedData("$buildPath/dart", '$devicedir/dart'));
     steps.add(() => device
         .runAdbCommand(['push', hostKernelFile, '$deviceTestDir/out.dill']));
 
@@ -746,6 +742,7 @@
         [
           'export LD_LIBRARY_PATH=\$LD_LIBRARY_PATH:$deviceTestDir;'
               '$devicedir/dart',
+          '--android-log-to-stderr'
         ]..addAll(arguments),
         timeout: timeoutDuration));
 
@@ -1041,7 +1038,11 @@
   Future<bool> terminate() {
     if (_process == null) return Future.value(true);
     var terminateCompleter = Completer<bool>();
+    final sigkillTimer = Timer(const Duration(seconds: 5), () {
+      _process.kill(io.ProcessSignal.sigkill);
+    });
     _processExitHandler = (_) {
+      sigkillTimer.cancel();
       terminateCompleter.complete(true);
     };
     _process.kill();
@@ -1087,7 +1088,7 @@
     var output = createCommandOutput(
         _command,
         exitCode,
-        (outcome == "TIMEOUT"),
+        outcome == "TIMEOUT",
         _testStdout.toList(),
         _testStderr.toList(),
         DateTime.now().difference(_startTime),
@@ -1134,8 +1135,9 @@
     processFuture.then((io.Process p) {
       _process = p;
 
-      Stream<String> _stdoutStream =
-          _process.stdout.transform(utf8.decoder).transform(LineSplitter());
+      Stream<String> _stdoutStream = _process.stdout
+          .transform(utf8.decoder)
+          .transform(const LineSplitter());
       _stdoutSubscription = _stdoutStream.listen((String line) {
         if (line.startsWith('>>> TEST')) {
           _status = line;
@@ -1155,8 +1157,9 @@
       });
       _stdoutSubscription.pause();
 
-      Stream<String> _stderrStream =
-          _process.stderr.transform(utf8.decoder).transform(LineSplitter());
+      Stream<String> _stderrStream = _process.stderr
+          .transform(utf8.decoder)
+          .transform(const LineSplitter());
       _stderrSubscription = _stderrStream.listen((String line) {
         if (line.startsWith('>>> EOF STDERR')) {
           _stderrSubscription.pause();
diff --git a/pkg/test_runner/lib/src/runtime_configuration.dart b/pkg/test_runner/lib/src/runtime_configuration.dart
index fa26f2d..9bcff67 100644
--- a/pkg/test_runner/lib/src/runtime_configuration.dart
+++ b/pkg/test_runner/lib/src/runtime_configuration.dart
@@ -99,11 +99,7 @@
   /// Returns the path to the Dart VM executable.
   String get dartVmBinaryFileName {
     // Controlled by user with the option "--dart".
-    var dartExecutable = _configuration.dartPath;
-
-    if (dartExecutable == null) {
-      dartExecutable = dartVmExecutableFileName;
-    }
+    var dartExecutable = _configuration.dartPath ?? dartVmExecutableFileName;
 
     TestUtils.ensureExists(dartExecutable, _configuration);
     return dartExecutable;
@@ -111,8 +107,8 @@
 
   String get dartVmExecutableFileName {
     return _configuration.useSdk
-        ? '$buildDir/dart-sdk/bin/dart$executableBinarySuffix'
-        : '$buildDir/dart$executableBinarySuffix';
+        ? '$buildDir/dart-sdk/bin/dart$executableExtension'
+        : '$buildDir/dart$executableExtension';
   }
 
   String get dartPrecompiledBinaryFileName {
@@ -120,8 +116,7 @@
     var dartExecutable = _configuration.dartPrecompiledPath;
 
     if (dartExecutable == null || dartExecutable == '') {
-      var suffix = executableBinarySuffix;
-      dartExecutable = '$buildDir/dart_precompiled_runtime$suffix';
+      dartExecutable = '$buildDir/dart_precompiled_runtime$executableExtension';
     }
 
     TestUtils.ensureExists(dartExecutable, _configuration);
@@ -129,32 +124,27 @@
   }
 
   String get processTestBinaryFileName {
-    var suffix = executableBinarySuffix;
-    var processTestExecutable = '$buildDir/process_test$suffix';
+    var processTestExecutable = '$buildDir/process_test$executableExtension';
     TestUtils.ensureExists(processTestExecutable, _configuration);
     return processTestExecutable;
   }
 
   String get d8FileName {
-    var suffix = executableBinarySuffix;
     var d8Dir = Repository.dir.append('third_party/d8');
-    var d8Path = d8Dir.append('${Platform.operatingSystem}/d8$suffix');
+    var d8Path =
+        d8Dir.append('${Platform.operatingSystem}/d8$executableExtension');
     var d8 = d8Path.toNativePath();
     TestUtils.ensureExists(d8, _configuration);
     return d8;
   }
 
   String get jsShellFileName {
-    var executableSuffix = executableBinarySuffix;
-    var executable = 'jsshell$executableSuffix';
+    var executable = 'jsshell$executableExtension';
     var jsshellDir = Repository.uri.resolve("tools/testing/bin").path;
     var jsshell = '$jsshellDir/$executable';
     TestUtils.ensureExists(jsshell, _configuration);
     return jsshell;
   }
-
-  String get executableBinarySuffix => Platform.isWindows ? '.exe' : '';
-  String get executableScriptSuffix => Platform.isWindows ? '.bat' : '';
 }
 
 /// The 'none' runtime configuration.
@@ -322,8 +312,8 @@
 }
 
 class DartkAdbRuntimeConfiguration extends DartVmRuntimeConfiguration {
-  static const String DeviceDir = '/data/local/tmp/testing';
-  static const String DeviceTestDir = '/data/local/tmp/testing/test';
+  static const String deviceDir = '/data/local/tmp/testing';
+  static const String deviceTestDir = '/data/local/tmp/testing/test';
 
   List<Command> computeRuntimeCommands(
       CommandArtifact artifact,
@@ -347,8 +337,8 @@
 
 class DartPrecompiledAdbRuntimeConfiguration
     extends DartVmRuntimeConfiguration {
-  static const String DeviceDir = '/data/local/tmp/precompilation-testing';
-  static const String DeviceTestDir =
+  static const String deviceDir = '/data/local/tmp/precompilation-testing';
+  static const String deviceTestDir =
       '/data/local/tmp/precompilation-testing/test';
 
   final bool useBlobs;
diff --git a/pkg/test_runner/lib/src/status_reporter.dart b/pkg/test_runner/lib/src/status_reporter.dart
index b8b4d78..36e0414 100644
--- a/pkg/test_runner/lib/src/status_reporter.dart
+++ b/pkg/test_runner/lib/src/status_reporter.dart
@@ -2,8 +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:io';
 import 'dart:convert';
+import 'dart:io';
 
 final _combinations = {
   'linux': [
@@ -90,8 +90,7 @@
 }
 
 void sanityCheck(String output) {
-  var splitter = LineSplitter();
-  var lines = splitter.convert(output);
+  var lines = const LineSplitter().convert(output);
   // Looks like this:
   // Total: 15556 tests
   var total = int.parse(lines[0].split(' ')[1].trim());
@@ -115,8 +114,8 @@
   var modes = <String>{};
 
   if (args.contains('--simple')) {
-    arches = ['ia32'].toSet();
-    modes = ['release'].toSet();
+    arches = {'ia32'};
+    modes = {'release'};
   } else {
     for (var combination in combinations) {
       arches.addAll(combination['archs'] as List<String>);
diff --git a/pkg/test_runner/lib/src/test_case.dart b/pkg/test_runner/lib/src/test_case.dart
index af02960..131ae7b 100644
--- a/pkg/test_runner/lib/src/test_case.dart
+++ b/pkg/test_runner/lib/src/test_case.dart
@@ -45,17 +45,7 @@
 /// for evaluating if the test has passed, failed, crashed, or timed out, and
 /// the TestCase has information about what the expected result of the test
 /// should be.
-///
-/// The TestCase has a callback function, [completedHandler], that is run when
-/// the test is completed.
 class TestCase extends UniqueObject {
-  /// Flags set in _expectations from the optional argument info.
-  static const _hasRuntimeError = 1 << 0;
-  static const _hasSyntaxError = 1 << 1;
-  static const _hasCompileError = 1 << 2;
-  static const _hasStaticWarning = 1 << 3;
-  static const _hasCrash = 1 << 4;
-
   /// A list of commands to execute. Most test cases have a single command.
   /// Dart2js tests have two commands, one to compile the source and another
   /// to execute it. Some isolate tests might even have three, if they require
@@ -65,54 +55,42 @@
 
   TestConfiguration configuration;
   String displayName;
-  int _expectations = 0;
   int hash = 0;
   Set<Expectation> expectedOutcomes;
+  final TestFile testFile;
 
   TestCase(this.displayName, this.commands, this.configuration,
       this.expectedOutcomes,
-      {TestFile testFile}) {
+      {TestFile testFile})
+      : testFile = testFile {
     // A test case should do something.
     assert(commands.isNotEmpty);
 
     if (testFile != null) {
-      _setExpectations(testFile);
       hash = (testFile.originPath?.relativeTo(Repository.dir)?.toString())
           .hashCode;
     }
   }
 
-  void _setExpectations(TestFile testFile) {
-    // We don't want to keep the entire (large) TestInformation structure,
-    // so we copy the needed bools into flags set in a single integer.
-    if (testFile.hasRuntimeError) _expectations |= _hasRuntimeError;
-    if (testFile.hasSyntaxError) _expectations |= _hasSyntaxError;
-    if (testFile.hasCrash) _expectations |= _hasCrash;
-    if (testFile.hasCompileError || testFile.hasSyntaxError) {
-      _expectations |= _hasCompileError;
-    }
-    if (testFile.hasStaticWarning) _expectations |= _hasStaticWarning;
-  }
-
   TestCase indexedCopy(int index) {
     var newCommands = commands.map((c) => c.indexedCopy(index)).toList();
-    return TestCase(displayName, newCommands, configuration, expectedOutcomes)
-      .._expectations = _expectations
+    return TestCase(displayName, newCommands, configuration, expectedOutcomes,
+        testFile: testFile)
       ..hash = hash;
   }
 
-  bool get hasRuntimeError => _expectations & _hasRuntimeError != 0;
-  bool get hasStaticWarning => _expectations & _hasStaticWarning != 0;
-  bool get hasSyntaxError => _expectations & _hasSyntaxError != 0;
-  bool get hasCompileError => _expectations & _hasCompileError != 0;
-  bool get hasCrash => _expectations & _hasCrash != 0;
+  bool get hasRuntimeError => testFile?.hasRuntimeError ?? false;
+  bool get hasStaticWarning => testFile?.hasStaticWarning ?? false;
+  bool get hasSyntaxError => testFile?.hasSyntaxError ?? false;
+  bool get hasCompileError => testFile?.hasCompileError ?? false;
+  bool get hasCrash => testFile?.hasCrash ?? false;
   bool get isNegative =>
       hasCompileError ||
       hasRuntimeError && configuration.runtime != Runtime.none ||
       displayName.contains("negative_test");
 
   bool get unexpectedOutput {
-    var outcome = this.result;
+    var outcome = result;
     return !expectedOutcomes.any((expectation) {
       return outcome.canBeOutcomeOf(expectation);
     });
@@ -250,12 +228,12 @@
 
 /// A RunningProcess actually runs a test, getting the command lines from
 /// its [TestCase], starting the test process (and first, a compilation
-/// process if the TestCase is a [BrowserTestCase]), creating a timeout
-/// timer, and recording the results in a new [CommandOutput] object, which it
-/// attaches to the TestCase.  The lifetime of the RunningProcess is limited
-/// to the time it takes to start the process, run the process, and record
-/// the result; there are no pointers to it, so it should be available to
-/// be garbage collected as soon as it is done.
+/// process if the TestCase needs compilation), creating a timeout timer, and
+/// recording the results in a new [CommandOutput] object, which it attaches to
+/// the TestCase. The lifetime of the RunningProcess is limited to the time it
+/// takes to start the process, run the process, and record the result. There
+/// are no pointers to it, so it should be available to be garbage collected as
+/// soon as it is done.
 class RunningProcess {
   ProcessCommand command;
   int timeout;
diff --git a/pkg/test_runner/lib/src/test_configurations.dart b/pkg/test_runner/lib/src/test_configurations.dart
index a452642..5123fd1 100644
--- a/pkg/test_runner/lib/src/test_configurations.dart
+++ b/pkg/test_runner/lib/src/test_configurations.dart
@@ -11,8 +11,8 @@
 import 'co19_test_config.dart';
 import 'configuration.dart';
 import 'path.dart';
-import 'test_progress.dart';
 import 'process_queue.dart';
+import 'test_progress.dart';
 import 'test_suite.dart';
 import 'utils.dart';
 
@@ -149,12 +149,12 @@
   // If we only need to print out status files for test suites
   // we return from running here and just print.
   if (firstConf.listStatusFiles) {
-    testSuites.forEach((suite) {
+    for (var suite in testSuites) {
       print(suite.suiteName);
-      suite.statusFilePaths
-          .toSet()
-          .forEach((statusFile) => print("\t$statusFile"));
-    });
+      for (var statusFile in suite.statusFilePaths.toSet()) {
+        print("\t$statusFile");
+      }
+    }
     return;
   }
 
@@ -245,6 +245,6 @@
 
   // [firstConf] is needed here, since the ProcessQueue needs to know the
   // settings of 'noBatch' and 'local_ip'
-  ProcessQueue(firstConf, maxProcesses, maxBrowserProcesses, startTime,
-      testSuites, eventListener, allTestsFinished, verbose, adbDevicePool);
+  ProcessQueue(firstConf, maxProcesses, maxBrowserProcesses, testSuites,
+      eventListener, allTestsFinished, verbose, adbDevicePool);
 }
diff --git a/pkg/test_runner/lib/src/test_file.dart b/pkg/test_runner/lib/src/test_file.dart
index 4279b8e..9d2b56d 100644
--- a/pkg/test_runner/lib/src/test_file.dart
+++ b/pkg/test_runner/lib/src/test_file.dart
@@ -37,18 +37,12 @@
   return options;
 }
 
-/// A single error expectation comment from a [TestFile].
+/// Describes a static error.
 ///
-/// If a test contains any of these, then it is a "static error test" and
-/// exists to validate that a conforming front end produces the expected
-/// compile-time errors.
-///
-/// In order to make it easier to incrementally add error tests before a
-/// feature is fully implemented or specified, an error expectation can be in
-/// an "unspecified" state. That means all that's known is the line number. All
-/// other fields will be `null`. In that state, a front end is expected to
-/// report *some* error on that line, but it can be any location, error code, or
-/// message.
+/// These can be parsed from comments in [TestFile]s, in which case they
+/// represent *expected* errors. If a test contains any of these, then it is a
+/// "static error test" and exists to validate that a conforming front end
+/// produces the expected compile-time errors.
 ///
 /// Aside from location, there are two interesting attributes of an error that
 /// a test can verify: its error code and the error message. Currently, for
@@ -57,7 +51,62 @@
 /// that by allowing you to set expectations for analyzer and CFE independently
 /// by assuming the [code] field is only used for the former and the [message]
 /// for the latter.
-class ErrorExpectation {
+///
+/// This same class is also used for *reported* errors when parsing the output
+/// of a front end.
+class StaticError implements Comparable<StaticError> {
+  static const _unspecified = "unspecified";
+
+  /// Collapses overlapping [errors] into a shorter list of errors where
+  /// possible.
+  ///
+  /// Two errors on the same location can be collapsed if one has an error code
+  /// but no message and the other has a message but no code.
+  static List<StaticError> simplify(List<StaticError> errors) {
+    var result = errors.toList();
+    result.sort();
+
+    for (var i = 0; i < result.length - 1; i++) {
+      var a = result[i];
+
+      // Look for a later error we can merge with this one. Usually, it will be
+      // adjacent to this one, but if there are multiple errors with no length
+      // on the same location, those will all be next to each other and their
+      // merge targets will come later. This happens when CFE reports multiple
+      // errors at the same location (messages but no length) and analyzer does
+      // too (codes and lengths but no messages).
+      for (var j = i + 1; j < result.length; j++) {
+        var b = result[j];
+
+        // Position must be the same. If the position is different, we can
+        // stop looking because all same-position errors will be adjacent.
+        if (a.line != b.line) break;
+        if (a.column != b.column) break;
+
+        // If they both have lengths that are different, we can't discard that
+        // information.
+        if (a.length != null && b.length != null && a.length != b.length) {
+          continue;
+        }
+
+        // Can't discard content.
+        if (a.code != null && b.code != null) continue;
+        if (a.message != null && b.message != null) continue;
+
+        result[i] = StaticError(
+            line: a.line,
+            column: a.column,
+            length: a.length ?? b.length,
+            code: a.code ?? b.code,
+            message: a.message ?? b.message);
+        result.removeAt(j);
+        break;
+      }
+    }
+
+    return result;
+  }
+
   /// The one-based line number of the beginning of the error's location.
   final int line;
 
@@ -65,6 +114,8 @@
   final int column;
 
   /// The number of characters in the error location.
+  ///
+  /// This is optional. The CFE only reports error location, but not length.
   final int length;
 
   /// The expected analyzer error code for the error or `null` if this error
@@ -75,15 +126,137 @@
   /// be reported by the CFE.
   final String message;
 
-  ErrorExpectation(
-      {this.line, this.column, this.length, this.code, this.message});
+  /// The zero-based index of the first line in the [TestFile] containing the
+  /// marker comments that define this error.
+  ///
+  /// If this error was not parsed from a file, this may be `null`.
+  final int markerStartLine;
+
+  /// The zero-based index of the last line in the [TestFile] containing the
+  /// marker comments that define this error, inclusive.
+  ///
+  /// If this error was not parsed from a file, this may be `null`.
+  final int markerEndLine;
+
+  /// Creates a new StaticError at the given location with the given expected
+  /// error code and message.
+  ///
+  /// In order to make it easier to incrementally add error tests before a
+  /// feature is fully implemented or specified, an error expectation can be in
+  /// an "unspecified" state for either or both platforms by having the error
+  /// code or message be the special string "unspecified". When an unspecified
+  /// error is tested, a front end is expected to report *some* error on that
+  /// error's line, but it can be any location, error code, or message.
+  StaticError(
+      {this.line,
+      this.column,
+      this.length,
+      this.code,
+      this.message,
+      this.markerStartLine,
+      this.markerEndLine}) {
+    // Must have a location.
+    assert(line != null);
+    assert(column != null);
+
+    // Must have at least one piece of description.
+    assert(code != null || message != null);
+  }
+
+  /// Whether this error should be reported by analyzer.
+  bool get isAnalyzer => code != null;
+
+  /// Whether this error should be reported by the CFE.
+  bool get isCfe => message != null;
+
+  /// A textual description of this error's location.
+  String get location {
+    var result = "Error at line $line, column $column";
+    if (length != null) result += ", length $length";
+    return result;
+  }
 
   String toString() {
-    var result = "Error at line $line, column $column, length $length";
+    var result = location;
     if (code != null) result += "\n$code";
     if (message != null) result += "\n$message";
     return result;
   }
+
+  /// Orders errors primarily by location, then by other fields if needed.
+  @override
+  int compareTo(StaticError other) {
+    if (line != other.line) return line.compareTo(other.line);
+    if (column != other.column) return column.compareTo(other.column);
+
+    // Sort no length after all other lengths.
+    if (length == null && other.length != null) return 1;
+    if (length != null && other.length == null) return -1;
+    if (length != other.length) return length.compareTo(other.length);
+
+    var thisCode = code ?? "";
+    var otherCode = other.code ?? "";
+    if (thisCode != otherCode) return thisCode.compareTo(otherCode);
+
+    var thisMessage = message ?? "";
+    var otherMessage = other.message ?? "";
+    return thisMessage.compareTo(otherMessage);
+  }
+
+  /// Compares this error expectation to [actual].
+  ///
+  /// If this error correctly matches [actual], returns `null`. Otherwise
+  /// returns a list of strings describing the mismatch.
+  ///
+  /// Note that this does *not* check to see that [actual] matches the platforms
+  /// that this error expects. For example, if [actual] only reports an error
+  /// code (i.e. it is analyzer-only) and this error only specifies an error
+  /// message (i.e. it is CFE-only), this will still report differences in
+  /// location information. This method expects that error expectations have
+  /// already been filtered by platform so this will only be called in cases
+  /// where the platforms do match.
+  List<String> describeDifferences(StaticError actual) {
+    var differences = <String>[];
+
+    if (line != actual.line) {
+      differences.add("Expected on line $line but was on ${actual.line}.");
+    }
+
+    // If the error is unspecified on the front end being tested, the column
+    // and length can be any values.
+    var requirePreciseLocation = code != _unspecified && actual.isAnalyzer ||
+        message != _unspecified && actual.isCfe;
+    if (requirePreciseLocation) {
+      if (column != actual.column) {
+        differences
+            .add("Expected on column $column but was on ${actual.column}.");
+      }
+
+      // This error represents an expectation, so should have a length.
+      assert(length != null);
+      if (actual.length != null && length != actual.length) {
+        differences.add("Expected length $length but was ${actual.length}.");
+      }
+    }
+
+    if (code != null &&
+        code != _unspecified &&
+        actual.code != null &&
+        code != actual.code) {
+      differences.add("Expected error code $code but was ${actual.code}.");
+    }
+
+    if (message != null &&
+        message != _unspecified &&
+        actual.message != null &&
+        message != actual.message) {
+      differences.add(
+          "Expected error message '$message' but was '${actual.message}'.");
+    }
+
+    if (differences.isNotEmpty) return differences;
+    return null;
+  }
 }
 
 abstract class _TestFileBase {
@@ -100,12 +273,20 @@
 
   /// The parsed error expectation markers in this test, if it is a static
   /// error test.
-  final List<ErrorExpectation> expectedErrors;
+  final List<StaticError> expectedErrors;
 
   /// The name of the multitest section this file corresponds to if it was
   /// generated from a multitest. Otherwise, returns an empty string.
   String get multitestKey;
 
+  /// If the text contains static error expectations, it's a "static error
+  /// test".
+  ///
+  /// These tests exist to validate that a front end reports the right static
+  /// errors. They are skipped on configurations that don't intend to test
+  /// static error reporting.
+  bool get isStaticErrorTest => expectedErrors.isNotEmpty;
+
   _TestFileBase(this._suiteDirectory, this.path, this.expectedErrors) {
     assert(path.isAbsolute);
   }
@@ -312,9 +493,9 @@
     var hasSyntaxError = contents.contains("@syntax-error");
     var hasCompileError = hasSyntaxError || contents.contains("@compile-error");
 
-    List<ErrorExpectation> errorExpectations;
+    List<StaticError> errorExpectations;
     try {
-      errorExpectations = _ErrorExpectationParser(contents).parse();
+      errorExpectations = ErrorExpectationParser.parse(contents);
     } on FormatException catch (error) {
       throw FormatException(
           "Invalid error expectation syntax in $filePath:\n$error");
@@ -363,8 +544,7 @@
         otherResources = [],
         super(null, null, []);
 
-  TestFile._(
-      Path suiteDirectory, Path path, List<ErrorExpectation> expectedErrors,
+  TestFile._(Path suiteDirectory, Path path, List<StaticError> expectedErrors,
       {this.packageRoot,
       this.packages,
       this.environment,
@@ -421,7 +601,7 @@
           bool hasStaticWarning,
           bool hasSyntaxError}) =>
       _MultitestFile(
-          this, path, multitestKey, _ErrorExpectationParser(contents).parse(),
+          this, path, multitestKey, ErrorExpectationParser.parse(contents),
           hasCompileError: hasCompileError ?? false,
           hasRuntimeError: hasRuntimeError ?? false,
           hasStaticWarning: hasStaticWarning ?? false,
@@ -466,7 +646,7 @@
   bool get hasCrash => _origin.hasCrash;
 
   _MultitestFile(this._origin, Path path, this.multitestKey,
-      List<ErrorExpectation> expectedErrors,
+      List<StaticError> expectedErrors,
       {this.hasCompileError,
       this.hasRuntimeError,
       this.hasStaticWarning,
@@ -501,7 +681,10 @@
           "Can't derive a test from one already derived from a multitest.");
 }
 
-class _ErrorExpectationParser {
+class ErrorExpectationParser {
+  static List<StaticError> parse(String source) =>
+      ErrorExpectationParser._(source)._parse();
+
   /// Marks the location of an expected error, like so:
   ///
   ///     int i = "s";
@@ -511,43 +694,46 @@
   /// carets.
   static final _caretLocationRegExp = RegExp(r"^\s*//\s*(\^+)\s*$");
 
-  /// Matches an explicit error location, like:
+  /// Matches an explicit error location with a length, like:
   ///
   ///     // [error line 1, column 17, length 3]
-  static final _explicitLocationRegExp =
+  static final _explicitLocationAndLengthRegExp =
       RegExp(r"^\s*//\s*\[\s*error line\s+(\d+)\s*,\s*column\s+(\d+)\s*,\s*"
           r"length\s+(\d+)\s*\]\s*$");
 
-  /// An analyzer error code is a dotted identifier.
-  static final _unspecifiedErrorRegExp =
-      RegExp(r"^\s*// \[unspecified error\]");
+  /// Matches an explicit error location without a length, like:
+  ///
+  ///     // [error line 1, column 17]
+  static final _explicitLocationRegExp =
+      RegExp(r"^\s*//\s*\[\s*error line\s+(\d+)\s*,\s*column\s+(\d+)\s*\]\s*$");
 
-  /// An analyzer error expectation starts with "// [analyzer]".
+  /// An analyzer error expectation starts with `// [analyzer]`.
   static final _analyzerErrorRegExp = RegExp(r"^\s*// \[analyzer\]\s*(.*)");
 
-  /// An analyzer error code is a dotted identifier.
-  static final _errorCodeRegExp = RegExp(r"^\w+\.\w+$");
+  /// An analyzer error code is a dotted identifier or the magic string
+  /// "unspecified".
+  static final _errorCodeRegExp = RegExp(r"^\w+\.\w+|unspecified$");
 
-  /// The first line of a CFE error expectation starts with "// [cfe]".
+  /// The first line of a CFE error expectation starts with `// [cfe]`.
   static final _cfeErrorRegExp = RegExp(r"^\s*// \[cfe\]\s*(.*)");
 
-  /// Any line-comment-only lines after the first line of a CFE error message are
-  /// part of it.
+  /// Any line-comment-only lines after the first line of a CFE error message
+  /// are part of it.
   static final _errorMessageRestRegExp = RegExp(r"^\s*//\s*(.*)");
 
   /// Matches the multitest marker and yields the preceding content.
   final _stripMultitestRegExp = RegExp(r"(.*)//#");
 
   final List<String> _lines;
-  final List<ErrorExpectation> _errors = [];
+  final List<StaticError> _errors = [];
   int _currentLine = 0;
 
-  /// One-based index of the last line that wasn't part of an error expectation.
+  // One-based index of the last line that wasn't part of an error expectation.
   int _lastRealLine = -1;
 
-  _ErrorExpectationParser(String source) : _lines = source.split("\n");
+  ErrorExpectationParser._(String source) : _lines = source.split("\n");
 
-  List<ErrorExpectation> parse() {
+  List<StaticError> _parse() {
     while (!_isAtEnd) {
       var sourceLine = _peek(0);
 
@@ -565,7 +751,7 @@
         continue;
       }
 
-      match = _explicitLocationRegExp.firstMatch(sourceLine);
+      match = _explicitLocationAndLengthRegExp.firstMatch(sourceLine);
       if (match != null) {
         _parseErrorDetails(
             line: int.parse(match.group(1)),
@@ -575,9 +761,10 @@
         continue;
       }
 
-      match = _unspecifiedErrorRegExp.firstMatch(sourceLine);
+      match = _explicitLocationRegExp.firstMatch(sourceLine);
       if (match != null) {
-        _errors.add(ErrorExpectation(line: _lastRealLine));
+        _parseErrorDetails(
+            line: int.parse(match.group(1)), column: int.parse(match.group(2)));
         _advance();
         continue;
       }
@@ -594,6 +781,8 @@
     String code;
     String message;
 
+    var startLine = _currentLine;
+
     // Look for an error code line.
     if (!_isAtEnd) {
       var match = _analyzerErrorRegExp.firstMatch(_peek(1));
@@ -621,6 +810,7 @@
 
           // A location line shouldn't be treated as a message.
           if (_caretLocationRegExp.hasMatch(nextLine)) break;
+          if (_explicitLocationAndLengthRegExp.hasMatch(nextLine)) break;
           if (_explicitLocationRegExp.hasMatch(nextLine)) break;
 
           // Don't let users arbitrarily order the error code and message.
@@ -643,12 +833,14 @@
           "error.");
     }
 
-    _errors.add(ErrorExpectation(
+    _errors.add(StaticError(
         line: line,
         column: column,
         length: length,
         code: code,
-        message: message));
+        message: message,
+        markerStartLine: startLine,
+        markerEndLine: _currentLine));
   }
 
   bool get _isAtEnd => _currentLine >= _lines.length;
diff --git a/pkg/test_runner/lib/src/test_progress.dart b/pkg/test_runner/lib/src/test_progress.dart
index 19cbea8..78a9310 100644
--- a/pkg/test_runner/lib/src/test_progress.dart
+++ b/pkg/test_runner/lib/src/test_progress.dart
@@ -146,7 +146,7 @@
       final binFile = File(binName);
       final binBaseName = Path(binName).filename;
       if (!archivedBinaries.containsKey(binName) && binFile.existsSync()) {
-        final archived = "binary.${mode}_${arch}_${binBaseName}";
+        final archived = "binary.${mode}_${arch}_$binBaseName";
         TestUtils.copyFile(Path(binName), Path(archived));
         // On Windows also copy PDB file for the binary.
         if (Platform.isWindows) {
@@ -163,7 +163,7 @@
           File('${binFile.parent.path}/$kernelServiceBaseName');
       if (!archivedBinaries.containsKey(kernelService) &&
           kernelService.existsSync()) {
-        final archived = "binary.${mode}_${arch}_${kernelServiceBaseName}";
+        final archived = "binary.${mode}_${arch}_$kernelServiceBaseName";
         TestUtils.copyFile(Path(kernelService.path), Path(archived));
         archivedBinaries[kernelServiceBaseName] = archived;
       }
@@ -182,16 +182,16 @@
           unexpectedCrashesFile =
               File('unexpected-crashes').openSync(mode: FileMode.append);
           unexpectedCrashesFile.writeStringSync(
-              "${test.displayName},${pid},${binaries.join(',')}\n");
+              "${test.displayName},$pid,${binaries.join(',')}\n");
         } catch (e) {
-          print('Failed to add crash to unexpected-crashes list: ${e}');
+          print('Failed to add crash to unexpected-crashes list: $e');
         } finally {
           try {
             if (unexpectedCrashesFile != null) {
               unexpectedCrashesFile.closeSync();
             }
           } catch (e) {
-            print('Failed to close unexpected-crashes file: ${e}');
+            print('Failed to close unexpected-crashes file: $e');
           }
         }
       }
@@ -202,8 +202,7 @@
 class SummaryPrinter extends EventListener {
   final bool jsonOnly;
 
-  SummaryPrinter({bool jsonOnly})
-      : jsonOnly = (jsonOnly == null) ? false : jsonOnly;
+  SummaryPrinter({bool jsonOnly}) : jsonOnly = jsonOnly ?? false;
 
   void allTestsKnown() {
     if (jsonOnly) {
@@ -218,7 +217,7 @@
 class TimingPrinter extends EventListener {
   final _commandToTestCases = <Command, List<TestCase>>{};
   final _commandOutputs = <CommandOutput>{};
-  DateTime _startTime;
+  final DateTime _startTime;
 
   TimingPrinter(this._startTime);
 
@@ -255,8 +254,8 @@
 }
 
 class StatusFileUpdatePrinter extends EventListener {
-  var statusToConfigs = <String, List<String>>{};
-  var _failureSummary = <String>[];
+  final Map<String, List<String>> statusToConfigs = {};
+  final List<String> _failureSummary = [];
 
   void done(TestCase test) {
     if (test.unexpectedOutput) {
@@ -404,7 +403,7 @@
         var commandOutput = test.commandOutputs[command];
         if (commandOutput == null) continue;
 
-        commandOutput.describe(test.configuration.progress, output);
+        commandOutput.describe(test, test.configuration.progress, output);
       }
       for (var line in lines) {
         print(line);
@@ -416,6 +415,12 @@
 }
 
 class ProgressIndicator extends EventListener {
+  final DateTime _startTime;
+  int _foundTests = 0;
+  int _passedTests = 0;
+  int _failedTests = 0;
+  bool _allTestsKnown = false;
+
   ProgressIndicator(this._startTime);
 
   static EventListener fromProgress(
@@ -456,12 +461,6 @@
   void _printDoneProgress(TestCase test) {}
 
   int _completedTests() => _passedTests + _failedTests;
-
-  int _foundTests = 0;
-  int _passedTests = 0;
-  int _failedTests = 0;
-  bool _allTestsKnown = false;
-  DateTime _startTime;
 }
 
 abstract class CompactIndicator extends ProgressIndicator {
@@ -491,7 +490,7 @@
     var progressPadded = (_allTestsKnown ? percent : '--').padLeft(3);
     var passedPadded = _passedTests.toString().padLeft(5);
     var failedPadded = _failedTests.toString().padLeft(5);
-    var elapsed = (DateTime.now()).difference(_startTime);
+    var elapsed = DateTime.now().difference(_startTime);
     var progressLine = '\r[${_timeString(elapsed)} | $progressPadded% | '
         '+${_formatter.passed(passedPadded)} | '
         '-${_formatter.failed(failedPadded)}]';
@@ -562,31 +561,42 @@
   final List<String> _lines;
   String _pendingSection;
   String _pendingSubsection;
+  bool _pendingLine = false;
 
   OutputWriter(this._formatter, this._lines);
 
   void section(String name) {
     _pendingSection = name;
     _pendingSubsection = null;
+    _pendingLine = false;
   }
 
   void subsection(String name) {
     _pendingSubsection = name;
+    _pendingLine = false;
   }
 
   void write(String line) {
-    _flushSection();
+    _writePending();
     _lines.add(line);
   }
 
   void writeAll(Iterable<String> lines) {
     if (lines.isEmpty) return;
-    _flushSection();
+    _writePending();
     _lines.addAll(lines);
   }
 
+  /// Writes a blank line that separates lines of output.
+  ///
+  /// If no output is written after this before the next section, subsection,
+  /// or end out output, doesn't write the line.
+  void separator() {
+    _pendingLine = true;
+  }
+
   /// Writes the current section header.
-  void _flushSection() {
+  void _writePending() {
     if (_pendingSection != null) {
       if (_lines.isNotEmpty) _lines.add("");
       _lines.add(_formatter.section("--- $_pendingSection:"));
@@ -598,6 +608,11 @@
       _lines.add(_formatter.section("$_pendingSubsection:"));
       _pendingSubsection = null;
     }
+
+    if (_pendingLine) {
+      _lines.add("");
+      _pendingLine = false;
+    }
   }
 }
 
@@ -654,7 +669,7 @@
     var time = niceTime(commandOutput.time);
     output.section('Command "${command.displayName}" (took $time)');
     output.write(command.toString());
-    commandOutput.describe(test.configuration.progress, output);
+    commandOutput.describe(test, test.configuration.progress, output);
   }
 }
 
@@ -686,7 +701,7 @@
   } else {
     var pluralSuffix = failedTests != 1 ? 's' : '';
     return formatter
-        .failed('\n===\n=== ${failedTests} test$pluralSuffix failed\n===\n');
+        .failed('\n===\n=== $failedTests test$pluralSuffix failed\n===\n');
   }
 }
 
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 618a023..71a5870 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -62,7 +62,7 @@
 class FutureGroup {
   static const _finished = -1;
   int _pending = 0;
-  Completer<List> _completer = Completer();
+  final Completer<List> _completer = Completer();
   final List<Future> futures = [];
   bool wasCompleted = false;
 
@@ -173,7 +173,7 @@
       if (expectations.isEmpty) expectations.add(Expectation.pass);
     }
 
-    var negative = testFile != null ? isNegative(testFile) : false;
+    var negative = testFile != null && isNegative(testFile);
     var testCase = TestCase(displayName, commands, configuration, expectations,
         testFile: testFile);
     if (negative &&
@@ -318,7 +318,7 @@
     }
   }
 
-  Future<Null> forEachTest(Function onTest, Map testCache,
+  Future<Null> forEachTest(TestCaseEvent onTest, Map testCache,
       [VoidFunction onDone]) async {
     doTest = onTest;
 
@@ -450,8 +450,8 @@
               .add(suiteDir.append('$s.dart').toNativePath());
           // If the test is a multitest, the filename doesn't include the label.
           // Also if it has multiple VMOptions.  If both, remove two labels.
-          for (var i in [1, 2]) {
-            // Twice
+          for (var i = 0; i < 2; i++) {
+            // Twice.
             if (s.lastIndexOf('/') != -1) {
               s = s.substring(0, s.lastIndexOf('/'));
               _testListPossibleFilenames
@@ -529,7 +529,8 @@
 
   List<String> additionalOptions(Path filePath) => [];
 
-  Future forEachTest(Function onTest, Map<String, List<TestFile>> testCache,
+  Future forEachTest(
+      TestCaseEvent onTest, Map<String, List<TestFile>> testCache,
       [VoidFunction onDone]) async {
     doTest = onTest;
     testExpectations = readExpectations();
@@ -618,8 +619,23 @@
   }
 
   void enqueueTestCaseFromTestFile(TestFile testFile) {
+    // Static error tests are currently skipped on every implementation except
+    // analyzer and Fasta.
+    // TODO(rnystrom): Should other configurations that use CFE support static
+    // error tests?
+    // TODO(rnystrom): Skipping this here is a little unusual because most
+    // skips are handled in enqueueStandardTest(). However, if the configuration
+    // is running on browser, calling enqueueStandardTest() will try to create
+    // a set of commands which ultimately causes an exception in
+    // DummyRuntimeConfiguration. This avoids that.
+    if (testFile.isStaticErrorTest &&
+        configuration.compiler != Compiler.dart2analyzer &&
+        configuration.compiler != Compiler.fasta) {
+      return;
+    }
+
     if (configuration.compilerConfiguration.hasCompiler &&
-        testFile.hasCompileError) {
+        (testFile.hasCompileError || testFile.isStaticErrorTest)) {
       // If a compile-time error is expected, and we're testing a
       // compiler, we never need to attempt to run the program (in a
       // browser or otherwise).
@@ -665,17 +681,18 @@
 
       var expectations = testExpectations.expectations(testFile.name);
       var isCrashExpected = expectations.contains(Expectation.crash);
-      var commands = makeCommands(testFile, vmOptionsVariant, allVmOptions,
+      var commands = _makeCommands(testFile, vmOptionsVariant, allVmOptions,
           commonArguments, isCrashExpected);
       var variantTestName = testFile.name;
       if (vmOptionsList.length > 1) {
         variantTestName = "${testFile.name}/$vmOptionsVariant";
       }
+
       enqueueNewTestCase(testFile, variantTestName, commands, expectations);
     }
   }
 
-  List<Command> makeCommands(TestFile testFile, int vmOptionsVariant,
+  List<Command> _makeCommands(TestFile testFile, int vmOptionsVariant,
       List<String> vmOptions, List<String> args, bool isCrashExpected) {
     var commands = <Command>[];
     var compilerConfiguration = configuration.compilerConfiguration;
@@ -803,7 +820,7 @@
   ///
   /// In order to handle browser multitests, [expectations] is a map of subtest
   /// names to expectation sets. If the test is not a multitest, the map has
-  /// a single key, [testFile.name].
+  /// a single key, `testFile.name`.
   void _enqueueBrowserTest(
       TestFile testFile, Map<String, Set<Expectation>> expectations) {
     var tempDir = createOutputDirectory(testFile.path);
@@ -828,9 +845,18 @@
             _createUrlPathFromFile(Path('$compilationTempDir/$nameNoExt.js'));
         content = dart2jsHtml(testFile.path.toNativePath(), scriptPath);
       } else {
+        var packageRoot =
+            packagesArgument(configuration.packageRoot, configuration.packages);
+        packageRoot =
+            packageRoot == null ? nameNoExt : packageRoot.split("=").last;
+        var nameFromModuleRoot =
+            testFile.path.relativeTo(Path(packageRoot).directoryPath);
+        var nameFromModuleRootNoExt =
+            "${nameFromModuleRoot.directoryPath}/$nameNoExt";
         var jsDir =
             Path(compilationTempDir).relativeTo(Repository.dir).toString();
-        content = dartdevcHtml(nameNoExt, jsDir, configuration.compiler);
+        content = dartdevcHtml(
+            nameNoExt, nameFromModuleRootNoExt, jsDir, configuration.compiler);
       }
     }
 
diff --git a/pkg/test_runner/lib/src/testing_servers.dart b/pkg/test_runner/lib/src/testing_servers.dart
index 06a1fc5..9831e6d 100644
--- a/pkg/test_runner/lib/src/testing_servers.dart
+++ b/pkg/test_runner/lib/src/testing_servers.dart
@@ -14,11 +14,10 @@
 
 class DispatchingServer {
   HttpServer server;
-  Map<String, Function> _handlers = {};
-  Function _notFound;
+  final Map<String, Function> _handlers = {};
+  final void Function(HttpRequest request) _notFound;
 
-  DispatchingServer(
-      this.server, void onError(e), void this._notFound(HttpRequest request)) {
+  DispatchingServer(this.server, void onError(e), this._notFound) {
     server.listen(_dispatchRequest, onError: onError);
   }
 
@@ -332,7 +331,7 @@
       if (headerOrigin != null) {
         var origin = Uri.parse(headerOrigin);
         // Allow loading from http://*:$allowedPort in browsers.
-        allowedOrigin = '${origin.scheme}://${origin.host}:${allowedPort}';
+        allowedOrigin = '${origin.scheme}://${origin.host}:$allowedPort';
       } else {
         // IE10 appears to be bugged and is not sending the Origin header
         // when making CORS requests to the same domain but different port.
diff --git a/pkg/test_runner/lib/src/update_errors.dart b/pkg/test_runner/lib/src/update_errors.dart
new file mode 100644
index 0000000..19d81e4
--- /dev/null
+++ b/pkg/test_runner/lib/src/update_errors.dart
@@ -0,0 +1,137 @@
+// 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 'test_file.dart';
+
+/// Matches leading indentation in a string.
+final _indentationRegExp = RegExp(r"^(\s*)");
+
+/// Matches a line that contains only a line comment.
+final _lineCommentRegExp = RegExp(r"^\s*//");
+
+/// Removes existing static error marker comments in [source] and adds markers
+/// for the given [errors].
+///
+/// If [removeAnalyzer] is `false`, then existing analyzer errors in [source]
+/// are preserved. Likewise for [removeCfe] and CFE errors.
+String updateErrorExpectations(String source, List<StaticError> errors,
+    {bool removeAnalyzer, bool removeCfe}) {
+  removeAnalyzer ??= true;
+  removeCfe ??= true;
+
+  var existingErrors = ErrorExpectationParser.parse(source);
+  var lines = source.split("\n");
+
+  // Keep track of the indentation on any existing expectation markers. If
+  // found, it will try to preserve that indentation.
+  var indentation = <int, int>{};
+
+  // Remove existing markers that should be removed.
+  var preservedErrors = <StaticError>[];
+  for (var error in existingErrors) {
+    for (var i = error.markerStartLine; i <= error.markerEndLine; i++) {
+      indentation[i] = _countIndentation(lines[i]);
+
+      // Null the line instead of removing it so that line numbers in the
+      // reported errors are still correct.
+      lines[i] = null;
+    }
+
+    // Re-add errors for the portions we intend to preserve.
+    var keepCode = !removeAnalyzer && error.code != null;
+    var keepMessage = !removeCfe && error.message != null;
+
+    if (keepCode || keepMessage) {
+      preservedErrors.add(StaticError(
+          line: error.line,
+          column: error.column,
+          length: error.length,
+          code: keepCode ? error.code : null,
+          message: keepMessage ? error.message : null));
+    }
+  }
+
+  // Merge the new errors with the preserved ones.
+  errors = StaticError.simplify([...errors, ...preservedErrors]);
+
+  var errorMap = <int, List<StaticError>>{};
+  for (var error in errors) {
+    // -1 to translate from one-based to zero-based index.
+    errorMap.putIfAbsent(error.line - 1, () => []).add(error);
+  }
+
+  // If there are multiple errors on the same line, order them
+  // deterministically.
+  for (var errorList in errorMap.values) {
+    errorList.sort();
+  }
+
+  var previousIndent = 0;
+  var result = <String>[];
+  for (var i = 0; i < lines.length; i++) {
+    // Keep the code.
+    if (lines[i] != null) {
+      result.add(lines[i]);
+      previousIndent = _countIndentation(lines[i]);
+    }
+
+    // Add expectations for any errors reported on this line.
+    var errorsHere = errorMap[i];
+    if (errorsHere == null) continue;
+    for (var error in errorsHere) {
+      // Try to indent the line nicely to match either the existing expectation
+      // that is being regenerated, or, barring that, the previous line of code.
+      var indent = indentation[i + 1] ?? previousIndent;
+
+      // If the error is to the left of the indent and the "//", sacrifice the
+      // indentation.
+      if (error.column - 1 < indent + 2) indent = 0;
+
+      var comment = (" " * indent) + "//";
+
+      // If the error can't fit in a line comment or doesn't have a length, use
+      // an explicit location.
+      if (error.length == null) {
+        result.add("$comment [error line ${error.line}, column "
+            "${error.column}]");
+      } else if (error.column <= 2) {
+        result.add("$comment [error line ${error.line}, column "
+            "${error.column}, length ${error.length}]");
+      } else {
+        var spacing = " " * (error.column - 1 - 2 - indent);
+        // A CFE-only error may not have a length, so treat it as length 1.
+        var carets = "^" * (error.length ?? 1);
+        result.add("$comment$spacing$carets");
+      }
+
+      if (error.code != null) {
+        result.add("$comment [analyzer] ${error.code}");
+      }
+
+      if (error.message != null) {
+        var errorLines = error.message.split("\n");
+        result.add("$comment [cfe] ${errorLines[0]}");
+        for (var errorLine in errorLines.skip(1)) {
+          result.add("$comment $errorLine");
+        }
+
+        // If the very next line in the source is a line comment, it would
+        // become part of the inserted message. To prevent that, insert a blank
+        // line.
+        if (i < lines.length - 1 &&
+            lines[i + 1] != null &&
+            _lineCommentRegExp.hasMatch(lines[i + 1])) {
+          result.add("");
+        }
+      }
+    }
+  }
+
+  return result.join("\n");
+}
+
+/// Returns the number of characters of leading spaces in [line].
+int _countIndentation(String line) {
+  var match = _indentationRegExp.firstMatch(line);
+  return match.group(1).length;
+}
diff --git a/pkg/test_runner/lib/src/utils.dart b/pkg/test_runner/lib/src/utils.dart
index 121b235..84482aa 100644
--- a/pkg/test_runner/lib/src/utils.dart
+++ b/pkg/test_runner/lib/src/utils.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:async';
-import 'dart:io';
 import 'dart:convert';
+import 'dart:io';
 
 import 'configuration.dart';
 import 'path.dart';
@@ -31,6 +31,12 @@
   "unittest"
 ];
 
+/// Gets the file extension for a shell script on the host OS.
+String get shellScriptExtension => Platform.isWindows ? '.bat' : '';
+
+/// Gets the file extension for an executable binary on the host OS.
+String get executableExtension => Platform.isWindows ? '.exe' : '';
+
 class DebugLogger {
   static IOSink _sink;
 
@@ -131,13 +137,11 @@
   return buffer.toString();
 }
 
-/// [areByteArraysEqual] compares a range of bytes from [buffer1] with a
-/// range of bytes from [buffer2].
+/// Compares a range of bytes from [buffer1] with a range of bytes from
+/// [buffer2].
 ///
-/// Returns [true] if the [count] bytes in [buffer1] (starting at
-/// [offset1]) match the [count] bytes in [buffer2] (starting at
-/// [offset2]).
-/// Otherwise [false] is returned.
+/// Returns `true` if the [count] bytes in [buffer1] (starting at [offset1])
+/// match the [count] bytes in [buffer2] (starting at [offset2]).
 bool areByteArraysEqual(
     List<int> buffer1, int offset1, List<int> buffer2, int offset2, int count) {
   if ((offset1 + count) > buffer1.length ||
@@ -153,10 +157,9 @@
   return true;
 }
 
-/// [findBytes] searches for [pattern] in [data] beginning at [startPos].
+/// Searches for [pattern] in [data] beginning at [startPos].
 ///
-/// Returns [true] if [pattern] was found in [data].
-/// Otherwise [false] is returned.
+/// Returns `true` if [pattern] was found in [data].
 int findBytes(List<int> data, List<int> pattern, [int startPos = 0]) {
   // TODO(kustermann): Use one of the fast string-matching algorithms!
   for (int i = startPos; i < (data.length - pattern.length); i++) {
@@ -217,11 +220,11 @@
       digits(6, duration.inMilliseconds, Duration.millisecondsPerSecond);
 
   if (duration.inHours >= 1) {
-    return "${duration.inHours}:${minutes}:${seconds}s";
+    return "${duration.inHours}:$minutes:${seconds}s";
   } else if (duration.inMinutes >= 1) {
-    return "${minutes}:${seconds}.${millis}s";
+    return "$minutes:$seconds.${millis}s";
   } else if (duration.inSeconds >= 1) {
-    return "${seconds}.${millis}s";
+    return "$seconds.${millis}s";
   } else {
     return "${duration.inMilliseconds}ms";
   }
@@ -308,13 +311,14 @@
 }
 
 class LastModifiedCache {
-  Map<String, DateTime> _cache = <String, DateTime>{};
+  final Map<String, DateTime> _cache = {};
 
   /// Returns the last modified date of the given [uri].
   ///
   /// The return value will be cached for future queries. If [uri] is a local
-  /// file, it's last modified [Date] will be returned. If the file does not
+  /// file, its last modified [DateTime] will be returned. If the file does not
   /// exist, null will be returned instead.
+  ///
   /// In case [uri] is not a local file, this method will always return
   /// the current date.
   DateTime getLastModified(Uri uri) {
@@ -331,7 +335,7 @@
 }
 
 class ExistsCache {
-  Map<String, bool> _cache = <String, bool>{};
+  final Map<String, bool> _cache = {};
 
   /// Returns true if the file in [path] exists, false otherwise.
   ///
@@ -375,7 +379,7 @@
   }
 
   /// Keep a map of files copied to avoid race conditions.
-  static Map<String, Future> _copyFilesMap = {};
+  static final Map<String, Future> _copyFilesMap = {};
 
   /// Copy a [source] file to a new place.
   /// Assumes that the directory for [dest] already exists.
diff --git a/pkg/test_runner/lib/src/vendored_pkg/args/args.dart b/pkg/test_runner/lib/src/vendored_pkg/args/args.dart
index 845adbf..d36be63 100644
--- a/pkg/test_runner/lib/src/vendored_pkg/args/args.dart
+++ b/pkg/test_runner/lib/src/vendored_pkg/args/args.dart
@@ -2,276 +2,262 @@
 // for 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 library lets you define parsers for parsing raw command-line arguments
- * into a set of options and values using [GNU][] and [POSIX][] style options.
- *
- * ## Defining options ##
- *
- * To use this library, you create an [ArgParser] object which will contain
- * the set of options you support:
- *
- *     var parser = new ArgParser();
- *
- * Then you define a set of options on that parser using [addOption()] and
- * [addFlag()]. The minimal way to create an option is:
- *
- *     parser.addOption('name');
- *
- * This creates an option named "name". Options must be given a value on the
- * command line. If you have a simple on/off flag, you can instead use:
- *
- *     parser.addFlag('name');
- *
- * Flag options will, by default, accept a 'no-' prefix to negate the option.
- * This can be disabled like so:
- *
- *     parser.addFlag('name', negatable: false);
- *
- * (From here on out "option" will refer to both "regular" options and flags.
- * In cases where the distinction matters, we'll use "non-flag option".)
- *
- * Options may have an optional single-character abbreviation:
- *
- *     parser.addOption('mode', abbr: 'm');
- *     parser.addFlag('verbose', abbr: 'v');
- *
- * They may also specify a default value. The default value will be used if the
- * option isn't provided:
- *
- *     parser.addOption('mode', defaultsTo: 'debug');
- *     parser.addFlag('verbose', defaultsTo: false);
- *
- * The default value for non-flag options can be any [String]. For flags, it
- * must be a [bool].
- *
- * To validate non-flag options, you may provide an allowed set of values. When
- * you do, it will throw a [FormatException] when you parse the arguments if
- * the value for an option is not in the allowed set:
- *
- *     parser.addOption('mode', allowed: ['debug', 'release']);
- *
- * You can provide a callback when you define an option. When you later parse
- * a set of arguments, the callback for that option will be invoked with the
- * value provided for it:
- *
- *     parser.addOption('mode', callback: (mode) => print('Got mode $mode));
- *     parser.addFlag('verbose', callback: (verbose) {
- *       if (verbose) print('Verbose');
- *     });
- *
- * The callback for each option will *always* be called when you parse a set of
- * arguments. If the option isn't provided in the args, the callback will be
- * passed the default value, or `null` if there is none set.
- *
- * ## Parsing arguments ##
- *
- * Once you have an [ArgParser] set up with some options and flags, you use it
- * by calling [ArgParser.parse()] with a set of arguments:
- *
- *     var results = parser.parse(['some', 'command', 'line', 'args']);
- *
- * These will usually come from `new Options().arguments`, but you can pass in
- * any list of strings. It returns an instance of [ArgResults]. This is a
- * map-like object that will return the value of any parsed option.
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode');
- *     parser.addFlag('verbose', defaultsTo: true);
- *     var results = parser.parse('['--mode', 'debug', 'something', 'else']);
- *
- *     print(results['mode']); // debug
- *     print(results['verbose']); // true
- *
- * The [parse()] method will stop as soon as it reaches `--` or anything that
- * it doesn't recognize as an option, flag, or option value. If there are still
- * arguments left, they will be provided to you in
- * [ArgResults.rest].
- *
- *     print(results.rest); // ['something', 'else']
- *
- * ## Specifying options ##
- *
- * To actually pass in options and flags on the command line, use GNU or POSIX
- * style. If you define an option like:
- *
- *     parser.addOption('name', abbr: 'n');
- *
- * Then a value for it can be specified on the command line using any of:
- *
- *     --name=somevalue
- *     --name somevalue
- *     -nsomevalue
- *     -n somevalue
- *
- * Given this flag:
- *
- *     parser.addFlag('name', abbr: 'n');
- *
- * You can set it on using one of:
- *
- *     --name
- *     -n
- *
- * Or set it off using:
- *
- *     --no-name
- *
- * Multiple flag abbreviation can also be collapsed into a single argument. If
- * you define:
- *
- *     parser.addFlag('verbose', abbr: 'v');
- *     parser.addFlag('french', abbr: 'f');
- *     parser.addFlag('iambic-pentameter', abbr: 'i');
- *
- * Then all three flags could be set using:
- *
- *     -vfi
- *
- * By default, an option has only a single value, with later option values
- * overriding earlier ones; for example:
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode');
- *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
- *     print(results['mode']); // prints 'off'
- *
- * If you need multiple values, set the [allowMultiple] flag. In that
- * case the option can occur multiple times and when parsing arguments a
- * List of values will be returned:
- *
- *     var parser = new ArgParser();
- *     parser.addOption('mode', allowMultiple: true);
- *     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
- *     print(results['mode']); // prints '[on, off]'
- *
- * ## Defining commands ##
- *
- * In addition to *options*, you can also define *commands*. A command is a
- * named argument that has its own set of options. For example, when you run:
- *
- *     $ git commit -a
- *
- * The executable is `git`, the command is `commit`, and the `-a` option is an
- * option passed to the command. You can add a command like so:
- *
- *     var parser = new ArgParser();
- *     var command = parser.addCommand("commit");
- *     command.addFlag('all', abbr: 'a');
- *
- * It returns another [ArgParser] which you can use to define options and
- * subcommands on that command. When an argument list is parsed, you can then
- * determine which command was entered and what options were provided for it.
- *
- *     var results = parser.parse(['commit', '-a']);
- *     print(results.command.name); // "commit"
- *     print(results.command['a']); // true
- *
- * ## Displaying usage ##
- *
- * This library can also be used to automatically generate nice usage help
- * text like you get when you run a program with `--help`. To use this, you
- * will also want to provide some help text when you create your options. To
- * define help text for the entire option, do:
- *
- *     parser.addOption('mode', help: 'The compiler configuration',
- *         allowed: ['debug', 'release']);
- *     parser.addFlag('verbose', help: 'Show additional diagnostic info');
- *
- * For non-flag options, you can also provide detailed help for each expected
- * value using a map:
- *
- *     parser.addOption('arch', help: 'The architecture to compile for',
- *         allowedHelp: {
- *           'ia32': 'Intel x86',
- *           'arm': 'ARM Holding 32-bit chip'
- *         });
- *
- * If you define a set of options like the above, then calling this:
- *
- *     print(parser.getUsage());
- *
- * Will display something like:
- *
- *     --mode            The compiler configuration
- *                       [debug, release]
- *
- *     --[no-]verbose    Show additional diagnostic info
- *     --arch            The architecture to compile for
- *
- *           [arm]       ARM Holding 32-bit chip
- *           [ia32]      Intel x86
- *
- * To assist the formatting of the usage help, single line help text will
- * be followed by a single new line. Options with multi-line help text
- * will be followed by two new lines. This provides spatial diversity between
- * options.
- *
- * [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
- * [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
- */
+/// This library lets you define parsers for parsing raw command-line arguments
+/// into a set of options and values using [GNU][] and [POSIX][] style options.
+///
+/// ## Defining options ##
+///
+/// To use this library, you create an [ArgParser] object which will contain
+/// the set of options you support:
+///
+///     var parser = new ArgParser();
+///
+/// Then you define a set of options on that parser using [addOption()] and
+/// [addFlag()]. The minimal way to create an option is:
+///
+///     parser.addOption('name');
+///
+/// This creates an option named "name". Options must be given a value on the
+/// command line. If you have a simple on/off flag, you can instead use:
+///
+///     parser.addFlag('name');
+///
+/// Flag options will, by default, accept a 'no-' prefix to negate the option.
+/// This can be disabled like so:
+///
+///     parser.addFlag('name', negatable: false);
+///
+/// (From here on out "option" will refer to both "regular" options and flags.
+/// In cases where the distinction matters, we'll use "non-flag option".)
+///
+/// Options may have an optional single-character abbreviation:
+///
+///     parser.addOption('mode', abbr: 'm');
+///     parser.addFlag('verbose', abbr: 'v');
+///
+/// They may also specify a default value. The default value will be used if the
+/// option isn't provided:
+///
+///     parser.addOption('mode', defaultsTo: 'debug');
+///     parser.addFlag('verbose', defaultsTo: false);
+///
+/// The default value for non-flag options can be any [String]. For flags, it
+/// must be a [bool].
+///
+/// To validate non-flag options, you may provide an allowed set of values. When
+/// you do, it will throw a [FormatException] when you parse the arguments if
+/// the value for an option is not in the allowed set:
+///
+///     parser.addOption('mode', allowed: ['debug', 'release']);
+///
+/// You can provide a callback when you define an option. When you later parse
+/// a set of arguments, the callback for that option will be invoked with the
+/// value provided for it:
+///
+///     parser.addOption('mode', callback: (mode) => print('Got mode $mode));
+///     parser.addFlag('verbose', callback: (verbose) {
+///       if (verbose) print('Verbose');
+///     });
+///
+/// The callback for each option will *always* be called when you parse a set of
+/// arguments. If the option isn't provided in the args, the callback will be
+/// passed the default value, or `null` if there is none set.
+///
+/// ## Parsing arguments ##
+///
+/// Once you have an [ArgParser] set up with some options and flags, you use it
+/// by calling [ArgParser.parse()] with a set of arguments:
+///
+///     var results = parser.parse(['some', 'command', 'line', 'args']);
+///
+/// These will usually come from `new Options().arguments`, but you can pass in
+/// any list of strings. It returns an instance of [ArgResults]. This is a
+/// map-like object that will return the value of any parsed option.
+///
+///     var parser = new ArgParser();
+///     parser.addOption('mode');
+///     parser.addFlag('verbose', defaultsTo: true);
+///     var results = parser.parse('['--mode', 'debug', 'something', 'else']);
+///
+///     print(results['mode']); // debug
+///     print(results['verbose']); // true
+///
+/// The [parse()] method will stop as soon as it reaches `--` or anything that
+/// it doesn't recognize as an option, flag, or option value. If there are still
+/// arguments left, they will be provided to you in
+/// [ArgResults.rest].
+///
+///     print(results.rest); // ['something', 'else']
+///
+/// ## Specifying options ##
+///
+/// To actually pass in options and flags on the command line, use GNU or POSIX
+/// style. If you define an option like:
+///
+///     parser.addOption('name', abbr: 'n');
+///
+/// Then a value for it can be specified on the command line using any of:
+///
+///     --name=somevalue
+///     --name somevalue
+///     -nsomevalue
+///     -n somevalue
+///
+/// Given this flag:
+///
+///     parser.addFlag('name', abbr: 'n');
+///
+/// You can set it on using one of:
+///
+///     --name
+///     -n
+///
+/// Or set it off using:
+///
+///     --no-name
+///
+/// Multiple flag abbreviation can also be collapsed into a single argument. If
+/// you define:
+///
+///     parser.addFlag('verbose', abbr: 'v');
+///     parser.addFlag('french', abbr: 'f');
+///     parser.addFlag('iambic-pentameter', abbr: 'i');
+///
+/// Then all three flags could be set using:
+///
+///     -vfi
+///
+/// By default, an option has only a single value, with later option values
+/// overriding earlier ones; for example:
+///
+///     var parser = new ArgParser();
+///     parser.addOption('mode');
+///     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+///     print(results['mode']); // prints 'off'
+///
+/// If you need multiple values, set the `allowMultiple` flag. In that
+/// case the option can occur multiple times and when parsing arguments a
+/// List of values will be returned:
+///
+///     var parser = new ArgParser();
+///     parser.addOption('mode', allowMultiple: true);
+///     var results = parser.parse(['--mode', 'on', '--mode', 'off']);
+///     print(results['mode']); // prints '[on, off]'
+///
+/// ## Defining commands ##
+///
+/// In addition to *options*, you can also define *commands*. A command is a
+/// named argument that has its own set of options. For example, when you run:
+///
+///     $ git commit -a
+///
+/// The executable is `git`, the command is `commit`, and the `-a` option is an
+/// option passed to the command. You can add a command like so:
+///
+///     var parser = new ArgParser();
+///     var command = parser.addCommand("commit");
+///     command.addFlag('all', abbr: 'a');
+///
+/// It returns another [ArgParser] which you can use to define options and
+/// subcommands on that command. When an argument list is parsed, you can then
+/// determine which command was entered and what options were provided for it.
+///
+///     var results = parser.parse(['commit', '-a']);
+///     print(results.command.name); // "commit"
+///     print(results.command['a']); // true
+///
+/// ## Displaying usage ##
+///
+/// This library can also be used to automatically generate nice usage help
+/// text like you get when you run a program with `--help`. To use this, you
+/// will also want to provide some help text when you create your options. To
+/// define help text for the entire option, do:
+///
+///     parser.addOption('mode', help: 'The compiler configuration',
+///         allowed: ['debug', 'release']);
+///     parser.addFlag('verbose', help: 'Show additional diagnostic info');
+///
+/// For non-flag options, you can also provide detailed help for each expected
+/// value using a map:
+///
+///     parser.addOption('arch', help: 'The architecture to compile for',
+///         allowedHelp: {
+///           'ia32': 'Intel x86',
+///           'arm': 'ARM Holding 32-bit chip'
+///         });
+///
+/// If you define a set of options like the above, then calling this:
+///
+///     print(parser.getUsage());
+///
+/// Will display something like:
+///
+///     --mode            The compiler configuration
+///                       [debug, release]
+///
+///     --[no-]verbose    Show additional diagnostic info
+///     --arch            The architecture to compile for
+///
+///           [arm]       ARM Holding 32-bit chip
+///           [ia32]      Intel x86
+///
+/// To assist the formatting of the usage help, single line help text will
+/// be followed by a single new line. Options with multi-line help text
+/// will be followed by two new lines. This provides spatial diversity between
+/// options.
+///
+/// [posix]: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap12.html#tag_12_02
+/// [gnu]: http://www.gnu.org/prep/standards/standards.html#Command_002dLine-Interfaces
 library args;
 
 import 'src/parser.dart';
 import 'src/usage.dart';
 
-/**
- * A class for taking a list of raw command line arguments and parsing out
- * options and flags from them.
- */
+/// A class for taking a list of raw command line arguments and parsing out
+/// options and flags from them.
 class ArgParser {
-  /**
-   * The options that have been defined for this parser.
-   */
+  /// The options that have been defined for this parser.
   final Map<String, Option> options = <String, Option>{};
 
-  /**
-   * The commands that have been defined for this parser.
-   */
+  /// The commands that have been defined for this parser.
   final Map<String, ArgParser> commands = <String, ArgParser>{};
 
-  /** Creates a new ArgParser. */
+  /// Creates a new ArgParser.
   ArgParser();
 
-  /**
-   * Defines a command. A command is a named argument which may in turn
-   * define its own options and subcommands. Returns an [ArgParser] that can
-   * be used to define the command's options.
-   */
+  /// Defines a command. A command is a named argument which may in turn
+  /// define its own options and subcommands. Returns an [ArgParser] that can
+  /// be used to define the command's options.
   ArgParser addCommand(String name) {
     // Make sure the name isn't in use.
     if (commands.containsKey(name)) {
-      throw new ArgumentError('Duplicate command "$name".');
+      throw ArgumentError('Duplicate command "$name".');
     }
 
-    var command = new ArgParser();
+    var command = ArgParser();
     commands[name] = command;
     return command;
   }
 
-  /**
-   * Defines a flag. Throws an [ArgumentError] if:
-   *
-   * * There is already an option named [name].
-   * * There is already an option using abbreviation [abbr].
-   */
+  /// Defines a flag. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option named [name].
+  /// * There is already an option using abbreviation [abbr].
   void addFlag(String name,
       {String abbr,
       String help,
-      bool defaultsTo: false,
-      bool negatable: true,
+      bool defaultsTo = false,
+      bool negatable = true,
       void callback(bool value)}) {
     _addOption(name, abbr, help, null, null, defaultsTo,
         callback == null ? null : (value) => callback(value as bool),
         isFlag: true, negatable: negatable);
   }
 
-  /**
-   * Defines a value-taking option. Throws an [ArgumentError] if:
-   *
-   * * There is already an option with name [name].
-   * * There is already an option using abbreviation [abbr].
-   */
+  /// Defines a value-taking option. Throws an [ArgumentError] if:
+  ///
+  /// * There is already an option with name [name].
+  /// * There is already an option using abbreviation [abbr].
   void addOption(String name,
       {String abbr,
       String help,
@@ -279,7 +265,7 @@
       Map<String, String> allowedHelp,
       String defaultsTo,
       void callback(dynamic value),
-      bool allowMultiple: false}) {
+      bool allowMultiple = false}) {
     _addOption(name, abbr, help, allowed, allowedHelp, defaultsTo, callback,
         isFlag: false, allowMultiple: allowMultiple);
   }
@@ -293,69 +279,59 @@
       dynamic defaultsTo,
       void callback(dynamic value),
       {bool isFlag,
-      bool negatable: false,
-      bool allowMultiple: false}) {
+      bool negatable = false,
+      bool allowMultiple = false}) {
     // Make sure the name isn't in use.
     if (options.containsKey(name)) {
-      throw new ArgumentError('Duplicate option "$name".');
+      throw ArgumentError('Duplicate option "$name".');
     }
 
     // Make sure the abbreviation isn't too long or in use.
     if (abbr != null) {
       if (abbr.length > 1) {
-        throw new ArgumentError(
+        throw ArgumentError(
             'Abbreviation "$abbr" is longer than one character.');
       }
 
       var existing = findByAbbreviation(abbr);
       if (existing != null) {
-        throw new ArgumentError(
+        throw ArgumentError(
             'Abbreviation "$abbr" is already used by "${existing.name}".');
       }
     }
 
-    options[name] = new Option(
+    options[name] = Option(
         name, abbr, help, allowed, allowedHelp, defaultsTo, callback,
         isFlag: isFlag, negatable: negatable, allowMultiple: allowMultiple);
   }
 
-  /**
-   * Parses [args], a list of command-line arguments, matches them against the
-   * flags and options defined by this parser, and returns the result.
-   */
+  /// Parses [args], a list of command-line arguments, matches them against the
+  /// flags and options defined by this parser, and returns the result.
   ArgResults parse(List<String> args) =>
-      new Parser(null, this, args.toList()).parse();
+      Parser(null, this, args.toList()).parse();
 
-  /**
-   * Generates a string displaying usage information for the defined options.
-   * This is basically the help text shown on the command line.
-   */
-  String getUsage() => new Usage(this).generate();
+  /// Generates a string displaying usage information for the defined options.
+  /// This is basically the help text shown on the command line.
+  String getUsage() => Usage(this).generate();
 
-  /**
-   * Get the default value for an option. Useful after parsing to test
-   * if the user specified something other than the default.
-   */
+  /// Get the default value for an option. Useful after parsing to test
+  /// if the user specified something other than the default.
   dynamic getDefault(String option) {
     if (!options.containsKey(option)) {
-      throw new ArgumentError('No option named $option');
+      throw ArgumentError('No option named $option');
     }
     return options[option].defaultValue;
   }
 
-  /**
-   * Finds the option whose abbreviation is [abbr], or `null` if no option has
-   * that abbreviation.
-   */
+  /// Finds the option whose abbreviation is [abbr], or `null` if no option has
+  /// that abbreviation.
   Option findByAbbreviation(String abbr) {
     return options.values.firstWhere((option) => option.abbreviation == abbr,
         orElse: () => null);
   }
 }
 
-/**
- * A command-line option. Includes both flags and options which take a value.
- */
+/// A command-line option. Includes both flags and options which take a value.
 class Option {
   final String name;
   final String abbreviation;
@@ -370,48 +346,39 @@
 
   Option(this.name, this.abbreviation, this.help, this.allowed,
       this.allowedHelp, this.defaultValue, this.callback,
-      {this.isFlag, this.negatable, this.allowMultiple: false});
+      {this.isFlag, this.negatable, this.allowMultiple = false});
 }
 
-/**
- * The results of parsing a series of command line arguments using
- * [ArgParser.parse()]. Includes the parsed options and any remaining unparsed
- * command line arguments.
- */
+/// The results of parsing a series of command line arguments using
+/// [ArgParser.parse()]. Includes the parsed options and any remaining unparsed
+/// command line arguments.
 class ArgResults {
   final Map<String, dynamic> _options;
 
-  /**
-   * If these are the results for parsing a command's options, this will be
-   * the name of the command. For top-level results, this returns `null`.
-   */
+  /// If these are the results for parsing a command's options, this will be
+  /// the name of the command. For top-level results, this returns `null`.
   final String name;
 
-  /**
-   * The command that was selected, or `null` if none was. This will contain
-   * the options that were selected for that command.
-   */
+  /// The command that was selected, or `null` if none was. This will contain
+  /// the options that were selected for that command.
   final ArgResults command;
 
-  /**
-   * The remaining command-line arguments that were not parsed as options or
-   * flags. If `--` was used to separate the options from the remaining
-   * arguments, it will not be included in this list.
-   */
+  /// The remaining command-line arguments that were not parsed as options or
+  /// flags. If `--` was used to separate the options from the remaining
+  /// arguments, it will not be included in this list.
   final List<String> rest;
 
-  /** Creates a new [ArgResults]. */
+  /// Creates a new [ArgResults].
   ArgResults(this._options, this.name, this.command, this.rest);
 
-  /** Gets the parsed command-line option named [name]. */
+  /// Gets the parsed command-line option named [name].
   dynamic operator [](String name) {
     if (!_options.containsKey(name)) {
-      throw new ArgumentError('Could not find an option named "$name".');
+      throw ArgumentError('Could not find an option named "$name".');
     }
 
     return _options[name];
   }
 
-  /** Get the names of the options as a [Collection]. */
   List<String> get options => _options.keys.toList();
 }
diff --git a/pkg/test_runner/lib/src/vendored_pkg/args/src/parser.dart b/pkg/test_runner/lib/src/vendored_pkg/args/src/parser.dart
index c2cc049..d3ca356 100644
--- a/pkg/test_runner/lib/src/vendored_pkg/args/src/parser.dart
+++ b/pkg/test_runner/lib/src/vendored_pkg/args/src/parser.dart
@@ -6,43 +6,37 @@
 
 import '../args.dart';
 
-final _SOLO_OPT = new RegExp(r'^-([a-zA-Z0-9])$');
-final _ABBR_OPT = new RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
-final _LONG_OPT = new RegExp(r'^--([a-zA-Z\-_0-9]+)(=(.*))?$');
+final _SOLO_OPT = RegExp(r'^-([a-zA-Z0-9])$');
+final _ABBR_OPT = RegExp(r'^-([a-zA-Z0-9]+)(.*)$');
+final _LONG_OPT = RegExp(r'^--([a-zA-Z\-_0-9]+)(=(.*))?$');
 
-/**
- * The actual parsing class. Unlike [ArgParser] which is really more an "arg
- * grammar", this is the class that does the parsing and holds the mutable
- * state required during a parse.
- */
+/// The actual parsing class. Unlike [ArgParser] which is really more an "arg
+/// grammar", this is the class that does the parsing and holds the mutable
+/// state required during a parse.
 class Parser {
-  /**
-   * If parser is parsing a command's options, this will be the name of the
-   * command. For top-level results, this returns `null`.
-   */
+  /// If parser is parsing a command's options, this will be the name of the
+  /// command. For top-level results, this returns `null`.
   final String commandName;
 
-  /**
-   * The parser for the supercommand of this command parser, or `null` if this
-   * is the top-level parser.
-   */
+  /// The parser for the supercommand of this command parser, or `null` if this
+  /// is the top-level parser.
   final Parser parent;
 
-  /** The grammar being parsed. */
+  /// The grammar being parsed.
   final ArgParser grammar;
 
-  /** The arguments being parsed. */
+  /// The arguments being parsed.
   final List<String> args;
 
-  /** The accumulated parsed options. */
+  /// The accumulated parsed options.
   final Map<String, dynamic> results = {};
 
   Parser(this.commandName, this.grammar, this.args, [this.parent]);
 
-  /** The current argument being parsed. */
+  /// The current argument being parsed.
   String get current => args[0];
 
-  /** Parses the arguments. This can only be called once. */
+  /// Parses the arguments. This can only be called once.
   ArgResults parse() {
     ArgResults commandResults;
 
@@ -68,7 +62,7 @@
       var command = grammar.commands[current];
       if (command != null) {
         var commandName = args.removeAt(0);
-        var commandParser = new Parser(commandName, command, args, this);
+        var commandParser = Parser(commandName, command, args, this);
         commandResults = commandParser.parse();
         continue;
       }
@@ -97,13 +91,11 @@
     // Add in the leftover arguments we didn't parse to the innermost command.
     var rest = args.toList();
     args.clear();
-    return new ArgResults(results, commandName, commandResults, rest);
+    return ArgResults(results, commandName, commandResults, rest);
   }
 
-  /**
-   * Pulls the value for [option] from the second argument in [args]. Validates
-   * that there is a valid value there.
-   */
+  /// Pulls the value for [option] from the second argument in [args]. Validates
+  /// that there is a valid value there.
   void readNextArgAsValue(Option option) {
     // Take the option argument from the next command line arg.
     validate(args.length > 0, 'Missing argument for "${option.name}".');
@@ -116,12 +108,10 @@
     args.removeAt(0);
   }
 
-  /**
-   * Tries to parse the current argument as a "solo" option, which is a single
-   * hyphen followed by a single letter. We treat this differently than
-   * collapsed abbreviations (like "-abc") to handle the possible value that
-   * may follow it.
-   */
+  /// Tries to parse the current argument as a "solo" option, which is a single
+  /// hyphen followed by a single letter. We treat this differently than
+  /// collapsed abbreviations (like "-abc") to handle the possible value that
+  /// may follow it.
   bool parseSoloOption() {
     var soloOpt = _SOLO_OPT.firstMatch(current);
     if (soloOpt == null) return false;
@@ -145,11 +135,9 @@
     return true;
   }
 
-  /**
-   * Tries to parse the current argument as a series of collapsed abbreviations
-   * (like "-abc") or a single abbreviation with the value directly attached
-   * to it (like "-mrelease").
-   */
+  /// Tries to parse the current argument as a series of collapsed abbreviations
+  /// (like "-abc") or a single abbreviation with the value directly attached
+  /// to it (like "-mrelease").
   bool parseAbbreviation(Parser innermostCommand) {
     var abbrOpt = _ABBR_OPT.firstMatch(current);
     if (abbrOpt == null) return false;
@@ -208,10 +196,8 @@
     setOption(results, option, true);
   }
 
-  /**
-   * Tries to parse the current argument as a long-form named option, which
-   * may include a value like "--mode=release" or "--mode release".
-   */
+  /// Tries to parse the current argument as a long-form named option, which
+  /// may include a value like "--mode=release" or "--mode release".
   bool parseLongOption() {
     var longOpt = _LONG_OPT.firstMatch(current);
     if (longOpt == null) return false;
@@ -256,15 +242,13 @@
     return true;
   }
 
-  /**
-   * Called during parsing to validate the arguments. Throws a
-   * [FormatException] if [condition] is `false`.
-   */
+  /// Called during parsing to validate the arguments. Throws a
+  /// [FormatException] if [condition] is `false`.
   void validate(bool condition, String message) {
-    if (!condition) throw new FormatException(message);
+    if (!condition) throw FormatException(message);
   }
 
-  /** Validates and stores [value] as the value for [option]. */
+  /// Validates and stores [value] as the value for [option].
   void setOption(Map results, Option option, dynamic value) {
     // See if it's one of the allowed values.
     if (option.allowed != null) {
diff --git a/pkg/test_runner/lib/src/vendored_pkg/args/src/usage.dart b/pkg/test_runner/lib/src/vendored_pkg/args/src/usage.dart
index a64deba..ef8ba8d 100644
--- a/pkg/test_runner/lib/src/vendored_pkg/args/src/usage.dart
+++ b/pkg/test_runner/lib/src/vendored_pkg/args/src/usage.dart
@@ -8,61 +8,51 @@
 
 import '../args.dart';
 
-/**
- * Takes an [ArgParser] and generates a string of usage (i.e. help) text for its
- * defined options. Internally, it works like a tabular printer. The output is
- * divided into three horizontal columns, like so:
- *
- *     -h, --help  Prints the usage information
- *     |  |        |                                 |
- *
- * It builds the usage text up one column at a time and handles padding with
- * spaces and wrapping to the next line to keep the cells correctly lined up.
- */
+/// Takes an [ArgParser] and generates a string of usage (i.e. help) text for its
+/// defined options. Internally, it works like a tabular printer. The output is
+/// divided into three horizontal columns, like so:
+///
+///     -h, --help  Prints the usage information
+///     |  |        |                                 |
+///
+/// It builds the usage text up one column at a time and handles padding with
+/// spaces and wrapping to the next line to keep the cells correctly lined up.
 class Usage {
-  static const NUM_COLUMNS = 3; // Abbreviation, long name, help.
+  static const numColumns = 3; // Abbreviation, long name, help.
 
-  /** The parser this is generating usage for. */
+  /// The parser this is generating usage for.
   final ArgParser args;
 
-  /** The working buffer for the generated usage text. */
+  /// The working buffer for the generated usage text.
   StringBuffer buffer;
 
-  /**
-   * The column that the "cursor" is currently on. If the next call to
-   * [write()] is not for this column, it will correctly handle advancing to
-   * the next column (and possibly the next row).
-   */
+  /// The column that the "cursor" is currently on. If the next call to
+  /// [write()] is not for this column, it will correctly handle advancing to
+  /// the next column (and possibly the next row).
   int currentColumn = 0;
 
-  /** The width in characters of each column. */
+  /// The width in characters of each column.
   List<int> columnWidths;
 
-  /**
-   * The number of sequential lines of text that have been written to the last
-   * column (which shows help info). We track this so that help text that spans
-   * multiple lines can be padded with a blank line after it for separation.
-   * Meanwhile, sequential options with single-line help will be compacted next
-   * to each other.
-   */
+  /// The number of sequential lines of text that have been written to the last
+  /// column (which shows help info). We track this so that help text that spans
+  /// multiple lines can be padded with a blank line after it for separation.
+  /// Meanwhile, sequential options with single-line help will be compacted next
+  /// to each other.
   int numHelpLines = 0;
 
-  /**
-   * How many newlines need to be rendered before the next bit of text can be
-   * written. We do this lazily so that the last bit of usage doesn't have
-   * dangling newlines. We only write newlines right *before* we write some
-   * real content.
-   */
+  /// How many newlines need to be rendered before the next bit of text can be
+  /// written. We do this lazily so that the last bit of usage doesn't have
+  /// dangling newlines. We only write newlines right *before* we write some
+  /// real content.
   int newlinesNeeded = 0;
 
   Usage(this.args);
 
-  /**
-   * Generates a string displaying usage information for the defined options.
-   * This is basically the help text shown on the command line.
-   */
+  /// Generates a string displaying usage information for the defined options.
+  /// This is basically the help text shown on the command line.
   String generate() {
-    buffer = new StringBuffer();
+    buffer = StringBuffer();
 
     calculateColumnWidths();
 
@@ -177,12 +167,12 @@
     // Advance until we are at the right column (which may mean wrapping around
     // to the next line.
     while (currentColumn != column) {
-      if (currentColumn < NUM_COLUMNS - 1) {
+      if (currentColumn < numColumns - 1) {
         buffer.write(padRight('', columnWidths[currentColumn]));
       } else {
         buffer.writeln('');
       }
-      currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+      currentColumn = (currentColumn + 1) % numColumns;
     }
 
     if (column < columnWidths.length) {
@@ -194,14 +184,14 @@
     }
 
     // Advance to the next column.
-    currentColumn = (currentColumn + 1) % NUM_COLUMNS;
+    currentColumn = (currentColumn + 1) % numColumns;
 
     // If we reached the last column, we need to wrap to the next line.
-    if (column == NUM_COLUMNS - 1) newlinesNeeded++;
+    if (column == numColumns - 1) newlinesNeeded++;
 
     // Keep track of how many consecutive lines we've written in the last
     // column.
-    if (column == NUM_COLUMNS - 1) {
+    if (column == numColumns - 1) {
       numHelpLines++;
     } else {
       numHelpLines = 0;
@@ -209,7 +199,7 @@
   }
 
   String buildAllowedList(Option option) {
-    var allowedBuffer = new StringBuffer();
+    var allowedBuffer = StringBuffer();
     allowedBuffer.write('[');
     bool first = true;
     for (var allowed in option.allowed) {
@@ -225,9 +215,9 @@
   }
 }
 
-/** Pads [source] to [length] by adding spaces at the end. */
+/// Pads [source] to [length] by adding spaces at the end.
 String padRight(String source, int length) {
-  final result = new StringBuffer();
+  final result = StringBuffer();
   result.write(source);
 
   while (result.length < length) {
diff --git a/pkg/test_runner/pubspec.yaml b/pkg/test_runner/pubspec.yaml
index 876918c..16ebe40 100644
--- a/pkg/test_runner/pubspec.yaml
+++ b/pkg/test_runner/pubspec.yaml
@@ -9,9 +9,16 @@
 dependencies:
   expect:
     path: ../expect
+  glob:
+    path: ../../third_party/pkg/glob
   package_resolver:
     path: ../../third_party/pkg_tested/package_resolver
   smith:
     path: ../smith
   status_file:
-    path: ../status_file
\ No newline at end of file
+    path: ../status_file
+dependency_overrides:
+  # Other packages in the dependency graph have normal hosted dependencies on
+  # this, so just override it to force the local one.
+  args:
+    path: ../../third_party/pkg/args
diff --git a/pkg/test_runner/test/skipping_dart2js_compilations_test.dart b/pkg/test_runner/test/skipping_dart2js_compilations_test.dart
index 16fb24b..f1b7df3 100644
--- a/pkg/test_runner/test/skipping_dart2js_compilations_test.dart
+++ b/pkg/test_runner/test/skipping_dart2js_compilations_test.dart
@@ -123,9 +123,9 @@
 
 class CommandCompletedHandler {
   FileUtils fileUtils;
-  bool _shouldHaveRun;
+  final bool _shouldHaveRun;
 
-  CommandCompletedHandler(FileUtils this.fileUtils, bool this._shouldHaveRun);
+  CommandCompletedHandler(this.fileUtils, this._shouldHaveRun);
 
   void processCompletedTest(CommandOutput output) {
     Expect.equals(0, output.exitCode);
@@ -246,5 +246,5 @@
 
   // We need to wait some time to make sure that the files we 'touch' get a
   // bigger timestamp than the old ones
-  Timer(Duration(seconds: 1), touchFilesAndRunTests);
+  Timer(const Duration(seconds: 1), touchFilesAndRunTests);
 }
diff --git a/pkg/test_runner/test/static_error_test.dart b/pkg/test_runner/test/static_error_test.dart
new file mode 100644
index 0000000..460dab9
--- /dev/null
+++ b/pkg/test_runner/test/static_error_test.dart
@@ -0,0 +1,429 @@
+// 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:expect/expect.dart';
+
+import 'package:test_runner/src/test_file.dart';
+
+void main() {
+  testFlags();
+  testCompareTo();
+  testDescribeDifferences();
+  testSimplify();
+}
+
+void testFlags() {
+  var unspecified = StaticError(
+      line: 1,
+      column: 2,
+      length: 3,
+      code: "unspecified",
+      message: "unspecified");
+  var unspecifiedAnalyzer =
+      StaticError(line: 1, column: 2, length: 3, code: "unspecified");
+  var unspecifiedCfe =
+      StaticError(line: 1, column: 2, length: 3, message: "unspecified");
+  var noLength = StaticError(line: 1, column: 2, code: "E.CODE");
+  var analyzer = StaticError(line: 1, column: 2, length: 3, code: "E.CODE");
+  var cfe = StaticError(line: 1, column: 2, length: 3, message: "E.");
+  var both =
+      StaticError(line: 1, column: 2, length: 3, code: "E.CODE", message: "E.");
+
+  // isAnalyzer.
+  Expect.isTrue(unspecified.isAnalyzer);
+  Expect.isTrue(unspecifiedAnalyzer.isAnalyzer);
+  Expect.isFalse(unspecifiedCfe.isAnalyzer);
+  Expect.isTrue(noLength.isAnalyzer);
+  Expect.isTrue(analyzer.isAnalyzer);
+  Expect.isFalse(cfe.isAnalyzer);
+  Expect.isTrue(both.isAnalyzer);
+
+  // isCfe.
+  Expect.isTrue(unspecified.isCfe);
+  Expect.isFalse(unspecifiedAnalyzer.isCfe);
+  Expect.isTrue(unspecifiedCfe.isCfe);
+  Expect.isFalse(noLength.isCfe);
+  Expect.isFalse(analyzer.isCfe);
+  Expect.isTrue(cfe.isCfe);
+  Expect.isTrue(both.isCfe);
+}
+
+void testCompareTo() {
+  var errors = [
+    // Order by line.
+    StaticError(line: 1, column: 2, length: 2, code: "E.CODE", message: "E."),
+    StaticError(line: 2, column: 1, length: 1, code: "E.CODE", message: "E."),
+
+    // Then column.
+    StaticError(line: 3, column: 1, length: 2, code: "E.CODE", message: "E."),
+    StaticError(
+        line: 3, column: 2, length: 1, code: "Error.CODE", message: "E."),
+
+    // Then length.
+    StaticError(line: 4, column: 1, length: 1, code: "Z.CODE", message: "Z."),
+    StaticError(line: 4, column: 1, length: 2, code: "A.CODE", message: "A."),
+
+    // Then code.
+    StaticError(line: 5, column: 1, length: 1, message: "Z."),
+    StaticError(line: 5, column: 1, length: 1, code: "A.CODE", message: "Z."),
+    StaticError(line: 5, column: 1, length: 1, code: "Z.CODE", message: "Z."),
+
+    // Then message.
+    StaticError(line: 6, column: 1, length: 1, code: "E.CODE"),
+    StaticError(line: 6, column: 1, length: 1, code: "E.CODE", message: "A."),
+    StaticError(line: 6, column: 1, length: 1, code: "E.CODE", message: "Z."),
+  ];
+
+  // Every pair of errors in the array should be ordered correctly.
+  for (var i = 0; i < errors.length; i++) {
+    for (var j = 0; j < errors.length; j++) {
+      var expected = (i - j).sign;
+      Expect.equals(expected, errors[i].compareTo(errors[j]),
+          "Expected $expected comparison for:\n${errors[i]}\n${errors[j]}");
+    }
+  }
+}
+
+void testDescribeDifferences() {
+  var precise = StaticError(
+      line: 2,
+      column: 3,
+      length: 4,
+      code: "Error.CODE",
+      message: "Error message.");
+
+  // Perfect match.
+  expectNoDifferences(
+      precise,
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."));
+
+  // Ignore null code.
+  expectNoDifferences(
+      StaticError(line: 2, column: 3, length: 4, message: "Error message."),
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."));
+  expectNoDifferences(
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."),
+      StaticError(line: 2, column: 3, length: 4, message: "Error message."));
+
+  // Ignore null message.
+  expectNoDifferences(
+      StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"),
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."));
+  expectNoDifferences(
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."),
+      StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"));
+
+  // Different line.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 4,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."),
+      """
+  Expected on line 2 but was on 4.
+  """);
+
+  // Different column.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 2,
+          column: 5,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."),
+      """
+  Expected on column 3 but was on 5.
+  """);
+
+  // Different length.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 6,
+          code: "Error.CODE",
+          message: "Error message."),
+      """
+  Expected length 4 but was 6.
+  """);
+
+  // Different code.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Weird.ERROR",
+          message: "Error message."),
+      """
+  Expected error code Error.CODE but was Weird.ERROR.
+  """);
+
+  // Different message.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Funny story."),
+      """
+  Expected error message 'Error message.' but was 'Funny story.'.
+  """);
+
+  // Multiple differences.
+  expectDifferences(
+      precise,
+      StaticError(
+          line: 4,
+          column: 3,
+          length: 6,
+          code: "Weird.ERROR",
+          message: "Error message."),
+      """
+  Expected on line 2 but was on 4.
+  Expected length 4 but was 6.
+  Expected error code Error.CODE but was Weird.ERROR.
+  """);
+
+  // Unspecified errors.
+  var unspecified = StaticError(
+      line: 2,
+      column: 3,
+      length: 4,
+      code: "unspecified",
+      message: "unspecified");
+  var specifiedAnalyzer = StaticError(
+      line: 2,
+      column: 3,
+      length: 4,
+      code: "Error.CODE",
+      message: "unspecified");
+  var specifiedCfe = StaticError(
+      line: 2,
+      column: 3,
+      length: 4,
+      code: "unspecified",
+      message: "Error message.");
+
+  // Matches if line is right.
+  expectNoDifferences(
+      unspecified,
+      StaticError(
+          line: 2,
+          column: 3,
+          length: 4,
+          code: "Error.CODE",
+          message: "Error message."));
+
+  // Does not match if lines differ.
+  expectDifferences(
+      unspecified,
+      StaticError(
+          line: 3,
+          column: 3,
+          length: 4,
+          code: "Weird.ERROR",
+          message: "Error message."),
+      """
+  Expected on line 2 but was on 3.
+  """);
+
+  // Ignores differences in other fields.
+  expectNoDifferences(
+      unspecified,
+      StaticError(
+          line: 2,
+          column: 333,
+          length: 4444,
+          code: "Different.CODE",
+          message: "Different message."));
+
+  // If error is specified on analyzer, must match fields when actual is
+  // analyzer error.
+  expectDifferences(specifiedAnalyzer,
+      StaticError(line: 2, column: 5, length: 6, code: "Weird.ERROR"), """
+  Expected on column 3 but was on 5.
+  Expected length 4 but was 6.
+  Expected error code Error.CODE but was Weird.ERROR.
+  """);
+  expectNoDifferences(specifiedAnalyzer,
+      StaticError(line: 2, column: 333, length: 444, message: "Message."));
+  expectNoDifferences(specifiedAnalyzer,
+      StaticError(line: 2, column: 3, length: 4, code: "Error.CODE"));
+
+  // If error is specified on CFE, must match fields when actual is
+  // CFE error.
+  expectDifferences(
+      specifiedCfe,
+      StaticError(line: 2, column: 5, length: 6, message: "Different message."),
+      """
+  Expected on column 3 but was on 5.
+  Expected length 4 but was 6.
+  Expected error message 'Error message.' but was 'Different message.'.
+  """);
+  expectNoDifferences(specifiedCfe,
+      StaticError(line: 2, column: 333, length: 444, code: "Error.CODE."));
+  expectNoDifferences(specifiedCfe,
+      StaticError(line: 2, column: 3, length: 4, message: "Error message."));
+}
+
+void testSimplify() {
+  // Merges errors if one has only a code and the only a message.
+  expectSimplify([
+    StaticError(line: 1, column: 2, length: 3, code: "Weird.ERROR"),
+    StaticError(line: 1, column: 2, length: 3, message: "Message.")
+  ], [
+    StaticError(
+        line: 1, column: 2, length: 3, code: "Weird.ERROR", message: "Message.")
+  ]);
+
+  // Merges if length is null.
+  expectSimplify([
+    StaticError(line: 1, column: 1, code: "A.ERR"),
+    StaticError(line: 1, column: 1, length: 3, message: "A."),
+    StaticError(line: 2, column: 1, length: 4, code: "B.ERR"),
+    StaticError(line: 2, column: 1, message: "B."),
+    StaticError(line: 3, column: 1, code: "C.ERR"),
+    StaticError(line: 3, column: 1, message: "C."),
+  ], [
+    StaticError(line: 1, column: 1, length: 3, code: "A.ERR", message: "A."),
+    StaticError(line: 2, column: 1, length: 4, code: "B.ERR", message: "B."),
+    StaticError(line: 3, column: 1, code: "C.ERR", message: "C."),
+  ]);
+
+  // Merges multiple errors with no length with errors that have length.
+  expectSimplify([
+    StaticError(line: 1, column: 2, length: 3, code: "ERROR.A"),
+    StaticError(line: 1, column: 4, length: 3, code: "ERROR.C"),
+    StaticError(line: 1, column: 2, length: 5, code: "ERROR.B"),
+    StaticError(line: 1, column: 2, message: "One."),
+    StaticError(line: 1, column: 4, message: "Three."),
+    StaticError(line: 1, column: 2, message: "Two."),
+  ], [
+    StaticError(
+        line: 1, column: 2, length: 3, code: "ERROR.A", message: "One."),
+    StaticError(
+        line: 1, column: 2, length: 5, code: "ERROR.B", message: "Two."),
+    StaticError(
+        line: 1, column: 4, length: 3, code: "ERROR.C", message: "Three."),
+  ]);
+
+  // Merges even if not adjacent in input array.
+  expectSimplify([
+    StaticError(line: 1, column: 2, length: 3, code: "Some.ERROR"),
+    StaticError(line: 10, column: 2, length: 3, code: "Other.ERROR"),
+    StaticError(line: 1, column: 2, length: 3, message: "Message.")
+  ], [
+    StaticError(
+        line: 1, column: 2, length: 3, code: "Some.ERROR", message: "Message."),
+    StaticError(line: 10, column: 2, length: 3, code: "Other.ERROR")
+  ]);
+
+  // Does not merge if positions differ.
+  expectSimplify([
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 2, column: 1, length: 1, message: "A."),
+  ], [
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 2, column: 1, length: 1, message: "A."),
+  ]);
+  expectSimplify([
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 1, column: 2, length: 1, message: "A."),
+  ], [
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 1, column: 2, length: 1, message: "A."),
+  ]);
+  expectSimplify([
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 1, column: 1, length: 2, message: "A."),
+  ], [
+    StaticError(line: 1, column: 1, length: 1, code: "A.ERR"),
+    StaticError(line: 1, column: 1, length: 2, message: "A."),
+  ]);
+
+  // Does not merge if it would lose code or message.
+  expectSimplify([
+    StaticError(line: 1, column: 1, length: 1, code: "ERR.ONE"),
+    StaticError(line: 1, column: 1, length: 1, code: "ERR.TWO"),
+    StaticError(line: 2, column: 1, length: 1, message: "One."),
+    StaticError(line: 2, column: 1, length: 1, message: "Two."),
+  ], [
+    StaticError(line: 1, column: 1, length: 1, code: "ERR.ONE"),
+    StaticError(line: 1, column: 1, length: 1, code: "ERR.TWO"),
+    StaticError(line: 2, column: 1, length: 1, message: "One."),
+    StaticError(line: 2, column: 1, length: 1, message: "Two."),
+  ]);
+
+  // Orders output.
+  expectSimplify([
+    StaticError(line: 2, column: 1, length: 1, message: "Two."),
+    StaticError(line: 3, column: 1, length: 1, message: "Three."),
+    StaticError(line: 1, column: 1, length: 1, message: "One."),
+  ], [
+    StaticError(line: 1, column: 1, length: 1, message: "One."),
+    StaticError(line: 2, column: 1, length: 1, message: "Two."),
+    StaticError(line: 3, column: 1, length: 1, message: "Three."),
+  ]);
+}
+
+void expectNoDifferences(StaticError expectedError, StaticError actualError) {
+  var actualLines = expectedError.describeDifferences(actualError);
+  if (actualLines != null) {
+    Expect.fail("Expected no differences, but got:\n${actualLines.join('\n')}");
+  }
+}
+
+void expectDifferences(StaticError expectedError, StaticError actualError,
+    String expectedDifferences) {
+  var expectedLines = expectedDifferences
+      .split("\n")
+      .map((line) => line.trim())
+      .where((line) => line.isNotEmpty)
+      .toList();
+  var actualLines = expectedError.describeDifferences(actualError);
+  if (actualLines == null) {
+    Expect.fail("Got no differences, but expected:\n$expectedDifferences");
+  }
+  Expect.listEquals(expectedLines, actualLines);
+}
+
+void expectSimplify(List<StaticError> input, List<StaticError> expected) {
+  var actual = StaticError.simplify(input);
+  Expect.listEquals(expected.map((error) => error.toString()).toList(),
+      actual.map((error) => error.toString()).toList());
+}
diff --git a/pkg/test_runner/test/test_file_test.dart b/pkg/test_runner/test/test_file_test.dart
index 9d42f3d..aea3887 100644
--- a/pkg/test_runner/test/test_file_test.dart
+++ b/pkg/test_runner/test/test_file_test.dart
@@ -281,13 +281,13 @@
 /\/ [analyzer] CompileTimeErrorCode.ALSO_WRONG_TYPE
     /\/ [cfe] Error: Can't assign a string to a num.
 """, [
-    ErrorExpectation(
+    StaticError(
         line: 1,
         column: 9,
         length: 3,
         code: "CompileTimeErrorCode.WRONG_TYPE",
         message: "Error: Can't assign a string to an int."),
-    ErrorExpectation(
+    StaticError(
         line: 6,
         column: 9,
         length: 5,
@@ -305,20 +305,23 @@
 /\/ [cfe] Second error.
 /\/[error line 9,column 8,length 7]
 /\/ [cfe] Third.
+/\/[error line 10,column 9]
+/\/ [cfe] No length.
 """, [
-    ErrorExpectation(
+    StaticError(
         line: 123,
         column: 45,
         length: 678,
         code: "CompileTimeErrorCode.FIRST",
         message: "First error."),
-    ErrorExpectation(
+    StaticError(
         line: 23,
         column: 5,
         length: 78,
         code: "CompileTimeErrorCode.SECOND",
         message: "Second error."),
-    ErrorExpectation(line: 9, column: 8, length: 7, message: "Third.")
+    StaticError(line: 9, column: 8, length: 7, message: "Third."),
+    StaticError(line: 10, column: 9, message: "No length.")
   ]);
 
   // Multi-line error message.
@@ -332,7 +335,7 @@
 
 /\/ The preceding blank line ends the message.
 """, [
-    ErrorExpectation(
+    StaticError(
         line: 1,
         column: 9,
         length: 3,
@@ -351,22 +354,52 @@
 /\/  ^^^^^^^
 /\/ [cfe] Third error.
 """, [
-    ErrorExpectation(line: 2, column: 9, length: 3, message: "First error."),
-    ErrorExpectation(line: 2, column: 7, length: 1, code: "ErrorCode.second"),
-    ErrorExpectation(line: 2, column: 5, length: 7, message: "Third error."),
+    StaticError(line: 2, column: 9, length: 3, message: "First error."),
+    StaticError(line: 2, column: 7, length: 1, code: "ErrorCode.second"),
+    StaticError(line: 2, column: 5, length: 7, message: "Third error."),
   ]);
 
   // Unspecified errors.
   expectParseErrorExpectations("""
 int i = "s";
-/\/ [unspecified error]
+/\/     ^^^
+// [analyzer] unspecified
+// [cfe] unspecified
 int j = "s";
-  /\/ [unspecified error] some additional info
+/\/     ^^^
+// [analyzer] unspecified
+// [cfe] Message.
+int k = "s";
+/\/     ^^^
+// [analyzer] Error.CODE
+// [cfe] unspecified
+int l = "s";
+/\/     ^^^
+// [analyzer] unspecified
+int m = "s";
+/\/     ^^^
+// [cfe] unspecified
 """, [
-    ErrorExpectation(
-        line: 1, column: null, length: null, code: null, message: null),
-    ErrorExpectation(
-        line: 3, column: null, length: null, code: null, message: null)
+    StaticError(
+        line: 1,
+        column: 8,
+        length: 3,
+        code: "unspecified",
+        message: "unspecified"),
+    StaticError(
+        line: 5,
+        column: 8,
+        length: 3,
+        code: "unspecified",
+        message: "Message."),
+    StaticError(
+        line: 9,
+        column: 8,
+        length: 3,
+        code: "Error.CODE",
+        message: "unspecified"),
+    StaticError(line: 13, column: 8, length: 3, code: "unspecified"),
+    StaticError(line: 16, column: 8, length: 3, message: "unspecified"),
   ]);
 
   // Ignore multitest markers.
@@ -379,13 +412,13 @@
 /\/ [error line 12, column 34, length 56]  /\/# 3: continued
 /\/ [cfe] Message.
 """, [
-    ErrorExpectation(
+    StaticError(
         line: 1,
         column: 9,
         length: 3,
         code: "ErrorCode.BAD_THING",
         message: "Message.\nMore message."),
-    ErrorExpectation(line: 12, column: 34, length: 56, message: "Message."),
+    StaticError(line: 12, column: 34, length: 56, message: "Message."),
   ]);
 
   // Must have either a code or a message.
@@ -487,8 +520,7 @@
   Expect.isTrue(d.hasStaticWarning);
 }
 
-void expectParseErrorExpectations(
-    String source, List<ErrorExpectation> errors) {
+void expectParseErrorExpectations(String source, List<StaticError> errors) {
   var file = parse(source);
   Expect.listEquals(errors.map((error) => error.toString()).toList(),
       file.expectedErrors.map((error) => error.toString()).toList());
diff --git a/pkg/test_runner/test/test_runner_test.dart b/pkg/test_runner/test/test_runner_test.dart
index 79305bc..385e73c 100644
--- a/pkg/test_runner/test/test_runner_test.dart
+++ b/pkg/test_runner/test/test_runner_test.dart
@@ -6,8 +6,8 @@
 // configurations, so nothing is actually *executing* it. It's likely broken.
 // We should either remove it or get it working again.
 
-import "dart:io";
 import "dart:async";
+import "dart:io";
 
 import "package:status_file/expectation.dart";
 
@@ -126,7 +126,7 @@
   var maxProcesses = 2;
   var maxBrowserProcesses = maxProcesses;
   var config = OptionsParser().parse(['--noBatch'])[0];
-  ProcessQueue(config, maxProcesses, maxBrowserProcesses, DateTime.now(),
+  ProcessQueue(config, maxProcesses, maxBrowserProcesses,
       [CustomTestSuite(config)], [EventListener()], TestController.finished);
 }
 
@@ -154,7 +154,7 @@
         break;
       case 'timeout':
         // This process should be killed by the test after DEFAULT_TIMEOUT
-        Timer(Duration(hours: 42), () {});
+        Timer(const Duration(hours: 42), () {});
         break;
       default:
         throw "Unknown option ${arguments[0]} passed to test_runner_test";
diff --git a/pkg/test_runner/test/update_errors_test.dart b/pkg/test_runner/test/update_errors_test.dart
new file mode 100644
index 0000000..03f0cc3
--- /dev/null
+++ b/pkg/test_runner/test/update_errors_test.dart
@@ -0,0 +1,266 @@
+// 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:expect/expect.dart';
+
+import 'package:test_runner/src/test_file.dart';
+import 'package:test_runner/src/update_errors.dart';
+
+// Note: This test file validates how some of the special markers used by the
+// test runner are parsed. But this test is also run *by* that same test
+// runner, and we don't want it to see the markers inside the string literals
+// here as significant, so we obfuscate them using seemingly-pointless string
+// escapes here like `\/`.
+
+Future<void> main() async {
+  // Inserts analyzer, CFE, and both errors.
+  expectUpdate("""
+int i = "bad";
+
+int another = "wrong";
+
+int third = "boo";
+""", errors: [
+    StaticError(line: 1, column: 9, length: 5, code: "some.error"),
+    StaticError(line: 3, column: 15, length: 7, message: "Bad."),
+    StaticError(
+        line: 5,
+        column: 13,
+        length: 5,
+        code: "an.error",
+        message: "Wrong.\nLine.\nAnother."),
+  ], expected: """
+int i = "bad";
+/\/      ^^^^^
+/\/ [analyzer] some.error
+
+int another = "wrong";
+/\/            ^^^^^^^
+/\/ [cfe] Bad.
+
+int third = "boo";
+/\/          ^^^^^
+/\/ [analyzer] an.error
+/\/ [cfe] Wrong.
+/\/ Line.
+/\/ Another.
+""");
+
+  // Removes only analyzer errors.
+  expectUpdate(
+      """
+int i = "bad";
+/\/      ^^^^^
+/\/ [analyzer] some.error
+
+int another = "wrong";
+/\/            ^^^^^^^
+/\/ [cfe] Bad.
+
+int third = "boo";
+/\/          ^^^^^
+/\/ [analyzer] an.error
+/\/ [cfe] Wrong.
+""",
+      removeCfe: false,
+      expected: """
+int i = "bad";
+
+int another = "wrong";
+/\/            ^^^^^^^
+/\/ [cfe] Bad.
+
+int third = "boo";
+/\/          ^^^^^
+/\/ [cfe] Wrong.
+""");
+
+  // Removes only CFE errors.
+  expectUpdate(
+      """
+int i = "bad";
+/\/      ^^^^^
+/\/ [analyzer] some.error
+
+int another = "wrong";
+/\/            ^^^^^^^
+/\/ [cfe] Bad.
+
+int third = "boo";
+/\/          ^^^^^
+/\/ [analyzer] an.error
+/\/ [cfe] Wrong.
+""",
+      removeAnalyzer: false,
+      expected: """
+int i = "bad";
+/\/      ^^^^^
+/\/ [analyzer] some.error
+
+int another = "wrong";
+
+int third = "boo";
+/\/          ^^^^^
+/\/ [analyzer] an.error
+""");
+
+  // Preserves previous error's indentation if possible.
+  expectUpdate("""
+int i = "bad";
+    /\/    ^^
+    /\/ [analyzer] previous.error
+""", errors: [
+    StaticError(
+        line: 1,
+        column: 9,
+        length: 5,
+        code: "updated.error",
+        message: "Long.\nError.\nMessage."),
+  ], expected: """
+int i = "bad";
+    /\/  ^^^^^
+    /\/ [analyzer] updated.error
+    /\/ [cfe] Long.
+    /\/ Error.
+    /\/ Message.
+""");
+
+  // Uses previous line's indentation if there was no existing error
+  // expectation.
+  expectUpdate("""
+main() {
+  int i = "bad";
+}
+""", errors: [
+    StaticError(line: 2, column: 11, length: 5, code: "updated.error"),
+  ], expected: """
+main() {
+  int i = "bad";
+  /\/      ^^^^^
+  /\/ [analyzer] updated.error
+}
+""");
+
+  // Discards indentation if it would collide with carets.
+  expectUpdate("""
+int i = "bad";
+        /\/    ^^
+        /\/ [analyzer] previous.error
+
+main() {
+  int i =
+  "bad";
+}
+""", errors: [
+    StaticError(line: 1, column: 9, length: 5, message: "Error."),
+    StaticError(line: 7, column: 3, length: 5, code: "new.error"),
+  ], expected: """
+int i = "bad";
+/\/      ^^^^^
+/\/ [cfe] Error.
+
+main() {
+  int i =
+  "bad";
+/\/^^^^^
+/\/ [analyzer] new.error
+}
+""");
+
+  // Uses an explicit error location if there's no room for the carets.
+  expectUpdate("""
+int i =
+"bad";
+    /\/    ^^
+    /\/ [analyzer] previous.error
+
+int j =
+"bad";
+""", errors: [
+    StaticError(line: 2, column: 1, length: 5, code: "updated.error"),
+    StaticError(line: 7, column: 1, length: 5, message: "Error."),
+  ], expected: """
+int i =
+"bad";
+/\/ [error line 2, column 1, length 5]
+/\/ [analyzer] updated.error
+
+int j =
+"bad";
+/\/ [error line 7, column 1, length 5]
+/\/ [cfe] Error.
+""");
+
+  // Uses an explicit error location if there's no length.
+  expectUpdate("""
+int i = "bad";
+""", errors: [StaticError(line: 1, column: 9, message: "Error.")], expected: """
+int i = "bad";
+/\/ [error line 1, column 9]
+/\/ [cfe] Error.
+""");
+
+  // Explicit error location handles null length.
+  expectUpdate("""
+int i =
+"bad";
+""", errors: [StaticError(line: 2, column: 1, message: "Error.")], expected: """
+int i =
+"bad";
+/\/ [error line 2, column 1]
+/\/ [cfe] Error.
+""");
+
+  // Inserts a blank line if a subsequent line comment would become part of the
+  // error message.
+  expectUpdate("""
+int i = "bad";
+// Line comment.
+""", errors: [
+    StaticError(line: 1, column: 9, length: 5, message: "Wrong."),
+  ], expected: """
+int i = "bad";
+/\/      ^^^^^
+/\/ [cfe] Wrong.
+
+// Line comment.
+""");
+
+  // Multiple errors on the same line are ordered by column then length.
+  expectUpdate("""
+someBadCode();
+""", errors: [
+    StaticError(line: 1, column: 9, length: 5, message: "Wrong 1."),
+    StaticError(line: 1, column: 9, length: 4, message: "Wrong 2."),
+    StaticError(line: 1, column: 6, length: 3, message: "Wrong 3."),
+    StaticError(line: 1, column: 5, length: 5, message: "Wrong 4."),
+  ], expected: """
+someBadCode();
+/\/  ^^^^^
+/\/ [cfe] Wrong 4.
+/\/   ^^^
+/\/ [cfe] Wrong 3.
+/\/      ^^^^
+/\/ [cfe] Wrong 2.
+/\/      ^^^^^
+/\/ [cfe] Wrong 1.
+""");
+}
+
+void expectUpdate(String original,
+    {List<StaticError> errors,
+    bool removeAnalyzer = true,
+    bool removeCfe = true,
+    String expected}) {
+  errors ??= const [];
+
+  var actual = updateErrorExpectations(original, errors,
+      removeAnalyzer: removeAnalyzer, removeCfe: removeCfe);
+  if (actual != expected) {
+    // Not using Expect.equals() because the diffs it shows aren't helpful for
+    // strings this large.
+    Expect.fail("Output did not match expectation. Expected:\n$expected"
+        "\n\nWas:\n$actual");
+  }
+}
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
new file mode 100644
index 0000000..dcd792d
--- /dev/null
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -0,0 +1,200 @@
+// 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.
+
+/// Regenerates the static error test markers inside static error tests based
+/// on the actual errors reported by analyzer and CFE.
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:glob/glob.dart';
+
+import 'package:test_runner/src/command_output.dart';
+import 'package:test_runner/src/path.dart';
+import 'package:test_runner/src/test_file.dart';
+import 'package:test_runner/src/update_errors.dart';
+import 'package:test_runner/src/utils.dart';
+
+const _usage =
+    "Usage: dart update_static_error_tests.dart [flags...] <path glob>";
+
+Future<void> main(List<String> args) async {
+  var parser = ArgParser();
+
+  parser.addFlag("help", abbr: "h");
+
+  parser.addFlag("dry-run",
+      abbr: "n",
+      help: "Print result but do not overwrite any files.",
+      negatable: false);
+
+  parser.addSeparator("Strip expectations out of the tests:");
+  parser.addFlag("remove",
+      abbr: "r",
+      help: "Remove all existing error expectations.",
+      negatable: false);
+  parser.addFlag("remove-analyzer",
+      help: "Remove existing analyzer error expectations.", negatable: false);
+  parser.addFlag("remove-cfe",
+      help: "Remove existing CFE error expectations.", negatable: false);
+
+  parser.addSeparator(
+      "Insert expectations in the tests based on current front end output:");
+  parser.addFlag("insert",
+      abbr: "i",
+      help: "Insert analyzer and CFE error expectations.",
+      negatable: false);
+  parser.addFlag("insert-analyzer",
+      help: "Insert analyzer error expectations.", negatable: false);
+  parser.addFlag("insert-cfe",
+      help: "Insert CFE error expectations.", negatable: false);
+
+  parser.addSeparator("Update combines remove and insert:");
+  parser.addFlag("update",
+      abbr: "u",
+      help: "Replace analyzer and CFE error expectations.",
+      negatable: false);
+  parser.addFlag("update-analyzer",
+      help: "Replace analyzer error expectations.", negatable: false);
+  parser.addFlag("update-cfe",
+      help: "Replace CFE error expectations.", negatable: false);
+
+  var results = parser.parse(args);
+
+  if (results["help"] as bool) {
+    print("Regenerates the test markers inside static error tests.");
+    print("");
+    print(_usage);
+    print("");
+    print(parser.usage);
+    exit(0);
+  }
+
+  var dryRun = results["dry-run"] as bool;
+  var removeAnalyzer = results["remove-analyzer"] as bool ||
+      results["remove"] as bool ||
+      results["update-analyzer"] as bool ||
+      results["update"] as bool;
+
+  var removeCfe = results["remove-cfe"] as bool ||
+      results["remove"] as bool ||
+      results["update-cfe"] as bool ||
+      results["update"] as bool;
+
+  var insertAnalyzer = results["insert-analyzer"] as bool ||
+      results["insert"] as bool ||
+      results["update-analyzer"] as bool ||
+      results["update"] as bool;
+
+  var insertCfe = results["insert-cfe"] as bool ||
+      results["insert"] as bool ||
+      results["update-cfe"] as bool ||
+      results["update"] as bool;
+
+  if (!removeAnalyzer && !removeCfe && !insertAnalyzer && !insertCfe) {
+    _usageError(
+        parser, "Must provide at least one flag for an operation to perform.");
+  }
+
+  if (results.rest.length != 1) {
+    _usageError(
+        parser, "Must provide a file path or glob for which tests to update.");
+  }
+
+  var glob = Glob(results.rest.single, recursive: true);
+  for (var entry in glob.listSync(root: "tests")) {
+    if (!entry.path.endsWith(".dart")) continue;
+
+    if (entry is File) {
+      await _processFile(entry,
+          dryRun: dryRun,
+          removeAnalyzer: removeAnalyzer,
+          removeCfe: removeCfe,
+          insertAnalyzer: insertAnalyzer,
+          insertCfe: insertCfe);
+    }
+  }
+}
+
+void _usageError(ArgParser parser, String message) {
+  stderr.writeln("Usage error: $message");
+  stderr.writeln();
+  stderr.writeln(_usage);
+  stderr.writeln(parser.usage);
+  exit(64);
+}
+
+Future<void> _processFile(File file,
+    {bool dryRun,
+    bool removeAnalyzer,
+    bool removeCfe,
+    bool insertAnalyzer,
+    bool insertCfe}) async {
+  stdout.write("${file.path}...");
+  var source = file.readAsStringSync();
+  var testFile = TestFile.parse(Path("."), file.path, source);
+
+  var errors = <StaticError>[];
+  if (insertAnalyzer) {
+    stdout.write("\r${file.path} (Running analyzer...)");
+    errors.addAll(await _runAnalyzer(file.path, testFile.sharedOptions));
+  }
+
+  if (insertCfe) {
+    // Clear the previous line.
+    stdout.write("\r${file.path}                      ");
+    stdout.write("\r${file.path} (Running CFE...)");
+    errors.addAll(await _runCfe(file.path, testFile.sharedOptions));
+  }
+
+  errors = StaticError.simplify(errors);
+
+  var result = updateErrorExpectations(source, errors,
+      removeAnalyzer: removeAnalyzer, removeCfe: removeCfe);
+
+  stdout.writeln("\r${file.path} (Updated with ${errors.length} errors)");
+
+  if (dryRun) {
+    print(result);
+  } else {
+    await file.writeAsString(result);
+  }
+}
+
+/// Invoke analyzer on [path] and gather all static errors it reports.
+Future<List<StaticError>> _runAnalyzer(
+    String path, List<String> options) async {
+  // TODO(rnystrom): Running the analyzer command line each time is very slow.
+  // Either import the analyzer as a library, or at least invoke it in a batch
+  // mode.
+  var result = await Process.run("sdk/bin/dartanalyzer$shellScriptExtension", [
+    ...options,
+    "--format=machine",
+    path,
+  ]);
+  var errors = <StaticError>[];
+  AnalysisCommandOutput.parseErrors(result.stderr as String, errors);
+  return errors;
+}
+
+/// Invoke CFE on [path] and gather all static errors it reports.
+Future<List<StaticError>> _runCfe(String path, List<String> options) async {
+  // TODO(rnystrom): Running the CFE command line each time is slow and wastes
+  // time generating code, which we don't care about. Import it as a library or
+  // at least run it in batch mode.
+  var result = await Process.run("sdk/bin/dart", [
+    "pkg/front_end/tool/_fasta/compile.dart",
+    ...options,
+    "--verify",
+    path,
+  ]);
+
+  var errors = <StaticError>[];
+  FastaCommandOutput.parseErrors(result.stdout as String, errors);
+
+  // Running the above command generates a dill file next to the test, which we
+  // don't want, so delete it.
+  await File("$path.dill").delete();
+
+  return errors;
+}
diff --git a/pkg/vm/bin/kernel_service.dart b/pkg/vm/bin/kernel_service.dart
index 9d6e345..1969881 100644
--- a/pkg/vm/bin/kernel_service.dart
+++ b/pkg/vm/bin/kernel_service.dart
@@ -23,17 +23,22 @@
 import 'dart:async' show Future, ZoneSpecification, runZoned;
 import 'dart:collection' show UnmodifiableMapBase;
 import 'dart:convert' show utf8;
-import 'dart:io' show Platform, stderr hide FileSystemEntity;
+import 'dart:io' show File, Platform, stderr hide FileSystemEntity;
 import 'dart:isolate';
 import 'dart:typed_data' show Uint8List;
 
 import 'package:build_integration/file_system/multi_root.dart';
+import 'package:front_end/src/api_prototype/front_end.dart' as fe
+    show CompilerResult;
 import 'package:front_end/src/api_prototype/memory_file_system.dart';
 import 'package:front_end/src/api_unstable/vm.dart';
 import 'package:kernel/binary/ast_to_binary.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/kernel.dart' show Component, Procedure;
 import 'package:kernel/target/targets.dart' show TargetFlags;
-import 'package:vm/bytecode/gen_bytecode.dart' show generateBytecode;
+import 'package:vm/bytecode/gen_bytecode.dart'
+    show createFreshComponentWithBytecode, generateBytecode;
 import 'package:vm/bytecode/options.dart' show BytecodeOptions;
 import 'package:vm/incremental_compiler.dart';
 import 'package:vm/kernel_front_end.dart' show runWithFrontEndCompilerContext;
@@ -43,6 +48,7 @@
     show CompilerOptions, parseExperimentalFlags;
 
 final bool verbose = new bool.fromEnvironment('DFE_VERBOSE');
+final bool dumpKernel = new bool.fromEnvironment('DFE_DUMP_KERNEL');
 const String platformKernelFile = 'virtual_platform_kernel.dill';
 
 // NOTE: Any changes to these tags need to be reflected in kernel_isolate.cc
@@ -70,10 +76,11 @@
 abstract class Compiler {
   final FileSystem fileSystem;
   final Uri platformKernelPath;
-  bool suppressWarnings;
-  List<String> experimentalFlags;
-  bool bytecode;
-  String packageConfig;
+  final bool suppressWarnings;
+  final bool enableAsserts;
+  final List<String> experimentalFlags;
+  final bool bytecode;
+  final String packageConfig;
 
   final List<String> errors = new List<String>();
 
@@ -81,6 +88,7 @@
 
   Compiler(this.fileSystem, this.platformKernelPath,
       {this.suppressWarnings: false,
+      this.enableAsserts: false,
       this.experimentalFlags: null,
       this.bytecode: false,
       this.packageConfig: null}) {
@@ -113,9 +121,11 @@
       ..verbose = verbose
       ..omitPlatform = true
       ..bytecode = bytecode
-      ..experimentalFlags =
-          parseExperimentalFlags(expFlags, (msg) => errors.add(msg))
+      ..experimentalFlags = parseExperimentalFlags(
+          parseExperimentalArguments(expFlags),
+          onError: (msg) => errors.add(msg))
       ..environmentDefines = new EnvironmentMap()
+      ..enableAsserts = enableAsserts
       ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
         switch (message.severity) {
@@ -142,22 +152,33 @@
 
   Future<Component> compile(Uri script) {
     return runWithPrintToStderr(() async {
-      final component = await compileInternal(script);
+      CompilerResult compilerResult = await compileInternal(script);
+      Component component = compilerResult.component;
 
       if (options.bytecode && errors.isEmpty) {
         await runWithFrontEndCompilerContext(script, options, component, () {
-          // TODO(alexmarkov): disable source positions, local variables info
-          //  and source files in VM PRODUCT mode.
-          // TODO(alexmarkov): disable asserts if they are not enabled in VM.
+          // TODO(alexmarkov): disable source positions, local variables info,
+          //  debugger stops and source files in VM PRODUCT mode.
           // TODO(rmacnak): disable annotations if mirrors are not enabled.
           generateBytecode(component,
+              coreTypes: compilerResult.coreTypes,
+              hierarchy: compilerResult.classHierarchy,
               options: new BytecodeOptions(
-                  enableAsserts: true,
+                  enableAsserts: enableAsserts,
                   environmentDefines: options.environmentDefines,
+                  // Needed both for stack traces and the debugger.
                   emitSourcePositions: true,
+                  // Only needed when the debugger is available.
                   emitLocalVarInfo: true,
+                  // Only needed when the debugger is available.
+                  emitDebuggerStops: true,
+                  // Only needed when the VM service is available.
                   emitSourceFiles: true,
+                  // Only needed when reload is available.
+                  emitInstanceFieldInitializers: true,
+                  // Only needed when mirrors are available.
                   emitAnnotations: true));
+          component = createFreshComponentWithBytecode(component);
         });
       }
 
@@ -165,7 +186,18 @@
     });
   }
 
-  Future<Component> compileInternal(Uri script);
+  Future<CompilerResult> compileInternal(Uri script);
+}
+
+class CompilerResult {
+  final Component component;
+  final ClassHierarchy classHierarchy;
+  final CoreTypes coreTypes;
+
+  CompilerResult(this.component, this.classHierarchy, this.coreTypes)
+      : assert(component != null),
+        assert(classHierarchy != null),
+        assert(coreTypes != null);
 }
 
 // Environment map which looks up environment defines in the VM environment
@@ -209,22 +241,26 @@
 
   IncrementalCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
       {bool suppressWarnings: false,
+      bool enableAsserts: false,
       List<String> experimentalFlags: null,
       bool bytecode: false,
       String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
+            enableAsserts: enableAsserts,
             experimentalFlags: experimentalFlags,
             bytecode: bytecode,
             packageConfig: packageConfig);
 
   @override
-  Future<Component> compileInternal(Uri script) async {
+  Future<CompilerResult> compileInternal(Uri script) async {
     if (generator == null) {
       generator = new IncrementalCompiler(options, script);
     }
     errors.clear();
-    return await generator.compile(entryPoint: script);
+    final component = await generator.compile(entryPoint: script);
+    return new CompilerResult(
+        component, generator.getClassHierarchy(), generator.getCoreTypes());
   }
 
   void accept() => generator.accept();
@@ -234,6 +270,7 @@
     IncrementalCompilerWrapper clone = IncrementalCompilerWrapper(
         fileSystem, platformKernelPath,
         suppressWarnings: suppressWarnings,
+        enableAsserts: enableAsserts,
         experimentalFlags: experimentalFlags,
         bytecode: bytecode,
         packageConfig: packageConfig);
@@ -262,20 +299,24 @@
   SingleShotCompilerWrapper(FileSystem fileSystem, Uri platformKernelPath,
       {this.requireMain: false,
       bool suppressWarnings: false,
+      bool enableAsserts: false,
       List<String> experimentalFlags: null,
       bool bytecode: false,
       String packageConfig: null})
       : super(fileSystem, platformKernelPath,
             suppressWarnings: suppressWarnings,
+            enableAsserts: enableAsserts,
             experimentalFlags: experimentalFlags,
             bytecode: bytecode,
             packageConfig: packageConfig);
 
   @override
-  Future<Component> compileInternal(Uri script) async {
-    return requireMain
-        ? kernelForProgram(script, options)
-        : kernelForComponent([script], options);
+  Future<CompilerResult> compileInternal(Uri script) async {
+    fe.CompilerResult compilerResult = requireMain
+        ? await kernelForProgram(script, options)
+        : await kernelForModule([script], options);
+    return new CompilerResult(compilerResult.component,
+        compilerResult.classHierarchy, compilerResult.coreTypes);
   }
 }
 
@@ -291,6 +332,7 @@
 Future<Compiler> lookupOrBuildNewIncrementalCompiler(int isolateId,
     List sourceFiles, Uri platformKernelPath, List<int> platformKernel,
     {bool suppressWarnings: false,
+    bool enableAsserts: false,
     List<String> experimentalFlags: null,
     bool bytecode: false,
     String packageConfig: null,
@@ -320,6 +362,7 @@
       // isolate was shut down. Message should be handled here in this script.
       compiler = new IncrementalCompilerWrapper(fileSystem, platformKernelPath,
           suppressWarnings: suppressWarnings,
+          enableAsserts: enableAsserts,
           experimentalFlags: experimentalFlags,
           bytecode: bytecode,
           packageConfig: packageConfig);
@@ -396,7 +439,21 @@
       // shouldn't print those messages again here.
       result = new CompilationResult.errors(compiler.errors, null);
     } else {
-      result = new CompilationResult.ok(serializeProcedure(procedure));
+      Component component = createExpressionEvaluationComponent(procedure);
+      if (compiler.bytecode) {
+        await runWithFrontEndCompilerContext(
+            compiler.generator.entryPoint, compiler.options, component, () {
+          generateBytecode(component,
+              coreTypes: compiler.generator.getCoreTypes(),
+              hierarchy: compiler.generator.getClassHierarchy(),
+              options: new BytecodeOptions(
+                enableAsserts: compiler.enableAsserts,
+                environmentDefines: compiler.options.environmentDefines,
+              ));
+          component = createFreshComponentWithBytecode(component);
+        });
+      }
+      result = new CompilationResult.ok(serializeComponent(component));
     }
   } catch (error, stack) {
     result = new CompilationResult.crash(error, stack);
@@ -498,20 +555,13 @@
   final int isolateId = request[6];
   final List sourceFiles = request[7];
   final bool suppressWarnings = request[8];
+  final bool enableAsserts = request[9];
   final List<String> experimentalFlags =
-      request[9] != null ? request[9].cast<String>() : null;
-  final bool bytecode = request[10];
-  final String packageConfig = request[11];
-  final String multirootFilepaths = request[12];
-  final String multirootScheme = request[13];
-
-  if (bytecode) {
-    // Bytecode generator is hooked into kernel service after kernel component
-    // is produced. In case of incremental compilation resulting component
-    // doesn't have core libraries which are needed for bytecode generation.
-    // TODO(alexmarkov): Support bytecode generation in incremental compiler.
-    incremental = false;
-  }
+      request[10] != null ? request[10].cast<String>() : null;
+  final bool bytecode = request[11];
+  final String packageConfig = request[12];
+  final String multirootFilepaths = request[13];
+  final String multirootScheme = request[14];
 
   Uri platformKernelPath = null;
   List<int> platformKernel = null;
@@ -567,6 +617,7 @@
     compiler = await lookupOrBuildNewIncrementalCompiler(
         isolateId, sourceFiles, platformKernelPath, platformKernel,
         suppressWarnings: suppressWarnings,
+        enableAsserts: enableAsserts,
         experimentalFlags: experimentalFlags,
         bytecode: bytecode,
         packageConfig: packageConfig,
@@ -578,6 +629,7 @@
     compiler = new SingleShotCompilerWrapper(fileSystem, platformKernelPath,
         requireMain: false,
         suppressWarnings: suppressWarnings,
+        enableAsserts: enableAsserts,
         experimentalFlags: experimentalFlags,
         bytecode: bytecode,
         packageConfig: packageConfig);
@@ -703,6 +755,7 @@
     1 /* isolateId chosen randomly */,
     [] /* source files */,
     false /* suppress warnings */,
+    false /* enable asserts */,
     null /* experimental_flags */,
     false /* generate bytecode */,
     null /* package_config */,
@@ -760,7 +813,11 @@
 class _CompilationOk extends CompilationResult {
   final Uint8List bytes;
 
-  _CompilationOk(this.bytes) : super._();
+  _CompilationOk(this.bytes) : super._() {
+    if (dumpKernel && bytes != null) {
+      _debugDumpKernel(bytes);
+    }
+  }
 
   @override
   Status get status => Status.ok;
@@ -817,3 +874,9 @@
       zoneSpecification: new ZoneSpecification(
           print: (_1, _2, _3, String line) => stderr.writeln(line)));
 }
+
+int _debugDumpCounter = 0;
+void _debugDumpKernel(Uint8List bytes) {
+  new File('kernel_service.tmp${_debugDumpCounter++}.dill')
+      .writeAsBytesSync(bytes);
+}
diff --git a/pkg/vm/bin/protobuf_aware_treeshaker.dart b/pkg/vm/bin/protobuf_aware_treeshaker.dart
index b971b13..24d2fa0 100644
--- a/pkg/vm/bin/protobuf_aware_treeshaker.dart
+++ b/pkg/vm/bin/protobuf_aware_treeshaker.dart
@@ -60,8 +60,6 @@
         valueHelp: 'variable=value')
     ..addFlag('remove-source',
         help: 'Removes source code from the emitted dill', defaultsTo: false)
-    ..addFlag('enable-asserts',
-        help: 'Enables asserts in the emitted dill', defaultsTo: false)
     ..addFlag('verbose',
         help: 'Write to stdout about what classes and fields where remeoved')
     ..addFlag('help', help: 'Prints this help', negatable: false);
@@ -107,8 +105,7 @@
 
   treeshaker.TransformationInfo info = treeshaker.transformComponent(
       component, environment, getTarget(argResults['target'], TargetFlags()),
-      collectInfo: argResults['verbose'],
-      enableAsserts: argResults['enable-asserts']);
+      collectInfo: argResults['verbose']);
 
   if (argResults['verbose']) {
     for (String fieldName in info.removedMessageFields) {
diff --git a/pkg/vm/lib/bytecode/assembler.dart b/pkg/vm/lib/bytecode/assembler.dart
index a43e1c1..1fe11b4 100644
--- a/pkg/vm/lib/bytecode/assembler.dart
+++ b/pkg/vm/lib/bytecode/assembler.dart
@@ -288,7 +288,6 @@
   }
 
   void emitJump(Label label) {
-    emitSourcePosition();
     _emitJumpInstruction(Opcode.kJump, label);
     isUnreachable = true;
   }
@@ -325,6 +324,10 @@
     _emitJumpInstruction(Opcode.kJumpIfNotNull, label);
   }
 
+  void emitJumpIfUnchecked(Label label) {
+    _emitJumpInstruction(Opcode.kJumpIfUnchecked, label);
+  }
+
   void emitReturnTOS() {
     emitSourcePosition();
     _emitInstruction0(Opcode.kReturnTOS);
@@ -360,12 +363,10 @@
   }
 
   void emitStoreLocal(int rx) {
-    emitSourcePosition();
     _emitInstructionX(Opcode.kStoreLocal, rx);
   }
 
   void emitPopLocal(int rx) {
-    emitSourcePosition();
     _emitInstructionX(Opcode.kPopLocal, rx);
   }
 
@@ -379,6 +380,16 @@
     _emitInstructionDF(Opcode.kInterfaceCall, rd, rf);
   }
 
+  void emitInstantiatedInterfaceCall(int rd, int rf) {
+    emitSourcePosition();
+    _emitInstructionDF(Opcode.kInstantiatedInterfaceCall, rd, rf);
+  }
+
+  void emitUncheckedClosureCall(int rd, int rf) {
+    emitSourcePosition();
+    _emitInstructionDF(Opcode.kUncheckedClosureCall, rd, rf);
+  }
+
   void emitUncheckedInterfaceCall(int rd, int rf) {
     emitSourcePosition();
     _emitInstructionDF(Opcode.kUncheckedInterfaceCall, rd, rf);
@@ -390,7 +401,6 @@
   }
 
   void emitNativeCall(int rd) {
-    emitSourcePosition();
     _emitInstructionD(Opcode.kNativeCall, rd);
   }
 
@@ -514,6 +524,11 @@
     _emitInstructionA(Opcode.kCheckStack, ra);
   }
 
+  void emitDebugCheck() {
+    emitSourcePosition();
+    _emitInstruction0(Opcode.kDebugCheck);
+  }
+
   void emitCheckFunctionTypeArgs(int ra, int re) {
     emitSourcePosition();
     _emitInstructionAE(Opcode.kCheckFunctionTypeArgs, ra, re);
diff --git a/pkg/vm/lib/bytecode/constant_pool.dart b/pkg/vm/lib/bytecode/constant_pool.dart
index 3e204ae..6804895 100644
--- a/pkg/vm/lib/bytecode/constant_pool.dart
+++ b/pkg/vm/lib/bytecode/constant_pool.dart
@@ -112,6 +112,14 @@
   PackedObject argDesc;
 }
 
+// Occupies 3 entries in the constant pool.
+type ConstantInstantiatedInterfaceCall extends ConstantPoolEntry {
+  Byte tag = 30;
+  PackedObject target;
+  PackedObject argDesc;
+  PackedObject staticReceiverType;
+}
+
 */
 
 enum ConstantTag {
@@ -145,6 +153,7 @@
   kObjectRef,
   kDirectCall,
   kInterfaceCall,
+  kInstantiatedInterfaceCall,
 }
 
 String constantTagToString(ConstantTag tag) =>
@@ -199,6 +208,8 @@
         return new ConstantDirectCall.read(reader);
       case ConstantTag.kInterfaceCall:
         return new ConstantInterfaceCall.read(reader);
+      case ConstantTag.kInstantiatedInterfaceCall:
+        return new ConstantInstantiatedInterfaceCall.read(reader);
       // Make analyzer happy.
       case ConstantTag.kUnused1:
       case ConstantTag.kUnused2:
@@ -639,6 +650,49 @@
       this.argDesc == other.argDesc;
 }
 
+class ConstantInstantiatedInterfaceCall extends ConstantPoolEntry {
+  final ObjectHandle target;
+  final ObjectHandle argDesc;
+  final ObjectHandle staticReceiverType;
+
+  ConstantInstantiatedInterfaceCall(
+      this.target, this.argDesc, this.staticReceiverType);
+
+  // Reserve 2 extra slots (3 slots total).
+  int get numReservedEntries => 2;
+
+  @override
+  ConstantTag get tag => ConstantTag.kInstantiatedInterfaceCall;
+
+  @override
+  void writeValue(BufferedWriter writer) {
+    writer.writePackedObject(target);
+    writer.writePackedObject(argDesc);
+    writer.writePackedObject(staticReceiverType);
+  }
+
+  ConstantInstantiatedInterfaceCall.read(BufferedReader reader)
+      : target = reader.readPackedObject(),
+        argDesc = reader.readPackedObject(),
+        staticReceiverType = reader.readPackedObject();
+
+  @override
+  String toString() =>
+      "InstantiatedInterfaceCall '$target', $argDesc, receiver $staticReceiverType";
+
+  @override
+  int get hashCode => _combineHashes(
+      _combineHashes(target.hashCode, argDesc.hashCode),
+      staticReceiverType.hashCode);
+
+  @override
+  bool operator ==(other) =>
+      other is ConstantInstantiatedInterfaceCall &&
+      this.target == other.target &&
+      this.argDesc == other.argDesc &&
+      this.staticReceiverType == other.staticReceiverType;
+}
+
 /// Reserved constant pool entry.
 class _ReservedConstantPoolEntry extends ConstantPoolEntry {
   const _ReservedConstantPoolEntry();
@@ -699,6 +753,15 @@
               isSetter: invocationKind == InvocationKind.setter),
           argDesc));
 
+  int addInstantiatedInterfaceCall(InvocationKind invocationKind, Member target,
+          ObjectHandle argDesc, DartType staticReceiverType) =>
+      _add(new ConstantInstantiatedInterfaceCall(
+          objectTable.getMemberHandle(target,
+              isGetter: invocationKind == InvocationKind.getter,
+              isSetter: invocationKind == InvocationKind.setter),
+          argDesc,
+          objectTable.getHandle(staticReceiverType)));
+
   int addInstanceCall(InvocationKind invocationKind, Member target,
           Name targetName, ObjectHandle argDesc) =>
       (target == null)
diff --git a/pkg/vm/lib/bytecode/dbc.dart b/pkg/vm/lib/bytecode/dbc.dart
index aa73fc3..8aecbc4 100644
--- a/pkg/vm/lib/bytecode/dbc.dart
+++ b/pkg/vm/lib/bytecode/dbc.dart
@@ -10,7 +10,7 @@
 /// Before bumping current bytecode version format, make sure that
 /// all users have switched to a VM which is able to consume new
 /// version of bytecode.
-const int currentBytecodeFormatVersion = 12;
+const int currentBytecodeFormatVersion = 18;
 
 enum Opcode {
   kUnusedOpcode000,
@@ -99,8 +99,6 @@
   kUnusedOpcode083,
   kUnusedOpcode084,
 
-  // Bytecode instructions since bytecode format v7:
-
   kTrap,
 
   // Prologue and stack management.
@@ -117,9 +115,9 @@
   kCheckFunctionTypeArgs,
   kCheckFunctionTypeArgs_Wide,
   kCheckStack,
-  kUnused01,
-  kUnused02, // Reserved for CheckParameterTypes
-  kUnused03, // Reserved for CheckParameterTypes_Wide
+  kDebugCheck,
+  kJumpIfUnchecked,
+  kJumpIfUnchecked_Wide,
 
   // Object allocation.
   kAllocate,
@@ -218,10 +216,10 @@
   kInterfaceCall_Wide,
   kUnused23, // Reserved for InterfaceCall1
   kUnused24, // Reserved for InterfaceCall1_Wide
-  kUnused25, // Reserved for InterfaceCall2
-  kUnused26, // Reserved for InterfaceCall2_Wide
-  kUnused27, // Reserved for InterfaceCall3
-  kUnused28, // Reserved for InterfaceCall3_Wide
+  kInstantiatedInterfaceCall,
+  kInstantiatedInterfaceCall_Wide,
+  kUncheckedClosureCall,
+  kUncheckedClosureCall_Wide,
   kUncheckedInterfaceCall,
   kUncheckedInterfaceCall_Wide,
   kDynamicCall,
@@ -370,6 +368,8 @@
       Encoding.kAE, const [Operand.imm, Operand.reg, Operand.none]),
   Opcode.kCheckStack: const Format(
       Encoding.kA, const [Operand.imm, Operand.none, Operand.none]),
+  Opcode.kDebugCheck: const Format(
+      Encoding.k0, const [Operand.none, Operand.none, Operand.none]),
   Opcode.kAllocate: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
   Opcode.kAllocateT: const Format(
@@ -434,8 +434,12 @@
       Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
   Opcode.kJumpIfNotNull: const Format(
       Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
+  Opcode.kJumpIfUnchecked: const Format(
+      Encoding.kT, const [Operand.tgt, Operand.none, Operand.none]),
   Opcode.kInterfaceCall: const Format(
       Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
+  Opcode.kInstantiatedInterfaceCall: const Format(
+      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
   Opcode.kDynamicCall: const Format(
       Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
   Opcode.kNativeCall: const Format(
@@ -500,6 +504,8 @@
       Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
   Opcode.kAllocateClosure: const Format(
       Encoding.kD, const [Operand.lit, Operand.none, Operand.none]),
+  Opcode.kUncheckedClosureCall: const Format(
+      Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
   Opcode.kUncheckedInterfaceCall: const Format(
       Encoding.kDF, const [Operand.lit, Operand.imm, Operand.none]),
   Opcode.kNegateDouble: const Format(
@@ -603,6 +609,8 @@
   switch (opcode) {
     case Opcode.kDirectCall:
     case Opcode.kInterfaceCall:
+    case Opcode.kInstantiatedInterfaceCall:
+    case Opcode.kUncheckedClosureCall:
     case Opcode.kUncheckedInterfaceCall:
     case Opcode.kDynamicCall:
     case Opcode.kNativeCall:
diff --git a/pkg/vm/lib/bytecode/declarations.dart b/pkg/vm/lib/bytecode/declarations.dart
index bd14856..37d71ba 100644
--- a/pkg/vm/lib/bytecode/declarations.dart
+++ b/pkg/vm/lib/bytecode/declarations.dart
@@ -105,7 +105,7 @@
   final ObjectHandle superType;
   final List<ObjectHandle> interfaces;
   final Members members;
-  final ObjectHandle annotations;
+  final AnnotationsDeclaration annotations;
 
   ClassDeclaration(
       this.name,
@@ -161,7 +161,7 @@
     final superType = reader.readPackedObject();
     final interfaces = reader.readPackedList<ObjectHandle>();
     final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<ObjectHandle>()
+        ? reader.readLinkOffset<AnnotationsDeclaration>()
         : null;
     final members = reader.readLinkOffset<Members>();
     return new ClassDeclaration(
@@ -331,6 +331,7 @@
   static const hasAnnotationsFlag = 1 << 10;
   static const hasPragmaFlag = 1 << 11;
   static const hasCustomScriptFlag = 1 << 12;
+  static const hasInitializerCodeFlag = 1 << 13;
 
   final int flags;
   final ObjectHandle name;
@@ -342,7 +343,7 @@
   final ObjectHandle getterName;
   final ObjectHandle setterName;
   final Code initializerCode;
-  final ObjectHandle annotations;
+  final AnnotationsDeclaration annotations;
 
   FieldDeclaration(
       this.flags,
@@ -369,7 +370,7 @@
       writer.writePackedUInt30(position + 1);
       writer.writePackedUInt30(endPosition + 1);
     }
-    if ((flags & hasInitializerFlag) != 0 && (flags & isStaticFlag) != 0) {
+    if ((flags & hasInitializerCodeFlag) != 0) {
       writer.writeLinkOffset(initializerCode);
     }
     if ((flags & hasInitializerFlag) == 0) {
@@ -398,10 +399,9 @@
     final endPosition = ((flags & hasSourcePositionsFlag) != 0)
         ? reader.readPackedUInt30() - 1
         : TreeNode.noOffset;
-    final initializerCode =
-        ((flags & hasInitializerFlag) != 0 && (flags & isStaticFlag) != 0)
-            ? reader.readLinkOffset<Code>()
-            : null;
+    final initializerCode = ((flags & hasInitializerCodeFlag) != 0)
+        ? reader.readLinkOffset<Code>()
+        : null;
     final value =
         ((flags & hasInitializerFlag) == 0) ? reader.readPackedObject() : null;
     final getterName =
@@ -409,7 +409,7 @@
     final setterName =
         ((flags & hasSetterFlag) != 0) ? reader.readPackedObject() : null;
     final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<ObjectHandle>()
+        ? reader.readLinkOffset<AnnotationsDeclaration>()
         : null;
     return new FieldDeclaration(flags, name, type, value, script, position,
         endPosition, getterName, setterName, initializerCode, annotations);
@@ -447,9 +447,10 @@
       sb.write(', pos = $position, end-pos = $endPosition');
     }
     sb.writeln();
-    if ((flags & hasInitializerFlag) != 0) {
+    if ((flags & hasInitializerCodeFlag) != 0) {
       sb.write('    initializer\n$initializerCode\n');
-    } else {
+    }
+    if ((flags & hasInitializerFlag) == 0) {
       sb.write('    value = $value\n');
     }
     if ((flags & hasAnnotationsFlag) != 0) {
@@ -495,7 +496,7 @@
   final ObjectHandle returnType;
   final ObjectHandle nativeName;
   final Code code;
-  final ObjectHandle annotations;
+  final AnnotationsDeclaration annotations;
 
   FunctionDeclaration(
       this.flags,
@@ -575,7 +576,7 @@
     final code =
         ((flags & isAbstractFlag) == 0) ? reader.readLinkOffset<Code>() : null;
     final annotations = ((flags & hasAnnotationsFlag) != 0)
-        ? reader.readLinkOffset<ObjectHandle>()
+        ? reader.readLinkOffset<AnnotationsDeclaration>()
         : null;
     return new FunctionDeclaration(
         flags,
@@ -716,6 +717,7 @@
   // Parameter flags are written separately (in Code).
   static const isCovariantFlag = 1 << 0;
   static const isGenericCovariantImplFlag = 1 << 1;
+  static const isFinalFlag = 1 << 2;
 
   final ObjectHandle name;
   final ObjectHandle type;
@@ -1116,6 +1118,20 @@
   }
 }
 
+class AnnotationsDeclaration {
+  final ObjectHandle object;
+
+  AnnotationsDeclaration(this.object);
+
+  void write(BufferedWriter writer) {
+    writer.writePackedObject(object);
+  }
+
+  factory AnnotationsDeclaration.read(BufferedReader reader) {
+    return new AnnotationsDeclaration(reader.readPackedObject());
+  }
+}
+
 class _Section {
   int numItems;
   int offset;
@@ -1146,7 +1162,7 @@
   final List<SourceFile> sourceFiles = <SourceFile>[];
   final Map<Uri, SourceFile> uriToSource = <Uri, SourceFile>{};
   final List<LocalVariableTable> localVariables = <LocalVariableTable>[];
-  final List<ObjectHandle> annotations = <ObjectHandle>[];
+  final List<AnnotationsDeclaration> annotations = <AnnotationsDeclaration>[];
   ObjectHandle mainLibrary;
 
   Component(this.version)
@@ -1162,7 +1178,7 @@
     final annotationsWriter = new BufferedWriter.fromWriter(writer);
     for (var annot in annotations) {
       writer.linkWriter.put(annot, annotationsWriter.offset);
-      annotationsWriter.writePackedObject(annot);
+      annot.write(annotationsWriter);
     }
     BytecodeSizeStatistics.annotationsSize += annotationsWriter.offset;
 
@@ -1354,7 +1370,7 @@
     reader.offset = annotationsStart;
     for (int i = 0; i < annotationsNum; ++i) {
       int offset = reader.offset - annotationsStart;
-      ObjectHandle annot = reader.readPackedObject();
+      AnnotationsDeclaration annot = new AnnotationsDeclaration.read(reader);
       reader.linkReader.setOffset(annot, offset);
       annotations.add(annot);
     }
diff --git a/pkg/vm/lib/bytecode/gen_bytecode.dart b/pkg/vm/lib/bytecode/gen_bytecode.dart
index 3684410..fdebdc1 100644
--- a/pkg/vm/lib/bytecode/gen_bytecode.dart
+++ b/pkg/vm/lib/bytecode/gen_bytecode.dart
@@ -7,7 +7,7 @@
 // TODO(askesc): We should not need to call the constant evaluator
 // explicitly once constant-update-2018 is shipped.
 import 'package:front_end/src/api_prototype/constant_evaluator.dart'
-    show ConstantEvaluator, EvaluationEnvironment, ErrorReporter;
+    show ConstantEvaluator, EvaluationEnvironment;
 import 'package:front_end/src/api_unstable/vm.dart'
     show
         CompilerContext,
@@ -23,7 +23,6 @@
 import 'package:kernel/external_name.dart'
     show getExternalName, getNativeExtensionUris;
 import 'package:kernel/library_index.dart' show LibraryIndex;
-import 'package:kernel/target/targets.dart' show ConstantsBackend;
 import 'package:kernel/type_algebra.dart'
     show Substitution, containsTypeVariable;
 import 'package:kernel/type_environment.dart' show TypeEnvironment;
@@ -40,9 +39,13 @@
         flattenInstantiatorTypeArguments,
         getDefaultFunctionTypeArguments,
         getInstantiatorTypeArguments,
+        getStaticType,
         hasFreeTypeParameters,
         hasInstantiatorTypeArguments,
-        isUncheckedCall;
+        isAllDynamic,
+        isInstantiatedInterfaceCall,
+        isUncheckedCall,
+        isUncheckedClosureCall;
 import 'local_variable_table.dart' show LocalVariableTable;
 import 'local_vars.dart' show LocalVariables;
 import 'nullability_detector.dart' show NullabilityDetector;
@@ -66,23 +69,25 @@
 void generateBytecode(
   ast.Component component, {
   BytecodeOptions options,
-  ErrorReporter errorReporter,
   List<Library> libraries,
+  CoreTypes coreTypes,
   ClassHierarchy hierarchy,
 }) {
   options ??= new BytecodeOptions();
   verifyBytecodeInstructionDeclarations();
-  final coreTypes = new CoreTypes(component);
+  coreTypes ??= new CoreTypes(component);
   void ignoreAmbiguousSupertypes(Class cls, Supertype a, Supertype b) {}
   hierarchy ??= new ClassHierarchy(component,
       onAmbiguousSupertypes: ignoreAmbiguousSupertypes);
   final typeEnvironment = new TypeEnvironment(coreTypes, hierarchy);
   final constantsBackend = new VmConstantsBackend(coreTypes);
   final errorReporter = new ForwardConstantEvaluationErrors();
+  final constantEvaluator = new ConstantEvaluator(constantsBackend,
+      options.environmentDefines, typeEnvironment, errorReporter);
   libraries ??= component.libraries;
   try {
     final bytecodeGenerator = new BytecodeGenerator(component, coreTypes,
-        hierarchy, typeEnvironment, constantsBackend, options, errorReporter);
+        hierarchy, typeEnvironment, constantEvaluator, options);
     for (var library in libraries) {
       bytecodeGenerator.visitLibrary(library);
     }
@@ -97,9 +102,8 @@
   final CoreTypes coreTypes;
   final ClassHierarchy hierarchy;
   final TypeEnvironment typeEnvironment;
-  final ConstantsBackend constantsBackend;
+  final ConstantEvaluator constantEvaluator;
   final BytecodeOptions options;
-  final ErrorReporter errorReporter;
   final BytecodeMetadataRepository metadata = new BytecodeMetadataRepository();
   final RecognizedMethods recognizedMethods;
   final int formatVersion;
@@ -122,7 +126,6 @@
   Set<TypeParameter> functionTypeParametersSet;
   List<DartType> instantiatorTypeArguments;
   LocalVariables locals;
-  ConstantEvaluator constantEvaluator;
   Map<LabeledStatement, Label> labeledStatements;
   Map<SwitchCase, Label> switchCases;
   Map<TryCatch, TryBlock> tryCatches;
@@ -140,14 +143,8 @@
   List<int> savedMaxSourcePositions;
   int maxSourcePosition;
 
-  BytecodeGenerator(
-      ast.Component component,
-      this.coreTypes,
-      this.hierarchy,
-      this.typeEnvironment,
-      this.constantsBackend,
-      this.options,
-      this.errorReporter)
+  BytecodeGenerator(ast.Component component, this.coreTypes, this.hierarchy,
+      this.typeEnvironment, this.constantEvaluator, this.options)
       : recognizedMethods = new RecognizedMethods(typeEnvironment),
         formatVersion = currentBytecodeFormatVersion,
         astUriToSource = component.uriToSource {
@@ -377,18 +374,8 @@
     if (nodes.isEmpty) {
       return const Annotations(null, false);
     }
-    final savedConstantEvaluator = constantEvaluator;
-    if (constantEvaluator == null) {
-      constantEvaluator = new ConstantEvaluator(
-          constantsBackend,
-          options.environmentDefines,
-          typeEnvironment,
-          options.enableAsserts,
-          errorReporter)
-        ..env = new EvaluationEnvironment();
-    }
-    List<Constant> constants = nodes.map(_evaluateConstantExpression).toList();
-    constantEvaluator = savedConstantEvaluator;
+    List<Constant> constants = constantEvaluator.withNewEnvironment(
+        () => nodes.map(_evaluateConstantExpression).toList());
     bool hasPragma = constants.any(_isPragma);
     if (!options.emitAnnotations) {
       if (hasPragma) {
@@ -399,8 +386,52 @@
     }
     final object =
         objectTable.getHandle(new ListConstant(const DynamicType(), constants));
-    bytecodeComponent.annotations.add(object);
-    return new Annotations(object, hasPragma);
+    final decl = new AnnotationsDeclaration(object);
+    bytecodeComponent.annotations.add(decl);
+    return new Annotations(decl, hasPragma);
+  }
+
+  // Insert annotations for the function and its parameters into the annotations
+  // section. Return the annotations for the function only. The bytecode reader
+  // will implicitly find the parameter annotations by reading N packed objects
+  // after reading the function's annotations, one for each parameter.
+  Annotations getFunctionAnnotations(Member member) {
+    final functionNodes = member.annotations;
+    final parameterNodeLists = new List<List<Expression>>();
+    for (VariableDeclaration variable in member.function.positionalParameters) {
+      parameterNodeLists.add(variable.annotations);
+    }
+    for (VariableDeclaration variable in member.function.namedParameters) {
+      parameterNodeLists.add(variable.annotations);
+    }
+
+    if (functionNodes.isEmpty &&
+        parameterNodeLists.every((nodes) => nodes.isEmpty)) {
+      return const Annotations(null, false);
+    }
+
+    List<Constant> functionConstants = constantEvaluator.withNewEnvironment(
+        () => functionNodes.map(_evaluateConstantExpression).toList());
+    bool hasPragma = functionConstants.any(_isPragma);
+    if (!options.emitAnnotations && !hasPragma) {
+      return const Annotations(null, false);
+    }
+
+    final functionObject = objectTable
+        .getHandle(new ListConstant(const DynamicType(), functionConstants));
+    final functionDecl = new AnnotationsDeclaration(functionObject);
+    bytecodeComponent.annotations.add(functionDecl);
+
+    for (final parameterNodes in parameterNodeLists) {
+      List<Constant> parameterConstants = constantEvaluator.withNewEnvironment(
+          () => parameterNodes.map(_evaluateConstantExpression).toList());
+      final parameterObject = objectTable
+          .getHandle(new ListConstant(const DynamicType(), parameterConstants));
+      final parameterDecl = new AnnotationsDeclaration(parameterObject);
+      bytecodeComponent.annotations.add(parameterDecl);
+    }
+
+    return new Annotations(functionDecl, hasPragma);
   }
 
   FieldDeclaration getFieldDeclaration(Field field, Code initializer) {
@@ -413,6 +444,9 @@
     } else {
       flags |= FieldDeclaration.hasInitializerFlag;
     }
+    if (initializer != null) {
+      flags |= FieldDeclaration.hasInitializerCodeFlag;
+    }
     final name = objectTable.getNameHandle(
         field.name.library, objectTable.mangleMemberName(field, false, false));
     ObjectHandle getterName;
@@ -505,7 +539,7 @@
         flags |= FunctionDeclaration.isNoSuchMethodForwarderFlag;
       }
     }
-    if (member.isAbstract) {
+    if (member.isAbstract && !_hasCode(member)) {
       flags |= FunctionDeclaration.isAbstractFlag;
     }
     if (member.isConst) {
@@ -561,7 +595,7 @@
       position = (member as dynamic).startFileOffset;
       endPosition = member.fileEndOffset;
     }
-    Annotations annotations = getAnnotations(member.annotations);
+    Annotations annotations = getFunctionAnnotations(member);
     if (annotations.object != null) {
       flags |= FunctionDeclaration.hasAnnotationsFlag;
       if (annotations.hasPragma) {
@@ -654,6 +688,9 @@
       if (variable.isGenericCovariantImpl) {
         flags |= ParameterDeclaration.isGenericCovariantImplFlag;
       }
+      if (variable.isFinal) {
+        flags |= ParameterDeclaration.isFinalFlag;
+      }
       return flags;
     }
 
@@ -675,11 +712,10 @@
       return;
     }
     try {
-      bool hasCode = false;
-      start(node);
+      final bool hasCode = _hasCode(node);
+      start(node, hasCode);
       if (node is Field) {
-        if (hasInitializerCode(node)) {
-          hasCode = true;
+        if (hasCode) {
           if (node.isConst) {
             _genPushConstExpr(node.initializer);
           } else {
@@ -689,8 +725,7 @@
         }
       } else if ((node is Procedure && !node.isRedirectingFactoryConstructor) ||
           (node is Constructor)) {
-        if (!node.isAbstract) {
-          hasCode = true;
+        if (hasCode) {
           if (node is Constructor) {
             _genConstructorInitializers(node);
           }
@@ -727,8 +762,27 @@
     }
   }
 
+  bool _hasCode(Member member) {
+    if (member is Procedure && member.isRedirectingFactoryConstructor) {
+      return false;
+    }
+    // Front-end might set abstract flag on static external procedures,
+    // but they can be called and should have a body.
+    if (member is Procedure && member.isStatic && member.isExternal) {
+      return true;
+    }
+    if (member.isAbstract) {
+      return false;
+    }
+    if (member is Field) {
+      return hasInitializerCode(member);
+    }
+    return true;
+  }
+
   bool hasInitializerCode(Field field) =>
-      field.isStatic && !_hasTrivialInitializer(field);
+      (field.isStatic || options.emitInstanceFieldInitializers) &&
+      !_hasTrivialInitializer(field);
 
   void _genNativeCall(String nativeName) {
     final function = enclosingMember.function;
@@ -928,11 +982,15 @@
     initializedFields.add(field);
   }
 
-  void _genArguments(Expression receiver, Arguments arguments) {
+  void _genArguments(Expression receiver, Arguments arguments,
+      {int storeReceiverToLocal}) {
     if (arguments.types.isNotEmpty) {
       _genTypeArguments(arguments.types);
     }
     _generateNode(receiver);
+    if (storeReceiverToLocal != null) {
+      asm.emitStoreLocal(storeReceiverToLocal);
+    }
     _generateNodeList(arguments.positional);
     arguments.named.forEach((NamedExpression ne) => _generateNode(ne.value));
   }
@@ -1281,8 +1339,8 @@
       return;
     }
 
-    if (type is InterfaceType && type.typeArguments.isEmpty) {
-      assert(type.classNode.typeParameters.isEmpty);
+    if (type is InterfaceType &&
+        (type.typeArguments.isEmpty || isAllDynamic(type.typeArguments))) {
       asm.emitPushConstant(cp.addType(type));
       final argDesc = objectTable.getArgDescHandle(2);
       final cpIndex = cp.addInterfaceCall(
@@ -1304,7 +1362,7 @@
     asm.emitInterfaceCall(cpIndex, 4);
   }
 
-  void start(Member node) {
+  void start(Member node, bool hasCode) {
     enclosingClass = node.enclosingClass;
     enclosingMember = node;
     enclosingFunction = node.function;
@@ -1341,16 +1399,8 @@
           new List<TypeParameter>.from(enclosingFunction.typeParameters);
       functionTypeParametersSet = functionTypeParameters.toSet();
     }
-    // TODO(alexmarkov): improve caching in ConstantEvaluator and reuse it
-    constantEvaluator = new ConstantEvaluator(
-        constantsBackend,
-        options.environmentDefines,
-        typeEnvironment,
-        options.enableAsserts,
-        errorReporter)
-      ..env = new EvaluationEnvironment();
-
-    if (node.isAbstract || node is Field && !hasInitializerCode(node)) {
+    constantEvaluator.env = new EvaluationEnvironment();
+    if (!hasCode) {
       return;
     }
 
@@ -1370,7 +1420,7 @@
     savedMaxSourcePositions = <int>[];
     maxSourcePosition = node.fileOffset;
 
-    locals = new LocalVariables(node, options);
+    locals = new LocalVariables(node, options, typeEnvironment);
     locals.enterScope(node);
     assert(!locals.isSyncYieldingFrame);
 
@@ -1385,6 +1435,7 @@
     _recordSourcePosition(position);
     _genPrologue(node, node.function);
     _setupInitialContext(node.function);
+    _emitFirstDebugCheck(node.function);
     if (node is Procedure && node.isInstanceMember) {
       _checkArguments(node.function);
     }
@@ -1424,7 +1475,9 @@
         int forwardingStubTargetCpIndex = null;
         int defaultFunctionTypeArgsCpIndex = null;
 
-        if (node is Procedure) {
+        if (node is Constructor) {
+          parameterFlags = getParameterFlags(node.function);
+        } else if (node is Procedure) {
           parameterFlags = getParameterFlags(node.function);
 
           if (node.isForwardingStub) {
@@ -1468,7 +1521,7 @@
     functionTypeParametersSet = null;
     instantiatorTypeArguments = null;
     locals = null;
-    constantEvaluator = null;
+    constantEvaluator.env = null;
     labeledStatements = null;
     switchCases = null;
     tryCatches = null;
@@ -1662,13 +1715,36 @@
     }
   }
 
+  void _emitFirstDebugCheck(FunctionNode function) {
+    if (options.emitDebuggerStops) {
+      // DebugCheck instruction should be emitted after parameter variables
+      // are declared and copied into context.
+      // The debugger expects the source position to correspond to the
+      // declaration position of the last parameter, if any, or of the function.
+      // The DebugCheck must be encountered each time an async op is reentered.
+      if (options.emitSourcePositions && function != null) {
+        var pos = TreeNode.noOffset;
+        if (function.namedParameters.isNotEmpty) {
+          pos = function.namedParameters.last.fileOffset;
+        } else if (function.positionalParameters.isNotEmpty) {
+          pos = function.positionalParameters.last.fileOffset;
+        }
+        if (pos == TreeNode.noOffset) {
+          pos = function.fileOffset;
+        }
+        _recordSourcePosition(pos);
+      }
+      asm.emitDebugCheck();
+    }
+  }
+
   void _copyParamIfCaptured(VariableDeclaration variable) {
     if (locals.isCaptured(variable)) {
       _genPushContextForVariable(variable);
       asm.emitPush(locals.getOriginalParamSlotIndex(variable));
       _genStoreVar(variable);
-      // TODO(alexmarkov): Do we need to store null at the original parameter
-      // location?
+      // TODO(alexmarkov): We need to store null at the original parameter
+      // location, because the original value may need to be GC'ed.
     }
   }
 
@@ -1806,29 +1882,116 @@
     final forwardingParamTypes = _getForwardingParameterTypes(
         function, forwardingTarget, forwardingSubstitution);
 
-    for (var typeParam in function.typeParameters) {
-      _genTypeParameterBoundCheck(typeParam, forwardingBounds);
+    if (_hasSkippableTypeChecks(
+        function, forwardingBounds, forwardingParamTypes)) {
+      final Label skipChecks = new Label();
+      asm.emitJumpIfUnchecked(skipChecks);
+
+      // We can skip bounds checks of type parameter and type checks of
+      // non-covariant parameters if function is called via unchecked call.
+
+      for (var typeParam in function.typeParameters) {
+        if (_typeParameterNeedsBoundCheck(typeParam, forwardingBounds)) {
+          _genTypeParameterBoundCheck(typeParam, forwardingBounds);
+        }
+      }
+      for (var param in function.positionalParameters) {
+        if (!param.isCovariant &&
+            _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+          _genArgumentTypeCheck(param, forwardingParamTypes);
+        }
+      }
+      for (var param in locals.sortedNamedParameters) {
+        if (!param.isCovariant &&
+            _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+          _genArgumentTypeCheck(param, forwardingParamTypes);
+        }
+      }
+
+      asm.bind(skipChecks);
     }
+
+    // Covariant parameters need to be checked even if function is called
+    // via unchecked call, so they are generated outside of JumpIfUnchecked.
+
     for (var param in function.positionalParameters) {
-      _genArgumentTypeCheck(param, forwardingParamTypes);
+      if (param.isCovariant &&
+          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+        _genArgumentTypeCheck(param, forwardingParamTypes);
+      }
     }
     for (var param in locals.sortedNamedParameters) {
-      _genArgumentTypeCheck(param, forwardingParamTypes);
+      if (param.isCovariant &&
+          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+        _genArgumentTypeCheck(param, forwardingParamTypes);
+      }
     }
   }
 
-  void _genTypeParameterBoundCheck(TypeParameter typeParam,
+  /// Returns true if bound of [typeParam] should be checked.
+  bool _typeParameterNeedsBoundCheck(TypeParameter typeParam,
       Map<TypeParameter, DartType> forwardingTypeParameterBounds) {
     if (canSkipTypeChecksForNonCovariantArguments &&
         !typeParam.isGenericCovariantImpl) {
-      return;
+      return false;
     }
     final DartType bound = (forwardingTypeParameterBounds != null)
         ? forwardingTypeParameterBounds[typeParam]
         : typeParam.bound;
     if (typeEnvironment.isTop(bound)) {
-      return;
+      return false;
     }
+    return true;
+  }
+
+  /// Returns true if type of [param] should be checked.
+  bool _parameterNeedsTypeCheck(VariableDeclaration param,
+      Map<VariableDeclaration, DartType> forwardingParameterTypes) {
+    if (canSkipTypeChecksForNonCovariantArguments &&
+        !param.isCovariant &&
+        !param.isGenericCovariantImpl) {
+      return false;
+    }
+    final DartType type = (forwardingParameterTypes != null)
+        ? forwardingParameterTypes[param]
+        : param.type;
+    if (typeEnvironment.isTop(type)) {
+      return false;
+    }
+    return true;
+  }
+
+  /// Returns true if there are parameter type/bound checks which can
+  /// be skipped on unchecked call.
+  bool _hasSkippableTypeChecks(
+      FunctionNode function,
+      Map<TypeParameter, DartType> forwardingBounds,
+      Map<VariableDeclaration, DartType> forwardingParamTypes) {
+    for (var typeParam in function.typeParameters) {
+      if (_typeParameterNeedsBoundCheck(typeParam, forwardingBounds)) {
+        return true;
+      }
+    }
+    for (var param in function.positionalParameters) {
+      if (!param.isCovariant &&
+          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+        return true;
+      }
+    }
+    for (var param in locals.sortedNamedParameters) {
+      if (!param.isCovariant &&
+          _parameterNeedsTypeCheck(param, forwardingParamTypes)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  void _genTypeParameterBoundCheck(TypeParameter typeParam,
+      Map<TypeParameter, DartType> forwardingTypeParameterBounds) {
+    final DartType bound = (forwardingTypeParameterBounds != null)
+        ? forwardingTypeParameterBounds[typeParam]
+        : typeParam.bound;
     final DartType type = new TypeParameterType(typeParam);
     _genPushInstantiatorAndFunctionTypeArguments([type, bound]);
     asm.emitPushConstant(cp.addType(type));
@@ -1839,17 +2002,9 @@
 
   void _genArgumentTypeCheck(VariableDeclaration variable,
       Map<VariableDeclaration, DartType> forwardingParameterTypes) {
-    if (canSkipTypeChecksForNonCovariantArguments &&
-        !variable.isCovariant &&
-        !variable.isGenericCovariantImpl) {
-      return;
-    }
     final DartType type = (forwardingParameterTypes != null)
         ? forwardingParameterTypes[variable]
         : variable.type;
-    if (typeEnvironment.isTop(type)) {
-      return;
-    }
     if (locals.isCaptured(variable)) {
       asm.emitPush(locals.getOriginalParamSlotIndex(variable));
     } else {
@@ -1942,9 +2097,10 @@
       continuationSwitchVar = locals.scratchVarIndexInFrame;
       _genSyncYieldingPrologue(
           function, continuationSwitchLabel, continuationSwitchVar);
+    } else {
+      _setupInitialContext(function);
+      _emitFirstDebugCheck(function);
     }
-
-    _setupInitialContext(function);
     _checkArguments(function);
 
     _generateNode(function.body);
@@ -2054,13 +2210,37 @@
 
   void _genSyncYieldingPrologue(FunctionNode function, Label continuationLabel,
       int switchVarIndexInFrame) {
+    Label debugCheckLabel = new Label();
+
     // switch_var = :await_jump_var
     _genLoadVar(locals.awaitJumpVar);
     asm.emitStoreLocal(switchVarIndexInFrame);
 
-    // if (switch_var != 0) goto continuationLabel
     _genPushInt(0);
-    asm.emitJumpIfNeStrict(continuationLabel);
+
+    if (options.emitDebuggerStops) {
+      // if (switch_var != 0) goto debugCheckLabel
+      asm.emitJumpIfNeStrict(debugCheckLabel);
+
+      _setupInitialContext(function);
+
+      asm.bind(debugCheckLabel);
+      // The debugger may set a breakpoint on this DebugCheck opcode and it
+      // expects to hit it on the first entry to the async op, as well as on
+      // each subsequent reentry.
+      _emitFirstDebugCheck(function);
+
+      _genLoadVar(locals.awaitJumpVar);
+
+      // if (switch_var != 0) goto continuationLabel
+      _genPushInt(0);
+      asm.emitJumpIfNeStrict(continuationLabel);
+    } else {
+      // if (switch_var != 0) goto continuationLabel
+      asm.emitJumpIfNeStrict(continuationLabel);
+
+      _setupInitialContext(function);
+    }
 
     // Proceed to normal entry.
   }
@@ -2246,6 +2426,9 @@
   /// the last finally block.
   void _generateNonLocalControlTransfer(
       TreeNode from, TreeNode to, GenerateContinuation continuation) {
+    if (options.emitDebuggerStops) {
+      asm.emitDebugCheck(); // Before context is unwound.
+    }
     List<TryFinally> tryFinallyBlocks = _getEnclosingTryFinallyBlocks(from, to);
     _addFinallyBlocks(tryFinallyBlocks, continuation);
   }
@@ -2663,11 +2846,28 @@
   }
 
   void _genInstanceCall(
-      int totalArgCount, int callCpIndex, bool isDynamic, bool isUnchecked,
-      [TreeNode context]) {
-    if (totalArgCount >= argumentsLimit) {
-      throw new TooManyArgumentsException(context.fileOffset);
+      InvocationKind invocationKind,
+      Member interfaceTarget,
+      Name targetName,
+      Expression receiver,
+      int totalArgCount,
+      ObjectHandle argDesc) {
+    final isDynamic = interfaceTarget == null;
+    final isUnchecked = invocationKind != InvocationKind.getter &&
+        isUncheckedCall(interfaceTarget, receiver, typeEnvironment);
+
+    if (invocationKind != InvocationKind.getter && !isDynamic && !isUnchecked) {
+      final staticReceiverType = getStaticType(receiver, typeEnvironment);
+      if (isInstantiatedInterfaceCall(interfaceTarget, staticReceiverType)) {
+        final callCpIndex = cp.addInstantiatedInterfaceCall(
+            invocationKind, interfaceTarget, argDesc, staticReceiverType);
+        asm.emitInstantiatedInterfaceCall(callCpIndex, totalArgCount);
+        return;
+      }
     }
+
+    final callCpIndex = cp.addInstanceCall(
+        invocationKind, interfaceTarget, targetName, argDesc);
     if (isDynamic) {
       assert(!isUnchecked);
       asm.emitDynamicCall(callCpIndex, totalArgCount);
@@ -2686,6 +2886,27 @@
       return;
     }
     final args = node.arguments;
+    final totalArgCount = args.positional.length +
+        args.named.length +
+        1 /* receiver */ +
+        (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
+    if (totalArgCount >= argumentsLimit) {
+      throw new TooManyArgumentsException(node.fileOffset);
+    }
+    // Front-end guarantees that all calls with known function type
+    // do not need any argument type checks.
+    if (isUncheckedClosureCall(node, typeEnvironment)) {
+      final int receiverTemp = locals.tempIndexInFrame(node);
+      _genArguments(node.receiver, args, storeReceiverToLocal: receiverTemp);
+      // Duplicate receiver (closure) for UncheckedClosureCall.
+      asm.emitPush(receiverTemp);
+      final argDescCpIndex = cp.addArgDescByArguments(args, hasReceiver: true);
+      asm.emitUncheckedClosureCall(argDescCpIndex, totalArgCount);
+      return;
+    }
+
+    _genArguments(node.receiver, args);
+
     Member interfaceTarget = node.interfaceTarget;
     if (interfaceTarget is Field ||
         interfaceTarget is Procedure && interfaceTarget.isGetter) {
@@ -2693,29 +2914,18 @@
       // interface target doesn't fully represent what is being called.
       interfaceTarget = null;
     }
-    final isDynamic = interfaceTarget == null;
-    final isUnchecked =
-        isUncheckedCall(interfaceTarget, node.receiver, typeEnvironment);
-    _genArguments(node.receiver, args);
     final argDesc =
         objectTable.getArgDescHandleByArguments(args, hasReceiver: true);
-    final callCpIndex = cp.addInstanceCall(
-        InvocationKind.method, interfaceTarget, node.name, argDesc);
-    final totalArgCount = args.positional.length +
-        args.named.length +
-        1 /* receiver */ +
-        (args.types.isNotEmpty ? 1 : 0) /* type arguments */;
-    _genInstanceCall(totalArgCount, callCpIndex, isDynamic, isUnchecked, node);
+    _genInstanceCall(InvocationKind.method, interfaceTarget, node.name,
+        node.receiver, totalArgCount, argDesc);
   }
 
   @override
   visitPropertyGet(PropertyGet node) {
     _generateNode(node.receiver);
-    final isDynamic = node.interfaceTarget == null;
     final argDesc = objectTable.getArgDescHandle(1);
-    final callCpIndex = cp.addInstanceCall(
-        InvocationKind.getter, node.interfaceTarget, node.name, argDesc);
-    _genInstanceCall(1, callCpIndex, isDynamic, /*isUnchecked=*/ false);
+    _genInstanceCall(InvocationKind.getter, node.interfaceTarget, node.name,
+        node.receiver, 1, argDesc);
   }
 
   @override
@@ -2730,13 +2940,10 @@
       asm.emitStoreLocal(temp);
     }
 
-    final isDynamic = node.interfaceTarget == null;
-    final isUnchecked =
-        isUncheckedCall(node.interfaceTarget, node.receiver, typeEnvironment);
     final argDesc = objectTable.getArgDescHandle(2);
-    final callCpIndex = cp.addInstanceCall(
-        InvocationKind.setter, node.interfaceTarget, node.name, argDesc);
-    _genInstanceCall(2, callCpIndex, isDynamic, isUnchecked);
+    _genInstanceCall(InvocationKind.setter, node.interfaceTarget, node.name,
+        node.receiver, 2, argDesc);
+
     asm.emitDrop1();
 
     if (hasResult) {
@@ -3012,11 +3219,15 @@
     final v = node.variable;
     final bool hasResult = !isExpressionWithoutResult(node);
 
+    _genPushContextIfCaptured(v);
+
+    _generateNode(node.value);
+
+    if (options.emitDebuggerStops && _variableSetNeedsDebugCheck(node.value)) {
+      asm.emitDebugCheck();
+    }
+
     if (locals.isCaptured(v)) {
-      _genPushContextForVariable(v);
-
-      _generateNode(node.value);
-
       final int temp = locals.tempIndexInFrame(node);
       if (hasResult) {
         asm.emitStoreLocal(temp);
@@ -3028,8 +3239,6 @@
         asm.emitPush(temp);
       }
     } else {
-      _generateNode(node.value);
-
       final int localIndex = locals.getVarIndexInFrame(v);
       if (hasResult) {
         asm.emitStoreLocal(localIndex);
@@ -3039,6 +3248,13 @@
     }
   }
 
+  bool _variableSetNeedsDebugCheck(Expression rhs) =>
+      rhs is BasicLiteral ||
+      rhs is ConstantExpression ||
+      rhs is StaticGet ||
+      rhs is FunctionExpression ||
+      rhs is VariableGet;
+
   void _genFutureNull() {
     asm.emitPushNull();
     _genDirectCall(futureValue, objectTable.getArgDescHandle(1), 1);
@@ -3651,6 +3867,16 @@
       } else {
         asm.emitPushNull();
       }
+
+      if (options.emitDebuggerStops) {
+        final savedSourcePosition = asm.currentSourcePosition;
+        if (node.fileEqualsOffset != TreeNode.noOffset) {
+          _recordSourcePosition(node.fileEqualsOffset);
+        }
+        asm.emitDebugCheck();
+        asm.currentSourcePosition = savedSourcePosition;
+      }
+
       if (options.emitLocalVarInfo && !asm.isUnreachable && node.name != null) {
         _declareLocalVariable(node, maxInitializerPosition + 1);
       }
@@ -3809,7 +4035,7 @@
 }
 
 class Annotations {
-  final ObjectHandle object;
+  final AnnotationsDeclaration object;
   final bool hasPragma;
 
   const Annotations(this.object, this.hasPragma);
diff --git a/pkg/vm/lib/bytecode/generics.dart b/pkg/vm/lib/bytecode/generics.dart
index 91f8a70..a109999 100644
--- a/pkg/vm/lib/bytecode/generics.dart
+++ b/pkg/vm/lib/bytecode/generics.dart
@@ -69,7 +69,7 @@
     Class instantiatedClass, List<DartType> typeArgs) {
   final flatTypeArgs =
       flattenInstantiatorTypeArguments(instantiatedClass, typeArgs);
-  if (_isAllDynamic(flatTypeArgs)) {
+  if (isAllDynamic(flatTypeArgs)) {
     return null;
   }
   return flatTypeArgs;
@@ -79,13 +79,13 @@
   List<DartType> defaultTypes = function.typeParameters
       .map((p) => p.defaultType ?? const DynamicType())
       .toList();
-  if (_isAllDynamic(defaultTypes)) {
+  if (isAllDynamic(defaultTypes)) {
     return null;
   }
   return defaultTypes;
 }
 
-bool _isAllDynamic(List<DartType> typeArgs) {
+bool isAllDynamic(List<DartType> typeArgs) {
   for (var t in typeArgs) {
     if (t != const DynamicType()) {
       return false;
@@ -94,6 +94,11 @@
   return true;
 }
 
+bool isInstantiatedGenericType(DartType type) =>
+    (type is InterfaceType) &&
+    type.typeArguments.isNotEmpty &&
+    !hasFreeTypeParameters(type.typeArguments);
+
 bool hasFreeTypeParameters(List<DartType> typeArgs) {
   final findTypeParams = new FindFreeTypeParametersVisitor();
   return typeArgs.any((t) => t.accept(findTypeParams));
@@ -176,9 +181,9 @@
   return false;
 }
 
-// Returns true if an instance call to [interfaceTarget] with given
-// [receiver] can omit argument type checks needed due to generic-covariant
-// parameters.
+/// Returns true if an instance call to [interfaceTarget] with given
+/// [receiver] can omit argument type checks needed due to generic-covariant
+/// parameters.
 bool isUncheckedCall(Member interfaceTarget, Expression receiver,
     TypeEnvironment typeEnvironment) {
   if (interfaceTarget == null) {
@@ -210,6 +215,23 @@
   return false;
 }
 
+/// If receiver type at run time matches static type we can omit argument type
+/// checks. This condition can be efficiently tested if static receiver type is
+/// fully instantiated (e.g. doesn't have type parameters).
+/// [isInstantiatedInterfaceCall] tests if an instance call to
+/// [interfaceTarget] with given [staticReceiverType] may benefit from
+/// this optimization.
+bool isInstantiatedInterfaceCall(
+    Member interfaceTarget, DartType staticReceiverType) {
+  // Providing instantiated receiver type wouldn't help in case of a
+  // dynamic call or call without any parameter type checks.
+  if (interfaceTarget == null ||
+      !_hasGenericCovariantParameters(interfaceTarget)) {
+    return false;
+  }
+  return isInstantiatedGenericType(staticReceiverType);
+}
+
 bool _hasGenericCovariantParameters(Member target) {
   if (target is Field) {
     return target.isGenericCovariantImpl;
@@ -229,3 +251,10 @@
     throw 'Unexpected instance call target ${target.runtimeType} $target';
   }
 }
+
+/// Returns true if invocation [node] is a closure call with statically known
+/// function type. Such invocations can omit argument type checks.
+bool isUncheckedClosureCall(
+        MethodInvocation node, TypeEnvironment typeEnvironment) =>
+    node.name.name == 'call' &&
+    getStaticType(node.receiver, typeEnvironment) is FunctionType;
diff --git a/pkg/vm/lib/bytecode/local_variable_table.dart b/pkg/vm/lib/bytecode/local_variable_table.dart
index fc49225..9da3d17 100644
--- a/pkg/vm/lib/bytecode/local_variable_table.dart
+++ b/pkg/vm/lib/bytecode/local_variable_table.dart
@@ -51,7 +51,7 @@
   }
 
   Scope.readContents(BufferedReader reader, int startPC) : super(startPC) {
-    endPC = startPC = reader.readPackedUInt30();
+    endPC = startPC + reader.readPackedUInt30();
     contextLevel = reader.readSLEB128();
     position = reader.readPackedUInt30() - 1;
     endPosition = reader.readPackedUInt30() - 1;
@@ -152,7 +152,9 @@
     final scope = activeScopes.removeLast();
     scope.endPC = pc;
     scope.endPosition = endPosition;
-    if (scope.variables.isEmpty) {
+    if (scope.variables.isEmpty &&
+        activeScopes.isNotEmpty &&
+        scope.contextLevel == activeScopes.last.contextLevel) {
       scopes.remove(scope);
     }
   }
diff --git a/pkg/vm/lib/bytecode/local_vars.dart b/pkg/vm/lib/bytecode/local_vars.dart
index 401a528..d75f4a0 100644
--- a/pkg/vm/lib/bytecode/local_vars.dart
+++ b/pkg/vm/lib/bytecode/local_vars.dart
@@ -9,6 +9,8 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/transformations/continuation.dart'
     show ContinuationVariables;
+import 'package:kernel/type_environment.dart';
+import 'package:vm/bytecode/generics.dart';
 
 import 'dbc.dart';
 import 'options.dart' show BytecodeOptions;
@@ -27,6 +29,7 @@
   final Map<ForInStatement, VariableDeclaration> _capturedIteratorVars =
       <ForInStatement, VariableDeclaration>{};
   final BytecodeOptions options;
+  final TypeEnvironment typeEnvironment;
 
   Scope _currentScope;
   Frame _currentFrame;
@@ -185,7 +188,7 @@
   List<VariableDeclaration> get sortedNamedParameters =>
       _currentFrame.sortedNamedParameters;
 
-  LocalVariables(Member node, this.options) {
+  LocalVariables(Member node, this.options, this.typeEnvironment) {
     final scopeBuilder = new _ScopeBuilder(this);
     node.accept(scopeBuilder);
 
@@ -281,6 +284,12 @@
   bool get hasContext => contextSize > 0;
 }
 
+bool _hasReceiverParameter(TreeNode node) {
+  return node is Constructor ||
+      (node is Procedure && !node.isStatic) ||
+      (node is Field && !node.isStatic);
+}
+
 class _ScopeBuilder extends RecursiveVisitor<Null> {
   final LocalVariables locals;
 
@@ -310,6 +319,10 @@
     _enterFrame(node);
 
     if (node is Field) {
+      if (_hasReceiverParameter(node)) {
+        _currentFrame.receiverVar = new VariableDeclaration('this');
+        _declareVariable(_currentFrame.receiverVar);
+      }
       node.initializer?.accept(this);
     } else {
       assert(node is Procedure ||
@@ -348,7 +361,7 @@
         }
       }
 
-      if (node is Constructor || (node is Procedure && !node.isStatic)) {
+      if (_hasReceiverParameter(node)) {
         _currentFrame.receiverVar = new VariableDeclaration('this');
         _declareVariable(_currentFrame.receiverVar);
       } else if (_currentFrame.parent?.receiverVar != null) {
@@ -403,7 +416,7 @@
       _declareVariable(_currentFrame.scratchVar);
     }
 
-    if (node is Constructor || (node is Procedure && !node.isStatic)) {
+    if (_hasReceiverParameter(node)) {
       if (locals.isCaptured(_currentFrame.receiverVar)) {
         // Duplicate receiver variable for local use.
         _currentFrame.capturedReceiverVar = _currentFrame.receiverVar;
@@ -939,8 +952,7 @@
 
   void _allocateParameters(TreeNode node, FunctionNode function) {
     final bool isFactory = node is Procedure && node.isFactory;
-    final bool hasReceiver =
-        node is Constructor || (node is Procedure && !node.isStatic);
+    final bool hasReceiver = _hasReceiverParameter(node);
     final bool hasClosureArg =
         node is FunctionDeclaration || node is FunctionExpression;
 
@@ -1001,6 +1013,13 @@
     _enterScope(node);
 
     if (node is Field) {
+      if (_hasReceiverParameter(node)) {
+        _currentFrame.numParameters = 1;
+        _allocateParameter(_currentFrame.receiverVar, 0);
+        if (_currentFrame.capturedReceiverVar != null) {
+          _allocateVariable(_currentFrame.capturedReceiverVar);
+        }
+      }
       _allocateSpecialVariables();
       node.initializer?.accept(this);
     } else {
@@ -1176,6 +1195,15 @@
   }
 
   @override
+  visitMethodInvocation(MethodInvocation node) {
+    int numTemps = 0;
+    if (isUncheckedClosureCall(node, locals.typeEnvironment)) {
+      numTemps = 1;
+    }
+    _visit(node, temps: numTemps);
+  }
+
+  @override
   visitPropertySet(PropertySet node) {
     _visit(node, temps: 1);
   }
diff --git a/pkg/vm/lib/bytecode/object_table.dart b/pkg/vm/lib/bytecode/object_table.dart
index 6b418e0..c13e330 100644
--- a/pkg/vm/lib/bytecode/object_table.dart
+++ b/pkg/vm/lib/bytecode/object_table.dart
@@ -1190,6 +1190,7 @@
   ConstTag tag;
   dynamic value;
   ObjectHandle type;
+  int _hashCode = 0;
 
   _ConstObjectHandle._empty();
 
@@ -1356,27 +1357,31 @@
 
   @override
   int get hashCode {
+    if (_hashCode != 0) {
+      return _hashCode;
+    }
     switch (tag) {
       case ConstTag.kInt:
       case ConstTag.kDouble:
       case ConstTag.kBool:
       case ConstTag.kTearOff:
       case ConstTag.kSymbol:
-        return value.hashCode;
+        return _hashCode = value.hashCode;
       case ConstTag.kInstance:
         {
           final fieldValues = value as Map<ObjectHandle, ObjectHandle>;
-          return _combineHashes(type.hashCode, mapHashCode(fieldValues));
+          return _hashCode =
+              _combineHashes(type.hashCode, mapHashCode(fieldValues));
         }
         break;
       case ConstTag.kList:
         {
           final elems = value as List<ObjectHandle>;
-          return _combineHashes(type.hashCode, listHashCode(elems));
+          return _hashCode = _combineHashes(type.hashCode, listHashCode(elems));
         }
         break;
       case ConstTag.kTearOffInstantiation:
-        return _combineHashes(value.hashCode, type.hashCode);
+        return _hashCode = _combineHashes(value.hashCode, type.hashCode);
       default:
         throw 'Unexpected constant tag: $tag';
     }
@@ -1384,6 +1389,9 @@
 
   @override
   bool operator ==(other) {
+    if (identical(this, other)) {
+      return true;
+    }
     if (other is _ConstObjectHandle && this.tag == other.tag) {
       switch (tag) {
         case ConstTag.kInt:
@@ -2012,11 +2020,10 @@
 
   @override
   ObjectHandle visitFunctionType(FunctionType node) {
-    final typeParameters = new List<_TypeParameterHandle>.generate(
-        node.typeParameters.length,
-        (i) => objectTable.getOrAddObject(new _TypeParameterHandle(null, i)));
+    final int numEnclosingTypeParameters = _typeParameters.length;
     for (int i = 0; i < node.typeParameters.length; ++i) {
-      _typeParameters[node.typeParameters[i]] = typeParameters[i];
+      _typeParameters[node.typeParameters[i]] = objectTable.getOrAddObject(
+          new _TypeParameterHandle(null, numEnclosingTypeParameters + i));
     }
 
     final positionalParams = new List<_TypeHandle>();
diff --git a/pkg/vm/lib/bytecode/options.dart b/pkg/vm/lib/bytecode/options.dart
index 516cf57..1772143 100644
--- a/pkg/vm/lib/bytecode/options.dart
+++ b/pkg/vm/lib/bytecode/options.dart
@@ -9,8 +9,10 @@
   static Map<String, String> commandLineFlags = {
     'annotations': 'Emit Dart annotations',
     'local-var-info': 'Emit debug information about local variables',
+    'debugger-stops': 'Emit bytecode instructions for stopping in the debugger',
     'show-bytecode-size-stat': 'Show bytecode size breakdown',
     'source-positions': 'Emit source positions',
+    'instance-field-initializers': 'Emit separate instance field initializers',
   };
 
   bool enableAsserts;
@@ -18,7 +20,9 @@
   bool emitSourcePositions;
   bool emitSourceFiles;
   bool emitLocalVarInfo;
+  bool emitDebuggerStops;
   bool emitAnnotations;
+  bool emitInstanceFieldInitializers;
   bool omitAssertSourcePositions;
   bool showBytecodeSizeStatistics;
   Map<String, String> environmentDefines;
@@ -29,7 +33,9 @@
       this.emitSourcePositions = false,
       this.emitSourceFiles = false,
       this.emitLocalVarInfo = false,
+      this.emitDebuggerStops = false,
       this.emitAnnotations = false,
+      this.emitInstanceFieldInitializers = false,
       this.omitAssertSourcePositions = false,
       this.showBytecodeSizeStatistics = false,
       this.environmentDefines = const <String, String>{}}) {
@@ -49,9 +55,15 @@
         case 'local-var-info':
           emitLocalVarInfo = true;
           break;
+        case 'debugger-stops':
+          emitDebuggerStops = true;
+          break;
         case 'annotations':
           emitAnnotations = true;
           break;
+        case 'instance-field-initializers':
+          emitInstanceFieldInitializers = true;
+          break;
         case 'show-bytecode-size-stat':
           showBytecodeSizeStatistics = true;
           break;
diff --git a/pkg/vm/lib/frontend_server.dart b/pkg/vm/lib/frontend_server.dart
index bce696d..7535474 100644
--- a/pkg/vm/lib/frontend_server.dart
+++ b/pkg/vm/lib/frontend_server.dart
@@ -285,7 +285,8 @@
       ..verbose = options['verbose']
       ..embedSourceText = options['embed-source-text']
       ..experimentalFlags = parseExperimentalFlags(
-          options['enable-experiment'], (msg) => errors.add(msg))
+          parseExperimentalArguments(options['enable-experiment']),
+          onError: (msg) => errors.add(msg))
       ..onDiagnostic = (DiagnosticMessage message) {
         bool printMessage;
         switch (message.severity) {
diff --git a/pkg/vm/lib/incremental_compiler.dart b/pkg/vm/lib/incremental_compiler.dart
index 7914070..d66c022 100644
--- a/pkg/vm/lib/incremental_compiler.dart
+++ b/pkg/vm/lib/incremental_compiler.dart
@@ -7,6 +7,8 @@
 import 'dart:async';
 
 import 'package:front_end/src/api_unstable/vm.dart';
+import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
+import 'package:kernel/core_types.dart' show CoreTypes;
 import 'package:kernel/kernel.dart';
 
 const String kDebugProcedureName = ":Eval";
@@ -76,6 +78,9 @@
       ..mainMethod = mainMethod;
   }
 
+  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.
diff --git a/pkg/vm/lib/kernel_front_end.dart b/pkg/vm/lib/kernel_front_end.dart
index 78a233a..ced23df 100644
--- a/pkg/vm/lib/kernel_front_end.dart
+++ b/pkg/vm/lib/kernel_front_end.dart
@@ -22,6 +22,7 @@
     show
         CompilerContext,
         CompilerOptions,
+        CompilerResult,
         DiagnosticMessage,
         DiagnosticMessageHandler,
         FileSystem,
@@ -32,6 +33,7 @@
         StandardFileSystem,
         getMessageUri,
         kernelForProgram,
+        parseExperimentalArguments,
         parseExperimentalFlags,
         printDiagnosticMessage;
 
@@ -214,7 +216,9 @@
     ..fileSystem = fileSystem
     ..linkedDependencies = linkedDependencies
     ..packagesFileUri = packagesUri
-    ..experimentalFlags = parseExperimentalFlags(experimentalFlags, print)
+    ..experimentalFlags = parseExperimentalFlags(
+        parseExperimentalArguments(experimentalFlags),
+        onError: print)
     ..onDiagnostic = (DiagnosticMessage m) {
       errorDetector(m);
     }
@@ -227,7 +231,6 @@
       genBytecode: genBytecode,
       bytecodeOptions: bytecodeOptions,
       dropAST: dropAST && !splitOutputByPackages,
-      enableAsserts: enableAsserts,
       enableConstantEvaluation: enableConstantEvaluation,
       useProtobufTreeShaker: useProtobufTreeShaker);
 
@@ -281,7 +284,6 @@
     bool genBytecode: false,
     BytecodeOptions bytecodeOptions,
     bool dropAST: false,
-    bool enableAsserts: false,
     bool enableConstantEvaluation: true,
     bool useProtobufTreeShaker: false}) async {
   // Replace error handler to detect if there are compilation errors.
@@ -290,7 +292,8 @@
   options.onDiagnostic = errorDetector;
 
   setVMEnvironmentDefines(environmentDefines, options);
-  Component component = await kernelForProgram(source, options);
+  CompilerResult compilerResult = await kernelForProgram(source, options);
+  Component component = compilerResult?.component;
 
   // Run global transformations only if component is correct.
   if (aot && component != null) {
@@ -300,7 +303,6 @@
         component,
         useGlobalTypeFlowAnalysis,
         environmentDefines,
-        enableAsserts,
         enableConstantEvaluation,
         useProtobufTreeShaker,
         errorDetector);
@@ -352,7 +354,6 @@
     Component component,
     bool useGlobalTypeFlowAnalysis,
     Map<String, String> environmentDefines,
-    bool enableAsserts,
     bool enableConstantEvaluation,
     bool useProtobufTreeShaker,
     ErrorDetector errorDetector) async {
@@ -370,8 +371,8 @@
   mixin_deduplication.transformComponent(component);
 
   if (enableConstantEvaluation) {
-    await _performConstantEvaluation(source, compilerOptions, component,
-        coreTypes, environmentDefines, enableAsserts);
+    await _performConstantEvaluation(
+        source, compilerOptions, component, coreTypes, environmentDefines);
 
     if (errorDetector.hasCompilationErrors) return;
   }
@@ -431,8 +432,7 @@
     CompilerOptions compilerOptions,
     Component component,
     CoreTypes coreTypes,
-    Map<String, String> environmentDefines,
-    bool enableAsserts) async {
+    Map<String, String> environmentDefines) async {
   final vmConstants = new vm_constants.VmConstantsBackend(coreTypes);
 
   await runWithFrontEndCompilerContext(source, compilerOptions, component, () {
@@ -442,7 +442,6 @@
         new ForwardConstantEvaluationErrors(),
         keepFields: true,
         evaluateAnnotations: true,
-        enableAsserts: enableAsserts,
         desugarSets: !compilerOptions.target.supportsSetLiterals);
   });
 }
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index a04416a..8a6dc24 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -46,6 +46,9 @@
   bool get enableNoSuchMethodForwarders => true;
 
   @override
+  bool get supportsSetLiterals => false;
+
+  @override
   String get name => 'vm';
 
   // This is the order that bootstrap libraries are loaded according to
@@ -81,6 +84,7 @@
       CoreTypes coreTypes,
       ClassHierarchy hierarchy,
       List<Library> libraries,
+      Map<String, String> environmentDefines,
       DiagnosticReporter diagnosticReporter,
       {void logger(String msg)}) {
     transformMixins.transformLibraries(this, coreTypes, hierarchy, libraries,
@@ -95,10 +99,13 @@
     logger?.call("Transformed ffi annotations");
 
     // TODO(kmillikin): Make this run on a per-method basis.
-    transformAsync.transformLibraries(coreTypes, libraries);
+    bool productMode = environmentDefines["dart.vm.product"] == "true";
+    transformAsync.transformLibraries(coreTypes, libraries,
+        productMode: productMode);
     logger?.call("Transformed async methods");
 
     listFactorySpecializer.transformLibraries(libraries, coreTypes);
+    logger?.call("Specialized list factories");
 
     callSiteAnnotator.transformLibraries(
         component, libraries, coreTypes, hierarchy);
diff --git a/pkg/vm/lib/transformations/ffi.dart b/pkg/vm/lib/transformations/ffi.dart
index c90cd64..667a2e9 100644
--- a/pkg/vm/lib/transformations/ffi.dart
+++ b/pkg/vm/lib/transformations/ffi.dart
@@ -86,6 +86,74 @@
   UNKNOWN, // Struct
 ];
 
+/// 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/compiler/ffi.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},
+
+  // 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: {},
+};
+
 /// [FfiTransformer] contains logic which is shared between
 /// _FfiUseSiteTransformer and _FfiDefinitionTransformer.
 class FfiTransformer extends Transformer {
@@ -97,7 +165,10 @@
 
   final Class intClass;
   final Class doubleClass;
-  final Constructor pragmaConstructor;
+  final Class pragmaClass;
+  final Field pragmaName;
+  final Field pragmaOptions;
+  final Procedure listElementAt;
 
   final Library ffiLibrary;
   final Class nativeFunctionClass;
@@ -114,6 +185,7 @@
   final Field addressOfField;
   final Constructor structFromPointer;
   final Procedure libraryLookupMethod;
+  final Procedure abiMethod;
 
   /// Classes corresponding to [NativeType], indexed by [NativeType].
   final List<Class> nativeTypesClasses;
@@ -123,7 +195,10 @@
       : env = new TypeEnvironment(coreTypes, hierarchy),
         intClass = coreTypes.intClass,
         doubleClass = coreTypes.doubleClass,
-        pragmaConstructor = coreTypes.pragmaConstructor,
+        pragmaClass = coreTypes.pragmaClass,
+        pragmaName = coreTypes.pragmaName,
+        pragmaOptions = coreTypes.pragmaOptions,
+        listElementAt = coreTypes.index.getMember('dart:core', 'List', '[]'),
         ffiLibrary = index.getLibrary('dart:ffi'),
         nativeFunctionClass = index.getClass('dart:ffi', 'NativeFunction'),
         pointerClass = index.getClass('dart:ffi', 'Pointer'),
@@ -144,6 +219,7 @@
             index.getMember('dart:ffi', 'Pointer', 'fromFunction'),
         libraryLookupMethod =
             index.getMember('dart:ffi', 'DynamicLibrary', 'lookup'),
+        abiMethod = index.getTopLevelMember('dart:ffi', '_abi'),
         nativeTypesClasses = nativeTypeClassNames
             .map((name) => index.getClass('dart:ffi', name))
             .toList();
diff --git a/pkg/vm/lib/transformations/ffi_definitions.dart b/pkg/vm/lib/transformations/ffi_definitions.dart
index 34d3fa9..8bef2ca 100644
--- a/pkg/vm/lib/transformations/ffi_definitions.dart
+++ b/pkg/vm/lib/transformations/ffi_definitions.dart
@@ -9,24 +9,19 @@
 import 'package:front_end/src/api_unstable/vm.dart'
     show
         templateFfiFieldAnnotation,
+        templateFfiFieldNoAnnotation,
         templateFfiTypeMismatch,
         templateFfiFieldInitializer,
         templateFfiStructGeneric,
         templateFfiWrongStructInheritance;
 
-import 'package:kernel/ast.dart';
+import 'package:kernel/ast.dart' hide MapEntry;
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart';
 import 'package:kernel/library_index.dart' show LibraryIndex;
 import 'package:kernel/target/targets.dart' show DiagnosticReporter;
 
-import 'ffi.dart'
-    show
-        ReplacedMembers,
-        NativeType,
-        FfiTransformer,
-        nativeTypeSizes,
-        WORD_SIZE;
+import 'ffi.dart';
 
 /// Checks and elaborates the dart:ffi structs and fields.
 ///
@@ -38,7 +33,6 @@
 ///   @Double()
 ///   double y;
 ///
-///   @Pointer()
 ///   Coord next;
 /// }
 ///
@@ -66,8 +60,8 @@
     ClassHierarchy hierarchy,
     List<Library> libraries,
     DiagnosticReporter diagnosticReporter) {
-  final LibraryIndex index = LibraryIndex(
-      component, const ["dart:ffi", "dart:_internal", "dart:core"]);
+  final LibraryIndex index =
+      LibraryIndex(component, const ["dart:ffi", "dart:core"]);
   if (!index.containsLibrary("dart:ffi")) {
     // If dart:ffi is not loaded, do not do the transformation.
     return ReplacedMembers({}, {});
@@ -82,27 +76,13 @@
 /// Checks and elaborates the dart:ffi structs and fields.
 class _FfiDefinitionTransformer extends FfiTransformer {
   final LibraryIndex index;
-  final Field _internalIs64Bit;
-  final Constructor _unimplementedErrorCtor;
-  static const String _errorOn32BitMessage =
-      "Code-gen for FFI structs is not supported on 32-bit platforms.";
 
   Map<Field, Procedure> replacedGetters = {};
   Map<Field, Procedure> replacedSetters = {};
 
   _FfiDefinitionTransformer(this.index, CoreTypes coreTypes,
       ClassHierarchy hierarchy, DiagnosticReporter diagnosticReporter)
-      : _internalIs64Bit = index.getTopLevelMember('dart:_internal', 'is64Bit'),
-        _unimplementedErrorCtor =
-            index.getMember('dart:core', 'UnimplementedError', ''),
-        super(index, coreTypes, hierarchy, diagnosticReporter) {}
-
-  Statement guardOn32Bit(Statement body) {
-    final Throw error = Throw(ConstructorInvocation(_unimplementedErrorCtor,
-        Arguments([StringLiteral(_errorOn32BitMessage)])));
-    return IfStatement(
-        StaticGet(_internalIs64Bit), body, ExpressionStatement(error));
-  }
+      : super(index, coreTypes, hierarchy, diagnosticReporter) {}
 
   @override
   visitClass(Class node) {
@@ -119,8 +99,8 @@
     final bool fieldsValid = _checkFieldAnnotations(node);
 
     if (fieldsValid) {
-      int size = _replaceFields(node);
-      _replaceSizeOfMethod(node, size);
+      final structSize = _replaceFields(node);
+      _replaceSizeOfMethod(node, structSize);
     }
 
     return node;
@@ -152,6 +132,13 @@
     }
   }
 
+  bool _isPointerType(Field field) {
+    return env.isSubtypeOf(
+        field.type,
+        InterfaceType(pointerClass,
+            [InterfaceType(nativeTypesClasses[NativeType.kNativeType.index])]));
+  }
+
   bool _checkFieldAnnotations(Class node) {
     bool success = true;
     for (Field f in node.fields) {
@@ -162,19 +149,27 @@
             f.name.name.length,
             f.fileUri);
       }
-      List<NativeType> annos = _getAnnotations(f).toList();
-      if (annos.length != 1) {
+      final nativeTypeAnnos = _getNativeTypeAnnotations(f).toList();
+      if (_isPointerType(f)) {
+        if (nativeTypeAnnos.length != 0) {
+          diagnosticReporter.report(
+              templateFfiFieldNoAnnotation.withArguments(f.name.name),
+              f.fileOffset,
+              f.name.name.length,
+              f.fileUri);
+        }
+      } else if (nativeTypeAnnos.length != 1) {
         diagnosticReporter.report(
             templateFfiFieldAnnotation.withArguments(f.name.name),
             f.fileOffset,
             f.name.name.length,
             f.fileUri);
       } else {
-        DartType dartType = f.type;
-        DartType nativeType =
-            InterfaceType(nativeTypesClasses[annos.first.index]);
+        final DartType dartType = f.type;
+        final DartType nativeType =
+            InterfaceType(nativeTypesClasses[nativeTypeAnnos.first.index]);
         // TODO(36730): Support structs inside structs.
-        DartType shouldBeDartType =
+        final DartType shouldBeDartType =
             convertNativeTypeToDartType(nativeType, /*allowStructs=*/ false);
         if (shouldBeDartType == null ||
             !env.isSubtypeOf(dartType, shouldBeDartType)) {
@@ -192,7 +187,7 @@
   }
 
   void _checkConstructors(Class node) {
-    List<Initializer> toRemove = [];
+    final toRemove = <Initializer>[];
 
     // Constructors cannot have initializers because initializers refer to
     // fields, and the fields were replaced with getter/setter pairs.
@@ -226,39 +221,62 @@
     node.addMember(ctor);
   }
 
-  /// Computes the field offsets in the struct and replaces the fields with
-  /// getters and setters using these offsets.
+  /// Computes the field offsets (for all ABIs) in the struct and replaces the
+  /// fields with getters and setters using these offsets.
   ///
-  /// Returns the total size of the struct.
-  int _replaceFields(Class node) {
-    List<Field> fields = [];
-    List<NativeType> types = [];
+  /// Returns the total size of the struct (for all ABIs).
+  Map<Abi, int> _replaceFields(Class node) {
+    final fields = <Field>[];
+    final types = <NativeType>[];
 
     for (Field f in node.fields) {
-      List<NativeType> annos = _getAnnotations(f).toList();
-      if (annos.length == 1) {
-        NativeType t = annos.first;
+      if (_isPointerType(f)) {
         fields.add(f);
-        types.add(t);
+        types.add(NativeType.kPointer);
+      } else {
+        final nativeTypeAnnos = _getNativeTypeAnnotations(f).toList();
+        if (nativeTypeAnnos.length == 1) {
+          NativeType t = nativeTypeAnnos.first;
+          fields.add(f);
+          types.add(t);
+        }
       }
     }
 
-    List<int> offsets = _calculateOffsets(types);
-    int size = _calculateSize(offsets, types);
+    final sizeAndOffsets = <Abi, SizeAndOffsets>{};
+    for (Abi abi in Abi.values) {
+      sizeAndOffsets[abi] = _calculateSizeAndOffsets(types, abi);
+    }
 
     for (int i = 0; i < fields.length; i++) {
-      List<Procedure> methods =
-          _generateMethodsForField(fields[i], types[i], offsets[i]);
-      for (Procedure p in methods) {
-        node.addMember(p);
-      }
+      final fieldOffsets = sizeAndOffsets
+          .map((Abi abi, SizeAndOffsets v) => MapEntry(abi, v.offsets[i]));
+      final methods =
+          _generateMethodsForField(fields[i], types[i], fieldOffsets);
+      methods.forEach((p) => node.addMember(p));
     }
 
     for (Field f in fields) {
       f.remove();
     }
 
-    return size;
+    return sizeAndOffsets.map((k, v) => MapEntry(k, v.size));
+  }
+
+  /// Expression that queries VM internals at runtime to figure out on which ABI
+  /// we are.
+  Expression _runtimeBranchOnLayout(Map<Abi, int> values) {
+    return MethodInvocation(
+        ConstantExpression(
+            ListConstant(InterfaceType(intClass), [
+              IntConstant(values[Abi.wordSize64]),
+              IntConstant(values[Abi.wordSize32Align32]),
+              IntConstant(values[Abi.wordSize32Align64])
+            ]),
+            InterfaceType(intClass)),
+        Name("[]"),
+        Arguments([StaticInvocation(abiMethod, Arguments([]))]),
+        listElementAt);
   }
 
   /// Sample output:
@@ -266,60 +284,58 @@
   /// double get x => _xPtr.load();
   /// set x(double v) => _xPtr.store(v);
   List<Procedure> _generateMethodsForField(
-      Field field, NativeType type, int offset) {
-    DartType nativeType = type == NativeType.kPointer
+      Field field, NativeType type, Map<Abi, int> offsets) {
+    final DartType nativeType = type == NativeType.kPointer
         ? field.type
         : InterfaceType(nativeTypesClasses[type.index]);
-    DartType pointerType = InterfaceType(pointerClass, [nativeType]);
-    Name pointerName = Name('#_ptr_${field.name.name}');
+    final DartType pointerType = InterfaceType(pointerClass, [nativeType]);
+    final Name pointerName = Name('#_ptr_${field.name.name}');
 
     // Sample output:
     // ffi.Pointer<ffi.Double> get _xPtr => addressOf.offsetBy(...).cast<ffi.Pointer<ffi.Double>>();
     Expression pointer =
         PropertyGet(ThisExpression(), addressOfField.name, addressOfField);
-    if (offset != 0) {
+    final hasNonZero = offsets.values.skipWhile((i) => i == 0).isNotEmpty;
+    if (hasNonZero) {
       pointer = MethodInvocation(pointer, offsetByMethod.name,
-          Arguments([IntLiteral(offset)]), offsetByMethod);
+          Arguments([_runtimeBranchOnLayout(offsets)]), offsetByMethod);
     }
-    Procedure pointerGetter = Procedure(
+    final Procedure pointerGetter = Procedure(
         pointerName,
         ProcedureKind.Getter,
         FunctionNode(
-            guardOn32Bit(ReturnStatement(MethodInvocation(
-                pointer,
-                castMethod.name,
-                Arguments([], types: [nativeType]),
-                castMethod))),
+            ReturnStatement(MethodInvocation(pointer, castMethod.name,
+                Arguments([], types: [nativeType]), castMethod)),
             returnType: pointerType));
 
     // Sample output:
     // double get x => _xPtr.load<double>();
-    Procedure getter = Procedure(
+    final Procedure getter = Procedure(
         field.name,
         ProcedureKind.Getter,
         FunctionNode(
-            guardOn32Bit(ReturnStatement(MethodInvocation(
+            ReturnStatement(MethodInvocation(
                 PropertyGet(ThisExpression(), pointerName, pointerGetter),
                 loadMethod.name,
                 Arguments([], types: [field.type]),
-                loadMethod))),
+                loadMethod)),
             returnType: field.type));
 
     // Sample output:
     // set x(double v) => _xPtr.store(v);
     Procedure setter = null;
     if (!field.isFinal) {
-      VariableDeclaration argument =
+      final VariableDeclaration argument =
           VariableDeclaration('#v', type: field.type);
       setter = Procedure(
           field.name,
           ProcedureKind.Setter,
           FunctionNode(
-              guardOn32Bit(ReturnStatement(MethodInvocation(
+              ReturnStatement(MethodInvocation(
                   PropertyGet(ThisExpression(), pointerName, pointerGetter),
                   storeMethod.name,
                   Arguments([VariableGet(argument)]),
-                  storeMethod))),
+                  storeMethod)),
               returnType: VoidType(),
               positionalParameters: [argument]));
     }
@@ -327,75 +343,74 @@
     replacedGetters[field] = getter;
     replacedSetters[field] = setter;
 
-    if (setter != null) {
-      return [pointerGetter, getter, setter];
-    } else {
-      return [pointerGetter, getter];
-    }
+    return [pointerGetter, getter, if (setter != null) setter];
   }
 
   /// Sample output:
   /// static int #sizeOf() => 24;
-  void _replaceSizeOfMethod(Class struct, int size) {
+  void _replaceSizeOfMethod(Class struct, Map<Abi, int> sizes) {
     final Field sizeOf = Field(Name("#sizeOf"),
-        isStatic: true, isFinal: true, initializer: IntLiteral(size));
+        isStatic: true,
+        isFinal: true,
+        initializer: _runtimeBranchOnLayout(sizes),
+        type: InterfaceType(intClass));
     _makeEntryPoint(sizeOf);
     struct.addMember(sizeOf);
   }
 
-  // TODO(dacoharkes): move to VM, take into account architecture
-  // https://github.com/dart-lang/sdk/issues/35768
-  int _sizeInBytes(NativeType t) {
-    int size = nativeTypeSizes[t.index];
+  int _sizeInBytes(NativeType type, Abi abi) {
+    final int size = nativeTypeSizes[type.index];
     if (size == WORD_SIZE) {
-      size = 8;
+      return wordSize[abi];
     }
     return size;
   }
 
-  int _align(int offset, int size) {
-    int remainder = offset % size;
+  int _alignmentOf(NativeType type, Abi abi) {
+    final int alignment = nonSizeAlignment[abi][type];
+    if (alignment != null) return alignment;
+    return _sizeInBytes(type, abi);
+  }
+
+  int _alignOffset(int offset, int alignment) {
+    final int remainder = offset % alignment;
     if (remainder != 0) {
       offset -= remainder;
-      offset += size;
+      offset += alignment;
     }
     return offset;
   }
 
-  // TODO(dacoharkes): move to VM, take into account architecture
-  // https://github.com/dart-lang/sdk/issues/35768
-  List<int> _calculateOffsets(List<NativeType> types) {
+  // TODO(37271): Support nested structs.
+  SizeAndOffsets _calculateSizeAndOffsets(List<NativeType> types, Abi abi) {
     int offset = 0;
-    List<int> offsets = [];
+    final offsets = <int>[];
     for (NativeType t in types) {
-      int size = _sizeInBytes(t);
-      offset = _align(offset, size);
+      final int size = _sizeInBytes(t, abi);
+      final int alignment = _alignmentOf(t, abi);
+      offset = _alignOffset(offset, alignment);
       offsets.add(offset);
       offset += size;
     }
-    return offsets;
-  }
-
-  // TODO(dacoharkes): move to VM, take into account architecture
-  // https://github.com/dart-lang/sdk/issues/35768
-  int _calculateSize(List<int> offsets, List<NativeType> types) {
-    if (offsets.isEmpty) {
-      return 0;
-    }
-    int largestElement = types.map((e) => _sizeInBytes(e)).reduce(math.max);
-    int highestOffsetIndex = types.length - 1;
-    int highestOffset = offsets[highestOffsetIndex];
-    int highestOffsetSize = _sizeInBytes(types[highestOffsetIndex]);
-    return _align(highestOffset + highestOffsetSize, largestElement);
+    final int minimumAlignment = 1;
+    final sizeAlignment = types
+        .map((t) => _alignmentOf(t, abi))
+        .followedBy([minimumAlignment]).reduce(math.max);
+    final int size = _alignOffset(offset, sizeAlignment);
+    return SizeAndOffsets(size, offsets);
   }
 
   void _makeEntryPoint(Annotatable node) {
-    node.addAnnotation(ConstructorInvocation(
-        pragmaConstructor, Arguments([StringLiteral("vm:entry-point")])));
+    node.addAnnotation(ConstantExpression(
+        InstanceConstant(pragmaClass.reference, [], {
+          pragmaName.reference: StringConstant("vm:entry-point"),
+          pragmaOptions.reference: NullConstant()
+        }),
+        InterfaceType(pragmaClass, [])));
   }
 
   NativeType _getFieldType(Class c) {
-    NativeType fieldType = getType(c);
+    final fieldType = getType(c);
 
     if (fieldType == NativeType.kVoid) {
       // Fields cannot have Void types.
@@ -404,13 +419,13 @@
     return fieldType;
   }
 
-  Iterable<NativeType> _getAnnotations(Field node) {
-    Iterable<NativeType> preConstant2018 = node.annotations
+  Iterable<NativeType> _getNativeTypeAnnotations(Field node) {
+    final Iterable<NativeType> preConstant2018 = node.annotations
         .whereType<ConstructorInvocation>()
         .map((expr) => expr.target.parent)
         .map((klass) => _getFieldType(klass))
         .where((type) => type != null);
-    Iterable<NativeType> postConstant2018 = node.annotations
+    final Iterable<NativeType> postConstant2018 = node.annotations
         .whereType<ConstantExpression>()
         .map((expr) => expr.constant)
         .whereType<InstanceConstant>()
@@ -421,3 +436,13 @@
     return postConstant2018.followedBy(preConstant2018);
   }
 }
+
+class SizeAndOffsets {
+  /// Size of the entire struct.
+  final int size;
+
+  /// Offset in bytes for each field, indexed by field number.
+  final List<int> offsets;
+
+  SizeAndOffsets(this.size, this.offsets);
+}
diff --git a/pkg/vm/lib/transformations/pragma.dart b/pkg/vm/lib/transformations/pragma.dart
index ff3431b..0fa7432 100644
--- a/pkg/vm/lib/transformations/pragma.dart
+++ b/pkg/vm/lib/transformations/pragma.dart
@@ -50,10 +50,14 @@
     if (annotation is ConstantExpression) {
       Constant constant = annotation.constant;
       if (constant is InstanceConstant) {
-        if (constant.classReference.node == coreTypes.pragmaClass) {
+        if (constant.classNode == coreTypes.pragmaClass) {
           pragmaConstant = constant;
         }
+      } else if (constant is UnevaluatedConstant) {
+        throw 'Error: unevaluated constant $constant';
       }
+    } else {
+      throw 'Error: non-constant annotation $annotation';
     }
     if (pragmaConstant == null) return null;
 
diff --git a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
index 1aa352e..c8c3e4f 100644
--- a/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
+++ b/pkg/vm/lib/transformations/protobuf_aware_treeshaker/transformer.dart
@@ -21,7 +21,7 @@
 
 TransformationInfo transformComponent(
     Component component, Map<String, String> environment, Target target,
-    {@required bool collectInfo, @required bool enableAsserts}) {
+    {@required bool collectInfo}) {
   final coreTypes = new CoreTypes(component);
   component.computeCanonicalNames();
 
@@ -31,7 +31,6 @@
   constants.transformComponent(component, vmConstants, environment, null,
       keepFields: true,
       evaluateAnnotations: true,
-      enableAsserts: enableAsserts,
       desugarSets: !target.supportsSetLiterals);
 
   TransformationInfo info = collectInfo ? TransformationInfo() : null;
diff --git a/pkg/vm/lib/transformations/type_flow/analysis.dart b/pkg/vm/lib/transformations/type_flow/analysis.dart
index f403b43..9b322a9 100644
--- a/pkg/vm/lib/transformations/type_flow/analysis.dart
+++ b/pkg/vm/lib/transformations/type_flow/analysis.dart
@@ -98,9 +98,14 @@
   /// its result is saturated in order to guarantee convergence.
   static const int invalidationLimit = 1000;
 
+  _Invocation(this.selector, this.args);
+
   Type process(TypeFlowAnalysis typeFlowAnalysis);
 
-  _Invocation(this.selector, this.args);
+  /// Returns result of this invocation if its available without
+  /// further analysis, or `null` if it's not available.
+  /// Used for recursive calls while this invocation is being processed.
+  Type get resultForRecursiveInvocation => result;
 
   // Only take selector and args into account as _Invocation objects
   // are cached in _InvocationsCache using selector and args as a key.
@@ -232,9 +237,17 @@
     final Member member = selector.member;
     if (selector.memberAgreesToCallKind(member)) {
       if (_argumentsValid()) {
-        return typeFlowAnalysis
-            .getSummary(member)
-            .apply(args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
+        final summary = typeFlowAnalysis.getSummary(member);
+        // If result type is known upfront (doesn't depend on the flow),
+        // set it eagerly so recursive invocations are able to use it.
+        final summaryResult = summary.result;
+        if (summaryResult is Type &&
+            !typeFlowAnalysis.workList._isPending(this)) {
+          assertx(result == null || result == summaryResult);
+          result = summaryResult;
+        }
+        return summary.apply(
+            args, typeFlowAnalysis.hierarchyCache, typeFlowAnalysis);
       } else {
         assertx(selector.callKind == CallKind.Method);
         return _processNoSuchMethod(args.receiver, typeFlowAnalysis);
@@ -301,6 +314,7 @@
   bool _isPolymorphic = false;
   Set<Call> _callSites; // Populated only if not polymorphic.
   Member _monomorphicTarget;
+  _DirectInvocation _monomorphicDirectInvocation;
 
   @override
   set typeChecksNeeded(bool value) {
@@ -368,6 +382,11 @@
           final directInvocation = typeFlowAnalysis._invocationsCache
               .getInvocation(directSelector, directArgs);
 
+          if (!_isPolymorphic) {
+            assertx(target == _monomorphicTarget);
+            _monomorphicDirectInvocation = directInvocation;
+          }
+
           type = typeFlowAnalysis.workList.processInvocation(directInvocation);
           if (kPrintTrace) {
             tracePrint('Dispatch: $directInvocation, result: $type');
@@ -561,10 +580,6 @@
   }
 
   void addCallSite(Call callSite) {
-    if (selector is DirectSelector) {
-      return;
-    }
-
     _notifyCallSite(callSite);
     if (!callSite.isPolymorphic) {
       (_callSites ??= new Set<Call>()).add(callSite);
@@ -574,8 +589,6 @@
   /// Notify call site about changes in polymorphism or checkedness of this
   /// invocation.
   void _notifyCallSite(Call callSite) {
-    assert(selector is! DirectSelector);
-
     if (_isPolymorphic) {
       callSite.setPolymorphic();
     } else {
@@ -596,6 +609,17 @@
       _callSites.forEach(_notifyCallSite);
     }
   }
+
+  @override
+  Type get resultForRecursiveInvocation {
+    if (result != null) {
+      return result;
+    }
+    if (_monomorphicDirectInvocation != null) {
+      return _monomorphicDirectInvocation.resultForRecursiveInvocation;
+    }
+    return null;
+  }
 }
 
 /// Efficient builder of receiver type.
@@ -1313,7 +1337,16 @@
       }
       return result;
     } else {
-      // Recursive invocation, approximate with static type.
+      // Recursive invocation.
+      final result = invocation.resultForRecursiveInvocation;
+      if (result != null) {
+        if (kPrintTrace) {
+          tracePrint("Already known type for recursive invocation: $result");
+          tracePrint('END PROCESSING $invocation, RESULT $result');
+        }
+        return result;
+      }
+      // Fall back to static type.
       Statistics.recursiveInvocationsApproximated++;
       final staticType =
           new Type.fromStatic(invocation.selector.staticReturnType);
diff --git a/pkg/vm/lib/transformations/type_flow/summary_collector.dart b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
index 724a2e3..d6f8fb3 100644
--- a/pkg/vm/lib/transformations/type_flow/summary_collector.dart
+++ b/pkg/vm/lib/transformations/type_flow/summary_collector.dart
@@ -96,6 +96,20 @@
             return const EmptyType();
           } else if (n == 1) {
             return st.values.single;
+          } else {
+            final first = st.values.first;
+            if (first is Type) {
+              bool allMatch = true;
+              for (int i = 1; i < n; ++i) {
+                if (first != st.values[i]) {
+                  allMatch = false;
+                  break;
+                }
+              }
+              if (allMatch) {
+                return first;
+              }
+            }
           }
         }
 
@@ -455,7 +469,16 @@
       if (function.body == null) {
         Type type = _nativeCodeOracle.handleNativeProcedure(
             member, _entryPointsListener);
-        _returnValue.values.add(type);
+        if (type is! ConcreteType) {
+          // Runtime type could be more precise than static type, so
+          // calculate intersection.
+          final runtimeType = _translator.translate(function.returnType);
+          final typeCheck = new TypeCheck(type, runtimeType, function, type);
+          _summary.add(typeCheck);
+          _returnValue.values.add(typeCheck);
+        } else {
+          _returnValue.values.add(type);
+        }
       } else {
         _visit(function.body);
 
diff --git a/pkg/vm/test/common_test_utils.dart b/pkg/vm/test/common_test_utils.dart
index 755524b..da4e6d8 100644
--- a/pkg/vm/test/common_test_utils.dart
+++ b/pkg/vm/test/common_test_utils.dart
@@ -41,11 +41,13 @@
   final options = new CompilerOptions()
     ..target = target
     ..linkedDependencies = <Uri>[platformKernel]
+    ..environmentDefines = <String, String>{}
     ..onDiagnostic = (DiagnosticMessage message) {
       fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
     };
 
-  final Component component = await kernelForProgram(sourceUri, options);
+  final Component component =
+      (await kernelForProgram(sourceUri, options)).component;
 
   // Make sure the library name is the same and does not depend on the order
   // of test cases.
diff --git a/pkg/vm/test/incremental_compiler_test.dart b/pkg/vm/test/incremental_compiler_test.dart
index b223aaf..e699954 100644
--- a/pkg/vm/test/incremental_compiler_test.dart
+++ b/pkg/vm/test/incremental_compiler_test.dart
@@ -33,7 +33,8 @@
     ..linkedDependencies = <Uri>[platformKernel]
     ..onDiagnostic = (DiagnosticMessage message) {
       fail("Compilation error: ${message.plainTextFormatted.join('\n')}");
-    };
+    }
+    ..environmentDefines = const {};
 
   group('basic', () {
     Directory mytest;
@@ -74,7 +75,8 @@
         ..target = options.target
         ..linkedDependencies = options.linkedDependencies
         ..onDiagnostic = options.onDiagnostic
-        ..embedSourceText = false;
+        ..embedSourceText = false
+        ..environmentDefines = options.environmentDefines;
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsExcludeSources, main.uri);
       Component component = await compiler.compile();
@@ -103,7 +105,8 @@
         ..onDiagnostic = (DiagnosticMessage message) {
           errorsReported++;
           message.plainTextFormatted.forEach(print);
-        };
+        }
+        ..environmentDefines = options.environmentDefines;
       IncrementalCompiler compiler =
           new IncrementalCompiler(optionsAcceptErrors, main.uri);
       await compiler.compile();
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 ec3e99d..7734f54 100644
--- a/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
+++ b/pkg/vm/test/transformations/protobuf_aware_treeshaker/treeshaker_test.dart
@@ -32,7 +32,7 @@
       .toList();
 
   treeshaker.transformComponent(component, {}, TestingVmTarget(TargetFlags()),
-      collectInfo: true, enableAsserts: false);
+      collectInfo: true);
 
   for (Class messageClass in messageClasses) {
     expect(messageClass.enclosingLibrary.classes.contains(messageClass),
diff --git a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
index 022c7e1..a58eb82 100644
--- a/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
+++ b/pkg/vm/test/transformations/type_flow/summary_collector_test.dart
@@ -4,15 +4,19 @@
 
 import 'dart:io';
 
+import 'package:front_end/src/api_unstable/vm.dart'
+    show defaultExperimentalFlags, ExperimentalFlag;
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/type_environment.dart';
 import 'package:test/test.dart';
+import 'package:vm/transformations/pragma.dart'
+    show ConstantPragmaAnnotationParser;
 import 'package:vm/transformations/type_flow/native_code.dart';
 import 'package:vm/transformations/type_flow/summary_collector.dart';
 import 'package:vm/transformations/type_flow/analysis.dart';
-import 'annotation_matcher.dart';
+import 'annotation_matcher.dart' show ExpressionPragmaAnnotationParser;
 import 'package:kernel/target/targets.dart';
 
 import '../../common_test_utils.dart';
@@ -31,7 +35,10 @@
             hierarchy,
             new EmptyEntryPointsListener(),
             new NativeCodeOracle(
-                null, new ExpressionPragmaAnnotationParser(coreTypes)),
+                null,
+                defaultExperimentalFlags[ExperimentalFlag.constantUpdate2018]
+                    ? new ConstantPragmaAnnotationParser(coreTypes)
+                    : new ExpressionPragmaAnnotationParser(coreTypes)),
             new GenericInterfacesInfoImpl(hierarchy));
 
   String print(TreeNode node) {
diff --git a/pkg/vm/test/transformations/type_flow/transformer_test.dart b/pkg/vm/test/transformations/type_flow/transformer_test.dart
index d031f10..ae4764a 100644
--- a/pkg/vm/test/transformations/type_flow/transformer_test.dart
+++ b/pkg/vm/test/transformations/type_flow/transformer_test.dart
@@ -4,11 +4,15 @@
 
 import 'dart:io';
 
+import 'package:front_end/src/api_unstable/vm.dart'
+    show defaultExperimentalFlags, ExperimentalFlag;
 import 'package:kernel/target/targets.dart';
 import 'package:kernel/ast.dart';
 import 'package:kernel/core_types.dart';
 import 'package:kernel/kernel.dart';
 import 'package:test/test.dart';
+import 'package:vm/transformations/pragma.dart'
+    show ConstantPragmaAnnotationParser;
 import 'package:vm/transformations/type_flow/transformer.dart'
     show transformComponent;
 import 'annotation_matcher.dart';
@@ -24,8 +28,13 @@
 
   final coreTypes = new CoreTypes(component);
 
-  component = transformComponent(target, coreTypes, component,
-      new ExpressionPragmaAnnotationParser(coreTypes));
+  component = transformComponent(
+      target,
+      coreTypes,
+      component,
+      defaultExperimentalFlags[ExperimentalFlag.constantUpdate2018]
+          ? new ConstantPragmaAnnotationParser(coreTypes)
+          : new ExpressionPragmaAnnotationParser(coreTypes));
 
   final actual = kernelLibraryToString(component.mainMethod.enclosingLibrary);
 
diff --git a/pkg/vm/testcases/bytecode/asserts.dart.expect b/pkg/vm/testcases/bytecode/asserts.dart.expect
index e1323cb..d8c3913 100644
--- a/pkg/vm/testcases/bytecode/asserts.dart.expect
+++ b/pkg/vm/testcases/bytecode/asserts.dart.expect
@@ -41,18 +41,22 @@
     return-type void
 
 Bytecode {
-  Entry                0
+  Entry                1
   CheckStack           0
   JumpIfNoAsserts      L1
   Push                 FP[-6]
-  DynamicCall          CP#1, 1
+  StoreLocal           r0
+  Push                 r0
+  UncheckedClosureCall CP#0, 1
   AssertBoolean        0
   JumpIfTrue           L1
   PushInt              0
   PushInt              0
   Push                 FP[-5]
-  DynamicCall          CP#2, 1
-  DirectCall           CP#3, 3
+  StoreLocal           r0
+  Push                 r0
+  UncheckedClosureCall CP#0, 1
+  DirectCall           CP#1, 3
   Drop1
 L1:
   PushNull
@@ -60,10 +64,8 @@
 }
 ConstantPool {
   [0] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [1] = ICData dynamic target-name 'call', arg-desc CP#0
-  [2] = ICData dynamic target-name 'call', arg-desc CP#0
-  [3] = DirectCall 'dart:core::_AssertionError::_throwNew', ArgDesc num-args 3, num-type-args 0, names []
-  [4] = Reserved
+  [1] = DirectCall 'dart:core::_AssertionError::_throwNew', ArgDesc num-args 3, num-type-args 0, names []
+  [2] = Reserved
 }
 
 
@@ -84,11 +86,11 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  static method test1(dart.core::bool condition) → void {
+  static method test1(dart.core::bool* condition) → void {
     assert(condition);
   }
-  static method test2(() → dart.core::bool condition, () → dart.core::String message) → void {
-    assert([@vm.call-site-attributes.metadata=receiverType:() → dart.core::bool] condition.call(), [@vm.call-site-attributes.metadata=receiverType:() → dart.core::String] message.call());
+  static method test2(() →* dart.core::bool* condition, () →* dart.core::String* message) → void {
+    assert([@vm.call-site-attributes.metadata=receiverType:() →* dart.core::bool*] condition.call(), [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::String*] message.call());
   }
   static method main() → dynamic {}
 }
diff --git a/pkg/vm/testcases/bytecode/async.dart.expect b/pkg/vm/testcases/bytecode/async.dart.expect
index e142924..28dae68 100644
--- a/pkg/vm/testcases/bytecode/async.dart.expect
+++ b/pkg/vm/testcases/bytecode/async.dart.expect
@@ -87,6 +87,7 @@
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0, 0
+  JumpIfUnchecked      L1
   Push                 FP[-5]
   PushConstant         CP#3
   PushNull
@@ -94,6 +95,7 @@
   PushConstant         CP#4
   AssertAssignable     0, CP#5
   Drop1
+L1:
   Push                 r0
   PushConstant         CP#7
   PushConstant         CP#6
@@ -2205,9 +2207,9 @@
 
   import "dart:async";
 
-  static field (dart.async::Future<dart.core::int>) → dart.async::Future<dart.core::Null> asyncInFieldInitializer = (dart.async::Future<dart.core::int> x) → dart.async::Future<dart.core::Null> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::Null> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::Null>();
-    dart.async::FutureOr<dart.core::Null> :return_value;
+  static field (dart.async::Future<dart.core::int*>*) →* dart.async::Future<dart.core::Null*>* asyncInFieldInitializer = (dart.async::Future<dart.core::int*>* x) → dart.async::Future<dart.core::Null*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::Null*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::Null*>();
+    dart.async::FutureOr<dart.core::Null*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -2233,9 +2235,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{dart.async::Completer::future};
   };
-  static method foo() → dart.async::Future<dart.core::int> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-    dart.async::FutureOr<dart.core::int> :return_value;
+  static method foo() → dart.async::Future<dart.core::int*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+    dart.async::FutureOr<dart.core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -2260,9 +2262,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{dart.async::Completer::future};
   }
-  static method simpleAsyncAwait(dart.async::Future<dart.core::int> a, dart.async::Future<dart.core::int> b) → dart.async::Future<dart.core::int> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-    dart.async::FutureOr<dart.core::int> :return_value;
+  static method simpleAsyncAwait(dart.async::Future<dart.core::int*>* a, dart.async::Future<dart.core::int*>* b) → dart.async::Future<dart.core::int*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+    dart.async::FutureOr<dart.core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -2292,9 +2294,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{dart.async::Completer::future};
   }
-  static method loops(dart.core::List<dart.core::int> list) → dart.async::Future<dart.core::int> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-    dart.async::FutureOr<dart.core::int> :return_value;
+  static method loops(dart.core::List<dart.core::int*>* list) → dart.async::Future<dart.core::int*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+    dart.async::FutureOr<dart.core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -2307,16 +2309,16 @@
       try {
         #L4:
         {
-          dart.core::int sum = 0;
-          for (dart.core::int i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-            for (dart.core::int j in list) {
+          dart.core::int* sum = 0;
+          for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
+            for (dart.core::int* j in list) {
               :async_temporary_1 = sum;
               :async_temporary_0 = i.{dart.core::num::+}(j);
               [yield] let dynamic #t4 = dart.async::_awaitHelper(#lib::foo(), :async_op_then, :async_op_error, :async_op) in null;
               sum = :async_temporary_1.{dart.core::num::+}(:async_temporary_0.{dart.core::num::+}(:result));
             }
           }
-          for (dart.core::int k = 0; k.{dart.core::num::<}(10); k = k.{dart.core::num::+}(1)) {
+          for (dart.core::int* k = 0; k.{dart.core::num::<}(10); k = k.{dart.core::num::+}(1)) {
             sum = sum.{dart.core::num::+}(k);
           }
           :return_value = sum;
@@ -2334,9 +2336,9 @@
     :async_completer.start(:async_op);
     return :async_completer.{dart.async::Completer::future};
   }
-  static method tryCatchRethrow(dart.async::Future<dart.core::int> a, dart.async::Future<dart.core::int> b, dart.async::Future<dart.core::int> c) → dart.async::Future<dart.core::int> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-    dart.async::FutureOr<dart.core::int> :return_value;
+  static method tryCatchRethrow(dart.async::Future<dart.core::int*>* a, dart.async::Future<dart.core::int*>* b, dart.async::Future<dart.core::int*>* c) → dart.async::Future<dart.core::int*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+    dart.async::FutureOr<dart.core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
@@ -2354,7 +2356,7 @@
       try {
         #L5:
         {
-          dart.core::int x = 1;
+          dart.core::int* x = 1;
           try
             try {
               :async_temporary_0 = x;
@@ -2362,7 +2364,7 @@
               x = :async_temporary_0.{dart.core::num::+}(:result);
             }
             on dynamic catch(final dynamic e) {
-              if(e is dart.core::Error) {
+              if(e is dart.core::Error*) {
                 :return_value = 42;
                 break #L5;
               }
@@ -2392,11 +2394,11 @@
     :async_completer.start(:async_op);
     return :async_completer.{dart.async::Completer::future};
   }
-  static method closure(dart.async::Future<dart.core::int> a) → dynamic {
-    dart.core::int x = 3;
-    function nested() → dart.async::Future<dart.core::int> /* originally async */ {
-      final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-      dart.async::FutureOr<dart.core::int> :return_value;
+  static method closure(dart.async::Future<dart.core::int*>* a) → dynamic {
+    dart.core::int* x = 3;
+    function nested() → dart.async::Future<dart.core::int*>* /* originally async */ {
+      final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+      dart.async::FutureOr<dart.core::int*>* :return_value;
       dynamic :async_stack_trace;
       dynamic :async_op_then;
       dynamic :async_op_error;
@@ -2408,7 +2410,7 @@
         try {
           #L6:
           {
-            dart.core::int y = 4;
+            dart.core::int* y = 4;
             try {
               x = 5;
               [yield] let dynamic #t8 = dart.async::_awaitHelper(a, :async_op_then, :async_op_error, :async_op) in null;
@@ -2434,9 +2436,9 @@
     }
     return nested;
   }
-  static method testAssert(dart.async::Future<dart.core::int> a) → dart.async::Future<dart.core::int> /* originally async */ {
-    final dart.async::_AsyncAwaitCompleter<dart.core::int> :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int>();
-    dart.async::FutureOr<dart.core::int> :return_value;
+  static method testAssert(dart.async::Future<dart.core::int*>* a) → dart.async::Future<dart.core::int*>* /* originally async */ {
+    final dart.async::_AsyncAwaitCompleter<dart.core::int*>* :async_completer = new dart.async::_AsyncAwaitCompleter::•<dart.core::int*>();
+    dart.async::FutureOr<dart.core::int*>* :return_value;
     dynamic :async_stack_trace;
     dynamic :async_op_then;
     dynamic :async_op_error;
diff --git a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
index bfa9314..1fcf912 100644
--- a/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
+++ b/pkg/vm/testcases/bytecode/bootstrapping.dart.expect
@@ -686,46 +686,46 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  typedef _ScheduleImmediateClosure = (() → void) → void;
+  typedef _ScheduleImmediateClosure = (() →* void) →* void;
   class _ScheduleImmediate extends dart.core::Object {
-    static field (() → void) → void _closure = null;
-    synthetic constructor •() → #lib::_ScheduleImmediate
+    static field (() →* void) →* void _closure = null;
+    synthetic constructor •() → #lib::_ScheduleImmediate*
       : super dart.core::Object::•()
       ;
   }
   class _NamespaceImpl extends dart.core::Object implements #lib::_Namespace {
-    static field #lib::_NamespaceImpl _cachedNamespace = null;
-    constructor _() → #lib::_NamespaceImpl
+    static field #lib::_NamespaceImpl* _cachedNamespace = null;
+    constructor _() → #lib::_NamespaceImpl*
       : super dart.core::Object::•()
       ;
-    @dart._internal::ExternalName::•("Namespace_Create")
-    external static method _create(#lib::_NamespaceImpl namespace, dynamic n) → #lib::_NamespaceImpl;
-    @dart._internal::ExternalName::•("Namespace_GetPointer")
-    external static method _getPointer(#lib::_NamespaceImpl namespace) → dart.core::int;
-    @dart._internal::ExternalName::•("Namespace_GetDefault")
-    external static method _getDefault() → dart.core::int;
+    @#C2
+    external static method _create(#lib::_NamespaceImpl* namespace, dynamic n) → #lib::_NamespaceImpl*;
+    @#C4
+    external static method _getPointer(#lib::_NamespaceImpl* namespace) → dart.core::int*;
+    @#C6
+    external static method _getDefault() → dart.core::int*;
     static method _setupNamespace(dynamic namespace) → void {
       #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), namespace);
     }
-    static get _namespace() → #lib::_NamespaceImpl {
+    static get _namespace() → #lib::_NamespaceImpl* {
       if(#lib::_NamespaceImpl::_cachedNamespace.{dart.core::Object::==}(null)) {
         #lib::_NamespaceImpl::_cachedNamespace = #lib::_NamespaceImpl::_create(new #lib::_NamespaceImpl::_(), #lib::_NamespaceImpl::_getDefault());
       }
       return #lib::_NamespaceImpl::_cachedNamespace;
     }
-    static get _namespacePointer() → dart.core::int
+    static get _namespacePointer() → dart.core::int*
       return #lib::_NamespaceImpl::_getPointer(#lib::_NamespaceImpl::_namespace);
   }
   class _Namespace extends dart.core::Object {
-    synthetic constructor •() → #lib::_Namespace
+    synthetic constructor •() → #lib::_Namespace*
       : super dart.core::Object::•()
       ;
     static method _setupNamespace(dynamic namespace) → void {
       #lib::_NamespaceImpl::_setupNamespace(namespace);
     }
-    static get _namespace() → #lib::_Namespace
+    static get _namespace() → #lib::_Namespace*
       return #lib::_NamespaceImpl::_namespace;
-    static get _namespacePointer() → dart.core::int
+    static get _namespacePointer() → dart.core::int*
       return #lib::_NamespaceImpl::_namespacePointer;
   }
   class VMLibraryHooks extends dart.core::Object {
@@ -740,7 +740,7 @@
     static field dynamic resolvePackageUriFuture = null;
     static field dynamic _computeScriptUri = null;
     static field dynamic _cachedScript = null;
-    synthetic constructor •() → #lib::VMLibraryHooks
+    synthetic constructor •() → #lib::VMLibraryHooks*
       : super dart.core::Object::•()
       ;
     static set platformScript(dynamic f) → void {
@@ -755,38 +755,38 @@
     }
   }
   class Stdin extends dart.core::Object {
-    synthetic constructor •() → #lib::Stdin
+    synthetic constructor •() → #lib::Stdin*
       : super dart.core::Object::•()
       ;
   }
   class _StdIOUtils extends dart.core::Object {
-    synthetic constructor •() → #lib::_StdIOUtils
+    synthetic constructor •() → #lib::_StdIOUtils*
       : super dart.core::Object::•()
       ;
-    static method _getStdioInputStream(dart.core::int fd) → #lib::Stdin
+    static method _getStdioInputStream(dart.core::int* fd) → #lib::Stdin*
       return null;
   }
-  static field dart.core::int _stdinFD = 0;
-  static field dart.core::int _stdoutFD = 1;
-  static field dart.core::int _stderrFD = 2;
-  static field dart.core::String _rawScript;
-  static field #lib::Stdin _stdin;
-  @dart._internal::ExternalName::•("Builtin_PrintString")
-  external static method _printString(dart.core::String s) → void;
+  static field dart.core::int* _stdinFD = 0;
+  static field dart.core::int* _stdoutFD = 1;
+  static field dart.core::int* _stderrFD = 2;
+  static field dart.core::String* _rawScript;
+  static field #lib::Stdin* _stdin;
+  @#C8
+  external static method _printString(dart.core::String* s) → void;
   static method _print(dynamic arg) → void {
     #lib::_printString(arg.{dart.core::Object::toString}());
   }
   static method _getPrintClosure() → dynamic
-    return #lib::_print;
-  static method _setScheduleImmediateClosure((() → void) → void closure) → void {
+    return #C9;
+  static method _setScheduleImmediateClosure((() →* void) →* void closure) → void {
     #lib::_ScheduleImmediate::_closure = closure;
   }
-  static method _setStdioFDs(dart.core::int stdin, dart.core::int stdout, dart.core::int stderr) → void {
+  static method _setStdioFDs(dart.core::int* stdin, dart.core::int* stdout, dart.core::int* stderr) → void {
     #lib::_stdinFD = stdin;
     #lib::_stdoutFD = stdout;
     #lib::_stderrFD = stderr;
   }
-  static method _scriptUri() → dart.core::Uri {
+  static method _scriptUri() → dart.core::Uri* {
     if(#lib::_rawScript.{dart.core::String::startsWith}("http:") || #lib::_rawScript.{dart.core::String::startsWith}("https:") || #lib::_rawScript.{dart.core::String::startsWith}("file:")) {
       return dart.core::Uri::parse(#lib::_rawScript);
     }
@@ -795,11 +795,23 @@
     }
   }
   static method _setupHooks() → dynamic {
-    #lib::VMLibraryHooks::platformScript = #lib::_scriptUri;
+    #lib::VMLibraryHooks::platformScript = #C10;
   }
-  static get stdin() → #lib::Stdin {
-    #lib::_stdin.{dart.core::Object::==}(null) ?{#lib::Stdin} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
+  static get stdin() → #lib::Stdin* {
+    #lib::_stdin.{dart.core::Object::==}(null) ?{#lib::Stdin*} #lib::_stdin = #lib::_StdIOUtils::_getStdioInputStream(#lib::_stdinFD) : null;
     return #lib::_stdin;
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = "Namespace_Create"
+  #C2 = dart._internal::ExternalName {name:#C1}
+  #C3 = "Namespace_GetPointer"
+  #C4 = dart._internal::ExternalName {name:#C3}
+  #C5 = "Namespace_GetDefault"
+  #C6 = dart._internal::ExternalName {name:#C5}
+  #C7 = "Builtin_PrintString"
+  #C8 = dart._internal::ExternalName {name:#C7}
+  #C9 = tearoff #lib::_print
+  #C10 = tearoff #lib::_scriptUri
+}
diff --git a/pkg/vm/testcases/bytecode/closures.dart.expect b/pkg/vm/testcases/bytecode/closures.dart.expect
index 2932382..8da319e 100644
--- a/pkg/vm/testcases/bytecode/closures.dart.expect
+++ b/pkg/vm/testcases/bytecode/closures.dart.expect
@@ -41,8 +41,10 @@
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
+  StoreLocal           r3
   PushInt              3
-  DynamicCall          CP#17, 2
+  Push                 r3
+  UncheckedClosureCall CP#16, 2
   Drop1
   Push                 r0
   LoadContextVar       0, 0
@@ -66,7 +68,6 @@
   [14] = InstanceField dart:core::_Closure::_function (field)
   [15] = Reserved
   [16] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
-  [17] = ICData dynamic target-name 'call', arg-desc CP#16
 }
 Closure #lib::simpleClosure::'<anonymous closure>' (dart:core::int y) -> dart:core::Null
 ClosureCode {
@@ -75,6 +76,7 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#1
   PopLocal             r0
+  JumpIfUnchecked      L1
   Push                 FP[-5]
   PushConstant         CP#3
   PushNull
@@ -82,6 +84,7 @@
   PushConstant         CP#4
   AssertAssignable     1, CP#5
   Drop1
+L1:
   Push                 r0
   Push                 r0
   LoadContextVar       0, 0
@@ -336,6 +339,7 @@
   PushInt              1
   DirectCall           CP#8, 4
   PopLocal             r0
+  JumpIfUnchecked      L3
   Push                 FP[-5]
   PushConstant         CP#10
   PushNull
@@ -343,6 +347,7 @@
   PushConstant         CP#11
   AssertAssignable     0, CP#12
   Drop1
+L3:
   PushNull
   ReturnTOS
 }
@@ -594,13 +599,17 @@
   Push                 r1
   StoreFieldTOS        CP#1
   PopLocal             r3
-  PushConstant         CP#43
+  PushConstant         CP#40
   Push                 r3
-  DynamicCall          CP#44, 2
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#37, 2
   Drop1
-  PushConstant         CP#45
+  PushConstant         CP#41
   Push                 r3
-  DynamicCall          CP#46, 2
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#37, 2
   Drop1
   PushNull
   ReturnTOS
@@ -641,18 +650,13 @@
   [32] = InstanceField dart:core::_Closure::_function (field)
   [33] = Reserved
   [34] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [35] = ICData dynamic target-name 'call', arg-desc CP#34
-  [36] = EndClosureFunctionScope
-  [37] = ObjectRef < #lib::C7, #lib::C8 >
-  [38] = ObjectRef ArgDesc num-args 1, num-type-args 2, names []
-  [39] = ICData dynamic target-name 'call', arg-desc CP#38
-  [40] = ObjectRef < dart:core::List < #lib::C7 >, dart:core::List < #lib::C8 > >
-  [41] = ICData dynamic target-name 'call', arg-desc CP#38
-  [42] = EndClosureFunctionScope
-  [43] = ObjectRef < #lib::C5, #lib::C6 >
-  [44] = ICData dynamic target-name 'call', arg-desc CP#38
-  [45] = ObjectRef < dart:core::List < #lib::C5 >, dart:core::List < #lib::C6 > >
-  [46] = ICData dynamic target-name 'call', arg-desc CP#38
+  [35] = EndClosureFunctionScope
+  [36] = ObjectRef < #lib::C7, #lib::C8 >
+  [37] = ObjectRef ArgDesc num-args 1, num-type-args 2, names []
+  [38] = ObjectRef < dart:core::List < #lib::C7 >, dart:core::List < #lib::C8 > >
+  [39] = EndClosureFunctionScope
+  [40] = ObjectRef < #lib::C5, #lib::C6 >
+  [41] = ObjectRef < dart:core::List < #lib::C5 >, dart:core::List < #lib::C6 > >
 }
 Closure #lib::A::foo::'nested1' <dart:core::Object T5, dart:core::Object T6> () -> void
 ClosureCode {
@@ -698,13 +702,17 @@
   Push                 r1
   StoreFieldTOS        CP#1
   PopLocal             r3
-  PushConstant         CP#37
+  PushConstant         CP#36
   Push                 r3
-  DynamicCall          CP#39, 2
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#37, 2
   Drop1
-  PushConstant         CP#40
+  PushConstant         CP#38
   Push                 r3
-  DynamicCall          CP#41, 2
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#37, 2
   Drop1
   PushNull
   ReturnTOS
@@ -755,7 +763,9 @@
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
-  DynamicCall          CP#35, 1
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#34, 1
   Drop1
   PushNull
   ReturnTOS
@@ -908,28 +918,32 @@
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
+  StoreLocal           r4
   PushInt              10
-  DynamicCall          CP#25, 2
+  Push                 r4
+  UncheckedClosureCall CP#23, 2
   Drop1
   Push                 r3
+  StoreLocal           r4
   PushInt              11
-  DynamicCall          CP#26, 2
+  Push                 r4
+  UncheckedClosureCall CP#23, 2
   Drop1
   Push                 r2
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   Drop1
   Push                 r0
   LoadContextVar       0, 2
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   Drop1
   Push                 r0
   LoadContextVar       0, 1
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   Drop1
   Push                 r0
   PushInt              42
   StoreContextVar      0, 3
-  AllocateClosure      CP#27
+  AllocateClosure      CP#24
   StoreLocal           r3
   Push                 r3
   PushNull
@@ -941,14 +955,16 @@
   PushConstant         CP#14
   StoreFieldTOS        CP#15
   Push                 r3
-  PushConstant         CP#27
+  PushConstant         CP#24
   StoreFieldTOS        CP#17
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
-  DynamicCall          CP#31, 1
+  StoreLocal           r3
+  Push                 r3
+  UncheckedClosureCall CP#19, 1
   Drop1
   PushNull
   ReturnTOS
@@ -974,18 +990,14 @@
   [17] = InstanceField dart:core::_Closure::_function (field)
   [18] = Reserved
   [19] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [20] = ICData dynamic target-name 'call', arg-desc CP#19
-  [21] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [22] = Reserved
-  [23] = EndClosureFunctionScope
-  [24] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
-  [25] = ICData dynamic target-name 'call', arg-desc CP#24
-  [26] = ICData dynamic target-name 'call', arg-desc CP#24
-  [27] = ClosureFunction 2
-  [28] = InterfaceCall '#lib::B::set:foo', ArgDesc num-args 2, num-type-args 0, names []
-  [29] = Reserved
-  [30] = EndClosureFunctionScope
-  [31] = ICData dynamic target-name 'call', arg-desc CP#19
+  [20] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
+  [21] = Reserved
+  [22] = EndClosureFunctionScope
+  [23] = ObjectRef ArgDesc num-args 2, num-type-args 0, names []
+  [24] = ClosureFunction 2
+  [25] = InterfaceCall '#lib::B::set:foo', ArgDesc num-args 2, num-type-args 0, names []
+  [26] = Reserved
+  [27] = EndClosureFunctionScope
 }
 Closure #lib::B::topLevel::'<anonymous closure>' (dart:core::int y) -> dart:core::Null
 ClosureCode {
@@ -1003,6 +1015,7 @@
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      1, 0
+  JumpIfUnchecked      L1
   Push                 FP[-5]
   PushConstant         CP#3
   PushNull
@@ -1010,6 +1023,7 @@
   PushConstant         CP#4
   AssertAssignable     1, CP#5
   Drop1
+L1:
   Push                 r0
   LoadContextParent
   Push                 r0
@@ -1022,7 +1036,7 @@
   LoadContextVar       0, 1
   PushInt              5
   CompareIntGt
-  JumpIfFalse          L1
+  JumpIfFalse          L2
   Push                 r0
   PushInt              4
   StoreContextVar      1, 1
@@ -1045,13 +1059,15 @@
   StoreFieldTOS        CP#1
   PopLocal             r3
   Push                 r3
-  DynamicCall          CP#20, 1
+  StoreLocal           r2
+  Push                 r2
+  UncheckedClosureCall CP#19, 1
   Drop1
   Push                 r0
   LoadContextVar       1, 1
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   Drop1
-L1:
+L2:
   PushNull
   ReturnTOS
 }
@@ -1095,7 +1111,7 @@
   LoadContextVar       0, 0
   Push                 r0
   LoadContextVar       0, 3
-  InterfaceCall        CP#28, 2
+  InterfaceCall        CP#25, 2
   Drop1
   PushNull
   ReturnTOS
@@ -1178,10 +1194,10 @@
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#5
-  InterfaceCall        CP#17, 2
+  InstantiatedInterfaceCall CP#17, 2
   Drop1
   Push                 r4
-  AllocateClosure      CP#19
+  AllocateClosure      CP#20
   StoreLocal           r3
   Push                 r3
   PushNull
@@ -1193,12 +1209,12 @@
   PushConstant         CP#12
   StoreFieldTOS        CP#13
   Push                 r3
-  PushConstant         CP#19
+  PushConstant         CP#20
   StoreFieldTOS        CP#15
   Push                 r3
   Push                 r0
   StoreFieldTOS        CP#5
-  InterfaceCall        CP#17, 2
+  InstantiatedInterfaceCall CP#17, 2
   Drop1
   Push                 r0
   CloneContext         1, 1
@@ -1241,13 +1257,14 @@
   [14] = Reserved
   [15] = InstanceField dart:core::_Closure::_function (field)
   [16] = Reserved
-  [17] = InterfaceCall 'dart:core::List::add', ArgDesc num-args 2, num-type-args 0, names []
+  [17] = InstantiatedInterfaceCall 'dart:core::List::add', ArgDesc num-args 2, num-type-args 0, names [], receiver dart:core::List < dart:core::Function >
   [18] = Reserved
-  [19] = ClosureFunction 1
-  [20] = Type dart:core::int
-  [21] = ObjectRef 'ii'
-  [22] = SubtypeTestCache
-  [23] = EndClosureFunctionScope
+  [19] = Reserved
+  [20] = ClosureFunction 1
+  [21] = Type dart:core::int
+  [22] = ObjectRef 'ii'
+  [23] = SubtypeTestCache
+  [24] = EndClosureFunctionScope
 }
 Closure #lib::C::testForLoop::'<anonymous closure>' () -> dart:core::int
 ClosureCode {
@@ -1272,13 +1289,15 @@
   Push                 FP[-6]
   LoadFieldTOS         CP#5
   PopLocal             r0
+  JumpIfUnchecked      L1
   Push                 FP[-5]
-  PushConstant         CP#20
-  PushNull
-  PushNull
   PushConstant         CP#21
-  AssertAssignable     1, CP#22
+  PushNull
+  PushNull
+  PushConstant         CP#22
+  AssertAssignable     1, CP#23
   Drop1
+L1:
   Push                 r0
   Push                 FP[-5]
   Push                 r0
@@ -1331,11 +1350,13 @@
   StoreFieldTOS        CP#7
   PopLocal             r3
   Push                 r3
-  DynamicCall          CP#20, 1
+  StoreLocal           r4
+  Push                 r4
+  UncheckedClosureCall CP#19, 1
   Drop1
   Push                 r0
   LoadContextVar       0, 0
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   Drop1
   Push                 r0
   LoadContextParent
@@ -1366,9 +1387,8 @@
   [17] = InstanceField dart:core::_Closure::_function (field)
   [18] = Reserved
   [19] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [20] = ICData dynamic target-name 'call', arg-desc CP#19
-  [21] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
-  [22] = Reserved
+  [20] = DirectCall 'dart:core::print', ArgDesc num-args 1, num-type-args 0, names []
+  [21] = Reserved
 }
 Closure #lib::C::testForInLoop::'<anonymous closure>' () -> dart:core::Null
 ClosureCode {
@@ -1423,6 +1443,7 @@
   Push                 r0
   Push                 FP[-5]
   StoreContextVar      0, 0
+  JumpIfUnchecked      L1
   Push                 FP[-5]
   PushConstant         CP#0
   Push                 FP[-6]
@@ -1431,6 +1452,7 @@
   PushConstant         CP#2
   AssertAssignable     0, CP#3
   Drop1
+L1:
   AllocateClosure      CP#4
   StoreLocal           r2
   Push                 r2
@@ -1533,8 +1555,7 @@
   [13] = InstanceField dart:core::_Closure::_function (field)
   [14] = Reserved
   [15] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [16] = ICData dynamic target-name 'call', arg-desc CP#15
-  [17] = EndClosureFunctionScope
+  [16] = EndClosureFunctionScope
 }
 Closure #lib::D::bar::'<anonymous closure>' () -> dart:core::Null
 ClosureCode {
@@ -1564,7 +1585,9 @@
   StoreFieldTOS        CP#1
   PopLocal             r2
   Push                 r2
-  DynamicCall          CP#16, 1
+  StoreLocal           r3
+  Push                 r3
+  UncheckedClosureCall CP#15, 1
   Drop1
   PushNull
   ReturnTOS
@@ -1585,164 +1608,164 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  typedef IntFunc = (dart.core::int) → dynamic;
+  typedef IntFunc = (dart.core::int*) →* dynamic;
   class C1 extends dart.core::Object {
-    synthetic constructor •() → #lib::C1
+    synthetic constructor •() → #lib::C1*
       : super dart.core::Object::•()
       ;
   }
   class C2 extends dart.core::Object {
-    synthetic constructor •() → #lib::C2
+    synthetic constructor •() → #lib::C2*
       : super dart.core::Object::•()
       ;
   }
   class C3 extends dart.core::Object {
-    synthetic constructor •() → #lib::C3
+    synthetic constructor •() → #lib::C3*
       : super dart.core::Object::•()
       ;
   }
   class C4 extends dart.core::Object {
-    synthetic constructor •() → #lib::C4
+    synthetic constructor •() → #lib::C4*
       : super dart.core::Object::•()
       ;
   }
   class C5 extends dart.core::Object {
-    synthetic constructor •() → #lib::C5
+    synthetic constructor •() → #lib::C5*
       : super dart.core::Object::•()
       ;
   }
   class C6 extends dart.core::Object {
-    synthetic constructor •() → #lib::C6
+    synthetic constructor •() → #lib::C6*
       : super dart.core::Object::•()
       ;
   }
   class C7 extends dart.core::Object {
-    synthetic constructor •() → #lib::C7
+    synthetic constructor •() → #lib::C7*
       : super dart.core::Object::•()
       ;
   }
   class C8 extends dart.core::Object {
-    synthetic constructor •() → #lib::C8
+    synthetic constructor •() → #lib::C8*
       : super dart.core::Object::•()
       ;
   }
-  class A<T1 extends dart.core::Object = dynamic, T2 extends dart.core::Object = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::A<#lib::A::T1, #lib::A::T2>
+  class A<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::A<#lib::A::T1*, #lib::A::T2*>*
       : super dart.core::Object::•()
       ;
-    method foo<T3 extends dart.core::Object = dynamic, T4 extends dart.core::Object = dynamic>() → void {
-      function nested1<T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void {
-        function nested2<T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void {
-          () → dart.core::Null nested3 = () → dart.core::Null {
-            dart.core::print(<dart.core::Type>[#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8]);
-            #lib::callWithArgs<#lib::A::T1, #lib::A::T2, #lib::A::foo::T3, #lib::A::foo::T4, T5, T6, T7, T8>();
+    method foo<T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic>() → void {
+      function nested1<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() → void {
+        function nested2<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {
+          () →* dart.core::Null* nested3 = () → dart.core::Null* {
+            dart.core::print(<dart.core::Type*>[#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*]);
+            #lib::callWithArgs<#lib::A::T1*, #lib::A::T2*, #lib::A::foo::T3*, #lib::A::foo::T4*, T5*, T6*, T7*, T8*>();
           };
-          [@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] nested3.call();
+          [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null*] nested3.call();
         }
-        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void] nested2.call<#lib::C7, #lib::C8>();
-        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void] nested2.call<dart.core::List<#lib::C7>, dart.core::List<#lib::C8>>();
+        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<#lib::C7*, #lib::C8*>();
+        [@vm.call-site-attributes.metadata=receiverType:<T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() →* void] nested2.call<dart.core::List<#lib::C7*>*, dart.core::List<#lib::C8*>*>();
       }
-      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void] nested1.call<#lib::C5, #lib::C6>();
-      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic>() → void] nested1.call<dart.core::List<#lib::C5>, dart.core::List<#lib::C6>>();
+      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<#lib::C5*, #lib::C6*>();
+      [@vm.call-site-attributes.metadata=receiverType:<T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic>() →* void] nested1.call<dart.core::List<#lib::C5*>*, dart.core::List<#lib::C6*>*>();
     }
   }
   class B extends dart.core::Object {
-    field dart.core::int foo = null;
-    synthetic constructor •() → #lib::B
+    field dart.core::int* foo = null;
+    synthetic constructor •() → #lib::B*
       : super dart.core::Object::•()
       ;
     method topLevel() → void {
       {
-        dart.core::int x = 1;
+        dart.core::int* x = 1;
         {
-          dart.core::int y = 2;
-          dart.core::int z = 3;
-          (dart.core::int) → dart.core::Null closure1 = (dart.core::int y) → dart.core::Null {
+          dart.core::int* y = 2;
+          dart.core::int* z = 3;
+          (dart.core::int*) →* dart.core::Null* closure1 = (dart.core::int* y) → dart.core::Null* {
             x = y.{dart.core::num::+}(1);
             if(x.{dart.core::num::>}(5)) {
-              dart.core::int w = 4;
+              dart.core::int* w = 4;
               function closure2() → void {
                 z = x.{dart.core::num::+}(2);
                 w = this.{#lib::B::foo}.{dart.core::num::+}(y);
               }
-              [@vm.call-site-attributes.metadata=receiverType:() → void] closure2.call();
+              [@vm.call-site-attributes.metadata=receiverType:() →* void] closure2.call();
               dart.core::print(w);
             }
           };
-          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] closure1.call(10);
-          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] closure1.call(11);
+          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null*] closure1.call(10);
+          [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null*] closure1.call(11);
           dart.core::print(y);
           dart.core::print(z);
         }
         dart.core::print(x);
       }
       {
-        dart.core::int x = 42;
-        () → dart.core::Null closure3 = () → dart.core::Null {
+        dart.core::int* x = 42;
+        () →* dart.core::Null* closure3 = () → dart.core::Null* {
           this.{#lib::B::foo} = x;
         };
-        [@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] closure3.call();
+        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null*] closure3.call();
       }
     }
   }
   class C extends dart.core::Object {
-    synthetic constructor •() → #lib::C
+    synthetic constructor •() → #lib::C*
       : super dart.core::Object::•()
       ;
     method testForLoop() → void {
-      dart.core::int delta = 0;
-      dart.core::List<dart.core::Function> getI = <dart.core::Function>[];
-      dart.core::List<dart.core::Function> setI = <dart.core::Function>[];
-      for (dart.core::int i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] getI.{dart.core::List::add}(() → dart.core::int => i.{dart.core::num::+}(delta));
-        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function>] setI.{dart.core::List::add}((dart.core::int ii) → dart.core::Null {
+      dart.core::int* delta = 0;
+      dart.core::List<dart.core::Function*>* getI = <dart.core::Function*>[];
+      dart.core::List<dart.core::Function*>* setI = <dart.core::Function*>[];
+      for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
+        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] getI.{dart.core::List::add}(() → dart.core::int* => i.{dart.core::num::+}(delta));
+        [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dart.core::Function*>*] setI.{dart.core::List::add}((dart.core::int* ii) → dart.core::Null* {
           i = ii.{dart.core::num::+}(delta);
         });
       }
     }
-    method testForInLoop(dart.core::List<dart.core::int> list) → void {
-      for (dart.core::int i in list) {
-        () → dart.core::Null inc = () → dart.core::Null {
+    method testForInLoop(dart.core::List<dart.core::int*>* list) → void {
+      for (dart.core::int* i in list) {
+        () →* dart.core::Null* inc = () → dart.core::Null* {
           i = i.{dart.core::num::+}(1);
         };
-        [@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] inc.call();
+        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null*] inc.call();
         dart.core::print(i);
       }
     }
   }
-  class D<T extends dart.core::Object = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::D<#lib::D::T>
+  class D<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::D<#lib::D::T*>*
       : super dart.core::Object::•()
       ;
-    method foo(generic-covariant-impl #lib::D::T t) → dynamic {
-      return () → #lib::D::T => t;
+    method foo(generic-covariant-impl #lib::D::T* t) → dynamic {
+      return () → #lib::D::T* => t;
     }
     method bar() → dynamic {
-      return () → dart.core::Null {
-        function inner() → dart.core::Null {}
-        [@vm.call-site-attributes.metadata=receiverType:() → dart.core::Null] inner.call();
+      return () → dart.core::Null* {
+        function inner() → dart.core::Null* {}
+        [@vm.call-site-attributes.metadata=receiverType:() →* dart.core::Null*] inner.call();
       };
     }
   }
-  static method simpleClosure() → dart.core::int {
-    dart.core::int x = 5;
-    (dart.core::int) → dart.core::Null inc = (dart.core::int y) → dart.core::Null {
+  static method simpleClosure() → dart.core::int* {
+    dart.core::int* x = 5;
+    (dart.core::int*) →* dart.core::Null* inc = (dart.core::int* y) → dart.core::Null* {
       x = x.{dart.core::num::+}(y);
     };
-    [@vm.call-site-attributes.metadata=receiverType:(dart.core::int) → dart.core::Null] inc.call(3);
+    [@vm.call-site-attributes.metadata=receiverType:(dart.core::int*) →* dart.core::Null*] inc.call(3);
     return x;
   }
-  static method callWithArgs<T1 extends dart.core::Object = dynamic, T2 extends dart.core::Object = dynamic, T3 extends dart.core::Object = dynamic, T4 extends dart.core::Object = dynamic, T5 extends dart.core::Object = dynamic, T6 extends dart.core::Object = dynamic, T7 extends dart.core::Object = dynamic, T8 extends dart.core::Object = dynamic>() → void {
-    dart.core::print(<dart.core::Type>[#lib::callWithArgs::T1, #lib::callWithArgs::T2, #lib::callWithArgs::T3, #lib::callWithArgs::T4, #lib::callWithArgs::T5, #lib::callWithArgs::T6, #lib::callWithArgs::T7, #lib::callWithArgs::T8]);
+  static method callWithArgs<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic, T4 extends dart.core::Object* = dynamic, T5 extends dart.core::Object* = dynamic, T6 extends dart.core::Object* = dynamic, T7 extends dart.core::Object* = dynamic, T8 extends dart.core::Object* = dynamic>() → void {
+    dart.core::print(<dart.core::Type*>[#lib::callWithArgs::T1*, #lib::callWithArgs::T2*, #lib::callWithArgs::T3*, #lib::callWithArgs::T4*, #lib::callWithArgs::T5*, #lib::callWithArgs::T6*, #lib::callWithArgs::T7*, #lib::callWithArgs::T8*]);
   }
   static method callA() → void {
-    new #lib::A::•<#lib::C1, #lib::C2>().{#lib::A::foo}<#lib::C3, #lib::C4>();
-    new #lib::A::•<#lib::C1, #lib::C2>().{#lib::A::foo}<dart.core::List<#lib::C3>, dart.core::List<#lib::C4>>();
-    new #lib::A::•<dart.core::List<#lib::C1>, dart.core::List<#lib::C2>>().{#lib::A::foo}<dart.core::List<#lib::C3>, dart.core::List<#lib::C4>>();
+    new #lib::A::•<#lib::C1*, #lib::C2*>().{#lib::A::foo}<#lib::C3*, #lib::C4*>();
+    new #lib::A::•<#lib::C1*, #lib::C2*>().{#lib::A::foo}<dart.core::List<#lib::C3*>*, dart.core::List<#lib::C4*>*>();
+    new #lib::A::•<dart.core::List<#lib::C1*>*, dart.core::List<#lib::C2*>*>().{#lib::A::foo}<dart.core::List<#lib::C3*>*, dart.core::List<#lib::C4*>*>();
   }
-  static method testPartialInstantiation() → (dart.core::int) → dynamic {
-    function foo<T extends dart.core::Object = dynamic>(T t) → void {}
-    (dart.core::int) → dynamic intFunc = foo<dart.core::int>;
+  static method testPartialInstantiation() → (dart.core::int*) →* dynamic {
+    function foo<T extends dart.core::Object* = dynamic>(T* t) → void {}
+    (dart.core::int*) →* dynamic intFunc = foo<dart.core::int*>;
     return intFunc;
   }
   static method main() → dynamic {}
diff --git a/pkg/vm/testcases/bytecode/field_initializers.dart.expect b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
index a2d1442..c9e7225 100644
--- a/pkg/vm/testcases/bytecode/field_initializers.dart.expect
+++ b/pkg/vm/testcases/bytecode/field_initializers.dart.expect
@@ -232,34 +232,37 @@
 ]library #lib from "#lib" as #lib {
 
   class A extends dart.core::Object {
-    field dart.core::int foo1;
-    field dart.core::int foo2 = null;
-    field dart.core::int foo3 = 42;
-    field dart.core::int foo4;
-    field dart.core::int foo5 = 43;
-    constructor •(dart.core::int foo4) → #lib::A
+    field dart.core::int* foo1;
+    field dart.core::int* foo2 = null;
+    field dart.core::int* foo3 = 42;
+    field dart.core::int* foo4;
+    field dart.core::int* foo5 = 43;
+    constructor •(dart.core::int* foo4) → #lib::A*
       : #lib::A::foo1 = null, #lib::A::foo4 = foo4, #lib::A::foo5 = 44, super dart.core::Object::•()
       ;
-    constructor constr2(dart.core::int x, dart.core::int y) → #lib::A
+    constructor constr2(dart.core::int* x, dart.core::int* y) → #lib::A*
       : #lib::A::foo4 = null, #lib::A::foo1 = x, #lib::A::foo5 = y.{dart.core::num::+}(1), super dart.core::Object::•()
       ;
-    constructor redirecting1() → #lib::A
+    constructor redirecting1() → #lib::A*
       : this #lib::A::•(45)
       ;
-    constructor redirecting2(dart.core::int a, dart.core::int b, dart.core::int c) → #lib::A
+    constructor redirecting2(dart.core::int* a, dart.core::int* b, dart.core::int* c) → #lib::A*
       : this #lib::A::constr2(a, b.{dart.core::num::*}(c))
       ;
   }
   class B extends #lib::A {
-    field dart.core::int foo6 = 46;
-    static field dart.core::int foo7 = 47;
-    static const field dart.core::int foo8 = 48;
-    constructor •() → #lib::B
+    field dart.core::int* foo6 = 46;
+    static field dart.core::int* foo7 = 47;
+    static const field dart.core::int* foo8 = #C1;
+    constructor •() → #lib::B*
       : super #lib::A::•(49)
       ;
-    constructor c2(dart.core::int i, dart.core::int j) → #lib::B
+    constructor c2(dart.core::int* i, dart.core::int* j) → #lib::B*
       : #lib::B::foo6 = 50, super #lib::A::redirecting2(i, j, 51)
       ;
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 48
+}
diff --git a/pkg/vm/testcases/bytecode/instance_creation.dart.expect b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
index eadce66..3154298 100644
--- a/pkg/vm/testcases/bytecode/instance_creation.dart.expect
+++ b/pkg/vm/testcases/bytecode/instance_creation.dart.expect
@@ -673,74 +673,74 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  class Base<T1 extends dart.core::Object = dynamic, T2 extends dart.core::Object = dynamic> extends dart.core::Object {
-    generic-covariant-impl field #lib::Base::T1 t1 = null;
-    generic-covariant-impl field #lib::Base::T2 t2 = null;
-    constructor •() → #lib::Base<#lib::Base::T1, #lib::Base::T2>
+  class Base<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic> extends dart.core::Object {
+    generic-covariant-impl field #lib::Base::T1* t1 = null;
+    generic-covariant-impl field #lib::Base::T2* t2 = null;
+    constructor •() → #lib::Base<#lib::Base::T1*, #lib::Base::T2*>*
       : super dart.core::Object::•() {
-      dart.core::print("Base: ${#lib::Base::T1}, ${#lib::Base::T2}");
+      dart.core::print("Base: ${#lib::Base::T1*}, ${#lib::Base::T2*}");
     }
   }
-  class A extends #lib::Base<dart.core::int, dart.core::String> {
-    constructor •(dart.core::String s) → #lib::A
+  class A extends #lib::Base<dart.core::int*, dart.core::String*> {
+    constructor •(dart.core::String* s) → #lib::A*
       : super #lib::Base::•()
       ;
   }
-  class B<T extends dart.core::Object = dynamic> extends #lib::Base<dart.core::List<#lib::B::T>, dart.core::String> {
-    constructor •() → #lib::B<#lib::B::T>
+  class B<T extends dart.core::Object* = dynamic> extends #lib::Base<dart.core::List<#lib::B::T*>*, dart.core::String*> {
+    constructor •() → #lib::B<#lib::B::T*>*
       : super #lib::Base::•() {
-      dart.core::print("B: ${#lib::B::T}");
+      dart.core::print("B: ${#lib::B::T*}");
     }
   }
   class C extends dart.core::Object {
-    constructor •(dart.core::String s) → #lib::C
+    constructor •(dart.core::String* s) → #lib::C*
       : super dart.core::Object::•() {
       dart.core::print("C: ${s}");
     }
   }
-  class E<K extends dart.core::Object = dynamic, V extends dart.core::Object = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::E<#lib::E::K, #lib::E::V>
+  class E<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::E<#lib::E::K*, #lib::E::V*>*
       : super dart.core::Object::•()
       ;
     method test_reuse1() → dynamic
-      return dart.core::Map::•<#lib::E::K, #lib::E::V>();
+      return dart.core::Map::•<#lib::E::K*, #lib::E::V*>();
   }
-  class F<K extends dart.core::Object = dynamic, V extends dart.core::Object = dynamic> extends #lib::E<dart.core::String, dart.core::List<#lib::F::V>> {
-    synthetic constructor •() → #lib::F<#lib::F::K, #lib::F::V>
+  class F<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends #lib::E<dart.core::String*, dart.core::List<#lib::F::V*>*> {
+    synthetic constructor •() → #lib::F<#lib::F::K*, #lib::F::V*>*
       : super #lib::E::•()
       ;
     method test_reuse2() → dynamic
-      return dart.core::Map::•<dart.core::String, dart.core::List<#lib::F::V>>();
+      return dart.core::Map::•<dart.core::String*, dart.core::List<#lib::F::V*>*>();
   }
-  class G<K extends dart.core::Object = dynamic, V extends dart.core::Object = dynamic> extends dart.core::Object {
-    constructor •() → #lib::G<#lib::G::K, #lib::G::V>
+  class G<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic> extends dart.core::Object {
+    constructor •() → #lib::G<#lib::G::K*, #lib::G::V*>*
       : super dart.core::Object::•()
       ;
-    static factory test_factory<K extends dart.core::Object = dynamic, V extends dart.core::Object = dynamic>() → #lib::G<#lib::G::test_factory::K, #lib::G::test_factory::V>
-      return new #lib::H::•<dart.core::String, #lib::G::test_factory::K, #lib::G::test_factory::V>();
+    static factory test_factory<K extends dart.core::Object* = dynamic, V extends dart.core::Object* = dynamic>() → #lib::G<#lib::G::test_factory::K*, #lib::G::test_factory::V*>*
+      return new #lib::H::•<dart.core::String*, #lib::G::test_factory::K*, #lib::G::test_factory::V*>();
   }
-  class H<P1 extends dart.core::Object = dynamic, P2 extends dart.core::Object = dynamic, P3 extends dart.core::Object = dynamic> extends #lib::G<#lib::H::P2, #lib::H::P3> {
-    synthetic constructor •() → #lib::H<#lib::H::P1, #lib::H::P2, #lib::H::P3>
+  class H<P1 extends dart.core::Object* = dynamic, P2 extends dart.core::Object* = dynamic, P3 extends dart.core::Object* = dynamic> extends #lib::G<#lib::H::P2*, #lib::H::P3*> {
+    synthetic constructor •() → #lib::H<#lib::H::P1*, #lib::H::P2*, #lib::H::P3*>*
       : super #lib::G::•()
       ;
   }
   class I extends dart.core::Object {
-    constructor •(dynamic param) → #lib::I
+    constructor •(dynamic param) → #lib::I*
       : super dart.core::Object::•()
       ;
-    static factory test_factory2({dynamic param = null}) → #lib::I
+    static factory test_factory2({dynamic param = #C1}) → #lib::I*
       return new #lib::I::•(param);
   }
   class J extends dart.core::Object {
-    @dart._internal::ExternalName::•("agent_J")
-    external static factory •() → #lib::J;
+    @#C3
+    external static factory •() → #lib::J*;
   }
-  abstract class K<A extends dart.core::Object = dynamic, B extends dart.core::Object = dynamic> extends dart.core::Object {
-    static factory •<A extends dart.core::Object = dynamic, B extends dart.core::Object = dynamic>() → #lib::K<#lib::K::•::A, #lib::K::•::B>
-      return new #lib::TestTypeArgReuse::•<#lib::K::•::A, #lib::K::•::B>();
+  abstract class K<A extends dart.core::Object* = dynamic, B extends dart.core::Object* = dynamic> extends dart.core::Object {
+    static factory •<A extends dart.core::Object* = dynamic, B extends dart.core::Object* = dynamic>() → #lib::K<#lib::K::•::A*, #lib::K::•::B*>*
+      return new #lib::TestTypeArgReuse::•<#lib::K::•::A*, #lib::K::•::B*>();
   }
-  class TestTypeArgReuse<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic> extends #lib::Base<#lib::TestTypeArgReuse::P, #lib::TestTypeArgReuse::Q> implements #lib::K<#lib::TestTypeArgReuse::P, #lib::TestTypeArgReuse::Q> {
-    synthetic constructor •() → #lib::TestTypeArgReuse<#lib::TestTypeArgReuse::P, #lib::TestTypeArgReuse::Q>
+  class TestTypeArgReuse<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::Base<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*> implements #lib::K<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*> {
+    synthetic constructor •() → #lib::TestTypeArgReuse<#lib::TestTypeArgReuse::P*, #lib::TestTypeArgReuse::Q*>*
       : super #lib::Base::•()
       ;
   }
@@ -748,25 +748,30 @@
     return new #lib::C::•("hello");
   static method foo2() → void {
     new #lib::A::•("hi");
-    new #lib::B::•<dart.core::int>();
+    new #lib::B::•<dart.core::int*>();
   }
-  static method foo3<T extends dart.core::Object = dynamic>() → void {
-    new #lib::B::•<dart.core::List<#lib::foo3::T>>();
+  static method foo3<T extends dart.core::Object* = dynamic>() → void {
+    new #lib::B::•<dart.core::List<#lib::foo3::T*>*>();
   }
   static method foo4() → void {
-    #lib::G::test_factory<dart.core::int, dart.core::List<dart.core::String>>();
+    #lib::G::test_factory<dart.core::int*, dart.core::List<dart.core::String*>*>();
   }
   static method foo5() → void {
     #lib::I::test_factory2();
     #lib::I::test_factory2(param: 42);
   }
   static method foo6() → dynamic
-    return dart.core::_GrowableList::•<dart.core::String>(0);
-  static method foo7(dart.core::int n) → dynamic
-    return dart.core::_List::•<dart.core::int>(n);
+    return dart.core::_GrowableList::•<dart.core::String*>(0);
+  static method foo7(dart.core::int* n) → dynamic
+    return dart.core::_List::•<dart.core::int*>(n);
   static method main() → dynamic {
     #lib::foo1();
     #lib::foo2();
-    #lib::foo3<dart.core::String>();
+    #lib::foo3<dart.core::String*>();
   }
 }
+constants  {
+  #C1 = null
+  #C2 = "agent_J"
+  #C3 = dart._internal::ExternalName {name:#C2}
+}
diff --git a/pkg/vm/testcases/bytecode/literals.dart.expect b/pkg/vm/testcases/bytecode/literals.dart.expect
index 0785aa4..bbfb3d3 100644
--- a/pkg/vm/testcases/bytecode/literals.dart.expect
+++ b/pkg/vm/testcases/bytecode/literals.dart.expect
@@ -684,94 +684,136 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  typedef GenericFunctionType = <X extends dart.core::Object = dynamic>(X) → X;
+  typedef GenericFunctionType = <X extends dart.core::Object* = dynamic>(X*) →* X*;
   class A extends dart.core::Object {
-    final field dart.core::int index;
-    final field dart.core::String _name;
-    static const field dart.core::List<#lib::A> values = const <#lib::A>[#lib::A::elem1, #lib::A::elem2, #lib::A::elem3, #lib::A::elem4];
-    static const field #lib::A elem1 = const #lib::A::•(0, "A.elem1");
-    static const field #lib::A elem2 = const #lib::A::•(1, "A.elem2");
-    static const field #lib::A elem3 = const #lib::A::•(2, "A.elem3");
-    static const field #lib::A elem4 = const #lib::A::•(3, "A.elem4");
-    const constructor •(dart.core::int index, dart.core::String _name) → #lib::A
+    final field dart.core::int* index;
+    final field dart.core::String* _name;
+    static const field dart.core::List<#lib::A*>* values = #C13;
+    static const field #lib::A* elem1 = #C3;
+    static const field #lib::A* elem2 = #C6;
+    static const field #lib::A* elem3 = #C9;
+    static const field #lib::A* elem4 = #C12;
+    const constructor •(dart.core::int* index, dart.core::String* _name) → #lib::A*
       : #lib::A::index = index, #lib::A::_name = _name, super dart.core::Object::•()
       ;
-    method toString() → dart.core::String
+    method toString() → dart.core::String*
       return this.{=#lib::A::_name};
   }
   class B extends dart.core::Object {
-    final field dart.core::int i;
-    const constructor •(dart.core::int i) → #lib::B
+    final field dart.core::int* i;
+    const constructor •(dart.core::int* i) → #lib::B*
       : #lib::B::i = i, super dart.core::Object::•()
       ;
   }
   class C extends #lib::B {
-    final field dart.core::int j;
-    const constructor •(dart.core::int a, dart.core::int b, dart.core::int c) → #lib::C
+    final field dart.core::int* j;
+    const constructor •(dart.core::int* a, dart.core::int* b, dart.core::int* c) → #lib::C*
       : #lib::C::j = a.{dart.core::num::+}(b), super #lib::B::•(c.{dart.core::num::*}(5))
       ;
   }
   class D extends dart.core::Object {
     final field dynamic x;
     final field dynamic y;
-    const constructor •(dynamic x, [dynamic y = null]) → #lib::D
+    const constructor •(dynamic x, [dynamic y = #C14]) → #lib::D*
       : #lib::D::x = x, #lib::D::y = y, super dart.core::Object::•()
       ;
   }
-  class E<T extends dart.core::Object = dynamic> extends dart.core::Object {
-    const constructor •() → #lib::E<#lib::E::T>
+  class E<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    const constructor •() → #lib::E<#lib::E::T*>*
       : super dart.core::Object::•()
       ;
   }
-  class F<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic> extends #lib::E<dart.core::Map<#lib::F::P, #lib::F::Q>> {
-    const constructor •() → #lib::F<#lib::F::P, #lib::F::Q>
+  class F<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::E<dart.core::Map<#lib::F::P*, #lib::F::Q*>*> {
+    const constructor •() → #lib::F<#lib::F::P*, #lib::F::Q*>*
       : super #lib::E::•()
       ;
   }
-  static const field #lib::A c1 = #lib::A::elem3;
-  static const field dart.core::String c2 = "hello!";
-  static const field dart.core::int c3 = #lib::c2.{dart.core::String::length};
-  static const field #lib::C c4 = const #lib::C::•(1, 2, 3);
-  static const field #lib::D c5 = const #lib::D::•(const #lib::B::•(4));
-  static field dart.core::double fieldWithDoubleLiteralInitializer = 1.0;
+  static const field #lib::A* c1 = #C9;
+  static const field dart.core::String* c2 = #C15;
+  static const field dart.core::int* c3 = #C16;
+  static const field #lib::C* c4 = #C18;
+  static const field #lib::D* c5 = #C21;
+  static field dart.core::double* fieldWithDoubleLiteralInitializer = 1.0;
   static method test_constants1() → void {
-    dart.core::print(#lib::c1);
-    dart.core::print(#lib::c2);
-    dart.core::print(#lib::c3);
-    dart.core::print(#lib::c4);
-    dart.core::print(#lib::c5);
+    dart.core::print(#C9);
+    dart.core::print(#C15);
+    dart.core::print(#C16);
+    dart.core::print(#C18);
+    dart.core::print(#C21);
   }
   static method test_constants2() → void {
     dart.core::print(42);
     dart.core::print("foo");
-    dart.core::print(#lib::A::elem2);
-    dart.core::print(const <dart.core::Object>[42, "foo", dart.core::int]);
-    dart.core::print(const <dart.core::String, #lib::A>{"E2": #lib::A::elem2, "E4": #lib::A::elem4});
-    dart.core::print(const #lib::D::•(const #lib::C::•(4, 5, 6), const <dart.core::String, dart.core::Object>{"foo": 42, "bar": const #lib::B::•(#lib::c2.{dart.core::String::length})}));
+    dart.core::print(#C6);
+    dart.core::print(#C25);
+    dart.core::print(#C29);
+    dart.core::print(#C37);
   }
-  static method test_list_literal(dart.core::int a) → void {
-    dart.core::print(<dart.core::int>[1, a, 3]);
-    dart.core::print(<dart.core::String>["a", a.{dart.core::int::toString}(), "b"]);
+  static method test_list_literal(dart.core::int* a) → void {
+    dart.core::print(<dart.core::int*>[1, a, 3]);
+    dart.core::print(<dart.core::String*>["a", a.{dart.core::int::toString}(), "b"]);
   }
-  static method test_map_literal<T extends dart.core::Object = dynamic>(dart.core::int a, dart.core::int b, #lib::test_map_literal::T c) → void {
-    dart.core::print(<dart.core::int, dart.core::int>{1: a, b: 2});
-    dart.core::print(<dart.core::String, dart.core::int>{"foo": a, b.{dart.core::int::toString}(): 3});
-    dart.core::print(<dart.core::String, #lib::test_map_literal::T>{});
-    dart.core::print(<#lib::test_map_literal::T, dart.core::int>{c: 4});
+  static method test_map_literal<T extends dart.core::Object* = dynamic>(dart.core::int* a, dart.core::int* b, #lib::test_map_literal::T* c) → void {
+    dart.core::print(<dart.core::int*, dart.core::int*>{1: a, b: 2});
+    dart.core::print(<dart.core::String*, dart.core::int*>{"foo": a, b.{dart.core::int::toString}(): 3});
+    dart.core::print(<dart.core::String*, #lib::test_map_literal::T*>{});
+    dart.core::print(<#lib::test_map_literal::T*, dart.core::int*>{c: 4});
   }
   static method test_symbol() → void {
-    dart.core::print(#test_symbol);
-    dart.core::print(#_private_symbol);
+    dart.core::print(#C38);
+    dart.core::print(#C39);
   }
-  static method test_type_literal<T extends dart.core::Object = dynamic>() → void {
-    dart.core::print(dart.core::String);
-    dart.core::print(#lib::test_type_literal::T);
+  static method test_type_literal<T extends dart.core::Object* = dynamic>() → void {
+    dart.core::print(dart.core::String*);
+    dart.core::print(#lib::test_type_literal::T*);
   }
   static method testGenericConstInstance() → dynamic
-    return const #lib::F::•<dart.core::int, dart.core::String>();
+    return #C40;
   static method testGenericFunctionTypeLiteral() → dynamic
-    return <X extends dart.core::Object = dynamic>(X) → X;
+    return <X extends dart.core::Object* = dynamic>(X*) →* X*;
   static method testFieldWithDoubleLiteralInitializer() → dynamic
     return #lib::fieldWithDoubleLiteralInitializer;
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 0
+  #C2 = "A.elem1"
+  #C3 = #lib::A {index:#C1, _name:#C2}
+  #C4 = 1
+  #C5 = "A.elem2"
+  #C6 = #lib::A {index:#C4, _name:#C5}
+  #C7 = 2
+  #C8 = "A.elem3"
+  #C9 = #lib::A {index:#C7, _name:#C8}
+  #C10 = 3
+  #C11 = "A.elem4"
+  #C12 = #lib::A {index:#C10, _name:#C11}
+  #C13 = <#lib::A*>[#C3, #C6, #C9, #C12]
+  #C14 = null
+  #C15 = "hello!"
+  #C16 = 6
+  #C17 = 15
+  #C18 = #lib::C {j:#C10, i:#C17}
+  #C19 = 4
+  #C20 = #lib::B {i:#C19}
+  #C21 = #lib::D {x:#C20, y:#C14}
+  #C22 = 42
+  #C23 = "foo"
+  #C24 = TypeLiteralConstant(dart.core::int*)
+  #C25 = <dart.core::Object*>[#C22, #C23, #C24]
+  #C26 = "E2"
+  #C27 = "E4"
+  #C28 = <dynamic>[#C26, #C6, #C27, #C12]
+  #C29 = dart.core::_ImmutableMap<dart.core::String*, #lib::A*> {_kvPairs:#C28}
+  #C30 = 9
+  #C31 = 30
+  #C32 = #lib::C {j:#C30, i:#C31}
+  #C33 = "bar"
+  #C34 = #lib::B {i:#C16}
+  #C35 = <dynamic>[#C23, #C22, #C33, #C34]
+  #C36 = dart.core::_ImmutableMap<dart.core::String*, dart.core::Object*> {_kvPairs:#C35}
+  #C37 = #lib::D {x:#C32, y:#C36}
+  #C38 = #test_symbol
+  #C39 = ##lib::_private_symbol
+  #C40 = #lib::F<dart.core::int*, dart.core::String*> {}
+}
diff --git a/pkg/vm/testcases/bytecode/loops.dart.expect b/pkg/vm/testcases/bytecode/loops.dart.expect
index da711c9..2985990 100644
--- a/pkg/vm/testcases/bytecode/loops.dart.expect
+++ b/pkg/vm/testcases/bytecode/loops.dart.expect
@@ -332,17 +332,17 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  static method test_for(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    for (dart.core::int i = 0; i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
+  static method test_for(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    for (dart.core::int* i = 0; i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1)) {
       sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
     }
     return sum;
   }
-  static method test_for_break(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
+  static method test_for_break(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
     #L1:
-    for (dart.core::int i = 0; i.{dart.core::num::>=}(0); i = i.{dart.core::num::+}(1)) {
+    for (dart.core::int* i = 0; i.{dart.core::num::>=}(0); i = i.{dart.core::num::+}(1)) {
       if(i.{dart.core::num::>=}(list.{dart.core::List::length})) {
         break #L1;
       }
@@ -350,9 +350,9 @@
     }
     return sum;
   }
-  static method test_for_continue(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    for (dart.core::int i = 100.{dart.core::int::unary-}(); i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1))
+  static method test_for_continue(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    for (dart.core::int* i = 100.{dart.core::int::unary-}(); i.{dart.core::num::<}(list.{dart.core::List::length}); i = i.{dart.core::num::+}(1))
       #L2:
       {
         if(i.{dart.core::num::<}(0)) {
@@ -362,17 +362,17 @@
       }
     return sum;
   }
-  static method test_while(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    dart.core::int i = 0;
+  static method test_while(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    dart.core::int* i = 0;
     while (i.{dart.core::num::<}(list.{dart.core::List::length})) {
-      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(let final dart.core::int #t1 = i in let final dart.core::int #t2 = i = #t1.{dart.core::num::+}(1) in #t1));
+      sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(let final dart.core::int* #t1 = i in let final dart.core::int* #t2 = i = #t1.{dart.core::num::+}(1) in #t1));
     }
     return sum;
   }
-  static method test_do_while(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    dart.core::int i = 0;
+  static method test_do_while(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    dart.core::int* i = 0;
     do {
       sum = sum.{dart.core::num::+}(list.{dart.core::List::[]}(i));
       i = i.{dart.core::num::+}(1);
@@ -380,17 +380,17 @@
     while (i.{dart.core::num::<}(list.{dart.core::List::length}))
     return sum;
   }
-  static method test_for_in(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    for (dart.core::int e in list) {
+  static method test_for_in(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    for (dart.core::int* e in list) {
       sum = sum.{dart.core::num::+}(e);
     }
     return sum;
   }
-  static method test_for_in_with_outer_var(dart.core::List<dart.core::int> list) → dart.core::int {
-    dart.core::int sum = 0;
-    dart.core::int e = 42;
-    for (final dart.core::int #t3 in list) {
+  static method test_for_in_with_outer_var(dart.core::List<dart.core::int*>* list) → dart.core::int* {
+    dart.core::int* sum = 0;
+    dart.core::int* e = 42;
+    for (final dart.core::int* #t3 in list) {
       e = #t3;
       sum = sum.{dart.core::num::+}(e);
     }
diff --git a/pkg/vm/testcases/bytecode/optional_params.dart.expect b/pkg/vm/testcases/bytecode/optional_params.dart.expect
index 62dae5f..035d76c1 100644
--- a/pkg/vm/testcases/bytecode/optional_params.dart.expect
+++ b/pkg/vm/testcases/bytecode/optional_params.dart.expect
@@ -265,20 +265,20 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  static method foo1(dynamic x, [dynamic a = "default_a", dynamic b = "default_b"]) → void {
+  static method foo1(dynamic x, [dynamic a = #C1, dynamic b = #C2]) → void {
     dart.core::print("x = ${x}");
     dart.core::print("a = ${a}");
     dart.core::print("b = ${b}");
   }
-  static method foo2(dynamic y, dynamic z, {dynamic c = "default_c", dynamic a = 42, dynamic b = const <dart.core::String>["default_b"]}) → void {
+  static method foo2(dynamic y, dynamic z, {dynamic c = #C3, dynamic a = #C4, dynamic b = #C5}) → void {
     dart.core::print("y = ${y}");
     dart.core::print("z = ${z}");
     dart.core::print("a = ${a}");
     dart.core::print("b = ${b}");
     dart.core::print("c = ${c}");
   }
-  static method foo3<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic>(dynamic z, dynamic y, {dart.core::bool a = false, dart.core::Map<#lib::foo3::P, #lib::foo3::Q> b = null}) → void {
-    dart.core::print(#lib::foo3::P);
+  static method foo3<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic>(dynamic z, dynamic y, {dart.core::bool* a = #C6, dart.core::Map<#lib::foo3::P*, #lib::foo3::Q*>* b = #C7}) → void {
+    dart.core::print(#lib::foo3::P*);
     dart.core::print(y);
     dart.core::print(b);
   }
@@ -287,3 +287,12 @@
     #lib::foo2("fixed_y", "fixed_z", a: "concrete_a");
   }
 }
+constants  {
+  #C1 = "default_a"
+  #C2 = "default_b"
+  #C3 = "default_c"
+  #C4 = 42
+  #C5 = <dart.core::String*>[#C2]
+  #C6 = false
+  #C7 = null
+}
diff --git a/pkg/vm/testcases/bytecode/super_calls.dart.expect b/pkg/vm/testcases/bytecode/super_calls.dart.expect
index 0ac5882..3217e51 100644
--- a/pkg/vm/testcases/bytecode/super_calls.dart.expect
+++ b/pkg/vm/testcases/bytecode/super_calls.dart.expect
@@ -475,50 +475,50 @@
 ]library #lib from "#lib" as #lib {
 
   class Base1 extends dart.core::Object {
-    synthetic constructor •() → #lib::Base1
+    synthetic constructor •() → #lib::Base1*
       : super dart.core::Object::•()
       ;
-    method foo<T extends dart.core::Object = dynamic>(#lib::Base1::foo::T a1, dart.core::int a2) → void {}
+    method foo<T extends dart.core::Object* = dynamic>(#lib::Base1::foo::T* a1, dart.core::int* a2) → void {}
     get bar() → dynamic
       return 42;
-    set bazz(dart.core::int x) → void {}
+    set bazz(dart.core::int* x) → void {}
   }
   class A extends #lib::Base1 {
-    synthetic constructor •() → #lib::A
+    synthetic constructor •() → #lib::A*
       : super #lib::Base1::•()
       ;
-    method testSuperCall(dart.core::int x) → dynamic
-      return super.{#lib::Base1::foo}<dart.core::String>("a1", 2);
+    method testSuperCall(dart.core::int* x) → dynamic
+      return super.{#lib::Base1::foo}<dart.core::String*>("a1", 2);
     method testSuperTearOff() → dynamic
       return super.{#lib::Base1::foo};
     method testSuperGet() → dynamic
       return super.{#lib::Base1::bar};
     method testSuperCallViaGetter() → dynamic
-      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base1::bar}.call<dart.core::int>("param");
+      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base1::bar}.call<dart.core::int*>("param");
     method testSuperSet() → dynamic {
       super.{#lib::Base1::bazz} = 3;
     }
   }
   abstract class Base2 extends dart.core::Object {
-    synthetic constructor •() → #lib::Base2
+    synthetic constructor •() → #lib::Base2*
       : super dart.core::Object::•()
       ;
-    abstract method foo<T extends dart.core::Object = dynamic>(dart.core::String a1, #lib::Base2::foo::T a2, dart.core::int a3) → void;
+    abstract method foo<T extends dart.core::Object* = dynamic>(dart.core::String* a1, #lib::Base2::foo::T* a2, dart.core::int* a3) → void;
     abstract get bar() → dynamic;
-    abstract set bazz(dart.core::int x) → void;
+    abstract set bazz(dart.core::int* x) → void;
   }
   abstract class B extends #lib::Base2 {
-    synthetic constructor •() → #lib::B
+    synthetic constructor •() → #lib::B*
       : super #lib::Base2::•()
       ;
-    method testSuperCall(dart.core::int x) → dynamic
-      return super.{#lib::Base2::foo}<dart.core::double>("a1", 3.14, 5);
+    method testSuperCall(dart.core::int* x) → dynamic
+      return super.{#lib::Base2::foo}<dart.core::double*>("a1", 3.14, 5);
     method testSuperTearOff() → dynamic
       return super.{#lib::Base2::foo};
     method testSuperGet() → dynamic
       return super.{#lib::Base2::bar};
     method testSuperCallViaGetter() → dynamic
-      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base2::bar}.call<dart.core::int>("param");
+      return [@vm.call-site-attributes.metadata=receiverType:dynamic] super.{#lib::Base2::bar}.call<dart.core::int*>("param");
     method testSuperSet() → dynamic {
       super.{#lib::Base2::bazz} = 3;
     }
diff --git a/pkg/vm/testcases/bytecode/switch.dart.expect b/pkg/vm/testcases/bytecode/switch.dart.expect
index bc8357f..98e4d7f 100644
--- a/pkg/vm/testcases/bytecode/switch.dart.expect
+++ b/pkg/vm/testcases/bytecode/switch.dart.expect
@@ -187,24 +187,24 @@
 }
 ]library #lib from "#lib" as #lib {
 
-  static method foo1(dart.core::int x) → dart.core::int {
-    dart.core::int y;
+  static method foo1(dart.core::int* x) → dart.core::int* {
+    dart.core::int* y;
     #L1:
     switch(x) {
       #L2:
-      case 1:
+      case #C1:
         {
           y = 11;
           break #L1;
         }
       #L3:
-      case 2:
+      case #C2:
         {
           y = 22;
           break #L1;
         }
       #L4:
-      case 3:
+      case #C3:
         {
           y = 33;
           break #L1;
@@ -212,22 +212,22 @@
     }
     return y;
   }
-  static method foo2(dart.core::int x) → dart.core::int {
-    dart.core::int y;
+  static method foo2(dart.core::int* x) → dart.core::int* {
+    dart.core::int* y;
     #L5:
     switch(x) {
       #L6:
-      case 1:
-      case 2:
-      case 3:
+      case #C1:
+      case #C2:
+      case #C3:
         {
           y = 11;
           break #L5;
         }
       #L7:
-      case 4:
-      case 5:
-      case 6:
+      case #C4:
+      case #C5:
+      case #C6:
         {
           y = 22;
           break #L5;
@@ -240,21 +240,21 @@
     }
     return y;
   }
-  static method foo3(dart.core::int x) → dart.core::int {
-    dart.core::int y;
+  static method foo3(dart.core::int* x) → dart.core::int* {
+    dart.core::int* y;
     switch(x) {
       #L9:
-      case 1:
-      case 2:
-      case 3:
+      case #C1:
+      case #C2:
+      case #C3:
         {
           y = 11;
           continue #L10;
         }
       #L10:
-      case 4:
-      case 5:
-      case 6:
+      case #C4:
+      case #C5:
+      case #C6:
         {
           y = 22;
           return 42;
@@ -269,3 +269,11 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 1
+  #C2 = 2
+  #C3 = 3
+  #C4 = 4
+  #C5 = 5
+  #C6 = 6
+}
diff --git a/pkg/vm/testcases/bytecode/try_blocks.dart.expect b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
index f1ef3d4..b31deef 100644
--- a/pkg/vm/testcases/bytecode/try_blocks.dart.expect
+++ b/pkg/vm/testcases/bytecode/try_blocks.dart.expect
@@ -237,7 +237,9 @@
   StoreFieldTOS        CP#1
   PopLocal             r4
   Push                 r4
-  DynamicCall          CP#18, 1
+  StoreLocal           r5
+  Push                 r5
+  UncheckedClosureCall CP#17, 1
   Drop1
   Push                 r0
   LoadContextVar       0, 1
@@ -262,7 +264,7 @@
   StoreLocal           r5
   Push                 r5
   PushInt              0
-  PushConstant         CP#19
+  PushConstant         CP#18
   StoreIndexedTOS
   Push                 r5
   PushInt              1
@@ -270,17 +272,17 @@
   StoreIndexedTOS
   Push                 r5
   PushInt              2
-  PushConstant         CP#20
+  PushConstant         CP#19
   StoreIndexedTOS
   Push                 r5
   PushInt              3
   Push                 r0
   LoadContextVar       0, 2
   StoreIndexedTOS
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   DirectCall           CP#4, 1
   Drop1
-  AllocateClosure      CP#23
+  AllocateClosure      CP#22
   StoreLocal           r5
   Push                 r5
   PushNull
@@ -292,7 +294,7 @@
   PushConstant         CP#12
   StoreFieldTOS        CP#13
   Push                 r5
-  PushConstant         CP#23
+  PushConstant         CP#22
   StoreFieldTOS        CP#15
   Push                 r5
   Push                 r0
@@ -308,7 +310,7 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 20, end 80, handler 80, needs-stack-trace, types [CP#6]
+  try-index 0, outer -1, start 20, end 84, handler 84, needs-stack-trace, types [CP#6]
 }
 ConstantPool {
   [0] = ClosureFunction 0
@@ -329,19 +331,18 @@
   [15] = InstanceField dart:core::_Closure::_function (field)
   [16] = Reserved
   [17] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [18] = ICData dynamic target-name 'call', arg-desc CP#17
-  [19] = ObjectRef 'caught '
-  [20] = ObjectRef ' '
-  [21] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
-  [22] = Reserved
-  [23] = ClosureFunction 1
-  [24] = ObjectRef 'danger bar'
-  [25] = Type dart:core::Error
-  [26] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
-  [27] = Reserved
-  [28] = ObjectRef 'error '
-  [29] = ObjectRef ', captured stack trace: '
-  [30] = EndClosureFunctionScope
+  [18] = ObjectRef 'caught '
+  [19] = ObjectRef ' '
+  [20] = DirectCall 'dart:core::_StringBase::_interpolate', ArgDesc num-args 1, num-type-args 0, names []
+  [21] = Reserved
+  [22] = ClosureFunction 1
+  [23] = ObjectRef 'danger bar'
+  [24] = Type dart:core::Error
+  [25] = InterfaceCall 'dart:core::Object::_simpleInstanceOf', ArgDesc num-args 2, num-type-args 0, names []
+  [26] = Reserved
+  [27] = ObjectRef 'error '
+  [28] = ObjectRef ', captured stack trace: '
+  [29] = EndClosureFunctionScope
 }
 Closure #lib::testTryCatch3::'foo' () -> void
 ClosureCode {
@@ -389,7 +390,7 @@
   Push                 r0
   PopLocal             r2
 Try #0 start:
-  PushConstant         CP#24
+  PushConstant         CP#23
   DirectCall           CP#4, 1
   Drop1
   Jump                 L1
@@ -401,8 +402,8 @@
   MoveSpecial          exception, r2
   MoveSpecial          stackTrace, r3
   Push                 r2
-  PushConstant         CP#25
-  InterfaceCall        CP#26, 2
+  PushConstant         CP#24
+  InterfaceCall        CP#25, 2
   JumpIfFalse          L2
   Push                 r2
   PopLocal             r4
@@ -412,7 +413,7 @@
   StoreLocal           r5
   Push                 r5
   PushInt              0
-  PushConstant         CP#28
+  PushConstant         CP#27
   StoreIndexedTOS
   Push                 r5
   PushInt              1
@@ -420,14 +421,14 @@
   StoreIndexedTOS
   Push                 r5
   PushInt              2
-  PushConstant         CP#29
+  PushConstant         CP#28
   StoreIndexedTOS
   Push                 r5
   PushInt              3
   Push                 r0
   LoadContextVar       0, 2
   StoreIndexedTOS
-  DirectCall           CP#21, 1
+  DirectCall           CP#20, 1
   DirectCall           CP#4, 1
   Drop1
   Jump                 L1
@@ -646,7 +647,9 @@
   StoreFieldTOS        CP#7
   PopLocal             r7
   Push                 r7
-  DynamicCall          CP#20, 1
+  StoreLocal           r8
+  Push                 r8
+  UncheckedClosureCall CP#19, 1
   Drop1
   Jump                 L4
 Try #1 end:
@@ -656,7 +659,7 @@
   PopLocal             r0
   MoveSpecial          exception, r5
   MoveSpecial          stackTrace, r6
-  PushConstant         CP#22
+  PushConstant         CP#21
   DirectCall           CP#3, 1
   Drop1
   Push                 r5
@@ -665,7 +668,7 @@
 L4:
   Push                 r5
   PopLocal             r0
-  PushConstant         CP#22
+  PushConstant         CP#21
   DirectCall           CP#3, 1
   Drop1
   Jump                 L5
@@ -676,7 +679,7 @@
   PopLocal             r0
   MoveSpecial          exception, r3
   MoveSpecial          stackTrace, r4
-  PushConstant         CP#24
+  PushConstant         CP#23
   DirectCall           CP#3, 1
   Drop1
   Push                 r3
@@ -685,12 +688,12 @@
 L5:
   Push                 r3
   PopLocal             r0
-  PushConstant         CP#24
+  PushConstant         CP#23
   DirectCall           CP#3, 1
   Drop1
   Jump                 L2
 L2:
-  PushConstant         CP#25
+  PushConstant         CP#24
   DirectCall           CP#3, 1
   Drop1
   Jump                 L3
@@ -699,8 +702,8 @@
   ReturnTOS
 }
 ExceptionsTable {
-  try-index 0, outer -1, start 53, end 158, handler 158, needs-stack-trace, types [CP#21]
-  try-index 1, outer 0, start 70, end 120, handler 120, needs-stack-trace, types [CP#21]
+  try-index 0, outer -1, start 53, end 162, handler 162, needs-stack-trace, types [CP#20]
+  try-index 1, outer 0, start 70, end 124, handler 124, needs-stack-trace, types [CP#20]
 }
 ConstantPool {
   [0] = InterfaceCall 'dart:core::Object::==', ArgDesc num-args 2, num-type-args 0, names []
@@ -723,12 +726,11 @@
   [17] = InstanceField dart:core::_Closure::_function (field)
   [18] = Reserved
   [19] = ObjectRef ArgDesc num-args 1, num-type-args 0, names []
-  [20] = ICData dynamic target-name 'call', arg-desc CP#19
-  [21] = Type dynamic
-  [22] = ObjectRef 'finally 1'
-  [23] = ObjectRef 'after try 1'
-  [24] = ObjectRef 'finally 2'
-  [25] = ObjectRef 'case 2'
+  [20] = Type dynamic
+  [21] = ObjectRef 'finally 1'
+  [22] = ObjectRef 'after try 1'
+  [23] = ObjectRef 'finally 2'
+  [24] = ObjectRef 'case 2'
 }
 Closure #lib::testTryFinally2::'foo' () -> void
 ClosureCode {
@@ -1023,23 +1025,23 @@
     try {
       dart.core::print("danger!");
     }
-    on dart.core::TypeError catch(no-exception-var) {
+    on dart.core::TypeError* catch(no-exception-var) {
       dart.core::print("caught type error");
     }
-    on dart.core::AssertionError catch(final dart.core::AssertionError e) {
+    on dart.core::AssertionError* catch(final dart.core::AssertionError* e) {
       dart.core::print("caught assertion error ${e}");
     }
-    on dart.core::Error catch(final dart.core::Error e, final dart.core::StackTrace st) {
+    on dart.core::Error* catch(final dart.core::Error* e, final dart.core::StackTrace* st) {
       dart.core::print("caught error ${e} ${st}");
     }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
+    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
       dart.core::print("caught something ${e} ${st}");
     }
   }
   static method testTryCatch3() → dynamic {
-    dart.core::int x = 1;
+    dart.core::int* x = 1;
     try {
-      dart.core::int y = 2;
+      dart.core::int* y = 2;
       function foo() → void {
         try {
           dart.core::print("danger foo");
@@ -1049,23 +1051,23 @@
           y = 3;
         }
       }
-      [@vm.call-site-attributes.metadata=receiverType:() → void] foo.call();
+      [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
       dart.core::print(y);
     }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
+    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
       dart.core::print("caught ${e} ${st}");
       function bar() → void {
         try {
           dart.core::print("danger bar");
         }
-        on dart.core::Error catch(final dart.core::Error e) {
+        on dart.core::Error* catch(final dart.core::Error* e) {
           dart.core::print("error ${e}, captured stack trace: ${st}");
         }
       }
       return bar;
     }
   }
-  static method testRethrow(dart.core::bool cond) → dynamic {
+  static method testRethrow(dart.core::bool* cond) → dynamic {
     try {
       try {
         dart.core::print("try 1 > try 2");
@@ -1082,14 +1084,14 @@
         }
       }
     }
-    on dynamic catch(final dynamic e, final dart.core::StackTrace st) {
+    on dynamic catch(final dynamic e, final dart.core::StackTrace* st) {
       dart.core::print("catch 1");
       dart.core::print(st);
     }
   }
   static method testTryFinally1() → dynamic {
     #L1:
-    for (dart.core::int i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
+    for (dart.core::int* i = 0; i.{dart.core::num::<}(10); i = i.{dart.core::num::+}(1)) {
       try {
         if(i.{dart.core::num::>}(5)) {
           break #L1;
@@ -1100,22 +1102,22 @@
       }
     }
   }
-  static method testTryFinally2(dart.core::int x) → dynamic {
+  static method testTryFinally2(dart.core::int* x) → dynamic {
     #L2:
     switch(x) {
       #L3:
-      case 1:
+      case #C1:
         {
           try {
             dart.core::print("before try 1");
-            dart.core::int y = 3;
+            dart.core::int* y = 3;
             try {
               dart.core::print("try");
               function foo() → void {
                 dart.core::print(x);
                 dart.core::print(y);
               }
-              [@vm.call-site-attributes.metadata=receiverType:() → void] foo.call();
+              [@vm.call-site-attributes.metadata=receiverType:() →* void] foo.call();
               continue #L4;
             }
             finally {
@@ -1129,7 +1131,7 @@
           break #L2;
         }
       #L4:
-      case 2:
+      case #C2:
         {
           dart.core::print("case 2");
           break #L2;
@@ -1137,10 +1139,10 @@
     }
   }
   static method testTryFinally3() → dynamic {
-    dart.core::int x = 11;
+    dart.core::int* x = 11;
     dynamic y;
     try {
-      y = () → dart.core::int {
+      y = () → dart.core::int* {
         dart.core::print(x);
         try {
           dart.core::print("try 1");
@@ -1176,3 +1178,7 @@
   }
   static method main() → dynamic {}
 }
+constants  {
+  #C1 = 1
+  #C2 = 2
+}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart b/pkg/vm/testcases/bytecode/type_ops.dart
index 687d58f..d9ff5eb 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart
+++ b/pkg/vm/testcases/bytecode/type_ops.dart
@@ -60,4 +60,17 @@
   void foo6<T extends P, U extends List<T>>(Map<T, U> map) {}
 }
 
+abstract class F<T> {
+  void foo7<Q extends T>(Q a, covariant num b, T c);
+  void foo8<Q extends T>(Q a, covariant num b, T c);
+}
+
+class G<T> {
+  void foo7<Q extends T>(Q a, int b, T c) {}
+}
+
+class H<T> extends G<T> implements F<T> {
+  void foo8<Q extends T>(Q a, int b, T c) {}
+}
+
 main() {}
diff --git a/pkg/vm/testcases/bytecode/type_ops.dart.expect b/pkg/vm/testcases/bytecode/type_ops.dart.expect
index 0e84cb2..9804186 100644
--- a/pkg/vm/testcases/bytecode/type_ops.dart.expect
+++ b/pkg/vm/testcases/bytecode/type_ops.dart.expect
@@ -411,6 +411,7 @@
   InstantiateTypeArgumentsTOS 0, CP#1
   PopLocal             r0
 L1:
+  JumpIfUnchecked      L2
   Push                 FP[-6]
   LoadTypeArgumentsField CP#0
   Push                 r0
@@ -418,6 +419,7 @@
   PushConstant         CP#3
   PushConstant         CP#4
   AssertSubtype
+L2:
   PushNull
   ReturnTOS
 }
@@ -430,70 +432,324 @@
   [4] = ObjectRef 'T'
 }
 
+Class 'F', script = '#lib', abstract
+    type-params <dart:core::Object T> (args: 1)
+    extends dart:core::Object
+
+
+Function '', constructor, reflectable
+    parameters [] (required: 0)
+    return-type #lib::F < #lib::F::TypeParam/0 >
+
+Bytecode {
+  Entry                0
+  CheckStack           0
+  Push                 FP[-5]
+  DirectCall           CP#0, 1
+  Drop1
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = Reserved
+}
+
+
+Function 'foo7', abstract, reflectable, debuggable
+    type-params <#lib::F::TypeParam/0 Q>
+    parameters [#lib::F::foo7::TypeParam/0 'a', dart:core::num 'b', #lib::F::TypeParam/0 'c'] (required: 3)
+    return-type void
+
+Function 'foo8', abstract, reflectable, debuggable
+    type-params <#lib::F::TypeParam/0 Q>
+    parameters [#lib::F::foo8::TypeParam/0 'a', dart:core::num 'b', #lib::F::TypeParam/0 'c'] (required: 3)
+    return-type void
+Class 'G', script = '#lib'
+    type-params <dart:core::Object T> (args: 1)
+    extends dart:core::Object
+
+
+Function '', constructor, reflectable
+    parameters [] (required: 0)
+    return-type #lib::G < #lib::G::TypeParam/0 >
+
+Bytecode {
+  Entry                0
+  CheckStack           0
+  Push                 FP[-5]
+  DirectCall           CP#0, 1
+  Drop1
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = DirectCall 'dart:core::Object:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = Reserved
+}
+
+
+Function 'foo7', reflectable, debuggable
+    type-params <#lib::G::TypeParam/0 Q>
+    parameters [#lib::G::foo7::TypeParam/0 'a', dart:core::int 'b', #lib::G::TypeParam/0 'c'] (required: 3)
+    return-type void
+
+Bytecode {
+  Entry                1
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
+  JumpIfNotZeroTypeArgs L1
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  PopLocal             r0
+L1:
+  JumpIfUnchecked      L2
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  Push                 r0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  AssertSubtype
+  Push                 FP[-5]
+  PushConstant         CP#2
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  PushNull
+  PushConstant         CP#4
+  AssertAssignable     0, CP#5
+  Drop1
+L2:
+  PushNull
+  ReturnTOS
+}
+Parameter flags: [0, 0, 2]
+Default function type arguments: CP#6
+ConstantPool {
+  [0] = TypeArgumentsField #lib::G
+  [1] = Type #lib::G::foo7::TypeParam/0
+  [2] = Type #lib::G::TypeParam/0
+  [3] = ObjectRef 'Q'
+  [4] = ObjectRef 'c'
+  [5] = SubtypeTestCache
+  [6] = ObjectRef < #lib::G::TypeParam/0 >
+}
+
+Class 'H', script = '#lib'
+    type-params <dart:core::Object T> (args: 1)
+    extends #lib::G < #lib::H::TypeParam/0 >
+    implements [#lib::F < #lib::H::TypeParam/0 >]
+
+
+Function '', constructor, reflectable
+    parameters [] (required: 0)
+    return-type #lib::H < #lib::H::TypeParam/0 >
+
+Bytecode {
+  Entry                0
+  CheckStack           0
+  Push                 FP[-5]
+  DirectCall           CP#0, 1
+  Drop1
+  PushNull
+  ReturnTOS
+}
+ConstantPool {
+  [0] = DirectCall '#lib::G:: (constructor)', ArgDesc num-args 1, num-type-args 0, names []
+  [1] = Reserved
+}
+
+
+Function 'foo8', reflectable, debuggable
+    type-params <#lib::H::TypeParam/0 Q>
+    parameters [#lib::H::foo8::TypeParam/0 'a', dart:core::int 'b', #lib::H::TypeParam/0 'c'] (required: 3)
+    return-type void
+
+Bytecode {
+  Entry                1
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
+  JumpIfNotZeroTypeArgs L1
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  PopLocal             r0
+L1:
+  JumpIfUnchecked      L2
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  Push                 r0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  AssertSubtype
+  Push                 FP[-5]
+  PushConstant         CP#2
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  PushNull
+  PushConstant         CP#4
+  AssertAssignable     0, CP#5
+  Drop1
+L2:
+  PushNull
+  ReturnTOS
+}
+Parameter flags: [0, 0, 2]
+Default function type arguments: CP#6
+ConstantPool {
+  [0] = TypeArgumentsField #lib::H
+  [1] = Type #lib::H::foo8::TypeParam/0
+  [2] = Type #lib::H::TypeParam/0
+  [3] = ObjectRef 'Q'
+  [4] = ObjectRef 'c'
+  [5] = SubtypeTestCache
+  [6] = ObjectRef < #lib::H::TypeParam/0 >
+}
+
+
+Function 'foo7', reflectable, debuggable, forwarding-stub
+    type-params <#lib::H::TypeParam/0 Q>
+    parameters [#lib::H::foo7::TypeParam/0 'a', dart:core::num 'b', #lib::H::TypeParam/0 'c'] (required: 3)
+    return-type void
+
+Bytecode {
+  Entry                2
+  CheckStack           0
+  CheckFunctionTypeArgs 1, r0
+  JumpIfUnchecked      L1
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  Push                 r0
+  PushConstant         CP#1
+  PushConstant         CP#2
+  PushConstant         CP#3
+  AssertSubtype
+  Push                 FP[-5]
+  PushConstant         CP#2
+  Push                 FP[-8]
+  LoadTypeArgumentsField CP#0
+  PushNull
+  PushConstant         CP#4
+  AssertAssignable     0, CP#5
+  Drop1
+L1:
+  Push                 FP[-6]
+  PushConstant         CP#6
+  PushNull
+  PushNull
+  PushConstant         CP#7
+  AssertAssignable     1, CP#8
+  Drop1
+  Push                 r0
+  Push                 FP[-8]
+  Push                 FP[-7]
+  Push                 FP[-6]
+  Push                 FP[-5]
+  DirectCall           CP#9, 5
+  ReturnTOS
+}
+Parameter flags: [0, 1, 2]
+Forwarding stub target: CP#11
+ConstantPool {
+  [0] = TypeArgumentsField #lib::H
+  [1] = Type #lib::H::foo7::TypeParam/0
+  [2] = Type #lib::H::TypeParam/0
+  [3] = ObjectRef 'Q'
+  [4] = ObjectRef 'c'
+  [5] = SubtypeTestCache
+  [6] = Type dart:core::int
+  [7] = ObjectRef 'b'
+  [8] = SubtypeTestCache
+  [9] = DirectCall '#lib::G::foo7', ArgDesc num-args 4, num-type-args 1, names []
+  [10] = Reserved
+  [11] = ObjectRef #lib::G::foo7
+}
+
 
 }
 ]library #lib from "#lib" as #lib {
 
-  class A<T extends dart.core::Object = dynamic> extends dart.core::Object {
-    synthetic constructor •() → #lib::A<#lib::A::T>
+  class A<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::A<#lib::A::T*>*
       : super dart.core::Object::•()
       ;
   }
-  class B extends #lib::A<dart.core::String> {
-    synthetic constructor •() → #lib::B
+  class B extends #lib::A<dart.core::String*> {
+    synthetic constructor •() → #lib::B*
       : super #lib::A::•()
       ;
   }
-  class C<T1 extends dart.core::Object = dynamic, T2 extends dart.core::Object = dynamic, T3 extends dart.core::Object = dynamic> extends #lib::B {
-    synthetic constructor •() → #lib::C<#lib::C::T1, #lib::C::T2, #lib::C::T3>
+  class C<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic, T3 extends dart.core::Object* = dynamic> extends #lib::B {
+    synthetic constructor •() → #lib::C<#lib::C::T1*, #lib::C::T2*, #lib::C::T3*>*
       : super #lib::B::•()
       ;
   }
-  class D<P extends dart.core::Object = dynamic, Q extends dart.core::Object = dynamic> extends #lib::C<dart.core::int, #lib::D::Q, #lib::D::P> {
-    generic-covariant-impl field dart.core::Map<#lib::D::P, #lib::D::Q> foo;
-    constructor •(dynamic tt) → #lib::D<#lib::D::P, #lib::D::Q>
-      : #lib::D::foo = tt as{TypeError} dart.core::Map<#lib::D::P, #lib::D::Q>, super #lib::C::•()
+  class D<P extends dart.core::Object* = dynamic, Q extends dart.core::Object* = dynamic> extends #lib::C<dart.core::int*, #lib::D::Q*, #lib::D::P*> {
+    generic-covariant-impl field dart.core::Map<#lib::D::P*, #lib::D::Q*>* foo;
+    constructor •(dynamic tt) → #lib::D<#lib::D::P*, #lib::D::Q*>*
+      : #lib::D::foo = tt as{TypeError} dart.core::Map<#lib::D::P*, #lib::D::Q*>*, super #lib::C::•()
       ;
     method foo2(dynamic y) → dynamic {
-      if(y is #lib::A<#lib::D::P>) {
+      if(y is #lib::A<#lib::D::P*>*) {
         dart.core::print("21");
       }
-      if(y is #lib::C<dynamic, #lib::D::Q, dart.core::List<#lib::D::P>>) {
+      if(y is #lib::C<dynamic, #lib::D::Q*, dart.core::List<#lib::D::P*>*>*) {
         dart.core::print("22");
       }
-      [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D::P, #lib::D::Q>] this.{#lib::D::foo} = y as{TypeError} dart.core::Map<#lib::D::P, #lib::D::Q>;
+      [@vm.call-site-attributes.metadata=receiverType:#lib::D<#lib::D::P*, #lib::D::Q*>*] this.{#lib::D::foo} = y as{TypeError} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
     }
-    method foo3<T1 extends dart.core::Object = dynamic, T2 extends dart.core::Object = dynamic>(dynamic z) → dynamic {
-      if(z is #lib::A<#lib::D::foo3::T1>) {
+    method foo3<T1 extends dart.core::Object* = dynamic, T2 extends dart.core::Object* = dynamic>(dynamic z) → dynamic {
+      if(z is #lib::A<#lib::D::foo3::T1*>*) {
         dart.core::print("31");
       }
-      if(z is #lib::C<dart.core::Map<#lib::D::foo3::T1, #lib::D::P>, dart.core::List<#lib::D::foo3::T2>, #lib::D::Q>) {
+      if(z is #lib::C<dart.core::Map<#lib::D::foo3::T1*, #lib::D::P*>*, dart.core::List<#lib::D::foo3::T2*>*, #lib::D::Q*>*) {
         dart.core::print("32");
       }
-      return (z as dart.core::Map<#lib::D::foo3::T2, #lib::D::Q>).{dart.core::Map::values};
+      return (z as dart.core::Map<#lib::D::foo3::T2*, #lib::D::Q*>*).{dart.core::Map::values};
     }
-    method foo4(dynamic w) → dart.core::Map<#lib::D::P, #lib::D::Q> {
-      dart.core::List<dart.core::Map<#lib::D::P, #lib::D::Q>> list = <dart.core::Map<#lib::D::P, #lib::D::Q>>[w as{TypeError} dart.core::Map<#lib::D::P, #lib::D::Q>];
-      return w as{TypeError} dart.core::Map<#lib::D::P, #lib::D::Q>;
+    method foo4(dynamic w) → dart.core::Map<#lib::D::P*, #lib::D::Q*>* {
+      dart.core::List<dart.core::Map<#lib::D::P*, #lib::D::Q*>*>* list = <dart.core::Map<#lib::D::P*, #lib::D::Q*>*>[w as{TypeError} dart.core::Map<#lib::D::P*, #lib::D::Q*>*];
+      return w as{TypeError} dart.core::Map<#lib::D::P*, #lib::D::Q*>*;
     }
   }
-  class E<P extends dart.core::String = dart.core::String> extends dart.core::Object {
-    static factory •<P extends dart.core::String = dynamic>() → #lib::E<#lib::E::•::P>
+  class E<P extends dart.core::String* = dart.core::String*> extends dart.core::Object {
+    static factory •<P extends dart.core::String* = dynamic>() → #lib::E<#lib::E::•::P*>*
       return null;
-    method foo6<generic-covariant-impl T extends #lib::E::P = #lib::E::P, U extends dart.core::List<#lib::E::foo6::T> = dart.core::List<#lib::E::P>>(dart.core::Map<#lib::E::foo6::T, #lib::E::foo6::U> map) → void {}
+    method foo6<generic-covariant-impl T extends #lib::E::P* = #lib::E::P*, U extends dart.core::List<#lib::E::foo6::T*>* = dart.core::List<#lib::E::P*>*>(dart.core::Map<#lib::E::foo6::T*, #lib::E::foo6::U*>* map) → void {}
   }
-  static field dart.core::List<dart.core::Iterable<dynamic>> globalVar;
+  abstract class F<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::F<#lib::F::T*>*
+      : super dart.core::Object::•()
+      ;
+    abstract method foo7<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo7::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
+    abstract method foo8<generic-covariant-impl Q extends #lib::F::T* = #lib::F::T*>(#lib::F::foo8::Q* a, covariant dart.core::num* b, generic-covariant-impl #lib::F::T* c) → void;
+  }
+  class G<T extends dart.core::Object* = dynamic> extends dart.core::Object {
+    synthetic constructor •() → #lib::G<#lib::G::T*>*
+      : super dart.core::Object::•()
+      ;
+    method foo7<generic-covariant-impl Q extends #lib::G::T* = #lib::G::T*>(#lib::G::foo7::Q* a, dart.core::int* b, generic-covariant-impl #lib::G::T* c) → void {}
+  }
+  class H<T extends dart.core::Object* = dynamic> extends #lib::G<#lib::H::T*> implements #lib::F<#lib::H::T*> {
+    synthetic constructor •() → #lib::H<#lib::H::T*>*
+      : super #lib::G::•()
+      ;
+    method foo8<generic-covariant-impl Q extends #lib::H::T* = #lib::H::T*>(#lib::H::foo8::Q* a, dart.core::int* b, generic-covariant-impl #lib::H::T* c) → void {}
+    forwarding-stub method foo7<generic-covariant-impl Q extends #lib::H::T*>(#lib::H::foo7::Q a, covariant dart.core::num* b, generic-covariant-impl #lib::H::T* c) → void
+      return super.{#lib::G::foo7}<#lib::H::foo7::Q*>(a, b, c);
+  }
+  static field dart.core::List<dart.core::Iterable<dynamic>*>* globalVar;
   static method foo1(dynamic x) → dynamic {
-    if(x is #lib::B) {
+    if(x is #lib::B*) {
       dart.core::print("11");
     }
-    if(x is #lib::C<dart.core::int, dart.core::Object, dynamic>) {
+    if(x is #lib::C<dart.core::int*, dart.core::Object*, dynamic>*) {
       dart.core::print("12");
     }
-    return x as #lib::A<dart.core::int>;
+    return x as #lib::A<dart.core::int*>*;
   }
   static method foo5(dynamic x) → void {
-    #lib::globalVar = x as{TypeError} dart.core::List<dart.core::Iterable<dynamic>>;
+    #lib::globalVar = x as{TypeError} dart.core::List<dart.core::Iterable<dynamic>*>*;
   }
   static method main() → dynamic {}
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
index bf7dfc6..c6072b8 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/bool_expressions.dart.expect
@@ -6,24 +6,24 @@
 RESULT: _T {}?
 ------------ #lib::bool_expressions ------------
 t0* = _Call direct [#lib::foo] ()
-t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
+t1 = _TypeCheck (t0 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
 t2* = _Call direct [#lib::bar] ()
-t3* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
-i = _Join [dart.core::int] (_T (dart.core::_Smi), t3)
+t3* = _Call [dart.core::num::+] (_T (dart.core::int*)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int*] (_T (dart.core::_Smi), t3)
 t5* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
 t6* = _Call direct [#lib::bar] ()
-x = _Join [dart.core::bool] (t6, _T (dart.core::bool)+)
+x = _Join [dart.core::bool*] (t6, _T (dart.core::bool*)+)
 t8* = _Call direct [#lib::foo] ()
-t9 = _Join [dynamic] (_T (dart.core::bool)+, t8)
+t9 = _Join [dynamic] (_T (dart.core::bool*)+, t8)
 t10 = _Narrow (t9 to _T ANY?)
-t11 = _TypeCheck (t10 against dart.core::bool) (for (x{dart.core::bool} ?{dynamic} true : #lib::foo()) as{TypeError} dart.core::bool)
+t11 = _TypeCheck (t10 against dart.core::bool) (for (x{dart.core::bool*} ?{dynamic} true : #lib::foo()) as{TypeError} dart.core::bool*)
 t12* = _Call direct [#lib::bar] ()
 t13* = _Call direct [#lib::bar] ()
 t14* = _Call direct [#lib::foo] ()
-t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
+t15 = _TypeCheck (t14 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
 t16* = _Call direct [#lib::foo] ()
-t17 = _TypeCheck (t16 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool)
-y = _Join [dart.core::bool] (_T (dart.core::bool)+, t11, _T (dart.core::bool)+, _T (dart.core::bool)+)
+t17 = _TypeCheck (t16 against dart.core::bool) (for #lib::foo() as{TypeError} dart.core::bool*)
+y = _Join [dart.core::bool*] (_T (dart.core::bool*)+, t11, _T (dart.core::bool*)+, _T (dart.core::bool*)+)
 RESULT: _T {}?
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
index 9843dc5..5f9c5dd 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/calls.dart.expect
@@ -1,80 +1,80 @@
 ------------ #lib::A:: ------------
-%this = _Parameter #0 [_T (#lib::A)+]
+%this = _Parameter #0 [_T (#lib::A*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::A::foo1 ------------
-%this = _Parameter #0 [_T (#lib::A)+]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%this = _Parameter #0 [_T (#lib::A*)+]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 RESULT: _T {}?
 ------------ #lib::B:: ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::B::bar1 ------------
-%this = _Parameter #0 [_T (#lib::B)+]
-%arg = _Parameter #1 [_T (dart.core::Object)+?]
+%this = _Parameter #0 [_T (#lib::B*)+]
+%arg = _Parameter #1 [_T (dart.core::Object*)+?]
 RESULT: _T {}?
 ------------ #lib::B::bar2 ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 RESULT: _T {}?
 ------------ #lib::B::bar3 ------------
-%this = _Parameter #0 [_T (#lib::B)+]
-%y = _Parameter #1 [_T (dart.core::int)+?]
+%this = _Parameter #0 [_T (#lib::B*)+]
+%y = _Parameter #1 [_T (dart.core::int*)+?]
 RESULT: _T {}?
 ------------ #lib::B::bar4 ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 RESULT: _T {}?
 ------------ #lib::C:: ------------
-%this = _Parameter #0 [_T (#lib::C)+]
+%this = _Parameter #0 [_T (#lib::C*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::C::interfaceCalls ------------
-%this = _Parameter #0 [_T (#lib::C)+]
-%aa = _Parameter #1 [_T (#lib::A)+?]
-%a2 = _Parameter #2 [_T (dart.core::Object)+?]
-%a3 = _Parameter #3 [_T (dart.core::Object)+?]
-%a4 = _Parameter #4 [_T (dart.core::Object)+?]
+%this = _Parameter #0 [_T (#lib::C*)+]
+%aa = _Parameter #1 [_T (#lib::A*)+?]
+%a2 = _Parameter #2 [_T (dart.core::Object*)+?]
+%a3 = _Parameter #3 [_T (dart.core::Object*)+?]
+%a4 = _Parameter #4 [_T (dart.core::Object*)+?]
 t5 = _Call direct [#lib::B::] (_T (#lib::B))
 t6 = _Call [#lib::A::foo1] (%aa, _T (#lib::B))
 t7* = _Call get [#lib::A::foo2] (%aa)
-t8 = _TypeCheck (t7 against dart.core::int) (for aa.{#lib::A::foo2} as{TypeError} dart.core::int)
+t8 = _TypeCheck (t7 against dart.core::int) (for aa.{#lib::A::foo2} as{TypeError} dart.core::int*)
 t9 = _Call set [#lib::A::foo3] (%aa, t8)
 t10* = _Call get [#lib::A::foo1] (%aa)
 t11* = _Call get [#lib::A::foo2] (%aa)
 t12 = _Call dynamic [call] (t11, %a2, %a3, t10)
-a4 = _Join [dart.core::Object] (%a4, _T ANY?)
+a4 = _Join [dart.core::Object*] (%a4, _T ANY?)
 RESULT: a4
 ------------ #lib::C::dynamicCalls ------------
-%this = _Parameter #0 [_T (#lib::C)+]
+%this = _Parameter #0 [_T (#lib::C*)+]
 %aa = _Parameter #1 [_T ANY?]
-%a2 = _Parameter #2 [_T (dart.core::Object)+?]
-%a3 = _Parameter #3 [_T (dart.core::Object)+?]
-%a4 = _Parameter #4 [_T (dart.core::Object)+?]
+%a2 = _Parameter #2 [_T (dart.core::Object*)+?]
+%a3 = _Parameter #3 [_T (dart.core::Object*)+?]
+%a4 = _Parameter #4 [_T (dart.core::Object*)+?]
 t5 = _Call direct [#lib::B::] (_T (#lib::B))
 t6 = _Call dynamic [foo1] (%aa, _T (#lib::B))
 t7* = _Call dynamic get [foo2] (%aa)
 t8 = _Call dynamic set [foo3] (%aa, t7)
 t9* = _Call dynamic get [foo1] (%aa)
 t10* = _Call dynamic [foo2] (%aa, %a2, %a3, t9)
-a4 = _Join [dart.core::Object] (%a4, t10)
+a4 = _Join [dart.core::Object*] (%a4, t10)
 RESULT: a4
 ------------ #lib::D:: ------------
-%this = _Parameter #0 [_T (#lib::D)+]
+%this = _Parameter #0 [_T (#lib::D*)+]
 t1 = _Call direct [#lib::B::] (%this)
 RESULT: _T {}?
 ------------ #lib::D::superCalls ------------
-%this = _Parameter #0 [_T (#lib::D)+]
-%a1 = _Parameter #1 [_T (dart.core::Object)+?]
-%a2 = _Parameter #2 [_T (dart.core::Object)+?]
-%a3 = _Parameter #3 [_T (dart.core::Object)+?]
-%a4 = _Parameter #4 [_T (dart.core::Object)+?]
+%this = _Parameter #0 [_T (#lib::D*)+]
+%a1 = _Parameter #1 [_T (dart.core::Object*)+?]
+%a2 = _Parameter #2 [_T (dart.core::Object*)+?]
+%a3 = _Parameter #3 [_T (dart.core::Object*)+?]
+%a4 = _Parameter #4 [_T (dart.core::Object*)+?]
 t5 = _Call direct [#lib::B::bar1] (%this, %a1)
 t6* = _Call direct get [#lib::B::bar4] (%this)
 t7 = _Call direct set [#lib::B::bar3] (%this, t6)
 t8* = _Call direct get [#lib::B::bar2] (%this)
 t9* = _Call direct get [#lib::B::bar1] (%this)
 t10* = _Call dynamic [call] (t8, %a2, %a3, t9)
-a4 = _Join [dart.core::Object] (%a4, t10)
+a4 = _Join [dart.core::Object*] (%a4, t10)
 RESULT: a4
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
index 0163697..4a9d2ed 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_basic.dart.expect
@@ -1,86 +1,86 @@
 ------------ #lib::C:: ------------
-%this = _Parameter #0 [_T (#lib::C<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C<dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::C::foo ------------
-%this = _Parameter #0 [_T (#lib::C<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C<dynamic>*)+]
 t1 = _Extract (%this[#lib::C/0])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3 = _Call direct [#lib::D::] (t2)
 RESULT: t2
 ------------ #lib::C::id1 ------------
-%this = _Parameter #0 [_T (#lib::C<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C<dynamic>*)+]
 %x = _Parameter #1
 t2 = _Extract (%this[#lib::C/0])
 t3 = _TypeCheck (%x against t2) (for x)
 RESULT: t3
 ------------ #lib::C::id2 ------------
-%this = _Parameter #0 [_T (#lib::C<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C<dynamic>*)+]
 %x = _Parameter #1
 t2 = _Extract (%this[#lib::C/0])
 t3 = _TypeCheck (%x against t2) (for x)
 RESULT: t3
 ------------ #lib::D:: ------------
-%this = _Parameter #0 [_T (#lib::D<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::D<dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::E:: ------------
-%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>*)+]
 t1 = _Call direct [#lib::C::] (%this)
 RESULT: _T {}?
 ------------ #lib::E::foo ------------
-%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>*)+]
 t1* = _Call direct [#lib::C::foo] (%this)
 RESULT: t1
 ------------ #lib::E::bar ------------
-%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>*)+]
 t1 = _Extract (%this[#lib::E/0])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3 = _Call direct [#lib::D::] (t2)
 RESULT: t2
 ------------ #lib::E::baz ------------
-%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::E<dynamic, dynamic>*)+]
 t1 = _Extract (%this[#lib::E/1])
 t2 = _CreateConcreteType (#lib::D @ (t1))
 t3 = _Call direct [#lib::D::] (t2)
 RESULT: t2
 ------------ #lib::X:: ------------
-%this = _Parameter #0 [_T (#lib::X)+]
+%this = _Parameter #0 [_T (#lib::X*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::Y:: ------------
-%this = _Parameter #0 [_T (#lib::Y)+]
+%this = _Parameter #0 [_T (#lib::Y*)+]
 t1 = _Call direct [#lib::X::] (%this)
 RESULT: _T {}?
 ------------ #lib::Z:: ------------
-%this = _Parameter #0 [_T (#lib::Z)+]
+%this = _Parameter #0 [_T (#lib::Z*)+]
 t1 = _Call direct [#lib::X::] (%this)
 RESULT: _T {}?
 ------------ #lib::I:: ------------
-%this = _Parameter #0 [_T (#lib::I<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::I<dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::J:: ------------
-%this = _Parameter #0 [_T (#lib::J)+]
+%this = _Parameter #0 [_T (#lib::J*)+]
 t1 = _Call direct [#lib::I::] (%this)
 RESULT: _T {}?
 ------------ #lib::K:: ------------
-%this = _Parameter #0 [_T (#lib::K<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::K<dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::C2:: ------------
-%this = _Parameter #0 [_T (#lib::C2<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C2<dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::C2::id3 ------------
-%this = _Parameter #0 [_T (#lib::C2<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C2<dynamic>*)+]
 %x = _Parameter #1
 t2 = _Extract (%this[#lib::C2/0])
 t3 = _CreateRuntimeType (dart.core::Comparable @ (t2))
 t4 = _TypeCheck (%x against t3) (for x)
 RESULT: t4
 ------------ #lib::C2::id4 ------------
-%this = _Parameter #0 [_T (#lib::C2<dynamic>)+]
+%this = _Parameter #0 [_T (#lib::C2<dynamic>*)+]
 %x = _Parameter #1
 t2 = _Extract (%this[#lib::C2/0])
 t3 = _CreateRuntimeType (#lib::I @ (t2))
@@ -102,7 +102,7 @@
 t11 = _Call direct [#lib::Z::] (_T (#lib::Z))
 t12 = _Call [#lib::C::id2] (_T (#lib::C<#lib::Y>), _T (#lib::Z))
 t13 = _Call direct [#lib::C2::] (_T (#lib::C2<dart.core::num>))
-t14 = _Call [#lib::C2::id3] (_T (#lib::C2<dart.core::num>), _T (dart.core::double)+)
+t14 = _Call [#lib::C2::id3] (_T (#lib::C2<dart.core::num>), _T (dart.core::double*)+)
 t15 = _Call direct [#lib::K::] (_T (#lib::K<#lib::J>))
 t16 = _Call [#lib::C2::id4] (_T (#lib::C2<dart.core::num>), _T (#lib::K<#lib::J>))
 used = _Join [dynamic] (_T {}?, t1, t3, t5, t7)
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
index 2095424..1f6fa5b 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/class_generics_case1.dart.expect
@@ -1,5 +1,5 @@
 ------------ #lib::Element:: ------------
-%this = _Parameter #0 [_T (#lib::Element)+]
+%this = _Parameter #0 [_T (#lib::Element*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::MockHashMap:: ------------
@@ -9,11 +9,11 @@
 t3 = _Call direct [#lib::_NotRealHashMap::] (t2)
 RESULT: t2
 ------------ #lib::_NotRealHashMap:: ------------
-%this = _Parameter #0 [_T (#lib::_NotRealHashMap<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::_NotRealHashMap<dynamic, dynamic>*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::_NotRealHashMap::setEntry ------------
-%this = _Parameter #0 [_T (#lib::_NotRealHashMap<dynamic, dynamic>)+]
+%this = _Parameter #0 [_T (#lib::_NotRealHashMap<dynamic, dynamic>*)+]
 %key = _Parameter #1
 %value = _Parameter #2
 t3 = _Extract (%this[#lib::_NotRealHashMap/0])
@@ -22,18 +22,18 @@
 t6 = _TypeCheck (%value against t5) (for value)
 RESULT: _T {}?
 ------------ #lib::InheritedElement:: ------------
-%this = _Parameter #0 [_T (#lib::InheritedElement)+]
+%this = _Parameter #0 [_T (#lib::InheritedElement*)+]
 t1 = _Call direct [#lib::Element::] (%this)
 RESULT: _T {}?
 ------------ #lib::InheritedElement::setDependencies ------------
-%this = _Parameter #0 [_T (#lib::InheritedElement)+]
-%dependent = _Parameter #1 [_T (#lib::Element)+?]
-%value = _Parameter #2 [_T (dart.core::Object)+?]
+%this = _Parameter #0 [_T (#lib::InheritedElement*)+]
+%dependent = _Parameter #1 [_T (#lib::Element*)+?]
+%value = _Parameter #2 [_T (dart.core::Object*)+?]
 t3* = _Call virtual get [#lib::InheritedElement::_dependents] (%this)
 t4 = _Call [#lib::MockHashMap::setEntry] (t3, %dependent, %value)
 RESULT: _T {}?
 ------------ #lib::InheritedElement::_dependents ------------
-%this = _Parameter #0 [_T (#lib::InheritedElement)+]
+%this = _Parameter #0 [_T (#lib::InheritedElement*)+]
 t1* = _Call direct [#lib::MockHashMap::] (#lib::Element, dart.core::Object)
 RESULT: t1
 ------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
index 770e1df..5488d3d 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/hello.dart.expect
@@ -1,4 +1,4 @@
 ------------ #lib::main ------------
-%args = _Parameter #0 [_T (dart.core::List<dynamic>)+?]
+%args = _Parameter #0 [_T (dart.core::List<dynamic>*)+?]
 t1 = _Call direct [dart.core::print] (_T (dart.core::_OneByteString))
 RESULT: _T {}?
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
index 9a3e510..0546dec 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/implicit_return_null.dart.expect
@@ -1,5 +1,5 @@
 ------------ #lib::T:: ------------
-%this = _Parameter #0 [_T (#lib::T)+]
+%this = _Parameter #0 [_T (#lib::T*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::empty1 ------------
@@ -18,7 +18,7 @@
 t0 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::return2 ------------
-%i = _Parameter #0 [_T (dart.core::int)+?]
+%i = _Parameter #0 [_T (dart.core::int*)+?]
 t1* = _Call [dart.core::num::-] (%i, _T (dart.core::_Smi))
 t2* = _Call direct [#lib::return2] (t1)
 RESULT: t2
@@ -32,77 +32,77 @@
 t0 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T {}?
 ------------ #lib::expr2 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::expr3 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 t3 = _Call [dart.core::Object::toString] (%x)
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::throw1 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 RESULT: _T {}
 ------------ #lib::throw2 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::loop1 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 RESULT: _T {}?
 ------------ #lib::loop2 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::loop3 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%x = _Parameter #1 [_T (dart.core::Object)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%x = _Parameter #1 [_T (dart.core::Object*)+?]
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::switch_ ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
-%i = _Parameter #1 [_T (dart.core::int)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
+%i = _Parameter #1 [_T (dart.core::int*)+?]
 t2 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::if1 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::if2 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::if3 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 RESULT: _T {}?
 ------------ #lib::if4 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 RESULT: _T {}?
 ------------ #lib::if5 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1* = _Call direct [#lib::if5] (%c)
-t2* = _Call direct [#lib::if5] (_T (dart.core::bool)+)
+t2* = _Call direct [#lib::if5] (_T (dart.core::bool*)+)
 %result = _Join [void] (t1, t2, _T {}?)
 RESULT: %result
 ------------ #lib::label1 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
 ------------ #lib::try1 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
@@ -114,7 +114,7 @@
 t0 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::try4 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 %result = _Join [dynamic] (_T (#lib::T), _T {}?)
 RESULT: %result
@@ -125,7 +125,7 @@
 t0 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::try7 ------------
-%c = _Parameter #0 [_T (dart.core::bool)+?]
+%c = _Parameter #0 [_T (dart.core::bool*)+?]
 t1 = _Call direct [#lib::T::] (_T (#lib::T))
 RESULT: _T (#lib::T)
 ------------ #lib::main ------------
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/setter_result.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/setter_result.dart.expect
index e79a010..ceb6d33 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/setter_result.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/setter_result.dart.expect
@@ -1,43 +1,43 @@
 ------------ #lib::T:: ------------
-%this = _Parameter #0 [_T (#lib::T)+]
+%this = _Parameter #0 [_T (#lib::T*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::A:: ------------
-%this = _Parameter #0 [_T (#lib::A)+]
+%this = _Parameter #0 [_T (#lib::A*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::A::foo ------------
-%this = _Parameter #0 [_T (#lib::A)+]
+%this = _Parameter #0 [_T (#lib::A*)+]
 RESULT: _T {}?
 ------------ #lib::B:: ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 t1 = _Call direct [#lib::A::] (%this)
 RESULT: _T {}?
 ------------ #lib::B::foo ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 %x = _Parameter #1 [_T ANY?]
 RESULT: _T {}?
 ------------ #lib::B::testPropertySet ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 %x = _Parameter #1 [_T ANY?]
 t2 = _Call virtual set [#lib::B::foo] (%this, %x)
 t3 = _Call direct [#lib::use] (%x)
 RESULT: _T {}?
 ------------ #lib::B::testDynamicPropertySet ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 %x = _Parameter #1 [_T ANY?]
 %y = _Parameter #2 [_T ANY?]
 t3 = _Call dynamic set [foo] (%x, %y)
 t4 = _Call direct [#lib::use] (%y)
 RESULT: _T {}?
 ------------ #lib::B::testSuperPropertySet ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 %x = _Parameter #1 [_T ANY?]
 t2 = _Call direct set [#lib::A::foo] (%this, %x)
 t3 = _Call direct [#lib::use] (%x)
 RESULT: _T {}?
 ------------ #lib::B::testStaticPropertySet ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 %x = _Parameter #1 [_T ANY?]
 t2 = _Call direct set [#lib::B::bar] (%x)
 t3 = _Call direct [#lib::use] (%x)
diff --git a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
index 8fa3835..81dbe5b 100644
--- a/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/summary_collector/vars.dart.expect
@@ -1,45 +1,45 @@
 ------------ #lib::A:: ------------
-%this = _Parameter #0 [_T (#lib::A)+]
+%this = _Parameter #0 [_T (#lib::A*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::B:: ------------
-%this = _Parameter #0 [_T (#lib::B)+]
+%this = _Parameter #0 [_T (#lib::B*)+]
 t1 = _Call direct [dart.core::Object::] (%this)
 RESULT: _T {}?
 ------------ #lib::foo ------------
-%a1 = _Parameter #0 [_T (dart.core::Object)+?]
-%a2 = _Parameter #1 [_T (dart.core::Object)+?]
+%a1 = _Parameter #0 [_T (dart.core::Object*)+?]
+%a2 = _Parameter #1 [_T (dart.core::Object*)+?]
 t2* = _Call direct get [#lib::someStatic] ()
 t3 = _Call direct [#lib::A::] (_T (#lib::A))
-a1 = _Join [dart.core::Object] (%a1, _T (#lib::A), _T (#lib::B))
+a1 = _Join [dart.core::Object*] (%a1, _T (#lib::A), _T (#lib::B))
 t5 = _Call direct [#lib::bar] (a1, _T (dart.core::_Smi))
 t6 = _Call direct [#lib::B::] (_T (#lib::B))
 t7* = _Call [dart.core::Object::==] (a1, %a2)
-t8 = _Join [dart.core::Object] (a1, %a2)
-t9 = _Narrow (t8 to _T (dart.core::Object)+?)
+t8 = _Join [dart.core::Object*] (a1, %a2)
+t9 = _Narrow (t8 to _T (dart.core::Object*)+?)
 RESULT: t9
 ------------ #lib::bar ------------
-%a1 = _Parameter #0 [_T (dart.core::Object)+?]
-%a2 = _Parameter #1 [_T (dart.core::int)+?]
-t2 = _Narrow (%a1 to _T (dart.core::int)+)
+%a1 = _Parameter #0 [_T (dart.core::Object*)+?]
+%a2 = _Parameter #1 [_T (dart.core::int*)+?]
+t2 = _Narrow (%a1 to _T (dart.core::int*)+)
 t3* = _Call [dart.core::num::+] (t2, %a2)
 t4* = _Call [dart.core::num::*] (t3, _T (dart.core::_Smi))
 t5* = _Call [dart.core::int::unary-] (_T (dart.core::_Smi))
-%result = _Join [dart.core::int] (t4, t5)
+%result = _Join [dart.core::int*] (t4, t5)
 RESULT: %result
 ------------ #lib::loop1 ------------
-%a1 = _Parameter #0 [_T (dart.core::Object)+?]
-%a2 = _Parameter #1 [_T (dart.core::Object)+?]
-t2* = _Call direct [#lib::loop1] (_T (dart.core::Object)+?, %a1)
-x = _Join [dart.core::Object] (%a1, t2, %a2)
+%a1 = _Parameter #0 [_T (dart.core::Object*)+?]
+%a2 = _Parameter #1 [_T (dart.core::Object*)+?]
+t2* = _Call direct [#lib::loop1] (_T (dart.core::Object*)+?, %a1)
+x = _Join [dart.core::Object*] (%a1, t2, %a2)
 RESULT: x
 ------------ #lib::loop2 ------------
-%x = _Parameter #0 [_T (dart.core::int)+?]
-t1* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
-i = _Join [dart.core::int] (_T (dart.core::_Smi), t1)
+%x = _Parameter #0 [_T (dart.core::int*)+?]
+t1* = _Call [dart.core::num::+] (_T (dart.core::int*)+?, _T (dart.core::_Smi))
+i = _Join [dart.core::int*] (_T (dart.core::_Smi), t1)
 t3* = _Call [dart.core::num::<] (i, _T (dart.core::_Smi))
-t4* = _Call [dart.core::num::+] (_T (dart.core::int)+?, _T (dart.core::_Smi))
-x = _Join [dart.core::int] (%x, t4)
+t4* = _Call [dart.core::num::+] (_T (dart.core::int*)+?, _T (dart.core::_Smi))
+x = _Join [dart.core::int*] (%x, t4)
 RESULT: x
 ------------ #lib::main ------------
 
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
index ea11fc1..b679db8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/annotation.dart.expect
@@ -2,45 +2,38 @@
 import self as self;
 import "dart:core" as core;
 
-@self::TypedefAnnotation::•(const <core::int>[1, 2, 3])
-typedef SomeType<T extends core::Object = dynamic> = (core::List<T>) → void;
+@#C5
+typedef SomeType<T extends core::Object* = dynamic> = (core::List<T*>*) →* void;
 abstract class ClassAnnotation2 extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → self::ClassAnnotation2
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
 abstract class MethodAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(core::int x) → self::MethodAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+[@vm.unreachable.metadata=]  final field core::int* x;
 }
 abstract class TypedefAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(core::List<core::int> list) → self::TypedefAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+[@vm.unreachable.metadata=]  final field core::List<core::int*>* list;
 }
 abstract class VarAnnotation extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •() → self::VarAnnotation
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
 }
-abstract class ParametrizedAnnotation<T extends core::Object = dynamic> extends core::Object {
-[@vm.unreachable.metadata=]  const constructor •(self::ParametrizedAnnotation::T foo) → self::ParametrizedAnnotation<self::ParametrizedAnnotation::T>
-    throw "Attempt to execute method removed by Dart AOT compiler (TFA)";
+abstract class ParametrizedAnnotation<T extends core::Object* = dynamic> extends core::Object {
+[@vm.unreachable.metadata=]  final field self::ParametrizedAnnotation::T* foo;
 }
 abstract class A extends core::Object {
   static method staticMethod() → void {}
 }
-@self::ClassAnnotation2::•()
+@#C6
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @self::MethodAnnotation::•(42)
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  @#C8
   method instanceMethod() → void {}
 }
-static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int>) → void a) → core::int {
-  @self::VarAnnotation::•() core::int x = 2;
-  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] x.{core::num::+}(2);
+static method foo([@vm.inferred-type.metadata=dart.core::Null?] (core::List<core::int*>*) →* void a) → core::int* {
+  @#C9 core::int* x = 2;
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] x.{core::num::+}(2);
 }
-@self::ParametrizedAnnotation::•<core::Null>(null)
-static method main(core::List<core::String> args) → dynamic {
+@#C11
+static method main(core::List<core::String*>* args) → dynamic {
   self::A::staticMethod();
   [@vm.direct-call.metadata=#lib::B::instanceMethod] [@vm.inferred-type.metadata=!? (skip check)] new self::B::•().{self::B::instanceMethod}();
   self::foo(null);
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
index ffdd14f..22cbe59 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_is_prime.dart.expect
@@ -3,35 +3,35 @@
 import "dart:core" as core;
 import "dart:_internal" as _in;
 
-static method isPrime([@vm.inferred-type.metadata=int?] dynamic n) → core::bool {
-  if(_in::unsafeCast<core::bool>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
+static method isPrime([@vm.inferred-type.metadata=int] dynamic n) → core::bool* {
+  if(_in::unsafeCast<core::bool*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool] n.<(2)))
     return false;
-  for (core::int i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
-    if([@vm.inferred-type.metadata=dart.core::bool] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::%??] [@vm.inferred-type.metadata=int?] n.%(i).{core::Object::==}(0))
+  for (core::int* i = 2; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<=] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::*] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::*}(i).{core::num::<=}(_in::unsafeCast<core::num*>(n)); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
+    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] [@vm.direct-call.metadata=dart.core::_IntegerImplementation::%] [@vm.inferred-type.metadata=int] n.%(i).{core::Object::==}(0))
       return false;
   }
   return true;
 }
-static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int n) → core::int {
-  core::int counter = 0;
-  for (core::int i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+static method nThPrimeNumber([@vm.inferred-type.metadata=dart.core::_Smi] core::int* n) → core::int* {
+  core::int* counter = 0;
+  for (core::int* i = 1; ; i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     if([@vm.inferred-type.metadata=dart.core::bool] self::isPrime(i))
-      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] counter.{core::num::+}(1);
-    if([@vm.inferred-type.metadata=dart.core::bool] counter.{core::num::==}(n)) {
+      counter = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] counter.{core::num::+}(1);
+    if([@vm.direct-call.metadata=dart.core::_IntegerImplementation::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] counter.{core::num::==}(n)) {
       return i;
     }
   }
 }
 static method run() → void {
-  core::int e = 611953;
-  core::int p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber(50000);
+  core::int* e = 611953;
+  core::int* p = [@vm.inferred-type.metadata=int?] self::nThPrimeNumber(50000);
   if(![@vm.inferred-type.metadata=dart.core::bool] p.{core::num::==}(e)) {
     throw core::Exception::•("Unexpected result: ${p} != ${e}");
   }
 }
-static method main(core::List<core::String> args) → dynamic {
-  core::Stopwatch timer = let final core::Stopwatch #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+static method main(core::List<core::String*>* args) → dynamic {
+  core::Stopwatch* timer = let final core::Stopwatch* #t1 = new core::Stopwatch::•() in let final dynamic #t2 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t1.{core::Stopwatch::start}() in #t1;
+  for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::run();
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
index fb2975e..076082e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/bench_vector.dart.expect
@@ -6,29 +6,29 @@
 import "dart:typed_data";
 
 class _Vector extends core::Object {
-[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::int _offset;
-[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::int _length;
-[@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::List<core::double> _elements;
-  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int size) → self::_Vector
+[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::int* _offset;
+[@vm.inferred-type.metadata=dart.core::_Smi] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::int* _length;
+[@vm.inferred-type.metadata=dart.typed_data::_Float64List] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::List<core::double*>* _elements;
+  constructor •([@vm.inferred-type.metadata=dart.core::_Smi] core::int* size) → self::_Vector*
     : self::_Vector::_offset = 0, self::_Vector::_length = size, self::_Vector::_elements = [@vm.inferred-type.metadata=dart.typed_data::_Float64List] typ::Float64List::•(size), super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasTearOffUses:false]  operator [](core::int i) → core::double
-    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int i, core::double value) → void {
+[@vm.procedure-attributes.metadata=hasTearOffUses:false]  operator []([@vm.inferred-type.metadata=!] core::int* i) → core::double*
+    return [@vm.direct-call.metadata=dart.typed_data::_Float64List::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements}.{core::List::[]}([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}([@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset}));
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  operator []=([@vm.inferred-type.metadata=dart.core::_OneByteString] core::int* i, core::double* value) → void {
     let dynamic #t1 = [@vm.direct-call.metadata=#lib::_Vector::_elements] [@vm.inferred-type.metadata=dart.typed_data::_Float64List] this.{self::_Vector::_elements} in let dynamic #t2 = i in let dynamic #t3 = [@vm.direct-call.metadata=#lib::_Vector::_offset] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_offset} in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector a) → core::double {
-    core::double result = 0.0;
-    for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1))
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  operator *([@vm.inferred-type.metadata=#lib::_Vector?] self::_Vector* a) → core::double* {
+    core::double* result = 0.0;
+    for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}([@vm.direct-call.metadata=#lib::_Vector::_length] [@vm.inferred-type.metadata=dart.core::_Smi] this.{self::_Vector::_length}); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1))
       result = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] result.{core::double::+}([@vm.direct-call.metadata=dart.core::_Double::*] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.direct-call.metadata=#lib::_Vector::[]] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] this.{self::_Vector::[]}(i).{core::double::*}([@vm.direct-call.metadata=#lib::_Vector::[]??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] a.{self::_Vector::[]}(i)));
     return result;
   }
 }
-[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector v = new self::_Vector::•(10);
-[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double x = 0.0;
-static method main(core::List<core::String> args) → dynamic {
-  core::Stopwatch timer = let final core::Stopwatch #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
-  for (core::int i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<??] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int? (skip check)] i.{core::num::+}(1)) {
+[@vm.inferred-type.metadata=#lib::_Vector?]static field self::_Vector* v = new self::_Vector::•(10);
+[@vm.inferred-type.metadata=dart.core::_Double?]static field core::double* x = 0.0;
+static method main(core::List<core::String*>* args) → dynamic {
+  core::Stopwatch* timer = let final core::Stopwatch* #t4 = new core::Stopwatch::•() in let final dynamic #t5 = [@vm.direct-call.metadata=dart.core::Stopwatch::start] [@vm.inferred-type.metadata=!? (skip check)] #t4.{core::Stopwatch::start}() in #t4;
+  for (core::int* i = 0; [@vm.direct-call.metadata=dart.core::_IntegerImplementation::<] [@vm.inferred-type.metadata=dart.core::bool (skip check)] i.{core::num::<}(100000000); i = [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+??] [@vm.inferred-type.metadata=int (skip check)] i.{core::num::+}(1)) {
     self::x = [@vm.direct-call.metadata=dart.core::_Double::+??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=dart.core::_Double?] self::x.{core::double::+}([@vm.direct-call.metadata=#lib::_Vector::*??] [@vm.inferred-type.metadata=dart.core::_Double (skip check)] [@vm.inferred-type.metadata=#lib::_Vector?] self::v.{self::_Vector::*}([@vm.inferred-type.metadata=#lib::_Vector?] self::v));
   }
   [@vm.direct-call.metadata=dart.core::Stopwatch::stop] [@vm.inferred-type.metadata=!? (skip check)] timer.{core::Stopwatch::stop}();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
index 4acf3a3..ab12ab8 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_basic.dart.expect
@@ -2,77 +2,77 @@
 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>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method foo() → dynamic
-    return new self::D::•<self::C::T>();
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T x) → dynamic
+    return new self::D::•<self::C::T*>();
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id1([@vm.inferred-type.metadata=#lib::Y (skip check)] generic-covariant-impl self::C::T* x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T x) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id2([@vm.inferred-type.metadata=#lib::Z] generic-covariant-impl self::C::T* x) → dynamic
     return x;
 }
-class D<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::D<self::D::T>
+class D<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::D<self::D::T*>*
     : super core::Object::•()
     ;
 }
-class E<S extends core::Object = dynamic, T extends core::Object = dynamic> extends self::C<self::E::T> {
-  synthetic constructor •() → self::E<self::E::S, self::E::T>
+class E<S extends core::Object* = dynamic, T extends core::Object* = dynamic> extends self::C<self::E::T*> {
+  synthetic constructor •() → self::E<self::E::S*, self::E::T*>*
     : super self::C::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
-    return [@vm.inferred-type.metadata=#lib::D<dart.core::String>] super.{self::C::foo}();
+    return [@vm.inferred-type.metadata=#lib::D<dart.core::String*>] super.{self::C::foo}();
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar() → dynamic
-    return new self::D::•<self::E::S>();
+    return new self::D::•<self::E::S*>();
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method baz() → dynamic
-    return new self::D::•<self::E::T>();
+    return new self::D::•<self::E::T*>();
 }
 abstract class X extends core::Object {
-  synthetic constructor •() → self::X
+  synthetic constructor •() → self::X*
     : super core::Object::•()
     ;
 }
 class Y extends self::X {
-  synthetic constructor •() → self::Y
+  synthetic constructor •() → self::Y*
     : super self::X::•()
     ;
 }
 class Z extends self::X {
-  synthetic constructor •() → self::Z
+  synthetic constructor •() → self::Z*
     : super self::X::•()
     ;
 }
-abstract class I<T extends core::Object = dynamic> extends core::Object {
+abstract class I<T extends core::Object* = dynamic> extends core::Object {
 }
-abstract class J extends self::I<core::int> {
+abstract class J extends self::I<core::int*> {
 }
-class K<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::K<self::K::T>
+class K<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::K<self::K::T*>*
     : super core::Object::•()
     ;
 }
-class C2<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C2<self::C2::T>
+class C2<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C2<self::C2::T*>*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check)] generic-covariant-impl core::Comparable<self::C2::T> x) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id3([@vm.inferred-type.metadata=dart.core::_Double (skip check)] generic-covariant-impl core::Comparable<self::C2::T*>* x) → dynamic
     return x;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T>> x) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method id4([@vm.inferred-type.metadata=#lib::K<#lib::J*> (skip check)] generic-covariant-impl self::K<self::I<self::C2::T*>*>* x) → dynamic
     return x;
 }
 static method main() → dynamic {
   dynamic used;
-  used = [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::C::•<core::int>().{self::C::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::foo}();
-  used = [@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int> (skip check)] new self::E::•<core::int, core::String>().{self::E::bar}();
-  used = [@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String> (skip check)] new self::E::•<core::int, core::String>().{self::E::baz}();
-  self::C<self::X> c = new self::C::•<self::Y>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X>] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
-  self::C2<core::num> c2 = new self::C2::•<core::num>();
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
-  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num>] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J>());
+  used = [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::C::•<core::int*>().{self::C::foo}();
+  used = [@vm.direct-call.metadata=#lib::E::foo] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::foo}();
+  used = [@vm.direct-call.metadata=#lib::E::bar] [@vm.inferred-type.metadata=#lib::D<dart.core::int*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::bar}();
+  used = [@vm.direct-call.metadata=#lib::E::baz] [@vm.inferred-type.metadata=#lib::D<dart.core::String*> (skip check)] new self::E::•<core::int*, core::String*>().{self::E::baz}();
+  self::C<self::X*>* c = new self::C::•<self::Y*>();
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id1] [@vm.inferred-type.metadata=!? (skip check)] c.{self::C::id1}(new self::Y::•());
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C<#lib::X*>*] [@vm.direct-call.metadata=#lib::C::id2] c.{self::C::id2}(new self::Z::•());
+  self::C2<core::num*>* c2 = new self::C2::•<core::num*>();
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id3] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id3}(3.0);
+  [@vm.call-site-attributes.metadata=receiverType:#lib::C2<dart.core::num*>*] [@vm.direct-call.metadata=#lib::C2::id4] [@vm.inferred-type.metadata=!? (skip check)] c2.{self::C2::id4}(new self::K::•<self::J*>());
   return used;
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
index 122b604..f850805 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/class_generics_case1.dart.expect
@@ -5,21 +5,21 @@
 import "dart:collection";
 
 class Element extends core::Object {
-  synthetic constructor •() → self::Element
+  synthetic constructor •() → self::Element*
     : super core::Object::•()
     ;
 }
 class InheritedElement extends self::Element {
-[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element, dart.core::Object>] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::Map<self::Element, core::Object> _dependents = <self::Element, core::Object>{};
-  synthetic constructor •() → self::InheritedElement
+[@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::Map<self::Element*, core::Object*>* _dependents = <self::Element*, core::Object*>{};
+  synthetic constructor •() → self::InheritedElement*
     : super self::Element::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method setDependencies([@vm.inferred-type.metadata=!] self::Element dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object value) → void {
-    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element, dart.core::Object>] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element, dart.core::Object>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method setDependencies([@vm.inferred-type.metadata=!] self::Element* dependent, [@vm.inferred-type.metadata=dart.core::_Smi?] core::Object* value) → void {
+    [@vm.call-site-attributes.metadata=receiverType:dart.core::Map<#lib::Element*, dart.core::Object*>*] [@vm.direct-call.metadata=dart.collection::__InternalLinkedHashMap&_HashVMBase&MapMixin&_LinkedHashMapMixin::[]=] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::InheritedElement::_dependents] [@vm.inferred-type.metadata=dart.collection::_InternalLinkedHashMap<#lib::Element*, dart.core::Object*>] this.{self::InheritedElement::_dependents}.{core::Map::[]=}(dependent, value);
   }
 }
 static method main() → dynamic {
-  self::InheritedElement ie = new self::InheritedElement::•();
+  self::InheritedElement* ie = new self::InheritedElement::•();
   [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(ie, 0);
   [@vm.direct-call.metadata=#lib::InheritedElement::setDependencies] [@vm.inferred-type.metadata=!? (skip check)] ie.{self::InheritedElement::setDependencies}(new self::Element::•(), null);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
index aee6417..23bd874 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/devirt.dart.expect
@@ -3,49 +3,49 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method foo() → core::int;
+  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::int*
     return 1;
 }
 class C extends core::Object implements self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::int*
     return 2;
 }
 class D extends self::C {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
 }
 class E extends core::Object {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method toString() → core::String
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method toString() → core::String*
     return "D";
 }
-[@vm.inferred-type.metadata=#lib::D?]static field self::A dd;
-[@vm.inferred-type.metadata=#lib::E?]static field self::E ee = new self::E::•();
-static method callerA1([@vm.inferred-type.metadata=!] self::A aa) → void {
+[@vm.inferred-type.metadata=#lib::D?]static field self::A* dd;
+[@vm.inferred-type.metadata=#lib::E?]static field self::E* ee = new self::E::•();
+static method callerA1([@vm.inferred-type.metadata=!] self::A* aa) → void {
   [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A aa) → void {
+static method callerA2([@vm.inferred-type.metadata=#lib::B] self::A* aa) → void {
   [@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A aa = null}) → void {
+static method callerA3({[@vm.inferred-type.metadata=#lib::C] self::A* aa = #C1}) → void {
   [@vm.direct-call.metadata=#lib::C::foo] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
-static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A aa) → void {
+static method callerA4([@vm.inferred-type.metadata=#lib::D?] self::A* aa) → void {
   [@vm.direct-call.metadata=#lib::C::foo??] [@vm.inferred-type.metadata=!? (skip check)] aa.{self::A::foo}();
 }
 static method callerE1([@vm.inferred-type.metadata=dart.core::_OneByteString] dynamic x) → void {
@@ -54,7 +54,7 @@
 static method callerE2([@vm.inferred-type.metadata=#lib::E?] dynamic x) → void {
   x.{core::Object::toString}();
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   self::callerA1(new self::B::•());
   self::callerA1(new self::C::•());
   self::callerA2(new self::B::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
index 0af71e5..32d4ec1 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future.dart.expect
@@ -5,31 +5,31 @@
 
 import "dart:async";
 
-class C<T extends core::Object = dynamic> extends core::Object {
-  synthetic constructor •() → self::C<self::C::T>
+class C<T extends core::Object* = dynamic> extends core::Object {
+  synthetic constructor •() → self::C<self::C::T*>*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check)] generic-covariant-impl asy::FutureOr<self::C::T> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int> (skip check)] generic-covariant-impl asy::Future<self::C::T> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T>> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T>> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T>> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int>>] generic-covariant-impl self::C<asy::Future<self::C::T>> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int>> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T>> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int>>] generic-covariant-impl self::C<self::C::T> x) → void {}
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int>>] generic-covariant-impl self::C<self::C::T> x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test2c([@vm.inferred-type.metadata=dart.core::_Smi (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::Future<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*> (skip check)] generic-covariant-impl asy::FutureOr<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test2r([@vm.inferred-type.metadata=#lib::C<dart.core::int*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test3r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test4r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test5r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<asy::Future<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test6r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*> (skip check)] generic-covariant-impl self::C<asy::FutureOr<self::C::T*>*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test7r([@vm.inferred-type.metadata=#lib::C<dart.async::FutureOr<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method test8r([@vm.inferred-type.metadata=#lib::C<dart.async::Future<dart.core::int*>*>] generic-covariant-impl self::C<self::C::T*>* x) → void {}
 }
 static method main() → dynamic {
-  dynamic c = new self::C::•<core::int>();
+  dynamic c = new self::C::•<core::int*>();
   [@vm.direct-call.metadata=#lib::C::test2c] c.test2c(3);
-  [@vm.direct-call.metadata=#lib::C::test3c] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int>] asy::Future::value<core::int>(3));
-  [@vm.direct-call.metadata=#lib::C::test4c] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int>] asy::Future::value<core::int>(3));
-  [@vm.direct-call.metadata=#lib::C::test2r] c.test2r(new self::C::•<core::int>());
-  [@vm.direct-call.metadata=#lib::C::test3r] c.test3r(new self::C::•<asy::Future<core::int>>());
-  [@vm.direct-call.metadata=#lib::C::test4r] c.test4r(new self::C::•<asy::Future<core::int>>());
-  [@vm.direct-call.metadata=#lib::C::test5r] c.test5r(new self::C::•<asy::FutureOr<core::int>>());
-  [@vm.direct-call.metadata=#lib::C::test6r] c.test6r(new self::C::•<asy::FutureOr<core::int>>());
-  [@vm.direct-call.metadata=#lib::C::test7r] c.test7r(new self::C::•<asy::FutureOr<core::int>>());
-  [@vm.direct-call.metadata=#lib::C::test8r] c.test8r(new self::C::•<asy::Future<core::int>>());
+  [@vm.direct-call.metadata=#lib::C::test3c] c.test3c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
+  [@vm.direct-call.metadata=#lib::C::test4c] c.test4c([@vm.inferred-type.metadata=dart.async::_Future<dart.core::int*>] asy::Future::value<core::int*>(3));
+  [@vm.direct-call.metadata=#lib::C::test2r] c.test2r(new self::C::•<core::int*>());
+  [@vm.direct-call.metadata=#lib::C::test3r] c.test3r(new self::C::•<asy::Future<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C::test4r] c.test4r(new self::C::•<asy::Future<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C::test5r] c.test5r(new self::C::•<asy::FutureOr<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C::test6r] c.test6r(new self::C::•<asy::FutureOr<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C::test7r] c.test7r(new self::C::•<asy::FutureOr<core::int*>*>());
+  [@vm.direct-call.metadata=#lib::C::test8r] c.test8r(new self::C::•<asy::Future<core::int*>*>());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
index 5b867b7..4426ce7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/future_or.dart.expect
@@ -6,21 +6,21 @@
 import "dart:async";
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] dynamic x) → void {}
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static method foo1_a1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
 static method foo1_a2([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] dynamic x) → void {}
+static method foo1_a3([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] dynamic x) → void {}
 static method foo1_a4([@vm.inferred-type.metadata=#lib::B] dynamic x) → void {}
-static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] asy::Future<self::A> a1, [@vm.inferred-type.metadata=#lib::B] self::A a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] asy::FutureOr<self::A> a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A> a4) → void {
+static method foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B] self::A* a2, [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::FutureOr<self::A*>* a3, [@vm.inferred-type.metadata=#lib::B] asy::FutureOr<self::A*>* a4) → void {
   self::foo1_a1(a1);
   self::foo1_a2(a2);
   self::foo1_a3(a3);
@@ -30,15 +30,15 @@
 static method foo2_a2([@vm.inferred-type.metadata=#lib::B?] dynamic x) → void {}
 static method foo2_a3(dynamic x) → void {}
 static method foo2_a4(dynamic x) → void {}
-static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future<self::A> a1, [@vm.inferred-type.metadata=#lib::B?] self::A a2, asy::FutureOr<self::A> a3, asy::FutureOr<self::A> a4) → void {
+static method foo2([@vm.inferred-type.metadata=dart.async::_Future?] asy::Future<self::A*>* a1, [@vm.inferred-type.metadata=#lib::B?] self::A* a2, asy::FutureOr<self::A*>* a3, asy::FutureOr<self::A*>* a4) → void {
   self::foo2_a1(a1);
   self::foo2_a2(a2);
   self::foo2_a3(a3);
   self::foo2_a4(a4);
 }
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
-static method main(core::List<core::String> args) → dynamic {
-  self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] asy::Future::value<self::B>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B>] asy::Future::value<self::B>(new self::B::•()), new self::B::•());
-  self::foo2(self::getDynamic() as{TypeError} asy::Future<self::A>, self::getDynamic() as{TypeError} self::A, self::getDynamic() as{TypeError} asy::FutureOr<self::A>, self::getDynamic() as{TypeError} asy::FutureOr<self::A>);
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+static method main(core::List<core::String*>* args) → dynamic {
+  self::foo1([@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•(), [@vm.inferred-type.metadata=dart.async::_Future<#lib::B*>] asy::Future::value<self::B*>(new self::B::•()), new self::B::•());
+  self::foo2(self::getDynamic() as{TypeError} asy::Future<self::A*>*, self::getDynamic() as{TypeError} self::A*, self::getDynamic() as{TypeError} asy::FutureOr<self::A*>*, self::getDynamic() as{TypeError} asy::FutureOr<self::A*>*);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
index 461e7263..2296f5b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/hello.dart.expect
@@ -3,12 +3,12 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
-static method foo() → core::Object
+static method foo() → core::Object*
   return new self::A::•();
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A] self::foo());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
index 999e779..1efb873 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_cycle.dart.expect
@@ -3,113 +3,113 @@
 import "dart:core" as core;
 
 abstract class StreamSubscription extends core::Object {
-  synthetic constructor •() → self::StreamSubscription
+  synthetic constructor •() → self::StreamSubscription*
     : super core::Object::•()
     ;
 }
 class _BufferingStreamSubscription extends self::StreamSubscription {
-  synthetic constructor •() → self::_BufferingStreamSubscription
+  synthetic constructor •() → self::_BufferingStreamSubscription*
     : super self::StreamSubscription::•()
     ;
 }
 class _BroadcastSubscription extends self::StreamSubscription {
-  synthetic constructor •() → self::_BroadcastSubscription
+  synthetic constructor •() → self::_BroadcastSubscription*
     : super self::StreamSubscription::•()
     ;
 }
 abstract class Stream extends core::Object {
-  synthetic constructor •() → self::Stream
+  synthetic constructor •() → self::Stream*
     : super core::Object::•()
     ;
-  abstract method foobar((dynamic) → void onData, {core::Function onError = null}) → self::StreamSubscription;
+  abstract method foobar((dynamic) →* void onData, {core::Function* onError = #C1}) → self::StreamSubscription*;
 }
 abstract class _StreamImpl extends self::Stream {
-  synthetic constructor •() → self::_StreamImpl
+  synthetic constructor •() → self::_StreamImpl*
     : super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function* onError = #C1}) → self::StreamSubscription* {
     return [@vm.inferred-type.metadata=!] this.{self::_StreamImpl::_createSubscription}();
   }
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription* {
     return new self::_BufferingStreamSubscription::•();
   }
 }
 class _ControllerStream extends self::_StreamImpl {
-  synthetic constructor •() → self::_ControllerStream
+  synthetic constructor •() → self::_ControllerStream*
     : super self::_StreamImpl::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method _createSubscription() → self::StreamSubscription* {
     return new self::_BroadcastSubscription::•();
   }
 }
 class _GeneratedStreamImpl extends self::_StreamImpl {
-  synthetic constructor •() → self::_GeneratedStreamImpl
+  synthetic constructor •() → self::_GeneratedStreamImpl*
     : super self::_StreamImpl::•()
     ;
 }
 abstract class StreamView extends self::Stream {
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::Stream _stream;
-  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → self::StreamView
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::Stream* _stream;
+  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::StreamView*
     : self::StreamView::_stream = stream, super self::Stream::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → self::StreamSubscription {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method foobar([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData, {[@vm.inferred-type.metadata=dart.core::Null?] core::Function* onError = #C1}) → self::StreamSubscription* {
     return [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] this.{self::StreamView::_stream}.{self::Stream::foobar}(onData, onError: onError);
   }
 }
 class ByteStream extends self::StreamView {
-  constructor •([@vm.inferred-type.metadata=!] self::Stream stream) → self::ByteStream
+  constructor •([@vm.inferred-type.metadata=!] self::Stream* stream) → self::ByteStream*
     : super self::StreamView::•(stream)
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar1([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar1([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar2([@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData) → dynamic {
     super.{self::StreamView::foobar}(onData);
   }
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method super_foobar3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function* onError = #C1}) → dynamic {
     super.{self::StreamView::foobar}(onData, onError: onError);
   }
-  get super_stream() → self::Stream
+  get super_stream() → self::Stream*
     return [@vm.inferred-type.metadata=!] super.{self::StreamView::_stream};
 }
 class _HandleErrorStream extends self::Stream {
-  synthetic constructor •() → self::_HandleErrorStream
+  synthetic constructor •() → self::_HandleErrorStream*
     : super self::Stream::•()
     ;
 }
 static method round0() → void {
   new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
 }
-static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
-  self::ByteStream x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
+static method round1({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData = #C1}) → void {
+  self::ByteStream* x = new self::ByteStream::•(new self::ByteStream::•(new self::_GeneratedStreamImpl::•()));
   [@vm.direct-call.metadata=#lib::ByteStream::super_foobar1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar1}(onData);
 }
-static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
+static method round2({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function* onError = #C1}) → void {
   new self::_ControllerStream::•();
-  self::Stream x = new self::_GeneratedStreamImpl::•();
+  self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null, [@vm.inferred-type.metadata=dart.core::Null?] core::Function onError = null}) → void {
-  self::Stream x = new self::_GeneratedStreamImpl::•();
+static method round3({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData = #C1, [@vm.inferred-type.metadata=dart.core::Null?] core::Function* onError = #C1}) → void {
+  self::Stream* x = new self::_GeneratedStreamImpl::•();
   x = new self::ByteStream::•(x);
   x = new self::_ControllerStream::•();
   x.{self::Stream::foobar}(onData, onError: onError);
 }
-static method round4({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) → void onData = null}) → void {
-  self::ByteStream x = new self::ByteStream::•(new self::_ControllerStream::•());
-  self::Stream y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
-  self::Stream z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
+static method round4({[@vm.inferred-type.metadata=dart.core::Null?] (dynamic) →* void onData = #C1}) → void {
+  self::ByteStream* x = new self::ByteStream::•(new self::_ControllerStream::•());
+  self::Stream* y = [@vm.direct-call.metadata=#lib::ByteStream::super_stream] [@vm.inferred-type.metadata=!] x.{self::ByteStream::super_stream};
+  self::Stream* z = [@vm.direct-call.metadata=#lib::StreamView::_stream] [@vm.inferred-type.metadata=!] x.{self::StreamView::_stream};
   if([@vm.direct-call.metadata=dart.core::Object::==] [@vm.inferred-type.metadata=dart.core::bool (skip check)] y.{core::Object::==}(z)) {
     [@vm.direct-call.metadata=#lib::ByteStream::super_foobar2] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar2}(onData);
   }
 }
 static method round5() → void {
-  self::ByteStream x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
+  self::ByteStream* x = new self::ByteStream::•(new self::_GeneratedStreamImpl::•());
   new self::_HandleErrorStream::•();
   [@vm.direct-call.metadata=#lib::ByteStream::super_foobar3] [@vm.inferred-type.metadata=!? (skip check)] x.{self::ByteStream::super_foobar3}();
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   new self::_GeneratedStreamImpl::•();
   self::round0();
   self::round1();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
index cdb0b58..1b9657b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_field_initializer.dart.expect
@@ -3,34 +3,34 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  abstract method foo() → core::Object;
+  abstract method foo() → core::Object*;
 }
 class B extends core::Object implements self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::Object
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::Object*
     return new self::T1::•();
 }
 class C extends core::Object implements self::A {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::Object
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → core::Object*
     return new self::T2::•();
 }
 class DeepCaller1 extends core::Object {
-  synthetic constructor •() → self::DeepCaller1
+  synthetic constructor •() → self::DeepCaller1*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1() → dynamic
@@ -43,40 +43,40 @@
     return self::field1;
 }
 class D extends core::Object {
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field core::Object field2 = [@vm.inferred-type.metadata=!] self::getValue();
-  synthetic constructor •() → self::D
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field core::Object* field2 = [@vm.inferred-type.metadata=!] self::getValue();
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 class DeepCaller2 extends core::Object {
-  synthetic constructor •() → self::DeepCaller2
+  synthetic constructor •() → self::DeepCaller2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(dd);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(dd);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(dd);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::D] self::D dd) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::D] self::D* dd) → dynamic
     return [@vm.direct-call.metadata=#lib::D::field2] [@vm.inferred-type.metadata=!] dd.{self::D::field2};
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static field core::Object field1 = [@vm.inferred-type.metadata=!] self::getValue();
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static field core::Object* field1 = [@vm.inferred-type.metadata=!] self::getValue();
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
-static method getValue() → core::Object {
-  self::A aa = self::getDynamic() as{TypeError} self::A;
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+static method getValue() → core::Object* {
+  self::A* aa = self::getDynamic() as{TypeError} self::A*;
   return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
-static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1 x) → dynamic
+static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=!? (skip check)] x.{self::DeepCaller1::barL1}();
-static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2 x) → dynamic
+static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(new self::D::•());
 static method createC() → dynamic {
   new self::C::•();
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   new self::B::•();
   self::use1(new self::DeepCaller1::•());
   self::use2(new self::DeepCaller2::•());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
index 40ad603..1a6e574 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class1.dart.expect
@@ -3,42 +3,42 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T1::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → self::Intermediate
+  synthetic constructor •() → self::Intermediate*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar([@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar([@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] aa.{self::A::foo}();
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, [@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, [@vm.inferred-type.metadata=#lib::B?] self::A aa) → dynamic
+static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, [@vm.inferred-type.metadata=#lib::B?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=#lib::T1 (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
 static method allocateB() → dynamic {
   new self::B::•();
 }
-static method main(core::List<core::String> args) → dynamic {
-  self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A);
+static method main(core::List<core::String*>* args) → dynamic {
+  self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A*);
   self::allocateB();
-  self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A);
+  self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A*);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
index dedf792..9ecc788 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_class2.dart.expect
@@ -3,23 +3,23 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
@@ -28,48 +28,48 @@
 abstract class C extends core::Object implements self::B {
 }
 abstract class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
 }
 abstract class _E&D&C extends self::D implements self::C {
-  synthetic constructor •() → self::_E&D&C
+  synthetic constructor •() → self::_E&D&C*
     : super self::D::•()
     ;
 }
 class E extends self::_E&D&C {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super self::_E&D&C::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
     return new self::T2::•();
 }
 class Intermediate extends core::Object {
-  synthetic constructor •() → self::Intermediate
+  synthetic constructor •() → self::Intermediate*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar(self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar(self::A* aa) → dynamic
     return [@vm.inferred-type.metadata=!] aa.{self::A::foo}();
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static method use1([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
+static method use2([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
-static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate i, self::A aa) → dynamic
+static method use3([@vm.inferred-type.metadata=#lib::Intermediate] self::Intermediate* i, self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::Intermediate::bar] [@vm.inferred-type.metadata=! (skip check)] i.{self::Intermediate::bar}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
 static method allocateB() → dynamic {
   new self::B::•();
 }
 static method allocateE() → dynamic {
   new self::E::•();
 }
-static method main(core::List<core::String> args) → dynamic {
-  self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A);
+static method main(core::List<core::String*>* args) → dynamic {
+  self::use1(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A*);
   self::allocateB();
-  self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A);
+  self::use2(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A*);
   self::allocateE();
-  self::use3(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A);
+  self::use3(new self::Intermediate::•(), self::getDynamic() as{TypeError} self::A*);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
index 2cadebe..3eed2e7 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_new_dynamic_target.dart.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3
+  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
@@ -29,7 +29,7 @@
     return new self::T3::•();
 }
 class B extends core::Object {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo() → dynamic
@@ -39,7 +39,7 @@
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bazz() → dynamic
     return new self::T3::•();
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
 static method use_foo1(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T1] x.foo();
 static method use_foo2(dynamic x) → dynamic
@@ -49,14 +49,14 @@
 static method use_bazz(dynamic x) → dynamic
   return [@vm.inferred-type.metadata=#lib::T3] x.bazz();
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
 static method allocateA() → dynamic {
   new self::A::•();
 }
 static method allocateB() → dynamic {
   new self::B::•();
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   self::use_foo1(self::getDynamic());
   self::allocateA();
   self::use_foo2(self::getDynamic());
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
index 2c40b66..277cd40 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field.dart.expect
@@ -3,63 +3,63 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class A extends core::Object {
 [@vm.inferred-type.metadata=#lib::T1] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic field1 = new self::T1::•();
 [@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  field dynamic field2 = new self::T1::•();
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class DeepCaller1 extends core::Object {
-  synthetic constructor •() → self::DeepCaller1
+  synthetic constructor •() → self::DeepCaller1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL2] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL2}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL3] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL3}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller1::barL4] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::DeepCaller1::barL4}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field1??] [@vm.inferred-type.metadata=#lib::T1] aa.{self::A::field1};
 }
 class DeepCaller2 extends core::Object {
-  synthetic constructor •() → self::DeepCaller2
+  synthetic constructor •() → self::DeepCaller2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method barL1([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL2] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL2}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL2([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL3] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL3}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL3([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::DeepCaller2::barL4] [@vm.inferred-type.metadata=! (skip check)] this.{self::DeepCaller2::barL4}(aa);
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method barL4([@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
     return [@vm.direct-call.metadata=#lib::A::field2??] [@vm.inferred-type.metadata=!] aa.{self::A::field2};
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1 x, [@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static method use1([@vm.inferred-type.metadata=#lib::DeepCaller1] self::DeepCaller1* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller1::barL1] [@vm.inferred-type.metadata=#lib::T1 (skip check)] x.{self::DeepCaller1::barL1}(aa);
-static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2 x, [@vm.inferred-type.metadata=#lib::A?] self::A aa) → dynamic
+static method use2([@vm.inferred-type.metadata=#lib::DeepCaller2] self::DeepCaller2* x, [@vm.inferred-type.metadata=#lib::A?] self::A* aa) → dynamic
   return [@vm.direct-call.metadata=#lib::DeepCaller2::barL1] [@vm.inferred-type.metadata=! (skip check)] x.{self::DeepCaller2::barL1}(aa);
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
-static method setField2([@vm.inferred-type.metadata=#lib::A] self::A aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+static method setField2([@vm.inferred-type.metadata=#lib::A] self::A* aa, [@vm.inferred-type.metadata=#lib::T2] dynamic value) → void {
   [@vm.direct-call.metadata=#lib::A::field2] aa.{self::A::field2} = value;
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   new self::A::•();
   new self::T1::•();
   new self::T2::•();
-  self::use1(new self::DeepCaller1::•(), self::getDynamic() as{TypeError} self::A);
-  self::use2(new self::DeepCaller2::•(), self::getDynamic() as{TypeError} self::A);
+  self::use1(new self::DeepCaller1::•(), self::getDynamic() as{TypeError} self::A*);
+  self::use2(new self::DeepCaller2::•(), self::getDynamic() as{TypeError} self::A*);
   self::setField2(new self::A::•(), new self::T2::•());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
index 925d3df..34a1850 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_set_field2.dart.expect
@@ -3,41 +3,41 @@
 import "dart:core" as core;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method go() → self::T3
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method go() → self::T3*
     return new self::T3::•();
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3
+  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method run() → dynamic {
     core::print("hi");
   }
 }
-class Q<T extends core::Object = dynamic> extends core::Object {
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::Q::T result;
-  constructor •(self::Q::T result) → self::Q<self::Q::T>
+class Q<T extends core::Object* = dynamic> extends core::Object {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::Q::T* result;
+  constructor •(self::Q::T* result) → self::Q<self::Q::T*>*
     : self::Q::result = result, super core::Object::•()
     ;
 }
-static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1>] core::List<self::T1> list) → dynamic {
-  [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1>>((self::T1 t1) → self::Q<self::T1> => new self::Q::•<self::T1>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
+static method foo1([@vm.inferred-type.metadata=dart.core::_GrowableList<#lib::T1*>] core::List<self::T1*>* list) → dynamic {
+  [@vm.direct-call.metadata=#lib::T3::run] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::T1::go??] [@vm.inferred-type.metadata=#lib::T3 (skip check)] [@vm.direct-call.metadata=#lib::Q::result??] [@vm.direct-call.metadata=dart._internal::ListIterable::first] [@vm.direct-call.metadata=dart.collection::_ListBase&Object&ListMixin::map] [@vm.inferred-type.metadata=dart._internal::MappedListIterable<#lib::T1*, ?> (skip check)] list.{core::Iterable::map}<self::Q<self::T1*>*>((self::T1* t1) → self::Q<self::T1*>* => new self::Q::•<self::T1*>(t1)).{core::Iterable::first}.{self::Q::result}.{self::T1::go}().{self::T3::run}();
 }
-static method foo2NewValue() → self::Q<dynamic>
-  return new self::Q::•<self::T2>(new self::T2::•());
+static method foo2NewValue() → self::Q<dynamic>*
+  return new self::Q::•<self::T2*>(new self::T2::•());
 static method foo3NewT1() → dynamic {
   new self::T1::•();
 }
-static method main(core::List<core::String> args) → dynamic {
-  self::foo1(<self::T1>[]);
+static method main(core::List<core::String*>* args) → dynamic {
+  self::foo1(<self::T1*>[]);
   self::foo2NewValue();
   self::foo3NewT1();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
index 8099495..1277280 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/invalidation_while_processing.dart.expect
@@ -6,34 +6,34 @@
   abstract method foo() → void;
 }
 class T1 extends core::Object implements self::I {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class T2 extends core::Object implements self::I {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class Point extends core::Object {
-[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::I x;
-  const constructor •([@vm.inferred-type.metadata=!] self::I x) → self::Point
+[@vm.inferred-type.metadata=!] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field self::I* x;
+  const constructor •([@vm.inferred-type.metadata=!] self::I* x) → self::Point*
     : self::Point::x = x, super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method newPoint1() → self::Point
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method newPoint1() → self::Point*
     return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method newPoint2() → self::Point
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method newPoint2() → self::Point*
     return new self::Point::•([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] this.{self::Point::x});
 }
 static method getX([@vm.inferred-type.metadata=#lib::Point] dynamic point) → dynamic {
   [@vm.direct-call.metadata=#lib::Point::x] point.x;
 }
 static method main() → dynamic {
-  self::Point a = new self::Point::•(new self::T1::•());
+  self::Point* a = new self::Point::•(new self::T1::•());
   core::print([@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] a.{self::Point::x});
-  self::Point c = new self::Point::•(new self::T2::•());
+  self::Point* c = new self::Point::•(new self::T2::•());
   [@vm.direct-call.metadata=#lib::Point::x] [@vm.inferred-type.metadata=!] c.{self::Point::x}.{self::I::foo}();
   self::getX([@vm.direct-call.metadata=#lib::Point::newPoint1] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint1}());
   self::getX([@vm.direct-call.metadata=#lib::Point::newPoint2] [@vm.inferred-type.metadata=#lib::Point (skip check)] a.{self::Point::newPoint2}());
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 5fc9b87..5425f6a 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
@@ -4,118 +4,118 @@
 import "dart:_internal" as _in;
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 }
 class T4 extends core::Object {
-  synthetic constructor •() → self::T4
+  synthetic constructor •() → self::T4*
     : super core::Object::•()
     ;
 }
 class T5 extends core::Object {
-  synthetic constructor •() → self::T5
+  synthetic constructor •() → self::T5*
     : super core::Object::•()
     ;
 }
 class T6 extends core::Object {
-  synthetic constructor •() → self::T6
+  synthetic constructor •() → self::T6*
     : super core::Object::•()
     ;
 }
 class T7 extends core::Object {
-  synthetic constructor •() → self::T7
+  synthetic constructor •() → self::T7*
     : super core::Object::•()
     ;
 }
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
   abstract method foo() → dynamic;
   abstract get bar() → dynamic;
-  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = null, dynamic a5 = null]) → dynamic;
+  abstract method bazz(dynamic a1, dynamic a2, dynamic a3, [dynamic a4 = #C1, dynamic a5 = #C1]) → dynamic;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T1::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = #C1]) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::B::noSuchMethod] [@vm.inferred-type.metadata=#lib::T1 (skip check)] this.{self::B::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 abstract class C extends core::Object {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T2::•();
   }
 }
 class D extends self::C implements self::A {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super self::C::•()
     ;
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method foo() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#foo, 0, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = null]) → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#bazz, 0, const <core::Type>[], core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C6, 0, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  no-such-method-forwarder method bazz([@vm.inferred-type.metadata=dart.core::_Smi] dynamic a1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a2, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic a3, [[@vm.inferred-type.metadata=dart.core::_Smi] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::Null?] dynamic a5 = #C1]) → dynamic
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::C::noSuchMethod] [@vm.inferred-type.metadata=#lib::T2 (skip check)] this.{self::C::noSuchMethod}(new core::_InvocationMirror::_withType(#C7, 0, #C3, core::List::unmodifiable<dynamic>(<dynamic>[a1, a2, a3, a4, a5]), [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 class E extends core::Object implements self::A {
-  synthetic constructor •() → self::E
+  synthetic constructor •() → self::E*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T4::•();
   }
   no-such-method-forwarder get bar() → dynamic
-    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#bar, 1, const <core::Type>[], const <dynamic>[], [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol, dynamic>] core::Map::unmodifiable<core::Symbol, dynamic>(const <core::Symbol, dynamic>{}))));
+    return _in::unsafeCast<dynamic>([@vm.direct-call.metadata=#lib::E::noSuchMethod] [@vm.inferred-type.metadata=#lib::T4 (skip check)] this.{self::E::noSuchMethod}(new core::_InvocationMirror::_withType(#C2, 1, #C3, #C4, [@vm.inferred-type.metadata=dart.collection::UnmodifiableMapView<dart.core::Symbol*, dynamic>] core::Map::unmodifiable<core::Symbol*, dynamic>(#C5))));
 }
 class F extends core::Object {
-  synthetic constructor •() → self::F
+  synthetic constructor •() → self::F*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T2::•();
   }
 }
 class G extends core::Object {
-  synthetic constructor •() → self::G
+  synthetic constructor •() → self::G*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T5::•();
   }
 }
 class H extends core::Object {
-  synthetic constructor •() → self::H
+  synthetic constructor •() → self::H*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = null, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = null}) → dynamic
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method foo({[@vm.inferred-type.metadata=dart.core::_Smi] dynamic left = #C1, [@vm.inferred-type.metadata=dart.core::_Smi] dynamic right = #C1}) → dynamic
     return new self::T6::•();
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false]  method noSuchMethod(core::Invocation invocation) → dynamic {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method noSuchMethod(core::Invocation* invocation) → dynamic {
     return new self::T7::•();
   }
 }
-[@vm.inferred-type.metadata=#lib::B?]static field self::A bb = new self::B::•();
-[@vm.inferred-type.metadata=#lib::D?]static field self::A dd = new self::D::•();
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
+[@vm.inferred-type.metadata=#lib::B?]static field self::A* bb = new self::B::•();
+[@vm.inferred-type.metadata=#lib::D?]static field self::A* dd = new self::D::•();
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
-static method main(core::List<core::String> args) → dynamic {
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
+static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::foo}());
   core::print([@vm.direct-call.metadata=#lib::B::bar??] [@vm.inferred-type.metadata=#lib::T1] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bar});
   core::print([@vm.direct-call.metadata=#lib::B::bazz??] [@vm.inferred-type.metadata=#lib::T1 (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::bb.{self::A::bazz}(1, 2, 3, 4));
@@ -123,7 +123,7 @@
   core::print([@vm.direct-call.metadata=#lib::D::bar??] [@vm.inferred-type.metadata=#lib::T2] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bar});
   core::print([@vm.direct-call.metadata=#lib::D::bazz??] [@vm.inferred-type.metadata=#lib::T2 (skip check)] [@vm.inferred-type.metadata=#lib::D?] self::dd.{self::A::bazz}(1, 2, 3, 4));
   new self::E::•();
-  self::A xx = self::getDynamic() as{TypeError} self::A;
+  self::A* xx = self::getDynamic() as{TypeError} self::A*;
   core::print([@vm.inferred-type.metadata=!] xx.{self::A::bar});
   dynamic yy = self::getDynamic();
   core::print([@vm.inferred-type.metadata=!] yy.twoArg(1, 2, 3));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
index 472fbbd..d02ed1d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/param_types_before_strong_mode_checks.dart.expect
@@ -3,22 +3,22 @@
 import "dart:core" as core;
 
 abstract class T0 extends core::Object {
-  synthetic constructor •() → self::T0
+  synthetic constructor •() → self::T0*
     : super core::Object::•()
     ;
   abstract method foo() → void;
 }
 class T2 extends self::T0 {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super self::T0::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method foo() → void {}
 }
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method method1(self::T0 t0) → void {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method method1(self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
@@ -26,37 +26,37 @@
   abstract method method2(covariant dynamic arg) → void;
 }
 class C extends core::Object implements self::B {
-  synthetic constructor •() → self::C
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method method2(covariant self::T0 t0) → void {
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method method2(covariant self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
 class D extends core::Object {
-  synthetic constructor •() → self::D
+  synthetic constructor •() → self::D*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method method3(self::T0 t0) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method method3(self::T0* t0) → void {
     [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
   }
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function unknown;
-static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0 t0) → void {
+[@vm.inferred-type.metadata=dart.core::Null?]static field core::Function* unknown;
+static method func1([@vm.inferred-type.metadata=#lib::T2?] self::T0* t0) → void {
   [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
-static method func2(self::T0 t0) → void {
+static method func2(self::T0* t0) → void {
   [@vm.direct-call.metadata=#lib::T2::foo??] [@vm.inferred-type.metadata=!? (skip check)] t0.{self::T0::foo}();
 }
 static method getDynamic() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call();
 static method use(dynamic x) → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown.call(x);
-static method main(core::List<core::String> args) → dynamic {
-  self::func1(self::getDynamic() as{TypeError} self::T0);
-  self::use(self::func2);
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown.call(x);
+static method main(core::List<core::String*>* args) → dynamic {
+  self::func1(self::getDynamic() as{TypeError} self::T0*);
+  self::use(#C1);
   self::use(new self::A::•().{self::A::method1});
-  self::B bb = self::getDynamic() as{TypeError} self::B;
+  self::B* bb = self::getDynamic() as{TypeError} self::B*;
   [@vm.direct-call.metadata=#lib::C::method2??] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B::method2}(self::getDynamic());
   self::getDynamic().method3(self::getDynamic());
   new self::T2::•();
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart
new file mode 100644
index 0000000..59bb2d5
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart
@@ -0,0 +1,35 @@
+// 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.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/37455
+// Verifies that TFA can infer type of a recursive call if it doesn't depend
+// on the flow.
+
+class A {
+  // Should be inferred as _GrowableList.
+  final List afield;
+
+  A(this.afield);
+
+  String toString() => afield.toString();
+}
+
+class B {
+  List _foo(Iterator<int> iter) {
+    List result = [];
+    while (iter.moveNext()) {
+      if (iter.current < 0) {
+        return result;
+      }
+      // Do a recursive call with the same arguments.
+      result.add(new A(_foo(iter)));
+    }
+    return result;
+  }
+}
+
+void main() {
+  var list = new B()._foo([1, 2, 3].iterator);
+  print(list);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
new file mode 100644
index 0000000..11a0198
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37455.dart.expect
@@ -0,0 +1,31 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+[@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  final field core::List<dynamic>* afield;
+  constructor •([@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] core::List<dynamic>* afield) → self::A*
+    : self::A::afield = afield, super core::Object::•()
+    ;
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method toString() → core::String*
+    return [@vm.direct-call.metadata=dart.core::_GrowableList::toString] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A::afield] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic>] this.{self::A::afield}.{core::Object::toString}();
+}
+class B extends core::Object {
+  synthetic constructor •() → self::B*
+    : super core::Object::•()
+    ;
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasTearOffUses:false]  method _foo([@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>] core::Iterator<core::int*>* iter) → core::List<dynamic>* {
+    core::List<dynamic>* result = <dynamic>[];
+    while ([@vm.direct-call.metadata=dart._internal::ListIterator::moveNext] [@vm.inferred-type.metadata=dart.core::bool (skip check)] iter.{core::Iterator::moveNext}()) {
+      if([@vm.inferred-type.metadata=dart.core::bool?] [@vm.direct-call.metadata=dart._internal::ListIterator::current] iter.{core::Iterator::current}.{core::num::<}(0)) {
+        return result;
+      }
+      [@vm.call-site-attributes.metadata=receiverType:dart.core::List<dynamic>*] [@vm.direct-call.metadata=dart.core::_GrowableList::add] [@vm.inferred-type.metadata=!? (skip check)] result.{core::List::add}(new self::A::•([@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] this.{self::B::_foo}(iter)));
+    }
+    return result;
+  }
+}
+static method main() → void {
+  core::List<dynamic>* list = [@vm.direct-call.metadata=#lib::B::_foo] [@vm.inferred-type.metadata=dart.core::_GrowableList<dynamic> (skip check)] new self::B::•().{self::B::_foo}([@vm.direct-call.metadata=dart.core::_GrowableList::iterator] [@vm.inferred-type.metadata=dart._internal::ListIterator<dart.core::int*>]<core::int*>[1, 2, 3].{core::Iterable::iterator});
+  core::print(list);
+}
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart
new file mode 100644
index 0000000..1416459
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart
@@ -0,0 +1,11 @@
+// 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.
+
+// Regression test for https://github.com/dart-lang/sdk/issues/37719
+// Verifies that TFA can infer types from native methods with generic
+// return type (_GrowableList.[]).
+
+foo(List<int> x) => 1 + x[0];
+
+main() => print(foo(<int>[1]));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
new file mode 100644
index 0000000..adc2258
--- /dev/null
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_37719.dart.expect
@@ -0,0 +1,8 @@
+library #lib;
+import self as self;
+import "dart:core" as core;
+
+static method foo([@vm.inferred-type.metadata=dart.core::_GrowableList<dart.core::int*>] core::List<core::int*>* x) → dynamic
+  return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=dart.core::_GrowableList::[]] [@vm.inferred-type.metadata=int? (skip check)] x.{core::List::[]}(0));
+static method main() → dynamic
+  return [@vm.inferred-type.metadata=dart.core::Null?] core::print([@vm.inferred-type.metadata=int] self::foo(<core::int*>[1]));
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
index 0630a2a..dc76d87 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/regress_flutter16182.dart.expect
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 
 class T1 extends core::Object {
-  synthetic constructor •() → self::T1
+  synthetic constructor •() → self::T1*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method doTest1() → void {
@@ -15,22 +15,22 @@
   }
 }
 class A1 extends core::Object {
-[@vm.inferred-type.metadata=#lib::T1?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field self::T1 foo = null;
-  synthetic constructor •() → self::A1
+[@vm.inferred-type.metadata=#lib::T1?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field self::T1* foo = null;
+  synthetic constructor •() → self::A1*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = null]) → void {
-    [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = _in::unsafeCast<self::T1>(a5);
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=#lib::T1?] dynamic a5 = #C1]) → void {
+    [@vm.direct-call.metadata=#lib::A1::foo] this.{self::A1::foo} = _in::unsafeCast<self::T1*>(a5);
   }
 }
 class B1 extends core::Object {
-[@vm.inferred-type.metadata=#lib::A1] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field self::A1 aa1 = new self::A1::•();
-  synthetic constructor •() → self::B1
+[@vm.inferred-type.metadata=#lib::A1] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field self::A1* aa1 = new self::A1::•();
+  synthetic constructor •() → self::B1*
     : super core::Object::•()
     ;
 }
 class T2 extends core::Object {
-  synthetic constructor •() → self::T2
+  synthetic constructor •() → self::T2*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest2() → void {
@@ -39,23 +39,23 @@
 }
 class A2 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T2?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
-  synthetic constructor •() → self::A2
+  synthetic constructor •() → self::A2*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=#lib::T2?] dynamic a6 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A2::foo] this.{self::A2::foo} = a6;
   }
 }
 abstract class B2Base extends core::Object {
 [@vm.inferred-type.metadata=#lib::A2] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic _aa = new self::A2::•();
-  synthetic constructor •() → self::B2Base
+  synthetic constructor •() → self::B2Base*
     : super core::Object::•()
     ;
   get aa2() → dynamic
     return [@vm.direct-call.metadata=#lib::B2Base::_aa] [@vm.inferred-type.metadata=#lib::A2] this.{self::B2Base::_aa};
 }
 class B2 extends self::B2Base {
-  synthetic constructor •() → self::B2
+  synthetic constructor •() → self::B2*
     : super self::B2Base::•()
     ;
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method doSuperCall() → void {
@@ -63,7 +63,7 @@
   }
 }
 class T3 extends core::Object {
-  synthetic constructor •() → self::T3
+  synthetic constructor •() → self::T3*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest3() → void {
@@ -72,21 +72,21 @@
 }
 class A3 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T3?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
-  synthetic constructor •() → self::A3
+  synthetic constructor •() → self::A3*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=#lib::T3?] dynamic a7 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A3::foo] this.{self::A3::foo} = a7;
   }
 }
 class B3 extends core::Object {
-[@vm.inferred-type.metadata=#lib::A3] [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  field self::A3 aa3 = new self::A3::•();
-  synthetic constructor •() → self::B3
+[@vm.inferred-type.metadata=#lib::A3] [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  field self::A3* aa3 = new self::A3::•();
+  synthetic constructor •() → self::B3*
     : super core::Object::•()
     ;
 }
 class T4 extends core::Object {
-  synthetic constructor •() → self::T4
+  synthetic constructor •() → self::T4*
     : super core::Object::•()
     ;
 [@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method doTest4() → void {
@@ -95,42 +95,42 @@
 }
 class A4 extends core::Object {
 [@vm.inferred-type.metadata=#lib::T4?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic foo = null;
-  synthetic constructor •() → self::A4
+  synthetic constructor •() → self::A4*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = null, dynamic a2 = null, dynamic a3 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = null, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = null, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = null]) → void {
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method call([dynamic a1 = #C1, dynamic a2 = #C1, dynamic a3 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a4 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a5 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a6 = #C1, [@vm.inferred-type.metadata=dart.core::_Smi?] dynamic a7 = #C1, [@vm.inferred-type.metadata=#lib::T4?] dynamic a8 = #C1]) → void {
     [@vm.direct-call.metadata=#lib::A4::foo] this.{self::A4::foo} = a8;
   }
 }
 class B4 extends core::Object {
 [@vm.inferred-type.metadata=#lib::A4] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic _aa = new self::A4::•();
-  synthetic constructor •() → self::B4
+  synthetic constructor •() → self::B4*
     : super core::Object::•()
     ;
   get aa4() → dynamic
     return [@vm.direct-call.metadata=#lib::B4::_aa] [@vm.inferred-type.metadata=#lib::A4] this.{self::B4::_aa};
 }
-[@vm.inferred-type.metadata=dart.core::bool?]static field core::bool ok;
+[@vm.inferred-type.metadata=dart.core::bool?]static field core::bool* ok;
 [@vm.inferred-type.metadata=#lib::B3?]static field dynamic bb3 = new self::B3::•();
-[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function unknown3 = () → dynamic => self::bb3;
+[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown3 = () → dynamic => self::bb3;
 [@vm.inferred-type.metadata=#lib::B4?]static field dynamic bb4 = new self::B4::•();
-[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function unknown4 = () → dynamic => self::bb4;
+[@vm.inferred-type.metadata=dart.core::_Closure?]static field core::Function* unknown4 = () → dynamic => self::bb4;
 static method test1() → void {
-  self::B1 bb = new self::B1::•();
+  self::B1* bb = new self::B1::•();
   bb.{self::B1::aa1}(1, 2, 3, 4, new self::T1::•());
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T1::doTest1??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.direct-call.metadata=#lib::A1::foo] [@vm.inferred-type.metadata=#lib::T1?] [@vm.direct-call.metadata=#lib::B1::aa1] [@vm.inferred-type.metadata=#lib::A1] bb.{self::B1::aa1}.{self::A1::foo}.{self::T1::doTest1}();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method test2() → void {
-  self::B2 bb = new self::B2::•();
+  self::B2* bb = new self::B2::•();
   [@vm.direct-call.metadata=#lib::B2::doSuperCall] [@vm.inferred-type.metadata=!? (skip check)] bb.{self::B2::doSuperCall}();
   self::ok = false;
   [@vm.direct-call.metadata=#lib::T2::doTest2??] [@vm.direct-call.metadata=#lib::A2::foo] [@vm.inferred-type.metadata=#lib::T2?] [@vm.direct-call.metadata=#lib::B2Base::aa2] [@vm.inferred-type.metadata=#lib::A2] bb.{self::B2Base::aa2}.foo.doTest2();
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method getDynamic3() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown3.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown3.call();
 static method test3() → void {
   self::getDynamic3().aa3(1, 2, 3, 4, 5, 6, new self::T3::•());
   self::ok = false;
@@ -138,7 +138,7 @@
   exp::Expect::isTrue([@vm.inferred-type.metadata=dart.core::bool?] self::ok);
 }
 static method getDynamic4() → dynamic
-  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function] self::unknown4.call();
+  return [@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] self::unknown4.call();
 static method test4() → void {
   self::getDynamic4().aa4(1, 2, 3, 4, 5, 6, 7, new self::T4::•());
   self::ok = false;
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
index 2c96882..bfd506b 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_dynamic_method.dart.expect
@@ -3,27 +3,27 @@
 import "dart:core" as core;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false]  method foo() → core::int
-    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=!? (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num) as{TypeError} core::int;
+[@vm.procedure-attributes.metadata=hasThisUses:false]  method foo() → core::int*
+    return [@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=! (skip check)] 1.{core::num::+}([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo() as{TypeError} core::num*) as{TypeError} core::int*;
 }
 class TearOffDynamicMethod extends core::Object {
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic bazz;
-  constructor •(dynamic arg) → self::TearOffDynamicMethod
+  constructor •(dynamic arg) → self::TearOffDynamicMethod*
     : self::TearOffDynamicMethod::bazz = arg.foo, super core::Object::•() {
     this.{self::TearOffDynamicMethod::bazz}();
   }
 }
 static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String> args) → dynamic {
-  core::Function closure = () → self::B => new self::B::•();
-  new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function] closure.call());
+static method main(core::List<core::String*>* args) → dynamic {
+  core::Function* closure = () → self::B* => new self::B::•();
+  new self::TearOffDynamicMethod::•([@vm.call-site-attributes.metadata=receiverType:dart.core::Function*] closure.call());
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
index 66af620..67aa12d 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/tear_off_interface_method.dart.expect
@@ -4,28 +4,28 @@
 import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method foo() → core::int;
+  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  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::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  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::bar] [@vm.inferred-type.metadata=dart.core::_Smi] [@vm.inferred-type.metadata=#lib::B] self::knownResult().bar())));
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  method bar() → core::int*
     return 3;
 }
 class TearOffInterfaceMethod extends core::Object {
 [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false,hasTearOffUses:false]  field dynamic bazz;
-  constructor •([@vm.inferred-type.metadata=#lib::B] self::A arg) → self::TearOffInterfaceMethod
+  constructor •([@vm.inferred-type.metadata=#lib::B] self::A* arg) → self::TearOffInterfaceMethod*
     : self::TearOffInterfaceMethod::bazz = arg.{self::A::foo}, super core::Object::•()
     ;
 }
 static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   new self::TearOffInterfaceMethod::•(new self::B::•()).{self::TearOffInterfaceMethod::bazz}();
 }
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 950a81d..575fe6e 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
@@ -4,38 +4,38 @@
 import "dart:_internal" as _in;
 
 abstract class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
-  abstract method foo() → core::int;
+  abstract method foo() → core::int*;
 }
 class B extends self::A {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super self::A::•()
     ;
-[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  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?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
+[@vm.procedure-attributes.metadata=hasThisUses:false,hasTearOffUses:false]  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?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
 }
 abstract class Base extends core::Object {
-  synthetic constructor •() → self::Base
+  synthetic constructor •() → self::Base*
     : super core::Object::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int
-    return _in::unsafeCast<core::int>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int? (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method doCall(dynamic x) → core::int
-    return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError} core::int;
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasNonThisUses:false]  method foo() → core::int*
+    return _in::unsafeCast<core::int*>([@vm.direct-call.metadata=dart.core::_IntegerImplementation::+] [@vm.inferred-type.metadata=int (skip check)] 3.{core::num::+}(_in::unsafeCast<core::num*>([@vm.direct-call.metadata=#lib::B::foo] [@vm.inferred-type.metadata=int?] [@vm.inferred-type.metadata=#lib::B] self::knownResult().foo())));
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasNonThisUses:false,hasTearOffUses:false]  method doCall(dynamic x) → core::int*
+    return [@vm.call-site-attributes.metadata=receiverType:dynamic] x.call() as{TypeError} core::int*;
 }
 class TearOffSuperMethod extends self::Base {
-  synthetic constructor •() → self::TearOffSuperMethod
+  synthetic constructor •() → self::TearOffSuperMethod*
     : super self::Base::•()
     ;
-[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar() → core::int
+[@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  method bar() → core::int*
     return [@vm.direct-call.metadata=#lib::Base::doCall] [@vm.inferred-type.metadata=int? (skip check)] this.{self::Base::doCall}(super.{self::Base::foo});
 }
-[@vm.inferred-type.metadata=#lib::B?]static field self::A aa = new self::B::•();
+[@vm.inferred-type.metadata=#lib::B?]static field self::A* aa = new self::B::•();
 static method knownResult() → dynamic
   return new self::B::•();
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   [@vm.direct-call.metadata=#lib::TearOffSuperMethod::bar] [@vm.inferred-type.metadata=!? (skip check)] new self::TearOffSuperMethod::•().{self::TearOffSuperMethod::bar}();
   [@vm.direct-call.metadata=#lib::B::foo??] [@vm.inferred-type.metadata=!? (skip check)] [@vm.inferred-type.metadata=#lib::B?] self::aa.{self::A::foo}();
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
index 8f0cd57..11b242e 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unfinished_static_field_init.dart.expect
@@ -3,7 +3,7 @@
 import "dart:core" as core;
 
 class A extends core::Object {
-  synthetic constructor •() → self::A
+  synthetic constructor •() → self::A*
     : super core::Object::•()
     ;
 }
@@ -13,7 +13,7 @@
   return new self::A::•();
 static method bad() → dynamic
   return throw "No return!";
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   core::print([@vm.inferred-type.metadata=#lib::A?] self::static_field_good);
   core::print([@vm.inferred-type.metadata=dart.core::Null?] self::static_field_bad);
 }
diff --git a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
index be8dcbf..47a15c4 100644
--- a/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
+++ b/pkg/vm/testcases/transformations/type_flow/transformer/unreachable.dart.expect
@@ -7,16 +7,16 @@
 abstract class A extends core::Object implements self::I {
 }
 class B extends core::Object implements self::I {
-  synthetic constructor •() → self::B
+  synthetic constructor •() → self::B*
     : super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=#lib::B?]static field self::I ii = new self::B::•();
-static method bar([@vm.inferred-type.metadata=#lib::B?] self::I i) → void {
-  if(i is self::A) {
-    let dynamic #t1 = i{self::A} in let dynamic #t2 = 42 in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
+[@vm.inferred-type.metadata=#lib::B?]static field self::I* ii = new self::B::•();
+static method bar([@vm.inferred-type.metadata=#lib::B?] self::I* i) → void {
+  if(i is self::A*) {
+    let dynamic #t1 = i{self::A*} in let dynamic #t2 = 42 in throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
   }
 }
-static method main(core::List<core::String> args) → dynamic {
+static method main(core::List<core::String*>* args) → dynamic {
   self::bar([@vm.inferred-type.metadata=#lib::B?] self::ii);
 }
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 d8d8757..c856b98 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
@@ -5,18 +5,18 @@
 abstract class A extends core::Object {
 }
 class B extends core::Object {
-  constructor •() → self::B
+  constructor •() → self::B*
     : super core::Object::•() {
     core::print("B");
   }
 }
 class C extends core::Object {
-[@vm.inferred-type.metadata=#lib::B?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  field self::B instanceField = new self::B::•();
-  synthetic constructor •() → self::C
+[@vm.inferred-type.metadata=#lib::B?] [@vm.procedure-attributes.metadata=hasDynamicUses:false,hasThisUses:false,hasTearOffUses:false]  field self::B* instanceField = new self::B::•();
+  synthetic constructor •() → self::C*
     : super core::Object::•()
     ;
 }
-[@vm.inferred-type.metadata=dart.core::Null?]static field self::A field = throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
+[@vm.inferred-type.metadata=dart.core::Null?]static field self::A* field = throw "Attempt to execute code removed by Dart AOT compiler (TFA)";
 static method main() → void {
   self::field = null;
   [@vm.direct-call.metadata=#lib::C::instanceField] new self::C::•().{self::C::instanceField} = null;
diff --git a/pkg/vm/tool/precompiler2 b/pkg/vm/tool/precompiler2
index e1d3aae..c6f5421 100755
--- a/pkg/vm/tool/precompiler2
+++ b/pkg/vm/tool/precompiler2
@@ -87,18 +87,11 @@
 
 export DART_CONFIGURATION=${DART_CONFIGURATION:-ReleaseX64}
 BIN_DIR="$OUT_DIR/$DART_CONFIGURATION"
-DART_BINARY="$BIN_DIR"/dart
-PLAT_DIR=$(echo ${BIN_DIR} | sed -e 's/SIMARM_X64$/SIMARM/')
-
-PREBUILT_DART_BINARY="tools/sdks/dart-sdk/bin/dart"
-if [ -x "$PREBUILT_DART_BINARY" ]; then
-  DART_BINARY=$PREBUILT_DART_BINARY
-fi
 
 # Step 1: Generate Kernel binary from the input Dart source.
-"$DART_BINARY"                                                                 \
+"$BIN_DIR"/dart                                                                \
      "${SDK_DIR}/pkg/vm/bin/gen_kernel.dart"                                   \
-     --platform "${PLAT_DIR}/vm_platform_strong.dill"                          \
+     --platform "${BIN_DIR}/vm_platform_strong.dill"                           \
      --aot                                                                     \
      "${GEN_KERNEL_OPTIONS[@]}"                                                \
      $PACKAGES                                                                 \
diff --git a/pkg/vm_service/.gitignore b/pkg/vm_service/.gitignore
new file mode 100644
index 0000000..2316a7c
--- /dev/null
+++ b/pkg/vm_service/.gitignore
@@ -0,0 +1,8 @@
+*.iml
+.dart_tool
+.packages
+pubspec.lock
+
+java/build/
+java/dist/
+java/out/
diff --git a/pkg/vm_service/CHANGELOG.md b/pkg/vm_service/CHANGELOG.md
new file mode 100644
index 0000000..20c71b0
--- /dev/null
+++ b/pkg/vm_service/CHANGELOG.md
@@ -0,0 +1,253 @@
+# Changelog
+
+## 1.1.0
+- Support service protocol version 3.25:
+  - Added `getInboundReferences`, `getRetainingPath` methods
+  - Added `InboundReferences`, `InboundReference`, `RetainingPath`, and
+    `RetainingObject` objects
+
+## 1.0.1
+- Support service protocol version 3.24:
+  - Added `operatingSystem` property to `VM` object
+
+## 1.0.0+1
+- Updated description and homepage.
+
+## 1.0.0
+- Migrated `vm_service_lib` into the Dart SDK.
+- Renamed from `package:vm_service_lib` to `package:vm_service`.
+- Switched versioning system to follow semantic versioning standards instead of
+  pinning versions to match the service protocol version.
+
+## 3.22.2
+- Fix `registerService` RPC and `Service` stream not being handled correctly.
+- Fixed failing tests.
+
+## 3.22.1
+- **breaking**: Changed type of `library` property in `Class` objects from
+  `ObjectRef` to `LibraryRef`.
+
+## 3.22.0
+- The `registerService` RPC and `Service` stream are now public.
+- `Event` has been updated to include the optional `service`, `method`, and
+  `alias` properties.
+
+## 3.21.1
+- **breaking**: Fixed issue where an `InstanceRef` of type `null` could be returned
+  instead of null for non-`InstanceRef` properties and return values. As a
+  result, some property and return types have been changed from Obj to their
+  correct types.
+
+## 3.21.0
+- support service protocol version 3.21
+
+## 3.20.0+2
+- allow optional params in `getVMTimeline`
+
+## 3.20.0+1
+- handle null isolate ids in `callServiceExtension`
+- add backwards compatibility for `InstanceSet` and `AllocationProfile`
+
+## 3.20.0
+- rev to 3.20.0; expose public methods added in 3.17 - 3.20 VM Service Protocol versions
+
+## 3.17.0+1
+- generate a list of available event streams
+
+## 3.17.0
+- rev to 3.17.0; expose the Logging event and the getMemoryUsage call
+
+## 3.15.1+2
+- fix handling of errors in registered service callbacks to return valid
+  JSON-RPC errors and avoid the client getting "Service Disappeared" responses
+
+## 3.15.1+1
+- rename `getVmWsUriFromObservatoryUri` to `convertToWebSocketUrl`
+- fix an assignment issue in `evaluate`
+
+## 3.15.1
+- Add `getVmWsUriFromObservatoryUri`, a helper function to convert observatory URIs
+  into the required WebSocket URI for connecting to the VM service.
+
+## 3.15.0
+- support service protocol version 3.15
+- fix an issue decoding null `Script.tokenPosTable` values
+
+## 3.14.3-dev.4
+- Add support for the `_Service` stream in the `VmServerConnection` directly.
+
+## 3.14.3-dev.3
+- Add support for automatically delegating service extension requests to the
+  client which registered them.
+  - This is only for services that are registered via the vm service protocol,
+    services registered through `dart:developer` should be handled by the
+    `VmServiceInterface` implementation (which should invoke the registered
+    callback directly).
+- Added a `ServiceExtensionRegistry` class, which tracks which clients have
+  registered which service extensions.
+- **breaking**: Renamed `VmServer` to `VmServerConnection`.
+  - One `VmServerConnection` should be created _per client_ connection to the
+    server. These should typically all share the same underlying
+    `VmServiceInterface` instance, as well as the same
+    `ServiceExtensionRegistry` instance.
+
+## 3.14.3-dev.2
+- Add `callServiceExtension` method to the `VmServiceInterface` class.
+  - The `VmServer` will delegate all requests whose methods start with `ext.` to
+    that implementation.
+
+## 3.14.3-dev.1
+- Add `VmServiceInterface` and `VmServer` classes, which can handle routing
+  jsonrpc2 requests to a `VmServiceInterface` instance, and serializing the
+  responses back.
+
+## 3.14.3-dev.0
+- Add `toJson` methods to all classes.
+
+## 3.14.2
+- fix code generation for the `getSourceReport` call
+
+## 3.14.1
+- address an encoding issue with stdout / stderr text
+
+## 3.14.0
+- regenerate for `v3.14`
+- bump to a major version numbering scheme
+
+## 0.3.10+2
+- work around an issue de-serializing Instance.closureContext
+
+## 0.3.10+1
+- fix an issue de-serializing some object types
+
+## 0.3.10
+- regenerate for `v3.12`
+- expose `isolate.getScripts()`
+- expose `isolate.getInstances()`
+
+## 0.3.9+2
+- handle nulls for `Script.source`
+- fix a decoding issue for `Script.tokenPosTable`
+
+## 0.3.9+1
+- rev to version `3.9` of the spec
+- expose `invoke`
+
+## 0.3.9
+- Rename the `Null` type to `NullVal`
+
+## 0.3.8
+- upgrades for Dart 2 dependencies
+
+## 0.3.7
+- ensure the library works with Dart 2
+- regenerate the library based on the 3.8-dev spec
+- now require a minimum of a 2.0.0-dev Dart SDK
+- update to not use deprecated dart:convert constants
+
+## 0.3.6
+- workaround for an issue with the type of @Library refs for VM objects
+
+## 0.3.5+1
+- bug fix for deserializing `Instance` objects
+
+## 0.3.5
+- improve access to the profiling APIs
+
+## 0.3.4
+- more strong mode runtime fixes
+- expose some undocumented (and unsupported) service protocol methods
+
+## 0.3.3
+- fix strong mode issues at runtime (with JSLists and Lists)
+- expose the ability to evaluate in the scope of another object
+- expose the async causal frame info
+- expose the `awaiterFrames` field
+- expose the `frameIndex` param for the step call
+
+## 0.3.2+1
+- fix a strong mode issue in the generated Dart library
+
+## 0.3.2
+- expose the `PausePostRequest` event
+
+## 0.3.1
+- fix a parsing issue with ExtensionData
+
+## 0.2.4
+- expose the service protocol timeline API
+- add the new `None` event type
+
+## 0.2.3
+- include the name of the calling method in RPC errors
+
+## 0.2.2
+- fixed several strong mode analysis issues
+
+## 0.2.1
+- upgrade to service protocol version `3.3`
+
+## 0.2.0
+- upgrade to service protocol version `3.2`
+
+## 0.1.2
+- fixed a bug with the `ServiceExtensionAdded` event
+
+## 0.1.1
+- expose the new 'Extension' event information
+
+## 0.1.0
+- rev to 0.1.0; declare first stable API version
+
+## 0.0.13
+- improve the toString() message for RPCError
+
+## 0.0.12
+- bug fix for parsing MapAssociations
+
+## 0.0.11
+- bug fix to the service extension API
+
+## 0.0.10
+- expose a service extension API
+
+## 0.0.9
+- update to the latest spec to capture the `Event.inspectee` field
+
+## 0.0.8
+- allow listening to arbitrary event types
+- use Strings for the enum types (to allow for unknown enum values)
+
+## 0.0.7
+- make the diagnostic logging synchronous
+- remove a workaround for a VM bug (fixed in 1.13.0-dev.7.3)
+- several strong mode fixes
+
+## 0.0.6
+- added `exceptionPauseMode` to the Isolate class
+- added `hashCode` and `operator==` methods to classes supporting object identity
+- work around a VM bug with the `type` field of `BoundVariable` and `BoundField`
+
+## 0.0.5
+- added more dartdocs
+- moved back to using Dart enums
+- changed from optional positional params to optional named params
+
+## 0.0.4
+- enum redux
+
+## 0.0.3
+- update to use a custom enum class
+- upgrade to the latest service protocol spec
+
+## 0.0.2
+- added the `setExceptionPauseMode` method
+- fixed an issue with enum parsing
+
+## 0.0.1
+- first publish
+- upgraded the library to the 3.0 version of the service protocol
+- upgraded the library to the 2.0 version of the service protocol
+- copied basic Dart API generator from Atom Dart Plugin
+  https://github.com/dart-atom/dartlang/tree/master/tool
+- refactored Dart code to generate Java client as well as Dart client
diff --git a/pkg/vm_service/LICENSE b/pkg/vm_service/LICENSE
new file mode 100644
index 0000000..de31e1a
--- /dev/null
+++ b/pkg/vm_service/LICENSE
@@ -0,0 +1,26 @@
+Copyright 2015, the Dart project authors. All rights reserved.
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/pkg/vm_service/README.md b/pkg/vm_service/README.md
new file mode 100644
index 0000000..a87d2bc
--- /dev/null
+++ b/pkg/vm_service/README.md
@@ -0,0 +1,20 @@
+# vm_service
+
+[![pub package](https://img.shields.io/pub/v/vm_service.svg)](https://pub.dartlang.org/packages/vm_service)
+
+A library to access the VM Service Protocol.
+
+## Usage
+
+See the
+[example](https://github.com/dart-lang/sdk/blob/master/pkg/vm_service/example/vm_service_tester.dart)
+for a simple use of the library's API.
+
+The VM Service Protocol spec can be found at
+[github.com/dart-lang/sdk/runtime/vm/service/service.md](https://github.com/dart-lang/sdk/blob/master/runtime/vm/service/service.md).
+
+## Features and bugs
+
+Please file feature requests and bugs at the [issue tracker][tracker].
+
+[tracker]: https://github.com/dart-lang/sdk/issues
diff --git a/pkg/vm_service/analysis_options.yaml b/pkg/vm_service/analysis_options.yaml
new file mode 100644
index 0000000..b5e3320
--- /dev/null
+++ b/pkg/vm_service/analysis_options.yaml
@@ -0,0 +1,6 @@
+include: package:pedantic/analysis_options.1.7.0.yaml
+
+linter:
+  rules:
+    - directives_ordering
+    - prefer_generic_function_type_aliases
diff --git a/pkg/vm_service/example/sample_isolates.dart b/pkg/vm_service/example/sample_isolates.dart
new file mode 100644
index 0000000..3089e13
--- /dev/null
+++ b/pkg/vm_service/example/sample_isolates.dart
@@ -0,0 +1,54 @@
+// 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:async';
+import 'dart:isolate';
+
+main(List<String> args) async {
+  var arr = newArray(5);
+  var arr2 = newArray(417);
+  var hash1 = newHash(5);
+  var hash2 = newHash(417);
+
+  // ignore unused
+  arr.length;
+  arr2.length;
+  hash1.length;
+  hash2.length;
+
+  startIsolate(1);
+  startIsolate(2);
+  startIsolate(3);
+  startIsolate(4);
+
+  await new Future.delayed(new Duration(seconds: 5));
+
+  print('at end of main...');
+}
+
+void startIsolate(int val) {
+  Isolate.spawn(isolateEntry, val);
+}
+
+isolateEntry(message) async {
+  print('starting $message');
+  await new Future.delayed(new Duration(seconds: message));
+  print('ending $message');
+}
+
+List newArray(int length) {
+  List l = [];
+  for (int i = 0; i < length; i++) {
+    l.add('entry_$i');
+  }
+  return l;
+}
+
+Map newHash(int length) {
+  Map m = {};
+  for (int i = 0; i < length; i++) {
+    m['entry_$i'] = i;
+  }
+  return m;
+}
diff --git a/pkg/vm_service/example/sample_main.dart b/pkg/vm_service/example/sample_main.dart
new file mode 100644
index 0000000..0bce431
--- /dev/null
+++ b/pkg/vm_service/example/sample_main.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:developer' as developer;
+
+void main(List<String> args) {
+  String local1 = 'abcd';
+  int local2 = 2;
+  var longList = [1, "hello", 3, 5, 7, 11, 13, 14, 15, 16, 17, 18, 19, 20];
+  var deepList = [
+    new Bar(),
+    [
+      [
+        [
+          [
+            [7]
+          ]
+        ],
+        "end"
+      ]
+    ]
+  ];
+
+  print('hello from main');
+
+  foo(1);
+  foo(local2);
+  foo(3);
+  foo(local1.length);
+
+  print(longList);
+  print(deepList);
+
+  developer.debugger();
+
+  print('exiting...');
+}
+
+void foo(int val) {
+  print('val: ${val}');
+}
+
+class Bar extends FooBar {
+  String field1 = "my string";
+}
+
+class FooBar {
+  int field2 = 47;
+}
diff --git a/pkg/vm_service/example/vm_service_assert.dart b/pkg/vm_service/example/vm_service_assert.dart
new file mode 100644
index 0000000..8010e63
--- /dev/null
+++ b/pkg/vm_service/example/vm_service_assert.dart
@@ -0,0 +1,1033 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This is a generated file.
+
+/// A library for asserting correct responses from the VM Service.
+
+import 'package:vm_service/vm_service.dart' as vms;
+
+dynamic assertNotNull(dynamic obj) {
+  if (obj == null) throw 'assert failed';
+  return obj;
+}
+
+bool assertBool(bool obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+int assertInt(int obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+double assertDouble(double obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+List<int> assertInts(List<int> list) {
+  for (int elem in list) {
+    assertInt(elem);
+  }
+  return list;
+}
+
+List<String> assertStrings(List<String> list) {
+  for (String elem in list) {
+    assertString(elem);
+  }
+  return list;
+}
+
+String assertString(String obj) {
+  assertNotNull(obj);
+  if (obj.isEmpty) throw 'expected non-zero length string';
+  return obj;
+}
+
+vms.Success assertSuccess(vms.Success obj) {
+  assertNotNull(obj);
+  if (obj.type != 'Success') throw 'expected Success';
+  return obj;
+}
+
+/// Assert PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted,
+/// PauseException, Resume, BreakpointAdded, BreakpointResolved,
+/// BreakpointRemoved, and Inspect events.
+vms.Event assertDebugEvent(vms.Event event) {
+  assertEvent(event);
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kBreakpointAdded ||
+      event.kind == vms.EventKind.kBreakpointRemoved ||
+      event.kind == vms.EventKind.kBreakpointResolved) {
+    assertBreakpoint(event.breakpoint);
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint) {
+    for (vms.Breakpoint elem in event.pauseBreakpoints) {
+      assertBreakpoint(elem);
+    }
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kPauseInterrupted ||
+      event.kind == vms.EventKind.kPauseException ||
+      event.kind == vms.EventKind.kResume) {
+    // For PauseInterrupted events, there will be no top frame if the isolate is
+    // idle (waiting in the message loop).
+    // For the Resume event, the top frame is provided at all times except for
+    // the initial resume event that is delivered when an isolate begins
+    // execution.
+    if (event.topFrame != null ||
+        (event.kind != vms.EventKind.kPauseInterrupted &&
+            event.kind != vms.EventKind.kResume)) {
+      assertFrame(event.topFrame);
+    }
+  }
+  if (event.kind == vms.EventKind.kPauseException) {
+    assertInstanceRef(event.exception);
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kPauseInterrupted) {
+    assertBool(event.atAsyncSuspension);
+  }
+  if (event.kind == vms.EventKind.kInspect) {
+    assertInstanceRef(event.inspectee);
+  }
+  return event;
+}
+
+/// Assert IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate,
+/// and ServiceExtensionAdded events.
+vms.Event assertIsolateEvent(vms.Event event) {
+  assertEvent(event);
+  if (event.kind == vms.EventKind.kServiceExtensionAdded) {
+    assertString(event.extensionRPC);
+  }
+  return event;
+}
+
+String assertCodeKind(String obj) {
+  if (obj == "Collected") return obj;
+  if (obj == "Dart") return obj;
+  if (obj == "Native") return obj;
+  if (obj == "Stub") return obj;
+  if (obj == "Tag") return obj;
+  throw "invalid CodeKind: $obj";
+}
+
+String assertErrorKind(String obj) {
+  if (obj == "InternalError") return obj;
+  if (obj == "LanguageError") return obj;
+  if (obj == "TerminationError") return obj;
+  if (obj == "UnhandledException") return obj;
+  throw "invalid ErrorKind: $obj";
+}
+
+String assertEventKind(String obj) {
+  if (obj == "BreakpointAdded") return obj;
+  if (obj == "BreakpointRemoved") return obj;
+  if (obj == "BreakpointResolved") return obj;
+  if (obj == "Extension") return obj;
+  if (obj == "GC") return obj;
+  if (obj == "Inspect") return obj;
+  if (obj == "IsolateExit") return obj;
+  if (obj == "IsolateReload") return obj;
+  if (obj == "IsolateRunnable") return obj;
+  if (obj == "IsolateStart") return obj;
+  if (obj == "IsolateUpdate") return obj;
+  if (obj == "Logging") return obj;
+  if (obj == "None") return obj;
+  if (obj == "PauseBreakpoint") return obj;
+  if (obj == "PauseException") return obj;
+  if (obj == "PauseExit") return obj;
+  if (obj == "PauseInterrupted") return obj;
+  if (obj == "PausePostRequest") return obj;
+  if (obj == "PauseStart") return obj;
+  if (obj == "Resume") return obj;
+  if (obj == "ServiceExtensionAdded") return obj;
+  if (obj == "ServiceRegistered") return obj;
+  if (obj == "ServiceUnregistered") return obj;
+  if (obj == "VMFlagUpdate") return obj;
+  if (obj == "VMUpdate") return obj;
+  if (obj == "WriteEvent") return obj;
+  throw "invalid EventKind: $obj";
+}
+
+String assertInstanceKind(String obj) {
+  if (obj == "Bool") return obj;
+  if (obj == "BoundedType") return obj;
+  if (obj == "Closure") return obj;
+  if (obj == "Double") return obj;
+  if (obj == "Float32List") return obj;
+  if (obj == "Float32x4") return obj;
+  if (obj == "Float32x4List") return obj;
+  if (obj == "Float64List") return obj;
+  if (obj == "Float64x2") return obj;
+  if (obj == "Float64x2List") return obj;
+  if (obj == "Int") return obj;
+  if (obj == "Int16List") return obj;
+  if (obj == "Int32List") return obj;
+  if (obj == "Int32x4") return obj;
+  if (obj == "Int32x4List") return obj;
+  if (obj == "Int64List") return obj;
+  if (obj == "Int8List") return obj;
+  if (obj == "List") return obj;
+  if (obj == "Map") return obj;
+  if (obj == "MirrorReference") return obj;
+  if (obj == "Null") return obj;
+  if (obj == "PlainInstance") return obj;
+  if (obj == "RegExp") return obj;
+  if (obj == "StackTrace") return obj;
+  if (obj == "String") return obj;
+  if (obj == "Type") return obj;
+  if (obj == "TypeParameter") return obj;
+  if (obj == "TypeRef") return obj;
+  if (obj == "Uint16List") return obj;
+  if (obj == "Uint32List") return obj;
+  if (obj == "Uint64List") return obj;
+  if (obj == "Uint8ClampedList") return obj;
+  if (obj == "Uint8List") return obj;
+  if (obj == "WeakProperty") return obj;
+  throw "invalid InstanceKind: $obj";
+}
+
+String assertSentinelKind(String obj) {
+  if (obj == "BeingInitialized") return obj;
+  if (obj == "Collected") return obj;
+  if (obj == "Expired") return obj;
+  if (obj == "Free") return obj;
+  if (obj == "NotInitialized") return obj;
+  if (obj == "OptimizedOut") return obj;
+  throw "invalid SentinelKind: $obj";
+}
+
+String assertFrameKind(String obj) {
+  if (obj == "AsyncActivation") return obj;
+  if (obj == "AsyncCausal") return obj;
+  if (obj == "AsyncSuspensionMarker") return obj;
+  if (obj == "Regular") return obj;
+  throw "invalid FrameKind: $obj";
+}
+
+String assertSourceReportKind(String obj) {
+  if (obj == "Coverage") return obj;
+  if (obj == "PossibleBreakpoints") return obj;
+  throw "invalid SourceReportKind: $obj";
+}
+
+String assertExceptionPauseMode(String obj) {
+  if (obj == "All") return obj;
+  if (obj == "None") return obj;
+  if (obj == "Unhandled") return obj;
+  throw "invalid ExceptionPauseMode: $obj";
+}
+
+String assertStepOption(String obj) {
+  if (obj == "Into") return obj;
+  if (obj == "Out") return obj;
+  if (obj == "Over") return obj;
+  if (obj == "OverAsyncSuspension") return obj;
+  if (obj == "Rewind") return obj;
+  throw "invalid StepOption: $obj";
+}
+
+vms.AllocationProfile assertAllocationProfile(vms.AllocationProfile obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertClassHeapStatss(obj.members);
+  assertMemoryUsage(obj.memoryUsage);
+  return obj;
+}
+
+vms.BoundField assertBoundField(vms.BoundField obj) {
+  assertNotNull(obj);
+  assertFieldRef(obj.decl);
+  if (obj.value is vms.InstanceRef) {
+    assertInstanceRef(obj.value);
+  } else if (obj.value is vms.Sentinel) {
+    assertSentinel(obj.value);
+  } else {
+    throw "Unexpected value: ${obj.value}";
+  }
+  return obj;
+}
+
+vms.BoundVariable assertBoundVariable(vms.BoundVariable obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.name);
+  if (obj.value is vms.InstanceRef) {
+    assertInstanceRef(obj.value);
+  } else if (obj.value is vms.TypeArgumentsRef) {
+    assertTypeArgumentsRef(obj.value);
+  } else if (obj.value is vms.Sentinel) {
+    assertSentinel(obj.value);
+  } else {
+    throw "Unexpected value: ${obj.value}";
+  }
+  assertInt(obj.declarationTokenPos);
+  assertInt(obj.scopeStartTokenPos);
+  assertInt(obj.scopeEndTokenPos);
+  return obj;
+}
+
+List<vms.BoundVariable> assertBoundVariables(List<vms.BoundVariable> list) {
+  for (vms.BoundVariable elem in list) {
+    assertBoundVariable(elem);
+  }
+  return list;
+}
+
+vms.Breakpoint assertBreakpoint(vms.Breakpoint obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInt(obj.breakpointNumber);
+  assertBool(obj.resolved);
+  if (obj.location is vms.SourceLocation) {
+    assertSourceLocation(obj.location);
+  } else if (obj.location is vms.UnresolvedSourceLocation) {
+    assertUnresolvedSourceLocation(obj.location);
+  } else {
+    throw "Unexpected value: ${obj.location}";
+  }
+  return obj;
+}
+
+List<vms.Breakpoint> assertBreakpoints(List<vms.Breakpoint> list) {
+  for (vms.Breakpoint elem in list) {
+    assertBreakpoint(elem);
+  }
+  return list;
+}
+
+vms.ClassRef assertClassRef(vms.ClassRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  return obj;
+}
+
+List<vms.ClassRef> assertClassRefs(List<vms.ClassRef> list) {
+  for (vms.ClassRef elem in list) {
+    assertClassRef(elem);
+  }
+  return list;
+}
+
+vms.Class assertClass(vms.Class obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertBool(obj.isAbstract);
+  assertBool(obj.isConst);
+  assertLibraryRef(obj.library);
+  assertInstanceRefs(obj.interfaces);
+  assertFieldRefs(obj.fields);
+  assertFuncRefs(obj.functions);
+  assertClassRefs(obj.subclasses);
+  return obj;
+}
+
+vms.ClassHeapStats assertClassHeapStats(vms.ClassHeapStats obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertClassRef(obj.classRef);
+  assertInt(obj.accumulatedSize);
+  assertInt(obj.bytesCurrent);
+  assertInt(obj.instancesAccumulated);
+  assertInt(obj.instancesCurrent);
+  return obj;
+}
+
+List<vms.ClassHeapStats> assertClassHeapStatss(List<vms.ClassHeapStats> list) {
+  for (vms.ClassHeapStats elem in list) {
+    assertClassHeapStats(elem);
+  }
+  return list;
+}
+
+vms.ClassList assertClassList(vms.ClassList obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertClassRefs(obj.classes);
+  return obj;
+}
+
+vms.CodeRef assertCodeRef(vms.CodeRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertCodeKind(obj.kind);
+  return obj;
+}
+
+List<vms.CodeRef> assertCodeRefs(List<vms.CodeRef> list) {
+  for (vms.CodeRef elem in list) {
+    assertCodeRef(elem);
+  }
+  return list;
+}
+
+vms.Code assertCode(vms.Code obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertCodeKind(obj.kind);
+  return obj;
+}
+
+vms.ContextRef assertContextRef(vms.ContextRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInt(obj.length);
+  return obj;
+}
+
+List<vms.ContextRef> assertContextRefs(List<vms.ContextRef> list) {
+  for (vms.ContextRef elem in list) {
+    assertContextRef(elem);
+  }
+  return list;
+}
+
+vms.Context assertContext(vms.Context obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInt(obj.length);
+  assertContextElements(obj.variables);
+  return obj;
+}
+
+vms.ContextElement assertContextElement(vms.ContextElement obj) {
+  assertNotNull(obj);
+  if (obj.value is vms.InstanceRef) {
+    assertInstanceRef(obj.value);
+  } else if (obj.value is vms.Sentinel) {
+    assertSentinel(obj.value);
+  } else {
+    throw "Unexpected value: ${obj.value}";
+  }
+  return obj;
+}
+
+List<vms.ContextElement> assertContextElements(List<vms.ContextElement> list) {
+  for (vms.ContextElement elem in list) {
+    assertContextElement(elem);
+  }
+  return list;
+}
+
+vms.ErrorRef assertErrorRef(vms.ErrorRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertErrorKind(obj.kind);
+  assertString(obj.message);
+  return obj;
+}
+
+List<vms.ErrorRef> assertErrorRefs(List<vms.ErrorRef> list) {
+  for (vms.ErrorRef elem in list) {
+    assertErrorRef(elem);
+  }
+  return list;
+}
+
+vms.Error assertError(vms.Error obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertErrorKind(obj.kind);
+  assertString(obj.message);
+  return obj;
+}
+
+vms.Event assertEvent(vms.Event obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertEventKind(obj.kind);
+  assertInt(obj.timestamp);
+  return obj;
+}
+
+vms.ExtensionData assertExtensionData(vms.ExtensionData obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+vms.FieldRef assertFieldRef(vms.FieldRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertObjRef(obj.owner);
+  assertInstanceRef(obj.declaredType);
+  assertBool(obj.isConst);
+  assertBool(obj.isFinal);
+  assertBool(obj.isStatic);
+  return obj;
+}
+
+List<vms.FieldRef> assertFieldRefs(List<vms.FieldRef> list) {
+  for (vms.FieldRef elem in list) {
+    assertFieldRef(elem);
+  }
+  return list;
+}
+
+vms.Field assertField(vms.Field obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertObjRef(obj.owner);
+  assertInstanceRef(obj.declaredType);
+  assertBool(obj.isConst);
+  assertBool(obj.isFinal);
+  assertBool(obj.isStatic);
+  return obj;
+}
+
+vms.Flag assertFlag(vms.Flag obj) {
+  assertNotNull(obj);
+  assertString(obj.name);
+  assertString(obj.comment);
+  assertBool(obj.modified);
+  return obj;
+}
+
+List<vms.Flag> assertFlags(List<vms.Flag> list) {
+  for (vms.Flag elem in list) {
+    assertFlag(elem);
+  }
+  return list;
+}
+
+vms.FlagList assertFlagList(vms.FlagList obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertFlags(obj.flags);
+  return obj;
+}
+
+vms.Frame assertFrame(vms.Frame obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.index);
+  return obj;
+}
+
+List<vms.Frame> assertFrames(List<vms.Frame> list) {
+  for (vms.Frame elem in list) {
+    assertFrame(elem);
+  }
+  return list;
+}
+
+vms.FuncRef assertFuncRef(vms.FuncRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  if (obj.owner is vms.LibraryRef) {
+    assertLibraryRef(obj.owner);
+  } else if (obj.owner is vms.ClassRef) {
+    assertClassRef(obj.owner);
+  } else if (obj.owner is vms.FuncRef) {
+    assertFuncRef(obj.owner);
+  } else {
+    throw "Unexpected value: ${obj.owner}";
+  }
+  assertBool(obj.isStatic);
+  assertBool(obj.isConst);
+  return obj;
+}
+
+List<vms.FuncRef> assertFuncRefs(List<vms.FuncRef> list) {
+  for (vms.FuncRef elem in list) {
+    assertFuncRef(elem);
+  }
+  return list;
+}
+
+vms.Func assertFunc(vms.Func obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  if (obj.owner is vms.LibraryRef) {
+    assertLibraryRef(obj.owner);
+  } else if (obj.owner is vms.ClassRef) {
+    assertClassRef(obj.owner);
+  } else if (obj.owner is vms.FuncRef) {
+    assertFuncRef(obj.owner);
+  } else {
+    throw "Unexpected value: ${obj.owner}";
+  }
+  return obj;
+}
+
+vms.InstanceRef assertInstanceRef(vms.InstanceRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInstanceKind(obj.kind);
+  assertClassRef(obj.classRef);
+  return obj;
+}
+
+List<vms.InstanceRef> assertInstanceRefs(List<vms.InstanceRef> list) {
+  for (vms.InstanceRef elem in list) {
+    assertInstanceRef(elem);
+  }
+  return list;
+}
+
+vms.Instance assertInstance(vms.Instance obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInstanceKind(obj.kind);
+  assertClassRef(obj.classRef);
+  return obj;
+}
+
+vms.IsolateRef assertIsolateRef(vms.IsolateRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.number);
+  assertString(obj.name);
+  return obj;
+}
+
+List<vms.IsolateRef> assertIsolateRefs(List<vms.IsolateRef> list) {
+  for (vms.IsolateRef elem in list) {
+    assertIsolateRef(elem);
+  }
+  return list;
+}
+
+vms.Isolate assertIsolate(vms.Isolate obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.number);
+  assertString(obj.name);
+  assertInt(obj.startTime);
+  assertBool(obj.runnable);
+  assertInt(obj.livePorts);
+  assertBool(obj.pauseOnExit);
+  assertEvent(obj.pauseEvent);
+  assertLibraryRefs(obj.libraries);
+  assertBreakpoints(obj.breakpoints);
+  assertExceptionPauseMode(obj.exceptionPauseMode);
+  return obj;
+}
+
+vms.InboundReferences assertInboundReferences(vms.InboundReferences obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInboundReferences(obj.references);
+  return obj;
+}
+
+vms.InboundReference assertInboundReference(vms.InboundReference obj) {
+  assertNotNull(obj);
+  assertObjRef(obj.source);
+  return obj;
+}
+
+vms.InstanceSet assertInstanceSet(vms.InstanceSet obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.totalCount);
+  assertObjRefs(obj.instances);
+  return obj;
+}
+
+vms.LibraryRef assertLibraryRef(vms.LibraryRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertString(obj.uri);
+  return obj;
+}
+
+List<vms.LibraryRef> assertLibraryRefs(List<vms.LibraryRef> list) {
+  for (vms.LibraryRef elem in list) {
+    assertLibraryRef(elem);
+  }
+  return list;
+}
+
+vms.Library assertLibrary(vms.Library obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertString(obj.uri);
+  assertBool(obj.debuggable);
+  assertLibraryDependencies(obj.dependencies);
+  assertScriptRefs(obj.scripts);
+  assertFieldRefs(obj.variables);
+  assertFuncRefs(obj.functions);
+  assertClassRefs(obj.classes);
+  return obj;
+}
+
+vms.LibraryDependency assertLibraryDependency(vms.LibraryDependency obj) {
+  assertNotNull(obj);
+  assertBool(obj.isImport);
+  assertBool(obj.isDeferred);
+  assertString(obj.prefix);
+  assertLibraryRef(obj.target);
+  return obj;
+}
+
+List<vms.LibraryDependency> assertLibraryDependencies(
+    List<vms.LibraryDependency> list) {
+  for (vms.LibraryDependency elem in list) {
+    assertLibraryDependency(elem);
+  }
+  return list;
+}
+
+vms.LogRecord assertLogRecord(vms.LogRecord obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInstanceRef(obj.message);
+  assertInt(obj.time);
+  assertInt(obj.level);
+  assertInt(obj.sequenceNumber);
+  assertInstanceRef(obj.loggerName);
+  assertInstanceRef(obj.zone);
+  assertInstanceRef(obj.error);
+  assertInstanceRef(obj.stackTrace);
+  return obj;
+}
+
+vms.MapAssociation assertMapAssociation(vms.MapAssociation obj) {
+  assertNotNull(obj);
+  if (obj.key is vms.InstanceRef) {
+    assertInstanceRef(obj.key);
+  } else if (obj.key is vms.Sentinel) {
+    assertSentinel(obj.key);
+  } else {
+    throw "Unexpected value: ${obj.key}";
+  }
+  if (obj.value is vms.InstanceRef) {
+    assertInstanceRef(obj.value);
+  } else if (obj.value is vms.Sentinel) {
+    assertSentinel(obj.value);
+  } else {
+    throw "Unexpected value: ${obj.value}";
+  }
+  return obj;
+}
+
+vms.MemoryUsage assertMemoryUsage(vms.MemoryUsage obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.externalUsage);
+  assertInt(obj.heapCapacity);
+  assertInt(obj.heapUsage);
+  return obj;
+}
+
+vms.Message assertMessage(vms.Message obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.index);
+  assertString(obj.name);
+  assertString(obj.messageObjectId);
+  assertInt(obj.size);
+  return obj;
+}
+
+List<vms.Message> assertMessages(List<vms.Message> list) {
+  for (vms.Message elem in list) {
+    assertMessage(elem);
+  }
+  return list;
+}
+
+vms.NullValRef assertNullValRef(vms.NullValRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInstanceKind(obj.kind);
+  assertClassRef(obj.classRef);
+  assertString(obj.valueAsString);
+  return obj;
+}
+
+List<vms.NullValRef> assertNullValRefs(List<vms.NullValRef> list) {
+  for (vms.NullValRef elem in list) {
+    assertNullValRef(elem);
+  }
+  return list;
+}
+
+vms.NullVal assertNullVal(vms.NullVal obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertInstanceKind(obj.kind);
+  assertClassRef(obj.classRef);
+  assertString(obj.valueAsString);
+  return obj;
+}
+
+vms.ObjRef assertObjRef(vms.ObjRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  return obj;
+}
+
+List<vms.ObjRef> assertObjRefs(List<vms.ObjRef> list) {
+  for (vms.ObjRef elem in list) {
+    assertObjRef(elem);
+  }
+  return list;
+}
+
+vms.Obj assertObj(vms.Obj obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  return obj;
+}
+
+vms.ReloadReport assertReloadReport(vms.ReloadReport obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertBool(obj.success);
+  return obj;
+}
+
+vms.RetainingObject assertRetainingObject(vms.RetainingObject obj) {
+  assertNotNull(obj);
+  assertObjRef(obj.value);
+  return obj;
+}
+
+vms.RetainingPath assertRetainingPath(vms.RetainingPath obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.length);
+  assertString(obj.gcRootType);
+  assertRetainingObjects(obj.elements);
+  return obj;
+}
+
+vms.Response assertResponse(vms.Response obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  return obj;
+}
+
+vms.Sentinel assertSentinel(vms.Sentinel obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertSentinelKind(obj.kind);
+  assertString(obj.valueAsString);
+  return obj;
+}
+
+vms.ScriptRef assertScriptRef(vms.ScriptRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.uri);
+  return obj;
+}
+
+List<vms.ScriptRef> assertScriptRefs(List<vms.ScriptRef> list) {
+  for (vms.ScriptRef elem in list) {
+    assertScriptRef(elem);
+  }
+  return list;
+}
+
+vms.Script assertScript(vms.Script obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.uri);
+  assertLibraryRef(obj.library);
+  return obj;
+}
+
+vms.ScriptList assertScriptList(vms.ScriptList obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertScriptRefs(obj.scripts);
+  return obj;
+}
+
+vms.SourceLocation assertSourceLocation(vms.SourceLocation obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertScriptRef(obj.script);
+  assertInt(obj.tokenPos);
+  return obj;
+}
+
+vms.SourceReport assertSourceReport(vms.SourceReport obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertSourceReportRanges(obj.ranges);
+  assertScriptRefs(obj.scripts);
+  return obj;
+}
+
+vms.SourceReportCoverage assertSourceReportCoverage(
+    vms.SourceReportCoverage obj) {
+  assertNotNull(obj);
+  assertInts(obj.hits);
+  assertInts(obj.misses);
+  return obj;
+}
+
+vms.SourceReportRange assertSourceReportRange(vms.SourceReportRange obj) {
+  assertNotNull(obj);
+  assertInt(obj.scriptIndex);
+  assertInt(obj.startPos);
+  assertInt(obj.endPos);
+  assertBool(obj.compiled);
+  return obj;
+}
+
+List<vms.SourceReportRange> assertSourceReportRanges(
+    List<vms.SourceReportRange> list) {
+  for (vms.SourceReportRange elem in list) {
+    assertSourceReportRange(elem);
+  }
+  return list;
+}
+
+vms.Stack assertStack(vms.Stack obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertFrames(obj.frames);
+  assertMessages(obj.messages);
+  return obj;
+}
+
+vms.Timeline assertTimeline(vms.Timeline obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertTimelineEvents(obj.traceEvents);
+  assertInt(obj.timeOriginMicros);
+  assertInt(obj.timeExtentMicros);
+  return obj;
+}
+
+vms.TimelineEvent assertTimelineEvent(vms.TimelineEvent obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+List<vms.TimelineEvent> assertTimelineEvents(List<vms.TimelineEvent> list) {
+  for (vms.TimelineEvent elem in list) {
+    assertTimelineEvent(elem);
+  }
+  return list;
+}
+
+vms.TimelineFlags assertTimelineFlags(vms.TimelineFlags obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.recorderName);
+  assertStrings(obj.availableStreams);
+  assertStrings(obj.recordedStreams);
+  return obj;
+}
+
+vms.Timestamp assertTimestamp(vms.Timestamp obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.timestamp);
+  return obj;
+}
+
+vms.TypeArgumentsRef assertTypeArgumentsRef(vms.TypeArgumentsRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  return obj;
+}
+
+List<vms.TypeArgumentsRef> assertTypeArgumentsRefs(
+    List<vms.TypeArgumentsRef> list) {
+  for (vms.TypeArgumentsRef elem in list) {
+    assertTypeArgumentsRef(elem);
+  }
+  return list;
+}
+
+vms.TypeArguments assertTypeArguments(vms.TypeArguments obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.id);
+  assertString(obj.name);
+  assertInstanceRefs(obj.types);
+  return obj;
+}
+
+vms.UnresolvedSourceLocation assertUnresolvedSourceLocation(
+    vms.UnresolvedSourceLocation obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  return obj;
+}
+
+vms.Version assertVersion(vms.Version obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertInt(obj.major);
+  assertInt(obj.minor);
+  return obj;
+}
+
+vms.VMRef assertVMRef(vms.VMRef obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.name);
+  return obj;
+}
+
+List<vms.VMRef> assertVMRefs(List<vms.VMRef> list) {
+  for (vms.VMRef elem in list) {
+    assertVMRef(elem);
+  }
+  return list;
+}
+
+vms.VM assertVM(vms.VM obj) {
+  assertNotNull(obj);
+  assertString(obj.type);
+  assertString(obj.name);
+  assertInt(obj.architectureBits);
+  assertString(obj.hostCPU);
+  assertString(obj.operatingSystem);
+  assertString(obj.targetCPU);
+  assertString(obj.version);
+  assertInt(obj.pid);
+  assertInt(obj.startTime);
+  assertIsolateRefs(obj.isolates);
+  return obj;
+}
diff --git a/pkg/vm_service/example/vm_service_tester.dart b/pkg/vm_service/example/vm_service_tester.dart
new file mode 100644
index 0000000..5d1f819
--- /dev/null
+++ b/pkg/vm_service/example/vm_service_tester.dart
@@ -0,0 +1,219 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library service_tester;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:pedantic/pedantic.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+import 'package:vm_service/vm_service_io.dart';
+
+final String host = 'localhost';
+final int port = 7575;
+
+VmService serviceClient;
+
+void main() {
+  Process process;
+
+  tearDown(() {
+    process?.kill();
+  });
+
+  test('integration', () async {
+    String sdk = path.dirname(path.dirname(Platform.resolvedExecutable));
+
+    print('Using sdk at ${sdk}.');
+
+    // pause_isolates_on_start, pause_isolates_on_exit
+    process = await Process.start('${sdk}/bin/dart', [
+      '--pause_isolates_on_start',
+      '--enable-vm-service=${port}',
+      '--disable-service-auth-codes',
+      'example/sample_main.dart'
+    ]);
+
+    print('dart process started');
+
+    // ignore: unawaited_futures
+    process.exitCode.then((code) => print('vm exited: ${code}'));
+    // ignore: strong_mode_down_cast_composite
+    process.stdout.transform(utf8.decoder).listen(print);
+    // ignore: strong_mode_down_cast_composite
+    process.stderr.transform(utf8.decoder).listen(print);
+
+    await new Future.delayed(new Duration(milliseconds: 500));
+
+    serviceClient = await vmServiceConnect(host, port, log: new StdoutLog());
+
+    print('socket connected');
+
+    serviceClient.onSend.listen((str) => print('--> ${str}'));
+
+    // The next listener will bail out if you toggle this to false, which we need
+    // to do for some things like the custom service registration tests.
+    var checkResponseJsonCompatibility = true;
+    serviceClient.onReceive.listen((str) {
+      print('<-- ${str}');
+
+      if (!checkResponseJsonCompatibility) return;
+
+      // For each received event, check that we can deserialize it and
+      // reserialize it back to the same exact representation (minus private
+      // fields).
+      var json = jsonDecode(str);
+      var originalJson = json['result'] as Map<String, dynamic>;
+      if (originalJson == null && json['method'] == 'streamNotify') {
+        originalJson = json['params']['event'];
+      }
+      expect(originalJson, isNotNull, reason: 'Unrecognized event type! $json');
+
+      // ignore: invalid_use_of_visible_for_testing_member
+      var instance =
+          createServiceObject(originalJson, const ['Event', 'Success']);
+      expect(instance, isNotNull,
+          reason: 'failed to deserialize object $originalJson!');
+
+      var reserializedJson = (instance as dynamic).toJson();
+
+      forEachNestedMap(originalJson, (obj) {
+        // Private fields that we don't reproduce
+        obj.removeWhere((k, v) => k.startsWith('_'));
+        // Extra fields that aren't specified and we don't reproduce
+        obj.remove('isExport');
+      });
+
+      forEachNestedMap(reserializedJson, (obj) {
+        // We provide explicit defaults for these, need to remove them.
+        obj.remove('valueAsStringIsTruncated');
+      });
+
+      expect(reserializedJson, equals(originalJson));
+    });
+
+    serviceClient.onIsolateEvent.listen((e) => print('onIsolateEvent: ${e}'));
+    serviceClient.onDebugEvent.listen((e) => print('onDebugEvent: ${e}'));
+    serviceClient.onGCEvent.listen((e) => print('onGCEvent: ${e}'));
+    serviceClient.onStdoutEvent.listen((e) => print('onStdoutEvent: ${e}'));
+    serviceClient.onStderrEvent.listen((e) => print('onStderrEvent: ${e}'));
+
+    unawaited(serviceClient.streamListen(EventStreams.kIsolate));
+    unawaited(serviceClient.streamListen(EventStreams.kDebug));
+    unawaited(serviceClient.streamListen(EventStreams.kStdout));
+
+    VM vm = await serviceClient.getVM();
+    print('hostCPU=${vm.hostCPU}');
+    print(await serviceClient.getVersion());
+    List<IsolateRef> isolates = await vm.isolates;
+    print(isolates);
+
+    // Disable the json reserialization checks since custom services are not
+    // supported.
+    checkResponseJsonCompatibility = false;
+    await testServiceRegistration();
+    checkResponseJsonCompatibility = true;
+
+    await testScriptParse(vm.isolates.first);
+    await testSourceReport(vm.isolates.first);
+
+    IsolateRef isolateRef = isolates.first;
+    print(await serviceClient.resume(isolateRef.id));
+
+    serviceClient.dispose();
+  });
+}
+
+// Deeply traverses a map and calls [cb] with each nested map and the
+// parent map.
+void forEachNestedMap(Map input, Function(Map) cb) {
+  var queue = Queue.from([input]);
+  while (queue.isNotEmpty) {
+    var next = queue.removeFirst();
+    if (next is Map) {
+      cb(next);
+      queue.addAll(next.values);
+    } else if (next is List) {
+      queue.addAll(next);
+    }
+  }
+}
+
+Future testServiceRegistration() async {
+  const String serviceName = 'serviceName';
+  const String serviceAlias = 'serviceAlias';
+  const String movedValue = 'movedValue';
+  serviceClient.registerServiceCallback(serviceName,
+      (Map<String, dynamic> params) async {
+    assert(params['input'] == movedValue);
+    return <String, dynamic>{
+      'result': {'output': params['input']}
+    };
+  });
+  await serviceClient.registerService(serviceName, serviceAlias);
+  VmService otherClient =
+      await vmServiceConnect(host, port, log: new StdoutLog());
+  Completer completer = new Completer();
+  otherClient.onEvent('_Service').listen((e) async {
+    if (e.service == serviceName && e.kind == EventKind.kServiceRegistered) {
+      assert(e.alias == serviceAlias);
+      Response response = await serviceClient.callMethod(
+        e.method,
+        args: <String, dynamic>{'input': movedValue},
+      );
+      assert(response.json['output'] == movedValue);
+      completer.complete();
+    }
+  });
+  await otherClient.streamListen('_Service');
+  await completer.future;
+}
+
+Future testScriptParse(IsolateRef isolateRef) async {
+  final Isolate isolate = await serviceClient.getIsolate(isolateRef.id);
+  final Library rootLibrary =
+      await serviceClient.getObject(isolateRef.id, isolate.rootLib.id);
+  final ScriptRef scriptRef = rootLibrary.scripts.first;
+
+  final Script script =
+      await serviceClient.getObject(isolateRef.id, scriptRef.id);
+  print(script);
+  print(script.uri);
+  print(script.library);
+  print(script.source.length);
+  print(script.tokenPosTable.length);
+}
+
+Future testSourceReport(IsolateRef isolateRef) async {
+  final Isolate isolate = await serviceClient.getIsolate(isolateRef.id);
+  final Library rootLibrary =
+      await serviceClient.getObject(isolateRef.id, isolate.rootLib.id);
+  final ScriptRef scriptRef = rootLibrary.scripts.first;
+
+  // make sure some code has run
+  await serviceClient.resume(isolateRef.id);
+  await Future.delayed(const Duration(milliseconds: 25));
+
+  final SourceReport sourceReport = await serviceClient.getSourceReport(
+      isolateRef.id, [SourceReportKind.kCoverage],
+      scriptId: scriptRef.id);
+  for (SourceReportRange range in sourceReport.ranges) {
+    print('  $range');
+    if (range.coverage != null) {
+      print('  ${range.coverage}');
+    }
+  }
+  print(sourceReport);
+}
+
+class StdoutLog extends Log {
+  void warning(String message) => print(message);
+
+  void severe(String message) => print(message);
+}
diff --git a/pkg/vm_service/java/.gitignore b/pkg/vm_service/java/.gitignore
new file mode 100644
index 0000000..4fef6d5
--- /dev/null
+++ b/pkg/vm_service/java/.gitignore
@@ -0,0 +1,100 @@
+# This is a generated file.
+
+src/org/dartlang/vm/service/VmService.java
+src/org/dartlang/vm/service/consumer/AllocationProfileConsumer.java
+src/org/dartlang/vm/service/consumer/BreakpointConsumer.java
+src/org/dartlang/vm/service/consumer/EvaluateConsumer.java
+src/org/dartlang/vm/service/consumer/EvaluateInFrameConsumer.java
+src/org/dartlang/vm/service/consumer/FlagListConsumer.java
+src/org/dartlang/vm/service/consumer/GetInboundReferencesConsumer.java
+src/org/dartlang/vm/service/consumer/GetIsolateConsumer.java
+src/org/dartlang/vm/service/consumer/GetMemoryUsageConsumer.java
+src/org/dartlang/vm/service/consumer/GetObjectConsumer.java
+src/org/dartlang/vm/service/consumer/InstanceSetConsumer.java
+src/org/dartlang/vm/service/consumer/InvokeConsumer.java
+src/org/dartlang/vm/service/consumer/ReloadReportConsumer.java
+src/org/dartlang/vm/service/consumer/RetainingPathConsumer.java
+src/org/dartlang/vm/service/consumer/ScriptListConsumer.java
+src/org/dartlang/vm/service/consumer/SourceReportConsumer.java
+src/org/dartlang/vm/service/consumer/StackConsumer.java
+src/org/dartlang/vm/service/consumer/SuccessConsumer.java
+src/org/dartlang/vm/service/consumer/TimelineConsumer.java
+src/org/dartlang/vm/service/consumer/TimelineFlagsConsumer.java
+src/org/dartlang/vm/service/consumer/TimestampConsumer.java
+src/org/dartlang/vm/service/consumer/VMConsumer.java
+src/org/dartlang/vm/service/consumer/VersionConsumer.java
+src/org/dartlang/vm/service/element/AllocationProfile.java
+src/org/dartlang/vm/service/element/BoundField.java
+src/org/dartlang/vm/service/element/BoundVariable.java
+src/org/dartlang/vm/service/element/Breakpoint.java
+src/org/dartlang/vm/service/element/ClassHeapStats.java
+src/org/dartlang/vm/service/element/ClassList.java
+src/org/dartlang/vm/service/element/ClassObj.java
+src/org/dartlang/vm/service/element/ClassRef.java
+src/org/dartlang/vm/service/element/Code.java
+src/org/dartlang/vm/service/element/CodeKind.java
+src/org/dartlang/vm/service/element/CodeRef.java
+src/org/dartlang/vm/service/element/Context.java
+src/org/dartlang/vm/service/element/ContextElement.java
+src/org/dartlang/vm/service/element/ContextRef.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
+src/org/dartlang/vm/service/element/Event.java
+src/org/dartlang/vm/service/element/EventKind.java
+src/org/dartlang/vm/service/element/ExceptionPauseMode.java
+src/org/dartlang/vm/service/element/ExtensionData.java
+src/org/dartlang/vm/service/element/Field.java
+src/org/dartlang/vm/service/element/FieldRef.java
+src/org/dartlang/vm/service/element/Flag.java
+src/org/dartlang/vm/service/element/FlagList.java
+src/org/dartlang/vm/service/element/Frame.java
+src/org/dartlang/vm/service/element/FrameKind.java
+src/org/dartlang/vm/service/element/Func.java
+src/org/dartlang/vm/service/element/FuncRef.java
+src/org/dartlang/vm/service/element/InboundReference.java
+src/org/dartlang/vm/service/element/InboundReferences.java
+src/org/dartlang/vm/service/element/Instance.java
+src/org/dartlang/vm/service/element/InstanceKind.java
+src/org/dartlang/vm/service/element/InstanceRef.java
+src/org/dartlang/vm/service/element/InstanceSet.java
+src/org/dartlang/vm/service/element/Isolate.java
+src/org/dartlang/vm/service/element/IsolateRef.java
+src/org/dartlang/vm/service/element/Library.java
+src/org/dartlang/vm/service/element/LibraryDependency.java
+src/org/dartlang/vm/service/element/LibraryRef.java
+src/org/dartlang/vm/service/element/LogRecord.java
+src/org/dartlang/vm/service/element/MapAssociation.java
+src/org/dartlang/vm/service/element/MemoryUsage.java
+src/org/dartlang/vm/service/element/Message.java
+src/org/dartlang/vm/service/element/Null.java
+src/org/dartlang/vm/service/element/NullRef.java
+src/org/dartlang/vm/service/element/Obj.java
+src/org/dartlang/vm/service/element/ObjRef.java
+src/org/dartlang/vm/service/element/ReloadReport.java
+src/org/dartlang/vm/service/element/Response.java
+src/org/dartlang/vm/service/element/RetainingObject.java
+src/org/dartlang/vm/service/element/RetainingPath.java
+src/org/dartlang/vm/service/element/Script.java
+src/org/dartlang/vm/service/element/ScriptList.java
+src/org/dartlang/vm/service/element/ScriptRef.java
+src/org/dartlang/vm/service/element/Sentinel.java
+src/org/dartlang/vm/service/element/SentinelKind.java
+src/org/dartlang/vm/service/element/SourceLocation.java
+src/org/dartlang/vm/service/element/SourceReport.java
+src/org/dartlang/vm/service/element/SourceReportCoverage.java
+src/org/dartlang/vm/service/element/SourceReportKind.java
+src/org/dartlang/vm/service/element/SourceReportRange.java
+src/org/dartlang/vm/service/element/Stack.java
+src/org/dartlang/vm/service/element/StepOption.java
+src/org/dartlang/vm/service/element/Success.java
+src/org/dartlang/vm/service/element/Timeline.java
+src/org/dartlang/vm/service/element/TimelineEvent.java
+src/org/dartlang/vm/service/element/TimelineFlags.java
+src/org/dartlang/vm/service/element/Timestamp.java
+src/org/dartlang/vm/service/element/TypeArguments.java
+src/org/dartlang/vm/service/element/TypeArgumentsRef.java
+src/org/dartlang/vm/service/element/UnresolvedSourceLocation.java
+src/org/dartlang/vm/service/element/VM.java
+src/org/dartlang/vm/service/element/VMRef.java
+src/org/dartlang/vm/service/element/Version.java
diff --git a/pkg/vm_service/java/build.xml b/pkg/vm_service/java/build.xml
new file mode 100644
index 0000000..d13fdff
--- /dev/null
+++ b/pkg/vm_service/java/build.xml
@@ -0,0 +1,54 @@
+<project name="vm_service_lib" default="dist">
+  <target name="clean">
+    <delete dir="build"/>
+  </target>
+
+  <target name="init">
+    <mkdir dir="build"/>
+    <mkdir dir="dist"/>
+
+    <property environment="env"/>
+    <property file="version.properties" prefix="service"/>
+    <property name="build.id" value=""/>
+
+    <property
+        name="path"
+        value="third_party/gson/gson-2.2.4.jar;third_party/guava/guava-13.0.1.jar;third_party/weberknecht/weberknecht-0.1.5.jar"/>
+  </target>
+
+  <target name="compile" depends="init">
+    <!-- compile library source -->
+    <mkdir dir="build/classes"/>
+    <javac srcdir="src" destdir="build/classes" includeantruntime="false"
+        source="1.7" target="1.7"
+        classpath="${path}" debug="true"/>
+
+    <!-- compile tests -->
+    <mkdir dir="build/test"/>
+    <javac srcdir="test" destdir="build/test" includeantruntime="false"
+        classpath="${path};build/classes" debug="true"/>
+  </target>
+
+  <target name="jar" depends="compile">
+    <copy file="version.properties" todir="build/classes"/>
+    <jar destfile="build/vm_service_lib.jar" basedir="build/classes"/>
+    <jar destfile="build/vm_service_lib-src.jar" basedir="src"/>
+  </target>
+
+  <target name="test" depends="compile">
+    <java classname="org.dartlang.vm.service.VmServiceTest" fork="true" failonerror="true">
+      <arg value="${env.DART_SDK}"/>
+      <classpath>
+        <pathelement path="${path}"/>
+        <pathelement location="build/classes"/>
+        <pathelement location="build/test"/>
+      </classpath>
+    </java>
+  </target>
+
+  <target name="dist" depends="jar,test">
+    <!-- copy and rename the library -->
+    <copy file="build/vm_service_lib.jar" tofile="dist/vm_service_lib-${service.version}${build.id}.jar"/>
+    <copy file="build/vm_service_lib-src.jar" tofile="dist/vm_service_lib-${service.version}${build.id}-src.jar"/>
+  </target>
+</project>
diff --git a/pkg/vm_service/java/classpath.txt b/pkg/vm_service/java/classpath.txt
new file mode 100644
index 0000000..a05a02a
--- /dev/null
+++ b/pkg/vm_service/java/classpath.txt
@@ -0,0 +1 @@
+third_party/gson/gson-2.2.4.jar:third_party/guava/guava-13.0.1.jar:third_party/weberknecht/weberknecht-0.1.5.jar
diff --git a/pkg/vm_service/java/example/sample_exception.dart b/pkg/vm_service/java/example/sample_exception.dart
new file mode 100644
index 0000000..cfe1745
--- /dev/null
+++ b/pkg/vm_service/java/example/sample_exception.dart
@@ -0,0 +1,53 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+void main(List<String> args) {
+  // Hijinks to remove an analysis warning.
+  dynamic local1;
+  if (true) local1 = 'abcd';
+
+  int local2 = 2;
+  var longList = [1, "hello", 3, 5, 7, 11, 13, 14, 15, 16, 17, 18, 19, 20];
+  var deepList = [
+    new Bar(),
+    [
+      [
+        [
+          [
+            [7]
+          ]
+        ],
+        "end"
+      ]
+    ]
+  ];
+
+  print('hello from main');
+
+  // throw a caught exception
+  try {
+    foo(local1.baz());
+  } catch (e) {
+    print('-----------------');
+    print('caught $e');
+    print('-----------------');
+  }
+  foo(local2);
+
+  print(longList);
+  print(deepList);
+  print('exiting...');
+}
+
+void foo(int val) {
+  print('val: ${val}');
+}
+
+class Bar extends FooBar {
+  String field1 = "my string";
+}
+
+class FooBar {
+  int field2 = 47;
+}
diff --git a/pkg/vm_service/java/example/sample_main.dart b/pkg/vm_service/java/example/sample_main.dart
new file mode 100644
index 0000000..da88291
--- /dev/null
+++ b/pkg/vm_service/java/example/sample_main.dart
@@ -0,0 +1,46 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+void main(List<String> args) {
+  String local1 = 'abcd';
+  int local2 = 2;
+  var longList = [1, "hello", 3, 5, 7, 11, 13, 14, 15, 16, 17, 18, 19, 20];
+  var deepList = [
+    new Bar(),
+    [
+      [
+        [
+          [
+            [7]
+          ]
+        ],
+        "end"
+      ]
+    ]
+  ];
+
+  print('hello from main');
+
+  foo(1);
+  foo(local2);
+  foo(3);
+  foo(local1.length);
+
+  print(longList);
+  print(deepList);
+
+  print('exiting...');
+}
+
+void foo(int val) {
+  print('val: ${val}');
+}
+
+class Bar extends FooBar {
+  String field1 = "my string";
+}
+
+class FooBar {
+  int field2 = 47;
+}
diff --git a/pkg/vm_service/java/javaconfig.json b/pkg/vm_service/java/javaconfig.json
new file mode 100644
index 0000000..2402aaa
--- /dev/null
+++ b/pkg/vm_service/java/javaconfig.json
@@ -0,0 +1,5 @@
+{
+    "sourcePath": ["src", "test"],
+    "classPathFile": "classpath.txt",
+    "outputDirectory": "build/classes"
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceCompleter.java b/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceCompleter.java
new file mode 100644
index 0000000..48ae3ea
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceCompleter.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright (c) 2017, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import com.google.gson.JsonObject;
+
+public interface RemoteServiceCompleter {
+  /**
+   * Should be called when a service request completes successfully.
+   *
+   * @param result the result of the request
+   */
+  void result(JsonObject result);
+
+  /**
+   * Should be called when a service request completes with an error.
+   *
+   * @param code    the error code generated by the request
+   * @param message the description of the error
+   * @param data    [optional] the description of the error
+   */
+  void error(int code, String message, JsonObject data);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceRunner.java b/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceRunner.java
new file mode 100644
index 0000000..cc42969
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/RemoteServiceRunner.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (c) 2017, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import com.google.gson.JsonObject;
+
+/**
+ * Interface used by {@link VmService} to register callbacks to services.
+ */
+public interface RemoteServiceRunner {
+  /**
+   * Called when a service request has been received.
+   *
+   * @param params    the parameters of the request
+   * @param completer the completer to invoke at the end of the execution
+   */
+  void run(JsonObject params, RemoteServiceCompleter completer);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java
new file mode 100644
index 0000000..f794f6f
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java
@@ -0,0 +1,648 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import com.google.common.collect.Maps;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import de.roderick.weberknecht.WebSocket;
+import de.roderick.weberknecht.WebSocketEventHandler;
+import de.roderick.weberknecht.WebSocketException;
+import de.roderick.weberknecht.WebSocketMessage;
+import org.dartlang.vm.service.consumer.*;
+import org.dartlang.vm.service.element.*;
+import org.dartlang.vm.service.internal.RequestSink;
+import org.dartlang.vm.service.internal.VmServiceConst;
+import org.dartlang.vm.service.internal.WebSocketRequestSink;
+import org.dartlang.vm.service.logging.Logging;
+
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * Internal {@link VmService} base class containing non-generated code.
+ */
+@SuppressWarnings({"unused", "WeakerAccess"})
+abstract class VmServiceBase implements VmServiceConst {
+  /**
+   * Connect to the VM observatory service via the specified URI
+   *
+   * @return an API object for interacting with the VM service (not {@code null}).
+   */
+  public static VmService connect(final String url) throws IOException {
+    // Validate URL
+    URI uri;
+    try {
+      uri = new URI(url);
+    } catch (URISyntaxException e) {
+      throw new IOException("Invalid URL: " + url, e);
+    }
+    String wsScheme = uri.getScheme();
+    if (!"ws".equals(wsScheme) && !"wss".equals(wsScheme)) {
+      throw new IOException("Unsupported URL scheme: " + wsScheme);
+    }
+
+    // Create web socket and observatory
+    WebSocket webSocket;
+    try {
+      webSocket = new WebSocket(uri);
+    } catch (WebSocketException e) {
+      throw new IOException("Failed to create websocket: " + url, e);
+    }
+    final VmService vmService = new VmService();
+
+    // Setup event handler for forwarding responses
+    webSocket.setEventHandler(new WebSocketEventHandler() {
+      @Override
+      public void onClose() {
+        Logging.getLogger().logInformation("VM connection closed: " + url);
+
+        vmService.connectionClosed();
+      }
+
+      @Override
+      public void onMessage(WebSocketMessage message) {
+        Logging.getLogger().logInformation("VM message: " + message.getText());
+        try {
+          vmService.processMessage(message.getText());
+        } catch (Exception e) {
+          Logging.getLogger().logError(e.getMessage(), e);
+        }
+      }
+
+      @Override
+      public void onOpen() {
+        vmService.connectionOpened();
+
+        Logging.getLogger().logInformation("VM connection open: " + url);
+      }
+
+      @Override
+      public void onPing() {
+      }
+
+      @Override
+      public void onPong() {
+      }
+    });
+
+    // Establish WebSocket Connection
+    //noinspection TryWithIdenticalCatches
+    try {
+      webSocket.connect();
+    } catch (WebSocketException e) {
+      throw new IOException("Failed to connect: " + url, e);
+    } catch (ArrayIndexOutOfBoundsException e) {
+      // The weberknecht can occasionally throw an array index exception if a connect terminates on initial connect
+      // (de.roderick.weberknecht.WebSocket.connect, WebSocket.java:126).
+      throw new IOException("Failed to connect: " + url, e);
+    }
+    vmService.requestSink = new WebSocketRequestSink(webSocket);
+
+    // Check protocol version
+    final CountDownLatch latch = new CountDownLatch(1);
+    final String[] errMsg = new String[1];
+    vmService.getVersion(new VersionConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        String msg = "Failed to determine protocol version: " + error.getCode() + "\n  message: "
+            + error.getMessage() + "\n  details: " + error.getDetails();
+        Logging.getLogger().logInformation(msg);
+        errMsg[0] = msg;
+      }
+
+      @Override
+      public void received(Version version) {
+        int major = version.getMajor();
+        int minor = version.getMinor();
+        if (major != VmService.versionMajor || minor != VmService.versionMinor) {
+          if (major == 2 || major == 3) {
+            Logging.getLogger().logInformation(
+                "Difference in protocol version: client=" + VmService.versionMajor + "."
+                    + VmService.versionMinor + " vm=" + major + "." + minor);
+          } else {
+            String msg = "Incompatible protocol version: client=" + VmService.versionMajor + "."
+                + VmService.versionMinor + " vm=" + major + "." + minor;
+            Logging.getLogger().logError(msg);
+            errMsg[0] = msg;
+          }
+        }
+
+        vmService.runtimeVersion = version;
+
+        latch.countDown();
+      }
+    });
+
+    try {
+      if (!latch.await(5, TimeUnit.SECONDS)) {
+        throw new IOException("Failed to determine protocol version");
+      }
+      if (errMsg[0] != null) {
+        throw new IOException(errMsg[0]);
+      }
+    } catch (InterruptedException e) {
+      throw new RuntimeException("Interrupted while waiting for response", e);
+    }
+
+    return vmService;
+  }
+
+  /**
+   * Connect to the VM observatory service on the given local port.
+   *
+   * @return an API object for interacting with the VM service (not {@code null}).
+   *
+   * @deprecated prefer the Url based constructor {@link VmServiceBase#connect}
+   */
+  @Deprecated
+  public static VmService localConnect(int port) throws IOException {
+    return connect("ws://localhost:" + port + "/ws");
+  }
+
+  /**
+   * A mapping between {@link String} ids' and the associated {@link Consumer} that was passed when
+   * the request was made. Synchronize against {@link #consumerMapLock} before accessing this field.
+   */
+  private final Map<String, Consumer> consumerMap = Maps.newHashMap();
+
+  /**
+   * The object used to synchronize access to {@link #consumerMap}.
+   */
+  private final Object consumerMapLock = new Object();
+
+  /**
+   * The unique ID for the next request.
+   */
+  private final AtomicInteger nextId = new AtomicInteger();
+
+  /**
+   * A list of objects to which {@link Event}s from the VM are forwarded.
+   */
+  private final List<VmServiceListener> vmListeners = new ArrayList<>();
+
+  /**
+   * A list of objects to which {@link Event}s from the VM are forwarded.
+   */
+  private final Map<String, RemoteServiceRunner> remoteServiceRunners = Maps.newHashMap();
+
+  /**
+   * The channel through which observatory requests are made.
+   */
+  RequestSink requestSink;
+
+  Version runtimeVersion;
+
+  /**
+   * Add a listener to receive {@link Event}s from the VM.
+   */
+  public void addVmServiceListener(VmServiceListener listener) {
+    vmListeners.add(listener);
+  }
+
+  /**
+   * Remove the given listener from the VM.
+   */
+  public void removeVmServiceListener(VmServiceListener listener) {
+    vmListeners.remove(listener);
+  }
+
+  /**
+   * Add a VM RemoteServiceRunner.
+   */
+  public void addServiceRunner(String service, RemoteServiceRunner runner) {
+    remoteServiceRunners.put(service, runner);
+  }
+
+  /**
+   * Remove a VM RemoteServiceRunner.
+   */
+  public void removeServiceRunner(String service) {
+    remoteServiceRunners.remove(service);
+  }
+
+  /**
+   * Return the VM service protocol version supported by the current debug connection.
+   */
+  public Version getRuntimeVersion() {
+    return runtimeVersion;
+  }
+
+  /**
+   * Disconnect from the VM observatory service.
+   */
+  public void disconnect() {
+    requestSink.close();
+  }
+
+  /**
+   * Return the instance with the given identifier.
+   */
+  public void getInstance(String isolateId, String instanceId, final GetInstanceConsumer consumer) {
+    getObject(isolateId, instanceId, new GetObjectConsumer() {
+
+      @Override
+      public void onError(RPCError error) {
+        consumer.onError(error);
+      }
+
+      @Override
+      public void received(Obj response) {
+        if (response instanceof Instance) {
+          consumer.received((Instance) response);
+        } else {
+          onError(RPCError.unexpected("Instance", response));
+        }
+      }
+
+      @Override
+      public void received(Sentinel response) {
+        onError(RPCError.unexpected("Instance", response));
+      }
+    });
+  }
+
+  /**
+   * Return the library with the given identifier.
+   */
+  public void getLibrary(String isolateId, String libraryId, final GetLibraryConsumer consumer) {
+    getObject(isolateId, libraryId, new GetObjectConsumer() {
+
+      @Override
+      public void onError(RPCError error) {
+        consumer.onError(error);
+      }
+
+      @Override
+      public void received(Obj response) {
+        if (response instanceof Library) {
+          consumer.received((Library) response);
+        } else {
+          onError(RPCError.unexpected("Library", response));
+        }
+      }
+
+      @Override
+      public void received(Sentinel response) {
+        onError(RPCError.unexpected("Library", response));
+      }
+    });
+  }
+
+  public abstract void getObject(String isolateId, String objectId, GetObjectConsumer consumer);
+
+  /**
+   * Invoke a specific service protocol extension method.
+   * <p>
+   * See https://api.dartlang.org/stable/dart-developer/dart-developer-library.html.
+   */
+  public void callServiceExtension(String isolateId, String method, ServiceExtensionConsumer consumer) {
+    JsonObject params = new JsonObject();
+    params.addProperty("isolateId", isolateId);
+    request(method, params, consumer);
+  }
+
+  /**
+   * Invoke a specific service protocol extension method.
+   * <p>
+   * See https://api.dartlang.org/stable/dart-developer/dart-developer-library.html.
+   */
+  public void callServiceExtension(String isolateId, String method, JsonObject params, ServiceExtensionConsumer consumer) {
+    params.addProperty("isolateId", isolateId);
+    request(method, params, consumer);
+  }
+
+  /**
+   * Sends the request and associates the request with the passed {@link Consumer}.
+   */
+  protected void request(String method, JsonObject params, Consumer consumer) {
+
+    // Assemble the request
+    String id = Integer.toString(nextId.incrementAndGet());
+    JsonObject request = new JsonObject();
+
+    request.addProperty(JSONRPC, JSONRPC_VERSION);
+    request.addProperty(ID, id);
+    request.addProperty(METHOD, method);
+    request.add(PARAMS, params);
+
+    // Cache the consumer to receive the response
+    synchronized (consumerMapLock) {
+      consumerMap.put(id, consumer);
+    }
+
+    // Send the request
+    requestSink.add(request);
+  }
+
+  public void connectionOpened() {
+    for (VmServiceListener listener : new ArrayList<>(vmListeners)) {
+      try {
+        listener.connectionOpened();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Exception notifying listener", e);
+      }
+    }
+  }
+
+  private void forwardEvent(String streamId, Event event) {
+    for (VmServiceListener listener : new ArrayList<>(vmListeners)) {
+      try {
+        listener.received(streamId, event);
+      } catch (Exception e) {
+        Logging.getLogger().logError("Exception processing event: " + streamId + ", " + event.getJson(), e);
+      }
+    }
+  }
+
+  public void connectionClosed() {
+    for (VmServiceListener listener : new ArrayList<>(vmListeners)) {
+      try {
+        listener.connectionClosed();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Exception notifying listener", e);
+      }
+    }
+  }
+
+  abstract void forwardResponse(Consumer consumer, String type, JsonObject json);
+
+  void logUnknownResponse(Consumer consumer, JsonObject json) {
+    Class<? extends Consumer> consumerClass = consumer.getClass();
+    StringBuilder msg = new StringBuilder();
+    msg.append("Expected response for ").append(consumerClass).append("\n");
+    for (Class<?> interf : consumerClass.getInterfaces()) {
+      msg.append("  implementing ").append(interf).append("\n");
+    }
+    msg.append("  but received ").append(json);
+    Logging.getLogger().logError(msg.toString());
+  }
+
+  /**
+   * Process the response from the VM service and forward that response to the consumer associated
+   * with the response id.
+   */
+  void processMessage(String jsonText) {
+    if (jsonText == null || jsonText.isEmpty()) {
+      return;
+    }
+
+    // Decode the JSON
+    JsonObject json;
+    try {
+      json = (JsonObject) new JsonParser().parse(jsonText);
+    } catch (Exception e) {
+      Logging.getLogger().logError("Parse message failed: " + jsonText, e);
+      return;
+    }
+
+    if (json.has("method")) {
+      if (!json.has(PARAMS)) {
+        final String message = "Missing " + PARAMS;
+        Logging.getLogger().logError(message);
+        final JsonObject response = new JsonObject();
+        response.addProperty(JSONRPC, JSONRPC_VERSION);
+        final JsonObject error = new JsonObject();
+        error.addProperty(CODE, INVALID_REQUEST);
+        error.addProperty(MESSAGE, message);
+        response.add(ERROR, error);
+        requestSink.add(response);
+        return;
+      }
+      if (json.has("id")) {
+        processRequest(json);
+      } else {
+        processNotification(json);
+      }
+    } else if (json.has("result") || json.has("error")) {
+      processResponse(json);
+    } else {
+      Logging.getLogger().logError("Malformed message");
+    }
+  }
+
+  void processRequest(JsonObject json) {
+    final JsonObject response = new JsonObject();
+    response.addProperty(JSONRPC, JSONRPC_VERSION);
+
+    // Get the consumer associated with this request
+    String id;
+    try {
+      id = json.get(ID).getAsString();
+    } catch (Exception e) {
+      final String message = "Request malformed " + ID;
+      Logging.getLogger().logError(message, e);
+      final JsonObject error = new JsonObject();
+      error.addProperty(CODE, INVALID_REQUEST);
+      error.addProperty(MESSAGE, message);
+      response.add(ERROR, error);
+      requestSink.add(response);
+      return;
+    }
+
+    response.addProperty(ID, id);
+
+    String method;
+    try {
+      method = json.get(METHOD).getAsString();
+    } catch (Exception e) {
+      final String message = "Request malformed " + METHOD;
+      Logging.getLogger().logError(message, e);
+      final JsonObject error = new JsonObject();
+      error.addProperty(CODE, INVALID_REQUEST);
+      error.addProperty(MESSAGE, message);
+      response.add(ERROR, error);
+      requestSink.add(response);
+      return;
+    }
+
+    JsonObject params;
+    try {
+      params = json.get(PARAMS).getAsJsonObject();
+    } catch (Exception e) {
+      final String message = "Request malformed " + METHOD;
+      Logging.getLogger().logError(message, e);
+      final JsonObject error = new JsonObject();
+      error.addProperty(CODE, INVALID_REQUEST);
+      error.addProperty(MESSAGE, message);
+      response.add(ERROR, error);
+      requestSink.add(response);
+      return;
+    }
+
+    if (!remoteServiceRunners.containsKey(method)) {
+      final String message = "Unknown service " + method;
+      Logging.getLogger().logError(message);
+      final JsonObject error = new JsonObject();
+      error.addProperty(CODE, METHOD_NOT_FOUND);
+      error.addProperty(MESSAGE, message);
+      response.add(ERROR, error);
+      requestSink.add(response);
+      return;
+    }
+
+    final RemoteServiceRunner runner = remoteServiceRunners.get(method);
+    try {
+      runner.run(params, new RemoteServiceCompleter() {
+        public void result(JsonObject result) {
+          response.add(RESULT, result);
+          requestSink.add(response);
+        }
+
+        public void error(int code, String message, JsonObject data) {
+          final JsonObject error = new JsonObject();
+          error.addProperty(CODE, code);
+          error.addProperty(MESSAGE, message);
+          if (data != null) {
+            error.add(DATA, data);
+          }
+          response.add(ERROR, error);
+          requestSink.add(response);
+        }
+      });
+    } catch (Exception e) {
+      final String message = "Internal Server Error";
+      Logging.getLogger().logError(message, e);
+      final JsonObject error = new JsonObject();
+      error.addProperty(CODE, SERVER_ERROR);
+      error.addProperty(MESSAGE, message);
+      response.add(ERROR, error);
+      requestSink.add(response);
+    }
+  }
+
+  private static final RemoteServiceCompleter ignoreCallback =
+      new RemoteServiceCompleter() {
+        public void result(JsonObject result) {
+          // ignore
+        }
+
+        public void error(int code, String message, JsonObject data) {
+          // ignore
+        }
+      };
+
+  void processNotification(JsonObject json) {
+    String method;
+    try {
+      method = json.get(METHOD).getAsString();
+    } catch (Exception e) {
+      Logging.getLogger().logError("Request malformed " + METHOD, e);
+      return;
+    }
+    JsonObject params;
+    try {
+      params = json.get(PARAMS).getAsJsonObject();
+    } catch (Exception e) {
+      Logging.getLogger().logError("Event missing " + PARAMS, e);
+      return;
+    }
+    if ("streamNotify".equals(method)) {
+      String streamId;
+      try {
+        streamId = params.get(STREAM_ID).getAsString();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Event missing " + STREAM_ID, e);
+        return;
+      }
+      Event event;
+      try {
+        event = new Event(params.get(EVENT).getAsJsonObject());
+      } catch (Exception e) {
+        Logging.getLogger().logError("Event missing " + EVENT, e);
+        return;
+      }
+      forwardEvent(streamId, event);
+    } else {
+      if (!remoteServiceRunners.containsKey(method)) {
+        Logging.getLogger().logError("Unknown service " + method);
+        return;
+      }
+
+      final RemoteServiceRunner runner = remoteServiceRunners.get(method);
+      try {
+        runner.run(params, ignoreCallback);
+      } catch (Exception e) {
+        Logging.getLogger().logError("Internal Server Error", e);
+      }
+    }
+  }
+
+  void processResponse(JsonObject json) {
+    JsonElement idElem = json.get(ID);
+    if (idElem == null) {
+      Logging.getLogger().logError("Response missing " + ID);
+      return;
+    }
+
+    // Get the consumer associated with this response
+    String id;
+    try {
+      id = idElem.getAsString();
+    } catch (Exception e) {
+      Logging.getLogger().logError("Response missing " + ID, e);
+      return;
+    }
+    Consumer consumer = consumerMap.remove(id);
+    if (consumer == null) {
+      Logging.getLogger().logError("No consumer associated with " + ID + ": " + id);
+      return;
+    }
+
+    // Forward the response if the request was successfully executed
+    JsonElement resultElem = json.get(RESULT);
+    if (resultElem != null) {
+      JsonObject result;
+      try {
+        result = resultElem.getAsJsonObject();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Response has invalid " + RESULT, e);
+        return;
+      }
+      String responseType;
+      try {
+        responseType = result.get(TYPE).getAsString();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Response missing " + TYPE, e);
+        return;
+      }
+      forwardResponse(consumer, responseType, result);
+      return;
+    }
+
+    // Forward an error if the request failed
+    resultElem = json.get(ERROR);
+    if (resultElem != null) {
+      JsonObject error;
+      try {
+        error = resultElem.getAsJsonObject();
+      } catch (Exception e) {
+        Logging.getLogger().logError("Response has invalid " + RESULT, e);
+        return;
+      }
+      consumer.onError(new RPCError(error));
+      return;
+    }
+
+    Logging.getLogger().logError("Response missing " + RESULT + " and " + ERROR);
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceListener.java b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceListener.java
new file mode 100644
index 0000000..7e59bea
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceListener.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import org.dartlang.vm.service.element.Event;
+
+/**
+ * Interface used by {@link VmService} to notify others of VM events.
+ */
+public interface VmServiceListener {
+  void connectionOpened();
+
+  /**
+   * Called when a VM event has been received.
+   *
+   * @param streamId the stream identifier (e.g. {@link VmService#DEBUG_STREAM_ID}
+   * @param event    the event
+   */
+  void received(String streamId, Event event);
+
+  void connectionClosed();
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/Consumer.java b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/Consumer.java
new file mode 100644
index 0000000..3175d25
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/Consumer.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.consumer;
+
+import org.dartlang.vm.service.element.RPCError;
+
+/**
+ * Consumer is a common interface for all consumer interfaces.
+ */
+public interface Consumer {
+  /**
+   * Called if the request failed for some reason.
+   */
+  void onError(RPCError error);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetInstanceConsumer.java b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetInstanceConsumer.java
new file mode 100644
index 0000000..ae6658c
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetInstanceConsumer.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.consumer;
+
+import org.dartlang.vm.service.element.Instance;
+
+public interface GetInstanceConsumer extends Consumer {
+  void received(Instance response);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetLibraryConsumer.java b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetLibraryConsumer.java
new file mode 100644
index 0000000..5d61e60
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/GetLibraryConsumer.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.consumer;
+
+import org.dartlang.vm.service.element.Library;
+
+public interface GetLibraryConsumer extends Consumer {
+  void received(Library response);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/ServiceExtensionConsumer.java b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/ServiceExtensionConsumer.java
new file mode 100644
index 0000000..71b676d
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/consumer/ServiceExtensionConsumer.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2017, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.consumer;
+
+import com.google.gson.JsonObject;
+
+public interface ServiceExtensionConsumer extends Consumer {
+  void received(JsonObject result);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/element/Element.java b/pkg/vm_service/java/src/org/dartlang/vm/service/element/Element.java
new file mode 100644
index 0000000..2319998
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/element/Element.java
@@ -0,0 +1,73 @@
+package org.dartlang.vm.service.element;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Superclass for all observatory elements.
+ */
+public class Element {
+  protected final JsonObject json;
+
+  public Element(JsonObject json) {
+    this.json = json;
+  }
+
+  /**
+   * Return the underlying JSON backing this element.
+   */
+  public JsonObject getJson() {
+    return json;
+  }
+
+  /**
+   * Return a specific JSON member as a list of integers.
+   */
+  List<Integer> getListInt(String memberName) {
+    return jsonArrayToListInt(json.getAsJsonArray(memberName));
+  }
+
+  /**
+   * Return a specific JSON member as a list of strings.
+   */
+  List<String> getListString(String memberName) {
+    return jsonArrayToListString(json.getAsJsonArray(memberName));
+  }
+
+  /**
+   * Return a specific JSON member as a list of list of integers.
+   */
+  List<List<Integer>> getListListInt(String memberName) {
+    JsonArray array = json.getAsJsonArray(memberName);
+    if (array == null) {
+      return null;
+    }
+    int size = array.size();
+    List<List<Integer>> result = new ArrayList<>();
+    for (int index = 0; index < size; ++index) {
+      result.add(jsonArrayToListInt(array.get(index).getAsJsonArray()));
+    }
+    return result;
+  }
+
+  private List<Integer> jsonArrayToListInt(JsonArray array) {
+    int size = array.size();
+    List<Integer> result = new ArrayList<>();
+    for (int index = 0; index < size; ++index) {
+      result.add(array.get(index).getAsInt());
+    }
+    return result;
+  }
+
+  private List<String> jsonArrayToListString(JsonArray array) {
+    int size = array.size();
+    List<String> result = new ArrayList<>();
+    for (int index = 0; index < size; ++index) {
+      result.add(array.get(index).getAsString());
+    }
+    return result;
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/element/ElementList.java b/pkg/vm_service/java/src/org/dartlang/vm/service/element/ElementList.java
new file mode 100644
index 0000000..ffce45b
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/element/ElementList.java
@@ -0,0 +1,56 @@
+package org.dartlang.vm.service.element;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+
+import java.util.Iterator;
+
+/**
+ * Simple wrapper around a {@link JsonArray} which lazily converts {@link JsonObject} elements to
+ * subclasses of {@link Element}. Subclasses need only implement {@link #basicGet(JsonArray, int)}
+ * to return an {@link Element} subclass for the {@link JsonObject} at a given index.
+ */
+public abstract class ElementList<T> implements Iterable<T> {
+
+  private final JsonArray array;
+
+  public ElementList(JsonArray array) {
+    this.array = array;
+  }
+
+  public T get(int index) {
+    return basicGet(array, index);
+  }
+
+  public boolean isEmpty() {
+    return size() == 0;
+  }
+
+  @Override
+  public Iterator<T> iterator() {
+    return new Iterator<T>() {
+      int index = 0;
+
+      @Override
+      public boolean hasNext() {
+        return index < size();
+      }
+
+      @Override
+      public T next() {
+        return get(index++);
+      }
+
+      @Override
+      public void remove() {
+        throw new UnsupportedOperationException();
+      }
+    };
+  }
+
+  public int size() {
+    return array.size();
+  }
+
+  protected abstract T basicGet(JsonArray array, int index);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/element/RPCError.java b/pkg/vm_service/java/src/org/dartlang/vm/service/element/RPCError.java
new file mode 100644
index 0000000..91d21d7
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/element/RPCError.java
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.element;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import org.dartlang.vm.service.internal.VmServiceConst;
+
+/**
+ * When an RPC encounters an error, it is provided in the _error_ property of the response object.
+ * JSON-RPC errors always provide _code_, _message_, and _data_ properties. <br/>
+ * Here is an example error response for our [streamListen](#streamlisten) request above. This error
+ * would be generated if we were attempting to subscribe to the _GC_ stream multiple times from the
+ * same client.
+ *
+ * <pre>
+ * {
+ *   "jsonrpc": "2.0",
+ *   "error": {
+ *     "code": 103,
+ *     "message": "Stream already subscribed",
+ *     "data": {
+ *       "details": "The stream 'GC' is already subscribed"
+ *     }
+ *   }
+ *   "id": "2"
+ * }
+ * </pre>
+ * <p>
+ * In addition the the [error codes](http://www.jsonrpc.org/specification#error_object) specified in
+ * the JSON-RPC spec, we use the following application specific error codes:
+ *
+ * <pre>
+ * code | message | meaning
+ * ---- | ------- | -------
+ * 100 | Feature is disabled | The operation is unable to complete because a feature is disabled
+ * 101 | VM must be paused | This operation is only valid when the VM is paused
+ * 102 | Cannot add breakpoint | The VM is unable to add a breakpoint at the specified line or function
+ * 103 | Stream already subscribed | The client is already subscribed to the specified _streamId_
+ * 104 | Stream not subscribed | The client is not subscribed to the specified _streamId_
+ * </pre>
+ */
+public class RPCError extends Element implements VmServiceConst {
+
+  /**
+   * The response code used by the client when it receives a response from the server that it did
+   * not expect. For example, it requested a library element but received a list.
+   */
+  public static final int UNEXPECTED_RESPONSE = 5;
+
+  public static RPCError unexpected(String expectedType, Response response) {
+    String errMsg = "Expected type " + expectedType + " but received " + response.getType();
+    if (response instanceof Sentinel) {
+      errMsg += ": " + ((Sentinel) response).getKind();
+    }
+    JsonObject json = new JsonObject();
+    json.addProperty("code", UNEXPECTED_RESPONSE);
+    json.addProperty("message", errMsg);
+    JsonObject data = new JsonObject();
+    data.addProperty("details", errMsg);
+    data.add("response", response.getJson());
+    json.add("data", data);
+    return new RPCError(json);
+  }
+
+  public RPCError(JsonObject json) {
+    super(json);
+  }
+
+  public int getCode() {
+    return json.get("code").getAsInt();
+  }
+
+  public String getDetails() {
+    JsonElement data = json.get("data");
+    if (data instanceof JsonObject) {
+      JsonElement details = ((JsonObject) data).get("details");
+      if (details != null) {
+        return details.getAsString();
+      }
+    }
+    return null;
+  }
+
+  public String getMessage() {
+    return json.get("message").getAsString();
+  }
+
+  public JsonObject getRequest() {
+    JsonElement data = json.get("data");
+    if (data instanceof JsonObject) {
+      JsonElement request = ((JsonObject) data).get("request");
+      if (request instanceof JsonObject) {
+        return (JsonObject) request;
+      }
+    }
+    return null;
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/BlockingRequestSink.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/BlockingRequestSink.java
new file mode 100644
index 0000000..cf8cd3f
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/BlockingRequestSink.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+import com.google.common.collect.Lists;
+import com.google.gson.JsonObject;
+
+import java.util.LinkedList;
+
+/**
+ * A {@link RequestSink} that enqueues all requests and can be later converted into a "passthrough"
+ * or an "error" {@link RequestSink}.
+ */
+public class BlockingRequestSink implements RequestSink {
+  /**
+   * The base {@link RequestSink}
+   */
+  private final RequestSink base;
+
+  /**
+   * A queue of requests.
+   */
+  private final LinkedList<JsonObject> queue = Lists.newLinkedList();
+
+  public BlockingRequestSink(RequestSink base) {
+    this.base = base;
+  }
+
+  @Override
+  public void add(JsonObject request) {
+    synchronized (queue) {
+      queue.add(request);
+    }
+  }
+
+  @Override
+  public void close() {
+    base.close();
+  }
+
+  /**
+   * Responds with an error to all the currently queued requests and return a {@link RequestSink} to
+   * do the same for all the future requests.
+   *
+   * @param errorResponseSink the sink to send error responses to, not {@code null}
+   */
+  public RequestSink toErrorSink(ResponseSink errorResponseSink, String errorResponseCode,
+                                 String errorResponseMessage) {
+    ErrorRequestSink errorRequestSink = new ErrorRequestSink(errorResponseSink, errorResponseCode,
+        errorResponseMessage);
+    synchronized (queue) {
+      for (JsonObject request : queue) {
+        errorRequestSink.add(request);
+      }
+    }
+    return errorRequestSink;
+  }
+
+  /**
+   * Returns the passthrough {@link RequestSink}.
+   */
+  public RequestSink toPassthroughSink() {
+    synchronized (queue) {
+      for (JsonObject request : queue) {
+        base.add(request);
+      }
+    }
+    return base;
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ErrorRequestSink.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ErrorRequestSink.java
new file mode 100644
index 0000000..9a8fce1
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ErrorRequestSink.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+import com.google.gson.JsonObject;
+import org.dartlang.vm.service.logging.Logging;
+
+/**
+ * A {@link RequestSink} that reports with an error to each request.
+ */
+public class ErrorRequestSink implements RequestSink, VmServiceConst {
+  /**
+   * The {@link ResponseSink} to send error responses to.
+   */
+  private final ResponseSink responseSink;
+
+  private final String code;
+  private final String message;
+
+  public ErrorRequestSink(ResponseSink responseSink, String code, String message) {
+    if (responseSink == null || code == null || message == null) {
+      throw new IllegalArgumentException("Unexpected null argument: " + responseSink + " "
+          + code + " " + message);
+    }
+    this.responseSink = responseSink;
+    this.code = code;
+    this.message = message;
+  }
+
+  @Override
+  public void add(JsonObject request) {
+    String id = request.getAsJsonPrimitive(ID).getAsString();
+    try {
+      // TODO(danrubel) is this the correct format for an error response?
+      JsonObject error = new JsonObject();
+      error.addProperty(CODE, code);
+      error.addProperty(MESSAGE, message);
+      JsonObject response = new JsonObject();
+      response.addProperty(ID, id);
+      response.add(ERROR, error);
+      responseSink.add(response);
+    } catch (Throwable e) {
+      Logging.getLogger().logError(e.getMessage(), e);
+    }
+  }
+
+  @Override
+  public void close() {
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/RequestSink.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/RequestSink.java
new file mode 100644
index 0000000..ef2a563
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/RequestSink.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+import com.google.gson.JsonObject;
+
+/**
+ * A destination for observatory requests.
+ */
+public interface RequestSink {
+  /**
+   * Put request into the sink.
+   *
+   * @param request the request to put, not {@code null}.
+   */
+  void add(JsonObject request);
+
+  /**
+   * Close the communication channel.
+   */
+  void close();
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ResponseSink.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ResponseSink.java
new file mode 100644
index 0000000..5ac1db1
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/ResponseSink.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+import com.google.gson.JsonObject;
+
+/**
+ * A destination for responses.
+ */
+public interface ResponseSink {
+  /**
+   * Put response into the sink.
+   *
+   * @param response the response to put, not {@code null}.
+   */
+  void add(JsonObject response) throws Exception;
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/VmServiceConst.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/VmServiceConst.java
new file mode 100644
index 0000000..3659c3c
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/VmServiceConst.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+/**
+ * JSON constants used when communicating with the VM observatory service.
+ */
+public interface VmServiceConst {
+  static final String CODE = "code";
+  static final String ERROR = "error";
+  static final String EVENT = "event";
+  static final String ID = "id";
+  static final String MESSAGE = "message";
+  static final String METHOD = "method";
+  static final String PARAMS = "params";
+  static final String RESULT = "result";
+  static final String STREAM_ID = "streamId";
+  static final String TYPE = "type";
+  static final String JSONRPC = "jsonrpc";
+  static final String JSONRPC_VERSION = "2.0";
+  static final String DATA = "data";
+
+  /**
+   * Parse error	Invalid JSON was received by the server.
+   * An error occurred on the server while parsing the JSON text.
+   */
+  static final int PARSE_ERROR = -32700;
+
+  /**
+   * Invalid Request	The JSON sent is not a valid Request object.
+   */
+  static final int INVALID_REQUEST = -32600;
+
+  /**
+   * Method not found	The method does not exist / is not available.
+   */
+  static final int METHOD_NOT_FOUND = -32601;
+
+  /**
+   * Invalid params	Invalid method parameter(s).
+   */
+  static final int INVALID_PARAMS = -32602;
+
+  /**
+   * Server error	Reserved for implementation-defined server-errors.
+   * -32000 to -32099
+   */
+  static final int SERVER_ERROR = -32000;
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/internal/WebSocketRequestSink.java b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/WebSocketRequestSink.java
new file mode 100644
index 0000000..8a9ebfd
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/internal/WebSocketRequestSink.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.internal;
+
+import com.google.gson.JsonObject;
+import de.roderick.weberknecht.WebSocket;
+import de.roderick.weberknecht.WebSocketException;
+import org.dartlang.vm.service.logging.Logging;
+
+/**
+ * An {@link WebSocket} based implementation of {@link RequestSink}.
+ */
+public class WebSocketRequestSink implements RequestSink {
+
+  private WebSocket webSocket;
+
+  public WebSocketRequestSink(WebSocket webSocket) {
+    this.webSocket = webSocket;
+  }
+
+  @Override
+  public void add(JsonObject json) {
+    String request = json.toString();
+    if (webSocket == null) {
+      Logging.getLogger().logInformation("Dropped: " + request);
+      return;
+    }
+    Logging.getLogger().logInformation("Sent: " + request);
+    try {
+      webSocket.send(request);
+    } catch (WebSocketException e) {
+      Logging.getLogger().logError("Failed to send request: " + request, e);
+    }
+  }
+
+  @Override
+  public void close() {
+    if (webSocket != null) {
+      try {
+        webSocket.close();
+      } catch (WebSocketException e) {
+        Logging.getLogger().logError("Failed to close websocket", e);
+      }
+      webSocket = null;
+    }
+  }
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logger.java b/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logger.java
new file mode 100644
index 0000000..cf1bd03
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logger.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright (c) 2012, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.logging;
+
+/**
+ * The interface {@code Logger} defines the behavior of objects that can be used to receive
+ * information about errors. Implementations usually write this information to a file, but can also
+ * record the information for later use (such as during testing) or even ignore the information.
+ */
+public interface Logger {
+
+  /**
+   * Implementation of {@link Logger} that does nothing.
+   */
+  class NullLogger implements Logger {
+    @Override
+    public void logError(String message) {
+    }
+
+    @Override
+    public void logError(String message, Throwable exception) {
+    }
+
+    @Override
+    public void logInformation(String message) {
+    }
+
+    @Override
+    public void logInformation(String message, Throwable exception) {
+    }
+  }
+
+  static final Logger NULL = new NullLogger();
+
+  /**
+   * Log the given message as an error.
+   *
+   * @param message an explanation of why the error occurred or what it means
+   */
+  void logError(String message);
+
+  /**
+   * Log the given exception as one representing an error.
+   *
+   * @param message   an explanation of why the error occurred or what it means
+   * @param exception the exception being logged
+   */
+  void logError(String message, Throwable exception);
+
+  /**
+   * Log the given informational message.
+   *
+   * @param message an explanation of why the error occurred or what it means
+   */
+  void logInformation(String message);
+
+  /**
+   * Log the given exception as one representing an informational message.
+   *
+   * @param message   an explanation of why the error occurred or what it means
+   * @param exception the exception being logged
+   */
+  void logInformation(String message, Throwable exception);
+}
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logging.java b/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logging.java
new file mode 100644
index 0000000..867cd1e
--- /dev/null
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/logging/Logging.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2014, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service.logging;
+
+/**
+ * {@code Logging} provides a global instance of {@link Logger}.
+ */
+public class Logging {
+
+  private static Logger logger = Logger.NULL;
+
+  public static Logger getLogger() {
+    return logger;
+  }
+
+  public static void setLogger(Logger logger) {
+    Logging.logger = logger == null ? Logger.NULL : logger;
+  }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/InstanceRefToString.java b/pkg/vm_service/java/test/org/dartlang/vm/service/InstanceRefToString.java
new file mode 100644
index 0000000..d5ce8f5
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/InstanceRefToString.java
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ * 
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import org.dartlang.vm.service.consumer.GetInstanceConsumer;
+import org.dartlang.vm.service.element.BoundField;
+import org.dartlang.vm.service.element.ClassRef;
+import org.dartlang.vm.service.element.Instance;
+import org.dartlang.vm.service.element.InstanceKind;
+import org.dartlang.vm.service.element.InstanceRef;
+import org.dartlang.vm.service.element.Isolate;
+import org.dartlang.vm.service.element.RPCError;
+
+/**
+ * Utility class for converting {@link InstanceRef} to a human readable string.
+ */
+public class InstanceRefToString {
+  private Isolate isolate;
+  private final VmService service;
+  private final OpLatch masterLatch;
+
+  /**
+   * Construct a new instance for converting one or more {@link InstanceRef} to human readable
+   * strings. Specify an {@link OpLatch} so that this class can update the expiration time for any
+   * waiting thread as it makes {@link VmService} class to obtain details about each
+   * {@link InstanceRef}.
+   */
+  public InstanceRefToString(Isolate isolate, VmService service, OpLatch latch) {
+    this.isolate = isolate;
+    this.service = service;
+    this.masterLatch = latch;
+  }
+
+  /**
+   * Return a human readable string for the given {@link InstanceRef}.
+   */
+  public String toString(InstanceRef ref) {
+    StringBuilder result = new StringBuilder();
+    printInstance(result, ref, 4);
+    return result.toString();
+  }
+
+  /**
+   * Request the instance information from the {@link VmService}.
+   * 
+   * @param ref the instance reference (not {@code null})
+   * @return the instance or {@code null} if there was a problem.
+   */
+  private Instance getInstance(InstanceRef ref) {
+
+    // Request master latch extend its timeout because we are making another call to VmService
+    masterLatch.opWorking();
+
+    final ResultLatch<Instance> instLatch = new ResultLatch<Instance>();
+    service.getInstance(isolate.getId(), ref.getId(), new GetInstanceConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        instLatch.setValue(null);
+      }
+
+      @Override
+      public void received(Instance instance) {
+        instLatch.setValue(instance);
+      }
+    });
+    return instLatch.getValue();
+  }
+
+  /**
+   * Convert the given {@link InstanceRef} into a human readable string.
+   * 
+   * @param result the buffer to which the human readable string is added
+   * @param ref the instance to be converted (not {@code null})
+   * @param maxDepth the maximum number of recursions this method can make on itself to determine
+   *          human readable strings for child objects
+   */
+  private void printInstance(StringBuilder result, InstanceRef ref, int maxDepth) {
+    if (ref == null) {
+      result.append("-- no value --");
+      return;
+    }
+    InstanceKind kind = ref.getKind();
+    if (kind == null) {
+      result.append("-- unknown instance kind --");
+      return;
+    }
+    switch (kind) {
+      case Bool:
+      case Double:
+      case Float32x4:
+      case Float64x2:
+      case Int:
+      case Int32x4:
+      case Null:
+      case StackTrace:
+        result.append(ref.getValueAsString());
+        return;
+      case String:
+        result.append("'");
+        // Should escape chars such as newline before printing
+        result.append(ref.getValueAsString());
+        if (ref.getValueAsStringIsTruncated()) {
+          result.append("...");
+        }
+        result.append("'");
+        return;
+      case List:
+        printList(result, ref, maxDepth);
+        return;
+      case PlainInstance:
+        printPlainInstance(result, ref, maxDepth);
+        return;
+      case BoundedType:
+      case Closure:
+      case Float32List:
+      case Float32x4List:
+      case Float64List:
+      case Float64x2List:
+      case Int16List:
+      case Int32List:
+      case Int32x4List:
+      case Int64List:
+      case Int8List:
+      case Map:
+      case MirrorReference:
+      case RegExp:
+      case Type:
+      case TypeParameter:
+      case TypeRef:
+      case Uint16List:
+      case Uint32List:
+      case Uint64List:
+      case Uint8ClampedList:
+      case Uint8List:
+      case WeakProperty:
+    }
+    result.append("a " + kind);
+  }
+
+  /**
+   * Convert the given list into a human readable string.
+   * 
+   * @param result the buffer to which the human readable string is added
+   * @param ref an instance reference of type "List" (not {@code null})
+   * @param maxDepth the maximum number of recursions this method can make on itself to determine
+   *          human readable strings for child objects
+   */
+  private void printList(StringBuilder result, InstanceRef ref, int maxDepth) {
+    if (maxDepth == 0) {
+      result.append("a List");
+      return;
+    }
+    result.append("[");
+    Instance list = getInstance(ref);
+    if (list == null) {
+      result.append("?error?]");
+      return;
+    }
+    int count = 0;
+    for (InstanceRef elem : list.getElements()) {
+      if (count > 10) {
+        result.append(", ...");
+        break;
+      }
+      if (count > 0) {
+        result.append(", ");
+      }
+      ++count;
+      printInstance(result, elem, maxDepth - 1);
+    }
+    result.append("]");
+  }
+
+  /**
+   * Convert the given instance into a human readable string.
+   * 
+   * @param result the buffer to which the human readable string is added
+   * @param ref an instance reference of type "PlainInstance" (not {@code null})
+   * @param maxDepth the maximum number of recursions this method can make on itself to determine
+   *          human readable strings for child objects
+   */
+  private void printPlainInstance(StringBuilder result, InstanceRef ref, int maxDepth) {
+    ClassRef classRef = ref.getClassRef();
+    String className = classRef.getName();
+    if (maxDepth == 0) {
+      result.append("a " + className);
+      return;
+    }
+    result.append(className);
+    result.append("(");
+    Instance inst = getInstance(ref);
+    boolean first = true;
+    for (BoundField field : inst.getFields()) {
+      if (first) {
+        first = false;
+      } else {
+        result.append(", ");
+      }
+      printInstance(result, field.getValue(), maxDepth - 1);
+    }
+    result.append(")");
+  }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/OpLatch.java b/pkg/vm_service/java/test/org/dartlang/vm/service/OpLatch.java
new file mode 100644
index 0000000..1c08162
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/OpLatch.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ * 
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * {@link OpLatch} is used by one thread to wait for another thread to complete (see
+ * {@link OpLatch#waitOpComplete()} and {@link OpLatch#waitAndAssertOpComplete()}). If the operation
+ * does not complete before the expiration time then {@link OpLatch#waitOpComplete()} returns
+ * {@code false} and {@link OpLatch#waitAndAssertOpComplete()} throws an exception.
+ */
+class OpLatch {
+  final CountDownLatch latch = new CountDownLatch(1);
+  private long endTime;
+
+  /**
+   * Set or increase the time after which the operation is considered failed. This is automatically
+   * called by {@link #waitAndAssertOp()} and {@link #waitOpComplete()}.
+   */
+  public void opWorking() {
+    endTime = System.currentTimeMillis() + 5000;
+  }
+
+  /**
+   * Call to indicate that the operation completed successfully.
+   */
+  void opComplete() {
+    latch.countDown();
+  }
+
+  /**
+   * Wait for the operation to complete or the time limit to expire. Periodically call
+   * {@link #opWorking()} to increase the expiration time. Throw a {@link RuntimeException} if the
+   * operation did not complete before the expiration time.
+   */
+  void waitAndAssertOpComplete() {
+    if (!waitOpComplete()) {
+      System.out.println(">>> No response received");
+      throw new RuntimeException("No response received");
+    }
+  }
+
+  /**
+   * Wait for the operation to complete or the time limit to expire. Periodically call
+   * {@link #opWorking()} to increase the expiration time.
+   * 
+   * @return {@code true} if the operation completed, or {@code false} otherwise
+   */
+  boolean waitOpComplete() {
+    opWorking();
+    while (true) {
+      long waitTimeMillis = endTime - System.currentTimeMillis();
+      if (waitTimeMillis <= 0) {
+        return latch.getCount() == 0;
+      }
+      try {
+        if (latch.await(waitTimeMillis, TimeUnit.MILLISECONDS)) {
+          return true;
+        }
+      } catch (InterruptedException e) {
+        // ignore and loop to check if timeout has changed
+      }
+    }
+  }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/ResultLatch.java b/pkg/vm_service/java/test/org/dartlang/vm/service/ResultLatch.java
new file mode 100644
index 0000000..d16e56f
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/ResultLatch.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ * 
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ * 
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+/**
+ * {@link ResultLatch} is used by one thread to communicate a result to another thread.
+ */
+public class ResultLatch<T> extends OpLatch {
+  private T value;
+
+  public T getValue() {
+    waitAndAssertOpComplete();
+    return value;
+  }
+
+  public void setValue(T value) {
+    this.value = value;
+    opComplete();
+  }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/SampleOutPrinter.java b/pkg/vm_service/java/test/org/dartlang/vm/service/SampleOutPrinter.java
new file mode 100644
index 0000000..e5007b0
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/SampleOutPrinter.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import com.google.common.base.Charsets;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+
+/**
+ * Echo the content of a stream to {@link System.out} with the given prefix.
+ */
+public class SampleOutPrinter {
+    private class LinesReaderThread extends Thread {
+        public LinesReaderThread() {
+            setName("SampleOutPrinter.LinesReaderThread - " + prefix);
+            setDaemon(true);
+        }
+
+    @Override
+    public void run() {
+      while (true) {
+        String line;
+        try {
+          line = reader.readLine();
+        } catch (IOException e) {
+          System.out.println("Exception reading sample stream");
+          e.printStackTrace();
+          return;
+        }
+        // check for EOF
+        if (line == null) {
+          return;
+        }
+        synchronized (currentLineLock) {
+          currentLine = line;
+          currentLineLock.notifyAll();
+        }
+        System.out.println("[" + prefix + "] " + line);
+      }
+    }
+  }
+
+    private String currentLine;
+
+    private final Object currentLineLock = new Object();
+
+    private final String prefix;
+    private final BufferedReader reader;
+
+    public SampleOutPrinter(String prefix, InputStream stream) {
+        this.prefix = prefix;
+        this.reader = new BufferedReader(new InputStreamReader(stream, Charsets.UTF_8));
+        new LinesReaderThread().start();
+    }
+
+    public void assertEmpty() {
+        synchronized (currentLineLock) {
+            if (currentLine != null) {
+                throw new RuntimeException("Did not expect " + prefix + ": \"" + currentLine + "\"");
+            }
+        }
+    }
+
+    public void assertLastLine(String text) {
+        synchronized (currentLineLock) {
+            if (text == null) {
+                if (currentLine != null) {
+                    throw new RuntimeException("Did not expect " + prefix + ": \"" + currentLine + "\"");
+                }
+            } else {
+                if (currentLine == null || !currentLine.contains(text)) {
+                    throw new RuntimeException("Expected current line to contain text\n"
+                            + "\nexpected: [" + text + "]"
+                            + "\nactual: [" + currentLine + "]");
+                }
+            }
+        }
+    }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/SampleVmServiceListener.java b/pkg/vm_service/java/test/org/dartlang/vm/service/SampleVmServiceListener.java
new file mode 100644
index 0000000..662ce8d
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/SampleVmServiceListener.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import org.dartlang.vm.service.element.Event;
+import org.dartlang.vm.service.element.EventKind;
+
+import java.util.Set;
+
+/**
+ * Sample VmListener for responding to state changes in the running application
+ */
+public class SampleVmServiceListener implements VmServiceListener {
+  private final Object lock = new Object();
+  private String lastStreamId;
+  private Event lastEvent;
+  private final Set<EventKind> ignoreAll;
+
+  SampleVmServiceListener(Set<EventKind> ignoreAll) {
+    this.ignoreAll = ignoreAll;
+  }
+
+  @Override
+  public void connectionOpened() {
+
+  }
+
+  @Override
+  public void received(String streamId, Event event) {
+    synchronized (lock) {
+      if (ignoreAll.contains(event.getKind())) {
+        return;
+      }
+      if (lastStreamId != null) {
+        unexpectedEvent(lastStreamId, lastEvent);
+      }
+      lastStreamId = streamId;
+      lastEvent = event;
+      lock.notifyAll();
+    }
+  }
+
+  @Override
+  public void connectionClosed() {
+
+  }
+
+  public Event waitFor(String expectedStreamId, EventKind expectedEventKind) {
+    long end = System.currentTimeMillis() + 5000;
+    synchronized (lock) {
+      while (true) {
+        if (expectedStreamId.equals(lastStreamId) && expectedEventKind.equals(lastEvent.getKind())) {
+          Event event = lastEvent;
+          lastStreamId = null;
+          lastEvent = null;
+          return event;
+        }
+        long timeout = end - System.currentTimeMillis();
+        if (timeout <= 0) {
+          break;
+        }
+        try {
+          lock.wait(timeout);
+        } catch (InterruptedException e) {
+          // ignored
+        }
+      }
+    }
+    throw new RuntimeException("Expected event: " + expectedStreamId + ", " + expectedEventKind);
+  }
+
+  private void unexpectedEvent(String streamId, Event event) {
+    System.out.println("****** Unexpected Event: " + streamId + ", " + event.getKind());
+  }
+}
diff --git a/pkg/vm_service/java/test/org/dartlang/vm/service/VmServiceTest.java b/pkg/vm_service/java/test/org/dartlang/vm/service/VmServiceTest.java
new file mode 100644
index 0000000..aa191ed
--- /dev/null
+++ b/pkg/vm_service/java/test/org/dartlang/vm/service/VmServiceTest.java
@@ -0,0 +1,661 @@
+/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package org.dartlang.vm.service;
+
+import com.google.gson.JsonObject;
+import org.dartlang.vm.service.consumer.*;
+import org.dartlang.vm.service.element.*;
+import org.dartlang.vm.service.logging.Logger;
+import org.dartlang.vm.service.logging.Logging;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+
+public class VmServiceTest {
+  private static File dartVm;
+  private static File sampleDart;
+  private static File sampleDartWithException;
+  private static int vmPort = 7575;
+  private static Process process;
+  private static VmService vmService;
+  private static SampleOutPrinter sampleOut;
+  private static SampleOutPrinter sampleErr;
+  private static int actualVmServiceVersionMajor;
+
+  public static void main(String[] args) {
+    setupLogging();
+    parseArgs(args);
+
+    try {
+      echoDartVmVersion();
+      runSample();
+      runSampleWithException();
+      System.out.println("Test Complete");
+    } finally {
+      vmDisconnect();
+      stopSample();
+    }
+  }
+
+  private static void echoDartVmVersion() {
+    // Echo Dart VM version
+    List<String> processArgs = new ArrayList<>();
+    processArgs.add(dartVm.getAbsolutePath());
+    processArgs.add("--version");
+    ProcessBuilder processBuilder = new ProcessBuilder(processArgs);
+    try {
+      process = processBuilder.start();
+    } catch (IOException e) {
+      throw new RuntimeException("Failed to launch Dart VM", e);
+    }
+    new SampleOutPrinter("version output", process.getInputStream());
+    new SampleOutPrinter("version output", process.getErrorStream());
+  }
+
+  private static void finishExecution(SampleVmServiceListener vmListener, ElementList<IsolateRef> isolates) {
+    // Finish execution
+    vmResume(isolates.get(0), null);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.Resume);
+
+    // VM pauses on exit and must be resumed to cleanly terminate process
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.PauseExit);
+    vmResume(isolates.get(0), null);
+    vmListener.waitFor(VmService.ISOLATE_STREAM_ID, EventKind.IsolateExit);
+    waitForProcessExit();
+
+    sampleOut.assertLastLine("exiting");
+    // TODO(devoncarew):
+    //   vm-service: isolate(544050040) 'sample_main.dart:main()' has no debugger attached and is paused at start.
+    //sampleErr.assertLastLine(null);
+    process = null;
+  }
+
+  private static boolean isWindows() {
+    return System.getProperty("os.name").startsWith("Win");
+  }
+
+  private static void parseArgs(String[] args) {
+    if (args.length != 1) {
+      showErrorAndExit("Expected absolute path to Dart SDK");
+    }
+    File sdkDir = new File(args[0]);
+    if (!sdkDir.isDirectory()) {
+      showErrorAndExit("Specified directory does not exist: " + sdkDir);
+    }
+    File binDir = new File(sdkDir, "bin");
+    dartVm = new File(binDir, isWindows() ? "dart.exe" : "dart");
+    if (!dartVm.isFile()) {
+      showErrorAndExit("Cannot find Dart VM in SDK: " + dartVm);
+    }
+    File currentDir = new File(".").getAbsoluteFile();
+    File projDir = currentDir;
+    String projName = "vm_service";
+    while (!projDir.getName().equals(projName)) {
+      projDir = projDir.getParentFile();
+      if (projDir == null) {
+        showErrorAndExit("Cannot find project " + projName + " from " + currentDir);
+        return;
+      }
+    }
+    sampleDart = new File(projDir, "java/example/sample_main.dart".replace("/", File.separator));
+    if (!sampleDart.isFile()) {
+      showErrorAndExit("Cannot find sample: " + sampleDart);
+    }
+    sampleDartWithException = new File(projDir,
+            "java/example/sample_exception.dart".replace("/", File.separator));
+    if (!sampleDartWithException.isFile()) {
+      showErrorAndExit("Cannot find sample: " + sampleDartWithException);
+    }
+    System.out.println("Using Dart SDK: " + sdkDir);
+  }
+
+  /**
+   * Exercise VM service with "normal" sample.
+   */
+  private static void runSample() {
+    SampleVmServiceListener vmListener = startSampleAndConnect(sampleDart);
+    vmGetVersion();
+    ElementList<IsolateRef> isolates = vmGetVmIsolates();
+    Isolate sampleIsolate = vmGetIsolate(isolates.get(0));
+    Library rootLib = vmGetLibrary(sampleIsolate, sampleIsolate.getRootLib());
+    vmGetScript(sampleIsolate, rootLib.getScripts().get(0));
+    vmCallServiceExtension(sampleIsolate);
+
+    // Run to breakpoint on line "foo(1);"
+    vmAddBreakpoint(sampleIsolate, rootLib.getScripts().get(0), 25);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.BreakpointAdded);
+    vmResume(isolates.get(0), null);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.Resume);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.PauseBreakpoint);
+    sampleOut.assertLastLine("hello");
+
+    // Get stack trace
+    vmGetStack(sampleIsolate);
+
+    // Evaluate
+    vmEvaluateInFrame(sampleIsolate, 0, "deepList[0]");
+
+    // Get coverage information
+    vmGetSourceReport(sampleIsolate);
+
+    // Step over line "foo(1);"
+    vmResume(isolates.get(0), StepOption.Over);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.Resume);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.PauseBreakpoint);
+    sampleOut.assertLastLine("val: 1");
+
+    finishExecution(vmListener, isolates);
+  }
+
+  /**
+   * Exercise VM service with sample that throws exceptions.
+   */
+  private static void runSampleWithException() {
+    SampleVmServiceListener vmListener = startSampleAndConnect(sampleDartWithException);
+    ElementList<IsolateRef> isolates = vmGetVmIsolates();
+    Isolate sampleIsolate = vmGetIsolate(isolates.get(0));
+
+    // Run until exception occurs
+    vmPauseOnException(isolates.get(0), ExceptionPauseMode.All);
+    vmResume(isolates.get(0), null);
+    vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.Resume);
+    Event event = vmListener.waitFor(VmService.DEBUG_STREAM_ID, EventKind.PauseException);
+    InstanceRefToString convert = new InstanceRefToString(sampleIsolate, vmService, new OpLatch());
+    System.out.println("Received PauseException event");
+    System.out.println("  Exception: " + convert.toString(event.getException()));
+    System.out.println("  Top Frame:");
+    showFrame(convert, event.getTopFrame());
+    sampleOut.assertLastLine("hello");
+
+    finishExecution(vmListener, isolates);
+  }
+
+  private static void setupLogging() {
+    Logging.setLogger(new Logger() {
+      @Override
+      public void logError(String message) {
+        System.out.println("Log error: " + message);
+      }
+
+      @Override
+      public void logError(String message, Throwable exception) {
+        System.out.println("Log error: " + message);
+        if (exception != null) {
+          System.out.println("Log error exception: " + exception);
+          exception.printStackTrace();
+        }
+      }
+
+      @Override
+      public void logInformation(String message) {
+        System.out.println("Log info: " + message);
+      }
+
+      @Override
+      public void logInformation(String message, Throwable exception) {
+        System.out.println("Log info: " + message);
+        if (exception != null) {
+          System.out.println("Log info exception: " + exception);
+          exception.printStackTrace();
+        }
+      }
+    });
+  }
+
+  private static void showErrorAndExit(String errMsg) {
+    System.out.println(errMsg);
+    System.out.flush();
+    sleep(10);
+    System.out.println("Usage: VmServiceTest /path/to/Dart/SDK");
+    System.exit(1);
+  }
+
+  private static void showFrame(InstanceRefToString convert, Frame frame) {
+    System.out.println("    #" + frame.getIndex() + " " + frame.getFunction().getName() + " ("
+            + frame.getLocation().getScript().getUri() + ")");
+    for (BoundVariable var : frame.getVars()) {
+      InstanceRef instanceRef = (InstanceRef)var.getValue();
+      System.out.println("      " + var.getName() + " = " + convert.toString(instanceRef));
+    }
+  }
+
+  private static void showRPCError(RPCError error) {
+    System.out.println(">>> Received error response");
+    System.out.println("  Code: " + error.getCode());
+    System.out.println("  Message: " + error.getMessage());
+    System.out.println("  Details: " + error.getDetails());
+    System.out.println("  Request: " + error.getRequest());
+  }
+
+  private static void showSentinel(Sentinel sentinel) {
+    System.out.println(">>> Received sentinel response");
+    System.out.println("  Sentinel kind: " + sentinel.getKind());
+    System.out.println("  Sentinel value: " + sentinel.getValueAsString());
+  }
+
+  private static void sleep(int milliseconds) {
+    try {
+      Thread.sleep(milliseconds);
+    } catch (InterruptedException e) {
+      // ignored
+    }
+  }
+
+  private static void startSample(File dartFile) {
+    List<String> processArgs;
+    ProcessBuilder processBuilder;
+
+    // Use new port to prevent race conditions
+    // between one sample releasing a port
+    // and the next sample using it.
+    ++vmPort;
+
+    processArgs = new ArrayList<>();
+    processArgs.add(dartVm.getAbsolutePath());
+    processArgs.add("--pause_isolates_on_start");
+    processArgs.add("--observe");
+    processArgs.add("--enable-vm-service=" + vmPort);
+    processArgs.add("--disable-service-auth-codes");
+    processArgs.add(dartFile.getAbsolutePath());
+    processBuilder = new ProcessBuilder(processArgs);
+    System.out.println("=================================================");
+    System.out.println("Launching sample: " + dartFile);
+    try {
+      process = processBuilder.start();
+    } catch (IOException e) {
+      throw new RuntimeException("Failed to launch Dart sample", e);
+    }
+    // Echo sample application output to System.out
+    sampleOut = new SampleOutPrinter("stdout", process.getInputStream());
+    sampleErr = new SampleOutPrinter("stderr", process.getErrorStream());
+    System.out.println("Dart process started - port " + vmPort);
+  }
+
+  private static SampleVmServiceListener startSampleAndConnect(File dartFile) {
+    startSample(dartFile);
+    sleep(1000);
+    vmConnect();
+    SampleVmServiceListener vmListener = new SampleVmServiceListener(
+            new HashSet<>(Collections.singletonList(EventKind.BreakpointResolved)));
+    vmService.addVmServiceListener(vmListener);
+    vmStreamListen(VmService.DEBUG_STREAM_ID);
+    vmStreamListen(VmService.ISOLATE_STREAM_ID);
+    return vmListener;
+  }
+
+  private static void stopSample() {
+    if (process == null) {
+      return;
+    }
+    final Process processToStop = process;
+    process = null;
+    long endTime = System.currentTimeMillis() + 5000;
+    while (System.currentTimeMillis() < endTime) {
+      try {
+        int exit = processToStop.exitValue();
+        if (exit != 0) {
+          System.out.println("Sample exit code: " + exit);
+        }
+        return;
+      } catch (IllegalThreadStateException e) {
+        //$FALL-THROUGH$
+      }
+      try {
+        Thread.sleep(20);
+      } catch (InterruptedException e) {
+        //$FALL-THROUGH$
+      }
+    }
+    processToStop.destroy();
+    System.out.println("Terminated sample process");
+  }
+
+  @SuppressWarnings("SameParameterValue")
+  private static void vmAddBreakpoint(Isolate isolate, ScriptRef script, int lineNum) {
+    final OpLatch latch = new OpLatch();
+    vmService.addBreakpoint(isolate.getId(), script.getId(), lineNum, new BreakpointConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Breakpoint response) {
+        System.out.println("Received Breakpoint response");
+        System.out.println("  BreakpointNumber:" + response.getBreakpointNumber());
+        latch.opComplete();
+      }
+    });
+    latch.waitAndAssertOpComplete();
+  }
+
+  private static void vmConnect() {
+    try {
+      vmService = VmService.localConnect(vmPort);
+    } catch (IOException e) {
+      throw new RuntimeException("Failed to connect to the VM vmService service", e);
+    }
+  }
+
+  private static void vmDisconnect() {
+    if (vmService != null) {
+      vmService.disconnect();
+    }
+  }
+
+  @SuppressWarnings("SameParameterValue")
+  private static void vmEvaluateInFrame(Isolate isolate, int frameIndex, String expression) {
+    System.out.println("Evaluating: " + expression);
+    final ResultLatch<InstanceRef> latch = new ResultLatch<>();
+    vmService.evaluateInFrame(isolate.getId(), frameIndex, expression, new EvaluateInFrameConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(ErrorRef response) {
+        showErrorAndExit(response.getMessage());
+      }
+
+      public void received(Sentinel response) {
+        System.out.println(response.getValueAsString());
+      }
+
+      @Override
+      public void received(InstanceRef response) {
+        System.out.println("Received InstanceRef response");
+        System.out.println("  Id: " + response.getId());
+        System.out.println("  Kind: " + response.getKind());
+        System.out.println("  Json: " + response.getJson());
+        latch.setValue(response);
+      }
+    });
+    InstanceRef instanceRef = latch.getValue();
+    InstanceRefToString convert = new InstanceRefToString(isolate, vmService, latch);
+    System.out.println("Result: " + convert.toString(instanceRef));
+  }
+
+  private static SourceReport vmGetSourceReport(Isolate isolate) {
+    System.out.println("Getting coverage information for " + isolate.getId());
+    final long startTime = System.currentTimeMillis();
+    final ResultLatch<SourceReport> latch = new ResultLatch<>();
+    vmService.getSourceReport(isolate.getId(), Collections.singletonList(SourceReportKind.Coverage), new SourceReportConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(SourceReport response) {
+        System.out.println("Received SourceReport response (" + (System.currentTimeMillis() - startTime) + "ms)");
+        System.out.println("  Script count: " + response.getScripts().size());
+        System.out.println("  Range count: " + response.getRanges().size());
+        latch.setValue(response);
+      }
+    });
+    return latch.getValue();
+  }
+
+  private static Isolate vmGetIsolate(IsolateRef isolate) {
+    final ResultLatch<Isolate> latch = new ResultLatch<>();
+    vmService.getIsolate(isolate.getId(), new GetIsolateConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Isolate response) {
+        System.out.println("Received Isolate response");
+        System.out.println("  Id: " + response.getId());
+        System.out.println("  Name: " + response.getName());
+        System.out.println("  Number: " + response.getNumber());
+        System.out.println("  Start Time: " + response.getStartTime());
+        System.out.println("  RootLib Id: " + response.getRootLib().getId());
+        System.out.println("  RootLib Uri: " + response.getRootLib().getUri());
+        System.out.println("  RootLib Name: " + response.getRootLib().getName());
+        System.out.println("  RootLib Json: " + response.getRootLib().getJson());
+        System.out.println("  Isolate: " + response);
+        latch.setValue(response);
+      }
+
+      @Override
+      public void received(Sentinel response) {
+        showSentinel(response);
+      }
+    });
+    return latch.getValue();
+  }
+
+  private static Library vmGetLibrary(Isolate isolateId, LibraryRef library) {
+    final ResultLatch<Library> latch = new ResultLatch<>();
+    vmService.getLibrary(isolateId.getId(), library.getId(), new GetLibraryConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Library response) {
+        System.out.println("Received GetLibrary library");
+        System.out.println("  uri: " + response.getUri());
+        latch.setValue(response);
+      }
+    });
+    return latch.getValue();
+  }
+
+  private static void vmGetScript(Isolate isolate, ScriptRef scriptRef) {
+    final ResultLatch<Script> latch = new ResultLatch<>();
+    vmService.getObject(isolate.getId(), scriptRef.getId(), new GetObjectConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Obj response) {
+        if (response instanceof Script) {
+          latch.setValue((Script) response);
+        } else {
+          RPCError.unexpected("Script", response);
+        }
+      }
+
+      @Override
+      public void received(Sentinel response) {
+        RPCError.unexpected("Script", response);
+      }
+    });
+    Script script = latch.getValue();
+    System.out.println("Received Script");
+    System.out.println("  Id: " + script.getId());
+    System.out.println("  Uri: " + script.getUri());
+    System.out.println("  Source: " + script.getSource());
+    System.out.println("  TokenPosTable: " + script.getTokenPosTable());
+    if (script.getTokenPosTable() == null) {
+      showErrorAndExit("Expected TokenPosTable to be non-null");
+    }
+  }
+
+  private static void vmGetStack(Isolate isolate) {
+    final ResultLatch<Stack> latch = new ResultLatch<>();
+    vmService.getStack(isolate.getId(), new StackConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Stack stack) {
+        latch.setValue(stack);
+      }
+    });
+    Stack stack = latch.getValue();
+    System.out.println("Received Stack response");
+    System.out.println("  Messages:");
+    for (Message message : stack.getMessages()) {
+      System.out.println("    " + message.getName());
+    }
+    System.out.println("  Frames:");
+    InstanceRefToString convert = new InstanceRefToString(isolate, vmService, latch);
+    for (Frame frame : stack.getFrames()) {
+      showFrame(convert, frame);
+    }
+  }
+
+  private static void vmGetVersion() {
+    final OpLatch latch = new OpLatch();
+    vmService.getVersion(new VersionConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Version response) {
+        System.out.println("Received Version response");
+        actualVmServiceVersionMajor = response.getMajor();
+        System.out.println("  Major: " + actualVmServiceVersionMajor);
+        System.out.println("  Minor: " + response.getMinor());
+        System.out.println(response.getJson());
+        latch.opComplete();
+      }
+    });
+    latch.waitAndAssertOpComplete();
+  }
+
+  private static void vmCallServiceExtension(Isolate isolateId) {
+    final OpLatch latch = new OpLatch();
+    vmService.callServiceExtension(isolateId.getId(), "getIsolate", new ServiceExtensionConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(JsonObject result) {
+        System.out.println("Received response: " + result);
+        latch.opComplete();
+      }
+    });
+    latch.waitAndAssertOpComplete();
+  }
+
+  private static ElementList<IsolateRef> vmGetVmIsolates() {
+    final ResultLatch<ElementList<IsolateRef>> latch = new ResultLatch<>();
+    vmService.getVM(new VMConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(VM response) {
+        System.out.println("Received VM response");
+        System.out.println("  ArchitectureBits: " + response.getArchitectureBits());
+        System.out.println("  HostCPU: " + response.getHostCPU());
+        System.out.println("  TargetCPU: " + response.getTargetCPU());
+        System.out.println("  Pid: " + response.getPid());
+        System.out.println("  StartTime: " + response.getStartTime());
+        for (IsolateRef isolate : response.getIsolates()) {
+          System.out.println("  Isolate " + isolate.getNumber() + ", " + isolate.getId() + ", "
+                  + isolate.getName());
+        }
+        latch.setValue(response.getIsolates());
+      }
+    });
+    return latch.getValue();
+  }
+
+  private static void vmPauseOnException(IsolateRef isolate, ExceptionPauseMode mode) {
+    System.out.println("Request pause on exception: " + mode);
+    final OpLatch latch = new OpLatch();
+    vmService.setExceptionPauseMode(isolate.getId(), mode, new SuccessConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Success response) {
+        System.out.println("Successfully set pause on exception");
+        latch.opComplete();
+      }
+    });
+    latch.waitAndAssertOpComplete();
+  }
+
+  private static void vmResume(IsolateRef isolateRef, final StepOption step) {
+    final String id = isolateRef.getId();
+    vmService.resume(id, step, null, new SuccessConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Success response) {
+        if (step == null) {
+          System.out.println("Resumed isolate " + id);
+        } else {
+          System.out.println("Step " + step + " isolate " + id);
+        }
+      }
+    });
+    // Do not wait for confirmation, but display error if it occurs
+  }
+
+  private static void vmStreamListen(String streamId) {
+    final OpLatch latch = new OpLatch();
+    vmService.streamListen(streamId, new SuccessConsumer() {
+      @Override
+      public void onError(RPCError error) {
+        showRPCError(error);
+      }
+
+      @Override
+      public void received(Success response) {
+        System.out.println("Subscribed to debug event stream");
+        latch.opComplete();
+      }
+    });
+    latch.waitAndAssertOpComplete();
+  }
+
+  private static void waitForProcessExit() {
+    if (actualVmServiceVersionMajor == 2) {
+      // Don't wait for VM 1.12 - protocol 2.1
+      return;
+    }
+    long end = System.currentTimeMillis() + 5000;
+    while (true) {
+      try {
+        System.out.println("Exit code: " + process.exitValue());
+        return;
+      } catch (IllegalThreadStateException e) {
+        // fall through to wait for exit
+      }
+      if (System.currentTimeMillis() >= end) {
+        throw new RuntimeException("Expected child process to finish");
+      }
+      sleep(10);
+    }
+  }
+}
diff --git a/pkg/vm_service/java/version.properties b/pkg/vm_service/java/version.properties
new file mode 100644
index 0000000..3360053
--- /dev/null
+++ b/pkg/vm_service/java/version.properties
@@ -0,0 +1 @@
+version=3.25
diff --git a/pkg/vm_service/lib/src/helpers.dart b/pkg/vm_service/lib/src/helpers.dart
new file mode 100644
index 0000000..b69fb5e
--- /dev/null
+++ b/pkg/vm_service/lib/src/helpers.dart
@@ -0,0 +1,32 @@
+// 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 '../vm_service.dart';
+
+class IsolateHelper {
+  static List<TagCounter> getTagCounters(Isolate isolate) {
+    Map m = isolate.json['_tagCounters'];
+    List<String> names = m['names'];
+    List<int> counters = m['counters'];
+
+    List<TagCounter> result = [];
+    for (int i = 0; i < counters.length; i++) {
+      result.add(new TagCounter(names[i], counters[i]));
+    }
+    return result;
+  }
+}
+
+class TagCounter {
+  final String name;
+  final int count;
+
+  TagCounter(this.name, this.count);
+}
+
+//class GraphEventHelper {
+//  // int chunkIndex
+//  // int chunkCount
+//  // int nodeCount
+//}
diff --git a/pkg/vm_service/lib/src/service_extension_registry.dart b/pkg/vm_service/lib/src/service_extension_registry.dart
new file mode 100644
index 0000000..e256466
--- /dev/null
+++ b/pkg/vm_service/lib/src/service_extension_registry.dart
@@ -0,0 +1,67 @@
+// 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 '../vm_service.dart' show VmServerConnection, RPCError, Event, EventKind;
+import 'stream_helpers.dart';
+
+/// A registry of custom service extensions to [VmServerConnection]s in which
+/// they were registered.
+class ServiceExtensionRegistry {
+  /// Maps service extensions registered through the protocol to the
+  /// [VmServerConnection] in which they were registered.
+  ///
+  /// Note: this does not track services registered through `dart:developer`,
+  /// only the services registered through the `_registerService` rpc method.
+  final _extensionToConnection = <String, VmServerConnection>{};
+
+  /// Controller for tracking registration and unregistration events.
+  final _eventController = StreamController<Event>.broadcast();
+
+  ServiceExtensionRegistry();
+
+  /// Registers [extension] for [client].
+  ///
+  /// All future requests for [extension] will be routed to [client].
+  void registerExtension(String extension, VmServerConnection client) {
+    if (_extensionToConnection.containsKey(extension)) {
+      throw RPCError('registerExtension', 111, 'Service already registered');
+    }
+    _eventController.sink.add(_toRegistrationEvent(extension));
+    _extensionToConnection[extension] = client;
+    // Remove the mapping if the client disconnects.
+    client.done.whenComplete(() {
+      _extensionToConnection.remove(extension);
+      _eventController.sink.add(_toRegistrationEvent(extension,
+          kind: EventKind.kServiceUnregistered));
+    });
+  }
+
+  /// Returns the [VmServerConnection] for a given [extension], or `null` if
+  /// none is registered.
+  ///
+  /// The result of this function should not be stored, because clients may
+  /// shut down at any time.
+  VmServerConnection clientFor(String extension) =>
+      _extensionToConnection[extension];
+
+  /// All of the currently registered extensions
+  Iterable<String> get registeredExtensions => _extensionToConnection.keys;
+
+  /// Emits an [Event] of type `ServiceRegistered` for all current and future
+  /// extensions that are registered, and `ServiceUnregistered` when those
+  /// clients disconnect.
+  Stream<Event> get onExtensionEvent => _eventController.stream
+      .transform(startWithMany(registeredExtensions.map(_toRegistrationEvent)));
+
+  /// Creates a `_Service` stream event, with a default kind of
+  /// [EventKind.kServiceRegistered].
+  Event _toRegistrationEvent(String method,
+          {String kind = EventKind.kServiceRegistered}) =>
+      Event()
+        ..kind = kind
+        ..service = method
+        ..method = method;
+}
diff --git a/pkg/vm_service/lib/src/stream_helpers.dart b/pkg/vm_service/lib/src/stream_helpers.dart
new file mode 100644
index 0000000..474c417
--- /dev/null
+++ b/pkg/vm_service/lib/src/stream_helpers.dart
@@ -0,0 +1,99 @@
+// 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';
+
+/// Copied from package:stream_transform.
+
+/// Starts emitting values from [next] after the original stream is complete.
+///
+/// If the initial stream never finishes, the [next] stream will never be
+/// listened to.
+///
+/// If a single-subscription follows the a broadcast stream it may be listened
+/// to and never canceled.
+///
+/// If a broadcast stream follows any other stream it will miss any events which
+/// occur before the first stream is done. If a broadcast stream follows a
+/// single-subscription stream, pausing the stream while it is listening to the
+/// second stream will cause events to be dropped rather than buffered.
+StreamTransformer<T, T> followedBy<T>(Stream<T> next) => _FollowedBy<T>(next);
+
+class _FollowedBy<T> extends StreamTransformerBase<T, T> {
+  final Stream<T> _next;
+
+  _FollowedBy(this._next);
+
+  @override
+  Stream<T> bind(Stream<T> first) {
+    var controller = first.isBroadcast
+        ? StreamController<T>.broadcast(sync: true)
+        : StreamController<T>(sync: true);
+
+    var next = first.isBroadcast && !_next.isBroadcast
+        ? _next.asBroadcastStream()
+        : _next;
+
+    StreamSubscription<T> subscription;
+    var currentStream = first;
+    var firstDone = false;
+    var secondDone = false;
+
+    Function currentDoneHandler;
+
+    listen() {
+      subscription = currentStream.listen(controller.add,
+          onError: controller.addError, onDone: () => currentDoneHandler());
+    }
+
+    onSecondDone() {
+      secondDone = true;
+      controller.close();
+    }
+
+    onFirstDone() {
+      firstDone = true;
+      currentStream = next;
+      currentDoneHandler = onSecondDone;
+      listen();
+    }
+
+    currentDoneHandler = onFirstDone;
+
+    controller.onListen = () {
+      assert(subscription == null);
+      listen();
+      if (!first.isBroadcast) {
+        controller
+          ..onPause = () {
+            if (!firstDone || !next.isBroadcast) return subscription.pause();
+            subscription.cancel();
+            subscription = null;
+          }
+          ..onResume = () {
+            if (!firstDone || !next.isBroadcast) return subscription.resume();
+            listen();
+          };
+      }
+      controller.onCancel = () {
+        if (secondDone) return null;
+        var toCancel = subscription;
+        subscription = null;
+        return toCancel.cancel();
+      };
+    };
+    return controller.stream;
+  }
+}
+
+StreamTransformer<T, T> startWithMany<T>(Iterable<T> initial) =>
+    startWithStream<T>(Stream.fromIterable(initial));
+
+StreamTransformer<T, T> startWithStream<T>(Stream<T> initial) =>
+    StreamTransformer.fromBind((values) {
+      if (values.isBroadcast && !initial.isBroadcast) {
+        initial = initial.asBroadcastStream();
+      }
+      return initial.transform(followedBy(values));
+    });
diff --git a/pkg/vm_service/lib/utils.dart b/pkg/vm_service/lib/utils.dart
new file mode 100644
index 0000000..dd6ffbc
--- /dev/null
+++ b/pkg/vm_service/lib/utils.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.
+
+import 'package:meta/meta.dart';
+
+/// Map the URI to a WebSocket URI for the VM service protocol.
+///
+/// If the URI is already a VM Service WebSocket URI it will not be modified.
+Uri convertToWebSocketUrl({@required Uri serviceProtocolUrl}) {
+  final isSecure = serviceProtocolUrl.isScheme('wss') ||
+      serviceProtocolUrl.isScheme('https');
+  final scheme = isSecure ? 'wss' : 'ws';
+
+  final path = serviceProtocolUrl.path.endsWith('/ws')
+      ? serviceProtocolUrl.path
+      : (serviceProtocolUrl.path.endsWith('/')
+          ? '${serviceProtocolUrl.path}ws'
+          : '${serviceProtocolUrl.path}/ws');
+
+  return serviceProtocolUrl.replace(scheme: scheme, path: path);
+}
diff --git a/pkg/vm_service/lib/vm_service.dart b/pkg/vm_service/lib/vm_service.dart
new file mode 100644
index 0000000..64dcf89
--- /dev/null
+++ b/pkg/vm_service/lib/vm_service.dart
@@ -0,0 +1,5625 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This is a generated file.
+
+/// A library to access the VM Service API.
+///
+/// The main entry-point for this library is the [VmService] class.
+library vm_service;
+
+import 'dart:async';
+import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8;
+import 'dart:typed_data';
+
+import 'src/service_extension_registry.dart';
+
+export 'src/service_extension_registry.dart' show ServiceExtensionRegistry;
+
+const String vmServiceVersion = '3.25.0';
+
+/// @optional
+const String optional = 'optional';
+
+/// Decode a string in Base64 encoding into the equivalent non-encoded string.
+/// This is useful for handling the results of the Stdout or Stderr events.
+String decodeBase64(String str) => utf8.decode(base64.decode(str));
+
+// Returns true if a response is the Dart `null` instance.
+bool _isNullInstance(Map json) =>
+    ((json['type'] == '@Instance') && (json['kind'] == 'Null'));
+
+Object createServiceObject(dynamic json, List<String> expectedTypes) {
+  if (json == null) return null;
+
+  if (json is List) {
+    return json.map((e) => createServiceObject(e, expectedTypes)).toList();
+  } else if (json is Map) {
+    String type = json['type'];
+
+    // Not a Response type.
+    if (type == null) {
+      // If there's only one expected type, we'll just use that type.
+      if (expectedTypes.length == 1) {
+        type = expectedTypes.first;
+      } else {
+        return null;
+      }
+    } else if (_isNullInstance(json) && (!expectedTypes.contains(type))) {
+      // Replace null instances with null when we don't expect an instance to
+      // be returned.
+      return null;
+    }
+    if (_typeFactories[type] == null) {
+      return null;
+    } else {
+      return _typeFactories[type](json);
+    }
+  } else {
+    // Handle simple types.
+    return json;
+  }
+}
+
+dynamic _createSpecificObject(
+    dynamic json, dynamic creator(Map<String, dynamic> map)) {
+  if (json == null) return null;
+
+  if (json is List) {
+    return json.map((e) => creator(e)).toList();
+  } else if (json is Map) {
+    Map<String, dynamic> map = {};
+    for (dynamic key in json.keys) {
+      map[key as String] = json[key];
+    }
+    return creator(map);
+  } else {
+    // Handle simple types.
+    return json;
+  }
+}
+
+void _setIfNotNull(Map<String, Object> json, String key, Object value) {
+  if (value == null) return;
+  json[key] = value;
+}
+
+typedef ServiceCallback = Future<Map<String, dynamic>> Function(
+    Map<String, dynamic> params);
+
+Map<String, Function> _typeFactories = {
+  'AllocationProfile': AllocationProfile.parse,
+  'BoundField': BoundField.parse,
+  'BoundVariable': BoundVariable.parse,
+  'Breakpoint': Breakpoint.parse,
+  '@Class': ClassRef.parse,
+  'Class': Class.parse,
+  'ClassHeapStats': ClassHeapStats.parse,
+  'ClassList': ClassList.parse,
+  '@Code': CodeRef.parse,
+  'Code': Code.parse,
+  '@Context': ContextRef.parse,
+  'Context': Context.parse,
+  'ContextElement': ContextElement.parse,
+  '@Error': ErrorRef.parse,
+  'Error': Error.parse,
+  'Event': Event.parse,
+  'ExtensionData': ExtensionData.parse,
+  '@Field': FieldRef.parse,
+  'Field': Field.parse,
+  'Flag': Flag.parse,
+  'FlagList': FlagList.parse,
+  'Frame': Frame.parse,
+  '@Function': FuncRef.parse,
+  'Function': Func.parse,
+  '@Instance': InstanceRef.parse,
+  'Instance': Instance.parse,
+  '@Isolate': IsolateRef.parse,
+  'Isolate': Isolate.parse,
+  'InboundReferences': InboundReferences.parse,
+  'InboundReference': InboundReference.parse,
+  'InstanceSet': InstanceSet.parse,
+  '@Library': LibraryRef.parse,
+  'Library': Library.parse,
+  'LibraryDependency': LibraryDependency.parse,
+  'LogRecord': LogRecord.parse,
+  'MapAssociation': MapAssociation.parse,
+  'MemoryUsage': MemoryUsage.parse,
+  'Message': Message.parse,
+  '@Null': NullValRef.parse,
+  'Null': NullVal.parse,
+  '@Object': ObjRef.parse,
+  'Object': Obj.parse,
+  'ReloadReport': ReloadReport.parse,
+  'RetainingObject': RetainingObject.parse,
+  'RetainingPath': RetainingPath.parse,
+  'Response': Response.parse,
+  'Sentinel': Sentinel.parse,
+  '@Script': ScriptRef.parse,
+  'Script': Script.parse,
+  'ScriptList': ScriptList.parse,
+  'SourceLocation': SourceLocation.parse,
+  'SourceReport': SourceReport.parse,
+  'SourceReportCoverage': SourceReportCoverage.parse,
+  'SourceReportRange': SourceReportRange.parse,
+  'Stack': Stack.parse,
+  'Success': Success.parse,
+  'Timeline': Timeline.parse,
+  'TimelineEvent': TimelineEvent.parse,
+  'TimelineFlags': TimelineFlags.parse,
+  'Timestamp': Timestamp.parse,
+  '@TypeArguments': TypeArgumentsRef.parse,
+  'TypeArguments': TypeArguments.parse,
+  'UnresolvedSourceLocation': UnresolvedSourceLocation.parse,
+  'Version': Version.parse,
+  '@VM': VMRef.parse,
+  'VM': VM.parse,
+};
+
+Map<String, List<String>> _methodReturnTypes = {
+  'addBreakpoint': const ['Breakpoint'],
+  'addBreakpointWithScriptUri': const ['Breakpoint'],
+  'addBreakpointAtEntry': const ['Breakpoint'],
+  'clearVMTimeline': const ['Success'],
+  'invoke': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
+  'evaluate': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
+  'evaluateInFrame': const ['InstanceRef', 'ErrorRef', 'Sentinel'],
+  'getAllocationProfile': const ['AllocationProfile'],
+  'getFlagList': const ['FlagList'],
+  'getInboundReferences': const ['InboundReferences', 'Sentinel'],
+  'getInstances': const ['InstanceSet'],
+  'getIsolate': const ['Isolate', 'Sentinel'],
+  'getMemoryUsage': const ['MemoryUsage', 'Sentinel'],
+  'getScripts': const ['ScriptList'],
+  'getObject': const ['Obj', 'Sentinel'],
+  'getRetainingPath': const ['RetainingPath'],
+  'getStack': const ['Stack'],
+  'getSourceReport': const ['SourceReport'],
+  'getVersion': const ['Version'],
+  'getVM': const ['VM'],
+  'getVMTimeline': const ['Timeline'],
+  'getVMTimelineFlags': const ['TimelineFlags'],
+  'getVMTimelineMicros': const ['Timestamp'],
+  'pause': const ['Success'],
+  'kill': const ['Success'],
+  'registerService': const ['Success'],
+  'reloadSources': const ['ReloadReport'],
+  'removeBreakpoint': const ['Success'],
+  'resume': const ['Success'],
+  'setExceptionPauseMode': const ['Success'],
+  'setFlag': const ['Success'],
+  'setLibraryDebuggable': const ['Success'],
+  'setName': const ['Success'],
+  'setVMName': const ['Success'],
+  'setVMTimelineFlags': const ['Success'],
+  'streamCancel': const ['Success'],
+  'streamListen': const ['Success'],
+};
+
+/// A class representation of the Dart VM Service Protocol.
+///
+/// Both clients and servers should implement this interface.
+abstract class VmServiceInterface {
+  /// Returns the stream for a given stream id.
+  ///
+  /// This is not a part of the spec, but is needed for both the client and
+  /// server to get access to the real event streams.
+  Stream<Event> onEvent(String streamId);
+
+  /// Handler for calling extra service extensions.
+  Future<Response> callServiceExtension(String method,
+      {String isolateId, Map args});
+
+  /// The `addBreakpoint` RPC is used to add a breakpoint at a specific line of
+  /// some script.
+  ///
+  /// The `scriptId` parameter is used to specify the target script.
+  ///
+  /// The `line` parameter is used to specify the target line for the
+  /// breakpoint. If there are multiple possible breakpoints on the target line,
+  /// then the VM will place the breakpoint at the location which would execute
+  /// soonest. If it is not possible to set a breakpoint at the target line, the
+  /// breakpoint will be added at the next possible breakpoint location within
+  /// the same function.
+  ///
+  /// The `column` parameter may be optionally specified. This is useful for
+  /// targeting a specific breakpoint on a line with multiple possible
+  /// breakpoints.
+  ///
+  /// If no breakpoint is possible at that line, the `102` (Cannot add
+  /// breakpoint) error code is returned.
+  ///
+  /// Note that breakpoints are added and removed on a per-isolate basis.
+  ///
+  /// See [Breakpoint].
+  Future<Breakpoint> addBreakpoint(
+    String isolateId,
+    String scriptId,
+    int line, {
+    int column,
+  });
+
+  /// The `addBreakpoint` RPC is used to add a breakpoint at a specific line of
+  /// some script. This RPC is useful when a script has not yet been assigned an
+  /// id, for example, if a script is in a deferred library which has not yet
+  /// been loaded.
+  ///
+  /// The `scriptUri` parameter is used to specify the target script.
+  ///
+  /// The `line` parameter is used to specify the target line for the
+  /// breakpoint. If there are multiple possible breakpoints on the target line,
+  /// then the VM will place the breakpoint at the location which would execute
+  /// soonest. If it is not possible to set a breakpoint at the target line, the
+  /// breakpoint will be added at the next possible breakpoint location within
+  /// the same function.
+  ///
+  /// The `column` parameter may be optionally specified. This is useful for
+  /// targeting a specific breakpoint on a line with multiple possible
+  /// breakpoints.
+  ///
+  /// If no breakpoint is possible at that line, the `102` (Cannot add
+  /// breakpoint) error code is returned.
+  ///
+  /// Note that breakpoints are added and removed on a per-isolate basis.
+  ///
+  /// See [Breakpoint].
+  Future<Breakpoint> addBreakpointWithScriptUri(
+    String isolateId,
+    String scriptUri,
+    int line, {
+    int column,
+  });
+
+  /// The `addBreakpointAtEntry` RPC is used to add a breakpoint at the
+  /// entrypoint of some function.
+  ///
+  /// If no breakpoint is possible at the function entry, the `102` (Cannot add
+  /// breakpoint) error code is returned.
+  ///
+  /// See [Breakpoint].
+  ///
+  /// Note that breakpoints are added and removed on a per-isolate basis.
+  Future<Breakpoint> addBreakpointAtEntry(String isolateId, String functionId);
+
+  /// Clears all VM timeline events.
+  ///
+  /// See [Success].
+  Future<Success> clearVMTimeline();
+
+  /// The `invoke` RPC is used to perform regular method invocation on some
+  /// receiver, as if by dart:mirror's ObjectMirror.invoke. Note this does not
+  /// provide a way to perform getter, setter or constructor invocation.
+  ///
+  /// `targetId` may refer to a [Library], [Class], or [Instance].
+  ///
+  /// Each elements of `argumentId` may refer to an [Instance].
+  ///
+  /// If `disableBreakpoints` is provided and set to true, any breakpoints hit
+  /// as a result of this invocation are ignored, including pauses resulting
+  /// from a call to `debugger()` from `dart:developer`. Defaults to false if
+  /// not provided.
+  ///
+  /// If `targetId` or any element of `argumentIds` is a temporary id which has
+  /// expired, then the `Expired` [Sentinel] is returned.
+  ///
+  /// If `targetId` or any element of `argumentIds` refers to an object which
+  /// has been collected by the VM's garbage collector, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// If invocation triggers a failed compilation then [rpc error] 113
+  /// "Expression compilation error" is returned.
+  ///
+  /// If an runtime error occurs while evaluating the invocation, an [ErrorRef]
+  /// reference will be returned.
+  ///
+  /// If the invocation is evaluated successfully, an [InstanceRef] reference
+  /// will be returned.
+  ///
+  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
+  Future<dynamic> invoke(
+    String isolateId,
+    String targetId,
+    String selector,
+    List<String> argumentIds, {
+    bool disableBreakpoints,
+  });
+
+  /// The `evaluate` RPC is used to evaluate an expression in the context of
+  /// some target.
+  ///
+  /// `targetId` may refer to a [Library], [Class], or [Instance].
+  ///
+  /// If `targetId` is a temporary id which has expired, then the `Expired`
+  /// [Sentinel] is returned.
+  ///
+  /// If `targetId` refers to an object which has been collected by the VM's
+  /// garbage collector, then the `Collected` [Sentinel] is returned.
+  ///
+  /// If `scope` is provided, it should be a map from identifiers to object ids.
+  /// These bindings will be added to the scope in which the expression is
+  /// evaluated, which is a child scope of the class or library for
+  /// instance/class or library targets respectively. This means bindings
+  /// provided in `scope` may shadow instance members, class members and
+  /// top-level members.
+  ///
+  /// If `disableBreakpoints` is provided and set to true, any breakpoints hit
+  /// as a result of this evaluation are ignored. Defaults to false if not
+  /// provided.
+  ///
+  /// If the expression fails to parse and compile, then [rpc error] 113
+  /// "Expression compilation error" is returned.
+  ///
+  /// If an error occurs while evaluating the expression, an [ErrorRef]
+  /// reference will be returned.
+  ///
+  /// If the expression is evaluated successfully, an [InstanceRef] reference
+  /// will be returned.
+  ///
+  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
+  Future<dynamic> evaluate(
+    String isolateId,
+    String targetId,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  });
+
+  /// The `evaluateInFrame` RPC is used to evaluate an expression in the context
+  /// of a particular stack frame. `frameIndex` is the index of the desired
+  /// [Frame], with an index of `0` indicating the top (most recent) frame.
+  ///
+  /// If `scope` is provided, it should be a map from identifiers to object ids.
+  /// These bindings will be added to the scope in which the expression is
+  /// evaluated, which is a child scope of the frame's current scope. This means
+  /// bindings provided in `scope` may shadow instance members, class members,
+  /// top-level members, parameters and locals.
+  ///
+  /// If `disableBreakpoints` is provided and set to true, any breakpoints hit
+  /// as a result of this evaluation are ignored. Defaults to false if not
+  /// provided.
+  ///
+  /// If the expression fails to parse and compile, then [rpc error] 113
+  /// "Expression compilation error" is returned.
+  ///
+  /// If an error occurs while evaluating the expression, an [ErrorRef]
+  /// reference will be returned.
+  ///
+  /// If the expression is evaluated successfully, an [InstanceRef] reference
+  /// will be returned.
+  ///
+  /// The return value can be one of [InstanceRef], [ErrorRef] or [Sentinel].
+  Future<dynamic> evaluateInFrame(
+    String isolateId,
+    int frameIndex,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  });
+
+  /// The `getAllocationProfile` RPC is used to retrieve allocation information
+  /// for a given isolate.
+  ///
+  /// If `reset` is provided and is set to true, the allocation accumulators
+  /// will be reset before collecting allocation information.
+  ///
+  /// If `gc` is provided and is set to true, a garbage collection will be
+  /// attempted before collecting allocation information. There is no guarantee
+  /// that a garbage collection will be actually be performed.
+  Future<AllocationProfile> getAllocationProfile(String isolateId,
+      {bool reset, bool gc});
+
+  /// The `getFlagList` RPC returns a list of all command line flags in the VM
+  /// along with their current values.
+  ///
+  /// See [FlagList].
+  Future<FlagList> getFlagList();
+
+  /// Returns a set of inbound references to the object specified by `targetId`.
+  /// Up to `limit` references will be returned.
+  ///
+  /// The order of the references is undefined (i.e., not related to allocation
+  /// order) and unstable (i.e., multiple invocations of this method against the
+  /// same object can give different answers even if no Dart code has executed
+  /// between the invocations).
+  ///
+  /// The references may include multiple `objectId`s that designate the same
+  /// object.
+  ///
+  /// The references may include objects that are unreachable but have not yet
+  /// been garbage collected.
+  ///
+  /// If `targetId` is a temporary id which has expired, then the `Expired`
+  /// [Sentinel] is returned.
+  ///
+  /// If `targetId` refers to an object which has been collected by the VM's
+  /// garbage collector, then the `Collected` [Sentinel] is returned.
+  ///
+  /// See [InboundReferences].
+  ///
+  /// The return value can be one of [InboundReferences] or [Sentinel].
+  Future<dynamic> getInboundReferences(
+      String isolateId, String targetId, int limit);
+
+  /// The `getInstances` RPC is used to retrieve a set of instances which are of
+  /// a specific class. This does not include instances of subclasses of the
+  /// given class.
+  ///
+  /// The order of the instances is undefined (i.e., not related to allocation
+  /// order) and unstable (i.e., multiple invocations of this method against the
+  /// same class can give different answers even if no Dart code has executed
+  /// between the invocations).
+  ///
+  /// The set of instances may include objects that are unreachable but have not
+  /// yet been garbage collected.
+  ///
+  /// `objectId` is the ID of the `Class` to retrieve instances for. `objectId`
+  /// must be the ID of a `Class`, otherwise an error is returned.
+  ///
+  /// `limit` is the maximum number of instances to be returned.
+  ///
+  /// See [InstanceSet].
+  Future<InstanceSet> getInstances(
+      String isolateId, String objectId, int limit);
+
+  /// The `getIsolate` RPC is used to lookup an `Isolate` object by its `id`.
+  ///
+  /// If `isolateId` refers to an isolate which has exited, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// See [Isolate].
+  ///
+  /// The return value can be one of [Isolate] or [Sentinel].
+  Future<dynamic> getIsolate(String isolateId);
+
+  /// The `getMemoryUsage` RPC is used to lookup an isolate's memory usage
+  /// statistics by its `id`.
+  ///
+  /// If `isolateId` refers to an isolate which has exited, then the `Collected`
+  /// [Sentinel] is returned.
+  ///
+  /// See [Isolate].
+  ///
+  /// The return value can be one of [MemoryUsage] or [Sentinel].
+  Future<dynamic> getMemoryUsage(String isolateId);
+
+  /// The `getScripts` RPC is used to retrieve a `ScriptList` containing all
+  /// scripts for an isolate based on the isolate's `isolateId`.
+  ///
+  /// See [ScriptList].
+  Future<ScriptList> getScripts(String isolateId);
+
+  /// The `getObject` RPC is used to lookup an `object` from some isolate by its
+  /// `id`.
+  ///
+  /// If `objectId` is a temporary id which has expired, then the `Expired`
+  /// [Sentinel] is returned.
+  ///
+  /// If `objectId` refers to a heap object which has been collected by the VM's
+  /// garbage collector, then the `Collected` [Sentinel] is returned.
+  ///
+  /// If `objectId` refers to a non-heap object which has been deleted, then the
+  /// `Collected` [Sentinel] is returned.
+  ///
+  /// If the object handle has not expired and the object has not been
+  /// collected, then an [Obj] will be returned.
+  ///
+  /// The `offset` and `count` parameters are used to request subranges of
+  /// Instance objects with the kinds: String, List, Map, Uint8ClampedList,
+  /// Uint8List, Uint16List, Uint32List, Uint64List, Int8List, Int16List,
+  /// Int32List, Int64List, Flooat32List, Float64List, Inst32x3List,
+  /// Float32x4List, and Float64x2List. These parameters are otherwise ignored.
+  ///
+  /// The return value can be one of [Obj] or [Sentinel].
+  Future<dynamic> getObject(
+    String isolateId,
+    String objectId, {
+    int offset,
+    int count,
+  });
+
+  /// The `getRetainingPath` RPC is used to lookup a path from an object
+  /// specified by `targetId` to a GC root (i.e., the object which is preventing
+  /// this object from being garbage collected).
+  ///
+  /// If `targetId` refers to a heap object which has been collected by the VM's
+  /// garbage collector, then the `Collected` [Sentinel] is returned.
+  ///
+  /// If `targetId` refers to a non-heap object which has been deleted, then the
+  /// `Collected` [Sentinel] is returned.
+  ///
+  /// If the object handle has not expired and the object has not been
+  /// collected, then an [RetainingPath] will be returned.
+  ///
+  /// The `limit` parameter specifies the maximum path length to be reported as
+  /// part of the retaining path. If a path is longer than `limit`, it will be
+  /// truncated at the root end of the path.
+  ///
+  /// See [RetainingPath].
+  Future<RetainingPath> getRetainingPath(
+      String isolateId, String targetId, int limit);
+
+  /// The `getStack` RPC is used to retrieve the current execution stack and
+  /// message queue for an isolate. The isolate does not need to be paused.
+  ///
+  /// See [Stack].
+  Future<Stack> getStack(String isolateId);
+
+  /// The `getSourceReport` RPC is used to generate a set of reports tied to
+  /// source locations in an isolate.
+  ///
+  /// The `reports` parameter is used to specify which reports should be
+  /// generated. The `reports` parameter is a list, which allows multiple
+  /// reports to be generated simultaneously from a consistent isolate state.
+  /// The `reports` parameter is allowed to be empty (this might be used to
+  /// force compilation of a particular subrange of some script).
+  ///
+  /// The available report kinds are:
+  ///
+  /// report kind | meaning
+  /// ----------- | -------
+  /// Coverage | Provide code coverage information
+  /// PossibleBreakpoints | Provide a list of token positions which correspond
+  /// to possible breakpoints.
+  ///
+  /// The `scriptId` parameter is used to restrict the report to a particular
+  /// script. When analyzing a particular script, either or both of the
+  /// `tokenPos` and `endTokenPos` parameters may be provided to restrict the
+  /// analysis to a subrange of a script (for example, these can be used to
+  /// restrict the report to the range of a particular class or function).
+  ///
+  /// If the `scriptId` parameter is not provided then the reports are generated
+  /// for all loaded scripts and the `tokenPos` and `endTokenPos` parameters are
+  /// disallowed.
+  ///
+  /// The `forceCompilation` parameter can be used to force compilation of all
+  /// functions in the range of the report. Forcing compilation can cause a
+  /// compilation error, which could terminate the running Dart program. If this
+  /// parameter is not provided, it is considered to have the value `false`.
+  ///
+  /// See [SourceReport].
+  Future<SourceReport> getSourceReport(
+    String isolateId,
+    /*List<SourceReportKind>*/
+    List<String> reports, {
+    String scriptId,
+    int tokenPos,
+    int endTokenPos,
+    bool forceCompile,
+  });
+
+  /// The `getVersion` RPC is used to determine what version of the Service
+  /// Protocol is served by a VM.
+  ///
+  /// See [Version].
+  Future<Version> getVersion();
+
+  /// The `getVM` RPC returns global information about a Dart virtual machine.
+  ///
+  /// See [VM].
+  Future<VM> getVM();
+
+  /// The `getVMTimeline` RPC is used to retrieve an object which contains VM
+  /// timeline events.
+  ///
+  /// The `timeOriginMicros` parameter is the beginning of the time range used
+  /// to filter timeline events. It uses the same monotonic clock as
+  /// dart:developer's `Timeline.now` and the VM embedding API's
+  /// `Dart_TimelineGetMicros`. See [getVMTimelineMicros] for access to this
+  /// clock through the service protocol.
+  ///
+  /// The `timeExtentMicros` parameter specifies how large the time range used
+  /// to filter timeline events should be.
+  ///
+  /// For example, given `timeOriginMicros` and `timeExtentMicros`, only
+  /// timeline events from the following time range will be returned:
+  /// `(timeOriginMicros, timeOriginMicros + timeExtentMicros)`.
+  ///
+  /// If `getVMTimeline` is invoked while the current recorder is one of Fuchsia
+  /// or Systrace, the `114` error code, invalid timeline request, will be
+  /// returned as timeline events are handled by the OS in these modes.
+  Future<Timeline> getVMTimeline({int timeOriginMicros, int timeExtentMicros});
+
+  /// The `getVMTimelineFlags` RPC returns information about the current VM
+  /// timeline configuration.
+  ///
+  /// To change which timeline streams are currently enabled, see
+  /// [setVMTimelineFlags].
+  ///
+  /// See [TimelineFlags].
+  Future<TimelineFlags> getVMTimelineFlags();
+
+  /// The `getVMTimelineMicros` RPC returns the current time stamp from the
+  /// clock used by the timeline, similar to `Timeline.now` in `dart:developer`
+  /// and `Dart_TimelineGetMicros` in the VM embedding API.
+  ///
+  /// See [Timestamp] and [getVMTimeline].
+  Future<Timestamp> getVMTimelineMicros();
+
+  /// The `pause` RPC is used to interrupt a running isolate. The RPC enqueues
+  /// the interrupt request and potentially returns before the isolate is
+  /// paused.
+  ///
+  /// When the isolate is paused an event will be sent on the `Debug` stream.
+  ///
+  /// See [Success].
+  Future<Success> pause(String isolateId);
+
+  /// The `kill` RPC is used to kill an isolate as if by dart:isolate's
+  /// `Isolate.kill(IMMEDIATE)`.
+  ///
+  /// The isolate is killed regardless of whether it is paused or running.
+  ///
+  /// See [Success].
+  Future<Success> kill(String isolateId);
+
+  /// Registers a service that can be invoked by other VM service clients, where
+  /// `service` is the name of the service to advertise and `alias` is an
+  /// alternative name for the registered service.
+  ///
+  /// Requests made to the new service will be forwarded to the client which
+  /// originally registered the service.
+  ///
+  /// See [Success].
+  Future<Success> registerService(String service, String alias);
+
+  /// The `reloadSources` RPC is used to perform a hot reload of an Isolate's
+  /// sources.
+  ///
+  /// if the `force` parameter is provided, it indicates that all of the
+  /// Isolate's sources should be reloaded regardless of modification time.
+  ///
+  /// if the `pause` parameter is provided, the isolate will pause immediately
+  /// after the reload.
+  ///
+  /// if the `rootLibUri` parameter is provided, it indicates the new uri to the
+  /// Isolate's root library.
+  ///
+  /// if the `packagesUri` parameter is provided, it indicates the new uri to
+  /// the Isolate's package map (.packages) file.
+  Future<ReloadReport> reloadSources(
+    String isolateId, {
+    bool force,
+    bool pause,
+    String rootLibUri,
+    String packagesUri,
+  });
+
+  /// The `removeBreakpoint` RPC is used to remove a breakpoint by its `id`.
+  ///
+  /// Note that breakpoints are added and removed on a per-isolate basis.
+  ///
+  /// See [Success].
+  Future<Success> removeBreakpoint(String isolateId, String breakpointId);
+
+  /// The `resume` RPC is used to resume execution of a paused isolate.
+  ///
+  /// If the `step` parameter is not provided, the program will resume regular
+  /// execution.
+  ///
+  /// If the `step` parameter is provided, it indicates what form of
+  /// single-stepping to use.
+  ///
+  /// step | meaning
+  /// ---- | -------
+  /// Into | Single step, entering function calls
+  /// Over | Single step, skipping over function calls
+  /// Out | Single step until the current function exits
+  /// Rewind | Immediately exit the top frame(s) without executing any code.
+  /// Isolate will be paused at the call of the last exited function.
+  ///
+  /// The `frameIndex` parameter is only used when the `step` parameter is
+  /// Rewind. It specifies the stack frame to rewind to. Stack frame 0 is the
+  /// currently executing function, so `frameIndex` must be at least 1.
+  ///
+  /// If the `frameIndex` parameter is not provided, it defaults to 1.
+  ///
+  /// See [Success], [StepOption].
+  Future<Success> resume(String isolateId,
+      {/*StepOption*/ String step, int frameIndex});
+
+  /// 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
+  Future<Success> setExceptionPauseMode(
+      String isolateId, /*ExceptionPauseMode*/ String mode);
+
+  /// 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.
+  ///
+  /// The following flags may be set at runtime:
+  Future<Success> setFlag(String name, String value);
+
+  /// The `setLibraryDebuggable` RPC is used to enable or disable whether
+  /// breakpoints and stepping work for a given library.
+  ///
+  /// See [Success].
+  Future<Success> setLibraryDebuggable(
+      String isolateId, String libraryId, bool isDebuggable);
+
+  /// The `setName` RPC is used to change the debugging name for an isolate.
+  ///
+  /// See [Success].
+  Future<Success> setName(String isolateId, String name);
+
+  /// The `setVMName` RPC is used to change the debugging name for the vm.
+  ///
+  /// See [Success].
+  Future<Success> setVMName(String name);
+
+  /// The `setVMTimelineFlags` RPC is used to set which timeline streams are
+  /// enabled.
+  ///
+  /// The `recordedStreams` parameter is the list of all timeline streams which
+  /// are to be enabled. Streams not explicitly specified will be disabled.
+  /// Invalid stream names are ignored.
+  ///
+  /// To get the list of currently enabled timeline streams, see
+  /// [getVMTimelineFlags].
+  ///
+  /// See [Success].
+  Future<Success> setVMTimelineFlags(List<String> recordedStreams);
+
+  /// The `streamCancel` RPC cancels a stream subscription in the VM.
+  ///
+  /// If the client is not subscribed to the stream, the `104` (Stream not
+  /// subscribed) error code is returned.
+  ///
+  /// See [Success].
+  Future<Success> streamCancel(String streamId);
+
+  /// The `streamListen` RPC subscribes to a stream in the VM. Once subscribed,
+  /// the client will begin receiving events from the stream.
+  ///
+  /// If the client is already subscribed to the stream, the `103` (Stream
+  /// already subscribed) error code is returned.
+  ///
+  /// The `streamId` parameter may have the following published values:
+  ///
+  /// streamId | event types provided
+  /// -------- | -----------
+  /// VM | VMUpdate, VMFlagUpdate
+  /// Isolate | IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate,
+  /// IsolateReload, ServiceExtensionAdded
+  /// Debug | PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted,
+  /// PauseException, PausePostRequest, Resume, BreakpointAdded,
+  /// BreakpointResolved, BreakpointRemoved, Inspect, None
+  /// GC | GC
+  /// Extension | Extension
+  /// Timeline | TimelineEvents
+  /// Logging | Logging
+  /// Service | ServiceRegistered, ServiceUnregistered
+  ///
+  /// Additionally, some embedders provide the `Stdout` and `Stderr` streams.
+  /// These streams allow the client to subscribe to writes to stdout and
+  /// stderr.
+  ///
+  /// streamId | event types provided
+  /// -------- | -----------
+  /// Stdout | WriteEvent
+  /// Stderr | WriteEvent
+  ///
+  /// It is considered a `backwards compatible` change to add a new type of
+  /// event to an existing stream. Clients should be written to handle this
+  /// gracefully, perhaps by warning and ignoring.
+  ///
+  /// See [Success].
+  Future<Success> streamListen(String streamId);
+}
+
+/// A Dart VM Service Protocol connection that delegates requests to a
+/// [VmServiceInterface] implementation.
+///
+/// One of these should be created for each client, but they should generally
+/// share the same [VmServiceInterface] and [ServiceExtensionRegistry]
+/// instances.
+class VmServerConnection {
+  final Stream<Map<String, Object>> _requestStream;
+  final StreamSink<Map<String, Object>> _responseSink;
+  final ServiceExtensionRegistry _serviceExtensionRegistry;
+  final VmServiceInterface _serviceImplementation;
+
+  /// Used to create unique ids when acting as a proxy between clients.
+  int _nextServiceRequestId = 0;
+
+  /// Manages streams for `streamListen` and `streamCancel` requests.
+  final _streamSubscriptions = <String, StreamSubscription>{};
+
+  /// Completes when [_requestStream] is done.
+  Future get done => _doneCompleter.future;
+  final _doneCompleter = Completer<Null>();
+
+  /// Pending service extension requests to this client by id.
+  final _pendingServiceExtensionRequests =
+      <String, Completer<Map<String, Object>>>{};
+
+  VmServerConnection(this._requestStream, this._responseSink,
+      this._serviceExtensionRegistry, this._serviceImplementation) {
+    _requestStream.listen(_delegateRequest, onDone: _doneCompleter.complete);
+    done.then(
+        (_) => _streamSubscriptions.values.forEach((sub) => sub.cancel()));
+  }
+
+  /// Invoked when the current client has registered some extension, and
+  /// another client sends an RPC request for that extension.
+  ///
+  /// We don't attempt to do any serialization or deserialization of the
+  /// request or response in this case
+  Future<Map<String, Object>> _forwardServiceExtensionRequest(
+      Map<String, Object> request) {
+    var originalId = request['id'];
+    request = Map.of(request);
+    // Modify the request ID to ensure we don't have conflicts between
+    // multiple clients ids.
+    var newId = '${_nextServiceRequestId++}:$originalId';
+    request['id'] = newId;
+    var responseCompleter = Completer<Map<String, Object>>();
+    _pendingServiceExtensionRequests[newId] = responseCompleter;
+    _responseSink.add(request);
+    return responseCompleter.future;
+  }
+
+  void _delegateRequest(Map<String, Object> request) async {
+    try {
+      var id = request['id'] as String;
+      // Check if this is actually a response to a pending request.
+      if (_pendingServiceExtensionRequests.containsKey(id)) {
+        // Restore the original request ID.
+        var originalId = id.substring(id.indexOf(':') + 1);
+        _pendingServiceExtensionRequests[id]
+            .complete(Map.of(request)..['id'] = originalId);
+        return;
+      }
+      var method = request['method'] as String;
+      if (method == null) {
+        throw RPCError(null, -32600, 'Invalid Request', request);
+      }
+      var params = request['params'] as Map;
+      Response response;
+
+      switch (method) {
+        case 'registerService':
+          _serviceExtensionRegistry.registerExtension(params['service'], this);
+          response = Success();
+          break;
+        case 'addBreakpoint':
+          response = await _serviceImplementation.addBreakpoint(
+            params['isolateId'],
+            params['scriptId'],
+            params['line'],
+            column: params['column'],
+          );
+          break;
+        case 'addBreakpointWithScriptUri':
+          response = await _serviceImplementation.addBreakpointWithScriptUri(
+            params['isolateId'],
+            params['scriptUri'],
+            params['line'],
+            column: params['column'],
+          );
+          break;
+        case 'addBreakpointAtEntry':
+          response = await _serviceImplementation.addBreakpointAtEntry(
+            params['isolateId'],
+            params['functionId'],
+          );
+          break;
+        case 'clearVMTimeline':
+          response = await _serviceImplementation.clearVMTimeline();
+          break;
+        case 'invoke':
+          response = await _serviceImplementation.invoke(
+            params['isolateId'],
+            params['targetId'],
+            params['selector'],
+            params['argumentIds'],
+            disableBreakpoints: params['disableBreakpoints'],
+          );
+          break;
+        case 'evaluate':
+          response = await _serviceImplementation.evaluate(
+            params['isolateId'],
+            params['targetId'],
+            params['expression'],
+            scope: params['scope']?.cast<String, String>(),
+            disableBreakpoints: params['disableBreakpoints'],
+          );
+          break;
+        case 'evaluateInFrame':
+          response = await _serviceImplementation.evaluateInFrame(
+            params['isolateId'],
+            params['frameIndex'],
+            params['expression'],
+            scope: params['scope']?.cast<String, String>(),
+            disableBreakpoints: params['disableBreakpoints'],
+          );
+          break;
+        case 'getAllocationProfile':
+          response = await _serviceImplementation.getAllocationProfile(
+            params['isolateId'],
+            reset: params['reset'],
+            gc: params['gc'],
+          );
+          break;
+        case 'getFlagList':
+          response = await _serviceImplementation.getFlagList();
+          break;
+        case 'getInboundReferences':
+          response = await _serviceImplementation.getInboundReferences(
+            params['isolateId'],
+            params['targetId'],
+            params['limit'],
+          );
+          break;
+        case 'getInstances':
+          response = await _serviceImplementation.getInstances(
+            params['isolateId'],
+            params['objectId'],
+            params['limit'],
+          );
+          break;
+        case 'getIsolate':
+          response = await _serviceImplementation.getIsolate(
+            params['isolateId'],
+          );
+          break;
+        case 'getMemoryUsage':
+          response = await _serviceImplementation.getMemoryUsage(
+            params['isolateId'],
+          );
+          break;
+        case 'getScripts':
+          response = await _serviceImplementation.getScripts(
+            params['isolateId'],
+          );
+          break;
+        case 'getObject':
+          response = await _serviceImplementation.getObject(
+            params['isolateId'],
+            params['objectId'],
+            offset: params['offset'],
+            count: params['count'],
+          );
+          break;
+        case 'getRetainingPath':
+          response = await _serviceImplementation.getRetainingPath(
+            params['isolateId'],
+            params['targetId'],
+            params['limit'],
+          );
+          break;
+        case 'getStack':
+          response = await _serviceImplementation.getStack(
+            params['isolateId'],
+          );
+          break;
+        case 'getSourceReport':
+          response = await _serviceImplementation.getSourceReport(
+            params['isolateId'],
+            params['reports'],
+            scriptId: params['scriptId'],
+            tokenPos: params['tokenPos'],
+            endTokenPos: params['endTokenPos'],
+            forceCompile: params['forceCompile'],
+          );
+          break;
+        case 'getVersion':
+          response = await _serviceImplementation.getVersion();
+          break;
+        case 'getVM':
+          response = await _serviceImplementation.getVM();
+          break;
+        case 'getVMTimeline':
+          response = await _serviceImplementation.getVMTimeline(
+            timeOriginMicros: params['timeOriginMicros'],
+            timeExtentMicros: params['timeExtentMicros'],
+          );
+          break;
+        case 'getVMTimelineFlags':
+          response = await _serviceImplementation.getVMTimelineFlags();
+          break;
+        case 'getVMTimelineMicros':
+          response = await _serviceImplementation.getVMTimelineMicros();
+          break;
+        case 'pause':
+          response = await _serviceImplementation.pause(
+            params['isolateId'],
+          );
+          break;
+        case 'kill':
+          response = await _serviceImplementation.kill(
+            params['isolateId'],
+          );
+          break;
+        case 'reloadSources':
+          response = await _serviceImplementation.reloadSources(
+            params['isolateId'],
+            force: params['force'],
+            pause: params['pause'],
+            rootLibUri: params['rootLibUri'],
+            packagesUri: params['packagesUri'],
+          );
+          break;
+        case 'removeBreakpoint':
+          response = await _serviceImplementation.removeBreakpoint(
+            params['isolateId'],
+            params['breakpointId'],
+          );
+          break;
+        case 'resume':
+          response = await _serviceImplementation.resume(
+            params['isolateId'],
+            step: params['step'],
+            frameIndex: params['frameIndex'],
+          );
+          break;
+        case 'setExceptionPauseMode':
+          response = await _serviceImplementation.setExceptionPauseMode(
+            params['isolateId'],
+            params['mode'],
+          );
+          break;
+        case 'setFlag':
+          response = await _serviceImplementation.setFlag(
+            params['name'],
+            params['value'],
+          );
+          break;
+        case 'setLibraryDebuggable':
+          response = await _serviceImplementation.setLibraryDebuggable(
+            params['isolateId'],
+            params['libraryId'],
+            params['isDebuggable'],
+          );
+          break;
+        case 'setName':
+          response = await _serviceImplementation.setName(
+            params['isolateId'],
+            params['name'],
+          );
+          break;
+        case 'setVMName':
+          response = await _serviceImplementation.setVMName(
+            params['name'],
+          );
+          break;
+        case 'setVMTimelineFlags':
+          response = await _serviceImplementation.setVMTimelineFlags(
+            params['recordedStreams'],
+          );
+          break;
+        case 'streamCancel':
+          var id = params['streamId'];
+          var existing = _streamSubscriptions.remove(id);
+          if (existing == null) {
+            throw RPCError('streamCancel', 104, 'Stream not subscribed', {
+              'details': "The stream '$id' is not subscribed",
+            });
+          }
+          await existing.cancel();
+          response = Success();
+          break;
+        case 'streamListen':
+          var id = params['streamId'];
+          if (_streamSubscriptions.containsKey(id)) {
+            throw RPCError('streamListen', 103, 'Stream already subscribed', {
+              'details': "The stream '$id' is already subscribed",
+            });
+          }
+
+          var stream = id == 'Service'
+              ? _serviceExtensionRegistry.onExtensionEvent
+              : _serviceImplementation.onEvent(id);
+          _streamSubscriptions[id] = stream.listen((e) {
+            _responseSink.add({
+              'jsonrpc': '2.0',
+              'method': 'streamNotify',
+              'params': {
+                'streamId': id,
+                'event': e.toJson(),
+              },
+            });
+          });
+          response = Success();
+          break;
+        default:
+          var registeredClient = _serviceExtensionRegistry.clientFor(method);
+          if (registeredClient != null) {
+            // Check for any client which has registered this extension, if we
+            // have one then delegate the request to that client.
+            _responseSink.add(await registeredClient
+                ._forwardServiceExtensionRequest(request));
+            // Bail out early in this case, we are just acting as a proxy and
+            // never get a `Response` instance.
+            return;
+          } else if (method.startsWith('ext.')) {
+            // Remaining methods with `ext.` are assumed to be registered via
+            // dart:developer, which the service implementation handles.
+            var args = params == null ? null : new Map.of(params);
+            var isolateId = args?.remove('isolateId');
+            response = await _serviceImplementation.callServiceExtension(method,
+                isolateId: isolateId, args: args);
+          } else {
+            throw RPCError(method, -32601, 'Method not found', request);
+          }
+      }
+      if (response == null) {
+        throw StateError('Invalid null response from service');
+      }
+      _responseSink.add({
+        'jsonrpc': '2.0',
+        'result': response.toJson(),
+        'id': id,
+      });
+    } catch (e, st) {
+      var error = e is RPCError
+          ? {'code': e.code, 'data': e.data, 'message': e.message}
+          : {'code': -32603, 'message': '$e\n$st'};
+      _responseSink.add({
+        'jsonrpc': '2.0',
+        'error': error,
+        'id': request['id'],
+      });
+    }
+  }
+}
+
+class VmService implements VmServiceInterface {
+  StreamSubscription _streamSub;
+  Function _writeMessage;
+  int _id = 0;
+  Map<String, Completer> _completers = {};
+  Map<String, String> _methodCalls = {};
+  Map<String, ServiceCallback> _services = {};
+  Log _log;
+
+  StreamController<String> _onSend = new StreamController.broadcast(sync: true);
+  StreamController<String> _onReceive =
+      new StreamController.broadcast(sync: true);
+
+  Map<String, StreamController<Event>> _eventControllers = {};
+
+  StreamController<Event> _getEventController(String eventName) {
+    StreamController<Event> controller = _eventControllers[eventName];
+    if (controller == null) {
+      controller = new StreamController.broadcast();
+      _eventControllers[eventName] = controller;
+    }
+    return controller;
+  }
+
+  DisposeHandler _disposeHandler;
+
+  VmService(Stream<dynamic> /*String|List<int>*/ inStream,
+      void writeMessage(String message),
+      {Log log, DisposeHandler disposeHandler}) {
+    _streamSub = inStream.listen(_processMessage);
+    _writeMessage = writeMessage;
+    _log = log == null ? new _NullLog() : log;
+    _disposeHandler = disposeHandler;
+  }
+
+  @override
+  Stream<Event> onEvent(String streamId) =>
+      _getEventController(streamId).stream;
+
+  // VMUpdate, VMFlagUpdate
+  Stream<Event> get onVMEvent => _getEventController('VM').stream;
+
+  // IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate, IsolateReload, ServiceExtensionAdded
+  Stream<Event> get onIsolateEvent => _getEventController('Isolate').stream;
+
+  // PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted, PauseException, PausePostRequest, Resume, BreakpointAdded, BreakpointResolved, BreakpointRemoved, Inspect, None
+  Stream<Event> get onDebugEvent => _getEventController('Debug').stream;
+
+  // GC
+  Stream<Event> get onGCEvent => _getEventController('GC').stream;
+
+  // Extension
+  Stream<Event> get onExtensionEvent => _getEventController('Extension').stream;
+
+  // TimelineEvents
+  Stream<Event> get onTimelineEvent => _getEventController('Timeline').stream;
+
+  // Logging
+  Stream<Event> get onLoggingEvent => _getEventController('Logging').stream;
+
+  // ServiceRegistered, ServiceUnregistered
+  Stream<Event> get onServiceEvent => _getEventController('Service').stream;
+
+  // WriteEvent
+  Stream<Event> get onStdoutEvent => _getEventController('Stdout').stream;
+
+  // WriteEvent
+  Stream<Event> get onStderrEvent => _getEventController('Stderr').stream;
+
+  @override
+  Future<Breakpoint> addBreakpoint(
+    String isolateId,
+    String scriptId,
+    int line, {
+    int column,
+  }) {
+    Map m = {'isolateId': isolateId, 'scriptId': scriptId, 'line': line};
+    if (column != null) {
+      m['column'] = column;
+    }
+    return _call('addBreakpoint', m);
+  }
+
+  @override
+  Future<Breakpoint> addBreakpointWithScriptUri(
+    String isolateId,
+    String scriptUri,
+    int line, {
+    int column,
+  }) {
+    Map m = {'isolateId': isolateId, 'scriptUri': scriptUri, 'line': line};
+    if (column != null) {
+      m['column'] = column;
+    }
+    return _call('addBreakpointWithScriptUri', m);
+  }
+
+  @override
+  Future<Breakpoint> addBreakpointAtEntry(String isolateId, String functionId) {
+    return _call('addBreakpointAtEntry',
+        {'isolateId': isolateId, 'functionId': functionId});
+  }
+
+  @override
+  Future<Success> clearVMTimeline() => _call('clearVMTimeline');
+
+  @override
+  Future<dynamic> invoke(
+    String isolateId,
+    String targetId,
+    String selector,
+    List<String> argumentIds, {
+    bool disableBreakpoints,
+  }) {
+    Map m = {
+      'isolateId': isolateId,
+      'targetId': targetId,
+      'selector': selector,
+      'argumentIds': argumentIds
+    };
+    if (disableBreakpoints != null) {
+      m['disableBreakpoints'] = disableBreakpoints;
+    }
+    return _call('invoke', m);
+  }
+
+  @override
+  Future<dynamic> evaluate(
+    String isolateId,
+    String targetId,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  }) {
+    Map m = {
+      'isolateId': isolateId,
+      'targetId': targetId,
+      'expression': expression
+    };
+    if (scope != null) {
+      m['scope'] = scope;
+    }
+    if (disableBreakpoints != null) {
+      m['disableBreakpoints'] = disableBreakpoints;
+    }
+    return _call('evaluate', m);
+  }
+
+  @override
+  Future<dynamic> evaluateInFrame(
+    String isolateId,
+    int frameIndex,
+    String expression, {
+    Map<String, String> scope,
+    bool disableBreakpoints,
+  }) {
+    Map m = {
+      'isolateId': isolateId,
+      'frameIndex': frameIndex,
+      'expression': expression
+    };
+    if (scope != null) {
+      m['scope'] = scope;
+    }
+    if (disableBreakpoints != null) {
+      m['disableBreakpoints'] = disableBreakpoints;
+    }
+    return _call('evaluateInFrame', m);
+  }
+
+  @override
+  Future<AllocationProfile> getAllocationProfile(String isolateId,
+      {bool reset, bool gc}) {
+    Map m = {'isolateId': isolateId};
+    if (reset != null && reset) {
+      m['reset'] = reset;
+    }
+    if (gc != null && gc) {
+      m['gc'] = gc;
+    }
+    return _call('getAllocationProfile', m);
+  }
+
+  @override
+  Future<FlagList> getFlagList() => _call('getFlagList');
+
+  @override
+  Future<dynamic> getInboundReferences(
+      String isolateId, String targetId, int limit) {
+    return _call('getInboundReferences',
+        {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
+  }
+
+  @override
+  Future<InstanceSet> getInstances(
+      String isolateId, String objectId, int limit) {
+    return _call('getInstances',
+        {'isolateId': isolateId, 'objectId': objectId, 'limit': limit});
+  }
+
+  @override
+  Future<dynamic> getIsolate(String isolateId) {
+    return _call('getIsolate', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<dynamic> getMemoryUsage(String isolateId) {
+    return _call('getMemoryUsage', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<ScriptList> getScripts(String isolateId) {
+    return _call('getScripts', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<dynamic> getObject(
+    String isolateId,
+    String objectId, {
+    int offset,
+    int count,
+  }) {
+    Map m = {'isolateId': isolateId, 'objectId': objectId};
+    if (offset != null) {
+      m['offset'] = offset;
+    }
+    if (count != null) {
+      m['count'] = count;
+    }
+    return _call('getObject', m);
+  }
+
+  @override
+  Future<RetainingPath> getRetainingPath(
+      String isolateId, String targetId, int limit) {
+    return _call('getRetainingPath',
+        {'isolateId': isolateId, 'targetId': targetId, 'limit': limit});
+  }
+
+  @override
+  Future<Stack> getStack(String isolateId) {
+    return _call('getStack', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<SourceReport> getSourceReport(
+    String isolateId,
+    /*List<SourceReportKind>*/
+    List<String> reports, {
+    String scriptId,
+    int tokenPos,
+    int endTokenPos,
+    bool forceCompile,
+  }) {
+    Map m = {'isolateId': isolateId, 'reports': reports};
+    if (scriptId != null) {
+      m['scriptId'] = scriptId;
+    }
+    if (tokenPos != null) {
+      m['tokenPos'] = tokenPos;
+    }
+    if (endTokenPos != null) {
+      m['endTokenPos'] = endTokenPos;
+    }
+    if (forceCompile != null) {
+      m['forceCompile'] = forceCompile;
+    }
+    return _call('getSourceReport', m);
+  }
+
+  @override
+  Future<Version> getVersion() => _call('getVersion');
+
+  @override
+  Future<VM> getVM() => _call('getVM');
+
+  @override
+  Future<Timeline> getVMTimeline({int timeOriginMicros, int timeExtentMicros}) {
+    Map m = {};
+    if (timeOriginMicros != null) {
+      m['timeOriginMicros'] = timeOriginMicros;
+    }
+    if (timeExtentMicros != null) {
+      m['timeExtentMicros'] = timeExtentMicros;
+    }
+    return _call('getVMTimeline', m);
+  }
+
+  @override
+  Future<TimelineFlags> getVMTimelineFlags() => _call('getVMTimelineFlags');
+
+  @override
+  Future<Timestamp> getVMTimelineMicros() => _call('getVMTimelineMicros');
+
+  @override
+  Future<Success> pause(String isolateId) {
+    return _call('pause', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<Success> kill(String isolateId) {
+    return _call('kill', {'isolateId': isolateId});
+  }
+
+  @override
+  Future<Success> registerService(String service, String alias) {
+    return _call('registerService', {'service': service, 'alias': alias});
+  }
+
+  @override
+  Future<ReloadReport> reloadSources(
+    String isolateId, {
+    bool force,
+    bool pause,
+    String rootLibUri,
+    String packagesUri,
+  }) {
+    Map m = {'isolateId': isolateId};
+    if (force != null) {
+      m['force'] = force;
+    }
+    if (pause != null) {
+      m['pause'] = pause;
+    }
+    if (rootLibUri != null) {
+      m['rootLibUri'] = rootLibUri;
+    }
+    if (packagesUri != null) {
+      m['packagesUri'] = packagesUri;
+    }
+    return _call('reloadSources', m);
+  }
+
+  @override
+  Future<Success> removeBreakpoint(String isolateId, String breakpointId) {
+    return _call('removeBreakpoint',
+        {'isolateId': isolateId, 'breakpointId': breakpointId});
+  }
+
+  @override
+  Future<Success> resume(String isolateId,
+      {/*StepOption*/ String step, int frameIndex}) {
+    Map m = {'isolateId': isolateId};
+    if (step != null) {
+      m['step'] = step;
+    }
+    if (frameIndex != null) {
+      m['frameIndex'] = frameIndex;
+    }
+    return _call('resume', m);
+  }
+
+  @override
+  Future<Success> setExceptionPauseMode(
+      String isolateId, /*ExceptionPauseMode*/ String mode) {
+    return _call(
+        'setExceptionPauseMode', {'isolateId': isolateId, 'mode': mode});
+  }
+
+  @override
+  Future<Success> setFlag(String name, String value) {
+    return _call('setFlag', {'name': name, 'value': value});
+  }
+
+  @override
+  Future<Success> setLibraryDebuggable(
+      String isolateId, String libraryId, bool isDebuggable) {
+    return _call('setLibraryDebuggable', {
+      'isolateId': isolateId,
+      'libraryId': libraryId,
+      'isDebuggable': isDebuggable
+    });
+  }
+
+  @override
+  Future<Success> setName(String isolateId, String name) {
+    return _call('setName', {'isolateId': isolateId, 'name': name});
+  }
+
+  @override
+  Future<Success> setVMName(String name) {
+    return _call('setVMName', {'name': name});
+  }
+
+  @override
+  Future<Success> setVMTimelineFlags(List<String> recordedStreams) {
+    return _call('setVMTimelineFlags', {'recordedStreams': recordedStreams});
+  }
+
+  @override
+  Future<Success> streamCancel(String streamId) {
+    return _call('streamCancel', {'streamId': streamId});
+  }
+
+  @override
+  Future<Success> streamListen(String streamId) {
+    return _call('streamListen', {'streamId': streamId});
+  }
+
+  /// Call an arbitrary service protocol method. This allows clients to call
+  /// methods not explicitly exposed by this library.
+  Future<Response> callMethod(String method, {String isolateId, Map args}) {
+    return callServiceExtension(method, isolateId: isolateId, args: args);
+  }
+
+  /// Invoke a specific service protocol extension method.
+  ///
+  /// See https://api.dartlang.org/stable/dart-developer/dart-developer-library.html.
+  @override
+  Future<Response> callServiceExtension(String method,
+      {String isolateId, Map args}) {
+    if (args == null && isolateId == null) {
+      return _call(method);
+    } else if (args == null) {
+      return _call(method, {'isolateId': isolateId});
+    } else {
+      args = new Map.from(args);
+      if (isolateId != null) {
+        args['isolateId'] = isolateId;
+      }
+      return _call(method, args);
+    }
+  }
+
+  Stream<String> get onSend => _onSend.stream;
+
+  Stream<String> get onReceive => _onReceive.stream;
+
+  void dispose() {
+    _streamSub.cancel();
+    _completers.values.forEach((c) => c.completeError('disposed'));
+    if (_disposeHandler != null) _disposeHandler();
+  }
+
+  Future<T> _call<T>(String method, [Map args]) {
+    String id = '${++_id}';
+    Completer<T> completer = new Completer<T>();
+    _completers[id] = completer;
+    _methodCalls[id] = method;
+    Map m = {'id': id, 'method': method};
+    if (args != null) m['params'] = args;
+    String message = jsonEncode(m);
+    _onSend.add(message);
+    _writeMessage(message);
+    return completer.future;
+  }
+
+  /// Register a service for invocation.
+  void registerServiceCallback(String service, ServiceCallback cb) {
+    if (_services.containsKey(service)) {
+      throw new Exception('Service \'${service}\' already registered');
+    }
+    _services[service] = cb;
+  }
+
+  void _processMessage(dynamic message) {
+    // Expect a String, an int[], or a ByteData.
+
+    if (message is String) {
+      _processMessageStr(message);
+    } else if (message is List<int>) {
+      Uint8List list = new Uint8List.fromList(message);
+      _processMessageByteData(new ByteData.view(list.buffer));
+    } else if (message is ByteData) {
+      _processMessageByteData(message);
+    } else {
+      _log.warning('unknown message type: ${message.runtimeType}');
+    }
+  }
+
+  void _processMessageByteData(ByteData bytes) {
+    int offset = 0;
+    int metaSize = bytes.getUint32(offset + 4, Endian.big);
+    offset += 8;
+    String meta = utf8.decode(new Uint8List.view(
+        bytes.buffer, bytes.offsetInBytes + offset, metaSize));
+    offset += metaSize;
+    ByteData data = new ByteData.view(bytes.buffer,
+        bytes.offsetInBytes + offset, bytes.lengthInBytes - offset);
+    dynamic map = jsonDecode(meta);
+    if (map != null && map['method'] == 'streamNotify') {
+      String streamId = map['params']['streamId'];
+      Map event = map['params']['event'];
+      event['_data'] = data;
+      _getEventController(streamId)
+          .add(createServiceObject(event, const ['Event']));
+    }
+  }
+
+  void _processMessageStr(String message) {
+    var json;
+    try {
+      _onReceive.add(message);
+
+      json = jsonDecode(message);
+    } catch (e, s) {
+      _log.severe('unable to decode message: ${message}, ${e}\n${s}');
+      return;
+    }
+
+    if (json.containsKey('method')) {
+      if (json.containsKey('id')) {
+        _processRequest(json);
+      } else {
+        _processNotification(json);
+      }
+    } else if (json.containsKey('id') &&
+        (json.containsKey('result') || json.containsKey('error'))) {
+      _processResponse(json);
+    } else {
+      _log.severe('unknown message type: ${message}');
+    }
+  }
+
+  void _processResponse(Map<String, dynamic> json) {
+    Completer completer = _completers.remove(json['id']);
+    String methodName = _methodCalls.remove(json['id']);
+    List<String> returnTypes = _methodReturnTypes[methodName];
+    if (completer == null) {
+      _log.severe('unmatched request response: ${jsonEncode(json)}');
+    } else if (json['error'] != null) {
+      completer.completeError(RPCError.parse(methodName, json['error']));
+    } else {
+      Map<String, dynamic> result = json['result'] as Map<String, dynamic>;
+      String type = result['type'];
+      if (_typeFactories[type] == null) {
+        completer.complete(Response.parse(result));
+      } else {
+        completer.complete(createServiceObject(result, returnTypes));
+      }
+    }
+  }
+
+  Future _processRequest(Map<String, dynamic> json) async {
+    final Map m = await _routeRequest(json['method'], json['params']);
+    m['id'] = json['id'];
+    m['jsonrpc'] = '2.0';
+    String message = jsonEncode(m);
+    _onSend.add(message);
+    _writeMessage(message);
+  }
+
+  Future _processNotification(Map<String, dynamic> json) async {
+    final String method = json['method'];
+    final Map params = json['params'];
+    if (method == 'streamNotify') {
+      String streamId = params['streamId'];
+      _getEventController(streamId)
+          .add(createServiceObject(params['event'], const ['Event']));
+    } else {
+      await _routeRequest(method, params);
+    }
+  }
+
+  Future<Map> _routeRequest(String method, Map params) async {
+    try {
+      if (_services.containsKey(method)) {
+        return await _services[method](params);
+      }
+      return {
+        'error': {
+          'code': -32601, // Method not found
+          'message': 'Method not found \'$method\''
+        }
+      };
+    } catch (e, st) {
+      return {
+        'error': {
+          'code': -32000, // SERVER ERROR
+          'message': 'Unexpected Server Error $e\n$st'
+        }
+      };
+    }
+  }
+}
+
+typedef DisposeHandler = Future Function();
+
+class RPCError {
+  static RPCError parse(String callingMethod, dynamic json) {
+    return new RPCError(
+        callingMethod, json['code'], json['message'], json['data']);
+  }
+
+  final String callingMethod;
+  final int code;
+  final String message;
+  final Map data;
+
+  RPCError(this.callingMethod, this.code, this.message, [this.data]);
+
+  String get details => data == null ? null : data['details'];
+
+  String toString() {
+    if (details == null) {
+      return '${message} (${code}) from ${callingMethod}()';
+    } else {
+      return '${message} (${code}) from ${callingMethod}():\n${details}';
+    }
+  }
+}
+
+/// An `ExtensionData` is an arbitrary map that can have any contents.
+class ExtensionData {
+  static ExtensionData parse(Map json) =>
+      json == null ? null : new ExtensionData._fromJson(json);
+
+  final Map data;
+
+  ExtensionData() : data = {};
+
+  ExtensionData._fromJson(this.data);
+
+  String toString() => '[ExtensionData ${data}]';
+}
+
+/// A logging handler you can pass to a [VmService] instance in order to get
+/// notifications of non-fatal service protocol warnings and errors.
+abstract class Log {
+  /// Log a warning level message.
+  void warning(String message);
+
+  /// Log an error level message.
+  void severe(String message);
+}
+
+class _NullLog implements Log {
+  void warning(String message) {}
+  void severe(String message) {}
+}
+// enums
+
+class CodeKind {
+  CodeKind._();
+
+  static const String kDart = 'Dart';
+  static const String kNative = 'Native';
+  static const String kStub = 'Stub';
+  static const String kTag = 'Tag';
+  static const String kCollected = 'Collected';
+}
+
+class ErrorKind {
+  ErrorKind._();
+
+  /// The isolate has encountered an unhandled Dart exception.
+  static const String kUnhandledException = 'UnhandledException';
+
+  /// The isolate has encountered a Dart language error in the program.
+  static const String kLanguageError = 'LanguageError';
+
+  /// The isolate has encountered an internal error. These errors should be
+  /// reported as bugs.
+  static const String kInternalError = 'InternalError';
+
+  /// The isolate has been terminated by an external source.
+  static const String kTerminationError = 'TerminationError';
+}
+
+/// An enum of available event streams.
+class EventStreams {
+  EventStreams._();
+
+  static const String kVM = 'VM';
+  static const String kIsolate = 'Isolate';
+  static const String kDebug = 'Debug';
+  static const String kGC = 'GC';
+  static const String kExtension = 'Extension';
+  static const String kTimeline = 'Timeline';
+  static const String kLogging = 'Logging';
+  static const String kService = 'Service';
+  static const String kStdout = 'Stdout';
+  static const String kStderr = 'Stderr';
+}
+
+/// Adding new values to `EventKind` is considered a backwards compatible
+/// change. Clients should ignore unrecognized events.
+class EventKind {
+  EventKind._();
+
+  /// Notification that VM identifying information has changed. Currently used
+  /// to notify of changes to the VM debugging name via setVMName.
+  static const String kVMUpdate = 'VMUpdate';
+
+  /// Notification that a VM flag has been changed via the service protocol.
+  static const String kVMFlagUpdate = 'VMFlagUpdate';
+
+  /// Notification that a new isolate has started.
+  static const String kIsolateStart = 'IsolateStart';
+
+  /// Notification that an isolate is ready to run.
+  static const String kIsolateRunnable = 'IsolateRunnable';
+
+  /// Notification that an isolate has exited.
+  static const String kIsolateExit = 'IsolateExit';
+
+  /// Notification that isolate identifying information has changed. Currently
+  /// used to notify of changes to the isolate debugging name via setName.
+  static const String kIsolateUpdate = 'IsolateUpdate';
+
+  /// Notification that an isolate has been reloaded.
+  static const String kIsolateReload = 'IsolateReload';
+
+  /// Notification that an extension RPC was registered on an isolate.
+  static const String kServiceExtensionAdded = 'ServiceExtensionAdded';
+
+  /// An isolate has paused at start, before executing code.
+  static const String kPauseStart = 'PauseStart';
+
+  /// An isolate has paused at exit, before terminating.
+  static const String kPauseExit = 'PauseExit';
+
+  /// An isolate has paused at a breakpoint or due to stepping.
+  static const String kPauseBreakpoint = 'PauseBreakpoint';
+
+  /// An isolate has paused due to interruption via pause.
+  static const String kPauseInterrupted = 'PauseInterrupted';
+
+  /// An isolate has paused due to an exception.
+  static const String kPauseException = 'PauseException';
+
+  /// An isolate has paused after a service request.
+  static const String kPausePostRequest = 'PausePostRequest';
+
+  /// An isolate has started or resumed execution.
+  static const String kResume = 'Resume';
+
+  /// Indicates an isolate is not yet runnable. Only appears in an Isolate's
+  /// pauseEvent. Never sent over a stream.
+  static const String kNone = 'None';
+
+  /// A breakpoint has been added for an isolate.
+  static const String kBreakpointAdded = 'BreakpointAdded';
+
+  /// An unresolved breakpoint has been resolved for an isolate.
+  static const String kBreakpointResolved = 'BreakpointResolved';
+
+  /// A breakpoint has been removed.
+  static const String kBreakpointRemoved = 'BreakpointRemoved';
+
+  /// A garbage collection event.
+  static const String kGC = 'GC';
+
+  /// Notification of bytes written, for example, to stdout/stderr.
+  static const String kWriteEvent = 'WriteEvent';
+
+  /// Notification from dart:developer.inspect.
+  static const String kInspect = 'Inspect';
+
+  /// Event from dart:developer.postEvent.
+  static const String kExtension = 'Extension';
+
+  /// Event from dart:developer.log.
+  static const String kLogging = 'Logging';
+
+  /// Notification that a Service has been registered into the Service Protocol
+  /// from another client.
+  static const String kServiceRegistered = 'ServiceRegistered';
+
+  /// Notification that a Service has been removed from the Service Protocol
+  /// from another client.
+  static const String kServiceUnregistered = 'ServiceUnregistered';
+}
+
+/// Adding new values to `InstanceKind` is considered a backwards compatible
+/// change. Clients should treat unrecognized instance kinds as `PlainInstance`.
+class InstanceKind {
+  InstanceKind._();
+
+  /// A general instance of the Dart class Object.
+  static const String kPlainInstance = 'PlainInstance';
+
+  /// null instance.
+  static const String kNull = 'Null';
+
+  /// true or false.
+  static const String kBool = 'Bool';
+
+  /// An instance of the Dart class double.
+  static const String kDouble = 'Double';
+
+  /// An instance of the Dart class int.
+  static const String kInt = 'Int';
+
+  /// An instance of the Dart class String.
+  static const String kString = 'String';
+
+  /// An instance of the built-in VM List implementation. User-defined Lists
+  /// will be PlainInstance.
+  static const String kList = 'List';
+
+  /// An instance of the built-in VM Map implementation. User-defined Maps will
+  /// be PlainInstance.
+  static const String kMap = 'Map';
+
+  /// Vector instance kinds.
+  static const String kFloat32x4 = 'Float32x4';
+  static const String kFloat64x2 = 'Float64x2';
+  static const String kInt32x4 = 'Int32x4';
+
+  /// An instance of the built-in VM TypedData implementations. User-defined
+  /// TypedDatas will be PlainInstance.
+  static const String kUint8ClampedList = 'Uint8ClampedList';
+  static const String kUint8List = 'Uint8List';
+  static const String kUint16List = 'Uint16List';
+  static const String kUint32List = 'Uint32List';
+  static const String kUint64List = 'Uint64List';
+  static const String kInt8List = 'Int8List';
+  static const String kInt16List = 'Int16List';
+  static const String kInt32List = 'Int32List';
+  static const String kInt64List = 'Int64List';
+  static const String kFloat32List = 'Float32List';
+  static const String kFloat64List = 'Float64List';
+  static const String kInt32x4List = 'Int32x4List';
+  static const String kFloat32x4List = 'Float32x4List';
+  static const String kFloat64x2List = 'Float64x2List';
+
+  /// An instance of the Dart class StackTrace.
+  static const String kStackTrace = 'StackTrace';
+
+  /// An instance of the built-in VM Closure implementation. User-defined
+  /// Closures will be PlainInstance.
+  static const String kClosure = 'Closure';
+
+  /// An instance of the Dart class MirrorReference.
+  static const String kMirrorReference = 'MirrorReference';
+
+  /// An instance of the Dart class RegExp.
+  static const String kRegExp = 'RegExp';
+
+  /// An instance of the Dart class WeakProperty.
+  static const String kWeakProperty = 'WeakProperty';
+
+  /// An instance of the Dart class Type.
+  static const String kType = 'Type';
+
+  /// An instance of the Dart class TypeParameter.
+  static const String kTypeParameter = 'TypeParameter';
+
+  /// An instance of the Dart class TypeRef.
+  static const String kTypeRef = 'TypeRef';
+
+  /// An instance of the Dart class BoundedType.
+  static const String kBoundedType = 'BoundedType';
+}
+
+/// A `SentinelKind` is used to distinguish different kinds of `Sentinel`
+/// objects.
+///
+/// Adding new values to `SentinelKind` is considered a backwards compatible
+/// change. Clients must handle this gracefully.
+class SentinelKind {
+  SentinelKind._();
+
+  /// Indicates that the object referred to has been collected by the GC.
+  static const String kCollected = 'Collected';
+
+  /// Indicates that an object id has expired.
+  static const String kExpired = 'Expired';
+
+  /// Indicates that a variable or field has not been initialized.
+  static const String kNotInitialized = 'NotInitialized';
+
+  /// Indicates that a variable or field is in the process of being initialized.
+  static const String kBeingInitialized = 'BeingInitialized';
+
+  /// Indicates that a variable has been eliminated by the optimizing compiler.
+  static const String kOptimizedOut = 'OptimizedOut';
+
+  /// Reserved for future use.
+  static const String kFree = 'Free';
+}
+
+/// A `FrameKind` is used to distinguish different kinds of `Frame` objects.
+class FrameKind {
+  FrameKind._();
+
+  static const String kRegular = 'Regular';
+  static const String kAsyncCausal = 'AsyncCausal';
+  static const String kAsyncSuspensionMarker = 'AsyncSuspensionMarker';
+  static const String kAsyncActivation = 'AsyncActivation';
+}
+
+class SourceReportKind {
+  SourceReportKind._();
+
+  /// Used to request a code coverage information.
+  static const String kCoverage = 'Coverage';
+
+  /// Used to request a list of token positions of possible breakpoints.
+  static const String kPossibleBreakpoints = 'PossibleBreakpoints';
+}
+
+/// An `ExceptionPauseMode` indicates how the isolate pauses when an exception
+/// is thrown.
+class ExceptionPauseMode {
+  ExceptionPauseMode._();
+
+  static const String kNone = 'None';
+  static const String kUnhandled = 'Unhandled';
+  static const String kAll = 'All';
+}
+
+/// A `StepOption` indicates which form of stepping is requested in a [resume]
+/// RPC.
+class StepOption {
+  StepOption._();
+
+  static const String kInto = 'Into';
+  static const String kOver = 'Over';
+  static const String kOverAsyncSuspension = 'OverAsyncSuspension';
+  static const String kOut = 'Out';
+  static const String kRewind = 'Rewind';
+}
+
+// types
+
+class AllocationProfile extends Response {
+  static AllocationProfile parse(Map<String, dynamic> json) =>
+      json == null ? null : new AllocationProfile._fromJson(json);
+
+  /// Allocation information for all class types.
+  List<ClassHeapStats> members;
+
+  /// Information about memory usage for the isolate.
+  MemoryUsage memoryUsage;
+
+  /// The timestamp of the last accumulator reset.
+  ///
+  /// If the accumulators have not been reset, this field is not present.
+  @optional
+  int dateLastAccumulatorReset;
+
+  /// The timestamp of the last manually triggered GC.
+  ///
+  /// If a GC has not been triggered manually, this field is not present.
+  @optional
+  int dateLastServiceGC;
+
+  AllocationProfile();
+
+  AllocationProfile._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json) {
+    members = new List<ClassHeapStats>.from(
+        createServiceObject(json['members'], const ['ClassHeapStats']));
+    memoryUsage =
+        createServiceObject(json['memoryUsage'], const ['MemoryUsage']);
+    dateLastAccumulatorReset = json['dateLastAccumulatorReset'] is String
+        ? int.parse(json['dateLastAccumulatorReset'])
+        : json['dateLastAccumulatorReset'];
+    dateLastServiceGC = json['dateLastServiceGC'] is String
+        ? int.parse(json['dateLastServiceGC'])
+        : json['dateLastServiceGC'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'AllocationProfile';
+    json.addAll({
+      'members': members.map((f) => f.toJson()).toList(),
+      'memoryUsage': memoryUsage.toJson(),
+    });
+    _setIfNotNull(json, 'dateLastAccumulatorReset', dateLastAccumulatorReset);
+    _setIfNotNull(json, 'dateLastServiceGC', dateLastServiceGC);
+    return json;
+  }
+
+  String toString() => '[AllocationProfile ' //
+      'type: ${type}, members: ${members}, memoryUsage: ${memoryUsage}]';
+}
+
+/// A `BoundField` represents a field bound to a particular value in an
+/// `Instance`.
+///
+/// If the field is uninitialized, the `value` will be the `NotInitialized`
+/// [Sentinel].
+///
+/// If the field is being initialized, the `value` will be the
+/// `BeingInitialized` [Sentinel].
+class BoundField {
+  static BoundField parse(Map<String, dynamic> json) =>
+      json == null ? null : new BoundField._fromJson(json);
+
+  FieldRef decl;
+
+  /// [value] can be one of [InstanceRef] or [Sentinel].
+  dynamic value;
+
+  BoundField();
+
+  BoundField._fromJson(Map<String, dynamic> json) {
+    decl = createServiceObject(json['decl'], const ['FieldRef']);
+    value =
+        createServiceObject(json['value'], const ['InstanceRef', 'Sentinel']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'decl': decl.toJson(),
+      'value': value.toJson(),
+    });
+    return json;
+  }
+
+  String toString() => '[BoundField decl: ${decl}, value: ${value}]';
+}
+
+/// A `BoundVariable` represents a local variable bound to a particular value in
+/// a `Frame`.
+///
+/// If the variable is uninitialized, the `value` will be the `NotInitialized`
+/// [Sentinel].
+///
+/// If the variable is being initialized, the `value` will be the
+/// `BeingInitialized` [Sentinel].
+///
+/// If the variable has been optimized out by the compiler, the `value` will be
+/// the `OptimizedOut` [Sentinel].
+class BoundVariable extends Response {
+  static BoundVariable parse(Map<String, dynamic> json) =>
+      json == null ? null : new BoundVariable._fromJson(json);
+
+  String name;
+
+  /// [value] can be one of [InstanceRef], [TypeArgumentsRef] or [Sentinel].
+  dynamic value;
+
+  /// The token position where this variable was declared.
+  int declarationTokenPos;
+
+  /// The first token position where this variable is visible to the scope.
+  int scopeStartTokenPos;
+
+  /// The last token position where this variable is visible to the scope.
+  int scopeEndTokenPos;
+
+  BoundVariable();
+
+  BoundVariable._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    value = createServiceObject(
+        json['value'], const ['InstanceRef', 'TypeArgumentsRef', 'Sentinel']);
+    declarationTokenPos = json['declarationTokenPos'];
+    scopeStartTokenPos = json['scopeStartTokenPos'];
+    scopeEndTokenPos = json['scopeEndTokenPos'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'BoundVariable';
+    json.addAll({
+      'name': name,
+      'value': value.toJson(),
+      'declarationTokenPos': declarationTokenPos,
+      'scopeStartTokenPos': scopeStartTokenPos,
+      'scopeEndTokenPos': scopeEndTokenPos,
+    });
+    return json;
+  }
+
+  String toString() => '[BoundVariable ' //
+      'type: ${type}, name: ${name}, value: ${value}, declarationTokenPos: ${declarationTokenPos}, ' //
+      'scopeStartTokenPos: ${scopeStartTokenPos}, scopeEndTokenPos: ${scopeEndTokenPos}]';
+}
+
+/// A `Breakpoint` describes a debugger breakpoint.
+///
+/// A breakpoint is `resolved` when it has been assigned to a specific program
+/// location. A breakpoint my remain unresolved when it is in code which has not
+/// yet been compiled or in a library which has not been loaded (i.e. a deferred
+/// library).
+class Breakpoint extends Obj {
+  static Breakpoint parse(Map<String, dynamic> json) =>
+      json == null ? null : new Breakpoint._fromJson(json);
+
+  /// A number identifying this breakpoint to the user.
+  int breakpointNumber;
+
+  /// Has this breakpoint been assigned to a specific program location?
+  bool resolved;
+
+  /// Is this a breakpoint that was added synthetically as part of a step
+  /// OverAsyncSuspension resume command?
+  @optional
+  bool isSyntheticAsyncContinuation;
+
+  /// SourceLocation when breakpoint is resolved, UnresolvedSourceLocation when
+  /// a breakpoint is not resolved.
+  ///
+  /// [location] can be one of [SourceLocation] or [UnresolvedSourceLocation].
+  dynamic location;
+
+  Breakpoint();
+
+  Breakpoint._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    breakpointNumber = json['breakpointNumber'];
+    resolved = json['resolved'];
+    isSyntheticAsyncContinuation = json['isSyntheticAsyncContinuation'];
+    location = createServiceObject(
+        json['location'], const ['SourceLocation', 'UnresolvedSourceLocation']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Breakpoint';
+    json.addAll({
+      'breakpointNumber': breakpointNumber,
+      'resolved': resolved,
+      'location': location.toJson(),
+    });
+    _setIfNotNull(
+        json, 'isSyntheticAsyncContinuation', isSyntheticAsyncContinuation);
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Breakpoint && id == other.id;
+
+  String toString() => '[Breakpoint ' //
+      'type: ${type}, id: ${id}, breakpointNumber: ${breakpointNumber}, ' //
+      'resolved: ${resolved}, location: ${location}]';
+}
+
+/// `ClassRef` is a reference to a `Class`.
+class ClassRef extends ObjRef {
+  static ClassRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new ClassRef._fromJson(json);
+
+  /// The name of this class.
+  String name;
+
+  ClassRef();
+
+  ClassRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Class';
+    json.addAll({
+      'name': name,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is ClassRef && id == other.id;
+
+  String toString() => '[ClassRef type: ${type}, id: ${id}, name: ${name}]';
+}
+
+/// A `Class` provides information about a Dart language class.
+class Class extends Obj {
+  static Class parse(Map<String, dynamic> json) =>
+      json == null ? null : new Class._fromJson(json);
+
+  /// The name of this class.
+  String name;
+
+  /// The error which occurred during class finalization, if it exists.
+  @optional
+  ErrorRef error;
+
+  /// Is this an abstract class?
+  bool isAbstract;
+
+  /// Is this a const class?
+  bool isConst;
+
+  /// The library which contains this class.
+  LibraryRef library;
+
+  /// The location of this class in the source code.
+  @optional
+  SourceLocation location;
+
+  /// The superclass of this class, if any.
+  @optional
+  ClassRef superClass;
+
+  /// The supertype for this class, if any.
+  ///
+  /// The value will be of the kind: Type.
+  @optional
+  InstanceRef superType;
+
+  /// A list of interface types for this class.
+  ///
+  /// The values will be of the kind: Type.
+  List<InstanceRef> interfaces;
+
+  /// The mixin type for this class, if any.
+  ///
+  /// The value will be of the kind: Type.
+  @optional
+  InstanceRef mixin;
+
+  /// A list of fields in this class. Does not include fields from superclasses.
+  List<FieldRef> fields;
+
+  /// A list of functions in this class. Does not include functions from
+  /// superclasses.
+  List<FuncRef> functions;
+
+  /// A list of subclasses of this class.
+  List<ClassRef> subclasses;
+
+  Class();
+
+  Class._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    error = createServiceObject(json['error'], const ['ErrorRef']);
+    isAbstract = json['abstract'];
+    isConst = json['const'];
+    library = createServiceObject(json['library'], const ['LibraryRef']);
+    location = createServiceObject(json['location'], const ['SourceLocation']);
+    superClass = createServiceObject(json['super'], const ['ClassRef']);
+    superType = createServiceObject(json['superType'], const ['InstanceRef']);
+    interfaces = new List<InstanceRef>.from(
+        createServiceObject(json['interfaces'], const ['InstanceRef']));
+    mixin = createServiceObject(json['mixin'], const ['InstanceRef']);
+    fields = new List<FieldRef>.from(
+        createServiceObject(json['fields'], const ['FieldRef']));
+    functions = new List<FuncRef>.from(
+        createServiceObject(json['functions'], const ['FuncRef']));
+    subclasses = new List<ClassRef>.from(
+        createServiceObject(json['subclasses'], const ['ClassRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Class';
+    json.addAll({
+      'name': name,
+      'abstract': isAbstract,
+      'const': isConst,
+      'library': library.toJson(),
+      'interfaces': interfaces.map((f) => f.toJson()).toList(),
+      'fields': fields.map((f) => f.toJson()).toList(),
+      'functions': functions.map((f) => f.toJson()).toList(),
+      'subclasses': subclasses.map((f) => f.toJson()).toList(),
+    });
+    _setIfNotNull(json, 'error', error?.toJson());
+    _setIfNotNull(json, 'location', location?.toJson());
+    _setIfNotNull(json, 'super', superClass?.toJson());
+    _setIfNotNull(json, 'superType', superType?.toJson());
+    _setIfNotNull(json, 'mixin', mixin?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Class && id == other.id;
+
+  String toString() => '[Class]';
+}
+
+class ClassHeapStats extends Response {
+  static ClassHeapStats parse(Map<String, dynamic> json) =>
+      json == null ? null : new ClassHeapStats._fromJson(json);
+
+  /// The class for which this memory information is associated.
+  ClassRef classRef;
+
+  /// The number of bytes allocated for instances of class since the accumulator
+  /// was last reset.
+  int accumulatedSize;
+
+  /// The number of bytes currently allocated for instances of class.
+  int bytesCurrent;
+
+  /// The number of instances of class which have been allocated since the
+  /// accumulator was last reset.
+  int instancesAccumulated;
+
+  /// The number of instances of class which are currently alive.
+  int instancesCurrent;
+
+  ClassHeapStats();
+
+  ClassHeapStats._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    classRef = createServiceObject(json['class'], const ['ClassRef']);
+    accumulatedSize = json['accumulatedSize'];
+    bytesCurrent = json['bytesCurrent'];
+    instancesAccumulated = json['instancesAccumulated'];
+    instancesCurrent = json['instancesCurrent'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'ClassHeapStats';
+    json.addAll({
+      'class': classRef.toJson(),
+      'accumulatedSize': accumulatedSize,
+      'bytesCurrent': bytesCurrent,
+      'instancesAccumulated': instancesAccumulated,
+      'instancesCurrent': instancesCurrent,
+    });
+    return json;
+  }
+
+  String toString() => '[ClassHeapStats ' //
+      'type: ${type}, classRef: ${classRef}, accumulatedSize: ${accumulatedSize}, ' //
+      'bytesCurrent: ${bytesCurrent}, instancesAccumulated: ${instancesAccumulated}, instancesCurrent: ${instancesCurrent}]';
+}
+
+class ClassList extends Response {
+  static ClassList parse(Map<String, dynamic> json) =>
+      json == null ? null : new ClassList._fromJson(json);
+
+  List<ClassRef> classes;
+
+  ClassList();
+
+  ClassList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    classes = new List<ClassRef>.from(
+        createServiceObject(json['classes'], const ['ClassRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'ClassList';
+    json.addAll({
+      'classes': classes.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[ClassList type: ${type}, classes: ${classes}]';
+}
+
+/// `CodeRef` is a reference to a `Code` object.
+class CodeRef extends ObjRef {
+  static CodeRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new CodeRef._fromJson(json);
+
+  /// A name for this code object.
+  String name;
+
+  /// What kind of code object is this?
+  /*CodeKind*/ String kind;
+
+  CodeRef();
+
+  CodeRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    kind = json['kind'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Code';
+    json.addAll({
+      'name': name,
+      'kind': kind,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is CodeRef && id == other.id;
+
+  String toString() =>
+      '[CodeRef type: ${type}, id: ${id}, name: ${name}, kind: ${kind}]';
+}
+
+/// A `Code` object represents compiled code in the Dart VM.
+class Code extends ObjRef {
+  static Code parse(Map<String, dynamic> json) =>
+      json == null ? null : new Code._fromJson(json);
+
+  /// A name for this code object.
+  String name;
+
+  /// What kind of code object is this?
+  /*CodeKind*/ String kind;
+
+  Code();
+
+  Code._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    kind = json['kind'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Code';
+    json.addAll({
+      'name': name,
+      'kind': kind,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Code && id == other.id;
+
+  String toString() =>
+      '[Code type: ${type}, id: ${id}, name: ${name}, kind: ${kind}]';
+}
+
+class ContextRef extends ObjRef {
+  static ContextRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new ContextRef._fromJson(json);
+
+  /// The number of variables in this context.
+  int length;
+
+  ContextRef();
+
+  ContextRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    length = json['length'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Context';
+    json.addAll({
+      'length': length,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is ContextRef && id == other.id;
+
+  String toString() =>
+      '[ContextRef type: ${type}, id: ${id}, length: ${length}]';
+}
+
+/// A `Context` is a data structure which holds the captured variables for some
+/// closure.
+class Context extends Obj {
+  static Context parse(Map<String, dynamic> json) =>
+      json == null ? null : new Context._fromJson(json);
+
+  /// The number of variables in this context.
+  int length;
+
+  /// The enclosing context for this context.
+  @optional
+  Context parent;
+
+  /// The variables in this context object.
+  List<ContextElement> variables;
+
+  Context();
+
+  Context._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    length = json['length'];
+    parent = createServiceObject(json['parent'], const ['Context']);
+    variables = new List<ContextElement>.from(
+        createServiceObject(json['variables'], const ['ContextElement']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Context';
+    json.addAll({
+      'length': length,
+      'variables': variables.map((f) => f.toJson()).toList(),
+    });
+    _setIfNotNull(json, 'parent', parent?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Context && id == other.id;
+
+  String toString() => '[Context ' //
+      'type: ${type}, id: ${id}, length: ${length}, variables: ${variables}]';
+}
+
+class ContextElement {
+  static ContextElement parse(Map<String, dynamic> json) =>
+      json == null ? null : new ContextElement._fromJson(json);
+
+  /// [value] can be one of [InstanceRef] or [Sentinel].
+  dynamic value;
+
+  ContextElement();
+
+  ContextElement._fromJson(Map<String, dynamic> json) {
+    value =
+        createServiceObject(json['value'], const ['InstanceRef', 'Sentinel']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'value': value.toJson(),
+    });
+    return json;
+  }
+
+  String toString() => '[ContextElement value: ${value}]';
+}
+
+/// `ErrorRef` is a reference to an `Error`.
+class ErrorRef extends ObjRef {
+  static ErrorRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new ErrorRef._fromJson(json);
+
+  /// What kind of error is this?
+  /*ErrorKind*/ String kind;
+
+  /// A description of the error.
+  String message;
+
+  ErrorRef();
+
+  ErrorRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    message = json['message'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Error';
+    json.addAll({
+      'kind': kind,
+      'message': message,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is ErrorRef && id == other.id;
+
+  String toString() =>
+      '[ErrorRef type: ${type}, id: ${id}, kind: ${kind}, message: ${message}]';
+}
+
+/// An `Error` represents a Dart language level error. This is distinct from an
+/// [rpc error].
+class Error extends Obj {
+  static Error parse(Map<String, dynamic> json) =>
+      json == null ? null : new Error._fromJson(json);
+
+  /// What kind of error is this?
+  /*ErrorKind*/ String kind;
+
+  /// A description of the error.
+  String message;
+
+  /// If this error is due to an unhandled exception, this is the exception
+  /// thrown.
+  @optional
+  InstanceRef exception;
+
+  /// If this error is due to an unhandled exception, this is the stacktrace
+  /// object.
+  @optional
+  InstanceRef stacktrace;
+
+  Error();
+
+  Error._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    message = json['message'];
+    exception = createServiceObject(json['exception'], const ['InstanceRef']);
+    stacktrace = createServiceObject(json['stacktrace'], const ['InstanceRef']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Error';
+    json.addAll({
+      'kind': kind,
+      'message': message,
+    });
+    _setIfNotNull(json, 'exception', exception?.toJson());
+    _setIfNotNull(json, 'stacktrace', stacktrace?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Error && id == other.id;
+
+  String toString() =>
+      '[Error type: ${type}, id: ${id}, kind: ${kind}, message: ${message}]';
+}
+
+/// An `Event` is an asynchronous notification from the VM. It is delivered only
+/// when the client has subscribed to an event stream using the [streamListen]
+/// RPC.
+///
+/// For more information, see [events].
+class Event extends Response {
+  static Event parse(Map<String, dynamic> json) =>
+      json == null ? null : new Event._fromJson(json);
+
+  /// What kind of event is this?
+  /*EventKind*/ String kind;
+
+  /// The isolate with which this event is associated.
+  ///
+  /// This is provided for all event kinds except for:
+  ///  - VMUpdate, VMFlagUpdate
+  @optional
+  IsolateRef isolate;
+
+  /// The vm with which this event is associated.
+  ///
+  /// This is provided for the event kind:
+  ///  - VMUpdate, VMFlagUpdate
+  @optional
+  VMRef vm;
+
+  /// The timestamp (in milliseconds since the epoch) associated with this
+  /// event. For some isolate pause events, the timestamp is from when the
+  /// isolate was paused. For other events, the timestamp is from when the event
+  /// was created.
+  int timestamp;
+
+  /// The breakpoint which was added, removed, or resolved.
+  ///
+  /// This is provided for the event kinds:
+  ///  - PauseBreakpoint
+  ///  - BreakpointAdded
+  ///  - BreakpointRemoved
+  ///  - BreakpointResolved
+  @optional
+  Breakpoint breakpoint;
+
+  /// The list of breakpoints at which we are currently paused for a
+  /// PauseBreakpoint event.
+  ///
+  /// This list may be empty. For example, while single-stepping, the VM sends a
+  /// PauseBreakpoint event with no breakpoints.
+  ///
+  /// If there is more than one breakpoint set at the program position, then all
+  /// of them will be provided.
+  ///
+  /// This is provided for the event kinds:
+  ///  - PauseBreakpoint
+  @optional
+  List<Breakpoint> pauseBreakpoints;
+
+  /// The top stack frame associated with this event, if applicable.
+  ///
+  /// This is provided for the event kinds:
+  ///  - PauseBreakpoint
+  ///  - PauseInterrupted
+  ///  - PauseException
+  ///
+  /// For PauseInterrupted events, there will be no top frame if the isolate is
+  /// idle (waiting in the message loop).
+  ///
+  /// For the Resume event, the top frame is provided at all times except for
+  /// the initial resume event that is delivered when an isolate begins
+  /// execution.
+  @optional
+  Frame topFrame;
+
+  /// The exception associated with this event, if this is a PauseException
+  /// event.
+  @optional
+  InstanceRef exception;
+
+  /// An array of bytes, encoded as a base64 string.
+  ///
+  /// This is provided for the WriteEvent event.
+  @optional
+  String bytes;
+
+  /// The argument passed to dart:developer.inspect.
+  ///
+  /// This is provided for the Inspect event.
+  @optional
+  InstanceRef inspectee;
+
+  /// The RPC name of the extension that was added.
+  ///
+  /// This is provided for the ServiceExtensionAdded event.
+  @optional
+  String extensionRPC;
+
+  /// The extension event kind.
+  ///
+  /// This is provided for the Extension event.
+  @optional
+  String extensionKind;
+
+  /// The extension event data.
+  ///
+  /// This is provided for the Extension event.
+  @optional
+  ExtensionData extensionData;
+
+  /// An array of TimelineEvents
+  ///
+  /// This is provided for the TimelineEvents event.
+  @optional
+  List<TimelineEvent> timelineEvents;
+
+  /// Is the isolate paused at an await, yield, or yield* statement?
+  ///
+  /// This is provided for the event kinds:
+  ///  - PauseBreakpoint
+  ///  - PauseInterrupted
+  @optional
+  bool atAsyncSuspension;
+
+  /// The status (success or failure) related to the event. This is provided for
+  /// the event kinds:
+  ///  - IsolateReloaded
+  ///  - IsolateSpawn
+  @optional
+  String status;
+
+  /// LogRecord data.
+  ///
+  /// This is provided for the Logging event.
+  @optional
+  LogRecord logRecord;
+
+  /// The service identifier.
+  ///
+  /// This is provided for the event kinds:
+  ///  - ServiceRegistered
+  ///  - ServiceUnregistered
+  @optional
+  String service;
+
+  /// The RPC method that should be used to invoke the service.
+  ///
+  /// This is provided for the event kinds:
+  ///  - ServiceRegistered
+  ///  - ServiceUnregistered
+  @optional
+  String method;
+
+  /// The alias of the registered service.
+  ///
+  /// This is provided for the event kinds:
+  ///  - ServiceRegistered
+  @optional
+  String alias;
+
+  /// The name of the changed flag.
+  ///
+  /// This is provided for the event kinds:
+  ///  - VMFlagUpdate
+  @optional
+  String flag;
+
+  /// The new value of the changed flag.
+  ///
+  /// This is provided for the event kinds:
+  ///  - VMFlagUpdate
+  @optional
+  String newValue;
+
+  Event();
+
+  Event._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    isolate = createServiceObject(json['isolate'], const ['IsolateRef']);
+    vm = createServiceObject(json['vm'], const ['VMRef']);
+    timestamp = json['timestamp'];
+    breakpoint = createServiceObject(json['breakpoint'], const ['Breakpoint']);
+    pauseBreakpoints = json['pauseBreakpoints'] == null
+        ? null
+        : new List<Breakpoint>.from(createServiceObject(
+            json['pauseBreakpoints'], const ['Breakpoint']));
+    topFrame = createServiceObject(json['topFrame'], const ['Frame']);
+    exception = createServiceObject(json['exception'], const ['InstanceRef']);
+    bytes = json['bytes'];
+    inspectee = createServiceObject(json['inspectee'], const ['InstanceRef']);
+    extensionRPC = json['extensionRPC'];
+    extensionKind = json['extensionKind'];
+    extensionData = ExtensionData.parse(json['extensionData']);
+    timelineEvents = json['timelineEvents'] == null
+        ? null
+        : new List<TimelineEvent>.from(createServiceObject(
+            json['timelineEvents'], const ['TimelineEvent']));
+    atAsyncSuspension = json['atAsyncSuspension'];
+    status = json['status'];
+    logRecord = createServiceObject(json['logRecord'], const ['LogRecord']);
+    service = json['service'];
+    method = json['method'];
+    alias = json['alias'];
+    flag = json['flag'];
+    newValue = json['newValue'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Event';
+    json.addAll({
+      'kind': kind,
+      'timestamp': timestamp,
+    });
+    _setIfNotNull(json, 'isolate', isolate?.toJson());
+    _setIfNotNull(json, 'vm', vm?.toJson());
+    _setIfNotNull(json, 'breakpoint', breakpoint?.toJson());
+    _setIfNotNull(json, 'pauseBreakpoints',
+        pauseBreakpoints?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(json, 'topFrame', topFrame?.toJson());
+    _setIfNotNull(json, 'exception', exception?.toJson());
+    _setIfNotNull(json, 'bytes', bytes);
+    _setIfNotNull(json, 'inspectee', inspectee?.toJson());
+    _setIfNotNull(json, 'extensionRPC', extensionRPC);
+    _setIfNotNull(json, 'extensionKind', extensionKind);
+    _setIfNotNull(json, 'extensionData', extensionData?.data);
+    _setIfNotNull(json, 'timelineEvents',
+        timelineEvents?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(json, 'atAsyncSuspension', atAsyncSuspension);
+    _setIfNotNull(json, 'status', status);
+    _setIfNotNull(json, 'logRecord', logRecord?.toJson());
+    _setIfNotNull(json, 'service', service);
+    _setIfNotNull(json, 'method', method);
+    _setIfNotNull(json, 'alias', alias);
+    _setIfNotNull(json, 'flag', flag);
+    _setIfNotNull(json, 'newValue', newValue);
+    return json;
+  }
+
+  String toString() =>
+      '[Event type: ${type}, kind: ${kind}, timestamp: ${timestamp}]';
+}
+
+/// An `FieldRef` is a reference to a `Field`.
+class FieldRef extends ObjRef {
+  static FieldRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new FieldRef._fromJson(json);
+
+  /// The name of this field.
+  String name;
+
+  /// The owner of this field, which can be either a Library or a Class.
+  ObjRef owner;
+
+  /// The declared type of this field.
+  ///
+  /// The value will always be of one of the kinds: Type, TypeRef,
+  /// TypeParameter, BoundedType.
+  InstanceRef declaredType;
+
+  /// Is this field const?
+  bool isConst;
+
+  /// Is this field final?
+  bool isFinal;
+
+  /// Is this field static?
+  bool isStatic;
+
+  FieldRef();
+
+  FieldRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    owner = createServiceObject(json['owner'], const ['ObjRef']);
+    declaredType =
+        createServiceObject(json['declaredType'], const ['InstanceRef']);
+    isConst = json['const'];
+    isFinal = json['final'];
+    isStatic = json['static'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Field';
+    json.addAll({
+      'name': name,
+      'owner': owner.toJson(),
+      'declaredType': declaredType.toJson(),
+      'const': isConst,
+      'final': isFinal,
+      'static': isStatic,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is FieldRef && id == other.id;
+
+  String toString() => '[FieldRef]';
+}
+
+/// A `Field` provides information about a Dart language field or variable.
+class Field extends Obj {
+  static Field parse(Map<String, dynamic> json) =>
+      json == null ? null : new Field._fromJson(json);
+
+  /// The name of this field.
+  String name;
+
+  /// The owner of this field, which can be either a Library or a Class.
+  ObjRef owner;
+
+  /// The declared type of this field.
+  ///
+  /// The value will always be of one of the kinds: Type, TypeRef,
+  /// TypeParameter, BoundedType.
+  InstanceRef declaredType;
+
+  /// Is this field const?
+  bool isConst;
+
+  /// Is this field final?
+  bool isFinal;
+
+  /// Is this field static?
+  bool isStatic;
+
+  /// The value of this field, if the field is static.
+  @optional
+  InstanceRef staticValue;
+
+  /// The location of this field in the source code.
+  @optional
+  SourceLocation location;
+
+  Field();
+
+  Field._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    owner = createServiceObject(json['owner'], const ['ObjRef']);
+    declaredType =
+        createServiceObject(json['declaredType'], const ['InstanceRef']);
+    isConst = json['const'];
+    isFinal = json['final'];
+    isStatic = json['static'];
+    staticValue =
+        createServiceObject(json['staticValue'], const ['InstanceRef']);
+    location = createServiceObject(json['location'], const ['SourceLocation']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Field';
+    json.addAll({
+      'name': name,
+      'owner': owner.toJson(),
+      'declaredType': declaredType.toJson(),
+      'const': isConst,
+      'final': isFinal,
+      'static': isStatic,
+    });
+    _setIfNotNull(json, 'staticValue', staticValue?.toJson());
+    _setIfNotNull(json, 'location', location?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Field && id == other.id;
+
+  String toString() => '[Field]';
+}
+
+/// A `Flag` represents a single VM command line flag.
+class Flag {
+  static Flag parse(Map<String, dynamic> json) =>
+      json == null ? null : new Flag._fromJson(json);
+
+  /// The name of the flag.
+  String name;
+
+  /// A description of the flag.
+  String comment;
+
+  /// Has this flag been modified from its default setting?
+  bool modified;
+
+  /// The value of this flag as a string.
+  ///
+  /// If this property is absent, then the value of the flag was NULL.
+  @optional
+  String valueAsString;
+
+  Flag();
+
+  Flag._fromJson(Map<String, dynamic> json) {
+    name = json['name'];
+    comment = json['comment'];
+    modified = json['modified'];
+    valueAsString = json['valueAsString'];
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'name': name,
+      'comment': comment,
+      'modified': modified,
+    });
+    _setIfNotNull(json, 'valueAsString', valueAsString);
+    return json;
+  }
+
+  String toString() =>
+      '[Flag name: ${name}, comment: ${comment}, modified: ${modified}]';
+}
+
+/// A `FlagList` represents the complete set of VM command line flags.
+class FlagList extends Response {
+  static FlagList parse(Map<String, dynamic> json) =>
+      json == null ? null : new FlagList._fromJson(json);
+
+  /// A list of all flags in the VM.
+  List<Flag> flags;
+
+  FlagList();
+
+  FlagList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    flags =
+        new List<Flag>.from(createServiceObject(json['flags'], const ['Flag']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'FlagList';
+    json.addAll({
+      'flags': flags.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[FlagList type: ${type}, flags: ${flags}]';
+}
+
+class Frame extends Response {
+  static Frame parse(Map<String, dynamic> json) =>
+      json == null ? null : new Frame._fromJson(json);
+
+  int index;
+
+  @optional
+  FuncRef function;
+
+  @optional
+  CodeRef code;
+
+  @optional
+  SourceLocation location;
+
+  @optional
+  List<BoundVariable> vars;
+
+  @optional
+  /*FrameKind*/
+  String kind;
+
+  Frame();
+
+  Frame._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    index = json['index'];
+    function = createServiceObject(json['function'], const ['FuncRef']);
+    code = createServiceObject(json['code'], const ['CodeRef']);
+    location = createServiceObject(json['location'], const ['SourceLocation']);
+    vars = json['vars'] == null
+        ? null
+        : new List<BoundVariable>.from(
+            createServiceObject(json['vars'], const ['BoundVariable']));
+    kind = json['kind'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Frame';
+    json.addAll({
+      'index': index,
+    });
+    _setIfNotNull(json, 'function', function?.toJson());
+    _setIfNotNull(json, 'code', code?.toJson());
+    _setIfNotNull(json, 'location', location?.toJson());
+    _setIfNotNull(json, 'vars', vars?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(json, 'kind', kind);
+    return json;
+  }
+
+  String toString() => '[Frame type: ${type}, index: ${index}]';
+}
+
+/// An `FuncRef` is a reference to a `Func`.
+class FuncRef extends ObjRef {
+  static FuncRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new FuncRef._fromJson(json);
+
+  /// The name of this function.
+  String name;
+
+  /// The owner of this function, which can be a Library, Class, or a Function.
+  ///
+  /// [owner] can be one of [LibraryRef], [ClassRef] or [FuncRef].
+  dynamic owner;
+
+  /// Is this function static?
+  bool isStatic;
+
+  /// Is this function const?
+  bool isConst;
+
+  FuncRef();
+
+  FuncRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    owner = createServiceObject(
+        json['owner'], const ['LibraryRef', 'ClassRef', 'FuncRef']);
+    isStatic = json['static'];
+    isConst = json['const'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Function';
+    json.addAll({
+      'name': name,
+      'owner': owner.toJson(),
+      'static': isStatic,
+      'const': isConst,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is FuncRef && id == other.id;
+
+  String toString() => '[FuncRef ' //
+      'type: ${type}, id: ${id}, name: ${name}, owner: ${owner}, ' //
+      'isStatic: ${isStatic}, isConst: ${isConst}]';
+}
+
+/// A `Func` represents a Dart language function.
+class Func extends Obj {
+  static Func parse(Map<String, dynamic> json) =>
+      json == null ? null : new Func._fromJson(json);
+
+  /// The name of this function.
+  String name;
+
+  /// The owner of this function, which can be a Library, Class, or a Function.
+  ///
+  /// [owner] can be one of [LibraryRef], [ClassRef] or [FuncRef].
+  dynamic owner;
+
+  /// The location of this function in the source code.
+  @optional
+  SourceLocation location;
+
+  /// The compiled code associated with this function.
+  @optional
+  CodeRef code;
+
+  Func();
+
+  Func._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    owner = createServiceObject(
+        json['owner'], const ['LibraryRef', 'ClassRef', 'FuncRef']);
+    location = createServiceObject(json['location'], const ['SourceLocation']);
+    code = createServiceObject(json['code'], const ['CodeRef']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Function';
+    json.addAll({
+      'name': name,
+      'owner': owner.toJson(),
+    });
+    _setIfNotNull(json, 'location', location?.toJson());
+    _setIfNotNull(json, 'code', code?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Func && id == other.id;
+
+  String toString() =>
+      '[Func type: ${type}, id: ${id}, name: ${name}, owner: ${owner}]';
+}
+
+/// `InstanceRef` is a reference to an `Instance`.
+class InstanceRef extends ObjRef {
+  static InstanceRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new InstanceRef._fromJson(json);
+
+  /// What kind of instance is this?
+  /*InstanceKind*/ String kind;
+
+  /// Instance references always include their class.
+  ClassRef classRef;
+
+  /// The value of this instance as a string.
+  ///
+  /// Provided for the instance kinds:
+  ///  - Null (null)
+  ///  - Bool (true or false)
+  ///  - Double (suitable for passing to Double.parse())
+  ///  - Int (suitable for passing to int.parse())
+  ///  - String (value may be truncated)
+  ///  - Float32x4
+  ///  - Float64x2
+  ///  - Int32x4
+  ///  - StackTrace
+  @optional
+  String valueAsString;
+
+  /// The valueAsString for String references may be truncated. If so, this
+  /// property is added with the value 'true'.
+  ///
+  /// New code should use 'length' and 'count' instead.
+  @optional
+  bool valueAsStringIsTruncated;
+
+  /// The length of a List or the number of associations in a Map or the number
+  /// of codeunits in a String.
+  ///
+  /// Provided for instance kinds:
+  ///  - String
+  ///  - List
+  ///  - Map
+  ///  - Uint8ClampedList
+  ///  - Uint8List
+  ///  - Uint16List
+  ///  - Uint32List
+  ///  - Uint64List
+  ///  - Int8List
+  ///  - Int16List
+  ///  - Int32List
+  ///  - Int64List
+  ///  - Float32List
+  ///  - Float64List
+  ///  - Int32x4List
+  ///  - Float32x4List
+  ///  - Float64x2List
+  @optional
+  int length;
+
+  /// The name of a Type instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - Type
+  @optional
+  String name;
+
+  /// The corresponding Class if this Type has a resolved typeClass.
+  ///
+  /// Provided for instance kinds:
+  ///  - Type
+  @optional
+  ClassRef typeClass;
+
+  /// The parameterized class of a type parameter:
+  ///
+  /// Provided for instance kinds:
+  ///  - TypeParameter
+  @optional
+  ClassRef parameterizedClass;
+
+  /// The pattern of a RegExp instance.
+  ///
+  /// The pattern is always an instance of kind String.
+  ///
+  /// Provided for instance kinds:
+  ///  - RegExp
+  @optional
+  InstanceRef pattern;
+
+  InstanceRef();
+
+  InstanceRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    classRef = createServiceObject(json['class'], const ['ClassRef']);
+    valueAsString = json['valueAsString'];
+    valueAsStringIsTruncated = json['valueAsStringIsTruncated'] ?? false;
+    length = json['length'];
+    name = json['name'];
+    typeClass = createServiceObject(json['typeClass'], const ['ClassRef']);
+    parameterizedClass =
+        createServiceObject(json['parameterizedClass'], const ['ClassRef']);
+    pattern = createServiceObject(json['pattern'], const ['InstanceRef']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Instance';
+    json.addAll({
+      'kind': kind,
+      'class': classRef.toJson(),
+    });
+    _setIfNotNull(json, 'valueAsString', valueAsString);
+    _setIfNotNull(
+        json, 'valueAsStringIsTruncated', valueAsStringIsTruncated ?? false);
+    _setIfNotNull(json, 'length', length);
+    _setIfNotNull(json, 'name', name);
+    _setIfNotNull(json, 'typeClass', typeClass?.toJson());
+    _setIfNotNull(json, 'parameterizedClass', parameterizedClass?.toJson());
+    _setIfNotNull(json, 'pattern', pattern?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is InstanceRef && id == other.id;
+
+  String toString() => '[InstanceRef ' //
+      'type: ${type}, id: ${id}, kind: ${kind}, classRef: ${classRef}]';
+}
+
+/// An `Instance` represents an instance of the Dart language class `Obj`.
+class Instance extends Obj {
+  static Instance parse(Map<String, dynamic> json) =>
+      json == null ? null : new Instance._fromJson(json);
+
+  /// What kind of instance is this?
+  /*InstanceKind*/ String kind;
+
+  /// Instance references always include their class.
+  @override
+  ClassRef classRef;
+
+  /// The value of this instance as a string.
+  ///
+  /// Provided for the instance kinds:
+  ///  - Bool (true or false)
+  ///  - Double (suitable for passing to Double.parse())
+  ///  - Int (suitable for passing to int.parse())
+  ///  - String (value may be truncated)
+  @optional
+  String valueAsString;
+
+  /// The valueAsString for String references may be truncated. If so, this
+  /// property is added with the value 'true'.
+  ///
+  /// New code should use 'length' and 'count' instead.
+  @optional
+  bool valueAsStringIsTruncated;
+
+  /// The length of a List or the number of associations in a Map or the number
+  /// of codeunits in a String.
+  ///
+  /// Provided for instance kinds:
+  ///  - String
+  ///  - List
+  ///  - Map
+  ///  - Uint8ClampedList
+  ///  - Uint8List
+  ///  - Uint16List
+  ///  - Uint32List
+  ///  - Uint64List
+  ///  - Int8List
+  ///  - Int16List
+  ///  - Int32List
+  ///  - Int64List
+  ///  - Float32List
+  ///  - Float64List
+  ///  - Int32x4List
+  ///  - Float32x4List
+  ///  - Float64x2List
+  @optional
+  int length;
+
+  /// The index of the first element or association or codeunit returned. This
+  /// is only provided when it is non-zero.
+  ///
+  /// Provided for instance kinds:
+  ///  - String
+  ///  - List
+  ///  - Map
+  ///  - Uint8ClampedList
+  ///  - Uint8List
+  ///  - Uint16List
+  ///  - Uint32List
+  ///  - Uint64List
+  ///  - Int8List
+  ///  - Int16List
+  ///  - Int32List
+  ///  - Int64List
+  ///  - Float32List
+  ///  - Float64List
+  ///  - Int32x4List
+  ///  - Float32x4List
+  ///  - Float64x2List
+  @optional
+  int offset;
+
+  /// The number of elements or associations or codeunits returned. This is only
+  /// provided when it is less than length.
+  ///
+  /// Provided for instance kinds:
+  ///  - String
+  ///  - List
+  ///  - Map
+  ///  - Uint8ClampedList
+  ///  - Uint8List
+  ///  - Uint16List
+  ///  - Uint32List
+  ///  - Uint64List
+  ///  - Int8List
+  ///  - Int16List
+  ///  - Int32List
+  ///  - Int64List
+  ///  - Float32List
+  ///  - Float64List
+  ///  - Int32x4List
+  ///  - Float32x4List
+  ///  - Float64x2List
+  @optional
+  int count;
+
+  /// The name of a Type instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - Type
+  @optional
+  String name;
+
+  /// The corresponding Class if this Type is canonical.
+  ///
+  /// Provided for instance kinds:
+  ///  - Type
+  @optional
+  ClassRef typeClass;
+
+  /// The parameterized class of a type parameter:
+  ///
+  /// Provided for instance kinds:
+  ///  - TypeParameter
+  @optional
+  ClassRef parameterizedClass;
+
+  /// The fields of this Instance.
+  @optional
+  List<BoundField> fields;
+
+  /// The elements of a List instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - List
+  @optional
+  List<dynamic> elements;
+
+  /// The elements of a Map instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - Map
+  @optional
+  List<MapAssociation> associations;
+
+  /// The bytes of a TypedData instance.
+  ///
+  /// The data is provided as a Base64 encoded string.
+  ///
+  /// Provided for instance kinds:
+  ///  - Uint8ClampedList
+  ///  - Uint8List
+  ///  - Uint16List
+  ///  - Uint32List
+  ///  - Uint64List
+  ///  - Int8List
+  ///  - Int16List
+  ///  - Int32List
+  ///  - Int64List
+  ///  - Float32List
+  ///  - Float64List
+  ///  - Int32x4List
+  ///  - Float32x4List
+  ///  - Float64x2List
+  @optional
+  String bytes;
+
+  /// The function associated with a Closure instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - Closure
+  @optional
+  FuncRef closureFunction;
+
+  /// The context associated with a Closure instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - Closure
+  @optional
+  ContextRef closureContext;
+
+  /// The referent of a MirrorReference instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - MirrorReference
+  @optional
+  InstanceRef mirrorReferent;
+
+  /// The pattern of a RegExp instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - RegExp
+  @optional
+  String pattern;
+
+  /// Whether this regular expression is case sensitive.
+  ///
+  /// Provided for instance kinds:
+  ///  - RegExp
+  @optional
+  bool isCaseSensitive;
+
+  /// Whether this regular expression matches multiple lines.
+  ///
+  /// Provided for instance kinds:
+  ///  - RegExp
+  @optional
+  bool isMultiLine;
+
+  /// The key for a WeakProperty instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - WeakProperty
+  @optional
+  InstanceRef propertyKey;
+
+  /// The key for a WeakProperty instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - WeakProperty
+  @optional
+  InstanceRef propertyValue;
+
+  /// The type arguments for this type.
+  ///
+  /// Provided for instance kinds:
+  ///  - Type
+  @optional
+  TypeArgumentsRef typeArguments;
+
+  /// The index of a TypeParameter instance.
+  ///
+  /// Provided for instance kinds:
+  ///  - TypeParameter
+  @optional
+  int parameterIndex;
+
+  /// The type bounded by a BoundedType instance - or - the referent of a
+  /// TypeRef instance.
+  ///
+  /// The value will always be of one of the kinds: Type, TypeRef,
+  /// TypeParameter, BoundedType.
+  ///
+  /// Provided for instance kinds:
+  ///  - BoundedType
+  ///  - TypeRef
+  @optional
+  InstanceRef targetType;
+
+  /// The bound of a TypeParameter or BoundedType.
+  ///
+  /// The value will always be of one of the kinds: Type, TypeRef,
+  /// TypeParameter, BoundedType.
+  ///
+  /// Provided for instance kinds:
+  ///  - BoundedType
+  ///  - TypeParameter
+  @optional
+  InstanceRef bound;
+
+  Instance();
+
+  Instance._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    classRef = createServiceObject(json['class'], const ['ClassRef']);
+    valueAsString = json['valueAsString'];
+    valueAsStringIsTruncated = json['valueAsStringIsTruncated'] ?? false;
+    length = json['length'];
+    offset = json['offset'];
+    count = json['count'];
+    name = json['name'];
+    typeClass = createServiceObject(json['typeClass'], const ['ClassRef']);
+    parameterizedClass =
+        createServiceObject(json['parameterizedClass'], const ['ClassRef']);
+    fields = json['fields'] == null
+        ? null
+        : new List<BoundField>.from(
+            createServiceObject(json['fields'], const ['BoundField']));
+    elements = json['elements'] == null
+        ? null
+        : new List<dynamic>.from(
+            createServiceObject(json['elements'], const ['dynamic']));
+    associations = json['associations'] == null
+        ? null
+        : new List<MapAssociation>.from(
+            _createSpecificObject(json['associations'], MapAssociation.parse));
+    bytes = json['bytes'];
+    closureFunction =
+        createServiceObject(json['closureFunction'], const ['FuncRef']);
+    closureContext =
+        createServiceObject(json['closureContext'], const ['ContextRef']);
+    mirrorReferent =
+        createServiceObject(json['mirrorReferent'], const ['InstanceRef']);
+    pattern = json['pattern'];
+    isCaseSensitive = json['isCaseSensitive'];
+    isMultiLine = json['isMultiLine'];
+    propertyKey =
+        createServiceObject(json['propertyKey'], const ['InstanceRef']);
+    propertyValue =
+        createServiceObject(json['propertyValue'], const ['InstanceRef']);
+    typeArguments =
+        createServiceObject(json['typeArguments'], const ['TypeArgumentsRef']);
+    parameterIndex = json['parameterIndex'];
+    targetType = createServiceObject(json['targetType'], const ['InstanceRef']);
+    bound = createServiceObject(json['bound'], const ['InstanceRef']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Instance';
+    json.addAll({
+      'kind': kind,
+      'class': classRef.toJson(),
+    });
+    _setIfNotNull(json, 'valueAsString', valueAsString);
+    _setIfNotNull(
+        json, 'valueAsStringIsTruncated', valueAsStringIsTruncated ?? false);
+    _setIfNotNull(json, 'length', length);
+    _setIfNotNull(json, 'offset', offset);
+    _setIfNotNull(json, 'count', count);
+    _setIfNotNull(json, 'name', name);
+    _setIfNotNull(json, 'typeClass', typeClass?.toJson());
+    _setIfNotNull(json, 'parameterizedClass', parameterizedClass?.toJson());
+    _setIfNotNull(json, 'fields', fields?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(
+        json, 'elements', elements?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(
+        json, 'associations', associations?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(json, 'bytes', bytes);
+    _setIfNotNull(json, 'closureFunction', closureFunction?.toJson());
+    _setIfNotNull(json, 'closureContext', closureContext?.toJson());
+    _setIfNotNull(json, 'mirrorReferent', mirrorReferent?.toJson());
+    _setIfNotNull(json, 'pattern', pattern);
+    _setIfNotNull(json, 'isCaseSensitive', isCaseSensitive);
+    _setIfNotNull(json, 'isMultiLine', isMultiLine);
+    _setIfNotNull(json, 'propertyKey', propertyKey?.toJson());
+    _setIfNotNull(json, 'propertyValue', propertyValue?.toJson());
+    _setIfNotNull(json, 'typeArguments', typeArguments?.toJson());
+    _setIfNotNull(json, 'parameterIndex', parameterIndex);
+    _setIfNotNull(json, 'targetType', targetType?.toJson());
+    _setIfNotNull(json, 'bound', bound?.toJson());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Instance && id == other.id;
+
+  String toString() => '[Instance ' //
+      'type: ${type}, id: ${id}, kind: ${kind}, classRef: ${classRef}]';
+}
+
+/// `IsolateRef` is a reference to an `Isolate` object.
+class IsolateRef extends Response {
+  static IsolateRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new IsolateRef._fromJson(json);
+
+  /// The id which is passed to the getIsolate RPC to load this isolate.
+  String id;
+
+  /// A numeric id for this isolate, represented as a string. Unique.
+  String number;
+
+  /// A name identifying this isolate. Not guaranteed to be unique.
+  String name;
+
+  IsolateRef();
+
+  IsolateRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    id = json['id'];
+    number = json['number'];
+    name = json['name'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = '@Isolate';
+    json.addAll({
+      'id': id,
+      'number': number,
+      'name': name,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is IsolateRef && id == other.id;
+
+  String toString() =>
+      '[IsolateRef type: ${type}, id: ${id}, number: ${number}, name: ${name}]';
+}
+
+/// An `Isolate` object provides information about one isolate in the VM.
+class Isolate extends Response {
+  static Isolate parse(Map<String, dynamic> json) =>
+      json == null ? null : new Isolate._fromJson(json);
+
+  /// The id which is passed to the getIsolate RPC to reload this isolate.
+  String id;
+
+  /// A numeric id for this isolate, represented as a string. Unique.
+  String number;
+
+  /// A name identifying this isolate. Not guaranteed to be unique.
+  String name;
+
+  /// The time that the VM started in milliseconds since the epoch.
+  ///
+  /// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
+  int startTime;
+
+  /// Is the isolate in a runnable state?
+  bool runnable;
+
+  /// The number of live ports for this isolate.
+  int livePorts;
+
+  /// Will this isolate pause when exiting?
+  bool pauseOnExit;
+
+  /// The last pause event delivered to the isolate. If the isolate is running,
+  /// this will be a resume event.
+  Event pauseEvent;
+
+  /// The root library for this isolate.
+  ///
+  /// Guaranteed to be initialized when the IsolateRunnable event fires.
+  @optional
+  LibraryRef rootLib;
+
+  /// A list of all libraries for this isolate.
+  ///
+  /// Guaranteed to be initialized when the IsolateRunnable event fires.
+  List<LibraryRef> libraries;
+
+  /// A list of all breakpoints for this isolate.
+  List<Breakpoint> breakpoints;
+
+  /// The error that is causing this isolate to exit, if applicable.
+  @optional
+  Error error;
+
+  /// The current pause on exception mode for this isolate.
+  /*ExceptionPauseMode*/ String exceptionPauseMode;
+
+  /// The list of service extension RPCs that are registered for this isolate,
+  /// if any.
+  @optional
+  List<String> extensionRPCs;
+
+  Isolate();
+
+  Isolate._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    id = json['id'];
+    number = json['number'];
+    name = json['name'];
+    startTime = json['startTime'];
+    runnable = json['runnable'];
+    livePorts = json['livePorts'];
+    pauseOnExit = json['pauseOnExit'];
+    pauseEvent = createServiceObject(json['pauseEvent'], const ['Event']);
+    rootLib = createServiceObject(json['rootLib'], const ['LibraryRef']);
+    libraries = new List<LibraryRef>.from(
+        createServiceObject(json['libraries'], const ['LibraryRef']));
+    breakpoints = new List<Breakpoint>.from(
+        createServiceObject(json['breakpoints'], const ['Breakpoint']));
+    error = createServiceObject(json['error'], const ['Error']);
+    exceptionPauseMode = json['exceptionPauseMode'];
+    extensionRPCs = json['extensionRPCs'] == null
+        ? null
+        : new List<String>.from(json['extensionRPCs']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Isolate';
+    json.addAll({
+      'id': id,
+      'number': number,
+      'name': name,
+      'startTime': startTime,
+      'runnable': runnable,
+      'livePorts': livePorts,
+      'pauseOnExit': pauseOnExit,
+      'pauseEvent': pauseEvent.toJson(),
+      'libraries': libraries.map((f) => f.toJson()).toList(),
+      'breakpoints': breakpoints.map((f) => f.toJson()).toList(),
+      'exceptionPauseMode': exceptionPauseMode,
+    });
+    _setIfNotNull(json, 'rootLib', rootLib?.toJson());
+    _setIfNotNull(json, 'error', error?.toJson());
+    _setIfNotNull(
+        json, 'extensionRPCs', extensionRPCs?.map((f) => f)?.toList());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Isolate && id == other.id;
+
+  String toString() => '[Isolate]';
+}
+
+/// See [getInboundReferences].
+class InboundReferences extends Response {
+  static InboundReferences parse(Map<String, dynamic> json) =>
+      json == null ? null : new InboundReferences._fromJson(json);
+
+  /// An array of inbound references to an object.
+  List<InboundReference> references;
+
+  InboundReferences();
+
+  InboundReferences._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json) {
+    references = new List<InboundReference>.from(
+        createServiceObject(json['references'], const ['InboundReference']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'InboundReferences';
+    json.addAll({
+      'references': references.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() =>
+      '[InboundReferences type: ${type}, references: ${references}]';
+}
+
+/// See [getInboundReferences].
+class InboundReference {
+  static InboundReference parse(Map<String, dynamic> json) =>
+      json == null ? null : new InboundReference._fromJson(json);
+
+  /// The object holding the inbound reference.
+  ObjRef source;
+
+  /// If source is a List, parentListIndex is the index of the inbound
+  /// reference.
+  @optional
+  int parentListIndex;
+
+  /// If source is a field of an object, parentField is the field containing the
+  /// inbound reference.
+  @optional
+  FieldRef parentField;
+
+  InboundReference();
+
+  InboundReference._fromJson(Map<String, dynamic> json) {
+    source = createServiceObject(json['source'], const ['ObjRef']);
+    parentListIndex = json['parentListIndex'];
+    parentField = createServiceObject(json['parentField'], const ['FieldRef']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'source': source.toJson(),
+    });
+    _setIfNotNull(json, 'parentListIndex', parentListIndex);
+    _setIfNotNull(json, 'parentField', parentField?.toJson());
+    return json;
+  }
+
+  String toString() => '[InboundReference source: ${source}]';
+}
+
+/// See [getInstances].
+class InstanceSet extends Response {
+  static InstanceSet parse(Map<String, dynamic> json) =>
+      json == null ? null : new InstanceSet._fromJson(json);
+
+  /// The number of instances of the requested type currently allocated.
+  int totalCount;
+
+  /// An array of instances of the requested type.
+  List<ObjRef> instances;
+
+  InstanceSet();
+
+  InstanceSet._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    totalCount = json['totalCount'];
+    instances = new List<ObjRef>.from(createServiceObject(
+        json['instances'] ?? json['samples'], const ['ObjRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'InstanceSet';
+    json.addAll({
+      'totalCount': totalCount,
+      'instances': instances.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[InstanceSet ' //
+      'type: ${type}, totalCount: ${totalCount}, instances: ${instances}]';
+}
+
+/// `LibraryRef` is a reference to a `Library`.
+class LibraryRef extends ObjRef {
+  static LibraryRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new LibraryRef._fromJson(json);
+
+  /// The name of this library.
+  String name;
+
+  /// The uri of this library.
+  String uri;
+
+  LibraryRef();
+
+  LibraryRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    uri = json['uri'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Library';
+    json.addAll({
+      'name': name,
+      'uri': uri,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is LibraryRef && id == other.id;
+
+  String toString() =>
+      '[LibraryRef type: ${type}, id: ${id}, name: ${name}, uri: ${uri}]';
+}
+
+/// A `Library` provides information about a Dart language library.
+///
+/// See [setLibraryDebuggable].
+class Library extends Obj {
+  static Library parse(Map<String, dynamic> json) =>
+      json == null ? null : new Library._fromJson(json);
+
+  /// The name of this library.
+  String name;
+
+  /// The uri of this library.
+  String uri;
+
+  /// Is this library debuggable? Default true.
+  bool debuggable;
+
+  /// A list of the imports for this library.
+  List<LibraryDependency> dependencies;
+
+  /// A list of the scripts which constitute this library.
+  List<ScriptRef> scripts;
+
+  /// A list of the top-level variables in this library.
+  List<FieldRef> variables;
+
+  /// A list of the top-level functions in this library.
+  List<FuncRef> functions;
+
+  /// A list of all classes in this library.
+  List<ClassRef> classes;
+
+  Library();
+
+  Library._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    uri = json['uri'];
+    debuggable = json['debuggable'];
+    dependencies = new List<LibraryDependency>.from(
+        _createSpecificObject(json['dependencies'], LibraryDependency.parse));
+    scripts = new List<ScriptRef>.from(
+        createServiceObject(json['scripts'], const ['ScriptRef']));
+    variables = new List<FieldRef>.from(
+        createServiceObject(json['variables'], const ['FieldRef']));
+    functions = new List<FuncRef>.from(
+        createServiceObject(json['functions'], const ['FuncRef']));
+    classes = new List<ClassRef>.from(
+        createServiceObject(json['classes'], const ['ClassRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Library';
+    json.addAll({
+      'name': name,
+      'uri': uri,
+      'debuggable': debuggable,
+      'dependencies': dependencies.map((f) => f.toJson()).toList(),
+      'scripts': scripts.map((f) => f.toJson()).toList(),
+      'variables': variables.map((f) => f.toJson()).toList(),
+      'functions': functions.map((f) => f.toJson()).toList(),
+      'classes': classes.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Library && id == other.id;
+
+  String toString() => '[Library]';
+}
+
+/// A `LibraryDependency` provides information about an import or export.
+class LibraryDependency {
+  static LibraryDependency parse(Map<String, dynamic> json) =>
+      json == null ? null : new LibraryDependency._fromJson(json);
+
+  /// Is this dependency an import (rather than an export)?
+  bool isImport;
+
+  /// Is this dependency deferred?
+  bool isDeferred;
+
+  /// The prefix of an 'as' import, or null.
+  String prefix;
+
+  /// The library being imported or exported.
+  LibraryRef target;
+
+  LibraryDependency();
+
+  LibraryDependency._fromJson(Map<String, dynamic> json) {
+    isImport = json['isImport'];
+    isDeferred = json['isDeferred'];
+    prefix = json['prefix'];
+    target = createServiceObject(json['target'], const ['LibraryRef']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'isImport': isImport,
+      'isDeferred': isDeferred,
+      'prefix': prefix,
+      'target': target.toJson(),
+    });
+    return json;
+  }
+
+  String toString() => '[LibraryDependency ' //
+      'isImport: ${isImport}, isDeferred: ${isDeferred}, prefix: ${prefix}, ' //
+      'target: ${target}]';
+}
+
+class LogRecord extends Response {
+  static LogRecord parse(Map<String, dynamic> json) =>
+      json == null ? null : new LogRecord._fromJson(json);
+
+  /// The log message.
+  InstanceRef message;
+
+  /// The timestamp.
+  int time;
+
+  /// The severity level (a value between 0 and 2000).
+  ///
+  /// See the package:logging `Level` class for an overview of the possible
+  /// values.
+  int level;
+
+  /// A monotonically increasing sequence number.
+  int sequenceNumber;
+
+  /// The name of the source of the log message.
+  InstanceRef loggerName;
+
+  /// The zone where the log was emitted.
+  InstanceRef zone;
+
+  /// An error object associated with this log event.
+  InstanceRef error;
+
+  /// A stack trace associated with this log event.
+  InstanceRef stackTrace;
+
+  LogRecord();
+
+  LogRecord._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    message = createServiceObject(json['message'], const ['InstanceRef']);
+    time = json['time'];
+    level = json['level'];
+    sequenceNumber = json['sequenceNumber'];
+    loggerName = createServiceObject(json['loggerName'], const ['InstanceRef']);
+    zone = createServiceObject(json['zone'], const ['InstanceRef']);
+    error = createServiceObject(json['error'], const ['InstanceRef']);
+    stackTrace = createServiceObject(json['stackTrace'], const ['InstanceRef']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'LogRecord';
+    json.addAll({
+      'message': message.toJson(),
+      'time': time,
+      'level': level,
+      'sequenceNumber': sequenceNumber,
+      'loggerName': loggerName.toJson(),
+      'zone': zone.toJson(),
+      'error': error.toJson(),
+      'stackTrace': stackTrace.toJson(),
+    });
+    return json;
+  }
+
+  String toString() => '[LogRecord]';
+}
+
+class MapAssociation {
+  static MapAssociation parse(Map<String, dynamic> json) =>
+      json == null ? null : new MapAssociation._fromJson(json);
+
+  /// [key] can be one of [InstanceRef] or [Sentinel].
+  dynamic key;
+
+  /// [value] can be one of [InstanceRef] or [Sentinel].
+  dynamic value;
+
+  MapAssociation();
+
+  MapAssociation._fromJson(Map<String, dynamic> json) {
+    key = createServiceObject(json['key'], const ['InstanceRef', 'Sentinel']);
+    value =
+        createServiceObject(json['value'], const ['InstanceRef', 'Sentinel']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'key': key.toJson(),
+      'value': value.toJson(),
+    });
+    return json;
+  }
+
+  String toString() => '[MapAssociation key: ${key}, value: ${value}]';
+}
+
+/// A `MemoryUsage` object provides heap usage information for a specific
+/// isolate at a given point in time.
+class MemoryUsage extends Response {
+  static MemoryUsage parse(Map<String, dynamic> json) =>
+      json == null ? null : new MemoryUsage._fromJson(json);
+
+  /// The amount of non-Dart memory that is retained by Dart objects. For
+  /// example, memory associated with Dart objects through APIs such as
+  /// Dart_NewWeakPersistentHandle and Dart_NewExternalTypedData.  This usage is
+  /// only as accurate as the values supplied to these APIs from the VM embedder
+  /// or native extensions. This external memory applies GC pressure, but is
+  /// separate from heapUsage and heapCapacity.
+  int externalUsage;
+
+  /// The total capacity of the heap in bytes. This is the amount of memory used
+  /// by the Dart heap from the perspective of the operating system.
+  int heapCapacity;
+
+  /// The current heap memory usage in bytes. Heap usage is always less than or
+  /// equal to the heap capacity.
+  int heapUsage;
+
+  MemoryUsage();
+
+  MemoryUsage._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    externalUsage = json['externalUsage'];
+    heapCapacity = json['heapCapacity'];
+    heapUsage = json['heapUsage'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'MemoryUsage';
+    json.addAll({
+      'externalUsage': externalUsage,
+      'heapCapacity': heapCapacity,
+      'heapUsage': heapUsage,
+    });
+    return json;
+  }
+
+  String toString() => '[MemoryUsage ' //
+      'type: ${type}, externalUsage: ${externalUsage}, heapCapacity: ${heapCapacity}, ' //
+      'heapUsage: ${heapUsage}]';
+}
+
+/// A `Message` provides information about a pending isolate message and the
+/// function that will be invoked to handle it.
+class Message extends Response {
+  static Message parse(Map<String, dynamic> json) =>
+      json == null ? null : new Message._fromJson(json);
+
+  /// The index in the isolate's message queue. The 0th message being the next
+  /// message to be processed.
+  int index;
+
+  /// An advisory name describing this message.
+  String name;
+
+  /// An instance id for the decoded message. This id can be passed to other
+  /// RPCs, for example, getObject or evaluate.
+  String messageObjectId;
+
+  /// The size (bytes) of the encoded message.
+  int size;
+
+  /// A reference to the function that will be invoked to handle this message.
+  @optional
+  FuncRef handler;
+
+  /// The source location of handler.
+  @optional
+  SourceLocation location;
+
+  Message();
+
+  Message._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    index = json['index'];
+    name = json['name'];
+    messageObjectId = json['messageObjectId'];
+    size = json['size'];
+    handler = createServiceObject(json['handler'], const ['FuncRef']);
+    location = createServiceObject(json['location'], const ['SourceLocation']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Message';
+    json.addAll({
+      'index': index,
+      'name': name,
+      'messageObjectId': messageObjectId,
+      'size': size,
+    });
+    _setIfNotNull(json, 'handler', handler?.toJson());
+    _setIfNotNull(json, 'location', location?.toJson());
+    return json;
+  }
+
+  String toString() => '[Message ' //
+      'type: ${type}, index: ${index}, name: ${name}, messageObjectId: ${messageObjectId}, ' //
+      'size: ${size}]';
+}
+
+/// `NullValRef` is a reference to an a `NullVal`.
+class NullValRef extends InstanceRef {
+  static NullValRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new NullValRef._fromJson(json);
+
+  /// Always 'null'.
+  @override
+  String valueAsString;
+
+  NullValRef();
+
+  NullValRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    valueAsString = json['valueAsString'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Null';
+    json.addAll({
+      'valueAsString': valueAsString,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is NullValRef && id == other.id;
+
+  String toString() => '[NullValRef ' //
+      'type: ${type}, id: ${id}, kind: ${kind}, classRef: ${classRef}, ' //
+      'valueAsString: ${valueAsString}]';
+}
+
+/// A `NullVal` object represents the Dart language value null.
+class NullVal extends Instance {
+  static NullVal parse(Map<String, dynamic> json) =>
+      json == null ? null : new NullVal._fromJson(json);
+
+  /// Always 'null'.
+  @override
+  String valueAsString;
+
+  NullVal();
+
+  NullVal._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    valueAsString = json['valueAsString'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Null';
+    json.addAll({
+      'valueAsString': valueAsString,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is NullVal && id == other.id;
+
+  String toString() => '[NullVal ' //
+      'type: ${type}, id: ${id}, kind: ${kind}, classRef: ${classRef}, ' //
+      'valueAsString: ${valueAsString}]';
+}
+
+/// `ObjRef` is a reference to a `Obj`.
+class ObjRef extends Response {
+  static ObjRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new ObjRef._fromJson(json);
+
+  /// A unique identifier for an Object. Passed to the getObject RPC to load
+  /// this Object.
+  String id;
+
+  /// Provided and set to true if the id of an Object is fixed. If true, the id
+  /// of an Object is guaranteed not to change or expire. The object may,
+  /// however, still be _Collected_.
+  @optional
+  bool fixedId;
+
+  ObjRef();
+
+  ObjRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    id = json['id'];
+    fixedId = json['fixedId'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = '@Object';
+    json.addAll({
+      'id': id,
+    });
+    _setIfNotNull(json, 'fixedId', fixedId);
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is ObjRef && id == other.id;
+
+  String toString() => '[ObjRef type: ${type}, id: ${id}]';
+}
+
+/// An `Obj` is a persistent object that is owned by some isolate.
+class Obj extends Response {
+  static Obj parse(Map<String, dynamic> json) =>
+      json == null ? null : new Obj._fromJson(json);
+
+  /// A unique identifier for an Object. Passed to the getObject RPC to reload
+  /// this Object.
+  ///
+  /// Some objects may get a new id when they are reloaded.
+  String id;
+
+  /// Provided and set to true if the id of an Object is fixed. If true, the id
+  /// of an Object is guaranteed not to change or expire. The object may,
+  /// however, still be _Collected_.
+  @optional
+  bool fixedId;
+
+  /// If an object is allocated in the Dart heap, it will have a corresponding
+  /// class object.
+  ///
+  /// The class of a non-instance is not a Dart class, but is instead an
+  /// internal vm object.
+  ///
+  /// Moving an Object into or out of the heap is considered a backwards
+  /// compatible change for types other than Instance.
+  @optional
+  ClassRef classRef;
+
+  /// The size of this object in the heap.
+  ///
+  /// If an object is not heap-allocated, then this field is omitted.
+  ///
+  /// Note that the size can be zero for some objects. In the current VM
+  /// implementation, this occurs for small integers, which are stored entirely
+  /// within their object pointers.
+  @optional
+  int size;
+
+  Obj();
+
+  Obj._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    id = json['id'];
+    fixedId = json['fixedId'];
+    classRef = createServiceObject(json['class'], const ['ClassRef']);
+    size = json['size'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Object';
+    json.addAll({
+      'id': id,
+    });
+    _setIfNotNull(json, 'fixedId', fixedId);
+    _setIfNotNull(json, 'class', classRef?.toJson());
+    _setIfNotNull(json, 'size', size);
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Obj && id == other.id;
+
+  String toString() => '[Obj type: ${type}, id: ${id}]';
+}
+
+class ReloadReport extends Response {
+  static ReloadReport parse(Map<String, dynamic> json) =>
+      json == null ? null : new ReloadReport._fromJson(json);
+
+  /// Did the reload succeed or fail?
+  bool success;
+
+  ReloadReport();
+
+  ReloadReport._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    success = json['success'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'ReloadReport';
+    json.addAll({
+      'success': success,
+    });
+    return json;
+  }
+
+  String toString() => '[ReloadReport type: ${type}, success: ${success}]';
+}
+
+/// See [RetainingPath].
+class RetainingObject {
+  static RetainingObject parse(Map<String, dynamic> json) =>
+      json == null ? null : new RetainingObject._fromJson(json);
+
+  /// An object that is part of a retaining path.
+  ObjRef value;
+
+  /// The offset of the retaining object in a containing list.
+  @optional
+  int parentListIndex;
+
+  /// The key mapping to the retaining object in a containing map.
+  @optional
+  ObjRef parentMapKey;
+
+  /// The name of the field containing the retaining object within an object.
+  @optional
+  String parentField;
+
+  RetainingObject();
+
+  RetainingObject._fromJson(Map<String, dynamic> json) {
+    value = createServiceObject(json['value'], const ['ObjRef']);
+    parentListIndex = json['parentListIndex'];
+    parentMapKey = createServiceObject(json['parentMapKey'], const ['ObjRef']);
+    parentField = json['parentField'];
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'value': value.toJson(),
+    });
+    _setIfNotNull(json, 'parentListIndex', parentListIndex);
+    _setIfNotNull(json, 'parentMapKey', parentMapKey?.toJson());
+    _setIfNotNull(json, 'parentField', parentField);
+    return json;
+  }
+
+  String toString() => '[RetainingObject value: ${value}]';
+}
+
+/// See [getRetainingPath].
+class RetainingPath extends Response {
+  static RetainingPath parse(Map<String, dynamic> json) =>
+      json == null ? null : new RetainingPath._fromJson(json);
+
+  /// The length of the retaining path.
+  int length;
+
+  /// The type of GC root which is holding a reference to the specified object.
+  /// Possible values include:  * class table  * local handle  * persistent
+  /// handle  * stack  * user global  * weak persistent handle  * unknown
+  String gcRootType;
+
+  /// The chain of objects which make up the retaining path.
+  List<RetainingObject> elements;
+
+  RetainingPath();
+
+  RetainingPath._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    length = json['length'];
+    gcRootType = json['gcRootType'];
+    elements = new List<RetainingObject>.from(
+        createServiceObject(json['elements'], const ['RetainingObject']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'RetainingPath';
+    json.addAll({
+      'length': length,
+      'gcRootType': gcRootType,
+      'elements': elements.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[RetainingPath ' //
+      'type: ${type}, length: ${length}, gcRootType: ${gcRootType}, ' //
+      'elements: ${elements}]';
+}
+
+/// Every non-error response returned by the Service Protocol extends
+/// `Response`. By using the `type` property, the client can determine which
+/// [type] of response has been provided.
+class Response {
+  static Response parse(Map<String, dynamic> json) =>
+      json == null ? null : new Response._fromJson(json);
+
+  Map<String, dynamic> json;
+
+  /// Every response returned by the VM Service has the type property. This
+  /// allows the client distinguish between different kinds of responses.
+  String type;
+
+  Response();
+
+  Response._fromJson(this.json) {
+    type = json['type'];
+  }
+
+  Map<String, dynamic> toJson() {
+    var result = json == null ? <String, dynamic>{} : Map.of(json);
+    result['type'] = type ?? 'Response';
+    return result;
+  }
+
+  String toString() => '[Response type: ${type}]';
+}
+
+/// A `Sentinel` is used to indicate that the normal response is not available.
+///
+/// We use a `Sentinel` instead of an [error] for these cases because they do
+/// not represent a problematic condition. They are normal.
+class Sentinel extends Response {
+  static Sentinel parse(Map<String, dynamic> json) =>
+      json == null ? null : new Sentinel._fromJson(json);
+
+  /// What kind of sentinel is this?
+  /*SentinelKind*/ String kind;
+
+  /// A reasonable string representation of this sentinel.
+  String valueAsString;
+
+  Sentinel();
+
+  Sentinel._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    kind = json['kind'];
+    valueAsString = json['valueAsString'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Sentinel';
+    json.addAll({
+      'kind': kind,
+      'valueAsString': valueAsString,
+    });
+    return json;
+  }
+
+  String toString() => '[Sentinel ' //
+      'type: ${type}, kind: ${kind}, valueAsString: ${valueAsString}]';
+}
+
+/// `ScriptRef` is a reference to a `Script`.
+class ScriptRef extends ObjRef {
+  static ScriptRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new ScriptRef._fromJson(json);
+
+  /// The uri from which this script was loaded.
+  String uri;
+
+  ScriptRef();
+
+  ScriptRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    uri = json['uri'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@Script';
+    json.addAll({
+      'uri': uri,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is ScriptRef && id == other.id;
+
+  String toString() => '[ScriptRef type: ${type}, id: ${id}, uri: ${uri}]';
+}
+
+/// A `Script` provides information about a Dart language script.
+///
+/// The `tokenPosTable` is an array of int arrays. Each subarray consists of a
+/// line number followed by `(tokenPos, columnNumber)` pairs:
+///
+/// ```
+/// [
+/// ```lineNumber, (tokenPos, columnNumber)*]
+/// ```
+///
+/// The `tokenPos` is an arbitrary integer value that is used to represent a
+/// location in the source code. A `tokenPos` value is not meaningful in itself
+/// and code should not rely on the exact values returned.
+///
+/// For example, a `tokenPosTable` with the value...
+///
+/// ```
+/// [
+/// ```[
+/// ```1, 100, 5, 101, 8],[
+/// ```2, 102, 7]]
+/// ```
+///
+/// ...encodes the mapping:
+///
+/// tokenPos | line | column
+/// -------- | ---- | ------
+/// 100 | 1 | 5
+/// 101 | 1 | 8
+/// 102 | 2 | 7
+class Script extends Obj {
+  static Script parse(Map<String, dynamic> json) =>
+      json == null ? null : new Script._fromJson(json);
+
+  /// The uri from which this script was loaded.
+  String uri;
+
+  /// The library which owns this script.
+  LibraryRef library;
+
+  @optional
+  int lineOffset;
+
+  @optional
+  int columnOffset;
+
+  /// The source code for this script. This can be null for certain built-in
+  /// scripts.
+  @optional
+  String source;
+
+  /// A table encoding a mapping from token position to line and column. This
+  /// field is null if sources aren't available.
+  @optional
+  List<List<int>> tokenPosTable;
+
+  Script();
+
+  Script._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    uri = json['uri'];
+    library = createServiceObject(json['library'], const ['LibraryRef']);
+    lineOffset = json['lineOffset'];
+    columnOffset = json['columnOffset'];
+    source = json['source'];
+    tokenPosTable = json['tokenPosTable'] == null
+        ? null
+        : new List<List<int>>.from(json['tokenPosTable']
+            .map((dynamic list) => new List<int>.from(list)));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'Script';
+    json.addAll({
+      'uri': uri,
+      'library': library.toJson(),
+    });
+    _setIfNotNull(json, 'lineOffset', lineOffset);
+    _setIfNotNull(json, 'columnOffset', columnOffset);
+    _setIfNotNull(json, 'source', source);
+    _setIfNotNull(json, 'tokenPosTable',
+        tokenPosTable?.map((f) => f?.toList())?.toList());
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is Script && id == other.id;
+
+  String toString() =>
+      '[Script type: ${type}, id: ${id}, uri: ${uri}, library: ${library}]';
+}
+
+class ScriptList extends Response {
+  static ScriptList parse(Map<String, dynamic> json) =>
+      json == null ? null : new ScriptList._fromJson(json);
+
+  List<ScriptRef> scripts;
+
+  ScriptList();
+
+  ScriptList._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    scripts = new List<ScriptRef>.from(
+        createServiceObject(json['scripts'], const ['ScriptRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'ScriptList';
+    json.addAll({
+      'scripts': scripts.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[ScriptList type: ${type}, scripts: ${scripts}]';
+}
+
+/// The `SourceLocation` class is used to designate a position or range in some
+/// script.
+class SourceLocation extends Response {
+  static SourceLocation parse(Map<String, dynamic> json) =>
+      json == null ? null : new SourceLocation._fromJson(json);
+
+  /// The script containing the source location.
+  ScriptRef script;
+
+  /// The first token of the location.
+  int tokenPos;
+
+  /// The last token of the location if this is a range.
+  @optional
+  int endTokenPos;
+
+  SourceLocation();
+
+  SourceLocation._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    script = createServiceObject(json['script'], const ['ScriptRef']);
+    tokenPos = json['tokenPos'];
+    endTokenPos = json['endTokenPos'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'SourceLocation';
+    json.addAll({
+      'script': script.toJson(),
+      'tokenPos': tokenPos,
+    });
+    _setIfNotNull(json, 'endTokenPos', endTokenPos);
+    return json;
+  }
+
+  String toString() =>
+      '[SourceLocation type: ${type}, script: ${script}, tokenPos: ${tokenPos}]';
+}
+
+/// The `SourceReport` class represents a set of reports tied to source
+/// locations in an isolate.
+class SourceReport extends Response {
+  static SourceReport parse(Map<String, dynamic> json) =>
+      json == null ? null : new SourceReport._fromJson(json);
+
+  /// A list of ranges in the program source.  These ranges correspond to ranges
+  /// of executable code in the user's program (functions, methods,
+  /// constructors, etc.)
+  ///
+  /// Note that ranges may nest in other ranges, in the case of nested
+  /// functions.
+  ///
+  /// Note that ranges may be duplicated, in the case of mixins.
+  List<SourceReportRange> ranges;
+
+  /// A list of scripts, referenced by index in the report's ranges.
+  List<ScriptRef> scripts;
+
+  SourceReport();
+
+  SourceReport._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    ranges = new List<SourceReportRange>.from(
+        _createSpecificObject(json['ranges'], SourceReportRange.parse));
+    scripts = new List<ScriptRef>.from(
+        createServiceObject(json['scripts'], const ['ScriptRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'SourceReport';
+    json.addAll({
+      'ranges': ranges.map((f) => f.toJson()).toList(),
+      'scripts': scripts.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() =>
+      '[SourceReport type: ${type}, ranges: ${ranges}, scripts: ${scripts}]';
+}
+
+/// The `SourceReportCoverage` class represents coverage information for one
+/// [SourceReportRange].
+///
+/// Note that `SourceReportCoverage` does not extend [Response] and therefore
+/// will not contain a `type` property.
+class SourceReportCoverage {
+  static SourceReportCoverage parse(Map<String, dynamic> json) =>
+      json == null ? null : new SourceReportCoverage._fromJson(json);
+
+  /// A list of token positions in a SourceReportRange which have been executed.
+  /// The list is sorted.
+  List<int> hits;
+
+  /// A list of token positions in a SourceReportRange which have not been
+  /// executed.  The list is sorted.
+  List<int> misses;
+
+  SourceReportCoverage();
+
+  SourceReportCoverage._fromJson(Map<String, dynamic> json) {
+    hits = new List<int>.from(json['hits']);
+    misses = new List<int>.from(json['misses']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'hits': hits.map((f) => f).toList(),
+      'misses': misses.map((f) => f).toList(),
+    });
+    return json;
+  }
+
+  String toString() =>
+      '[SourceReportCoverage hits: ${hits}, misses: ${misses}]';
+}
+
+/// The `SourceReportRange` class represents a range of executable code
+/// (function, method, constructor, etc) in the running program. It is part of a
+/// [SourceReport].
+///
+/// Note that `SourceReportRange` does not extend [Response] and therefore will
+/// not contain a `type` property.
+class SourceReportRange {
+  static SourceReportRange parse(Map<String, dynamic> json) =>
+      json == null ? null : new SourceReportRange._fromJson(json);
+
+  /// An index into the script table of the SourceReport, indicating which
+  /// script contains this range of code.
+  int scriptIndex;
+
+  /// The token position at which this range begins.
+  int startPos;
+
+  /// The token position at which this range ends.  Inclusive.
+  int endPos;
+
+  /// Has this range been compiled by the Dart VM?
+  bool compiled;
+
+  /// The error while attempting to compile this range, if this report was
+  /// generated with forceCompile=true.
+  @optional
+  ErrorRef error;
+
+  /// Code coverage information for this range.  Provided only when the Coverage
+  /// report has been requested and the range has been compiled.
+  @optional
+  SourceReportCoverage coverage;
+
+  /// Possible breakpoint information for this range, represented as a sorted
+  /// list of token positions.  Provided only when the when the
+  /// PossibleBreakpoint report has been requested and the range has been
+  /// compiled.
+  @optional
+  List<int> possibleBreakpoints;
+
+  SourceReportRange();
+
+  SourceReportRange._fromJson(Map<String, dynamic> json) {
+    scriptIndex = json['scriptIndex'];
+    startPos = json['startPos'];
+    endPos = json['endPos'];
+    compiled = json['compiled'];
+    error = createServiceObject(json['error'], const ['ErrorRef']);
+    coverage =
+        _createSpecificObject(json['coverage'], SourceReportCoverage.parse);
+    possibleBreakpoints = json['possibleBreakpoints'] == null
+        ? null
+        : new List<int>.from(json['possibleBreakpoints']);
+  }
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json.addAll({
+      'scriptIndex': scriptIndex,
+      'startPos': startPos,
+      'endPos': endPos,
+      'compiled': compiled,
+    });
+    _setIfNotNull(json, 'error', error?.toJson());
+    _setIfNotNull(json, 'coverage', coverage?.toJson());
+    _setIfNotNull(json, 'possibleBreakpoints',
+        possibleBreakpoints?.map((f) => f)?.toList());
+    return json;
+  }
+
+  String toString() => '[SourceReportRange ' //
+      'scriptIndex: ${scriptIndex}, startPos: ${startPos}, endPos: ${endPos}, ' //
+      'compiled: ${compiled}]';
+}
+
+class Stack extends Response {
+  static Stack parse(Map<String, dynamic> json) =>
+      json == null ? null : new Stack._fromJson(json);
+
+  List<Frame> frames;
+
+  @optional
+  List<Frame> asyncCausalFrames;
+
+  @optional
+  List<Frame> awaiterFrames;
+
+  List<Message> messages;
+
+  Stack();
+
+  Stack._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    frames = new List<Frame>.from(
+        createServiceObject(json['frames'], const ['Frame']));
+    asyncCausalFrames = json['asyncCausalFrames'] == null
+        ? null
+        : new List<Frame>.from(
+            createServiceObject(json['asyncCausalFrames'], const ['Frame']));
+    awaiterFrames = json['awaiterFrames'] == null
+        ? null
+        : new List<Frame>.from(
+            createServiceObject(json['awaiterFrames'], const ['Frame']));
+    messages = new List<Message>.from(
+        createServiceObject(json['messages'], const ['Message']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Stack';
+    json.addAll({
+      'frames': frames.map((f) => f.toJson()).toList(),
+      'messages': messages.map((f) => f.toJson()).toList(),
+    });
+    _setIfNotNull(json, 'asyncCausalFrames',
+        asyncCausalFrames?.map((f) => f?.toJson())?.toList());
+    _setIfNotNull(json, 'awaiterFrames',
+        awaiterFrames?.map((f) => f?.toJson())?.toList());
+    return json;
+  }
+
+  String toString() =>
+      '[Stack type: ${type}, frames: ${frames}, messages: ${messages}]';
+}
+
+/// The `Success` type is used to indicate that an operation completed
+/// successfully.
+class Success extends Response {
+  static Success parse(Map<String, dynamic> json) =>
+      json == null ? null : new Success._fromJson(json);
+
+  Success();
+
+  Success._fromJson(Map<String, dynamic> json) : super._fromJson(json);
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Success';
+    return json;
+  }
+
+  String toString() => '[Success type: ${type}]';
+}
+
+class Timeline extends Response {
+  static Timeline parse(Map<String, dynamic> json) =>
+      json == null ? null : new Timeline._fromJson(json);
+
+  /// A list of timeline events.
+  List<TimelineEvent> traceEvents;
+
+  /// The start of the period of time in which traceEvents were collected.
+  int timeOriginMicros;
+
+  /// The duration of time covered by the timeline.
+  int timeExtentMicros;
+
+  Timeline();
+
+  Timeline._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    traceEvents = new List<TimelineEvent>.from(
+        createServiceObject(json['traceEvents'], const ['TimelineEvent']));
+    timeOriginMicros = json['timeOriginMicros'];
+    timeExtentMicros = json['timeExtentMicros'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Timeline';
+    json.addAll({
+      'traceEvents': traceEvents.map((f) => f.toJson()).toList(),
+      'timeOriginMicros': timeOriginMicros,
+      'timeExtentMicros': timeExtentMicros,
+    });
+    return json;
+  }
+
+  String toString() => '[Timeline ' //
+      'type: ${type}, traceEvents: ${traceEvents}, timeOriginMicros: ${timeOriginMicros}, ' //
+      'timeExtentMicros: ${timeExtentMicros}]';
+}
+
+/// An `TimelineEvent` is an arbitrary map that contains a [Trace Event Format]
+/// event.
+class TimelineEvent {
+  static TimelineEvent parse(Map<String, dynamic> json) =>
+      json == null ? null : new TimelineEvent._fromJson(json);
+
+  TimelineEvent();
+
+  TimelineEvent._fromJson(Map<String, dynamic> json);
+
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    return json;
+  }
+
+  String toString() => '[TimelineEvent ]';
+}
+
+class TimelineFlags extends Response {
+  static TimelineFlags parse(Map<String, dynamic> json) =>
+      json == null ? null : new TimelineFlags._fromJson(json);
+
+  /// The name of the recorder currently in use. Recorder types include, but are
+  /// not limited to: Callback, Endless, Fuchsia, Ring, Startup, and Systrace.
+  /// Set to "null" if no recorder is currently set.
+  String recorderName;
+
+  /// The list of all available timeline streams.
+  List<String> availableStreams;
+
+  /// The list of timeline streams that are currently enabled.
+  List<String> recordedStreams;
+
+  TimelineFlags();
+
+  TimelineFlags._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    recorderName = json['recorderName'];
+    availableStreams = new List<String>.from(json['availableStreams']);
+    recordedStreams = new List<String>.from(json['recordedStreams']);
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'TimelineFlags';
+    json.addAll({
+      'recorderName': recorderName,
+      'availableStreams': availableStreams.map((f) => f).toList(),
+      'recordedStreams': recordedStreams.map((f) => f).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[TimelineFlags ' //
+      'type: ${type}, recorderName: ${recorderName}, availableStreams: ${availableStreams}, ' //
+      'recordedStreams: ${recordedStreams}]';
+}
+
+class Timestamp extends Response {
+  static Timestamp parse(Map<String, dynamic> json) =>
+      json == null ? null : new Timestamp._fromJson(json);
+
+  /// A timestamp in microseconds since epoch.
+  int timestamp;
+
+  Timestamp();
+
+  Timestamp._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    timestamp = json['timestamp'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Timestamp';
+    json.addAll({
+      'timestamp': timestamp,
+    });
+    return json;
+  }
+
+  String toString() => '[Timestamp type: ${type}, timestamp: ${timestamp}]';
+}
+
+/// `TypeArgumentsRef` is a reference to a `TypeArguments` object.
+class TypeArgumentsRef extends ObjRef {
+  static TypeArgumentsRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new TypeArgumentsRef._fromJson(json);
+
+  /// A name for this type argument list.
+  String name;
+
+  TypeArgumentsRef();
+
+  TypeArgumentsRef._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json) {
+    name = json['name'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = '@TypeArguments';
+    json.addAll({
+      'name': name,
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is TypeArgumentsRef && id == other.id;
+
+  String toString() =>
+      '[TypeArgumentsRef type: ${type}, id: ${id}, name: ${name}]';
+}
+
+/// A `TypeArguments` object represents the type argument vector for some
+/// instantiated generic type.
+class TypeArguments extends Obj {
+  static TypeArguments parse(Map<String, dynamic> json) =>
+      json == null ? null : new TypeArguments._fromJson(json);
+
+  /// A name for this type argument list.
+  String name;
+
+  /// A list of types.
+  ///
+  /// The value will always be one of the kinds: Type, TypeRef, TypeParameter,
+  /// BoundedType.
+  List<InstanceRef> types;
+
+  TypeArguments();
+
+  TypeArguments._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    types = new List<InstanceRef>.from(
+        createServiceObject(json['types'], const ['InstanceRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = super.toJson();
+    json['type'] = 'TypeArguments';
+    json.addAll({
+      'name': name,
+      'types': types.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  int get hashCode => id.hashCode;
+
+  operator ==(other) => other is TypeArguments && id == other.id;
+
+  String toString() =>
+      '[TypeArguments type: ${type}, id: ${id}, name: ${name}, types: ${types}]';
+}
+
+/// The `UnresolvedSourceLocation` class is used to refer to an unresolved
+/// breakpoint location. As such, it is meant to approximate the final location
+/// of the breakpoint but it is not exact.
+///
+/// Either the `script` or the `scriptUri` field will be present.
+///
+/// Either the `tokenPos` or the `line` field will be present.
+///
+/// The `column` field will only be present when the breakpoint was specified
+/// with a specific column number.
+class UnresolvedSourceLocation extends Response {
+  static UnresolvedSourceLocation parse(Map<String, dynamic> json) =>
+      json == null ? null : new UnresolvedSourceLocation._fromJson(json);
+
+  /// The script containing the source location if the script has been loaded.
+  @optional
+  ScriptRef script;
+
+  /// The uri of the script containing the source location if the script has yet
+  /// to be loaded.
+  @optional
+  String scriptUri;
+
+  /// An approximate token position for the source location. This may change
+  /// when the location is resolved.
+  @optional
+  int tokenPos;
+
+  /// An approximate line number for the source location. This may change when
+  /// the location is resolved.
+  @optional
+  int line;
+
+  /// An approximate column number for the source location. This may change when
+  /// the location is resolved.
+  @optional
+  int column;
+
+  UnresolvedSourceLocation();
+
+  UnresolvedSourceLocation._fromJson(Map<String, dynamic> json)
+      : super._fromJson(json) {
+    script = createServiceObject(json['script'], const ['ScriptRef']);
+    scriptUri = json['scriptUri'];
+    tokenPos = json['tokenPos'];
+    line = json['line'];
+    column = json['column'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'UnresolvedSourceLocation';
+    _setIfNotNull(json, 'script', script?.toJson());
+    _setIfNotNull(json, 'scriptUri', scriptUri);
+    _setIfNotNull(json, 'tokenPos', tokenPos);
+    _setIfNotNull(json, 'line', line);
+    _setIfNotNull(json, 'column', column);
+    return json;
+  }
+
+  String toString() => '[UnresolvedSourceLocation type: ${type}]';
+}
+
+/// See [Versioning].
+class Version extends Response {
+  static Version parse(Map<String, dynamic> json) =>
+      json == null ? null : new Version._fromJson(json);
+
+  /// The major version number is incremented when the protocol is changed in a
+  /// potentially incompatible way.
+  int major;
+
+  /// The minor version number is incremented when the protocol is changed in a
+  /// backwards compatible way.
+  int minor;
+
+  Version();
+
+  Version._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    major = json['major'];
+    minor = json['minor'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'Version';
+    json.addAll({
+      'major': major,
+      'minor': minor,
+    });
+    return json;
+  }
+
+  String toString() =>
+      '[Version type: ${type}, major: ${major}, minor: ${minor}]';
+}
+
+/// `VMRef` is a reference to a `VM` object.
+class VMRef extends Response {
+  static VMRef parse(Map<String, dynamic> json) =>
+      json == null ? null : new VMRef._fromJson(json);
+
+  /// A name identifying this vm. Not guaranteed to be unique.
+  String name;
+
+  VMRef();
+
+  VMRef._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = '@VM';
+    json.addAll({
+      'name': name,
+    });
+    return json;
+  }
+
+  String toString() => '[VMRef type: ${type}, name: ${name}]';
+}
+
+class VM extends Response {
+  static VM parse(Map<String, dynamic> json) =>
+      json == null ? null : new VM._fromJson(json);
+
+  /// A name identifying this vm. Not guaranteed to be unique.
+  String name;
+
+  /// Word length on target architecture (e.g. 32, 64).
+  int architectureBits;
+
+  /// The CPU we are actually running on.
+  String hostCPU;
+
+  /// The operating system we are running on.
+  String operatingSystem;
+
+  /// The CPU we are generating code for.
+  String targetCPU;
+
+  /// The Dart VM version string.
+  String version;
+
+  /// The process id for the VM.
+  int pid;
+
+  /// The time that the VM started in milliseconds since the epoch.
+  ///
+  /// Suitable to pass to DateTime.fromMillisecondsSinceEpoch.
+  int startTime;
+
+  /// A list of isolates running in the VM.
+  List<IsolateRef> isolates;
+
+  VM();
+
+  VM._fromJson(Map<String, dynamic> json) : super._fromJson(json) {
+    name = json['name'];
+    architectureBits = json['architectureBits'];
+    hostCPU = json['hostCPU'];
+    operatingSystem = json['operatingSystem'];
+    targetCPU = json['targetCPU'];
+    version = json['version'];
+    pid = json['pid'];
+    startTime = json['startTime'];
+    isolates = new List<IsolateRef>.from(
+        createServiceObject(json['isolates'], const ['IsolateRef']));
+  }
+
+  @override
+  Map<String, dynamic> toJson() {
+    var json = <String, dynamic>{};
+    json['type'] = 'VM';
+    json.addAll({
+      'name': name,
+      'architectureBits': architectureBits,
+      'hostCPU': hostCPU,
+      'operatingSystem': operatingSystem,
+      'targetCPU': targetCPU,
+      'version': version,
+      'pid': pid,
+      'startTime': startTime,
+      'isolates': isolates.map((f) => f.toJson()).toList(),
+    });
+    return json;
+  }
+
+  String toString() => '[VM]';
+}
diff --git a/pkg/vm_service/lib/vm_service_io.dart b/pkg/vm_service/lib/vm_service_io.dart
new file mode 100644
index 0000000..f7aa745
--- /dev/null
+++ b/pkg/vm_service/lib/vm_service_io.dart
@@ -0,0 +1,26 @@
+// 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:async';
+import 'dart:io';
+
+import 'vm_service.dart';
+
+Future<VmService> vmServiceConnect(String host, int port, {Log log}) async {
+  WebSocket socket = await WebSocket.connect('ws://$host:$port/ws');
+  StreamController<String> controller = new StreamController();
+  socket.listen((data) => controller.add(data));
+  return new VmService(
+      controller.stream, (String message) => socket.add(message),
+      log: log, disposeHandler: () => socket.close());
+}
+
+Future<VmService> vmServiceConnectUri(String wsUri, {Log log}) async {
+  WebSocket socket = await WebSocket.connect(wsUri);
+  StreamController<String> controller = new StreamController();
+  socket.listen((data) => controller.add(data));
+  return new VmService(
+      controller.stream, (String message) => socket.add(message),
+      log: log, disposeHandler: () => socket.close());
+}
diff --git a/pkg/vm_service/pubspec.yaml b/pkg/vm_service/pubspec.yaml
new file mode 100644
index 0000000..b2e57b3
--- /dev/null
+++ b/pkg/vm_service/pubspec.yaml
@@ -0,0 +1,23 @@
+name: vm_service
+description: >-
+  A library to communicate with a service implementing the Dart VM
+  service protocol.
+version: 1.1.0
+
+author: Dart Team <misc@dartlang.org>
+homepage: https://github.com/dart-lang/sdk/tree/master/pkg/vm_service
+
+environment:
+  sdk: '>=2.0.0 <3.0.0'
+
+dependencies:
+  meta: ^1.0.2
+
+dev_dependencies:
+  async: ^2.0.0
+  markdown: ^2.0.0
+  mockito: ^4.0.0
+  path: ^1.0.0
+  pedantic: ^1.7.0
+  pub_semver: ^1.0.0
+  test: ^1.0.0
diff --git a/pkg/vm_service/test/server_test.dart b/pkg/vm_service/test/server_test.dart
new file mode 100644
index 0000000..189394c
--- /dev/null
+++ b/pkg/vm_service/test/server_test.dart
@@ -0,0 +1,443 @@
+// 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.
+
+@TestOn('vm')
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:async/async.dart';
+import 'package:mockito/mockito.dart';
+import 'package:pedantic/pedantic.dart';
+import 'package:test/test.dart';
+import 'package:vm_service/vm_service.dart';
+
+void main() {
+  MockVmService serviceMock;
+  StreamController<Map<String, Object>> requestsController;
+  StreamController<Map<String, Object>> responsesController;
+  ServiceExtensionRegistry serviceRegistry;
+
+  setUp(() {
+    serviceMock = MockVmService();
+    requestsController = StreamController<Map<String, Object>>();
+    responsesController = StreamController<Map<String, Object>>();
+    serviceRegistry = ServiceExtensionRegistry();
+    VmServerConnection(requestsController.stream, responsesController.sink,
+        serviceRegistry, serviceMock);
+  });
+
+  tearDown(() {
+    requestsController.close();
+    responsesController.close();
+  });
+
+  group('method delegation', () {
+    test('works for simple methods', () {
+      var request = rpcRequest("getVersion");
+      var version = Version()
+        ..major = 1
+        ..minor = 0;
+      when(serviceMock.getVersion()).thenAnswer((_) => Future.value(version));
+      expect(responsesController.stream, emits(rpcResponse(version)));
+      requestsController.add(request);
+    });
+
+    test('works for methods with parameters', () {
+      var isolate = Isolate()
+        ..id = '123'
+        ..number = '0'
+        ..startTime = 1
+        ..runnable = true
+        ..livePorts = 2
+        ..pauseOnExit = false
+        ..pauseEvent = (Event()
+          ..kind = EventKind.kResume
+          ..timestamp = 3)
+        ..libraries = []
+        ..breakpoints = [];
+      var request = rpcRequest("getIsolate", params: {'isolateId': isolate.id});
+      when(serviceMock.getIsolate(isolate.id))
+          .thenAnswer((Invocation invocation) {
+        expect(invocation.positionalArguments, equals([isolate.id]));
+        return Future.value(isolate);
+      });
+      expect(responsesController.stream, emits(rpcResponse(isolate)));
+      requestsController.add(request);
+    });
+
+    group('custom service extensions', () {
+      test('with no params or isolateId', () {
+        var extension = 'ext.cool';
+        var request = rpcRequest(extension, params: null);
+        var response = Response()..json = {"hello": "world"};
+        when(serviceMock.callServiceExtension(
+          extension,
+          isolateId: argThat(isNull, named: 'isolateId'),
+          args: argThat(isNull, named: 'args'),
+        )).thenAnswer((Invocation invocation) {
+          expect(invocation.namedArguments,
+              equals({Symbol('isolateId'): null, Symbol('args'): null}));
+          return Future.value(response);
+        });
+        expect(responsesController.stream, emits(rpcResponse(response)));
+        requestsController.add(request);
+      });
+
+      test('with isolateId and no other params', () {
+        var extension = 'ext.cool';
+        var request = rpcRequest(extension, params: {'isolateId': '1'});
+        var response = Response()..json = {"hello": "world"};
+        when(serviceMock.callServiceExtension(
+          extension,
+          isolateId: argThat(equals('1'), named: 'isolateId'),
+          args: argThat(equals({}), named: 'args'),
+        )).thenAnswer((Invocation invocation) {
+          expect(invocation.namedArguments,
+              equals({Symbol('isolateId'): '1', Symbol('args'): {}}));
+          return Future.value(response);
+        });
+        expect(responsesController.stream, emits(rpcResponse(response)));
+        requestsController.add(request);
+      });
+
+      test('with params and no isolateId', () {
+        var extension = 'ext.cool';
+        var params = {'cool': 'option'};
+        var request = rpcRequest(extension, params: params);
+        var response = Response()..json = {"hello": "world"};
+        when(serviceMock.callServiceExtension(
+          extension,
+          isolateId: argThat(isNull, named: 'isolateId'),
+          args: argThat(equals(params), named: 'args'),
+        )).thenAnswer((Invocation invocation) {
+          expect(invocation.namedArguments,
+              equals({Symbol('isolateId'): null, Symbol('args'): params}));
+          return Future.value(response);
+        });
+        expect(responsesController.stream, emits(rpcResponse(response)));
+        requestsController.add(request);
+      });
+
+      test('with params and isolateId', () {
+        var extension = 'ext.cool';
+        var params = {'cool': 'option'};
+        var request =
+            rpcRequest(extension, params: Map.of(params)..['isolateId'] = '1');
+        var response = Response()..json = {"hello": "world"};
+        when(serviceMock.callServiceExtension(
+          extension,
+          isolateId: argThat(equals("1"), named: 'isolateId'),
+          args: argThat(equals(params), named: 'args'),
+        )).thenAnswer((Invocation invocation) {
+          expect(invocation.namedArguments,
+              equals({Symbol('isolateId'): '1', Symbol('args'): params}));
+          return Future.value(response);
+        });
+        expect(responsesController.stream, emits(rpcResponse(response)));
+        requestsController.add(request);
+      });
+    });
+  });
+
+  group('error handling', () {
+    test('special cases RPCError instances', () {
+      var request = rpcRequest("getVersion");
+      var error =
+          RPCError('getVersion', 1234, 'custom message', {'custom': 'data'});
+      when(serviceMock.getVersion()).thenAnswer((_) => Future.error(error));
+      expect(responsesController.stream, emits(rpcErrorResponse(error)));
+      requestsController.add(request);
+    });
+
+    test('has a fallback for generic exceptions', () {
+      var request = rpcRequest("getVersion");
+      var error = UnimplementedError();
+      when(serviceMock.getVersion()).thenAnswer((_) => Future.error(error));
+      expect(
+          responsesController.stream.map((response) => '$response'),
+          emits(startsWith(
+              '{jsonrpc: 2.0, error: {code: -32603, message: UnimplementedError')));
+      requestsController.add(request);
+    });
+  });
+
+  group('streams', () {
+    test('can be listened to and canceled', () async {
+      var streamId = 'Isolate';
+      var responseQueue = StreamQueue(responsesController.stream);
+      StreamController<Event> eventController;
+      {
+        var request =
+            rpcRequest('streamListen', params: {'streamId': streamId});
+        var response = Success();
+        when(serviceMock.streamListen(streamId))
+            .thenAnswer((_) => Future.value(response));
+        requestsController.add(request);
+        await expect(responseQueue, emitsThrough(rpcResponse(response)));
+
+        eventController = serviceMock.streamControllers[streamId];
+
+        var events = [
+          Event()
+            ..kind = EventKind.kIsolateStart
+            ..timestamp = 0,
+          Event()
+            ..kind = EventKind.kIsolateExit
+            ..timestamp = 1,
+        ];
+        events.forEach(eventController.add);
+        await expect(
+            responseQueue,
+            emitsInOrder(
+                events.map((event) => streamNotifyResponse(streamId, event))));
+      }
+      {
+        var request =
+            rpcRequest('streamCancel', params: {'streamId': streamId});
+        var response = Success();
+        when(serviceMock.streamListen(streamId))
+            .thenAnswer((_) => Future.value(response));
+        requestsController.add(request);
+        await expect(responseQueue, emitsThrough(rpcResponse(response)));
+
+        var nextEvent = Event()
+          ..kind = EventKind.kIsolateReload
+          ..timestamp = 2;
+        eventController.add(nextEvent);
+        expect(responseQueue,
+            neverEmits(streamNotifyResponse(streamId, nextEvent)));
+
+        await pumpEventQueue();
+        await eventController.close();
+        await responsesController.close();
+      }
+    });
+    test("can't be listened to twice", () {
+      var streamId = 'Isolate';
+      var responseQueue = StreamQueue(responsesController.stream);
+      {
+        var request =
+            rpcRequest('streamListen', params: {'streamId': streamId});
+        var response = Success();
+        when(serviceMock.streamListen(streamId))
+            .thenAnswer((_) => Future.value(response));
+        requestsController.add(request);
+        expect(responseQueue, emitsThrough(rpcResponse(response)));
+      }
+      {
+        var request =
+            rpcRequest('streamListen', params: {'streamId': streamId});
+        var response = Success();
+        when(serviceMock.streamListen(streamId))
+            .thenAnswer((_) => Future.value(response));
+        requestsController.add(request);
+        expect(
+            responseQueue,
+            emitsThrough(rpcErrorResponse(
+                RPCError('streamSubcribe', 103, 'Stream already subscribed', {
+              'details': "The stream '$streamId' is already subscribed",
+            }))));
+      }
+    });
+
+    test("can't cancel a stream that isn't being listened to", () {
+      var streamId = 'Isolate';
+      var responseQueue = StreamQueue(responsesController.stream);
+
+      var request = rpcRequest('streamCancel', params: {'streamId': streamId});
+      var response = Success();
+      when(serviceMock.streamListen(streamId))
+          .thenAnswer((_) => Future.value(response));
+      requestsController.add(request);
+      expect(
+          responseQueue,
+          emitsThrough(rpcErrorResponse(
+              RPCError('streamCancel', 104, 'Stream not subscribed', {
+            'details': "The stream '$streamId' is not subscribed",
+          }))));
+    });
+
+    group('Service', () {
+      final serviceStream = 'Service';
+
+      test('gives register and unregister events', () async {
+        var serviceId = 'ext.test.service';
+        var serviceRegisteredEvent = streamNotifyResponse(
+            serviceStream,
+            Event()
+              ..kind = EventKind.kServiceRegistered
+              ..method = serviceId
+              ..service = serviceId);
+        var serviceUnRegisteredEvent = streamNotifyResponse(
+            serviceStream,
+            Event()
+              ..kind = EventKind.kServiceUnregistered
+              ..method = serviceId
+              ..service = serviceId);
+
+        requestsController.add(
+            rpcRequest('streamListen', params: {'streamId': serviceStream}));
+        requestsController
+            .add(rpcRequest('registerService', params: {'service': serviceId}));
+        await expect(
+            responsesController.stream, emitsThrough(serviceRegisteredEvent));
+
+        // Connect another client to get the previous register events and the
+        // unregister event.
+        var requestsController2 = StreamController<Map<String, Object>>();
+        var responsesController2 = StreamController<Map<String, Object>>();
+        addTearDown(() {
+          requestsController2.close();
+          responsesController2.close();
+        });
+
+        VmServerConnection(requestsController2.stream,
+            responsesController2.sink, serviceRegistry, null);
+
+        expect(
+            responsesController2.stream,
+            emitsThrough(emitsInOrder(
+                [serviceRegisteredEvent, serviceUnRegisteredEvent])));
+
+        // Should get the previously registered extension event, as well as
+        // the unregister event when the client disconnects.
+        requestsController2.add(
+            rpcRequest('streamListen', params: {'streamId': serviceStream}));
+        // Need to give the client a chance to subscribe.
+        await pumpEventQueue();
+        unawaited(requestsController.close());
+        // Give the old client a chance to shut down
+        await pumpEventQueue();
+
+        // Connect yet another client, it should get zero registration or
+        // unregistration events.
+        var requestsController3 = StreamController<Map<String, Object>>();
+        var responsesController3 = StreamController<Map<String, Object>>();
+
+        VmServerConnection(requestsController3.stream,
+            responsesController3.sink, serviceRegistry, null);
+        expect(
+            responsesController3.stream,
+            neverEmits(
+                anyOf(serviceRegisteredEvent, serviceUnRegisteredEvent)));
+        // Give it a chance to deliver events.
+        await pumpEventQueue();
+        // Disconnect the client so the test can shut down.
+        unawaited(requestsController3.close());
+        unawaited(responsesController3.close());
+      });
+    });
+  });
+
+  group('registerService', () {
+    test('can delegate requests between clients', () async {
+      var serviceId = 'ext.test.service';
+      var responseQueue = StreamQueue(responsesController.stream);
+
+      var clientInputController =
+          StreamController<Map<String, Object>>.broadcast();
+      var clientOutputController =
+          StreamController<Map<String, Object>>.broadcast();
+      var client = VmService(clientInputController.stream.map(jsonEncode),
+          (String message) => clientOutputController.add(jsonDecode(message)),
+          disposeHandler: () async {
+        await clientInputController.close();
+        await clientOutputController.close();
+      });
+
+      var clientConnection = VmServerConnection(clientOutputController.stream,
+          clientInputController.sink, serviceRegistry, serviceMock);
+
+      var requestParams = {'foo': 'bar'};
+      var expectedResponse = Response()..json = {'zap': 'zip'};
+      await client.registerService(serviceId, null);
+      // Duplicate registrations should fail.
+      expect(client.registerService(serviceId, null),
+          throwsA(const TypeMatcher<RPCError>()));
+
+      await client.registerServiceCallback(serviceId, (request) async {
+        expect(request, equals(requestParams));
+        return {'result': expectedResponse.toJson()};
+      });
+
+      var serviceRequest = rpcRequest(serviceId, params: requestParams);
+
+      requestsController.add(serviceRequest);
+      expect(await responseQueue.next, rpcResponse(expectedResponse));
+
+      // Kill the client that registered the handler, it should now fall back
+      // on `callServiceExtension`.
+      client.dispose();
+      // This should complete as well.
+      await clientConnection.done;
+
+      var mockResponse = Response()..json = {'mock': 'response'};
+      when(serviceMock.callServiceExtension(serviceId,
+              args: argThat(equals(requestParams), named: 'args'),
+              isolateId: argThat(isNull, named: 'isolateId')))
+          .thenAnswer((_) async => mockResponse);
+
+      requestsController.add(serviceRequest);
+      expect(await responseQueue.next, rpcResponse(mockResponse));
+    });
+  });
+}
+
+Map<String, Object> rpcRequest(String method,
+        {Map<String, Object> params = const {}, String id = "1"}) =>
+    {
+      "jsonrpc": "2.0",
+      "method": method,
+      "params": params,
+      "id": id,
+    };
+
+Map<String, Object> rpcResponse(Response response, {String id = "1"}) => {
+      'jsonrpc': '2.0',
+      'id': id,
+      'result': response.toJson(),
+    };
+
+Map<String, Object> rpcErrorResponse(Object error, {String id = "1"}) {
+  Map<String, Object> errorJson;
+  if (error is RPCError) {
+    errorJson = {
+      'code': error.code,
+      'message': error.message,
+    };
+    if (error.data != null) {
+      errorJson['data'] = error.data;
+    }
+  } else {
+    errorJson = {
+      'code': -32603,
+      'message': error.toString(),
+    };
+  }
+  return {
+    'jsonrpc': '2.0',
+    'error': errorJson,
+    'id': id,
+  };
+}
+
+Map<String, Object> streamNotifyResponse(String streamId, Event event) {
+  return {
+    'jsonrpc': '2.0',
+    'method': 'streamNotify',
+    'params': {
+      'streamId': '$streamId',
+      'event': event.toJson(),
+    },
+  };
+}
+
+class MockVmService extends Mock implements VmServiceInterface {
+  final streamControllers = <String, StreamController<Event>>{};
+
+  @override
+  Stream<Event> onEvent(String streamId) => streamControllers
+      .putIfAbsent(streamId, () => StreamController<Event>())
+      .stream;
+}
diff --git a/pkg/vm_service/test/utils_test.dart b/pkg/vm_service/test/utils_test.dart
new file mode 100644
index 0000000..b78789e
--- /dev/null
+++ b/pkg/vm_service/test/utils_test.dart
@@ -0,0 +1,35 @@
+// 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:vm_service/utils.dart';
+
+void main() {
+  test('convertToWebSocketUrl maps URIs correctly', () {
+    final testCases = {
+      'http://localhost:123/': 'ws://localhost:123/ws',
+      'https://localhost:123/': 'wss://localhost:123/ws',
+      'ws://localhost:123/': 'ws://localhost:123/ws',
+      'wss://localhost:123/': 'wss://localhost:123/ws',
+      'http://localhost:123/ABCDEF=/': 'ws://localhost:123/ABCDEF=/ws',
+      'https://localhost:123/ABCDEF=/': 'wss://localhost:123/ABCDEF=/ws',
+      'ws://localhost:123/ABCDEF=/': 'ws://localhost:123/ABCDEF=/ws',
+      'wss://localhost:123/ABCDEF=/': 'wss://localhost:123/ABCDEF=/ws',
+      'http://localhost:123': 'ws://localhost:123/ws',
+      'https://localhost:123': 'wss://localhost:123/ws',
+      'ws://localhost:123': 'ws://localhost:123/ws',
+      'wss://localhost:123': 'wss://localhost:123/ws',
+      'http://localhost:123/ABCDEF=': 'ws://localhost:123/ABCDEF=/ws',
+      'https://localhost:123/ABCDEF=': 'wss://localhost:123/ABCDEF=/ws',
+      'ws://localhost:123/ABCDEF=': 'ws://localhost:123/ABCDEF=/ws',
+      'wss://localhost:123/ABCDEF=': 'wss://localhost:123/ABCDEF=/ws',
+    };
+
+    testCases.forEach((String input, String expected) {
+      final inputUri = Uri.parse(input);
+      final actualUri = convertToWebSocketUrl(serviceProtocolUrl: inputUri);
+      expect(actualUri.toString(), equals(expected));
+    });
+  });
+}
diff --git a/pkg/vm_service/tool/common/generate_common.dart b/pkg/vm_service/tool/common/generate_common.dart
new file mode 100644
index 0000000..a54f785
--- /dev/null
+++ b/pkg/vm_service/tool/common/generate_common.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library generate_vm_service_common;
+
+import 'package:markdown/markdown.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+import 'src_gen_common.dart';
+
+/// [ApiParseUtil] contains top level parsing utilities.
+class ApiParseUtil {
+  /// Extract the current VM Service version number as a String.
+  static String parseVersionString(List<Node> nodes) =>
+      parseVersionSemVer(nodes).toString();
+
+  static Version parseVersionSemVer(List<Node> nodes) {
+    final RegExp regex = new RegExp(r'[\d.]+');
+
+    // Extract version from header: `# Dart VM Service Protocol 2.0`.
+    Element node = nodes.firstWhere((n) => isH1(n));
+    Text text = node.children[0];
+    Match match = regex.firstMatch(text.text);
+    if (match == null) throw 'Unable to locate service protocol version';
+
+    // Append a `.0`.
+    return new Version.parse('${match.group(0)}.0');
+  }
+}
diff --git a/pkg/vm_service/tool/common/parser.dart b/pkg/vm_service/tool/common/parser.dart
new file mode 100644
index 0000000..813b798
--- /dev/null
+++ b/pkg/vm_service/tool/common/parser.dart
@@ -0,0 +1,172 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library parser;
+
+class Token {
+  static final RegExp _alpha = new RegExp(r'^[0-9a-zA-Z_\-@]+$');
+
+  final String text;
+  Token next;
+
+  Token(this.text);
+
+  bool get eof => text == null;
+
+  bool get isName {
+    if (text == null || text.isEmpty) return false;
+    return _alpha.hasMatch(text);
+  }
+
+  bool get isComment => text != null && text.startsWith('//');
+
+  String toString() => text == null ? 'EOF' : text;
+}
+
+class Tokenizer {
+  static final alphaNum =
+      '@abcdefghijklmnopqrstuvwxyz-_0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
+  static final whitespace = ' \n\t\r';
+
+  String text;
+  Token _head;
+  Token _last;
+
+  Tokenizer(this.text);
+
+  Token tokenize() {
+    _emit(null);
+
+    for (int i = 0; i < text.length; i++) {
+      String c = text[i];
+
+      if (whitespace.contains(c)) {
+        // skip
+      } else if (c == '/' && _peek(i) == '/') {
+        int index = text.indexOf('\n', i);
+        if (index == -1) index = text.length;
+        _emit(text.substring(i, index));
+        i = index;
+      } else if (alphaNum.contains(c)) {
+        int start = i;
+
+        while (alphaNum.contains(_peek(i))) {
+          i++;
+        }
+
+        _emit(text.substring(start, i + 1));
+      } else {
+        _emit(c);
+      }
+    }
+
+    _emit(null);
+
+    _head = _head.next;
+
+    return _head;
+  }
+
+  void _emit(String value) {
+    Token token = new Token(value);
+    if (_head == null) _head = token;
+    if (_last != null) _last.next = token;
+    _last = token;
+  }
+
+  String _peek(int i) {
+    i += 1;
+    return i < text.length ? text[i] : new String.fromCharCodes([0]);
+  }
+
+  String toString() {
+    StringBuffer buf = new StringBuffer();
+
+    Token t = _head;
+
+    buf.write('[${t}]\n');
+
+    while (!t.eof) {
+      t = t.next;
+      buf.write('[${t}]\n');
+    }
+
+    return buf.toString().trim();
+  }
+}
+
+abstract class Parser {
+  final Token startToken;
+
+  Token current;
+
+  Parser(this.startToken);
+
+  Token expect(String text) {
+    Token t = advance();
+    if (text != t.text) fail('expected ${text}, got ${t}');
+    return t;
+  }
+
+  bool consume(String text) {
+    if (peek().text == text) {
+      advance();
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  Token peek() =>
+      current == null ? startToken : current.eof ? current : current.next;
+
+  Token expectName() {
+    Token t = advance();
+    if (!t.isName) fail('expected name token, got ${t}');
+    return t;
+  }
+
+  Token advance() {
+    if (current == null) {
+      current = startToken;
+    } else if (!current.eof) {
+      current = current.next;
+    }
+
+    return current;
+  }
+
+  String collectComments() {
+    StringBuffer buf = new StringBuffer();
+
+    while (peek().isComment) {
+      Token t = advance();
+      String str = t.text.substring(2);
+
+      if (str.startsWith(' ')) str = str.substring(1);
+
+      if (str.startsWith('  ')) {
+        buf.write('\n - ${str.substring(2)}');
+      } else if (str.isEmpty) {
+        buf.write('\n\n');
+      } else {
+        buf.write('${str} ');
+      }
+    }
+
+    if (buf.isEmpty) return null;
+    return buf
+        .toString()
+        .split('\n')
+        .map((line) => line.trimRight())
+        .join('\n')
+        .trim();
+  }
+
+  void validate(bool result, String message) {
+    if (!result) throw 'expected ${message}';
+  }
+
+  void fail(String message) => throw message;
+}
diff --git a/pkg/vm_service/tool/common/src_gen_common.dart b/pkg/vm_service/tool/common/src_gen_common.dart
new file mode 100644
index 0000000..0a47d1c
--- /dev/null
+++ b/pkg/vm_service/tool/common/src_gen_common.dart
@@ -0,0 +1,93 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library src_gen_common;
+
+import 'package:markdown/markdown.dart';
+
+const int RUNE_SPACE = 32;
+const int RUNE_EOL = 10;
+const int RUNE_LEFT_CURLY = 123;
+const int RUNE_RIGHT_CURLY = 125;
+
+final RegExp _wsRegexp = new RegExp(r'\s+');
+
+String collapseWhitespace(String str) => str.replaceAll(_wsRegexp, ' ');
+
+bool isEmphasis(Node node) => node is Element && node.tag == 'em';
+bool isPara(Node node) => node is Element && node.tag == 'p';
+bool isBlockquote(Node node) => node is Element && node.tag == 'blockquote';
+bool isPre(Node node) => node is Element && node.tag == 'pre';
+bool isH1(Node node) => node is Element && node.tag == 'h1';
+bool isH3(Node node) => node is Element && node.tag == 'h3';
+bool isHeader(Node node) => node is Element && node.tag.startsWith('h');
+String textForElement(Node node) =>
+    (((node as Element).children.first) as Text).text;
+String textForCode(Node node) =>
+    textForElement((node as Element).children.first);
+
+/// foo ==> Foo
+String titleCase(String str) =>
+    str.substring(0, 1).toUpperCase() + str.substring(1);
+
+/// FooBar ==> fooBar
+String lowerTitleCase(String str) =>
+    str.substring(0, 1).toLowerCase() + str.substring(1);
+
+String joinLast(Iterable<String> strs, String join, [String last]) {
+  if (strs.isEmpty) return '';
+  List list = strs.toList();
+  if (list.length == 1) return list.first;
+  StringBuffer buf = new StringBuffer();
+  for (int i = 0; i < list.length; i++) {
+    if (i > 0) {
+      if (i + 1 == list.length && last != null) {
+        buf.write(last);
+      } else {
+        buf.write(join);
+      }
+    }
+    buf.write(list[i]);
+  }
+  return buf.toString();
+}
+
+/// Wrap a string on column boundaries.
+String wrap(String str, [int col = 80]) {
+  // The given string could contain newlines.
+  List<String> lines = str.split('\n');
+  return lines.map((l) => _simpleWrap(l, col)).join('\n');
+}
+
+/// Wrap a string ignoring newlines.
+String _simpleWrap(String str, [int col = 80]) {
+  List<String> lines = [];
+
+  while (str.length > col) {
+    int index = col;
+
+    while (index > 0 && str.codeUnitAt(index) != RUNE_SPACE) {
+      index--;
+    }
+
+    if (index == 0) {
+      index = str.indexOf(' ');
+
+      if (index == -1) {
+        lines.add(str);
+        str = '';
+      } else {
+        lines.add(str.substring(0, index).trim());
+        str = str.substring(index).trim();
+      }
+    } else {
+      lines.add(str.substring(0, index).trim());
+      str = str.substring(index).trim();
+    }
+  }
+
+  if (str.isNotEmpty) lines.add(str);
+
+  return lines.join('\n');
+}
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
new file mode 100644
index 0000000..04e8b59
--- /dev/null
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -0,0 +1,1914 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library generate_vm_service_dart;
+
+import 'package:markdown/markdown.dart';
+
+import '../common/generate_common.dart';
+import '../common/parser.dart';
+import '../common/src_gen_common.dart';
+import 'src_gen_dart.dart';
+
+export 'src_gen_dart.dart' show DartGenerator;
+
+Api api;
+
+String _coerceRefType(String typeName) {
+  if (typeName == 'Object') typeName = 'Obj';
+  if (typeName == '@Object') typeName = 'ObjRef';
+  if (typeName == 'Null') typeName = 'NullVal';
+  if (typeName == '@Null') typeName = 'NullValRef';
+  if (typeName == 'Function') typeName = 'Func';
+  if (typeName == '@Function') typeName = 'FuncRef';
+
+  if (typeName.startsWith('@')) typeName = typeName.substring(1) + 'Ref';
+
+  if (typeName == 'string') typeName = 'String';
+  if (typeName == 'map') typeName = 'Map';
+
+  return typeName;
+}
+
+String _typeRefListToString(List<TypeRef> types) =>
+    'const [' + types.map((e) => "'" + e.name + "'").join(',') + ']';
+
+final String _headerCode = r'''
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This is a generated file.
+
+/// A library to access the VM Service API.
+///
+/// The main entry-point for this library is the [VmService] class.
+library vm_service;
+
+import 'dart:async';
+import 'dart:convert' show base64, jsonDecode, jsonEncode, utf8;
+import 'dart:typed_data';
+
+import 'src/service_extension_registry.dart';
+
+export 'src/service_extension_registry.dart' show ServiceExtensionRegistry;
+''';
+
+final String _implCode = r'''
+
+  /// Call an arbitrary service protocol method. This allows clients to call
+  /// methods not explicitly exposed by this library.
+  Future<Response> callMethod(String method, {
+    String isolateId,
+    Map args
+  }) {
+    return callServiceExtension(method, isolateId: isolateId, args: args);
+  }
+
+  /// Invoke a specific service protocol extension method.
+  ///
+  /// See https://api.dartlang.org/stable/dart-developer/dart-developer-library.html.
+  @override
+  Future<Response> callServiceExtension(String method, {
+    String isolateId,
+    Map args
+  }) {
+    if (args == null && isolateId == null) {
+      return _call(method);
+    } else if (args == null) {
+      return _call(method, {'isolateId': isolateId});
+    } else {
+      args = new Map.from(args);
+      if (isolateId != null) {
+        args['isolateId'] = isolateId;
+      }
+      return _call(method, args);
+    }
+  }
+
+  Stream<String> get onSend => _onSend.stream;
+
+  Stream<String> get onReceive => _onReceive.stream;
+
+  void dispose() {
+    _streamSub.cancel();
+    _completers.values.forEach((c) => c.completeError('disposed'));
+    if (_disposeHandler != null) _disposeHandler();
+  }
+
+  Future<T> _call<T>(String method, [Map args]) {
+    String id = '${++_id}';
+    Completer<T> completer = new Completer<T>();
+    _completers[id] = completer;
+    _methodCalls[id] = method;
+    Map m = {'id': id, 'method': method};
+    if (args != null) m['params'] = args;
+    String message = jsonEncode(m);
+    _onSend.add(message);
+    _writeMessage(message);
+    return completer.future;
+  }
+
+  /// Register a service for invocation.
+  void registerServiceCallback(String service, ServiceCallback cb) {
+    if (_services.containsKey(service)) {
+      throw new Exception('Service \'${service}\' already registered');
+    }
+    _services[service] = cb;
+  }
+
+  void _processMessage(dynamic message) {
+    // Expect a String, an int[], or a ByteData.
+
+    if (message is String) {
+      _processMessageStr(message);
+    } else if (message is List<int>) {
+      Uint8List list = new Uint8List.fromList(message);
+      _processMessageByteData(new ByteData.view(list.buffer));
+    } else if (message is ByteData) {
+      _processMessageByteData(message);
+    } else {
+      _log.warning('unknown message type: ${message.runtimeType}');
+    }
+  }
+
+  void _processMessageByteData(ByteData bytes) {
+    int offset = 0;
+    int metaSize = bytes.getUint32(offset + 4, Endian.big);
+    offset += 8;
+    String meta = utf8.decode(new Uint8List.view(
+        bytes.buffer, bytes.offsetInBytes + offset, metaSize));
+    offset += metaSize;
+    ByteData data = new ByteData.view(bytes.buffer, bytes.offsetInBytes + offset,
+        bytes.lengthInBytes - offset);
+    dynamic map = jsonDecode(meta);
+    if (map != null && map['method'] == 'streamNotify') {
+      String streamId = map['params']['streamId'];
+      Map event = map['params']['event'];
+      event['_data'] = data;
+      _getEventController(streamId).add(createServiceObject(event, const ['Event']));
+    }
+  }
+
+  void _processMessageStr(String message) {
+    var json;
+    try {
+      _onReceive.add(message);
+
+      json = jsonDecode(message);
+    } catch (e, s) {
+      _log.severe('unable to decode message: ${message}, ${e}\n${s}');
+      return;
+    }
+
+    if (json.containsKey('method')) {
+      if (json.containsKey('id')) {
+        _processRequest(json);
+      } else {
+        _processNotification(json);
+      }
+    } else if(json.containsKey('id') && (
+                json.containsKey('result') || json.containsKey('error')
+              )) {
+      _processResponse(json);
+    }
+    else {
+     _log.severe('unknown message type: ${message}');
+    }
+  }
+
+  void _processResponse(Map<String, dynamic> json) {
+    Completer completer = _completers.remove(json['id']);
+    String methodName = _methodCalls.remove(json['id']);
+    List<String> returnTypes = _methodReturnTypes[methodName];
+    if (completer == null) {
+      _log.severe('unmatched request response: ${jsonEncode(json)}');
+    } else if (json['error'] != null) {
+      completer.completeError(RPCError.parse(methodName, json['error']));
+    } else {
+      Map<String, dynamic> result = json['result'] as Map<String, dynamic>;
+      String type = result['type'];
+      if (_typeFactories[type] == null) {
+        completer.complete(Response.parse(result));
+      } else {
+        completer.complete(createServiceObject(result, returnTypes));
+      }
+    }
+  }
+
+  Future _processRequest(Map<String, dynamic> json) async {
+    final Map m = await _routeRequest(json['method'], json['params']);
+    m['id'] = json['id'];
+    m['jsonrpc'] = '2.0';
+    String message = jsonEncode(m);
+    _onSend.add(message);
+    _writeMessage(message);
+  }
+
+  Future _processNotification(Map<String, dynamic> json) async {
+    final String method = json['method'];
+    final Map params = json['params'];
+    if (method == 'streamNotify') {
+      String streamId = params['streamId'];
+      _getEventController(streamId).add(createServiceObject(params['event'], const ['Event']));
+    } else {
+      await _routeRequest(method, params);
+    }
+  }
+
+  Future<Map> _routeRequest(String method, Map params) async{
+    try {
+      if (_services.containsKey(method)) {
+        return await _services[method](params);
+      }
+      return {
+        'error': {
+          'code': -32601, // Method not found
+          'message': 'Method not found \'$method\''
+        }
+      };
+    } catch (e, st) {
+      return {
+        'error': {
+          'code': -32000, // SERVER ERROR
+          'message': 'Unexpected Server Error $e\n$st'
+        }
+      };
+    }
+  }
+''';
+
+final String _rpcError = r'''
+typedef DisposeHandler = Future Function();
+
+class RPCError {
+  static RPCError parse(String callingMethod, dynamic json) {
+    return new RPCError(callingMethod, json['code'], json['message'], json['data']);
+  }
+
+  final String callingMethod;
+  final int code;
+  final String message;
+  final Map data;
+
+  RPCError(this.callingMethod, this.code, this.message, [this.data]);
+
+  String get details => data == null ? null : data['details'];
+
+  String toString() {
+    if (details == null) {
+      return '${message} (${code}) from ${callingMethod}()';
+    } else {
+      return '${message} (${code}) from ${callingMethod}():\n${details}';
+    }
+  }
+}
+
+/// An `ExtensionData` is an arbitrary map that can have any contents.
+class ExtensionData {
+  static ExtensionData parse(Map json) =>
+      json == null ? null : new ExtensionData._fromJson(json);
+
+  final Map data;
+
+  ExtensionData() : data = {};
+
+  ExtensionData._fromJson(this.data);
+
+  String toString() => '[ExtensionData ${data}]';
+}
+
+/// A logging handler you can pass to a [VmService] instance in order to get
+/// notifications of non-fatal service protocol warnings and errors.
+abstract class Log {
+  /// Log a warning level message.
+  void warning(String message);
+
+  /// Log an error level message.
+  void severe(String message);
+}
+
+class _NullLog implements Log {
+  void warning(String message) {}
+  void severe(String message) {}
+}
+''';
+
+final _registerServiceImpl = '''
+_serviceExtensionRegistry.registerExtension(params['service'], this);
+response =  Success();''';
+
+final _streamListenCaseImpl = '''
+var id = params['streamId'];
+if (_streamSubscriptions.containsKey(id)) {
+  throw RPCError('streamListen', 103, 'Stream already subscribed', {
+      'details': "The stream '\$id' is already subscribed",
+    });
+}
+
+var stream = id == 'Service'
+    ? _serviceExtensionRegistry.onExtensionEvent
+    : _serviceImplementation.onEvent(id);
+_streamSubscriptions[id] = stream.listen((e) {
+  _responseSink.add({
+    'jsonrpc': '2.0',
+    'method': 'streamNotify',
+    'params': {
+      'streamId': id,
+      'event': e.toJson(),
+    },
+  });
+});
+response = Success();''';
+
+final _streamCancelCaseImpl = '''
+var id = params['streamId'];
+var existing = _streamSubscriptions.remove(id);
+if (existing == null) {
+  throw RPCError('streamCancel', 104, 'Stream not subscribed', {
+      'details': "The stream '\$id' is not subscribed",
+    });
+}
+await existing.cancel();
+response = Success();''';
+
+abstract class Member {
+  String get name;
+
+  String get docs => null;
+
+  void generate(DartGenerator gen);
+
+  bool get hasDocs => docs != null;
+
+  String toString() => name;
+}
+
+class Api extends Member with ApiParseUtil {
+  String serviceVersion;
+  List<Method> methods = [];
+  List<Enum> enums = [];
+  List<Type> types = [];
+  List<StreamCategory> streamCategories = [];
+
+  void parse(List<Node> nodes) {
+    serviceVersion = ApiParseUtil.parseVersionString(nodes);
+
+    // Look for h3 nodes
+    // the pre following it is the definition
+    // the optional p following that is the documentation
+
+    String h3Name;
+
+    for (int i = 0; i < nodes.length; i++) {
+      Node node = nodes[i];
+
+      if (isPre(node) && h3Name != null) {
+        String definition = textForCode(node);
+        String docs = '';
+
+        while (i + 1 < nodes.length &&
+            (isPara(nodes[i + 1]) || isBlockquote(nodes[i + 1]))) {
+          Element p = nodes[++i];
+          String str = TextOutputVisitor.printText(p);
+          if (!str.contains('|') && !str.contains('``')) {
+            str = collapseWhitespace(str);
+          }
+          docs = '${docs}\n\n${str}';
+        }
+
+        docs = docs.trim();
+        if (docs.isEmpty) docs = null;
+
+        _parse(h3Name, definition, docs);
+      } else if (isH3(node)) {
+        h3Name = textForElement(node);
+      } else if (isHeader(node)) {
+        h3Name = null;
+      }
+    }
+
+    for (Type type in types) {
+      type.calculateFieldOverrides();
+    }
+
+    Method streamListenMethod =
+        methods.singleWhere((method) => method.name == 'streamListen');
+    _parseStreamListenDocs(streamListenMethod.docs);
+  }
+
+  String get name => 'api';
+
+  String get docs => null;
+
+  void _parse(String name, String definition, [String docs]) {
+    name = name.trim();
+    definition = definition.trim();
+    // clean markdown introduced changes
+    definition = definition.replaceAll('&lt;', '<').replaceAll('&gt;', '>');
+    if (docs != null) docs = docs.trim();
+
+    if (definition.startsWith('class ')) {
+      types.add(new Type(this, name, definition, docs));
+    } else if (name.substring(0, 1).toLowerCase() == name.substring(0, 1)) {
+      methods.add(new Method(name, definition, docs));
+    } else if (definition.startsWith('enum ')) {
+      enums.add(new Enum(name, definition, docs));
+    } else {
+      throw 'unexpected entity: ${name}, ${definition}';
+    }
+  }
+
+  static String printNode(Node n) {
+    if (n is Text) {
+      return n.text;
+    } else if (n is Element) {
+      if (n.tag != 'h3') return n.tag;
+      return '${n.tag}:[${n.children.map((c) => printNode(c)).join(', ')}]';
+    } else {
+      return '${n}';
+    }
+  }
+
+  void generate(DartGenerator gen) {
+    // Set default value for unspecified property
+    setDefaultValue('Instance', 'valueAsStringIsTruncated', 'false');
+    setDefaultValue('InstanceRef', 'valueAsStringIsTruncated', 'false');
+
+    gen.out(_headerCode);
+    gen.writeln("const String vmServiceVersion = '${serviceVersion}';");
+    gen.writeln();
+    gen.writeln('''
+/// @optional
+const String optional = 'optional';
+
+/// Decode a string in Base64 encoding into the equivalent non-encoded string.
+/// This is useful for handling the results of the Stdout or Stderr events.
+String decodeBase64(String str) => utf8.decode(base64.decode(str));
+
+// Returns true if a response is the Dart `null` instance.
+bool _isNullInstance(Map json) => ((json['type'] == '@Instance') &&
+                                  (json['kind'] == 'Null'));
+
+Object createServiceObject(dynamic json, List<String> expectedTypes) {
+  if (json == null) return null;
+
+  if (json is List) {
+    return json.map((e) => createServiceObject(e, expectedTypes)).toList();
+  } else if (json is Map) {
+    String type = json['type'];
+
+    // Not a Response type.
+    if (type == null) {
+      // If there's only one expected type, we'll just use that type.
+      if (expectedTypes.length == 1) {
+        type = expectedTypes.first;
+      } else {
+        return null;
+      }
+    } else if (_isNullInstance(json) && (!expectedTypes.contains(type))) {
+      // Replace null instances with null when we don't expect an instance to
+      // be returned.
+      return null;
+    }
+    if (_typeFactories[type] == null) {
+      return null;
+    } else {
+      return _typeFactories[type](json);
+    }
+  } else {
+    // Handle simple types.
+    return json;
+  }
+}
+
+dynamic _createSpecificObject(dynamic json, dynamic creator(Map<String, dynamic> map)) {
+  if (json == null) return null;
+
+  if (json is List) {
+    return json.map((e) => creator(e)).toList();
+  } else if (json is Map) {
+    Map<String, dynamic> map = {};
+    for (dynamic key in json.keys) {
+      map[key as String] = json[key];
+    }
+    return creator(map);
+  } else {
+    // Handle simple types.
+    return json;
+  }
+}
+
+void _setIfNotNull(Map<String, Object> json, String key, Object value) {
+  if (value == null) return;
+  json[key] = value;
+}
+
+typedef ServiceCallback = Future<Map<String, dynamic>> Function(
+    Map<String, dynamic> params);
+
+''');
+    gen.writeln();
+    gen.writeln('Map<String, Function> _typeFactories = {');
+    types.forEach((Type type) {
+      gen.writeln("'${type.rawName}': ${type.name}.parse,");
+    });
+    gen.writeln('};');
+    gen.writeln();
+
+    gen.writeln('Map<String, List<String>> _methodReturnTypes = {');
+    methods.forEach((Method method) {
+      String returnTypes = _typeRefListToString(method.returnType.types);
+      gen.writeln("'${method.name}' : $returnTypes,");
+    });
+    gen.writeln('};');
+    gen.writeln();
+
+    // The service interface, both servers and clients implement this.
+    gen.writeStatement('''
+/// A class representation of the Dart VM Service Protocol.
+///
+/// Both clients and servers should implement this interface.
+abstract class VmServiceInterface {
+  /// Returns the stream for a given stream id.
+  ///
+  /// This is not a part of the spec, but is needed for both the client and
+  /// server to get access to the real event streams.
+  Stream<Event> onEvent(String streamId);
+
+  /// Handler for calling extra service extensions.
+  Future<Response> callServiceExtension(String method, {String isolateId, Map args});
+''');
+    methods.forEach((m) {
+      m.generateDefinition(gen);
+      gen.write(';');
+    });
+    gen.write('}');
+    gen.writeln();
+
+    // The server class, takes a VmServiceInterface and delegates to it
+    // automatically.
+    gen.write('''
+  /// A Dart VM Service Protocol connection that delegates requests to a
+  /// [VmServiceInterface] implementation.
+  ///
+  /// One of these should be created for each client, but they should generally
+  /// share the same [VmServiceInterface] and [ServiceExtensionRegistry]
+  /// instances.
+  class VmServerConnection {
+    final Stream<Map<String, Object>> _requestStream;
+    final StreamSink<Map<String, Object>> _responseSink;
+    final ServiceExtensionRegistry _serviceExtensionRegistry;
+    final VmServiceInterface _serviceImplementation;
+    /// Used to create unique ids when acting as a proxy between clients.
+    int _nextServiceRequestId = 0;
+
+    /// Manages streams for `streamListen` and `streamCancel` requests.
+    final _streamSubscriptions = <String, StreamSubscription>{};
+
+    /// Completes when [_requestStream] is done.
+    Future get done => _doneCompleter.future;
+    final _doneCompleter = Completer<Null>();
+
+    /// Pending service extension requests to this client by id.
+    final _pendingServiceExtensionRequests =
+        <String, Completer<Map<String, Object>>>{};
+
+    VmServerConnection(
+        this._requestStream, this._responseSink, this._serviceExtensionRegistry,
+        this._serviceImplementation) {
+      _requestStream.listen(_delegateRequest, onDone: _doneCompleter.complete);
+      done.then(
+          (_) => _streamSubscriptions.values.forEach((sub) => sub.cancel()));
+    }
+
+    /// Invoked when the current client has registered some extension, and
+    /// another client sends an RPC request for that extension.
+    ///
+    /// We don't attempt to do any serialization or deserialization of the
+    /// request or response in this case
+    Future<Map<String, Object>> _forwardServiceExtensionRequest(
+        Map<String, Object> request) {
+      var originalId = request['id'];
+      request = Map.of(request);
+      // Modify the request ID to ensure we don't have conflicts between
+      // multiple clients ids.
+      var newId = '\${_nextServiceRequestId++}:\$originalId';
+      request['id'] = newId;
+      var responseCompleter = Completer<Map<String, Object>>();
+      _pendingServiceExtensionRequests[newId] = responseCompleter;
+      _responseSink.add(request);
+      return responseCompleter.future;
+    }
+
+    void _delegateRequest(Map<String, Object> request) async {
+      try {
+        var id = request['id'] as String;
+        // Check if this is actually a response to a pending request.
+        if (_pendingServiceExtensionRequests.containsKey(id)) {
+          // Restore the original request ID.
+          var originalId = id.substring(id.indexOf(':') + 1);
+          _pendingServiceExtensionRequests[id].complete(
+              Map.of(request)..['id'] = originalId);
+          return;
+        }
+        var method = request['method'] as String;
+        if (method == null) {
+          throw RPCError(null, -32600, 'Invalid Request', request);
+        }
+        var params = request['params'] as Map;
+        Response response;
+
+        switch(method) {
+          case 'registerService':
+            $_registerServiceImpl
+            break;
+    ''');
+    methods.forEach((m) {
+      if (m.name != 'registerService') {
+        gen.writeln("case '${m.name}':");
+        if (m.name == 'streamListen') {
+          gen.writeln(_streamListenCaseImpl);
+        } else if (m.name == 'streamCancel') {
+          gen.writeln(_streamCancelCaseImpl);
+        } else {
+          gen.write("response = await _serviceImplementation.${m.name}(");
+          // Positional args
+          m.args.where((arg) => !arg.optional).forEach((arg) {
+            gen.write("params['${arg.name}'], ");
+          });
+          // Optional named args
+          var namedArgs = m.args.where((arg) => arg.optional);
+          if (namedArgs.isNotEmpty) {
+            namedArgs.forEach((arg) {
+              if (arg.name == 'scope') {
+                gen.writeln(
+                    "${arg.name}: params['${arg.name}']?.cast<String, String>(), ");
+              } else {
+                gen.writeln("${arg.name}: params['${arg.name}'], ");
+              }
+            });
+          }
+          gen.writeln(");");
+        }
+        gen.writeln('break;');
+      }
+    });
+    // Handle service extensions
+    gen.writeln('default:');
+    gen.writeln('''
+        var registeredClient = _serviceExtensionRegistry.clientFor(method);
+        if (registeredClient != null) {
+          // Check for any client which has registered this extension, if we
+          // have one then delegate the request to that client.
+          _responseSink.add(
+              await registeredClient._forwardServiceExtensionRequest(request));
+          // Bail out early in this case, we are just acting as a proxy and
+          // never get a `Response` instance.
+          return;
+        } else if (method.startsWith('ext.')) {
+          // Remaining methods with `ext.` are assumed to be registered via
+          // dart:developer, which the service implementation handles.
+          var args = params == null ? null : new Map.of(params);
+          var isolateId = args?.remove('isolateId');
+          response = await _serviceImplementation.callServiceExtension(method,
+              isolateId: isolateId, args: args);
+        } else {
+          throw RPCError(method, -32601, 'Method not found', request);
+        }
+''');
+    // Terminate the switch
+    gen.writeln('}');
+
+    // Handle null responses
+    gen.write('''
+      if (response == null) {
+        throw StateError('Invalid null response from service');
+      }
+    ''');
+
+    // Generate the json success response
+    gen.write("""_responseSink.add({
+  'jsonrpc': '2.0',
+  'result': response.toJson(),
+  'id': id,
+});
+""");
+
+    // Close the try block, handle errors
+    gen.write(r'''
+      } catch (e, st) {
+        var error = e is RPCError
+            ? {'code': e.code, 'data': e.data, 'message': e.message}
+            : {'code': -32603, 'message': '$e\n$st'};
+        _responseSink.add({
+          'jsonrpc': '2.0',
+          'error': error,
+          'id': request['id'],
+        });
+      }
+''');
+
+    // terminate the _delegateRequest method
+    gen.write('}');
+    gen.writeln();
+
+    gen.write('}');
+    gen.writeln();
+
+    // The client side service implementation.
+    gen.writeStatement('class VmService implements VmServiceInterface {');
+    gen.writeStatement('StreamSubscription _streamSub;');
+    gen.writeStatement('Function _writeMessage;');
+    gen.writeStatement('int _id = 0;');
+    gen.writeStatement('Map<String, Completer> _completers = {};');
+    gen.writeStatement('Map<String, String> _methodCalls = {};');
+    gen.writeStatement('Map<String, ServiceCallback> _services = {};');
+    gen.writeStatement('Log _log;');
+    gen.write('''
+
+StreamController<String> _onSend = new StreamController.broadcast(sync: true);
+StreamController<String> _onReceive = new StreamController.broadcast(sync: true);
+
+Map<String, StreamController<Event>> _eventControllers = {};
+
+StreamController<Event> _getEventController(String eventName) {
+  StreamController<Event> controller = _eventControllers[eventName];
+  if (controller == null) {
+    controller = new StreamController.broadcast();
+    _eventControllers[eventName] = controller;
+  }
+  return controller;
+}
+
+DisposeHandler _disposeHandler;
+
+VmService(Stream<dynamic> /*String|List<int>*/ inStream, void writeMessage(String message), {
+  Log log,
+  DisposeHandler disposeHandler
+}) {
+  _streamSub = inStream.listen(_processMessage);
+  _writeMessage = writeMessage;
+  _log = log == null ? new _NullLog() : log;
+  _disposeHandler = disposeHandler;
+}
+
+@override
+Stream<Event> onEvent(String streamId) => _getEventController(streamId).stream;
+''');
+
+    // streamCategories
+    streamCategories.forEach((s) => s.generate(gen));
+
+    gen.writeln();
+    methods.forEach((m) => m.generate(gen));
+    gen.out(_implCode);
+    gen.writeStatement('}');
+    gen.writeln();
+    gen.out(_rpcError);
+    gen.writeln('// enums');
+    enums.forEach((e) {
+      if (e.name == 'EventKind') {
+        _generateEventStream(gen);
+      }
+      e.generate(gen);
+    });
+    gen.writeln();
+    gen.writeln('// types');
+    types.where((t) => !t.skip).forEach((t) => t.generate(gen));
+  }
+
+  void generateAsserts(DartGenerator gen) {
+    gen.out(r'''
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This is a generated file.
+
+/// A library for asserting correct responses from the VM Service.
+
+import 'package:vm_service/vm_service.dart' as vms;
+
+dynamic assertNotNull(dynamic obj) {
+  if (obj == null) throw 'assert failed';
+  return obj;
+}
+
+bool assertBool(bool obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+int assertInt(int obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+double assertDouble(double obj) {
+  assertNotNull(obj);
+  return obj;
+}
+
+List<int> assertInts(List<int> list) {
+  for (int elem in list) {
+    assertInt(elem);
+  }
+  return list;
+}
+
+List<String> assertStrings(List<String> list) {
+  for (String elem in list) {
+    assertString(elem);
+  }
+  return list;
+}
+
+String assertString(String obj) {
+  assertNotNull(obj);
+  if (obj.isEmpty) throw 'expected non-zero length string';
+  return obj;
+}
+
+vms.Success assertSuccess(vms.Success obj) {
+  assertNotNull(obj);
+  if (obj.type != 'Success') throw 'expected Success';
+  return obj;
+}
+
+/// Assert PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted,
+/// PauseException, Resume, BreakpointAdded, BreakpointResolved,
+/// BreakpointRemoved, and Inspect events.
+vms.Event assertDebugEvent(vms.Event event) {
+  assertEvent(event);
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kBreakpointAdded ||
+      event.kind == vms.EventKind.kBreakpointRemoved ||
+      event.kind == vms.EventKind.kBreakpointResolved) {
+    assertBreakpoint(event.breakpoint);
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint) {
+    for (vms.Breakpoint elem in event.pauseBreakpoints) {
+      assertBreakpoint(elem);
+    }
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kPauseInterrupted ||
+      event.kind == vms.EventKind.kPauseException ||
+      event.kind == vms.EventKind.kResume) {
+    // For PauseInterrupted events, there will be no top frame if the isolate is
+    // idle (waiting in the message loop).
+    // For the Resume event, the top frame is provided at all times except for
+    // the initial resume event that is delivered when an isolate begins
+    // execution.
+    if (event.topFrame != null ||
+        (event.kind != vms.EventKind.kPauseInterrupted &&
+            event.kind != vms.EventKind.kResume)) {
+      assertFrame(event.topFrame);
+    }
+  }
+  if (event.kind == vms.EventKind.kPauseException) {
+    assertInstanceRef(event.exception);
+  }
+  if (event.kind == vms.EventKind.kPauseBreakpoint ||
+      event.kind == vms.EventKind.kPauseInterrupted) {
+    assertBool(event.atAsyncSuspension);
+  }
+  if (event.kind == vms.EventKind.kInspect) {
+    assertInstanceRef(event.inspectee);
+  }
+  return event;
+}
+
+/// Assert IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate,
+/// and ServiceExtensionAdded events.
+vms.Event assertIsolateEvent(vms.Event event) {
+  assertEvent(event);
+  if (event.kind == vms.EventKind.kServiceExtensionAdded) {
+    assertString(event.extensionRPC);
+  }
+  return event;
+}
+
+''');
+    for (Enum e in enums) {
+      e.generateAssert(gen);
+    }
+    for (Type type in types) {
+      if (type.name == 'Success') continue;
+      type.generateAssert(gen);
+      if (type.name.endsWith('Ref') ||
+          [
+            'BoundVariable',
+            'Breakpoint',
+            'ContextElement',
+            'Flag',
+            'Frame',
+            'LibraryDependency',
+            'Message',
+            'SourceReportRange',
+            'ClassHeapStats',
+            'CodeRegion',
+            'ProfileFunction',
+            'TimelineEvent',
+          ].contains(type.name)) {
+        type.generateListAssert(gen);
+      }
+    }
+  }
+
+  void setDefaultValue(String typeName, String fieldName, String defaultValue) {
+    types
+        .firstWhere((t) => t.name == typeName)
+        .fields
+        .firstWhere((f) => f.name == fieldName)
+        .defaultValue = defaultValue;
+  }
+
+  bool isEnumName(String typeName) => enums.any((Enum e) => e.name == typeName);
+
+  Type getType(String name) =>
+      types.firstWhere((t) => t.name == name, orElse: () => null);
+
+  void _parseStreamListenDocs(String docs) {
+    Iterator<String> lines = docs.split('\n').map((l) => l.trim()).iterator;
+    bool inStreamDef = false;
+
+    while (lines.moveNext()) {
+      final String line = lines.current;
+
+      if (line.startsWith('streamId |')) {
+        inStreamDef = true;
+        lines.moveNext();
+      } else if (inStreamDef) {
+        if (line.isEmpty) {
+          inStreamDef = false;
+        } else {
+          streamCategories.add(new StreamCategory(line));
+        }
+      }
+    }
+  }
+
+  void _generateEventStream(DartGenerator gen) {
+    gen.writeln();
+    gen.writeDocs('An enum of available event streams.');
+    gen.writeln('class EventStreams {');
+    gen.writeln('EventStreams._();');
+    gen.writeln();
+
+    streamCategories.forEach((c) {
+      gen.writeln("static const String k${c.name} = '${c.name}';");
+    });
+
+    gen.writeln('}');
+  }
+}
+
+class StreamCategory {
+  String _name;
+  List<String> _events;
+
+  StreamCategory(String line) {
+    // Debug | PauseStart, PauseExit, ...
+    _name = line.split('|')[0].trim();
+
+    line = line.split('|')[1];
+    _events = line.split(',').map((w) => w.trim()).toList();
+  }
+
+  String get name => _name;
+
+  List<String> get events => _events;
+
+  void generate(DartGenerator gen) {
+    gen.writeln();
+    gen.writeln('// ${events.join(', ')}');
+    gen.writeln(
+        "Stream<Event> get on${name}Event => _getEventController('$name').stream;");
+  }
+
+  String toString() => '$name: $events';
+}
+
+class Method extends Member {
+  final String name;
+  final String docs;
+
+  MemberType returnType = new MemberType();
+  List<MethodArg> args = [];
+
+  Method(this.name, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  bool get hasArgs => args.isNotEmpty;
+
+  bool get hasOptionalArgs => args.any((MethodArg arg) => arg.optional);
+
+  void generate(DartGenerator gen) {
+    generateDefinition(gen, withDocs: false, withOverrides: true);
+    if (!hasArgs) {
+      gen.writeStatement("=> _call('${name}');");
+    } else if (hasOptionalArgs) {
+      gen.writeStatement('{');
+      gen.write('Map m = {');
+      gen.write(args
+          .where((MethodArg a) => !a.optional)
+          .map((arg) => "'${arg.name}': ${arg.name}")
+          .join(', '));
+      gen.writeln('};');
+      args.where((MethodArg a) => a.optional).forEach((MethodArg arg) {
+        String valueRef = arg.name;
+        // Special case for `getAllocationProfile`. We do not want to add these
+        // params if they are false.
+        if (name == 'getAllocationProfile') {
+          gen.writeln("if (${arg.name} != null && ${arg.name}) {");
+        } else {
+          gen.writeln("if (${arg.name} != null) {");
+        }
+        gen.writeln("m['${arg.name}'] = ${valueRef};");
+        gen.writeln("}");
+      });
+      gen.writeStatement("return _call('${name}', m);");
+      gen.writeStatement('}');
+    } else {
+      gen.writeStatement('{');
+      gen.write("return _call('${name}', {");
+      gen.write(args.map((MethodArg arg) {
+        return "'${arg.name}': ${arg.name}";
+      }).join(', '));
+      gen.writeStatement('});');
+      gen.writeStatement('}');
+    }
+  }
+
+  /// Writes the method definition without the body.
+  ///
+  /// Does not write an opening or closing bracket, or a trailing semicolon.
+  ///
+  /// If [withOverrides] is `true` then it will add an `@override` annotation
+  /// before each method.
+  void generateDefinition(DartGenerator gen,
+      {bool withDocs = true, bool withOverrides = false}) {
+    gen.writeln();
+    if (withDocs && docs != null) {
+      String _docs = docs == null ? '' : docs;
+      if (returnType.isMultipleReturns) {
+        _docs += '\n\nThe return value can be one of '
+            '${joinLast(returnType.types.map((t) => '[${t}]'), ', ', ' or ')}.';
+        _docs = _docs.trim();
+      }
+      if (_docs.isNotEmpty) gen.writeDocs(_docs);
+    }
+    if (withOverrides) gen.writeln('@override');
+    gen.write('Future<${returnType.name}> ${name}(');
+    bool startedOptional = false;
+    gen.write(args.map((MethodArg arg) {
+      String typeName;
+      if (api.isEnumName(arg.type.name)) {
+        if (arg.type.isArray) {
+          typeName = typeName = '/*${arg.type}*/ List<String>';
+        } else {
+          typeName = '/*${arg.type}*/ String';
+        }
+      } else {
+        typeName = arg.type.ref;
+      }
+
+      if (arg.optional && !startedOptional) {
+        startedOptional = true;
+        return '{${typeName} ${arg.name}';
+      } else {
+        return '${typeName} ${arg.name}';
+      }
+    }).join(', '));
+    if (args.length >= 4) gen.write(',');
+    if (startedOptional) gen.write('}');
+    gen.write(') ');
+  }
+
+  void _parse(Token token) {
+    new MethodParser(token).parseInto(this);
+  }
+}
+
+class MemberType extends Member {
+  List<TypeRef> types = [];
+
+  MemberType();
+
+  void parse(Parser parser) {
+    // foo|bar[]|baz
+    // (@Instance|Sentinel)[]
+    bool loop = true;
+
+    while (loop) {
+      if (parser.consume('(')) {
+        while (parser.peek().text != ')') {
+          // @Instance | Sentinel
+          parser.advance();
+        }
+        parser.consume(')');
+        TypeRef ref = new TypeRef('dynamic');
+        while (parser.consume('[')) {
+          parser.expect(']');
+          ref.arrayDepth++;
+        }
+        types.add(ref);
+      } else {
+        Token t = parser.expectName();
+        TypeRef ref = new TypeRef(_coerceRefType(t.text));
+        while (parser.consume('[')) {
+          parser.expect(']');
+          ref.arrayDepth++;
+        }
+        types.add(ref);
+      }
+
+      loop = parser.consume('|');
+    }
+  }
+
+  String get name {
+    if (types.isEmpty) return '';
+    if (types.length == 1) return types.first.ref;
+    return 'dynamic';
+  }
+
+  bool get isMultipleReturns => types.length > 1;
+
+  bool get isSimple => types.length == 1 && types.first.isSimple;
+
+  bool get isEnum => types.length == 1 && api.isEnumName(types.first.name);
+
+  bool get isArray => types.length == 1 && types.first.isArray;
+
+  void generate(DartGenerator gen) => gen.write(name);
+}
+
+class TypeRef {
+  String name;
+  int arrayDepth = 0;
+  List<TypeRef> genericTypes;
+
+  TypeRef(this.name);
+
+  String get ref {
+    if (arrayDepth == 2) {
+      return 'List<List<${name}>>';
+    } else if (arrayDepth == 1) {
+      return 'List<${name}>';
+    } else if (genericTypes != null) {
+      return '$name<${genericTypes.join(', ')}>';
+    } else {
+      return name.startsWith('_') ? name.substring(1) : name;
+    }
+  }
+
+  String get listTypeArg => arrayDepth == 2 ? 'List<$name>' : name;
+
+  bool get isArray => arrayDepth > 0;
+
+  bool get isSimple =>
+      arrayDepth == 0 &&
+      (name == 'int' ||
+          name == 'num' ||
+          name == 'String' ||
+          name == 'bool' ||
+          name == 'double');
+
+  bool get isListTypeSimple =>
+      arrayDepth == 1 &&
+      (name == 'int' ||
+          name == 'num' ||
+          name == 'String' ||
+          name == 'bool' ||
+          name == 'double');
+
+  String get namePlural => name.endsWith('y')
+      ? name.substring(0, name.length - 1) + 'ies'
+      : name + 's';
+
+  String toString() => ref;
+}
+
+class MethodArg extends Member {
+  final Method parent;
+  TypeRef type;
+  String name;
+  bool optional = false;
+
+  MethodArg(this.parent, this.type, this.name);
+
+  // String get paramType => type;
+
+  void generate(DartGenerator gen) {
+    gen.write('${type.ref} ${name}');
+  }
+}
+
+class Type extends Member {
+  final Api parent;
+  String rawName;
+  String name;
+  String superName;
+  final String docs;
+  List<TypeField> fields = [];
+
+  Type(this.parent, String categoryName, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  Type._(this.parent, this.rawName, this.name, this.superName, this.docs);
+
+  factory Type.merge(Type t1, Type t2) {
+    final Api parent = t1.parent;
+    final String rawName = t1.rawName;
+    final String name = t1.name;
+    final String superName = t1.superName;
+    final String docs = [t1.docs, t2.docs].where((e) => e != null).join('\n');
+    final Map<String, TypeField> map = <String, TypeField>{};
+    for (TypeField f in t2.fields.reversed) {
+      map[f.name] = f;
+    }
+    // The official service.md is the default
+    for (TypeField f in t1.fields.reversed) {
+      map[f.name] = f;
+    }
+
+    final fields = map.values.toList().reversed.toList();
+
+    return new Type._(parent, rawName, name, superName, docs)..fields = fields;
+  }
+
+  bool get isResponse {
+    if (superName == null) return false;
+    if (name == 'Response' || superName == 'Response') return true;
+    return parent.getType(superName).isResponse;
+  }
+
+  bool get isRef => name.endsWith('Ref');
+
+  String get namePlural => name.endsWith('y')
+      ? name.substring(0, name.length - 1) + 'ies'
+      : name + 's';
+
+  bool get supportsIdentity {
+    if (fields.any((f) => f.name == 'id')) return true;
+    return superName == null ? false : getSuper().supportsIdentity;
+  }
+
+  Type getSuper() => superName == null ? null : api.getType(superName);
+
+  List<TypeField> getAllFields() {
+    if (superName == null) return fields;
+
+    List<TypeField> all = [];
+    all.insertAll(0, fields);
+
+    Type s = getSuper();
+    while (s != null) {
+      all.insertAll(0, s.fields);
+      s = s.getSuper();
+    }
+
+    return all;
+  }
+
+  bool get skip => name == 'ExtensionData';
+
+  void generate(DartGenerator gen) {
+    gen.writeln();
+    if (docs != null) gen.writeDocs(docs);
+    gen.write('class ${name} ');
+    if (superName != null) gen.write('extends ${superName} ');
+    gen.writeln('{');
+    gen.writeln('static ${name} parse(Map<String, dynamic> json) => '
+        'json == null ? null : new ${name}._fromJson(json);');
+    gen.writeln();
+
+    if (name == 'Response') {
+      gen.writeln('Map<String, dynamic> json;');
+    }
+
+    // fields
+    fields.forEach((TypeField field) => field.generate(gen));
+    gen.writeln();
+
+    // ctors
+    gen.writeln('${name}();');
+    gen.writeln();
+
+    String superCall = superName == null ? '' : ": super._fromJson(json) ";
+    if (name == 'Response') {
+      gen.write('${name}._fromJson(this.json)');
+    } else {
+      gen.write('${name}._fromJson(Map<String, dynamic> json) ${superCall}');
+    }
+
+    if (fields.isEmpty) {
+      gen.writeln(';');
+    } else {
+      gen.writeln('{');
+    }
+
+    fields.forEach((TypeField field) {
+      if (field.type.isSimple || field.type.isEnum) {
+        // Special case `AllocationProfile`.
+        if (name == 'AllocationProfile' && field.type.name == 'int') {
+          gen.write(
+              "${field.generatableName} = json['${field.name}'] is String ? "
+              "int.parse(json['${field.name}']) : json['${field.name}']");
+        } else {
+          gen.write("${field.generatableName} = json['${field.name}']");
+        }
+        if (field.defaultValue != null) {
+          gen.write(' ?? ${field.defaultValue}');
+        }
+        gen.writeln(';');
+        // } else if (field.type.isEnum) {
+        //   // Parse the enum.
+        //   String enumTypeName = field.type.types.first.name;
+        //   gen.writeln(
+        //     "${field.generatableName} = _parse${enumTypeName}[json['${field.name}']];");
+      } else if (name == 'Event' && field.name == 'extensionData') {
+        // Special case `Event.extensionData`.
+        gen.writeln(
+            "extensionData = ExtensionData.parse(json['extensionData']);");
+      } else if (name == 'Instance' && field.name == 'associations') {
+        // Special case `Instance.associations`.
+        gen.writeln("associations = json['associations'] == null "
+            "? null : new List<MapAssociation>.from("
+            "_createSpecificObject(json['associations'], MapAssociation.parse));");
+      } else if (name == '_CpuProfile' && field.name == 'codes') {
+        // Special case `_CpuProfile.codes`.
+        gen.writeln("codes = new List<CodeRegion>.from("
+            "_createSpecificObject(json['codes'], CodeRegion.parse));");
+      } else if (name == '_CpuProfile' && field.name == 'functions') {
+        // Special case `_CpuProfile.functions`.
+        gen.writeln("functions = new List<ProfileFunction>.from("
+            "_createSpecificObject(json['functions'], ProfileFunction.parse));");
+      } else if (name == 'SourceReport' && field.name == 'ranges') {
+        // Special case `SourceReport.ranges`.
+        gen.writeln("ranges = new List<SourceReportRange>.from("
+            "_createSpecificObject(json['ranges'], SourceReportRange.parse));");
+      } else if (name == 'SourceReportRange' && field.name == 'coverage') {
+        // Special case `SourceReportRange.coverage`.
+        gen.writeln("coverage = _createSpecificObject("
+            "json['coverage'], SourceReportCoverage.parse);");
+      } else if (name == 'Library' && field.name == 'dependencies') {
+        // Special case `Library.dependencies`.
+        gen.writeln("dependencies = new List<LibraryDependency>.from("
+            "_createSpecificObject(json['dependencies'], "
+            "LibraryDependency.parse));");
+      } else if (name == 'Script' && field.name == 'tokenPosTable') {
+        // Special case `Script.tokenPosTable`.
+        gen.write("tokenPosTable = ");
+        if (field.optional) {
+          gen.write("json['tokenPosTable'] == null ? null : ");
+        }
+        gen.writeln("new List<List<int>>.from(json['tokenPosTable'].map"
+            "((dynamic list) => new List<int>.from(list)));");
+      } else if (field.type.isArray) {
+        TypeRef fieldType = field.type.types.first;
+        String typesList = _typeRefListToString(field.type.types);
+        String ref = "json['${field.name}']";
+        if (field.optional) {
+          if (fieldType.isListTypeSimple) {
+            gen.writeln("${field.generatableName} = $ref == null ? null : "
+                "new List<${fieldType.listTypeArg}>.from($ref);");
+          } else {
+            gen.writeln("${field.generatableName} = $ref == null ? null : "
+                "new List<${fieldType.listTypeArg}>.from(createServiceObject($ref, $typesList));");
+          }
+        } else {
+          if (fieldType.isListTypeSimple) {
+            // Special case `ClassHeapStats`. Pre 3.18, responses included keys
+            // `new` and `old`. Post 3.18, these will be null.
+            if (name == 'ClassHeapStats') {
+              gen.writeln("${field.generatableName} = $ref == null ? null : "
+                  "new List<${fieldType.listTypeArg}>.from($ref);");
+            } else {
+              gen.writeln("${field.generatableName} = "
+                  "new List<${fieldType.listTypeArg}>.from($ref);");
+            }
+          } else {
+            // Special case `InstanceSet`. Pre 3.20, instances were sent in a
+            // field named 'samples' instead of 'instances'.
+            if (name == 'InstanceSet') {
+              gen.writeln("${field.generatableName} = "
+                  "new List<${fieldType.listTypeArg}>.from(createServiceObject($ref ?? json['samples'], $typesList));");
+            } else {
+              gen.writeln("${field.generatableName} = "
+                  "new List<${fieldType.listTypeArg}>.from(createServiceObject($ref, $typesList));");
+            }
+          }
+        }
+      } else {
+        String typesList = _typeRefListToString(field.type.types);
+        gen.writeln("${field.generatableName} = "
+            "createServiceObject(json['${field.name}'], $typesList);");
+      }
+    });
+    if (fields.isNotEmpty) {
+      gen.writeln('}');
+    }
+    gen.writeln();
+
+    // toJson support, the base Response type is not supported
+    if (name == 'Response') {
+      gen.writeln('''
+Map<String, dynamic> toJson() {
+  var result = json == null ? <String, dynamic>{} : Map.of(json);
+  result['type'] = type ?? 'Response';
+  return result;
+}''');
+    } else {
+      if (isResponse) {
+        gen.writeln('@override');
+      }
+      gen.writeln('Map<String, dynamic> toJson() {');
+      if (superName == null || superName == 'Response') {
+        // The base Response type doesn't have a toJson
+        gen.writeln('var json = <String, dynamic>{};');
+      } else {
+        gen.writeln('var json = super.toJson();');
+      }
+
+      // Only Response objects have a `type` field, as defined by protocol.
+      if (isResponse) {
+        // Overwrites "type" from the super class if we had one.
+        gen.writeln("json['type'] = '$rawName';");
+      }
+
+      var requiredFields = fields.where((f) => !f.optional);
+      if (requiredFields.isNotEmpty) {
+        gen.writeln('json.addAll({');
+        requiredFields.forEach((TypeField field) {
+          gen.write("'${field.name}': ");
+          generateSerializedFieldAccess(field, gen);
+          gen.writeln(',');
+        });
+        gen.writeln('});');
+      }
+
+      var optionalFields = fields.where((f) => f.optional);
+      optionalFields.forEach((TypeField field) {
+        gen.write("_setIfNotNull(json, '${field.name}', ");
+        generateSerializedFieldAccess(field, gen);
+        gen.writeln(');');
+      });
+      gen.writeln('return json;');
+      gen.writeln('}');
+      gen.writeln();
+    }
+
+    // equals and hashCode
+    if (supportsIdentity) {
+      gen.writeStatement('int get hashCode => id.hashCode;');
+      gen.writeln();
+
+      gen.writeStatement(
+          'operator==(other) => other is ${name} && id == other.id;');
+      gen.writeln();
+    }
+
+    // toString()
+    Iterable<TypeField> toStringFields =
+        getAllFields().where((f) => !f.optional);
+    if (toStringFields.length <= 7) {
+      String properties = toStringFields
+          .map(
+              (TypeField f) => "${f.generatableName}: \${${f.generatableName}}")
+          .join(', ');
+      if (properties.length > 60) {
+        int index = properties.indexOf(', ', 55);
+        if (index != -1) {
+          properties = properties.substring(0, index + 2) +
+              "' //\n'" +
+              properties.substring(index + 2);
+        }
+        gen.writeln("String toString() => '[${name} ' //\n'${properties}]';");
+      } else {
+        gen.writeln("String toString() => '[${name} ${properties}]';");
+      }
+    } else {
+      gen.writeln("String toString() => '[${name}]';");
+    }
+
+    gen.writeln('}');
+  }
+
+  // Writes the code to retrieve the serialized value of a field.
+  void generateSerializedFieldAccess(TypeField field, DartGenerator gen) {
+    var nullAware = field.optional ? '?' : '';
+    if (field.type.isSimple || field.type.isEnum) {
+      gen.write('${field.generatableName}');
+      if (field.defaultValue != null) {
+        gen.write(' ?? ${field.defaultValue}');
+      }
+    } else if (name == 'Event' && field.name == 'extensionData') {
+      // Special case `Event.extensionData`.
+      gen.writeln('extensionData$nullAware.data');
+    } else if (field.type.isArray) {
+      gen.write('${field.generatableName}$nullAware.map((f) => f');
+      // Special case `tokenPosTable` which is a List<List<int>>.
+      if (field.name == 'tokenPosTable') {
+        gen.write('$nullAware.toList()');
+      } else if (!field.type.types.first.isListTypeSimple) {
+        gen.write('$nullAware.toJson()');
+      }
+      gen.write(')$nullAware.toList()');
+    } else {
+      gen.write('${field.generatableName}$nullAware.toJson()');
+    }
+  }
+
+  void generateAssert(DartGenerator gen) {
+    gen.writeln('vms.${name} assert${name}(vms.${name} obj) {');
+    gen.writeln('assertNotNull(obj);');
+    for (TypeField field in getAllFields()) {
+      if (!field.optional) {
+        MemberType type = field.type;
+        if (type.isArray) {
+          TypeRef arrayType = type.types.first;
+          if (arrayType.arrayDepth == 1) {
+            String assertMethodName = 'assert' +
+                arrayType.name.substring(0, 1).toUpperCase() +
+                arrayType.namePlural.substring(1);
+            gen.writeln('$assertMethodName(obj.${field.generatableName});');
+          } else {
+            gen.writeln(
+                '// assert obj.${field.generatableName} is ${type.name}');
+          }
+        } else if (type.isMultipleReturns) {
+          bool first = true;
+          for (TypeRef typeRef in type.types) {
+            if (!first) gen.write('} else ');
+            first = false;
+            gen.writeln(
+                'if (obj.${field.generatableName} is vms.${typeRef.name}) {');
+            String assertMethodName = 'assert' +
+                typeRef.name.substring(0, 1).toUpperCase() +
+                typeRef.name.substring(1);
+            gen.writeln('$assertMethodName(obj.${field.generatableName});');
+          }
+          gen.writeln('} else {');
+          gen.writeln(
+              'throw "Unexpected value: \${obj.${field.generatableName}}";');
+          gen.writeln('}');
+        } else {
+          String assertMethodName = 'assert' +
+              type.name.substring(0, 1).toUpperCase() +
+              type.name.substring(1);
+          gen.writeln('$assertMethodName(obj.${field.generatableName});');
+        }
+      }
+    }
+    gen.writeln('return obj;');
+    gen.writeln('}');
+    gen.writeln('');
+  }
+
+  void generateListAssert(DartGenerator gen) {
+    gen.writeln('List<vms.${name}> '
+        'assert${namePlural}(List<vms.${name}> list) {');
+    gen.writeln('for (vms.${name} elem in list) {');
+    gen.writeln('assert${name}(elem);');
+    gen.writeln('}');
+    gen.writeln('return list;');
+    gen.writeln('}');
+    gen.writeln('');
+  }
+
+  void _parse(Token token) {
+    new TypeParser(token).parseInto(this);
+  }
+
+  void calculateFieldOverrides() {
+    for (TypeField field in fields.toList()) {
+      if (superName == null) continue;
+
+      if (getSuper().hasField(field.name)) {
+        field.setOverrides();
+      }
+    }
+  }
+
+  bool hasField(String name) {
+    if (fields.any((field) => field.name == name)) return true;
+    return getSuper()?.hasField(name) ?? false;
+  }
+}
+
+class TypeField extends Member {
+  static final Map<String, String> _nameRemap = {
+    'const': 'isConst',
+    'final': 'isFinal',
+    'static': 'isStatic',
+    'abstract': 'isAbstract',
+    'super': 'superClass',
+    'class': 'classRef',
+    'new': 'new_',
+  };
+
+  final Type parent;
+  final String _docs;
+  MemberType type = new MemberType();
+  String name;
+  bool optional = false;
+  String defaultValue;
+  bool overrides = false;
+
+  TypeField(this.parent, this._docs);
+
+  void setOverrides() {
+    overrides = true;
+  }
+
+  String get docs {
+    String str = _docs == null ? '' : _docs;
+    if (type.isMultipleReturns) {
+      str += '\n\n[${generatableName}] can be one of '
+          '${joinLast(type.types.map((t) => '[${t}]'), ', ', ' or ')}.';
+      str = str.trim();
+    }
+    return str;
+  }
+
+  String get generatableName {
+    return _nameRemap[name] != null ? _nameRemap[name] : name;
+  }
+
+  void generate(DartGenerator gen) {
+    if (docs.isNotEmpty) gen.writeDocs(docs);
+    if (optional) gen.write('@optional ');
+    if (overrides) gen.write('@override ');
+    String typeName =
+        api.isEnumName(type.name) ? '/*${type.name}*/ String' : type.name;
+    gen.writeStatement('${typeName} ${generatableName};');
+    if (parent.fields.any((field) => field.hasDocs)) gen.writeln();
+  }
+}
+
+class Enum extends Member {
+  final String name;
+  final String docs;
+
+  List<EnumValue> enums = [];
+
+  Enum(this.name, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  Enum._(this.name, this.docs);
+
+  factory Enum.merge(Enum e1, Enum e2) {
+    final String name = e1.name;
+    final String docs = [e1.docs, e2.docs].where((e) => e != null).join('\n');
+    final Map<String, EnumValue> map = <String, EnumValue>{};
+    for (EnumValue e in e2.enums.reversed) {
+      map[e.name] = e;
+    }
+    // The official service.md is the default
+    for (EnumValue e in e1.enums.reversed) {
+      map[e.name] = e;
+    }
+
+    final enums = map.values.toList().reversed.toList();
+
+    return new Enum._(name, docs)..enums = enums;
+  }
+
+  String get prefix =>
+      name.endsWith('Kind') ? name.substring(0, name.length - 4) : name;
+
+  void generate(DartGenerator gen) {
+    gen.writeln();
+    if (docs != null) gen.writeDocs(docs);
+    gen.writeStatement('class ${name} {');
+    gen.writeStatement('${name}._();');
+    gen.writeln();
+    enums.forEach((e) => e.generate(gen));
+    gen.writeStatement('}');
+  }
+
+  void generateAssert(DartGenerator gen) {
+    gen.writeln('String assert${name}(String obj) {');
+    List<EnumValue> sorted = enums.toList()
+      ..sort((EnumValue e1, EnumValue e2) => e1.name.compareTo(e2.name));
+    for (EnumValue value in sorted) {
+      gen.writeln('  if (obj == "${value.name}") return obj;');
+    }
+    gen.writeln('  throw "invalid ${name}: \$obj";');
+    gen.writeln('}');
+    gen.writeln('');
+  }
+
+  void _parse(Token token) {
+    new EnumParser(token).parseInto(this);
+  }
+}
+
+class EnumValue extends Member {
+  final Enum parent;
+  final String name;
+  final String docs;
+
+  EnumValue(this.parent, this.name, [this.docs]);
+
+  bool get isLast => parent.enums.last == this;
+
+  void generate(DartGenerator gen) {
+    if (docs != null) gen.writeDocs(docs);
+    gen.writeStatement("static const String k${name} = '${name}';");
+  }
+}
+
+class TextOutputVisitor implements NodeVisitor {
+  static String printText(Node node) {
+    TextOutputVisitor visitor = new TextOutputVisitor();
+    node.accept(visitor);
+    return visitor.toString();
+  }
+
+  StringBuffer buf = new StringBuffer();
+  bool _em = false;
+  bool _href = false;
+  bool _blockquote = false;
+
+  TextOutputVisitor();
+
+  bool visitElementBefore(Element element) {
+    if (element.tag == 'em' || element.tag == 'code') {
+      buf.write('`');
+      _em = true;
+    } else if (element.tag == 'p') {
+      // Nothing to do.
+    } else if (element.tag == 'blockquote') {
+      buf.write('```\n');
+      _blockquote = true;
+    } else if (element.tag == 'a') {
+      _href = true;
+    }
+
+    return true;
+  }
+
+  void visitText(Text text) {
+    String t = text.text;
+    if (_em) {
+      t = _coerceRefType(t);
+    } else if (_href) {
+      t = '[${_coerceRefType(t)}]';
+    }
+
+    if (_blockquote) {
+      buf.write('${t}\n```');
+    } else {
+      buf.write(t);
+    }
+  }
+
+  void visitElementAfter(Element element) {
+    if (element.tag == 'em' || element.tag == 'code') {
+      buf.write('`');
+      _em = false;
+    } else if (element.tag == 'p') {
+      buf.write('\n\n');
+    } else if (element.tag == 'blockquote') {
+      //buf.write('```\n');
+      _blockquote = false;
+    } else if (element.tag == 'a') {
+      _href = false;
+    } else {
+      print('             </${element.tag}>');
+      buf.write(renderToHtml([element]));
+    }
+  }
+
+  String toString() => buf.toString().trim();
+}
+
+// @Instance|@Error|Sentinel evaluate(
+//     string isolateId,
+//     string targetId [optional],
+//     string expression)
+class MethodParser extends Parser {
+  MethodParser(Token startToken) : super(startToken);
+
+  void parseInto(Method method) {
+    // method is return type, name, (, args )
+    // args is type name, [optional], comma
+
+    method.returnType.parse(this);
+
+    Token t = expectName();
+    validate(
+        t.text == method.name, 'method name ${method.name} equals ${t.text}');
+
+    expect('(');
+
+    while (peek().text != ')') {
+      Token type = expectName();
+      TypeRef ref = new TypeRef(_coerceRefType(type.text));
+      if (peek().text == '[') {
+        while (consume('[')) {
+          expect(']');
+          ref.arrayDepth++;
+        }
+      } else if (peek().text == '<') {
+        // handle generics
+        expect('<');
+        ref.genericTypes = [];
+        while (peek().text != '>') {
+          Token genericTypeName = expectName();
+          ref.genericTypes
+              .add(new TypeRef(_coerceRefType(genericTypeName.text)));
+          consume(',');
+        }
+        expect('>');
+      }
+
+      Token name = expectName();
+      MethodArg arg = new MethodArg(method, ref, name.text);
+      if (consume('[')) {
+        expect('optional');
+        expect(']');
+        arg.optional = true;
+      }
+      method.args.add(arg);
+      consume(',');
+    }
+
+    expect(')');
+
+    method.args.sort((MethodArg a, MethodArg b) {
+      if (!a.optional && b.optional) return -1;
+      if (a.optional && !b.optional) return 1;
+      return 0;
+    });
+  }
+}
+
+class TypeParser extends Parser {
+  TypeParser(Token startToken) : super(startToken);
+
+  void parseInto(Type type) {
+    // class ClassList extends Response {
+    //   // Docs here.
+    //   @Class[] classes [optional];
+    // }
+    expect('class');
+
+    Token t = expectName();
+    type.rawName = t.text;
+    type.name = _coerceRefType(type.rawName);
+    if (consume('extends')) {
+      t = expectName();
+      type.superName = _coerceRefType(t.text);
+    }
+
+    expect('{');
+
+    while (peek().text != '}') {
+      TypeField field = new TypeField(type, collectComments());
+      field.type.parse(this);
+      field.name = expectName().text;
+      if (consume('[')) {
+        expect('optional');
+        expect(']');
+        field.optional = true;
+      }
+      type.fields.add(field);
+      expect(';');
+    }
+
+    expect('}');
+  }
+}
+
+class EnumParser extends Parser {
+  EnumParser(Token startToken) : super(startToken);
+
+  void parseInto(Enum e) {
+    // enum ErrorKind { UnhandledException, Foo, Bar }
+    // enum name { (comment* name ,)+ }
+    expect('enum');
+
+    Token t = expectName();
+    validate(t.text == e.name, 'enum name ${e.name} equals ${t.text}');
+    expect('{');
+
+    while (!t.eof) {
+      if (consume('}')) break;
+      String docs = collectComments();
+      t = expectName();
+      consume(',');
+
+      e.enums.add(new EnumValue(e, t.text, docs));
+    }
+  }
+}
diff --git a/pkg/vm_service/tool/dart/src_gen_dart.dart b/pkg/vm_service/tool/dart/src_gen_dart.dart
new file mode 100644
index 0000000..7028094
--- /dev/null
+++ b/pkg/vm_service/tool/dart/src_gen_dart.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library to generate Dart source code.
+library src_gen_dart;
+
+import '../common/src_gen_common.dart';
+
+/// A class used to generate Dart source code. This class facilitates writing out
+/// dartdoc comments, automatically manages indent by counting curly braces, and
+/// automatically wraps doc comments on 80 char column boundaries.
+class DartGenerator {
+  static const DEFAULT_COLUMN_BOUNDARY = 80;
+
+  final int colBoundary;
+
+  String _indent = "";
+  final StringBuffer _buf = new StringBuffer();
+
+  bool _previousWasEol = false;
+
+  DartGenerator({this.colBoundary = DEFAULT_COLUMN_BOUNDARY});
+
+  /// Write out the given dartdoc text, wrapping lines as necessary to flow
+  /// along the column boundary. If [preferSingle] is true, and the docs would
+  /// fit on a single line, use `///` dartdoc style.
+  void writeDocs(String docs) {
+    if (docs == null) return;
+
+    docs = wrap(docs.trim(), colBoundary - _indent.length - 4);
+    // docs = docs.replaceAll('*/', '/');
+    // docs = docs.replaceAll('/*', r'/\*');
+
+    docs.split('\n').forEach((line) => _writeln('/// ${line}'.trimRight()));
+
+    // if (!docs.contains('\n') && preferSingle) {
+    //   _writeln("/// ${docs}", true);
+    // } else {
+    //   _writeln("/**", true);
+    //   _writeln(" * ${docs.replaceAll("\n", "\n * ")}", true);
+    //   _writeln(" */", true);
+    // }
+  }
+
+  /// Write out the given Dart statement and terminate it with an eol. If the
+  /// statement will overflow the column boundary, attempt to wrap it at
+  /// reasonable places.
+  void writeStatement(String str) {
+    if (_indent.length + str.length > colBoundary) {
+      // Split the line on the first '('. Currently, we don't do anything
+      // fancier then that. This takes the edge off the long lines.
+      int index = str.indexOf('(');
+
+      if (index == -1) {
+        writeln(str);
+      } else {
+        writeln(str.substring(0, index + 1));
+        writeln("    ${str.substring(index + 1)}");
+      }
+    } else {
+      writeln(str);
+    }
+  }
+
+  void writeln([String str = ""]) => _write("${str}\n");
+
+  void write(String str) => _write(str);
+
+  void out(String str) => _buf.write(str);
+
+  void _writeln([String str = "", bool ignoreCurlies = false]) =>
+      _write("${str}\n", ignoreCurlies);
+
+  void _write(String str, [bool ignoreCurlies = false]) {
+    for (final int rune in str.runes) {
+      if (!ignoreCurlies) {
+        if (rune == RUNE_LEFT_CURLY) {
+          _indent = "${_indent}  ";
+        } else if (rune == RUNE_RIGHT_CURLY && _indent.length >= 2) {
+          _indent = _indent.substring(2);
+        }
+      }
+
+      if (_previousWasEol && rune != RUNE_EOL) {
+        _buf.write(_indent);
+      }
+
+      _buf.write(new String.fromCharCode(rune));
+
+      _previousWasEol = rune == RUNE_EOL;
+    }
+  }
+
+  String toString() => _buf.toString();
+}
diff --git a/pkg/vm_service/tool/generate.dart b/pkg/vm_service/tool/generate.dart
new file mode 100644
index 0000000..151814f
--- /dev/null
+++ b/pkg/vm_service/tool/generate.dart
@@ -0,0 +1,153 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+
+import 'package:markdown/markdown.dart';
+import 'package:path/path.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+import 'common/generate_common.dart';
+import 'dart/generate_dart.dart' as dart show Api, api, DartGenerator;
+import 'java/generate_java.dart' as java show Api, api, JavaGenerator;
+
+final bool _stampPubspecVersion = false;
+
+/// Parse the 'service.md' into a model and generate both Dart and Java
+/// libraries.
+main(List<String> args) async {
+  String appDirPath = dirname(Platform.script.toFilePath());
+
+  // Parse service.md into a model.
+  var file = new File(
+      normalize(join(appDirPath, '../../../runtime/vm/service/service.md')));
+  var document = new Document();
+  StringBuffer buf = new StringBuffer(file.readAsStringSync());
+  var nodes = document.parseLines(buf.toString().split('\n'));
+  print('Parsed ${file.path}.');
+  print('Service protocol version ${ApiParseUtil.parseVersionString(nodes)}.');
+
+  // Generate code from the model.
+  print('');
+
+  await _generateDart(appDirPath, nodes);
+  await _generateJava(appDirPath, nodes);
+  await _generateAsserts(appDirPath, nodes);
+}
+
+_generateDart(String appDirPath, List<Node> nodes) async {
+  var outDirPath = normalize(join(appDirPath, '..', 'lib'));
+  var outDir = new Directory(outDirPath);
+  if (!outDir.existsSync()) outDir.createSync(recursive: true);
+  var outputFile = new File(join(outDirPath, 'vm_service.dart'));
+  var generator = new dart.DartGenerator();
+  dart.api = new dart.Api();
+  dart.api.parse(nodes);
+  dart.api.generate(generator);
+  outputFile.writeAsStringSync(generator.toString());
+  Process.runSync('dartfmt', ['-w', outDirPath]);
+
+  if (_stampPubspecVersion) {
+    // Update the pubspec file.
+    Version version = ApiParseUtil.parseVersionSemVer(nodes);
+    _stampPubspec(version);
+
+    // Validate that the changelog contains an entry for the current version.
+    _checkUpdateChangelog(version);
+  }
+
+  print('Wrote Dart to ${outputFile.path}.');
+}
+
+_generateJava(String appDirPath, List<Node> nodes) async {
+  var srcDirPath = normalize(join(appDirPath, '..', 'java', 'src'));
+  var generator = new java.JavaGenerator(srcDirPath);
+  java.api = new java.Api();
+  java.api.parse(nodes);
+  java.api.generate(generator);
+
+  // We generate files into the java/src/ folder; ensure the generated files
+  // aren't committed to git (but manually maintained files in the same
+  // directory are).
+  List<String> generatedPaths = generator.allWrittenFiles
+      .map((path) => relative(path, from: 'java'))
+      .toList();
+  generatedPaths.sort();
+  File gitignoreFile = new File(join(appDirPath, '..', 'java', '.gitignore'));
+  gitignoreFile.writeAsStringSync('''
+# This is a generated file.
+
+${generatedPaths.join('\n')}
+''');
+
+  // Generate a version file.
+  Version version = ApiParseUtil.parseVersionSemVer(nodes);
+  File file = new File(join('java', 'version.properties'));
+  file.writeAsStringSync('version=${version.major}.${version.minor}\n');
+
+  print('Wrote Java to $srcDirPath.');
+}
+
+_generateAsserts(String appDirPath, List<Node> nodes) async {
+  var outDirPath = normalize(join(appDirPath, '..', 'example'));
+  var outDir = new Directory(outDirPath);
+  if (!outDir.existsSync()) outDir.createSync(recursive: true);
+  var outputFile = new File(join(outDirPath, 'vm_service_assert.dart'));
+  var generator = new dart.DartGenerator();
+  dart.api = new dart.Api();
+  dart.api.parse(nodes);
+  dart.api.generateAsserts(generator);
+  outputFile.writeAsStringSync(generator.toString());
+  Process.runSync('dartfmt', ['-w', outDirPath]);
+
+  if (_stampPubspecVersion) {
+    // Update the pubspec file.
+    Version version = ApiParseUtil.parseVersionSemVer(nodes);
+    _stampPubspec(version);
+
+    // Validate that the changelog contains an entry for the current version.
+    _checkUpdateChangelog(version);
+  }
+
+  print('Wrote Dart to ${outputFile.path}.');
+}
+
+// Push the major and minor versions into the pubspec.
+void _stampPubspec(Version version) {
+  final String pattern = 'version: ';
+  File file = new File('pubspec.yaml');
+  String text = file.readAsStringSync();
+  bool found = false;
+
+  text = text.split('\n').map((line) {
+    if (line.startsWith(pattern)) {
+      found = true;
+      Version v = new Version.parse(line.substring(pattern.length));
+      String pre = v.preRelease.isEmpty ? null : v.preRelease.join('-');
+      String build = v.build.isEmpty ? null : v.build.join('+');
+      v = new Version(version.major, version.minor, v.patch,
+          pre: pre, build: build);
+      return '${pattern}${v.toString()}';
+    } else {
+      return line;
+    }
+  }).join('\n');
+
+  if (!found) throw '`${pattern}` not found';
+
+  file.writeAsStringSync(text);
+}
+
+void _checkUpdateChangelog(Version version) {
+  // Look for `## major.minor`.
+  String check = '## ${version.major}.${version.minor}';
+
+  File file = new File('CHANGELOG.md');
+  String text = file.readAsStringSync();
+  bool containsReleaseNotes =
+      text.split('\n').any((line) => line.startsWith(check));
+  if (!containsReleaseNotes) {
+    throw '`${check}` not found in the CHANGELOG.md file';
+  }
+}
diff --git a/pkg/vm_service/tool/java/generate_java.dart b/pkg/vm_service/tool/java/generate_java.dart
new file mode 100644
index 0000000..1039f87
--- /dev/null
+++ b/pkg/vm_service/tool/java/generate_java.dart
@@ -0,0 +1,1160 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library generate_vm_service_java;
+
+import 'package:markdown/markdown.dart';
+import 'package:pub_semver/pub_semver.dart';
+
+import '../common/generate_common.dart';
+import '../common/parser.dart';
+import '../common/src_gen_common.dart';
+import 'src_gen_java.dart';
+
+export 'src_gen_java.dart' show JavaGenerator;
+
+const String servicePackage = 'org.dartlang.vm.service';
+
+const List<String> simpleTypes = const [
+  'BigDecimal',
+  'boolean',
+  'int',
+  'String',
+  'double'
+];
+
+const vmServiceJavadoc = '''
+{@link VmService} allows control of and access to information in a running
+Dart VM instance.
+<br/>
+Launch the Dart VM with the arguments:
+<pre>
+--pause_isolates_on_start
+--observe
+--enable-vm-service=some-port
+</pre>
+where <strong>some-port</strong> is a port number of your choice
+which this client will use to communicate with the Dart VM.
+See https://www.dartlang.org/tools/dart-vm/ for more details.
+Once the VM is running, instantiate a new {@link VmService}
+to connect to that VM via {@link VmService#connect(String)}
+or {@link VmService#localConnect(int)}.
+<br/>
+{@link VmService} is not thread safe and should only be accessed from
+a single thread. In addition, a given VM should only be accessed from
+a single instance of {@link VmService}.
+<br/>
+Calls to {@link VmService} should not be nested.
+More specifically, you should not make any calls to {@link VmService}
+from within any {@link Consumer} method.
+''';
+
+Api api;
+
+/// Convert documentation references
+/// from spec style of [className] to javadoc style {@link className}
+String convertDocLinks(String doc) {
+  if (doc == null) return null;
+  var sb = new StringBuffer();
+  int start = 0;
+  int end = doc.indexOf('[');
+  while (end != -1) {
+    sb.write(doc.substring(start, end));
+    start = end;
+    end = doc.indexOf(']', start);
+    if (end == -1) break;
+    if (end == start + 1) {
+      sb.write('[]');
+    } else {
+      sb.write('{@link ');
+      sb.write(doc.substring(start + 1, end));
+      sb.write('}');
+    }
+    start = end + 1;
+    end = doc.indexOf('[', start);
+  }
+  sb.write(doc.substring(start));
+  return sb.toString();
+}
+
+String _coerceRefType(String typeName) {
+  if (typeName == 'Class') typeName = 'ClassObj';
+  if (typeName == 'Error') typeName = 'ErrorObj';
+  if (typeName == 'Object') typeName = 'Obj';
+  if (typeName == '@Object') typeName = 'ObjRef';
+  if (typeName == 'Function') typeName = 'Func';
+  if (typeName == '@Function') typeName = 'FuncRef';
+  if (typeName.startsWith('@')) typeName = typeName.substring(1) + 'Ref';
+  if (typeName == 'string') typeName = 'String';
+  if (typeName == 'bool') typeName = 'boolean';
+  if (typeName == 'num') typeName = 'BigDecimal';
+  if (typeName == 'map') typeName = 'Map';
+  return typeName;
+}
+
+class Api extends Member with ApiParseUtil {
+  int serviceMajor;
+  int serviceMinor;
+  String serviceVersion;
+  List<Method> methods = [];
+  List<Enum> enums = [];
+  List<Type> types = [];
+  Map<String, List<String>> streamIdMap = {};
+
+  String get docs => null;
+
+  String get name => 'api';
+
+  void addProperty(String typeName, String propertyName, {String javadoc}) {
+    var t = types.firstWhere((t) => t.name == typeName);
+    for (var f in t.fields) {
+      if (f.name == propertyName) {
+        print('$typeName already has $propertyName field');
+        return;
+      }
+    }
+    var f = new TypeField(t, javadoc);
+    f.name = propertyName;
+    f.type = new MemberType();
+    f.type.types = [new TypeRef('String')];
+    t.fields.add(f);
+    print('added $propertyName field to $typeName');
+  }
+
+  void generate(JavaGenerator gen) {
+    _setFileHeader();
+
+    // Set default value for unspecified property
+    setDefaultValue('Instance', 'valueAsStringIsTruncated');
+    setDefaultValue('InstanceRef', 'valueAsStringIsTruncated');
+
+    // Hack to populate method argument docs
+    for (var m in methods) {
+      for (var a in m.args) {
+        if (a.hasDocs) continue;
+        var t = types.firstWhere((Type t) => t.name == a.type.name,
+            orElse: () => null);
+        if (t != null) {
+          a.docs = t.docs;
+          continue;
+        }
+        var e = enums.firstWhere((Enum e) => e.name == a.type.name,
+            orElse: () => null);
+        if (e != null) {
+          a.docs = e.docs;
+          continue;
+        }
+      }
+    }
+
+    gen.writeType('$servicePackage.VmService', (TypeWriter writer) {
+      writer.addImport('com.google.gson.JsonArray');
+      writer.addImport('com.google.gson.JsonObject');
+      writer.addImport('com.google.gson.JsonPrimitive');
+      writer.addImport('java.util.List');
+
+      writer.addImport('$servicePackage.consumer.*');
+      writer.addImport('$servicePackage.element.*');
+      writer.javadoc = vmServiceJavadoc;
+      writer.superclassName = '$servicePackage.VmServiceBase';
+
+      for (String streamId in streamIdMap.keys.toList()..sort()) {
+        String alias = streamId.toUpperCase();
+        while (alias.startsWith('_')) {
+          alias = alias.substring(1);
+        }
+        writer.addField('${alias}_STREAM_ID', 'String',
+            modifiers: 'public static final', value: '"$streamId"');
+      }
+
+      writer.addField('versionMajor', 'int',
+          modifiers: 'public static final',
+          value: '$serviceMajor',
+          javadoc:
+              'The major version number of the protocol supported by this client.');
+      writer.addField('versionMinor', 'int',
+          modifiers: 'public static final',
+          value: '$serviceMinor',
+          javadoc:
+              'The minor version number of the protocol supported by this client.');
+      for (var m in methods) {
+        m.generateVmServiceMethod(writer);
+        if (m.hasOptionalArgs) {
+          m.generateVmServiceMethod(writer, includeOptional: true);
+        }
+      }
+
+      writer.addMethod('forwardResponse', [
+        new JavaMethodArg('consumer', 'Consumer'),
+        new JavaMethodArg('responseType', 'String'),
+        new JavaMethodArg('json', 'JsonObject')
+      ], (StatementWriter writer) {
+        var generatedForwards = new Set<String>();
+
+        var sorted = methods.toList()
+          ..sort((m1, m2) {
+            return m1.consumerTypeName.compareTo(m2.consumerTypeName);
+          });
+        for (var m in sorted) {
+          if (generatedForwards.add(m.consumerTypeName)) {
+            m.generateVmServiceForward(writer);
+          }
+        }
+        writer.addLine('if (consumer instanceof ServiceExtensionConsumer) {');
+        writer
+            .addLine('  ((ServiceExtensionConsumer) consumer).received(json);');
+        writer.addLine('  return;');
+        writer.addLine('}');
+        writer.addLine('logUnknownResponse(consumer, json);');
+      }, modifiers: null, isOverride: true);
+
+      writer.addMethod("convertMapToJsonObject", [
+        new JavaMethodArg('map', 'Map<String, String>')
+      ], (StatementWriter writer) {
+        writer.addLine('JsonObject obj = new JsonObject();');
+        writer.addLine('for (String key : map.keySet()) {');
+        writer.addLine('  obj.addProperty(key, map.get(key));');
+        writer.addLine('}');
+        writer.addLine('return obj;');
+      }, modifiers: "private", returnType: "JsonObject");
+
+      writer.addMethod(
+          "convertIterableToJsonArray", [new JavaMethodArg('list', 'Iterable')],
+          (StatementWriter writer) {
+        writer.addLine('JsonArray arr = new JsonArray();');
+        writer.addLine('for (Object element : list) {');
+        writer.addLine('  arr.add(new JsonPrimitive(element.toString()));');
+        writer.addLine('}');
+        writer.addLine('return arr;');
+      }, modifiers: "private", returnType: "JsonArray");
+    });
+
+    for (var m in methods) {
+      m.generateConsumerInterface(gen);
+    }
+    for (var t in types) {
+      t.generateElement(gen);
+    }
+    for (var e in enums) {
+      e.generateEnum(gen);
+    }
+  }
+
+  Type getType(String name) =>
+      types.firstWhere((t) => t.name == name, orElse: () => null);
+
+  bool isEnumName(String typeName) => enums.any((Enum e) => e.name == typeName);
+
+  void parse(List<Node> nodes) {
+    Version version = ApiParseUtil.parseVersionSemVer(nodes);
+    serviceMajor = version.major;
+    serviceMinor = version.minor;
+    serviceVersion = '$serviceMajor.$serviceMinor';
+
+    // Look for h3 nodes
+    // the pre following it is the definition
+    // the optional p following that is the documentation
+
+    String h3Name;
+
+    for (int i = 0; i < nodes.length; i++) {
+      Node node = nodes[i];
+
+      if (isPre(node) && h3Name != null) {
+        String definition = textForCode(node);
+        String docs;
+
+        if (i + 1 < nodes.length && isPara(nodes[i + 1])) {
+          Element p = nodes[++i];
+          docs = collapseWhitespace(TextOutputVisitor.printText(p));
+        }
+
+        _parse(h3Name, definition, docs);
+      } else if (isH3(node)) {
+        h3Name = textForElement(node);
+      } else if (isHeader(node)) {
+        h3Name = null;
+      } else if (isPara(node)) {
+        var children = (node as Element).children;
+        if (children.isNotEmpty && children.first is Text) {
+          var text = children.expand<String>((child) {
+            if (child is Text) return [child.text];
+            return [];
+          }).join();
+          if (text.startsWith('streamId |')) {
+            _parseStreamIds(text);
+          }
+        }
+      }
+    }
+    for (Type type in types) {
+      type.calculateFieldOverrides();
+    }
+  }
+
+  void setDefaultValue(String typeName, String propertyName) {
+    var type = types.firstWhere((t) => t.name == typeName);
+    var field = type.fields.firstWhere((f) => f.name == propertyName);
+    field.defaultValue = 'false';
+  }
+
+  void _parse(String name, String definition, [String docs]) {
+    name = name.trim();
+    definition = definition.trim();
+    // clean markdown introduced changes
+    definition = definition.replaceAll('&lt;', '<').replaceAll('&gt;', '>');
+    if (docs != null) docs = docs.trim();
+
+    if (definition.startsWith('class ')) {
+      types.add(new Type(this, name, definition, docs));
+    } else if (name.substring(0, 1).toLowerCase() == name.substring(0, 1)) {
+      methods.add(new Method(name, definition, docs));
+    } else if (definition.startsWith('enum ')) {
+      enums.add(new Enum(name, definition, docs));
+    } else {
+      throw 'unexpected entity: ${name}, ${definition}';
+    }
+  }
+
+  void _parseStreamIds(String text) {
+    for (String line in text.split('\n')) {
+      if (line.startsWith('streamId |')) continue;
+      if (line.startsWith('---')) continue;
+      var index = line.indexOf('|');
+      var streamId = line.substring(0, index).trim();
+      List<String> eventTypes = new List.from(
+          line.substring(index + 1).split(',').map((t) => t.trim()));
+      eventTypes.sort();
+      streamIdMap[streamId] = eventTypes;
+    }
+  }
+
+  void _setFileHeader() {
+    fileHeader = r'''/*
+ * Copyright (c) 2015, the Dart project authors.
+ *
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except
+ * in compliance with the License. You may obtain a copy of the License at
+ *
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Unless required by applicable law or agreed to in writing, software distributed under the License
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+ * or implied. See the License for the specific language governing permissions and limitations under
+ * the License.
+ */
+''';
+  }
+
+  static String printNode(Node n) {
+    if (n is Text) {
+      return n.text;
+    } else if (n is Element) {
+      if (n.tag != 'h3') return n.tag;
+      return '${n.tag}:[${n.children.map((c) => printNode(c)).join(', ')}]';
+    } else {
+      return '${n}';
+    }
+  }
+}
+
+class Enum extends Member {
+  final String name;
+  final String docs;
+
+  List<EnumValue> enums = [];
+
+  Enum(this.name, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  Enum._(this.name, this.docs);
+
+  String get elementTypeName => '$servicePackage.element.$name';
+
+  void generateEnum(JavaGenerator gen) {
+    gen.writeType(elementTypeName, (TypeWriter writer) {
+      writer.javadoc = convertDocLinks(docs);
+      writer.isEnum = true;
+      enums.sort((v1, v2) => v1.name.compareTo(v2.name));
+      for (var value in enums) {
+        writer.addEnumValue(value.name, javadoc: value.docs);
+      }
+      writer.addEnumValue('Unknown',
+          javadoc: 'Represents a value returned by the VM'
+              ' but unknown to this client.',
+          isLast: true);
+    });
+  }
+
+  void _parse(Token token) {
+    new EnumParser(token).parseInto(this);
+  }
+}
+
+class EnumParser extends Parser {
+  EnumParser(Token startToken) : super(startToken);
+
+  void parseInto(Enum e) {
+    // enum ErrorKind { UnhandledException, Foo, Bar }
+    // enum name { (comment* name ,)+ }
+    expect('enum');
+
+    Token t = expectName();
+    validate(t.text == e.name, 'enum name ${e.name} equals ${t.text}');
+    expect('{');
+
+    while (!t.eof) {
+      if (consume('}')) break;
+      String docs = collectComments();
+      t = expectName();
+      consume(',');
+
+      e.enums.add(new EnumValue(e, t.text, docs));
+    }
+  }
+}
+
+class EnumValue extends Member {
+  final Enum parent;
+  final String name;
+  final String docs;
+
+  EnumValue(this.parent, this.name, [this.docs]);
+
+  bool get isLast => parent.enums.last == this;
+}
+
+abstract class Member {
+  String get docs => null;
+
+  bool get hasDocs => docs != null;
+
+  String get name;
+
+  String toString() => name;
+}
+
+class MemberType extends Member {
+  List<TypeRef> types = [];
+
+  MemberType();
+
+  bool get hasSentinel => types.any((t) => t.name == 'Sentinel');
+
+  bool get isEnum => types.length == 1 && api.isEnumName(types.first.name);
+
+  bool get isMultipleReturns => types.length > 1;
+
+  bool get isSimple => types.length == 1 && types.first.isSimple;
+
+  bool get isValueAndSentinel => types.length == 2 && hasSentinel;
+
+  String get name {
+    if (types.isEmpty) return '';
+    if (types.length == 1) return types.first.ref;
+    return 'dynamic';
+  }
+
+  TypeRef get valueType {
+    if (types.length == 1) return types.first;
+    if (isValueAndSentinel) {
+      return types.firstWhere((t) => t.name != 'Sentinel');
+    }
+    return null;
+  }
+
+  void parse(Parser parser) {
+    // foo|bar[]|baz
+    // (@Instance|Sentinel)[]
+    bool loop = true;
+    bool isMulti = false;
+
+    while (loop) {
+      parser.consume('(');
+      Token t = parser.expectName();
+      if (parser.consume(')')) isMulti = true;
+      TypeRef ref = new TypeRef(_coerceRefType(t.text));
+      types.add(ref);
+
+      while (parser.consume('[')) {
+        parser.expect(']');
+        if (isMulti) {
+          types.forEach((t) => t.arrayDepth++);
+        } else {
+          ref.arrayDepth++;
+        }
+      }
+
+      loop = parser.consume('|');
+    }
+  }
+}
+
+class Method extends Member {
+  final String name;
+  final String docs;
+
+  MemberType returnType = new MemberType();
+  List<MethodArg> args = [];
+
+  Method(this.name, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  String get consumerTypeName {
+    String prefix;
+    if (returnType.isMultipleReturns) {
+      prefix = titleCase(name);
+    } else {
+      prefix = returnType.types.first.javaBoxedName;
+    }
+    return '$servicePackage.consumer.${prefix}Consumer';
+  }
+
+  bool get hasArgs => args.isNotEmpty;
+
+  bool get hasOptionalArgs => args.any((MethodArg arg) => arg.optional);
+
+  void generateConsumerInterface(JavaGenerator gen) {
+    gen.writeType(consumerTypeName, (TypeWriter writer) {
+      writer.javadoc = convertDocLinks(returnType.docs);
+      writer.interfaceNames.add('$servicePackage.consumer.Consumer');
+      writer.isInterface = true;
+      for (var t in returnType.types) {
+        writer.addImport(t.elementTypeName);
+        writer.addMethod("received",
+            [new JavaMethodArg('response', t.elementTypeName)], null);
+      }
+    });
+  }
+
+  void generateVmServiceForward(StatementWriter writer) {
+    var consumerName = classNameFor(consumerTypeName);
+    writer.addLine('if (consumer instanceof $consumerName) {');
+    List<Type> types = new List.from(returnType.types.map((ref) => ref.type));
+    for (int index = 0; index < types.length; ++index) {
+      types.addAll(types[index].subtypes);
+    }
+    types.sort((t1, t2) => t1.name.compareTo(t2.name));
+    for (var t in types) {
+      var responseName = classNameFor(t.elementTypeName);
+      writer.addLine('  if (responseType.equals("${t.rawName}")) {');
+      writer.addLine(
+          '    (($consumerName) consumer).received(new $responseName(json));');
+      writer.addLine('    return;');
+      writer.addLine('  }');
+    }
+    writer.addLine('}');
+  }
+
+  void generateVmServiceMethod(TypeWriter writer, {includeOptional = false}) {
+    // TODO(danrubel) move this to the Consumer's javadoc
+//    String javadoc = docs == null ? '' : docs;
+//    if (returnType.isMultipleReturns) {
+//      javadoc += '\n\nThe return value can be one of '
+//          '${joinLast(returnType.types.map((t) => '[${t}]'), ', ', ' or ')}.';
+//      javadoc = javadoc.trim();
+//    }
+
+    // Update method docs
+    var javadoc = new StringBuffer(docs == null ? '' : docs);
+    bool firstParamDoc = true;
+    for (var a in args) {
+      if (!includeOptional && a.optional) continue;
+      var paramDoc = new StringBuffer(a.docs ?? '');
+      if (paramDoc.isEmpty) {}
+      if (a.optional) {
+        if (paramDoc.isNotEmpty) paramDoc.write(' ');
+        paramDoc.write('This parameter is optional and may be null.');
+      }
+      if (paramDoc.isNotEmpty) {
+        if (firstParamDoc) {
+          javadoc.writeln();
+          firstParamDoc = false;
+        }
+        javadoc.writeln('@param ${a.name} $paramDoc');
+      }
+    }
+
+    if (args.any((MethodArg arg) => (arg.type.name == 'Map'))) {
+      writer.addImport('java.util.Map');
+    }
+
+    List<MethodArg> mthArgs = args;
+    if (!includeOptional) {
+      mthArgs = mthArgs.toList()..removeWhere((a) => a.optional);
+    }
+
+    List<JavaMethodArg> javaMethodArgs =
+        new List.from(mthArgs.map((a) => a.asJavaMethodArg));
+    javaMethodArgs
+        .add(new JavaMethodArg('consumer', classNameFor(consumerTypeName)));
+    writer.addMethod(name, javaMethodArgs, (StatementWriter writer) {
+      writer.addLine('final JsonObject params = new JsonObject();');
+      for (MethodArg arg in args) {
+        if (!includeOptional && arg.optional) continue;
+        var name = arg.name;
+        String op = arg.optional ? 'if (${name} != null) ' : '';
+        if (arg.isEnumType) {
+          writer.addLine('${op}params.addProperty("$name", $name.name());');
+        } else if (arg.type.name == 'Map') {
+          writer.addLine(
+              '${op}params.add("$name", convertMapToJsonObject($name));');
+        } else if (arg.type.arrayDepth > 0) {
+          writer.addLine(
+              '${op}params.add("$name", convertIterableToJsonArray($name));');
+        } else {
+          writer.addLine('${op}params.addProperty("$name", $name);');
+        }
+      }
+      writer.addLine('request("$name", params, consumer);');
+    }, javadoc: javadoc.toString());
+  }
+
+  void _parse(Token token) {
+    new MethodParser(token).parseInto(this);
+  }
+}
+
+class MethodArg extends Member {
+  final Method parent;
+  final TypeRef type;
+  String name;
+  String docs;
+  bool optional = false;
+
+  MethodArg(this.parent, this.type, this.name);
+
+  get asJavaMethodArg {
+    if (optional && type.ref == 'int') {
+      return new JavaMethodArg(name, 'Integer');
+    }
+    if (optional && type.ref == 'double') {
+      return new JavaMethodArg(name, 'Double');
+    }
+    if (optional && type.ref == 'boolean') {
+      return new JavaMethodArg(name, 'Boolean');
+    }
+    return new JavaMethodArg(name, type.ref);
+  }
+
+  /// TODO: Hacked enum arg type determination
+  bool get isEnumType => name == 'step' || name == 'mode';
+}
+
+class MethodParser extends Parser {
+  MethodParser(Token startToken) : super(startToken);
+
+  void parseInto(Method method) {
+    // method is return type, name, (, args )
+    // args is type name, [optional], comma
+
+    method.returnType.parse(this);
+
+    Token t = expectName();
+    validate(
+        t.text == method.name, 'method name ${method.name} equals ${t.text}');
+
+    expect('(');
+
+    while (peek().text != ')') {
+      Token type = expectName();
+      TypeRef ref = new TypeRef(_coerceRefType(type.text));
+      if (peek().text == '[') {
+        while (consume('[')) {
+          expect(']');
+          ref.arrayDepth++;
+        }
+      } else if (peek().text == '<') {
+        // handle generics
+        expect('<');
+        ref.genericTypes = [];
+        while (peek().text != '>') {
+          Token genericTypeName = expectName();
+          ref.genericTypes
+              .add(new TypeRef(_coerceRefType(genericTypeName.text)));
+          consume(',');
+        }
+        expect('>');
+      }
+      Token name = expectName();
+      MethodArg arg = new MethodArg(method, ref, name.text);
+      if (consume('[')) {
+        expect('optional');
+        expect(']');
+        arg.optional = true;
+      }
+      method.args.add(arg);
+      consume(',');
+    }
+
+    expect(')');
+  }
+}
+
+class TextOutputVisitor implements NodeVisitor {
+  StringBuffer buf = new StringBuffer();
+
+  bool _inRef = false;
+
+  TextOutputVisitor();
+
+  String toString() => buf.toString().trim();
+
+  bool visitElementBefore(Element element) {
+    if (element.tag == 'em') {
+      buf.write('[');
+      _inRef = true;
+    } else if (element.tag == 'p') {
+      // Nothing to do.
+    } else if (element.tag == 'a') {
+      // Nothing to do - we're not writing out <a> refs (they won't resolve).
+    } else if (element.tag == 'code') {
+      buf.write(renderToHtml([element]));
+    } else {
+      print('unknown tag: ${element.tag}');
+      buf.write(renderToHtml([element]));
+    }
+
+    return true;
+  }
+
+  void visitText(Text text) {
+    String t = text.text;
+    if (_inRef) t = _coerceRefType(t);
+    buf.write(t);
+  }
+
+  void visitElementAfter(Element element) {
+    if (element.tag == 'em') {
+      buf.write(']');
+      _inRef = false;
+    } else if (element.tag == 'p') {
+      buf.write('\n\n');
+    }
+  }
+
+  static String printText(Node node) {
+    TextOutputVisitor visitor = new TextOutputVisitor();
+    node.accept(visitor);
+    return visitor.toString();
+  }
+}
+
+class Type extends Member {
+  final Api parent;
+  String rawName;
+  String name;
+  String superName;
+  final String docs;
+  List<TypeField> fields = [];
+
+  Type(this.parent, String categoryName, String definition, [this.docs]) {
+    _parse(new Tokenizer(definition).tokenize());
+  }
+
+  Type._(this.parent, this.rawName, this.name, this.superName, this.docs);
+
+  String get elementTypeName {
+    if (isSimple) return null;
+    return '$servicePackage.element.$name';
+  }
+
+  bool get isRef => name.endsWith('Ref');
+
+  bool get isResponse {
+    if (superName == null) return false;
+    if (name == 'Response' || superName == 'Response') return true;
+    return parent.getType(superName).isResponse;
+  }
+
+  bool get isSimple => simpleTypes.contains(name);
+
+  get jsonTypeName {
+    if (name == 'ClassObj') return 'Class';
+    if (name == 'ErrorObj') return 'Error';
+    return name;
+  }
+
+  Iterable<Type> get subtypes =>
+      api.types.toList()..retainWhere((t) => t.superName == name);
+
+  void generateElement(JavaGenerator gen) {
+    gen.writeType('$servicePackage.element.$name', (TypeWriter writer) {
+      if (fields.any((f) => f.type.types.any((t) => t.isArray))) {
+        writer.addImport('com.google.gson.JsonObject');
+      }
+      writer.addImport('com.google.gson.JsonObject');
+      writer.javadoc = convertDocLinks(docs);
+      writer.superclassName = superName ?? 'Element';
+      writer.addConstructor(<JavaMethodArg>[
+        new JavaMethodArg('json', 'com.google.gson.JsonObject')
+      ], (StatementWriter writer) {
+        writer.addLine('super(json);');
+      });
+
+      if (name == 'InstanceRef' || name == 'Instance') {
+        writer.addMethod(
+          'isNull',
+          [],
+          (StatementWriter writer) {
+            writer.addLine('return getKind() == InstanceKind.Null;');
+          },
+          returnType: 'boolean',
+          javadoc: 'Returns whether this instance represents null.',
+        );
+      }
+
+      for (var field in fields) {
+        field.generateAccessor(writer);
+      }
+    });
+  }
+
+  List<TypeField> getAllFields() {
+    if (superName == null) return fields;
+
+    List<TypeField> all = [];
+    all.insertAll(0, fields);
+
+    Type s = getSuper();
+    while (s != null) {
+      all.insertAll(0, s.fields);
+      s = s.getSuper();
+    }
+
+    return all;
+  }
+
+  Type getSuper() => superName == null ? null : api.getType(superName);
+
+  bool hasField(String name) {
+    if (fields.any((field) => field.name == name)) return true;
+    return getSuper()?.hasField(name) ?? false;
+  }
+
+  void _parse(Token token) {
+    new TypeParser(token).parseInto(this);
+  }
+
+  void calculateFieldOverrides() {
+    for (TypeField field in fields.toList()) {
+      if (superName == null) continue;
+
+      if (getSuper().hasField(field.name)) {
+        field.setOverrides();
+      }
+    }
+  }
+}
+
+// @Instance|@Error|Sentinel evaluate(
+//     string isolateId,
+//     string targetId [optional],
+//     string expression)
+class TypeField extends Member {
+  static final Map<String, String> _nameRemap = {
+    'const': 'isConst',
+    'final': 'isFinal',
+    'static': 'isStatic',
+    'abstract': 'isAbstract',
+    'super': 'superClass',
+    'class': 'classRef'
+  };
+
+  final Type parent;
+  final String _docs;
+  MemberType type = new MemberType();
+  String name;
+  bool optional = false;
+  String defaultValue;
+  bool overrides = false;
+
+  TypeField(this.parent, this._docs);
+
+  void setOverrides() {
+    overrides = true;
+  }
+
+  String get accessorName {
+    var remappedName = _nameRemap[name];
+    if (remappedName != null) {
+      if (remappedName.startsWith('is')) return remappedName;
+    } else {
+      remappedName = name;
+    }
+    return 'get${titleCase(remappedName)}';
+  }
+
+  String get docs {
+    String str = _docs == null ? '' : _docs;
+    if (type.isMultipleReturns) {
+      str += '\n\n@return one of '
+          '${joinLast(type.types.map((t) => '<code>${t}</code>'), ', ', ' or ')}';
+      str = str.trim();
+    }
+    if (optional) {
+      str += '\n\nCan return <code>null</code>.';
+      str = str.trim();
+    }
+    return str;
+  }
+
+  void generateAccessor(TypeWriter writer) {
+    if (type.isMultipleReturns && !type.isValueAndSentinel) {
+      writer.addMethod(accessorName, [], (StatementWriter w) {
+        w.addImport('com.google.gson.JsonObject');
+        w.addLine('final JsonObject elem = (JsonObject)json.get("$name");');
+        w.addLine('if (elem == null) return null;\n');
+        for (TypeRef t in type.types) {
+          String refName = t.name;
+          if (refName.endsWith('Ref')) {
+            refName = "@" + refName.substring(0, refName.length - 3);
+          }
+          w.addLine('if (elem.get("type").getAsString().equals("${refName}")) '
+              'return new ${t.name}(elem);');
+        }
+        w.addLine('return null;');
+      }, javadoc: docs, returnType: 'Object');
+    } else {
+      String returnType = type.valueType.ref;
+      if (name == 'timestamp') {
+        returnType = 'long';
+      }
+
+      writer.addMethod(
+        accessorName,
+        [],
+        (StatementWriter writer) {
+          type.valueType.generateAccessStatements(
+            writer,
+            name,
+            canBeSentinel: type.isValueAndSentinel,
+            defaultValue: defaultValue,
+            optional: optional,
+          );
+        },
+        javadoc: docs,
+        returnType: returnType,
+        isOverride: overrides,
+      );
+    }
+  }
+}
+
+class TypeParser extends Parser {
+  TypeParser(Token startToken) : super(startToken);
+
+  void parseInto(Type type) {
+    // class ClassList extends Response {
+    //   // Docs here.
+    //   @Class[] classes [optional];
+    // }
+    expect('class');
+
+    Token t = expectName();
+    type.rawName = t.text;
+    type.name = _coerceRefType(type.rawName);
+    if (consume('extends')) {
+      t = expectName();
+      type.superName = _coerceRefType(t.text);
+    }
+
+    expect('{');
+
+    while (peek().text != '}') {
+      TypeField field = new TypeField(type, collectComments());
+      field.type.parse(this);
+      field.name = expectName().text;
+      if (consume('[')) {
+        expect('optional');
+        expect(']');
+        field.optional = true;
+      }
+      type.fields.add(field);
+      expect(';');
+    }
+
+    expect('}');
+  }
+}
+
+class TypeRef {
+  String name;
+  int arrayDepth = 0;
+  List<TypeRef> genericTypes;
+
+  TypeRef(this.name);
+
+  String get elementTypeName {
+    if (isSimple) return null;
+    return '$servicePackage.element.$name';
+  }
+
+  bool get isArray => arrayDepth > 0;
+
+  /// Hacked enum determination
+  bool get isEnum => name.endsWith('Kind') || name.endsWith('Mode');
+
+  bool get isSimple => simpleTypes.contains(name);
+
+  String get javaBoxedName {
+    if (name == 'boolean') return 'Boolean';
+    if (name == 'int') return 'Integer';
+    if (name == 'double') return 'Double';
+    return name;
+  }
+
+  String get ref {
+    if (genericTypes != null) {
+      return '$name<${genericTypes.join(', ')}>';
+    } else if (isSimple) {
+      if (arrayDepth == 2) return 'List<List<${javaBoxedName}>>';
+      if (arrayDepth == 1) return 'List<${javaBoxedName}>';
+    } else {
+      if (arrayDepth == 2) return 'ElementList<ElementList<${javaBoxedName}>>';
+      if (arrayDepth == 1) return 'ElementList<${javaBoxedName}>';
+    }
+    return name;
+  }
+
+  Type get type => api.types.firstWhere((t) => t.name == name);
+
+  void generateAccessStatements(
+    StatementWriter writer,
+    String propertyName, {
+    bool canBeSentinel = false,
+    String defaultValue,
+    bool optional = false,
+  }) {
+    if (name == 'boolean') {
+      if (isArray) {
+        print('skipped accessor body for $propertyName');
+      } else {
+        if (defaultValue != null) {
+          writer.addImport('com.google.gson.JsonElement');
+          writer.addLine('final JsonElement elem = json.get("$propertyName");');
+          writer.addLine(
+              'return elem != null ? elem.getAsBoolean() : $defaultValue;');
+        } else if (optional) {
+          writer.addLine('return json.get("$propertyName") == null ? '
+              'false : json.get("$propertyName").getAsBoolean();');
+        } else {
+          writer.addLine('return json.get("$propertyName").getAsBoolean();');
+        }
+      }
+    } else if (name == 'int') {
+      if (arrayDepth > 1) {
+        writer.addImport('java.util.List');
+        writer.addLine('return getListListInt("$propertyName");');
+      } else if (arrayDepth == 1) {
+        writer.addImport('java.util.List');
+        writer.addLine('return getListInt("$propertyName");');
+      } else {
+        if (propertyName == 'timestamp') {
+          writer.addLine('return json.get("$propertyName") == null ? '
+              '-1 : json.get("$propertyName").getAsLong();');
+        } else {
+          writer.addLine('return json.get("$propertyName") == null ? '
+              '-1 : json.get("$propertyName").getAsInt();');
+        }
+      }
+    } else if (name == 'double') {
+      writer.addLine('return json.get("$propertyName") == null ? '
+          '0.0 : json.get("$propertyName").getAsDouble();');
+    } else if (name == 'BigDecimal') {
+      if (isArray) {
+        print('skipped accessor body for $propertyName');
+      } else {
+        writer.addImport('java.math.BigDecimal');
+        writer.addLine('return json.get("$propertyName").getAsBigDecimal();');
+      }
+    } else if (name == 'String') {
+      if (isArray) {
+        writer.addImport('java.util.List');
+        if (optional) {
+          writer.addLine('return json.get("$propertyName") == null ? '
+              'null : getListString("$propertyName");');
+        } else {
+          writer.addLine('return getListString("$propertyName");');
+        }
+      } else if (optional) {
+        writer.addLine('return json.get("$propertyName") == null ? '
+            'null : json.get("$propertyName").getAsString();');
+      } else {
+        writer.addLine('return json.get("$propertyName").getAsString();');
+      }
+    } else if (isEnum) {
+      if (isArray) {
+        print('skipped accessor body for $propertyName');
+      } else {
+        if (optional) {
+          writer.addLine('if (json.get("$propertyName") == null) return null;');
+          writer.addLine('');
+        }
+        writer.addImport('com.google.gson.JsonElement');
+        writer.addLine('final JsonElement value = json.get("$propertyName");');
+        writer.addLine('try {');
+        writer.addLine('  return value == null ? $name.Unknown'
+            ' : $name.valueOf(value.getAsString());');
+        writer.addLine('} catch (IllegalArgumentException e) {');
+        writer.addLine('  return $name.Unknown;');
+        writer.addLine('}');
+      }
+    } else {
+      if (arrayDepth > 1) {
+        print('skipped accessor body for $propertyName');
+      } else if (arrayDepth == 1) {
+        writer.addImport('com.google.gson.JsonArray');
+        if (optional) {
+          writer.addLine('if (json.get("$propertyName") == null) return null;');
+          writer.addLine('');
+        }
+        writer.addLine(
+            'return new ElementList<$javaBoxedName>(json.get("$propertyName").getAsJsonArray()) {');
+        writer.addLine('  @Override');
+        writer.addLine(
+            '  protected $javaBoxedName basicGet(JsonArray array, int index) {');
+        writer.addLine(
+            '    return new $javaBoxedName(array.get(index).getAsJsonObject());');
+        writer.addLine('  }');
+        writer.addLine('};');
+      } else {
+        if (canBeSentinel) {
+          writer.addImport('com.google.gson.JsonElement');
+          writer.addLine('final JsonElement elem = json.get("$propertyName");');
+          writer.addLine('if (!elem.isJsonObject()) return null;');
+          writer.addLine('final JsonObject child = elem.getAsJsonObject();');
+          writer
+              .addLine('final String type = child.get("type").getAsString();');
+          writer.addLine('if ("Sentinel".equals(type)) return null;');
+          writer.addLine('return new $name(child);');
+        } else {
+          if (optional) {
+            writer.addLine(
+                'JsonObject obj = (JsonObject) json.get("$propertyName");');
+            writer.addLine('if (obj == null) return null;');
+            if ((name != 'InstanceRef') && (name != 'Instance')) {
+              writer.addLine(
+                  'final String type = json.get("type").getAsString();');
+              writer.addLine(
+                  'if ("Instance".equals(type) || "@Instance".equals(type)) {');
+              writer.addLine(
+                  '  final String kind = json.get("kind").getAsString();');
+              writer.addLine('  if ("Null".equals(kind)) return null;');
+              writer.addLine('}');
+            }
+            writer.addLine('return new $name(obj);');
+          } else {
+            writer.addLine(
+                'return new $name((JsonObject) json.get("$propertyName"));');
+          }
+        }
+      }
+    }
+  }
+
+  String toString() => ref;
+}
diff --git a/pkg/vm_service/tool/java/src_gen_java.dart b/pkg/vm_service/tool/java/src_gen_java.dart
new file mode 100644
index 0000000..2e298a6
--- /dev/null
+++ b/pkg/vm_service/tool/java/src_gen_java.dart
@@ -0,0 +1,312 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A library to generate Java source code. See [JavaGenerator].
+library src_gen_java;
+
+import 'dart:io';
+
+import 'package:path/path.dart';
+
+import '../common/src_gen_common.dart';
+
+/// The maximum length for javadoc comments.
+int colBoundary = 100;
+
+/// The header for every generated file.
+String fileHeader;
+
+String classNameFor(String typeName) {
+  // Convert ElementList<Foo> param declarations to List<Foo> declarations.
+  if (typeName.startsWith('ElementList<')) {
+    return typeName.substring('Element'.length);
+  }
+
+  var index = typeName.lastIndexOf('.');
+  typeName = index > 0 ? typeName.substring(index + 1) : typeName;
+  if (typeName.startsWith('_')) typeName = typeName.substring(1);
+  return typeName;
+}
+
+String pkgNameFor(String typeName) {
+  var index = typeName.lastIndexOf('.');
+  return index > 0 ? typeName.substring(0, index) : '';
+}
+
+typedef WriteStatements = void Function(StatementWriter writer);
+typedef WriteType = void Function(TypeWriter writer);
+
+/// [JavaGenerator] generates java source files, one per Java type.
+/// Typical usage:
+///
+///    var generator = new JavaGenerator('/path/to/java/src');
+///    generator.writeType('some.package.Foo', (TypeWriter) writer) {
+///      ...
+///    });
+///    ...
+///
+class JavaGenerator {
+  /// The java source directory into which files are generated.
+  final String srcDirPath;
+
+  Set<String> _generatedPaths = new Set();
+
+  JavaGenerator(this.srcDirPath);
+
+  Iterable<String> get allWrittenFiles => _generatedPaths;
+
+  /// Generate a Java class/interface in the given package
+  void writeType(String typeName, WriteType write) {
+    var classWriter = new TypeWriter(typeName);
+    write(classWriter);
+    var pkgDirPath = join(srcDirPath, joinAll(pkgNameFor(typeName).split('.')));
+    var pkgDir = new Directory(pkgDirPath);
+    if (!pkgDir.existsSync()) pkgDir.createSync(recursive: true);
+    var classFilePath = join(pkgDirPath, '${classNameFor(typeName)}.java');
+    var classFile = new File(classFilePath);
+    _generatedPaths.add(classFilePath);
+    classFile.writeAsStringSync(classWriter.toSource());
+  }
+}
+
+class JavaMethodArg {
+  final String name;
+  final String typeName;
+
+  JavaMethodArg(this.name, this.typeName);
+}
+
+class StatementWriter {
+  final TypeWriter typeWriter;
+  final StringBuffer _content = new StringBuffer();
+
+  StatementWriter(this.typeWriter);
+
+  void addImport(String typeName) {
+    typeWriter.addImport(typeName);
+  }
+
+  void addLine(String line) {
+    _content.writeln('    $line');
+  }
+
+  String toSource() => _content.toString();
+}
+
+/// [TypeWriter] describes a Java type to be generated.
+/// Typical usage:
+///
+///     writer.addImport('package.one.Bar');
+///     writer.addImport('package.two.*');
+///     writer.superclassName = 'package.three.Blat';
+///     writer.addMethod('foo', [
+///       new JavaMethodArg('arg1', 'LocalType'),
+///       new JavaMethodArg('arg2', 'java.util.List'),
+///     ], (StatementWriter writer) {
+///       ...
+///     });
+///
+/// The [toSource()] method generates the source,
+/// but need not be called if used in conjunction with
+/// [JavaGenerator].
+class TypeWriter {
+  final String pkgName;
+  final String className;
+  bool isInterface = false;
+  bool isEnum = false;
+  String javadoc;
+  String modifiers = 'public';
+  final Set<String> _imports = new Set<String>();
+  String superclassName;
+  List<String> interfaceNames = <String>[];
+  final StringBuffer _content = new StringBuffer();
+  final List<String> _fields = <String>[];
+  final Map<String, String> _methods = new Map<String, String>();
+
+  TypeWriter(String typeName)
+      : this.pkgName = pkgNameFor(typeName),
+        this.className = classNameFor(typeName);
+
+  String get kind {
+    if (isInterface) return 'interface';
+    if (isEnum) return 'enum';
+    return 'class';
+  }
+
+  void addConstructor(Iterable<JavaMethodArg> args, WriteStatements write,
+      {String javadoc, String modifiers = 'public'}) {
+    _content.writeln();
+    if (javadoc != null && javadoc.isNotEmpty) {
+      _content.writeln('  /**');
+      wrap(javadoc.trim(), colBoundary - 6)
+          .split('\n')
+          .forEach((line) => _content.writeln('   * $line'));
+      _content.writeln('   */');
+    }
+    _content.write('  $modifiers $className(');
+    _content.write(
+        args.map((a) => '${classNameFor(a.typeName)} ${a.name}').join(', '));
+    _content.write(')');
+    if (write != null) {
+      _content.writeln(' {');
+      StatementWriter writer = new StatementWriter(this);
+      write(writer);
+      _content.write(writer.toSource());
+      _content.writeln('  }');
+    } else {
+      _content.writeln(';');
+    }
+  }
+
+  void addEnumValue(
+    String name, {
+    String javadoc,
+    bool isLast = false,
+  }) {
+    _content.writeln();
+    if (javadoc != null && javadoc.isNotEmpty) {
+      _content.writeln('  /**');
+      wrap(javadoc.trim(), colBoundary - 6)
+          .split('\n')
+          .forEach((line) => _content.writeln('   * $line'));
+      _content.writeln('   */');
+    }
+    _content.write('  $name');
+    if (!isLast) {
+      _content.writeln(',');
+    } else {
+      _content.writeln();
+    }
+  }
+
+  void addField(String name, String typeName,
+      {String modifiers = 'public', String value, String javadoc}) {
+    var fieldDecl = new StringBuffer();
+    if (javadoc != null && javadoc.isNotEmpty) {
+      fieldDecl.writeln('  /**');
+      wrap(javadoc.trim(), colBoundary - 6)
+          .split('\n')
+          .forEach((line) => fieldDecl.writeln('   * $line'));
+      fieldDecl.writeln('   */');
+    }
+    fieldDecl.write('  ');
+    if (modifiers != null && modifiers.isNotEmpty) {
+      fieldDecl.write('$modifiers ');
+    }
+    fieldDecl.write('$typeName $name');
+    if (value != null && value.isNotEmpty) {
+      fieldDecl.write(' = $value');
+    }
+    fieldDecl.writeln(';');
+    _fields.add(fieldDecl.toString());
+  }
+
+  void addImport(String typeName) {
+    if (typeName == null || typeName.isEmpty) return;
+    var pkgName = pkgNameFor(typeName);
+    if (pkgName.isNotEmpty && pkgName != this.pkgName) {
+      _imports.add(typeName);
+    }
+  }
+
+  void addMethod(
+    String name,
+    Iterable<JavaMethodArg> args,
+    WriteStatements write, {
+    String javadoc,
+    String modifiers = 'public',
+    String returnType = 'void',
+    bool isOverride = false,
+  }) {
+    var methodDecl = new StringBuffer();
+    if (javadoc != null && javadoc.isNotEmpty) {
+      methodDecl.writeln('  /**');
+      wrap(javadoc.trim(), colBoundary - 6)
+          .split('\n')
+          .forEach((line) => methodDecl.writeln('   * $line'.trimRight()));
+      methodDecl.writeln('   */');
+    }
+    if (isOverride) {
+      methodDecl.writeln('  @Override');
+    }
+    methodDecl.write('  ');
+    if (modifiers != null && modifiers.isNotEmpty) {
+      if (!isInterface || modifiers != 'public') {
+        methodDecl.write('$modifiers ');
+      }
+    }
+    methodDecl.write('$returnType $name(');
+    methodDecl.write(args
+        .map((JavaMethodArg arg) => '${classNameFor(arg.typeName)} ${arg.name}')
+        .join(', '));
+    methodDecl.write(')');
+    if (write != null) {
+      methodDecl.writeln(' {');
+      StatementWriter writer = new StatementWriter(this);
+      write(writer);
+      methodDecl.write(writer.toSource());
+      methodDecl.writeln('  }');
+    } else {
+      methodDecl.writeln(';');
+    }
+    String key = (modifiers != null && modifiers.contains('public'))
+        ? '1 $name('
+        : '2 $name(';
+    key = args.fold(key, (String k, JavaMethodArg a) => '$k${a.typeName},');
+    _methods[key] = methodDecl.toString();
+  }
+
+  String toSource() {
+    var buffer = new StringBuffer();
+    if (fileHeader != null) buffer.write(fileHeader);
+    if (pkgName != null) {
+      buffer.writeln('package $pkgName;');
+      buffer.writeln();
+    }
+    buffer.writeln('// This is a generated file.');
+    buffer.writeln();
+    addImport(superclassName);
+    interfaceNames.forEach((t) => addImport(t));
+    if (_imports.isNotEmpty) {
+      var sorted = _imports.toList()..sort();
+      for (String typeName in sorted) {
+        buffer.writeln('import $typeName;');
+      }
+      buffer.writeln();
+    }
+    if (javadoc != null && javadoc.isNotEmpty) {
+      buffer.writeln('/**');
+      wrap(javadoc.trim(), colBoundary - 4)
+          .split('\n')
+          .forEach((line) => buffer.writeln(' * $line'));
+      buffer.writeln(' */');
+    }
+
+    buffer.writeln('@SuppressWarnings({"WeakerAccess", "unused"})');
+
+    buffer.write('$modifiers $kind $className');
+    if (superclassName != null) {
+      buffer.write(' extends ${classNameFor(superclassName)}');
+    }
+    if (interfaceNames.isNotEmpty) {
+      var classNames = interfaceNames.map((t) => classNameFor(t));
+      buffer.write(
+          ' ${isInterface ? 'extends' : 'implements'} ${classNames.join(', ')}');
+    }
+    buffer.writeln(' {');
+    buffer.write(_content.toString());
+    _fields.forEach((f) {
+      buffer.writeln();
+      buffer.write(f);
+    });
+    _methods.keys.toList()
+      ..sort()
+      ..forEach((String methodName) {
+        buffer.writeln();
+        buffer.write(_methods[methodName]);
+      });
+    buffer.writeln('}');
+    return buffer.toString();
+  }
+}
diff --git a/runtime/PRESUBMIT.py b/runtime/PRESUBMIT.py
index e790a8b..217e40d 100644
--- a/runtime/PRESUBMIT.py
+++ b/runtime/PRESUBMIT.py
@@ -7,69 +7,73 @@
 import re
 import StringIO
 
+
 # memcpy does not handle overlapping memory regions. Even though this
 # is well documented it seems to be used in error quite often. To avoid
 # problems we disallow the direct use of memcpy.  The exceptions are in
 # third-party code and in platform/globals.h which uses it to implement
 # bit_cast and bit_copy.
 def CheckMemcpy(filename):
-  if filename.endswith(os.path.join('platform', 'globals.h')) or \
-     filename.find('third_party') != -1:
+    if filename.endswith(os.path.join('platform', 'globals.h')) or \
+       filename.find('third_party') != -1:
+        return 0
+    fh = open(filename, 'r')
+    content = fh.read()
+    match = re.search('\\bmemcpy\\b', content)
+    if match:
+        offset = match.start()
+        end_of_line = content.index('\n', offset)
+        # We allow explicit use of memcpy with an opt-in via NOLINT
+        if 'NOLINT' not in content[offset:end_of_line]:
+            line_number = content[0:match.start()].count('\n') + 1
+            print("%s:%d: use of memcpy is forbidden" % (filename, line_number))
+            return 1
     return 0
-  fh = open(filename, 'r')
-  content = fh.read()
-  match = re.search('\\bmemcpy\\b', content)
-  if match:
-    line_number = content[0:match.start()].count('\n') + 1
-    print("%s:%d: use of memcpy is forbidden" % (filename, line_number))
-    return 1
-  return 0
 
 
 def RunLint(input_api, output_api):
-  result = []
-  cpplint._cpplint_state.ResetErrorCounts()
-  memcpy_match_count = 0
-  # Find all .cc and .h files in the change list.
-  for git_file in input_api.AffectedTextFiles():
-    filename = git_file.AbsoluteLocalPath()
-    if filename.endswith('.cc') or filename.endswith('.h'):
-      # Run cpplint on the file.
-      cpplint.ProcessFile(filename, 1)
-      # Check for memcpy use.
-      memcpy_match_count += CheckMemcpy(filename)
+    result = []
+    cpplint._cpplint_state.ResetErrorCounts()
+    memcpy_match_count = 0
+    # Find all .cc and .h files in the change list.
+    for git_file in input_api.AffectedTextFiles():
+        filename = git_file.AbsoluteLocalPath()
+        if filename.endswith('.cc') or filename.endswith('.h'):
+            # Run cpplint on the file.
+            cpplint.ProcessFile(filename, 1)
+            # Check for memcpy use.
+            memcpy_match_count += CheckMemcpy(filename)
 
-  # Report a presubmit error if any of the files had an error.
-  if cpplint._cpplint_state.error_count > 0 or memcpy_match_count > 0:
-    result = [output_api.PresubmitError('Failed cpplint check.')]
-  return result
+    # Report a presubmit error if any of the files had an error.
+    if cpplint._cpplint_state.error_count > 0 or memcpy_match_count > 0:
+        result = [output_api.PresubmitError('Failed cpplint check.')]
+    return result
 
 
 def CheckGn(input_api, output_api):
-  return input_api.canned_checks.CheckGNFormatted(input_api, output_api)
+    return input_api.canned_checks.CheckGNFormatted(input_api, output_api)
 
 
 def CheckFormatted(input_api, output_api):
-  def convert_warning_to_error(presubmit_result):
-    if not presubmit_result.fatal:
-      # Convert this warning to an error.
-      stream = StringIO.StringIO()
-      presubmit_result.handle(stream)
-      message = stream.getvalue()
-      return output_api.PresubmitError(message)
-    return presubmit_result
 
-  results = input_api.canned_checks.CheckPatchFormatted(input_api, output_api)
-  return [convert_warning_to_error(r) for r in results]
+    def convert_warning_to_error(presubmit_result):
+        if not presubmit_result.fatal:
+            # Convert this warning to an error.
+            stream = StringIO.StringIO()
+            presubmit_result.handle(stream)
+            message = stream.getvalue()
+            return output_api.PresubmitError(message)
+        return presubmit_result
+
+    results = input_api.canned_checks.CheckPatchFormatted(input_api, output_api)
+    return [convert_warning_to_error(r) for r in results]
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  return (RunLint(input_api, output_api) +
-          CheckGn(input_api, output_api) +
-          CheckFormatted(input_api, output_api))
+    return (RunLint(input_api, output_api) + CheckGn(input_api, output_api) +
+            CheckFormatted(input_api, output_api))
 
 
 def CheckChangeOnCommit(input_api, output_api):
-  return (RunLint(input_api, output_api) +
-          CheckGn(input_api, output_api) +
-          CheckFormatted(input_api, output_api))
+    return (RunLint(input_api, output_api) + CheckGn(input_api, output_api) +
+            CheckFormatted(input_api, output_api))
diff --git a/runtime/bin/BUILD.gn b/runtime/bin/BUILD.gn
index f8631d7..34ce647 100644
--- a/runtime/bin/BUILD.gn
+++ b/runtime/bin/BUILD.gn
@@ -2,6 +2,7 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
+import("../../build/config/gclient_args.gni")
 import("../../build/dart/dart_action.gni")
 import("../runtime_args.gni")
 import("../vm/compiler/compiler_sources.gni")
@@ -923,9 +924,13 @@
     "..:libdart_nosnapshot_with_precompiler",
     "//third_party/zlib",
   ]
+  if (checkout_llvm) {
+    deps += [ "//runtime/llvm_codegen/bit:test" ]
+  }
   include_dirs = [
     "..",
     "$target_gen_dir",
+    "//third_party",
   ]
   defines = [ "TESTING" ]
 
@@ -953,9 +958,15 @@
               "dfe.h",
               "error_exit.cc",
               "error_exit.h",
+              "gzip.cc",
+              "gzip.h",
+              "loader.cc",
+              "loader.h",
               "run_vm_tests.cc",
               "snapshot_utils.cc",
               "snapshot_utils.h",
+              "vmservice_impl.cc",
+              "vmservice_impl.h",
             ] + builtin_impl_tests + vm_tests + compiler_tests + heap_tests
 
   if (!is_win) {
diff --git a/runtime/bin/dart_embedder_api_impl.cc b/runtime/bin/dart_embedder_api_impl.cc
index 492aab8..cf2116a 100644
--- a/runtime/bin/dart_embedder_api_impl.cc
+++ b/runtime/bin/dart_embedder_api_impl.cc
@@ -45,9 +45,9 @@
                                         const uint8_t* buffer,
                                         intptr_t buffer_size,
                                         char** error) {
-  Dart_Isolate kernel_isolate = Dart_CreateIsolateFromKernel(
+  Dart_Isolate kernel_isolate = Dart_CreateIsolateGroupFromKernel(
       data.script_uri, data.main, buffer, buffer_size, data.flags,
-      data.callback_data, error);
+      data.isolate_group_data, data.isolate_data, error);
   if (kernel_isolate == nullptr) {
     return nullptr;
   }
@@ -78,9 +78,9 @@
   }
   data.flags->load_vmservice_library = true;
 
-  Dart_Isolate service_isolate = Dart_CreateIsolateFromKernel(
+  Dart_Isolate service_isolate = Dart_CreateIsolateGroupFromKernel(
       data.script_uri, data.main, kernel_buffer, kernel_buffer_size, data.flags,
-      data.callback_data, error);
+      data.isolate_group_data, data.isolate_data, error);
   if (service_isolate == nullptr) {
     return nullptr;
   }
diff --git a/runtime/bin/dfe.cc b/runtime/bin/dfe.cc
index 2a0e13b..c7a7266 100644
--- a/runtime/bin/dfe.cc
+++ b/runtime/bin/dfe.cc
@@ -77,13 +77,17 @@
     (defined(DART_PRECOMPILER) && defined(TARGET_ARCH_X64))
   kernel_service_dill_ = nullptr;
   kernel_service_dill_size_ = 0;
+#else
+  kernel_service_dill_ = kKernelServiceDill;
+  kernel_service_dill_size_ = kKernelServiceDillSize;
+#endif
+
+#if defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
   platform_strong_dill_for_compilation_ = nullptr;
   platform_strong_dill_for_compilation_size_ = 0;
   platform_strong_dill_for_execution_ = nullptr;
   platform_strong_dill_for_execution_size_ = 0;
 #else
-  kernel_service_dill_ = kKernelServiceDill;
-  kernel_service_dill_size_ = kKernelServiceDillSize;
   platform_strong_dill_for_compilation_ = kPlatformStrongDill;
   platform_strong_dill_for_compilation_size_ = kPlatformStrongDillSize;
   platform_strong_dill_for_execution_ = kPlatformStrongDill;
@@ -440,6 +444,9 @@
                                     uint8_t** kernel_ir,
                                     intptr_t* kernel_ir_size) {
   const char* kernel_list_dirname = DartUtils::DirName(script_uri);
+  if (strcmp(kernel_list_dirname, script_uri) == 0) {
+    kernel_list_dirname = "";
+  }
   KernelIRNode* kernel_ir_head = nullptr;
   KernelIRNode* kernel_ir_tail = nullptr;
   // Add all kernels to the linked list
@@ -452,11 +459,11 @@
     intptr_t this_kernel_size;
     uint8_t* this_buffer;
 
-    StringPointer absolute_filename(
+    StringPointer resolved_filename(
         File::IsAbsolutePath(filename)
             ? strdup(filename)
             : Utils::SCreate("%s%s", kernel_list_dirname, filename));
-    if (!TryReadFile(absolute_filename.c_str(), &this_buffer,
+    if (!TryReadFile(resolved_filename.c_str(), &this_buffer,
                      &this_kernel_size)) {
       return false;
     }
diff --git a/runtime/bin/ffi_test/ffi_test_functions.cc b/runtime/bin/ffi_test/ffi_test_functions.cc
index 3350088..a3b0a02 100644
--- a/runtime/bin/ffi_test/ffi_test_functions.cc
+++ b/runtime/bin/ffi_test/ffi_test_functions.cc
@@ -14,6 +14,9 @@
 #include <psapi.h>
 #else
 #include <unistd.h>
+
+// Only OK to use here because this is test code.
+#include <thread>
 #endif
 
 #include <setjmp.h>
@@ -26,6 +29,14 @@
 
 namespace dart {
 
+#define CHECK(X)                                                               \
+  if (!(X)) {                                                                  \
+    fprintf(stderr, "%s\n", "Check failed: " #X);                              \
+    return 1;                                                                  \
+  }
+
+#define CHECK_EQ(X, Y) CHECK((X) == (Y))
+
 ////////////////////////////////////////////////////////////////////////////////
 // Tests for Dart -> native calls.
 
@@ -343,22 +354,29 @@
   return retval;
 }
 
+// A struct designed to exercise all kinds of alignment rules.
+// Note that offset32A (System V ia32) aligns doubles on 4 bytes while offset32B
+// (Arm 32 bit and MSVC ia32) aligns on 8 bytes.
+// TODO(37271): Support nested structs.
+// TODO(37470): Add uncommon primitive data types when we want to support them.
 struct VeryLargeStruct {
-  int8_t a;
-  int16_t b;
-  int32_t c;
-  int64_t d;
-  uint8_t e;
-  uint16_t f;
-  uint32_t g;
-  uint64_t h;
-  intptr_t i;
-  float j;
-  double k;
-  VeryLargeStruct* parent;
-  intptr_t numChildren;
-  VeryLargeStruct* children;
-  int8_t smallLastField;
+  //                             size32 size64 offset32A offset32B offset64
+  int8_t a;                   // 1              0         0         0
+  int16_t b;                  // 2              2         2         2
+  int32_t c;                  // 4              4         4         4
+  int64_t d;                  // 8              8         8         8
+  uint8_t e;                  // 1             16        16        16
+  uint16_t f;                 // 2             18        18        18
+  uint32_t g;                 // 4             20        20        20
+  uint64_t h;                 // 8             24        24        24
+  intptr_t i;                 // 4      8      32        32        32
+  double j;                   // 8             36        40        40
+  float k;                    // 4             44        48        48
+  VeryLargeStruct* parent;    // 4      8      48        52        56
+  intptr_t numChildren;       // 4      8      52        56        64
+  VeryLargeStruct* children;  // 4      8      56        60        72
+  int8_t smallLastField;      // 1             60        64        80
+                              // sizeof        64        72        88
 };
 
 // Sums the fields of a very large struct, including the first field (a) from
@@ -481,30 +499,30 @@
 // Functions for stress-testing.
 
 DART_EXPORT int64_t MinInt64() {
-  Dart_ExecuteInternalCommand("gc-on-next-allocation");
+  Dart_ExecuteInternalCommand("gc-on-next-allocation", nullptr);
   return 0x8000000000000000;
 }
 
 DART_EXPORT int64_t MinInt32() {
-  Dart_ExecuteInternalCommand("gc-on-next-allocation");
+  Dart_ExecuteInternalCommand("gc-on-next-allocation", nullptr);
   return 0x80000000;
 }
 
 DART_EXPORT double SmallDouble() {
-  Dart_ExecuteInternalCommand("gc-on-next-allocation");
+  Dart_ExecuteInternalCommand("gc-on-next-allocation", nullptr);
   return 0x80000000 * -1.0;
 }
 
 // Requires boxing on 32-bit and 64-bit systems, even if the top 32-bits are
 // truncated.
 DART_EXPORT void* LargePointer() {
-  Dart_ExecuteInternalCommand("gc-on-next-allocation");
+  Dart_ExecuteInternalCommand("gc-on-next-allocation", nullptr);
   uint64_t origin = 0x8100000082000000;
   return reinterpret_cast<void*>(origin);
 }
 
 DART_EXPORT void TriggerGC(uint64_t count) {
-  Dart_ExecuteInternalCommand("gc-now");
+  Dart_ExecuteInternalCommand("gc-now", nullptr);
 }
 
 // Triggers GC. Has 11 dummy arguments as unboxed odd integers which should be
@@ -520,20 +538,63 @@
                               uint64_t i,
                               uint64_t j,
                               uint64_t k) {
-  Dart_ExecuteInternalCommand("gc-now");
+  Dart_ExecuteInternalCommand("gc-now", nullptr);
 }
 
+#if !defined(HOST_OS_WINDOWS) && !defined(TARGET_ARCH_DBC)
+DART_EXPORT void* UnprotectCodeOtherThread(void* isolate,
+                                           std::condition_variable* var,
+                                           std::mutex* mut) {
+  std::function<void()> callback = [&]() {
+    mut->lock();
+    var->notify_all();
+    mut->unlock();
+
+    // Wait for mutator thread to continue (and block) before leaving the
+    // safepoint.
+    while (Dart_ExecuteInternalCommand("is-mutator-in-native", isolate) !=
+           nullptr) {
+      usleep(10 * 1000 /*10 ms*/);
+    }
+  };
+
+  struct {
+    void* isolate;
+    std::function<void()>* callback;
+  } args = {.isolate = isolate, .callback = &callback};
+
+  Dart_ExecuteInternalCommand("run-in-safepoint-and-rw-code", &args);
+  return nullptr;
+}
+
+DART_EXPORT void* UnprotectCode() {
+  std::mutex mutex;
+  std::condition_variable cvar;
+  std::unique_lock<std::mutex> lock(mutex);  // locks the mutex
+  std::thread* helper = new std::thread(UnprotectCodeOtherThread,
+                                        Dart_CurrentIsolate(), &cvar, &mutex);
+
+  cvar.wait(lock);
+
+  return helper;
+}
+
+DART_EXPORT void WaitForHelper(void* helper) {
+  std::thread* thread = reinterpret_cast<std::thread*>(helper);
+  thread->join();
+  delete thread;
+}
+#else
+// Our version of VSC++ doesn't support std::thread yet.
+DART_EXPORT void* UnprotectCode() {
+  return nullptr;
+}
+DART_EXPORT void WaitForHelper(void* helper) {}
+#endif
+
 ////////////////////////////////////////////////////////////////////////////////
 // Tests for callbacks.
 
-#define CHECK(X)                                                               \
-  if (!(X)) {                                                                  \
-    fprintf(stderr, "%s\n", "Check failed: " #X);                              \
-    return 1;                                                                  \
-  }
-
-#define CHECK_EQ(X, Y) CHECK((X) == (Y))
-
 // Sanity test.
 DART_EXPORT int TestSimpleAddition(int (*add)(int, int)) {
   CHECK_EQ(add(10, 20), 30);
@@ -697,11 +758,11 @@
 int ExpectAbort(void (*fn)()) {
   fprintf(stderr, "**** EXPECT STACKTRACE TO FOLLOW. THIS IS OK. ****\n");
 
-  struct sigaction old_action;
+  struct sigaction old_action = {};
   int result = __sigsetjmp(buf, /*savesigs=*/1);
   if (result == 0) {
     // Install signal handler.
-    struct sigaction handler;
+    struct sigaction handler = {};
     handler.sa_handler = CallbackTestSignalHandler;
     sigemptyset(&handler.sa_mask);
     handler.sa_flags = 0;
diff --git a/runtime/bin/file.cc b/runtime/bin/file.cc
index cdbbc95..3acf44a 100644
--- a/runtime/bin/file.cc
+++ b/runtime/bin/file.cc
@@ -42,6 +42,10 @@
   Dart_Handle result = Dart_GetNativeInstanceField(
       dart_this, kFileNativeFieldIndex, reinterpret_cast<intptr_t*>(&file));
   ASSERT(!Dart_IsError(result));
+  if (file == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return file;
 }
 
diff --git a/runtime/bin/gen_snapshot.cc b/runtime/bin/gen_snapshot.cc
index fbd41ce..63f940cd3 100644
--- a/runtime/bin/gen_snapshot.cc
+++ b/runtime/bin/gen_snapshot.cc
@@ -745,23 +745,25 @@
     isolate_flags.entry_points = no_entry_points;
   }
 
-  IsolateData* isolate_data = new IsolateData(NULL, NULL, NULL, NULL);
+  auto isolate_group_data =
+      new IsolateGroupData(nullptr, nullptr, nullptr, nullptr, false);
   Dart_Isolate isolate;
   char* error = NULL;
   if (isolate_snapshot_data == NULL) {
     // We need to capture the vmservice library in the core snapshot, so load it
     // in the main isolate as well.
     isolate_flags.load_vmservice_library = true;
-    isolate = Dart_CreateIsolateFromKernel(NULL, NULL, kernel_buffer,
-                                           kernel_buffer_size, &isolate_flags,
-                                           isolate_data, &error);
+    isolate = Dart_CreateIsolateGroupFromKernel(
+        NULL, NULL, kernel_buffer, kernel_buffer_size, &isolate_flags,
+        isolate_group_data, /*isolate_data=*/nullptr, &error);
   } else {
-    isolate = Dart_CreateIsolate(NULL, NULL, isolate_snapshot_data,
-                                 isolate_snapshot_instructions, NULL, NULL,
-                                 &isolate_flags, isolate_data, &error);
+    isolate = Dart_CreateIsolateGroup(NULL, NULL, isolate_snapshot_data,
+                                      isolate_snapshot_instructions, NULL, NULL,
+                                      &isolate_flags, isolate_group_data,
+                                      /*isolate_data=*/nullptr, &error);
   }
   if (isolate == NULL) {
-    delete isolate_data;
+    delete isolate_group_data;
     Syslog::PrintErr("%s\n", error);
     free(error);
     return kErrorExitCode;
@@ -783,9 +785,9 @@
   // If the input dill file does not have a root library, then
   // Dart_LoadScript will error.
   //
-  // TODO(kernel): Dart_CreateIsolateFromKernel should respect the root library
-  // in the kernel file, though this requires auditing the other loading paths
-  // in the embedders that had to work around this.
+  // TODO(kernel): Dart_CreateIsolateGroupFromKernel should respect the root
+  // library in the kernel file, though this requires auditing the other
+  // loading paths in the embedders that had to work around this.
   result = Dart_SetRootLibrary(
       Dart_LoadLibraryFromKernel(kernel_buffer, kernel_buffer_size));
   CHECK_RESULT(result);
diff --git a/runtime/bin/isolate_data.cc b/runtime/bin/isolate_data.cc
index 54b1050..d7cc5d5 100644
--- a/runtime/bin/isolate_data.cc
+++ b/runtime/bin/isolate_data.cc
@@ -9,45 +9,54 @@
 namespace dart {
 namespace bin {
 
-IsolateData::IsolateData(const char* url,
-                         const char* package_root,
-                         const char* packages_file,
-                         AppSnapshot* app_snapshot)
+IsolateGroupData::IsolateGroupData(const char* url,
+                                   const char* package_root,
+                                   const char* packages_file,
+                                   AppSnapshot* app_snapshot,
+                                   bool isolate_run_app_snapshot)
     : script_url((url != NULL) ? strdup(url) : NULL),
       package_root(NULL),
-      packages_file(NULL),
-      loader_(NULL),
       app_snapshot_(app_snapshot),
       dependencies_(NULL),
       resolved_packages_config_(NULL),
       kernel_buffer_(NULL),
-      kernel_buffer_size_(0) {
+      kernel_buffer_size_(0),
+      isolate_run_app_snapshot_(isolate_run_app_snapshot) {
   if (package_root != NULL) {
     ASSERT(packages_file == NULL);
-    this->package_root = strdup(package_root);
+    package_root = strdup(package_root);
   } else if (packages_file != NULL) {
-    this->packages_file = strdup(packages_file);
+    packages_file_ = strdup(packages_file);
   }
 }
 
-void IsolateData::OnIsolateShutdown() {
-}
-
-IsolateData::~IsolateData() {
+IsolateGroupData::~IsolateGroupData() {
   free(script_url);
   script_url = NULL;
   free(package_root);
   package_root = NULL;
-  free(packages_file);
-  packages_file = NULL;
+  free(packages_file_);
+  packages_file_ = NULL;
   free(resolved_packages_config_);
   resolved_packages_config_ = NULL;
   kernel_buffer_ = NULL;
   kernel_buffer_size_ = 0;
-  delete app_snapshot_;
-  app_snapshot_ = NULL;
   delete dependencies_;
 }
 
+IsolateData::IsolateData(IsolateGroupData* isolate_group_data)
+    : isolate_group_data_(isolate_group_data),
+      loader_(nullptr),
+      packages_file_(nullptr) {
+  if (isolate_group_data->packages_file_ != nullptr) {
+    packages_file_ = strdup(isolate_group_data->packages_file_);
+  }
+}
+
+IsolateData::~IsolateData() {
+  free(packages_file_);
+  packages_file_ = nullptr;
+}
+
 }  // namespace bin
 }  // namespace dart
diff --git a/runtime/bin/isolate_data.h b/runtime/bin/isolate_data.h
index 528f397..a6c13bf 100644
--- a/runtime/bin/isolate_data.h
+++ b/runtime/bin/isolate_data.h
@@ -28,20 +28,20 @@
 class EventHandler;
 class Loader;
 
-// Data associated with every isolate in the standalone VM
+// Data associated with every isolate group in the standalone VM
 // embedding. This is used to free external resources for each isolate
-// when the isolate shuts down.
-class IsolateData {
+// group when the isolate group shuts down.
+class IsolateGroupData {
  public:
-  IsolateData(const char* url,
-              const char* package_root,
-              const char* packages_file,
-              AppSnapshot* app_snapshot);
-  ~IsolateData();
+  IsolateGroupData(const char* url,
+                   const char* package_root,
+                   const char* packages_file,
+                   AppSnapshot* app_snapshot,
+                   bool isolate_run_app_snapshot);
+  ~IsolateGroupData();
 
   char* script_url;
   char* package_root;
-  char* packages_file;
 
   const std::shared_ptr<uint8_t>& kernel_buffer() const {
     return kernel_buffer_;
@@ -49,16 +49,16 @@
 
   intptr_t kernel_buffer_size() const { return kernel_buffer_size_; }
 
-  // Associate the given kernel buffer with this IsolateData without giving it
-  // ownership of the buffer.
+  // Associate the given kernel buffer with this IsolateGroupData without
+  // giving it ownership of the buffer.
   void SetKernelBufferUnowned(uint8_t* buffer, intptr_t size) {
     ASSERT(kernel_buffer_.get() == NULL);
     kernel_buffer_ = std::shared_ptr<uint8_t>(buffer, FreeUnownedKernelBuffer);
     kernel_buffer_size_ = size;
   }
 
-  // Associate the given kernel buffer with this IsolateData and give it
-  // ownership of the buffer. This IsolateData is the first one to own the
+  // Associate the given kernel buffer with this IsolateGroupData and give it
+  // ownership of the buffer. This IsolateGroupData is the first one to own the
   // buffer.
   void SetKernelBufferNewlyOwned(uint8_t* buffer, intptr_t size) {
     ASSERT(kernel_buffer_.get() == NULL);
@@ -66,9 +66,9 @@
     kernel_buffer_size_ = size;
   }
 
-  // Associate the given kernel buffer with this IsolateData and give it
+  // Associate the given kernel buffer with this IsolateGroupData and give it
   // ownership of the buffer. The buffer is already owned by another
-  // IsolateData.
+  // IsolateGroupData.
   void SetKernelBufferAlreadyOwned(std::shared_ptr<uint8_t> buffer,
                                    intptr_t size) {
     ASSERT(kernel_buffer_.get() == NULL);
@@ -76,14 +76,6 @@
     kernel_buffer_size_ = size;
   }
 
-  void UpdatePackagesFile(const char* packages_file_) {
-    if (packages_file != NULL) {
-      free(packages_file);
-      packages_file = NULL;
-    }
-    packages_file = strdup(packages_file_);
-  }
-
   const char* resolved_packages_config() const {
     return resolved_packages_config_;
   }
@@ -96,6 +88,54 @@
     resolved_packages_config_ = strdup(packages_config);
   }
 
+  MallocGrowableArray<char*>* dependencies() const { return dependencies_; }
+  void set_dependencies(MallocGrowableArray<char*>* deps) {
+    dependencies_ = deps;
+  }
+
+  bool RunFromAppSnapshot() const {
+    // If the main isolate is using an app snapshot the [app_snapshot_] pointer
+    // will be still nullptr (see main.cc:CreateIsolateGroupAndSetupHelper)
+    //
+    // Because of thus we have an additional boolean signaling whether the
+    // isolate was started from an app snapshot.
+    return app_snapshot_ != nullptr || isolate_run_app_snapshot_;
+  }
+
+ private:
+  friend class IsolateData;  // For packages_file_
+
+  std::unique_ptr<AppSnapshot> app_snapshot_;
+  MallocGrowableArray<char*>* dependencies_;
+  char* resolved_packages_config_;
+  std::shared_ptr<uint8_t> kernel_buffer_;
+  intptr_t kernel_buffer_size_;
+  char* packages_file_ = nullptr;
+  bool isolate_run_app_snapshot_;
+
+  static void FreeUnownedKernelBuffer(uint8_t*) {}
+
+  DISALLOW_COPY_AND_ASSIGN(IsolateGroupData);
+};
+
+// Data associated with every isolate in the standalone VM
+// embedding. This is used to free external resources for each isolate
+// when the isolate shuts down.
+class IsolateData {
+ public:
+  explicit IsolateData(IsolateGroupData* isolate_group_data);
+  ~IsolateData();
+
+  IsolateGroupData* isolate_group_data() const { return isolate_group_data_; }
+
+  void UpdatePackagesFile(const char* packages_file) {
+    if (packages_file != nullptr) {
+      free(packages_file_);
+      packages_file_ = nullptr;
+    }
+    packages_file_ = strdup(packages_file);
+  }
+
   // While loading a loader is associated with the isolate.
   bool HasLoader() const { return loader_ != NULL; }
   Loader* loader() const {
@@ -106,22 +146,13 @@
     ASSERT((loader_ == NULL) || (loader == NULL));
     loader_ = loader;
   }
-  MallocGrowableArray<char*>* dependencies() const { return dependencies_; }
-  void set_dependencies(MallocGrowableArray<char*>* deps) {
-    dependencies_ = deps;
-  }
 
-  void OnIsolateShutdown();
+  const char* packages_file() const { return packages_file_; }
 
  private:
+  IsolateGroupData* isolate_group_data_;
   Loader* loader_;
-  AppSnapshot* app_snapshot_;
-  MallocGrowableArray<char*>* dependencies_;
-  char* resolved_packages_config_;
-  std::shared_ptr<uint8_t> kernel_buffer_;
-  intptr_t kernel_buffer_size_;
-
-  static void FreeUnownedKernelBuffer(uint8_t*) {}
+  char* packages_file_;
 
   DISALLOW_COPY_AND_ASSIGN(IsolateData);
 };
diff --git a/runtime/bin/loader.cc b/runtime/bin/loader.cc
index a56cdc2..772fbcc 100644
--- a/runtime/bin/loader.cc
+++ b/runtime/bin/loader.cc
@@ -263,7 +263,7 @@
 
 void Loader::AddDependencyLocked(Loader* loader, const char* resolved_uri) {
   MallocGrowableArray<char*>* dependencies =
-      loader->isolate_data_->dependencies();
+      loader->isolate_group_data()->dependencies();
   if (dependencies == NULL) {
     return;
   }
@@ -271,10 +271,10 @@
 }
 
 void Loader::ResolveDependenciesAsFilePaths() {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
-  ASSERT(isolate_data != NULL);
-  MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
+  IsolateGroupData* isolate_group_data =
+      reinterpret_cast<IsolateGroupData*>(Dart_CurrentIsolateGroupData());
+  ASSERT(isolate_group_data != NULL);
+  MallocGrowableArray<char*>* dependencies = isolate_group_data->dependencies();
   if (dependencies == NULL) {
     return;
   }
@@ -454,15 +454,15 @@
   return !hit_error;
 }
 
-void Loader::InitForSnapshot(const char* snapshot_uri) {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+void Loader::InitForSnapshot(const char* snapshot_uri,
+                             IsolateData* isolate_data) {
   ASSERT(isolate_data != NULL);
   ASSERT(!isolate_data->HasLoader());
   // Setup a loader. The constructor does a bunch of leg work.
   Loader* loader = new Loader(isolate_data);
   // Send the init message.
-  loader->Init(isolate_data->package_root, isolate_data->packages_file,
+  loader->Init(isolate_data->isolate_group_data()->package_root,
+               isolate_data->packages_file(),
                DartUtils::original_working_directory, snapshot_uri);
   // Destroy the loader. The destructor does a bunch of leg work.
   delete loader;
@@ -516,15 +516,15 @@
                                         Dart_Handle url,
                                         uint8_t** payload,
                                         intptr_t* payload_length) {
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+  auto isolate_data = reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
   ASSERT(isolate_data != NULL);
   ASSERT(!isolate_data->HasLoader());
   Loader* loader = NULL;
 
   // Setup the loader. The constructor does a bunch of leg work.
   loader = new Loader(isolate_data);
-  loader->Init(isolate_data->package_root, isolate_data->packages_file,
+  loader->Init(isolate_data->isolate_group_data()->package_root,
+               isolate_data->packages_file(),
                DartUtils::original_working_directory, NULL);
   ASSERT(loader != NULL);
   ASSERT(isolate_data->HasLoader());
@@ -565,6 +565,10 @@
                              payload_length);
 }
 
+IsolateGroupData* Loader::isolate_group_data() {
+  return isolate_data_->isolate_group_data();
+}
+
 #if defined(DART_PRECOMPILED_RUNTIME)
 Dart_Handle Loader::LibraryTagHandler(Dart_LibraryTag tag,
                                       Dart_Handle library,
@@ -679,8 +683,7 @@
     }
   }
 
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
+  auto isolate_data = reinterpret_cast<IsolateData*>(Dart_CurrentIsolateData());
   ASSERT(isolate_data != NULL);
   if ((tag == Dart_kScriptTag) && Dart_IsString(library)) {
     // Update packages file for isolate.
@@ -707,7 +710,8 @@
 
     // Setup the loader. The constructor does a bunch of leg work.
     loader = new Loader(isolate_data);
-    loader->Init(isolate_data->package_root, isolate_data->packages_file,
+    loader->Init(isolate_data->isolate_group_data()->package_root,
+                 isolate_data->packages_file(),
                  DartUtils::original_working_directory,
                  (tag == Dart_kScriptTag) ? url_string : NULL);
   } else {
diff --git a/runtime/bin/loader.h b/runtime/bin/loader.h
index 4142c89..dc436c5 100644
--- a/runtime/bin/loader.h
+++ b/runtime/bin/loader.h
@@ -20,7 +20,8 @@
   explicit Loader(IsolateData* isolate_data);
   ~Loader();
 
-  static void InitForSnapshot(const char* snapshot_uri);
+  static void InitForSnapshot(const char* snapshot_uri,
+                              IsolateData* isolate_data);
 
   static Dart_Handle ReloadNativeExtensions();
 
@@ -36,6 +37,8 @@
                                        Dart_Handle library,
                                        Dart_Handle url);
 
+  IsolateGroupData* isolate_group_data();
+
   Dart_Handle error() const { return error_; }
 
   static void InitOnce();
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 622b326..673d993 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -132,10 +132,10 @@
     return;
   }
   Loader::ResolveDependenciesAsFilePaths();
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
-  ASSERT(isolate_data != NULL);
-  MallocGrowableArray<char*>* dependencies = isolate_data->dependencies();
+  auto isolate_group_data =
+      reinterpret_cast<IsolateGroupData*>(Dart_IsolateGroupData(isolate));
+  ASSERT(isolate_group_data != NULL);
+  MallocGrowableArray<char*>* dependencies = isolate_group_data->dependencies();
   ASSERT(dependencies != NULL);
   File* file =
       File::Open(NULL, Options::depfile(), File::kWriteTruncate);
@@ -190,57 +190,158 @@
   }
 }
 
+static Dart_Handle SetupCoreLibraries(Dart_Isolate isolate,
+                                      IsolateData* isolate_data,
+                                      bool is_isolate_group_start,
+                                      const char** resolved_packages_config) {
+  auto isolate_group_data = isolate_data->isolate_group_data();
+  const auto packages_file = isolate_data->packages_file();
+  const auto script_uri = isolate_group_data->script_url;
+
+  Dart_Handle result;
+
+  // Prepare builtin and other core libraries for use to resolve URIs.
+  // Set up various closures, e.g: printing, timers etc.
+  // Set up 'package root' for URI resolution.
+  result = DartUtils::PrepareForScriptLoading(false, Options::trace_loading());
+  if (Dart_IsError(result)) return result;
+
+  if (Dart_IsVMFlagSet("support_service") || !Dart_IsPrecompiledRuntime()) {
+    // Set up the load port provided by the service isolate so that we can
+    // load scripts.
+    result = DartUtils::SetupServiceLoadPort();
+    if (Dart_IsError(result)) return result;
+  }
+
+  // Setup package root if specified.
+  result = DartUtils::SetupPackageRoot(nullptr, packages_file);
+  if (Dart_IsError(result)) return result;
+  if (!Dart_IsNull(result) && resolved_packages_config != nullptr) {
+    result = Dart_StringToCString(result, resolved_packages_config);
+    if (Dart_IsError(result)) return result;
+    ASSERT(*resolved_packages_config != nullptr);
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+    if (is_isolate_group_start) {
+      isolate_group_data->set_resolved_packages_config(
+          *resolved_packages_config);
+    } else {
+      ASSERT(strcmp(isolate_group_data->resolved_packages_config(),
+                    *resolved_packages_config) == 0);
+    }
+#endif
+  }
+
+  result = Dart_SetEnvironmentCallback(DartUtils::EnvironmentCallback);
+  if (Dart_IsError(result)) return result;
+
+  // Setup the native resolver as the snapshot does not carry it.
+  Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
+  Builtin::SetNativeResolver(Builtin::kIOLibrary);
+  Builtin::SetNativeResolver(Builtin::kCLILibrary);
+  VmService::SetNativeResolver();
+
+  const char* namespc =
+      Dart_IsKernelIsolate(isolate) ? NULL : Options::namespc();
+  result =
+      DartUtils::SetupIOLibrary(namespc, script_uri, Options::exit_disabled());
+  if (Dart_IsError(result)) return result;
+
+  return Dart_Null();
+}
+
+static bool OnIsolateInitialize(void** child_callback_data, char** error) {
+  Dart_Isolate isolate = Dart_CurrentIsolate();
+  ASSERT(isolate != nullptr);
+
+  auto isolate_group_data =
+      reinterpret_cast<IsolateGroupData*>(Dart_CurrentIsolateGroupData());
+
+  auto isolate_data = new IsolateData(isolate_group_data);
+  *child_callback_data = isolate_data;
+
+  Dart_EnterScope();
+  const auto script_uri = isolate_group_data->script_url;
+  const bool isolate_run_app_snapshot =
+      isolate_group_data->RunFromAppSnapshot();
+  Dart_Handle result = SetupCoreLibraries(isolate, isolate_data,
+                                          /*group_start=*/false,
+                                          /*resolved_packages_config=*/nullptr);
+  if (Dart_IsError(result)) goto failed;
+
+  if (isolate_run_app_snapshot) {
+    if (Dart_IsVMFlagSet("support_service") || !Dart_IsPrecompiledRuntime()) {
+      Loader::InitForSnapshot(script_uri, isolate_data);
+    }
+  } else {
+    result = DartUtils::ResolveScript(Dart_NewStringFromCString(script_uri));
+    if (Dart_IsError(result)) return result;
+
+    if (isolate_group_data->kernel_buffer().get() != nullptr) {
+      // Various core-library parts will send requests to the Loader to resolve
+      // relative URIs and perform other related tasks. We need Loader to be
+      // initialized for this to work because loading from Kernel binary
+      // bypasses normal source code loading paths that initialize it.
+      const char* resolved_script_uri = NULL;
+      result = Dart_StringToCString(result, &resolved_script_uri);
+      if (Dart_IsError(result)) return result;
+      Loader::InitForSnapshot(resolved_script_uri, isolate_data);
+    }
+  }
+
+  if (isolate_run_app_snapshot) {
+    result = Loader::ReloadNativeExtensions();
+    if (Dart_IsError(result)) goto failed;
+  }
+
+  if (Options::gen_snapshot_kind() == kAppJIT) {
+    // If we sort, we must do it for all isolates, not just the main isolate,
+    // otherwise isolates related by spawnFunction will disagree on CIDs and
+    // cannot correctly send each other messages.
+    result = Dart_SortClasses();
+    if (Dart_IsError(result)) goto failed;
+  }
+
+  // Make the isolate runnable so that it is ready to handle messages.
+  Dart_ExitScope();
+  Dart_ExitIsolate();
+  *error = Dart_IsolateMakeRunnable(isolate);
+  Dart_EnterIsolate(isolate);
+  return *error == nullptr;
+
+failed:
+  *error = strdup(Dart_GetError(result));
+  Dart_ExitScope();
+  return false;
+}
+
 static Dart_Isolate IsolateSetupHelper(Dart_Isolate isolate,
                                        bool is_main_isolate,
                                        const char* script_uri,
-                                       const char* package_root,
                                        const char* packages_config,
                                        bool isolate_run_app_snapshot,
                                        Dart_IsolateFlags* flags,
                                        char** error,
                                        int* exit_code) {
   Dart_EnterScope();
-#if !defined(DART_PRECOMPILED_RUNTIME)
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
-  const uint8_t* kernel_buffer = isolate_data->kernel_buffer().get();
-  intptr_t kernel_buffer_size = isolate_data->kernel_buffer_size();
-#endif
 
-  // Set up the library tag handler for this isolate.
+  // Set up the library tag handler for the isolate group shared by all
+  // isolates in the group.
   Dart_Handle result = Dart_SetLibraryTagHandler(Loader::LibraryTagHandler);
   CHECK_RESULT(result);
 
-  // Prepare builtin and other core libraries for use to resolve URIs.
-  // Set up various closures, e.g: printing, timers etc.
-  // Set up 'package root' for URI resolution.
-  result = DartUtils::PrepareForScriptLoading(false, Options::trace_loading());
-  CHECK_RESULT(result);
+  auto isolate_data = reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
 
-  if (Dart_IsVMFlagSet("support_service") || !Dart_IsPrecompiledRuntime()) {
-    // Set up the load port provided by the service isolate so that we can
-    // load scripts.
-    result = DartUtils::SetupServiceLoadPort();
-    CHECK_RESULT(result);
-  }
-
-  // Setup package root if specified.
-  result = DartUtils::SetupPackageRoot(NULL, packages_config);
-  CHECK_RESULT(result);
-  const char* resolved_packages_config = NULL;
-  if (!Dart_IsNull(result)) {
-    result = Dart_StringToCString(result, &resolved_packages_config);
-    CHECK_RESULT(result);
-    ASSERT(resolved_packages_config != NULL);
-#if !defined(DART_PRECOMPILED_RUNTIME)
-    isolate_data->set_resolved_packages_config(resolved_packages_config);
-#endif
-  }
-
-  result = Dart_SetEnvironmentCallback(DartUtils::EnvironmentCallback);
+  const char* resolved_packages_config = nullptr;
+  result = SetupCoreLibraries(isolate, isolate_data,
+                              /*is_isolate_group_start=*/true,
+                              &resolved_packages_config);
   CHECK_RESULT(result);
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
+  auto isolate_group_data = isolate_data->isolate_group_data();
+  const uint8_t* kernel_buffer = isolate_group_data->kernel_buffer().get();
+  intptr_t kernel_buffer_size = isolate_group_data->kernel_buffer_size();
   if (!isolate_run_app_snapshot && kernel_buffer == NULL &&
       !Dart_IsKernelIsolate(isolate)) {
     if (!dfe.CanUseDartFrontend()) {
@@ -264,8 +365,8 @@
       Dart_ShutdownIsolate();
       return NULL;
     }
-    isolate_data->SetKernelBufferNewlyOwned(application_kernel_buffer,
-                                            application_kernel_buffer_size);
+    isolate_group_data->SetKernelBufferNewlyOwned(
+        application_kernel_buffer, application_kernel_buffer_size);
     kernel_buffer = application_kernel_buffer;
     kernel_buffer_size = application_kernel_buffer_size;
   }
@@ -279,25 +380,14 @@
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-  // Setup the native resolver as the snapshot does not carry it.
-  Builtin::SetNativeResolver(Builtin::kBuiltinLibrary);
-  Builtin::SetNativeResolver(Builtin::kIOLibrary);
-  Builtin::SetNativeResolver(Builtin::kCLILibrary);
-  VmService::SetNativeResolver();
-
   if (isolate_run_app_snapshot) {
     Dart_Handle result = Loader::ReloadNativeExtensions();
     CHECK_RESULT(result);
   }
 
-  const char* namespc =
-      Dart_IsKernelIsolate(isolate) ? NULL : Options::namespc();
   if (isolate_run_app_snapshot) {
-    result = DartUtils::SetupIOLibrary(namespc, script_uri,
-                                       Options::exit_disabled());
-    CHECK_RESULT(result);
     if (Dart_IsVMFlagSet("support_service") || !Dart_IsPrecompiledRuntime()) {
-      Loader::InitForSnapshot(script_uri);
+      Loader::InitForSnapshot(script_uri, isolate_data);
     }
 #if !defined(DART_PRECOMPILED_RUNTIME)
     if (is_main_isolate) {
@@ -329,16 +419,12 @@
       const char* resolved_script_uri = NULL;
       result = Dart_StringToCString(uri, &resolved_script_uri);
       CHECK_RESULT(result);
-      Loader::InitForSnapshot(resolved_script_uri);
+      Loader::InitForSnapshot(resolved_script_uri, isolate_data);
     }
 
     Dart_TimelineEvent("LoadScript", Dart_TimelineGetMicros(),
                        Dart_GetMainPortId(), Dart_Timeline_Event_Async_End, 0,
                        NULL, NULL);
-
-    result = DartUtils::SetupIOLibrary(namespc, script_uri,
-                                       Options::exit_disabled());
-    CHECK_RESULT(result);
 #else
     UNREACHABLE();
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -396,7 +482,8 @@
   }
 
   Dart_Isolate isolate = NULL;
-  IsolateData* isolate_data = NULL;
+  IsolateGroupData* isolate_group_data = nullptr;
+  IsolateData* isolate_data = nullptr;
   bool isolate_run_app_snapshot = false;
   AppSnapshot* app_snapshot = NULL;
   // Kernel isolate uses an app snapshot or uses the dill file.
@@ -411,42 +498,48 @@
     app_snapshot->SetBuffers(
         &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
         &isolate_snapshot_data, &isolate_snapshot_instructions);
-    isolate_data =
-        new IsolateData(uri, package_root, packages_config, app_snapshot);
-    isolate = Dart_CreateIsolate(
+    isolate_group_data =
+        new IsolateGroupData(uri, package_root, packages_config, app_snapshot,
+                             isolate_run_app_snapshot);
+    isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroup(
         DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
         isolate_snapshot_data, isolate_snapshot_instructions,
         app_isolate_shared_data, app_isolate_shared_instructions, flags,
-        isolate_data, error);
+        isolate_group_data, isolate_data, error);
   }
   if (isolate == NULL) {
     // Clear error from app snapshot and re-trying from kernel file.
     free(*error);
     *error = NULL;
     delete isolate_data;
+    delete isolate_group_data;
 
     const uint8_t* kernel_service_buffer = NULL;
     intptr_t kernel_service_buffer_size = 0;
     dfe.LoadKernelService(&kernel_service_buffer, &kernel_service_buffer_size);
     ASSERT(kernel_service_buffer != NULL);
-    isolate_data = new IsolateData(uri, package_root, packages_config, NULL);
-    isolate_data->SetKernelBufferUnowned(
+    isolate_group_data = new IsolateGroupData(
+        uri, package_root, packages_config, nullptr, isolate_run_app_snapshot);
+    isolate_group_data->SetKernelBufferUnowned(
         const_cast<uint8_t*>(kernel_service_buffer),
         kernel_service_buffer_size);
-    isolate = Dart_CreateIsolateFromKernel(
+    isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroupFromKernel(
         DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
-        kernel_service_buffer, kernel_service_buffer_size, flags, isolate_data,
-        error);
+        kernel_service_buffer, kernel_service_buffer_size, flags,
+        isolate_group_data, isolate_data, error);
   }
 
   if (isolate == NULL) {
     Syslog::PrintErr("%s\n", *error);
     delete isolate_data;
+    delete isolate_group_data;
     return NULL;
   }
   kernel_isolate_is_running = true;
 
-  return IsolateSetupHelper(isolate, false, uri, package_root, packages_config,
+  return IsolateSetupHelper(isolate, false, uri, packages_config,
                             isolate_run_app_snapshot, flags, error, exit_code);
 }
 #endif  // !defined(EXCLUDE_CFE_AND_KERNEL_PLATFORM)
@@ -462,18 +555,19 @@
                                                  int* exit_code) {
   ASSERT(script_uri != NULL);
   Dart_Isolate isolate = NULL;
-  IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, packages_config, NULL);
+  auto isolate_group_data = new IsolateGroupData(
+      script_uri, package_root, packages_config, nullptr, false);
 
 #if defined(DART_PRECOMPILED_RUNTIME)
   // AOT: All isolates start from the app snapshot.
   const uint8_t* isolate_snapshot_data = app_isolate_snapshot_data;
   const uint8_t* isolate_snapshot_instructions =
       app_isolate_snapshot_instructions;
-  isolate = Dart_CreateIsolate(
+  isolate = Dart_CreateIsolateGroup(
       script_uri, DART_VM_SERVICE_ISOLATE_NAME, isolate_snapshot_data,
       isolate_snapshot_instructions, app_isolate_shared_data,
-      app_isolate_shared_instructions, flags, isolate_data, error);
+      app_isolate_shared_instructions, flags, isolate_group_data,
+      /*isolate_data=*/nullptr, error);
 #else
   // JIT: Service isolate uses the core libraries snapshot.
 
@@ -483,13 +577,14 @@
   const uint8_t* isolate_snapshot_data = core_isolate_snapshot_data;
   const uint8_t* isolate_snapshot_instructions =
       core_isolate_snapshot_instructions;
-  isolate = Dart_CreateIsolate(
+  isolate = Dart_CreateIsolateGroup(
       script_uri, DART_VM_SERVICE_ISOLATE_NAME, isolate_snapshot_data,
       isolate_snapshot_instructions, app_isolate_shared_data,
-      app_isolate_shared_instructions, flags, isolate_data, error);
+      app_isolate_shared_instructions, flags, isolate_group_data,
+      /*isolate_data=*/nullptr, error);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
   if (isolate == NULL) {
-    delete isolate_data;
+    delete isolate_group_data;
     return NULL;
   }
 
@@ -518,15 +613,16 @@
 }
 
 // Returns newly created Isolate on success, NULL on failure.
-static Dart_Isolate CreateIsolateAndSetupHelper(bool is_main_isolate,
-                                                const char* script_uri,
-                                                const char* name,
-                                                const char* package_root,
-                                                const char* packages_config,
-                                                Dart_IsolateFlags* flags,
-                                                void* callback_data,
-                                                char** error,
-                                                int* exit_code) {
+static Dart_Isolate CreateIsolateGroupAndSetupHelper(
+    bool is_main_isolate,
+    const char* script_uri,
+    const char* name,
+    const char* package_root,
+    const char* packages_config,
+    Dart_IsolateFlags* flags,
+    void* callback_data,
+    char** error,
+    int* exit_code) {
   int64_t start = Dart_TimelineGetMicros();
   ASSERT(script_uri != NULL);
   uint8_t* kernel_buffer = NULL;
@@ -566,8 +662,8 @@
   }
 
   if (flags->copy_parent_code && callback_data) {
-    IsolateData* parent_isolate_data =
-        reinterpret_cast<IsolateData*>(callback_data);
+    IsolateGroupData* parent_isolate_data =
+        reinterpret_cast<IsolateGroupData*>(callback_data);
     parent_kernel_buffer = parent_isolate_data->kernel_buffer();
     kernel_buffer = parent_kernel_buffer.get();
     kernel_buffer_size = parent_isolate_data->kernel_buffer_size();
@@ -578,19 +674,20 @@
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
-  IsolateData* isolate_data =
-      new IsolateData(script_uri, package_root, packages_config, app_snapshot);
+  auto isolate_group_data =
+      new IsolateGroupData(script_uri, package_root, packages_config,
+                           app_snapshot, isolate_run_app_snapshot);
   if (kernel_buffer != NULL) {
     if (parent_kernel_buffer) {
-      isolate_data->SetKernelBufferAlreadyOwned(std::move(parent_kernel_buffer),
-                                                kernel_buffer_size);
+      isolate_group_data->SetKernelBufferAlreadyOwned(
+          std::move(parent_kernel_buffer), kernel_buffer_size);
     } else {
-      isolate_data->SetKernelBufferNewlyOwned(kernel_buffer,
-                                              kernel_buffer_size);
+      isolate_group_data->SetKernelBufferNewlyOwned(kernel_buffer,
+                                                    kernel_buffer_size);
     }
   }
   if (is_main_isolate && (Options::depfile() != NULL)) {
-    isolate_data->set_dependencies(new MallocGrowableArray<char*>());
+    isolate_group_data->set_dependencies(new MallocGrowableArray<char*>());
   }
 
   Dart_Isolate isolate = NULL;
@@ -616,45 +713,48 @@
     // TODO(sivachandra): When the platform program is unavailable, check if
     // application kernel binary is self contained or an incremental binary.
     // Isolate should be created only if it is a self contained kernel binary.
-    isolate = Dart_CreateIsolateFromKernel(
+    auto isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroupFromKernel(
         script_uri, name, platform_kernel_buffer, platform_kernel_buffer_size,
-        flags, isolate_data, error);
+        flags, isolate_group_data, isolate_data, error);
   } else {
-    isolate = Dart_CreateIsolate(
+    auto isolate_data = new IsolateData(isolate_group_data);
+    isolate = Dart_CreateIsolateGroup(
         script_uri, name, isolate_snapshot_data, isolate_snapshot_instructions,
         app_isolate_shared_data, app_isolate_shared_instructions, flags,
-        isolate_data, error);
+        isolate_group_data, isolate_data, error);
   }
 #else
-  isolate = Dart_CreateIsolate(
+  auto isolate_data = new IsolateData(isolate_group_data);
+  isolate = Dart_CreateIsolateGroup(
       script_uri, name, isolate_snapshot_data, isolate_snapshot_instructions,
       app_isolate_shared_data, app_isolate_shared_instructions, flags,
-      isolate_data, error);
+      isolate_group_data, isolate_data, error);
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   Dart_Isolate created_isolate = NULL;
   if (isolate == NULL) {
-    delete isolate_data;
+    delete isolate_group_data;
   } else {
     created_isolate = IsolateSetupHelper(
-        isolate, is_main_isolate, script_uri, package_root, packages_config,
+        isolate, is_main_isolate, script_uri, packages_config,
         isolate_run_app_snapshot, flags, error, exit_code);
   }
   int64_t end = Dart_TimelineGetMicros();
-  Dart_TimelineEvent("CreateIsolateAndSetupHelper", start, end,
+  Dart_TimelineEvent("CreateIsolateGroupAndSetupHelper", start, end,
                      Dart_Timeline_Event_Duration, 0, NULL, NULL);
   return created_isolate;
 }
 
 #undef CHECK_RESULT
 
-static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
-                                          const char* main,
-                                          const char* package_root,
-                                          const char* package_config,
-                                          Dart_IsolateFlags* flags,
-                                          void* callback_data,
-                                          char** error) {
+static Dart_Isolate CreateIsolateGroupAndSetup(const char* script_uri,
+                                               const char* main,
+                                               const char* package_root,
+                                               const char* package_config,
+                                               Dart_IsolateFlags* flags,
+                                               void* callback_data,
+                                               char** error) {
   // The VM should never call the isolate helper with a NULL flags.
   ASSERT(flags != NULL);
   ASSERT(flags->version == DART_FLAGS_CURRENT_VERSION);
@@ -677,30 +777,30 @@
         script_uri, package_root, package_config, flags, error, &exit_code);
   }
   bool is_main_isolate = false;
-  return CreateIsolateAndSetupHelper(is_main_isolate, script_uri, main,
-                                     package_root, package_config, flags,
-                                     callback_data, error, &exit_code);
+  return CreateIsolateGroupAndSetupHelper(is_main_isolate, script_uri, main,
+                                          package_root, package_config, flags,
+                                          callback_data, error, &exit_code);
 }
 
-static void OnIsolateShutdown(void* callback_data) {
+static void OnIsolateShutdown(void* isolate_group_data, void* isolate_data) {
   Dart_EnterScope();
-
   Dart_Handle sticky_error = Dart_GetStickyError();
   if (!Dart_IsNull(sticky_error) && !Dart_IsFatalError(sticky_error)) {
     Syslog::PrintErr("%s\n", Dart_GetError(sticky_error));
   }
-
-  IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data);
-  isolate_data->OnIsolateShutdown();
-
   Dart_ExitScope();
 }
 
-static void DeleteIsolateData(void* callback_data) {
-  IsolateData* isolate_data = reinterpret_cast<IsolateData*>(callback_data);
+static void DeleteIsolateData(void* isolate_group_data, void* callback_data) {
+  auto isolate_data = reinterpret_cast<IsolateData*>(callback_data);
   delete isolate_data;
 }
 
+static void DeleteIsolateGroupData(void* callback_data) {
+  auto isolate_group_data = reinterpret_cast<IsolateGroupData*>(callback_data);
+  delete isolate_group_data;
+}
+
 static const char* kStdoutStreamId = "Stdout";
 static const char* kStderrStreamId = "Stderr";
 
@@ -787,7 +887,7 @@
 }
 
 bool RunMainIsolate(const char* script_name, CommandLineOptions* dart_options) {
-  // Call CreateIsolateAndSetup which creates an isolate and loads up
+  // Call CreateIsolateGroupAndSetup which creates an isolate and loads up
   // the specified application script.
   char* error = NULL;
   bool is_main_isolate = true;
@@ -795,7 +895,7 @@
   Dart_IsolateFlags flags;
   Dart_IsolateFlagsInitialize(&flags);
 
-  Dart_Isolate isolate = CreateIsolateAndSetupHelper(
+  Dart_Isolate isolate = CreateIsolateGroupAndSetupHelper(
       is_main_isolate, script_name, "main", Options::package_root(),
       Options::packages_file(), &flags, NULL /* callback_data */, &error,
       &exit_code);
@@ -823,8 +923,8 @@
 
   Dart_EnterScope();
 
-  IsolateData* isolate_data =
-      reinterpret_cast<IsolateData*>(Dart_IsolateData(isolate));
+  auto isolate_group_data =
+      reinterpret_cast<IsolateGroupData*>(Dart_IsolateGroupData(isolate));
   if (Options::gen_snapshot_kind() == kKernel) {
     if (vm_run_app_snapshot) {
       Syslog::PrintErr(
@@ -834,7 +934,7 @@
       Platform::Exit(kErrorExitCode);
     }
     Snapshot::GenerateKernel(Options::snapshot_filename(), script_name,
-                             isolate_data->resolved_packages_config());
+                             isolate_group_data->resolved_packages_config());
   } else {
     // Lookup the library of the root script.
     Dart_Handle root_lib = Dart_RootLibrary();
@@ -1107,9 +1207,11 @@
   init_params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
   init_params.vm_snapshot_data = vm_snapshot_data;
   init_params.vm_snapshot_instructions = vm_snapshot_instructions;
-  init_params.create = CreateIsolateAndSetup;
-  init_params.shutdown = OnIsolateShutdown;
-  init_params.cleanup = DeleteIsolateData;
+  init_params.create_group = CreateIsolateGroupAndSetup;
+  init_params.initialize_isolate = OnIsolateInitialize;
+  init_params.shutdown_isolate = OnIsolateShutdown;
+  init_params.cleanup_isolate = DeleteIsolateData;
+  init_params.cleanup_group = DeleteIsolateGroupData;
   init_params.file_open = DartUtils::OpenFile;
   init_params.file_read = DartUtils::ReadFile;
   init_params.file_write = DartUtils::WriteFile;
diff --git a/runtime/bin/namespace.cc b/runtime/bin/namespace.cc
index df63748..c322c52 100644
--- a/runtime/bin/namespace.cc
+++ b/runtime/bin/namespace.cc
@@ -119,7 +119,7 @@
                                                   Namespace** namespc) {
   Dart_Handle namespc_obj = Dart_GetNativeArgument(args, index);
   if (Dart_IsError(namespc_obj)) {
-    Dart_PropagateError(namespc_obj);
+    return namespc_obj;
   }
   DEBUG_ASSERT(IsNamespace(namespc_obj));
 
@@ -129,6 +129,10 @@
   if (Dart_IsError(result)) {
     return result;
   }
+  if (*namespc == NULL) {
+    return Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer"));
+  }
   return Dart_Null();
 }
 
diff --git a/runtime/bin/platform_android.cc b/runtime/bin/platform_android.cc
index db61adf..5fa361f 100644
--- a/runtime/bin/platform_android.cc
+++ b/runtime/bin/platform_android.cc
@@ -33,6 +33,7 @@
       strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
       siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
+  Dart_PrepareToAbort();
   abort();
 }
 
@@ -40,8 +41,7 @@
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
   // handler error EPIPE is set instead.
-  struct sigaction act;
-  bzero(&act, sizeof(act));
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   if (sigaction(SIGPIPE, &act, 0) != 0) {
     perror("Setting signal handler failed");
@@ -157,6 +157,7 @@
 
 void Platform::Exit(int exit_code) {
   Console::RestoreConfig();
+  Dart_PrepareToAbort();
   exit(exit_code);
 }
 
diff --git a/runtime/bin/platform_fuchsia.cc b/runtime/bin/platform_fuchsia.cc
index 7893f14..3f4d7a0 100644
--- a/runtime/bin/platform_fuchsia.cc
+++ b/runtime/bin/platform_fuchsia.cc
@@ -149,6 +149,7 @@
 
 void Platform::Exit(int exit_code) {
   Console::RestoreConfig();
+  Dart_PrepareToAbort();
   exit(exit_code);
 }
 
diff --git a/runtime/bin/platform_linux.cc b/runtime/bin/platform_linux.cc
index 1d259ac..b0fc285 100644
--- a/runtime/bin/platform_linux.cc
+++ b/runtime/bin/platform_linux.cc
@@ -32,6 +32,7 @@
       strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
       siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
+  Dart_PrepareToAbort();
   abort();
 }
 
@@ -39,8 +40,7 @@
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
   // handler error EPIPE is set instead.
-  struct sigaction act;
-  bzero(&act, sizeof(act));
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   if (sigaction(SIGPIPE, &act, 0) != 0) {
     perror("Setting signal handler failed");
@@ -164,6 +164,7 @@
 
 void Platform::Exit(int exit_code) {
   Console::RestoreConfig();
+  Dart_PrepareToAbort();
   exit(exit_code);
 }
 
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 1a6688c..79ff679 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -40,6 +40,7 @@
       strsignal(siginfo->si_signo), siginfo->si_signo, siginfo->si_code,
       siginfo->si_addr);
   Dart_DumpNativeStackTrace(context);
+  Dart_PrepareToAbort();
   abort();
 }
 
@@ -47,8 +48,7 @@
   // Turn off the signal handler for SIGPIPE as it causes the process
   // to terminate on writing to a closed pipe. Without the signal
   // handler error EPIPE is set instead.
-  struct sigaction act;
-  bzero(&act, sizeof(act));
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   if (sigaction(SIGPIPE, &act, 0) != 0) {
     perror("Setting signal handler failed");
@@ -253,6 +253,7 @@
 
 void Platform::Exit(int exit_code) {
   Console::RestoreConfig();
+  Dart_PrepareToAbort();
   exit(exit_code);
 }
 
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 2b4eacc..c5820b8 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -22,10 +22,6 @@
 
 
 namespace dart {
-
-// Defined in vm/os_thread_win.cc
-extern bool private_flag_windows_run_tls_destructors;
-
 namespace bin {
 
 const char* Platform::executable_name_ = NULL;
@@ -81,10 +77,9 @@
           ExceptionInfo->ExceptionRecord->ExceptionAddress);
       Dart_DumpNativeStackTrace(ExceptionInfo->ContextRecord);
       Console::RestoreConfig();
-      // TODO(zra): Remove once VM shuts down cleanly.
-      ::dart::private_flag_windows_run_tls_destructors = false;
       // Note: we want to abort(...) here instead of exiting because exiting
       // would not cause WER to generate a minidump.
+      Dart_PrepareToAbort();
       abort();
     }
     return EXCEPTION_CONTINUE_SEARCH;
@@ -291,12 +286,11 @@
 }
 
 void Platform::Exit(int exit_code) {
-  // TODO(zra): Remove once VM shuts down cleanly.
-  ::dart::private_flag_windows_run_tls_destructors = false;
   // Restore the console's output code page
   Console::RestoreConfig();
   // On Windows we use ExitProcess so that threads can't clobber the exit_code.
   // See: https://code.google.com/p/nativeclient/issues/detail?id=2870
+  Dart_PrepareToAbort();
   ::ExitProcess(exit_code);
 }
 
diff --git a/runtime/bin/process_android.cc b/runtime/bin/process_android.cc
index bbb0afa..285a316 100644
--- a/runtime/bin/process_android.cc
+++ b/runtime/bin/process_android.cc
@@ -1006,8 +1006,7 @@
     handler = handler->next();
   }
   if (listen) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SignalHandler;
     sigemptyset(&act.sa_mask);
     for (int i = 0; i < kSignalsCount; i++) {
@@ -1052,8 +1051,7 @@
     handler = next;
   }
   if (unlisten) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SIG_DFL;
     VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
diff --git a/runtime/bin/process_linux.cc b/runtime/bin/process_linux.cc
index afc9667..b487093 100644
--- a/runtime/bin/process_linux.cc
+++ b/runtime/bin/process_linux.cc
@@ -1000,8 +1000,7 @@
     handler = handler->next();
   }
   if (listen) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SignalHandler;
     sigemptyset(&act.sa_mask);
     for (int i = 0; i < kSignalsCount; i++) {
@@ -1048,8 +1047,7 @@
     handler = next;
   }
   if (unlisten) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SIG_DFL;
     sigaction(signal, &act, NULL);
   }
diff --git a/runtime/bin/process_macos.cc b/runtime/bin/process_macos.cc
index 4463855..366178c 100644
--- a/runtime/bin/process_macos.cc
+++ b/runtime/bin/process_macos.cc
@@ -1034,8 +1034,7 @@
     handler = handler->next();
   }
   if (listen) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SignalHandler;
     sigemptyset(&act.sa_mask);
     for (int i = 0; i < kSignalsCount; i++) {
@@ -1084,8 +1083,7 @@
     handler = next;
   }
   if (unlisten) {
-    struct sigaction act;
-    bzero(&act, sizeof(act));
+    struct sigaction act = {};
     act.sa_handler = SIG_DFL;
     VOID_NO_RETRY_EXPECTED(sigaction(signal, &act, NULL));
   }
diff --git a/runtime/bin/process_patch.dart b/runtime/bin/process_patch.dart
index 1e5ae1e..dd38f77 100644
--- a/runtime/bin/process_patch.dart
+++ b/runtime/bin/process_patch.dart
@@ -233,7 +233,14 @@
     if (path is! String) {
       throw new ArgumentError("Path is not a String: $path");
     }
-    _path = path;
+
+    if (Platform.isWindows) {
+      // Escape paths that may contain spaces
+      // Bug: https://github.com/dart-lang/sdk/issues/37751
+      _path = _windowsArgumentEscape(path);
+    } else {
+      _path = path;
+    }
 
     if (arguments is! List) {
       throw new ArgumentError("Arguments is not a List: $arguments");
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 019522b..aab804b 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -13,6 +13,7 @@
 #include "bin/snapshot_utils.h"
 #include "bin/thread.h"
 #include "bin/utils.h"
+#include "bin/vmservice_impl.h"
 #include "platform/assert.h"
 #include "vm/benchmark_test.h"
 #include "vm/dart.h"
@@ -28,9 +29,6 @@
 // TODO(iposva, asiva): This is a placeholder for the real unittest framework.
 namespace dart {
 
-// Defined in vm/os_thread_win.cc
-extern bool private_flag_windows_run_tls_destructors;
-
 // Snapshot pieces when we link in a snapshot.
 #if defined(DART_NO_SNAPSHOT)
 #error "run_vm_tests must be built with a snapshot"
@@ -48,7 +46,7 @@
 static const char* const kList = "List all Tests and Benchmarks";
 static const char* const kAllBenchmarks = "All Benchmarks";
 static const char* run_filter = kNone;
-static const char* kernel_snapshot = NULL;
+static const char* kernel_snapshot = nullptr;
 
 static int run_matches = 0;
 
@@ -102,9 +100,68 @@
     *error = strdup(Dart_GetError(result));                                    \
     Dart_ExitScope();                                                          \
     Dart_ShutdownIsolate();                                                    \
-    return NULL;                                                               \
+    return nullptr;                                                            \
   }
 
+static Dart_Isolate CreateAndSetupServiceIsolate(const char* script_uri,
+                                                 const char* package_root,
+                                                 const char* packages_config,
+                                                 Dart_IsolateFlags* flags,
+                                                 char** error) {
+  // We only enable the vm-service for this particular test.
+  // The vm-service seems to have some shutdown race which would cause other
+  // vm/cc tests to randomly time out due to inability to shut service-isolate
+  // down.
+  // Issue(https://dartbug.com/37741):
+  if (strcmp(run_filter, "DartAPI_InvokeVMServiceMethod") != 0) {
+    return nullptr;
+  }
+
+  ASSERT(script_uri != nullptr);
+  Dart_Isolate isolate = nullptr;
+  auto isolate_group_data = new bin::IsolateGroupData(
+      script_uri, package_root, packages_config, /*app_snapshot=*/nullptr,
+      /*isolate_run_app_snapshot=*/false);
+
+  const uint8_t* kernel_buffer = nullptr;
+  intptr_t kernel_buffer_size = 0;
+
+  bin::dfe.Init();
+  bin::dfe.LoadPlatform(&kernel_buffer, &kernel_buffer_size);
+  RELEASE_ASSERT(kernel_buffer != nullptr);
+
+  flags->load_vmservice_library = true;
+  isolate_group_data->SetKernelBufferUnowned(
+      const_cast<uint8_t*>(kernel_buffer), kernel_buffer_size);
+  isolate = Dart_CreateIsolateGroupFromKernel(
+      script_uri, DART_VM_SERVICE_ISOLATE_NAME, kernel_buffer,
+      kernel_buffer_size, flags, isolate_group_data, /*isolate_data=*/nullptr,
+      error);
+  if (isolate == nullptr) {
+    delete isolate_group_data;
+    return nullptr;
+  }
+
+  Dart_EnterScope();
+
+  Dart_Handle result =
+      Dart_SetLibraryTagHandler(bin::Loader::LibraryTagHandler);
+  CHECK_RESULT(result);
+
+  // Load embedder specific bits and return.
+  if (!bin::VmService::Setup("127.0.0.1", 0,
+                             /*dev_mode=*/false, /*auth_disabled=*/true,
+                             /*trace_loading=*/false, /*deterministic=*/true)) {
+    *error = strdup(bin::VmService::GetErrorMessage());
+    return nullptr;
+  }
+  result = Dart_SetEnvironmentCallback(bin::DartUtils::EnvironmentCallback);
+  CHECK_RESULT(result);
+  Dart_ExitScope();
+  Dart_ExitIsolate();
+  return isolate;
+}
+
 static Dart_Isolate CreateIsolateAndSetup(const char* script_uri,
                                           const char* main,
                                           const char* package_root,
@@ -112,33 +169,31 @@
                                           Dart_IsolateFlags* flags,
                                           void* data,
                                           char** error) {
-  ASSERT(script_uri != NULL);
-  const bool is_service_isolate =
-      strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0;
-  if (is_service_isolate) {
-    // We don't need service isolate for VM tests.
-    return NULL;
+  ASSERT(script_uri != nullptr);
+  if (strcmp(script_uri, DART_VM_SERVICE_ISOLATE_NAME) == 0) {
+    return CreateAndSetupServiceIsolate(script_uri, package_root,
+                                        packages_config, flags, error);
   }
   const bool is_kernel_isolate =
       strcmp(script_uri, DART_KERNEL_ISOLATE_NAME) == 0;
   if (!is_kernel_isolate) {
     *error =
         strdup("Spawning of only Kernel isolate is supported in run_vm_tests.");
-    return NULL;
+    return nullptr;
   }
-  Dart_Isolate isolate = NULL;
-  bin::IsolateData* isolate_data = NULL;
-  const uint8_t* kernel_service_buffer = NULL;
+  Dart_Isolate isolate = nullptr;
+  bin::IsolateGroupData* isolate_group_data = nullptr;
+  const uint8_t* kernel_service_buffer = nullptr;
   intptr_t kernel_service_buffer_size = 0;
 
   // Kernel isolate uses an app snapshot or the kernel service dill file.
-  if (kernel_snapshot != NULL &&
+  if (kernel_snapshot != nullptr &&
       (bin::DartUtils::SniffForMagicNumber(kernel_snapshot) ==
        bin::DartUtils::kAppJITMagicNumber)) {
     script_uri = kernel_snapshot;
     bin::AppSnapshot* app_snapshot =
         bin::Snapshot::TryReadAppSnapshot(script_uri);
-    ASSERT(app_snapshot != NULL);
+    ASSERT(app_snapshot != nullptr);
     const uint8_t* ignore_vm_snapshot_data;
     const uint8_t* ignore_vm_snapshot_instructions;
     const uint8_t* isolate_snapshot_data;
@@ -146,52 +201,54 @@
     app_snapshot->SetBuffers(
         &ignore_vm_snapshot_data, &ignore_vm_snapshot_instructions,
         &isolate_snapshot_data, &isolate_snapshot_instructions);
-    isolate_data = new bin::IsolateData(script_uri, package_root,
-                                        packages_config, app_snapshot);
-    isolate =
-        Dart_CreateIsolate(DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
-                           isolate_snapshot_data, isolate_snapshot_instructions,
-                           NULL, NULL, flags, isolate_data, error);
-    if (*error != NULL) {
+    isolate_group_data =
+        new bin::IsolateGroupData(script_uri, package_root, packages_config,
+                                  app_snapshot, app_snapshot != nullptr);
+    isolate = Dart_CreateIsolateGroup(
+        DART_KERNEL_ISOLATE_NAME, DART_KERNEL_ISOLATE_NAME,
+        isolate_snapshot_data, isolate_snapshot_instructions,
+        /*shared_data=*/nullptr, /*shared_instructions=*/nullptr, flags,
+        isolate_group_data, /*isolate_data=*/nullptr, error);
+    if (*error != nullptr) {
       free(*error);
-      *error = NULL;
+      *error = nullptr;
     }
     // If a test does not actually require the kernel isolate the main thead can
     // start calling Dart::Cleanup() while the kernel isolate is booting up.
     // This can cause the isolate to be killed early which will return `nullptr`
     // here.
     if (isolate == nullptr) {
-      delete isolate_data;
-      return NULL;
+      delete isolate_group_data;
+      return nullptr;
     }
   }
-  if (isolate == NULL) {
-    delete isolate_data;
-    isolate_data = NULL;
+  if (isolate == nullptr) {
+    delete isolate_group_data;
+    isolate_group_data = nullptr;
 
     bin::dfe.Init();
     bin::dfe.LoadKernelService(&kernel_service_buffer,
                                &kernel_service_buffer_size);
-    ASSERT(kernel_service_buffer != NULL);
-    isolate_data =
-        new bin::IsolateData(script_uri, package_root, packages_config, NULL);
-    isolate_data->SetKernelBufferUnowned(
+    ASSERT(kernel_service_buffer != nullptr);
+    isolate_group_data = new bin::IsolateGroupData(
+        script_uri, package_root, packages_config, nullptr, false);
+    isolate_group_data->SetKernelBufferUnowned(
         const_cast<uint8_t*>(kernel_service_buffer),
         kernel_service_buffer_size);
-    isolate = Dart_CreateIsolateFromKernel(
+    isolate = Dart_CreateIsolateGroupFromKernel(
         script_uri, main, kernel_service_buffer, kernel_service_buffer_size,
-        flags, isolate_data, error);
+        flags, isolate_group_data, /*isolate_data=*/nullptr, error);
   }
-  if (isolate == NULL) {
-    delete isolate_data;
-    return NULL;
+  if (isolate == nullptr) {
+    delete isolate_group_data;
+    return nullptr;
   }
 
   Dart_EnterScope();
 
   bin::DartUtils::SetOriginalWorkingDirectory();
   Dart_Handle result = bin::DartUtils::PrepareForScriptLoading(
-      false /* is_service_isolate */, false /* trace_loading */);
+      /*is_service_isolate=*/false, /*trace_loading=*/false);
   CHECK_RESULT(result);
 
   // Setup kernel service as the main script for this isolate.
@@ -204,18 +261,18 @@
   Dart_ExitScope();
   Dart_ExitIsolate();
   *error = Dart_IsolateMakeRunnable(isolate);
-  if (*error != NULL) {
+  if (*error != nullptr) {
     Dart_EnterIsolate(isolate);
     Dart_ShutdownIsolate();
-    return NULL;
+    return nullptr;
   }
 
   return isolate;
 }
 
-static void CleanupIsolate(void* callback_data) {
-  bin::IsolateData* isolate_data =
-      reinterpret_cast<bin::IsolateData*>(callback_data);
+static void CleanupIsolateGroup(void* callback_data) {
+  bin::IsolateGroupData* isolate_data =
+      reinterpret_cast<bin::IsolateGroupData*>(callback_data);
   delete isolate_data;
 }
 
@@ -231,7 +288,7 @@
 static int Main(int argc, const char** argv) {
   // Flags being passed to the Dart VM.
   int dart_argc = 0;
-  const char** dart_argv = NULL;
+  const char** dart_argv = nullptr;
 
   // Perform platform specific initialization.
   if (!dart::bin::Platform::Initialize()) {
@@ -277,7 +334,7 @@
 
   if (strncmp(argv[arg_pos], "--dfe", strlen("--dfe")) == 0) {
     const char* delim = strstr(argv[arg_pos], "=");
-    if (delim == NULL || strlen(delim + 1) == 0) {
+    if (delim == nullptr || strlen(delim + 1) == 0) {
       Syslog::PrintErr("Invalid value for the option: %s\n", argv[arg_pos]);
       PrintUsage();
       return 1;
@@ -303,7 +360,7 @@
   bin::EventHandler::Start();
 
   char* error = Flags::ProcessCommandLineFlags(dart_argc, dart_argv);
-  if (error != NULL) {
+  if (error != nullptr) {
     Syslog::PrintErr("Failed to parse flags: %s\n", error);
     free(error);
     return 1;
@@ -311,18 +368,22 @@
 
   TesterState::vm_snapshot_data = dart::bin::vm_snapshot_data;
   TesterState::create_callback = CreateIsolateAndSetup;
-  TesterState::cleanup_callback = CleanupIsolate;
+  TesterState::group_cleanup_callback = CleanupIsolateGroup;
   TesterState::argv = dart_argv;
   TesterState::argc = dart_argc;
 
   error = Dart::Init(
       dart::bin::vm_snapshot_data, dart::bin::vm_snapshot_instructions,
-      CreateIsolateAndSetup /* create */, nullptr /* shutdown */,
-      CleanupIsolate /* cleanup */, nullptr /* thread_exit */,
-      dart::bin::DartUtils::OpenFile, dart::bin::DartUtils::ReadFile,
-      dart::bin::DartUtils::WriteFile, dart::bin::DartUtils::CloseFile,
-      nullptr /* entropy_source */, nullptr /* get_service_assets */,
-      start_kernel_isolate, nullptr /* observer */);
+      /*create_group=*/CreateIsolateAndSetup,
+      /*initialize_isolate=*/nullptr,
+      /*shutdown_isolate=*/nullptr,
+      /*cleanup_isolate=*/nullptr,
+      /*cleanup_group=*/CleanupIsolateGroup,
+      /*thread_exit=*/nullptr, dart::bin::DartUtils::OpenFile,
+      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);
   if (error != nullptr) {
     Syslog::PrintErr("Failed to initialize VM: %s\n", error);
     free(error);
diff --git a/runtime/bin/secure_socket_filter.cc b/runtime/bin/secure_socket_filter.cc
index 63305bc..c1d9f57 100644
--- a/runtime/bin/secure_socket_filter.cc
+++ b/runtime/bin/secure_socket_filter.cc
@@ -38,12 +38,16 @@
     sizeof(SSLFilter) + (2 * SSLFilter::kInternalBIOSize);
 
 static SSLFilter* GetFilter(Dart_NativeArguments args) {
-  SSLFilter* filter;
+  SSLFilter* filter = NULL;
   Dart_Handle dart_this = ThrowIfError(Dart_GetNativeArgument(args, 0));
   ASSERT(Dart_IsInstance(dart_this));
   ThrowIfError(Dart_GetNativeInstanceField(
       dart_this, SSLFilter::kSSLFilterNativeFieldIndex,
       reinterpret_cast<intptr_t*>(&filter)));
+  if (filter == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return filter;
 }
 
diff --git a/runtime/bin/secure_socket_patch.dart b/runtime/bin/secure_socket_patch.dart
index 876e789..80dfd54 100644
--- a/runtime/bin/secure_socket_patch.dart
+++ b/runtime/bin/secure_socket_patch.dart
@@ -14,7 +14,7 @@
 @patch
 class _SecureFilter {
   @patch
-  factory _SecureFilter() => new _SecureFilterImpl();
+  factory _SecureFilter._() => new _SecureFilterImpl._();
 }
 
 @patch
@@ -22,7 +22,7 @@
 class X509Certificate {
   @patch
   @pragma("vm:entry-point")
-  factory X509Certificate._() => new _X509CertificateImpl();
+  factory X509Certificate._() => new _X509CertificateImpl._();
 }
 
 class _SecureSocket extends _Socket implements SecureSocket {
@@ -75,7 +75,7 @@
   @pragma("vm:entry-point")
   static final int ENCRYPTED_SIZE = 10 * 1024;
 
-  _SecureFilterImpl() {
+  _SecureFilterImpl._() {
     buffers = new List<_ExternalBuffer>(_RawSecureSocket.bufferCount);
     for (int i = 0; i < _RawSecureSocket.bufferCount; ++i) {
       buffers[i] = new _ExternalBuffer(
@@ -206,7 +206,7 @@
     implements X509Certificate {
   // The native field must be set manually on a new object, in native code.
   // This is done by WrappedX509 in secure_socket.cc.
-  _X509CertificateImpl();
+  _X509CertificateImpl._();
 
   Uint8List _cachedDer;
   Uint8List get _der native "X509_Der";
diff --git a/runtime/bin/security_context.cc b/runtime/bin/security_context.cc
index ffcda3db..3300b11 100644
--- a/runtime/bin/security_context.cc
+++ b/runtime/bin/security_context.cc
@@ -86,6 +86,10 @@
   ThrowIfError(Dart_GetNativeInstanceField(
       dart_this, SSLCertContext::kSecurityContextNativeFieldIndex,
       reinterpret_cast<intptr_t*>(&context)));
+  if (context == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return context;
 }
 
@@ -644,6 +648,10 @@
   ThrowIfError(Dart_GetNativeInstanceField(
       dart_this, SSLCertContext::kX509NativeFieldIndex,
       reinterpret_cast<intptr_t*>(&certificate)));
+  if (certificate == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return certificate;
 }
 
diff --git a/runtime/bin/snapshot_utils.cc b/runtime/bin/snapshot_utils.cc
index 2a07139..58407ce 100644
--- a/runtime/bin/snapshot_utils.cc
+++ b/runtime/bin/snapshot_utils.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 <memory>
+
 #include "bin/snapshot_utils.h"
 
 #include "bin/dartutils.h"
@@ -240,7 +242,17 @@
 #if defined(DART_PRECOMPILED_RUNTIME)
   // For testing AOT with the standalone embedder, we also support loading
   // from a dynamic library to simulate what happens on iOS.
+
+#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS)
+  // On Linux and OSX, resolve the script path before passing into dlopen()
+  // since dlopen will not search the filesystem for paths like 'libtest.so'.
+  std::unique_ptr<char, decltype(std::free)*> absolute_path{
+      realpath(script_name, nullptr), std::free};
+  script_name = absolute_path.get();
+#endif
+
   snapshot = TryReadAppSnapshotDynamicLibrary(script_name);
+
   if (snapshot != NULL) {
     return snapshot;
   }
diff --git a/runtime/bin/socket.cc b/runtime/bin/socket.cc
index b706482..0b590e6 100644
--- a/runtime/bin/socket.cc
+++ b/runtime/bin/socket.cc
@@ -1106,6 +1106,10 @@
     Dart_PropagateError(err);
   }
   Socket* socket = reinterpret_cast<Socket*>(id);
+  if (socket == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return socket;
 }
 
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index f5c3a9c..56fbc64 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -475,7 +475,9 @@
           // Keep first error, if present.
           if (error == null) {
             int errorCode = result.errorCode;
-            if (errorCode != null && socket.isBindError(errorCode)) {
+            if (sourceAddress != null &&
+                errorCode != null &&
+                socket.isBindError(errorCode)) {
               error = createError(result, "Bind failed", sourceAddress);
             } else {
               error = createError(result, "Connection failed", address, port);
@@ -1606,10 +1608,10 @@
   }
 }
 
-class _Socket extends Stream<List<int>> implements Socket {
+class _Socket extends Stream<Uint8List> implements Socket {
   RawSocket _raw; // Set to null when the raw socket is closed.
   bool _closed = false; // Set to true when the raw socket is closed.
-  StreamController<List<int>> _controller;
+  StreamController<Uint8List> _controller;
   bool _controllerClosed = false;
   _SocketStreamConsumer _consumer;
   IOSink _sink;
@@ -1617,7 +1619,7 @@
   var _detachReady;
 
   _Socket(this._raw) {
-    _controller = new StreamController<List<int>>(
+    _controller = new StreamController<Uint8List>(
         sync: true,
         onListen: _onSubscriptionStateChange,
         onCancel: _onSubscriptionStateChange,
@@ -1647,7 +1649,7 @@
   // is Socket and not _NativeSocket.
   _NativeSocket get _nativeSocket => (_raw as _RawSocket)._socket;
 
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
+  StreamSubscription<Uint8List> listen(void onData(Uint8List event),
       {Function onError, void onDone(), bool cancelOnError}) {
     return _controller.stream.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
@@ -1782,6 +1784,7 @@
   void _onData(event) {
     switch (event) {
       case RawSocketEvent.read:
+        if (_raw == null) break;
         var buffer = _raw.read();
         if (buffer != null) _controller.add(buffer);
         break;
@@ -1812,11 +1815,17 @@
     _consumer.done(error, stackTrace);
   }
 
-  int _write(List<int> data, int offset, int length) =>
-      _raw.write(data, offset, length);
+  int _write(List<int> data, int offset, int length) {
+    if (_raw != null) {
+      return _raw.write(data, offset, length);
+    }
+    return 0;
+  }
 
   void _enableWriteEvent() {
-    _raw.writeEventsEnabled = true;
+    if (_raw != null) {
+      _raw.writeEventsEnabled = true;
+    }
   }
 
   void _disableWriteEvent() {
diff --git a/runtime/bin/sync_socket.cc b/runtime/bin/sync_socket.cc
index 4589d4a..99cf792 100644
--- a/runtime/bin/sync_socket.cc
+++ b/runtime/bin/sync_socket.cc
@@ -351,6 +351,10 @@
     return result;
   }
   *socket = reinterpret_cast<SynchronousSocket*>(id);
+  if (*socket == NULL) {
+    Dart_PropagateError(Dart_NewUnhandledExceptionError(
+        DartUtils::NewInternalError("No native peer")));
+  }
   return result;
 }
 
diff --git a/runtime/bin/sync_socket_patch.dart b/runtime/bin/sync_socket_patch.dart
index 1f525c1..332d772 100644
--- a/runtime/bin/sync_socket_patch.dart
+++ b/runtime/bin/sync_socket_patch.dart
@@ -91,7 +91,7 @@
       var address = it.current;
       var socket = new _NativeSynchronousSocket();
       socket.localAddress = address;
-      var result = socket.nativeCreateConnectSync(address._in_addr, port);
+      var result = socket._nativeCreateConnectSync(address._in_addr, port);
       if (result is OSError) {
         // Keep first error, if present.
         if (error == null) {
@@ -117,7 +117,7 @@
   }
 
   InternetAddress get address => localAddress;
-  int get available => nativeAvailable();
+  int get available => _nativeAvailable();
 
   int get port {
     if (localPort != 0) {
@@ -126,7 +126,7 @@
     if (isClosed) {
       throw const SocketException.closed();
     }
-    var result = nativeGetPort();
+    var result = _nativeGetPort();
     if (result is OSError) {
       throw result;
     }
@@ -137,7 +137,7 @@
     if (isClosed) {
       throw const SocketException.closed();
     }
-    var result = nativeGetRemotePeer();
+    var result = _nativeGetRemotePeer();
     if (result is OSError) {
       throw result;
     }
@@ -149,7 +149,7 @@
     if (isClosed) {
       throw const SocketException.closed();
     }
-    var result = nativeGetRemotePeer();
+    var result = _nativeGetRemotePeer();
     if (result is OSError) {
       throw result;
     }
@@ -158,7 +158,7 @@
 
   void closeSync() {
     if (!isClosed) {
-      nativeCloseSync();
+      _nativeCloseSync();
       _SocketResourceInfo.SocketClosed(resourceInfo);
       isClosed = true;
     }
@@ -209,7 +209,7 @@
     if (end == start) {
       return 0;
     }
-    var result = nativeReadInto(buffer, start, (end - start));
+    var result = _nativeReadInto(buffer, start, (end - start));
     if (result is OSError) {
       throw new SocketException("readIntoSync failed", osError: result);
     }
@@ -229,7 +229,7 @@
     if (len == 0) {
       return null;
     }
-    var result = nativeRead(len);
+    var result = _nativeRead(len);
     if (result is OSError) {
       throw result;
     }
@@ -275,7 +275,7 @@
     if (isClosedWrite) {
       closeSync();
     } else {
-      nativeShutdownRead();
+      _nativeShutdownRead();
     }
     isClosedRead = true;
   }
@@ -287,7 +287,7 @@
     if (isClosedRead) {
       closeSync();
     } else {
-      nativeShutdownWrite();
+      _nativeShutdownWrite();
     }
     isClosedWrite = true;
   }
@@ -313,7 +313,7 @@
 
     _BufferAndStart bufferAndStart =
         _ensureFastAndSerializableByteData(buffer, start, end);
-    var result = nativeWrite(bufferAndStart.buffer, bufferAndStart.start,
+    var result = _nativeWrite(bufferAndStart.buffer, bufferAndStart.start,
         end - (start - bufferAndStart.start));
     if (result is OSError) {
       throw new SocketException("writeFromSync failed", osError: result);
@@ -333,17 +333,17 @@
   // Native method declarations.
   static _nativeLookupRequest(host, int type)
       native "SynchronousSocket_LookupRequest";
-  nativeCreateConnectSync(host, int port)
+  _nativeCreateConnectSync(host, int port)
       native "SynchronousSocket_CreateConnectSync";
-  nativeAvailable() native "SynchronousSocket_Available";
-  nativeCloseSync() native "SynchronousSocket_CloseSync";
-  int nativeGetPort() native "SynchronousSocket_GetPort";
-  List nativeGetRemotePeer() native "SynchronousSocket_GetRemotePeer";
-  nativeRead(int len) native "SynchronousSocket_Read";
-  nativeReadInto(List<int> buffer, int offset, int bytes)
+  _nativeAvailable() native "SynchronousSocket_Available";
+  _nativeCloseSync() native "SynchronousSocket_CloseSync";
+  int _nativeGetPort() native "SynchronousSocket_GetPort";
+  List _nativeGetRemotePeer() native "SynchronousSocket_GetRemotePeer";
+  _nativeRead(int len) native "SynchronousSocket_Read";
+  _nativeReadInto(List<int> buffer, int offset, int bytes)
       native "SynchronousSocket_ReadList";
-  nativeShutdownRead() native "SynchronousSocket_ShutdownRead";
-  nativeShutdownWrite() native "SynchronousSocket_ShutdownWrite";
-  nativeWrite(List<int> buffer, int offset, int bytes)
+  _nativeShutdownRead() native "SynchronousSocket_ShutdownRead";
+  _nativeShutdownWrite() native "SynchronousSocket_ShutdownWrite";
+  _nativeWrite(List<int> buffer, int offset, int bytes)
       native "SynchronousSocket_WriteList";
 }
diff --git a/runtime/docs/compiler/pragmas_recognized_by_compiler.md b/runtime/docs/compiler/pragmas_recognized_by_compiler.md
index 21b2d13..b3ec315 100644
--- a/runtime/docs/compiler/pragmas_recognized_by_compiler.md
+++ b/runtime/docs/compiler/pragmas_recognized_by_compiler.md
@@ -1,6 +1,31 @@
-# @pragma annotations recognized by the compiler.
+# Pragma annotations recognized by the compiler
 
-## Annotations for return types and field types.
+## Annotations for functions and methods
+
+### Changing whether a function or method is inlined
+
+The user can change whether the VM attempts to inline a given function or method
+with the following pragmas.
+
+#### Requesting a function be inlined
+
+```dart
+@pragma("vm:prefer-inline")
+```
+
+Here, the VM will inline the annotated function when possible. However, other
+factors can prevent inlining and thus this pragma may not always be respected.
+
+#### Requesting a function never be inlined
+
+```dart
+@pragma("vm:never-inline")
+```
+
+Here, the VM will not inline the annotated function. In this case, the pragma
+is always respected.
+
+## Annotations for return types and field types
 
 The VM is not able to see across method calls (apart from inlining) and
 therefore does not know anything about the return'ed values of calls, except for
@@ -9,10 +34,10 @@
 To improve this we have two types of additional information sources the VM
 utilizes to gain knowledge about return types:
 
-   - inferred types (stored in kernel metadata): these are computed by global
-     transformations (e.g. TFA) and are only available in AOT mode
+- inferred types (stored in kernel metadata): these are computed by global
+  transformations (e.g. TFA) and are only available in AOT mode
 
-   - @pragma annotations: these are recognized in JIT and AOT mode
+- `@pragma` annotations: these are recognized in JIT and AOT mode
 
 This return type information is mainly used in the VM's type propagator.
 
@@ -20,22 +45,31 @@
 therefore restrict those annotations to only have an affect inside dart:
 libraries.
 
-### @pragma("vm:exact-result-type", <type>) annotation
+### Providing an exact result type
+
+```dart
+@pragma("vm:exact-result-type", <type>)
+```
 
 Tells the VM about the exact result type (i.e. the exact class-id) of a function
 or a field load.
 
 There are two limitations on this pragma:
 
-0. The Dart object returned by the method at runtime must have **exactly** the type specified in the annotation (not a subtype).
+- The Dart object returned by the method at runtime must have **exactly** the
+  type specified in the annotation (not a subtype).
 
-1. The exact return type declared in the pragma must be a subtype of the interface type declared in the method signature.
-   Note that this restriction is not enforced automatically by the compiler.
+- The exact return type declared in the pragma must be a subtype of the
+  interface type declared in the method signature.
+
+  **Note:** This limitation is not enforced automatically by the compiler.
 
 If those limitations are violated, undefined behavior may result.
-Note that since `null` is an instance of the `Null` type, which is a subtype of any other, exactness of the annotated result type implies that the result must be non-null.
+Note that since `null` is an instance of the `Null` type, which is a subtype of
+any other, exactness of the annotated result type implies that the result must
+be non-null.
 
-#### Syntax
+#### Examples for exact result types
 
 ```dart
 class A {}
@@ -60,17 +94,21 @@
 }
 ```
 
-### @pragma("vm:non-nullable-result-type") annotation
+### Declaring a result type non-nullable
+
+```dart
+@pragma("vm:non-nullable-result-type")
+```
 
 Tells the VM that the method/field cannot return `null`.
 
 There is one limitation on this pragma:
 
-0. The Dart object returned by the method at runtime **must not** return `null`.
+- The Dart object returned by the method at runtime **must not** return `null`.
 
 If this limitation is violated, undefined behavior may result.
 
-#### Syntax
+#### Examples for non-nullable result types
 
 ```dart
 @pragma("vm:non-nullable-result-type")
diff --git a/runtime/docs/pragmas.md b/runtime/docs/pragmas.md
index a896592..ad3b987 100644
--- a/runtime/docs/pragmas.md
+++ b/runtime/docs/pragmas.md
@@ -7,6 +7,8 @@
 | Pragma | Meaning |
 | --- | --- |
 | `vm:entry-point` | [Defining entry-points into Dart code for an embedder or native methods](compiler/aot/entry_point_pragma.md) |
+| `vm:never-inline` | [Never inline a function or method](compiler/pragmas_recognized_by_compiler.md#requesting-a-function-never-be-inlined)  |
+| `vm:prefer-inline` | [Inline a function or method when possible](compiler/pragmas_recognized_by_compiler.md#requesting-a-function-be-inlined)  |
 
 ## Pragmas for internal use
 
@@ -14,7 +16,7 @@
 
 | Pragma | Meaning |
 | --- | --- |
-| `vm:exact-result-type` | [Declaring an exact result type of a method](compiler/result_type_pragma.md) |
+| `vm:exact-result-type` | [Declaring an exact result type of a method](compiler/pragmas_recognized_by_compiler.md#providing-an-exact-result-type) |
 
 ## Pragmas for internal testing
 
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index 66a90d8..7e60a43 100644
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -76,7 +76,7 @@
  * current isolate may be NULL, in which case no isolate is ready to
  * execute. Most of the Dart apis require there to be a current
  * isolate in order to function without error. The current isolate is
- * set by any call to Dart_CreateIsolate or Dart_EnterIsolate.
+ * set by any call to Dart_CreateIsolateGroup or Dart_EnterIsolate.
  */
 typedef struct _Dart_Isolate* Dart_Isolate;
 
@@ -541,7 +541,7 @@
  *
  * This callback, provided by the embedder, is called when the VM
  * needs to create an isolate. The callback should create an isolate
- * by calling Dart_CreateIsolate and load any scripts required for
+ * by calling Dart_CreateIsolateGroup and load any scripts required for
  * execution.
  *
  * This callback may be called on a different thread than the one
@@ -550,7 +550,7 @@
  * When the function returns NULL, it is the responsibility of this
  * function to ensure that Dart_ShutdownIsolate has been called if
  * required (for example, if the isolate was created successfully by
- * Dart_CreateIsolate() but the root library fails to load
+ * Dart_CreateIsolateGroup() but the root library fails to load
  * successfully, then the function should call Dart_ShutdownIsolate
  * before returning).
  *
@@ -560,7 +560,7 @@
  * freed.
  *
  * \param script_uri The uri of the main source file or snapshot to load.
- *   Either the URI of the parent isolate set in Dart_CreateIsolate for
+ *   Either the URI of the parent isolate set in Dart_CreateIsolateGroup for
  *   Isolate.spawn, or the argument to Isolate.spawnUri canonicalized by the
  *   library tag handler of the parent isolate.
  *   The callback is responsible for loading the program by a call to
@@ -582,20 +582,54 @@
  *   from the spawning isolate or passed as parameters when spawning the
  *   isolate from Dart code.
  * \param callback_data The callback data which was passed to the
- *   parent isolate when it was created by calling Dart_CreateIsolate().
+ *   parent isolate when it was created by calling Dart_CreateIsolateGroup().
  * \param error A structure into which the embedder can place a
  *   C string containing an error message in the case of failures.
  *
  * \return The embedder returns NULL if the creation and
  *   initialization was not successful and the isolate if successful.
  */
-typedef Dart_Isolate (*Dart_IsolateCreateCallback)(const char* script_uri,
-                                                   const char* main,
-                                                   const char* package_root,
-                                                   const char* package_config,
-                                                   Dart_IsolateFlags* flags,
-                                                   void* callback_data,
-                                                   char** error);
+typedef Dart_Isolate (*Dart_IsolateGroupCreateCallback)(
+    const char* script_uri,
+    const char* main,
+    const char* package_root,
+    const char* package_config,
+    Dart_IsolateFlags* flags,
+    void* callback_data,
+    char** error);
+
+/**
+ * An isolate initialization callback function.
+ *
+ * This callback, provided by the embedder, is called when the VM has created an
+ * isolate within an existing isolate group (i.e. from the same source as an
+ * existing isolate).
+ *
+ * The callback should setup native resolvers and might want to set a custom
+ * message handler via [Dart_SetMessageNotifyCallback] and mark the isolate as
+ * runnable.
+ *
+ * This callback may be called on a different thread than the one
+ * running the parent isolate.
+ *
+ * When the function returns `false`, it is the responsibility of this
+ * function to ensure that `Dart_ShutdownIsolate` has been called.
+ *
+ * When the function returns `false`, the function should set *error to
+ * a malloc-allocated buffer containing a useful error message.  The
+ * caller of this function (the VM) will make sure that the buffer is
+ * freed.
+ *
+ * \param child_isolate_data The callback data to associate with the new
+ *        child isolate.
+ * \param error A structure into which the embedder can place a
+ *   C string containing an error message in the case the initialization fails.
+ *
+ * \return The embedder returns true if the initialization was successful and
+ *         false otherwise (in which case the VM will terminate the isolate).
+ */
+typedef bool (*Dart_InitializeIsolateCallback)(void** child_isolate_data,
+                                               char** error);
 
 /**
  * An isolate unhandled exception callback function.
@@ -614,11 +648,13 @@
  * This function should be used to dispose of native resources that
  * are allocated to an isolate in order to avoid leaks.
  *
- * \param callback_data The same callback data which was passed to the
- *   isolate when it was created.
- *
+ * \param isolate_group_data The same callback data which was passed to the
+ *   isolate group when it was created.
+ * \param isolate_data The same callback data which was passed to the isolate
+ *   when it was created.
  */
-typedef void (*Dart_IsolateShutdownCallback)(void* callback_data);
+typedef void (*Dart_IsolateShutdownCallback)(void* isolate_group_data,
+                                             void* isolate_data);
 
 /**
  * An isolate cleanup callback function.
@@ -630,11 +666,28 @@
  * This function should be used to dispose of native resources that
  * are allocated to an isolate in order to avoid leaks.
  *
- * \param callback_data The same callback data which was passed to the
- *   isolate when it was created.
+ * \param isolate_group_data The same callback data which was passed to the
+ *   isolate group when it was created.
+ * \param isolate_data The same callback data which was passed to the isolate
+ *   when it was created.
+ */
+typedef void (*Dart_IsolateCleanupCallback)(void* isolate_group_data,
+                                            void* isolate_data);
+
+/**
+ * An isolate group cleanup callback function.
+ *
+ * This callback, provided by the embedder, is called after the vm
+ * shuts down an isolate group.
+ *
+ * This function should be used to dispose of native resources that
+ * are allocated to an isolate in order to avoid leaks.
+ *
+ * \param isolate_group_data The same callback data which was passed to the
+ *   isolate group when it was created.
  *
  */
-typedef void (*Dart_IsolateCleanupCallback)(void* callback_data);
+typedef void (*Dart_IsolateGroupCleanupCallback)(void* isolate_group_data);
 
 /**
  * A thread death callback function.
@@ -739,12 +792,17 @@
  * \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 create A function to be called during isolate creation.
- *   See Dart_IsolateCreateCallback.
- * \param shutdown A function to be called when an isolate is shutdown.
+ * \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 is shutdown.
+ * \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.
@@ -755,9 +813,11 @@
   int32_t version;
   const uint8_t* vm_snapshot_data;
   const uint8_t* vm_snapshot_instructions;
-  Dart_IsolateCreateCallback create;
-  Dart_IsolateShutdownCallback shutdown;
-  Dart_IsolateCleanupCallback cleanup;
+  Dart_IsolateGroupCreateCallback create_group;
+  Dart_InitializeIsolateCallback initialize_isolate;
+  Dart_IsolateShutdownCallback shutdown_isolate;
+  Dart_IsolateCleanupCallback cleanup_isolate;
+  Dart_IsolateGroupCleanupCallback cleanup_group;
   Dart_ThreadExitCallback thread_exit;
   Dart_FileOpenCallback file_open;
   Dart_FileReadCallback file_read;
@@ -824,7 +884,7 @@
  * 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_IsolateCreateCallback when a child
+ *   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.
@@ -835,7 +895,7 @@
  *   remain valid until the isolate shuts down.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param callback_data Embedder data.  This data will be passed to
- *   the Dart_IsolateCreateCallback when new isolates are spawned from
+ *   the Dart_IsolateGroupCreateCallback when new isolates are spawned from
  *   this parent isolate.
  * \param error Returns NULL if creation is successful, an error message
  *   otherwise. The caller is responsible for calling free() on the error
@@ -844,15 +904,16 @@
  * \return The new isolate on success, or NULL if isolate creation failed.
  */
 DART_EXPORT Dart_Isolate
-Dart_CreateIsolate(const char* script_uri,
-                   const char* name,
-                   const uint8_t* isolate_snapshot_data,
-                   const uint8_t* isolate_snapshot_instructions,
-                   const uint8_t* shared_data,
-                   const uint8_t* shared_instructions,
-                   Dart_IsolateFlags* flags,
-                   void* callback_data,
-                   char** error);
+Dart_CreateIsolateGroup(const char* script_uri,
+                        const char* name,
+                        const uint8_t* isolate_snapshot_data,
+                        const uint8_t* isolate_snapshot_instructions,
+                        const uint8_t* shared_data,
+                        const uint8_t* shared_instructions,
+                        Dart_IsolateFlags* flags,
+                        void* isolate_group_data,
+                        void* isolate_data,
+                        char** error);
 /* TODO(turnidge): Document behavior when there is already a current
  * isolate. */
 
@@ -863,7 +924,7 @@
  * 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_IsolateCreateCallback when a child
+ *   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.
@@ -873,7 +934,7 @@
  *   remain valid until isolate shutdown.
  * \param flags Pointer to VM specific flags or NULL for default flags.
  * \param callback_data Embedder data.  This data will be passed to
- *   the Dart_IsolateCreateCallback when new isolates are spawned from
+ *   the Dart_IsolateGroupCreateCallback when new isolates are spawned from
  *   this parent isolate.
  * \param error Returns NULL if creation is successful, an error message
  *   otherwise. The caller is responsible for calling free() on the error
@@ -882,13 +943,14 @@
  * \return The new isolate on success, or NULL if isolate creation failed.
  */
 DART_EXPORT Dart_Isolate
-Dart_CreateIsolateFromKernel(const char* script_uri,
-                             const char* name,
-                             const uint8_t* kernel_buffer,
-                             intptr_t kernel_buffer_size,
-                             Dart_IsolateFlags* flags,
-                             void* callback_data,
-                             char** error);
+Dart_CreateIsolateGroupFromKernel(const char* script_uri,
+                                  const char* name,
+                                  const uint8_t* kernel_buffer,
+                                  intptr_t kernel_buffer_size,
+                                  Dart_IsolateFlags* flags,
+                                  void* isolate_group_data,
+                                  void* isolate_data,
+                                  char** error);
 /**
  * Shuts down the current isolate. After this call, the current isolate is NULL.
  * Any current scopes created by Dart_EnterScope will be exited. Invokes the
@@ -906,20 +968,32 @@
 DART_EXPORT Dart_Isolate Dart_CurrentIsolate();
 
 /**
- * Returns the callback data associated with the current Isolate. This data was
- * passed to the isolate when it was created.
+ * 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();
 
 /**
- * Returns the callback data associated with the specified Isolate. This data
- * was passed to the isolate when it was created.
- * The embedder is responsible for ensuring the consistency of this data
- * with respect to the lifecycle of an Isolate.
+ * Returns the callback data associated with the given isolate. This
+ * data was set when the isolate got created or initialized.
  */
 DART_EXPORT void* Dart_IsolateData(Dart_Isolate isolate);
 
 /**
+ * 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();
+
+/**
+ * Returns the callback data associated with the specified isolate group. This
+ * data was passed to the isolate when it was created.
+ * The embedder is responsible for ensuring the consistency of this data
+ * with respect to the lifecycle of an isolate group.
+ */
+DART_EXPORT void* Dart_IsolateGroupData(Dart_Isolate isolate);
+
+/**
  * Returns the debugging name for the current isolate.
  *
  * This name is unique to each isolate and should only be used to make
@@ -944,6 +1018,20 @@
 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate);
 
 /**
+ * Kills the given isolate.
+ *
+ * This function has the same effect as dart:isolate's
+ * Isolate.kill(priority:immediate).
+ * It can interrupt ordinary Dart code but not native code. If the isolate is
+ * in the middle of a long running native function, the isolate will not be
+ * killed until control returns to Dart.
+ *
+ * Does not require a current isolate. It is safe to kill the current isolate if
+ * there is one.
+ */
+DART_EXPORT void Dart_KillIsolate(Dart_Isolate isolate);
+
+/**
  * Notifies the VM that the embedder expects to be idle until |deadline|. The VM
  * may use this time to perform garbage collection or other tasks to avoid
  * delays during execution of Dart code in the future.
@@ -2514,9 +2602,9 @@
 typedef struct _Dart_NativeArguments* Dart_NativeArguments;
 
 /**
- * Extracts current isolate data from the native arguments structure.
+ * Extracts current isolate group data from the native arguments structure.
  */
-DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args);
+DART_EXPORT void* Dart_GetNativeIsolateGroupData(Dart_NativeArguments args);
 
 typedef enum {
   Dart_NativeArgument_kBool = 0,
@@ -2918,7 +3006,7 @@
  * Requires there to be no current root library.
  *
  * \param buffer A buffer which contains a kernel binary (see
- *     pkg/kernel/binary.md). Must remain valid until isolate shutdown.
+ *     pkg/kernel/binary.md). Must remain valid until isolate group shutdown.
  * \param buffer_size Length of the passed in buffer.
  *
  * \return A handle to the root library, or an error.
@@ -3288,7 +3376,7 @@
  *  Running this snapshot requires a VM compiled with DART_PRECOMPILED_SNAPSHOT.
  *  The kDartVmSnapshotData and kDartVmSnapshotInstructions should be passed to
  *  Dart_Initialize. The kDartIsolateSnapshotData and
- *  kDartIsolateSnapshotInstructions should be passed to Dart_CreateIsolate.
+ *  kDartIsolateSnapshotInstructions should be passed to Dart_CreateIsolateGroup.
  *
  *  The callback will be invoked one or more times to provide the assembly code.
  *
@@ -3364,7 +3452,7 @@
  *  startup and quicker warmup in a subsequent process.
  *
  *  Outputs a snapshot in two pieces. The pieces should be passed to
- *  Dart_CreateIsolate in a VM using the same VM snapshot pieces used in the
+ *  Dart_CreateIsolateGroup in a VM using the same VM snapshot pieces used in the
  *  current VM. The instructions piece must be loaded with read and execute
  *  permissions; the data piece may be loaded as read-only.
  *
diff --git a/runtime/include/dart_embedder_api.h b/runtime/include/dart_embedder_api.h
index 9a91a83..61b54fd 100644
--- a/runtime/include/dart_embedder_api.h
+++ b/runtime/include/dart_embedder_api.h
@@ -5,8 +5,8 @@
 #ifndef RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
 #define RUNTIME_INCLUDE_DART_EMBEDDER_API_H_
 
-#include "dart_api.h"
-#include "dart_tools_api.h"
+#include "include/dart_api.h"
+#include "include/dart_tools_api.h"
 
 namespace dart {
 namespace embedder {
@@ -29,8 +29,11 @@
   // Isolate creation flags. Might be absent.
   Dart_IsolateFlags* flags;
 
+  // Isolate group callback data.
+  void* isolate_group_data;
+
   // Isolate callback data.
-  void* callback_data;
+  void* isolate_data;
 };
 
 // Create and initialize kernel-service isolate. This method should be used
diff --git a/runtime/include/dart_native_api.h b/runtime/include/dart_native_api.h
index e45c010..ae01fd7 100644
--- a/runtime/include/dart_native_api.h
+++ b/runtime/include/dart_native_api.h
@@ -179,6 +179,6 @@
  *
  *  It should not be used outside internal tests.
  */
-DART_EXPORT void Dart_ExecuteInternalCommand(const char* command);
+DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg);
 
 #endif /* INCLUDE_DART_NATIVE_API_H_ */ /* NOLINT */
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index 3797c4a..57e1624 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -7,6 +7,7 @@
 @pragma("vm:entry-point")
 class _List<E> extends FixedLengthListBase<E> {
   @pragma("vm:exact-result-type", _List)
+  @pragma("vm:prefer-inline")
   factory _List(length) native "List_allocate";
 
   E operator [](int index) native "List_getIndexed";
@@ -18,8 +19,10 @@
   void _setIndexed(int index, E value) native "List_setIndexed";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "List_getLength";
 
+  @pragma("vm:prefer-inline")
   List _slice(int start, int count, bool needsTypeArgument) {
     if (count <= 64) {
       final result = needsTypeArgument ? new _List<E>(count) : new _List(count);
@@ -93,13 +96,14 @@
     end = RangeError.checkValidRange(start, end, this.length);
     int length = end - start;
     if (length == 0) return <E>[];
-    var result = new _GrowableList<E>.withData(_slice(start, length, false));
+    var result = new _GrowableList<E>._withData(_slice(start, length, false));
     result._setLength(length);
     return result;
   }
 
   // Iterable interface.
 
+  @pragma("vm:prefer-inline")
   void forEach(f(E element)) {
     final length = this.length;
     for (int i = 0; i < length; i++) {
@@ -107,6 +111,7 @@
     }
   }
 
+  @pragma("vm:prefer-inline")
   Iterator<E> get iterator {
     return new _FixedSizeArrayIterator<E>(this);
   }
@@ -132,11 +137,11 @@
     if (length > 0) {
       var result = _slice(0, length, !growable);
       if (growable) {
-        result = new _GrowableList<E>.withData(result).._setLength(length);
+        result = new _GrowableList<E>._withData(result).._setLength(length);
       }
       return result;
     }
-    // _GrowableList.withData must not be called with empty list.
+    // _GrowableList._withData must not be called with empty list.
     return growable ? <E>[] : new List<E>(0);
   }
 }
@@ -161,6 +166,7 @@
   E operator [](int index) native "List_getIndexed";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "List_getLength";
 
   List<E> sublist(int start, [int end]) {
@@ -171,13 +177,14 @@
     for (int i = 0; i < length; i++) {
       list[i] = this[start + i];
     }
-    var result = new _GrowableList<E>.withData(list);
+    var result = new _GrowableList<E>._withData(list);
     result._setLength(length);
     return result;
   }
 
   // Collection interface.
 
+  @pragma("vm:prefer-inline")
   void forEach(f(E element)) {
     final length = this.length;
     for (int i = 0; i < length; i++) {
@@ -185,6 +192,7 @@
     }
   }
 
+  @pragma("vm:prefer-inline")
   Iterator<E> get iterator {
     return new _FixedSizeArrayIterator<E>(this);
   }
@@ -213,7 +221,7 @@
         list[i] = this[i];
       }
       if (!growable) return list;
-      var result = new _GrowableList<E>.withData(list);
+      var result = new _GrowableList<E>._withData(list);
       result._setLength(length);
       return result;
     }
@@ -237,6 +245,7 @@
 
   E get current => _current;
 
+  @pragma("vm:prefer-inline")
   bool moveNext() {
     if (_index >= _length) {
       _current = null;
diff --git a/runtime/lib/array_patch.dart b/runtime/lib/array_patch.dart
index 99daf3a..5c308a2 100644
--- a/runtime/lib/array_patch.dart
+++ b/runtime/lib/array_patch.dart
@@ -70,7 +70,7 @@
     if (elements.isEmpty) {
       return new _GrowableList<E>(0);
     }
-    var result = new _GrowableList<E>.withData(elements);
+    var result = new _GrowableList<E>._withData(elements);
     result._setLength(elements.length);
     return result;
   }
diff --git a/runtime/lib/async_patch.dart b/runtime/lib/async_patch.dart
index f0381ab..8ee544e 100644
--- a/runtime/lib/async_patch.dart
+++ b/runtime/lib/async_patch.dart
@@ -296,13 +296,19 @@
 
 /// Returns a [StackTrace] object containing the synchronous prefix for this
 /// asynchronous method.
+//
+// This method is recognized. It performs a runtime call if
+// FLAG_causal_async_stacks is enabled or returns `null` otherwise.
+@pragma("vm:prefer-inline")
 Object _asyncStackTraceHelper(Function async_op)
     native "StackTrace_asyncStackTraceHelper";
 
+// This method is asm intrinsified.
 @pragma("vm:entry-point", "call")
 void _clearAsyncThreadStackTrace()
     native "StackTrace_clearAsyncThreadStackTrace";
 
+// This method is asm intrinsified.
 @pragma("vm:entry-point", "call")
 void _setAsyncThreadStackTrace(StackTrace stackTrace)
     native "StackTrace_setAsyncThreadStackTrace";
diff --git a/runtime/lib/bigint_patch.dart b/runtime/lib/bigint_patch.dart
index 19c1919..5bfda0c 100644
--- a/runtime/lib/bigint_patch.dart
+++ b/runtime/lib/bigint_patch.dart
@@ -542,6 +542,7 @@
   /// Does *not* clear digits below ds.
   ///
   /// Note: This function may be intrinsified.
+  @pragma("vm:never-inline")
   static void _lsh(
       Uint32List xDigits, int xUsed, int n, Uint32List resultDigits) {
     assert(xUsed > 0);
@@ -617,6 +618,7 @@
   /// resultDigits[0..resultUsed-1] = xDigits[0..xUsed-1] >> n.
   ///
   /// Note: This function may be intrinsified.
+  @pragma("vm:never-inline")
   static void _rsh(
       Uint32List xDigits, int xUsed, int n, Uint32List resultDigits) {
     assert(xUsed > 0);
@@ -744,6 +746,7 @@
   /// used >= otherUsed > 0.
   ///
   /// Note: This function may be intrinsified.
+  @pragma("vm:never-inline")
   static void _absAdd(Uint32List digits, int used, Uint32List otherDigits,
       int otherUsed, Uint32List resultDigits) {
     assert(used >= otherUsed && otherUsed > 0);
@@ -765,6 +768,7 @@
   /// used >= otherUsed > 0.
   ///
   /// Note: This function may be intrinsified.
+  @pragma("vm:never-inline")
   static void _absSub(Uint32List digits, int used, Uint32List otherDigits,
       int otherUsed, Uint32List resultDigits) {
     assert(used >= otherUsed && otherUsed > 0);
@@ -1094,6 +1098,7 @@
   /// Note: This function may be intrinsified. Intrinsics on 64-bit platforms
   /// process digit pairs at even indices and returns 2.
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:never-inline")
   static int _mulAdd(
       Uint32List xDigits,
       int xIndex,
@@ -1145,6 +1150,7 @@
   /// Note: This function may be intrinsified. Intrinsics on 64-bit platforms
   /// process digit pairs at even indices and returns 2.
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:never-inline")
   static int _sqrAdd(
       Uint32List xDigits, int i, Uint32List acculumatorDigits, int used) {
     int x = xDigits[i];
@@ -1266,6 +1272,7 @@
   /// args[_divisorLowTopDigit.._divisorTopDigit]`.
   /// Returns 2.
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:never-inline")
   static int _estimateQuotientDigit(Uint32List args, Uint32List digits, int i) {
     // Verify that digit pairs are accessible for 64-bit processing.
     assert(digits.length >= 4);
@@ -2606,6 +2613,7 @@
   //     args[_rhoDigit.._rhoHighDigit] * digits[i..i+1] mod _digitBase^2.
   //   Returns 2.
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:never-inline")
   static int _mulMod(Uint32List args, Uint32List digits, int i) {
     var rhol = args[_rhoDigit] & _BigIntImpl._halfDigitMask;
     var rhoh = args[_rhoDigit] >> _BigIntImpl._halfDigitBits;
diff --git a/runtime/lib/compact_hash.dart b/runtime/lib/compact_hash.dart
index e73a551..f9ccfc0 100644
--- a/runtime/lib/compact_hash.dart
+++ b/runtime/lib/compact_hash.dart
@@ -47,23 +47,33 @@
 // Base class for VM-internal classes; keep in sync with _HashFieldBase.
 abstract class _HashVMBase {
   @pragma("vm:exact-result-type", "dart:typed_data#_Uint32List")
+  @pragma("vm:prefer-inline")
   Uint32List get _index native "LinkedHashMap_getIndex";
+  @pragma("vm:prefer-inline")
   void set _index(Uint32List value) native "LinkedHashMap_setIndex";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get _hashMask native "LinkedHashMap_getHashMask";
+  @pragma("vm:prefer-inline")
   void set _hashMask(int value) native "LinkedHashMap_setHashMask";
 
   @pragma("vm:exact-result-type", "dart:core#_List")
+  @pragma("vm:prefer-inline")
   List get _data native "LinkedHashMap_getData";
+  @pragma("vm:prefer-inline")
   void set _data(List value) native "LinkedHashMap_setData";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get _usedData native "LinkedHashMap_getUsedData";
+  @pragma("vm:prefer-inline")
   void set _usedData(int value) native "LinkedHashMap_setUsedData";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get _deletedKeys native "LinkedHashMap_getDeletedKeys";
+  @pragma("vm:prefer-inline")
   void set _deletedKeys(int value) native "LinkedHashMap_setDeletedKeys";
 }
 
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index 0705214..6370714 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -20,8 +20,7 @@
 DEFINE_NATIVE_ENTRY(Double_doubleFromInteger, 0, 2) {
   ASSERT(
       TypeArguments::CheckedHandle(zone, arguments->NativeArgAt(0)).IsNull());
-  const Integer& value =
-      Integer::CheckedHandle(zone, arguments->NativeArgAt(1));
+  GET_NON_NULL_NATIVE_ARGUMENT(Integer, value, arguments->NativeArgAt(1));
   if (FLAG_trace_intrinsified_natives) {
     OS::PrintErr("Double_doubleFromInteger %s\n", value.ToCString());
   }
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 266d433..71adedd 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -13,6 +13,7 @@
   int get _identityHashCode native "Double_hashCode";
 
   @pragma("vm:exact-result-type", _Double)
+  @pragma("vm:never-inline")
   double operator +(num other) {
     return _add(other.toDouble());
   }
@@ -21,6 +22,7 @@
   double _add(double other) native "Double_add";
 
   @pragma("vm:exact-result-type", _Double)
+  @pragma("vm:never-inline")
   double operator -(num other) {
     return _sub(other.toDouble());
   }
@@ -29,6 +31,7 @@
   double _sub(double other) native "Double_sub";
 
   @pragma("vm:exact-result-type", _Double)
+  @pragma("vm:never-inline")
   double operator *(num other) {
     return _mul(other.toDouble());
   }
@@ -44,6 +47,7 @@
   int _trunc_div(double other) native "Double_trunc_div";
 
   @pragma("vm:exact-result-type", _Double)
+  @pragma("vm:never-inline")
   double operator /(num other) {
     return _div(other.toDouble());
   }
@@ -68,6 +72,7 @@
   double operator -() native "Double_flipSignBit";
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator ==(Object other) {
     return (other is num) && _equal(other.toDouble());
   }
@@ -78,11 +83,13 @@
   bool _equalToInteger(int other) native "Double_equalToInteger";
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator <(num other) {
     return other > this;
   }
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator >(num other) {
     return _greaterThan(other.toDouble());
   }
@@ -91,11 +98,13 @@
   bool _greaterThan(double other) native "Double_greaterThan";
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator >=(num other) {
     return (this == other) || (this > other);
   }
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator <=(num other) {
     return (this == other) || (this < other);
   }
diff --git a/runtime/lib/ffi.cc b/runtime/lib/ffi.cc
index 9fc29cf..72d6c09 100644
--- a/runtime/lib/ffi.cc
+++ b/runtime/lib/ffi.cc
@@ -568,7 +568,11 @@
 
   Class& native_function_class =
       Class::Handle(isolate->class_table()->At(kFfiNativeFunctionCid));
-  native_function_class.EnsureIsFinalized(Thread::Current());
+  const auto& error =
+      Error::Handle(native_function_class.EnsureIsFinalized(Thread::Current()));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+  }
 
   Type& native_function_type = Type::Handle(
       Type::New(native_function_class, type_args, TokenPosition::kNoSource));
@@ -608,6 +612,90 @@
 #endif
 }
 
+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->class_table()->At(cid));
+  const auto& error = Error::Handle(
+      zone, typed_data_class.EnsureIsFinalized(Thread::Current()));
+  if (!error.IsNull()) {
+    Exceptions::PropagateError(error);
+  }
+
+  return ExternalTypedData::New(
+      cid, reinterpret_cast<uint8_t*>(pointer.NativeAddress()), element_count,
+      Heap::kNew);
+}
+
 #if defined(TARGET_ARCH_DBC)
 
 void FfiMarshalledArguments::SetFunctionAddress(uint64_t value) const {
diff --git a/runtime/lib/ffi_dynamic_library_patch.dart b/runtime/lib/ffi_dynamic_library_patch.dart
index 92bffec..16c1f78 100644
--- a/runtime/lib/ffi_dynamic_library_patch.dart
+++ b/runtime/lib/ffi_dynamic_library_patch.dart
@@ -2,7 +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.
 
+// 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:typed_data' show TypedData;
 
 DynamicLibrary _open(String name) native "Ffi_dl_open";
 
diff --git a/runtime/lib/ffi_native_type_patch.dart b/runtime/lib/ffi_native_type_patch.dart
index b12f0b8..8378e07 100644
--- a/runtime/lib/ffi_native_type_patch.dart
+++ b/runtime/lib/ffi_native_type_patch.dart
@@ -2,7 +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.
 
+// 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:typed_data' show TypedData;
 
 @patch
 @pragma("vm:entry-point")
diff --git a/runtime/lib/ffi_patch.dart b/runtime/lib/ffi_patch.dart
index 4f586cd..c16cd72 100644
--- a/runtime/lib/ffi_patch.dart
+++ b/runtime/lib/ffi_patch.dart
@@ -2,7 +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.
 
+// 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:typed_data' show TypedData;
 
 @patch
 int sizeOf<T extends NativeType>() native "Ffi_sizeOf";
@@ -17,6 +20,9 @@
 DS _asFunctionInternal<DS extends Function, NS extends Function>(
     Pointer<NativeFunction<NS>> ptr) native "Ffi_asFunctionInternal";
 
+dynamic _asExternalTypedData(Pointer ptr, int count)
+    native "Ffi_asExternalTypedData";
+
 @patch
 @pragma("vm:entry-point")
 class Pointer<T extends NativeType> {
@@ -67,4 +73,14 @@
 
   @patch
   void free() native "Ffi_free";
+
+  @patch
+  TypedData asExternalTypedData({int count: 1}) =>
+      _asExternalTypedData(this, count);
 }
+
+// Returns the ABI used for size and alignment calculations.
+// See pkg/vm/lib/transformations/ffi.dart.
+@pragma('vm:prefer-inline')
+int _abi()
+    native "Recognized method: method is directly interpreted by the bytecode interpreter or IR graph is built in the flow graph builder.";
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 876e6df..f69ed92 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -85,14 +85,14 @@
     for (int i = 0; i < length; i++) {
       list[i] = this[start + i];
     }
-    var result = new _GrowableList<T>.withData(list);
+    var result = new _GrowableList<T>._withData(list);
     result._setLength(length);
     return result;
   }
 
   factory _GrowableList(int length) {
     var data = _allocateData(length);
-    var result = new _GrowableList<T>.withData(data);
+    var result = new _GrowableList<T>._withData(data);
     if (length > 0) {
       result._setLength(length);
     }
@@ -101,16 +101,18 @@
 
   factory _GrowableList.withCapacity(int capacity) {
     var data = _allocateData(capacity);
-    return new _GrowableList<T>.withData(data);
+    return new _GrowableList<T>._withData(data);
   }
 
   @pragma("vm:exact-result-type", _GrowableList)
-  factory _GrowableList.withData(_List data) native "GrowableList_allocate";
+  factory _GrowableList._withData(_List data) native "GrowableList_allocate";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get _capacity native "GrowableList_getCapacity";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "GrowableList_getLength";
 
   void set length(int new_length) {
@@ -151,6 +153,7 @@
   void _setIndexed(int index, T value) native "GrowableList_setIndexed";
 
   @pragma("vm:entry-point", "call")
+  @pragma("vm:prefer-inline")
   void add(T value) {
     var len = length;
     if (len == _capacity) {
@@ -204,6 +207,7 @@
     } while (true);
   }
 
+  @pragma("vm:prefer-inline")
   T removeLast() {
     var len = length - 1;
     var elem = this[len];
@@ -272,6 +276,7 @@
 
   // Iterable interface.
 
+  @pragma("vm:prefer-inline")
   void forEach(f(T element)) {
     int initialLength = length;
     for (int i = 0; i < length; i++) {
@@ -363,6 +368,7 @@
 
   String toString() => ListBase.listToString(this);
 
+  @pragma("vm:prefer-inline")
   Iterator<T> get iterator {
     return new ListIterator<T>(this);
   }
@@ -375,7 +381,7 @@
         list[i] = this[i];
       }
       if (!growable) return list;
-      var result = new _GrowableList<T>.withData(list);
+      var result = new _GrowableList<T>._withData(list);
       result._setLength(length);
       return result;
     }
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 3a01913..9b3bd8e 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -6,13 +6,17 @@
 
 abstract class _IntegerImplementation implements int {
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   num operator +(num other) => other._addFromInteger(this);
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   num operator -(num other) => other._subFromInteger(this);
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   num operator *(num other) => other._mulFromInteger(this);
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator ~/(num other) {
     if ((other is int) && (other == 0)) {
       throw const IntegerDivisionByZeroException();
@@ -33,15 +37,19 @@
   }
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator -() {
     return 0 - this;
   }
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator &(int other) => other._bitAndFromInteger(this);
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator |(int other) => other._bitOrFromInteger(this);
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator ^(int other) => other._bitXorFromInteger(this);
 
   num remainder(num other) {
@@ -75,26 +83,32 @@
   }
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator >>(int other) => other._shrFromInteger(this);
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:never-inline")
   int operator <<(int other) => other._shlFromInteger(this);
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator <(num other) {
     return other > this;
   }
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator >(num other) {
     return other._greaterThanFromInteger(this);
   }
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator >=(num other) {
     return (this == other) || (this > other);
   }
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator <=(num other) {
     return (this == other) || (this < other);
   }
@@ -104,6 +118,7 @@
       native "Integer_greaterThanFromInteger";
 
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:never-inline")
   bool operator ==(Object other) {
     if (other is num) {
       return other._equalToInteger(this);
@@ -360,6 +375,14 @@
     if (e < 0) throw new RangeError.range(e, 0, null, "exponent");
     if (m <= 0) throw new RangeError.range(m, 1, null, "modulus");
     if (e == 0) return 1;
+
+    // This is floor(sqrt(2^63)).
+    const int maxValueThatCanBeSquaredWithoutTruncation = 3037000499;
+    if (m > maxValueThatCanBeSquaredWithoutTruncation) {
+      // Use BigInt version to avoid truncation in multiplications below.
+      return BigInt.from(this).modPow(BigInt.from(e), BigInt.from(m)).toInt();
+    }
+
     int b = this;
     if (b < 0 || b > m) {
       b %= m;
diff --git a/runtime/lib/internal_patch.dart b/runtime/lib/internal_patch.dart
index 1b2bfe6..fe05552 100644
--- a/runtime/lib/internal_patch.dart
+++ b/runtime/lib/internal_patch.dart
@@ -70,16 +70,14 @@
 
 @pragma("vm:entry-point", "call")
 @pragma("vm:exact-result-type", bool)
+@pragma("vm:prefer-inline")
 bool _classRangeCheck(int cid, int lowerLimit, int upperLimit) {
   return cid >= lowerLimit && cid <= upperLimit;
 }
 
-bool _classRangeCheckNegative(int cid, int lowerLimit, int upperLimit) {
-  return cid < lowerLimit || cid > upperLimit;
-}
-
 // Utility class now only used by the VM.
 class Lists {
+  @pragma("vm:prefer-inline")
   static void copy(List src, int srcStart, List dst, int dstStart, int count) {
     if (srcStart < dstStart) {
       for (int i = srcStart + count - 1, j = dstStart + count - 1;
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index 436e895..f3ae89c 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -129,28 +129,66 @@
   }
 
   void Run() override {
-    // Create a new isolate.
-    char* error = NULL;
-    Dart_IsolateCreateCallback callback = Isolate::CreateCallback();
-    if (callback == NULL) {
-      ReportError(
-          "Isolate spawn is not supported by this Dart implementation\n");
+    auto group = state_->isolate_group();
+
+    // The create isolate group call back is mandatory.  If not provided we
+    // cannot spawn isolates.
+    Dart_IsolateGroupCreateCallback create_group_callback =
+        Isolate::CreateGroupCallback();
+    if (create_group_callback == nullptr) {
+      FailedSpawn("Isolate spawn is not supported by this Dart embedder\n");
       return;
     }
 
-    // Make a copy of the state's isolate flags and hand it to the callback.
-    Dart_IsolateFlags api_flags = *(state_->isolate_flags());
+    // The initialize callback is optional atm, we fall back to creating isolate
+    // groups if it was not provided.
+    Dart_InitializeIsolateCallback initialize_callback =
+        Isolate::InitializeCallback();
+
     const char* name = (state_->debug_name() == NULL) ? state_->function_name()
                                                       : state_->debug_name();
     ASSERT(name != NULL);
 
-    Isolate* isolate = reinterpret_cast<Isolate*>((callback)(
-        state_->script_url(), name, nullptr, state_->package_config(),
-        &api_flags, parent_isolate_->init_callback_data(), &error));
-    parent_isolate_->DecrementSpawnCount();
-    parent_isolate_ = nullptr;
-    if (isolate == NULL) {
-      ReportError(error);
+    // Create a new isolate.
+    char* error = nullptr;
+    Isolate* isolate = nullptr;
+    if (group == nullptr || initialize_callback == nullptr) {
+      // Make a copy of the state's isolate flags and hand it to the callback.
+      Dart_IsolateFlags api_flags = *(state_->isolate_flags());
+      isolate = reinterpret_cast<Isolate*>((create_group_callback)(
+          state_->script_url(), name, nullptr, state_->package_config(),
+          &api_flags, parent_isolate_->init_callback_data(), &error));
+      parent_isolate_->DecrementSpawnCount();
+      parent_isolate_ = nullptr;
+    } else {
+      if (initialize_callback == nullptr) {
+        FailedSpawn("Isolate spawn is not supported by this embedder.");
+        return;
+      }
+
+      isolate = CreateWithinExistingIsolateGroup(group, name, &error);
+      parent_isolate_->DecrementSpawnCount();
+      parent_isolate_ = nullptr;
+      if (isolate == nullptr) {
+        FailedSpawn(error);
+        free(error);
+        return;
+      }
+
+      void* child_isolate_data = nullptr;
+      bool success = initialize_callback(&child_isolate_data, &error);
+      isolate->set_init_callback_data(child_isolate_data);
+      if (!success) {
+        Dart_ShutdownIsolate();
+        FailedSpawn(error);
+        free(error);
+        return;
+      }
+      Dart_ExitIsolate();
+    }
+
+    if (isolate == nullptr) {
+      FailedSpawn(error);
       free(error);
       return;
     }
@@ -169,6 +207,13 @@
   }
 
  private:
+  void FailedSpawn(const char* error) {
+    ReportError(error != nullptr
+                    ? error
+                    : "Unknown error occured during Isolate spawning.");
+    state_ = nullptr;
+  }
+
   void ReportError(const char* error) {
     Dart_CObject error_cobj;
     error_cobj.type = Dart_CObject_kString;
@@ -240,7 +285,7 @@
       std::unique_ptr<IsolateSpawnState> state(new IsolateSpawnState(
           port.Id(), isolate->origin_id(), String2UTF8(script_uri), func,
           &message_buffer, utf8_package_config, paused.value(), fatal_errors,
-          on_exit_port, on_error_port, utf8_debug_name));
+          on_exit_port, on_error_port, utf8_debug_name, isolate->group()));
 
       // Since this is a call to Isolate.spawn, copy the parent isolate's code.
       state->isolate_flags()->copy_parent_code = true;
@@ -354,7 +399,7 @@
   std::unique_ptr<IsolateSpawnState> state(new IsolateSpawnState(
       port.Id(), canonical_uri, utf8_package_config, &arguments_buffer,
       &message_buffer, paused.value(), fatal_errors, on_exit_port,
-      on_error_port, utf8_debug_name));
+      on_error_port, utf8_debug_name, /*group=*/nullptr));
 
   // If we were passed a value then override the default flags state for
   // checked mode.
@@ -372,11 +417,11 @@
 
 DEFINE_NATIVE_ENTRY(Isolate_getDebugName, 0, 1) {
   GET_NON_NULL_NATIVE_ARGUMENT(SendPort, port, arguments->NativeArgAt(0));
-  Isolate* isolate_lookup = Isolate::LookupIsolateByPort(port.Id());
-  if (isolate_lookup == NULL) {
+  auto name = Isolate::LookupIsolateNameByPort(port.Id());
+  if (name == nullptr) {
     return String::null();
   }
-  return String::New(isolate_lookup->name());
+  return String::New(name.get());
 }
 
 DEFINE_NATIVE_ENTRY(Isolate_getPortAndCapabilitiesOfCurrentIsolate, 0, 0) {
@@ -423,7 +468,7 @@
   free(peer);
 }
 
-static intptr_t GetUint8SizeOrThrow(const Instance& instance) {
+static intptr_t GetTypedDataSizeOrThrow(const Instance& instance) {
   // From the Dart side we are guaranteed that the type of [instance] is a
   // subtype of TypedData.
   if (instance.IsTypedDataBase()) {
@@ -456,19 +501,18 @@
     UNREACHABLE();
   }
   Instance& instance = Instance::Handle();
-  unsigned long long total_bytes = 0;
-  const unsigned long kMaxBytes =
-      TypedData::MaxElements(kTypedDataUint8ArrayCid);
+  uint64_t total_bytes = 0;
+  const uint64_t kMaxBytes = TypedData::MaxElements(kTypedDataUint8ArrayCid);
   for (intptr_t i = 0; i < array_length; i++) {
     instance ^= array.At(i);
-    total_bytes += GetUint8SizeOrThrow(instance);
+    total_bytes += static_cast<uintptr_t>(GetTypedDataSizeOrThrow(instance));
     if (total_bytes > kMaxBytes) {
       const Array& error_args = Array::Handle(Array::New(3));
       error_args.SetAt(0, array);
       error_args.SetAt(1, String::Handle(String::New("data")));
-      error_args.SetAt(2,
-                       String::Handle(String::NewFormatted(
-                           "Aggregated list exceeds max size %ld", kMaxBytes)));
+      error_args.SetAt(
+          2, String::Handle(String::NewFormatted(
+                 "Aggregated list exceeds max size %" Pu64 "", kMaxBytes)));
       Exceptions::ThrowByType(Exceptions::kArgumentValue, error_args);
       UNREACHABLE();
     }
@@ -492,11 +536,11 @@
 
       void* source = typed_data.DataAddr(0);
       // The memory does not overlap.
-      memcpy(data + offset, source, length_in_bytes);
+      memcpy(data + offset, source, length_in_bytes);  // NOLINT
       offset += length_in_bytes;
     }
   }
-  ASSERT(static_cast<unsigned long>(offset) == total_bytes);
+  ASSERT(static_cast<uintptr_t>(offset) == total_bytes);
   return TransferableTypedData::New(data, total_bytes);
 }
 
diff --git a/runtime/lib/math_patch.dart b/runtime/lib/math_patch.dart
index fb68674..99c166e 100644
--- a/runtime/lib/math_patch.dart
+++ b/runtime/lib/math_patch.dart
@@ -14,6 +14,7 @@
 /// There are no parts of this patch library.
 
 @patch
+@pragma("vm:prefer-inline")
 T min<T extends num>(T a, T b) {
   // These partially redundant type checks improve code quality for dart2js.
   // Most of the improvement is at call sites from the inferred non-null num
@@ -43,6 +44,7 @@
 }
 
 @patch
+@pragma("vm:prefer-inline")
 T max<T extends num>(T a, T b) {
   // These partially redundant type checks improve code quality for dart2js.
   // Most of the improvement is at call sites from the inferred non-null num
@@ -76,6 +78,7 @@
 // If [x] is an [int] and [exponent] is a non-negative [int], the result is
 // an [int], otherwise the result is a [double].
 @patch
+@pragma("vm:prefer-inline")
 num pow(num x, num exponent) {
   if ((x is int) && (exponent is int) && (exponent >= 0)) {
     return _intPow(x, exponent);
@@ -127,31 +130,41 @@
 
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double atan2(num a, num b) => _atan2(a.toDouble(), b.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double sin(num radians) => _sin(radians.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double cos(num radians) => _cos(radians.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double tan(num radians) => _tan(radians.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double acos(num x) => _acos(x.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double asin(num x) => _asin(x.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double atan(num x) => _atan(x.toDouble());
 @patch
 @pragma("vm:exact-result-type", "dart:core#_Double")
+@pragma("vm:never-inline")
 double sqrt(num x) => _sqrt(x.toDouble());
 @patch
+@pragma("vm:prefer-inline")
 double exp(num x) => _exp(x.toDouble());
 @patch
+@pragma("vm:prefer-inline")
 double log(num x) => _log(x.toDouble());
 
 double _atan2(double a, double b) native "Math_atan2";
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 82bd670..ba70af6 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -7,16 +7,13 @@
 #include "lib/invocation_mirror.h"
 #include "vm/bootstrap_natives.h"
 #include "vm/class_finalizer.h"
-#include "vm/compiler/frontend/kernel_to_il.h"
-#include "vm/compiler/jit/compiler.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
 #include "vm/exceptions.h"
-#include "vm/flags.h"
+#include "vm/kernel.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
 #include "vm/port.h"
-#include "vm/resolver.h"
 #include "vm/symbols.h"
 
 namespace dart {
@@ -33,7 +30,7 @@
 static RawInstance* CreateMirror(const String& mirror_class_name,
                                  const Array& constructor_arguments) {
   const Library& mirrors_lib = Library::Handle(Library::MirrorsLibrary());
-  const String& constructor_name = Symbols::Dot();
+  const String& constructor_name = Symbols::DotUnder();
 
   const Object& result = Object::Handle(DartLibraryCalls::InstanceCreate(
       mirrors_lib, mirror_class_name, constructor_name, constructor_arguments));
@@ -132,10 +129,6 @@
     // hence do not have a token position, and therefore cannot be reparsed.
     has_extra_parameter_info = false;
   }
-  if (func.is_declared_in_bytecode()) {
-    // Anonymous closures in bytecode cannot be reparsed.
-    has_extra_parameter_info = false;
-  }
 
   Array& param_descriptor = Array::Handle();
   if (has_extra_parameter_info) {
@@ -143,9 +136,7 @@
     // * The default value of a parameter.
     // * Whether a parameters has been declared as final.
     // * Any metadata associated with the parameter.
-    Object& result = Object::Handle();
-    ASSERT(func.kernel_offset() > 0);
-    result = kernel::BuildParameterDescriptor(func);
+    Object& result = Object::Handle(kernel::BuildParameterDescriptor(func));
     if (result.IsError()) {
       Exceptions::PropagateError(Error::Cast(result));
       UNREACHABLE();
@@ -603,6 +594,10 @@
   AbstractType& result = AbstractType::Handle(type.InstantiateFrom(
       instantiator_type_args, Object::null_type_arguments(), kAllFree, NULL,
       Heap::kOld));
+  if (result.IsNull()) {
+    // TODO(https://github.com/dart-lang/sdk/issues/37360): Remove this.
+    return type.raw();
+  }
   ASSERT(result.IsFinalized());
   return result.Canonicalize();
 }
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index 0047640..0b99d44 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -68,8 +68,8 @@
 bool _subtypeTest(Type a, Type b) native 'TypeMirror_subtypeTest';
 
 class _LocalMirrorSystem extends MirrorSystem {
-  final TypeMirror dynamicType = new _SpecialTypeMirror('dynamic');
-  final TypeMirror voidType = new _SpecialTypeMirror('void');
+  final TypeMirror dynamicType = new _SpecialTypeMirror._('dynamic');
+  final TypeMirror voidType = new _SpecialTypeMirror._('void');
 
   var _libraries;
   Map<Uri, LibraryMirror> get libraries {
@@ -100,7 +100,7 @@
 }
 
 class _SourceLocation implements SourceLocation {
-  _SourceLocation(uriString, this.line, this.column)
+  _SourceLocation._(uriString, this.line, this.column)
       : this.sourceUri = Uri.parse(uriString);
 
   // Line and column positions are 1-origin, or 0 if unknown.
@@ -120,7 +120,7 @@
   final String debugName;
   final LibraryMirror rootLibrary;
 
-  _LocalIsolateMirror(this.debugName, this.rootLibrary);
+  _LocalIsolateMirror._(this.debugName, this.rootLibrary);
 
   bool get isCurrent => true;
 
@@ -208,7 +208,7 @@
 
   final _reflectee; // May be a MirrorReference or an ordinary object.
 
-  _LocalObjectMirror(this._reflectee);
+  _LocalObjectMirror._(this._reflectee);
 
   InstanceMirror invoke(Symbol memberName, List positionalArguments,
       [Map<Symbol, dynamic> namedArguments]) {
@@ -262,7 +262,7 @@
 
 class _LocalInstanceMirror extends _LocalObjectMirror
     implements InstanceMirror {
-  _LocalInstanceMirror(reflectee) : super(reflectee);
+  _LocalInstanceMirror._(reflectee) : super._(reflectee);
 
   ClassMirror _type;
   ClassMirror get type {
@@ -336,7 +336,7 @@
 
 class _LocalClosureMirror extends _LocalInstanceMirror
     implements ClosureMirror {
-  _LocalClosureMirror(reflectee) : super(reflectee);
+  _LocalClosureMirror._(reflectee) : super._(reflectee);
 
   MethodMirror _function;
   MethodMirror get function {
@@ -377,7 +377,7 @@
   final bool isEnum;
   Type _instantiator;
 
-  _LocalClassMirror(
+  _LocalClassMirror._(
       reflectee,
       reflectedType,
       String simpleName,
@@ -390,7 +390,7 @@
       : this._simpleName = _s(simpleName),
         this._reflectedType = reflectedType,
         this._instantiator = reflectedType,
-        super(reflectee);
+        super._(reflectee);
 
   bool get hasReflectedType => !_isGenericDeclaration;
   Type get reflectedType {
@@ -600,7 +600,7 @@
       ClassMirror owner = originalDeclaration;
       var mirror;
       for (var i = 0; i < params.length; i += 2) {
-        mirror = new _LocalTypeVariableMirror(params[i + 1], params[i], owner);
+        mirror = new _LocalTypeVariableMirror._(params[i + 1], params[i], owner);
         _typeVariables.add(mirror);
       }
       _typeVariables =
@@ -745,8 +745,8 @@
 class _LocalFunctionTypeMirror extends _LocalClassMirror
     implements FunctionTypeMirror {
   final _functionReflectee;
-  _LocalFunctionTypeMirror(reflectee, this._functionReflectee, reflectedType)
-      : super(reflectee, reflectedType, null, null, false, false, false, false,
+  _LocalFunctionTypeMirror._(reflectee, this._functionReflectee, reflectedType)
+      : super._(reflectee, reflectedType, null, null, false, false, false, false,
             false);
 
   bool get _isAnonymousMixinApplication => false;
@@ -811,7 +811,7 @@
   final _reflectee;
   Symbol _simpleName;
 
-  _LocalDeclarationMirror(this._reflectee, this._simpleName);
+  _LocalDeclarationMirror._(this._reflectee, this._simpleName);
 
   Symbol get simpleName => _simpleName;
 
@@ -846,8 +846,8 @@
 
 class _LocalTypeVariableMirror extends _LocalDeclarationMirror
     implements TypeVariableMirror, _LocalTypeMirror {
-  _LocalTypeVariableMirror(reflectee, String simpleName, this._owner)
-      : super(reflectee, _s(simpleName));
+  _LocalTypeVariableMirror._(reflectee, String simpleName, this._owner)
+      : super._(reflectee, _s(simpleName));
 
   DeclarationMirror _owner;
   DeclarationMirror get owner {
@@ -922,7 +922,7 @@
 
   _LocalTypedefMirror(reflectee, this._reflectedType, String simpleName,
       this._isGeneric, this._isGenericDeclaration, this._owner)
-      : super(reflectee, _s(simpleName));
+      : super._(reflectee, _s(simpleName));
 
   bool get isTopLevel => true;
 
@@ -971,7 +971,7 @@
       TypedefMirror owner = originalDeclaration;
       var mirror;
       for (var i = 0; i < params.length; i += 2) {
-        mirror = new _LocalTypeVariableMirror(params[i + 1], params[i], owner);
+        mirror = new _LocalTypeVariableMirror._(params[i + 1], params[i], owner);
         _typeVariables.add(mirror);
       }
     }
@@ -1025,10 +1025,10 @@
   final Symbol simpleName;
   final Uri uri;
 
-  _LocalLibraryMirror(reflectee, String simpleName, String url)
+  _LocalLibraryMirror._(reflectee, String simpleName, String url)
       : this.simpleName = _s(simpleName),
         this.uri = Uri.parse(url),
-        super(reflectee);
+        super._(reflectee);
 
   // The simple name and the qualified name are the same for a library.
   Symbol get qualifiedName => simpleName;
@@ -1108,7 +1108,7 @@
   final bool isDeferred;
   final List<InstanceMirror> metadata;
 
-  _LocalLibraryDependencyMirror(
+  _LocalLibraryDependencyMirror._(
       this.sourceLibrary,
       this._targetMirrorOrPrefix,
       List<dynamic> mutableCombinators,
@@ -1155,7 +1155,7 @@
   final List<Symbol> identifiers;
   final bool isShow;
 
-  _LocalCombinatorMirror(identifierString, this.isShow)
+  _LocalCombinatorMirror._(identifierString, this.isShow)
       : this.identifiers =
             new UnmodifiableListView<Symbol>(<Symbol>[_s(identifierString)]);
 
@@ -1168,9 +1168,9 @@
   final bool isStatic;
   final int _kindFlags;
 
-  _LocalMethodMirror(reflectee, String simpleName, this._owner,
+  _LocalMethodMirror._(reflectee, String simpleName, this._owner,
       this._instantiator, this.isStatic, this._kindFlags)
-      : super(reflectee, _s(simpleName));
+      : super._(reflectee, _s(simpleName));
 
   static const kAbstract = 0;
   static const kGetter = 1;
@@ -1297,9 +1297,9 @@
   final bool isFinal;
   final bool isConst;
 
-  _LocalVariableMirror(reflectee, String simpleName, this.owner, this._type,
+  _LocalVariableMirror._(reflectee, String simpleName, this.owner, this._type,
       this.isStatic, this.isFinal, this.isConst)
-      : super(reflectee, _s(simpleName));
+      : super._(reflectee, _s(simpleName));
 
   bool get isTopLevel => owner is LibraryMirror;
 
@@ -1338,7 +1338,7 @@
   final bool isNamed;
   final List _unmirroredMetadata;
 
-  _LocalParameterMirror(
+  _LocalParameterMirror._(
       reflectee,
       String simpleName,
       DeclarationMirror owner,
@@ -1348,7 +1348,7 @@
       bool isFinal,
       this._defaultValueReflectee,
       this._unmirroredMetadata)
-      : super(
+      : super._(
             reflectee,
             simpleName,
             owner,
@@ -1401,7 +1401,7 @@
     implements TypeMirror, DeclarationMirror {
   final Symbol simpleName;
 
-  _SpecialTypeMirror(String name) : simpleName = _s(name);
+  _SpecialTypeMirror._(String name) : simpleName = _s(name);
 
   bool get isPrivate => false;
   bool get isTopLevel => true;
@@ -1454,15 +1454,15 @@
   // Creates a new local mirror for some Object.
   static InstanceMirror reflect(Object reflectee) {
     return reflectee is Function
-        ? new _LocalClosureMirror(reflectee)
-        : new _LocalInstanceMirror(reflectee);
+        ? new _LocalClosureMirror._(reflectee)
+        : new _LocalInstanceMirror._(reflectee);
   }
 
-  static ClassMirror makeLocalClassMirror(Type key)
+  static ClassMirror _makeLocalClassMirror(Type key)
       native "Mirrors_makeLocalClassMirror";
-  static TypeMirror makeLocalTypeMirror(Type key)
+  static TypeMirror _makeLocalTypeMirror(Type key)
       native "Mirrors_makeLocalTypeMirror";
-  static Type instantiateGenericType(Type key, typeArguments)
+  static Type _instantiateGenericType(Type key, typeArguments)
       native "Mirrors_instantiateGenericType";
 
   static Expando<_LocalClassMirror> _declarationCache =
@@ -1472,7 +1472,7 @@
   static ClassMirror reflectClass(Type key) {
     var classMirror = _declarationCache[key];
     if (classMirror == null) {
-      classMirror = makeLocalClassMirror(key);
+      classMirror = _makeLocalClassMirror(key);
       _declarationCache[key] = classMirror;
       if (!classMirror._isGeneric) {
         _instantiationCache[key] = classMirror;
@@ -1487,7 +1487,7 @@
     }
     var typeMirror = _instantiationCache[key];
     if (typeMirror == null) {
-      typeMirror = makeLocalTypeMirror(key);
+      typeMirror = _makeLocalTypeMirror(key);
       _instantiationCache[key] = typeMirror;
       if (typeMirror is _LocalClassMirror && !typeMirror._isGeneric) {
         _declarationCache[key] = typeMirror;
@@ -1501,6 +1501,6 @@
       throw new ArgumentError.value(typeArguments, 'typeArguments',
           'Type arguments list cannot be empty.');
     }
-    return instantiateGenericType(key, typeArguments.toList(growable: false));
+    return _instantiateGenericType(key, typeArguments.toList(growable: false));
   }
 }
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index c6dbf5b..7168118 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -14,6 +14,7 @@
   // The VM has its own implementation of equals.
   @patch
   @pragma("vm:exact-result-type", bool)
+  @pragma("vm:prefer-inline")
   bool operator ==(other) native "Object_equals";
 
   // Helpers used to implement hashCode. If a hashCode is used, we remember it
diff --git a/runtime/lib/stacktrace.cc b/runtime/lib/stacktrace.cc
index b32490e..1b9600a 100644
--- a/runtime/lib/stacktrace.cc
+++ b/runtime/lib/stacktrace.cc
@@ -108,7 +108,10 @@
 
 DEFINE_NATIVE_ENTRY(StackTrace_asyncStackTraceHelper, 0, 1) {
   if (!FLAG_causal_async_stacks) {
-    return Object::null();
+    // If causal async stacks are not enabled we should recognize this method
+    // and never call to the NOP runtime.
+    // See kernel_to_il.cc/bytecode_reader.cc/interpreter.cc.
+    UNREACHABLE();
   }
 #if !defined(PRODUCT)
   GET_NATIVE_ARGUMENT(Closure, async_op, arguments->NativeArgAt(0));
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index 52d27db..6bf950f 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -248,6 +248,7 @@
   int codeUnitAt(int index); // Implemented in the subclasses.
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "String_getLength";
 
   @pragma("vm:exact-result-type", bool)
diff --git a/runtime/lib/typed_data_patch.dart b/runtime/lib/typed_data_patch.dart
index 7649a04..ed8658d44 100644
--- a/runtime/lib/typed_data_patch.dart
+++ b/runtime/lib/typed_data_patch.dart
@@ -2056,6 +2056,7 @@
   // Methods implementing the collection interface.
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "TypedData_length";
 
   // Internal utility methods.
@@ -3709,12 +3710,15 @@
   }
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:prefer-inline")
   _TypedList get _typedData native "TypedDataView_typedData";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get offsetInBytes native "TypedDataView_offsetInBytes";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "TypedDataView_length";
 }
 
@@ -3728,6 +3732,7 @@
       native "TypedDataView_Int8ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3736,6 +3741,7 @@
         ._getInt8(offsetInBytes + (index * Int8List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3765,6 +3771,7 @@
       native "TypedDataView_Uint8ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3773,6 +3780,7 @@
         ._getUint8(offsetInBytes + (index * Uint8List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3802,6 +3810,7 @@
       int length) native "TypedDataView_Uint8ClampedArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3810,6 +3819,7 @@
         ._getUint8(offsetInBytes + (index * Uint8List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3839,6 +3849,7 @@
       native "TypedDataView_Int16ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3847,6 +3858,7 @@
         ._getInt16(offsetInBytes + (index * Int16List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3888,6 +3900,7 @@
       native "TypedDataView_Uint16ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3896,6 +3909,7 @@
         ._getUint16(offsetInBytes + (index * Uint16List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3938,6 +3952,7 @@
       native "TypedDataView_Int32ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3946,6 +3961,7 @@
         ._getInt32(offsetInBytes + (index * Int32List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3975,6 +3991,7 @@
       native "TypedDataView_Uint32ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -3983,6 +4000,7 @@
         ._getUint32(offsetInBytes + (index * Uint32List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4012,6 +4030,7 @@
       native "TypedDataView_Int64ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4020,6 +4039,7 @@
         ._getInt64(offsetInBytes + (index * Int64List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4049,6 +4069,7 @@
       native "TypedDataView_Uint64ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   int operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4057,6 +4078,7 @@
         ._getUint64(offsetInBytes + (index * Uint64List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, int value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4086,6 +4108,7 @@
       native "TypedDataView_Float32ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   double operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4094,6 +4117,7 @@
         ._getFloat32(offsetInBytes + (index * Float32List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, double value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4123,6 +4147,7 @@
       native "TypedDataView_Float64ArrayView_new";
 
   // Method(s) implementing List interface.
+  @pragma("vm:prefer-inline")
   double operator [](int index) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4131,6 +4156,7 @@
         ._getFloat64(offsetInBytes + (index * Float64List.bytesPerElement));
   }
 
+  @pragma("vm:prefer-inline")
   void operator []=(int index, double value) {
     if (index < 0 || index >= length) {
       throw new RangeError.index(index, this, "index");
@@ -4282,6 +4308,7 @@
 
   // Method(s) implementing ByteData interface.
 
+  @pragma("vm:prefer-inline")
   int getInt8(int byteOffset) {
     if (byteOffset < 0 || byteOffset >= length) {
       throw new RangeError.index(byteOffset, this, "byteOffset");
@@ -4289,6 +4316,7 @@
     return _typedData._getInt8(offsetInBytes + byteOffset);
   }
 
+  @pragma("vm:prefer-inline")
   void setInt8(int byteOffset, int value) {
     if (byteOffset < 0 || byteOffset >= length) {
       throw new RangeError.index(byteOffset, this, "byteOffset");
@@ -4296,6 +4324,7 @@
     _typedData._setInt8(offsetInBytes + byteOffset, value);
   }
 
+  @pragma("vm:prefer-inline")
   int getUint8(int byteOffset) {
     if (byteOffset < 0 || byteOffset >= length) {
       throw new RangeError.index(byteOffset, this, "byteOffset");
@@ -4303,6 +4332,7 @@
     return _typedData._getUint8(offsetInBytes + byteOffset);
   }
 
+  @pragma("vm:prefer-inline")
   void setUint8(int byteOffset, int value) {
     if (byteOffset < 0 || byteOffset >= length) {
       throw new RangeError.index(byteOffset, this, "byteOffset");
@@ -4310,6 +4340,7 @@
     _typedData._setUint8(offsetInBytes + byteOffset, value);
   }
 
+  @pragma("vm:prefer-inline")
   int getInt16(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
@@ -4321,6 +4352,7 @@
     return _byteSwap16(result).toSigned(16);
   }
 
+  @pragma("vm:prefer-inline")
   void setInt16(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
@@ -4329,6 +4361,7 @@
         identical(endian, Endian.host) ? value : _byteSwap16(value));
   }
 
+  @pragma("vm:prefer-inline")
   int getUint16(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
@@ -4340,6 +4373,7 @@
     return _byteSwap16(result);
   }
 
+  @pragma("vm:prefer-inline")
   void setUint16(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 1 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 2, "byteOffset");
@@ -4348,6 +4382,7 @@
         identical(endian, Endian.host) ? value : _byteSwap16(value));
   }
 
+  @pragma("vm:prefer-inline")
   int getInt32(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4359,6 +4394,7 @@
     return _byteSwap32(result).toSigned(32);
   }
 
+  @pragma("vm:prefer-inline")
   void setInt32(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4367,6 +4403,7 @@
         identical(endian, Endian.host) ? value : _byteSwap32(value));
   }
 
+  @pragma("vm:prefer-inline")
   int getUint32(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4378,6 +4415,7 @@
     return _byteSwap32(result);
   }
 
+  @pragma("vm:prefer-inline")
   void setUint32(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4386,6 +4424,7 @@
         identical(endian, Endian.host) ? value : _byteSwap32(value));
   }
 
+  @pragma("vm:prefer-inline")
   int getInt64(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4397,6 +4436,7 @@
     return _byteSwap64(result).toSigned(64);
   }
 
+  @pragma("vm:prefer-inline")
   void setInt64(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4405,6 +4445,7 @@
         identical(endian, Endian.host) ? value : _byteSwap64(value));
   }
 
+  @pragma("vm:prefer-inline")
   int getUint64(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4416,6 +4457,7 @@
     return _byteSwap64(result);
   }
 
+  @pragma("vm:prefer-inline")
   void setUint64(int byteOffset, int value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4424,6 +4466,7 @@
         identical(endian, Endian.host) ? value : _byteSwap64(value));
   }
 
+  @pragma("vm:prefer-inline")
   double getFloat32(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4436,6 +4479,7 @@
     return _convF32[0];
   }
 
+  @pragma("vm:prefer-inline")
   void setFloat32(int byteOffset, double value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 3 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 4, "byteOffset");
@@ -4448,6 +4492,7 @@
     _typedData._setUint32(offsetInBytes + byteOffset, _byteSwap32(_convU32[0]));
   }
 
+  @pragma("vm:prefer-inline")
   double getFloat64(int byteOffset, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4460,6 +4505,7 @@
     return _convF64[0];
   }
 
+  @pragma("vm:prefer-inline")
   void setFloat64(int byteOffset, double value, [Endian endian = Endian.big]) {
     if (byteOffset < 0 || byteOffset + 7 >= length) {
       throw new RangeError.range(byteOffset, 0, length - 8, "byteOffset");
@@ -4490,25 +4536,31 @@
   }
 
   @pragma("vm:non-nullable-result-type")
+  @pragma("vm:prefer-inline")
   _TypedList get _typedData native "TypedDataView_typedData";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get offsetInBytes native "TypedDataView_offsetInBytes";
 
   @pragma("vm:exact-result-type", "dart:core#_Smi")
+  @pragma("vm:prefer-inline")
   int get length native "TypedDataView_length";
 }
 
+@pragma("vm:prefer-inline")
 int _byteSwap16(int value) {
   return ((value & 0xFF00) >> 8) | ((value & 0x00FF) << 8);
 }
 
+@pragma("vm:prefer-inline")
 int _byteSwap32(int value) {
   value = ((value & 0xFF00FF00) >> 8) | ((value & 0x00FF00FF) << 8);
   value = ((value & 0xFFFF0000) >> 16) | ((value & 0x0000FFFF) << 16);
   return value;
 }
 
+@pragma("vm:prefer-inline")
 int _byteSwap64(int value) {
   return (_byteSwap32(value) << 32) | _byteSwap32(value >> 32);
 }
@@ -4519,16 +4571,19 @@
 final _convF64 = new Float64List.view(_convU32.buffer);
 
 // Top level utility methods.
+@pragma("vm:prefer-inline")
 int _toInt(int value, int mask) {
   value &= mask;
   if (value > (mask >> 1)) value -= mask + 1;
   return value;
 }
 
+@pragma("vm:prefer-inline")
 int _toInt8(int value) {
   return _toInt(value, 0xFF);
 }
 
+@pragma("vm:prefer-inline")
 int _toUint8(int value) {
   return value & 0xFF;
 }
@@ -4540,18 +4595,22 @@
   return value;
 }
 
+@pragma("vm:prefer-inline")
 int _toInt16(int value) {
   return _toInt(value, 0xFFFF);
 }
 
+@pragma("vm:prefer-inline")
 int _toUint16(int value) {
   return value & 0xFFFF;
 }
 
+@pragma("vm:prefer-inline")
 int _toInt32(int value) {
   return _toInt(value, 0xFFFFFFFF);
 }
 
+@pragma("vm:prefer-inline")
 int _toUint32(int value) {
   return value & 0xFFFFFFFF;
 }
diff --git a/runtime/llvm_codegen/bit/BUILD.gn b/runtime/llvm_codegen/bit/BUILD.gn
new file mode 100644
index 0000000..a61ad74
--- /dev/null
+++ b/runtime/llvm_codegen/bit/BUILD.gn
@@ -0,0 +1,31 @@
+# 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.
+
+executable("bit") {
+  sources = [
+    "main.cc",
+  ]
+  root_dir = rebase_path(root_out_dir)
+  defines = [ "LIT_BINARY_DIR=\"$root_dir\"" ]
+  deps = [
+    "../../../third_party/llvm:LLVMSupport",
+  ]
+  data_deps = [
+    "../codegen",
+  ]
+}
+
+source_set("test") {
+  sources = [
+    "test.cc",
+  ]
+
+  deps = [
+    "../../../third_party/llvm:LLVMSupport",
+  ]
+
+  include_dirs = [ "//runtime" ]
+
+  defines = [ "TESTING" ]
+}
diff --git a/runtime/llvm_codegen/bit/bit.h b/runtime/llvm_codegen/bit/bit.h
new file mode 100644
index 0000000..19eb5f8
--- /dev/null
+++ b/runtime/llvm_codegen/bit/bit.h
@@ -0,0 +1,76 @@
+// 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.
+
+#include <stdio.h>
+
+#include <map>
+#include <regex>
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/LineIterator.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Regex.h"
+#include "llvm/Support/WithColor.h"
+
+namespace {
+
+using namespace llvm;
+
+struct Config {
+  StringRef filename;
+  StringRef out_dir;
+};
+
+StringMap<std::string> GetSubstitutions(const Config& config) {
+  // Compute all of our strings needed for substitutions.
+  StringRef test_dir = sys::path::parent_path(config.filename);
+  StringRef basename = sys::path::filename(config.filename);
+  SmallString<128> tmp_file;
+  sys::path::append(tmp_file, sys::path::Style::native, config.out_dir,
+                    basename + ".tmp");
+  SmallString<128> codegen;
+  sys::path::append(codegen, sys::path::Style::native, LIT_BINARY_DIR,
+                    "codegen");
+  SmallString<128> bit;
+  sys::path::append(bit, sys::path::Style::native, LIT_BINARY_DIR, "bit");
+
+  // Set up our substitutions.
+  StringMap<std::string> subs;
+  subs["s"] = config.filename.str();
+  subs["p"] = test_dir.str();
+  subs["P"] = test_dir.str();
+  subs["t"] = tmp_file.str().str();
+  subs["codegen"] = codegen.str().str();
+  subs["bit"] = bit.str().str();
+  return subs;
+}
+
+std::string PerformSubstitutions(const StringMap<std::string>& subs,
+                                 StringRef string) {
+  std::string out = string.str();
+  for (const auto& sub : subs) {
+    std::string key = (Twine("%") + sub.getKeyData()).str();
+    size_t pos = 0;
+    while ((pos = out.find(key, pos)) != std::string::npos) {
+      if (pos != 0 && out[pos - 1] == '%') {
+        pos += key.size();
+        continue;
+      }
+      out.replace(pos, key.size(), sub.getValue());
+      pos += sub.second.size();
+    }
+  }
+  return out;
+}
+
+Optional<std::string> GetCommand(StringRef line) {
+  static Regex run_line("^;[ ]*RUN:[ ]*(.*)$");
+  SmallVector<StringRef, 2> cmd;
+  if (!run_line.match(line, &cmd)) return Optional<std::string>{};
+  assert(cmd.size() == 2);
+  return cmd[1].str();
+}
+
+}  // namespace
diff --git a/runtime/llvm_codegen/bit/main.cc b/runtime/llvm_codegen/bit/main.cc
new file mode 100644
index 0000000..17a5854
--- /dev/null
+++ b/runtime/llvm_codegen/bit/main.cc
@@ -0,0 +1,122 @@
+// 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.
+
+#include <stdio.h>
+
+#include <cctype>
+#include <map>
+#include <regex>
+
+#include "bit.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/InitLLVM.h"
+#include "llvm/Support/LineIterator.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Process.h"
+#include "llvm/Support/Program.h"
+#include "llvm/Support/Regex.h"
+#include "llvm/Support/VirtualFileSystem.h"
+#include "llvm/Support/WithColor.h"
+
+using namespace llvm;
+
+namespace {
+
+StringRef tool_name;
+
+LLVM_ATTRIBUTE_NORETURN void Fail(Twine message) {
+  WithColor::error(errs(), tool_name) << message << ".\n";
+  errs().flush();
+  exit(1);
+}
+
+LLVM_ATTRIBUTE_NORETURN void Fail(Error e) {
+  assert(E);
+  std::string buf;
+  raw_string_ostream os(buf);
+  logAllUnhandledErrors(std::move(e), os);
+  os.flush();
+  WithColor::error(errs(), tool_name) << buf;
+  exit(1);
+}
+
+LLVM_ATTRIBUTE_NORETURN void ReportError(StringRef file, std::error_code ec) {
+  assert(ec);
+  Fail(createFileError(file, ec));
+}
+
+std::string ReadFile(FILE* file) {
+  std::string output;
+  constexpr size_t buf_size = 256;
+  char buf[buf_size];
+  size_t size;
+  while ((size = fread(buf, buf_size, sizeof(buf[0]), file)))
+    output.append(buf, buf + buf_size);
+  return output;
+}
+
+bool IsPosixFullyPortablePath(StringRef path) {
+  const char* extra = "._-/";
+  for (auto c : path)
+    if (!isalnum(c) && !strchr(extra, c)) return false;
+  return true;
+}
+
+}  // namespace
+
+int main(int argc, char** argv) {
+  InitLLVM X(argc, argv);
+
+  // Make sure we have both arguments.
+  tool_name = argv[0];
+  if (argc != 3) Fail("expected exactly 2 arguments");
+
+  // Makes sure that stdin/stdout are setup correctly.
+  if (sys::Process::FixupStandardFileDescriptors())
+    Fail("std in/out fixup failed");
+
+  // Set our config.
+  Config config;
+  config.filename = argv[1];
+  config.out_dir = argv[2];
+
+  // Make sure we have valid filepaths.
+  if (!IsPosixFullyPortablePath(config.filename))
+    Fail("'" + config.filename + "' is not a posix fully portable filename");
+  if (!IsPosixFullyPortablePath(config.out_dir))
+    Fail("'" + config.out_dir + "' is not a posix fully portable filename");
+
+  // Compute substitutions.
+  auto subs = GetSubstitutions(config);
+
+  // The lines we execute are allowed to assume that %p will exist.
+  sys::fs::create_directory(subs["p"]);
+
+  // Open the file for reading.
+  auto buf_or = vfs::getRealFileSystem()->getBufferForFile(config.filename);
+  if (!buf_or) ReportError(config.filename, buf_or.getError());
+  auto buf = std::move(*buf_or);
+
+  // Now iterate over the lines in the file.
+  line_iterator it{*buf};
+  int count = 0;
+  for (StringRef line = *it; !it.is_at_end(); line = *++it) {
+    auto cmd = GetCommand(line);
+    if (!cmd) continue;
+    ++count;
+    auto subbed = PerformSubstitutions(subs, *cmd);
+    FILE* file = popen(subbed.c_str(), "r");
+    std::string output = ReadFile(file);
+    if (pclose(file) != 0) {
+      errs() << output << "\n";
+      Fail("Failure on line " + Twine(it.line_number()) + "\n\t" + subbed + "");
+    }
+  }
+  if (count == 0) {
+    Fail("No commands to run");
+  }
+  outs() << "Commands run: " << count << "\n";
+  return 0;
+}
diff --git a/runtime/llvm_codegen/bit/test.cc b/runtime/llvm_codegen/bit/test.cc
new file mode 100644
index 0000000..7b800ff
--- /dev/null
+++ b/runtime/llvm_codegen/bit/test.cc
@@ -0,0 +1,71 @@
+// 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.
+
+#include <stdio.h>
+
+#include <utility>
+#include <vector>
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/LineIterator.h"
+#include "llvm/Support/MemoryBuffer.h"
+#include "llvm/Support/Path.h"
+#include "llvm/Support/Regex.h"
+#include "llvm/Support/WithColor.h"
+#include "platform/assert.h"
+#include "vm/unit_test.h"
+
+#define LIT_BINARY_DIR "/path/to/bins"
+#include "bit.h"
+
+UNIT_TEST_CASE(BasicGetSubstitutions) {
+  Config config;
+  config.filename = "/foo/bar/baz.ll";
+  config.out_dir = "/test/out/dir";
+
+  StringMap<std::string> expected;
+  expected["s"] = "/foo/bar/baz.ll";
+  expected["p"] = "/foo/bar";
+  expected["P"] = "/test/out/dir";
+  expected["t"] = "/test/out/dir/baz.ll.tmp";
+  expected["codegen"] = "/path/to/bins/codegen";
+  expected["bit"] = "/path/to/bins/bit";
+
+  StringMap<std::string> actual = GetSubstitutions(config);
+
+  EXPECT_EQ(actual.size(), expected.size());
+  for (const auto& p : actual)
+    EXPECT_EQ(p.getValue(), expected[p.getKey()]);
+}
+
+UNIT_TEST_CASE(BasicPerformSubstitutions) {
+  StringMap<std::string> subs;
+  subs["foo"] = "/foo/path";
+  subs["bar"] = "/bar/path";
+  subs["baz"] = "/baz/path";
+  std::vector<std::pair<std::string, std::string>> cases = {
+      {"%foo", "/foo/path"},
+      {"%bar", "/bar/path"},
+      {"%baz", "/baz/path"},
+      {"this has %foo, and %bar, and %baz2",
+       "this has /foo/path, and /bar/path, and /baz/path2"},
+      {"we don't want %this to expand", "we don't want %this to expand"},
+      {"%", "%"}};
+  for (const auto& test : cases) {
+    auto out = PerformSubstitutions(subs, test.first);
+    EXPECT_EQ(out, test.second);
+  }
+}
+
+UNIT_TEST_CASE(BasicGetCommand) {
+  EXPECT(!GetCommand("; this is some test"));
+  EXPECT(!GetCommand("2 + 2"));
+  EXPECT(!GetCommand("echo $VAR > %bit"));
+
+  EXPECT(GetCommand(";RUN: blarg") == Optional<std::string>{"blarg"});
+  EXPECT(GetCommand(";      RUN:        foo") == Optional<std::string>{"blarg"});
+  EXPECT(
+      GetCommand("; RUN: echo %bit %p/Input/$(%t2) > $(baz \"$BAR->%t\")") ==
+      Optional<std::string>("echo %bit %p/Input/$(%t2) > $(baz \"$BAR->%t\")"));
+}
diff --git a/runtime/llvm_codegen/codegen/BUILD.gn b/runtime/llvm_codegen/codegen/BUILD.gn
new file mode 100644
index 0000000..3174f26
--- /dev/null
+++ b/runtime/llvm_codegen/codegen/BUILD.gn
@@ -0,0 +1,14 @@
+# 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.
+
+executable("codegen") {
+  sources = [
+    "main.cc",
+  ]
+
+  deps = [
+    "../../../third_party/llvm:LLVMAsmPrinter",
+    "../../../third_party/llvm:LLVMIRReader",
+  ]
+}
diff --git a/runtime/llvm_codegen/codegen/main.cc b/runtime/llvm_codegen/codegen/main.cc
new file mode 100644
index 0000000..b45fcd2
--- /dev/null
+++ b/runtime/llvm_codegen/codegen/main.cc
@@ -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.
+
+#include <memory>
+
+#include "llvm/ADT/StringRef.h"
+#include "llvm/IR/LLVMContext.h"
+#include "llvm/IR/Module.h"
+#include "llvm/IRReader/IRReader.h"
+#include "llvm/Support/InitLLVM.h"
+#include "llvm/Support/SourceMgr.h"
+#include "llvm/Support/WithColor.h"
+
+using namespace llvm;
+
+namespace {
+
+StringRef tool_name;
+
+LLVM_ATTRIBUTE_NORETURN void error(Twine message) {
+  WithColor::error(errs(), "llvm-codegen") << message << ".\n";
+  errs().flush();
+  exit(1);
+}
+
+}  // namespace
+
+int main(int argc, char** argv) {
+  InitLLVM X(argc, argv);
+
+  LLVMContext context;
+  SMDiagnostic err;
+  if (argc != 2) error("exactly one argument is taken");
+  tool_name = argv[0];
+  std::unique_ptr<Module> mod = parseIRFile(argv[1], err, context);
+  if (mod == nullptr) {
+    err.print(tool_name.data(), errs());
+    exit(1);
+  }
+  mod->print(outs(), nullptr);
+}
diff --git a/runtime/llvm_codegen/test/BUILD.gn b/runtime/llvm_codegen/test/BUILD.gn
new file mode 100644
index 0000000..b30e840
--- /dev/null
+++ b/runtime/llvm_codegen/test/BUILD.gn
@@ -0,0 +1,10 @@
+# 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.
+
+group("test") {
+  deps = [
+    "codegen",
+    "bit",
+  ]
+}
diff --git a/runtime/llvm_codegen/test/bit/BUILD.gn b/runtime/llvm_codegen/test/bit/BUILD.gn
new file mode 100644
index 0000000..068ef59
--- /dev/null
+++ b/runtime/llvm_codegen/test/bit/BUILD.gn
@@ -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.
+
+import("../bit_test.gni")
+
+bit_test("bit") {
+  tests = [ "basic.test" ]
+}
diff --git a/runtime/llvm_codegen/test/bit/Inputs/basic_input.test b/runtime/llvm_codegen/test/bit/Inputs/basic_input.test
new file mode 100644
index 0000000..3889c3f
--- /dev/null
+++ b/runtime/llvm_codegen/test/bit/Inputs/basic_input.test
@@ -0,0 +1 @@
+; RUN: %codegen %p/../../codegen/basic.ll
diff --git a/runtime/llvm_codegen/test/bit/Inputs/percent.test b/runtime/llvm_codegen/test/bit/Inputs/percent.test
new file mode 100644
index 0000000..8b6782d
--- /dev/null
+++ b/runtime/llvm_codegen/test/bit/Inputs/percent.test
@@ -0,0 +1 @@
+this is a percent sign: %
diff --git a/runtime/llvm_codegen/test/bit/basic.test b/runtime/llvm_codegen/test/bit/basic.test
new file mode 100644
index 0000000..e4989c6
--- /dev/null
+++ b/runtime/llvm_codegen/test/bit/basic.test
@@ -0,0 +1,8 @@
+; RUN: echo this is a test > %t1
+; RUN: echo this is a test > %t2
+; RUN: cmp %t1 %t2
+; RUN: echo this is a percent sign: % > %t3
+; RUN: cmp %t3 %p/Inputs/percent.test
+; RUN: %bit %p/Inputs/basic_input.test %P > %t.test
+; RUN: echo Commands run: 1 > %t.test2
+; RUN: cmp %t.test %t.test2
diff --git a/runtime/llvm_codegen/test/bit_test.gni b/runtime/llvm_codegen/test/bit_test.gni
new file mode 100644
index 0000000..38b7728
--- /dev/null
+++ b/runtime/llvm_codegen/test/bit_test.gni
@@ -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.
+
+import("../../../build/executable_suffix.gni")
+
+# This file defines a template for running bit tests.
+#
+# - bit_test()
+#   Runs bit on the specified file.
+
+# A template for running bit. This lets bit commands be run as ninja commands.
+#
+# Parameters:
+#   tests:
+#     The list of files to input into bit
+template("bit_test") {
+  assert(defined(invoker.tests), "tests must be defined for $target_name")
+
+  action_foreach(target_name) {
+    script = "../../../build/gn_run_binary.py"
+    sources = invoker.tests
+
+    deps = [
+      "../../bit",
+    ]
+    inputs = [
+      "${root_out_dir}/bit$executable_suffix",
+    ]
+
+    # This output is always dirty so ninja will always run this step when asked to.
+    outputs = [
+      "$target_gen_dir/{{source_name_part}}}",
+    ]
+    args = [
+      "compiled_action",
+      rebase_path("${root_out_dir}/bit"),
+      "{{source}}",
+      rebase_path(target_gen_dir),
+    ]
+  }
+}
diff --git a/runtime/llvm_codegen/test/codegen/BUILD.gn b/runtime/llvm_codegen/test/codegen/BUILD.gn
new file mode 100644
index 0000000..ab100e6
--- /dev/null
+++ b/runtime/llvm_codegen/test/codegen/BUILD.gn
@@ -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.
+
+import("../bit_test.gni")
+
+bit_test("codegen") {
+  tests = [ "basic.ll" ]
+}
diff --git a/runtime/llvm_codegen/test/codegen/basic.ll b/runtime/llvm_codegen/test/codegen/basic.ll
new file mode 100644
index 0000000..2afc69b
--- /dev/null
+++ b/runtime/llvm_codegen/test/codegen/basic.ll
@@ -0,0 +1,6 @@
+; RUN: %codegen %s > %t
+
+define i32 @mult(i32, i32) {
+  %3 = mul i32 %0, %1
+  ret i32 %3
+}
diff --git a/runtime/observatory/lib/src/elements/function_view.dart b/runtime/observatory/lib/src/elements/function_view.dart
index 3be3b2b..64c44a3 100644
--- a/runtime/observatory/lib/src/elements/function_view.dart
+++ b/runtime/observatory/lib/src/elements/function_view.dart
@@ -437,7 +437,7 @@
         return 'implicit setter';
       case M.FunctionKind.implicitStaticGetter:
         return 'implicit static getter';
-      case M.FunctionKind.staticFieldInitializer:
+      case M.FunctionKind.fieldInitializer:
         return 'field initializer';
       case M.FunctionKind.irregexpFunction:
         return 'irregexp function';
diff --git a/runtime/observatory/lib/src/elements/retaining_path.dart b/runtime/observatory/lib/src/elements/retaining_path.dart
index 0adfca5..5b7e7a4 100644
--- a/runtime/observatory/lib/src/elements/retaining_path.dart
+++ b/runtime/observatory/lib/src/elements/retaining_path.dart
@@ -93,7 +93,7 @@
       elements.add(_createItem(item, first));
       first = false;
     }
-    elements.add(_createGCRootItem());
+    elements.add(_createGCRootItem(_path.gcRootType));
     return elements;
   }
 
@@ -126,9 +126,9 @@
       ..children = content;
   }
 
-  Element _createGCRootItem() {
+  Element _createGCRootItem(String gcRootType) {
     return new DivElement()
       ..classes = ['indent']
-      ..text = 'retained by a GC root';
+      ..text = 'retained by a GC root ($gcRootType)';
   }
 }
diff --git a/runtime/observatory/lib/src/models/objects/function.dart b/runtime/observatory/lib/src/models/objects/function.dart
index 098003b..82d3d7f 100644
--- a/runtime/observatory/lib/src/models/objects/function.dart
+++ b/runtime/observatory/lib/src/models/objects/function.dart
@@ -14,7 +14,7 @@
   implicitGetter,
   implicitSetter,
   implicitStaticGetter,
-  staticFieldInitializer,
+  fieldInitializer,
   irregexpFunction,
   methodExtractor,
   noSuchMethodDispatcher,
diff --git a/runtime/observatory/lib/src/models/objects/retaining_path.dart b/runtime/observatory/lib/src/models/objects/retaining_path.dart
index f68eecd..cde8a32 100644
--- a/runtime/observatory/lib/src/models/objects/retaining_path.dart
+++ b/runtime/observatory/lib/src/models/objects/retaining_path.dart
@@ -6,6 +6,8 @@
 
 abstract class RetainingPath {
   Iterable<RetainingPathItem> get elements;
+
+  String get gcRootType;
 }
 
 abstract class RetainingPathItem {
diff --git a/runtime/observatory/lib/src/repositories/inbound_references.dart b/runtime/observatory/lib/src/repositories/inbound_references.dart
index be1e1f4..a9b63e0 100644
--- a/runtime/observatory/lib/src/repositories/inbound_references.dart
+++ b/runtime/observatory/lib/src/repositories/inbound_references.dart
@@ -9,7 +9,7 @@
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     final response = await isolate
-        .invokeRpc('_getInboundReferences', {'targetId': id, 'limit': 100});
+        .invokeRpc('getInboundReferences', {'targetId': id, 'limit': 100});
     return new S.InboundReferences(response);
   }
 }
diff --git a/runtime/observatory/lib/src/repositories/retaining_path.dart b/runtime/observatory/lib/src/repositories/retaining_path.dart
index 68253f7..cfe4c38 100644
--- a/runtime/observatory/lib/src/repositories/retaining_path.dart
+++ b/runtime/observatory/lib/src/repositories/retaining_path.dart
@@ -9,7 +9,7 @@
     S.Isolate isolate = i as S.Isolate;
     assert(isolate != null);
     final response = await isolate
-        .invokeRpc('_getRetainingPath', {'targetId': id, 'limit': 100});
+        .invokeRpc('getRetainingPath', {'targetId': id, 'limit': 100});
     return new S.RetainingPath(response);
   }
 }
diff --git a/runtime/observatory/lib/src/sample_profile/sample_profile.dart b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
index 8ff90eb..177713b 100644
--- a/runtime/observatory/lib/src/sample_profile/sample_profile.dart
+++ b/runtime/observatory/lib/src/sample_profile/sample_profile.dart
@@ -820,7 +820,7 @@
   }
 
   Future load(ServiceObjectOwner owner, ServiceMap profile) async {
-    await loadProgress(owner, profile).last;
+    await loadProgress(owner, profile).drain();
   }
 
   static Future sleep([Duration duration = const Duration(microseconds: 0)]) {
diff --git a/runtime/observatory/lib/src/service/object.dart b/runtime/observatory/lib/src/service/object.dart
index 7f735d3..a4a29aa 100644
--- a/runtime/observatory/lib/src/service/object.dart
+++ b/runtime/observatory/lib/src/service/object.dart
@@ -929,7 +929,7 @@
   static const kStdoutStream = 'Stdout';
   static const kStderrStream = 'Stderr';
   static const _kGraphStream = '_Graph';
-  static const kServiceStream = '_Service';
+  static const kServiceStream = 'Service';
 
   /// Returns a single-subscription Stream object for a VM event stream.
   Future<Stream<ServiceEvent>> getEventStream(String streamId) async {
@@ -1110,11 +1110,13 @@
 
 class RetainingPath implements M.RetainingPath {
   final Iterable<RetainingPathItem> elements;
+  final String gcRootType;
 
   RetainingPath(ServiceMap map)
       : this.elements = map['elements']
             .map<RetainingPathItem>((rmap) => new RetainingPathItem(rmap))
-            .toList();
+            .toList(),
+        this.gcRootType = map['gcRootType'];
 }
 
 class RetainingPathItem implements M.RetainingPathItem {
@@ -1887,7 +1889,7 @@
       'targetId': target.id,
       'limit': limit.toString(),
     };
-    return invokeRpc('_getRetainingPath', params);
+    return invokeRpc('getRetainingPath', params);
   }
 
   Future<ServiceObject> getInboundReferences(ServiceObject target, var limit) {
@@ -1895,7 +1897,7 @@
       'targetId': target.id,
       'limit': limit.toString(),
     };
-    return invokeRpc('_getInboundReferences', params);
+    return invokeRpc('getInboundReferences', params);
   }
 
   Future<ServiceObject> getTypeArgumentsList(bool onlyWithInstantiations) {
@@ -1907,7 +1909,7 @@
 
   Future<ServiceObject> getInstances(Class cls, var limit) {
     Map params = {
-      'classId': cls.id,
+      'objectId': cls.id,
       'limit': limit.toString(),
     };
     return invokeRpc('getInstances', params);
@@ -2087,6 +2089,7 @@
 class ServiceEvent extends ServiceObject {
   /// The possible 'kind' values.
   static const kVMUpdate = 'VMUpdate';
+  static const kVMFlagUpdate = 'VMFlagUpdate';
   static const kIsolateStart = 'IsolateStart';
   static const kIsolateRunnable = 'IsolateRunnable';
   static const kIsolateExit = 'IsolateExit';
@@ -2123,6 +2126,8 @@
 
   String kind;
   DateTime timestamp;
+  String flag;
+  String newValue;
   List<M.Breakpoint> pauseBreakpoints;
   Breakpoint breakpoint;
   Frame topFrame;
@@ -2253,6 +2258,12 @@
     if (map['alias'] != null) {
       alias = map['alias'];
     }
+    if (map['flag'] != null) {
+      flag = map['flag'];
+    }
+    if (map['new_value'] != null) {
+      newValue = map['new_value'];
+    }
   }
 
   String toString() {
@@ -3028,8 +3039,8 @@
       return M.FunctionKind.implicitSetter;
     case 'ImplicitStaticGetter':
       return M.FunctionKind.implicitStaticGetter;
-    case 'StaticFieldInitializer':
-      return M.FunctionKind.staticFieldInitializer;
+    case 'FieldInitializer':
+      return M.FunctionKind.fieldInitializer;
     case 'IrregexpFunction':
       return M.FunctionKind.irregexpFunction;
     case 'MethodExtractor':
diff --git a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
index 806aa0a..6e06387 100644
--- a/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
+++ b/runtime/observatory/tests/service/eval_regression_flutter20255_test.dart
@@ -1,7 +1,6 @@
 // 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=--no-background-compilation --enable-inlining-annotations
 
 import 'dart:async';
 import 'dart:developer';
@@ -12,8 +11,6 @@
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-const String NeverInline = 'NeverInline';
-
 class Base<T> {
   String field;
 
@@ -41,7 +38,7 @@
 class Box<T> {
   T value;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void setValue(T value) {
     this.value = value;
   }
diff --git a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
index c2a08b3..3157090 100644
--- a/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_asynchronous_invocation_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     WebSocket _socket =
         await WebSocket.connect((vm as WebSocketVM).target.networkAddress);
@@ -45,7 +45,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': successServiceName, 'alias': serviceAlias}
     });
 
@@ -58,7 +58,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': errorServiceName, 'alias': serviceAlias}
     });
 
diff --git a/runtime/observatory/tests/service/external_service_disappear_test.dart b/runtime/observatory/tests/service/external_service_disappear_test.dart
index 13c55a5..6a7a0d6 100644
--- a/runtime/observatory/tests/service/external_service_disappear_test.dart
+++ b/runtime/observatory/tests/service/external_service_disappear_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     WebSocket _socket =
         await WebSocket.connect((vm as WebSocketVM).target.networkAddress);
@@ -43,7 +43,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': serviceName, 'alias': serviceAlias}
     });
 
diff --git a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
index a2fb925..37547cb 100644
--- a/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_notification_invocation_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     WebSocket _socket =
         await WebSocket.connect((vm as WebSocketVM).target.networkAddress);
@@ -46,7 +46,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': serviceName, 'alias': serviceAlias}
     });
 
diff --git a/runtime/observatory/tests/service/external_service_registration_test.dart b/runtime/observatory/tests/service/external_service_registration_test.dart
index c6720a8..bee0eec 100644
--- a/runtime/observatory/tests/service/external_service_registration_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     expect(vm.services, isEmpty,
         reason: 'No service should be registered at startup');
@@ -45,7 +45,7 @@
       socket.add({
         'jsonrpc': '2.0',
         'id': 1,
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName, 'alias': serviceAlias}
       });
 
@@ -72,7 +72,7 @@
       socket.add({
         'jsonrpc': '2.0',
         'id': 1,
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName + '2', 'alias': serviceAlias + '2'}
       });
 
@@ -99,7 +99,7 @@
       socket.add({
         'jsonrpc': '2.0',
         'id': 1,
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName, 'alias': serviceAlias}
       });
 
diff --git a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
index 0fa3183..857b292 100644
--- a/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
+++ b/runtime/observatory/tests/service/external_service_registration_via_notification_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     expect(vm.services, isEmpty,
         reason: 'No service should be registered at startup');
@@ -44,7 +44,7 @@
       // Registering first service
       socket.add({
         'jsonrpc': '2.0',
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName, 'alias': serviceAlias}
       });
 
@@ -61,7 +61,7 @@
       // Registering second service
       socket.add({
         'jsonrpc': '2.0',
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName + '2', 'alias': serviceAlias + '2'}
       });
 
@@ -79,7 +79,7 @@
       socket.add({
         'jsonrpc': '2.0',
         'id': 1,
-        'method': '_registerService',
+        'method': 'registerService',
         'params': {'service': serviceName, 'alias': serviceAlias}
       });
 
diff --git a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
index c0271c5..69ab333 100644
--- a/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
+++ b/runtime/observatory/tests/service/external_service_synchronous_invocation_test.dart
@@ -14,7 +14,7 @@
     VM vm = isolate.owner;
 
     final serviceEvents =
-        (await vm.getEventStream('_Service')).asBroadcastStream();
+        (await vm.getEventStream('Service')).asBroadcastStream();
 
     WebSocket _socket =
         await WebSocket.connect((vm as WebSocketVM).target.networkAddress);
@@ -45,7 +45,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': successServiceName, 'alias': serviceAlias}
     });
 
@@ -58,7 +58,7 @@
     socket.add({
       'jsonrpc': '2.0',
       'id': 1,
-      'method': '_registerService',
+      'method': 'registerService',
       'params': {'service': errorServiceName, 'alias': serviceAlias}
     });
 
diff --git a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart b/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
index 472bfbb..d1ee705 100644
--- a/runtime/observatory/tests/service/get_flag_list_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_flag_list_rpc_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 'dart:async';
+
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 
@@ -74,12 +76,25 @@
     final kProfilePeriod = 'profile_period';
     final kValue = 100;
     expect(await getFlagValue(vm, kProfilePeriod), '1000');
-    var params = {
+    final params = {
       'name': '$kProfilePeriod',
       'value': '$kValue',
     };
-    var result = await vm.invokeRpcNoUpgrade('setFlag', params);
+    final completer = Completer();
+    final stream = await vm.getEventStream(VM.kVMStream);
+    var subscription;
+    subscription = stream.listen((ServiceEvent event) {
+      if (event.kind == ServiceEvent.kVMFlagUpdate) {
+        expect(event.owner.type, 'VM');
+        expect(event.flag, kProfilePeriod);
+        expect(event.newValue, kValue.toString());
+        subscription.cancel();
+        completer.complete();
+      }
+    });
+    final result = await vm.invokeRpcNoUpgrade('setFlag', params);
     expect(result['type'], equals('Success'));
+    await completer.future;
     expect(await getFlagValue(vm, kProfilePeriod), kValue.toString());
   }
 ];
diff --git a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart b/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
index e60b59d..97535e5 100644
--- a/runtime/observatory/tests/service/get_native_allocation_samples_test.dart
+++ b/runtime/observatory/tests/service/get_native_allocation_samples_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.
 
+// VMOptions=--profiler_native_memory
+
 import 'package:observatory/sample_profile.dart';
 import 'package:observatory/models.dart' as M;
 import 'package:observatory/service_io.dart';
diff --git a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
index f78dcc5..0421eab 100644
--- a/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_retaining_path_rpc_test.dart
@@ -47,7 +47,8 @@
       'targetId': obj['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
+    expect(result['gcRootType'], 'user global');
     expect(result['elements'].length, equals(2));
     expect(result['elements'][1]['value']['name'], equals('globalObject'));
   },
@@ -60,13 +61,13 @@
     };
     bool caughtException;
     try {
-      await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+      await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
       expect(false, isTrue, reason: 'Unreachable');
     } on ServerRpcException catch (e) {
       caughtException = true;
       expect(e.code, equals(ServerRpcException.kInvalidParams));
       expect(e.data['details'],
-          "_getRetainingPath expects the \'limit\' parameter");
+          "getRetainingPath expects the \'limit\' parameter");
     }
     expect(caughtException, isTrue);
   },
@@ -78,10 +79,11 @@
       'targetId': target1['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
+    expect(result['gcRootType'], 'user global');
     expect(result['elements'].length, equals(3));
-    expect(result['elements'][1]['parentField']['name'], equals('x'));
+    expect(result['elements'][1]['parentField'], equals('x'));
     expect(result['elements'][2]['value']['name'], equals('globalObject'));
   },
 
@@ -92,10 +94,11 @@
       'targetId': target2['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
+    expect(result['gcRootType'], 'user global');
     expect(result['elements'].length, equals(3));
-    expect(result['elements'][1]['parentField']['name'], equals('y'));
+    expect(result['elements'][1]['parentField'], equals('y'));
     expect(result['elements'][2]['value']['name'], equals('globalObject'));
   },
 
@@ -106,8 +109,9 @@
       'targetId': target3['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
+    expect(result['gcRootType'], 'user global');
     expect(result['elements'].length, equals(3));
     expect(result['elements'][1]['parentListIndex'], equals(12));
     expect(result['elements'][2]['value']['name'], equals('globalList'));
@@ -120,8 +124,9 @@
       'targetId': target4['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
+    expect(result['gcRootType'], 'user global');
     expect(result['elements'].length, equals(3));
     expect(
         result['elements'][1]['parentMapKey']['valueAsString'], equals('key'));
@@ -135,13 +140,25 @@
       'targetId': target5['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
     expect(result['elements'].length, equals(3));
     expect(result['elements'][1]['parentMapKey']['class']['name'],
         equals('_TestClass'));
     expect(result['elements'][2]['value']['name'], equals('globalMap2'));
-  }
+  },
+
+  // object store
+  (Isolate isolate) async {
+    var obj = await eval(isolate, 'true');
+    var params = {
+      'targetId': obj['id'],
+      'limit': 100,
+    };
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
+    expect(result['gcRootType'], 'object store');
+    expect(result['elements'].length, 0);
+  },
 ];
 
 main(args) async => runIsolateTests(args, tests, testeeBefore: warmup);
diff --git a/runtime/observatory/tests/service/get_source_report_test.dart b/runtime/observatory/tests/service/get_source_report_test.dart
index f859e6d..7627ef3 100644
--- a/runtime/observatory/tests/service/get_source_report_test.dart
+++ b/runtime/observatory/tests/service/get_source_report_test.dart
@@ -91,7 +91,7 @@
     final numRanges = coverage['ranges'].length;
     expect(coverage['type'], equals('SourceReport'));
 
-    expect((numRanges == 12), isTrue);
+    expect(numRanges, equals(12));
     expect(coverage['ranges'][0], equals(expectedRange));
     expect(coverage['scripts'].length, 1);
     expect(
diff --git a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
index 18c89ec..12f1765 100644
--- a/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_user_level_retaining_path_rpc_test.dart
@@ -44,7 +44,7 @@
       'targetId': target1['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
     expect(result['elements'].length, equals(2));
     expect(
@@ -60,7 +60,7 @@
       'targetId': target2['id'],
       'limit': 100,
     };
-    var result = await isolate.invokeRpcNoUpgrade('_getRetainingPath', params);
+    var result = await isolate.invokeRpcNoUpgrade('getRetainingPath', params);
     expect(result['type'], equals('RetainingPath'));
     expect(result['elements'].length, equals(2));
     expect(result['elements'][0]['value']['class']['name'], equals('_Closure'));
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index de073bf..dde16e8 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 @@
     var result = await vm.invokeRpcNoUpgrade('getVersion', {});
     expect(result['type'], equals('Version'));
     expect(result['major'], equals(3));
-    expect(result['minor'], equals(21));
+    expect(result['minor'], equals(25));
     expect(result['_privateMajor'], equals(0));
     expect(result['_privateMinor'], equals(0));
   },
diff --git a/runtime/observatory/tests/service/get_vm_rpc_test.dart b/runtime/observatory/tests/service/get_vm_rpc_test.dart
index ef49166..9f63409 100644
--- a/runtime/observatory/tests/service/get_vm_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_rpc_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // VMOptions=--vm-name=Walter
 
+import 'dart:io';
+
 import 'package:observatory/service_io.dart';
 import 'package:unittest/unittest.dart';
 
@@ -16,6 +18,7 @@
     expect(result['architectureBits'], isPositive);
     expect(result['targetCPU'], new isInstanceOf<String>());
     expect(result['hostCPU'], new isInstanceOf<String>());
+    expect(result['operatingSystem'], Platform.operatingSystem);
     expect(result['version'], new isInstanceOf<String>());
     expect(result['pid'], new isInstanceOf<int>());
     expect(result['startTime'], isPositive);
diff --git a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
index cdd9344..53fd8cd 100644
--- a/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_vm_timeline_rpc_test.dart
@@ -89,7 +89,7 @@
     }
     if (event['cat'] == 'Embedder' &&
         (event['name'] == 'DFE::ReadScript' ||
-            event['name'] == 'CreateIsolateAndSetupHelper')) {
+            event['name'] == 'CreateIsolateGroupAndSetupHelper')) {
       continue;
     }
     Map arguments = event['args'];
diff --git a/runtime/observatory/tests/service/next_through_for_each_loop_test.dart b/runtime/observatory/tests/service/next_through_for_each_loop_test.dart
index 5a0072d..bce2c73 100644
--- a/runtime/observatory/tests/service/next_through_for_each_loop_test.dart
+++ b/runtime/observatory/tests/service/next_through_for_each_loop_test.dart
@@ -20,10 +20,6 @@
   // Initialize data (on '[')
   "$file:${LINE+0}:20",
 
-  // Twice on data (probably for 'create iterator' and 'moveNext' on iterator)
-  // (on 'data')
-  "$file:${LINE+1}:25",
-
   // An iteration of the loop is "data", "{", then inside loop
   // (on call to 'print')
   "$file:${LINE+1}:25",
diff --git a/runtime/observatory/tests/service/rewind_optimized_out_test.dart b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
index 1a7c589..304678d 100644
--- a/runtime/observatory/tests/service/rewind_optimized_out_test.dart
+++ b/runtime/observatory/tests/service/rewind_optimized_out_test.dart
@@ -8,17 +8,14 @@
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
-int LINE_A = 34;
-int LINE_B = 39;
-int LINE_C = 42;
-int LINE_D = 46;
+int LINE_A = 31;
+int LINE_B = 36;
+int LINE_C = 39;
+int LINE_D = 43;
 
 int global = 0;
 
-@noInline
+@pragma('vm:never-inline')
 b3(x) {
   int sum = 0;
   try {
@@ -35,10 +32,10 @@
   return sum;
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 b2(x) => b3(x); // Line B
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 b1(x) => b2(x); // Line C
 
 test() {
@@ -79,7 +76,6 @@
 main(args) => runIsolateTests(args, tests, testeeConcurrent: test, extraArgs: [
       '--trace-rewind',
       '--prune-dead-locals',
-      '--enable-inlining-annotations',
       '--no-background-compilation',
       '--optimization-counter-threshold=10'
     ]);
diff --git a/runtime/observatory/tests/service/rewind_test.dart b/runtime/observatory/tests/service/rewind_test.dart
index b35a123..80ab4e7 100644
--- a/runtime/observatory/tests/service/rewind_test.dart
+++ b/runtime/observatory/tests/service/rewind_test.dart
@@ -8,17 +8,14 @@
 import 'service_test_common.dart';
 import 'test_helper.dart';
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
-int LINE_A = 34;
-int LINE_B = 39;
-int LINE_C = 42;
-int LINE_D = 46;
+int LINE_A = 31;
+int LINE_B = 36;
+int LINE_C = 39;
+int LINE_D = 43;
 
 int global = 0;
 
-@noInline
+@pragma('vm:never-inline')
 b3(x) {
   int sum = 0;
   try {
@@ -35,10 +32,10 @@
   return sum;
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 b2(x) => b3(x); // Line B
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 b1(x) => b2(x); // Line C
 
 test() {
@@ -102,19 +99,6 @@
     expect(result.type, equals('Instance'));
     expect(result.valueAsString, equals('100'));
 
-    // Resume again, for fun.
-    var result2 = await isolate.resume();
-    expect(result2['type'], equals('Success'));
-  },
-  hasStoppedAtBreakpoint,
-  stoppedAtLine(LINE_A),
-  (Isolate isolate) async {
-    // global is now 101.
-    Instance result = await isolate.rootLibrary.evaluate('global');
-    print('global is $result');
-    expect(result.type, equals('Instance'));
-    expect(result.valueAsString, equals('101'));
-
     // Rewind up to 'test'/
     var result2 = await isolate.rewind(3);
     expect(result2['type'], equals('Success'));
@@ -151,7 +135,6 @@
 main(args) => runIsolateTests(args, tests, testeeConcurrent: test, extraArgs: [
       '--trace-rewind',
       '--no-prune-dead-locals',
-      '--enable-inlining-annotations',
       '--no-background-compilation',
       '--optimization-counter-threshold=10'
     ]);
diff --git a/runtime/observatory/tests/service/service.status b/runtime/observatory/tests/service/service.status
index d733673..7550118 100644
--- a/runtime/observatory/tests/service/service.status
+++ b/runtime/observatory/tests/service/service.status
@@ -53,15 +53,13 @@
 [ !$strong && ($compiler == dartk || $compiler == dartkp) ]
 *: Skip
 
-[ $arch != ia32 || $arch != x64 || $system != linux ]
-get_native_allocation_samples_test: Skip # Unsupported.
-
 # These tests are slow on simulators.
 [ $arch == simarm || $arch == simarm64 ]
 *: Pass, Slow
 
 [ $arch == simdbc || $arch == simdbc64 ]
 async_single_step_exception_test: RuntimeError # Issue 29218
+get_cpu_profile_timeline_rpc_test: SkipByDesign
 implicit_getter_setter_test: RuntimeError # Field guards unimplemented.
 next_through_catch_test: RuntimeError # Debugging StringConcatenation doesn't work the same on simdbc as on other platforms (bug #28975).
 next_through_simple_async_test: RuntimeError # Debugging StringConcatenation doesn't work the same on simdbc as on other platforms (bug #28975).
@@ -81,6 +79,9 @@
 [ $compiler == dartk || $compiler == dartkp ]
 rewind_test: Pass, Slow
 
+[ $system != linux || $arch != ia32 && $arch != x64 ]
+get_native_allocation_samples_test: Skip # Unsupported.
+
 # Skip all service tests because random reloads interfere.
 [ $hot_reload || $hot_reload_rollback ]
 *: SkipByDesign # The service tests should run without being reloaded.
diff --git a/runtime/observatory/tests/service/service_kernel.status b/runtime/observatory/tests/service/service_kernel.status
index cea771c..8ac0c0f 100644
--- a/runtime/observatory/tests/service/service_kernel.status
+++ b/runtime/observatory/tests/service/service_kernel.status
@@ -46,8 +46,8 @@
 evaluate_activation_in_method_class_test: RuntimeError # Issue 35505
 evaluate_activation_test/instance: RuntimeError # http://dartbug.com/20047
 evaluate_activation_test/scope: RuntimeError # http://dartbug.com/20047
+get_source_report_test: RuntimeError # Should pass again when constant evaluation is relanded, see http://dartbug.com/36600
 pause_on_unhandled_async_exceptions2_test: Pass, Slow
-regress_34841_test: RuntimeError # http://dartbug.com/34841
 unused_changes_in_last_reload_test: RuntimeError
 
 [ $compiler == dartkb ]
diff --git a/runtime/observatory/tests/service/service_test_common.dart b/runtime/observatory/tests/service/service_test_common.dart
index 3be2f4d..87893bc 100644
--- a/runtime/observatory/tests/service/service_test_common.dart
+++ b/runtime/observatory/tests/service/service_test_common.dart
@@ -540,11 +540,27 @@
       expectedStops = removeAdjacentDuplicates(expectedStops);
     }
 
-    int end = recordStops.length < expectedStops.length
-        ? recordStops.length
-        : expectedStops.length;
-    for (int i = 0; i < end; ++i) {
-      expect(recordStops[i], expectedStops[i]);
+    // Single stepping in interpreted bytecode 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,
diff --git a/runtime/observatory/tests/service/step_through_for_each_sync_star_2_test.dart b/runtime/observatory/tests/service/step_through_for_each_sync_star_2_test.dart
index 8495d65..16ee4c9 100644
--- a/runtime/observatory/tests/service/step_through_for_each_sync_star_2_test.dart
+++ b/runtime/observatory/tests/service/step_through_for_each_sync_star_2_test.dart
@@ -25,8 +25,6 @@
 List<String> expected = [
   "$file:${LINE + 0}:5", // after 'code'
   "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
-  "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
-  "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
 
   "$file:${LINE + 6}:10", // after 'generator' (definition line)
   "$file:${LINE + 7}:9", // on '=' in 'x = 3'
diff --git a/runtime/observatory/tests/service/step_through_for_each_sync_star_test.dart b/runtime/observatory/tests/service/step_through_for_each_sync_star_test.dart
index f36a1e2..676c5e0 100644
--- a/runtime/observatory/tests/service/step_through_for_each_sync_star_test.dart
+++ b/runtime/observatory/tests/service/step_through_for_each_sync_star_test.dart
@@ -26,8 +26,6 @@
 List<String> expected = [
   "$file:${LINE + 0}:5", // after 'code'
   "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
-  "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
-  "$file:${LINE + 1}:25", // on 'generator' (in 'for' line)
 
   "$file:${LINE + 6}:10", // after 'generator' (definition line)
   "$file:${LINE + 7}:9", // on '=' in 'x = 3'
diff --git a/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
index 9f70deb..548c6b2 100644
--- a/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
+++ b/runtime/observatory/tests/service/step_through_mixin_from_sdk_test.dart
@@ -35,19 +35,19 @@
 List<String> expected = [
   "$file:${LINE + 0}:17", // on "Foo" (in "new Foo()")
   "$file:${LINE + 1}:11", // on "="
-  "list.dart:100:24", // on parameter to "contains"
-  "list.dart:101:23", // on "length" in "this.length"
-  "list.dart:102:16", // on "=" in "i = 0"
-  "list.dart:102:23", // on "<" in "i < length"
-  "list.dart:103:15", // on "[" in "this[i]"
+  "list.dart:101:24", // on parameter to "contains"
+  "list.dart:102:23", // on "length" in "this.length"
+  "list.dart:103:16", // on "=" in "i = 0"
+  "list.dart:103:23", // on "<" in "i < length"
+  "list.dart:104:15", // on "[" in "this[i]"
   "$file:${LINE + 13}:23", // on parameter in "operator []"
   "$file:${LINE + 14}:5", // on "return"
-  "list.dart:103:19", // on "=="
-  "list.dart:104:26", // on "length" in "this.length"
-  "list.dart:104:18", // on "!="
-  "list.dart:102:34", // on "++" in "i++"
-  "list.dart:102:23", // on "<" in "i < length"
-  "list.dart:108:5", // on "return"
+  "list.dart:104:19", // on "=="
+  "list.dart:105:26", // on "length" in "this.length"
+  "list.dart:105:18", // on "!="
+  "list.dart:103:34", // on "++" in "i++"
+  "list.dart:103:23", // on "<" in "i < length"
+  "list.dart:109:5", // on "return"
   "$file:${LINE + 4}:5", // on "print"
   "$file:${LINE + 6}:1" // on ending '}'
 ];
diff --git a/runtime/observatory/tests/service/tcp_socket_service_test.dart b/runtime/observatory/tests/service/tcp_socket_service_test.dart
index ef80a75..889c50d 100644
--- a/runtime/observatory/tests/service/tcp_socket_service_test.dart
+++ b/runtime/observatory/tests/service/tcp_socket_service_test.dart
@@ -14,7 +14,7 @@
   // to allow us to query them from the other isolate.
   var serverSocket = await io.ServerSocket.bind('127.0.0.1', 0);
   serverSocket.listen((s) {
-    s.transform(utf8.decoder).listen(print);
+    utf8.decoder.bind(s).listen(print);
     s.close();
   });
   var socket = await io.Socket.connect("127.0.0.1", serverSocket.port);
diff --git a/runtime/observatory/tests/service/valid_source_locations_test.dart b/runtime/observatory/tests/service/valid_source_locations_test.dart
index e00717f..8512479 100644
--- a/runtime/observatory/tests/service/valid_source_locations_test.dart
+++ b/runtime/observatory/tests/service/valid_source_locations_test.dart
@@ -14,15 +14,23 @@
   debugger();
 }
 
-Future validateLocation(Location location) async {
+Future validateLocation(Location location, Object object) async {
   if (location == null) return;
   if (location.tokenPos < 0) return;
+  if (location.script.uri == 'dart:_internal-patch/class_id_fasta.dart') {
+    // Injected fields from this script cannot be reloaded.
+    return;
+  }
 
   // Ensure the script is loaded.
   final Script script = await location.script.load();
 
   // Use the more low-level functions.
-  script.getLine(script.tokenToLine(location.tokenPos));
+  final line = script.tokenToLine(location.tokenPos);
+  if (line == null) {
+    throw 'missing location for $object in script ${script.uri}';
+  }
+  script.getLine(line);
   script.tokenToCol(location.tokenPos);
 
   // Use the helper functions.
@@ -31,19 +39,18 @@
 }
 
 Future validateFieldLocation(Field field) async {
-  // TODO(http://dartbug.com/32503): We should `field = await field.load()`
-  // here, but it causes all kinds of strong-mode errors.
-  await validateLocation(field.location);
+  field = await field.load();
+  await validateLocation(field.location, field);
 }
 
 Future validateFunctionLocation(ServiceFunction fun) async {
   fun = await fun.load();
-  await validateLocation(fun.location);
+  await validateLocation(fun.location, fun);
 }
 
 Future validateClassLocation(Class klass) async {
   klass = await klass.load();
-  await validateLocation(klass.location);
+  await validateLocation(klass.location, klass);
 
   for (Field field in klass.fields) {
     await validateFieldLocation(field);
diff --git a/runtime/observatory/update_sources.py b/runtime/observatory/update_sources.py
index cc6eb16..39f6ad3 100755
--- a/runtime/observatory/update_sources.py
+++ b/runtime/observatory/update_sources.py
@@ -10,14 +10,16 @@
 import sys
 from datetime import date
 
+
 def getDir(rootdir, target):
-  sources = []
-  for root, subdirs, files in os.walk(rootdir):
-    subdirs.sort()
-    files.sort()
-    for f in files:
-      sources.append(root + '/' + f)
-  return sources
+    sources = []
+    for root, subdirs, files in os.walk(rootdir):
+        subdirs.sort()
+        files.sort()
+        for f in files:
+            sources.append(root + '/' + f)
+    return sources
+
 
 HEADER = """# 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
@@ -28,18 +30,20 @@
 # This file contains all dart, css, and html sources for Observatory.
 """
 
+
 def main():
-  with open('observatory_sources.gni', 'w') as target:
-    target.write(HEADER)
-    target.write('observatory_sources = [\n')
-    sources = []
-    for rootdir in ['lib', 'web']:
-      sources.extend(getDir(rootdir, target))
-    sources.sort()
-    for s in sources:
-      if (s[-9:] != 'README.md'):
-        target.write('  "' + s + '",\n')
-    target.write(']\n')
+    with open('observatory_sources.gni', 'w') as target:
+        target.write(HEADER)
+        target.write('observatory_sources = [\n')
+        sources = []
+        for rootdir in ['lib', 'web']:
+            sources.extend(getDir(rootdir, target))
+        sources.sort()
+        for s in sources:
+            if (s[-9:] != 'README.md'):
+                target.write('  "' + s + '",\n')
+        target.write(']\n')
+
 
 if __name__ == "__main__":
-   main()
+    main()
diff --git a/runtime/platform/assert.h b/runtime/platform/assert.h
index ed56f3a..5701e5e 100644
--- a/runtime/platform/assert.h
+++ b/runtime/platform/assert.h
@@ -86,7 +86,10 @@
   void GreaterEqual(const E& left, const A& right);
 
   template <typename T>
-  T NotNull(const T p);
+  void NotNull(const T p);
+
+  template <typename T>
+  void Null(const T p);
 #endif
 
   static bool failed() { return failed_; }
@@ -214,10 +217,15 @@
 }
 
 template <typename T>
-T Expect::NotNull(const T p) {
-  if (p != NULL) return p;
+void Expect::NotNull(const T p) {
+  if (p != NULL) return;
   Fail("expected: not NULL, found NULL");
-  return NULL;
+}
+
+template <typename T>
+void Expect::Null(const T p) {
+  if (p == nullptr) return;
+  Fail("expected: nullptr, found not null pointer");
 }
 #endif
 
@@ -324,6 +332,8 @@
 
 #define EXPECT_NOTNULL(ptr) dart::Expect(__FILE__, __LINE__).NotNull((ptr))
 
+#define EXPECT_NULLPTR(ptr) dart::Expect(__FILE__, __LINE__).Null((ptr))
+
 #define FAIL(error) dart::Expect(__FILE__, __LINE__).Fail("%s", error)
 
 #define FAIL1(format, p1) dart::Expect(__FILE__, __LINE__).Fail(format, (p1))
diff --git a/runtime/platform/memory_sanitizer.h b/runtime/platform/memory_sanitizer.h
index 27cb25d..324d73e 100644
--- a/runtime/platform/memory_sanitizer.h
+++ b/runtime/platform/memory_sanitizer.h
@@ -11,7 +11,7 @@
 // told about areas that are initialized by generated code.
 #if defined(__has_feature)
 #if __has_feature(memory_sanitizer)
-extern "C" void __msan_unpoison(void*, size_t);
+extern "C" void __msan_unpoison(const volatile void*, size_t);
 #define MSAN_UNPOISON(ptr, len) __msan_unpoison(ptr, len)
 #define NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
 #else  // __has_feature(memory_sanitizer)
diff --git a/runtime/tests/vm/dart/base_il_serialization_test.dart b/runtime/tests/vm/dart/base_il_serialization_test.dart
new file mode 100644
index 0000000..f59b383
--- /dev/null
+++ b/runtime/tests/vm/dart/base_il_serialization_test.dart
@@ -0,0 +1,15 @@
+// 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.
+
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --no_serialize_flow_graph_types
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --verbose_flow_graph_serialization
+// VMOptions=--serialize_flow_graphs_to=il_tmp.txt --no_serialize_flow_graph_types --verbose_flow_graph_serialization
+
+// Just use the existing hello world test.
+import 'hello_world_test.dart' as test;
+
+main(args) {
+  test.main();
+}
diff --git a/runtime/tests/vm/dart/catch_entry_state_test.dart b/runtime/tests/vm/dart/catch_entry_state_test.dart
index ed33f17..9f5fd6e 100644
--- a/runtime/tests/vm/dart/catch_entry_state_test.dart
+++ b/runtime/tests/vm/dart/catch_entry_state_test.dart
@@ -1,7 +1,7 @@
 // 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=--no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=100
+// VMOptions=--no-background-compilation --optimization-counter-threshold=100
 
 // Verify that runtime correctly materializes unboxed variables on the catch
 // entry in optimized code.
@@ -10,9 +10,7 @@
 
 import 'package:expect/expect.dart';
 
-const NeverInline = "NeverInline";
-
-@NeverInline
+@pragma('vm:never-inline')
 void testThrow(bool shouldThrow) {
   var dbl = 0.0;
   var i32 = 0;
diff --git a/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart b/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart
index 2aef254..a938ed4 100644
--- a/runtime/tests/vm/dart/entrypoints/aot/static_this_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/aot/static_this_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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5 -Denable_inlining=true
 
 import '../static_this.dart';
 
diff --git a/runtime/tests/vm/dart/entrypoints/aot/super_test.dart b/runtime/tests/vm/dart/entrypoints/aot/super_test.dart
index 8b19e02..96c4aeb 100644
--- a/runtime/tests/vm/dart/entrypoints/aot/super_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/aot/super_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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5 -Denable_inlining=true
 
 import "../super.dart";
 
diff --git a/runtime/tests/vm/dart/entrypoints/common.dart b/runtime/tests/vm/dart/entrypoints/common.dart
index 3d6521b..3c1ccf6 100644
--- a/runtime/tests/vm/dart/entrypoints/common.dart
+++ b/runtime/tests/vm/dart/entrypoints/common.dart
@@ -8,13 +8,15 @@
 // We accomplish this by using VM options in the yes-inlining variant to set the
 // "enable_inlining" constant variable to true. This maximizes code sharing
 // between the two variants, which are otherwise identical.
-const String NeverInline =
-    const bool.fromEnvironment("enable_inlining") ? "" : "NeverInline";
+const pragma NeverInline = const bool.fromEnvironment("enable_inlining")
+    ? null
+    : pragma('vm:never-inline');
 
 // In AOT we need to force some functions to be inlined since we only build the
 // unchecked entry-point when inlining.
-const String AlwaysInline =
-    const bool.fromEnvironment("enable_inlining") ? "AlwaysInline" : "";
+const pragma AlwaysInline = const bool.fromEnvironment("enable_inlining")
+    ? pragma('vm:prefer-inline')
+    : null;
 
 // All these tests can be run in test mode or in benchmark mode. In benchmark
 // mode, there is introspection is omitted and the tests runs for many more
@@ -57,3 +59,5 @@
 const validate = benchmarkMode ? null : _validateFn;
 @pragma("vm:entry-point", "get")
 const validateTearoff = benchmarkMode ? null : _validateTearoffFn;
+
+void bumpUsageCounter() {}
diff --git a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart
index 12523e8..44e6179 100644
--- a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_optional_this_test.dart
@@ -2,8 +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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10
 
 // Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
 // entrypoint. The use of optional arguments here encourages prologue sharing
@@ -15,6 +15,14 @@
 abstract class C<T> {
   @NeverInline
   void samir1(T x) {
+    // Make sure this method gets optimized before main.
+    // Otherwise it might get inlined into warm-up loop, and subsequent
+    // loop will call an unoptimized version (which is not guaranteed to
+    // dispatch to unchecked entry point).
+    bumpUsageCounter();
+    bumpUsageCounter();
+    bumpUsageCounter();
+
     samir2(x, y: "hi");
   }
 
diff --git a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart
index 4a360e9..6b45a0d 100644
--- a/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/jit/polymorphic_this_test.dart
@@ -2,8 +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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10
 
 // Test that 'PolymorphicInstanceCall's against "this" go through the unchecked
 // entrypoint.
@@ -14,6 +14,14 @@
 abstract class C<T> {
   @NeverInline
   void target1(T x) {
+    // Make sure this method gets optimized before main.
+    // Otherwise it might get inlined into warm-up loop, and subsequent
+    // loop will call an unoptimized version (which is not guaranteed to
+    // dispatch to unchecked entry point).
+    bumpUsageCounter();
+    bumpUsageCounter();
+    bumpUsageCounter();
+
     target2(x);
   }
 
diff --git a/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart b/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart
index 0662ada..0c1aa19 100644
--- a/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/jit/static_this_test.dart
@@ -2,8 +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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5 -Denable_inlining=true
 
 import '../static_this.dart';
 
diff --git a/runtime/tests/vm/dart/entrypoints/jit/super_test.dart b/runtime/tests/vm/dart/entrypoints/jit/super_test.dart
index dff824c..d6d8a1a 100644
--- a/runtime/tests/vm/dart/entrypoints/jit/super_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/jit/super_test.dart
@@ -2,8 +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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5 -Denable_inlining=true
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=5
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=5
 
 import "../super.dart";
 
diff --git a/runtime/tests/vm/dart/entrypoints/static_this.dart b/runtime/tests/vm/dart/entrypoints/static_this.dart
index da610da..dc9f958 100644
--- a/runtime/tests/vm/dart/entrypoints/static_this.dart
+++ b/runtime/tests/vm/dart/entrypoints/static_this.dart
@@ -17,6 +17,14 @@
 
   @NeverInline
   void target1(T x) {
+    // Make sure this method gets optimized before main.
+    // Otherwise it might get inlined into warm-up loop, and subsequent
+    // loop will call an unoptimized version (which is not guaranteed to
+    // dispatch to unchecked entry point).
+    bumpUsageCounter();
+    bumpUsageCounter();
+    bumpUsageCounter();
+
     target2(x);
   }
 }
diff --git a/runtime/tests/vm/dart/entrypoints/super.dart b/runtime/tests/vm/dart/entrypoints/super.dart
index 088b193..a31fd70 100644
--- a/runtime/tests/vm/dart/entrypoints/super.dart
+++ b/runtime/tests/vm/dart/entrypoints/super.dart
@@ -19,6 +19,14 @@
 class D<T> extends C<T> {
   @NeverInline
   void target1(T x) {
+    // Make sure this method gets optimized before main.
+    // Otherwise it might get inlined into warm-up loop, and subsequent
+    // loop will call an unoptimized version (which is not guaranteed to
+    // dispatch to unchecked entry point).
+    bumpUsageCounter();
+    bumpUsageCounter();
+    bumpUsageCounter();
+
     super.target1(x);
   }
 }
@@ -26,6 +34,14 @@
 class E<T> extends C<T> {
   @NeverInline
   void target1(T x) {
+    // Make sure this method gets optimized before main.
+    // Otherwise it might get inlined into warm-up loop, and subsequent
+    // loop will call an unoptimized version (which is not guaranteed to
+    // dispatch to unchecked entry point).
+    bumpUsageCounter();
+    bumpUsageCounter();
+    bumpUsageCounter();
+
     super.target1(x);
   }
 }
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart
index c74b806..3b2195b 100644
--- a/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/tearoff_prologue_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 // No type checks are removed here, but we can skip the argument count check.
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10 -Denable_inlining=true
 
 import "package:expect/expect.dart";
 import "common.dart";
diff --git a/runtime/tests/vm/dart/entrypoints/tearoff_test.dart b/runtime/tests/vm/dart/entrypoints/tearoff_test.dart
index 1b29cbe..b42369e 100644
--- a/runtime/tests/vm/dart/entrypoints/tearoff_test.dart
+++ b/runtime/tests/vm/dart/entrypoints/tearoff_test.dart
@@ -2,8 +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-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
-// VMOptions=--enable-testing-pragmas --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10 -Denable_inlining=true
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10
+// VMOptions=--enable-testing-pragmas --no-background-compilation --optimization-counter-threshold=10 -Denable_inlining=true
 
 // Test that typed calls against tearoffs go into the unchecked entrypoint.
 
diff --git a/runtime/tests/vm/dart/regress29620_test.dart b/runtime/tests/vm/dart/regress29620_test.dart
index b6d4e37..b41f3b7 100644
--- a/runtime/tests/vm/dart/regress29620_test.dart
+++ b/runtime/tests/vm/dart/regress29620_test.dart
@@ -6,13 +6,10 @@
 // and decisions which parts of the instruction to emit use the same
 // range information for instruction inputs.
 
-// VMOptions=--enable-inlining-annotations --optimization_counter_threshold=10 --no-use-osr --no-background-compilation
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const neverInline = "NeverInline";
-
 class Flag {
   var value;
   Flag(this.value);
@@ -20,14 +17,14 @@
   static final FLAG = new Flag(0);
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 void checkRange(bit) {
   if (bit < 0 || bit > 31) {
     throw "bit must be in [0, 31]";
   }
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 bool isSet(flags, bit) {
   checkRange(bit);
   // Note: > 0 here instead of == 0 to prevent merging into
@@ -35,7 +32,7 @@
   return (flags & (1 << bit)) > 0;
 }
 
-@neverInline
+@pragma('vm:never-inline')
 bool bug(flags) {
   var bit = Flag.FLAG.value;
   checkRange(bit);
diff --git a/runtime/tests/vm/dart/regress30853_test.dart b/runtime/tests/vm/dart/regress30853_test.dart
index 5c415dc..a514edf 100644
--- a/runtime/tests/vm/dart/regress30853_test.dart
+++ b/runtime/tests/vm/dart/regress30853_test.dart
@@ -5,22 +5,19 @@
 // Regression test for dartbug.com/30853: check that we assign correct range
 // to Uint32 operations when creating them from Int64 operations.
 
-// VMOptions=--optimization_counter_threshold=50 --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization_counter_threshold=50 --no-background-compilation
 
 import "package:expect/expect.dart";
 
-const NeverInline = "NeverInline";
-const AlwaysInline = "AlwaysInline";
-
-@NeverInline
+@pragma('vm:never-inline')
 noop(x) => x;
 
 const int BITS32 = 0xFFFFFFFF;
 
-@AlwaysInline
+@pragma('vm:prefer-inline')
 int toUint32(int x) => noop(x & BITS32);
 
-@NeverInline
+@pragma('vm:never-inline')
 bitNotAsUint32(x) {
   // After inlining we will have here BoxUint32(UnboxUint32(UnarySmiOp(~, x)))
   // UnboxUint32 must have correct range assigned, otherwise we will not
diff --git a/runtime/tests/vm/dart/regress_37382_test.dart b/runtime/tests/vm/dart/regress_37382_test.dart
new file mode 100644
index 0000000..e0d818c
--- /dev/null
+++ b/runtime/tests/vm/dart/regress_37382_test.dart
@@ -0,0 +1,14 @@
+// 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:expect/expect.dart';
+
+class A<X, Y> {
+  R f<R>(R Function<S, T>(A<S, T>) t) => t<X, Y>(this);
+}
+
+main() {
+  A<num, num> a = A<int, int>();
+  Expect.equals(a.f.runtimeType.toString(), '<R>(<S, T>(A<S, T>) => R) => R');
+}
diff --git a/runtime/tests/vm/dart/truncating_ints_test.dart b/runtime/tests/vm/dart/truncating_ints_test.dart
index 0050383..a988482 100644
--- a/runtime/tests/vm/dart/truncating_ints_test.dart
+++ b/runtime/tests/vm/dart/truncating_ints_test.dart
@@ -2,25 +2,22 @@
 // for 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-inlining-annotations --optimization_counter_threshold=10 --no-use-osr --no-background-compilation
+// VMOptions=--optimization_counter_threshold=10 --no-use-osr --no-background-compilation
 
 // Test for truncating (wrap-around) integer arithmetic.
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const neverInline = "NeverInline";
-
-@neverInline
+@pragma('vm:never-inline')
 add_smi(var a, var b) => a + b;
 
-@neverInline
+@pragma('vm:never-inline')
 add_mint(var a, var b) => a + b;
 
-@neverInline
+@pragma('vm:never-inline')
 add_mint_consts() => 0x5000000000000000 + 0x6000000000000000;
 
-@neverInline
+@pragma('vm:never-inline')
 test_add(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) {
   for (var i = 0; i < 20; i++) {
     Expect.equals(5, add_smi(v2, v3));
@@ -46,16 +43,16 @@
   }
 }
 
-@neverInline
+@pragma('vm:never-inline')
 sub_smi(var a, var b) => a - b;
 
-@neverInline
+@pragma('vm:never-inline')
 sub_mint(var a, var b) => a - b;
 
-@neverInline
+@pragma('vm:never-inline')
 sub_mint_consts() => (-0x5000000000000000) - 0x6000000000000000;
 
-@neverInline
+@pragma('vm:never-inline')
 test_sub(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) {
   for (var i = 0; i < 20; i++) {
     Expect.equals(1, sub_smi(v3, v2));
@@ -81,16 +78,16 @@
   }
 }
 
-@neverInline
+@pragma('vm:never-inline')
 mul_smi(var a, var b) => a * b;
 
-@neverInline
+@pragma('vm:never-inline')
 mul_mint(var a, var b) => a * b;
 
-@neverInline
+@pragma('vm:never-inline')
 mul_mint_consts() => 0x5000000000000001 * 0x6000000000000001;
 
-@neverInline
+@pragma('vm:never-inline')
 test_mul(var v2, var v3, var v3fxx, var v5fxx, var v7fxx, var n60xx) {
   for (var i = 0; i < 20; i++) {
     Expect.equals(6, mul_smi(v2, v3));
@@ -112,25 +109,25 @@
   }
 }
 
-@neverInline
+@pragma('vm:never-inline')
 shl_smi(var a, var b) => a << b;
 
-@neverInline
+@pragma('vm:never-inline')
 shl_mint(var a, var b) => a << b;
 
-@neverInline
+@pragma('vm:never-inline')
 shl_mint_by_const16(var a) => a << 16;
 
-@neverInline
+@pragma('vm:never-inline')
 shl_smi_by_const96(var a) => a << 96;
 
-@neverInline
+@pragma('vm:never-inline')
 shl_mint_by_const96(var a) => a << 96;
 
-@neverInline
+@pragma('vm:never-inline')
 shl_mint_consts() => 0x77665544aabbccdd << 48;
 
-@neverInline
+@pragma('vm:never-inline')
 test_shl(var v2, var v3, var v8, var v40) {
   for (var i = 0; i < 20; i++) {
     Expect.equals(16, shl_smi(v2, v3));
diff --git a/runtime/tests/vm/dart/wrap_around_in_range_analysis_test.dart b/runtime/tests/vm/dart/wrap_around_in_range_analysis_test.dart
index 3ef127d..67fc82d 100644
--- a/runtime/tests/vm/dart/wrap_around_in_range_analysis_test.dart
+++ b/runtime/tests/vm/dart/wrap_around_in_range_analysis_test.dart
@@ -2,15 +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=--no-background-compilation --enable-inlining-annotations
-
 // Test for overflow (wrap-around) during computations in range analysis.
 
 import "package:expect/expect.dart";
 
-const NeverInline = 'NeverInline';
-
-@NeverInline
+@pragma('vm:never-inline')
 int foofoo(int b) {
   for (int i = 0x7ffffffffffffffc; i <= b; i += 2) {
     if (i < 0) {
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index 44a6971..d26ca4f 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -11,10 +11,8 @@
 cc/IsolateReload_PendingStaticCall_NSMToDefined: Fail, Crash # Issue 32981. Fails on non-Windows, crashes on Windows (because of test.py special handline)
 cc/IsolateReload_PendingUnqualifiedCall_InstanceToStatic: Fail # Issue 32981
 cc/IsolateReload_PendingUnqualifiedCall_StaticToInstance: Fail # Issue 32981
-cc/IsolateReload_RunNewFieldInitializersWithGenerics: Fail # Issue 32299
 cc/Profiler_StringInterpolation: Fail # Issue 37208
 dart/data_uri_import_test/none: SkipByDesign
-dart/entrypoints/jit: Skip # Tests with brittle dependencies on usage counters - Issue 37144
 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.
@@ -32,15 +30,16 @@
 dart/redirection_type_shuffling_test/none: RuntimeError
 dart/snapshot_version_test: RuntimeError
 
-[ $compiler == dartk ]
-dart/entrypoints/aot/*: SkipByDesign
-
 [ $compiler == dartkb ]
 cc/*: Skip # Too many timeouts and crashes for infrastructure to handle.
 
 [ $compiler == dartkp ]
 dart/v8_snapshot_profile_writer_test: Pass, Slow # Can be slow due to re-invoking the precompiler.
 
+[ $compiler != dartkp ]
+dart/base_il_serialization: SkipByDesign # Serialization currently supported only when compiling with --aot.
+dart/entrypoints/aot/*: SkipByDesign # These tests should only run on AOT.
+
 [ $compiler == fasta ]
 dart/data_uri_import_test/badencodeddate: CompileTimeError
 
@@ -74,10 +73,14 @@
 cc/GenKernelKernelMaxRSS: Skip # Issue 34393.
 cc/GenKernelKernelReadAllBytecode: Skip # Issue 34393.
 dart/appjit_bytecode_simple_test: Skip # Issue 34393.
+dart/disassemble_determinism_test: Slow # Times out on slower bots.
 
 [ !$strong ]
 dart/callee_side_type_checks_test: SkipByDesign
 
+[ $arch == ia32 && $mode == debug && $system == windows ]
+dart/transferable_test: Skip # This is performance test and somehow debug win ia32 bot's performance is unpredictable
+
 [ $arch != simarm && $arch != simarm64 && $arch != simdbc64 && $hot_reload && ($compiler == dartk || $compiler == dartkb) ]
 dart/data_uri_import_test/base64: Crash
 dart/data_uri_import_test/nocharset: Crash
@@ -89,6 +92,7 @@
 [ $builder_tag == obfuscated && $compiler == dartkp ]
 dart/optimized_stacktrace_line_and_column_test: SkipByDesign # Looks for filenames in stacktrace output
 dart/optimized_stacktrace_line_test: SkipByDesign # Looks for filenames in stacktrace output
+dart/regress_37382_test: SkipByDesign # Matches the type arguments names
 
 [ $compiler == dartk && $mode == product && $runtime == vm ]
 cc/CorelibIsolateStartup: Timeout, Pass
@@ -100,6 +104,7 @@
 cc/IsolateReload_KernelIncrementalCompileGenerics: SkipByDesign
 cc/Mixin_PrivateSuperResolution: Skip
 cc/Mixin_PrivateSuperResolutionCrossLibraryShouldFail: Skip
+dart/entrypoints/jit/*: SkipByDesign # These tests should only run on JIT.
 
 [ $compiler != dartk && $compiler != dartkb && $compiler != none ]
 dart/appjit*: SkipByDesign # Test needs to run from source
@@ -240,6 +245,9 @@
 [ $arch == simdbc || $arch == simdbc64 || $compiler == dartkb ]
 dart/generic_field_invocation_test: SkipByDesign # DBC and KBC interpreters do not support --no_lazy_dispatchers
 
+[ $builder_tag == bytecode_interpreter || $builder_tag == bytecode_mixed || $builder_tag == optimization_counter_threshold || $hot_reload || $hot_reload_rollback || $arch != arm && $arch != simarm && $arch != x64 || $compiler != dartk && $compiler != dartkb && $compiler != dartkp ]
+dart/entrypoints/*: SkipByDesign # These tests are for compiler optimizations and very sensible to when functions are optimized, so they are disabled on hotreload, optcounter and bytecode interpreter bots.
+
 [ $compiler == dart2analyzer || $compiler == dart2js ]
 dart/data_uri*test: Skip # Data uri's not supported by dart2js or the analyzer.
 
@@ -248,12 +256,6 @@
 dart/redirection_type_shuffling_test/00: RuntimeError, Pass
 dart/redirection_type_shuffling_test/none: RuntimeError
 
-[ $compiler != dartk || $hot_reload || $hot_reload_rollback || $arch != arm && $arch != simarm && $arch != x64 ]
-dart/entrypoints/jit/*: SkipByDesign # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
-
-[ $compiler != dartkp || $hot_reload || $hot_reload_rollback || $arch != arm && $arch != simarm && $arch != x64 ]
-dart/entrypoints/aot/*: SkipByDesign # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
-
 [ $mode == debug || $runtime != dart_precompiled || $system == android ]
 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).
 
@@ -278,6 +280,3 @@
 dart/spawn_shutdown_test: Skip # We can shutdown an isolate before it reloads.
 dart/stack_overflow_shared_test: SkipSlow # Too slow with --shared-slow-path-triggers-gc flag and not relevant outside precompiled.
 dart/type_feedback_test: Pass, Slow
-
-[ $hot_reload || $hot_reload_rollback || $arch != arm && $arch != simarm && $arch != x64 || $compiler != dartk && $compiler != dartkp ]
-dart/entrypoints/*: SkipByDesign # Only supported in the Dart 2 JIT and AOT, and test optimizations - hence disabled on hotreload bots.
diff --git a/runtime/third_party/binary_size/src/binary_size_utils.py b/runtime/third_party/binary_size/src/binary_size_utils.py
index 67335c2..8ef283e 100644
--- a/runtime/third_party/binary_size/src/binary_size_utils.py
+++ b/runtime/third_party/binary_size/src/binary_size_utils.py
@@ -1,7 +1,6 @@
 # Copyright 2014 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.
-
 """Common utilities for tools that deal with binary size information.
 """
 
@@ -10,7 +9,7 @@
 
 
 def ParseNm(nm_lines):
-  """Parse nm output, returning data for all relevant (to binary size)
+    """Parse nm output, returning data for all relevant (to binary size)
   symbols and ignoring the rest.
 
   Args:
@@ -22,50 +21,49 @@
       Path may be None if nm couldn't figure out the source file.
   """
 
-  # Match lines with size, symbol, optional location, optional discriminator
-  sym_re = re.compile(r'^([0-9a-f]{8,}) ' # address (8+ hex digits)
-                      '([0-9a-f]{8,}) ' # size (8+ hex digits)
-                      '(.) ' # symbol type, one character
-                      '([^\t]+)' # symbol name, separated from next by tab
-                      '(?:\t(.*):[\d\?]+)?.*$') # location
-  # Match lines with addr but no size.
-  addr_re = re.compile(r'^[0-9a-f]{8,} (.) ([^\t]+)(?:\t.*)?$')
-  # Match lines that don't have an address at all -- typically external symbols.
-  noaddr_re = re.compile(r'^ {8,} (.) (.*)$')
-  # Match lines with no symbol name, only addr and type
-  addr_only_re = re.compile(r'^[0-9a-f]{8,} (.)$')
+    # Match lines with size, symbol, optional location, optional discriminator
+    sym_re = re.compile(r'^([0-9a-f]{8,}) '  # address (8+ hex digits)
+                        '([0-9a-f]{8,}) '  # size (8+ hex digits)
+                        '(.) '  # symbol type, one character
+                        '([^\t]+)'  # symbol name, separated from next by tab
+                        '(?:\t(.*):[\d\?]+)?.*$')  # location
+    # Match lines with addr but no size.
+    addr_re = re.compile(r'^[0-9a-f]{8,} (.) ([^\t]+)(?:\t.*)?$')
+    # Match lines that don't have an address at all -- typically external symbols.
+    noaddr_re = re.compile(r'^ {8,} (.) (.*)$')
+    # Match lines with no symbol name, only addr and type
+    addr_only_re = re.compile(r'^[0-9a-f]{8,} (.)$')
 
-  seen_lines = set()
-  for line in nm_lines:
-    line = line.rstrip()
-    if line in seen_lines:
-      # nm outputs identical lines at times. We don't want to treat
-      # those as distinct symbols because that would make no sense.
-      continue
-    seen_lines.add(line)
-    match = sym_re.match(line)
-    if match:
-      address, size, sym_type, sym = match.groups()[0:4]
-      size = int(size, 16)
-      if sym_type in ('B', 'b'):
-        continue  # skip all BSS for now.
-      path = match.group(5)
-      yield sym, sym_type, size, path, address
-      continue
-    match = addr_re.match(line)
-    if match:
-      # sym_type, sym = match.groups()[0:2]
-      continue  # No size == we don't care.
-    match = noaddr_re.match(line)
-    if match:
-      sym_type, sym = match.groups()
-      if sym_type in ('U', 'w'):
-        continue  # external or weak symbol
-    match = addr_only_re.match(line)
-    if match:
-      continue  # Nothing to do.
+    seen_lines = set()
+    for line in nm_lines:
+        line = line.rstrip()
+        if line in seen_lines:
+            # nm outputs identical lines at times. We don't want to treat
+            # those as distinct symbols because that would make no sense.
+            continue
+        seen_lines.add(line)
+        match = sym_re.match(line)
+        if match:
+            address, size, sym_type, sym = match.groups()[0:4]
+            size = int(size, 16)
+            if sym_type in ('B', 'b'):
+                continue  # skip all BSS for now.
+            path = match.group(5)
+            yield sym, sym_type, size, path, address
+            continue
+        match = addr_re.match(line)
+        if match:
+            # sym_type, sym = match.groups()[0:2]
+            continue  # No size == we don't care.
+        match = noaddr_re.match(line)
+        if match:
+            sym_type, sym = match.groups()
+            if sym_type in ('U', 'w'):
+                continue  # external or weak symbol
+        match = addr_only_re.match(line)
+        if match:
+            continue  # Nothing to do.
 
-
-    # If we reach this part of the loop, there was something in the
-    # line that we didn't expect or recognize.
-    logging.warning('nm output parser failed to parse: %s', repr(line))
+        # If we reach this part of the loop, there was something in the
+        # line that we didn't expect or recognize.
+        logging.warning('nm output parser failed to parse: %s', repr(line))
diff --git a/runtime/third_party/binary_size/src/elf_symbolizer.py b/runtime/third_party/binary_size/src/elf_symbolizer.py
index 374063a..86a0a07 100644
--- a/runtime/third_party/binary_size/src/elf_symbolizer.py
+++ b/runtime/third_party/binary_size/src/elf_symbolizer.py
@@ -15,7 +15,6 @@
 import threading
 import time
 
-
 # addr2line builds a possibly infinite memory cache that can exhaust
 # the computer's memory if allowed to grow for too long. This constant
 # controls how many lookups we do before restarting the process. 4000
@@ -24,7 +23,7 @@
 
 
 class ELFSymbolizer(object):
-  """An uber-fast (multiprocessing, pipelined and asynchronous) ELF symbolizer.
+    """An uber-fast (multiprocessing, pipelined and asynchronous) ELF symbolizer.
 
   This class is a frontend for addr2line (part of GNU binutils), designed to
   symbolize batches of large numbers of symbols for a given ELF file. It
@@ -75,10 +74,17 @@
   other modules in this project), to allow easy reuse in external projects.
   """
 
-  def __init__(self, elf_file_path, addr2line_path, callback, inlines=False,
-      max_concurrent_jobs=None, addr2line_timeout=30, max_queue_size=50,
-      source_root_path=None, strip_base_path=None):
-    """Args:
+    def __init__(self,
+                 elf_file_path,
+                 addr2line_path,
+                 callback,
+                 inlines=False,
+                 max_concurrent_jobs=None,
+                 addr2line_timeout=30,
+                 max_queue_size=50,
+                 source_root_path=None,
+                 strip_base_path=None):
+        """Args:
       elf_file_path: path of the elf file to be symbolized.
       addr2line_path: path of the toolchain's addr2line binary.
       callback: a callback which will be invoked for each resolved symbol with
@@ -106,32 +112,32 @@
       strip_base_path: Rebases the symbols source paths onto |source_root_path|
           (i.e replace |strip_base_path| with |source_root_path).
     """
-    assert(os.path.isfile(addr2line_path)), 'Cannot find ' + addr2line_path
-    self.elf_file_path = elf_file_path
-    self.addr2line_path = addr2line_path
-    self.callback = callback
-    self.inlines = inlines
-    self.max_concurrent_jobs = (max_concurrent_jobs or
-                                min(multiprocessing.cpu_count(), 4))
-    self.max_queue_size = max_queue_size
-    self.addr2line_timeout = addr2line_timeout
-    self.requests_counter = 0  # For generating monotonic request IDs.
-    self._a2l_instances = []  # Up to |max_concurrent_jobs| _Addr2Line inst.
+        assert (os.path.isfile(addr2line_path)), 'Cannot find ' + addr2line_path
+        self.elf_file_path = elf_file_path
+        self.addr2line_path = addr2line_path
+        self.callback = callback
+        self.inlines = inlines
+        self.max_concurrent_jobs = (max_concurrent_jobs or
+                                    min(multiprocessing.cpu_count(), 4))
+        self.max_queue_size = max_queue_size
+        self.addr2line_timeout = addr2line_timeout
+        self.requests_counter = 0  # For generating monotonic request IDs.
+        self._a2l_instances = []  # Up to |max_concurrent_jobs| _Addr2Line inst.
 
-    # If necessary, create disambiguation lookup table
-    self.disambiguate = source_root_path is not None
-    self.disambiguation_table = {}
-    self.strip_base_path = strip_base_path
-    if(self.disambiguate):
-      self.source_root_path = os.path.abspath(source_root_path)
-      self._CreateDisambiguationTable()
+        # If necessary, create disambiguation lookup table
+        self.disambiguate = source_root_path is not None
+        self.disambiguation_table = {}
+        self.strip_base_path = strip_base_path
+        if (self.disambiguate):
+            self.source_root_path = os.path.abspath(source_root_path)
+            self._CreateDisambiguationTable()
 
-    # Create one addr2line instance. More instances will be created on demand
-    # (up to |max_concurrent_jobs|) depending on the rate of the requests.
-    self._CreateNewA2LInstance()
+        # Create one addr2line instance. More instances will be created on demand
+        # (up to |max_concurrent_jobs|) depending on the rate of the requests.
+        self._CreateNewA2LInstance()
 
-  def SymbolizeAsync(self, addr, callback_arg=None):
-    """Requests symbolization of a given address.
+    def SymbolizeAsync(self, addr, callback_arg=None):
+        """Requests symbolization of a given address.
 
     This method is not guaranteed to return immediately. It generally does, but
     in some scenarios (e.g. all addr2line instances have full queues) it can
@@ -140,66 +146,66 @@
     Args:
       addr: address to symbolize.
       callback_arg: optional argument which will be passed to the |callback|."""
-    assert(isinstance(addr, int))
+        assert (isinstance(addr, int))
 
-    # Process all the symbols that have been resolved in the meanwhile.
-    # Essentially, this drains all the addr2line(s) out queues.
-    for a2l_to_purge in self._a2l_instances:
-      a2l_to_purge.ProcessAllResolvedSymbolsInQueue()
-      a2l_to_purge.RecycleIfNecessary()
+        # Process all the symbols that have been resolved in the meanwhile.
+        # Essentially, this drains all the addr2line(s) out queues.
+        for a2l_to_purge in self._a2l_instances:
+            a2l_to_purge.ProcessAllResolvedSymbolsInQueue()
+            a2l_to_purge.RecycleIfNecessary()
 
-    # Find the best instance according to this logic:
-    # 1. Find an existing instance with the shortest queue.
-    # 2. If all of instances' queues are full, but there is room in the pool,
-    #    (i.e. < |max_concurrent_jobs|) create a new instance.
-    # 3. If there were already |max_concurrent_jobs| instances and all of them
-    #    had full queues, make back-pressure.
+        # Find the best instance according to this logic:
+        # 1. Find an existing instance with the shortest queue.
+        # 2. If all of instances' queues are full, but there is room in the pool,
+        #    (i.e. < |max_concurrent_jobs|) create a new instance.
+        # 3. If there were already |max_concurrent_jobs| instances and all of them
+        #    had full queues, make back-pressure.
 
-    # 1.
-    def _SortByQueueSizeAndReqID(a2l):
-      return (a2l.queue_size, a2l.first_request_id)
-    a2l = min(self._a2l_instances, key=_SortByQueueSizeAndReqID)
+        # 1.
+        def _SortByQueueSizeAndReqID(a2l):
+            return (a2l.queue_size, a2l.first_request_id)
 
-    # 2.
-    if (a2l.queue_size >= self.max_queue_size and
-        len(self._a2l_instances) < self.max_concurrent_jobs):
-      a2l = self._CreateNewA2LInstance()
+        a2l = min(self._a2l_instances, key=_SortByQueueSizeAndReqID)
 
-    # 3.
-    if a2l.queue_size >= self.max_queue_size:
-      a2l.WaitForNextSymbolInQueue()
+        # 2.
+        if (a2l.queue_size >= self.max_queue_size and
+                len(self._a2l_instances) < self.max_concurrent_jobs):
+            a2l = self._CreateNewA2LInstance()
 
-    a2l.EnqueueRequest(addr, callback_arg)
+        # 3.
+        if a2l.queue_size >= self.max_queue_size:
+            a2l.WaitForNextSymbolInQueue()
 
-  def Join(self):
-    """Waits for all the outstanding requests to complete and terminates."""
-    for a2l in self._a2l_instances:
-      a2l.WaitForIdle()
-      a2l.Terminate()
+        a2l.EnqueueRequest(addr, callback_arg)
 
-  def _CreateNewA2LInstance(self):
-    assert(len(self._a2l_instances) < self.max_concurrent_jobs)
-    a2l = ELFSymbolizer.Addr2Line(self)
-    self._a2l_instances.append(a2l)
-    return a2l
+    def Join(self):
+        """Waits for all the outstanding requests to complete and terminates."""
+        for a2l in self._a2l_instances:
+            a2l.WaitForIdle()
+            a2l.Terminate()
 
-  def _CreateDisambiguationTable(self):
-    """ Non-unique file names will result in None entries"""
-    start_time = time.time()
-    logging.info('Collecting information about available source files...')
-    self.disambiguation_table = {}
+    def _CreateNewA2LInstance(self):
+        assert (len(self._a2l_instances) < self.max_concurrent_jobs)
+        a2l = ELFSymbolizer.Addr2Line(self)
+        self._a2l_instances.append(a2l)
+        return a2l
 
-    for root, _, filenames in os.walk(self.source_root_path):
-      for f in filenames:
-        self.disambiguation_table[f] = os.path.join(root, f) if (f not in
-                                       self.disambiguation_table) else None
-    logging.info('Finished collecting information about '
-                 'possible files (took %.1f s).',
-                 (time.time() - start_time))
+    def _CreateDisambiguationTable(self):
+        """ Non-unique file names will result in None entries"""
+        start_time = time.time()
+        logging.info('Collecting information about available source files...')
+        self.disambiguation_table = {}
 
+        for root, _, filenames in os.walk(self.source_root_path):
+            for f in filenames:
+                self.disambiguation_table[f] = os.path.join(
+                    root, f) if (f not in self.disambiguation_table) else None
+        logging.info(
+            'Finished collecting information about '
+            'possible files (took %.1f s).', (time.time() - start_time))
 
-  class Addr2Line(object):
-    """A python wrapper around an addr2line instance.
+    class Addr2Line(object):
+        """A python wrapper around an addr2line instance.
 
     The communication with the addr2line process looks as follows:
       [STDIN]         [STDOUT]  (from addr2line's viewpoint)
@@ -214,254 +220,272 @@
                     < /path/to/source/file.c:line_number
     """
 
-    SYM_ADDR_RE = re.compile(r'([^:]+):(\?|\d+).*')
+        SYM_ADDR_RE = re.compile(r'([^:]+):(\?|\d+).*')
 
-    def __init__(self, symbolizer):
-      self._symbolizer = symbolizer
-      self._lib_file_name = posixpath.basename(symbolizer.elf_file_path)
+        def __init__(self, symbolizer):
+            self._symbolizer = symbolizer
+            self._lib_file_name = posixpath.basename(symbolizer.elf_file_path)
 
-      # The request queue (i.e. addresses pushed to addr2line's stdin and not
-      # yet retrieved on stdout)
-      self._request_queue = collections.deque()
+            # The request queue (i.e. addresses pushed to addr2line's stdin and not
+            # yet retrieved on stdout)
+            self._request_queue = collections.deque()
 
-      # This is essentially len(self._request_queue). It has been optimized to a
-      # separate field because turned out to be a perf hot-spot.
-      self.queue_size = 0
+            # This is essentially len(self._request_queue). It has been optimized to a
+            # separate field because turned out to be a perf hot-spot.
+            self.queue_size = 0
 
-      # Keep track of the number of symbols a process has processed to
-      # avoid a single process growing too big and using all the memory.
-      self._processed_symbols_count = 0
+            # Keep track of the number of symbols a process has processed to
+            # avoid a single process growing too big and using all the memory.
+            self._processed_symbols_count = 0
 
-      # Objects required to handle the addr2line subprocess.
-      self._proc = None  # Subprocess.Popen(...) instance.
-      self._thread = None  # Threading.thread instance.
-      self._out_queue = None  # Queue.Queue instance (for buffering a2l stdout).
-      self._RestartAddr2LineProcess()
-
-    def EnqueueRequest(self, addr, callback_arg):
-      """Pushes an address to addr2line's stdin (and keeps track of it)."""
-      self._symbolizer.requests_counter += 1  # For global "age" of requests.
-      req_idx = self._symbolizer.requests_counter
-      self._request_queue.append((addr, callback_arg, req_idx))
-      self.queue_size += 1
-      self._WriteToA2lStdin(addr)
-
-    def WaitForIdle(self):
-      """Waits until all the pending requests have been symbolized."""
-      while self.queue_size > 0:
-        self.WaitForNextSymbolInQueue()
-
-    def WaitForNextSymbolInQueue(self):
-      """Waits for the next pending request to be symbolized."""
-      if not self.queue_size:
-        return
-
-      # This outer loop guards against a2l hanging (detecting stdout timeout).
-      while True:
-        start_time = datetime.datetime.now()
-        timeout = datetime.timedelta(seconds=self._symbolizer.addr2line_timeout)
-
-        # The inner loop guards against a2l crashing (checking if it exited).
-        while (datetime.datetime.now() - start_time < timeout):
-          # poll() returns !None if the process exited. a2l should never exit.
-          if self._proc.poll():
-            logging.warning('addr2line crashed, respawning (lib: %s).' %
-                            self._lib_file_name)
+            # Objects required to handle the addr2line subprocess.
+            self._proc = None  # Subprocess.Popen(...) instance.
+            self._thread = None  # Threading.thread instance.
+            self._out_queue = None  # Queue.Queue instance (for buffering a2l stdout).
             self._RestartAddr2LineProcess()
-            # TODO(primiano): the best thing to do in this case would be
-            # shrinking the pool size as, very likely, addr2line is crashed
-            # due to low memory (and the respawned one will die again soon).
 
-          try:
-            lines = self._out_queue.get(block=True, timeout=0.25)
-          except Queue.Empty:
-            # On timeout (1/4 s.) repeat the inner loop and check if either the
-            # addr2line process did crash or we waited its output for too long.
-            continue
+        def EnqueueRequest(self, addr, callback_arg):
+            """Pushes an address to addr2line's stdin (and keeps track of it)."""
+            self._symbolizer.requests_counter += 1  # For global "age" of requests.
+            req_idx = self._symbolizer.requests_counter
+            self._request_queue.append((addr, callback_arg, req_idx))
+            self.queue_size += 1
+            self._WriteToA2lStdin(addr)
 
-          # In nominal conditions, we get straight to this point.
-          self._ProcessSymbolOutput(lines)
-          return
+        def WaitForIdle(self):
+            """Waits until all the pending requests have been symbolized."""
+            while self.queue_size > 0:
+                self.WaitForNextSymbolInQueue()
 
-        # If this point is reached, we waited more than |addr2line_timeout|.
-        logging.warning('Hung addr2line process, respawning (lib: %s).' %
-                        self._lib_file_name)
-        self._RestartAddr2LineProcess()
+        def WaitForNextSymbolInQueue(self):
+            """Waits for the next pending request to be symbolized."""
+            if not self.queue_size:
+                return
 
-    def ProcessAllResolvedSymbolsInQueue(self):
-      """Consumes all the addr2line output lines produced (without blocking)."""
-      if not self.queue_size:
-        return
-      while True:
-        try:
-          lines = self._out_queue.get_nowait()
-        except Queue.Empty:
-          break
-        self._ProcessSymbolOutput(lines)
+            # This outer loop guards against a2l hanging (detecting stdout timeout).
+            while True:
+                start_time = datetime.datetime.now()
+                timeout = datetime.timedelta(
+                    seconds=self._symbolizer.addr2line_timeout)
 
-    def RecycleIfNecessary(self):
-      """Restarts the process if it has been used for too long.
+                # The inner loop guards against a2l crashing (checking if it exited).
+                while (datetime.datetime.now() - start_time < timeout):
+                    # poll() returns !None if the process exited. a2l should never exit.
+                    if self._proc.poll():
+                        logging.warning(
+                            'addr2line crashed, respawning (lib: %s).' %
+                            self._lib_file_name)
+                        self._RestartAddr2LineProcess()
+                        # TODO(primiano): the best thing to do in this case would be
+                        # shrinking the pool size as, very likely, addr2line is crashed
+                        # due to low memory (and the respawned one will die again soon).
+
+                    try:
+                        lines = self._out_queue.get(block=True, timeout=0.25)
+                    except Queue.Empty:
+                        # On timeout (1/4 s.) repeat the inner loop and check if either the
+                        # addr2line process did crash or we waited its output for too long.
+                        continue
+
+                    # In nominal conditions, we get straight to this point.
+                    self._ProcessSymbolOutput(lines)
+                    return
+
+                # If this point is reached, we waited more than |addr2line_timeout|.
+                logging.warning('Hung addr2line process, respawning (lib: %s).'
+                                % self._lib_file_name)
+                self._RestartAddr2LineProcess()
+
+        def ProcessAllResolvedSymbolsInQueue(self):
+            """Consumes all the addr2line output lines produced (without blocking)."""
+            if not self.queue_size:
+                return
+            while True:
+                try:
+                    lines = self._out_queue.get_nowait()
+                except Queue.Empty:
+                    break
+                self._ProcessSymbolOutput(lines)
+
+        def RecycleIfNecessary(self):
+            """Restarts the process if it has been used for too long.
 
       A long running addr2line process will consume excessive amounts
       of memory without any gain in performance."""
-      if self._processed_symbols_count >= ADDR2LINE_RECYCLE_LIMIT:
-        self._RestartAddr2LineProcess()
+            if self._processed_symbols_count >= ADDR2LINE_RECYCLE_LIMIT:
+                self._RestartAddr2LineProcess()
 
-
-    def Terminate(self):
-      """Kills the underlying addr2line process.
+        def Terminate(self):
+            """Kills the underlying addr2line process.
 
       The poller |_thread| will terminate as well due to the broken pipe."""
-      try:
-        self._proc.kill()
-        self._proc.communicate()  # Essentially wait() without risking deadlock.
-      except Exception:  # An exception while terminating? How interesting.
-        pass
-      self._proc = None
+            try:
+                self._proc.kill()
+                self._proc.communicate(
+                )  # Essentially wait() without risking deadlock.
+            except Exception:  # An exception while terminating? How interesting.
+                pass
+            self._proc = None
 
-    def _WriteToA2lStdin(self, addr):
-      self._proc.stdin.write('%s\n' % hex(addr))
-      if self._symbolizer.inlines:
-        # In the case of inlines we output an extra blank line, which causes
-        # addr2line to emit a (??,??:0) tuple that we use as a boundary marker.
-        self._proc.stdin.write('\n')
-      self._proc.stdin.flush()
+        def _WriteToA2lStdin(self, addr):
+            self._proc.stdin.write('%s\n' % hex(addr))
+            if self._symbolizer.inlines:
+                # In the case of inlines we output an extra blank line, which causes
+                # addr2line to emit a (??,??:0) tuple that we use as a boundary marker.
+                self._proc.stdin.write('\n')
+            self._proc.stdin.flush()
 
-    def _ProcessSymbolOutput(self, lines):
-      """Parses an addr2line symbol output and triggers the client callback."""
-      (_, callback_arg, _) = self._request_queue.popleft()
-      self.queue_size -= 1
+        def _ProcessSymbolOutput(self, lines):
+            """Parses an addr2line symbol output and triggers the client callback."""
+            (_, callback_arg, _) = self._request_queue.popleft()
+            self.queue_size -= 1
 
-      innermost_sym_info = None
-      sym_info = None
-      for (line1, line2) in lines:
-        prev_sym_info = sym_info
-        name = line1 if not line1.startswith('?') else None
-        source_path = None
-        source_line = None
-        m = ELFSymbolizer.Addr2Line.SYM_ADDR_RE.match(line2)
-        if m:
-          if not m.group(1).startswith('?'):
-            source_path = m.group(1)
-            if not m.group(2).startswith('?'):
-              source_line = int(m.group(2))
-        else:
-          logging.warning('Got invalid symbol path from addr2line: %s' % line2)
+            innermost_sym_info = None
+            sym_info = None
+            for (line1, line2) in lines:
+                prev_sym_info = sym_info
+                name = line1 if not line1.startswith('?') else None
+                source_path = None
+                source_line = None
+                m = ELFSymbolizer.Addr2Line.SYM_ADDR_RE.match(line2)
+                if m:
+                    if not m.group(1).startswith('?'):
+                        source_path = m.group(1)
+                        if not m.group(2).startswith('?'):
+                            source_line = int(m.group(2))
+                else:
+                    logging.warning(
+                        'Got invalid symbol path from addr2line: %s' % line2)
 
-        # In case disambiguation is on, and needed
-        was_ambiguous = False
-        disambiguated = False
-        if self._symbolizer.disambiguate:
-          if source_path and not posixpath.isabs(source_path):
-            path = self._symbolizer.disambiguation_table.get(source_path)
-            was_ambiguous = True
-            disambiguated = path is not None
-            source_path = path if disambiguated else source_path
+                # In case disambiguation is on, and needed
+                was_ambiguous = False
+                disambiguated = False
+                if self._symbolizer.disambiguate:
+                    if source_path and not posixpath.isabs(source_path):
+                        path = self._symbolizer.disambiguation_table.get(
+                            source_path)
+                        was_ambiguous = True
+                        disambiguated = path is not None
+                        source_path = path if disambiguated else source_path
 
-          # Use absolute paths (so that paths are consistent, as disambiguation
-          # uses absolute paths)
-          if source_path and not was_ambiguous:
-            source_path = os.path.abspath(source_path)
+                    # Use absolute paths (so that paths are consistent, as disambiguation
+                    # uses absolute paths)
+                    if source_path and not was_ambiguous:
+                        source_path = os.path.abspath(source_path)
 
-        if source_path and self._symbolizer.strip_base_path:
-          # Strip the base path
-          source_path = re.sub('^' + self._symbolizer.strip_base_path,
-              self._symbolizer.source_root_path or '', source_path)
+                if source_path and self._symbolizer.strip_base_path:
+                    # Strip the base path
+                    source_path = re.sub(
+                        '^' + self._symbolizer.strip_base_path,
+                        self._symbolizer.source_root_path or '', source_path)
 
-        sym_info = ELFSymbolInfo(name, source_path, source_line, was_ambiguous,
-                                 disambiguated)
-        if prev_sym_info:
-          prev_sym_info.inlined_by = sym_info
-        if not innermost_sym_info:
-          innermost_sym_info = sym_info
+                sym_info = ELFSymbolInfo(name, source_path, source_line,
+                                         was_ambiguous, disambiguated)
+                if prev_sym_info:
+                    prev_sym_info.inlined_by = sym_info
+                if not innermost_sym_info:
+                    innermost_sym_info = sym_info
 
-      self._processed_symbols_count += 1
-      self._symbolizer.callback(innermost_sym_info, callback_arg)
+            self._processed_symbols_count += 1
+            self._symbolizer.callback(innermost_sym_info, callback_arg)
 
-    def _RestartAddr2LineProcess(self):
-      if self._proc:
-        self.Terminate()
+        def _RestartAddr2LineProcess(self):
+            if self._proc:
+                self.Terminate()
 
-      # The only reason of existence of this Queue (and the corresponding
-      # Thread below) is the lack of a subprocess.stdout.poll_avail_lines().
-      # Essentially this is a pipe able to extract a couple of lines atomically.
-      self._out_queue = Queue.Queue()
+            # The only reason of existence of this Queue (and the corresponding
+            # Thread below) is the lack of a subprocess.stdout.poll_avail_lines().
+            # Essentially this is a pipe able to extract a couple of lines atomically.
+            self._out_queue = Queue.Queue()
 
-      # Start the underlying addr2line process in line buffered mode.
+            # Start the underlying addr2line process in line buffered mode.
 
-      cmd = [self._symbolizer.addr2line_path, '--functions', '--demangle',
-          '--exe=' + self._symbolizer.elf_file_path]
-      if self._symbolizer.inlines:
-        cmd += ['--inlines']
-      self._proc = subprocess.Popen(cmd, bufsize=1, stdout=subprocess.PIPE,
-          stdin=subprocess.PIPE, stderr=sys.stderr, close_fds=True)
+            cmd = [
+                self._symbolizer.addr2line_path, '--functions', '--demangle',
+                '--exe=' + self._symbolizer.elf_file_path
+            ]
+            if self._symbolizer.inlines:
+                cmd += ['--inlines']
+            self._proc = subprocess.Popen(
+                cmd,
+                bufsize=1,
+                stdout=subprocess.PIPE,
+                stdin=subprocess.PIPE,
+                stderr=sys.stderr,
+                close_fds=True)
 
-      # Start the poller thread, which simply moves atomically the lines read
-      # from the addr2line's stdout to the |_out_queue|.
-      self._thread = threading.Thread(
-          target=ELFSymbolizer.Addr2Line.StdoutReaderThread,
-          args=(self._proc.stdout, self._out_queue, self._symbolizer.inlines))
-      self._thread.daemon = True  # Don't prevent early process exit.
-      self._thread.start()
+            # Start the poller thread, which simply moves atomically the lines read
+            # from the addr2line's stdout to the |_out_queue|.
+            self._thread = threading.Thread(
+                target=ELFSymbolizer.Addr2Line.StdoutReaderThread,
+                args=(self._proc.stdout, self._out_queue,
+                      self._symbolizer.inlines))
+            self._thread.daemon = True  # Don't prevent early process exit.
+            self._thread.start()
 
-      self._processed_symbols_count = 0
+            self._processed_symbols_count = 0
 
-      # Replay the pending requests on the new process (only for the case
-      # of a hung addr2line timing out during the game).
-      for (addr, _, _) in self._request_queue:
-        self._WriteToA2lStdin(addr)
+            # Replay the pending requests on the new process (only for the case
+            # of a hung addr2line timing out during the game).
+            for (addr, _, _) in self._request_queue:
+                self._WriteToA2lStdin(addr)
 
-    @staticmethod
-    def StdoutReaderThread(process_pipe, queue, inlines):
-      """The poller thread fn, which moves the addr2line stdout to the |queue|.
+        @staticmethod
+        def StdoutReaderThread(process_pipe, queue, inlines):
+            """The poller thread fn, which moves the addr2line stdout to the |queue|.
 
       This is the only piece of code not running on the main thread. It merely
       writes to a Queue, which is thread-safe. In the case of inlines, it
       detects the ??,??:0 marker and sends the lines atomically, such that the
       main thread always receives all the lines corresponding to one symbol in
       one shot."""
-      try:
-        lines_for_one_symbol = []
-        while True:
-          line1 = process_pipe.readline().rstrip('\r\n')
-          line2 = process_pipe.readline().rstrip('\r\n')
-          if not line1 or not line2:
-            break
-          inline_has_more_lines = inlines and (len(lines_for_one_symbol) == 0 or
-                                  (line1 != '??' and line2 != '??:0'))
-          if not inlines or inline_has_more_lines:
-            lines_for_one_symbol += [(line1, line2)]
-          if inline_has_more_lines:
-            continue
-          queue.put(lines_for_one_symbol)
-          lines_for_one_symbol = []
-        process_pipe.close()
+            try:
+                lines_for_one_symbol = []
+                while True:
+                    line1 = process_pipe.readline().rstrip('\r\n')
+                    line2 = process_pipe.readline().rstrip('\r\n')
+                    if not line1 or not line2:
+                        break
+                    inline_has_more_lines = inlines and (
+                        len(lines_for_one_symbol) == 0 or
+                        (line1 != '??' and line2 != '??:0'))
+                    if not inlines or inline_has_more_lines:
+                        lines_for_one_symbol += [(line1, line2)]
+                    if inline_has_more_lines:
+                        continue
+                    queue.put(lines_for_one_symbol)
+                    lines_for_one_symbol = []
+                process_pipe.close()
 
-      # Every addr2line processes will die at some point, please die silently.
-      except (IOError, OSError):
-        pass
+            # Every addr2line processes will die at some point, please die silently.
+            except (IOError, OSError):
+                pass
 
-    @property
-    def first_request_id(self):
-      """Returns the request_id of the oldest pending request in the queue."""
-      return self._request_queue[0][2] if self._request_queue else 0
+        @property
+        def first_request_id(self):
+            """Returns the request_id of the oldest pending request in the queue."""
+            return self._request_queue[0][2] if self._request_queue else 0
 
 
 class ELFSymbolInfo(object):
-  """The result of the symbolization passed as first arg. of each callback."""
+    """The result of the symbolization passed as first arg. of each callback."""
 
-  def __init__(self, name, source_path, source_line, was_ambiguous=False,
-               disambiguated=False):
-    """All the fields here can be None (if addr2line replies with '??')."""
-    self.name = name
-    self.source_path = source_path
-    self.source_line = source_line
-    # In the case of |inlines|=True, the |inlined_by| points to the outer
-    # function inlining the current one (and so on, to form a chain).
-    self.inlined_by = None
-    self.disambiguated = disambiguated
-    self.was_ambiguous = was_ambiguous
+    def __init__(self,
+                 name,
+                 source_path,
+                 source_line,
+                 was_ambiguous=False,
+                 disambiguated=False):
+        """All the fields here can be None (if addr2line replies with '??')."""
+        self.name = name
+        self.source_path = source_path
+        self.source_line = source_line
+        # In the case of |inlines|=True, the |inlined_by| points to the outer
+        # function inlining the current one (and so on, to form a chain).
+        self.inlined_by = None
+        self.disambiguated = disambiguated
+        self.was_ambiguous = was_ambiguous
 
-  def __str__(self):
-    return '%s [%s:%d]' % (
-        self.name or '??', self.source_path or '??', self.source_line or 0)
+    def __str__(self):
+        return '%s [%s:%d]' % (self.name or '??', self.source_path or '??',
+                               self.source_line or 0)
diff --git a/runtime/third_party/binary_size/src/explain_binary_size_delta.py b/runtime/third_party/binary_size/src/explain_binary_size_delta.py
index 45c1236..b6a0270 100755
--- a/runtime/third_party/binary_size/src/explain_binary_size_delta.py
+++ b/runtime/third_party/binary_size/src/explain_binary_size_delta.py
@@ -2,7 +2,6 @@
 # Copyright 2014 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.
-
 """Describe the size difference of two binaries.
 
 Generates a description of the size difference of two binaries based
@@ -49,399 +48,424 @@
 
 
 def CalculateSharedAddresses(symbols):
-  """Checks how many symbols share the same memory space. This returns a
+    """Checks how many symbols share the same memory space. This returns a
 Counter result where result[address] will tell you how many times address was
 used by symbols."""
-  count = Counter()
-  for _, _, _, _, address in symbols:
-    count[address] += 1
+    count = Counter()
+    for _, _, _, _, address in symbols:
+        count[address] += 1
 
-  return count
+    return count
 
 
 def CalculateEffectiveSize(share_count, address, symbol_size):
-  """Given a raw symbol_size and an address, this method returns the
+    """Given a raw symbol_size and an address, this method returns the
   size we should blame on this symbol considering it might share the
   machine code/data with other symbols. Using the raw symbol_size for
   each symbol would in those cases over estimate the true cost of that
   block.
 
   """
-  shared_count = share_count[address]
-  if shared_count == 1:
-    return symbol_size
+    shared_count = share_count[address]
+    if shared_count == 1:
+        return symbol_size
 
-  assert shared_count > 1
-  return int(ceil(symbol_size / float(shared_count)))
+    assert shared_count > 1
+    return int(ceil(symbol_size / float(shared_count)))
+
 
 class SymbolDelta(object):
-  """Stores old size, new size and some metadata."""
-  def __init__(self, shared):
-    self.old_size = None
-    self.new_size = None
-    self.shares_space_with_other_symbols = shared
+    """Stores old size, new size and some metadata."""
 
-  def __eq__(self, other):
-    return (self.old_size == other.old_size and
-            self.new_size == other.new_size and
-            self.shares_space_with_other_symbols ==
-            other.shares_space_with_other_symbols)
+    def __init__(self, shared):
+        self.old_size = None
+        self.new_size = None
+        self.shares_space_with_other_symbols = shared
 
-  def __ne__(self, other):
-    return not self.__eq__(other)
+    def __eq__(self, other):
+        return (self.old_size == other.old_size and
+                self.new_size == other.new_size and
+                self.shares_space_with_other_symbols == other.
+                shares_space_with_other_symbols)
 
-  def copy_symbol_delta(self):
-    symbol_delta = SymbolDelta(self.shares_space_with_other_symbols)
-    symbol_delta.old_size = self.old_size
-    symbol_delta.new_size = self.new_size
-    return symbol_delta
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def copy_symbol_delta(self):
+        symbol_delta = SymbolDelta(self.shares_space_with_other_symbols)
+        symbol_delta.old_size = self.old_size
+        symbol_delta.new_size = self.new_size
+        return symbol_delta
+
 
 class DeltaInfo(SymbolDelta):
-  """Summary of a the change for one symbol between two instances."""
-  def __init__(self, file_path, symbol_type, symbol_name, shared):
-    SymbolDelta.__init__(self, shared)
-    self.file_path = file_path
-    self.symbol_type = symbol_type
-    self.symbol_name = symbol_name
+    """Summary of a the change for one symbol between two instances."""
 
-  def __eq__(self, other):
-    return (self.file_path == other.file_path and
-            self.symbol_type == other.symbol_type and
-            self.symbol_name == other.symbol_name and
-            SymbolDelta.__eq__(self, other))
+    def __init__(self, file_path, symbol_type, symbol_name, shared):
+        SymbolDelta.__init__(self, shared)
+        self.file_path = file_path
+        self.symbol_type = symbol_type
+        self.symbol_name = symbol_name
 
-  def __ne__(self, other):
-    return not self.__eq__(other)
+    def __eq__(self, other):
+        return (self.file_path == other.file_path and
+                self.symbol_type == other.symbol_type and
+                self.symbol_name == other.symbol_name and
+                SymbolDelta.__eq__(self, other))
 
-  def ExtractSymbolDelta(self):
-    """Returns a copy of the SymbolDelta for this DeltaInfo."""
-    return SymbolDelta.copy_symbol_delta(self)
+    def __ne__(self, other):
+        return not self.__eq__(other)
+
+    def ExtractSymbolDelta(self):
+        """Returns a copy of the SymbolDelta for this DeltaInfo."""
+        return SymbolDelta.copy_symbol_delta(self)
+
 
 def Compare(symbols1, symbols2):
-  """Executes a comparison of the symbols in symbols1 and symbols2.
+    """Executes a comparison of the symbols in symbols1 and symbols2.
 
   Returns:
       tuple of lists: (added_symbols, removed_symbols, changed_symbols, others)
       where each list contains DeltaInfo objects.
   """
-  added = [] # tuples
-  removed = [] # tuples
-  changed = [] # tuples
-  unchanged = [] # tuples
+    added = []  # tuples
+    removed = []  # tuples
+    changed = []  # tuples
+    unchanged = []  # tuples
 
-  cache1 = {}
-  cache2 = {}
-  # Make a map of (file, symbol_type) : (symbol_name, effective_symbol_size)
-  share_count1 = CalculateSharedAddresses(symbols1)
-  share_count2 = CalculateSharedAddresses(symbols2)
-  for cache, symbols, share_count in ((cache1, symbols1, share_count1),
-                                      (cache2, symbols2, share_count2)):
-    for symbol_name, symbol_type, symbol_size, file_path, address in symbols:
-      if 'vtable for ' in symbol_name:
-        symbol_type = '@' # hack to categorize these separately
-      if file_path:
-        file_path = os.path.normpath(file_path)
-        if sys.platform.startswith('win'):
-          file_path = file_path.replace('\\', '/')
-      else:
-        file_path = '(No Path)'
-      # Take into consideration that multiple symbols might share the same
-      # block of code.
-      effective_symbol_size = CalculateEffectiveSize(share_count, address,
-                                                     symbol_size)
-      key = (file_path, symbol_type)
-      bucket = cache.setdefault(key, {})
-      size_list = bucket.setdefault(symbol_name, [])
-      size_list.append((effective_symbol_size,
-                        effective_symbol_size != symbol_size))
-
-  # Now diff them. We iterate over the elements in cache1. For each symbol
-  # that we find in cache2, we record whether it was deleted, changed, or
-  # unchanged. We then remove it from cache2; all the symbols that remain
-  # in cache2 at the end of the iteration over cache1 are the 'new' symbols.
-  for key, bucket1 in cache1.items():
-    bucket2 = cache2.get(key)
-    file_path, symbol_type = key;
-    if not bucket2:
-      # A file was removed. Everything in bucket1 is dead.
-      for symbol_name, symbol_size_list in bucket1.items():
-        for (symbol_size, shared) in symbol_size_list:
-          delta_info = DeltaInfo(file_path, symbol_type, symbol_name, shared)
-          delta_info.old_size = symbol_size
-          removed.append(delta_info)
-    else:
-      # File still exists, look for changes within.
-      for symbol_name, symbol_size_list in bucket1.items():
-        size_list2 = bucket2.get(symbol_name)
-        if size_list2 is None:
-          # Symbol no longer exists in bucket2.
-          for (symbol_size, shared) in symbol_size_list:
-            delta_info = DeltaInfo(file_path, symbol_type, symbol_name, shared)
-            delta_info.old_size = symbol_size
-            removed.append(delta_info)
-        else:
-          del bucket2[symbol_name] # Symbol is not new, delete from cache2.
-          if len(symbol_size_list) == 1 and len(size_list2) == 1:
-            symbol_size, shared1 = symbol_size_list[0]
-            size2, shared2 = size_list2[0]
-            delta_info = DeltaInfo(file_path, symbol_type, symbol_name,
-                                   shared1 or shared2)
-            delta_info.old_size = symbol_size
-            delta_info.new_size = size2
-            if symbol_size != size2:
-              # Symbol has change size in bucket.
-              changed.append(delta_info)
+    cache1 = {}
+    cache2 = {}
+    # Make a map of (file, symbol_type) : (symbol_name, effective_symbol_size)
+    share_count1 = CalculateSharedAddresses(symbols1)
+    share_count2 = CalculateSharedAddresses(symbols2)
+    for cache, symbols, share_count in ((cache1, symbols1, share_count1),
+                                        (cache2, symbols2, share_count2)):
+        for symbol_name, symbol_type, symbol_size, file_path, address in symbols:
+            if 'vtable for ' in symbol_name:
+                symbol_type = '@'  # hack to categorize these separately
+            if file_path:
+                file_path = os.path.normpath(file_path)
+                if sys.platform.startswith('win'):
+                    file_path = file_path.replace('\\', '/')
             else:
-              # Symbol is unchanged.
-              unchanged.append(delta_info)
-          else:
-            # Complex comparison for when a symbol exists multiple times
-            # in the same file (where file can be "unknown file").
-            symbol_size_counter = collections.Counter(symbol_size_list)
-            delta_counter = collections.Counter(symbol_size_list)
-            delta_counter.subtract(size_list2)
-            for delta_counter_key in sorted(delta_counter.keys()):
-              delta = delta_counter[delta_counter_key]
-              unchanged_count = symbol_size_counter[delta_counter_key]
-              (symbol_size, shared) = delta_counter_key
-              if delta > 0:
-                unchanged_count -= delta
-              for _ in range(unchanged_count):
-                delta_info = DeltaInfo(file_path, symbol_type,
-                                       symbol_name, shared)
-                delta_info.old_size = symbol_size
+                file_path = '(No Path)'
+            # Take into consideration that multiple symbols might share the same
+            # block of code.
+            effective_symbol_size = CalculateEffectiveSize(
+                share_count, address, symbol_size)
+            key = (file_path, symbol_type)
+            bucket = cache.setdefault(key, {})
+            size_list = bucket.setdefault(symbol_name, [])
+            size_list.append((effective_symbol_size,
+                              effective_symbol_size != symbol_size))
+
+    # Now diff them. We iterate over the elements in cache1. For each symbol
+    # that we find in cache2, we record whether it was deleted, changed, or
+    # unchanged. We then remove it from cache2; all the symbols that remain
+    # in cache2 at the end of the iteration over cache1 are the 'new' symbols.
+    for key, bucket1 in cache1.items():
+        bucket2 = cache2.get(key)
+        file_path, symbol_type = key
+        if not bucket2:
+            # A file was removed. Everything in bucket1 is dead.
+            for symbol_name, symbol_size_list in bucket1.items():
+                for (symbol_size, shared) in symbol_size_list:
+                    delta_info = DeltaInfo(file_path, symbol_type, symbol_name,
+                                           shared)
+                    delta_info.old_size = symbol_size
+                    removed.append(delta_info)
+        else:
+            # File still exists, look for changes within.
+            for symbol_name, symbol_size_list in bucket1.items():
+                size_list2 = bucket2.get(symbol_name)
+                if size_list2 is None:
+                    # Symbol no longer exists in bucket2.
+                    for (symbol_size, shared) in symbol_size_list:
+                        delta_info = DeltaInfo(file_path, symbol_type,
+                                               symbol_name, shared)
+                        delta_info.old_size = symbol_size
+                        removed.append(delta_info)
+                else:
+                    del bucket2[
+                        symbol_name]  # Symbol is not new, delete from cache2.
+                    if len(symbol_size_list) == 1 and len(size_list2) == 1:
+                        symbol_size, shared1 = symbol_size_list[0]
+                        size2, shared2 = size_list2[0]
+                        delta_info = DeltaInfo(file_path, symbol_type,
+                                               symbol_name, shared1 or shared2)
+                        delta_info.old_size = symbol_size
+                        delta_info.new_size = size2
+                        if symbol_size != size2:
+                            # Symbol has change size in bucket.
+                            changed.append(delta_info)
+                        else:
+                            # Symbol is unchanged.
+                            unchanged.append(delta_info)
+                    else:
+                        # Complex comparison for when a symbol exists multiple times
+                        # in the same file (where file can be "unknown file").
+                        symbol_size_counter = collections.Counter(
+                            symbol_size_list)
+                        delta_counter = collections.Counter(symbol_size_list)
+                        delta_counter.subtract(size_list2)
+                        for delta_counter_key in sorted(delta_counter.keys()):
+                            delta = delta_counter[delta_counter_key]
+                            unchanged_count = symbol_size_counter[
+                                delta_counter_key]
+                            (symbol_size, shared) = delta_counter_key
+                            if delta > 0:
+                                unchanged_count -= delta
+                            for _ in range(unchanged_count):
+                                delta_info = DeltaInfo(file_path, symbol_type,
+                                                       symbol_name, shared)
+                                delta_info.old_size = symbol_size
+                                delta_info.new_size = symbol_size
+                                unchanged.append(delta_info)
+                            if delta > 0:  # Used to be more of these than there is now.
+                                for _ in range(delta):
+                                    delta_info = DeltaInfo(
+                                        file_path, symbol_type, symbol_name,
+                                        shared)
+                                    delta_info.old_size = symbol_size
+                                    removed.append(delta_info)
+                            elif delta < 0:  # More of this (symbol,size) now.
+                                for _ in range(-delta):
+                                    delta_info = DeltaInfo(
+                                        file_path, symbol_type, symbol_name,
+                                        shared)
+                                    delta_info.new_size = symbol_size
+                                    added.append(delta_info)
+
+                    if len(bucket2) == 0:
+                        del cache1[
+                            key]  # Entire bucket is empty, delete from cache2
+
+    # We have now analyzed all symbols that are in cache1 and removed all of
+    # the encountered symbols from cache2. What's left in cache2 is the new
+    # symbols.
+    for key, bucket2 in cache2.iteritems():
+        file_path, symbol_type = key
+        for symbol_name, symbol_size_list in bucket2.items():
+            for (symbol_size, shared) in symbol_size_list:
+                delta_info = DeltaInfo(file_path, symbol_type, symbol_name,
+                                       shared)
                 delta_info.new_size = symbol_size
-                unchanged.append(delta_info)
-              if delta > 0: # Used to be more of these than there is now.
-                for _ in range(delta):
-                  delta_info = DeltaInfo(file_path, symbol_type,
-                                         symbol_name, shared)
-                  delta_info.old_size = symbol_size
-                  removed.append(delta_info)
-              elif delta < 0: # More of this (symbol,size) now.
-                for _ in range(-delta):
-                  delta_info = DeltaInfo(file_path, symbol_type,
-                                         symbol_name, shared)
-                  delta_info.new_size = symbol_size
-                  added.append(delta_info)
-
-          if len(bucket2) == 0:
-            del cache1[key] # Entire bucket is empty, delete from cache2
-
-  # We have now analyzed all symbols that are in cache1 and removed all of
-  # the encountered symbols from cache2. What's left in cache2 is the new
-  # symbols.
-  for key, bucket2 in cache2.iteritems():
-    file_path, symbol_type = key;
-    for symbol_name, symbol_size_list in bucket2.items():
-      for (symbol_size, shared) in symbol_size_list:
-        delta_info = DeltaInfo(file_path, symbol_type, symbol_name, shared)
-        delta_info.new_size = symbol_size
-        added.append(delta_info)
-  return (added, removed, changed, unchanged)
+                added.append(delta_info)
+    return (added, removed, changed, unchanged)
 
 
 def DeltaStr(number):
-  """Returns the number as a string with a '+' prefix if it's > 0 and
+    """Returns the number as a string with a '+' prefix if it's > 0 and
   a '-' prefix if it's < 0."""
-  result = str(number)
-  if number > 0:
-    result = '+' + result
-  return result
+    result = str(number)
+    if number > 0:
+        result = '+' + result
+    return result
 
 
 def SharedInfoStr(symbol_info):
-  """Returns a string (prefixed by space) explaining that numbers are
+    """Returns a string (prefixed by space) explaining that numbers are
   adjusted because of shared space between symbols, or an empty string
   if space had not been shared."""
 
-  if symbol_info.shares_space_with_other_symbols:
-    return " (adjusted sizes because of memory sharing)"
+    if symbol_info.shares_space_with_other_symbols:
+        return " (adjusted sizes because of memory sharing)"
 
-  return ""
+    return ""
+
 
 class CrunchStatsData(object):
-  """Stores a summary of data of a certain kind."""
-  def __init__(self, symbols):
-    self.symbols = symbols
-    self.sources = set()
-    self.before_size = 0
-    self.after_size = 0
-    self.symbols_by_path = {}
+    """Stores a summary of data of a certain kind."""
+
+    def __init__(self, symbols):
+        self.symbols = symbols
+        self.sources = set()
+        self.before_size = 0
+        self.after_size = 0
+        self.symbols_by_path = {}
 
 
 def CrunchStats(added, removed, changed, unchanged, showsources, showsymbols):
-  """Outputs to stdout a summary of changes based on the symbol lists."""
-  # Split changed into grown and shrunk because that is easier to
-  # discuss.
-  grown = []
-  shrunk = []
-  for item in changed:
-    if item.old_size < item.new_size:
-      grown.append(item)
-    else:
-      shrunk.append(item)
-
-  new_symbols = CrunchStatsData(added)
-  removed_symbols = CrunchStatsData(removed)
-  grown_symbols = CrunchStatsData(grown)
-  shrunk_symbols = CrunchStatsData(shrunk)
-  sections = [new_symbols, removed_symbols, grown_symbols, shrunk_symbols]
-  for section in sections:
-    for item in section.symbols:
-      section.sources.add(item.file_path)
-      if item.old_size is not None:
-        section.before_size += item.old_size
-      if item.new_size is not None:
-        section.after_size += item.new_size
-      bucket = section.symbols_by_path.setdefault(item.file_path, [])
-      bucket.append((item.symbol_name, item.symbol_type,
-                     item.ExtractSymbolDelta()))
-
-  total_change = sum(s.after_size - s.before_size for s in sections)
-  summary = 'Total change: %s bytes' % DeltaStr(total_change)
-  print(summary)
-  print('=' * len(summary))
-  for section in sections:
-    if not section.symbols:
-      continue
-    if section.before_size == 0:
-      description = ('added, totalling %s bytes' % DeltaStr(section.after_size))
-    elif section.after_size == 0:
-      description = ('removed, totalling %s bytes' %
-                     DeltaStr(-section.before_size))
-    else:
-      if section.after_size > section.before_size:
-        type_str = 'grown'
-      else:
-        type_str = 'shrunk'
-      description = ('%s, for a net change of %s bytes '
-                     '(%d bytes before, %d bytes after)' %
-            (type_str, DeltaStr(section.after_size - section.before_size),
-             section.before_size, section.after_size))
-    print('  %d %s across %d sources' %
-          (len(section.symbols), description, len(section.sources)))
-
-  maybe_unchanged_sources = set()
-  unchanged_symbols_size = 0
-  for item in unchanged:
-    maybe_unchanged_sources.add(item.file_path)
-    unchanged_symbols_size += item.old_size # == item.new_size
-  print('  %d unchanged, totalling %d bytes' %
-        (len(unchanged), unchanged_symbols_size))
-
-  # High level analysis, always output.
-  unchanged_sources = maybe_unchanged_sources
-  for section in sections:
-    unchanged_sources = unchanged_sources - section.sources
-  new_sources = (new_symbols.sources -
-    maybe_unchanged_sources -
-    removed_symbols.sources)
-  removed_sources = (removed_symbols.sources -
-    maybe_unchanged_sources -
-    new_symbols.sources)
-  partially_changed_sources = (grown_symbols.sources |
-    shrunk_symbols.sources | new_symbols.sources |
-    removed_symbols.sources) - removed_sources - new_sources
-  allFiles = set()
-  for section in sections:
-    allFiles = allFiles | section.sources
-  allFiles = allFiles | maybe_unchanged_sources
-  print 'Source stats:'
-  print('  %d sources encountered.' % len(allFiles))
-  print('  %d completely new.' % len(new_sources))
-  print('  %d removed completely.' % len(removed_sources))
-  print('  %d partially changed.' % len(partially_changed_sources))
-  print('  %d completely unchanged.' % len(unchanged_sources))
-  remainder = (allFiles - new_sources - removed_sources -
-    partially_changed_sources - unchanged_sources)
-  assert len(remainder) == 0
-
-  if not showsources:
-    return  # Per-source analysis, only if requested
-  print 'Per-source Analysis:'
-  delta_by_path = {}
-  for section in sections:
-    for path in section.symbols_by_path:
-      entry = delta_by_path.get(path)
-      if not entry:
-        entry = {'plus': 0, 'minus': 0}
-        delta_by_path[path] = entry
-      for symbol_name, symbol_type, symbol_delta in \
-            section.symbols_by_path[path]:
-        if symbol_delta.old_size is None:
-          delta = symbol_delta.new_size
-        elif symbol_delta.new_size is None:
-          delta = -symbol_delta.old_size
+    """Outputs to stdout a summary of changes based on the symbol lists."""
+    # Split changed into grown and shrunk because that is easier to
+    # discuss.
+    grown = []
+    shrunk = []
+    for item in changed:
+        if item.old_size < item.new_size:
+            grown.append(item)
         else:
-          delta = symbol_delta.new_size - symbol_delta.old_size
+            shrunk.append(item)
 
-        if delta > 0:
-          entry['plus'] += delta
+    new_symbols = CrunchStatsData(added)
+    removed_symbols = CrunchStatsData(removed)
+    grown_symbols = CrunchStatsData(grown)
+    shrunk_symbols = CrunchStatsData(shrunk)
+    sections = [new_symbols, removed_symbols, grown_symbols, shrunk_symbols]
+    for section in sections:
+        for item in section.symbols:
+            section.sources.add(item.file_path)
+            if item.old_size is not None:
+                section.before_size += item.old_size
+            if item.new_size is not None:
+                section.after_size += item.new_size
+            bucket = section.symbols_by_path.setdefault(item.file_path, [])
+            bucket.append((item.symbol_name, item.symbol_type,
+                           item.ExtractSymbolDelta()))
+
+    total_change = sum(s.after_size - s.before_size for s in sections)
+    summary = 'Total change: %s bytes' % DeltaStr(total_change)
+    print(summary)
+    print('=' * len(summary))
+    for section in sections:
+        if not section.symbols:
+            continue
+        if section.before_size == 0:
+            description = (
+                'added, totalling %s bytes' % DeltaStr(section.after_size))
+        elif section.after_size == 0:
+            description = (
+                'removed, totalling %s bytes' % DeltaStr(-section.before_size))
         else:
-          entry['minus'] += (-1 * delta)
+            if section.after_size > section.before_size:
+                type_str = 'grown'
+            else:
+                type_str = 'shrunk'
+            description = (
+                '%s, for a net change of %s bytes '
+                '(%d bytes before, %d bytes after)' %
+                (type_str, DeltaStr(section.after_size - section.before_size),
+                 section.before_size, section.after_size))
+        print('  %d %s across %d sources' % (len(section.symbols), description,
+                                             len(section.sources)))
 
-  def delta_sort_key(item):
-    _path, size_data = item
-    growth = size_data['plus'] - size_data['minus']
-    return growth
+    maybe_unchanged_sources = set()
+    unchanged_symbols_size = 0
+    for item in unchanged:
+        maybe_unchanged_sources.add(item.file_path)
+        unchanged_symbols_size += item.old_size  # == item.new_size
+    print('  %d unchanged, totalling %d bytes' % (len(unchanged),
+                                                  unchanged_symbols_size))
 
-  for path, size_data in sorted(delta_by_path.iteritems(), key=delta_sort_key,
-                                reverse=True):
-    gain = size_data['plus']
-    loss = size_data['minus']
-    delta = size_data['plus'] - size_data['minus']
-    header = ' %s - Source: %s - (gained %d, lost %d)' % (DeltaStr(delta),
-                                                          path, gain, loss)
-    divider = '-' * len(header)
-    print ''
-    print divider
-    print header
-    print divider
-    if showsymbols:
-      def ExtractNewSize(tup):
-        symbol_delta = tup[2]
-        return symbol_delta.new_size
-      def ExtractOldSize(tup):
-        symbol_delta = tup[2]
-        return symbol_delta.old_size
-      if path in new_symbols.symbols_by_path:
-        print '  New symbols:'
-        for symbol_name, symbol_type, symbol_delta in \
-            sorted(new_symbols.symbols_by_path[path],
-                   key=ExtractNewSize,
-                   reverse=True):
-          print ('   %8s: %s type=%s, size=%d bytes%s' %
-                 (DeltaStr(symbol_delta.new_size), symbol_name, symbol_type,
-                  symbol_delta.new_size, SharedInfoStr(symbol_delta)))
-      if path in removed_symbols.symbols_by_path:
-        print '  Removed symbols:'
-        for symbol_name, symbol_type, symbol_delta in \
-            sorted(removed_symbols.symbols_by_path[path],
-                   key=ExtractOldSize):
-          print ('   %8s: %s type=%s, size=%d bytes%s' %
-                 (DeltaStr(-symbol_delta.old_size), symbol_name, symbol_type,
-                  symbol_delta.old_size,
-                  SharedInfoStr(symbol_delta)))
-      for (changed_symbols_by_path, type_str) in [
-        (grown_symbols.symbols_by_path, "Grown"),
-        (shrunk_symbols.symbols_by_path, "Shrunk")]:
-        if path in changed_symbols_by_path:
-          print '  %s symbols:' % type_str
-          def changed_symbol_sortkey(item):
-            symbol_name, _symbol_type, symbol_delta = item
-            return (symbol_delta.old_size - symbol_delta.new_size, symbol_name)
-          for symbol_name, symbol_type, symbol_delta in \
-              sorted(changed_symbols_by_path[path], key=changed_symbol_sortkey):
-            print ('   %8s: %s type=%s, (was %d bytes, now %d bytes)%s'
-                   % (DeltaStr(symbol_delta.new_size - symbol_delta.old_size),
-                      symbol_name, symbol_type,
-                      symbol_delta.old_size, symbol_delta.new_size,
-                      SharedInfoStr(symbol_delta)))
+    # High level analysis, always output.
+    unchanged_sources = maybe_unchanged_sources
+    for section in sections:
+        unchanged_sources = unchanged_sources - section.sources
+    new_sources = (
+        new_symbols.sources - maybe_unchanged_sources - removed_symbols.sources)
+    removed_sources = (
+        removed_symbols.sources - maybe_unchanged_sources - new_symbols.sources)
+    partially_changed_sources = (
+        grown_symbols.sources | shrunk_symbols.sources | new_symbols.sources |
+        removed_symbols.sources) - removed_sources - new_sources
+    allFiles = set()
+    for section in sections:
+        allFiles = allFiles | section.sources
+    allFiles = allFiles | maybe_unchanged_sources
+    print 'Source stats:'
+    print('  %d sources encountered.' % len(allFiles))
+    print('  %d completely new.' % len(new_sources))
+    print('  %d removed completely.' % len(removed_sources))
+    print('  %d partially changed.' % len(partially_changed_sources))
+    print('  %d completely unchanged.' % len(unchanged_sources))
+    remainder = (allFiles - new_sources - removed_sources -
+                 partially_changed_sources - unchanged_sources)
+    assert len(remainder) == 0
+
+    if not showsources:
+        return  # Per-source analysis, only if requested
+    print 'Per-source Analysis:'
+    delta_by_path = {}
+    for section in sections:
+        for path in section.symbols_by_path:
+            entry = delta_by_path.get(path)
+            if not entry:
+                entry = {'plus': 0, 'minus': 0}
+                delta_by_path[path] = entry
+            for symbol_name, symbol_type, symbol_delta in \
+                  section.symbols_by_path[path]:
+                if symbol_delta.old_size is None:
+                    delta = symbol_delta.new_size
+                elif symbol_delta.new_size is None:
+                    delta = -symbol_delta.old_size
+                else:
+                    delta = symbol_delta.new_size - symbol_delta.old_size
+
+                if delta > 0:
+                    entry['plus'] += delta
+                else:
+                    entry['minus'] += (-1 * delta)
+
+    def delta_sort_key(item):
+        _path, size_data = item
+        growth = size_data['plus'] - size_data['minus']
+        return growth
+
+    for path, size_data in sorted(
+            delta_by_path.iteritems(), key=delta_sort_key, reverse=True):
+        gain = size_data['plus']
+        loss = size_data['minus']
+        delta = size_data['plus'] - size_data['minus']
+        header = ' %s - Source: %s - (gained %d, lost %d)' % (DeltaStr(delta),
+                                                              path, gain, loss)
+        divider = '-' * len(header)
+        print ''
+        print divider
+        print header
+        print divider
+        if showsymbols:
+
+            def ExtractNewSize(tup):
+                symbol_delta = tup[2]
+                return symbol_delta.new_size
+
+            def ExtractOldSize(tup):
+                symbol_delta = tup[2]
+                return symbol_delta.old_size
+
+            if path in new_symbols.symbols_by_path:
+                print '  New symbols:'
+                for symbol_name, symbol_type, symbol_delta in \
+                    sorted(new_symbols.symbols_by_path[path],
+                           key=ExtractNewSize,
+                           reverse=True):
+                    print('   %8s: %s type=%s, size=%d bytes%s' %
+                          (DeltaStr(symbol_delta.new_size), symbol_name,
+                           symbol_type, symbol_delta.new_size,
+                           SharedInfoStr(symbol_delta)))
+            if path in removed_symbols.symbols_by_path:
+                print '  Removed symbols:'
+                for symbol_name, symbol_type, symbol_delta in \
+                    sorted(removed_symbols.symbols_by_path[path],
+                           key=ExtractOldSize):
+                    print('   %8s: %s type=%s, size=%d bytes%s' %
+                          (DeltaStr(-symbol_delta.old_size), symbol_name,
+                           symbol_type, symbol_delta.old_size,
+                           SharedInfoStr(symbol_delta)))
+            for (changed_symbols_by_path,
+                 type_str) in [(grown_symbols.symbols_by_path, "Grown"),
+                               (shrunk_symbols.symbols_by_path, "Shrunk")]:
+                if path in changed_symbols_by_path:
+                    print '  %s symbols:' % type_str
+
+                    def changed_symbol_sortkey(item):
+                        symbol_name, _symbol_type, symbol_delta = item
+                        return (symbol_delta.old_size - symbol_delta.new_size,
+                                symbol_name)
+
+                    for symbol_name, symbol_type, symbol_delta in \
+                        sorted(changed_symbols_by_path[path], key=changed_symbol_sortkey):
+                        print(
+                            '   %8s: %s type=%s, (was %d bytes, now %d bytes)%s'
+                            % (DeltaStr(symbol_delta.new_size -
+                                        symbol_delta.old_size), symbol_name,
+                               symbol_type,
+                               symbol_delta.old_size, symbol_delta.new_size,
+                               SharedInfoStr(symbol_delta)))
 
 
 def main():
-  usage = """%prog [options]
+    usage = """%prog [options]
 
   Analyzes the symbolic differences between two binary files
   (typically, not necessarily, two different builds of the same
@@ -453,32 +477,42 @@
 
   Options are available via '--help'.
   """
-  parser = optparse.OptionParser(usage=usage)
-  parser.add_option('--nm1', metavar='PATH',
-                    help='the nm dump of the first library')
-  parser.add_option('--nm2', metavar='PATH',
-                    help='the nm dump of the second library')
-  parser.add_option('--showsources', action='store_true', default=False,
-                    help='show per-source statistics')
-  parser.add_option('--showsymbols', action='store_true', default=False,
-                    help='show all symbol information; implies --showsources')
-  parser.add_option('--verbose', action='store_true', default=False,
-                    help='output internal debugging stuff')
-  opts, _args = parser.parse_args()
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option(
+        '--nm1', metavar='PATH', help='the nm dump of the first library')
+    parser.add_option(
+        '--nm2', metavar='PATH', help='the nm dump of the second library')
+    parser.add_option(
+        '--showsources',
+        action='store_true',
+        default=False,
+        help='show per-source statistics')
+    parser.add_option(
+        '--showsymbols',
+        action='store_true',
+        default=False,
+        help='show all symbol information; implies --showsources')
+    parser.add_option(
+        '--verbose',
+        action='store_true',
+        default=False,
+        help='output internal debugging stuff')
+    opts, _args = parser.parse_args()
 
-  if not opts.nm1:
-    parser.error('--nm1 is required')
-  if not opts.nm2:
-    parser.error('--nm2 is required')
-  symbols = []
-  for path in [opts.nm1, opts.nm2]:
-    with file(path, 'r') as nm_input:
-      if opts.verbose:
-        print 'parsing ' + path + '...'
-      symbols.append(list(binary_size_utils.ParseNm(nm_input)))
-  (added, removed, changed, unchanged) = Compare(symbols[0], symbols[1])
-  CrunchStats(added, removed, changed, unchanged,
-    opts.showsources | opts.showsymbols, opts.showsymbols)
+    if not opts.nm1:
+        parser.error('--nm1 is required')
+    if not opts.nm2:
+        parser.error('--nm2 is required')
+    symbols = []
+    for path in [opts.nm1, opts.nm2]:
+        with file(path, 'r') as nm_input:
+            if opts.verbose:
+                print 'parsing ' + path + '...'
+            symbols.append(list(binary_size_utils.ParseNm(nm_input)))
+    (added, removed, changed, unchanged) = Compare(symbols[0], symbols[1])
+    CrunchStats(added, removed, changed, unchanged,
+                opts.showsources | opts.showsymbols, opts.showsymbols)
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/runtime/third_party/binary_size/src/run_binary_size_analysis.py b/runtime/third_party/binary_size/src/run_binary_size_analysis.py
index d97858d..d78e02d 100755
--- a/runtime/third_party/binary_size/src/run_binary_size_analysis.py
+++ b/runtime/third_party/binary_size/src/run_binary_size_analysis.py
@@ -2,7 +2,6 @@
 # Copyright 2014 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.
-
 """Generate a spatial analysis against an arbitrary library.
 
 To use, build the 'binary_size_tool' target. Then run this tool, passing
@@ -47,166 +46,170 @@
 
 
 def _MkChild(node, name):
-  child = node[NODE_CHILDREN_KEY].get(name)
-  if child is None:
-    child = {NODE_NAME_KEY: name,
-             NODE_CHILDREN_KEY: {}}
-    node[NODE_CHILDREN_KEY][name] = child
-  return child
-
+    child = node[NODE_CHILDREN_KEY].get(name)
+    if child is None:
+        child = {NODE_NAME_KEY: name, NODE_CHILDREN_KEY: {}}
+        node[NODE_CHILDREN_KEY][name] = child
+    return child
 
 
 def SplitNoPathBucket(node):
-  """NAME_NO_PATH_BUCKET can be too large for the graphing lib to
+    """NAME_NO_PATH_BUCKET can be too large for the graphing lib to
   handle. Split it into sub-buckets in that case."""
-  root_children = node[NODE_CHILDREN_KEY]
-  if NAME_NO_PATH_BUCKET in root_children:
-    no_path_bucket = root_children[NAME_NO_PATH_BUCKET]
-    old_children = no_path_bucket[NODE_CHILDREN_KEY]
-    count = 0
-    for symbol_type, symbol_bucket in old_children.iteritems():
-      count += len(symbol_bucket[NODE_CHILDREN_KEY])
-    if count > BIG_BUCKET_LIMIT:
-      new_children = {}
-      no_path_bucket[NODE_CHILDREN_KEY] = new_children
-      current_bucket = None
-      index = 0
-      for symbol_type, symbol_bucket in old_children.iteritems():
-        for symbol_name, value in symbol_bucket[NODE_CHILDREN_KEY].iteritems():
-          if index % BIG_BUCKET_LIMIT == 0:
-            group_no = (index / BIG_BUCKET_LIMIT) + 1
-            current_bucket = _MkChild(no_path_bucket,
-                                      '%s subgroup %d' % (NAME_NO_PATH_BUCKET,
-                                                          group_no))
-            assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'p'
-            node[NODE_TYPE_KEY] = 'p'  # p for path
-          index += 1
-          symbol_size = value[NODE_SYMBOL_SIZE_KEY]
-          AddSymbolIntoFileNode(current_bucket, symbol_type,
-                                symbol_name, symbol_size)
+    root_children = node[NODE_CHILDREN_KEY]
+    if NAME_NO_PATH_BUCKET in root_children:
+        no_path_bucket = root_children[NAME_NO_PATH_BUCKET]
+        old_children = no_path_bucket[NODE_CHILDREN_KEY]
+        count = 0
+        for symbol_type, symbol_bucket in old_children.iteritems():
+            count += len(symbol_bucket[NODE_CHILDREN_KEY])
+        if count > BIG_BUCKET_LIMIT:
+            new_children = {}
+            no_path_bucket[NODE_CHILDREN_KEY] = new_children
+            current_bucket = None
+            index = 0
+            for symbol_type, symbol_bucket in old_children.iteritems():
+                for symbol_name, value in symbol_bucket[
+                        NODE_CHILDREN_KEY].iteritems():
+                    if index % BIG_BUCKET_LIMIT == 0:
+                        group_no = (index / BIG_BUCKET_LIMIT) + 1
+                        current_bucket = _MkChild(
+                            no_path_bucket,
+                            '%s subgroup %d' % (NAME_NO_PATH_BUCKET, group_no))
+                        assert not NODE_TYPE_KEY in node or node[
+                            NODE_TYPE_KEY] == 'p'
+                        node[NODE_TYPE_KEY] = 'p'  # p for path
+                    index += 1
+                    symbol_size = value[NODE_SYMBOL_SIZE_KEY]
+                    AddSymbolIntoFileNode(current_bucket, symbol_type,
+                                          symbol_name, symbol_size)
 
 
 def MakeChildrenDictsIntoLists(node):
-  largest_list_len = 0
-  if NODE_CHILDREN_KEY in node:
-    largest_list_len = len(node[NODE_CHILDREN_KEY])
-    child_list = []
-    for child in node[NODE_CHILDREN_KEY].itervalues():
-      child_largest_list_len = MakeChildrenDictsIntoLists(child)
-      if child_largest_list_len > largest_list_len:
-        largest_list_len = child_largest_list_len
-      child_list.append(child)
-    node[NODE_CHILDREN_KEY] = child_list
+    largest_list_len = 0
+    if NODE_CHILDREN_KEY in node:
+        largest_list_len = len(node[NODE_CHILDREN_KEY])
+        child_list = []
+        for child in node[NODE_CHILDREN_KEY].itervalues():
+            child_largest_list_len = MakeChildrenDictsIntoLists(child)
+            if child_largest_list_len > largest_list_len:
+                largest_list_len = child_largest_list_len
+            child_list.append(child)
+        node[NODE_CHILDREN_KEY] = child_list
 
-  return largest_list_len
+    return largest_list_len
 
 
 def AddSymbolIntoFileNode(node, symbol_type, symbol_name, symbol_size):
-  """Puts symbol into the file path node |node|.
+    """Puts symbol into the file path node |node|.
   Returns the number of added levels in tree. I.e. returns 2."""
 
-  # 'node' is the file node and first step is to find its symbol-type bucket.
-  node[NODE_LAST_PATH_ELEMENT_KEY] = True
-  node = _MkChild(node, symbol_type)
-  assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'b'
-  node[NODE_SYMBOL_TYPE_KEY] = symbol_type
-  node[NODE_TYPE_KEY] = 'b'  # b for bucket
+    # 'node' is the file node and first step is to find its symbol-type bucket.
+    node[NODE_LAST_PATH_ELEMENT_KEY] = True
+    node = _MkChild(node, symbol_type)
+    assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'b'
+    node[NODE_SYMBOL_TYPE_KEY] = symbol_type
+    node[NODE_TYPE_KEY] = 'b'  # b for bucket
 
-  # 'node' is now the symbol-type bucket. Make the child entry.
-  node = _MkChild(node, symbol_name)
-  if NODE_CHILDREN_KEY in node:
-    if node[NODE_CHILDREN_KEY]:
-      logging.warning('A container node used as symbol for %s.' % symbol_name)
-    # This is going to be used as a leaf so no use for child list.
-    del node[NODE_CHILDREN_KEY]
-  node[NODE_SYMBOL_SIZE_KEY] = symbol_size
-  node[NODE_SYMBOL_TYPE_KEY] = symbol_type
-  node[NODE_TYPE_KEY] = 's'  # s for symbol
+    # 'node' is now the symbol-type bucket. Make the child entry.
+    node = _MkChild(node, symbol_name)
+    if NODE_CHILDREN_KEY in node:
+        if node[NODE_CHILDREN_KEY]:
+            logging.warning(
+                'A container node used as symbol for %s.' % symbol_name)
+        # This is going to be used as a leaf so no use for child list.
+        del node[NODE_CHILDREN_KEY]
+    node[NODE_SYMBOL_SIZE_KEY] = symbol_size
+    node[NODE_SYMBOL_TYPE_KEY] = symbol_type
+    node[NODE_TYPE_KEY] = 's'  # s for symbol
 
-  return 2  # Depth of the added subtree.
+    return 2  # Depth of the added subtree.
 
 
 def MakeCompactTree(symbols, symbol_path_origin_dir):
-  result = {NODE_NAME_KEY: '/',
-            NODE_CHILDREN_KEY: {},
-            NODE_TYPE_KEY: 'p',
-            NODE_MAX_DEPTH_KEY: 0}
-  seen_symbol_with_path = False
-  cwd = os.path.abspath(os.getcwd())
-  for symbol_name, symbol_type, symbol_size, file_path, _address in symbols:
+    result = {
+        NODE_NAME_KEY: '/',
+        NODE_CHILDREN_KEY: {},
+        NODE_TYPE_KEY: 'p',
+        NODE_MAX_DEPTH_KEY: 0
+    }
+    seen_symbol_with_path = False
+    cwd = os.path.abspath(os.getcwd())
+    for symbol_name, symbol_type, symbol_size, file_path, _address in symbols:
 
-    if 'vtable for ' in symbol_name:
-      symbol_type = '@'  # hack to categorize these separately
-    # Take path like '/foo/bar/baz', convert to ['foo', 'bar', 'baz']
-    if file_path and file_path != "??":
-      file_path = os.path.abspath(os.path.join(symbol_path_origin_dir,
-                                               file_path))
-      # Let the output structure be relative to $CWD if inside $CWD,
-      # otherwise relative to the disk root. This is to avoid
-      # unnecessary click-through levels in the output.
-      if file_path.startswith(cwd + os.sep):
-        file_path = file_path[len(cwd):]
-      if file_path.startswith('/'):
-        file_path = file_path[1:]
-      seen_symbol_with_path = True
-    else:
-      file_path = NAME_NO_PATH_BUCKET
+        if 'vtable for ' in symbol_name:
+            symbol_type = '@'  # hack to categorize these separately
+        # Take path like '/foo/bar/baz', convert to ['foo', 'bar', 'baz']
+        if file_path and file_path != "??":
+            file_path = os.path.abspath(
+                os.path.join(symbol_path_origin_dir, file_path))
+            # Let the output structure be relative to $CWD if inside $CWD,
+            # otherwise relative to the disk root. This is to avoid
+            # unnecessary click-through levels in the output.
+            if file_path.startswith(cwd + os.sep):
+                file_path = file_path[len(cwd):]
+            if file_path.startswith('/'):
+                file_path = file_path[1:]
+            seen_symbol_with_path = True
+        else:
+            file_path = NAME_NO_PATH_BUCKET
 
-    path_parts = file_path.split('/')
+        path_parts = file_path.split('/')
 
-    # Find pre-existing node in tree, or update if it already exists
-    node = result
-    depth = 0
-    while len(path_parts) > 0:
-      path_part = path_parts.pop(0)
-      if len(path_part) == 0:
-        continue
-      depth += 1
-      node = _MkChild(node, path_part)
-      assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'p'
-      node[NODE_TYPE_KEY] = 'p'  # p for path
+        # Find pre-existing node in tree, or update if it already exists
+        node = result
+        depth = 0
+        while len(path_parts) > 0:
+            path_part = path_parts.pop(0)
+            if len(path_part) == 0:
+                continue
+            depth += 1
+            node = _MkChild(node, path_part)
+            assert not NODE_TYPE_KEY in node or node[NODE_TYPE_KEY] == 'p'
+            node[NODE_TYPE_KEY] = 'p'  # p for path
 
-    depth += AddSymbolIntoFileNode(node, symbol_type, symbol_name, symbol_size)
-    result[NODE_MAX_DEPTH_KEY] = max(result[NODE_MAX_DEPTH_KEY], depth)
+        depth += AddSymbolIntoFileNode(node, symbol_type, symbol_name,
+                                       symbol_size)
+        result[NODE_MAX_DEPTH_KEY] = max(result[NODE_MAX_DEPTH_KEY], depth)
 
-  if not seen_symbol_with_path:
-    logging.warning('Symbols lack paths. Data will not be structured.')
+    if not seen_symbol_with_path:
+        logging.warning('Symbols lack paths. Data will not be structured.')
 
-  # The (no path) bucket can be extremely large if we failed to get
-  # path information. Split it into subgroups if needed.
-  SplitNoPathBucket(result)
+    # The (no path) bucket can be extremely large if we failed to get
+    # path information. Split it into subgroups if needed.
+    SplitNoPathBucket(result)
 
-  largest_list_len = MakeChildrenDictsIntoLists(result)
+    largest_list_len = MakeChildrenDictsIntoLists(result)
 
-  if largest_list_len > BIG_BUCKET_LIMIT:
-    logging.warning('There are sections with %d nodes. '
-                    'Results might be unusable.' % largest_list_len)
-  return result
+    if largest_list_len > BIG_BUCKET_LIMIT:
+        logging.warning('There are sections with %d nodes. '
+                        'Results might be unusable.' % largest_list_len)
+    return result
 
 
 def DumpCompactTree(symbols, symbol_path_origin_dir, outfile):
-  tree_root = MakeCompactTree(symbols, symbol_path_origin_dir)
-  with open(outfile, 'w') as out:
-    out.write('var tree_data=')
-    # Use separators without whitespace to get a smaller file.
-    json.dump(tree_root, out, separators=(',', ':'))
-  print('Writing %d bytes json' % os.path.getsize(outfile))
+    tree_root = MakeCompactTree(symbols, symbol_path_origin_dir)
+    with open(outfile, 'w') as out:
+        out.write('var tree_data=')
+        # Use separators without whitespace to get a smaller file.
+        json.dump(tree_root, out, separators=(',', ':'))
+    print('Writing %d bytes json' % os.path.getsize(outfile))
 
 
 def MakeSourceMap(symbols):
-  sources = {}
-  for _sym, _symbol_type, size, path, _address in symbols:
-    key = None
-    if path:
-      key = os.path.normpath(path)
-    else:
-      key = '[no path]'
-    if key not in sources:
-      sources[key] = {'path': path, 'symbol_count': 0, 'size': 0}
-    record = sources[key]
-    record['size'] += size
-    record['symbol_count'] += 1
-  return sources
+    sources = {}
+    for _sym, _symbol_type, size, path, _address in symbols:
+        key = None
+        if path:
+            key = os.path.normpath(path)
+        else:
+            key = '[no path]'
+        if key not in sources:
+            sources[key] = {'path': path, 'symbol_count': 0, 'size': 0}
+        record = sources[key]
+        record['size'] += size
+        record['symbol_count'] += 1
+    return sources
 
 
 # Regex for parsing "nm" output. A sample line looks like this:
@@ -224,285 +227,302 @@
 # [\t]?             Tab separator
 # (.*)              The location (filename[:linennum|?][ (discriminator n)]
 sNmPattern = re.compile(
-  r'([0-9a-f]{8,})[\s]+([0-9a-f]{8,})[\s]*(\S?)[\s*]([^\t]*)[\t]?(.*)')
+    r'([0-9a-f]{8,})[\s]+([0-9a-f]{8,})[\s]*(\S?)[\s*]([^\t]*)[\t]?(.*)')
+
 
 class Progress():
-  def __init__(self):
-    self.count = 0
-    self.skip_count = 0
-    self.collisions = 0
-    self.time_last_output = time.time()
-    self.count_last_output = 0
-    self.disambiguations = 0
-    self.was_ambiguous = 0
+
+    def __init__(self):
+        self.count = 0
+        self.skip_count = 0
+        self.collisions = 0
+        self.time_last_output = time.time()
+        self.count_last_output = 0
+        self.disambiguations = 0
+        self.was_ambiguous = 0
 
 
 def RunElfSymbolizer(outfile, library, addr2line_binary, nm_binary, jobs,
                      disambiguate, src_path):
-  nm_output = RunNm(library, nm_binary)
-  nm_output_lines = nm_output.splitlines()
-  nm_output_lines_len = len(nm_output_lines)
-  address_symbol = {}
-  progress = Progress()
-  def map_address_symbol(symbol, addr):
-    progress.count += 1
-    if addr in address_symbol:
-      # 'Collision between %s and %s.' % (str(symbol.name),
-      #                                   str(address_symbol[addr].name))
-      progress.collisions += 1
-    else:
-      if symbol.disambiguated:
-        progress.disambiguations += 1
-      if symbol.was_ambiguous:
-        progress.was_ambiguous += 1
+    nm_output = RunNm(library, nm_binary)
+    nm_output_lines = nm_output.splitlines()
+    nm_output_lines_len = len(nm_output_lines)
+    address_symbol = {}
+    progress = Progress()
 
-      address_symbol[addr] = symbol
-
-    progress_output()
-
-  def progress_output():
-    progress_chunk = 100
-    if progress.count % progress_chunk == 0:
-      time_now = time.time()
-      time_spent = time_now - progress.time_last_output
-      if time_spent > 1.0:
-        # Only output at most once per second.
-        progress.time_last_output = time_now
-        chunk_size = progress.count - progress.count_last_output
-        progress.count_last_output = progress.count
-        if time_spent > 0:
-          speed = chunk_size / time_spent
+    def map_address_symbol(symbol, addr):
+        progress.count += 1
+        if addr in address_symbol:
+            # 'Collision between %s and %s.' % (str(symbol.name),
+            #                                   str(address_symbol[addr].name))
+            progress.collisions += 1
         else:
-          speed = 0
-        progress_percent = (100.0 * (progress.count + progress.skip_count) /
-                            nm_output_lines_len)
-        disambiguation_percent = 0
-        if progress.disambiguations != 0:
-          disambiguation_percent = (100.0 * progress.disambiguations /
-                                    progress.was_ambiguous)
+            if symbol.disambiguated:
+                progress.disambiguations += 1
+            if symbol.was_ambiguous:
+                progress.was_ambiguous += 1
 
-        sys.stdout.write('\r%.1f%%: Looked up %d symbols (%d collisions, '
-              '%d disambiguations where %.1f%% succeeded)'
-              ' - %.1f lookups/s.' %
-              (progress_percent, progress.count, progress.collisions,
-               progress.disambiguations, disambiguation_percent, speed))
+            address_symbol[addr] = symbol
 
-  # In case disambiguation was disabled, we remove the source path (which upon
-  # being set signals the symbolizer to enable disambiguation)
-  if not disambiguate:
-    src_path = None
-  symbolizer = elf_symbolizer.ELFSymbolizer(library, addr2line_binary,
-                                            map_address_symbol,
-                                            max_concurrent_jobs=jobs,
-                                            source_root_path=src_path)
-  user_interrupted = False
-  try:
-    for line in nm_output_lines:
-      match = sNmPattern.match(line)
-      if match:
-        location = match.group(5)
-        if not location:
-          addr = int(match.group(1), 16)
-          size = int(match.group(2), 16)
-          if addr in address_symbol:  # Already looked up, shortcut
-                                      # ELFSymbolizer.
-            map_address_symbol(address_symbol[addr], addr)
-            continue
-          elif size == 0:
-            # Save time by not looking up empty symbols (do they even exist?)
-            print('Empty symbol: ' + line)
-          else:
-            symbolizer.SymbolizeAsync(addr, addr)
-            continue
+        progress_output()
 
-      progress.skip_count += 1
-  except KeyboardInterrupt:
-    user_interrupted = True
-    print('Interrupting - killing subprocesses. Please wait.')
+    def progress_output():
+        progress_chunk = 100
+        if progress.count % progress_chunk == 0:
+            time_now = time.time()
+            time_spent = time_now - progress.time_last_output
+            if time_spent > 1.0:
+                # Only output at most once per second.
+                progress.time_last_output = time_now
+                chunk_size = progress.count - progress.count_last_output
+                progress.count_last_output = progress.count
+                if time_spent > 0:
+                    speed = chunk_size / time_spent
+                else:
+                    speed = 0
+                progress_percent = (100.0 * (
+                    progress.count + progress.skip_count) / nm_output_lines_len)
+                disambiguation_percent = 0
+                if progress.disambiguations != 0:
+                    disambiguation_percent = (100.0 * progress.disambiguations /
+                                              progress.was_ambiguous)
 
-  try:
-    symbolizer.Join()
-  except KeyboardInterrupt:
-    # Don't want to abort here since we will be finished in a few seconds.
-    user_interrupted = True
-    print('Patience you must have my young padawan.')
+                sys.stdout.write(
+                    '\r%.1f%%: Looked up %d symbols (%d collisions, '
+                    '%d disambiguations where %.1f%% succeeded)'
+                    ' - %.1f lookups/s.' %
+                    (progress_percent, progress.count, progress.collisions,
+                     progress.disambiguations, disambiguation_percent, speed))
 
-  print ''
+    # In case disambiguation was disabled, we remove the source path (which upon
+    # being set signals the symbolizer to enable disambiguation)
+    if not disambiguate:
+        src_path = None
+    symbolizer = elf_symbolizer.ELFSymbolizer(
+        library,
+        addr2line_binary,
+        map_address_symbol,
+        max_concurrent_jobs=jobs,
+        source_root_path=src_path)
+    user_interrupted = False
+    try:
+        for line in nm_output_lines:
+            match = sNmPattern.match(line)
+            if match:
+                location = match.group(5)
+                if not location:
+                    addr = int(match.group(1), 16)
+                    size = int(match.group(2), 16)
+                    if addr in address_symbol:  # Already looked up, shortcut
+                        # ELFSymbolizer.
+                        map_address_symbol(address_symbol[addr], addr)
+                        continue
+                    elif size == 0:
+                        # Save time by not looking up empty symbols (do they even exist?)
+                        print('Empty symbol: ' + line)
+                    else:
+                        symbolizer.SymbolizeAsync(addr, addr)
+                        continue
 
-  if user_interrupted:
-    print('Skipping the rest of the file mapping. '
-          'Output will not be fully classified.')
+            progress.skip_count += 1
+    except KeyboardInterrupt:
+        user_interrupted = True
+        print('Interrupting - killing subprocesses. Please wait.')
 
-  symbol_path_origin_dir = os.path.dirname(os.path.abspath(library))
+    try:
+        symbolizer.Join()
+    except KeyboardInterrupt:
+        # Don't want to abort here since we will be finished in a few seconds.
+        user_interrupted = True
+        print('Patience you must have my young padawan.')
 
-  with open(outfile, 'w') as out:
-    for line in nm_output_lines:
-      match = sNmPattern.match(line)
-      if match:
-        location = match.group(5)
-        if not location:
-          addr = int(match.group(1), 16)
-          symbol = address_symbol.get(addr)
-          if symbol is not None:
-            path = '??'
-            if symbol.source_path is not None:
-              path = os.path.abspath(os.path.join(symbol_path_origin_dir,
-                                                  symbol.source_path))
-            line_number = 0
-            if symbol.source_line is not None:
-              line_number = symbol.source_line
-            out.write('%s\t%s:%d\n' % (line, path, line_number))
-            continue
+    print ''
 
-      out.write('%s\n' % line)
+    if user_interrupted:
+        print('Skipping the rest of the file mapping. '
+              'Output will not be fully classified.')
 
-  print('%d symbols in the results.' % len(address_symbol))
+    symbol_path_origin_dir = os.path.dirname(os.path.abspath(library))
+
+    with open(outfile, 'w') as out:
+        for line in nm_output_lines:
+            match = sNmPattern.match(line)
+            if match:
+                location = match.group(5)
+                if not location:
+                    addr = int(match.group(1), 16)
+                    symbol = address_symbol.get(addr)
+                    if symbol is not None:
+                        path = '??'
+                        if symbol.source_path is not None:
+                            path = os.path.abspath(
+                                os.path.join(symbol_path_origin_dir,
+                                             symbol.source_path))
+                        line_number = 0
+                        if symbol.source_line is not None:
+                            line_number = symbol.source_line
+                        out.write('%s\t%s:%d\n' % (line, path, line_number))
+                        continue
+
+            out.write('%s\n' % line)
+
+    print('%d symbols in the results.' % len(address_symbol))
 
 
 def RunNm(binary, nm_binary):
-  cmd = [nm_binary, '-C', '--print-size', '--size-sort', '--reverse-sort',
-         binary]
-  nm_process = subprocess.Popen(cmd,
-                                stdout=subprocess.PIPE,
-                                stderr=subprocess.PIPE)
-  (process_output, err_output) = nm_process.communicate()
+    cmd = [
+        nm_binary, '-C', '--print-size', '--size-sort', '--reverse-sort', binary
+    ]
+    nm_process = subprocess.Popen(
+        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    (process_output, err_output) = nm_process.communicate()
 
-  if nm_process.returncode != 0:
-    if err_output:
-      raise Exception, err_output
-    else:
-      raise Exception, process_output
+    if nm_process.returncode != 0:
+        if err_output:
+            raise Exception, err_output
+        else:
+            raise Exception, process_output
 
-  return process_output
+    return process_output
 
 
-def GetNmSymbols(nm_infile, outfile, library, jobs, verbose,
-                 addr2line_binary, nm_binary, disambiguate, src_path):
-  if nm_infile is None:
-    if outfile is None:
-      outfile = tempfile.NamedTemporaryFile(delete=False).name
+def GetNmSymbols(nm_infile, outfile, library, jobs, verbose, addr2line_binary,
+                 nm_binary, disambiguate, src_path):
+    if nm_infile is None:
+        if outfile is None:
+            outfile = tempfile.NamedTemporaryFile(delete=False).name
 
-    if verbose:
-      print 'Running parallel addr2line, dumping symbols to ' + outfile
-    RunElfSymbolizer(outfile, library, addr2line_binary, nm_binary, jobs,
-                     disambiguate, src_path)
+        if verbose:
+            print 'Running parallel addr2line, dumping symbols to ' + outfile
+        RunElfSymbolizer(outfile, library, addr2line_binary, nm_binary, jobs,
+                         disambiguate, src_path)
 
-    nm_infile = outfile
+        nm_infile = outfile
 
-  elif verbose:
-    print 'Using nm input from ' + nm_infile
-  with file(nm_infile, 'r') as infile:
-    return list(binary_size_utils.ParseNm(infile))
+    elif verbose:
+        print 'Using nm input from ' + nm_infile
+    with file(nm_infile, 'r') as infile:
+        return list(binary_size_utils.ParseNm(infile))
 
 
-PAK_RESOURCE_ID_TO_STRING = { "inited": False }
+PAK_RESOURCE_ID_TO_STRING = {"inited": False}
+
 
 def LoadPakIdsFromResourceFile(filename):
-  """Given a file name, it loads everything that looks like a resource id
+    """Given a file name, it loads everything that looks like a resource id
   into PAK_RESOURCE_ID_TO_STRING."""
-  with open(filename) as resource_header:
-    for line in resource_header:
-      if line.startswith("#define "):
-        line_data = line.split()
-        if len(line_data) == 3:
-          try:
-            resource_number = int(line_data[2])
-            resource_name = line_data[1]
-            PAK_RESOURCE_ID_TO_STRING[resource_number] = resource_name
-          except ValueError:
-            pass
+    with open(filename) as resource_header:
+        for line in resource_header:
+            if line.startswith("#define "):
+                line_data = line.split()
+                if len(line_data) == 3:
+                    try:
+                        resource_number = int(line_data[2])
+                        resource_name = line_data[1]
+                        PAK_RESOURCE_ID_TO_STRING[
+                            resource_number] = resource_name
+                    except ValueError:
+                        pass
+
 
 def GetReadablePakResourceName(pak_file, resource_id):
-  """Pak resources have a numeric identifier. It is not helpful when
+    """Pak resources have a numeric identifier. It is not helpful when
   trying to locate where footprint is generated. This does its best to
   map the number to a usable string."""
-  if not PAK_RESOURCE_ID_TO_STRING['inited']:
-    # Try to find resource header files generated by grit when
-    # building the pak file. We'll look for files named *resources.h"
-    # and lines of the type:
-    #    #define MY_RESOURCE_JS 1234
-    PAK_RESOURCE_ID_TO_STRING['inited'] = True
-    gen_dir = os.path.join(os.path.dirname(pak_file), 'gen')
-    if os.path.isdir(gen_dir):
-      for dirname, _dirs, files in os.walk(gen_dir):
-        for filename in files:
-          if filename.endswith('resources.h'):
-            LoadPakIdsFromResourceFile(os.path.join(dirname, filename))
-  return PAK_RESOURCE_ID_TO_STRING.get(resource_id,
-                                       'Pak Resource %d' % resource_id)
+    if not PAK_RESOURCE_ID_TO_STRING['inited']:
+        # Try to find resource header files generated by grit when
+        # building the pak file. We'll look for files named *resources.h"
+        # and lines of the type:
+        #    #define MY_RESOURCE_JS 1234
+        PAK_RESOURCE_ID_TO_STRING['inited'] = True
+        gen_dir = os.path.join(os.path.dirname(pak_file), 'gen')
+        if os.path.isdir(gen_dir):
+            for dirname, _dirs, files in os.walk(gen_dir):
+                for filename in files:
+                    if filename.endswith('resources.h'):
+                        LoadPakIdsFromResourceFile(
+                            os.path.join(dirname, filename))
+    return PAK_RESOURCE_ID_TO_STRING.get(resource_id,
+                                         'Pak Resource %d' % resource_id)
+
 
 def AddPakData(symbols, pak_file):
-  """Adds pseudo-symbols from a pak file."""
-  pak_file = os.path.abspath(pak_file)
-  with open(pak_file, 'rb') as pak:
-    data = pak.read()
+    """Adds pseudo-symbols from a pak file."""
+    pak_file = os.path.abspath(pak_file)
+    with open(pak_file, 'rb') as pak:
+        data = pak.read()
 
-  PAK_FILE_VERSION = 4
-  HEADER_LENGTH = 2 * 4 + 1  # Two uint32s. (file version, number of entries)
-                             # and one uint8 (encoding of text resources)
-  INDEX_ENTRY_SIZE = 2 + 4  # Each entry is a uint16 and a uint32.
-  version, num_entries, _encoding = struct.unpack('<IIB', data[:HEADER_LENGTH])
-  assert version == PAK_FILE_VERSION, ('Unsupported pak file '
-                                       'version (%d) in %s. Only '
-                                       'support version %d' %
-                                       (version, pak_file, PAK_FILE_VERSION))
-  if num_entries > 0:
-    # Read the index and data.
-    data = data[HEADER_LENGTH:]
-    for _ in range(num_entries):
-      resource_id, offset = struct.unpack('<HI', data[:INDEX_ENTRY_SIZE])
-      data = data[INDEX_ENTRY_SIZE:]
-      _next_id, next_offset = struct.unpack('<HI', data[:INDEX_ENTRY_SIZE])
-      resource_size = next_offset - offset
+    PAK_FILE_VERSION = 4
+    HEADER_LENGTH = 2 * 4 + 1  # Two uint32s. (file version, number of entries)
+    # and one uint8 (encoding of text resources)
+    INDEX_ENTRY_SIZE = 2 + 4  # Each entry is a uint16 and a uint32.
+    version, num_entries, _encoding = struct.unpack('<IIB',
+                                                    data[:HEADER_LENGTH])
+    assert version == PAK_FILE_VERSION, (
+        'Unsupported pak file '
+        'version (%d) in %s. Only '
+        'support version %d' % (version, pak_file, PAK_FILE_VERSION))
+    if num_entries > 0:
+        # Read the index and data.
+        data = data[HEADER_LENGTH:]
+        for _ in range(num_entries):
+            resource_id, offset = struct.unpack('<HI', data[:INDEX_ENTRY_SIZE])
+            data = data[INDEX_ENTRY_SIZE:]
+            _next_id, next_offset = struct.unpack('<HI',
+                                                  data[:INDEX_ENTRY_SIZE])
+            resource_size = next_offset - offset
 
-      symbol_name = GetReadablePakResourceName(pak_file, resource_id)
-      symbol_path = pak_file
-      symbol_type = 'd' # Data. Approximation.
-      symbol_size = resource_size
-      symbols.append((symbol_name, symbol_type, symbol_size, symbol_path))
+            symbol_name = GetReadablePakResourceName(pak_file, resource_id)
+            symbol_path = pak_file
+            symbol_type = 'd'  # Data. Approximation.
+            symbol_size = resource_size
+            symbols.append((symbol_name, symbol_type, symbol_size, symbol_path))
+
 
 def _find_in_system_path(binary):
-  """Locate the full path to binary in the system path or return None
+    """Locate the full path to binary in the system path or return None
   if not found."""
-  system_path = os.environ["PATH"].split(os.pathsep)
-  for path in system_path:
-    binary_path = os.path.join(path, binary)
-    if os.path.isfile(binary_path):
-      return binary_path
-  return None
+    system_path = os.environ["PATH"].split(os.pathsep)
+    for path in system_path:
+        binary_path = os.path.join(path, binary)
+        if os.path.isfile(binary_path):
+            return binary_path
+    return None
+
 
 def CheckDebugFormatSupport(library, addr2line_binary):
-  """Kills the program if debug data is in an unsupported format.
+    """Kills the program if debug data is in an unsupported format.
 
   There are two common versions of the DWARF debug formats and
   since we are right now transitioning from DWARF2 to newer formats,
   it's possible to have a mix of tools that are not compatible. Detect
   that and abort rather than produce meaningless output."""
-  tool_output = subprocess.check_output([addr2line_binary, '--version'])
-  version_re = re.compile(r'^GNU [^ ]+ .* (\d+).(\d+).*?$', re.M)
-  parsed_output = version_re.match(tool_output)
-  major = int(parsed_output.group(1))
-  minor = int(parsed_output.group(2))
-  supports_dwarf4 = major > 2 or major == 2 and minor > 22
+    tool_output = subprocess.check_output([addr2line_binary, '--version'])
+    version_re = re.compile(r'^GNU [^ ]+ .* (\d+).(\d+).*?$', re.M)
+    parsed_output = version_re.match(tool_output)
+    major = int(parsed_output.group(1))
+    minor = int(parsed_output.group(2))
+    supports_dwarf4 = major > 2 or major == 2 and minor > 22
 
-  if supports_dwarf4:
-    return
+    if supports_dwarf4:
+        return
 
-  print('Checking version of debug information in %s.' % library)
-  debug_info = subprocess.check_output(['readelf', '--debug-dump=info',
-                                       '--dwarf-depth=1', library])
-  dwarf_version_re = re.compile(r'^\s+Version:\s+(\d+)$', re.M)
-  parsed_dwarf_format_output = dwarf_version_re.search(debug_info)
-  version = int(parsed_dwarf_format_output.group(1))
-  if version > 2:
-    print('The supplied tools only support DWARF2 debug data but the binary\n' +
-          'uses DWARF%d. Update the tools or compile the binary\n' % version +
-          'with -gdwarf-2.')
-    sys.exit(1)
+    print('Checking version of debug information in %s.' % library)
+    debug_info = subprocess.check_output(
+        ['readelf', '--debug-dump=info', '--dwarf-depth=1', library])
+    dwarf_version_re = re.compile(r'^\s+Version:\s+(\d+)$', re.M)
+    parsed_dwarf_format_output = dwarf_version_re.search(debug_info)
+    version = int(parsed_dwarf_format_output.group(1))
+    if version > 2:
+        print(
+            'The supplied tools only support DWARF2 debug data but the binary\n'
+            + 'uses DWARF%d. Update the tools or compile the binary\n' % version
+            + 'with -gdwarf-2.')
+        sys.exit(1)
 
 
 def main():
-  usage = """%prog [options]
+    usage = """%prog [options]
 
   Runs a spatial analysis on a given library, looking up the source locations
   of its symbols and calculating how much space each directory, source file,
@@ -519,148 +539,170 @@
 
   Other options are available via '--help'.
   """
-  parser = optparse.OptionParser(usage=usage)
-  parser.add_option('--nm-in', metavar='PATH',
-                    help='if specified, use nm input from <path> instead of '
-                    'generating it. Note that source locations should be '
-                    'present in the file; i.e., no addr2line symbol lookups '
-                    'will be performed when this option is specified. '
-                    'Mutually exclusive with --library.')
-  parser.add_option('--destdir', metavar='PATH',
-                    help='write output to the specified directory. An HTML '
-                    'report is generated here along with supporting files; '
-                    'any existing report will be overwritten.')
-  parser.add_option('--library', metavar='PATH',
-                    help='if specified, process symbols in the library at '
-                    'the specified path. Mutually exclusive with --nm-in.')
-  parser.add_option('--pak', metavar='PATH',
-                    help='if specified, includes the contents of the '
-                    'specified *.pak file in the output.')
-  parser.add_option('--nm-binary',
-                    help='use the specified nm binary to analyze library. '
-                    'This is to be used when the nm in the path is not for '
-                    'the right architecture or of the right version.')
-  parser.add_option('--addr2line-binary',
-                    help='use the specified addr2line binary to analyze '
-                    'library. This is to be used when the addr2line in '
-                    'the path is not for the right architecture or '
-                    'of the right version.')
-  parser.add_option('--jobs', type='int',
-                    help='number of jobs to use for the parallel '
-                    'addr2line processing pool; defaults to 1. More '
-                    'jobs greatly improve throughput but eat RAM like '
-                    'popcorn, and take several gigabytes each. Start low '
-                    'and ramp this number up until your machine begins to '
-                    'struggle with RAM. '
-                    'This argument is only valid when using --library.')
-  parser.add_option('-v', '--verbose', dest='verbose', action='store_true',
-                    help='be verbose, printing lots of status information.')
-  parser.add_option('--nm-out', metavar='PATH',
-                    help='(deprecated) No-op. nm.out is stored in --destdir.')
-  parser.add_option('--no-nm-out', action='store_true',
-                    help='do not keep the nm output file. This file is useful '
-                    'if you want to see the fully processed nm output after '
-                    'the symbols have been mapped to source locations, or if '
-                    'you plan to run explain_binary_size_delta.py. By default '
-                    'the file \'nm.out\' is placed alongside the generated '
-                    'report. The nm.out file is only created when using '
-                    '--library.')
-  parser.add_option('--disable-disambiguation', action='store_true',
-                    help='disables the disambiguation process altogether,'
-                    ' NOTE: this may, depending on your toolchain, produce'
-                    ' output with some symbols at the top layer if addr2line'
-                    ' could not get the entire source path.')
-  parser.add_option('--source-path', default='./',
-                    help='the path to the source code of the output binary, '
-                    'default set to current directory. Used in the'
-                    ' disambiguation process.')
-  opts, _args = parser.parse_args()
+    parser = optparse.OptionParser(usage=usage)
+    parser.add_option(
+        '--nm-in',
+        metavar='PATH',
+        help='if specified, use nm input from <path> instead of '
+        'generating it. Note that source locations should be '
+        'present in the file; i.e., no addr2line symbol lookups '
+        'will be performed when this option is specified. '
+        'Mutually exclusive with --library.')
+    parser.add_option(
+        '--destdir',
+        metavar='PATH',
+        help='write output to the specified directory. An HTML '
+        'report is generated here along with supporting files; '
+        'any existing report will be overwritten.')
+    parser.add_option(
+        '--library',
+        metavar='PATH',
+        help='if specified, process symbols in the library at '
+        'the specified path. Mutually exclusive with --nm-in.')
+    parser.add_option(
+        '--pak',
+        metavar='PATH',
+        help='if specified, includes the contents of the '
+        'specified *.pak file in the output.')
+    parser.add_option(
+        '--nm-binary',
+        help='use the specified nm binary to analyze library. '
+        'This is to be used when the nm in the path is not for '
+        'the right architecture or of the right version.')
+    parser.add_option(
+        '--addr2line-binary',
+        help='use the specified addr2line binary to analyze '
+        'library. This is to be used when the addr2line in '
+        'the path is not for the right architecture or '
+        'of the right version.')
+    parser.add_option(
+        '--jobs',
+        type='int',
+        help='number of jobs to use for the parallel '
+        'addr2line processing pool; defaults to 1. More '
+        'jobs greatly improve throughput but eat RAM like '
+        'popcorn, and take several gigabytes each. Start low '
+        'and ramp this number up until your machine begins to '
+        'struggle with RAM. '
+        'This argument is only valid when using --library.')
+    parser.add_option(
+        '-v',
+        '--verbose',
+        dest='verbose',
+        action='store_true',
+        help='be verbose, printing lots of status information.')
+    parser.add_option(
+        '--nm-out',
+        metavar='PATH',
+        help='(deprecated) No-op. nm.out is stored in --destdir.')
+    parser.add_option(
+        '--no-nm-out',
+        action='store_true',
+        help='do not keep the nm output file. This file is useful '
+        'if you want to see the fully processed nm output after '
+        'the symbols have been mapped to source locations, or if '
+        'you plan to run explain_binary_size_delta.py. By default '
+        'the file \'nm.out\' is placed alongside the generated '
+        'report. The nm.out file is only created when using '
+        '--library.')
+    parser.add_option(
+        '--disable-disambiguation',
+        action='store_true',
+        help='disables the disambiguation process altogether,'
+        ' NOTE: this may, depending on your toolchain, produce'
+        ' output with some symbols at the top layer if addr2line'
+        ' could not get the entire source path.')
+    parser.add_option(
+        '--source-path',
+        default='./',
+        help='the path to the source code of the output binary, '
+        'default set to current directory. Used in the'
+        ' disambiguation process.')
+    opts, _args = parser.parse_args()
 
-  if ((not opts.library) and (not opts.nm_in)) or (opts.library and opts.nm_in):
-    parser.error('exactly one of --library or --nm-in is required')
-  if opts.nm_out:
-    print >> sys.stderr, ('WARNING: --nm-out is deprecated and has no effect.')
-  if (opts.nm_in):
-    if opts.jobs:
-      print >> sys.stderr, ('WARNING: --jobs has no effect '
-                            'when used with --nm-in')
-  if not opts.destdir:
-    parser.error('--destdir is a required argument')
-  if not opts.jobs:
-    # Use the number of processors but cap between 2 and 4 since raw
-    # CPU power isn't the limiting factor. It's I/O limited, memory
-    # bus limited and available-memory-limited. Too many processes and
-    # the computer will run out of memory and it will be slow.
-    opts.jobs = max(2, min(4, str(multiprocessing.cpu_count())))
+    if ((not opts.library) and
+        (not opts.nm_in)) or (opts.library and opts.nm_in):
+        parser.error('exactly one of --library or --nm-in is required')
+    if opts.nm_out:
+        print >> sys.stderr, (
+            'WARNING: --nm-out is deprecated and has no effect.')
+    if (opts.nm_in):
+        if opts.jobs:
+            print >> sys.stderr, ('WARNING: --jobs has no effect '
+                                  'when used with --nm-in')
+    if not opts.destdir:
+        parser.error('--destdir is a required argument')
+    if not opts.jobs:
+        # Use the number of processors but cap between 2 and 4 since raw
+        # CPU power isn't the limiting factor. It's I/O limited, memory
+        # bus limited and available-memory-limited. Too many processes and
+        # the computer will run out of memory and it will be slow.
+        opts.jobs = max(2, min(4, str(multiprocessing.cpu_count())))
 
-  if opts.addr2line_binary:
-    assert os.path.isfile(opts.addr2line_binary)
-    addr2line_binary = opts.addr2line_binary
-  else:
-    addr2line_binary = _find_in_system_path('addr2line')
-    assert addr2line_binary, 'Unable to find addr2line in the path. '\
-        'Use --addr2line-binary to specify location.'
+    if opts.addr2line_binary:
+        assert os.path.isfile(opts.addr2line_binary)
+        addr2line_binary = opts.addr2line_binary
+    else:
+        addr2line_binary = _find_in_system_path('addr2line')
+        assert addr2line_binary, 'Unable to find addr2line in the path. '\
+            'Use --addr2line-binary to specify location.'
 
-  if opts.nm_binary:
-    assert os.path.isfile(opts.nm_binary)
-    nm_binary = opts.nm_binary
-  else:
-    nm_binary = _find_in_system_path('nm')
-    assert nm_binary, 'Unable to find nm in the path. Use --nm-binary '\
-        'to specify location.'
+    if opts.nm_binary:
+        assert os.path.isfile(opts.nm_binary)
+        nm_binary = opts.nm_binary
+    else:
+        nm_binary = _find_in_system_path('nm')
+        assert nm_binary, 'Unable to find nm in the path. Use --nm-binary '\
+            'to specify location.'
 
-  if opts.pak:
-    assert os.path.isfile(opts.pak), 'Could not find ' % opts.pak
+    if opts.pak:
+        assert os.path.isfile(opts.pak), 'Could not find ' % opts.pak
 
-  print('addr2line: %s' % addr2line_binary)
-  print('nm: %s' % nm_binary)
+    print('addr2line: %s' % addr2line_binary)
+    print('nm: %s' % nm_binary)
 
-  if opts.library:
-    CheckDebugFormatSupport(opts.library, addr2line_binary)
+    if opts.library:
+        CheckDebugFormatSupport(opts.library, addr2line_binary)
 
-  # Prepare output directory and report guts
-  if not os.path.exists(opts.destdir):
-    os.makedirs(opts.destdir, 0755)
-  nm_out = os.path.join(opts.destdir, 'nm.out')
-  if opts.no_nm_out:
-    nm_out = None
+    # Prepare output directory and report guts
+    if not os.path.exists(opts.destdir):
+        os.makedirs(opts.destdir, 0755)
+    nm_out = os.path.join(opts.destdir, 'nm.out')
+    if opts.no_nm_out:
+        nm_out = None
 
-  # Copy report boilerplate into output directory. This also proves that the
-  # output directory is safe for writing, so there should be no problems writing
-  # the nm.out file later.
-  data_js_file_name = os.path.join(opts.destdir, 'data.js')
-  d3_out = os.path.join(opts.destdir, 'd3')
-  if not os.path.exists(d3_out):
-    os.makedirs(d3_out, 0755)
-  d3_src = os.path.join(os.path.dirname(__file__),
-                        '..',
-                        '..',
-                        'd3', 'src')
-  template_src = os.path.join(os.path.dirname(__file__),
-                              'template')
-  shutil.copy(os.path.join(d3_src, 'LICENSE'), d3_out)
-  shutil.copy(os.path.join(d3_src, 'd3.js'), d3_out)
-  shutil.copy(os.path.join(template_src, 'index.html'), opts.destdir)
-  shutil.copy(os.path.join(template_src, 'D3SymbolTreeMap.js'), opts.destdir)
+    # Copy report boilerplate into output directory. This also proves that the
+    # output directory is safe for writing, so there should be no problems writing
+    # the nm.out file later.
+    data_js_file_name = os.path.join(opts.destdir, 'data.js')
+    d3_out = os.path.join(opts.destdir, 'd3')
+    if not os.path.exists(d3_out):
+        os.makedirs(d3_out, 0755)
+    d3_src = os.path.join(os.path.dirname(__file__), '..', '..', 'd3', 'src')
+    template_src = os.path.join(os.path.dirname(__file__), 'template')
+    shutil.copy(os.path.join(d3_src, 'LICENSE'), d3_out)
+    shutil.copy(os.path.join(d3_src, 'd3.js'), d3_out)
+    shutil.copy(os.path.join(template_src, 'index.html'), opts.destdir)
+    shutil.copy(os.path.join(template_src, 'D3SymbolTreeMap.js'), opts.destdir)
 
-  # Run nm and/or addr2line to gather the data
-  symbols = GetNmSymbols(opts.nm_in, nm_out, opts.library,
-                         opts.jobs, opts.verbose is True,
-                         addr2line_binary, nm_binary,
-                         opts.disable_disambiguation is None,
-                         opts.source_path)
+    # Run nm and/or addr2line to gather the data
+    symbols = GetNmSymbols(opts.nm_in, nm_out, opts.library, opts.jobs,
+                           opts.verbose is True, addr2line_binary, nm_binary,
+                           opts.disable_disambiguation is None,
+                           opts.source_path)
 
-  # Post-processing
-  if opts.pak:
-    AddPakData(symbols, opts.pak)
-  if opts.library:
-    symbol_path_origin_dir = os.path.dirname(os.path.abspath(opts.library))
-  else:
-    # Just a guess. Hopefully all paths in the input file are absolute.
-    symbol_path_origin_dir = os.path.abspath(os.getcwd())
-  # Dump JSON for the HTML report.
-  DumpCompactTree(symbols, symbol_path_origin_dir, data_js_file_name)
-  print 'Report saved to ' + opts.destdir + '/index.html'
+    # Post-processing
+    if opts.pak:
+        AddPakData(symbols, opts.pak)
+    if opts.library:
+        symbol_path_origin_dir = os.path.dirname(os.path.abspath(opts.library))
+    else:
+        # Just a guess. Hopefully all paths in the input file are absolute.
+        symbol_path_origin_dir = os.path.abspath(os.getcwd())
+    # Dump JSON for the HTML report.
+    DumpCompactTree(symbols, symbol_path_origin_dir, data_js_file_name)
+    print 'Report saved to ' + opts.destdir + '/index.html'
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/runtime/tools/android_finder.py b/runtime/tools/android_finder.py
index 93c53fc..c3d8249 100755
--- a/runtime/tools/android_finder.py
+++ b/runtime/tools/android_finder.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Find an Android device with a given ABI.
 
@@ -20,210 +19,222 @@
 import traceback
 import utils
 
-
 DEBUG = False
 VERBOSE = False
 
 
 def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option(
-      "-a", "--abi",
-      action="store", type="string",
-      help="Desired ABI. armeabi-v7a or x86.")
-  result.add_option(
-      "-b", "--bootstrap",
-      help='Bootstrap - create an emulator, installing SDK packages if needed.',
-      default=False, action="store_true")
-  result.add_option(
-      "-d", "--debug",
-      help='Turn on debugging diagnostics.',
-      default=False, action="store_true")
-  result.add_option(
-      "-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  return result
+    result = optparse.OptionParser()
+    result.add_option(
+        "-a",
+        "--abi",
+        action="store",
+        type="string",
+        help="Desired ABI. armeabi-v7a or x86.")
+    result.add_option(
+        "-b",
+        "--bootstrap",
+        help=
+        'Bootstrap - create an emulator, installing SDK packages if needed.',
+        default=False,
+        action="store_true")
+    result.add_option(
+        "-d",
+        "--debug",
+        help='Turn on debugging diagnostics.',
+        default=False,
+        action="store_true")
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    return result
 
 
 def ProcessOptions(options):
-  global DEBUG
-  DEBUG = options.debug
-  global VERBOSE
-  VERBOSE = options.verbose
-  if options.abi is None:
-    sys.stderr.write('--abi not specified.\n')
-    return False
-  return True
+    global DEBUG
+    DEBUG = options.debug
+    global VERBOSE
+    VERBOSE = options.verbose
+    if options.abi is None:
+        sys.stderr.write('--abi not specified.\n')
+        return False
+    return True
 
 
 def ParseAndroidListSdkResult(text):
-  """
+    """
   Parse the output of an 'android list sdk' command.
 
   Return list of (id-num, id-key, type, description).
   """
-  header_regex = re.compile(
-      r'Packages available for installation or update: \d+\n')
-  packages = re.split(header_regex, text)
-  if len(packages) != 2:
-    raise utils.Error("Could not get a list of packages to install")
-  entry_regex = re.compile(
-      r'^id\: (\d+) or "([^"]*)"\n\s*Type\: ([^\n]*)\n\s*Desc\: (.*)')
-  entries = []
-  for entry in packages[1].split('----------\n'):
-    match = entry_regex.match(entry)
-    if match == None:
-      continue
-    entries.append((int(match.group(1)), match.group(2), match.group(3),
-        match.group(4)))
-  return entries
+    header_regex = re.compile(
+        r'Packages available for installation or update: \d+\n')
+    packages = re.split(header_regex, text)
+    if len(packages) != 2:
+        raise utils.Error("Could not get a list of packages to install")
+    entry_regex = re.compile(
+        r'^id\: (\d+) or "([^"]*)"\n\s*Type\: ([^\n]*)\n\s*Desc\: (.*)')
+    entries = []
+    for entry in packages[1].split('----------\n'):
+        match = entry_regex.match(entry)
+        if match == None:
+            continue
+        entries.append((int(match.group(1)), match.group(2), match.group(3),
+                        match.group(4)))
+    return entries
 
 
 def AndroidListSdk():
-  return ParseAndroidListSdkResult(utils.RunCommand(
-      ["android", "list", "sdk", "-a", "-e"]))
+    return ParseAndroidListSdkResult(
+        utils.RunCommand(["android", "list", "sdk", "-a", "-e"]))
 
 
 def AndroidSdkFindPackage(packages, key):
-  """
+    """
   Args:
     packages: list of (id-num, id-key, type, description).
     key: (id-key, type, description-prefix).
   """
-  (key_id, key_type, key_description_prefix) = key
-  for package in packages:
-    (package_num, package_id, package_type, package_description) = package
-    if (package_id == key_id and package_type == key_type
-        and package_description.startswith(key_description_prefix)):
-      return package
-  return None
+    (key_id, key_type, key_description_prefix) = key
+    for package in packages:
+        (package_num, package_id, package_type, package_description) = package
+        if (package_id == key_id and package_type == key_type and
+                package_description.startswith(key_description_prefix)):
+            return package
+    return None
 
 
 def EnsureSdkPackageInstalled(packages, key):
-  """
+    """
   Makes sure the package with a given key is installed.
 
   key is (id-key, type, description-prefix)
 
   Returns True if the package was not already installed.
   """
-  entry = AndroidSdkFindPackage(packages, key)
-  if entry is None:
-    raise utils.Error("Could not find a package for key %s" % key)
-  packageId = entry[0]
-  if VERBOSE:
-    sys.stderr.write('Checking Android SDK package %s...\n' % str(entry))
-  out = utils.RunCommand(
-      ["android", "update", "sdk", "-a", "-u", "--filter", str(packageId)])
-  return '\nInstalling Archives:\n' in out
+    entry = AndroidSdkFindPackage(packages, key)
+    if entry is None:
+        raise utils.Error("Could not find a package for key %s" % key)
+    packageId = entry[0]
+    if VERBOSE:
+        sys.stderr.write('Checking Android SDK package %s...\n' % str(entry))
+    out = utils.RunCommand(
+        ["android", "update", "sdk", "-a", "-u", "--filter",
+         str(packageId)])
+    return '\nInstalling Archives:\n' in out
 
 
 def SdkPackagesForAbi(abi):
-  packagesForAbi = {
-    'armeabi-v7a': [
-      # The platform needed to install the armeabi ABI system image:
-      ('android-15', 'Platform',  'Android SDK Platform 4.0.3'),
-      # The armeabi-v7a ABI system image:
-      ('sysimg-15', 'SystemImage',  'Android SDK Platform 4.0.3')
-    ],
-    'x86': [
-      # The platform needed to install the x86 ABI system image:
-      ('android-15', 'Platform',  'Android SDK Platform 4.0.3'),
-      # The x86 ABI system image:
-      ('sysimg-15', 'SystemImage',  'Android SDK Platform 4.0.4')
-    ]
-  }
+    packagesForAbi = {
+        'armeabi-v7a': [
+            # The platform needed to install the armeabi ABI system image:
+            ('android-15', 'Platform', 'Android SDK Platform 4.0.3'),
+            # The armeabi-v7a ABI system image:
+            ('sysimg-15', 'SystemImage', 'Android SDK Platform 4.0.3')
+        ],
+        'x86': [
+            # The platform needed to install the x86 ABI system image:
+            ('android-15', 'Platform', 'Android SDK Platform 4.0.3'),
+            # The x86 ABI system image:
+            ('sysimg-15', 'SystemImage', 'Android SDK Platform 4.0.4')
+        ]
+    }
 
-  if abi not in packagesForAbi:
-    raise utils.Error('Unsupported abi %s' % abi)
-  return packagesForAbi[abi]
+    if abi not in packagesForAbi:
+        raise utils.Error('Unsupported abi %s' % abi)
+    return packagesForAbi[abi]
 
 
 def TargetForAbi(abi):
-  for package in SdkPackagesForAbi(abi):
-    if package[1] == 'Platform':
-      return package[0]
+    for package in SdkPackagesForAbi(abi):
+        if package[1] == 'Platform':
+            return package[0]
 
 
 def EnsureAndroidSdkPackagesInstalled(abi):
-  """Return true if at least one package was not already installed."""
-  abiPackageList = SdkPackagesForAbi(abi)
-  installedSomething = False
-  packages = AndroidListSdk()
-  for package in abiPackageList:
-    installedSomething |= EnsureSdkPackageInstalled(packages, package)
-  return installedSomething
+    """Return true if at least one package was not already installed."""
+    abiPackageList = SdkPackagesForAbi(abi)
+    installedSomething = False
+    packages = AndroidListSdk()
+    for package in abiPackageList:
+        installedSomething |= EnsureSdkPackageInstalled(packages, package)
+    return installedSomething
 
 
 def ParseAndroidListAvdResult(text):
-  """
+    """
   Parse the output of an 'android list avd' command.
   Return List of {Name: Path: Target: ABI: Skin: Sdcard:}
   """
-  text = text.split('Available Android Virtual Devices:\n')[-1]
-  text = text.split(
-      'The following Android Virtual Devices could not be loaded:\n')[0]
-  result = []
-  line_re = re.compile(r'^\s*([^\:]+)\:\s*(.*)$')
-  for chunk in text.split('\n---------\n'):
-    entry = {}
-    for line in chunk.split('\n'):
-      line = line.strip()
-      if len(line) == 0:
-        continue
-      match = line_re.match(line)
-      if match is None:
-        sys.stderr.write('Match fail %s\n' % str(line))
-        continue
-        #raise utils.Error('Match failed')
-      entry[match.group(1)] = match.group(2)
-    if len(entry) > 0:
-      result.append(entry)
-  return result
+    text = text.split('Available Android Virtual Devices:\n')[-1]
+    text = text.split(
+        'The following Android Virtual Devices could not be loaded:\n')[0]
+    result = []
+    line_re = re.compile(r'^\s*([^\:]+)\:\s*(.*)$')
+    for chunk in text.split('\n---------\n'):
+        entry = {}
+        for line in chunk.split('\n'):
+            line = line.strip()
+            if len(line) == 0:
+                continue
+            match = line_re.match(line)
+            if match is None:
+                sys.stderr.write('Match fail %s\n' % str(line))
+                continue
+                #raise utils.Error('Match failed')
+            entry[match.group(1)] = match.group(2)
+        if len(entry) > 0:
+            result.append(entry)
+    return result
 
 
 def AndroidListAvd():
-  """Returns a list of available Android Virtual Devices."""
-  return ParseAndroidListAvdResult(utils.RunCommand(["android", "list", "avd"]))
+    """Returns a list of available Android Virtual Devices."""
+    return ParseAndroidListAvdResult(
+        utils.RunCommand(["android", "list", "avd"]))
 
 
 def FindAvd(avds, key):
-  for avd in avds:
-    if avd['Name'] == key:
-      return avd
-  return None
+    for avd in avds:
+        if avd['Name'] == key:
+            return avd
+    return None
 
 
 def CreateAvd(avdName, abi):
-  out = utils.RunCommand(["android", "create", "avd", "--name", avdName,
-                          "--target", TargetForAbi(abi), '--abi', abi],
-                         input="no\n")
-  if out.find('Created AVD ') < 0:
-    if VERBOSE:
-        sys.stderr.write('Could not create AVD:\n%s\n' % out)
-    raise utils.Error('Could not create AVD')
+    out = utils.RunCommand([
+        "android", "create", "avd", "--name", avdName, "--target",
+        TargetForAbi(abi), '--abi', abi
+    ],
+                           input="no\n")
+    if out.find('Created AVD ') < 0:
+        if VERBOSE:
+            sys.stderr.write('Could not create AVD:\n%s\n' % out)
+        raise utils.Error('Could not create AVD')
 
 
 def AvdExists(avdName):
-  avdList = AndroidListAvd()
-  return FindAvd(avdList, avdName) is not None
+    avdList = AndroidListAvd()
+    return FindAvd(avdList, avdName) is not None
 
 
 def EnsureAvdExists(avdName, abi):
-  if AvdExists(avdName):
-    return
-  if VERBOSE:
-    sys.stderr.write('Checking SDK packages...\n')
-  if EnsureAndroidSdkPackagesInstalled(abi):
-    # Installing a new package could have made a previously invalid AVD valid
     if AvdExists(avdName):
         return
-  CreateAvd(avdName, abi)
+    if VERBOSE:
+        sys.stderr.write('Checking SDK packages...\n')
+    if EnsureAndroidSdkPackagesInstalled(abi):
+        # Installing a new package could have made a previously invalid AVD valid
+        if AvdExists(avdName):
+            return
+    CreateAvd(avdName, abi)
 
 
 def StartEmulator(abi, avdName, pollFn):
-  """
+    """
   Start an emulator for a given abi and svdName.
 
   Echo the emulator's stderr and stdout output to our stderr.
@@ -238,135 +249,144 @@
   three levels of nested python scripts.) Calling the ABI-specific versions
   of the emulator directly works around this bug.
   """
-  emulatorName = {'x86' : 'emulator-x86', 'armeabi-v7a': 'emulator-arm'}[abi]
-  command = [emulatorName, '-avd', avdName, '-no-boot-anim', '-no-window']
-  utils.RunCommand(command, pollFn=pollFn, killOnEarlyReturn=False,
-          outStream=sys.stderr, errStream=sys.stderr)
+    emulatorName = {'x86': 'emulator-x86', 'armeabi-v7a': 'emulator-arm'}[abi]
+    command = [emulatorName, '-avd', avdName, '-no-boot-anim', '-no-window']
+    utils.RunCommand(
+        command,
+        pollFn=pollFn,
+        killOnEarlyReturn=False,
+        outStream=sys.stderr,
+        errStream=sys.stderr)
 
 
 def ParseAndroidDevices(text):
-  """Return Dictionary [name] -> status"""
-  text = text.split('List of devices attached')[-1]
-  lines = [line.strip() for line in text.split('\n')]
-  lines = [line for line in lines if len(line) > 0]
-  devices = {}
-  for line in lines:
-    lineItems = line.split('\t')
-    devices[lineItems[0]] = lineItems[1]
-  return devices
+    """Return Dictionary [name] -> status"""
+    text = text.split('List of devices attached')[-1]
+    lines = [line.strip() for line in text.split('\n')]
+    lines = [line for line in lines if len(line) > 0]
+    devices = {}
+    for line in lines:
+        lineItems = line.split('\t')
+        devices[lineItems[0]] = lineItems[1]
+    return devices
 
 
 def GetAndroidDevices():
-  return ParseAndroidDevices(utils.RunCommand(["adb", "devices"]))
+    return ParseAndroidDevices(utils.RunCommand(["adb", "devices"]))
 
 
 def FilterOfflineDevices(devices):
-  online = {}
-  for device in devices.keys():
-    status = devices[device]
-    if status != 'offline':
-      online[device] = status
-  return online
+    online = {}
+    for device in devices.keys():
+        status = devices[device]
+        if status != 'offline':
+            online[device] = status
+    return online
 
 
 def GetOnlineAndroidDevices():
-  return FilterOfflineDevices(GetAndroidDevices())
+    return FilterOfflineDevices(GetAndroidDevices())
 
 
 def GetAndroidDeviceProperty(device, property):
-  return utils.RunCommand(
-      ["adb", "-s", device, "shell", "getprop", property]).strip()
+    return utils.RunCommand(["adb", "-s", device, "shell", "getprop",
+                             property]).strip()
 
 
 def GetAndroidDeviceAbis(device):
-  abis = []
-  for property in ['ro.product.cpu.abi', 'ro.product.cpu.abi2']:
-    out = GetAndroidDeviceProperty(device, property)
-    if len(out) > 0:
-      abis.append(out)
-  return abis
+    abis = []
+    for property in ['ro.product.cpu.abi', 'ro.product.cpu.abi2']:
+        out = GetAndroidDeviceProperty(device, property)
+        if len(out) > 0:
+            abis.append(out)
+    return abis
 
 
 def FindAndroidRunning(abi):
-  for device in GetOnlineAndroidDevices().keys():
-    if abi in GetAndroidDeviceAbis(device):
-      return device
-  return None
+    for device in GetOnlineAndroidDevices().keys():
+        if abi in GetAndroidDeviceAbis(device):
+            return device
+    return None
 
 
 def AddSdkToolsToPath():
-  script_dir = os.path.dirname(sys.argv[0])
-  dart_root = os.path.realpath(os.path.join(script_dir, '..', '..'))
-  third_party_root = os.path.join(dart_root, 'third_party')
-  android_tools = os.path.join(third_party_root, 'android_tools')
-  android_sdk_root = os.path.join(android_tools, 'sdk')
-  android_sdk_tools = os.path.join(android_sdk_root, 'tools')
-  android_sdk_platform_tools = os.path.join(android_sdk_root, 'platform-tools')
-  os.environ['PATH'] = ':'.join([
-      os.environ['PATH'], android_sdk_tools, android_sdk_platform_tools])
-  # Remove any environment variables that would affect our build.
-  for i in ['ANDROID_NDK_ROOT', 'ANDROID_SDK_ROOT', 'ANDROID_TOOLCHAIN',
-            'AR', 'BUILDTYPE', 'CC', 'CXX', 'GYP_DEFINES',
-            'LD_LIBRARY_PATH', 'LINK', 'MAKEFLAGS', 'MAKELEVEL',
-            'MAKEOVERRIDES', 'MFLAGS', 'NM']:
-    if i in os.environ:
-      del os.environ[i]
+    script_dir = os.path.dirname(sys.argv[0])
+    dart_root = os.path.realpath(os.path.join(script_dir, '..', '..'))
+    third_party_root = os.path.join(dart_root, 'third_party')
+    android_tools = os.path.join(third_party_root, 'android_tools')
+    android_sdk_root = os.path.join(android_tools, 'sdk')
+    android_sdk_tools = os.path.join(android_sdk_root, 'tools')
+    android_sdk_platform_tools = os.path.join(android_sdk_root,
+                                              'platform-tools')
+    os.environ['PATH'] = ':'.join(
+        [os.environ['PATH'], android_sdk_tools, android_sdk_platform_tools])
+    # Remove any environment variables that would affect our build.
+    for i in [
+            'ANDROID_NDK_ROOT', 'ANDROID_SDK_ROOT', 'ANDROID_TOOLCHAIN', 'AR',
+            'BUILDTYPE', 'CC', 'CXX', 'GYP_DEFINES', 'LD_LIBRARY_PATH', 'LINK',
+            'MAKEFLAGS', 'MAKELEVEL', 'MAKEOVERRIDES', 'MFLAGS', 'NM'
+    ]:
+        if i in os.environ:
+            del os.environ[i]
 
 
 def FindAndroid(abi, bootstrap):
-  if VERBOSE:
-    sys.stderr.write('Looking for an Android device running abi %s...\n' % abi)
-  AddSdkToolsToPath()
-  device = FindAndroidRunning(abi)
-  if not device:
-    if bootstrap:
-      if VERBOSE:
-        sys.stderr.write("No emulator found, try to create one.\n")
-      avdName = 'dart-build-%s' % abi
-      EnsureAvdExists(avdName, abi)
+    if VERBOSE:
+        sys.stderr.write(
+            'Looking for an Android device running abi %s...\n' % abi)
+    AddSdkToolsToPath()
+    device = FindAndroidRunning(abi)
+    if not device:
+        if bootstrap:
+            if VERBOSE:
+                sys.stderr.write("No emulator found, try to create one.\n")
+            avdName = 'dart-build-%s' % abi
+            EnsureAvdExists(avdName, abi)
 
-      # It takes a while to start up an emulator.
-      # Provide feedback while we wait.
-      pollResult = [None]
-      def pollFunction():
-        if VERBOSE:
-          sys.stderr.write('.')
-        pollResult[0] = FindAndroidRunning(abi)
-        # Stop polling once we have our result.
-        return pollResult[0] != None
-      StartEmulator(abi, avdName, pollFunction)
-      device = pollResult[0]
-  return device
+            # It takes a while to start up an emulator.
+            # Provide feedback while we wait.
+            pollResult = [None]
+
+            def pollFunction():
+                if VERBOSE:
+                    sys.stderr.write('.')
+                pollResult[0] = FindAndroidRunning(abi)
+                # Stop polling once we have our result.
+                return pollResult[0] != None
+
+            StartEmulator(abi, avdName, pollFunction)
+            device = pollResult[0]
+    return device
 
 
 def Main():
-  # Parse options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if not ProcessOptions(options):
-    parser.print_help()
-    return 1
+    # Parse options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if not ProcessOptions(options):
+        parser.print_help()
+        return 1
 
-  # If there are additional arguments, report error and exit.
-  if args:
-    parser.print_help()
-    return 1
+    # If there are additional arguments, report error and exit.
+    if args:
+        parser.print_help()
+        return 1
 
-  try:
-    device = FindAndroid(options.abi, options.bootstrap)
-    if device != None:
-      sys.stdout.write("%s\n" % device)
-      return 0
-    else:
-      if VERBOSE:
-        sys.stderr.write('Could not find device\n')
-      return 2
-  except utils.Error as e:
-    sys.stderr.write("error: %s\n" % e)
-    if DEBUG:
-      traceback.print_exc(file=sys.stderr)
-    return -1
+    try:
+        device = FindAndroid(options.abi, options.bootstrap)
+        if device != None:
+            sys.stdout.write("%s\n" % device)
+            return 0
+        else:
+            if VERBOSE:
+                sys.stderr.write('Could not find device\n')
+            return 2
+    except utils.Error as e:
+        sys.stderr.write("error: %s\n" % e)
+        if DEBUG:
+            traceback.print_exc(file=sys.stderr)
+        return -1
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/runtime/tools/benchmark.py b/runtime/tools/benchmark.py
index b3a587f..313a0d9 100755
--- a/runtime/tools/benchmark.py
+++ b/runtime/tools/benchmark.py
@@ -15,116 +15,133 @@
 import utils
 import re
 
-
 HOST_OS = utils.GuessOS()
 HOST_CPUS = utils.GuessCpus()
 
+
 # Returns whether 'bench' matches any element in the 'filt' list.
 def match(bench, filt):
-  bench = bench.lower();
-  for element in filt:
-    if element.search(bench):
-      return True
-  return False
+    bench = bench.lower()
+    for element in filt:
+        if element.search(bench):
+            return True
+    return False
+
 
 def GetBenchmarkFile(path):
-  benchmark_root_path = [dirname(sys.argv[0]), '..', '..'] + ['benchmarks']
-  return realpath(os.path.sep.join(benchmark_root_path + path))
+    benchmark_root_path = [dirname(sys.argv[0]), '..', '..'] + ['benchmarks']
+    return realpath(os.path.sep.join(benchmark_root_path + path))
+
 
 def ReadBenchmarkList(mode, path, core):
-  filename = GetBenchmarkFile([path])
-  benchmarks = dict()
-  execfile(filename, benchmarks)
-  if (mode == "release") and not core:
-    return benchmarks['SUPPORTED_BENCHMARKS']
-  else:
-    return benchmarks['SUPPORTED_CORE_BENCHMARKS']
+    filename = GetBenchmarkFile([path])
+    benchmarks = dict()
+    execfile(filename, benchmarks)
+    if (mode == "release") and not core:
+        return benchmarks['SUPPORTED_BENCHMARKS']
+    else:
+        return benchmarks['SUPPORTED_CORE_BENCHMARKS']
+
 
 def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option("-m", "--mode",
-      help='Build variants (comma-separated).',
-      metavar='[all,debug,release]',
-      default='release')
-  result.add_option("-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  result.add_option("-c", "--core",
-      help='Run only core benchmarks.',
-      default=False, action="store_true")
-  result.add_option("--arch",
-      help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm,dartc]',
-      default=utils.GuessArchitecture())
-  result.add_option("--executable",
-      help='Virtual machine to execute.',
-      metavar='[dart, (path to dart binary)]',
-      default=None)
-  result.add_option("-w", "--warmup",
-      help='Only run the warmup period.',
-      default=False, action="store_true")
-  return result
+    result = optparse.OptionParser()
+    result.add_option(
+        "-m",
+        "--mode",
+        help='Build variants (comma-separated).',
+        metavar='[all,debug,release]',
+        default='release')
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    result.add_option(
+        "-c",
+        "--core",
+        help='Run only core benchmarks.',
+        default=False,
+        action="store_true")
+    result.add_option(
+        "--arch",
+        help='Target architectures (comma-separated).',
+        metavar='[all,ia32,x64,simarm,arm,dartc]',
+        default=utils.GuessArchitecture())
+    result.add_option(
+        "--executable",
+        help='Virtual machine to execute.',
+        metavar='[dart, (path to dart binary)]',
+        default=None)
+    result.add_option(
+        "-w",
+        "--warmup",
+        help='Only run the warmup period.',
+        default=False,
+        action="store_true")
+    return result
 
 
 def ProcessOptions(options):
-  if options.arch == 'all':
-    options.arch = 'ia32,x64,simarm,dartc'
-  if options.mode == 'all':
-    options.mode = 'debug,release'
-  options.mode = options.mode.split(',')
-  options.arch = options.arch.split(',')
-  for mode in options.mode:
-    if not mode in ['debug', 'release']:
-      print "Unknown mode %s" % mode
-      return False
-  for arch in options.arch:
-    if not arch in ['ia32', 'x64', 'simarm', 'arm', 'dartc']:
-      print "Unknown arch %s" % arch
-      return False
-  return True
+    if options.arch == 'all':
+        options.arch = 'ia32,x64,simarm,dartc'
+    if options.mode == 'all':
+        options.mode = 'debug,release'
+    options.mode = options.mode.split(',')
+    options.arch = options.arch.split(',')
+    for mode in options.mode:
+        if not mode in ['debug', 'release']:
+            print "Unknown mode %s" % mode
+            return False
+    for arch in options.arch:
+        if not arch in ['ia32', 'x64', 'simarm', 'arm', 'dartc']:
+            print "Unknown arch %s" % arch
+            return False
+    return True
 
 
 def GetBuildRoot(mode, arch):
-  return utils.GetBuildRoot(HOST_OS, mode, arch)
+    return utils.GetBuildRoot(HOST_OS, mode, arch)
+
 
 def GetDart(mode, arch):
-  executable = [abspath(join(GetBuildRoot(mode, arch), 'dart'))]
-  return executable
+    executable = [abspath(join(GetBuildRoot(mode, arch), 'dart'))]
+    return executable
+
 
 def Main():
-  # Parse the options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if not ProcessOptions(options):
-    parser.print_help()
-    return 1
+    # Parse the options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if not ProcessOptions(options):
+        parser.print_help()
+        return 1
 
-  chosen_benchmarks = ReadBenchmarkList(options.mode,
-      'BENCHMARKS',
-      options.core)
+    chosen_benchmarks = ReadBenchmarkList(options.mode, 'BENCHMARKS',
+                                          options.core)
 
-  # Use arguments to filter the benchmarks.
-  if len(args) > 0:
-    filt = [re.compile(x.lower()) for x in args]
-    chosen_benchmarks = [b for b in chosen_benchmarks if match(b[0], filt)]
+    # Use arguments to filter the benchmarks.
+    if len(args) > 0:
+        filt = [re.compile(x.lower()) for x in args]
+        chosen_benchmarks = [b for b in chosen_benchmarks if match(b[0], filt)]
 
-  for mode in options.mode:
-    for arch in options.arch:
-      if options.executable is None:
-        # Construct the path to the dart binary.
-        executable = GetDart(mode, arch)
-      else:
-        executable = [options.executable]
-      for benchmark, vmargs, progargs in chosen_benchmarks:
-        command = executable
-        command = command + [
-                     GetBenchmarkFile([benchmark, 'dart', benchmark + '.dart']),
-                  ]
-        if options.verbose:
-          print ' '.join(command)
-        subprocess.call(command)
-  return 0
+    for mode in options.mode:
+        for arch in options.arch:
+            if options.executable is None:
+                # Construct the path to the dart binary.
+                executable = GetDart(mode, arch)
+            else:
+                executable = [options.executable]
+            for benchmark, vmargs, progargs in chosen_benchmarks:
+                command = executable
+                command = command + [
+                    GetBenchmarkFile([benchmark, 'dart', benchmark + '.dart']),
+                ]
+                if options.verbose:
+                    print ' '.join(command)
+                subprocess.call(command)
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/runtime/tools/bin_to_assembly.py b/runtime/tools/bin_to_assembly.py
index 8bc5d8c..fc539e3 100755
--- a/runtime/tools/bin_to_assembly.py
+++ b/runtime/tools/bin_to_assembly.py
@@ -11,125 +11,124 @@
 import sys
 from optparse import OptionParser
 
+
 def Main():
-  parser = OptionParser()
-  parser.add_option("--output",
-                    action="store", type="string",
-                    help="output assembly file name")
-  parser.add_option("--input",
-                    action="store", type="string",
-                    help="input binary blob file")
-  parser.add_option("--symbol_name",
-                    action="store", type="string")
-  parser.add_option("--executable",
-                    action="store_true", default=False)
-  parser.add_option("--target_os",
-                    action="store", type="string")
-  parser.add_option("--size_symbol_name",
-                    action="store", type="string")
-  parser.add_option("--target_arch",
-                    action="store", type="string")
+    parser = OptionParser()
+    parser.add_option(
+        "--output",
+        action="store",
+        type="string",
+        help="output assembly file name")
+    parser.add_option(
+        "--input", action="store", type="string", help="input binary blob file")
+    parser.add_option("--symbol_name", action="store", type="string")
+    parser.add_option("--executable", action="store_true", default=False)
+    parser.add_option("--target_os", action="store", type="string")
+    parser.add_option("--size_symbol_name", action="store", type="string")
+    parser.add_option("--target_arch", action="store", type="string")
 
-  (options, args) = parser.parse_args()
-  if not options.output:
-    sys.stderr.write("--output not specified\n")
-    parser.print_help();
-    return -1
-  if not options.input:
-    sys.stderr.write("--input not specified\n")
-    parser.print_help();
-    return -1
-  if not os.path.isfile(options.input):
-    sys.stderr.write("input file does not exist: %s\n" % options.input)
-    parser.print_help();
-    return -1
-  if not options.symbol_name:
-    sys.stderr.write("--symbol_name not specified\n")
-    parser.print_help();
-    return -1
-  if not options.target_os:
-    sys.stderr.write("--target_os not specified\n")
-    parser.print_help();
-    return -1
-
-  with open(options.output, "w") as output_file:
-    if options.target_os in ["mac", "ios"]:
-      if options.executable:
-        output_file.write(".text\n")
-      else:
-        output_file.write(".const\n")
-      output_file.write(".global _%s\n" % options.symbol_name)
-      output_file.write(".balign 32\n")
-      output_file.write("_%s:\n" % options.symbol_name)
-    elif options.target_os in ["win"]:
-      output_file.write("ifndef _ML64_X64\n")
-      output_file.write(".model flat, C\n")
-      output_file.write("endif\n")
-      if options.executable:
-        output_file.write(".code\n")
-      else:
-        output_file.write(".const\n")
-      output_file.write("public %s\n" % options.symbol_name)
-      output_file.write("%s label byte\n" % options.symbol_name)
-    else:
-      if options.executable:
-        output_file.write(".text\n")
-        output_file.write(".type %s STT_FUNC\n" % options.symbol_name)
-      else:
-        output_file.write(".section .rodata\n")
-        output_file.write(".type %s STT_OBJECT\n" % options.symbol_name)
-      output_file.write(".global %s\n" % options.symbol_name)
-      output_file.write(".balign 32\n")
-      output_file.write("%s:\n" % options.symbol_name)
-
-    size = 0
-    with open(options.input, "rb") as input_file:
-      if options.target_os in ["win"]:
-        for byte in input_file.read():
-          output_file.write("byte %d\n" % ord(byte))
-          size += 1
-      else:
-        for byte in input_file.read():
-          output_file.write(".byte %d\n" % ord(byte))
-          size += 1
-
-    if options.target_os not in ["mac", "ios", "win"]:
-      output_file.write(".size {0}, .-{0}\n".format(options.symbol_name))
-
-    if options.size_symbol_name:
-      if not options.target_arch:
-        sys.stderr.write("--target_arch not specified\n")
-        parser.print_help();
+    (options, args) = parser.parse_args()
+    if not options.output:
+        sys.stderr.write("--output not specified\n")
+        parser.print_help()
+        return -1
+    if not options.input:
+        sys.stderr.write("--input not specified\n")
+        parser.print_help()
+        return -1
+    if not os.path.isfile(options.input):
+        sys.stderr.write("input file does not exist: %s\n" % options.input)
+        parser.print_help()
+        return -1
+    if not options.symbol_name:
+        sys.stderr.write("--symbol_name not specified\n")
+        parser.print_help()
+        return -1
+    if not options.target_os:
+        sys.stderr.write("--target_os not specified\n")
+        parser.print_help()
         return -1
 
-      is64bit = 0
-      if options.target_arch:
-        if options.target_arch in ["arm64", "x64"]:
-          is64bit = 1
-
-      if options.target_os in ["win"]:
-        output_file.write("public %s\n" % options.size_symbol_name)
-        output_file.write("%s label byte\n" % options.size_symbol_name)
-        if (is64bit == 1):
-          output_file.write("qword %d\n" % size )
-        else:
-          output_file.write("dword %d\n" % size )
-      else:
+    with open(options.output, "w") as output_file:
         if options.target_os in ["mac", "ios"]:
-          output_file.write(".global _%s\n" % options.size_symbol_name)
-          output_file.write("_%s:\n" % options.size_symbol_name)
+            if options.executable:
+                output_file.write(".text\n")
+            else:
+                output_file.write(".const\n")
+            output_file.write(".global _%s\n" % options.symbol_name)
+            output_file.write(".balign 32\n")
+            output_file.write("_%s:\n" % options.symbol_name)
+        elif options.target_os in ["win"]:
+            output_file.write("ifndef _ML64_X64\n")
+            output_file.write(".model flat, C\n")
+            output_file.write("endif\n")
+            if options.executable:
+                output_file.write(".code\n")
+            else:
+                output_file.write(".const\n")
+            output_file.write("public %s\n" % options.symbol_name)
+            output_file.write("%s label byte\n" % options.symbol_name)
         else:
-          output_file.write(".global %s\n" % options.size_symbol_name)
-          output_file.write("%s:\n" % options.size_symbol_name)
-        if (is64bit == 1):
-          output_file.write(".quad %d\n" % size )
-        else:
-          output_file.write(".long %d\n" % size )
+            if options.executable:
+                output_file.write(".text\n")
+                output_file.write(".type %s STT_FUNC\n" % options.symbol_name)
+            else:
+                output_file.write(".section .rodata\n")
+                output_file.write(".type %s STT_OBJECT\n" % options.symbol_name)
+            output_file.write(".global %s\n" % options.symbol_name)
+            output_file.write(".balign 32\n")
+            output_file.write("%s:\n" % options.symbol_name)
 
-    if options.target_os in ["win"]:
-      output_file.write("end\n")
+        size = 0
+        with open(options.input, "rb") as input_file:
+            if options.target_os in ["win"]:
+                for byte in input_file.read():
+                    output_file.write("byte %d\n" % ord(byte))
+                    size += 1
+            else:
+                for byte in input_file.read():
+                    output_file.write(".byte %d\n" % ord(byte))
+                    size += 1
 
-  return 0
+        if options.target_os not in ["mac", "ios", "win"]:
+            output_file.write(".size {0}, .-{0}\n".format(options.symbol_name))
+
+        if options.size_symbol_name:
+            if not options.target_arch:
+                sys.stderr.write("--target_arch not specified\n")
+                parser.print_help()
+                return -1
+
+            is64bit = 0
+            if options.target_arch:
+                if options.target_arch in ["arm64", "x64"]:
+                    is64bit = 1
+
+            if options.target_os in ["win"]:
+                output_file.write("public %s\n" % options.size_symbol_name)
+                output_file.write("%s label byte\n" % options.size_symbol_name)
+                if (is64bit == 1):
+                    output_file.write("qword %d\n" % size)
+                else:
+                    output_file.write("dword %d\n" % size)
+            else:
+                if options.target_os in ["mac", "ios"]:
+                    output_file.write(
+                        ".global _%s\n" % options.size_symbol_name)
+                    output_file.write("_%s:\n" % options.size_symbol_name)
+                else:
+                    output_file.write(".global %s\n" % options.size_symbol_name)
+                    output_file.write("%s:\n" % options.size_symbol_name)
+                if (is64bit == 1):
+                    output_file.write(".quad %d\n" % size)
+                else:
+                    output_file.write(".long %d\n" % size)
+
+        if options.target_os in ["win"]:
+            output_file.write("end\n")
+
+    return 0
+
 
 if __name__ == "__main__":
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/runtime/tools/bin_to_coff.py b/runtime/tools/bin_to_coff.py
index 9eb0d3d..1925bcd 100644
--- a/runtime/tools/bin_to_coff.py
+++ b/runtime/tools/bin_to_coff.py
@@ -9,16 +9,16 @@
 from struct import *
 
 # FILE HEADER FLAGS
-FILE_HEADER_RELFLG = 0x1    # No relocation information
-FILE_HEADER_EXEC   = 0x2    # Executable
-FILE_HEADER_LNNO   = 0x4    # No line number information
-FILE_HEADER_LSYMS  = 0x8    # Local symbols removed / not present
+FILE_HEADER_RELFLG = 0x1  # No relocation information
+FILE_HEADER_EXEC = 0x2  # Executable
+FILE_HEADER_LNNO = 0x4  # No line number information
+FILE_HEADER_LSYMS = 0x8  # Local symbols removed / not present
 FILE_HEADER_AR32WR = 0x100  # File is 32-bit little endian
 
 # SECTION HEADER FLAGS
 SECTION_HEADER_TEXT = 0x20  # Contains executable code
 SECTION_HEADER_DATA = 0x40  # Contains only initialized data
-SECTION_HEADER_BSS  = 0x80  # Contains uninitialized data
+SECTION_HEADER_BSS = 0x80  # Contains uninitialized data
 
 # FILE HEADER FORMAT
 # typedef struct {
@@ -30,14 +30,14 @@
 #   unsigned short f_opthdr;        /* sizeof(optional hdr)     */
 #   unsigned short f_flags;         /* flags                    */
 # } FILHDR;
-FILE_HEADER_FORMAT           = 'HHIIIHH'
-FILE_HEADER_SIZE             = calcsize(FILE_HEADER_FORMAT)
-FILE_HEADER_MAGIC_X64        = 0x8664
-FILE_HEADER_MAGIC_IA32       = 0x014c
-FILE_HEADER_NUM_SECTIONS     = 1
-FILE_HEADER_TIMESTAMP        = 0
+FILE_HEADER_FORMAT = 'HHIIIHH'
+FILE_HEADER_SIZE = calcsize(FILE_HEADER_FORMAT)
+FILE_HEADER_MAGIC_X64 = 0x8664
+FILE_HEADER_MAGIC_IA32 = 0x014c
+FILE_HEADER_NUM_SECTIONS = 1
+FILE_HEADER_TIMESTAMP = 0
 FILE_HEADER_SIZE_OF_OPTIONAL = 0
-FILE_HEADER_FLAGS            = FILE_HEADER_LNNO
+FILE_HEADER_FLAGS = FILE_HEADER_LNNO
 
 # SECTION HEADER FORMAT
 # typedef struct {
@@ -52,18 +52,18 @@
 #   unsigned short s_nlnno;    /* number of line number entries    */
 #   unsigned long  s_flags;    /* flags                            */
 # } SCNHDR;
-SECTION_HEADER_FORMAT  = '8sIIIIIIHHI'
-SECTION_HEADER_SIZE    = calcsize(SECTION_HEADER_FORMAT)
-SECTION_NAME_RODATA    = '.rodata'
-SECTION_NAME_TEXT      = '.text'
-SECTION_PADDR          = 0x0
-SECTION_VADDR          = 0x0
-SECTION_RAW_DATA_PTR   = (FILE_HEADER_SIZE + FILE_HEADER_NUM_SECTIONS
-                          * SECTION_HEADER_SIZE)
+SECTION_HEADER_FORMAT = '8sIIIIIIHHI'
+SECTION_HEADER_SIZE = calcsize(SECTION_HEADER_FORMAT)
+SECTION_NAME_RODATA = '.rodata'
+SECTION_NAME_TEXT = '.text'
+SECTION_PADDR = 0x0
+SECTION_VADDR = 0x0
+SECTION_RAW_DATA_PTR = (
+    FILE_HEADER_SIZE + FILE_HEADER_NUM_SECTIONS * SECTION_HEADER_SIZE)
 SECTION_RELOCATION_PTR = 0x0
-SECTION_LINE_NUMS_PTR  = 0x0
+SECTION_LINE_NUMS_PTR = 0x0
 SECTION_NUM_RELOCATION = 0
-SECTION_NUM_LINE_NUMS  = 0
+SECTION_NUM_LINE_NUMS = 0
 
 # SYMBOL TABLE FORMAT
 # typedef struct {
@@ -80,165 +80,176 @@
 #   unsigned char e_sclass;
 #   unsigned char e_numaux;
 # } SYMENT;
-SYMBOL_TABLE_ENTRY_SHORT_LEN    = 8
+SYMBOL_TABLE_ENTRY_SHORT_LEN = 8
 SYMBOL_TABLE_ENTRY_FORMAT_SHORT = '8sIhHBB'
-SYMBOL_TABLE_ENTRY_FORMAT_LONG  = 'IIIhHBB'
-SYMBOL_TABLE_ENTRY_SIZE         = calcsize(SYMBOL_TABLE_ENTRY_FORMAT_SHORT)
-SYMBOL_TABLE_ENTRY_ZEROS        = 0x0
-SYMBOL_TABLE_ENTRY_SECTION      = 1
-SYMBOL_TABLE_ENTRY_TYPE         = 0
-SYMBOL_TABLE_ENTRY_CLASS        = 2 # External (public) symbol.
-SYMBOL_TABLE_ENTRY_NUM_AUX      = 0 # Number of auxiliary entries.
+SYMBOL_TABLE_ENTRY_FORMAT_LONG = 'IIIhHBB'
+SYMBOL_TABLE_ENTRY_SIZE = calcsize(SYMBOL_TABLE_ENTRY_FORMAT_SHORT)
+SYMBOL_TABLE_ENTRY_ZEROS = 0x0
+SYMBOL_TABLE_ENTRY_SECTION = 1
+SYMBOL_TABLE_ENTRY_TYPE = 0
+SYMBOL_TABLE_ENTRY_CLASS = 2  # External (public) symbol.
+SYMBOL_TABLE_ENTRY_NUM_AUX = 0  # Number of auxiliary entries.
 
-
-STRING_TABLE_OFFSET = 0x4 # Starting offset for the string table.
-SIZE_FORMAT         = 'I'
-SIZE_LENGTH         = calcsize(SIZE_FORMAT)
+STRING_TABLE_OFFSET = 0x4  # Starting offset for the string table.
+SIZE_FORMAT = 'I'
+SIZE_LENGTH = calcsize(SIZE_FORMAT)
 
 SIZE_SYMBOL_FORMAT_X64 = 'Q'
 SIZE_SYMBOL_LENGTH_X64 = calcsize(SIZE_SYMBOL_FORMAT_X64)
 
+
 def main():
-  parser = argparse.ArgumentParser(description='Generate a COFF file for binary data.')
-  parser.add_argument('--input', dest='input', help='Path of the input file.')
-  parser.add_argument('--output', dest='output', help='Name of the output file.')
-  parser.add_argument('--symbol_name', dest='symbol_name', help='Name of the symbol for the binary data')
-  parser.add_argument('--size_symbol_name', dest='size_name', help='Name of the symbol for the size of the binary data')
-  parser.add_argument('--64-bit', dest='use_64_bit', action='store_true', default=False)
-  parser.add_argument('--executable', dest='executable', action='store_true', default=False)
+    parser = argparse.ArgumentParser(
+        description='Generate a COFF file for binary data.')
+    parser.add_argument('--input', dest='input', help='Path of the input file.')
+    parser.add_argument(
+        '--output', dest='output', help='Name of the output file.')
+    parser.add_argument(
+        '--symbol_name',
+        dest='symbol_name',
+        help='Name of the symbol for the binary data')
+    parser.add_argument(
+        '--size_symbol_name',
+        dest='size_name',
+        help='Name of the symbol for the size of the binary data')
+    parser.add_argument(
+        '--64-bit', dest='use_64_bit', action='store_true', default=False)
+    parser.add_argument(
+        '--executable', dest='executable', action='store_true', default=False)
 
-  args = parser.parse_args()
+    args = parser.parse_args()
 
-  with open(args.input, 'rb') as f:
-    section_data = f.read()
+    with open(args.input, 'rb') as f:
+        section_data = f.read()
 
-  # We need to calculate the following to determine the size of our buffer:
-  #   1) Size of the data
-  #   2) Total length of the symbol strings which are over 8 characters
+    # We need to calculate the following to determine the size of our buffer:
+    #   1) Size of the data
+    #   2) Total length of the symbol strings which are over 8 characters
 
-  section_size = len(section_data)
-  includes_size_name = (args.size_name != None)
+    section_size = len(section_data)
+    includes_size_name = (args.size_name != None)
 
-  # Symbols on x86 are prefixed with '_'
-  symbol_prefix = '' if args.use_64_bit else '_'
-  num_symbols = 2 if includes_size_name else 1
-  symbol_name = symbol_prefix + args.symbol_name
-  size_symbol_name = None
-  if (includes_size_name):
-    size_symbol = args.size_name if args.size_name else args.symbol_name + "Size"
-    size_symbol_name = symbol_prefix + size_symbol
+    # Symbols on x86 are prefixed with '_'
+    symbol_prefix = '' if args.use_64_bit else '_'
+    num_symbols = 2 if includes_size_name else 1
+    symbol_name = symbol_prefix + args.symbol_name
+    size_symbol_name = None
+    if (includes_size_name):
+        size_symbol = args.size_name if args.size_name else args.symbol_name + "Size"
+        size_symbol_name = symbol_prefix + size_symbol
 
-  size_symbol_format = SIZE_SYMBOL_FORMAT_X64  if args.use_64_bit else SIZE_FORMAT
-  size_symbol_size = SIZE_SYMBOL_LENGTH_X64 if args.use_64_bit else SIZE_LENGTH
+    size_symbol_format = SIZE_SYMBOL_FORMAT_X64 if args.use_64_bit else SIZE_FORMAT
+    size_symbol_size = SIZE_SYMBOL_LENGTH_X64 if args.use_64_bit else SIZE_LENGTH
 
-  # The symbol table is directly after the data section
-  symbol_table_ptr = (FILE_HEADER_SIZE + SECTION_HEADER_SIZE + section_size + size_symbol_size)
-  string_table_len = 0
+    # The symbol table is directly after the data section
+    symbol_table_ptr = (FILE_HEADER_SIZE + SECTION_HEADER_SIZE + section_size +
+                        size_symbol_size)
+    string_table_len = 0
 
-  # Symbols longer than 8 characters have their string representations stored
-  # in the string table.
-  long_symbol_name = False
-  long_size_symbol_name = False
-  if (len(symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN):
-    string_table_len += len(symbol_name) + 1
-    long_symbol_name = True
+    # Symbols longer than 8 characters have their string representations stored
+    # in the string table.
+    long_symbol_name = False
+    long_size_symbol_name = False
+    if (len(symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN):
+        string_table_len += len(symbol_name) + 1
+        long_symbol_name = True
 
-  if (includes_size_name and (len(size_symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN)):
-    string_table_len += len(size_symbol_name) + 1
-    long_size_symbol_name = True
+    if (includes_size_name and
+        (len(size_symbol_name) > SYMBOL_TABLE_ENTRY_SHORT_LEN)):
+        string_table_len += len(size_symbol_name) + 1
+        long_size_symbol_name = True
 
-  # Create the buffer and start building.
-  offset = 0
-  buff = create_string_buffer(FILE_HEADER_SIZE + SECTION_HEADER_SIZE +
-                              section_size + num_symbols *
-                              SYMBOL_TABLE_ENTRY_SIZE + SIZE_LENGTH + size_symbol_size +
-                              string_table_len)
+    # Create the buffer and start building.
+    offset = 0
+    buff = create_string_buffer(
+        FILE_HEADER_SIZE + SECTION_HEADER_SIZE + section_size +
+        num_symbols * SYMBOL_TABLE_ENTRY_SIZE + SIZE_LENGTH + size_symbol_size +
+        string_table_len)
 
-  FILE_HEADER_MAGIC = FILE_HEADER_MAGIC_X64 if args.use_64_bit else FILE_HEADER_MAGIC_IA32
+    FILE_HEADER_MAGIC = FILE_HEADER_MAGIC_X64 if args.use_64_bit else FILE_HEADER_MAGIC_IA32
 
-  # Populate the file header. Basically constant except for the pointer to the
-  # beginning of the symbol table.
-  pack_into(FILE_HEADER_FORMAT, buff, offset,
-       FILE_HEADER_MAGIC, FILE_HEADER_NUM_SECTIONS,
-       FILE_HEADER_TIMESTAMP, symbol_table_ptr,
-       num_symbols, FILE_HEADER_SIZE_OF_OPTIONAL,
-       FILE_HEADER_FLAGS)
-  offset += FILE_HEADER_SIZE
+    # Populate the file header. Basically constant except for the pointer to the
+    # beginning of the symbol table.
+    pack_into(FILE_HEADER_FORMAT, buff, offset, FILE_HEADER_MAGIC,
+              FILE_HEADER_NUM_SECTIONS, FILE_HEADER_TIMESTAMP, symbol_table_ptr,
+              num_symbols, FILE_HEADER_SIZE_OF_OPTIONAL, FILE_HEADER_FLAGS)
+    offset += FILE_HEADER_SIZE
 
-  section_name = SECTION_NAME_RODATA
-  section_type = SECTION_HEADER_DATA
-  if args.executable:
-    section_name = SECTION_NAME_TEXT
-    section_type = SECTION_HEADER_TEXT
+    section_name = SECTION_NAME_RODATA
+    section_type = SECTION_HEADER_DATA
+    if args.executable:
+        section_name = SECTION_NAME_TEXT
+        section_type = SECTION_HEADER_TEXT
 
-  # Populate the section header for a single section.
-  pack_into(SECTION_HEADER_FORMAT, buff, offset,
-      section_name, SECTION_PADDR, SECTION_VADDR,
-      section_size + size_symbol_size, SECTION_RAW_DATA_PTR, SECTION_RELOCATION_PTR,
-      SECTION_LINE_NUMS_PTR, SECTION_NUM_RELOCATION,
-      SECTION_NUM_LINE_NUMS, section_type)
-  offset += SECTION_HEADER_SIZE
+    # Populate the section header for a single section.
+    pack_into(SECTION_HEADER_FORMAT, buff, offset, section_name, SECTION_PADDR,
+              SECTION_VADDR, section_size + size_symbol_size,
+              SECTION_RAW_DATA_PTR, SECTION_RELOCATION_PTR,
+              SECTION_LINE_NUMS_PTR, SECTION_NUM_RELOCATION,
+              SECTION_NUM_LINE_NUMS, section_type)
+    offset += SECTION_HEADER_SIZE
 
-  # Copy the binary data.
-  buff[offset:offset + section_size] = section_data
-  offset += section_size
+    # Copy the binary data.
+    buff[offset:offset + section_size] = section_data
+    offset += section_size
 
-  # Append the size of the section.
-  pack_into(size_symbol_format, buff, offset, section_size)
-  offset += size_symbol_size
+    # Append the size of the section.
+    pack_into(size_symbol_format, buff, offset, section_size)
+    offset += size_symbol_size
 
-  # Build the symbol table. If a symbol name is 8 characters or less, it's
-  # placed directly in the symbol table. If not, it's entered in the string
-  # table immediately after the symbol table.
+    # Build the symbol table. If a symbol name is 8 characters or less, it's
+    # placed directly in the symbol table. If not, it's entered in the string
+    # table immediately after the symbol table.
 
-  string_table_offset = STRING_TABLE_OFFSET
-  if long_symbol_name:
-    pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
-      SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset, 0x0,
-      SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
-      SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
-    string_table_offset += len(symbol_name) + 1
-  else:
-    pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset,
-      symbol_name, 0x0,
-      SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
-      SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
-  offset += SYMBOL_TABLE_ENTRY_SIZE
-
-  if includes_size_name:
-    # The size symbol table entry actually contains the value for the size.
-    if long_size_symbol_name:
-      pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
-        SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset, section_size,
-        SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
-        SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+    string_table_offset = STRING_TABLE_OFFSET
+    if long_symbol_name:
+        pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
+                  SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset, 0x0,
+                  SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+                  SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+        string_table_offset += len(symbol_name) + 1
     else:
-      pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset,
-        symbol_name, section_size,
-        SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
-        SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
+        pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset, symbol_name,
+                  0x0, SYMBOL_TABLE_ENTRY_SECTION, SYMBOL_TABLE_ENTRY_TYPE,
+                  SYMBOL_TABLE_ENTRY_CLASS, SYMBOL_TABLE_ENTRY_NUM_AUX)
     offset += SYMBOL_TABLE_ENTRY_SIZE
 
-  pack_into(SIZE_FORMAT, buff, offset, string_table_len + SIZE_LENGTH)
-  offset += SIZE_LENGTH
+    if includes_size_name:
+        # The size symbol table entry actually contains the value for the size.
+        if long_size_symbol_name:
+            pack_into(SYMBOL_TABLE_ENTRY_FORMAT_LONG, buff, offset,
+                      SYMBOL_TABLE_ENTRY_ZEROS, string_table_offset,
+                      section_size, SYMBOL_TABLE_ENTRY_SECTION,
+                      SYMBOL_TABLE_ENTRY_TYPE, SYMBOL_TABLE_ENTRY_CLASS,
+                      SYMBOL_TABLE_ENTRY_NUM_AUX)
+        else:
+            pack_into(SYMBOL_TABLE_ENTRY_FORMAT_SHORT, buff, offset,
+                      symbol_name, section_size, SYMBOL_TABLE_ENTRY_SECTION,
+                      SYMBOL_TABLE_ENTRY_TYPE, SYMBOL_TABLE_ENTRY_CLASS,
+                      SYMBOL_TABLE_ENTRY_NUM_AUX)
+        offset += SYMBOL_TABLE_ENTRY_SIZE
 
-  # Populate the string table for any symbols longer than 8 characters.
-  if long_symbol_name:
-    symbol_len = len(symbol_name)
-    buff[offset:offset + symbol_len] = symbol_name
-    offset += symbol_len
-    buff[offset] = '\0'
-    offset += 1
+    pack_into(SIZE_FORMAT, buff, offset, string_table_len + SIZE_LENGTH)
+    offset += SIZE_LENGTH
 
-  if includes_size_name and long_size_symbol_name:
-    symbol_len = len(size_symbol_name)
-    buff[offset:offset + symbol_len] = size_symbol_name
-    offset += symbol_len
-    buff[offset] = '\0'
-    offset += 1
+    # Populate the string table for any symbols longer than 8 characters.
+    if long_symbol_name:
+        symbol_len = len(symbol_name)
+        buff[offset:offset + symbol_len] = symbol_name
+        offset += symbol_len
+        buff[offset] = '\0'
+        offset += 1
 
-  with open(args.output, 'wb') as f:
-    f.write(buff.raw)
+    if includes_size_name and long_size_symbol_name:
+        symbol_len = len(size_symbol_name)
+        buff[offset:offset + symbol_len] = size_symbol_name
+        offset += symbol_len
+        buff[offset] = '\0'
+        offset += 1
+
+    with open(args.output, 'wb') as f:
+        f.write(buff.raw)
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/runtime/tools/create_archive.py b/runtime/tools/create_archive.py
index aa27ca4..c0b7c89 100755
--- a/runtime/tools/create_archive.py
+++ b/runtime/tools/create_archive.py
@@ -16,169 +16,176 @@
 import tempfile
 import gzip
 
+
 def CreateTarArchive(tar_path, client_root, compress, files):
-  mode_string = 'w'
-  tar = tarfile.open(tar_path, mode=mode_string)
-  for input_file_name in files:
-    # Chop off client_root.
-    archive_file_name = input_file_name[ len(client_root) : ]
-    # Replace back slash with forward slash. So we do not have Windows paths.
-    archive_file_name = archive_file_name.replace("\\", "/")
-    # Open input file and add it to the archive.
-    with open(input_file_name, 'rb') as input_file:
-      tarInfo = tarfile.TarInfo(name=archive_file_name)
-      input_file.seek(0,2)
-      tarInfo.size = input_file.tell()
-      tarInfo.mtime = 0  # For deterministic builds.
-      input_file.seek(0)
-      tar.addfile(tarInfo, fileobj=input_file)
-  tar.close()
-  if compress:
-    with open(tar_path, "rb") as fin:
-      uncompressed = fin.read()
-    with open(tar_path, "wb") as fout:
-      # mtime=0 for deterministic builds.
-      gz = gzip.GzipFile(fileobj=fout, mode="wb", filename="", mtime=0)
-      gz.write(uncompressed)
-      gz.close()
+    mode_string = 'w'
+    tar = tarfile.open(tar_path, mode=mode_string)
+    for input_file_name in files:
+        # Chop off client_root.
+        archive_file_name = input_file_name[len(client_root):]
+        # Replace back slash with forward slash. So we do not have Windows paths.
+        archive_file_name = archive_file_name.replace("\\", "/")
+        # Open input file and add it to the archive.
+        with open(input_file_name, 'rb') as input_file:
+            tarInfo = tarfile.TarInfo(name=archive_file_name)
+            input_file.seek(0, 2)
+            tarInfo.size = input_file.tell()
+            tarInfo.mtime = 0  # For deterministic builds.
+            input_file.seek(0)
+            tar.addfile(tarInfo, fileobj=input_file)
+    tar.close()
+    if compress:
+        with open(tar_path, "rb") as fin:
+            uncompressed = fin.read()
+        with open(tar_path, "wb") as fout:
+            # mtime=0 for deterministic builds.
+            gz = gzip.GzipFile(fileobj=fout, mode="wb", filename="", mtime=0)
+            gz.write(uncompressed)
+            gz.close()
 
 
 def MakeArchive(options):
-  if not options.client_root:
-    sys.stderr.write('--client_root not specified')
-    return -1
+    if not options.client_root:
+        sys.stderr.write('--client_root not specified')
+        return -1
 
-  files = [ ]
-  for dirname, dirnames, filenames in os.walk(options.client_root):
-    # strip out all dot files.
-    filenames = [f for f in filenames if not f[0] == '.']
-    dirnames[:] = [d for d in dirnames if not d[0] == '.']
-    for f in filenames:
-      src_path = os.path.join(dirname, f)
-      if (os.path.isdir(src_path)):
-          continue
-      files.append(src_path)
+    files = []
+    for dirname, dirnames, filenames in os.walk(options.client_root):
+        # strip out all dot files.
+        filenames = [f for f in filenames if not f[0] == '.']
+        dirnames[:] = [d for d in dirnames if not d[0] == '.']
+        for f in filenames:
+            src_path = os.path.join(dirname, f)
+            if (os.path.isdir(src_path)):
+                continue
+            files.append(src_path)
 
-  # Ensure consistent file ordering for reproducible builds.
-  files.sort()
+    # Ensure consistent file ordering for reproducible builds.
+    files.sort()
 
-  # Write out archive.
-  CreateTarArchive(options.tar_output,
-                   options.client_root,
-                   options.compress,
-                   files)
-  return 0
+    # Write out archive.
+    CreateTarArchive(options.tar_output, options.client_root, options.compress,
+                     files)
+    return 0
 
 
-def WriteCCFile(output_file,
-                outer_namespace,
-                inner_namespace,
-                name,
-                tar_archive,
-                ):
-  with open(output_file, 'w') as out:
-    out.write('''
+def WriteCCFile(
+        output_file,
+        outer_namespace,
+        inner_namespace,
+        name,
+        tar_archive,
+):
+    with open(output_file, 'w') as out:
+        out.write('''
 // Copyright (c) %d, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 ''' % date.today().year)
-    out.write('''
+        out.write('''
 
 #include <stdint.h>
 
 ''')
-    out.write('namespace %s {\n' % outer_namespace)
-    if inner_namespace != None:
-      out.write('namespace %s {\n' % inner_namespace)
-    out.write('\n\n')
-    # Write the byte contents of the archive as a comma separated list of
-    # integers, one integer for each byte.
-    out.write('static const uint8_t %s_[] = {\n' % name)
-    line = '   '
-    lineCounter = 0
-    for byte in tar_archive:
-      line += r" %d," % ord(byte)
-      lineCounter += 1
-      if lineCounter == 10:
-        out.write(line + '\n')
+        out.write('namespace %s {\n' % outer_namespace)
+        if inner_namespace != None:
+            out.write('namespace %s {\n' % inner_namespace)
+        out.write('\n\n')
+        # Write the byte contents of the archive as a comma separated list of
+        # integers, one integer for each byte.
+        out.write('static const uint8_t %s_[] = {\n' % name)
         line = '   '
         lineCounter = 0
-    if lineCounter != 0:
-      out.write(line + '\n')
-    out.write('};\n')
-    out.write('\nunsigned int %s_len = %d;\n' % (name, len(tar_archive)))
-    out.write('\nconst uint8_t* %s = %s_;\n\n' % (name, name))
-    if inner_namespace != None:
-      out.write('}  // namespace %s\n' % inner_namespace)
-    out.write('} // namespace %s\n' % outer_namespace)
+        for byte in tar_archive:
+            line += r" %d," % ord(byte)
+            lineCounter += 1
+            if lineCounter == 10:
+                out.write(line + '\n')
+                line = '   '
+                lineCounter = 0
+        if lineCounter != 0:
+            out.write(line + '\n')
+        out.write('};\n')
+        out.write('\nunsigned int %s_len = %d;\n' % (name, len(tar_archive)))
+        out.write('\nconst uint8_t* %s = %s_;\n\n' % (name, name))
+        if inner_namespace != None:
+            out.write('}  // namespace %s\n' % inner_namespace)
+        out.write('} // namespace %s\n' % outer_namespace)
+
 
 def MakeCCFile(options):
-  if not options.output:
-    sys.stderr.write('--output not specified\n')
-    return -1
-  if not options.name:
-    sys.stderr.write('--name not specified\n')
-    return -1
-  if not options.tar_input:
-    sys.stderr.write('--tar_input not specified\n')
-    return -1
+    if not options.output:
+        sys.stderr.write('--output not specified\n')
+        return -1
+    if not options.name:
+        sys.stderr.write('--name not specified\n')
+        return -1
+    if not options.tar_input:
+        sys.stderr.write('--tar_input not specified\n')
+        return -1
 
-  # Read it back in.
-  with open(options.tar_input, 'rb') as tar_file:
-    tar_archive = tar_file.read()
+    # Read it back in.
+    with open(options.tar_input, 'rb') as tar_file:
+        tar_archive = tar_file.read()
 
-  # Write CC file.
-  WriteCCFile(options.output,
-              options.outer_namespace,
-              options.inner_namespace,
-              options.name,
-              tar_archive)
-  return 0
+    # Write CC file.
+    WriteCCFile(options.output, options.outer_namespace,
+                options.inner_namespace, options.name, tar_archive)
+    return 0
 
 
 def Main(args):
-  try:
-    # Parse input.
-    parser = OptionParser()
-    parser.add_option("--output",
-                      action="store", type="string",
-                      help="output file name")
-    parser.add_option("--tar_input",\
-                      action="store", type="string",
-                      help="input tar archive")
-    parser.add_option("--tar_output",
-                      action="store", type="string",
-                      help="tar output file name")
-    parser.add_option("--outer_namespace",
-                      action="store", type="string",
-                      help="outer C++ namespace",
-                      default="dart")
-    parser.add_option("--inner_namespace",
-                      action="store", type="string",
-                      help="inner C++ namespace",
-                      default="bin")
-    parser.add_option("--name",
-                      action="store", type="string",
-                      help="name of tar archive symbol")
-    parser.add_option("--compress", action="store_true", default=False)
-    parser.add_option("--client_root",
-                      action="store", type="string",
-                      help="root directory client resources")
+    try:
+        # Parse input.
+        parser = OptionParser()
+        parser.add_option(
+            "--output", action="store", type="string", help="output file name")
+        parser.add_option("--tar_input",\
+                          action="store", type="string",
+                          help="input tar archive")
+        parser.add_option(
+            "--tar_output",
+            action="store",
+            type="string",
+            help="tar output file name")
+        parser.add_option(
+            "--outer_namespace",
+            action="store",
+            type="string",
+            help="outer C++ namespace",
+            default="dart")
+        parser.add_option(
+            "--inner_namespace",
+            action="store",
+            type="string",
+            help="inner C++ namespace",
+            default="bin")
+        parser.add_option(
+            "--name",
+            action="store",
+            type="string",
+            help="name of tar archive symbol")
+        parser.add_option("--compress", action="store_true", default=False)
+        parser.add_option(
+            "--client_root",
+            action="store",
+            type="string",
+            help="root directory client resources")
 
-    (options, args) = parser.parse_args()
+        (options, args) = parser.parse_args()
 
-    if options.tar_output:
-      return MakeArchive(options)
-    else:
-      return MakeCCFile(options)
+        if options.tar_output:
+            return MakeArchive(options)
+        else:
+            return MakeCCFile(options)
 
-  except Exception, inst:
-    sys.stderr.write('create_archive.py exception\n')
-    sys.stderr.write(str(inst))
-    sys.stderr.write('\n')
-    return -1
+    except Exception, inst:
+        sys.stderr.write('create_archive.py exception\n')
+        sys.stderr.write(str(inst))
+        sys.stderr.write('\n')
+        return -1
 
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py
index 88da22e..8a222b8 100755
--- a/runtime/tools/create_snapshot_bin.py
+++ b/runtime/tools/create_snapshot_bin.py
@@ -3,7 +3,6 @@
 # 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.
-
 """Script to create snapshot bin file."""
 
 import getopt
@@ -15,146 +14,185 @@
 
 
 def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option("--executable",
-      action="store", type="string",
-      help="path to snapshot generator executable")
-  result.add_option("--snapshot_kind",
-      action="store", type="string",
-      help="kind of snapshot to generate",
-      default="core")
-  result.add_option("--load_compilation_trace",
-      action="store", type="string",
-      help="path to a compilation trace to load before generating a core-jit snapshot")
-  result.add_option("--vm_flag",
-      action="append", type="string", default=[],
-      help="pass additional Dart VM flag")
-  result.add_option("--vm_output_bin",
-      action="store", type="string",
-      help="output file name into which vm isolate snapshot in binary form " +
-           "is generated")
-  result.add_option("--vm_instructions_output_bin",
-      action="store", type="string",
-      help="output file name into which vm isolate snapshot in binary form " +
-           "is generated")
-  result.add_option("--isolate_output_bin",
-      action="store", type="string",
-      help="output file name into which isolate snapshot in binary form " +
-           "is generated")
-  result.add_option("--isolate_instructions_output_bin",
-      action="store", type="string",
-      help="output file name into which isolate snapshot in binary form " +
-           "is generated")
-  result.add_option("--script",
-      action="store", type="string",
-      help="Dart script for which snapshot is to be generated")
-  result.add_option("--package_root",
-      action="store", type="string",
-      help="path used to resolve package: imports.")
-  result.add_option("--packages",
-      action="store", type="string",
-      help="package config file used to reasolve package: imports.")
-  result.add_option("-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  result.add_option("--timestamp_file",
-      action="store", type="string",
-      help="Path to timestamp file that will be written",
-      default="")
-  return result
+    result = optparse.OptionParser()
+    result.add_option(
+        "--executable",
+        action="store",
+        type="string",
+        help="path to snapshot generator executable")
+    result.add_option(
+        "--snapshot_kind",
+        action="store",
+        type="string",
+        help="kind of snapshot to generate",
+        default="core")
+    result.add_option(
+        "--load_compilation_trace",
+        action="store",
+        type="string",
+        help=
+        "path to a compilation trace to load before generating a core-jit snapshot"
+    )
+    result.add_option(
+        "--vm_flag",
+        action="append",
+        type="string",
+        default=[],
+        help="pass additional Dart VM flag")
+    result.add_option(
+        "--vm_output_bin",
+        action="store",
+        type="string",
+        help="output file name into which vm isolate snapshot in binary form " +
+        "is generated")
+    result.add_option(
+        "--vm_instructions_output_bin",
+        action="store",
+        type="string",
+        help="output file name into which vm isolate snapshot in binary form " +
+        "is generated")
+    result.add_option(
+        "--isolate_output_bin",
+        action="store",
+        type="string",
+        help="output file name into which isolate snapshot in binary form " +
+        "is generated")
+    result.add_option(
+        "--isolate_instructions_output_bin",
+        action="store",
+        type="string",
+        help="output file name into which isolate snapshot in binary form " +
+        "is generated")
+    result.add_option(
+        "--script",
+        action="store",
+        type="string",
+        help="Dart script for which snapshot is to be generated")
+    result.add_option(
+        "--package_root",
+        action="store",
+        type="string",
+        help="path used to resolve package: imports.")
+    result.add_option(
+        "--packages",
+        action="store",
+        type="string",
+        help="package config file used to reasolve package: imports.")
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    result.add_option(
+        "--timestamp_file",
+        action="store",
+        type="string",
+        help="Path to timestamp file that will be written",
+        default="")
+    return result
 
 
 def ProcessOptions(options):
-  if not options.executable:
-    sys.stderr.write('--executable not specified\n')
-    return False
-  if not options.snapshot_kind:
-    sys.stderr.write('--snapshot_kind not specified\n')
-    return False
-  if not options.vm_output_bin:
-    sys.stderr.write('--vm_output_bin not specified\n')
-    return False
-  if not options.isolate_output_bin:
-    sys.stderr.write('--isolate_output_bin not specified\n')
-    return False
-  if (options.snapshot_kind == 'core-jit'
-      and not options.vm_instructions_output_bin):
-    sys.stderr.write('--vm_instructions_output_bin not specified\n')
-    return False
-  if (options.snapshot_kind == 'core-jit'
-      and not options.isolate_instructions_output_bin):
-    sys.stderr.write('--isolate_instructions_output_bin not specified\n')
-    return False
-  return True
+    if not options.executable:
+        sys.stderr.write('--executable not specified\n')
+        return False
+    if not options.snapshot_kind:
+        sys.stderr.write('--snapshot_kind not specified\n')
+        return False
+    if not options.vm_output_bin:
+        sys.stderr.write('--vm_output_bin not specified\n')
+        return False
+    if not options.isolate_output_bin:
+        sys.stderr.write('--isolate_output_bin not specified\n')
+        return False
+    if (options.snapshot_kind == 'core-jit' and
+            not options.vm_instructions_output_bin):
+        sys.stderr.write('--vm_instructions_output_bin not specified\n')
+        return False
+    if (options.snapshot_kind == 'core-jit' and
+            not options.isolate_instructions_output_bin):
+        sys.stderr.write('--isolate_instructions_output_bin not specified\n')
+        return False
+    return True
 
 
 def CreateTimestampFile(options):
-  if options.timestamp_file != '':
-    dir_name = os.path.dirname(options.timestamp_file)
-    if not os.path.exists(dir_name):
-      os.mkdir(dir_name)
-    open(options.timestamp_file, 'w').close()
+    if options.timestamp_file != '':
+        dir_name = os.path.dirname(options.timestamp_file)
+        if not os.path.exists(dir_name):
+            os.mkdir(dir_name)
+        open(options.timestamp_file, 'w').close()
 
 
 def Main():
-  # Parse options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if not ProcessOptions(options):
-    parser.print_help()
-    return 1
+    # Parse options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if not ProcessOptions(options):
+        parser.print_help()
+        return 1
 
-  # If there are additional arguments, report error and exit.
-  if args:
-    parser.print_help()
-    return 1
+    # If there are additional arguments, report error and exit.
+    if args:
+        parser.print_help()
+        return 1
 
-  # Setup arguments to the snapshot generator binary.
-  script_args = ["--ignore_unrecognized_flags"]
+    # Setup arguments to the snapshot generator binary.
+    script_args = ["--ignore_unrecognized_flags"]
 
-  for flag in options.vm_flag:
-    script_args.append(flag)
+    for flag in options.vm_flag:
+        script_args.append(flag)
 
-  if options.load_compilation_trace:
-    script_args.append(''.join([ "--load_compilation_trace=", options.load_compilation_trace]))
+    if options.load_compilation_trace:
+        script_args.append(''.join(
+            ["--load_compilation_trace=", options.load_compilation_trace]))
 
-  # Pass along the package_root if there is one.
-  if options.package_root:
-    script_args.append(''.join([ "--package_root=", options.package_root]))
+    # Pass along the package_root if there is one.
+    if options.package_root:
+        script_args.append(''.join(["--package_root=", options.package_root]))
 
-  # Pass along the packages if there is one.
-  if options.packages:
-    script_args.append(''.join([ "--packages=", options.packages]))
+    # Pass along the packages if there is one.
+    if options.packages:
+        script_args.append(''.join(["--packages=", options.packages]))
 
-  # First setup the vm isolate and regular isolate snapshot output filename.
-  script_args.append(''.join([ "--snapshot_kind=", options.snapshot_kind ]))
-  script_args.append(''.join([ "--vm_snapshot_data=", options.vm_output_bin ]))
-  script_args.append(''.join([ "--isolate_snapshot_data=", options.isolate_output_bin ]))
+    # First setup the vm isolate and regular isolate snapshot output filename.
+    script_args.append(''.join(["--snapshot_kind=", options.snapshot_kind]))
+    script_args.append(''.join(["--vm_snapshot_data=", options.vm_output_bin]))
+    script_args.append(''.join(
+        ["--isolate_snapshot_data=", options.isolate_output_bin]))
 
-  if options.vm_instructions_output_bin != None:
-    script_args.append(''.join([ "--vm_snapshot_instructions=",
-                                 options.vm_instructions_output_bin ]))
-  if options.isolate_instructions_output_bin != None:
-    script_args.append(''.join([ "--isolate_snapshot_instructions=",
-                                 options.isolate_instructions_output_bin ]))
+    if options.vm_instructions_output_bin != None:
+        script_args.append(''.join(
+            ["--vm_snapshot_instructions=",
+             options.vm_instructions_output_bin]))
+    if options.isolate_instructions_output_bin != None:
+        script_args.append(''.join([
+            "--isolate_snapshot_instructions=",
+            options.isolate_instructions_output_bin
+        ]))
 
-  # Finally append the script name if one is specified.
-  if options.script:
-    script_args.append(options.script)
+    # Finally append the script name if one is specified.
+    if options.script:
+        script_args.append(options.script)
 
-  # Construct command line to execute the snapshot generator binary and invoke.
-  command = [ options.executable ] + script_args
-  try:
-    utils.RunCommand(command, outStream=sys.stderr, errStream=sys.stderr,
-                     verbose=options.verbose, printErrorInfo=True)
-  except Exception as e:
-    return -1
+    # Construct command line to execute the snapshot generator binary and invoke.
+    command = [options.executable] + script_args
+    try:
+        utils.RunCommand(
+            command,
+            outStream=sys.stderr,
+            errStream=sys.stderr,
+            verbose=options.verbose,
+            printErrorInfo=True)
+    except Exception as e:
+        return -1
 
-  # Success, update timestamp file.
-  CreateTimestampFile(options)
+    # Success, update timestamp file.
+    CreateTimestampFile(options)
 
-  return 0
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/runtime/tools/create_snapshot_file.py b/runtime/tools/create_snapshot_file.py
index 19ea870..4216366 100755
--- a/runtime/tools/create_snapshot_file.py
+++ b/runtime/tools/create_snapshot_file.py
@@ -14,106 +14,118 @@
 import sys
 import utils
 
-
 HOST_OS = utils.GuessOS()
 HOST_CPUS = utils.GuessCpus()
 
 
 def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option("--vm_input_bin",
-      action="store", type="string",
-      help="input file name of the vm isolate snapshot in binary form")
-  result.add_option("--input_bin",
-      action="store", type="string",
-      help="input file name of the isolate snapshot in binary form")
-  result.add_option("--input_cc",
-      action="store", type="string",
-      help="input file name which contains the C buffer template")
-  result.add_option("--output",
-      action="store", type="string",
-      help="output file name into which snapshot in C buffer form is generated")
-  result.add_option("-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  return result
+    result = optparse.OptionParser()
+    result.add_option(
+        "--vm_input_bin",
+        action="store",
+        type="string",
+        help="input file name of the vm isolate snapshot in binary form")
+    result.add_option(
+        "--input_bin",
+        action="store",
+        type="string",
+        help="input file name of the isolate snapshot in binary form")
+    result.add_option(
+        "--input_cc",
+        action="store",
+        type="string",
+        help="input file name which contains the C buffer template")
+    result.add_option(
+        "--output",
+        action="store",
+        type="string",
+        help="output file name into which snapshot in C buffer form is generated"
+    )
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    return result
 
 
 def ProcessOptions(options):
-  if not options.vm_input_bin:
-    sys.stderr.write('--vm_input_bin not specified\n')
-    return False
-  if not options.input_bin:
-    sys.stderr.write('--input_bin not specified\n')
-    return False
-  if not options.input_cc:
-    sys.stderr.write('--input_cc not specified\n')
-    return False
-  if not options.output:
-    sys.stderr.write('--output not specified\n')
-    return False
-  return True
+    if not options.vm_input_bin:
+        sys.stderr.write('--vm_input_bin not specified\n')
+        return False
+    if not options.input_bin:
+        sys.stderr.write('--input_bin not specified\n')
+        return False
+    if not options.input_cc:
+        sys.stderr.write('--input_cc not specified\n')
+        return False
+    if not options.output:
+        sys.stderr.write('--output not specified\n')
+        return False
+    return True
 
 
 def WriteBytesAsText(out, input_file):
-  """Writes byte contents of the input_file into out file as text.
+    """Writes byte contents of the input_file into out file as text.
 
   Output is formatted as a list of comma separated integer values - one value
   for each byte.
   """
-  with open(input_file, 'rb') as input:
-    lineCounter = 0
-    line = ' '
-    for byte in input.read():
-      line += ' %d,' % ord(byte)
-      lineCounter += 1
-      if lineCounter == 10:
-        out.write(line + '\n')
-        line = ' '
+    with open(input_file, 'rb') as input:
         lineCounter = 0
-    if lineCounter != 0:
-      out.write(line + '\n')
+        line = ' '
+        for byte in input.read():
+            line += ' %d,' % ord(byte)
+            lineCounter += 1
+            if lineCounter == 10:
+                out.write(line + '\n')
+                line = ' '
+                lineCounter = 0
+        if lineCounter != 0:
+            out.write(line + '\n')
 
 
-def GenerateFileFromTemplate(output_file, input_cc_file,
-             vm_isolate_input_file, isolate_input_file):
-  """Generates C++ file based on a input_cc_file template and two binary files
+def GenerateFileFromTemplate(output_file, input_cc_file, vm_isolate_input_file,
+                             isolate_input_file):
+    """Generates C++ file based on a input_cc_file template and two binary files
 
   Template is expected to have two %s placehoders which would be filled
   with binary contents of the given files each formatted as a comma separated
   list of integers.
   """
-  snapshot_cc_text = open(input_cc_file).read()
-  chunks = snapshot_cc_text.split("%s")
-  if len(chunks) != 3:
-    raise Exception("Template %s should contain exactly two %%s occurrences"
-        % input_cc_file)
+    snapshot_cc_text = open(input_cc_file).read()
+    chunks = snapshot_cc_text.split("%s")
+    if len(chunks) != 3:
+        raise Exception("Template %s should contain exactly two %%s occurrences"
+                        % input_cc_file)
 
-  with open(output_file, 'w') as out:
-    out.write(chunks[0])
-    WriteBytesAsText(out, vm_isolate_input_file)
-    out.write(chunks[1])
-    WriteBytesAsText(out, isolate_input_file)
-    out.write(chunks[2])
+    with open(output_file, 'w') as out:
+        out.write(chunks[0])
+        WriteBytesAsText(out, vm_isolate_input_file)
+        out.write(chunks[1])
+        WriteBytesAsText(out, isolate_input_file)
+        out.write(chunks[2])
 
 
 def Main():
-  # Parse options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if not ProcessOptions(options):
-    parser.print_help()
-    return 1
+    # Parse options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if not ProcessOptions(options):
+        parser.print_help()
+        return 1
 
-  # If there are additional arguments, report error and exit.
-  if args:
-    parser.print_help()
-    return 1
+    # If there are additional arguments, report error and exit.
+    if args:
+        parser.print_help()
+        return 1
 
-  GenerateFileFromTemplate(options.output, options.input_cc,
-                           options.vm_input_bin, options.input_bin)
+    GenerateFileFromTemplate(options.output, options.input_cc,
+                             options.vm_input_bin, options.input_bin)
 
-  return 0
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/runtime/tools/create_string_literal.py b/runtime/tools/create_string_literal.py
index 52a9b10..b7db388 100755
--- a/runtime/tools/create_string_literal.py
+++ b/runtime/tools/create_string_literal.py
@@ -15,85 +15,82 @@
 
 
 def makeString(input_files):
-  result = ' '
-  for string_file in input_files:
-    if string_file.endswith('dart'):
-      fileHandle = open(string_file, 'rb')
-      lineCounter = 0
-      result += ' // ' + string_file + '\n   '
-      for byte in fileHandle.read():
-        result += ' %d,' % ord(byte)
-        lineCounter += 1
-        if lineCounter == 10:
-          result += '\n   '
-          lineCounter = 0
-      if lineCounter != 0:
-        result += '\n   '
-  result += ' // Terminating null character.\n    0'
-  return result
+    result = ' '
+    for string_file in input_files:
+        if string_file.endswith('dart'):
+            fileHandle = open(string_file, 'rb')
+            lineCounter = 0
+            result += ' // ' + string_file + '\n   '
+            for byte in fileHandle.read():
+                result += ' %d,' % ord(byte)
+                lineCounter += 1
+                if lineCounter == 10:
+                    result += '\n   '
+                    lineCounter = 0
+            if lineCounter != 0:
+                result += '\n   '
+    result += ' // Terminating null character.\n    0'
+    return result
 
 
 def makeFile(output_file, input_cc_file, include, var_name, input_files):
-  bootstrap_cc_text = open(input_cc_file).read()
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{INCLUDE}}", include)
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{VAR_NAME}}", var_name)
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{DART_SOURCE}}",
-      makeString(input_files))
-  open(output_file, 'w').write(bootstrap_cc_text)
-  return True
+    bootstrap_cc_text = open(input_cc_file).read()
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{INCLUDE}}", include)
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{VAR_NAME}}", var_name)
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{DART_SOURCE}}",
+                                                  makeString(input_files))
+    open(output_file, 'w').write(bootstrap_cc_text)
+    return True
 
 
 def main(args):
-  try:
-    # Parse input.
-    parser = OptionParser()
-    parser.add_option("--output",
-                      action="store", type="string",
-                      help="output file name")
-    parser.add_option("--input_cc",
-                      action="store", type="string",
-                      help="input template file")
-    parser.add_option("--include",
-                      action="store", type="string",
-                      help="variable name")
-    parser.add_option("--var_name",
-                      action="store", type="string",
-                      help="variable name")
+    try:
+        # Parse input.
+        parser = OptionParser()
+        parser.add_option(
+            "--output", action="store", type="string", help="output file name")
+        parser.add_option(
+            "--input_cc",
+            action="store",
+            type="string",
+            help="input template file")
+        parser.add_option(
+            "--include", action="store", type="string", help="variable name")
+        parser.add_option(
+            "--var_name", action="store", type="string", help="variable name")
 
-    (options, args) = parser.parse_args()
-    if not options.output:
-      sys.stderr.write('--output not specified\n')
-      return -1
-    if not len(options.input_cc):
-      sys.stderr.write('--input_cc not specified\n')
-      return -1
-    if not len(options.include):
-      sys.stderr.write('--include not specified\n')
-      return -1
-    if not len(options.var_name):
-      sys.stderr.write('--var_name not specified\n')
-      return -1
-    if len(args) == 0:
-      sys.stderr.write('No input files specified\n')
-      return -1
+        (options, args) = parser.parse_args()
+        if not options.output:
+            sys.stderr.write('--output not specified\n')
+            return -1
+        if not len(options.input_cc):
+            sys.stderr.write('--input_cc not specified\n')
+            return -1
+        if not len(options.include):
+            sys.stderr.write('--include not specified\n')
+            return -1
+        if not len(options.var_name):
+            sys.stderr.write('--var_name not specified\n')
+            return -1
+        if len(args) == 0:
+            sys.stderr.write('No input files specified\n')
+            return -1
 
-    files = [ ]
-    for arg in args:
-      files.append(arg)
+        files = []
+        for arg in args:
+            files.append(arg)
 
-    if not makeFile(options.output,
-                    options.input_cc,
-                    options.include,
-                    options.var_name,
-                    files):
-      return -1
+        if not makeFile(options.output, options.input_cc, options.include,
+                        options.var_name, files):
+            return -1
 
-    return 0
-  except Exception, inst:
-    sys.stderr.write('create_string_literal.py exception\n')
-    sys.stderr.write(str(inst))
-    sys.stderr.write('\n')
-    return -1
+        return 0
+    except Exception, inst:
+        sys.stderr.write('create_string_literal.py exception\n')
+        sys.stderr.write(str(inst))
+        sys.stderr.write('\n')
+        return -1
+
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/runtime/tools/dartfuzz/README.md b/runtime/tools/dartfuzz/README.md
index 49c89c6..9fe338d 100644
--- a/runtime/tools/dartfuzz/README.md
+++ b/runtime/tools/dartfuzz/README.md
@@ -12,12 +12,13 @@
 ===================
 To generate a single random Dart program, run
 
-    dart dartfuzz.dart [--help] [--seed SEED] FILENAME
+    dart dartfuzz.dart [--help] [--seed SEED] [--[no-]fp] FILENAME
 
 where
 
-    --help : prints help and exits
-    --seed : defines random seed (system-set by default)
+    --help    : prints help and exits
+    --seed    : defines random seed (system-set by default)
+    --[no-]fp : enables/disables floating-point operations
 
 The tool provides a runnable main isolate. A typical single
 test run looks as:
@@ -36,6 +37,7 @@
                             [--true_divergence]
                             [--mode1 MODE]
                             [--mode2 MODE]
+                            [--[no-]rerun]
 
 where
 
@@ -48,21 +50,19 @@
     --dart-top        : sets DART_TOP explicitly through command line
     --mode1           : m1
     --mode2           : m2, and values one of
-        jit-[debug-]ia32    = Dart JIT (ia32)
-        jit-[debug-]x64     = Dart JIT (x64)
-        jit-[debug-]arm32   = Dart JIT (simarm)
-        jit-[debug-]arm64   = Dart JIT (simarm64)
-        jit-[debug-]dbc     = Dart JIT (simdbc)
-        jit-[debug-]dbc64   = Dart JIT (simdbc64)
-        aot-[debug-]x64     = Dart AOT (x64)
-        aot-[debug-]arm32   = Dart AOT (simarm)
-        aot-[debug-]arm64   = Dart AOT (simarm64)
-        kbc-int-[debug-]x64 = Dart KBC (interpreted bytecode)
-        kbc-mix-[debug-]x64 = Dart KBC (mixed-mode bytecode)
-        kbc-cmp-[debug-]x64 = Dart KBC (compiled bytecode)
-        djs-x64             = dart2js + Node.JS
+        jit-[debug-][ia32|x64|arm32|arm64|dbc32|dbc64]   = Dart JIT
+        aot-[debug-][x64|arm32|arm64]                    = Dart AOT
+        kbc-[int|mix|cmp]-[debug-][ia32|x64|arm32|arm64] = Dart KBC
+                                                           (interpreted/
+                                                            mixed-mode/
+                                                            compiled bytecode)
+        djs-x64                                          = dart2js + Node.JS
+    --[no-]rerun       : re-run a testcase if there is only a divergence in
+                         the return codes outside the range [-255,+255];
+                         if the second run produces no divergence the previous
+                         one will be ignored (true by default)
 
-If no modes are given, a random JIT and/or AOT combination is used.
+If no modes are given, a random combination is used.
 
 This fuzz testing tool must have access to the top of a Dart SDK
 development tree (DART_TOP) in which all proper binaries have been
@@ -105,4 +105,5 @@
 * [Dart bugs found with fuzzing](https://github.com/dart-lang/sdk/issues?utf8=%E2%9C%93&q=label%3Adartfuzz+)
 * [DartFuzz](https://github.com/dart-lang/sdk/tree/master/runtime/tools/dartfuzz)
 * [DartLibFuzzer](https://github.com/dart-lang/sdk/tree/master/runtime/vm/libfuzzer)
+* [Dust](https://pub.dev/packages/dust)
 * [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)
diff --git a/runtime/tools/dartfuzz/collect_data.py b/runtime/tools/dartfuzz/collect_data.py
new file mode 100644
index 0000000..5d4f677
--- /dev/null
+++ b/runtime/tools/dartfuzz/collect_data.py
@@ -0,0 +1,122 @@
+#!/usr/bin/env python3
+# 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.
+#
+"""Webscraper for make_a_fuzz nightly cluster run results.
+
+Given the uri of a make_a_fuzz run, this script will first
+extract the links pointing to each of the individual shards
+and then parse the output generated by each shard to
+find divergences reported by the dartfuzz_test.dart program,
+concatenate all output, or summarize all test results.
+
+Example:
+  collect_data.py --type sum
+      https://ci.chromium.org/p/dart/builders/ci.sandbox/fuzz-linux/303
+"""
+
+# This script may require a one time install of BeautifulSoup:
+# sudo apt-get install python3-bs4
+
+import argparse
+import re
+import sys
+
+from bs4 import BeautifulSoup
+
+import requests
+
+
+# Matches shard raw stdout to extract divergence reports.
+P_DIV = re.compile("(Isolate.+? !DIVERGENCE! (\n|.)+?)Isolate ", re.MULTILINE)
+
+# Matches shard raw stdout to extract report summaries.
+P_SUM = re.compile(r"^Tests: (\d+) Success: (\d+) Not-Run: (\d+): "
+                   r"Time-Out: (\d+) Divergences: (\d+)$", re.MULTILINE)
+
+# Matches uri to extract shard number.
+P_SHARD = re.compile(r".*make_a_fuzz_shard_(\d+)")
+
+
+def get_shard_links(uri):
+  links = []
+  resp = requests.get(uri)
+  soup = BeautifulSoup(resp.text, "html.parser")
+  for a in soup.findAll("a"):
+    if a.text == "raw":
+      href = a["href"]
+      if ("make_a_fuzz_shard" in href and
+          "__trigger__" not in href):
+        links.append(href)
+  return links
+
+
+def print_reencoded(text):
+  # Re-encoding avoids breaking some terminals.
+  print(text.encode("ascii", errors="ignore").decode("unicode-escape"))
+
+
+def print_output_all(text):
+  print_reencoded(text)
+
+
+def print_output_div(shard, text):
+  sys.stderr.write("Shard: " + shard + "  \r")
+  m = P_DIV.findall(text)
+  if m:
+    print("Shard: " + shard)
+    for x in m:
+      print_reencoded(x[0])
+
+
+def print_output_sum(shard, text, s=[0, 0, 0, 0, 0], divs=[]):
+  m = P_SUM.findall(text)
+  if not m:
+    sys.stderr.write("Failed to parse shard %s stdout for summary" % shard)
+    return
+  for test in m:
+    if int(test[-1]) == 1:
+      divs.append(shard)
+    for i in range(len(s)):
+      s[i] += int(test[i])
+  print("Tests: %d Success: %d Not-Run: %d Time-Out: %d Divergences: %d "
+        "(failing shards: %s)    \r"
+        % tuple(s + [", ".join(divs) if divs else "none"]), end="")
+
+
+def get_stats(uri, output_type):
+  resp = requests.get(uri)
+
+  if output_type == "all":
+    print_output_all(resp.text)
+  elif output_type == "div":
+    shard = P_SHARD.findall(uri)[0]
+    print_output_div(shard, resp.text)
+  elif output_type == "sum":
+    shard = P_SHARD.findall(uri)[0]
+    print_output_sum(shard, resp.text)
+
+
+def main():
+  parser = argparse.ArgumentParser(description=__doc__)
+  parser.add_argument(
+      "--type",
+      choices=("div", "sum", "all"),
+      required=True,
+      help="Select output type (div: divergence report, sum: summary, all: complete stdout)"
+  )
+  parser.add_argument(
+      "uri",
+      type=str,
+      help="Uri of one make_a_fuzz run from https://ci.chromium.org/p/dart/builders/ci.sandbox/fuzz-linux."
+  )
+  args = parser.parse_args()
+  shard_links = get_shard_links(args.uri)
+  for link in shard_links:
+    get_stats(link, args.type)
+  print("")
+
+
+if __name__ == "__main__":
+  main()
diff --git a/runtime/tools/dartfuzz/dartfuzz.dart b/runtime/tools/dartfuzz/dartfuzz.dart
index 01dc871..9af812a 100644
--- a/runtime/tools/dartfuzz/dartfuzz.dart
+++ b/runtime/tools/dartfuzz/dartfuzz.dart
@@ -13,7 +13,7 @@
 // Version of DartFuzz. Increase this each time changes are made
 // to preserve the property that a given version of DartFuzz yields
 // the same fuzzed program for a deterministic random seed.
-const String version = '1.13';
+const String version = '1.16';
 
 // Restriction on statements and expressions.
 const int stmtLength = 2;
@@ -29,7 +29,7 @@
 
 /// Class that generates a random, but runnable Dart program for fuzz testing.
 class DartFuzz {
-  DartFuzz(this.seed, this.file);
+  DartFuzz(this.seed, this.fp, this.file);
 
   void run() {
     // Initialize program variables.
@@ -66,7 +66,7 @@
   void emitHeader() {
     emitLn('// The Dart Project Fuzz Tester ($version).');
     emitLn('// Program generated as:');
-    emitLn('//   dart dartfuzz.dart --seed $seed');
+    emitLn('//   dart dartfuzz.dart --seed $seed --${fp ? "" : "no-"}fp');
     emitLn('');
     emitLn("import 'dart:async';");
     emitLn("import 'dart:cli';");
@@ -533,9 +533,9 @@
     }
   }
 
-  void emitString() {
+  void emitString({int length = 8}) {
     emit("'");
-    for (int i = 0, n = rand.nextInt(8); i < n; i++) {
+    for (int i = 0, n = rand.nextInt(length); i < n; i++) {
       emitChar();
     }
     emit("'");
@@ -1008,11 +1008,19 @@
         emitExpr(depth, DartType.INT);
         break;
       case 'D':
-        emitExpr(depth, DartType.DOUBLE);
+        emitExpr(depth, fp ? DartType.DOUBLE : DartType.INT);
         break;
       case 'S':
         emitExpr(depth, DartType.STRING);
         break;
+      case 's':
+        // Emit string literal of 2 characters maximum length
+        // for 'small string' parameters to avoid recursively constructed
+        // strings which might lead to exponentially growing data structures
+        // e.g. loop { var = 'x'.padLeft(8, var); }
+        // TODO (felih): detect recursion to eliminate such cases specifically
+        emitString(length: 2);
+        break;
       case 'L':
         emitExpr(depth, DartType.INT_LIST);
         break;
@@ -1039,7 +1047,7 @@
       case 1:
         return DartType.INT;
       case 2:
-        return DartType.DOUBLE;
+        return fp ? DartType.DOUBLE : DartType.INT;
       case 3:
         return DartType.STRING;
       case 4:
@@ -1119,6 +1127,9 @@
   // Random seed used to generate program.
   final int seed;
 
+  // Enables floating-point operations.
+  final bool fp;
+
   // File used for output.
   final RandomAccessFile file;
 
@@ -1163,12 +1174,15 @@
 main(List<String> arguments) {
   final parser = new ArgParser()
     ..addOption('seed',
-        help: 'random seed (0 forces time-based seed)', defaultsTo: '0');
+        help: 'random seed (0 forces time-based seed)', defaultsTo: '0')
+    ..addFlag('fp',
+        help: 'enables floating-point operations', defaultsTo: true);
   try {
     final results = parser.parse(arguments);
     final seed = getSeed(results['seed']);
+    final fp = results['fp'];
     final file = new File(results.rest.single).openSync(mode: FileMode.write);
-    new DartFuzz(seed, file).run();
+    new DartFuzz(seed, fp, file).run();
     file.closeSync();
   } catch (e) {
     print('Usage: dart dartfuzz.dart [OPTIONS] FILENAME\n${parser.usage}\n$e');
diff --git a/runtime/tools/dartfuzz/dartfuzz_api_table.dart b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
index 59d99d3..d516218 100644
--- a/runtime/tools/dartfuzz/dartfuzz_api_table.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_api_table.dart
@@ -20,6 +20,7 @@
 ///   i int (small)
 ///   D double
 ///   S String
+///   s String (small)
 ///   L List<int>
 ///   X Set<int>
 ///   M Map<int, String>
@@ -45,11 +46,6 @@
     DartLib('endsWith', 'SS'),
     DartLib('isEmpty', 'Sv'),
     DartLib('isNotEmpty', 'Sv'),
-    DartLib('FileSystemEntity.identicalSync', 'VSS'),
-    DartLib('FileSystemEntity.isLinkSync', 'VS'),
-    DartLib('FileSystemEntity.isFileSync', 'VS'),
-    DartLib('FileSystemEntity.isDirectorySync', 'VS'),
-    DartLib('FileSystemEntity.isWatchSupported', 'Vv'),
     DartLib('SecurityContext.alpnSupported', 'Vv'),
     DartLib('NetworkInterface.listSupported', 'Vv'),
   ];
@@ -157,17 +153,6 @@
     DartLib('ZLibOption.STRATEGY_FIXED', 'Vv'),
     DartLib('ZLibOption.strategyDefault', 'Vv'),
     DartLib('ZLibOption.STRATEGY_DEFAULT', 'Vv'),
-    DartLib('FileSystemEvent.create', 'Vv'),
-    DartLib('FileSystemEvent.CREATE', 'Vv'),
-    DartLib('FileSystemEvent.modify', 'Vv'),
-    DartLib('FileSystemEvent.MODIFY', 'Vv'),
-    DartLib('FileSystemEvent.delete', 'Vv'),
-    DartLib('FileSystemEvent.DELETE', 'Vv'),
-    DartLib('FileSystemEvent.move', 'Vv'),
-    DartLib('FileSystemEvent.MOVE', 'Vv'),
-    DartLib('FileSystemEvent.all', 'Vv'),
-    DartLib('FileSystemEvent.ALL', 'Vv'),
-    DartLib('exitCode', 'Vv'),
     DartLib('RawSocketOption.levelSocket', 'Vv'),
     DartLib('RawSocketOption.levelIPv4', 'Vv'),
     DartLib('RawSocketOption.IPv4MulticastInterface', 'Vv'),
@@ -773,8 +758,8 @@
     DartLib('trim', 'SV'),
     DartLib('trimLeft', 'SV'),
     DartLib('trimRight', 'SV'),
-    DartLib('padLeft', 'SiS'),
-    DartLib('padRight', 'SiS'),
+    DartLib('padLeft', 'Sis'),
+    DartLib('padRight', 'Sis'),
     DartLib('replaceRange', 'SIIS'),
     DartLib('toLowerCase', 'SV'),
     DartLib('toUpperCase', 'SV'),
@@ -784,7 +769,6 @@
     DartLib('Uri.decodeQueryComponent', 'VS'),
     DartLib('Uri.encodeFull', 'VS'),
     DartLib('Uri.decodeFull', 'VS'),
-    DartLib('FileSystemEntity.parentOf', 'VS'),
   ];
   static const listLibs = [
     DartLib('List.filled', 'ViI'),
diff --git a/runtime/tools/dartfuzz/dartfuzz_test.dart b/runtime/tools/dartfuzz/dartfuzz_test.dart
index b41bb37..e135252 100644
--- a/runtime/tools/dartfuzz/dartfuzz_test.dart
+++ b/runtime/tools/dartfuzz/dartfuzz_test.dart
@@ -15,14 +15,15 @@
 const sigkill = 9;
 const timeout = 60; // in seconds
 
-// Exit code of running a test.
-enum ResultCode { success, timeout, error }
+// Status of divergence report.
+enum ReportStatus { reported, ignored, rerun, no_divergence }
 
 /// Result of running a test.
 class TestResult {
-  const TestResult(this.code, this.output);
-  final ResultCode code;
+  const TestResult(this.output, this.stderr, this.exitCode);
   final String output;
+  final String stderr;
+  final int exitCode;
 }
 
 /// Command runner.
@@ -34,12 +35,7 @@
     print('\nrunning $cmd yields:\n'
         '${res.exitCode}\n${res.stdout}\n${res.stderr}\n');
   }
-  if (res.exitCode == -sigkill) {
-    return new TestResult(ResultCode.timeout, res.stdout);
-  } else if (res.exitCode != 0) {
-    return new TestResult(ResultCode.error, res.stderr);
-  }
-  return new TestResult(ResultCode.success, res.stdout);
+  return TestResult(res.stdout, res.stderr, res.exitCode);
 }
 
 /// Abstraction for running one test in a particular mode.
@@ -49,11 +45,11 @@
 
   // Factory.
   static TestRunner getTestRunner(String mode, String top, String tmp,
-      Map<String, String> env, Random rand) {
+      Map<String, String> env, String fileName, Random rand) {
     String prefix = mode.substring(0, 3).toUpperCase();
     String tag = getTag(mode);
-    // Prepare extra flags.
     List<String> extraFlags = [];
+    // Required extra flags for kbc.
     if (mode.startsWith('kbc-int')) {
       prefix += '-INT';
       extraFlags += [
@@ -67,6 +63,12 @@
       prefix += '-CMP';
       extraFlags += ['--use-bytecode-compiler'];
     }
+    // Every once in a while, go directly from source for kbc.
+    bool kbcSrc = false;
+    if (mode.startsWith('kbc') && rand.nextInt(4) == 0) {
+      prefix += '-SRC';
+      kbcSrc = true;
+    }
     // Every once in a while, stress test JIT.
     if (mode.startsWith('jit') && rand.nextInt(4) == 0) {
       final r = rand.nextInt(7);
@@ -105,13 +107,16 @@
     }
     // Construct runner.
     if (mode.startsWith('jit')) {
-      return new TestRunnerJIT(prefix, tag, top, tmp, env, extraFlags);
+      return new TestRunnerJIT(
+          prefix, tag, top, tmp, env, fileName, extraFlags);
     } else if (mode.startsWith('aot')) {
-      return new TestRunnerAOT(prefix, tag, top, tmp, env, extraFlags);
+      return new TestRunnerAOT(
+          prefix, tag, top, tmp, env, fileName, extraFlags);
     } else if (mode.startsWith('kbc')) {
-      return new TestRunnerKBC(prefix, tag, top, tmp, env, extraFlags);
+      return new TestRunnerKBC(
+          prefix, tag, top, tmp, env, fileName, extraFlags, kbcSrc);
     } else if (mode.startsWith('djs')) {
-      return new TestRunnerDJS(prefix, tag, top, tmp, env);
+      return new TestRunnerDJS(prefix, tag, top, tmp, env, fileName);
     }
     throw ('unknown runner in mode: $mode');
   }
@@ -122,13 +127,13 @@
     if (mode.endsWith('debug-x64')) return 'DebugX64';
     if (mode.endsWith('debug-arm32')) return 'DebugSIMARM';
     if (mode.endsWith('debug-arm64')) return 'DebugSIMARM64';
-    if (mode.endsWith('debug-dbc')) return 'DebugSIMDBC';
+    if (mode.endsWith('debug-dbc32')) return 'DebugSIMDBC';
     if (mode.endsWith('debug-dbc64')) return 'DebugSIMDBC64';
     if (mode.endsWith('ia32')) return 'ReleaseIA32';
     if (mode.endsWith('x64')) return 'ReleaseX64';
     if (mode.endsWith('arm32')) return 'ReleaseSIMARM';
     if (mode.endsWith('arm64')) return 'ReleaseSIMARM64';
-    if (mode.endsWith('dbc')) return 'ReleaseSIMDBC';
+    if (mode.endsWith('dbc32')) return 'ReleaseSIMDBC';
     if (mode.endsWith('dbc64')) return 'ReleaseSIMDBC64';
     throw ('unknown tag in mode: $mode');
   }
@@ -137,10 +142,9 @@
 /// Concrete test runner of Dart JIT.
 class TestRunnerJIT implements TestRunner {
   TestRunnerJIT(String prefix, String tag, String top, String tmp, this.env,
-      List<String> extraFlags) {
+      this.fileName, List<String> extraFlags) {
     description = '$prefix-$tag';
     dart = '$top/out/$tag/dart';
-    fileName = '$tmp/fuzz.dart';
     cmd = [dart, "--deterministic"] + extraFlags + [fileName];
   }
 
@@ -158,11 +162,10 @@
 /// Concrete test runner of Dart AOT.
 class TestRunnerAOT implements TestRunner {
   TestRunnerAOT(String prefix, String tag, String top, String tmp,
-      Map<String, String> e, List<String> extraFlags) {
+      Map<String, String> e, this.fileName, List<String> extraFlags) {
     description = '$prefix-$tag';
     precompiler = '$top/pkg/vm/tool/precompiler2';
     dart = '$top/pkg/vm/tool/dart_precompiled_runtime2';
-    fileName = '$tmp/fuzz.dart';
     snapshot = '$tmp/snapshot';
     env = Map<String, String>.from(e);
     env['DART_CONFIGURATION'] = tag;
@@ -171,7 +174,7 @@
 
   TestResult run() {
     TestResult result = runCommand([precompiler, fileName, snapshot], env);
-    if (result.code != ResultCode.success) {
+    if (result.exitCode != 0) {
       return result;
     }
     return runCommand([dart, snapshot], env);
@@ -188,21 +191,26 @@
 /// Concrete test runner of bytecode.
 class TestRunnerKBC implements TestRunner {
   TestRunnerKBC(String prefix, String tag, String top, String tmp, this.env,
-      List<String> extraFlags) {
+      this.fileName, List<String> extraFlags, bool kbcSrc) {
     description = '$prefix-$tag';
-    generate = '$top/pkg/vm/tool/gen_kernel';
-    platform = '--platform=$top/out/$tag/vm_platform_strong.dill';
-    dill = '$tmp/out.dill';
     dart = '$top/out/$tag/dart';
-    fileName = '$tmp/fuzz.dart';
-    cmd = [dart] + extraFlags + [dill];
+    if (kbcSrc) {
+      cmd = [dart] + extraFlags + [fileName];
+    } else {
+      generate = '$top/pkg/vm/tool/gen_kernel';
+      platform = '--platform=$top/out/$tag/vm_platform_strong.dill';
+      dill = '$tmp/out.dill';
+      cmd = [dart] + extraFlags + [dill];
+    }
   }
 
   TestResult run() {
-    TestResult result = runCommand(
-        [generate, '--gen-bytecode', platform, '-o', dill, fileName], env);
-    if (result.code != ResultCode.success) {
-      return result;
+    if (generate != null) {
+      TestResult result = runCommand(
+          [generate, '--gen-bytecode', platform, '-o', dill, fileName], env);
+      if (result.exitCode != 0) {
+        return result;
+      }
     }
     return runCommand(cmd, env);
   }
@@ -219,16 +227,16 @@
 
 /// Concrete test runner of Dart2JS.
 class TestRunnerDJS implements TestRunner {
-  TestRunnerDJS(String prefix, String tag, String top, String tmp, this.env) {
+  TestRunnerDJS(String prefix, String tag, String top, String tmp, this.env,
+      this.fileName) {
     description = '$prefix-$tag';
     dart2js = '$top/sdk/bin/dart2js';
-    fileName = '$tmp/fuzz.dart';
     js = '$tmp/out.js';
   }
 
   TestResult run() {
     TestResult result = runCommand([dart2js, fileName, '-o', js], env);
-    if (result.code != ResultCode.success) {
+    if (result.exitCode != 0) {
       return result;
     }
     return runCommand(['nodejs', js], env);
@@ -244,7 +252,7 @@
 /// Class to run fuzz testing.
 class DartFuzzTest {
   DartFuzzTest(this.env, this.repeat, this.time, this.trueDivergence,
-      this.showStats, this.top, this.mode1, this.mode2);
+      this.showStats, this.top, this.mode1, this.mode2, this.rerun);
 
   int run() {
     setup();
@@ -280,9 +288,12 @@
     rand = new Random();
     tmpDir = Directory.systemTemp.createTempSync('dart_fuzz');
     fileName = '${tmpDir.path}/fuzz.dart';
-    runner1 = TestRunner.getTestRunner(mode1, top, tmpDir.path, env, rand);
-    runner2 = TestRunner.getTestRunner(mode2, top, tmpDir.path, env, rand);
-    isolate = 'Isolate (${tmpDir.path}) '
+    runner1 =
+        TestRunner.getTestRunner(mode1, top, tmpDir.path, env, fileName, rand);
+    runner2 =
+        TestRunner.getTestRunner(mode2, top, tmpDir.path, env, fileName, rand);
+    fp = samePrecision(mode1, mode2);
+    isolate = 'Isolate (${tmpDir.path}) ${fp ? "" : "NO-"}FP : '
         '${runner1.description} - ${runner2.description}';
 
     start_time = new DateTime.now().millisecondsSinceEpoch;
@@ -297,6 +308,10 @@
     numDivergences = 0;
   }
 
+  bool samePrecision(String mode1, String mode2) {
+    return mode1.contains('64') == mode2.contains('64');
+  }
+
   bool timeIsUp() {
     if (time > 0) {
       current_time = new DateTime.now().millisecondsSinceEpoch;
@@ -324,33 +339,42 @@
 
   void generateTest() {
     final file = new File(fileName).openSync(mode: FileMode.write);
-    new DartFuzz(seed, file).run();
+    new DartFuzz(seed, fp, file).run();
     file.closeSync();
   }
 
   void runTest() {
     TestResult result1 = runner1.run();
     TestResult result2 = runner2.run();
-    checkDivergence(result1, result2);
+    if (checkDivergence(result1, result2) == ReportStatus.rerun && rerun) {
+      print("\nCommencing re-run .... \n");
+      numDivergences--;
+      result1 = runner1.run();
+      result2 = runner2.run();
+      if (checkDivergence(result1, result2) == ReportStatus.no_divergence) {
+        print("\nNo error on re-run\n");
+      }
+    }
   }
 
-  void checkDivergence(TestResult result1, TestResult result2) {
-    if (result1.code == result2.code) {
+  ReportStatus checkDivergence(TestResult result1, TestResult result2) {
+    if (result1.exitCode == result2.exitCode) {
       // No divergence in result code.
-      switch (result1.code) {
-        case ResultCode.success:
+      switch (result1.exitCode) {
+        case 0:
           // Both were successful, inspect output.
           if (result1.output == result2.output) {
             numSuccess++;
           } else {
-            reportDivergence(result1, result2, true);
+            reportDivergence(result1, result2);
+            return ReportStatus.reported;
           }
           break;
-        case ResultCode.timeout:
+        case -sigkill:
           // Both had a time out.
           numTimeOut++;
           break;
-        case ResultCode.error:
+        default:
           // Both had an error.
           numNotRun++;
           break;
@@ -360,22 +384,35 @@
       if (trueDivergence) {
         // When only true divergences are requested, any divergence
         // with at least one time out is treated as a regular time out.
-        if (result1.code == ResultCode.timeout ||
-            result2.code == ResultCode.timeout) {
+        if (result1.exitCode == -sigkill || result2.exitCode == -sigkill) {
           numTimeOut++;
-          return;
+          return ReportStatus.ignored;
         }
       }
-      reportDivergence(result1, result2, false);
+      reportDivergence(result1, result2);
+      // Exit codes outside [-255,255] are not due to Dart VM exits.
+      if (result1.exitCode.abs() > 255 || result2.exitCode.abs() > 255) {
+        return ReportStatus.rerun;
+      } else {
+        return ReportStatus.reported;
+      }
+    }
+    return ReportStatus.no_divergence;
+  }
+
+  String generateReport(TestResult result1, TestResult result2) {
+    if (result1.exitCode == result2.exitCode) {
+      return "output";
+    } else {
+      return "${result1.exitCode} vs ${result2.exitCode}";
     }
   }
 
-  void reportDivergence(
-      TestResult result1, TestResult result2, bool outputDivergence) {
+  void reportDivergence(TestResult result1, TestResult result2) {
     numDivergences++;
-    print(
-        '\n${isolate}: !DIVERGENCE! $version:$seed (output=${outputDivergence})');
-    if (outputDivergence) {
+    String report = generateReport(result1, result2);
+    print('\n${isolate}: !DIVERGENCE! $version:$seed (${report})');
+    if (result1.exitCode == result2.exitCode) {
       // Only report the actual output divergence details when requested,
       // since this output may be lengthy and should be reproducable anyway.
       if (showStats) {
@@ -383,11 +420,13 @@
       }
     } else {
       // For any other divergence, always report what went wrong.
-      if (result1.code != ResultCode.success) {
-        print('\nfail1:\n${result1.output}\n');
+      if (result1.exitCode != 0) {
+        print(
+            '\nfail1:\n${result1.exitCode}\n${result1.output}\n${result1.stderr}\n');
       }
-      if (result2.code != ResultCode.success) {
-        print('\nfail2:\n${result2.output}\n');
+      if (result2.exitCode != 0) {
+        print(
+            '\nfail2:\n${result2.exitCode}\n${result2.output}\n${result2.stderr}\n');
       }
     }
   }
@@ -401,6 +440,7 @@
   final String top;
   final String mode1;
   final String mode2;
+  final bool rerun;
 
   // Test.
   Random rand;
@@ -408,6 +448,7 @@
   String fileName;
   TestRunner runner1;
   TestRunner runner2;
+  bool fp;
   String isolate;
   int seed;
 
@@ -427,8 +468,16 @@
 
 /// Class to start fuzz testing session.
 class DartFuzzTestSession {
-  DartFuzzTestSession(this.isolates, this.repeat, this.time,
-      this.trueDivergence, this.showStats, String tp, this.mode1, this.mode2)
+  DartFuzzTestSession(
+      this.isolates,
+      this.repeat,
+      this.time,
+      this.trueDivergence,
+      this.showStats,
+      String tp,
+      this.mode1,
+      this.mode2,
+      this.rerun)
       : top = getTop(tp) {}
 
   start() async {
@@ -479,7 +528,8 @@
           session.showStats,
           session.top,
           m1,
-          m2);
+          m2,
+          session.rerun);
       divergences = fuzz.run();
     } catch (e) {
       print('Isolate: $e');
@@ -521,6 +571,7 @@
   final int time;
   final bool trueDivergence;
   final bool showStats;
+  final bool rerun;
   final String top;
   final String mode1;
   final String mode2;
@@ -540,20 +591,38 @@
     'jit-arm64',
     'aot-debug-x64',
     'aot-x64',
+    'kbc-int-debug-ia32',
+    'kbc-cmp-debug-ia32',
+    'kbc-mix-debug-ia32',
     'kbc-int-debug-x64',
     'kbc-cmp-debug-x64',
     'kbc-mix-debug-x64',
+    'kbc-int-debug-arm32',
+    'kbc-cmp-debug-arm32',
+    'kbc-mix-debug-arm32',
+    'kbc-int-debug-arm64',
+    'kbc-cmp-debug-arm64',
+    'kbc-mix-debug-arm64',
+    'kbc-int-ia32',
+    'kbc-cmp-ia32',
+    'kbc-mix-ia32',
     'kbc-int-x64',
     'kbc-cmp-x64',
     'kbc-mix-x64',
+    'kbc-int-arm32',
+    'kbc-cmp-arm32',
+    'kbc-mix-arm32',
+    'kbc-int-arm64',
+    'kbc-cmp-arm64',
+    'kbc-mix-arm64',
   ];
 
   // Modes not used on cluster runs because they have outstanding issues.
   static const List<String> nonClusterModes = [
     // Deprecated.
-    'jit-debug-dbc',
+    'jit-debug-dbc32',
     'jit-debug-dbc64',
-    'jit-dbc',
+    'jit-dbc32',
     'jit-dbc64',
     // Times out often:
     'aot-debug-arm32',
@@ -582,6 +651,10 @@
     ..addOption('dart-top', help: 'explicit value for \$DART_TOP')
     ..addOption('mode1', help: 'execution mode 1')
     ..addOption('mode2', help: 'execution mode 2')
+    ..addFlag('rerun',
+        negatable: true,
+        help: 're-run if test only diverges on return code (not in the output)',
+        defaultsTo: true)
     // Undocumented options for cluster runs.
     ..addOption('shards',
         help: 'number of shards used in cluster run', defaultsTo: '1')
@@ -607,7 +680,8 @@
             results['show-stats'],
             results['dart-top'],
             results['mode1'],
-            results['mode2'])
+            results['mode2'],
+            results['rerun'])
         .start();
   } catch (e) {
     print('Usage: dart dartfuzz_test.dart [OPTIONS]\n${parser.usage}\n$e');
diff --git a/runtime/tools/dartfuzz/gen_api_table.dart b/runtime/tools/dartfuzz/gen_api_table.dart
index 8b9504c..4842ff0 100755
--- a/runtime/tools/dartfuzz/gen_api_table.dart
+++ b/runtime/tools/dartfuzz/gen_api_table.dart
@@ -128,7 +128,9 @@
 
 void visitClass(ClassElement classElement) {
   // Classes that cause too many false divergences.
-  if (classElement.name == 'ProcessInfo' || classElement.name == 'Platform') {
+  if (classElement.name == 'ProcessInfo' ||
+      classElement.name == 'Platform' ||
+      classElement.name.startsWith('FileSystem')) {
     return;
   }
   // Every class element contains elements for the members, viz. `methods` visits
@@ -253,17 +255,14 @@
     return;
   }
   // Avoid some obvious false divergences.
-  if (name == 'pid' ||
-      name == 'hashCode' ||
-      name == 'Platform.executable' ||
-      name == 'Platform.resolvedExecutable') {
+  if (name == 'pid' || name == 'hashCode' || name == 'exitCode') {
     return;
   }
   // Restrict parameters for a few hardcoded cases,
   // for example, to avoid excessive runtime or memory
   // allocation in the generated fuzzing program.
   if (name == 'padLeft' || name == 'padRight') {
-    proto = proto.replaceAll('I', 'i');
+    proto = proto.replaceFirst('IS', 'is');
   } else if (name == 'List.filled') {
     proto = proto.replaceFirst('I', 'i');
   }
@@ -295,6 +294,7 @@
 ///   i int (small)
 ///   D double
 ///   S String
+///   s String (small)
 ///   L List<int>
 ///   X Set<int>
 ///   M Map<int, String>
diff --git a/runtime/tools/gen_library_src_paths.py b/runtime/tools/gen_library_src_paths.py
index cd1f38d..56d770a 100755
--- a/runtime/tools/gen_library_src_paths.py
+++ b/runtime/tools/gen_library_src_paths.py
@@ -17,119 +17,121 @@
 
 
 def makeString(input_file, var_name):
-  result = 'static const char ' + var_name + '[] = {\n '
-  fileHandle = open(input_file, 'rb')
-  lineCounter = 0
-  for byte in fileHandle.read():
-    result += '\'\\x%02x' % ord(byte) + '\', '
-    lineCounter += 1
-    if lineCounter == 19:
-      result += '\n '
-      lineCounter = 0
-  result += '0};\n'
-  return result
+    result = 'static const char ' + var_name + '[] = {\n '
+    fileHandle = open(input_file, 'rb')
+    lineCounter = 0
+    for byte in fileHandle.read():
+        result += '\'\\x%02x' % ord(byte) + '\', '
+        lineCounter += 1
+        if lineCounter == 19:
+            result += '\n '
+            lineCounter = 0
+    result += '0};\n'
+    return result
+
 
 def makeSourceArrays(in_files):
-  result = '';
-  file_count = 0;
-  for string_file in in_files:
-    if string_file.endswith('.dart'):
-      file_count += 1
-      file_string = makeString(string_file, "source_array_" + str(file_count))
-      result += file_string
-  return result
+    result = ''
+    file_count = 0
+    for string_file in in_files:
+        if string_file.endswith('.dart'):
+            file_count += 1
+            file_string = makeString(string_file,
+                                     "source_array_" + str(file_count))
+            result += file_string
+    return result
+
 
 def makeFile(output_file, input_cc_file, include, var_name, lib_name, in_files):
-  part_index = [ ]
-  bootstrap_cc_text = open(input_cc_file).read()
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{SOURCE_ARRAYS}}", makeSourceArrays(in_files))
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{INCLUDE}}", include)
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{VAR_NAME}}", var_name)
-  main_file_found = False
-  file_count = 0
-  for string_file in in_files:
-    if string_file.endswith('.dart'):
-      file_count += 1
-      if (not main_file_found):
-        inpt = open(string_file, 'r')
-        for line in inpt:
-          # File with library tag is the main file.
-          if line.startswith('library '):
-            main_file_found = True
-            bootstrap_cc_text = bootstrap_cc_text.replace(
-                 "{{LIBRARY_SOURCE_MAP}}",
-                 ' "' + lib_name + '",\n' +
-                 ' source_array_' + str(file_count) + ',\n')
-        inpt.close()
-        if (main_file_found):
-          continue
-      part_index.append(' "' +
-          lib_name + "/" + os.path.basename(string_file).replace('\\', '\\\\') + '",\n')
-      part_index.append(' source_array_' + str(file_count) + ',\n\n')
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{LIBRARY_SOURCE_MAP}}", '')
-  bootstrap_cc_text = bootstrap_cc_text.replace("{{PART_SOURCE_MAP}}",
-                                                ''.join(part_index))
-  open(output_file, 'w').write(bootstrap_cc_text)
-  return True
+    part_index = []
+    bootstrap_cc_text = open(input_cc_file).read()
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{SOURCE_ARRAYS}}",
+                                                  makeSourceArrays(in_files))
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{INCLUDE}}", include)
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{VAR_NAME}}", var_name)
+    main_file_found = False
+    file_count = 0
+    for string_file in in_files:
+        if string_file.endswith('.dart'):
+            file_count += 1
+            if (not main_file_found):
+                inpt = open(string_file, 'r')
+                for line in inpt:
+                    # File with library tag is the main file.
+                    if line.startswith('library '):
+                        main_file_found = True
+                        bootstrap_cc_text = bootstrap_cc_text.replace(
+                            "{{LIBRARY_SOURCE_MAP}}", ' "' + lib_name + '",\n' +
+                            ' source_array_' + str(file_count) + ',\n')
+                inpt.close()
+                if (main_file_found):
+                    continue
+            part_index.append(' "' + lib_name + "/" + os.path.basename(
+                string_file).replace('\\', '\\\\') + '",\n')
+            part_index.append(' source_array_' + str(file_count) + ',\n\n')
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{LIBRARY_SOURCE_MAP}}", '')
+    bootstrap_cc_text = bootstrap_cc_text.replace("{{PART_SOURCE_MAP}}",
+                                                  ''.join(part_index))
+    open(output_file, 'w').write(bootstrap_cc_text)
+    return True
+
 
 def main(args):
-  try:
-    # Parse input.
-    parser = OptionParser()
-    parser.add_option("--output",
-                      action="store", type="string",
-                      help="output file name")
-    parser.add_option("--input_cc",
-                      action="store", type="string",
-                      help="input template file")
-    parser.add_option("--include",
-                      action="store", type="string",
-                      help="variable name")
-    parser.add_option("--library_name",
-                      action="store", type="string",
-                      help="library name")
-    parser.add_option("--var_name",
-                      action="store", type="string",
-                      help="variable name")
+    try:
+        # Parse input.
+        parser = OptionParser()
+        parser.add_option(
+            "--output", action="store", type="string", help="output file name")
+        parser.add_option(
+            "--input_cc",
+            action="store",
+            type="string",
+            help="input template file")
+        parser.add_option(
+            "--include", action="store", type="string", help="variable name")
+        parser.add_option(
+            "--library_name",
+            action="store",
+            type="string",
+            help="library name")
+        parser.add_option(
+            "--var_name", action="store", type="string", help="variable name")
 
-    (options, args) = parser.parse_args()
-    if not options.output:
-      sys.stderr.write('--output not specified\n')
-      return -1
-    if not len(options.input_cc):
-      sys.stderr.write('--input_cc not specified\n')
-      return -1
-    if not len(options.include):
-      sys.stderr.write('--include not specified\n')
-      return -1
-    if not len(options.var_name):
-      sys.stderr.write('--var_name not specified\n')
-      return -1
-    if not len(options.library_name):
-      sys.stderr.write('--library_name not specified\n')
-      return -1
-    if len(args) == 0:
-      sys.stderr.write('No input files specified\n')
-      return -1
+        (options, args) = parser.parse_args()
+        if not options.output:
+            sys.stderr.write('--output not specified\n')
+            return -1
+        if not len(options.input_cc):
+            sys.stderr.write('--input_cc not specified\n')
+            return -1
+        if not len(options.include):
+            sys.stderr.write('--include not specified\n')
+            return -1
+        if not len(options.var_name):
+            sys.stderr.write('--var_name not specified\n')
+            return -1
+        if not len(options.library_name):
+            sys.stderr.write('--library_name not specified\n')
+            return -1
+        if len(args) == 0:
+            sys.stderr.write('No input files specified\n')
+            return -1
 
-    files = [ ]
-    for arg in args:
-      files.append(arg)
+        files = []
+        for arg in args:
+            files.append(arg)
 
-    if not makeFile(options.output,
-                    options.input_cc,
-                    options.include,
-                    options.var_name,
-                    options.library_name,
-                    files):
-      return -1
+        if not makeFile(options.output, options.input_cc, options.include,
+                        options.var_name, options.library_name, files):
+            return -1
 
-    return 0
-  except Exception, inst:
-    sys.stderr.write('gen_library_src_paths.py exception\n')
-    sys.stderr.write(str(inst))
-    sys.stderr.write('\n')
-    return -1
+        return 0
+    except Exception, inst:
+        sys.stderr.write('gen_library_src_paths.py exception\n')
+        sys.stderr.write(str(inst))
+        sys.stderr.write('\n')
+        return -1
+
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/runtime/tools/layering_check.py b/runtime/tools/layering_check.py
index 50a9b25..e686ce9 100755
--- a/runtime/tools/layering_check.py
+++ b/runtime/tools/layering_check.py
@@ -18,110 +18,115 @@
 INCLUDE_DIRECTIVE_RE = re.compile(r'^#include "(.*)"')
 
 RUNTIME_LAYER_HEADERS = [
-  'runtime/vm/isolate.h',
-  'runtime/vm/object.h',
-  'runtime/vm/raw_object.h',
-  'runtime/vm/thread.h',
+    'runtime/vm/isolate.h',
+    'runtime/vm/object.h',
+    'runtime/vm/raw_object.h',
+    'runtime/vm/thread.h',
 ]
 
 SHOULD_NOT_DEPEND_ON_RUNTIME = [
-  'runtime/vm/allocation.h',
-  'runtime/vm/growable_array.h',
+    'runtime/vm/allocation.h',
+    'runtime/vm/growable_array.h',
 ]
 
+
 class LayeringChecker(object):
-  def __init__(self, root):
-    self.root = root
-    self.worklist = set()
-    # Mapping from header to a set of files it is included into.
-    self.included_into = dict()
-    # Set of files that were parsed to avoid double parsing.
-    self.loaded = set()
-    # Mapping from headers to their layer.
-    self.file_layers = {file: 'runtime' for file in RUNTIME_LAYER_HEADERS}
 
-  def Check(self):
-    self.AddAllSourcesToWorklist(os.path.join(self.root, 'runtime/vm'))
-    self.BuildIncludesGraph()
-    errors = self.PropagateLayers()
-    errors += self.CheckNotInRuntime(SHOULD_NOT_DEPEND_ON_RUNTIME)
-    return errors
+    def __init__(self, root):
+        self.root = root
+        self.worklist = set()
+        # Mapping from header to a set of files it is included into.
+        self.included_into = dict()
+        # Set of files that were parsed to avoid double parsing.
+        self.loaded = set()
+        # Mapping from headers to their layer.
+        self.file_layers = {file: 'runtime' for file in RUNTIME_LAYER_HEADERS}
 
-  def CheckNotInRuntime(self, files):
-    """Check that given files do not depend on runtime layer."""
-    errors = []
-    for file in files:
-      if not os.path.exists(os.path.join(self.root, file)):
-        errors.append('File %s does not exist.' % (file))
-      if self.file_layers.get(file) is not None:
-        errors.append(
-            'LAYERING ERROR: %s includes object.h or raw_object.h' % (file))
-    return errors
+    def Check(self):
+        self.AddAllSourcesToWorklist(os.path.join(self.root, 'runtime/vm'))
+        self.BuildIncludesGraph()
+        errors = self.PropagateLayers()
+        errors += self.CheckNotInRuntime(SHOULD_NOT_DEPEND_ON_RUNTIME)
+        return errors
 
-  def BuildIncludesGraph(self):
-    while self.worklist:
-      file = self.worklist.pop()
-      deps = self.ExtractIncludes(file)
-      self.loaded.add(file)
-      for d in deps:
-        if d not in self.included_into:
-          self.included_into[d] = set()
-        self.included_into[d].add(file)
-        if d not in self.loaded:
-          self.worklist.add(d)
+    def CheckNotInRuntime(self, files):
+        """Check that given files do not depend on runtime layer."""
+        errors = []
+        for file in files:
+            if not os.path.exists(os.path.join(self.root, file)):
+                errors.append('File %s does not exist.' % (file))
+            if self.file_layers.get(file) is not None:
+                errors.append(
+                    'LAYERING ERROR: %s includes object.h or raw_object.h' %
+                    (file))
+        return errors
 
-  def PropagateLayers(self):
-    """Propagate layering information through include graph.
+    def BuildIncludesGraph(self):
+        while self.worklist:
+            file = self.worklist.pop()
+            deps = self.ExtractIncludes(file)
+            self.loaded.add(file)
+            for d in deps:
+                if d not in self.included_into:
+                    self.included_into[d] = set()
+                self.included_into[d].add(file)
+                if d not in self.loaded:
+                    self.worklist.add(d)
+
+    def PropagateLayers(self):
+        """Propagate layering information through include graph.
 
     If A is in layer L and A is included into B then B is in layer L.
     """
-    errors = []
-    self.worklist = set(self.file_layers.keys())
-    while self.worklist:
-      file = self.worklist.pop()
-      if file not in self.included_into:
-        continue
-      file_layer = self.file_layers[file]
-      for tgt in self.included_into[file]:
-        if tgt in self.file_layers:
-          if self.file_layers[tgt] != file_layer:
-            errors.add('Layer mismatch: %s (%s) is included into %s (%s)' % (
-                file, file_layer, tgt, self.file_layers[tgt]))
-        self.file_layers[tgt] = file_layer
-        self.worklist.add(tgt)
-    return errors
+        errors = []
+        self.worklist = set(self.file_layers.keys())
+        while self.worklist:
+            file = self.worklist.pop()
+            if file not in self.included_into:
+                continue
+            file_layer = self.file_layers[file]
+            for tgt in self.included_into[file]:
+                if tgt in self.file_layers:
+                    if self.file_layers[tgt] != file_layer:
+                        errors.add(
+                            'Layer mismatch: %s (%s) is included into %s (%s)' %
+                            (file, file_layer, tgt, self.file_layers[tgt]))
+                self.file_layers[tgt] = file_layer
+                self.worklist.add(tgt)
+        return errors
 
-  def AddAllSourcesToWorklist(self, dir):
-    """Add all *.cc and *.h files from dir recursively into worklist."""
-    for file in os.listdir(dir):
-      path = os.path.join(dir, file)
-      if os.path.isdir(path):
-        self.AddAllSourcesToWorklist(path)
-      elif path.endswith('.cc') or path.endswith('.h'):
-        self.worklist.add(os.path.relpath(path, self.root))
+    def AddAllSourcesToWorklist(self, dir):
+        """Add all *.cc and *.h files from dir recursively into worklist."""
+        for file in os.listdir(dir):
+            path = os.path.join(dir, file)
+            if os.path.isdir(path):
+                self.AddAllSourcesToWorklist(path)
+            elif path.endswith('.cc') or path.endswith('.h'):
+                self.worklist.add(os.path.relpath(path, self.root))
 
-  def ExtractIncludes(self, file):
-    """Extract the list of includes from the given file."""
-    deps = set()
-    with open(os.path.join(self.root, file)) as file:
-      for line in file:
-        if line.startswith('namespace dart {'):
-          break
+    def ExtractIncludes(self, file):
+        """Extract the list of includes from the given file."""
+        deps = set()
+        with open(os.path.join(self.root, file)) as file:
+            for line in file:
+                if line.startswith('namespace dart {'):
+                    break
 
-        m = INCLUDE_DIRECTIVE_RE.match(line)
-        if m is not None:
-          header = os.path.join('runtime', m.group(1))
-          if os.path.isfile(os.path.join(self.root,header)):
-            deps.add(header)
-    return deps
+                m = INCLUDE_DIRECTIVE_RE.match(line)
+                if m is not None:
+                    header = os.path.join('runtime', m.group(1))
+                    if os.path.isfile(os.path.join(self.root, header)):
+                        deps.add(header)
+        return deps
+
 
 def DoCheck(sdk_root):
-  """Run layering check at the given root folder."""
-  return LayeringChecker(sdk_root).Check()
+    """Run layering check at the given root folder."""
+    return LayeringChecker(sdk_root).Check()
+
 
 if __name__ == '__main__':
-  errors = DoCheck('.')
-  print '\n'.join(errors)
-  if errors:
-    sys.exit(-1)
-
+    errors = DoCheck('.')
+    print '\n'.join(errors)
+    if errors:
+        sys.exit(-1)
diff --git a/runtime/tools/utils.py b/runtime/tools/utils.py
index 595a9ca..4148bd3 100644
--- a/runtime/tools/utils.py
+++ b/runtime/tools/utils.py
@@ -19,133 +19,145 @@
 
 # Try to guess the host operating system.
 def GuessOS():
-  id = platform.system()
-  if id == "Linux":
-    return "linux"
-  elif id == "Darwin":
-    return "macos"
-  elif id == "Windows" or id == "Microsoft":
-    # On Windows Vista platform.system() can return "Microsoft" with some
-    # versions of Python, see http://bugs.python.org/issue1082 for details.
-    return "win32"
-  elif id == 'FreeBSD':
-    return 'freebsd'
-  elif id == 'OpenBSD':
-    return 'openbsd'
-  elif id == 'SunOS':
-    return 'solaris'
-  else:
-    return None
+    id = platform.system()
+    if id == "Linux":
+        return "linux"
+    elif id == "Darwin":
+        return "macos"
+    elif id == "Windows" or id == "Microsoft":
+        # On Windows Vista platform.system() can return "Microsoft" with some
+        # versions of Python, see http://bugs.python.org/issue1082 for details.
+        return "win32"
+    elif id == 'FreeBSD':
+        return 'freebsd'
+    elif id == 'OpenBSD':
+        return 'openbsd'
+    elif id == 'SunOS':
+        return 'solaris'
+    else:
+        return None
 
 
 # Try to guess the host architecture.
 def GuessArchitecture():
-  id = platform.machine()
-  if id.startswith('arm'):
-    return 'arm'
-  elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
-    return 'ia32'
-  elif id == 'i86pc':
-    return 'ia32'
-  else:
-    return None
+    id = platform.machine()
+    if id.startswith('arm'):
+        return 'arm'
+    elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
+        return 'ia32'
+    elif id == 'i86pc':
+        return 'ia32'
+    else:
+        return None
 
 
 # Try to guess the number of cpus on this machine.
 def GuessCpus():
-  if os.path.exists("/proc/cpuinfo"):
-    return int(commands.getoutput("GREP_OPTIONS= grep -E '^processor' /proc/cpuinfo | wc -l"))
-  if os.path.exists("/usr/bin/hostinfo"):
-    return int(commands.getoutput('/usr/bin/hostinfo | GREP_OPTIONS= grep "processors are logically available." | awk "{ print \$1 }"'))
-  win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
-  if win_cpu_count:
-    return int(win_cpu_count)
-  return int(os.getenv("DART_NUMBER_OF_CORES", 2))
+    if os.path.exists("/proc/cpuinfo"):
+        return int(
+            commands.getoutput(
+                "GREP_OPTIONS= grep -E '^processor' /proc/cpuinfo | wc -l"))
+    if os.path.exists("/usr/bin/hostinfo"):
+        return int(
+            commands.getoutput(
+                '/usr/bin/hostinfo | GREP_OPTIONS= grep "processors are logically available." | awk "{ print \$1 }"'
+            ))
+    win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
+    if win_cpu_count:
+        return int(win_cpu_count)
+    return int(os.getenv("DART_NUMBER_OF_CORES", 2))
 
 
 # Returns true if we're running under Windows.
 def IsWindows():
-  return GuessOS() == 'win32'
+    return GuessOS() == 'win32'
 
 
 # Reads a text file into an array of strings - one for each
 # line. Strips comments in the process.
 def ReadLinesFrom(name):
-  result = []
-  for line in open(name):
-    if '#' in line:
-      line = line[:line.find('#')]
-    line = line.strip()
-    if len(line) == 0:
-      continue
-    result.append(line)
-  return result
+    result = []
+    for line in open(name):
+        if '#' in line:
+            line = line[:line.find('#')]
+        line = line.strip()
+        if len(line) == 0:
+            continue
+        result.append(line)
+    return result
+
 
 # Filters out all arguments until the next '--' argument
 # occurs.
 def ListArgCallback(option, opt_str, value, parser):
-   if value is None:
-     value = []
+    if value is None:
+        value = []
 
-   for arg in parser.rargs:
-     if arg[:2].startswith('--'):
-       break
-     value.append(arg)
+    for arg in parser.rargs:
+        if arg[:2].startswith('--'):
+            break
+        value.append(arg)
 
-   del parser.rargs[:len(value)]
-   setattr(parser.values, option.dest, value)
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
 
 
 # Filters out all argument until the first non '-' or the
 # '--' argument occurs.
 def ListDashArgCallback(option, opt_str, value, parser):
-   if value is None:
-     value = []
+    if value is None:
+        value = []
 
-   for arg in parser.rargs:
-     if arg[:2].startswith('--') or arg[0] != '-':
-       break
-     value.append(arg)
+    for arg in parser.rargs:
+        if arg[:2].startswith('--') or arg[0] != '-':
+            break
+        value.append(arg)
 
-   del parser.rargs[:len(value)]
-   setattr(parser.values, option.dest, value)
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
 
 
 # Mapping table between build mode and build configuration.
 BUILD_MODES = {
-  'debug': 'Debug',
-  'release': 'Release',
+    'debug': 'Debug',
+    'release': 'Release',
 }
 
-
 # Mapping table between OS and build output location.
 BUILD_ROOT = {
-  'linux': os.path.join('out'),
-  'freebsd': os.path.join('out'),
-  'macos': os.path.join('xcodebuild'),
+    'linux': os.path.join('out'),
+    'freebsd': os.path.join('out'),
+    'macos': os.path.join('xcodebuild'),
 }
 
+
 def GetBuildMode(mode):
-  global BUILD_MODES
-  return BUILD_MODES[mode]
+    global BUILD_MODES
+    return BUILD_MODES[mode]
 
 
 def GetBuildConf(mode, arch):
-  return GetBuildMode(mode) + arch.upper()
+    return GetBuildMode(mode) + arch.upper()
 
 
 def GetBuildRoot(host_os, mode=None, arch=None):
-  global BUILD_ROOT
-  if mode:
-    return os.path.join(BUILD_ROOT[host_os], GetBuildConf(mode, arch))
-  else:
-    return BUILD_ROOT[host_os]
+    global BUILD_ROOT
+    if mode:
+        return os.path.join(BUILD_ROOT[host_os], GetBuildConf(mode, arch))
+    else:
+        return BUILD_ROOT[host_os]
 
 
-def RunCommand(command, input=None, pollFn=None, outStream=None, errStream=None,
-               killOnEarlyReturn=True, verbose=False, debug=False,
+def RunCommand(command,
+               input=None,
+               pollFn=None,
+               outStream=None,
+               errStream=None,
+               killOnEarlyReturn=True,
+               verbose=False,
+               debug=False,
                printErrorInfo=False):
-  """
+    """
   Run a command, with optional input and polling function.
 
   Args:
@@ -171,94 +183,98 @@
     Raises Error if the subprocess returns an error code.
     Raises ValueError if called with invalid arguments.
   """
-  if verbose:
-    sys.stderr.write("command %s\n" % command)
-  stdin = None
-  if input:
-    stdin = subprocess.PIPE
-  try:
-    process = subprocess.Popen(args=command,
-                               stdin=stdin,
-                               bufsize=1,
-                               stdout=subprocess.PIPE,
-                               stderr=subprocess.PIPE)
-  except OSError as e:
-    if not isinstance(command, basestring):
-      command = ' '.join(command)
-    if printErrorInfo:
-      sys.stderr.write("Command failed: '%s'\n" % command)
-    raise Error(e)
-
-  def StartThread(out):
-    queue = Queue.Queue()
-    def EnqueueOutput(out, queue):
-      for line in iter(out.readline, b''):
-        queue.put(line)
-      out.close()
-    thread = threading.Thread(target=EnqueueOutput, args=(out, queue))
-    thread.daemon = True
-    thread.start()
-    return queue
-  outQueue = StartThread(process.stdout)
-  errQueue = StartThread(process.stderr)
-
-  def ReadQueue(queue, out, out2):
+    if verbose:
+        sys.stderr.write("command %s\n" % command)
+    stdin = None
+    if input:
+        stdin = subprocess.PIPE
     try:
-      while True:
-        line = queue.get(False)
-        out.write(line)
-        if out2 != None:
-          out2.write(line)
-    except Queue.Empty:
-      pass
+        process = subprocess.Popen(
+            args=command,
+            stdin=stdin,
+            bufsize=1,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE)
+    except OSError as e:
+        if not isinstance(command, basestring):
+            command = ' '.join(command)
+        if printErrorInfo:
+            sys.stderr.write("Command failed: '%s'\n" % command)
+        raise Error(e)
 
-  outBuf = StringIO.StringIO()
-  errorBuf = StringIO.StringIO()
-  if input:
-    process.stdin.write(input)
-  while True:
-    returncode = process.poll()
-    if returncode != None:
-      break
+    def StartThread(out):
+        queue = Queue.Queue()
+
+        def EnqueueOutput(out, queue):
+            for line in iter(out.readline, b''):
+                queue.put(line)
+            out.close()
+
+        thread = threading.Thread(target=EnqueueOutput, args=(out, queue))
+        thread.daemon = True
+        thread.start()
+        return queue
+
+    outQueue = StartThread(process.stdout)
+    errQueue = StartThread(process.stderr)
+
+    def ReadQueue(queue, out, out2):
+        try:
+            while True:
+                line = queue.get(False)
+                out.write(line)
+                if out2 != None:
+                    out2.write(line)
+        except Queue.Empty:
+            pass
+
+    outBuf = StringIO.StringIO()
+    errorBuf = StringIO.StringIO()
+    if input:
+        process.stdin.write(input)
+    while True:
+        returncode = process.poll()
+        if returncode != None:
+            break
+        ReadQueue(errQueue, errorBuf, errStream)
+        ReadQueue(outQueue, outBuf, outStream)
+        if pollFn != None and pollFn():
+            returncode = 0
+            if killOnEarlyReturn:
+                process.kill()
+            break
+        time.sleep(0.1)
+    # Drain queue
     ReadQueue(errQueue, errorBuf, errStream)
     ReadQueue(outQueue, outBuf, outStream)
-    if pollFn != None and pollFn():
-      returncode = 0
-      if killOnEarlyReturn:
-        process.kill()
-      break
-    time.sleep(0.1)
-  # Drain queue
-  ReadQueue(errQueue, errorBuf, errStream)
-  ReadQueue(outQueue, outBuf, outStream)
 
-  out = outBuf.getvalue();
-  error = errorBuf.getvalue();
-  if returncode:
-    if not isinstance(command, basestring):
-      command = ' '.join(command)
-    if printErrorInfo:
-      sys.stderr.write("Command failed: '%s'\n" % command)
-      sys.stderr.write("        stdout: '%s'\n" % out)
-      sys.stderr.write("        stderr: '%s'\n" % error)
-      sys.stderr.write("    returncode: %d\n" % returncode)
-    raise Error("Command failed: %s" % command)
-  if debug:
-    sys.stderr.write("output: %s\n" % out)
-  return out
+    out = outBuf.getvalue()
+    error = errorBuf.getvalue()
+    if returncode:
+        if not isinstance(command, basestring):
+            command = ' '.join(command)
+        if printErrorInfo:
+            sys.stderr.write("Command failed: '%s'\n" % command)
+            sys.stderr.write("        stdout: '%s'\n" % out)
+            sys.stderr.write("        stderr: '%s'\n" % error)
+            sys.stderr.write("    returncode: %d\n" % returncode)
+        raise Error("Command failed: %s" % command)
+    if debug:
+        sys.stderr.write("output: %s\n" % out)
+    return out
 
 
 def Main(argv):
-  print "GuessOS() -> ", GuessOS()
-  print "GuessArchitecture() -> ", GuessArchitecture()
-  print "GuessCpus() -> ", GuessCpus()
-  print "IsWindows() -> ", IsWindows()
+    print "GuessOS() -> ", GuessOS()
+    print "GuessArchitecture() -> ", GuessArchitecture()
+    print "GuessCpus() -> ", GuessCpus()
+    print "IsWindows() -> ", IsWindows()
 
 
 class Error(Exception):
-  pass
+    pass
 
 
 if __name__ == "__main__":
-  import sys
-  Main(sys.argv)
+    import sys
+    Main(sys.argv)
diff --git a/runtime/tools/valgrind.py b/runtime/tools/valgrind.py
index c0440f1..f82d6d3 100755
--- a/runtime/tools/valgrind.py
+++ b/runtime/tools/valgrind.py
@@ -12,21 +12,20 @@
 import re
 
 VALGRIND_ARGUMENTS = [
-  'valgrind',
-  '--error-exitcode=1',
-  '--leak-check=full',
-  '--trace-children=yes',
-  '--ignore-ranges=0x000-0xFFF',  # Used for implicit null checks.
-  '--vex-iropt-level=1'  # Valgrind crashes with the default level (2).
+    'valgrind',
+    '--error-exitcode=1',
+    '--leak-check=full',
+    '--trace-children=yes',
+    '--ignore-ranges=0x000-0xFFF',  # Used for implicit null checks.
+    '--vex-iropt-level=1'  # Valgrind crashes with the default level (2).
 ]
 
 # Compute the command line.
 command = VALGRIND_ARGUMENTS + sys.argv[1:]
 
 # Run Valgrind.
-process = subprocess.Popen(command,
-                           stdout=subprocess.PIPE,
-                           stderr=subprocess.PIPE)
+process = subprocess.Popen(
+    command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
 code = process.wait()
 output = process.stdout.readlines()
 errors = process.stderr.readlines()
@@ -34,13 +33,13 @@
 # Always print the output, but leave out the 3 line banner printed
 # by certain versions of Valgrind.
 if len(output) > 0 and output[0].startswith("** VALGRIND_ROOT="):
-  output = output[3:]
+    output = output[3:]
 sys.stdout.writelines(output)
 
 # If Valgrind produced an error, we report that to the user.
 if code != 0:
-  sys.stderr.writelines(errors)
-  sys.exit(code)
+    sys.stderr.writelines(errors)
+    sys.exit(code)
 
 # Look through the leak details and make sure that we don't have
 # any definitely or indirectly lost bytes. We allow possibly lost
@@ -50,17 +49,17 @@
 LEAK_OKAY_MATCHER = re.compile(r"lost: 0 bytes in 0 blocks")
 leaks = []
 for line in errors:
-  if LEAK_LINE_MATCHER.search(line):
-    leaks.append(line)
-    if not LEAK_OKAY_MATCHER.search(line):
-      sys.stderr.writelines(errors)
-      sys.exit(1)
+    if LEAK_LINE_MATCHER.search(line):
+        leaks.append(line)
+        if not LEAK_OKAY_MATCHER.search(line):
+            sys.stderr.writelines(errors)
+            sys.exit(1)
 
 # Make sure we found the right number of leak lines.
 if not len(leaks) in [0, 2, 3]:
-  sys.stderr.writelines(errors)
-  sys.stderr.write('\n\n#### Malformed Valgrind output.\n#### Exiting.\n')
-  sys.exit(1)
+    sys.stderr.writelines(errors)
+    sys.stderr.write('\n\n#### Malformed Valgrind output.\n#### Exiting.\n')
+    sys.exit(1)
 
 # Success.
 sys.exit(0)
diff --git a/runtime/vm/base_isolate.h b/runtime/vm/base_isolate.h
index 58a0cbb..be59b16 100644
--- a/runtime/vm/base_isolate.h
+++ b/runtime/vm/base_isolate.h
@@ -31,13 +31,29 @@
 #endif
 
  protected:
-  BaseIsolate() : scheduled_mutator_thread_(NULL) {}
+  BaseIsolate() {}
 
   ~BaseIsolate() {
     // Do not delete stack resources: top_resource_ and current_zone_.
   }
 
-  Thread* scheduled_mutator_thread_;
+  Thread* scheduled_mutator_thread_ = nullptr;
+
+  // TODO(asiva): Currently we treat a mutator thread as a special thread
+  // and always schedule execution of Dart code on the same mutator thread
+  // object. The ApiLocalScope has been made thread specific but we still
+  // have scenarios where we do a temporary exit of an Isolate with live
+  // zones/handles in the API scope :
+  // - Dart_RunLoop()
+  // - IsolateSaver in Dart_NewNativePort
+  // Similarly, tracking async_stack_trace requires that we always reschedule
+  // on the same thread.
+  // We probably need a mechanism to return to the specific thread only
+  // for these specific cases. We should also determine if the embedder
+  // should allow exiting an isolate with live state in zones/handles in
+  // which case a new API for returning to the specific thread needs to be
+  // added.
+  Thread* mutator_thread_ = nullptr;
 
  private:
   DISALLOW_COPY_AND_ASSIGN(BaseIsolate);
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 24b6af2..dba0451 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -388,6 +388,7 @@
   V(Ffi_dl_open, 1)                                                            \
   V(Ffi_dl_lookup, 2)                                                          \
   V(Ffi_dl_getHandle, 1)                                                       \
+  V(Ffi_asExternalTypedData, 2)                                                \
   V(TransferableTypedData_factory, 2)                                          \
   V(TransferableTypedData_materialize, 1)
 
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 970c7c5..11f7881 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1576,13 +1576,13 @@
 //    * RawType::hash_
 //    * RawTypeParameter::hash_
 //    * RawTypeArguments::hash_
+//    * RawInstance (weak table)
+//    * RawArray (weak table)
 //
 // No caching of canonical hash codes (i.e. it gets re-computed every time)
 // happens for:
 //
 //    * RawTypeRef (computed via RawTypeRef::type_->type_class_id)
-//    * RawInstance (computed via size & fields)
-//    * RawArray (computed via type arguments & array entries)
 //
 // Usages of canonical hash codes are:
 //
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index 98e1421..624c4bc 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -200,9 +200,11 @@
 
 void ClassTable::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
+  visitor->set_gc_root_type("class table");
   for (intptr_t i = 0; i < top_; i++) {
     visitor->VisitPointer(reinterpret_cast<RawObject**>(&(table_[i].class_)));
   }
+  visitor->clear_gc_root_type();
 }
 
 void ClassTable::CopySizesFromClassObjects() {
diff --git a/runtime/vm/clustered_snapshot.cc b/runtime/vm/clustered_snapshot.cc
index aef1813..28983ba 100644
--- a/runtime/vm/clustered_snapshot.cc
+++ b/runtime/vm/clustered_snapshot.cc
@@ -1317,6 +1317,7 @@
       RawKernelProgramInfo* info = objects_[i];
       AutoTraceObject(info);
       WriteFromTo(info);
+      s->Write<uint32_t>(info->ptr()->kernel_binary_version_);
     }
   }
 
@@ -1349,6 +1350,7 @@
       Deserializer::InitializeHeader(info, kKernelProgramInfoCid,
                                      KernelProgramInfo::InstanceSize());
       ReadFromTo(info);
+      info->ptr()->kernel_binary_version_ = d->Read<uint32_t>();
     }
   }
 
diff --git a/runtime/vm/code_observers.cc b/runtime/vm/code_observers.cc
index 6aab6e7..7d50a23 100644
--- a/runtime/vm/code_observers.cc
+++ b/runtime/vm/code_observers.cc
@@ -17,7 +17,7 @@
 
 class ExternalCodeObserverAdapter : public CodeObserver {
  public:
-  explicit ExternalCodeObserverAdapter(Dart_CodeObserver* delegate)
+  explicit ExternalCodeObserverAdapter(Dart_CodeObserver delegate)
       : delegate_(delegate) {}
 
   virtual bool IsActive() const { return true; }
@@ -28,15 +28,15 @@
                       uword size,
                       bool optimized,
                       const CodeComments* comments) {
-    return delegate_->on_new_code(delegate_, name, base, size);
+    return delegate_.on_new_code(&delegate_, name, base, size);
   }
 
  private:
-  Dart_CodeObserver* delegate_;
+  Dart_CodeObserver delegate_;
 };
 
-void CodeObservers::RegisterExternal(Dart_CodeObserver* observer) {
-  if (observer != nullptr) Register(new ExternalCodeObserverAdapter(observer));
+void CodeObservers::RegisterExternal(Dart_CodeObserver observer) {
+  Register(new ExternalCodeObserverAdapter(observer));
 }
 
 void CodeObservers::Register(CodeObserver* observer) {
diff --git a/runtime/vm/code_observers.h b/runtime/vm/code_observers.h
index 3664a02..5494b58 100644
--- a/runtime/vm/code_observers.h
+++ b/runtime/vm/code_observers.h
@@ -57,7 +57,7 @@
  public:
   static void Init();
 
-  static void RegisterExternal(Dart_CodeObserver* observer);
+  static void RegisterExternal(Dart_CodeObserver observer);
 
   static void Register(CodeObserver* observer);
 
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index a31c467..051a503 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -44,7 +44,7 @@
   // Code accessing pp is generated, but not executed. Uninitialized pp is OK.
   __ set_constant_pool_allowed(true);
 
-  ObjectPoolBuilder& op = __ object_pool_builder();
+  compiler::ObjectPoolBuilder& op = __ object_pool_builder();
   const intptr_t ic_data_index =
       op.AddObject(ic_data, ObjectPool::Patchability::kPatchable);
   const intptr_t stub_index =
@@ -52,8 +52,9 @@
   ASSERT((ic_data_index + 1) == stub_index);
   __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
                                   ObjectPool::element_offset(ic_data_index));
-  __ ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(
-                                        Code::EntryKind::kMonomorphic)));
+  __ ldr(LR, compiler::FieldAddress(
+                 CODE_REG,
+                 Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
   __ blr(LR);
   __ ret();
 }
diff --git a/runtime/vm/compiler/aot/aot_call_specializer.cc b/runtime/vm/compiler/aot/aot_call_specializer.cc
index 196a9df..5b1d22a 100644
--- a/runtime/vm/compiler/aot/aot_call_specializer.cc
+++ b/runtime/vm/compiler/aot/aot_call_specializer.cc
@@ -1248,7 +1248,8 @@
   const Function& target = Function::ZoneHandle(
       Z, dart_internal.LookupFunctionAllowPrivate(target_name));
   ASSERT(!target.IsNull());
-  ASSERT(target.IsRecognized() && target.always_inline());
+  ASSERT(target.IsRecognized());
+  ASSERT(FlowGraphInliner::FunctionHasPreferInlinePragma(target));
 
   const intptr_t kTypeArgsLen = 0;
   StaticCallInstr* new_call = new (Z) StaticCallInstr(
diff --git a/runtime/vm/compiler/aot/precompiler.cc b/runtime/vm/compiler/aot/precompiler.cc
index 9fa7585..a7359d1 100644
--- a/runtime/vm/compiler/aot/precompiler.cc
+++ b/runtime/vm/compiler/aot/precompiler.cc
@@ -66,6 +66,10 @@
     max_speculative_inlining_attempts,
     1,
     "Max number of attempts with speculative inlining (precompilation only)");
+DEFINE_FLAG(charp,
+            serialize_flow_graphs_to,
+            nullptr,
+            "Serialize flow graphs to the given file");
 
 DECLARE_FLAG(bool, print_flow_graph);
 DECLARE_FLAG(bool, print_flow_graph_optimized);
@@ -108,7 +112,7 @@
   Thread* thread() const { return thread_; }
   Isolate* isolate() const { return thread_->isolate(); }
 
-  void FinalizeCompilation(Assembler* assembler,
+  void FinalizeCompilation(compiler::Assembler* assembler,
                            FlowGraphCompiler* graph_compiler,
                            FlowGraph* flow_graph,
                            CodeStatistics* stats);
@@ -163,7 +167,8 @@
       types_to_retain_(),
       consts_to_retain_(),
       error_(Error::Handle()),
-      get_runtime_type_is_unique_(false) {
+      get_runtime_type_is_unique_(false),
+      il_serialization_stream_(nullptr) {
   ASSERT(Precompiler::singleton_ == NULL);
   Precompiler::singleton_ = this;
 }
@@ -180,6 +185,16 @@
     StackZone stack_zone(T);
     zone_ = stack_zone.GetZone();
 
+    // Check that both the file open and write callbacks are available, though
+    // we only use the latter during IL processing.
+    if (FLAG_serialize_flow_graphs_to != nullptr &&
+        Dart::file_write_callback() != nullptr) {
+      if (auto file_open = Dart::file_open_callback()) {
+        auto file = file_open(FLAG_serialize_flow_graphs_to, /*write=*/true);
+        set_il_serialization_stream(file);
+      }
+    }
+
     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
@@ -337,11 +352,18 @@
     DropLibraries();
 
     BindStaticCalls();
-    SwitchICCalls();
+    DedupUnlinkedCalls();
     Obfuscate();
 
     ProgramVisitor::Dedup();
 
+    if (il_serialization_stream() != nullptr) {
+      auto file_close = Dart::file_close_callback();
+      ASSERT(file_close != nullptr);
+      file_close(il_serialization_stream());
+      set_il_serialization_stream(nullptr);
+    }
+
     zone_ = NULL;
   }
 
@@ -612,16 +634,15 @@
 void Precompiler::AddCalleesOfHelper(const Object& entry,
                                      String* temp_selector,
                                      Class* temp_cls) {
-  if (entry.IsICData()) {
-    const auto& call_site = ICData::Cast(entry);
+  if (entry.IsUnlinkedCall()) {
+    const auto& call_site = UnlinkedCall::Cast(entry);
     // A dynamic call.
-    ASSERT(!call_site.is_static_call());
     *temp_selector = call_site.target_name();
     AddSelector(*temp_selector);
     if (temp_selector->raw() == Symbols::Call().raw()) {
       // Potential closure call.
       const Array& arguments_descriptor =
-          Array::Handle(Z, call_site.arguments_descriptor());
+          Array::Handle(Z, call_site.args_descriptor());
       AddClosureCall(arguments_descriptor);
     }
   } else if (entry.IsMegamorphicCache()) {
@@ -1986,49 +2007,27 @@
   }
 }
 
-void Precompiler::SwitchICCalls() {
+void Precompiler::DedupUnlinkedCalls() {
   ASSERT(!I->compilation_allowed());
 #if !defined(TARGET_ARCH_DBC)
-  // Now that all functions have been compiled, we can switch to an instance
-  // call sequence that loads the Code object and entry point directly from
-  // the ic data array instead indirectly through a Function in the ic data
-  // array. Iterate all the object pools and rewrite the ic data from
-  // (cid, target function, count) to (cid, target code, entry point), and
-  // replace the ICCallThroughFunction stub with ICCallThroughCode.
-  class ICCallSwitcher {
+  class UnlinkedCallDeduper {
    public:
-    explicit ICCallSwitcher(Zone* zone)
+    explicit UnlinkedCallDeduper(Zone* zone)
         : zone_(zone),
           entry_(Object::Handle(zone)),
-          ic_(ICData::Handle(zone)),
-          target_name_(String::Handle(zone)),
-          args_descriptor_(Array::Handle(zone)),
           unlinked_(UnlinkedCall::Handle(zone)),
-          target_code_(Code::Handle(zone)),
           canonical_unlinked_calls_() {}
 
-    void SwitchPool(const ObjectPool& pool) {
+    void DedupPool(const ObjectPool& pool) {
       for (intptr_t i = 0; i < pool.Length(); i++) {
         if (pool.TypeAt(i) != ObjectPool::EntryType::kTaggedObject) {
           continue;
         }
         entry_ = pool.ObjectAt(i);
-        if (entry_.IsICData()) {
-          // The only IC calls generated by precompilation are for switchable
-          // calls.
-          ic_ ^= entry_.raw();
-          ic_.ResetSwitchable(zone_);
-
-          unlinked_ = UnlinkedCall::New();
-          target_name_ = ic_.target_name();
-          unlinked_.set_target_name(target_name_);
-          args_descriptor_ = ic_.arguments_descriptor();
-          unlinked_.set_args_descriptor(args_descriptor_);
+        if (entry_.IsUnlinkedCall()) {
+          unlinked_ ^= entry_.raw();
           unlinked_ = DedupUnlinkedCall(unlinked_);
           pool.SetObjectAt(i, unlinked_);
-        } else if (entry_.raw() == StubCode::ICCallThroughFunction().raw()) {
-          target_code_ = StubCode::UnlinkedCall().raw();
-          pool.SetObjectAt(i, target_code_);
         }
       }
     }
@@ -2048,18 +2047,14 @@
    private:
     Zone* zone_;
     Object& entry_;
-    ICData& ic_;
-    String& target_name_;
-    Array& args_descriptor_;
     UnlinkedCall& unlinked_;
-    Code& target_code_;
     UnlinkedCallSet canonical_unlinked_calls_;
   };
 
-  class SwitchICCallsVisitor : public FunctionVisitor {
+  class DedupUnlinkedCallsVisitor : public FunctionVisitor {
    public:
-    SwitchICCallsVisitor(ICCallSwitcher* ic_call_switcher, Zone* zone)
-        : ic_call_switcher_(*ic_call_switcher),
+    DedupUnlinkedCallsVisitor(UnlinkedCallDeduper* deduper, Zone* zone)
+        : deduper_(*deduper),
           code_(Code::Handle(zone)),
           pool_(ObjectPool::Handle(zone)) {}
 
@@ -2069,22 +2064,22 @@
       }
       code_ = function.CurrentCode();
       pool_ = code_.object_pool();
-      ic_call_switcher_.SwitchPool(pool_);
+      deduper_.DedupPool(pool_);
     }
 
    private:
-    ICCallSwitcher& ic_call_switcher_;
+    UnlinkedCallDeduper& deduper_;
     Code& code_;
     ObjectPool& pool_;
   };
 
-  ICCallSwitcher switcher(Z);
+  UnlinkedCallDeduper deduper(Z);
   auto& gop = ObjectPool::Handle(I->object_store()->global_object_pool());
   ASSERT(gop.IsNull() != FLAG_use_bare_instructions);
   if (FLAG_use_bare_instructions) {
-    switcher.SwitchPool(gop);
+    deduper.DedupPool(gop);
   } else {
-    SwitchICCallsVisitor visitor(&switcher, Z);
+    DedupUnlinkedCallsVisitor visitor(&deduper, Z);
 
     // We need both iterations to ensure we visit all the functions that might
     // end up in the snapshot. The ProgramVisitor will miss closures from
@@ -2179,9 +2174,8 @@
   I->set_all_classes_finalized(true);
 }
 
-
 void PrecompileParsedFunctionHelper::FinalizeCompilation(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     FlowGraphCompiler* graph_compiler,
     FlowGraph* flow_graph,
     CodeStatistics* stats) {
@@ -2319,12 +2313,13 @@
 
       ASSERT(!FLAG_use_bare_instructions || precompiler_ != nullptr);
 
-      ObjectPoolBuilder object_pool;
-      ObjectPoolBuilder* active_object_pool_builder =
+      compiler::ObjectPoolBuilder object_pool;
+      compiler::ObjectPoolBuilder* active_object_pool_builder =
           FLAG_use_bare_instructions
               ? precompiler_->global_object_pool_builder()
               : &object_pool;
-      Assembler assembler(active_object_pool_builder, use_far_branches);
+      compiler::Assembler assembler(active_object_pool_builder,
+                                    use_far_branches);
 
       CodeStatistics* function_stats = NULL;
       if (FLAG_print_instruction_stats) {
@@ -2592,8 +2587,6 @@
     PreventRenaming(#class_name);                                              \
     PreventRenaming(#function_name);                                           \
   } while (0);
-  INLINE_WHITE_LIST(PREVENT_RENAMING)
-  INLINE_BLACK_LIST(PREVENT_RENAMING)
   POLYMORPHIC_TARGET_LIST(PREVENT_RENAMING)
 #undef PREVENT_RENAMING
 
diff --git a/runtime/vm/compiler/aot/precompiler.h b/runtime/vm/compiler/aot/precompiler.h
index 0df81c0..7dfa666 100644
--- a/runtime/vm/compiler/aot/precompiler.h
+++ b/runtime/vm/compiler/aot/precompiler.h
@@ -233,6 +233,8 @@
     return &global_object_pool_builder_;
   }
 
+  void* il_serialization_stream() const { return il_serialization_stream_; }
+
   static Precompiler* Instance() { return singleton_; }
 
  private:
@@ -279,8 +281,13 @@
   void DropClasses();
   void DropLibraries();
 
+  // Remove the indirection of the CallStaticFunction stub from all static call
+  // sites now that Code is available for all call targets. Allows for dropping
+  // the static call table from each Code object.
   void BindStaticCalls();
-  void SwitchICCalls();
+  // Deduplicate the UnlinkedCall objects in all ObjectPools to reduce snapshot
+  // size.
+  void DedupUnlinkedCalls();
 
   void Obfuscate();
 
@@ -291,6 +298,10 @@
 
   void FinalizeAllClasses();
 
+  void set_il_serialization_stream(void* file) {
+    il_serialization_stream_ = file;
+  }
+
   Thread* thread() const { return thread_; }
   Zone* zone() const { return zone_; }
   Isolate* isolate() const { return isolate_; }
@@ -325,6 +336,7 @@
   Error& error_;
 
   bool get_runtime_type_is_unique_;
+  void* il_serialization_stream_;
 };
 
 class FunctionsTraits {
diff --git a/runtime/vm/compiler/assembler/assembler.h b/runtime/vm/compiler/assembler/assembler.h
index 2a5feb5..cf4d6e6 100644
--- a/runtime/vm/compiler/assembler/assembler.h
+++ b/runtime/vm/compiler/assembler/assembler.h
@@ -382,11 +382,4 @@
 #error Unknown architecture.
 #endif
 
-namespace dart {
-using compiler::Assembler;
-using compiler::ExternalLabel;
-using compiler::Label;
-using compiler::ObjectPoolBuilder;
-}  // namespace dart
-
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_H_
diff --git a/runtime/vm/compiler/assembler/assembler_arm.cc b/runtime/vm/compiler/assembler/assembler_arm.cc
index 0898d42..c659426 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm.cc
@@ -15,8 +15,8 @@
 
 // An extra check since we are assuming the existence of /proc/cpuinfo below.
 #if !defined(USING_SIMULATOR) && !defined(__linux__) && !defined(ANDROID) &&   \
-    !HOST_OS_IOS
-#error ARM cross-compile only supported on Linux
+    !defined(HOST_OS_IOS) && !defined(HOST_OS_MACOS)
+#error ARM cross-compile only supported on Linux, Android, iOS, and Mac
 #endif
 
 namespace dart {
@@ -28,33 +28,20 @@
 
 namespace compiler {
 
-#ifndef PRODUCT
-using target::ClassHeapStats;
-#endif
-using target::ClassTable;
-using target::Double;
-using target::Float32x4;
-using target::Float64x2;
-using target::Heap;
-using target::Instance;
-using target::Instructions;
-using target::Isolate;
-using target::ObjectPool;
-using target::RawObject;
-using target::Thread;
-
 Assembler::Assembler(ObjectPoolBuilder* object_pool_builder,
                      bool use_far_branches)
     : AssemblerBase(object_pool_builder),
       use_far_branches_(use_far_branches),
       constant_pool_allowed_(false) {
   generate_invoke_write_barrier_wrapper_ = [&](Condition cond, Register reg) {
-    ldr(LR, Address(THR, Thread::write_barrier_wrappers_thread_offset(reg)),
+    ldr(LR,
+        Address(THR, target::Thread::write_barrier_wrappers_thread_offset(reg)),
         cond);
     blx(LR, cond);
   };
   generate_invoke_array_write_barrier_ = [&](Condition cond) {
-    ldr(LR, Address(THR, Thread::array_write_barrier_entry_point_offset()),
+    ldr(LR,
+        Address(THR, target::Thread::array_write_barrier_entry_point_offset()),
         cond);
     blx(LR, cond);
   };
@@ -560,25 +547,26 @@
                                             Register state) {
   // Save exit frame information to enable stack walking.
   StoreToOffset(kWord, exit_frame_fp, THR,
-                Thread::top_exit_frame_info_offset());
+                target::Thread::top_exit_frame_info_offset());
 
   // Mark that the thread is executing native code.
-  StoreToOffset(kWord, destination_address, THR, Thread::vm_tag_offset());
-  LoadImmediate(state, compiler::target::Thread::native_execution_state());
-  StoreToOffset(kWord, state, THR, Thread::execution_state_offset());
+  StoreToOffset(kWord, destination_address, THR,
+                target::Thread::vm_tag_offset());
+  LoadImmediate(state, target::Thread::native_execution_state());
+  StoreToOffset(kWord, state, THR, target::Thread::execution_state_offset());
 
   if (FLAG_use_slow_path || TargetCPUFeatures::arm_version() == ARMv5TE) {
     EnterSafepointSlowly();
   } else {
     Label slow_path, done, retry;
-    LoadImmediate(addr, compiler::target::Thread::safepoint_state_offset());
+    LoadImmediate(addr, target::Thread::safepoint_state_offset());
     add(addr, THR, Operand(addr));
     Bind(&retry);
     ldrex(state, addr);
-    cmp(state, Operand(Thread::safepoint_state_unacquired()));
+    cmp(state, Operand(target::Thread::safepoint_state_unacquired()));
     b(&slow_path, NE);
 
-    mov(state, Operand(Thread::safepoint_state_acquired()));
+    mov(state, Operand(target::Thread::safepoint_state_acquired()));
     strex(TMP, state, addr);
     cmp(TMP, Operand(0));  // 0 means strex was successful.
     b(&done, EQ);
@@ -592,9 +580,8 @@
 }
 
 void Assembler::EnterSafepointSlowly() {
-  ldr(TMP,
-      Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
-  ldr(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  ldr(TMP, Address(THR, target::Thread::enter_safepoint_stub_offset()));
+  ldr(TMP, FieldAddress(TMP, target::Code::entry_point_offset()));
   blx(TMP);
 }
 
@@ -603,14 +590,14 @@
     ExitSafepointSlowly();
   } else {
     Label slow_path, done, retry;
-    LoadImmediate(addr, compiler::target::Thread::safepoint_state_offset());
+    LoadImmediate(addr, target::Thread::safepoint_state_offset());
     add(addr, THR, Operand(addr));
     Bind(&retry);
     ldrex(state, addr);
-    cmp(state, Operand(Thread::safepoint_state_acquired()));
+    cmp(state, Operand(target::Thread::safepoint_state_acquired()));
     b(&slow_path, NE);
 
-    mov(state, Operand(Thread::safepoint_state_unacquired()));
+    mov(state, Operand(target::Thread::safepoint_state_unacquired()));
     strex(TMP, state, addr);
     cmp(TMP, Operand(0));  // 0 means strex was successful.
     b(&done, EQ);
@@ -623,20 +610,20 @@
   }
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, compiler::target::Thread::vm_tag_compiled_id());
-  StoreToOffset(kWord, state, THR, Thread::vm_tag_offset());
-  LoadImmediate(state, compiler::target::Thread::generated_execution_state());
-  StoreToOffset(kWord, state, THR, Thread::execution_state_offset());
+  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  StoreToOffset(kWord, state, THR, target::Thread::vm_tag_offset());
+  LoadImmediate(state, target::Thread::generated_execution_state());
+  StoreToOffset(kWord, state, THR, target::Thread::execution_state_offset());
 
   // Reset exit frame information in Isolate structure.
   LoadImmediate(state, 0);
-  StoreToOffset(kWord, state, THR, Thread::top_exit_frame_info_offset());
+  StoreToOffset(kWord, state, THR,
+                target::Thread::top_exit_frame_info_offset());
 }
 
 void Assembler::ExitSafepointSlowly() {
-  ldr(TMP,
-      Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
-  ldr(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  ldr(TMP, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  ldr(TMP, FieldAddress(TMP, target::Code::entry_point_offset()));
   blx(TMP);
 }
 
@@ -1549,7 +1536,7 @@
   Bind(&cid_ok);
 
   const intptr_t offset = CodeSize() + Instr::kPCReadOffset +
-                          Instructions::HeaderSize() - kHeapObjectTag;
+                          target::Instructions::HeaderSize() - kHeapObjectTag;
   mov(R0, Operand(PC));
   AddImmediate(R0, -offset);
   ldr(IP, FieldAddress(CODE_REG, target::Code::saved_instructions_offset()));
@@ -1576,7 +1563,7 @@
 }
 
 void Assembler::LoadIsolate(Register rd) {
-  ldr(rd, Address(THR, Thread::isolate_offset()));
+  ldr(rd, Address(THR, target::Thread::isolate_offset()));
 }
 
 bool Assembler::CanLoadFromObjectPool(const Object& object) const {
@@ -1610,7 +1597,7 @@
     // object pool.
     const auto index = is_unique ? object_pool_builder().AddObject(object)
                                  : object_pool_builder().FindObject(object);
-    const int32_t offset = ObjectPool::element_offset(index);
+    const int32_t offset = target::ObjectPool::element_offset(index);
     LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, pp, cond);
   } else {
     UNREACHABLE();
@@ -1631,7 +1618,7 @@
                                 const ExternalLabel* label,
                                 ObjectPoolBuilderEntry::Patchability patchable,
                                 Condition cond) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindNativeFunction(label, patchable));
   LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
 }
@@ -1732,8 +1719,8 @@
   if (!lr_reserved) Push(LR);
   ldrb(TMP, FieldAddress(object, target::Object::tags_offset()));
   ldrb(LR, FieldAddress(value, target::Object::tags_offset()));
-  and_(TMP, LR, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
-  ldr(LR, Address(THR, Thread::write_barrier_mask_offset()));
+  and_(TMP, LR, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  ldr(LR, Address(THR, target::Thread::write_barrier_mask_offset()));
   tst(TMP, Operand(LR));
   if (value != kWriteBarrierValueReg) {
     // Unlikely. Only non-graph intrinsics.
@@ -1796,8 +1783,8 @@
   if (!lr_reserved) Push(LR);
   ldrb(TMP, FieldAddress(object, target::Object::tags_offset()));
   ldrb(LR, FieldAddress(value, target::Object::tags_offset()));
-  and_(TMP, LR, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
-  ldr(LR, Address(THR, Thread::write_barrier_mask_offset()));
+  and_(TMP, LR, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
+  ldr(LR, Address(THR, target::Thread::write_barrier_mask_offset()));
   tst(TMP, Operand(LR));
 
   if ((object != kWriteBarrierObjectReg) || (value != kWriteBarrierValueReg) ||
@@ -1957,20 +1944,22 @@
 }
 
 void Assembler::LoadClassId(Register result, Register object, Condition cond) {
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
-      target::Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
   ldrh(result, FieldAddress(object, class_id_offset), cond);
 }
 
 void Assembler::LoadClassById(Register result, Register class_id) {
   ASSERT(result != class_id);
   LoadIsolate(result);
-  const intptr_t offset =
-      Isolate::class_table_offset() + ClassTable::table_offset();
+  const intptr_t offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::table_offset();
   LoadFromOffset(kWord, result, result, offset);
-  ldr(result, Address(result, class_id, LSL, ClassTable::kSizeOfClassPairLog2));
+  ldr(result,
+      Address(result, class_id, LSL, target::ClassTable::kSizeOfClassPairLog2));
 }
 
 void Assembler::CompareClassId(Register object,
@@ -2679,7 +2668,7 @@
                        ObjectPoolBuilderEntry::Patchability patchable,
                        Register pp,
                        Condition cond) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), patchable));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, pp, cond);
   Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()), cond);
@@ -2696,7 +2685,7 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), patchable));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
@@ -2709,15 +2698,16 @@
 }
 
 void Assembler::BranchLinkToRuntime() {
-  ldr(IP, Address(THR, Thread::call_to_runtime_entry_point_offset()));
+  ldr(IP, Address(THR, target::Thread::call_to_runtime_entry_point_offset()));
   blx(IP);
 }
 
 void Assembler::CallNullErrorShared(bool save_fpu_registers) {
   uword entry_point_offset =
       save_fpu_registers
-          ? Thread::null_error_shared_with_fpu_regs_entry_point_offset()
-          : Thread::null_error_shared_without_fpu_regs_entry_point_offset();
+          ? target::Thread::null_error_shared_with_fpu_regs_entry_point_offset()
+          : target::Thread::
+                null_error_shared_without_fpu_regs_entry_point_offset();
   ldr(LR, Address(THR, entry_point_offset));
   blx(LR);
 }
@@ -2729,7 +2719,7 @@
   // to by this code sequence.
   // For added code robustness, use 'blx lr' in a patchable sequence and
   // use 'blx ip' in a non-patchable sequence (see other BranchLink flavors).
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), equivalence));
   LoadWordFromPoolOffset(CODE_REG, offset - kHeapObjectTag, PP, AL);
   ldr(LR, FieldAddress(CODE_REG, target::Code::entry_point_offset(entry_kind)));
@@ -2777,7 +2767,8 @@
   const ARMVersion version = TargetCPUFeatures::arm_version();
   if ((version == ARMv5TE) || (version == ARMv6)) {
     if (constant_pool_allowed()) {
-      const int32_t offset = ObjectPool::element_offset(FindImmediate(value));
+      const int32_t offset =
+          target::ObjectPool::element_offset(FindImmediate(value));
       LoadWordFromPoolOffset(rd, offset - kHeapObjectTag, PP, cond);
     } else {
       LoadPatchableImmediate(rd, value, cond);
@@ -2971,15 +2962,19 @@
                                 Register tmp2,
                                 DRegister dtmp) {
   if (TargetCPUFeatures::vfp_supported()) {
-    LoadDFromOffset(dtmp, src, Double::value_offset() - kHeapObjectTag);
-    StoreDToOffset(dtmp, dst, Double::value_offset() - kHeapObjectTag);
+    LoadDFromOffset(dtmp, src, target::Double::value_offset() - kHeapObjectTag);
+    StoreDToOffset(dtmp, dst, target::Double::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(kWord, tmp1, src, Double::value_offset() - kHeapObjectTag);
-    LoadFromOffset(kWord, tmp2, src,
-                   Double::value_offset() + target::kWordSize - kHeapObjectTag);
-    StoreToOffset(kWord, tmp1, dst, Double::value_offset() - kHeapObjectTag);
-    StoreToOffset(kWord, tmp2, dst,
-                  Double::value_offset() + target::kWordSize - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src,
+                   target::Double::value_offset() - kHeapObjectTag);
+    LoadFromOffset(
+        kWord, tmp2, src,
+        target::Double::value_offset() + target::kWordSize - kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+                  target::Double::value_offset() - kHeapObjectTag);
+    StoreToOffset(
+        kWord, tmp2, dst,
+        target::Double::value_offset() + target::kWordSize - kHeapObjectTag);
   }
 }
 
@@ -2990,35 +2985,35 @@
                                    DRegister dtmp) {
   if (TargetCPUFeatures::neon_supported()) {
     LoadMultipleDFromOffset(dtmp, 2, src,
-                            Float32x4::value_offset() - kHeapObjectTag);
+                            target::Float32x4::value_offset() - kHeapObjectTag);
     StoreMultipleDToOffset(dtmp, 2, dst,
-                           Float32x4::value_offset() - kHeapObjectTag);
+                           target::Float32x4::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(
-        kWord, tmp1, src,
-        (Float32x4::value_offset() + 0 * target::kWordSize) - kHeapObjectTag);
-    LoadFromOffset(
-        kWord, tmp2, src,
-        (Float32x4::value_offset() + 1 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp1, dst,
-        (Float32x4::value_offset() + 0 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp2, dst,
-        (Float32x4::value_offset() + 1 * target::kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src,
+                   (target::Float32x4::value_offset() + 0 * target::kWordSize) -
+                       kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+                   (target::Float32x4::value_offset() + 1 * target::kWordSize) -
+                       kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+                  (target::Float32x4::value_offset() + 0 * target::kWordSize) -
+                      kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+                  (target::Float32x4::value_offset() + 1 * target::kWordSize) -
+                      kHeapObjectTag);
 
-    LoadFromOffset(
-        kWord, tmp1, src,
-        (Float32x4::value_offset() + 2 * target::kWordSize) - kHeapObjectTag);
-    LoadFromOffset(
-        kWord, tmp2, src,
-        (Float32x4::value_offset() + 3 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp1, dst,
-        (Float32x4::value_offset() + 2 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp2, dst,
-        (Float32x4::value_offset() + 3 * target::kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src,
+                   (target::Float32x4::value_offset() + 2 * target::kWordSize) -
+                       kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+                   (target::Float32x4::value_offset() + 3 * target::kWordSize) -
+                       kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+                  (target::Float32x4::value_offset() + 2 * target::kWordSize) -
+                      kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+                  (target::Float32x4::value_offset() + 3 * target::kWordSize) -
+                      kHeapObjectTag);
   }
 }
 
@@ -3029,35 +3024,35 @@
                                    DRegister dtmp) {
   if (TargetCPUFeatures::neon_supported()) {
     LoadMultipleDFromOffset(dtmp, 2, src,
-                            Float64x2::value_offset() - kHeapObjectTag);
+                            target::Float64x2::value_offset() - kHeapObjectTag);
     StoreMultipleDToOffset(dtmp, 2, dst,
-                           Float64x2::value_offset() - kHeapObjectTag);
+                           target::Float64x2::value_offset() - kHeapObjectTag);
   } else {
-    LoadFromOffset(
-        kWord, tmp1, src,
-        (Float64x2::value_offset() + 0 * target::kWordSize) - kHeapObjectTag);
-    LoadFromOffset(
-        kWord, tmp2, src,
-        (Float64x2::value_offset() + 1 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp1, dst,
-        (Float64x2::value_offset() + 0 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp2, dst,
-        (Float64x2::value_offset() + 1 * target::kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src,
+                   (target::Float64x2::value_offset() + 0 * target::kWordSize) -
+                       kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+                   (target::Float64x2::value_offset() + 1 * target::kWordSize) -
+                       kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+                  (target::Float64x2::value_offset() + 0 * target::kWordSize) -
+                      kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+                  (target::Float64x2::value_offset() + 1 * target::kWordSize) -
+                      kHeapObjectTag);
 
-    LoadFromOffset(
-        kWord, tmp1, src,
-        (Float64x2::value_offset() + 2 * target::kWordSize) - kHeapObjectTag);
-    LoadFromOffset(
-        kWord, tmp2, src,
-        (Float64x2::value_offset() + 3 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp1, dst,
-        (Float64x2::value_offset() + 2 * target::kWordSize) - kHeapObjectTag);
-    StoreToOffset(
-        kWord, tmp2, dst,
-        (Float64x2::value_offset() + 3 * target::kWordSize) - kHeapObjectTag);
+    LoadFromOffset(kWord, tmp1, src,
+                   (target::Float64x2::value_offset() + 2 * target::kWordSize) -
+                       kHeapObjectTag);
+    LoadFromOffset(kWord, tmp2, src,
+                   (target::Float64x2::value_offset() + 3 * target::kWordSize) -
+                       kHeapObjectTag);
+    StoreToOffset(kWord, tmp1, dst,
+                  (target::Float64x2::value_offset() + 2 * target::kWordSize) -
+                      kHeapObjectTag);
+    StoreToOffset(kWord, tmp2, dst,
+                  (target::Float64x2::value_offset() + 3 * target::kWordSize) -
+                      kHeapObjectTag);
   }
 }
 
@@ -3257,9 +3252,8 @@
 #if defined(DEBUG)
   Label done;
   ASSERT(!constant_pool_allowed());
-  LoadImmediate(scratch,
-                compiler::target::frame_layout.exit_link_slot_from_entry_fp *
-                    compiler::target::kWordSize);
+  LoadImmediate(scratch, target::frame_layout.exit_link_slot_from_entry_fp *
+                             target::kWordSize);
   add(scratch, scratch, Operand(FPREG));
   cmp(scratch, Operand(SPREG));
   b(&done, EQ);
@@ -3410,7 +3404,8 @@
   intptr_t start = CodeSize();
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetJIT);
 
   const intptr_t cid_offset = target::Array::element_offset(0);
   const intptr_t count_offset = target::Array::element_offset(1);
@@ -3421,12 +3416,13 @@
   LoadClassIdMayBeSmi(IP, R0);
   add(R2, R2, Operand(target::ToRawSmi(1)));
   cmp(R1, Operand(IP, LSL, 1));
-  Branch(Address(THR, Thread::monomorphic_miss_entry_offset()), NE);
+  Branch(Address(THR, target::Thread::monomorphic_miss_entry_offset()), NE);
   str(R2, FieldAddress(R9, count_offset));
   LoadImmediate(R4, 0);  // GC-safe for OptimizeInvokedFunction.
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetJIT);
 
 #if defined(TESTING) || defined(DEBUG)
   set_use_far_branches(saved_use_far_branches);
@@ -3444,14 +3440,16 @@
   intptr_t start = CodeSize();
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetAOT);
 
   LoadClassIdMayBeSmi(IP, R0);
   cmp(R9, Operand(IP, LSL, 1));
-  Branch(Address(THR, Thread::monomorphic_miss_entry_offset()), NE);
+  Branch(Address(THR, target::Thread::monomorphic_miss_entry_offset()), NE);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetAOT);
 
 #if defined(TESTING) || defined(DEBUG)
   set_use_far_branches(saved_use_far_branches);
@@ -3460,11 +3458,11 @@
 
 void Assembler::BranchOnMonomorphicCheckedEntryJIT(Label* label) {
   has_single_entry_point_ = false;
-  while (CodeSize() < Instructions::kMonomorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kMonomorphicEntryOffsetJIT) {
     bkpt(0);
   }
   b(label);
-  while (CodeSize() < Instructions::kPolymorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kPolymorphicEntryOffsetJIT) {
     bkpt(0);
   }
 }
@@ -3473,9 +3471,9 @@
 void Assembler::MaybeTraceAllocation(Register stats_addr_reg, Label* trace) {
   ASSERT(stats_addr_reg != kNoRegister);
   ASSERT(stats_addr_reg != TMP);
-  const uword state_offset = ClassHeapStats::state_offset();
+  const uword state_offset = target::ClassHeapStats::state_offset();
   ldr(TMP, Address(stats_addr_reg, state_offset));
-  tst(TMP, Operand(ClassHeapStats::TraceAllocationMask()));
+  tst(TMP, Operand(target::ClassHeapStats::TraceAllocationMask()));
   b(trace, NE);
 }
 
@@ -3483,10 +3481,10 @@
   ASSERT(dest != kNoRegister);
   ASSERT(dest != TMP);
   ASSERT(cid > 0);
-  const intptr_t class_offset = ClassTable::ClassOffsetFor(cid);
+  const intptr_t class_offset = target::ClassTable::ClassOffsetFor(cid);
   LoadIsolate(dest);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   ldr(dest, Address(dest, table_offset));
   AddImmediate(dest, class_offset);
 }
@@ -3497,7 +3495,7 @@
   ASSERT(stats_addr_reg != TMP);
   ASSERT(cid > 0);
   const uword count_field_offset =
-      ClassHeapStats::allocated_since_gc_new_space_offset();
+      target::ClassHeapStats::allocated_since_gc_new_space_offset();
   const Address& count_address = Address(stats_addr_reg, count_field_offset);
   ldr(TMP, count_address);
   AddImmediate(TMP, 1);
@@ -3509,9 +3507,9 @@
   ASSERT(stats_addr_reg != kNoRegister);
   ASSERT(stats_addr_reg != TMP);
   const uword count_field_offset =
-      ClassHeapStats::allocated_since_gc_new_space_offset();
+      target::ClassHeapStats::allocated_since_gc_new_space_offset();
   const uword size_field_offset =
-      ClassHeapStats::allocated_size_since_gc_new_space_offset();
+      target::ClassHeapStats::allocated_size_since_gc_new_space_offset();
   const Address& count_address = Address(stats_addr_reg, count_field_offset);
   const Address& size_address = Address(stats_addr_reg, size_field_offset);
   ldr(TMP, count_address);
@@ -3529,18 +3527,19 @@
                             Register temp_reg) {
   ASSERT(failure != NULL);
   const intptr_t instance_size = target::Class::GetInstanceSize(cls);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     const classid_t cid = target::Class::GetId(cls);
     ASSERT(instance_reg != temp_reg);
     ASSERT(temp_reg != IP);
     ASSERT(instance_size != 0);
     NOT_IN_PRODUCT(LoadAllocationStatsAddress(temp_reg, cid));
-    ldr(instance_reg, Address(THR, Thread::top_offset()));
+    ldr(instance_reg, Address(THR, target::Thread::top_offset()));
     // TODO(koda): Protect against unsigned overflow here.
     AddImmediateSetFlags(instance_reg, instance_reg, instance_size);
 
     // instance_reg: potential next object start.
-    ldr(IP, Address(THR, Thread::end_offset()));
+    ldr(IP, Address(THR, target::Thread::end_offset()));
     cmp(IP, Operand(instance_reg));
     // fail if heap end unsigned less than or equal to instance_reg.
     b(failure, LS);
@@ -3552,7 +3551,7 @@
 
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    str(instance_reg, Address(THR, Thread::top_offset()));
+    str(instance_reg, Address(THR, target::Thread::top_offset()));
 
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(instance_reg, -instance_size + kHeapObjectTag);
@@ -3575,17 +3574,18 @@
                                  Register end_address,
                                  Register temp1,
                                  Register temp2) {
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     NOT_IN_PRODUCT(LoadAllocationStatsAddress(temp1, cid));
     // Potential new object start.
-    ldr(instance, Address(THR, Thread::top_offset()));
+    ldr(instance, Address(THR, target::Thread::top_offset()));
     AddImmediateSetFlags(end_address, instance, instance_size);
     b(failure, CS);  // Branch if unsigned overflow.
 
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    ldr(temp2, Address(THR, Thread::end_offset()));
+    ldr(temp2, Address(THR, target::Thread::end_offset()));
     cmp(end_address, Operand(temp2));
     b(failure, CS);
 
@@ -3596,7 +3596,7 @@
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    str(end_address, Address(THR, Thread::top_offset()));
+    str(end_address, Address(THR, target::Thread::top_offset()));
     add(instance, instance, Operand(kHeapObjectTag));
 
     // Initialize the tags.
@@ -3607,7 +3607,7 @@
     str(temp2,
         FieldAddress(instance, target::Object::tags_offset()));  // Store tags.
 
-    LoadImmediate(temp2, instance_size);
+    NOT_IN_PRODUCT(LoadImmediate(temp2, instance_size));
     NOT_IN_PRODUCT(IncrementAllocationStatsWithSize(temp1, temp2));
   } else {
     b(failure);
@@ -3632,7 +3632,8 @@
                                              intptr_t index,
                                              Register temp) {
   const int64_t offset_base =
-      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+      (is_external ? 0
+                   : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag));
   const int64_t offset =
       offset_base + static_cast<int64_t>(index) * index_scale;
   ASSERT(Utils::IsInt(32, offset));
@@ -3654,7 +3655,8 @@
                                               Register array,
                                               intptr_t index) {
   const int64_t offset_base =
-      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+      (is_external ? 0
+                   : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag));
   const int64_t offset =
       offset_base + static_cast<int64_t>(index) * index_scale;
   ASSERT(Utils::IsInt(32, offset));
@@ -3670,7 +3672,7 @@
   // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
   const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
   int32_t offset =
-      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+      is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   const OperandSize size = Address::OperandSizeFor(cid);
   ASSERT(array != IP);
   ASSERT(index != IP);
@@ -3711,7 +3713,7 @@
   // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
   const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
   int32_t offset =
-      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+      is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   if (shift < 0) {
     ASSERT(shift == -1);
     add(address, array, Operand(index, ASR, 1));
diff --git a/runtime/vm/compiler/assembler/assembler_arm.h b/runtime/vm/compiler/assembler/assembler_arm.h
index 13ea001..e72b34a 100644
--- a/runtime/vm/compiler/assembler/assembler_arm.h
+++ b/runtime/vm/compiler/assembler/assembler_arm.h
@@ -322,6 +322,9 @@
       case DB_W:
       case IB_W:
         return true;
+      default:
+        UNREACHABLE();
+        return false;
     }
   }
 
@@ -1341,13 +1344,6 @@
 };
 
 }  // namespace compiler
-
-// TODO(vegorov) temporary export commonly used classes into dart namespace
-// to ease migration.
-using compiler::Address;
-using compiler::FieldAddress;
-using compiler::Operand;
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_ARM_H_
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.cc b/runtime/vm/compiler/assembler/assembler_arm64.cc
index d9a731c..42429b4 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.cc
+++ b/runtime/vm/compiler/assembler/assembler_arm64.cc
@@ -24,32 +24,19 @@
 
 namespace compiler {
 
-#ifndef PRODUCT
-using target::ClassHeapStats;
-#endif
-using target::ClassTable;
-using target::Double;
-using target::Float32x4;
-using target::Float64x2;
-using target::Heap;
-using target::Instance;
-using target::Instructions;
-using target::Isolate;
-using target::ObjectPool;
-using target::RawObject;
-using target::Thread;
-
 Assembler::Assembler(ObjectPoolBuilder* object_pool_builder,
                      bool use_far_branches)
     : AssemblerBase(object_pool_builder),
       use_far_branches_(use_far_branches),
       constant_pool_allowed_(false) {
   generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
-    ldr(LR, Address(THR, Thread::write_barrier_wrappers_thread_offset(reg)));
+    ldr(LR, Address(THR,
+                    target::Thread::write_barrier_wrappers_thread_offset(reg)));
     blr(LR);
   };
   generate_invoke_array_write_barrier_ = [&]() {
-    ldr(LR, Address(THR, Thread::array_write_barrier_entry_point_offset()));
+    ldr(LR,
+        Address(THR, target::Thread::array_write_barrier_entry_point_offset()));
     blr(LR);
   };
 }
@@ -469,13 +456,13 @@
     Register dst,
     const ExternalLabel* label,
     ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindNativeFunction(label, patchable));
   LoadWordFromPoolOffset(dst, offset);
 }
 
 void Assembler::LoadIsolate(Register dst) {
-  ldr(dst, Address(THR, Thread::isolate_offset()));
+  ldr(dst, Address(THR, target::Thread::isolate_offset()));
 }
 
 void Assembler::LoadObjectHelper(Register dst,
@@ -486,7 +473,7 @@
   if (target::CanLoadFromThread(object, &offset)) {
     ldr(dst, Address(THR, offset));
   } else if (CanLoadFromObjectPool(object)) {
-    const int32_t offset = ObjectPool::element_offset(
+    const int32_t offset = target::ObjectPool::element_offset(
         is_unique ? object_pool_builder().AddObject(object)
                   : object_pool_builder().FindObject(object));
     LoadWordFromPoolOffset(dst, offset);
@@ -569,7 +556,8 @@
 
   // Use constant pool if allowed, unless we can load imm with 2 instructions.
   if ((w1 != 0) && constant_pool_allowed()) {
-    const int32_t offset = ObjectPool::element_offset(FindImmediate(imm));
+    const int32_t offset =
+        target::ObjectPool::element_offset(FindImmediate(imm));
     LoadWordFromPoolOffset(reg, offset);
     return;
   }
@@ -615,7 +603,7 @@
 void Assembler::Branch(const Code& target,
                        Register pp,
                        ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), patchable));
   LoadWordFromPoolOffset(CODE_REG, offset, pp);
   ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
@@ -628,7 +616,7 @@
 
 void Assembler::BranchLink(const Code& target,
                            ObjectPoolBuilderEntry::Patchability patchable) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), patchable));
   LoadWordFromPoolOffset(CODE_REG, offset);
   ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
@@ -636,13 +624,13 @@
 }
 
 void Assembler::BranchLinkToRuntime() {
-  ldr(LR, Address(THR, Thread::call_to_runtime_entry_point_offset()));
+  ldr(LR, Address(THR, target::Thread::call_to_runtime_entry_point_offset()));
   blr(LR);
 }
 
 void Assembler::BranchLinkWithEquivalence(const Code& target,
                                           const Object& equivalence) {
-  const int32_t offset = ObjectPool::element_offset(
+  const int32_t offset = target::ObjectPool::element_offset(
       object_pool_builder().FindObject(ToObject(target), equivalence));
   LoadWordFromPoolOffset(CODE_REG, offset);
   ldr(TMP, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
@@ -652,8 +640,9 @@
 void Assembler::CallNullErrorShared(bool save_fpu_registers) {
   uword entry_point_offset =
       save_fpu_registers
-          ? Thread::null_error_shared_with_fpu_regs_entry_point_offset()
-          : Thread::null_error_shared_without_fpu_regs_entry_point_offset();
+          ? target::Thread::null_error_shared_with_fpu_regs_entry_point_offset()
+          : target::Thread::
+                null_error_shared_without_fpu_regs_entry_point_offset();
   ldr(LR, Address(THR, entry_point_offset));
   blr(LR);
 }
@@ -976,7 +965,7 @@
   }
   ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
   ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
-  and_(TMP, TMP2, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
+  and_(TMP, TMP2, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
   b(&done, ZERO);
 
@@ -1037,7 +1026,7 @@
   }
   ldr(TMP, FieldAddress(object, target::Object::tags_offset()), kUnsignedByte);
   ldr(TMP2, FieldAddress(value, target::Object::tags_offset()), kUnsignedByte);
-  and_(TMP, TMP2, Operand(TMP, LSR, RawObject::kBarrierOverlapShift));
+  and_(TMP, TMP2, Operand(TMP, LSR, target::RawObject::kBarrierOverlapShift));
   tst(TMP, Operand(BARRIER_MASK));
   b(&done, ZERO);
   if (!lr_reserved) Push(LR);
@@ -1111,10 +1100,11 @@
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
-      target::Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
   LoadFromOffset(result, object, class_id_offset - kHeapObjectTag,
                  kUnsignedHalfword);
 }
@@ -1122,10 +1112,10 @@
 void Assembler::LoadClassById(Register result, Register class_id) {
   ASSERT(result != class_id);
   LoadIsolate(result);
-  const intptr_t offset =
-      Isolate::class_table_offset() + ClassTable::table_offset();
+  const intptr_t offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::table_offset();
   LoadFromOffset(result, result, offset);
-  ASSERT(ClassTable::kSizeOfClassPairLog2 == 4);
+  ASSERT(target::ClassTable::kSizeOfClassPairLog2 == 4);
   add(class_id, class_id, Operand(class_id));
   ldr(result, Address(result, class_id, UXTX, Address::Scaled));
 }
@@ -1169,9 +1159,8 @@
 #if defined(DEBUG)
   Label done;
   ASSERT(!constant_pool_allowed());
-  LoadImmediate(TMP,
-                compiler::target::frame_layout.exit_link_slot_from_entry_fp *
-                    compiler::target::kWordSize);
+  LoadImmediate(TMP, target::frame_layout.exit_link_slot_from_entry_fp *
+                         target::kWordSize);
   add(TMP, TMP, Operand(FPREG));
   cmp(TMP, Operand(SPREG));
   b(&done, EQ);
@@ -1183,8 +1172,8 @@
 }
 
 void Assembler::RestoreCodePointer() {
-  ldr(CODE_REG, Address(FP, compiler::target::frame_layout.code_from_fp *
-                                target::kWordSize));
+  ldr(CODE_REG,
+      Address(FP, target::frame_layout.code_from_fp * target::kWordSize));
   CheckCodePointer();
 }
 
@@ -1202,7 +1191,7 @@
   Bind(&cid_ok);
 
   const intptr_t entry_offset =
-      CodeSize() + Instructions::HeaderSize() - kHeapObjectTag;
+      CodeSize() + target::Instructions::HeaderSize() - kHeapObjectTag;
   adr(R0, Immediate(-entry_offset));
   ldr(TMP, FieldAddress(CODE_REG, target::Code::saved_instructions_offset()));
   cmp(R0, Operand(TMP));
@@ -1302,9 +1291,9 @@
   if (!(FLAG_precompiled_mode && FLAG_use_bare_instructions)) {
     if (restore_pp == kRestoreCallerPP) {
       // Restore and untag PP.
-      LoadFromOffset(PP, FP,
-                     compiler::target::frame_layout.saved_caller_pp_from_fp *
-                         target::kWordSize);
+      LoadFromOffset(
+          PP, FP,
+          target::frame_layout.saved_caller_pp_from_fp * target::kWordSize);
       sub(PP, PP, Operand(kHeapObjectTag));
     }
   }
@@ -1320,33 +1309,31 @@
 
   // Save exit frame information to enable stack walking.
   StoreToOffset(new_exit_frame, THR,
-                compiler::target::Thread::top_exit_frame_info_offset());
+                target::Thread::top_exit_frame_info_offset());
 
   // Mark that the thread is executing native code.
-  StoreToOffset(destination, THR, compiler::target::Thread::vm_tag_offset());
-  LoadImmediate(state, Thread::native_execution_state());
-  StoreToOffset(state, THR, compiler::target::Thread::execution_state_offset());
+  StoreToOffset(destination, THR, target::Thread::vm_tag_offset());
+  LoadImmediate(state, target::Thread::native_execution_state());
+  StoreToOffset(state, THR, target::Thread::execution_state_offset());
 
   Label slow_path, done, retry;
   if (!FLAG_use_slow_path) {
-    movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()),
-         0);
+    movz(addr, Immediate(target::Thread::safepoint_state_offset()), 0);
     add(addr, THR, Operand(addr));
     Bind(&retry);
     ldxr(state, addr);
-    cmp(state, Operand(Thread::safepoint_state_unacquired()));
+    cmp(state, Operand(target::Thread::safepoint_state_unacquired()));
     b(&slow_path, NE);
 
-    movz(state, Immediate(Thread::safepoint_state_acquired()), 0);
+    movz(state, Immediate(target::Thread::safepoint_state_acquired()), 0);
     stxr(TMP, state, addr);
     cbz(&done, TMP);  // 0 means stxr was successful.
     b(&retry);
   }
 
   Bind(&slow_path);
-  ldr(addr,
-      Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
-  ldr(addr, FieldAddress(addr, compiler::target::Code::entry_point_offset()));
+  ldr(addr, Address(THR, target::Thread::enter_safepoint_stub_offset()));
+  ldr(addr, FieldAddress(addr, target::Code::entry_point_offset()));
   blr(addr);
 
   Bind(&done);
@@ -1358,37 +1345,34 @@
 
   Label slow_path, done, retry;
   if (!FLAG_use_slow_path) {
-    movz(addr, Immediate(compiler::target::Thread::safepoint_state_offset()),
-         0);
+    movz(addr, Immediate(target::Thread::safepoint_state_offset()), 0);
     add(addr, THR, Operand(addr));
     Bind(&retry);
     ldxr(state, addr);
-    cmp(state, Operand(Thread::safepoint_state_acquired()));
+    cmp(state, Operand(target::Thread::safepoint_state_acquired()));
     b(&slow_path, NE);
 
-    movz(state, Immediate(Thread::safepoint_state_unacquired()), 0);
+    movz(state, Immediate(target::Thread::safepoint_state_unacquired()), 0);
     stxr(TMP, state, addr);
     cbz(&done, TMP);  // 0 means stxr was successful.
     b(&retry);
   }
 
   Bind(&slow_path);
-  ldr(addr,
-      Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
-  ldr(addr, FieldAddress(addr, compiler::target::Code::entry_point_offset()));
+  ldr(addr, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  ldr(addr, FieldAddress(addr, target::Code::entry_point_offset()));
   blr(addr);
 
   Bind(&done);
 
   // Mark that the thread is executing Dart code.
-  LoadImmediate(state, compiler::target::Thread::vm_tag_compiled_id());
-  StoreToOffset(state, THR, compiler::target::Thread::vm_tag_offset());
-  LoadImmediate(state, compiler::target::Thread::generated_execution_state());
-  StoreToOffset(state, THR, compiler::target::Thread::execution_state_offset());
+  LoadImmediate(state, target::Thread::vm_tag_compiled_id());
+  StoreToOffset(state, THR, target::Thread::vm_tag_offset());
+  LoadImmediate(state, target::Thread::generated_execution_state());
+  StoreToOffset(state, THR, target::Thread::execution_state_offset());
 
   // Reset exit frame information in Isolate structure.
-  StoreToOffset(ZR, THR,
-                compiler::target::Thread::top_exit_frame_info_offset());
+  StoreToOffset(ZR, THR, target::Thread::top_exit_frame_info_offset());
 }
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_size) {
@@ -1426,7 +1410,7 @@
   const intptr_t kPushedRegistersSize =
       kDartVolatileCpuRegCount * target::kWordSize +
       kDartVolatileFpuRegCount * target::kWordSize +
-      (compiler::target::frame_layout.dart_fixed_frame_size - 2) *
+      (target::frame_layout.dart_fixed_frame_size - 2) *
           target::kWordSize;  // From EnterStubFrame (excluding PC / FP)
   AddImmediate(SP, FP, -kPushedRegistersSize);
   for (int i = kDartLastVolatileCpuReg; i >= kDartFirstVolatileCpuReg; i--) {
@@ -1471,11 +1455,11 @@
 
   Label immediate, miss;
   Bind(&miss);
-  ldr(IP0, Address(THR, Thread::monomorphic_miss_entry_offset()));
+  ldr(IP0, Address(THR, target::Thread::monomorphic_miss_entry_offset()));
   br(IP0);
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() == Instructions::kMonomorphicEntryOffsetJIT);
+  ASSERT(CodeSize() == target::Instructions::kMonomorphicEntryOffsetJIT);
 
   const intptr_t cid_offset = target::Array::element_offset(0);
   const intptr_t count_offset = target::Array::element_offset(1);
@@ -1491,7 +1475,7 @@
   LoadImmediate(R4, 0);  // GC-safe for OptimizeInvokedFunction.
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() == Instructions::kPolymorphicEntryOffsetJIT);
+  ASSERT(CodeSize() == target::Instructions::kPolymorphicEntryOffsetJIT);
 
   set_use_far_branches(saved_use_far_branches);
 }
@@ -1508,28 +1492,30 @@
 
   Label immediate, miss;
   Bind(&miss);
-  ldr(IP0, Address(THR, Thread::monomorphic_miss_entry_offset()));
+  ldr(IP0, Address(THR, target::Thread::monomorphic_miss_entry_offset()));
   br(IP0);
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetAOT);
   LoadClassIdMayBeSmi(IP0, R0);
   cmp(R5, Operand(IP0, LSL, 1));
   b(&miss, NE);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetAOT);
 
   set_use_far_branches(saved_use_far_branches);
 }
 
 void Assembler::BranchOnMonomorphicCheckedEntryJIT(Label* label) {
   has_single_entry_point_ = false;
-  while (CodeSize() < Instructions::kMonomorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kMonomorphicEntryOffsetJIT) {
     brk(0);
   }
   b(label);
-  while (CodeSize() < Instructions::kPolymorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kPolymorphicEntryOffsetJIT) {
     brk(0);
   }
 }
@@ -1539,14 +1525,14 @@
                                      Register temp_reg,
                                      Label* trace) {
   ASSERT(cid > 0);
-  intptr_t state_offset = ClassTable::StateOffsetFor(cid);
+  intptr_t state_offset = target::ClassTable::StateOffsetFor(cid);
   LoadIsolate(temp_reg);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   ldr(temp_reg, Address(temp_reg, table_offset));
   AddImmediate(temp_reg, state_offset);
   ldr(temp_reg, Address(temp_reg, 0));
-  tsti(temp_reg, Immediate(ClassHeapStats::TraceAllocationMask()));
+  tsti(temp_reg, Immediate(target::ClassHeapStats::TraceAllocationMask()));
   b(trace, NE);
 }
 
@@ -1554,8 +1540,8 @@
   ASSERT(cid > 0);
   intptr_t counter_offset = target::ClassTable::NewSpaceCounterOffsetFor(cid);
   LoadIsolate(TMP2);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   ldr(TMP, Address(TMP2, table_offset));
   AddImmediate(TMP2, TMP, counter_offset);
   ldr(TMP, Address(TMP2, 0));
@@ -1565,14 +1551,14 @@
 
 void Assembler::UpdateAllocationStatsWithSize(intptr_t cid, Register size_reg) {
   ASSERT(cid > 0);
-  const uword class_offset = ClassTable::ClassOffsetFor(cid);
+  const uword class_offset = target::ClassTable::ClassOffsetFor(cid);
   const uword count_field_offset =
-      ClassHeapStats::allocated_since_gc_new_space_offset();
+      target::ClassHeapStats::allocated_since_gc_new_space_offset();
   const uword size_field_offset =
-      ClassHeapStats::allocated_size_since_gc_new_space_offset();
+      target::ClassHeapStats::allocated_size_since_gc_new_space_offset();
   LoadIsolate(TMP2);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   ldr(TMP, Address(TMP2, table_offset));
   AddImmediate(TMP2, TMP, class_offset);
   ldr(TMP, Address(TMP2, count_field_offset));
@@ -1591,7 +1577,8 @@
                             bool tag_result) {
   ASSERT(failure != NULL);
   const intptr_t instance_size = target::Class::GetInstanceSize(cls);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
@@ -1601,10 +1588,10 @@
     const Register kEndReg = TMP;
 
     // instance_reg: potential next object start.
-    RELEASE_ASSERT((Thread::top_offset() + target::kWordSize) ==
-                   Thread::end_offset());
+    RELEASE_ASSERT((target::Thread::top_offset() + target::kWordSize) ==
+                   target::Thread::end_offset());
     ldp(instance_reg, kEndReg,
-        Address(THR, Thread::top_offset(), Address::PairOffset));
+        Address(THR, target::Thread::top_offset(), Address::PairOffset));
 
     // TODO(koda): Protect against unsigned overflow here.
     AddImmediate(top_reg, instance_reg, instance_size);
@@ -1613,7 +1600,7 @@
 
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    str(top_reg, Address(THR, Thread::top_offset()));
+    str(top_reg, Address(THR, target::Thread::top_offset()));
 
     NOT_IN_PRODUCT(UpdateAllocationStats(cid));
 
@@ -1639,28 +1626,29 @@
                                  Register end_address,
                                  Register temp1,
                                  Register temp2) {
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     NOT_IN_PRODUCT(MaybeTraceAllocation(cid, temp1, failure));
     // Potential new object start.
-    ldr(instance, Address(THR, Thread::top_offset()));
+    ldr(instance, Address(THR, target::Thread::top_offset()));
     AddImmediateSetFlags(end_address, instance, instance_size);
     b(failure, CS);  // Fail on unsigned overflow.
 
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    ldr(temp2, Address(THR, Thread::end_offset()));
+    ldr(temp2, Address(THR, target::Thread::end_offset()));
     cmp(end_address, Operand(temp2));
     b(failure, CS);
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    str(end_address, Address(THR, Thread::top_offset()));
+    str(end_address, Address(THR, target::Thread::top_offset()));
     add(instance, instance, Operand(kHeapObjectTag));
-    LoadImmediate(temp2, instance_size);
+    NOT_IN_PRODUCT(LoadImmediate(temp2, instance_size));
     NOT_IN_PRODUCT(UpdateAllocationStatsWithSize(cid, temp2));
 
     // Initialize the tags.
@@ -1692,7 +1680,8 @@
                                              intptr_t index) const {
   const int64_t offset =
       index * index_scale +
-      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+      (is_external ? 0
+                   : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag));
   ASSERT(Utils::IsInt(32, offset));
   const OperandSize size = Address::OperandSizeFor(cid);
   ASSERT(Address::CanHoldOffset(offset, Address::Offset, size));
@@ -1707,7 +1696,8 @@
                                               intptr_t index) {
   const int64_t offset =
       index * index_scale +
-      (is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag));
+      (is_external ? 0
+                   : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag));
   AddImmediate(address, array, offset);
 }
 
@@ -1720,7 +1710,7 @@
   // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
   const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
   const int32_t offset =
-      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+      is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   ASSERT(array != TMP);
   ASSERT(index != TMP);
   const Register base = is_load ? TMP : index;
@@ -1747,7 +1737,7 @@
   // Note that index is expected smi-tagged, (i.e, LSL 1) for all arrays.
   const intptr_t shift = Utils::ShiftForPowerOfTwo(index_scale) - kSmiTagShift;
   const int32_t offset =
-      is_external ? 0 : (Instance::DataOffsetFor(cid) - kHeapObjectTag);
+      is_external ? 0 : (target::Instance::DataOffsetFor(cid) - kHeapObjectTag);
   if (shift == 0) {
     add(address, array, Operand(index));
   } else if (shift < 0) {
diff --git a/runtime/vm/compiler/assembler/assembler_arm64.h b/runtime/vm/compiler/assembler/assembler_arm64.h
index 26f8cb9..749b796 100644
--- a/runtime/vm/compiler/assembler/assembler_arm64.h
+++ b/runtime/vm/compiler/assembler/assembler_arm64.h
@@ -2283,12 +2283,6 @@
 };
 
 }  // namespace compiler
-
-using compiler::Address;
-using compiler::FieldAddress;
-using compiler::Immediate;
-using compiler::Operand;
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_ARM64_H_
diff --git a/runtime/vm/compiler/assembler/assembler_dbc.h b/runtime/vm/compiler/assembler/assembler_dbc.h
index 38a8920..df2a83c 100644
--- a/runtime/vm/compiler/assembler/assembler_dbc.h
+++ b/runtime/vm/compiler/assembler/assembler_dbc.h
@@ -100,9 +100,6 @@
 };
 
 }  // namespace compiler
-
-using compiler::Address;
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_DBC_H_
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.cc b/runtime/vm/compiler/assembler/assembler_ia32.cc
index 73031ba..84c87b1 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.cc
+++ b/runtime/vm/compiler/assembler/assembler_ia32.cc
@@ -21,14 +21,6 @@
 
 namespace compiler {
 
-using target::ClassTable;
-using target::Heap;
-using target::Instance;
-using target::Instructions;
-using target::Isolate;
-using target::RawObject;
-using target::Thread;
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 class DirectCallRelocation : public AssemblerFixup {
@@ -1780,7 +1772,7 @@
 }
 
 void Assembler::LoadIsolate(Register dst) {
-  movl(dst, Address(THR, Thread::isolate_offset()));
+  movl(dst, Address(THR, target::Thread::isolate_offset()));
 }
 
 void Assembler::LoadObject(Register dst,
@@ -1902,7 +1894,7 @@
   if (object != EDX) {
     movl(EDX, object);
   }
-  call(Address(THR, Thread::write_barrier_entry_point_offset()));
+  call(Address(THR, target::Thread::write_barrier_entry_point_offset()));
   if (value != EDX) {
     popl(EDX);  // Restore EDX.
   }
@@ -1961,7 +1953,7 @@
   } else if (slot != kWriteBarrierSlotReg) {
     movl(kWriteBarrierSlotReg, slot);
   }
-  call(Address(THR, Thread::array_write_barrier_entry_point_offset()));
+  call(Address(THR, target::Thread::array_write_barrier_entry_point_offset()));
   if (value != kWriteBarrierSlotReg && slot != kWriteBarrierSlotReg) {
     popl(kWriteBarrierSlotReg);  // Restore kWriteBarrierSlotReg.
   }
@@ -2104,10 +2096,11 @@
   intptr_t start = CodeSize();
   Label have_cid, miss;
   Bind(&miss);
-  jmp(Address(THR, Thread::monomorphic_miss_entry_offset()));
+  jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetJIT);
 
   const intptr_t cid_offset = target::Array::element_offset(0);
   const intptr_t count_offset = target::Array::element_offset(1);
@@ -2127,7 +2120,8 @@
   nop(1);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetJIT);
 }
 
 // EBX receiver, ECX guarded cid as Smi.
@@ -2138,11 +2132,11 @@
 
 void Assembler::BranchOnMonomorphicCheckedEntryJIT(Label* label) {
   has_single_entry_point_ = false;
-  while (CodeSize() < Instructions::kMonomorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kMonomorphicEntryOffsetJIT) {
     int3();
   }
   jmp(label);
-  while (CodeSize() < Instructions::kPolymorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kPolymorphicEntryOffsetJIT) {
     int3();
   }
 }
@@ -2151,31 +2145,31 @@
                                             Register new_exit_frame,
                                             Register scratch) {
   // Save exit frame information to enable stack walking.
-  movl(Address(THR, Thread::top_exit_frame_info_offset()), new_exit_frame);
+  movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
+       new_exit_frame);
 
   // Mark that the thread is executing native code.
   movl(VMTagAddress(), destination_address);
-  movl(Address(THR, Thread::execution_state_offset()),
-       Immediate(compiler::target::Thread::native_execution_state()));
+  movl(Address(THR, target::Thread::execution_state_offset()),
+       Immediate(target::Thread::native_execution_state()));
 
   // Compare and swap the value at Thread::safepoint_state from unacquired to
   // acquired. On success, jump to 'success'; otherwise, fallthrough.
   Label done;
   if (!FLAG_use_slow_path) {
     pushl(EAX);
-    movl(EAX, Immediate(Thread::safepoint_state_unacquired()));
-    movl(scratch, Immediate(Thread::safepoint_state_acquired()));
-    LockCmpxchgl(Address(THR, Thread::safepoint_state_offset()), scratch);
+    movl(EAX, Immediate(target::Thread::safepoint_state_unacquired()));
+    movl(scratch, Immediate(target::Thread::safepoint_state_acquired()));
+    LockCmpxchgl(Address(THR, target::Thread::safepoint_state_offset()),
+                 scratch);
     movl(scratch, EAX);
     popl(EAX);
-    cmpl(scratch, Immediate(Thread::safepoint_state_unacquired()));
+    cmpl(scratch, Immediate(target::Thread::safepoint_state_unacquired()));
     j(EQUAL, &done);
   }
 
-  movl(scratch,
-       Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
-  movl(scratch,
-       FieldAddress(scratch, compiler::target::Code::entry_point_offset()));
+  movl(scratch, Address(THR, target::Thread::enter_safepoint_stub_offset()));
+  movl(scratch, FieldAddress(scratch, target::Code::entry_point_offset()));
   call(scratch);
 
   Bind(&done);
@@ -2187,34 +2181,31 @@
   Label done;
   if (!FLAG_use_slow_path) {
     pushl(EAX);
-    movl(EAX, Immediate(compiler::target::Thread::safepoint_state_acquired()));
-    movl(scratch,
-         Immediate(compiler::target::Thread::safepoint_state_unacquired()));
-    LockCmpxchgl(
-        Address(THR, compiler::target::Thread::safepoint_state_offset()),
-        scratch);
+    movl(EAX, Immediate(target::Thread::safepoint_state_acquired()));
+    movl(scratch, Immediate(target::Thread::safepoint_state_unacquired()));
+    LockCmpxchgl(Address(THR, target::Thread::safepoint_state_offset()),
+                 scratch);
     movl(scratch, EAX);
     popl(EAX);
-    cmpl(scratch, Immediate(Thread::safepoint_state_acquired()));
+    cmpl(scratch, Immediate(target::Thread::safepoint_state_acquired()));
     j(EQUAL, &done);
   }
 
-  movl(scratch,
-       Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
-  movl(scratch,
-       FieldAddress(scratch, compiler::target::Code::entry_point_offset()));
+  movl(scratch, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  movl(scratch, FieldAddress(scratch, target::Code::entry_point_offset()));
   call(scratch);
 
   Bind(&done);
 
   // Mark that the thread is executing Dart code.
   movl(Assembler::VMTagAddress(),
-       Immediate(compiler::target::Thread::vm_tag_compiled_id()));
-  movl(Address(THR, Thread::execution_state_offset()),
-       Immediate(compiler::target::Thread::generated_execution_state()));
+       Immediate(target::Thread::vm_tag_compiled_id()));
+  movl(Address(THR, target::Thread::execution_state_offset()),
+       Immediate(target::Thread::generated_execution_state()));
 
   // Reset exit frame information in Isolate structure.
-  movl(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+  movl(Address(THR, target::Thread::top_exit_frame_info_offset()),
+       Immediate(0));
 }
 
 static const intptr_t kNumberOfVolatileCpuRegisters = 3;
@@ -2286,7 +2277,7 @@
 }
 
 void Assembler::CallToRuntime() {
-  call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
+  call(Address(THR, target::Thread::call_to_runtime_entry_point_offset()));
 }
 
 void Assembler::Jmp(const Code& target) {
@@ -2347,11 +2338,11 @@
                                      bool near_jump) {
   ASSERT(cid > 0);
   Address state_address(kNoRegister, 0);
-  intptr_t state_offset = ClassTable::StateOffsetFor(cid);
+  intptr_t state_offset = target::ClassTable::StateOffsetFor(cid);
   ASSERT(temp_reg != kNoRegister);
   LoadIsolate(temp_reg);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   movl(temp_reg, Address(temp_reg, table_offset));
   state_address = Address(temp_reg, state_offset);
   testb(state_address,
@@ -2363,11 +2354,11 @@
 
 void Assembler::UpdateAllocationStats(intptr_t cid, Register temp_reg) {
   ASSERT(cid > 0);
-  intptr_t counter_offset = ClassTable::NewSpaceCounterOffsetFor(cid);
+  intptr_t counter_offset = target::ClassTable::NewSpaceCounterOffsetFor(cid);
   ASSERT(temp_reg != kNoRegister);
   LoadIsolate(temp_reg);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   movl(temp_reg, Address(temp_reg, table_offset));
   incl(Address(temp_reg, counter_offset));
 }
@@ -2378,7 +2369,7 @@
   ASSERT(cid > 0);
   ASSERT(cid < kNumPredefinedCids);
   UpdateAllocationStats(cid, temp_reg);
-  intptr_t size_offset = ClassTable::NewSpaceSizeOffsetFor(cid);
+  intptr_t size_offset = target::ClassTable::NewSpaceSizeOffsetFor(cid);
   addl(Address(temp_reg, size_offset), size_reg);
 }
 
@@ -2388,7 +2379,7 @@
   ASSERT(cid > 0);
   ASSERT(cid < kNumPredefinedCids);
   UpdateAllocationStats(cid, temp_reg);
-  intptr_t size_offset = ClassTable::NewSpaceSizeOffsetFor(cid);
+  intptr_t size_offset = target::ClassTable::NewSpaceSizeOffsetFor(cid);
   addl(Address(temp_reg, size_offset), Immediate(size_in_bytes));
 }
 #endif  // !PRODUCT
@@ -2401,20 +2392,21 @@
   ASSERT(failure != NULL);
   ASSERT(temp_reg != kNoRegister);
   const intptr_t instance_size = target::Class::GetInstanceSize(cls);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     const classid_t cid = target::Class::GetId(cls);
     NOT_IN_PRODUCT(MaybeTraceAllocation(cid, temp_reg, failure, near_jump));
-    movl(instance_reg, Address(THR, Thread::top_offset()));
+    movl(instance_reg, Address(THR, target::Thread::top_offset()));
     addl(instance_reg, Immediate(instance_size));
     // instance_reg: potential next object start.
-    cmpl(instance_reg, Address(THR, Thread::end_offset()));
+    cmpl(instance_reg, Address(THR, target::Thread::end_offset()));
     j(ABOVE_EQUAL, failure, near_jump);
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    movl(Address(THR, Thread::top_offset()), instance_reg);
+    movl(Address(THR, target::Thread::top_offset()), instance_reg);
     NOT_IN_PRODUCT(UpdateAllocationStats(cid, temp_reg));
     ASSERT(instance_size >= kHeapObjectTag);
     subl(instance_reg, Immediate(instance_size - kHeapObjectTag));
@@ -2436,12 +2428,13 @@
                                  Register temp_reg) {
   ASSERT(failure != NULL);
   ASSERT(temp_reg != kNoRegister);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     NOT_IN_PRODUCT(MaybeTraceAllocation(cid, temp_reg, failure, near_jump));
-    movl(instance, Address(THR, Thread::top_offset()));
+    movl(instance, Address(THR, target::Thread::top_offset()));
     movl(end_address, instance);
 
     addl(end_address, Immediate(instance_size));
@@ -2450,12 +2443,12 @@
     // Check if the allocation fits into the remaining space.
     // EAX: potential new object start.
     // EBX: potential next object start.
-    cmpl(end_address, Address(THR, Thread::end_offset()));
+    cmpl(end_address, Address(THR, target::Thread::end_offset()));
     j(ABOVE_EQUAL, failure);
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    movl(Address(THR, Thread::top_offset()), end_address);
+    movl(Address(THR, target::Thread::top_offset()), end_address);
     addl(instance, Immediate(kHeapObjectTag));
     NOT_IN_PRODUCT(UpdateAllocationStatsWithSize(cid, instance_size, temp_reg));
 
@@ -2590,20 +2583,21 @@
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
-      target::Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
 void Assembler::LoadClassById(Register result, Register class_id) {
   ASSERT(result != class_id);
   LoadIsolate(result);
-  const intptr_t offset =
-      Isolate::class_table_offset() + ClassTable::table_offset();
+  const intptr_t offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::table_offset();
   movl(result, Address(result, offset));
-  ASSERT(ClassTable::kSizeOfClassPairLog2 == 3);
+  ASSERT(target::ClassTable::kSizeOfClassPairLog2 == 3);
   movl(result, Address(result, class_id, TIMES_8, 0));
 }
 
@@ -2619,10 +2613,11 @@
                                      Register scratch,
                                      Label* is_smi) {
   ASSERT(kSmiTagShift == 1);
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset =
-      target::Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
@@ -2648,7 +2643,8 @@
     Bind(&join);
   } else {
     ASSERT(result != object);
-    static const intptr_t kSmiCidSource = kSmiCid << RawObject::kClassIdTagPos;
+    static const intptr_t kSmiCidSource = kSmiCid
+                                          << target::RawObject::kClassIdTagPos;
 
     // Make a dummy "Object" whose cid is kSmiCid.
     movl(result, Immediate(reinterpret_cast<int32_t>(&kSmiCidSource) + 1));
@@ -2693,7 +2689,7 @@
     return Address(array, index * index_scale + extra_disp);
   } else {
     const int64_t disp = static_cast<int64_t>(index) * index_scale +
-                         Instance::DataOffsetFor(cid) + extra_disp;
+                         target::Instance::DataOffsetFor(cid) + extra_disp;
     ASSERT(Utils::IsInt(32, disp));
     return FieldAddress(array, static_cast<int32_t>(disp));
   }
@@ -2731,7 +2727,7 @@
     return Address(array, index, ToScaleFactor(index_scale), extra_disp);
   } else {
     return FieldAddress(array, index, ToScaleFactor(index_scale),
-                        Instance::DataOffsetFor(cid) + extra_disp);
+                        target::Instance::DataOffsetFor(cid) + extra_disp);
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_ia32.h b/runtime/vm/compiler/assembler/assembler_ia32.h
index 4bc1e6f..d5193ef 100644
--- a/runtime/vm/compiler/assembler/assembler_ia32.h
+++ b/runtime/vm/compiler/assembler/assembler_ia32.h
@@ -936,11 +936,6 @@
 }
 
 }  // namespace compiler
-
-using compiler::Address;
-using compiler::FieldAddress;
-using compiler::Immediate;
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_IA32_H_
diff --git a/runtime/vm/compiler/assembler/assembler_x64.cc b/runtime/vm/compiler/assembler/assembler_x64.cc
index a90db6d..053bff1 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.cc
+++ b/runtime/vm/compiler/assembler/assembler_x64.cc
@@ -23,14 +23,6 @@
 
 namespace compiler {
 
-using target::ClassTable;
-using target::Heap;
-using target::Instance;
-using target::Instructions;
-using target::Isolate;
-using target::RawObject;
-using target::Thread;
-
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 Assembler::Assembler(ObjectPoolBuilder* object_pool_builder,
@@ -40,10 +32,12 @@
   ASSERT(!use_far_branches);
 
   generate_invoke_write_barrier_wrapper_ = [&](Register reg) {
-    call(Address(THR, Thread::write_barrier_wrappers_thread_offset(reg)));
+    call(Address(THR,
+                 target::Thread::write_barrier_wrappers_thread_offset(reg)));
   };
   generate_invoke_array_write_barrier_ = [&]() {
-    call(Address(THR, Thread::array_write_barrier_entry_point_offset()));
+    call(
+        Address(THR, target::Thread::array_write_barrier_entry_point_offset()));
   };
 }
 
@@ -107,14 +101,15 @@
 }
 
 void Assembler::CallToRuntime() {
-  call(Address(THR, Thread::call_to_runtime_entry_point_offset()));
+  call(Address(THR, target::Thread::call_to_runtime_entry_point_offset()));
 }
 
 void Assembler::CallNullErrorShared(bool save_fpu_registers) {
   uword entry_point_offset =
       save_fpu_registers
-          ? Thread::null_error_shared_with_fpu_regs_entry_point_offset()
-          : Thread::null_error_shared_without_fpu_regs_entry_point_offset();
+          ? target::Thread::null_error_shared_with_fpu_regs_entry_point_offset()
+          : target::Thread::
+                null_error_shared_without_fpu_regs_entry_point_offset();
   call(Address(THR, entry_point_offset));
 }
 
@@ -168,29 +163,29 @@
 void Assembler::TransitionGeneratedToNative(Register destination_address,
                                             Register new_exit_frame) {
   // Save exit frame information to enable stack walking.
-  movq(Address(THR, Thread::top_exit_frame_info_offset()), new_exit_frame);
+  movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
+       new_exit_frame);
 
   movq(Assembler::VMTagAddress(), destination_address);
-  movq(Address(THR, compiler::target::Thread::execution_state_offset()),
-       Immediate(compiler::target::Thread::native_execution_state()));
+  movq(Address(THR, target::Thread::execution_state_offset()),
+       Immediate(target::Thread::native_execution_state()));
 
   // Compare and swap the value at Thread::safepoint_state from unacquired to
   // acquired. If the CAS fails, go to a slow-path stub.
   Label done;
   if (!FLAG_use_slow_path) {
     pushq(RAX);
-    movq(RAX, Immediate(Thread::safepoint_state_unacquired()));
-    movq(TMP, Immediate(Thread::safepoint_state_acquired()));
-    LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
+    movq(RAX, Immediate(target::Thread::safepoint_state_unacquired()));
+    movq(TMP, Immediate(target::Thread::safepoint_state_acquired()));
+    LockCmpxchgq(Address(THR, target::Thread::safepoint_state_offset()), TMP);
     movq(TMP, RAX);
     popq(RAX);
-    cmpq(TMP, Immediate(Thread::safepoint_state_unacquired()));
+    cmpq(TMP, Immediate(target::Thread::safepoint_state_unacquired()));
     j(EQUAL, &done);
   }
 
-  movq(TMP,
-       Address(THR, compiler::target::Thread::enter_safepoint_stub_offset()));
-  movq(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  movq(TMP, Address(THR, target::Thread::enter_safepoint_stub_offset()));
+  movq(TMP, FieldAddress(TMP, target::Code::entry_point_offset()));
   // Use call instead of CFunctionCall to prevent having to clean up shadow
   // space afterwards. This is possible because safepoint stub has no arguments.
   call(TMP);
@@ -204,18 +199,17 @@
   Label done;
   if (!FLAG_use_slow_path) {
     pushq(RAX);
-    movq(RAX, Immediate(Thread::safepoint_state_acquired()));
-    movq(TMP, Immediate(Thread::safepoint_state_unacquired()));
-    LockCmpxchgq(Address(THR, Thread::safepoint_state_offset()), TMP);
+    movq(RAX, Immediate(target::Thread::safepoint_state_acquired()));
+    movq(TMP, Immediate(target::Thread::safepoint_state_unacquired()));
+    LockCmpxchgq(Address(THR, target::Thread::safepoint_state_offset()), TMP);
     movq(TMP, RAX);
     popq(RAX);
-    cmpq(TMP, Immediate(Thread::safepoint_state_acquired()));
+    cmpq(TMP, Immediate(target::Thread::safepoint_state_acquired()));
     j(EQUAL, &done);
   }
 
-  movq(TMP,
-       Address(THR, compiler::target::Thread::exit_safepoint_stub_offset()));
-  movq(TMP, FieldAddress(TMP, compiler::target::Code::entry_point_offset()));
+  movq(TMP, Address(THR, target::Thread::exit_safepoint_stub_offset()));
+  movq(TMP, FieldAddress(TMP, target::Code::entry_point_offset()));
   // Use call instead of CFunctionCall to prevent having to clean up shadow
   // space afterwards. This is possible because safepoint stub has no arguments.
   call(TMP);
@@ -223,12 +217,13 @@
   Bind(&done);
 
   movq(Assembler::VMTagAddress(),
-       Immediate(compiler::target::Thread::vm_tag_compiled_id()));
-  movq(Address(THR, Thread::execution_state_offset()),
-       Immediate(compiler::target::Thread::generated_execution_state()));
+       Immediate(target::Thread::vm_tag_compiled_id()));
+  movq(Address(THR, target::Thread::execution_state_offset()),
+       Immediate(target::Thread::generated_execution_state()));
 
   // Reset exit frame information in Isolate structure.
-  movq(Address(THR, Thread::top_exit_frame_info_offset()), Immediate(0));
+  movq(Address(THR, target::Thread::top_exit_frame_info_offset()),
+       Immediate(0));
 }
 
 void Assembler::EmitQ(int reg,
@@ -419,7 +414,7 @@
 
 #define UNARY_XMM_WITH_CONSTANT(name, constant, op)                            \
   void Assembler::name(XmmRegister dst, XmmRegister src) {                     \
-    movq(TMP, Address(THR, Thread::constant##_address_offset()));              \
+    movq(TMP, Address(THR, target::Thread::constant##_address_offset()));      \
     if (dst == src) {                                                          \
       op(dst, Address(TMP, 0));                                                \
     } else {                                                                   \
@@ -1183,7 +1178,7 @@
 }
 
 void Assembler::LoadIsolate(Register dst) {
-  movq(dst, Address(THR, Thread::isolate_offset()));
+  movq(dst, Address(THR, target::Thread::isolate_offset()));
 }
 
 void Assembler::LoadObjectHelper(Register dst,
@@ -1348,8 +1343,8 @@
     j(ZERO, &done, kNearJump);
   }
   movb(TMP, FieldAddress(object, target::Object::tags_offset()));
-  shrl(TMP, Immediate(RawObject::kBarrierOverlapShift));
-  andl(TMP, Address(THR, Thread::write_barrier_mask_offset()));
+  shrl(TMP, Immediate(target::RawObject::kBarrierOverlapShift));
+  andl(TMP, Address(THR, target::Thread::write_barrier_mask_offset()));
   testb(FieldAddress(value, target::Object::tags_offset()), TMP);
   j(ZERO, &done, kNearJump);
 
@@ -1401,7 +1396,7 @@
   }
   movb(TMP, FieldAddress(object, target::Object::tags_offset()));
   shrl(TMP, Immediate(target::RawObject::kBarrierOverlapShift));
-  andl(TMP, Address(THR, Thread::write_barrier_mask_offset()));
+  andl(TMP, Address(THR, target::Thread::write_barrier_mask_offset()));
   testb(FieldAddress(value, target::Object::tags_offset()), TMP);
   j(ZERO, &done, kNearJump);
 
@@ -1701,7 +1696,7 @@
   {
     const intptr_t kRIPRelativeLeaqSize = 7;
     const intptr_t header_to_entry_offset =
-        (Instructions::HeaderSize() - kHeapObjectTag);
+        (target::Instructions::HeaderSize() - kHeapObjectTag);
     const intptr_t header_to_rip_offset =
         CodeSize() + kRIPRelativeLeaqSize + header_to_entry_offset;
     leaq(RAX, Address::AddressRIPRelative(-header_to_rip_offset));
@@ -1749,14 +1744,15 @@
   intptr_t start = CodeSize();
   Label have_cid, miss;
   Bind(&miss);
-  jmp(Address(THR, Thread::monomorphic_miss_entry_offset()));
+  jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
 
   // Ensure the monomorphic entry is 2-byte aligned (so GC can see them if we
   // store them in ICData / MegamorphicCache arrays)
   nop(1);
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetJIT);
   ASSERT((CodeSize() & kSmiTagMask) == kSmiTag);
 
   const intptr_t cid_offset = target::Array::element_offset(0);
@@ -1771,7 +1767,8 @@
   nop(1);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetJIT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetJIT);
   ASSERT(((CodeSize() - start) & kSmiTagMask) == kSmiTag);
 }
 
@@ -1780,14 +1777,15 @@
   intptr_t start = CodeSize();
   Label have_cid, miss;
   Bind(&miss);
-  jmp(Address(THR, Thread::monomorphic_miss_entry_offset()));
+  jmp(Address(THR, target::Thread::monomorphic_miss_entry_offset()));
 
   // Ensure the monomorphic entry is 2-byte aligned (so GC can see them if we
   // store them in ICData / MegamorphicCache arrays)
   nop(1);
 
   Comment("MonomorphicCheckedEntry");
-  ASSERT(CodeSize() - start == Instructions::kMonomorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kMonomorphicEntryOffsetAOT);
   ASSERT((CodeSize() & kSmiTagMask) == kSmiTag);
 
   movq(RAX, Immediate(kSmiCid));
@@ -1805,17 +1803,18 @@
   nop(1);
 
   // Fall through to unchecked entry.
-  ASSERT(CodeSize() - start == Instructions::kPolymorphicEntryOffsetAOT);
+  ASSERT(CodeSize() - start ==
+         target::Instructions::kPolymorphicEntryOffsetAOT);
   ASSERT(((CodeSize() - start) & kSmiTagMask) == kSmiTag);
 }
 
 void Assembler::BranchOnMonomorphicCheckedEntryJIT(Label* label) {
   has_single_entry_point_ = false;
-  while (CodeSize() < Instructions::kMonomorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kMonomorphicEntryOffsetJIT) {
     int3();
   }
   jmp(label);
-  while (CodeSize() < Instructions::kPolymorphicEntryOffsetJIT) {
+  while (CodeSize() < target::Instructions::kPolymorphicEntryOffsetJIT) {
     int3();
   }
 }
@@ -1825,11 +1824,11 @@
                                      Label* trace,
                                      bool near_jump) {
   ASSERT(cid > 0);
-  intptr_t state_offset = ClassTable::StateOffsetFor(cid);
+  intptr_t state_offset = target::ClassTable::StateOffsetFor(cid);
   Register temp_reg = TMP;
   LoadIsolate(temp_reg);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   movq(temp_reg, Address(temp_reg, table_offset));
   testb(Address(temp_reg, state_offset),
         Immediate(target::ClassHeapStats::TraceAllocationMask()));
@@ -1840,11 +1839,11 @@
 
 void Assembler::UpdateAllocationStats(intptr_t cid) {
   ASSERT(cid > 0);
-  intptr_t counter_offset = ClassTable::NewSpaceCounterOffsetFor(cid);
+  intptr_t counter_offset = target::ClassTable::NewSpaceCounterOffsetFor(cid);
   Register temp_reg = TMP;
   LoadIsolate(temp_reg);
-  intptr_t table_offset = Isolate::class_table_offset() +
-                          ClassTable::class_heap_stats_table_offset();
+  intptr_t table_offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::class_heap_stats_table_offset();
   movq(temp_reg, Address(temp_reg, table_offset));
   incq(Address(temp_reg, counter_offset));
 }
@@ -1854,7 +1853,7 @@
   ASSERT(cid < kNumPredefinedCids);
   UpdateAllocationStats(cid);
   Register temp_reg = TMP;
-  intptr_t size_offset = ClassTable::NewSpaceSizeOffsetFor(cid);
+  intptr_t size_offset = target::ClassTable::NewSpaceSizeOffsetFor(cid);
   addq(Address(temp_reg, size_offset), size_reg);
 }
 
@@ -1864,7 +1863,7 @@
   ASSERT(cid < kNumPredefinedCids);
   UpdateAllocationStats(cid);
   Register temp_reg = TMP;
-  intptr_t size_offset = ClassTable::NewSpaceSizeOffsetFor(cid);
+  intptr_t size_offset = target::ClassTable::NewSpaceSizeOffsetFor(cid);
   addq(Address(temp_reg, size_offset), Immediate(size_in_bytes));
 }
 #endif  // !PRODUCT
@@ -1876,20 +1875,21 @@
                             Register temp) {
   ASSERT(failure != NULL);
   const intptr_t instance_size = target::Class::GetInstanceSize(cls);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     const classid_t cid = target::Class::GetId(cls);
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     NOT_IN_PRODUCT(MaybeTraceAllocation(cid, failure, near_jump));
-    movq(instance_reg, Address(THR, Thread::top_offset()));
+    movq(instance_reg, Address(THR, target::Thread::top_offset()));
     addq(instance_reg, Immediate(instance_size));
     // instance_reg: potential next object start.
-    cmpq(instance_reg, Address(THR, Thread::end_offset()));
+    cmpq(instance_reg, Address(THR, target::Thread::end_offset()));
     j(ABOVE_EQUAL, failure, near_jump);
     // Successfully allocated the object, now update top to point to
     // next object start and store the class in the class field of object.
-    movq(Address(THR, Thread::top_offset()), instance_reg);
+    movq(Address(THR, target::Thread::top_offset()), instance_reg);
     NOT_IN_PRODUCT(UpdateAllocationStats(cid));
     ASSERT(instance_size >= kHeapObjectTag);
     AddImmediate(instance_reg, Immediate(kHeapObjectTag - instance_size));
@@ -1912,12 +1912,13 @@
                                  Register end_address,
                                  Register temp) {
   ASSERT(failure != NULL);
-  if (FLAG_inline_alloc && Heap::IsAllocatableInNewSpace(instance_size)) {
+  if (FLAG_inline_alloc &&
+      target::Heap::IsAllocatableInNewSpace(instance_size)) {
     // If this allocation is traced, program will jump to failure path
     // (i.e. the allocation stub) which will allocate the object and trace the
     // allocation call site.
     NOT_IN_PRODUCT(MaybeTraceAllocation(cid, failure, near_jump));
-    movq(instance, Address(THR, Thread::top_offset()));
+    movq(instance, Address(THR, target::Thread::top_offset()));
     movq(end_address, instance);
 
     addq(end_address, Immediate(instance_size));
@@ -1926,12 +1927,12 @@
     // Check if the allocation fits into the remaining space.
     // instance: potential new object start.
     // end_address: potential next object start.
-    cmpq(end_address, Address(THR, Thread::end_offset()));
+    cmpq(end_address, Address(THR, target::Thread::end_offset()));
     j(ABOVE_EQUAL, failure);
 
     // Successfully allocated the object(s), now update top to point to
     // next object start and initialize the object.
-    movq(Address(THR, Thread::top_offset()), end_address);
+    movq(Address(THR, target::Thread::top_offset()), end_address);
     addq(instance, Immediate(kHeapObjectTag));
     NOT_IN_PRODUCT(UpdateAllocationStatsWithSize(cid, instance_size));
 
@@ -2086,22 +2087,22 @@
 }
 
 void Assembler::LoadClassId(Register result, Register object) {
-  using target::Object;
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
   const intptr_t class_id_offset =
-      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
   movzxw(result, FieldAddress(object, class_id_offset));
 }
 
 void Assembler::LoadClassById(Register result, Register class_id) {
   ASSERT(result != class_id);
   LoadIsolate(result);
-  const intptr_t offset =
-      Isolate::class_table_offset() + ClassTable::table_offset();
+  const intptr_t offset = target::Isolate::class_table_offset() +
+                          target::ClassTable::table_offset();
   movq(result, Address(result, offset));
-  ASSERT(ClassTable::kSizeOfClassPairLog2 == 4);
+  ASSERT(target::ClassTable::kSizeOfClassPairLog2 == 4);
   // TIMES_16 is not a real scale factor on x64, so we double the class id
   // and use TIMES_8.
   addq(class_id, class_id);
@@ -2119,13 +2120,13 @@
 void Assembler::SmiUntagOrCheckClass(Register object,
                                      intptr_t class_id,
                                      Label* is_smi) {
-  using target::Object;
   ASSERT(kSmiTagShift == 1);
-  ASSERT(RawObject::kClassIdTagPos == 16);
-  ASSERT(RawObject::kClassIdTagSize == 16);
+  ASSERT(target::RawObject::kClassIdTagPos == 16);
+  ASSERT(target::RawObject::kClassIdTagSize == 16);
   ASSERT(sizeof(classid_t) == sizeof(uint16_t));
   const intptr_t class_id_offset =
-      Object::tags_offset() + RawObject::kClassIdTagPos / kBitsPerByte;
+      target::Object::tags_offset() +
+      target::RawObject::kClassIdTagPos / kBitsPerByte;
 
   // Untag optimistically. Tag bit is shifted into the CARRY.
   SmiUntag(object);
@@ -2189,7 +2190,7 @@
 }
 
 Address Assembler::VMTagAddress() {
-  return Address(THR, Thread::vm_tag_offset());
+  return Address(THR, target::Thread::vm_tag_offset());
 }
 
 Address Assembler::ElementAddressForIntIndex(bool is_external,
@@ -2201,7 +2202,7 @@
     return Address(array, index * index_scale);
   } else {
     const int64_t disp = static_cast<int64_t>(index) * index_scale +
-                         Instance::DataOffsetFor(cid);
+                         target::Instance::DataOffsetFor(cid);
     ASSERT(Utils::IsInt(32, disp));
     return FieldAddress(array, static_cast<int32_t>(disp));
   }
@@ -2238,7 +2239,7 @@
     return Address(array, index, ToScaleFactor(index_scale), 0);
   } else {
     return FieldAddress(array, index, ToScaleFactor(index_scale),
-                        Instance::DataOffsetFor(cid));
+                        target::Instance::DataOffsetFor(cid));
   }
 }
 
diff --git a/runtime/vm/compiler/assembler/assembler_x64.h b/runtime/vm/compiler/assembler/assembler_x64.h
index 73cadd0..3636540 100644
--- a/runtime/vm/compiler/assembler/assembler_x64.h
+++ b/runtime/vm/compiler/assembler/assembler_x64.h
@@ -1110,12 +1110,6 @@
 }
 
 }  // namespace compiler
-
-using compiler::Address;
-using compiler::FieldAddress;
-using compiler::Immediate;
-using compiler::Label;
-
 }  // namespace dart
 
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_ASSEMBLER_X64_H_
diff --git a/runtime/vm/compiler/assembler/disassembler_kbc.cc b/runtime/vm/compiler/assembler/disassembler_kbc.cc
index 85c6f48..839c6e4 100644
--- a/runtime/vm/compiler/assembler/disassembler_kbc.cc
+++ b/runtime/vm/compiler/assembler/disassembler_kbc.cc
@@ -57,7 +57,11 @@
                    intptr_t* size,
                    const KBCInstr* instr,
                    int32_t value) {
-  FormatOperand(buf, size, "-> %" Px, instr + value);
+  if (FLAG_disassemble_relative) {
+    FormatOperand(buf, size, "-> %" Pd, value);
+  } else {
+    FormatOperand(buf, size, "-> %" Px, instr + value);
+  }
 }
 
 static void Fmtlit(char** buf,
@@ -255,6 +259,10 @@
     case KernelBytecode::kDirectCall_Wide:
     case KernelBytecode::kInterfaceCall:
     case KernelBytecode::kInterfaceCall_Wide:
+    case KernelBytecode::kInstantiatedInterfaceCall:
+    case KernelBytecode::kInstantiatedInterfaceCall_Wide:
+    case KernelBytecode::kUncheckedClosureCall:
+    case KernelBytecode::kUncheckedClosureCall_Wide:
     case KernelBytecode::kUncheckedInterfaceCall:
     case KernelBytecode::kUncheckedInterfaceCall_Wide:
     case KernelBytecode::kDynamicCall:
@@ -376,11 +384,16 @@
     const int addr_width = (kBitsPerWord / 4) + 2;
     // "*" in a printf format specifier tells it to read the field width from
     // the printf argument list.
-    THR_Print("%-*s\tpos\n", addr_width, "pc");
+    THR_Print("%-*s\tpos\tline\tcolumn\tyield\n", addr_width, "pc");
+    const Script& script = Script::Handle(zone, function.script());
     kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
     while (iter.MoveNext()) {
-      THR_Print("%#-*" Px "\t%s\n", addr_width, base + iter.PcOffset(),
-                iter.TokenPos().ToCString());
+      TokenPosition pos = iter.TokenPos();
+      intptr_t line = -1, column = -1;
+      script.GetTokenLocation(pos, &line, &column);
+      THR_Print("%#-*" Px "\t%s\t%" Pd "\t%" Pd "\t%s\n", addr_width,
+                base + iter.PcOffset(), pos.ToCString(), line, column,
+                iter.IsYieldPoint() ? "yield" : "");
     }
     THR_Print("}\n");
   }
diff --git a/runtime/vm/compiler/assembler/disassembler_test.cc b/runtime/vm/compiler/assembler/disassembler_test.cc
index 2ced70e..ff78bd2 100644
--- a/runtime/vm/compiler/assembler/disassembler_test.cc
+++ b/runtime/vm/compiler/assembler/disassembler_test.cc
@@ -14,8 +14,8 @@
 #if !defined(PRODUCT) && !defined(TARGET_ARCH_DBC)
 
 ISOLATE_UNIT_TEST_CASE(Disassembler) {
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
 
   // The used instructions work on all platforms.
   Register reg = static_cast<Register>(0);
diff --git a/runtime/vm/compiler/assembler/object_pool_builder.h b/runtime/vm/compiler/assembler/object_pool_builder.h
index 2202954..7b74b70 100644
--- a/runtime/vm/compiler/assembler/object_pool_builder.h
+++ b/runtime/vm/compiler/assembler/object_pool_builder.h
@@ -180,8 +180,4 @@
 
 }  // namespace dart
 
-namespace dart {
-using compiler::ObjectPoolBuilder;
-}
-
 #endif  // RUNTIME_VM_COMPILER_ASSEMBLER_OBJECT_POOL_BUILDER_H_
diff --git a/runtime/vm/compiler/backend/branch_optimizer.cc b/runtime/vm/compiler/backend/branch_optimizer.cc
index d6f1330..1f9e9f3 100644
--- a/runtime/vm/compiler/backend/branch_optimizer.cc
+++ b/runtime/vm/compiler/backend/branch_optimizer.cc
@@ -169,16 +169,8 @@
           new_branch->comparison()->SetDeoptId(*comparison);
           // The phi can be used in the branch's environment.  Rename such
           // uses.
-          for (Environment::DeepIterator it(new_branch->env()); !it.Done();
-               it.Advance()) {
-            Value* use = it.CurrentValue();
-            if (use->definition() == phi) {
-              Definition* replacement = phi->InputAt(i)->definition();
-              use->RemoveFromUseList();
-              use->set_definition(replacement);
-              replacement->AddEnvUse(use);
-            }
-          }
+          Definition* replacement = phi->InputAt(i)->definition();
+          new_branch->ReplaceInEnvironment(phi, replacement);
         }
 
         new_branch->InsertBefore(old_goto);
diff --git a/runtime/vm/compiler/backend/code_statistics.cc b/runtime/vm/compiler/backend/code_statistics.cc
index 04810ee..e0c2a54 100644
--- a/runtime/vm/compiler/backend/code_statistics.cc
+++ b/runtime/vm/compiler/backend/code_statistics.cc
@@ -119,7 +119,8 @@
   }
 }
 
-CodeStatistics::CodeStatistics(Assembler* assembler) : assembler_(assembler) {
+CodeStatistics::CodeStatistics(compiler::Assembler* assembler)
+    : assembler_(assembler) {
   memset(entries_, 0, CombinedCodeStatistics::kNumEntries * sizeof(Entry));
   instruction_bytes_ = 0;
   unaccounted_bytes_ = 0;
diff --git a/runtime/vm/compiler/backend/code_statistics.h b/runtime/vm/compiler/backend/code_statistics.h
index 27ab6da..cfc4cd95e 100644
--- a/runtime/vm/compiler/backend/code_statistics.h
+++ b/runtime/vm/compiler/backend/code_statistics.h
@@ -67,7 +67,7 @@
 
 class CodeStatistics {
  public:
-  explicit CodeStatistics(Assembler* assembler);
+  explicit CodeStatistics(compiler::Assembler* assembler);
 
   void Begin(Instruction* instruction);
   void End(Instruction* instruction);
@@ -82,7 +82,7 @@
  private:
   static const int kStackSize = 8;
 
-  Assembler* assembler_;
+  compiler::Assembler* assembler_;
 
   typedef struct {
     intptr_t bytes;
diff --git a/runtime/vm/compiler/backend/compile_type.h b/runtime/vm/compiler/backend/compile_type.h
index a6f4e93..eae486e 100644
--- a/runtime/vm/compiler/backend/compile_type.h
+++ b/runtime/vm/compiler/backend/compile_type.h
@@ -14,6 +14,9 @@
 class AbstractType;
 class BufferFormatter;
 class Definition;
+class FlowGraphSerializer;
+class SExpression;
+class SExpList;
 
 // CompileType describes type of a value produced by a definition.
 //
@@ -126,6 +129,9 @@
   // Create non-nullable Int type.
   static CompileType Int();
 
+  // Create non-nullable 32-bit Int type (arch dependent).
+  static CompileType Int32();
+
   // Create nullable Int type.
   static CompileType NullableInt();
 
@@ -210,6 +216,9 @@
   }
 
   void PrintTo(BufferFormatter* f) const;
+  SExpression* ToSExpression(FlowGraphSerializer* s) const;
+  void AddExtraInfoToSExpression(SExpList* sexp, FlowGraphSerializer* s) const;
+
   const char* ToCString() const;
 
   // CompileType object might be unowned or owned by a definition.
diff --git a/runtime/vm/compiler/backend/flow_graph.cc b/runtime/vm/compiler/backend/flow_graph.cc
index fa4b35e..11312bc 100644
--- a/runtime/vm/compiler/backend/flow_graph.cc
+++ b/runtime/vm/compiler/backend/flow_graph.cc
@@ -131,9 +131,13 @@
                                                        : &reverse_postorder_;
 }
 
+ConstantInstr* FlowGraph::GetExistingConstant(const Object& object) const {
+  return constant_instr_pool_.LookupValue(object);
+}
+
 ConstantInstr* FlowGraph::GetConstant(const Object& object) {
-  ConstantInstr* constant = constant_instr_pool_.LookupValue(object);
-  if (constant == NULL) {
+  ConstantInstr* constant = GetExistingConstant(object);
+  if (constant == nullptr) {
     // Otherwise, allocate and add it to the pool.
     constant =
         new (zone()) ConstantInstr(Object::ZoneHandle(zone(), object.raw()));
diff --git a/runtime/vm/compiler/backend/flow_graph.h b/runtime/vm/compiler/backend/flow_graph.h
index a606d26..c138045 100644
--- a/runtime/vm/compiler/backend/flow_graph.h
+++ b/runtime/vm/compiler/backend/flow_graph.h
@@ -240,7 +240,14 @@
 
   intptr_t InstructionCount() const;
 
+  // Returns the definition for the object from the constant pool if
+  // one exists, otherwise returns nullptr.
+  ConstantInstr* GetExistingConstant(const Object& object) const;
+
+  // Always returns a definition for the object from the constant pool,
+  // allocating one if it doesn't already exist.
   ConstantInstr* GetConstant(const Object& object);
+
   void AddToGraphInitialDefinitions(Definition* defn);
   void AddToInitialDefinitions(BlockEntryWithInitialDefs* entry,
                                Definition* defn);
diff --git a/runtime/vm/compiler/backend/flow_graph_checker.cc b/runtime/vm/compiler/backend/flow_graph_checker.cc
index 7d20887..d749aac 100644
--- a/runtime/vm/compiler/backend/flow_graph_checker.cc
+++ b/runtime/vm/compiler/backend/flow_graph_checker.cc
@@ -21,6 +21,8 @@
             "Definition count threshold for extensive instruction checks");
 
 // Returns true for the "optimized out" and "null" constant.
+// Such constants reside outside the IR in the sense that
+// succ/pred/block links are not maintained.
 static bool IsSpecialConstant(Definition* def) {
   if (auto c = def->AsConstant()) {
     return c->value().raw() == Symbols::OptimizedOut().raw() ||
@@ -226,7 +228,7 @@
   for (intptr_t i = 0, n = instruction->InputCount(); i < n; ++i) {
     VisitUseDef(instruction, instruction->InputAt(i), i, /*is_env*/ false);
   }
-  // Check all environment inputs.
+  // Check all environment inputs (including outer ones).
   intptr_t i = 0;
   for (Environment::DeepIterator it(instruction->env()); !it.Done();
        it.Advance()) {
@@ -271,7 +273,6 @@
   // Make sure each input is properly defined in the graph by something
   // that dominates the input (note that the proper dominance relation
   // on the input values of Phis is checked by the Phi visitor below).
-  bool test_def = def->HasSSATemp();
   if (def->IsPhi()) {
     ASSERT(def->GetBlock()->IsJoinEntry());
     // Phis are never linked into graph.
@@ -279,6 +280,8 @@
     ASSERT(def->previous() == nullptr);
   } else if (def->IsConstant() || def->IsParameter() ||
              def->IsSpecialParameter()) {
+    // Special constants reside outside the IR.
+    if (IsSpecialConstant(def)) return;
     // Initial definitions are partially linked into graph, but some
     // constants are fully linked into graph (so no next() assert).
     ASSERT(def->previous() != nullptr);
@@ -287,14 +290,10 @@
     ASSERT(def->next() != nullptr);
     ASSERT(def->previous() != nullptr);
   }
-  if (test_def) {
-    ASSERT(is_env ||  // TODO(dartbug.com/36899)
-           DefDominatesUse(def, instruction));
-    if (is_env) {
-      ASSERT(IsInUseList(def->env_use_list(), instruction));
-    } else {
-      ASSERT(IsInUseList(def->input_use_list(), instruction));
-    }
+  if (def->HasSSATemp()) {
+    ASSERT(DefDominatesUse(def, instruction));
+    ASSERT(IsInUseList(is_env ? def->env_use_list() : def->input_use_list(),
+                       instruction));
   }
 }
 
@@ -314,7 +313,7 @@
     ASSERT(instruction->InputAt(use->use_index()) == use);
   }
   // Make sure each use appears in the graph and is properly dominated
-  // by the defintion (note that the proper dominance relation on the
+  // by the definition (note that the proper dominance relation on the
   // input values of Phis is checked by the Phi visitor below).
   if (instruction->IsPhi()) {
     ASSERT(instruction->AsPhi()->is_alive());
@@ -330,8 +329,7 @@
     // Others are fully linked into graph.
     ASSERT(IsControlFlow(instruction) || instruction->next() != nullptr);
     ASSERT(instruction->previous() != nullptr);
-    ASSERT(is_env ||  // TODO(dartbug.com/36899)
-           DefDominatesUse(def, instruction));
+    ASSERT(!def->HasSSATemp() || DefDominatesUse(def, instruction));
   }
 }
 
@@ -351,23 +349,6 @@
   // ASSERT(constant->GetBlock() == flow_graph_->graph_entry());
 }
 
-void FlowGraphChecker::VisitInstanceCall(InstanceCallInstr* instr) {
-  const Function& function = flow_graph_->function();
-
-  // Force-optimized functions may not have instance calls inside them because
-  // we do not reset ICData for these.
-  ASSERT(!function.ForceOptimize());
-}
-
-void FlowGraphChecker::VisitPolymorphicInstanceCall(
-    PolymorphicInstanceCallInstr* instr) {
-  const Function& function = flow_graph_->function();
-
-  // Force-optimized functions may not have instance calls inside them because
-  // we do not reset ICData for these.
-  ASSERT(!function.ForceOptimize());
-}
-
 void FlowGraphChecker::VisitPhi(PhiInstr* phi) {
   // Make sure the definition of each input value of a Phi dominates
   // the corresponding incoming edge, as defined by order.
@@ -395,6 +376,19 @@
   ASSERT(def->value()->definition() != def);
 }
 
+void FlowGraphChecker::VisitInstanceCall(InstanceCallInstr* instr) {
+  // Force-optimized functions may not have instance calls inside them because
+  // we do not reset ICData for these.
+  ASSERT(!flow_graph_->function().ForceOptimize());
+}
+
+void FlowGraphChecker::VisitPolymorphicInstanceCall(
+    PolymorphicInstanceCallInstr* instr) {
+  // Force-optimized functions may not have instance calls inside them because
+  // we do not reset ICData for these.
+  ASSERT(!flow_graph_->function().ForceOptimize());
+}
+
 // Main entry point of graph checker.
 void FlowGraphChecker::Check(const char* pass_name) {
   if (FLAG_trace_compiler) {
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.cc b/runtime/vm/compiler/backend/flow_graph_compiler.cc
index ddebec9..2f3c3af 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.cc
@@ -103,7 +103,7 @@
 }
 
 FlowGraphCompiler::FlowGraphCompiler(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     FlowGraph* flow_graph,
     const ParsedFunction& parsed_function,
     bool is_optimizing,
@@ -298,7 +298,7 @@
   // This algorithm does not garbage collect blocks in place, but merely
   // records forwarding label information.  In this way it avoids having to
   // change join and target entries.
-  Label* nonempty_label = NULL;
+  compiler::Label* nonempty_label = NULL;
   for (intptr_t i = block_order().length() - 1; i >= 1; --i) {
     BlockEntryInstr* block = block_order()[i];
 
@@ -331,7 +331,7 @@
     entry = flow_graph().graph_entry()->osr_entry();
   }
   ASSERT(entry != nullptr);
-  Label* target = GetJumpLabel(entry);
+  compiler::Label* target = GetJumpLabel(entry);
 
   if (target->IsBound()) {
     return target->Position();
@@ -353,7 +353,7 @@
       src.stack_index());
 }
 
-static CatchEntryMove CatchEntryMoveFor(Assembler* assembler,
+static CatchEntryMove CatchEntryMoveFor(compiler::Assembler* assembler,
                                         Representation src_rep,
                                         const Location& src,
                                         intptr_t dst_index) {
@@ -545,7 +545,7 @@
 
 void FlowGraphCompiler::VisitBlocks() {
   CompactBlocks();
-  if (Assembler::EmittingComments()) {
+  if (compiler::Assembler::EmittingComments()) {
     // The loop_info fields were cleared, recompute.
     flow_graph().ComputeLoops();
   }
@@ -573,7 +573,7 @@
     }
 #endif
 
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       for (LoopInfo* l = entry->loop_info(); l != nullptr; l = l->outer()) {
         assembler()->Comment("  Loop %" Pd "", l->id());
       }
@@ -662,7 +662,8 @@
   return StackSize() - stack_depth - num_stack_locals;
 }
 
-Label* FlowGraphCompiler::GetJumpLabel(BlockEntryInstr* block_entry) const {
+compiler::Label* FlowGraphCompiler::GetJumpLabel(
+    BlockEntryInstr* block_entry) const {
   const intptr_t block_index = block_entry->postorder_number();
   return block_info_[block_index]->jump_label();
 }
@@ -672,7 +673,7 @@
   return block_info_[block_index]->WasCompacted();
 }
 
-Label* FlowGraphCompiler::NextNonEmptyLabel() const {
+compiler::Label* FlowGraphCompiler::NextNonEmptyLabel() const {
   const intptr_t current_index = current_block()->postorder_number();
   return block_info_[current_index]->next_nonempty_label();
 }
@@ -682,9 +683,9 @@
 }
 
 BranchLabels FlowGraphCompiler::CreateBranchLabels(BranchInstr* branch) const {
-  Label* true_label = GetJumpLabel(branch->true_successor());
-  Label* false_label = GetJumpLabel(branch->false_successor());
-  Label* fall_through = NextNonEmptyLabel();
+  compiler::Label* true_label = GetJumpLabel(branch->true_successor());
+  compiler::Label* false_label = GetJumpLabel(branch->false_successor());
+  compiler::Label* fall_through = NextNonEmptyLabel();
   BranchLabels result = {true_label, false_label, fall_through};
   return result;
 }
@@ -1009,9 +1010,9 @@
   return env;
 }
 
-Label* FlowGraphCompiler::AddDeoptStub(intptr_t deopt_id,
-                                       ICData::DeoptReasonId reason,
-                                       uint32_t flags) {
+compiler::Label* FlowGraphCompiler::AddDeoptStub(intptr_t deopt_id,
+                                                 ICData::DeoptReasonId reason,
+                                                 uint32_t flags) {
   if (intrinsic_mode()) {
     return intrinsic_slow_path_label_;
   }
@@ -1068,7 +1069,7 @@
   code.set_pc_descriptors(descriptors);
 }
 
-RawArray* FlowGraphCompiler::CreateDeoptInfo(Assembler* assembler) {
+RawArray* FlowGraphCompiler::CreateDeoptInfo(compiler::Assembler* assembler) {
   // No deopt information if we precompile (no deoptimization allowed).
   if (FLAG_precompiled_mode) {
     return Array::empty_array().raw();
@@ -1209,7 +1210,7 @@
 }
 
 bool FlowGraphCompiler::TryIntrinsifyHelper() {
-  Label exit;
+  compiler::Label exit;
   set_intrinsic_slow_path_label(&exit);
 
   if (FLAG_intrinsify) {
@@ -1420,10 +1421,11 @@
   }
 }
 
-void FlowGraphCompiler::GenerateNumberTypeCheck(Register class_id_reg,
-                                                const AbstractType& type,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_lbl) {
+void FlowGraphCompiler::GenerateNumberTypeCheck(
+    Register class_id_reg,
+    const AbstractType& type,
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   assembler()->Comment("NumberTypeCheck");
   GrowableArray<intptr_t> args;
   if (type.IsNumberType()) {
@@ -1437,9 +1439,10 @@
   CheckClassIds(class_id_reg, args, is_instance_lbl, is_not_instance_lbl);
 }
 
-void FlowGraphCompiler::GenerateStringTypeCheck(Register class_id_reg,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_lbl) {
+void FlowGraphCompiler::GenerateStringTypeCheck(
+    Register class_id_reg,
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   assembler()->Comment("StringTypeCheck");
   GrowableArray<intptr_t> args;
   args.Add(kOneByteStringCid);
@@ -1449,10 +1452,11 @@
   CheckClassIds(class_id_reg, args, is_instance_lbl, is_not_instance_lbl);
 }
 
-void FlowGraphCompiler::GenerateListTypeCheck(Register class_id_reg,
-                                              Label* is_instance_lbl) {
+void FlowGraphCompiler::GenerateListTypeCheck(
+    Register class_id_reg,
+    compiler::Label* is_instance_lbl) {
   assembler()->Comment("ListTypeCheck");
-  Label unknown;
+  compiler::Label unknown;
   GrowableArray<intptr_t> args;
   args.Add(kArrayCid);
   args.Add(kGrowableObjectArrayCid);
@@ -2065,9 +2069,9 @@
     bool complete,
     intptr_t total_ic_calls) {
   if (FLAG_polymorphic_with_deopt) {
-    Label* deopt =
+    compiler::Label* deopt =
         AddDeoptStub(deopt_id, ICData::kDeoptPolymorphicInstanceCallTestFail);
-    Label ok;
+    compiler::Label ok;
     EmitTestAndCall(targets, original_call.function_name(), args_info,
                     deopt,  // No cid match.
                     &ok,    // Found cid.
@@ -2076,7 +2080,7 @@
     assembler()->Bind(&ok);
   } else {
     if (complete) {
-      Label ok;
+      compiler::Label ok;
       EmitTestAndCall(targets, original_call.function_name(), args_info,
                       NULL,  // No cid match.
                       &ok,   // Found cid.
@@ -2097,8 +2101,8 @@
 void FlowGraphCompiler::EmitTestAndCall(const CallTargets& targets,
                                         const String& function_name,
                                         ArgumentsInfo args_info,
-                                        Label* failed,
-                                        Label* match_found,
+                                        compiler::Label* failed,
+                                        compiler::Label* match_found,
                                         intptr_t deopt_id,
                                         TokenPosition token_index,
                                         LocationSummary* locs,
@@ -2140,7 +2144,7 @@
   }
 
   if (smi_case != kNoCase) {
-    Label after_smi_test;
+    compiler::Label after_smi_test;
     // If the call is complete and there are no other possible receiver
     // classes - then receiver can only be a smi value and we don't need
     // to check if it is a smi.
@@ -2192,7 +2196,7 @@
       add_megamorphic_call = true;
       break;
     }
-    Label next_test;
+    compiler::Label next_test;
     if (!complete || !is_last_check) {
       bias = EmitTestAndCallCheckCid(assembler(),
                                      is_last_check ? failed : &next_test,
@@ -2219,7 +2223,7 @@
 
 bool FlowGraphCompiler::GenerateSubtypeRangeCheck(Register class_id_reg,
                                                   const Class& type_class,
-                                                  Label* is_subtype) {
+                                                  compiler::Label* is_subtype) {
   HierarchyInfo* hi = Thread::Current()->hierarchy_info();
   if (hi != NULL) {
     const CidRangeVector& ranges =
@@ -2241,12 +2245,13 @@
   return false;
 }
 
-void FlowGraphCompiler::GenerateCidRangesCheck(Assembler* assembler,
-                                               Register class_id_reg,
-                                               const CidRangeVector& cid_ranges,
-                                               Label* inside_range_lbl,
-                                               Label* outside_range_lbl,
-                                               bool fall_through_if_inside) {
+void FlowGraphCompiler::GenerateCidRangesCheck(
+    compiler::Assembler* assembler,
+    Register class_id_reg,
+    const CidRangeVector& cid_ranges,
+    compiler::Label* inside_range_lbl,
+    compiler::Label* outside_range_lbl,
+    bool fall_through_if_inside) {
   // If there are no valid class ranges, the check will fail.  If we are
   // supposed to fall-through in the positive case, we'll explicitly jump to
   // the [outside_range_lbl].
@@ -2263,8 +2268,9 @@
     RELEASE_ASSERT(!range.IsIllegalRange());
     const bool last_round = i == (cid_ranges.length() - 1);
 
-    Label* jump_label = last_round && fall_through_if_inside ? outside_range_lbl
-                                                             : inside_range_lbl;
+    compiler::Label* jump_label = last_round && fall_through_if_inside
+                                      ? outside_range_lbl
+                                      : inside_range_lbl;
     const bool jump_on_miss = last_round && fall_through_if_inside;
 
     bias = EmitTestAndCallCheckCid(assembler, jump_label, class_id_reg, range,
@@ -2288,7 +2294,7 @@
     const Register subtype_cache_reg,
     const Register dst_type_reg,
     const Register scratch_reg,
-    Label* done) {
+    compiler::Label* done) {
   TypeUsageInfo* type_usage_info = thread()->type_usage_info();
 
   // If the int type is assignable to [dst_type] we special case it on the
@@ -2311,10 +2317,11 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ BranchIf(EQUAL, done);
-    __ LoadField(dst_type_reg,
-                 FieldAddress(kTypeArgumentsReg,
-                              compiler::target::TypeArguments::type_at_offset(
-                                  type_param.index())));
+    __ LoadField(
+        dst_type_reg,
+        compiler::FieldAddress(kTypeArgumentsReg,
+                               compiler::target::TypeArguments::type_at_offset(
+                                   type_param.index())));
     if (type_usage_info != NULL) {
       type_usage_info->UseTypeInAssertAssignable(dst_type);
     }
@@ -2443,7 +2450,7 @@
 #define __ compiler->assembler()->
 
 void ThrowErrorSlowPathCode::EmitNativeCode(FlowGraphCompiler* compiler) {
-  if (Assembler::EmittingComments()) {
+  if (compiler::Assembler::EmittingComments()) {
     __ Comment("slow path %s operation", name());
   }
   const bool use_shared_stub =
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler.h b/runtime/vm/compiler/backend/flow_graph_compiler.h
index ca171b3..fe10a80 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler.h
+++ b/runtime/vm/compiler/backend/flow_graph_compiler.h
@@ -139,9 +139,10 @@
 
   // Helpers for non-trivial source-destination combinations that cannot
   // be handled by a single instruction.
-  void MoveMemoryToMemory(const Address& dst, const Address& src);
-  void Exchange(Register reg, const Address& mem);
-  void Exchange(const Address& mem1, const Address& mem2);
+  void MoveMemoryToMemory(const compiler::Address& dst,
+                          const compiler::Address& src);
+  void Exchange(Register reg, const compiler::Address& mem);
+  void Exchange(const compiler::Address& mem1, const compiler::Address& mem2);
   void Exchange(Register reg, Register base_reg, intptr_t stack_offset);
   void Exchange(Register base_reg1,
                 intptr_t stack_offset1,
@@ -229,7 +230,7 @@
     ASSERT(reason != ICData::kDeoptAtCall);
   }
 
-  Label* entry_label() { return &entry_label_; }
+  compiler::Label* entry_label() { return &entry_label_; }
 
   // Implementation is in architecture specific file.
   virtual void GenerateCode(FlowGraphCompiler* compiler, intptr_t stub_ix);
@@ -246,7 +247,7 @@
   }
 
  private:
-  Label entry_label_;
+  compiler::Label entry_label_;
 
   DISALLOW_COPY_AND_ASSIGN(CompilerDeoptInfoWithStub);
 };
@@ -258,8 +259,8 @@
   virtual ~SlowPathCode() {}
 
   Instruction* instruction() const { return instruction_; }
-  Label* entry_label() { return &entry_label_; }
-  Label* exit_label() { return &exit_label_; }
+  compiler::Label* entry_label() { return &entry_label_; }
+  compiler::Label* exit_label() { return &exit_label_; }
 
   void GenerateCode(FlowGraphCompiler* compiler) {
     EmitNativeCode(compiler);
@@ -270,8 +271,8 @@
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) = 0;
 
   Instruction* instruction_;
-  Label entry_label_;
-  Label exit_label_;
+  compiler::Label entry_label_;
+  compiler::Label exit_label_;
 
   DISALLOW_COPY_AND_ASSIGN(SlowPathCode);
 };
@@ -352,13 +353,17 @@
     // The label to jump to when control is transferred to this block.  For
     // nonempty blocks it is the label of the block itself.  For empty
     // blocks it is the label of the first nonempty successor block.
-    Label* jump_label() const { return jump_label_; }
-    void set_jump_label(Label* label) { jump_label_ = label; }
+    compiler::Label* jump_label() const { return jump_label_; }
+    void set_jump_label(compiler::Label* label) { jump_label_ = label; }
 
     // The label of the first nonempty block after this one in the block
     // order, or NULL if there is no nonempty block following this one.
-    Label* next_nonempty_label() const { return next_nonempty_label_; }
-    void set_next_nonempty_label(Label* label) { next_nonempty_label_ = label; }
+    compiler::Label* next_nonempty_label() const {
+      return next_nonempty_label_;
+    }
+    void set_next_nonempty_label(compiler::Label* label) {
+      next_nonempty_label_ = label;
+    }
 
     bool WasCompacted() const { return jump_label_ != &block_label_; }
 
@@ -368,16 +373,16 @@
     void mark() { is_marked_ = true; }
 
    private:
-    Label block_label_;
+    compiler::Label block_label_;
 
-    Label* jump_label_;
-    Label* next_nonempty_label_;
+    compiler::Label* jump_label_;
+    compiler::Label* next_nonempty_label_;
 
     bool is_marked_;
   };
 
  public:
-  FlowGraphCompiler(Assembler* assembler,
+  FlowGraphCompiler(compiler::Assembler* assembler,
                     FlowGraph* flow_graph,
                     const ParsedFunction& parsed_function,
                     bool is_optimizing,
@@ -402,7 +407,7 @@
   static bool IsPotentialUnboxedField(const Field& field);
 
   // Accessors.
-  Assembler* assembler() const { return assembler_; }
+  compiler::Assembler* assembler() const { return assembler_; }
   const ParsedFunction& parsed_function() const { return parsed_function_; }
   const Function& function() const { return parsed_function_.function(); }
   const GrowableArray<BlockEntryInstr*>& block_order() const {
@@ -436,11 +441,11 @@
   void ExitIntrinsicMode();
   bool intrinsic_mode() const { return intrinsic_mode_; }
 
-  void set_intrinsic_slow_path_label(Label* label) {
+  void set_intrinsic_slow_path_label(compiler::Label* label) {
     ASSERT(intrinsic_slow_path_label_ == nullptr || label == nullptr);
     intrinsic_slow_path_label_ = label;
   }
-  Label* intrinsic_slow_path_label() const {
+  compiler::Label* intrinsic_slow_path_label() const {
     ASSERT(intrinsic_slow_path_label_ != nullptr);
     return intrinsic_slow_path_label_;
   }
@@ -513,7 +518,7 @@
       const Register subtype_cache_reg,
       const Register dst_type_reg,
       const Register scratch_reg,
-      Label* done);
+      compiler::Label* done);
 
 // DBC emits calls very differently from all other architectures due to its
 // interpreted nature.
@@ -579,19 +584,20 @@
 
   void GenerateNumberTypeCheck(Register kClassIdReg,
                                const AbstractType& type,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
+                               compiler::Label* is_instance_lbl,
+                               compiler::Label* is_not_instance_lbl);
   void GenerateStringTypeCheck(Register kClassIdReg,
-                               Label* is_instance_lbl,
-                               Label* is_not_instance_lbl);
-  void GenerateListTypeCheck(Register kClassIdReg, Label* is_instance_lbl);
+                               compiler::Label* is_instance_lbl,
+                               compiler::Label* is_not_instance_lbl);
+  void GenerateListTypeCheck(Register kClassIdReg,
+                             compiler::Label* is_instance_lbl);
 
   // Returns true if no further checks are necessary but the code coming after
   // the emitted code here is still required do a runtime call (for the negative
   // case of throwing an exception).
   bool GenerateSubtypeRangeCheck(Register class_id_reg,
                                  const Class& type_class,
-                                 Label* is_subtype_lbl);
+                                 compiler::Label* is_subtype_lbl);
 
   // We test up to 4 different cid ranges, if we would need to test more in
   // order to get a definite answer we fall back to the old mechanism (namely
@@ -601,11 +607,11 @@
   // If [fall_through_if_inside] is `true`, then [outside_range_lbl] must be
   // supplied, since it will be jumped to in the last case if the cid is outside
   // the range.
-  static void GenerateCidRangesCheck(Assembler* assembler,
+  static void GenerateCidRangesCheck(compiler::Assembler* assembler,
                                      Register class_id_reg,
                                      const CidRangeVector& cid_ranges,
-                                     Label* inside_range_lbl,
-                                     Label* outside_range_lbl = NULL,
+                                     compiler::Label* inside_range_lbl,
+                                     compiler::Label* outside_range_lbl = NULL,
                                      bool fall_through_if_inside = false);
 
   void EmitOptimizedInstanceCall(
@@ -652,8 +658,8 @@
   void EmitTestAndCall(const CallTargets& targets,
                        const String& function_name,
                        ArgumentsInfo args_info,
-                       Label* failed,
-                       Label* match_found,
+                       compiler::Label* failed,
+                       compiler::Label* match_found,
                        intptr_t deopt_id,
                        TokenPosition token_index,
                        LocationSummary* locs,
@@ -706,11 +712,11 @@
   intptr_t ExtraStackSlotsOnOsrEntry() const;
 
   // Returns assembler label associated with the given block entry.
-  Label* GetJumpLabel(BlockEntryInstr* block_entry) const;
+  compiler::Label* GetJumpLabel(BlockEntryInstr* block_entry) const;
   bool WasCompacted(BlockEntryInstr* block_entry) const;
 
   // Returns the label of the fall-through of the current block.
-  Label* NextNonEmptyLabel() const;
+  compiler::Label* NextNonEmptyLabel() const;
 
   // Returns true if there is a next block after the current one in
   // the block order and if it is the given block.
@@ -743,9 +749,9 @@
   void RecordSafepoint(LocationSummary* locs,
                        intptr_t slow_path_argument_count = 0);
 
-  Label* AddDeoptStub(intptr_t deopt_id,
-                      ICData::DeoptReasonId reason,
-                      uint32_t flags = 0);
+  compiler::Label* AddDeoptStub(intptr_t deopt_id,
+                                ICData::DeoptReasonId reason,
+                                uint32_t flags = 0);
 
 #if defined(TARGET_ARCH_DBC)
   void EmitDeopt(intptr_t deopt_id,
@@ -763,7 +769,7 @@
 
   void FinalizeExceptionHandlers(const Code& code);
   void FinalizePcDescriptors(const Code& code);
-  RawArray* CreateDeoptInfo(Assembler* assembler);
+  RawArray* CreateDeoptInfo(compiler::Assembler* assembler);
   void FinalizeStackMaps(const Code& code);
   void FinalizeVarDescriptors(const Code& code);
   void FinalizeCatchEntryMovesMap(const Code& code);
@@ -853,8 +859,8 @@
   // Returns new class-id bias.
   //
   // TODO(kustermann): We should move this code out of the [FlowGraphCompiler]!
-  static int EmitTestAndCallCheckCid(Assembler* assembler,
-                                     Label* label,
+  static int EmitTestAndCallCheckCid(compiler::Assembler* assembler,
+                                     compiler::Label* label,
                                      Register class_id_reg,
                                      const CidRange& range,
                                      int bias,
@@ -920,7 +926,7 @@
   void EmitTestAndCallLoadReceiver(intptr_t count_without_type_args,
                                    const Array& arguments_descriptor);
 
-  void EmitTestAndCallSmiBranch(Label* label, bool jump_if_smi);
+  void EmitTestAndCallSmiBranch(compiler::Label* label, bool jump_if_smi);
 
   void EmitTestAndCallLoadCid(Register class_id_reg);
 
@@ -930,41 +936,44 @@
   // Type checking helper methods.
   void CheckClassIds(Register class_id_reg,
                      const GrowableArray<intptr_t>& class_ids,
-                     Label* is_instance_lbl,
-                     Label* is_not_instance_lbl);
+                     compiler::Label* is_instance_lbl,
+                     compiler::Label* is_not_instance_lbl);
 
-  RawSubtypeTestCache* GenerateInlineInstanceof(TokenPosition token_pos,
-                                                const AbstractType& type,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_lbl);
+  RawSubtypeTestCache* GenerateInlineInstanceof(
+      TokenPosition token_pos,
+      const AbstractType& type,
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_lbl);
 
   RawSubtypeTestCache* GenerateInstantiatedTypeWithArgumentsTest(
       TokenPosition token_pos,
       const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_lbl);
 
-  bool GenerateInstantiatedTypeNoArgumentsTest(TokenPosition token_pos,
-                                               const AbstractType& dst_type,
-                                               Label* is_instance_lbl,
-                                               Label* is_not_instance_lbl);
+  bool GenerateInstantiatedTypeNoArgumentsTest(
+      TokenPosition token_pos,
+      const AbstractType& dst_type,
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_lbl);
 
   RawSubtypeTestCache* GenerateUninstantiatedTypeTest(
       TokenPosition token_pos,
       const AbstractType& dst_type,
-      Label* is_instance_lbl,
-      Label* is_not_instance_label);
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_label);
 
-  RawSubtypeTestCache* GenerateFunctionTypeTest(TokenPosition token_pos,
-                                                const AbstractType& dst_type,
-                                                Label* is_instance_lbl,
-                                                Label* is_not_instance_label);
+  RawSubtypeTestCache* GenerateFunctionTypeTest(
+      TokenPosition token_pos,
+      const AbstractType& dst_type,
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_label);
 
   RawSubtypeTestCache* GenerateSubtype1TestCacheLookup(
       TokenPosition token_pos,
       const Class& type_class,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_lbl);
 
   enum TypeTestStubKind {
     kTestTypeOneArg,
@@ -979,10 +988,12 @@
       Register instantiator_type_arguments_reg,
       Register function_type_arguments_reg,
       Register temp_reg,
-      Label* is_instance_lbl,
-      Label* is_not_instance_lbl);
+      compiler::Label* is_instance_lbl,
+      compiler::Label* is_not_instance_lbl);
 
-  void GenerateBoolToJump(Register bool_reg, Label* is_true, Label* is_false);
+  void GenerateBoolToJump(Register bool_reg,
+                          compiler::Label* is_true,
+                          compiler::Label* is_false);
 
   void GenerateMethodExtractorIntrinsic(const Function& extracted_method,
                                         intptr_t type_arguments_field_offset);
@@ -1064,7 +1075,7 @@
 
   Thread* thread_;
   Zone* zone_;
-  Assembler* assembler_;
+  compiler::Assembler* assembler_;
   const ParsedFunction& parsed_function_;
   const FlowGraph& flow_graph_;
   const GrowableArray<BlockEntryInstr*>& block_order_;
@@ -1095,7 +1106,7 @@
   bool may_reoptimize_;
   // True while emitting intrinsic code.
   bool intrinsic_mode_;
-  Label* intrinsic_slow_path_label_ = nullptr;
+  compiler::Label* intrinsic_slow_path_label_ = nullptr;
   bool fully_intrinsified_ = false;
   CodeStatistics* stats_;
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
index ade4c9f..1e06558 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm.cc
@@ -187,7 +187,7 @@
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
   ASSERT(reason() != ICData::kDeoptAtCall);
-  Assembler* assembler = compiler->assembler();
+  compiler::Assembler* assembler = compiler->assembler();
 #define __ assembler->
   __ Comment("%s", Name());
   __ Bind(entry_label());
@@ -196,7 +196,8 @@
   }
 
   ASSERT(deopt_env() != NULL);
-  __ ldr(LR, Address(THR, compiler::target::Thread::deoptimize_entry_offset()));
+  __ ldr(LR, compiler::Address(
+                 THR, compiler::target::Thread::deoptimize_entry_offset()));
   __ blx(LR);
   ASSERT(kReservedCpuRegisters & (1 << LR));
   set_pc_offset(assembler->CodeSize());
@@ -207,9 +208,9 @@
 
 // Fall through if bool_register contains null.
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
-                                           Label* is_true,
-                                           Label* is_false) {
-  Label fall_through;
+                                           compiler::Label* is_true,
+                                           compiler::Label* is_false) {
+  compiler::Label fall_through;
   __ CompareObject(bool_register, Object::null_object());
   __ b(&fall_through, EQ);
   __ CompareObject(bool_register, Bool::True());
@@ -228,8 +229,8 @@
     Register instantiator_type_arguments_reg,
     Register function_type_arguments_reg,
     Register temp_reg,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   ASSERT(instance_reg == R0);
   ASSERT(temp_reg == kNoRegister);  // Unused on ARM.
   const SubtypeTestCache& type_test_cache =
@@ -268,8 +269,8 @@
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeWithArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -278,7 +279,7 @@
   const Register kInstanceReg = R0;
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
   const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
-  __ tst(kInstanceReg, Operand(kSmiTagMask));
+  __ tst(kInstanceReg, compiler::Operand(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
     __ b(is_instance_lbl, EQ);
@@ -334,8 +335,8 @@
 
 void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
                                       const GrowableArray<intptr_t>& class_ids,
-                                      Label* is_equal_lbl,
-                                      Label* is_not_equal_lbl) {
+                                      compiler::Label* is_equal_lbl,
+                                      compiler::Label* is_not_equal_lbl) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
     __ CompareImmediate(class_id_reg, class_ids[i]);
     __ b(is_equal_lbl, EQ);
@@ -351,8 +352,8 @@
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeNoArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -360,7 +361,7 @@
   ASSERT(type_class.NumTypeArguments() == 0);
 
   const Register kInstanceReg = R0;
-  __ tst(kInstanceReg, Operand(kSmiTagMask));
+  __ tst(kInstanceReg, compiler::Operand(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
   if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
@@ -417,12 +418,12 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("Subtype1TestCacheLookup");
   const Register kInstanceReg = R0;
 #if defined(DEBUG)
-  Label ok;
+  compiler::Label ok;
   __ BranchIfNotSmi(kInstanceReg, &ok);
   __ Breakpoint();
   __ Bind(&ok);
@@ -431,8 +432,10 @@
   __ LoadClassById(R1, R2);
   // R1: instance class.
   // Check immediate superclass equality.
-  __ ldr(R2, FieldAddress(R1, compiler::target::Class::super_type_offset()));
-  __ ldr(R2, FieldAddress(R2, compiler::target::Type::type_class_id_offset()));
+  __ ldr(R2, compiler::FieldAddress(
+                 R1, compiler::target::Class::super_type_offset()));
+  __ ldr(R2, compiler::FieldAddress(
+                 R2, compiler::target::Type::type_class_id_offset()));
   __ CompareImmediate(R2, Smi::RawValue(type_class.id()));
   __ b(is_instance_lbl, EQ);
 
@@ -450,8 +453,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("UninstantiatedTypeTest");
   const Register kInstanceReg = R0;
   const Register kInstantiatorTypeArgumentsReg = R2;
@@ -474,9 +477,10 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ b(is_instance_lbl, EQ);
-    __ ldr(R3, FieldAddress(kTypeArgumentsReg,
-                            compiler::target::TypeArguments::type_at_offset(
-                                type_param.index())));
+    __ ldr(R3, compiler::FieldAddress(
+                   kTypeArgumentsReg,
+                   compiler::target::TypeArguments::type_at_offset(
+                       type_param.index())));
     // R3: concrete type of type.
     // Check if type argument is dynamic, Object, or void.
     __ CompareObject(R3, Object::dynamic_type());
@@ -487,8 +491,8 @@
     __ b(is_instance_lbl, EQ);
 
     // For Smi check quickly against int and num interfaces.
-    Label not_smi;
-    __ tst(R0, Operand(kSmiTagMask));  // Value is Smi?
+    compiler::Label not_smi;
+    __ tst(R0, compiler::Operand(kSmiTagMask));  // Value is Smi?
     __ b(&not_smi, NE);
     __ CompareObject(R3, Type::ZoneHandle(zone(), Type::IntType()));
     __ b(is_instance_lbl, EQ);
@@ -536,8 +540,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const Register kInstanceReg = R0;
   const Register kInstantiatorTypeArgumentsReg = R2;
   const Register kFunctionTypeArgumentsReg = R1;
@@ -568,8 +572,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InlineInstanceof");
 
   if (type.IsFunctionType()) {
@@ -623,7 +627,7 @@
   const Register kFunctionTypeArgumentsReg = R1;
   __ PushList((1 << kInstantiatorTypeArgumentsReg) |
               (1 << kFunctionTypeArgumentsReg));
-  Label is_instance, is_not_instance;
+  compiler::Label is_instance, is_not_instance;
   // If type is instantiated and non-parameterized, we can inline code
   // checking whether the tested instance is a Smi.
   if (type.IsInstantiated()) {
@@ -644,7 +648,7 @@
       GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
-  Label done;
+  compiler::Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
     __ ldm(IA, SP,
@@ -705,7 +709,7 @@
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
   } else {
-    Label is_assignable_fast, is_assignable, runtime_call;
+    compiler::Label is_assignable_fast, is_assignable, runtime_call;
 
     // A null object is always assignable and is returned as result.
     __ CompareObject(R0, Object::null_object());
@@ -758,7 +762,7 @@
   const Register kDstTypeReg = R8;
   const Register kScratchReg = R4;
 
-  Label done;
+  compiler::Label done;
 
   GenerateAssertAssignableViaTypeTestingStub(
       dst_type, dst_name, kInstanceReg, kInstantiatorTypeArgumentsReg,
@@ -782,7 +786,7 @@
 
   __ LoadField(
       R9,
-      FieldAddress(
+      compiler::FieldAddress(
           kDstTypeReg,
           compiler::target::AbstractType::type_test_stub_entry_point_offset()));
   __ LoadWordFromPoolOffset(kSubtypeTestCacheReg, sub_type_cache_offset, PP,
@@ -835,8 +839,9 @@
   __ LoadFieldFromOffset(
       kWord, CODE_REG, kPoolReg,
       compiler::target::ObjectPool::element_offset(stub_index));
-  __ Branch(FieldAddress(CODE_REG, compiler::target::Code::entry_point_offset(
-                                       Code::EntryKind::kUnchecked)));
+  __ Branch(compiler::FieldAddress(
+      CODE_REG,
+      compiler::target::Code::entry_point_offset(Code::EntryKind::kUnchecked)));
 }
 
 void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
@@ -844,7 +849,7 @@
   // SP: receiver.
   // Sequence node has one return node, its input is load field node.
   __ Comment("Intrinsic Getter");
-  __ ldr(R0, Address(SP, 0 * compiler::target::kWordSize));
+  __ ldr(R0, compiler::Address(SP, 0 * compiler::target::kWordSize));
   __ LoadFieldFromOffset(kWord, R0, R0, offset);
   __ Ret();
 }
@@ -855,8 +860,9 @@
   // SP+0: value.
   // Sequence node has one store node and one return NULL node.
   __ Comment("Intrinsic Setter");
-  __ ldr(R0, Address(SP, 1 * compiler::target::kWordSize));  // Receiver.
-  __ ldr(R1, Address(SP, 0 * compiler::target::kWordSize));  // Value.
+  __ ldr(R0,
+         compiler::Address(SP, 1 * compiler::target::kWordSize));  // Receiver.
+  __ ldr(R1, compiler::Address(SP, 0 * compiler::target::kWordSize));  // Value.
   __ StoreIntoObjectOffset(R0, offset, R1);
   __ LoadObject(R0, Object::null_object());
   __ Ret();
@@ -868,22 +874,23 @@
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = R8;
-    __ ldr(function_reg,
-           FieldAddress(CODE_REG, compiler::target::Code::owner_offset()));
-    __ ldr(R3,
-           FieldAddress(function_reg,
-                        compiler::target::Function::usage_counter_offset()));
+    __ ldr(function_reg, compiler::FieldAddress(
+                             CODE_REG, compiler::target::Code::owner_offset()));
+    __ ldr(R3, compiler::FieldAddress(
+                   function_reg,
+                   compiler::target::Function::usage_counter_offset()));
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
-      __ add(R3, R3, Operand(1));
-      __ str(R3,
-             FieldAddress(function_reg,
-                          compiler::target::Function::usage_counter_offset()));
+      __ add(R3, R3, compiler::Operand(1));
+      __ str(R3, compiler::FieldAddress(
+                     function_reg,
+                     compiler::target::Function::usage_counter_offset()));
     }
     __ CompareImmediate(R3, GetOptimizationThreshold());
     ASSERT(function_reg == R8);
-    __ Branch(Address(THR, compiler::target::Thread::optimize_entry_offset()),
+    __ Branch(compiler::Address(
+                  THR, compiler::target::Thread::optimize_entry_offset()),
               GE);
   }
   __ Comment("Enter frame");
@@ -1036,7 +1043,7 @@
 #endif  // DEBUG
   __ LoadFieldFromOffset(kWord, R1, R0,
                          compiler::target::Array::element_offset(edge_id));
-  __ add(R1, R1, Operand(Smi::RawValue(1)));
+  __ add(R1, R1, compiler::Operand(Smi::RawValue(1)));
   __ StoreIntoObjectNoBarrierOffset(
       R0, compiler::target::Array::element_offset(edge_id), R1);
 #if defined(DEBUG)
@@ -1084,7 +1091,7 @@
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
-  __ ldr(LR, FieldAddress(CODE_REG, entry_point_offset));
+  __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blx(LR);
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
@@ -1111,7 +1118,7 @@
   __ LoadObject(R9, cache);
   __ ldr(
       LR,
-      Address(
+      compiler::Address(
           THR,
           compiler::target::Thread::megamorphic_call_checked_entry_offset()));
   __ blx(LR);
@@ -1147,7 +1154,9 @@
   ASSERT(entry_kind == Code::EntryKind::kNormal ||
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = StubCode::ICCallThroughFunction();
+  const Code& initial_stub = StubCode::UnlinkedCall();
+  const UnlinkedCall& data =
+      UnlinkedCall::ZoneHandle(zone(), ic_data.AsUnlinkedCall());
 
   __ Comment("InstanceCallAOT");
   __ LoadFromOffset(
@@ -1165,9 +1174,9 @@
                   Code::EntryKind::kMonomorphic)
             : compiler::target::Code::entry_point_offset(
                   Code::EntryKind::kMonomorphicUnchecked);
-    __ ldr(LR, FieldAddress(CODE_REG, entry_point_offset));
+    __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   }
-  __ LoadUniqueObject(R9, ic_data);
+  __ LoadUniqueObject(R9, data);
   __ blx(LR);
 
   EmitCallsiteMetadata(token_pos, DeoptId::kNone, RawPcDescriptors::kOther,
@@ -1254,7 +1263,7 @@
     __ Pop(right);
     __ Pop(left);
   } else {
-    __ cmp(left, Operand(right));
+    __ cmp(left, compiler::Operand(right));
   }
   return EQ;
 }
@@ -1282,7 +1291,7 @@
     // TODO(zerny): clobber non-live temporary FPU registers.
     if (tmp.IsRegister() &&
         !locs->live_registers()->ContainsRegister(tmp.reg())) {
-      __ mov(tmp.reg(), Operand(0xf7));
+      __ mov(tmp.reg(), compiler::Operand(0xf7));
     }
   }
 }
@@ -1303,8 +1312,9 @@
   __ LoadObject(R4, arguments_descriptor);
 }
 
-void FlowGraphCompiler::EmitTestAndCallSmiBranch(Label* label, bool if_smi) {
-  __ tst(R0, Operand(kSmiTagMask));
+void FlowGraphCompiler::EmitTestAndCallSmiBranch(compiler::Label* label,
+                                                 bool if_smi) {
+  __ tst(R0, compiler::Operand(kSmiTagMask));
   // Jump if receiver is not Smi.
   __ b(label, if_smi ? EQ : NE);
 }
@@ -1317,8 +1327,8 @@
 #undef __
 #define __ assembler->
 
-int FlowGraphCompiler::EmitTestAndCallCheckCid(Assembler* assembler,
-                                               Label* label,
+int FlowGraphCompiler::EmitTestAndCallCheckCid(compiler::Assembler* assembler,
+                                               compiler::Label* label,
                                                Register class_id_reg,
                                                const CidRange& range,
                                                int bias,
@@ -1347,7 +1357,7 @@
 
   if (source.IsRegister()) {
     if (destination.IsRegister()) {
-      __ mov(destination.reg(), Operand(source.reg()));
+      __ mov(destination.reg(), compiler::Operand(source.reg()));
     } else {
       ASSERT(destination.IsStackSlot());
       const intptr_t dest_offset = destination.ToStackSlotOffset();
@@ -1451,9 +1461,9 @@
   if (source.IsRegister() && destination.IsRegister()) {
     ASSERT(source.reg() != IP);
     ASSERT(destination.reg() != IP);
-    __ mov(IP, Operand(source.reg()));
-    __ mov(source.reg(), Operand(destination.reg()));
-    __ mov(destination.reg(), Operand(IP));
+    __ mov(IP, compiler::Operand(source.reg()));
+    __ mov(source.reg(), compiler::Operand(destination.reg()));
+    __ mov(destination.reg(), compiler::Operand(IP));
   } else if (source.IsRegister() && destination.IsStackSlot()) {
     Exchange(source.reg(), destination.base_reg(),
              destination.ToStackSlotOffset());
@@ -1543,20 +1553,22 @@
   }
 }
 
-void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
-                                              const Address& src) {
+void ParallelMoveResolver::MoveMemoryToMemory(const compiler::Address& dst,
+                                              const compiler::Address& src) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
-void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+void ParallelMoveResolver::Exchange(Register reg,
+                                    const compiler::Address& mem) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses offsets from the frame pointer instead of Addresses.
-void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+void ParallelMoveResolver::Exchange(const compiler::Address& mem1,
+                                    const compiler::Address& mem2) {
   UNREACHABLE();
 }
 
@@ -1564,7 +1576,7 @@
                                     Register base_reg,
                                     intptr_t stack_offset) {
   ScratchRegisterScope tmp(this, reg);
-  __ mov(tmp.reg(), Operand(reg));
+  __ mov(tmp.reg(), compiler::Operand(reg));
   __ LoadFromOffset(kWord, reg, base_reg, stack_offset);
   __ StoreToOffset(kWord, tmp.reg(), base_reg, stack_offset);
 }
@@ -1591,12 +1603,14 @@
 
 void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
   DRegister dreg = EvenDRegisterOf(reg);
-  __ vstrd(dreg, Address(SP, -kDoubleSize, Address::PreIndex));
+  __ vstrd(dreg,
+           compiler::Address(SP, -kDoubleSize, compiler::Address::PreIndex));
 }
 
 void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
   DRegister dreg = EvenDRegisterOf(reg);
-  __ vldrd(dreg, Address(SP, kDoubleSize, Address::PostIndex));
+  __ vldrd(dreg,
+           compiler::Address(SP, kDoubleSize, compiler::Address::PostIndex));
 }
 
 #undef __
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
index 6da971a..116c2a1 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_arm64.cc
@@ -181,7 +181,7 @@
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
   ASSERT(reason() != ICData::kDeoptAtCall);
-  Assembler* assembler = compiler->assembler();
+  compiler::Assembler* assembler = compiler->assembler();
 #define __ assembler->
   __ Comment("%s", Name());
   __ Bind(entry_label());
@@ -190,7 +190,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-  __ ldr(LR, Address(THR, Thread::deoptimize_entry_offset()));
+  __ ldr(LR, compiler::Address(THR, Thread::deoptimize_entry_offset()));
   __ blr(LR);
   set_pc_offset(assembler->CodeSize());
 #undef __
@@ -200,9 +200,9 @@
 
 // Fall through if bool_register contains null.
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
-                                           Label* is_true,
-                                           Label* is_false) {
-  Label fall_through;
+                                           compiler::Label* is_true,
+                                           compiler::Label* is_false) {
+  compiler::Label fall_through;
   __ CompareObject(bool_register, Object::null_object());
   __ b(&fall_through, EQ);
   __ CompareObject(bool_register, Bool::True());
@@ -220,8 +220,8 @@
     Register instantiator_type_arguments_reg,
     Register function_type_arguments_reg,
     Register temp_reg,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   ASSERT(instance_reg == R0);
   ASSERT(temp_reg == kNoRegister);  // Unused on ARM64.
   const SubtypeTestCache& type_test_cache =
@@ -260,8 +260,8 @@
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeWithArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -321,8 +321,8 @@
 
 void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
                                       const GrowableArray<intptr_t>& class_ids,
-                                      Label* is_equal_lbl,
-                                      Label* is_not_equal_lbl) {
+                                      compiler::Label* is_equal_lbl,
+                                      compiler::Label* is_not_equal_lbl) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
     __ CompareImmediate(class_id_reg, class_ids[i]);
     __ b(is_equal_lbl, EQ);
@@ -338,8 +338,8 @@
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeNoArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -403,12 +403,12 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("Subtype1TestCacheLookup");
   const Register kInstanceReg = R0;
 #if defined(DEBUG)
-  Label ok;
+  compiler::Label ok;
   __ BranchIfNotSmi(kInstanceReg, &ok);
   __ Breakpoint();
   __ Bind(&ok);
@@ -436,8 +436,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("UninstantiatedTypeTest");
   const Register kInstanceReg = R0;
   const Register kInstantiatorTypeArgumentsReg = R1;
@@ -451,7 +451,8 @@
     const AbstractType& bound = AbstractType::Handle(type_param.bound());
 
     // Get instantiator type args (high, R1) and function type args (low, R2).
-    __ ldp(R2, R1, Address(SP, 0 * kWordSize, Address::PairOffset));
+    __ ldp(R2, R1,
+           compiler::Address(SP, 0 * kWordSize, compiler::Address::PairOffset));
     const Register kTypeArgumentsReg = type_param.IsClassTypeParameter()
                                            ? kInstantiatorTypeArgumentsReg
                                            : kFunctionTypeArgumentsReg;
@@ -470,7 +471,7 @@
     __ b(is_instance_lbl, EQ);
 
     // For Smi check quickly against int and num interfaces.
-    Label not_smi;
+    compiler::Label not_smi;
     __ BranchIfNotSmi(R0, &not_smi);
     __ CompareObject(R3, Type::ZoneHandle(zone(), Type::IntType()));
     __ b(is_instance_lbl, EQ);
@@ -500,7 +501,7 @@
       __ BranchIfSmi(kInstanceReg, is_not_instance_lbl);
     }
     __ ldp(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg,
-           Address(SP, 0 * kWordSize, Address::PairOffset));
+           compiler::Address(SP, 0 * kWordSize, compiler::Address::PairOffset));
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator.
     return GenerateCallSubtypeTestStub(kTestTypeFourArgs, kInstanceReg,
@@ -517,14 +518,14 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const Register kInstanceReg = R0;
   const Register kInstantiatorTypeArgumentsReg = R1;
   const Register kFunctionTypeArgumentsReg = R2;
   __ BranchIfSmi(kInstanceReg, is_not_instance_lbl);
   __ ldp(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg,
-         Address(SP, 0 * kWordSize, Address::PairOffset));
+         compiler::Address(SP, 0 * kWordSize, compiler::Address::PairOffset));
   // Uninstantiated type class is known at compile time, but the type
   // arguments are determined at runtime by the instantiator(s).
   const Register kTempReg = kNoRegister;
@@ -548,8 +549,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InlineInstanceof");
 
   if (type.IsFunctionType()) {
@@ -602,7 +603,7 @@
   const Register kInstantiatorTypeArgumentsReg = R1;
   const Register kFunctionTypeArgumentsReg = R2;
   __ PushPair(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg);
-  Label is_instance, is_not_instance;
+  compiler::Label is_instance, is_not_instance;
   // If type is instantiated and non-parameterized, we can inline code
   // checking whether the tested instance is a Smi.
   if (type.IsInstantiated()) {
@@ -623,13 +624,13 @@
       GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
-  Label done;
+  compiler::Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
     const Register kInstantiatorTypeArgumentsReg = R1;
     const Register kFunctionTypeArgumentsReg = R2;
     __ ldp(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg,
-           Address(SP, 0 * kWordSize, Address::PairOffset));
+           compiler::Address(SP, 0 * kWordSize, compiler::Address::PairOffset));
     __ PushObject(Object::null_object());  // Make room for the result.
     __ Push(R0);                           // Push the instance.
     __ PushObject(type);                   // Push the type.
@@ -684,7 +685,7 @@
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
   } else {
-    Label is_assignable_fast, is_assignable, runtime_call;
+    compiler::Label is_assignable_fast, is_assignable, runtime_call;
 
     // A null object is always assignable and is returned as result.
     __ CompareObject(R0, Object::null_object());
@@ -699,7 +700,7 @@
 
     __ Bind(&runtime_call);
     __ ldp(kFunctionTypeArgumentsReg, kInstantiatorTypeArgumentsReg,
-           Address(SP, 0 * kWordSize, Address::PairOffset));
+           compiler::Address(SP, 0 * kWordSize, compiler::Address::PairOffset));
     __ PushObject(Object::null_object());  // Make room for the result.
     __ Push(R0);                           // Push the source object.
     __ PushObject(dst_type);               // Push the type of the destination.
@@ -733,7 +734,7 @@
   const Register kDstTypeReg = R8;
   const Register kScratchReg = R4;
 
-  Label done;
+  compiler::Label done;
 
   GenerateAssertAssignableViaTypeTestingStub(
       dst_type, dst_name, kInstanceReg, kInstantiatorTypeArgumentsReg,
@@ -755,9 +756,9 @@
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
   ASSERT(__ constant_pool_allowed());
 
-  __ LoadField(R9,
-               FieldAddress(kDstTypeReg,
-                            AbstractType::type_test_stub_entry_point_offset()));
+  __ LoadField(
+      R9, compiler::FieldAddress(
+              kDstTypeReg, AbstractType::type_test_stub_entry_point_offset()));
   __ LoadWordFromPoolOffset(kSubtypeTestCacheReg, sub_type_cache_offset);
   __ blr(R9);
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
@@ -841,22 +842,23 @@
       (!is_optimizing() || may_reoptimize())) {
     __ Comment("Invocation Count Check");
     const Register function_reg = R6;
-    __ ldr(function_reg, FieldAddress(CODE_REG, Code::owner_offset()));
+    __ ldr(function_reg,
+           compiler::FieldAddress(CODE_REG, Code::owner_offset()));
 
     __ LoadFieldFromOffset(R7, function_reg, Function::usage_counter_offset(),
                            kWord);
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
-      __ add(R7, R7, Operand(1));
+      __ add(R7, R7, compiler::Operand(1));
       __ StoreFieldToOffset(R7, function_reg, Function::usage_counter_offset(),
                             kWord);
     }
     __ CompareImmediate(R7, GetOptimizationThreshold());
     ASSERT(function_reg == R6);
-    Label dont_optimize;
+    compiler::Label dont_optimize;
     __ b(&dont_optimize, LT);
-    __ ldr(TMP, Address(THR, Thread::optimize_entry_offset()));
+    __ ldr(TMP, compiler::Address(THR, Thread::optimize_entry_offset()));
     __ br(TMP);
     __ Bind(&dont_optimize);
   }
@@ -1006,7 +1008,7 @@
   __ Comment("Edge counter");
   __ LoadObject(R0, edge_counters_array_);
   __ LoadFieldFromOffset(TMP, R0, Array::element_offset(edge_id));
-  __ add(TMP, TMP, Operand(Smi::RawValue(1)));
+  __ add(TMP, TMP, compiler::Operand(Smi::RawValue(1)));
   __ StoreFieldToOffset(TMP, R0, Array::element_offset(edge_id));
 }
 
@@ -1043,7 +1045,7 @@
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
 
-  ObjectPoolBuilder& op = __ object_pool_builder();
+  compiler::ObjectPoolBuilder& op = __ object_pool_builder();
   const intptr_t ic_data_index =
       op.AddObject(ic_data, ObjectPool::Patchability::kPatchable);
   const intptr_t stub_index =
@@ -1055,7 +1057,7 @@
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
-  __ ldr(LR, FieldAddress(CODE_REG, entry_point_offset));
+  __ ldr(LR, compiler::FieldAddress(CODE_REG, entry_point_offset));
   __ blr(LR);
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
@@ -1080,7 +1082,8 @@
   __ LoadFromOffset(R0, SP, (args_desc.Count() - 1) * kWordSize);
 
   __ LoadObject(R5, cache);
-  __ ldr(LR, Address(THR, Thread::megamorphic_call_checked_entry_offset()));
+  __ ldr(LR, compiler::Address(
+                 THR, Thread::megamorphic_call_checked_entry_offset()));
   __ blr(LR);
 
   RecordSafepoint(locs, slow_path_argument_count);
@@ -1113,29 +1116,32 @@
                                             Code::EntryKind entry_kind) {
   // TODO(34162): Support multiple entry-points on ARM64.
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = StubCode::ICCallThroughFunction();
+  const Code& initial_stub = StubCode::UnlinkedCall();
+  const UnlinkedCall& data =
+      UnlinkedCall::ZoneHandle(zone(), ic_data.AsUnlinkedCall());
 
-  ObjectPoolBuilder& op = __ object_pool_builder();
+  compiler::ObjectPoolBuilder& op = __ object_pool_builder();
 
   __ Comment("InstanceCallAOT");
   __ LoadFromOffset(R0, SP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize);
 
-  const intptr_t ic_data_index =
-      op.AddObject(ic_data, ObjectPool::Patchability::kPatchable);
+  const intptr_t data_index =
+      op.AddObject(data, ObjectPool::Patchability::kPatchable);
   const intptr_t initial_stub_index =
       op.AddObject(initial_stub, ObjectPool::Patchability::kPatchable);
-  ASSERT((ic_data_index + 1) == initial_stub_index);
+  ASSERT((data_index + 1) == initial_stub_index);
 
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
     __ LoadDoubleWordFromPoolOffset(R5, LR,
-                                    ObjectPool::element_offset(ic_data_index));
+                                    ObjectPool::element_offset(data_index));
   } else {
     __ LoadDoubleWordFromPoolOffset(R5, CODE_REG,
-                                    ObjectPool::element_offset(ic_data_index));
-    __ ldr(LR, FieldAddress(CODE_REG, Code::entry_point_offset(
-                                          Code::EntryKind::kMonomorphic)));
+                                    ObjectPool::element_offset(data_index));
+    __ ldr(LR, compiler::FieldAddress(
+                   CODE_REG,
+                   Code::entry_point_offset(Code::EntryKind::kMonomorphic)));
   }
   __ blr(LR);
 
@@ -1252,7 +1258,7 @@
     // TODO(zerny): clobber non-live temporary FPU registers.
     if (tmp.IsRegister() &&
         !locs->live_registers()->ContainsRegister(tmp.reg())) {
-      __ movz(tmp.reg(), Immediate(0xf7), 0);
+      __ movz(tmp.reg(), compiler::Immediate(0xf7), 0);
     }
   }
 }
@@ -1271,7 +1277,8 @@
   __ LoadObject(R4, arguments_descriptor);
 }
 
-void FlowGraphCompiler::EmitTestAndCallSmiBranch(Label* label, bool if_smi) {
+void FlowGraphCompiler::EmitTestAndCallSmiBranch(compiler::Label* label,
+                                                 bool if_smi) {
   if (if_smi) {
     __ BranchIfSmi(R0, label);
   } else {
@@ -1287,8 +1294,8 @@
 #undef __
 #define __ assembler->
 
-int FlowGraphCompiler::EmitTestAndCallCheckCid(Assembler* assembler,
-                                               Label* label,
+int FlowGraphCompiler::EmitTestAndCallCheckCid(compiler::Assembler* assembler,
+                                               compiler::Label* label,
                                                Register class_id_reg,
                                                const CidRange& range,
                                                int bias,
@@ -1484,20 +1491,22 @@
   }
 }
 
-void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
-                                              const Address& src) {
+void ParallelMoveResolver::MoveMemoryToMemory(const compiler::Address& dst,
+                                              const compiler::Address& src) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
-void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+void ParallelMoveResolver::Exchange(Register reg,
+                                    const compiler::Address& mem) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses offsets from the frame pointer instead of Addresses.
-void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+void ParallelMoveResolver::Exchange(const compiler::Address& mem1,
+                                    const compiler::Address& mem2) {
   UNREACHABLE();
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
index e3729c7..fe42375 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_dbc.cc
@@ -428,20 +428,22 @@
   }
 }
 
-void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
-                                              const Address& src) {
+void ParallelMoveResolver::MoveMemoryToMemory(const compiler::Address& dst,
+                                              const compiler::Address& src) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses an offset from the frame pointer instead of an Address.
-void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+void ParallelMoveResolver::Exchange(Register reg,
+                                    const compiler::Address& mem) {
   UNREACHABLE();
 }
 
 // Do not call or implement this function. Instead, use the form below that
 // uses offsets from the frame pointer instead of Addresses.
-void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+void ParallelMoveResolver::Exchange(const compiler::Address& mem1,
+                                    const compiler::Address& mem2) {
   UNREACHABLE();
 }
 
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
index 120c19d..006b750 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_ia32.cc
@@ -158,7 +158,7 @@
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
   ASSERT(reason() != ICData::kDeoptAtCall);
-  Assembler* assembler = compiler->assembler();
+  compiler::Assembler* assembler = compiler->assembler();
 #define __ assembler->
   __ Comment("%s", Name());
   __ Bind(entry_label());
@@ -178,13 +178,13 @@
 
 // Fall through if bool_register contains null.
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
-                                           Label* is_true,
-                                           Label* is_false) {
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label fall_through;
+                                           compiler::Label* is_true,
+                                           compiler::Label* is_false) {
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  compiler::Label fall_through;
   __ cmpl(bool_register, raw_null);
-  __ j(EQUAL, &fall_through, Assembler::kNearJump);
+  __ j(EQUAL, &fall_through, compiler::Assembler::kNearJump);
   __ CompareObject(bool_register, Bool::True());
   __ j(EQUAL, is_true);
   __ jmp(is_false);
@@ -198,12 +198,12 @@
     Register instantiator_type_arguments_reg,
     Register function_type_arguments_reg,
     Register temp_reg,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(zone(), SubtypeTestCache::New());
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ LoadObject(temp_reg, type_test_cache);
   __ pushl(temp_reg);      // Subtype test cache.
   __ pushl(instance_reg);  // Instance.
@@ -249,8 +249,8 @@
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeWithArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -259,7 +259,7 @@
   const Register kInstanceReg = EAX;
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
   const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
-  __ testl(kInstanceReg, Immediate(kSmiTagMask));
+  __ testl(kInstanceReg, compiler::Immediate(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
     __ j(ZERO, is_instance_lbl);
@@ -277,7 +277,7 @@
     const Register kClassIdReg = ECX;
     // dynamic type argument, check only classes.
     __ LoadClassId(kClassIdReg, kInstanceReg);
-    __ cmpl(kClassIdReg, Immediate(type_class.id()));
+    __ cmpl(kClassIdReg, compiler::Immediate(type_class.id()));
     __ j(EQUAL, is_instance_lbl);
     // List is a very common case.
     if (IsListClass(type_class)) {
@@ -312,10 +312,10 @@
 
 void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
                                       const GrowableArray<intptr_t>& class_ids,
-                                      Label* is_equal_lbl,
-                                      Label* is_not_equal_lbl) {
+                                      compiler::Label* is_equal_lbl,
+                                      compiler::Label* is_not_equal_lbl) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
-    __ cmpl(class_id_reg, Immediate(class_ids[i]));
+    __ cmpl(class_id_reg, compiler::Immediate(class_ids[i]));
     __ j(EQUAL, is_equal_lbl);
   }
   __ jmp(is_not_equal_lbl);
@@ -329,8 +329,8 @@
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeNoArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -338,7 +338,7 @@
   ASSERT(type_class.NumTypeArguments() == 0);
 
   const Register kInstanceReg = EAX;
-  __ testl(kInstanceReg, Immediate(kSmiTagMask));
+  __ testl(kInstanceReg, compiler::Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
   if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
@@ -352,7 +352,7 @@
   __ LoadClassId(kClassIdReg, kInstanceReg);
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
-    __ cmpl(kClassIdReg, Immediate(kBoolCid));
+    __ cmpl(kClassIdReg, compiler::Immediate(kBoolCid));
     __ j(EQUAL, is_instance_lbl);
     __ jmp(is_not_instance_lbl);
     return false;
@@ -370,7 +370,7 @@
   }
   if (type.IsDartFunctionType()) {
     // Check if instance is a closure.
-    __ cmpl(kClassIdReg, Immediate(kClosureCid));
+    __ cmpl(kClassIdReg, compiler::Immediate(kClosureCid));
     __ j(EQUAL, is_instance_lbl);
     return true;  // Fall through
   }
@@ -395,12 +395,12 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("Subtype1TestCacheLookup");
   const Register kInstanceReg = EAX;
 #if defined(DEBUG)
-  Label ok;
+  compiler::Label ok;
   __ BranchIfNotSmi(kInstanceReg, &ok);
   __ Breakpoint();
   __ Bind(&ok);
@@ -409,9 +409,9 @@
   __ LoadClassById(ECX, EDI);
   // ECX: instance class.
   // Check immediate superclass equality.
-  __ movl(EDI, FieldAddress(ECX, Class::super_type_offset()));
-  __ movl(EDI, FieldAddress(EDI, Type::type_class_id_offset()));
-  __ cmpl(EDI, Immediate(Smi::RawValue(type_class.id())));
+  __ movl(EDI, compiler::FieldAddress(ECX, Class::super_type_offset()));
+  __ movl(EDI, compiler::FieldAddress(EDI, Type::type_class_id_offset()));
+  __ cmpl(EDI, compiler::Immediate(Smi::RawValue(type_class.id())));
   __ j(EQUAL, is_instance_lbl);
 
   const Register kInstantiatorTypeArgumentsReg = kNoRegister;
@@ -429,8 +429,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("UninstantiatedTypeTest");
   const Register kInstanceReg = EAX;
   const Register kInstantiatorTypeArgumentsReg = EDX;
@@ -439,14 +439,16 @@
   ASSERT(!type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
   // Skip check if destination is a dynamic type.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
   if (type.IsTypeParameter()) {
     const TypeParameter& type_param = TypeParameter::Cast(type);
     const AbstractType& bound = AbstractType::Handle(type_param.bound());
 
-    __ movl(EDX, Address(ESP, 1 * kWordSize));  // Get instantiator type args.
-    __ movl(ECX, Address(ESP, 0 * kWordSize));  // Get function type args.
+    __ movl(EDX, compiler::Address(
+                     ESP, 1 * kWordSize));  // Get instantiator type args.
+    __ movl(ECX,
+            compiler::Address(ESP, 0 * kWordSize));  // Get function type args.
     // EDX: instantiator type arguments.
     // ECX: function type arguments.
     const Register kTypeArgumentsReg =
@@ -454,8 +456,9 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ cmpl(kTypeArgumentsReg, raw_null);
     __ j(EQUAL, is_instance_lbl);
-    __ movl(EDI, FieldAddress(kTypeArgumentsReg, TypeArguments::type_at_offset(
-                                                     type_param.index())));
+    __ movl(EDI, compiler::FieldAddress(
+                     kTypeArgumentsReg,
+                     TypeArguments::type_at_offset(type_param.index())));
     // EDI: concrete type of type.
     // Check if type argument is dynamic, Object, or void.
     __ CompareObject(EDI, Object::dynamic_type());
@@ -466,9 +469,9 @@
     __ j(EQUAL, is_instance_lbl);
 
     // For Smi check quickly against int and num interfaces.
-    Label not_smi;
-    __ testl(EAX, Immediate(kSmiTagMask));  // Value is Smi?
-    __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
+    compiler::Label not_smi;
+    __ testl(EAX, compiler::Immediate(kSmiTagMask));  // Value is Smi?
+    __ j(NOT_ZERO, &not_smi, compiler::Assembler::kNearJump);
     __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::IntType()));
     __ j(EQUAL, is_instance_lbl);
     __ CompareObject(EDI, Type::ZoneHandle(zone(), Type::Number()));
@@ -493,11 +496,13 @@
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
     if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
-      __ testl(kInstanceReg, Immediate(kSmiTagMask));  // Is instance Smi?
+      __ testl(kInstanceReg,
+               compiler::Immediate(kSmiTagMask));  // Is instance Smi?
       __ j(ZERO, is_not_instance_lbl);
     }
-    __ movl(kInstantiatorTypeArgumentsReg, Address(ESP, 1 * kWordSize));
-    __ movl(kFunctionTypeArgumentsReg, Address(ESP, 0 * kWordSize));
+    __ movl(kInstantiatorTypeArgumentsReg,
+            compiler::Address(ESP, 1 * kWordSize));
+    __ movl(kFunctionTypeArgumentsReg, compiler::Address(ESP, 0 * kWordSize));
     // Uninstantiated type class is known at compile time, but the type
     // arguments are determined at runtime by the instantiator(s).
     return GenerateCallSubtypeTestStub(kTestTypeFourArgs, kInstanceReg,
@@ -514,14 +519,14 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const Register kInstanceReg = EAX;
   const Register kInstantiatorTypeArgumentsReg = EDX;
   const Register kFunctionTypeArgumentsReg = ECX;
   __ Comment("FunctionTypeTest");
 
-  __ testl(kInstanceReg, Immediate(kSmiTagMask));
+  __ testl(kInstanceReg, compiler::Immediate(kSmiTagMask));
   __ j(ZERO, is_not_instance_lbl);
   // Uninstantiated type class is known at compile time, but the type
   // arguments are determined at runtime by the instantiator(s).
@@ -546,8 +551,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InlineInstanceof");
 
   if (type.IsFunctionType()) {
@@ -601,9 +606,9 @@
   __ pushl(EDX);  // Store instantiator type arguments.
   __ pushl(ECX);  // Store function type arguments.
 
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label is_instance, is_not_instance;
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  compiler::Label is_instance, is_not_instance;
   // If type is instantiated and non-parameterized, we can inline code
   // checking whether the tested instance is a Smi.
   if (type.IsInstantiated()) {
@@ -624,11 +629,13 @@
       GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
-  Label done;
+  compiler::Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
-    __ movl(EDX, Address(ESP, 1 * kWordSize));  // Get instantiator type args.
-    __ movl(ECX, Address(ESP, 0 * kWordSize));  // Get function type args.
+    __ movl(EDX, compiler::Address(
+                     ESP, 1 * kWordSize));  // Get instantiator type args.
+    __ movl(ECX,
+            compiler::Address(ESP, 0 * kWordSize));  // Get function type args.
     __ PushObject(Object::null_object());       // Make room for the result.
     __ pushl(EAX);                              // Push the instance.
     __ PushObject(type);                        // Push the type.
@@ -641,11 +648,11 @@
     // instanceof runtime call will be left as the result of the operation.
     __ Drop(5);
     __ popl(EAX);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&done, compiler::Assembler::kNearJump);
   }
   __ Bind(&is_not_instance);
   __ LoadObject(EAX, Bool::Get(false));
-  __ jmp(&done, Assembler::kNearJump);
+  __ jmp(&done, compiler::Assembler::kNearJump);
 
   __ Bind(&is_instance);
   __ LoadObject(EAX, Bool::Get(true));
@@ -680,9 +687,9 @@
   __ pushl(EDX);  // Store instantiator type arguments.
   __ pushl(ECX);  // Store function type arguments.
   // A null object is always assignable and is returned as result.
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  Label is_assignable, runtime_call;
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  compiler::Label is_assignable, runtime_call;
   __ cmpl(EAX, raw_null);
   __ j(EQUAL, &is_assignable);
 
@@ -692,8 +699,10 @@
                                         &runtime_call);
 
   __ Bind(&runtime_call);
-  __ movl(EDX, Address(ESP, 1 * kWordSize));  // Get instantiator type args.
-  __ movl(ECX, Address(ESP, 0 * kWordSize));  // Get function type args.
+  __ movl(EDX, compiler::Address(
+                   ESP, 1 * kWordSize));  // Get instantiator type args.
+  __ movl(ECX,
+          compiler::Address(ESP, 0 * kWordSize));  // Get function type args.
   __ PushObject(Object::null_object());       // Make room for the result.
   __ pushl(EAX);                              // Push the source object.
   __ PushObject(dst_type);  // Push the type of the destination.
@@ -737,8 +746,8 @@
   // +1 : receiver.
   // Sequence node has one return node, its input is load field node.
   __ Comment("Intrinsic Getter");
-  __ movl(EAX, Address(ESP, 1 * kWordSize));
-  __ movl(EAX, FieldAddress(EAX, offset));
+  __ movl(EAX, compiler::Address(ESP, 1 * kWordSize));
+  __ movl(EAX, compiler::FieldAddress(EAX, offset));
   __ ret();
 }
 
@@ -748,11 +757,11 @@
   // +2 : receiver.
   // Sequence node has one store node and one return NULL node.
   __ Comment("Intrinsic Setter");
-  __ movl(EAX, Address(ESP, 2 * kWordSize));  // Receiver.
-  __ movl(EBX, Address(ESP, 1 * kWordSize));  // Value.
-  __ StoreIntoObject(EAX, FieldAddress(EAX, offset), EBX);
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ movl(EAX, compiler::Address(ESP, 2 * kWordSize));  // Receiver.
+  __ movl(EBX, compiler::Address(ESP, 1 * kWordSize));  // Value.
+  __ StoreIntoObject(EAX, compiler::FieldAddress(EAX, offset), EBX);
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ movl(EAX, raw_null);
   __ ret();
 }
@@ -770,14 +779,16 @@
     // Reoptimization of an optimized function is triggered by counting in
     // IC stubs, but not at the entry of the function.
     if (!is_optimizing()) {
-      __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+      __ incl(compiler::FieldAddress(function_reg,
+                                     Function::usage_counter_offset()));
     }
-    __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
-            Immediate(GetOptimizationThreshold()));
+    __ cmpl(
+        compiler::FieldAddress(function_reg, Function::usage_counter_offset()),
+        compiler::Immediate(GetOptimizationThreshold()));
     ASSERT(function_reg == EBX);
-    Label dont_optimize;
-    __ j(LESS, &dont_optimize, Assembler::kNearJump);
-    __ jmp(Address(THR, Thread::optimize_entry_offset()));
+    compiler::Label dont_optimize;
+    __ j(LESS, &dont_optimize, compiler::Assembler::kNearJump);
+    __ jmp(compiler::Address(THR, Thread::optimize_entry_offset()));
     __ Bind(&dont_optimize);
   }
   __ Comment("Enter frame");
@@ -806,15 +817,15 @@
 
     __ Comment("Initialize spill slots");
     if (num_locals > 1 || (num_locals == 1 && args_desc_slot == -1)) {
-      const Immediate& raw_null =
-          Immediate(reinterpret_cast<intptr_t>(Object::null()));
+      const compiler::Immediate& raw_null =
+          compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
       __ movl(EAX, raw_null);
     }
     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 : EAX;
-      __ movl(Address(EBP, slot_index * kWordSize), value_reg);
+      __ movl(compiler::Address(EBP, slot_index * kWordSize), value_reg);
     }
   }
 
@@ -897,7 +908,8 @@
   ASSERT(!edge_counters_array_.IsNull());
   __ Comment("Edge counter");
   __ LoadObject(EAX, edge_counters_array_);
-  __ IncrementSmiField(FieldAddress(EAX, Array::element_offset(edge_id)), 1);
+  __ IncrementSmiField(
+      compiler::FieldAddress(EAX, Array::element_offset(edge_id)), 1);
 }
 
 void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
@@ -916,7 +928,8 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(EAX, parsed_function().function());
   // Load receiver into EBX.
-  __ movl(EBX, Address(ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+  __ movl(EBX, compiler::Address(
+                   ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   __ LoadObject(ECX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
@@ -932,14 +945,15 @@
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(Array::Handle(ic_data.arguments_descriptor()).Length() > 0);
   // Load receiver into EBX.
-  __ movl(EBX, Address(ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+  __ movl(EBX, compiler::Address(
+                   ESP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   __ LoadObject(ECX, ic_data, true);
   __ LoadObject(CODE_REG, stub, true);
   const intptr_t entry_point_offset =
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
-  __ call(FieldAddress(CODE_REG, entry_point_offset));
+  __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs());
 }
@@ -960,9 +974,10 @@
 
   __ Comment("MegamorphicCall");
   // Load receiver into EBX.
-  __ movl(EBX, Address(ESP, (args_desc.Count() - 1) * kWordSize));
+  __ movl(EBX, compiler::Address(ESP, (args_desc.Count() - 1) * kWordSize));
   __ LoadObject(ECX, cache);
-  __ call(Address(THR, Thread::megamorphic_call_checked_entry_offset()));
+  __ call(
+      compiler::Address(THR, Thread::megamorphic_call_checked_entry_offset()));
 
   AddCurrentDescriptor(RawPcDescriptors::kOther, DeoptId::kNone, token_pos);
   RecordSafepoint(locs, slow_path_argument_count);
@@ -1076,14 +1091,14 @@
   // TODO(vegorov): consider saving only caller save (volatile) registers.
   const intptr_t xmm_regs_count = locs->live_registers()->FpuRegisterCount();
   if (xmm_regs_count > 0) {
-    __ subl(ESP, Immediate(xmm_regs_count * kFpuRegisterSize));
+    __ subl(ESP, compiler::Immediate(xmm_regs_count * kFpuRegisterSize));
     // Store XMM registers with the lowest register number at the lowest
     // address.
     intptr_t offset = 0;
     for (intptr_t i = 0; i < kNumberOfXmmRegisters; ++i) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(i);
       if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(Address(ESP, offset), xmm_reg);
+        __ movups(compiler::Address(ESP, offset), xmm_reg);
         offset += kFpuRegisterSize;
       }
     }
@@ -1115,12 +1130,12 @@
     for (intptr_t i = 0; i < kNumberOfXmmRegisters; ++i) {
       XmmRegister xmm_reg = static_cast<XmmRegister>(i);
       if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(xmm_reg, Address(ESP, offset));
+        __ movups(xmm_reg, compiler::Address(ESP, offset));
         offset += kFpuRegisterSize;
       }
     }
     ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
-    __ addl(ESP, Immediate(offset));
+    __ addl(ESP, compiler::Immediate(offset));
   }
 }
 
@@ -1132,7 +1147,7 @@
     // TODO(zerny): clobber non-live temporary FPU registers.
     if (tmp.IsRegister() &&
         !locs->live_registers()->ContainsRegister(tmp.reg())) {
-      __ movl(tmp.reg(), Immediate(0xf7));
+      __ movl(tmp.reg(), compiler::Immediate(0xf7));
     }
   }
 }
@@ -1147,12 +1162,14 @@
     const Array& arguments_descriptor) {
   __ Comment("EmitTestAndCall");
   // Load receiver into EAX.
-  __ movl(EAX, Address(ESP, (count_without_type_args - 1) * kWordSize));
+  __ movl(EAX,
+          compiler::Address(ESP, (count_without_type_args - 1) * kWordSize));
   __ LoadObject(EDX, arguments_descriptor);
 }
 
-void FlowGraphCompiler::EmitTestAndCallSmiBranch(Label* label, bool if_smi) {
-  __ testl(EAX, Immediate(kSmiTagMask));
+void FlowGraphCompiler::EmitTestAndCallSmiBranch(compiler::Label* label,
+                                                 bool if_smi) {
+  __ testl(EAX, compiler::Immediate(kSmiTagMask));
   // Jump if receiver is (not) Smi.
   __ j(if_smi ? ZERO : NOT_ZERO, label);
 }
@@ -1165,20 +1182,20 @@
 #undef __
 #define __ assembler->
 
-int FlowGraphCompiler::EmitTestAndCallCheckCid(Assembler* assembler,
-                                               Label* label,
+int FlowGraphCompiler::EmitTestAndCallCheckCid(compiler::Assembler* assembler,
+                                               compiler::Label* label,
                                                Register class_id_reg,
                                                const CidRange& range,
                                                int bias,
                                                bool jump_on_miss) {
   intptr_t cid_start = range.cid_start;
   if (range.IsSingleCid()) {
-    __ cmpl(class_id_reg, Immediate(cid_start - bias));
+    __ cmpl(class_id_reg, compiler::Immediate(cid_start - bias));
     __ j(jump_on_miss ? NOT_EQUAL : EQUAL, label);
   } else {
-    __ addl(class_id_reg, Immediate(bias - cid_start));
+    __ addl(class_id_reg, compiler::Immediate(bias - cid_start));
     bias = cid_start;
-    __ cmpl(class_id_reg, Immediate(range.Extent()));
+    __ cmpl(class_id_reg, compiler::Immediate(range.Extent()));
     __ j(jump_on_miss ? ABOVE : BELOW_EQUAL, label);  // Unsigned higher.
   }
   return bias;
@@ -1287,9 +1304,9 @@
         destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
     XmmRegister reg =
         source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
-    const Address& slot_address = source.IsFpuRegister()
-                                      ? LocationToStackSlotAddress(destination)
-                                      : LocationToStackSlotAddress(source);
+    const compiler::Address& slot_address =
+        source.IsFpuRegister() ? LocationToStackSlotAddress(destination)
+                               : LocationToStackSlotAddress(source);
 
     if (double_width) {
       __ movsd(FpuTMP, slot_address);
@@ -1300,8 +1317,9 @@
     }
     __ movaps(reg, FpuTMP);
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
-    const Address& source_slot_address = LocationToStackSlotAddress(source);
-    const Address& destination_slot_address =
+    const compiler::Address& source_slot_address =
+        LocationToStackSlotAddress(source);
+    const compiler::Address& destination_slot_address =
         LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
@@ -1310,8 +1328,9 @@
     __ movsd(destination_slot_address, FpuTMP);
     __ movsd(source_slot_address, ensure_scratch.reg());
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
-    const Address& source_slot_address = LocationToStackSlotAddress(source);
-    const Address& destination_slot_address =
+    const compiler::Address& source_slot_address =
+        LocationToStackSlotAddress(source);
+    const compiler::Address& destination_slot_address =
         LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
@@ -1340,20 +1359,22 @@
   }
 }
 
-void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
-                                              const Address& src) {
+void ParallelMoveResolver::MoveMemoryToMemory(const compiler::Address& dst,
+                                              const compiler::Address& src) {
   ScratchRegisterScope ensure_scratch(this, kNoRegister);
   __ MoveMemoryToMemory(dst, src, ensure_scratch.reg());
 }
 
-void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+void ParallelMoveResolver::Exchange(Register reg,
+                                    const compiler::Address& mem) {
   ScratchRegisterScope ensure_scratch(this, reg);
   __ movl(ensure_scratch.reg(), mem);
   __ movl(mem, reg);
   __ movl(reg, ensure_scratch.reg());
 }
 
-void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+void ParallelMoveResolver::Exchange(const compiler::Address& mem1,
+                                    const compiler::Address& mem2) {
   ScratchRegisterScope ensure_scratch1(this, kNoRegister);
   ScratchRegisterScope ensure_scratch2(this, ensure_scratch1.reg());
   __ movl(ensure_scratch1.reg(), mem1);
@@ -1384,13 +1405,13 @@
 }
 
 void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
-  __ subl(ESP, Immediate(kFpuRegisterSize));
-  __ movups(Address(ESP, 0), reg);
+  __ subl(ESP, compiler::Immediate(kFpuRegisterSize));
+  __ movups(compiler::Address(ESP, 0), reg);
 }
 
 void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
-  __ movups(reg, Address(ESP, 0));
-  __ addl(ESP, Immediate(kFpuRegisterSize));
+  __ movups(reg, compiler::Address(ESP, 0));
+  __ addl(ESP, compiler::Immediate(kFpuRegisterSize));
 }
 
 #undef __
diff --git a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
index 406524b..23ae178 100644
--- a/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
+++ b/runtime/vm/compiler/backend/flow_graph_compiler_x64.cc
@@ -181,7 +181,7 @@
                                              intptr_t stub_ix) {
   // Calls do not need stubs, they share a deoptimization trampoline.
   ASSERT(reason() != ICData::kDeoptAtCall);
-  Assembler* assembler = compiler->assembler();
+  compiler::Assembler* assembler = compiler->assembler();
 #define __ assembler->
   __ Comment("%s", Name());
   __ Bind(entry_label());
@@ -190,7 +190,7 @@
   }
 
   ASSERT(deopt_env() != NULL);
-  __ call(Address(THR, Thread::deoptimize_entry_offset()));
+  __ call(compiler::Address(THR, Thread::deoptimize_entry_offset()));
   set_pc_offset(assembler->CodeSize());
   __ int3();
 #undef __
@@ -200,11 +200,11 @@
 
 // Fall through if bool_register contains null.
 void FlowGraphCompiler::GenerateBoolToJump(Register bool_register,
-                                           Label* is_true,
-                                           Label* is_false) {
-  Label fall_through;
+                                           compiler::Label* is_true,
+                                           compiler::Label* is_false) {
+  compiler::Label fall_through;
   __ CompareObject(bool_register, Object::null_object());
-  __ j(EQUAL, &fall_through, Assembler::kNearJump);
+  __ j(EQUAL, &fall_through, compiler::Assembler::kNearJump);
   __ CompareObject(bool_register, Bool::True());
   __ j(EQUAL, is_true);
   __ jmp(is_false);
@@ -226,8 +226,8 @@
     Register instantiator_type_arguments_reg,
     Register function_type_arguments_reg,
     Register temp_reg,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   ASSERT(temp_reg == kNoRegister);
   const SubtypeTestCache& type_test_cache =
       SubtypeTestCache::ZoneHandle(zone(), SubtypeTestCache::New());
@@ -265,8 +265,8 @@
 FlowGraphCompiler::GenerateInstantiatedTypeWithArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeWithArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -275,7 +275,7 @@
   const Register kInstanceReg = RAX;
   const Type& smi_type = Type::Handle(zone(), Type::SmiType());
   const bool smi_is_ok = smi_type.IsSubtypeOf(type, Heap::kOld);
-  __ testq(kInstanceReg, Immediate(kSmiTagMask));
+  __ testq(kInstanceReg, compiler::Immediate(kSmiTagMask));
   if (smi_is_ok) {
     // Fast case for type = FutureOr<int/num/top-type>.
     __ j(ZERO, is_instance_lbl);
@@ -294,7 +294,7 @@
     const Register kClassIdReg = R10;
     // dynamic type argument, check only classes.
     __ LoadClassId(kClassIdReg, kInstanceReg);
-    __ cmpl(kClassIdReg, Immediate(type_class.id()));
+    __ cmpl(kClassIdReg, compiler::Immediate(type_class.id()));
     __ j(EQUAL, is_instance_lbl);
     // List is a very common case.
     if (IsListClass(type_class)) {
@@ -331,10 +331,10 @@
 
 void FlowGraphCompiler::CheckClassIds(Register class_id_reg,
                                       const GrowableArray<intptr_t>& class_ids,
-                                      Label* is_equal_lbl,
-                                      Label* is_not_equal_lbl) {
+                                      compiler::Label* is_equal_lbl,
+                                      compiler::Label* is_not_equal_lbl) {
   for (intptr_t i = 0; i < class_ids.length(); i++) {
-    __ cmpl(class_id_reg, Immediate(class_ids[i]));
+    __ cmpl(class_id_reg, compiler::Immediate(class_ids[i]));
     __ j(EQUAL, is_equal_lbl);
   }
   __ jmp(is_not_equal_lbl);
@@ -352,8 +352,8 @@
 bool FlowGraphCompiler::GenerateInstantiatedTypeNoArgumentsTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InstantiatedTypeNoArgumentsTest");
   ASSERT(type.IsInstantiated());
   ASSERT(!type.IsFunctionType());
@@ -361,7 +361,7 @@
   ASSERT(type_class.NumTypeArguments() == 0);
 
   const Register kInstanceReg = RAX;
-  __ testq(kInstanceReg, Immediate(kSmiTagMask));
+  __ testq(kInstanceReg, compiler::Immediate(kSmiTagMask));
   // If instance is Smi, check directly.
   const Class& smi_class = Class::Handle(zone(), Smi::Class());
   if (Class::IsSubtypeOf(smi_class, Object::null_type_arguments(), type_class,
@@ -375,7 +375,7 @@
   __ LoadClassId(kClassIdReg, kInstanceReg);
   // Bool interface can be implemented only by core class Bool.
   if (type.IsBoolType()) {
-    __ cmpl(kClassIdReg, Immediate(kBoolCid));
+    __ cmpl(kClassIdReg, compiler::Immediate(kBoolCid));
     __ j(EQUAL, is_instance_lbl);
     __ jmp(is_not_instance_lbl);
     return false;
@@ -393,7 +393,7 @@
   }
   if (type.IsDartFunctionType()) {
     // Check if instance is a closure.
-    __ cmpq(kClassIdReg, Immediate(kClosureCid));
+    __ cmpq(kClassIdReg, compiler::Immediate(kClosureCid));
     __ j(EQUAL, is_instance_lbl);
     return true;
   }
@@ -422,12 +422,12 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateSubtype1TestCacheLookup(
     TokenPosition token_pos,
     const Class& type_class,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("Subtype1TestCacheLookup");
   const Register kInstanceReg = RAX;
 #if defined(DEBUG)
-  Label ok;
+  compiler::Label ok;
   __ BranchIfNotSmi(kInstanceReg, &ok);
   __ Breakpoint();
   __ Bind(&ok);
@@ -436,9 +436,9 @@
   __ LoadClassById(R10, TMP);
   // R10: instance class.
   // Check immediate superclass equality.
-  __ movq(R13, FieldAddress(R10, Class::super_type_offset()));
-  __ movq(R13, FieldAddress(R13, Type::type_class_id_offset()));
-  __ CompareImmediate(R13, Immediate(Smi::RawValue(type_class.id())));
+  __ movq(R13, compiler::FieldAddress(R10, Class::super_type_offset()));
+  __ movq(R13, compiler::FieldAddress(R13, Type::type_class_id_offset()));
+  __ CompareImmediate(R13, compiler::Immediate(Smi::RawValue(type_class.id())));
   __ j(EQUAL, is_instance_lbl);
 
   const Register kInstantiatorTypeArgumentsReg = kNoRegister;
@@ -461,8 +461,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateUninstantiatedTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const Register kInstanceReg = RAX;
   const Register kInstantiatorTypeArgumentsReg = RDX;
   const Register kFunctionTypeArgumentsReg = RCX;
@@ -482,8 +482,9 @@
     // Check if type arguments are null, i.e. equivalent to vector of dynamic.
     __ CompareObject(kTypeArgumentsReg, Object::null_object());
     __ j(EQUAL, is_instance_lbl);
-    __ movq(RDI, FieldAddress(kTypeArgumentsReg, TypeArguments::type_at_offset(
-                                                     type_param.index())));
+    __ movq(RDI, compiler::FieldAddress(
+                     kTypeArgumentsReg,
+                     TypeArguments::type_at_offset(type_param.index())));
     // RDI: Concrete type of type.
     // Check if type argument is dynamic, Object, or void.
     __ CompareObject(RDI, Object::dynamic_type());
@@ -495,9 +496,9 @@
     __ j(EQUAL, is_instance_lbl);
 
     // For Smi check quickly against int and num interfaces.
-    Label not_smi;
-    __ testq(RAX, Immediate(kSmiTagMask));  // Value is Smi?
-    __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
+    compiler::Label not_smi;
+    __ testq(RAX, compiler::Immediate(kSmiTagMask));  // Value is Smi?
+    __ j(NOT_ZERO, &not_smi, compiler::Assembler::kNearJump);
     __ CompareObject(RDI, Type::ZoneHandle(zone(), Type::IntType()));
     __ j(EQUAL, is_instance_lbl);
     __ CompareObject(RDI, Type::ZoneHandle(zone(), Type::Number()));
@@ -523,7 +524,8 @@
   if (type.IsType()) {
     // Smi is FutureOr<T>, when T is a top type or int or num.
     if (!Class::Handle(type.type_class()).IsFutureOrClass()) {
-      __ testq(kInstanceReg, Immediate(kSmiTagMask));  // Is instance Smi?
+      __ testq(kInstanceReg,
+               compiler::Immediate(kSmiTagMask));  // Is instance Smi?
       __ j(ZERO, is_not_instance_lbl);
     }
     // Uninstantiated type class is known at compile time, but the type
@@ -542,15 +544,15 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateFunctionTypeTest(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   const Register kInstanceReg = RAX;
   const Register kInstantiatorTypeArgumentsReg = RDX;
   const Register kFunctionTypeArgumentsReg = RCX;
   const Register kTempReg = kNoRegister;
   __ Comment("FunctionTypeTest");
 
-  __ testq(kInstanceReg, Immediate(kSmiTagMask));
+  __ testq(kInstanceReg, compiler::Immediate(kSmiTagMask));
   __ j(ZERO, is_not_instance_lbl);
   return GenerateCallSubtypeTestStub(kTestTypeSixArgs, kInstanceReg,
                                      kInstantiatorTypeArgumentsReg,
@@ -571,8 +573,8 @@
 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof(
     TokenPosition token_pos,
     const AbstractType& type,
-    Label* is_instance_lbl,
-    Label* is_not_instance_lbl) {
+    compiler::Label* is_instance_lbl,
+    compiler::Label* is_not_instance_lbl) {
   __ Comment("InlineInstanceof");
 
   if (type.IsFunctionType()) {
@@ -623,7 +625,7 @@
   ASSERT(type.IsFinalized());
   ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType());
 
-  Label is_instance, is_not_instance;
+  compiler::Label is_instance, is_not_instance;
   // If type is instantiated and non-parameterized, we can inline code
   // checking whether the tested instance is a Smi.
   if (type.IsInstantiated()) {
@@ -645,7 +647,7 @@
       GenerateInlineInstanceof(token_pos, type, &is_instance, &is_not_instance);
 
   // test_cache is null if there is no fall-through.
-  Label done;
+  compiler::Label done;
   if (!test_cache.IsNull()) {
     // Generate runtime call.
     __ PushObject(Object::null_object());  // Make room for the result.
@@ -660,11 +662,11 @@
     // instanceof runtime call will be left as the result of the operation.
     __ Drop(5);
     __ popq(RAX);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&done, compiler::Assembler::kNearJump);
   }
   __ Bind(&is_not_instance);
   __ LoadObject(RAX, Bool::Get(false));
-  __ jmp(&done, Assembler::kNearJump);
+  __ jmp(&done, compiler::Assembler::kNearJump);
 
   __ Bind(&is_instance);
   __ LoadObject(RAX, Bool::Get(true));
@@ -702,7 +704,7 @@
     GenerateAssertAssignableViaTypeTestingStub(token_pos, deopt_id, dst_type,
                                                dst_name, locs);
   } else {
-    Label is_assignable, runtime_call;
+    compiler::Label is_assignable, runtime_call;
 
     // A null object is always assignable and is returned as result.
     __ CompareObject(RAX, Object::null_object());
@@ -743,7 +745,7 @@
   const Register kInstantiatorTypeArgumentsReg = RDX;
   const Register kFunctionTypeArgumentsReg = RCX;
 
-  Label done;
+  compiler::Label done;
 
   const Register subtype_cache_reg = R9;
   const Register kScratchReg = RBX;
@@ -768,8 +770,9 @@
   ASSERT((sub_type_cache_index + 1) == dst_name_index);
   ASSERT(__ constant_pool_allowed());
 
-  __ movq(subtype_cache_reg, Address(PP, sub_type_cache_offset));
-  __ call(FieldAddress(RBX, AbstractType::type_test_stub_entry_point_offset()));
+  __ movq(subtype_cache_reg, compiler::Address(PP, sub_type_cache_offset));
+  __ call(compiler::FieldAddress(
+      RBX, AbstractType::type_test_stub_entry_point_offset()));
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
   __ Bind(&done);
 }
@@ -816,15 +819,16 @@
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     kPoolReg = PP;
   } else {
-    __ movq(kPoolReg, FieldAddress(CODE_REG, Code::object_pool_offset()));
+    __ movq(kPoolReg,
+            compiler::FieldAddress(CODE_REG, Code::object_pool_offset()));
   }
-  __ movq(RDX, Immediate(type_arguments_field_offset));
-  __ movq(RBX,
-          FieldAddress(kPoolReg, ObjectPool::element_offset(function_index)));
-  __ movq(CODE_REG,
-          FieldAddress(kPoolReg, ObjectPool::element_offset(stub_index)));
-  __ jmp(FieldAddress(CODE_REG,
-                      Code::entry_point_offset(Code::EntryKind::kUnchecked)));
+  __ movq(RDX, compiler::Immediate(type_arguments_field_offset));
+  __ movq(RBX, compiler::FieldAddress(
+                   kPoolReg, ObjectPool::element_offset(function_index)));
+  __ movq(CODE_REG, compiler::FieldAddress(
+                        kPoolReg, ObjectPool::element_offset(stub_index)));
+  __ jmp(compiler::FieldAddress(
+      CODE_REG, Code::entry_point_offset(Code::EntryKind::kUnchecked)));
 }
 
 void FlowGraphCompiler::GenerateGetterIntrinsic(intptr_t offset) {
@@ -832,8 +836,8 @@
   // +1 : receiver.
   // Sequence node has one return node, its input is load field node.
   __ Comment("Intrinsic Getter");
-  __ movq(RAX, Address(RSP, 1 * kWordSize));
-  __ movq(RAX, FieldAddress(RAX, offset));
+  __ movq(RAX, compiler::Address(RSP, 1 * kWordSize));
+  __ movq(RAX, compiler::FieldAddress(RAX, offset));
   __ ret();
 }
 
@@ -843,9 +847,9 @@
   // +2 : receiver.
   // Sequence node has one store node and one return NULL node.
   __ Comment("Intrinsic Setter");
-  __ movq(RAX, Address(RSP, 2 * kWordSize));  // Receiver.
-  __ movq(RBX, Address(RSP, 1 * kWordSize));  // Value.
-  __ StoreIntoObject(RAX, FieldAddress(RAX, offset), RBX);
+  __ movq(RAX, compiler::Address(RSP, 2 * kWordSize));  // Receiver.
+  __ movq(RBX, compiler::Address(RSP, 1 * kWordSize));  // Value.
+  __ StoreIntoObject(RAX, compiler::FieldAddress(RAX, offset), RBX);
   __ LoadObject(RAX, Object::null_object());
   __ ret();
 }
@@ -863,19 +867,22 @@
         (!is_optimizing() || may_reoptimize())) {
       __ Comment("Invocation Count Check");
       const Register function_reg = RDI;
-      __ movq(function_reg, FieldAddress(CODE_REG, Code::owner_offset()));
+      __ movq(function_reg,
+              compiler::FieldAddress(CODE_REG, Code::owner_offset()));
 
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
       if (!is_optimizing()) {
-        __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+        __ incl(compiler::FieldAddress(function_reg,
+                                       Function::usage_counter_offset()));
       }
-      __ cmpl(FieldAddress(function_reg, Function::usage_counter_offset()),
-              Immediate(GetOptimizationThreshold()));
+      __ cmpl(compiler::FieldAddress(function_reg,
+                                     Function::usage_counter_offset()),
+              compiler::Immediate(GetOptimizationThreshold()));
       ASSERT(function_reg == RDI);
-      Label dont_optimize;
-      __ j(LESS, &dont_optimize, Assembler::kNearJump);
-      __ jmp(Address(THR, Thread::optimize_entry_offset()));
+      compiler::Label dont_optimize;
+      __ j(LESS, &dont_optimize, compiler::Assembler::kNearJump);
+      __ jmp(compiler::Address(THR, Thread::optimize_entry_offset()));
       __ Bind(&dont_optimize);
     }
     ASSERT(StackSize() >= 0);
@@ -908,7 +915,7 @@
       const intptr_t slot_index =
           compiler::target::frame_layout.FrameSlotForVariableIndex(-i);
       Register value_reg = slot_index == args_desc_slot ? ARGS_DESC_REG : RAX;
-      __ movq(Address(RBP, slot_index * kWordSize), value_reg);
+      __ movq(compiler::Address(RBP, slot_index * kWordSize), value_reg);
     }
   }
 
@@ -1026,7 +1033,8 @@
   ASSERT(assembler_->constant_pool_allowed());
   __ Comment("Edge counter");
   __ LoadObject(RAX, edge_counters_array_);
-  __ IncrementSmiField(FieldAddress(RAX, Array::element_offset(edge_id)), 1);
+  __ IncrementSmiField(
+      compiler::FieldAddress(RAX, Array::element_offset(edge_id)), 1);
 }
 
 void FlowGraphCompiler::EmitOptimizedInstanceCall(const Code& stub,
@@ -1044,7 +1052,8 @@
   // Pass the function explicitly, it is used in IC stub.
   __ LoadObject(RDI, parsed_function().function());
   // Load receiver into RDX.
-  __ movq(RDX, Address(RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+  __ movq(RDX, compiler::Address(
+                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(RBX, ic_data);
   GenerateDartCall(deopt_id, token_pos, stub, RawPcDescriptors::kIcCall, locs,
                    entry_kind);
@@ -1061,14 +1070,15 @@
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(Array::Handle(zone(), ic_data.arguments_descriptor()).Length() > 0);
   // Load receiver into RDX.
-  __ movq(RDX, Address(RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+  __ movq(RDX, compiler::Address(
+                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   __ LoadUniqueObject(RBX, ic_data);
   __ LoadUniqueObject(CODE_REG, stub);
   const intptr_t entry_point_offset =
       entry_kind == Code::EntryKind::kNormal
           ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
           : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
-  __ call(FieldAddress(CODE_REG, entry_point_offset));
+  __ call(compiler::FieldAddress(CODE_REG, entry_point_offset));
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kIcCall, locs);
   __ Drop(ic_data.CountWithTypeArgs(), RCX);
 }
@@ -1088,9 +1098,10 @@
       MegamorphicCacheTable::Lookup(isolate(), name, arguments_descriptor));
   __ Comment("MegamorphicCall");
   // Load receiver into RDX.
-  __ movq(RDX, Address(RSP, (args_desc.Count() - 1) * kWordSize));
+  __ movq(RDX, compiler::Address(RSP, (args_desc.Count() - 1) * kWordSize));
   __ LoadObject(RBX, cache);
-  __ call(Address(THR, Thread::megamorphic_call_checked_entry_offset()));
+  __ call(
+      compiler::Address(THR, Thread::megamorphic_call_checked_entry_offset()));
 
   RecordSafepoint(locs, slow_path_argument_count);
   const intptr_t deopt_id_after = DeoptId::ToDeoptAfter(deopt_id);
@@ -1123,10 +1134,13 @@
   ASSERT(entry_kind == Code::EntryKind::kNormal ||
          entry_kind == Code::EntryKind::kUnchecked);
   ASSERT(ic_data.NumArgsTested() == 1);
-  const Code& initial_stub = StubCode::ICCallThroughFunction();
+  const Code& initial_stub = StubCode::UnlinkedCall();
+  const UnlinkedCall& data =
+      UnlinkedCall::ZoneHandle(zone(), ic_data.AsUnlinkedCall());
 
   __ Comment("InstanceCallAOT");
-  __ movq(RDX, Address(RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
+  __ movq(RDX, compiler::Address(
+                   RSP, (ic_data.CountWithoutTypeArgs() - 1) * kWordSize));
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
     // The AOT runtime will replace the slot in the object pool with the
     // entrypoint address - see clustered_snapshot.cc.
@@ -1137,9 +1151,9 @@
             ? Code::entry_point_offset(Code::EntryKind::kMonomorphic)
             : Code::entry_point_offset(Code::EntryKind::kMonomorphicUnchecked);
     __ LoadUniqueObject(CODE_REG, initial_stub);
-    __ movq(RCX, FieldAddress(CODE_REG, entry_point_offset));
+    __ movq(RCX, compiler::FieldAddress(CODE_REG, entry_point_offset));
   }
-  __ LoadUniqueObject(RBX, ic_data);
+  __ LoadUniqueObject(RBX, data);
   __ call(RCX);
 
   EmitCallsiteMetadata(token_pos, deopt_id, RawPcDescriptors::kOther, locs);
@@ -1250,7 +1264,7 @@
     // TODO(zerny): clobber non-live temporary FPU registers.
     if (tmp.IsRegister() &&
         !locs->live_registers()->ContainsRegister(tmp.reg())) {
-      __ movq(tmp.reg(), Immediate(0xf7));
+      __ movq(tmp.reg(), compiler::Immediate(0xf7));
     }
   }
 }
@@ -1265,12 +1279,14 @@
     const Array& arguments_descriptor) {
   __ Comment("EmitTestAndCall");
   // Load receiver into RAX.
-  __ movq(RAX, Address(RSP, (count_without_type_args - 1) * kWordSize));
+  __ movq(RAX,
+          compiler::Address(RSP, (count_without_type_args - 1) * kWordSize));
   __ LoadObject(R10, arguments_descriptor);
 }
 
-void FlowGraphCompiler::EmitTestAndCallSmiBranch(Label* label, bool if_smi) {
-  __ testq(RAX, Immediate(kSmiTagMask));
+void FlowGraphCompiler::EmitTestAndCallSmiBranch(compiler::Label* label,
+                                                 bool if_smi) {
+  __ testq(RAX, compiler::Immediate(kSmiTagMask));
   // Jump if receiver is (not) Smi.
   __ j(if_smi ? ZERO : NOT_ZERO, label);
 }
@@ -1283,8 +1299,8 @@
 #undef __
 #define __ assembler->
 
-int FlowGraphCompiler::EmitTestAndCallCheckCid(Assembler* assembler,
-                                               Label* label,
+int FlowGraphCompiler::EmitTestAndCallCheckCid(compiler::Assembler* assembler,
+                                               compiler::Label* label,
                                                Register class_id_reg,
                                                const CidRange& range,
                                                int bias,
@@ -1294,12 +1310,12 @@
   // 32-bit (since the subtraction instruction is as well).
   intptr_t cid_start = range.cid_start;
   if (range.IsSingleCid()) {
-    __ cmpl(class_id_reg, Immediate(cid_start - bias));
+    __ cmpl(class_id_reg, compiler::Immediate(cid_start - bias));
     __ BranchIf(jump_on_miss ? NOT_EQUAL : EQUAL, label);
   } else {
-    __ addl(class_id_reg, Immediate(bias - cid_start));
+    __ addl(class_id_reg, compiler::Immediate(bias - cid_start));
     bias = cid_start;
-    __ cmpl(class_id_reg, Immediate(range.Extent()));
+    __ cmpl(class_id_reg, compiler::Immediate(range.Extent()));
     __ BranchIf(jump_on_miss ? UNSIGNED_GREATER : UNSIGNED_LESS_EQUAL, label);
   }
   return bias;
@@ -1403,8 +1419,8 @@
         destination.IsDoubleStackSlot() || source.IsDoubleStackSlot();
     XmmRegister reg =
         source.IsFpuRegister() ? source.fpu_reg() : destination.fpu_reg();
-    Address slot_address = source.IsFpuRegister()
-                               ? LocationToStackSlotAddress(destination)
+    compiler::Address slot_address =
+        source.IsFpuRegister() ? LocationToStackSlotAddress(destination)
                                : LocationToStackSlotAddress(source);
 
     if (double_width) {
@@ -1416,8 +1432,9 @@
     }
     __ movaps(reg, FpuTMP);
   } else if (source.IsDoubleStackSlot() && destination.IsDoubleStackSlot()) {
-    const Address& source_slot_address = LocationToStackSlotAddress(source);
-    const Address& destination_slot_address =
+    const compiler::Address& source_slot_address =
+        LocationToStackSlotAddress(source);
+    const compiler::Address& destination_slot_address =
         LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
@@ -1426,8 +1443,9 @@
     __ movsd(destination_slot_address, FpuTMP);
     __ movsd(source_slot_address, ensure_scratch.reg());
   } else if (source.IsQuadStackSlot() && destination.IsQuadStackSlot()) {
-    const Address& source_slot_address = LocationToStackSlotAddress(source);
-    const Address& destination_slot_address =
+    const compiler::Address& source_slot_address =
+        LocationToStackSlotAddress(source);
+    const compiler::Address& destination_slot_address =
         LocationToStackSlotAddress(destination);
 
     ScratchFpuRegisterScope ensure_scratch(this, FpuTMP);
@@ -1456,16 +1474,18 @@
   }
 }
 
-void ParallelMoveResolver::MoveMemoryToMemory(const Address& dst,
-                                              const Address& src) {
+void ParallelMoveResolver::MoveMemoryToMemory(const compiler::Address& dst,
+                                              const compiler::Address& src) {
   __ MoveMemoryToMemory(dst, src);
 }
 
-void ParallelMoveResolver::Exchange(Register reg, const Address& mem) {
+void ParallelMoveResolver::Exchange(Register reg,
+                                    const compiler::Address& mem) {
   __ Exchange(reg, mem);
 }
 
-void ParallelMoveResolver::Exchange(const Address& mem1, const Address& mem2) {
+void ParallelMoveResolver::Exchange(const compiler::Address& mem1,
+                                    const compiler::Address& mem2) {
   __ Exchange(mem1, mem2);
 }
 
@@ -1491,13 +1511,13 @@
 }
 
 void ParallelMoveResolver::SpillFpuScratch(FpuRegister reg) {
-  __ AddImmediate(RSP, Immediate(-kFpuRegisterSize));
-  __ movups(Address(RSP, 0), reg);
+  __ AddImmediate(RSP, compiler::Immediate(-kFpuRegisterSize));
+  __ movups(compiler::Address(RSP, 0), reg);
 }
 
 void ParallelMoveResolver::RestoreFpuScratch(FpuRegister reg) {
-  __ movups(reg, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(kFpuRegisterSize));
+  __ movups(reg, compiler::Address(RSP, 0));
+  __ AddImmediate(RSP, compiler::Immediate(kFpuRegisterSize));
 }
 
 #undef __
diff --git a/runtime/vm/compiler/backend/il.cc b/runtime/vm/compiler/backend/il.cc
index b207ce7..14151fb 100644
--- a/runtime/vm/compiler/backend/il.cc
+++ b/runtime/vm/compiler/backend/il.cc
@@ -1172,6 +1172,18 @@
   env_ = NULL;
 }
 
+void Instruction::ReplaceInEnvironment(Definition* current,
+                                       Definition* replacement) {
+  for (Environment::DeepIterator it(env()); !it.Done(); it.Advance()) {
+    Value* use = it.CurrentValue();
+    if (use->definition() == current) {
+      use->RemoveFromUseList();
+      use->set_definition(replacement);
+      replacement->AddEnvUse(use);
+    }
+  }
+}
+
 Instruction* Instruction::RemoveFromGraph(bool return_previous) {
   ASSERT(!IsBlockEntry());
   ASSERT(!IsBranch());
@@ -3932,7 +3944,7 @@
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       compiler->EmitComment(parallel_move());
     }
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -4005,7 +4017,7 @@
                                    TokenPosition::kNoSource);
   }
   if (HasParallelMove()) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       compiler->EmitComment(parallel_move());
     }
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -4042,7 +4054,7 @@
 #endif
 
   if (HasParallelMove()) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       compiler->EmitComment(parallel_move());
     }
     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move());
@@ -4620,6 +4632,24 @@
   return targets_.HasSingleRecognizedTarget();
 }
 
+bool StaticCallInstr::InitResultType(Zone* zone) {
+  const intptr_t list_cid = FactoryRecognizer::GetResultCidOfListFactory(
+      zone, function(), ArgumentCount());
+  if (list_cid != kDynamicCid) {
+    SetResultType(zone, CompileType::FromCid(list_cid));
+    set_is_known_list_constructor(true);
+    return true;
+  } else if (function().has_pragma()) {
+    const intptr_t recognized_cid =
+        MethodRecognizer::ResultCidFromPragma(function());
+    if (recognized_cid != kDynamicCid) {
+      SetResultType(zone, CompileType::FromCid(recognized_cid));
+      return true;
+    }
+  }
+  return false;
+}
+
 Definition* StaticCallInstr::Canonicalize(FlowGraph* flow_graph) {
   if (!FLAG_precompiled_mode) {
     return this;
@@ -4767,8 +4797,9 @@
 #if !defined(TARGET_ARCH_DBC)
 
 void CheckClassInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass,
+                             licm_hoisted_ ? ICData::kHoisted : 0);
   if (IsNullCheck()) {
     EmitNullCheck(compiler, deopt);
     return;
@@ -4777,7 +4808,7 @@
   ASSERT(!cids_.IsMonomorphic() || !cids_.HasClassId(kSmiCid));
   Register value = locs()->in(0).reg();
   Register temp = locs()->temp(0).reg();
-  Label is_ok;
+  compiler::Label is_ok;
 
   __ BranchIfSmi(value, cids_.HasClassId(kSmiCid) ? &is_ok : deopt);
 
@@ -4880,8 +4911,9 @@
   const Register box = locs()->in(0).reg();
   const Register temp =
       (locs()->temp_count() > 0) ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnbox);
-  Label is_smi;
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnbox);
+  compiler::Label is_smi;
 
   if ((value()->Type()->ToNullableCid() == box_cid) &&
       value()->Type()->is_nullable()) {
@@ -4896,7 +4928,7 @@
   EmitLoadFromBox(compiler);
 
   if (is_smi.IsLinked()) {
-    Label done;
+    compiler::Label done;
     __ Jump(&done);
     __ Bind(&is_smi);
     EmitSmiConversion(compiler);
@@ -5225,7 +5257,7 @@
     if (curr == this) continue;
 
     StoreIndexedInstr* store = curr->AsStoreIndexed();
-    if (!store->index()->BindsToConstant() ||
+    if (store == nullptr || !store->index()->BindsToConstant() ||
         !store->index()->BoundConstant().IsSmi()) {
       return this;
     }
@@ -5289,12 +5321,14 @@
                                    intptr_t class_id,
                                    AlignmentType alignment,
                                    intptr_t deopt_id,
-                                   TokenPosition token_pos)
+                                   TokenPosition token_pos,
+                                   CompileType* result_type)
     : TemplateDefinition(deopt_id),
       index_scale_(index_scale),
       class_id_(class_id),
       alignment_(StrengthenAlignment(class_id, alignment)),
-      token_pos_(token_pos) {
+      token_pos_(token_pos),
+      result_type_(result_type) {
   SetInputAt(0, array);
   SetInputAt(1, index);
 }
@@ -5490,9 +5524,10 @@
   ASSERT(((1 << CallingConventions::kFirstCalleeSavedCpuReg) &
           CallingConventions::kArgumentRegisters) == 0);
 
-#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_IA32) ||                 \
-    defined(TARGET_ARCH_ARM)
+#if defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_IA32)
   constexpr intptr_t kNumTemps = 2;
+#elif defined(TARGET_ARCH_ARM)
+  constexpr intptr_t kNumTemps = 3;
 #else
   constexpr intptr_t kNumTemps = 1;
 #endif
@@ -5511,6 +5546,10 @@
   summary->set_temp(1, Location::RegisterLocation(
                            CallingConventions::kFirstCalleeSavedCpuReg));
 #endif
+#if defined(TARGET_ARCH_ARM)
+  summary->set_temp(2, Location::RegisterLocation(
+                           CallingConventions::kSecondCalleeSavedCpuReg));
+#endif
   summary->set_out(0, compiler::ffi::ResultLocation(
                           compiler::ffi::ResultRepresentation(signature_)));
 
diff --git a/runtime/vm/compiler/backend/il.h b/runtime/vm/compiler/backend/il.h
index bee636b..79a8e7d 100644
--- a/runtime/vm/compiler/backend/il.h
+++ b/runtime/vm/compiler/backend/il.h
@@ -37,6 +37,7 @@
 class Environment;
 class FlowGraph;
 class FlowGraphCompiler;
+class FlowGraphSerializer;
 class FlowGraphVisitor;
 class Instruction;
 class LocalVariable;
@@ -45,6 +46,8 @@
 class Range;
 class RangeAnalysis;
 class RangeBoundary;
+class SExpression;
+class SExpList;
 class UnboxIntegerInstr;
 class TypeUsageInfo;
 
@@ -123,7 +126,11 @@
   void SetReachingType(CompileType* type);
   void RefineReachingType(CompileType* type);
 
+#if !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
   void PrintTo(BufferFormatter* f) const;
+#endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
+
+  SExpression* ToSExpression(FlowGraphSerializer* s) const;
 
   const char* ToCString() const;
 
@@ -530,6 +537,17 @@
 #define PRINT_OPERANDS_TO_SUPPORT
 #endif  // !defined(PRODUCT) || defined(FORCE_INCLUDE_DISASSEMBLER)
 
+#define TO_S_EXPRESSION_SUPPORT                                                \
+  virtual SExpression* ToSExpression(FlowGraphSerializer* s) const;
+
+#define ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT                                   \
+  virtual void AddOperandsToSExpression(SExpList* sexp,                        \
+                                        FlowGraphSerializer* s) const;
+
+#define ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT                                 \
+  virtual void AddExtraInfoToSExpression(SExpList* sexp,                       \
+                                         FlowGraphSerializer* s) const;
+
 // Together with CidRange, this represents a mapping from a range of class-ids
 // to a method for a given selector (method name).  Also can contain an
 // indication of how frequently a given method has been called at a call site.
@@ -761,6 +779,11 @@
   virtual void PrintTo(BufferFormatter* f) const;
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 #endif
+  virtual SExpression* ToSExpression(FlowGraphSerializer* s) const;
+  virtual void AddOperandsToSExpression(SExpList* sexp,
+                                        FlowGraphSerializer* s) const;
+  virtual void AddExtraInfoToSExpression(SExpList* sexp,
+                                         FlowGraphSerializer* s) const;
 
 #define DECLARE_INSTRUCTION_TYPE_CHECK(Name, Type)                             \
   bool Is##Name() { return (As##Name() != NULL); }                             \
@@ -807,6 +830,7 @@
   Environment* env() const { return env_; }
   void SetEnvironment(Environment* deopt_env);
   void RemoveEnvironment();
+  void ReplaceInEnvironment(Definition* current, Definition* replacement);
 
   intptr_t lifetime_position() const { return lifetime_position_; }
   void set_lifetime_position(intptr_t pos) { lifetime_position_ = pos; }
@@ -989,9 +1013,9 @@
 };
 
 struct BranchLabels {
-  Label* true_label;
-  Label* false_label;
-  Label* fall_through;
+  compiler::Label* true_label;
+  compiler::Label* false_label;
+  compiler::Label* fall_through;
 };
 
 class PureInstruction : public Instruction {
@@ -1270,6 +1294,10 @@
 
   DEFINE_INSTRUCTION_TYPE_CHECK(BlockEntry)
 
+  TO_S_EXPRESSION_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
+
  protected:
   BlockEntryInstr(intptr_t block_id, intptr_t try_index, intptr_t deopt_id)
       : Instruction(deopt_id),
@@ -1524,6 +1552,7 @@
   virtual bool HasUnknownSideEffects() const { return false; }
 
   PRINT_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   // Classes that have access to predecessors_ when inlining.
@@ -1931,6 +1960,7 @@
 
   PRINT_OPERANDS_TO_SUPPORT
   PRINT_TO_SUPPORT
+  TO_S_EXPRESSION_SUPPORT
 
   bool UpdateType(CompileType new_type) {
     if (type_ == nullptr) {
@@ -2199,11 +2229,12 @@
 };
 
 // This instruction represents an incomming parameter for a function entry,
-// or incomming value for OSR entry or incomming value for a catch entry.
-// When [base_reg] is set to FPREG [index] corresponds to environment
-// variable index (0 is the very first parameter, 1 is next and so on).
-// When [base_reg] is set to SPREG [index] corresponds to SP relative parameter
-// indices (0 is the very last parameter, 1 is next and so on).
+// or incoming value for OSR entry or incomming value for a catch entry.
+// Value [index] always denotes the position of the parameter. When [base_reg]
+// is set to FPREG, value [index] corresponds to environment variable index
+// (0 is the very first parameter, 1 is next and so on). When [base_reg] is
+// set to SPREG, value [index] needs to be reversed (0 is the very last
+// parameter, 1 is next and so on) to get the sp relative position.
 class ParameterInstr : public Definition {
  public:
   ParameterInstr(intptr_t index,
@@ -2240,6 +2271,7 @@
   virtual bool MayThrow() const { return false; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value) { UNREACHABLE(); }
@@ -2344,6 +2376,7 @@
   intptr_t offset() const { return offset_; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   const intptr_t offset_;
@@ -2392,6 +2425,7 @@
   intptr_t offset() const { return offset_; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   const intptr_t offset_;
@@ -2443,6 +2477,7 @@
   virtual bool ComputeCanDeoptimize() const { return false; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   const Code& code_;
@@ -2664,6 +2699,7 @@
   }
 
   PRINT_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   BlockEntryInstr* block_;
@@ -2785,6 +2821,8 @@
            (operation_cid() == other_comparison->operation_cid());
   }
 
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
+
   DEFINE_INSTRUCTION_TYPE_CHECK(Comparison)
 
  protected:
@@ -2907,6 +2945,7 @@
   virtual BlockEntryInstr* SuccessorAt(intptr_t index) const;
 
   PRINT_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   virtual void RawSetInputAt(intptr_t i, Value* value) {
@@ -3046,6 +3085,7 @@
                           Register tmp = kNoRegister);
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   const Object& value_;
@@ -3263,6 +3303,7 @@
   const char* ToCString() const;
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
   static const char* KindToCString(SpecialParameterKind kind) {
     switch (kind) {
@@ -3357,6 +3398,8 @@
         type_args_len(), ArgumentCountWithoutTypeArgs(), argument_names());
   }
 
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
+
  private:
   intptr_t type_args_len_;
   const Array& argument_names_;
@@ -3531,6 +3574,7 @@
   }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
   bool MatchesCoreName(const String& name);
 
@@ -3630,6 +3674,8 @@
   Code::EntryKind entry_kind() const { return instance_call()->entry_kind(); }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   InstanceCallInstr* instance_call_;
@@ -4029,6 +4075,11 @@
 
   virtual bool HasUnknownSideEffects() const { return true; }
 
+  // Initialize result type of this call instruction if target is a recognized
+  // method or has pragma annotation.
+  // Returns true on success, false if result type is still unknown.
+  bool InitResultType(Zone* zone);
+
   void SetResultType(Zone* zone, CompileType new_type) {
     result_type_ = new (zone) CompileType(new_type);
   }
@@ -4057,6 +4108,7 @@
   virtual void SetIdentity(AliasIdentity identity) { identity_ = identity; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   const ICData* ic_data_;
@@ -4098,6 +4150,7 @@
   virtual TokenPosition token_pos() const { return token_pos_; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   const LocalVariable& local_;
@@ -4231,6 +4284,7 @@
   virtual TokenPosition token_pos() const { return token_pos_; }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   const LocalVariable& local_;
@@ -4281,6 +4335,7 @@
   void SetupNative();
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   void set_native_c_function(NativeFunction value) {
@@ -4345,6 +4400,15 @@
   virtual Representation RequiredInputRepresentation(intptr_t idx) const;
   virtual Representation representation() const;
 
+  // Returns true if we can assume generated code will be executable during a
+  // safepoint.
+  //
+  // TODO(#37739): This should be true when dual-mapping is enabled as well, but
+  // there are some bugs where it still switches code protections currently.
+  static bool CanExecuteGeneratedCodeInSafepoint() {
+    return FLAG_precompiled_mode;
+  }
+
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
@@ -4496,18 +4560,19 @@
   virtual Representation RequiredInputRepresentation(intptr_t index) const;
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   friend class JitCallSpecializer;  // For ASSERT(initialization_).
 
   intptr_t OffsetInBytes() const { return slot().offset_in_bytes(); }
 
-  Assembler::CanBeSmi CanValueBeSmi() const {
+  compiler::Assembler::CanBeSmi CanValueBeSmi() const {
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
-    return cid == kDynamicCid ? Assembler::kValueCanBeSmi
-                              : Assembler::kValueIsNotSmi;
+    return cid == kDynamicCid ? compiler::Assembler::kValueCanBeSmi
+                              : compiler::Assembler::kValueIsNotSmi;
   }
 
   const Slot& slot_;
@@ -4667,12 +4732,12 @@
   PRINT_OPERANDS_TO_SUPPORT
 
  private:
-  Assembler::CanBeSmi CanValueBeSmi() const {
+  compiler::Assembler::CanBeSmi CanValueBeSmi() const {
     const intptr_t cid = value()->Type()->ToNullableCid();
     // Write barrier is skipped for nullable and non-nullable smis.
     ASSERT(cid != kSmiCid);
-    return cid == kDynamicCid ? Assembler::kValueCanBeSmi
-                              : Assembler::kValueIsNotSmi;
+    return cid == kDynamicCid ? compiler::Assembler::kValueCanBeSmi
+                              : compiler::Assembler::kValueIsNotSmi;
   }
 
   const Field& field_;
@@ -4694,7 +4759,8 @@
                    intptr_t class_id,
                    AlignmentType alignment,
                    intptr_t deopt_id,
-                   TokenPosition token_pos);
+                   TokenPosition token_pos,
+                   CompileType* result_type = nullptr);
 
   TokenPosition token_pos() const { return token_pos_; }
 
@@ -4727,11 +4793,14 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
+
  private:
   const intptr_t index_scale_;
   const intptr_t class_id_;
   const AlignmentType alignment_;
   const TokenPosition token_pos_;
+  CompileType* result_type_;  // derived from call
 
   DISALLOW_COPY_AND_ASSIGN(LoadIndexedInstr);
 };
@@ -4938,9 +5007,11 @@
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
+
  private:
-  Assembler::CanBeSmi CanValueBeSmi() const {
-    return Assembler::kValueCanBeSmi;
+  compiler::Assembler::CanBeSmi CanValueBeSmi() const {
+    return compiler::Assembler::kValueCanBeSmi;
   }
 
   const StoreBarrierType emit_store_barrier_;
@@ -5098,6 +5169,8 @@
   }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   const TokenPosition token_pos_;
@@ -5467,6 +5540,7 @@
   virtual bool AttributesEqual(Instruction* other) const;
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
  private:
   intptr_t OffsetInBytes() const { return slot().offset_in_bytes(); }
@@ -5562,27 +5636,25 @@
 class AllocateContextInstr : public TemplateAllocation<0, NoThrow> {
  public:
   AllocateContextInstr(TokenPosition token_pos,
-                       const GrowableArray<LocalVariable*>& context_variables)
-      : token_pos_(token_pos), context_variables_(context_variables) {}
+                       const ZoneGrowableArray<const Slot*>& context_slots)
+      : token_pos_(token_pos), context_slots_(context_slots) {}
 
   DECLARE_INSTRUCTION(AllocateContext)
   virtual CompileType ComputeType() const;
 
   virtual TokenPosition token_pos() const { return token_pos_; }
-  const GrowableArray<LocalVariable*>& context_variables() const {
-    return context_variables_;
+  const ZoneGrowableArray<const Slot*>& context_slots() const {
+    return context_slots_;
   }
 
-  intptr_t num_context_variables() const {
-    return context_variables().length();
-  }
+  intptr_t num_context_variables() const { return context_slots().length(); }
 
   virtual bool ComputeCanDeoptimize() const { return false; }
 
   virtual bool HasUnknownSideEffects() const { return false; }
 
   virtual bool WillAllocateNewOrRemembered() const {
-    return WillAllocateNewOrRemembered(context_variables().length());
+    return WillAllocateNewOrRemembered(context_slots().length());
   }
 
   static bool WillAllocateNewOrRemembered(intptr_t num_context_variables) {
@@ -5595,7 +5667,7 @@
 
  private:
   const TokenPosition token_pos_;
-  const GrowableArray<LocalVariable*>& context_variables_;
+  const ZoneGrowableArray<const Slot*>& context_slots_;
 
   DISALLOW_COPY_AND_ASSIGN(AllocateContextInstr);
 };
@@ -5629,19 +5701,19 @@
  public:
   CloneContextInstr(TokenPosition token_pos,
                     Value* context_value,
-                    const GrowableArray<LocalVariable*>& context_variables,
+                    const ZoneGrowableArray<const Slot*>& context_slots,
                     intptr_t deopt_id)
       : TemplateDefinition(deopt_id),
         token_pos_(token_pos),
-        context_variables_(context_variables) {
+        context_slots_(context_slots) {
     SetInputAt(0, context_value);
   }
 
   virtual TokenPosition token_pos() const { return token_pos_; }
   Value* context_value() const { return inputs_[0]; }
 
-  const GrowableArray<LocalVariable*>& context_variables() const {
-    return context_variables_;
+  const ZoneGrowableArray<const Slot*>& context_slots() const {
+    return context_slots_;
   }
 
   DECLARE_INSTRUCTION(CloneContext)
@@ -5653,7 +5725,7 @@
 
  private:
   const TokenPosition token_pos_;
-  const GrowableArray<LocalVariable*>& context_variables_;
+  const ZoneGrowableArray<const Slot*>& context_slots_;
 
   DISALLOW_COPY_AND_ASSIGN(CloneContextInstr);
 };
@@ -6307,6 +6379,7 @@
   }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
   DECLARE_COMPARISON_INSTRUCTION(DoubleTestOp)
 
@@ -6473,6 +6546,7 @@
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
   DECLARE_INSTRUCTION(CheckedSmiOp)
 
@@ -6592,6 +6666,7 @@
   virtual intptr_t DeoptimizationTarget() const { return GetDeoptId(); }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
 
   DEFINE_INSTRUCTION_TYPE_CHECK(BinaryIntegerOp)
 
@@ -7026,6 +7101,7 @@
   }
 
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   const TokenPosition token_pos_;
@@ -7492,15 +7568,15 @@
                    intptr_t cid_start,
                    intptr_t cid_end,
                    bool is_last,
-                   Label* is_ok,
-                   Label* deopt,
+                   compiler::Label* is_ok,
+                   compiler::Label* deopt,
                    bool use_near_jump);
   void EmitBitTest(FlowGraphCompiler* compiler,
                    intptr_t min,
                    intptr_t max,
                    intptr_t mask,
-                   Label* deopt);
-  void EmitNullCheck(FlowGraphCompiler* compiler, Label* deopt);
+                   compiler::Label* deopt);
+  void EmitNullCheck(FlowGraphCompiler* compiler, compiler::Label* deopt);
 
   DISALLOW_COPY_AND_ASSIGN(CheckClassInstr);
 };
@@ -7888,10 +7964,10 @@
       : TemplateDefinition(DeoptId::kNone),
         representation_(rep),
         from_representation_(from_rep) {
-    ASSERT(rep == kUnboxedInt32 && (from_rep == kSmallUnboxedInt8 ||
-                                    from_rep == kSmallUnboxedInt16) ||
-           rep == kUnboxedUint32 && (from_rep == kSmallUnboxedUint8 ||
-                                     from_rep == kSmallUnboxedUint16));
+    ASSERT((rep == kUnboxedInt32 && (from_rep == kSmallUnboxedInt8 ||
+                                     from_rep == kSmallUnboxedInt16)) ||
+           (rep == kUnboxedUint32 && (from_rep == kSmallUnboxedUint8 ||
+                                      from_rep == kSmallUnboxedUint16)));
     SetInputAt(0, value);
   }
 
@@ -8140,6 +8216,8 @@
 
   DECLARE_INSTRUCTION(SimdOp)
   PRINT_OPERANDS_TO_SUPPORT
+  ADD_OPERANDS_TO_S_EXPRESSION_SUPPORT
+  ADD_EXTRA_INFO_TO_S_EXPRESSION_SUPPORT
 
  private:
   SimdOpInstr(Kind kind, intptr_t deopt_id)
@@ -8354,6 +8432,7 @@
                        Definition* result) const;
 
   void PrintTo(BufferFormatter* f) const;
+  SExpression* ToSExpression(FlowGraphSerializer* s) const;
   const char* ToCString() const;
 
   // Deep copy an environment.  The 'length' parameter may be less than the
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index d92ef09..ace771a 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -40,8 +40,8 @@
 
 DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
   ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ add(out, instr->base_reg(), Operand(index, LSL, 1));
-  __ ldr(out, Address(out, instr->offset()));
+  __ add(out, instr->base_reg(), compiler::Operand(index, LSL, 1));
+  __ ldr(out, compiler::Address(out, instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -51,8 +51,8 @@
                (NoLocation, Register index, Register value)) {
   ASSERT(instr->RequiredInputRepresentation(
              StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
-  __ add(TMP, instr->base_reg(), Operand(index, LSL, 1));
-  __ str(value, Address(TMP, instr->offset()));
+  __ add(TMP, instr->base_reg(), compiler::Operand(index, LSL, 1));
+  __ str(value, compiler::Address(TMP, instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -64,8 +64,8 @@
                 Temp<Register> temp)) {
   __ LoadObject(CODE_REG, instr->code());
   __ LeaveDartFrame();  // The arguments are still on the stack.
-  __ Branch(
-      FieldAddress(CODE_REG, compiler::target::Code::entry_point_offset()));
+  __ Branch(compiler::FieldAddress(
+      CODE_REG, compiler::target::Code::entry_point_offset()));
 
   // Even though the TailCallInstr will be the last instruction in a basic
   // block, the flow graph compiler will emit native code for other blocks after
@@ -125,14 +125,14 @@
   }
 
 #if defined(DEBUG)
-  Label stack_ok;
+  compiler::Label stack_ok;
   __ Comment("Stack Check");
   const intptr_t fp_sp_dist =
       (compiler::target::frame_layout.first_local_from_fp + 1 -
        compiler->StackSize()) *
       compiler::target::kWordSize;
   ASSERT(fp_sp_dist <= 0);
-  __ sub(R2, SP, Operand(FP));
+  __ sub(R2, SP, compiler::Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist);
   __ b(&stack_ok, EQ);
   __ bkpt(0);
@@ -197,7 +197,7 @@
   ASSERT(!left.IsConstant() || !right.IsConstant());
 
   // Clear out register.
-  __ eor(result, result, Operand(result));
+  __ eor(result, result, compiler::Operand(result));
 
   // Emit comparison code. This must not overwrite the result register.
   // IfThenElseInstr::Supports() should prevent EmitComparisonCode from using
@@ -227,14 +227,14 @@
     }
   }
 
-  __ mov(result, Operand(1), true_condition);
+  __ mov(result, compiler::Operand(1), true_condition);
 
   if (is_power_of_two_kind) {
     const intptr_t shift =
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
-    __ Lsl(result, result, Operand(shift + kSmiTagSize));
+    __ Lsl(result, result, compiler::Operand(shift + kSmiTagSize));
   } else {
-    __ sub(result, result, Operand(1));
+    __ sub(result, result, compiler::Operand(1));
     const int32_t val = compiler::target::ToRawSmi(true_value) -
                         compiler::target::ToRawSmi(false_value);
     __ AndImmediate(result, result, val);
@@ -265,10 +265,11 @@
   // R4: Arguments descriptor.
   // R0: Function.
   ASSERT(locs()->in(0).reg() == R0);
-  __ ldr(CODE_REG, FieldAddress(R0, compiler::target::Function::code_offset()));
-  __ ldr(R2,
-         FieldAddress(R0, compiler::target::Code::function_entry_point_offset(
-                              entry_kind())));
+  __ ldr(CODE_REG,
+         compiler::FieldAddress(R0, compiler::target::Function::code_offset()));
+  __ ldr(R2, compiler::FieldAddress(
+                 R0, compiler::target::Code::function_entry_point_offset(
+                         entry_kind())));
 
   // R2: instructions entry point.
   // R9: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value).
@@ -500,7 +501,7 @@
   // Check that the type of the value is allowed in conditional context.
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
-  Label done;
+  compiler::Label done;
 
   __ CompareObject(reg, Object::null_instance());
   __ b(&done, NE);
@@ -584,11 +585,11 @@
 static void LoadValueCid(FlowGraphCompiler* compiler,
                          Register value_cid_reg,
                          Register value_reg,
-                         Label* value_is_smi = NULL) {
+                         compiler::Label* value_is_smi = NULL) {
   if (value_is_smi == NULL) {
-    __ mov(value_cid_reg, Operand(kSmiCid));
+    __ mov(value_cid_reg, compiler::Operand(kSmiCid));
   }
-  __ tst(value_reg, Operand(kSmiTagMask));
+  __ tst(value_reg, compiler::Operand(kSmiTagMask));
   if (value_is_smi == NULL) {
     __ LoadClassId(value_cid_reg, value_reg, NE);
   } else {
@@ -658,7 +659,7 @@
   } else if (right.IsConstant()) {
     __ CompareObject(left.reg(), right.constant());
   } else {
-    __ cmp(left.reg(), Operand(right.reg()));
+    __ cmp(left.reg(), compiler::Operand(right.reg()));
   }
   return true_condition;
 }
@@ -695,9 +696,9 @@
   Register right_hi = right_pair->At(1).reg();
 
   // Compare lower.
-  __ cmp(left_lo, Operand(right_lo));
+  __ cmp(left_lo, compiler::Operand(right_lo));
   // Compare upper if lower is equal.
-  __ cmp(left_hi, Operand(right_hi), EQ);
+  __ cmp(left_hi, compiler::Operand(right_hi), EQ);
   return TokenKindToMintCondition(kind);
 }
 
@@ -736,12 +737,12 @@
       hi_cond = lo_cond = VS;
   }
   // Compare upper halves first.
-  __ cmp(left_hi, Operand(right_hi));
+  __ cmp(left_hi, compiler::Operand(right_hi));
   __ b(labels.true_label, hi_cond);
   __ b(labels.false_label, FlipCondition(hi_cond));
 
   // If higher words are equal, compare lower words.
-  __ cmp(left_lo, Operand(right_lo));
+  __ cmp(left_lo, compiler::Operand(right_lo));
   return lo_cond;
 }
 
@@ -817,7 +818,7 @@
     const int32_t imm = compiler::target::ToRawSmi(right.constant());
     __ TestImmediate(left, imm);
   } else {
-    __ tst(left, Operand(right.reg()));
+    __ tst(left, compiler::Operand(right.reg()));
   }
   Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
   return true_condition;
@@ -841,16 +842,17 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       deopt_id(), ICData::kDeoptTestCids,
-                                       licm_hoisted_ ? ICData::kHoisted : 0)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
   ASSERT(data[0] == kSmiCid);
   bool result = data[1] == true_result;
-  __ tst(val_reg, Operand(kSmiTagMask));
+  __ tst(val_reg, compiler::Operand(kSmiTagMask));
   __ b(result ? labels.true_label : labels.false_label, EQ);
   __ LoadClassId(cid_reg, val_reg);
 
@@ -866,7 +868,7 @@
     // If the cid is not in the list, jump to the opposite label from the cids
     // that are in the list.  These must be all the same (see asserts in the
     // constructor).
-    Label* target = result ? labels.false_label : labels.true_label;
+    compiler::Label* target = result ? labels.false_label : labels.true_label;
     if (target != labels.fall_through) {
       __ b(target);
     }
@@ -943,7 +945,8 @@
   __ PushObject(Object::null_object());
 
   // Pass a pointer to the first argument in R2.
-  __ add(R2, SP, Operand(ArgumentCount() * compiler::target::kWordSize));
+  __ add(R2, SP,
+         compiler::Operand(ArgumentCount() * compiler::target::kWordSize));
 
   // Compute the effective address. When running under the simulator,
   // this is a redirection address that forces the simulator to call
@@ -975,7 +978,7 @@
     }
   }
   __ LoadImmediate(R1, argc_tag);
-  ExternalLabel label(entry);
+  compiler::ExternalLabel label(entry);
   __ LoadNativeEntry(R9, &label,
                      link_lazily()
                          ? compiler::ObjectPoolBuilderEntry::kPatchable
@@ -998,7 +1001,7 @@
 
   // Save frame pointer because we're going to update it when we enter the exit
   // frame.
-  __ mov(saved_fp, Operand(FPREG));
+  __ mov(saved_fp, compiler::Operand(FPREG));
 
   // Make a space to put the return address.
   __ PushImmediate(0);
@@ -1023,8 +1026,8 @@
 
   // We need to copy the return address up into the dummy stack frame so the
   // stack walker will know which safepoint to use.
-  __ mov(TMP, Operand(PC));
-  __ str(TMP, Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize));
+  __ mov(TMP, compiler::Operand(PC));
+  __ str(TMP, compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize));
 
   // For historical reasons, the PC on ARM points 8 bytes past the current
   // instruction. Therefore we emit the metadata here, 8 bytes (2 instructions)
@@ -1033,18 +1036,33 @@
                                  RawPcDescriptors::Kind::kOther, locs());
 
   // Update information in the thread object and enter a safepoint.
-  __ TransitionGeneratedToNative(branch, FPREG, saved_fp,
-                                 locs()->temp(1).reg());
+  const Register tmp = locs()->temp(1).reg();
+  if (CanExecuteGeneratedCodeInSafepoint()) {
+    __ TransitionGeneratedToNative(branch, FPREG, saved_fp, tmp);
 
-  __ blx(branch);
+    __ blx(branch);
 
-  // Update information in the thread object and leave the safepoint.
-  __ TransitionNativeToGenerated(saved_fp, locs()->temp(1).reg());
+    // Update information in the thread object and leave the safepoint.
+    __ TransitionNativeToGenerated(saved_fp, tmp);
+  } else {
+    // We cannot trust that this code will be executable within a safepoint.
+    // Therefore we delegate the responsibility of entering/exiting the
+    // safepoint to a stub which in the VM isolate's heap, which will never lose
+    // execute permission.
+    __ ldr(TMP,
+           compiler::Address(
+               THR, compiler::target::Thread::
+                        call_native_through_safepoint_entry_point_offset()));
+
+    // Calls R8 in a safepoint and clobbers NOTFP and R4.
+    ASSERT(branch == R8 && tmp == NOTFP && locs()->temp(2).reg() == R4);
+    __ blx(TMP);
+  }
 
   // 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) {
-    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ ldr(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
   }
 
   // Leave dummy exit frame.
@@ -1154,7 +1172,7 @@
     __ LoadImmediate(
         R0, reinterpret_cast<int64_t>(DLRT_GetThreadForNativeCallback));
     __ blx(R0);
-    __ mov(THR, Operand(R0));
+    __ mov(THR, compiler::Operand(R0));
 
     __ LeaveFrame(1 << FP);
   }
@@ -1206,8 +1224,8 @@
   __ StoreToOffset(kWord, CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    __ ldr(PP,
-           Address(THR, compiler::target::Thread::global_object_pool_offset()));
+    __ ldr(PP, compiler::Address(
+                   THR, compiler::target::Thread::global_object_pool_offset()));
   } else {
     __ LoadImmediate(PP, 0);  // GC safe value into PP.
   }
@@ -1242,11 +1260,12 @@
 
   __ ldr(
       result,
-      Address(THR,
-              compiler::target::Thread::predefined_symbols_address_offset()));
+      compiler::Address(
+          THR, compiler::target::Thread::predefined_symbols_address_offset()));
   __ AddImmediate(
       result, Symbols::kNullCharCodeSymbolOffset * compiler::target::kWordSize);
-  __ ldr(result, Address(result, char_code, LSL, 1));  // Char code is a smi.
+  __ ldr(result,
+         compiler::Address(result, char_code, LSL, 1));  // Char code is a smi.
 }
 
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
@@ -1260,11 +1279,13 @@
   ASSERT(cid_ == kOneByteStringCid);
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  __ ldr(result, FieldAddress(str, compiler::target::String::length_offset()));
-  __ cmp(result, Operand(compiler::target::ToRawSmi(1)));
+  __ ldr(result, compiler::FieldAddress(
+                     str, compiler::target::String::length_offset()));
+  __ cmp(result, compiler::Operand(compiler::target::ToRawSmi(1)));
   __ LoadImmediate(result, -1, NE);
   __ ldrb(result,
-          FieldAddress(str, compiler::target::OneByteString::data_offset()),
+          compiler::FieldAddress(
+              str, compiler::target::OneByteString::data_offset()),
           EQ);
   __ SmiTag(result);
 }
@@ -1335,47 +1356,6 @@
   }
 }
 
-CompileType LoadIndexedInstr::ComputeType() const {
-  switch (class_id_) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return CompileType::Dynamic();
-
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
-      return CompileType::FromCid(kDoubleCid);
-    case kTypedDataFloat32x4ArrayCid:
-      return CompileType::FromCid(kFloat32x4Cid);
-    case kTypedDataInt32x4ArrayCid:
-      return CompileType::FromCid(kInt32x4Cid);
-    case kTypedDataFloat64x2ArrayCid:
-      return CompileType::FromCid(kFloat64x2Cid);
-
-    case kTypedDataInt8ArrayCid:
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-    case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid:
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-    case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
-      return CompileType::Int();
-
-    default:
-      UNREACHABLE();
-      return CompileType::Dynamic();
-  }
-}
-
 Representation LoadIndexedInstr::representation() const {
   switch (class_id_) {
     case kArrayCid:
@@ -1428,7 +1408,8 @@
   }
 
   ConstantInstr* constant = value->definition()->AsConstant();
-  if ((constant == NULL) || !Assembler::IsSafeSmi(constant->value())) {
+  if ((constant == NULL) ||
+      !compiler::Assembler::IsSafeSmi(constant->value())) {
     return false;
   }
   const int64_t index = compiler::target::SmiValue(constant->value());
@@ -1439,12 +1420,13 @@
   if (!Utils::IsAbsoluteUint(12, offset)) {
     return false;
   }
-  if (Address::CanHoldImmediateOffset(is_load, cid, offset)) {
+  if (compiler::Address::CanHoldImmediateOffset(is_load, cid, offset)) {
     *needs_base = false;
     return true;
   }
 
-  if (Address::CanHoldImmediateOffset(is_load, cid, offset - base_offset)) {
+  if (compiler::Address::CanHoldImmediateOffset(is_load, cid,
+                                                offset - base_offset)) {
     *needs_base = true;
     return true;
   }
@@ -1515,7 +1497,7 @@
   const Register address =
       directly_addressable ? kNoRegister : locs()->temp(0).reg();
 
-  Address element_address(kNoRegister);
+  compiler::Address element_address(kNoRegister);
   if (directly_addressable) {
     element_address = index.IsRegister()
                           ? __ ElementAddressForRegIndex(
@@ -1577,7 +1559,7 @@
       case kTypedDataFloat64x2ArrayCid:
       case kTypedDataInt32x4ArrayCid:
       case kTypedDataFloat32x4ArrayCid:
-        ASSERT(element_address.Equals(Address(IP)));
+        ASSERT(element_address.Equals(compiler::Address(IP)));
         ASSERT(aligned());
         __ vldmd(IA, IP, dresult0, 2);
         break;
@@ -1617,8 +1599,9 @@
       const Register result_lo = result_pair->At(0).reg();
       const Register result_hi = result_pair->At(1).reg();
       if (aligned()) {
-        __ ldr(result_lo, Address(address));
-        __ ldr(result_hi, Address(address, compiler::target::kWordSize));
+        __ ldr(result_lo, compiler::Address(address));
+        __ ldr(result_hi,
+               compiler::Address(address, compiler::target::kWordSize));
       } else {
         __ LoadWordUnaligned(result_lo, address, TMP);
         __ AddImmediate(address, address, compiler::target::kWordSize);
@@ -1815,7 +1798,7 @@
   const Register temp2 =
       (locs()->temp_count() > 1) ? locs()->temp(1).reg() : kNoRegister;
 
-  Address element_address(kNoRegister);
+  compiler::Address element_address(kNoRegister);
   if (directly_addressable) {
     element_address =
         index.IsRegister()
@@ -1850,10 +1833,10 @@
                           /*lr_reserved=*/!compiler->intrinsic_mode());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
-        __ StoreIntoObjectNoBarrier(array, Address(temp), constant);
+        __ StoreIntoObjectNoBarrier(array, compiler::Address(temp), constant);
       } else {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObjectNoBarrier(array, Address(temp), value);
+        __ StoreIntoObjectNoBarrier(array, compiler::Address(temp), value);
       }
       break;
     case kTypedDataInt8ArrayCid:
@@ -1888,9 +1871,11 @@
         const Register value = locs()->in(2).reg();
         // Clamp to 0x00 or 0xFF respectively.
         __ LoadImmediate(IP, 0xFF);
-        __ cmp(value, Operand(IP));      // Compare Smi value and smi 0xFF.
-        __ mov(IP, Operand(0), LE);      // IP = value <= 0xFF ? 0 : 0xFF.
-        __ mov(IP, Operand(value), LS);  // IP = value in range ? value : IP.
+        __ cmp(value,
+               compiler::Operand(IP));  // Compare Smi value and smi 0xFF.
+        __ mov(IP, compiler::Operand(0), LE);  // IP = value <= 0xFF ? 0 : 0xFF.
+        __ mov(IP, compiler::Operand(value),
+               LS);  // IP = value in range ? value : IP.
         __ strb(IP, element_address);
       }
       break;
@@ -1924,8 +1909,8 @@
       Register value_lo = value_pair->At(0).reg();
       Register value_hi = value_pair->At(1).reg();
       if (aligned()) {
-        __ str(value_lo, Address(temp));
-        __ str(value_hi, Address(temp, compiler::target::kWordSize));
+        __ str(value_lo, compiler::Address(temp));
+        __ str(value_hi, compiler::Address(temp, compiler::target::kWordSize));
       } else {
         __ StoreWordUnaligned(value_lo, temp, temp2);
         __ AddImmediate(temp, temp, compiler::target::kWordSize);
@@ -1964,7 +1949,7 @@
     case kTypedDataFloat64x2ArrayCid:
     case kTypedDataInt32x4ArrayCid:
     case kTypedDataFloat32x4ArrayCid: {
-      ASSERT(element_address.Equals(Address(index.reg())));
+      ASSERT(element_address.Equals(compiler::Address(index.reg())));
       ASSERT(aligned());
       const DRegister value_reg = EvenDRegisterOf(locs()->in(2).fpu_reg());
       __ vstmd(IA, index.reg(), value_reg, 2);
@@ -2036,30 +2021,30 @@
                                  ? locs()->temp(locs()->temp_count() - 1).reg()
                                  : kNoRegister;
 
-  Label ok, fail_label;
+  compiler::Label ok, fail_label;
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
 
-  Label* fail = (deopt != NULL) ? deopt : &fail_label;
+  compiler::Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    FieldAddress field_cid_operand(
+    compiler::FieldAddress field_cid_operand(
         field_reg, compiler::target::Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
+    compiler::FieldAddress field_nullability_operand(
         field_reg, compiler::target::Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
       __ ldrh(IP, field_cid_operand);
-      __ cmp(value_cid_reg, Operand(IP));
+      __ cmp(value_cid_reg, compiler::Operand(IP));
       __ b(&ok, EQ);
       __ ldrh(IP, field_nullability_operand);
-      __ cmp(value_cid_reg, Operand(IP));
+      __ cmp(value_cid_reg, compiler::Operand(IP));
     } else if (value_cid == kNullCid) {
       __ ldrh(value_cid_reg, field_nullability_operand);
       __ CompareImmediate(value_cid_reg, value_cid);
@@ -2098,8 +2083,9 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ ldrh(IP, FieldAddress(field_reg,
-                               compiler::target::Field::guarded_cid_offset()));
+      __ ldrh(IP,
+              compiler::FieldAddress(
+                  field_reg, compiler::target::Field::guarded_cid_offset()));
       __ CompareImmediate(IP, kDynamicCid);
       __ b(&ok, EQ);
 
@@ -2117,7 +2103,7 @@
     // Field guard class has been initialized and is known.
     if (value_cid == kDynamicCid) {
       // Field's guarded class id is fixed by value's class id is not known.
-      __ tst(value_reg, Operand(kSmiTagMask));
+      __ tst(value_reg, compiler::Operand(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
         __ b(fail, EQ);
@@ -2174,7 +2160,7 @@
     return;  // Nothing to emit.
   }
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
@@ -2187,27 +2173,28 @@
     const Register offset_reg = locs()->temp(1).reg();
     const Register length_reg = locs()->temp(2).reg();
 
-    Label ok;
+    compiler::Label ok;
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     __ ldrsb(offset_reg,
-             FieldAddress(field_reg,
-                          compiler::target::Field::
-                              guarded_list_length_in_object_offset_offset()));
-    __ ldr(length_reg,
-           FieldAddress(field_reg,
-                        compiler::target::Field::guarded_list_length_offset()));
+             compiler::FieldAddress(
+                 field_reg, compiler::target::Field::
+                                guarded_list_length_in_object_offset_offset()));
+    __ ldr(
+        length_reg,
+        compiler::FieldAddress(
+            field_reg, compiler::target::Field::guarded_list_length_offset()));
 
-    __ tst(offset_reg, Operand(offset_reg));
+    __ tst(offset_reg, compiler::Operand(offset_reg));
     __ b(&ok, MI);
 
     // Load the length from the value. GuardFieldClass already verified that
     // 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(IP, Address(value_reg, offset_reg));
-    __ cmp(length_reg, Operand(IP));
+    __ ldr(IP, compiler::Address(value_reg, offset_reg));
+    __ cmp(length_reg, compiler::Operand(IP));
 
     if (deopt == NULL) {
       __ b(&ok, EQ);
@@ -2230,8 +2217,8 @@
     const Register length_reg = locs()->temp(0).reg();
 
     __ ldr(length_reg,
-           FieldAddress(value_reg,
-                        field().guarded_list_length_in_object_offset()));
+           compiler::FieldAddress(
+               value_reg, field().guarded_list_length_in_object_offset()));
     __ CompareImmediate(
         length_reg, compiler::target::ToRawSmi(field().guarded_list_length()));
     __ b(deopt, NE);
@@ -2249,7 +2236,7 @@
       : TemplateSlowPathCode(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("%s slow path allocation of %s", instruction()->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
@@ -2322,7 +2309,7 @@
   const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = __ ElementAddressForRegIndex(
+  compiler::Address element_address = __ ElementAddressForRegIndex(
       true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register IP as base.
 
@@ -2337,13 +2324,13 @@
       case kExternalOneByteStringCid:
         ASSERT(element_count() == 4);
         __ ldr(result1, element_address);
-        __ eor(result2, result2, Operand(result2));
+        __ eor(result2, result2, compiler::Operand(result2));
         break;
       case kTwoByteStringCid:
       case kExternalTwoByteStringCid:
         ASSERT(element_count() == 2);
         __ ldr(result1, element_address);
-        __ eor(result2, result2, Operand(result2));
+        __ eor(result2, result2, compiler::Operand(result2));
         break;
       default:
         UNREACHABLE();
@@ -2398,12 +2385,12 @@
       __ MoveRegister(value, result);
       __ SmiTag(result);
 
-      Label done;
+      compiler::Label done;
       __ TestImmediate(value, 0xC0000000);
       __ b(&done, EQ);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
                                       result, temp);
-      __ eor(temp, temp, Operand(temp));
+      __ eor(temp, temp, compiler::Operand(temp));
       __ StoreToOffset(kWord, value, result,
                        compiler::target::Mint::value_offset() - kHeapObjectTag);
       __ StoreToOffset(kWord, temp, result,
@@ -2453,8 +2440,8 @@
                              Register instance_reg,
                              intptr_t offset,
                              Register temp) {
-  Label done;
-  __ ldr(box_reg, FieldAddress(instance_reg, offset));
+  compiler::Label done;
+  __ ldr(box_reg, compiler::FieldAddress(instance_reg, offset));
   __ CompareObject(box_reg, Object::null_object());
   __ b(&done, NE);
 
@@ -2462,17 +2449,18 @@
 
   __ MoveRegister(temp, box_reg);
   __ StoreIntoObjectOffset(instance_reg, offset, temp,
-                           Assembler::kValueIsNotSmi);
+                           compiler::Assembler::kValueIsNotSmi);
   __ Bind(&done);
 }
 
 void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(sizeof(classid_t) == kInt16Size);
 
-  Label skip_store;
+  compiler::Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
   const intptr_t offset_in_bytes = OffsetInBytes();
+  ASSERT(offset_in_bytes > 0);  // Field is finalized and points after header.
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     const DRegister value = EvenDRegisterOf(locs()->in(1).fpu_reg());
@@ -2499,9 +2487,9 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ MoveRegister(temp2, temp);
       __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, temp2,
-                               Assembler::kValueIsNotSmi);
+                               compiler::Assembler::kValueIsNotSmi);
     } else {
-      __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes));
+      __ ldr(temp, compiler::FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
@@ -2541,35 +2529,35 @@
       locs()->live_registers()->Add(locs()->in(1), kTagged);
     }
 
-    Label store_pointer;
-    Label store_double;
-    Label store_float32x4;
-    Label store_float64x2;
+    compiler::Label store_pointer;
+    compiler::Label store_double;
+    compiler::Label store_float32x4;
+    compiler::Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
-    __ ldrh(temp2,
-            FieldAddress(temp, compiler::target::Field::is_nullable_offset()));
+    __ ldrh(temp2, compiler::FieldAddress(
+                       temp, compiler::target::Field::is_nullable_offset()));
     __ CompareImmediate(temp2, kNullCid);
     __ b(&store_pointer, EQ);
 
-    __ ldrb(temp2,
-            FieldAddress(temp, compiler::target::Field::kind_bits_offset()));
-    __ tst(temp2, Operand(1 << Field::kUnboxingCandidateBit));
+    __ ldrb(temp2, compiler::FieldAddress(
+                       temp, compiler::target::Field::kind_bits_offset()));
+    __ tst(temp2, compiler::Operand(1 << Field::kUnboxingCandidateBit));
     __ b(&store_pointer, EQ);
 
-    __ ldrh(temp2,
-            FieldAddress(temp, compiler::target::Field::guarded_cid_offset()));
+    __ ldrh(temp2, compiler::FieldAddress(
+                       temp, compiler::target::Field::guarded_cid_offset()));
     __ CompareImmediate(temp2, kDoubleCid);
     __ b(&store_double, EQ);
 
-    __ ldrh(temp2,
-            FieldAddress(temp, compiler::target::Field::guarded_cid_offset()));
+    __ ldrh(temp2, compiler::FieldAddress(
+                       temp, compiler::target::Field::guarded_cid_offset()));
     __ CompareImmediate(temp2, kFloat32x4Cid);
     __ b(&store_float32x4, EQ);
 
-    __ ldrh(temp2,
-            FieldAddress(temp, compiler::target::Field::guarded_cid_offset()));
+    __ ldrh(temp2, compiler::FieldAddress(
+                       temp, compiler::target::Field::guarded_cid_offset()));
     __ CompareImmediate(temp2, kFloat64x2Cid);
     __ b(&store_float64x2, EQ);
 
@@ -2672,13 +2660,15 @@
   if (this->value()->NeedsWriteBarrier()) {
     __ StoreIntoObject(
         temp,
-        FieldAddress(temp, compiler::target::Field::static_value_offset()),
+        compiler::FieldAddress(temp,
+                               compiler::target::Field::static_value_offset()),
         value, CanValueBeSmi(),
         /*lr_reserved=*/!compiler->intrinsic_mode());
   } else {
     __ StoreIntoObjectNoBarrier(
         temp,
-        FieldAddress(temp, compiler::target::Field::static_value_offset()),
+        compiler::FieldAddress(temp,
+                               compiler::target::Field::static_value_offset()),
         value);
   }
 }
@@ -2720,8 +2710,8 @@
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
                                   intptr_t num_elements,
-                                  Label* slow_path,
-                                  Label* done) {
+                                  compiler::Label* slow_path,
+                                  compiler::Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R2;
   const Register kElemTypeReg = R1;
@@ -2736,12 +2726,14 @@
 
   // Store the type argument field.
   __ StoreIntoObjectNoBarrier(
-      R0, FieldAddress(R0, compiler::target::Array::type_arguments_offset()),
+      R0,
+      compiler::FieldAddress(R0,
+                             compiler::target::Array::type_arguments_offset()),
       kElemTypeReg);
 
   // Set the length field.
   __ StoreIntoObjectNoBarrier(
-      R0, FieldAddress(R0, compiler::target::Array::length_offset()),
+      R0, compiler::FieldAddress(R0, compiler::target::Array::length_offset()),
       kLengthReg);
 
   // Initialize all array elements to raw_null.
@@ -2754,7 +2746,7 @@
     const intptr_t array_size = instance_size - sizeof(RawArray);
     __ LoadObject(R8, Object::null_object());
     if (num_elements >= 2) {
-      __ mov(R9, Operand(R8));
+      __ mov(R9, compiler::Operand(R8));
     } else {
 #if defined(DEBUG)
       // Clobber R9 with an invalid pointer.
@@ -2794,7 +2786,7 @@
     const intptr_t length =
         compiler::target::SmiValue(num_elements()->BoundConstant());
     if (Array::IsValidLength(length)) {
-      Label slow_path, done;
+      compiler::Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
@@ -2873,23 +2865,23 @@
     return;
   }
 
-  Label done;
+  compiler::Label done;
   const Register result_reg = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
     const DRegister value = EvenDRegisterOf(locs()->temp(0).fpu_reg());
     const Register temp = locs()->temp(1).reg();
     const Register temp2 = locs()->temp(2).reg();
 
-    Label load_pointer;
-    Label load_double;
-    Label load_float32x4;
-    Label load_float64x2;
+    compiler::Label load_pointer;
+    compiler::Label load_double;
+    compiler::Label load_float32x4;
+    compiler::Label load_float64x2;
 
     __ LoadObject(result_reg, Field::ZoneHandle(slot().field().Original()));
 
-    FieldAddress field_cid_operand(
+    compiler::FieldAddress field_cid_operand(
         result_reg, compiler::target::Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(
+    compiler::FieldAddress field_nullability_operand(
         result_reg, compiler::target::Field::is_nullable_offset());
 
     __ ldrh(temp, field_nullability_operand);
@@ -2919,7 +2911,7 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
+      __ ldr(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyDoubleField(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
@@ -2928,7 +2920,7 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
+      __ ldr(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyFloat32x4Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
@@ -2937,7 +2929,7 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result_reg, temp);
-      __ ldr(temp, FieldAddress(instance_reg, OffsetInBytes()));
+      __ ldr(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
       __ CopyFloat64x2Field(result_reg, temp, TMP, temp2, value);
       __ b(&done);
     }
@@ -3008,12 +3000,12 @@
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
-  Label type_arguments_instantiated;
+  compiler::Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawWhenInstantiatedFromRaw(len)) {
     __ LoadObject(IP, Object::null_object());
-    __ cmp(instantiator_type_args_reg, Operand(IP));
-    __ cmp(function_type_args_reg, Operand(IP), EQ);
+    __ cmp(instantiator_type_args_reg, compiler::Operand(IP));
+    __ cmp(function_type_args_reg, compiler::Operand(IP), EQ);
     __ b(&type_arguments_instantiated, EQ);
     ASSERT(function_type_args_reg == result_reg);
   }
@@ -3022,25 +3014,25 @@
   // TODO(regis): Consider moving this into a shared stub to reduce
   // generated code size.
   __ LoadObject(R3, type_arguments());
-  __ ldr(R3, FieldAddress(
+  __ ldr(R3, compiler::FieldAddress(
                  R3, compiler::target::TypeArguments::instantiations_offset()));
   __ AddImmediate(R3, compiler::target::Array::data_offset() - kHeapObjectTag);
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
-  Label loop, next, found, slow_case;
+  compiler::Label loop, next, found, slow_case;
   __ Bind(&loop);
   __ ldr(
       R2,
-      Address(
+      compiler::Address(
           R3,
           0 * compiler::target::kWordSize));  // Cached instantiator type args.
-  __ cmp(R2, Operand(instantiator_type_args_reg));
+  __ cmp(R2, compiler::Operand(instantiator_type_args_reg));
   __ b(&next, NE);
-  __ ldr(
-      IP,
-      Address(R3,
-              1 * compiler::target::kWordSize));  // Cached function type args.
-  __ cmp(IP, Operand(function_type_args_reg));
+  __ ldr(IP,
+         compiler::Address(
+             R3,
+             1 * compiler::target::kWordSize));  // Cached function type args.
+  __ cmp(IP, compiler::Operand(function_type_args_reg));
   __ b(&found, EQ);
   __ Bind(&next);
   __ AddImmediate(
@@ -3050,10 +3042,10 @@
   __ b(&loop, NE);
   __ b(&slow_case);
   __ Bind(&found);
-  __ ldr(
-      result_reg,
-      Address(R3,
-              2 * compiler::target::kWordSize));  // Cached instantiated args.
+  __ ldr(result_reg,
+         compiler::Address(
+             R3,
+             2 * compiler::target::kWordSize));  // Cached instantiated args.
   __ b(&type_arguments_instantiated);
 
   __ Bind(&slow_case);
@@ -3129,7 +3121,7 @@
 
   // Setup up number of context variables field.
   __ LoadImmediate(temp0, num_context_variables());
-  __ str(temp0, FieldAddress(
+  __ str(temp0, compiler::FieldAddress(
                     result, compiler::target::Context::num_variables_offset()));
 
   __ Bind(slow_path->exit_label());
@@ -3169,10 +3161,10 @@
 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register temp = locs()->temp(0).reg();
-  Label call_runtime, no_call;
+  compiler::Label call_runtime, no_call;
 
-  __ ldr(temp,
-         FieldAddress(field, compiler::target::Field::static_value_offset()));
+  __ ldr(temp, compiler::FieldAddress(
+                   field, compiler::target::Field::static_value_offset()));
   __ CompareObject(temp, Object::sentinel());
   __ b(&call_runtime, EQ);
 
@@ -3289,8 +3281,8 @@
       __ Bind(osr_entry_label());
       __ LoadImmediate(value, Thread::kOsrRequest);
       __ str(value,
-             Address(THR,
-                     compiler::target::Thread::stack_overflow_flags_offset()));
+             compiler::Address(
+                 THR, compiler::target::Thread::stack_overflow_flags_offset()));
     }
     __ Comment("CheckStackOverflowSlowPath");
     __ Bind(entry_label());
@@ -3310,7 +3302,7 @@
       const uword entry_point_offset = compiler::target::Thread::
           stack_overflow_shared_stub_entry_point_offset(
               instruction()->locs()->live_registers()->FpuRegisterCount() > 0);
-      __ ldr(LR, Address(THR, entry_point_offset));
+      __ ldr(LR, compiler::Address(THR, entry_point_offset));
       __ blx(LR);
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
       compiler->RecordCatchEntryMoves();
@@ -3338,18 +3330,19 @@
     __ b(exit_label());
   }
 
-  Label* osr_entry_label() {
+  compiler::Label* osr_entry_label() {
     ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
  private:
-  Label osr_entry_label_;
+  compiler::Label osr_entry_label_;
 };
 
 void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  __ ldr(IP, Address(THR, compiler::target::Thread::stack_limit_offset()));
-  __ cmp(SP, Operand(IP));
+  __ ldr(IP, compiler::Address(THR,
+                               compiler::target::Thread::stack_limit_offset()));
+  __ cmp(SP, compiler::Operand(IP));
 
   auto object_store = compiler->isolate()->object_store();
   const bool live_fpu_regs = locs()->live_registers()->FpuRegisterCount() > 0;
@@ -3387,12 +3380,12 @@
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
     __ ldr(count,
-           FieldAddress(function,
-                        compiler::target::Function::usage_counter_offset()));
-    __ add(count, count, Operand(1));
+           compiler::FieldAddress(
+               function, compiler::target::Function::usage_counter_offset()));
+    __ add(count, count, compiler::Operand(1));
     __ str(count,
-           FieldAddress(function,
-                        compiler::target::Function::usage_counter_offset()));
+           compiler::FieldAddress(
+               function, compiler::target::Function::usage_counter_offset()));
     __ CompareImmediate(count, threshold);
     __ b(slow_path->osr_entry_label(), GE);
   }
@@ -3407,10 +3400,11 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(compiler::target::IsSmi(constant));
@@ -3420,12 +3414,12 @@
     ASSERT((0 < value) && (value < kCountLimit));
     if (shift_left->can_overflow()) {
       // Check for overflow (preserve left).
-      __ Lsl(IP, left, Operand(value));
-      __ cmp(left, Operand(IP, ASR, value));
+      __ Lsl(IP, left, compiler::Operand(value));
+      __ cmp(left, compiler::Operand(IP, ASR, value));
       __ b(deopt, NE);  // Overflow.
     }
     // Shift for result now we know there is no overflow.
-    __ Lsl(result, left, Operand(value));
+    __ Lsl(result, left, compiler::Operand(value));
     return;
   }
 
@@ -3439,9 +3433,9 @@
     if (compiler::target::IsSmi(obj)) {
       const intptr_t left_int = compiler::target::SmiValue(obj);
       if (left_int == 0) {
-        __ cmp(right, Operand(0));
+        __ cmp(right, compiler::Operand(0));
         __ b(deopt, MI);
-        __ mov(result, Operand(0));
+        __ mov(result, compiler::Operand(0));
         return;
       }
       const intptr_t max_right =
@@ -3449,7 +3443,7 @@
       const bool right_needs_check =
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
-        __ cmp(right, Operand(compiler::target::ToRawSmi(max_right)));
+        __ cmp(right, compiler::Operand(compiler::target::ToRawSmi(max_right)));
         __ b(deopt, CS);
       }
       __ SmiUntag(IP, right);
@@ -3464,13 +3458,13 @@
     if (right_needs_check) {
       if (!RangeUtils::IsPositive(right_range)) {
         ASSERT(shift_left->CanDeoptimize());
-        __ cmp(right, Operand(0));
+        __ cmp(right, compiler::Operand(0));
         __ b(deopt, MI);
       }
 
-      __ cmp(right,
-             Operand(compiler::target::ToRawSmi(compiler::target::kSmiBits)));
-      __ mov(result, Operand(0), CS);
+      __ cmp(right, compiler::Operand(compiler::target::ToRawSmi(
+                        compiler::target::kSmiBits)));
+      __ mov(result, compiler::Operand(0), CS);
       __ SmiUntag(IP, right, CC);  // SmiUntag right into IP if CC.
       __ Lsl(result, left, IP, CC);
     } else {
@@ -3480,8 +3474,8 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ cmp(right,
-             Operand(compiler::target::ToRawSmi(compiler::target::kSmiBits)));
+      __ cmp(right, compiler::Operand(compiler::target::ToRawSmi(
+                        compiler::target::kSmiBits)));
       __ b(deopt, CS);
     }
     // Left is not a constant.
@@ -3490,7 +3484,7 @@
     // Overflow test (preserve left, right, and IP);
     const Register temp = locs.temp(0).reg();
     __ Lsl(temp, left, IP);
-    __ cmp(left, Operand(temp, ASR, IP));
+    __ cmp(left, compiler::Operand(temp, ASR, IP));
     __ b(deopt, NE);  // Overflow.
     // Shift for result now we know there is no overflow.
     __ Lsl(result, left, IP);
@@ -3505,7 +3499,7 @@
   static constexpr intptr_t kNumSlowPathArgs = 2;
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
     }
     __ Bind(entry_label());
@@ -3527,7 +3521,7 @@
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
-    __ mov(result, Operand(R0));
+    __ mov(result, compiler::Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     __ b(exit_label());
     compiler->pending_deoptimization_env_ = NULL;
@@ -3561,44 +3555,44 @@
   intptr_t right_cid = this->right()->Type()->ToCid();
   bool combined_smi_check = false;
   if (this->left()->definition() == this->right()->definition()) {
-    __ tst(left, Operand(kSmiTagMask));
+    __ tst(left, compiler::Operand(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ tst(right, Operand(kSmiTagMask));
+    __ tst(right, compiler::Operand(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ tst(left, Operand(kSmiTagMask));
+    __ tst(left, compiler::Operand(kSmiTagMask));
   } else {
     combined_smi_check = true;
-    __ orr(result, left, Operand(right));
-    __ tst(result, Operand(kSmiTagMask));
+    __ orr(result, left, compiler::Operand(right));
+    __ tst(result, compiler::Operand(kSmiTagMask));
   }
   __ b(slow_path->entry_label(), NE);
   switch (op_kind()) {
     case Token::kADD:
-      __ adds(result, left, Operand(right));
+      __ adds(result, left, compiler::Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
     case Token::kSUB:
-      __ subs(result, left, Operand(right));
+      __ subs(result, left, compiler::Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
     case Token::kMUL:
       __ SmiUntag(IP, left);
       __ smull(result, IP, IP, right);
       // IP: result bits 32..63.
-      __ cmp(IP, Operand(result, ASR, 31));
+      __ cmp(IP, compiler::Operand(result, ASR, 31));
       __ b(slow_path->entry_label(), NE);
       break;
     case Token::kBIT_OR:
       // Operation may be part of combined smi check.
       if (!combined_smi_check) {
-        __ orr(result, left, Operand(right));
+        __ orr(result, left, compiler::Operand(right));
       }
       break;
     case Token::kBIT_AND:
-      __ and_(result, left, Operand(right));
+      __ and_(result, left, compiler::Operand(right));
       break;
     case Token::kBIT_XOR:
-      __ eor(result, left, Operand(right));
+      __ eor(result, left, compiler::Operand(right));
       break;
     case Token::kSHL:
       ASSERT(result != left);
@@ -3611,7 +3605,7 @@
       // Check for overflow by shifting left and shifting back arithmetically.
       // If the result is different from the original, there was overflow.
       __ Lsl(result, left, TMP);
-      __ cmp(left, Operand(result, ASR, TMP));
+      __ cmp(left, compiler::Operand(result, ASR, TMP));
       __ b(slow_path->entry_label(), NE);
       break;
     case Token::kSHR:
@@ -3647,7 +3641,7 @@
         merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
     }
     __ Bind(entry_label());
@@ -3669,7 +3663,7 @@
     compiler->EmitMegamorphicInstanceCall(
         selector, arguments_descriptor, instruction()->call()->deopt_id(),
         instruction()->token_pos(), locs, try_index_, kNumSlowPathArgs);
-    __ mov(result, Operand(R0));
+    __ mov(result, compiler::Operand(R0));
     compiler->RestoreLiveRegisters(locs);
     compiler->pending_deoptimization_env_ = NULL;
     if (merged_) {
@@ -3723,14 +3717,14 @@
   intptr_t left_cid = this->left()->Type()->ToCid();                           \
   intptr_t right_cid = this->right()->Type()->ToCid();                         \
   if (this->left()->definition() == this->right()->definition()) {             \
-    __ tst(left, Operand(kSmiTagMask));                                        \
+    __ tst(left, compiler::Operand(kSmiTagMask));                              \
   } else if (left_cid == kSmiCid) {                                            \
-    __ tst(right, Operand(kSmiTagMask));                                       \
+    __ tst(right, compiler::Operand(kSmiTagMask));                             \
   } else if (right_cid == kSmiCid) {                                           \
-    __ tst(left, Operand(kSmiTagMask));                                        \
+    __ tst(left, compiler::Operand(kSmiTagMask));                              \
   } else {                                                                     \
-    __ orr(temp, left, Operand(right));                                        \
-    __ tst(temp, Operand(kSmiTagMask));                                        \
+    __ orr(temp, left, compiler::Operand(right));                              \
+    __ tst(temp, compiler::Operand(kSmiTagMask));                              \
   }                                                                            \
   __ b(slow_path->entry_label(), NE)
 
@@ -3827,7 +3821,7 @@
 
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -3867,7 +3861,7 @@
           __ LoadImmediate(IP, value);
           __ smull(result, IP, left, IP);
           // IP: result bits 32..63.
-          __ cmp(IP, Operand(result, ASR, 31));
+          __ cmp(IP, compiler::Operand(result, ASR, 31));
           __ b(deopt, NE);
         }
         break;
@@ -3879,50 +3873,50 @@
         const intptr_t shift_count =
             Utils::ShiftForPowerOfTwo(Utils::Abs(value)) + kSmiTagSize;
         ASSERT(kSmiTagSize == 1);
-        __ mov(IP, Operand(left, ASR, 31));
+        __ mov(IP, compiler::Operand(left, ASR, 31));
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         const Register temp = locs()->temp(0).reg();
-        __ add(temp, left, Operand(IP, LSR, 32 - shift_count));
+        __ add(temp, left, compiler::Operand(IP, LSR, 32 - shift_count));
         ASSERT(shift_count > 0);
-        __ mov(result, Operand(temp, ASR, shift_count));
+        __ mov(result, compiler::Operand(temp, ASR, shift_count));
         if (value < 0) {
-          __ rsb(result, result, Operand(0));
+          __ rsb(result, result, compiler::Operand(0));
         }
         __ SmiTag(result);
         break;
       }
       case Token::kBIT_AND: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(imm, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(imm, &o)) {
           __ and_(result, left, o);
-        } else if (Operand::CanHold(~imm, &o)) {
+        } else if (compiler::Operand::CanHold(~imm, &o)) {
           __ bic(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ and_(result, left, Operand(IP));
+          __ and_(result, left, compiler::Operand(IP));
         }
         break;
       }
       case Token::kBIT_OR: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(imm, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(imm, &o)) {
           __ orr(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ orr(result, left, Operand(IP));
+          __ orr(result, left, compiler::Operand(IP));
         }
         break;
       }
       case Token::kBIT_XOR: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(imm, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(imm, &o)) {
           __ eor(result, left, o);
         } else {
           __ LoadImmediate(IP, imm);
-          __ eor(result, left, Operand(IP));
+          __ eor(result, left, compiler::Operand(IP));
         }
         break;
       }
@@ -3931,7 +3925,8 @@
         const intptr_t kCountLimit = 0x1F;
         intptr_t value = compiler::target::SmiValue(constant);
         __ Asr(result, left,
-               Operand(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+               compiler::Operand(
+                   Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(result);
         break;
       }
@@ -3947,18 +3942,18 @@
   switch (op_kind()) {
     case Token::kADD: {
       if (deopt == NULL) {
-        __ add(result, left, Operand(right));
+        __ add(result, left, compiler::Operand(right));
       } else {
-        __ adds(result, left, Operand(right));
+        __ adds(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
     }
     case Token::kSUB: {
       if (deopt == NULL) {
-        __ sub(result, left, Operand(right));
+        __ sub(result, left, compiler::Operand(right));
       } else {
-        __ subs(result, left, Operand(right));
+        __ subs(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
@@ -3970,31 +3965,31 @@
       } else {
         __ smull(result, IP, IP, right);
         // IP: result bits 32..63.
-        __ cmp(IP, Operand(result, ASR, 31));
+        __ cmp(IP, compiler::Operand(result, ASR, 31));
         __ b(deopt, NE);
       }
       break;
     }
     case Token::kBIT_AND: {
       // No overflow check.
-      __ and_(result, left, Operand(right));
+      __ and_(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_OR: {
       // No overflow check.
-      __ orr(result, left, Operand(right));
+      __ orr(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_XOR: {
       // No overflow check.
-      __ eor(result, left, Operand(right));
+      __ eor(result, left, compiler::Operand(right));
       break;
     }
     case Token::kTRUNCDIV: {
       ASSERT(TargetCPUFeatures::can_divide());
       if (RangeUtils::CanBeZero(right_range())) {
         // Handle divide by zero in runtime.
-        __ cmp(right, Operand(0));
+        __ cmp(right, compiler::Operand(0));
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
@@ -4016,7 +4011,7 @@
       ASSERT(TargetCPUFeatures::can_divide());
       if (RangeUtils::CanBeZero(right_range())) {
         // Handle divide by zero in runtime.
-        __ cmp(right, Operand(0));
+        __ cmp(right, compiler::Operand(0));
         __ b(deopt, EQ);
       }
       const Register temp = locs()->temp(0).reg();
@@ -4035,13 +4030,13 @@
       //      res = res + right;
       //    }
       //  }
-      Label done;
-      __ cmp(result, Operand(0));
+      compiler::Label done;
+      __ cmp(result, compiler::Operand(0));
       __ b(&done, GE);
       // Result is negative, adjust it.
-      __ cmp(right, Operand(0));
-      __ sub(result, result, Operand(right), LT);
-      __ add(result, result, Operand(right), GE);
+      __ cmp(right, compiler::Operand(0));
+      __ sub(result, result, compiler::Operand(right), LT);
+      __ add(result, result, compiler::Operand(right), GE);
       __ Bind(&done);
       break;
     }
@@ -4087,10 +4082,11 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   ASSERT(locs.in(1).IsConstant());
   const Object& constant = locs.in(1).constant();
   ASSERT(compiler::target::IsSmi(constant));
@@ -4100,12 +4096,12 @@
   ASSERT((0 < value) && (value < kCountLimit));
   if (shift_left->can_overflow()) {
     // Check for overflow (preserve left).
-    __ Lsl(IP, left, Operand(value));
-    __ cmp(left, Operand(IP, ASR, value));
+    __ Lsl(IP, left, compiler::Operand(value));
+    __ cmp(left, compiler::Operand(IP, ASR, value));
     __ b(deopt, NE);  // Overflow.
   }
   // Shift for result now we know there is no overflow.
-  __ Lsl(result, left, Operand(value));
+  __ Lsl(result, left, compiler::Operand(value));
 }
 
 LocationSummary* BinaryInt32OpInstr::MakeLocationSummary(Zone* zone,
@@ -4139,7 +4135,7 @@
 
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -4177,50 +4173,51 @@
           __ LoadImmediate(IP, value);
           __ smull(result, IP, left, IP);
           // IP: result bits 32..63.
-          __ cmp(IP, Operand(result, ASR, 31));
+          __ cmp(IP, compiler::Operand(result, ASR, 31));
           __ b(deopt, NE);
         }
         break;
       }
       case Token::kBIT_AND: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(value, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(value, &o)) {
           __ and_(result, left, o);
-        } else if (Operand::CanHold(~value, &o)) {
+        } else if (compiler::Operand::CanHold(~value, &o)) {
           __ bic(result, left, o);
         } else {
           __ LoadImmediate(IP, value);
-          __ and_(result, left, Operand(IP));
+          __ and_(result, left, compiler::Operand(IP));
         }
         break;
       }
       case Token::kBIT_OR: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(value, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(value, &o)) {
           __ orr(result, left, o);
         } else {
           __ LoadImmediate(IP, value);
-          __ orr(result, left, Operand(IP));
+          __ orr(result, left, compiler::Operand(IP));
         }
         break;
       }
       case Token::kBIT_XOR: {
         // No overflow check.
-        Operand o;
-        if (Operand::CanHold(value, &o)) {
+        compiler::Operand o;
+        if (compiler::Operand::CanHold(value, &o)) {
           __ eor(result, left, o);
         } else {
           __ LoadImmediate(IP, value);
-          __ eor(result, left, Operand(IP));
+          __ eor(result, left, compiler::Operand(IP));
         }
         break;
       }
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        __ Asr(result, left, Operand(Utils::Minimum(value, kCountLimit)));
+        __ Asr(result, left,
+               compiler::Operand(Utils::Minimum(value, kCountLimit)));
         break;
       }
 
@@ -4235,18 +4232,18 @@
   switch (op_kind()) {
     case Token::kADD: {
       if (deopt == NULL) {
-        __ add(result, left, Operand(right));
+        __ add(result, left, compiler::Operand(right));
       } else {
-        __ adds(result, left, Operand(right));
+        __ adds(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
     }
     case Token::kSUB: {
       if (deopt == NULL) {
-        __ sub(result, left, Operand(right));
+        __ sub(result, left, compiler::Operand(right));
       } else {
-        __ subs(result, left, Operand(right));
+        __ subs(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
@@ -4257,24 +4254,24 @@
       } else {
         __ smull(result, IP, left, right);
         // IP: result bits 32..63.
-        __ cmp(IP, Operand(result, ASR, 31));
+        __ cmp(IP, compiler::Operand(result, ASR, 31));
         __ b(deopt, NE);
       }
       break;
     }
     case Token::kBIT_AND: {
       // No overflow check.
-      __ and_(result, left, Operand(right));
+      __ and_(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_OR: {
       // No overflow check.
-      __ orr(result, left, Operand(right));
+      __ orr(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_XOR: {
       // No overflow check.
-      __ eor(result, left, Operand(right));
+      __ eor(result, left, compiler::Operand(right));
       break;
     }
     default:
@@ -4298,7 +4295,7 @@
 }
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
                              licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
@@ -4306,14 +4303,14 @@
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
-    __ tst(left, Operand(kSmiTagMask));
+    __ tst(left, compiler::Operand(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ tst(right, Operand(kSmiTagMask));
+    __ tst(right, compiler::Operand(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ tst(left, Operand(kSmiTagMask));
+    __ tst(left, compiler::Operand(kSmiTagMask));
   } else {
-    __ orr(IP, left, Operand(right));
-    __ tst(IP, Operand(kSmiTagMask));
+    __ orr(IP, left, compiler::Operand(right));
+    __ tst(IP, compiler::Operand(kSmiTagMask));
   }
   __ b(deopt, EQ);
 }
@@ -4448,7 +4445,7 @@
 void UnboxInstr::EmitLoadInt32FromBoxOrSmi(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label done;
+  compiler::Label done;
   __ SmiUntag(result, value, &done);
   __ LoadFieldFromOffset(kWord, result, value,
                          compiler::target::Mint::value_offset());
@@ -4460,7 +4457,7 @@
   PairLocation* result = locs()->out(0).AsPairLocation();
   ASSERT(result->At(0).reg() != box);
   ASSERT(result->At(1).reg() != box);
-  Label done;
+  compiler::Label done;
   __ SignFill(result->At(1).reg(), box);
   __ SmiUntag(result->At(0).reg(), box, &done);
   EmitLoadFromBox(compiler);
@@ -4493,9 +4490,9 @@
   __ SmiTag(out, value);
   if (!ValueFitsSmi()) {
     Register temp = locs()->temp(0).reg();
-    Label done;
+    compiler::Label done;
     if (from_representation() == kUnboxedInt32) {
-      __ cmp(value, Operand(out, ASR, 1));
+      __ cmp(value, compiler::Operand(out, ASR, 1));
     } else {
       ASSERT(from_representation() == kUnboxedUint32);
       // Note: better to test upper bits instead of comparing with
@@ -4506,10 +4503,11 @@
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                     temp);
     if (from_representation() == kUnboxedInt32) {
-      __ Asr(temp, value, Operand(compiler::target::kBitsPerWord - 1));
+      __ Asr(temp, value,
+             compiler::Operand(compiler::target::kBitsPerWord - 1));
     } else {
       ASSERT(from_representation() == kUnboxedUint32);
-      __ eor(temp, temp, Operand(temp));
+      __ eor(temp, temp, compiler::Operand(temp));
     }
     __ StoreToOffset(kWord, value, out,
                      compiler::target::Mint::value_offset() - kHeapObjectTag);
@@ -4552,10 +4550,10 @@
   Register tmp = locs()->temp(0).reg();
   Register out_reg = locs()->out(0).reg();
 
-  Label done;
+  compiler::Label done;
   __ SmiTag(out_reg, value_lo);
-  __ cmp(value_lo, Operand(out_reg, ASR, kSmiTagSize));
-  __ cmp(value_hi, Operand(out_reg, ASR, 31), EQ);
+  __ cmp(value_lo, compiler::Operand(out_reg, ASR, kSmiTagSize));
+  __ cmp(value_hi, compiler::Operand(out_reg, ASR, 31), EQ);
   __ b(&done, EQ);
 
   BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
@@ -4572,14 +4570,15 @@
                               Register mint,
                               Register result,
                               Register temp,
-                              Label* deopt) {
+                              compiler::Label* deopt) {
   __ LoadFieldFromOffset(kWord, result, mint,
                          compiler::target::Mint::value_offset());
   if (deopt != NULL) {
     __ LoadFieldFromOffset(
         kWord, temp, mint,
         compiler::target::Mint::value_offset() + compiler::target::kWordSize);
-    __ cmp(temp, Operand(result, ASR, compiler::target::kBitsPerWord - 1));
+    __ cmp(temp,
+           compiler::Operand(result, ASR, compiler::target::kBitsPerWord - 1));
     __ b(deopt, NE);
   }
 }
@@ -4606,10 +4605,11 @@
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
   const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       GetDeoptId(), ICData::kDeoptUnboxInteger)
-                                 : NULL;
-  Label* out_of_range = !is_truncating() ? deopt : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
+  compiler::Label* out_of_range = !is_truncating() ? deopt : NULL;
   ASSERT(value != out);
 
   if (value_cid == kSmiCid) {
@@ -4617,12 +4617,12 @@
   } else if (value_cid == kMintCid) {
     LoadInt32FromMint(compiler, value, out, temp, out_of_range);
   } else if (!CanDeoptimize()) {
-    Label done;
+    compiler::Label done;
     __ SmiUntag(out, value, &done);
     LoadInt32FromMint(compiler, value, out, kNoRegister, NULL);
     __ Bind(&done);
   } else {
-    Label done;
+    compiler::Label done;
     __ SmiUntag(out, value, &done);
     __ CompareClassId(value, kMintCid, temp);
     __ b(deopt, NE);
@@ -4691,10 +4691,10 @@
   } else {
     ASSERT(op_kind() == MethodRecognizer::kDouble_getIsInfinite);
     const Register temp = locs()->temp(0).reg();
-    Label done;
+    compiler::Label done;
     // TMP <- value[0:31], result <- value[32:63]
     __ vmovrrd(TMP, temp, value);
-    __ cmp(TMP, Operand(0));
+    __ cmp(TMP, compiler::Operand(0));
     __ b(is_negated ? labels.true_label : labels.false_label, NE);
 
     // Mask off the sign bit.
@@ -4865,19 +4865,19 @@
             (Register out, FixedQRegisterView<Q5> value, Temp<Register> temp)) {
   // X lane.
   __ vmovrs(out, value.s(0));
-  __ Lsr(out, out, Operand(31));
+  __ Lsr(out, out, compiler::Operand(31));
   // Y lane.
   __ vmovrs(temp, value.s(1));
-  __ Lsr(temp, temp, Operand(31));
-  __ orr(out, out, Operand(temp, LSL, 1));
+  __ Lsr(temp, temp, compiler::Operand(31));
+  __ orr(out, out, compiler::Operand(temp, LSL, 1));
   // Z lane.
   __ vmovrs(temp, value.s(2));
-  __ Lsr(temp, temp, Operand(31));
-  __ orr(out, out, Operand(temp, LSL, 2));
+  __ Lsr(temp, temp, compiler::Operand(31));
+  __ orr(out, out, compiler::Operand(temp, LSL, 2));
   // W lane.
   __ vmovrs(temp, value.s(3));
-  __ Lsr(temp, temp, Operand(31));
-  __ orr(out, out, Operand(temp, LSL, 3));
+  __ Lsr(temp, temp, compiler::Operand(31));
+  __ orr(out, out, compiler::Operand(temp, LSL, 3));
 }
 
 // Low (< 7) Q registers are needed for the vcvtsd instruction.
@@ -5023,11 +5023,11 @@
             (Register out, FixedQRegisterView<Q6> value)) {
   // Upper 32-bits of X lane.
   __ vmovrs(out, value.s(1));
-  __ Lsr(out, out, Operand(31));
+  __ Lsr(out, out, compiler::Operand(31));
   // Upper 32-bits of Y lane.
   __ vmovrs(TMP, value.s(3));
-  __ Lsr(TMP, TMP, Operand(31));
-  __ orr(out, out, Operand(TMP, LSL, 1));
+  __ Lsr(TMP, TMP, compiler::Operand(31));
+  __ orr(out, out, compiler::Operand(TMP, LSL, 1));
 }
 
 DEFINE_EMIT(Float64x2Unary, (QRegisterView result, QRegisterView value)) {
@@ -5111,16 +5111,16 @@
   __ LoadImmediate(temp, 0xffffffff);
 
   __ LoadObject(IP, Bool::True());
-  __ cmp(v0, Operand(IP));
+  __ cmp(v0, compiler::Operand(IP));
   __ vmovdr(result.d(0), 0, temp, EQ);
 
-  __ cmp(v1, Operand(IP));
+  __ cmp(v1, compiler::Operand(IP));
   __ vmovdr(result.d(0), 1, temp, EQ);
 
-  __ cmp(v2, Operand(IP));
+  __ cmp(v2, compiler::Operand(IP));
   __ vmovdr(result.d(1), 0, temp, EQ);
 
-  __ cmp(v3, Operand(IP));
+  __ cmp(v3, compiler::Operand(IP));
   __ vmovdr(result.d(1), 1, temp, EQ);
 }
 
@@ -5144,7 +5144,7 @@
       UNREACHABLE();
   }
 
-  __ tst(result, Operand(result));
+  __ tst(result, compiler::Operand(result));
   __ LoadObject(result, Bool::True(), NE);
   __ LoadObject(result, Bool::False(), EQ);
 }
@@ -5400,7 +5400,7 @@
          (op_kind() == MethodRecognizer::kMathMax));
   const intptr_t is_min = (op_kind() == MethodRecognizer::kMathMin);
   if (result_cid() == kDoubleCid) {
-    Label done, returns_nan, are_equal;
+    compiler::Label done, returns_nan, are_equal;
     const DRegister left = EvenDRegisterOf(locs()->in(0).fpu_reg());
     const DRegister right = EvenDRegisterOf(locs()->in(1).fpu_reg());
     const DRegister result = EvenDRegisterOf(locs()->out(0).fpu_reg());
@@ -5428,7 +5428,7 @@
     // - max -> left is negative ? right : left
     // Check the sign bit.
     __ vmovrrd(IP, temp, left);  // Sign bit is in bit 31 of temp.
-    __ cmp(temp, Operand(0));
+    __ cmp(temp, compiler::Operand(0));
     if (is_min) {
       ASSERT(left == result);
       __ vmovd(result, right, GE);
@@ -5444,12 +5444,12 @@
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   const Register result = locs()->out(0).reg();
-  __ cmp(left, Operand(right));
+  __ cmp(left, compiler::Operand(right));
   ASSERT(result == left);
   if (is_min) {
-    __ mov(result, Operand(right), GT);
+    __ mov(result, compiler::Operand(right), GT);
   } else {
-    __ mov(result, Operand(right), LT);
+    __ mov(result, compiler::Operand(right), LT);
   }
 }
 
@@ -5471,15 +5471,16 @@
   const Register result = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
-      __ rsbs(result, value, Operand(0));
+      compiler::Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+      __ rsbs(result, value, compiler::Operand(0));
       __ b(deopt, VS);
       break;
     }
     case Token::kBIT_NOT:
-      __ mvn(result, Operand(value));
+      __ mvn(result, compiler::Operand(value));
       // Remove inverted smi-tag.
-      __ bic(result, result, Operand(kSmiTagMask));
+      __ bic(result, result, compiler::Operand(kSmiTagMask));
       break;
     default:
       UNREACHABLE();
@@ -5569,7 +5570,7 @@
   __ LoadDFromOffset(DTMP, value_obj,
                      compiler::target::Double::value_offset() - kHeapObjectTag);
 
-  Label done, do_call;
+  compiler::Label done, do_call;
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM because vcvtid gives 0 for NaN.
   __ vcmpd(DTMP, DTMP);
@@ -5613,7 +5614,8 @@
 }
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   const Register result = locs()->out(0).reg();
   const DRegister value = EvenDRegisterOf(locs()->in(0).fpu_reg());
   // First check for NaN. Checking for minint after the conversion doesn't work
@@ -5737,7 +5739,7 @@
   const DRegister saved_base = OddDRegisterOf(locs->in(0).fpu_reg());
   ASSERT((base == result) && (result != saved_base));
 
-  Label skip_call, try_sqrt, check_base, return_nan;
+  compiler::Label skip_call, try_sqrt, check_base, return_nan;
   __ vmovd(saved_base, base);
   __ LoadDImmediate(result, 1.0, temp);
   // exponent == 0.0 -> return 1.0;
@@ -5749,14 +5751,14 @@
   // exponent == 1.0 ?
   __ vcmpd(exp, result);
   __ vmstat();
-  Label return_base;
+  compiler::Label return_base;
   __ b(&return_base, EQ);
 
   // exponent == 2.0 ?
   __ LoadDImmediate(DTMP, 2.0, temp);
   __ vcmpd(exp, DTMP);
   __ vmstat();
-  Label return_base_times_2;
+  compiler::Label return_base_times_2;
   __ b(&return_base_times_2, EQ);
 
   // exponent == 3.0 ?
@@ -5794,7 +5796,7 @@
   __ LoadDImmediate(result, NAN, temp);
   __ b(&skip_call);
 
-  Label do_pow, return_zero;
+  compiler::Label do_pow, return_zero;
   __ Bind(&try_sqrt);
 
   // Before calling pow, check if we could use sqrt instead of pow.
@@ -5911,7 +5913,7 @@
     ASSERT(representation() == kTagged);
     const Register out = locs()->out(0).reg();
     const Register in = in_loc.reg();
-    __ mov(out, Operand(in));
+    __ mov(out, compiler::Operand(in));
   }
 }
 
@@ -5934,7 +5936,8 @@
 
 void TruncDivModInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(CanDeoptimize());
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
 
   ASSERT(TargetCPUFeatures::can_divide());
   const Register left = locs()->in(0).reg();
@@ -5945,7 +5948,7 @@
   const Register result_mod = pair->At(1).reg();
   if (RangeUtils::CanBeZero(divisor_range())) {
     // Handle divide by zero in runtime.
-    __ cmp(right, Operand(0));
+    __ cmp(right, compiler::Operand(0));
     __ b(deopt, EQ);
   }
   const Register temp = locs()->temp(0).reg();
@@ -5972,13 +5975,13 @@
   //      res = res + right;
   //    }
   //  }
-  Label done;
-  __ cmp(result_mod, Operand(0));
+  compiler::Label done;
+  __ cmp(result_mod, compiler::Operand(0));
   __ b(&done, GE);
   // Result is negative, adjust it.
-  __ cmp(right, Operand(0));
-  __ sub(result_mod, result_mod, Operand(right), LT);
-  __ add(result_mod, result_mod, Operand(right), GE);
+  __ cmp(right, compiler::Operand(0));
+  __ sub(result_mod, result_mod, compiler::Operand(right), LT);
+  __ add(result_mod, result_mod, compiler::Operand(right), GE);
   __ Bind(&done);
 }
 
@@ -6016,7 +6019,8 @@
   return summary;
 }
 
-void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler, Label* deopt) {
+void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler,
+                                    compiler::Label* deopt) {
   __ CompareObject(locs()->in(0).reg(), Object::null_object());
   ASSERT(IsDeoptIfNull() || IsDeoptIfNotNull());
   Condition cond = IsDeoptIfNull() ? EQ : NE;
@@ -6027,7 +6031,7 @@
                                   intptr_t min,
                                   intptr_t max,
                                   intptr_t mask,
-                                  Label* deopt) {
+                                  compiler::Label* deopt) {
   Register biased_cid = locs()->temp(0).reg();
   __ AddImmediate(biased_cid, -min);
   __ CompareImmediate(biased_cid, max - min);
@@ -6045,8 +6049,8 @@
                                   intptr_t cid_start,
                                   intptr_t cid_end,
                                   bool is_last,
-                                  Label* is_ok,
-                                  Label* deopt,
+                                  compiler::Label* is_ok,
+                                  compiler::Label* deopt,
                                   bool use_near_jump) {
   Register biased_cid = locs()->temp(0).reg();
   Condition no_match, match;
@@ -6083,8 +6087,8 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  compiler::Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptCheckSmi, licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
 
@@ -6142,7 +6146,8 @@
 
 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
   if (cids_.IsSingleCid()) {
     __ CompareImmediate(value, compiler::target::ToRawSmi(cids_.cid_start));
     __ b(deopt, NE);
@@ -6167,7 +6172,7 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
@@ -6198,7 +6203,7 @@
     }
     if (compiler::target::SmiValue(length_loc.constant()) ==
         compiler::target::kSmiMax) {
-      __ tst(index, Operand(index));
+      __ tst(index, compiler::Operand(index));
       __ b(deopt, MI);
     } else {
       __ CompareImmediate(index,
@@ -6211,7 +6216,7 @@
     if (index_cid != kSmiCid) {
       __ BranchIfNotSmi(index, deopt);
     }
-    __ cmp(index, Operand(length));
+    __ cmp(index, compiler::Operand(length));
     __ b(deopt, CS);
   }
 }
@@ -6249,28 +6254,28 @@
 
   switch (op_kind()) {
     case Token::kBIT_AND: {
-      __ and_(out_lo, left_lo, Operand(right_lo));
-      __ and_(out_hi, left_hi, Operand(right_hi));
+      __ and_(out_lo, left_lo, compiler::Operand(right_lo));
+      __ and_(out_hi, left_hi, compiler::Operand(right_hi));
       break;
     }
     case Token::kBIT_OR: {
-      __ orr(out_lo, left_lo, Operand(right_lo));
-      __ orr(out_hi, left_hi, Operand(right_hi));
+      __ orr(out_lo, left_lo, compiler::Operand(right_lo));
+      __ orr(out_hi, left_hi, compiler::Operand(right_hi));
       break;
     }
     case Token::kBIT_XOR: {
-      __ eor(out_lo, left_lo, Operand(right_lo));
-      __ eor(out_hi, left_hi, Operand(right_hi));
+      __ eor(out_lo, left_lo, compiler::Operand(right_lo));
+      __ eor(out_hi, left_hi, compiler::Operand(right_hi));
       break;
     }
     case Token::kADD: {
-      __ adds(out_lo, left_lo, Operand(right_lo));
-      __ adcs(out_hi, left_hi, Operand(right_hi));
+      __ adds(out_lo, left_lo, compiler::Operand(right_lo));
+      __ adcs(out_hi, left_hi, compiler::Operand(right_hi));
       break;
     }
     case Token::kSUB: {
-      __ subs(out_lo, left_lo, Operand(right_lo));
-      __ sbcs(out_hi, left_hi, Operand(right_hi));
+      __ subs(out_lo, left_lo, compiler::Operand(right_lo));
+      __ sbcs(out_hi, left_hi, compiler::Operand(right_hi));
       break;
     }
     case Token::kMUL: {
@@ -6280,7 +6285,7 @@
       __ mul(temp, left_lo, right_hi);
       __ mla(out_hi, left_hi, right_lo, temp);
       __ umull(out_lo, temp, left_lo, right_lo);
-      __ add(out_hi, out_hi, Operand(temp));
+      __ add(out_hi, out_hi, compiler::Operand(temp));
       break;
     }
     default:
@@ -6301,34 +6306,34 @@
   switch (op_kind) {
     case Token::kSHR: {
       if (shift < 32) {
-        __ Lsl(out_lo, left_hi, Operand(32 - shift));
-        __ orr(out_lo, out_lo, Operand(left_lo, LSR, shift));
-        __ Asr(out_hi, left_hi, Operand(shift));
+        __ Lsl(out_lo, left_hi, compiler::Operand(32 - shift));
+        __ orr(out_lo, out_lo, compiler::Operand(left_lo, LSR, shift));
+        __ Asr(out_hi, left_hi, compiler::Operand(shift));
       } else {
         if (shift == 32) {
-          __ mov(out_lo, Operand(left_hi));
+          __ mov(out_lo, compiler::Operand(left_hi));
         } else if (shift < 64) {
-          __ Asr(out_lo, left_hi, Operand(shift - 32));
+          __ Asr(out_lo, left_hi, compiler::Operand(shift - 32));
         } else {
-          __ Asr(out_lo, left_hi, Operand(31));
+          __ Asr(out_lo, left_hi, compiler::Operand(31));
         }
-        __ Asr(out_hi, left_hi, Operand(31));
+        __ Asr(out_hi, left_hi, compiler::Operand(31));
       }
       break;
     }
     case Token::kSHL: {
       ASSERT(shift < 64);
       if (shift < 32) {
-        __ Lsr(out_hi, left_lo, Operand(32 - shift));
-        __ orr(out_hi, out_hi, Operand(left_hi, LSL, shift));
-        __ Lsl(out_lo, left_lo, Operand(shift));
+        __ Lsr(out_hi, left_lo, compiler::Operand(32 - shift));
+        __ orr(out_hi, out_hi, compiler::Operand(left_hi, LSL, shift));
+        __ Lsl(out_lo, left_lo, compiler::Operand(shift));
       } else {
         if (shift == 32) {
-          __ mov(out_hi, Operand(left_lo));
+          __ mov(out_hi, compiler::Operand(left_lo));
         } else {
-          __ Lsl(out_hi, left_lo, Operand(shift - 32));
+          __ Lsl(out_hi, left_lo, compiler::Operand(shift - 32));
         }
-        __ mov(out_lo, Operand(0));
+        __ mov(out_lo, compiler::Operand(0));
       }
       break;
     }
@@ -6346,21 +6351,21 @@
                                      Register right) {
   switch (op_kind) {
     case Token::kSHR: {
-      __ rsbs(IP, right, Operand(32));
-      __ sub(IP, right, Operand(32), MI);
-      __ mov(out_lo, Operand(left_hi, ASR, IP), MI);
-      __ mov(out_lo, Operand(left_lo, LSR, right), PL);
-      __ orr(out_lo, out_lo, Operand(left_hi, LSL, IP), PL);
-      __ mov(out_hi, Operand(left_hi, ASR, right));
+      __ rsbs(IP, right, compiler::Operand(32));
+      __ sub(IP, right, compiler::Operand(32), MI);
+      __ mov(out_lo, compiler::Operand(left_hi, ASR, IP), MI);
+      __ mov(out_lo, compiler::Operand(left_lo, LSR, right), PL);
+      __ orr(out_lo, out_lo, compiler::Operand(left_hi, LSL, IP), PL);
+      __ mov(out_hi, compiler::Operand(left_hi, ASR, right));
       break;
     }
     case Token::kSHL: {
-      __ rsbs(IP, right, Operand(32));
-      __ sub(IP, right, Operand(32), MI);
-      __ mov(out_hi, Operand(left_lo, LSL, IP), MI);
-      __ mov(out_hi, Operand(left_hi, LSL, right), PL);
-      __ orr(out_hi, out_hi, Operand(left_lo, LSR, IP), PL);
-      __ mov(out_lo, Operand(left_lo, LSL, right));
+      __ rsbs(IP, right, compiler::Operand(32));
+      __ sub(IP, right, compiler::Operand(32), MI);
+      __ mov(out_hi, compiler::Operand(left_lo, LSL, IP), MI);
+      __ mov(out_hi, compiler::Operand(left_hi, LSL, right), PL);
+      __ orr(out_hi, out_hi, compiler::Operand(left_lo, LSR, IP), PL);
+      __ mov(out_lo, compiler::Operand(left_lo, LSL, right));
       break;
     }
     default:
@@ -6380,10 +6385,10 @@
   } else {
     switch (op_kind) {
       case Token::kSHR:
-        __ Lsr(out, left, Operand(shift));
+        __ Lsr(out, left, compiler::Operand(shift));
         break;
       case Token::kSHL:
-        __ Lsl(out, left, Operand(shift));
+        __ Lsl(out, left, compiler::Operand(shift));
         break;
       default:
         UNREACHABLE();
@@ -6434,9 +6439,9 @@
 
     switch (instruction()->AsShiftInt64Op()->op_kind()) {
       case Token::kSHR:
-        __ Asr(out_hi, left_hi, Operand(compiler::target::kBitsPerWord - 1),
-               GE);
-        __ mov(out_lo, Operand(out_hi), GE);
+        __ Asr(out_hi, left_hi,
+               compiler::Operand(compiler::target::kBitsPerWord - 1), GE);
+        __ mov(out_lo, compiler::Operand(out_hi), GE);
         break;
       case Token::kSHL: {
         __ LoadImmediate(out_lo, 0, GE);
@@ -6559,7 +6564,7 @@
     // Deopt if shift is larger than 63 or less than 0 (or not a smi).
     if (!IsShiftCountInRange()) {
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
       __ CompareImmediate(shift, kShiftCountLimit);
@@ -6698,7 +6703,7 @@
     // Deopt if shift count is negative.
     if (!shift_count_in_range) {
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
       __ CompareImmediate(right, 0);
@@ -6738,35 +6743,19 @@
 
   switch (op_kind()) {
     case Token::kBIT_NOT:
-      __ mvn(out_lo, Operand(left_lo));
-      __ mvn(out_hi, Operand(left_hi));
+      __ mvn(out_lo, compiler::Operand(left_lo));
+      __ mvn(out_hi, compiler::Operand(left_hi));
       break;
     case Token::kNEGATE:
-      __ rsbs(out_lo, left_lo, Operand(0));
-      __ sbc(out_hi, out_hi, Operand(out_hi));
-      __ sub(out_hi, out_hi, Operand(left_hi));
+      __ rsbs(out_lo, left_lo, compiler::Operand(0));
+      __ sbc(out_hi, out_hi, compiler::Operand(out_hi));
+      __ sub(out_hi, out_hi, compiler::Operand(left_hi));
       break;
     default:
       UNREACHABLE();
   }
 }
 
-CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6786,19 +6775,19 @@
   ASSERT(out != left);
   switch (op_kind()) {
     case Token::kBIT_AND:
-      __ and_(out, left, Operand(right));
+      __ and_(out, left, compiler::Operand(right));
       break;
     case Token::kBIT_OR:
-      __ orr(out, left, Operand(right));
+      __ orr(out, left, compiler::Operand(right));
       break;
     case Token::kBIT_XOR:
-      __ eor(out, left, Operand(right));
+      __ eor(out, left, compiler::Operand(right));
       break;
     case Token::kADD:
-      __ add(out, left, Operand(right));
+      __ add(out, left, compiler::Operand(right));
       break;
     case Token::kSUB:
-      __ sub(out, left, Operand(right));
+      __ sub(out, left, compiler::Operand(right));
       break;
     case Token::kMUL:
       __ mul(out, left, right);
@@ -6826,7 +6815,7 @@
 
   ASSERT(op_kind() == Token::kBIT_NOT);
 
-  __ mvn(out, Operand(left));
+  __ mvn(out, compiler::Operand(left));
 }
 
 LocationSummary* IntConverterInstr::MakeLocationSummary(Zone* zone,
@@ -6880,9 +6869,9 @@
     // Representations are bitwise equivalent.
     ASSERT(out == locs()->in(0).reg());
     if (CanDeoptimize()) {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
-      __ tst(out, Operand(out));
+      __ tst(out, compiler::Operand(out));
       __ b(deopt, MI);
     }
   } else if (from() == kUnboxedInt64) {
@@ -6892,12 +6881,13 @@
     Register in_hi = in_pair->At(1).reg();
     Register out = locs()->out(0).reg();
     // Copy low word.
-    __ mov(out, Operand(in_lo));
+    __ mov(out, compiler::Operand(in_lo));
     if (CanDeoptimize()) {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
       ASSERT(to() == kUnboxedInt32);
-      __ cmp(in_hi, Operand(in_lo, ASR, compiler::target::kBitsPerWord - 1));
+      __ cmp(in_hi,
+             compiler::Operand(in_lo, ASR, compiler::target::kBitsPerWord - 1));
       __ b(deopt, NE);
     }
   } else if (from() == kUnboxedUint32 || from() == kUnboxedInt32) {
@@ -6907,12 +6897,13 @@
     Register out_lo = out_pair->At(0).reg();
     Register out_hi = out_pair->At(1).reg();
     // Copy low word.
-    __ mov(out_lo, Operand(in));
+    __ mov(out_lo, compiler::Operand(in));
     if (from() == kUnboxedUint32) {
-      __ eor(out_hi, out_hi, Operand(out_hi));
+      __ eor(out_hi, out_hi, compiler::Operand(out_hi));
     } else {
       ASSERT(from() == kUnboxedInt32);
-      __ mov(out_hi, Operand(in, ASR, compiler::target::kBitsPerWord - 1));
+      __ mov(out_hi,
+             compiler::Operand(in, ASR, compiler::target::kBitsPerWord - 1));
     }
   } else {
     UNREACHABLE();
@@ -6937,13 +6928,13 @@
   // use shifts instead.
   const intptr_t shift_length =
       (compiler::target::kWordSize - from_width_bytes()) * kBitsPerByte;
-  __ Lsl(reg, reg, Operand(shift_length));
+  __ Lsl(reg, reg, compiler::Operand(shift_length));
   switch (representation_) {
     case kUnboxedInt32:  // Sign extend operand.
-      __ Asr(reg, reg, Operand(shift_length));
+      __ Asr(reg, reg, compiler::Operand(shift_length));
       break;
     case kUnboxedUint32:  // Zero extend operand.
-      __ Lsr(reg, reg, Operand(shift_length));
+      __ Lsr(reg, reg, compiler::Operand(shift_length));
       break;
     default:
       UNREACHABLE();
@@ -7114,13 +7105,14 @@
 
   // Offset is relative to entry pc.
   const intptr_t entry_to_pc_offset = __ CodeSize() + Instr::kPCReadOffset;
-  __ mov(target_address_reg, Operand(PC));
+  __ mov(target_address_reg, compiler::Operand(PC));
   __ AddImmediate(target_address_reg, -entry_to_pc_offset);
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  Operand offset_opr = (offset()->definition()->representation() == kTagged)
-                           ? Operand(offset_reg, ASR, kSmiTagSize)
-                           : Operand(offset_reg);
+  compiler::Operand offset_opr =
+      (offset()->definition()->representation() == kTagged)
+          ? compiler::Operand(offset_reg, ASR, kSmiTagSize)
+          : compiler::Operand(offset_reg);
   __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
@@ -7192,7 +7184,7 @@
 
 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // The ARM code may not use true- and false-labels here.
-  Label is_true, is_false, done;
+  compiler::Label is_true, is_false, done;
   BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
 
@@ -7236,7 +7228,7 @@
   const Register result = locs()->out(0).reg();
 
   __ LoadObject(result, Bool::True());
-  __ cmp(result, Operand(value));
+  __ cmp(result, compiler::Operand(value));
   __ LoadObject(result, Bool::False(), EQ);
 }
 
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index 7f375ea..59f3811 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -39,8 +39,8 @@
 
 DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
   ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ add(out, instr->base_reg(), Operand(index, LSL, 2));
-  __ ldr(out, Address(out, instr->offset()));
+  __ add(out, instr->base_reg(), compiler::Operand(index, LSL, 2));
+  __ ldr(out, compiler::Address(out, instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -50,8 +50,8 @@
                (NoLocation, Register index, Register value)) {
   ASSERT(instr->RequiredInputRepresentation(
              StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
-  __ add(TMP, instr->base_reg(), Operand(index, LSL, 2));
-  __ str(value, Address(TMP, instr->offset()));
+  __ add(TMP, instr->base_reg(), compiler::Operand(index, LSL, 2));
+  __ str(value, compiler::Address(TMP, instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -63,7 +63,7 @@
                 Temp<Register> temp)) {
   __ LoadObject(CODE_REG, instr->code());
   __ LeaveDartFrame();  // The arguments are still on the stack.
-  __ ldr(temp, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ ldr(temp, compiler::FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ br(temp);
 
   // Even though the TailCallInstr will be the last instruction in a basic
@@ -124,14 +124,14 @@
   }
 
 #if defined(DEBUG)
-  Label stack_ok;
+  compiler::Label stack_ok;
   __ Comment("Stack Check");
   const intptr_t fp_sp_dist =
       (compiler::target::frame_layout.first_local_from_fp + 1 -
        compiler->StackSize()) *
       kWordSize;
   ASSERT(fp_sp_dist <= 0);
-  __ sub(R2, SP, Operand(FP));
+  __ sub(R2, SP, compiler::Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist);
   __ b(&stack_ok, EQ);
   __ brk(0);
@@ -231,7 +231,7 @@
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
     __ LslImmediate(result, result, shift + kSmiTagSize);
   } else {
-    __ sub(result, result, Operand(1));
+    __ sub(result, result, compiler::Operand(1));
     const int64_t val = Smi::RawValue(true_value) - Smi::RawValue(false_value);
     __ AndImmediate(result, result, val);
     if (false_value != 0) {
@@ -490,7 +490,7 @@
   // Check that the type of the value is allowed in conditional context.
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
-  Label done;
+  compiler::Label done;
 
   __ CompareObject(reg, Object::null_instance());
   __ b(&done, NE);
@@ -708,7 +708,7 @@
     const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
     __ TestImmediate(left, imm);
   } else {
-    __ tst(left, Operand(right.reg()));
+    __ tst(left, compiler::Operand(right.reg()));
   }
   Condition true_condition = (kind() == Token::kNE) ? NE : EQ;
   return true_condition;
@@ -732,10 +732,11 @@
   const Register val_reg = locs()->in(0).reg();
   const Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       deopt_id(), ICData::kDeoptTestCids,
-                                       licm_hoisted_ ? ICData::kHoisted : 0)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
@@ -756,7 +757,7 @@
     // If the cid is not in the list, jump to the opposite label from the cids
     // that are in the list.  These must be all the same (see asserts in the
     // constructor).
-    Label* target = result ? labels.false_label : labels.true_label;
+    compiler::Label* target = result ? labels.false_label : labels.true_label;
     if (target != labels.fall_through) {
       __ b(target);
     }
@@ -856,7 +857,7 @@
     }
   }
   __ LoadImmediate(R1, argc_tag);
-  ExternalLabel label(entry);
+  compiler::ExternalLabel label(entry);
   __ LoadNativeEntry(R5, &label,
                      link_lazily() ? ObjectPool::Patchability::kPatchable
                                    : ObjectPool::Patchability::kNotPatchable);
@@ -905,30 +906,46 @@
   //
   // ADR loads relative to itself, so add kInstrSize to point to the next
   // instruction.
-  __ adr(temp, Immediate(Instr::kInstrSize));
+  __ adr(temp, compiler::Immediate(Instr::kInstrSize));
   compiler->EmitCallsiteMetadata(token_pos(), DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
 
   __ StoreToOffset(temp, FPREG, kSavedCallerPcSlotFromFp * kWordSize);
 
-  // Update information in the thread object and enter a safepoint.
-  __ TransitionGeneratedToNative(branch, FPREG, temp);
+  if (CanExecuteGeneratedCodeInSafepoint()) {
+    // Update information in the thread object and enter a safepoint.
+    __ TransitionGeneratedToNative(branch, FPREG, temp);
 
-  // We are entering runtime code, so the C stack pointer must be restored from
-  // the stack limit to the top of the stack.
-  __ mov(CSP, SP);
+    // We are entering runtime code, so the C stack pointer must be restored
+    // from the stack limit to the top of the stack.
+    __ mov(CSP, SP);
 
-  __ blr(branch);
+    __ blr(branch);
 
-  // Restore the Dart stack pointer.
-  __ mov(SP, CSP);
+    // Restore the Dart stack pointer.
+    __ mov(SP, CSP);
 
-  // Update information in the thread object and leave the safepoint.
-  __ TransitionNativeToGenerated(temp);
+    // Update information in the thread object and leave the safepoint.
+    __ TransitionNativeToGenerated(temp);
+  } else {
+    // We cannot trust that this code will be executable within a safepoint.
+    // Therefore we delegate the responsibility of entering/exiting the
+    // safepoint to a stub which in the VM isolate's heap, which will never lose
+    // execute permission.
+    __ ldr(TMP,
+           compiler::Address(
+               THR, compiler::target::Thread::
+                        call_native_through_safepoint_entry_point_offset()));
+
+    // Calls R8 and clobbers R19 (along with volatile registers).
+    ASSERT(branch == R8 && temp == R19);
+    __ blr(TMP);
+  }
 
   // Refresh write barrier mask.
   __ ldr(BARRIER_MASK,
-         Address(THR, compiler::target::Thread::write_barrier_mask_offset()));
+         compiler::Address(
+             THR, compiler::target::Thread::write_barrier_mask_offset()));
 
   // Although PP is a callee-saved register, it may have been moved by the GC.
   __ LeaveDartFrame(compiler::kRestoreCallerPP);
@@ -936,8 +953,9 @@
   // 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) {
-    __ ldr(PP, Address(THR, Thread::global_object_pool_offset()));
-    __ sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
+    __ ldr(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
+    __ sub(PP, PP,
+           compiler::Operand(kHeapObjectTag));  // Pool in PP is untagged!
   }
 
   __ set_constant_pool_allowed(true);
@@ -1045,7 +1063,8 @@
 
   // Refresh write barrier mask.
   __ ldr(BARRIER_MASK,
-         Address(THR, compiler::target::Thread::write_barrier_mask_offset()));
+         compiler::Address(
+             THR, compiler::target::Thread::write_barrier_mask_offset()));
 
   // Save the current VMTag on the stack.
   __ LoadFromOffset(R0, THR, compiler::target::Thread::vm_tag_offset());
@@ -1094,9 +1113,10 @@
   __ StoreToOffset(CODE_REG, FPREG,
                    kPcMarkerSlotFromFp * compiler::target::kWordSize);
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    __ ldr(PP,
-           Address(THR, compiler::target::Thread::global_object_pool_offset()));
-    __ sub(PP, PP, Operand(kHeapObjectTag));  // Pool in PP is untagged!
+    __ ldr(PP, compiler::Address(
+                   THR, compiler::target::Thread::global_object_pool_offset()));
+    __ sub(PP, PP,
+           compiler::Operand(kHeapObjectTag));  // Pool in PP is untagged!
   } else {
     // We now load the pool pointer (PP) with a GC safe value as we are about to
     // invoke dart code. We don't need a real object pool here.
@@ -1131,10 +1151,12 @@
   const Register char_code = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
 
-  __ ldr(result, Address(THR, Thread::predefined_symbols_address_offset()));
+  __ ldr(result,
+         compiler::Address(THR, Thread::predefined_symbols_address_offset()));
   __ AddImmediate(result, Symbols::kNullCharCodeSymbolOffset * kWordSize);
   __ SmiUntag(TMP, char_code);  // Untag to use scaled address mode.
-  __ ldr(result, Address(result, TMP, UXTX, Address::Scaled));
+  __ ldr(result,
+         compiler::Address(result, TMP, UXTX, compiler::Address::Scaled));
 }
 
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
@@ -1149,7 +1171,8 @@
   const Register str = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   __ LoadFieldFromOffset(result, str, String::length_offset());
-  __ ldr(TMP, FieldAddress(str, OneByteString::data_offset()), kUnsignedByte);
+  __ ldr(TMP, compiler::FieldAddress(str, OneByteString::data_offset()),
+         kUnsignedByte);
   __ CompareImmediate(result, Smi::RawValue(1));
   __ LoadImmediate(result, -1);
   __ csel(result, TMP, result, EQ);
@@ -1222,46 +1245,6 @@
   }
 }
 
-CompileType LoadIndexedInstr::ComputeType() const {
-  switch (class_id_) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return CompileType::Dynamic();
-
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
-      return CompileType::FromCid(kDoubleCid);
-    case kTypedDataFloat32x4ArrayCid:
-      return CompileType::FromCid(kFloat32x4Cid);
-    case kTypedDataInt32x4ArrayCid:
-      return CompileType::FromCid(kInt32x4Cid);
-    case kTypedDataFloat64x2ArrayCid:
-      return CompileType::FromCid(kFloat64x2Cid);
-
-    case kTypedDataInt8ArrayCid:
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-    case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid:
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-      return CompileType::FromCid(kSmiCid);
-    case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
-      return CompileType::Int();
-
-    default:
-      UNIMPLEMENTED();
-      return CompileType::Dynamic();
-  }
-}
-
 Representation LoadIndexedInstr::representation() const {
   switch (class_id_) {
     case kArrayCid:
@@ -1314,8 +1297,9 @@
   if (!Utils::IsInt(32, offset)) {
     return false;
   }
-  return Address::CanHoldOffset(static_cast<int32_t>(offset), Address::Offset,
-                                Address::OperandSizeFor(cid));
+  return compiler::Address::CanHoldOffset(
+      static_cast<int32_t>(offset), compiler::Address::Offset,
+      compiler::Address::OperandSizeFor(cid));
 }
 
 LocationSummary* LoadIndexedInstr::MakeLocationSummary(Zone* zone,
@@ -1350,7 +1334,7 @@
   const Location index = locs()->in(1);
   const Register address = aligned() ? kNoRegister : locs()->temp(0).reg();
 
-  Address element_address(TMP);  // Bad address.
+  compiler::Address element_address(TMP);  // Bad address.
   if (aligned()) {
     element_address =
         index.IsRegister()
@@ -1496,7 +1480,7 @@
   const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = __ ElementAddressForRegIndex(
+  compiler::Address element_address = __ ElementAddressForRegIndex(
       true, IsExternal(), class_id(), index_scale(), str, index.reg());
   // Warning: element_address may use register TMP as base.
 
@@ -1662,10 +1646,11 @@
                           /*lr_reserved=*/!compiler->intrinsic_mode());
       } else if (locs()->in(2).IsConstant()) {
         const Object& constant = locs()->in(2).constant();
-        __ StoreIntoObjectNoBarrier(array, Address(address), constant);
+        __ StoreIntoObjectNoBarrier(array, compiler::Address(address),
+                                    constant);
       } else {
         const Register value = locs()->in(2).reg();
-        __ StoreIntoObjectNoBarrier(array, Address(address), value);
+        __ StoreIntoObjectNoBarrier(array, compiler::Address(address), value);
       }
       break;
     case kTypedDataInt8ArrayCid:
@@ -1677,10 +1662,10 @@
       if (locs()->in(2).IsConstant()) {
         const Smi& constant = Smi::Cast(locs()->in(2).constant());
         __ LoadImmediate(TMP, static_cast<int8_t>(constant.Value()));
-        __ str(TMP, Address(address), kUnsignedByte);
+        __ str(TMP, compiler::Address(address), kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
-        __ str(value, Address(address), kUnsignedByte);
+        __ str(value, compiler::Address(address), kUnsignedByte);
       }
       break;
     }
@@ -1698,14 +1683,14 @@
           value = 0;
         }
         __ LoadImmediate(TMP, static_cast<int8_t>(value));
-        __ str(TMP, Address(address), kUnsignedByte);
+        __ str(TMP, compiler::Address(address), kUnsignedByte);
       } else {
         const Register value = locs()->in(2).reg();
         // Clamp to 0x00 or 0xFF respectively.
         __ CompareImmediate(value, 0xFF);
         __ csetm(TMP, GT);             // TMP = value > 0xFF ? -1 : 0.
         __ csel(TMP, value, TMP, LS);  // TMP = value in range ? value : TMP.
-        __ str(TMP, Address(address), kUnsignedByte);
+        __ str(TMP, compiler::Address(address), kUnsignedByte);
       }
       break;
     }
@@ -1714,7 +1699,7 @@
       ASSERT(RequiredInputRepresentation(2) == kUnboxedIntPtr);
       const Register value = locs()->in(2).reg();
       if (aligned()) {
-        __ str(value, Address(address), kUnsignedHalfword);
+        __ str(value, compiler::Address(address), kUnsignedHalfword);
       } else {
         __ StoreUnaligned(value, address, scratch, kUnsignedHalfword);
       }
@@ -1724,7 +1709,7 @@
     case kTypedDataUint32ArrayCid: {
       const Register value = locs()->in(2).reg();
       if (aligned()) {
-        __ str(value, Address(address), kUnsignedWord);
+        __ str(value, compiler::Address(address), kUnsignedWord);
       } else {
         __ StoreUnaligned(value, address, scratch, kUnsignedWord);
       }
@@ -1734,7 +1719,7 @@
     case kTypedDataUint64ArrayCid: {
       const Register value = locs()->in(2).reg();
       if (aligned()) {
-        __ str(value, Address(address), kDoubleWord);
+        __ str(value, compiler::Address(address), kDoubleWord);
       } else {
         __ StoreUnaligned(value, address, scratch, kDoubleWord);
       }
@@ -1743,7 +1728,7 @@
     case kTypedDataFloat32ArrayCid: {
       const VRegister value_reg = locs()->in(2).fpu_reg();
       if (aligned()) {
-        __ fstrs(value_reg, Address(address));
+        __ fstrs(value_reg, compiler::Address(address));
       } else {
         __ fmovrs(TMP, value_reg);
         __ StoreUnaligned(TMP, address, scratch, kWord);
@@ -1753,7 +1738,7 @@
     case kTypedDataFloat64ArrayCid: {
       const VRegister value_reg = locs()->in(2).fpu_reg();
       if (aligned()) {
-        __ fstrd(value_reg, Address(address));
+        __ fstrd(value_reg, compiler::Address(address));
       } else {
         __ fmovrd(TMP, value_reg);
         __ StoreUnaligned(TMP, address, scratch, kDoubleWord);
@@ -1765,7 +1750,7 @@
     case kTypedDataFloat32x4ArrayCid: {
       ASSERT(aligned());
       const VRegister value_reg = locs()->in(2).fpu_reg();
-      __ fstrq(value_reg, Address(address));
+      __ fstrq(value_reg, compiler::Address(address));
       break;
     }
     default:
@@ -1776,8 +1761,8 @@
 static void LoadValueCid(FlowGraphCompiler* compiler,
                          Register value_cid_reg,
                          Register value_reg,
-                         Label* value_is_smi = NULL) {
-  Label done;
+                         compiler::Label* value_is_smi = NULL) {
+  compiler::Label done;
   if (value_is_smi == NULL) {
     __ LoadImmediate(value_cid_reg, kSmiCid);
   }
@@ -1849,26 +1834,26 @@
                                  ? locs()->temp(locs()->temp_count() - 1).reg()
                                  : kNoRegister;
 
-  Label ok, fail_label;
+  compiler::Label ok, fail_label;
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
 
-  Label* fail = (deopt != NULL) ? deopt : &fail_label;
+  compiler::Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle((field().Original())));
 
-    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset(),
-                                   kUnsignedHalfword);
-    FieldAddress field_nullability_operand(
+    compiler::FieldAddress field_cid_operand(
+        field_reg, Field::guarded_cid_offset(), kUnsignedHalfword);
+    compiler::FieldAddress field_nullability_operand(
         field_reg, Field::is_nullable_offset(), kUnsignedHalfword);
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
-      Label skip_length_check;
+      compiler::Label skip_length_check;
       __ ldr(TMP, field_cid_operand, kUnsignedHalfword);
       __ CompareRegisters(value_cid_reg, TMP);
       __ b(&ok, EQ);
@@ -1878,7 +1863,7 @@
       __ ldr(value_cid_reg, field_nullability_operand, kUnsignedHalfword);
       __ CompareImmediate(value_cid_reg, value_cid);
     } else {
-      Label skip_length_check;
+      compiler::Label skip_length_check;
       __ ldr(value_cid_reg, field_cid_operand, kUnsignedHalfword);
       __ CompareImmediate(value_cid_reg, value_cid);
     }
@@ -1932,7 +1917,7 @@
     // Field guard class has been initialized and is known.
     if (value_cid == kDynamicCid) {
       // Value's class id is not known.
-      __ tsti(value_reg, Immediate(kSmiTagMask));
+      __ tsti(value_reg, compiler::Immediate(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
         __ b(fail, EQ);
@@ -1982,7 +1967,7 @@
     return;  // Nothing to emit.
   }
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
@@ -1995,25 +1980,25 @@
     const Register offset_reg = locs()->temp(1).reg();
     const Register length_reg = locs()->temp(2).reg();
 
-    Label ok;
+    compiler::Label ok;
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     __ ldr(offset_reg,
-           FieldAddress(field_reg,
-                        Field::guarded_list_length_in_object_offset_offset()),
+           compiler::FieldAddress(
+               field_reg, Field::guarded_list_length_in_object_offset_offset()),
            kByte);
-    __ ldr(length_reg,
-           FieldAddress(field_reg, Field::guarded_list_length_offset()));
+    __ ldr(length_reg, compiler::FieldAddress(
+                           field_reg, Field::guarded_list_length_offset()));
 
-    __ tst(offset_reg, Operand(offset_reg));
+    __ tst(offset_reg, compiler::Operand(offset_reg));
     __ b(&ok, MI);
 
     // Load the length from the value. GuardFieldClass already verified that
     // 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, Address(value_reg, offset_reg));
+    __ ldr(TMP, compiler::Address(value_reg, offset_reg));
     __ CompareRegisters(length_reg, TMP);
 
     if (deopt == NULL) {
@@ -2034,8 +2019,8 @@
     ASSERT(field().guarded_list_length_in_object_offset() !=
            Field::kUnknownLengthOffset);
 
-    __ ldr(TMP, FieldAddress(value_reg,
-                             field().guarded_list_length_in_object_offset()));
+    __ ldr(TMP, compiler::FieldAddress(
+                    value_reg, field().guarded_list_length_in_object_offset()));
     __ CompareImmediate(TMP, Smi::RawValue(field().guarded_list_length()));
     __ b(deopt, NE);
   }
@@ -2049,7 +2034,7 @@
       : TemplateSlowPathCode(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("%s slow path allocation of %s", instruction()->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
@@ -2098,14 +2083,14 @@
                              Register instance_reg,
                              intptr_t offset,
                              Register temp) {
-  Label done;
+  compiler::Label done;
   __ LoadFieldFromOffset(box_reg, instance_reg, offset);
   __ CompareObject(box_reg, Object::null_object());
   __ b(&done, NE);
   BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ MoveRegister(temp, box_reg);
   __ StoreIntoObjectOffset(instance_reg, offset, temp,
-                           Assembler::kValueIsNotSmi,
+                           compiler::Assembler::kValueIsNotSmi,
                            /*lr_reserved=*/!compiler->intrinsic_mode());
   __ Bind(&done);
 }
@@ -2142,10 +2127,11 @@
 
 void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(sizeof(classid_t) == kInt16Size);
-  Label skip_store;
+  compiler::Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
   const intptr_t offset_in_bytes = OffsetInBytes();
+  ASSERT(offset_in_bytes > 0);  // Field is finalized and points after header.
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     const VRegister value = locs()->in(1).fpu_reg();
@@ -2172,7 +2158,7 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ MoveRegister(temp2, temp);
       __ StoreIntoObjectOffset(instance_reg, offset_in_bytes, temp2,
-                               Assembler::kValueIsNotSmi,
+                               compiler::Assembler::kValueIsNotSmi,
                                /*lr_reserved=*/!compiler->intrinsic_mode());
     } else {
       __ LoadFieldFromOffset(temp, instance_reg, offset_in_bytes);
@@ -2208,10 +2194,10 @@
       locs()->live_registers()->Add(locs()->in(1), kTagged);
     }
 
-    Label store_pointer;
-    Label store_double;
-    Label store_float32x4;
-    Label store_float64x2;
+    compiler::Label store_pointer;
+    compiler::Label store_double;
+    compiler::Label store_float32x4;
+    compiler::Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
@@ -2222,7 +2208,7 @@
 
     __ LoadFromOffset(temp2, temp, Field::kind_bits_offset() - kHeapObjectTag,
                       kUnsignedByte);
-    __ tsti(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
+    __ tsti(temp2, compiler::Immediate(1 << Field::kUnboxingCandidateBit));
     __ b(&store_pointer, EQ);
 
     __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(),
@@ -2383,8 +2369,8 @@
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
                                   intptr_t num_elements,
-                                  Label* slow_path,
-                                  Label* done) {
+                                  compiler::Label* slow_path,
+                                  compiler::Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R2;
   const Register kElemTypeReg = R1;
@@ -2399,11 +2385,12 @@
 
   // Store the type argument field.
   __ StoreIntoObjectNoBarrier(
-      R0, FieldAddress(R0, Array::type_arguments_offset()), kElemTypeReg);
+      R0, compiler::FieldAddress(R0, Array::type_arguments_offset()),
+      kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(R0, FieldAddress(R0, Array::length_offset()),
-                              kLengthReg);
+  __ StoreIntoObjectNoBarrier(
+      R0, compiler::FieldAddress(R0, Array::length_offset()), kLengthReg);
 
   // TODO(zra): Use stp once added.
   // Initialize all array elements to raw_null.
@@ -2419,15 +2406,15 @@
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       while (current_offset < array_size) {
-        __ str(R6, Address(R8, current_offset));
+        __ str(R6, compiler::Address(R8, current_offset));
         current_offset += kWordSize;
       }
     } else {
-      Label end_loop, init_loop;
+      compiler::Label end_loop, init_loop;
       __ Bind(&init_loop);
       __ CompareRegisters(R8, R3);
       __ b(&end_loop, CS);
-      __ str(R6, Address(R8));
+      __ str(R6, compiler::Address(R8));
       __ AddImmediate(R8, kWordSize);
       __ b(&init_loop);
       __ Bind(&end_loop);
@@ -2457,7 +2444,7 @@
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
     if (Array::IsValidLength(length)) {
-      Label slow_path, done;
+      compiler::Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
@@ -2523,21 +2510,21 @@
     return;
   }
 
-  Label done;
+  compiler::Label done;
   const Register result_reg = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
     const Register temp = locs()->temp(0).reg();
 
-    Label load_pointer;
-    Label load_double;
-    Label load_float32x4;
-    Label load_float64x2;
+    compiler::Label load_pointer;
+    compiler::Label load_double;
+    compiler::Label load_float32x4;
+    compiler::Label load_float64x2;
 
     __ LoadObject(result_reg, Field::ZoneHandle(slot().field().Original()));
 
-    FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset(),
-                                   kUnsignedHalfword);
-    FieldAddress field_nullability_operand(
+    compiler::FieldAddress field_cid_operand(
+        result_reg, Field::guarded_cid_offset(), kUnsignedHalfword);
+    compiler::FieldAddress field_nullability_operand(
         result_reg, Field::is_nullable_offset(), kUnsignedHalfword);
 
     __ ldr(temp, field_nullability_operand, kUnsignedHalfword);
@@ -2659,10 +2646,10 @@
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
-  Label type_arguments_instantiated;
+  compiler::Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawWhenInstantiatedFromRaw(len)) {
-    Label non_null_type_args;
+    compiler::Label non_null_type_args;
     __ CompareObject(instantiator_type_args_reg, Object::null_object());
     __ b(&non_null_type_args, NE);
     __ CompareObject(function_type_args_reg, Object::null_object());
@@ -2678,7 +2665,7 @@
   __ AddImmediate(R3, Array::data_offset() - kHeapObjectTag);
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
-  Label loop, next, found, slow_case;
+  compiler::Label loop, next, found, slow_case;
   __ Bind(&loop);
   __ LoadFromOffset(R2, R3, 0 * kWordSize);  // Cached instantiator type args.
   __ CompareRegisters(R2, instantiator_type_args_reg);
@@ -2767,7 +2754,8 @@
 
   // Setup up number of context variables field.
   __ LoadImmediate(temp0, num_context_variables());
-  __ str(temp0, FieldAddress(result, Context::num_variables_offset()));
+  __ str(temp0,
+         compiler::FieldAddress(result, Context::num_variables_offset()));
 
   __ Bind(slow_path->exit_label());
 }
@@ -2806,9 +2794,9 @@
 void InitStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register temp = locs()->temp(0).reg();
-  Label call_runtime, no_call;
+  compiler::Label call_runtime, no_call;
 
-  __ ldr(temp, FieldAddress(field, Field::static_value_offset()));
+  __ ldr(temp, compiler::FieldAddress(field, Field::static_value_offset()));
   __ CompareObject(temp, Object::sentinel());
   __ b(&call_runtime, EQ);
 
@@ -2924,7 +2912,8 @@
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
       __ LoadImmediate(value, Thread::kOsrRequest);
-      __ str(value, Address(THR, Thread::stack_overflow_flags_offset()));
+      __ str(value,
+             compiler::Address(THR, Thread::stack_overflow_flags_offset()));
     }
     __ Comment("CheckStackOverflowSlowPath");
     __ Bind(entry_label());
@@ -2957,7 +2946,7 @@
         const uword entry_point_offset =
             Thread::stack_overflow_shared_stub_entry_point_offset(
                 locs->live_registers()->FpuRegisterCount() > 0);
-        __ ldr(LR, Address(THR, entry_point_offset));
+        __ ldr(LR, compiler::Address(THR, entry_point_offset));
         __ blr(LR);
       }
       compiler->RecordSafepoint(locs, kNumSlowPathArgs);
@@ -2986,20 +2975,20 @@
     __ b(exit_label());
   }
 
-  Label* osr_entry_label() {
+  compiler::Label* osr_entry_label() {
     ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
  private:
-  Label osr_entry_label_;
+  compiler::Label osr_entry_label_;
 };
 
 void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
-  __ ldr(TMP, Address(THR, Thread::stack_limit_offset()));
+  __ ldr(TMP, compiler::Address(THR, Thread::stack_limit_offset()));
   __ CompareRegisters(SP, TMP);
   __ b(slow_path->entry_label(), LS);
   if (compiler->CanOSRFunction() && in_loop()) {
@@ -3012,7 +3001,7 @@
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
     __ LoadFieldFromOffset(TMP, function, Function::usage_counter_offset(),
                            kWord);
-    __ add(TMP, TMP, Operand(1));
+    __ add(TMP, TMP, compiler::Operand(1));
     __ StoreFieldToOffset(TMP, function, Function::usage_counter_offset(),
                           kWord);
     __ CompareImmediate(TMP, threshold);
@@ -3029,10 +3018,11 @@
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -3043,7 +3033,7 @@
     if (shift_left->can_overflow()) {
       // Check for overflow (preserve left).
       __ LslImmediate(TMP, left, value);
-      __ cmp(left, Operand(TMP, ASR, value));
+      __ cmp(left, compiler::Operand(TMP, ASR, value));
       __ b(deopt, NE);  // Overflow.
     }
     // Shift for result now we know there is no overflow.
@@ -3129,7 +3119,7 @@
       : TemplateSlowPathCode(instruction), try_index_(try_index) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
     }
     __ Bind(entry_label());
@@ -3192,17 +3182,17 @@
     __ BranchIfNotSmi(left, slow_path->entry_label());
   } else {
     combined_smi_check = true;
-    __ orr(result, left, Operand(right));
+    __ orr(result, left, compiler::Operand(right));
     __ BranchIfNotSmi(result, slow_path->entry_label());
   }
 
   switch (op_kind()) {
     case Token::kADD:
-      __ adds(result, left, Operand(right));
+      __ adds(result, left, compiler::Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
     case Token::kSUB:
-      __ subs(result, left, Operand(right));
+      __ subs(result, left, compiler::Operand(right));
       __ b(slow_path->entry_label(), VS);
       break;
     case Token::kMUL:
@@ -3210,20 +3200,20 @@
       __ mul(result, TMP, right);
       __ smulh(TMP, TMP, right);
       // TMP: result bits 64..127.
-      __ cmp(TMP, Operand(result, ASR, 63));
+      __ cmp(TMP, compiler::Operand(result, ASR, 63));
       __ b(slow_path->entry_label(), NE);
       break;
     case Token::kBIT_OR:
       // Operation may be part of combined smi check.
       if (!combined_smi_check) {
-        __ orr(result, left, Operand(right));
+        __ orr(result, left, compiler::Operand(right));
       }
       break;
     case Token::kBIT_AND:
-      __ and_(result, left, Operand(right));
+      __ and_(result, left, compiler::Operand(right));
       break;
     case Token::kBIT_XOR:
-      __ eor(result, left, Operand(right));
+      __ eor(result, left, compiler::Operand(right));
       break;
     case Token::kSHL:
       ASSERT(result != left);
@@ -3271,7 +3261,7 @@
         merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
     }
     __ Bind(entry_label());
@@ -3349,7 +3339,7 @@
   } else if (right_cid == kSmiCid) {                                           \
     __ BranchIfNotSmi(left, slow_path->entry_label());                         \
   } else {                                                                     \
-    __ orr(temp, left, Operand(right));                                        \
+    __ orr(temp, left, compiler::Operand(right));                              \
     __ BranchIfNotSmi(temp, slow_path->entry_label());                         \
   }
 
@@ -3370,9 +3360,9 @@
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Zone-allocate labels to pass them to slow-path which outlives local scope.
-  Label* true_label = new (Z) Label();
-  Label* false_label = new (Z) Label();
-  Label done;
+  compiler::Label* true_label = new (Z) compiler::Label();
+  compiler::Label* false_label = new (Z) compiler::Label();
+  compiler::Label done;
   BranchLabels labels = {true_label, false_label, false_label};
   // In case of negated comparison result of a slow path call should be negated.
   // For this purpose, 'merged' slow path is generated: it tests
@@ -3444,7 +3434,7 @@
 
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -3482,7 +3472,7 @@
         if (deopt != NULL) {
           __ smulh(TMP, left, TMP);
           // TMP: result bits 64..127.
-          __ cmp(TMP, Operand(result, ASR, 63));
+          __ cmp(TMP, compiler::Operand(result, ASR, 63));
           __ b(deopt, NE);
         }
         break;
@@ -3497,11 +3487,11 @@
         __ AsrImmediate(TMP, left, 63);
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
         const Register temp = TMP2;
-        __ add(temp, left, Operand(TMP, LSR, 64 - shift_count));
+        __ add(temp, left, compiler::Operand(TMP, LSR, 64 - shift_count));
         ASSERT(shift_count > 0);
         __ AsrImmediate(result, temp, shift_count);
         if (value < 0) {
-          __ sub(result, ZR, Operand(result));
+          __ sub(result, ZR, compiler::Operand(result));
         }
         __ SmiTag(result);
         break;
@@ -3538,18 +3528,18 @@
   switch (op_kind()) {
     case Token::kADD: {
       if (deopt == NULL) {
-        __ add(result, left, Operand(right));
+        __ add(result, left, compiler::Operand(right));
       } else {
-        __ adds(result, left, Operand(right));
+        __ adds(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
     }
     case Token::kSUB: {
       if (deopt == NULL) {
-        __ sub(result, left, Operand(right));
+        __ sub(result, left, compiler::Operand(right));
       } else {
-        __ subs(result, left, Operand(right));
+        __ subs(result, left, compiler::Operand(right));
         __ b(deopt, VS);
       }
       break;
@@ -3562,24 +3552,24 @@
         __ mul(result, TMP, right);
         __ smulh(TMP, TMP, right);
         // TMP: result bits 64..127.
-        __ cmp(TMP, Operand(result, ASR, 63));
+        __ cmp(TMP, compiler::Operand(result, ASR, 63));
         __ b(deopt, NE);
       }
       break;
     }
     case Token::kBIT_AND: {
       // No overflow check.
-      __ and_(result, left, Operand(right));
+      __ and_(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_OR: {
       // No overflow check.
-      __ orr(result, left, Operand(right));
+      __ orr(result, left, compiler::Operand(right));
       break;
     }
     case Token::kBIT_XOR: {
       // No overflow check.
-      __ eor(result, left, Operand(right));
+      __ eor(result, left, compiler::Operand(right));
       break;
     }
     case Token::kTRUNCDIV: {
@@ -3625,13 +3615,13 @@
       //      res = res + right;
       //    }
       //  }
-      Label done;
+      compiler::Label done;
       __ CompareRegisters(result, ZR);
       __ b(&done, GE);
       // Result is negative, adjust it.
       __ CompareRegisters(right, ZR);
-      __ sub(TMP, result, Operand(right));
-      __ add(result, result, Operand(right));
+      __ sub(TMP, result, compiler::Operand(right));
+      __ add(result, result, compiler::Operand(right));
       __ csel(result, TMP, result, LT);
       __ Bind(&done);
       break;
@@ -3689,7 +3679,7 @@
 }
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
                              licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
@@ -3703,7 +3693,7 @@
   } else if (right_cid == kSmiCid) {
     __ BranchIfSmi(left, deopt);
   } else {
-    __ orr(TMP, left, Operand(right));
+    __ orr(TMP, left, compiler::Operand(right));
     __ BranchIfSmi(TMP, deopt);
   }
 }
@@ -3766,7 +3756,7 @@
   switch (representation()) {
     case kUnboxedInt64: {
       const Register result = locs()->out(0).reg();
-      __ ldr(result, FieldAddress(box, ValueOffset()));
+      __ ldr(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
@@ -3824,10 +3814,10 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(value != result);
-  Label done;
+  compiler::Label done;
   __ SmiUntag(result, value);
   __ BranchIfSmi(value, &done);
-  __ ldr(result, FieldAddress(value, Mint::value_offset()), kWord);
+  __ ldr(result, compiler::FieldAddress(value, Mint::value_offset()), kWord);
   __ LoadFieldFromOffset(result, value, Mint::value_offset());
   __ Bind(&done);
 }
@@ -3836,7 +3826,7 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(value != result);
-  Label done;
+  compiler::Label done;
   __ SmiUntag(result, value);
   __ BranchIfSmi(value, &done);
   __ LoadFieldFromOffset(result, value, Mint::value_offset());
@@ -3898,8 +3888,8 @@
 
   ASSERT(kSmiTag == 0);
   __ LslImmediate(out, in, kSmiTagSize);
-  Label done;
-  __ cmp(in, Operand(out, ASR, kSmiTagSize));
+  compiler::Label done;
+  __ cmp(in, compiler::Operand(out, ASR, kSmiTagSize));
   __ b(&done, EQ);
 
   Register temp = locs()->temp(0).reg();
@@ -3925,9 +3915,10 @@
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register out = locs()->out(0).reg();
   const Register value = locs()->in(0).reg();
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       GetDeoptId(), ICData::kDeoptUnboxInteger)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
 
   if (value_cid == kSmiCid) {
     __ SmiUntag(out, value);
@@ -3938,13 +3929,13 @@
     // the value to be in int64 range. Therefore it must be a smi
     // or mint value.
     ASSERT(is_truncating());
-    Label done;
+    compiler::Label done;
     __ SmiUntag(out, value);
     __ BranchIfSmi(value, &done);
     __ LoadFieldFromOffset(out, value, Mint::value_offset());
     __ Bind(&done);
   } else {
-    Label done;
+    compiler::Label done;
     __ SmiUntag(out, value);
     __ BranchIfSmi(value, &done);
     __ CompareClassId(value, kMintCid);
@@ -3957,7 +3948,7 @@
   // leave "garbage" in the higher word.
   if (!is_truncating() && (deopt != NULL)) {
     ASSERT(representation() == kUnboxedInt32);
-    __ cmp(out, Operand(out, SXTW, 0));
+    __ cmp(out, compiler::Operand(out, SXTW, 0));
     __ b(deopt, NE);
   }
 }
@@ -4202,15 +4193,15 @@
   // Y lane.
   __ vmovrs(temp, value, 1);
   __ LsrImmediate(temp, temp, 31);
-  __ orr(out, out, Operand(temp, LSL, 1));
+  __ orr(out, out, compiler::Operand(temp, LSL, 1));
   // Z lane.
   __ vmovrs(temp, value, 2);
   __ LsrImmediate(temp, temp, 31);
-  __ orr(out, out, Operand(temp, LSL, 2));
+  __ orr(out, out, compiler::Operand(temp, LSL, 2));
   // W lane.
   __ vmovrs(temp, value, 3);
   __ LsrImmediate(temp, temp, 31);
-  __ orr(out, out, Operand(temp, LSL, 3));
+  __ orr(out, out, compiler::Operand(temp, LSL, 3));
 }
 
 DEFINE_EMIT(
@@ -4272,7 +4263,7 @@
   // Bits of Y lane.
   __ vmovrd(TMP, value, 1);
   __ LsrImmediate(TMP, TMP, 63);
-  __ orr(out, out, Operand(TMP, LSL, 1));
+  __ orr(out, out, compiler::Operand(TMP, LSL, 1));
 }
 
 DEFINE_EMIT(Float64x2With,
@@ -4336,7 +4327,7 @@
       UNREACHABLE();
   }
 
-  __ tst(result, Operand(result));
+  __ tst(result, compiler::Operand(result));
   __ LoadObject(result, Bool::True());
   __ LoadObject(TMP, Bool::False());
   __ csel(result, TMP, result, EQ);
@@ -4564,7 +4555,7 @@
          (op_kind() == MethodRecognizer::kMathMax));
   const intptr_t is_min = (op_kind() == MethodRecognizer::kMathMin);
   if (result_cid() == kDoubleCid) {
-    Label done, returns_nan, are_equal;
+    compiler::Label done, returns_nan, are_equal;
     const VRegister left = locs()->in(0).fpu_reg();
     const VRegister right = locs()->in(1).fpu_reg();
     const VRegister result = locs()->out(0).fpu_reg();
@@ -4636,15 +4627,16 @@
   const Register result = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
-      __ subs(result, ZR, Operand(value));
+      compiler::Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+      __ subs(result, ZR, compiler::Operand(value));
       __ b(deopt, VS);
       break;
     }
     case Token::kBIT_NOT:
       __ mvn(result, value);
       // Remove inverted smi-tag.
-      __ andi(result, result, Immediate(~kSmiTagMask));
+      __ andi(result, result, compiler::Immediate(~kSmiTagMask));
       break;
     default:
       UNREACHABLE();
@@ -4738,7 +4730,7 @@
   ASSERT(result != value_obj);
   __ LoadDFieldFromOffset(VTMP, value_obj, Double::value_offset());
 
-  Label do_call, done;
+  compiler::Label do_call, done;
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM64 because fcvtzds gives 0 for NaN.
   __ fcmpd(VTMP, VTMP);
@@ -4780,7 +4772,8 @@
 }
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   const Register result = locs()->out(0).reg();
   const VRegister value = locs()->in(0).fpu_reg();
   // First check for NaN. Checking for minint after the conversion doesn't work
@@ -4886,7 +4879,7 @@
   const VRegister saved_base = locs->temp(0).fpu_reg();
   ASSERT((base == result) && (result != saved_base));
 
-  Label skip_call, try_sqrt, check_base, return_nan, do_pow;
+  compiler::Label skip_call, try_sqrt, check_base, return_nan, do_pow;
   __ fmovdd(saved_base, base);
   __ LoadDImmediate(result, 1.0);
   // exponent == 0.0 -> return 1.0;
@@ -4896,13 +4889,13 @@
 
   // exponent == 1.0 ?
   __ fcmpd(exp, result);
-  Label return_base;
+  compiler::Label return_base;
   __ b(&return_base, EQ);
 
   // exponent == 2.0 ?
   __ LoadDImmediate(VTMP, 2.0);
   __ fcmpd(exp, VTMP);
-  Label return_base_times_2;
+  compiler::Label return_base_times_2;
   __ b(&return_base_times_2, EQ);
 
   // exponent == 3.0 ?
@@ -4937,7 +4930,7 @@
   __ LoadDImmediate(result, NAN);
   __ b(&skip_call);
 
-  Label return_zero;
+  compiler::Label return_zero;
   __ Bind(&try_sqrt);
 
   // Before calling pow, check if we could use sqrt instead of pow.
@@ -5042,7 +5035,8 @@
 
 void TruncDivModInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(CanDeoptimize());
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   const Register left = locs()->in(0).reg();
   const Register right = locs()->in(1).reg();
   ASSERT(locs()->out(0).IsPairLocation());
@@ -5077,13 +5071,13 @@
   //      res = res + right;
   //    }
   //  }
-  Label done;
+  compiler::Label done;
   __ CompareRegisters(result_mod, ZR);
   __ b(&done, GE);
   // Result is negative, adjust it.
   __ CompareRegisters(right, ZR);
-  __ sub(TMP2, result_mod, Operand(right));
-  __ add(TMP, result_mod, Operand(right));
+  __ sub(TMP2, result_mod, compiler::Operand(right));
+  __ add(TMP, result_mod, compiler::Operand(right));
   __ csel(result_mod, TMP, TMP2, GE);
   __ Bind(&done);
 }
@@ -5122,7 +5116,8 @@
   return summary;
 }
 
-void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler, Label* deopt) {
+void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler,
+                                    compiler::Label* deopt) {
   __ CompareObject(locs()->in(0).reg(), Object::null_object());
   ASSERT(IsDeoptIfNull() || IsDeoptIfNotNull());
   Condition cond = IsDeoptIfNull() ? EQ : NE;
@@ -5133,7 +5128,7 @@
                                   intptr_t min,
                                   intptr_t max,
                                   intptr_t mask,
-                                  Label* deopt) {
+                                  compiler::Label* deopt) {
   Register biased_cid = locs()->temp(0).reg();
   __ AddImmediate(biased_cid, -min);
   __ CompareImmediate(biased_cid, max - min);
@@ -5151,8 +5146,8 @@
                                   intptr_t cid_start,
                                   intptr_t cid_end,
                                   bool is_last,
-                                  Label* is_ok,
-                                  Label* deopt,
+                                  compiler::Label* is_ok,
+                                  compiler::Label* deopt,
                                   bool use_near_jump) {
   Register biased_cid = locs()->temp(0).reg();
   Condition no_match, match;
@@ -5190,7 +5185,8 @@
 
 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
   if (cids_.IsSingleCid()) {
     __ CompareImmediate(value, Smi::RawValue(cids_.cid_start));
     __ b(deopt, NE);
@@ -5213,8 +5209,8 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  compiler::Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptCheckSmi, licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
 
@@ -5266,7 +5262,7 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
@@ -5302,7 +5298,7 @@
       __ BranchIfNotSmi(index, deopt);
     }
     if (length.Value() == Smi::kMaxValue) {
-      __ tst(index, Operand(index));
+      __ tst(index, compiler::Operand(index));
       __ b(deopt, MI);
     } else {
       __ CompareImmediate(index, reinterpret_cast<int64_t>(length.raw()));
@@ -5346,7 +5342,7 @@
       ThrowErrorSlowPathCode::EmitNativeCode(compiler);
     } else {
       __ Bind(entry_label());  // not used, but keeps destructor happy
-      if (Assembler::EmittingComments()) {
+      if (compiler::Assembler::EmittingComments()) {
         __ Comment("slow path %s operation (no throw)", name());
       }
     }
@@ -5360,15 +5356,15 @@
       if (RangeUtils::Overlaps(divisor_range_, -1, 1)) {
         // General case.
         __ CompareRegisters(divisor_, ZR);
-        __ sub(tmp_, out_, Operand(divisor_));
-        __ add(out_, out_, Operand(divisor_));
+        __ sub(tmp_, out_, compiler::Operand(divisor_));
+        __ add(out_, out_, compiler::Operand(divisor_));
         __ csel(out_, tmp_, out_, LT);
       } else if (divisor_range_->IsPositive()) {
         // Always positive.
-        __ add(out_, out_, Operand(divisor_));
+        __ add(out_, out_, compiler::Operand(divisor_));
       } else {
         // Always negative.
-        __ sub(out_, out_, Operand(divisor_));
+        __ sub(out_, out_, compiler::Operand(divisor_));
       }
       __ b(exit_label());
     }
@@ -5382,7 +5378,7 @@
 
   bool is_needed() { return has_divide_by_zero() || has_adjust_sign(); }
 
-  Label* adjust_sign_label() {
+  compiler::Label* adjust_sign_label() {
     ASSERT(has_adjust_sign());
     return &adjust_sign_label_;
   }
@@ -5393,7 +5389,7 @@
   Range* divisor_range_;
   Register tmp_;
   Register out_;
-  Label adjust_sign_label_;
+  compiler::Label adjust_sign_label_;
 };
 
 static void EmitInt64ModTruncDiv(FlowGraphCompiler* compiler,
@@ -5519,7 +5515,7 @@
         UNREACHABLE();
     }
   } else {
-    Operand r = Operand(right.reg());
+    compiler::Operand r = compiler::Operand(right.reg());
     switch (op_kind()) {
       case Token::kADD:
         __ add(out, left, r);
@@ -5642,7 +5638,7 @@
     const Register out = instruction()->locs()->out(0).reg();
     ASSERT((out != left) && (out != right));
 
-    Label throw_error;
+    compiler::Label throw_error;
     __ tbnz(&throw_error, right, kBitsPerWord - 1);
 
     switch (instruction()->AsShiftInt64Op()->op_kind()) {
@@ -5664,7 +5660,8 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+    __ str(right,
+           compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
   }
 };
 
@@ -5744,7 +5741,7 @@
     // Deopt if shift is larger than 63 or less than 0 (or not a smi).
     if (!IsShiftCountInRange()) {
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
       __ CompareImmediate(shift, kShiftCountLimit);
@@ -5775,7 +5772,8 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ str(right, Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
+    __ str(right,
+           compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()));
   }
 };
 
@@ -5858,7 +5856,7 @@
     if (!shift_count_in_range) {
       // Deoptimize if shift count is negative.
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
       __ tbnz(deopt, right, kBitsPerWord - 1);
@@ -5893,29 +5891,13 @@
       __ mvn(out, left);
       break;
     case Token::kNEGATE:
-      __ sub(out, ZR, Operand(left));
+      __ sub(out, ZR, compiler::Operand(left));
       break;
     default:
       UNREACHABLE();
   }
 }
 
-CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -5931,7 +5913,7 @@
 void BinaryUint32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
-  Operand r = Operand(right);
+  compiler::Operand r = compiler::Operand(right);
   Register out = locs()->out(0).reg();
   switch (op_kind()) {
     case Token::kBIT_AND:
@@ -6018,9 +6000,10 @@
 
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
-  Label* deopt = !CanDeoptimize() ? NULL
-                                  : compiler->AddDeoptStub(
-                                        deopt_id(), ICData::kDeoptUnboxInteger);
+  compiler::Label* deopt =
+      !CanDeoptimize()
+          ? NULL
+          : compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
   if (from() == kUnboxedInt32 && to() == kUnboxedUint32) {
     if (CanDeoptimize()) {
       __ tbnz(deopt, value,
@@ -6050,7 +6033,7 @@
     }
     if (CanDeoptimize()) {
       ASSERT(to() == kUnboxedInt32);
-      __ cmp(out, Operand(value));
+      __ cmp(out, compiler::Operand(value));
       __ b(deopt, NE);  // Value cannot be held in Int32, deopt.
     }
   } else if (to() == kUnboxedInt64) {
@@ -6187,17 +6170,18 @@
   // Load code entry point.
   const intptr_t entry_offset = __ CodeSize();
   if (Utils::IsInt(21, -entry_offset)) {
-    __ adr(target_address_reg, Immediate(-entry_offset));
+    __ adr(target_address_reg, compiler::Immediate(-entry_offset));
   } else {
-    __ adr(target_address_reg, Immediate(0));
+    __ adr(target_address_reg, compiler::Immediate(0));
     __ AddImmediate(target_address_reg, -entry_offset);
   }
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
-  Operand offset_opr = (offset()->definition()->representation() == kTagged)
-                           ? Operand(offset_reg, ASR, kSmiTagSize)
-                           : Operand(offset_reg);
+  compiler::Operand offset_opr =
+      (offset()->definition()->representation() == kTagged)
+          ? compiler::Operand(offset_reg, ASR, kSmiTagSize)
+          : compiler::Operand(offset_reg);
   __ add(target_address_reg, target_address_reg, offset_opr);
 
   // Jump to the absolute address.
@@ -6254,7 +6238,7 @@
 }
 
 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label is_true, is_false;
+  compiler::Label is_true, is_false;
   BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   const Register result = this->locs()->out(0).reg();
@@ -6263,7 +6247,7 @@
   if (true_condition != kInvalidCondition) {
     EmitBranchOnCondition(compiler, true_condition, labels);
   }
-  Label done;
+  compiler::Label done;
   __ Bind(&is_false);
   __ LoadObject(result, Bool::False());
   __ b(&done);
diff --git a/runtime/vm/compiler/backend/il_dbc.cc b/runtime/vm/compiler/backend/il_dbc.cc
index c0a3402..7ac0079 100644
--- a/runtime/vm/compiler/backend/il_dbc.cc
+++ b/runtime/vm/compiler/backend/il_dbc.cc
@@ -560,7 +560,7 @@
 }
 
 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label is_true, is_false;
+  compiler::Label is_true, is_false;
   BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition =
       this->GetNextInstructionCondition(compiler, labels);
@@ -571,7 +571,7 @@
     if (true_condition != INVALID_CONDITION) {
       EmitBranchOnCondition(compiler, true_condition, labels);
     }
-    Label done;
+    compiler::Label done;
     __ Bind(&is_false);
     __ PushConstant(Bool::False());
     __ Jump(&done);
@@ -598,7 +598,7 @@
     // the correct boolean.
     if ((next_is_true && is_false.IsLinked()) ||
         (!next_is_true && is_true.IsLinked())) {
-      Label done;
+      compiler::Label done;
       __ Jump(&done);
       __ Bind(next_is_true ? &is_false : &is_true);
       __ LoadConstant(result, Bool::Get(!next_is_true));
@@ -687,7 +687,7 @@
     // If the cid is not in the list, jump to the opposite label from the cids
     // that are in the list.  These must be all the same (see asserts in the
     // constructor).
-    Label* target = result ? labels.false_label : labels.true_label;
+    compiler::Label* target = result ? labels.false_label : labels.true_label;
     __ Jump(target);
   }
 
@@ -1035,11 +1035,12 @@
     function = native_c_function();
   }
 
-  const ExternalLabel trampoline_label(reinterpret_cast<uword>(trampoline));
+  const compiler::ExternalLabel trampoline_label(
+      reinterpret_cast<uword>(trampoline));
   const intptr_t trampoline_kidx =
       __ object_pool_builder().FindNativeFunctionWrapper(
           &trampoline_label, ObjectPool::Patchability::kPatchable);
-  const ExternalLabel label(reinterpret_cast<uword>(function));
+  const compiler::ExternalLabel label(reinterpret_cast<uword>(function));
   const intptr_t target_kidx = __ object_pool_builder().FindNativeFunction(
       &label, ObjectPool::Patchability::kPatchable);
   const intptr_t argc_tag_kidx =
@@ -1138,6 +1139,7 @@
 }
 
 EMIT_NATIVE_CODE(StoreInstanceField, 2) {
+  ASSERT(OffsetInBytes() > 0);  // Field is finalized and points after header.
   ASSERT(OffsetInBytes() % kWordSize == 0);
   if (compiler->is_optimizing()) {
     const Register value = locs()->in(1).reg();
@@ -1363,66 +1365,6 @@
   return result;
 }
 
-CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType LoadIndexedInstr::ComputeType() const {
-  switch (class_id_) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return CompileType::Dynamic();
-
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
-      return CompileType::FromCid(kDoubleCid);
-    case kTypedDataFloat32x4ArrayCid:
-      return CompileType::FromCid(kFloat32x4Cid);
-    case kTypedDataInt32x4ArrayCid:
-      return CompileType::FromCid(kInt32x4Cid);
-    case kTypedDataFloat64x2ArrayCid:
-      return CompileType::FromCid(kFloat64x2Cid);
-
-    case kTypedDataInt8ArrayCid:
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-      return CompileType::Int();
-
-    // These are unsupported on DBC and will cause a bailout during
-    // EmitNativeCode.
-    case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid:
-    case kExternalTwoByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
-    default:
-      UNREACHABLE();
-      return CompileType::Dynamic();
-  }
-}
-
 Representation LoadIndexedInstr::representation() const {
   switch (class_id_) {
     case kArrayCid:
@@ -1818,7 +1760,7 @@
 
 EMIT_NATIVE_CODE(BoxInt64, 1, Location::RequiresRegister()) {
 #if defined(ARCH_IS_64_BIT)
-  Label done;
+  compiler::Label done;
   const Register value = locs()->in(0).reg();
   const Register out = locs()->out(0).reg();
   __ BoxInt64(out, value);
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 77aee55..487ec60 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -42,7 +42,8 @@
 
 DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
   ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ movl(out, Address(instr->base_reg(), index, TIMES_2, instr->offset()));
+  __ movl(out, compiler::Address(instr->base_reg(), index, TIMES_2,
+                                 instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -52,7 +53,8 @@
                (NoLocation, Register index, Register value)) {
   ASSERT(instr->RequiredInputRepresentation(
              StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
-  __ movl(Address(instr->base_reg(), index, TIMES_2, instr->offset()), value);
+  __ movl(compiler::Address(instr->base_reg(), index, TIMES_2, instr->offset()),
+          value);
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -64,7 +66,7 @@
                 Temp<Register> temp)) {
   __ LoadObject(CODE_REG, instr->code());
   __ LeaveFrame();  // The arguments are still on the stack.
-  __ movl(temp, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ movl(temp, compiler::FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ jmp(temp);
 }
 
@@ -118,7 +120,7 @@
 
 #if defined(DEBUG)
   __ Comment("Stack Check");
-  Label done;
+  compiler::Label done;
   const intptr_t fp_sp_dist =
       (compiler::target::frame_layout.first_local_from_fp + 1 -
        compiler->StackSize()) *
@@ -126,8 +128,8 @@
   ASSERT(fp_sp_dist <= 0);
   __ movl(EDI, ESP);
   __ subl(EDI, EBP);
-  __ cmpl(EDI, Immediate(fp_sp_dist));
-  __ j(EQUAL, &done, Assembler::kNearJump);
+  __ cmpl(EDI, compiler::Immediate(fp_sp_dist));
+  __ j(EQUAL, &done, compiler::Assembler::kNearJump);
   __ int3();
   __ Bind(&done);
 #endif
@@ -164,7 +166,9 @@
 
   // Restore top_resource.
   __ popl(tmp);
-  __ movl(Address(THR, compiler::target::Thread::top_resource_offset()), tmp);
+  __ movl(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()),
+      tmp);
 
   __ popl(vm_tag_reg);
 
@@ -175,11 +179,11 @@
   // Move XMM0 into ST0 if needed.
   if (return_in_st0) {
     if (result_representation_ == kUnboxedDouble) {
-      __ movsd(Address(SPREG, -8), XMM0);
-      __ fldl(Address(SPREG, -8));
+      __ movsd(compiler::Address(SPREG, -8), XMM0);
+      __ fldl(compiler::Address(SPREG, -8));
     } else {
-      __ movss(Address(SPREG, -4), XMM0);
-      __ flds(Address(SPREG, -4));
+      __ movss(compiler::Address(SPREG, -4), XMM0);
+      __ flds(compiler::Address(SPREG, -4));
     }
   }
 
@@ -220,16 +224,16 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movl(
-      Address(EBP, compiler::target::FrameOffsetInBytesForVariable(&local())),
-      value);
+  __ movl(compiler::Address(
+              EBP, compiler::target::FrameOffsetInBytesForVariable(&local())),
+          value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
   return LocationSummary::Make(zone, kNumInputs,
-                               Assembler::IsSafe(value())
+                               compiler::Assembler::IsSafe(value())
                                    ? Location::Constant(this)
                                    : Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -252,7 +256,8 @@
     if (value_.IsSmi() && Smi::Cast(value_).Value() == 0) {
       __ xorl(destination.reg(), destination.reg());
     } else if (value_.IsSmi() && (representation() == kUnboxedInt32)) {
-      __ movl(destination.reg(), Immediate(Smi::Cast(value_).Value()));
+      __ movl(destination.reg(),
+              compiler::Immediate(Smi::Cast(value_).Value()));
     } else {
       ASSERT(representation() == kTagged);
       __ LoadObjectSafely(destination.reg(), value_);
@@ -264,12 +269,12 @@
       __ pushl(EAX);
       __ LoadObject(EAX, value_);
       __ movsd(destination.fpu_reg(),
-               FieldAddress(EAX, Double::value_offset()));
+               compiler::FieldAddress(EAX, Double::value_offset()));
       __ popl(EAX);
     } else if (Utils::DoublesBitEqual(value_as_double, 0.0)) {
       __ xorps(destination.fpu_reg(), destination.fpu_reg());
     } else {
-      __ movsd(destination.fpu_reg(), Address::Absolute(addr));
+      __ movsd(destination.fpu_reg(), compiler::Address::Absolute(addr));
     }
   } else if (destination.IsDoubleStackSlot()) {
     const double value_as_double = Double::Cast(value_).value();
@@ -277,23 +282,23 @@
     if (addr == 0) {
       __ pushl(EAX);
       __ LoadObject(EAX, value_);
-      __ movsd(FpuTMP, FieldAddress(EAX, Double::value_offset()));
+      __ movsd(FpuTMP, compiler::FieldAddress(EAX, Double::value_offset()));
       __ popl(EAX);
     } else if (Utils::DoublesBitEqual(value_as_double, 0.0)) {
       __ xorps(FpuTMP, FpuTMP);
     } else {
-      __ movsd(FpuTMP, Address::Absolute(addr));
+      __ movsd(FpuTMP, compiler::Address::Absolute(addr));
     }
     __ movsd(LocationToStackSlotAddress(destination), FpuTMP);
   } else {
     ASSERT(destination.IsStackSlot());
     if (value_.IsSmi() && representation() == kUnboxedInt32) {
       __ movl(LocationToStackSlotAddress(destination),
-              Immediate(Smi::Cast(value_).Value()));
+              compiler::Immediate(Smi::Cast(value_).Value()));
     } else {
-      if (Assembler::IsSafeSmi(value_) || value_.IsNull()) {
+      if (compiler::Assembler::IsSafeSmi(value_) || value_.IsNull()) {
         __ movl(LocationToStackSlotAddress(destination),
-                Immediate(reinterpret_cast<int32_t>(value_.raw())));
+                compiler::Immediate(reinterpret_cast<int32_t>(value_.raw())));
       } else {
         __ pushl(EAX);
         __ LoadObjectSafely(EAX, value_);
@@ -373,10 +378,10 @@
   // Check that the type of the value is allowed in conditional context.
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
-  Label done;
+  compiler::Label done;
 
   __ CompareObject(reg, Object::null_instance());
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, compiler::Assembler::kNearJump);
 
   __ pushl(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -458,14 +463,14 @@
 static void LoadValueCid(FlowGraphCompiler* compiler,
                          Register value_cid_reg,
                          Register value_reg,
-                         Label* value_is_smi = NULL) {
-  Label done;
+                         compiler::Label* value_is_smi = NULL) {
+  compiler::Label done;
   if (value_is_smi == NULL) {
-    __ movl(value_cid_reg, Immediate(kSmiCid));
+    __ movl(value_cid_reg, compiler::Immediate(kSmiCid));
   }
-  __ testl(value_reg, Immediate(kSmiTagMask));
+  __ testl(value_reg, compiler::Immediate(kSmiTagMask));
   if (value_is_smi == NULL) {
-    __ j(ZERO, &done, Assembler::kNearJump);
+    __ j(ZERO, &done, compiler::Assembler::kNearJump);
   } else {
     __ j(ZERO, value_is_smi);
   }
@@ -605,7 +610,7 @@
   PairLocation* right_pair = locs.in(1).AsPairLocation();
   Register right1 = right_pair->At(0).reg();
   Register right2 = right_pair->At(1).reg();
-  Label done;
+  compiler::Label done;
   // Compare lower.
   __ cmpl(left1, right1);
   __ j(NOT_EQUAL, &done);
@@ -689,7 +694,7 @@
   __ comisd(left, right);
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  Label* nan_result =
+  compiler::Label* nan_result =
       (true_condition == NOT_EQUAL) ? labels.true_label : labels.false_label;
   __ j(PARITY_EVEN, nan_result);
   return true_condition;
@@ -708,7 +713,7 @@
 }
 
 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label is_true, is_false;
+  compiler::Label is_true, is_false;
   BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   if (true_condition != INVALID_CONDITION) {
@@ -716,10 +721,10 @@
   }
 
   Register result = locs()->out(0).reg();
-  Label done;
+  compiler::Label done;
   __ Bind(&is_false);
   __ LoadObject(result, Bool::False());
-  __ jmp(&done, Assembler::kNearJump);
+  __ jmp(&done, compiler::Assembler::kNearJump);
   __ Bind(&is_true);
   __ LoadObject(result, Bool::True());
   __ Bind(&done);
@@ -753,7 +758,7 @@
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
     const int32_t imm = reinterpret_cast<int32_t>(right.constant().raw());
-    __ testl(left, Immediate(imm));
+    __ testl(left, compiler::Immediate(imm));
   } else {
     __ testl(left, right.reg());
   }
@@ -779,23 +784,24 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       deopt_id(), ICData::kDeoptTestCids,
-                                       licm_hoisted_ ? ICData::kHoisted : 0)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
   ASSERT(data[0] == kSmiCid);
   bool result = data[1] == true_result;
-  __ testl(val_reg, Immediate(kSmiTagMask));
+  __ testl(val_reg, compiler::Immediate(kSmiTagMask));
   __ j(ZERO, result ? labels.true_label : labels.false_label);
   __ LoadClassId(cid_reg, val_reg);
   for (intptr_t i = 2; i < data.length(); i += 2) {
     const intptr_t test_cid = data[i];
     ASSERT(test_cid != kSmiCid);
     result = data[i + 1] == true_result;
-    __ cmpl(cid_reg, Immediate(test_cid));
+    __ cmpl(cid_reg, compiler::Immediate(test_cid));
     __ j(EQUAL, result ? labels.true_label : labels.false_label);
   }
   // No match found, deoptimize or default action.
@@ -803,7 +809,7 @@
     // If the cid is not in the list, jump to the opposite label from the cids
     // that are in the list.  These must be all the same (see asserts in the
     // constructor).
-    Label* target = result ? labels.false_label : labels.true_label;
+    compiler::Label* target = result ? labels.false_label : labels.true_label;
     if (target != labels.fall_through) {
       __ jmp(target);
     }
@@ -881,9 +887,9 @@
   __ PushObject(Object::null_object());
 
   // Pass a pointer to the first argument in EAX.
-  __ leal(EAX, Address(ESP, ArgumentCount() * kWordSize));
+  __ leal(EAX, compiler::Address(ESP, ArgumentCount() * kWordSize));
 
-  __ movl(EDX, Immediate(argc_tag));
+  __ movl(EDX, compiler::Immediate(argc_tag));
 
   const Code* stub;
 
@@ -896,8 +902,9 @@
   } else {
     stub = &StubCode::CallNoScopeNative();
   }
-  const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
-  __ movl(ECX, Immediate(label.address()));
+  const compiler::ExternalLabel label(
+      reinterpret_cast<uword>(native_c_function()));
+  __ movl(ECX, compiler::Immediate(label.address()));
   compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther, locs());
 
   __ popl(result);
@@ -915,7 +922,7 @@
   __ movl(saved_fp, FPREG);
 
   // Make a space to put the return address.
-  __ pushl(Immediate(0));
+  __ pushl(compiler::Immediate(0));
 
   // We need to create a dummy "exit frame". It will have a null code object.
   __ LoadObject(CODE_REG, Object::null_object());
@@ -923,7 +930,7 @@
 
   // Align frame before entering C++ world.
   if (OS::ActivationFrameAlignment() > 1) {
-    __ andl(SPREG, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+    __ andl(SPREG, compiler::Immediate(~(OS::ActivationFrameAlignment() - 1)));
   }
 
   FrameRebase rebase(/*old_base=*/FPREG, /*new_base=*/saved_fp,
@@ -938,31 +945,45 @@
   // 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
   // PC-relative 'leaq' available, so we have do a trick with 'call'.
-  Label get_pc;
+  compiler::Label get_pc;
   __ call(&get_pc);
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
   __ Bind(&get_pc);
   __ popl(tmp);
-  __ movl(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), tmp);
+  __ movl(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), tmp);
 
-  __ TransitionGeneratedToNative(branch, FPREG, tmp);
-  __ call(branch);
+  if (CanExecuteGeneratedCodeInSafepoint()) {
+    __ TransitionGeneratedToNative(branch, FPREG, tmp);
+    __ call(branch);
+    __ TransitionNativeToGenerated(tmp);
+  } else {
+    // We cannot trust that this code will be executable within a safepoint.
+    // Therefore we delegate the responsibility of entering/exiting the
+    // safepoint to a stub which in the VM isolate's heap, which will never lose
+    // execute permission.
+    __ movl(tmp,
+            compiler::Address(
+                THR, compiler::target::Thread::
+                         call_native_through_safepoint_entry_point_offset()));
+
+    // Calls EAX within a safepoint and clobbers EBX.
+    ASSERT(tmp == EBX && branch == EAX);
+    __ call(tmp);
+  }
 
   // The x86 calling convention requires floating point values to be returned on
   // the "floating-point stack" (aka. register ST0). We don't use the
   // floating-point stack in Dart, so we need to move the return value back into
   // an XMM register.
   if (representation() == kUnboxedDouble) {
-    __ fstpl(Address(SPREG, -kDoubleSize));
-    __ movsd(XMM0, Address(SPREG, -kDoubleSize));
+    __ fstpl(compiler::Address(SPREG, -kDoubleSize));
+    __ movsd(XMM0, compiler::Address(SPREG, -kDoubleSize));
   } else if (representation() == kUnboxedFloat) {
-    __ fstps(Address(SPREG, -kFloatSize));
-    __ movss(XMM0, Address(SPREG, -kFloatSize));
+    __ fstps(compiler::Address(SPREG, -kFloatSize));
+    __ movss(XMM0, compiler::Address(SPREG, -kFloatSize));
   }
 
-  __ TransitionNativeToGenerated(tmp);
-
   // Leave dummy exit frame.
   __ LeaveFrame();
 
@@ -986,8 +1007,8 @@
   if (loc.IsRegister()) {
     __ pushl(loc.reg());
   } else if (loc.IsFpuRegister()) {
-    __ subl(SPREG, Immediate(8));
-    __ movsd(Address(SPREG, 0), loc.fpu_reg());
+    __ subl(SPREG, compiler::Immediate(8));
+    __ movsd(compiler::Address(SPREG, 0), loc.fpu_reg());
   } else {
     UNREACHABLE();
   }
@@ -1016,9 +1037,8 @@
     __ EnterFrame(0);
     __ ReserveAlignedFrameSpace(0);
 
-    __ movl(
-        EAX,
-        Immediate(reinterpret_cast<int64_t>(DLRT_GetThreadForNativeCallback)));
+    __ movl(EAX, compiler::Immediate(reinterpret_cast<int64_t>(
+                     DLRT_GetThreadForNativeCallback)));
     __ call(EAX);
     __ movl(THR, EAX);
 
@@ -1026,17 +1046,19 @@
   }
 
   // Save the current VMTag on the stack.
-  __ movl(ECX, Assembler::VMTagAddress());
+  __ movl(ECX, compiler::Assembler::VMTagAddress());
   __ pushl(ECX);
 
   // Save top resource.
-  __ pushl(Address(THR, compiler::target::Thread::top_resource_offset()));
-  __ movl(Address(THR, compiler::target::Thread::top_resource_offset()),
-          Immediate(0));
+  __ pushl(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()));
+  __ movl(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()),
+      compiler::Immediate(0));
 
   // Save top exit frame info. Stack walker expects it to be here.
-  __ pushl(
-      Address(THR, compiler::target::Thread::top_exit_frame_info_offset()));
+  __ pushl(compiler::Address(
+      THR, compiler::target::Thread::top_exit_frame_info_offset()));
 
   // In debug mode, verify that we've pushed the top exit frame info at the
   // correct offset from FP.
@@ -1048,23 +1070,25 @@
 
   // Now that the safepoint has ended, we can hold Dart objects with bare hands.
   // TODO(35934): fix linking issue
-  __ pushl(Immediate(callback_id_));
-  __ movl(
-      EAX,
-      Address(THR, compiler::target::Thread::verify_callback_entry_offset()));
+  __ pushl(compiler::Immediate(callback_id_));
+  __ movl(EAX,
+          compiler::Address(
+              THR, compiler::target::Thread::verify_callback_entry_offset()));
   __ call(EAX);
   __ popl(EAX);
 
   // Load the code object.
-  __ movl(EAX, Address(THR, compiler::target::Thread::callback_code_offset()));
-  __ movl(EAX, FieldAddress(
+  __ movl(EAX, compiler::Address(
+                   THR, compiler::target::Thread::callback_code_offset()));
+  __ movl(EAX, compiler::FieldAddress(
                    EAX, compiler::target::GrowableObjectArray::data_offset()));
-  __ movl(CODE_REG,
-          FieldAddress(EAX, compiler::target::Array::data_offset() +
-                                callback_id_ * compiler::target::kWordSize));
+  __ movl(CODE_REG, compiler::FieldAddress(
+                        EAX, compiler::target::Array::data_offset() +
+                                 callback_id_ * compiler::target::kWordSize));
 
   // Put the code object in the reserved slot.
-  __ movl(Address(FPREG, kPcMarkerSlotFromFp * compiler::target::kWordSize),
+  __ movl(compiler::Address(FPREG,
+                            kPcMarkerSlotFromFp * compiler::target::kWordSize),
           CODE_REG);
 
   // Load a GC-safe value for the arguments descriptor (unused but tagged).
@@ -1072,10 +1096,11 @@
 
   // Push a dummy return address which suggests that we are inside of
   // InvokeDartCodeStub. This is how the stack walker detects an entry frame.
-  __ movl(
-      EAX,
-      Address(THR, compiler::target::Thread::invoke_dart_code_stub_offset()));
-  __ pushl(FieldAddress(EAX, compiler::target::Code::entry_point_offset()));
+  __ movl(EAX,
+          compiler::Address(
+              THR, compiler::target::Thread::invoke_dart_code_stub_offset()));
+  __ pushl(compiler::FieldAddress(
+      EAX, compiler::target::Code::entry_point_offset()));
 
   // Continue with Dart frame setup.
   FunctionEntryInstr::EmitNativeCode(compiler);
@@ -1083,7 +1108,8 @@
 
 static bool CanBeImmediateIndex(Value* value, intptr_t cid) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  if ((constant == NULL) || !Assembler::IsSafeSmi(constant->value())) {
+  if ((constant == NULL) ||
+      !compiler::Assembler::IsSafeSmi(constant->value())) {
     return false;
   }
   const int64_t index = Smi::Cast(constant->value()).AsInt64Value();
@@ -1106,11 +1132,12 @@
     FlowGraphCompiler* compiler) {
   Register char_code = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
+  __ movl(result, compiler::Immediate(
+                      reinterpret_cast<uword>(Symbols::PredefinedAddress())));
   __ movl(result,
-          Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress())));
-  __ movl(result, Address(result, char_code,
-                          TIMES_HALF_WORD_SIZE,  // Char code is a smi.
-                          Symbols::kNullCharCodeSymbolOffset * kWordSize));
+          compiler::Address(result, char_code,
+                            TIMES_HALF_WORD_SIZE,  // Char code is a smi.
+                            Symbols::kNullCharCodeSymbolOffset * kWordSize));
 }
 
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
@@ -1124,14 +1151,14 @@
   ASSERT(cid_ == kOneByteStringCid);
   Register str = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label is_one, done;
-  __ movl(result, FieldAddress(str, String::length_offset()));
-  __ cmpl(result, Immediate(Smi::RawValue(1)));
-  __ j(EQUAL, &is_one, Assembler::kNearJump);
-  __ movl(result, Immediate(Smi::RawValue(-1)));
+  compiler::Label is_one, done;
+  __ movl(result, compiler::FieldAddress(str, String::length_offset()));
+  __ cmpl(result, compiler::Immediate(Smi::RawValue(1)));
+  __ j(EQUAL, &is_one, compiler::Assembler::kNearJump);
+  __ movl(result, compiler::Immediate(Smi::RawValue(-1)));
   __ jmp(&done);
   __ Bind(&is_one);
-  __ movzxb(result, FieldAddress(str, OneByteString::data_offset()));
+  __ movzxb(result, compiler::FieldAddress(str, OneByteString::data_offset()));
   __ SmiTag(result);
   __ Bind(&done);
 }
@@ -1171,15 +1198,15 @@
   Register obj = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   if (object()->definition()->representation() == kUntagged) {
-    __ movl(result, Address(obj, offset()));
+    __ movl(result, compiler::Address(obj, offset()));
   } else {
     ASSERT(object()->definition()->representation() == kTagged);
-    __ movl(result, FieldAddress(obj, offset()));
+    __ movl(result, compiler::FieldAddress(obj, offset()));
   }
 }
 
 DEFINE_BACKEND(StoreUntagged, (NoLocation, Register obj, Register value)) {
-  __ movl(Address(obj, instr->offset_from_tagged()), value);
+  __ movl(compiler::Address(obj, instr->offset_from_tagged()), value);
 }
 
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
@@ -1200,10 +1227,10 @@
     // it is slower, probably due to branch prediction usually working just fine
     // in this case.
     ASSERT(result != object);
-    Label done;
-    __ movl(result, Immediate(kSmiCid << 1));
-    __ testl(object, Immediate(kSmiTagMask));
-    __ j(EQUAL, &done, Assembler::kNearJump);
+    compiler::Label done;
+    __ movl(result, compiler::Immediate(kSmiCid << 1));
+    __ testl(object, compiler::Immediate(kSmiTagMask));
+    __ j(EQUAL, &done, compiler::Assembler::kNearJump);
     __ LoadClassId(result, object);
     __ SmiTag(result);
     __ Bind(&done);
@@ -1213,47 +1240,6 @@
   }
 }
 
-CompileType LoadIndexedInstr::ComputeType() const {
-  switch (class_id_) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return CompileType::Dynamic();
-
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
-      return CompileType::FromCid(kDoubleCid);
-    case kTypedDataFloat32x4ArrayCid:
-      return CompileType::FromCid(kFloat32x4Cid);
-    case kTypedDataInt32x4ArrayCid:
-      return CompileType::FromCid(kInt32x4Cid);
-    case kTypedDataFloat64x2ArrayCid:
-      return CompileType::FromCid(kFloat64x2Cid);
-
-    case kTypedDataInt8ArrayCid:
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-    case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid:
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-      return CompileType::FromCid(kSmiCid);
-
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-    case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
-      return CompileType::Int();
-
-    default:
-      UNIMPLEMENTED();
-      return CompileType::Dynamic();
-  }
-}
-
 Representation LoadIndexedInstr::representation() const {
   switch (class_id_) {
     case kArrayCid:
@@ -1330,11 +1316,11 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address =
+  compiler::Address element_address =
       index.IsRegister()
-          ? Assembler::ElementAddressForRegIndex(
+          ? compiler::Assembler::ElementAddressForRegIndex(
                 IsExternal(), class_id(), index_scale(), array, index.reg())
-          : Assembler::ElementAddressForIntIndex(
+          : compiler::Assembler::ElementAddressForIntIndex(
                 IsExternal(), class_id(), index_scale(), array,
                 Smi::Cast(index.constant()).Value());
 
@@ -1394,10 +1380,10 @@
       __ movl(result_lo, element_address);
       element_address =
           index.IsRegister()
-              ? Assembler::ElementAddressForRegIndex(IsExternal(), class_id(),
-                                                     index_scale(), array,
-                                                     index.reg(), kWordSize)
-              : Assembler::ElementAddressForIntIndex(
+              ? compiler::Assembler::ElementAddressForRegIndex(
+                    IsExternal(), class_id(), index_scale(), array, index.reg(),
+                    kWordSize)
+              : compiler::Assembler::ElementAddressForIntIndex(
                     IsExternal(), class_id(), index_scale(), array,
                     Smi::Cast(index.constant()).Value(), kWordSize);
       __ movl(result_hi, element_address);
@@ -1559,11 +1545,11 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address =
+  compiler::Address element_address =
       index.IsRegister()
-          ? Assembler::ElementAddressForRegIndex(
+          ? compiler::Assembler::ElementAddressForRegIndex(
                 IsExternal(), class_id(), index_scale(), array, index.reg())
-          : Assembler::ElementAddressForIntIndex(
+          : compiler::Assembler::ElementAddressForIntIndex(
                 IsExternal(), class_id(), index_scale(), array,
                 Smi::Cast(index.constant()).Value());
 
@@ -1593,7 +1579,7 @@
       if (locs()->in(2).IsConstant()) {
         const Smi& constant = Smi::Cast(locs()->in(2).constant());
         __ movb(element_address,
-                Immediate(static_cast<int8_t>(constant.Value())));
+                compiler::Immediate(static_cast<int8_t>(constant.Value())));
       } else {
         ASSERT(locs()->in(2).reg() == EAX);
         __ movb(element_address, AL);
@@ -1611,18 +1597,19 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ movb(element_address, Immediate(static_cast<int8_t>(value)));
+        __ movb(element_address,
+                compiler::Immediate(static_cast<int8_t>(value)));
       } else {
         ASSERT(locs()->in(2).reg() == EAX);
-        Label store_value, store_0xff;
-        __ cmpl(EAX, Immediate(0xFF));
-        __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump);
+        compiler::Label store_value, store_0xff;
+        __ cmpl(EAX, compiler::Immediate(0xFF));
+        __ j(BELOW_EQUAL, &store_value, compiler::Assembler::kNearJump);
         // Clamp to 0x0 or 0xFF respectively.
         __ j(GREATER, &store_0xff);
         __ xorl(EAX, EAX);
-        __ jmp(&store_value, Assembler::kNearJump);
+        __ jmp(&store_value, compiler::Assembler::kNearJump);
         __ Bind(&store_0xff);
-        __ movl(EAX, Immediate(0xFF));
+        __ movl(EAX, compiler::Immediate(0xFF));
         __ Bind(&store_value);
         __ movb(element_address, AL);
       }
@@ -1648,10 +1635,10 @@
       __ movl(element_address, value_lo);
       element_address =
           index.IsRegister()
-              ? Assembler::ElementAddressForRegIndex(IsExternal(), class_id(),
-                                                     index_scale(), array,
-                                                     index.reg(), kWordSize)
-              : Assembler::ElementAddressForIntIndex(
+              ? compiler::Assembler::ElementAddressForRegIndex(
+                    IsExternal(), class_id(), index_scale(), array, index.reg(),
+                    kWordSize)
+              : compiler::Assembler::ElementAddressForIntIndex(
                     IsExternal(), class_id(), index_scale(), array,
                     Smi::Cast(index.constant()).Value(), kWordSize);
       __ movl(element_address, value_hi);
@@ -1734,21 +1721,22 @@
                                  ? locs()->temp(locs()->temp_count() - 1).reg()
                                  : kNoRegister;
 
-  Label ok, fail_label;
+  compiler::Label ok, fail_label;
 
-  Label* deopt = nullptr;
+  compiler::Label* deopt = nullptr;
   if (compiler->is_optimizing()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField);
   }
 
-  Label* fail = (deopt != NULL) ? deopt : &fail_label;
+  compiler::Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(field_reg,
-                                           Field::is_nullable_offset());
+    compiler::FieldAddress field_cid_operand(field_reg,
+                                             Field::guarded_cid_offset());
+    compiler::FieldAddress field_nullability_operand(
+        field_reg, Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1758,11 +1746,11 @@
     } else if (value_cid == kNullCid) {
       // Value in graph known to be null.
       // Compare with null.
-      __ cmpw(field_nullability_operand, Immediate(value_cid));
+      __ cmpw(field_nullability_operand, compiler::Immediate(value_cid));
     } else {
       // Value in graph known to be non-null.
       // Compare class id with guard field class id.
-      __ cmpw(field_cid_operand, Immediate(value_cid));
+      __ cmpw(field_cid_operand, compiler::Immediate(value_cid));
     }
     __ j(EQUAL, &ok);
 
@@ -1775,7 +1763,7 @@
     if (!field().needs_length_check()) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ cmpw(field_cid_operand, Immediate(kIllegalCid));
+      __ cmpw(field_cid_operand, compiler::Immediate(kIllegalCid));
       // Jump to failure path when guard field has been initialized and
       // the field and value class ids do not not match.
       __ j(NOT_EQUAL, fail);
@@ -1786,8 +1774,8 @@
         __ movw(field_nullability_operand, value_cid_reg);
       } else {
         ASSERT(field_reg != kNoRegister);
-        __ movw(field_cid_operand, Immediate(value_cid));
-        __ movw(field_nullability_operand, Immediate(value_cid));
+        __ movw(field_cid_operand, compiler::Immediate(value_cid));
+        __ movw(field_nullability_operand, compiler::Immediate(value_cid));
       }
 
       __ jmp(&ok);
@@ -1797,8 +1785,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ cmpw(FieldAddress(field_reg, Field::guarded_cid_offset()),
-              Immediate(kDynamicCid));
+      __ cmpw(compiler::FieldAddress(field_reg, Field::guarded_cid_offset()),
+              compiler::Immediate(kDynamicCid));
       __ j(EQUAL, &ok);
 
       __ pushl(field_reg);
@@ -1816,21 +1804,21 @@
     // Field guard class has been initialized and is known.
     if (value_cid == kDynamicCid) {
       // Value's class id is not known.
-      __ testl(value_reg, Immediate(kSmiTagMask));
+      __ testl(value_reg, compiler::Immediate(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
         __ j(ZERO, fail);
         __ LoadClassId(value_cid_reg, value_reg);
-        __ cmpl(value_cid_reg, Immediate(field_cid));
+        __ cmpl(value_cid_reg, compiler::Immediate(field_cid));
       }
 
       if (field().is_nullable() && (field_cid != kNullCid)) {
         __ j(EQUAL, &ok);
         if (field_cid != kSmiCid) {
-          __ cmpl(value_cid_reg, Immediate(kNullCid));
+          __ cmpl(value_cid_reg, compiler::Immediate(kNullCid));
         } else {
-          const Immediate& raw_null =
-              Immediate(reinterpret_cast<intptr_t>(Object::null()));
+          const compiler::Immediate& raw_null =
+              compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
           __ cmpl(value_reg, raw_null);
         }
       }
@@ -1871,7 +1859,7 @@
     return;  // Nothing to emit.
   }
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
@@ -1884,25 +1872,25 @@
     const Register offset_reg = locs()->temp(1).reg();
     const Register length_reg = locs()->temp(2).reg();
 
-    Label ok;
+    compiler::Label ok;
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     __ movsxb(
         offset_reg,
-        FieldAddress(field_reg,
-                     Field::guarded_list_length_in_object_offset_offset()));
-    __ movl(length_reg,
-            FieldAddress(field_reg, Field::guarded_list_length_offset()));
+        compiler::FieldAddress(
+            field_reg, Field::guarded_list_length_in_object_offset_offset()));
+    __ movl(length_reg, compiler::FieldAddress(
+                            field_reg, Field::guarded_list_length_offset()));
 
-    __ cmpl(offset_reg, Immediate(0));
+    __ cmpl(offset_reg, compiler::Immediate(0));
     __ j(NEGATIVE, &ok);
 
     // Load the length from the value. GuardFieldClass already verified that
     // 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.
-    __ cmpl(length_reg, Address(value_reg, offset_reg, TIMES_1, 0));
+    __ cmpl(length_reg, compiler::Address(value_reg, offset_reg, TIMES_1, 0));
 
     if (deopt == NULL) {
       __ j(EQUAL, &ok);
@@ -1922,9 +1910,9 @@
     ASSERT(field().guarded_list_length_in_object_offset() !=
            Field::kUnknownLengthOffset);
 
-    __ cmpl(
-        FieldAddress(value_reg, field().guarded_list_length_in_object_offset()),
-        Immediate(Smi::RawValue(field().guarded_list_length())));
+    __ cmpl(compiler::FieldAddress(
+                value_reg, field().guarded_list_length_in_object_offset()),
+            compiler::Immediate(Smi::RawValue(field().guarded_list_length())));
     __ j(NOT_EQUAL, deopt);
   }
 }
@@ -1937,7 +1925,7 @@
       : TemplateSlowPathCode(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("%s slow path allocation of %s", instruction()->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
@@ -1964,14 +1952,14 @@
                        Register temp) {
     if (compiler->intrinsic_mode()) {
       __ TryAllocate(cls, compiler->intrinsic_slow_path_label(),
-                     Assembler::kFarJump, result, temp);
+                     compiler::Assembler::kFarJump, result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls, slow_path->entry_label(), Assembler::kFarJump, result,
-                     temp);
+      __ TryAllocate(cls, slow_path->entry_label(),
+                     compiler::Assembler::kFarJump, result, temp);
       __ Bind(slow_path->exit_label());
     }
   }
@@ -2020,26 +2008,27 @@
                              Register instance_reg,
                              intptr_t offset,
                              Register temp) {
-  Label done;
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
-  __ movl(box_reg, FieldAddress(instance_reg, offset));
+  compiler::Label done;
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+  __ movl(box_reg, compiler::FieldAddress(instance_reg, offset));
   __ cmpl(box_reg, raw_null);
   __ j(NOT_EQUAL, &done);
   BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ movl(temp, box_reg);
-  __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, offset), temp,
-                     Assembler::kValueIsNotSmi);
+  __ StoreIntoObject(instance_reg, compiler::FieldAddress(instance_reg, offset),
+                     temp, compiler::Assembler::kValueIsNotSmi);
 
   __ Bind(&done);
 }
 
 void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(sizeof(classid_t) == kInt16Size);
-  Label skip_store;
+  compiler::Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
   const intptr_t offset_in_bytes = OffsetInBytes();
+  ASSERT(offset_in_bytes > 0);  // Field is finalized and points after header.
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     XmmRegister value = locs()->in(1).fpu_reg();
@@ -2066,23 +2055,25 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movl(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes), temp2,
-                         Assembler::kValueIsNotSmi);
+                         compiler::FieldAddress(instance_reg, offset_in_bytes),
+                         temp2, compiler::Assembler::kValueIsNotSmi);
     } else {
-      __ movl(temp, FieldAddress(instance_reg, offset_in_bytes));
+      __ movl(temp, compiler::FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
-        __ movsd(FieldAddress(temp, Double::value_offset()), value);
+        __ movsd(compiler::FieldAddress(temp, Double::value_offset()), value);
         break;
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
-        __ movups(FieldAddress(temp, Float32x4::value_offset()), value);
+        __ movups(compiler::FieldAddress(temp, Float32x4::value_offset()),
+                  value);
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
-        __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
+        __ movups(compiler::FieldAddress(temp, Float64x2::value_offset()),
+                  value);
         break;
       default:
         UNREACHABLE();
@@ -2104,31 +2095,31 @@
       locs()->live_registers()->Add(locs()->in(1), kTagged);
     }
 
-    Label store_pointer;
-    Label store_double;
-    Label store_float32x4;
-    Label store_float64x2;
+    compiler::Label store_pointer;
+    compiler::Label store_double;
+    compiler::Label store_float32x4;
+    compiler::Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
-    __ cmpw(FieldAddress(temp, Field::is_nullable_offset()),
-            Immediate(kNullCid));
+    __ cmpw(compiler::FieldAddress(temp, Field::is_nullable_offset()),
+            compiler::Immediate(kNullCid));
     __ j(EQUAL, &store_pointer);
 
-    __ movzxb(temp2, FieldAddress(temp, Field::kind_bits_offset()));
-    __ testl(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
+    __ movzxb(temp2, compiler::FieldAddress(temp, Field::kind_bits_offset()));
+    __ testl(temp2, compiler::Immediate(1 << Field::kUnboxingCandidateBit));
     __ j(ZERO, &store_pointer);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kDoubleCid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kDoubleCid));
     __ j(EQUAL, &store_double);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kFloat32x4Cid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kFloat64x2Cid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kFloat64x2Cid));
     __ j(EQUAL, &store_float64x2);
 
     // Fall through.
@@ -2143,8 +2134,9 @@
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
-      __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
+      __ movsd(fpu_temp,
+               compiler::FieldAddress(value_reg, Double::value_offset()));
+      __ movsd(compiler::FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2152,8 +2144,10 @@
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
-      __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
+      __ movups(fpu_temp,
+                compiler::FieldAddress(value_reg, Float32x4::value_offset()));
+      __ movups(compiler::FieldAddress(temp, Float32x4::value_offset()),
+                fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2161,8 +2155,10 @@
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
-      __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
+      __ movups(fpu_temp,
+                compiler::FieldAddress(value_reg, Float64x2::value_offset()));
+      __ movups(compiler::FieldAddress(temp, Float64x2::value_offset()),
+                fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2172,17 +2168,18 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes), value_reg,
-                       CanValueBeSmi());
+                       compiler::FieldAddress(instance_reg, offset_in_bytes),
+                       value_reg, CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes),
-                                  locs()->in(1).constant());
+      __ StoreIntoObjectNoBarrier(
+          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+          locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(
-          instance_reg, FieldAddress(instance_reg, offset_in_bytes), value_reg);
+          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+          value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2209,7 +2206,7 @@
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ movl(result, FieldAddress(field, Field::static_value_offset()));
+  __ movl(result, compiler::FieldAddress(field, Field::static_value_offset()));
 }
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
@@ -2228,11 +2225,13 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsWriteBarrier()) {
-    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
-                       value, CanValueBeSmi());
+    __ StoreIntoObject(
+        temp, compiler::FieldAddress(temp, Field::static_value_offset()), value,
+        CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
-        temp, FieldAddress(temp, Field::static_value_offset()), value);
+        temp, compiler::FieldAddress(temp, Field::static_value_offset()),
+        value);
   }
 }
 
@@ -2275,8 +2274,8 @@
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
                                   intptr_t num_elements,
-                                  Label* slow_path,
-                                  Label* done) {
+                                  compiler::Label* slow_path,
+                                  compiler::Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = EDX;
   const Register kElemTypeReg = ECX;
@@ -2284,18 +2283,20 @@
 
   // Instance in EAX.
   // Object end address in EBX.
-  __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path,
+                      compiler::Assembler::kFarJump,
                       EAX,   // instance
                       EBX,   // end address
                       EDI);  // temp
 
   // Store the type argument field.
   __ StoreIntoObjectNoBarrier(
-      EAX, FieldAddress(EAX, Array::type_arguments_offset()), kElemTypeReg);
+      EAX, compiler::FieldAddress(EAX, Array::type_arguments_offset()),
+      kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(EAX, FieldAddress(EAX, Array::length_offset()),
-                              kLengthReg);
+  __ StoreIntoObjectNoBarrier(
+      EAX, compiler::FieldAddress(EAX, Array::length_offset()), kLengthReg);
 
   // Initialize all array elements to raw_null.
   // EAX: new object start as a tagged pointer.
@@ -2304,26 +2305,28 @@
   // data area to be initialized.
   if (num_elements > 0) {
     const intptr_t array_size = instance_size - sizeof(RawArray);
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
-    __ leal(EDI, FieldAddress(EAX, sizeof(RawArray)));
+    const compiler::Immediate& raw_null =
+        compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
+    __ leal(EDI, compiler::FieldAddress(EAX, sizeof(RawArray)));
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       __ movl(EBX, raw_null);
       while (current_offset < array_size) {
-        __ StoreIntoObjectNoBarrier(EAX, Address(EDI, current_offset), EBX);
+        __ StoreIntoObjectNoBarrier(EAX, compiler::Address(EDI, current_offset),
+                                    EBX);
         current_offset += kWordSize;
       }
     } else {
-      Label init_loop;
+      compiler::Label init_loop;
       __ Bind(&init_loop);
-      __ StoreIntoObjectNoBarrier(EAX, Address(EDI, 0), Object::null_object());
-      __ addl(EDI, Immediate(kWordSize));
+      __ StoreIntoObjectNoBarrier(EAX, compiler::Address(EDI, 0),
+                                  Object::null_object());
+      __ addl(EDI, compiler::Immediate(kWordSize));
       __ cmpl(EDI, EBX);
-      __ j(BELOW, &init_loop, Assembler::kNearJump);
+      __ j(BELOW, &init_loop, compiler::Assembler::kNearJump);
     }
   }
-  __ jmp(done, Assembler::kNearJump);
+  __ jmp(done, compiler::Assembler::kNearJump);
 }
 
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -2334,12 +2337,12 @@
   ASSERT(locs()->in(0).reg() == kElemTypeReg);
   ASSERT(locs()->in(1).reg() == kLengthReg);
 
-  Label slow_path, done;
+  compiler::Label slow_path, done;
   if (compiler->is_optimizing() && num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
     if (Array::IsValidLength(length)) {
-      Label slow_path, done;
+      compiler::Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
@@ -2393,20 +2396,22 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
-    __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
+    __ movl(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
     const intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
-        __ movsd(result, FieldAddress(temp, Double::value_offset()));
+        __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
         break;
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4LoadFieldInstr");
-        __ movups(result, FieldAddress(temp, Float32x4::value_offset()));
+        __ movups(result,
+                  compiler::FieldAddress(temp, Float32x4::value_offset()));
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2LoadFieldInstr");
-        __ movups(result, FieldAddress(temp, Float64x2::value_offset()));
+        __ movups(result,
+                  compiler::FieldAddress(temp, Float64x2::value_offset()));
         break;
       default:
         UNREACHABLE();
@@ -2414,32 +2419,34 @@
     return;
   }
 
-  Label done;
+  compiler::Label done;
   Register result = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
     Register temp = locs()->temp(1).reg();
     XmmRegister value = locs()->temp(0).fpu_reg();
 
-    Label load_pointer;
-    Label load_double;
-    Label load_float32x4;
-    Label load_float64x2;
+    compiler::Label load_pointer;
+    compiler::Label load_double;
+    compiler::Label load_float32x4;
+    compiler::Label load_float64x2;
 
     __ LoadObject(result, Field::ZoneHandle(slot().field().Original()));
 
-    FieldAddress field_cid_operand(result, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(result, Field::is_nullable_offset());
+    compiler::FieldAddress field_cid_operand(result,
+                                             Field::guarded_cid_offset());
+    compiler::FieldAddress field_nullability_operand(
+        result, Field::is_nullable_offset());
 
-    __ cmpw(field_nullability_operand, Immediate(kNullCid));
+    __ cmpw(field_nullability_operand, compiler::Immediate(kNullCid));
     __ j(EQUAL, &load_pointer);
 
-    __ cmpw(field_cid_operand, Immediate(kDoubleCid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kDoubleCid));
     __ j(EQUAL, &load_double);
 
-    __ cmpw(field_cid_operand, Immediate(kFloat32x4Cid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
-    __ cmpw(field_cid_operand, Immediate(kFloat64x2Cid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kFloat64x2Cid));
     __ j(EQUAL, &load_float64x2);
 
     // Fall through.
@@ -2453,9 +2460,9 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result, temp);
-      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movsd(value, FieldAddress(temp, Double::value_offset()));
-      __ movsd(FieldAddress(result, Double::value_offset()), value);
+      __ movl(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movsd(value, compiler::FieldAddress(temp, Double::value_offset()));
+      __ movsd(compiler::FieldAddress(result, Double::value_offset()), value);
       __ jmp(&done);
     }
 
@@ -2463,9 +2470,10 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result, temp);
-      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movups(value, FieldAddress(temp, Float32x4::value_offset()));
-      __ movups(FieldAddress(result, Float32x4::value_offset()), value);
+      __ movl(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movups(value, compiler::FieldAddress(temp, Float32x4::value_offset()));
+      __ movups(compiler::FieldAddress(result, Float32x4::value_offset()),
+                value);
       __ jmp(&done);
     }
 
@@ -2473,15 +2481,16 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result, temp);
-      __ movl(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
-      __ movups(FieldAddress(result, Float64x2::value_offset()), value);
+      __ movl(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movups(value, compiler::FieldAddress(temp, Float64x2::value_offset()));
+      __ movups(compiler::FieldAddress(result, Float64x2::value_offset()),
+                value);
       __ jmp(&done);
     }
 
     __ Bind(&load_pointer);
   }
-  __ movl(result, FieldAddress(instance_reg, OffsetInBytes()));
+  __ movl(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
   __ Bind(&done);
 }
 
@@ -2546,42 +2555,47 @@
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
-  Label type_arguments_instantiated;
+  compiler::Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawWhenInstantiatedFromRaw(len)) {
-    Label non_null_type_args;
-    const Immediate& raw_null =
-        Immediate(reinterpret_cast<intptr_t>(Object::null()));
+    compiler::Label non_null_type_args;
+    const compiler::Immediate& raw_null =
+        compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
     __ cmpl(instantiator_type_args_reg, raw_null);
-    __ j(NOT_EQUAL, &non_null_type_args, Assembler::kNearJump);
+    __ j(NOT_EQUAL, &non_null_type_args, compiler::Assembler::kNearJump);
     __ cmpl(function_type_args_reg, raw_null);
-    __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
+    __ j(EQUAL, &type_arguments_instantiated, compiler::Assembler::kNearJump);
     __ Bind(&non_null_type_args);
   }
   // Lookup cache before calling runtime.
   // TODO(regis): Consider moving this into a shared stub to reduce
   // generated code size.
   __ LoadObject(EDI, type_arguments());
-  __ movl(EDI, FieldAddress(EDI, TypeArguments::instantiations_offset()));
-  __ leal(EDI, FieldAddress(EDI, Array::data_offset()));
+  __ movl(EDI,
+          compiler::FieldAddress(EDI, TypeArguments::instantiations_offset()));
+  __ leal(EDI, compiler::FieldAddress(EDI, Array::data_offset()));
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
-  Label loop, next, found, slow_case;
+  compiler::Label loop, next, found, slow_case;
   __ Bind(&loop);
-  __ movl(EDX, Address(EDI, 0 * kWordSize));  // Cached instantiator type args.
+  __ movl(EDX, compiler::Address(
+                   EDI, 0 * kWordSize));  // Cached instantiator type args.
   __ cmpl(EDX, instantiator_type_args_reg);
-  __ j(NOT_EQUAL, &next, Assembler::kNearJump);
-  __ movl(EBX, Address(EDI, 1 * kWordSize));  // Cached function type args.
+  __ j(NOT_EQUAL, &next, compiler::Assembler::kNearJump);
+  __ movl(EBX,
+          compiler::Address(EDI, 1 * kWordSize));  // Cached function type args.
   __ cmpl(EBX, function_type_args_reg);
-  __ j(EQUAL, &found, Assembler::kNearJump);
+  __ j(EQUAL, &found, compiler::Assembler::kNearJump);
   __ Bind(&next);
-  __ addl(EDI, Immediate(StubCode::kInstantiationSizeInWords * kWordSize));
-  __ cmpl(EDX, Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
-  __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
-  __ jmp(&slow_case, Assembler::kNearJump);
+  __ addl(EDI,
+          compiler::Immediate(StubCode::kInstantiationSizeInWords * kWordSize));
+  __ cmpl(EDX, compiler::Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
+  __ j(NOT_EQUAL, &loop, compiler::Assembler::kNearJump);
+  __ jmp(&slow_case, compiler::Assembler::kNearJump);
   __ Bind(&found);
-  __ movl(result_reg, Address(EDI, 2 * kWordSize));  // Cached instantiated ta.
-  __ jmp(&type_arguments_instantiated, Assembler::kNearJump);
+  __ movl(result_reg,
+          compiler::Address(EDI, 2 * kWordSize));  // Cached instantiated ta.
+  __ jmp(&type_arguments_instantiated, compiler::Assembler::kNearJump);
 
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
@@ -2628,7 +2642,7 @@
 
     compiler->SaveLiveRegisters(locs);
 
-    __ movl(EDX, Immediate(instruction()->num_context_variables()));
+    __ movl(EDX, compiler::Immediate(instruction()->num_context_variables()));
     compiler->GenerateCall(instruction()->token_pos(),
                            StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
@@ -2650,14 +2664,14 @@
   intptr_t instance_size = Context::InstanceSize(num_context_variables());
 
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
-                      Assembler::kFarJump,
+                      compiler::Assembler::kFarJump,
                       result,  // instance
                       temp,    // end address
                       temp2);  // temp
 
   // Setup up number of context variables field.
-  __ movl(FieldAddress(result, Context::num_variables_offset()),
-          Immediate(num_context_variables()));
+  __ movl(compiler::FieldAddress(result, Context::num_variables_offset()),
+          compiler::Immediate(num_context_variables()));
 
   __ Bind(slow_path->exit_label());
 }
@@ -2677,7 +2691,7 @@
   ASSERT(locs()->temp(0).reg() == EDX);
   ASSERT(locs()->out(0).reg() == EAX);
 
-  __ movl(EDX, Immediate(num_context_variables()));
+  __ movl(EDX, compiler::Immediate(num_context_variables()));
   compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
@@ -2697,9 +2711,9 @@
   Register field = locs()->in(0).reg();
   Register temp = locs()->temp(0).reg();
 
-  Label call_runtime, no_call;
+  compiler::Label call_runtime, no_call;
 
-  __ movl(temp, FieldAddress(field, Field::static_value_offset()));
+  __ movl(temp, compiler::FieldAddress(field, Field::static_value_offset()));
   __ CompareObject(temp, Object::sentinel());
   __ j(EQUAL, &call_runtime);
 
@@ -2770,17 +2784,19 @@
        compiler->StackSize()) *
       kWordSize;
   ASSERT(fp_sp_dist <= 0);
-  __ leal(ESP, Address(EBP, fp_sp_dist));
+  __ leal(ESP, compiler::Address(EBP, fp_sp_dist));
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movl(Address(EBP, compiler::target::FrameOffsetInBytesForVariable(
-                               raw_exception_var_)),
+      __ movl(compiler::Address(EBP,
+                                compiler::target::FrameOffsetInBytesForVariable(
+                                    raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movl(Address(EBP, compiler::target::FrameOffsetInBytesForVariable(
-                               raw_stacktrace_var_)),
+      __ movl(compiler::Address(EBP,
+                                compiler::target::FrameOffsetInBytesForVariable(
+                                    raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -2808,8 +2824,8 @@
     if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
-      __ movl(Address(THR, Thread::stack_overflow_flags_offset()),
-              Immediate(Thread::kOsrRequest));
+      __ movl(compiler::Address(THR, Thread::stack_overflow_flags_offset()),
+              compiler::Immediate(Thread::kOsrRequest));
     }
     __ Comment("CheckStackOverflowSlowPath");
     __ Bind(entry_label());
@@ -2836,20 +2852,20 @@
     __ jmp(exit_label());
   }
 
-  Label* osr_entry_label() {
+  compiler::Label* osr_entry_label() {
     ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
  private:
-  Label osr_entry_label_;
+  compiler::Label osr_entry_label_;
 };
 
 void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   CheckStackOverflowSlowPath* slow_path = new CheckStackOverflowSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
 
-  __ cmpl(ESP, Address(THR, Thread::stack_limit_offset()));
+  __ cmpl(ESP, compiler::Address(THR, Thread::stack_limit_offset()));
   __ j(BELOW_EQUAL, slow_path->entry_label());
   if (compiler->CanOSRFunction() && in_loop()) {
     // In unoptimized code check the usage counter to trigger OSR at loop
@@ -2858,9 +2874,9 @@
     __ LoadObject(EDI, compiler->parsed_function().function());
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ incl(FieldAddress(EDI, Function::usage_counter_offset()));
-    __ cmpl(FieldAddress(EDI, Function::usage_counter_offset()),
-            Immediate(threshold));
+    __ incl(compiler::FieldAddress(EDI, Function::usage_counter_offset()));
+    __ cmpl(compiler::FieldAddress(EDI, Function::usage_counter_offset()),
+            compiler::Immediate(threshold));
     __ j(GREATER_EQUAL, slow_path->osr_entry_label());
   }
   if (compiler->ForceSlowPathForStackOverflow()) {
@@ -2877,10 +2893,11 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -2891,20 +2908,20 @@
     if (shift_left->can_overflow()) {
       if (value == 1) {
         // Use overflow flag.
-        __ shll(left, Immediate(1));
+        __ shll(left, compiler::Immediate(1));
         __ j(OVERFLOW, deopt);
         return;
       }
       // Check for overflow.
       Register temp = locs.temp(0).reg();
       __ movl(temp, left);
-      __ shll(left, Immediate(value));
-      __ sarl(left, Immediate(value));
+      __ shll(left, compiler::Immediate(value));
+      __ sarl(left, compiler::Immediate(value));
       __ cmpl(left, temp);
       __ j(NOT_EQUAL, deopt);  // Overflow.
     }
     // Shift for result now we know there is no overflow.
-    __ shll(left, Immediate(value));
+    __ shll(left, compiler::Immediate(value));
     return;
   }
 
@@ -2918,7 +2935,7 @@
     if (obj.IsSmi()) {
       const intptr_t left_int = Smi::Cast(obj).Value();
       if (left_int == 0) {
-        __ cmpl(right, Immediate(0));
+        __ cmpl(right, compiler::Immediate(0));
         __ j(NEGATIVE, deopt);
         return;
       }
@@ -2926,8 +2943,8 @@
       const bool right_needs_check =
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
-        __ cmpl(right,
-                Immediate(reinterpret_cast<int32_t>(Smi::New(max_right))));
+        __ cmpl(right, compiler::Immediate(
+                           reinterpret_cast<int32_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -2943,15 +2960,15 @@
     if (right_needs_check) {
       if (!RangeUtils::IsPositive(right_range)) {
         ASSERT(shift_left->CanDeoptimize());
-        __ cmpl(right, Immediate(0));
+        __ cmpl(right, compiler::Immediate(0));
         __ j(NEGATIVE, deopt);
       }
-      Label done, is_not_zero;
-      __ cmpl(right,
-              Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
-      __ j(BELOW, &is_not_zero, Assembler::kNearJump);
+      compiler::Label done, is_not_zero;
+      __ cmpl(right, compiler::Immediate(
+                         reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ j(BELOW, &is_not_zero, compiler::Assembler::kNearJump);
       __ xorl(left, left);
-      __ jmp(&done, Assembler::kNearJump);
+      __ jmp(&done, compiler::Assembler::kNearJump);
       __ Bind(&is_not_zero);
       __ SmiUntag(right);
       __ shll(left, right);
@@ -2963,8 +2980,8 @@
   } else {
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
-      __ cmpl(right,
-              Immediate(reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
+      __ cmpl(right, compiler::Immediate(
+                         reinterpret_cast<int32_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -3103,7 +3120,7 @@
                                   Token::Kind op_kind,
                                   Register left,
                                   const OperandType& right,
-                                  Label* deopt) {
+                                  compiler::Label* deopt) {
   switch (op_kind) {
     case Token::kADD:
       __ addl(left, right);
@@ -3138,7 +3155,7 @@
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -3156,7 +3173,8 @@
       case Token::kMUL: {
         const intptr_t imm =
             (op_kind() == Token::kMUL) ? value : Smi::RawValue(value);
-        EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(imm), deopt);
+        EmitIntegerArithmetic(compiler, op_kind(), left,
+                              compiler::Immediate(imm), deopt);
         break;
       }
 
@@ -3168,12 +3186,12 @@
         ASSERT(kSmiTagSize == 1);
         Register temp = locs()->temp(0).reg();
         __ movl(temp, left);
-        __ sarl(temp, Immediate(31));
+        __ sarl(temp, compiler::Immediate(31));
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
-        __ shrl(temp, Immediate(32 - shift_count));
+        __ shrl(temp, compiler::Immediate(32 - shift_count));
         __ addl(left, temp);
         ASSERT(shift_count > 0);
-        __ sarl(left, Immediate(shift_count));
+        __ sarl(left, compiler::Immediate(shift_count));
         if (value < 0) {
           __ negl(left);
         }
@@ -3184,8 +3202,8 @@
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        __ sarl(left,
-                Immediate(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+        __ sarl(left, compiler::Immediate(
+                          Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -3198,7 +3216,7 @@
   }  // if locs()->in(1).IsConstant()
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = LocationToStackSlotAddress(locs()->in(1));
+    const compiler::Address& right = LocationToStackSlotAddress(locs()->in(1));
     if (op_kind() == Token::kMUL) {
       __ SmiUntag(left);
     }
@@ -3238,7 +3256,7 @@
       if (RangeUtils::Overlaps(right_range(), -1, -1)) {
         // Check the corner case of dividing the 'MIN_SMI' with -1, in which
         // case we cannot tag the result.
-        __ cmpl(result, Immediate(0x40000000));
+        __ cmpl(result, compiler::Immediate(0x40000000));
         __ j(EQUAL, deopt);
       }
       __ SmiTag(result);
@@ -3267,17 +3285,17 @@
       //      res = res + right;
       //    }
       //  }
-      Label done;
-      __ cmpl(result, Immediate(0));
-      __ j(GREATER_EQUAL, &done, Assembler::kNearJump);
+      compiler::Label done;
+      __ cmpl(result, compiler::Immediate(0));
+      __ j(GREATER_EQUAL, &done, compiler::Assembler::kNearJump);
       // Result is negative, adjust it.
       if (RangeUtils::Overlaps(right_range(), -1, 1)) {
         // Right can be positive and negative.
-        Label subtract;
-        __ cmpl(right, Immediate(0));
-        __ j(LESS, &subtract, Assembler::kNearJump);
+        compiler::Label subtract;
+        __ cmpl(right, compiler::Immediate(0));
+        __ j(LESS, &subtract, compiler::Assembler::kNearJump);
         __ addl(result, right);
-        __ jmp(&done, Assembler::kNearJump);
+        __ jmp(&done, compiler::Assembler::kNearJump);
         __ Bind(&subtract);
         __ subl(result, right);
       } else if (right_range()->IsPositive()) {
@@ -3293,17 +3311,17 @@
     }
     case Token::kSHR: {
       if (CanDeoptimize()) {
-        __ cmpl(right, Immediate(0));
+        __ cmpl(right, compiler::Immediate(0));
         __ j(LESS, deopt);
       }
       __ SmiUntag(right);
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if (!RangeUtils::OnlyLessThanOrEqualTo(right_range(), kCountLimit)) {
-        __ cmpl(right, Immediate(kCountLimit));
-        Label count_ok;
-        __ j(LESS, &count_ok, Assembler::kNearJump);
-        __ movl(right, Immediate(kCountLimit));
+        __ cmpl(right, compiler::Immediate(kCountLimit));
+        compiler::Label count_ok;
+        __ j(LESS, &count_ok, compiler::Assembler::kNearJump);
+        __ movl(right, compiler::Immediate(kCountLimit));
         __ Bind(&count_ok);
       }
       ASSERT(right == ECX);  // Count must be in ECX
@@ -3381,10 +3399,11 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   ASSERT(locs.in(1).IsConstant());
 
   const Object& constant = locs.in(1).constant();
@@ -3397,13 +3416,13 @@
     // Check for overflow.
     Register temp = locs.temp(0).reg();
     __ movl(temp, left);
-    __ shll(left, Immediate(value));
-    __ sarl(left, Immediate(value));
+    __ shll(left, compiler::Immediate(value));
+    __ sarl(left, compiler::Immediate(value));
     __ cmpl(left, temp);
     __ j(NOT_EQUAL, deopt);  // Overflow.
   }
   // Shift for result now we know there is no overflow.
-  __ shll(left, Immediate(value));
+  __ shll(left, compiler::Immediate(value));
 }
 
 void BinaryInt32OpInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -3415,7 +3434,7 @@
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -3431,8 +3450,8 @@
       case Token::kBIT_AND:
       case Token::kBIT_OR:
       case Token::kBIT_XOR:
-        EmitIntegerArithmetic(compiler, op_kind(), left, Immediate(value),
-                              deopt);
+        EmitIntegerArithmetic(compiler, op_kind(), left,
+                              compiler::Immediate(value), deopt);
         break;
 
       case Token::kTRUNCDIV: {
@@ -3443,7 +3462,7 @@
       case Token::kSHR: {
         // sarl operation masks the count to 5 bits.
         const intptr_t kCountLimit = 0x1F;
-        __ sarl(left, Immediate(Utils::Minimum(value, kCountLimit)));
+        __ sarl(left, compiler::Immediate(Utils::Minimum(value, kCountLimit)));
         break;
       }
 
@@ -3455,7 +3474,7 @@
   }  // if locs()->in(1).IsConstant()
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = LocationToStackSlotAddress(locs()->in(1));
+    const compiler::Address& right = LocationToStackSlotAddress(locs()->in(1));
     EmitIntegerArithmetic(compiler, op_kind(), left, right, deopt);
     return;
   }  // if locs()->in(1).IsStackSlot.
@@ -3537,7 +3556,7 @@
 }
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
                              licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
@@ -3545,16 +3564,16 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
-    __ testl(left, Immediate(kSmiTagMask));
+    __ testl(left, compiler::Immediate(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ testl(right, Immediate(kSmiTagMask));
+    __ testl(right, compiler::Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ testl(left, Immediate(kSmiTagMask));
+    __ testl(left, compiler::Immediate(kSmiTagMask));
   } else {
     Register temp = locs()->temp(0).reg();
     __ movl(temp, left);
     __ orl(temp, right);
-    __ testl(temp, Immediate(kSmiTagMask));
+    __ testl(temp, compiler::Immediate(kSmiTagMask));
   }
   __ j(ZERO, deopt);
 }
@@ -3580,16 +3599,16 @@
 
   switch (from_representation()) {
     case kUnboxedDouble:
-      __ movsd(FieldAddress(out_reg, ValueOffset()), value);
+      __ movsd(compiler::FieldAddress(out_reg, ValueOffset()), value);
       break;
     case kUnboxedFloat:
       __ cvtss2sd(FpuTMP, value);
-      __ movsd(FieldAddress(out_reg, ValueOffset()), FpuTMP);
+      __ movsd(compiler::FieldAddress(out_reg, ValueOffset()), FpuTMP);
       break;
     case kUnboxedFloat32x4:
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4:
-      __ movups(FieldAddress(out_reg, ValueOffset()), value);
+      __ movups(compiler::FieldAddress(out_reg, ValueOffset()), value);
       break;
     default:
       UNREACHABLE();
@@ -3628,21 +3647,21 @@
     case kUnboxedInt64: {
       PairLocation* result = locs()->out(0).AsPairLocation();
       ASSERT(result->At(0).reg() != box);
-      __ movl(result->At(0).reg(), FieldAddress(box, ValueOffset()));
+      __ movl(result->At(0).reg(), compiler::FieldAddress(box, ValueOffset()));
       __ movl(result->At(1).reg(),
-              FieldAddress(box, ValueOffset() + kWordSize));
+              compiler::FieldAddress(box, ValueOffset() + kWordSize));
       break;
     }
 
     case kUnboxedDouble: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movsd(result, FieldAddress(box, ValueOffset()));
+      __ movsd(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
     case kUnboxedFloat: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movsd(result, FieldAddress(box, ValueOffset()));
+      __ movsd(result, compiler::FieldAddress(box, ValueOffset()));
       __ cvtsd2ss(result, result);
       break;
     }
@@ -3651,7 +3670,7 @@
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movups(result, FieldAddress(box, ValueOffset()));
+      __ movups(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
@@ -3694,10 +3713,10 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(value == result);
-  Label done;
+  compiler::Label done;
   __ SmiUntag(value);  // Leaves CF after SmiUntag.
-  __ j(NOT_CARRY, &done, Assembler::kNearJump);
-  __ movl(result, FieldAddress(value, Mint::value_offset()));
+  __ j(NOT_CARRY, &done, compiler::Assembler::kNearJump);
+  __ movl(result, compiler::FieldAddress(value, Mint::value_offset()));
   __ Bind(&done);
 }
 
@@ -3706,9 +3725,9 @@
   PairLocation* result = locs()->out(0).AsPairLocation();
   ASSERT(result->At(0).reg() != box);
   ASSERT(result->At(1).reg() != box);
-  Label done;
+  compiler::Label done;
   EmitSmiConversion(compiler);  // Leaves CF after SmiUntag.
-  __ j(NOT_CARRY, &done, Assembler::kNearJump);
+  __ j(NOT_CARRY, &done, compiler::Assembler::kNearJump);
   EmitLoadFromBox(compiler);
   __ Bind(&done);
 }
@@ -3745,18 +3764,18 @@
   if (ValueFitsSmi()) {
     ASSERT(value == out);
     ASSERT(kSmiTag == 0);
-    __ shll(out, Immediate(kSmiTagSize));
+    __ shll(out, compiler::Immediate(kSmiTagSize));
     return;
   }
 
   __ movl(out, value);
-  __ shll(out, Immediate(kSmiTagSize));
-  Label done;
+  __ shll(out, compiler::Immediate(kSmiTagSize));
+  compiler::Label done;
   if (from_representation() == kUnboxedInt32) {
     __ j(NO_OVERFLOW, &done);
   } else {
     ASSERT(value != out);  // Value was not overwritten.
-    __ testl(value, Immediate(0xC0000000));
+    __ testl(value, compiler::Immediate(0xC0000000));
     __ j(ZERO, &done);
   }
 
@@ -3770,15 +3789,16 @@
   ASSERT(value != out);  // We need the value after the allocation.
   BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                   locs()->temp(0).reg());
-  __ movl(FieldAddress(out, Mint::value_offset()), value);
+  __ movl(compiler::FieldAddress(out, Mint::value_offset()), value);
   if (from_representation() == kUnboxedInt32) {
     // In the signed may-overflow case we asked for the input (value) to be
     // writable so we can use it as a temp to put the sign extension bits in.
-    __ sarl(value, Immediate(31));  // Sign extend the Mint.
-    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value);
+    __ sarl(value, compiler::Immediate(31));  // Sign extend the Mint.
+    __ movl(compiler::FieldAddress(out, Mint::value_offset() + kWordSize),
+            value);
   } else {
-    __ movl(FieldAddress(out, Mint::value_offset() + kWordSize),
-            Immediate(0));  // Zero extend the Mint.
+    __ movl(compiler::FieldAddress(out, Mint::value_offset() + kWordSize),
+            compiler::Immediate(0));  // Zero extend the Mint.
   }
   __ Bind(&done);
 }
@@ -3821,29 +3841,30 @@
 
   // Unboxed operations produce smis or mint-sized values.
   // Check if value fits into a smi.
-  Label not_smi, done;
+  compiler::Label not_smi, done;
 
   // 1. Compute (x + -kMinSmi) which has to be in the range
   //    0 .. -kMinSmi+kMaxSmi for x to fit into a smi.
-  __ addl(value_lo, Immediate(0x40000000));
-  __ adcl(out_reg, Immediate(0));
+  __ addl(value_lo, compiler::Immediate(0x40000000));
+  __ adcl(out_reg, compiler::Immediate(0));
   // 2. Unsigned compare to -kMinSmi+kMaxSmi.
-  __ cmpl(value_lo, Immediate(0x80000000));
-  __ sbbl(out_reg, Immediate(0));
+  __ cmpl(value_lo, compiler::Immediate(0x80000000));
+  __ sbbl(out_reg, compiler::Immediate(0));
   __ j(ABOVE_EQUAL, &not_smi);
   // 3. Restore lower half if result is a smi.
-  __ subl(value_lo, Immediate(0x40000000));
+  __ subl(value_lo, compiler::Immediate(0x40000000));
   __ movl(out_reg, value_lo);
   __ SmiTag(out_reg);
   __ jmp(&done);
   __ Bind(&not_smi);
   // 3. Restore lower half of input before using it.
-  __ subl(value_lo, Immediate(0x40000000));
+  __ subl(value_lo, compiler::Immediate(0x40000000));
 
   BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
                                   out_reg, locs()->temp(0).reg());
-  __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo);
-  __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi);
+  __ movl(compiler::FieldAddress(out_reg, Mint::value_offset()), value_lo);
+  __ movl(compiler::FieldAddress(out_reg, Mint::value_offset() + kWordSize),
+          value_hi);
   __ Bind(&done);
 }
 
@@ -3875,15 +3896,15 @@
 
 static void LoadInt32FromMint(FlowGraphCompiler* compiler,
                               Register result,
-                              const Address& lo,
-                              const Address& hi,
+                              const compiler::Address& lo,
+                              const compiler::Address& hi,
                               Register temp,
-                              Label* deopt) {
+                              compiler::Label* deopt) {
   __ movl(result, lo);
   if (deopt != NULL) {
     ASSERT(temp != result);
     __ movl(temp, result);
-    __ sarl(temp, Immediate(31));
+    __ sarl(temp, compiler::Immediate(31));
     __ cmpl(temp, hi);
     __ j(NOT_EQUAL, deopt);
   }
@@ -3894,11 +3915,11 @@
   Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   const Register temp = CanDeoptimize() ? locs()->temp(0).reg() : kNoRegister;
-  Label* deopt = nullptr;
+  compiler::Label* deopt = nullptr;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger);
   }
-  Label* out_of_range = !is_truncating() ? deopt : NULL;
+  compiler::Label* out_of_range = !is_truncating() ? deopt : NULL;
 
   const intptr_t lo_offset = Mint::value_offset();
   const intptr_t hi_offset = Mint::value_offset() + kWordSize;
@@ -3908,18 +3929,19 @@
     __ SmiUntag(value);
   } else if (value_cid == kMintCid) {
     ASSERT((value != result) || (out_of_range == NULL));
-    LoadInt32FromMint(compiler, result, FieldAddress(value, lo_offset),
-                      FieldAddress(value, hi_offset), temp, out_of_range);
+    LoadInt32FromMint(
+        compiler, result, compiler::FieldAddress(value, lo_offset),
+        compiler::FieldAddress(value, hi_offset), temp, out_of_range);
   } else if (!CanDeoptimize()) {
     ASSERT(value == result);
-    Label done;
+    compiler::Label done;
     __ SmiUntag(value);
     __ j(NOT_CARRY, &done);
-    __ movl(value, Address(value, TIMES_2, lo_offset));
+    __ movl(value, compiler::Address(value, TIMES_2, lo_offset));
     __ Bind(&done);
   } else {
     ASSERT(value == result);
-    Label done;
+    compiler::Label done;
     __ SmiUntagOrCheckClass(value, kMintCid, temp, &done);
     __ j(NOT_EQUAL, deopt);
     if (out_of_range != NULL) {
@@ -3927,8 +3949,9 @@
       __ movl(value_temp, value);
       value = value_temp;
     }
-    LoadInt32FromMint(compiler, result, Address(value, TIMES_2, lo_offset),
-                      Address(value, TIMES_2, hi_offset), temp, out_of_range);
+    LoadInt32FromMint(
+        compiler, result, compiler::Address(value, TIMES_2, lo_offset),
+        compiler::Address(value, TIMES_2, hi_offset), temp, out_of_range);
     __ Bind(&done);
   }
 }
@@ -3967,8 +3990,9 @@
   const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = Assembler::ElementAddressForRegIndex(
-      IsExternal(), class_id(), index_scale(), str, index.reg());
+  compiler::Address element_address =
+      compiler::Assembler::ElementAddressForRegIndex(
+          IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -4049,14 +4073,14 @@
       __ MoveRegister(temp, result);
       __ SmiTag(result);
 
-      Label done;
-      __ testl(temp, Immediate(0xC0000000));
+      compiler::Label done;
+      __ testl(temp, compiler::Immediate(0xC0000000));
       __ j(ZERO, &done);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(),
                                       result, temp2);
-      __ movl(FieldAddress(result, Mint::value_offset()), temp);
-      __ movl(FieldAddress(result, Mint::value_offset() + kWordSize),
-              Immediate(0));
+      __ movl(compiler::FieldAddress(result, Mint::value_offset()), temp);
+      __ movl(compiler::FieldAddress(result, Mint::value_offset() + kWordSize),
+              compiler::Immediate(0));
       __ Bind(&done);
     }
   }
@@ -4119,29 +4143,29 @@
   const XmmRegister value = locs()->in(0).fpu_reg();
   const bool is_negated = kind() != Token::kEQ;
   if (op_kind() == MethodRecognizer::kDouble_getIsNaN) {
-    Label is_nan;
+    compiler::Label is_nan;
     __ comisd(value, value);
     return is_negated ? PARITY_ODD : PARITY_EVEN;
   } else {
     ASSERT(op_kind() == MethodRecognizer::kDouble_getIsInfinite);
     const Register temp = locs()->temp(0).reg();
-    Label check_upper;
-    __ AddImmediate(ESP, Immediate(-kDoubleSize));
-    __ movsd(Address(ESP, 0), value);
-    __ movl(temp, Address(ESP, 0));
+    compiler::Label check_upper;
+    __ AddImmediate(ESP, compiler::Immediate(-kDoubleSize));
+    __ movsd(compiler::Address(ESP, 0), value);
+    __ movl(temp, compiler::Address(ESP, 0));
     // If the low word isn't zero, then it isn't infinity.
-    __ cmpl(temp, Immediate(0));
-    __ j(EQUAL, &check_upper, Assembler::kNearJump);
-    __ AddImmediate(ESP, Immediate(kDoubleSize));
+    __ cmpl(temp, compiler::Immediate(0));
+    __ j(EQUAL, &check_upper, compiler::Assembler::kNearJump);
+    __ AddImmediate(ESP, compiler::Immediate(kDoubleSize));
     __ jmp(is_negated ? labels.true_label : labels.false_label);
     __ Bind(&check_upper);
     // Check the high word.
-    __ movl(temp, Address(ESP, kWordSize));
-    __ AddImmediate(ESP, Immediate(kDoubleSize));
+    __ movl(temp, compiler::Address(ESP, kWordSize));
+    __ AddImmediate(ESP, compiler::Immediate(kDoubleSize));
     // Mask off sign bit.
-    __ andl(temp, Immediate(0x7FFFFFFF));
+    __ andl(temp, compiler::Immediate(0x7FFFFFFF));
     // Compare with +infinity.
-    __ cmpl(temp, Immediate(0x7FF00000));
+    __ cmpl(temp, compiler::Immediate(0x7FF00000));
     return is_negated ? NOT_EQUAL : EQUAL;
   }
 }
@@ -4186,21 +4210,21 @@
 #undef EMIT
     case SimdOpInstr::kFloat32x4Scale:
       __ cvtsd2ss(left, left);
-      __ shufps(left, left, Immediate(0x00));
+      __ shufps(left, left, compiler::Immediate(0x00));
       __ mulps(left, right);
       break;
     case SimdOpInstr::kFloat32x4ShuffleMix:
     case SimdOpInstr::kInt32x4ShuffleMix:
-      __ shufps(left, right, Immediate(instr->mask()));
+      __ shufps(left, right, compiler::Immediate(instr->mask()));
       break;
     case SimdOpInstr::kFloat64x2Constructor:
       // shufpd mask 0x0 results in:
       // Lower 64-bits of left = Lower 64-bits of left.
       // Upper 64-bits of left = Lower 64-bits of right.
-      __ shufpd(left, right, Immediate(0x0));
+      __ shufpd(left, right, compiler::Immediate(0x0));
       break;
     case SimdOpInstr::kFloat64x2Scale:
-      __ shufpd(right, right, Immediate(0x00));
+      __ shufpd(right, right, compiler::Immediate(0x00));
       __ mulpd(left, right);
       break;
     case SimdOpInstr::kFloat64x2WithX:
@@ -4210,11 +4234,11 @@
                      (SimdOpInstr::kFloat64x2WithX + 1));
       const intptr_t lane_index = instr->kind() - SimdOpInstr::kFloat64x2WithX;
       ASSERT(0 <= lane_index && lane_index < 2);
-      __ SubImmediate(ESP, Immediate(kSimd128Size));
-      __ movups(Address(ESP, 0), left);
-      __ movsd(Address(ESP, lane_index * kDoubleSize), right);
-      __ movups(left, Address(ESP, 0));
-      __ AddImmediate(ESP, Immediate(kSimd128Size));
+      __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
+      __ movups(compiler::Address(ESP, 0), left);
+      __ movsd(compiler::Address(ESP, lane_index * kDoubleSize), right);
+      __ movups(left, compiler::Address(ESP, 0));
+      __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
       break;
     }
     case SimdOpInstr::kFloat32x4WithX:
@@ -4231,11 +4255,11 @@
       const intptr_t lane_index = instr->kind() - SimdOpInstr::kFloat32x4WithX;
       ASSERT(0 <= lane_index && lane_index < 4);
       __ cvtsd2ss(left, left);
-      __ SubImmediate(ESP, Immediate(kSimd128Size));
-      __ movups(Address(ESP, 0), right);
-      __ movss(Address(ESP, lane_index * kFloatSize), left);
-      __ movups(left, Address(ESP, 0));
-      __ AddImmediate(ESP, Immediate(kSimd128Size));
+      __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
+      __ movups(compiler::Address(ESP, 0), right);
+      __ movss(compiler::Address(ESP, lane_index * kFloatSize), left);
+      __ movups(left, compiler::Address(ESP, 0));
+      __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
       break;
     }
     default:
@@ -4266,26 +4290,26 @@
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleY:
-      __ shufps(value, value, Immediate(0x55));
+      __ shufps(value, value, compiler::Immediate(0x55));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleZ:
-      __ shufps(value, value, Immediate(0xAA));
+      __ shufps(value, value, compiler::Immediate(0xAA));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleW:
-      __ shufps(value, value, Immediate(0xFF));
+      __ shufps(value, value, compiler::Immediate(0xFF));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4Shuffle:
     case SimdOpInstr::kInt32x4Shuffle:
-      __ shufps(value, value, Immediate(instr->mask()));
+      __ shufps(value, value, compiler::Immediate(instr->mask()));
       break;
     case SimdOpInstr::kFloat32x4Splat:
       // Convert to Float32.
       __ cvtsd2ss(value, value);
       // Splat across all lanes.
-      __ shufps(value, value, Immediate(0x00));
+      __ shufps(value, value, compiler::Immediate(0x00));
       break;
     case SimdOpInstr::kFloat64x2ToFloat32x4:
       __ cvtpd2ps(value, value);
@@ -4303,10 +4327,10 @@
       // NOP.
       break;
     case SimdOpInstr::kFloat64x2GetY:
-      __ shufpd(value, value, Immediate(0x33));
+      __ shufpd(value, value, compiler::Immediate(0x33));
       break;
     case SimdOpInstr::kFloat64x2Splat:
-      __ shufpd(value, value, Immediate(0x0));
+      __ shufpd(value, value, compiler::Immediate(0x0));
       break;
     default:
       UNREACHABLE();
@@ -4334,13 +4358,13 @@
   // TODO(dartbug.com/30949) avoid transfer through memory. SSE4.1 has
   // insertps, with SSE2 this instruction can be implemented through unpcklps.
   const XmmRegister out = v0;
-  __ SubImmediate(ESP, Immediate(kSimd128Size));
+  __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
     __ cvtsd2ss(out, instr->locs()->in(i).fpu_reg());
-    __ movss(Address(ESP, i * kFloatSize), out);
+    __ movss(compiler::Address(ESP, i * kFloatSize), out);
   }
-  __ movups(out, Address(ESP, 0));
-  __ AddImmediate(ESP, Immediate(kSimd128Size));
+  __ movups(out, compiler::Address(ESP, 0));
+  __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Float32x4Zero, (XmmRegister out)) {
@@ -4363,30 +4387,31 @@
 DEFINE_EMIT(Int32x4Constructor,
             (XmmRegister result, Register, Register, Register, Register)) {
   // TODO(dartbug.com/30949) avoid transfer through memory.
-  __ SubImmediate(ESP, Immediate(kSimd128Size));
+  __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
-    __ movl(Address(ESP, i * kInt32Size), instr->locs()->in(i).reg());
+    __ movl(compiler::Address(ESP, i * kInt32Size), instr->locs()->in(i).reg());
   }
-  __ movups(result, Address(ESP, 0));
-  __ AddImmediate(ESP, Immediate(kSimd128Size));
+  __ movups(result, compiler::Address(ESP, 0));
+  __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Int32x4BoolConstructor,
             (XmmRegister result, Register, Register, Register, Register)) {
   // TODO(dartbug.com/30949) avoid transfer through memory and branches.
-  __ SubImmediate(ESP, Immediate(kSimd128Size));
+  __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
-    Label store_false, done;
+    compiler::Label store_false, done;
     __ CompareObject(instr->locs()->in(i).reg(), Bool::True());
     __ j(NOT_EQUAL, &store_false);
-    __ movl(Address(ESP, kInt32Size * i), Immediate(0xFFFFFFFF));
+    __ movl(compiler::Address(ESP, kInt32Size * i),
+            compiler::Immediate(0xFFFFFFFF));
     __ jmp(&done);
     __ Bind(&store_false);
-    __ movl(Address(ESP, kInt32Size * i), Immediate(0x0));
+    __ movl(compiler::Address(ESP, kInt32Size * i), compiler::Immediate(0x0));
     __ Bind(&done);
   }
-  __ movups(result, Address(ESP, 0));
-  __ AddImmediate(ESP, Immediate(kSimd128Size));
+  __ movups(result, compiler::Address(ESP, 0));
+  __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
 }
 
 // TODO(dartbug.com/30953) need register with a byte component for setcc.
@@ -4399,10 +4424,10 @@
   ASSERT(0 <= lane_index && lane_index < 4);
 
   // TODO(dartbug.com/30949) avoid transfer through memory.
-  __ SubImmediate(ESP, Immediate(kSimd128Size));
-  __ movups(Address(ESP, 0), value);
-  __ movl(EDX, Address(ESP, lane_index * kInt32Size));
-  __ AddImmediate(ESP, Immediate(kSimd128Size));
+  __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
+  __ movups(compiler::Address(ESP, 0), value);
+  __ movl(EDX, compiler::Address(ESP, lane_index * kInt32Size));
+  __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
 
   // EDX = EDX != 0 ? 0 : 1
   __ testl(EDX, EDX);
@@ -4410,7 +4435,8 @@
   __ movzxb(EDX, DL);
 
   ASSERT_BOOL_FALSE_FOLLOWS_BOOL_TRUE();
-  __ movl(EDX, Address(THR, EDX, TIMES_4, Thread::bool_true_offset()));
+  __ movl(EDX,
+          compiler::Address(THR, EDX, TIMES_4, Thread::bool_true_offset()));
 }
 
 // TODO(dartbug.com/30953) need register with a byte component for setcc.
@@ -4427,8 +4453,8 @@
   ASSERT(0 <= lane_index && lane_index < 4);
 
   // TODO(dartbug.com/30949) avoid transfer through memory.
-  __ SubImmediate(ESP, Immediate(kSimd128Size));
-  __ movups(Address(ESP, 0), mask);
+  __ SubImmediate(ESP, compiler::Immediate(kSimd128Size));
+  __ movups(compiler::Address(ESP, 0), mask);
 
   // EDX = flag == true ? -1 : 0
   __ xorl(EDX, EDX);
@@ -4436,11 +4462,11 @@
   __ setcc(EQUAL, DL);
   __ negl(EDX);
 
-  __ movl(Address(ESP, lane_index * kInt32Size), EDX);
+  __ movl(compiler::Address(ESP, lane_index * kInt32Size), EDX);
 
   // Copy mask back to register.
-  __ movups(mask, Address(ESP, 0));
-  __ AddImmediate(ESP, Immediate(kSimd128Size));
+  __ movups(mask, compiler::Address(ESP, 0));
+  __ AddImmediate(ESP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Int32x4Select,
@@ -4606,10 +4632,10 @@
   __ movl(kSavedSPReg, ESP);
   __ ReserveAlignedFrameSpace(kWordSize * TargetFunction().argument_count());
 
-  __ movl(Address(ESP, +0 * kWordSize), locs()->in(0).reg());
-  __ movl(Address(ESP, +1 * kWordSize), locs()->in(1).reg());
-  __ movl(Address(ESP, +2 * kWordSize), locs()->in(2).reg());
-  __ movl(Address(ESP, +3 * kWordSize), locs()->in(3).reg());
+  __ movl(compiler::Address(ESP, +0 * kWordSize), locs()->in(0).reg());
+  __ movl(compiler::Address(ESP, +1 * kWordSize), locs()->in(1).reg());
+  __ movl(compiler::Address(ESP, +2 * kWordSize), locs()->in(2).reg());
+  __ movl(compiler::Address(ESP, +3 * kWordSize), locs()->in(3).reg());
 
   // Call the function.
   __ CallRuntime(TargetFunction(), TargetFunction().argument_count());
@@ -4650,29 +4676,30 @@
          (op_kind() == MethodRecognizer::kMathMax));
   const intptr_t is_min = (op_kind() == MethodRecognizer::kMathMin);
   if (result_cid() == kDoubleCid) {
-    Label done, returns_nan, are_equal;
+    compiler::Label done, returns_nan, are_equal;
     XmmRegister left = locs()->in(0).fpu_reg();
     XmmRegister right = locs()->in(1).fpu_reg();
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
     __ comisd(left, right);
-    __ j(PARITY_EVEN, &returns_nan, Assembler::kNearJump);
-    __ j(EQUAL, &are_equal, Assembler::kNearJump);
+    __ j(PARITY_EVEN, &returns_nan, compiler::Assembler::kNearJump);
+    __ j(EQUAL, &are_equal, compiler::Assembler::kNearJump);
     const Condition double_condition =
         is_min ? TokenKindToDoubleCondition(Token::kLT)
                : TokenKindToDoubleCondition(Token::kGT);
     ASSERT(left == result);
-    __ j(double_condition, &done, Assembler::kNearJump);
+    __ j(double_condition, &done, compiler::Assembler::kNearJump);
     __ movsd(result, right);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&done, compiler::Assembler::kNearJump);
 
     __ Bind(&returns_nan);
     static double kNaN = NAN;
-    __ movsd(result, Address::Absolute(reinterpret_cast<uword>(&kNaN)));
-    __ jmp(&done, Assembler::kNearJump);
+    __ movsd(result,
+             compiler::Address::Absolute(reinterpret_cast<uword>(&kNaN)));
+    __ jmp(&done, compiler::Assembler::kNearJump);
 
     __ Bind(&are_equal);
-    Label left_is_negative;
+    compiler::Label left_is_negative;
     // Check for negative zero: -0.0 is equal 0.0 but min or max must return
     // -0.0 or 0.0 respectively.
     // Check for negative left value (get the sign bit):
@@ -4680,12 +4707,14 @@
     // - max -> left is negative ? right : left
     // Check the sign bit.
     __ movmskpd(temp, left);
-    __ testl(temp, Immediate(1));
+    __ testl(temp, compiler::Immediate(1));
     ASSERT(left == result);
     if (is_min) {
-      __ j(NOT_ZERO, &done, Assembler::kNearJump);  // Negative -> return left.
+      __ j(NOT_ZERO, &done,
+           compiler::Assembler::kNearJump);  // Negative -> return left.
     } else {
-      __ j(ZERO, &done, Assembler::kNearJump);  // Positive -> return left.
+      __ j(ZERO, &done,
+           compiler::Assembler::kNearJump);  // Positive -> return left.
     }
     __ movsd(result, right);
     __ Bind(&done);
@@ -4717,14 +4746,16 @@
   ASSERT(value == locs()->out(0).reg());
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+      compiler::Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ negl(value);
       __ j(OVERFLOW, deopt);
       break;
     }
     case Token::kBIT_NOT:
       __ notl(value);
-      __ andl(value, Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
+      __ andl(value,
+              compiler::Immediate(~kSmiTagMask));  // Remove inverted smi-tag.
       break;
     default:
       UNREACHABLE();
@@ -4807,13 +4838,13 @@
   // Push lo.
   __ pushl(in_lo);
   // Perform conversion from Mint to double.
-  __ fildl(Address(ESP, 0));
+  __ fildl(compiler::Address(ESP, 0));
   // Pop FPU stack onto regular stack.
-  __ fstpl(Address(ESP, 0));
+  __ fstpl(compiler::Address(ESP, 0));
   // Copy into result.
-  __ movsd(result, Address(ESP, 0));
+  __ movsd(result, compiler::Address(ESP, 0));
   // Pop args.
-  __ addl(ESP, Immediate(2 * kWordSize));
+  __ addl(ESP, compiler::Immediate(2 * kWordSize));
 }
 
 LocationSummary* DoubleToIntegerInstr::MakeLocationSummary(Zone* zone,
@@ -4833,13 +4864,14 @@
   XmmRegister value_double = FpuTMP;
   ASSERT(result == EAX);
   ASSERT(result != value_obj);
-  __ movsd(value_double, FieldAddress(value_obj, Double::value_offset()));
+  __ movsd(value_double,
+           compiler::FieldAddress(value_obj, Double::value_offset()));
   __ cvttsd2si(result, value_double);
   // Overflow is signalled with minint.
-  Label do_call, done;
+  compiler::Label do_call, done;
   // Check for overflow and that it fits into Smi.
-  __ cmpl(result, Immediate(0xC0000000));
-  __ j(NEGATIVE, &do_call, Assembler::kNearJump);
+  __ cmpl(result, compiler::Immediate(0xC0000000));
+  __ j(NEGATIVE, &do_call, compiler::Assembler::kNearJump);
   __ SmiTag(result);
   __ jmp(&done);
   __ Bind(&do_call);
@@ -4870,12 +4902,13 @@
 }
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
   __ cvttsd2si(result, value);
   // Check for overflow and that it fits into Smi.
-  __ cmpl(result, Immediate(0xC0000000));
+  __ cmpl(result, compiler::Immediate(0xC0000000));
   __ j(NEGATIVE, deopt);
   __ SmiTag(result);
 }
@@ -4896,13 +4929,13 @@
   XmmRegister result = locs()->out(0).fpu_reg();
   switch (recognized_kind()) {
     case MethodRecognizer::kDoubleTruncate:
-      __ roundsd(result, value, Assembler::kRoundToZero);
+      __ roundsd(result, value, compiler::Assembler::kRoundToZero);
       break;
     case MethodRecognizer::kDoubleFloor:
-      __ roundsd(result, value, Assembler::kRoundDown);
+      __ roundsd(result, value, compiler::Assembler::kRoundDown);
       break;
     case MethodRecognizer::kDoubleCeil:
-      __ roundsd(result, value, Assembler::kRoundUp);
+      __ roundsd(result, value, compiler::Assembler::kRoundUp);
       break;
     default:
       UNREACHABLE();
@@ -4996,9 +5029,9 @@
 
   __ xorps(zero_temp, zero_temp);  // 0.0.
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1.0)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
 
-  Label check_base, skip_call;
+  compiler::Label check_base, skip_call;
   // exponent == 0.0 -> return 1.0;
   __ comisd(exp, zero_temp);
   __ j(PARITY_EVEN, &check_base);
@@ -5006,19 +5039,19 @@
 
   // exponent == 1.0 ?
   __ comisd(exp, result);
-  Label return_base;
-  __ j(EQUAL, &return_base, Assembler::kNearJump);
+  compiler::Label return_base;
+  __ j(EQUAL, &return_base, compiler::Assembler::kNearJump);
 
   // exponent == 2.0 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(2.0)));
-  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, XMM0);
-  Label return_base_times_2;
-  __ j(EQUAL, &return_base_times_2, Assembler::kNearJump);
+  compiler::Label return_base_times_2;
+  __ j(EQUAL, &return_base_times_2, compiler::Assembler::kNearJump);
 
   // exponent == 3.0 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(3.0)));
-  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, XMM0);
   __ j(NOT_EQUAL, &check_base);
 
@@ -5042,41 +5075,41 @@
 
   // base == 1.0 -> return 1.0;
   __ comisd(base, result);
-  Label return_nan;
-  __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
-  __ j(EQUAL, &skip_call, Assembler::kNearJump);
+  compiler::Label return_nan;
+  __ j(PARITY_EVEN, &return_nan, compiler::Assembler::kNearJump);
+  __ j(EQUAL, &skip_call, compiler::Assembler::kNearJump);
   // Note: 'base' could be NaN.
   __ comisd(exp, base);
   // Neither 'exp' nor 'base' is NaN.
-  Label try_sqrt;
-  __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+  compiler::Label try_sqrt;
+  __ j(PARITY_ODD, &try_sqrt, compiler::Assembler::kNearJump);
   // Return NaN.
   __ Bind(&return_nan);
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   __ jmp(&skip_call);
 
-  Label do_pow, return_zero;
+  compiler::Label do_pow, return_zero;
   __ Bind(&try_sqrt);
   // Before calling pow, check if we could use sqrt instead of pow.
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(kNegInfinity)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   // base == -Infinity -> call pow;
   __ comisd(base, result);
-  __ j(EQUAL, &do_pow, Assembler::kNearJump);
+  __ j(EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
   // exponent == 0.5 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, result);
-  __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
   // base == 0 -> return 0;
   __ comisd(base, zero_temp);
-  __ j(EQUAL, &return_zero, Assembler::kNearJump);
+  __ j(EQUAL, &return_zero, compiler::Assembler::kNearJump);
 
   __ sqrtsd(result, base);
-  __ jmp(&skip_call, Assembler::kNearJump);
+  __ jmp(&skip_call, compiler::Assembler::kNearJump);
 
   __ Bind(&return_zero);
   __ movsd(result, zero_temp);
@@ -5087,11 +5120,11 @@
   __ movl(locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg(), ESP);
   __ ReserveAlignedFrameSpace(kDoubleSize * kInputCount);
   for (intptr_t i = 0; i < kInputCount; i++) {
-    __ movsd(Address(ESP, kDoubleSize * i), locs->in(i).fpu_reg());
+    __ movsd(compiler::Address(ESP, kDoubleSize * i), locs->in(i).fpu_reg());
   }
   __ CallRuntime(instr->TargetFunction(), kInputCount);
-  __ fstpl(Address(ESP, 0));
-  __ movsd(locs->out(0).fpu_reg(), Address(ESP, 0));
+  __ fstpl(compiler::Address(ESP, 0));
+  __ movsd(locs->out(0).fpu_reg(), compiler::Address(ESP, 0));
   // Restore ESP.
   __ movl(ESP, locs->temp(InvokeMathCFunctionInstr::kSavedSpTempIndex).reg());
   __ Bind(&skip_call);
@@ -5106,12 +5139,12 @@
   __ movl(locs()->temp(kSavedSpTempIndex).reg(), ESP);
   __ ReserveAlignedFrameSpace(kDoubleSize * InputCount());
   for (intptr_t i = 0; i < InputCount(); i++) {
-    __ movsd(Address(ESP, kDoubleSize * i), locs()->in(i).fpu_reg());
+    __ movsd(compiler::Address(ESP, kDoubleSize * i), locs()->in(i).fpu_reg());
   }
 
   __ CallRuntime(TargetFunction(), InputCount());
-  __ fstpl(Address(ESP, 0));
-  __ movsd(locs()->out(0).fpu_reg(), Address(ESP, 0));
+  __ fstpl(compiler::Address(ESP, 0));
+  __ movsd(locs()->out(0).fpu_reg(), compiler::Address(ESP, 0));
   // Restore ESP.
   __ movl(ESP, locs()->temp(kSavedSpTempIndex).reg());
 }
@@ -5181,7 +5214,8 @@
 
 void TruncDivModInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(CanDeoptimize());
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   ASSERT(locs()->out(0).IsPairLocation());
@@ -5206,7 +5240,7 @@
   // TODO(srdjan): We could store instead untagged intermediate results in a
   // typed array, but then the load indexed instructions would need to be
   // able to deoptimize.
-  __ cmpl(EAX, Immediate(0x40000000));
+  __ cmpl(EAX, compiler::Immediate(0x40000000));
   __ j(EQUAL, deopt);
   // Modulo result (EDX) correction:
   //  res = left % right;
@@ -5217,16 +5251,16 @@
   //      res = res + right;
   //    }
   //  }
-  Label done;
-  __ cmpl(EDX, Immediate(0));
-  __ j(GREATER_EQUAL, &done, Assembler::kNearJump);
+  compiler::Label done;
+  __ cmpl(EDX, compiler::Immediate(0));
+  __ j(GREATER_EQUAL, &done, compiler::Assembler::kNearJump);
   // Result is negative, adjust it.
   if (RangeUtils::Overlaps(divisor_range(), -1, 1)) {
-    Label subtract;
-    __ cmpl(right, Immediate(0));
-    __ j(LESS, &subtract, Assembler::kNearJump);
+    compiler::Label subtract;
+    __ cmpl(right, compiler::Immediate(0));
+    __ j(LESS, &subtract, compiler::Assembler::kNearJump);
     __ addl(EDX, right);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&done, compiler::Assembler::kNearJump);
     __ Bind(&subtract);
     __ subl(EDX, right);
   } else if (divisor_range()->IsPositive()) {
@@ -5276,9 +5310,10 @@
   return summary;
 }
 
-void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler, Label* deopt) {
-  const Immediate& raw_null =
-      Immediate(reinterpret_cast<intptr_t>(Object::null()));
+void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler,
+                                    compiler::Label* deopt) {
+  const compiler::Immediate& raw_null =
+      compiler::Immediate(reinterpret_cast<intptr_t>(Object::null()));
   __ cmpl(locs()->in(0).reg(), raw_null);
   ASSERT(IsDeoptIfNull() || IsDeoptIfNotNull());
   Condition cond = IsDeoptIfNull() ? EQUAL : NOT_EQUAL;
@@ -5289,14 +5324,14 @@
                                   intptr_t min,
                                   intptr_t max,
                                   intptr_t mask,
-                                  Label* deopt) {
+                                  compiler::Label* deopt) {
   Register biased_cid = locs()->temp(0).reg();
-  __ subl(biased_cid, Immediate(min));
-  __ cmpl(biased_cid, Immediate(max - min));
+  __ subl(biased_cid, compiler::Immediate(min));
+  __ cmpl(biased_cid, compiler::Immediate(max - min));
   __ j(ABOVE, deopt);
 
   Register mask_reg = locs()->temp(1).reg();
-  __ movl(mask_reg, Immediate(mask));
+  __ movl(mask_reg, compiler::Immediate(mask));
   __ bt(mask_reg, biased_cid);
   __ j(NOT_CARRY, deopt);
 }
@@ -5306,21 +5341,21 @@
                                   intptr_t cid_start,
                                   intptr_t cid_end,
                                   bool is_last,
-                                  Label* is_ok,
-                                  Label* deopt,
+                                  compiler::Label* is_ok,
+                                  compiler::Label* deopt,
                                   bool use_near_jump) {
   Register biased_cid = locs()->temp(0).reg();
   Condition no_match, match;
   if (cid_start == cid_end) {
-    __ cmpl(biased_cid, Immediate(cid_start - bias));
+    __ cmpl(biased_cid, compiler::Immediate(cid_start - bias));
     no_match = NOT_EQUAL;
     match = EQUAL;
   } else {
     // For class ID ranges use a subtract followed by an unsigned
     // comparison to check both ends of the ranges with one comparison.
-    __ addl(biased_cid, Immediate(bias - cid_start));
+    __ addl(biased_cid, compiler::Immediate(bias - cid_start));
     bias = cid_start;
-    __ cmpl(biased_cid, Immediate(cid_end - cid_start));
+    __ cmpl(biased_cid, compiler::Immediate(cid_end - cid_start));
     no_match = ABOVE;
     match = BELOW_EQUAL;
   }
@@ -5329,7 +5364,7 @@
     __ j(no_match, deopt);
   } else {
     if (use_near_jump) {
-      __ j(match, is_ok, Assembler::kNearJump);
+      __ j(match, is_ok, compiler::Assembler::kNearJump);
     } else {
       __ j(match, is_ok);
     }
@@ -5349,8 +5384,8 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  compiler::Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptCheckSmi, licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
 
@@ -5385,13 +5420,15 @@
 
 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
   if (cids_.IsSingleCid()) {
-    __ cmpl(value, Immediate(Smi::RawValue(cids_.cid_start)));
+    __ cmpl(value, compiler::Immediate(Smi::RawValue(cids_.cid_start)));
     __ j(NOT_ZERO, deopt);
   } else {
-    __ AddImmediate(value, Immediate(-Smi::RawValue(cids_.cid_start)));
-    __ cmpl(value, Immediate(Smi::RawValue(cids_.Extent())));
+    __ AddImmediate(value,
+                    compiler::Immediate(-Smi::RawValue(cids_.cid_start)));
+    __ cmpl(value, compiler::Immediate(Smi::RawValue(cids_.Extent())));
     __ j(ABOVE, deopt);
   }
 }
@@ -5416,7 +5453,7 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
@@ -5443,22 +5480,25 @@
       __ testl(index, index);
       __ j(NEGATIVE, deopt);
     } else {
-      __ cmpl(index, Immediate(reinterpret_cast<int32_t>(length.raw())));
+      __ cmpl(index,
+              compiler::Immediate(reinterpret_cast<int32_t>(length.raw())));
       __ j(ABOVE_EQUAL, deopt);
     }
   } else if (index_loc.IsConstant()) {
     const Smi& index = Smi::Cast(index_loc.constant());
     if (length_loc.IsStackSlot()) {
-      const Address& length = LocationToStackSlotAddress(length_loc);
-      __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
+      const compiler::Address& length = LocationToStackSlotAddress(length_loc);
+      __ cmpl(length,
+              compiler::Immediate(reinterpret_cast<int32_t>(index.raw())));
     } else {
       Register length = length_loc.reg();
-      __ cmpl(length, Immediate(reinterpret_cast<int32_t>(index.raw())));
+      __ cmpl(length,
+              compiler::Immediate(reinterpret_cast<int32_t>(index.raw())));
     }
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsStackSlot()) {
     Register index = index_loc.reg();
-    const Address& length = LocationToStackSlotAddress(length_loc);
+    const compiler::Address& length = LocationToStackSlotAddress(length_loc);
     if (index_cid != kSmiCid) {
       __ BranchIfNotSmi(index, deopt);
     }
@@ -5584,14 +5624,14 @@
   switch (op_kind) {
     case Token::kSHR: {
       if (shift > 31) {
-        __ movl(left_lo, left_hi);        // Shift by 32.
-        __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
+        __ movl(left_lo, left_hi);                  // Shift by 32.
+        __ sarl(left_hi, compiler::Immediate(31));  // Sign extend left hi.
         if (shift > 32) {
-          __ sarl(left_lo, Immediate(shift > 63 ? 31 : shift - 32));
+          __ sarl(left_lo, compiler::Immediate(shift > 63 ? 31 : shift - 32));
         }
       } else {
-        __ shrdl(left_lo, left_hi, Immediate(shift));
-        __ sarl(left_hi, Immediate(shift));
+        __ shrdl(left_lo, left_hi, compiler::Immediate(shift));
+        __ sarl(left_hi, compiler::Immediate(shift));
       }
       break;
     }
@@ -5601,11 +5641,11 @@
         __ movl(left_hi, left_lo);  // Shift by 32.
         __ xorl(left_lo, left_lo);  // Zero left_lo.
         if (shift > 32) {
-          __ shll(left_hi, Immediate(shift - 32));
+          __ shll(left_hi, compiler::Immediate(shift - 32));
         }
       } else {
-        __ shldl(left_hi, left_lo, Immediate(shift));
-        __ shll(left_lo, Immediate(shift));
+        __ shldl(left_hi, left_lo, compiler::Immediate(shift));
+        __ shll(left_lo, compiler::Immediate(shift));
       }
       break;
     }
@@ -5620,30 +5660,30 @@
                                 Register left_hi) {
   // sarl operation masks the count to 5 bits and
   // shrdl is undefined with count > operand size (32)
-  Label done, large_shift;
+  compiler::Label done, large_shift;
   switch (op_kind) {
     case Token::kSHR: {
-      __ cmpl(ECX, Immediate(31));
+      __ cmpl(ECX, compiler::Immediate(31));
       __ j(ABOVE, &large_shift);
 
       __ shrdl(left_lo, left_hi, ECX);  // Shift count in CL.
       __ sarl(left_hi, ECX);            // Shift count in CL.
-      __ jmp(&done, Assembler::kNearJump);
+      __ jmp(&done, compiler::Assembler::kNearJump);
 
       __ Bind(&large_shift);
       // No need to subtract 32 from CL, only 5 bits used by sarl.
-      __ movl(left_lo, left_hi);        // Shift by 32.
-      __ sarl(left_hi, Immediate(31));  // Sign extend left hi.
-      __ sarl(left_lo, ECX);            // Shift count: CL % 32.
+      __ movl(left_lo, left_hi);                  // Shift by 32.
+      __ sarl(left_hi, compiler::Immediate(31));  // Sign extend left hi.
+      __ sarl(left_lo, ECX);                      // Shift count: CL % 32.
       break;
     }
     case Token::kSHL: {
-      __ cmpl(ECX, Immediate(31));
+      __ cmpl(ECX, compiler::Immediate(31));
       __ j(ABOVE, &large_shift);
 
       __ shldl(left_hi, left_lo, ECX);  // Shift count in CL.
       __ shll(left_lo, ECX);            // Shift count in CL.
-      __ jmp(&done, Assembler::kNearJump);
+      __ jmp(&done, compiler::Assembler::kNearJump);
 
       __ Bind(&large_shift);
       // No need to subtract 32 from CL, only 5 bits used by shll.
@@ -5668,11 +5708,11 @@
   } else {
     switch (op_kind) {
       case Token::kSHR: {
-        __ shrl(left, Immediate(shift));
+        __ shrl(left, compiler::Immediate(shift));
         break;
       }
       case Token::kSHL: {
-        __ shll(left, Immediate(shift));
+        __ shll(left, compiler::Immediate(shift));
         break;
       }
       default:
@@ -5725,13 +5765,13 @@
     ASSERT(out_hi == left_hi);
 #endif  // defined(DEBUG)
 
-    Label throw_error;
+    compiler::Label throw_error;
     __ testl(right_hi, right_hi);
     __ j(NEGATIVE, &throw_error);
 
     switch (instruction()->AsShiftInt64Op()->op_kind()) {
       case Token::kSHR:
-        __ sarl(out_hi, Immediate(31));
+        __ sarl(out_hi, compiler::Immediate(31));
         __ movl(out_lo, out_hi);
         break;
       case Token::kSHL: {
@@ -5751,10 +5791,11 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
-    __ movl(
-        Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
-        right_hi);
+    __ movl(compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()),
+            right_lo);
+    __ movl(compiler::Address(
+                THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+            right_hi);
   }
 };
 
@@ -5805,7 +5846,7 @@
       compiler->AddSlowPathCode(slow_path);
       __ testl(right_hi, right_hi);
       __ j(NOT_ZERO, slow_path->entry_label());
-      __ cmpl(ECX, Immediate(kShiftCountLimit));
+      __ cmpl(ECX, compiler::Immediate(kShiftCountLimit));
       __ j(ABOVE, slow_path->entry_label());
     }
 
@@ -5852,9 +5893,9 @@
     // Deoptimize if shift count is > 63 or negative (or not a smi).
     if (!IsShiftCountInRange()) {
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
-      __ cmpl(ECX, Immediate(kShiftCountLimit));
+      __ cmpl(ECX, compiler::Immediate(kShiftCountLimit));
       __ j(ABOVE, deopt);
     }
 
@@ -5881,7 +5922,7 @@
     const Register out = instruction()->locs()->out(0).reg();
     ASSERT(out == instruction()->locs()->in(0).reg());
 
-    Label throw_error;
+    compiler::Label throw_error;
     __ testl(right_hi, right_hi);
     __ j(NEGATIVE, &throw_error);
 
@@ -5895,10 +5936,11 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ movl(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), right_lo);
-    __ movl(
-        Address(THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
-        right_hi);
+    __ movl(compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()),
+            right_lo);
+    __ movl(compiler::Address(
+                THR, Thread::unboxed_int64_runtime_arg_offset() + kWordSize),
+            right_hi);
   }
 };
 
@@ -5943,7 +5985,7 @@
 
       __ testl(right_hi, right_hi);
       __ j(NOT_ZERO, slow_path->entry_label());
-      __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+      __ cmpl(ECX, compiler::Immediate(kUint32ShiftCountLimit));
       __ j(ABOVE, slow_path->entry_label());
     }
 
@@ -5985,15 +6027,15 @@
       if (!IsShiftCountInRange()) {
         // Deoptimize if shift count is negative.
         ASSERT(CanDeoptimize());
-        Label* deopt =
+        compiler::Label* deopt =
             compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
         __ testl(ECX, ECX);
         __ j(LESS, deopt);
       }
 
-      Label cont;
-      __ cmpl(ECX, Immediate(kUint32ShiftCountLimit));
+      compiler::Label cont;
+      __ cmpl(ECX, compiler::Immediate(kUint32ShiftCountLimit));
       __ j(LESS_EQUAL, &cont);
 
       __ xorl(left, left);
@@ -6033,7 +6075,7 @@
       break;
     case Token::kNEGATE:
       __ negl(left_lo);
-      __ adcl(left_hi, Immediate(0));
+      __ adcl(left_hi, compiler::Immediate(0));
       __ negl(left_hi);
       break;
     default:
@@ -6041,22 +6083,6 @@
   }
 }
 
-CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
-CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::Int();
-}
-
 LocationSummary* UnaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                          bool opt) const {
   const intptr_t kNumInputs = 1;
@@ -6129,7 +6155,7 @@
     // Representations are bitwise equivalent.
     ASSERT(locs()->out(0).reg() == locs()->in(0).reg());
     if (CanDeoptimize()) {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
       __ testl(locs()->out(0).reg(), locs()->out(0).reg());
       __ j(NEGATIVE, deopt);
@@ -6147,9 +6173,9 @@
     // Copy low word.
     __ movl(out, in_lo);
     if (CanDeoptimize()) {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
-      __ sarl(in_lo, Immediate(31));
+      __ sarl(in_lo, compiler::Immediate(31));
       __ cmpl(in_lo, in_hi);
       __ j(NOT_EQUAL, deopt);
     }
@@ -6293,13 +6319,15 @@
   Register target_reg = locs()->temp_slot(0)->reg();
 
   // Load code object from frame.
-  __ movl(target_reg, Address(EBP, compiler::target::frame_layout.code_from_fp *
-                                       kWordSize));
+  __ movl(target_reg,
+          compiler::Address(
+              EBP, compiler::target::frame_layout.code_from_fp * kWordSize));
   // Load instructions object (active_instructions and Code::entry_point() may
   // not point to this instruction object any more; see Code::DisableDartCode).
-  __ movl(target_reg,
-          FieldAddress(target_reg, Code::saved_instructions_offset()));
-  __ addl(target_reg, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
+  __ movl(target_reg, compiler::FieldAddress(
+                          target_reg, Code::saved_instructions_offset()));
+  __ addl(target_reg,
+          compiler::Immediate(Instructions::HeaderSize() - kHeapObjectTag));
 
   // Add the offset.
   Register offset_reg = locs()->in(0).reg();
@@ -6416,13 +6444,13 @@
   if (is_power_of_two_kind) {
     const intptr_t shift =
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
-    __ shll(EDX, Immediate(shift + kSmiTagSize));
+    __ shll(EDX, compiler::Immediate(shift + kSmiTagSize));
   } else {
     __ decl(EDX);
-    __ andl(EDX,
-            Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)));
+    __ andl(EDX, compiler::Immediate(Smi::RawValue(true_value) -
+                                     Smi::RawValue(false_value)));
     if (false_value != 0) {
-      __ addl(EDX, Immediate(Smi::RawValue(false_value)));
+      __ addl(EDX, compiler::Immediate(Smi::RawValue(false_value)));
     }
   }
 }
@@ -6447,7 +6475,7 @@
 
   // EBX: Code (compiled code or lazy compile stub).
   ASSERT(locs()->in(0).reg() == EAX);
-  __ movl(EBX, FieldAddress(EAX, Function::entry_point_offset()));
+  __ movl(EBX, compiler::FieldAddress(EAX, Function::entry_point_offset()));
 
   // EAX: Function.
   // EDX: Arguments descriptor array.
@@ -6469,10 +6497,10 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
-  Label done;
+  compiler::Label done;
   __ LoadObject(result, Bool::True());
   __ CompareRegisters(result, value);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, compiler::Assembler::kNearJump);
   __ LoadObject(result, Bool::False());
   __ Bind(&done);
 }
diff --git a/runtime/vm/compiler/backend/il_printer.cc b/runtime/vm/compiler/backend/il_printer.cc
index a2f841d..0dd6d6b 100644
--- a/runtime/vm/compiler/backend/il_printer.cc
+++ b/runtime/vm/compiler/backend/il_printer.cc
@@ -149,35 +149,6 @@
       String::Handle(dst_type.Name()).ToCString(), dst_name.ToCString());
 }
 
-static const char* TypeToUserVisibleName(const AbstractType& type) {
-  return String::Handle(type.UserVisibleName()).ToCString();
-}
-
-void CompileType::PrintTo(BufferFormatter* f) const {
-  const char* type_name = "?";
-  if (IsNone()) {
-    f->Print("T{}");
-    return;
-  } else if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) {
-    const Class& cls =
-        Class::Handle(Isolate::Current()->class_table()->At(cid_));
-    type_name = String::Handle(cls.ScrubbedName()).ToCString();
-  } else if (type_ != NULL) {
-    type_name = type_->IsDynamicType() ? "*" : TypeToUserVisibleName(*type_);
-  } else if (!is_nullable()) {
-    type_name = "!null";
-  }
-
-  f->Print("T{%s%s}", type_name, is_nullable_ ? "?" : "");
-}
-
-const char* CompileType::ToCString() const {
-  char buffer[1024];
-  BufferFormatter f(buffer, sizeof(buffer));
-  PrintTo(&f);
-  return Thread::Current()->zone()->MakeCopyOfString(buffer);
-}
-
 static void PrintTargetsHelper(BufferFormatter* f,
                                const CallTargets& targets,
                                intptr_t num_checks_to_print) {
@@ -483,6 +454,10 @@
   }
 }
 
+static const char* TypeToUserVisibleName(const AbstractType& type) {
+  return String::Handle(type.UserVisibleName()).ToCString();
+}
+
 void AssertAssignableInstr::PrintOperandsTo(BufferFormatter* f) const {
   value()->PrintTo(f);
   f->Print(", %s, '%s',", TypeToUserVisibleName(dst_type()),
@@ -544,6 +519,9 @@
       PrintICDataHelper(f, *ic_data(), FlowGraphPrinter::kPrintAll);
     }
   }
+  if (result_type() != nullptr) {
+    f->Print(", result_type = %s", result_type()->ToCString());
+  }
 }
 
 void PolymorphicInstanceCallInstr::PrintOperandsTo(BufferFormatter* f) const {
@@ -610,6 +588,9 @@
     f->Print(", recognized_kind = %s",
              MethodRecognizer::KindToCString(function().recognized_kind()));
   }
+  if (result_type() != nullptr) {
+    f->Print(", result_type = %s", result_type()->ToCString());
+  }
 }
 
 void LoadLocalInstr::PrintOperandsTo(BufferFormatter* f) const {
diff --git a/runtime/vm/compiler/backend/il_serializer.cc b/runtime/vm/compiler/backend/il_serializer.cc
new file mode 100644
index 0000000..36b4542
--- /dev/null
+++ b/runtime/vm/compiler/backend/il_serializer.cc
@@ -0,0 +1,1053 @@
+// 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.
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/backend/il_serializer.h"
+
+#include "vm/compiler/backend/flow_graph.h"
+#include "vm/compiler/backend/il.h"
+#include "vm/compiler/method_recognizer.h"
+#include "vm/os.h"
+
+namespace dart {
+
+DEFINE_FLAG(bool,
+            serialize_flow_graph_types,
+            true,
+            "Serialize inferred type information in flow graphs"
+            " (with --serialize_flow_graphs_to)");
+
+DEFINE_FLAG(bool,
+            verbose_flow_graph_serialization,
+            false,
+            "Serialize extra information useful for debugging"
+            " (with --serialize_flow_graphs_to)");
+
+DEFINE_FLAG(bool,
+            pretty_print_serialization,
+            false,
+            "Format serialized output nicely"
+            " (with --serialize_flow_graphs_to)");
+
+const char* const FlowGraphSerializer::initial_indent = "";
+
+void FlowGraphSerializer::SerializeToBuffer(const FlowGraph* flow_graph,
+                                            TextBuffer* buffer) {
+  SerializeToBuffer(flow_graph->zone(), flow_graph, buffer);
+}
+
+void FlowGraphSerializer::SerializeToBuffer(Zone* zone,
+                                            const FlowGraph* flow_graph,
+                                            TextBuffer* buffer) {
+  ASSERT(buffer != nullptr);
+  FlowGraphSerializer serializer(zone, flow_graph);
+  auto const sexp = serializer.FlowGraphToSExp();
+  if (FLAG_pretty_print_serialization) {
+    sexp->SerializeTo(serializer.zone(), buffer, initial_indent);
+  } else {
+    sexp->SerializeToLine(buffer);
+  }
+  buffer->AddString("\n\n");
+}
+
+void FlowGraphSerializer::AddBool(SExpList* sexp, bool b) {
+  sexp->Add(new (zone()) SExpBool(b));
+}
+
+void FlowGraphSerializer::AddInteger(SExpList* sexp, intptr_t i) {
+  sexp->Add(new (zone()) SExpInteger(i));
+}
+
+void FlowGraphSerializer::AddString(SExpList* sexp, const char* cstr) {
+  sexp->Add(new (zone()) SExpString(cstr));
+}
+
+void FlowGraphSerializer::AddSymbol(SExpList* sexp, const char* cstr) {
+  sexp->Add(new (zone()) SExpSymbol(cstr));
+}
+
+void FlowGraphSerializer::AddExtraBool(SExpList* sexp,
+                                       const char* label,
+                                       bool b) {
+  sexp->AddExtra(label, new (zone()) SExpBool(b));
+}
+
+void FlowGraphSerializer::AddExtraInteger(SExpList* sexp,
+                                          const char* label,
+                                          intptr_t i) {
+  sexp->AddExtra(label, new (zone()) SExpInteger(i));
+}
+
+void FlowGraphSerializer::AddExtraString(SExpList* sexp,
+                                         const char* label,
+                                         const char* cstr) {
+  sexp->AddExtra(label, new (zone()) SExpString(cstr));
+}
+
+void FlowGraphSerializer::AddExtraSymbol(SExpList* sexp,
+                                         const char* label,
+                                         const char* cstr) {
+  sexp->AddExtra(label, new (zone()) SExpSymbol(cstr));
+}
+
+SExpression* FlowGraphSerializer::BlockIdToSExp(intptr_t block_id) {
+  return new (zone()) SExpSymbol(OS::SCreate(zone(), "B%" Pd "", block_id));
+}
+
+void FlowGraphSerializer::SerializeCanonicalName(TextBuffer* b,
+                                                 const Object& obj) {
+  ASSERT(!obj.IsNull());
+  if (obj.IsFunction()) {
+    const auto& function = Function::Cast(obj);
+    tmp_string_ = function.UserVisibleName();
+    const char* function_name = tmp_string_.ToCString();
+    // If this function is an inner closure then the parent points to its
+    // containing function, which will also be part of the canonical name.
+    //
+    // We retrieve the owner before retrieving the parent function, as the
+    // inner closure chain may be arbitrarily deep and serialize_parent_ is
+    // passed in on recursive calls. When it is, then changing serialize_parent_
+    // to the parent function also changes the contents of obj and thus we'd
+    // no longer be able to retrieve the child function or its owner.
+    //
+    // This does mean that serialize_owner_ gets overwritten for each recursive
+    // call until we reach the end of the chain, but we only use its contents at
+    // the end of the chain anyway.
+    serialize_owner_ = function.Owner();
+    serialize_parent_ = function.parent_function();
+    if (!serialize_parent_.IsNull()) {
+      SerializeCanonicalName(b, serialize_parent_);
+    } else {
+      ASSERT(!serialize_owner_.IsNull());
+      SerializeCanonicalName(b, serialize_owner_);
+    }
+    b->Printf(":%s", function_name);
+  } else if (obj.IsClass()) {
+    const auto& cls = Class::Cast(obj);
+    tmp_string_ = cls.ScrubbedName();
+    const char* class_name = tmp_string_.ToCString();
+    serialize_library_ = cls.library();
+    if (!serialize_library_.IsNull()) {
+      SerializeCanonicalName(b, serialize_library_);
+    }
+    b->Printf(":%s", class_name);
+  } else if (obj.IsLibrary()) {
+    const Library& lib = Library::Cast(obj);
+    tmp_string_ = lib.url();
+    const char* lib_name = tmp_string_.ToCString();
+    if (lib_name[0] == '\0') return;
+    b->AddString(lib_name);
+  } else if (obj.IsField()) {
+    const auto& field = Field::Cast(obj);
+    tmp_string_ = field.UserVisibleName();
+    const char* field_name = tmp_string_.ToCString();
+    serialize_owner_ = field.Owner();
+    ASSERT(!serialize_owner_.IsNull());
+    SerializeCanonicalName(b, serialize_owner_);
+    b->Printf(".%s", field_name);
+  } else {
+    UNREACHABLE();
+  }
+}
+
+SExpression* FlowGraphSerializer::CanonicalNameToSExp(const Object& obj) {
+  ASSERT(!obj.IsNull());
+  TextBuffer b(100);
+  SerializeCanonicalName(&b, obj);
+  return new (zone()) SExpSymbol(OS::SCreate(zone(), "%s", b.buf()));
+}
+
+SExpSymbol* FlowGraphSerializer::BlockEntryTag(const BlockEntryInstr* entry) {
+  if (entry == nullptr) return nullptr;
+  BlockEntryInstr* const to_test = const_cast<BlockEntryInstr*>(entry);
+  if (to_test->IsGraphEntry()) {
+    return new (zone()) SExpSymbol("Graph");
+  }
+  if (to_test->IsOsrEntry()) {
+    return new (zone()) SExpSymbol("OSR");
+  }
+  if (to_test->IsCatchBlockEntry()) {
+    return new (zone()) SExpSymbol("Catch");
+  }
+  if (to_test->IsIndirectEntry()) {
+    return new (zone()) SExpSymbol("Indirect");
+  }
+  if (to_test->IsFunctionEntry()) {
+    if (entry == flow_graph()->graph_entry()->normal_entry()) {
+      return new (zone()) SExpSymbol("Normal");
+    }
+    if (entry == flow_graph()->graph_entry()->unchecked_entry()) {
+      return new (zone()) SExpSymbol("Unchecked");
+    }
+  }
+  if (to_test->IsJoinEntry()) {
+    return new (zone()) SExpSymbol("Join");
+  }
+  return nullptr;
+}
+
+SExpression* FlowGraphSerializer::FunctionEntryToSExp(BlockEntryInstr* entry) {
+  if (entry == nullptr) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  sexp->Add(BlockEntryTag(entry));
+  sexp->Add(BlockIdToSExp(entry->block_id()));
+  if (auto with_defs = entry->AsBlockEntryWithInitialDefs()) {
+    auto initial_defs = with_defs->initial_definitions();
+    for (intptr_t i = 0; i < initial_defs->length(); i++) {
+      sexp->Add(initial_defs->At(i)->ToSExpression(this));
+    }
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::EntriesToSExp(GraphEntryInstr* start) {
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Entries");
+  if (auto const normal = FunctionEntryToSExp(start->normal_entry())) {
+    sexp->Add(normal);
+  }
+  if (auto const unchecked = FunctionEntryToSExp(start->unchecked_entry())) {
+    sexp->Add(unchecked);
+  }
+  if (auto const osr = FunctionEntryToSExp(start->osr_entry())) {
+    sexp->Add(osr);
+  }
+  for (intptr_t i = 0; i < start->catch_entries().length(); i++) {
+    sexp->Add(FunctionEntryToSExp(start->catch_entries().At(i)));
+  }
+  for (intptr_t i = 0; i < start->indirect_entries().length(); i++) {
+    sexp->Add(FunctionEntryToSExp(start->indirect_entries().At(i)));
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::FlowGraphToSExp() {
+  auto const start = flow_graph()->graph_entry();
+  auto const sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "FlowGraph");
+  sexp->Add(CanonicalNameToSExp(flow_graph()->function()));
+  AddExtraInteger(sexp, "deopt_id", start->deopt_id());
+  if (start->IsCompiledForOsr()) {
+    AddExtraInteger(sexp, "osr_id", start->osr_id());
+  }
+  if (auto const constants = ConstantPoolToSExp(start)) {
+    sexp->Add(constants);
+  }
+  sexp->Add(EntriesToSExp(start));
+  auto& block_order = flow_graph()->reverse_postorder();
+  // Skip the first block, which will be the graph entry block (B0). We
+  // output all its information as part of the function expression, so it'll
+  // just show up as an empty block here.
+  ASSERT(block_order[0]->IsGraphEntry());
+  for (intptr_t i = 1; i < block_order.length(); ++i) {
+    sexp->Add(block_order[i]->ToSExpression(this));
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::UseToSExp(const Definition* definition) {
+  ASSERT(definition != nullptr);
+  ASSERT(definition->HasSSATemp() || definition->HasTemp());
+  if (definition->HasSSATemp()) {
+    const intptr_t temp_index = definition->ssa_temp_index();
+    const auto name_cstr = OS::SCreate(zone(), "v%" Pd "", temp_index);
+    if (definition->HasPairRepresentation()) {
+      auto sexp = new (zone()) SExpList(zone());
+      AddSymbol(sexp, name_cstr);
+      AddSymbol(sexp, OS::SCreate(zone(), "v%" Pd "", temp_index + 1));
+      return sexp;
+    } else {
+      return new (zone()) SExpSymbol(name_cstr);
+    }
+  } else if (definition->HasTemp()) {
+    const intptr_t temp_index = definition->temp_index();
+    return new (zone()) SExpSymbol(OS::SCreate(zone(), "t%" Pd "", temp_index));
+  }
+  UNREACHABLE();
+}
+
+SExpression* FlowGraphSerializer::ClassToSExp(const Class& cls) {
+  if (cls.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Class");
+  AddInteger(sexp, cls.id());
+  if (FLAG_verbose_flow_graph_serialization) {
+    sexp->AddExtra("name", CanonicalNameToSExp(cls));
+    // Currently, AbstractTypeToSExp assumes that serializing a class cannot
+    // re-enter it. If we make that possible by serializing parts of a class
+    // that can contain AbstractTypes, especially types that are not type
+    // parameters or type references, fix AbstractTypeToSExp appropriately.
+  }
+  return sexp;
+}
+
+static bool ShouldSerializeType(CompileType* type) {
+  return (FLAG_verbose_flow_graph_serialization ||
+          FLAG_serialize_flow_graph_types) &&
+         type != NULL &&
+         (type->ToNullableCid() != kDynamicCid || !type->is_nullable());
+}
+
+SExpression* FlowGraphSerializer::FieldToSExp(const Field& field) {
+  if (field.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Field");
+  sexp->Add(CanonicalNameToSExp(field));
+  CompileType t(field.is_nullable(), field.guarded_cid(), nullptr);
+  if (ShouldSerializeType(&t)) {
+    sexp->AddExtra("type", t.ToSExpression(this));
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::AbstractTypeToSExp(const AbstractType& t) {
+  if (t.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  if (t.IsTypeParameter()) {
+    const auto& param = TypeParameter::Cast(t);
+    AddSymbol(sexp, "TypeParameter");
+    tmp_string_ = param.name();
+    AddSymbol(sexp, tmp_string_.ToCString());
+    return sexp;
+  }
+  if (t.IsTypeRef()) {
+    const auto& ref = TypeRef::Cast(t);
+    AddSymbol(sexp, "TypeRef");
+    type_ref_type_ = ref.type();
+    AddExtraInteger(sexp, "hash", type_ref_type_.Hash());
+    if (FLAG_verbose_flow_graph_serialization) {
+      AddExtraString(sexp, "type", type_ref_type_.ToCString());
+    }
+    return sexp;
+  }
+  ASSERT(t.IsType());
+  AddSymbol(sexp, "Type");
+  const auto& typ = Type::Cast(t);
+  if (typ.HasTypeClass()) {
+    type_class_ = typ.type_class();
+    // This avoids re-entry as long as serializing a class doesn't involve
+    // serializing concrete (non-parameter, non-reference) types.
+    sexp->Add(DartValueToSExp(type_class_));
+    if (typ.IsRecursive()) {
+      AddExtraInteger(sexp, "hash", typ.Hash());
+    }
+    // Since type arguments may themselves be instantiations of generic
+    // classes, we may call back into this function in the middle of printing
+    // the TypeArguments and so we must allocate a fresh handle here.
+    const auto& args = TypeArguments::Handle(zone(), typ.arguments());
+    if (auto const args_sexp = NonEmptyTypeArgumentsToSExp(args)) {
+      sexp->AddExtra("type_args", args_sexp);
+    }
+  } else {
+    // TODO(dartbug.com/36882): Actually structure non-class types instead of
+    // just printing out this version.
+    AddString(sexp, typ.ToCString());
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::CodeToSExp(const Code& code) {
+  if (code.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Code");
+  if (code.IsStubCode()) {
+    AddSymbol(sexp, StubCode::NameOfStub(code.EntryPoint()));
+    if (FLAG_verbose_flow_graph_serialization) {
+      AddExtraSymbol(sexp, "kind", "stub");
+    }
+    return sexp;
+  }
+  code_owner_ = code.owner();
+  if (!code_owner_.IsNull() && FLAG_verbose_flow_graph_serialization) {
+    if (code_owner_.IsClass()) {
+      AddExtraSymbol(sexp, "kind", "allocate");
+    } else if (code_owner_.IsAbstractType()) {
+      AddExtraSymbol(sexp, "kind", "type_test");
+    } else {
+      ASSERT(code_owner_.IsFunction());
+      AddExtraSymbol(sexp, "kind", "function");
+    }
+  }
+  sexp->Add(DartValueToSExp(code_owner_));
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::TypeArgumentsToSExp(const TypeArguments& ta) {
+  if (ta.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "TypeArguments");
+  for (intptr_t i = 0; i < ta.Length(); i++) {
+    type_arguments_elem_ = ta.TypeAt(i);
+    sexp->Add(DartValueToSExp(type_arguments_elem_));
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::InstanceToSExp(const Instance& inst) {
+  if (inst.IsNull()) return nullptr;
+
+  // Since InstanceToSExp may use ObjectToSExp (via DartValueToSExp) for field
+  // values that aren't entries in the constant pool, and ObjectToSExp may
+  // re-enter InstanceToSExp, allocate fresh handles here for the argument to
+  // DartValueToSExp and other handles that are live across the call.
+  const auto& instance_class = Class::Handle(zone(), inst.clazz());
+  const auto& instance_fields_array =
+      Array::Handle(zone(), instance_class.fields());
+  auto& instance_field_value = Object::Handle(zone());
+
+  auto const sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Instance");
+  AddInteger(sexp, instance_class.id());
+  auto const fields = new (zone()) SExpList(zone());
+  AddSymbol(fields, "Fields");
+  for (intptr_t i = 0; i < instance_fields_array.Length(); i++) {
+    instance_field_ = Field::RawCast(instance_fields_array.At(i));
+    // We don't need to serialize static fields, since they're shared by
+    // all instances.
+    if (instance_field_.is_static()) continue;
+    // We should only be getting const instances, which means that we
+    // should only see final instance fields.
+    ASSERT(instance_field_.is_final());
+    tmp_string_ = instance_field_.UserVisibleName();
+    auto const label = tmp_string_.ToCString();
+    instance_field_value = inst.GetField(instance_field_);
+    fields->AddExtra(label, DartValueToSExp(instance_field_value));
+  }
+  if (fields->ExtraLength() != 0 || FLAG_verbose_flow_graph_serialization) {
+    sexp->Add(fields);
+  }
+  if (instance_class.IsGeneric()) {
+    instance_type_args_ = inst.GetTypeArguments();
+    if (auto const args = NonEmptyTypeArgumentsToSExp(instance_type_args_)) {
+      sexp->AddExtra("type_args", args);
+    }
+  }
+  if (FLAG_verbose_flow_graph_serialization) {
+    AddExtraInteger(sexp, "size", inst.InstanceSize());
+    // We know the following won't call back into InstanceToSExp because we're
+    // providing it a class.
+    if (auto const cls = DartValueToSExp(instance_class)) {
+      sexp->AddExtra("class", cls);
+    }
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::FunctionToSExp(const Function& func) {
+  if (func.IsNull()) return nullptr;
+  auto const sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Function");
+  sexp->Add(CanonicalNameToSExp(func));
+  if (func.IsRecognized()) {
+    AddExtraSymbol(sexp, "recognized",
+                   MethodRecognizer::KindToCString(func.recognized_kind()));
+  }
+  if (func.is_native()) {
+    tmp_string_ = func.native_name();
+    if (!tmp_string_.IsNull()) {
+      AddExtraSymbol(sexp, "native_name", tmp_string_.ToCString());
+    }
+  }
+  if (FLAG_verbose_flow_graph_serialization) {
+    AddExtraSymbol(sexp, "kind", Function::KindToCString(func.kind()));
+  }
+  function_type_args_ = func.type_parameters();
+  if (auto const ta_sexp = NonEmptyTypeArgumentsToSExp(function_type_args_)) {
+    sexp->AddExtra("type_args", ta_sexp);
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::ArrayToSExp(const Array& arr) {
+  if (arr.IsNull()) return nullptr;
+  // We should only be getting immutable lists when serializing Dart values
+  // in flow graphs.
+  ASSERT(arr.IsImmutable());
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "ImmutableList");
+  // We allocate a new Object handle to use for the calls to DartValueToSExp
+  // in case any Array elements contain non-constant-pool, non-empty Arrays.
+  auto& array_elem = Object::Handle(zone());
+  for (intptr_t i = 0; i < arr.Length(); i++) {
+    array_elem = arr.At(i);
+    sexp->Add(DartValueToSExp(array_elem));
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::ClosureToSExp(const Closure& c) {
+  if (c.IsNull()) return nullptr;
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Closure");
+  closure_function_ = c.function();
+  if (auto const func = FunctionToSExp(closure_function_)) {
+    sexp->Add(func);
+  }
+  closure_type_args_ = c.function_type_arguments();
+  if (auto const type_args = NonEmptyTypeArgumentsToSExp(closure_type_args_)) {
+    sexp->AddExtra("func_type_args", type_args);
+  }
+  closure_type_args_ = c.instantiator_type_arguments();
+  if (auto const type_args = NonEmptyTypeArgumentsToSExp(closure_type_args_)) {
+    sexp->AddExtra("inst_type_args", type_args);
+  }
+  closure_type_args_ = c.delayed_type_arguments();
+  if (auto const type_args = NonEmptyTypeArgumentsToSExp(closure_type_args_)) {
+    sexp->AddExtra("delayed_type_args", type_args);
+  }
+  return sexp;
+}
+
+SExpression* FlowGraphSerializer::ObjectToSExp(const Object& dartval) {
+  if (dartval.IsNull()) {
+    return new (zone()) SExpSymbol("null");
+  }
+  if (dartval.IsString()) {
+    return new (zone()) SExpString(dartval.ToCString());
+  }
+  if (dartval.IsSmi()) {
+    return new (zone()) SExpInteger(Smi::Cast(dartval).Value());
+  }
+  if (dartval.IsMint()) {
+    return new (zone()) SExpInteger(Mint::Cast(dartval).value());
+  }
+  if (dartval.IsBool()) {
+    return new (zone()) SExpBool(Bool::Cast(dartval).value());
+  }
+  if (dartval.IsDouble()) {
+    return new (zone()) SExpDouble(Double::Cast(dartval).value());
+  }
+  if (dartval.IsField()) {
+    return FieldToSExp(Field::Cast(dartval));
+  }
+  if (dartval.IsClass()) {
+    return ClassToSExp(Class::Cast(dartval));
+  }
+  if (dartval.IsTypeArguments()) {
+    return TypeArgumentsToSExp(TypeArguments::Cast(dartval));
+  }
+  if (dartval.IsCode()) {
+    return CodeToSExp(Code::Cast(dartval));
+  }
+  if (dartval.IsArray()) {
+    return ArrayToSExp(Array::Cast(dartval));
+  }
+  if (dartval.IsFunction()) {
+    return FunctionToSExp(Function::Cast(dartval));
+  }
+  if (dartval.IsClosure()) {
+    return ClosureToSExp(Closure::Cast(dartval));
+  }
+  if (dartval.IsAbstractType()) {
+    return AbstractTypeToSExp(AbstractType::Cast(dartval));
+  }
+  ASSERT(dartval.IsInstance());
+  return InstanceToSExp(Instance::Cast(dartval));
+}
+
+SExpression* FlowGraphSerializer::DartValueToSExp(const Object& obj) {
+  if (auto const def = flow_graph()->GetExistingConstant(obj)) {
+    ASSERT(def->IsDefinition());
+    return UseToSExp(def->AsDefinition());
+  }
+  return ObjectToSExp(obj);
+}
+
+SExpression* FlowGraphSerializer::NonEmptyTypeArgumentsToSExp(
+    const TypeArguments& ta) {
+  if (ta.IsNull() || ta.Length() == 0) return nullptr;
+  return DartValueToSExp(ta);
+}
+
+SExpression* FlowGraphSerializer::ConstantPoolToSExp(GraphEntryInstr* start) {
+  auto const initial_defs = start->initial_definitions();
+  if (initial_defs == nullptr || initial_defs->is_empty()) return nullptr;
+  auto constant_list = new (zone()) SExpList(zone());
+  AddSymbol(constant_list, "Constants");
+  for (intptr_t i = 0; i < initial_defs->length(); i++) {
+    ASSERT(initial_defs->At(i)->IsConstant());
+    ConstantInstr* value = initial_defs->At(i)->AsConstant();
+    auto elem = new (zone()) SExpList(zone());
+    AddSymbol(elem, "def");
+    elem->Add(UseToSExp(value->AsDefinition()));
+    // Use ObjectToSExp here, not DartValueToSExp!
+    elem->Add(ObjectToSExp(value->value()));
+    if (ShouldSerializeType(value->AsDefinition()->Type())) {
+      auto const val = value->AsDefinition()->Type()->ToSExpression(this);
+      elem->AddExtra("type", val);
+    }
+    constant_list->Add(elem);
+  }
+  return constant_list;
+}
+
+SExpression* Instruction::ToSExpression(FlowGraphSerializer* s) const {
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  s->AddSymbol(sexp, DebugName());
+  AddOperandsToSExpression(sexp, s);
+  AddExtraInfoToSExpression(sexp, s);
+  return sexp;
+}
+
+SExpression* BlockEntryInstr::ToSExpression(FlowGraphSerializer* s) const {
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  s->AddSymbol(sexp, "Block");
+  sexp->Add(s->BlockIdToSExp(block_id()));
+  AddOperandsToSExpression(sexp, s);
+  AddExtraInfoToSExpression(sexp, s);
+  return sexp;
+}
+
+void BlockEntryInstr::AddExtraInfoToSExpression(SExpList* sexp,
+                                                FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (FLAG_verbose_flow_graph_serialization) {
+    if (auto const entry_tag = s->BlockEntryTag(this)) {
+      sexp->AddExtra("block_type", entry_tag);
+    }
+    if (PredecessorCount() > 0) {
+      auto const preds = new (s->zone()) SExpList(s->zone());
+      for (intptr_t i = 0; i < PredecessorCount(); i++) {
+        preds->Add(s->BlockIdToSExp(PredecessorAt(i)->block_id()));
+      }
+      sexp->AddExtra("predecessors", preds);
+    }
+  }
+}
+
+void BlockEntryInstr::AddOperandsToSExpression(SExpList* sexp,
+                                               FlowGraphSerializer* s) const {
+  // We don't use RemoveCurrentFromGraph(), so this cast is safe.
+  auto block = const_cast<BlockEntryInstr*>(this);
+  for (ForwardInstructionIterator it(block); !it.Done(); it.Advance()) {
+    sexp->Add(it.Current()->ToSExpression(s));
+  }
+}
+
+void JoinEntryInstr::AddOperandsToSExpression(SExpList* sexp,
+                                              FlowGraphSerializer* s) const {
+  if (auto phi_list = phis()) {
+    for (intptr_t i = 0; i < phi_list->length(); i++) {
+      sexp->Add(phi_list->At(i)->ToSExpression(s));
+    }
+  }
+  BlockEntryInstr::AddOperandsToSExpression(sexp, s);
+}
+
+void Instruction::AddOperandsToSExpression(SExpList* sexp,
+                                           FlowGraphSerializer* s) const {
+  for (intptr_t i = 0; i < InputCount(); ++i) {
+    if (InputAt(i) == nullptr) continue;
+    sexp->Add(InputAt(i)->ToSExpression(s));
+  }
+}
+
+void Instruction::AddExtraInfoToSExpression(SExpList* sexp,
+                                            FlowGraphSerializer* s) const {
+  if (GetDeoptId() != DeoptId::kNone) {
+    s->AddExtraInteger(sexp, "deopt_id", GetDeoptId());
+  }
+  if (env() != nullptr) {
+    sexp->AddExtra("env", env()->ToSExpression(s));
+  }
+}
+
+SExpression* Definition::ToSExpression(FlowGraphSerializer* s) const {
+  if (!HasSSATemp() && !HasTemp()) {
+    return Instruction::ToSExpression(s);
+  }
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  s->AddSymbol(sexp, "def");
+  sexp->Add(s->UseToSExp(this));
+  if (ShouldSerializeType(type_)) {
+    sexp->AddExtra("type", type_->ToSExpression(s));
+  }
+  sexp->Add(Instruction::ToSExpression(s));
+  return sexp;
+}
+
+void ConstantInstr::AddOperandsToSExpression(SExpList* sexp,
+                                             FlowGraphSerializer* s) const {
+  sexp->Add(s->DartValueToSExp(value()));
+}
+
+void BranchInstr::AddOperandsToSExpression(SExpList* sexp,
+                                           FlowGraphSerializer* s) const {
+  sexp->Add(comparison()->ToSExpression(s));
+  sexp->Add(s->BlockIdToSExp(true_successor()->block_id()));
+  sexp->Add(s->BlockIdToSExp(false_successor()->block_id()));
+}
+
+void ParameterInstr::AddOperandsToSExpression(SExpList* sexp,
+                                              FlowGraphSerializer* s) const {
+  s->AddInteger(sexp, index());
+}
+
+void SpecialParameterInstr::AddOperandsToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  s->AddSymbol(sexp, KindToCString(kind()));
+}
+
+SExpression* FlowGraphSerializer::LocalVariableToSExp(const LocalVariable& v) {
+  auto const sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "LocalVariable");
+  if (!v.name().IsNull()) {
+    AddSymbol(sexp, v.name().ToCString());
+  }
+  if (v.index().IsValid()) {
+    AddExtraInteger(sexp, "index", v.index().value());
+  }
+  return sexp;
+}
+
+void LoadLocalInstr::AddOperandsToSExpression(SExpList* sexp,
+                                              FlowGraphSerializer* s) const {
+  sexp->Add(s->LocalVariableToSExp(local()));
+}
+
+void StoreLocalInstr::AddOperandsToSExpression(SExpList* sexp,
+                                               FlowGraphSerializer* s) const {
+  sexp->Add(s->LocalVariableToSExp(local()));
+}
+
+static const char* SlotKindToCString(Slot::Kind kind) {
+  switch (kind) {
+    case Slot::Kind::kDartField:
+      return "DartField";
+    case Slot::Kind::kCapturedVariable:
+      return "CapturedVariable";
+    case Slot::Kind::kTypeArguments:
+      return "TypeArguments";
+    default:
+      return "NativeSlot";
+  }
+}
+
+SExpression* FlowGraphSerializer::SlotToSExp(const Slot& slot) {
+  auto sexp = new (zone()) SExpList(zone());
+  AddSymbol(sexp, "Slot");
+  AddInteger(sexp, slot.offset_in_bytes());
+  if (FLAG_verbose_flow_graph_serialization) {
+    AddExtraSymbol(sexp, "kind", SlotKindToCString(slot.kind()));
+    if (slot.IsDartField()) {
+      sexp->AddExtra("field", DartValueToSExp(slot.field()));
+    } else {
+      AddExtraString(sexp, "name", slot.Name());
+    }
+  }
+  return sexp;
+}
+
+void LoadFieldInstr::AddOperandsToSExpression(SExpList* sexp,
+                                              FlowGraphSerializer* s) const {
+  sexp->Add(instance()->ToSExpression(s));
+  sexp->Add(s->SlotToSExp(slot()));
+}
+
+void StoreInstanceFieldInstr::AddOperandsToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  sexp->Add(instance()->ToSExpression(s));
+  sexp->Add(s->SlotToSExp(slot()));
+  sexp->Add(value()->ToSExpression(s));
+}
+
+void LoadIndexedUnsafeInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (offset() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "offset", offset());
+  }
+}
+
+void StoreIndexedUnsafeInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (offset() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "offset", offset());
+  }
+}
+
+void ComparisonInstr::AddOperandsToSExpression(SExpList* sexp,
+                                               FlowGraphSerializer* s) const {
+  s->AddSymbol(sexp, Token::Str(kind()));
+  Instruction::AddOperandsToSExpression(sexp, s);
+}
+
+void DoubleTestOpInstr::AddOperandsToSExpression(SExpList* sexp,
+                                                 FlowGraphSerializer* s) const {
+  const bool negated = kind() != Token::kEQ;
+  switch (op_kind()) {
+    case MethodRecognizer::kDouble_getIsNaN:
+      s->AddSymbol(sexp, negated ? "IsNotNaN" : "IsNaN");
+      break;
+    case MethodRecognizer::kDouble_getIsInfinite:
+      s->AddSymbol(sexp, negated ? "IsNotInfinite" : "IsInfinite");
+      break;
+    default:
+      UNREACHABLE();
+  }
+  sexp->Add(value()->ToSExpression(s));
+}
+
+void GotoInstr::AddOperandsToSExpression(SExpList* sexp,
+                                         FlowGraphSerializer* s) const {
+  sexp->Add(s->BlockIdToSExp(successor()->block_id()));
+}
+
+void TailCallInstr::AddOperandsToSExpression(SExpList* sexp,
+                                             FlowGraphSerializer* s) const {
+  if (auto const code = s->DartValueToSExp(code_)) {
+    sexp->Add(code);
+  }
+  Instruction::AddOperandsToSExpression(sexp, s);
+}
+
+void NativeCallInstr::AddOperandsToSExpression(SExpList* sexp,
+                                               FlowGraphSerializer* s) const {
+  if (auto const func = s->DartValueToSExp(function())) {
+    sexp->Add(func);
+  }
+}
+
+template <>
+void TemplateDartCall<0l>::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (type_args_len() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "type_args_len", type_args_len());
+  }
+  s->AddExtraInteger(sexp, "args_len", ArgumentCountWithoutTypeArgs());
+}
+
+template <>
+void TemplateDartCall<1l>::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (type_args_len() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "type_args_len", type_args_len());
+  }
+  s->AddExtraInteger(sexp, "args_len", ArgumentCountWithoutTypeArgs());
+}
+
+void StaticCallInstr::AddOperandsToSExpression(SExpList* sexp,
+                                               FlowGraphSerializer* s) const {
+  if (auto const func = s->DartValueToSExp(function())) {
+    sexp->Add(func);
+  }
+}
+
+void InstanceCallInstr::AddOperandsToSExpression(SExpList* sexp,
+                                                 FlowGraphSerializer* s) const {
+  if (auto const target = s->DartValueToSExp(interface_target())) {
+    sexp->Add(target);
+  }
+}
+
+void PolymorphicInstanceCallInstr::AddOperandsToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  instance_call()->AddOperandsToSExpression(sexp, s);
+}
+
+void PolymorphicInstanceCallInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  ASSERT(deopt_id() == instance_call()->deopt_id());
+  instance_call()->AddExtraInfoToSExpression(sexp, s);
+  if (targets().length() > 0 || FLAG_verbose_flow_graph_serialization) {
+    auto elem_list = new (s->zone()) SExpList(s->zone());
+    for (intptr_t i = 0; i < targets().length(); i++) {
+      auto elem = new (s->zone()) SExpList(s->zone());
+      const TargetInfo* ti = targets().TargetAt(i);
+      if (ti->cid_start == ti->cid_end) {
+        s->AddInteger(elem, ti->cid_start);
+      } else {
+        auto range = new (s->zone()) SExpList(s->zone());
+        s->AddInteger(range, ti->cid_start);
+        s->AddInteger(range, ti->cid_end);
+        elem->Add(range);
+      }
+      if (auto const target = s->DartValueToSExp(*ti->target)) {
+        elem->Add(target);
+      }
+      elem_list->Add(elem);
+    }
+    sexp->AddExtra("targets", elem_list);
+  }
+}
+
+void AllocateObjectInstr::AddOperandsToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  if (auto const sexp_cls = s->DartValueToSExp(cls())) {
+    sexp->Add(sexp_cls);
+  }
+}
+
+void AllocateObjectInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  s->AddExtraInteger(sexp, "size", cls().instance_size());
+  if (ArgumentCount() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "args_len", ArgumentCount());
+  }
+  if (auto const closure = s->DartValueToSExp(closure_function())) {
+    sexp->AddExtra("closure_function", closure);
+  }
+}
+
+void BinaryIntegerOpInstr::AddOperandsToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  s->AddSymbol(sexp, Token::Str(op_kind()));
+  sexp->Add(left()->ToSExpression(s));
+  sexp->Add(right()->ToSExpression(s));
+}
+
+void CheckedSmiOpInstr::AddOperandsToSExpression(SExpList* sexp,
+                                                 FlowGraphSerializer* s) const {
+  s->AddSymbol(sexp, Token::Str(op_kind()));
+  sexp->Add(left()->ToSExpression(s));
+  sexp->Add(right()->ToSExpression(s));
+}
+
+// clang-format off
+static const char* simd_op_kind_string[] = {
+#define CASE(Arity, Mask, Name, ...) #Name,
+  SIMD_OP_LIST(CASE, CASE)
+#undef CASE
+  "IllegalSimdOp",
+};
+// clang-format on
+
+void SimdOpInstr::AddOperandsToSExpression(SExpList* sexp,
+                                           FlowGraphSerializer* s) const {
+  s->AddSymbol(sexp, simd_op_kind_string[kind()]);
+  Instruction::AddOperandsToSExpression(sexp, s);
+}
+
+void SimdOpInstr::AddExtraInfoToSExpression(SExpList* sexp,
+                                            FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (HasMask()) {
+    s->AddExtraInteger(sexp, "mask", mask());
+  }
+}
+
+void LoadIndexedInstr::AddExtraInfoToSExpression(SExpList* sexp,
+                                                 FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (aligned() || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraBool(sexp, "aligned", aligned());
+  }
+  if (index_scale() > 1 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "scale", index_scale());
+  }
+  if (class_id() != kDynamicCid || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "cid", class_id());
+  }
+}
+
+void StoreIndexedInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (aligned() || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraBool(sexp, "aligned", aligned());
+  }
+  if (index_scale() > 1 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "scale", index_scale());
+  }
+  if (class_id() != kDynamicCid || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "cid", class_id());
+  }
+}
+
+void CheckStackOverflowInstr::AddExtraInfoToSExpression(
+    SExpList* sexp,
+    FlowGraphSerializer* s) const {
+  Instruction::AddExtraInfoToSExpression(sexp, s);
+  if (stack_depth() > 0 || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "stack_depth", stack_depth());
+  }
+  if (in_loop() || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraInteger(sexp, "loop_depth", loop_depth());
+  }
+}
+
+SExpression* Value::ToSExpression(FlowGraphSerializer* s) const {
+  auto name = s->UseToSExp(definition());
+  if (reaching_type_ == nullptr || reaching_type_ == definition()->type_ ||
+      !ShouldSerializeType(reaching_type_)) {
+    return name;
+  }
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  s->AddSymbol(sexp, "value");
+  sexp->Add(name);
+  sexp->AddExtra("type", reaching_type_->ToSExpression(s));
+  return sexp;
+}
+
+SExpression* CompileType::ToSExpression(FlowGraphSerializer* s) const {
+  ASSERT(FLAG_verbose_flow_graph_serialization ||
+         FLAG_serialize_flow_graph_types);
+  ASSERT(cid_ != kDynamicCid || !is_nullable());
+
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  s->AddSymbol(sexp, "CompileType");
+  if (cid_ != kIllegalCid && cid_ != kDynamicCid) {
+    s->AddInteger(sexp, cid_);
+  }
+  AddExtraInfoToSExpression(sexp, s);
+  return sexp;
+}
+
+void CompileType::AddExtraInfoToSExpression(SExpList* sexp,
+                                            FlowGraphSerializer* s) const {
+  if (!is_nullable() || FLAG_verbose_flow_graph_serialization) {
+    s->AddExtraBool(sexp, "nullable", is_nullable());
+  }
+  if (cid_ == kIllegalCid || cid_ == kDynamicCid ||
+      FLAG_verbose_flow_graph_serialization) {
+    if (type_ != nullptr) {
+      sexp->AddExtra("type", s->DartValueToSExp(*type_));
+    } else {
+      s->AddExtraString(sexp, "name", ToCString());
+    }
+  }
+}
+
+SExpression* Environment::ToSExpression(FlowGraphSerializer* s) const {
+  auto sexp = new (s->zone()) SExpList(s->zone());
+  intptr_t arg_count = 0;
+
+  for (intptr_t i = 0; i < values_.length(); ++i) {
+    if (values_[i]->definition()->IsPushArgument()) {
+      s->AddSymbol(sexp, OS::SCreate(s->zone(), "arg[%" Pd "]", arg_count++));
+    } else {
+      sexp->Add(values_[i]->ToSExpression(s));
+    }
+    // TODO(sstrickl): This currently assumes that there are no locations in the
+    // environment (e.g. before register allocation). If we ever want to print
+    // out environments on steps after AllocateRegisters, we'll need to handle
+    // locations as well.
+    ASSERT(locations_ == nullptr || locations_[i].IsInvalid());
+  }
+  if (outer_ != NULL) {
+    sexp->Add(outer_->ToSExpression(s));
+  }
+  return sexp;
+}
+
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/il_serializer.h b/runtime/vm/compiler/backend/il_serializer.h
new file mode 100644
index 0000000..3390a53
--- /dev/null
+++ b/runtime/vm/compiler/backend/il_serializer.h
@@ -0,0 +1,140 @@
+// 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.
+
+#ifndef RUNTIME_VM_COMPILER_BACKEND_IL_SERIALIZER_H_
+#define RUNTIME_VM_COMPILER_BACKEND_IL_SERIALIZER_H_
+
+#include "platform/assert.h"
+#include "platform/text_buffer.h"
+
+#include "vm/allocation.h"
+#include "vm/compiler/backend/flow_graph.h"
+#include "vm/compiler/backend/il.h"
+#include "vm/compiler/backend/sexpression.h"
+#include "vm/object.h"
+#include "vm/zone.h"
+
+namespace dart {
+
+// Flow graph serialization.
+class FlowGraphSerializer : ValueObject {
+ public:
+  static void SerializeToBuffer(const FlowGraph* flow_graph,
+                                TextBuffer* buffer);
+  static void SerializeToBuffer(Zone* zone,
+                                const FlowGraph* flow_graph,
+                                TextBuffer* buffer);
+
+  const FlowGraph* flow_graph() const { return flow_graph_; }
+  Zone* zone() const { return zone_; }
+
+  SExpression* FlowGraphToSExp();
+
+  SExpSymbol* BlockEntryTag(const BlockEntryInstr* entry);
+  SExpression* BlockIdToSExp(intptr_t block_id);
+  SExpression* CanonicalNameToSExp(const Object& obj);
+  SExpression* UseToSExp(const Definition* definition);
+
+  // Helper method for creating canonical names.
+  void SerializeCanonicalName(TextBuffer* b, const Object& obj);
+
+  // Methods for serializing Dart values. If the argument
+  // value is the null object, the null pointer is returned.
+  SExpression* AbstractTypeToSExp(const AbstractType& typ);
+  SExpression* ArrayToSExp(const Array& arr);
+  SExpression* ClassToSExp(const Class& cls);
+  SExpression* ClosureToSExp(const Closure& c);
+  SExpression* CodeToSExp(const Code& c);
+  SExpression* FieldToSExp(const Field& f);
+  SExpression* FunctionToSExp(const Function& f);
+  SExpression* InstanceToSExp(const Instance& obj);
+  SExpression* TypeArgumentsToSExp(const TypeArguments& ta);
+
+  // A method for serializing a Dart value of arbitrary type. Unlike the
+  // type-specific methods, this returns the symbol "null" for the null object.
+  SExpression* ObjectToSExp(const Object& obj);
+
+  // A wrapper method for ObjectToSExp that first checks and sees if
+  // the provided value is in the constant pool. If it is, then it
+  // returns a reference to the constant definition via UseToSExp.
+  SExpression* DartValueToSExp(const Object& obj);
+
+  // A wrapper method for TypeArgumentsToSExp that also returns nullptr if the
+  // type arguments are empty and checks against the constant pool.
+  SExpression* NonEmptyTypeArgumentsToSExp(const TypeArguments& ta);
+
+  // Methods for serializing IL-specific values.
+  SExpression* LocalVariableToSExp(const LocalVariable& v);
+  SExpression* SlotToSExp(const Slot& s);
+
+  // Helper methods for adding atoms to S-expression lists
+  void AddBool(SExpList* sexp, bool b);
+  void AddInteger(SExpList* sexp, intptr_t i);
+  void AddString(SExpList* sexp, const char* cstr);
+  void AddSymbol(SExpList* sexp, const char* cstr);
+  void AddExtraBool(SExpList* sexp, const char* label, bool b);
+  void AddExtraInteger(SExpList* sexp, const char* label, intptr_t i);
+  void AddExtraString(SExpList* sexp, const char* label, const char* cstr);
+  void AddExtraSymbol(SExpList* sexp, const char* label, const char* cstr);
+
+ private:
+  FlowGraphSerializer(Zone* zone, const FlowGraph* flow_graph)
+      : flow_graph_(ASSERT_NOTNULL(flow_graph)),
+        zone_(zone),
+        tmp_string_(String::Handle(zone_)),
+        closure_function_(Function::Handle(zone_)),
+        closure_type_args_(TypeArguments::Handle(zone_)),
+        code_owner_(Object::Handle(zone_)),
+        function_type_args_(TypeArguments::Handle(zone_)),
+        instance_field_(Field::Handle(zone_)),
+        instance_type_args_(TypeArguments::Handle(zone_)),
+        serialize_library_(Library::Handle(zone_)),
+        serialize_owner_(Class::Handle(zone_)),
+        serialize_parent_(Function::Handle(zone_)),
+        type_arguments_elem_(AbstractType::Handle(zone_)),
+        type_class_(Class::Handle(zone_)),
+        type_ref_type_(AbstractType::Handle(zone_)) {}
+
+  static const char* const initial_indent;
+
+  // Helper methods for the function level that are not used by any
+  // instruction serialization methods.
+  SExpression* FunctionEntryToSExp(BlockEntryInstr* entry);
+  SExpression* EntriesToSExp(GraphEntryInstr* start);
+  SExpression* ConstantPoolToSExp(GraphEntryInstr* start);
+
+  const FlowGraph* const flow_graph_;
+  Zone* const zone_;
+
+  // Handles used across functions, where the contained value is used
+  // immediately and does not need to live across calls to other serializer
+  // functions.
+  String& tmp_string_;
+
+  // Handles for use within a single function in the following cases:
+  //
+  // * The function is guaranteed to not be re-entered during execution.
+  // * The contained value is not live across any possible re-entry.
+  //
+  // Generally, the most likely source of possible re-entry is calling
+  // DartValueToSExp with a sub-element of type Object, but any call to a
+  // FlowGraphSerializer method that may eventually enter one of the methods
+  // listed below should be examined with care.
+  Function& closure_function_;         // ClosureToSExp
+  TypeArguments& closure_type_args_;   // ClosureToSExp
+  Object& code_owner_;                 // CodeToSExp
+  TypeArguments& function_type_args_;  // FunctionToSExp
+  Field& instance_field_;              // InstanceToSExp
+  TypeArguments& instance_type_args_;  // InstanceToSExp
+  Library& serialize_library_;         // SerializeCanonicalName
+  Class& serialize_owner_;             // SerializeCanonicalName
+  Function& serialize_parent_;         // SerializeCanonicalName
+  AbstractType& type_arguments_elem_;  // TypeArgumentsToSExp
+  Class& type_class_;                  // AbstractTypeToSExp
+  AbstractType& type_ref_type_;        // AbstractTypeToSExp
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_BACKEND_IL_SERIALIZER_H_
diff --git a/runtime/vm/compiler/backend/il_test_helper.cc b/runtime/vm/compiler/backend/il_test_helper.cc
index 1e56f5a..dea57a5 100644
--- a/runtime/vm/compiler/backend/il_test_helper.cc
+++ b/runtime/vm/compiler/backend/il_test_helper.cc
@@ -140,8 +140,8 @@
 
   ASSERT(pass_state_->inline_id_to_function.length() ==
          pass_state_->caller_inline_id.length());
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder, use_far_branches);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder, use_far_branches);
   FlowGraphCompiler graph_compiler(
       &assembler, flow_graph_, *parsed_function_, optimized,
       &speculative_policy, pass_state_->inline_id_to_function,
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index a3570c2..598ff98 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -40,7 +40,8 @@
 
 DEFINE_BACKEND(LoadIndexedUnsafe, (Register out, Register index)) {
   ASSERT(instr->RequiredInputRepresentation(0) == kTagged);  // It is a Smi.
-  __ movq(out, Address(instr->base_reg(), index, TIMES_4, instr->offset()));
+  __ movq(out, compiler::Address(instr->base_reg(), index, TIMES_4,
+                                 instr->offset()));
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -50,7 +51,8 @@
                (NoLocation, Register index, Register value)) {
   ASSERT(instr->RequiredInputRepresentation(
              StoreIndexedUnsafeInstr::kIndexPos) == kTagged);  // It is a Smi.
-  __ movq(Address(instr->base_reg(), index, TIMES_4, instr->offset()), value);
+  __ movq(compiler::Address(instr->base_reg(), index, TIMES_4, instr->offset()),
+          value);
 
   ASSERT(kSmiTag == 0);
   ASSERT(kSmiTagSize == 1);
@@ -59,7 +61,7 @@
 DEFINE_BACKEND(TailCall, (NoLocation, Fixed<Register, ARGS_DESC_REG>)) {
   __ LoadObject(CODE_REG, instr->code());
   __ LeaveDartFrame();  // The arguments are still on the stack.
-  __ jmp(FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ jmp(compiler::FieldAddress(CODE_REG, Code::entry_point_offset()));
 
   // Even though the TailCallInstr will be the last instruction in a basic
   // block, the flow graph compiler will emit native code for other blocks after
@@ -118,7 +120,7 @@
 
 #if defined(DEBUG)
   __ Comment("Stack Check");
-  Label done;
+  compiler::Label done;
   const intptr_t fp_sp_dist =
       (compiler::target::frame_layout.first_local_from_fp + 1 -
        compiler->StackSize()) *
@@ -126,8 +128,8 @@
   ASSERT(fp_sp_dist <= 0);
   __ movq(RDI, RSP);
   __ subq(RDI, RBP);
-  __ CompareImmediate(RDI, Immediate(fp_sp_dist));
-  __ j(EQUAL, &done, Assembler::kNearJump);
+  __ CompareImmediate(RDI, compiler::Immediate(fp_sp_dist));
+  __ j(EQUAL, &done, compiler::Assembler::kNearJump);
   __ int3();
   __ Bind(&done);
 #endif
@@ -152,7 +154,9 @@
 
   // Restore top_resource.
   __ popq(TMP);
-  __ movq(Address(THR, compiler::target::Thread::top_resource_offset()), TMP);
+  __ movq(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()),
+      TMP);
 
   __ popq(vm_tag_reg);
 
@@ -263,13 +267,13 @@
   if (is_power_of_two_kind) {
     const intptr_t shift =
         Utils::ShiftForPowerOfTwo(Utils::Maximum(true_value, false_value));
-    __ shlq(RDX, Immediate(shift + kSmiTagSize));
+    __ shlq(RDX, compiler::Immediate(shift + kSmiTagSize));
   } else {
     __ decq(RDX);
-    __ AndImmediate(
-        RDX, Immediate(Smi::RawValue(true_value) - Smi::RawValue(false_value)));
+    __ AndImmediate(RDX, compiler::Immediate(Smi::RawValue(true_value) -
+                                             Smi::RawValue(false_value)));
     if (false_value != 0) {
-      __ AddImmediate(RDX, Immediate(Smi::RawValue(false_value)));
+      __ AddImmediate(RDX, compiler::Immediate(Smi::RawValue(false_value)));
     }
   }
 }
@@ -300,16 +304,16 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(result == value);  // Assert that register assignment is correct.
-  __ movq(
-      Address(RBP, compiler::target::FrameOffsetInBytesForVariable(&local())),
-      value);
+  __ movq(compiler::Address(
+              RBP, compiler::target::FrameOffsetInBytesForVariable(&local())),
+          value);
 }
 
 LocationSummary* ConstantInstr::MakeLocationSummary(Zone* zone,
                                                     bool opt) const {
   const intptr_t kNumInputs = 0;
   return LocationSummary::Make(zone, kNumInputs,
-                               Assembler::IsSafe(value())
+                               compiler::Assembler::IsSafe(value())
                                    ? Location::Constant(this)
                                    : Location::RequiresRegister(),
                                LocationSummary::kNoCall);
@@ -335,7 +339,7 @@
       if (value == 0) {
         __ xorl(destination.reg(), destination.reg());
       } else {
-        __ movq(destination.reg(), Immediate(value));
+        __ movq(destination.reg(), compiler::Immediate(value));
       }
     } else {
       ASSERT(representation() == kTagged);
@@ -348,7 +352,7 @@
       ASSERT(tmp != kNoRegister);
       __ LoadObject(tmp, value_);
       __ movsd(destination.fpu_reg(),
-               FieldAddress(tmp, Double::value_offset()));
+               compiler::FieldAddress(tmp, Double::value_offset()));
     }
   } else if (destination.IsDoubleStackSlot()) {
     if (Utils::DoublesBitEqual(Double::Cast(value_).value(), 0.0)) {
@@ -356,7 +360,7 @@
     } else {
       ASSERT(tmp != kNoRegister);
       __ LoadObject(tmp, value_);
-      __ movsd(FpuTMP, FieldAddress(tmp, Double::value_offset()));
+      __ movsd(FpuTMP, compiler::FieldAddress(tmp, Double::value_offset()));
     }
     __ movsd(LocationToStackSlotAddress(destination), FpuTMP);
   } else {
@@ -364,7 +368,8 @@
     if (representation() == kUnboxedInt32 ||
         representation() == kUnboxedInt64) {
       const int64_t value = Integer::Cast(value_).AsInt64Value();
-      __ movq(LocationToStackSlotAddress(destination), Immediate(value));
+      __ movq(LocationToStackSlotAddress(destination),
+              compiler::Immediate(value));
     } else {
       ASSERT(representation() == kTagged);
       __ StoreObject(LocationToStackSlotAddress(destination), value_);
@@ -505,10 +510,10 @@
   // Check that the type of the value is allowed in conditional context.
   // Call the runtime if the object is not bool::true or bool::false.
   ASSERT(locs->always_calls());
-  Label done;
+  compiler::Label done;
 
   __ CompareObject(reg, Object::null_instance());
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, compiler::Assembler::kNearJump);
 
   __ pushq(reg);  // Push the source object.
   compiler->GenerateRuntimeCall(token_pos, deopt_id,
@@ -579,14 +584,14 @@
 static void LoadValueCid(FlowGraphCompiler* compiler,
                          Register value_cid_reg,
                          Register value_reg,
-                         Label* value_is_smi = NULL) {
-  Label done;
+                         compiler::Label* value_is_smi = NULL) {
+  compiler::Label done;
   if (value_is_smi == NULL) {
-    __ LoadImmediate(value_cid_reg, Immediate(kSmiCid));
+    __ LoadImmediate(value_cid_reg, compiler::Immediate(kSmiCid));
   }
-  __ testq(value_reg, Immediate(kSmiTagMask));
+  __ testq(value_reg, compiler::Immediate(kSmiTagMask));
   if (value_is_smi == NULL) {
-    __ j(ZERO, &done, Assembler::kNearJump);
+    __ j(ZERO, &done, compiler::Assembler::kNearJump);
   } else {
     __ j(ZERO, value_is_smi);
   }
@@ -663,7 +668,8 @@
 
     if (constant->IsUnboxedSignedIntegerConstant()) {
       __ cmpq(left.reg(),
-              Immediate(constant->GetUnboxedSignedIntegerConstantValue()));
+              compiler::Immediate(
+                  constant->GetUnboxedSignedIntegerConstantValue()));
     } else {
       ASSERT(constant->representation() == kTagged);
       __ CompareObject(left.reg(), right.constant());
@@ -706,7 +712,7 @@
   __ comisd(left, right);
 
   Condition true_condition = TokenKindToDoubleCondition(kind);
-  Label* nan_result =
+  compiler::Label* nan_result =
       (true_condition == NOT_EQUAL) ? labels.true_label : labels.false_label;
   __ j(PARITY_EVEN, nan_result);
   return true_condition;
@@ -723,7 +729,7 @@
 }
 
 void ComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label is_true, is_false;
+  compiler::Label is_true, is_false;
   BranchLabels labels = {&is_true, &is_false, &is_false};
   Condition true_condition = EmitComparisonCode(compiler, labels);
   if (true_condition != INVALID_CONDITION) {
@@ -731,7 +737,7 @@
   }
 
   Register result = locs()->out(0).reg();
-  Label done;
+  compiler::Label done;
   __ Bind(&is_false);
   __ LoadObject(result, Bool::False());
   __ jmp(&done);
@@ -768,7 +774,7 @@
   if (right.IsConstant()) {
     ASSERT(right.constant().IsSmi());
     const int64_t imm = reinterpret_cast<int64_t>(right.constant().raw());
-    __ TestImmediate(left_reg, Immediate(imm));
+    __ TestImmediate(left_reg, compiler::Immediate(imm));
   } else {
     __ testq(left_reg, right.reg());
   }
@@ -794,23 +800,24 @@
   Register val_reg = locs()->in(0).reg();
   Register cid_reg = locs()->temp(0).reg();
 
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       deopt_id(), ICData::kDeoptTestCids,
-                                       licm_hoisted_ ? ICData::kHoisted : 0)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptTestCids,
+                                   licm_hoisted_ ? ICData::kHoisted : 0)
+          : NULL;
 
   const intptr_t true_result = (kind() == Token::kIS) ? 1 : 0;
   const ZoneGrowableArray<intptr_t>& data = cid_results();
   ASSERT(data[0] == kSmiCid);
   bool result = data[1] == true_result;
-  __ testq(val_reg, Immediate(kSmiTagMask));
+  __ testq(val_reg, compiler::Immediate(kSmiTagMask));
   __ j(ZERO, result ? labels.true_label : labels.false_label);
   __ LoadClassId(cid_reg, val_reg);
   for (intptr_t i = 2; i < data.length(); i += 2) {
     const intptr_t test_cid = data[i];
     ASSERT(test_cid != kSmiCid);
     result = data[i + 1] == true_result;
-    __ cmpq(cid_reg, Immediate(test_cid));
+    __ cmpq(cid_reg, compiler::Immediate(test_cid));
     __ j(EQUAL, result ? labels.true_label : labels.false_label);
   }
   // No match found, deoptimize or default action.
@@ -818,7 +825,7 @@
     // If the cid is not in the list, jump to the opposite label from the cids
     // that are in the list.  These must be all the same (see asserts in the
     // constructor).
-    Label* target = result ? labels.false_label : labels.true_label;
+    compiler::Label* target = result ? labels.false_label : labels.true_label;
     if (target != labels.fall_through) {
       __ jmp(target);
     }
@@ -886,13 +893,13 @@
   __ PushObject(Object::null_object());
 
   // Pass a pointer to the first argument in RAX.
-  __ leaq(RAX, Address(RSP, ArgumentCount() * kWordSize));
+  __ leaq(RAX, compiler::Address(RSP, ArgumentCount() * kWordSize));
 
-  __ LoadImmediate(R10, Immediate(argc_tag));
+  __ LoadImmediate(R10, compiler::Immediate(argc_tag));
   const Code* stub;
   if (link_lazily()) {
     stub = &StubCode::CallBootstrapNative();
-    ExternalLabel label(NativeEntry::LinkNativeCallEntry());
+    compiler::ExternalLabel label(NativeEntry::LinkNativeCallEntry());
     __ LoadNativeEntry(RBX, &label,
                        compiler::ObjectPoolBuilderEntry::kPatchable);
     compiler->GeneratePatchableCall(token_pos(), *stub,
@@ -905,7 +912,8 @@
     } else {
       stub = &StubCode::CallNoScopeNative();
     }
-    const ExternalLabel label(reinterpret_cast<uword>(native_c_function()));
+    const compiler::ExternalLabel label(
+        reinterpret_cast<uword>(native_c_function()));
     __ LoadNativeEntry(RBX, &label,
                        compiler::ObjectPoolBuilderEntry::kNotPatchable);
     compiler->GenerateCall(token_pos(), *stub, RawPcDescriptors::kOther,
@@ -925,7 +933,7 @@
   __ movq(saved_fp, FPREG);
 
   // Make a space to put the return address.
-  __ pushq(Immediate(0));
+  __ pushq(compiler::Immediate(0));
 
   // We need to create a dummy "exit frame". It will share the same pool pointer
   // but have a null code object.
@@ -936,7 +944,7 @@
 
   // Align frame before entering C++ world.
   if (OS::ActivationFrameAlignment() > 1) {
-    __ andq(SPREG, Immediate(~(OS::ActivationFrameAlignment() - 1)));
+    __ andq(SPREG, compiler::Immediate(~(OS::ActivationFrameAlignment() - 1)));
   }
 
   FrameRebase rebase(/*old_base=*/FPREG, /*new_base=*/saved_fp,
@@ -952,18 +960,34 @@
   // stack walker will know which safepoint to use. RIP points to the *next*
   // instruction, so 'AddressRIPRelative' loads the address of the following
   // 'movq'.
-  __ leaq(TMP, Address::AddressRIPRelative(0));
+  __ leaq(TMP, compiler::Address::AddressRIPRelative(0));
   compiler->EmitCallsiteMetadata(TokenPosition::kNoSource, DeoptId::kNone,
                                  RawPcDescriptors::Kind::kOther, locs());
-  __ movq(Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
+  __ movq(compiler::Address(FPREG, kSavedCallerPcSlotFromFp * kWordSize), TMP);
 
-  // Update information in the thread object and enter a safepoint.
-  __ TransitionGeneratedToNative(target_address, FPREG);
+  if (CanExecuteGeneratedCodeInSafepoint()) {
+    // Update information in the thread object and enter a safepoint.
+    __ TransitionGeneratedToNative(target_address, FPREG);
 
-  __ CallCFunction(target_address);
+    __ CallCFunction(target_address);
 
-  // Update information in the thread object and leave the safepoint.
-  __ TransitionNativeToGenerated();
+    // Update information in the thread object and leave the safepoint.
+    __ TransitionNativeToGenerated();
+  } else {
+    // We cannot trust that this code will be executable within a safepoint.
+    // Therefore we delegate the responsibility of entering/exiting the
+    // safepoint to a stub which in the VM isolate's heap, which will never lose
+    // execute permission.
+    __ movq(TMP,
+            compiler::Address(
+                THR, compiler::target::Thread::
+                         call_native_through_safepoint_entry_point_offset()));
+
+    // Calls RBX within a safepoint.
+    ASSERT(saved_fp == RBX);
+    __ movq(RBX, target_address);
+    __ call(TMP);
+  }
 
   // Although PP is a callee-saved register, it may have been moved by the GC.
   __ LeaveDartFrame(compiler::kRestoreCallerPP);
@@ -971,7 +995,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) {
-    __ movq(PP, Address(THR, Thread::global_object_pool_offset()));
+    __ movq(PP, compiler::Address(THR, Thread::global_object_pool_offset()));
   }
 
   __ set_constant_pool_allowed(true);
@@ -1014,15 +1038,15 @@
 
   // Enter the entry frame. Push a dummy return address for consistency with
   // EnterFrame on ARM(64).
-  __ PushImmediate(Immediate(0));
+  __ PushImmediate(compiler::Immediate(0));
   __ EnterFrame(0);
 
   // Save a space for the code object.
-  __ PushImmediate(Immediate(0));
+  __ PushImmediate(compiler::Immediate(0));
 
   // InvokeDartCodeStub saves the arguments descriptor here. We don't have one,
   // but we need to follow the same frame layout for the stack walker.
-  __ PushImmediate(Immediate(0));
+  __ PushImmediate(compiler::Immediate(0));
 
   // Save ABI callee-saved registers.
   __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
@@ -1037,9 +1061,8 @@
     __ EnterFrame(0);
     __ ReserveAlignedFrameSpace(0);
 
-    __ movq(
-        RAX,
-        Immediate(reinterpret_cast<int64_t>(DLRT_GetThreadForNativeCallback)));
+    __ movq(RAX, compiler::Immediate(reinterpret_cast<int64_t>(
+                     DLRT_GetThreadForNativeCallback)));
     __ call(RAX);
     __ movq(THR, RAX);
 
@@ -1047,17 +1070,19 @@
   }
 
   // Save the current VMTag on the stack.
-  __ movq(RAX, Assembler::VMTagAddress());
+  __ movq(RAX, compiler::Assembler::VMTagAddress());
   __ pushq(RAX);
 
   // Save top resource.
-  __ pushq(Address(THR, compiler::target::Thread::top_resource_offset()));
-  __ movq(Address(THR, compiler::target::Thread::top_resource_offset()),
-          Immediate(0));
+  __ pushq(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()));
+  __ movq(
+      compiler::Address(THR, compiler::target::Thread::top_resource_offset()),
+      compiler::Immediate(0));
 
   // Save top exit frame info. Stack walker expects it to be here.
-  __ pushq(
-      Address(THR, compiler::target::Thread::top_exit_frame_info_offset()));
+  __ pushq(compiler::Address(
+      THR, compiler::target::Thread::top_exit_frame_info_offset()));
 
   // In debug mode, verify that we've pushed the top exit frame info at the
   // correct offset from FP.
@@ -1071,27 +1096,30 @@
   // handles.
   // Otherwise we'll clobber the argument sent from the caller.
   COMPILE_ASSERT(RAX != CallingConventions::kArg1Reg);
-  __ movq(CallingConventions::kArg1Reg, Immediate(callback_id_));
-  __ movq(
-      RAX,
-      Address(THR, compiler::target::Thread::verify_callback_entry_offset()));
+  __ movq(CallingConventions::kArg1Reg, compiler::Immediate(callback_id_));
+  __ movq(RAX,
+          compiler::Address(
+              THR, compiler::target::Thread::verify_callback_entry_offset()));
   __ call(RAX);
 
   // Load the code object.
-  __ movq(RAX, Address(THR, compiler::target::Thread::callback_code_offset()));
-  __ movq(RAX, FieldAddress(
+  __ movq(RAX, compiler::Address(
+                   THR, compiler::target::Thread::callback_code_offset()));
+  __ movq(RAX, compiler::FieldAddress(
                    RAX, compiler::target::GrowableObjectArray::data_offset()));
-  __ movq(CODE_REG,
-          FieldAddress(RAX, compiler::target::Array::data_offset() +
-                                callback_id_ * compiler::target::kWordSize));
+  __ movq(CODE_REG, compiler::FieldAddress(
+                        RAX, compiler::target::Array::data_offset() +
+                                 callback_id_ * compiler::target::kWordSize));
 
   // Put the code object in the reserved slot.
-  __ movq(Address(FPREG, kPcMarkerSlotFromFp * compiler::target::kWordSize),
+  __ movq(compiler::Address(FPREG,
+                            kPcMarkerSlotFromFp * compiler::target::kWordSize),
           CODE_REG);
 
   if (FLAG_precompiled_mode && FLAG_use_bare_instructions) {
-    __ movq(PP, Address(THR,
-                        compiler::target::Thread::global_object_pool_offset()));
+    __ movq(PP,
+            compiler::Address(
+                THR, compiler::target::Thread::global_object_pool_offset()));
   } else {
     __ xorq(PP, PP);  // GC-safe value into PP.
   }
@@ -1101,10 +1129,11 @@
 
   // Push a dummy return address which suggests that we are inside of
   // InvokeDartCodeStub. This is how the stack walker detects an entry frame.
-  __ movq(
-      RAX,
-      Address(THR, compiler::target::Thread::invoke_dart_code_stub_offset()));
-  __ pushq(FieldAddress(RAX, compiler::target::Code::entry_point_offset()));
+  __ movq(RAX,
+          compiler::Address(
+              THR, compiler::target::Thread::invoke_dart_code_stub_offset()));
+  __ pushq(compiler::FieldAddress(
+      RAX, compiler::target::Code::entry_point_offset()));
 
   // Continue with Dart frame setup.
   FunctionEntryInstr::EmitNativeCode(compiler);
@@ -1136,10 +1165,12 @@
   Register char_code = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
-  __ movq(result, Address(THR, Thread::predefined_symbols_address_offset()));
-  __ movq(result, Address(result, char_code,
-                          TIMES_HALF_WORD_SIZE,  // Char code is a smi.
-                          Symbols::kNullCharCodeSymbolOffset * kWordSize));
+  __ movq(result,
+          compiler::Address(THR, Thread::predefined_symbols_address_offset()));
+  __ movq(result,
+          compiler::Address(result, char_code,
+                            TIMES_HALF_WORD_SIZE,  // Char code is a smi.
+                            Symbols::kNullCharCodeSymbolOffset * kWordSize));
 }
 
 LocationSummary* StringToCharCodeInstr::MakeLocationSummary(Zone* zone,
@@ -1153,14 +1184,14 @@
   ASSERT(cid_ == kOneByteStringCid);
   Register str = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label is_one, done;
-  __ movq(result, FieldAddress(str, String::length_offset()));
-  __ cmpq(result, Immediate(Smi::RawValue(1)));
-  __ j(EQUAL, &is_one, Assembler::kNearJump);
-  __ movq(result, Immediate(Smi::RawValue(-1)));
+  compiler::Label is_one, done;
+  __ movq(result, compiler::FieldAddress(str, String::length_offset()));
+  __ cmpq(result, compiler::Immediate(Smi::RawValue(1)));
+  __ j(EQUAL, &is_one, compiler::Assembler::kNearJump);
+  __ movq(result, compiler::Immediate(Smi::RawValue(-1)));
   __ jmp(&done);
   __ Bind(&is_one);
-  __ movzxb(result, FieldAddress(str, OneByteString::data_offset()));
+  __ movzxb(result, compiler::FieldAddress(str, OneByteString::data_offset()));
   __ SmiTag(result);
   __ Bind(&done);
 }
@@ -1200,15 +1231,15 @@
   Register obj = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   if (object()->definition()->representation() == kUntagged) {
-    __ movq(result, Address(obj, offset()));
+    __ movq(result, compiler::Address(obj, offset()));
   } else {
     ASSERT(object()->definition()->representation() == kTagged);
-    __ movq(result, FieldAddress(obj, offset()));
+    __ movq(result, compiler::FieldAddress(obj, offset()));
   }
 }
 
 DEFINE_BACKEND(StoreUntagged, (NoLocation, Register obj, Register value)) {
-  __ movq(Address(obj, instr->offset_from_tagged()), value);
+  __ movq(compiler::Address(obj, instr->offset_from_tagged()), value);
 }
 
 LocationSummary* LoadClassIdInstr::MakeLocationSummary(Zone* zone,
@@ -1227,10 +1258,10 @@
     // We don't use Assembler::LoadTaggedClassIdMayBeSmi() here---which uses
     // a conditional move instead---because it is slower, probably due to
     // branch prediction usually working just fine in this case.
-    Label load, done;
-    __ testq(object, Immediate(kSmiTagMask));
-    __ j(NOT_ZERO, &load, Assembler::kNearJump);
-    __ LoadImmediate(result, Immediate(Smi::RawValue(kSmiCid)));
+    compiler::Label load, done;
+    __ testq(object, compiler::Immediate(kSmiTagMask));
+    __ j(NOT_ZERO, &load, compiler::Assembler::kNearJump);
+    __ LoadImmediate(result, compiler::Immediate(Smi::RawValue(kSmiCid)));
     __ jmp(&done);
     __ Bind(&load);
     __ LoadClassId(result, object);
@@ -1250,7 +1281,7 @@
       : TemplateSlowPathCode(instruction), cls_(cls), result_(result) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("%s slow path allocation of %s", instruction()->DebugName(),
                  String::Handle(cls_.ScrubbedName()).ToCString());
     }
@@ -1277,14 +1308,14 @@
                        Register temp) {
     if (compiler->intrinsic_mode()) {
       __ TryAllocate(cls, compiler->intrinsic_slow_path_label(),
-                     Assembler::kFarJump, result, temp);
+                     compiler::Assembler::kFarJump, result, temp);
     } else {
       BoxAllocationSlowPath* slow_path =
           new BoxAllocationSlowPath(instruction, cls, result);
       compiler->AddSlowPathCode(slow_path);
 
-      __ TryAllocate(cls, slow_path->entry_label(), Assembler::kFarJump, result,
-                     temp);
+      __ TryAllocate(cls, slow_path->entry_label(),
+                     compiler::Assembler::kFarJump, result, temp);
       __ Bind(slow_path->exit_label());
     }
   }
@@ -1294,46 +1325,6 @@
   const Register result_;
 };
 
-CompileType LoadIndexedInstr::ComputeType() const {
-  switch (class_id_) {
-    case kArrayCid:
-    case kImmutableArrayCid:
-      return CompileType::Dynamic();
-
-    case kTypedDataFloat32ArrayCid:
-    case kTypedDataFloat64ArrayCid:
-      return CompileType::FromCid(kDoubleCid);
-    case kTypedDataFloat32x4ArrayCid:
-      return CompileType::FromCid(kFloat32x4Cid);
-    case kTypedDataInt32x4ArrayCid:
-      return CompileType::FromCid(kInt32x4Cid);
-    case kTypedDataFloat64x2ArrayCid:
-      return CompileType::FromCid(kFloat64x2Cid);
-
-    case kTypedDataInt8ArrayCid:
-    case kTypedDataUint8ArrayCid:
-    case kTypedDataUint8ClampedArrayCid:
-    case kExternalTypedDataUint8ArrayCid:
-    case kExternalTypedDataUint8ClampedArrayCid:
-    case kTypedDataInt16ArrayCid:
-    case kTypedDataUint16ArrayCid:
-    case kOneByteStringCid:
-    case kTwoByteStringCid:
-    case kExternalOneByteStringCid:
-    case kExternalTwoByteStringCid:
-    case kTypedDataInt32ArrayCid:
-    case kTypedDataUint32ArrayCid:
-      return CompileType::FromCid(kSmiCid);
-    case kTypedDataInt64ArrayCid:
-    case kTypedDataUint64ArrayCid:
-      return CompileType::Int();
-
-    default:
-      UNIMPLEMENTED();
-      return CompileType::Dynamic();
-  }
-}
-
 Representation LoadIndexedInstr::representation() const {
   switch (class_id_) {
     case kArrayCid:
@@ -1409,11 +1400,11 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address =
+  compiler::Address element_address =
       index.IsRegister()
-          ? Assembler::ElementAddressForRegIndex(
+          ? compiler::Assembler::ElementAddressForRegIndex(
                 IsExternal(), class_id(), index_scale(), array, index.reg())
-          : Assembler::ElementAddressForIntIndex(
+          : compiler::Assembler::ElementAddressForIntIndex(
                 IsExternal(), class_id(), index_scale(), array,
                 Smi::Cast(index.constant()).Value());
 
@@ -1510,8 +1501,9 @@
   const Register str = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address = Assembler::ElementAddressForRegIndex(
-      IsExternal(), class_id(), index_scale(), str, index.reg());
+  compiler::Address element_address =
+      compiler::Assembler::ElementAddressForRegIndex(
+          IsExternal(), class_id(), index_scale(), str, index.reg());
 
   if ((index_scale() == 1)) {
     __ SmiUntag(index.reg());
@@ -1668,11 +1660,11 @@
   const Register array = locs()->in(0).reg();
   const Location index = locs()->in(1);
 
-  Address element_address =
+  compiler::Address element_address =
       index.IsRegister()
-          ? Assembler::ElementAddressForRegIndex(
+          ? compiler::Assembler::ElementAddressForRegIndex(
                 IsExternal(), class_id(), index_scale(), array, index.reg())
-          : Assembler::ElementAddressForIntIndex(
+          : compiler::Assembler::ElementAddressForIntIndex(
                 IsExternal(), class_id(), index_scale(), array,
                 Smi::Cast(index.constant()).Value());
 
@@ -1702,7 +1694,7 @@
       if (locs()->in(2).IsConstant()) {
         const Smi& constant = Smi::Cast(locs()->in(2).constant());
         __ movb(element_address,
-                Immediate(static_cast<int8_t>(constant.Value())));
+                compiler::Immediate(static_cast<int8_t>(constant.Value())));
       } else {
         ASSERT(locs()->in(2).reg() == RAX);
         __ movb(element_address, RAX);
@@ -1720,18 +1712,19 @@
         } else if (value < 0) {
           value = 0;
         }
-        __ movb(element_address, Immediate(static_cast<int8_t>(value)));
+        __ movb(element_address,
+                compiler::Immediate(static_cast<int8_t>(value)));
       } else {
         ASSERT(locs()->in(2).reg() == RAX);
-        Label store_value, store_0xff;
-        __ CompareImmediate(RAX, Immediate(0xFF));
-        __ j(BELOW_EQUAL, &store_value, Assembler::kNearJump);
+        compiler::Label store_value, store_0xff;
+        __ CompareImmediate(RAX, compiler::Immediate(0xFF));
+        __ j(BELOW_EQUAL, &store_value, compiler::Assembler::kNearJump);
         // Clamp to 0x0 or 0xFF respectively.
         __ j(GREATER, &store_0xff);
         __ xorq(RAX, RAX);
-        __ jmp(&store_value, Assembler::kNearJump);
+        __ jmp(&store_value, compiler::Assembler::kNearJump);
         __ Bind(&store_0xff);
-        __ LoadImmediate(RAX, Immediate(0xFF));
+        __ LoadImmediate(RAX, compiler::Immediate(0xFF));
         __ Bind(&store_value);
         __ movb(element_address, RAX);
       }
@@ -1830,21 +1823,22 @@
                                  ? locs()->temp(locs()->temp_count() - 1).reg()
                                  : kNoRegister;
 
-  Label ok, fail_label;
+  compiler::Label ok, fail_label;
 
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (compiler->is_optimizing()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField);
   }
 
-  Label* fail = (deopt != NULL) ? deopt : &fail_label;
+  compiler::Label* fail = (deopt != NULL) ? deopt : &fail_label;
 
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
-    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(field_reg,
-                                           Field::is_nullable_offset());
+    compiler::FieldAddress field_cid_operand(field_reg,
+                                             Field::guarded_cid_offset());
+    compiler::FieldAddress field_nullability_operand(
+        field_reg, Field::is_nullable_offset());
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
@@ -1853,9 +1847,9 @@
       __ j(EQUAL, &ok);
       __ cmpw(value_cid_reg, field_nullability_operand);
     } else if (value_cid == kNullCid) {
-      __ cmpw(field_nullability_operand, Immediate(value_cid));
+      __ cmpw(field_nullability_operand, compiler::Immediate(value_cid));
     } else {
-      __ cmpw(field_cid_operand, Immediate(value_cid));
+      __ cmpw(field_cid_operand, compiler::Immediate(value_cid));
     }
     __ j(EQUAL, &ok);
 
@@ -1870,7 +1864,7 @@
     if (!is_complicated_field) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ cmpw(field_cid_operand, Immediate(kIllegalCid));
+      __ cmpw(field_cid_operand, compiler::Immediate(kIllegalCid));
       __ j(NOT_EQUAL, fail);
 
       if (value_cid == kDynamicCid) {
@@ -1878,8 +1872,8 @@
         __ movw(field_nullability_operand, value_cid_reg);
       } else {
         ASSERT(field_reg != kNoRegister);
-        __ movw(field_cid_operand, Immediate(value_cid));
-        __ movw(field_nullability_operand, Immediate(value_cid));
+        __ movw(field_cid_operand, compiler::Immediate(value_cid));
+        __ movw(field_nullability_operand, compiler::Immediate(value_cid));
       }
 
       __ jmp(&ok);
@@ -1889,8 +1883,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ cmpw(FieldAddress(field_reg, Field::guarded_cid_offset()),
-              Immediate(kDynamicCid));
+      __ cmpw(compiler::FieldAddress(field_reg, Field::guarded_cid_offset()),
+              compiler::Immediate(kDynamicCid));
       __ j(EQUAL, &ok);
 
       __ pushq(field_reg);
@@ -1907,12 +1901,12 @@
     // Field guard class has been initialized and is known.
     if (value_cid == kDynamicCid) {
       // Value's class id is not known.
-      __ testq(value_reg, Immediate(kSmiTagMask));
+      __ testq(value_reg, compiler::Immediate(kSmiTagMask));
 
       if (field_cid != kSmiCid) {
         __ j(ZERO, fail);
         __ LoadClassId(value_cid_reg, value_reg);
-        __ CompareImmediate(value_cid_reg, Immediate(field_cid));
+        __ CompareImmediate(value_cid_reg, compiler::Immediate(field_cid));
       }
 
       if (field().is_nullable() && (field_cid != kNullCid)) {
@@ -1957,7 +1951,7 @@
     return;  // Nothing to emit.
   }
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
@@ -1970,25 +1964,25 @@
     const Register offset_reg = locs()->temp(1).reg();
     const Register length_reg = locs()->temp(2).reg();
 
-    Label ok;
+    compiler::Label ok;
 
     __ LoadObject(field_reg, Field::ZoneHandle(field().Original()));
 
     __ movsxb(
         offset_reg,
-        FieldAddress(field_reg,
-                     Field::guarded_list_length_in_object_offset_offset()));
-    __ movq(length_reg,
-            FieldAddress(field_reg, Field::guarded_list_length_offset()));
+        compiler::FieldAddress(
+            field_reg, Field::guarded_list_length_in_object_offset_offset()));
+    __ movq(length_reg, compiler::FieldAddress(
+                            field_reg, Field::guarded_list_length_offset()));
 
-    __ cmpq(offset_reg, Immediate(0));
+    __ cmpq(offset_reg, compiler::Immediate(0));
     __ j(NEGATIVE, &ok);
 
     // Load the length from the value. GuardFieldClass already verified that
     // 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.
-    __ cmpq(length_reg, Address(value_reg, offset_reg, TIMES_1, 0));
+    __ cmpq(length_reg, compiler::Address(value_reg, offset_reg, TIMES_1, 0));
 
     if (deopt == NULL) {
       __ j(EQUAL, &ok);
@@ -2009,8 +2003,9 @@
            Field::kUnknownLengthOffset);
 
     __ CompareImmediate(
-        FieldAddress(value_reg, field().guarded_list_length_in_object_offset()),
-        Immediate(Smi::RawValue(field().guarded_list_length())));
+        compiler::FieldAddress(value_reg,
+                               field().guarded_list_length_in_object_offset()),
+        compiler::Immediate(Smi::RawValue(field().guarded_list_length())));
     __ j(NOT_EQUAL, deopt);
   }
 }
@@ -2036,12 +2031,12 @@
     return;
   }
 
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->is_optimizing()
           ? compiler->AddDeoptStub(deopt_id(), ICData::kDeoptGuardField)
           : NULL;
 
-  Label ok;
+  compiler::Label ok;
 
   const Register value_reg = locs()->in(0).reg();
   const Register temp = locs()->temp(0).reg();
@@ -2056,25 +2051,27 @@
   const Field& original =
       Field::ZoneHandle(compiler->zone(), field().Original());
   __ LoadObject(temp, original);
-  __ movsxb(temp,
-            FieldAddress(temp, Field::static_type_exactness_state_offset()));
+  __ movsxb(temp, compiler::FieldAddress(
+                      temp, Field::static_type_exactness_state_offset()));
 
   if (!compiler->is_optimizing()) {
     // Check if field requires checking (it is in unitialized or trivially
     // exact state).
-    __ cmpq(temp, Immediate(StaticTypeExactnessState::kUninitialized));
+    __ cmpq(temp,
+            compiler::Immediate(StaticTypeExactnessState::kUninitialized));
     __ j(LESS, &ok);
   }
 
-  Label call_runtime;
+  compiler::Label call_runtime;
   if (field().static_type_exactness_state().IsUninitialized()) {
     // Can't initialize the field state inline in optimized code.
-    __ cmpq(temp, Immediate(StaticTypeExactnessState::kUninitialized));
+    __ cmpq(temp,
+            compiler::Immediate(StaticTypeExactnessState::kUninitialized));
     __ j(EQUAL, compiler->is_optimizing() ? deopt : &call_runtime);
   }
 
   // At this point temp is known to be type arguments offset in words.
-  __ movq(temp, FieldAddress(value_reg, temp, TIMES_8, 0));
+  __ movq(temp, compiler::FieldAddress(value_reg, temp, TIMES_8, 0));
   __ CompareObject(temp, TypeArguments::ZoneHandle(
                              compiler->zone(),
                              AbstractType::Handle(field().type()).arguments()));
@@ -2132,24 +2129,25 @@
                              Register instance_reg,
                              intptr_t offset,
                              Register temp) {
-  Label done;
-  __ movq(box_reg, FieldAddress(instance_reg, offset));
+  compiler::Label done;
+  __ movq(box_reg, compiler::FieldAddress(instance_reg, offset));
   __ CompareObject(box_reg, Object::null_object());
   __ j(NOT_EQUAL, &done);
   BoxAllocationSlowPath::Allocate(compiler, instruction, cls, box_reg, temp);
   __ movq(temp, box_reg);
-  __ StoreIntoObject(instance_reg, FieldAddress(instance_reg, offset), temp,
-                     Assembler::kValueIsNotSmi);
+  __ StoreIntoObject(instance_reg, compiler::FieldAddress(instance_reg, offset),
+                     temp, compiler::Assembler::kValueIsNotSmi);
 
   __ Bind(&done);
 }
 
 void StoreInstanceFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(sizeof(classid_t) == kInt16Size);
-  Label skip_store;
+  compiler::Label skip_store;
 
   const Register instance_reg = locs()->in(0).reg();
   const intptr_t offset_in_bytes = OffsetInBytes();
+  ASSERT(offset_in_bytes > 0);  // Field is finalized and points after header.
 
   if (IsUnboxedStore() && compiler->is_optimizing()) {
     XmmRegister value = locs()->in(1).fpu_reg();
@@ -2176,23 +2174,25 @@
       BoxAllocationSlowPath::Allocate(compiler, this, *cls, temp, temp2);
       __ movq(temp2, temp);
       __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes), temp2,
-                         Assembler::kValueIsNotSmi);
+                         compiler::FieldAddress(instance_reg, offset_in_bytes),
+                         temp2, compiler::Assembler::kValueIsNotSmi);
     } else {
-      __ movq(temp, FieldAddress(instance_reg, offset_in_bytes));
+      __ movq(temp, compiler::FieldAddress(instance_reg, offset_in_bytes));
     }
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleStoreInstanceFieldInstr");
-        __ movsd(FieldAddress(temp, Double::value_offset()), value);
+        __ movsd(compiler::FieldAddress(temp, Double::value_offset()), value);
         break;
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4StoreInstanceFieldInstr");
-        __ movups(FieldAddress(temp, Float32x4::value_offset()), value);
+        __ movups(compiler::FieldAddress(temp, Float32x4::value_offset()),
+                  value);
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2StoreInstanceFieldInstr");
-        __ movups(FieldAddress(temp, Float64x2::value_offset()), value);
+        __ movups(compiler::FieldAddress(temp, Float64x2::value_offset()),
+                  value);
         break;
       default:
         UNREACHABLE();
@@ -2212,31 +2212,31 @@
       locs()->live_registers()->Add(locs()->in(1), kTagged);
     }
 
-    Label store_pointer;
-    Label store_double;
-    Label store_float32x4;
-    Label store_float64x2;
+    compiler::Label store_pointer;
+    compiler::Label store_double;
+    compiler::Label store_float32x4;
+    compiler::Label store_float64x2;
 
     __ LoadObject(temp, Field::ZoneHandle(Z, slot().field().Original()));
 
-    __ cmpw(FieldAddress(temp, Field::is_nullable_offset()),
-            Immediate(kNullCid));
+    __ cmpw(compiler::FieldAddress(temp, Field::is_nullable_offset()),
+            compiler::Immediate(kNullCid));
     __ j(EQUAL, &store_pointer);
 
-    __ movzxb(temp2, FieldAddress(temp, Field::kind_bits_offset()));
-    __ testq(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
+    __ movzxb(temp2, compiler::FieldAddress(temp, Field::kind_bits_offset()));
+    __ testq(temp2, compiler::Immediate(1 << Field::kUnboxingCandidateBit));
     __ j(ZERO, &store_pointer);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kDoubleCid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kDoubleCid));
     __ j(EQUAL, &store_double);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kFloat32x4Cid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
-    __ cmpw(FieldAddress(temp, Field::guarded_cid_offset()),
-            Immediate(kFloat64x2Cid));
+    __ cmpw(compiler::FieldAddress(temp, Field::guarded_cid_offset()),
+            compiler::Immediate(kFloat64x2Cid));
     __ j(EQUAL, &store_float64x2);
 
     // Fall through.
@@ -2251,8 +2251,9 @@
       __ Bind(&store_double);
       EnsureMutableBox(compiler, this, temp, compiler->double_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movsd(fpu_temp, FieldAddress(value_reg, Double::value_offset()));
-      __ movsd(FieldAddress(temp, Double::value_offset()), fpu_temp);
+      __ movsd(fpu_temp,
+               compiler::FieldAddress(value_reg, Double::value_offset()));
+      __ movsd(compiler::FieldAddress(temp, Double::value_offset()), fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2260,8 +2261,10 @@
       __ Bind(&store_float32x4);
       EnsureMutableBox(compiler, this, temp, compiler->float32x4_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movups(fpu_temp, FieldAddress(value_reg, Float32x4::value_offset()));
-      __ movups(FieldAddress(temp, Float32x4::value_offset()), fpu_temp);
+      __ movups(fpu_temp,
+                compiler::FieldAddress(value_reg, Float32x4::value_offset()));
+      __ movups(compiler::FieldAddress(temp, Float32x4::value_offset()),
+                fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2269,8 +2272,10 @@
       __ Bind(&store_float64x2);
       EnsureMutableBox(compiler, this, temp, compiler->float64x2_class(),
                        instance_reg, offset_in_bytes, temp2);
-      __ movups(fpu_temp, FieldAddress(value_reg, Float64x2::value_offset()));
-      __ movups(FieldAddress(temp, Float64x2::value_offset()), fpu_temp);
+      __ movups(fpu_temp,
+                compiler::FieldAddress(value_reg, Float64x2::value_offset()));
+      __ movups(compiler::FieldAddress(temp, Float64x2::value_offset()),
+                fpu_temp);
       __ jmp(&skip_store);
     }
 
@@ -2280,17 +2285,18 @@
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
     __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes), value_reg,
-                       CanValueBeSmi());
+                       compiler::FieldAddress(instance_reg, offset_in_bytes),
+                       value_reg, CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(instance_reg,
-                                  FieldAddress(instance_reg, offset_in_bytes),
-                                  locs()->in(1).constant());
+      __ StoreIntoObjectNoBarrier(
+          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+          locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
       __ StoreIntoObjectNoBarrier(
-          instance_reg, FieldAddress(instance_reg, offset_in_bytes), value_reg);
+          instance_reg, compiler::FieldAddress(instance_reg, offset_in_bytes),
+          value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2315,7 +2321,7 @@
 void LoadStaticFieldInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register field = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  __ movq(result, FieldAddress(field, Field::static_value_offset()));
+  __ movq(result, compiler::FieldAddress(field, Field::static_value_offset()));
 }
 
 LocationSummary* StoreStaticFieldInstr::MakeLocationSummary(Zone* zone,
@@ -2333,11 +2339,13 @@
 
   __ LoadObject(temp, Field::ZoneHandle(Z, field().Original()));
   if (this->value()->NeedsWriteBarrier()) {
-    __ StoreIntoObject(temp, FieldAddress(temp, Field::static_value_offset()),
-                       value, CanValueBeSmi());
+    __ StoreIntoObject(
+        temp, compiler::FieldAddress(temp, Field::static_value_offset()), value,
+        CanValueBeSmi());
   } else {
     __ StoreIntoObjectNoBarrier(
-        temp, FieldAddress(temp, Field::static_value_offset()), value);
+        temp, compiler::FieldAddress(temp, Field::static_value_offset()),
+        value);
   }
 }
 
@@ -2380,14 +2388,15 @@
 // Inlines array allocation for known constant values.
 static void InlineArrayAllocation(FlowGraphCompiler* compiler,
                                   intptr_t num_elements,
-                                  Label* slow_path,
-                                  Label* done) {
+                                  compiler::Label* slow_path,
+                                  compiler::Label* done) {
   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize.
   const Register kLengthReg = R10;
   const Register kElemTypeReg = RBX;
   const intptr_t instance_size = Array::InstanceSize(num_elements);
 
-  __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump,
+  __ TryAllocateArray(kArrayCid, instance_size, slow_path,
+                      compiler::Assembler::kFarJump,
                       RAX,   // instance
                       RCX,   // end address
                       R13);  // temp
@@ -2395,11 +2404,12 @@
   // RAX: new object start as a tagged pointer.
   // Store the type argument field.
   __ StoreIntoObjectNoBarrier(
-      RAX, FieldAddress(RAX, Array::type_arguments_offset()), kElemTypeReg);
+      RAX, compiler::FieldAddress(RAX, Array::type_arguments_offset()),
+      kElemTypeReg);
 
   // Set the length field.
-  __ StoreIntoObjectNoBarrier(RAX, FieldAddress(RAX, Array::length_offset()),
-                              kLengthReg);
+  __ StoreIntoObjectNoBarrier(
+      RAX, compiler::FieldAddress(RAX, Array::length_offset()), kLengthReg);
 
   // Initialize all array elements to raw_null.
   // RAX: new object start as a tagged pointer.
@@ -2409,23 +2419,24 @@
   if (num_elements > 0) {
     const intptr_t array_size = instance_size - sizeof(RawArray);
     __ LoadObject(R12, Object::null_object());
-    __ leaq(RDI, FieldAddress(RAX, sizeof(RawArray)));
+    __ leaq(RDI, compiler::FieldAddress(RAX, sizeof(RawArray)));
     if (array_size < (kInlineArraySize * kWordSize)) {
       intptr_t current_offset = 0;
       while (current_offset < array_size) {
-        __ StoreIntoObjectNoBarrier(RAX, Address(RDI, current_offset), R12);
+        __ StoreIntoObjectNoBarrier(RAX, compiler::Address(RDI, current_offset),
+                                    R12);
         current_offset += kWordSize;
       }
     } else {
-      Label init_loop;
+      compiler::Label init_loop;
       __ Bind(&init_loop);
-      __ StoreIntoObjectNoBarrier(RAX, Address(RDI, 0), R12);
-      __ addq(RDI, Immediate(kWordSize));
+      __ StoreIntoObjectNoBarrier(RAX, compiler::Address(RDI, 0), R12);
+      __ addq(RDI, compiler::Immediate(kWordSize));
       __ cmpq(RDI, RCX);
-      __ j(BELOW, &init_loop, Assembler::kNearJump);
+      __ j(BELOW, &init_loop, compiler::Assembler::kNearJump);
     }
   }
-  __ jmp(done, Assembler::kNearJump);
+  __ jmp(done, compiler::Assembler::kNearJump);
 }
 
 void CreateArrayInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -2444,13 +2455,13 @@
   ASSERT(locs()->in(0).reg() == kElemTypeReg);
   ASSERT(locs()->in(1).reg() == kLengthReg);
 
-  Label slow_path, done;
+  compiler::Label slow_path, done;
   if (compiler->is_optimizing() && !FLAG_precompiled_mode &&
       num_elements()->BindsToConstant() &&
       num_elements()->BoundConstant().IsSmi()) {
     const intptr_t length = Smi::Cast(num_elements()->BoundConstant()).Value();
     if (Array::IsValidLength(length)) {
-      Label slow_path, done;
+      compiler::Label slow_path, done;
       InlineArrayAllocation(compiler, length, &slow_path, &done);
       __ Bind(&slow_path);
       __ PushObject(Object::null_object());  // Make room for the result.
@@ -2502,20 +2513,22 @@
   if (IsUnboxedLoad() && compiler->is_optimizing()) {
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
-    __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
+    __ movq(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
     intptr_t cid = slot().field().UnboxedFieldCid();
     switch (cid) {
       case kDoubleCid:
         __ Comment("UnboxedDoubleLoadFieldInstr");
-        __ movsd(result, FieldAddress(temp, Double::value_offset()));
+        __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
         break;
       case kFloat32x4Cid:
         __ Comment("UnboxedFloat32x4LoadFieldInstr");
-        __ movups(result, FieldAddress(temp, Float32x4::value_offset()));
+        __ movups(result,
+                  compiler::FieldAddress(temp, Float32x4::value_offset()));
         break;
       case kFloat64x2Cid:
         __ Comment("UnboxedFloat64x2LoadFieldInstr");
-        __ movups(result, FieldAddress(temp, Float64x2::value_offset()));
+        __ movups(result,
+                  compiler::FieldAddress(temp, Float64x2::value_offset()));
         break;
       default:
         UNREACHABLE();
@@ -2523,32 +2536,34 @@
     return;
   }
 
-  Label done;
+  compiler::Label done;
   Register result = locs()->out(0).reg();
   if (IsPotentialUnboxedLoad()) {
     Register temp = locs()->temp(1).reg();
     XmmRegister value = locs()->temp(0).fpu_reg();
 
-    Label load_pointer;
-    Label load_double;
-    Label load_float32x4;
-    Label load_float64x2;
+    compiler::Label load_pointer;
+    compiler::Label load_double;
+    compiler::Label load_float32x4;
+    compiler::Label load_float64x2;
 
     __ LoadObject(result, Field::ZoneHandle(slot().field().Original()));
 
-    FieldAddress field_cid_operand(result, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(result, Field::is_nullable_offset());
+    compiler::FieldAddress field_cid_operand(result,
+                                             Field::guarded_cid_offset());
+    compiler::FieldAddress field_nullability_operand(
+        result, Field::is_nullable_offset());
 
-    __ cmpw(field_nullability_operand, Immediate(kNullCid));
+    __ cmpw(field_nullability_operand, compiler::Immediate(kNullCid));
     __ j(EQUAL, &load_pointer);
 
-    __ cmpw(field_cid_operand, Immediate(kDoubleCid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kDoubleCid));
     __ j(EQUAL, &load_double);
 
-    __ cmpw(field_cid_operand, Immediate(kFloat32x4Cid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
-    __ cmpw(field_cid_operand, Immediate(kFloat64x2Cid));
+    __ cmpw(field_cid_operand, compiler::Immediate(kFloat64x2Cid));
     __ j(EQUAL, &load_float64x2);
 
     // Fall through.
@@ -2562,9 +2577,9 @@
       __ Bind(&load_double);
       BoxAllocationSlowPath::Allocate(compiler, this, compiler->double_class(),
                                       result, temp);
-      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movsd(value, FieldAddress(temp, Double::value_offset()));
-      __ movsd(FieldAddress(result, Double::value_offset()), value);
+      __ movq(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movsd(value, compiler::FieldAddress(temp, Double::value_offset()));
+      __ movsd(compiler::FieldAddress(result, Double::value_offset()), value);
       __ jmp(&done);
     }
 
@@ -2572,9 +2587,10 @@
       __ Bind(&load_float32x4);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float32x4_class(), result, temp);
-      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movups(value, FieldAddress(temp, Float32x4::value_offset()));
-      __ movups(FieldAddress(result, Float32x4::value_offset()), value);
+      __ movq(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movups(value, compiler::FieldAddress(temp, Float32x4::value_offset()));
+      __ movups(compiler::FieldAddress(result, Float32x4::value_offset()),
+                value);
       __ jmp(&done);
     }
 
@@ -2582,15 +2598,16 @@
       __ Bind(&load_float64x2);
       BoxAllocationSlowPath::Allocate(
           compiler, this, compiler->float64x2_class(), result, temp);
-      __ movq(temp, FieldAddress(instance_reg, OffsetInBytes()));
-      __ movups(value, FieldAddress(temp, Float64x2::value_offset()));
-      __ movups(FieldAddress(result, Float64x2::value_offset()), value);
+      __ movq(temp, compiler::FieldAddress(instance_reg, OffsetInBytes()));
+      __ movups(value, compiler::FieldAddress(temp, Float64x2::value_offset()));
+      __ movups(compiler::FieldAddress(result, Float64x2::value_offset()),
+                value);
       __ jmp(&done);
     }
 
     __ Bind(&load_pointer);
   }
-  __ movq(result, FieldAddress(instance_reg, OffsetInBytes()));
+  __ movq(result, compiler::FieldAddress(instance_reg, OffsetInBytes()));
   __ Bind(&done);
 }
 
@@ -2654,14 +2671,14 @@
   // If both the instantiator and function type arguments are null and if the
   // type argument vector instantiated from null becomes a vector of dynamic,
   // then use null as the type arguments.
-  Label type_arguments_instantiated;
+  compiler::Label type_arguments_instantiated;
   const intptr_t len = type_arguments().Length();
   if (type_arguments().IsRawWhenInstantiatedFromRaw(len)) {
-    Label non_null_type_args;
+    compiler::Label non_null_type_args;
     __ CompareObject(instantiator_type_args_reg, Object::null_object());
-    __ j(NOT_EQUAL, &non_null_type_args, Assembler::kNearJump);
+    __ j(NOT_EQUAL, &non_null_type_args, compiler::Assembler::kNearJump);
     __ CompareObject(function_type_args_reg, Object::null_object());
-    __ j(EQUAL, &type_arguments_instantiated, Assembler::kNearJump);
+    __ j(EQUAL, &type_arguments_instantiated, compiler::Assembler::kNearJump);
     __ Bind(&non_null_type_args);
   }
 
@@ -2669,26 +2686,31 @@
   // TODO(regis): Consider moving this into a shared stub to reduce
   // generated code size.
   __ LoadObject(RDI, type_arguments());
-  __ movq(RDI, FieldAddress(RDI, TypeArguments::instantiations_offset()));
-  __ leaq(RDI, FieldAddress(RDI, Array::data_offset()));
+  __ movq(RDI,
+          compiler::FieldAddress(RDI, TypeArguments::instantiations_offset()));
+  __ leaq(RDI, compiler::FieldAddress(RDI, Array::data_offset()));
   // The instantiations cache is initialized with Object::zero_array() and is
   // therefore guaranteed to contain kNoInstantiator. No length check needed.
-  Label loop, next, found, slow_case;
+  compiler::Label loop, next, found, slow_case;
   __ Bind(&loop);
-  __ movq(RDX, Address(RDI, 0 * kWordSize));  // Cached instantiator type args.
+  __ movq(RDX, compiler::Address(
+                   RDI, 0 * kWordSize));  // Cached instantiator type args.
   __ cmpq(RDX, instantiator_type_args_reg);
-  __ j(NOT_EQUAL, &next, Assembler::kNearJump);
-  __ movq(R10, Address(RDI, 1 * kWordSize));  // Cached function type args.
+  __ j(NOT_EQUAL, &next, compiler::Assembler::kNearJump);
+  __ movq(R10,
+          compiler::Address(RDI, 1 * kWordSize));  // Cached function type args.
   __ cmpq(R10, function_type_args_reg);
-  __ j(EQUAL, &found, Assembler::kNearJump);
+  __ j(EQUAL, &found, compiler::Assembler::kNearJump);
   __ Bind(&next);
-  __ addq(RDI, Immediate(StubCode::kInstantiationSizeInWords * kWordSize));
-  __ cmpq(RDX, Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
-  __ j(NOT_EQUAL, &loop, Assembler::kNearJump);
-  __ jmp(&slow_case, Assembler::kNearJump);
+  __ addq(RDI,
+          compiler::Immediate(StubCode::kInstantiationSizeInWords * kWordSize));
+  __ cmpq(RDX, compiler::Immediate(Smi::RawValue(StubCode::kNoInstantiator)));
+  __ j(NOT_EQUAL, &loop, compiler::Assembler::kNearJump);
+  __ jmp(&slow_case, compiler::Assembler::kNearJump);
   __ Bind(&found);
-  __ movq(result_reg, Address(RDI, 2 * kWordSize));  // Cached instantiated ta.
-  __ jmp(&type_arguments_instantiated, Assembler::kNearJump);
+  __ movq(result_reg,
+          compiler::Address(RDI, 2 * kWordSize));  // Cached instantiated ta.
+  __ jmp(&type_arguments_instantiated, compiler::Assembler::kNearJump);
 
   __ Bind(&slow_case);
   // Instantiate non-null type arguments.
@@ -2735,7 +2757,8 @@
 
     compiler->SaveLiveRegisters(locs);
 
-    __ LoadImmediate(R10, Immediate(instruction()->num_context_variables()));
+    __ LoadImmediate(
+        R10, compiler::Immediate(instruction()->num_context_variables()));
     compiler->GenerateCall(instruction()->token_pos(),
                            StubCode::AllocateContext(),
                            RawPcDescriptors::kOther, locs);
@@ -2756,14 +2779,14 @@
   intptr_t instance_size = Context::InstanceSize(num_context_variables());
 
   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(),
-                      Assembler::kFarJump,
+                      compiler::Assembler::kFarJump,
                       result,  // instance
                       temp,    // end address
                       locs()->temp(1).reg());
 
   // Setup up number of context variables field.
-  __ movq(FieldAddress(result, Context::num_variables_offset()),
-          Immediate(num_context_variables()));
+  __ movq(compiler::FieldAddress(result, Context::num_variables_offset()),
+          compiler::Immediate(num_context_variables()));
 
   __ Bind(slow_path->exit_label());
 }
@@ -2783,7 +2806,7 @@
   ASSERT(locs()->temp(0).reg() == R10);
   ASSERT(locs()->out(0).reg() == RAX);
 
-  __ LoadImmediate(R10, Immediate(num_context_variables()));
+  __ LoadImmediate(R10, compiler::Immediate(num_context_variables()));
   compiler->GenerateCall(token_pos(), StubCode::AllocateContext(),
                          RawPcDescriptors::kOther, locs());
 }
@@ -2803,9 +2826,9 @@
   Register field = locs()->in(0).reg();
   Register temp = locs()->temp(0).reg();
 
-  Label call_runtime, no_call;
+  compiler::Label call_runtime, no_call;
 
-  __ movq(temp, FieldAddress(field, Field::static_value_offset()));
+  __ movq(temp, compiler::FieldAddress(field, Field::static_value_offset()));
   __ CompareObject(temp, Object::sentinel());
   __ j(EQUAL, &call_runtime);
 
@@ -2876,17 +2899,19 @@
        compiler->StackSize()) *
       kWordSize;
   ASSERT(fp_sp_dist <= 0);
-  __ leaq(RSP, Address(RBP, fp_sp_dist));
+  __ leaq(RSP, compiler::Address(RBP, fp_sp_dist));
 
   if (!compiler->is_optimizing()) {
     if (raw_exception_var_ != nullptr) {
-      __ movq(Address(RBP, compiler::target::FrameOffsetInBytesForVariable(
-                               raw_exception_var_)),
+      __ movq(compiler::Address(RBP,
+                                compiler::target::FrameOffsetInBytesForVariable(
+                                    raw_exception_var_)),
               kExceptionObjectReg);
     }
     if (raw_stacktrace_var_ != nullptr) {
-      __ movq(Address(RBP, compiler::target::FrameOffsetInBytesForVariable(
-                               raw_stacktrace_var_)),
+      __ movq(compiler::Address(RBP,
+                                compiler::target::FrameOffsetInBytesForVariable(
+                                    raw_stacktrace_var_)),
               kStackTraceObjectReg);
     }
   }
@@ -2917,8 +2942,8 @@
     if (compiler->isolate()->use_osr() && osr_entry_label()->IsLinked()) {
       __ Comment("CheckStackOverflowSlowPathOsr");
       __ Bind(osr_entry_label());
-      __ movq(Address(THR, Thread::stack_overflow_flags_offset()),
-              Immediate(Thread::kOsrRequest));
+      __ movq(compiler::Address(THR, Thread::stack_overflow_flags_offset()),
+              compiler::Immediate(Thread::kOsrRequest));
     }
     __ Comment("CheckStackOverflowSlowPath");
     __ Bind(entry_label());
@@ -2938,7 +2963,7 @@
       const uword entry_point_offset =
           Thread::stack_overflow_shared_stub_entry_point_offset(
               instruction()->locs()->live_registers()->FpuRegisterCount() > 0);
-      __ call(Address(THR, entry_point_offset));
+      __ call(compiler::Address(THR, entry_point_offset));
       compiler->RecordSafepoint(instruction()->locs(), kNumSlowPathArgs);
       compiler->RecordCatchEntryMoves();
       compiler->AddDescriptor(
@@ -2965,13 +2990,13 @@
     __ jmp(exit_label());
   }
 
-  Label* osr_entry_label() {
+  compiler::Label* osr_entry_label() {
     ASSERT(Isolate::Current()->use_osr());
     return &osr_entry_label_;
   }
 
  private:
-  Label osr_entry_label_;
+  compiler::Label osr_entry_label_;
 };
 
 void CheckStackOverflowInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
@@ -2980,7 +3005,7 @@
 
   Register temp = locs()->temp(0).reg();
   // Generate stack overflow check.
-  __ cmpq(RSP, Address(THR, Thread::stack_limit_offset()));
+  __ cmpq(RSP, compiler::Address(THR, Thread::stack_limit_offset()));
   __ j(BELOW_EQUAL, slow_path->entry_label());
   if (compiler->CanOSRFunction() && in_loop()) {
     // In unoptimized code check the usage counter to trigger OSR at loop
@@ -2989,9 +3014,9 @@
     __ LoadObject(temp, compiler->parsed_function().function());
     int32_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ incl(FieldAddress(temp, Function::usage_counter_offset()));
-    __ cmpl(FieldAddress(temp, Function::usage_counter_offset()),
-            Immediate(threshold));
+    __ incl(compiler::FieldAddress(temp, Function::usage_counter_offset()));
+    __ cmpl(compiler::FieldAddress(temp, Function::usage_counter_offset()),
+            compiler::Immediate(threshold));
     __ j(GREATER_EQUAL, slow_path->osr_entry_label());
   }
   if (compiler->ForceSlowPathForStackOverflow()) {
@@ -3006,10 +3031,11 @@
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
   ASSERT(left == result);
-  Label* deopt = shift_left->CanDeoptimize()
-                     ? compiler->AddDeoptStub(shift_left->deopt_id(),
-                                              ICData::kDeoptBinarySmiOp)
-                     : NULL;
+  compiler::Label* deopt =
+      shift_left->CanDeoptimize()
+          ? compiler->AddDeoptStub(shift_left->deopt_id(),
+                                   ICData::kDeoptBinarySmiOp)
+          : NULL;
   if (locs.in(1).IsConstant()) {
     const Object& constant = locs.in(1).constant();
     ASSERT(constant.IsSmi());
@@ -3020,20 +3046,20 @@
     if (shift_left->can_overflow()) {
       if (value == 1) {
         // Use overflow flag.
-        __ shlq(left, Immediate(1));
+        __ shlq(left, compiler::Immediate(1));
         __ j(OVERFLOW, deopt);
         return;
       }
       // Check for overflow.
       Register temp = locs.temp(0).reg();
       __ movq(temp, left);
-      __ shlq(left, Immediate(value));
-      __ sarq(left, Immediate(value));
+      __ shlq(left, compiler::Immediate(value));
+      __ sarq(left, compiler::Immediate(value));
       __ cmpq(left, temp);
       __ j(NOT_EQUAL, deopt);  // Overflow.
     }
     // Shift for result now we know there is no overflow.
-    __ shlq(left, Immediate(value));
+    __ shlq(left, compiler::Immediate(value));
     return;
   }
 
@@ -3047,7 +3073,7 @@
     if (obj.IsSmi()) {
       const intptr_t left_int = Smi::Cast(obj).Value();
       if (left_int == 0) {
-        __ CompareImmediate(right, Immediate(0));
+        __ CompareImmediate(right, compiler::Immediate(0));
         __ j(NEGATIVE, deopt);
         return;
       }
@@ -3056,7 +3082,8 @@
           !RangeUtils::IsWithin(right_range, 0, max_right - 1);
       if (right_needs_check) {
         __ CompareImmediate(
-            right, Immediate(reinterpret_cast<int64_t>(Smi::New(max_right))));
+            right, compiler::Immediate(
+                       reinterpret_cast<int64_t>(Smi::New(max_right))));
         __ j(ABOVE_EQUAL, deopt);
       }
       __ SmiUntag(right);
@@ -3074,15 +3101,16 @@
           (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
-        __ CompareImmediate(right, Immediate(0));
+        __ CompareImmediate(right, compiler::Immediate(0));
         __ j(NEGATIVE, deopt);
       }
-      Label done, is_not_zero;
+      compiler::Label done, is_not_zero;
       __ CompareImmediate(
-          right, Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
-      __ j(BELOW, &is_not_zero, Assembler::kNearJump);
+          right,
+          compiler::Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+      __ j(BELOW, &is_not_zero, compiler::Assembler::kNearJump);
       __ xorq(left, left);
-      __ jmp(&done, Assembler::kNearJump);
+      __ jmp(&done, compiler::Assembler::kNearJump);
       __ Bind(&is_not_zero);
       __ SmiUntag(right);
       __ shlq(left, right);
@@ -3095,7 +3123,8 @@
     if (right_needs_check) {
       ASSERT(shift_left->CanDeoptimize());
       __ CompareImmediate(
-          right, Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
+          right,
+          compiler::Immediate(reinterpret_cast<int64_t>(Smi::New(Smi::kBits))));
       __ j(ABOVE_EQUAL, deopt);
     }
     // Left is not a constant.
@@ -3121,7 +3150,7 @@
   static constexpr intptr_t kNumSlowPathArgs = 2;
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi operation");
     }
     __ Bind(entry_label());
@@ -3195,15 +3224,15 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
-    __ testq(left, Immediate(kSmiTagMask));
+    __ testq(left, compiler::Immediate(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ testq(right, Immediate(kSmiTagMask));
+    __ testq(right, compiler::Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ testq(left, Immediate(kSmiTagMask));
+    __ testq(left, compiler::Immediate(kSmiTagMask));
   } else {
     __ movq(TMP, left);
     __ orq(TMP, right);
-    __ testq(TMP, Immediate(kSmiTagMask));
+    __ testq(TMP, compiler::Immediate(kSmiTagMask));
   }
   __ j(NOT_ZERO, slow_path->entry_label());
   Register result = locs()->out(0).reg();
@@ -3239,7 +3268,7 @@
     case Token::kSHL:
       ASSERT(result != right);
       ASSERT(locs()->temp(0).reg() == RCX);
-      __ cmpq(right, Immediate(Smi::RawValue(Smi::kBits)));
+      __ cmpq(right, compiler::Immediate(Smi::RawValue(Smi::kBits)));
       __ j(ABOVE_EQUAL, slow_path->entry_label());
 
       __ movq(RCX, right);
@@ -3252,10 +3281,10 @@
       __ j(NOT_EQUAL, slow_path->entry_label());
       break;
     case Token::kSHR: {
-      Label shift_count_ok;
+      compiler::Label shift_count_ok;
       ASSERT(result != right);
       ASSERT(locs()->temp(0).reg() == RCX);
-      __ cmpq(right, Immediate(Smi::RawValue(Smi::kBits)));
+      __ cmpq(right, compiler::Immediate(Smi::RawValue(Smi::kBits)));
       __ j(ABOVE_EQUAL, slow_path->entry_label());
 
       __ movq(RCX, right);
@@ -3287,7 +3316,7 @@
         merged_(merged) {}
 
   virtual void EmitNativeCode(FlowGraphCompiler* compiler) {
-    if (Assembler::EmittingComments()) {
+    if (compiler::Assembler::EmittingComments()) {
       __ Comment("slow path smi comparison");
     }
     __ Bind(entry_label());
@@ -3359,15 +3388,15 @@
   Register left = locs()->in(0).reg();                                         \
   Register right = locs()->in(1).reg();                                        \
   if (this->left()->definition() == this->right()->definition()) {             \
-    __ testq(left, Immediate(kSmiTagMask));                                    \
+    __ testq(left, compiler::Immediate(kSmiTagMask));                          \
   } else if (left_cid == kSmiCid) {                                            \
-    __ testq(right, Immediate(kSmiTagMask));                                   \
+    __ testq(right, compiler::Immediate(kSmiTagMask));                         \
   } else if (right_cid == kSmiCid) {                                           \
-    __ testq(left, Immediate(kSmiTagMask));                                    \
+    __ testq(left, compiler::Immediate(kSmiTagMask));                          \
   } else {                                                                     \
     __ movq(TMP, left);                                                        \
     __ orq(TMP, right);                                                        \
-    __ testq(TMP, Immediate(kSmiTagMask));                                     \
+    __ testq(TMP, compiler::Immediate(kSmiTagMask));                           \
   }                                                                            \
   __ j(NOT_ZERO, slow_path->entry_label())
 
@@ -3388,9 +3417,9 @@
 
 void CheckedSmiComparisonInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   // Zone-allocate labels to pass them to slow-path which outlives local scope.
-  Label* true_label = new (Z) Label();
-  Label* false_label = new (Z) Label();
-  Label done;
+  compiler::Label* true_label = new (Z) compiler::Label();
+  compiler::Label* false_label = new (Z) compiler::Label();
+  compiler::Label done;
   BranchLabels labels = {true_label, false_label, false_label};
   // In case of negated comparison result of a slow path call should be negated.
   // For this purpose, 'merged' slow path is generated: it tests
@@ -3418,7 +3447,8 @@
 
 static bool CanBeImmediate(const Object& constant) {
   return constant.IsSmi() &&
-         Immediate(reinterpret_cast<int64_t>(constant.raw())).is_int32();
+         compiler::Immediate(reinterpret_cast<int64_t>(constant.raw()))
+             .is_int32();
 }
 
 static bool IsSmiValue(const Object& constant, intptr_t value) {
@@ -3519,7 +3549,7 @@
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
-  Label* deopt = NULL;
+  compiler::Label* deopt = NULL;
   if (CanDeoptimize()) {
     deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   }
@@ -3530,19 +3560,19 @@
     const int64_t imm = reinterpret_cast<int64_t>(constant.raw());
     switch (op_kind()) {
       case Token::kADD: {
-        __ AddImmediate(left, Immediate(imm));
+        __ AddImmediate(left, compiler::Immediate(imm));
         if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kSUB: {
-        __ SubImmediate(left, Immediate(imm));
+        __ SubImmediate(left, compiler::Immediate(imm));
         if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
       case Token::kMUL: {
         // Keep left value tagged and untag right value.
         const intptr_t value = Smi::Cast(constant).Value();
-        __ MulImmediate(left, Immediate(value));
+        __ MulImmediate(left, compiler::Immediate(value));
         if (deopt != NULL) __ j(OVERFLOW, deopt);
         break;
       }
@@ -3555,12 +3585,12 @@
         ASSERT(kSmiTagSize == 1);
         Register temp = locs()->temp(0).reg();
         __ movq(temp, left);
-        __ sarq(temp, Immediate(63));
+        __ sarq(temp, compiler::Immediate(63));
         ASSERT(shift_count > 1);  // 1, -1 case handled above.
-        __ shrq(temp, Immediate(64 - shift_count));
+        __ shrq(temp, compiler::Immediate(64 - shift_count));
         __ addq(left, temp);
         ASSERT(shift_count > 0);
-        __ sarq(left, Immediate(shift_count));
+        __ sarq(left, compiler::Immediate(shift_count));
         if (value < 0) {
           __ negq(left);
         }
@@ -3569,17 +3599,17 @@
       }
       case Token::kBIT_AND: {
         // No overflow check.
-        __ AndImmediate(left, Immediate(imm));
+        __ AndImmediate(left, compiler::Immediate(imm));
         break;
       }
       case Token::kBIT_OR: {
         // No overflow check.
-        __ OrImmediate(left, Immediate(imm));
+        __ OrImmediate(left, compiler::Immediate(imm));
         break;
       }
       case Token::kBIT_XOR: {
         // No overflow check.
-        __ XorImmediate(left, Immediate(imm));
+        __ XorImmediate(left, compiler::Immediate(imm));
         break;
       }
 
@@ -3587,8 +3617,8 @@
         // sarq operation masks the count to 6 bits.
         const intptr_t kCountLimit = 0x3F;
         const intptr_t value = Smi::Cast(constant).Value();
-        __ sarq(left,
-                Immediate(Utils::Minimum(value + kSmiTagSize, kCountLimit)));
+        __ sarq(left, compiler::Immediate(
+                          Utils::Minimum(value + kSmiTagSize, kCountLimit)));
         __ SmiTag(left);
         break;
       }
@@ -3601,7 +3631,7 @@
   }  // locs()->in(1).IsConstant().
 
   if (locs()->in(1).IsStackSlot()) {
-    const Address& right = LocationToStackSlotAddress(locs()->in(1));
+    const compiler::Address& right = LocationToStackSlotAddress(locs()->in(1));
     switch (op_kind()) {
       case Token::kADD: {
         __ addq(left, right);
@@ -3676,7 +3706,7 @@
       break;
     }
     case Token::kTRUNCDIV: {
-      Label not_32bit, done;
+      compiler::Label not_32bit, done;
 
       Register temp = locs()->temp(0).reg();
       ASSERT(left == RAX);
@@ -3717,7 +3747,7 @@
       if (RangeUtils::Overlaps(right_range(), -1, -1)) {
         // Check the corner case of dividing the 'MIN_SMI' with -1, in which
         // case we cannot tag the result.
-        __ CompareImmediate(result, Immediate(0x4000000000000000));
+        __ CompareImmediate(result, compiler::Immediate(0x4000000000000000));
         __ j(EQUAL, deopt);
       }
       __ Bind(&done);
@@ -3725,7 +3755,7 @@
       break;
     }
     case Token::kMOD: {
-      Label not_32bit, div_done;
+      compiler::Label not_32bit, div_done;
 
       Register temp = locs()->temp(0).reg();
       ASSERT(left == RDX);
@@ -3773,16 +3803,16 @@
       //      res = res + right;
       //    }
       //  }
-      Label all_done;
-      __ cmpq(result, Immediate(0));
-      __ j(GREATER_EQUAL, &all_done, Assembler::kNearJump);
+      compiler::Label all_done;
+      __ cmpq(result, compiler::Immediate(0));
+      __ j(GREATER_EQUAL, &all_done, compiler::Assembler::kNearJump);
       // Result is negative, adjust it.
       if (RangeUtils::Overlaps(right_range(), -1, 1)) {
-        Label subtract;
-        __ cmpq(right, Immediate(0));
-        __ j(LESS, &subtract, Assembler::kNearJump);
+        compiler::Label subtract;
+        __ cmpq(right, compiler::Immediate(0));
+        __ j(LESS, &subtract, compiler::Assembler::kNearJump);
         __ addq(result, right);
-        __ jmp(&all_done, Assembler::kNearJump);
+        __ jmp(&all_done, compiler::Assembler::kNearJump);
         __ Bind(&subtract);
         __ subq(result, right);
       } else if (right_range()->IsPositive()) {
@@ -3798,17 +3828,17 @@
     }
     case Token::kSHR: {
       if (CanDeoptimize()) {
-        __ CompareImmediate(right, Immediate(0));
+        __ CompareImmediate(right, compiler::Immediate(0));
         __ j(LESS, deopt);
       }
       __ SmiUntag(right);
       // sarq operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if (!RangeUtils::OnlyLessThanOrEqualTo(right_range(), kCountLimit)) {
-        __ CompareImmediate(right, Immediate(kCountLimit));
-        Label count_ok;
-        __ j(LESS, &count_ok, Assembler::kNearJump);
-        __ LoadImmediate(right, Immediate(kCountLimit));
+        __ CompareImmediate(right, compiler::Immediate(kCountLimit));
+        compiler::Label count_ok;
+        __ j(LESS, &count_ok, compiler::Assembler::kNearJump);
+        __ LoadImmediate(right, compiler::Immediate(kCountLimit));
         __ Bind(&count_ok);
       }
       ASSERT(right == RCX);  // Count must be in RCX
@@ -3854,7 +3884,7 @@
 }
 
 void CheckEitherNonSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryDoubleOp,
                              licm_hoisted_ ? ICData::kHoisted : 0);
   intptr_t left_cid = left()->Type()->ToCid();
@@ -3862,16 +3892,16 @@
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   if (this->left()->definition() == this->right()->definition()) {
-    __ testq(left, Immediate(kSmiTagMask));
+    __ testq(left, compiler::Immediate(kSmiTagMask));
   } else if (left_cid == kSmiCid) {
-    __ testq(right, Immediate(kSmiTagMask));
+    __ testq(right, compiler::Immediate(kSmiTagMask));
   } else if (right_cid == kSmiCid) {
-    __ testq(left, Immediate(kSmiTagMask));
+    __ testq(left, compiler::Immediate(kSmiTagMask));
   } else {
     Register temp = locs()->temp(0).reg();
     __ movq(temp, left);
     __ orq(temp, right);
-    __ testq(temp, Immediate(kSmiTagMask));
+    __ testq(temp, compiler::Immediate(kSmiTagMask));
   }
   __ j(ZERO, deopt);
 }
@@ -3898,17 +3928,17 @@
 
   switch (from_representation()) {
     case kUnboxedDouble:
-      __ movsd(FieldAddress(out_reg, ValueOffset()), value);
+      __ movsd(compiler::FieldAddress(out_reg, ValueOffset()), value);
       break;
     case kUnboxedFloat: {
       __ cvtss2sd(FpuTMP, value);
-      __ movsd(FieldAddress(out_reg, ValueOffset()), FpuTMP);
+      __ movsd(compiler::FieldAddress(out_reg, ValueOffset()), FpuTMP);
       break;
     }
     case kUnboxedFloat32x4:
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4:
-      __ movups(FieldAddress(out_reg, ValueOffset()), value);
+      __ movups(compiler::FieldAddress(out_reg, ValueOffset()), value);
       break;
     default:
       UNREACHABLE();
@@ -3940,19 +3970,19 @@
   switch (representation()) {
     case kUnboxedInt64: {
       const Register result = locs()->out(0).reg();
-      __ movq(result, FieldAddress(box, ValueOffset()));
+      __ movq(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
     case kUnboxedDouble: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movsd(result, FieldAddress(box, ValueOffset()));
+      __ movsd(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
     case kUnboxedFloat: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movsd(result, FieldAddress(box, ValueOffset()));
+      __ movsd(result, compiler::FieldAddress(box, ValueOffset()));
       __ cvtsd2ss(result, result);
       break;
     }
@@ -3961,7 +3991,7 @@
     case kUnboxedFloat64x2:
     case kUnboxedInt32x4: {
       const FpuRegister result = locs()->out(0).fpu_reg();
-      __ movups(result, FieldAddress(box, ValueOffset()));
+      __ movups(result, compiler::FieldAddress(box, ValueOffset()));
       break;
     }
 
@@ -3999,10 +4029,10 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(value == result);
-  Label done;
+  compiler::Label done;
   __ SmiUntag(value);
-  __ j(NOT_CARRY, &done, Assembler::kNearJump);
-  __ movsxw(result, Address(value, TIMES_2, Mint::value_offset()));
+  __ j(NOT_CARRY, &done, compiler::Assembler::kNearJump);
+  __ movsxw(result, compiler::Address(value, TIMES_2, Mint::value_offset()));
   __ Bind(&done);
 }
 
@@ -4010,10 +4040,10 @@
   const Register value = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   ASSERT(value == result);
-  Label done;
+  compiler::Label done;
   __ SmiUntag(value);
-  __ j(NOT_CARRY, &done, Assembler::kNearJump);
-  __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+  __ j(NOT_CARRY, &done, compiler::Assembler::kNearJump);
+  __ movq(value, compiler::Address(value, TIMES_2, Mint::value_offset()));
   __ Bind(&done);
 }
 
@@ -4034,33 +4064,34 @@
 void UnboxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const intptr_t value_cid = value()->Type()->ToCid();
   const Register value = locs()->in(0).reg();
-  Label* deopt = CanDeoptimize() ? compiler->AddDeoptStub(
-                                       GetDeoptId(), ICData::kDeoptUnboxInteger)
-                                 : NULL;
+  compiler::Label* deopt =
+      CanDeoptimize()
+          ? compiler->AddDeoptStub(GetDeoptId(), ICData::kDeoptUnboxInteger)
+          : NULL;
   ASSERT(value == locs()->out(0).reg());
 
   if (value_cid == kSmiCid) {
     __ SmiUntag(value);
   } else if (value_cid == kMintCid) {
-    __ movq(value, FieldAddress(value, Mint::value_offset()));
+    __ movq(value, compiler::FieldAddress(value, Mint::value_offset()));
   } else if (!CanDeoptimize()) {
     // Type information is not conclusive, but range analysis found
     // the value to be in int64 range. Therefore it must be a smi
     // or mint value.
     ASSERT(is_truncating());
-    Label done;
+    compiler::Label done;
     __ SmiUntag(value);
-    __ j(NOT_CARRY, &done, Assembler::kNearJump);
-    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+    __ j(NOT_CARRY, &done, compiler::Assembler::kNearJump);
+    __ movq(value, compiler::Address(value, TIMES_2, Mint::value_offset()));
     __ Bind(&done);
     return;
   } else {
-    Label done;
+    compiler::Label done;
     // Optimistically untag value.
     __ SmiUntagOrCheckClass(value, kMintCid, &done);
     __ j(NOT_EQUAL, deopt);
     // Undo untagging by multiplying value with 2.
-    __ movq(value, Address(value, TIMES_2, Mint::value_offset()));
+    __ movq(value, compiler::Address(value, TIMES_2, Mint::value_offset()));
     __ Bind(&done);
   }
 
@@ -4126,11 +4157,11 @@
   __ SmiTag(out);
   if (!ValueFitsSmi()) {
     const Register temp = locs()->temp(0).reg();
-    Label done;
+    compiler::Label done;
     __ j(NO_OVERFLOW, &done);
     BoxAllocationSlowPath::Allocate(compiler, this, compiler->mint_class(), out,
                                     temp);
-    __ movq(FieldAddress(out, Mint::value_offset()), value);
+    __ movq(compiler::FieldAddress(out, Mint::value_offset()), value);
     __ Bind(&done);
   }
 }
@@ -4192,20 +4223,20 @@
   const XmmRegister value = locs()->in(0).fpu_reg();
   const bool is_negated = kind() != Token::kEQ;
   if (op_kind() == MethodRecognizer::kDouble_getIsNaN) {
-    Label is_nan;
+    compiler::Label is_nan;
     __ comisd(value, value);
     return is_negated ? PARITY_ODD : PARITY_EVEN;
   } else {
     ASSERT(op_kind() == MethodRecognizer::kDouble_getIsInfinite);
     const Register temp = locs()->temp(0).reg();
-    __ AddImmediate(RSP, Immediate(-kDoubleSize));
-    __ movsd(Address(RSP, 0), value);
-    __ movq(temp, Address(RSP, 0));
-    __ AddImmediate(RSP, Immediate(kDoubleSize));
+    __ AddImmediate(RSP, compiler::Immediate(-kDoubleSize));
+    __ movsd(compiler::Address(RSP, 0), value);
+    __ movq(temp, compiler::Address(RSP, 0));
+    __ AddImmediate(RSP, compiler::Immediate(kDoubleSize));
     // Mask off the sign.
-    __ AndImmediate(temp, Immediate(0x7FFFFFFFFFFFFFFFLL));
+    __ AndImmediate(temp, compiler::Immediate(0x7FFFFFFFFFFFFFFFLL));
     // Compare with +infinity.
-    __ CompareImmediate(temp, Immediate(0x7FF0000000000000LL));
+    __ CompareImmediate(temp, compiler::Immediate(0x7FF0000000000000LL));
     return is_negated ? NOT_EQUAL : EQUAL;
   }
 }
@@ -4250,21 +4281,21 @@
 #undef EMIT
     case SimdOpInstr::kFloat32x4Scale:
       __ cvtsd2ss(left, left);
-      __ shufps(left, left, Immediate(0x00));
+      __ shufps(left, left, compiler::Immediate(0x00));
       __ mulps(left, right);
       break;
     case SimdOpInstr::kFloat32x4ShuffleMix:
     case SimdOpInstr::kInt32x4ShuffleMix:
-      __ shufps(left, right, Immediate(instr->mask()));
+      __ shufps(left, right, compiler::Immediate(instr->mask()));
       break;
     case SimdOpInstr::kFloat64x2Constructor:
       // shufpd mask 0x0 results in:
       // Lower 64-bits of left = Lower 64-bits of left.
       // Upper 64-bits of left = Lower 64-bits of right.
-      __ shufpd(left, right, Immediate(0x0));
+      __ shufpd(left, right, compiler::Immediate(0x0));
       break;
     case SimdOpInstr::kFloat64x2Scale:
-      __ shufpd(right, right, Immediate(0x00));
+      __ shufpd(right, right, compiler::Immediate(0x00));
       __ mulpd(left, right);
       break;
     case SimdOpInstr::kFloat64x2WithX:
@@ -4275,11 +4306,11 @@
       const intptr_t lane_index = instr->kind() - SimdOpInstr::kFloat64x2WithX;
       ASSERT(0 <= lane_index && lane_index < 2);
 
-      __ SubImmediate(RSP, Immediate(kSimd128Size));
-      __ movups(Address(RSP, 0), left);
-      __ movsd(Address(RSP, lane_index * kDoubleSize), right);
-      __ movups(left, Address(RSP, 0));
-      __ AddImmediate(RSP, Immediate(kSimd128Size));
+      __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
+      __ movups(compiler::Address(RSP, 0), left);
+      __ movsd(compiler::Address(RSP, lane_index * kDoubleSize), right);
+      __ movups(left, compiler::Address(RSP, 0));
+      __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
       break;
     }
     case SimdOpInstr::kFloat32x4WithX:
@@ -4296,11 +4327,11 @@
       const intptr_t lane_index = instr->kind() - SimdOpInstr::kFloat32x4WithX;
       ASSERT(0 <= lane_index && lane_index < 4);
       __ cvtsd2ss(left, left);
-      __ SubImmediate(RSP, Immediate(kSimd128Size));
-      __ movups(Address(RSP, 0), right);
-      __ movss(Address(RSP, lane_index * kFloatSize), left);
-      __ movups(left, Address(RSP, 0));
-      __ AddImmediate(RSP, Immediate(kSimd128Size));
+      __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
+      __ movups(compiler::Address(RSP, 0), right);
+      __ movss(compiler::Address(RSP, lane_index * kFloatSize), left);
+      __ movups(left, compiler::Address(RSP, 0));
+      __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
       break;
     }
 
@@ -4331,26 +4362,26 @@
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleY:
-      __ shufps(value, value, Immediate(0x55));
+      __ shufps(value, value, compiler::Immediate(0x55));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleZ:
-      __ shufps(value, value, Immediate(0xAA));
+      __ shufps(value, value, compiler::Immediate(0xAA));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4ShuffleW:
-      __ shufps(value, value, Immediate(0xFF));
+      __ shufps(value, value, compiler::Immediate(0xFF));
       __ cvtss2sd(value, value);
       break;
     case SimdOpInstr::kFloat32x4Shuffle:
     case SimdOpInstr::kInt32x4Shuffle:
-      __ shufps(value, value, Immediate(instr->mask()));
+      __ shufps(value, value, compiler::Immediate(instr->mask()));
       break;
     case SimdOpInstr::kFloat32x4Splat:
       // Convert to Float32.
       __ cvtsd2ss(value, value);
       // Splat across all lanes.
-      __ shufps(value, value, Immediate(0x00));
+      __ shufps(value, value, compiler::Immediate(0x00));
       break;
     case SimdOpInstr::kFloat32x4ToFloat64x2:
       __ cvtps2pd(value, value);
@@ -4368,10 +4399,10 @@
       // NOP.
       break;
     case SimdOpInstr::kFloat64x2GetY:
-      __ shufpd(value, value, Immediate(0x33));
+      __ shufpd(value, value, compiler::Immediate(0x33));
       break;
     case SimdOpInstr::kFloat64x2Splat:
-      __ shufpd(value, value, Immediate(0x0));
+      __ shufpd(value, value, compiler::Immediate(0x0));
       break;
     default:
       UNREACHABLE();
@@ -4400,13 +4431,13 @@
   // TODO(dartbug.com/30949) avoid transfer through memory. SSE4.1 has
   // insertps, with SSE2 this instruction can be implemented through unpcklps.
   const XmmRegister out = v0;
-  __ SubImmediate(RSP, Immediate(kSimd128Size));
+  __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
     __ cvtsd2ss(out, instr->locs()->in(i).fpu_reg());
-    __ movss(Address(RSP, i * kFloatSize), out);
+    __ movss(compiler::Address(RSP, i * kFloatSize), out);
   }
-  __ movups(out, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(kSimd128Size));
+  __ movups(out, compiler::Address(RSP, 0));
+  __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Float32x4Zero, (XmmRegister value)) {
@@ -4429,12 +4460,12 @@
 DEFINE_EMIT(Int32x4Constructor,
             (XmmRegister result, Register, Register, Register, Register)) {
   // TODO(dartbug.com/30949) avoid transfer through memory.
-  __ SubImmediate(RSP, Immediate(kSimd128Size));
+  __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
-    __ movl(Address(RSP, i * kInt32Size), instr->locs()->in(i).reg());
+    __ movl(compiler::Address(RSP, i * kInt32Size), instr->locs()->in(i).reg());
   }
-  __ movups(result, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(kSimd128Size));
+  __ movups(result, compiler::Address(RSP, 0));
+  __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Int32x4BoolConstructor,
@@ -4445,17 +4476,17 @@
              Register,
              Temp<Register> temp)) {
   // TODO(dartbug.com/30949) avoid transfer through memory.
-  __ SubImmediate(RSP, Immediate(kSimd128Size));
+  __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
   for (intptr_t i = 0; i < 4; i++) {
-    Label done, load_false;
+    compiler::Label done, load_false;
     __ xorq(temp, temp);
     __ CompareObject(instr->locs()->in(i).reg(), Bool::True());
     __ setcc(EQUAL, ByteRegisterOf(temp));
     __ negl(temp);  // temp = input ? -1 : 0
-    __ movl(Address(RSP, kInt32Size * i), temp);
+    __ movl(compiler::Address(RSP, kInt32Size * i), temp);
   }
-  __ movups(result, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(kSimd128Size));
+  __ movups(result, compiler::Address(RSP, 0));
+  __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
 }
 
 static void EmitToBoolean(FlowGraphCompiler* compiler, Register out) {
@@ -4463,7 +4494,8 @@
   __ testl(out, out);
   __ setcc(ZERO, ByteRegisterOf(out));
   __ movzxb(out, out);
-  __ movq(out, Address(THR, out, TIMES_8, Thread::bool_true_offset()));
+  __ movq(out,
+          compiler::Address(THR, out, TIMES_8, Thread::bool_true_offset()));
 }
 
 DEFINE_EMIT(Int32x4GetFlagZorW,
@@ -4471,7 +4503,7 @@
   __ movhlps(temp, value);  // extract upper half.
   __ movq(out, temp);
   if (instr->kind() == SimdOpInstr::kInt32x4GetFlagW) {
-    __ shrq(out, Immediate(32));  // extract upper 32bits.
+    __ shrq(out, compiler::Immediate(32));  // extract upper 32bits.
   }
   EmitToBoolean(compiler, out);
 }
@@ -4479,7 +4511,7 @@
 DEFINE_EMIT(Int32x4GetFlagXorY, (Register out, XmmRegister value)) {
   __ movq(out, value);
   if (instr->kind() == SimdOpInstr::kInt32x4GetFlagY) {
-    __ shrq(out, Immediate(32));  // extract upper 32bits.
+    __ shrq(out, compiler::Immediate(32));  // extract upper 32bits.
   }
   EmitToBoolean(compiler, out);
 }
@@ -4494,8 +4526,8 @@
       SimdOpInstr::kInt32x4WithFlagW == (SimdOpInstr::kInt32x4WithFlagX + 3));
   const intptr_t lane_index = instr->kind() - SimdOpInstr::kInt32x4WithFlagX;
   ASSERT(0 <= lane_index && lane_index < 4);
-  __ SubImmediate(RSP, Immediate(kSimd128Size));
-  __ movups(Address(RSP, 0), mask);
+  __ SubImmediate(RSP, compiler::Immediate(kSimd128Size));
+  __ movups(compiler::Address(RSP, 0), mask);
 
   // temp = flag == true ? -1 : 0
   __ xorq(temp, temp);
@@ -4503,9 +4535,9 @@
   __ setcc(EQUAL, ByteRegisterOf(temp));
   __ negl(temp);
 
-  __ movl(Address(RSP, lane_index * kInt32Size), temp);
-  __ movups(mask, Address(RSP, 0));
-  __ AddImmediate(RSP, Immediate(kSimd128Size));
+  __ movl(compiler::Address(RSP, lane_index * kInt32Size), temp);
+  __ movups(mask, compiler::Address(RSP, 0));
+  __ AddImmediate(RSP, compiler::Immediate(kSimd128Size));
 }
 
 DEFINE_EMIT(Int32x4Select,
@@ -4690,7 +4722,8 @@
   ASSERT(value == locs()->out(0).reg());
   switch (op_kind()) {
     case Token::kNEGATE: {
-      Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
+      compiler::Label* deopt =
+          compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnaryOp);
       __ negq(value);
       __ j(OVERFLOW, deopt);
       break;
@@ -4698,7 +4731,7 @@
     case Token::kBIT_NOT:
       __ notq(value);
       // Remove inverted smi-tag.
-      __ AndImmediate(value, Immediate(~kSmiTagMask));
+      __ AndImmediate(value, compiler::Immediate(~kSmiTagMask));
       break;
     default:
       UNREACHABLE();
@@ -4753,29 +4786,29 @@
          (op_kind() == MethodRecognizer::kMathMax));
   const intptr_t is_min = (op_kind() == MethodRecognizer::kMathMin);
   if (result_cid() == kDoubleCid) {
-    Label done, returns_nan, are_equal;
+    compiler::Label done, returns_nan, are_equal;
     XmmRegister left = locs()->in(0).fpu_reg();
     XmmRegister right = locs()->in(1).fpu_reg();
     XmmRegister result = locs()->out(0).fpu_reg();
     Register temp = locs()->temp(0).reg();
     __ comisd(left, right);
-    __ j(PARITY_EVEN, &returns_nan, Assembler::kNearJump);
-    __ j(EQUAL, &are_equal, Assembler::kNearJump);
+    __ j(PARITY_EVEN, &returns_nan, compiler::Assembler::kNearJump);
+    __ j(EQUAL, &are_equal, compiler::Assembler::kNearJump);
     const Condition double_condition =
         is_min ? TokenKindToDoubleCondition(Token::kLT)
                : TokenKindToDoubleCondition(Token::kGT);
     ASSERT(left == result);
-    __ j(double_condition, &done, Assembler::kNearJump);
+    __ j(double_condition, &done, compiler::Assembler::kNearJump);
     __ movsd(result, right);
-    __ jmp(&done, Assembler::kNearJump);
+    __ jmp(&done, compiler::Assembler::kNearJump);
 
     __ Bind(&returns_nan);
-    __ movq(temp, Address(THR, Thread::double_nan_address_offset()));
-    __ movsd(result, Address(temp, 0));
-    __ jmp(&done, Assembler::kNearJump);
+    __ movq(temp, compiler::Address(THR, Thread::double_nan_address_offset()));
+    __ movsd(result, compiler::Address(temp, 0));
+    __ jmp(&done, compiler::Assembler::kNearJump);
 
     __ Bind(&are_equal);
-    Label left_is_negative;
+    compiler::Label left_is_negative;
     // Check for negative zero: -0.0 is equal 0.0 but min or max must return
     // -0.0 or 0.0 respectively.
     // Check for negative left value (get the sign bit):
@@ -4783,13 +4816,15 @@
     // - max -> left is negative ? right : left
     // Check the sign bit.
     __ movmskpd(temp, left);
-    __ testq(temp, Immediate(1));
+    __ testq(temp, compiler::Immediate(1));
     if (is_min) {
       ASSERT(left == result);
-      __ j(NOT_ZERO, &done, Assembler::kNearJump);  // Negative -> return left.
+      __ j(NOT_ZERO, &done,
+           compiler::Assembler::kNearJump);  // Negative -> return left.
     } else {
       ASSERT(left == result);
-      __ j(ZERO, &done, Assembler::kNearJump);  // Positive -> return left.
+      __ j(ZERO, &done,
+           compiler::Assembler::kNearJump);  // Positive -> return left.
     }
     __ movsd(result, right);
     __ Bind(&done);
@@ -4868,14 +4903,15 @@
   ASSERT(result == RAX);
   ASSERT(result != value_obj);
   ASSERT(result != temp);
-  __ movsd(value_double, FieldAddress(value_obj, Double::value_offset()));
+  __ movsd(value_double,
+           compiler::FieldAddress(value_obj, Double::value_offset()));
   __ cvttsd2siq(result, value_double);
   // Overflow is signalled with minint.
-  Label do_call, done;
+  compiler::Label do_call, done;
   // Check for overflow and that it fits into Smi.
   __ movq(temp, result);
-  __ shlq(temp, Immediate(1));
-  __ j(OVERFLOW, &do_call, Assembler::kNearJump);
+  __ shlq(temp, compiler::Immediate(1));
+  __ j(OVERFLOW, &do_call, compiler::Assembler::kNearJump);
   __ SmiTag(result);
   __ jmp(&done);
   __ Bind(&do_call);
@@ -4907,17 +4943,18 @@
 }
 
 void DoubleToSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptDoubleToSmi);
   Register result = locs()->out(0).reg();
   XmmRegister value = locs()->in(0).fpu_reg();
   Register temp = locs()->temp(0).reg();
 
   __ cvttsd2siq(result, value);
   // Overflow is signalled with minint.
-  Label do_call, done;
+  compiler::Label do_call, done;
   // Check for overflow and that it fits into Smi.
   __ movq(temp, result);
-  __ shlq(temp, Immediate(1));
+  __ shlq(temp, compiler::Immediate(1));
   __ j(OVERFLOW, deopt);
   __ SmiTag(result);
 }
@@ -4938,13 +4975,13 @@
   XmmRegister result = locs()->out(0).fpu_reg();
   switch (recognized_kind()) {
     case MethodRecognizer::kDoubleTruncate:
-      __ roundsd(result, value, Assembler::kRoundToZero);
+      __ roundsd(result, value, compiler::Assembler::kRoundToZero);
       break;
     case MethodRecognizer::kDoubleFloor:
-      __ roundsd(result, value, Assembler::kRoundDown);
+      __ roundsd(result, value, compiler::Assembler::kRoundDown);
       break;
     case MethodRecognizer::kDoubleCeil:
-      __ roundsd(result, value, Assembler::kRoundUp);
+      __ roundsd(result, value, compiler::Assembler::kRoundUp);
       break;
     default:
       UNREACHABLE();
@@ -5043,29 +5080,29 @@
 
   __ xorps(zero_temp, zero_temp);
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(1)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
 
-  Label check_base, skip_call;
+  compiler::Label check_base, skip_call;
   // exponent == 0.0 -> return 1.0;
   __ comisd(exp, zero_temp);
-  __ j(PARITY_EVEN, &check_base, Assembler::kNearJump);
+  __ j(PARITY_EVEN, &check_base, compiler::Assembler::kNearJump);
   __ j(EQUAL, &skip_call);  // 'result' is 1.0.
 
   // exponent == 1.0 ?
   __ comisd(exp, result);
-  Label return_base;
-  __ j(EQUAL, &return_base, Assembler::kNearJump);
+  compiler::Label return_base;
+  __ j(EQUAL, &return_base, compiler::Assembler::kNearJump);
 
   // exponent == 2.0 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(2.0)));
-  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, XMM0);
-  Label return_base_times_2;
-  __ j(EQUAL, &return_base_times_2, Assembler::kNearJump);
+  compiler::Label return_base_times_2;
+  __ j(EQUAL, &return_base_times_2, compiler::Assembler::kNearJump);
 
   // exponent == 3.0 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(3.0)));
-  __ movsd(XMM0, FieldAddress(temp, Double::value_offset()));
+  __ movsd(XMM0, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, XMM0);
   __ j(NOT_EQUAL, &check_base);
 
@@ -5087,43 +5124,43 @@
   __ Bind(&check_base);
   // Note: 'exp' could be NaN.
 
-  Label return_nan;
+  compiler::Label return_nan;
   // base == 1.0 -> return 1.0;
   __ comisd(base, result);
-  __ j(PARITY_EVEN, &return_nan, Assembler::kNearJump);
-  __ j(EQUAL, &skip_call, Assembler::kNearJump);
+  __ j(PARITY_EVEN, &return_nan, compiler::Assembler::kNearJump);
+  __ j(EQUAL, &skip_call, compiler::Assembler::kNearJump);
   // Note: 'base' could be NaN.
   __ comisd(exp, base);
   // Neither 'exp' nor 'base' is NaN.
-  Label try_sqrt;
-  __ j(PARITY_ODD, &try_sqrt, Assembler::kNearJump);
+  compiler::Label try_sqrt;
+  __ j(PARITY_ODD, &try_sqrt, compiler::Assembler::kNearJump);
   // Return NaN.
   __ Bind(&return_nan);
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(NAN)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   __ jmp(&skip_call);
 
-  Label do_pow, return_zero;
+  compiler::Label do_pow, return_zero;
   __ Bind(&try_sqrt);
   // Before calling pow, check if we could use sqrt instead of pow.
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(kNegInfinity)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   // base == -Infinity -> call pow;
   __ comisd(base, result);
-  __ j(EQUAL, &do_pow, Assembler::kNearJump);
+  __ j(EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
   // exponent == 0.5 ?
   __ LoadObject(temp, Double::ZoneHandle(Double::NewCanonical(0.5)));
-  __ movsd(result, FieldAddress(temp, Double::value_offset()));
+  __ movsd(result, compiler::FieldAddress(temp, Double::value_offset()));
   __ comisd(exp, result);
-  __ j(NOT_EQUAL, &do_pow, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &do_pow, compiler::Assembler::kNearJump);
 
   // base == 0 -> return 0;
   __ comisd(base, zero_temp);
-  __ j(EQUAL, &return_zero, Assembler::kNearJump);
+  __ j(EQUAL, &return_zero, compiler::Assembler::kNearJump);
 
   __ sqrtsd(result, base);
-  __ jmp(&skip_call, Assembler::kNearJump);
+  __ jmp(&skip_call, compiler::Assembler::kNearJump);
 
   __ Bind(&return_zero);
   __ movsd(result, zero_temp);
@@ -5227,14 +5264,15 @@
 
 void TruncDivModInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   ASSERT(CanDeoptimize());
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinarySmiOp);
   Register left = locs()->in(0).reg();
   Register right = locs()->in(1).reg();
   ASSERT(locs()->out(0).IsPairLocation());
   PairLocation* pair = locs()->out(0).AsPairLocation();
   Register result1 = pair->At(0).reg();
   Register result2 = pair->At(1).reg();
-  Label not_32bit, done;
+  compiler::Label not_32bit, done;
   Register temp = RDX;
   ASSERT(left == RAX);
   ASSERT((right != RDX) && (right != RAX));
@@ -5274,7 +5312,7 @@
   __ idivq(right);  //  RAX: quotient, RDX: remainder.
   // Check the corner case of dividing the 'MIN_SMI' with -1, in which
   // case we cannot tag the result.
-  __ CompareImmediate(RAX, Immediate(0x4000000000000000));
+  __ CompareImmediate(RAX, compiler::Immediate(0x4000000000000000));
   __ j(EQUAL, deopt);
   __ Bind(&done);
 
@@ -5287,16 +5325,16 @@
   //      res = res + right;
   //    }
   //  }
-  Label all_done;
-  __ cmpq(RDX, Immediate(0));
-  __ j(GREATER_EQUAL, &all_done, Assembler::kNearJump);
+  compiler::Label all_done;
+  __ cmpq(RDX, compiler::Immediate(0));
+  __ j(GREATER_EQUAL, &all_done, compiler::Assembler::kNearJump);
   // Result is negative, adjust it.
   if ((divisor_range() == NULL) || divisor_range()->Overlaps(-1, 1)) {
-    Label subtract;
-    __ cmpq(right, Immediate(0));
-    __ j(LESS, &subtract, Assembler::kNearJump);
+    compiler::Label subtract;
+    __ cmpq(right, compiler::Immediate(0));
+    __ j(LESS, &subtract, compiler::Assembler::kNearJump);
     __ addq(RDX, right);
-    __ jmp(&all_done, Assembler::kNearJump);
+    __ jmp(&all_done, compiler::Assembler::kNearJump);
     __ Bind(&subtract);
     __ subq(RDX, right);
   } else if (divisor_range()->IsPositive()) {
@@ -5348,7 +5386,8 @@
   return summary;
 }
 
-void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler, Label* deopt) {
+void CheckClassInstr::EmitNullCheck(FlowGraphCompiler* compiler,
+                                    compiler::Label* deopt) {
   __ CompareObject(locs()->in(0).reg(), Object::null_object());
   Condition cond = IsDeoptIfNull() ? EQUAL : NOT_EQUAL;
   __ j(cond, deopt);
@@ -5358,14 +5397,14 @@
                                   intptr_t min,
                                   intptr_t max,
                                   intptr_t mask,
-                                  Label* deopt) {
+                                  compiler::Label* deopt) {
   Register biased_cid = locs()->temp(0).reg();
-  __ subq(biased_cid, Immediate(min));
-  __ cmpq(biased_cid, Immediate(max - min));
+  __ subq(biased_cid, compiler::Immediate(min));
+  __ cmpq(biased_cid, compiler::Immediate(max - min));
   __ j(ABOVE, deopt);
 
   Register mask_reg = locs()->temp(1).reg();
-  __ movq(mask_reg, Immediate(mask));
+  __ movq(mask_reg, compiler::Immediate(mask));
   __ btq(mask_reg, biased_cid);
   __ j(NOT_CARRY, deopt);
 }
@@ -5375,21 +5414,21 @@
                                   intptr_t cid_start,
                                   intptr_t cid_end,
                                   bool is_last,
-                                  Label* is_ok,
-                                  Label* deopt,
+                                  compiler::Label* is_ok,
+                                  compiler::Label* deopt,
                                   bool use_near_jump) {
   Register biased_cid = locs()->temp(0).reg();
   Condition no_match, match;
   if (cid_start == cid_end) {
-    __ cmpl(biased_cid, Immediate(cid_start - bias));
+    __ cmpl(biased_cid, compiler::Immediate(cid_start - bias));
     no_match = NOT_EQUAL;
     match = EQUAL;
   } else {
     // For class ID ranges use a subtract followed by an unsigned
     // comparison to check both ends of the ranges with one comparison.
-    __ addl(biased_cid, Immediate(bias - cid_start));
+    __ addl(biased_cid, compiler::Immediate(bias - cid_start));
     bias = cid_start;
-    __ cmpl(biased_cid, Immediate(cid_end - cid_start));
+    __ cmpl(biased_cid, compiler::Immediate(cid_end - cid_start));
     no_match = ABOVE;
     match = BELOW_EQUAL;
   }
@@ -5398,7 +5437,7 @@
     __ j(no_match, deopt);
   } else {
     if (use_near_jump) {
-      __ j(match, is_ok, Assembler::kNearJump);
+      __ j(match, is_ok, compiler::Assembler::kNearJump);
     } else {
       __ j(match, is_ok);
     }
@@ -5418,8 +5457,8 @@
 
 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckSmi,
-                                        licm_hoisted_ ? ICData::kHoisted : 0);
+  compiler::Label* deopt = compiler->AddDeoptStub(
+      deopt_id(), ICData::kDeoptCheckSmi, licm_hoisted_ ? ICData::kHoisted : 0);
   __ BranchIfNotSmi(value, deopt);
 }
 
@@ -5453,13 +5492,16 @@
 
 void CheckClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register value = locs()->in(0).reg();
-  Label* deopt = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
+  compiler::Label* deopt =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckClass);
   if (cids_.IsSingleCid()) {
-    __ CompareImmediate(value, Immediate(Smi::RawValue(cids_.cid_start)));
+    __ CompareImmediate(value,
+                        compiler::Immediate(Smi::RawValue(cids_.cid_start)));
     __ j(NOT_ZERO, deopt);
   } else {
-    __ AddImmediate(value, Immediate(-Smi::RawValue(cids_.cid_start)));
-    __ cmpq(value, Immediate(Smi::RawValue(cids_.Extent())));
+    __ AddImmediate(value,
+                    compiler::Immediate(-Smi::RawValue(cids_.cid_start)));
+    __ cmpq(value, compiler::Immediate(Smi::RawValue(cids_.Extent())));
     __ j(ABOVE, deopt);
   }
 }
@@ -5472,8 +5514,9 @@
 }
 
 void CheckConditionInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  Label if_true;
-  Label* if_false = compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnknown);
+  compiler::Label if_true;
+  compiler::Label* if_false =
+      compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnknown);
   BranchLabels labels = {&if_true, if_false, &if_true};
   Condition true_condition = comparison()->EmitComparisonCode(compiler, labels);
   if (true_condition != INVALID_CONDITION) {
@@ -5496,7 +5539,7 @@
 void CheckArrayBoundInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   uint32_t flags = generalized_ ? ICData::kGeneralized : 0;
   flags |= licm_hoisted_ ? ICData::kHoisted : 0;
-  Label* deopt =
+  compiler::Label* deopt =
       compiler->AddDeoptStub(deopt_id(), ICData::kDeoptCheckArrayBound, flags);
 
   Location length_loc = locs()->in(kLengthPos);
@@ -5516,8 +5559,8 @@
   if (index_loc.IsConstant()) {
     Register length = length_loc.reg();
     const Smi& index = Smi::Cast(index_loc.constant());
-    __ CompareImmediate(length,
-                        Immediate(reinterpret_cast<int64_t>(index.raw())));
+    __ CompareImmediate(
+        length, compiler::Immediate(reinterpret_cast<int64_t>(index.raw())));
     __ j(BELOW_EQUAL, deopt);
   } else if (length_loc.IsConstant()) {
     const Smi& length = Smi::Cast(length_loc.constant());
@@ -5529,8 +5572,8 @@
       __ testq(index, index);
       __ j(NEGATIVE, deopt);
     } else {
-      __ CompareImmediate(index,
-                          Immediate(reinterpret_cast<int64_t>(length.raw())));
+      __ CompareImmediate(
+          index, compiler::Immediate(reinterpret_cast<int64_t>(length.raw())));
       __ j(ABOVE_EQUAL, deopt);
     }
   } else {
@@ -5568,7 +5611,7 @@
       ThrowErrorSlowPathCode::EmitNativeCode(compiler);
     } else {
       __ Bind(entry_label());  // not used, but keeps destructor happy
-      if (Assembler::EmittingComments()) {
+      if (compiler::Assembler::EmittingComments()) {
         __ Comment("slow path %s operation (no throw)", name());
       }
     }
@@ -5592,9 +5635,9 @@
       __ Bind(adjust_sign_label());
       if (RangeUtils::Overlaps(divisor_range_, -1, 1)) {
         // General case.
-        Label subtract;
+        compiler::Label subtract;
         __ testq(divisor_, divisor_);
-        __ j(LESS, &subtract, Assembler::kNearJump);
+        __ j(LESS, &subtract, compiler::Assembler::kNearJump);
         __ addq(RDX, divisor_);
         __ jmp(exit_label());
         __ Bind(&subtract);
@@ -5625,12 +5668,12 @@
            has_adjust_sign();
   }
 
-  Label* div_by_minus_one_label() {
+  compiler::Label* div_by_minus_one_label() {
     ASSERT(has_divide_by_minus_one());
     return &div_by_minus_one_label_;
   }
 
-  Label* adjust_sign_label() {
+  compiler::Label* adjust_sign_label() {
     ASSERT(has_adjust_sign());
     return &adjust_sign_label_;
   }
@@ -5639,8 +5682,8 @@
   bool is_mod_;
   Register divisor_;
   Range* divisor_range_;
-  Label div_by_minus_one_label_;
-  Label adjust_sign_label_;
+  compiler::Label div_by_minus_one_label_;
+  compiler::Label adjust_sign_label_;
 };
 
 static void EmitInt64ModTruncDiv(FlowGraphCompiler* compiler,
@@ -5666,7 +5709,7 @@
   // Handle modulo/division by minus one explicitly on slow path
   // (to avoid arithmetic exception on 0x8000000000000000 / -1).
   if (slow_path->has_divide_by_minus_one()) {
-    __ cmpq(right, Immediate(-1));
+    __ cmpq(right, compiler::Immediate(-1));
     __ j(EQUAL, slow_path->div_by_minus_one_label());
   }
 
@@ -5684,18 +5727,18 @@
   // dangerous division by -1 has been handled above already).
   ASSERT(left == RAX);
   ASSERT(right != RDX);  // available at this stage
-  Label div_64;
-  Label div_merge;
+  compiler::Label div_64;
+  compiler::Label div_merge;
   __ movsxd(RDX, left);
   __ cmpq(RDX, left);
-  __ j(NOT_EQUAL, &div_64, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &div_64, compiler::Assembler::kNearJump);
   __ movsxd(RDX, right);
   __ cmpq(RDX, right);
-  __ j(NOT_EQUAL, &div_64, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &div_64, compiler::Assembler::kNearJump);
   __ cdq();         // sign-ext eax into edx:eax
   __ idivl(right);  // quotient eax, remainder edx
   __ movsxd(out, out);
-  __ jmp(&div_merge, Assembler::kNearJump);
+  __ jmp(&div_merge, compiler::Assembler::kNearJump);
   __ Bind(&div_64);
   __ cqo();         // sign-ext rax into rdx:rax
   __ idivq(right);  // quotient rax, remainder rdx
@@ -5795,7 +5838,8 @@
     ConstantInstr* constant_instr = right.constant_instruction();
     const int64_t value =
         constant_instr->GetUnboxedSignedIntegerConstantValue();
-    EmitInt64Arithmetic(compiler, op_kind(), left.reg(), Immediate(value));
+    EmitInt64Arithmetic(compiler, op_kind(), left.reg(),
+                        compiler::Immediate(value));
   } else {
     ASSERT(out.reg() == left.reg());
     EmitInt64Arithmetic(compiler, op_kind(), left.reg(), right.reg());
@@ -5837,12 +5881,12 @@
   ASSERT(shift >= 0);
   switch (op_kind) {
     case Token::kSHR:
-      __ sarq(left,
-              Immediate(Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
+      __ sarq(left, compiler::Immediate(
+                        Utils::Minimum<int64_t>(shift, kBitsPerWord - 1)));
       break;
     case Token::kSHL: {
       ASSERT(shift < 64);
-      __ shlq(left, Immediate(shift));
+      __ shlq(left, compiler::Immediate(shift));
       break;
     }
     default:
@@ -5878,11 +5922,11 @@
   } else {
     switch (op_kind) {
       case Token::kSHR: {
-        __ shrl(left, Immediate(shift));
+        __ shrl(left, compiler::Immediate(shift));
         break;
       }
       case Token::kSHL: {
-        __ shll(left, Immediate(shift));
+        __ shll(left, compiler::Immediate(shift));
         break;
       }
       default:
@@ -5924,13 +5968,13 @@
     const Register out = instruction()->locs()->out(0).reg();
     ASSERT(out == instruction()->locs()->in(0).reg());
 
-    Label throw_error;
+    compiler::Label throw_error;
     __ testq(RCX, RCX);
     __ j(LESS, &throw_error);
 
     switch (instruction()->AsShiftInt64Op()->op_kind()) {
       case Token::kSHR:
-        __ sarq(out, Immediate(kBitsPerInt64 - 1));
+        __ sarq(out, compiler::Immediate(kBitsPerInt64 - 1));
         break;
       case Token::kSHL:
         __ xorq(out, out);
@@ -5947,7 +5991,8 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+    __ movq(compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()),
+            RCX);
   }
 };
 
@@ -5985,7 +6030,7 @@
           new (Z) ShiftInt64OpSlowPath(this, compiler->CurrentTryIndex());
       compiler->AddSlowPathCode(slow_path);
 
-      __ cmpq(RCX, Immediate(kShiftCountLimit));
+      __ cmpq(RCX, compiler::Immediate(kShiftCountLimit));
       __ j(ABOVE, slow_path->entry_label());
     }
 
@@ -6026,10 +6071,10 @@
     // Deoptimize if shift count is > 63 or negative (or not a smi).
     if (!IsShiftCountInRange()) {
       ASSERT(CanDeoptimize());
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
-      __ cmpq(RCX, Immediate(kShiftCountLimit));
+      __ cmpq(RCX, compiler::Immediate(kShiftCountLimit));
       __ j(ABOVE, deopt);
     }
 
@@ -6053,7 +6098,7 @@
     const Register out = instruction()->locs()->out(0).reg();
     ASSERT(out == instruction()->locs()->in(0).reg());
 
-    Label throw_error;
+    compiler::Label throw_error;
     __ testq(RCX, RCX);
     __ j(LESS, &throw_error);
 
@@ -6067,7 +6112,8 @@
     // The unboxed int64 argument is passed through a dedicated slot in Thread.
     // TODO(dartbug.com/33549): Clean this up when unboxed values
     // could be passed as arguments.
-    __ movq(Address(THR, Thread::unboxed_int64_runtime_arg_offset()), RCX);
+    __ movq(compiler::Address(THR, Thread::unboxed_int64_runtime_arg_offset()),
+            RCX);
   }
 };
 
@@ -6104,7 +6150,7 @@
           new (Z) ShiftUint32OpSlowPath(this, compiler->CurrentTryIndex());
       compiler->AddSlowPathCode(slow_path);
 
-      __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+      __ cmpq(RCX, compiler::Immediate(kUint32ShiftCountLimit));
       __ j(ABOVE, slow_path->entry_label());
     }
 
@@ -6146,15 +6192,15 @@
       if (!IsShiftCountInRange()) {
         // Deoptimize if shift count is negative.
         ASSERT(CanDeoptimize());
-        Label* deopt =
+        compiler::Label* deopt =
             compiler->AddDeoptStub(deopt_id(), ICData::kDeoptBinaryInt64Op);
 
         __ testq(RCX, RCX);
         __ j(LESS, deopt);
       }
 
-      Label cont;
-      __ cmpq(RCX, Immediate(kUint32ShiftCountLimit));
+      compiler::Label cont;
+      __ cmpq(RCX, compiler::Immediate(kUint32ShiftCountLimit));
       __ j(LESS_EQUAL, &cont);
 
       __ xorl(left, left);
@@ -6166,22 +6212,6 @@
   }
 }
 
-CompileType BinaryUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType ShiftUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
-CompileType UnaryUint32OpInstr::ComputeType() const {
-  return CompileType::FromCid(kSmiCid);
-}
-
 LocationSummary* BinaryUint32OpInstr::MakeLocationSummary(Zone* zone,
                                                           bool opt) const {
   const intptr_t kNumInputs = 2;
@@ -6297,7 +6327,7 @@
     const Register out = locs()->out(0).reg();
     __ movsxd(out, value);
     if (CanDeoptimize()) {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
       __ testl(out, out);
       __ j(NEGATIVE, deopt);
@@ -6310,7 +6340,7 @@
       // Copy low.
       __ movl(out, value);
     } else {
-      Label* deopt =
+      compiler::Label* deopt =
           compiler->AddDeoptStub(deopt_id(), ICData::kDeoptUnboxInteger);
       // Sign extend.
       __ movsxd(out, value);
@@ -6457,7 +6487,7 @@
     const intptr_t kRIPRelativeLeaqSize = 7;
     const intptr_t entry_to_rip_offset = __ CodeSize() + kRIPRelativeLeaqSize;
     __ leaq(target_address_reg,
-            Address::AddressRIPRelative(-entry_to_rip_offset));
+            compiler::Address::AddressRIPRelative(-entry_to_rip_offset));
     ASSERT(__ CodeSize() == entry_to_rip_offset);
   }
 
@@ -6542,9 +6572,9 @@
 
   // Function in RAX.
   ASSERT(locs()->in(0).reg() == RAX);
-  __ movq(CODE_REG, FieldAddress(RAX, Function::code_offset()));
-  __ movq(RCX,
-          FieldAddress(RAX, Code::function_entry_point_offset(entry_kind())));
+  __ movq(CODE_REG, compiler::FieldAddress(RAX, Function::code_offset()));
+  __ movq(RCX, compiler::FieldAddress(
+                   RAX, Code::function_entry_point_offset(entry_kind())));
 
   // RAX: Function.
   // R10: Arguments descriptor array.
@@ -6566,10 +6596,10 @@
   Register value = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
 
-  Label done;
+  compiler::Label done;
   __ LoadObject(result, Bool::True());
   __ CompareRegisters(result, value);
-  __ j(NOT_EQUAL, &done, Assembler::kNearJump);
+  __ j(NOT_EQUAL, &done, compiler::Assembler::kNearJump);
   __ LoadObject(result, Bool::False());
   __ Bind(&done);
 }
diff --git a/runtime/vm/compiler/backend/inliner.cc b/runtime/vm/compiler/backend/inliner.cc
index a98ed66..0a0ba21 100644
--- a/runtime/vm/compiler/backend/inliner.cc
+++ b/runtime/vm/compiler/backend/inliner.cc
@@ -78,10 +78,6 @@
             500,
             "Max. number of inlined calls per depth");
 DEFINE_FLAG(bool, print_inlining_tree, false, "Print inlining tree");
-DEFINE_FLAG(bool,
-            enable_inlining_annotations,
-            false,
-            "Enable inlining annotations");
 
 DECLARE_FLAG(int, max_deoptimization_counter_threshold);
 DECLARE_FLAG(bool, print_flow_graph);
@@ -131,6 +127,16 @@
   return new ConstantInstr(parsed_function.DefaultParameterValueAt(i));
 }
 
+// Helper to get result type from call (or nullptr otherwise).
+static CompileType* ResultType(Definition* call) {
+  if (auto static_call = call->AsStaticCall()) {
+    return static_call->result_type();
+  } else if (auto instance_call = call->AsInstanceCall()) {
+    return instance_call->result_type();
+  }
+  return nullptr;
+}
+
 // Pair of an argument name and its value.
 struct NamedArgument {
   String* name;
@@ -513,14 +519,16 @@
       } else if (current->IsStaticCall()) {
         const Function& function = current->AsStaticCall()->function();
         const intptr_t inl_size = function.optimized_instruction_count();
+        const bool always_inline =
+            FlowGraphInliner::FunctionHasPreferInlinePragma(function);
         // Accept a static call is always inlined in some way and add the
         // cached size to the total instruction count. A reasonable guess
         // is made if the count has not been collected yet (listed methods
         // are never very large).
-        if (!function.always_inline() && !function.IsRecognized()) {
+        if (!always_inline && !function.IsRecognized()) {
           return false;
         }
-        if (!function.always_inline()) {
+        if (!always_inline) {
           static constexpr intptr_t kAvgListedMethodSize = 20;
           instruction_count +=
               (inl_size == 0 ? kAvgListedMethodSize : inl_size);
@@ -600,27 +608,6 @@
   const intptr_t caller_inlining_id_;
 };
 
-static bool HasAnnotation(const Function& function, const char* annotation) {
-  const Class& owner = Class::Handle(function.Owner());
-  const Library& library = Library::Handle(owner.library());
-
-  auto& metadata_or_error = Object::Handle(library.GetMetadata(function));
-  if (metadata_or_error.IsError()) {
-    Report::LongJump(Error::Cast(metadata_or_error));
-  }
-  const Array& metadata = Array::Cast(metadata_or_error);
-  if (metadata.Length() > 0) {
-    Object& val = Object::Handle();
-    for (intptr_t i = 0; i < metadata.Length(); i++) {
-      val = metadata.At(i);
-      if (val.IsString() && String::Cast(val).Equals(annotation)) {
-        return true;
-      }
-    }
-  }
-  return false;
-}
-
 static void ReplaceParameterStubs(Zone* zone,
                                   FlowGraph* caller_graph,
                                   InlinedCallData* call_data,
@@ -658,6 +645,11 @@
       }
       redefinition->InsertAfter(callee_entry);
       defn = redefinition;
+      // Since the redefinition does not dominate the callee entry, replace
+      // uses of the receiver argument in this entry with the redefined value.
+      callee_entry->ReplaceInEnvironment(
+          call_data->parameter_stubs->At(first_arg_stub_index + i),
+          actual->definition());
     } else if (actual != NULL) {
       defn = actual->definition();
     }
@@ -888,6 +880,11 @@
       return false;
     }
 
+    if (FlowGraphInliner::FunctionHasNeverInlinePragma(function)) {
+      TRACE_INLINING(THR_Print("     Bailout: vm:never-inline pragma\n"));
+      return false;
+    }
+
     // Don't inline any intrinsified functions in precompiled mode
     // to reduce code size and make sure we use the intrinsic code.
     if (FLAG_precompiled_mode && function.is_intrinsic() &&
@@ -926,13 +923,6 @@
       return false;
     }
 
-    const char* kNeverInlineAnnotation = "NeverInline";
-    if (FLAG_enable_inlining_annotations &&
-        HasAnnotation(function, kNeverInlineAnnotation)) {
-      TRACE_INLINING(THR_Print("     Bailout: NeverInline annotation\n"));
-      return false;
-    }
-
     // Apply early heuristics. For a specialized case
     // (constants_arg_counts > 0), don't use a previously
     // estimate of the call site and instruction counts.
@@ -2287,12 +2277,22 @@
          (function.name() == Symbols::Minus().raw());
 }
 
+bool FlowGraphInliner::FunctionHasPreferInlinePragma(const Function& function) {
+  Object& options = Object::Handle();
+  return Library::FindPragma(dart::Thread::Current(), /*only_core=*/false,
+                             function, Symbols::vm_prefer_inline(), &options);
+}
+
+bool FlowGraphInliner::FunctionHasNeverInlinePragma(const Function& function) {
+  Object& options = Object::Handle();
+  return Library::FindPragma(dart::Thread::Current(), /*only_core=*/false,
+                             function, Symbols::vm_never_inline(), &options);
+}
+
 bool FlowGraphInliner::AlwaysInline(const Function& function) {
-  const char* kAlwaysInlineAnnotation = "AlwaysInline";
-  if (FLAG_enable_inlining_annotations &&
-      HasAnnotation(function, kAlwaysInlineAnnotation)) {
+  if (FunctionHasPreferInlinePragma(function)) {
     TRACE_INLINING(
-        THR_Print("AlwaysInline annotation for %s\n", function.ToCString()));
+        THR_Print("vm:prefer-inline pragma for %s\n", function.ToCString()));
     return true;
   }
 
@@ -2319,7 +2319,7 @@
       return true;
     }
   }
-  return MethodRecognizer::AlwaysInline(function);
+  return false;
 }
 
 int FlowGraphInliner::Inline() {
@@ -2452,7 +2452,7 @@
 
 static bool InlineGetIndexed(FlowGraph* flow_graph,
                              MethodRecognizer::Kind kind,
-                             Instruction* call,
+                             Definition* call,
                              Definition* receiver,
                              GraphEntryInstr* graph_entry,
                              FunctionEntryInstr** entry,
@@ -2481,9 +2481,9 @@
 
   // Array load and return.
   intptr_t index_scale = compiler::target::Instance::ElementSizeFor(array_cid);
-  LoadIndexedInstr* load = new (Z)
-      LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index), index_scale,
-                       array_cid, kAlignedAccess, deopt_id, call->token_pos());
+  LoadIndexedInstr* load = new (Z) LoadIndexedInstr(
+      new (Z) Value(array), new (Z) Value(index), index_scale, array_cid,
+      kAlignedAccess, deopt_id, call->token_pos(), ResultType(call));
 
   *last = load;
   cursor = flow_graph->AppendTo(cursor, load,
@@ -2649,12 +2649,13 @@
   const bool value_needs_unboxing =
       array_cid == kTypedDataInt8ArrayCid ||
       array_cid == kTypedDataInt16ArrayCid ||
+      array_cid == kTypedDataInt32ArrayCid ||
       array_cid == kTypedDataUint8ArrayCid ||
       array_cid == kTypedDataUint8ClampedArrayCid ||
       array_cid == kTypedDataUint16ArrayCid ||
+      array_cid == kTypedDataUint32ArrayCid ||
       array_cid == kExternalTypedDataUint8ArrayCid ||
-      array_cid == kExternalTypedDataUint8ClampedArrayCid ||
-      array_cid == kTypedDataUint32ArrayCid;
+      array_cid == kExternalTypedDataUint8ClampedArrayCid;
 
   if (value_check != NULL) {
     // No store barrier needed because checked value is a smi, an unboxed mint,
@@ -2674,7 +2675,7 @@
   } else if (value_needs_unboxing) {
     Representation representation = kNoRepresentation;
     switch (array_cid) {
-      case kUnboxedInt32:
+      case kTypedDataInt32ArrayCid:
         representation = kUnboxedInt32;
         break;
       case kTypedDataUint32ArrayCid:
@@ -2920,19 +2921,8 @@
   }
 }
 
-static LoadIndexedInstr* NewLoad(FlowGraph* flow_graph,
-                                 Instruction* call,
-                                 Definition* array,
-                                 Definition* index,
-                                 intptr_t view_cid) {
-  return new (Z) LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index),
-                                  1,  // Index scale
-                                  view_cid, kUnalignedAccess, DeoptId::kNone,
-                                  call->token_pos());
-}
-
 static bool InlineByteArrayBaseLoad(FlowGraph* flow_graph,
-                                    Instruction* call,
+                                    Definition* call,
                                     Definition* receiver,
                                     intptr_t array_cid,
                                     intptr_t view_cid,
@@ -2978,15 +2968,16 @@
                                &cursor);
 
   // Fill out the generated template with loads.
-  {
-    // Load from either external or internal.
-    LoadIndexedInstr* load = NewLoad(flow_graph, call, array, index, view_cid);
-    flow_graph->AppendTo(
-        cursor, load,
-        call->deopt_id() != DeoptId::kNone ? call->env() : nullptr,
-        FlowGraph::kValue);
-    cursor = *last = load;
-  }
+  // Load from either external or internal.
+  LoadIndexedInstr* load =
+      new (Z) LoadIndexedInstr(new (Z) Value(array), new (Z) Value(index),
+                               1,  // Index scale
+                               view_cid, kUnalignedAccess, DeoptId::kNone,
+                               call->token_pos(), ResultType(call));
+  flow_graph->AppendTo(
+      cursor, load, call->deopt_id() != DeoptId::kNone ? call->env() : nullptr,
+      FlowGraph::kValue);
+  cursor = *last = load;
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
     *last = new (Z) FloatToDoubleInstr(new (Z) Value((*last)->AsDefinition()),
diff --git a/runtime/vm/compiler/backend/inliner.h b/runtime/vm/compiler/backend/inliner.h
index fecd8d7..5aa3c1a 100644
--- a/runtime/vm/compiler/backend/inliner.h
+++ b/runtime/vm/compiler/backend/inliner.h
@@ -115,6 +115,9 @@
 
   bool AlwaysInline(const Function& function);
 
+  static bool FunctionHasPreferInlinePragma(const Function& function);
+  static bool FunctionHasNeverInlinePragma(const Function& function);
+
   FlowGraph* flow_graph() const { return flow_graph_; }
   intptr_t NextInlineId(const Function& function,
                         TokenPosition tp,
diff --git a/runtime/vm/compiler/backend/inliner_test.cc b/runtime/vm/compiler/backend/inliner_test.cc
index 75609a4..f7dab8e 100644
--- a/runtime/vm/compiler/backend/inliner_test.cc
+++ b/runtime/vm/compiler/backend/inliner_test.cc
@@ -134,4 +134,64 @@
   EXPECT(current->AsRedefinition()->Type()->ToCid() == kDynamicCid);
 }
 
+ISOLATE_UNIT_TEST_CASE(Inliner_TypedData_Regress7551) {
+  const char* kScript = R"(
+    import 'dart:typed_data';
+
+    setValue(Int32List list, int value) {
+      list[0] = value;
+    }
+
+    main() {
+      final list = Int32List(10);
+      setValue(list, 0x1122334455);
+    }
+  )";
+
+  const auto& root_library = Library::Handle(LoadTestScript(kScript));
+  const auto& function =
+      Function::Handle(GetFunction(root_library, "setValue"));
+
+  Invoke(root_library, "main");
+
+  TestPipeline pipeline(function, CompilerPass::kJIT);
+  FlowGraph* flow_graph = pipeline.RunPasses({
+      CompilerPass::kComputeSSA,
+      CompilerPass::kApplyICData,
+      CompilerPass::kTryOptimizePatterns,
+      CompilerPass::kSetOuterInliningId,
+      CompilerPass::kTypePropagation,
+      CompilerPass::kApplyClassIds,
+      CompilerPass::kInlining,
+  });
+
+  auto entry = flow_graph->graph_entry()->normal_entry();
+
+  EXPECT(entry->initial_definitions()->length() == 2);
+  EXPECT(entry->initial_definitions()->At(0)->IsParameter());
+  EXPECT(entry->initial_definitions()->At(1)->IsParameter());
+  ParameterInstr* list_param =
+      entry->initial_definitions()->At(0)->AsParameter();
+  ParameterInstr* value_param =
+      entry->initial_definitions()->At(1)->AsParameter();
+
+  ILMatcher cursor(flow_graph, entry);
+
+  CheckArrayBoundInstr* bounds_check_instr = nullptr;
+  UnboxInt32Instr* unbox_instr = nullptr;
+  StoreIndexedInstr* store_instr = nullptr;
+
+  RELEASE_ASSERT(cursor.TryMatch({
+      {kMoveGlob},
+      {kMatchAndMoveCheckArrayBound, &bounds_check_instr},
+      {kMatchAndMoveUnboxInt32, &unbox_instr},
+      {kMatchAndMoveStoreIndexed, &store_instr},
+  }));
+
+  RELEASE_ASSERT(unbox_instr->InputAt(0)->definition() == 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());
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/linearscan.cc b/runtime/vm/compiler/backend/linearscan.cc
index b777be2..66101af 100644
--- a/runtime/vm/compiler/backend/linearscan.cc
+++ b/runtime/vm/compiler/backend/linearscan.cc
@@ -738,10 +738,14 @@
     ParameterInstr* param = defn->AsParameter();
     intptr_t slot_index = param->index();
     ASSERT(slot_index >= 0);
-    ASSERT((param->base_reg() == FPREG) || (param->base_reg() == SPREG));
     if (param->base_reg() == FPREG) {
       // Slot index for the rightmost fixed parameter is -1.
       slot_index -= flow_graph_.num_direct_parameters();
+    } else {
+      // Slot index for a "frameless" parameter is reversed.
+      ASSERT(param->base_reg() == SPREG);
+      ASSERT(slot_index < flow_graph_.num_direct_parameters());
+      slot_index = flow_graph_.num_direct_parameters() - 1 - slot_index;
     }
 
 #if defined(TARGET_ARCH_DBC)
@@ -1224,12 +1228,18 @@
     // If the value has no uses we don't need to allocate it.
     if (use == NULL) return;
 
-    if (use->pos() == (pos + 1)) {
-      ASSERT(use->location_slot()->IsUnallocated());
-      *(use->location_slot()) = *out;
-
-      // Remove first use. It was allocated.
-      range->set_first_use(range->first_use()->next());
+    // Connect fixed output to all inputs that immediately follow to avoid
+    // allocating an intermediary register.
+    for (; use != nullptr; use = use->next()) {
+      if (use->pos() == (pos + 1)) {
+        // Allocate and then drop this use.
+        ASSERT(use->location_slot()->IsUnallocated());
+        *(use->location_slot()) = *out;
+        range->set_first_use(use->next());
+      } else {
+        ASSERT(use->pos() > (pos + 1));  // sorted
+        break;
+      }
     }
 
     // Shorten live range to the point of definition, this might make the range
diff --git a/runtime/vm/compiler/backend/locations.cc b/runtime/vm/compiler/backend/locations.cc
index 34f8223..9593b66 100644
--- a/runtime/vm/compiler/backend/locations.cc
+++ b/runtime/vm/compiler/backend/locations.cc
@@ -96,50 +96,53 @@
 
 Location LocationRegisterOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafe(constant->value()))
+  return ((constant != NULL) && compiler::Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
              : Location::RequiresRegister();
 }
 
 Location LocationRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
+  return ((constant != NULL) &&
+          compiler::Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::RequiresRegister();
 }
 
 Location LocationWritableRegisterOrSmiConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
+  return ((constant != NULL) &&
+          compiler::Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::WritableRegister();
 }
 
 Location LocationFixedRegisterOrConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafe(constant->value()))
+  return ((constant != NULL) && compiler::Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
              : Location::RegisterLocation(reg);
 }
 
 Location LocationFixedRegisterOrSmiConstant(Value* value, Register reg) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafeSmi(constant->value()))
+  return ((constant != NULL) &&
+          compiler::Assembler::IsSafeSmi(constant->value()))
              ? Location::Constant(constant)
              : Location::RegisterLocation(reg);
 }
 
 Location LocationAnyOrConstant(Value* value) {
   ConstantInstr* constant = value->definition()->AsConstant();
-  return ((constant != NULL) && Assembler::IsSafe(constant->value()))
+  return ((constant != NULL) && compiler::Assembler::IsSafe(constant->value()))
              ? Location::Constant(constant)
              : Location::Any();
 }
 
 // DBC does not have an notion of 'address' in its instruction set.
 #if !defined(TARGET_ARCH_DBC)
-Address LocationToStackSlotAddress(Location loc) {
-  return Address(loc.base_reg(), loc.ToStackSlotOffset());
+compiler::Address LocationToStackSlotAddress(Location loc) {
+  return compiler::Address(loc.base_reg(), loc.ToStackSlotOffset());
 }
 #endif
 
diff --git a/runtime/vm/compiler/backend/locations.h b/runtime/vm/compiler/backend/locations.h
index 9147a6a..198e936 100644
--- a/runtime/vm/compiler/backend/locations.h
+++ b/runtime/vm/compiler/backend/locations.h
@@ -496,7 +496,7 @@
 // DBC does not have an notion of 'address' in its instruction set.
 #if !defined(TARGET_ARCH_DBC)
 // Return a memory operand for stack slot locations.
-Address LocationToStackSlotAddress(Location loc);
+compiler::Address LocationToStackSlotAddress(Location loc);
 #endif
 
 template <class Location>
diff --git a/runtime/vm/compiler/backend/range_analysis.cc b/runtime/vm/compiler/backend/range_analysis.cc
index 28f3b2d..f99ae1f 100644
--- a/runtime/vm/compiler/backend/range_analysis.cc
+++ b/runtime/vm/compiler/backend/range_analysis.cc
@@ -2442,6 +2442,10 @@
 
   ASSERT(!min.IsUnknown() && !max.IsUnknown());
 
+  // Sanity: avoid [l, u] with constants l > u.
+  ASSERT(!min.IsConstant() || !max.IsConstant() ||
+         min.ConstantValue() <= max.ConstantValue());
+
   *result = Range(min, max);
 }
 
diff --git a/runtime/vm/compiler/backend/range_analysis.h b/runtime/vm/compiler/backend/range_analysis.h
index e34d230..ef90ace 100644
--- a/runtime/vm/compiler/backend/range_analysis.h
+++ b/runtime/vm/compiler/backend/range_analysis.h
@@ -250,8 +250,10 @@
                            int64_t shift_count) {
     ASSERT(value_boundary.IsConstant());
     ASSERT(shift_count >= 0);
-    int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
-    int64_t result = value >> shift_count;
+    const int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
+    const int64_t result = (shift_count <= 63)
+                               ? (value >> shift_count)
+                               : (value >= 0 ? 0 : -1);  // Dart semantics
     return RangeBoundary(result);
   }
 
diff --git a/runtime/vm/compiler/backend/redundancy_elimination.cc b/runtime/vm/compiler/backend/redundancy_elimination.cc
index 1144be8..d8300e8 100644
--- a/runtime/vm/compiler/backend/redundancy_elimination.cc
+++ b/runtime/vm/compiler/backend/redundancy_elimination.cc
@@ -3128,15 +3128,7 @@
   // MaterializeObject instruction.
   // We must preserve the identity: all mentions are replaced by the same
   // materialization.
-  for (Environment::DeepIterator env_it(exit->env()); !env_it.Done();
-       env_it.Advance()) {
-    Value* use = env_it.CurrentValue();
-    if (use->definition() == alloc) {
-      use->RemoveFromUseList();
-      use->set_definition(mat);
-      mat->AddEnvUse(use);
-    }
-  }
+  exit->ReplaceInEnvironment(alloc, mat);
 
   // Mark MaterializeObject as an environment use of this allocation.
   // This will allow us to discover it when we are looking for deoptimization
diff --git a/runtime/vm/compiler/backend/sexpression.cc b/runtime/vm/compiler/backend/sexpression.cc
new file mode 100644
index 0000000..53077b7
--- /dev/null
+++ b/runtime/vm/compiler/backend/sexpression.cc
@@ -0,0 +1,658 @@
+// 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.
+
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
+#include "vm/compiler/backend/sexpression.h"
+
+#include <ctype.h>
+#include "platform/utils.h"
+#include "vm/double_conversion.h"
+
+namespace dart {
+
+SExpression* SExpression::FromCString(Zone* zone, const char* str) {
+  SExpParser parser(zone, str);
+  auto sexp = parser.Parse();
+  if (sexp == nullptr) parser.ReportError();
+  return sexp;
+}
+
+bool SExpBool::Equals(SExpression* sexp) const {
+  if (!sexp->IsBool()) return false;
+  return this->value() == sexp->AsBool()->value();
+}
+
+void SExpBool::SerializeToLine(TextBuffer* buffer) const {
+  buffer->AddString(value() ? SExpParser::kBoolTrueSymbol
+                            : SExpParser::kBoolFalseSymbol);
+}
+
+bool SExpDouble::Equals(SExpression* sexp) const {
+  if (!sexp->IsDouble()) return false;
+  return this->value() == sexp->AsDouble()->value();
+}
+
+void SExpDouble::SerializeToLine(TextBuffer* buffer) const {
+  // Use existing Dart serialization for Doubles.
+  const intptr_t kBufSize = 128;
+  char strbuf[kBufSize];
+  DoubleToCString(value(), strbuf, kBufSize);
+  buffer->Printf("%s", strbuf);
+}
+
+bool SExpInteger::Equals(SExpression* sexp) const {
+  if (!sexp->IsInteger()) return false;
+  return this->value() == sexp->AsInteger()->value();
+}
+
+void SExpInteger::SerializeToLine(TextBuffer* buffer) const {
+  buffer->Printf("%" Pd64 "", value());
+}
+
+bool SExpString::Equals(SExpression* sexp) const {
+  if (!sexp->IsString()) return false;
+  return strcmp(this->value(), sexp->AsString()->value()) == 0;
+}
+
+void SExpString::SerializeToLine(TextBuffer* buffer) const {
+  buffer->AddChar('"');
+  buffer->AddEscapedString(value());
+  buffer->AddChar('"');
+}
+
+bool SExpSymbol::Equals(SExpression* sexp) const {
+  if (!sexp->IsSymbol()) return false;
+  return strcmp(this->value(), sexp->AsSymbol()->value()) == 0;
+}
+
+void SExpSymbol::SerializeToLine(TextBuffer* buffer) const {
+  buffer->AddString(value());
+}
+
+void SExpList::Add(SExpression* sexp) {
+  contents_.Add(sexp);
+}
+
+void SExpList::AddExtra(const char* label, SExpression* value) {
+  ASSERT(!extra_info_.HasKey(label));
+  extra_info_.Insert({label, value});
+}
+
+bool SExpList::Equals(SExpression* sexp) const {
+  if (!sexp->IsList()) return false;
+  auto list = sexp->AsList();
+  if (Length() != list->Length()) return false;
+  if (ExtraLength() != list->ExtraLength()) return false;
+  for (intptr_t i = 0; i < Length(); i++) {
+    if (!At(i)->Equals(list->At(i))) return false;
+  }
+  auto this_it = ExtraIterator();
+  while (auto kv = this_it.Next()) {
+    if (!list->ExtraHasKey(kv->key)) return false;
+    if (!kv->value->Equals(list->ExtraLookupValue(kv->key))) return false;
+  }
+  return true;
+}
+
+const char* const SExpList::kElemIndent = " ";
+const char* const SExpList::kExtraIndent = "  ";
+
+static intptr_t HandleLineBreaking(Zone* zone,
+                                   TextBuffer* buffer,
+                                   SExpression* element,
+                                   TextBuffer* line_buffer,
+                                   const char* sub_indent,
+                                   intptr_t width,
+                                   bool leading_space,
+                                   intptr_t remaining) {
+  element->SerializeToLine(line_buffer);
+  const intptr_t single_line_width = line_buffer->length();
+  const intptr_t leading_length = leading_space ? 1 : 0;
+
+  if ((leading_length + single_line_width) < remaining) {
+    if (leading_space != 0) buffer->AddChar(' ');
+    buffer->AddString(line_buffer->buf());
+    line_buffer->Clear();
+    return remaining - (leading_length + single_line_width);
+  }
+  const intptr_t old_length = buffer->length();
+  buffer->Printf("\n%s", sub_indent);
+  const intptr_t line_used = buffer->length() - old_length + 1;
+  remaining = width - line_used;
+  if ((single_line_width < remaining) || element->IsAtom()) {
+    buffer->AddString(line_buffer->buf());
+    line_buffer->Clear();
+    return remaining - single_line_width;
+  }
+  line_buffer->Clear();
+  element->SerializeTo(zone, buffer, sub_indent, width);
+  return 0;
+}
+
+// Assumes that we are starting on a line after [indent] amount of space.
+void SExpList::SerializeTo(Zone* zone,
+                           TextBuffer* buffer,
+                           const char* indent,
+                           intptr_t width) const {
+  TextBuffer single_line(width);
+  const char* sub_indent = OS::SCreate(zone, "%s%s", indent, kElemIndent);
+
+  buffer->AddChar('(');
+  intptr_t remaining = width - strlen(indent) - 1;
+  for (intptr_t i = 0; i < contents_.length(); i++) {
+    remaining = HandleLineBreaking(zone, buffer, contents_.At(i), &single_line,
+                                   sub_indent, width, i != 0, remaining);
+  }
+
+  if (!extra_info_.IsEmpty()) {
+    SerializeExtraInfoToLine(&single_line);
+    if (single_line.length() < remaining - 1) {
+      buffer->Printf(" %s", single_line.buf());
+    } else {
+      const intptr_t old_length = buffer->length();
+      buffer->Printf("\n%s", sub_indent);
+      const intptr_t line_used = buffer->length() - old_length + 1;
+      remaining = width - line_used;
+      if (single_line.length() < remaining) {
+        buffer->AddString(single_line.buf());
+      } else {
+        SerializeExtraInfoTo(zone, buffer, sub_indent, width);
+      }
+    }
+  }
+  buffer->AddChar(')');
+}
+
+void SExpList::SerializeToLine(TextBuffer* buffer) const {
+  buffer->AddChar('(');
+  for (intptr_t i = 0; i < contents_.length(); i++) {
+    if (i != 0) buffer->AddChar(' ');
+    contents_.At(i)->SerializeToLine(buffer);
+  }
+  if (!extra_info_.IsEmpty()) {
+    buffer->AddChar(' ');
+    SerializeExtraInfoToLine(buffer);
+  }
+  buffer->AddChar(')');
+}
+
+void SExpList::SerializeExtraInfoTo(Zone* zone,
+                                    TextBuffer* buffer,
+                                    const char* indent,
+                                    int width) const {
+  const char* sub_indent = OS::SCreate(zone, "%s%s", indent, kExtraIndent);
+  TextBuffer single_line(width);
+
+  buffer->AddChar('{');
+  auto it = ExtraIterator();
+  while (auto kv = it.Next()) {
+    const intptr_t old_length = buffer->length();
+    buffer->Printf("\n%s%s", sub_indent, kv->key);
+    const intptr_t remaining = width - (buffer->length() - old_length + 1);
+    HandleLineBreaking(zone, buffer, kv->value, &single_line, sub_indent, width,
+                       /*leading_space=*/true, remaining);
+    buffer->AddChar(',');
+  }
+  buffer->Printf("\n%s}", indent);
+}
+
+void SExpList::SerializeExtraInfoToLine(TextBuffer* buffer) const {
+  buffer->AddString("{");
+  auto it = ExtraIterator();
+  while (auto kv = it.Next()) {
+    buffer->Printf(" %s ", kv->key);
+    kv->value->SerializeToLine(buffer);
+    buffer->AddChar(',');
+  }
+  buffer->AddString(" }");
+}
+
+const char* const SExpParser::kBoolTrueSymbol = "true";
+const char* const SExpParser::kBoolFalseSymbol = "false";
+char const SExpParser::kDoubleExponentChar =
+    DoubleToStringConstants::kExponentChar;
+const char* const SExpParser::kDoubleInfinitySymbol =
+    DoubleToStringConstants::kInfinitySymbol;
+const char* const SExpParser::kDoubleNaNSymbol =
+    DoubleToStringConstants::kNaNSymbol;
+
+const char* const SExpParser::ErrorStrings::kOpenString =
+    "unterminated quoted string starting at position %" Pd "";
+const char* const SExpParser::ErrorStrings::kBadUnicodeEscape =
+    "malformed Unicode escape";
+const char* const SExpParser::ErrorStrings::kOpenSExpList =
+    "unterminated S-expression list starting at position %" Pd "";
+const char* const SExpParser::ErrorStrings::kOpenMap =
+    "unterminated extra info map starting at position %" Pd "";
+const char* const SExpParser::ErrorStrings::kNestedMap =
+    "extra info map start when already within extra info map";
+const char* const SExpParser::ErrorStrings::kMapOutsideList =
+    "extra info map start not within S-expression list";
+const char* const SExpParser::ErrorStrings::kNonSymbolLabel =
+    "non-symbol in label position for extra info map";
+const char* const SExpParser::ErrorStrings::kNoMapLabel =
+    "no extra info map label provided";
+const char* const SExpParser::ErrorStrings::kRepeatedMapLabel =
+    "extra info map label %s provided more than once";
+const char* const SExpParser::ErrorStrings::kNoMapValue =
+    "no value provided for extra info map label %s";
+const char* const SExpParser::ErrorStrings::kExtraMapValue =
+    "extra value following label %s in extra info map";
+const char* const SExpParser::ErrorStrings::kUnexpectedComma =
+    "comma found outside extra info map";
+const char* const SExpParser::ErrorStrings::kUnexpectedRightParen =
+    "unexpected closing parenthesis";
+const char* const SExpParser::ErrorStrings::kUnexpectedRightCurly =
+    "unexpected closing curly brace";
+
+#define PARSE_ERROR(x, ...)                                                    \
+  StoreError(x, __VA_ARGS__);                                                  \
+  return nullptr
+
+SExpression* SExpParser::Parse() {
+  Reset();
+  while (auto token = GetNextToken()) {
+    const intptr_t start_pos = token->cstr() - buffer_;
+    switch (token->type()) {
+      case kLeftParen: {
+        if (in_extra_) {
+          if (cur_label_ == nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kNonSymbolLabel);
+          } else if (cur_value_ != nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kExtraMapValue, cur_label_);
+          }
+        }
+        auto sexp = new (zone_) SExpList(zone_, start_pos);
+        list_stack_.Add(sexp);
+        in_extra_stack_.Add(in_extra_);
+        extra_start_stack_.Add(extra_start_);
+        cur_label_stack_.Add(cur_label_);
+        in_extra_ = false;
+        extra_start_ = -1;
+        cur_label_ = nullptr;
+        break;
+      }
+      case kRightParen: {
+        if (list_stack_.is_empty()) {
+          PARSE_ERROR(start_pos, ErrorStrings::kUnexpectedRightParen);
+        }
+        if (in_extra_) {
+          PARSE_ERROR(start_pos, ErrorStrings::kOpenMap, extra_start_);
+        }
+        auto sexp = list_stack_.RemoveLast();
+        in_extra_ = in_extra_stack_.RemoveLast();
+        extra_start_ = extra_start_stack_.RemoveLast();
+        cur_label_ = cur_label_stack_.RemoveLast();
+        if (list_stack_.is_empty()) return sexp;
+        if (in_extra_) {
+          if (cur_label_ == nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kOpenMap, extra_start_);
+          }
+          cur_value_ = sexp;
+        } else {
+          list_stack_.Last()->Add(sexp);
+        }
+        break;
+      }
+      case kLeftCurly:
+        if (in_extra_) {
+          PARSE_ERROR(start_pos, ErrorStrings::kNestedMap);
+        }
+        if (list_stack_.is_empty()) {
+          PARSE_ERROR(start_pos, ErrorStrings::kMapOutsideList);
+        }
+        extra_start_ = start_pos;
+        in_extra_ = true;
+        break;
+      case kRightCurly:
+        if (!in_extra_ || list_stack_.is_empty()) {
+          PARSE_ERROR(start_pos, ErrorStrings::kUnexpectedRightCurly);
+        }
+        if (cur_label_ != nullptr) {
+          if (cur_value_ == nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kNoMapValue, cur_label_);
+          }
+          list_stack_.Last()->AddExtra(cur_label_, cur_value_);
+          cur_label_ = nullptr;
+          cur_value_ = nullptr;
+        }
+        in_extra_ = false;
+        extra_start_ = -1;
+        break;
+      case kComma: {
+        if (!in_extra_ || list_stack_.is_empty()) {
+          PARSE_ERROR(start_pos, ErrorStrings::kUnexpectedComma);
+        }
+        if (cur_label_ == nullptr) {
+          PARSE_ERROR(start_pos, ErrorStrings::kNoMapLabel);
+        } else if (cur_value_ == nullptr) {
+          PARSE_ERROR(start_pos, ErrorStrings::kNoMapValue, cur_label_);
+        }
+        list_stack_.Last()->AddExtra(cur_label_, cur_value_);
+        cur_label_ = nullptr;
+        cur_value_ = nullptr;
+        break;
+      }
+      case kSymbol: {
+        auto sexp = TokenToSExpression(token);
+        ASSERT(sexp->IsSymbol());
+        if (in_extra_) {
+          if (cur_value_ != nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kExtraMapValue, cur_label_);
+          }
+          if (cur_label_ == nullptr) {
+            const char* const label = sexp->AsSymbol()->value();
+            if (list_stack_.Last()->ExtraHasKey(label)) {
+              PARSE_ERROR(start_pos, ErrorStrings::kRepeatedMapLabel, label);
+            }
+            cur_label_ = sexp->AsSymbol()->value();
+          } else {
+            cur_value_ = sexp;
+          }
+        } else if (!list_stack_.is_empty()) {
+          list_stack_.Last()->Add(sexp);
+        } else {
+          return sexp;
+        }
+        break;
+      }
+      case kBoolean:
+      case kInteger:
+      case kDouble:
+      case kQuotedString: {
+        auto sexp = TokenToSExpression(token);
+        // TokenToSExpression has already set the error info, so just return.
+        if (sexp == nullptr) return nullptr;
+        if (in_extra_) {
+          if (cur_label_ == nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kNonSymbolLabel);
+          } else if (cur_value_ != nullptr) {
+            PARSE_ERROR(start_pos, ErrorStrings::kExtraMapValue, cur_label_);
+          }
+          cur_value_ = sexp;
+        } else if (!list_stack_.is_empty()) {
+          list_stack_.Last()->Add(sexp);
+        } else {
+          return sexp;
+        }
+        break;
+      }
+      default:
+        UNREACHABLE();
+    }
+  }
+  if (in_extra_) {
+    PARSE_ERROR(buffer_size_, ErrorStrings::kOpenMap, extra_start_);
+  } else if (!list_stack_.is_empty()) {
+    const intptr_t list_start = list_stack_.Last()->start();
+    PARSE_ERROR(buffer_size_, ErrorStrings::kOpenSExpList, list_start);
+  }
+  UNREACHABLE();
+}
+
+SExpression* SExpParser::TokenToSExpression(Token* token) {
+  const intptr_t start_pos = token->cstr() - buffer_;
+  switch (token->type()) {
+    case kSymbol:
+      return new (zone_) SExpSymbol(token->ToCString(zone_), start_pos);
+    case kInteger: {
+      const char* cstr = token->ToCString(zone_);
+      int64_t val;
+      if (!OS::StringToInt64(cstr, &val)) return nullptr;
+      return new (zone_) SExpInteger(val, start_pos);
+    }
+    case kBoolean: {
+      const bool is_true =
+          strncmp(token->cstr(), kBoolTrueSymbol, token->length()) == 0;
+      ASSERT(is_true ||
+             strncmp(token->cstr(), kBoolFalseSymbol, token->length()) == 0);
+      return new (zone_) SExpBool(is_true, start_pos);
+    }
+    case kDouble: {
+      double val;
+      if (!CStringToDouble(token->cstr(), token->length(), &val)) {
+        return nullptr;
+      }
+      return new (zone_) SExpDouble(val, start_pos);
+    }
+    case kQuotedString: {
+      const char* const cstr = token->cstr();
+      char* const buf = zone_->Alloc<char>(token->length());
+      // Skip the initial quote
+      ASSERT(cstr[0] == '"');
+      intptr_t old_pos = 1;
+      intptr_t new_pos = 0;
+      // The string _should_ end in a quote.
+      while (old_pos < token->length() - 1) {
+        if (cstr[old_pos] == '"') break;
+        if (cstr[old_pos] != '\\') {
+          buf[new_pos++] = cstr[old_pos++];
+          continue;
+        }
+        old_pos++;
+        if (old_pos >= token->length()) {
+          PARSE_ERROR(start_pos + old_pos, ErrorStrings::kOpenString,
+                      start_pos);
+        }
+        const intptr_t escape_pos = start_pos + old_pos - 1;
+        switch (cstr[old_pos]) {
+          case 'b':
+            buf[new_pos] = '\b';
+            break;
+          case 'f':
+            buf[new_pos] = '\f';
+            break;
+          case 'n':
+            buf[new_pos] = '\n';
+            break;
+          case 'r':
+            buf[new_pos] = '\r';
+            break;
+          case 't':
+            buf[new_pos] = '\t';
+            break;
+          case 'u': {
+            if (old_pos + 4 >= token->length()) {
+              PARSE_ERROR(escape_pos, ErrorStrings::kBadUnicodeEscape);
+            }
+            intptr_t val = 0;
+            for (intptr_t i = old_pos + 4; i > old_pos; old_pos--) {
+              val *= 16;
+              if (!Utils::IsHexDigit(i)) {
+                PARSE_ERROR(escape_pos, ErrorStrings::kBadUnicodeEscape);
+              }
+              val += Utils::HexDigitToInt(i);
+            }
+            // Currently, just handle encoded ASCII instead of doing
+            // handling Unicode characters.
+            // (TextBuffer::AddEscapedString uses this for characters < 0x20.)
+            ASSERT(val <= 0x7F);
+            old_pos += 5;
+            buf[new_pos] = val;
+            break;
+          }
+          default:
+            // Identity escapes.
+            buf[new_pos] = cstr[old_pos];
+            break;
+        }
+        old_pos++;
+        new_pos++;
+      }
+      if (cstr[old_pos] != '"') {
+        PARSE_ERROR(start_pos + token->length(), ErrorStrings::kOpenString,
+                    start_pos);
+      }
+      buf[new_pos] = '\0';
+      return new (zone_) SExpString(buf, start_pos);
+    }
+    default:
+      UNREACHABLE();
+  }
+}
+
+#undef PARSE_ERROR
+
+SExpParser::Token* SExpParser::GetNextToken() {
+  intptr_t start_pos = cur_pos_;
+  while (start_pos < buffer_size_) {
+    if (!isspace(buffer_[start_pos])) break;
+    start_pos++;
+  }
+  if (start_pos >= buffer_size_) return nullptr;
+  const char* start = buffer_ + start_pos;
+  switch (*start) {
+    case '(':
+      cur_pos_ = start_pos + 1;
+      return new (zone_) Token(kLeftParen, start, 1);
+    case ')':
+      cur_pos_ = start_pos + 1;
+      return new (zone_) Token(kRightParen, start, 1);
+    case ',':
+      cur_pos_ = start_pos + 1;
+      return new (zone_) Token(kComma, start, 1);
+    case '{':
+      cur_pos_ = start_pos + 1;
+      return new (zone_) Token(kLeftCurly, start, 1);
+    case '}':
+      cur_pos_ = start_pos + 1;
+      return new (zone_) Token(kRightCurly, start, 1);
+    case '"': {
+      intptr_t len = 1;
+      while (start_pos + len < buffer_size_) {
+        char curr = start[len];
+        len++;  // Length should include the quote, if any.
+        if (curr == '\\') {
+          // Skip past next character (if any), since it cannot
+          // end the quoted string due to being escaped.
+          if (start_pos + len >= buffer_size_) break;
+          len++;
+          continue;
+        }
+        if (curr == '"') break;
+      }
+      cur_pos_ = start_pos + len;
+      return new (zone_) Token(kQuotedString, start, len);
+    }
+    default:
+      break;
+  }
+  intptr_t len = 0;
+  // Start number detection after possible negation sign.
+  if (start[len] == '-') {
+    len++;
+    if ((start_pos + len) >= buffer_size_) {
+      cur_pos_ = start_pos + len;
+      return new (zone_) Token(kSymbol, start, len);
+    }
+  }
+  // Keep the currently detected token type. Start off by assuming we have
+  // an integer, then fall back to doubles if we see parts appropriate for
+  // those but not integers, and fall back to symbols otherwise.
+  TokenType type = kInteger;
+  bool saw_exponent = false;
+  while ((start_pos + len) < buffer_size_) {
+    // Both numbers and symbols cannot contain these values, so we are at the
+    // end of whichever one we're in.
+    if (!IsSymbolContinue(start[len])) break;
+    if (type == kInteger && start[len] == '.') {
+      type = kDouble;
+      len++;
+      continue;
+    }
+    if (type != kSymbol && !saw_exponent && start[len] == kDoubleExponentChar) {
+      saw_exponent = true;
+      type = kDouble;
+      len++;
+      // Skip past negation in exponent if any.
+      if ((start_pos + len) < buffer_size_ && start[len] == '-') len++;
+      continue;
+    }
+    // If we find a character that can't appear in a number, then fall back
+    // to symbol-ness.
+    if (!isdigit(start[len])) type = kSymbol;
+    len++;
+  }
+  cur_pos_ = start_pos + len;
+  // Skip special symbol detection if we don't have a symbol.
+  if (type != kSymbol) return new (zone_) Token(type, start, len);
+  // Check for special symbols used for booleans and certain Double values.
+  switch (len) {
+    case 3:
+      if (strncmp(start, kDoubleNaNSymbol, len) == 0) type = kDouble;
+      break;
+    case 4:
+      if (strncmp(start, kBoolTrueSymbol, len) == 0) type = kBoolean;
+      break;
+    case 5:
+      if (strncmp(start, kBoolFalseSymbol, len) == 0) type = kBoolean;
+      break;
+    case 8:
+      if (strncmp(start, kDoubleInfinitySymbol, len) == 0) type = kDouble;
+      break;
+    case 9:
+      if (start[0] == '-' &&
+          strncmp(start + 1, kDoubleInfinitySymbol, len - 1) == 0) {
+        type = kDouble;
+      }
+      break;
+    default:
+      break;
+  }
+  return new (zone_) Token(type, start, len);
+}
+
+bool SExpParser::IsSymbolContinue(char c) {
+  return !isspace(c) && c != '(' && c != ')' && c != ',' && c != '{' &&
+         c != '}' && c != '"';
+}
+
+const char* const SExpParser::Token::TokenNames[kMaxTokens] = {
+#define S_EXP_TOKEN_NAME_STRING(name) #name,
+    S_EXP_TOKEN_LIST(S_EXP_TOKEN_NAME_STRING)
+#undef S_EXP_TOKEN_NAME_STRING
+};
+
+const char* SExpParser::Token::ToCString(Zone* zone) {
+  char* const buffer = zone->Alloc<char>(len_ + 1);
+  strncpy(buffer, cstr_, len_);
+  buffer[len_] = '\0';
+  return buffer;
+}
+
+void SExpParser::Reset() {
+  cur_pos_ = 0;
+  in_extra_ = false;
+  extra_start_ = -1;
+  cur_label_ = nullptr;
+  cur_value_ = nullptr;
+  list_stack_.Clear();
+  in_extra_stack_.Clear();
+  extra_start_stack_.Clear();
+  cur_label_stack_.Clear();
+  error_pos_ = -1;
+  error_message_ = nullptr;
+}
+
+void SExpParser::StoreError(intptr_t pos, const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  const char* const message = OS::VSCreate(zone_, format, args);
+  va_end(args);
+  error_pos_ = pos;
+  error_message_ = message;
+}
+
+void SExpParser::ReportError() const {
+  ASSERT(error_message_ != nullptr);
+  ASSERT(error_pos_ >= 0);
+  OS::PrintErr("Unable to parse s-expression: %s\n", buffer_);
+  OS::PrintErr("Error at character %" Pd ": %s\n", error_pos_, error_message_);
+  OS::Abort();
+}
+
+}  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/backend/sexpression.h b/runtime/vm/compiler/backend/sexpression.h
new file mode 100644
index 0000000..9636b19
--- /dev/null
+++ b/runtime/vm/compiler/backend/sexpression.h
@@ -0,0 +1,317 @@
+// 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.
+
+#ifndef RUNTIME_VM_COMPILER_BACKEND_SEXPRESSION_H_
+#define RUNTIME_VM_COMPILER_BACKEND_SEXPRESSION_H_
+
+#include "platform/text_buffer.h"
+
+#include "vm/allocation.h"
+#include "vm/growable_array.h"
+#include "vm/hash.h"
+#include "vm/hash_map.h"
+#include "vm/zone.h"
+
+namespace dart {
+
+#define FOR_EACH_S_EXPRESSION_ATOM(M)                                          \
+  M(Bool, bool)                                                                \
+  M(Double, double)                                                            \
+  M(Integer, int64_t)                                                          \
+  M(String, const char*)                                                       \
+  M(Symbol, const char*)
+
+#define FOR_EACH_S_EXPRESSION(M)                                               \
+  FOR_EACH_S_EXPRESSION_ATOM(M)                                                \
+  M(List, _)
+
+#define FOR_EACH_ABSTRACT_S_EXPRESSION(M) M(Atom, _)
+
+#define FORWARD_DECLARATION(name, value_type) class SExp##name;
+FOR_EACH_S_EXPRESSION(FORWARD_DECLARATION)
+FOR_EACH_ABSTRACT_S_EXPRESSION(FORWARD_DECLARATION)
+#undef FORWARD_DECLARATION
+
+// Abstract base class for S-expressions used as an intermediate form for the
+// IL serializer. These aren't true (LISP-like) S-expressions, as the atoms
+// are more restricted and the lists have extra information. Here is an
+// illustrative BNF-style grammar of the current serialized form of
+// S-expressions that includes non-whitespace literal tokens:
+//
+// <s-exp>      ::= <atom> | <list>
+// <atom>       ::= <bool> | <integer> | <string> | <symbol>
+// <list>       ::= '(' <s-exp>* <extra-info>? ')'
+// <extra-info> ::= '{' <extra-elem>* '}'
+// <extra-elem> ::= <symbol> <s-exp> ','
+//
+// Here, <string>s are double-quoted strings with backslash escaping and
+// <symbol>s are sequences of consecutive non-whitespace characters that do not
+// include commas (,), parentheses (()), curly braces ({}), or the double-quote
+// character (").
+//
+// In addition, the <extra-info> is considered a map from symbol labels to
+// S-expression values, and as such each symbol used as a key in an <extra-info>
+// block should only appear once as a key within that block.
+class SExpression : public ZoneAllocated {
+ public:
+  explicit SExpression(intptr_t start = kInvalidPos) : start_(start) {}
+  virtual ~SExpression() {}
+
+  static intptr_t const kInvalidPos = -1;
+
+  static SExpression* FromCString(Zone* zone, const char* cstr);
+  intptr_t start() const { return start_; }
+
+#define S_EXPRESSION_TYPE_CHECK(name, value_type)                              \
+  bool Is##name() { return (As##name() != nullptr); }                          \
+  virtual SExp##name* As##name() { return nullptr; }
+
+  FOR_EACH_S_EXPRESSION(S_EXPRESSION_TYPE_CHECK)
+  FOR_EACH_ABSTRACT_S_EXPRESSION(S_EXPRESSION_TYPE_CHECK)
+
+  virtual const char* DebugName() const = 0;
+  virtual bool Equals(SExpression* sexp) const = 0;
+  virtual void SerializeTo(Zone* zone,
+                           TextBuffer* buffer,
+                           const char* indent,
+                           intptr_t width = 80) const = 0;
+  virtual void SerializeToLine(TextBuffer* buffer) const = 0;
+
+ private:
+  // Starting character position of the s-expression in the original
+  // serialization, if it was deserialized.
+  intptr_t const start_;
+  DISALLOW_COPY_AND_ASSIGN(SExpression);
+};
+
+class SExpAtom : public SExpression {
+ public:
+  explicit SExpAtom(intptr_t start = kInvalidPos) : SExpression(start) {}
+
+  virtual SExpAtom* AsAtom() { return this; }
+  // No atoms have sub-elements, so they always print to a single line.
+  virtual void SerializeTo(Zone* zone,
+                           TextBuffer* buffer,
+                           const char* indent,
+                           intptr_t width = 80) const {
+    SerializeToLine(buffer);
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(SExpAtom);
+};
+
+#define DEFINE_S_EXPRESSION_TYPE_CHECK(name)                                   \
+  virtual SExp##name* As##name() { return this; }                              \
+  virtual const char* DebugName() const { return #name; }
+
+// The various concrete S-expression atom classes are thin wrappers around
+// their contained value that includes serialization and type check methods.
+#define DEFINE_S_EXPRESSION_ATOM_CLASS(name, value_type)                       \
+  class SExp##name : public SExpAtom {                                         \
+   public:                                                                     \
+    explicit SExp##name(value_type val, intptr_t start = kInvalidPos)          \
+        : SExpAtom(start), val_(val) {}                                        \
+    value_type value() const { return val_; }                                  \
+    virtual bool Equals(SExpression* sexp) const;                              \
+    virtual void SerializeToLine(TextBuffer* buffer) const;                    \
+    DEFINE_S_EXPRESSION_TYPE_CHECK(name)                                       \
+   private:                                                                    \
+    value_type const val_;                                                     \
+    DISALLOW_COPY_AND_ASSIGN(SExp##name);                                      \
+  };
+
+FOR_EACH_S_EXPRESSION_ATOM(DEFINE_S_EXPRESSION_ATOM_CLASS)
+
+// A list of S-expressions. Unlike normal S-expressions, an S-expression list
+// also contains a hash map kept separate from the elements, which we use for
+// extra non-argument information for IL instructions.
+class SExpList : public SExpression {
+ public:
+  explicit SExpList(Zone* zone, intptr_t start = kInvalidPos)
+      : SExpression(start), contents_(zone, 2), extra_info_(zone) {}
+
+  template <typename V>
+  class CStringPointerKeyValueTrait {
+   public:
+    typedef const char* Key;
+    typedef V Value;
+
+    struct Pair {
+      Key key;
+      Value value;
+      Pair() : key(NULL), value() {}
+      Pair(const Key key, const Value& value) : key(key), value(value) {}
+      Pair(const Pair& other) : key(other.key), value(other.value) {}
+    };
+
+    static Key KeyOf(Pair kv) { return kv.key; }
+    static Value ValueOf(Pair kv) { return kv.value; }
+    static intptr_t Hashcode(Key key) {
+      intptr_t hash = 0;
+      for (size_t i = 0; i < strlen(key); i++) {
+        hash = CombineHashes(hash, key[i]);
+      }
+      return FinalizeHash(hash, kBitsPerWord - 1);
+    }
+    static bool IsKeyEqual(Pair kv, Key key) {
+      return kv.key == key || strcmp(kv.key, key) == 0;
+    }
+  };
+
+  using ExtraInfoKeyValueTrait = CStringPointerKeyValueTrait<SExpression*>;
+  using ExtraInfoHashMap = DirectChainedHashMap<ExtraInfoKeyValueTrait>;
+
+  void Add(SExpression* sexp);
+  void AddExtra(const char* label, SExpression* value);
+
+  SExpression* At(intptr_t i) const { return contents_.At(i); }
+  intptr_t Length() const { return contents_.length(); }
+
+  intptr_t ExtraLength() const { return extra_info_.Length(); }
+  ExtraInfoHashMap::Iterator ExtraIterator() const {
+    return extra_info_.GetIterator();
+  }
+  bool ExtraHasKey(const char* cstr) const { return extra_info_.HasKey(cstr); }
+  ExtraInfoKeyValueTrait::Value ExtraLookupValue(const char* cstr) const {
+    return extra_info_.LookupValue(cstr);
+  }
+
+  DEFINE_S_EXPRESSION_TYPE_CHECK(List)
+  virtual bool Equals(SExpression* sexp) const;
+  virtual void SerializeTo(Zone* zone,
+                           TextBuffer* buffer,
+                           const char* indent,
+                           intptr_t width = 80) const;
+  virtual void SerializeToLine(TextBuffer* buffer) const;
+
+ private:
+  static const char* const kElemIndent;
+  static const char* const kExtraIndent;
+
+  void SerializeExtraInfoTo(Zone* zone,
+                            TextBuffer* buffer,
+                            const char* indent,
+                            int width) const;
+  void SerializeExtraInfoToLine(TextBuffer* buffer) const;
+
+  ZoneGrowableArray<SExpression*> contents_;
+  ExtraInfoHashMap extra_info_;
+
+  DISALLOW_COPY_AND_ASSIGN(SExpList);
+};
+
+class SExpParser : public ValueObject {
+ public:
+  SExpParser(Zone* zone, const char* cstr)
+      : SExpParser(zone, cstr, strlen(cstr)) {}
+  SExpParser(Zone* zone, const char* cstr, intptr_t len)
+      : zone_(zone),
+        buffer_(cstr),
+        buffer_size_(strnlen(cstr, len)),
+        cur_label_(nullptr),
+        cur_value_(nullptr),
+        list_stack_(zone, 2),
+        in_extra_stack_(zone, 2),
+        extra_start_stack_(zone, 2),
+        cur_label_stack_(zone, 2),
+        error_message_(nullptr) {}
+
+  // Constants used in serializing and deserializing S-expressions.
+  static const char* const kBoolTrueSymbol;
+  static const char* const kBoolFalseSymbol;
+  static char const kDoubleExponentChar;
+  static const char* const kDoubleInfinitySymbol;
+  static const char* const kDoubleNaNSymbol;
+
+  struct ErrorStrings : AllStatic {
+    static const char* const kOpenString;
+    static const char* const kBadUnicodeEscape;
+    static const char* const kOpenSExpList;
+    static const char* const kOpenMap;
+    static const char* const kNestedMap;
+    static const char* const kMapOutsideList;
+    static const char* const kNonSymbolLabel;
+    static const char* const kNoMapLabel;
+    static const char* const kRepeatedMapLabel;
+    static const char* const kNoMapValue;
+    static const char* const kExtraMapValue;
+    static const char* const kUnexpectedComma;
+    static const char* const kUnexpectedRightParen;
+    static const char* const kUnexpectedRightCurly;
+  };
+
+  intptr_t error_pos() const { return error_pos_; }
+  const char* error_message() const { return error_message_; }
+
+  SExpression* Parse();
+  DART_NORETURN void ReportError() const;
+
+ private:
+#define S_EXP_TOKEN_LIST(M)                                                    \
+  M(LeftParen)                                                                 \
+  M(RightParen)                                                                \
+  M(Comma)                                                                     \
+  M(LeftCurly)                                                                 \
+  M(RightCurly)                                                                \
+  M(QuotedString)                                                              \
+  M(Integer)                                                                   \
+  M(Double)                                                                    \
+  M(Boolean)                                                                   \
+  M(Symbol)
+
+  // clang-format off
+#define DEFINE_S_EXP_TOKEN_ENUM_LINE(name) k##name,
+  enum TokenType {
+    S_EXP_TOKEN_LIST(DEFINE_S_EXP_TOKEN_ENUM_LINE)
+    kMaxTokens,
+  };
+#undef DEFINE_S_EXP_TOKEN_ENUM
+  // clang-format on
+
+  class Token : public ZoneAllocated {
+   public:
+    Token(TokenType type, const char* cstr, intptr_t len)
+        : type_(type), cstr_(cstr), len_(len) {}
+
+    TokenType type() const { return type_; }
+    intptr_t length() const { return len_; }
+    const char* cstr() const { return cstr_; }
+    const char* DebugName() const { return TokenNames[type()]; }
+    const char* ToCString(Zone* zone);
+
+   private:
+    static const char* const TokenNames[kMaxTokens];
+
+    TokenType const type_;
+    const char* const cstr_;
+    intptr_t const len_;
+  };
+
+  SExpression* TokenToSExpression(Token* token);
+  Token* GetNextToken();
+  void Reset();
+  void StoreError(intptr_t pos, const char* format, ...);
+
+  static bool IsSymbolContinue(char c);
+
+  Zone* const zone_;
+  const char* const buffer_;
+  intptr_t const buffer_size_;
+  intptr_t cur_pos_ = 0;
+  bool in_extra_ = false;
+  intptr_t extra_start_ = -1;
+  const char* cur_label_;
+  SExpression* cur_value_;
+  ZoneGrowableArray<SExpList*> list_stack_;
+  ZoneGrowableArray<bool> in_extra_stack_;
+  ZoneGrowableArray<intptr_t> extra_start_stack_;
+  ZoneGrowableArray<const char*> cur_label_stack_;
+  intptr_t error_pos_ = -1;
+  const char* error_message_;
+};
+
+}  // namespace dart
+
+#endif  // RUNTIME_VM_COMPILER_BACKEND_SEXPRESSION_H_
diff --git a/runtime/vm/compiler/backend/sexpression_test.cc b/runtime/vm/compiler/backend/sexpression_test.cc
new file mode 100644
index 0000000..7b6b85b
--- /dev/null
+++ b/runtime/vm/compiler/backend/sexpression_test.cc
@@ -0,0 +1,340 @@
+// 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.
+
+#include "vm/compiler/backend/sexpression.h"
+
+#include <cmath>
+#include "platform/assert.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+static const char* const shared_sexp_cstr =
+    "(def v0 (Constant 3) { type (CompileType 147 { nullable false, name "
+    "\"T{Smi}\"}), })";
+
+static void CheckDeserializedSExpParts(SExpression* sexp) {
+  EXPECT_NOTNULL(sexp);
+  EXPECT(sexp->IsList());
+  SExpList* list = sexp->AsList();
+  EXPECT_EQ(3, list->Length());
+  EXPECT_NOTNULL(list->At(0));
+  EXPECT(list->At(0)->IsSymbol());
+  EXPECT_STREQ("def", list->At(0)->AsSymbol()->value());
+  EXPECT_NOTNULL(list->At(1));
+  EXPECT(list->At(1)->IsSymbol());
+  EXPECT_STREQ("v0", list->At(1)->AsSymbol()->value());
+  EXPECT_NOTNULL(list->At(2));
+  EXPECT(list->At(2)->IsList());
+
+  SExpList* sublist = list->At(2)->AsList();
+  EXPECT_EQ(2, sublist->Length());
+  EXPECT_NOTNULL(sublist->At(0));
+  EXPECT(sublist->At(0)->IsSymbol());
+  EXPECT_STREQ("Constant", sublist->At(0)->AsSymbol()->value());
+  EXPECT_NOTNULL(sublist->At(1));
+  EXPECT(sublist->At(1)->IsInteger());
+  EXPECT_EQ(3, sublist->At(1)->AsInteger()->value());
+  EXPECT_EQ(0, sublist->ExtraLength());
+
+  EXPECT_EQ(1, list->ExtraLength());
+  EXPECT(list->ExtraHasKey("type"));
+  EXPECT(list->ExtraLookupValue("type")->IsList());
+
+  SExpList* ctype = list->ExtraLookupValue("type")->AsList();
+  EXPECT_EQ(2, ctype->Length());
+  EXPECT_NOTNULL(ctype->At(0));
+  EXPECT(ctype->At(0)->IsSymbol());
+  EXPECT_STREQ("CompileType", ctype->At(0)->AsSymbol()->value());
+  EXPECT_NOTNULL(ctype->At(1));
+  EXPECT(ctype->At(1)->IsInteger());
+  EXPECT_EQ(147, ctype->At(1)->AsInteger()->value());
+
+  EXPECT_EQ(2, ctype->ExtraLength());
+  EXPECT(ctype->ExtraHasKey("nullable"));
+  EXPECT(ctype->ExtraLookupValue("nullable")->IsBool());
+  EXPECT(!ctype->ExtraLookupValue("nullable")->AsBool()->value());
+  EXPECT(ctype->ExtraHasKey("name"));
+  EXPECT(ctype->ExtraLookupValue("name")->IsString());
+  EXPECT_STREQ(ctype->ExtraLookupValue("name")->AsString()->value(), "T{Smi}");
+}
+
+ISOLATE_UNIT_TEST_CASE(DeserializeSExp) {
+  Zone* const zone = Thread::Current()->zone();
+  SExpression* sexp = SExpression::FromCString(zone, shared_sexp_cstr);
+  CheckDeserializedSExpParts(sexp);
+
+  // Treating escaped backslash appropriately so string is terminated.
+  {
+    const char* const cstr = "(def v0 (Constant 3) { foo \"123\\\\\" })";
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NOTNULL(sexp);
+    EXPECT(sexp->IsList());
+    EXPECT_EQ(1, sexp->AsList()->ExtraLength());
+    EXPECT(sexp->AsList()->ExtraHasKey("foo"));
+    auto val = sexp->AsList()->ExtraLookupValue("foo");
+    EXPECT(val->IsString());
+    EXPECT_STREQ("123\\", val->AsString()->value());
+  }
+}
+
+ISOLATE_UNIT_TEST_CASE(DeserializeSExpNumbers) {
+  Zone* const zone = Thread::Current()->zone();
+
+  // Negative integers are handled.
+  {
+    const char* const cstr = "(-4 -50 -1414243)";
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NOTNULL(sexp);
+    EXPECT(sexp->IsList());
+    auto list = sexp->AsList();
+    EXPECT_EQ(3, list->Length());
+    EXPECT_EQ(0, list->ExtraLength());
+    for (intptr_t i = 0; i < list->Length(); i++) {
+      EXPECT(list->At(i)->IsInteger());
+      EXPECT(list->At(i)->AsInteger()->value() < 0);
+    }
+  }
+
+  // Various decimal/exponent Doubles are appropriately handled.
+  {
+    const char* const cstr = "(1.05 0.05 .03 1e100 1e-100)";
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NOTNULL(sexp);
+    EXPECT(sexp->IsList());
+    auto list = sexp->AsList();
+    EXPECT_EQ(5, list->Length());
+    EXPECT_EQ(0, list->ExtraLength());
+    EXPECT(list->At(0)->IsDouble());
+    double val = list->At(0)->AsDouble()->value();
+    EXPECT(val > 1.04 && val < 1.06);
+    EXPECT(list->At(1)->IsDouble());
+    val = list->At(1)->AsDouble()->value();
+    EXPECT(val > 0.04 && val < 0.06);
+    EXPECT(list->At(2)->IsDouble());
+    val = list->At(2)->AsDouble()->value();
+    EXPECT(val > 0.02 && val < 0.04);
+    EXPECT(list->At(3)->IsDouble());
+    val = list->At(3)->AsDouble()->value();
+    EXPECT(val > 0.9e100 && val < 1.1e100);
+    EXPECT(list->At(4)->IsDouble());
+    val = list->At(4)->AsDouble()->value();
+    EXPECT(val > 0.9e-100 && val < 1.1e-100);
+  }
+
+  // Special Double symbols are appropriately handled.
+  {
+    const char* const cstr = "(NaN Infinity -Infinity)";
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NOTNULL(sexp);
+    EXPECT(sexp->IsList());
+    auto list = sexp->AsList();
+    EXPECT_EQ(3, list->Length());
+    EXPECT_EQ(0, list->ExtraLength());
+    EXPECT(list->At(0)->IsDouble());
+    double val = list->At(0)->AsDouble()->value();
+    EXPECT(isnan(val));
+    EXPECT(list->At(1)->IsDouble());
+    val = list->At(1)->AsDouble()->value();
+    EXPECT(val > 0.0);
+    EXPECT(isinf(val));
+    EXPECT(list->At(2)->IsDouble());
+    val = list->At(2)->AsDouble()->value();
+    EXPECT(val < 0.0);
+    EXPECT(isinf(val));
+  }
+}
+
+ISOLATE_UNIT_TEST_CASE(DeserializeSExpRoundTrip) {
+  Zone* const zone = Thread::Current()->zone();
+  SExpression* sexp = SExpression::FromCString(zone, shared_sexp_cstr);
+
+  TextBuffer buf(100);
+  sexp->SerializeTo(zone, &buf, "", 9999);
+  SExpression* round_trip = SExpression::FromCString(zone, buf.buf());
+  CheckDeserializedSExpParts(round_trip);
+  EXPECT(sexp->Equals(round_trip));
+
+  char* const old_serialization = buf.Steal();
+  round_trip->SerializeTo(zone, &buf, "", 9999);
+  char* const new_serialization = buf.buf();
+  EXPECT_STREQ(old_serialization, new_serialization);
+  free(old_serialization);
+}
+
+ISOLATE_UNIT_TEST_CASE(DeserializeSExpMapsJoined) {
+  Zone* const zone = Thread::Current()->zone();
+  // Same as shared_sexp_cstr except we split the map on the CompileType into
+  // two parts.
+  const char* const cstr =
+      "(def v0 (Constant 3) { type (CompileType { nullable false } 147 { name "
+      "\"T{Smi}\"}), })";
+  SExpression* sexp = SExpression::FromCString(zone, cstr);
+  CheckDeserializedSExpParts(sexp);
+}
+
+ISOLATE_UNIT_TEST_CASE(DeserializeSExpFailures) {
+  Zone* const zone = Thread::Current()->zone();
+  // Unterminated s-exp list
+  {
+    const char* const before_start = "(def v0 ";
+    const char* const after_start = "(Constant 3";
+    const char* const cstr =
+        OS::SCreate(zone, "%s%s", before_start, after_start);
+    const intptr_t start_pos = strlen(before_start);
+    const intptr_t error_pos = strlen(cstr);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kOpenSExpList, start_pos);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Non-symbol label in map pair
+  {
+    const char* const before_error = "(def v0 (Constant 3) { ";
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = "3 4 })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        SExpParser::ErrorStrings::kNonSymbolLabel;
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // No values in a map pair
+  {
+    const char* const label = "foo";
+    const char* const before_error =
+        OS::SCreate(zone, "(def v0 (Constant 3) { %s ", label);
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = "})";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kNoMapValue, label);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Multiple values in a map pair
+  {
+    const char* const label = "foo";
+    const char* const before_error =
+        OS::SCreate(zone, "(def v0 (Constant 3) { %s 4 ", label);
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = "5, })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kExtraMapValue, label);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Unterminated quoted string
+  {
+    const char* const before_string =
+        OS::SCreate(zone, "(def v0 (Constant 3) { foo ");
+    const intptr_t string_pos = strlen(before_string);
+    const char* const error = "\"abc })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_string, error);
+    const intptr_t error_pos = strlen(cstr);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kOpenString, string_pos);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Unterminated extra info map
+  {
+    const char* const before_map = "(def v0 (Constant 3) ";
+    const intptr_t map_pos = strlen(before_map);
+    const char* const map_start = "{ foo 3, ";
+    const char* const before_error =
+        OS::SCreate(zone, "%s%s", before_map, map_start);
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = ")";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kOpenMap, map_pos);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Repeated extra info map label
+  {
+    const char* const label = "foo";
+    const char* const before_error =
+        OS::SCreate(zone, "(def v0 (Constant 3) { %s 3, ", label);
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = OS::SCreate(zone, "%s 4, })", label);
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kRepeatedMapLabel, label);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Unicode escape with non-hex digits.
+  {
+    const char* const before_error = "(def v0 (Constant 3) { foo \"123";
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = "\\u12FG\" })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        SExpParser::ErrorStrings::kBadUnicodeEscape;
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Unicode escape with less than four hex digits.
+  {
+    const char* const before_error = "(def v0 (Constant 3) { foo \"123";
+    const intptr_t error_pos = strlen(before_error);
+    const char* const error = "\\u12\" })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_error, error);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        SExpParser::ErrorStrings::kBadUnicodeEscape;
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+  // Treating backslashed quote appropriately to detect unterminated string
+  {
+    const char* const before_string = "(def v0 (Constant 3) { foo ";
+    const intptr_t string_pos = strlen(before_string);
+    const char* const error = "\"123\\\" })";
+    const char* const cstr = OS::SCreate(zone, "%s%s", before_string, error);
+    const intptr_t error_pos = strlen(cstr);
+    SExpParser parser(zone, cstr, strlen(cstr));
+    SExpression* const sexp = parser.Parse();
+    EXPECT_NULLPTR(sexp);
+    EXPECT_EQ(error_pos, parser.error_pos());
+    const char* const expected_message =
+        OS::SCreate(zone, SExpParser::ErrorStrings::kOpenString, string_pos);
+    EXPECT_STREQ(expected_message, parser.error_message());
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/compiler/backend/type_propagator.cc b/runtime/vm/compiler/backend/type_propagator.cc
index 420bdbf..7043c36 100644
--- a/runtime/vm/compiler/backend/type_propagator.cc
+++ b/runtime/vm/compiler/backend/type_propagator.cc
@@ -6,8 +6,9 @@
 
 #include "vm/compiler/backend/type_propagator.h"
 
+#include "platform/text_buffer.h"
+
 #include "vm/bit_vector.h"
-#include "vm/compiler/backend/il_printer.h"
 #include "vm/compiler/compiler_state.h"
 #include "vm/object_store.h"
 #include "vm/regexp_assembler.h"
@@ -660,6 +661,14 @@
   return FromAbstractType(Type::ZoneHandle(Type::IntType()), kNonNullable);
 }
 
+CompileType CompileType::Int32() {
+#if defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64)
+  return FromCid(kSmiCid);
+#else
+  return Int();
+#endif
+}
+
 CompileType CompileType::NullableInt() {
   return FromAbstractType(Type::ZoneHandle(Type::IntType()), kNullable);
 }
@@ -821,6 +830,33 @@
   return ToAbstractType()->IsSubtypeOf(other, Heap::kOld);
 }
 
+void CompileType::PrintTo(BufferFormatter* f) const {
+  const char* type_name = "?";
+  if (IsNone()) {
+    f->Print("T{}");
+    return;
+  } else if ((cid_ != kIllegalCid) && (cid_ != kDynamicCid)) {
+    const Class& cls =
+        Class::Handle(Isolate::Current()->class_table()->At(cid_));
+    type_name = String::Handle(cls.ScrubbedName()).ToCString();
+  } else if (type_ != NULL) {
+    type_name = type_->IsDynamicType()
+                    ? "*"
+                    : String::Handle(type_->UserVisibleName()).ToCString();
+  } else if (!is_nullable()) {
+    type_name = "!null";
+  }
+
+  f->Print("T{%s%s}", type_name, is_nullable_ ? "?" : "");
+}
+
+const char* CompileType::ToCString() const {
+  char buffer[1024];
+  BufferFormatter f(buffer, sizeof(buffer));
+  PrintTo(&f);
+  return Thread::Current()->zone()->MakeCopyOfString(buffer);
+}
+
 CompileType* Value::Type() {
   if (reaching_type_ == NULL) {
     reaching_type_ = definition()->Type();
@@ -1112,7 +1148,7 @@
     return *value_type;
   }
 
-  return CompileType::Create(value_type->ToCid(), dst_type());
+  return CompileType::FromAbstractType(dst_type(), value_type->is_nullable());
 }
 
 bool AssertAssignableInstr::RecomputeType() {
@@ -1403,6 +1439,22 @@
   }
 }
 
+CompileType BinaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int32();
+}
+
+CompileType ShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int32();
+}
+
+CompileType SpeculativeShiftUint32OpInstr::ComputeType() const {
+  return CompileType::Int32();
+}
+
+CompileType UnaryUint32OpInstr::ComputeType() const {
+  return CompileType::Int32();
+}
+
 CompileType BinaryInt32OpInstr::ComputeType() const {
   // TODO(vegorov): range analysis information shall be used here.
   return CompileType::Int();
@@ -1606,6 +1658,56 @@
   return CompileType::FromCid(definition_cid_);
 }
 
+CompileType LoadIndexedInstr::ComputeType() const {
+  switch (class_id_) {
+    case kArrayCid:
+    case kImmutableArrayCid:
+      if (result_type_ != nullptr) {
+        // The original call knew something.
+        return *result_type_;
+      }
+      return CompileType::Dynamic();
+
+    case kTypedDataFloat32ArrayCid:
+    case kTypedDataFloat64ArrayCid:
+      return CompileType::FromCid(kDoubleCid);
+
+    case kTypedDataFloat32x4ArrayCid:
+      return CompileType::FromCid(kFloat32x4Cid);
+
+    case kTypedDataInt32x4ArrayCid:
+      return CompileType::FromCid(kInt32x4Cid);
+
+    case kTypedDataFloat64x2ArrayCid:
+      return CompileType::FromCid(kFloat64x2Cid);
+
+    case kTypedDataInt8ArrayCid:
+    case kTypedDataUint8ArrayCid:
+    case kTypedDataUint8ClampedArrayCid:
+    case kExternalTypedDataUint8ArrayCid:
+    case kExternalTypedDataUint8ClampedArrayCid:
+    case kTypedDataInt16ArrayCid:
+    case kTypedDataUint16ArrayCid:
+    case kOneByteStringCid:
+    case kTwoByteStringCid:
+    case kExternalOneByteStringCid:
+    case kExternalTwoByteStringCid:
+      return CompileType::FromCid(kSmiCid);
+
+    case kTypedDataInt32ArrayCid:
+    case kTypedDataUint32ArrayCid:
+      return CompileType::Int32();
+
+    case kTypedDataInt64ArrayCid:
+    case kTypedDataUint64ArrayCid:
+      return CompileType::Int();
+
+    default:
+      UNIMPLEMENTED();
+      return CompileType::Dynamic();
+  }
+}
+
 }  // namespace dart
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/compiler/compiler_pass.cc b/runtime/vm/compiler/compiler_pass.cc
index d101470..7692c29 100644
--- a/runtime/vm/compiler/compiler_pass.cc
+++ b/runtime/vm/compiler/compiler_pass.cc
@@ -11,6 +11,7 @@
 #include "vm/compiler/backend/constant_propagator.h"
 #include "vm/compiler/backend/flow_graph_checker.h"
 #include "vm/compiler/backend/il_printer.h"
+#include "vm/compiler/backend/il_serializer.h"
 #include "vm/compiler/backend/inliner.h"
 #include "vm/compiler/backend/linearscan.h"
 #include "vm/compiler/backend/range_analysis.h"
@@ -19,6 +20,7 @@
 #include "vm/compiler/call_specializer.h"
 #if defined(DART_PRECOMPILER)
 #include "vm/compiler/aot/aot_call_specializer.h"
+#include "vm/compiler/aot/precompiler.h"
 #endif
 #include "vm/timeline.h"
 
@@ -287,6 +289,13 @@
   INVOKE_PASS(AllocationSinking_DetachMaterializations);
   INVOKE_PASS(WriteBarrierElimination);
   INVOKE_PASS(FinalizeGraph);
+#if defined(DART_PRECOMPILER)
+  if (mode == kAOT) {
+    // If we are serializing the flow graph, do it now before we start
+    // doing register allocation.
+    INVOKE_PASS(SerializeGraph);
+  }
+#endif
   INVOKE_PASS(AllocateRegisters);
   INVOKE_PASS(ReorderBlocks);
 }
@@ -492,6 +501,24 @@
   flow_graph->RemoveRedefinitions();
 });
 
+#if defined(DART_PRECOMPILER)
+COMPILER_PASS(SerializeGraph, {
+  if (state->precompiler == nullptr) return state;
+  if (auto stream = state->precompiler->il_serialization_stream()) {
+    auto file_write = Dart::file_write_callback();
+    ASSERT(file_write != nullptr);
+
+    const intptr_t kInitialBufferSize = 1 * MB;
+    TextBuffer buffer(kInitialBufferSize);
+    StackZone stack_zone(Thread::Current());
+    FlowGraphSerializer::SerializeToBuffer(stack_zone.GetZone(), flow_graph,
+                                           &buffer);
+
+    file_write(buffer.buf(), buffer.length(), stream);
+  }
+});
+#endif
+
 }  // namespace dart
 
 #endif  // DART_PRECOMPILED_RUNTIME
diff --git a/runtime/vm/compiler/compiler_pass.h b/runtime/vm/compiler/compiler_pass.h
index 0cfca3f..6f9b948 100644
--- a/runtime/vm/compiler/compiler_pass.h
+++ b/runtime/vm/compiler/compiler_pass.h
@@ -41,6 +41,7 @@
   V(RangeAnalysis)                                                             \
   V(ReorderBlocks)                                                             \
   V(SelectRepresentations)                                                     \
+  V(SerializeGraph)                                                            \
   V(SetOuterInliningId)                                                        \
   V(TryCatchOptimization)                                                      \
   V(TryOptimizePatterns)                                                       \
diff --git a/runtime/vm/compiler/compiler_sources.gni b/runtime/vm/compiler/compiler_sources.gni
index 2d8c1f2..6a27c2a 100644
--- a/runtime/vm/compiler/compiler_sources.gni
+++ b/runtime/vm/compiler/compiler_sources.gni
@@ -66,6 +66,8 @@
   "backend/il_ia32.cc",
   "backend/il_printer.cc",
   "backend/il_printer.h",
+  "backend/il_serializer.cc",
+  "backend/il_serializer.h",
   "backend/il_x64.cc",
   "backend/inliner.cc",
   "backend/inliner.h",
@@ -81,6 +83,8 @@
   "backend/range_analysis.h",
   "backend/redundancy_elimination.cc",
   "backend/redundancy_elimination.h",
+  "backend/sexpression.cc",
+  "backend/sexpression.h",
   "backend/slot.cc",
   "backend/slot.h",
   "backend/type_propagator.cc",
@@ -152,12 +156,9 @@
 #
 # Not that this diverges from our convention to build every file on every OS
 # but have ifdef guards which make the files empty on some configurations.
-if (!is_win) {
+if (is_linux || is_mac) {
   # MASM on Windows does not support c preproccesor style flags.
-  compiler_sources += [
-    "ffi_dbc_trampoline_arm64.S",
-    "ffi_dbc_trampoline_x64_linux_mac.S",
-  ]
+  compiler_sources += [ "ffi_dbc_trampoline_x64_linux_mac.S" ]
 }
 
 compiler_sources_tests = [
@@ -176,6 +177,7 @@
   "backend/loops_test.cc",
   "backend/range_analysis_test.cc",
   "backend/redundancy_elimination_test.cc",
+  "backend/sexpression_test.cc",
   "backend/slot_test.cc",
   "backend/type_propagator_test.cc",
   "backend/typed_data_aot_test.cc",
diff --git a/runtime/vm/compiler/compiler_state.cc b/runtime/vm/compiler/compiler_state.cc
index 4e05c0d..47407f5 100644
--- a/runtime/vm/compiler/compiler_state.cc
+++ b/runtime/vm/compiler/compiler_state.cc
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 #include "vm/compiler/compiler_state.h"
+#include "vm/growable_array.h"
 
 #ifndef DART_PRECOMPILED_RUNTIME
 
@@ -52,27 +53,22 @@
       });
 }
 
-const GrowableArray<LocalVariable*>& CompilerState::GetDummyContextVariables(
+const ZoneGrowableArray<const Slot*>& CompilerState::GetDummyContextSlots(
     intptr_t context_id,
     intptr_t num_context_variables) {
-  return PutIfAbsent<LocalScope>(
-             thread(), &dummy_scopes_, num_context_variables,
-             [&]() {
-               Zone* const Z = thread()->zone();
+  return *PutIfAbsent<ZoneGrowableArray<const Slot*>>(
+      thread(), &dummy_slots_, num_context_variables, [&]() {
+        Zone* const Z = thread()->zone();
 
-               LocalScope* scope = new (Z) LocalScope(
-                   /*parent=*/NULL, /*function_level=*/0, /*loop_level=*/0);
-               scope->set_context_level(0);
+        auto slots =
+            new (Z) ZoneGrowableArray<const Slot*>(num_context_variables);
+        for (intptr_t i = 0; i < num_context_variables; i++) {
+          LocalVariable* var = GetDummyCapturedVariable(context_id, i);
+          slots->Add(&Slot::GetContextVariableSlotFor(thread(), *var));
+        }
 
-               for (intptr_t i = 0; i < num_context_variables; i++) {
-                 LocalVariable* var = GetDummyCapturedVariable(context_id, i);
-                 scope->AddVariable(var);
-                 scope->AddContextVariable(var);
-               }
-
-               return scope;
-             })
-      ->context_variables();
+        return slots;
+      });
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/compiler_state.h b/runtime/vm/compiler/compiler_state.h
index 774f74d..be14d0b 100644
--- a/runtime/vm/compiler/compiler_state.h
+++ b/runtime/vm/compiler/compiler_state.h
@@ -14,6 +14,7 @@
 class LocalScope;
 class LocalVariable;
 class SlotCache;
+class Slot;
 
 // Deoptimization Id logic.
 //
@@ -97,9 +98,9 @@
   //
   // TODO(vegorov): create context classes for distinct context IDs and
   // populate them with slots without creating variables.
-  const GrowableArray<LocalVariable*>& GetDummyContextVariables(
+  const ZoneGrowableArray<const Slot*>& GetDummyContextSlots(
       intptr_t context_id,
-      intptr_t num_context_variables);
+      intptr_t num_context_slots);
 
   // Create a dummy LocalVariable that represents a captured local variable
   // at the given index in the context with given ID.
@@ -121,9 +122,9 @@
   // Cache for Slot objects created during compilation (see slot.h).
   SlotCache* slot_cache_ = nullptr;
 
-  // Caches for dummy LocalVariables and LocalScopes created during
-  // bytecode to IL translation.
-  ZoneGrowableArray<LocalScope*>* dummy_scopes_ = nullptr;
+  // Caches for dummy LocalVariables and context Slots created during bytecode
+  // to IL translation.
+  ZoneGrowableArray<ZoneGrowableArray<const Slot*>*>* dummy_slots_ = nullptr;
   ZoneGrowableArray<LocalVariable*>* dummy_captured_vars_ = nullptr;
 
   CompilerState* previous_;
diff --git a/runtime/vm/compiler/ffi.cc b/runtime/vm/compiler/ffi.cc
index a2e83a7..67f2645 100644
--- a/runtime/vm/compiler/ffi.cc
+++ b/runtime/vm/compiler/ffi.cc
@@ -52,6 +52,75 @@
   return element_size_table[index];
 }
 
+// See pkg/vm/lib/transformations/ffi.dart, which makes these assumptions.
+struct AbiAlignmentDouble {
+  int8_t use_one_byte;
+  double d;
+};
+struct AbiAlignmentUint64 {
+  int8_t use_one_byte;
+  uint64_t i;
+};
+
+#if defined(HOST_ARCH_X64) || defined(HOST_ARCH_ARM64)
+static_assert(offsetof(AbiAlignmentDouble, d) == 8,
+              "FFI transformation alignment");
+static_assert(offsetof(AbiAlignmentUint64, i) == 8,
+              "FFI transformation alignment");
+#elif (defined(HOST_ARCH_IA32) &&                                              \
+       (defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) ||                    \
+        defined(HOST_OS_ANDROID))) ||                                          \
+    (defined(HOST_ARCH_ARM) && defined(HOST_OS_IOS))
+static_assert(offsetof(AbiAlignmentDouble, d) == 4,
+              "FFI transformation alignment");
+static_assert(offsetof(AbiAlignmentUint64, i) == 4,
+              "FFI transformation alignment");
+#elif defined(HOST_ARCH_IA32) && defined(HOST_OS_WINDOWS) ||                   \
+    defined(HOST_ARCH_ARM)
+static_assert(offsetof(AbiAlignmentDouble, d) == 8,
+              "FFI transformation alignment");
+static_assert(offsetof(AbiAlignmentUint64, i) == 8,
+              "FFI transformation alignment");
+#else
+#error "Unknown platform. Please add alignment requirements for ABI."
+#endif
+
+#if defined(TARGET_ARCH_DBC)
+static Abi HostAbi() {
+#if defined(HOST_ARCH_X64) || defined(HOST_ARCH_ARM64)
+  return Abi::kWordSize64;
+#elif (defined(HOST_ARCH_IA32) &&                                              \
+       (defined(HOST_OS_LINUX) || defined(HOST_OS_MACOS) ||                    \
+        defined(HOST_OS_ANDROID))) ||                                          \
+    (defined(HOST_ARCH_ARM) && defined(HOST_OS_IOS))
+  return Abi::kWordSize32Align32;
+#elif defined(HOST_ARCH_IA32) && defined(HOST_OS_WINDOWS) ||                   \
+    defined(HOST_ARCH_ARM)
+  return Abi::kWordSize32Align64;
+#else
+#error "Unknown platform. Please add alignment requirements for ABI."
+#endif
+}
+#endif  // defined(TARGET_ARCH_DBC)
+
+Abi TargetAbi() {
+#if defined(TARGET_ARCH_DBC)
+  return HostAbi();
+#elif defined(TARGET_ARCH_X64) || defined(TARGET_ARCH_ARM64)
+  return Abi::kWordSize64;
+#elif (defined(TARGET_ARCH_IA32) &&                                            \
+       (defined(TARGET_OS_LINUX) || defined(TARGET_OS_MACOS) ||                \
+        defined(TARGET_OS_ANDROID))) ||                                        \
+    (defined(TARGET_ARCH_ARM) && defined(TARGET_OS_IOS))
+  return Abi::kWordSize32Align32;
+#elif defined(TARGET_ARCH_IA32) && defined(TARGET_OS_WINDOWS) ||               \
+    defined(TARGET_ARCH_ARM)
+  return Abi::kWordSize32Align64;
+#else
+#error "Unknown platform. Please add alignment requirements for ABI."
+#endif
+}
+
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
 Representation TypeRepresentation(const AbstractType& result_type) {
@@ -184,10 +253,9 @@
       case kUnboxedInt64:
       case kUnboxedUint32:
       case kUnboxedInt32: {
-        Location result =
-            rep == kUnboxedInt64 && compiler::target::kWordSize == 4
-                ? AllocateAlignedRegisterPair()
-                : AllocateCpuRegister();
+        Location result = rep == kUnboxedInt64 && target::kWordSize == 4
+                              ? AllocateAlignedRegisterPair()
+                              : AllocateCpuRegister();
         if (!result.IsUnallocated()) return result;
         break;
       }
@@ -196,7 +264,7 @@
     }
 
     // Argument must be spilled.
-    if (rep == kUnboxedInt64 && compiler::target::kWordSize == 4) {
+    if (rep == kUnboxedInt64 && target::kWordSize == 4) {
       return AllocateAlignedStackSlots(rep);
     } else if (rep == kUnboxedDouble) {
       // By convention, we always use DoubleStackSlot for doubles, even on
@@ -217,15 +285,14 @@
   Location AllocateDoubleStackSlot() {
     const Location result = Location::DoubleStackSlot(
         stack_height_in_slots, CallingConventions::kStackPointerRegister);
-    stack_height_in_slots += 8 / compiler::target::kWordSize;
+    stack_height_in_slots += 8 / target::kWordSize;
     return result;
   }
 
   // Allocates a pair of stack slots where the first stack slot is aligned to an
   // 8-byte boundary, if necessary.
   Location AllocateAlignedStackSlots(Representation rep) {
-    if (CallingConventions::kAlignArguments &&
-        compiler::target::kWordSize == 4) {
+    if (CallingConventions::kAlignArguments && target::kWordSize == 4) {
       stack_height_in_slots += stack_height_in_slots % 2;
     }
 
@@ -314,7 +381,7 @@
   if (arg.IsRegister()) {
     argument_slots_required_++;
   } else {
-    argument_slots_required_ += 8 / compiler::target::kWordSize;
+    argument_slots_required_ += 8 / target::kWordSize;
   }
 }
 
@@ -345,7 +412,7 @@
   ASSERT(arg.IsFpuRegister());
   const Location result =
       Location::DoubleStackSlot(argument_slots_used_, SPREG);
-  argument_slots_used_ += 8 / compiler::target::kWordSize;
+  argument_slots_used_ += 8 / target::kWordSize;
   return result;
 }
 
@@ -376,7 +443,7 @@
   return ArgumentLocationsBase<dart::CallingConventions, Location,
                                dart::Register, dart::FpuRegister>(arg_reps);
 #else
-  intptr_t next_free_register = compiler::ffi::kFirstArgumentRegister;
+  intptr_t next_free_register = ffi::kFirstArgumentRegister;
   intptr_t num_arguments = arg_reps.length();
   auto result = new ZoneGrowableArray<Location>(num_arguments);
   for (intptr_t i = 0; i < num_arguments; i++) {
@@ -413,7 +480,7 @@
     case kUnboxedUint32:
       return Location::RegisterLocation(CallingConventions::kReturnReg);
     case kUnboxedInt64:
-      if (compiler::target::kWordSize == 4) {
+      if (target::kWordSize == 4) {
         return Location::Pair(
             Location::RegisterLocation(CallingConventions::kReturnReg),
             Location::RegisterLocation(CallingConventions::kSecondReturnReg));
@@ -478,7 +545,7 @@
     if (locations.At(i).IsStackSlot()) {
       height = locations.At(i).stack_index() + 1;
     } else if (locations.At(i).IsDoubleStackSlot()) {
-      height = locations.At(i).stack_index() + 8 / compiler::target::kWordSize;
+      height = locations.At(i).stack_index() + 8 / target::kWordSize;
     } else if (locations.At(i).IsPairLocation()) {
       const Location first = locations.At(i).AsPairLocation()->At(0);
       const Location second = locations.At(i).AsPairLocation()->At(1);
@@ -578,7 +645,7 @@
       Object::Handle(zone, isolate->object_store()->ffi_as_function_internal());
   if (asFunctionInternal.raw() == Object::null()) {
     // Cache the reference.
-    Library& ffi =
+    const Library& ffi =
         Library::Handle(zone, isolate->object_store()->ffi_library());
     asFunctionInternal =
         ffi.LookupFunctionAllowPrivate(Symbols::AsFunctionInternal());
diff --git a/runtime/vm/compiler/ffi.h b/runtime/vm/compiler/ffi.h
index 9c9810a..0e5ff05 100644
--- a/runtime/vm/compiler/ffi.h
+++ b/runtime/vm/compiler/ffi.h
@@ -25,6 +25,16 @@
 // Storage size for an FFI type (extends 'ffi.NativeType').
 size_t ElementSizeInBytes(intptr_t class_id);
 
+// These ABIs should be kept in sync with pkg/vm/lib/transformations/ffi.dart.
+enum class Abi {
+  kWordSize64 = 0,
+  kWordSize32Align32 = 1,
+  kWordSize32Align64 = 2
+};
+
+// The target ABI. Defines sizes and alignment of native types.
+Abi TargetAbi();
+
 // Unboxed representation of an FFI type (extends 'ffi.NativeType').
 Representation TypeRepresentation(const AbstractType& result_type);
 
diff --git a/runtime/vm/compiler/ffi_dbc_trampoline.h b/runtime/vm/compiler/ffi_dbc_trampoline.h
index 578fc7f..656d1e1 100644
--- a/runtime/vm/compiler/ffi_dbc_trampoline.h
+++ b/runtime/vm/compiler/ffi_dbc_trampoline.h
@@ -9,8 +9,7 @@
 
 namespace dart {
 
-#if !defined(HOST_OS_WINDOWS) &&                                               \
-    (defined(HOST_ARCH_X64) || defined(HOST_ARCH_ARM64))
+#if defined(HOST_ARCH_X64) && !defined(HOST_OS_WINDOWS)
 
 // Generic Trampoline for DBC dart:ffi calls. Argument needs to be layed out as
 // a FfiMarshalledArguments.
diff --git a/runtime/vm/compiler/ffi_dbc_trampoline_arm64.S b/runtime/vm/compiler/ffi_dbc_trampoline_arm64.S
deleted file mode 100644
index 3c24411..0000000
--- a/runtime/vm/compiler/ffi_dbc_trampoline_arm64.S
+++ /dev/null
@@ -1,76 +0,0 @@
-#if defined(__aarch64__) /* HOST_ARCH_ARM64 */
-
-.text
-
-#if defined(__ANDROID__) || defined(__linux__) || defined(__FreeBSD__)
-/* HOST_OS_ANDROID || HOST_OS_LINUX */
-.global FfiTrampolineCall
-.align 2
-FfiTrampolineCall:
-#else /* HOST_OS_MACOS */
-.global _FfiTrampolineCall
-.align 2
-_FfiTrampolineCall:
-#endif
-
-/* Save argument in scratch register. */
-stp   x19,  x20, [sp, #-16]! /* Push x19 and x20, we use x19 as scratch. */
-mov   x19,  x0              /* Save argument in scratch register. */
-
-/* Enter frame. */
-stp   fp,   lr, [sp, #-16]!
-mov   fp,   sp
-
-/* Reserve framespace for arguments. */
-ldr   x9,   [x19, #(8*18)]  /* Load number of stack arguments. */
-lsl   x9,   x9,  #3         /* Multiply by size (8 bytes). */
-sub   sp,   sp,  x9         /* Reserve num_stack_args stack slots. */
-
-/* Stack alignment. */
-ldr   x10,  [x19, #(8*17)]  /* Load stack alignment mask. */
-mov   x11,  sp
-and   x11,  x11,  x10       /* Align stack. */
-mov   sp,   x11
-
-/* Copy stack arguments. */
-cmp   x9,   #0              /* Check if number of stack arguments is 0. */
-beq   .done                 /* Skip loop if no stack arguments. */
-add   x19,  x19, #(8*19)    /* Offset r19 to point to stack arguments. */
-.align 2
-.loop:                      /* Copy stack arguments loop. */
-sub   x9,   x9,   #8        /* Decrement stack argument iterator. */
-ldr   x10,  [x19, x9]       /* Load value from ffi_marshalled_args. */
-str   x10,  [sp,  x9]       /* Store value on stack. */
-cmp   x9,   #0              /* Compare iterator with 0 */
-bne   .loop                 /* Loop while iterator is not 0 */
-sub   x19,  x19, #(8*19)    /* Restore r19 to original value. */
-.align 2
-.done:                      /* End stack arguments loop. */
-
-/* Copy registers and fpu registers. */
-ldp   x0, x1, [x19, #(8*1)] /* and #(8*2) */
-ldp   x2, x3, [x19, #(8*3)] /* and #(8*4) */
-ldp   x4, x5, [x19, #(8*5)] /* ... */
-ldp   x6, x7, [x19, #(8*7)]
-ldp   d0, d1, [x19, #(8*9)]
-ldp   d2, d3, [x19, #(8*11)]
-ldp   d4, d5, [x19, #(8*13)]
-ldp   d6, d7, [x19, #(8*15)]
-
-/* Do call. */
-ldr   x9,   [x19]           /* Load function address. */
-blr   x9                    /* Call the function. */
-
-/* Copy results back. */
-str   x0,   [x19, #(8*0)]   /* Move integer result in kOffsetIntResult. */
-str   d0,   [x19, #(8*1)]   /* Move double result in kOffsetDoubleResult. */
-
-/* Leave frame. */
-mov   sp,   fp
-ldp   fp,   lr,  [sp], #16
-
-/* Restore caller saved register. */
-ldp   x19,  x20, [sp], #16   /* Pop x19 and x20. */
-ret
-
-#endif /* HOST_ARCH_ARM64 */
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
index 0753967..a717c3b 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.cc
@@ -7,6 +7,7 @@
 #include "vm/compiler/frontend/flow_graph_builder.h"  // For InlineExitCollector.
 #include "vm/compiler/jit/compiler.h"  // For Compiler::IsBackgroundCompilation().
 #include "vm/compiler/runtime_api.h"
+#include "vm/growable_array.h"
 #include "vm/object_store.h"
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
@@ -761,9 +762,9 @@
 }
 
 Fragment BaseFlowGraphBuilder::AllocateContext(
-    const GrowableArray<LocalVariable*>& context_variables) {
+    const ZoneGrowableArray<const Slot*>& context_slots) {
   AllocateContextInstr* allocate =
-      new (Z) AllocateContextInstr(TokenPosition::kNoSource, context_variables);
+      new (Z) AllocateContextInstr(TokenPosition::kNoSource, context_slots);
   Push(allocate);
   return Fragment(allocate);
 }
@@ -845,16 +846,14 @@
   code += LoadNativeField(Slot::Pointer_c_memory_address());
   LocalVariable* address = MakeTemporary();
 
-  auto& context_variables = CompilerState::Current().GetDummyContextVariables(
+  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
       /*context_id=*/0, /*num_variables=*/1);
-  code += AllocateContext(context_variables);
+  code += AllocateContext(context_slots);
   LocalVariable* context = MakeTemporary();
 
   code += LoadLocal(context);
   code += LoadLocal(address);
-  code += StoreInstanceField(
-      TokenPosition::kNoSource,
-      Slot::GetContextVariableSlotFor(thread_, *context_variables[0]));
+  code += StoreInstanceField(TokenPosition::kNoSource, *context_slots[0]);
 
   code += AllocateClosure(TokenPosition::kNoSource, target);
   LocalVariable* closure = MakeTemporary();
@@ -874,6 +873,126 @@
   return code;
 }
 
+Fragment BaseFlowGraphBuilder::DebugStepCheck(TokenPosition position) {
+#ifdef PRODUCT
+  return Fragment();
+#else
+  return Fragment(new (Z) DebugStepCheckInstr(
+      position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId()));
+#endif
+}
+
+Fragment BaseFlowGraphBuilder::CheckNull(TokenPosition position,
+                                         LocalVariable* receiver,
+                                         const String& function_name,
+                                         bool clear_the_temp /* = true */) {
+  Fragment instructions = LoadLocal(receiver);
+
+  CheckNullInstr* check_null =
+      new (Z) CheckNullInstr(Pop(), function_name, GetNextDeoptId(), position);
+
+  instructions <<= check_null;
+
+  if (clear_the_temp) {
+    // Null out receiver to make sure it is not saved into the frame before
+    // doing the call.
+    instructions += NullConstant();
+    instructions += StoreLocal(TokenPosition::kNoSource, receiver);
+    instructions += Drop();
+  }
+
+  return instructions;
+}
+
+void BaseFlowGraphBuilder::RecordUncheckedEntryPoint(
+    GraphEntryInstr* graph_entry,
+    FunctionEntryInstr* unchecked_entry) {
+  // Closures always check all arguments on their checked entry-point, most
+  // call-sites are unchecked, and they're inlined less often, so it's very
+  // beneficial to build multiple entry-points for them. Regular methods however
+  // have fewer checks to begin with since they have dynamic invocation
+  // forwarders, so in AOT we implement a more conservative time-space tradeoff
+  // by only building the unchecked entry-point when inlining. We should
+  // reconsider this heuristic if we identify non-inlined type-checks in
+  // hotspots of new benchmarks.
+  if (!IsInlining() && (parsed_function_->function().IsClosureFunction() ||
+                        !FLAG_precompiled_mode)) {
+    graph_entry->set_unchecked_entry(unchecked_entry);
+  } else if (InliningUncheckedEntry()) {
+    graph_entry->set_normal_entry(unchecked_entry);
+  }
+}
+
+Fragment BaseFlowGraphBuilder::BuildEntryPointsIntrospection() {
+  if (!FLAG_enable_testing_pragmas) return Drop();
+
+  auto& function = Function::Handle(Z, parsed_function_->function().raw());
+
+  if (function.IsImplicitClosureFunction()) {
+    const auto& parent = Function::Handle(Z, function.parent_function());
+    const auto& func_name = String::Handle(Z, parent.name());
+    const auto& owner = Class::Handle(Z, parent.Owner());
+    function = owner.LookupFunction(func_name);
+  }
+
+  Object& options = Object::Handle(Z);
+  if (!Library::FindPragma(thread_, /*only_core=*/false, function,
+                           Symbols::vm_trace_entrypoints(), &options) ||
+      options.IsNull() || !options.IsClosure()) {
+    return Drop();
+  }
+  auto& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
+  LocalVariable* entry_point_num = MakeTemporary();
+
+  auto& function_name = String::ZoneHandle(
+      Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
+  if (parsed_function_->function().IsImplicitClosureFunction()) {
+    function_name = String::Concat(
+        function_name, String::Handle(Z, String::New("#tearoff", Heap::kNew)),
+        Heap::kOld);
+  }
+
+  Fragment call_hook;
+  call_hook += Constant(closure);
+  call_hook += PushArgument();
+  call_hook += Constant(function_name);
+  call_hook += PushArgument();
+  call_hook += LoadLocal(entry_point_num);
+  call_hook += PushArgument();
+  call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
+  call_hook += ClosureCall(TokenPosition::kNoSource,
+                           /*type_args_len=*/0, /*argument_count=*/3,
+                           /*argument_names=*/Array::ZoneHandle(Z));
+  call_hook += Drop();  // result of closure call
+  call_hook += Drop();  // entrypoint number
+  return call_hook;
+}
+
+Fragment BaseFlowGraphBuilder::ClosureCall(TokenPosition position,
+                                           intptr_t type_args_len,
+                                           intptr_t argument_count,
+                                           const Array& argument_names,
+                                           bool is_statically_checked) {
+  Value* function = Pop();
+  const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
+  ArgumentArray arguments = GetArguments(total_count);
+  ClosureCallInstr* call = new (Z)
+      ClosureCallInstr(function, arguments, type_args_len, argument_names,
+                       position, GetNextDeoptId(),
+                       is_statically_checked ? Code::EntryKind::kUnchecked
+                                             : Code::EntryKind::kNormal);
+  Push(call);
+  return Fragment(call);
+}
+
+Fragment BaseFlowGraphBuilder::StringInterpolate(TokenPosition position) {
+  Value* array = Pop();
+  StringInterpolateInstr* interpolate =
+      new (Z) StringInterpolateInstr(array, position, GetNextDeoptId());
+  Push(interpolate);
+  return Fragment(interpolate);
+}
+
 }  // namespace kernel
 }  // namespace dart
 
diff --git a/runtime/vm/compiler/frontend/base_flow_graph_builder.h b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
index 330b03a..8f79aeb 100644
--- a/runtime/vm/compiler/frontend/base_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/base_flow_graph_builder.h
@@ -108,6 +108,32 @@
 
 typedef ZoneGrowableArray<PushArgumentInstr*>* ArgumentArray;
 
+// Indicates which form of the unchecked entrypoint we are compiling.
+//
+// kNone:
+//
+//   There is no unchecked entrypoint: the unchecked entry is set to NULL in
+//   the 'GraphEntryInstr'.
+//
+// kSeparate:
+//
+//   The normal and unchecked entrypoint each point to their own versions of
+//   the prologue, containing exactly those checks which need to be performed
+//   on either side. Both sides jump directly to the body after performing
+//   their prologue.
+//
+// kSharedWithVariable:
+//
+//   A temporary variable is allocated and initialized to 0 on normal entry
+//   and 2 on unchecked entry. Code which should be ommitted on the unchecked
+//   entrypoint is made conditional on this variable being equal to 0.
+//
+enum class UncheckedEntryPointStyle {
+  kNone = 0,
+  kSeparate = 1,
+  kSharedWithVariable = 2,
+};
+
 class BaseFlowGraphBuilder {
  public:
   BaseFlowGraphBuilder(
@@ -275,7 +301,7 @@
 
   Fragment AssertBool(TokenPosition position);
   Fragment BooleanNegate();
-  Fragment AllocateContext(const GrowableArray<LocalVariable*>& scope);
+  Fragment AllocateContext(const ZoneGrowableArray<const Slot*>& scope);
   Fragment AllocateClosure(TokenPosition position,
                            const Function& closure_function);
   Fragment CreateArray();
@@ -301,6 +327,40 @@
                           const Class& klass,
                           intptr_t argument_count);
 
+  Fragment DebugStepCheck(TokenPosition position);
+
+  // Loads 'receiver' and checks it for null. Throws NoSuchMethod if it is null.
+  // 'function_name' is a selector which is being called (reported in
+  // NoSuchMethod message).
+  // Sets 'receiver' to 'null' after the check if 'clear_the_temp'.
+  Fragment CheckNull(TokenPosition position,
+                     LocalVariable* receiver,
+                     const String& function_name,
+                     bool clear_the_temp = true);
+
+  // Records extra unchecked entry point 'unchecked_entry' in 'graph_entry'.
+  void RecordUncheckedEntryPoint(GraphEntryInstr* graph_entry,
+                                 FunctionEntryInstr* unchecked_entry);
+
+  // Pop the index of the current entry-point off the stack. If there is any
+  // entrypoint-tracing hook registered in a pragma for the function, it is
+  // called with the name of the current function and the current entry-point
+  // index.
+  Fragment BuildEntryPointsIntrospection();
+
+  // Builds closure call with given number of arguments. Target closure
+  // function is taken from top of the stack.
+  // PushArgument instructions should be already added for arguments.
+  Fragment ClosureCall(TokenPosition position,
+                       intptr_t type_args_len,
+                       intptr_t argument_count,
+                       const Array& argument_names,
+                       bool use_unchecked_entry = false);
+
+  // Builds StringInterpolate instruction, an equivalent of
+  // _StringBase._interpolate call.
+  Fragment StringInterpolate(TokenPosition position);
+
  protected:
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
 
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
index 5cd23a4..2fb99e5 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.cc
@@ -174,6 +174,9 @@
     if (parsed_function()->has_arg_desc_var()) {
       ++num_locals;
     }
+    if (parsed_function()->has_entry_points_temp_var()) {
+      ++num_locals;
+    }
 
     if (num_locals == 0) {
       return;
@@ -207,6 +210,11 @@
       parsed_function()->arg_desc_var()->set_index(VariableIndex(-idx));
       ++idx;
     }
+    if (parsed_function()->has_entry_points_temp_var()) {
+      parsed_function()->entry_points_temp_var()->set_index(
+          VariableIndex(-idx));
+      ++idx;
+    }
     ASSERT(idx == num_locals);
 
     ASSERT(parsed_function()->scope() == nullptr);
@@ -730,6 +738,13 @@
   }
 }
 
+void BytecodeFlowGraphBuilder::BuildDebugCheck() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+  code_ += B->DebugStepCheck(position_);
+}
+
 void BytecodeFlowGraphBuilder::BuildPushConstant() {
   PushConstant(ConstantAt(DecodeOperandD()));
 }
@@ -777,7 +792,7 @@
   const Function& target = Function::Cast(ConstantAt(DecodeOperandD()).value());
   const intptr_t argc = DecodeOperandF().value();
 
-  if (compiler::ffi::IsAsFunctionInternal(Z, Isolate::Current(), target)) {
+  if (compiler::ffi::IsAsFunctionInternal(Z, isolate(), target)) {
     BuildFfiAsFunction();
     return;
   }
@@ -795,6 +810,21 @@
     }
   }
 
+  if (!FLAG_causal_async_stacks &&
+      target.recognized_kind() == MethodRecognizer::kAsyncStackTraceHelper) {
+    ASSERT(argc == 1);
+    // Drop the ignored parameter to _asyncStackTraceHelper(:async_op).
+    code_ += B->Drop();
+    code_ += B->NullConstant();
+    return;
+  }
+
+  if (target.recognized_kind() == MethodRecognizer::kStringBaseInterpolate) {
+    ASSERT(argc == 1);
+    code_ += B->StringInterpolate(position_);
+    return;
+  }
+
   const Array& arg_desc_array =
       Array::Cast(ConstantAt(DecodeOperandD(), 1).value());
   const ArgumentsDescriptor arg_desc(arg_desc_array);
@@ -808,15 +838,19 @@
       Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), arguments,
       *ic_data_array_, B->GetNextDeoptId(), ICData::kStatic);
 
-  // TODO(alexmarkov): add type info
-  // SetResultTypeForStaticCall(call, target, argument_count, result_type);
+  if (target.MayHaveUncheckedEntryPoint(isolate())) {
+    call->set_entry_kind(Code::EntryKind::kUnchecked);
+  }
+
+  call->InitResultType(Z);
 
   code_ <<= call;
   B->Push(call);
 }
 
 void BytecodeFlowGraphBuilder::BuildInterfaceCallCommon(
-    bool is_unchecked_call) {
+    bool is_unchecked_call,
+    bool is_instantiated_call) {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
   }
@@ -837,7 +871,7 @@
   if (token_kind != Token::kILLEGAL) {
     intptr_t argument_count = arg_desc.Count();
     ASSERT(argument_count <= 2);
-    checked_argument_count = argument_count;
+    checked_argument_count = (token_kind == Token::kSET) ? 1 : argument_count;
   } else if (Library::IsPrivateCoreLibName(name,
                                            Symbols::_simpleInstanceOf())) {
     ASSERT(arg_desc.Count() == 2);
@@ -860,16 +894,63 @@
     call->set_entry_kind(Code::EntryKind::kUnchecked);
   }
 
+  if (is_instantiated_call) {
+    const AbstractType& static_receiver_type =
+        AbstractType::Cast(ConstantAt(DecodeOperandD(), 2).value());
+    call->set_receivers_static_type(&static_receiver_type);
+  } else {
+    const Class& owner = Class::Handle(Z, interface_target.Owner());
+    const AbstractType& type =
+        AbstractType::ZoneHandle(Z, owner.DeclarationType());
+    call->set_receivers_static_type(&type);
+  }
+
   code_ <<= call;
   B->Push(call);
 }
 
 void BytecodeFlowGraphBuilder::BuildInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/false);
+  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
+                           /*is_instantiated_call=*/false);
+}
+
+void BytecodeFlowGraphBuilder::BuildInstantiatedInterfaceCall() {
+  BuildInterfaceCallCommon(/*is_unchecked_call=*/false,
+                           /*is_instantiated_call=*/true);
 }
 
 void BytecodeFlowGraphBuilder::BuildUncheckedInterfaceCall() {
-  BuildInterfaceCallCommon(/*is_unchecked_call=*/true);
+  BuildInterfaceCallCommon(/*is_unchecked_call=*/true,
+                           /*is_instantiated_call=*/false);
+}
+
+void BytecodeFlowGraphBuilder::BuildUncheckedClosureCall() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+
+  const Array& arg_desc_array =
+      Array::Cast(ConstantAt(DecodeOperandD()).value());
+  const ArgumentsDescriptor arg_desc(arg_desc_array);
+
+  const intptr_t argc = DecodeOperandF().value();
+
+  LocalVariable* receiver_temp = B->MakeTemporary();
+  code_ += B->CheckNull(position_, receiver_temp, Symbols::Call(),
+                        /*clear_temp=*/false);
+
+  code_ += B->LoadNativeField(Slot::Closure_function());
+  Value* function = Pop();
+
+  const ArgumentArray arguments = GetArguments(argc);
+
+  ClosureCallInstr* call = new (Z) ClosureCallInstr(
+      function, arguments, arg_desc.TypeArgsLen(),
+      Array::ZoneHandle(Z, arg_desc.GetArgumentNames()), position_,
+      B->GetNextDeoptId(), Code::EntryKind::kUnchecked);
+
+  code_ <<= call;
+  B->Push(call);
 }
 
 void BytecodeFlowGraphBuilder::BuildDynamicCall() {
@@ -965,9 +1046,9 @@
   const intptr_t context_id = DecodeOperandA().value();
   const intptr_t num_context_vars = DecodeOperandE().value();
 
-  auto& context_variables = CompilerState::Current().GetDummyContextVariables(
+  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
       context_id, num_context_vars);
-  code_ += B->AllocateContext(context_variables);
+  code_ += B->AllocateContext(context_slots);
 }
 
 void BytecodeFlowGraphBuilder::BuildCloneContext() {
@@ -979,10 +1060,10 @@
   const intptr_t context_id = DecodeOperandA().value();
   const intptr_t num_context_vars = DecodeOperandE().value();
 
-  auto& context_variables = CompilerState::Current().GetDummyContextVariables(
+  auto& context_slots = CompilerState::Current().GetDummyContextSlots(
       context_id, num_context_vars);
   CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), context_variables, B->GetNextDeoptId());
+      TokenPosition::kNoSource, Pop(), context_slots, B->GetNextDeoptId());
   code_ <<= clone_instruction;
   B->Push(clone_instruction);
 }
@@ -1312,6 +1393,112 @@
   BuildJumpIfStrictCompare(Token::kNE);
 }
 
+void BytecodeFlowGraphBuilder::BuildJumpIfUnchecked() {
+  if (is_generating_interpreter()) {
+    UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
+  }
+
+  ASSERT(IsStackEmpty());
+
+  const intptr_t target_pc = pc_ + DecodeOperandT().value();
+  JoinEntryInstr* target = jump_targets_.Lookup(target_pc);
+  ASSERT(target != nullptr);
+  FunctionEntryInstr* unchecked_entry = nullptr;
+  const intptr_t kCheckedEntry =
+      static_cast<intptr_t>(UncheckedEntryPointStyle::kNone);
+  const intptr_t kUncheckedEntry =
+      static_cast<intptr_t>(UncheckedEntryPointStyle::kSharedWithVariable);
+
+  switch (entry_point_style_) {
+    case UncheckedEntryPointStyle::kNone: {
+      JoinEntryInstr* do_checks = B->BuildJoinEntry();
+      code_ += B->Goto(B->InliningUncheckedEntry() ? target : do_checks);
+      code_ = Fragment(do_checks);
+    } break;
+
+    case UncheckedEntryPointStyle::kSeparate: {
+      // Route normal entry to checks.
+      if (FLAG_enable_testing_pragmas) {
+        code_ += B->IntConstant(kCheckedEntry);
+        code_ += B->BuildEntryPointsIntrospection();
+      }
+      Fragment do_checks = code_;
+
+      // Create a separate unchecked entry point.
+      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
+      code_ = Fragment(unchecked_entry);
+
+      // Re-build prologue for unchecked entry point. It can only contain
+      // Entry, CheckStack and DebugCheck instructions.
+      bytecode_instr_ = raw_bytecode_;
+      ASSERT(KernelBytecode::IsEntryOpcode(bytecode_instr_));
+      bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
+      while (!KernelBytecode::IsJumpIfUncheckedOpcode(bytecode_instr_)) {
+        ASSERT(KernelBytecode::IsCheckStackOpcode(bytecode_instr_) ||
+               KernelBytecode::IsDebugCheckOpcode(bytecode_instr_));
+        ASSERT(jump_targets_.Lookup(bytecode_instr_ - raw_bytecode_) ==
+               nullptr);
+        BuildInstruction(KernelBytecode::DecodeOpcode(bytecode_instr_));
+        bytecode_instr_ = KernelBytecode::Next(bytecode_instr_);
+      }
+      ASSERT((bytecode_instr_ - raw_bytecode_) == pc_);
+
+      if (FLAG_enable_testing_pragmas) {
+        code_ += B->IntConstant(
+            static_cast<intptr_t>(UncheckedEntryPointStyle::kSeparate));
+        code_ += B->BuildEntryPointsIntrospection();
+      }
+      code_ += B->Goto(target);
+
+      code_ = do_checks;
+    } break;
+
+    case UncheckedEntryPointStyle::kSharedWithVariable: {
+      LocalVariable* ep_var = parsed_function()->entry_points_temp_var();
+
+      // Dispatch based on the value of entry_points_temp_var.
+      TargetEntryInstr *do_checks, *skip_checks;
+      if (FLAG_enable_testing_pragmas) {
+        code_ += B->LoadLocal(ep_var);
+        code_ += B->BuildEntryPointsIntrospection();
+      }
+      code_ += B->LoadLocal(ep_var);
+      code_ += B->IntConstant(kUncheckedEntry);
+      code_ += B->BranchIfEqual(&skip_checks, &do_checks, /*negate=*/false);
+
+      code_ = Fragment(skip_checks);
+      code_ += B->Goto(target);
+
+      // Relink the body of the function from normal entry to 'prologue_join'.
+      JoinEntryInstr* prologue_join = B->BuildJoinEntry();
+      FunctionEntryInstr* normal_entry = graph_entry_->normal_entry();
+      if (normal_entry->next() != nullptr) {
+        prologue_join->LinkTo(normal_entry->next());
+        normal_entry->set_next(nullptr);
+      }
+
+      unchecked_entry = B->BuildFunctionEntry(graph_entry_);
+      code_ = Fragment(unchecked_entry);
+      code_ += B->IntConstant(kUncheckedEntry);
+      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
+      code_ += B->Drop();
+      code_ += B->Goto(prologue_join);
+
+      code_ = Fragment(normal_entry);
+      code_ += B->IntConstant(kCheckedEntry);
+      code_ += B->StoreLocal(TokenPosition::kNoSource, ep_var);
+      code_ += B->Drop();
+      code_ += B->Goto(prologue_join);
+
+      code_ = Fragment(do_checks);
+    } break;
+  }
+
+  if (unchecked_entry != nullptr) {
+    B->RecordUncheckedEntryPoint(graph_entry_, unchecked_entry);
+  }
+}
+
 void BytecodeFlowGraphBuilder::BuildDrop1() {
   if (is_generating_interpreter()) {
     UNIMPLEMENTED();  // TODO(alexmarkov): interpreter
@@ -1679,12 +1866,29 @@
     const PcDescriptors& descriptors,
     const ExceptionHandlers& handlers,
     GraphEntryInstr* graph_entry) {
+  bool seen_jump_if_unchecked = false;
   for (intptr_t pc = 0; pc < bytecode_length_;) {
     const KBCInstr* instr = &(raw_bytecode_[pc]);
 
     if (KernelBytecode::IsJumpOpcode(instr)) {
       const intptr_t target = pc + KernelBytecode::DecodeT(instr);
       EnsureControlFlowJoin(descriptors, target);
+
+      if (KernelBytecode::IsJumpIfUncheckedOpcode(instr)) {
+        if (seen_jump_if_unchecked) {
+          FATAL1(
+              "Multiple JumpIfUnchecked bytecode instructions are not allowed: "
+              "%s.",
+              function().ToFullyQualifiedCString());
+        }
+        seen_jump_if_unchecked = true;
+        ASSERT(entry_point_style_ == UncheckedEntryPointStyle::kNone);
+        entry_point_style_ = ChooseEntryPointStyle(instr);
+        if (entry_point_style_ ==
+            UncheckedEntryPointStyle::kSharedWithVariable) {
+          parsed_function_->EnsureEntryPointsTemp();
+        }
+      }
     } else if (KernelBytecode::IsCheckStackOpcode(instr) &&
                (KernelBytecode::DecodeA(instr) != 0)) {
       // (dartbug.com/36590) BlockEntryInstr::FindOsrEntryAndRelink assumes
@@ -1753,6 +1957,37 @@
   }
 }
 
+UncheckedEntryPointStyle BytecodeFlowGraphBuilder::ChooseEntryPointStyle(
+    const KBCInstr* jump_if_unchecked) {
+  ASSERT(KernelBytecode::IsJumpIfUncheckedOpcode(jump_if_unchecked));
+
+  if (!function().MayHaveUncheckedEntryPoint(isolate())) {
+    return UncheckedEntryPointStyle::kNone;
+  }
+
+  // Separate entry points are used if bytecode has the following pattern:
+  //   Entry
+  //   CheckStack (optional)
+  //   DebugCheck (optional)
+  //   JumpIfUnchecked
+  //
+  const KBCInstr* instr = raw_bytecode_;
+  if (!KernelBytecode::IsEntryOpcode(instr)) {
+    return UncheckedEntryPointStyle::kSharedWithVariable;
+  }
+  instr = KernelBytecode::Next(instr);
+  if (KernelBytecode::IsCheckStackOpcode(instr)) {
+    instr = KernelBytecode::Next(instr);
+  }
+  if (KernelBytecode::IsDebugCheckOpcode(instr)) {
+    instr = KernelBytecode::Next(instr);
+  }
+  if (instr != jump_if_unchecked) {
+    return UncheckedEntryPointStyle::kSharedWithVariable;
+  }
+  return UncheckedEntryPointStyle::kSeparate;
+}
+
 void BytecodeFlowGraphBuilder::CreateParameterVariables() {
   const Bytecode& bytecode = Bytecode::Handle(Z, function().bytecode());
   object_pool_ = bytecode.object_pool();
@@ -1781,18 +2016,17 @@
 
   ProcessICDataInObjectPool(object_pool_);
 
-  GraphEntryInstr* graph_entry =
-      new (Z) GraphEntryInstr(*parsed_function_, B->osr_id_);
+  graph_entry_ = new (Z) GraphEntryInstr(*parsed_function_, B->osr_id_);
 
-  auto normal_entry = B->BuildFunctionEntry(graph_entry);
-  graph_entry->set_normal_entry(normal_entry);
+  auto normal_entry = B->BuildFunctionEntry(graph_entry_);
+  graph_entry_->set_normal_entry(normal_entry);
 
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(Z, bytecode.pc_descriptors());
   const ExceptionHandlers& handlers =
       ExceptionHandlers::Handle(Z, bytecode.exception_handlers());
 
-  CollectControlFlow(descriptors, handlers, graph_entry);
+  CollectControlFlow(descriptors, handlers, graph_entry_);
 
   kernel::BytecodeSourcePositionsIterator source_pos_iter(Z, bytecode);
   bool update_position = source_pos_iter.MoveNext();
@@ -1841,11 +2075,11 @@
   // Catch entries are always considered reachable, even if they
   // become unreachable after OSR.
   if (B->IsCompiledForOsr()) {
-    graph_entry->RelinkToOsrEntry(Z, B->last_used_block_id_ + 1);
+    graph_entry_->RelinkToOsrEntry(Z, B->last_used_block_id_ + 1);
   }
 
   FlowGraph* flow_graph = new (Z) FlowGraph(
-      *parsed_function_, graph_entry, B->last_used_block_id_, prologue_info_);
+      *parsed_function_, graph_entry_, B->last_used_block_id_, prologue_info_);
 
   if (FLAG_print_flow_graph_from_bytecode) {
     FlowGraphPrinter::PrintGraph("Constructed from bytecode", flow_graph);
diff --git a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
index e03a502..1373875 100644
--- a/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
+++ b/runtime/vm/compiler/frontend/bytecode_flow_graph_builder.h
@@ -147,7 +147,8 @@
                         int num_args);
   void BuildIntOp(const String& name, Token::Kind token_kind, int num_args);
   void BuildDoubleOp(const String& name, Token::Kind token_kind, int num_args);
-  void BuildInterfaceCallCommon(bool is_unchecked_call);
+  void BuildInterfaceCallCommon(bool is_unchecked_call,
+                                bool is_instantiated_call);
 
   void BuildInstruction(KernelBytecode::Opcode opcode);
   void BuildFfiAsFunction();
@@ -166,6 +167,10 @@
                           const ExceptionHandlers& handlers,
                           GraphEntryInstr* graph_entry);
 
+  // Figure out entry points style.
+  UncheckedEntryPointStyle ChooseEntryPointStyle(
+      const KBCInstr* jump_if_unchecked);
+
   Thread* thread() const { return flow_graph_builder_->thread_; }
   Isolate* isolate() const { return thread()->isolate(); }
 
@@ -189,7 +194,7 @@
   intptr_t pc_;
   intptr_t next_pc_ = -1;
   const KBCInstr* bytecode_instr_ = nullptr;
-  TokenPosition position_;  // TODO(alexmarkov): Set/update.
+  TokenPosition position_;
   Fragment code_;
   ZoneGrowableArray<LocalVariable*> local_vars_;
   ZoneGrowableArray<LocalVariable*> parameters_;
@@ -200,6 +205,8 @@
   IntMap<Value*> stack_states_;
   PrologueInfo prologue_info_;
   JoinEntryInstr* throw_no_such_method_;
+  GraphEntryInstr* graph_entry_ = nullptr;
+  UncheckedEntryPointStyle entry_point_style_ = UncheckedEntryPointStyle::kNone;
 };
 
 }  // namespace kernel
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.cc b/runtime/vm/compiler/frontend/bytecode_reader.cc
index 660375c..147544b 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.cc
+++ b/runtime/vm/compiler/frontend/bytecode_reader.cc
@@ -201,6 +201,10 @@
   ASSERT(code_offset > 0);
 
   AlternativeReadingScope alt(&reader_, code_offset);
+  // This scope is needed to set active_class_->enclosing_ which is used to
+  // assign parent function for function types.
+  ActiveEnclosingFunctionScope active_enclosing_function(active_class_,
+                                                         &function);
 
   const intptr_t flags = reader_.ReadUInt();
   const bool has_exceptions_table =
@@ -251,7 +255,7 @@
     // TODO(alexmarkov): allocate deopt_ids for closures separately
     DeoptIdScope deopt_id_scope(thread_, 0);
 
-    ReadConstantPool(function, pool);
+    ReadConstantPool(function, pool, 0);
   }
 
   // Read bytecode and attach to function.
@@ -481,7 +485,7 @@
   Object& parent = Object::Handle(Z, ReadObject());
   if (!parent.IsFunction()) {
     ASSERT(parent.IsField());
-    ASSERT(function.kind() == RawFunction::kStaticFieldInitializer);
+    ASSERT(function.kind() == RawFunction::kFieldInitializer);
     // Closure in a static field initializer, so use current function as parent.
     parent = function.raw();
   }
@@ -653,19 +657,37 @@
     // Do not set type parameters for factories, as VM uses class type
     // parameters instead.
     parameterized_function.set_type_parameters(type_parameters);
-    function_type_type_parameters_ = &type_parameters;
+    if (parameterized_function.IsSignatureFunction()) {
+      if (function_type_type_parameters_ == nullptr) {
+        function_type_type_parameters_ = &type_parameters;
+      } else {
+        function_type_type_parameters_ = &TypeArguments::Handle(
+            Z, function_type_type_parameters_->ConcatenateTypeParameters(
+                   Z, type_parameters));
+      }
+    } else {
+      ASSERT(function_type_type_parameters_ == nullptr);
+    }
   }
 
   // Step b) Fill in the bounds of all [TypeParameter]s.
   for (intptr_t i = 0; i < num_type_params; ++i) {
     parameter ^= type_parameters.TypeAt(i);
     bound ^= ReadObject();
+    // Convert dynamic to Object in bounds of type parameters so
+    // they are equivalent when doing subtype checks for function types.
+    // TODO(https://github.com/dart-lang/language/issues/495): revise this
+    // when function subtyping is fixed.
+    if (bound.IsDynamicType()) {
+      bound = I->object_store()->object_type();
+    }
     parameter.set_bound(bound);
   }
 }
 
-void BytecodeReaderHelper::ReadConstantPool(const Function& function,
-                                            const ObjectPool& pool) {
+intptr_t BytecodeReaderHelper::ReadConstantPool(const Function& function,
+                                                const ObjectPool& pool,
+                                                intptr_t start_index) {
   TIMELINE_DURATION(Thread::Current(), CompilerVerbose,
                     "BytecodeReaderHelper::ReadConstantPool");
 
@@ -702,6 +724,7 @@
     kObjectRef,
     kDirectCall,
     kInterfaceCall,
+    kInstantiatedInterfaceCall,
   };
 
   enum InvocationKind {
@@ -721,7 +744,7 @@
   String& name = String::Handle(Z);
   const String* simpleInstanceOf = nullptr;
   const intptr_t obj_count = pool.Length();
-  for (intptr_t i = 0; i < obj_count; ++i) {
+  for (intptr_t i = start_index; i < obj_count; ++i) {
     const intptr_t tag = reader_.ReadTag();
     switch (tag) {
       case ConstantPoolTag::kInvalid:
@@ -741,13 +764,16 @@
               &Library::PrivateCoreLibName(Symbols::_simpleInstanceOf());
         }
         intptr_t checked_argument_count = 1;
-        if ((kind == InvocationKind::method) &&
-            ((MethodTokenRecognizer::RecognizeTokenKind(name) !=
-              Token::kILLEGAL) ||
-             (name.raw() == simpleInstanceOf->raw()))) {
-          intptr_t argument_count = ArgumentsDescriptor(array).Count();
-          ASSERT(argument_count <= 2);
-          checked_argument_count = argument_count;
+        if (kind == InvocationKind::method) {
+          const Token::Kind token_kind =
+              MethodTokenRecognizer::RecognizeTokenKind(name);
+          if ((token_kind != Token::kILLEGAL) ||
+              (name.raw() == simpleInstanceOf->raw())) {
+            intptr_t argument_count = ArgumentsDescriptor(array).Count();
+            ASSERT(argument_count <= 2);
+            checked_argument_count =
+                (token_kind == Token::kSET) ? 1 : argument_count;
+          }
         }
         // Do not mangle == or call:
         //   * operator == takes an Object so its either not checked or checked
@@ -799,11 +825,30 @@
         intptr_t closure_index = reader_.ReadUInt();
         obj = closures_->At(closure_index);
         ASSERT(obj.IsFunction());
-      } break;
+        // Set current entry.
+        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
+                       ObjectPool::Patchability::kNotPatchable);
+        pool.SetObjectAt(i, obj);
+
+        // This scope is needed to set active_class_->enclosing_ which is used
+        // to assign parent function for function types.
+        ActiveEnclosingFunctionScope active_enclosing_function(
+            active_class_, &Function::Cast(obj));
+
+        // Read constant pool until corresponding EndClosureFunctionScope.
+        i = ReadConstantPool(function, pool, i + 1);
+
+        // Proceed with the rest of entries.
+        continue;
+      }
       case ConstantPoolTag::kEndClosureFunctionScope: {
-        // Entry is not used and set to null.
+        // EndClosureFunctionScope entry is not used and set to null.
         obj = Object::null();
-      } break;
+        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
+                       ObjectPool::Patchability::kNotPatchable);
+        pool.SetObjectAt(i, obj);
+        return i;
+      }
       case ConstantPoolTag::kNativeEntry: {
         name = ReadString();
         obj = NativeEntry(function, name);
@@ -847,6 +892,26 @@
         // The second entry is used for arguments descriptor.
         obj = ReadObject();
       } break;
+      case ConstantPoolTag::kInstantiatedInterfaceCall: {
+        elem = ReadObject();
+        ASSERT(elem.IsFunction());
+        // InstantiatedInterfaceCall constant occupies 3 entries:
+        // 1) Interface target.
+        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
+                       ObjectPool::Patchability::kNotPatchable);
+        pool.SetObjectAt(i, elem);
+        ++i;
+        ASSERT(i < obj_count);
+        // 2) Arguments descriptor.
+        obj = ReadObject();
+        pool.SetTypeAt(i, ObjectPool::EntryType::kTaggedObject,
+                       ObjectPool::Patchability::kNotPatchable);
+        pool.SetObjectAt(i, obj);
+        ++i;
+        ASSERT(i < obj_count);
+        // 3) Static receiver type.
+        obj = ReadObject();
+      } break;
       default:
         UNREACHABLE();
     }
@@ -854,6 +919,8 @@
                    ObjectPool::Patchability::kNotPatchable);
     pool.SetObjectAt(i, obj);
   }
+
+  return obj_count - 1;
 }
 
 RawBytecode* BytecodeReaderHelper::ReadBytecode(const ObjectPool& pool) {
@@ -1000,7 +1067,15 @@
     case MethodRecognizer::kLinkedHashMap_setUsedData:
     case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
     case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
+    case MethodRecognizer::kFfiAbi:
       break;
+    case MethodRecognizer::kAsyncStackTraceHelper:
+      // If causal async stacks are disabled the interpreter.cc will handle this
+      // native call specially.
+      if (!FLAG_causal_async_stacks) {
+        break;
+      }
+      FALL_THROUGH;
     default:
       kind = MethodRecognizer::kUnknown;
   }
@@ -1268,7 +1343,15 @@
         uri ^= ReadObject();
       }
       RawLibrary* library = Library::LookupLibrary(thread_, uri);
+      NoSafepointScope no_safepoint_scope(thread_);
       if (library == Library::null()) {
+        // We do not register expression evaluation libraries with the VM:
+        // The expression evaluation functions should be GC-able as soon as
+        // they are not reachable anymore and we never look them up by name.
+        if (uri.raw() == Symbols::EvalSourceUri().raw()) {
+          ASSERT(expression_evaluation_library_ != nullptr);
+          return expression_evaluation_library_->raw();
+        }
         FATAL1("Unable to find library %s", uri.ToCString());
       }
       return library;
@@ -1296,7 +1379,7 @@
       const Class& cls = Class::CheckedHandle(Z, ReadObject());
       String& name = String::CheckedHandle(Z, ReadObject());
       if ((flags & kFlagIsField) != 0) {
-        RawField* field = cls.LookupFieldAllowPrivate(name);
+        RawField* field = cls.LookupField(name);
         NoSafepointScope no_safepoint_scope(thread_);
         if (field == Field::null()) {
           FATAL2("Unable to find field %s in %s", name.ToCString(),
@@ -1312,7 +1395,7 @@
             cls.raw() == scoped_function_class_.raw()) {
           return scoped_function_.raw();
         }
-        RawFunction* function = cls.LookupFunctionAllowPrivate(name);
+        RawFunction* function = cls.LookupFunction(name);
         {
           // To verify that it's OK to hold raw function pointer at this point.
           NoSafepointScope no_safepoint_scope(thread_);
@@ -1322,9 +1405,10 @@
           if (Field::IsGetterName(name)) {
             String& method_name =
                 String::Handle(Z, Field::NameFromGetter(name));
-            function = cls.LookupFunctionAllowPrivate(method_name);
+            function = cls.LookupFunction(method_name);
             if (function != Function::null()) {
-              function = Function::Handle(Z, function).GetMethodExtractor(name);
+              function =
+                  Function::Handle(Z, function).CreateMethodExtractor(name);
               if (function != Function::null()) {
                 return function;
               }
@@ -1404,6 +1488,11 @@
                                                 : Function::null_function(),
                                             TokenPosition::kNoSource));
 
+      // This scope is needed to set active_class_->enclosing_ which is used
+      // to assign parent function for function types.
+      ActiveEnclosingFunctionScope active_enclosing_function(
+          active_class_, &signature_function);
+
       return ReadFunctionSignature(
           signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
           (flags & kFlagHasOptionalNamedParams) != 0,
@@ -1709,6 +1798,12 @@
                                                 ? *active_class_->enclosing
                                                 : Function::null_function(),
                                             TokenPosition::kNoSource));
+
+      // This scope is needed to set active_class_->enclosing_ which is used to
+      // assign parent function for function types.
+      ActiveEnclosingFunctionScope active_enclosing_function(
+          active_class_, &signature_function);
+
       // TODO(alexmarkov): skip type finalization
       return ReadFunctionSignature(
           signature_function, (flags & kFlagHasOptionalPositionalParams) != 0,
@@ -1861,6 +1956,7 @@
   const int kHasAnnotationsFlag = 1 << 10;
   const int kHasPragmaFlag = 1 << 11;
   const int kHasCustomScriptFlag = 1 << 12;
+  const int kHasInitializerCodeFlag = 1 << 13;
 
   const int num_fields = reader_.ReadListLength();
   if ((num_fields == 0) && !cls.is_enum_class()) {
@@ -1917,6 +2013,7 @@
       if (is_static) {
         field.SetStaticValue(value, true);
       } else {
+        field.set_saved_initial_value(value);
         // Null-initialized instance fields are tracked separately for each
         // constructor (see handling of kHasNullableFieldsFlag).
         if (!value.IsNull()) {
@@ -1931,11 +2028,19 @@
       }
     }
 
-    if (has_initializer && is_static) {
+    static_assert(KernelBytecode::kMinSupportedBytecodeFormatVersion < 14,
+                  "Cleanup support for old bytecode format versions");
+    const bool has_initializer_code =
+        bytecode_component_->GetVersion() >= 14
+            ? (flags & kHasInitializerCodeFlag) != 0
+            : has_initializer && is_static;
+    if (has_initializer_code) {
       const intptr_t code_offset = reader_.ReadUInt();
       field.set_bytecode_offset(code_offset +
                                 bytecode_component_->GetCodesOffset());
-      field.SetStaticValue(Object::sentinel(), true);
+      if (is_static) {
+        field.SetStaticValue(Object::sentinel(), true);
+      }
     }
 
     if ((flags & kHasGetterFlag) != 0) {
@@ -2116,14 +2221,14 @@
       name = ConstructorName(cls, name);
     }
 
-    // Expression evaluation functions are not supported yet.
-    ASSERT(!name.Equals(Symbols::DebugProcedureName()));
-
     function = Function::New(name, kind, is_static, (flags & kIsConstFlag) != 0,
                              (flags & kIsAbstractFlag) != 0,
                              (flags & kIsExternalFlag) != 0, is_native,
                              script_class, position);
 
+    const bool is_expression_evaluation =
+        (name.raw() == Symbols::DebugProcedureName().raw());
+
     // Declare function scope as types (type parameters) in function
     // signature may back-reference to the function being declared.
     // At this moment, owner class is not fully loaded yet and it won't be
@@ -2174,7 +2279,15 @@
 
     intptr_t param_index = 0;
     if (!is_static) {
-      function.SetParameterTypeAt(param_index, H.GetDeclarationType(cls));
+      if (is_expression_evaluation) {
+        // Do not reference enclosing class as expression evaluation
+        // method logically belongs to another (real) class.
+        // Enclosing class is not registered and doesn't have
+        // a valid cid, so it can't be used in a type.
+        function.SetParameterTypeAt(param_index, AbstractType::dynamic_type());
+      } else {
+        function.SetParameterTypeAt(param_index, H.GetDeclarationType(cls));
+      }
       function.SetParameterNameAt(param_index, Symbols::This());
       ++param_index;
     } else if (is_factory) {
@@ -2235,6 +2348,18 @@
       }
     }
 
+    if (is_expression_evaluation) {
+      H.SetExpressionEvaluationFunction(function);
+      // Read bytecode of expression evaluation function eagerly,
+      // while expression_evaluation_library_ and FunctionScope
+      // are still set, as its constant pool may reference back to a library
+      // or a function which are not registered and cannot be looked up.
+      ASSERT(!function.is_abstract());
+      ASSERT(function.bytecode_offset() != 0);
+      CompilerState compiler_state(thread_);
+      ReadCode(function, function.bytecode_offset());
+    }
+
     functions_->SetAt(function_index_++, function);
   }
 
@@ -2378,19 +2503,15 @@
   ASSERT(library.toplevel_class() == Object::null());
 
   // TODO(alexmarkov): fill in library.owned_scripts.
-  //
-  // TODO(alexmarkov): figure out if we need to finish class loading immediately
-  //  in case of 'loading_native_wrappers_library_ ' or '!register_class'.
-  //
-  // TODO(alexmarkov): support native extension libraries.
-  //
 
   const intptr_t flags = reader_.ReadUInt();
   if (((flags & kUsesDartMirrorsFlag) != 0) && !FLAG_enable_mirrors) {
-    H.ReportError("import of dart:mirrors with --enable-mirrors=false");
+    H.ReportError(
+        "import of dart:mirrors is not supported in the current Dart runtime");
   }
   if (((flags & kUsesDartFfiFlag) != 0) && !Api::IsFfiEnabled()) {
-    H.ReportError("import of dart:ffi with --enable-ffi=false");
+    H.ReportError(
+        "import of dart:ffi is not supported in the current Dart runtime");
   }
 
   auto& name = String::CheckedHandle(Z, ReadObject());
@@ -2446,9 +2567,7 @@
       ASSERT(name.raw() == Symbols::Empty().raw());
       cls = Class::New(library, Symbols::TopLevel(), script,
                        TokenPosition::kNoSource, register_class);
-      if (register_class) {
-        library.set_toplevel_class(cls);
-      }
+      library.set_toplevel_class(cls);
     } else {
       if (lookup_classes) {
         cls = library.LookupLocalClass(name);
@@ -2472,6 +2591,7 @@
     if (loading_native_wrappers_library_ || !register_class) {
       AlternativeReadingScope alt(&reader_, class_offset);
       ReadClassDeclaration(cls);
+      ActiveClassScope active_class_scope(active_class_, &cls);
       AlternativeReadingScope alt2(&reader_, cls.bytecode_offset());
       ReadMembers(cls, /* discard_fields = */ false);
     }
@@ -2574,6 +2694,123 @@
   }
 }
 
+RawObject* BytecodeReaderHelper::BuildParameterDescriptor(
+    const Function& function) {
+  ASSERT(function.is_declared_in_bytecode());
+
+  Object& result = Object::Handle(Z);
+  if (!function.HasBytecode()) {
+    result = BytecodeReader::ReadFunctionBytecode(Thread::Current(), function);
+    if (result.IsError()) {
+      return result.raw();
+    }
+  }
+
+  const intptr_t num_params = function.NumParameters();
+  const intptr_t num_implicit_params = function.NumImplicitParameters();
+  const intptr_t num_explicit_params = num_params - num_implicit_params;
+  const Array& descriptor = Array::Handle(
+      Z, Array::New(num_explicit_params * Parser::kParameterEntrySize));
+
+  // 1. Find isFinal in the Code declaration.
+  bool found_final = false;
+  if (!function.is_abstract()) {
+    AlternativeReadingScope alt(&reader_, function.bytecode_offset());
+    const intptr_t code_flags = reader_.ReadUInt();
+
+    if ((code_flags & Code::kHasParameterFlagsFlag) != 0) {
+      const intptr_t num_explicit_params_written = reader_.ReadUInt();
+      ASSERT(num_explicit_params == num_explicit_params_written);
+      for (intptr_t i = 0; i < num_explicit_params; ++i) {
+        const intptr_t flags = reader_.ReadUInt();
+        descriptor.SetAt(
+            i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
+            Bool::Get((flags & Parameter::kIsFinalFlag) != 0));
+      }
+      found_final = true;
+    }
+  }
+  if (!found_final) {
+    for (intptr_t i = 0; i < num_explicit_params; ++i) {
+      descriptor.SetAt(
+          i * Parser::kParameterEntrySize + Parser::kParameterIsFinalOffset,
+          Bool::Get(false));
+    }
+  }
+
+  // 2. Find metadata implicitly after the function declaration's metadata.
+  const Class& klass = Class::Handle(Z, function.Owner());
+  const Library& library = Library::Handle(Z, klass.library());
+  const Object& metadata = Object::Handle(
+      Z, library.GetExtendedMetadata(function, num_explicit_params));
+  if (metadata.IsError()) {
+    return metadata.raw();
+  }
+  if (Array::Cast(metadata).Length() != 0) {
+    for (intptr_t i = 0; i < num_explicit_params; i++) {
+      result = Array::Cast(metadata).At(i);
+      descriptor.SetAt(
+          i * Parser::kParameterEntrySize + Parser::kParameterMetadataOffset,
+          result);
+    }
+  }
+
+  // 3. Find the defaultValues in the EntryOptional sequence.
+  if (!function.is_abstract()) {
+    const Bytecode& bytecode = Bytecode::Handle(Z, function.bytecode());
+    ASSERT(!bytecode.IsNull());
+    const ObjectPool& constants = ObjectPool::Handle(Z, bytecode.object_pool());
+    ASSERT(!constants.IsNull());
+    const KBCInstr* instr =
+        reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart());
+    if (KernelBytecode::IsEntryOptionalOpcode(instr)) {
+      const intptr_t num_fixed_params = KernelBytecode::DecodeA(instr);
+      const intptr_t num_opt_pos_params = KernelBytecode::DecodeB(instr);
+      const intptr_t num_opt_named_params = KernelBytecode::DecodeC(instr);
+      instr = KernelBytecode::Next(instr);
+      ASSERT(num_fixed_params == function.num_fixed_parameters());
+      ASSERT(num_opt_pos_params == function.NumOptionalPositionalParameters());
+      ASSERT(num_opt_named_params == function.NumOptionalNamedParameters());
+      ASSERT((num_opt_pos_params == 0) || (num_opt_named_params == 0));
+
+      for (intptr_t i = 0; i < num_opt_pos_params; i++) {
+        const KBCInstr* load_value_instr = instr;
+        instr = KernelBytecode::Next(instr);
+        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
+        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
+        descriptor.SetAt((num_fixed_params - num_implicit_params + i) *
+                                 Parser::kParameterEntrySize +
+                             Parser::kParameterDefaultValueOffset,
+                         result);
+      }
+      for (intptr_t i = 0; i < num_opt_named_params; i++) {
+        const KBCInstr* load_name_instr = instr;
+        const KBCInstr* load_value_instr =
+            KernelBytecode::Next(load_name_instr);
+        instr = KernelBytecode::Next(load_value_instr);
+        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_name_instr));
+        result = constants.ObjectAt(KernelBytecode::DecodeE(load_name_instr));
+        intptr_t param_index;
+        for (param_index = num_fixed_params; param_index < num_params;
+             param_index++) {
+          if (function.ParameterNameAt(param_index) == result.raw()) {
+            break;
+          }
+        }
+        ASSERT(param_index < num_params);
+        ASSERT(KernelBytecode::IsLoadConstantOpcode(load_value_instr));
+        result = constants.ObjectAt(KernelBytecode::DecodeE(load_value_instr));
+        descriptor.SetAt(
+            (param_index - num_implicit_params) * Parser::kParameterEntrySize +
+                Parser::kParameterDefaultValueOffset,
+            result);
+      }
+    }
+  }
+
+  return descriptor.raw();
+}
+
 void BytecodeReaderHelper::ParseBytecodeFunction(
     ParsedFunction* parsed_function,
     const Function& function) {
@@ -2600,7 +2837,7 @@
       }
       break;
     }
-    case RawFunction::kStaticFieldInitializer:
+    case RawFunction::kFieldInitializer:
       ReadCode(function, function.bytecode_offset());
       break;
     case RawFunction::kMethodExtractor:
@@ -3013,8 +3250,6 @@
 
         ActiveClassScope active_class_scope(&active_class, &klass);
         ActiveMemberScope active_member(&active_class, &outermost_function);
-        ActiveTypeParametersScope active_type_params(&active_class, function,
-                                                     zone);
 
         BytecodeComponentData bytecode_component(
             &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
@@ -3056,6 +3291,40 @@
   return bytecode_reader.ReadObject();
 }
 
+RawArray* BytecodeReader::ReadExtendedAnnotations(const Field& annotation_field,
+                                                  intptr_t count) {
+  ASSERT(annotation_field.is_declared_in_bytecode());
+
+  Thread* thread = Thread::Current();
+  Zone* zone = thread->zone();
+  ASSERT(thread->IsMutatorThread());
+
+  const Script& script = Script::Handle(zone, annotation_field.Script());
+  TranslationHelper translation_helper(thread);
+  translation_helper.InitFromScript(script);
+
+  ActiveClass active_class;
+
+  BytecodeComponentData bytecode_component(
+      &Array::Handle(zone, translation_helper.GetBytecodeComponent()));
+  ASSERT(!bytecode_component.IsNull());
+  BytecodeReaderHelper bytecode_reader(&translation_helper, &active_class,
+                                       &bytecode_component);
+
+  AlternativeReadingScope alt(&bytecode_reader.reader(),
+                              annotation_field.bytecode_offset());
+
+  bytecode_reader.ReadObject();  // Discard main annotation.
+
+  Array& result = Array::Handle(zone, Array::New(count));
+  Object& element = Object::Handle(zone);
+  for (intptr_t i = 0; i < count; i++) {
+    element = bytecode_reader.ReadObject();
+    result.SetAt(i, element);
+  }
+  return result.raw();
+}
+
 void BytecodeReader::LoadClassDeclaration(const Class& cls) {
   TIMELINE_DURATION(Thread::Current(), Compiler,
                     "BytecodeReader::LoadClassDeclaration");
diff --git a/runtime/vm/compiler/frontend/bytecode_reader.h b/runtime/vm/compiler/frontend/bytecode_reader.h
index 386dece..27d0922 100644
--- a/runtime/vm/compiler/frontend/bytecode_reader.h
+++ b/runtime/vm/compiler/frontend/bytecode_reader.h
@@ -88,6 +88,10 @@
                                BitVector* is_covariant,
                                BitVector* is_generic_covariant_impl);
 
+  // Returns an flattened array of tuples {isFinal, defaultValue, metadata},
+  // or an Error.
+  RawObject* BuildParameterDescriptor(const Function& function);
+
   // Read bytecode PackedObject.
   RawObject* ReadObject();
 
@@ -130,6 +134,7 @@
   struct Parameter {
     static const int kIsCovariantFlag = 1 << 0;
     static const int kIsGenericCovariantImplFlag = 1 << 1;
+    static const int kIsFinalFlag = 1 << 2;
   };
 
   class FunctionTypeScope : public ValueObject {
@@ -183,7 +188,13 @@
   void ReadTypeParametersDeclaration(const Class& parameterized_class,
                                      const Function& parameterized_function);
 
-  void ReadConstantPool(const Function& function, const ObjectPool& pool);
+  // Read portion of constant pool corresponding to one function/closure.
+  // Start with [start_index], and stop when reaching EndClosureFunctionScope.
+  // Return index of the last read constant pool entry.
+  intptr_t ReadConstantPool(const Function& function,
+                            const ObjectPool& pool,
+                            intptr_t start_index);
+
   RawBytecode* ReadBytecode(const ObjectPool& pool);
   void ReadExceptionsTable(const Bytecode& bytecode, bool has_exceptions_table);
   void ReadSourcePositions(const Bytecode& bytecode, bool has_source_positions);
@@ -308,8 +319,11 @@
   static RawError* ReadFunctionBytecode(Thread* thread,
                                         const Function& function);
 
-  // Read annotation for the given annotation field.
+  // Read annotations for the given annotation field.
   static RawObject* ReadAnnotation(const Field& annotation_field);
+  // Read the |count| annotations following given annotation field.
+  static RawArray* ReadExtendedAnnotations(const Field& annotation_field,
+                                           intptr_t count);
 
   // Read declaration of the given library.
   static void LoadLibraryDeclaration(const Library& library);
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.cc b/runtime/vm/compiler/frontend/constant_evaluator.cc
index 669bdae..e433e26 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.cc
+++ b/runtime/vm/compiler/frontend/constant_evaluator.cc
@@ -175,6 +175,15 @@
       case kDeprecated_ConstantExpression:
         result_ = EvaluateConstantExpression(helper_->ReadUInt());
         break;
+      case kInvalidExpression: {
+        helper_->ReadPosition();  // Skip position.
+        const String& message = H.DartString(helper_->ReadStringReference());
+        // Invalid expression message has pointer to the source code, no need to
+        // report it twice.
+        H.ReportError(helper_->script(), TokenPosition::kNoSource, "%s",
+                      message.ToCString());
+        break;
+      }
       default:
         H.ReportError(
             script_, TokenPosition::kNoSource,
@@ -323,6 +332,20 @@
   return result_.raw();
 }
 
+bool ConstantEvaluator::IsInstanceConstant(intptr_t constant_offset,
+                                           const Class& clazz) {
+  // Get reader directly into raw bytes of constant table.
+  KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
+  reader.ReadUInt();  // skip variable-sized int for adjusted constant offset
+  reader.SetOffset(reader.ReaderOffset() + constant_offset);
+  // Peek for an instance of the given clazz.
+  if (reader.ReadByte() == kInstanceConstant) {
+    const NameIndex index = reader.ReadCanonicalNameReference();
+    return H.LookupClassByKernelClass(index) == clazz.raw();
+  }
+  return false;
+}
+
 RawInstance* ConstantEvaluator::EvaluateConstant(intptr_t constant_offset) {
   // Get reader directly into raw bytes of constant table.
   KernelReaderHelper reader(Z, &H, script_, H.constants_table(), 0);
@@ -433,6 +456,12 @@
     case kInstanceConstant: {
       const NameIndex index = reader.ReadCanonicalNameReference();
       const auto& klass = Class::Handle(Z, H.LookupClassByKernelClass(index));
+      if (!klass.is_declaration_loaded()) {
+        FATAL1(
+            "Trying to evaluate an instance constant whose references class "
+            "%s is not loaded yet.",
+            klass.ToCString());
+      }
       const auto& obj = Object::Handle(Z, klass.EnsureIsFinalized(H.thread()));
       ASSERT(obj.IsNull());
       instance = Instance::New(klass, Heap::kOld);
@@ -1277,7 +1306,7 @@
 
   const Function& function = flow_graph_builder_->parsed_function_->function();
   if ((function.kind() == RawFunction::kImplicitStaticGetter ||
-       function.kind() == RawFunction::kStaticFieldInitializer) &&
+       function.kind() == RawFunction::kFieldInitializer) &&
       !I->CanOptimizeImmediately()) {
     // Don't cache constants in initializer expressions. They get
     // evaluated only once.
@@ -1310,7 +1339,7 @@
 
   const Function& function = flow_graph_builder_->parsed_function_->function();
   if ((function.kind() == RawFunction::kImplicitStaticGetter ||
-       function.kind() == RawFunction::kStaticFieldInitializer) &&
+       function.kind() == RawFunction::kFieldInitializer) &&
       !I->CanOptimizeImmediately()) {
     // Don't cache constants in initializer expressions. They get
     // evaluated only once.
diff --git a/runtime/vm/compiler/frontend/constant_evaluator.h b/runtime/vm/compiler/frontend/constant_evaluator.h
index 7981835..3e96dd9 100644
--- a/runtime/vm/compiler/frontend/constant_evaluator.h
+++ b/runtime/vm/compiler/frontend/constant_evaluator.h
@@ -56,6 +56,10 @@
   RawObject* EvaluateExpressionSafe(intptr_t offset);
   RawObject* EvaluateAnnotations();
 
+  // Peeks to see if constant at the given offset will evaluate to
+  // instance of the given clazz.
+  bool IsInstanceConstant(intptr_t constant_offset, const Class& clazz);
+
   // Evaluates a constant at the given offset (possibly by recursing
   // into sub-constants).
   RawInstance* EvaluateConstantExpression(intptr_t constant_offset);
diff --git a/runtime/vm/compiler/frontend/flow_graph_builder.cc b/runtime/vm/compiler/frontend/flow_graph_builder.cc
index c1b1dea..b1239d3 100644
--- a/runtime/vm/compiler/frontend/flow_graph_builder.cc
+++ b/runtime/vm/compiler/frontend/flow_graph_builder.cc
@@ -373,8 +373,15 @@
 
   ASSERT(type.HasTypeClass());
   const Class& type_class = Class::Handle(type.type_class());
+
   // Bail if the type has any type parameters.
-  if (type_class.IsGeneric()) return false;
+  if (type_class.IsGeneric()) {
+    // If the interface type we check against is generic but has all-dynamic
+    // type arguments, then we can still use the _simpleInstanceOf
+    // implementation (see also runtime/lib/object.cc:Object_SimpleInstanceOf).
+    const auto& rare_type = AbstractType::Handle(type_class.RareType());
+    return rare_type.Equals(type);
+  }
 
   // Finally a simple class for instance of checking.
   return true;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
index b046ba6..fa00a60 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.cc
@@ -874,7 +874,7 @@
       }
     }
     if (extra_entry != nullptr) {
-      B->RecordUncheckedEntryPoint(extra_entry);
+      B->RecordUncheckedEntryPoint(graph_entry, extra_entry);
     }
   } else {
     // If the function's body contains any yield points, build switch statement
@@ -1001,7 +1001,7 @@
       }
       return B->BuildGraphOfFieldAccessor(function);
     }
-    case RawFunction::kStaticFieldInitializer:
+    case RawFunction::kFieldInitializer:
       return BuildGraphOfFieldInitializer();
     case RawFunction::kDynamicInvocationForwarder:
       return B->BuildGraphOfDynamicInvocationForwarder(function);
@@ -1062,7 +1062,7 @@
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitStaticGetter:
     case RawFunction::kImplicitSetter:
-    case RawFunction::kStaticFieldInitializer:
+    case RawFunction::kFieldInitializer:
     case RawFunction::kMethodExtractor:
     case RawFunction::kNoSuchMethodDispatcher:
     case RawFunction::kInvokeFieldDispatcher:
@@ -1310,6 +1310,13 @@
   return reader_.PeekTag(payload);
 }
 
+Nullability KernelReaderHelper::ReadNullability() {
+  if (translation_helper_.info().kernel_binary_version() >= 28) {
+    return reader_.ReadNullability();
+  }
+  return kLegacy;
+}
+
 void StreamingFlowGraphBuilder::loop_depth_inc() {
   ++flow_graph_builder_->loop_depth_;
 }
@@ -1633,8 +1640,8 @@
 }
 
 Fragment StreamingFlowGraphBuilder::AllocateContext(
-    const GrowableArray<LocalVariable*>& context_variables) {
-  return flow_graph_builder_->AllocateContext(context_variables);
+    const ZoneGrowableArray<const Slot*>& context_slots) {
+  return flow_graph_builder_->AllocateContext(context_slots);
 }
 
 Fragment StreamingFlowGraphBuilder::LoadNativeField(const Slot& field) {
@@ -1691,8 +1698,8 @@
 }
 
 Fragment StreamingFlowGraphBuilder::CloneContext(
-    const GrowableArray<LocalVariable*>& context_variables) {
-  return flow_graph_builder_->CloneContext(context_variables);
+    const ZoneGrowableArray<const Slot*>& context_slots) {
+  return flow_graph_builder_->CloneContext(context_slots);
 }
 
 Fragment StreamingFlowGraphBuilder::TranslateFinallyFinalizers(
@@ -3049,13 +3056,17 @@
     ++argument_count;
   }
 
-  if (compiler::ffi::IsAsFunctionInternal(Z, Isolate::Current(), target)) {
+  if (compiler::ffi::IsAsFunctionInternal(Z, H.isolate(), target)) {
     return BuildFfiAsFunctionInternal();
   }
 
   Fragment instructions;
   LocalVariable* instance_variable = NULL;
 
+  const bool special_case_nop_async_stack_trace_helper =
+      !FLAG_causal_async_stacks &&
+      target.recognized_kind() == MethodRecognizer::kAsyncStackTraceHelper;
+
   const bool special_case_unchecked_cast =
       klass.IsTopLevel() && (klass.library() == Library::InternalLibrary()) &&
       (target.name() == Symbols::UnsafeCast().raw());
@@ -3064,8 +3075,9 @@
       klass.IsTopLevel() && (klass.library() == Library::CoreLibrary()) &&
       (target.name() == Symbols::Identical().raw());
 
-  const bool special_case =
-      special_case_identical || special_case_unchecked_cast;
+  const bool special_case = special_case_identical ||
+                            special_case_unchecked_cast ||
+                            special_case_nop_async_stack_trace_helper;
 
   // If we cross the Kernel -> VM core library boundary, a [StaticInvocation]
   // can appear, but the thing we're calling is not a static method, but a
@@ -3130,6 +3142,10 @@
     ASSERT(argument_count == 2);
     instructions +=
         StrictCompare(position, Token::kEQ_STRICT, /*number_check=*/true);
+  } else if (special_case_nop_async_stack_trace_helper) {
+    ASSERT(argument_count == 1);
+    instructions += Drop();
+    instructions += NullConstant();
   } else if (special_case_unchecked_cast) {
     // Simply do nothing: the result value is already pushed on the stack.
   } else {
@@ -4137,7 +4153,7 @@
     // the body gets a fresh set of [ForStatement] variables (with the old
     // (possibly updated) values).
     if (context_scope->num_context_variables() > 0) {
-      body += CloneContext(context_scope->context_variables());
+      body += CloneContext(context_scope->context_slots());
     }
 
     body += updates;
diff --git a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
index ad86af8..e8b36bd 100644
--- a/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
+++ b/runtime/vm/compiler/frontend/kernel_binary_flowgraph.h
@@ -210,8 +210,7 @@
                           const Class& klass,
                           intptr_t argument_count);
   Fragment AllocateObject(const Class& klass, const Function& closure_function);
-  Fragment AllocateContext(
-      const GrowableArray<LocalVariable*>& context_variables);
+  Fragment AllocateContext(const ZoneGrowableArray<const Slot*>& context_slots);
   Fragment LoadNativeField(const Slot& field);
   Fragment StoreLocal(TokenPosition position, LocalVariable* variable);
   Fragment StoreStaticField(TokenPosition position, const Field& field);
@@ -224,7 +223,7 @@
   Fragment CreateArray();
   Fragment StoreIndexed(intptr_t class_id);
   Fragment CheckStackOverflow(TokenPosition position);
-  Fragment CloneContext(const GrowableArray<LocalVariable*>& context_variables);
+  Fragment CloneContext(const ZoneGrowableArray<const Slot*>& context_slots);
   Fragment TranslateFinallyFinalizers(TryFinallyBlock* outer_finally,
                                       intptr_t target_context_depth);
   Fragment BranchIfTrue(TargetEntryInstr** then_entry,
diff --git a/runtime/vm/compiler/frontend/kernel_fingerprints.cc b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
index 6da7494..a7b1a1d 100644
--- a/runtime/vm/compiler/frontend/kernel_fingerprints.cc
+++ b/runtime/vm/compiler/frontend/kernel_fingerprints.cc
@@ -239,10 +239,13 @@
     case kSimpleFunctionType:
       CalculateFunctionTypeFingerprint(true);
       break;
-    case kTypeParameterType:
+    case kTypeParameterType: {
+      Nullability nullability = ReadNullability();
+      BuildHash(nullability);
       ReadUInt();                              // read index for parameter.
       CalculateOptionalDartTypeFingerprint();  // read bound bound.
       break;
+    }
     default:
       ReportUnexpectedTag("type", tag);
       UNREACHABLE();
@@ -260,6 +263,8 @@
 }
 
 void KernelFingerprintHelper::CalculateInterfaceTypeFingerprint(bool simple) {
+  Nullability nullability = ReadNullability();
+  BuildHash(nullability);
   NameIndex kernel_class = ReadCanonicalNameReference();
   ASSERT(H.IsClass(kernel_class));
   const String& class_name = H.DartClassName(kernel_class);
@@ -274,6 +279,9 @@
 }
 
 void KernelFingerprintHelper::CalculateFunctionTypeFingerprint(bool simple) {
+  Nullability nullability = ReadNullability();
+  BuildHash(nullability);
+
   if (!simple) {
     CalculateTypeParametersListFingerprint();  // read type_parameters.
     BuildHash(ReadUInt());                     // read required parameter count.
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.cc b/runtime/vm/compiler/frontend/kernel_to_il.cc
index 04f2e53..2169ebd 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.cc
+++ b/runtime/vm/compiler/frontend/kernel_to_il.cc
@@ -113,7 +113,7 @@
 
 Fragment FlowGraphBuilder::PushContext(const LocalScope* scope) {
   ASSERT(scope->num_context_variables() > 0);
-  Fragment instructions = AllocateContext(scope->context_variables());
+  Fragment instructions = AllocateContext(scope->context_slots());
   LocalVariable* context = MakeTemporary();
   instructions += LoadLocal(context);
   instructions += LoadLocal(parsed_function_->current_context_var());
@@ -308,13 +308,13 @@
 }
 
 Fragment FlowGraphBuilder::CloneContext(
-    const GrowableArray<LocalVariable*>& context_variables) {
+    const ZoneGrowableArray<const Slot*>& context_slots) {
   LocalVariable* context_variable = parsed_function_->current_context_var();
 
   Fragment instructions = LoadLocal(context_variable);
 
   CloneContextInstr* clone_instruction = new (Z) CloneContextInstr(
-      TokenPosition::kNoSource, Pop(), context_variables, GetNextDeoptId());
+      TokenPosition::kNoSource, Pop(), context_slots, GetNextDeoptId());
   instructions <<= clone_instruction;
   Push(clone_instruction);
 
@@ -360,23 +360,6 @@
   return Fragment(call);
 }
 
-Fragment FlowGraphBuilder::ClosureCall(TokenPosition position,
-                                       intptr_t type_args_len,
-                                       intptr_t argument_count,
-                                       const Array& argument_names,
-                                       bool is_statically_checked) {
-  Value* function = Pop();
-  const intptr_t total_count = argument_count + (type_args_len > 0 ? 1 : 0);
-  ArgumentArray arguments = GetArguments(total_count);
-  ClosureCallInstr* call = new (Z)
-      ClosureCallInstr(function, arguments, type_args_len, argument_names,
-                       position, GetNextDeoptId(),
-                       is_statically_checked ? Code::EntryKind::kUnchecked
-                                             : Code::EntryKind::kNormal);
-  Push(call);
-  return Fragment(call);
-}
-
 Fragment FlowGraphBuilder::FfiCall(
     const Function& signature,
     const ZoneGrowableArray<Representation>& arg_reps,
@@ -479,28 +462,6 @@
   return instructions;
 }
 
-Fragment FlowGraphBuilder::CheckNull(TokenPosition position,
-                                     LocalVariable* receiver,
-                                     const String& function_name,
-                                     bool clear_the_temp /* = true */) {
-  Fragment instructions = LoadLocal(receiver);
-
-  CheckNullInstr* check_null =
-      new (Z) CheckNullInstr(Pop(), function_name, GetNextDeoptId(), position);
-
-  instructions <<= check_null;
-
-  if (clear_the_temp) {
-    // Null out receiver to make sure it is not saved into the frame before
-    // doing the call.
-    instructions += NullConstant();
-    instructions += StoreLocal(TokenPosition::kNoSource, receiver);
-    instructions += Drop();
-  }
-
-  return instructions;
-}
-
 Fragment FlowGraphBuilder::StaticCall(TokenPosition position,
                                       const Function& target,
                                       intptr_t argument_count,
@@ -509,50 +470,16 @@
                     rebind_rule);
 }
 
-static intptr_t GetResultCidOfListFactory(Zone* zone,
-                                          const Function& function,
-                                          intptr_t argument_count) {
-  if (!function.IsFactory()) {
-    return kDynamicCid;
-  }
-
-  const Class& owner = Class::Handle(zone, function.Owner());
-  if ((owner.library() != Library::CoreLibrary()) &&
-      (owner.library() != Library::TypedDataLibrary())) {
-    return kDynamicCid;
-  }
-
-  if ((owner.Name() == Symbols::List().raw()) &&
-      (function.name() == Symbols::ListFactory().raw())) {
-    ASSERT(argument_count == 1 || argument_count == 2);
-    return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid;
-  }
-  return FactoryRecognizer::ResultCid(function);
-}
-
 void FlowGraphBuilder::SetResultTypeForStaticCall(
     StaticCallInstr* call,
     const Function& target,
     intptr_t argument_count,
     const InferredTypeMetadata* result_type) {
-  const intptr_t list_cid =
-      GetResultCidOfListFactory(Z, target, argument_count);
-  if (list_cid != kDynamicCid) {
+  if (call->InitResultType(Z)) {
     ASSERT((result_type == NULL) || (result_type->cid == kDynamicCid) ||
-           (result_type->cid == list_cid));
-    call->SetResultType(Z, CompileType::FromCid(list_cid));
-    call->set_is_known_list_constructor(true);
+           (result_type->cid == call->result_cid()));
     return;
   }
-  if (target.has_pragma()) {
-    intptr_t recognized_cid = MethodRecognizer::ResultCidFromPragma(target);
-    if (recognized_cid != kDynamicCid) {
-      ASSERT((result_type == NULL) || (result_type->cid == kDynamicCid) ||
-             (result_type->cid == recognized_cid));
-      call->SetResultType(Z, CompileType::FromCid(recognized_cid));
-      return;
-    }
-  }
   if ((result_type != NULL) && !result_type->IsTrivial()) {
     call->SetResultType(Z, result_type->ToCompileType(Z));
   }
@@ -579,14 +506,6 @@
   return Fragment(call);
 }
 
-Fragment FlowGraphBuilder::StringInterpolate(TokenPosition position) {
-  Value* array = Pop();
-  StringInterpolateInstr* interpolate =
-      new (Z) StringInterpolateInstr(array, position, GetNextDeoptId());
-  Push(interpolate);
-  return Fragment(interpolate);
-}
-
 Fragment FlowGraphBuilder::StringInterpolateSingle(TokenPosition position) {
   const int kTypeArgsLen = 0;
   const int kNumberOfArguments = 1;
@@ -755,7 +674,7 @@
   const MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(function);
 
   switch (kind) {
-// On simdbc we fall back to natives.
+// On simdbc and the bytecode interpreter we fall back to natives.
 #if !defined(TARGET_ARCH_DBC)
     case MethodRecognizer::kTypedData_ByteDataView_factory:
     case MethodRecognizer::kTypedData_Int8ArrayView_factory:
@@ -773,6 +692,11 @@
     case MethodRecognizer::kTypedData_Int32x4ArrayView_factory:
     case MethodRecognizer::kTypedData_Float64x2ArrayView_factory:
 #endif  // !defined(TARGET_ARCH_DBC)
+    // This list must be kept in sync with BytecodeReaderHelper::NativeEntry in
+    // runtime/vm/compiler/frontend/bytecode_reader.cc and implemented in the
+    // bytecode interpreter in runtime/vm/interpreter.cc. Alternatively, these
+    // methods must work in their original form (a Dart body or native entry) in
+    // the bytecode interpreter.
     case MethodRecognizer::kObjectEquals:
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
@@ -800,7 +724,10 @@
     case MethodRecognizer::kLinkedHashMap_setUsedData:
     case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
     case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
+    case MethodRecognizer::kFfiAbi:
       return true;
+    case MethodRecognizer::kAsyncStackTraceHelper:
+      return !FLAG_causal_async_stacks;
     default:
       return false;
   }
@@ -888,12 +815,14 @@
       break;
 #endif  // !defined(TARGET_ARCH_DBC)
     case MethodRecognizer::kObjectEquals:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += StrictCompare(Token::kEQ_STRICT);
       break;
     case MethodRecognizer::kStringBaseLength:
     case MethodRecognizer::kStringBaseIsEmpty:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::String_length());
       if (kind == MethodRecognizer::kStringBaseIsEmpty) {
@@ -902,40 +831,49 @@
       }
       break;
     case MethodRecognizer::kGrowableArrayLength:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::GrowableObjectArray_length());
       break;
     case MethodRecognizer::kObjectArrayLength:
     case MethodRecognizer::kImmutableArrayLength:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::Array_length());
       break;
     case MethodRecognizer::kTypedListLength:
     case MethodRecognizer::kTypedListViewLength:
     case MethodRecognizer::kByteDataViewLength:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::TypedDataBase_length());
       break;
     case MethodRecognizer::kByteDataViewOffsetInBytes:
     case MethodRecognizer::kTypedDataViewOffsetInBytes:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::TypedDataView_offset_in_bytes());
       break;
     case MethodRecognizer::kByteDataViewTypedData:
     case MethodRecognizer::kTypedDataViewTypedData:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::TypedDataView_data());
       break;
     case MethodRecognizer::kClassIDgetID:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadClassId();
       break;
     case MethodRecognizer::kGrowableArrayCapacity:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::GrowableObjectArray_data());
       body += LoadNativeField(Slot::Array_length());
       break;
     case MethodRecognizer::kListFactory: {
+      ASSERT(function.IsFactory() && (function.NumParameters() == 2) &&
+             function.HasOptionalParameters());
       // factory List<E>([int length]) {
       //   return (:arg_desc.positional_count == 2) ? new _List<E>(length)
       //                                            : new _GrowableList<E>(0);
@@ -1000,15 +938,18 @@
       break;
     }
     case MethodRecognizer::kObjectArrayAllocate:
+      ASSERT(function.IsFactory() && (function.NumParameters() == 2));
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += CreateArray();
       break;
     case MethodRecognizer::kLinkedHashMap_getIndex:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::LinkedHashMap_index());
       break;
     case MethodRecognizer::kLinkedHashMap_setIndex:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += StoreInstanceField(TokenPosition::kNoSource,
@@ -1016,10 +957,12 @@
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getData:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::LinkedHashMap_data());
       break;
     case MethodRecognizer::kLinkedHashMap_setData:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += StoreInstanceField(TokenPosition::kNoSource,
@@ -1027,10 +970,12 @@
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getHashMask:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::LinkedHashMap_hash_mask());
       break;
     case MethodRecognizer::kLinkedHashMap_setHashMask:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body +=
@@ -1039,10 +984,12 @@
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getUsedData:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::LinkedHashMap_used_data());
       break;
     case MethodRecognizer::kLinkedHashMap_setUsedData:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body +=
@@ -1051,10 +998,12 @@
       body += NullConstant();
       break;
     case MethodRecognizer::kLinkedHashMap_getDeletedKeys:
+      ASSERT(function.NumParameters() == 1);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadNativeField(Slot::LinkedHashMap_deleted_keys());
       break;
     case MethodRecognizer::kLinkedHashMap_setDeletedKeys:
+      ASSERT(function.NumParameters() == 2);
       body += LoadLocal(parsed_function_->RawParameterVariable(0));
       body += LoadLocal(parsed_function_->RawParameterVariable(1));
       body += StoreInstanceField(TokenPosition::kNoSource,
@@ -1062,6 +1011,14 @@
                                  kNoStoreBarrier);
       body += NullConstant();
       break;
+    case MethodRecognizer::kAsyncStackTraceHelper:
+      ASSERT(!FLAG_causal_async_stacks);
+      body += NullConstant();
+      break;
+    case MethodRecognizer::kFfiAbi:
+      ASSERT(function.NumParameters() == 0);
+      body += IntConstant(static_cast<int64_t>(compiler::ffi::TargetAbi()));
+      break;
     default: {
       UNREACHABLE();
       break;
@@ -1083,6 +1040,7 @@
   ASSERT(class_table->HasValidClassAt(cid));
   const auto& view_class = Class::ZoneHandle(H.zone(), class_table->At(cid));
 
+  ASSERT(function.IsFactory() && (function.NumParameters() == 4));
   LocalVariable* typed_data = parsed_function_->RawParameterVariable(1);
   LocalVariable* offset_in_bytes = parsed_function_->RawParameterVariable(2);
   LocalVariable* length = parsed_function_->RawParameterVariable(3);
@@ -1162,7 +1120,7 @@
   // Note: this must be kept in sync with ScopeBuilder::BuildScopes.
   const LocalScope* implicit_closure_scope =
       MakeImplicitClosureScope(Z, Class::Handle(Z, target.Owner()));
-  fragment += AllocateContext(implicit_closure_scope->context_variables());
+  fragment += AllocateContext(implicit_closure_scope->context_slots());
   LocalVariable* context = MakeTemporary();
 
   // Store the function and the context in the closure.
@@ -1220,15 +1178,6 @@
   return definition->IsLoadLocal();
 }
 
-Fragment FlowGraphBuilder::DebugStepCheck(TokenPosition position) {
-#ifdef PRODUCT
-  return Fragment();
-#else
-  return Fragment(new (Z) DebugStepCheckInstr(
-      position, RawPcDescriptors::kRuntimeCall, GetNextDeoptId()));
-#endif
-}
-
 Fragment FlowGraphBuilder::EvaluateAssertion() {
   const Class& klass =
       Class::ZoneHandle(Z, Library::LookupCoreClass(Symbols::AssertionError()));
@@ -2014,54 +1963,6 @@
   return Fragment();
 }
 
-// Pop the index of the current entry-point off the stack. If there is any
-// entrypoint-tracing hook registered in a pragma for the function, it is called
-// with the name of the current function and the current entry-point index.
-Fragment FlowGraphBuilder::BuildEntryPointsIntrospection() {
-  if (!FLAG_enable_testing_pragmas) return Drop();
-
-  auto& function = Function::Handle(Z, parsed_function_->function().raw());
-
-  if (function.IsImplicitClosureFunction()) {
-    const auto& parent = Function::Handle(Z, function.parent_function());
-    const auto& func_name = String::Handle(Z, parent.name());
-    const auto& owner = Class::Handle(Z, parent.Owner());
-    function = owner.LookupFunction(func_name);
-  }
-
-  Object& options = Object::Handle(Z);
-  if (!Library::FindPragma(thread_, /*only_core=*/false, function,
-                           Symbols::vm_trace_entrypoints(), &options) ||
-      options.IsNull() || !options.IsClosure()) {
-    return Drop();
-  }
-  auto& closure = Closure::ZoneHandle(Z, Closure::Cast(options).raw());
-  LocalVariable* entry_point_num = MakeTemporary();
-
-  auto& function_name = String::ZoneHandle(
-      Z, String::New(function.ToLibNamePrefixedQualifiedCString(), Heap::kOld));
-  if (parsed_function_->function().IsImplicitClosureFunction()) {
-    function_name = String::Concat(
-        function_name, String::Handle(Z, String::New("#tearoff", Heap::kNew)),
-        Heap::kOld);
-  }
-
-  Fragment call_hook;
-  call_hook += Constant(closure);
-  call_hook += PushArgument();
-  call_hook += Constant(function_name);
-  call_hook += PushArgument();
-  call_hook += LoadLocal(entry_point_num);
-  call_hook += PushArgument();
-  call_hook += Constant(Function::ZoneHandle(Z, closure.function()));
-  call_hook += ClosureCall(TokenPosition::kNoSource,
-                           /*type_args_len=*/0, /*argument_count=*/3,
-                           /*argument_names=*/Array::ZoneHandle(Z));
-  call_hook += Drop();  // result of closure call
-  call_hook += Drop();  // entrypoint number
-  return call_hook;
-}
-
 FunctionEntryInstr* FlowGraphBuilder::BuildSharedUncheckedEntryPoint(
     Fragment shared_prologue_linked_in,
     Fragment skippable_checks,
@@ -2143,24 +2044,6 @@
   return extra_entry;
 }
 
-void FlowGraphBuilder::RecordUncheckedEntryPoint(
-    FunctionEntryInstr* extra_entry) {
-  // Closures always check all arguments on their checked entry-point, most
-  // call-sites are unchecked, and they're inlined less often, so it's very
-  // beneficial to build multiple entry-points for them. Regular methods however
-  // have fewer checks to begin with since they have dynamic invocation
-  // forwarders, so in AOT we implement a more conservative time-space tradeoff
-  // by only building the unchecked entry-point when inlining. We should
-  // reconsider this heuristic if we identify non-inlined type-checks in
-  // hotspots of new benchmarks.
-  if (!IsInlining() && (parsed_function_->function().IsClosureFunction() ||
-                        !FLAG_precompiled_mode)) {
-    graph_entry_->set_unchecked_entry(extra_entry);
-  } else if (InliningUncheckedEntry()) {
-    graph_entry_->set_normal_entry(extra_entry);
-  }
-}
-
 FlowGraph* FlowGraphBuilder::BuildGraphOfImplicitClosureFunction(
     const Function& function) {
   const Function& parent = Function::ZoneHandle(Z, function.parent_function());
@@ -2284,7 +2167,7 @@
           /*redefinitions_if_skipped=*/Fragment(),
           /*body=*/body);
     }
-    RecordUncheckedEntryPoint(extra_entry);
+    RecordUncheckedEntryPoint(graph_entry_, extra_entry);
   } else {
     Fragment function(instruction_cursor);
     function += prologue;
diff --git a/runtime/vm/compiler/frontend/kernel_to_il.h b/runtime/vm/compiler/frontend/kernel_to_il.h
index 5b7c662..0b9d2fe 100644
--- a/runtime/vm/compiler/frontend/kernel_to_il.h
+++ b/runtime/vm/compiler/frontend/kernel_to_il.h
@@ -47,32 +47,6 @@
   kCheckCovariantTypeParameterBounds,
 };
 
-// Indicates which form of the unchecked entrypoint we are compiling.
-//
-// kNone:
-//
-//   There is no unchecked entrypoint: the unchecked entry is set to NULL in
-//   the 'GraphEntryInstr'.
-//
-// kSeparate:
-//
-//   The normal and unchecked entrypoint each point to their own versions of
-//   the prologue, containing exactly those checks which need to be performed
-//   on either side. Both sides jump directly to the body after performing
-//   their prologue.
-//
-// kSharedWithVariable:
-//
-//   A temporary variable is allocated and initialized to 0 on normal entry
-//   and 2 on unchecked entry. Code which should be ommitted on the unchecked
-//   entrypoint is made conditional on this variable being equal to 0.
-//
-enum class UncheckedEntryPointStyle {
-  kNone = 0,
-  kSeparate = 1,
-  kSharedWithVariable = 2,
-};
-
 class FlowGraphBuilder : public BaseFlowGraphBuilder {
  public:
   FlowGraphBuilder(ParsedFunction* parsed_function,
@@ -133,7 +107,7 @@
                            bool is_synthesized);
   Fragment TryCatch(int try_handler_index);
   Fragment CheckStackOverflowInPrologue(TokenPosition position);
-  Fragment CloneContext(const GrowableArray<LocalVariable*>& context_variables);
+  Fragment CloneContext(const ZoneGrowableArray<const Slot*>& context_slots);
 
   Fragment InstanceCall(
       TokenPosition position,
@@ -148,12 +122,6 @@
       bool use_unchecked_entry = false,
       const CallSiteAttributesMetadata* call_site_attrs = nullptr);
 
-  Fragment ClosureCall(TokenPosition position,
-                       intptr_t type_args_len,
-                       intptr_t argument_count,
-                       const Array& argument_names,
-                       bool use_unchecked_entry = false);
-
   Fragment FfiCall(
       const Function& signature,
       const ZoneGrowableArray<Representation>& arg_reps,
@@ -165,10 +133,6 @@
   Fragment InitStaticField(const Field& field);
   Fragment NativeCall(const String* name, const Function* function);
   Fragment Return(TokenPosition position, bool omit_result_type_check = false);
-  Fragment CheckNull(TokenPosition position,
-                     LocalVariable* receiver,
-                     const String& function_name,
-                     bool clear_the_temp = true);
   void SetResultTypeForStaticCall(StaticCallInstr* call,
                                   const Function& target,
                                   intptr_t argument_count,
@@ -185,7 +149,6 @@
                       const InferredTypeMetadata* result_type = NULL,
                       intptr_t type_args_len = 0,
                       bool use_unchecked_entry = false);
-  Fragment StringInterpolate(TokenPosition position);
   Fragment StringInterpolateSingle(TokenPosition position);
   Fragment ThrowTypeError();
   Fragment ThrowNoSuchMethodError();
@@ -212,7 +175,6 @@
 
   bool NeedsDebugStepCheck(const Function& function, TokenPosition position);
   bool NeedsDebugStepCheck(Value* value, TokenPosition position);
-  Fragment DebugStepCheck(TokenPosition position);
 
   // Truncates (instead of deoptimizing) if the origin does not fit into the
   // target representation.
@@ -297,7 +259,6 @@
   //  - function_type_arguments()
   Fragment BuildDefaultTypeHandling(const Function& function);
 
-  Fragment BuildEntryPointsIntrospection();
   FunctionEntryInstr* BuildSharedUncheckedEntryPoint(
       Fragment prologue_from_normal_entry,
       Fragment skippable_checks,
@@ -309,7 +270,6 @@
       Fragment extra_prologue,
       Fragment shared_prologue,
       Fragment body);
-  void RecordUncheckedEntryPoint(FunctionEntryInstr* extra_entry);
 
   // Builds flow graph for implicit closure function (tear-off).
   //
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.cc b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
index 938a22a..5e0e452 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.cc
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.cc
@@ -518,6 +518,20 @@
   return String::ZoneHandle(Z, Symbols::FromConcatAll(thread_, pieces));
 }
 
+// TODO(https://github.com/dart-lang/sdk/issues/37517): Should emit code to
+// throw a NoSuchMethodError.
+static void CheckStaticLookup(const Object& target) {
+  if (target.IsNull()) {
+#ifndef PRODUCT
+    ASSERT(Isolate::Current()->HasAttemptedReload());
+    Report::LongJump(LanguageError::Handle(LanguageError::New(String::Handle(
+        String::New("Unimplemented handling of missing static target")))));
+#else
+    UNREACHABLE();
+#endif
+  }
+}
+
 RawLibrary* TranslationHelper::LookupLibraryByKernelLibrary(
     NameIndex kernel_library) {
   // We only use the string and don't rely on having any particular parent.
@@ -538,7 +552,7 @@
   ASSERT(!library_name.IsNull());
   const Library& library =
       Library::Handle(Z, Library::LookupLibrary(thread_, library_name));
-  ASSERT(!library.IsNull());
+  CheckStaticLookup(library);
   name_index_handle_ = Smi::New(kernel_library);
   return info_.InsertLibrary(thread_, name_index_handle_, library);
 }
@@ -558,8 +572,10 @@
   NameIndex kernel_library = CanonicalNameParent(kernel_class);
   Library& library =
       Library::Handle(Z, LookupLibraryByKernelLibrary(kernel_library));
+  ASSERT(!library.IsNull());
   const Class& klass =
       Class::Handle(Z, library.LookupClassAllowPrivate(class_name));
+  CheckStaticLookup(klass);
   ASSERT(!klass.IsNull());
   name_index_handle_ = Smi::New(kernel_class);
   return info_.InsertClass(thread_, name_index_handle_, klass);
@@ -574,14 +590,16 @@
     Library& library =
         Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing));
     klass = library.toplevel_class();
+    CheckStaticLookup(klass);
   } else {
     ASSERT(IsClass(enclosing));
     klass = LookupClassByKernelClass(enclosing);
   }
-  RawField* field = klass.LookupFieldAllowPrivate(
-      DartSymbolObfuscate(CanonicalNameString(kernel_field)));
-  ASSERT(field != Object::null());
-  return field;
+  Field& field = Field::Handle(
+      Z, klass.LookupFieldAllowPrivate(
+             DartSymbolObfuscate(CanonicalNameString(kernel_field))));
+  CheckStaticLookup(field);
+  return field.raw();
 }
 
 RawFunction* TranslationHelper::LookupStaticMethodByKernelProcedure(
@@ -594,15 +612,16 @@
   if (IsLibrary(enclosing)) {
     Library& library =
         Library::Handle(Z, LookupLibraryByKernelLibrary(enclosing));
-    RawFunction* function = library.LookupFunctionAllowPrivate(procedure_name);
-    ASSERT(function != Object::null());
-    return function;
+    Function& function =
+        Function::Handle(Z, library.LookupFunctionAllowPrivate(procedure_name));
+    CheckStaticLookup(function);
+    return function.raw();
   } else {
     ASSERT(IsClass(enclosing));
     Class& klass = Class::Handle(Z, LookupClassByKernelClass(enclosing));
     Function& function = Function::ZoneHandle(
         Z, klass.LookupFunctionAllowPrivate(procedure_name));
-    ASSERT(!function.IsNull());
+    CheckStaticLookup(function);
     // Redirecting factory must be resolved.
     ASSERT(!function.IsRedirectingFactory() ||
            function.RedirectionTarget() != Function::null());
@@ -615,6 +634,7 @@
   ASSERT(IsConstructor(constructor));
   Class& klass =
       Class::Handle(Z, LookupClassByKernelClass(EnclosingName(constructor)));
+  CheckStaticLookup(klass);
   return LookupConstructorByKernelConstructor(klass, constructor);
 }
 
@@ -622,10 +642,10 @@
     const Class& owner,
     NameIndex constructor) {
   ASSERT(IsConstructor(constructor));
-  RawFunction* function =
-      owner.LookupConstructorAllowPrivate(DartConstructorName(constructor));
-  ASSERT(function != Object::null());
-  return function;
+  Function& function = Function::Handle(
+      Z, owner.LookupConstructorAllowPrivate(DartConstructorName(constructor)));
+  CheckStaticLookup(function);
+  return function.raw();
 }
 
 RawFunction* TranslationHelper::LookupConstructorByKernelConstructor(
@@ -650,15 +670,17 @@
   NameIndex kernel_class = EnclosingName(target);
   Class& klass = Class::Handle(Z, LookupClassByKernelClass(kernel_class));
 
-  RawFunction* function = klass.LookupFunctionAllowPrivate(method_name);
+  Function& function =
+      Function::Handle(Z, klass.LookupFunctionAllowPrivate(method_name));
+  CheckStaticLookup(function);
 #ifdef DEBUG
-  if (function == Object::null()) {
+  if (function.IsNull()) {
     THR_Print("Unable to find \'%s\' in %s\n", method_name.ToCString(),
               klass.ToCString());
   }
 #endif
-  ASSERT(function != Object::null());
-  return function;
+  ASSERT(!function.IsNull());
+  return function.raw();
 }
 
 RawFunction* TranslationHelper::LookupDynamicFunction(const Class& klass,
@@ -972,13 +994,11 @@
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kPosition:
-      position_ = helper_->ReadPosition(false);  // read position.
-      helper_->RecordTokenPosition(position_);
+      position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kEndPosition:
-      end_position_ = helper_->ReadPosition(false);  // read end position.
-      helper_->RecordTokenPosition(end_position_);
+      end_position_ = helper_->ReadPosition();  // read end position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kFlags:
@@ -1034,18 +1054,15 @@
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kStartPosition:
-      start_position_ = helper_->ReadPosition(false);  // read position.
-      helper_->RecordTokenPosition(start_position_);
+      start_position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kPosition:
-      position_ = helper_->ReadPosition(false);  // read position.
-      helper_->RecordTokenPosition(position_);
+      position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kEndPosition:
-      end_position_ = helper_->ReadPosition(false);  // read end position.
-      helper_->RecordTokenPosition(end_position_);
+      end_position_ = helper_->ReadPosition();  // read end position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kKind:
@@ -1110,17 +1127,14 @@
       FALL_THROUGH;
     case kStartPosition:
       start_position_ = helper_->ReadPosition();  // read position.
-      helper_->RecordTokenPosition(start_position_);
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kPosition:
       position_ = helper_->ReadPosition();  // read position.
-      helper_->RecordTokenPosition(position_);
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
-      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kFlags:
@@ -1179,18 +1193,15 @@
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kStartPosition:
-      start_position_ = helper_->ReadPosition(false);  // read position.
-      helper_->RecordTokenPosition(start_position_);
+      start_position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kPosition:
-      position_ = helper_->ReadPosition(false);  // read position.
-      helper_->RecordTokenPosition(position_);
+      position_ = helper_->ReadPosition();  // read position.
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kEndPosition:
       end_position_ = helper_->ReadPosition();  // read end position.
-      helper_->RecordTokenPosition(end_position_);
       if (++next_read_ == field) return;
       FALL_THROUGH;
     case kFlags:
@@ -1283,11 +1294,21 @@
 
   // Ordered with fall-through.
   switch (next_read_) {
+    // Note that this (up to canonical name) needs to be kept in sync with
+    // "library_canonical_name" (currently in "kernel_loader.h").
     case kFlags: {
       flags_ = helper_->ReadFlags();
       if (++next_read_ == field) return;
       FALL_THROUGH;
     }
+    case kLanguageVersion: {
+      if (binary_version_ >= 27) {
+        helper_->ReadUInt();  // Read major language version.
+        helper_->ReadUInt();  // Read minor language version.
+      }
+      if (++next_read_ == field) return;
+      FALL_THROUGH;
+    }
     case kCanonicalName:
       canonical_name_ =
           helper_->ReadCanonicalNameReference();  // read canonical_name.
@@ -1951,10 +1972,12 @@
       SkipFunctionType(true);
       return;
     case kTypedefType:
+      ReadNullability();      // read nullability.
       ReadUInt();             // read index for canonical name.
       SkipListOfDartTypes();  // read list of types.
       return;
     case kTypeParameterType:
+      ReadNullability();       // read nullability.
       ReadUInt();              // read index for parameter.
       SkipOptionalDartType();  // read bound bound.
       return;
@@ -1975,6 +1998,7 @@
 }
 
 void KernelReaderHelper::SkipInterfaceType(bool simple) {
+  ReadNullability();  // read nullability.
   ReadUInt();  // read klass_name.
   if (!simple) {
     SkipListOfDartTypes();  // read list of types.
@@ -1982,6 +2006,8 @@
 }
 
 void KernelReaderHelper::SkipFunctionType(bool simple) {
+  ReadNullability();  // read nullability.
+
   if (!simple) {
     SkipTypeParametersList();  // read type_parameters.
     ReadUInt();                // read required parameter count.
@@ -2523,11 +2549,9 @@
   SkipListOfVariableDeclarations();  // read named parameters.
 }
 
-TokenPosition KernelReaderHelper::ReadPosition(bool record) {
+TokenPosition KernelReaderHelper::ReadPosition() {
   TokenPosition position = reader_.ReadPosition();
-  if (record) {
-    RecordTokenPosition(position);
-  }
+  RecordTokenPosition(position);
   return position;
 }
 
@@ -2761,6 +2785,8 @@
   // malformed iff `T` is malformed.
   //   => We therefore ignore errors in `A` or `B`.
 
+  helper_->ReadNullability();  // read nullability.
+
   NameIndex klass_name =
       helper_->ReadCanonicalNameReference();  // read klass_name.
 
@@ -2798,6 +2824,8 @@
                                             : Function::Handle(Z),
                                         TokenPosition::kNoSource));
 
+  helper_->ReadNullability();  // read nullability.
+
   // Suspend finalization of types inside this one. They will be finalized after
   // the whole function type is constructed.
   //
@@ -2888,6 +2916,7 @@
 }
 
 void TypeTranslator::BuildTypeParameterType() {
+  helper_->ReadNullability();                      // read nullability.
   intptr_t parameter_index = helper_->ReadUInt();  // read parameter index.
   helper_->SkipOptionalDartType();                 // read bound.
 
@@ -3124,9 +3153,7 @@
     function_node_helper->SetJustRead(FunctionNodeHelper::kTypeParameters);
   }
 
-  ActiveTypeParametersScope scope(
-      active_class_, &function,
-      TypeArguments::Handle(Z, function.type_parameters()), Z);
+  ActiveTypeParametersScope scope(active_class_, function, Z);
 
   function_node_helper->ReadUntilExcluding(
       FunctionNodeHelper::kPositionalParameters);
diff --git a/runtime/vm/compiler/frontend/kernel_translation_helper.h b/runtime/vm/compiler/frontend/kernel_translation_helper.h
index 3e4340d..0cc2ee4 100644
--- a/runtime/vm/compiler/frontend/kernel_translation_helper.h
+++ b/runtime/vm/compiler/frontend/kernel_translation_helper.h
@@ -195,6 +195,17 @@
     info_.set_bytecode_component(bytecode_component);
   }
 
+  void SetExpressionEvaluationFunction(const Function& function) {
+    ASSERT(expression_evaluation_function_ == nullptr);
+    expression_evaluation_function_ = &Function::Handle(zone_, function.raw());
+  }
+  const Function& GetExpressionEvaluationFunction() {
+    if (expression_evaluation_function_ == nullptr) {
+      return Function::null_function();
+    }
+    return *expression_evaluation_function_;
+  }
+
  private:
   // This will mangle [name_to_modify] if necessary and make the result a symbol
   // if asked.  The result will be available in [name_to_modify] and it is also
@@ -224,6 +235,7 @@
   KernelProgramInfo& info_;
   Smi& name_index_handle_;
   GrowableObjectArray* potential_extension_libraries_ = nullptr;
+  Function* expression_evaluation_function_ = nullptr;
 
   DISALLOW_COPY_AND_ASSIGN(TranslationHelper);
 };
@@ -703,6 +715,7 @@
  public:
   enum Field {
     kFlags,
+    kLanguageVersion /* from binary version 27 */,
     kCanonicalName,
     kName,
     kSourceUriIndex,
@@ -727,8 +740,8 @@
     kSynthetic = 1 << 1,
   };
 
-  explicit LibraryHelper(KernelReaderHelper* helper)
-      : helper_(helper), next_read_(kFlags) {}
+  explicit LibraryHelper(KernelReaderHelper* helper, uint32_t binary_version)
+      : helper_(helper), binary_version_(binary_version), next_read_(kFlags) {}
 
   void ReadUntilIncluding(Field field) {
     ReadUntilExcluding(static_cast<Field>(static_cast<int>(field) + 1));
@@ -749,6 +762,7 @@
 
  private:
   KernelReaderHelper* helper_;
+  uint32_t binary_version_;
   intptr_t next_read_;
 
   DISALLOW_COPY_AND_ASSIGN(LibraryHelper);
@@ -1065,9 +1079,10 @@
   void SkipLibraryDependency();
   void SkipLibraryPart();
   void SkipLibraryTypedef();
-  TokenPosition ReadPosition(bool record = true);
+  TokenPosition ReadPosition();
   Tag ReadTag(uint8_t* payload = NULL);
   uint8_t ReadFlags() { return reader_.ReadFlags(); }
+  Nullability ReadNullability();
 
   intptr_t SourceTableSize();
   intptr_t GetOffsetForSourceInfo(intptr_t index);
@@ -1199,6 +1214,23 @@
   DISALLOW_COPY_AND_ASSIGN(ActiveMemberScope);
 };
 
+class ActiveEnclosingFunctionScope {
+ public:
+  ActiveEnclosingFunctionScope(ActiveClass* active_class,
+                               const Function* enclosing)
+      : active_class_(active_class), saved_(*active_class) {
+    active_class_->enclosing = enclosing;
+  }
+
+  ~ActiveEnclosingFunctionScope() { *active_class_ = saved_; }
+
+ private:
+  ActiveClass* active_class_;
+  ActiveClass saved_;
+
+  DISALLOW_COPY_AND_ASSIGN(ActiveEnclosingFunctionScope);
+};
+
 class ActiveTypeParametersScope {
  public:
   // Set the local type parameters of the ActiveClass to be exactly all type
diff --git a/runtime/vm/compiler/frontend/scope_builder.cc b/runtime/vm/compiler/frontend/scope_builder.cc
index eefed03..6cd7bb6 100644
--- a/runtime/vm/compiler/frontend/scope_builder.cc
+++ b/runtime/vm/compiler/frontend/scope_builder.cc
@@ -316,9 +316,17 @@
       }
       break;
     }
-    case RawFunction::kStaticFieldInitializer: {
+    case RawFunction::kFieldInitializer: {
       ASSERT(helper_.PeekTag() == kField);
-      ASSERT(function.IsStaticFunction());
+      if (!function.is_static()) {
+        Class& klass = Class::Handle(Z, function.Owner());
+        Type& klass_type = H.GetDeclarationType(klass);
+        LocalVariable* variable =
+            MakeVariable(TokenPosition::kNoSource, TokenPosition::kNoSource,
+                         Symbols::This(), klass_type);
+        scope_->InsertParameterAt(0, variable);
+        parsed_function_->set_receiver_var(variable);
+      }
       VisitNode();
       break;
     }
@@ -1310,6 +1318,7 @@
 }
 
 void ScopeBuilder::VisitInterfaceType(bool simple) {
+  helper_.ReadNullability();  // read nullability.
   helper_.ReadUInt();  // read klass_name.
   if (!simple) {
     intptr_t length = helper_.ReadListLength();  // read number of types.
@@ -1320,6 +1329,8 @@
 }
 
 void ScopeBuilder::VisitFunctionType(bool simple) {
+  helper_.ReadNullability();  // read nullability.
+
   if (!simple) {
     intptr_t list_length =
         helper_.ReadListLength();  // read type_parameters list length.
@@ -1367,6 +1378,8 @@
     function = function.parent_function();
   }
 
+  helper_.ReadNullability();  // read nullability.
+
   // The index here is the index identifying the type parameter binding site
   // inside the DILL file, which uses a different indexing system than the VM
   // uses for its 'TypeParameter's internally. This index includes both class
diff --git a/runtime/vm/compiler/graph_intrinsifier.cc b/runtime/vm/compiler/graph_intrinsifier.cc
index 5c51441..db4e7dc 100644
--- a/runtime/vm/compiler/graph_intrinsifier.cc
+++ b/runtime/vm/compiler/graph_intrinsifier.cc
@@ -161,8 +161,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* index = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* array = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* array = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
@@ -269,9 +269,9 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* value = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
-  Definition* array = builder.AddParameter(2, /*with_frame=*/false);
+  Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GetLengthFieldForArrayCid(array_cid));
@@ -473,8 +473,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* index = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* str = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* str = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
   index =
       PrepareIndexedOp(flow_graph, &builder, str, index, Slot::String_length());
@@ -536,8 +536,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* right = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* left = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* left = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* right = builder.AddParameter(1, /*with_frame=*/false);
 
   Cids* value_check = Cids::CreateMonomorphic(zone, cid);
   // Check argument. Receiver (left) is known to be a Float32x4.
@@ -676,8 +676,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* index = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* growable_array = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* growable_array = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* index = builder.AddParameter(1, /*with_frame=*/false);
 
   index = PrepareIndexedOp(flow_graph, &builder, growable_array, index,
                            Slot::GrowableObjectArray_length());
@@ -707,9 +707,9 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* value = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
-  Definition* array = builder.AddParameter(2, /*with_frame=*/false);
+  Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::Array_length());
@@ -738,9 +738,9 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* value = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* array = builder.AddParameter(0, /*with_frame=*/false);
   Definition* index = builder.AddParameter(1, /*with_frame=*/false);
-  Definition* array = builder.AddParameter(2, /*with_frame=*/false);
+  Definition* value = builder.AddParameter(2, /*with_frame=*/false);
 
   index = PrepareIndexedOp(flow_graph, &builder, array, index,
                            Slot::GrowableObjectArray_length());
@@ -764,8 +764,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* data = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* growable_array = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* growable_array = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* data = builder.AddParameter(1, /*with_frame=*/false);
   Zone* zone = flow_graph->zone();
 
   Cids* value_check = Cids::CreateMonomorphic(zone, kArrayCid);
@@ -786,8 +786,8 @@
   auto normal_entry = graph_entry->normal_entry();
   BlockBuilder builder(flow_graph, normal_entry);
 
-  Definition* length = builder.AddParameter(0, /*with_frame=*/false);
-  Definition* growable_array = builder.AddParameter(1, /*with_frame=*/false);
+  Definition* growable_array = builder.AddParameter(0, /*with_frame=*/false);
+  Definition* length = builder.AddParameter(1, /*with_frame=*/false);
 
   builder.AddInstruction(
       new CheckSmiInstr(new Value(length), DeoptId::kNone, builder.TokenPos()));
@@ -829,9 +829,7 @@
       new ZoneGrowableArray<Value*>(num_parameters);
 
   for (intptr_t i = 0; i < num_parameters; i++) {
-    const intptr_t parameter_index = (num_parameters - i - 1);
-    Definition* value =
-        builder->AddParameter(parameter_index, /*with_frame=*/false);
+    Definition* value = builder->AddParameter(i, /*with_frame=*/false);
     Definition* unboxed_value =
         builder->AddUnboxInstr(kUnboxedDouble, value, /* is_checked = */ false);
     args->Add(new Value(unboxed_value));
diff --git a/runtime/vm/compiler/jit/compiler.cc b/runtime/vm/compiler/jit/compiler.cc
index 16b59b8..05a9a88 100644
--- a/runtime/vm/compiler/jit/compiler.cc
+++ b/runtime/vm/compiler/jit/compiler.cc
@@ -235,7 +235,7 @@
       // If interpreter is enabled and there is bytecode, LazyCompile stub
       // (which calls CompileFunction) should proceed to InterpretCall in order
       // to enter interpreter. In such case, compilation is postponed and
-      // triggered by interpreter later via OptimizeInvokedFunction.
+      // triggered by interpreter later via CompileInterpretedFunction.
       return;
     }
     // No bytecode, fall back to compilation.
@@ -350,7 +350,7 @@
   intptr_t loading_invalidation_gen_at_start() const {
     return loading_invalidation_gen_at_start_;
   }
-  RawCode* FinalizeCompilation(Assembler* assembler,
+  RawCode* FinalizeCompilation(compiler::Assembler* assembler,
                                FlowGraphCompiler* graph_compiler,
                                FlowGraph* flow_graph);
   void CheckIfBackgroundCompilerIsBeingStopped(bool optimizing_compiler);
@@ -365,7 +365,7 @@
 };
 
 RawCode* CompileParsedFunctionHelper::FinalizeCompilation(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     FlowGraphCompiler* graph_compiler,
     FlowGraph* flow_graph) {
   ASSERT(!FLAG_precompiled_mode);
@@ -651,8 +651,8 @@
 
       ASSERT(pass_state.inline_id_to_function.length() ==
              pass_state.caller_inline_id.length());
-      ObjectPoolBuilder object_pool_builder;
-      Assembler assembler(&object_pool_builder, use_far_branches);
+      compiler::ObjectPoolBuilder object_pool_builder;
+      compiler::Assembler assembler(&object_pool_builder, use_far_branches);
       FlowGraphCompiler graph_compiler(
           &assembler, flow_graph, *parsed_function(), optimized(),
           &speculative_policy, pass_state.inline_id_to_function,
@@ -678,10 +678,7 @@
           // executable).
           {
             CheckIfBackgroundCompilerIsBeingStopped(optimized());
-            SafepointOperationScope safepoint_scope(thread());
-            // Do not Garbage collect during this stage and instead allow the
-            // heap to grow.
-            NoHeapGrowthControlScope no_growth_control;
+            ForceGrowthSafepointOperationScope safepoint_scope(thread());
             CheckIfBackgroundCompilerIsBeingStopped(optimized());
             *result =
                 FinalizeCompilation(&assembler, &graph_compiler, flow_graph);
@@ -1226,13 +1223,14 @@
   DISALLOW_COPY_AND_ASSIGN(BackgroundCompilationQueue);
 };
 
-BackgroundCompiler::BackgroundCompiler(Isolate* isolate)
+BackgroundCompiler::BackgroundCompiler(Isolate* isolate, bool optimizing)
     : isolate_(isolate),
       queue_monitor_(),
       function_queue_(new BackgroundCompilationQueue()),
       done_monitor_(),
       running_(false),
       done_(true),
+      optimizing_(optimizing),
       disabled_depth_(0) {}
 
 // Fields all deleted in ::Stop; here clear them.
@@ -1257,14 +1255,11 @@
         function = function_queue()->PeekFunction();
       }
       while (running_ && !function.IsNull()) {
-        // This is false if we are compiling bytecode -> unoptimized code.
-        const bool optimizing = function.ShouldCompilerOptimize();
-        ASSERT(FLAG_enable_interpreter || optimizing);
-
-        if (optimizing) {
+        if (is_optimizing()) {
           Compiler::CompileOptimizedFunction(thread, function,
                                              Compiler::kNoOSRDeoptId);
         } else {
+          ASSERT(FLAG_enable_interpreter);
           Compiler::CompileFunction(thread, function);
         }
 
@@ -1279,7 +1274,7 @@
             const Function& old = Function::Handle(qelem->Function());
             // If an optimizable method is not optimized, put it back on
             // the background queue (unless it was passed to foreground).
-            if ((optimizing && !old.HasOptimizedCode() &&
+            if ((is_optimizing() && !old.HasOptimizedCode() &&
                  old.IsOptimizable()) ||
                 FLAG_stress_test_background_compilation) {
               if (old.is_background_optimizable() &&
@@ -1316,21 +1311,14 @@
 
 void BackgroundCompiler::Compile(const Function& function) {
   ASSERT(Thread::Current()->IsMutatorThread());
-  // TODO(srdjan): Checking different strategy for collecting garbage
-  // accumulated by background compiler.
-  if (isolate_->heap()->NeedsGarbageCollection()) {
-    isolate_->heap()->CollectMostGarbage();
+  MonitorLocker ml(&queue_monitor_);
+  ASSERT(running_);
+  if (function_queue()->ContainsObj(function)) {
+    return;
   }
-  {
-    MonitorLocker ml(&queue_monitor_);
-    ASSERT(running_);
-    if (function_queue()->ContainsObj(function)) {
-      return;
-    }
-    QueueElement* elem = new QueueElement(function);
-    function_queue()->Add(elem);
-    ml.Notify();
-  }
+  QueueElement* elem = new QueueElement(function);
+  function_queue()->Add(elem);
+  ml.Notify();
 }
 
 void BackgroundCompiler::VisitPointers(ObjectPointerVisitor* visitor) {
diff --git a/runtime/vm/compiler/jit/compiler.h b/runtime/vm/compiler/jit/compiler.h
index 10aeb8e..123e16a 100644
--- a/runtime/vm/compiler/jit/compiler.h
+++ b/runtime/vm/compiler/jit/compiler.h
@@ -130,7 +130,7 @@
 // No OSR compilation in the background compiler.
 class BackgroundCompiler {
  public:
-  explicit BackgroundCompiler(Isolate* isolate);
+  explicit BackgroundCompiler(Isolate* isolate, bool optimizing);
   virtual ~BackgroundCompiler();
 
   static void Start(Isolate* isolate) {
@@ -191,6 +191,7 @@
 
   BackgroundCompilationQueue* function_queue() const { return function_queue_; }
   bool is_running() const { return running_; }
+  bool is_optimizing() const { return optimizing_; }
 
   void Run();
 
@@ -210,6 +211,7 @@
   Monitor done_monitor_;    // Notify/wait that the thread is done.
   bool running_;            // While true, will try to read queue and compile.
   bool done_;               // True if the thread is done.
+  bool optimizing_;
 
   int16_t disabled_depth_;
 
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.cc b/runtime/vm/compiler/jit/jit_call_specializer.cc
index 189ef8b..e605176 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.cc
+++ b/runtime/vm/compiler/jit/jit_call_specializer.cc
@@ -237,7 +237,7 @@
 // with values copied from it, otherwise it is initialized with null.
 void JitCallSpecializer::LowerContextAllocation(
     Definition* alloc,
-    const GrowableArray<LocalVariable*>& context_variables,
+    const ZoneGrowableArray<const Slot*>& context_variables,
     Value* context_value) {
   ASSERT(alloc->IsAllocateContext() || alloc->IsCloneContext());
 
@@ -266,11 +266,10 @@
   flow_graph()->InsertAfter(cursor, store, nullptr, FlowGraph::kEffect);
   cursor = replacement;
 
-  for (auto variable : context_variables) {
-    const auto& field = Slot::GetContextVariableSlotFor(thread(), *variable);
+  for (auto& slot : context_variables) {
     if (context_value != nullptr) {
       LoadFieldInstr* load = new (Z) LoadFieldInstr(
-          context_value->CopyWithType(Z), field, alloc->token_pos());
+          context_value->CopyWithType(Z), *slot, alloc->token_pos());
       flow_graph()->InsertAfter(cursor, load, nullptr, FlowGraph::kValue);
       cursor = load;
       initial_value = new (Z) Value(load);
@@ -279,7 +278,7 @@
     }
 
     store = new (Z) StoreInstanceFieldInstr(
-        field, new (Z) Value(replacement), initial_value, kNoStoreBarrier,
+        *slot, new (Z) Value(replacement), initial_value, kNoStoreBarrier,
         alloc->token_pos(), StoreInstanceFieldInstr::Kind::kInitializing);
     flow_graph()->InsertAfter(cursor, store, nullptr, FlowGraph::kEffect);
     cursor = store;
@@ -287,12 +286,11 @@
 }
 
 void JitCallSpecializer::VisitAllocateContext(AllocateContextInstr* instr) {
-  LowerContextAllocation(instr, instr->context_variables(), nullptr);
+  LowerContextAllocation(instr, instr->context_slots(), nullptr);
 }
 
 void JitCallSpecializer::VisitCloneContext(CloneContextInstr* instr) {
-  LowerContextAllocation(instr, instr->context_variables(),
-                         instr->context_value());
+  LowerContextAllocation(instr, instr->context_slots(), instr->context_value());
 }
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/jit/jit_call_specializer.h b/runtime/vm/compiler/jit/jit_call_specializer.h
index 00f7f67..19c1aae 100644
--- a/runtime/vm/compiler/jit/jit_call_specializer.h
+++ b/runtime/vm/compiler/jit/jit_call_specializer.h
@@ -32,7 +32,7 @@
 
   void LowerContextAllocation(
       Definition* instr,
-      const GrowableArray<LocalVariable*>& context_variables,
+      const ZoneGrowableArray<const Slot*>& context_variables,
       Value* context_value);
 
   void ReplaceWithStaticCall(InstanceCallInstr* instr,
diff --git a/runtime/vm/compiler/method_recognizer.cc b/runtime/vm/compiler/method_recognizer.cc
index e36397c..9dda8a1 100644
--- a/runtime/vm/compiler/method_recognizer.cc
+++ b/runtime/vm/compiler/method_recognizer.cc
@@ -15,10 +15,6 @@
   return function.recognized_kind();
 }
 
-bool MethodRecognizer::AlwaysInline(const Function& function) {
-  return function.always_inline();
-}
-
 bool MethodRecognizer::PolymorphicTarget(const Function& function) {
   return function.is_polymorphic_target();
 }
@@ -219,22 +215,13 @@
     UNREACHABLE();                                                             \
   }
 
-#define SET_IS_ALWAYS_INLINE(class_name, function_name, dest, fp)              \
-  SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_always_inline, true)
-
-#define SET_IS_NEVER_INLINE(class_name, function_name, dest, fp)               \
-  SET_FUNCTION_BIT(class_name, function_name, dest, fp, set_is_inlinable, false)
-
 #define SET_IS_POLYMORPHIC_TARGET(class_name, function_name, dest, fp)         \
   SET_FUNCTION_BIT(class_name, function_name, dest, fp,                        \
                    set_is_polymorphic_target, true)
 
-  INLINE_WHITE_LIST(SET_IS_ALWAYS_INLINE);
-  INLINE_BLACK_LIST(SET_IS_NEVER_INLINE);
   POLYMORPHIC_TARGET_LIST(SET_IS_POLYMORPHIC_TARGET);
 
 #undef SET_RECOGNIZED_KIND
-#undef SET_IS_ALWAYS_INLINE
 #undef SET_IS_POLYMORPHIC_TARGET
 #undef SET_FUNCTION_BIT
 }
@@ -247,6 +234,7 @@
   libs->Add(&Library::ZoneHandle(Library::InternalLibrary()));
   libs->Add(&Library::ZoneHandle(Library::DeveloperLibrary()));
   libs->Add(&Library::ZoneHandle(Library::AsyncLibrary()));
+  libs->Add(&Library::ZoneHandle(Library::FfiLibrary()));
 }
 
 RawGrowableObjectArray* MethodRecognizer::QueryRecognizedMethods(Zone* zone) {
@@ -354,4 +342,26 @@
   return kDynamicCid;
 }
 
+intptr_t FactoryRecognizer::GetResultCidOfListFactory(Zone* zone,
+                                                      const Function& function,
+                                                      intptr_t argument_count) {
+  if (!function.IsFactory()) {
+    return kDynamicCid;
+  }
+
+  const Class& owner = Class::Handle(zone, function.Owner());
+  if ((owner.library() != Library::CoreLibrary()) &&
+      (owner.library() != Library::TypedDataLibrary())) {
+    return kDynamicCid;
+  }
+
+  if ((owner.Name() == Symbols::List().raw()) &&
+      (function.name() == Symbols::ListFactory().raw())) {
+    ASSERT(argument_count == 1 || argument_count == 2);
+    return (argument_count == 1) ? kGrowableObjectArrayCid : kArrayCid;
+  }
+
+  return ResultCid(function);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/method_recognizer.h b/runtime/vm/compiler/method_recognizer.h
index dbde9de..74889ff 100644
--- a/runtime/vm/compiler/method_recognizer.h
+++ b/runtime/vm/compiler/method_recognizer.h
@@ -35,7 +35,6 @@
   };
 
   static Kind RecognizeKind(const Function& function);
-  static bool AlwaysInline(const Function& function);
   static bool PolymorphicTarget(const Function& function);
   static intptr_t NumArgsCheckedForStaticCall(const Function& function);
 
@@ -84,8 +83,16 @@
 // Class that recognizes factories and returns corresponding result cid.
 class FactoryRecognizer : public AllStatic {
  public:
+  // Return result cid of 'factory' if it is recognized.
   // Return kDynamicCid if factory is not recognized.
   static intptr_t ResultCid(const Function& factory);
+
+  // Return result cid of 'function' called with 'argument_count' arguments,
+  // if function is a recognized list factory constructor.
+  // Return kDynamicCid if function is not recognized.
+  static intptr_t GetResultCidOfListFactory(Zone* zone,
+                                            const Function& function,
+                                            intptr_t argument_count);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/compiler/offsets_extractor.cc b/runtime/vm/compiler/offsets_extractor.cc
index 0262779..a91342f 100644
--- a/runtime/vm/compiler/offsets_extractor.cc
+++ b/runtime/vm/compiler/offsets_extractor.cc
@@ -66,8 +66,8 @@
   {                                                                            \
     auto filter = Filter;                                                      \
     bool comma = false;                                                        \
-    std::cout << "static dart::compiler::target::word " #Class "_" #Name       \
-                 "[] = {";                                                     \
+    std::cout << "static constexpr dart::compiler::target::word " #Class       \
+                 "_" #Name "[] = {";                                           \
     for (intptr_t i = static_cast<intptr_t>(First);                            \
          i <= static_cast<intptr_t>(Last); i++) {                              \
       auto v = static_cast<Type>(i);                                           \
diff --git a/runtime/vm/compiler/recognized_methods_list.h b/runtime/vm/compiler/recognized_methods_list.h
index 2116ba9..4b0c880 100644
--- a/runtime/vm/compiler/recognized_methods_list.h
+++ b/runtime/vm/compiler/recognized_methods_list.h
@@ -9,9 +9,11 @@
 
 // clang-format off
 // (class-name, function-name, recognized enum, fingerprint).
-// When adding a new function add a 0 as fingerprint, build and run to get the
-// correct fingerprint from the mismatch error (or use Library::GetFunction()
-// and print func.SourceFingerprint()).
+// When adding a new function add a 0 as fingerprint, build and run with
+// `tools/test.py vm/dart/reused_instructions_test` to get the correct
+// fingerprint from the mismatch error (or use Library::GetFunction() and print
+// func.SourceFingerprint()).
+// TODO(36376): Restore checking fingerprints of recognized methods.
 #define OTHER_RECOGNIZED_LIST(V)                                               \
   V(::, identical, ObjectIdentical, 0x49c6e96a)                                \
   V(ClassID, getID, ClassIDgetID, 0x7b18b257)                                  \
@@ -141,7 +143,8 @@
   V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0x558481c2)   \
   V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x5aa9888d)   \
   V(::, _classRangeCheck, ClassRangeCheck, 0x2ae76b84)                         \
-  V(::, _classRangeCheckNegative, ClassRangeCheckNegated, 0x5acdfb75)          \
+  V(::, _asyncStackTraceHelper, AsyncStackTraceHelper, 0)                      \
+  V(::, _abi, FfiAbi, 0x0)                                                     \
 
 // List of intrinsics:
 // (class-name, function-name, intrinsification method, fingerprint).
@@ -174,7 +177,7 @@
   V(_Double, get:isNegative, Double_getIsNegative, 0x3a59e7f4)                 \
   V(_Double, _mulFromInteger, Double_mulFromInteger, 0x2017fcf6)               \
   V(_Double, .fromInteger, DoubleFromInteger, 0x6d234f4b)                      \
-  V(_GrowableList, .withData, GrowableArray_Allocate, 0x28b2138e)              \
+  V(_GrowableList, ._withData, GrowableArray_Allocate, 0x28b2138e)             \
   V(_RegExp, _ExecuteMatch, RegExp_ExecuteMatch, 0x380184b1)                   \
   V(_RegExp, _ExecuteMatchSticky, RegExp_ExecuteMatchSticky, 0x79b8f955)       \
   V(Object, ==, ObjectEquals, 0x7b32a55a)                                      \
@@ -368,150 +371,6 @@
   ALL_INTRINSICS_LIST(V)                                                       \
   GRAPH_INTRINSICS_LIST(V)
 
-// A list of core function that should always be inlined.
-#define INLINE_WHITE_LIST(V)                                                   \
-  V(Object, ==, ObjectEquals, 0x7b32a55a)                                      \
-  V(_List, get:length, ObjectArrayLength, 0x25952390)                          \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 0x25952390)              \
-  V(_TypedListView, get:offsetInBytes, TypedDataViewOffsetInBytes, 0x0)        \
-  V(_TypedListView, get:_typedData, TypedDataViewTypedData, 0x0)               \
-  V(_TypedList, get:length, TypedListLength, 0x0)                \
-  V(_TypedListView, get:length, TypedListViewLength, 0x0)        \
-  V(_ByteDataView, get:length, ByteDataViewLength, 0x0)          \
-  V(_GrowableList, get:length, GrowableArrayLength, 0x18dd86b4)                \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 0x2e04be60)           \
-  V(_GrowableList, add, GrowableListAdd, 0x40b490b8)                           \
-  V(_GrowableList, removeLast, GrowableListRemoveLast, 0x007855e5)             \
-  V(_StringBase, get:length, StringBaseLength, 0x2a2d03d1)                     \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 0x2dca30ce)                  \
-  V(_FixedSizeArrayIterator, moveNext, FixedListIteratorMoveNext, 0x324eb20b)  \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 0x5bd2ef37)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 0x74900bb8)                  \
-  V(_List, ., ObjectArrayAllocate, 0x2121902f)                                 \
-  V(ListMixin, get:isEmpty, ListMixinIsEmpty, 0x7be74d04)                      \
-  V(_List, get:iterator, ObjectArrayIterator, 0x6c851c55)                      \
-  V(_List, forEach, ObjectArrayForEach, 0x11406b13)                            \
-  V(_List, _slice, ObjectArraySlice, 0x4c865d1d)                               \
-  V(_ImmutableList, get:iterator, ImmutableArrayIterator, 0x6c851c55)          \
-  V(_ImmutableList, forEach, ImmutableArrayForEach, 0x11406b13)                \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 0x7e5a8458)                   \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 0x62f615e4)                  \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 0x7d308247)                 \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 0x65ba546e)                \
-  V(_Uint8ClampedArrayView, [], Uint8ClampedArrayViewGetIndexed, 0x7d308247)   \
-  V(_Uint8ClampedArrayView, []=, Uint8ClampedArrayViewSetIndexed, 0x65ba546e)  \
-  V(_Uint16ArrayView, [], Uint16ArrayViewGetIndexed, 0xe96836dd)               \
-  V(_Uint16ArrayView, []=, Uint16ArrayViewSetIndexed, 0x15b02947)              \
-  V(_Int16ArrayView, [], Int16ArrayViewGetIndexed, 0x1b24a48b)                 \
-  V(_Int16ArrayView, []=, Int16ArrayViewSetIndexed, 0xb91ec2e6)                \
-  V(_Uint32ArrayView, [], Uint32ArrayViewGetIndexed, 0x8a4f93b3)               \
-  V(_Uint32ArrayView, []=, Uint32ArrayViewSetIndexed, 0xf54918b5)              \
-  V(_Int32ArrayView, [], Int32ArrayViewGetIndexed, 0x85040819)                 \
-  V(_Int32ArrayView, []=, Int32ArrayViewSetIndexed, 0xaec8c6f5)                \
-  V(_Uint64ArrayView, [], Uint64ArrayViewGetIndexed, 0xd0c44fe7)               \
-  V(_Uint64ArrayView, []=, Uint64ArrayViewSetIndexed, 0x402712b7)              \
-  V(_Int64ArrayView, [], Int64ArrayViewGetIndexed, 0xf3090b95)                 \
-  V(_Int64ArrayView, []=, Int64ArrayViewSetIndexed, 0xca07e497)                \
-  V(_Float32ArrayView, [], Float32ArrayViewGetIndexed, 0xef967533)             \
-  V(_Float32ArrayView, []=, Float32ArrayViewSetIndexed, 0xc9b691bd)            \
-  V(_Float64ArrayView, [], Float64ArrayViewGetIndexed, 0x9d83f585)             \
-  V(_Float64ArrayView, []=, Float64ArrayViewSetIndexed, 0x3c1adabd)            \
-  V(_ByteDataView, get:length, ByteDataViewLength, 0x0)                        \
-  V(_ByteDataView, get:offsetInBytes, ByteDataViewOffsetInBytes, 0x0)          \
-  V(_ByteDataView, get:_typedData, ByteDataViewTypedData, 0x0)                 \
-  V(_ByteDataView, setInt8, ByteDataViewSetInt8, 0x6395293e)                   \
-  V(_ByteDataView, setUint8, ByteDataViewSetUint8, 0x79979d1f)                 \
-  V(_ByteDataView, setInt16, ByteDataViewSetInt16, 0x525ec534)                 \
-  V(_ByteDataView, setUint16, ByteDataViewSetUint16, 0x48eda263)               \
-  V(_ByteDataView, setInt32, ByteDataViewSetInt32, 0x523666fa)                 \
-  V(_ByteDataView, setUint32, ByteDataViewSetUint32, 0x5a4683da)               \
-  V(_ByteDataView, setInt64, ByteDataViewSetInt64, 0x4283a650)                 \
-  V(_ByteDataView, setUint64, ByteDataViewSetUint64, 0x687a1892)               \
-  V(_ByteDataView, setFloat32, ByteDataViewSetFloat32, 0x7d5784fd)             \
-  V(_ByteDataView, setFloat64, ByteDataViewSetFloat64, 0x00101e3f)             \
-  V(_ByteDataView, getInt8, ByteDataViewGetInt8, 0x68448b4d)                   \
-  V(_ByteDataView, getUint8, ByteDataViewGetUint8, 0x5d68cbf2)                 \
-  V(_ByteDataView, getInt16, ByteDataViewGetInt16, 0x691b5ead)                 \
-  V(_ByteDataView, getUint16, ByteDataViewGetUint16, 0x78b744d8)               \
-  V(_ByteDataView, getInt32, ByteDataViewGetInt32, 0x3a0f4efa)                 \
-  V(_ByteDataView, getUint32, ByteDataViewGetUint32, 0x583261be)               \
-  V(_ByteDataView, getInt64, ByteDataViewGetInt64, 0x77de471c)                 \
-  V(_ByteDataView, getUint64, ByteDataViewGetUint64, 0x0ffadc4b)               \
-  V(_ByteDataView, getFloat32, ByteDataViewGetFloat32, 0x6a205749)             \
-  V(_ByteDataView, getFloat64, ByteDataViewGetFloat64, 0x69f58d27)             \
-  V(::, exp, MathExp, 0x32ab9efa)                                              \
-  V(::, log, MathLog, 0x1ee8f9fc)                                              \
-  V(::, max, MathMax, 0x377e8889)                                              \
-  V(::, min, MathMin, 0x32ebc57d)                                              \
-  V(::, pow, MathPow, 0x79efc5a2)                                              \
-  V(::, _classRangeCheck, ClassRangeCheck, 0x2ae76b84)                         \
-  V(::, _classRangeCheckNegative, ClassRangeCheckNegated, 0x5acdfb75)          \
-  V(::, _toInt, ConvertMaskedInt, 0x713908fd)                                  \
-  V(::, _toInt8, ConvertIntToInt8, 0x7484a780)                                 \
-  V(::, _toUint8, ConvertIntToUint8, 0x0a15b522)                               \
-  V(::, _toInt16, ConvertIntToInt16, 0x0a83fcc6)                               \
-  V(::, _toUint16, ConvertIntToUint16, 0x6087d1af)                             \
-  V(::, _toInt32, ConvertIntToInt32, 0x62b451b9)                               \
-  V(::, _toUint32, ConvertIntToUint32, 0x17a8e085)                             \
-  V(::, _byteSwap16, ByteSwap16, 0x44f173be)                                   \
-  V(::, _byteSwap32, ByteSwap32, 0x6219333b)                                   \
-  V(::, _byteSwap64, ByteSwap64, 0x9abe57e0)                                   \
-  V(Lists, copy, ListsCopy, 0x40e974f6)                                        \
-  V(_HashVMBase, get:_index, LinkedHashMap_getIndex, 0x02477157)               \
-  V(_HashVMBase, set:_index, LinkedHashMap_setIndex, 0x4fc8d5e0)               \
-  V(_HashVMBase, get:_data, LinkedHashMap_getData, 0x2d7a70ac)                 \
-  V(_HashVMBase, set:_data, LinkedHashMap_setData, 0x0ec032e8)                 \
-  V(_HashVMBase, get:_usedData, LinkedHashMap_getUsedData, 0x088599ed)         \
-  V(_HashVMBase, set:_usedData, LinkedHashMap_setUsedData, 0x5f42ca86)         \
-  V(_HashVMBase, get:_hashMask, LinkedHashMap_getHashMask, 0x32f3b13b)         \
-  V(_HashVMBase, set:_hashMask, LinkedHashMap_setHashMask, 0x7219c45b)         \
-  V(_HashVMBase, get:_deletedKeys, LinkedHashMap_getDeletedKeys, 0x558481c2)   \
-  V(_HashVMBase, set:_deletedKeys, LinkedHashMap_setDeletedKeys, 0x5aa9888d)   \
-
-// A list of core function that should never be inlined.
-#define INLINE_BLACK_LIST(V)                                                   \
-  V(::, asin, MathAsin, 0x2ecc2fcd)                                            \
-  V(::, acos, MathAcos, 0x08cf2212)                                            \
-  V(::, atan, MathAtan, 0x1e2731d5)                                            \
-  V(::, atan2, MathAtan2, 0x39f1fa41)                                          \
-  V(::, cos, MathCos, 0x459bf5fe)                                              \
-  V(::, sin, MathSin, 0x6b7bd98c)                                              \
-  V(::, sqrt, MathSqrt, 0x70482cf3)                                            \
-  V(::, tan, MathTan, 0x3bcd772a)                                              \
-  V(_BigIntImpl, _lsh, Bigint_lsh, 0x5b6cfc8b)                                 \
-  V(_BigIntImpl, _rsh, Bigint_rsh, 0x6ff14a49)                                 \
-  V(_BigIntImpl, _absAdd, Bigint_absAdd, 0x5bf14238)                           \
-  V(_BigIntImpl, _absSub, Bigint_absSub, 0x1de5bd32)                           \
-  V(_BigIntImpl, _mulAdd, Bigint_mulAdd, 0x6f277966)                           \
-  V(_BigIntImpl, _sqrAdd, Bigint_sqrAdd, 0x68e4c8ea)                           \
-  V(_BigIntImpl, _estimateQuotientDigit, Bigint_estimateQuotientDigit,         \
-    0x35456d91)                                                                \
-  V(_BigIntMontgomeryReduction, _mulMod, Montgomery_mulMod, 0x0f7b0375)        \
-  V(_Double, >, Double_greaterThan, 0x4f1375a3)                                \
-  V(_Double, >=, Double_greaterEqualThan, 0x4260c184)                          \
-  V(_Double, <, Double_lessThan, 0x365d1eba)                                   \
-  V(_Double, <=, Double_lessEqualThan, 0x74b5eb64)                             \
-  V(_Double, ==, Double_equal, 0x613492fc)                                     \
-  V(_Double, +, Double_add, 0x53994370)                                        \
-  V(_Double, -, Double_sub, 0x3b69d466)                                        \
-  V(_Double, *, Double_mul, 0x2bb9bd5d)                                        \
-  V(_Double, /, Double_div, 0x483eee28)                                        \
-  V(_IntegerImplementation, +, Integer_add, 0x43d53af7)                        \
-  V(_IntegerImplementation, -, Integer_sub, 0x2dc22e03)                        \
-  V(_IntegerImplementation, *, Integer_mul, 0x4e7a1c24)                        \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 0x4efb2d39)               \
-  V(_IntegerImplementation, unary-, Integer_negate, 0x428bf6fa)                \
-  V(_IntegerImplementation, &, Integer_bitAnd, 0x5ab35f30)                     \
-  V(_IntegerImplementation, |, Integer_bitOr, 0x267fa107)                      \
-  V(_IntegerImplementation, ^, Integer_bitXor, 0x0c7b0230)                     \
-  V(_IntegerImplementation, >, Integer_greaterThan, 0x6599a6e1)                \
-  V(_IntegerImplementation, ==, Integer_equal, 0x58abc487)                     \
-  V(_IntegerImplementation, <, Integer_lessThan, 0x365d1eba)                   \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 0x74b5eb64)             \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 0x4260c184)          \
-  V(_IntegerImplementation, <<, Integer_shl, 0x371c45fa)                       \
-  V(_IntegerImplementation, >>, Integer_sar, 0x2b630578)                       \
-
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
   V(_StringBase, [], StringBaseCharAt, 0x7cbb8603)                             \
@@ -546,7 +405,7 @@
 //  result-cid, fingerprint).
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
   V(_ListFactory, _List, ., kArrayCid, 0x2121902f)                             \
-  V(_GrowableListWithData, _GrowableList, .withData, kGrowableObjectArrayCid,  \
+  V(_GrowableListWithData, _GrowableList, ._withData, kGrowableObjectArrayCid, \
     0x28b2138e)                                                                \
   V(_GrowableListFactory, _GrowableList, ., kGrowableObjectArrayCid,           \
     0x3eed680b)                                                                \
diff --git a/runtime/vm/compiler/runtime_api.cc b/runtime/vm/compiler/runtime_api.cc
index ff30fd9..b5362e8 100644
--- a/runtime/vm/compiler/runtime_api.cc
+++ b/runtime/vm/compiler/runtime_api.cc
@@ -532,6 +532,10 @@
   return dart::Thread::ExecutionState::kThreadInNative;
 }
 
+uword Thread::vm_execution_state() {
+  return dart::Thread::ExecutionState::kThreadInVM;
+}
+
 uword Thread::vm_tag_compiled_id() {
   return dart::VMTag::kDartCompiledTagId;
 }
diff --git a/runtime/vm/compiler/runtime_api.h b/runtime/vm/compiler/runtime_api.h
index 5f0f76b..8e85af1 100644
--- a/runtime/vm/compiler/runtime_api.h
+++ b/runtime/vm/compiler/runtime_api.h
@@ -185,7 +185,7 @@
 #endif
 
 typedef void (*RuntimeEntryCallInternal)(const dart::RuntimeEntry*,
-                                         compiler::Assembler*,
+                                         Assembler*,
                                          intptr_t);
 
 #if !defined(TARGET_ARCH_DBC)
@@ -198,7 +198,7 @@
  public:
   virtual ~RuntimeEntry() {}
 
-  void Call(compiler::Assembler* assembler, intptr_t argument_count) const {
+  void Call(Assembler* assembler, intptr_t argument_count) const {
     ASSERT(call_ != NULL);
     ASSERT(runtime_entry_ != NULL);
 
@@ -660,6 +660,7 @@
   static uword safepoint_state_acquired();
 
   static word execution_state_offset();
+  static uword vm_execution_state();
   static uword native_execution_state();
   static uword generated_execution_state();
   static word stack_overflow_flags_offset();
@@ -695,6 +696,8 @@
   static word deoptimize_stub_offset();
   static word enter_safepoint_stub_offset();
   static word exit_safepoint_stub_offset();
+  static word call_native_through_safepoint_stub_offset();
+  static word call_native_through_safepoint_entry_point_offset();
 #endif  // !defined(TARGET_ARCH_DBC)
 
   static word no_scope_native_wrapper_entry_point_offset();
diff --git a/runtime/vm/compiler/runtime_offsets_extracted.h b/runtime/vm/compiler/runtime_offsets_extracted.h
index a3ceb18..507f2d9 100644
--- a/runtime/vm/compiler/runtime_offsets_extracted.h
+++ b/runtime/vm/compiler/runtime_offsets_extracted.h
@@ -138,13 +138,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 24;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 8;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 12;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 16;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 20;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 4;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 36;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 32;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 56;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 16;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 16;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 24;
@@ -191,60 +191,64 @@
 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 = 280;
+    Thread_AllocateArray_entry_point_offset = 288;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    612;
+    624;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    616;
+    628;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 192;
+    Thread_array_write_barrier_entry_point_offset = 196;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     84;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 240;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 248;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 104;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 100;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 196;
+    Thread_call_to_runtime_entry_point_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 132;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 644;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 656;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    224;
+    228;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 156;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    228;
+    232;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     160;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    260;
+    268;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 256;
+    Thread_double_negate_address_offset = 264;
 static constexpr dart::compiler::target::word Thread_end_offset = 60;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    628;
+    640;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 184;
 static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_entry_point_offset = 240;
+static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 120;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 272;
+    Thread_float_absolute_address_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 268;
+    Thread_float_negate_address_offset = 276;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    264;
+    272;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 276;
+    Thread_float_zerow_address_offset = 284;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    620;
+    632;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 244;
+    Thread_interpret_call_entry_point_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 128;
 static constexpr dart::compiler::target::word
@@ -259,38 +263,38 @@
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 72;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 216;
+    Thread_megamorphic_call_checked_entry_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_monomorphic_miss_entry_offset = 220;
+    Thread_monomorphic_miss_entry_offset = 224;
 static constexpr dart::compiler::target::word
     Thread_monomorphic_miss_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 236;
+    Thread_no_scope_native_wrapper_entry_point_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 204;
+    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_with_fpu_regs_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 200;
+    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 204;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_without_fpu_regs_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 96;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 248;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 624;
+    Thread_predefined_symbols_address_offset = 256;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 636;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    632;
+    644;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 172;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 40;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 212;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 216;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 208;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 212;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 144;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
@@ -305,12 +309,12 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     108;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 188;
+    Thread_write_barrier_entry_point_offset = 192;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     44;
 static constexpr dart::compiler::target::word
-    Thread_verify_callback_entry_offset = 232;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 636;
+    Thread_verify_callback_entry_offset = 236;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 648;
 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 = 16;
@@ -339,12 +343,14 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 168;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 16;
-static dart::compiler::target::word Code_entry_point_offset[] = {4, 12, 8, 16};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {4, 8};
-static dart::compiler::target::word
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    4, 12, 8, 16};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        576, 580, 584, 588, 592, -1, 596, 600,
-        604, 608, -1,  -1,  -1,  -1, -1,  -1};
+        588, 592, 596, 600, 604, -1, 608, 612,
+        616, 620, -1,  -1,  -1,  -1, -1,  -1};
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
@@ -491,13 +497,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 48;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 16;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 40;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 8;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 72;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 64;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 112;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 32;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 32;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 48;
@@ -544,60 +550,64 @@
 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 = 552;
+    Thread_AllocateArray_entry_point_offset = 568;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1232;
+    1256;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1240;
+    1264;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 376;
+    Thread_array_write_barrier_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     168;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 472;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 488;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 200;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 384;
+    Thread_call_to_runtime_entry_point_offset = 392;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1296;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1320;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 304;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     312;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    512;
+    528;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 504;
+    Thread_double_negate_address_offset = 520;
 static constexpr dart::compiler::target::word Thread_end_offset = 120;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1264;
+    1288;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 360;
 static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_stub_offset = 368;
+static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_entry_point_offset = 472;
+static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 232;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 224;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 536;
+    Thread_float_absolute_address_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 528;
+    Thread_float_negate_address_offset = 544;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    520;
+    536;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 544;
+    Thread_float_zerow_address_offset = 560;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1248;
+    1272;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 480;
+    Thread_interpret_call_entry_point_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 248;
 static constexpr dart::compiler::target::word
@@ -612,38 +622,38 @@
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 144;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 424;
+    Thread_megamorphic_call_checked_entry_offset = 432;
 static constexpr dart::compiler::target::word
-    Thread_monomorphic_miss_entry_offset = 432;
+    Thread_monomorphic_miss_entry_offset = 440;
 static constexpr dart::compiler::target::word
     Thread_monomorphic_miss_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 464;
+    Thread_no_scope_native_wrapper_entry_point_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 400;
+    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 408;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_with_fpu_regs_stub_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 392;
+    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 400;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_without_fpu_regs_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 488;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1256;
+    Thread_predefined_symbols_address_offset = 504;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1280;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1272;
+    1296;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 80;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 424;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 416;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
@@ -658,13 +668,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     208;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 368;
+    Thread_write_barrier_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     88;
 static constexpr dart::compiler::target::word
-    Thread_verify_callback_entry_offset = 456;
+    Thread_verify_callback_entry_offset = 464;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1280;
+    1304;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -694,13 +704,14 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 288;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 32;
-static dart::compiler::target::word Code_entry_point_offset[] = {8, 24, 16, 32};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {8,
-                                                                          16};
-static dart::compiler::target::word
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    8, 24, 16, 32};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1144, 1152, 1160, 1168, -1,   -1,   1176, 1184,
-        1192, 1200, 1208, -1,   1216, 1224, -1,   -1};
+        1168, 1176, 1184, 1192, -1,   -1,   1200, 1208,
+        1216, 1224, 1232, -1,   1240, 1248, -1,   -1};
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
@@ -845,13 +856,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 24;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 8;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 12;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 16;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 20;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 4;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 36;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 32;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 56;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 16;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 16;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 24;
@@ -898,60 +909,64 @@
 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 = 280;
+    Thread_AllocateArray_entry_point_offset = 288;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    576;
+    588;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    580;
+    592;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 112;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 192;
+    Thread_array_write_barrier_entry_point_offset = 196;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     84;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 240;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 248;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 104;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 100;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 196;
+    Thread_call_to_runtime_entry_point_offset = 200;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 132;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 608;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 620;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    224;
+    228;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 156;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    228;
+    232;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     160;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    260;
+    268;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 256;
+    Thread_double_negate_address_offset = 264;
 static constexpr dart::compiler::target::word Thread_end_offset = 60;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 180;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    592;
+    604;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 184;
 static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_stub_offset = 188;
+static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_entry_point_offset = 240;
+static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 120;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 116;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 272;
+    Thread_float_absolute_address_offset = 280;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 268;
+    Thread_float_negate_address_offset = 276;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    264;
+    272;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 276;
+    Thread_float_zerow_address_offset = 284;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    584;
+    596;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 244;
+    Thread_interpret_call_entry_point_offset = 252;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 128;
 static constexpr dart::compiler::target::word
@@ -966,38 +981,38 @@
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 72;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 216;
+    Thread_megamorphic_call_checked_entry_offset = 220;
 static constexpr dart::compiler::target::word
-    Thread_monomorphic_miss_entry_offset = 220;
+    Thread_monomorphic_miss_entry_offset = 224;
 static constexpr dart::compiler::target::word
     Thread_monomorphic_miss_stub_offset = 152;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 236;
+    Thread_no_scope_native_wrapper_entry_point_offset = 244;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 204;
+    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 208;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_with_fpu_regs_stub_offset = 140;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 200;
+    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 204;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_without_fpu_regs_stub_offset = 136;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 96;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 248;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 588;
+    Thread_predefined_symbols_address_offset = 256;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 600;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    596;
+    608;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 172;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 40;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 212;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 216;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 148;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 208;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 212;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 144;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
@@ -1012,12 +1027,12 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     108;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 188;
+    Thread_write_barrier_entry_point_offset = 192;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     44;
 static constexpr dart::compiler::target::word
-    Thread_verify_callback_entry_offset = 232;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 600;
+    Thread_verify_callback_entry_offset = 236;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 612;
 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 = 16;
@@ -1046,8 +1061,10 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 168;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 16;
-static dart::compiler::target::word Code_entry_point_offset[] = {4, 12, 8, 16};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    4, 12, 8, 16};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {4, 8};
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
@@ -1194,13 +1211,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 48;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 16;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 40;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 8;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 72;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 64;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 112;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 32;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 32;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 48;
@@ -1247,60 +1264,64 @@
 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 = 552;
+    Thread_AllocateArray_entry_point_offset = 568;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    1320;
+    1344;
 static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
-    1328;
+    1352;
 static constexpr dart::compiler::target::word
     Thread_array_write_barrier_code_offset = 216;
 static constexpr dart::compiler::target::word
-    Thread_array_write_barrier_entry_point_offset = 376;
+    Thread_array_write_barrier_entry_point_offset = 384;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     168;
 static constexpr dart::compiler::target::word
-    Thread_auto_scope_native_wrapper_entry_point_offset = 472;
+    Thread_auto_scope_native_wrapper_entry_point_offset = 488;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 200;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 192;
 static constexpr dart::compiler::target::word
-    Thread_call_to_runtime_entry_point_offset = 384;
+    Thread_call_to_runtime_entry_point_offset = 392;
 static constexpr dart::compiler::target::word
     Thread_call_to_runtime_stub_offset = 256;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1384;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 1408;
 static constexpr dart::compiler::target::word Thread_optimize_entry_offset =
-    440;
+    448;
 static constexpr dart::compiler::target::word Thread_optimize_stub_offset = 304;
 static constexpr dart::compiler::target::word Thread_deoptimize_entry_offset =
-    448;
+    456;
 static constexpr dart::compiler::target::word Thread_deoptimize_stub_offset =
     312;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
-    512;
+    528;
 static constexpr dart::compiler::target::word
-    Thread_double_negate_address_offset = 504;
+    Thread_double_negate_address_offset = 520;
 static constexpr dart::compiler::target::word Thread_end_offset = 120;
 static constexpr dart::compiler::target::word
     Thread_enter_safepoint_stub_offset = 352;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    1352;
+    1376;
 static constexpr dart::compiler::target::word
     Thread_exit_safepoint_stub_offset = 360;
 static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_stub_offset = 368;
+static constexpr dart::compiler::target::word
+    Thread_call_native_through_safepoint_entry_point_offset = 472;
+static constexpr dart::compiler::target::word
     Thread_fix_allocation_stub_code_offset = 232;
 static constexpr dart::compiler::target::word
     Thread_fix_callers_target_code_offset = 224;
 static constexpr dart::compiler::target::word
-    Thread_float_absolute_address_offset = 536;
+    Thread_float_absolute_address_offset = 552;
 static constexpr dart::compiler::target::word
-    Thread_float_negate_address_offset = 528;
+    Thread_float_negate_address_offset = 544;
 static constexpr dart::compiler::target::word Thread_float_not_address_offset =
-    520;
+    536;
 static constexpr dart::compiler::target::word
-    Thread_float_zerow_address_offset = 544;
+    Thread_float_zerow_address_offset = 560;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    1336;
+    1360;
 static constexpr dart::compiler::target::word
-    Thread_interpret_call_entry_point_offset = 480;
+    Thread_interpret_call_entry_point_offset = 496;
 static constexpr dart::compiler::target::word
     Thread_invoke_dart_code_from_bytecode_stub_offset = 248;
 static constexpr dart::compiler::target::word
@@ -1315,38 +1336,38 @@
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 144;
 static constexpr dart::compiler::target::word
-    Thread_megamorphic_call_checked_entry_offset = 424;
+    Thread_megamorphic_call_checked_entry_offset = 432;
 static constexpr dart::compiler::target::word
-    Thread_monomorphic_miss_entry_offset = 432;
+    Thread_monomorphic_miss_entry_offset = 440;
 static constexpr dart::compiler::target::word
     Thread_monomorphic_miss_stub_offset = 296;
 static constexpr dart::compiler::target::word
-    Thread_no_scope_native_wrapper_entry_point_offset = 464;
+    Thread_no_scope_native_wrapper_entry_point_offset = 480;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 400;
+    Thread_null_error_shared_with_fpu_regs_entry_point_offset = 408;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_with_fpu_regs_stub_offset = 272;
 static constexpr dart::compiler::target::word
-    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 392;
+    Thread_null_error_shared_without_fpu_regs_entry_point_offset = 400;
 static constexpr dart::compiler::target::word
     Thread_null_error_shared_without_fpu_regs_stub_offset = 264;
 static constexpr dart::compiler::target::word Thread_object_null_offset = 184;
 static constexpr dart::compiler::target::word
-    Thread_predefined_symbols_address_offset = 488;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1344;
+    Thread_predefined_symbols_address_offset = 504;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 1368;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    1360;
+    1384;
 static constexpr dart::compiler::target::word
     Thread_slow_type_test_stub_offset = 336;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 80;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 416;
+    Thread_stack_overflow_shared_with_fpu_regs_entry_point_offset = 424;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_with_fpu_regs_stub_offset = 288;
 static constexpr dart::compiler::target::word
-    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 408;
+    Thread_stack_overflow_shared_without_fpu_regs_entry_point_offset = 416;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_shared_without_fpu_regs_stub_offset = 280;
 static constexpr dart::compiler::target::word Thread_store_buffer_block_offset =
@@ -1361,13 +1382,13 @@
 static constexpr dart::compiler::target::word Thread_write_barrier_code_offset =
     208;
 static constexpr dart::compiler::target::word
-    Thread_write_barrier_entry_point_offset = 368;
+    Thread_write_barrier_entry_point_offset = 376;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     88;
 static constexpr dart::compiler::target::word
-    Thread_verify_callback_entry_offset = 456;
+    Thread_verify_callback_entry_offset = 464;
 static constexpr dart::compiler::target::word Thread_callback_code_offset =
-    1368;
+    1392;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1397,14 +1418,15 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 288;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 32;
-static dart::compiler::target::word Code_entry_point_offset[] = {8, 24, 16, 32};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {8,
-                                                                          16};
-static dart::compiler::target::word
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    8, 24, 16, 32};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {8, 16};
+static constexpr dart::compiler::target::word
     Thread_write_barrier_wrappers_thread_offset[] = {
-        1144, 1152, 1160, 1168, 1176, 1184, 1192, 1200, 1208, 1216, 1224,
-        1232, 1240, 1248, 1256, -1,   -1,   -1,   -1,   1264, 1272, 1280,
-        1288, 1296, 1304, 1312, -1,   -1,   -1,   -1,   -1,   -1};
+        1168, 1176, 1184, 1192, 1200, 1208, 1216, 1224, 1232, 1240, 1248,
+        1256, 1264, 1272, 1280, -1,   -1,   -1,   -1,   1288, 1296, 1304,
+        1312, 1320, 1328, 1336, -1,   -1,   -1,   -1,   -1,   -1};
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
@@ -1551,13 +1573,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 52;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 32;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 48;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 16;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 32;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 40;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 88;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 8;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 72;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 40;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 48;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 56;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 64;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 112;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 32;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 32;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 48;
@@ -1606,23 +1628,23 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 296;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    888;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     896;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    904;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     168;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 216;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 200;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 192;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 952;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 960;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     256;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 248;
 static constexpr dart::compiler::target::word Thread_end_offset = 120;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    920;
+    928;
 static constexpr dart::compiler::target::word
     Thread_float_absolute_address_offset = 280;
 static constexpr dart::compiler::target::word
@@ -1632,7 +1654,7 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 288;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    904;
+    912;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 96;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 144;
@@ -1641,9 +1663,9 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 184;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 232;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 912;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 920;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    928;
+    936;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 72;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 80;
@@ -1658,7 +1680,7 @@
 static constexpr dart::compiler::target::word Thread_vm_tag_offset = 160;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     88;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 936;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 944;
 static constexpr dart::compiler::target::word TimelineStream_enabled_offset =
     16;
 static constexpr dart::compiler::target::word TwoByteString_data_offset = 16;
@@ -1688,9 +1710,10 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 288;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 32;
-static dart::compiler::target::word Code_entry_point_offset[] = {8, 24, 16, 32};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {8,
-                                                                          16};
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    8, 24, 16, 32};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {8, 16};
 static constexpr dart::compiler::target::word Array_header_size = 24;
 static constexpr dart::compiler::target::word Context_header_size = 24;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
@@ -1835,13 +1858,13 @@
 static constexpr dart::compiler::target::word ICData_state_bits_offset = 28;
 static constexpr dart::compiler::target::word
     ICData_receivers_static_type_offset = 16;
-static constexpr dart::compiler::target::word Isolate_class_table_offset = 24;
-static constexpr dart::compiler::target::word Isolate_current_tag_offset = 8;
-static constexpr dart::compiler::target::word Isolate_default_tag_offset = 12;
-static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 16;
-static constexpr dart::compiler::target::word Isolate_object_store_offset = 20;
-static constexpr dart::compiler::target::word Isolate_single_step_offset = 44;
-static constexpr dart::compiler::target::word Isolate_user_tag_offset = 4;
+static constexpr dart::compiler::target::word Isolate_class_table_offset = 36;
+static constexpr dart::compiler::target::word Isolate_current_tag_offset = 20;
+static constexpr dart::compiler::target::word Isolate_default_tag_offset = 24;
+static constexpr dart::compiler::target::word Isolate_ic_miss_code_offset = 28;
+static constexpr dart::compiler::target::word Isolate_object_store_offset = 32;
+static constexpr dart::compiler::target::word Isolate_single_step_offset = 56;
+static constexpr dart::compiler::target::word Isolate_user_tag_offset = 16;
 static constexpr dart::compiler::target::word LinkedHashMap_data_offset = 16;
 static constexpr dart::compiler::target::word
     LinkedHashMap_deleted_keys_offset = 24;
@@ -1890,23 +1913,23 @@
 static constexpr dart::compiler::target::word
     Thread_AllocateArray_entry_point_offset = 152;
 static constexpr dart::compiler::target::word Thread_active_exception_offset =
-    448;
-static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
     452;
+static constexpr dart::compiler::target::word Thread_active_stacktrace_offset =
+    456;
 static constexpr dart::compiler::target::word Thread_async_stack_trace_offset =
     84;
 static constexpr dart::compiler::target::word
     Thread_auto_scope_native_wrapper_entry_point_offset = 112;
 static constexpr dart::compiler::target::word Thread_bool_false_offset = 104;
 static constexpr dart::compiler::target::word Thread_bool_true_offset = 100;
-static constexpr dart::compiler::target::word Thread_dart_stream_offset = 480;
+static constexpr dart::compiler::target::word Thread_dart_stream_offset = 484;
 static constexpr dart::compiler::target::word Thread_double_abs_address_offset =
     132;
 static constexpr dart::compiler::target::word
     Thread_double_negate_address_offset = 128;
 static constexpr dart::compiler::target::word Thread_end_offset = 60;
 static constexpr dart::compiler::target::word Thread_execution_state_offset =
-    464;
+    468;
 static constexpr dart::compiler::target::word
     Thread_float_absolute_address_offset = 144;
 static constexpr dart::compiler::target::word
@@ -1916,7 +1939,7 @@
 static constexpr dart::compiler::target::word
     Thread_float_zerow_address_offset = 148;
 static constexpr dart::compiler::target::word Thread_global_object_pool_offset =
-    456;
+    460;
 static constexpr dart::compiler::target::word Thread_isolate_offset = 48;
 static constexpr dart::compiler::target::word
     Thread_marking_stack_block_offset = 72;
@@ -1925,9 +1948,9 @@
 static constexpr dart::compiler::target::word Thread_object_null_offset = 96;
 static constexpr dart::compiler::target::word
     Thread_predefined_symbols_address_offset = 120;
-static constexpr dart::compiler::target::word Thread_resume_pc_offset = 460;
+static constexpr dart::compiler::target::word Thread_resume_pc_offset = 464;
 static constexpr dart::compiler::target::word Thread_safepoint_state_offset =
-    468;
+    472;
 static constexpr dart::compiler::target::word Thread_stack_limit_offset = 36;
 static constexpr dart::compiler::target::word
     Thread_stack_overflow_flags_offset = 40;
@@ -1942,7 +1965,7 @@
 static constexpr dart::compiler::target::word Thread_vm_tag_offset = 80;
 static constexpr dart::compiler::target::word Thread_write_barrier_mask_offset =
     44;
-static constexpr dart::compiler::target::word Thread_callback_code_offset = 472;
+static constexpr dart::compiler::target::word Thread_callback_code_offset = 476;
 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 = 16;
@@ -1971,8 +1994,10 @@
 static constexpr dart::compiler::target::word ClassTable_element_size = 168;
 static constexpr dart::compiler::target::word
     ClassTable_class_heap_stats_table_offset = 16;
-static dart::compiler::target::word Code_entry_point_offset[] = {4, 12, 8, 16};
-static dart::compiler::target::word Code_function_entry_point_offset[] = {4, 8};
+static constexpr dart::compiler::target::word Code_entry_point_offset[] = {
+    4, 12, 8, 16};
+static constexpr dart::compiler::target::word
+    Code_function_entry_point_offset[] = {4, 8};
 static constexpr dart::compiler::target::word Array_header_size = 12;
 static constexpr dart::compiler::target::word Context_header_size = 12;
 static constexpr dart::compiler::target::word Double_InstanceSize = 16;
diff --git a/runtime/vm/compiler/runtime_offsets_list.h b/runtime/vm/compiler/runtime_offsets_list.h
index 74264ca..29588ec 100644
--- a/runtime/vm/compiler/runtime_offsets_list.h
+++ b/runtime/vm/compiler/runtime_offsets_list.h
@@ -167,6 +167,8 @@
   NOT_IN_DBC(FIELD(Thread, enter_safepoint_stub_offset))                       \
   FIELD(Thread, execution_state_offset)                                        \
   NOT_IN_DBC(FIELD(Thread, exit_safepoint_stub_offset))                        \
+  NOT_IN_DBC(FIELD(Thread, call_native_through_safepoint_stub_offset))         \
+  NOT_IN_DBC(FIELD(Thread, call_native_through_safepoint_entry_point_offset))  \
   NOT_IN_DBC(FIELD(Thread, fix_allocation_stub_code_offset))                   \
   NOT_IN_DBC(FIELD(Thread, fix_callers_target_code_offset))                    \
   FIELD(Thread, float_absolute_address_offset)                                 \
diff --git a/runtime/vm/compiler/stub_code_compiler_arm.cc b/runtime/vm/compiler/stub_code_compiler_arm.cc
index dd3b49f..39974a2 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm.cc
@@ -198,8 +198,7 @@
     Assembler* assembler,
     const Object& closure_allocation_stub,
     const Object& context_allocation_stub) {
-  const intptr_t kReceiverOffset =
-      compiler::target::frame_layout.param_end_from_fp + 1;
+  const intptr_t kReceiverOffset = target::frame_layout.param_end_from_fp + 1;
 
   __ EnterStubFrame();
 
@@ -292,6 +291,13 @@
 
   __ EnterFrame((1 << FP) | (1 << LR), 0);
   __ ReserveAlignedFrameSpace(0);
+
+  // Set the execution state to VM while waiting for the safepoint to end.
+  // This isn't strictly necessary but enables tests to check that we're not
+  // in native code anymore. See tests/ffi/function_gc_test.dart for example.
+  __ LoadImmediate(R0, target::Thread::vm_execution_state());
+  __ str(R0, Address(THR, target::Thread::execution_state_offset()));
+
   __ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
   __ blx(R0);
   __ LeaveFrame((1 << FP) | (1 << LR), 0);
@@ -300,6 +306,31 @@
   __ Ret();
 }
 
+// Call a native function within a safepoint.
+//
+// On entry:
+//   Stack: set up for call, incl. alignment
+//   R8: target to call
+//
+// On exit:
+//   Stack: preserved
+//   NOTFP, R4: clobbered, although normally callee-saved
+void StubCodeCompiler::GenerateCallNativeThroughSafepointStub(
+    Assembler* assembler) {
+  COMPILE_ASSERT((kAbiPreservedCpuRegs & (1 << R4)) != 0);
+
+  // TransitionGeneratedToNative might clobber LR if it takes the slow path.
+  __ mov(R4, Operand(LR));
+
+  __ TransitionGeneratedToNative(R8, FPREG, R9 /*volatile*/, NOTFP);
+
+  __ blx(R8);
+
+  __ TransitionNativeToGenerated(R9 /*volatile*/, NOTFP);
+
+  __ bx(R4);
+}
+
 void StubCodeCompiler::GenerateVerifyCallbackStub(Assembler* assembler) {
   __ EnterFrame(1 << FP | 1 << LR, 0);
   __ ReserveAlignedFrameSpace(0);
@@ -710,13 +741,13 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R0);
   const intptr_t saved_exception_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R0);
   const intptr_t saved_stacktrace_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R1);
   // Result in R0 is preserved as part of pushing all registers below.
 
@@ -784,14 +815,13 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);  // Pass last FP in R0.
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into R1.
-    __ ldr(R1, Address(FP, compiler::target::frame_layout.first_local_from_fp *
+    __ ldr(R1, Address(FP, target::frame_layout.first_local_from_fp *
                                target::kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into R1.
-    __ ldr(R1, Address(FP, compiler::target::frame_layout.first_local_from_fp *
+    __ ldr(R1, Address(FP, target::frame_layout.first_local_from_fp *
                                target::kWordSize));
-    __ ldr(R2, Address(FP, (compiler::target::frame_layout.first_local_from_fp -
-                            1) *
+    __ ldr(R2, Address(FP, (target::frame_layout.first_local_from_fp - 1) *
                                target::kWordSize));
   }
   // Code above cannot cause GC.
@@ -904,7 +934,7 @@
   // Load the receiver.
   __ ldr(R2, FieldAddress(R4, target::ArgumentsDescriptor::count_offset()));
   __ add(IP, FP, Operand(R2, LSL, 1));  // R2 is Smi.
-  __ ldr(R8, Address(IP, compiler::target::frame_layout.param_end_from_fp *
+  __ ldr(R8, Address(IP, target::frame_layout.param_end_from_fp *
                              target::kWordSize));
 
   // Preserve IC data and arguments descriptor.
@@ -3149,48 +3179,6 @@
   __ b(&loop);
 }
 
-// Called from switchable IC calls.
-//  R0: receiver
-//  R9: ICData (preserved)
-// Passed to target:
-//  CODE_REG: target Code object
-//  R4: arguments descriptor
-void StubCodeCompiler::GenerateICCallThroughFunctionStub(Assembler* assembler) {
-  Label loop, found, miss;
-  __ ldr(ARGS_DESC_REG,
-         FieldAddress(R9, target::ICData::arguments_descriptor_offset()));
-  __ ldr(R8, FieldAddress(R9, target::ICData::entries_offset()));
-  __ AddImmediate(R8, target::Array::data_offset() - kHeapObjectTag);
-  // R8: first IC entry
-  __ LoadTaggedClassIdMayBeSmi(R1, R0);
-  // R1: receiver cid as Smi
-
-  __ Bind(&loop);
-  __ ldr(R2, Address(R8, 0));
-  __ cmp(R1, Operand(R2));
-  __ b(&found, EQ);
-  __ CompareImmediate(R2, target::ToRawSmi(kIllegalCid));
-  __ b(&miss, EQ);
-
-  const intptr_t entry_length =
-      target::ICData::TestEntryLengthFor(1, /*tracking_exactness=*/false) *
-      target::kWordSize;
-  __ AddImmediate(R8, entry_length);  // Next entry.
-  __ b(&loop);
-
-  __ Bind(&found);
-  const intptr_t target_offset =
-      target::ICData::TargetIndexFor(1) * target::kWordSize;
-  __ LoadFromOffset(kWord, R0, R8, target_offset);
-  __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
-  __ Branch(FieldAddress(R0, target::Function::entry_point_offset()));
-
-  __ Bind(&miss);
-  __ LoadIsolate(R2);
-  __ ldr(CODE_REG, Address(R2, target::Isolate::ic_miss_code_offset()));
-  __ Branch(FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-}
-
 void StubCodeCompiler::GenerateICCallThroughCodeStub(Assembler* assembler) {
   Label loop, found, miss;
   __ ldr(R8, FieldAddress(R9, target::ICData::entries_offset()));
@@ -3244,7 +3232,7 @@
   __ CallRuntime(kUnlinkedCallRuntimeEntry, 3);
   __ Drop(2);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R9);  // result = IC
+  __ Pop(R9);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3286,7 +3274,7 @@
   __ CallRuntime(kSingleTargetMissRuntimeEntry, 2);
   __ Drop(1);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R9);  // result = IC
+  __ Pop(R9);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3310,7 +3298,7 @@
   __ CallRuntime(kMonomorphicMissRuntimeEntry, 2);
   __ Drop(1);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R9);  // result = IC
+  __ Pop(R9);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
diff --git a/runtime/vm/compiler/stub_code_compiler_arm64.cc b/runtime/vm/compiler/stub_code_compiler_arm64.cc
index 26d8c00..9961c18 100644
--- a/runtime/vm/compiler/stub_code_compiler_arm64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_arm64.cc
@@ -236,6 +236,13 @@
   __ ReserveAlignedFrameSpace(0);
 
   __ mov(CSP, SP);
+
+  // Set the execution state to VM while waiting for the safepoint to end.
+  // This isn't strictly necessary but enables tests to check that we're not
+  // in native code anymore. See tests/ffi/function_gc_test.dart for example.
+  __ LoadImmediate(R0, target::Thread::vm_execution_state());
+  __ str(R0, Address(THR, target::Thread::execution_state_offset()));
+
   __ ldr(R0, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
   __ blr(R0);
   __ mov(SP, CALLEE_SAVED_TEMP);
@@ -245,6 +252,40 @@
   __ Ret();
 }
 
+// Calls native code within a safepoint.
+//
+// On entry:
+//   R8: target to call
+//   Stack: set up for native call (SP), aligned, CSP < SP
+//
+// On exit:
+//   R19: clobbered, although normally callee-saved
+//   Stack: preserved, CSP == SP
+void StubCodeCompiler::GenerateCallNativeThroughSafepointStub(
+    Assembler* assembler) {
+  COMPILE_ASSERT((1 << R19) & kAbiPreservedCpuRegs);
+
+  __ mov(R19, LR);
+  __ TransitionGeneratedToNative(R8, FPREG, R9 /*volatile*/);
+  __ mov(CSP, SP);
+
+#if defined(DEBUG)
+  // Check CSP alignment.
+  __ andi(R10 /*volatile*/, SP,
+          Immediate(~(OS::ActivationFrameAlignment() - 1)));
+  __ cmp(R10, Operand(SP));
+  Label done;
+  __ b(&done, EQ);
+  __ Breakpoint();
+  __ Bind(&done);
+#endif
+
+  __ blr(R8);
+  __ mov(SP, CSP);
+  __ TransitionNativeToGenerated(R9);
+  __ ret(R19);
+}
+
 void StubCodeCompiler::GenerateVerifyCallbackStub(Assembler* assembler) {
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
@@ -269,8 +310,7 @@
     Assembler* assembler,
     const Object& closure_allocation_stub,
     const Object& context_allocation_stub) {
-  const intptr_t kReceiverOffset =
-      compiler::target::frame_layout.param_end_from_fp + 1;
+  const intptr_t kReceiverOffset = target::frame_layout.param_end_from_fp + 1;
 
   __ EnterStubFrame();
 
@@ -762,13 +802,13 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R0);
   const intptr_t saved_exception_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R0);
   const intptr_t saved_stacktrace_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - R1);
   // Result in R0 is preserved as part of pushing all registers below.
 
@@ -837,16 +877,14 @@
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into R1.
     __ LoadFromOffset(
-        R1, FP,
-        compiler::target::frame_layout.first_local_from_fp * target::kWordSize);
+        R1, FP, target::frame_layout.first_local_from_fp * target::kWordSize);
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into R1.
     __ LoadFromOffset(
-        R1, FP,
-        compiler::target::frame_layout.first_local_from_fp * target::kWordSize);
-    __ LoadFromOffset(R2, FP,
-                      (compiler::target::frame_layout.first_local_from_fp - 1) *
-                          target::kWordSize);
+        R1, FP, target::frame_layout.first_local_from_fp * target::kWordSize);
+    __ LoadFromOffset(
+        R2, FP,
+        (target::frame_layout.first_local_from_fp - 1) * target::kWordSize);
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -961,9 +999,8 @@
   // Load the receiver.
   __ LoadFieldFromOffset(R2, R4, target::ArgumentsDescriptor::count_offset());
   __ add(TMP, FP, Operand(R2, LSL, 2));  // R2 is Smi.
-  __ LoadFromOffset(
-      R6, TMP,
-      compiler::target::frame_layout.param_end_from_fp * target::kWordSize);
+  __ LoadFromOffset(R6, TMP,
+                    target::frame_layout.param_end_from_fp * target::kWordSize);
 
   // Preserve IC data and arguments descriptor.
   __ Push(R5);
@@ -3229,50 +3266,6 @@
   __ b(&cid_loaded);
 }
 
-// Called from switchable IC calls.
-//  R0: receiver
-//  R5: ICData (preserved)
-// Passed to target:
-//  CODE_REG: target Code object
-//  R4: arguments descriptor
-void StubCodeCompiler::GenerateICCallThroughFunctionStub(Assembler* assembler) {
-  Label loop, found, miss;
-  __ ldr(ARGS_DESC_REG,
-         FieldAddress(R5, target::ICData::arguments_descriptor_offset()));
-  __ ldr(R8, FieldAddress(R5, target::ICData::entries_offset()));
-  __ AddImmediate(R8, target::Array::data_offset() - kHeapObjectTag);
-  // R8: first IC entry
-  __ LoadTaggedClassIdMayBeSmi(R1, R0);
-  // R1: receiver cid as Smi
-
-  __ Bind(&loop);
-  __ ldr(R2, Address(R8, 0));
-  __ cmp(R1, Operand(R2));
-  __ b(&found, EQ);
-  __ CompareImmediate(R2, target::ToRawSmi(kIllegalCid));
-  __ b(&miss, EQ);
-
-  const intptr_t entry_length =
-      target::ICData::TestEntryLengthFor(1, /*tracking_exactness=*/false) *
-      target::kWordSize;
-  __ AddImmediate(R8, entry_length);  // Next entry.
-  __ b(&loop);
-
-  __ Bind(&found);
-  const intptr_t target_offset =
-      target::ICData::TargetIndexFor(1) * target::kWordSize;
-  __ ldr(R0, Address(R8, target_offset));
-  __ ldr(R1, FieldAddress(R0, target::Function::entry_point_offset()));
-  __ ldr(CODE_REG, FieldAddress(R0, target::Function::code_offset()));
-  __ br(R1);
-
-  __ Bind(&miss);
-  __ LoadIsolate(R2);
-  __ ldr(CODE_REG, Address(R2, target::Isolate::ic_miss_code_offset()));
-  __ ldr(R1, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ br(R1);
-}
-
 void StubCodeCompiler::GenerateICCallThroughCodeStub(Assembler* assembler) {
   Label loop, found, miss;
   __ ldr(R8, FieldAddress(R5, target::ICData::entries_offset()));
@@ -3327,7 +3320,7 @@
   __ CallRuntime(kUnlinkedCallRuntimeEntry, 3);
   __ Drop(2);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R5);  // result = IC
+  __ Pop(R5);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3370,7 +3363,7 @@
   __ CallRuntime(kSingleTargetMissRuntimeEntry, 2);
   __ Drop(1);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R5);  // result = IC
+  __ Pop(R5);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3394,7 +3387,7 @@
   __ CallRuntime(kMonomorphicMissRuntimeEntry, 2);
   __ Drop(1);
   __ Pop(CODE_REG);  // result = stub
-  __ Pop(R5);  // result = IC
+  __ Pop(R5);        // result = IC
 
   __ Pop(R0);  // Restore receiver.
   __ LeaveStubFrame();
diff --git a/runtime/vm/compiler/stub_code_compiler_ia32.cc b/runtime/vm/compiler/stub_code_compiler_ia32.cc
index bb5aeccd..b770097 100644
--- a/runtime/vm/compiler/stub_code_compiler_ia32.cc
+++ b/runtime/vm/compiler/stub_code_compiler_ia32.cc
@@ -162,6 +162,13 @@
 
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
+
+  // Set the execution state to VM while waiting for the safepoint to end.
+  // This isn't strictly necessary but enables tests to check that we're not
+  // in native code anymore. See tests/ffi/function_gc_test.dart for example.
+  __ movl(Address(THR, target::Thread::execution_state_offset()),
+          Immediate(target::Thread::vm_execution_state()));
+
   __ movl(EAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
   __ call(EAX);
   __ LeaveFrame();
@@ -172,6 +179,26 @@
   __ ret();
 }
 
+// Calls a native function inside a safepoint.
+//
+// On entry:
+//   Stack: set up for native call
+//   EAX: target to call
+//
+// On exit:
+//   Stack: preserved
+//   EBX: clobbered (even though it's normally callee-saved)
+void StubCodeCompiler::GenerateCallNativeThroughSafepointStub(
+    Assembler* assembler) {
+  __ popl(EBX);
+
+  __ TransitionGeneratedToNative(EAX, FPREG, ECX /*volatile*/);
+  __ call(EAX);
+  __ TransitionNativeToGenerated(ECX /*volatile*/);
+
+  __ jmp(EBX);
+}
+
 void StubCodeCompiler::GenerateVerifyCallbackStub(Assembler* assembler) {
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
@@ -514,13 +541,13 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - EAX);
   const intptr_t saved_exception_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - EAX);
   const intptr_t saved_stacktrace_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - EDX);
   // Result in EAX is preserved as part of pushing all registers below.
 
@@ -583,18 +610,14 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into EBX.
-    __ movl(EBX,
-            Address(EBP, compiler::target::frame_layout.first_local_from_fp *
-                             target::kWordSize));
+    __ movl(EBX, Address(EBP, target::frame_layout.first_local_from_fp *
+                                  target::kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore result into EBX.
-    __ movl(EBX,
-            Address(EBP, compiler::target::frame_layout.first_local_from_fp *
-                             target::kWordSize));
-    __ movl(
-        ECX,
-        Address(EBP, (compiler::target::frame_layout.first_local_from_fp - 1) *
-                         target::kWordSize));
+    __ movl(EBX, Address(EBP, target::frame_layout.first_local_from_fp *
+                                  target::kWordSize));
+    __ movl(ECX, Address(EBP, (target::frame_layout.first_local_from_fp - 1) *
+                                  target::kWordSize));
   }
   // Code above cannot cause GC.
   __ LeaveFrame();
@@ -2674,15 +2697,6 @@
   __ jmp(&cid_loaded);
 }
 
-// Called from switchable IC calls.
-//  EBX: receiver
-//  ECX: ICData (preserved)
-// Passed to target:
-//  EDX: arguments descriptor
-void StubCodeCompiler::GenerateICCallThroughFunctionStub(Assembler* assembler) {
-  __ int3();  // AOT only.
-}
-
 void StubCodeCompiler::GenerateICCallThroughCodeStub(Assembler* assembler) {
   __ int3();  // AOT only.
 }
diff --git a/runtime/vm/compiler/stub_code_compiler_x64.cc b/runtime/vm/compiler/stub_code_compiler_x64.cc
index 414bedb..ae81917 100644
--- a/runtime/vm/compiler/stub_code_compiler_x64.cc
+++ b/runtime/vm/compiler/stub_code_compiler_x64.cc
@@ -223,6 +223,13 @@
 
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
+
+  // Set the execution state to VM while waiting for the safepoint to end.
+  // This isn't strictly necessary but enables tests to check that we're not
+  // in native code anymore. See tests/ffi/function_gc_test.dart for example.
+  __ movq(Address(THR, target::Thread::execution_state_offset()),
+          Immediate(target::Thread::vm_execution_state()));
+
   __ movq(RAX, Address(THR, kExitSafepointRuntimeEntry.OffsetFromThread()));
   __ CallCFunction(RAX);
   __ LeaveFrame();
@@ -245,6 +252,29 @@
   __ ret();
 }
 
+// Calls native code within a safepoint.
+//
+// On entry:
+//   Stack: arguments set up and aligned for native call, excl. shadow space
+//   RBX = target address to call
+//
+// On exit:
+//   Stack pointer lowered by shadow space
+//   RBX, R12 clobbered
+void StubCodeCompiler::GenerateCallNativeThroughSafepointStub(
+    Assembler* assembler) {
+  __ TransitionGeneratedToNative(RBX, FPREG);
+
+  __ popq(R12);
+  __ CallCFunction(RBX);
+
+  __ TransitionNativeToGenerated();
+
+  // Faster than jmp because it doesn't confuse the branch predictor.
+  __ pushq(R12);
+  __ ret();
+}
+
 // RBX: The extracted method.
 // RDX: The type_arguments_field_offset (or 0)
 void StubCodeCompiler::GenerateBuildMethodExtractorStub(
@@ -252,7 +282,7 @@
     const Object& closure_allocation_stub,
     const Object& context_allocation_stub) {
   const intptr_t kReceiverOffsetInWords =
-      compiler::target::frame_layout.param_end_from_fp + 1;
+      target::frame_layout.param_end_from_fp + 1;
 
   __ EnterStubFrame();
 
@@ -261,8 +291,7 @@
   __ movq(RCX, Address(THR, target::Thread::object_null_offset()));
   __ cmpq(RDX, Immediate(0));
   __ j(EQUAL, &no_type_args, Assembler::kNearJump);
-  __ movq(RAX,
-          Address(RBP, compiler::target::kWordSize * kReceiverOffsetInWords));
+  __ movq(RAX, Address(RBP, target::kWordSize * kReceiverOffsetInWords));
   __ movq(RCX, Address(RAX, RDX, TIMES_1, 0));
   __ Bind(&no_type_args);
   __ pushq(RCX);
@@ -294,8 +323,7 @@
   }
 
   // Store receiver in context
-  __ movq(RSI,
-          Address(RBP, compiler::target::kWordSize * kReceiverOffsetInWords));
+  __ movq(RSI, Address(RBP, target::kWordSize * kReceiverOffsetInWords));
   __ StoreIntoObject(
       RAX, FieldAddress(RAX, target::Context::variable_offset(0)), RSI);
 
@@ -705,13 +733,13 @@
   // The code in this frame may not cause GC. kDeoptimizeCopyFrameRuntimeEntry
   // and kDeoptimizeFillFrameRuntimeEntry are leaf runtime calls.
   const intptr_t saved_result_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - RAX);
   const intptr_t saved_exception_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - RAX);
   const intptr_t saved_stacktrace_slot_from_fp =
-      compiler::target::frame_layout.first_local_from_fp + 1 -
+      target::frame_layout.first_local_from_fp + 1 -
       (kNumberOfCpuRegisters - RDX);
   // Result in RAX is preserved as part of pushing all registers below.
 
@@ -779,19 +807,15 @@
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (kind == kLazyDeoptFromReturn) {
     // Restore result into RBX.
-    __ movq(RBX,
-            Address(RBP, compiler::target::frame_layout.first_local_from_fp *
-                             target::kWordSize));
+    __ movq(RBX, Address(RBP, target::frame_layout.first_local_from_fp *
+                                  target::kWordSize));
   } else if (kind == kLazyDeoptFromThrow) {
     // Restore exception into RBX.
-    __ movq(RBX,
-            Address(RBP, compiler::target::frame_layout.first_local_from_fp *
-                             target::kWordSize));
+    __ movq(RBX, Address(RBP, target::frame_layout.first_local_from_fp *
+                                  target::kWordSize));
     // Restore stacktrace into RDX.
-    __ movq(
-        RDX,
-        Address(RBP, (compiler::target::frame_layout.first_local_from_fp - 1) *
-                         target::kWordSize));
+    __ movq(RDX, Address(RBP, (target::frame_layout.first_local_from_fp - 1) *
+                                  target::kWordSize));
   }
   // Code above cannot cause GC.
   // There is a Dart Frame on the stack. We must restore PP and leave frame.
@@ -910,9 +934,9 @@
   __ movq(RAX, FieldAddress(R10, target::ArgumentsDescriptor::count_offset()));
   // Three words (saved pp, saved fp, stub's pc marker)
   // in the stack above the return address.
-  __ movq(RAX, Address(RSP, RAX, TIMES_4,
-                       compiler::target::frame_layout.saved_below_pc() *
-                           target::kWordSize));
+  __ movq(RAX,
+          Address(RSP, RAX, TIMES_4,
+                  target::frame_layout.saved_below_pc() * target::kWordSize));
   // Preserve IC data and arguments descriptor.
   __ pushq(RBX);
   __ pushq(R10);
@@ -3234,52 +3258,6 @@
   __ jmp(&cid_loaded);
 }
 
-// Called from switchable IC calls.
-//  RDX: receiver
-//  RBX: ICData (preserved)
-// Passed to target:
-//  CODE_REG: target Code object
-//  R10: arguments descriptor
-void StubCodeCompiler::GenerateICCallThroughFunctionStub(Assembler* assembler) {
-  Label loop, found, miss;
-  __ movq(R13, FieldAddress(RBX, target::ICData::entries_offset()));
-  __ movq(R10,
-          FieldAddress(RBX, target::ICData::arguments_descriptor_offset()));
-  __ leaq(R13, FieldAddress(R13, target::Array::data_offset()));
-  // R13: first IC entry
-  __ LoadTaggedClassIdMayBeSmi(RAX, RDX);
-  // RAX: receiver cid as Smi
-
-  __ Bind(&loop);
-  __ movq(R9, Address(R13, 0));
-  __ cmpq(RAX, R9);
-  __ j(EQUAL, &found, Assembler::kNearJump);
-
-  ASSERT(target::ToRawSmi(kIllegalCid) == 0);
-  __ testq(R9, R9);
-  __ j(ZERO, &miss, Assembler::kNearJump);
-
-  const intptr_t entry_length =
-      target::ICData::TestEntryLengthFor(1, /*tracking_exactness=*/false) *
-      target::kWordSize;
-  __ addq(R13, Immediate(entry_length));  // Next entry.
-  __ jmp(&loop);
-
-  __ Bind(&found);
-  const intptr_t target_offset =
-      target::ICData::TargetIndexFor(1) * target::kWordSize;
-  __ movq(RAX, Address(R13, target_offset));
-  __ movq(RCX, FieldAddress(RAX, target::Function::entry_point_offset()));
-  __ movq(CODE_REG, FieldAddress(RAX, target::Function::code_offset()));
-  __ jmp(RCX);
-
-  __ Bind(&miss);
-  __ LoadIsolate(RAX);
-  __ movq(CODE_REG, Address(RAX, target::Isolate::ic_miss_code_offset()));
-  __ movq(RCX, FieldAddress(CODE_REG, target::Code::entry_point_offset()));
-  __ jmp(RCX);
-}
-
 void StubCodeCompiler::GenerateICCallThroughCodeStub(Assembler* assembler) {
   Label loop, found, miss;
   __ movq(R13, FieldAddress(RBX, target::ICData::entries_offset()));
@@ -3336,7 +3314,7 @@
   __ popq(RBX);
   __ popq(RBX);
   __ popq(CODE_REG);  // result = stub
-  __ popq(RBX);  // result = IC
+  __ popq(RBX);       // result = IC
 
   __ popq(RDX);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3378,7 +3356,7 @@
   __ CallRuntime(kSingleTargetMissRuntimeEntry, 2);
   __ popq(RBX);
   __ popq(CODE_REG);  // result = stub
-  __ popq(RBX);  // result = IC
+  __ popq(RBX);       // result = IC
 
   __ popq(RDX);  // Restore receiver.
   __ LeaveStubFrame();
@@ -3402,7 +3380,7 @@
   __ CallRuntime(kMonomorphicMissRuntimeEntry, 2);
   __ popq(RBX);
   __ popq(CODE_REG);  // result = stub
-  __ popq(RBX);  // result = IC
+  __ popq(RBX);       // result = IC
 
   __ popq(RDX);  // Restore receiver.
   __ LeaveStubFrame();
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index e0b1193..9155f08 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -6,6 +6,7 @@
 #include "platform/assert.h"
 #include "vm/class_finalizer.h"
 #include "vm/code_patcher.h"
+#include "vm/compiler/frontend/bytecode_reader.h"
 #include "vm/dart_api_impl.h"
 #include "vm/heap/safepoint.h"
 #include "vm/kernel_isolate.h"
@@ -124,6 +125,9 @@
     EXPECT(func.HasCode());
     return;
   }
+  // Bytecode loading must happen on the main thread. Ensure the bytecode is
+  // loaded before asking for an unoptimized compile on a background thread.
+  kernel::BytecodeReader::ReadFunctionBytecode(thread, func);
 #if !defined(PRODUCT)
   // Constant in product mode.
   FLAG_background_compilation = true;
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 48378f7..15254c5 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -371,6 +371,7 @@
   static constexpr Register kFirstNonArgumentRegister = R8;
   static constexpr Register kSecondNonArgumentRegister = R9;
   static constexpr Register kFirstCalleeSavedCpuReg = NOTFP;
+  static constexpr Register kSecondCalleeSavedCpuReg = R4;
   static constexpr Register kStackPointerRegister = SPREG;
 };
 
diff --git a/runtime/vm/constants_kbc.h b/runtime/vm/constants_kbc.h
index 0849572..1f972f9 100644
--- a/runtime/vm/constants_kbc.h
+++ b/runtime/vm/constants_kbc.h
@@ -570,9 +570,9 @@
   V(CheckFunctionTypeArgs,               A_E, ORDN, num, reg, ___)             \
   V(CheckFunctionTypeArgs_Wide,          A_E, WIDE, num, reg, ___)             \
   V(CheckStack,                            A, ORDN, num, ___, ___)             \
-  V(Unused01,                              0, RESV, ___, ___, ___)             \
-  V(Unused02,                              0, RESV, ___, ___, ___)             \
-  V(Unused03,                              0, RESV, ___, ___, ___)             \
+  V(DebugCheck,                            0, ORDN, ___, ___, ___)             \
+  V(JumpIfUnchecked,                       T, ORDN, tgt, ___, ___)             \
+  V(JumpIfUnchecked_Wide,                  T, WIDE, tgt, ___, ___)             \
   V(Allocate,                              D, ORDN, lit, ___, ___)             \
   V(Allocate_Wide,                         D, WIDE, lit, ___, ___)             \
   V(AllocateT,                             0, ORDN, ___, ___, ___)             \
@@ -655,10 +655,10 @@
   V(InterfaceCall_Wide,                  D_F, WIDE, num, num, ___)             \
   V(Unused23,                              0, RESV, ___, ___, ___)             \
   V(Unused24,                              0, RESV, ___, ___, ___)             \
-  V(Unused25,                              0, RESV, ___, ___, ___)             \
-  V(Unused26,                              0, RESV, ___, ___, ___)             \
-  V(Unused27,                              0, RESV, ___, ___, ___)             \
-  V(Unused28,                              0, RESV, ___, ___, ___)             \
+  V(InstantiatedInterfaceCall,           D_F, ORDN, num, num, ___)             \
+  V(InstantiatedInterfaceCall_Wide,      D_F, WIDE, num, num, ___)             \
+  V(UncheckedClosureCall,                D_F, ORDN, num, num, ___)             \
+  V(UncheckedClosureCall_Wide,           D_F, WIDE, num, num, ___)             \
   V(UncheckedInterfaceCall,              D_F, ORDN, num, num, ___)             \
   V(UncheckedInterfaceCall_Wide,         D_F, WIDE, num, num, ___)             \
   V(DynamicCall,                         D_F, ORDN, num, num, ___)             \
@@ -749,7 +749,7 @@
   // Maximum bytecode format version supported by VM.
   // The range of supported versions should include version produced by bytecode
   // generator (currentBytecodeFormatVersion in pkg/vm/lib/bytecode/dbc.dart).
-  static const intptr_t kMaxSupportedBytecodeFormatVersion = 12;
+  static const intptr_t kMaxSupportedBytecodeFormatVersion = 18;
 
   enum Opcode {
 #define DECLARE_BYTECODE(name, encoding, kind, op1, op2, op3) k##name,
@@ -860,6 +860,11 @@
     return bc + kInstructionSize[DecodeOpcode(bc)];
   }
 
+  DART_FORCE_INLINE static uword Next(uword pc) {
+    return pc + kInstructionSize[DecodeOpcode(
+                    reinterpret_cast<const KBCInstr*>(pc))];
+  }
+
   DART_FORCE_INLINE static bool IsJumpOpcode(const KBCInstr* instr) {
     switch (DecodeOpcode(instr)) {
       case KernelBytecode::kJump:
@@ -880,6 +885,8 @@
       case KernelBytecode::kJumpIfNull_Wide:
       case KernelBytecode::kJumpIfNotNull:
       case KernelBytecode::kJumpIfNotNull_Wide:
+      case KernelBytecode::kJumpIfUnchecked:
+      case KernelBytecode::kJumpIfUnchecked_Wide:
         return true;
 
       default:
@@ -887,6 +894,16 @@
     }
   }
 
+  DART_FORCE_INLINE static bool IsJumpIfUncheckedOpcode(const KBCInstr* instr) {
+    switch (DecodeOpcode(instr)) {
+      case KernelBytecode::kJumpIfUnchecked:
+      case KernelBytecode::kJumpIfUnchecked_Wide:
+        return true;
+      default:
+        return false;
+    }
+  }
+
   DART_FORCE_INLINE static bool IsLoadConstantOpcode(const KBCInstr* instr) {
     switch (DecodeOpcode(instr)) {
       case KernelBytecode::kLoadConstant:
@@ -949,29 +966,62 @@
     }
   }
 
-  // The interpreter and this function must agree on the opcodes.
-  DART_FORCE_INLINE static bool IsDebugBreakCheckedOpcode(
-      const KBCInstr* instr) {
+  DART_FORCE_INLINE static bool IsDebugCheckOpcode(const KBCInstr* instr) {
+    return DecodeOpcode(instr) == KernelBytecode::kDebugCheck;
+  }
+
+  // The interpreter, the bytecode generator, and this function must agree on
+  // this list of opcodes.
+  // The interpreter checks for a debug break at each instruction with listed
+  // opcode and the bytecode generator emits a source position at each
+  // instruction with listed opcode.
+  DART_FORCE_INLINE static bool IsDebugCheckedOpcode(const KBCInstr* instr) {
     switch (DecodeOpcode(instr)) {
-      case KernelBytecode::kPopLocal:
-      case KernelBytecode::kPopLocal_Wide:
-      case KernelBytecode::kStoreLocal:
-      case KernelBytecode::kStoreLocal_Wide:
+      case KernelBytecode::kAllocate:
       case KernelBytecode::kStoreStaticTOS:
       case KernelBytecode::kStoreStaticTOS_Wide:
-      case KernelBytecode::kCheckStack:
+      case KernelBytecode::kDebugCheck:
       case KernelBytecode::kDirectCall:
       case KernelBytecode::kDirectCall_Wide:
       case KernelBytecode::kInterfaceCall:
       case KernelBytecode::kInterfaceCall_Wide:
+      case KernelBytecode::kInstantiatedInterfaceCall:
+      case KernelBytecode::kInstantiatedInterfaceCall_Wide:
+      case KernelBytecode::kUncheckedClosureCall:
+      case KernelBytecode::kUncheckedClosureCall_Wide:
       case KernelBytecode::kUncheckedInterfaceCall:
       case KernelBytecode::kUncheckedInterfaceCall_Wide:
       case KernelBytecode::kDynamicCall:
       case KernelBytecode::kDynamicCall_Wide:
       case KernelBytecode::kReturnTOS:
       case KernelBytecode::kThrow:
-      case KernelBytecode::kJump:
-      case KernelBytecode::kJump_Wide:
+      case KernelBytecode::kEqualsNull:
+      case KernelBytecode::kNegateInt:
+      case KernelBytecode::kNegateDouble:
+      case KernelBytecode::kAddInt:
+      case KernelBytecode::kSubInt:
+      case KernelBytecode::kMulInt:
+      case KernelBytecode::kTruncDivInt:
+      case KernelBytecode::kModInt:
+      case KernelBytecode::kBitAndInt:
+      case KernelBytecode::kBitOrInt:
+      case KernelBytecode::kBitXorInt:
+      case KernelBytecode::kShlInt:
+      case KernelBytecode::kShrInt:
+      case KernelBytecode::kCompareIntEq:
+      case KernelBytecode::kCompareIntGt:
+      case KernelBytecode::kCompareIntLt:
+      case KernelBytecode::kCompareIntGe:
+      case KernelBytecode::kCompareIntLe:
+      case KernelBytecode::kAddDouble:
+      case KernelBytecode::kSubDouble:
+      case KernelBytecode::kMulDouble:
+      case KernelBytecode::kDivDouble:
+      case KernelBytecode::kCompareDoubleEq:
+      case KernelBytecode::kCompareDoubleGt:
+      case KernelBytecode::kCompareDoubleLt:
+      case KernelBytecode::kCompareDoubleGe:
+      case KernelBytecode::kCompareDoubleLe:
         return true;
       default:
         return false;
diff --git a/runtime/vm/cpu_arm.cc b/runtime/vm/cpu_arm.cc
index 53d63d0..b07435e 100644
--- a/runtime/vm/cpu_arm.cc
+++ b/runtime/vm/cpu_arm.cc
@@ -15,6 +15,10 @@
 #include "vm/object.h"
 #include "vm/simulator.h"
 
+#if defined(HOST_OS_IOS)
+#include <libkern/OSCacheControl.h>
+#endif
+
 #if !defined(TARGET_HOST_MISMATCH)
 #include <sys/syscall.h> /* NOLINT */
 #include <unistd.h>      /* NOLINT */
@@ -91,12 +95,9 @@
 #endif
 
 void CPU::FlushICache(uword start, uword size) {
-#if HOST_OS_IOS
-  // Precompilation never patches code so there should be no I cache flushes.
+#if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
-#endif
-
-#if !defined(TARGET_HOST_MISMATCH) && HOST_ARCH_ARM && !HOST_OS_IOS
+#elif !defined(TARGET_HOST_MISMATCH) && HOST_ARCH_ARM
   // Nothing to do. Flushing no instructions.
   if (size == 0) {
     return;
@@ -104,8 +105,15 @@
 
 // ARM recommends using the gcc intrinsic __clear_cache on Linux, and the
 // library call cacheflush from unistd.h on Android:
-// blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
-#if defined(__linux__) && !defined(ANDROID)
+//
+// https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/caches-and-self-modifying-code
+//
+// On iOS we use sys_icache_invalidate from Darwin. See:
+//
+// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sys_icache_invalidate.3.html
+#if defined(HOST_OS_IOS)
+  sys_icache_invalidate(reinterpret_cast<void*>(start), size);
+#elif defined(__linux__) && !defined(ANDROID)
   extern void __clear_cache(char*, char*);
   char* beg = reinterpret_cast<char*>(start);
   char* end = reinterpret_cast<char*>(start + size);
@@ -113,7 +121,7 @@
 #elif defined(ANDROID)
   cacheflush(start, start + size, 0);
 #else
-#error FlushICache only tested/supported on Linux and Android
+#error FlushICache only tested/supported on Linux, Android and iOS
 #endif
 #endif
 }
diff --git a/runtime/vm/cpu_arm64.cc b/runtime/vm/cpu_arm64.cc
index c06e099..0d6b8b3 100644
--- a/runtime/vm/cpu_arm64.cc
+++ b/runtime/vm/cpu_arm64.cc
@@ -20,23 +20,31 @@
 #include <unistd.h>
 #endif
 
+#if defined(HOST_OS_IOS)
+#include <libkern/OSCacheControl.h>
+#endif
+
 namespace dart {
 
 void CPU::FlushICache(uword start, uword size) {
-#if HOST_OS_IOS
-  // Precompilation never patches code so there should be no I cache flushes.
+#if defined(DART_PRECOMPILED_RUNTIME)
   UNREACHABLE();
-#endif
-
-#if !defined(USING_SIMULATOR) && !HOST_OS_IOS
+#elif !defined(USING_SIMULATOR)
   // Nothing to do. Flushing no instructions.
   if (size == 0) {
     return;
   }
 
 // ARM recommends using the gcc intrinsic __clear_cache on Linux and Android.
-// blogs.arm.com/software-enablement/141-caches-and-self-modifying-code/
-#if defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
+//
+// https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/caches-and-self-modifying-code
+//
+// On iOS we use sys_icache_invalidate from Darwin. See:
+//
+// https://developer.apple.com/library/archive/documentation/System/Conceptual/ManPages_iPhoneOS/man3/sys_icache_invalidate.3.html
+#if defined(HOST_OS_IOS)
+  sys_icache_invalidate(reinterpret_cast<void*>(start), size);
+#elif defined(HOST_OS_ANDROID) || defined(HOST_OS_LINUX)
   extern void __clear_cache(char*, char*);
   char* beg = reinterpret_cast<char*>(start);
   char* end = reinterpret_cast<char*>(start + size);
@@ -46,7 +54,7 @@
                                       size, ZX_CACHE_FLUSH_INSN);
   ASSERT(result == ZX_OK);
 #else
-#error FlushICache only tested/supported on Android, Fuchsia, and Linux
+#error FlushICache only tested/supported on Android, Fuchsia, Linux and iOS
 #endif
 
 #endif
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index e43381d..17fa83c 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -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.
 
+#include <memory>
+#include <utility>
+
 #include "vm/dart.h"
 
 #include "vm/clustered_snapshot.h"
@@ -130,9 +133,11 @@
 
 char* Dart::Init(const uint8_t* vm_isolate_snapshot,
                  const uint8_t* instructions_snapshot,
-                 Dart_IsolateCreateCallback create,
+                 Dart_IsolateGroupCreateCallback create_group,
+                 Dart_InitializeIsolateCallback initialize_isolate,
                  Dart_IsolateShutdownCallback shutdown,
-                 Dart_IsolateCleanupCallback cleanup,
+                 Dart_IsolateShutdownCallback cleanup,
+                 Dart_IsolateGroupCleanupCallback cleanup_group,
                  Dart_ThreadExitCallback thread_exit,
                  Dart_FileOpenCallback file_open,
                  Dart_FileReadCallback file_read,
@@ -195,7 +200,9 @@
   set_entropy_source_callback(entropy_source);
   OS::Init();
   NOT_IN_PRODUCT(CodeObservers::Init());
-  NOT_IN_PRODUCT(CodeObservers::RegisterExternal(observer));
+  if (observer != nullptr) {
+    NOT_IN_PRODUCT(CodeObservers::RegisterExternal(*observer));
+  }
   start_time_micros_ = OS::GetCurrentMonotonicMicros();
   VirtualMemory::Init();
   OSThread::Init();
@@ -232,7 +239,18 @@
     // Setup default flags for the VM isolate.
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
-    vm_isolate_ = Isolate::InitIsolate("vm-isolate", api_flags, is_vm_isolate);
+
+    // We make a fake [IsolateGroupSource] here, since the "vm-isolate" is not
+    // really an isolate itself - it acts more as a container for VM-global
+    // objects.
+    std::unique_ptr<IsolateGroupSource> source(
+        new IsolateGroupSource(nullptr, "vm-isolate", nullptr, nullptr, nullptr,
+                               nullptr, nullptr, -1, api_flags));
+    auto group = new IsolateGroup(std::move(source), /*embedder_data=*/nullptr);
+    vm_isolate_ =
+        Isolate::InitIsolate("vm-isolate", group, api_flags, is_vm_isolate);
+    group->set_initial_spawn_successful();
+
     // Verify assumptions about executing in the VM isolate.
     ASSERT(vm_isolate_ == Isolate::Current());
     ASSERT(vm_isolate_ == Thread::Current()->isolate());
@@ -355,9 +373,11 @@
   Api::InitHandles();
 
   Thread::ExitIsolate();  // Unregister the VM isolate from this thread.
-  Isolate::SetCreateCallback(create);
+  Isolate::SetCreateGroupCallback(create_group);
+  Isolate::SetInitializeCallback_(initialize_isolate);
   Isolate::SetShutdownCallback(shutdown);
   Isolate::SetCleanupCallback(cleanup);
+  Isolate::SetGroupCleanupCallback(cleanup_group);
 
   if (FLAG_support_service) {
     Service::SetGetServiceAssetsCallback(get_service_assets);
@@ -600,9 +620,11 @@
 }
 
 Isolate* Dart::CreateIsolate(const char* name_prefix,
-                             const Dart_IsolateFlags& api_flags) {
+                             const Dart_IsolateFlags& api_flags,
+                             IsolateGroup* isolate_group) {
   // Create a new isolate.
-  Isolate* isolate = Isolate::InitIsolate(name_prefix, api_flags);
+  Isolate* isolate =
+      Isolate::InitIsolate(name_prefix, isolate_group, api_flags);
   return isolate;
 }
 
@@ -620,7 +642,7 @@
                                   const uint8_t* shared_instructions,
                                   const uint8_t* kernel_buffer,
                                   intptr_t kernel_buffer_size,
-                                  void* data) {
+                                  void* isolate_data) {
   // Initialize the new isolate.
   Thread* T = Thread::Current();
   Isolate* I = T->isolate();
@@ -724,7 +746,7 @@
   }
 
   I->heap()->InitGrowthControl();
-  I->set_init_callback_data(data);
+  I->set_init_callback_data(isolate_data);
   Api::SetupAcquiredError(I);
   if (FLAG_print_class_table) {
     I->class_table()->Print();
@@ -850,11 +872,12 @@
   Thread* thread = Thread::Current();
   ASSERT(thread->execution_state() == Thread::kThreadInVM);
   Isolate* isolate = thread->isolate();
-  void* callback_data = isolate->init_callback_data();
+  void* isolate_group_data = isolate->group()->embedder_data();
+  void* isolate_data = isolate->init_callback_data();
   Dart_IsolateShutdownCallback callback = Isolate::ShutdownCallback();
   if (callback != NULL) {
     TransitionVMToNative transition(thread);
-    (callback)(callback_data);
+    (callback)(isolate_group_data, isolate_data);
   }
 }
 
diff --git a/runtime/vm/dart.h b/runtime/vm/dart.h
index 64d10f9..8c11967 100644
--- a/runtime/vm/dart.h
+++ b/runtime/vm/dart.h
@@ -28,9 +28,11 @@
   // (caller owns error message and has to free it).
   static char* Init(const uint8_t* vm_snapshot_data,
                     const uint8_t* vm_snapshot_instructions,
-                    Dart_IsolateCreateCallback create,
+                    Dart_IsolateGroupCreateCallback create_group,
+                    Dart_InitializeIsolateCallback initialize_isolate,
                     Dart_IsolateShutdownCallback shutdown,
                     Dart_IsolateCleanupCallback cleanup,
+                    Dart_IsolateGroupCleanupCallback cleanup_group,
                     Dart_ThreadExitCallback thread_exit,
                     Dart_FileOpenCallback file_open,
                     Dart_FileReadCallback file_read,
@@ -46,7 +48,8 @@
   static char* Cleanup();
 
   static Isolate* CreateIsolate(const char* name_prefix,
-                                const Dart_IsolateFlags& api_flags);
+                                const Dart_IsolateFlags& api_flags,
+                                IsolateGroup* isolate_group);
 
   // Initialize an isolate, either from a snapshot, from a Kernel binary, or
   // from SDK library sources.  If the snapshot_buffer is non-NULL,
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index 35306a3..fc9608a 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -6,6 +6,7 @@
 #include "include/dart_native_api.h"
 
 #include <memory>
+#include <utility>
 
 #include "lib/stacktrace.h"
 #include "platform/assert.h"
@@ -426,19 +427,40 @@
 
   va_list args;
   va_start(args, format);
-  intptr_t len = Utils::VSNPrint(NULL, 0, format, args);
+  char* buffer = OS::VSCreate(Z, format, args);
   va_end(args);
 
-  char* buffer = Z->Alloc<char>(len + 1);
-  va_list args2;
-  va_start(args2, format);
-  Utils::VSNPrint(buffer, (len + 1), format, args2);
-  va_end(args2);
-
   const String& message = String::Handle(Z, String::New(buffer));
   return Api::NewHandle(T, ApiError::New(message));
 }
 
+Dart_Handle Api::NewArgumentError(const char* format, ...) {
+  Thread* T = Thread::Current();
+  CHECK_API_SCOPE(T);
+  CHECK_CALLBACK_STATE(T);
+  // Ensure we transition safepoint state to VM if we are not already in
+  // that state.
+  TransitionToVM transition(T);
+  HANDLESCOPE(T);
+
+  va_list args;
+  va_start(args, format);
+  char* buffer = OS::VSCreate(Z, format, args);
+  va_end(args);
+
+  const String& message = String::Handle(Z, String::New(buffer));
+  const Array& arguments = Array::Handle(Z, Array::New(1));
+  arguments.SetAt(0, message);
+  Object& error = Object::Handle(
+      Z, DartLibraryCalls::InstanceCreate(
+             Library::Handle(Z, Library::CoreLibrary()),
+             Symbols::ArgumentError(), Symbols::Dot(), arguments));
+  if (!error.IsError()) {
+    error = UnhandledException::New(Instance::Cast(error), Instance::Handle());
+  }
+  return Api::NewHandle(T, error.raw());
+}
+
 void Api::SetupAcquiredError(Isolate* isolate) {
   ASSERT(isolate != NULL);
   ApiState* state = isolate->api_state();
@@ -694,6 +716,12 @@
   return Api::IsError(handle);
 }
 
+DART_EXPORT void Dart_KillIsolate(Dart_Isolate handle) {
+  Isolate* isolate = reinterpret_cast<Isolate*>(handle);
+  CHECK_ISOLATE(isolate);
+  Isolate::KillIfExists(isolate, Isolate::kKillMsg);
+}
+
 DART_EXPORT bool Dart_IsApiError(Dart_Handle object) {
   Thread* thread = Thread::Current();
   TransitionNativeToVM transition(thread);
@@ -1007,11 +1035,13 @@
   }
 
   return Dart::Init(params->vm_snapshot_data, params->vm_snapshot_instructions,
-                    params->create, params->shutdown, params->cleanup,
-                    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->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);
 }
 
 DART_EXPORT char* Dart_Cleanup() {
@@ -1060,26 +1090,14 @@
 
 // --- Isolates ---
 
-static Dart_Isolate CreateIsolate(const char* script_uri,
+static Dart_Isolate CreateIsolate(IsolateGroup* group,
                                   const char* name,
-                                  const uint8_t* snapshot_data,
-                                  const uint8_t* snapshot_instructions,
-                                  const uint8_t* shared_data,
-                                  const uint8_t* shared_instructions,
-                                  const uint8_t* kernel_buffer,
-                                  intptr_t kernel_buffer_size,
-                                  Dart_IsolateFlags* flags,
-                                  void* callback_data,
+                                  void* isolate_data,
                                   char** error) {
   CHECK_NO_ISOLATE(Isolate::Current());
 
-  // Setup default flags in case none were passed.
-  Dart_IsolateFlags api_flags;
-  if (flags == NULL) {
-    Isolate::FlagsInitialize(&api_flags);
-    flags = &api_flags;
-  }
-  Isolate* I = Dart::CreateIsolate((name == NULL) ? "isolate" : name, *flags);
+  auto source = group->source();
+  Isolate* I = Dart::CreateIsolate(name, source->flags, group);
   if (I == NULL) {
     if (error != NULL) {
       *error = strdup("Isolate creation failed");
@@ -1096,14 +1114,15 @@
     // bootstrap library files which call out to a tag handler that may create
     // Api Handles when an error is encountered.
     T->EnterApiScope();
-    const Error& error_obj = Error::Handle(
-        Z,
-        Dart::InitializeIsolate(snapshot_data, snapshot_instructions,
-                                shared_data, shared_instructions, kernel_buffer,
-                                kernel_buffer_size, callback_data));
+    const Error& error_obj =
+        Error::Handle(Z, Dart::InitializeIsolate(
+                             source->snapshot_data,
+                             source->snapshot_instructions, source->shared_data,
+                             source->shared_instructions, source->kernel_buffer,
+                             source->kernel_buffer_size, isolate_data));
     if (error_obj.IsNull()) {
 #if defined(DART_NO_SNAPSHOT) && !defined(PRODUCT)
-      if (FLAG_check_function_fingerprints && kernel_buffer == NULL) {
+      if (FLAG_check_function_fingerprints && source->kernel_buffer == NULL) {
         Library::CheckFunctionFingerprints();
       }
 #endif  // defined(DART_NO_SNAPSHOT) && !defined(PRODUCT).
@@ -1132,37 +1151,127 @@
   return reinterpret_cast<Dart_Isolate>(NULL);
 }
 
+Isolate* CreateWithinExistingIsolateGroup(IsolateGroup* group,
+                                          const char* name,
+                                          char** error) {
+  API_TIMELINE_DURATION(Thread::Current());
+  CHECK_NO_ISOLATE(Isolate::Current());
+
+  Isolate* isolate = reinterpret_cast<Isolate*>(
+      CreateIsolate(group, name, /*isolate_data=*/nullptr, error));
+  if (isolate == nullptr) return nullptr;
+
+  auto source = group->source();
+  ASSERT(isolate->source() == source);
+
+  if (source->script_kernel_buffer != nullptr) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+    UNREACHABLE();
+#else
+    Dart_EnterScope();
+    {
+      Thread* T = Thread::Current();
+      TransitionNativeToVM transition(T);
+      HANDLESCOPE(T);
+      StackZone zone(T);
+
+      // The kernel loader is about to allocate a bunch of new libraries,
+      // classes and functions into old space. Force growth, and use of the
+      // bump allocator instead of freelists.
+      BumpAllocateScope bump_allocate_scope(T);
+
+      // NOTE: We do not attach a finalizer for this object, because the
+      // embedder will free it once the isolate group has shutdown.
+      const auto& td = ExternalTypedData::Handle(ExternalTypedData::New(
+          kExternalTypedDataUint8ArrayCid,
+          const_cast<uint8_t*>(source->script_kernel_buffer),
+          source->script_kernel_size, Heap::kOld));
+
+      std::unique_ptr<kernel::Program> program =
+          kernel::Program::ReadFromTypedData(td,
+                                             const_cast<const char**>(error));
+      if (program == nullptr) {
+        UNIMPLEMENTED();
+      }
+      const Object& tmp =
+          kernel::KernelLoader::LoadEntireProgram(program.get());
+
+      // If the existing isolate could spawn with a root library we should be
+      // able to do the same
+      RELEASE_ASSERT(!tmp.IsNull() && tmp.IsLibrary());
+      isolate->object_store()->set_root_library(Library::Cast(tmp));
+    }
+    Dart_ExitScope();
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+  }
+
+  return isolate;
+}
+
 DART_EXPORT void Dart_IsolateFlagsInitialize(Dart_IsolateFlags* flags) {
   Isolate::FlagsInitialize(flags);
 }
 
 DART_EXPORT Dart_Isolate
-Dart_CreateIsolate(const char* script_uri,
-                   const char* name,
-                   const uint8_t* snapshot_data,
-                   const uint8_t* snapshot_instructions,
-                   const uint8_t* shared_data,
-                   const uint8_t* shared_instructions,
-                   Dart_IsolateFlags* flags,
-                   void* callback_data,
-                   char** error) {
+Dart_CreateIsolateGroup(const char* script_uri,
+                        const char* name,
+                        const uint8_t* snapshot_data,
+                        const uint8_t* snapshot_instructions,
+                        const uint8_t* shared_data,
+                        const uint8_t* shared_instructions,
+                        Dart_IsolateFlags* flags,
+                        void* isolate_group_data,
+                        void* isolate_data,
+                        char** error) {
   API_TIMELINE_DURATION(Thread::Current());
-  return CreateIsolate(script_uri, name, snapshot_data, snapshot_instructions,
-                       shared_data, shared_instructions, NULL, 0, flags,
-                       callback_data, error);
+
+  Dart_IsolateFlags api_flags;
+  if (flags == nullptr) {
+    Isolate::FlagsInitialize(&api_flags);
+    flags = &api_flags;
+  }
+
+  const char* non_null_name = name == nullptr ? "isolate" : name;
+  std::unique_ptr<IsolateGroupSource> source(new IsolateGroupSource(
+      script_uri, non_null_name, snapshot_data, snapshot_instructions,
+      shared_data, shared_instructions, nullptr, -1, *flags));
+  auto group = new IsolateGroup(std::move(source), isolate_group_data);
+  Dart_Isolate isolate =
+      CreateIsolate(group, non_null_name, isolate_data, error);
+  if (isolate != nullptr) {
+    group->set_initial_spawn_successful();
+  }
+  return isolate;
 }
 
 DART_EXPORT Dart_Isolate
-Dart_CreateIsolateFromKernel(const char* script_uri,
-                             const char* name,
-                             const uint8_t* kernel_buffer,
-                             intptr_t kernel_buffer_size,
-                             Dart_IsolateFlags* flags,
-                             void* callback_data,
-                             char** error) {
+Dart_CreateIsolateGroupFromKernel(const char* script_uri,
+                                  const char* name,
+                                  const uint8_t* kernel_buffer,
+                                  intptr_t kernel_buffer_size,
+                                  Dart_IsolateFlags* flags,
+                                  void* isolate_group_data,
+                                  void* isolate_data,
+                                  char** error) {
   API_TIMELINE_DURATION(Thread::Current());
-  return CreateIsolate(script_uri, name, NULL, NULL, NULL, NULL, kernel_buffer,
-                       kernel_buffer_size, flags, callback_data, error);
+
+  Dart_IsolateFlags api_flags;
+  if (flags == nullptr) {
+    Isolate::FlagsInitialize(&api_flags);
+    flags = &api_flags;
+  }
+
+  const char* non_null_name = name == nullptr ? "isolate" : name;
+  std::unique_ptr<IsolateGroupSource> source(new IsolateGroupSource(
+      script_uri, non_null_name, nullptr, nullptr, nullptr, nullptr,
+      kernel_buffer, kernel_buffer_size, *flags));
+  auto group = new IsolateGroup(std::move(source), isolate_group_data);
+  Dart_Isolate isolate =
+      CreateIsolate(group, non_null_name, isolate_data, error);
+  if (isolate != nullptr) {
+    group->set_initial_spawn_successful();
+  }
+  return isolate;
 }
 
 DART_EXPORT void Dart_ShutdownIsolate() {
@@ -1173,7 +1282,7 @@
   // The Thread structure is disassociated from the isolate, we do the
   // safepoint transition explicitly here instead of using the TransitionXXX
   // scope objects as the original transition happened outside this scope in
-  // Dart_EnterIsolate/Dart_CreateIsolate.
+  // Dart_EnterIsolate/Dart_CreateIsolateGroup.
   ASSERT(T->execution_state() == Thread::kThreadInNative);
   T->ExitSafepoint();
   T->set_execution_state(Thread::kThreadInVM);
@@ -1212,9 +1321,23 @@
   if (isolate == NULL) {
     FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
   }
-  // TODO(16615): Validate isolate parameter.
-  Isolate* iso = reinterpret_cast<Isolate*>(isolate);
-  return iso->init_callback_data();
+  // TODO(http://dartbug.com/16615): Validate isolate parameter.
+  return reinterpret_cast<Isolate*>(isolate)->init_callback_data();
+}
+
+DART_EXPORT void* Dart_CurrentIsolateGroupData() {
+  Isolate* isolate = Isolate::Current();
+  CHECK_ISOLATE(isolate);
+  NoSafepointScope no_safepoint_scope;
+  return isolate->group()->embedder_data();
+}
+
+DART_EXPORT void* Dart_IsolateGroupData(Dart_Isolate isolate) {
+  if (isolate == NULL) {
+    FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
+  }
+  // TODO(http://dartbug.com/16615): Validate isolate parameter.
+  return reinterpret_cast<Isolate*>(isolate)->group()->embedder_data();
 }
 
 DART_EXPORT Dart_Handle Dart_DebugName() {
@@ -1229,6 +1352,7 @@
   if (isolate == NULL) {
     FATAL1("%s expects argument 'isolate' to be non-null.", CURRENT_FUNC);
   }
+  // TODO(http://dartbug.com/16615): Validate isolate parameter.
   Isolate* I = reinterpret_cast<Isolate*>(isolate);
   int64_t main_port = static_cast<int64_t>(I->main_port());
   return OS::SCreate(NULL, "isolates/%" Pd64, main_port);
@@ -1236,7 +1360,7 @@
 
 DART_EXPORT void Dart_EnterIsolate(Dart_Isolate isolate) {
   CHECK_NO_ISOLATE(Isolate::Current());
-  // TODO(16615): Validate isolate parameter.
+  // TODO(http://dartbug.com/16615): Validate isolate parameter.
   Isolate* iso = reinterpret_cast<Isolate*>(isolate);
   if (!Thread::EnterIsolate(iso)) {
     FATAL(
@@ -1496,7 +1620,7 @@
   // The Thread structure is disassociated from the isolate, we do the
   // safepoint transition explicitly here instead of using the TransitionXXX
   // scope objects as the original transition happened outside this scope in
-  // Dart_EnterIsolate/Dart_CreateIsolate.
+  // Dart_EnterIsolate/Dart_CreateIsolateGroup.
   ASSERT(T->execution_state() == Thread::kThreadInNative);
   T->ExitSafepoint();
   T->set_execution_state(Thread::kThreadInVM);
@@ -2760,7 +2884,8 @@
   // Now check and handle a dart object that implements the List interface.
   const Instance& instance = Instance::Handle(Z, GetListInstance(Z, obj));
   if (instance.IsNull()) {
-    return Api::NewError("Object does not implement the List interface");
+    return Api::NewArgumentError(
+        "Object does not implement the List interface");
   }
   const String& name = String::Handle(Z, Field::GetterName(Symbols::Length()));
   const int kTypeArgsLen = 0;
@@ -2770,7 +2895,7 @@
   const Function& function =
       Function::Handle(Z, Resolver::ResolveDynamic(instance, name, args_desc));
   if (function.IsNull()) {
-    return Api::NewError("List object does not have a 'length' field.");
+    return Api::NewArgumentError("List object does not have a 'length' field.");
   }
 
   const Array& args = Array::Handle(Z, Array::New(kNumArgs));
@@ -2821,7 +2946,8 @@
                             Send1Arg(instance, Symbols::IndexToken(),
                                      Instance::Handle(Z, Integer::New(index))));
     }
-    return Api::NewError("Object does not implement the 'List' interface");
+    return Api::NewArgumentError(
+        "Object does not implement the 'List' interface");
   }
 }
 
@@ -2877,7 +3003,8 @@
         return Api::Success();
       }
     }
-    return Api::NewError("Object does not implement the 'List' interface");
+    return Api::NewArgumentError(
+        "Object does not implement the 'List' interface");
   }
 }
 
@@ -2932,7 +3059,8 @@
         return Api::NewHandle(T, DartEntry::InvokeFunction(function, args));
       }
     }
-    return Api::NewError("Object does not implement the 'List' interface");
+    return Api::NewArgumentError(
+        "Object does not implement the 'List' interface");
   }
 }
 
@@ -3132,7 +3260,8 @@
       return Api::Success();
     }
   }
-  return Api::NewError("Object does not implement the 'List' interface");
+  return Api::NewArgumentError(
+      "Object does not implement the 'List' interface");
 }
 
 #define SET_LIST_ELEMENT_AS_BYTES(type, obj, native_array, offset, length)     \
@@ -3208,7 +3337,8 @@
       return Api::Success();
     }
   }
-  return Api::NewError("Object does not implement the 'List' interface");
+  return Api::NewArgumentError(
+      "Object does not implement the 'List' interface");
 }
 
 // --- Maps ---
@@ -3226,7 +3356,7 @@
     return Api::NewHandle(
         T, Send1Arg(instance, Symbols::IndexToken(), Instance::Cast(key_obj)));
   }
-  return Api::NewError("Object does not implement the 'Map' interface");
+  return Api::NewArgumentError("Object does not implement the 'Map' interface");
 }
 
 DART_EXPORT Dart_Handle Dart_MapContainsKey(Dart_Handle map, Dart_Handle key) {
@@ -3243,7 +3373,7 @@
         T, Send1Arg(instance, String::Handle(Z, String::New("containsKey")),
                     Instance::Cast(key_obj)));
   }
-  return Api::NewError("Object does not implement the 'Map' interface");
+  return Api::NewArgumentError("Object does not implement the 'Map' interface");
 }
 
 DART_EXPORT Dart_Handle Dart_MapKeys(Dart_Handle map) {
@@ -3260,7 +3390,7 @@
     return Api::NewHandle(T, Send0Arg(Instance::Cast(iterator),
                                       String::Handle(String::New("toList"))));
   }
-  return Api::NewError("Object does not implement the 'Map' interface");
+  return Api::NewArgumentError("Object does not implement the 'Map' interface");
 }
 
 // --- Typed Data ---
@@ -4561,7 +4691,7 @@
   return Api::Success();
 }
 
-DART_EXPORT void* Dart_GetNativeIsolateData(Dart_NativeArguments args) {
+DART_EXPORT void* Dart_GetNativeIsolateGroupData(Dart_NativeArguments args) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   Isolate* isolate = arguments->thread()->isolate();
   ASSERT(isolate == Isolate::Current());
@@ -4590,7 +4720,7 @@
       case Dart_NativeArgument_kBool:
         if (!Api::GetNativeBooleanArgument(arguments, arg_index,
                                            &(native_value->as_bool))) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Boolean.",
               CURRENT_FUNC, i);
@@ -4600,14 +4730,15 @@
       case Dart_NativeArgument_kInt32: {
         int64_t value = 0;
         if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Integer.",
               CURRENT_FUNC, i);
         }
         if (value < INT_MIN || value > INT_MAX) {
-          return Api::NewError("%s: argument value at index %d is out of range",
-                               CURRENT_FUNC, i);
+          return Api::NewArgumentError(
+              "%s: argument value at index %d is out of range", CURRENT_FUNC,
+              i);
         }
         native_value->as_int32 = static_cast<int32_t>(value);
         break;
@@ -4616,14 +4747,15 @@
       case Dart_NativeArgument_kUint32: {
         int64_t value = 0;
         if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Integer.",
               CURRENT_FUNC, i);
         }
         if (value < 0 || value > UINT_MAX) {
-          return Api::NewError("%s: argument value at index %d is out of range",
-                               CURRENT_FUNC, i);
+          return Api::NewArgumentError(
+              "%s: argument value at index %d is out of range", CURRENT_FUNC,
+              i);
         }
         native_value->as_uint32 = static_cast<uint32_t>(value);
         break;
@@ -4632,7 +4764,7 @@
       case Dart_NativeArgument_kInt64: {
         int64_t value = 0;
         if (!GetNativeIntegerArgument(arguments, arg_index, &value)) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Integer.",
               CURRENT_FUNC, i);
@@ -4644,7 +4776,7 @@
       case Dart_NativeArgument_kUint64: {
         uint64_t value = 0;
         if (!GetNativeUnsignedIntegerArgument(arguments, arg_index, &value)) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Integer.",
               CURRENT_FUNC, i);
@@ -4656,7 +4788,7 @@
       case Dart_NativeArgument_kDouble:
         if (!GetNativeDoubleArgument(arguments, arg_index,
                                      &(native_value->as_double))) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type Double.",
               CURRENT_FUNC, i);
@@ -4667,7 +4799,7 @@
         if (!GetNativeStringArgument(arguments, arg_index,
                                      &(native_value->as_string.dart_str),
                                      &(native_value->as_string.peer))) {
-          return Api::NewError(
+          return Api::NewArgumentError(
               "%s: expects argument at index %d to be of"
               " type String.",
               CURRENT_FUNC, i);
@@ -4693,8 +4825,8 @@
       }
 
       default:
-        return Api::NewError("%s: invalid argument type %d.", CURRENT_FUNC,
-                             arg_type);
+        return Api::NewArgumentError("%s: invalid argument type %d.",
+                                     CURRENT_FUNC, arg_type);
     }
   }
   return Api::Success();
@@ -4759,7 +4891,7 @@
   TransitionNativeToVM transition(arguments->thread());
   Dart_Handle result = Api::Null();
   if (!GetNativeStringArgument(arguments, arg_index, &result, peer)) {
-    return Api::NewError(
+    return Api::NewArgumentError(
         "%s expects argument at %d to be of"
         " type String.",
         CURRENT_FUNC, arg_index);
@@ -4777,7 +4909,7 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   if (!GetNativeIntegerArgument(arguments, index, value)) {
-    return Api::NewError(
+    return Api::NewArgumentError(
         "%s: expects argument at %d to be of"
         " type Integer.",
         CURRENT_FUNC, index);
@@ -4795,8 +4927,9 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   if (!Api::GetNativeBooleanArgument(arguments, index, value)) {
-    return Api::NewError("%s: expects argument at %d to be of type Boolean.",
-                         CURRENT_FUNC, index);
+    return Api::NewArgumentError(
+        "%s: expects argument at %d to be of type Boolean.", CURRENT_FUNC,
+        index);
   }
   return Api::Success();
 }
@@ -4811,7 +4944,7 @@
         CURRENT_FUNC, arguments->NativeArgCount() - 1, index);
   }
   if (!GetNativeDoubleArgument(arguments, index, value)) {
-    return Api::NewError(
+    return Api::NewArgumentError(
         "%s: expects argument at %d to be of"
         " type Double.",
         CURRENT_FUNC, index);
@@ -4992,7 +5125,7 @@
 Dart_SetLibraryTagHandler(Dart_LibraryTagHandler handler) {
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  isolate->set_library_tag_handler(handler);
+  isolate->group()->set_library_tag_handler(handler);
   return Api::Success();
 }
 
@@ -5043,9 +5176,15 @@
   // instead of freelists.
   BumpAllocateScope bump_allocate_scope(T);
 
+  // NOTE: We do not attach a finalizer for this object, because the embedder
+  // will free it once the isolate group has shutdown.
+  const auto& td = ExternalTypedData::Handle(ExternalTypedData::New(
+      kExternalTypedDataUint8ArrayCid, const_cast<uint8_t*>(buffer),
+      buffer_size, Heap::kOld));
+
   const char* error = nullptr;
   std::unique_ptr<kernel::Program> program =
-      kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+      kernel::Program::ReadFromTypedData(td, &error);
   if (program == nullptr) {
     return Api::NewError("Can't load Kernel binary: %s.", error);
   }
@@ -5055,6 +5194,10 @@
   if (tmp.IsError()) {
     return Api::NewHandle(T, tmp.raw());
   }
+
+  I->source()->script_kernel_size = buffer_size;
+  I->source()->script_kernel_buffer = buffer;
+
   // TODO(32618): Setting root library based on whether it has 'main' or not
   // is not correct because main can be in the exported namespace of a library
   // or it could be a getter.
@@ -5291,9 +5434,16 @@
   // instead of freelists.
   BumpAllocateScope bump_allocate_scope(T);
 
+  // NOTE: We do not attach a finalizer for this object, because the embedder
+  // will/should free it once the isolate group has shutdown.
+  // See also http://dartbug.com/37030.
+  const auto& td = ExternalTypedData::Handle(ExternalTypedData::New(
+      kExternalTypedDataUint8ArrayCid, const_cast<uint8_t*>(buffer),
+      buffer_size, Heap::kOld));
+
   const char* error = nullptr;
   std::unique_ptr<kernel::Program> program =
-      kernel::Program::ReadFromBuffer(buffer, buffer_size, &error);
+      kernel::Program::ReadFromTypedData(td, &error);
   if (program == nullptr) {
     return Api::NewError("Can't load Kernel binary: %s.", error);
   }
@@ -5353,8 +5503,6 @@
   // instead of freelists.
   BumpAllocateScope bump_allocate_scope(T);
 
-  I->DoneLoading();
-
   // TODO(hausner): move the remaining code below (finalization and
   // invoking of _completeDeferredLoads) into Isolate::DoneLoading().
 
@@ -5364,8 +5512,6 @@
     return state;
   }
 
-  I->DoneFinalizing();
-
 #if !defined(PRODUCT)
   // Now that the newly loaded classes are finalized, notify the debugger
   // that new code has been loaded. If there are latent breakpoints in
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 2d8ad35..0b6e42b 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -5,6 +5,8 @@
 #ifndef RUNTIME_VM_DART_API_IMPL_H_
 #define RUNTIME_VM_DART_API_IMPL_H_
 
+#include <memory>
+
 #include "vm/allocation.h"
 #include "vm/heap/safepoint.h"
 #include "vm/native_arguments.h"
@@ -32,7 +34,7 @@
     if ((isolate) == NULL) {                                                   \
       FATAL1(                                                                  \
           "%s expects there to be a current isolate. Did you "                 \
-          "forget to call Dart_CreateIsolate or Dart_EnterIsolate?",           \
+          "forget to call Dart_CreateIsolateGroup or Dart_EnterIsolate?",      \
           CURRENT_FUNC);                                                       \
     }                                                                          \
   } while (0)
@@ -73,13 +75,13 @@
     const Object& tmp =                                                        \
         Object::Handle(zone, Api::UnwrapHandle((dart_handle)));                \
     if (tmp.IsNull()) {                                                        \
-      return Api::NewError("%s expects argument '%s' to be non-null.",         \
-                           CURRENT_FUNC, #dart_handle);                        \
+      return Api::NewArgumentError("%s expects argument '%s' to be non-null.", \
+                                   CURRENT_FUNC, #dart_handle);                \
     } else if (tmp.IsError()) {                                                \
       return dart_handle;                                                      \
     }                                                                          \
-    return Api::NewError("%s expects argument '%s' to be of type %s.",         \
-                         CURRENT_FUNC, #dart_handle, #type);                   \
+    return Api::NewArgumentError("%s expects argument '%s' to be of type %s.", \
+                                 CURRENT_FUNC, #dart_handle, #type);           \
   } while (0)
 
 #define RETURN_NULL_ERROR(parameter)                                           \
@@ -223,6 +225,8 @@
 
   // Generates a handle used to designate an error return.
   static Dart_Handle NewError(const char* format, ...) PRINTF_ATTRIBUTE(1, 2);
+  static Dart_Handle NewArgumentError(const char* format, ...)
+      PRINTF_ATTRIBUTE(1, 2);
 
   // Gets a handle to Null.
   static Dart_Handle Null() { return null_handle_; }
@@ -300,14 +304,6 @@
 #if defined(TARGET_ARCH_DBC) && !defined(ARCH_IS_64_BIT)
     // TODO(36809): Support SimDBC32.
     return false;
-#elif defined(TARGET_ARCH_DBC) &&                                              \
-    !(defined(HOST_ARCH_X64) || defined(HOST_ARCH_ARM64))
-    // TODO(36809): Support ia32 and arm.
-    return false;
-#elif defined(TARGET_ARCH_DBC) && defined(HOST_ARCH_X64) &&                    \
-    defined(HOST_OS_WINDOWS)
-    // TODO(35773): Support x64 Windows.
-    return false;
 #elif defined(TARGET_ARCH_ARM) &&                                              \
     !(defined(TARGET_OS_ANDROID) || defined(TARGET_OS_MACOS_IOS))
     // TODO(36309): Support hardfp calling convention.
@@ -360,6 +356,14 @@
 #define ASSERT_CALLBACK_STATE(thread)                                          \
   ASSERT(thread->no_callback_scope_depth() == 0)
 
+class IsolateGroupSource;
+
+// Creates a new isolate from [source] (which should come from an existing
+// isolate).
+Isolate* CreateWithinExistingIsolateGroup(IsolateGroup* group,
+                                          const char* name,
+                                          char** error);
+
 }  // namespace dart.
 
 #endif  // RUNTIME_VM_DART_API_IMPL_H_
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 2035e4a..bf716b7 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -33,9 +33,9 @@
   memset(&params, 0, sizeof(Dart_InitializeParams));
   params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
   params.vm_snapshot_data = TesterState::vm_snapshot_data;
-  params.create = TesterState::create_callback;
-  params.shutdown = TesterState::shutdown_callback;
-  params.cleanup = TesterState::cleanup_callback;
+  params.create_group = TesterState::create_callback;
+  params.shutdown_isolate = TesterState::shutdown_callback;
+  params.cleanup_group = TesterState::group_cleanup_callback;
   params.start_kernel_isolate = true;
 
   // Reinitialize and ensure we can execute Dart code.
@@ -63,9 +63,9 @@
   memset(&params, 0, sizeof(Dart_InitializeParams));
   params.version = DART_INITIALIZE_PARAMS_CURRENT_VERSION;
   params.vm_snapshot_data = TesterState::vm_snapshot_data;
-  params.create = TesterState::create_callback;
-  params.shutdown = TesterState::shutdown_callback;
-  params.cleanup = TesterState::cleanup_callback;
+  params.create_group = TesterState::create_callback;
+  params.shutdown_isolate = TesterState::shutdown_callback;
+  params.cleanup_group = TesterState::group_cleanup_callback;
   params.start_kernel_isolate = true;
 
   bool was_called = false;
@@ -88,6 +88,80 @@
   EXPECT(Dart_Cleanup() == NULL);
 }
 
+TEST_CASE(Dart_KillIsolate) {
+  const char* kScriptChars =
+      "int testMain() {\n"
+      "  return 42;\n"
+      "}\n";
+  Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+  EXPECT_VALID(result);
+  int64_t value = 0;
+  EXPECT_VALID(Dart_IntegerToInt64(result, &value));
+  EXPECT_EQ(42, value);
+  Dart_Isolate isolate = reinterpret_cast<Dart_Isolate>(Isolate::Current());
+  Dart_KillIsolate(isolate);
+  result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+  EXPECT(Dart_IsError(result));
+  EXPECT_STREQ("isolate terminated by Isolate.kill", Dart_GetError(result));
+}
+
+class InfiniteLoopTask : public ThreadPool::Task {
+ public:
+  InfiniteLoopTask(Dart_Isolate* isolate, Monitor* monitor, bool* interrupted)
+      : isolate_(isolate), monitor_(monitor), interrupted_(interrupted) {}
+  virtual void Run() {
+    TestIsolateScope scope;
+    const char* kScriptChars =
+        "testMain() {\n"
+        "  while(true) {};"
+        "}\n";
+    Dart_Handle lib = TestCase::LoadTestScript(kScriptChars, NULL);
+    EXPECT_VALID(lib);
+    *isolate_ = reinterpret_cast<Dart_Isolate>(Isolate::Current());
+    {
+      MonitorLocker ml(monitor_);
+      ml.Notify();
+    }
+    Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 0, NULL);
+    // Test should run an inifinite loop and expect that to be killed.
+    EXPECT(Dart_IsError(result));
+    EXPECT_STREQ("isolate terminated by Isolate.kill", Dart_GetError(result));
+    {
+      MonitorLocker ml(monitor_);
+      *interrupted_ = true;
+      ml.Notify();
+    }
+  }
+
+ private:
+  Dart_Isolate* isolate_;
+  Monitor* monitor_;
+  bool* interrupted_;
+};
+
+TEST_CASE(Dart_KillIsolatePriority) {
+  Monitor monitor;
+  bool interrupted = false;
+  Dart_Isolate isolate;
+  Dart::thread_pool()->Run<InfiniteLoopTask>(&isolate, &monitor, &interrupted);
+  {
+    MonitorLocker ml(&monitor);
+    ml.Wait();
+  }
+
+  Dart_KillIsolate(isolate);
+
+  {
+    MonitorLocker ml(&monitor);
+    while (!interrupted) {
+      ml.Wait();
+    }
+  }
+  EXPECT(interrupted);
+}
+
 TEST_CASE(DartAPI_ErrorHandleBasics) {
   const char* kScriptChars =
       "void testMain() {\n"
@@ -1476,16 +1550,16 @@
 class GCTestHelper : public AllStatic {
  public:
   static void CollectNewSpace() {
-    Isolate::Current()->heap()->new_space()->Scavenge();
+    Thread* thread = Thread::Current();
+    ASSERT(thread->execution_state() == Thread::kThreadInVM);
+    thread->heap()->new_space()->Scavenge();
   }
 
   static void WaitForGCTasks() {
     Thread* thread = Thread::Current();
-    PageSpace* old_space = thread->isolate()->heap()->old_space();
-    MonitorLocker ml(old_space->tasks_lock());
-    while (old_space->tasks() > 0) {
-      ml.WaitWithSafepointCheck(thread);
-    }
+    ASSERT(thread->execution_state() == Thread::kThreadInVM);
+    thread->heap()->WaitForMarkerTasks(thread);
+    thread->heap()->WaitForSweeperTasks(thread);
   }
 };
 
@@ -3317,8 +3391,8 @@
   {
     TransitionNativeToVM transition(thread);
     Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
-    GCTestHelper::WaitForGCTasks();
-    EXPECT(heap->ExternalInWords(Heap::kOld) == 0);
+    GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
+    EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
   }
 }
 
@@ -3329,7 +3403,11 @@
   Dart_Handle live = AllocateOldString("live");
   EXPECT_VALID(live);
   Dart_WeakPersistentHandle weak = NULL;
-  EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld));
+  {
+    TransitionNativeToVM transition(thread);
+    GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
+    EXPECT_EQ(0, isolate->heap()->ExternalInWords(Heap::kOld));
+  }
   const intptr_t kSmallExternalSize = 1 * KB;
   {
     Dart_EnterScope();
@@ -3340,14 +3418,22 @@
     EXPECT_VALID(AsHandle(weak));
     Dart_ExitScope();
   }
-  EXPECT_EQ(kSmallExternalSize,
-            isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
+  {
+    TransitionNativeToVM transition(thread);
+    GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
+    EXPECT_EQ(kSmallExternalSize,
+              isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
+  }
   // Large enough to trigger GC in old space. Not actually allocated.
   const intptr_t kHugeExternalSize = (kWordSize == 4) ? 513 * MB : 1025 * MB;
   Dart_NewWeakPersistentHandle(live, NULL, kHugeExternalSize, NopCallback);
-  // Expect small garbage to be collected.
-  EXPECT_EQ(kHugeExternalSize,
-            isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
+  {
+    TransitionNativeToVM transition(thread);
+    GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
+    // Expect small garbage to be collected.
+    EXPECT_EQ(kHugeExternalSize,
+              isolate->heap()->ExternalInWords(Heap::kOld) * kWordSize);
+  }
   Dart_ExitScope();
 }
 
@@ -3382,6 +3468,7 @@
   {
     TransitionNativeToVM transition(thread);
     Isolate::Current()->heap()->CollectGarbage(Heap::kOld);
+    GCTestHelper::WaitForGCTasks();  // Finalize GC for accurate live size.
     EXPECT_EQ(0, heap->ExternalInWords(Heap::kOld));
   }
 }
@@ -3670,20 +3757,21 @@
 
 VM_UNIT_TEST_CASE(DartAPI_CurrentIsolateData) {
   Dart_IsolateShutdownCallback saved_shutdown = Isolate::ShutdownCallback();
-  Dart_IsolateCleanupCallback saved_cleanup = Isolate::CleanupCallback();
+  Dart_IsolateGroupCleanupCallback saved_cleanup =
+      Isolate::GroupCleanupCallback();
   Isolate::SetShutdownCallback(NULL);
-  Isolate::SetCleanupCallback(NULL);
+  Isolate::SetGroupCleanupCallback(NULL);
 
   intptr_t mydata = 12345;
   Dart_Isolate isolate =
       TestCase::CreateTestIsolate(NULL, reinterpret_cast<void*>(mydata));
   EXPECT(isolate != NULL);
-  EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateData()));
-  EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateData(isolate)));
+  EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_CurrentIsolateGroupData()));
+  EXPECT_EQ(mydata, reinterpret_cast<intptr_t>(Dart_IsolateGroupData(isolate)));
   Dart_ShutdownIsolate();
 
   Isolate::SetShutdownCallback(saved_shutdown);
-  Isolate::SetCleanupCallback(saved_cleanup);
+  Isolate::SetGroupCleanupCallback(saved_cleanup);
 }
 
 static Dart_Handle LoadScript(const char* url_str, const char* source) {
@@ -4250,9 +4338,8 @@
 
   // Pass a non-instance handle.
   result = Dart_SetField(lib, name, lib);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_SetField expects argument 'value' to be of type Instance.",
-               Dart_GetError(result));
+  EXPECT_ERROR(
+      result, "Dart_SetField expects argument 'value' to be of type Instance.");
 
   // Pass an error handle.  The error is contagious.
   result = Dart_SetField(lib, name, Api::NewError("myerror"));
@@ -5942,15 +6029,13 @@
   EXPECT_VALID(result);
 
   result = Dart_LookupLibrary(Dart_Null());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LookupLibrary expects argument 'url' to be non-null.",
-               Dart_GetError(result));
+  EXPECT_ERROR(result,
+               "Dart_LookupLibrary expects argument 'url' to be non-null.");
 
   result = Dart_LookupLibrary(Dart_True());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_LookupLibrary expects argument 'url' to be of type String.",
-      Dart_GetError(result));
+  EXPECT_ERROR(
+      result,
+      "Dart_LookupLibrary expects argument 'url' to be of type String.");
 
   result = Dart_LookupLibrary(Dart_NewApiError("incoming error"));
   EXPECT(Dart_IsError(result));
@@ -5958,9 +6043,7 @@
 
   url = NewString("noodles.dart");
   result = Dart_LookupLibrary(url);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LookupLibrary: library 'noodles.dart' not found.",
-               Dart_GetError(result));
+  EXPECT_ERROR(result, "Dart_LookupLibrary: library 'noodles.dart' not found.");
 }
 
 TEST_CASE(DartAPI_LibraryUrl) {
@@ -5970,15 +6053,13 @@
   EXPECT_VALID(lib);
 
   Dart_Handle result = Dart_LibraryUrl(Dart_Null());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ("Dart_LibraryUrl expects argument 'library' to be non-null.",
-               Dart_GetError(result));
+  EXPECT_ERROR(result,
+               "Dart_LibraryUrl expects argument 'library' to be non-null.");
 
   result = Dart_LibraryUrl(Dart_True());
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_LibraryUrl expects argument 'library' to be of type Library.",
-      Dart_GetError(result));
+  EXPECT_ERROR(
+      result,
+      "Dart_LibraryUrl expects argument 'library' to be of type Library.");
 
   result = Dart_LibraryUrl(error);
   EXPECT(Dart_IsError(result));
@@ -6040,17 +6121,14 @@
   EXPECT_VALID(type);
 
   result = Dart_SetNativeResolver(Dart_Null(), &MyNativeResolver1, NULL);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_SetNativeResolver expects argument 'library' to be non-null.",
-      Dart_GetError(result));
+  EXPECT_ERROR(
+      result,
+      "Dart_SetNativeResolver expects argument 'library' to be non-null.");
 
   result = Dart_SetNativeResolver(Dart_True(), &MyNativeResolver1, NULL);
-  EXPECT(Dart_IsError(result));
-  EXPECT_STREQ(
-      "Dart_SetNativeResolver expects argument 'library' to be of "
-      "type Library.",
-      Dart_GetError(result));
+  EXPECT_ERROR(result,
+               "Dart_SetNativeResolver expects argument 'library' to be of "
+               "type Library.");
 
   result = Dart_SetNativeResolver(error, &MyNativeResolver1, NULL);
   EXPECT(Dart_IsError(result));
@@ -6158,7 +6236,7 @@
   lib = TestCase::LoadTestScriptWithDFE(sourcefiles_count, sourcefiles, NULL,
                                         true);
   EXPECT_ERROR(lib,
-               "Compilation failed file:///test-lib:4:10:"
+               "Compilation failed /test-lib:4:10:"
                " Error: Setter not found: 'foo'");
   return;
 
@@ -6618,8 +6696,8 @@
 
 // Common code for RunLoop_Success/RunLoop_Failure.
 static void RunLoopTest(bool throw_exception) {
-  Dart_IsolateCreateCallback saved = Isolate::CreateCallback();
-  Isolate::SetCreateCallback(RunLoopTestCallback);
+  Dart_IsolateGroupCreateCallback saved = Isolate::CreateGroupCallback();
+  Isolate::SetCreateGroupCallback(RunLoopTestCallback);
   Dart_Isolate isolate =
       RunLoopTestCallback(NULL, NULL, NULL, NULL, NULL, NULL, NULL);
 
@@ -6643,7 +6721,7 @@
   Dart_ExitScope();
   Dart_ShutdownIsolate();
 
-  Isolate::SetCreateCallback(saved);
+  Isolate::SetCreateGroupCallback(saved);
 }
 
 VM_UNIT_TEST_CASE(DartAPI_RunLoop_Success) {
@@ -6654,45 +6732,93 @@
   RunLoopTest(true);
 }
 
-static void* shutdown_callback_data;
-static void IsolateShutdownTestCallback(void* callback_data) {
-  shutdown_callback_data = callback_data;
+static void* shutdown_isolate_group_data;
+static void* shutdown_isolate_data;
+static void* cleanup_isolate_group_data;
+static void* cleanup_isolate_data;
+
+// Called on isolate shutdown time (which is still allowed to run Dart code)
+static void IsolateShutdownTestCallback(void* group_data, void* isolate_data) {
+  // Shutdown runs before cleanup.
+  EXPECT(cleanup_isolate_group_data == nullptr);
+  EXPECT(cleanup_isolate_data == nullptr);
+
+  // Shutdown must have a current isolate (since it is allowed to execute Dart
+  // code)
+  EXPECT(Dart_CurrentIsolate() != nullptr);
+  EXPECT(Dart_CurrentIsolateGroupData() == group_data);
+  EXPECT(Dart_CurrentIsolateData() == isolate_data);
+
+  shutdown_isolate_group_data = group_data;
+  shutdown_isolate_data = isolate_data;
 }
-static void* cleanup_callback_data;
-static void IsolateCleanupTestCallback(void* callback_data) {
-  cleanup_callback_data = callback_data;
+
+// Called on isolate cleanup time (which is after the isolate has been
+// destroyed)
+static void IsolateCleanupTestCallback(void* group_data, void* isolate_data) {
+  // Cleanup runs after shutdown.
+  EXPECT(shutdown_isolate_group_data != nullptr);
+  EXPECT(shutdown_isolate_data != nullptr);
+
+  // The isolate was destroyed and there should not be a current isolate.
+  EXPECT(Dart_CurrentIsolate() == nullptr);
+
+  cleanup_isolate_group_data = group_data;
+  cleanup_isolate_data = isolate_data;
+}
+
+// Called on isolate group cleanup time (once all isolates have been destroyed)
+static void* cleanup_group_callback_data;
+static void IsolateGroupCleanupTestCallback(void* callback_data) {
+  cleanup_group_callback_data = callback_data;
 }
 
 VM_UNIT_TEST_CASE(DartAPI_IsolateShutdownAndCleanup) {
   Dart_IsolateShutdownCallback saved_shutdown = Isolate::ShutdownCallback();
-  Dart_IsolateCleanupCallback saved_cleanup = Isolate::CleanupCallback();
+  Dart_IsolateGroupCleanupCallback saved_cleanup =
+      Isolate::GroupCleanupCallback();
   Isolate::SetShutdownCallback(IsolateShutdownTestCallback);
   Isolate::SetCleanupCallback(IsolateCleanupTestCallback);
+  Isolate::SetGroupCleanupCallback(IsolateGroupCleanupTestCallback);
 
-  shutdown_callback_data = NULL;
-  cleanup_callback_data = NULL;
-  void* my_data = reinterpret_cast<void*>(12345);
+  shutdown_isolate_group_data = nullptr;
+  shutdown_isolate_data = nullptr;
+  cleanup_group_callback_data = nullptr;
+  void* my_group_data = reinterpret_cast<void*>(123);
+  void* my_data = reinterpret_cast<void*>(456);
+
   // Create an isolate.
-  Dart_Isolate isolate = TestCase::CreateTestIsolate(NULL, my_data);
+  Dart_Isolate isolate =
+      TestCase::CreateTestIsolate(nullptr, my_group_data, my_data);
   EXPECT(isolate != NULL);
 
   // The shutdown callback has not been called.
-  EXPECT_EQ(0, reinterpret_cast<intptr_t>(shutdown_callback_data));
-  EXPECT_EQ(0, reinterpret_cast<intptr_t>(cleanup_callback_data));
+  EXPECT(nullptr == shutdown_isolate_data);
+  EXPECT(nullptr == shutdown_isolate_group_data);
+  EXPECT(nullptr == cleanup_group_callback_data);
+
+  // The isolate is the active isolate which allows us to access the isolate
+  // specific and isolate-group specific data.
+  EXPECT(Dart_CurrentIsolateData() == my_data);
+  EXPECT(Dart_CurrentIsolateGroupData() == my_group_data);
 
   // Shutdown the isolate.
   Dart_ShutdownIsolate();
 
-  // The shutdown callback has been called.
-  EXPECT_EQ(12345, reinterpret_cast<intptr_t>(shutdown_callback_data));
-  EXPECT_EQ(12345, reinterpret_cast<intptr_t>(cleanup_callback_data));
+  // The shutdown & cleanup callbacks have been called.
+  EXPECT(my_data == shutdown_isolate_data);
+  EXPECT(my_group_data == shutdown_isolate_group_data);
+  EXPECT(my_data == cleanup_isolate_data);
+  EXPECT(my_group_data == cleanup_isolate_group_data);
+  EXPECT(my_group_data == cleanup_group_callback_data);
 
   Isolate::SetShutdownCallback(saved_shutdown);
-  Isolate::SetCleanupCallback(saved_cleanup);
+  Isolate::SetGroupCleanupCallback(saved_cleanup);
 }
 
 static int64_t add_result = 0;
-static void IsolateShutdownRunDartCodeTestCallback(void* callback_data) {
+static void IsolateShutdownRunDartCodeTestCallback(void* isolate_group_data,
+                                                   void* isolate_data) {
   Dart_Isolate isolate = Dart_CurrentIsolate();
   if (Dart_IsKernelIsolate(isolate) || Dart_IsServiceIsolate(isolate)) {
     return;
@@ -7810,6 +7936,66 @@
       "NoSuchMethodError: No top-level method 'getCurrentTag' declared.");
 }
 
+TEST_CASE(DartAPI_InvokeVMServiceMethod) {
+  char buffer[1024];
+  snprintf(buffer, sizeof(buffer),
+           R"({
+               "jsonrpc": 2.0,
+               "id": "foo",
+               "method": "getVM",
+               "params": { }
+              })");
+  uint8_t* response_json = nullptr;
+  intptr_t response_json_length = 0;
+  char* error = nullptr;
+  const bool success = Dart_InvokeVMServiceMethod(
+      reinterpret_cast<uint8_t*>(buffer), strlen(buffer), &response_json,
+      &response_json_length, &error);
+  EXPECT(success);
+  EXPECT(error == nullptr);
+
+  Dart_Handle bytes = Dart_NewExternalTypedDataWithFinalizer(
+      Dart_TypedData_kUint8, response_json, response_json_length, response_json,
+      response_json_length,
+      [](void* ignored, Dart_WeakPersistentHandle handle, void* peer) {
+        free(peer);
+      });
+  EXPECT_VALID(bytes);
+
+  // We don't have a C++ JSON decoder so we'll invoke dart to validate the
+  // result.
+  const char* kScript =
+      R"(
+        import 'dart:convert';
+        import 'dart:typed_data';
+        bool validate(bool condition) {
+          if (!condition) {
+            throw 'Failed to validate InvokeVMServiceMethod() response.';
+          }
+        }
+        bool validateResult(Uint8List bytes) {
+          final map = json.decode(utf8.decode(bytes));
+          validate(map['jsonrpc'] == '2.0');
+          validate(map['id'] == 'foo');
+          validate(map['result']['name'] == 'vm');
+          validate(map['result']['type'] == 'VM');
+          validate(map['result'].containsKey('architectureBits'));
+          validate(map['result'].containsKey('pid'));
+          validate(map['result'].containsKey('startTime'));
+          validate(map['result'].containsKey('hostCPU'));
+          validate(map['result'].containsKey('targetCPU'));
+          validate(map['result'].containsKey('version'));
+          return true;
+        }
+      )";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  Dart_Handle result = Dart_Invoke(lib, NewString("validateResult"), 1, &bytes);
+  EXPECT(Dart_IsBoolean(result));
+  EXPECT(result == Dart_True());
+}
+
 #endif  // !PRODUCT
 
 }  // namespace dart
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index c27ce69..ecb922a 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -363,8 +363,10 @@
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
+    visitor->set_gc_root_type("local handle");
     Handles<kLocalHandleSizeInWords, kLocalHandlesPerChunk,
             kOffsetOfRawPtrInLocalHandle>::VisitObjectPointers(visitor);
+    visitor->clear_gc_root_type();
   }
 
   // Reset the local handles block for reuse.
@@ -427,8 +429,10 @@
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
+    visitor->set_gc_root_type("persistent handle");
     Handles<kPersistentHandleSizeInWords, kPersistentHandlesPerChunk,
             kOffsetOfRawPtrInPersistentHandle>::VisitObjectPointers(visitor);
+    visitor->clear_gc_root_type();
   }
 
   // Visit all the handles.
@@ -510,10 +514,12 @@
 
   // Visit all object pointers stored in the various handles.
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
+    visitor->set_gc_root_type("weak persistent handle");
     Handles<kFinalizablePersistentHandleSizeInWords,
             kFinalizablePersistentHandlesPerChunk,
             kOffsetOfRawPtrInFinalizablePersistentHandle>::
         VisitObjectPointers(visitor);
+    visitor->clear_gc_root_type();
   }
 
   // Allocates a persistent handle, these have to be destroyed explicitly
@@ -709,6 +715,9 @@
 
   void VisitObjectPointers(ObjectPointerVisitor* visitor) {
     persistent_handles().VisitObjectPointers(visitor);
+    if (visitor->visit_weak_persistent_handles()) {
+      weak_persistent_handles().VisitObjectPointers(visitor);
+    }
   }
 
   void VisitWeakHandles(HandleVisitor* visitor) {
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 5a8709b..406e1e0 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -247,7 +247,8 @@
       var_descriptors_(LocalVarDescriptors::ZoneHandle()),
       desc_indices_(8),
       pc_desc_(PcDescriptors::ZoneHandle()) {
-  ASSERT(!function_.IsNull());  // Frames with bytecode stubs should be skipped.
+  // The frame of a bytecode stub has a null function. It may be encountered
+  // when single stepping.
 }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -263,6 +264,7 @@
       token_pos_initialized_(false),
       token_pos_(TokenPosition::kNoSource),
       try_index_(-1),
+      deopt_id_(DeoptId::kNone),
       line_number_(-1),
       column_number_(-1),
       context_level_(-1),
@@ -286,6 +288,7 @@
       token_pos_initialized_(false),
       token_pos_(TokenPosition::kNoSource),
       try_index_(-1),
+      deopt_id_(DeoptId::kNone),
       line_number_(-1),
       column_number_(-1),
       context_level_(-1),
@@ -463,7 +466,7 @@
     case RawFunction::kImplicitGetter:
     case RawFunction::kImplicitSetter:
     case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kStaticFieldInitializer:
+    case RawFunction::kFieldInitializer:
     case RawFunction::kMethodExtractor:
     case RawFunction::kNoSuchMethodDispatcher:
     case RawFunction::kInvokeFieldDispatcher:
@@ -551,6 +554,61 @@
   }
 }
 
+// If the current top Dart frame is interpreted, returns the fp of the caller
+// in compiled code that invoked the interpreter, or 0 if not found.
+// If the current top Dart frame is compiled, returns the fp of the caller in
+// interpreted bytecode that invoked compiled code, or ULONG_MAX if not found.
+// Returning compiled code fp 0 (or bytecode fp ULONG_MAX) as fp value insures
+// that the fp will compare as a callee of any valid frame pointer of the same
+// mode (compiled code or bytecode).
+static uword CrossCallerFp() {
+  StackFrameIterator iterator(ValidationPolicy::kDontValidateFrames,
+                              Thread::Current(),
+                              StackFrameIterator::kNoCrossThreadIteration);
+  StackFrame* frame;
+  do {
+    frame = iterator.NextFrame();
+    RELEASE_ASSERT(frame != nullptr);
+  } while (!frame->IsDartFrame());
+  const bool top_is_interpreted = frame->is_interpreted();
+  do {
+    frame = iterator.NextFrame();
+    if (frame == nullptr) {
+      return top_is_interpreted ? 0 : ULONG_MAX;
+    }
+    if (!frame->IsDartFrame()) {
+      continue;
+    }
+  } while (top_is_interpreted == frame->is_interpreted());
+  return frame->fp();
+}
+
+ActivationFrame::Relation ActivationFrame::CompareTo(
+    uword other_fp,
+    bool other_is_interpreted) const {
+  if (fp() == other_fp) {
+    ASSERT(IsInterpreted() == other_is_interpreted);
+    return kSelf;
+  }
+  if (IsInterpreted()) {
+    if (!other_is_interpreted) {
+      // Instead of fp(), use the fp of the compiled frame that called into the
+      // interpreter (CrossCallerFp).
+      // Note that if CrossCallerFp == other_fp, it must compare as a caller.
+      return IsCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee : kCaller;
+    }
+    return IsBytecodeCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
+  }
+  if (other_is_interpreted) {
+    // Instead of fp(), use the fp of the interpreted frame that called into
+    // compiled code (CrossCallerFp).
+    // Note that if CrossCallerFp == other_fp, it must compare as a caller.
+    return IsBytecodeCalleeFrameOf(other_fp, CrossCallerFp()) ? kCallee
+                                                              : kCaller;
+  }
+  return IsCalleeFrameOf(other_fp, fp()) ? kCallee : kCaller;
+}
+
 RawString* ActivationFrame::QualifiedFunctionName() {
   return String::New(Debugger::QualifiedFunctionName(function()));
 }
@@ -676,7 +734,8 @@
 }
 
 bool ActivationFrame::IsDebuggable() const {
-  return Debugger::IsDebuggable(function());
+  // When stepping in bytecode stub, function is null.
+  return !function().IsNull() && Debugger::IsDebuggable(function());
 }
 
 void ActivationFrame::PrintDescriptorsError(const char* message) {
@@ -709,27 +768,16 @@
   OS::Abort();
 }
 
-// Calculate the context level at the current bytecode pc or code deopt id
-// of the frame.
+// Calculate the context level at the current pc of the frame.
 intptr_t ActivationFrame::ContextLevel() {
+  ASSERT(live_frame_);
   const Context& ctx = GetSavedCurrentContext();
   if (context_level_ < 0 && !ctx.IsNull()) {
-    ASSERT(IsInterpreted() || !code_.is_optimized());
-    if (function().is_declared_in_bytecode()) {
+    if (IsInterpreted()) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      // Although this activation frame may not have bytecode, its code was
-      // compiled from bytecode.
-      if (!IsInterpreted()) {
-        // TODO(regis): If this frame was compiled from bytecode, pc_ does not
-        // reflect a bytecode pc. How do we map to one? We should generate new
-        // LocalVarDescriptors for code compiled from bytecode so that they
-        // provide deopt_id to context level mapping.
-        UNIMPLEMENTED();
-      }
-      ASSERT(function().HasBytecode());
       Thread* thread = Thread::Current();
       Zone* zone = thread->zone();
-      Bytecode& bytecode = Bytecode::Handle(zone, function().bytecode());
+      const auto& bytecode = Bytecode::Handle(zone, function_.bytecode());
       if (!bytecode.HasLocalVariablesInfo()) {
         PrintDescriptorsError("Missing local variables info");
       }
@@ -742,33 +790,12 @@
         if (local_vars.Kind() ==
             kernel::BytecodeLocalVariablesIterator::kScope) {
           if (local_vars.StartPC() <= pc_offset &&
-              pc_offset < local_vars.EndPC()) {
+              pc_offset <= local_vars.EndPC()) {
             ASSERT(context_level_ <= local_vars.ContextLevel());
             context_level_ = local_vars.ContextLevel();
           }
         }
       }
-      if (context_level_ < 0 && function().IsClosureFunction()) {
-        // Obtain the context level from the parent function.
-        // TODO(alexmarkov): Define scope which includes the whole closure body.
-        Function& parent = Function::Handle(zone, function().parent_function());
-        do {
-          bytecode = parent.bytecode();
-          kernel::BytecodeLocalVariablesIterator local_vars(zone, bytecode);
-          while (local_vars.MoveNext()) {
-            if (local_vars.Kind() ==
-                kernel::BytecodeLocalVariablesIterator::kScope) {
-              if (local_vars.StartTokenPos() <= TokenPos() &&
-                  TokenPos() <= local_vars.EndTokenPos()) {
-                ASSERT(context_level_ <= local_vars.ContextLevel());
-                context_level_ = local_vars.ContextLevel();
-              }
-            }
-          }
-          if (context_level_ >= 0) break;
-          parent = parent.parent_function();
-        } while (!parent.IsNull());
-      }
       if (context_level_ < 0) {
         PrintDescriptorsError("Missing context level in local variables info");
       }
@@ -826,9 +853,14 @@
         ASSERT(kind == RawLocalVarDescriptors::kContextVar);
         if (!live_frame_) {
           ASSERT(!ctx_.IsNull());
+          // Compiled code uses relative context levels, i.e. the frame context
+          // level is always 0 on entry.
+          // Bytecode uses absolute context levels, i.e. the frame context level
+          // on entry must be calculated.
+          const intptr_t frame_ctx_level =
+              IsInterpreted() ? ctx_.GetLevel() : 0;
           return GetRelativeContextVar(var_info.scope_id,
-                                       variable_index.value(),
-                                       /* frame_ctx_level = */ 0);
+                                       variable_index.value(), frame_ctx_level);
         }
         return GetContextVar(var_info.scope_id, variable_index.value());
       }
@@ -996,8 +1028,9 @@
         if (yield_point_index == await_jump_var) {
           token_pos_ = iter.TokenPos();
           token_pos_initialized_ = true;
-          try_index_ = bytecode.GetTryIndexAtPc(bytecode.PayloadStart() +
-                                                iter.PcOffset());
+          const uword return_address =
+              KernelBytecode::Next(bytecode.PayloadStart() + iter.PcOffset());
+          try_index_ = bytecode.GetTryIndexAtPc(return_address);
           return;
         }
         ++yield_point_index;
@@ -1065,6 +1098,10 @@
 }
 
 bool ActivationFrame::IsAsyncMachinery() const {
+  if (function_.IsNull()) {
+    ASSERT(IsInterpreted());  // This frame is a bytecode stub frame.
+    return false;
+  }
   Isolate* isolate = Isolate::Current();
   if (function_.raw() == isolate->object_store()->complete_on_async_return()) {
     // We are completing an async function's completer.
@@ -1112,21 +1149,8 @@
 }
 
 RawObject* ActivationFrame::GetAsyncOperation() {
-  GetVarDescriptors();
-  intptr_t var_desc_len = var_descriptors_.Length();
-  for (intptr_t i = 0; i < var_desc_len; i++) {
-    RawLocalVarDescriptors::VarInfo var_info;
-    var_descriptors_.GetInfo(i, &var_info);
-    if (var_descriptors_.GetName(i) == Symbols::AsyncOperation().raw()) {
-      const int8_t kind = var_info.kind();
-      const auto variable_index = VariableIndex(var_info.index());
-      if (kind == RawLocalVarDescriptors::kStackVar) {
-        return GetStackVar(variable_index);
-      } else {
-        ASSERT(kind == RawLocalVarDescriptors::kContextVar);
-        return GetContextVar(var_info.scope_id, variable_index.value());
-      }
-    }
+  if (function().name() == Symbols::AsyncOperation().raw()) {
+    return GetParameter(0);
   }
   return Object::null();
 }
@@ -1560,17 +1584,31 @@
   const String& url = String::Handle(SourceUrl());
   intptr_t line = LineNumber();
   const char* func_name = Debugger::QualifiedFunctionName(function());
-  return Thread::Current()->zone()->PrintToString(
-      "[ Frame pc(0x%" Px ") fp(0x%" Px ") sp(0x%" Px
-      ")\n"
-      "\tfunction = %s\n"
-      "\turl = %s\n"
-      "\tline = %" Pd
-      "\n"
-      "\tcontext = %s\n"
-      "\tcontext level = %" Pd " ]\n",
-      pc(), fp(), sp(), func_name, url.ToCString(), line, ctx_.ToCString(),
-      ContextLevel());
+  if (live_frame_) {
+    return Thread::Current()->zone()->PrintToString(
+        "[ Frame pc(0x%" Px " %s offset:0x%" Px ") fp(0x%" Px ") sp(0x%" Px
+        ")\n"
+        "\tfunction = %s\n"
+        "\turl = %s\n"
+        "\tline = %" Pd
+        "\n"
+        "\tcontext = %s\n"
+        "\tcontext level = %" Pd " ]\n",
+        pc(), IsInterpreted() ? "bytecode" : "code",
+        pc() - (IsInterpreted() ? bytecode().PayloadStart()
+                                : code().PayloadStart()),
+        fp(), sp(), func_name, url.ToCString(), line, ctx_.ToCString(),
+        ContextLevel());
+  } else {
+    return Thread::Current()->zone()->PrintToString(
+        "[ Frame %s function = %s\n"
+        "\turl = %s\n"
+        "\tline = %" Pd
+        "\n"
+        "\tcontext = %s\n",
+        IsInterpreted() ? "bytecode" : "code", func_name, url.ToCString(), line,
+        ctx_.ToCString());
+  }
 }
 
 void ActivationFrame::PrintToJSONObject(JSONObject* jsobj) {
@@ -1610,11 +1648,7 @@
       TokenPosition visible_end_token_pos;
       VariableAt(v, &var_name, &declaration_token_pos, &visible_start_token_pos,
                  &visible_end_token_pos, &var_value);
-      if ((var_name.raw() != Symbols::AsyncOperation().raw()) &&
-          (var_name.raw() != Symbols::AsyncCompleter().raw()) &&
-          (var_name.raw() != Symbols::ControllerStream().raw()) &&
-          (var_name.raw() != Symbols::AwaitJumpVar().raw()) &&
-          (var_name.raw() != Symbols::AsyncStackTraceVar().raw())) {
+      if (!IsSyntheticVariableName(var_name)) {
         JSONObject jsvar(&jsvars);
         jsvar.AddProperty("type", "BoundVariable");
         var_name = String::ScrubName(var_name);
@@ -1835,7 +1869,11 @@
       async_causal_stack_trace_(NULL),
       awaiter_stack_trace_(NULL),
       stepping_fp_(0),
+      interpreted_stepping_(false),
+      last_stepping_fp_(0),
+      last_stepping_pos_(TokenPosition::kNoSource),
       async_stepping_fp_(0),
+      interpreted_async_stepping_(false),
       top_frame_awaiter_(Object::null()),
       skip_next_step_(false),
       needs_breakpoint_cleanup_(false),
@@ -2074,8 +2112,6 @@
   if (FLAG_trace_debugger_stacktrace) {
     const Context& ctx = activation->GetSavedCurrentContext();
     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
-  }
-  if (FLAG_trace_debugger_stacktrace) {
     OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber());
   }
   return activation;
@@ -2093,8 +2129,6 @@
   if (FLAG_trace_debugger_stacktrace) {
     const Context& ctx = activation->GetSavedCurrentContext();
     OS::PrintErr("\tUsing saved context: %s\n", ctx.ToCString());
-  }
-  if (FLAG_trace_debugger_stacktrace) {
     OS::PrintErr("\tLine number: %" Pd "\n", activation->LineNumber());
   }
   return activation;
@@ -2580,9 +2614,11 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
     if (frame->is_interpreted()) {
       Bytecode& bytecode = Bytecode::Handle(frame->LookupDartBytecode());
-      if (bytecode.function() == Function::null()) {
-        continue;  // Skip bytecode stub frame.
-      }
+      // Note that we do not skip bytecode stub frame (with a null function),
+      // so that we can ignore a single stepping breakpoint in such a frame.
+      // A bytecode stub contains a VM internal bytecode followed by a
+      // ReturnTOS bytecode. The single step on the ReturnTOS bytecode
+      // needs to be skipped.
       ActivationFrame* activation =
           new ActivationFrame(frame->pc(), frame->fp(), frame->sp(), bytecode);
       return activation;
@@ -2762,6 +2798,49 @@
   ClearCachedStackTraces();
 }
 
+// Helper to refine the resolved token pos.
+static void RefineBreakpointPos(const Script& script,
+                                TokenPosition pos,
+                                TokenPosition next_closest_token_position,
+                                TokenPosition requested_token_pos,
+                                TokenPosition last_token_pos,
+                                intptr_t requested_column,
+                                TokenPosition exact_token_pos,
+                                TokenPosition* best_fit_pos,
+                                intptr_t* best_column,
+                                intptr_t* best_line,
+                                TokenPosition* best_token_pos) {
+  intptr_t token_start_column = -1;
+  intptr_t token_line = -1;
+  if (requested_column >= 0) {
+    TokenPosition ignored;
+    TokenPosition end_of_line_pos;
+    script.GetTokenLocation(pos, &token_line, &token_start_column);
+    script.TokenRangeAtLine(token_line, &ignored, &end_of_line_pos);
+    TokenPosition token_end_pos =
+        (end_of_line_pos < next_closest_token_position)
+            ? end_of_line_pos
+            : next_closest_token_position;
+
+    if ((token_end_pos < exact_token_pos) ||
+        (token_start_column > *best_column)) {
+      // Prefer the token with the lowest column number compatible
+      // with the requested column.
+      return;
+    }
+  }
+
+  // Prefer the lowest (first) token pos.
+  if (pos < *best_fit_pos) {
+    *best_fit_pos = pos;
+    *best_line = token_line;
+    *best_column = token_start_column;
+    // best_token_pos is only used when column number is specified.
+    *best_token_pos = TokenPosition(exact_token_pos.value() -
+                                    (requested_column - *best_column));
+  }
+}
+
 // Returns the best fit token position for a breakpoint.
 //
 // Takes a range of tokens [requested_token_pos, last_token_pos] and
@@ -2867,51 +2946,62 @@
   if (in_bytecode) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     kernel::BytecodeSourcePositionsIterator iter(zone, bytecode);
-    while (iter.MoveNext()) {
-      const TokenPosition pos = iter.TokenPos();
-      if ((!pos.IsReal()) || (pos < requested_token_pos) ||
-          (pos > last_token_pos)) {
-        // Token is not in the target range.
-        continue;
-      }
-
-      intptr_t token_start_column = -1;
-      intptr_t token_line = -1;
-      if (requested_column >= 0) {
-        kernel::BytecodeSourcePositionsIterator iter2(zone, bytecode);
-        TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
-        while (iter2.MoveNext()) {
-          const TokenPosition next = iter2.TokenPos();
-          if (next < next_closest_token_position && next > pos) {
-            next_closest_token_position = next;
+    uword pc_offset = kUwordMax;
+    TokenPosition pos = TokenPosition::kNoSource;
+    // Ignore all possible breakpoint positions until the first DebugCheck
+    // opcode of the function.
+    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
+    if (debug_check_pc != 0) {
+      const uword debug_check_pc_offset =
+          debug_check_pc - bytecode.PayloadStart();
+      while (iter.MoveNext()) {
+        if (pc_offset != kUwordMax) {
+          // Check that there is at least one 'debug checked' opcode in the last
+          // source position range.
+          uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(
+              pc_offset, iter.PcOffset());
+          pc_offset = kUwordMax;
+          if (pc != 0) {
+            TokenPosition next_closest_token_position =
+                TokenPosition::kMaxSource;
+            if (requested_column >= 0) {
+              kernel::BytecodeSourcePositionsIterator iter2(zone, bytecode);
+              TokenPosition next_closest_token_position =
+                  TokenPosition::kMaxSource;
+              while (iter2.MoveNext()) {
+                const TokenPosition next = iter2.TokenPos();
+                if (next < next_closest_token_position && next > pos) {
+                  next_closest_token_position = next;
+                }
+              }
+            }
+            RefineBreakpointPos(
+                script, pos, next_closest_token_position, requested_token_pos,
+                last_token_pos, requested_column, exact_token_pos,
+                &best_fit_pos, &best_column, &best_line, &best_token_pos);
           }
         }
-
-        TokenPosition ignored;
-        TokenPosition end_of_line_pos;
-        script.GetTokenLocation(pos, &token_line, &token_start_column);
-        script.TokenRangeAtLine(token_line, &ignored, &end_of_line_pos);
-        TokenPosition token_end_pos =
-            (end_of_line_pos < next_closest_token_position)
-                ? end_of_line_pos
-                : next_closest_token_position;
-
-        if ((token_end_pos < exact_token_pos) ||
-            (token_start_column > best_column)) {
-          // Prefer the token with the lowest column number compatible
-          // with the requested column.
+        pos = iter.TokenPos();
+        if ((!pos.IsReal()) || (pos < requested_token_pos) ||
+            (pos > last_token_pos)) {
+          // Token is not in the target range.
           continue;
         }
+        pc_offset = iter.PcOffset();
+        if (pc_offset < debug_check_pc_offset) {
+          // No breakpoints in prologue.
+          pc_offset = debug_check_pc_offset;
+        }
       }
-
-      // Prefer the lowest (first) token pos.
-      if (pos < best_fit_pos) {
-        best_fit_pos = pos;
-        best_line = token_line;
-        best_column = token_start_column;
-        // best_token_pos is only used when column number is specified.
-        best_token_pos = TokenPosition(exact_token_pos.value() -
-                                       (requested_column - best_column));
+      if (pc_offset != kUwordMax) {
+        uword pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
+                                                               bytecode.Size());
+        if (pc != 0) {
+          RefineBreakpointPos(script, pos, TokenPosition::kMaxSource,
+                              requested_token_pos, last_token_pos,
+                              requested_column, exact_token_pos, &best_fit_pos,
+                              &best_column, &best_line, &best_token_pos);
+        }
       }
     }
 #else
@@ -2926,46 +3016,21 @@
         // Token is not in the target range.
         continue;
       }
-
-      intptr_t token_start_column = -1;
-      intptr_t token_line = -1;
+      TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
       if (requested_column >= 0) {
         // Find next closest safepoint
         PcDescriptors::Iterator iter2(desc, kSafepointKind);
-        TokenPosition next_closest_token_position = TokenPosition::kMaxSource;
         while (iter2.MoveNext()) {
           const TokenPosition next = iter2.TokenPos();
           if (next < next_closest_token_position && next > pos) {
             next_closest_token_position = next;
           }
         }
-
-        TokenPosition ignored;
-        TokenPosition end_of_line_pos;
-        script.GetTokenLocation(pos, &token_line, &token_start_column);
-        script.TokenRangeAtLine(token_line, &ignored, &end_of_line_pos);
-        TokenPosition token_end_pos =
-            (end_of_line_pos < next_closest_token_position)
-                ? end_of_line_pos
-                : next_closest_token_position;
-
-        if ((token_end_pos < exact_token_pos) ||
-            (token_start_column > best_column)) {
-          // Prefer the token with the lowest column number compatible
-          // with the requested column.
-          continue;
-        }
       }
-
-      // Prefer the lowest (first) token pos.
-      if (pos < best_fit_pos) {
-        best_fit_pos = pos;
-        best_line = token_line;
-        best_column = token_start_column;
-        // best_token_pos is only used when column number is specified.
-        best_token_pos = TokenPosition(exact_token_pos.value() -
-                                       (requested_column - best_column));
-      }
+      RefineBreakpointPos(script, pos, next_closest_token_position,
+                          requested_token_pos, last_token_pos, requested_column,
+                          exact_token_pos, &best_fit_pos, &best_column,
+                          &best_line, &best_token_pos);
     }
   }
 
@@ -3051,24 +3116,6 @@
   return TokenPosition::kNoSource;
 }
 
-#if !defined(DART_PRECOMPILED_RUNTIME)
-// Find a 'debug break checked' bytecode in the range [pc..end_pc[ and return
-// the pc after it or nullptr.
-static const KBCInstr* FindBreakpointCheckedInstr(const KBCInstr* pc,
-                                                  const KBCInstr* end_pc) {
-  while ((pc < end_pc) && !KernelBytecode::IsDebugBreakCheckedOpcode(pc)) {
-    pc = KernelBytecode::Next(pc);
-  }
-  if (pc < end_pc) {
-    ASSERT(KernelBytecode::IsDebugBreakCheckedOpcode(pc));
-    // The checked debug break pc must point to the next bytecode.
-    return KernelBytecode::Next(pc);
-  }
-  // No 'debug break checked' bytecode in the range.
-  return nullptr;
-}
-#endif  // !defined(DART_PRECOMPILED_RUNTIME)
-
 void Debugger::MakeCodeBreakpointAt(const Function& func,
                                     BreakpointLocation* loc) {
   ASSERT(loc->token_pos_.IsReal());
@@ -3079,45 +3126,45 @@
   if (func.HasBytecode()) {
     Bytecode& bytecode = Bytecode::Handle(func.bytecode());
     ASSERT(!bytecode.IsNull());
-    const KBCInstr* pc = nullptr;
+    uword pc = 0;
     if (bytecode.HasSourcePositions()) {
       kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
                                                    bytecode);
-      bool check_range = false;
-      while (iter.MoveNext()) {
-        if (check_range) {
-          const KBCInstr* end_pc =
-              reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart()) +
-              iter.PcOffset();
-          check_range = false;
-          // Find a 'debug break checked' bytecode in the range [pc..end_pc[.
-          pc = FindBreakpointCheckedInstr(pc, end_pc);
-          if (pc != nullptr) {
+      // Ignore all possible breakpoint positions until the first DebugCheck
+      // opcode of the function.
+      const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
+      if (debug_check_pc != 0) {
+        const uword debug_check_pc_offset =
+            debug_check_pc - bytecode.PayloadStart();
+        uword pc_offset = kUwordMax;
+        while (iter.MoveNext()) {
+          if (pc_offset != kUwordMax) {
+            pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
+                                                             iter.PcOffset());
+            pc_offset = kUwordMax;
             // TODO(regis): We may want to find all PCs for a token position,
             // e.g. in the case of duplicated bytecode in finally clauses.
             break;
           }
+          if (iter.TokenPos() == loc->token_pos_) {
+            pc_offset = iter.PcOffset();
+            if (pc_offset < debug_check_pc_offset) {
+              // No breakpoints in prologue.
+              pc_offset = debug_check_pc_offset;
+            }
+          }
         }
-        if (iter.TokenPos() == loc->token_pos_) {
-          pc = reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart()) +
-               iter.PcOffset();
-          check_range = true;
+        if (pc_offset != kUwordMax) {
+          pc = bytecode.GetDebugCheckedOpcodeReturnAddress(pc_offset,
+                                                           bytecode.Size());
         }
       }
-      if (check_range) {
-        ASSERT(pc != nullptr);
-        // Use the end of the bytecode as the end of the range to check.
-        pc = FindBreakpointCheckedInstr(
-            pc, reinterpret_cast<const KBCInstr*>(bytecode.PayloadStart()) +
-                    bytecode.Size());
-      }
     }
-    if (pc != nullptr) {
-      CodeBreakpoint* code_bpt = GetCodeBreakpoint(reinterpret_cast<uword>(pc));
+    if (pc != 0) {
+      CodeBreakpoint* code_bpt = GetCodeBreakpoint(pc);
       if (code_bpt == NULL) {
         // No code breakpoint for this code exists; create one.
-        code_bpt = new CodeBreakpoint(bytecode, loc->token_pos_,
-                                      reinterpret_cast<uword>(pc));
+        code_bpt = new CodeBreakpoint(bytecode, loc->token_pos_, pc);
         RegisterCodeBreakpoint(code_bpt);
       }
       code_bpt->set_bpt_location(loc);
@@ -3172,6 +3219,12 @@
   Array& functions = Array::Handle(zone);
   GrowableObjectArray& closures = GrowableObjectArray::Handle(zone);
   Function& function = Function::Handle(zone);
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  Bytecode& bytecode = Bytecode::Handle(zone);
+  ObjectPool& pool = ObjectPool::Handle(zone);
+  Object& object = Object::Handle(zone);
+  Function& closure = Function::Handle(zone);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
 
   closures = isolate_->object_store()->closure_functions();
   const intptr_t num_closures = closures.Length();
@@ -3224,11 +3277,59 @@
         for (intptr_t pos = 0; pos < num_functions; pos++) {
           function ^= functions.At(pos);
           ASSERT(!function.IsNull());
-          // Check token position first to avoid unnecessary calls
-          // to script() which allocates handles.
-          if ((function.token_pos() == start_pos) &&
-              (function.end_token_pos() == end_pos) &&
-              (function.script() == script.raw())) {
+          bool function_added = false;
+#if !defined(DART_PRECOMPILED_RUNTIME)
+          // Note that a non-debuggable async function may refer to a debuggable
+          // async op closure function via its object pool.
+          if (function.HasBytecode()) {
+            // Check token position first to avoid unnecessary calls
+            // to script() which allocates handles.
+            if (function.token_pos() <= start_pos &&
+                function.end_token_pos() >= end_pos &&
+                function.script() == script.raw()) {
+              // Record the function if the token range matches exactly.
+              if (function.is_debuggable() &&
+                  function.token_pos() == start_pos &&
+                  function.end_token_pos() == end_pos) {
+                bytecode_function_list->Add(function);
+                function_added = true;
+              }
+              // Visit the closures declared in a bytecode function by
+              // traversing its object pool, because they do not appear in the
+              // object store's list of closures.
+              ASSERT(!function.IsLocalFunction());
+              bytecode = function.bytecode();
+              pool = bytecode.object_pool();
+              for (intptr_t i = 0; i < pool.Length(); i++) {
+                ObjectPool::EntryType entry_type = pool.TypeAt(i);
+                if (entry_type != ObjectPool::EntryType::kTaggedObject) {
+                  continue;
+                }
+                object = pool.ObjectAt(i);
+                if (object.IsFunction()) {
+                  closure ^= object.raw();
+                  if (closure.kind() == RawFunction::kClosureFunction &&
+                      closure.IsLocalFunction() && closure.is_debuggable() &&
+                      closure.token_pos() == start_pos &&
+                      closure.end_token_pos() == end_pos) {
+                    ASSERT(closure.HasBytecode());
+                    ASSERT(closure.script() == script.raw());
+                    bytecode_function_list->Add(closure);
+                  }
+                }
+              }
+            }
+          }
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+          if (function.is_debuggable() && function.HasCode() &&
+              function.token_pos() == start_pos &&
+              function.end_token_pos() == end_pos &&
+              function.script() == script.raw()) {
+            code_function_list->Add(function);
+            function_added = true;
+          }
+          if (function_added && function.HasImplicitClosureFunction()) {
+            function = function.ImplicitClosureFunction();
             if (function.is_debuggable()) {
               if (function.HasBytecode()) {
                 bytecode_function_list->Add(function);
@@ -3237,17 +3338,6 @@
                 code_function_list->Add(function);
               }
             }
-            if (function.HasImplicitClosureFunction()) {
-              function = function.ImplicitClosureFunction();
-              if (function.is_debuggable()) {
-                if (function.HasBytecode()) {
-                  bytecode_function_list->Add(function);
-                }
-                if (function.HasCode()) {
-                  code_function_list->Add(function);
-                }
-              }
-            }
           }
         }
       }
@@ -3822,6 +3912,7 @@
       (stack_trace->FrameAt(0)->function().IsAsyncClosure() ||
        stack_trace->FrameAt(0)->function().IsAsyncGenClosure())) {
     async_stepping_fp_ = stack_trace->FrameAt(0)->fp();
+    interpreted_async_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     async_stepping_fp_ = 0;
   }
@@ -3830,6 +3921,7 @@
 void Debugger::SetSyncSteppingFramePointer(DebuggerStackTrace* stack_trace) {
   if (stack_trace->Length() > 0) {
     stepping_fp_ = stack_trace->FrameAt(0)->fp();
+    interpreted_stepping_ = stack_trace->FrameAt(0)->IsInterpreted();
   } else {
     stepping_fp_ = 0;
   }
@@ -3884,6 +3976,7 @@
       ActivationFrame* frame = stack_trace->FrameAt(i);
       if (frame->IsDebuggable()) {
         stepping_fp_ = frame->fp();
+        interpreted_stepping_ = frame->IsInterpreted();
         break;
       }
     }
@@ -3980,13 +4073,13 @@
   return true;
 }
 
-// Given a return address pc, find the "rewind" pc, which is the pc
+// Given a return address, find the "rewind" pc, which is the pc
 // before the corresponding call.
-static uword LookupRewindPc(const Code& code, uword pc) {
+static uword LookupRewindPc(const Code& code, uword return_address) {
   ASSERT(!code.is_optimized());
-  ASSERT(code.ContainsInstructionAt(pc));
+  ASSERT(code.ContainsInstructionAt(return_address));
 
-  uword pc_offset = pc - code.PayloadStart();
+  uword pc_offset = return_address - code.PayloadStart();
   const PcDescriptors& descriptors =
       PcDescriptors::Handle(code.pc_descriptors());
   PcDescriptors::Iterator iter(
@@ -4007,10 +4100,33 @@
   return 0;
 }
 
+// Given a return address, find the "rewind" pc, which is the pc
+// before the corresponding call.
+static uword LookupRewindPc(const Bytecode& bytecode, uword return_address) {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
+  ASSERT(bytecode.ContainsInstructionAt(return_address));
+  uword pc = bytecode.PayloadStart();
+  const uword end_pc = pc + bytecode.Size();
+  while (pc < end_pc) {
+    uword next_pc = KernelBytecode::Next(pc);
+    if (next_pc == return_address) {
+      return pc;
+    }
+    pc = next_pc;
+  }
+  return 0;
+#endif
+}
+
 void Debugger::RewindToFrame(intptr_t frame_index) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   Code& code = Code::Handle(zone);
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  Bytecode& bytecode = Bytecode::Handle(zone);
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
   Function& function = Function::Handle(zone);
 
   // Find the requested frame.
@@ -4022,29 +4138,47 @@
        frame = iterator.NextFrame()) {
     ASSERT(frame->IsValid());
     if (frame->IsDartFrame()) {
-      code = frame->LookupDartCode();
-      function = code.function();
-      if (!IsFunctionVisible(function)) {
-        continue;
-      }
-      if (code.is_optimized()) {
-        intptr_t sub_index = 0;
-        for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
-             it.Advance()) {
-          if (current_frame == frame_index) {
-            RewindToOptimizedFrame(frame, code, sub_index);
-            UNREACHABLE();
-          }
-          current_frame++;
-          sub_index++;
+      if (frame->is_interpreted()) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+        bytecode = frame->LookupDartBytecode();
+        function = bytecode.function();
+        if (function.IsNull() || !IsFunctionVisible(function)) {
+          continue;  // Skip bytecode stub frame or invisible frame.
         }
-      } else {
         if (current_frame == frame_index) {
-          // We are rewinding to an unoptimized frame.
-          RewindToUnoptimizedFrame(frame, code);
+          // We are rewinding to an interpreted frame.
+          RewindToInterpretedFrame(frame, bytecode);
           UNREACHABLE();
         }
         current_frame++;
+#else
+        UNREACHABLE();
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
+      } else {
+        code = frame->LookupDartCode();
+        function = code.function();
+        if (!IsFunctionVisible(function)) {
+          continue;
+        }
+        if (code.is_optimized()) {
+          intptr_t sub_index = 0;
+          for (InlinedFunctionsIterator it(code, frame->pc()); !it.Done();
+               it.Advance()) {
+            if (current_frame == frame_index) {
+              RewindToOptimizedFrame(frame, code, sub_index);
+              UNREACHABLE();
+            }
+            current_frame++;
+            sub_index++;
+          }
+        } else {
+          if (current_frame == frame_index) {
+            // We are rewinding to an unoptimized frame.
+            RewindToUnoptimizedFrame(frame, code);
+            UNREACHABLE();
+          }
+          current_frame++;
+        }
       }
     }
   }
@@ -4068,10 +4202,10 @@
     OS::PrintErr(
         "===============================\n"
         "Rewinding to unoptimized frame:\n"
-        "    rewind_pc(0x%" Px ") sp(0x%" Px ") fp(0x%" Px
+        "    rewind_pc(0x%" Px " offset:0x%" Px ") sp(0x%" Px ") fp(0x%" Px
         ")\n"
         "===============================\n",
-        rewind_pc, frame->sp(), frame->fp());
+        rewind_pc, rewind_pc - code.PayloadStart(), frame->sp(), frame->fp());
   }
   Exceptions::JumpToFrame(Thread::Current(), rewind_pc, frame->sp(),
                           frame->fp(), true /* clear lazy deopt at target */);
@@ -4107,6 +4241,36 @@
   UNREACHABLE();
 }
 
+void Debugger::RewindToInterpretedFrame(StackFrame* frame,
+                                        const Bytecode& bytecode) {
+  // We will be jumping out of the debugger rather than exiting this
+  // function, so prepare the debugger state.
+  ClearCachedStackTraces();
+  resume_action_ = kContinue;
+  resume_frame_index_ = -1;
+  EnterSingleStepMode();
+
+  uword rewind_pc = LookupRewindPc(bytecode, frame->pc());
+  if (FLAG_trace_rewind && rewind_pc == 0) {
+    OS::PrintErr("Unable to find rewind pc for bytecode pc(%" Px ")\n",
+                 frame->pc());
+  }
+  ASSERT(rewind_pc != 0);
+  if (FLAG_trace_rewind) {
+    OS::PrintErr(
+        "===============================\n"
+        "Rewinding to interpreted frame:\n"
+        "    rewind_pc(0x%" Px " offset:0x%" Px ") sp(0x%" Px ") fp(0x%" Px
+        ")\n"
+        "===============================\n",
+        rewind_pc, rewind_pc - bytecode.PayloadStart(), frame->sp(),
+        frame->fp());
+  }
+  Exceptions::JumpToFrame(Thread::Current(), rewind_pc, frame->sp(),
+                          frame->fp(), true /* clear lazy deopt at target */);
+  UNREACHABLE();
+}
+
 void Debugger::RewindPostDeopt() {
   intptr_t rewind_frame = post_deopt_frame_index_;
   post_deopt_frame_index_ = -1;
@@ -4214,7 +4378,9 @@
     Smi& value = Smi::Handle(zone);
     for (int i = 0; i < yields.Length(); i++) {
       value ^= yields.At(i);
-      if (value.Value() == looking_for) return true;
+      if (value.Value() == looking_for) {
+        return true;
+      }
     }
   }
   return false;
@@ -4245,10 +4411,11 @@
       // an awaiter. The first check handles the case of calling into the
       // async machinery as we finish the async function. The second check
       // handles the case of returning from an async function.
+      const ActivationFrame::Relation relation =
+          frame->CompareTo(async_stepping_fp_, interpreted_async_stepping_);
       const bool exited_async_function =
-          (IsCalleeFrameOf(async_stepping_fp_, frame->fp()) &&
-           frame->IsAsyncMachinery()) ||
-          IsCalleeFrameOf(frame->fp(), async_stepping_fp_);
+          (relation == ActivationFrame::kCallee && frame->IsAsyncMachinery()) ||
+          relation == ActivationFrame::kCaller;
       if (exited_async_function) {
         // Step to the top frame awaiter.
         const Object& async_op = Object::Handle(top_frame_awaiter_);
@@ -4262,11 +4429,13 @@
   if (stepping_fp_ != 0) {
     // There is an "interesting frame" set. Only pause at appropriate
     // locations in this frame.
-    if (IsCalleeFrameOf(stepping_fp_, frame->fp())) {
+    const ActivationFrame::Relation relation =
+        frame->CompareTo(stepping_fp_, interpreted_stepping_);
+    if (relation == ActivationFrame::kCallee) {
       // We are in a callee of the frame we're interested in.
       // Ignore this stepping break.
       return Error::null();
-    } else if (IsCalleeFrameOf(frame->fp(), stepping_fp_)) {
+    } else if (relation == ActivationFrame::kCaller) {
       // We returned from the "interesting frame", there can be no more
       // stepping breaks for it. Pause at the next appropriate location
       // and let the user set the "interesting" frame again.
@@ -4281,17 +4450,43 @@
     return Error::null();
   }
 
+  if (frame->fp() == last_stepping_fp_ &&
+      frame->TokenPos() == last_stepping_pos_) {
+    // Do not stop multiple times for the same token position.
+    // Several 'debug checked' opcodes may be issued in the same token range.
+    return Error::null();
+  }
+
+  // In bytecode, do not stop before encountering the DebugCheck opcode.
+  // Skip this check if we previously stopped in this frame.
+  // If no DebugCheck was emitted, do not stop (InPrologue returns true).
+  if (frame->IsInterpreted() && frame->fp() != last_stepping_fp_) {
+    uword debug_check_pc = frame->bytecode().GetFirstDebugCheckOpcodePc();
+    // Frame pc is return address, debug_check_pc is exact, so use '<=' in test.
+    if (debug_check_pc == 0 || frame->pc() <= debug_check_pc) {
+      return Error::null();
+    }
+  }
+
+  // We are stopping in this frame at the token pos.
+  last_stepping_fp_ = frame->fp();
+  last_stepping_pos_ = frame->TokenPos();
+
   // If there is an active breakpoint at this pc, then we should have
   // already bailed out of this function in the skip_next_step_ test
   // above.
   ASSERT(!HasActiveBreakpoint(frame->pc()));
 
   if (FLAG_verbose_debug) {
-    OS::PrintErr(">>> single step break at %s:%" Pd " (func %s token %s)\n",
-                 String::Handle(frame->SourceUrl()).ToCString(),
-                 frame->LineNumber(),
-                 String::Handle(frame->QualifiedFunctionName()).ToCString(),
-                 frame->TokenPos().ToCString());
+    OS::PrintErr(
+        ">>> single step break at %s:%" Pd ":%" Pd
+        " (func %s token %s address %#" Px " offset %#" Px ")\n",
+        String::Handle(frame->SourceUrl()).ToCString(), frame->LineNumber(),
+        frame->ColumnNumber(),
+        String::Handle(frame->QualifiedFunctionName()).ToCString(),
+        frame->TokenPos().ToCString(), frame->pc(),
+        frame->pc() - (frame->IsInterpreted() ? frame->bytecode().PayloadStart()
+                                              : frame->code().PayloadStart()));
   }
 
   CacheStackTraces(CollectStackTrace(), CollectAsyncCausalStackTrace(),
@@ -4334,12 +4529,15 @@
 
     // Hit a synthetic async breakpoint.
     if (FLAG_verbose_debug) {
-      OS::PrintErr(">>> hit synthetic breakpoint at %s:%" Pd
-                   " "
-                   "(token %s) (address %#" Px ")\n",
-                   String::Handle(cbpt->SourceUrl()).ToCString(),
-                   cbpt->LineNumber(), cbpt->token_pos().ToCString(),
-                   top_frame->pc());
+      OS::PrintErr(
+          ">>> hit synthetic breakpoint at %s:%" Pd
+          " (func %s token %s address %#" Px " offset %#" Px ")\n",
+          String::Handle(cbpt->SourceUrl()).ToCString(), cbpt->LineNumber(),
+          String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
+          cbpt->token_pos().ToCString(), top_frame->pc(),
+          top_frame->pc() - (top_frame->IsInterpreted()
+                                 ? top_frame->bytecode().PayloadStart()
+                                 : top_frame->code().PayloadStart()));
     }
 
     ASSERT(synthetic_async_breakpoint_ == NULL);
@@ -4358,11 +4556,14 @@
 
   if (FLAG_verbose_debug) {
     OS::PrintErr(">>> hit breakpoint %" Pd " at %s:%" Pd
-                 " (token %s) "
-                 "(address %#" Px ")\n",
+                 " (func %s token %s address %#" Px " offset %#" Px ")\n",
                  bpt_hit->id(), String::Handle(cbpt->SourceUrl()).ToCString(),
-                 cbpt->LineNumber(), cbpt->token_pos().ToCString(),
-                 top_frame->pc());
+                 cbpt->LineNumber(),
+                 String::Handle(top_frame->QualifiedFunctionName()).ToCString(),
+                 cbpt->token_pos().ToCString(), top_frame->pc(),
+                 top_frame->pc() - (top_frame->IsInterpreted()
+                                        ? top_frame->bytecode().PayloadStart()
+                                        : top_frame->code().PayloadStart()));
   }
 
   CacheStackTraces(stack_trace, CollectAsyncCausalStackTrace(),
@@ -4926,8 +5127,7 @@
 
 void Debugger::Continue() {
   SetResumeAction(kContinue);
-  stepping_fp_ = 0;
-  async_stepping_fp_ = 0;
+  ResetSteppingFramePointers();
   NotifySingleStepping(false);
 }
 
diff --git a/runtime/vm/debugger.h b/runtime/vm/debugger.h
index 09e6c83..cff3791 100644
--- a/runtime/vm/debugger.h
+++ b/runtime/vm/debugger.h
@@ -297,7 +297,6 @@
   uword fp() const { return fp_; }
   uword sp() const { return sp_; }
   const Function& function() const {
-    ASSERT(!function_.IsNull());
     return function_;
   }
   const Code& code() const {
@@ -310,6 +309,14 @@
   }
   bool IsInterpreted() const { return !bytecode_.IsNull(); }
 
+  enum Relation {
+    kCallee,
+    kSelf,
+    kCaller,
+  };
+
+  Relation CompareTo(uword other_fp, bool other_is_interpreted) const;
+
   RawString* QualifiedFunctionName();
   RawString* SourceUrl();
   RawScript* SourceScript();
@@ -780,6 +787,7 @@
   void RewindToOptimizedFrame(StackFrame* frame,
                               const Code& code,
                               intptr_t post_deopt_frame_index);
+  void RewindToInterpretedFrame(StackFrame* frame, const Bytecode& bytecode);
 
   void ResetSteppingFramePointers();
   bool SteppedForSyntheticAsyncBreakpoint() const;
@@ -822,8 +830,16 @@
   // frame corresponds to this fp value, or if the top frame is
   // lower on the stack.
   uword stepping_fp_;
+  bool interpreted_stepping_;
+
+  // When stepping through code, do not stop more than once in the same
+  // token position range.
+  uword last_stepping_fp_;
+  TokenPosition last_stepping_pos_;
+
   // Used to track the current async/async* function.
   uword async_stepping_fp_;
+  bool interpreted_async_stepping_;
   RawObject* top_frame_awaiter_;
 
   // If we step while at a breakpoint, we would hit the same pc twice.
diff --git a/runtime/vm/debugger_api_impl_test.cc b/runtime/vm/debugger_api_impl_test.cc
index e9a303f..ddcbb7c 100644
--- a/runtime/vm/debugger_api_impl_test.cc
+++ b/runtime/vm/debugger_api_impl_test.cc
@@ -185,7 +185,7 @@
             /* type_defintions= */ Array::empty_array(),
             String::Handle(lib.url()).ToCString(),
             /* klass= */ nullptr,
-            /* is_static= */ false);
+            /* is_static= */ true);
     if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
       return Api::NewError("Failed to compile expression.");
     }
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index b28c397..4ea755a 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -1046,7 +1046,7 @@
 
 DeoptInfoBuilder::DeoptInfoBuilder(Zone* zone,
                                    const intptr_t num_args,
-                                   Assembler* assembler)
+                                   compiler::Assembler* assembler)
     : zone_(zone),
       instructions_(),
       num_args_(num_args),
diff --git a/runtime/vm/deopt_instructions.h b/runtime/vm/deopt_instructions.h
index 3e5d46c..b440413 100644
--- a/runtime/vm/deopt_instructions.h
+++ b/runtime/vm/deopt_instructions.h
@@ -482,7 +482,9 @@
 // the heap and reset the builder's internal state for the next DeoptInfo.
 class DeoptInfoBuilder : public ValueObject {
  public:
-  DeoptInfoBuilder(Zone* zone, const intptr_t num_args, Assembler* assembler);
+  DeoptInfoBuilder(Zone* zone,
+                   const intptr_t num_args,
+                   compiler::Assembler* assembler);
 
   // Return address before instruction.
   void AddReturnAddress(const Function& function,
@@ -549,7 +551,7 @@
 
   GrowableArray<DeoptInstr*> instructions_;
   const intptr_t num_args_;
-  Assembler* assembler_;
+  compiler::Assembler* assembler_;
 
   // Used to compress entries by sharing suffixes.
   TrieNode* trie_root_;
diff --git a/runtime/vm/double_conversion.cc b/runtime/vm/double_conversion.cc
index 1cd6459..b3784ab 100644
--- a/runtime/vm/double_conversion.cc
+++ b/runtime/vm/double_conversion.cc
@@ -12,9 +12,9 @@
 
 namespace dart {
 
-static const char kDoubleToStringCommonExponentChar = 'e';
-static const char* kDoubleToStringCommonInfinitySymbol = "Infinity";
-static const char* kDoubleToStringCommonNaNSymbol = "NaN";
+char const DoubleToStringConstants::kExponentChar = 'e';
+const char* const DoubleToStringConstants::kInfinitySymbol = "Infinity";
+const char* const DoubleToStringConstants::kNaNSymbol = "NaN";
 
 void DoubleToCString(double d, char* buffer, int buffer_size) {
   static const int kDecimalLow = -6;
@@ -38,9 +38,9 @@
           EMIT_TRAILING_ZERO_AFTER_POINT;
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar,
-      kDecimalLow, kDecimalHigh, 0,
+      kConversionFlags, DoubleToStringConstants::kInfinitySymbol,
+      DoubleToStringConstants::kNaNSymbol,
+      DoubleToStringConstants::kExponentChar, kDecimalLow, kDecimalHigh, 0,
       0);  // Last two values are ignored in shortest mode.
 
   double_conversion::StringBuilder builder(buffer, buffer_size);
@@ -78,9 +78,10 @@
          fraction_digits <= kMaxFractionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0, 0,
-      0, 0);  // Last four values are ignored in fixed mode.
+      kConversionFlags, DoubleToStringConstants::kInfinitySymbol,
+      DoubleToStringConstants::kNaNSymbol,
+      DoubleToStringConstants::kExponentChar, 0, 0, 0,
+      0);  // Last four values are ignored in fixed mode.
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
   buffer[kBufferSize - 1] = '\0';
@@ -108,9 +109,10 @@
          fraction_digits <= kMaxFractionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0, 0,
-      0, 0);  // Last four values are ignored in exponential mode.
+      kConversionFlags, DoubleToStringConstants::kInfinitySymbol,
+      DoubleToStringConstants::kNaNSymbol,
+      DoubleToStringConstants::kExponentChar, 0, 0, 0,
+      0);  // Last four values are ignored in exponential mode.
 
   char* buffer = Thread::Current()->zone()->Alloc<char>(kBufferSize);
   buffer[kBufferSize - 1] = '\0';
@@ -143,8 +145,9 @@
   ASSERT(kMinPrecisionDigits <= precision && precision <= kMaxPrecisionDigits);
 
   const double_conversion::DoubleToStringConverter converter(
-      kConversionFlags, kDoubleToStringCommonInfinitySymbol,
-      kDoubleToStringCommonNaNSymbol, kDoubleToStringCommonExponentChar, 0,
+      kConversionFlags, DoubleToStringConstants::kInfinitySymbol,
+      DoubleToStringConstants::kNaNSymbol,
+      DoubleToStringConstants::kExponentChar, 0,
       0,  // Ignored in precision mode.
       kMaxLeadingPaddingZeroes, kMaxTrailingPaddingZeroes);
 
@@ -163,7 +166,8 @@
 
   double_conversion::StringToDoubleConverter converter(
       double_conversion::StringToDoubleConverter::NO_FLAGS, 0.0, 0.0,
-      kDoubleToStringCommonInfinitySymbol, kDoubleToStringCommonNaNSymbol);
+      DoubleToStringConstants::kInfinitySymbol,
+      DoubleToStringConstants::kNaNSymbol);
 
   int parsed_count = 0;
   *result =
diff --git a/runtime/vm/double_conversion.h b/runtime/vm/double_conversion.h
index dd6e213..8793649 100644
--- a/runtime/vm/double_conversion.h
+++ b/runtime/vm/double_conversion.h
@@ -5,11 +5,18 @@
 #ifndef RUNTIME_VM_DOUBLE_CONVERSION_H_
 #define RUNTIME_VM_DOUBLE_CONVERSION_H_
 
+#include "vm/allocation.h"
 #include "vm/globals.h"
 #include "vm/object.h"
 
 namespace dart {
 
+struct DoubleToStringConstants : AllStatic {
+  static char const kExponentChar;
+  static const char* const kInfinitySymbol;
+  static const char* const kNaNSymbol;
+};
+
 void DoubleToCString(double d, char* buffer, int buffer_size);
 RawString* DoubleToStringAsFixed(double d, int fraction_digits);
 RawString* DoubleToStringAsExponential(double d, int fraction_digits);
diff --git a/runtime/vm/dwarf.cc b/runtime/vm/dwarf.cc
index 29e5488..2136114 100644
--- a/runtime/vm/dwarf.cc
+++ b/runtime/vm/dwarf.cc
@@ -12,9 +12,9 @@
 
 #ifdef DART_PRECOMPILER
 
-#if defined(ARCH_IS_32_BIT)
+#if defined(TARGET_ARCH_IS_32_BIT)
 #define FORM_ADDR ".4byte"
-#elif defined(ARCH_IS_64_BIT)
+#elif defined(TARGET_ARCH_IS_64_BIT)
 #define FORM_ADDR ".8byte"
 #endif
 
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index aed4c66..d6d63b7 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_ELF_H_
 
 #include "vm/allocation.h"
+#include "vm/compiler/runtime_api.h"
 #include "vm/datastream.h"
 #include "vm/growable_array.h"
 #include "vm/zone.h"
@@ -42,10 +43,10 @@
   void WriteWord(uint32_t value) {
     stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
   }
-  void WriteAddr(uword value) {
+  void WriteAddr(compiler::target::uword value) {
     stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
   }
-  void WriteOff(uword value) {
+  void WriteOff(compiler::target::uword value) {
     stream_->WriteBytes(reinterpret_cast<uint8_t*>(&value), sizeof(value));
   }
 #if defined(TARGET_ARCH_IS_64_BIT)
diff --git a/runtime/vm/heap/heap.cc b/runtime/vm/heap/heap.cc
index 583119e..04b5b84 100644
--- a/runtime/vm/heap/heap.cc
+++ b/runtime/vm/heap/heap.cc
@@ -179,21 +179,23 @@
   if (space == kNew) {
     isolate()->AssertCurrentThreadIsMutator();
     new_space_.AllocateExternal(cid, size);
-    if (new_space_.ExternalInWords() > (4 * new_space_.CapacityInWords())) {
-      // Attempt to free some external allocation by a scavenge. (If the total
-      // remains above the limit, next external alloc will trigger another.)
-      CollectGarbage(kScavenge, kExternal);
-      // Promotion may have pushed old space over its limit.
-      if (old_space_.NeedsGarbageCollection()) {
-        CollectGarbage(kMarkSweep, kExternal);
-      }
+    if (new_space_.ExternalInWords() <= (4 * new_space_.CapacityInWords())) {
+      return;
     }
+    // Attempt to free some external allocation by a scavenge. (If the total
+    // remains above the limit, next external alloc will trigger another.)
+    CollectGarbage(kScavenge, kExternal);
+    // Promotion may have pushed old space over its limit. Fall through for old
+    // space GC check.
   } else {
     ASSERT(space == kOld);
     old_space_.AllocateExternal(cid, size);
-    if (old_space_.NeedsGarbageCollection()) {
-      CollectMostGarbage(kExternal);
-    }
+  }
+
+  if (old_space_.NeedsGarbageCollection()) {
+    CollectGarbage(kMarkSweep, kExternal);
+  } else {
+    CheckStartConcurrentMarking(Thread::Current(), kExternal);
   }
 }
 
@@ -439,6 +441,13 @@
 
 void Heap::EvacuateNewSpace(Thread* thread, GCReason reason) {
   ASSERT((reason != kOldSpace) && (reason != kPromotion));
+  if (thread->isolate() == Dart::vm_isolate()) {
+    // The vm isolate cannot safely collect garbage due to unvisited read-only
+    // handles and slots bootstrapped with RAW_NULL. Ignore GC requests to
+    // trigger a nice out-of-memory message instead of a crash in the middle of
+    // visiting pointers.
+    return;
+  }
   if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
     VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
@@ -454,6 +463,13 @@
 
 void Heap::CollectNewSpaceGarbage(Thread* thread, GCReason reason) {
   ASSERT((reason != kOldSpace) && (reason != kPromotion));
+  if (thread->isolate() == Dart::vm_isolate()) {
+    // The vm isolate cannot safely collect garbage due to unvisited read-only
+    // handles and slots bootstrapped with RAW_NULL. Ignore GC requests to
+    // trigger a nice out-of-memory message instead of a crash in the middle of
+    // visiting pointers.
+    return;
+  }
   if (BeginNewSpaceGC(thread)) {
     RecordBeforeGC(kScavenge, reason);
     {
@@ -484,6 +500,13 @@
   if (FLAG_use_compactor) {
     type = kMarkCompact;
   }
+  if (thread->isolate() == Dart::vm_isolate()) {
+    // The vm isolate cannot safely collect garbage due to unvisited read-only
+    // handles and slots bootstrapped with RAW_NULL. Ignore GC requests to
+    // trigger a nice out-of-memory message instead of a crash in the middle of
+    // visiting pointers.
+    return;
+  }
   if (BeginOldSpaceGC(thread)) {
     RecordBeforeGC(type, reason);
     VMTagScope tagScope(thread, reason == kIdle ? VMTag::kGCIdleTagId
@@ -808,16 +831,9 @@
   return new_weak_tables_[kPeers]->count() + old_weak_tables_[kPeers]->count();
 }
 
-#if !defined(HASH_IN_OBJECT_HEADER)
-int64_t Heap::HashCount() const {
-  return new_weak_tables_[kHashes]->count() +
-         old_weak_tables_[kHashes]->count();
-}
-#endif
-
-int64_t Heap::ObjectIdCount() const {
-  return new_weak_tables_[kObjectIds]->count() +
-         old_weak_tables_[kObjectIds]->count();
+void Heap::ResetCanonicalHashTable() {
+  new_weak_tables_[kCanonicalHashes]->Reset();
+  old_weak_tables_[kCanonicalHashes]->Reset();
 }
 
 void Heap::ResetObjectIdTable() {
@@ -1047,13 +1063,13 @@
 
 NoHeapGrowthControlScope::NoHeapGrowthControlScope()
     : ThreadStackResource(Thread::Current()) {
-  Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
+  Heap* heap = isolate()->heap();
   current_growth_controller_state_ = heap->GrowthControlState();
   heap->DisableGrowthControl();
 }
 
 NoHeapGrowthControlScope::~NoHeapGrowthControlScope() {
-  Heap* heap = reinterpret_cast<Isolate*>(isolate())->heap();
+  Heap* heap = isolate()->heap();
   heap->SetGrowthControlState(current_growth_controller_state_);
 }
 
diff --git a/runtime/vm/heap/heap.h b/runtime/vm/heap/heap.h
index aa1e336..edfc176 100644
--- a/runtime/vm/heap/heap.h
+++ b/runtime/vm/heap/heap.h
@@ -40,8 +40,9 @@
   enum WeakSelector {
     kPeers = 0,
 #if !defined(HASH_IN_OBJECT_HEADER)
-    kHashes,
+    kIdentityHashes,
 #endif
+    kCanonicalHashes,
     kObjectIds,
     kNumWeakSelectors
   };
@@ -208,13 +209,20 @@
   // Associate an identity hashCode with an object. An non-existent hashCode
   // is equal to 0.
   void SetHash(RawObject* raw_obj, intptr_t hash) {
-    SetWeakEntry(raw_obj, kHashes, hash);
+    SetWeakEntry(raw_obj, kIdentityHashes, hash);
   }
   intptr_t GetHash(RawObject* raw_obj) const {
-    return GetWeakEntry(raw_obj, kHashes);
+    return GetWeakEntry(raw_obj, kIdentityHashes);
   }
 #endif
-  int64_t HashCount() const;
+
+  void SetCanonicalHash(RawObject* raw_obj, intptr_t hash) {
+    SetWeakEntry(raw_obj, kCanonicalHashes, hash);
+  }
+  intptr_t GetCanonicalHash(RawObject* raw_obj) const {
+    return GetWeakEntry(raw_obj, kCanonicalHashes);
+  }
+  void ResetCanonicalHashTable();
 
   // Associate an id with an object (used when serializing an object).
   // A non-existant id is equal to 0.
@@ -226,7 +234,6 @@
     ASSERT(Thread::Current()->IsMutatorThread());
     return GetWeakEntry(raw_obj, kObjectIds);
   }
-  int64_t ObjectIdCount() const;
   void ResetObjectIdTable();
 
   // Used by the GC algorithms to propagate weak entries.
diff --git a/runtime/vm/heap/pages.cc b/runtime/vm/heap/pages.cc
index 23c83dd..7ec1f0c 100644
--- a/runtime/vm/heap/pages.cc
+++ b/runtime/vm/heap/pages.cc
@@ -346,15 +346,19 @@
   Heap::RegionName(heap_, is_exec ? Heap::kCode : Heap::kOld, vm_name,
                    kVmNameSize);
   HeapPage* page = HeapPage::Allocate(page_size_in_words, type, vm_name);
-  if (page == NULL) {
-    IncreaseCapacityInWords(-page_size_in_words);
-    return NULL;
+  {
+    MutexLocker ml(&pages_lock_);
+    if (page == nullptr) {
+      IncreaseCapacityInWordsLocked(-page_size_in_words);
+      return nullptr;
+    }
+    page->set_next(large_pages_);
+    large_pages_ = page;
+
+    // Only one object in this page (at least until String::MakeExternal or
+    // Array::MakeFixedLength is called).
+    page->set_object_end(page->object_start() + size);
   }
-  page->set_next(large_pages_);
-  large_pages_ = page;
-  // Only one object in this page (at least until String::MakeExternal or
-  // Array::MakeFixedLength is called).
-  page->set_object_end(page->object_start() + size);
   return page;
 }
 
diff --git a/runtime/vm/heap/safepoint.cc b/runtime/vm/heap/safepoint.cc
index d3e3771..0c25411 100644
--- a/runtime/vm/heap/safepoint.cc
+++ b/runtime/vm/heap/safepoint.cc
@@ -4,6 +4,7 @@
 
 #include "vm/heap/safepoint.h"
 
+#include "vm/heap/heap.h"
 #include "vm/thread.h"
 #include "vm/thread_registry.h"
 
@@ -17,7 +18,7 @@
   Isolate* I = T->isolate();
   ASSERT(I != NULL);
 
-  SafepointHandler* handler = I->safepoint_handler();
+  SafepointHandler* handler = I->group()->safepoint_handler();
   ASSERT(handler != NULL);
 
   // Signal all threads to get to a safepoint and wait for them to
@@ -37,8 +38,52 @@
   handler->ResumeThreads(T);
 }
 
-SafepointHandler::SafepointHandler(Isolate* isolate)
-    : isolate_(isolate),
+ForceGrowthSafepointOperationScope::ForceGrowthSafepointOperationScope(
+    Thread* T)
+    : ThreadStackResource(T) {
+  ASSERT(T != NULL);
+  Isolate* I = T->isolate();
+  ASSERT(I != NULL);
+
+  Heap* heap = I->heap();
+  current_growth_controller_state_ = heap->GrowthControlState();
+  heap->DisableGrowthControl();
+
+  SafepointHandler* handler = I->group()->safepoint_handler();
+  ASSERT(handler != NULL);
+
+  // Signal all threads to get to a safepoint and wait for them to
+  // get to a safepoint.
+  handler->SafepointThreads(T);
+}
+
+ForceGrowthSafepointOperationScope::~ForceGrowthSafepointOperationScope() {
+  Thread* T = thread();
+  ASSERT(T != NULL);
+  Isolate* I = T->isolate();
+  ASSERT(I != NULL);
+
+  // Resume all threads which are blocked for the safepoint operation.
+  SafepointHandler* handler = I->safepoint_handler();
+  ASSERT(handler != NULL);
+  handler->ResumeThreads(T);
+
+  Heap* heap = I->heap();
+  heap->SetGrowthControlState(current_growth_controller_state_);
+
+  if (current_growth_controller_state_) {
+    ASSERT(T->CanCollectGarbage());
+    // Check if we passed the growth limit during the scope.
+    if (heap->old_space()->NeedsGarbageCollection()) {
+      heap->CollectGarbage(Heap::kMarkSweep, Heap::kOldSpace);
+    } else {
+      heap->CheckStartConcurrentMarking(T, Heap::kOldSpace);
+    }
+  }
+}
+
+SafepointHandler::SafepointHandler(IsolateGroup* isolate_group)
+    : isolate_group_(isolate_group),
       safepoint_lock_(),
       number_threads_not_at_safepoint_(0),
       safepoint_operation_count_(0),
@@ -47,7 +92,7 @@
 SafepointHandler::~SafepointHandler() {
   ASSERT(owner_ == NULL);
   ASSERT(safepoint_operation_count_ == 0);
-  isolate_ = NULL;
+  isolate_group_ = NULL;
 }
 
 void SafepointHandler::SafepointThreads(Thread* T) {
@@ -79,7 +124,7 @@
 
     // Go over the active thread list and ensure that all threads active
     // in the isolate reach a safepoint.
-    Thread* current = isolate()->thread_registry()->active_list();
+    Thread* current = isolate_group()->thread_registry()->active_list();
     while (current != NULL) {
       MonitorLocker tl(current->thread_lock());
       if (!current->BypassSafepoints()) {
@@ -113,7 +158,8 @@
         if (FLAG_trace_safepoint && num_attempts > 10) {
           // We have been waiting too long, start logging this as we might
           // have an issue where a thread is not checking in for a safepoint.
-          for (Thread* current = isolate()->thread_registry()->active_list();
+          for (Thread* current =
+                   isolate_group()->thread_registry()->active_list();
                current != NULL; current = current->next()) {
             if (!current->IsAtSafepoint()) {
               OS::PrintErr("Attempt:%" Pd
@@ -139,7 +185,7 @@
     decrement_safepoint_operation_count();
     return;
   }
-  Thread* current = isolate()->thread_registry()->active_list();
+  Thread* current = isolate_group()->thread_registry()->active_list();
   while (current != NULL) {
     MonitorLocker tl(current->thread_lock());
     if (!current->BypassSafepoints()) {
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index 4f3cfb8..4e677e7 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -24,10 +24,25 @@
   DISALLOW_COPY_AND_ASSIGN(SafepointOperationScope);
 };
 
-// Implements handling of safepoint operations for all threads in an Isolate.
+// A stack based scope that can be used to perform an operation after getting
+// all threads to a safepoint. At the end of the operation all the threads are
+// resumed. Allocations in the scope will force heap growth.
+class ForceGrowthSafepointOperationScope : public ThreadStackResource {
+ public:
+  explicit ForceGrowthSafepointOperationScope(Thread* T);
+  ~ForceGrowthSafepointOperationScope();
+
+ private:
+  bool current_growth_controller_state_;
+
+  DISALLOW_COPY_AND_ASSIGN(ForceGrowthSafepointOperationScope);
+};
+
+// Implements handling of safepoint operations for all threads in an
+// IsolateGroup.
 class SafepointHandler {
  public:
-  explicit SafepointHandler(Isolate* I);
+  explicit SafepointHandler(IsolateGroup* I);
   ~SafepointHandler();
 
   void EnterSafepointUsingLock(Thread* T);
@@ -39,8 +54,8 @@
   void SafepointThreads(Thread* T);
   void ResumeThreads(Thread* T);
 
-  Isolate* isolate() const { return isolate_; }
-  Monitor* threads_lock() const { return isolate_->threads_lock(); }
+  IsolateGroup* isolate_group() const { return isolate_group_; }
+  Monitor* threads_lock() const { return isolate_group_->threads_lock(); }
   bool SafepointInProgress() const {
     ASSERT(threads_lock()->IsOwnedByCurrentThread());
     return ((safepoint_operation_count_ > 0) && (owner_ != NULL));
@@ -74,7 +89,7 @@
     safepoint_operation_count_ -= 1;
   }
 
-  Isolate* isolate_;
+  IsolateGroup* isolate_group_;
 
   // Monitor used by thread initiating a safepoint operation to track threads
   // not at a safepoint and wait for these threads to reach a safepoint.
@@ -91,7 +106,9 @@
   Thread* owner_;
 
   friend class Isolate;
+  friend class IsolateGroup;
   friend class SafepointOperationScope;
+  friend class ForceGrowthSafepointOperationScope;
   friend class HeapIterationScope;
 };
 
diff --git a/runtime/vm/heap/scavenger.cc b/runtime/vm/heap/scavenger.cc
index fca7761..966b581 100644
--- a/runtime/vm/heap/scavenger.cc
+++ b/runtime/vm/heap/scavenger.cc
@@ -909,8 +909,14 @@
   MonitorLocker ml(isolate->threads_lock(), false);
   Thread* current = heap_->isolate()->thread_registry()->active_list();
   while (current != NULL) {
-    if (current->HasActiveTLAB()) {
-      heap_->MakeTLABIterable(current);
+    // NOTE: During the transition period all isolates within an isolate group
+    // share the thread registry, but have their own heap.
+    // So we explicitly filter those threads which belong to the isolate of
+    // interest (once we have a shared heap this needs to change).
+    if (current->isolate() == isolate) {
+      if (current->HasActiveTLAB()) {
+        heap_->MakeTLABIterable(current);
+      }
     }
     current = current->next();
   }
@@ -925,7 +931,13 @@
   MonitorLocker ml(isolate->threads_lock(), false);
   Thread* current = isolate->thread_registry()->active_list();
   while (current != NULL) {
-    heap_->AbandonRemainingTLAB(current);
+    // NOTE: During the transition period all isolates within an isolate group
+    // share the thread registry, but have their own heap.
+    // So we explicitly filter those threads which belong to the isolate of
+    // interest (once we have a shared heap this needs to change).
+    if (current->isolate() == isolate) {
+      heap_->AbandonRemainingTLAB(current);
+    }
     current = current->next();
   }
   Thread* mutator_thread = isolate->mutator_thread();
diff --git a/runtime/vm/heap/sweeper.cc b/runtime/vm/heap/sweeper.cc
index 1d267ac..81d4f0b 100644
--- a/runtime/vm/heap/sweeper.cc
+++ b/runtime/vm/heap/sweeper.cc
@@ -53,7 +53,7 @@
         uword end = current + obj_size;
         while (cursor < end) {
           *reinterpret_cast<uword*>(cursor) =
-              Assembler::GetBreakInstructionFiller();
+              compiler::Assembler::GetBreakInstructionFiller();
           cursor += kWordSize;
         }
       } else {
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index f216ef0..84c0316 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -570,7 +570,7 @@
   // look like a HeapPage.
   intptr_t instructions_length = next_text_offset_;
   WriteWordLiteralText(instructions_length);
-  intptr_t header_words = Image::kHeaderSize / sizeof(uword);
+  intptr_t header_words = Image::kHeaderSize / sizeof(compiler::target::uword);
   for (intptr_t i = 1; i < header_words; i++) {
     WriteWordLiteralText(0);
   }
@@ -629,9 +629,6 @@
     {
       NoSafepointScope no_safepoint;
 
-      uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
-      uword entry = beginning + Instructions::HeaderSize();
-
       // Write Instructions with the mark and read-only bits set.
       uword marked_tags = insns.raw_ptr()->tags_;
       marked_tags = RawObject::OldBit::update(true, marked_tags);
@@ -645,10 +642,25 @@
       marked_tags |= static_cast<uword>(insns.raw_ptr()->hash_) << 32;
 #endif
 
+#if defined(IS_SIMARM_X64)
+      const intptr_t size_in_bytes = InstructionsSizeInSnapshot(insns.Size());
+      marked_tags = RawObject::SizeTag::update(size_in_bytes * 2, marked_tags);
+      WriteWordLiteralText(marked_tags);
+      text_offset += sizeof(compiler::target::uword);
+      WriteWordLiteralText(insns.raw_ptr()->size_and_flags_);
+      text_offset += sizeof(compiler::target::uword);
+      WriteWordLiteralText(insns.raw_ptr()->unchecked_entrypoint_pc_offset_);
+      text_offset += sizeof(compiler::target::uword);
+      WriteWordLiteralText(0);
+      text_offset += sizeof(compiler::target::uword);
+#else   // defined(IS_SIMARM_X64)
+      uword beginning = reinterpret_cast<uword>(insns.raw_ptr());
+      uword entry = beginning + Instructions::HeaderSize();
       WriteWordLiteralText(marked_tags);
       beginning += sizeof(uword);
       text_offset += sizeof(uword);
       text_offset += WriteByteSequence(beginning, entry);
+#endif  // defined(IS_SIMARM_X64)
 
       ASSERT((text_offset - instr_start) == insns.HeaderSize());
     }
@@ -811,8 +823,8 @@
 }
 
 intptr_t AssemblyImageWriter::WriteByteSequence(uword start, uword end) {
-  for (uword* cursor = reinterpret_cast<uword*>(start);
-       cursor < reinterpret_cast<uword*>(end); cursor++) {
+  for (auto* cursor = reinterpret_cast<compiler::target::uword*>(start);
+       cursor < reinterpret_cast<compiler::target::uword*>(end); cursor++) {
     WriteWordLiteralText(*cursor);
   }
   return end - start;
@@ -841,11 +853,10 @@
 }
 
 intptr_t BlobImageWriter::WriteByteSequence(uword start, uword end) {
-  for (uword* cursor = reinterpret_cast<uword*>(start);
-       cursor < reinterpret_cast<uword*>(end); cursor++) {
-    instructions_blob_stream_.WriteWord(*cursor);
-  }
-  return end - start;
+  const uword size = end - start;
+  instructions_blob_stream_.WriteBytes(reinterpret_cast<const void*>(start),
+                                       size);
+  return size;
 }
 
 void BlobImageWriter::WriteText(WriteStream* clustered_stream, bool vm) {
diff --git a/runtime/vm/image_snapshot.h b/runtime/vm/image_snapshot.h
index f59d946..5acb75d 100644
--- a/runtime/vm/image_snapshot.h
+++ b/runtime/vm/image_snapshot.h
@@ -10,6 +10,7 @@
 
 #include "platform/assert.h"
 #include "vm/allocation.h"
+#include "vm/compiler/runtime_api.h"
 #include "vm/datastream.h"
 #include "vm/globals.h"
 #include "vm/growable_array.h"
@@ -313,9 +314,9 @@
   void FrameUnwindPrologue();
   void FrameUnwindEpilogue();
   intptr_t WriteByteSequence(uword start, uword end);
-  void WriteWordLiteralText(uword value) {
+  void WriteWordLiteralText(compiler::target::uword value) {
 // Padding is helpful for comparing the .S with --disassemble.
-#if defined(ARCH_IS_64_BIT)
+#if defined(TARGET_ARCH_IS_64_BIT)
     assembly_stream_.Print(".quad 0x%0.16" Px "\n", value);
 #else
     assembly_stream_.Print(".long 0x%0.8" Px "\n", value);
diff --git a/runtime/vm/instructions_arm.h b/runtime/vm/instructions_arm.h
index bbd0d6c..65bfdb3 100644
--- a/runtime/vm/instructions_arm.h
+++ b/runtime/vm/instructions_arm.h
@@ -200,7 +200,8 @@
 
   int32_t distance() {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    return Assembler::DecodeBranchOffset(*reinterpret_cast<int32_t*>(pc_));
+    return compiler::Assembler::DecodeBranchOffset(
+        *reinterpret_cast<int32_t*>(pc_));
 #else
     UNREACHABLE();
     return 0;
@@ -210,7 +211,7 @@
   void set_distance(int32_t distance) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     int32_t* word = reinterpret_cast<int32_t*>(pc_);
-    *word = Assembler::EncodeBranchOffset(distance, *word);
+    *word = compiler::Assembler::EncodeBranchOffset(distance, *word);
 #else
     UNREACHABLE();
 #endif
diff --git a/runtime/vm/instructions_arm64.h b/runtime/vm/instructions_arm64.h
index 6b8b4aa..dfbf7d3 100644
--- a/runtime/vm/instructions_arm64.h
+++ b/runtime/vm/instructions_arm64.h
@@ -210,7 +210,8 @@
 
   int32_t distance() {
 #if !defined(DART_PRECOMPILED_RUNTIME)
-    return Assembler::DecodeImm26BranchOffset(*reinterpret_cast<int32_t*>(pc_));
+    return compiler::Assembler::DecodeImm26BranchOffset(
+        *reinterpret_cast<int32_t*>(pc_));
 #else
     UNREACHABLE();
     return 0;
@@ -220,7 +221,7 @@
   void set_distance(int32_t distance) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
     int32_t* word = reinterpret_cast<int32_t*>(pc_);
-    *word = Assembler::EncodeImm26BranchOffset(distance, *word);
+    *word = compiler::Assembler::EncodeImm26BranchOffset(distance, *word);
 #else
     UNREACHABLE();
 #endif
diff --git a/runtime/vm/instructions_ia32_test.cc b/runtime/vm/instructions_ia32_test.cc
index 9fcdb39..e5a9b09 100644
--- a/runtime/vm/instructions_ia32_test.cc
+++ b/runtime/vm/instructions_ia32_test.cc
@@ -17,7 +17,7 @@
 #define __ assembler->
 
 ASSEMBLER_TEST_GENERATE(Call, assembler) {
-  ExternalLabel label(StubCode::InvokeDartCode().EntryPoint());
+  compiler::ExternalLabel label(StubCode::InvokeDartCode().EntryPoint());
   __ call(&label);
   __ ret();
 }
diff --git a/runtime/vm/interpreter.cc b/runtime/vm/interpreter.cc
index b466015..aafaf7d 100644
--- a/runtime/vm/interpreter.cc
+++ b/runtime/vm/interpreter.cc
@@ -5,6 +5,7 @@
 #include <setjmp.h>  // NOLINT
 #include <stdlib.h>
 
+#include "vm/compiler/ffi.h"
 #include "vm/globals.h"
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
@@ -1132,11 +1133,11 @@
     if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&                    \
                  counter >= FLAG_compilation_counter_threshold &&              \
                  !Function::HasCode(function))) {                              \
-      SP[1] = 0; /* Unused code result. */                                     \
+      SP[1] = 0; /* Unused result. */                                          \
       SP[2] = function;                                                        \
       Exit(thread, FP, SP + 3, pc);                                            \
       NativeArguments native_args(thread, 1, SP + 2, SP + 1);                  \
-      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, native_args);                \
+      INVOKE_RUNTIME(DRT_CompileInterpretedFunction, native_args);             \
       function = FrameFunction(FP);                                            \
     }                                                                          \
   }
@@ -1144,6 +1145,8 @@
 #ifdef PRODUCT
 #define DEBUG_CHECK
 #else
+// The DEBUG_CHECK macro must only be called from bytecodes listed in
+// KernelBytecode::IsDebugCheckedOpcode.
 #define DEBUG_CHECK                                                            \
   if (is_debugging()) {                                                        \
     /* Check for debug breakpoint or if single stepping. */                    \
@@ -1152,7 +1155,9 @@
       Exit(thread, FP, SP + 2, pc);                                            \
       NativeArguments args(thread, 0, NULL, SP + 1);                           \
       INVOKE_RUNTIME(DRT_BreakpointRuntimeHandler, args)                       \
-    } else if (thread->isolate()->single_step()) {                             \
+    }                                                                          \
+    /* The debugger expects to see the same pc again when single-stepping */   \
+    if (thread->isolate()->single_step()) {                                    \
       Exit(thread, FP, SP + 1, pc);                                            \
       NativeArguments args(thread, 0, NULL, NULL);                             \
       INVOKE_RUNTIME(DRT_SingleStepHandler, args);                             \
@@ -1382,7 +1387,7 @@
   } else {
     SP[0] = 0;  // Space for the result.
     SP[1] = thread->isolate()->object_store()->mint_class();  // Class object.
-    SP[2] = Object::null();                                  // Type arguments.
+    SP[2] = Object::null();                                   // Type arguments.
     Exit(thread, FP, SP + 3, pc);
     NativeArguments args(thread, 2, SP + 1, SP);
     if (!InvokeRuntime(thread, this, DRT_AllocateObject, args)) {
@@ -1570,8 +1575,8 @@
                              Thread* thread) {
   // Interpreter state (see constants_kbc.h for high-level overview).
   const KBCInstr* pc;  // Program Counter: points to the next op to execute.
-  RawObject** FP;  // Frame Pointer.
-  RawObject** SP;  // Stack Pointer.
+  RawObject** FP;      // Frame Pointer.
+  RawObject** SP;      // Stack Pointer.
 
   uint32_t op;  // Currently executing op.
 
@@ -1746,7 +1751,6 @@
 
   {
     BYTECODE(CheckStack, A);
-    DEBUG_CHECK;
     {
       // Check the interpreter's own stack limit for actual interpreter's stack
       // overflows, and also the thread's stack limit for scheduled interrupts.
@@ -1762,16 +1766,22 @@
     if (UNLIKELY(FLAG_compilation_counter_threshold >= 0 &&
                  counter >= FLAG_compilation_counter_threshold &&
                  !Function::HasCode(function))) {
-      SP[1] = 0;  // Unused code result.
+      SP[1] = 0;  // Unused result.
       SP[2] = function;
       Exit(thread, FP, SP + 3, pc);
       NativeArguments native_args(thread, 1, SP + 2, SP + 1);
-      INVOKE_RUNTIME(DRT_OptimizeInvokedFunction, native_args);
+      INVOKE_RUNTIME(DRT_CompileInterpretedFunction, native_args);
     }
     DISPATCH();
   }
 
   {
+    BYTECODE(DebugCheck, 0);
+    DEBUG_CHECK;
+    DISPATCH();
+  }
+
+  {
     BYTECODE(CheckFunctionTypeArgs, A_E);
     const intptr_t declared_type_args_len = rA;
     const intptr_t first_stack_local_index = rE;
@@ -1917,14 +1927,12 @@
 
   {
     BYTECODE(StoreLocal, X);
-    DEBUG_CHECK;
     FP[rX] = *SP;
     DISPATCH();
   }
 
   {
     BYTECODE(PopLocal, X);
-    DEBUG_CHECK;
     FP[rX] = *SP--;
     DISPATCH();
   }
@@ -1985,6 +1993,55 @@
 
     DISPATCH();
   }
+  {
+    BYTECODE(InstantiatedInterfaceCall, D_F);
+    DEBUG_CHECK;
+    {
+      const uint32_t argc = rF;
+      const uint32_t kidx = rD;
+
+      RawObject** call_base = SP - argc + 1;
+      RawObject** call_top = SP + 1;
+
+      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
+      RawString* target_name =
+          static_cast<RawFunction*>(LOAD_CONSTANT(kidx))->ptr()->name_;
+      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx + 1));
+      if (!InterfaceCall(thread, target_name, call_base, call_top, &pc, &FP,
+                         &SP)) {
+        HANDLE_EXCEPTION;
+      }
+    }
+
+    DISPATCH();
+  }
+
+  {
+    BYTECODE(UncheckedClosureCall, D_F);
+    DEBUG_CHECK;
+    {
+      const uint32_t argc = rF;
+      const uint32_t kidx = rD;
+
+      RawClosure* receiver = Closure::RawCast(*SP--);
+      RawObject** call_base = SP - argc + 1;
+      RawObject** call_top = SP + 1;
+
+      InterpreterHelpers::IncrementUsageCounter(FrameFunction(FP));
+      if (UNLIKELY(receiver == null_value)) {
+        SP[0] = Symbols::Call().raw();
+        goto ThrowNullError;
+      }
+      argdesc_ = static_cast<RawArray*>(LOAD_CONSTANT(kidx));
+      call_top[0] = receiver->ptr()->function_;
+
+      if (!Invoke(thread, call_base, call_top, &pc, &FP, &SP)) {
+        HANDLE_EXCEPTION;
+      }
+    }
+
+    DISPATCH();
+  }
 
   {
     BYTECODE(UncheckedInterfaceCall, D_F);
@@ -2088,6 +2145,9 @@
       case MethodRecognizer::kClassIDgetID: {
         SP[0] = InterpreterHelpers::GetClassIdAsSmi(SP[0]);
       } break;
+      case MethodRecognizer::kAsyncStackTraceHelper: {
+        SP[0] = Object::null();
+      } break;
       case MethodRecognizer::kGrowableArrayCapacity: {
         RawGrowableObjectArray* instance =
             reinterpret_cast<RawGrowableObjectArray*>(SP[0]);
@@ -2195,6 +2255,9 @@
             SP[0];
         *--SP = null_value;
       } break;
+      case MethodRecognizer::kFfiAbi: {
+        *++SP = Smi::New(static_cast<int64_t>(compiler::ffi::TargetAbi()));
+      } break;
       default: {
         NativeEntryData::Payload* payload =
             NativeEntryData::FromTypedArray(data);
@@ -2481,6 +2544,7 @@
 
   {
     BYTECODE(Allocate, D);
+    DEBUG_CHECK;
     RawClass* cls = Class::RawCast(LOAD_CONSTANT(rD));
     if (LIKELY(InterpreterHelpers::IsFinalized(cls))) {
       const intptr_t class_id = cls->ptr()->id_;
@@ -2510,6 +2574,7 @@
 
   {
     BYTECODE(AllocateT, 0);
+    DEBUG_CHECK;
     RawClass* cls = Class::RawCast(SP[0]);
     RawTypeArguments* type_args = TypeArguments::RawCast(SP[-1]);
     if (LIKELY(InterpreterHelpers::IsFinalized(cls))) {
@@ -2627,7 +2692,6 @@
 
   {
     BYTECODE(Jump, T);
-    DEBUG_CHECK;
     LOAD_JUMP_TARGET();
     DISPATCH();
   }
@@ -2703,6 +2767,13 @@
   }
 
   {
+    BYTECODE(JumpIfUnchecked, T);
+    // Interpreter is not tracking unchecked calls, so fall through to
+    // parameter type checks.
+    DISPATCH();
+  }
+
+  {
     BYTECODE(StoreIndexedTOS, 0);
     SP -= 3;
     RawArray* array = RAW_CAST(Array, SP[1]);
@@ -2716,12 +2787,14 @@
 
   {
     BYTECODE(EqualsNull, 0);
+    DEBUG_CHECK;
     SP[0] = (SP[0] == null_value) ? true_value : false_value;
     DISPATCH();
   }
 
   {
     BYTECODE(NegateInt, 0);
+    DEBUG_CHECK;
     UNBOX_INT64(value, SP[0], Symbols::UnaryMinus());
     int64_t result = Utils::SubWithWrapAround(0, value);
     BOX_INT64_RESULT(result);
@@ -2730,6 +2803,7 @@
 
   {
     BYTECODE(AddInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Plus());
     UNBOX_INT64(b, SP[1], Symbols::Plus());
@@ -2740,6 +2814,7 @@
 
   {
     BYTECODE(SubInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Minus());
     UNBOX_INT64(b, SP[1], Symbols::Minus());
@@ -2750,6 +2825,7 @@
 
   {
     BYTECODE(MulInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Star());
     UNBOX_INT64(b, SP[1], Symbols::Star());
@@ -2760,6 +2836,7 @@
 
   {
     BYTECODE(TruncDivInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::TruncDivOperator());
     UNBOX_INT64(b, SP[1], Symbols::TruncDivOperator());
@@ -2778,6 +2855,7 @@
 
   {
     BYTECODE(ModInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Percent());
     UNBOX_INT64(b, SP[1], Symbols::Percent());
@@ -2803,6 +2881,7 @@
 
   {
     BYTECODE(BitAndInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Ampersand());
     UNBOX_INT64(b, SP[1], Symbols::Ampersand());
@@ -2813,6 +2892,7 @@
 
   {
     BYTECODE(BitOrInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::BitOr());
     UNBOX_INT64(b, SP[1], Symbols::BitOr());
@@ -2823,6 +2903,7 @@
 
   {
     BYTECODE(BitXorInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::Caret());
     UNBOX_INT64(b, SP[1], Symbols::Caret());
@@ -2833,6 +2914,7 @@
 
   {
     BYTECODE(ShlInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::LeftShiftOperator());
     UNBOX_INT64(b, SP[1], Symbols::LeftShiftOperator());
@@ -2847,6 +2929,7 @@
 
   {
     BYTECODE(ShrInt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::RightShiftOperator());
     UNBOX_INT64(b, SP[1], Symbols::RightShiftOperator());
@@ -2861,6 +2944,7 @@
 
   {
     BYTECODE(CompareIntEq, 0);
+    DEBUG_CHECK;
     SP -= 1;
     if (SP[0] == SP[1]) {
       SP[0] = true_value;
@@ -2877,6 +2961,7 @@
 
   {
     BYTECODE(CompareIntGt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::RAngleBracket());
     UNBOX_INT64(b, SP[1], Symbols::RAngleBracket());
@@ -2886,6 +2971,7 @@
 
   {
     BYTECODE(CompareIntLt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::LAngleBracket());
     UNBOX_INT64(b, SP[1], Symbols::LAngleBracket());
@@ -2895,6 +2981,7 @@
 
   {
     BYTECODE(CompareIntGe, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::GreaterEqualOperator());
     UNBOX_INT64(b, SP[1], Symbols::GreaterEqualOperator());
@@ -2904,6 +2991,7 @@
 
   {
     BYTECODE(CompareIntLe, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_INT64(a, SP[0], Symbols::LessEqualOperator());
     UNBOX_INT64(b, SP[1], Symbols::LessEqualOperator());
@@ -2913,6 +3001,7 @@
 
   {
     BYTECODE(NegateDouble, 0);
+    DEBUG_CHECK;
     UNBOX_DOUBLE(value, SP[0], Symbols::UnaryMinus());
     double result = -value;
     BOX_DOUBLE_RESULT(result);
@@ -2921,6 +3010,7 @@
 
   {
     BYTECODE(AddDouble, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::Plus());
     UNBOX_DOUBLE(b, SP[1], Symbols::Plus());
@@ -2931,6 +3021,7 @@
 
   {
     BYTECODE(SubDouble, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::Minus());
     UNBOX_DOUBLE(b, SP[1], Symbols::Minus());
@@ -2941,6 +3032,7 @@
 
   {
     BYTECODE(MulDouble, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::Star());
     UNBOX_DOUBLE(b, SP[1], Symbols::Star());
@@ -2951,6 +3043,7 @@
 
   {
     BYTECODE(DivDouble, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::Slash());
     UNBOX_DOUBLE(b, SP[1], Symbols::Slash());
@@ -2961,6 +3054,7 @@
 
   {
     BYTECODE(CompareDoubleEq, 0);
+    DEBUG_CHECK;
     SP -= 1;
     if ((SP[0] == null_value) || (SP[1] == null_value)) {
       SP[0] = (SP[0] == SP[1]) ? true_value : false_value;
@@ -2974,6 +3068,7 @@
 
   {
     BYTECODE(CompareDoubleGt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::RAngleBracket());
     UNBOX_DOUBLE(b, SP[1], Symbols::RAngleBracket());
@@ -2983,6 +3078,7 @@
 
   {
     BYTECODE(CompareDoubleLt, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::LAngleBracket());
     UNBOX_DOUBLE(b, SP[1], Symbols::LAngleBracket());
@@ -2992,6 +3088,7 @@
 
   {
     BYTECODE(CompareDoubleGe, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::GreaterEqualOperator());
     UNBOX_DOUBLE(b, SP[1], Symbols::GreaterEqualOperator());
@@ -3001,6 +3098,7 @@
 
   {
     BYTECODE(CompareDoubleLe, 0);
+    DEBUG_CHECK;
     SP -= 1;
     UNBOX_DOUBLE(a, SP[0], Symbols::LessEqualOperator());
     UNBOX_DOUBLE(b, SP[1], Symbols::LessEqualOperator());
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 000375c..a240829 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -130,6 +130,184 @@
   }
 }
 
+IsolateGroup::IsolateGroup(std::unique_ptr<IsolateGroupSource> source,
+                           void* embedder_data)
+    : source_(std::move(source)),
+      embedder_data_(embedder_data),
+      thread_registry_(new ThreadRegistry()),
+      safepoint_handler_(new SafepointHandler(this)),
+      isolates_monitor_(new Monitor()),
+      isolates_() {}
+
+IsolateGroup::~IsolateGroup() {}
+
+void IsolateGroup::RegisterIsolate(Isolate* isolate) {
+  MonitorLocker ml(isolates_monitor_.get());
+  isolates_.Append(isolate);
+  isolate_count_++;
+}
+
+void IsolateGroup::UnregisterIsolate(Isolate* isolate) {
+  bool is_last_isolate = false;
+  {
+    MonitorLocker ml(isolates_monitor_.get());
+    isolates_.Remove(isolate);
+    isolate_count_--;
+    is_last_isolate = isolate_count_ == 0;
+  }
+  if (is_last_isolate) {
+    // If the creation of the isolate group (or the first isolate within the
+    // isolate group) failed, we do not invoke the cleanup callback (the
+    // embedder is responsible for handling the creation error).
+    if (initial_spawn_successful_) {
+      auto group_shutdown_callback = Isolate::GroupCleanupCallback();
+      if (group_shutdown_callback != nullptr) {
+        group_shutdown_callback(embedder_data());
+      }
+    }
+    delete this;
+  }
+}
+
+Thread* IsolateGroup::ScheduleThreadLocked(MonitorLocker* ml,
+                                           Thread* existing_mutator_thread,
+                                           bool is_vm_isolate,
+                                           bool is_mutator,
+                                           bool bypass_safepoint) {
+  ASSERT(threads_lock()->IsOwnedByCurrentThread());
+
+  // Schedule the thread into the isolate group by associating
+  // a 'Thread' structure with it (this is done while we are holding
+  // the thread registry lock).
+  Thread* thread = nullptr;
+  OSThread* os_thread = OSThread::Current();
+  if (os_thread != nullptr) {
+    // If a safepoint operation is in progress wait for it
+    // to finish before scheduling this thread in.
+    while (!bypass_safepoint && safepoint_handler()->SafepointInProgress()) {
+      ml->Wait();
+    }
+
+    if (is_mutator) {
+      if (existing_mutator_thread == nullptr) {
+        // Allocate a new [Thread] structure for the mutator thread.
+        thread = thread_registry()->GetFreeThreadLocked(is_vm_isolate);
+      } else {
+        // Reuse the existing cached [Thread] structure for the mutator thread.,
+        // see comment in 'base_isolate.h'.
+        thread_registry()->AddToActiveListLocked(existing_mutator_thread);
+        thread = existing_mutator_thread;
+      }
+    } else {
+      thread = thread_registry()->GetFreeThreadLocked(is_vm_isolate);
+    }
+
+    // Now get a free Thread structure.
+    ASSERT(thread != nullptr);
+
+    thread->ResetHighWatermark();
+
+    // Set up other values and set the TLS value.
+    thread->isolate_ = nullptr;
+    thread->isolate_group_ = this;
+    thread->set_os_thread(os_thread);
+    ASSERT(thread->execution_state() == Thread::kThreadInNative);
+    thread->set_execution_state(Thread::kThreadInVM);
+    thread->set_safepoint_state(
+        Thread::SetBypassSafepoints(bypass_safepoint, 0));
+    thread->set_vm_tag(VMTag::kVMTagId);
+    ASSERT(thread->no_safepoint_scope_depth() == 0);
+    os_thread->set_thread(thread);
+    Thread::SetCurrent(thread);
+    os_thread->EnableThreadInterrupts();
+  }
+  return thread;
+}
+
+void IsolateGroup::UnscheduleThreadLocked(MonitorLocker* ml,
+                                          Thread* thread,
+                                          bool is_mutator,
+                                          bool bypass_safepoint) {
+  // Disassociate the 'Thread' structure and unschedule the thread
+  // from this isolate group.
+  if (!is_mutator) {
+    ASSERT(thread->api_top_scope_ == nullptr);
+    ASSERT(thread->zone() == nullptr);
+    ASSERT(thread->sticky_error() == Error::null());
+  }
+  if (!bypass_safepoint) {
+    // Ensure that the thread reports itself as being at a safepoint.
+    thread->EnterSafepoint();
+  }
+  OSThread* os_thread = thread->os_thread();
+  ASSERT(os_thread != nullptr);
+  os_thread->DisableThreadInterrupts();
+  os_thread->set_thread(nullptr);
+  OSThread::SetCurrent(os_thread);
+
+  // Even if we unschedule the mutator thread, e.g. via calling
+  // `Dart_ExitIsolate()` inside a native, we might still have one or more Dart
+  // stacks active, which e.g. GC marker threads want to visit.  So we don't
+  // clear out the isolate pointer if we are on the mutator thread.
+  //
+  // The [thread] structure for the mutator thread is kept alive in the thread
+  // registry even if the mutator thread is temporarily unscheduled.
+  //
+  // All other threads are not allowed to unschedule themselves and schedule
+  // again later on.
+  if (!is_mutator) {
+    thread->isolate_ = nullptr;
+  }
+  thread->heap_ = nullptr;
+  thread->set_os_thread(nullptr);
+  thread->set_execution_state(Thread::kThreadInNative);
+  thread->set_safepoint_state(Thread::SetAtSafepoint(true, 0));
+  thread->clear_pending_functions();
+  ASSERT(thread->no_safepoint_scope_depth() == 0);
+  if (is_mutator) {
+    // The mutator thread structure stays alive and attached to the isolate as
+    // long as the isolate lives. So we simply remove the thread from the list
+    // of scheduled threads.
+    thread_registry()->RemoveFromActiveListLocked(thread);
+  } else {
+    // Return thread structure.
+    thread_registry()->ReturnThreadLocked(thread);
+  }
+}
+
+Thread* IsolateGroup::ScheduleThread(bool bypass_safepoint) {
+  // We are about to associate the thread with an isolate group and it would
+  // not be possible to correctly track no_safepoint_scope_depth for the
+  // thread in the constructor/destructor of MonitorLocker,
+  // so we create a MonitorLocker object which does not do any
+  // no_safepoint_scope_depth increments/decrements.
+  MonitorLocker ml(threads_lock(), false);
+
+  const bool is_vm_isolate = false;
+
+  // Schedule the thread into the isolate by associating
+  // a 'Thread' structure with it (this is done while we are holding
+  // the thread registry lock).
+  return ScheduleThreadLocked(&ml, /*existing_mutator_thread=*/nullptr,
+                              is_vm_isolate, /*is_mutator=*/false,
+                              bypass_safepoint);
+}
+
+void IsolateGroup::UnscheduleThread(Thread* thread,
+                                    bool is_mutator,
+                                    bool bypass_safepoint) {
+  // Disassociate the 'Thread' structure and unschedule the thread
+  // from this isolate group.
+  //
+  // We are disassociating the thread from an isolate and it would
+  // not be possible to correctly track no_safepoint_scope_depth for the
+  // thread in the constructor/destructor of MonitorLocker,
+  // so we create a MonitorLocker object which does not do any
+  // no_safepoint_scope_depth increments/decrements.
+  MonitorLocker ml(threads_lock(), false);
+  UnscheduleThreadLocked(&ml, thread, is_mutator, bypass_safepoint);
+}
+
 bool IsolateVisitor::IsVMInternalIsolate(Isolate* isolate) const {
   return Isolate::IsVMInternalIsolate(isolate);
 }
@@ -178,9 +356,12 @@
 #endif  // DEBUG
 
 void Isolate::RehashConstants() {
-  StackZone stack_zone(Thread::Current());
+  Thread* thread = Thread::Current();
+  StackZone stack_zone(thread);
   Zone* zone = stack_zone.GetZone();
 
+  thread->heap()->ResetCanonicalHashTable();
+
   Class& cls = Class::Handle(zone);
   intptr_t top = class_table()->NumCids();
   for (intptr_t cid = kInstanceCid; cid < top; cid++) {
@@ -863,7 +1044,8 @@
 
 // TODO(srdjan): Some Isolate monitors can be shared. Replace their usage with
 // that shared monitor.
-Isolate::Isolate(const Dart_IsolateFlags& api_flags)
+Isolate::Isolate(IsolateGroup* isolate_group,
+                 const Dart_IsolateFlags& api_flags)
     : BaseIsolate(),
       current_tag_(UserTag::null()),
       default_tag_(UserTag::null()),
@@ -883,8 +1065,6 @@
       last_reload_timestamp_(OS::GetCurrentTimeMillis()),
 #endif  // !defined(PRODUCT)
       start_time_micros_(OS::GetCurrentMonotonicMicros()),
-      thread_registry_(new ThreadRegistry()),
-      safepoint_handler_(new SafepointHandler(this)),
       random_(),
       mutex_(NOT_IN_PRODUCT("Isolate::mutex_")),
       symbols_mutex_(NOT_IN_PRODUCT("Isolate::symbols_mutex_")),
@@ -925,10 +1105,14 @@
   }
 
   if (FLAG_enable_interpreter) {
-    NOT_IN_PRECOMPILED(background_compiler_ = new BackgroundCompiler(this));
+    NOT_IN_PRECOMPILED(background_compiler_ = new BackgroundCompiler(
+                           this, /* optimizing = */ false));
   }
   NOT_IN_PRECOMPILED(optimizing_background_compiler_ =
-                         new BackgroundCompiler(this));
+                         new BackgroundCompiler(this, /* optimizing = */ true));
+
+  isolate_group->RegisterIsolate(this);
+  isolate_group_ = isolate_group;
 }
 
 #undef REUSABLE_HANDLE_SCOPE_INIT
@@ -979,8 +1163,12 @@
   ASSERT(deopt_context_ ==
          nullptr);  // No deopt in progress when isolate deleted.
   ASSERT(spawn_count_ == 0);
-  delete safepoint_handler_;
-  delete thread_registry_;
+
+  // We have cached the mutator thread, delete it.
+  ASSERT(scheduled_mutator_thread_ == nullptr);
+  mutator_thread_->isolate_ = nullptr;
+  delete mutator_thread_;
+  mutator_thread_ = nullptr;
 
   if (obfuscation_map_ != nullptr) {
     for (intptr_t i = 0; obfuscation_map_[i] != nullptr; i++) {
@@ -998,10 +1186,19 @@
     }
     delete[] embedder_entry_points_;
   }
+
+  // Run isolate group specific cleanup function if the last isolate in an
+  // isolate group died.
+  isolate_group_->UnregisterIsolate(this);
+  isolate_group_ = nullptr;
 }
 
 void Isolate::InitVM() {
-  create_callback_ = nullptr;
+  create_group_callback_ = nullptr;
+  initialize_callback_ = nullptr;
+  shutdown_callback_ = nullptr;
+  cleanup_callback_ = nullptr;
+  cleanup_group_callback_ = nullptr;
   if (isolates_list_monitor_ == nullptr) {
     isolates_list_monitor_ = new Monitor();
   }
@@ -1010,9 +1207,10 @@
 }
 
 Isolate* Isolate::InitIsolate(const char* name_prefix,
+                              IsolateGroup* isolate_group,
                               const Dart_IsolateFlags& api_flags,
                               bool is_vm_isolate) {
-  Isolate* result = new Isolate(api_flags);
+  Isolate* result = new Isolate(isolate_group, api_flags);
   ASSERT(result != nullptr);
 
 #if !defined(PRODUCT)
@@ -1108,6 +1306,7 @@
     if (ServiceIsolate::IsServiceIsolate(result)) {
       ServiceIsolate::SetServiceIsolate(nullptr);
     }
+
     delete result;
     return nullptr;
   }
@@ -1125,7 +1324,7 @@
 
 Thread* Isolate::mutator_thread() const {
   ASSERT(thread_registry() != nullptr);
-  return thread_registry()->mutator_thread();
+  return mutator_thread_;
 }
 
 RawObject* Isolate::CallTagHandler(Dart_LibraryTag tag,
@@ -1138,7 +1337,8 @@
   Dart_Handle api_result;
   {
     TransitionVMToNative transition(thread);
-    api_result = library_tag_handler_(tag, api_arg1, api_arg2);
+    ASSERT(HasTagHandler());
+    api_result = group()->library_tag_handler()(tag, api_arg1, api_arg2);
   }
   return Api::UnwrapHandle(api_result);
 }
@@ -1204,21 +1404,6 @@
   }
 }
 
-void Isolate::DoneLoading() {
-  GrowableObjectArray& libs =
-      GrowableObjectArray::Handle(current_zone(), object_store()->libraries());
-  Library& lib = Library::Handle(current_zone());
-  intptr_t num_libs = libs.Length();
-  for (intptr_t i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
-    // If this library was loaded with Dart_LoadLibrary, it was marked
-    // as 'load in progres'. Set the status to 'loaded'.
-    if (lib.LoadInProgress()) {
-      lib.SetLoaded();
-    }
-  }
-}
-
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 bool Isolate::CanReload() const {
   return !Isolate::IsVMInternalIsolate(this) && is_runnable() &&
@@ -1275,14 +1460,6 @@
 }
 #endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
 
-void Isolate::DoneFinalizing() {
-#if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-  if (IsReloading()) {
-    reload_context_->FinalizeLoading();
-  }
-#endif  // !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
-}
-
 const char* Isolate::MakeRunnable() {
   ASSERT(Isolate::Current() == nullptr);
 
@@ -1631,15 +1808,17 @@
 
 static void ShutdownIsolate(uword parameter) {
   Isolate* isolate = reinterpret_cast<Isolate*>(parameter);
-  // We must wait for any outstanding spawn calls to complete before
-  // running the shutdown callback.
-  isolate->WaitForOutstandingSpawns();
   {
     // Print the error if there is one.  This may execute dart code to
     // print the exception object, so we need to use a StartIsolateScope.
     StartIsolateScope start_scope(isolate);
     Thread* thread = Thread::Current();
     ASSERT(thread->isolate() == isolate);
+
+    // We must wait for any outstanding spawn calls to complete before
+    // running the shutdown callback.
+    isolate->WaitForOutstandingSpawns();
+
     StackZone zone(thread);
     HandleScope handle_scope(thread);
 #if defined(DEBUG)
@@ -1900,15 +2079,20 @@
   // as we are shutting down the isolate.
   Thread::ExitIsolate();
 
-  Dart_IsolateCleanupCallback cleanup = Isolate::CleanupCallback();
-  if (cleanup != nullptr) {
-    cleanup(init_callback_data());
+  // Run isolate specific cleanup function for all non "vm-isolate's.
+  if (Dart::vm_isolate() != this) {
+    Dart_IsolateCleanupCallback cleanup = Isolate::CleanupCallback();
+    if (cleanup != nullptr) {
+      cleanup(isolate_group_->embedder_data(), init_callback_data());
+    }
   }
 }
 
-Dart_IsolateCreateCallback Isolate::create_callback_ = nullptr;
+Dart_InitializeIsolateCallback Isolate::initialize_callback_ = nullptr;
+Dart_IsolateGroupCreateCallback Isolate::create_group_callback_ = nullptr;
 Dart_IsolateShutdownCallback Isolate::shutdown_callback_ = nullptr;
 Dart_IsolateCleanupCallback Isolate::cleanup_callback_ = nullptr;
+Dart_IsolateGroupCleanupCallback Isolate::cleanup_group_callback_ = nullptr;
 
 Monitor* Isolate::isolates_list_monitor_ = nullptr;
 Isolate* Isolate::isolates_list_head_ = nullptr;
@@ -1924,14 +2108,12 @@
   // Visit objects in the class table.
   class_table()->VisitObjectPointers(visitor);
 
-  // Visit objects in per isolate stubs.
-  StubCode::VisitObjectPointers(visitor);
-
   // Visit the dart api state for all local and persistent handles.
   if (api_state() != nullptr) {
     api_state()->VisitObjectPointers(visitor);
   }
 
+  visitor->clear_gc_root_type();
   // Visit the objects directly referenced from the isolate structure.
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&current_tag_));
   visitor->VisitPointer(reinterpret_cast<RawObject**>(&default_tag_));
@@ -1992,8 +2174,16 @@
 
 void Isolate::VisitStackPointers(ObjectPointerVisitor* visitor,
                                  ValidationPolicy validate_frames) {
+  visitor->set_gc_root_type("stack");
   // Visit objects in all threads (e.g., Dart stack, handles in zones).
-  thread_registry()->VisitObjectPointers(visitor, validate_frames);
+  thread_registry()->VisitObjectPointers(this, visitor, validate_frames);
+
+  // Visit mutator thread, even if the isolate isn't entered/scheduled (there
+  // might be live API handles to visit).
+  if (mutator_thread_ != nullptr) {
+    mutator_thread_->VisitObjectPointers(visitor, validate_frames);
+  }
+  visitor->clear_gc_root_type();
 }
 
 void Isolate::VisitWeakPersistentHandles(HandleVisitor* visitor) {
@@ -2003,7 +2193,7 @@
 }
 
 void Isolate::ReleaseStoreBuffers() {
-  thread_registry()->ReleaseStoreBuffers();
+  thread_registry()->ReleaseStoreBuffers(this);
 }
 
 void Isolate::EnableIncrementalBarrier(MarkingStack* marking_stack,
@@ -2011,12 +2201,12 @@
   ASSERT(marking_stack_ == nullptr);
   marking_stack_ = marking_stack;
   deferred_marking_stack_ = deferred_marking_stack;
-  thread_registry()->AcquireMarkingStacks();
+  thread_registry()->AcquireMarkingStacks(this);
   ASSERT(Thread::Current()->is_marking());
 }
 
 void Isolate::DisableIncrementalBarrier() {
-  thread_registry()->ReleaseMarkingStacks();
+  thread_registry()->ReleaseMarkingStacks(this);
   ASSERT(marking_stack_ != nullptr);
   marking_stack_ = nullptr;
   deferred_marking_stack_ = nullptr;
@@ -2181,8 +2371,8 @@
     jsobj.AddProperty("rootLib", lib);
   }
 
-  intptr_t zone_handle_count = thread_registry_->CountZoneHandles();
-  intptr_t scoped_handle_count = thread_registry_->CountScopedHandles();
+  intptr_t zone_handle_count = thread_registry()->CountZoneHandles(this);
+  intptr_t scoped_handle_count = thread_registry()->CountScopedHandles(this);
 
   jsobj.AddProperty("_numZoneHandles", zone_handle_count);
   jsobj.AddProperty("_numScopedHandles", scoped_handle_count);
@@ -2246,7 +2436,7 @@
     }
   }
 
-  jsobj.AddProperty("_threads", thread_registry_);
+  jsobj.AddProperty("_threads", thread_registry());
 }
 
 void Isolate::PrintMemoryUsageJSON(JSONStream* stream) {
@@ -2641,6 +2831,21 @@
   return nullptr;
 }
 
+std::unique_ptr<char[]> Isolate::LookupIsolateNameByPort(Dart_Port port) {
+  MonitorLocker ml(isolates_list_monitor_);
+  Isolate* current = isolates_list_head_;
+  while (current != nullptr) {
+    if (current->main_port() == port) {
+      const size_t len = strlen(current->name()) + 1;
+      auto result = std::unique_ptr<char[]>(new char[len]);
+      strncpy(result.get(), current->name(), len);
+      return result;
+    }
+    current = current->next_;
+  }
+  return std::unique_ptr<char[]>();
+}
+
 bool Isolate::AddIsolateToList(Isolate* isolate) {
   MonitorLocker ml(isolates_list_monitor_);
   if (!creation_enabled_) {
@@ -2795,65 +3000,55 @@
 }
 
 void Isolate::WaitForOutstandingSpawns() {
+  Thread* thread = Thread::Current();
+  ASSERT(thread != NULL);
   MonitorLocker ml(&spawn_count_monitor_);
   while (spawn_count_ > 0) {
-    ml.Wait();
+    ml.WaitWithSafepointCheck(thread);
   }
 }
 
-Monitor* Isolate::threads_lock() const {
+Monitor* IsolateGroup::threads_lock() const {
   return thread_registry_->threads_lock();
 }
 
 Thread* Isolate::ScheduleThread(bool is_mutator, bool bypass_safepoint) {
-  // Schedule the thread into the isolate by associating
-  // a 'Thread' structure with it (this is done while we are holding
-  // the thread registry lock).
-  Thread* thread = nullptr;
-  OSThread* os_thread = OSThread::Current();
-  if (os_thread != nullptr) {
-    // We are about to associate the thread with an isolate and it would
-    // not be possible to correctly track no_safepoint_scope_depth for the
-    // thread in the constructor/destructor of MonitorLocker,
-    // so we create a MonitorLocker object which does not do any
-    // no_safepoint_scope_depth increments/decrements.
-    MonitorLocker ml(threads_lock(), false);
+  // We are about to associate the thread with an isolate group and it would
+  // not be possible to correctly track no_safepoint_scope_depth for the
+  // thread in the constructor/destructor of MonitorLocker,
+  // so we create a MonitorLocker object which does not do any
+  // no_safepoint_scope_depth increments/decrements.
+  MonitorLocker ml(group()->threads_lock(), false);
 
-    // Check to make sure we don't already have a mutator thread.
-    if (is_mutator && scheduled_mutator_thread_ != nullptr) {
-      return nullptr;
-    }
-
-    // If a safepoint operation is in progress wait for it
-    // to finish before scheduling this thread in.
-    while (!bypass_safepoint && safepoint_handler()->SafepointInProgress()) {
-      ml.Wait();
-    }
-
-    // Now get a free Thread structure.
-    thread = thread_registry()->GetFreeThreadLocked(this, is_mutator);
-    ASSERT(thread != nullptr);
-
-    thread->ResetHighWatermark();
-
-    // Set up other values and set the TLS value.
-    thread->isolate_ = this;
-    ASSERT(heap() != nullptr);
-    thread->heap_ = heap();
-    thread->set_os_thread(os_thread);
-    ASSERT(thread->execution_state() == Thread::kThreadInNative);
-    thread->set_execution_state(Thread::kThreadInVM);
-    thread->set_safepoint_state(
-        Thread::SetBypassSafepoints(bypass_safepoint, 0));
-    thread->set_vm_tag(VMTag::kVMTagId);
-    ASSERT(thread->no_safepoint_scope_depth() == 0);
-    os_thread->set_thread(thread);
-    if (is_mutator) {
-      scheduled_mutator_thread_ = thread;
-    }
-    Thread::SetCurrent(thread);
-    os_thread->EnableThreadInterrupts();
+  // Check to make sure we don't already have a mutator thread.
+  if (is_mutator && scheduled_mutator_thread_ != nullptr) {
+    return nullptr;
   }
+
+  // NOTE: We cannot just use `Dart::vm_isolate() == this` here, since during
+  // VM startup it might not have been set at this point.
+  const bool is_vm_isolate =
+      Dart::vm_isolate() == nullptr || Dart::vm_isolate() == this;
+
+  // We lazily create a [Thread] structure for the mutator thread, but we'll
+  // reuse it until the death of the isolate.
+  Thread* existing_mutator_thread = is_mutator ? mutator_thread_ : nullptr;
+
+  // Schedule the thread into the isolate by associating a 'Thread' structure
+  // with it (this is done while we are holding the thread registry lock).
+  Thread* thread =
+      group()->ScheduleThreadLocked(&ml, existing_mutator_thread, is_vm_isolate,
+                                    is_mutator, bypass_safepoint);
+  if (is_mutator) {
+    ASSERT(mutator_thread_ == nullptr || mutator_thread_ == thread);
+    mutator_thread_ = thread;
+    scheduled_mutator_thread_ = thread;
+  }
+  thread->isolate_ = this;
+
+  ASSERT(heap() != nullptr);
+  thread->heap_ = heap();
+
   return thread;
 }
 
@@ -2867,50 +3062,18 @@
   // thread in the constructor/destructor of MonitorLocker,
   // so we create a MonitorLocker object which does not do any
   // no_safepoint_scope_depth increments/decrements.
-  MonitorLocker ml(threads_lock(), false);
+  MonitorLocker ml(group()->threads_lock(), false);
+
   if (is_mutator) {
     if (thread->sticky_error() != Error::null()) {
       ASSERT(sticky_error_ == Error::null());
       sticky_error_ = thread->StealStickyError();
     }
-  } else {
-    ASSERT(thread->api_top_scope_ == nullptr);
-    ASSERT(thread->zone() == nullptr);
-    ASSERT(thread->sticky_error() == Error::null());
-  }
-  if (!bypass_safepoint) {
-    // Ensure that the thread reports itself as being at a safepoint.
-    thread->EnterSafepoint();
-  }
-  OSThread* os_thread = thread->os_thread();
-  ASSERT(os_thread != nullptr);
-  os_thread->DisableThreadInterrupts();
-  os_thread->set_thread(nullptr);
-  OSThread::SetCurrent(os_thread);
-  if (is_mutator) {
+    ASSERT(mutator_thread_ == thread);
+    ASSERT(mutator_thread_ == scheduled_mutator_thread_);
     scheduled_mutator_thread_ = nullptr;
   }
-  // Even if we unschedule the mutator thread, e.g. via calling
-  // `Dart_ExitIsolate()` inside a native, we might still have one or more Dart
-  // stacks active, which e.g. GC marker threads want to visit.  So we don't
-  // clear out the isolate pointer if we are on the mutator thread.
-  //
-  // The [thread] structure for the mutator thread is kept alive in the thread
-  // registry even if the mutator thread is temporarily unscheduled.
-  //
-  // All other threads are not allowed to unschedule themselves and schedule
-  // again later on.
-  if (!is_mutator) {
-    thread->isolate_ = nullptr;
-  }
-  thread->heap_ = nullptr;
-  thread->set_os_thread(nullptr);
-  thread->set_execution_state(Thread::kThreadInNative);
-  thread->set_safepoint_state(Thread::SetAtSafepoint(true, 0));
-  thread->clear_pending_functions();
-  ASSERT(thread->no_safepoint_scope_depth() == 0);
-  // Return thread structure.
-  thread_registry()->ReturnThreadLocked(is_mutator, thread);
+  group()->UnscheduleThreadLocked(&ml, thread, is_mutator, bypass_safepoint);
 }
 
 static const char* NewConstChar(const char* chars) {
@@ -2930,7 +3093,8 @@
                                      bool errors_are_fatal,
                                      Dart_Port on_exit_port,
                                      Dart_Port on_error_port,
-                                     const char* debug_name)
+                                     const char* debug_name,
+                                     IsolateGroup* isolate_group)
     : isolate_(nullptr),
       parent_port_(parent_port),
       origin_id_(origin_id),
@@ -2942,6 +3106,7 @@
       class_name_(nullptr),
       function_name_(nullptr),
       debug_name_(debug_name),
+      isolate_group_(isolate_group),
       serialized_args_(nullptr),
       serialized_message_(message_buffer->StealMessage()),
       paused_(paused),
@@ -2973,7 +3138,8 @@
                                      bool errors_are_fatal,
                                      Dart_Port on_exit_port,
                                      Dart_Port on_error_port,
-                                     const char* debug_name)
+                                     const char* debug_name,
+                                     IsolateGroup* group)
     : isolate_(nullptr),
       parent_port_(parent_port),
       origin_id_(ILLEGAL_PORT),
@@ -2985,6 +3151,7 @@
       class_name_(nullptr),
       function_name_(nullptr),
       debug_name_(debug_name),
+      isolate_group_(group),
       serialized_args_(args_buffer->StealMessage()),
       serialized_message_(message_buffer->StealMessage()),
       isolate_flags_(),
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 6c6ee8e..4872ac4 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -23,6 +23,7 @@
 #include "vm/growable_array.h"
 #include "vm/handles.h"
 #include "vm/heap/verifier.h"
+#include "vm/intrusive_dlist.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/metrics.h"
 #include "vm/os_thread.h"
@@ -55,6 +56,7 @@
 class Log;
 class Message;
 class MessageHandler;
+class MonitorLocker;
 class Mutex;
 class Object;
 class ObjectIdRing;
@@ -155,7 +157,121 @@
     unsafe_trust_strong_mode_types,                                            \
     FLAG_experimental_unsafe_mode_use_at_your_own_risk)
 
-class Isolate : public BaseIsolate {
+// Represents the information used for spawning the first isolate within an
+// isolate group.
+//
+// Any subsequent isolates created via `Isolate.spawn()` will be created using
+// the same [IsolateGroupSource] (the object itself is shared among all isolates
+// within the same group).
+//
+// Issue(http://dartbug.com/36097): It is still possible to run into issues if
+// an isolate has spawned another one and then loads more code into the first
+// one, which the latter will not get. Though it makes the status quo better
+// than what we had before (where the embedder needed to maintain the
+// same-source guarantee).
+//
+// => This is only the first step towards having multiple isolates share the
+//    same heap (and therefore the same program structure).
+//
+class IsolateGroupSource {
+ public:
+  IsolateGroupSource(const char* script_uri,
+                     const char* name,
+                     const uint8_t* snapshot_data,
+                     const uint8_t* snapshot_instructions,
+                     const uint8_t* shared_data,
+                     const uint8_t* shared_instructions,
+                     const uint8_t* kernel_buffer,
+                     intptr_t kernel_buffer_size,
+                     Dart_IsolateFlags flags)
+      : script_uri(script_uri),
+        name(strdup(name)),
+        snapshot_data(snapshot_data),
+        snapshot_instructions(snapshot_instructions),
+        shared_data(shared_data),
+        shared_instructions(shared_instructions),
+        kernel_buffer(kernel_buffer),
+        kernel_buffer_size(kernel_buffer_size),
+        flags(flags),
+        script_kernel_buffer(nullptr),
+        script_kernel_size(-1) {}
+  ~IsolateGroupSource() { free(name); }
+
+  // The arguments used for spawning in
+  // `Dart_CreateIsolateGroupFromKernel` / `Dart_CreateIsolate`.
+  const char* script_uri;
+  char* name;
+  const uint8_t* snapshot_data;
+  const uint8_t* snapshot_instructions;
+  const uint8_t* shared_data;
+  const uint8_t* shared_instructions;
+  const uint8_t* kernel_buffer;
+  const intptr_t kernel_buffer_size;
+  Dart_IsolateFlags flags;
+
+  // The kernel buffer used in `Dart_LoadScriptFromKernel`.
+  const uint8_t* script_kernel_buffer;
+  intptr_t script_kernel_size;
+};
+
+// Represents an isolate group and is shared among all isolates within a group.
+class IsolateGroup {
+ public:
+  IsolateGroup(std::unique_ptr<IsolateGroupSource> source, void* embedder_data);
+  ~IsolateGroup();
+
+  IsolateGroupSource* source() const { return source_.get(); }
+  void* embedder_data() const { return embedder_data_; }
+
+  void set_initial_spawn_successful() { initial_spawn_successful_ = true; }
+
+  void RegisterIsolate(Isolate* isolate);
+  void UnregisterIsolate(Isolate* isolate);
+
+  Monitor* threads_lock() const;
+  ThreadRegistry* thread_registry() const { return thread_registry_.get(); }
+  SafepointHandler* safepoint_handler() { return safepoint_handler_.get(); }
+
+  static inline IsolateGroup* Current() {
+    Thread* thread = Thread::Current();
+    return thread == nullptr ? nullptr : thread->isolate_group();
+  }
+
+  Thread* ScheduleThreadLocked(MonitorLocker* ml,
+                               Thread* existing_mutator_thread,
+                               bool is_vm_isolate,
+                               bool is_mutator,
+                               bool bypass_safepoint = false);
+  void UnscheduleThreadLocked(MonitorLocker* ml,
+                              Thread* thread,
+                              bool is_mutator,
+                              bool bypass_safepoint = false);
+
+  Thread* ScheduleThread(bool bypass_safepoint = false);
+  void UnscheduleThread(Thread* thread,
+                        bool is_mutator,
+                        bool bypass_safepoint = false);
+
+  Dart_LibraryTagHandler library_tag_handler() const {
+    return library_tag_handler_;
+  }
+  void set_library_tag_handler(Dart_LibraryTagHandler handler) {
+    library_tag_handler_ = handler;
+  }
+
+ private:
+  std::unique_ptr<IsolateGroupSource> source_;
+  void* embedder_data_ = nullptr;
+  std::unique_ptr<ThreadRegistry> thread_registry_;
+  std::unique_ptr<SafepointHandler> safepoint_handler_;
+  std::unique_ptr<Monitor> isolates_monitor_;
+  IntrusiveDList<Isolate> isolates_;
+  intptr_t isolate_count_ = 0;
+  bool initial_spawn_successful_ = false;
+  Dart_LibraryTagHandler library_tag_handler_ = nullptr;
+};
+
+class Isolate : public BaseIsolate, public IntrusiveDListEntry<Isolate> {
  public:
   // Keep both these enums in sync with isolate_patch.dart.
   // The different Isolate API message types.
@@ -216,8 +332,11 @@
     return deferred_marking_stack_;
   }
 
-  ThreadRegistry* thread_registry() const { return thread_registry_; }
-  SafepointHandler* safepoint_handler() const { return safepoint_handler_; }
+  ThreadRegistry* thread_registry() const { return group()->thread_registry(); }
+
+  SafepointHandler* safepoint_handler() const {
+    return group()->safepoint_handler();
+  }
   ClassTable* class_table() { return &class_table_; }
   static intptr_t class_table_offset() {
     return OFFSET_OF(Isolate, class_table_);
@@ -239,6 +358,9 @@
     message_notify_callback_ = value;
   }
 
+  IsolateGroupSource* source() const { return isolate_group_->source(); }
+  IsolateGroup* group() const { return isolate_group_; }
+
   bool HasPendingMessages();
 
   Thread* mutator_thread() const;
@@ -289,22 +411,17 @@
     environment_callback_ = value;
   }
 
-  bool HasTagHandler() const { return library_tag_handler_ != nullptr; }
+  bool HasTagHandler() const {
+    return group()->library_tag_handler() != nullptr;
+  }
   RawObject* CallTagHandler(Dart_LibraryTag tag,
                             const Object& arg1,
                             const Object& arg2);
-  void set_library_tag_handler(Dart_LibraryTagHandler value) {
-    library_tag_handler_ = value;
-  }
 
   void SetupImagePage(const uint8_t* snapshot_buffer, bool is_executable);
 
   void ScheduleInterrupts(uword interrupt_bits);
 
-  // Marks all libraries as loaded.
-  void DoneLoading();
-  void DoneFinalizing();
-
 #if !defined(PRODUCT) && !defined(DART_PRECOMPILED_RUNTIME)
   // By default the reload context is deleted. This parameter allows
   // the caller to delete is separately if it is still needed.
@@ -437,11 +554,18 @@
   void DecrementSpawnCount();
   void WaitForOutstandingSpawns();
 
-  static void SetCreateCallback(Dart_IsolateCreateCallback cb) {
-    create_callback_ = cb;
+  static void SetCreateGroupCallback(Dart_IsolateGroupCreateCallback cb) {
+    create_group_callback_ = cb;
   }
-  static Dart_IsolateCreateCallback CreateCallback() {
-    return create_callback_;
+  static Dart_IsolateGroupCreateCallback CreateGroupCallback() {
+    return create_group_callback_;
+  }
+
+  static void SetInitializeCallback_(Dart_InitializeIsolateCallback cb) {
+    initialize_callback_ = cb;
+  }
+  static Dart_InitializeIsolateCallback InitializeCallback() {
+    return initialize_callback_;
   }
 
   static void SetShutdownCallback(Dart_IsolateShutdownCallback cb) {
@@ -458,6 +582,13 @@
     return cleanup_callback_;
   }
 
+  static void SetGroupCleanupCallback(Dart_IsolateGroupCleanupCallback cb) {
+    cleanup_group_callback_ = cb;
+  }
+  static Dart_IsolateGroupCleanupCallback GroupCleanupCallback() {
+    return cleanup_group_callback_;
+  }
+
 #if !defined(PRODUCT)
   void set_object_id_ring(ObjectIdRing* ring) { object_id_ring_ = ring; }
   ObjectIdRing* object_id_ring() { return object_id_ring_; }
@@ -795,6 +926,10 @@
   // is found.
   static Isolate* LookupIsolateByPort(Dart_Port port);
 
+  // Lookup an isolate by its main port and return a copy of its name. Returns
+  // nullptr if not matching isolate is found.
+  static std::unique_ptr<char[]> LookupIsolateNameByPort(Dart_Port port);
+
   static void DisableIsolateCreation();
   static void EnableIsolateCreation();
   static bool IsolateCreationEnabled();
@@ -820,10 +955,11 @@
   friend class Dart;                  // Init, InitOnce, Shutdown.
   friend class IsolateKillerVisitor;  // Kill().
 
-  explicit Isolate(const Dart_IsolateFlags& api_flags);
+  Isolate(IsolateGroup* group, const Dart_IsolateFlags& api_flags);
 
   static void InitVM();
   static Isolate* InitIsolate(const char* name_prefix,
+                              IsolateGroup* isolate_group,
                               const Dart_IsolateFlags& api_flags,
                               bool is_vm_isolate = false);
 
@@ -859,7 +995,7 @@
       const GrowableObjectArray& value);
 #endif  // !defined(PRODUCT)
 
-  Monitor* threads_lock() const;
+  Monitor* threads_lock() { return isolate_group_->threads_lock(); }
   Thread* ScheduleThread(bool is_mutator, bool bypass_safepoint = false);
   void UnscheduleThread(Thread* thread,
                         bool is_mutator,
@@ -891,6 +1027,7 @@
   MarkingStack* marking_stack_ = nullptr;
   MarkingStack* deferred_marking_stack_ = nullptr;
   Heap* heap_ = nullptr;
+  IsolateGroup* isolate_group_ = nullptr;
 
 #define ISOLATE_FLAG_BITS(V)                                                   \
   V(ErrorsFatal)                                                               \
@@ -988,8 +1125,6 @@
 
   // All other fields go here.
   int64_t start_time_micros_;
-  ThreadRegistry* thread_registry_;
-  SafepointHandler* safepoint_handler_;
   Dart_MessageNotifyCallback message_notify_callback_ = nullptr;
   char* name_ = nullptr;
   Dart_Port main_port_ = 0;
@@ -999,7 +1134,6 @@
   uint64_t terminate_capability_ = 0;
   void* init_callback_data_ = nullptr;
   Dart_EnvironmentCallback environment_callback_ = nullptr;
-  Dart_LibraryTagHandler library_tag_handler_ = nullptr;
   ApiState* api_state_ = nullptr;
   Random random_;
   Simulator* simulator_ = nullptr;
@@ -1056,9 +1190,11 @@
 
   ReversePcLookupCache* reverse_pc_lookup_cache_ = nullptr;
 
-  static Dart_IsolateCreateCallback create_callback_;
+  static Dart_IsolateGroupCreateCallback create_group_callback_;
+  static Dart_InitializeIsolateCallback initialize_callback_;
   static Dart_IsolateShutdownCallback shutdown_callback_;
   static Dart_IsolateCleanupCallback cleanup_callback_;
+  static Dart_IsolateGroupCleanupCallback cleanup_group_callback_;
 
 #if !defined(PRODUCT)
   static void WakePauseEventHandler(Dart_Isolate isolate);
@@ -1145,7 +1281,8 @@
                     bool errorsAreFatal,
                     Dart_Port onExit,
                     Dart_Port onError,
-                    const char* debug_name);
+                    const char* debug_name,
+                    IsolateGroup* group);
   IsolateSpawnState(Dart_Port parent_port,
                     const char* script_url,
                     const char* package_config,
@@ -1155,7 +1292,8 @@
                     bool errorsAreFatal,
                     Dart_Port onExit,
                     Dart_Port onError,
-                    const char* debug_name);
+                    const char* debug_name,
+                    IsolateGroup* group);
   ~IsolateSpawnState();
 
   Isolate* isolate() const { return isolate_; }
@@ -1180,6 +1318,8 @@
   RawInstance* BuildArgs(Thread* thread);
   RawInstance* BuildMessage(Thread* thread);
 
+  IsolateGroup* isolate_group() const { return isolate_group_; }
+
  private:
   Isolate* isolate_;
   Dart_Port parent_port_;
@@ -1192,6 +1332,7 @@
   const char* class_name_;
   const char* function_name_;
   const char* debug_name_;
+  IsolateGroup* isolate_group_;
   std::unique_ptr<Message> serialized_args_;
   std::unique_ptr<Message> serialized_message_;
 
diff --git a/runtime/vm/isolate_reload.cc b/runtime/vm/isolate_reload.cc
index c261bba..b931cd7 100644
--- a/runtime/vm/isolate_reload.cc
+++ b/runtime/vm/isolate_reload.cc
@@ -135,11 +135,8 @@
     }
 
     if (new_field) {
-      if (to_field.has_initializer()) {
-        // This is a new field with an initializer.
-        const Field& field = Field::Handle(to_field.raw());
-        new_fields_->Add(&field);
-      }
+      const Field& field = Field::Handle(to_field.raw());
+      new_fields_->Add(&field);
     }
   }
 }
@@ -167,33 +164,46 @@
   TIR_Print("Running new field initializers for class: %s\n", to_.ToCString());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
-  Function& eval_func = Function::Handle(zone);
+  Function& init_func = Function::Handle(zone);
   Object& result = Object::Handle(zone);
   // For each new field.
   for (intptr_t i = 0; i < new_fields_->length(); i++) {
     // Create a function that returns the expression.
     const Field* field = new_fields_->At(i);
-    if (field->is_declared_in_bytecode()) {
-      UNIMPLEMENTED();
-    } else {
-      eval_func = kernel::CreateFieldInitializerFunction(thread, zone, *field);
-    }
-
-    for (intptr_t j = 0; j < after_->length(); j++) {
-      const Instance* instance = after_->At(j);
-      TIR_Print("Initializing instance %" Pd " / %" Pd "\n", j + 1,
-                after_->length());
-      // Run the function and assign the field.
-      result = DartEntry::InvokeFunction(eval_func, Array::empty_array());
-      if (result.IsError()) {
-        // TODO(johnmccutchan): Report this error in the reload response?
-        OS::PrintErr(
-            "RELOAD: Running initializer for new field `%s` resulted in "
-            "an error: %s\n",
-            field->ToCString(), Error::Cast(result).ToErrorCString());
-        continue;
+    if (field->has_initializer()) {
+      if (field->is_declared_in_bytecode() && (field->bytecode_offset() == 0)) {
+        FATAL1(
+            "Missing field initializer for '%s'. Reload requires bytecode "
+            "to be generated with 'instance-field-initializers'",
+            field->ToCString());
       }
-      instance->RawSetFieldAtOffset(field->Offset(), result);
+      init_func = kernel::CreateFieldInitializerFunction(thread, zone, *field);
+      const Array& args = Array::Handle(zone, Array::New(1));
+      for (intptr_t j = 0; j < after_->length(); j++) {
+        const Instance* instance = after_->At(j);
+        TIR_Print("Initializing instance %" Pd " / %" Pd "\n", j + 1,
+                  after_->length());
+        // Run the function and assign the field.
+        args.SetAt(0, *instance);
+        result = DartEntry::InvokeFunction(init_func, args);
+        if (result.IsError()) {
+          // TODO(johnmccutchan): Report this error in the reload response?
+          OS::PrintErr(
+              "RELOAD: Running initializer for new field `%s` resulted in "
+              "an error: %s\n",
+              field->ToCString(), Error::Cast(result).ToErrorCString());
+          continue;
+        }
+        instance->RawSetFieldAtOffset(field->Offset(), result);
+      }
+    } else {
+      result = field->saved_initial_value();
+      for (intptr_t j = 0; j < after_->length(); j++) {
+        const Instance* instance = after_->At(j);
+        TIR_Print("Initializing instance %" Pd " / %" Pd "\n", j + 1,
+                  after_->length());
+        instance->RawSetFieldAtOffset(field->Offset(), result);
+      }
     }
   }
 }
@@ -726,26 +736,11 @@
   DeoptimizeDependentCode();
   Checkpoint();
 
-  // WEIRD CONTROL FLOW BEGINS.
+  // We synchronously load the hot-reload kernel diff (which includes changed
+  // libraries and any libraries transitively depending on them).
   //
-  // The flow of execution until we return from the tag handler can be complex.
-  //
-  // On a successful load, the following will occur:
-  //   1) Tag Handler is invoked and the embedder is in control.
-  //   2) All sources and libraries are loaded.
-  //   3) Dart_FinalizeLoading is called by the embedder.
-  //   4) Dart_FinalizeLoading invokes IsolateReloadContext::FinalizeLoading
-  //      and we are temporarily back in control.
-  //      This is where we validate the reload and commit or reject.
-  //   5) Dart_FinalizeLoading invokes Dart code related to deferred libraries.
-  //   6) The tag handler returns and we move on.
-  //
-  // Even after a successful reload the Dart code invoked in (5) can result
-  // in an Unwind error or an UnhandledException error. This error will be
-  // returned by the tag handler. The tag handler can return other errors,
-  // for example, top level parse errors. We want to capture these errors while
-  // propagating the UnwindError or an UnhandledException error.
-
+  // If loading the hot-reload diff succeeded we'll finalize the loading, which
+  // will either commit or reject the reload request.
   {
     const Object& tmp =
         kernel::KernelLoader::LoadEntireProgram(kernel_program.get());
@@ -772,8 +767,6 @@
       result = tmp.raw();
     }
   }
-  //
-  // WEIRD CONTROL FLOW ENDS.
 
   // Re-enable the background compiler. Do this before propagating any errors.
   BackgroundCompiler::Enable(I);
@@ -830,8 +823,6 @@
   AddClassMapping(new_cls, old_cls);
 }
 
-// FinalizeLoading will be called *before* Reload() returns but will not be
-// called if the embedder fails to load sources.
 void IsolateReloadContext::FinalizeLoading() {
   if (reload_skipped_ || reload_finalized_) {
     return;
@@ -1465,9 +1456,9 @@
         if (new_cls.raw() != old_cls.raw()) {
           ASSERT(new_cls.is_enum_class() == old_cls.is_enum_class());
           if (new_cls.is_enum_class() && new_cls.is_finalized()) {
-            new_cls.ReplaceEnum(old_cls);
+            new_cls.ReplaceEnum(this, old_cls);
           } else {
-            new_cls.CopyStaticFieldValues(old_cls);
+            new_cls.CopyStaticFieldValues(this, old_cls);
           }
           old_cls.PatchFieldsAndFunctions();
           old_cls.MigrateImplicitStaticClosures(this, new_cls);
diff --git a/runtime/vm/isolate_reload_test.cc b/runtime/vm/isolate_reload_test.cc
index c331a87..02e02bf 100644
--- a/runtime/vm/isolate_reload_test.cc
+++ b/runtime/vm/isolate_reload_test.cc
@@ -1700,7 +1700,7 @@
 
   const char* error;
   error =
-      "file:///test-lib:8:12: Error: Too few positional"
+      "/test-lib:8:12: Error: Too few positional"
       " arguments: 1 required, 0 given.\n"
       "  return f1();";
   EXPECT_ERROR(error_handle, error);
@@ -2362,21 +2362,22 @@
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
-  // Lookup the Iterator class by name from the dart core library.
+  // Lookup the Stopwatch class by name from the dart core library.
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Library& core_lib = Library::Handle(object_store->core_library());
-  name = String::New("Iterator");
-  const Class& iterator_cls = Class::Handle(core_lib.LookupClass(name));
+  name = String::New("Stopwatch");
+  const Class& stopwatch_cls = Class::Handle(core_lib.LookupClass(name));
 
-  // Keep track of how many subclasses an Iterator has.
+  // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(iterator_cls.direct_subclasses());
-  intptr_t saved_subclass_count = subclasses.Length();
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+  intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
-      "abstract class AIterator extends Iterator {\n"
+      "class AStopwatch extends Stopwatch {\n"
       "}\n"
       "main() {\n"
+      "  new AStopwatch();\n"  // Force finalization.
       "  return 1;\n"
       "}\n";
 
@@ -2387,21 +2388,23 @@
     EXPECT_EQ(1, SimpleInvoke(lib, "main"));
   }
 
-  // Iterator has one non-core subclass.
-  subclasses = iterator_cls.direct_subclasses();
+  // Stopwatch has one non-core subclass.
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
-  // The new subclass is named AIterator.
+  // The new subclass is named AStopwatch.
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("AIterator", name.ToCString());
+  EXPECT_STREQ("AStopwatch", name.ToCString());
 
   const char* kReloadScript =
-      "class AIterator {\n"
+      "class AStopwatch {\n"
       "}\n"
-      "abstract class BIterator extends Iterator {\n"
+      "class BStopwatch extends Stopwatch {\n"
       "}\n"
       "main() {\n"
+      "  new AStopwatch();\n"  // Force finalization.
+      "  new BStopwatch();\n"  // Force finalization.
       "  return 2;\n"
       "}\n";
 
@@ -2412,35 +2415,36 @@
     EXPECT_EQ(2, SimpleInvoke(lib, "main"));
   }
 
-  // Iterator still has only one non-core subclass (AIterator is gone).
-  subclasses = iterator_cls.direct_subclasses();
+  // Stopwatch still has only one non-core subclass (AStopwatch is gone).
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
-  // The new subclass is named BIterator.
+  // The new subclass is named BStopwatch.
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("BIterator", name.ToCString());
+  EXPECT_STREQ("BStopwatch", name.ToCString());
 }
 
 ISOLATE_UNIT_TEST_CASE(IsolateReload_DirectSubclasses_GhostSubclass) {
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
-  // Lookup the Iterator class by name from the dart core library.
+  // Lookup the Stopwatch class by name from the dart core library.
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Library& core_lib = Library::Handle(object_store->core_library());
-  name = String::New("Iterator");
-  const Class& iterator_cls = Class::Handle(core_lib.LookupClass(name));
+  name = String::New("Stopwatch");
+  const Class& stopwatch_cls = Class::Handle(core_lib.LookupClass(name));
 
-  // Keep track of how many subclasses an Iterator has.
+  // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(iterator_cls.direct_subclasses());
-  intptr_t saved_subclass_count = subclasses.Length();
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+  intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
-      "abstract class AIterator extends Iterator {\n"
+      "class AStopwatch extends Stopwatch {\n"
       "}\n"
       "main() {\n"
+      "  new AStopwatch();\n"  // Force finalization.
       "  return 1;\n"
       "}\n";
 
@@ -2451,19 +2455,20 @@
     EXPECT_EQ(1, SimpleInvoke(lib, "main"));
   }
 
-  // Iterator has one new subclass.
-  subclasses = iterator_cls.direct_subclasses();
+  // Stopwatch has one new subclass.
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
-  // The new subclass is named AIterator.
+  // The new subclass is named AStopwatch.
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("AIterator", name.ToCString());
+  EXPECT_STREQ("AStopwatch", name.ToCString());
 
   const char* kReloadScript =
-      "abstract class BIterator extends Iterator {\n"
+      "class BStopwatch extends Stopwatch {\n"
       "}\n"
       "main() {\n"
+      "  new BStopwatch();\n"  // Force finalization.
       "  return 2;\n"
       "}\n";
 
@@ -2474,18 +2479,18 @@
     EXPECT_EQ(2, SimpleInvoke(lib, "main"));
   }
 
-  // Iterator has two non-core subclasses.
-  subclasses = iterator_cls.direct_subclasses();
+  // Stopwatch has two non-core subclasses.
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 2, subclasses.Length());
 
-  // The non-core subclasses are AIterator and BIterator.
+  // The non-core subclasses are AStopwatch and BStopwatch.
   new_subclass = subclasses.At(subclasses.Length() - 2);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("AIterator", name.ToCString());
+  EXPECT_STREQ("AStopwatch", name.ToCString());
 
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("BIterator", name.ToCString());
+  EXPECT_STREQ("BStopwatch", name.ToCString());
 }
 
 // Make sure that we restore the direct subclass info when we revert.
@@ -2493,26 +2498,27 @@
   Object& new_subclass = Object::Handle();
   String& name = String::Handle();
 
-  // Lookup the Iterator class by name from the dart core library.
+  // Lookup the Stopwatch class by name from the dart core library.
   ObjectStore* object_store = Isolate::Current()->object_store();
   const Library& core_lib = Library::Handle(object_store->core_library());
-  name = String::New("Iterator");
-  const Class& iterator_cls = Class::Handle(core_lib.LookupClass(name));
+  name = String::New("Stopwatch");
+  const Class& stopwatch_cls = Class::Handle(core_lib.LookupClass(name));
 
-  // Keep track of how many subclasses an Iterator has.
+  // Keep track of how many subclasses an Stopwatch has.
   auto& subclasses =
-      GrowableObjectArray::Handle(iterator_cls.direct_subclasses());
-  intptr_t saved_subclass_count = subclasses.Length();
+      GrowableObjectArray::Handle(stopwatch_cls.direct_subclasses());
+  intptr_t saved_subclass_count = subclasses.IsNull() ? 0 : subclasses.Length();
 
   const char* kScript =
-      "abstract class AIterator extends Iterator {\n"
+      "class AStopwatch extends Stopwatch {\n"
       "}\n"
       "class Foo {\n"
       "  final a;\n"
       "  Foo(this.a);\n"
       "}\n"
       "main() {\n"
-      "  new Foo(5);\n"  // Force Foo to be finalized.
+      "  new AStopwatch();\n"  // Force finalization.
+      "  new Foo(5);\n"        // Force finalization.
       "  return 1;\n"
       "}\n";
 
@@ -2523,25 +2529,27 @@
     EXPECT_EQ(1, SimpleInvoke(lib, "main"));
   }
 
-  // Iterator has one non-core subclass...
+  // Stopwatch has one non-core subclass...
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
-  // ... and the non-core subclass is named AIterator.
-  subclasses = iterator_cls.direct_subclasses();
+  // ... and the non-core subclass is named AStopwatch.
+  subclasses = stopwatch_cls.direct_subclasses();
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("AIterator", name.ToCString());
+  EXPECT_STREQ("AStopwatch", name.ToCString());
 
   // Attempt to reload with a bogus script.
   const char* kReloadScript =
-      "abstract class BIterator extends Iterator {\n"
+      "class BStopwatch extends Stopwatch {\n"
       "}\n"
       "class Foo {\n"
       "  final a kjsdf ksjdf ;\n"  // When we refinalize, we get an error.
       "  Foo(this.a);\n"
       "}\n"
       "main() {\n"
-      "  new Foo(5);\n"
+      "  new BStopwatch();\n"  // Force finalization.
+      "  new Foo(5);\n"        // Force finalization.
       "  return 2;\n"
       "}\n";
 
@@ -2551,16 +2559,16 @@
     EXPECT_ERROR(lib, "Expected ';' after this");
   }
 
-  // If we don't clean up the subclasses, we would find BIterator in
+  // If we don't clean up the subclasses, we would find BStopwatch in
   // the list of subclasses, which would be bad.  Make sure that
-  // Iterator still has only one non-core subclass...
-  subclasses = iterator_cls.direct_subclasses();
+  // Stopwatch still has only one non-core subclass...
+  subclasses = stopwatch_cls.direct_subclasses();
   EXPECT_EQ(saved_subclass_count + 1, subclasses.Length());
 
-  // ...and the non-core subclass is still named AIterator.
+  // ...and the non-core subclass is still named AStopwatch.
   new_subclass = subclasses.At(subclasses.Length() - 1);
   name = Class::Cast(new_subclass).Name();
-  EXPECT_STREQ("AIterator", name.ToCString());
+  EXPECT_STREQ("AStopwatch", name.ToCString());
 }
 
 // Tests reload succeeds when instance format changes.
@@ -2931,6 +2939,39 @@
   EXPECT_STREQ("true", SimpleInvokeStr(lib, "main"));
 }
 
+TEST_CASE(IsolateReload_ShapeChangeRetainsHash_Const) {
+  const char* kScript =
+      "class A {\n"
+      "  final x;\n"
+      "  const A(this.x);\n"
+      "}\n"
+      "var a, hash1, hash2;\n"
+      "main() {\n"
+      "  a = const A(1);\n"
+      "  hash1 = a.hashCode;\n"
+      "  return 'okay';\n"
+      "}\n";
+
+  Dart_Handle lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ("okay", SimpleInvokeStr(lib, "main"));
+
+  const char* kReloadScript =
+      "class A {\n"
+      "  final x, y, z;\n"
+      "  const A(this.x, this.y, this.z);\n"
+      "}\n"
+      "var a, hash1, hash2;\n"
+      "main() {\n"
+      "  hash2 = a.hashCode;\n"
+      "  return (hash1 == hash2).toString();\n"
+      "}\n";
+
+  lib = TestCase::ReloadTestScript(kReloadScript);
+  EXPECT_VALID(lib);
+  EXPECT_STREQ("true", SimpleInvokeStr(lib, "main"));
+}
+
 TEST_CASE(IsolateReload_StaticTearOffRetainsHash) {
   const char* kScript =
       "foo() {}\n"
diff --git a/runtime/vm/kernel.cc b/runtime/vm/kernel.cc
index 160e8a9..804d3e1 100644
--- a/runtime/vm/kernel.cc
+++ b/runtime/vm/kernel.cc
@@ -260,28 +260,31 @@
   token_position_collector.CollectTokenPositions(kernel_offset);
 }
 
-static void CollectBytecodeTokenPositions(
+static void CollectTokenPosition(TokenPosition position,
+                                 GrowableArray<intptr_t>* token_positions) {
+  if (position.IsReal()) {
+    token_positions->Add(position.value());
+  }
+}
+
+static void CollectBytecodeSourceTokenPositions(
     const Bytecode& bytecode,
     Zone* zone,
-    GrowableArray<intptr_t>* token_positions,
-    GrowableArray<intptr_t>* yield_positions) {
+    GrowableArray<intptr_t>* token_positions) {
   BytecodeSourcePositionsIterator iter(zone, bytecode);
   while (iter.MoveNext()) {
-    const TokenPosition pos = iter.TokenPos();
-    if (pos.IsReal()) {
-      // TODO(alexmarkov): collect yield positions from bytecode.
-      token_positions->Add(pos.value());
-    }
+    CollectTokenPosition(iter.TokenPos(), token_positions);
   }
 }
 
 static void CollectBytecodeFunctionTokenPositions(
     const Function& function,
-    GrowableArray<intptr_t>* token_positions,
-    GrowableArray<intptr_t>* yield_positions) {
+    GrowableArray<intptr_t>* token_positions) {
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   ASSERT(function.is_declared_in_bytecode());
+  CollectTokenPosition(function.token_pos(), token_positions);
+  CollectTokenPosition(function.end_token_pos(), token_positions);
   if (!function.HasBytecode()) {
     const Object& result = Object::Handle(
         zone, BytecodeReader::ReadFunctionBytecode(thread, function));
@@ -290,10 +293,11 @@
     }
   }
   Bytecode& bytecode = Bytecode::Handle(zone, function.bytecode());
-  ASSERT(!bytecode.IsNull());
+  if (bytecode.IsNull()) {
+    return;
+  }
   if (bytecode.HasSourcePositions() && !function.IsLocalFunction()) {
-    CollectBytecodeTokenPositions(bytecode, zone, token_positions,
-                                  yield_positions);
+    CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
     // Find closure functions in the object pool.
     const ObjectPool& pool = ObjectPool::Handle(zone, bytecode.object_pool());
     Object& object = Object::Handle(zone);
@@ -306,14 +310,15 @@
       object = pool.ObjectAt(i);
       if (object.IsFunction()) {
         closure ^= object.raw();
-        if ((closure.kind() == RawFunction::kClosureFunction) &&
-            (closure.IsLocalFunction())) {
+        if (closure.kind() == RawFunction::kClosureFunction &&
+            closure.IsLocalFunction()) {
+          CollectTokenPosition(closure.token_pos(), token_positions);
+          CollectTokenPosition(closure.end_token_pos(), token_positions);
           bytecode = closure.bytecode();
           ASSERT(!bytecode.IsNull());
-          if (bytecode.HasSourcePositions()) {
-            CollectBytecodeTokenPositions(bytecode, zone, token_positions,
-                                          yield_positions);
-          }
+          ASSERT(bytecode.function() != Function::null());
+          ASSERT(bytecode.HasSourcePositions());
+          CollectBytecodeSourceTokenPositions(bytecode, zone, token_positions);
         }
       }
     }
@@ -321,6 +326,7 @@
 }
 
 void CollectTokenPositionsFor(const Script& interesting_script) {
+  ASSERT(interesting_script.url() != String::null());
   Thread* thread = Thread::Current();
   Zone* zone = thread->zone();
   TranslationHelper helper(thread);
@@ -351,6 +357,7 @@
         const Class& klass = Class::Cast(entry);
         if (klass.script() == interesting_script.raw()) {
           token_positions.Add(klass.token_pos().value());
+          token_positions.Add(klass.end_token_pos().value());
         }
         // If class is declared in bytecode, its members should be loaded
         // (via class finalization) before their token positions could be
@@ -366,7 +373,6 @@
           temp_array = klass.fields();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_field ^= temp_array.At(i);
-            // TODO(regis): Factorize field handling code.
             if (!temp_field.is_declared_in_bytecode() &&
                 temp_field.kernel_offset() <= 0) {
               // Skip artificially injected fields.
@@ -379,8 +385,8 @@
             if (temp_field.is_declared_in_bytecode()) {
               if (temp_field.is_static() && temp_field.has_initializer()) {
                 temp_function = temp_field.EnsureInitializerFunction();
-                CollectBytecodeFunctionTokenPositions(
-                    temp_function, &token_positions, &yield_positions);
+                CollectBytecodeFunctionTokenPositions(temp_function,
+                                                      &token_positions);
               }
             } else {
               data = temp_field.KernelData();
@@ -394,14 +400,13 @@
           temp_array = klass.functions();
           for (intptr_t i = 0; i < temp_array.Length(); ++i) {
             temp_function ^= temp_array.At(i);
-            // TODO(regis): Factorize function handling code.
             entry_script = temp_function.script();
             if (entry_script.raw() != interesting_script.raw()) {
               continue;
             }
             if (temp_function.is_declared_in_bytecode()) {
-              CollectBytecodeFunctionTokenPositions(
-                  temp_function, &token_positions, &yield_positions);
+              CollectBytecodeFunctionTokenPositions(temp_function,
+                                                    &token_positions);
             } else {
               data = temp_function.KernelData();
               CollectKernelDataTokenPositions(
@@ -432,14 +437,13 @@
         }
       } else if (entry.IsFunction()) {
         temp_function ^= entry.raw();
-        // TODO(regis): Factorize function handling code.
         entry_script = temp_function.script();
         if (entry_script.raw() != interesting_script.raw()) {
           continue;
         }
         if (temp_function.is_declared_in_bytecode()) {
-          CollectBytecodeFunctionTokenPositions(temp_function, &token_positions,
-                                                &yield_positions);
+          CollectBytecodeFunctionTokenPositions(temp_function,
+                                                &token_positions);
         } else {
           data = temp_function.KernelData();
           CollectKernelDataTokenPositions(
@@ -450,7 +454,6 @@
         }
       } else if (entry.IsField()) {
         const Field& field = Field::Cast(entry);
-        // TODO(regis): Factorize field handling code.
         if (!field.is_declared_in_bytecode() && field.kernel_offset() <= 0) {
           // Skip artificially injected fields.
           continue;
@@ -462,8 +465,8 @@
         if (field.is_declared_in_bytecode()) {
           if (field.is_static() && field.has_initializer()) {
             temp_function = field.EnsureInitializerFunction();
-            CollectBytecodeFunctionTokenPositions(
-                temp_function, &token_positions, &yield_positions);
+            CollectBytecodeFunctionTokenPositions(temp_function,
+                                                  &token_positions);
           }
         } else {
           data = field.KernelData();
@@ -481,6 +484,8 @@
   array_object = AsSortedDuplicateFreeArray(&token_positions);
   script.set_debug_positions(array_object);
   array_object = AsSortedDuplicateFreeArray(&yield_positions);
+  // Note that yield positions in members declared in bytecode are not collected
+  // here, but on demand in the debugger.
   script.set_yield_positions(array_object);
 }
 
@@ -656,6 +661,15 @@
     Script& script = Script::Handle(zone, function.script());
     helper.InitFromScript(script);
 
+    if (function.is_declared_in_bytecode()) {
+      BytecodeComponentData bytecode_component(
+          &Array::Handle(zone, helper.GetBytecodeComponent()));
+      ActiveClass active_class;
+      BytecodeReaderHelper bytecode_reader_helper(&helper, &active_class,
+                                                  &bytecode_component);
+      return bytecode_reader_helper.BuildParameterDescriptor(function);
+    }
+
     const Class& owner_class = Class::Handle(zone, function.Owner());
     ActiveClass active_class;
     ActiveClassScope active_class_scope(&active_class, &owner_class);
diff --git a/runtime/vm/kernel_binary.cc b/runtime/vm/kernel_binary.cc
index eda3858..50e5e42 100644
--- a/runtime/vm/kernel_binary.cc
+++ b/runtime/vm/kernel_binary.cc
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 #if !defined(DART_PRECOMPILED_RUNTIME)
 
+#include <memory>
+
 #include "vm/kernel_binary.h"
 #include "platform/globals.h"
 #include "vm/compiler/frontend/kernel_to_il.h"
@@ -166,14 +168,18 @@
 std::unique_ptr<Program> Program::ReadFromFile(
     const char* script_uri, const char** error /* = nullptr */) {
   Thread* thread = Thread::Current();
+  Isolate* isolate = thread->isolate();
   if (script_uri == NULL) {
     return nullptr;
   }
+  if (!isolate->HasTagHandler()) {
+    return nullptr;
+  }
   std::unique_ptr<kernel::Program> kernel_program;
 
   const String& uri = String::Handle(String::New(script_uri));
-  const Object& ret = Object::Handle(thread->isolate()->CallTagHandler(
-      Dart_kKernelTag, Object::null_object(), uri));
+  const Object& ret = Object::Handle(
+      isolate->CallTagHandler(Dart_kKernelTag, Object::null_object(), uri));
   Api::Scope api_scope(thread);
   Dart_Handle retval = Api::NewHandle(thread, ret.raw());
   {
diff --git a/runtime/vm/kernel_binary.h b/runtime/vm/kernel_binary.h
index 00c119f..3cfe46e 100644
--- a/runtime/vm/kernel_binary.h
+++ b/runtime/vm/kernel_binary.h
@@ -20,7 +20,7 @@
 
 // Both version numbers are inclusive.
 static const uint32_t kMinSupportedKernelFormatVersion = 18;
-static const uint32_t kMaxSupportedKernelFormatVersion = 26;
+static const uint32_t kMaxSupportedKernelFormatVersion = 28;
 
 // Keep in sync with package:kernel/lib/binary/tag.dart
 #define KERNEL_TAG_LIST(V)                                                     \
@@ -162,6 +162,14 @@
   kUnevaluatedConstant = 12,
 };
 
+// Keep in sync with package:kernel/lib/ast.dart
+enum Nullability {
+  kNullable = 0,
+  kNonNullable = 1,
+  kNeither = 2,
+  kLegacy = 3,
+};
+
 static const int SpecializedIntLiteralBias = 3;
 static const int LibraryCountFieldCountFromEnd = 1;
 static const int SourceTableFieldCountFromFirstLibraryOffset = 6;
@@ -319,6 +327,11 @@
     }
   }
 
+  Nullability ReadNullability() {
+    uint8_t byte = ReadByte();
+    return static_cast<Nullability>(byte);
+  }
+
   void EnsureEnd() {
     if (offset_ != size_) {
       FATAL2(
diff --git a/runtime/vm/kernel_isolate.cc b/runtime/vm/kernel_isolate.cc
index e1b8c7c..103ce15 100644
--- a/runtime/vm/kernel_isolate.cc
+++ b/runtime/vm/kernel_isolate.cc
@@ -60,7 +60,7 @@
 const int KernelIsolate::kNotifyIsolateShutdown = 6;
 
 const char* KernelIsolate::kName = DART_KERNEL_ISOLATE_NAME;
-Dart_IsolateCreateCallback KernelIsolate::create_callback_ = NULL;
+Dart_IsolateGroupCreateCallback KernelIsolate::create_group_callback_ = NULL;
 Monitor* KernelIsolate::monitor_ = new Monitor();
 KernelIsolate::State KernelIsolate::state_ = KernelIsolate::kStopped;
 Isolate* KernelIsolate::isolate_ = NULL;
@@ -76,9 +76,9 @@
     char* error = NULL;
     Isolate* isolate = NULL;
 
-    Dart_IsolateCreateCallback create_callback =
-        KernelIsolate::create_callback();
-    ASSERT(create_callback != NULL);
+    Dart_IsolateGroupCreateCallback create_group_callback =
+        KernelIsolate::create_group_callback();
+    ASSERT(create_group_callback != NULL);
 
     // Note: these flags must match those passed to the VM during
     // the app-jit training run (see //utils/kernel-service/BUILD.gn).
@@ -94,8 +94,8 @@
 #endif
 
     isolate = reinterpret_cast<Isolate*>(
-        create_callback(KernelIsolate::kName, KernelIsolate::kName, NULL, NULL,
-                        &api_flags, NULL, &error));
+        create_group_callback(KernelIsolate::kName, KernelIsolate::kName, NULL,
+                              NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
       if (FLAG_trace_kernel) {
         OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": Isolate creation error: %s\n",
@@ -134,7 +134,6 @@
       OS::PrintErr(DART_KERNEL_ISOLATE_NAME ": ShutdownIsolate\n");
     }
     Isolate* I = reinterpret_cast<Isolate*>(parameter);
-    I->WaitForOutstandingSpawns();
     {
       // Print the error if there is one.  This may execute dart code to
       // print the exception object, so we need to use a StartIsolateScope.
@@ -142,6 +141,7 @@
       StartIsolateScope start_scope(I);
       Thread* T = Thread::Current();
       ASSERT(I == T->isolate());
+      I->WaitForOutstandingSpawns();
       StackZone zone(T);
       HandleScope handle_scope(T);
       Error& error = Error::Handle(Z);
@@ -227,8 +227,8 @@
   }
   // Grab the isolate create callback here to avoid race conditions with tests
   // that change this after Dart_Initialize returns.
-  create_callback_ = Isolate::CreateCallback();
-  if (create_callback_ == NULL) {
+  create_group_callback_ = Isolate::CreateGroupCallback();
+  if (create_group_callback_ == NULL) {
     KernelIsolate::InitializingFailed();
     return;
   }
@@ -485,23 +485,6 @@
     isolate_id.value.as_int64 =
         isolate != NULL ? static_cast<int64_t>(isolate->main_port()) : 0;
 
-    Dart_CObject suppress_warnings;
-    suppress_warnings.type = Dart_CObject_kBool;
-    suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
-
-    intptr_t num_experimental_flags = experimental_flags->length();
-    Dart_CObject** experimental_flags_array =
-        new Dart_CObject*[num_experimental_flags];
-    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
-      experimental_flags_array[i] = new Dart_CObject;
-      experimental_flags_array[i]->type = Dart_CObject_kString;
-      experimental_flags_array[i]->value.as_string = (*experimental_flags)[i];
-    }
-    Dart_CObject experimental_flags_object;
-    experimental_flags_object.type = Dart_CObject_kArray;
-    experimental_flags_object.value.as_array.values = experimental_flags_array;
-    experimental_flags_object.value.as_array.length = num_experimental_flags;
-
     Dart_CObject message;
     message.type = Dart_CObject_kArray;
     Dart_CObject* message_arr[] = {&tag,
@@ -512,9 +495,7 @@
                                    &type_definitions_object,
                                    &library_uri_object,
                                    &class_object,
-                                   &is_static_object,
-                                   &suppress_warnings,
-                                   &experimental_flags_object};
+                                   &is_static_object};
     message.value.as_array.values = message_arr;
     message.value.as_array.length = ARRAY_SIZE(message_arr);
 
@@ -542,11 +523,6 @@
     }
     delete[] type_definitions_array;
 
-    for (intptr_t i = 0; i < num_experimental_flags; ++i) {
-      delete experimental_flags_array[i];
-    }
-    delete[] experimental_flags_array;
-
     return result_;
   }
 
@@ -563,8 +539,7 @@
       const char* multiroot_filepaths,
       const char* multiroot_scheme,
       const MallocGrowableArray<char*>* experimental_flags) {
-    // Build the [null, send_port, script_uri, platform_kernel,
-    // incremental_compile, isolate_id, [files]] message for the Kernel isolate.
+    // Build the message for the Kernel isolate.
     // tag is used to specify which operation the frontend should perform.
     Dart_CObject tag;
     tag.type = Dart_CObject_kInt32;
@@ -632,6 +607,11 @@
     suppress_warnings.type = Dart_CObject_kBool;
     suppress_warnings.value.as_bool = FLAG_suppress_fe_warnings;
 
+    Dart_CObject enable_asserts;
+    enable_asserts.type = Dart_CObject_kBool;
+    enable_asserts.value.as_bool =
+        isolate != NULL ? isolate->asserts() : FLAG_enable_asserts;
+
     intptr_t num_experimental_flags = experimental_flags->length();
     Dart_CObject** experimental_flags_array =
         new Dart_CObject*[num_experimental_flags];
@@ -700,6 +680,7 @@
                                    &isolate_id,
                                    &files,
                                    &suppress_warnings,
+                                   &enable_asserts,
                                    &experimental_flags_object,
                                    &bytecode,
                                    &package_config_uri,
@@ -911,6 +892,7 @@
 
   TransitionVMToNative transition(Thread::Current());
   KernelCompilationRequest request;
+  ASSERT(is_static || (klass != nullptr));
   return request.SendAndWaitForResponse(kernel_port, expression, definitions,
                                         type_definitions, library_url, klass,
                                         is_static, experimental_flags_);
diff --git a/runtime/vm/kernel_isolate.h b/runtime/vm/kernel_isolate.h
index cdfe9da..fe457dd 100644
--- a/runtime/vm/kernel_isolate.h
+++ b/runtime/vm/kernel_isolate.h
@@ -76,11 +76,11 @@
   static void FinishedExiting();
   static void FinishedInitializing();
   static void InitializingFailed();
-  static Dart_IsolateCreateCallback create_callback() {
-    return create_callback_;
+  static Dart_IsolateGroupCreateCallback create_group_callback() {
+    return create_group_callback_;
   }
 
-  static Dart_IsolateCreateCallback create_callback_;
+  static Dart_IsolateGroupCreateCallback create_group_callback_;
   static Monitor* monitor_;
   enum State {
     kStopped,
diff --git a/runtime/vm/kernel_loader.cc b/runtime/vm/kernel_loader.cc
index 681783d..661a2e1 100644
--- a/runtime/vm/kernel_loader.cc
+++ b/runtime/vm/kernel_loader.cc
@@ -146,7 +146,7 @@
 }
 
 LibraryIndex::LibraryIndex(const ExternalTypedData& kernel_data,
-                           int32_t binary_version)
+                           uint32_t binary_version)
     : reader_(kernel_data), binary_version_(binary_version) {
   intptr_t data_size = reader_.size();
 
@@ -194,7 +194,8 @@
       patch_classes_(Array::ZoneHandle(zone_)),
       active_class_(),
       library_kernel_offset_(-1),  // Set to the correct value in LoadLibrary
-      correction_offset_(-1),      // Set to the correct value in LoadLibrary
+      kernel_binary_version_(program->binary_version()),
+      correction_offset_(-1),  // Set to the correct value in LoadLibrary
       loading_native_wrappers_library_(false),
       library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
       kernel_program_info_(KernelProgramInfo::ZoneHandle(zone_)),
@@ -209,13 +210,11 @@
       bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
-      evaluating_(GrowableObjectArray::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
       potential_pragma_functions_(GrowableObjectArray::Handle(Z)),
       pragma_class_(Class::Handle(Z)),
       name_index_handle_(Smi::Handle(Z)),
-      expression_evaluation_library_(Library::Handle(Z)),
-      expression_evaluation_function_(Function::Handle(Z)) {
+      expression_evaluation_library_(Library::Handle(Z)) {
   if (!program->is_single_program()) {
     FATAL(
         "Trying to load a concatenated dill file at a time where that is "
@@ -420,7 +419,8 @@
 
   kernel_program_info_ = KernelProgramInfo::New(
       offsets, data, names, metadata_payloads, metadata_mappings,
-      constants_table, scripts, libraries_cache, classes_cache);
+      constants_table, scripts, libraries_cache, classes_cache,
+      program_->binary_version());
 
   H.InitFromKernelProgramInfo(kernel_program_info_);
 
@@ -437,13 +437,15 @@
 
 KernelLoader::KernelLoader(const Script& script,
                            const ExternalTypedData& kernel_data,
-                           intptr_t data_program_offset)
+                           intptr_t data_program_offset,
+                           uint32_t kernel_binary_version)
     : program_(NULL),
       thread_(Thread::Current()),
       zone_(thread_->zone()),
       isolate_(thread_->isolate()),
       patch_classes_(Array::ZoneHandle(zone_)),
       library_kernel_offset_(data_program_offset),
+      kernel_binary_version_(kernel_binary_version),
       correction_offset_(0),
       loading_native_wrappers_library_(false),
       library_kernel_data_(ExternalTypedData::ZoneHandle(zone_)),
@@ -456,13 +458,11 @@
       bytecode_metadata_helper_(&helper_, &active_class_),
       external_name_class_(Class::Handle(Z)),
       external_name_field_(Field::Handle(Z)),
-      evaluating_(GrowableObjectArray::Handle(Z)),
       potential_natives_(GrowableObjectArray::Handle(Z)),
       potential_pragma_functions_(GrowableObjectArray::Handle(Z)),
       pragma_class_(Class::Handle(Z)),
       name_index_handle_(Smi::Handle(Z)),
-      expression_evaluation_library_(Library::Handle(Z)),
-      expression_evaluation_function_(Function::Handle(Z)) {
+      expression_evaluation_library_(Library::Handle(Z)) {
   ASSERT(T.active_class_ == &active_class_);
   T.finalize_ = false;
 
@@ -531,16 +531,18 @@
       if (tag == kConstantExpression || tag == kDeprecated_ConstantExpression) {
         helper_.ReadByte();  // Skip the tag.
 
-        // We have a candidate.  Let's look if it's an instance of the
+        // We have a candidate. Let's look if it's an instance of the
         // ExternalName class.
         if (tag == kConstantExpression) {
           helper_.ReadPosition();  // Skip fileOffset.
           helper_.SkipDartType();  // Skip type.
         }
         const intptr_t constant_table_offset = helper_.ReadUInt();
-        constant = constant_evaluator.EvaluateConstantExpression(
-            constant_table_offset);
-        if (constant.clazz() == external_name_class_.raw()) {
+        if (constant_evaluator.IsInstanceConstant(constant_table_offset,
+                                                  external_name_class_)) {
+          constant = constant_evaluator.EvaluateConstantExpression(
+              constant_table_offset);
+          ASSERT(constant.clazz() == external_name_class_.raw());
           // We found the annotation, let's flag the function as native and
           // set the native name!
           native_name ^= constant.GetField(external_name_field_);
@@ -653,7 +655,7 @@
     } else {
       helper_.SetOffset(library.kernel_offset());
 
-      LibraryHelper library_helper(&helper_);
+      LibraryHelper library_helper(&helper_, kernel_binary_version_);
       library_helper.ReadUntilExcluding(LibraryHelper::kAnnotations);
 
       const intptr_t annotation_count = helper_.ReadListLength();
@@ -665,14 +667,18 @@
             tag == kDeprecated_ConstantExpression) {
           helper_.ReadByte();  // Skip the tag.
 
+          // We have a candidate. Let's look if it's an instance of the
+          // ExternalName class.
           if (tag == kConstantExpression) {
             helper_.ReadPosition();  // Skip fileOffset.
             helper_.SkipDartType();  // Skip type.
           }
           const intptr_t constant_table_offset = helper_.ReadUInt();
-          constant = constant_evaluator.EvaluateConstantExpression(
-              constant_table_offset);
-          if (constant.clazz() == external_name_class_.raw()) {
+          if (constant_evaluator.IsInstanceConstant(constant_table_offset,
+                                                    external_name_class_)) {
+            constant = constant_evaluator.EvaluateConstantExpression(
+                constant_table_offset);
+            ASSERT(constant.clazz() == external_name_class_.raw());
             uri_path ^= constant.GetField(external_name_field_);
           }
         } else if (tag == kConstructorInvocation ||
@@ -815,28 +821,32 @@
 
   // Load the "evaluate:source" expression evaluation library.
   ASSERT(expression_evaluation_library_.IsNull());
-  ASSERT(expression_evaluation_function_.IsNull());
+  ASSERT(H.GetExpressionEvaluationFunction().IsNull());
   const Object& result = Object::Handle(Z, LoadProgram(true));
   if (result.IsError()) {
     return result.raw();
   }
-  ASSERT(!expression_evaluation_library_.IsNull());
-  ASSERT(!expression_evaluation_function_.IsNull());
+  const Function& function = H.GetExpressionEvaluationFunction();
+  ASSERT(!function.IsNull());
   ASSERT(GrowableObjectArray::Handle(I->object_store()->libraries()).Length() ==
          num_libs);
   ASSERT(I->class_table()->NumCids() == num_cids);
 
-  // Make the expression evaluation function have the right kernel data and
-  // parent.
-  auto& eval_data = ExternalTypedData::Handle(
-      Z, expression_evaluation_library_.kernel_data());
-  auto& eval_script =
-      Script::Handle(Z, expression_evaluation_function_.script());
-  expression_evaluation_function_.SetKernelDataAndScript(
-      eval_script, eval_data, expression_evaluation_library_.kernel_offset());
-  expression_evaluation_function_.set_owner(real_class);
+  // Make the expression evaluation function have the right script,
+  // kernel data and parent.
+  const auto& eval_script = Script::Handle(Z, function.script());
+  auto& kernel_data = ExternalTypedData::Handle(Z);
+  intptr_t kernel_offset = -1;
+  if (!function.is_declared_in_bytecode()) {
+    ASSERT(!expression_evaluation_library_.IsNull());
+    kernel_data = expression_evaluation_library_.kernel_data();
+    kernel_offset = expression_evaluation_library_.kernel_offset();
+  }
+  function.SetKernelDataAndScript(eval_script, kernel_data, kernel_offset);
 
-  return expression_evaluation_function_.raw();
+  function.set_owner(real_class);
+
+  return function.raw();
 }
 
 void KernelLoader::FindModifiedLibraries(Program* program,
@@ -915,7 +925,7 @@
   for (intptr_t i = 0; i < length; i++) {
     intptr_t kernel_offset = library_offset(i);
     helper_.SetOffset(kernel_offset);
-    LibraryHelper library_helper(&helper_);
+    LibraryHelper library_helper(&helper_, kernel_binary_version_);
     library_helper.ReadUntilIncluding(LibraryHelper::kCanonicalName);
     lib = LookupLibraryOrNull(library_helper.canonical_name_);
     if (!lib.IsNull() && !lib.is_dart_scheme()) {
@@ -926,9 +936,7 @@
       intptr_t library_end = library_offset(i + 1);
       library_kernel_data_ =
           helper_.reader_.ExternalDataFromTo(kernel_offset, library_end);
-
-      LibraryIndex library_index(library_kernel_data_,
-                                 program_->binary_version());
+      LibraryIndex library_index(library_kernel_data_, kernel_binary_version_);
       num_classes += library_index.class_count();
       num_procedures += library_index.procedure_count();
     }
@@ -986,7 +994,7 @@
   // offset.
   helper_.SetOffset(library_kernel_offset_);
 
-  LibraryHelper library_helper(&helper_);
+  LibraryHelper library_helper(&helper_, kernel_binary_version_);
   library_helper.ReadUntilIncluding(LibraryHelper::kCanonicalName);
   if (!FLAG_precompiled_mode && !I->should_load_vmservice()) {
     StringIndex lib_name_index =
@@ -1012,7 +1020,7 @@
   library.set_kernel_data(library_kernel_data_);
   library.set_kernel_offset(library_kernel_offset_);
 
-  LibraryIndex library_index(library_kernel_data_, program_->binary_version());
+  LibraryIndex library_index(library_kernel_data_, kernel_binary_version_);
   intptr_t class_count = library_index.class_count();
 
   library_helper.ReadUntilIncluding(LibraryHelper::kName);
@@ -1304,11 +1312,14 @@
         Z, LookupLibrary(dependency_helper.target_library_canonical_name_));
     if (!FLAG_enable_mirrors &&
         target_library.url() == Symbols::DartMirrors().raw()) {
-      H.ReportError("import of dart:mirrors with --enable-mirrors=false");
+      H.ReportError(
+          "import of dart:mirrors is not supported in the current Dart "
+          "runtime");
     }
     if (!Api::IsFfiEnabled() &&
         target_library.url() == Symbols::DartFfi().raw()) {
-      H.ReportError("import of dart:ffi with --enable-ffi=false");
+      H.ReportError(
+          "import of dart:ffi is not supported in the current Dart runtime");
     }
     String& prefix = H.DartSymbolPlain(dependency_helper.name_index_);
     ns = Namespace::New(target_library, show_names, hide_names);
@@ -1575,6 +1586,13 @@
           TokenPosition::kNoSource, TokenPosition::kNoSource);
       fields_.Add(&deleted_enum_sentinel);
     }
+
+    // Due to ReadVMAnnotations(), the klass may have been loaded at this point
+    // (loading the class while evaluating annotations).
+    if (klass.is_loaded()) {
+      return;
+    }
+
     klass.SetFields(Array::Handle(Z, MakeFieldsArray()));
   }
 
@@ -1698,9 +1716,12 @@
   const intptr_t library_kernel_offset = library.kernel_offset();
   ASSERT(library_kernel_offset > 0);
 
-  KernelLoader kernel_loader(script, library_kernel_data,
-                             library_kernel_offset);
-  LibraryIndex library_index(library_kernel_data, /*binary_version=*/-1);
+  const KernelProgramInfo& info =
+      KernelProgramInfo::Handle(zone, script.kernel_program_info());
+
+  KernelLoader kernel_loader(script, library_kernel_data, library_kernel_offset,
+                             info.kernel_binary_version());
+  LibraryIndex library_index(library_kernel_data, info.kernel_binary_version());
 
   if (klass.IsTopLevel()) {
     ASSERT(klass.raw() == toplevel_class.raw());
@@ -1826,25 +1847,17 @@
           helper_.SkipDartType();  // Skip type.
         }
         const intptr_t constant_table_offset = helper_.ReadUInt();
-        // A cycle in evaluating the same library instance occurs when we are
-        // trying to finalize a class while evaluation the constant. We break
-        // this cycle by ignoring the second evaluation, since the first
-        // evaluation will take care of inspecting the result.
-        // TODO(ajcbik): avoid cycle detection completely by peeking
-        //               into the constants and proceed only for @pragma
-        //               or @ExternalName
-        if (EnqueueLibraryForEvaluation(library)) {
+        // We have a candidate. Let's look if it's an instance of the
+        // ExternalName or Pragma class.
+        if (constant_evaluator.IsInstanceConstant(constant_table_offset,
+                                                  external_name_class_)) {
           constant = constant_evaluator.EvaluateConstantExpression(
               constant_table_offset);
-          DequeueLibraryForEvaluation(library);
-          if (constant.clazz() == external_name_class_.raw()) {
-            const Instance& instance =
-                Instance::Handle(Instance::RawCast(constant.raw()));
-            *native_name =
-                String::RawCast(instance.GetField(external_name_field_));
-          } else if (constant.clazz() == pragma_class_.raw()) {
-            *has_pragma_annotation = true;
-          }
+          ASSERT(constant.clazz() == external_name_class_.raw());
+          *native_name ^= constant.GetField(external_name_field_);
+        } else if (constant_evaluator.IsInstanceConstant(constant_table_offset,
+                                                         pragma_class_)) {
+          *has_pragma_annotation = true;
         }
       }
     } else {
@@ -1903,7 +1916,7 @@
   if (register_function) {
     functions_.Add(&function);
   } else {
-    expression_evaluation_function_ = function.raw();
+    H.SetExpressionEvaluationFunction(function);
   }
   function.set_kernel_offset(procedure_offset);
   if ((library.is_dart_scheme() &&
@@ -2290,13 +2303,23 @@
 
   // Create a static initializer.
   const Function& initializer_fun = Function::Handle(
-      zone, Function::New(init_name, RawFunction::kStaticFieldInitializer,
-                          true,   // is_static
-                          false,  // is_const
-                          false,  // is_abstract
-                          false,  // is_external
-                          false,  // is_native
+      zone, Function::New(init_name, RawFunction::kFieldInitializer,
+                          field.is_static(),  // is_static
+                          false,              // is_const
+                          false,              // is_abstract
+                          false,              // is_external
+                          false,              // is_native
                           initializer_owner, TokenPosition::kNoSource));
+  if (!field.is_static()) {
+    initializer_fun.set_num_fixed_parameters(1);
+    initializer_fun.set_parameter_types(
+        Array::Handle(zone, Array::New(1, Heap::kOld)));
+    initializer_fun.set_parameter_names(
+        Array::Handle(zone, Array::New(1, Heap::kOld)));
+    initializer_fun.SetParameterTypeAt(
+        0, AbstractType::Handle(zone, field_owner.DeclarationType()));
+    initializer_fun.SetParameterNameAt(0, Symbols::This());
+  }
   initializer_fun.set_result_type(AbstractType::Handle(zone, field.type()));
   initializer_fun.set_is_reflectable(false);
   initializer_fun.set_is_inlinable(false);
diff --git a/runtime/vm/kernel_loader.h b/runtime/vm/kernel_loader.h
index a6bd55d..6f3dea7 100644
--- a/runtime/vm/kernel_loader.h
+++ b/runtime/vm/kernel_loader.h
@@ -82,10 +82,8 @@
 class LibraryIndex {
  public:
   // |kernel_data| is the kernel data for one library alone.
-  // binary_version can be -1 in which case some parts of the index might not
-  // be read.
   explicit LibraryIndex(const ExternalTypedData& kernel_data,
-                        int32_t binary_version);
+                        uint32_t binary_version);
 
   intptr_t class_count() const { return class_count_; }
   intptr_t procedure_count() const { return procedure_count_; }
@@ -118,7 +116,7 @@
 
  private:
   Reader reader_;
-  int32_t binary_version_;
+  uint32_t binary_version_;
   intptr_t source_references_offset_;
   intptr_t class_index_offset_;
   intptr_t class_count_;
@@ -262,7 +260,8 @@
  private:
   KernelLoader(const Script& script,
                const ExternalTypedData& kernel_data,
-               intptr_t data_program_offset);
+               intptr_t data_program_offset,
+               uint32_t kernel_binary_version);
 
   void InitializeFields(
       DirectChainedHashMap<UriToSourceTableTrait>* uri_to_source_table);
@@ -289,7 +288,12 @@
     reader.set_offset(library_offset(index));
 
     // Start reading library.
+    // Note that this needs to be keep in sync with LibraryHelper.
     reader.ReadFlags();
+    if (program_->binary_version() >= 27) {
+      reader.ReadUInt();  // Read major language version.
+      reader.ReadUInt();  // Read minor language version.
+    }
     return reader.ReadCanonicalNameReference();
   }
 
@@ -361,9 +365,10 @@
           Library::Handle(zone_, dart::Library::InternalLibrary());
       external_name_class_ = internal_lib.LookupClass(Symbols::ExternalName());
       external_name_field_ = external_name_class_.LookupField(Symbols::name());
-    } else {
-      ASSERT(!external_name_field_.IsNull());
     }
+    ASSERT(!external_name_class_.IsNull());
+    ASSERT(!external_name_field_.IsNull());
+    ASSERT(external_name_class_.is_declaration_loaded());
   }
 
   void EnsurePragmaClassIsLookedUp() {
@@ -371,8 +376,9 @@
       const Library& core_lib =
           Library::Handle(zone_, dart::Library::CoreLibrary());
       pragma_class_ = core_lib.LookupLocalClass(Symbols::Pragma());
-      ASSERT(!pragma_class_.IsNull());
     }
+    ASSERT(!pragma_class_.IsNull());
+    ASSERT(pragma_class_.is_declaration_loaded());
   }
 
   void EnsurePotentialNatives() {
@@ -390,37 +396,6 @@
         translation_helper_.EnsurePotentialPragmaFunctions();
   }
 
-  // Returns `true` if the [library] was newly enqueued or `false`
-  // if it was already enqueued. Allocates storage on first enqueue.
-  bool EnqueueLibraryForEvaluation(const Library& library) {
-    evaluating_ = kernel_program_info_.evaluating();
-    if (evaluating_.IsNull()) {
-      evaluating_ = GrowableObjectArray::New();
-      kernel_program_info_.set_evaluating(evaluating_);
-      ASSERT(!evaluating_.IsNull());
-    } else {
-      for (intptr_t i = 0, n = evaluating_.Length(); i < n; i++) {
-        if (library.raw() == evaluating_.At(i)) {
-          return false;
-        }
-      }
-    }
-    evaluating_.Add(library);
-    return true;
-  }
-
-  // Dequeues most recent libary. Releases storage when empty.
-  void DequeueLibraryForEvaluation(const Library& library) {
-    ASSERT(!evaluating_.IsNull());
-    RawObject* object = evaluating_.RemoveLast();
-    ASSERT(library.raw() == object);
-    if (evaluating_.Length() == 0) {
-      evaluating_ = GrowableObjectArray::null();
-      kernel_program_info_.set_evaluating(evaluating_);
-      ASSERT(evaluating_.IsNull());
-    }
-  }
-
   Program* program_;
 
   Thread* thread_;
@@ -431,6 +406,7 @@
   // This is the offset of the current library within
   // the whole kernel program.
   intptr_t library_kernel_offset_;
+  uint32_t kernel_binary_version_;
   // This is the offset by which offsets, which are set relative
   // to their library's kernel data, have to be corrected.
   intptr_t correction_offset_;
@@ -448,7 +424,6 @@
 
   Class& external_name_class_;
   Field& external_name_field_;
-  GrowableObjectArray& evaluating_;
   GrowableObjectArray& potential_natives_;
   GrowableObjectArray& potential_pragma_functions_;
 
@@ -477,11 +452,12 @@
   //      |> procedure ":Eval"
   //
   // See
-  //   * pkg/front_end/lib/src/fasta/incremental_compiler.dart:compileExpression
-  //   * pkg/front_end/lib/src/fasta/kernel/utils.dart:serializeProcedure
+  //   * pkg/front_end/lib/src/fasta/incremental_compiler.dart,
+  //       compileExpression
+  //   * pkg/front_end/lib/src/fasta/kernel/utils.dart,
+  //       createExpressionEvaluationComponent
   //
   Library& expression_evaluation_library_;
-  Function& expression_evaluation_function_;
 
   GrowableArray<const Function*> functions_;
   GrowableArray<const Field*> fields_;
diff --git a/runtime/vm/libfuzzer/README.md b/runtime/vm/libfuzzer/README.md
index 7820422..84cad34 100644
--- a/runtime/vm/libfuzzer/README.md
+++ b/runtime/vm/libfuzzer/README.md
@@ -61,4 +61,5 @@
 * [Dart bugs found with fuzzing](https://github.com/dart-lang/sdk/issues?utf8=%E2%9C%93&q=label%3Adartfuzz+)
 * [DartFuzz](https://github.com/dart-lang/sdk/tree/master/runtime/tools/dartfuzz)
 * [DartLibFuzzer](https://github.com/dart-lang/sdk/tree/master/runtime/vm/libfuzzer)
+* [Dust](https://pub.dev/packages/dust)
 * [LibFuzzer](https://llvm.org/docs/LibFuzzer.html)
diff --git a/runtime/vm/megamorphic_cache_table.cc b/runtime/vm/megamorphic_cache_table.cc
index 8b9bf6a..e974932 100644
--- a/runtime/vm/megamorphic_cache_table.cc
+++ b/runtime/vm/megamorphic_cache_table.cc
@@ -52,7 +52,7 @@
 void MegamorphicCacheTable::InitMissHandler(Isolate* isolate) {
   // The miss handler for a class ID not found in the table is invoked as a
   // normal Dart function.
-  ObjectPoolBuilder object_pool_builder;
+  compiler::ObjectPoolBuilder object_pool_builder;
   const Code& code = Code::Handle(StubCode::Generate(
       "_stub_MegamorphicMiss", &object_pool_builder,
       compiler::StubCodeCompiler::GenerateMegamorphicMissStub));
@@ -87,8 +87,9 @@
   isolate->object_store()->SetMegamorphicMissHandler(code, function);
 }
 
-void MegamorphicCacheTable::ReInitMissHandlerCode(Isolate* isolate,
-                                                  ObjectPoolBuilder* wrapper) {
+void MegamorphicCacheTable::ReInitMissHandlerCode(
+    Isolate* isolate,
+    compiler::ObjectPoolBuilder* wrapper) {
   ASSERT(FLAG_precompiled_mode && FLAG_use_bare_instructions);
 
   const Code& code = Code::Handle(StubCode::Generate(
diff --git a/runtime/vm/message_handler.cc b/runtime/vm/message_handler.cc
index 122fb58..0951509 100644
--- a/runtime/vm/message_handler.cc
+++ b/runtime/vm/message_handler.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 <utility>
+
 #include "vm/message_handler.h"
 
 #include "vm/dart.h"
+#include "vm/heap/safepoint.h"
 #include "vm/lockers.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
@@ -114,8 +117,9 @@
   start_callback_ = start_callback;
   end_callback_ = end_callback;
   callback_data_ = data;
-  task_running_ = pool_->Run<MessageHandlerTask>(this);
-  ASSERT(task_running_);
+  task_running_ = true;
+  const bool launched_successfully = pool_->Run<MessageHandlerTask>(this);
+  ASSERT(launched_successfully);
 }
 
 void MessageHandler::PostMessage(std::unique_ptr<Message> message,
@@ -155,10 +159,11 @@
       ml.Notify();
     }
 
-    if ((pool_ != NULL) && !task_running_) {
+    if (pool_ != nullptr && !task_running_) {
       ASSERT(!delete_me_);
-      task_running_ = pool_->Run<MessageHandlerTask>(this);
-      ASSERT(task_running_);
+      task_running_ = true;
+      const bool launched_successfully = pool_->Run<MessageHandlerTask>(this);
+      ASSERT(launched_successfully);
     }
   }
 
@@ -184,10 +189,18 @@
     MonitorLocker* ml,
     bool allow_normal_messages,
     bool allow_multiple_normal_messages) {
-  // TODO(turnidge): Add assert that monitor_ is held here.
+  ASSERT(monitor_.IsOwnedByCurrentThread());
 
-  // If isolate() returns NULL StartIsolateScope does nothing.
+  // Scheduling of the mutator thread during the isolate start can cause this
+  // thread to safepoint.
+  // We want to avoid holding the message handler monitor during the safepoint
+  // operation to avoid possible deadlocks, which can occur if other threads are
+  // sending messages to this message handler.
+  //
+  // If isolate() returns nullptr [StartIsolateScope] does nothing.
+  ml->Exit();
   StartIsolateScope start_isolate(isolate());
+  ml->Enter();
 
   MessageStatus max_status = kOK;
   Message::Priority min_priority =
@@ -274,7 +287,7 @@
 
 MessageHandler::MessageStatus MessageHandler::PauseAndHandleAllMessages(
     int64_t timeout_millis) {
-  MonitorLocker ml(&monitor_);
+  MonitorLocker ml(&monitor_, /*no_safepoint_scope=*/false);
   ASSERT(task_running_);
   ASSERT(!delete_me_);
 #if defined(DEBUG)
@@ -282,7 +295,13 @@
 #endif
   paused_for_messages_ = true;
   while (queue_->IsEmpty() && oob_queue_->IsEmpty()) {
-    Monitor::WaitResult wr = ml.Wait(timeout_millis);
+    Monitor::WaitResult wr;
+    {
+      // Ensure this thread is at a safepoint while we wait for new messages to
+      // arrive.
+      TransitionVMToNative transition(Thread::Current());
+      wr = ml.Wait(timeout_millis);
+    }
     ASSERT(task_running_);
     ASSERT(!delete_me_);
     if (wr == Monitor::kTimedOut) {
@@ -361,6 +380,12 @@
     // all pending OOB messages, or we may miss a request for vm
     // shutdown.
     MonitorLocker ml(&monitor_);
+
+    // This method is running on the message handler task. Which means no
+    // other message handler tasks will be started until this one sets
+    // [task_running_] to false.
+    ASSERT(task_running_);
+
 #if !defined(PRODUCT)
     if (ShouldPauseOnStart(kOK)) {
       if (!is_paused_on_start()) {
diff --git a/runtime/vm/native_api_impl.cc b/runtime/vm/native_api_impl.cc
index c225bff..d87bb5a 100644
--- a/runtime/vm/native_api_impl.cc
+++ b/runtime/vm/native_api_impl.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 <functional>
+
 #include "include/dart_native_api.h"
 
 #include "platform/assert.h"
@@ -170,7 +172,11 @@
     Dart_CloseNativePort(port);
 
     if (error != nullptr) {
-      *error = strdup("Was unable to post message to isolate.");
+      if (ServiceIsolate::Port() == ILLEGAL_PORT) {
+        *error = strdup("No service isolate port was found.");
+      } else {
+        *error = strdup("Was unable to post message to service isolate.");
+      }
     }
     return false;
   }
@@ -237,14 +243,47 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
-DART_EXPORT void Dart_ExecuteInternalCommand(const char* command) {
-  if (!FLAG_enable_testing_pragmas) return;
+struct RunInSafepointAndRWCodeArgs {
+  Isolate* isolate;
+  std::function<void()>* callback;
+};
 
-  TransitionNativeToVM _(Thread::Current());
+DART_EXPORT void* Dart_ExecuteInternalCommand(const char* command, void* arg) {
+  if (!FLAG_enable_testing_pragmas) return nullptr;
+
   if (!strcmp(command, "gc-on-next-allocation")) {
+    TransitionNativeToVM _(Thread::Current());
     Isolate::Current()->heap()->CollectOnNextAllocation();
+    return nullptr;
+
   } else if (!strcmp(command, "gc-now")) {
-    Isolate::Current()->heap()->CollectAllGarbage(Heap::kDebugging);
+    TransitionNativeToVM _(Thread::Current());
+    Isolate::Current()->heap()->CollectAllGarbage();
+    return nullptr;
+
+  } else if (!strcmp(command, "is-mutator-in-native")) {
+    Isolate* const isolate = reinterpret_cast<Isolate*>(arg);
+    if (isolate->mutator_thread()->execution_state() ==
+        Thread::kThreadInNative) {
+      return arg;
+    } else {
+      return nullptr;
+    }
+
+  } else if (!strcmp(command, "run-in-safepoint-and-rw-code")) {
+    const RunInSafepointAndRWCodeArgs* const args =
+        reinterpret_cast<RunInSafepointAndRWCodeArgs*>(arg);
+    Thread::EnterIsolateAsHelper(args->isolate, Thread::TaskKind::kUnknownTask);
+    Thread* const thread = Thread::Current();
+    {
+      SafepointOperationScope scope(thread);
+      args->isolate->heap()->WriteProtectCode(/*read_only=*/false);
+      (*args->callback)();
+      args->isolate->heap()->WriteProtectCode(/*read_only=*/true);
+    }
+    Thread::ExitIsolateAsHelper();
+    return nullptr;
+
   } else {
     UNREACHABLE();
   }
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 9ad6cd4..2261ace 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -80,6 +80,7 @@
             false,
             "Remove script timestamps to allow for deterministic testing.");
 
+DECLARE_FLAG(bool, dual_map_code);
 DECLARE_FLAG(bool, intrinsify);
 DECLARE_FLAG(bool, show_invisible_frames);
 DECLARE_FLAG(bool, trace_deoptimization);
@@ -2086,14 +2087,21 @@
 }
 
 void Object::InitializeObject(uword address, intptr_t class_id, intptr_t size) {
-  uword initial_value = (class_id == kInstructionsCid)
-                            ? Assembler::GetBreakInstructionFiller()
-                            : reinterpret_cast<uword>(null_);
   uword cur = address;
   uword end = address + size;
-  while (cur < end) {
-    *reinterpret_cast<uword*>(cur) = initial_value;
-    cur += kWordSize;
+  if (class_id == kInstructionsCid) {
+    compiler::target::uword initial_value =
+        compiler::Assembler::GetBreakInstructionFiller();
+    while (cur < end) {
+      *reinterpret_cast<compiler::target::uword*>(cur) = initial_value;
+      cur += compiler::target::kWordSize;
+    }
+  } else {
+    uword initial_value = reinterpret_cast<uword>(null_);
+    while (cur < end) {
+      *reinterpret_cast<uword*>(cur) = initial_value;
+      cur += kWordSize;
+    }
   }
   uint32_t tags = 0;
   ASSERT(class_id != kIllegalCid);
@@ -2156,12 +2164,17 @@
     address = heap->Allocate(size, space);
   }
   if (UNLIKELY(address == 0)) {
-    // Use the preallocated out of memory exception to avoid calling
-    // into dart code or allocating any code.
-    const Instance& exception =
-        Instance::Handle(thread->isolate()->object_store()->out_of_memory());
-    Exceptions::Throw(thread, exception);
-    UNREACHABLE();
+    if (thread->top_exit_frame_info() != 0) {
+      // Use the preallocated out of memory exception to avoid calling
+      // into dart code or allocating any code.
+      const Instance& exception =
+          Instance::Handle(thread->isolate()->object_store()->out_of_memory());
+      Exceptions::Throw(thread, exception);
+      UNREACHABLE();
+    } else {
+      // No Dart to propagate an exception to.
+      OUT_OF_MEMORY();
+    }
   }
 #ifndef PRODUCT
   ClassTable* class_table = thread->isolate()->class_table();
@@ -3062,6 +3075,9 @@
   forwarder ^= Object::Clone(*this, Heap::kOld);
 
   forwarder.set_name(mangled_name);
+  forwarder.set_is_native(false);
+  // TODO(dartbug.com/37737): Currently, we intentionally keep the recognized
+  // kind when creating the dynamic invocation forwarder.
   forwarder.set_kind(RawFunction::kDynamicInvocationForwarder);
   forwarder.set_is_debuggable(false);
 
@@ -3550,7 +3566,9 @@
 #else
     // Loading of class declaration can be postponed until needed
     // if class comes from bytecode.
-    ASSERT(is_declared_in_bytecode());
+    if (!is_declared_in_bytecode()) {
+      FATAL1("Unable to use class %s which is not loaded yet.", ToCString());
+    }
     kernel::BytecodeReader::LoadClassDeclaration(*this);
     ASSERT(is_declaration_loaded());
     ASSERT(is_type_finalized());
@@ -3560,6 +3578,7 @@
 
 // Ensure that top level parsing of the class has been done.
 RawError* Class::EnsureIsFinalized(Thread* thread) const {
+  ASSERT(!IsNull());
   // Finalized classes have already been parsed.
   if (is_finalized()) {
     return Error::null();
@@ -4458,6 +4477,7 @@
 }
 
 RawFunction* Class::LookupFunction(const String& name, MemberKind kind) const {
+  ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
     return Function::null();
@@ -4509,6 +4529,7 @@
 
 RawFunction* Class::LookupFunctionAllowPrivate(const String& name,
                                                MemberKind kind) const {
+  ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
     return Function::null();
@@ -4544,6 +4565,7 @@
 RawFunction* Class::LookupAccessorFunction(const char* prefix,
                                            intptr_t prefix_length,
                                            const String& name) const {
+  ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
     return Function::null();
@@ -4581,6 +4603,7 @@
 }
 
 RawField* Class::LookupField(const String& name, MemberKind kind) const {
+  ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
     return Field::null();
@@ -4628,6 +4651,7 @@
 
 RawField* Class::LookupFieldAllowPrivate(const String& name,
                                          bool instance_only) const {
+  ASSERT(!IsNull());
   // Use slow string compare, ignoring privacy name mangling.
   Thread* thread = Thread::Current();
   if (EnsureIsFinalized(thread) != Error::null()) {
@@ -4905,7 +4929,10 @@
   while (it.MoveNext()) {
     constant ^= set.GetKey(it.Current());
     ASSERT(!constant.IsNull());
-    ASSERT(constant.IsCanonical());
+    // Shape changes lose the canonical bit because they may result/ in merging
+    // constants. E.g., [x1, y1], [x1, y2] -> [x1].
+    DEBUG_ASSERT(constant.IsCanonical() ||
+                 Isolate::Current()->HasAttemptedReload());
     InsertCanonicalConstant(zone, constant);
   }
   set.Release();
@@ -4952,6 +4979,26 @@
   return result.Canonicalize();
 }
 
+RawTypeArguments* TypeArguments::ConcatenateTypeParameters(
+    Zone* zone,
+    const TypeArguments& other) const {
+  ASSERT(!IsNull() && !other.IsNull());
+  const intptr_t this_len = Length();
+  const intptr_t other_len = other.Length();
+  const auto& result = TypeArguments::Handle(
+      zone, TypeArguments::New(this_len + other_len, Heap::kNew));
+  auto& type = AbstractType::Handle(zone);
+  for (intptr_t i = 0; i < this_len; ++i) {
+    type = TypeAt(i);
+    result.SetTypeAt(i, type);
+  }
+  for (intptr_t i = 0; i < other_len; ++i) {
+    type = other.TypeAt(i);
+    result.SetTypeAt(this_len + i, type);
+  }
+  return result.raw();
+}
+
 RawString* TypeArguments::SubvectorName(intptr_t from_index,
                                         intptr_t len,
                                         NameVisibility name_visibility) const {
@@ -5880,7 +5927,7 @@
   ASSERT(kind() == RawFunction::kImplicitGetter ||
          kind() == RawFunction::kImplicitSetter ||
          kind() == RawFunction::kImplicitStaticGetter ||
-         kind() == RawFunction::kStaticFieldInitializer);
+         kind() == RawFunction::kFieldInitializer);
   return Field::RawCast(raw_ptr()->data_);
 }
 
@@ -5888,7 +5935,7 @@
   ASSERT(kind() == RawFunction::kImplicitGetter ||
          kind() == RawFunction::kImplicitSetter ||
          kind() == RawFunction::kImplicitStaticGetter ||
-         kind() == RawFunction::kStaticFieldInitializer);
+         kind() == RawFunction::kFieldInitializer);
   // Top level classes may be finalized multiple times.
   ASSERT(raw_ptr()->data_ == Object::null() || raw_ptr()->data_ == value.raw());
   set_data(value);
@@ -5950,7 +5997,7 @@
 
 RawFunction* Function::implicit_closure_function() const {
   if (IsClosureFunction() || IsSignatureFunction() || IsFactory() ||
-      IsDispatcherOrImplicitAccessor() || IsImplicitStaticFieldInitializer()) {
+      IsDispatcherOrImplicitAccessor() || IsFieldInitializer()) {
     return Function::null();
   }
   const Object& obj = Object::Handle(raw_ptr()->data_);
@@ -6158,8 +6205,8 @@
     case RawFunction::kImplicitStaticGetter:
       return "ImplicitStaticGetter";
       break;
-    case RawFunction::kStaticFieldInitializer:
-      return "StaticFieldInitializer";
+    case RawFunction::kFieldInitializer:
+      return "FieldInitializer";
       break;
     case RawFunction::kMethodExtractor:
       return "MethodExtractor";
@@ -7250,7 +7297,6 @@
   result.set_is_redirecting(false);
   result.set_is_generated_body(false);
   result.set_has_pragma(false);
-  result.set_always_inline(false);
   result.set_is_polymorphic_target(false);
   result.set_is_no_such_method_forwarder(false);
   NOT_IN_PRECOMPILED(result.set_state_bits(0));
@@ -7711,7 +7757,7 @@
 
 void Function::SetKernelDataAndScript(const Script& script,
                                       const ExternalTypedData& data,
-                                      intptr_t offset) {
+                                      intptr_t offset) const {
   Array& data_field = Array::Handle(Array::New(3));
   data_field.SetAt(0, script);
   data_field.SetAt(1, data);
@@ -8040,8 +8086,9 @@
 }
 
 bool Function::CheckSourceFingerprint(const char* prefix, int32_t fp) const {
-  // TODO(alexmarkov): '(kernel_offset() <= 0)' looks like an impossible
-  // condition, fix this and re-enable fingerprints checking.
+  // TODO(36376): Restore checking fingerprints of recognized methods.
+  // '(kernel_offset() <= 0)' looks like an impossible condition, fix this and
+  //  re-enable fingerprints checking.
   if (!Isolate::Current()->obfuscate() && !is_declared_in_bytecode() &&
       (kernel_offset() <= 0) && (SourceFingerprint() != fp)) {
     const bool recalculatingFingerprints = false;
@@ -8124,8 +8171,8 @@
     case RawFunction::kImplicitStaticGetter:
       kind_str = " static-getter";
       break;
-    case RawFunction::kStaticFieldInitializer:
-      kind_str = " static-field-initializer";
+    case RawFunction::kFieldInitializer:
+      kind_str = " field-initializer";
       break;
     case RawFunction::kMethodExtractor:
       kind_str = " method-extractor";
@@ -10119,7 +10166,7 @@
 #else
   if (!obj.IsClass() && !obj.IsField() && !obj.IsFunction() &&
       !obj.IsLibrary() && !obj.IsTypeParameter()) {
-    return Object::null();
+    UNREACHABLE();
   }
   const String& metaname = String::Handle(MakeMetadataName(obj));
   Field& field = Field::Handle(GetMetadataField(metaname));
@@ -10146,6 +10193,25 @@
 #endif  // defined(DART_PRECOMPILED_RUNTIME)
 }
 
+RawArray* Library::GetExtendedMetadata(const Object& obj,
+                                       intptr_t count) const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  return Object::empty_array().raw();
+#else
+  if (!obj.IsFunction()) {
+    UNREACHABLE();
+  }
+  const String& metaname = String::Handle(MakeMetadataName(obj));
+  Field& field = Field::Handle(GetMetadataField(metaname));
+  if (field.IsNull()) {
+    // There is no metadata for this object.
+    return Object::empty_array().raw();
+  }
+  ASSERT(field.is_declared_in_bytecode());
+  return kernel::BytecodeReader::ReadExtendedAnnotations(field, count);
+#endif  // defined(DART_PRECOMPILED_RUNTIME)
+}
+
 static bool ShouldBePrivate(const String& name) {
   return (name.Length() >= 1 && name.CharAt(0) == '_') ||
          (name.Length() >= 5 &&
@@ -10424,6 +10490,7 @@
 }
 
 RawObject* Library::LookupEntry(const String& name, intptr_t* index) const {
+  ASSERT(!IsNull());
   Thread* thread = Thread::Current();
   REUSABLE_ARRAY_HANDLESCOPE(thread);
   REUSABLE_OBJECT_HANDLESCOPE(thread);
@@ -12100,7 +12167,8 @@
     const ExternalTypedData& constants_table,
     const Array& scripts,
     const Array& libraries_cache,
-    const Array& classes_cache) {
+    const Array& classes_cache,
+    const uint32_t binary_version) {
   const KernelProgramInfo& info =
       KernelProgramInfo::Handle(KernelProgramInfo::New());
   info.StorePointer(&info.raw_ptr()->string_offsets_, string_offsets.raw());
@@ -12114,6 +12182,7 @@
   info.StorePointer(&info.raw_ptr()->constants_table_, constants_table.raw());
   info.StorePointer(&info.raw_ptr()->libraries_cache_, libraries_cache.raw());
   info.StorePointer(&info.raw_ptr()->classes_cache_, classes_cache.raw());
+  info.set_kernel_binary_version(binary_version);
   return info.raw();
 }
 
@@ -12135,16 +12204,15 @@
   StorePointer(&raw_ptr()->constants_, constants.raw());
 }
 
+void KernelProgramInfo::set_kernel_binary_version(uint32_t version) const {
+  StoreNonPointer(&raw_ptr()->kernel_binary_version_, version);
+}
+
 void KernelProgramInfo::set_constants_table(
     const ExternalTypedData& value) const {
   StorePointer(&raw_ptr()->constants_table_, value.raw());
 }
 
-void KernelProgramInfo::set_evaluating(
-    const GrowableObjectArray& evaluating) const {
-  StorePointer(&raw_ptr()->evaluating_, evaluating.raw());
-}
-
 void KernelProgramInfo::set_potential_natives(
     const GrowableObjectArray& candidates) const {
   StorePointer(&raw_ptr()->potential_natives_, candidates.raw());
@@ -12465,13 +12533,13 @@
   CORE_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
   CORE_INTEGER_LIB_INTRINSIC_LIST(CHECK_FINGERPRINTS2);
 
+  all_libs.Add(&Library::ZoneHandle(Library::AsyncLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::MathLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::TypedDataLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::CollectionLibrary()));
   all_libs.Add(&Library::ZoneHandle(Library::InternalLibrary()));
+  all_libs.Add(&Library::ZoneHandle(Library::FfiLibrary()));
   OTHER_RECOGNIZED_LIST(CHECK_FINGERPRINTS2);
-  INLINE_WHITE_LIST(CHECK_FINGERPRINTS);
-  INLINE_BLACK_LIST(CHECK_FINGERPRINTS);
   POLYMORPHIC_TARGET_LIST(CHECK_FINGERPRINTS);
 
   all_libs.Clear();
@@ -13367,12 +13435,6 @@
 }
 #endif
 
-void ICData::ResetSwitchable(Zone* zone) const {
-  ASSERT(NumArgsTested() == 1);
-  ASSERT(!is_tracking_exactness());
-  set_entries(Array::Handle(zone, CachedEmptyICDataArray(1, false)));
-}
-
 const char* ICData::ToCString() const {
   Zone* zone = Thread::Current()->zone();
   const String& name = String::Handle(zone, target_name());
@@ -14171,7 +14233,18 @@
   return result.raw();
 }
 
+RawUnlinkedCall* ICData::AsUnlinkedCall() const {
+  ASSERT(NumArgsTested() == 1);
+  ASSERT(!is_tracking_exactness());
+  const UnlinkedCall& result = UnlinkedCall::Handle(UnlinkedCall::New());
+  result.set_target_name(String::Handle(target_name()));
+  result.set_args_descriptor(Array::Handle(arguments_descriptor()));
+  return result.raw();
+}
+
 RawMegamorphicCache* ICData::AsMegamorphicCache() const {
+  ASSERT(NumArgsTested() == 1);
+  ASSERT(!is_tracking_exactness());
   const String& name = String::Handle(target_name());
   const Array& descriptor = Array::Handle(arguments_descriptor());
   return MegamorphicCacheTable::Lookup(Isolate::Current(), name, descriptor);
@@ -14822,7 +14895,7 @@
 }
 
 RawCode* Code::FinalizeCode(FlowGraphCompiler* compiler,
-                            Assembler* assembler,
+                            compiler::Assembler* assembler,
                             PoolAttachment pool_attachment,
                             bool optimized,
                             CodeStatistics* stats /* = nullptr */) {
@@ -14894,15 +14967,24 @@
       // Check if a dual mapping exists.
       instrs = Instructions::RawCast(HeapPage::ToExecutable(instrs.raw()));
       uword exec_address = RawObject::ToAddr(instrs.raw());
-      if (exec_address != address) {
+      const bool use_dual_mapping = exec_address != address;
+      ASSERT(use_dual_mapping == FLAG_dual_map_code);
+
+      // When dual mapping is enabled the executable mapping is RX from the
+      // point of allocation and never changes protection.
+      // Yet the writable mapping is still turned back from RW to R.
+      if (use_dual_mapping) {
         VirtualMemory::Protect(reinterpret_cast<void*>(address),
                                instrs.raw()->HeapSize(),
                                VirtualMemory::kReadOnly);
         address = exec_address;
+      } else {
+        // If dual mapping is disabled and we write protect then we have to
+        // change the single mapping from RW -> RX.
+        VirtualMemory::Protect(reinterpret_cast<void*>(address),
+                               instrs.raw()->HeapSize(),
+                               VirtualMemory::kReadExecute);
       }
-      VirtualMemory::Protect(reinterpret_cast<void*>(address),
-                             instrs.raw()->HeapSize(),
-                             VirtualMemory::kReadExecute);
     }
 
     // Hook up Code and Instructions objects.
@@ -15319,7 +15401,7 @@
     return TokenPosition::kNoSource;
   }
   uword pc_offset = return_address - PayloadStart();
-  // PC could equal to bytecode size if the last instruction is Throw.
+  // pc_offset could equal to bytecode size if the last instruction is Throw.
   ASSERT(pc_offset <= static_cast<uword>(Size()));
   kernel::BytecodeSourcePositionsIterator iter(Thread::Current()->zone(),
                                                *this);
@@ -15363,6 +15445,43 @@
 #endif
 }
 
+uword Bytecode::GetFirstDebugCheckOpcodePc() const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
+  uword pc = PayloadStart();
+  const uword end_pc = pc + Size();
+  while (pc < end_pc) {
+    if (KernelBytecode::IsDebugCheckOpcode(
+            reinterpret_cast<const KBCInstr*>(pc))) {
+      return pc;
+    }
+    pc = KernelBytecode::Next(pc);
+  }
+  return 0;
+#endif
+}
+
+uword Bytecode::GetDebugCheckedOpcodeReturnAddress(uword from_offset,
+                                                   uword to_offset) const {
+#if defined(DART_PRECOMPILED_RUNTIME)
+  UNREACHABLE();
+#else
+  uword pc = PayloadStart() + from_offset;
+  const uword end_pc = pc + (to_offset - from_offset);
+  while (pc < end_pc) {
+    uword next_pc = KernelBytecode::Next(pc);
+    if (KernelBytecode::IsDebugCheckedOpcode(
+            reinterpret_cast<const KBCInstr*>(pc))) {
+      // Return the pc after the opcode, i.e. its 'return address'.
+      return next_pc;
+    }
+    pc = next_pc;
+  }
+  return 0;
+#endif
+}
+
 const char* Bytecode::ToCString() const {
   return Thread::Current()->zone()->PrintToString("Bytecode(%s)",
                                                   QualifiedName());
@@ -15408,6 +15527,16 @@
   return zone->PrintToString("[Bytecode] %s", function_name);
 }
 
+const char* Bytecode::FullyQualifiedName() const {
+  Zone* zone = Thread::Current()->zone();
+  const Function& fun = Function::Handle(zone, function());
+  if (fun.IsNull()) {
+    return BytecodeStubName(*this);
+  }
+  const char* function_name = fun.ToFullyQualifiedCString();
+  return zone->PrintToString("[Bytecode] %s", function_name);
+}
+
 bool Bytecode::SlowFindRawBytecodeVisitor::FindObject(
     RawObject* raw_obj) const {
   return RawBytecode::ContainsPC(raw_obj, pc_);
@@ -15443,6 +15572,16 @@
 #endif
 }
 
+intptr_t Context::GetLevel() const {
+  intptr_t level = 0;
+  Context& parent_ctx = Context::Handle(parent());
+  while (!parent_ctx.IsNull()) {
+    level++;
+    parent_ctx = parent_ctx.parent();
+  }
+  return level;
+}
+
 RawContext* Context::New(intptr_t num_variables, Heap::Space space) {
   ASSERT(num_variables >= 0);
   ASSERT(Object::context_class() != Class::null());
@@ -16400,10 +16539,15 @@
   if (IsNull()) {
     return 2011;
   }
-  NoSafepointScope no_safepoint;
+  Thread* thread = Thread::Current();
+  uint32_t hash = thread->heap()->GetCanonicalHash(raw());
+  if (hash != 0) {
+    return hash;
+  }
+  NoSafepointScope no_safepoint(thread);
   const intptr_t instance_size = SizeFromClass();
   ASSERT(instance_size != 0);
-  uint32_t hash = instance_size / kWordSize;
+  hash = instance_size / kWordSize;
   uword this_addr = reinterpret_cast<uword>(this->raw_ptr());
   Instance& member = Instance::Handle();
   for (intptr_t offset = Instance::NextFieldOffset(); offset < instance_size;
@@ -16411,7 +16555,9 @@
     member ^= *reinterpret_cast<RawObject**>(this_addr + offset);
     hash = CombineHashes(hash, member.CanonicalizeHash());
   }
-  return FinalizeHash(hash, String::kHashBits);
+  hash = FinalizeHash(hash, String::kHashBits);
+  thread->heap()->SetCanonicalHash(raw(), hash);
+  return hash;
 }
 
 #if defined(DEBUG)
@@ -20637,19 +20783,25 @@
 }
 
 uint32_t Array::CanonicalizeHash() const {
-  NoSafepointScope no_safepoint;
   intptr_t len = Length();
   if (len == 0) {
     return 1;
   }
-  uint32_t hash = len;
+  Thread* thread = Thread::Current();
+  uint32_t hash = thread->heap()->GetCanonicalHash(raw());
+  if (hash != 0) {
+    return hash;
+  }
+  hash = len;
   Instance& member = Instance::Handle(GetTypeArguments());
   hash = CombineHashes(hash, member.CanonicalizeHash());
   for (intptr_t i = 0; i < len; i++) {
     member ^= At(i);
     hash = CombineHashes(hash, member.CanonicalizeHash());
   }
-  return FinalizeHash(hash, kHashBits);
+  hash = FinalizeHash(hash, kHashBits);
+  thread->heap()->SetCanonicalHash(raw(), hash);
+  return hash;
 }
 
 RawArray* Array::New(intptr_t len, Heap::Space space) {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 2411db7..7557b53 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1364,8 +1364,10 @@
   bool TraceAllocation(Isolate* isolate) const;
   void SetTraceAllocation(bool trace_allocation) const;
 
-  void ReplaceEnum(const Class& old_enum) const;
-  void CopyStaticFieldValues(const Class& old_cls) const;
+  void ReplaceEnum(IsolateReloadContext* reload_context,
+                   const Class& old_enum) const;
+  void CopyStaticFieldValues(IsolateReloadContext* reload_context,
+                             const Class& old_cls) const;
   void PatchFieldsAndFunctions() const;
   void MigrateImplicitStaticClosures(IsolateReloadContext* context,
                                      const Class& new_cls) const;
@@ -1705,7 +1707,6 @@
 #endif
 
   void Reset(Zone* zone) const;
-  void ResetSwitchable(Zone* zone) const;
 
 // Note: only deopts with reasons before Unknown in this list are recorded in
 // the ICData. All other reasons are used purely for informational messages
@@ -1907,6 +1908,7 @@
   // Used for printing and optimizations.
   RawICData* AsUnaryClassChecksSortedByCount() const;
 
+  RawUnlinkedCall* AsUnlinkedCall() const;
   RawMegamorphicCache* AsMegamorphicCache() const;
 
   // Consider only used entries.
@@ -2430,7 +2432,7 @@
       case RawFunction::kSignatureFunction:
       case RawFunction::kConstructor:
       case RawFunction::kImplicitStaticGetter:
-      case RawFunction::kStaticFieldInitializer:
+      case RawFunction::kFieldInitializer:
       case RawFunction::kIrregexpFunction:
         return false;
       default:
@@ -2449,7 +2451,7 @@
       case RawFunction::kImplicitGetter:
       case RawFunction::kImplicitSetter:
       case RawFunction::kImplicitStaticGetter:
-      case RawFunction::kStaticFieldInitializer:
+      case RawFunction::kFieldInitializer:
       case RawFunction::kIrregexpFunction:
         return true;
       case RawFunction::kClosureFunction:
@@ -2648,7 +2650,7 @@
 
   void SetKernelDataAndScript(const Script& script,
                               const ExternalTypedData& data,
-                              intptr_t offset);
+                              intptr_t offset) const;
 
   intptr_t KernelDataProgramOffset() const;
 
@@ -2762,10 +2764,11 @@
     return kind() == RawFunction::kImplicitSetter;
   }
 
-  // Returns true if this function represents an implicit static field
-  // initializer function.
-  bool IsImplicitStaticFieldInitializer() const {
-    return kind() == RawFunction::kStaticFieldInitializer;
+  // Returns true if this function represents an the initializer for a static or
+  // instance field. The function returns the initial value and the caller is
+  // responsible for setting the field.
+  bool IsFieldInitializer() const {
+    return kind() == RawFunction::kFieldInitializer;
   }
 
   // Returns true if this function represents a (possibly implicit) closure
@@ -3027,7 +3030,6 @@
   // external: Just a declaration that expects to be defined in another patch
   //           file.
   // generated_body: Has a generated body.
-  // always_inline: Should always be inlined.
   // polymorphic_target: A polymorphic method.
   // has_pragma: Has a @pragma decoration.
   // no_such_method_forwarder: A stub method that just calls noSuchMethod.
@@ -3045,7 +3047,6 @@
   V(Redirecting, is_redirecting)                                               \
   V(External, is_external)                                                     \
   V(GeneratedBody, is_generated_body)                                          \
-  V(AlwaysInline, always_inline)                                               \
   V(PolymorphicTarget, is_polymorphic_target)                                  \
   V(HasPragma, has_pragma)                                                     \
   V(IsNoSuchMethodForwarder, is_no_such_method_forwarder)
@@ -3447,6 +3448,13 @@
   inline void SetStaticValue(const Instance& value,
                              bool save_initial_value = false) const;
 
+#ifndef DART_PRECOMPILED_RUNTIME
+  RawInstance* saved_initial_value() const {
+    return raw_ptr()->saved_initial_value_;
+  }
+  inline void set_saved_initial_value(const Instance& value) const;
+#endif
+
   RawClass* Owner() const;
   RawClass* Origin() const;  // Either mixin class, or same as owner().
   RawScript* Script() const;
@@ -4056,6 +4064,7 @@
                          const Function& from_fun,
                          const Function& to_fun) const;
   RawObject* GetMetadata(const Object& obj) const;
+  RawArray* GetExtendedMetadata(const Object& obj, intptr_t count) const;
 
   // Tries to finds a @pragma annotation on [object].
   //
@@ -4389,7 +4398,8 @@
                                    const ExternalTypedData& constants_table,
                                    const Array& scripts,
                                    const Array& libraries_cache,
-                                   const Array& classes_cache);
+                                   const Array& classes_cache,
+                                   const uint32_t binary_version);
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawKernelProgramInfo));
@@ -4421,9 +4431,10 @@
   RawArray* constants() const { return raw_ptr()->constants_; }
   void set_constants(const Array& constants) const;
 
-  // Records libraries under evaluation to break evaluation cycles.
-  RawGrowableObjectArray* evaluating() const { return raw_ptr()->evaluating_; }
-  void set_evaluating(const GrowableObjectArray& evaluating) const;
+  uint32_t kernel_binary_version() const {
+    return raw_ptr()->kernel_binary_version_;
+  }
+  void set_kernel_binary_version(uint32_t version) const;
 
   // If we load a kernel blob with evaluated constants, then we delay setting
   // the native names of [Function] objects until we've read the constant table
@@ -5729,6 +5740,15 @@
   TokenPosition GetTokenIndexOfPC(uword return_address) const;
   intptr_t GetTryIndexAtPc(uword return_address) const;
 
+  // Return the pc of the first 'DebugCheck' opcode of the bytecode.
+  // Return 0 if none is found.
+  uword GetFirstDebugCheckOpcodePc() const;
+
+  // Return the pc after the first 'debug checked' opcode in the range.
+  // Return 0 if none is found.
+  uword GetDebugCheckedOpcodeReturnAddress(uword from_offset,
+                                           uword to_offset) const;
+
   intptr_t instructions_binary_offset() const {
     return raw_ptr()->instructions_binary_offset_;
   }
@@ -5780,6 +5800,7 @@
 
   const char* Name() const;
   const char* QualifiedName() const;
+  const char* FullyQualifiedName() const;
 
   class SlowFindRawBytecodeVisitor : public FindObjectVisitor {
    public:
@@ -5838,6 +5859,8 @@
   }
   inline void SetAt(intptr_t context_index, const Object& value) const;
 
+  intptr_t GetLevel() const;
+
   void Dump(int indent = 0) const;
 
   static const intptr_t kBytesPerElement = kWordSize;
@@ -6536,6 +6559,10 @@
                             intptr_t other_length,
                             intptr_t total_length) const;
 
+  // Concatenate [this] and [other] vectors of type parameters.
+  RawTypeArguments* ConcatenateTypeParameters(Zone* zone,
+                                              const TypeArguments& other) const;
+
   // Check if the subvector of length 'len' starting at 'from_index' of this
   // type argument vector consists solely of DynamicType, ObjectType, or
   // VoidType.
@@ -9102,7 +9129,9 @@
   }
 
   void SetNativeAddress(size_t address) const {
-    StorePointer(&raw_ptr()->c_memory_address_, Integer::New(address));
+    const auto& address_boxed = Integer::Handle(Integer::New(address));
+    NoSafepointScope no_safepoint_scope;
+    StorePointer(&raw_ptr()->c_memory_address_, address_boxed.raw());
   }
 
   static intptr_t type_arguments_offset() {
@@ -9893,6 +9922,12 @@
   }
 }
 
+#ifndef DART_PRECOMPILED_RUNTIME
+void Field::set_saved_initial_value(const Instance& value) const {
+  StorePointer(&raw_ptr()->saved_initial_value_, value.raw());
+}
+#endif
+
 void Context::SetAt(intptr_t index, const Object& value) const {
   StorePointer(ObjectAddr(index), value.raw());
 }
diff --git a/runtime/vm/object_arm64_test.cc b/runtime/vm/object_arm64_test.cc
index ac53152..c71002b 100644
--- a/runtime/vm/object_arm64_test.cc
+++ b/runtime/vm/object_arm64_test.cc
@@ -16,14 +16,14 @@
 
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
-void GenerateIncrement(Assembler* assembler) {
+void GenerateIncrement(compiler::Assembler* assembler) {
   __ EnterFrame(1 * kWordSize);
-  __ movz(R0, Immediate(0), 0);
+  __ movz(R0, compiler::Immediate(0), 0);
   __ Push(R0);
-  __ add(R0, R0, Operand(1));
-  __ str(R0, Address(SP));
-  __ ldr(R1, Address(SP));
-  __ add(R1, R1, Operand(1));
+  __ add(R0, R0, compiler::Operand(1));
+  __ str(R0, compiler::Address(SP));
+  __ ldr(R1, compiler::Address(SP));
+  __ add(R1, R1, compiler::Operand(1));
   __ Pop(R0);
   __ mov(R0, R1);
   __ LeaveFrame();
@@ -32,7 +32,8 @@
 
 // Generate a dart code sequence that embeds a string object in it.
 // This is used to test Embedded String objects in the instructions.
-void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+void GenerateEmbedStringInCode(compiler::Assembler* assembler,
+                               const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
   __ EnterStubFrame();
@@ -43,7 +44,7 @@
 
 // Generate a dart code sequence that embeds a smi object in it.
 // This is used to test Embedded Smi objects in the instructions.
-void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
   const int64_t val = reinterpret_cast<int64_t>(smi_object.raw());
   __ LoadImmediate(R0, val);
diff --git a/runtime/vm/object_arm_test.cc b/runtime/vm/object_arm_test.cc
index 5f9f3d7..52f379e 100644
--- a/runtime/vm/object_arm_test.cc
+++ b/runtime/vm/object_arm_test.cc
@@ -16,22 +16,23 @@
 
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
-void GenerateIncrement(Assembler* assembler) {
+void GenerateIncrement(compiler::Assembler* assembler) {
   __ LoadImmediate(R0, 0);
   __ Push(R0);
-  __ ldr(IP, Address(SP, 0));
-  __ add(IP, IP, Operand(1));
-  __ str(IP, Address(SP, 0));
-  __ ldr(IP, Address(SP, 0));
-  __ add(IP, IP, Operand(1));
+  __ ldr(IP, compiler::Address(SP, 0));
+  __ add(IP, IP, compiler::Operand(1));
+  __ str(IP, compiler::Address(SP, 0));
+  __ ldr(IP, compiler::Address(SP, 0));
+  __ add(IP, IP, compiler::Operand(1));
   __ Pop(R0);
-  __ mov(R0, Operand(IP));
+  __ mov(R0, compiler::Operand(IP));
   __ Ret();
 }
 
 // Generate a dart code sequence that embeds a string object in it.
 // This is used to test Embedded String objects in the instructions.
-void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+void GenerateEmbedStringInCode(compiler::Assembler* assembler,
+                               const char* str) {
   __ EnterDartFrame(0);  // To setup pp.
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
@@ -41,7 +42,7 @@
 
 // Generate a dart code sequence that embeds a smi object in it.
 // This is used to test Embedded Smi objects in the instructions.
-void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   // No need to setup pp, since Smis are not stored in the object pool.
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
   __ LoadObject(R0, smi_object);
diff --git a/runtime/vm/object_dbc_test.cc b/runtime/vm/object_dbc_test.cc
index e19b7e4..8ba27da 100644
--- a/runtime/vm/object_dbc_test.cc
+++ b/runtime/vm/object_dbc_test.cc
@@ -19,7 +19,7 @@
 // For other architectures, this sequence does do an increment, hence the name.
 // On DBC, we don't do an increment because generating an instance call here
 // would be too complex.
-void GenerateIncrement(Assembler* assembler) {
+void GenerateIncrement(compiler::Assembler* assembler) {
   __ Frame(1);
   __ LoadConstant(0, Smi::Handle(Smi::New(1)));
   __ Return(0);
@@ -27,7 +27,8 @@
 
 // Generate a dart code sequence that embeds a string object in it.
 // This is used to test Embedded String objects in the instructions.
-void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+void GenerateEmbedStringInCode(compiler::Assembler* assembler,
+                               const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
   __ PushConstant(string_object);
@@ -36,7 +37,7 @@
 
 // Generate a dart code sequence that embeds a smi object in it.
 // This is used to test Embedded Smi objects in the instructions.
-void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
   __ PushConstant(smi_object);
   __ ReturnTOS();
diff --git a/runtime/vm/object_graph.cc b/runtime/vm/object_graph.cc
index 32d9b09..54203ed 100644
--- a/runtime/vm/object_graph.cc
+++ b/runtime/vm/object_graph.cc
@@ -53,6 +53,7 @@
         Node node;
         node.ptr = current;
         node.obj = *current;
+        node.gc_root_type = gc_root_type();
         data_.Add(node);
       }
     }
@@ -74,25 +75,38 @@
       sentinel.ptr = kSentinel;
       data_.Add(sentinel);
       StackIterator it(this, data_.length() - 2);
+      visitor->gc_root_type = node.gc_root_type;
       Visitor::Direction direction = visitor->VisitObject(&it);
       if (direction == ObjectGraph::Visitor::kAbort) {
         break;
       }
       if (direction == ObjectGraph::Visitor::kProceed) {
+        set_gc_root_type(node.gc_root_type);
         obj->VisitPointers(this);
+        clear_gc_root_type();
       }
     }
     isolate()->heap()->ResetObjectIdTable();
   }
 
+  virtual bool visit_weak_persistent_handles() const {
+    return visit_weak_persistent_handles_;
+  }
+
+  void set_visit_weak_persistent_handles(bool value) {
+    visit_weak_persistent_handles_ = value;
+  }
+
   bool include_vm_objects_;
 
  private:
   struct Node {
     RawObject** ptr;  // kSentinel for the sentinel node.
     RawObject* obj;
+    const char* gc_root_type;
   };
 
+  bool visit_weak_persistent_handles_ = false;
   static RawObject** const kSentinel;
   static const intptr_t kInitialCapacity = 1024;
   static const intptr_t kNoParent = -1;
@@ -151,6 +165,7 @@
 }
 
 static void IterateUserFields(ObjectPointerVisitor* visitor) {
+  visitor->set_gc_root_type("user global");
   Thread* thread = Thread::Current();
   // Scope to prevent handles create here from appearing as stack references.
   HANDLESCOPE(thread);
@@ -182,6 +197,7 @@
       }
     }
   }
+  visitor->clear_gc_root_type();
 }
 
 ObjectGraph::ObjectGraph(Thread* thread) : ThreadStackResource(thread) {
@@ -194,12 +210,16 @@
 
 void ObjectGraph::IterateObjects(ObjectGraph::Visitor* visitor) {
   Stack stack(isolate());
+  stack.set_visit_weak_persistent_handles(
+      visitor->visit_weak_persistent_handles());
   isolate()->VisitObjectPointers(&stack, ValidationPolicy::kDontValidateFrames);
   stack.TraverseGraph(visitor);
 }
 
 void ObjectGraph::IterateUserObjects(ObjectGraph::Visitor* visitor) {
   Stack stack(isolate());
+  stack.set_visit_weak_persistent_handles(
+      visitor->visit_weak_persistent_handles());
   IterateUserFields(&stack);
   stack.include_vm_objects_ = false;
   stack.TraverseGraph(visitor);
@@ -208,6 +228,8 @@
 void ObjectGraph::IterateObjectsFrom(const Object& root,
                                      ObjectGraph::Visitor* visitor) {
   Stack stack(isolate());
+  stack.set_visit_weak_persistent_handles(
+      visitor->visit_weak_persistent_handles());
   RawObject* root_raw = root.raw();
   stack.VisitPointer(&root_raw);
   stack.TraverseGraph(visitor);
@@ -325,6 +347,7 @@
   }
 
   intptr_t length() const { return length_; }
+  virtual bool visit_weak_persistent_handles() const { return true; }
 
   bool ShouldSkip(RawObject* obj) {
     // A retaining path through ICData is never the only retaining path,
@@ -403,7 +426,8 @@
   bool was_last_array_;
 };
 
-intptr_t ObjectGraph::RetainingPath(Object* obj, const Array& path) {
+ObjectGraph::RetainingPathResult ObjectGraph::RetainingPath(Object* obj,
+                                                            const Array& path) {
   HeapIterationScope iteration_scope(Thread::Current(), true);
   // To break the trivial path, the handle 'obj' is temporarily cleared during
   // the search, but restored before returning.
@@ -415,7 +439,7 @@
     IterateObjects(&visitor);
   }
   *obj = raw;
-  return visitor.length();
+  return {visitor.length(), visitor.gc_root_type};
 }
 
 class InboundReferencesVisitor : public ObjectVisitor,
diff --git a/runtime/vm/object_graph.h b/runtime/vm/object_graph.h
index deb700f..dabb03a 100644
--- a/runtime/vm/object_graph.h
+++ b/runtime/vm/object_graph.h
@@ -56,8 +56,18 @@
     // during this call. This method must not allocate from the heap or
     // trigger GC in any way.
     virtual Direction VisitObject(StackIterator* it) = 0;
+
+    virtual bool visit_weak_persistent_handles() const { return false; }
+
+    const char* gc_root_type = NULL;
+    bool is_traversing = false;
   };
 
+  typedef struct {
+    intptr_t length;
+    const char* gc_root_type;
+  } RetainingPathResult;
+
   explicit ObjectGraph(Thread* thread);
   ~ObjectGraph();
 
@@ -88,7 +98,7 @@
   // To break the trivial path, the handle 'obj' is temporarily cleared during
   // the search, but restored before returning. If no path is found (i.e., the
   // provided handle was the only way to reach the object), zero is returned.
-  intptr_t RetainingPath(Object* obj, const Array& path);
+  RetainingPathResult RetainingPath(Object* obj, const Array& path);
 
   // Find the objects that reference 'obj'. Populates the provided array with
   // pairs of (object pointing to 'obj', offset of pointer in words), as far as
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index c4f1515..238e5b4 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -101,10 +101,12 @@
     {
       HANDLESCOPE(thread);
       // Test null, empty, and length 1 array.
-      intptr_t null_length = graph.RetainingPath(&c, Object::null_array());
-      intptr_t empty_length = graph.RetainingPath(&c, Object::empty_array());
+      intptr_t null_length =
+          graph.RetainingPath(&c, Object::null_array()).length;
+      intptr_t empty_length =
+          graph.RetainingPath(&c, Object::empty_array()).length;
       Array& path = Array::Handle(Array::New(1, Heap::kNew));
-      intptr_t one_length = graph.RetainingPath(&c, path);
+      intptr_t one_length = graph.RetainingPath(&c, path).length;
       EXPECT_EQ(null_length, empty_length);
       EXPECT_EQ(null_length, one_length);
       EXPECT_LE(3, null_length);
@@ -114,7 +116,7 @@
       Array& path = Array::Handle(Array::New(6, Heap::kNew));
       // Trigger a full GC to increase probability of concurrent tasks.
       isolate->heap()->CollectAllGarbage();
-      intptr_t length = graph.RetainingPath(&c, path);
+      intptr_t length = graph.RetainingPath(&c, path).length;
       EXPECT_LE(3, length);
       Array& expected_c = Array::Handle();
       expected_c ^= path.At(0);
@@ -138,4 +140,56 @@
   }
 }
 
+static void WeakHandleFinalizer(void* isolate_callback_data,
+                                Dart_WeakPersistentHandle handle,
+                                void* peer) {}
+
+ISOLATE_UNIT_TEST_CASE(RetainingPathGCRoot) {
+  Dart_PersistentHandle persistent_handle;
+  Dart_WeakPersistentHandle weak_persistent_handle;
+  Array& path = Array::Handle(Array::New(1, Heap::kNew));
+  ObjectGraph graph(thread);
+  Dart_Handle handle = Api::NewHandle(thread, path.raw());
+
+  // GC root should be a local handle
+  auto result = graph.RetainingPath(&path, path);
+  EXPECT_STREQ(result.gc_root_type, "local handle");
+
+  // GC root should now be a weak persistent handle
+  {
+    TransitionVMToNative transition(thread);
+    weak_persistent_handle = Dart_NewWeakPersistentHandle(
+        handle, reinterpret_cast<void*>(0xdeadbeef), 128, WeakHandleFinalizer);
+  }
+  result = graph.RetainingPath(&path, path);
+  EXPECT_STREQ(result.gc_root_type, "weak persistent handle");
+
+  // GC root should now be a persistent handle
+  {
+    TransitionVMToNative transition(thread);
+    persistent_handle = Dart_NewPersistentHandle(handle);
+  }
+  result = graph.RetainingPath(&path, path);
+  EXPECT_STREQ(result.gc_root_type, "persistent handle");
+
+  // Delete the persistent handle. GC root should now be weak persistent handle
+  {
+    TransitionVMToNative transition(thread);
+    Dart_DeletePersistentHandle(persistent_handle);
+    persistent_handle = NULL;
+  }
+  result = graph.RetainingPath(&path, path);
+  EXPECT_STREQ(result.gc_root_type, "weak persistent handle");
+
+  // Delete the weak persistent handle. GC root should now be local handle.
+  {
+    TransitionVMToNative transition(thread);
+    Dart_DeleteWeakPersistentHandle(Api::CastIsolate(thread->isolate()),
+                                    weak_persistent_handle);
+    weak_persistent_handle = NULL;
+  }
+  result = graph.RetainingPath(&path, path);
+  EXPECT_STREQ(result.gc_root_type, "local handle");
+}
+
 }  // namespace dart
diff --git a/runtime/vm/object_ia32_test.cc b/runtime/vm/object_ia32_test.cc
index e8db74d..365bd2f 100644
--- a/runtime/vm/object_ia32_test.cc
+++ b/runtime/vm/object_ia32_test.cc
@@ -16,11 +16,11 @@
 
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
-void GenerateIncrement(Assembler* assembler) {
-  __ movl(EAX, Immediate(0));
+void GenerateIncrement(compiler::Assembler* assembler) {
+  __ movl(EAX, compiler::Immediate(0));
   __ pushl(EAX);
-  __ incl(Address(ESP, 0));
-  __ movl(ECX, Address(ESP, 0));
+  __ incl(compiler::Address(ESP, 0));
+  __ movl(ECX, compiler::Address(ESP, 0));
   __ incl(ECX);
   __ popl(EAX);
   __ movl(EAX, ECX);
@@ -29,7 +29,8 @@
 
 // Generate a dart code sequence that embeds a string object in it.
 // This is used to test Embedded String objects in the instructions.
-void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+void GenerateEmbedStringInCode(compiler::Assembler* assembler,
+                               const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
   __ LoadObject(EAX, string_object);
@@ -38,7 +39,7 @@
 
 // Generate a dart code sequence that embeds a smi object in it.
 // This is used to test Embedded Smi objects in the instructions.
-void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
   __ LoadObject(EAX, smi_object);
   __ ret();
diff --git a/runtime/vm/object_reload.cc b/runtime/vm/object_reload.cc
index 51d3365..fa15e86 100644
--- a/runtime/vm/object_reload.cc
+++ b/runtime/vm/object_reload.cc
@@ -183,13 +183,11 @@
 #endif
 }
 
-void Class::CopyStaticFieldValues(const Class& old_cls) const {
+void Class::CopyStaticFieldValues(IsolateReloadContext* reload_context,
+                                  const Class& old_cls) const {
   // We only update values for non-enum classes.
   const bool update_values = !is_enum_class();
 
-  IsolateReloadContext* reload_context = Isolate::Current()->reload_context();
-  ASSERT(reload_context != NULL);
-
   const Array& old_field_list = Array::Handle(old_cls.fields());
   Field& old_field = Field::Handle();
   String& old_name = String::Handle();
@@ -285,17 +283,15 @@
 //   When an enum value is deleted, we 'become' all references to the 'deleted'
 //   sentinel value. The index value is -1.
 //
-void Class::ReplaceEnum(const Class& old_enum) const {
+void Class::ReplaceEnum(IsolateReloadContext* reload_context,
+                        const Class& old_enum) const {
   // We only do this for finalized enum classes.
   ASSERT(is_enum_class());
   ASSERT(old_enum.is_enum_class());
   ASSERT(is_finalized());
   ASSERT(old_enum.is_finalized());
 
-  Thread* thread = Thread::Current();
-  Zone* zone = thread->zone();
-  IsolateReloadContext* reload_context = Isolate::Current()->reload_context();
-  ASSERT(reload_context != NULL);
+  Zone* zone = Thread::Current()->zone();
 
   Array& enum_fields = Array::Handle(zone);
   Field& field = Field::Handle(zone);
@@ -807,6 +803,7 @@
     const Array& data_array = Array::Handle(
         zone, CachedEmptyICDataArray(num_args, tracking_exactness));
     set_entries(data_array);
+    set_is_megamorphic(false);
     return;
   } else if (rule == kNoRebind || rule == kNSMDispatch) {
     // TODO(30877) we should account for addition/removal of NSM.
diff --git a/runtime/vm/object_service.cc b/runtime/vm/object_service.cc
index 2ba49c8..c070103 100644
--- a/runtime/vm/object_service.cc
+++ b/runtime/vm/object_service.cc
@@ -333,7 +333,7 @@
   if ((kind() == RawFunction::kImplicitGetter) ||
       (kind() == RawFunction::kImplicitSetter) ||
       (kind() == RawFunction::kImplicitStaticGetter) ||
-      (kind() == RawFunction::kStaticFieldInitializer)) {
+      (kind() == RawFunction::kFieldInitializer)) {
     const Field& field = Field::Handle(accessor_field());
     if (!field.IsNull()) {
       jsobj.AddProperty("_field", field);
diff --git a/runtime/vm/object_store.cc b/runtime/vm/object_store.cc
index 8294709..7a6de5f 100644
--- a/runtime/vm/object_store.cc
+++ b/runtime/vm/object_store.cc
@@ -29,7 +29,9 @@
 
 void ObjectStore::VisitObjectPointers(ObjectPointerVisitor* visitor) {
   ASSERT(visitor != NULL);
+  visitor->set_gc_root_type("object store");
   visitor->VisitPointers(from(), to());
+  visitor->clear_gc_root_type();
 }
 
 void ObjectStore::Init(Isolate* isolate) {
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 8e66ed7..386e3dd 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -9,6 +9,7 @@
 #include "vm/class_finalizer.h"
 #include "vm/code_descriptors.h"
 #include "vm/compiler/assembler/assembler.h"
+#include "vm/compiler/compiler_state.h"
 #include "vm/dart_api_impl.h"
 #include "vm/dart_entry.h"
 #include "vm/debugger.h"
@@ -2280,6 +2281,10 @@
 }
 
 ISOLATE_UNIT_TEST_CASE(ContextScope) {
+  // We need an active compiler context to manipulate scopes, since local
+  // variables and slots can be canonicalized in the compiler state.
+  CompilerState compiler_state(Thread::Current());
+
   const intptr_t parent_scope_function_level = 0;
   LocalScope* parent_scope =
       new LocalScope(NULL, parent_scope_function_level, 0);
@@ -2473,9 +2478,9 @@
 
 // Test for Code and Instruction object creation.
 ISOLATE_UNIT_TEST_CASE(Code) {
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
@@ -2495,9 +2500,9 @@
   bool stack_trace_collection_enabled =
       MallocHooks::stack_trace_collection_enabled();
   MallocHooks::set_stack_trace_collection_enabled(false);
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
@@ -2532,9 +2537,9 @@
   bool stack_trace_collection_enabled =
       MallocHooks::stack_trace_collection_enabled();
   MallocHooks::set_stack_trace_collection_enabled(false);
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   const Function& function = Function::Handle(CreateFunction("Test_Code"));
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
@@ -2568,11 +2573,12 @@
 
 // Test for Embedded String object in the instructions.
 ISOLATE_UNIT_TEST_CASE(EmbedStringInCode) {
-  extern void GenerateEmbedStringInCode(Assembler * assembler, const char* str);
+  extern void GenerateEmbedStringInCode(compiler::Assembler * assembler,
+                                        const char* str);
   const char* kHello = "Hello World!";
   word expected_length = static_cast<word>(strlen(kHello));
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateEmbedStringInCode(&_assembler_, kHello);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedStringInCode"));
@@ -2592,10 +2598,11 @@
 
 // Test for Embedded Smi object in the instructions.
 ISOLATE_UNIT_TEST_CASE(EmbedSmiInCode) {
-  extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
+  extern void GenerateEmbedSmiInCode(compiler::Assembler * assembler,
+                                     intptr_t value);
   const intptr_t kSmiTestValue = 5;
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiInCode"));
@@ -2610,10 +2617,11 @@
 #if defined(ARCH_IS_64_BIT)
 // Test for Embedded Smi object in the instructions.
 ISOLATE_UNIT_TEST_CASE(EmbedSmiIn64BitCode) {
-  extern void GenerateEmbedSmiInCode(Assembler * assembler, intptr_t value);
+  extern void GenerateEmbedSmiInCode(compiler::Assembler * assembler,
+                                     intptr_t value);
   const intptr_t kSmiTestValue = DART_INT64_C(5) << 32;
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateEmbedSmiInCode(&_assembler_, kSmiTestValue);
   const Function& function =
       Function::Handle(CreateFunction("Test_EmbedSmiIn64BitCode"));
@@ -2642,9 +2650,9 @@
   exception_handlers.SetHandlerInfo(3, 1, 150u, kNoStackTrace, true,
                                     TokenPosition::kNoSource, true);
 
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
@@ -2684,9 +2692,9 @@
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
 
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
@@ -2747,9 +2755,9 @@
   PcDescriptors& descriptors = PcDescriptors::Handle();
   descriptors ^= builder->FinalizePcDescriptors(0);
 
-  extern void GenerateIncrement(Assembler * assembler);
-  ObjectPoolBuilder object_pool_builder;
-  Assembler _assembler_(&object_pool_builder);
+  extern void GenerateIncrement(compiler::Assembler * assembler);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler _assembler_(&object_pool_builder);
   GenerateIncrement(&_assembler_);
   Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       Function::Handle(CreateFunction("Test_Code")), nullptr, &_assembler_,
diff --git a/runtime/vm/object_x64_test.cc b/runtime/vm/object_x64_test.cc
index fab4bef..259305c 100644
--- a/runtime/vm/object_x64_test.cc
+++ b/runtime/vm/object_x64_test.cc
@@ -16,11 +16,11 @@
 
 // Generate a simple dart code sequence.
 // This is used to test Code and Instruction object creation.
-void GenerateIncrement(Assembler* assembler) {
-  __ movq(RAX, Immediate(0));
+void GenerateIncrement(compiler::Assembler* assembler) {
+  __ movq(RAX, compiler::Immediate(0));
   __ pushq(RAX);
-  __ incq(Address(RSP, 0));
-  __ movq(RCX, Address(RSP, 0));
+  __ incq(compiler::Address(RSP, 0));
+  __ movq(RCX, compiler::Address(RSP, 0));
   __ incq(RCX);
   __ popq(RAX);
   __ movq(RAX, RCX);
@@ -29,7 +29,8 @@
 
 // Generate a dart code sequence that embeds a string object in it.
 // This is used to test Embedded String objects in the instructions.
-void GenerateEmbedStringInCode(Assembler* assembler, const char* str) {
+void GenerateEmbedStringInCode(compiler::Assembler* assembler,
+                               const char* str) {
   const String& string_object =
       String::ZoneHandle(String::New(str, Heap::kOld));
   __ EnterStubFrame();
@@ -40,9 +41,10 @@
 
 // Generate a dart code sequence that embeds a smi object in it.
 // This is used to test Embedded Smi objects in the instructions.
-void GenerateEmbedSmiInCode(Assembler* assembler, intptr_t value) {
+void GenerateEmbedSmiInCode(compiler::Assembler* assembler, intptr_t value) {
   const Smi& smi_object = Smi::ZoneHandle(Smi::New(value));
-  __ movq(RAX, Immediate(reinterpret_cast<int64_t>(smi_object.raw())));
+  __ movq(RAX,
+          compiler::Immediate(reinterpret_cast<int64_t>(smi_object.raw())));
   __ ret();
 }
 
diff --git a/runtime/vm/os_android.cc b/runtime/vm/os_android.cc
index 807b7c9..38168ad 100644
--- a/runtime/vm/os_android.cc
+++ b/runtime/vm/os_android.cc
@@ -25,6 +25,12 @@
 
 namespace dart {
 
+DEFINE_FLAG(bool,
+            android_log_to_stderr,
+            false,
+            "Send Dart VM logs to stdout and stderr instead of the Android "
+            "system logs.");
+
 // Android CodeObservers.
 
 #ifndef PRODUCT
@@ -255,8 +261,12 @@
 void OS::Print(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  // Forward to the Android log for remote access.
-  __android_log_vprint(ANDROID_LOG_INFO, "DartVM", format, args);
+  if (FLAG_android_log_to_stderr) {
+    vfprintf(stderr, format, args);
+  } else {
+    // Forward to the Android log for remote access.
+    __android_log_vprint(ANDROID_LOG_INFO, "DartVM", format, args);
+  }
   va_end(args);
 }
 
@@ -332,8 +342,12 @@
 void OS::PrintErr(const char* format, ...) {
   va_list args;
   va_start(args, format);
-  // Forward to the Android log for remote access.
-  __android_log_vprint(ANDROID_LOG_ERROR, "DartVM", format, args);
+  if (FLAG_android_log_to_stderr) {
+    vfprintf(stderr, format, args);
+  } else {
+    // Forward to the Android log for remote access.
+    __android_log_vprint(ANDROID_LOG_ERROR, "DartVM", format, args);
+  }
   va_end(args);
 }
 
@@ -344,6 +358,7 @@
 void OS::PrepareToAbort() {}
 
 void OS::Abort() {
+  PrepareToAbort();
   abort();
 }
 
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc
index efde807..4eaae29 100644
--- a/runtime/vm/os_fuchsia.cc
+++ b/runtime/vm/os_fuchsia.cc
@@ -285,6 +285,7 @@
 void OS::PrepareToAbort() {}
 
 void OS::Abort() {
+  PrepareToAbort();
   abort();
 }
 
diff --git a/runtime/vm/os_linux.cc b/runtime/vm/os_linux.cc
index fb65cd1..eecf7fd 100644
--- a/runtime/vm/os_linux.cc
+++ b/runtime/vm/os_linux.cc
@@ -665,6 +665,7 @@
 void OS::PrepareToAbort() {}
 
 void OS::Abort() {
+  PrepareToAbort();
   abort();
 }
 
diff --git a/runtime/vm/os_macos.cc b/runtime/vm/os_macos.cc
index ddbd18f..4788b6c 100644
--- a/runtime/vm/os_macos.cc
+++ b/runtime/vm/os_macos.cc
@@ -325,6 +325,7 @@
 void OS::PrepareToAbort() {}
 
 void OS::Abort() {
+  PrepareToAbort();
   abort();
 }
 
diff --git a/runtime/vm/os_thread.h b/runtime/vm/os_thread.h
index ffbbd96..cd17268 100644
--- a/runtime/vm/os_thread.h
+++ b/runtime/vm/os_thread.h
@@ -315,7 +315,7 @@
   static thread_local ThreadState* current_vm_thread_;
 #endif
 
-  friend class Isolate;  // to access set_thread(Thread*).
+  friend class IsolateGroup;  // to access set_thread(Thread*).
   friend class OSThreadIterator;
   friend class ThreadInterrupterWin;
   friend class ThreadInterrupterFuchsia;
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 25ae272..32d3096 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -20,7 +20,6 @@
 DECLARE_FLAG(bool, profile_vm);
 DECLARE_FLAG(bool, profile_vm_allocation);
 DECLARE_FLAG(int, max_profile_depth);
-DECLARE_FLAG(bool, enable_inlining_annotations);
 DECLARE_FLAG(int, optimization_counter_threshold);
 
 // Some tests are written assuming native stack trace profiling is disabled.
@@ -2094,15 +2093,13 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
@@ -2165,21 +2162,17 @@
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
-  // We use the AlwaysInline and NeverInline annotations in this test.
-  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
   // Optimize quickly.
   SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
   SetFlagScope<bool> sfs3(&FLAG_enable_interpreter, false);
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
@@ -2256,28 +2249,26 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @NeverInline\n"
+      "  @pragma('vm:never-inline')\n"
       "  static oats() {\n"
       "    return boo();\n"
       "  }\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
       "}\n"
       "class C {\n"
-      "  @NeverInline bacon() {\n"
+      "  @pragma('vm:never-inline') bacon() {\n"
       "    return fox();\n"
       "  }\n"
-      "  @AlwaysInline fox() {\n"
+      "  @pragma('vm:prefer-inline') fox() {\n"
       "    return B.oats();\n"
       "  }\n"
       "}\n"
@@ -2357,35 +2348,31 @@
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
-  // We use the AlwaysInline and NeverInline annotations in this test.
-  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
   // Optimize quickly.
   SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
   SetFlagScope<bool> sfs3(&FLAG_enable_interpreter, false);
 
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @NeverInline\n"
+      "  @pragma('vm:never-inline')\n"
       "  static oats() {\n"
       "    return boo();\n"
       "  }\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
       "}\n"
       "class C {\n"
-      "  @NeverInline bacon() {\n"
+      "  @pragma('vm:never-inline') bacon() {\n"
       "    return fox();\n"
       "  }\n"
-      "  @AlwaysInline fox() {\n"
+      "  @pragma('vm:prefer-inline') fox() {\n"
       "    return B.oats();\n"
       "  }\n"
       "}\n"
@@ -2479,31 +2466,29 @@
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @NeverInline\n"
+      "  @pragma('vm:never-inline')\n"
       "  static oats() {\n"
       "    return boo();\n"
       "  }\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
       "}\n"
       "class C {\n"
-      "  @NeverInline bacon() {\n"
+      "  @pragma('vm:never-inline') bacon() {\n"
       "    return this + this;\n"
       "  }\n"
-      "  @AlwaysInline operator+(C other) {\n"
+      "  @pragma('vm:prefer-inline') operator+(C other) {\n"
       "    return fox();\n"
       "  }\n"
-      "  @AlwaysInline fox() {\n"
+      "  @pragma('vm:prefer-inline') fox() {\n"
       "    return B.oats();\n"
       "  }\n"
       "}\n"
@@ -2589,38 +2574,34 @@
   EnableProfiler();
   DisableNativeProfileScope dnps;
   DisableBackgroundCompilationScope dbcs;
-  // We use the AlwaysInline and NeverInline annotations in this test.
-  SetFlagScope<bool> sfs(&FLAG_enable_inlining_annotations, true);
   // Optimize quickly.
   SetFlagScope<int> sfs2(&FLAG_optimization_counter_threshold, 5);
   SetFlagScope<bool> sfs3(&FLAG_enable_interpreter, false);
 
   const char* kScript =
-      "const AlwaysInline = 'AlwaysInline';\n"
-      "const NeverInline = 'NeverInline';\n"
       "class A {\n"
       "  var a;\n"
       "  var b;\n"
-      "  @NeverInline A() { }\n"
+      "  @pragma('vm:never-inline') A() { }\n"
       "}\n"
       "class B {\n"
-      "  @NeverInline\n"
+      "  @pragma('vm:never-inline')\n"
       "  static oats() {\n"
       "    return boo();\n"
       "  }\n"
-      "  @AlwaysInline\n"
+      "  @pragma('vm:prefer-inline')\n"
       "  static boo() {\n"
       "    return new A();\n"
       "  }\n"
       "}\n"
       "class C {\n"
-      "  @NeverInline bacon() {\n"
+      "  @pragma('vm:never-inline') bacon() {\n"
       "    return this + this;\n"
       "  }\n"
-      "  @AlwaysInline operator+(C other) {\n"
+      "  @pragma('vm:prefer-inline') operator+(C other) {\n"
       "    return fox();\n"
       "  }\n"
-      "  @AlwaysInline fox() {\n"
+      "  @pragma('vm:prefer-inline') fox() {\n"
       "    return B.oats();\n"
       "  }\n"
       "}\n"
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 029f91a..f951261 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -358,6 +358,10 @@
     return IsFreeListElement() || IsForwardingCorpse();
   }
 
+  intptr_t GetClassId() const {
+    uint32_t tags = ptr()->tags_;
+    return ClassIdTag::decode(tags);
+  }
   intptr_t GetClassIdMayBeSmi() const {
     return IsHeapObject() ? GetClassId() : static_cast<intptr_t>(kSmiCid);
   }
@@ -504,11 +508,6 @@
 
   intptr_t HeapSizeFromClass() const;
 
-  intptr_t GetClassId() const {
-    uint32_t tags = ptr()->tags_;
-    return ClassIdTag::decode(tags);
-  }
-
   void SetClassId(intptr_t new_cid) {
     uint32_t tags = ptr()->tags_;
     ptr()->tags_ = ClassIdTag::update(new_cid, tags);
@@ -660,12 +659,7 @@
   friend class StoreBufferUpdateVisitor;  // RememberCard
   void RememberCard(RawObject* const* slot);
 
-  friend class Api;
-  friend class ApiMessageReader;  // GetClassId
-  friend class Serializer;        // GetClassId
   friend class Array;
-  friend class Become;  // GetClassId
-  friend class CompactorTask;  // GetClassId
   friend class ByteBuffer;
   friend class CidRewriteVisitor;
   friend class Closure;
@@ -681,25 +675,15 @@
   friend class ForwardList;
   friend class GrowableObjectArray;  // StorePointer
   friend class Heap;
-  friend class HeapMapAsJSONVisitor;
   friend class ClassStatsVisitor;
   template <bool>
   friend class MarkingVisitorBase;
   friend class Mint;
   friend class Object;
   friend class OneByteString;  // StoreSmi
-  friend class RawCode;
-  friend class RawExternalTypedData;
-  friend class RawInstructions;
   friend class RawInstance;
-  friend class RawString;
-  friend class RawTypedData;
-  friend class RawTypedDataView;
   friend class Scavenger;
   friend class ScavengerVisitor;
-  friend class SizeExcludingClassVisitor;  // GetClassId
-  friend class InstanceAccumulator;        // GetClassId
-  friend class RetainingPathVisitor;       // GetClassId
   friend class ImageReader;                // tags_ check
   friend class ImageWriter;
   friend class AssemblyImageWriter;
@@ -708,29 +692,17 @@
   friend class Deserializer;
   friend class SnapshotWriter;
   friend class String;
-  friend class Type;                    // GetClassId
-  friend class TypedDataBase;           // GetClassId
-  friend class TypedData;               // GetClassId
-  friend class TypedDataView;           // GetClassId
   friend class WeakProperty;            // StorePointer
   friend class Instance;                // StorePointer
   friend class StackFrame;              // GetCodeObject assertion.
   friend class CodeLookupTableBuilder;  // profiler
-  friend class NativeEntry;             // GetClassId
-  friend class WritePointerVisitor;     // GetClassId
   friend class Interpreter;
   friend class InterpreterHelpers;
   friend class Simulator;
   friend class SimulatorHelpers;
   friend class ObjectLocator;
-  friend class InstanceMorpher;  // GetClassId
-  friend class VerifyCanonicalVisitor;
-  friend class ObjectGraph::Stack;  // GetClassId
-  friend class Precompiler;         // GetClassId
-  friend class ObjectOffsetTrait;   // GetClassId
   friend class WriteBarrierUpdateVisitor;  // CheckHeapPointerStore
   friend class OffsetsTable;
-  friend class RawTransferableTypedData;  // GetClassId
 
   DISALLOW_ALLOCATION();
   DISALLOW_IMPLICIT_CONSTRUCTORS(RawObject);
@@ -861,25 +833,29 @@
 class RawFunction : public RawObject {
  public:
   enum Kind {
-    kRegularFunction,
-    kClosureFunction,
-    kImplicitClosureFunction,
-    kSignatureFunction,  // represents a signature only without actual code.
-    kGetterFunction,     // represents getter functions e.g: get foo() { .. }.
-    kSetterFunction,     // represents setter functions e.g: set foo(..) { .. }.
-    kConstructor,
-    kImplicitGetter,        // represents an implicit getter for fields.
-    kImplicitSetter,        // represents an implicit setter for fields.
-    kImplicitStaticGetter,  // represents an implicit getter for static
-                            // fields with initializers
-    kStaticFieldInitializer,
-    kMethodExtractor,  // converts method into implicit closure on the receiver.
-    kNoSuchMethodDispatcher,  // invokes noSuchMethod.
-    kInvokeFieldDispatcher,   // invokes a field as a closure.
-    kIrregexpFunction,  // represents a generated irregexp matcher function.
-    kDynamicInvocationForwarder,  // represents forwarder which performs type
-                                  // checks for arguments of a dynamic
-                                  // invocation.
+    kRegularFunction,          // an ordinary or operator method
+    kClosureFunction,          // a user-declared closure function
+    kImplicitClosureFunction,  // an implicit closure (i.e., tear-off)
+    kSignatureFunction,        // a signature only without actual code
+    kGetterFunction,           // getter functions e.g: get foo() { .. }
+    kSetterFunction,           // setter functions e.g: set foo(..) { .. }
+    kConstructor,              // a generative (is_static=false) or
+                               // factory (is_static=true) constructor
+    kImplicitGetter,           // an implicit getter for instance fields
+    kImplicitSetter,           // an implicit setter for instance fields
+    kImplicitStaticGetter,     // represents an implicit getter for static
+                               // fields with initializers
+    kFieldInitializer,         // the initialization expression for a static
+                               // or instance field
+    kMethodExtractor,          // return a closure on the receiver for tear-offs
+    kNoSuchMethodDispatcher,   // builds an Invocation and invokes noSuchMethod
+    kInvokeFieldDispatcher,    // invokes a field as a closure (i.e.,
+                               // call-through-getter)
+    kIrregexpFunction,         // a generated irregexp matcher function.
+    kDynamicInvocationForwarder,  // a forwarder which performs type checks for
+                                  // arguments of a dynamic call (i.e., those
+                                  // checks omitted by the caller for interface
+                                  // calls).
     kFfiTrampoline,
   };
 
@@ -1262,12 +1238,13 @@
   RawArray* bytecode_component_;
   RawGrowableObjectArray* potential_natives_;
   RawGrowableObjectArray* potential_pragma_functions_;
-  RawGrowableObjectArray* evaluating_;  // detects cycles
   RawExternalTypedData* constants_table_;
   RawArray* libraries_cache_;
   RawArray* classes_cache_;
   VISIT_TO(RawObject*, classes_cache_);
 
+  uint32_t kernel_binary_version_;
+
   RawObject** to_snapshot(Snapshot::Kind kind) {
     return reinterpret_cast<RawObject**>(&ptr()->constants_table_);
   }
@@ -1462,6 +1439,7 @@
   friend class Function;
   friend class ImageReader;
   friend class ImageWriter;
+  friend class AssemblyImageWriter;
   friend class BlobImageWriter;
 };
 
diff --git a/runtime/vm/raw_object_fields.cc b/runtime/vm/raw_object_fields.cc
index e9113d9..007e59b 100644
--- a/runtime/vm/raw_object_fields.cc
+++ b/runtime/vm/raw_object_fields.cc
@@ -93,7 +93,6 @@
   F(KernelProgramInfo, bytecode_component_)                                    \
   F(KernelProgramInfo, potential_natives_)                                     \
   F(KernelProgramInfo, potential_pragma_functions_)                            \
-  F(KernelProgramInfo, evaluating_)                                            \
   F(KernelProgramInfo, constants_table_)                                       \
   F(KernelProgramInfo, libraries_cache_)                                       \
   F(KernelProgramInfo, classes_cache_)                                         \
diff --git a/runtime/vm/regexp_parser.cc b/runtime/vm/regexp_parser.cc
index 31aff3f..40bf227 100644
--- a/runtime/vm/regexp_parser.cc
+++ b/runtime/vm/regexp_parser.cc
@@ -1901,7 +1901,7 @@
       new (Z) ZoneGrowableArray<CharacterRange>(2);
   bool add_unicode_case_equivalents = is_unicode() && builder->ignore_case();
   while (has_more() && current() != ']') {
-    uint32_t char_1;
+    uint32_t char_1 = 0;
     bool is_class_1 =
         ParseClassEscape(ranges, add_unicode_case_equivalents, &char_1);
     if (current() == '-') {
@@ -1915,7 +1915,7 @@
         ranges->Add(CharacterRange::Singleton('-'));
         break;
       }
-      uint32_t char_2;
+      uint32_t char_2 = 0;
       bool is_class_2 =
           ParseClassEscape(ranges, add_unicode_case_equivalents, &char_2);
       if (is_class_1 || is_class_2) {
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index ff9aa15..26d4946 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -119,13 +119,17 @@
     if (FLAG_lazy_dispatchers) {
       if (is_getter && function.IsNull()) {
         function = cls.LookupDynamicFunction(demangled);
-        if (!function.IsNull() && allow_add) {
-          // We were looking for the getter but found a method with the same
-          // name. Create a method extractor and return it.
-          // The extractor does not exist yet, so using GetMethodExtractor is
-          // not necessary here.
-          function = function.CreateMethodExtractor(function_name);
-          return function.raw();
+        if (!function.IsNull()) {
+          if (allow_add) {
+            // We were looking for the getter but found a method with the same
+            // name. Create a method extractor and return it.
+            // The extractor does not exist yet, so using GetMethodExtractor is
+            // not necessary here.
+            function = function.CreateMethodExtractor(function_name);
+            return function.raw();
+          } else {
+            return Function::null();
+          }
         }
       }
     }
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 2b5d9cf2..1fc7deb 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -54,7 +54,6 @@
 
 DECLARE_FLAG(bool, enable_interpreter);
 DECLARE_FLAG(int, max_deoptimization_counter_threshold);
-DECLARE_FLAG(bool, enable_inlining_annotations);
 DECLARE_FLAG(bool, trace_compiler);
 DECLARE_FLAG(bool, trace_optimizing_compiler);
 DECLARE_FLAG(int, max_polymorphic_checks);
@@ -81,7 +80,7 @@
             "Enable specializing monomorphic calls from unoptimized code.");
 DEFINE_FLAG(bool,
             unopt_megamorphic_calls,
-            false,
+            true,
             "Enable specializing megamorphic calls from unoptimized code.");
 
 DECLARE_FLAG(int, reload_every);
@@ -1122,6 +1121,11 @@
   if (caller_function.unoptimized_code() != caller_code.raw()) {
     return;
   }
+#if !defined(PRODUCT)
+  // Skip functions that contain breakpoints or when debugger is in single
+  // stepping mode.
+  if (Debugger::IsDebugging(thread, caller_function)) return;
+#endif
 
   intptr_t num_checks = ic_data.NumberOfChecks();
 
@@ -1135,6 +1139,12 @@
       return;
     }
 
+    // Avoid forcing foreground compilation if target function is still
+    // interpreted.
+    if (FLAG_enable_interpreter && !target_function.HasCode()) {
+      return;
+    }
+
     const Array& data = Array::Handle(zone, ic_data.entries());
     const Code& target = Code::Handle(zone, target_function.EnsureHasCode());
     CodePatcher::PatchInstanceCallAt(caller_frame->pc(), caller_code, data,
@@ -2136,9 +2146,7 @@
         // Ensure that we have unoptimized code.
         frame->function().EnsureHasCompiledUnoptimizedCode();
       }
-      // TODO(regis): Provide var descriptors in kernel bytecode.
-      const int num_vars =
-          frame->IsInterpreted() ? 0 : frame->NumLocalVariables();
+      const int num_vars = frame->NumLocalVariables();
 #else
       // Variable locations and number are unknown when precompiling.
       const int num_vars = 0;
@@ -2149,7 +2157,7 @@
       }
     }
     if (FLAG_stress_async_stacks) {
-      Debugger::CollectAwaiterReturnStackTrace();
+      isolate->debugger()->CollectAwaiterReturnStackTrace();
     }
     FLAG_stacktrace_every = saved_stacktrace_every;
   }
@@ -2292,6 +2300,46 @@
                ic_data.NumberOfChecks(), function.ToFullyQualifiedCString());
 }
 
+// This is called from interpreter when function usage counter reached
+// compilation threshold and function needs to be compiled.
+DEFINE_RUNTIME_ENTRY(CompileInterpretedFunction, 1) {
+#if !defined(DART_PRECOMPILED_RUNTIME)
+  const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
+  ASSERT(!function.IsNull());
+  ASSERT(FLAG_enable_interpreter);
+
+#if !defined(PRODUCT)
+  if (Debugger::IsDebugging(thread, function)) {
+    return;
+  }
+#endif  // !defined(PRODUCT)
+
+  if (FLAG_background_compilation) {
+    if (!BackgroundCompiler::IsDisabled(isolate,
+                                        /* optimizing_compilation = */ false) &&
+        function.is_background_optimizable()) {
+      // Ensure background compiler is running, if not start it.
+      BackgroundCompiler::Start(isolate);
+      // Reduce the chance of triggering a compilation while the function is
+      // being compiled in the background. INT_MIN should ensure that it
+      // takes long time to trigger a compilation.
+      // Note that the background compilation queue rejects duplicate entries.
+      function.SetUsageCounter(INT_MIN);
+      isolate->background_compiler()->Compile(function);
+      return;
+    }
+  }
+
+  // Reset usage counter for future optimization.
+  function.SetUsageCounter(0);
+  Object& result =
+      Object::Handle(zone, Compiler::CompileFunction(thread, function));
+  ThrowIfError(result);
+#else
+  UNREACHABLE();
+#endif  // !DART_PRECOMPILED_RUNTIME
+}
+
 // This is called from function that needs to be optimized.
 // The requesting function can be already optimized (reoptimization).
 // Returns the Code object where to continue execution.
@@ -2299,25 +2347,10 @@
 #if !defined(DART_PRECOMPILED_RUNTIME)
   const Function& function = Function::CheckedHandle(zone, arguments.ArgAt(0));
   ASSERT(!function.IsNull());
+  ASSERT(function.HasCode());
 
-  // If running with interpreter, do the unoptimized compilation first.
-  const bool optimizing_compilation = function.ShouldCompilerOptimize();
-  ASSERT(FLAG_enable_interpreter || optimizing_compilation);
-  ASSERT((!optimizing_compilation) || function.HasCode() ||
-         function.ForceOptimize());
-
-#if defined(PRODUCT)
-  if (!optimizing_compilation ||
-      Compiler::CanOptimizeFunction(thread, function)) {
-#else
-  if ((!optimizing_compilation && !Debugger::IsDebugging(thread, function)) ||
-      (optimizing_compilation &&
-       Compiler::CanOptimizeFunction(thread, function))) {
-#endif  // defined(PRODUCT)
+  if (Compiler::CanOptimizeFunction(thread, function)) {
     if (FLAG_background_compilation) {
-      if (FLAG_enable_inlining_annotations) {
-        FATAL("Cannot enable inlining annotations and background compilation");
-      }
       Field& field = Field::Handle(zone, isolate->GetDeoptimizingBoxedField());
       while (!field.IsNull()) {
         if (FLAG_trace_optimization || FLAG_trace_field_guards) {
@@ -2328,7 +2361,8 @@
         // Get next field.
         field = isolate->GetDeoptimizingBoxedField();
       }
-      if (!BackgroundCompiler::IsDisabled(isolate, optimizing_compilation) &&
+      if (!BackgroundCompiler::IsDisabled(isolate,
+                                          /* optimizing_compiler = */ true) &&
           function.is_background_optimizable()) {
         // Ensure background compiler is running, if not start it.
         BackgroundCompiler::Start(isolate);
@@ -2337,12 +2371,7 @@
         // takes long time to trigger a compilation.
         // Note that the background compilation queue rejects duplicate entries.
         function.SetUsageCounter(INT_MIN);
-        if (optimizing_compilation) {
-          isolate->optimizing_background_compiler()->Compile(function);
-        } else {
-          ASSERT(FLAG_enable_interpreter);
-          isolate->background_compiler()->Compile(function);
-        }
+        isolate->optimizing_background_compiler()->Compile(function);
         // Continue in the same code.
         arguments.SetReturn(function);
         return;
@@ -2358,12 +2387,8 @@
                   function.ToFullyQualifiedCString());
       }
     }
-    Object& result = Object::Handle(zone);
-    if (optimizing_compilation) {
-      result = Compiler::CompileOptimizedFunction(thread, function);
-    } else {
-      result = Compiler::CompileFunction(thread, function);
-    }
+    Object& result = Object::Handle(
+        zone, Compiler::CompileOptimizedFunction(thread, function));
     ThrowIfError(result);
   }
   arguments.SetReturn(function);
@@ -2998,7 +3023,8 @@
   CHECK_STACK_ALIGNMENT;
   Thread* thread = Thread::Current();
   ASSERT(thread->top_exit_frame_info() != 0);
-  ASSERT(thread->execution_state() == Thread::kThreadInNative);
+
+  ASSERT(thread->execution_state() == Thread::kThreadInVM);
   thread->ExitSafepoint();
 }
 DEFINE_RAW_LEAF_RUNTIME_ENTRY(ExitSafepoint, 0, false, &DFLRT_ExitSafepoint);
diff --git a/runtime/vm/runtime_entry_arm.cc b/runtime/vm/runtime_entry_arm.cc
index 9c7585e..8a38f5d 100644
--- a/runtime/vm/runtime_entry_arm.cc
+++ b/runtime/vm/runtime_entry_arm.cc
@@ -43,17 +43,19 @@
 //   R9 : address of the runtime function to call.
 //   R4 : number of arguments to the call.
 void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry,
-                                Assembler* assembler,
+                                compiler::Assembler* assembler,
                                 intptr_t argument_count) {
   if (runtime_entry->is_leaf()) {
     ASSERT(argument_count == runtime_entry->argument_count());
     __ LoadFromOffset(
         kWord, TMP, THR,
         compiler::target::Thread::OffsetFromThread(runtime_entry));
-    __ str(TMP, Address(THR, compiler::target::Thread::vm_tag_offset()));
+    __ str(TMP,
+           compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     __ blx(TMP);
     __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
-    __ str(TMP, Address(THR, compiler::target::Thread::vm_tag_offset()));
+    __ str(TMP,
+           compiler::Address(THR, compiler::target::Thread::vm_tag_offset()));
     ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
     ASSERT((kAbiPreservedCpuRegs & (1 << PP)) != 0);
   } else {
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 69f902e..83ba08d 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -43,7 +43,7 @@
 //   R5 : address of the runtime function to call.
 //   R4 : number of arguments to the call.
 void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry,
-                                Assembler* assembler,
+                                compiler::Assembler* assembler,
                                 intptr_t argument_count) {
   if (runtime_entry->is_leaf()) {
     ASSERT(argument_count == runtime_entry->argument_count());
@@ -62,11 +62,12 @@
     __ mov(R25, SP);
     __ ReserveAlignedFrameSpace(0);
     __ mov(CSP, SP);
-    __ ldr(TMP, Address(THR, Thread::OffsetFromThread(runtime_entry)));
-    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
+    __ ldr(TMP,
+           compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
+    __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ blr(TMP);
     __ LoadImmediate(TMP, VMTag::kDartCompiledTagId);
-    __ str(TMP, Address(THR, Thread::vm_tag_offset()));
+    __ str(TMP, compiler::Address(THR, Thread::vm_tag_offset()));
     __ mov(SP, R25);
     __ mov(CSP, R23);
     ASSERT((kAbiPreservedCpuRegs & (1 << THR)) != 0);
@@ -74,7 +75,7 @@
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
-    __ ldr(R5, Address(THR, Thread::OffsetFromThread(runtime_entry)));
+    __ ldr(R5, compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
     __ LoadImmediate(R4, argument_count);
     __ BranchLinkToRuntime();
   }
diff --git a/runtime/vm/runtime_entry_dbc.cc b/runtime/vm/runtime_entry_dbc.cc
index b375e8d..c8636a2 100644
--- a/runtime/vm/runtime_entry_dbc.cc
+++ b/runtime/vm/runtime_entry_dbc.cc
@@ -19,7 +19,7 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry,
-                                Assembler* assembler,
+                                compiler::Assembler* assembler,
                                 intptr_t argument_count) {
   UNIMPLEMENTED();
 }
diff --git a/runtime/vm/runtime_entry_ia32.cc b/runtime/vm/runtime_entry_ia32.cc
index 425529c..22f67d7 100644
--- a/runtime/vm/runtime_entry_ia32.cc
+++ b/runtime/vm/runtime_entry_ia32.cc
@@ -28,19 +28,20 @@
 // For leaf calls the caller is responsible to setup the arguments
 // and look for return values based on the C calling convention.
 void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry,
-                                Assembler* assembler,
+                                compiler::Assembler* assembler,
                                 intptr_t argument_count) {
   if (runtime_entry->is_leaf()) {
     ASSERT(argument_count == runtime_entry->argument_count());
-    __ movl(EAX, Immediate(runtime_entry->GetEntryPoint()));
-    __ movl(Assembler::VMTagAddress(), EAX);
+    __ movl(EAX, compiler::Immediate(runtime_entry->GetEntryPoint()));
+    __ movl(compiler::Assembler::VMTagAddress(), EAX);
     __ call(EAX);
-    __ movl(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ movl(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(VMTag::kDartCompiledTagId));
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
-    __ movl(ECX, Immediate(runtime_entry->GetEntryPoint()));
-    __ movl(EDX, Immediate(argument_count));
+    __ movl(ECX, compiler::Immediate(runtime_entry->GetEntryPoint()));
+    __ movl(EDX, compiler::Immediate(argument_count));
     __ CallToRuntime();
   }
 }
diff --git a/runtime/vm/runtime_entry_list.h b/runtime/vm/runtime_entry_list.h
index f5f806b..31bbcb6 100644
--- a/runtime/vm/runtime_entry_list.h
+++ b/runtime/vm/runtime_entry_list.h
@@ -54,6 +54,7 @@
   V(UpdateFieldCid)                                                            \
   V(InitStaticField)                                                           \
   V(CompileFunction)                                                           \
+  V(CompileInterpretedFunction)                                                \
   V(MonomorphicMiss)                                                           \
   V(SingleTargetMiss)                                                          \
   V(UnlinkedCall)
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index b21de64..0ff88f0 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -25,22 +25,25 @@
 //   RBX : address of the runtime function to call.
 //   R10 : number of arguments to the call.
 void RuntimeEntry::CallInternal(const RuntimeEntry* runtime_entry,
-                                Assembler* assembler,
+                                compiler::Assembler* assembler,
                                 intptr_t argument_count) {
   if (runtime_entry->is_leaf()) {
     ASSERT(argument_count == runtime_entry->argument_count());
     COMPILE_ASSERT(CallingConventions::kVolatileCpuRegisters & (1 << RAX));
-    __ movq(RAX, Address(THR, Thread::OffsetFromThread(runtime_entry)));
-    __ movq(Assembler::VMTagAddress(), RAX);
+    __ movq(RAX,
+            compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
+    __ movq(compiler::Assembler::VMTagAddress(), RAX);
     __ CallCFunction(RAX);
-    __ movq(Assembler::VMTagAddress(), Immediate(VMTag::kDartCompiledTagId));
+    __ movq(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(VMTag::kDartCompiledTagId));
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << THR)) != 0);
     ASSERT((CallingConventions::kCalleeSaveCpuRegisters & (1 << PP)) != 0);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
-    __ movq(RBX, Address(THR, Thread::OffsetFromThread(runtime_entry)));
-    __ LoadImmediate(R10, Immediate(argument_count));
+    __ movq(RBX,
+            compiler::Address(THR, Thread::OffsetFromThread(runtime_entry)));
+    __ LoadImmediate(R10, compiler::Immediate(argument_count));
     __ CallToRuntime();
   }
 }
diff --git a/runtime/vm/scopes.cc b/runtime/vm/scopes.cc
index dfdba67..b29e821 100644
--- a/runtime/vm/scopes.cc
+++ b/runtime/vm/scopes.cc
@@ -8,6 +8,8 @@
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
+#if !defined(DART_PRECOMPILED_RUNTIME)
+
 namespace dart {
 
 DEFINE_FLAG(bool,
@@ -34,6 +36,8 @@
       variables_(),
       labels_(),
       context_variables_(),
+      context_slots_(new (Thread::Current()->zone())
+                         ZoneGrowableArray<const Slot*>()),
       referenced_() {
   // Hook this node into the children of the parent, unless the parent has a
   // different function_level, since the local scope of a nested function can
@@ -185,6 +189,8 @@
 void LocalScope::AddContextVariable(LocalVariable* variable) {
   variable->set_index(VariableIndex(context_variables_.length()));
   context_variables_.Add(variable);
+  context_slots_->Add(
+      &Slot::GetContextVariableSlotFor(Thread::Current(), *variable));
 }
 
 VariableIndex LocalScope::AllocateVariables(VariableIndex first_parameter_index,
@@ -708,3 +714,5 @@
 }
 
 }  // namespace dart
+
+#endif  // !defined(DART_PRECOMPILED_RUNTIME)
diff --git a/runtime/vm/scopes.h b/runtime/vm/scopes.h
index b1e0c2c..7a0bde6 100644
--- a/runtime/vm/scopes.h
+++ b/runtime/vm/scopes.h
@@ -10,6 +10,7 @@
 #include "platform/assert.h"
 #include "platform/globals.h"
 #include "vm/allocation.h"
+#include "vm/compiler/backend/slot.h"
 #include "vm/growable_array.h"
 #include "vm/object.h"
 #include "vm/raw_object.h"
@@ -319,6 +320,10 @@
     return context_variables_;
   }
 
+  const ZoneGrowableArray<const Slot*>& context_slots() const {
+    return *context_slots_;
+  }
+
   // The number of variables allocated in the context and belonging to this
   // scope and to its children at the same loop level.
   int num_context_variables() const { return context_variables().length(); }
@@ -463,8 +468,10 @@
   GrowableArray<LocalVariable*> variables_;
   GrowableArray<SourceLabel*> labels_;
 
-  // List of variables allocated into the context which is owned by this scope.
+  // List of variables allocated into the context which is owned by this scope,
+  // and their corresponding Slots.
   GrowableArray<LocalVariable*> context_variables_;
+  ZoneGrowableArray<const Slot*>* context_slots_;
 
   // List of names referenced in this scope and its children that
   // are not resolved to local variables.
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index b39fa23..f5c0619 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -2163,10 +2163,12 @@
                                JSONStream* js) {
   ObjectGraph graph(thread);
   Array& path = Array::Handle(Array::New(limit * 2));
-  intptr_t length = graph.RetainingPath(obj, path);
+  auto result = graph.RetainingPath(obj, path);
+  intptr_t length = result.length;
   JSONObject jsobj(js);
   jsobj.AddProperty("type", "RetainingPath");
   jsobj.AddProperty("length", length);
+  jsobj.AddProperty("gcRootType", result.gc_root_type);
   JSONArray elements(&jsobj, "elements");
   Object& element = Object::Handle();
   Smi& slot_offset = Smi::Handle();
@@ -2175,6 +2177,7 @@
   LinkedHashMap& map = LinkedHashMap::Handle();
   Array& map_data = Array::Handle();
   Field& field = Field::Handle();
+  String& name = String::Handle();
   limit = Utils::Minimum(limit, length);
   for (intptr_t i = 0; i < limit; ++i) {
     JSONObject jselement(&elements);
@@ -2184,7 +2187,6 @@
     // or instance field.
     if (i > 0) {
       slot_offset ^= path.At((i * 2) - 1);
-      jselement.AddProperty("offset", slot_offset.Value());
       if (element.IsArray() || element.IsGrowableObjectArray()) {
         intptr_t element_index =
             slot_offset.Value() - (Array::element_offset(0) >> kWordSizeLog2);
@@ -2209,7 +2211,10 @@
         intptr_t offset = slot_offset.Value();
         if (offset > 0 && offset < element_field_map.Length()) {
           field ^= element_field_map.At(offset);
-          jselement.AddProperty("parentField", field);
+          // TODO(bkonyi): check for mapping between C++ name and Dart name (V8
+          // snapshot writer?)
+          name ^= field.name();
+          jselement.AddProperty("parentField", name.ToCString());
         }
       } else {
         intptr_t element_index = slot_offset.Value();
@@ -2651,11 +2656,12 @@
         klass_name = cls.UserVisibleName();
       }
       library_uri = Library::Handle(zone, cls.library()).url();
-      isStatic = !cls.IsTopLevel();
+      isStatic = true;
     } else {
       const Class& method_cls = Class::Handle(zone, frame->function().origin());
       library_uri = Library::Handle(zone, method_cls.library()).url();
       klass_name = method_cls.UserVisibleName();
+      isStatic = false;
     }
   } else {
     // building scope in the context of a given object
@@ -2676,15 +2682,18 @@
     if (obj.IsLibrary()) {
       const Library& lib = Library::Cast(obj);
       library_uri = lib.url();
+      isStatic = true;
     } else if (obj.IsClass() || ((obj.IsInstance() || obj.IsNull()) &&
                                  !ContainsNonInstance(obj))) {
       Class& cls = Class::Handle(zone);
       if (obj.IsClass()) {
         cls ^= obj.raw();
+        isStatic = true;
       } else {
         Instance& instance = Instance::Handle(zone);
         instance ^= obj.raw();
         cls = instance.clazz();
+        isStatic = false;
       }
       if (cls.id() < kInstanceCid || cls.id() == kTypeArgumentsCid) {
         js->PrintError(
@@ -2802,7 +2811,9 @@
     return true;
   }
 
-  bool is_static = BoolParameter::Parse(js->LookupParam("isStatic"), false);
+  const char* klass = js->LookupParam("klass");
+  bool is_static =
+      BoolParameter::Parse(js->LookupParam("isStatic"), (klass == nullptr));
 
   const GrowableObjectArray& params =
       GrowableObjectArray::Handle(thread->zone(), GrowableObjectArray::New());
@@ -4581,8 +4592,9 @@
     return;
   }
   jsobj.AddProperty("architectureBits", static_cast<intptr_t>(kBitsPerWord));
-  jsobj.AddProperty("targetCPU", CPU::Id());
   jsobj.AddProperty("hostCPU", HostCPUFeatures::hardware());
+  jsobj.AddProperty("operatingSystem", OS::Name());
+  jsobj.AddProperty("targetCPU", CPU::Id());
   jsobj.AddProperty("version", Version::String());
   jsobj.AddProperty("_profilerMode", FLAG_profile_vm ? "VM" : "Dart");
   jsobj.AddProperty64("_nativeZoneMemoryUsage",
@@ -4708,6 +4720,12 @@
       // to notify the ThreadInterrupter to pick up the change.
       Profiler::UpdateSamplePeriod();
     }
+    if (Service::vm_stream.enabled()) {
+      ServiceEvent event(NULL, ServiceEvent::kVMFlagUpdate);
+      event.set_flag_name(flag_name);
+      event.set_flag_new_value(flag_value);
+      Service::HandleEvent(&event);
+    }
     return true;
   } else {
     JSONObject jsobj(js);
@@ -4935,7 +4953,7 @@
     get_flag_list_params },
   { "_getHeapMap", GetHeapMap,
     get_heap_map_params },
-  { "_getInboundReferences", GetInboundReferences,
+  { "getInboundReferences", GetInboundReferences,
     get_inbound_references_params },
   { "getInstances", GetInstances,
     get_instances_params },
@@ -4961,7 +4979,7 @@
     get_reachable_size_params },
   { "_getRetainedSize", GetRetainedSize,
     get_retained_size_params },
-  { "_getRetainingPath", GetRetainingPath,
+  { "getRetainingPath", GetRetainingPath,
     get_retaining_path_params },
   { "getScripts", GetScripts,
     get_scripts_params },
diff --git a/runtime/vm/service.h b/runtime/vm/service.h
index 835282f..972e587 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 21
+#define SERVICE_PROTOCOL_MINOR_VERSION 25
 
 class Array;
 class EmbedderServiceHandler;
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 2dfda77..bf8ba6e 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.21
+# Dart VM Service Protocol 3.25
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.21_ of the Dart VM Service Protocol. This
+This document describes of _version 3.25_ 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.
@@ -33,10 +33,12 @@
   - [getAllocationProfile](#getallocationprofile)
   - [getFlagList](#getflaglist)
   - [getInstances](#getinstances)
+  - [getInboundReferences](#getinboundreferences)
   - [getIsolate](#getisolate)
   - [getMemoryUsage](#getmemoryusage)
-  - [getScripts](#getscripts)
   - [getObject](#getobject)
+  - [getRetainingPath](#getretainingpath)
+  - [getScripts](#getscripts)
   - [getSourceReport](#getsourcereport)
   - [getStack](#getstack)
   - [getVersion](#getversion)
@@ -47,6 +49,7 @@
   - [invoke](#invoke)
   - [pause](#pause)
   - [kill](#kill)
+  - [registerService](#registerService)
   - [reloadSources](#reloadsources)
   - [removeBreakpoint](#removebreakpoint)
   - [resume](#resume)
@@ -80,6 +83,8 @@
   - [FlagList](#flaglist)
   - [Frame](#frame)
   - [Function](#function)
+  - [InboundReferences](#inboundreferences)
+  - [InboundReference](#inboundreference)
   - [Instance](#instance)
   - [InstanceSet](#instanceset)
   - [Isolate](#isolate)
@@ -93,6 +98,8 @@
   - [Object](#object)
   - [ReloadReport](#reloadreport)
   - [Response](#response)
+  - [RetainingObject](#retainingobject)
+  - [RetainingPath](#retainingpath)
   - [Sentinel](#sentinel)
   - [SentinelKind](#sentinelkind)
   - [Script](#script)
@@ -642,6 +649,34 @@
 
 See [FlagList](#flaglist).
 
+### getInboundReferences
+
+```
+InboundReferences|Sentinel getInboundReferences(string isolateId,
+                                                string targetId,
+                                                int limit)
+```
+
+Returns a set of inbound references to the object specified by _targetId_. Up to
+_limit_ references will be returned.
+
+The order of the references is undefined (i.e., not related to allocation order)
+and unstable (i.e., multiple invocations of this method against the same object
+can give different answers even if no Dart code has executed between the invocations).
+
+The references may include multiple `objectId`s that designate the same object.
+
+The references may include objects that are unreachable but have not yet been garbage collected.
+
+If _targetId_ is a temporary id which has expired, then the _Expired_
+[Sentinel](#sentinel) is returned.
+
+If _targetId_ refers to an object which has been collected by the VM's
+garbage collector, then the _Collected_ [Sentinel](#sentinel) is
+returned.
+
+See [InboundReferences](#inboundreferences).
+
 ### getInstances
 
 ```
@@ -650,9 +685,20 @@
                          int limit)
 ```
 
-The _getInstances_ RPC is used to retrieve a set of instances which are of a specific type.
+The _getInstances_ RPC is used to retrieve a set of instances which are of a
+specific class. This does not include instances of subclasses of the given
+class.
 
-_objectId_ is the ID of the `Class` to retrieve instances for. _objectId_ must be the ID of a `Class`, otherwise an error is returned.
+The order of the instances is undefined (i.e., not related to allocation order)
+and unstable (i.e., multiple invocations of this method against the same class
+can give different answers even if no Dart code has executed between the
+invocations).
+
+The set of instances may include objects that are unreachable but have not yet
+been garbage collected.
+
+_objectId_ is the ID of the `Class` to retrieve instances for. _objectId_ must
+be the ID of a `Class`, otherwise an error is returned.
 
 _limit_ is the maximum number of instances to be returned.
 
@@ -728,6 +774,33 @@
 Float32x4List, and Float64x2List.  These parameters are otherwise
 ignored.
 
+### getRetainingPath
+
+```
+RetainingPath getRetainingPath(string isolateId,
+                               string targetId,
+                               int limit)
+```
+
+The _getRetainingPath_ RPC is used to lookup a path from an object specified by
+_targetId_ to a GC root (i.e., the object which is preventing this object from
+being garbage collected).
+
+If _targetId_ refers to a heap object which has been collected by the VM's
+garbage collector, then the _Collected_ [Sentinel](#sentinel) is returned.
+
+If _targetId_ refers to a non-heap object which has been deleted, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
+If the object handle has not expired and the object has not been collected, then
+an [RetainingPath](#retainingpath) will be returned.
+
+The _limit_ parameter specifies the maximum path length to be reported as part
+of the retaining path. If a path is longer than _limit_, it will be truncated at
+the root end of the path.
+
+See [RetainingPath](#retainingpath).
+
 ### getStack
 
 ```
@@ -878,6 +951,21 @@
 
 See [Success](#success).
 
+### registerService
+
+```
+Success registerService(string service, string alias)
+```
+
+Registers a service that can be invoked by other VM service clients, where
+`service` is the name of the service to advertise and `alias` is an alternative
+name for the registered service.
+
+Requests made to the new service will be forwarded to the client which originally
+registered the service.
+
+See [Success](#success).
+
 ### reloadSources
 
 ```
@@ -1064,13 +1152,14 @@
 
 streamId | event types provided
 -------- | -----------
-VM | VMUpdate
+VM | VMUpdate, VMFlagUpdate
 Isolate | IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate, IsolateReload, ServiceExtensionAdded
 Debug | PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted, PauseException, PausePostRequest, Resume, BreakpointAdded, BreakpointResolved, BreakpointRemoved, Inspect, None
 GC | GC
 Extension | Extension
 Timeline | TimelineEvents
 Logging | Logging
+Service | ServiceRegistered, ServiceUnregistered
 
 Additionally, some embedders provide the _Stdout_ and _Stderr_
 streams.  These streams allow the client to subscribe to writes to
@@ -1496,13 +1585,13 @@
   // The isolate with which this event is associated.
   //
   // This is provided for all event kinds except for:
-  //   VMUpdate
+  //   VMUpdate, VMFlagUpdate
   @Isolate isolate [optional];
 
   // The vm with which this event is associated.
   //
   // This is provided for the event kind:
-  //   VMUpdate
+  //   VMUpdate, VMFlagUpdate
   @VM vm [optional];
 
   // The timestamp (in milliseconds since the epoch) associated with this event.
@@ -1598,6 +1687,38 @@
   //
   // This is provided for the Logging event.
   LogRecord logRecord [optional];
+
+  // The service identifier.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  //   ServiceUnregistered
+  String service [optional];
+
+  // The RPC method that should be used to invoke the service.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  //   ServiceUnregistered
+  String method [optional];
+
+  // The alias of the registered service.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  String alias [optional];
+
+  // The name of the changed flag.
+  //
+  // This is provided for the event kinds:
+  //   VMFlagUpdate
+  String flag [optional];
+
+  // The new value of the changed flag.
+  //
+  // This is provided for the event kinds:
+  //   VMFlagUpdate
+  String newValue [optional];
 }
 ```
 
@@ -1615,6 +1736,9 @@
   // to notify of changes to the VM debugging name via setVMName.
   VMUpdate,
 
+  // Notification that a VM flag has been changed via the service protocol.
+  VMFlagUpdate,
+
   // Notification that a new isolate has started.
   IsolateStart,
 
@@ -1683,6 +1807,14 @@
 
   // Event from dart:developer.log.
   Logging
+
+   // Notification that a Service has been registered into the Service Protocol
+  // from another client.
+  ServiceRegistered,
+
+  // Notification that a Service has been removed from the Service Protocol
+  // from another client.
+  ServiceUnregistered
 }
 ```
 
@@ -2325,6 +2457,35 @@
 
 An _Isolate_ object provides information about one isolate in the VM.
 
+### InboundReferences
+
+```
+class InboundReferences extends Response {
+  // An array of inbound references to an object.
+  InboundReference[] references;
+}
+```
+
+See [getInboundReferences](#getinboundreferences).
+
+### InboundReference
+
+```
+class InboundReference {
+  // The object holding the inbound reference.
+  @Object source;
+
+  // If source is a List, parentListIndex is the index of the inbound reference.
+  int parentListIndex [optional];
+
+  // If source is a field of an object, parentField is the field containing the
+  // inbound reference.
+  @Field parentField [optional];
+}
+```
+
+See [getInboundReferences](#getinboundreferences).
+
 ### InstanceSet
 
 ```
@@ -2469,7 +2630,7 @@
 }
 ```
 
-An _MemoryUsage_ object provides heap usage information for a specific
+A _MemoryUsage_ object provides heap usage information for a specific
 isolate at a given point in time.
 
 ### Message
@@ -2584,6 +2745,51 @@
 }
 ```
 
+### RetainingObject
+
+```
+class RetainingObject {
+  // An object that is part of a retaining path.
+  @Object value;
+
+  // The offset of the retaining object in a containing list.
+  int parentListIndex [optional];
+
+  // The key mapping to the retaining object in a containing map.
+  @Object parentMapKey [optional];
+
+  // The name of the field containing the retaining object within an object.
+  string parentField [optional];
+}
+```
+
+See [RetainingPath](#retainingpath).
+
+### RetainingPath
+
+```
+class RetainingPath extends Response {
+  // The length of the retaining path.
+  int length;
+
+  // The type of GC root which is holding a reference to the specified object.
+  // Possible values include:
+  //  * class table
+  //  * local handle
+  //  * persistent handle
+  //  * stack
+  //  * user global
+  //  * weak persistent handle
+  //  * unknown
+  string gcRootType;
+
+  // The chain of objects which make up the retaining path.
+  RetainingObject[] elements;
+}
+```
+
+See [getRetainingPath](#getretainingpath).
+
 ### Response
 
 ```
@@ -3031,12 +3237,15 @@
   // Word length on target architecture (e.g. 32, 64).
   int architectureBits;
 
-  // The CPU we are generating code for.
-  string targetCPU;
-
   // The CPU we are actually running on.
   string hostCPU;
 
+  // The operating system we are running on.
+  string operatingSystem;
+
+  // The CPU we are generating code for.
+  string targetCPU;
+
   // The Dart VM version string.
   string version;
 
@@ -3081,5 +3290,9 @@
 3.19 | Add 'clearVMTimeline', 'getVMTimeline', 'getVMTimelineFlags', 'setVMTimelineFlags', 'Timeline', and 'TimelineFlags'.
 3.20 | Add 'getInstances' RPC and 'InstanceSet' object.
 3.21 | Add 'getVMTimelineMicros' RPC and 'Timestamp' object.
+3.22 | Add `registerService` RPC, `Service` stream, and `ServiceRegistered` and `ServiceUnregistered` event kinds.
+3.23 | Add `VMFlagUpdate` event kind to the `VM` stream.
+3.24 | Add `operatingSystem` property to `VM` object.
+3.25 | Add 'getInboundReferences', 'getRetainingPath' RPCs, and 'InboundReferences', 'InboundReference', 'RetainingPath', and 'RetainingObject' objects.
 
 [discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service/service_dev.md b/runtime/vm/service/service_dev.md
index 04fd1e9..4c69a3c 100644
--- a/runtime/vm/service/service_dev.md
+++ b/runtime/vm/service/service_dev.md
@@ -1,8 +1,8 @@
-# Dart VM Service Protocol 3.22-dev
+# Dart VM Service Protocol 3.26-dev
 
 > Please post feedback to the [observatory-discuss group][discuss-list]
 
-This document describes of _version 3.22-dev_ of the Dart VM Service Protocol. This
+This document describes of _version 3.26-dev_ 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.
@@ -33,10 +33,12 @@
   - [getAllocationProfile](#getallocationprofile)
   - [getFlagList](#getflaglist)
   - [getInstances](#getinstances)
+  - [getInboundReferences](#getinboundreferences)
   - [getIsolate](#getisolate)
   - [getMemoryUsage](#getmemoryusage)
-  - [getScripts](#getscripts)
   - [getObject](#getobject)
+  - [getRetainingPath](#getretainingpath)
+  - [getScripts](#getscripts)
   - [getSourceReport](#getsourcereport)
   - [getStack](#getstack)
   - [getVersion](#getversion)
@@ -47,6 +49,7 @@
   - [invoke](#invoke)
   - [pause](#pause)
   - [kill](#kill)
+  - [registerService](#registerService)
   - [reloadSources](#reloadsources)
   - [removeBreakpoint](#removebreakpoint)
   - [resume](#resume)
@@ -80,6 +83,8 @@
   - [FlagList](#flaglist)
   - [Frame](#frame)
   - [Function](#function)
+  - [InboundReferences](#inboundreferences)
+  - [InboundReference](#inboundreference)
   - [Instance](#instance)
   - [InstanceSet](#instanceset)
   - [Isolate](#isolate)
@@ -93,6 +98,8 @@
   - [Object](#object)
   - [ReloadReport](#reloadreport)
   - [Response](#response)
+  - [RetainingObject](#retainingobject)
+  - [RetainingPath](#retainingpath)
   - [Sentinel](#sentinel)
   - [SentinelKind](#sentinelkind)
   - [Script](#script)
@@ -642,6 +649,34 @@
 
 See [FlagList](#flaglist).
 
+### getInboundReferences
+
+```
+InboundReferences|Sentinel getInboundReferences(string isolateId,
+                                                string targetId,
+                                                int limit)
+```
+
+Returns a set of inbound references to the object specified by _targetId_. Up to
+_limit_ references will be returned.
+
+The order of the references is undefined (i.e., not related to allocation order)
+and unstable (i.e., multiple invocations of this method against the same object
+can give different answers even if no Dart code has executed between the invocations).
+
+The references may include multiple `objectId`s that designate the same object.
+
+The references may include objects that are unreachable but have not yet been garbage collected.
+
+If _targetId_ is a temporary id which has expired, then the _Expired_
+[Sentinel](#sentinel) is returned.
+
+If _targetId_ refers to an object which has been collected by the VM's
+garbage collector, then the _Collected_ [Sentinel](#sentinel) is
+returned.
+
+See [InboundReferences](#inboundreferences).
+
 ### getInstances
 
 ```
@@ -650,9 +685,20 @@
                          int limit)
 ```
 
-The _getInstances_ RPC is used to retrieve a set of instances which are of a specific type.
+The _getInstances_ RPC is used to retrieve a set of instances which are of a
+specific class. This does not include instances of subclasses of the given
+class.
 
-_objectId_ is the ID of the `Class` to retrieve instances for. _objectId_ must be the ID of a `Class`, otherwise an error is returned.
+The order of the instances is undefined (i.e., not related to allocation order)
+and unstable (i.e., multiple invocations of this method against the same class
+can give different answers even if no Dart code has executed between the
+invocations).
+
+The set of instances may include objects that are unreachable but have not yet
+been garbage collected.
+
+_objectId_ is the ID of the `Class` to retrieve instances for. _objectId_ must
+be the ID of a `Class`, otherwise an error is returned.
 
 _limit_ is the maximum number of instances to be returned.
 
@@ -728,6 +774,33 @@
 Float32x4List, and Float64x2List.  These parameters are otherwise
 ignored.
 
+### getRetainingPath
+
+```
+RetainingPath getRetainingPath(string isolateId,
+                               string targetId,
+                               int limit)
+```
+
+The _getRetainingPath_ RPC is used to lookup a path from an object specified by
+_targetId_ to a GC root (i.e., the object which is preventing this object from
+being garbage collected).
+
+If _targetId_ refers to a heap object which has been collected by the VM's
+garbage collector, then the _Collected_ [Sentinel](#sentinel) is returned.
+
+If _targetId_ refers to a non-heap object which has been deleted, then the
+_Collected_ [Sentinel](#sentinel) is returned.
+
+If the object handle has not expired and the object has not been collected, then
+an [RetainingPath](#retainingpath) will be returned.
+
+The _limit_ parameter specifies the maximum path length to be reported as part
+of the retaining path. If a path is longer than _limit_, it will be truncated at
+the root end of the path.
+
+See [RetainingPath](#retainingpath).
+
 ### getStack
 
 ```
@@ -878,6 +951,21 @@
 
 See [Success](#success).
 
+### registerService
+
+```
+Success registerService(string service, string alias)
+```
+
+Registers a service that can be invoked by other VM service clients, where
+`service` is the name of the service to advertise and `alias` is an alternative
+name for the registered service.
+
+Requests made to the new service will be forwarded to the client which originally
+registered the service.
+
+See [Success](#success).
+
 ### reloadSources
 
 ```
@@ -1064,13 +1152,14 @@
 
 streamId | event types provided
 -------- | -----------
-VM | VMUpdate
+VM | VMUpdate, VMFlagUpdate
 Isolate | IsolateStart, IsolateRunnable, IsolateExit, IsolateUpdate, IsolateReload, ServiceExtensionAdded
 Debug | PauseStart, PauseExit, PauseBreakpoint, PauseInterrupted, PauseException, PausePostRequest, Resume, BreakpointAdded, BreakpointResolved, BreakpointRemoved, Inspect, None
 GC | GC
 Extension | Extension
 Timeline | TimelineEvents
 Logging | Logging
+Service | ServiceRegistered, ServiceUnregistered
 
 Additionally, some embedders provide the _Stdout_ and _Stderr_
 streams.  These streams allow the client to subscribe to writes to
@@ -1496,13 +1585,13 @@
   // The isolate with which this event is associated.
   //
   // This is provided for all event kinds except for:
-  //   VMUpdate
+  //   VMUpdate, VMFlagUpdate
   @Isolate isolate [optional];
 
   // The vm with which this event is associated.
   //
   // This is provided for the event kind:
-  //   VMUpdate
+  //   VMUpdate, VMFlagUpdate
   @VM vm [optional];
 
   // The timestamp (in milliseconds since the epoch) associated with this event.
@@ -1598,6 +1687,38 @@
   //
   // This is provided for the Logging event.
   LogRecord logRecord [optional];
+
+  // The service identifier.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  //   ServiceUnregistered
+  String service [optional];
+
+  // The RPC method that should be used to invoke the service.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  //   ServiceUnregistered
+  String method [optional];
+
+  // The alias of the registered service.
+  //
+  // This is provided for the event kinds:
+  //   ServiceRegistered
+  String alias [optional];
+
+  // The name of the changed flag.
+  //
+  // This is provided for the event kinds:
+  //   VMFlagUpdate
+  String flag [optional];
+
+  // The new value of the changed flag.
+  //
+  // This is provided for the event kinds:
+  //   VMFlagUpdate
+  String newValue [optional];
 }
 ```
 
@@ -1615,6 +1736,9 @@
   // to notify of changes to the VM debugging name via setVMName.
   VMUpdate,
 
+  // Notification that a VM flag has been changed via the service protocol.
+  VMFlagUpdate,
+
   // Notification that a new isolate has started.
   IsolateStart,
 
@@ -1683,6 +1807,14 @@
 
   // Event from dart:developer.log.
   Logging
+
+   // Notification that a Service has been registered into the Service Protocol
+  // from another client.
+  ServiceRegistered,
+
+  // Notification that a Service has been removed from the Service Protocol
+  // from another client.
+  ServiceUnregistered
 }
 ```
 
@@ -2325,6 +2457,35 @@
 
 An _Isolate_ object provides information about one isolate in the VM.
 
+### InboundReferences
+
+```
+class InboundReferences extends Response {
+  // An array of inbound references to an object.
+  InboundReference[] references;
+}
+```
+
+See [getInboundReferences](#getinboundreferences).
+
+### InboundReference
+
+```
+class InboundReference {
+  // The object holding the inbound reference.
+  @Object source;
+
+  // If source is a List, parentListIndex is the index of the inbound reference.
+  int parentListIndex [optional];
+
+  // If source is a field of an object, parentField is the field containing the
+  // inbound reference.
+  @Field parentField [optional];
+}
+```
+
+See [getInboundReferences](#getinboundreferences).
+
 ### InstanceSet
 
 ```
@@ -2469,7 +2630,7 @@
 }
 ```
 
-An _MemoryUsage_ object provides heap usage information for a specific
+A _MemoryUsage_ object provides heap usage information for a specific
 isolate at a given point in time.
 
 ### Message
@@ -2584,6 +2745,51 @@
 }
 ```
 
+### RetainingObject
+
+```
+class RetainingObject {
+  // An object that is part of a retaining path.
+  @Object value;
+
+  // The offset of the retaining object in a containing list.
+  int parentListIndex [optional];
+
+  // The key mapping to the retaining object in a containing map.
+  @Object parentMapKey [optional];
+
+  // The name of the field containing the retaining object within an object.
+  string parentField [optional];
+}
+```
+
+See [RetainingPath](#retainingpath).
+
+### RetainingPath
+
+```
+class RetainingPath extends Response {
+  // The length of the retaining path.
+  int length;
+
+  // The type of GC root which is holding a reference to the specified object.
+  // Possible values include:
+  //  * class table
+  //  * local handle
+  //  * persistent handle
+  //  * stack
+  //  * user global
+  //  * weak persistent handle
+  //  * unknown
+  string gcRootType;
+
+  // The chain of objects which make up the retaining path.
+  RetainingObject[] elements;
+}
+```
+
+See [getRetainingPath](#getretainingpath).
+
 ### Response
 
 ```
@@ -3031,12 +3237,15 @@
   // Word length on target architecture (e.g. 32, 64).
   int architectureBits;
 
-  // The CPU we are generating code for.
-  string targetCPU;
-
   // The CPU we are actually running on.
   string hostCPU;
 
+  // The operating system we are running on.
+  string operatingSystem;
+
+  // The CPU we are generating code for.
+  string targetCPU;
+
   // The Dart VM version string.
   string version;
 
@@ -3081,5 +3290,9 @@
 3.19 | Add 'clearVMTimeline', 'getVMTimeline', 'getVMTimelineFlags', 'setVMTimelineFlags', 'Timeline', and 'TimelineFlags'.
 3.20 | Add 'getInstances' RPC and 'InstanceSet' object.
 3.21 | Add 'getVMTimelineMicros' RPC and 'Timestamp' object.
+3.22 | Add `registerService` RPC, `Service` stream, and `ServiceRegistered` and `ServiceUnregistered` event kinds.
+3.23 | Add `VMFlagUpdate` event kind to the `VM` stream.
+3.24 | Add `operatingSystem` property to `VM` object.
+3.25 | Add 'getInboundReferences', 'getRetainingPath' RPCs, and 'InboundReferences', 'InboundReference', 'RetainingPath', and 'RetainingObject' objects.
 
 [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 66ee578..1587330 100644
--- a/runtime/vm/service_event.cc
+++ b/runtime/vm/service_event.cc
@@ -15,6 +15,8 @@
 ServiceEvent::ServiceEvent(Isolate* isolate, EventKind event_kind)
     : isolate_(isolate),
       kind_(event_kind),
+      flag_name_(NULL),
+      flag_new_value_(NULL),
       embedder_kind_(NULL),
       embedder_stream_id_(NULL),
       breakpoint_(NULL),
@@ -52,6 +54,8 @@
   switch (kind()) {
     case kVMUpdate:
       return "VMUpdate";
+    case kVMFlagUpdate:
+      return "VMFlagUpdate";
     case kIsolateStart:
       return "IsolateStart";
     case kIsolateRunnable:
@@ -113,6 +117,7 @@
 const StreamInfo* ServiceEvent::stream_info() const {
   switch (kind()) {
     case kVMUpdate:
+    case kVMFlagUpdate:
       return &Service::vm_stream;
 
     case kIsolateStart:
@@ -173,6 +178,10 @@
 void ServiceEvent::PrintJSON(JSONStream* js) const {
   JSONObject jsobj(js);
   PrintJSONHeader(&jsobj);
+  if (kind() == kVMFlagUpdate) {
+    jsobj.AddProperty("flag", flag_name());
+    jsobj.AddProperty("new_value", flag_new_value());
+  }
   if (kind() == kIsolateReload) {
     if (reload_error_ == NULL) {
       jsobj.AddProperty("status", "success");
diff --git a/runtime/vm/service_event.h b/runtime/vm/service_event.h
index 2a267f9..c60e1d2 100644
--- a/runtime/vm/service_event.h
+++ b/runtime/vm/service_event.h
@@ -22,7 +22,8 @@
 class ServiceEvent {
  public:
   enum EventKind {
-    kVMUpdate,  // VM identity information has changed
+    kVMUpdate,      // VM identity information has changed
+    kVMFlagUpdate,  // VM flags updated
 
     kIsolateStart,           // New isolate has started
     kIsolateRunnable,        // Isolate is ready to run
@@ -98,6 +99,12 @@
     }
   }
 
+  const char* flag_name() const { return flag_name_; }
+  void set_flag_name(const char* flag) { flag_name_ = flag; }
+
+  const char* flag_new_value() const { return flag_new_value_; }
+  void set_flag_new_value(const char* value) { flag_new_value_ = value; }
+
   const char* embedder_kind() const { return embedder_kind_; }
 
   const char* KindAsCString() const;
@@ -214,6 +221,8 @@
  private:
   Isolate* isolate_;
   EventKind kind_;
+  const char* flag_name_;
+  const char* flag_new_value_;
   const char* embedder_kind_;
   const char* embedder_stream_id_;
   Breakpoint* breakpoint_;
diff --git a/runtime/vm/service_isolate.cc b/runtime/vm/service_isolate.cc
index d76e551..a0206b5 100644
--- a/runtime/vm/service_isolate.cc
+++ b/runtime/vm/service_isolate.cc
@@ -73,7 +73,7 @@
 }
 
 const char* ServiceIsolate::kName = DART_VM_SERVICE_ISOLATE_NAME;
-Dart_IsolateCreateCallback ServiceIsolate::create_callback_ = NULL;
+Dart_IsolateGroupCreateCallback ServiceIsolate::create_group_callback_ = NULL;
 Monitor* ServiceIsolate::monitor_ = new Monitor();
 ServiceIsolate::State ServiceIsolate::state_ = ServiceIsolate::kStopped;
 Isolate* ServiceIsolate::isolate_ = NULL;
@@ -143,6 +143,10 @@
 
 Dart_Port ServiceIsolate::WaitForLoadPort() {
   VMTagScope tagScope(Thread::Current(), VMTag::kLoadWaitTagId);
+  return WaitForLoadPortInternal();
+}
+
+Dart_Port ServiceIsolate::WaitForLoadPortInternal() {
   MonitorLocker ml(monitor_);
   while (state_ == kStarting && (load_port_ == ILLEGAL_PORT)) {
     ml.Wait();
@@ -185,6 +189,7 @@
   request.value.as_array.values = request_array;
   request.value.as_array.length = ARRAY_SIZE(request_array);
 
+  ServiceIsolate::WaitForLoadPortInternal();
   return Dart_PostCObject(ServiceIsolate::Port(), &request);
 }
 
@@ -330,16 +335,15 @@
     char* error = NULL;
     Isolate* isolate = NULL;
 
-    Dart_IsolateCreateCallback create_callback =
-        ServiceIsolate::create_callback();
-    ASSERT(create_callback != NULL);
+    const auto create_group_callback = ServiceIsolate::create_group_callback();
+    ASSERT(create_group_callback != NULL);
 
     Dart_IsolateFlags api_flags;
     Isolate::FlagsInitialize(&api_flags);
 
     isolate = reinterpret_cast<Isolate*>(
-        create_callback(ServiceIsolate::kName, ServiceIsolate::kName, NULL,
-                        NULL, &api_flags, NULL, &error));
+        create_group_callback(ServiceIsolate::kName, ServiceIsolate::kName,
+                              NULL, NULL, &api_flags, NULL, &error));
     if (isolate == NULL) {
       if (FLAG_trace_service) {
         OS::PrintErr(DART_VM_SERVICE_ISOLATE_NAME
@@ -381,7 +385,6 @@
     }
     Isolate* I = reinterpret_cast<Isolate*>(parameter);
     ASSERT(ServiceIsolate::IsServiceIsolate(I));
-    I->WaitForOutstandingSpawns();
     {
       // Print the error if there is one.  This may execute dart code to
       // print the exception object, so we need to use a StartIsolateScope.
@@ -389,6 +392,7 @@
       StartIsolateScope start_scope(I);
       Thread* T = Thread::Current();
       ASSERT(I == T->isolate());
+      I->WaitForOutstandingSpawns();
       StackZone zone(T);
       HandleScope handle_scope(T);
       Error& error = Error::Handle(Z);
@@ -478,8 +482,8 @@
   }
   // Grab the isolate create callback here to avoid race conditions with tests
   // that change this after Dart_Initialize returns.
-  create_callback_ = Isolate::CreateCallback();
-  if (create_callback_ == NULL) {
+  create_group_callback_ = Isolate::CreateGroupCallback();
+  if (create_group_callback_ == NULL) {
     ServiceIsolate::InitializingFailed();
     return;
   }
diff --git a/runtime/vm/service_isolate.h b/runtime/vm/service_isolate.h
index ab08649..25cef69 100644
--- a/runtime/vm/service_isolate.h
+++ b/runtime/vm/service_isolate.h
@@ -57,6 +57,9 @@
  private:
   static void KillServiceIsolate();
 
+  // Does not need a current thread.
+  static Dart_Port WaitForLoadPortInternal();
+
  protected:
   static void SetServicePort(Dart_Port port);
   static void SetServiceIsolate(Isolate* isolate);
@@ -65,11 +68,11 @@
   static void FinishedInitializing();
   static void InitializingFailed();
   static void MaybeMakeServiceIsolate(Isolate* isolate);
-  static Dart_IsolateCreateCallback create_callback() {
-    return create_callback_;
+  static Dart_IsolateGroupCreateCallback create_group_callback() {
+    return create_group_callback_;
   }
 
-  static Dart_IsolateCreateCallback create_callback_;
+  static Dart_IsolateGroupCreateCallback create_group_callback_;
   static Monitor* monitor_;
   enum State {
     kStopped,
diff --git a/runtime/vm/signal_handler_android.cc b/runtime/vm/signal_handler_android.cc
index c466ebd..f9f6944 100644
--- a/runtime/vm/signal_handler_android.cc
+++ b/runtime/vm/signal_handler_android.cc
@@ -95,8 +95,7 @@
 }
 
 void SignalHandler::InstallImpl(SignalAction action) {
-  struct sigaction act;
-  memset(&act, 0, sizeof(act));
+  struct sigaction act = {};
   act.sa_sigaction = action;
   sigemptyset(&act.sa_mask);
   act.sa_flags = SA_RESTART | SA_SIGINFO;
@@ -107,8 +106,7 @@
 void SignalHandler::Remove() {
   // Ignore future SIGPROF signals because by default SIGPROF will terminate
   // the process and we may have some signals in flight.
-  struct sigaction act;
-  memset(&act, 0, sizeof(act));
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   sigemptyset(&act.sa_mask);
   int r = sigaction(SIGPROF, &act, NULL);
diff --git a/runtime/vm/signal_handler_linux.cc b/runtime/vm/signal_handler_linux.cc
index 3712901..a9cb30b 100644
--- a/runtime/vm/signal_handler_linux.cc
+++ b/runtime/vm/signal_handler_linux.cc
@@ -95,7 +95,7 @@
 }
 
 void SignalHandler::InstallImpl(SignalAction action) {
-  struct sigaction act;
+  struct sigaction act = {};
   act.sa_handler = NULL;
   act.sa_sigaction = action;
   sigemptyset(&act.sa_mask);
@@ -107,7 +107,7 @@
 void SignalHandler::Remove() {
   // Ignore future SIGPROF signals because by default SIGPROF will terminate
   // the process and we may have some signals in flight.
-  struct sigaction act;
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   sigemptyset(&act.sa_mask);
   act.sa_flags = 0;
diff --git a/runtime/vm/signal_handler_macos.cc b/runtime/vm/signal_handler_macos.cc
index 8167b81..081a947 100644
--- a/runtime/vm/signal_handler_macos.cc
+++ b/runtime/vm/signal_handler_macos.cc
@@ -91,7 +91,7 @@
 }
 
 void SignalHandler::InstallImpl(SignalAction action) {
-  struct sigaction act;
+  struct sigaction act = {};
   act.sa_handler = NULL;
   act.sa_sigaction = action;
   sigemptyset(&act.sa_mask);
@@ -103,7 +103,7 @@
 void SignalHandler::Remove() {
   // Ignore future SIGPROF signals because by default SIGPROF will terminate
   // the process and we may have some signals in flight.
-  struct sigaction act;
+  struct sigaction act = {};
   act.sa_handler = SIG_IGN;
   sigemptyset(&act.sa_mask);
   act.sa_flags = 0;
diff --git a/runtime/vm/simulator_dbc.cc b/runtime/vm/simulator_dbc.cc
index 2a7176d..619c72e 100644
--- a/runtime/vm/simulator_dbc.cc
+++ b/runtime/vm/simulator_dbc.cc
@@ -1853,8 +1853,16 @@
 
       Exit(thread, FP, SP, pc);
       {
-        TransitionGeneratedToNative transition(thread);
+        thread->set_execution_state(Thread::kThreadInNative);
+        thread->EnterSafepoint();
+
         FfiTrampolineCall(marshalled_args_data);
+
+        // We set the execution state to kThreadInVM before waiting for the
+        // safepoint to end for the benefit of tests like ffi/function_gc_test.
+        thread->set_execution_state(Thread::kThreadInVM);
+        thread->ExitSafepoint();
+        thread->set_execution_state(Thread::kThreadInGenerated);
       }
 
       const Representation result_rep = sig_desc.ResultRepresentation();
diff --git a/runtime/vm/source_report.cc b/runtime/vm/source_report.cc
index 0a79bd9..fa73bb2 100644
--- a/runtime/vm/source_report.cc
+++ b/runtime/vm/source_report.cc
@@ -96,7 +96,7 @@
     case RawFunction::kClosureFunction:
     case RawFunction::kImplicitClosureFunction:
     case RawFunction::kImplicitStaticGetter:
-    case RawFunction::kStaticFieldInitializer:
+    case RawFunction::kFieldInitializer:
     case RawFunction::kGetterFunction:
     case RawFunction::kSetterFunction:
     case RawFunction::kConstructor:
@@ -340,13 +340,39 @@
     const Bytecode& bytecode = Bytecode::Handle(func.bytecode());
     ASSERT(!bytecode.IsNull());
     kernel::BytecodeSourcePositionsIterator iter(zone(), bytecode);
-    while (iter.MoveNext()) {
-      const TokenPosition token_pos = iter.TokenPos();
-      if ((token_pos < begin_pos) || (token_pos > end_pos)) {
-        // Does not correspond to a valid source position.
-        continue;
+    intptr_t token_offset = -1;
+    uword pc_offset = kUwordMax;
+    // Ignore all possible breakpoint positions until the first DebugCheck
+    // opcode of the function.
+    const uword debug_check_pc = bytecode.GetFirstDebugCheckOpcodePc();
+    if (debug_check_pc != 0) {
+      const uword debug_check_pc_offset =
+          debug_check_pc - bytecode.PayloadStart();
+      while (iter.MoveNext()) {
+        if (pc_offset != kUwordMax) {
+          // Check that there is at least one 'debug checked' opcode in the last
+          // source position range.
+          if (bytecode.GetDebugCheckedOpcodeReturnAddress(
+                  pc_offset, iter.PcOffset()) != 0) {
+            possible[token_offset] = true;
+          }
+          pc_offset = kUwordMax;
+        }
+        const TokenPosition token_pos = iter.TokenPos();
+        if ((token_pos < begin_pos) || (token_pos > end_pos)) {
+          // Does not correspond to a valid source position.
+          continue;
+        }
+        if (iter.PcOffset() < debug_check_pc_offset) {
+          // No breakpoints in prologue.
+          continue;
+        }
+        pc_offset = iter.PcOffset();
+        token_offset = token_pos.Pos() - begin_pos.Pos();
       }
-      intptr_t token_offset = token_pos.Pos() - begin_pos.Pos();
+    }
+    if (pc_offset != kUwordMax && bytecode.GetDebugCheckedOpcodeReturnAddress(
+                                      pc_offset, bytecode.Size()) != 0) {
       possible[token_offset] = true;
     }
   } else {
@@ -447,7 +473,12 @@
   Code& code = Code::Handle(zone(), func.unoptimized_code());
   Bytecode& bytecode = Bytecode::Handle(zone());
 #if !defined(DART_PRECOMPILED_RUNTIME)
-  if (FLAG_enable_interpreter && code.IsNull() && func.HasBytecode()) {
+  if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
+    // When the bytecode of a function is loaded, the function code is not null,
+    // but pointing to the stub to interpret the bytecode. The various Print
+    // functions below take code as an argument and know to process the bytecode
+    // if code is null.
+    code = Code::null();  // Ignore installed stub to interpret bytecode.
     bytecode = func.bytecode();
   }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -467,7 +498,8 @@
       }
       code = func.unoptimized_code();
 #if !defined(DART_PRECOMPILED_RUNTIME)
-      if (FLAG_enable_interpreter && code.IsNull() && func.HasBytecode()) {
+      if (FLAG_enable_interpreter && !func.HasCode() && func.HasBytecode()) {
+        code = Code::null();  // Ignore installed stub to interpret bytecode.
         bytecode = func.bytecode();
       }
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
@@ -528,8 +560,8 @@
       object = pool.ObjectAt(i);
       if (object.IsFunction()) {
         closure ^= object.raw();
-        if ((closure.kind() == RawFunction::kClosureFunction) &&
-            (closure.IsLocalFunction())) {
+        if (closure.kind() == RawFunction::kClosureFunction &&
+            closure.IsLocalFunction()) {
           VisitFunction(jsarr, closure);
         }
       }
diff --git a/runtime/vm/source_report_test.cc b/runtime/vm/source_report_test.cc
index 9b0070d..0187da5 100644
--- a/runtime/vm/source_report_test.cc
+++ b/runtime/vm/source_report_test.cc
@@ -259,7 +259,7 @@
       "\"error\":{\"type\":\"@Error\",\"_vmType\":\"LanguageError\","
       "\"kind\":\"LanguageError\",\"id\":\"objects\\/0\","
       "\"message\":\"'file:\\/\\/\\/test-lib': error: "
-      "file:\\/\\/\\/test-lib:3:26: "
+      "\\/test-lib:3:26: "
       "Error: This couldn't be parsed.\\n"
       "  helper1() { helper0()+ }\\n                         ^\"}},"
 
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index 4d97d94..0e61b72 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -181,8 +181,10 @@
       const Bytecode& bytecode = Bytecode::Handle(zone, LookupDartBytecode());
       ASSERT(!bytecode.IsNull());
       return zone->PrintToString("[%-8s : sp(%#" Px ") fp(%#" Px ") pc(%#" Px
-                                 ") %s ]",
-                                 GetName(), sp(), fp(), pc(), bytecode.Name());
+                                 " offset:0x%" Px ") %s ]",
+                                 GetName(), sp(), fp(), pc(),
+                                 pc() - bytecode.PayloadStart(),
+                                 bytecode.FullyQualifiedName());
     }
     const Code& code = Code::Handle(zone, LookupDartCode());
     ASSERT(!code.IsNull());
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 7753a4f..fba676e 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -456,10 +456,18 @@
   return fp + (kParamEndSlotFromFp * kWordSize) + (reverse_index * kWordSize);
 }
 
+// Both fp and other_fp are compiled code frame pointers.
+// See stack_frame_dbc.h for the DBC version.
 DART_FORCE_INLINE static bool IsCalleeFrameOf(uword fp, uword other_fp) {
   return other_fp < fp;
 }
 
+// Both fp and other_fp are bytecode frame pointers.
+DART_FORCE_INLINE static bool IsBytecodeCalleeFrameOf(uword fp,
+                                                      uword other_fp) {
+  return other_fp > fp;
+}
+
 // Value for stack limit that is used to cause an interrupt.
 // Note that on DBC stack is growing upwards so interrupt limit is 0 unlike
 // on all other architectures.
diff --git a/runtime/vm/stack_frame_dbc.h b/runtime/vm/stack_frame_dbc.h
index e3d8395..42a1b79 100644
--- a/runtime/vm/stack_frame_dbc.h
+++ b/runtime/vm/stack_frame_dbc.h
@@ -74,6 +74,12 @@
   return other_fp > fp;
 }
 
+DART_FORCE_INLINE static bool IsBytecodeCalleeFrameOf(uword fp,
+                                                      uword other_fp) {
+  UNREACHABLE();
+  return false;
+}
+
 static const int kExitLinkSlotFromEntryFp = 0;
 
 // Value for stack limit that is used to cause an interrupt.
diff --git a/runtime/vm/stub_code.cc b/runtime/vm/stub_code.cc
index 70d8a43..c578da0 100644
--- a/runtime/vm/stub_code.cc
+++ b/runtime/vm/stub_code.cc
@@ -20,8 +20,6 @@
 
 namespace dart {
 
-using compiler::ObjectPoolBuilder;
-
 DEFINE_FLAG(bool, disassemble_stubs, false, "Disassemble generated stubs.");
 DECLARE_FLAG(bool, precompiled_mode);
 
@@ -51,7 +49,7 @@
   entries_[k##name##Index]->set_object_pool(object_pool.raw());
 
 void StubCode::Init() {
-  ObjectPoolBuilder object_pool_builder;
+  compiler::ObjectPoolBuilder object_pool_builder;
 
   // Generate all the stubs.
   VM_STUB_CODE_LIST(STUB_CODE_GENERATE);
@@ -65,10 +63,11 @@
 #undef STUB_CODE_GENERATE
 #undef STUB_CODE_SET_OBJECT_POOL
 
-RawCode* StubCode::Generate(const char* name,
-                            ObjectPoolBuilder* object_pool_builder,
-                            void (*GenerateStub)(Assembler* assembler)) {
-  Assembler assembler(object_pool_builder);
+RawCode* StubCode::Generate(
+    const char* name,
+    compiler::ObjectPoolBuilder* object_pool_builder,
+    void (*GenerateStub)(compiler::Assembler* assembler)) {
+  compiler::Assembler assembler(object_pool_builder);
   GenerateStub(&assembler);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       name, nullptr, &assembler, Code::PoolAttachment::kNotAttachPool,
@@ -98,8 +97,6 @@
 
 #undef STUB_CODE_CLEANUP
 
-void StubCode::VisitObjectPointers(ObjectPointerVisitor* visitor) {}
-
 bool StubCode::HasBeenInitialized() {
   // Use AsynchronousGapMarker as canary.
   return entries_[kAsynchronousGapMarkerIndex] != nullptr;
@@ -164,10 +161,10 @@
   Code& stub = Code::Handle(zone, cls.allocation_stub());
 #if !defined(DART_PRECOMPILED_RUNTIME)
   if (stub.IsNull()) {
-    ObjectPoolBuilder object_pool_builder;
+    compiler::ObjectPoolBuilder object_pool_builder;
     Precompiler* precompiler = Precompiler::Instance();
 
-    ObjectPoolBuilder* wrapper =
+    compiler::ObjectPoolBuilder* wrapper =
         FLAG_use_bare_instructions && precompiler != NULL
             ? precompiler->global_object_pool_builder()
             : &object_pool_builder;
@@ -177,7 +174,7 @@
             ? Code::PoolAttachment::kNotAttachPool
             : Code::PoolAttachment::kAttachPool;
 
-    Assembler assembler(wrapper);
+    compiler::Assembler assembler(wrapper);
     const char* name = cls.ToCString();
     compiler::StubCodeCompiler::GenerateAllocationStubForClass(&assembler, cls);
 
@@ -199,15 +196,12 @@
       // changes code page access permissions (makes them temporary not
       // executable).
       {
-        SafepointOperationScope safepoint_scope(thread);
+        ForceGrowthSafepointOperationScope safepoint_scope(thread);
         stub = cls.allocation_stub();
         // Check if stub was already generated.
         if (!stub.IsNull()) {
           return stub.raw();
         }
-        // Do not Garbage collect during this stage and instead allow the
-        // heap to grow.
-        NoHeapGrowthControlScope no_growth_control;
         stub = Code::FinalizeCode(nullptr, &assembler, pool_attachment,
                                   /*optimized=*/false, /*stats=*/nullptr);
         stub.set_owner(cls);
@@ -217,11 +211,6 @@
       // We notify code observers after finalizing the code in order to be
       // outside a [SafepointOperationScope].
       Code::NotifyCodeObservers(nullptr, stub, /*optimized=*/false);
-
-      Isolate* isolate = thread->isolate();
-      if (isolate->heap()->NeedsGarbageCollection()) {
-        isolate->heap()->CollectMostGarbage();
-      }
     }
 #ifndef PRODUCT
     if (FLAG_support_disassembler && FLAG_disassemble_stubs) {
@@ -245,7 +234,8 @@
 }
 
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
-RawCode* StubCode::GetBuildMethodExtractorStub(ObjectPoolBuilder* pool) {
+RawCode* StubCode::GetBuildMethodExtractorStub(
+    compiler::ObjectPoolBuilder* pool) {
 #if !defined(DART_PRECOMPILED_RUNTIME)
   auto thread = Thread::Current();
   auto Z = thread->zone();
@@ -257,8 +247,8 @@
       Code::ZoneHandle(Z, StubCode::GetAllocationStubForClass(closure_class));
   const auto& context_allocation_stub = StubCode::AllocateContext();
 
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(pool != nullptr ? pool : &object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(pool != nullptr ? pool : &object_pool_builder);
   compiler::StubCodeCompiler::GenerateBuildMethodExtractorStub(
       &assembler, closure_allocation_stub, context_allocation_stub);
 
diff --git a/runtime/vm/stub_code.h b/runtime/vm/stub_code.h
index 2593ca00..6de3ae4 100644
--- a/runtime/vm/stub_code.h
+++ b/runtime/vm/stub_code.h
@@ -36,7 +36,6 @@
   static void Init();
 
   static void Cleanup();
-  static void VisitObjectPointers(ObjectPointerVisitor* visitor);
 
   // Returns true if stub code has been initialized.
   static bool HasBeenInitialized();
@@ -61,14 +60,15 @@
   static RawCode* GetAllocationStubForClass(const Class& cls);
 
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
-  static RawCode* GetBuildMethodExtractorStub(ObjectPoolBuilder* pool);
+  static RawCode* GetBuildMethodExtractorStub(
+      compiler::ObjectPoolBuilder* pool);
 #endif
 
   // Generate the stub and finalize the generated code into the stub
   // code executable area.
   static RawCode* Generate(
       const char* name,
-      ObjectPoolBuilder* object_pool_builder,
+      compiler::ObjectPoolBuilder* object_pool_builder,
       void (*GenerateStub)(compiler::Assembler* assembler));
 
   static const Code& UnoptimizedStaticCallEntry(intptr_t num_args_tested);
@@ -86,7 +86,8 @@
 
 #if !defined(DART_PRECOMPILED_RUNTIME)
 #define GENERATE_STUB(name)                                                    \
-  static RawCode* BuildIsolateSpecific##name##Stub(ObjectPoolBuilder* opw) {   \
+  static RawCode* BuildIsolateSpecific##name##Stub(                            \
+      compiler::ObjectPoolBuilder* opw) {                                      \
     return StubCode::Generate(                                                 \
         "_iso_stub_" #name, opw,                                               \
         compiler::StubCodeCompiler::Generate##name##Stub);                     \
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 7471c7d..76c37f0 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -35,7 +35,8 @@
 }
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
+static void GenerateCallToCallRuntimeStub(compiler::Assembler* assembler,
+                                          int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterDartFrame(0);
@@ -44,7 +45,7 @@
   __ PushObject(Object::null_object());  // Push argument 2: type arguments.
   ASSERT(kAllocateArrayRuntimeEntry.argument_count() == argc);
   __ CallRuntime(kAllocateArrayRuntimeEntry, argc);
-  __ add(SP, SP, Operand(argc * kWordSize));
+  __ add(SP, SP, compiler::Operand(argc * kWordSize));
   __ Pop(R0);  // Pop return value from return slot.
   __ LeaveDartFrame();
   __ ret();
@@ -55,8 +56,8 @@
                                               const Code& code);
   const int length = 10;
   const char* kName = "Test_CallRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
@@ -68,7 +69,7 @@
 }
 
 // Test calls to stub code which calls into a leaf runtime entry.
-static void GenerateCallToCallLeafRuntimeStub(Assembler* assembler,
+static void GenerateCallToCallLeafRuntimeStub(compiler::Assembler* assembler,
                                               const char* str_value,
                                               intptr_t lhs_index_value,
                                               intptr_t rhs_index_value,
@@ -96,8 +97,8 @@
   intptr_t rhs_index_value = 2;
   intptr_t length_value = 2;
   const char* kName = "Test_CallLeafRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index d849dc0..6c1fcae 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -35,7 +35,8 @@
 }
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
+static void GenerateCallToCallRuntimeStub(compiler::Assembler* assembler,
+                                          int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterDartFrame(0);
@@ -54,8 +55,8 @@
                                               const Code& code);
   const int length = 10;
   const char* kName = "Test_CallRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
@@ -67,7 +68,7 @@
 }
 
 // Test calls to stub code which calls into a leaf runtime entry.
-static void GenerateCallToCallLeafRuntimeStub(Assembler* assembler,
+static void GenerateCallToCallLeafRuntimeStub(compiler::Assembler* assembler,
                                               const char* str_value,
                                               intptr_t lhs_index_value,
                                               intptr_t rhs_index_value,
@@ -94,8 +95,8 @@
   intptr_t rhs_index_value = 2;
   intptr_t length_value = 2;
   const char* kName = "Test_CallLeafRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index 578afde..e8f412d 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -35,16 +35,17 @@
 }
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
+static void GenerateCallToCallRuntimeStub(compiler::Assembler* assembler,
+                                          int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
-  __ enter(Immediate(0));
+  __ enter(compiler::Immediate(0));
   __ PushObject(Object::null_object());  // Push Null object for return value.
   __ PushObject(smi_length);             // Push argument 1: length.
   __ PushObject(Object::null_object());  // Push argument 2: type arguments.
   ASSERT(kAllocateArrayRuntimeEntry.argument_count() == argc);
   __ CallRuntime(kAllocateArrayRuntimeEntry, argc);
-  __ AddImmediate(ESP, Immediate(argc * kWordSize));
+  __ AddImmediate(ESP, compiler::Immediate(argc * kWordSize));
   __ popl(EAX);  // Pop return value from return slot.
   __ leave();
   __ ret();
@@ -55,7 +56,7 @@
                                               const Code& code);
   const int length = 10;
   const char* kName = "Test_CallRuntimeStubCode";
-  Assembler assembler(nullptr);
+  compiler::Assembler assembler(nullptr);
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
@@ -67,7 +68,7 @@
 }
 
 // Test calls to stub code which calls into a leaf runtime entry.
-static void GenerateCallToCallLeafRuntimeStub(Assembler* assembler,
+static void GenerateCallToCallLeafRuntimeStub(compiler::Assembler* assembler,
                                               const char* str_value,
                                               intptr_t lhs_index_value,
                                               intptr_t rhs_index_value,
@@ -76,16 +77,16 @@
   const Smi& lhs_index = Smi::ZoneHandle(Smi::New(lhs_index_value));
   const Smi& rhs_index = Smi::ZoneHandle(Smi::New(rhs_index_value));
   const Smi& length = Smi::ZoneHandle(Smi::New(length_value));
-  __ enter(Immediate(0));
+  __ enter(compiler::Immediate(0));
   __ ReserveAlignedFrameSpace(4 * kWordSize);
   __ LoadObject(EAX, str);
-  __ movl(Address(ESP, 0), EAX);  // Push argument 1.
+  __ movl(compiler::Address(ESP, 0), EAX);  // Push argument 1.
   __ LoadObject(EAX, lhs_index);
-  __ movl(Address(ESP, kWordSize), EAX);  // Push argument 2.
+  __ movl(compiler::Address(ESP, kWordSize), EAX);  // Push argument 2.
   __ LoadObject(EAX, rhs_index);
-  __ movl(Address(ESP, 2 * kWordSize), EAX);  // Push argument 3.
+  __ movl(compiler::Address(ESP, 2 * kWordSize), EAX);  // Push argument 3.
   __ LoadObject(EAX, length);
-  __ movl(Address(ESP, 3 * kWordSize), EAX);  // Push argument 4.
+  __ movl(compiler::Address(ESP, 3 * kWordSize), EAX);  // Push argument 4.
   __ CallRuntime(kCaseInsensitiveCompareUCS2RuntimeEntry, 4);
   __ leave();
   __ ret();  // Return value is in EAX.
@@ -99,7 +100,7 @@
   intptr_t rhs_index_value = 2;
   intptr_t length_value = 2;
   const char* kName = "Test_CallLeafRuntimeStubCode";
-  Assembler assembler(nullptr);
+  compiler::Assembler assembler(nullptr);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
diff --git a/runtime/vm/stub_code_list.h b/runtime/vm/stub_code_list.h
index f0eff2c..bb35068 100644
--- a/runtime/vm/stub_code_list.h
+++ b/runtime/vm/stub_code_list.h
@@ -36,7 +36,6 @@
   V(UnlinkedCall)                                                              \
   V(MonomorphicMiss)                                                           \
   V(SingleTargetCall)                                                          \
-  V(ICCallThroughFunction)                                                     \
   V(ICCallThroughCode)                                                         \
   V(MegamorphicCall)                                                           \
   V(FixAllocationStubTarget)                                                   \
@@ -79,7 +78,8 @@
   V(OneArgOptimizedCheckInlineCacheWithExactnessCheck)                         \
   V(EnterSafepoint)                                                            \
   V(ExitSafepoint)                                                             \
-  V(VerifyCallback)
+  V(VerifyCallback)                                                            \
+  V(CallNativeThroughSafepoint)
 
 #else
 #define VM_STUB_CODE_LIST(V)                                                   \
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index 4cdf613..39836c8 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -35,7 +35,8 @@
 }
 
 // Test calls to stub code which calls into the runtime.
-static void GenerateCallToCallRuntimeStub(Assembler* assembler, int length) {
+static void GenerateCallToCallRuntimeStub(compiler::Assembler* assembler,
+                                          int length) {
   const int argc = 2;
   const Smi& smi_length = Smi::ZoneHandle(Smi::New(length));
   __ EnterStubFrame();
@@ -44,7 +45,7 @@
   __ PushObject(Object::null_object());  // Push argument 2: type arguments.
   ASSERT(kAllocateArrayRuntimeEntry.argument_count() == argc);
   __ CallRuntime(kAllocateArrayRuntimeEntry, argc);
-  __ AddImmediate(RSP, Immediate(argc * kWordSize));
+  __ AddImmediate(RSP, compiler::Immediate(argc * kWordSize));
   __ popq(RAX);  // Pop return value from return slot.
   __ LeaveStubFrame();
   __ ret();
@@ -55,8 +56,8 @@
                                               const Code& code);
   const int length = 10;
   const char* kName = "Test_CallRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallRuntimeStub(&assembler, length);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
       *CreateFunction("Test_CallRuntimeStubCode"), nullptr, &assembler,
@@ -68,7 +69,7 @@
 }
 
 // Test calls to stub code which calls into a leaf runtime entry.
-static void GenerateCallToCallLeafRuntimeStub(Assembler* assembler,
+static void GenerateCallToCallLeafRuntimeStub(compiler::Assembler* assembler,
                                               const char* str_value,
                                               intptr_t lhs_index_value,
                                               intptr_t rhs_index_value,
@@ -96,8 +97,8 @@
   intptr_t rhs_index_value = 2;
   intptr_t length_value = 2;
   const char* kName = "Test_CallLeafRuntimeStubCode";
-  ObjectPoolBuilder object_pool_builder;
-  Assembler assembler(&object_pool_builder);
+  compiler::ObjectPoolBuilder object_pool_builder;
+  compiler::Assembler assembler(&object_pool_builder);
   GenerateCallToCallLeafRuntimeStub(&assembler, str_value, lhs_index_value,
                                     rhs_index_value, length_value);
   const Code& code = Code::Handle(Code::FinalizeCodeAndNotify(
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index 559fc77..04e827b 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -94,6 +94,7 @@
   V(DefaultLabel, ":L")                                                        \
   V(DotCreate, "._create")                                                     \
   V(DotRange, ".range")                                                        \
+  V(DotUnder, "._")                                                            \
   V(DotValue, ".value")                                                        \
   V(DotWithType, "._withType")                                                 \
   V(Double, "double")                                                          \
@@ -193,7 +194,6 @@
   V(List, "List")                                                              \
   V(ListFactory, "List.")                                                      \
   V(ListLiteralFactory, "List._fromLiteral")                                   \
-  V(LoadLibrary, "loadLibrary")                                                \
   V(LocalVarDescriptors, "LocalVarDescriptors")                                \
   V(Map, "Map")                                                                \
   V(MapLiteralFactory, "Map._fromLiteral")                                     \
@@ -331,7 +331,7 @@
   V(_Float64x2List, "_Float64x2List")                                          \
   V(_GrowableList, "_GrowableList")                                            \
   V(_GrowableListFactory, "_GrowableList.")                                    \
-  V(_GrowableListWithData, "_GrowableList.withData")                           \
+  V(_GrowableListWithData, "_GrowableList._withData")                          \
   V(_ImmutableList, "_ImmutableList")                                          \
   V(_Int16ArrayFactory, "Int16List.")                                          \
   V(_Int16ArrayView, "_Int16ArrayView")                                        \
@@ -404,7 +404,6 @@
   V(_UserTag, "_UserTag")                                                      \
   V(_WeakProperty, "_WeakProperty")                                            \
   V(_classRangeCheck, "_classRangeCheck")                                      \
-  V(_classRangeCheckNegative, "_classRangeCheckNegative")                      \
   V(_current, "_current")                                                      \
   V(_ensureScheduleImmediate, "_ensureScheduleImmediate")                      \
   V(_get, "_get")                                                              \
@@ -451,8 +450,10 @@
   V(string_param, ":string_param")                                             \
   V(string_param_length, ":string_param_length")                               \
   V(toString, "toString")                                                      \
+  V(vm_prefer_inline, "vm:prefer-inline")                                      \
   V(vm_entry_point, "vm:entry-point")                                          \
   V(vm_exact_result_type, "vm:exact-result-type")                              \
+  V(vm_never_inline, "vm:never-inline")                                        \
   V(vm_non_nullable_result_type, "vm:non-nullable-result-type")                \
   V(vm_trace_entrypoints, "vm:testing.unsafe.trace-entrypoints-fn")
 
diff --git a/runtime/vm/thread.cc b/runtime/vm/thread.cc
index 71a9b2d..f9bcb73 100644
--- a/runtime/vm/thread.cc
+++ b/runtime/vm/thread.cc
@@ -56,7 +56,7 @@
 
 #define REUSABLE_HANDLE_INITIALIZERS(object) object##_handle_(NULL),
 
-Thread::Thread(Isolate* isolate)
+Thread::Thread(bool is_vm_isolate)
     : ThreadState(false),
       stack_limit_(0),
       stack_overflow_flags_(0),
@@ -133,7 +133,7 @@
 
   // We cannot initialize the VM constants here for the vm isolate thread
   // due to boot strapping issues.
-  if ((Dart::vm_isolate() != NULL) && (isolate != Dart::vm_isolate())) {
+  if (!is_vm_isolate) {
     InitVMConstants();
   }
 }
diff --git a/runtime/vm/thread.h b/runtime/vm/thread.h
index b13b149..1413ee1 100644
--- a/runtime/vm/thread.h
+++ b/runtime/vm/thread.h
@@ -44,6 +44,7 @@
 class Instance;
 class Interpreter;
 class Isolate;
+class IsolateGroup;
 class Library;
 class Object;
 class OSThread;
@@ -122,7 +123,9 @@
   V(RawCode*, lazy_specialize_type_test_stub_,                                 \
     StubCode::LazySpecializeTypeTest().raw(), NULL)                            \
   V(RawCode*, enter_safepoint_stub_, StubCode::EnterSafepoint().raw(), NULL)   \
-  V(RawCode*, exit_safepoint_stub_, StubCode::ExitSafepoint().raw(), NULL)
+  V(RawCode*, exit_safepoint_stub_, StubCode::ExitSafepoint().raw(), NULL)     \
+  V(RawCode*, call_native_through_safepoint_stub_,                             \
+    StubCode::CallNativeThroughSafepoint().raw(), NULL)
 
 #endif
 
@@ -167,7 +170,9 @@
     0)                                                                         \
   V(uword, optimize_entry_, StubCode::OptimizeFunction().EntryPoint(), 0)      \
   V(uword, deoptimize_entry_, StubCode::Deoptimize().EntryPoint(), 0)          \
-  V(uword, verify_callback_entry_, StubCode::VerifyCallback().EntryPoint(), 0)
+  V(uword, verify_callback_entry_, StubCode::VerifyCallback().EntryPoint(), 0) \
+  V(uword, call_native_through_safepoint_entry_point_,                         \
+    StubCode::CallNativeThroughSafepoint().EntryPoint(), 0)
 #endif
 
 #define CACHED_ADDRESSES_LIST(V)                                               \
@@ -358,9 +363,13 @@
   void EnterApiScope();
   void ExitApiScope();
 
-  // The isolate that this thread is operating on, or NULL if none.
+  // 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_); }
+
+  // The isolate group that this thread is operating on, or nullptr if none.
+  IsolateGroup* isolate_group() const { return isolate_group_; }
+
   bool IsMutatorThread() const;
   bool CanCollectGarbage() const;
 
@@ -883,6 +892,7 @@
 
   TaskKind task_kind_;
   TimelineStream* dart_stream_;
+  IsolateGroup* isolate_group_ = nullptr;
   mutable Monitor thread_lock_;
   ApiLocalScope* api_reusable_scope_;
   ApiLocalScope* api_top_scope_;
@@ -938,7 +948,7 @@
 
   Thread* next_;  // Used to chain the thread structures in an isolate.
 
-  explicit Thread(Isolate* isolate);
+  explicit Thread(bool is_vm_isolate);
 
   void StoreBufferRelease(
       StoreBuffer::ThresholdPolicy policy = StoreBuffer::kCheckThreshold);
@@ -968,6 +978,7 @@
   friend class Interpreter;
   friend class InterruptChecker;
   friend class Isolate;
+  friend class IsolateGroup;
   friend class IsolateTestHelper;
   friend class NoOOBMessageScope;
   friend class Simulator;
diff --git a/runtime/vm/thread_registry.cc b/runtime/vm/thread_registry.cc
index 2dcabf8..efbd892 100644
--- a/runtime/vm/thread_registry.cc
+++ b/runtime/vm/thread_registry.cc
@@ -4,7 +4,6 @@
 
 #include "vm/thread_registry.h"
 
-#include "vm/isolate.h"
 #include "vm/json_stream.h"
 #include "vm/lockers.h"
 
@@ -17,12 +16,6 @@
     // At this point the active list should be empty.
     ASSERT(active_list_ == NULL);
 
-    // The [mutator_thread_] is kept alive until the destruction of the isolate.
-    mutator_thread_->isolate_ = nullptr;
-
-    // We have cached the mutator thread, delete it.
-    delete mutator_thread_;
-    mutator_thread_ = NULL;
     // Now delete all the threads in the free list.
     while (free_list_ != NULL) {
       Thread* thread = free_list_;
@@ -32,83 +25,75 @@
   }
 }
 
-// Gets a free Thread structure, we special case the mutator thread
-// by reusing the cached structure, see comment in 'thread_registry.h'.
-Thread* ThreadRegistry::GetFreeThreadLocked(Isolate* isolate, bool is_mutator) {
+Thread* ThreadRegistry::GetFreeThreadLocked(bool is_vm_isolate) {
   ASSERT(threads_lock()->IsOwnedByCurrentThread());
-  Thread* thread;
-  if (is_mutator) {
-    if (mutator_thread_ == NULL) {
-      mutator_thread_ = GetFromFreelistLocked(isolate);
-    }
-    thread = mutator_thread_;
-  } else {
-    thread = GetFromFreelistLocked(isolate);
-    ASSERT(thread->api_top_scope() == NULL);
-  }
+  Thread* thread = GetFromFreelistLocked(is_vm_isolate);
+  ASSERT(thread->api_top_scope() == NULL);
   // Now add this Thread to the active list for the isolate.
   AddToActiveListLocked(thread);
   return thread;
 }
 
-void ThreadRegistry::ReturnThreadLocked(bool is_mutator, Thread* thread) {
+void ThreadRegistry::ReturnThreadLocked(Thread* thread) {
   ASSERT(threads_lock()->IsOwnedByCurrentThread());
   // Remove thread from the active list for the isolate.
   RemoveFromActiveListLocked(thread);
-  if (!is_mutator) {
-    ReturnToFreelistLocked(thread);
-  }
+  ReturnToFreelistLocked(thread);
 }
 
-void ThreadRegistry::VisitObjectPointers(ObjectPointerVisitor* visitor,
+void ThreadRegistry::VisitObjectPointers(Isolate* isolate_of_interest,
+                                         ObjectPointerVisitor* visitor,
                                          ValidationPolicy validate_frames) {
   MonitorLocker ml(threads_lock());
-  bool mutator_thread_visited = false;
   Thread* thread = active_list_;
   while (thread != NULL) {
-    thread->VisitObjectPointers(visitor, validate_frames);
-    if (mutator_thread_ == thread) {
-      mutator_thread_visited = true;
-    }
-    thread = thread->next_;
-  }
-  // Visit mutator thread even if it is not in the active list because of
-  // api handles.
-  if (!mutator_thread_visited && (mutator_thread_ != NULL)) {
-    mutator_thread_->VisitObjectPointers(visitor, validate_frames);
-  }
-}
-
-void ThreadRegistry::ReleaseStoreBuffers() {
-  MonitorLocker ml(threads_lock());
-  Thread* thread = active_list_;
-  while (thread != NULL) {
-    if (!thread->BypassSafepoints()) {
-      thread->ReleaseStoreBuffer();
+    if (thread->isolate() == isolate_of_interest) {
+      // The mutator thread is visited by the isolate itself (see
+      // [Isolate::VisitStackPointers]).
+      if (!thread->IsMutatorThread()) {
+        thread->VisitObjectPointers(visitor, validate_frames);
+      }
     }
     thread = thread->next_;
   }
 }
 
-void ThreadRegistry::AcquireMarkingStacks() {
+void ThreadRegistry::ReleaseStoreBuffers(Isolate* isolate_of_interest) {
   MonitorLocker ml(threads_lock());
   Thread* thread = active_list_;
   while (thread != NULL) {
-    if (!thread->BypassSafepoints()) {
-      thread->MarkingStackAcquire();
-      thread->DeferredMarkingStackAcquire();
+    if (thread->isolate() == isolate_of_interest) {
+      if (!thread->BypassSafepoints()) {
+        thread->ReleaseStoreBuffer();
+      }
     }
     thread = thread->next_;
   }
 }
 
-void ThreadRegistry::ReleaseMarkingStacks() {
+void ThreadRegistry::AcquireMarkingStacks(Isolate* isolate_of_interest) {
   MonitorLocker ml(threads_lock());
   Thread* thread = active_list_;
   while (thread != NULL) {
-    if (!thread->BypassSafepoints()) {
-      thread->MarkingStackRelease();
-      thread->DeferredMarkingStackRelease();
+    if (thread->isolate() == isolate_of_interest) {
+      if (!thread->BypassSafepoints()) {
+        thread->MarkingStackAcquire();
+        thread->DeferredMarkingStackAcquire();
+      }
+    }
+    thread = thread->next_;
+  }
+}
+
+void ThreadRegistry::ReleaseMarkingStacks(Isolate* isolate_of_interest) {
+  MonitorLocker ml(threads_lock());
+  Thread* thread = active_list_;
+  while (thread != NULL) {
+    if (thread->isolate() == isolate_of_interest) {
+      if (!thread->BypassSafepoints()) {
+        thread->MarkingStackRelease();
+        thread->DeferredMarkingStackRelease();
+      }
     }
     thread = thread->next_;
   }
@@ -126,23 +111,28 @@
 }
 #endif
 
-intptr_t ThreadRegistry::CountZoneHandles() const {
+intptr_t ThreadRegistry::CountZoneHandles(Isolate* isolate_of_interest) const {
   MonitorLocker ml(threads_lock());
   intptr_t count = 0;
   Thread* current = active_list_;
   while (current != NULL) {
-    count += current->CountZoneHandles();
+    if (current->isolate() == isolate_of_interest) {
+      count += current->CountZoneHandles();
+    }
     current = current->next_;
   }
   return count;
 }
 
-intptr_t ThreadRegistry::CountScopedHandles() const {
+intptr_t ThreadRegistry::CountScopedHandles(
+    Isolate* isolate_of_interest) const {
   MonitorLocker ml(threads_lock());
   intptr_t count = 0;
   Thread* current = active_list_;
   while (current != NULL) {
-    count += current->CountScopedHandles();
+    if (current->isolate() == isolate_of_interest) {
+      count += current->CountScopedHandles();
+    }
     current = current->next_;
   }
   return count;
@@ -174,12 +164,12 @@
   }
 }
 
-Thread* ThreadRegistry::GetFromFreelistLocked(Isolate* isolate) {
+Thread* ThreadRegistry::GetFromFreelistLocked(bool is_vm_isolate) {
   ASSERT(threads_lock()->IsOwnedByCurrentThread());
   Thread* thread = NULL;
   // Get thread structure from free list or create a new one.
   if (free_list_ == NULL) {
-    thread = new Thread(isolate);
+    thread = new Thread(is_vm_isolate);
   } else {
     thread = free_list_;
     free_list_ = thread->next_;
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h
index b6c0ec5..a9059a5 100644
--- a/runtime/vm/thread_registry.h
+++ b/runtime/vm/thread_registry.h
@@ -22,41 +22,33 @@
 // Unordered collection of threads relating to a particular isolate.
 class ThreadRegistry {
  public:
-  ThreadRegistry()
-      : threads_lock_(),
-        active_list_(NULL),
-        free_list_(NULL),
-        mutator_thread_(NULL) {}
+  ThreadRegistry() : threads_lock_(), active_list_(NULL), free_list_(NULL) {}
   ~ThreadRegistry();
 
-  void VisitObjectPointers(ObjectPointerVisitor* visitor,
+  void VisitObjectPointers(Isolate* isolate_of_interest,
+                           ObjectPointerVisitor* visitor,
                            ValidationPolicy validate_frames);
 
-  void ReleaseStoreBuffers();
-  void AcquireMarkingStacks();
-  void ReleaseMarkingStacks();
-
-  Thread* mutator_thread() const { return mutator_thread_; }
+  void ReleaseStoreBuffers(Isolate* isolate_of_interest);
+  void AcquireMarkingStacks(Isolate* isolate_of_interest);
+  void ReleaseMarkingStacks(Isolate* isolate_of_interest);
 
 #ifndef PRODUCT
   void PrintJSON(JSONStream* stream) const;
 #endif
 
-  // Calculates the sum of the max memory usage in bytes of each thread.
-  uintptr_t ThreadHighWatermarksTotalLocked() const;
-
-  intptr_t CountZoneHandles() const;
-  intptr_t CountScopedHandles() const;
+  intptr_t CountZoneHandles(Isolate* isolate_of_interest) const;
+  intptr_t CountScopedHandles(Isolate* isolate_of_interest) const;
 
  private:
   Thread* active_list() const { return active_list_; }
   Monitor* threads_lock() const { return &threads_lock_; }
 
-  Thread* GetFreeThreadLocked(Isolate* isolate, bool is_mutator);
-  void ReturnThreadLocked(bool is_mutator, Thread* thread);
+  Thread* GetFreeThreadLocked(bool is_vm_isolate);
+  void ReturnThreadLocked(Thread* thread);
   void AddToActiveListLocked(Thread* thread);
   void RemoveFromActiveListLocked(Thread* thread);
-  Thread* GetFromFreelistLocked(Isolate* isolate);
+  Thread* GetFromFreelistLocked(bool is_vm_isolate);
   void ReturnToFreelistLocked(Thread* thread);
 
   // This monitor protects the threads list for an isolate, it is used whenever
@@ -65,23 +57,8 @@
   Thread* active_list_;  // List of active threads in the isolate.
   Thread* free_list_;    // Free list of Thread objects that can be reused.
 
-  // TODO(asiva): Currently we treat a mutator thread as a special thread
-  // and always schedule execution of Dart code on the same mutator thread
-  // object. The ApiLocalScope has been made thread specific but we still
-  // have scenarios where we do a temporary exit of an Isolate with live
-  // zones/handles in the API scope :
-  // - Dart_RunLoop()
-  // - IsolateSaver in Dart_NewNativePort
-  // Similarly, tracking async_stack_trace requires that we always reschedule
-  // on the same thread.
-  // We probably need a mechanism to return to the specific thread only
-  // for these specific cases. We should also determine if the embedder
-  // should allow exiting an isolate with live state in zones/handles in
-  // which case a new API for returning to the specific thread needs to be
-  // added.
-  Thread* mutator_thread_;
-
   friend class Isolate;
+  friend class IsolateGroup;
   friend class SafepointHandler;
   friend class Scavenger;
   DISALLOW_COPY_AND_ASSIGN(ThreadRegistry);
diff --git a/runtime/vm/type_testing_stubs.cc b/runtime/vm/type_testing_stubs.cc
index 90dc754..9d41d66 100644
--- a/runtime/vm/type_testing_stubs.cc
+++ b/runtime/vm/type_testing_stubs.cc
@@ -188,7 +188,7 @@
   ASSERT(!type_class.IsNull());
 
   // To use the already-defined __ Macro !
-  Assembler assembler(nullptr);
+  compiler::Assembler assembler(nullptr);
   BuildOptimizedTypeTestStub(&assembler, hi, type, type_class);
 
   const char* name = namer_.StubNameForType(type);
@@ -216,7 +216,7 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedTypeTestStubFastCases(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const Type& type,
     const Class& type_class,
@@ -228,12 +228,12 @@
 
   // Fast case for 'int'.
   if (type.raw() == Type::IntType()) {
-    Label non_smi_value;
+    compiler::Label non_smi_value;
     __ BranchIfNotSmi(instance_reg, &non_smi_value);
     __ Ret();
     __ Bind(&non_smi_value);
   } else if (type.IsDartFunctionType()) {
-    Label continue_checking;
+    compiler::Label continue_checking;
     __ CompareImmediate(class_id_reg, kClosureCid);
     __ BranchIf(NOT_EQUAL, &continue_checking);
     __ Ret();
@@ -274,7 +274,7 @@
   }
 
   // Fast case for 'null'.
-  Label non_null;
+  compiler::Label non_null;
   __ CompareObject(instance_reg, Object::null_object());
   __ BranchIf(NOT_EQUAL, &non_null);
   __ Ret();
@@ -282,12 +282,12 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedSubtypeRangeCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     const CidRangeVector& ranges,
     Register class_id_reg,
     Register instance_reg,
     bool smi_is_ok) {
-  Label cid_range_failed, is_subtype;
+  compiler::Label cid_range_failed, is_subtype;
 
   if (smi_is_ok) {
     __ LoadClassIdMayBeSmi(class_id_reg, instance_reg);
@@ -305,7 +305,7 @@
 
 void TypeTestingStubGenerator::
     BuildOptimizedSubclassRangeCheckWithTypeArguments(
-        Assembler* assembler,
+        compiler::Assembler* assembler,
         HierarchyInfo* hi,
         const Class& type_class,
         const TypeArguments& tp,
@@ -314,7 +314,7 @@
         const Register instance_reg,
         const Register instance_type_args_reg) {
   // a) First we make a quick sub*class* cid-range check.
-  Label check_failed;
+  compiler::Label check_failed;
   ASSERT(!type_class.is_implemented());
   const CidRangeVector& ranges = hi->SubclassRangesForClass(type_class);
   BuildOptimizedSubclassRangeCheck(assembler, ranges, class_id_reg,
@@ -322,10 +322,11 @@
   // fall through to continue
 
   // b) Then we'll load the values for the type parameters.
-  __ LoadField(instance_type_args_reg,
-               FieldAddress(instance_reg,
-                            compiler::target::Class::TypeArgumentsFieldOffset(
-                                type_class)));
+  __ LoadField(
+      instance_type_args_reg,
+      compiler::FieldAddress(
+          instance_reg,
+          compiler::target::Class::TypeArgumentsFieldOffset(type_class)));
 
   // The kernel frontend should fill in any non-assigned type parameters on
   // construction with dynamic/Object, so we should never get the null type
@@ -334,7 +335,7 @@
   // TODO(kustermann): We could consider not using "null" as type argument
   // vector representing all-dynamic to avoid this extra check (which will be
   // uncommon because most Dart code in 2.0 will be strongly typed)!
-  Label process_done;
+  compiler::Label process_done;
   __ CompareObject(instance_type_args_reg, Object::null_object());
   __ BranchIf(NOT_EQUAL, &process_done);
   __ Ret();
@@ -363,21 +364,21 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedSubclassRangeCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     const CidRangeVector& ranges,
     Register class_id_reg,
     Register instance_reg,
-    Label* check_failed) {
+    compiler::Label* check_failed) {
   __ LoadClassIdMayBeSmi(class_id_reg, instance_reg);
 
-  Label is_subtype;
+  compiler::Label is_subtype;
   FlowGraphCompiler::GenerateCidRangesCheck(assembler, class_id_reg, ranges,
                                             &is_subtype, check_failed, true);
   __ Bind(&is_subtype);
 }
 
 void TypeTestingStubGenerator::BuildOptimizedTypeArgumentValueCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const AbstractType& type_arg,
     intptr_t type_param_value_offset_i,
@@ -386,19 +387,19 @@
     const Register instantiator_type_args_reg,
     const Register function_type_args_reg,
     const Register own_type_arg_reg,
-    Label* check_failed) {
+    compiler::Label* check_failed) {
   if (type_arg.raw() != Type::ObjectType() &&
       type_arg.raw() != Type::DynamicType()) {
     // TODO(kustermann): Even though it should be safe to use TMP here, we
     // should avoid using TMP outside the assembler.  Try to find a free
     // register to use here!
-    __ LoadField(TMP,
-                 FieldAddress(instance_type_args_reg,
-                              compiler::target::TypeArguments::type_at_offset(
-                                  type_param_value_offset_i)));
-    __ LoadField(
-        class_id_reg,
-        FieldAddress(TMP, compiler::target::Type::type_class_id_offset()));
+    __ LoadField(TMP, compiler::FieldAddress(
+                          instance_type_args_reg,
+                          compiler::target::TypeArguments::type_at_offset(
+                              type_param_value_offset_i)));
+    __ LoadField(class_id_reg,
+                 compiler::FieldAddress(
+                     TMP, compiler::target::Type::type_class_id_offset()));
 
     if (type_arg.IsTypeParameter()) {
       const TypeParameter& type_param = TypeParameter::Cast(type_arg);
@@ -406,13 +407,14 @@
                                              ? instantiator_type_args_reg
                                              : function_type_args_reg;
       __ LoadField(own_type_arg_reg,
-                   FieldAddress(kTypeArgumentsReg,
-                                compiler::target::TypeArguments::type_at_offset(
-                                    type_param.index())));
+                   compiler::FieldAddress(
+                       kTypeArgumentsReg,
+                       compiler::target::TypeArguments::type_at_offset(
+                           type_param.index())));
       __ CompareWithFieldValue(
-          class_id_reg,
-          FieldAddress(own_type_arg_reg,
-                       compiler::target::Type::type_class_id_offset()));
+          class_id_reg, compiler::FieldAddress(
+                            own_type_arg_reg,
+                            compiler::target::Type::type_class_id_offset()));
       __ BranchIf(NOT_EQUAL, check_failed);
     } else {
       const Class& type_class = Class::Handle(type_arg.type_class());
@@ -421,7 +423,7 @@
                                     /*include_abstract=*/true,
                                     /*exclude_null=*/false);
 
-      Label is_subtype;
+      compiler::Label is_subtype;
       __ SmiUntag(class_id_reg);
       FlowGraphCompiler::GenerateCidRangesCheck(
           assembler, class_id_reg, ranges, &is_subtype, check_failed, true);
diff --git a/runtime/vm/type_testing_stubs.h b/runtime/vm/type_testing_stubs.h
index 7c1913a..b0a772d 100644
--- a/runtime/vm/type_testing_stubs.h
+++ b/runtime/vm/type_testing_stubs.h
@@ -54,33 +54,34 @@
 #if !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
 #if !defined(DART_PRECOMPILED_RUNTIME)
   RawCode* BuildCodeForType(const Type& type);
-  static void BuildOptimizedTypeTestStub(Assembler* assembler,
+  static void BuildOptimizedTypeTestStub(compiler::Assembler* assembler,
                                          HierarchyInfo* hi,
                                          const Type& type,
                                          const Class& type_class);
 
-  static void BuildOptimizedTypeTestStubFastCases(Assembler* assembler,
-                                                  HierarchyInfo* hi,
-                                                  const Type& type,
-                                                  const Class& type_class,
-                                                  Register instance_reg,
-                                                  Register class_id_reg);
+  static void BuildOptimizedTypeTestStubFastCases(
+      compiler::Assembler* assembler,
+      HierarchyInfo* hi,
+      const Type& type,
+      const Class& type_class,
+      Register instance_reg,
+      Register class_id_reg);
 
-  static void BuildOptimizedSubtypeRangeCheck(Assembler* assembler,
+  static void BuildOptimizedSubtypeRangeCheck(compiler::Assembler* assembler,
                                               const CidRangeVector& ranges,
                                               Register class_id_reg,
                                               Register instance_reg,
                                               bool smi_is_ok);
 
   static void BuildOptimizedSubclassRangeCheckWithTypeArguments(
-      Assembler* assembler,
+      compiler::Assembler* assembler,
       HierarchyInfo* hi,
       const Class& type_class,
       const TypeArguments& type_parameters,
       const TypeArguments& type_arguments);
 
   static void BuildOptimizedSubclassRangeCheckWithTypeArguments(
-      Assembler* assembler,
+      compiler::Assembler* assembler,
       HierarchyInfo* hi,
       const Class& type_class,
       const TypeArguments& type_parameters,
@@ -89,21 +90,21 @@
       const Register instance_reg,
       const Register instance_type_args_reg);
 
-  static void BuildOptimizedSubclassRangeCheck(Assembler* assembler,
+  static void BuildOptimizedSubclassRangeCheck(compiler::Assembler* assembler,
                                                const CidRangeVector& ranges,
                                                Register class_id_reg,
                                                Register instance_reg,
-                                               Label* check_failed);
+                                               compiler::Label* check_failed);
 
   static void BuildOptimizedTypeArgumentValueCheck(
-      Assembler* assembler,
+      compiler::Assembler* assembler,
       HierarchyInfo* hi,
       const AbstractType& type_arg,
       intptr_t type_param_value_offset_i,
-      Label* check_failed);
+      compiler::Label* check_failed);
 
   static void BuildOptimizedTypeArgumentValueCheck(
-      Assembler* assembler,
+      compiler::Assembler* assembler,
       HierarchyInfo* hi,
       const AbstractType& type_arg,
       intptr_t type_param_value_offset_i,
@@ -112,7 +113,7 @@
       const Register instantiator_type_args_reg,
       const Register function_type_args_reg,
       const Register type_arg_reg,
-      Label* check_failed);
+      compiler::Label* check_failed);
 
 #endif  // !defined(DART_PRECOMPILED_RUNTIME)
 #endif  // !defined(TARGET_ARCH_DBC) && !defined(TARGET_ARCH_IA32)
diff --git a/runtime/vm/type_testing_stubs_arm.cc b/runtime/vm/type_testing_stubs_arm.cc
index 28d8c7c..345e3fb 100644
--- a/runtime/vm/type_testing_stubs_arm.cc
+++ b/runtime/vm/type_testing_stubs_arm.cc
@@ -13,7 +13,7 @@
 namespace dart {
 
 void TypeTestingStubGenerator::BuildOptimizedTypeTestStub(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const Type& type,
     const Class& type_class) {
@@ -24,17 +24,19 @@
                                       kInstanceReg, kClassIdReg);
 
   __ ldr(CODE_REG,
-         Address(THR, compiler::target::Thread::slow_type_test_stub_offset()));
-  __ Branch(
-      FieldAddress(CODE_REG, compiler::target::Code::entry_point_offset()));
+         compiler::Address(
+             THR, compiler::target::Thread::slow_type_test_stub_offset()));
+  __ Branch(compiler::FieldAddress(
+      CODE_REG, compiler::target::Code::entry_point_offset()));
 }
 
 void TypeTestingStubGenerator::
-    BuildOptimizedSubclassRangeCheckWithTypeArguments(Assembler* assembler,
-                                                      HierarchyInfo* hi,
-                                                      const Class& type_class,
-                                                      const TypeArguments& tp,
-                                                      const TypeArguments& ta) {
+    BuildOptimizedSubclassRangeCheckWithTypeArguments(
+        compiler::Assembler* assembler,
+        HierarchyInfo* hi,
+        const Class& type_class,
+        const TypeArguments& tp,
+        const TypeArguments& ta) {
   const Register kInstanceReg = R0;
   const Register kInstanceTypeArguments = NOTFP;
   const Register kClassIdReg = R9;
@@ -45,11 +47,11 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedTypeArgumentValueCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const AbstractType& type_arg,
     intptr_t type_param_value_offset_i,
-    Label* check_failed) {
+    compiler::Label* check_failed) {
   const Register kInstantiatorTypeArgumentsReg = R2;
   const Register kFunctionTypeArgumentsReg = R1;
   const Register kInstanceTypeArguments = NOTFP;
diff --git a/runtime/vm/type_testing_stubs_arm64.cc b/runtime/vm/type_testing_stubs_arm64.cc
index 0f2981e..4105fbd1 100644
--- a/runtime/vm/type_testing_stubs_arm64.cc
+++ b/runtime/vm/type_testing_stubs_arm64.cc
@@ -13,7 +13,7 @@
 namespace dart {
 
 void TypeTestingStubGenerator::BuildOptimizedTypeTestStub(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const Type& type,
     const Class& type_class) {
@@ -23,17 +23,19 @@
   BuildOptimizedTypeTestStubFastCases(assembler, hi, type, type_class,
                                       kInstanceReg, kClassIdReg);
 
-  __ ldr(CODE_REG, Address(THR, Thread::slow_type_test_stub_offset()));
-  __ ldr(R9, FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ ldr(CODE_REG,
+         compiler::Address(THR, Thread::slow_type_test_stub_offset()));
+  __ ldr(R9, compiler::FieldAddress(CODE_REG, Code::entry_point_offset()));
   __ br(R9);
 }
 
 void TypeTestingStubGenerator::
-    BuildOptimizedSubclassRangeCheckWithTypeArguments(Assembler* assembler,
-                                                      HierarchyInfo* hi,
-                                                      const Class& type_class,
-                                                      const TypeArguments& tp,
-                                                      const TypeArguments& ta) {
+    BuildOptimizedSubclassRangeCheckWithTypeArguments(
+        compiler::Assembler* assembler,
+        HierarchyInfo* hi,
+        const Class& type_class,
+        const TypeArguments& tp,
+        const TypeArguments& ta) {
   const Register kInstanceReg = R0;
   const Register kInstanceTypeArguments = R7;
   const Register kClassIdReg = R9;
@@ -44,11 +46,11 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedTypeArgumentValueCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const AbstractType& type_arg,
     intptr_t type_param_value_offset_i,
-    Label* check_failed) {
+    compiler::Label* check_failed) {
   const Register kInstantiatorTypeArgumentsReg = R1;
   const Register kFunctionTypeArgumentsReg = R2;
   const Register kInstanceTypeArguments = R7;
diff --git a/runtime/vm/type_testing_stubs_x64.cc b/runtime/vm/type_testing_stubs_x64.cc
index 69991de..6b13861 100644
--- a/runtime/vm/type_testing_stubs_x64.cc
+++ b/runtime/vm/type_testing_stubs_x64.cc
@@ -13,7 +13,7 @@
 namespace dart {
 
 void TypeTestingStubGenerator::BuildOptimizedTypeTestStub(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const Type& type,
     const Class& type_class) {
@@ -23,16 +23,18 @@
   BuildOptimizedTypeTestStubFastCases(assembler, hi, type, type_class,
                                       kInstanceReg, kClassIdReg);
 
-  __ movq(CODE_REG, Address(THR, Thread::slow_type_test_stub_offset()));
-  __ jmp(FieldAddress(CODE_REG, Code::entry_point_offset()));
+  __ movq(CODE_REG,
+          compiler::Address(THR, Thread::slow_type_test_stub_offset()));
+  __ jmp(compiler::FieldAddress(CODE_REG, Code::entry_point_offset()));
 }
 
 void TypeTestingStubGenerator::
-    BuildOptimizedSubclassRangeCheckWithTypeArguments(Assembler* assembler,
-                                                      HierarchyInfo* hi,
-                                                      const Class& type_class,
-                                                      const TypeArguments& tp,
-                                                      const TypeArguments& ta) {
+    BuildOptimizedSubclassRangeCheckWithTypeArguments(
+        compiler::Assembler* assembler,
+        HierarchyInfo* hi,
+        const Class& type_class,
+        const TypeArguments& tp,
+        const TypeArguments& ta) {
   const Register kInstanceReg = RAX;
   const Register kInstanceTypeArguments = RSI;
   const Register kClassIdReg = TMP;
@@ -43,11 +45,11 @@
 }
 
 void TypeTestingStubGenerator::BuildOptimizedTypeArgumentValueCheck(
-    Assembler* assembler,
+    compiler::Assembler* assembler,
     HierarchyInfo* hi,
     const AbstractType& type_arg,
     intptr_t type_param_value_offset_i,
-    Label* check_failed) {
+    compiler::Label* check_failed) {
   const Register kInstanceTypeArguments = RSI;
   const Register kInstantiatorTypeArgumentsReg = RDX;
   const Register kFunctionTypeArgumentsReg = RCX;
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index d7a6e3c..c8e96b9 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -37,9 +37,9 @@
 const intptr_t platform_strong_dill_size = kPlatformStrongDillSize;
 
 const uint8_t* TesterState::vm_snapshot_data = NULL;
-Dart_IsolateCreateCallback TesterState::create_callback = NULL;
+Dart_IsolateGroupCreateCallback TesterState::create_callback = NULL;
 Dart_IsolateShutdownCallback TesterState::shutdown_callback = NULL;
-Dart_IsolateCleanupCallback TesterState::cleanup_callback = NULL;
+Dart_IsolateGroupCleanupCallback TesterState::group_cleanup_callback = nullptr;
 const char** TesterState::argv = NULL;
 int TesterState::argc = 0;
 
@@ -107,17 +107,20 @@
                                      intptr_t len,
                                      const uint8_t* instr_buffer,
                                      const char* name,
-                                     void* data) {
+                                     void* group_data,
+                                     void* isolate_data) {
   char* err;
   Dart_IsolateFlags api_flags;
   Isolate::FlagsInitialize(&api_flags);
   Dart_Isolate isolate = NULL;
   if (len == 0) {
-    isolate = Dart_CreateIsolate(name, NULL, data_buffer, instr_buffer, NULL,
-                                 NULL, &api_flags, data, &err);
+    isolate = Dart_CreateIsolateGroup(name, NULL, data_buffer, instr_buffer,
+                                      NULL, NULL, &api_flags, group_data,
+                                      isolate_data, &err);
   } else {
-    isolate = Dart_CreateIsolateFromKernel(name, NULL, data_buffer, len,
-                                           &api_flags, data, &err);
+    isolate = Dart_CreateIsolateGroupFromKernel(name, NULL, data_buffer, len,
+                                                &api_flags, group_data,
+                                                isolate_data, &err);
   }
   if (isolate == NULL) {
     OS::PrintErr("Creation of isolate failed '%s'\n", err);
@@ -127,10 +130,13 @@
   return isolate;
 }
 
-Dart_Isolate TestCase::CreateTestIsolate(const char* name, void* data) {
+Dart_Isolate TestCase::CreateTestIsolate(const char* name,
+                                         void* group_data,
+                                         void* isolate_data) {
   return CreateIsolate(bin::core_isolate_snapshot_data,
                        0 /* Snapshots have length encoded within them. */,
-                       bin::core_isolate_snapshot_instructions, name, data);
+                       bin::core_isolate_snapshot_instructions, name,
+                       group_data, isolate_data);
 }
 
 static const char* kPackageScheme = "package:";
@@ -674,7 +680,7 @@
         KernelIsolate::CompileExpressionToKernel(
             expr.ToCString(), param_names, Array::empty_array(),
             String::Handle(lib.url()).ToCString(), /* klass=*/nullptr,
-            /* is_static= */ false);
+            /* is_static= */ true);
     if (compilation_result.status != Dart_KernelCompilationStatus_Ok) {
       return Api::NewError("%s", compilation_result.error);
     }
diff --git a/runtime/vm/unit_test.h b/runtime/vm/unit_test.h
index 742e3a7..af1e38e 100644
--- a/runtime/vm/unit_test.h
+++ b/runtime/vm/unit_test.h
@@ -86,12 +86,12 @@
 // The ASSEMBLER_TEST_GENERATE macro is used to generate a unit test
 // for the assembler.
 #define ASSEMBLER_TEST_GENERATE(name, assembler)                               \
-  void AssemblerTestGenerate##name(Assembler* assembler)
+  void AssemblerTestGenerate##name(compiler::Assembler* assembler)
 
 // The ASSEMBLER_TEST_EXTERN macro is used to declare a unit test
 // for the assembler.
 #define ASSEMBLER_TEST_EXTERN(name)                                            \
-  extern void AssemblerTestGenerate##name(Assembler* assembler);
+  extern void AssemblerTestGenerate##name(compiler::Assembler* assembler);
 
 // The ASSEMBLER_TEST_RUN macro is used to execute the assembler unit
 // test generated using the ASSEMBLER_TEST_GENERATE macro.
@@ -103,8 +103,8 @@
       bool use_far_branches = false;                                           \
       LongJumpScope jump;                                                      \
       if (setjmp(*jump.Set()) == 0) {                                          \
-        ObjectPoolBuilder object_pool_builder;                                 \
-        Assembler assembler(&object_pool_builder, use_far_branches);           \
+        compiler::ObjectPoolBuilder object_pool_builder;                       \
+        compiler::Assembler assembler(&object_pool_builder, use_far_branches); \
         AssemblerTest test("" #name, &assembler);                              \
         AssemblerTestGenerate##name(test.assembler());                         \
         test.Assemble();                                                       \
@@ -116,8 +116,8 @@
     const Error& error = Error::Handle(Thread::Current()->sticky_error());     \
     if (error.raw() == Object::branch_offset_error().raw()) {                  \
       bool use_far_branches = true;                                            \
-      ObjectPoolBuilder object_pool_builder;                                   \
-      Assembler assembler(&object_pool_builder, use_far_branches);             \
+      compiler::ObjectPoolBuilder object_pool_builder;                         \
+      compiler::Assembler assembler(&object_pool_builder, use_far_branches);   \
       AssemblerTest test("" #name, &assembler);                                \
       AssemblerTestGenerate##name(test.assembler());                           \
       test.Assemble();                                                         \
@@ -232,9 +232,9 @@
 class TesterState : public AllStatic {
  public:
   static const uint8_t* vm_snapshot_data;
-  static Dart_IsolateCreateCallback create_callback;
+  static Dart_IsolateGroupCreateCallback create_callback;
   static Dart_IsolateShutdownCallback shutdown_callback;
-  static Dart_IsolateCleanupCallback cleanup_callback;
+  static Dart_IsolateGroupCleanupCallback group_cleanup_callback;
   static const char** argv;
   static int argc;
 };
@@ -358,8 +358,9 @@
                                                     const char* name = NULL) {
     return CreateIsolate(buffer, 0, NULL, name);
   }
-  static Dart_Isolate CreateTestIsolate(const char* name = NULL,
-                                        void* data = NULL);
+  static Dart_Isolate CreateTestIsolate(const char* name = nullptr,
+                                        void* isolate_group_data = nullptr,
+                                        void* isolate_data = nullptr);
   static Dart_Handle library_handler(Dart_LibraryTag tag,
                                      Dart_Handle library,
                                      Dart_Handle url);
@@ -393,7 +394,8 @@
                                     intptr_t len,
                                     const uint8_t* instr_buffer,
                                     const char* name,
-                                    void* data = NULL);
+                                    void* group_data = nullptr,
+                                    void* isolate_data = nullptr);
 
   static char* ValidateCompilationResult(Zone* zone,
                                          Dart_KernelCompilationResult result,
@@ -460,14 +462,14 @@
 
 class AssemblerTest {
  public:
-  AssemblerTest(const char* name, Assembler* assembler)
+  AssemblerTest(const char* name, compiler::Assembler* assembler)
       : name_(name), assembler_(assembler), code_(Code::ZoneHandle()) {
     ASSERT(name != NULL);
     ASSERT(assembler != NULL);
   }
   ~AssemblerTest() {}
 
-  Assembler* assembler() const { return assembler_; }
+  compiler::Assembler* assembler() const { return assembler_; }
 
   const Code& code() const { return code_; }
 
@@ -588,7 +590,7 @@
 
  private:
   const char* name_;
-  Assembler* assembler_;
+  compiler::Assembler* assembler_;
   Code& code_;
   static const intptr_t DISASSEMBLY_SIZE = 10240;
   char disassembly_[DISASSEMBLY_SIZE];
diff --git a/runtime/vm/virtual_memory.h b/runtime/vm/virtual_memory.h
index a91f07a..2eb4372 100644
--- a/runtime/vm/virtual_memory.h
+++ b/runtime/vm/virtual_memory.h
@@ -6,6 +6,7 @@
 #define RUNTIME_VM_VIRTUAL_MEMORY_H_
 
 #include "platform/utils.h"
+#include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/memory_region.h"
 
@@ -32,6 +33,9 @@
 
   static void Init();
 
+  // Returns true if dual mapping is enabled.
+  static bool DualMappingEnabled();
+
   bool Contains(uword addr) const { return region_.Contains(addr); }
   bool ContainsAlias(uword addr) const {
     return (AliasOffset() != 0) && alias_.Contains(addr);
diff --git a/runtime/vm/virtual_memory_fuchsia.cc b/runtime/vm/virtual_memory_fuchsia.cc
index 91e9a78..09e946d 100644
--- a/runtime/vm/virtual_memory_fuchsia.cc
+++ b/runtime/vm/virtual_memory_fuchsia.cc
@@ -57,6 +57,10 @@
   }
 }
 
+bool VirtualMemory::DualMappingEnabled() {
+  return FLAG_dual_map_code;
+}
+
 VirtualMemory* VirtualMemory::AllocateAligned(intptr_t size,
                                               intptr_t alignment,
                                               bool is_executable,
@@ -65,6 +69,10 @@
   // is_executable = true) is allocated as non-executable and later
   // changed to executable via VirtualMemory::Protect, which requires
   // ZX_RIGHT_EXECUTE on the underlying VMO.
+  //
+  // If FLAG_dual_map_code is active, the executable mapping will be mapped RX
+  // immediately and never changes protection until it is eventually unmapped.
+  //
   // In addition, dual mapping of the same underlying code memory is provided.
   const bool dual_mapping =
       is_executable && FLAG_write_protect_code && FLAG_dual_map_code;
@@ -118,8 +126,10 @@
   VirtualMemory* result;
 
   if (dual_mapping) {
-    // ZX_VM_PERM_EXECUTE is added later via VirtualMemory::Protect.
-    const zx_vm_option_t alias_options = ZX_VM_PERM_READ | align_flag;
+    // The mapping will be RX and stays that way until it will eventually be
+    // unmapped.
+    const zx_vm_option_t alias_options =
+        ZX_VM_PERM_READ | ZX_VM_PERM_EXECUTE | align_flag;
     status = zx_vmar_map(vmar, alias_options, 0, vmo, 0u, size, &base);
     LOG_INFO("zx_vmar_map(%u, 0x%lx, 0x%lx)\n", alias_options, base, size);
     if (status != ZX_OK) {
diff --git a/runtime/vm/virtual_memory_posix.cc b/runtime/vm/virtual_memory_posix.cc
index bf9833f..2bcced1 100644
--- a/runtime/vm/virtual_memory_posix.cc
+++ b/runtime/vm/virtual_memory_posix.cc
@@ -83,6 +83,10 @@
 #endif  // defined(DUAL_MAPPING_SUPPORTED)
 }
 
+bool VirtualMemory::DualMappingEnabled() {
+  return FLAG_dual_map_code;
+}
+
 static void unmap(uword start, uword end) {
   ASSERT(start <= end);
   uword size = end - start;
@@ -160,6 +164,9 @@
   // When FLAG_write_protect_code is active, code memory (indicated by
   // is_executable = true) is allocated as non-executable and later
   // changed to executable via VirtualMemory::Protect.
+  //
+  // If FLAG_dual_map_code is active, the executable mapping will be mapped RX
+  // immediately and never changes protection until it is eventually unmapped.
   ASSERT(Utils::IsAligned(size, page_size_));
   ASSERT(Utils::IsPowerOfTwo(alignment));
   ASSERT(Utils::IsAligned(alignment, page_size_));
@@ -184,9 +191,10 @@
       close(fd);
       return NULL;
     }
+    // The mapping will be RX and stays that way until it will eventually be
+    // unmapped.
     MemoryRegion region(region_ptr, size);
-    // PROT_EXEC is added later via VirtualMemory::Protect.
-    const int alias_prot = PROT_READ;
+    const int alias_prot = PROT_READ | PROT_EXEC;
     void* alias_ptr =
         MapAligned(fd, alias_prot, size, alignment, allocated_size);
     close(fd);
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 3ec743f0..33d4edbc 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -24,6 +24,10 @@
   page_size_ = info.dwPageSize;
 }
 
+bool VirtualMemory::DualMappingEnabled() {
+  return false;
+}
+
 VirtualMemory* VirtualMemory::AllocateAligned(intptr_t size,
                                               intptr_t alignment,
                                               bool is_executable,
diff --git a/runtime/vm/visitor.h b/runtime/vm/visitor.h
index 165aa3e..cd0e967 100644
--- a/runtime/vm/visitor.h
+++ b/runtime/vm/visitor.h
@@ -20,7 +20,8 @@
 // An object pointer visitor interface.
 class ObjectPointerVisitor {
  public:
-  explicit ObjectPointerVisitor(Isolate* isolate) : isolate_(isolate) {}
+  explicit ObjectPointerVisitor(Isolate* isolate)
+      : isolate_(isolate), gc_root_type_("unknown") {}
   virtual ~ObjectPointerVisitor() {}
 
   Isolate* isolate() const { return isolate_; }
@@ -44,8 +45,18 @@
 
   void VisitPointer(RawObject** p) { VisitPointers(p, p); }
 
+  const char* gc_root_type() const { return gc_root_type_; }
+  void set_gc_root_type(const char* gc_root_type) {
+    gc_root_type_ = gc_root_type;
+  }
+
+  void clear_gc_root_type() { gc_root_type_ = "unknown"; }
+
+  virtual bool visit_weak_persistent_handles() const { return false; }
+
  private:
   Isolate* isolate_;
+  const char* gc_root_type_;
 
   DISALLOW_IMPLICIT_CONSTRUCTORS(ObjectPointerVisitor);
 };
diff --git a/samples-dev/swarm/appengine/encoder.py b/samples-dev/swarm/appengine/encoder.py
index 6aa3c6a..a6c0c2e 100644
--- a/samples-dev/swarm/appengine/encoder.py
+++ b/samples-dev/swarm/appengine/encoder.py
@@ -1,7 +1,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 Encoder shares a lot in common with protobufs.  It uses variable length
 ints and size-encoded strings and binary values.  Other than being hugely
@@ -14,47 +13,49 @@
 
 import base64
 
+
 class Encoder:
-  def __init__(self):
-    self.data = []
 
-  def writeInt(self, value):
-    '''Uses a 7-bit per byte encoding to stay UTF-8 "safe".'''
-    bits = value & 0x3f
-    value >>= 6
-    while value:
-      self.data.append(chr(0x40|bits))
-      bits = value & 0x3f
-      value >>= 6
-    self.data.append(chr(bits))
+    def __init__(self):
+        self.data = []
 
-  def writeBool(self, b):
-    self.data.append(('F', 'T')[b])
+    def writeInt(self, value):
+        '''Uses a 7-bit per byte encoding to stay UTF-8 "safe".'''
+        bits = value & 0x3f
+        value >>= 6
+        while value:
+            self.data.append(chr(0x40 | bits))
+            bits = value & 0x3f
+            value >>= 6
+        self.data.append(chr(bits))
 
-  def writeString(self, s):
-    if not s: s = ''
-    self.writeInt(len(s))
-    self.data.append(s)
+    def writeBool(self, b):
+        self.data.append(('F', 'T')[b])
 
-  def writeBinary(self, s):
-    '''Encode binary data using base64.  This is less efficient than a 7-bit
+    def writeString(self, s):
+        if not s: s = ''
+        self.writeInt(len(s))
+        self.data.append(s)
+
+    def writeBinary(self, s):
+        '''Encode binary data using base64.  This is less efficient than a 7-bit
     encoding would be; however, it can be decoded much faster on most
     browsers due to native support for the format.'''
-    v = base64.b64encode(s)
-    self.writeInt(len(v))
-    self.data.append(v)
+        v = base64.b64encode(s)
+        self.writeInt(len(v))
+        self.data.append(v)
 
-  def writeList(self, l):
-    self.writeInt(len(l))
-    for i in l:
-      i.encode(self)
+    def writeList(self, l):
+        self.writeInt(len(l))
+        for i in l:
+            i.encode(self)
 
-  def writeRaw(self, s):
-    self.data.append(s)
+    def writeRaw(self, s):
+        self.data.append(s)
 
-  def finish(self):
-    d = ''.join(self.data)
-    return _encVarInt(len(d)) + d
+    def finish(self):
+        d = ''.join(self.data)
+        return _encVarInt(len(d)) + d
 
-  def getRaw(self):
-    return ''.join(self.data)
+    def getRaw(self):
+        return ''.join(self.data)
diff --git a/samples-dev/swarm/appengine/main.py b/samples-dev/swarm/appengine/main.py
index 5644847..f047c47 100644
--- a/samples-dev/swarm/appengine/main.py
+++ b/samples-dev/swarm/appengine/main.py
@@ -27,713 +27,755 @@
 MAX_SECTIONS = 5
 MAX_ARTICLES = 20
 
-class UserData(db.Model):
-  credentials = CredentialsProperty()
-  sections = db.ListProperty(db.Key)
 
-  def getEncodedData(self, articleKeys=None):
-    enc = encoder.Encoder()
-    # TODO(jimhug): Only return initially visible section in first reply.
-    maxSections = min(MAX_SECTIONS, len(self.sections))
-    enc.writeInt(maxSections)
-    for section in db.get(self.sections[:maxSections]):
-      section.encode(enc, articleKeys)
-    return enc.getRaw()
+class UserData(db.Model):
+    credentials = CredentialsProperty()
+    sections = db.ListProperty(db.Key)
+
+    def getEncodedData(self, articleKeys=None):
+        enc = encoder.Encoder()
+        # TODO(jimhug): Only return initially visible section in first reply.
+        maxSections = min(MAX_SECTIONS, len(self.sections))
+        enc.writeInt(maxSections)
+        for section in db.get(self.sections[:maxSections]):
+            section.encode(enc, articleKeys)
+        return enc.getRaw()
 
 
 class Section(db.Model):
-  title = db.TextProperty()
-  feeds = db.ListProperty(db.Key)
+    title = db.TextProperty()
+    feeds = db.ListProperty(db.Key)
 
-  def fixedTitle(self):
-    return self.title.split('_')[0]
+    def fixedTitle(self):
+        return self.title.split('_')[0]
 
-  def encode(self, enc, articleKeys=None):
-    # TODO(jimhug): Need to optimize format and support incremental updates.
-    enc.writeString(self.key().name())
-    enc.writeString(self.fixedTitle())
-    enc.writeInt(len(self.feeds))
-    for feed in db.get(self.feeds):
-      feed.ensureEncodedFeed()
-      enc.writeRaw(feed.encodedFeed3)
-      if articleKeys is not None:
-        articleKeys.extend(feed.topArticles)
+    def encode(self, enc, articleKeys=None):
+        # TODO(jimhug): Need to optimize format and support incremental updates.
+        enc.writeString(self.key().name())
+        enc.writeString(self.fixedTitle())
+        enc.writeInt(len(self.feeds))
+        for feed in db.get(self.feeds):
+            feed.ensureEncodedFeed()
+            enc.writeRaw(feed.encodedFeed3)
+            if articleKeys is not None:
+                articleKeys.extend(feed.topArticles)
+
 
 class Feed(db.Model):
-  title = db.TextProperty()
-  iconUrl = db.TextProperty()
-  lastUpdated = db.IntegerProperty()
+    title = db.TextProperty()
+    iconUrl = db.TextProperty()
+    lastUpdated = db.IntegerProperty()
 
-  encodedFeed3 = db.TextProperty()
-  topArticles = db.ListProperty(db.Key)
+    encodedFeed3 = db.TextProperty()
+    topArticles = db.ListProperty(db.Key)
 
-  def ensureEncodedFeed(self, force=False):
-    if force or self.encodedFeed3 is None:
-      enc = encoder.Encoder()
-      articleSet = []
-      self.encode(enc, MAX_ARTICLES, articleSet)
-      logging.info('articleSet length is %s' % len(articleSet))
-      self.topArticles = articleSet
-      self.encodedFeed3 = enc.getRaw()
-      self.put()
+    def ensureEncodedFeed(self, force=False):
+        if force or self.encodedFeed3 is None:
+            enc = encoder.Encoder()
+            articleSet = []
+            self.encode(enc, MAX_ARTICLES, articleSet)
+            logging.info('articleSet length is %s' % len(articleSet))
+            self.topArticles = articleSet
+            self.encodedFeed3 = enc.getRaw()
+            self.put()
 
-  def encode(self, enc, maxArticles, articleSet):
-    enc.writeString(self.key().name())
-    enc.writeString(self.title)
-    enc.writeString(self.iconUrl)
+    def encode(self, enc, maxArticles, articleSet):
+        enc.writeString(self.key().name())
+        enc.writeString(self.title)
+        enc.writeString(self.iconUrl)
 
-    logging.info('encoding feed: %s' % self.title)
-    encodedArts = []
+        logging.info('encoding feed: %s' % self.title)
+        encodedArts = []
 
-    for article in self.article_set.order('-date').fetch(limit=maxArticles):
-      encodedArts.append(article.encodeHeader())
-      articleSet.append(article.key())
+        for article in self.article_set.order('-date').fetch(limit=maxArticles):
+            encodedArts.append(article.encodeHeader())
+            articleSet.append(article.key())
 
-    enc.writeInt(len(encodedArts))
-    enc.writeRaw(''.join(encodedArts))
+        enc.writeInt(len(encodedArts))
+        enc.writeRaw(''.join(encodedArts))
 
 
 class Article(db.Model):
-  feed = db.ReferenceProperty(Feed)
+    feed = db.ReferenceProperty(Feed)
 
-  title = db.TextProperty()
-  author = db.TextProperty()
-  content = db.TextProperty()
-  snippet = db.TextProperty()
-  thumbnail = db.BlobProperty()
-  thumbnailSize = db.TextProperty()
-  srcurl = db.TextProperty()
-  date = db.IntegerProperty()
+    title = db.TextProperty()
+    author = db.TextProperty()
+    content = db.TextProperty()
+    snippet = db.TextProperty()
+    thumbnail = db.BlobProperty()
+    thumbnailSize = db.TextProperty()
+    srcurl = db.TextProperty()
+    date = db.IntegerProperty()
 
-  def ensureThumbnail(self):
-    # If our desired thumbnail size has changed, regenerate it and cache.
-    if self.thumbnailSize != str(THUMB_SIZE):
-       self.thumbnail = makeThumbnail(self.content)
-       self.thumbnailSize = str(THUMB_SIZE)
-       self.put()
+    def ensureThumbnail(self):
+        # If our desired thumbnail size has changed, regenerate it and cache.
+        if self.thumbnailSize != str(THUMB_SIZE):
+            self.thumbnail = makeThumbnail(self.content)
+            self.thumbnailSize = str(THUMB_SIZE)
+            self.put()
 
-  def encodeHeader(self):
-    # TODO(jmesserly): for now always unescape until the crawler catches up
-    enc = encoder.Encoder()
-    enc.writeString(self.key().name())
-    enc.writeString(unescape(self.title))
-    enc.writeString(self.srcurl)
-    enc.writeBool(self.thumbnail is not None)
-    enc.writeString(self.author)
-    enc.writeInt(self.date)
-    enc.writeString(unescape(self.snippet))
-    return enc.getRaw()
+    def encodeHeader(self):
+        # TODO(jmesserly): for now always unescape until the crawler catches up
+        enc = encoder.Encoder()
+        enc.writeString(self.key().name())
+        enc.writeString(unescape(self.title))
+        enc.writeString(self.srcurl)
+        enc.writeBool(self.thumbnail is not None)
+        enc.writeString(self.author)
+        enc.writeInt(self.date)
+        enc.writeString(unescape(self.snippet))
+        return enc.getRaw()
+
 
 class HtmlFile(db.Model):
-  content = db.BlobProperty()
-  compressed = db.BooleanProperty()
-  filename = db.StringProperty()
-  author = db.UserProperty(auto_current_user=True)
-  date = db.DateTimeProperty(auto_now_add=True)
+    content = db.BlobProperty()
+    compressed = db.BooleanProperty()
+    filename = db.StringProperty()
+    author = db.UserProperty(auto_current_user=True)
+    date = db.DateTimeProperty(auto_now_add=True)
 
 
 class UpdateHtml(webapp.RequestHandler):
-  def post(self):
-    upload_files = self.request.POST.multi.__dict__['_items']
-    version = self.request.get('version')
-    logging.info('files: %r' % upload_files)
-    for data in upload_files:
-      if data[0] != 'files': continue
-      file = data[1]
-      filename = file.filename
-      if version:
-        filename = '%s-%s' % (version, filename)
-      logging.info('upload: %r' % filename)
 
-      htmlFile = HtmlFile.get_or_insert(filename)
-      htmlFile.filename = filename
+    def post(self):
+        upload_files = self.request.POST.multi.__dict__['_items']
+        version = self.request.get('version')
+        logging.info('files: %r' % upload_files)
+        for data in upload_files:
+            if data[0] != 'files': continue
+            file = data[1]
+            filename = file.filename
+            if version:
+                filename = '%s-%s' % (version, filename)
+            logging.info('upload: %r' % filename)
 
-      # If text > (1MB - 1KB) then gzip text to fit in 1MB space
-      text = file.value
-      if len(text) > 1024*1023:
-        data = StringIO.StringIO()
-        gz = gzip.GzipFile(str(filename), 'wb', fileobj=data)
-        gz.write(text)
-        gz.close()
-        htmlFile.content = data.getvalue()
-        htmlFile.compressed = True
-      else:
-        htmlFile.content = text
-        htmlFile.compressed = False
+            htmlFile = HtmlFile.get_or_insert(filename)
+            htmlFile.filename = filename
 
-      htmlFile.put()
+            # If text > (1MB - 1KB) then gzip text to fit in 1MB space
+            text = file.value
+            if len(text) > 1024 * 1023:
+                data = StringIO.StringIO()
+                gz = gzip.GzipFile(str(filename), 'wb', fileobj=data)
+                gz.write(text)
+                gz.close()
+                htmlFile.content = data.getvalue()
+                htmlFile.compressed = True
+            else:
+                htmlFile.content = text
+                htmlFile.compressed = False
 
-    self.redirect('/')
+            htmlFile.put()
+
+        self.redirect('/')
+
 
 class TopHandler(webapp.RequestHandler):
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    prefs = UserData.get_by_key_name(user.user_id())
-    if prefs is None:
-      self.redirect('/update/user')
-      return
 
-    params = {'files': HtmlFile.all().order('-date').fetch(limit=30)}
-    self.response.out.write(template.render('top.html', params))
+    @login_required
+    def get(self):
+        user = users.get_current_user()
+        prefs = UserData.get_by_key_name(user.user_id())
+        if prefs is None:
+            self.redirect('/update/user')
+            return
+
+        params = {'files': HtmlFile.all().order('-date').fetch(limit=30)}
+        self.response.out.write(template.render('top.html', params))
 
 
 class MainHandler(webapp.RequestHandler):
 
-  @login_required
-  def get(self, name):
-    if name == 'dev':
-     return self.handleDev()
+    @login_required
+    def get(self, name):
+        if name == 'dev':
+            return self.handleDev()
 
-    elif name == 'login':
-      return self.handleLogin()
+        elif name == 'login':
+            return self.handleLogin()
 
-    elif name == 'upload':
-      return self.handleUpload()
+        elif name == 'upload':
+            return self.handleUpload()
 
-    user = users.get_current_user()
-    prefs = UserData.get_by_key_name(user.user_id())
-    if prefs is None:
-      return self.handleLogin()
+        user = users.get_current_user()
+        prefs = UserData.get_by_key_name(user.user_id())
+        if prefs is None:
+            return self.handleLogin()
 
-    html = HtmlFile.get_by_key_name(name)
-    if html is None:
-      self.error(404)
-      return
+        html = HtmlFile.get_by_key_name(name)
+        if html is None:
+            self.error(404)
+            return
 
-    self.response.headers['Content-Type'] = 'text/html'
+        self.response.headers['Content-Type'] = 'text/html'
 
-    if html.compressed:
-      # TODO(jimhug): This slightly sucks ;-)
-      # Can we write directly to the response.out?
-      gz = gzip.GzipFile(name, 'rb', fileobj=StringIO.StringIO(html.content))
-      self.response.out.write(gz.read())
-      gz.close()
-    else:
-      self.response.out.write(html.content)
+        if html.compressed:
+            # TODO(jimhug): This slightly sucks ;-)
+            # Can we write directly to the response.out?
+            gz = gzip.GzipFile(
+                name, 'rb', fileobj=StringIO.StringIO(html.content))
+            self.response.out.write(gz.read())
+            gz.close()
+        else:
+            self.response.out.write(html.content)
 
-    # TODO(jimhug): Include first data packet with html.
+        # TODO(jimhug): Include first data packet with html.
 
-  def handleLogin(self):
-    user = users.get_current_user()
-    # TODO(jimhug): Manage secrets for dart.googleplex.com better.
-    # TODO(jimhug): Confirm that we need client_secret.
-    flow = OAuth2WebServerFlow(
-        client_id='267793340506.apps.googleusercontent.com',
-        client_secret='5m8H-zyamfTYg5vnpYu1uGMU',
-        scope=READER_API,
-        user_agent='swarm')
+    def handleLogin(self):
+        user = users.get_current_user()
+        # TODO(jimhug): Manage secrets for dart.googleplex.com better.
+        # TODO(jimhug): Confirm that we need client_secret.
+        flow = OAuth2WebServerFlow(
+            client_id='267793340506.apps.googleusercontent.com',
+            client_secret='5m8H-zyamfTYg5vnpYu1uGMU',
+            scope=READER_API,
+            user_agent='swarm')
 
-    callback = self.request.relative_url('/oauth2callback')
-    authorize_url = flow.step1_get_authorize_url(callback)
+        callback = self.request.relative_url('/oauth2callback')
+        authorize_url = flow.step1_get_authorize_url(callback)
 
-    memcache.set(user.user_id(), pickle.dumps(flow))
+        memcache.set(user.user_id(), pickle.dumps(flow))
 
-    content = template.render('login.html', {'authorize': authorize_url})
-    self.response.out.write(content)
+        content = template.render('login.html', {'authorize': authorize_url})
+        self.response.out.write(content)
 
-  def handleDev(self):
-    user = users.get_current_user()
-    content = template.render('dev.html', {'user': user})
-    self.response.out.write(content)
+    def handleDev(self):
+        user = users.get_current_user()
+        content = template.render('dev.html', {'user': user})
+        self.response.out.write(content)
 
-  def handleUpload(self):
-    user = users.get_current_user()
-    content = template.render('upload.html', {'user': user})
-    self.response.out.write(content)
+    def handleUpload(self):
+        user = users.get_current_user()
+        content = template.render('upload.html', {'user': user})
+        self.response.out.write(content)
 
 
 class UploadFeed(webapp.RequestHandler):
-  def post(self):
-    upload_files = self.request.POST.multi.__dict__['_items']
-    version = self.request.get('version')
-    logging.info('files: %r' % upload_files)
-    for data in upload_files:
-      if data[0] != 'files': continue
-      file = data[1]
-      logging.info('upload feed: %r' % file.filename)
 
-      data = json.loads(file.value)
+    def post(self):
+        upload_files = self.request.POST.multi.__dict__['_items']
+        version = self.request.get('version')
+        logging.info('files: %r' % upload_files)
+        for data in upload_files:
+            if data[0] != 'files': continue
+            file = data[1]
+            logging.info('upload feed: %r' % file.filename)
 
-      feedId = file.filename
-      feed = Feed.get_or_insert(feedId)
+            data = json.loads(file.value)
 
-      # Find the section to add it to.
-      sectionTitle = data['section']
-      section = findSectionByTitle(sectionTitle)
-      if section != None:
-        if feed.key() in section.feeds:
-          logging.warn('Already contains feed %s, replacing' % feedId)
-          section.feeds.remove(feed.key())
+            feedId = file.filename
+            feed = Feed.get_or_insert(feedId)
 
-        # Add the feed to the section.
-        section.feeds.insert(0, feed.key())
-        section.put()
+            # Find the section to add it to.
+            sectionTitle = data['section']
+            section = findSectionByTitle(sectionTitle)
+            if section != None:
+                if feed.key() in section.feeds:
+                    logging.warn('Already contains feed %s, replacing' % feedId)
+                    section.feeds.remove(feed.key())
 
-        # Add the articles.
-        collectFeed(feed, data)
+                # Add the feed to the section.
+                section.feeds.insert(0, feed.key())
+                section.put()
 
-      else:
-        logging.error('Could not find section %s to add the feed to' %
-            sectionTitle)
+                # Add the articles.
+                collectFeed(feed, data)
 
-    self.redirect('/')
+            else:
+                logging.error('Could not find section %s to add the feed to' %
+                              sectionTitle)
+
+        self.redirect('/')
+
 
 # TODO(jimhug): Batch these up and request them more aggressively.
 class DataHandler(webapp.RequestHandler):
-  def get(self, name):
-    if name.endswith('.jpg'):
-      # Must be a thumbnail
-      key = urllib2.unquote(name[:-len('.jpg')])
-      article = Article.get_by_key_name(key)
-      self.response.headers['Content-Type'] = 'image/jpeg'
-      # cache images for 10 hours
-      self.response.headers['Cache-Control'] = 'public,max-age=36000'
-      article.ensureThumbnail()
-      self.response.out.write(article.thumbnail)
-    elif name.endswith('.html'):
-      # Must be article content
-      key = urllib2.unquote(name[:-len('.html')])
-      article = Article.get_by_key_name(key)
-      self.response.headers['Content-Type'] = 'text/html'
-      if article is None:
-        content = '<h2>Missing article</h2>'
-      else:
-        content = article.content
-      # cache article content for 10 hours
-      self.response.headers['Cache-Control'] = 'public,max-age=36000'
-      self.response.out.write(content)
-    elif name == 'user.data':
-      self.response.out.write(self.getUserData())
-    elif name == 'CannedData.dart':
-      self.canData()
-    elif name == 'CannedData.zip':
-      self.canDataZip()
-    else:
-      self.error(404)
 
-  def getUserData(self, articleKeys=None):
-    user = users.get_current_user()
-    user_id = user.user_id()
+    def get(self, name):
+        if name.endswith('.jpg'):
+            # Must be a thumbnail
+            key = urllib2.unquote(name[:-len('.jpg')])
+            article = Article.get_by_key_name(key)
+            self.response.headers['Content-Type'] = 'image/jpeg'
+            # cache images for 10 hours
+            self.response.headers['Cache-Control'] = 'public,max-age=36000'
+            article.ensureThumbnail()
+            self.response.out.write(article.thumbnail)
+        elif name.endswith('.html'):
+            # Must be article content
+            key = urllib2.unquote(name[:-len('.html')])
+            article = Article.get_by_key_name(key)
+            self.response.headers['Content-Type'] = 'text/html'
+            if article is None:
+                content = '<h2>Missing article</h2>'
+            else:
+                content = article.content
+            # cache article content for 10 hours
+            self.response.headers['Cache-Control'] = 'public,max-age=36000'
+            self.response.out.write(content)
+        elif name == 'user.data':
+            self.response.out.write(self.getUserData())
+        elif name == 'CannedData.dart':
+            self.canData()
+        elif name == 'CannedData.zip':
+            self.canDataZip()
+        else:
+            self.error(404)
 
-    key = 'data_' + user_id
-    # need to flush memcache fairly frequently...
-    data = memcache.get(key)
-    if data is None:
-      prefs = UserData.get_or_insert(user_id)
-      if prefs is None:
-        # TODO(jimhug): Graceful failure for unknown users.
-        pass
-      data = prefs.getEncodedData(articleKeys)
-      # TODO(jimhug): memcache.set(key, data)
+    def getUserData(self, articleKeys=None):
+        user = users.get_current_user()
+        user_id = user.user_id()
 
-    return data
+        key = 'data_' + user_id
+        # need to flush memcache fairly frequently...
+        data = memcache.get(key)
+        if data is None:
+            prefs = UserData.get_or_insert(user_id)
+            if prefs is None:
+                # TODO(jimhug): Graceful failure for unknown users.
+                pass
+            data = prefs.getEncodedData(articleKeys)
+            # TODO(jimhug): memcache.set(key, data)
 
-  def canData(self):
-    def makeDartSafe(data):
-      return repr(unicode(data))[1:].replace('$', '\\$')
+        return data
 
-    lines = ['// TODO(jimhug): Work out correct copyright for this file.',
-             'class CannedData {']
+    def canData(self):
 
-    user = users.get_current_user()
-    prefs = UserData.get_by_key_name(user.user_id())
-    articleKeys = []
-    data = prefs.getEncodedData(articleKeys)
-    lines.append('  static const Map<String,String> data = const {')
-    for article in db.get(articleKeys):
-      key = makeDartSafe(urllib.quote(article.key().name())+'.html')
-      lines.append('    %s:%s, ' % (key, makeDartSafe(article.content)))
+        def makeDartSafe(data):
+            return repr(unicode(data))[1:].replace('$', '\\$')
 
-    lines.append('    "user.data":%s' % makeDartSafe(data))
+        lines = [
+            '// TODO(jimhug): Work out correct copyright for this file.',
+            'class CannedData {'
+        ]
 
-    lines.append('  };')
+        user = users.get_current_user()
+        prefs = UserData.get_by_key_name(user.user_id())
+        articleKeys = []
+        data = prefs.getEncodedData(articleKeys)
+        lines.append('  static const Map<String,String> data = const {')
+        for article in db.get(articleKeys):
+            key = makeDartSafe(urllib.quote(article.key().name()) + '.html')
+            lines.append('    %s:%s, ' % (key, makeDartSafe(article.content)))
 
-    lines.append('}')
-    self.response.headers['Content-Type'] = 'application/dart'
-    self.response.out.write('\n'.join(lines))
+        lines.append('    "user.data":%s' % makeDartSafe(data))
 
-  # Get canned static data
-  def canDataZip(self):
-    # We need to zip into an in-memory buffer to get the right string encoding
-    # behavior.
-    data = StringIO.StringIO()
-    result = zipfile.ZipFile(data, 'w')
+        lines.append('  };')
 
-    articleKeys = []
-    result.writestr('data/user.data',
-        self.getUserData(articleKeys).encode('utf-8'))
-    logging.info('  adding articles %s' % len(articleKeys))
-    images = []
-    for article in db.get(articleKeys):
-      article.ensureThumbnail()
-      path = 'data/' + article.key().name() + '.html'
-      result.writestr(path.encode('utf-8'), article.content.encode('utf-8'))
-      if article.thumbnail:
-        path = 'data/' + article.key().name() + '.jpg'
-        result.writestr(path.encode('utf-8'), article.thumbnail)
+        lines.append('}')
+        self.response.headers['Content-Type'] = 'application/dart'
+        self.response.out.write('\n'.join(lines))
 
-    result.close()
-    logging.info('writing CannedData.zip')
-    self.response.headers['Content-Type'] = 'multipart/x-zip'
-    disposition = 'attachment; filename=CannedData.zip'
-    self.response.headers['Content-Disposition'] = disposition
-    self.response.out.write(data.getvalue())
-    data.close()
+    # Get canned static data
+    def canDataZip(self):
+        # We need to zip into an in-memory buffer to get the right string encoding
+        # behavior.
+        data = StringIO.StringIO()
+        result = zipfile.ZipFile(data, 'w')
+
+        articleKeys = []
+        result.writestr('data/user.data',
+                        self.getUserData(articleKeys).encode('utf-8'))
+        logging.info('  adding articles %s' % len(articleKeys))
+        images = []
+        for article in db.get(articleKeys):
+            article.ensureThumbnail()
+            path = 'data/' + article.key().name() + '.html'
+            result.writestr(
+                path.encode('utf-8'), article.content.encode('utf-8'))
+            if article.thumbnail:
+                path = 'data/' + article.key().name() + '.jpg'
+                result.writestr(path.encode('utf-8'), article.thumbnail)
+
+        result.close()
+        logging.info('writing CannedData.zip')
+        self.response.headers['Content-Type'] = 'multipart/x-zip'
+        disposition = 'attachment; filename=CannedData.zip'
+        self.response.headers['Content-Disposition'] = disposition
+        self.response.out.write(data.getvalue())
+        data.close()
 
 
 class SetDefaultFeeds(webapp.RequestHandler):
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    prefs = UserData.get_or_insert(user.user_id())
 
-    prefs.sections = [
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Top'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Design'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Eco'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Geek'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Google'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Seattle'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Tech'),
-      db.Key.from_path('Section', 'user/17857667084667353155/label/Web')]
+    @login_required
+    def get(self):
+        user = users.get_current_user()
+        prefs = UserData.get_or_insert(user.user_id())
 
-    prefs.put()
+        prefs.sections = [
+            db.Key.from_path('Section', 'user/17857667084667353155/label/Top'),
+            db.Key.from_path('Section',
+                             'user/17857667084667353155/label/Design'),
+            db.Key.from_path('Section', 'user/17857667084667353155/label/Eco'),
+            db.Key.from_path('Section', 'user/17857667084667353155/label/Geek'),
+            db.Key.from_path('Section',
+                             'user/17857667084667353155/label/Google'),
+            db.Key.from_path('Section',
+                             'user/17857667084667353155/label/Seattle'),
+            db.Key.from_path('Section', 'user/17857667084667353155/label/Tech'),
+            db.Key.from_path('Section', 'user/17857667084667353155/label/Web')
+        ]
 
-    self.redirect('/')
+        prefs.put()
+
+        self.redirect('/')
+
 
 class SetTestFeeds(webapp.RequestHandler):
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    prefs = UserData.get_or_insert(user.user_id())
 
-    sections = []
-    for i in range(3):
-      s1 = Section.get_or_insert('Test%d' % i)
-      s1.title = 'Section %d' % (i+1)
+    @login_required
+    def get(self):
+        user = users.get_current_user()
+        prefs = UserData.get_or_insert(user.user_id())
 
-      feeds = []
-      for j in range(4):
-        label = '%d_%d' % (i, j)
-        f1 = Feed.get_or_insert('Test%s' % label)
-        f1.title = 'Feed %s' % label
-        f1.iconUrl = getFeedIcon('http://google.com')
-        f1.lastUpdated = 0
-        f1.put()
-        feeds.append(f1.key())
+        sections = []
+        for i in range(3):
+            s1 = Section.get_or_insert('Test%d' % i)
+            s1.title = 'Section %d' % (i + 1)
 
-        for k in range(8):
-          label = '%d_%d_%d' % (i, j, k)
-          a1 = Article.get_or_insert('Test%s' % label)
-          if a1.title is None:
-            a1.feed = f1
-            a1.title = 'Article %s' % label
-            a1.author = 'anon'
-            a1.content = 'Lorem ipsum something or other...'
-            a1.snippet = 'Lorem ipsum something or other...'
-            a1.thumbnail = None
-            a1.srcurl = ''
-            a1.date = 0
+            feeds = []
+            for j in range(4):
+                label = '%d_%d' % (i, j)
+                f1 = Feed.get_or_insert('Test%s' % label)
+                f1.title = 'Feed %s' % label
+                f1.iconUrl = getFeedIcon('http://google.com')
+                f1.lastUpdated = 0
+                f1.put()
+                feeds.append(f1.key())
 
-      s1.feeds = feeds
-      s1.put()
-      sections.append(s1.key())
+                for k in range(8):
+                    label = '%d_%d_%d' % (i, j, k)
+                    a1 = Article.get_or_insert('Test%s' % label)
+                    if a1.title is None:
+                        a1.feed = f1
+                        a1.title = 'Article %s' % label
+                        a1.author = 'anon'
+                        a1.content = 'Lorem ipsum something or other...'
+                        a1.snippet = 'Lorem ipsum something or other...'
+                        a1.thumbnail = None
+                        a1.srcurl = ''
+                        a1.date = 0
 
-    prefs.sections = sections
-    prefs.put()
+            s1.feeds = feeds
+            s1.put()
+            sections.append(s1.key())
 
-    self.redirect('/')
+        prefs.sections = sections
+        prefs.put()
+
+        self.redirect('/')
 
 
 class UserLoginHandler(webapp.RequestHandler):
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    prefs = UserData.get_or_insert(user.user_id())
-    if prefs.credentials:
-      http = prefs.credentials.authorize(httplib2.Http())
 
-      response, content = http.request('%s/subscription/list?output=json' %
-                                       READER_API)
-      self.collectFeeds(prefs, content)
-      self.redirect('/')
-    else:
-      self.redirect('/login')
+    @login_required
+    def get(self):
+        user = users.get_current_user()
+        prefs = UserData.get_or_insert(user.user_id())
+        if prefs.credentials:
+            http = prefs.credentials.authorize(httplib2.Http())
 
+            response, content = http.request(
+                '%s/subscription/list?output=json' % READER_API)
+            self.collectFeeds(prefs, content)
+            self.redirect('/')
+        else:
+            self.redirect('/login')
 
-  def collectFeeds(self, prefs, content):
-    data = json.loads(content)
+    def collectFeeds(self, prefs, content):
+        data = json.loads(content)
 
-    queue_name = self.request.get('queue_name', 'priority-queue')
-    sections = {}
-    for feedData in data['subscriptions']:
-      feed = Feed.get_or_insert(feedData['id'])
-      feed.put()
-      category = feedData['categories'][0]
-      categoryId = category['id']
-      if not sections.has_key(categoryId):
-        sections[categoryId] = (category['label'], [])
+        queue_name = self.request.get('queue_name', 'priority-queue')
+        sections = {}
+        for feedData in data['subscriptions']:
+            feed = Feed.get_or_insert(feedData['id'])
+            feed.put()
+            category = feedData['categories'][0]
+            categoryId = category['id']
+            if not sections.has_key(categoryId):
+                sections[categoryId] = (category['label'], [])
 
-      # TODO(jimhug): Use Reader preferences to sort feeds in a section.
-      sections[categoryId][1].append(feed.key())
+            # TODO(jimhug): Use Reader preferences to sort feeds in a section.
+            sections[categoryId][1].append(feed.key())
 
-      # Kick off a high priority feed update
-      taskqueue.add(url='/update/feed', queue_name=queue_name,
-                    params={'id': feed.key().name()})
+            # Kick off a high priority feed update
+            taskqueue.add(
+                url='/update/feed',
+                queue_name=queue_name,
+                params={'id': feed.key().name()})
 
-    sectionKeys = []
-    for name, (title, feeds) in sections.items():
-      section = Section.get_or_insert(name)
-      section.feeds = feeds
-      section.title = title
-      section.put()
-      # Forces Top to be the first section
-      if title == 'Top': title = '0Top'
-      sectionKeys.append( (title, section.key()) )
+        sectionKeys = []
+        for name, (title, feeds) in sections.items():
+            section = Section.get_or_insert(name)
+            section.feeds = feeds
+            section.title = title
+            section.put()
+            # Forces Top to be the first section
+            if title == 'Top': title = '0Top'
+            sectionKeys.append((title, section.key()))
 
-    # TODO(jimhug): Use Reader preferences API to get users true sort order.
-    prefs.sections = [key for t, key in sorted(sectionKeys)]
-    prefs.put()
+        # TODO(jimhug): Use Reader preferences API to get users true sort order.
+        prefs.sections = [key for t, key in sorted(sectionKeys)]
+        prefs.put()
 
 
 class AllFeedsCollector(webapp.RequestHandler):
-  '''Ensures that a given feed object is locally up to date.'''
-  def post(self): return self.get()
+    '''Ensures that a given feed object is locally up to date.'''
 
-  def get(self):
-    queue_name = self.request.get('queue_name', 'background')
-    for feed in Feed.all():
-      taskqueue.add(url='/update/feed', queue_name=queue_name,
-                    params={'id': feed.key().name()})
+    def post(self):
+        return self.get()
 
-UPDATE_COUNT = 4 # The number of articles to request on periodic updates.
-INITIAL_COUNT = 40 # The number of articles to get first for a new queue.
-SNIPPET_SIZE = 180 # The length of plain-text snippet to extract.
+    def get(self):
+        queue_name = self.request.get('queue_name', 'background')
+        for feed in Feed.all():
+            taskqueue.add(
+                url='/update/feed',
+                queue_name=queue_name,
+                params={'id': feed.key().name()})
+
+
+UPDATE_COUNT = 4  # The number of articles to request on periodic updates.
+INITIAL_COUNT = 40  # The number of articles to get first for a new queue.
+SNIPPET_SIZE = 180  # The length of plain-text snippet to extract.
+
+
 class FeedCollector(webapp.RequestHandler):
-  def post(self): return self.get()
 
-  def get(self):
-    feedId = self.request.get('id')
-    feed = Feed.get_or_insert(feedId)
+    def post(self):
+        return self.get()
 
-    if feed.lastUpdated is None:
-      self.fetchn(feed, feedId, INITIAL_COUNT)
-    else:
-      self.fetchn(feed, feedId, UPDATE_COUNT)
+    def get(self):
+        feedId = self.request.get('id')
+        feed = Feed.get_or_insert(feedId)
 
-    self.response.headers['Content-Type'] = "text/plain"
+        if feed.lastUpdated is None:
+            self.fetchn(feed, feedId, INITIAL_COUNT)
+        else:
+            self.fetchn(feed, feedId, UPDATE_COUNT)
 
-  def fetchn(self, feed, feedId, n, continuation=None):
-    # basic pattern is to read by ARTICLE_COUNT until we hit existing.
-    if continuation is None:
-      apiUrl = '%s/stream/contents/%s?n=%d' % (
-        READER_API, feedId, n)
-    else:
-      apiUrl = '%s/stream/contents/%s?n=%d&c=%s' % (
-        READER_API, feedId, n, continuation)
+        self.response.headers['Content-Type'] = "text/plain"
 
-    logging.info('fetching: %s' % apiUrl)
-    result = urlfetch.fetch(apiUrl)
+    def fetchn(self, feed, feedId, n, continuation=None):
+        # basic pattern is to read by ARTICLE_COUNT until we hit existing.
+        if continuation is None:
+            apiUrl = '%s/stream/contents/%s?n=%d' % (READER_API, feedId, n)
+        else:
+            apiUrl = '%s/stream/contents/%s?n=%d&c=%s' % (READER_API, feedId, n,
+                                                          continuation)
 
-    if result.status_code == 200:
-      data = json.loads(result.content)
-      collectFeed(feed, data, continuation)
-    elif result.status_code == 401:
-      self.response.out.write( '<pre>%s</pre>' % result.content)
-    else:
-      self.response.out.write(result.status_code)
+        logging.info('fetching: %s' % apiUrl)
+        result = urlfetch.fetch(apiUrl)
+
+        if result.status_code == 200:
+            data = json.loads(result.content)
+            collectFeed(feed, data, continuation)
+        elif result.status_code == 401:
+            self.response.out.write('<pre>%s</pre>' % result.content)
+        else:
+            self.response.out.write(result.status_code)
+
 
 def findSectionByTitle(title):
-  for section in Section.all():
-    if section.fixedTitle() == title:
-      return section
-  return None
+    for section in Section.all():
+        if section.fixedTitle() == title:
+            return section
+    return None
+
 
 def collectFeed(feed, data, continuation=None):
-  '''
+    '''
   Reads a feed from the given JSON object and populates the given feed object
   in the datastore with its data.
   '''
-  if continuation is None:
-    if 'alternate' in data:
-      feed.iconUrl = getFeedIcon(data['alternate'][0]['href'])
-    feed.title = data['title']
-    feed.lastUpdated = data['updated']
+    if continuation is None:
+        if 'alternate' in data:
+            feed.iconUrl = getFeedIcon(data['alternate'][0]['href'])
+        feed.title = data['title']
+        feed.lastUpdated = data['updated']
 
-  articles = data['items']
-  logging.info('%d new articles for %s' % (len(articles), feed.title))
+    articles = data['items']
+    logging.info('%d new articles for %s' % (len(articles), feed.title))
 
-  for articleData in articles:
-    if not collectArticle(feed, articleData):
-      feed.put()
-      return False
+    for articleData in articles:
+        if not collectArticle(feed, articleData):
+            feed.put()
+            return False
 
-  if len(articles) > 0 and data.has_key('continuation'):
-    logging.info('would have looked for more articles')
-    # TODO(jimhug): Enable this continuation check when more robust
-    #self.fetchn(feed, feedId, data['continuation'])
+    if len(articles) > 0 and data.has_key('continuation'):
+        logging.info('would have looked for more articles')
+        # TODO(jimhug): Enable this continuation check when more robust
+        #self.fetchn(feed, feedId, data['continuation'])
 
-  feed.ensureEncodedFeed(force=True)
-  feed.put()
-  return True
+    feed.ensureEncodedFeed(force=True)
+    feed.put()
+    return True
+
 
 def collectArticle(feed, data):
-  '''
+    '''
   Reads an article from the given JSON object and populates the datastore with
   it.
   '''
-  if not 'title' in data:
-    # Skip this articles without titles
+    if not 'title' in data:
+        # Skip this articles without titles
+        return True
+
+    articleId = data['id']
+    article = Article.get_or_insert(articleId)
+    # TODO(jimhug): This aborts too early - at lease for one adafruit case.
+    if article.date == data['published']:
+        logging.info(
+            'found existing, aborting: %r, %r' % (articleId, article.date))
+        return False
+
+    if data.has_key('content'):
+        content = data['content']['content']
+    elif data.has_key('summary'):
+        content = data['summary']['content']
+    else:
+        content = ''
+    #TODO(jimhug): better summary?
+    article.content = content
+    article.date = data['published']
+    article.title = unescape(data['title'])
+    article.snippet = unescape(strip_tags(content)[:SNIPPET_SIZE])
+
+    article.feed = feed
+
+    # TODO(jimhug): make this canonical so UX can change for this state
+    article.author = data.get('author', 'anonymous')
+
+    article.ensureThumbnail()
+
+    article.srcurl = ''
+    if data.has_key('alternate'):
+        for alt in data['alternate']:
+            if alt.has_key('href'):
+                article.srcurl = alt['href']
     return True
 
-  articleId = data['id']
-  article = Article.get_or_insert(articleId)
-  # TODO(jimhug): This aborts too early - at lease for one adafruit case.
-  if article.date == data['published']:
-    logging.info('found existing, aborting: %r, %r' %
-      (articleId, article.date))
-    return False
-
-  if data.has_key('content'):
-    content = data['content']['content']
-  elif data.has_key('summary'):
-    content = data['summary']['content']
-  else:
-    content = ''
-  #TODO(jimhug): better summary?
-  article.content = content
-  article.date = data['published']
-  article.title = unescape(data['title'])
-  article.snippet = unescape(strip_tags(content)[:SNIPPET_SIZE])
-
-  article.feed = feed
-
-  # TODO(jimhug): make this canonical so UX can change for this state
-  article.author = data.get('author', 'anonymous')
-
-  article.ensureThumbnail()
-
-  article.srcurl = ''
-  if data.has_key('alternate'):
-    for alt in data['alternate']:
-      if alt.has_key('href'):
-        article.srcurl = alt['href']
-  return True
 
 def unescape(html):
-  "Inverse of Django's utils.html.escape function"
-  if not isinstance(html, basestring):
-      html = str(html)
-  html = html.replace('&#39;', "'").replace('&quot;', '"')
-  return html.replace('&gt;', '>').replace('&lt;', '<').replace('&amp;', '&')
+    "Inverse of Django's utils.html.escape function"
+    if not isinstance(html, basestring):
+        html = str(html)
+    html = html.replace('&#39;', "'").replace('&quot;', '"')
+    return html.replace('&gt;', '>').replace('&lt;', '<').replace('&amp;', '&')
+
 
 def getFeedIcon(url):
-  url = urlparse.urlparse(url).netloc
-  return 'http://s2.googleusercontent.com/s2/favicons?domain=%s&alt=feed' % url
+    url = urlparse.urlparse(url).netloc
+    return 'http://s2.googleusercontent.com/s2/favicons?domain=%s&alt=feed' % url
+
 
 def findImage(text):
-  img = findImgTag(text, 'jpg|jpeg|png')
-  if img is not None:
+    img = findImgTag(text, 'jpg|jpeg|png')
+    if img is not None:
+        return img
+
+    img = findVideoTag(text)
+    if img is not None:
+        return img
+
+    img = findImgTag(text, 'gif')
     return img
 
-  img = findVideoTag(text)
-  if img is not None:
-    return img
-
-  img = findImgTag(text, 'gif')
-  return img
 
 def findImgTag(text, extensions):
-  m = re.search(r'src="(http://\S+\.(%s))(\?.*)?"' % extensions, text)
-  if m is None:
-    return None
-  return m.group(1)
+    m = re.search(r'src="(http://\S+\.(%s))(\?.*)?"' % extensions, text)
+    if m is None:
+        return None
+    return m.group(1)
+
 
 def findVideoTag(text):
-  # TODO(jimhug): Add other videos beyond youtube.
-  m = re.search(r'src="http://www.youtube.com/(\S+)/(\S+)[/|"]', text)
-  if m is None:
-    return None
+    # TODO(jimhug): Add other videos beyond youtube.
+    m = re.search(r'src="http://www.youtube.com/(\S+)/(\S+)[/|"]', text)
+    if m is None:
+        return None
 
-  return 'http://img.youtube.com/vi/%s/0.jpg' % m.group(2)
+    return 'http://img.youtube.com/vi/%s/0.jpg' % m.group(2)
+
 
 def makeThumbnail(text):
-  url = None
-  try:
-    url = findImage(text)
-    if url is None:
-      return None
-    return generateThumbnail(url)
-  except:
-    logging.info('error decoding: %s' % (url or text))
-    return None
+    url = None
+    try:
+        url = findImage(text)
+        if url is None:
+            return None
+        return generateThumbnail(url)
+    except:
+        logging.info('error decoding: %s' % (url or text))
+        return None
+
 
 def generateThumbnail(url):
-  logging.info('generating thumbnail: %s' % url)
-  thumbWidth, thumbHeight = THUMB_SIZE
+    logging.info('generating thumbnail: %s' % url)
+    thumbWidth, thumbHeight = THUMB_SIZE
 
-  result = urlfetch.fetch(url)
-  img = images.Image(result.content)
+    result = urlfetch.fetch(url)
+    img = images.Image(result.content)
 
-  w, h = img.width, img.height
+    w, h = img.width, img.height
 
-  aspect = float(w) / h
-  thumbAspect = float(thumbWidth) / thumbHeight
+    aspect = float(w) / h
+    thumbAspect = float(thumbWidth) / thumbHeight
 
-  if aspect > thumbAspect:
-    # Too wide, so crop on the sides.
-    normalizedCrop = (w - h * thumbAspect) / (2.0 * w)
-    img.crop(normalizedCrop, 0., 1. - normalizedCrop, 1. )
-  elif aspect < thumbAspect:
-    # Too tall, so crop out the bottom.
-    normalizedCrop = (h - w / thumbAspect) / h
-    img.crop(0., 0., 1., 1. - normalizedCrop)
+    if aspect > thumbAspect:
+        # Too wide, so crop on the sides.
+        normalizedCrop = (w - h * thumbAspect) / (2.0 * w)
+        img.crop(normalizedCrop, 0., 1. - normalizedCrop, 1.)
+    elif aspect < thumbAspect:
+        # Too tall, so crop out the bottom.
+        normalizedCrop = (h - w / thumbAspect) / h
+        img.crop(0., 0., 1., 1. - normalizedCrop)
 
-  img.resize(thumbWidth, thumbHeight)
+    img.resize(thumbWidth, thumbHeight)
 
-  # Chose JPEG encoding because informal experiments showed it generated
-  # the best size to quality ratio for thumbnail images.
-  nimg = img.execute_transforms(output_encoding=images.JPEG)
-  logging.info('  finished thumbnail: %s' % url)
+    # Chose JPEG encoding because informal experiments showed it generated
+    # the best size to quality ratio for thumbnail images.
+    nimg = img.execute_transforms(output_encoding=images.JPEG)
+    logging.info('  finished thumbnail: %s' % url)
 
-  return nimg
+    return nimg
+
 
 class OAuthHandler(webapp.RequestHandler):
 
-  @login_required
-  def get(self):
-    user = users.get_current_user()
-    flow = pickle.loads(memcache.get(user.user_id()))
-    if flow:
-      prefs = UserData.get_or_insert(user.user_id())
-      prefs.credentials = flow.step2_exchange(self.request.params)
-      prefs.put()
-      self.redirect('/update/user')
-    else:
-      pass
+    @login_required
+    def get(self):
+        user = users.get_current_user()
+        flow = pickle.loads(memcache.get(user.user_id()))
+        if flow:
+            prefs = UserData.get_or_insert(user.user_id())
+            prefs.credentials = flow.step2_exchange(self.request.params)
+            prefs.put()
+            self.redirect('/update/user')
+        else:
+            pass
 
 
 def main():
-  application = webapp.WSGIApplication(
-      [
-      ('/data/(.*)', DataHandler),
+    application = webapp.WSGIApplication(
+        [
+            ('/data/(.*)', DataHandler),
 
-      # This is called periodically from cron.yaml.
-      ('/update/allFeeds', AllFeedsCollector),
-      ('/update/feed', FeedCollector),
-      ('/update/user', UserLoginHandler),
-      ('/update/defaultFeeds', SetDefaultFeeds),
-      ('/update/testFeeds', SetTestFeeds),
-      ('/update/html', UpdateHtml),
-      ('/update/upload', UploadFeed),
-      ('/oauth2callback', OAuthHandler),
+            # This is called periodically from cron.yaml.
+            ('/update/allFeeds', AllFeedsCollector),
+            ('/update/feed', FeedCollector),
+            ('/update/user', UserLoginHandler),
+            ('/update/defaultFeeds', SetDefaultFeeds),
+            ('/update/testFeeds', SetTestFeeds),
+            ('/update/html', UpdateHtml),
+            ('/update/upload', UploadFeed),
+            ('/oauth2callback', OAuthHandler),
+            ('/', TopHandler),
+            ('/(.*)', MainHandler),
+        ],
+        debug=True)
+    webapp.util.run_wsgi_app(application)
 
-      ('/', TopHandler),
-      ('/(.*)', MainHandler),
-      ],
-      debug=True)
-  webapp.util.run_wsgi_app(application)
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/samples-dev/swarm/buildapp.py b/samples-dev/swarm/buildapp.py
index d3ef028..12d2a6a 100755
--- a/samples-dev/swarm/buildapp.py
+++ b/samples-dev/swarm/buildapp.py
@@ -18,55 +18,54 @@
 sys.path.append(os.path.abspath(DART_PATH + '/tools'))
 import utils
 
-buildRoot = CLIENT_PATH + '/' + utils.GetBuildRoot(
-    utils.GuessOS(), 'debug', 'dartc')
+buildRoot = CLIENT_PATH + '/' + utils.GetBuildRoot(utils.GuessOS(), 'debug',
+                                                   'dartc')
+
 
 def execute(*command):
-  '''
+    '''
   Executes the given command in a new process. If the command fails (returns
   non-zero) halts the script and returns that exit code.
   '''
-  exitcode = subprocess.call(command)
-  if exitcode != 0:
-    sys.exit(exitcode)
+    exitcode = subprocess.call(command)
+    if exitcode != 0:
+        sys.exit(exitcode)
+
 
 def createChromeApp(buildRoot, antTarget, resultFile):
-  buildDir = os.path.join(buildRoot, 'war')
+    buildDir = os.path.join(buildRoot, 'war')
 
-  # Use ant to create the 'war' directory
-  # TODO(jmesserly): we should factor out as much as possible from the ant file
-  # It's not really doing anything useful for us besides compiling Dart code
-  # with DartC and copying files. But for now, it helps us share code with
-  # our appengine update.py, which is good.
-  execute(
-      DART_PATH + '/third_party/apache_ant/v1_7_1/bin/ant',
-      '-f', 'build-appengine.xml',
-      '-Dbuild.dir=' + buildRoot,
-      antTarget)
+    # Use ant to create the 'war' directory
+    # TODO(jmesserly): we should factor out as much as possible from the ant file
+    # It's not really doing anything useful for us besides compiling Dart code
+    # with DartC and copying files. But for now, it helps us share code with
+    # our appengine update.py, which is good.
+    execute(DART_PATH + '/third_party/apache_ant/v1_7_1/bin/ant', '-f',
+            'build-appengine.xml', '-Dbuild.dir=' + buildRoot, antTarget)
 
-  # Call Dartium (could be any Chrome--but we know Dartium will be there) and
-  # ask it to create the .crx file for us using the checked in developer key.
-  chrome = CLIENT_PATH + '/tests/drt/chrome'
+    # Call Dartium (could be any Chrome--but we know Dartium will be there) and
+    # ask it to create the .crx file for us using the checked in developer key.
+    chrome = CLIENT_PATH + '/tests/drt/chrome'
 
-  # On Mac Chrome is under a .app folder
-  if platform.system() == 'Darwin':
-    chrome = CLIENT_PATH + '/tests/drt/Chromium.app/Contents/MacOS/Chromium'
+    # On Mac Chrome is under a .app folder
+    if platform.system() == 'Darwin':
+        chrome = CLIENT_PATH + '/tests/drt/Chromium.app/Contents/MacOS/Chromium'
 
-  keyFile = DART_PATH + '/samples/swarm/swarm-dev.pem'
-  execute(chrome, '--pack-extension=' + buildDir,
-          '--pack-extension-key=' + keyFile)
+    keyFile = DART_PATH + '/samples/swarm/swarm-dev.pem'
+    execute(chrome, '--pack-extension=' + buildDir,
+            '--pack-extension-key=' + keyFile)
 
-  resultFile = os.path.join(buildRoot, resultFile)
-  os.rename(buildDir + '.crx', resultFile)
-  return os.path.abspath(resultFile)
+    resultFile = os.path.join(buildRoot, resultFile)
+    os.rename(buildDir + '.crx', resultFile)
+    return os.path.abspath(resultFile)
 
 
 def main():
-  # Create a DartC and Dartium app
-  dartiumResult = createChromeApp(buildRoot, 'build_dart_app', 'swarm.crx')
-  dartCResult = createChromeApp(buildRoot, 'build_js_app', 'swarm-js.crx')
+    # Create a DartC and Dartium app
+    dartiumResult = createChromeApp(buildRoot, 'build_dart_app', 'swarm.crx')
+    dartCResult = createChromeApp(buildRoot, 'build_js_app', 'swarm-js.crx')
 
-  print '''
+    print '''
 Successfully created Chrome apps!
   Dartium:  file://%s
 
@@ -74,7 +73,8 @@
 
 To install, open this URL in Chrome and select Continue at the bottom.
 ''' % (dartiumResult, dartCResult)
-  return 0
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/samples-dev/swarm/cacheimages.py b/samples-dev/swarm/cacheimages.py
index 68fbc87..0a8d1d3 100755
--- a/samples-dev/swarm/cacheimages.py
+++ b/samples-dev/swarm/cacheimages.py
@@ -18,53 +18,60 @@
 import htmlconverter
 converter = CLIENT_TOOLS_PATH + '/htmlconverter.py'
 
+
 # This has to be a top level function to use with multiprocessing
 def convertImgs(infile):
-  global options
-  try:
-    htmlconverter.convertForOffline(
-        infile, infile,
-        verbose=options.verbose,
-        encode_images=options.inline_images)
-    print 'Converted ' + infile
-  except BaseException, e:
-    print 'Caught error: %s' % e
+    global options
+    try:
+        htmlconverter.convertForOffline(
+            infile,
+            infile,
+            verbose=options.verbose,
+            encode_images=options.inline_images)
+        print 'Converted ' + infile
+    except BaseException, e:
+        print 'Caught error: %s' % e
+
 
 def Flags():
-  """ Constructs a parser for extracting flags from the command line. """
-  parser = optparse.OptionParser()
-  parser.add_option("--inline_images",
-      help=("Encode img payloads as data:// URLs rather than local files."),
-      default=False,
-      action='store_true')
-  parser.add_option("--verbose",
-      help="Print verbose output",
-      default=False,
-      action="store_true")
-  return parser
+    """ Constructs a parser for extracting flags from the command line. """
+    parser = optparse.OptionParser()
+    parser.add_option(
+        "--inline_images",
+        help=("Encode img payloads as data:// URLs rather than local files."),
+        default=False,
+        action='store_true')
+    parser.add_option(
+        "--verbose",
+        help="Print verbose output",
+        default=False,
+        action="store_true")
+    return parser
+
 
 def main():
-  global options
-  parser = Flags()
-  options, args = parser.parse_args()
-  print "args: %s" % args
-  if len(args) < 1 or 'help' in args[0]:
-    print 'Usage: %s DIRECTORY' % basename(sys.argv[0])
-    return 1
+    global options
+    parser = Flags()
+    options, args = parser.parse_args()
+    print "args: %s" % args
+    if len(args) < 1 or 'help' in args[0]:
+        print 'Usage: %s DIRECTORY' % basename(sys.argv[0])
+        return 1
 
-  dirname = args[0]
-  print 'Searching directory ' + dirname
+    dirname = args[0]
+    print 'Searching directory ' + dirname
 
-  files = []
-  for root, dirs, fnames in os.walk(dirname):
-    for fname in fnames:
-      if fname.endswith('.html'):
-        files.append(join(root, fname))
+    files = []
+    for root, dirs, fnames in os.walk(dirname):
+        for fname in fnames:
+            if fname.endswith('.html'):
+                files.append(join(root, fname))
 
-  count = 4 * multiprocessing.cpu_count()
-  pool = multiprocessing.Pool(processes=count)
-  # Note: need a timeout to get keyboard interrupt due to a Python bug
-  pool.map_async(convertImgs, files).get(3600) # one hour
+    count = 4 * multiprocessing.cpu_count()
+    pool = multiprocessing.Pool(processes=count)
+    # Note: need a timeout to get keyboard interrupt due to a Python bug
+    pool.map_async(convertImgs, files).get(3600)  # one hour
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/samples-dev/swarm/gen_manifest.py b/samples-dev/swarm/gen_manifest.py
index 6ab3ef8..4cc1280 100755
--- a/samples-dev/swarm/gen_manifest.py
+++ b/samples-dev/swarm/gen_manifest.py
@@ -4,7 +4,6 @@
 
 #!/usr/bin/python2.6
 #
-
 """
 Usage: gen_manifest.py DIRECTORY EXTENSIONS CACHE-FILE HTML-FILES...
 
@@ -34,17 +33,21 @@
 print "Generating manifest from root path: " + cacheDir
 
 patterns = extensions + htmlFiles
+
+
 def matches(file):
-  for pattern in patterns:
-    if fnmatch.fnmatch(file, pattern):
-      return True
-  return False
+    for pattern in patterns:
+        if fnmatch.fnmatch(file, pattern):
+            return True
+    return False
+
 
 def findFiles(rootDir):
-  for root, dirs, files in os.walk(rootDir):
-    for f in files:
-      # yields this file relative to the given directory
-      yield os.path.join(root, f)[(len(rootDir) + 1):]
+    for root, dirs, files in os.walk(rootDir):
+        for f in files:
+            # yields this file relative to the given directory
+            yield os.path.join(root, f)[(len(rootDir) + 1):]
+
 
 manifest = []
 manifest.append("CACHE MANIFEST")
@@ -63,16 +66,16 @@
 manifest.append("*")
 
 with open(manifestName, 'w') as f:
-  f.writelines(m + '\n' for m in manifest)
+    f.writelines(m + '\n' for m in manifest)
 
 print "Created manifest file: " + manifestName
 
 for htmlFile in htmlFiles:
-  cachedHtmlFile = htmlFile.replace('.html', '-cache.html')
-  text = open(htmlFile, 'r').read()
-  text = text.replace('<html>', '<html manifest="%s">' % manifestName, 1)
-  with open(cachedHtmlFile, 'w') as output:
-    output.write(text)
-  print "Processed html file: %s -> %s" % (htmlFile, cachedHtmlFile)
+    cachedHtmlFile = htmlFile.replace('.html', '-cache.html')
+    text = open(htmlFile, 'r').read()
+    text = text.replace('<html>', '<html manifest="%s">' % manifestName, 1)
+    with open(cachedHtmlFile, 'w') as output:
+        output.write(text)
+    print "Processed html file: %s -> %s" % (htmlFile, cachedHtmlFile)
 
 print "Successfully generated manifest and html files"
diff --git a/samples-dev/swarm/update.py b/samples-dev/swarm/update.py
index f73eec6..33526b0 100755
--- a/samples-dev/swarm/update.py
+++ b/samples-dev/swarm/update.py
@@ -20,64 +20,69 @@
 sys.path.append(CLIENT_TOOLS_PATH)
 import htmlconverter
 
-def convertOne(infile, options):
-  outDirBase = 'outcode'
-  outfile = join(outDirBase, infile)
-  print 'converting %s to %s' % (infile, outfile)
 
-  if 'dart' in options.target:
-    htmlconverter.convertForDartium(
-        infile,
-        outDirBase,
-        outfile.replace('.html', '-dart.html'),
-        options.verbose)
-  if 'js' in options.target:
-    htmlconverter.convertForChromium(
-        infile, options.dartc_extra_flags,
-        outfile.replace('.html', '-js.html'),
-        options.verbose)
+def convertOne(infile, options):
+    outDirBase = 'outcode'
+    outfile = join(outDirBase, infile)
+    print 'converting %s to %s' % (infile, outfile)
+
+    if 'dart' in options.target:
+        htmlconverter.convertForDartium(infile, outDirBase,
+                                        outfile.replace('.html', '-dart.html'),
+                                        options.verbose)
+    if 'js' in options.target:
+        htmlconverter.convertForChromium(infile, options.dartc_extra_flags,
+                                         outfile.replace('.html', '-js.html'),
+                                         options.verbose)
 
 
 def Flags():
-  """ Consturcts a parser for extracting flags from the command line. """
-  result = optparse.OptionParser()
-  result.add_option("-t", "--target",
-      help="The target html to generate",
-      metavar="[js,dart]",
-      default='js,dart')
-  result.add_option("--verbose",
-      help="Print verbose output",
-      default=False,
-      action="store_true")
-  result.add_option("--dartc_extra_flags",
-      help="Additional flag text to pass to dartc",
-      default="",
-      action="store")
-  #result.set_usage("update.py input.html -o OUTDIR -t chromium,dartium")
-  return result
+    """ Consturcts a parser for extracting flags from the command line. """
+    result = optparse.OptionParser()
+    result.add_option(
+        "-t",
+        "--target",
+        help="The target html to generate",
+        metavar="[js,dart]",
+        default='js,dart')
+    result.add_option(
+        "--verbose",
+        help="Print verbose output",
+        default=False,
+        action="store_true")
+    result.add_option(
+        "--dartc_extra_flags",
+        help="Additional flag text to pass to dartc",
+        default="",
+        action="store")
+    #result.set_usage("update.py input.html -o OUTDIR -t chromium,dartium")
+    return result
+
 
 def getAllHtmlFiles():
-  htmlFiles = []
-  for filename in os.listdir(APP_PATH):
-    fName, fExt = os.path.splitext(filename)
-    if fExt.lower() == '.html':
-      htmlFiles.append(filename)
+    htmlFiles = []
+    for filename in os.listdir(APP_PATH):
+        fName, fExt = os.path.splitext(filename)
+        if fExt.lower() == '.html':
+            htmlFiles.append(filename)
 
-  return htmlFiles
+    return htmlFiles
+
 
 def main():
-  os.chdir(CLIENT_PATH) # TODO(jimhug): I don't like chdir's in scripts...
+    os.chdir(CLIENT_PATH)  # TODO(jimhug): I don't like chdir's in scripts...
 
-  parser = Flags()
-  options, args = parser.parse_args()
-  #if len(args) < 1 or not options.out or not options.target:
-  #  parser.print_help()
-  #  return 1
+    parser = Flags()
+    options, args = parser.parse_args()
+    #if len(args) < 1 or not options.out or not options.target:
+    #  parser.print_help()
+    #  return 1
 
-  REL_APP_PATH = relpath(APP_PATH)
-  for file in getAllHtmlFiles():
-    infile = join(REL_APP_PATH, file)
-    convertOne(infile, options)
+    REL_APP_PATH = relpath(APP_PATH)
+    for file in getAllHtmlFiles():
+        infile = join(REL_APP_PATH, file)
+        convertOne(infile, options)
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/samples/ffi/sqlite/docs/android.md b/samples/ffi/sqlite/docs/android.md
index 07f3e47..7b20002 100644
--- a/samples/ffi/sqlite/docs/android.md
+++ b/samples/ffi/sqlite/docs/android.md
@@ -41,7 +41,7 @@
     // ...
     sourceSets {
         main {
-            jniLibs.srcDir '${project.projectDir.path}/../../native-libraries'
+            jniLibs.srcDir "${project.projectDir.path}/../../native-libraries"
         }
     }
 }
diff --git a/samples/ffi/sqlite/lib/src/ffi/utf8.dart b/samples/ffi/sqlite/lib/src/ffi/utf8.dart
index b7da3c5..12a04bb 100644
--- a/samples/ffi/sqlite/lib/src/ffi/utf8.dart
+++ b/samples/ffi/sqlite/lib/src/ffi/utf8.dart
@@ -9,7 +9,7 @@
 
 /// Represents a String in C memory, managed by an [Arena].
 class Utf8 extends Struct<Utf8> {
-  @Int8()
+  @Uint8()
   int char;
 
   /// Allocates a [CString] in the current [Arena] and populates it with
diff --git a/samples/ffi/sqlite/test/sqlite_test.dart b/samples/ffi/sqlite/test/sqlite_test.dart
index 95bbc6c..0fd2b6a 100644
--- a/samples/ffi/sqlite/test/sqlite_test.dart
+++ b/samples/ffi/sqlite/test/sqlite_test.dart
@@ -7,6 +7,7 @@
 import "package:test/test.dart";
 
 import '../lib/sqlite.dart';
+import '../lib/src/ffi/utf8.dart';
 
 void main() {
   test("sqlite integration test", () {
@@ -161,4 +162,10 @@
     r.close();
     d.close();
   });
+  test("Utf8 unit test", () {
+    final String test = 'Hasta Mañana';
+    final medium = Utf8.allocate(test);
+    expect(test, medium.load<Utf8>().toString());
+    medium.free();
+  });
 }
diff --git a/sdk/BUILD.gn b/sdk/BUILD.gn
index 52a35d5..b689dd2 100644
--- a/sdk/BUILD.gn
+++ b/sdk/BUILD.gn
@@ -85,6 +85,11 @@
 # ......mirrors/
 # ......typed_data/
 # ......api_readme.md
+# ....model/
+# ......lexeme/
+# ........idx2word.json
+# ........model.tflite
+# ........word2idx.json
 
 # Scripts that go under bin/
 _platform_sdk_scripts = [
@@ -107,10 +112,6 @@
 # Snapshots that go under bin/snapshots
 _platform_sdk_snapshots = [
   [
-    "analysis_server",
-    "../utils/analysis_server",
-  ],
-  [
     "dartanalyzer",
     "../utils/dartanalyzer:generate_dartanalyzer_snapshot",
   ],
@@ -135,13 +136,17 @@
     ],
   ]
 }
+if (dart_target_arch != "arm") {
+  _platform_sdk_snapshots += [
+    [
+      "analysis_server",
+      "../utils/analysis_server",
+    ],
+  ]
+}
 
 _full_sdk_snapshots = [
   [
-    "analysis_server",
-    "../utils/analysis_server",
-  ],
-  [
     "dart2js",
     "../utils/compiler:dart2js",
   ],
@@ -178,6 +183,14 @@
     ],
   ]
 }
+if (dart_target_arch != "arm") {
+  _full_sdk_snapshots += [
+    [
+      "analysis_server",
+      "../utils/analysis_server",
+    ],
+  ]
+}
 
 # Libraries that go under lib/
 _full_sdk_libraries = [
@@ -282,6 +295,31 @@
       } ]
 }
 
+if (target_cpu == "x64") {
+  copy_tree_specs += [
+      {
+        target = "copy_language_model"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../pkg/analysis_server/language_model"
+        dest = "$root_out_dir/dart-sdk/model"
+        ignore_patterns = "{}"
+      },
+      {
+        target = "copy_libtensorflowlite_c"
+        visibility = [ ":create_common_sdk" ]
+        deps = [
+          ":copy_libraries",
+        ]
+        source = "../third_party/pkg/tflite_native/lib/src/blobs"
+        dest = "$root_out_dir/dart-sdk/bin/snapshots"
+        ignore_patterns = "{}"
+      }
+   ]
+}
+
 # This generates targets for everything in copy_tree_specs. The targets have the
 # same name as the "target" fields in the scopes of copy_tree_specs.
 copy_trees("copy_trees") {
@@ -602,7 +640,7 @@
   deps = [
     ":copy_libraries",
     "../utils/dartdevc:dartdevc_sdk",
-    "../utils/dartdevc:dartdevc_kernel_sdk",
+    "../utils/dartdevc:dartdevc_kernel_sdk_outline",
   ]
   gen_dir = get_label_info("../utils/dartdevc:dartdevc_sdk", "target_gen_dir")
   sources = [
@@ -954,6 +992,12 @@
   if (is_win) {
     public_deps += [ ":copy_7zip" ]
   }
+  if (target_cpu == "x64") {
+    public_deps += [
+      ":copy_language_model",
+      ":copy_libtensorflowlite_c",
+    ]
+  }
 }
 
 # Parts specific to the platform SDK.
diff --git a/sdk/lib/_http/http.dart b/sdk/lib/_http/http.dart
index 5d2bbb6..2fc751f 100644
--- a/sdk/lib/_http/http.dart
+++ b/sdk/lib/_http/http.dart
@@ -1947,7 +1947,7 @@
  *            });
  *          });
  */
-abstract class HttpClientResponse implements Stream<Uint8List> {
+abstract class HttpClientResponse implements Stream<List<int>> {
   /**
    * Returns the status code.
    *
diff --git a/sdk/lib/_http/http_impl.dart b/sdk/lib/_http/http_impl.dart
index c3325a4..88c0f97 100644
--- a/sdk/lib/_http/http_impl.dart
+++ b/sdk/lib/_http/http_impl.dart
@@ -173,6 +173,23 @@
   }
 }
 
+abstract class _HttpInboundMessageListInt extends Stream<List<int>> {
+  final _HttpIncoming _incoming;
+  List<Cookie> _cookies;
+
+  _HttpInboundMessageListInt(this._incoming);
+
+  List<Cookie> get cookies {
+    if (_cookies != null) return _cookies;
+    return _cookies = headers._parseCookies();
+  }
+
+  _HttpHeaders get headers => _incoming.headers;
+  String get protocolVersion => headers.protocolVersion;
+  int get contentLength => headers.contentLength;
+  bool get persistentConnection => headers.persistentConnection;
+}
+
 abstract class _HttpInboundMessage extends Stream<Uint8List> {
   final _HttpIncoming _incoming;
   List<Cookie> _cookies;
@@ -282,7 +299,7 @@
   }
 }
 
-class _HttpClientResponse extends _HttpInboundMessage
+class _HttpClientResponse extends _HttpInboundMessageListInt
     implements HttpClientResponse {
   List<RedirectInfo> get redirects => _httpRequest._responseRedirects;
 
@@ -2892,13 +2909,13 @@
   }
 }
 
-class _DetachedSocket extends Stream<List<int>> implements Socket {
-  final Stream<List<int>> _incoming;
+class _DetachedSocket extends Stream<Uint8List> implements Socket {
+  final Stream<Uint8List> _incoming;
   final Socket _socket;
 
   _DetachedSocket(this._socket, this._incoming);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
+  StreamSubscription<Uint8List> listen(void onData(Uint8List event),
       {Function onError, void onDone(), bool cancelOnError}) {
     return _incoming.listen(onData,
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
diff --git a/sdk/lib/_http/http_parser.dart b/sdk/lib/_http/http_parser.dart
index 089006f..bd85b2b 100644
--- a/sdk/lib/_http/http_parser.dart
+++ b/sdk/lib/_http/http_parser.dart
@@ -108,9 +108,9 @@
  * _HttpDetachedStreamSubscription is resumed, it'll deliver the data before
  * resuming the underlaying subscription.
  */
-class _HttpDetachedStreamSubscription implements StreamSubscription<List<int>> {
-  StreamSubscription<List<int>> _subscription;
-  List<int> _injectData;
+class _HttpDetachedStreamSubscription implements StreamSubscription<Uint8List> {
+  StreamSubscription<Uint8List> _subscription;
+  Uint8List _injectData;
   bool _isCanceled = false;
   int _pauseCount = 1;
   Function _userOnData;
@@ -130,7 +130,7 @@
     return _subscription.cancel();
   }
 
-  void onData(void handleData(List<int> data)) {
+  void onData(void handleData(Uint8List data)) {
     _userOnData = handleData;
     _subscription.onData(handleData);
   }
@@ -182,13 +182,13 @@
   }
 }
 
-class _HttpDetachedIncoming extends Stream<List<int>> {
-  final StreamSubscription<List<int>> subscription;
-  final List<int> bufferedData;
+class _HttpDetachedIncoming extends Stream<Uint8List> {
+  final StreamSubscription<Uint8List> subscription;
+  final Uint8List bufferedData;
 
   _HttpDetachedIncoming(this.subscription, this.bufferedData);
 
-  StreamSubscription<List<int>> listen(void onData(List<int> event),
+  StreamSubscription<Uint8List> listen(void onData(Uint8List event),
       {Function onError, void onDone(), bool cancelOnError}) {
     if (subscription != null) {
       subscription
@@ -203,7 +203,7 @@
         ..resume();
     } else {
       // TODO(26379): add test for this branch.
-      return new Stream<List<int>>.fromIterable([bufferedData]).listen(onData,
+      return new Stream<Uint8List>.fromIterable([bufferedData]).listen(onData,
           onError: onError, onDone: onDone, cancelOnError: cancelOnError);
     }
   }
@@ -261,7 +261,7 @@
 
   // The current incoming connection.
   _HttpIncoming _incoming;
-  StreamSubscription<List<int>> _socketSubscription;
+  StreamSubscription<Uint8List> _socketSubscription;
   bool _paused = true;
   bool _bodyPaused = false;
   StreamController<_HttpIncoming> _controller;
@@ -303,7 +303,7 @@
         onError: onError, onDone: onDone, cancelOnError: cancelOnError);
   }
 
-  void listenToStream(Stream<List<int>> stream) {
+  void listenToStream(Stream<Uint8List> stream) {
     // Listen to the stream and handle data accordingly. When a
     // _HttpIncoming is created, _dataPause, _dataResume, _dataDone is
     // given to provide a way of controlling the parser.
@@ -802,7 +802,7 @@
     }
   }
 
-  void _onData(List<int> buffer) {
+  void _onData(Uint8List buffer) {
     _socketSubscription.pause();
     assert(_buffer == null);
     _buffer = buffer;
@@ -888,7 +888,7 @@
     return new _HttpDetachedIncoming(_socketSubscription, readUnparsedData());
   }
 
-  List<int> readUnparsedData() {
+  Uint8List readUnparsedData() {
     if (_buffer == null) return null;
     if (_index == _buffer.length) return null;
     var result = _buffer.sublist(_index);
diff --git a/sdk/lib/_http/websocket_impl.dart b/sdk/lib/_http/websocket_impl.dart
index 331a064..8750ccc 100644
--- a/sdk/lib/_http/websocket_impl.dart
+++ b/sdk/lib/_http/websocket_impl.dart
@@ -950,6 +950,9 @@
   void add(data) {
     if (_closed) return;
     _ensureController();
+    // Stop sending message if _controller has been closed.
+    // https://github.com/dart-lang/sdk/issues/37441
+    if (_controller.isClosed) return;
     _controller.add(data);
   }
 
@@ -1066,7 +1069,7 @@
       List<int> expectedAccept = sha1.close();
       List<int> receivedAccept = _CryptoUtils.base64StringToBytes(accept);
       if (expectedAccept.length != receivedAccept.length) {
-        error("Reasponse header 'Sec-WebSocket-Accept' is the wrong length");
+        error("Response header 'Sec-WebSocket-Accept' is the wrong length");
       }
       for (int i = 0; i < expectedAccept.length; i++) {
         if (expectedAccept[i] != receivedAccept[i]) {
@@ -1128,7 +1131,7 @@
     _deflate = deflate;
 
     var transformer = new _WebSocketProtocolTransformer(_serverSide, _deflate);
-    _subscription = _socket.transform(transformer).listen((data) {
+    _subscription = transformer.bind(_socket).listen((data) {
       if (data is _WebSocketPing) {
         if (!_writeClosed) _consumer.add(new _WebSocketPong(data.payload));
       } else if (data is _WebSocketPong) {
diff --git a/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart b/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart
index b16c43e..f769673 100644
--- a/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/_internal/js_dev_runtime/lib/js/dart2js/js_dart2js.dart
@@ -213,7 +213,7 @@
   int get hashCode => 0;
 
   bool operator ==(other) =>
-      other is JsObject && JS('bool', '# === #', _jsObject, other._jsObject);
+      other is JsObject && JS<bool>('!', '# === #', _jsObject, other._jsObject);
 
   /**
    * Returns `true` if the JavaScript object contains the specified property
@@ -225,7 +225,7 @@
     if (property is! String && property is! num) {
       throw ArgumentError("property is not a String or num");
     }
-    return JS('bool', '# in #', property, _jsObject);
+    return JS<bool>('!', '# in #', property, _jsObject);
   }
 
   /**
@@ -237,7 +237,7 @@
     if (property is! String && property is! num) {
       throw ArgumentError("property is not a String or num");
     }
-    JS('bool', 'delete #[#]', _jsObject, property);
+    JS<bool>('!', 'delete #[#]', _jsObject, property);
   }
 
   /**
@@ -246,7 +246,7 @@
    * This is the equivalent of the `instanceof` operator in JavaScript.
    */
   bool instanceof(JsFunction type) {
-    return JS('bool', '# instanceof #', _jsObject, _convertToJS(type));
+    return JS<bool>('!', '# instanceof #', _jsObject, _convertToJS(type));
   }
 
   /**
@@ -254,7 +254,7 @@
    */
   String toString() {
     try {
-      return JS('String', 'String(#)', _jsObject);
+      return JS<String>('!', 'String(#)', _jsObject);
     } catch (e) {
       return super.toString();
     }
@@ -272,7 +272,7 @@
     }
     if (args != null) args = List.from(args.map(_convertToJS));
     var fn = JS('', '#[#]', _jsObject, method);
-    if (JS('bool', 'typeof(#) !== "function"', fn)) {
+    if (JS<bool>('!', 'typeof(#) !== "function"', fn)) {
       throw NoSuchMethodError(_jsObject, Symbol(method), args, {});
     }
     return _convertToDart(JS('', '#.apply(#, #)', fn, _jsObject, args));
@@ -379,8 +379,9 @@
     // Check the length honours the List contract.
     var len = JS('', '#.length', _jsObject);
     // JavaScript arrays have lengths which are unsigned 32-bit integers.
-    if (JS('bool', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
-      return JS('int', '#', len);
+    if (JS<bool>(
+        '!', 'typeof # === "number" && (# >>> 0) === #', len, len, len)) {
+      return JS<int>('!', '#', len);
     }
     throw StateError('Bad JsArray length');
   }
@@ -396,7 +397,7 @@
   }
 
   void addAll(Iterable<E> iterable) {
-    var list = (JS('bool', '# instanceof Array', iterable))
+    var list = (JS<bool>('!', '# instanceof Array', iterable))
         ? iterable
         : List.from(iterable);
     callMethod('push', list);
@@ -519,10 +520,10 @@
 Object _wrapToDart(o) => _putIfAbsent(_dartProxies, o, _wrapToDartHelper);
 
 Object _wrapToDartHelper(o) {
-  if (JS('bool', 'typeof # == "function"', o)) {
+  if (JS<bool>('!', 'typeof # == "function"', o)) {
     return JsFunction._fromJs(o);
   }
-  if (JS('bool', '# instanceof Array', o)) {
+  if (JS<bool>('!', '# instanceof Array', o)) {
     return JsArray._fromJs(o);
   }
   return JsObject._fromJs(o);
diff --git a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart b/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
index b67c538..4b9fdb0 100644
--- a/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
+++ b/sdk/lib/_internal/js_dev_runtime/lib/js_util/dart2js/js_util_dart2js.dart
@@ -58,20 +58,20 @@
 
 newObject() => JS('=Object', '{}');
 
-hasProperty(o, name) => JS('bool', '# in #', name, o);
+hasProperty(o, name) => JS<bool>('!', '# in #', name, o);
 getProperty(o, name) => JS('Object', '#[#]', o, name);
 setProperty(o, name, value) => JS('', '#[#]=#', o, name, value);
 
 callMethod(o, String method, List args) =>
     JS('Object', '#[#].apply(#, #)', o, method, o, args);
 
-instanceof(o, Function type) => JS('bool', '# instanceof #', o, type);
+instanceof(o, Function type) => JS<bool>('!', '# instanceof #', o, type);
 callConstructor(Function constr, List arguments) {
   if (arguments == null) {
     return JS('Object', 'new #()', constr);
   }
 
-  if (JS('bool', '# instanceof Array', arguments)) {
+  if (JS<bool>('!', '# instanceof Array', arguments)) {
     int argumentCount = JS('!', '#.length', arguments);
     switch (argumentCount) {
       case 0:
@@ -112,7 +112,7 @@
   var args = <dynamic>[null]..addAll(arguments);
   var factoryFunction = JS('', '#.bind.apply(#, #)', constr, constr, args);
   // Without this line, calling factoryFunction as a constructor throws
-  JS('String', 'String(#)', factoryFunction);
+  JS<String>('!', 'String(#)', factoryFunction);
   // This could return an UnknownJavaScriptObject, or a native
   // object for which there is an interceptor
   return JS('Object', 'new #()', factoryFunction);
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 ca4ef7d..dd9e0ec 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/async_patch.dart
@@ -44,7 +44,7 @@
   onValue = (value) {
     var iteratorResult = JS('', '#.next(#)', iter, value);
     value = JS('', '#.value', iteratorResult);
-    return JS('bool', '#.done', iteratorResult) ? value : onAwait(value);
+    return JS<bool>('!', '#.done', iteratorResult) ? value : onAwait(value);
   };
 
   // If the awaited Future throws, we want to convert this to an exception
@@ -59,7 +59,7 @@
     var iteratorResult = JS(
         '', '#.throw(#)', iter, dart.createErrorWithStack(value, stackTrace));
     value = JS('', '#.value', iteratorResult);
-    return JS('bool', '#.done', iteratorResult) ? value : onAwait(value);
+    return JS<bool>('!', '#.done', iteratorResult) ? value : onAwait(value);
   };
 
   var zone = Zone.current;
@@ -83,7 +83,7 @@
       iter = JS('', '#[Symbol.iterator]()', initGenerator());
       var iteratorValue = JS('', '#.next(null)', iter);
       var value = JS('', '#.value', iteratorValue);
-      if (JS('bool', '#.done', iteratorValue)) {
+      if (JS<bool>('!', '#.done', iteratorValue)) {
         // TODO(jmesserly): this is a workaround for ignored cast failures.
         // Remove it once we've fixed those. We should be able to call:
         //
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/collection_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/collection_patch.dart
index d0bbcd8..daa3bf8 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/collection_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/collection_patch.dart
@@ -181,7 +181,7 @@
   bool contains(Object key) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -194,12 +194,12 @@
       }
       return false;
     }
-    return JS('bool', '#.has(#)', _map, key);
+    return JS<bool>('!', '#.has(#)', _map, key);
   }
 
   E lookup(Object key) {
     if (key == null) return null;
-    if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -220,7 +220,7 @@
     if (key == null) {
       if (JS('', '#.has(null)', map)) return false;
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       var keyMap = _keyMap;
       @notNull
@@ -250,8 +250,8 @@
     for (E key in objects) {
       if (key == null) {
         key = null; // converts undefined to null, if needed.
-      } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
-          dart.identityEquals)) {
+      } else if (JS<bool>('!', '#[#] !== #', key,
+          dart.extensionSymbol('_equals'), dart.identityEquals)) {
         key = putLinkedMapKey(key, _keyMap);
       }
       JS('', '#.add(#)', map, key);
@@ -264,7 +264,7 @@
   bool remove(Object key) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -286,7 +286,7 @@
       }
     }
     var map = _map;
-    if (JS('bool', '#.delete(#)', map, key)) {
+    if (JS<bool>('!', '#.delete(#)', map, key)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
       return true;
     }
@@ -310,8 +310,8 @@
     for (Object key in entries) {
       if (key == null) {
         key = null; // converts undefined to null, if needed.
-      } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
-          dart.identityEquals)) {
+      } else if (JS<bool>('!', '#[#] !== #', key,
+          dart.extensionSymbol('_equals'), dart.identityEquals)) {
         key = putLinkedMapKey(key, _keyMap);
       }
       JS('', '#.add(#)', map, key);
@@ -352,7 +352,7 @@
 
   bool add(E element) {
     var map = _map;
-    if (JS('bool', '#.has(#)', map, element)) return false;
+    if (JS<bool>('!', '#.has(#)', map, element)) return false;
     JS('', '#.add(#)', map, element);
     _modifications = (_modifications + 1) & 0x3ffffff;
     return true;
@@ -370,7 +370,7 @@
   }
 
   bool remove(Object element) {
-    if (JS('bool', '#.delete(#)', _map, element)) {
+    if (JS<bool>('!', '#.delete(#)', _map, element)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
       return true;
     }
@@ -545,10 +545,10 @@
   int get length => JS<int>('!', '#.size', _map);
 
   @notNull
-  bool get isEmpty => JS('bool', '#.size == 0', _map);
+  bool get isEmpty => JS<bool>('!', '#.size == 0', _map);
 
   @notNull
-  bool get isNotEmpty => JS('bool', '#.size != 0', _map);
+  bool get isNotEmpty => JS<bool>('!', '#.size != 0', _map);
 
   Iterator<E> get iterator => DartIterator<E>(_jsIterator());
 
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/convert_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/convert_patch.dart
index 7ff6d09..486473b 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/convert_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/convert_patch.dart
@@ -36,7 +36,7 @@
     parsed = JS('=Object|JSExtendableArray|Null|bool|num|String',
         'JSON.parse(#)', source);
   } catch (e) {
-    throw FormatException(JS('String', 'String(#)', e));
+    throw FormatException(JS<String>('!', 'String(#)', e));
   }
 
   if (reviver == null) {
@@ -55,16 +55,17 @@
   assert(reviver != null);
   walk(e) {
     // JavaScript null, string, number, bool are in the correct representation.
-    if (JS('bool', '# == null', e) || JS('bool', 'typeof # != "object"', e)) {
+    if (JS<bool>('!', '# == null', e) ||
+        JS<bool>('!', 'typeof # != "object"', e)) {
       return e;
     }
 
     // This test is needed to avoid identifying '{"__proto__":[]}' as an Array.
     // TODO(sra): Replace this test with cheaper '#.constructor === Array' when
     // bug 621 below is fixed.
-    if (JS('bool', 'Object.getPrototypeOf(#) === Array.prototype', e)) {
+    if (JS<bool>('!', 'Object.getPrototypeOf(#) === Array.prototype', e)) {
       // In-place update of the elements since JS Array is a Dart List.
-      for (int i = 0; i < JS('int', '#.length', e); i++) {
+      for (int i = 0; i < JS<int>('!', '#.length', e); i++) {
         // Use JS indexing to avoid range checks.  We know this is the only
         // reference to the list, but the compiler will likely never be able to
         // tell that this instance of the list cannot have its length changed by
@@ -100,19 +101,19 @@
   if (object == null) return null;
 
   // JavaScript string, number, bool already has the correct representation.
-  if (JS('bool', 'typeof # != "object"', object)) {
+  if (JS<bool>('!', 'typeof # != "object"', object)) {
     return object;
   }
 
   // This test is needed to avoid identifying '{"__proto__":[]}' as an array.
   // TODO(sra): Replace this test with cheaper '#.constructor === Array' when
   // bug https://code.google.com/p/v8/issues/detail?id=621 is fixed.
-  if (JS('bool', 'Object.getPrototypeOf(#) !== Array.prototype', object)) {
+  if (JS<bool>('!', 'Object.getPrototypeOf(#) !== Array.prototype', object)) {
     return _JsonMap(object);
   }
 
   // Update the elements in place since JS arrays are Dart lists.
-  for (int i = 0; i < JS('int', '#.length', object); i++) {
+  for (int i = 0; i < JS<int>('!', '#.length', object); i++) {
     // Use JS indexing to avoid range checks.  We know this is the only
     // reference to the list, but the compiler will likely never be able to
     // tell that this instance of the list cannot have its length changed by
@@ -319,14 +320,14 @@
   // ------------------------------------------
 
   static bool _hasProperty(object, String key) =>
-      JS('bool', 'Object.prototype.hasOwnProperty.call(#,#)', object, key);
+      JS<bool>('!', 'Object.prototype.hasOwnProperty.call(#,#)', object, key);
   static _getProperty(object, String key) => JS('', '#[#]', object, key);
   static _setProperty(object, String key, value) =>
       JS('', '#[#]=#', object, key, value);
   static List _getPropertyNames(object) =>
       JS('JSExtendableArray', 'Object.keys(#)', object);
   static bool _isUnprocessed(object) =>
-      JS('bool', 'typeof(#)=="undefined"', object);
+      JS<bool>('!', 'typeof(#)=="undefined"', object);
   static _newJavaScriptObject() => JS('=Object', 'Object.create(null)');
 }
 
@@ -402,9 +403,9 @@
       bool allowMalformed, List<int> codeUnits, int start, int end) {
     // Test `codeUnits is NativeUint8List`. Dart's NativeUint8List is
     // implemented by JavaScript's Uint8Array.
-    if (JS('bool', '# instanceof Uint8Array', codeUnits)) {
+    if (JS<bool>('!', '# instanceof Uint8Array', codeUnits)) {
       // JS 'cast' to avoid a downcast equivalent to the is-check we hand-coded.
-      NativeUint8List casted = JS('NativeUint8List', '#', codeUnits);
+      NativeUint8List casted = JS<NativeUint8List>('!', '#', codeUnits);
       return _convertInterceptedUint8List(allowMalformed, casted, start, end);
     }
   }
@@ -438,7 +439,7 @@
     }
 
     return _useTextDecoderChecked(decoder,
-        JS('NativeUint8List', '#.subarray(#, #)', codeUnits, start, end));
+        JS<NativeUint8List>('!', '#.subarray(#, #)', codeUnits, start, end));
   }
 
   static String _useTextDecoderChecked(decoder, NativeUint8List codeUnits) {
@@ -451,7 +452,7 @@
     // back on unintercepted decoder. The fallback will either succeed in
     // decoding, or report the problem better than TextDecoder.
     try {
-      return JS('String', '#.decode(#)', decoder, codeUnits);
+      return JS<String>('!', '#.decode(#)', decoder, codeUnits);
     } catch (e) {}
     return null;
   }
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 1c742e1..746ac61 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/core_patch.dart
@@ -37,10 +37,10 @@
   // for them to be equivalent to their computed hashCode function.
   int hash = JS('int|Null', r'#[#]', object, dart.identityHashCode_);
   if (hash == null) {
-    hash = JS('int', '(Math.random() * 0x3fffffff) | 0');
+    hash = JS<int>('!', '(Math.random() * 0x3fffffff) | 0');
     JS('void', r'#[#] = #', object, dart.identityHashCode_, hash);
   }
-  return JS('int', '#', hash);
+  return JS<int>('!', '#', hash);
 }
 
 // Patch for Object implementation.
@@ -399,7 +399,7 @@
   @patch
   factory List([@undefined int _length]) {
     dynamic list;
-    if (JS('bool', '# === void 0', _length)) {
+    if (JS<bool>('!', '# === void 0', _length)) {
       list = JS('', '[]');
     } else {
       int length = JS('!', '#', _length);
@@ -564,7 +564,7 @@
 // Patch for 'identical' function.
 @patch
 bool identical(Object a, Object b) {
-  return JS('bool', '(# == null ? # == null : # === #)', a, b, a, b);
+  return JS<bool>('!', '(# == null ? # == null : # === #)', a, b, a, b);
 }
 
 @patch
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 13c6f64..61d031a 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/io_patch.dart
@@ -546,7 +546,7 @@
 @patch
 class _SecureFilter {
   @patch
-  factory _SecureFilter() {
+  factory _SecureFilter._() {
     throw UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/patch/math_patch.dart b/sdk/lib/_internal/js_dev_runtime/patch/math_patch.dart
index 869c705..2ba4220 100644
--- a/sdk/lib/_internal/js_dev_runtime/patch/math_patch.dart
+++ b/sdk/lib/_internal/js_dev_runtime/patch/math_patch.dart
@@ -19,49 +19,49 @@
 
 @patch
 @notNull
-double sqrt(@nullCheck num x) => JS('num', r'Math.sqrt(#)', x);
+double sqrt(@nullCheck num x) => JS<num>('!', r'Math.sqrt(#)', x);
 
 @patch
 @notNull
-double sin(@nullCheck num radians) => JS('num', r'Math.sin(#)', radians);
+double sin(@nullCheck num radians) => JS<num>('!', r'Math.sin(#)', radians);
 
 @patch
 @notNull
-double cos(@nullCheck num radians) => JS('num', r'Math.cos(#)', radians);
+double cos(@nullCheck num radians) => JS<num>('!', r'Math.cos(#)', radians);
 
 @patch
 @notNull
-double tan(@nullCheck num radians) => JS('num', r'Math.tan(#)', radians);
+double tan(@nullCheck num radians) => JS<num>('!', r'Math.tan(#)', radians);
 
 @patch
 @notNull
-double acos(@nullCheck num x) => JS('num', r'Math.acos(#)', x);
+double acos(@nullCheck num x) => JS<num>('!', r'Math.acos(#)', x);
 
 @patch
 @notNull
-double asin(@nullCheck num x) => JS('num', r'Math.asin(#)', x);
+double asin(@nullCheck num x) => JS<num>('!', r'Math.asin(#)', x);
 
 @patch
 @notNull
-double atan(@nullCheck num x) => JS('num', r'Math.atan(#)', x);
+double atan(@nullCheck num x) => JS<num>('!', r'Math.atan(#)', x);
 
 @patch
 @notNull
 double atan2(@nullCheck num a, @nullCheck num b) =>
-    JS('num', r'Math.atan2(#, #)', a, b);
+    JS<num>('!', r'Math.atan2(#, #)', a, b);
 
 @patch
 @notNull
-double exp(@nullCheck num x) => JS('num', r'Math.exp(#)', x);
+double exp(@nullCheck num x) => JS<num>('!', r'Math.exp(#)', x);
 
 @patch
 @notNull
-double log(@nullCheck num x) => JS('num', r'Math.log(#)', x);
+double log(@nullCheck num x) => JS<num>('!', r'Math.log(#)', x);
 
 @patch
 @notNull
 num pow(@nullCheck num x, @nullCheck num exponent) =>
-    JS('num', r'Math.pow(#, #)', x, exponent);
+    JS<num>('!', r'Math.pow(#, #)', x, exponent);
 
 const int _POW2_32 = 0x100000000;
 
diff --git a/sdk/lib/_internal/js_dev_runtime/private/custom_hash_map.dart b/sdk/lib/_internal/js_dev_runtime/private/custom_hash_map.dart
index 6b90717..c7c920d 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/custom_hash_map.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/custom_hash_map.dart
@@ -55,13 +55,13 @@
   CustomHashMap(this._equals, this._hashCode);
 
   @notNull
-  int get length => JS('int', '#.size', _map);
+  int get length => JS<int>('!', '#.size', _map);
 
   @notNull
-  bool get isEmpty => JS('bool', '#.size == 0', _map);
+  bool get isEmpty => JS<bool>('!', '#.size == 0', _map);
 
   @notNull
-  bool get isNotEmpty => JS('bool', '#.size != 0', _map);
+  bool get isNotEmpty => JS<bool>('!', '#.size != 0', _map);
 
   Iterable<K> get keys => _JSMapIterable<K>(this, true);
   Iterable<V> get values => _JSMapIterable<V>(this, false);
@@ -72,7 +72,7 @@
       var buckets = JS('', '#.get(# & 0x3ffffff)', _keyMap, _hashCode(key));
       if (buckets != null) {
         var equals = _equals;
-        for (int i = 0, n = JS('int', '#.length', buckets); i < n; i++) {
+        for (int i = 0, n = JS<int>('!', '#.length', buckets); i < n; i++) {
           K k = JS('', '#[#]', buckets, i);
           if (equals(k, key)) return true;
         }
@@ -99,7 +99,7 @@
       var buckets = JS('', '#.get(# & 0x3ffffff)', _keyMap, _hashCode(key));
       if (buckets != null) {
         var equals = _equals;
-        for (int i = 0, n = JS('int', '#.length', buckets); i < n; i++) {
+        for (int i = 0, n = JS<int>('!', '#.length', buckets); i < n; i++) {
           K k = JS('', '#[#]', buckets, i);
           if (equals(k, key)) {
             V value = JS('', '#.get(#)', _map, k);
@@ -119,7 +119,7 @@
       JS('', '#.set(#, [#])', keyMap, hash, key);
     } else {
       var equals = _equals;
-      for (int i = 0, n = JS('int', '#.length', buckets);;) {
+      for (int i = 0, n = JS<int>('!', '#.length', buckets);;) {
         K k = JS('', '#[#]', buckets, i);
         if (equals(k, key)) {
           key = k;
@@ -143,7 +143,7 @@
       JS('', '#.set(#, [#])', keyMap, hash, key);
     } else {
       var equals = _equals;
-      for (int i = 0, n = JS('int', '#.length', buckets); i < n; i++) {
+      for (int i = 0, n = JS<int>('!', '#.length', buckets); i < n; i++) {
         K k = JS('', '#[#]', buckets, i);
         if (equals(k, key)) return JS('', '#.get(#)', _map, k);
       }
@@ -163,7 +163,7 @@
       var buckets = JS('', '#.get(#)', keyMap, hash);
       if (buckets == null) return null; // not found
       var equals = _equals;
-      for (int i = 0, n = JS('int', '#.length', buckets); i < n; i++) {
+      for (int i = 0, n = JS<int>('!', '#.length', buckets); i < n; i++) {
         K k = JS('', '#[#]', buckets, i);
         if (equals(k, key)) {
           if (n == 1) {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
index 704b856..8fe2fa6 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/classes.dart
@@ -127,7 +127,14 @@
     $throwInternalError('must have at least one generic type argument');
   }
   let resultMap = new Map();
-  $_cacheMaps.push(resultMap);
+  // TODO(vsm): Rethink how to clear the resultMap on hot restart.
+  // A simple clear via:
+  //   _cacheMaps.push(resultMap);
+  // will break (a) we hoist type expressions in generated code and
+  // (b) we don't clear those type expressions in the presence of a
+  // hot restart.  Not clearing this map (as we're doing now) should
+  // not affect correctness, but can result in a memory leak across
+  // multiple restarts.
   function makeGenericType(...args) {
     if (args.length != length && args.length != 0) {
       $throwInternalError('requires ' + length + ' or 0 type arguments');
diff --git a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
index 4ba9bc7..c198f74 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/ddc_runtime/errors.dart
@@ -271,7 +271,7 @@
 
     var e = _jsError;
     String trace = '';
-    if (e != null && JS('bool', 'typeof # === "object"', e)) {
+    if (e != null && JS<bool>('!', 'typeof # === "object"', e)) {
       trace = e is NativeError ? e.dartStack() : JS<String>('', '#.stack', e);
       if (trace != null && stackTraceMapper != null) {
         trace = stackTraceMapper(trace);
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 3265b7f..bbde1a6 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
@@ -83,6 +83,15 @@
 @notNull
 bool _isJsObject(obj) => JS('!', '# === #', getReifiedType(obj), jsobject);
 
+/// Asserts that [f] is a native JS functions and returns it if so.
+/// This function should be used to ensure that a function is a native
+/// JS functions in contexts that expect that.
+F assertInterop<F extends Function>(F f) {
+  // TODO(vsm): Throw a more specific error if this fails.
+  assert(_isJsObject(f));
+  return f;
+}
+
 /// The Dart type that represents a JavaScript class(/constructor) type.
 ///
 /// The JavaScript type may not exist, either because it's not loaded yet, or
@@ -333,16 +342,16 @@
   List metadata = [];
   String _stringValue;
 
-  /**
-   * Construct a function type.
-   *
-   * We eagerly normalize the argument types to avoid having to deal with
-   * this logic in multiple places.
-   *
-   * This code does best effort canonicalization.  It does not guarantee
-   * that all instances will share.
-   *
-   */
+  /// Construct a function type.
+  ///
+  /// We eagerly normalize the argument types to avoid having to deal with this
+  /// logic in multiple places.
+  ///
+  /// This code does best effort canonicalization.  It does not guarantee that
+  /// all instances will share.
+  ///
+  /// Note: Generic function subtype checks assume types have been canonicalized
+  /// when testing if type bounds are equal.
   static FunctionType create(returnType, List args, extra) {
     // Note that if extra is ever passed as an empty array
     // or an empty map, we can end up with semantically
@@ -507,12 +516,15 @@
     return _typeFormals = _typeFormalsFromFunction(_instantiateTypeParts);
   }
 
+  /// `true` if there are bounds on any of the generic type parameters.
+  get hasTypeBounds => _instantiateTypeBounds != null;
+
   /// Checks that [typeArgs] satisfies the upper bounds of the [typeFormals],
   /// and throws a [TypeError] if they do not.
   void checkBounds(List typeArgs) {
     // If we don't have explicit type parameter bounds, the bounds default to
     // a top type, so there's nothing to check here.
-    if (_instantiateTypeBounds == null) return;
+    if (!hasTypeBounds) return;
 
     var bounds = instantiateTypeBounds(typeArgs);
     var typeFormals = this.typeFormals;
@@ -528,8 +540,7 @@
   }
 
   List instantiateTypeBounds(List typeArgs) {
-    var boundsFn = _instantiateTypeBounds;
-    if (boundsFn == null) {
+    if (!hasTypeBounds) {
       // The Dart 1 spec says omitted type parameters have an upper bound of
       // Object. However Dart 2 uses `dynamic` for the purpose of instantiate to
       // bounds, so we use that here.
@@ -537,7 +548,7 @@
     }
     // Bounds can be recursive or depend on other type parameters, so we need to
     // apply type arguments and return the resulting bounds.
-    return JS('List', '#.apply(null, #)', boundsFn, typeArgs);
+    return JS('List', '#.apply(null, #)', _instantiateTypeBounds, typeArgs);
   }
 
   toString() {
@@ -686,16 +697,21 @@
 FunctionType fnType(returnType, List args, [@undefined extra]) =>
     FunctionType.create(returnType, args, extra);
 
-/// Creates a generic function type.
+/// Creates a generic function type from [instantiateFn] and [typeBounds].
 ///
-/// A function type consists of two things: an instantiate function, and an
-/// function that returns a list of upper bound constraints for each
-/// the type formals. Both functions accept the type parameters, allowing us
-/// to substitute values. The upper bound constraints can be omitted if all
-/// of the type parameters use the default upper bound.
+/// A function type consists of two things:
+/// * An instantiate function that takes type arguments and returns the
+///   function signature in the form of a two element list. The first element
+///   is the return type. The second element is a list of the argument types.
+/// * A function that returns a list of upper bound constraints for each of
+///   the type formals.
+///
+/// Both functions accept the type parameters, allowing us to substitute values.
+/// The upper bound constraints can be omitted if all of the type parameters use
+/// the default upper bound.
 ///
 /// For example given the type <T extends Iterable<T>>(T) -> T, we can declare
-/// this type with `gFnType(T => [T, [T]], T => [Iterable$(T)])`.\
+/// this type with `gFnType(T => [T, [T]], T => [Iterable$(T)])`.
 gFnType(instantiateFn, typeBounds) =>
     GenericFunctionType(instantiateFn, typeBounds);
 
@@ -873,6 +889,7 @@
     // given t1 is Future<A> | A, then:
     // (Future<A> | A) <: t2 iff Future<A> <: t2 and A <: t2.
     let t1Future = ${getGenericClass(Future)}(t1TypeArg);
+    // Known to handle the case FutureOr<Null> <: Future<Null>.
     return $_isSubtype(t1Future, $t2) && $_isSubtype(t1TypeArg, $t2);
   }
 
@@ -881,9 +898,7 @@
     // t1 <: (Future<A> | A) iff t1 <: Future<A> or t1 <: A
     let t2TypeArg = ${getGenericArgs(t2)}[0];
     let t2Future = ${getGenericClass(Future)}(t2TypeArg);
-    let s1 = $_isSubtype($t1, t2Future);
-    let s2 = $_isSubtype($t1, t2TypeArg);
-    return s1 || s2;
+    return $_isSubtype($t1, t2Future) || $_isSubtype($t1, t2TypeArg);
   }
 
   // "Traditional" name-based subtype check.  Avoid passing
@@ -899,9 +914,11 @@
     }
 
     // All JS types are subtypes of anonymous JS types.
-    if ($t1 === $jsobject && $t2 instanceof $AnonymousJSType) return true;
+    if ($t1 === $jsobject && $t2 instanceof $AnonymousJSType) {
+      return true;
+    }
 
-    // Compare two interface types:
+    // Compare two interface types.
     return ${_isInterfaceSubtype(t1, t2)};
   }
 
@@ -933,21 +950,23 @@
     // rather it uses JS function parameters to ensure correct binding.
     let fresh = $t2.typeFormals;
 
-    // Check the bounds of the type parameters of g1 and g2.
-    // given a type parameter `T1 extends U1` from g1, and a type parameter
-    // `T2 extends U2` from g2, we must ensure that:
-    //
-    //      U2 <: U1
-    //
-    // (Note the reversal of direction -- type formal bounds are contravariant,
-    // similar to the function's formal parameter types).
-    //
-    let t1Bounds = $t1.instantiateTypeBounds(fresh);
-    let t2Bounds = $t2.instantiateTypeBounds(fresh);
-    // TODO(jmesserly): we could optimize for the common case of no bounds.
-    for (let i = 0; i < formalCount; i++) {
-      if (!$_isSubtype(t2Bounds[i], t1Bounds[i])) {
-        return false;
+    // Without type bounds all will instantiate to dynamic. Only need to check
+    // further if at least one of the functions has type bounds.
+    if ($t1.hasTypeBounds || $t2.hasTypeBounds) {
+      // Check the bounds of the type parameters of g1 and g2.
+      // given a type parameter `T1 extends U1` from g1, and a type parameter
+      // `T2 extends U2` from g2, we must ensure that:
+      //
+      //      U2 == U1
+      //
+      // (Note there is no variance in the type bounds of type parameters of
+      // generic functions).
+      let t1Bounds = $t1.instantiateTypeBounds(fresh);
+      let t2Bounds = $t2.instantiateTypeBounds(fresh);
+      for (let i = 0; i < formalCount; i++) {
+        if (t2Bounds[i] != t1Bounds[i]) {
+          return false;
+        }
       }
     }
 
@@ -991,22 +1010,12 @@
   if (raw1 != null && raw1 == raw2) {
     let typeArguments1 = $getGenericArgs($t1);
     let typeArguments2 = $getGenericArgs($t2);
-    let length = typeArguments1.length;
-    if (typeArguments2.length == 0) {
-      // t2 is the raw form of t1
-      return true;
-    } else if (length == 0) {
-      // t1 is raw, but t2 is not
-      if (typeArguments2.every($_isTop)) {
-        return true;
-      }
-      return false;
+    if (typeArguments1.length != typeArguments2.length) {
+      $assertFailed();
     }
-    if (length != typeArguments2.length) $assertFailed();
-    for (let i = 0; i < length; ++i) {
-      let result = $_isSubtype(typeArguments1[i], typeArguments2[i]);
-      if (!result) {
-        return result;
+    for (let i = 0; i < typeArguments1.length; ++i) {
+      if (!$_isSubtype(typeArguments1[i], typeArguments2[i])) {
+        return false;
       }
     }
     return true;
diff --git a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
index 69016fd..4618317 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/debugger.dart
@@ -44,7 +44,7 @@
 /// We truncate a toString() longer than [maxStringLength].
 int maxFormatterStringLength = 100;
 
-String _typeof(object) => JS('String', 'typeof #', object);
+String _typeof(object) => JS<String>('!', 'typeof #', object);
 
 List<String> getOwnPropertyNames(object) =>
     JSArray<String>.of(dart.getOwnPropertyNames(object));
diff --git a/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
index 0c86cc1..02e5c24 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/foreign_helper.dart
@@ -71,7 +71,7 @@
  *    The remedy in this case is to expand the `+=` operator, leaving all
  *    references to the Dart field as Dart code:
  *
- *        this.field = JS('String', '# + "x"', this.field);
+ *        this.field = JS<String>('!', '# + "x"', this.field);
  *
  *  + Never use `#` in function bodies.
  *
@@ -106,6 +106,9 @@
  */
 // Add additional optional arguments if needed. The method is treated internally
 // as a variable argument method.
+// TODO(vsm): Enforce that this doesn't fall back to dynamic by typing it as:
+//  `T JS<T extends Object>(...)`
+// once we clean up html libraries.
 T JS<T>(String typeDescription, String codeTemplate,
     [arg0,
     arg1,
@@ -143,7 +146,7 @@
  * Returns the JavaScript constructor function for Dart's Object class.
  * This can be used for type tests, as in
  *
- *     if (JS('bool', '# instanceof #', obj, JS_DART_OBJECT_CONSTRUCTOR()))
+ *     if (JS<bool>('!', '# instanceof #', obj, JS_DART_OBJECT_CONSTRUCTOR()))
  *       ...
  */
 JS_DART_OBJECT_CONSTRUCTOR() {}
@@ -265,7 +268,7 @@
  */
 String JS_STRING_CONCAT(String a, String b) {
   // This body is unused, only here for type analysis.
-  return JS('String', '# + #', a, b);
+  return JS<String>('!', '# + #', a, b);
 }
 
 /// Same `@rest` annotation and `spread` function as in
diff --git a/sdk/lib/_internal/js_dev_runtime/private/identity_hash_map.dart b/sdk/lib/_internal/js_dev_runtime/private/identity_hash_map.dart
index d75f86932..04107cc 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/identity_hash_map.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/identity_hash_map.dart
@@ -21,20 +21,20 @@
   IdentityMap();
   IdentityMap.from(JSArray entries) {
     var map = _map;
-    for (int i = 0, n = JS('int', '#.length', entries); i < n; i += 2) {
+    for (int i = 0, n = JS<int>('!', '#.length', entries); i < n; i += 2) {
       JS('', '#.set(#[#], #[#])', map, entries, i, entries, i + 1);
     }
   }
 
-  int get length => JS('int', '#.size', _map);
-  bool get isEmpty => JS('bool', '#.size == 0', _map);
-  bool get isNotEmpty => JS('bool', '#.size != 0', _map);
+  int get length => JS<int>('!', '#.size', _map);
+  bool get isEmpty => JS<bool>('!', '#.size == 0', _map);
+  bool get isNotEmpty => JS<bool>('!', '#.size != 0', _map);
 
   Iterable<K> get keys => _JSMapIterable<K>(this, true);
   Iterable<V> get values => _JSMapIterable<V>(this, false);
 
   bool containsKey(Object key) {
-    return JS('bool', '#.has(#)', _map, key);
+    return JS<bool>('!', '#.has(#)', _map, key);
   }
 
   bool containsValue(Object value) {
@@ -63,13 +63,15 @@
     var map = _map;
     int length = JS('!', '#.size', map);
     JS('', '#.set(#, #)', map, key, value);
-    if (length != JS('int', '#.size', map)) {
+    if (length != JS<int>('!', '#.size', map)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
   }
 
   V putIfAbsent(K key, V ifAbsent()) {
-    if (JS('bool', '#.has(#)', _map, key)) return JS('', '#.get(#)', _map, key);
+    if (JS<bool>('!', '#.has(#)', _map, key)) {
+      return JS('', '#.get(#)', _map, key);
+    }
     V value = ifAbsent();
     if (value == null) value = null; // coerce undefined to null.
     JS('', '#.set(#, #)', _map, key, value);
@@ -79,14 +81,14 @@
 
   V remove(Object key) {
     V value = JS('', '#.get(#)', _map, key);
-    if (JS('bool', '#.delete(#)', _map, key)) {
+    if (JS<bool>('!', '#.delete(#)', _map, key)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
     return value == null ? null : value; // coerce undefined to null.
   }
 
   void clear() {
-    if (JS('int', '#.size', _map) > 0) {
+    if (JS<int>('!', '#.size', _map) > 0) {
       JS('', '#.clear()', _map);
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
index 445f0cb..6ddd96b 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/interceptors.dart
@@ -20,7 +20,7 @@
   const Interceptor();
 
   // Use native JS toString method instead of standard Dart Object.toString.
-  String toString() => JS('String', '#.toString()', this);
+  String toString() => JS<String>('!', '#.toString()', this);
 }
 
 // TODO(jmesserly): remove
@@ -35,7 +35,7 @@
 
   // Note: if you change this, also change the function [S].
   @notNull
-  String toString() => JS('String', r'String(#)', this);
+  String toString() => JS<String>('!', r'String(#)', this);
 
   // The values here are SMIs, co-prime and differ about half of the bit
   // positions, including the low bit, so they are different mod 2^k.
@@ -43,10 +43,12 @@
   int get hashCode => this ? (2 * 3 * 23 * 3761) : (269 * 811);
 
   @notNull
-  bool operator &(@nullCheck bool other) => JS('bool', "# && #", other, this);
+  bool operator &(@nullCheck bool other) =>
+      JS<bool>('!', "# && #", other, this);
 
   @notNull
-  bool operator |(@nullCheck bool other) => JS('bool', "# || #", other, this);
+  bool operator |(@nullCheck bool other) =>
+      JS<bool>('!', "# || #", other, this);
 
   @notNull
   bool operator ^(@nullCheck bool other) => !identical(this, other);
@@ -102,11 +104,11 @@
 class UnknownJavaScriptObject extends JavaScriptObject {
   const UnknownJavaScriptObject();
 
-  String toString() => JS('String', 'String(#)', this);
+  String toString() => JS<String>('!', 'String(#)', this);
 }
 
 class NativeError extends Interceptor {
-  String dartStack() => JS('String', '#.stack', this);
+  String dartStack() => JS<String>('!', '#.stack', this);
 }
 
 // Note that this needs to be in interceptors.dart in order for
@@ -153,7 +155,7 @@
     var name = _fieldName(message);
     if (name == null) {
       // Not a Null NSM error: fallback to JS.
-      return JS('String', '#.toString()', this);
+      return JS<String>('!', '#.toString()', this);
     }
     return "NoSuchMethodError: invalid member on null: '$name'";
   }
@@ -169,7 +171,7 @@
     // exposed to Dart code via JS interop or debugging tools.
     if (dart.isType(this)) return dart.typeName(this);
 
-    return JS('String', r'"Closure: " + # + " from: " + #',
+    return JS<String>('!', r'"Closure: " + # + " from: " + #',
         dart.typeName(dart.getReifiedType(this)), this);
   }
 
@@ -177,7 +179,7 @@
   operator ==(other) {
     if (other == null) return false;
     var boundObj = JS<Object>('', '#._boundObject', this);
-    if (boundObj == null) return JS('bool', '# === #', this, other);
+    if (boundObj == null) return JS<bool>('!', '# === #', this, other);
     return JS(
         'bool',
         '# === #._boundObject && #._boundMethod === #._boundMethod',
@@ -215,7 +217,7 @@
 
   get invalidValue => null;
   get name => null;
-  get message => JS('String', '#.message', this);
+  get message => JS<String>('!', '#.message', this);
 
   String toString() => "Invalid argument: $message";
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart
index 6f98394..490c4b9 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/isolate_helper.dart
@@ -59,11 +59,11 @@
       : _once = false {
     if (hasTimer()) {
       dart.addAsyncCallback();
-      int start = JS('int', 'Date.now()');
-      _handle = JS('int', '#.setInterval(#, #)', global, () {
+      int start = JS<int>('!', 'Date.now()');
+      _handle = JS<int>('!', '#.setInterval(#, #)', global, () {
         int tick = this._tick + 1;
         if (milliseconds > 0) {
-          int duration = JS('int', 'Date.now()') - start;
+          int duration = JS<int>('!', 'Date.now()') - start;
           if (duration > (tick + 1) * milliseconds) {
             tick = duration ~/ milliseconds;
           }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_array.dart b/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
index 306b1a2..f064b24 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_array.dart
@@ -57,13 +57,13 @@
   }
 
   checkMutable(reason) {
-    if (JS('bool', r'#.immutable$list', this)) {
+    if (JS<bool>('!', r'#.immutable$list', this)) {
       throw UnsupportedError(reason);
     }
   }
 
   checkGrowable(reason) {
-    if (JS('bool', r'#.fixed$length', this)) {
+    if (JS<bool>('!', r'#.fixed$length', this)) {
       throw UnsupportedError(reason);
     }
   }
@@ -215,7 +215,7 @@
     for (int i = 0; i < length; i++) {
       list[i] = "${this[i]}";
     }
-    return JS('String', "#.join(#)", list, separator);
+    return JS<String>('!', "#.join(#)", list, separator);
   }
 
   Iterable<E> take(int n) {
@@ -554,7 +554,7 @@
   bool operator ==(other) => identical(this, other);
 
   @notNull
-  int get length => JS('int', r'#.length', this);
+  int get length => JS<int>('!', r'#.length', this);
 
   void set length(@nullCheck int newLength) {
     checkGrowable('set length');
@@ -570,8 +570,8 @@
   E operator [](int index) {
     // Suppress redundant null checks via JS.
     if (index == null ||
-        JS('int', '#', index) >= JS('int', '#.length', this) ||
-        JS('int', '#', index) < 0) {
+        JS<int>('!', '#', index) >= JS<int>('!', '#.length', this) ||
+        JS<int>('!', '#', index) < 0) {
       throw diagnoseIndexError(this, index);
     }
     return JS('var', '#[#]', this, index);
@@ -580,8 +580,8 @@
   void operator []=(int index, E value) {
     checkMutable('indexed set');
     if (index == null ||
-        JS('int', '#', index) >= JS('int', '#.length', this) ||
-        JS('int', '#', index) < 0) {
+        JS<int>('!', '#', index) >= JS<int>('!', '#.length', this) ||
+        JS<int>('!', '#', index) < 0) {
       throw diagnoseIndexError(this, index);
     }
     JS('void', r'#[#] = #', this, index, value);
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 2f6750e..5d6b037 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_helper.dart
@@ -52,7 +52,7 @@
   bool moveNext() {
     final ret = JS('', '#.next()', _jsIterator);
     _current = JS('', '#.value', ret);
-    return JS('bool', '!#.done', ret);
+    return JS<bool>('!', '!#.done', ret);
   }
 }
 
@@ -93,11 +93,11 @@
     if (_radix == null) {
       if (decimalMatch != null) {
         // Cannot fail because we know that the digits are all decimal.
-        return JS('int', r'parseInt(#, 10)', source);
+        return JS<int>('!', r'parseInt(#, 10)', source);
       }
       if (match[hexIndex] != null) {
         // Cannot fail because we know that the digits are all hex.
-        return JS('int', r'parseInt(#, 16)', source);
+        return JS<int>('!', r'parseInt(#, 16)', source);
       }
       return _parseIntError(source, handleError);
     }
@@ -108,7 +108,7 @@
     }
     if (radix == 10 && decimalMatch != null) {
       // Cannot fail because we know that the digits are all decimal.
-      return JS('int', r'parseInt(#, 10)', source);
+      return JS<int>('!', r'parseInt(#, 10)', source);
     }
     // If radix >= 10 and we have only decimal digits the string is safe.
     // Otherwise we need to check the digits.
@@ -132,7 +132,7 @@
         maxCharCode = (0x61 - 10 - 1) + radix;
       }
       assert(match[digitsIndex] is String);
-      String digitsPart = JS('String', '#[#]', match, digitsIndex);
+      String digitsPart = JS<String>('!', '#[#]', match, digitsIndex);
       for (int i = 0; i < digitsPart.length; i++) {
         int characterCode = digitsPart.codeUnitAt(i) | 0x20;
         if (characterCode > maxCharCode) {
@@ -142,7 +142,7 @@
     }
     // The above matching and checks ensures the source has at least one digits
     // and all digits are suitable for the radix, so parseInt cannot return NaN.
-    return JS('int', r'parseInt(#, #)', source, radix);
+    return JS<int>('!', r'parseInt(#, #)', source, radix);
   }
 
   @NoInline()
@@ -183,19 +183,19 @@
   /** `r"$".codeUnitAt(0)` */
   static const int DOLLAR_CHAR_VALUE = 36;
 
-  static int dateNow() => JS('int', r'Date.now()');
+  static int dateNow() => JS<int>('!', r'Date.now()');
 
   static void initTicker() {
     if (timerFrequency != null) return;
     // Start with low-resolution. We overwrite the fields if we find better.
     timerFrequency = 1000;
     timerTicks = dateNow;
-    if (JS('bool', 'typeof window == "undefined"')) return;
+    if (JS<bool>('!', 'typeof window == "undefined"')) return;
     var jsWindow = JS('var', 'window');
     if (jsWindow == null) return;
     var performance = JS('var', '#.performance', jsWindow);
     if (performance == null) return;
-    if (JS('bool', 'typeof #.now != "function"', performance)) return;
+    if (JS<bool>('!', 'typeof #.now != "function"', performance)) return;
     timerFrequency = 1000000;
     timerTicks = () => (1000 * JS<num>('!', '#.now()', performance)).floor();
   }
@@ -217,8 +217,8 @@
 
   static String currentUri() {
     // In a browser return self.location.href.
-    if (JS('bool', '!!#.location', dart.global_)) {
-      return JS('String', '#.location.href', dart.global_);
+    if (JS<bool>('!', '!!#.location', dart.global_)) {
+      return JS<String>('!', '#.location.href', dart.global_);
     }
 
     // TODO(vsm): Consider supporting properly in non-browser settings.
@@ -233,7 +233,7 @@
     @nullCheck
     int end = array.length;
     if (end <= kMaxApply) {
-      return JS('String', r'String.fromCharCode.apply(null, #)', array);
+      return JS<String>('!', r'String.fromCharCode.apply(null, #)', array);
     }
     String result = '';
     for (int i = 0; i < end; i += kMaxApply) {
@@ -280,7 +280,7 @@
       NativeUint8List charCodes, @nullCheck int start, @nullCheck int end) {
     const kMaxApply = 500;
     if (end <= kMaxApply && start == 0 && end == charCodes.length) {
-      return JS('String', r'String.fromCharCode.apply(null, #)', charCodes);
+      return JS<String>('!', r'String.fromCharCode.apply(null, #)', charCodes);
     }
     String result = '';
     for (int i = start; i < end; i += kMaxApply) {
@@ -300,13 +300,13 @@
   static String stringFromCharCode(@nullCheck int charCode) {
     if (0 <= charCode) {
       if (charCode <= 0xffff) {
-        return JS('String', 'String.fromCharCode(#)', charCode);
+        return JS<String>('!', 'String.fromCharCode(#)', charCode);
       }
       if (charCode <= 0x10ffff) {
         var bits = charCode - 0x10000;
         var low = 0xDC00 | (bits & 0x3ff);
         var high = 0xD800 | (bits >> 10);
-        return JS('String', 'String.fromCharCode(#, #)', high, low);
+        return JS<String>('!', 'String.fromCharCode(#, #)', high, low);
       }
     }
     throw RangeError.range(charCode, 0, 0x10ffff);
@@ -317,7 +317,7 @@
   }
 
   static String flattenString(String str) {
-    return JS('String', "#.charCodeAt(0) == 0 ? # : #", str, str, str);
+    return JS<String>('!', "#.charCodeAt(0) == 0 ? # : #", str, str, str);
   }
 
   static String getTimeZoneName(DateTime receiver) {
@@ -357,7 +357,7 @@
 
   static int getTimeZoneOffsetInMinutes(DateTime receiver) {
     // Note that JS and Dart disagree on the sign of the offset.
-    return -JS('int', r'#.getTimezoneOffset()', lazyAsJsDate(receiver));
+    return -JS<int>('!', r'#.getTimezoneOffset()', lazyAsJsDate(receiver));
   }
 
   static num valueFromDecomposedDate(
@@ -400,7 +400,7 @@
 
   // Lazily keep a JS Date stored in the JS object.
   static lazyAsJsDate(DateTime receiver) {
-    if (JS('bool', r'#.date === (void 0)', receiver)) {
+    if (JS<bool>('!', r'#.date === (void 0)', receiver)) {
       JS('void', r'#.date = new Date(#)', receiver,
           receiver.millisecondsSinceEpoch);
     }
@@ -413,50 +413,50 @@
 
   static int getYear(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCFullYear() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getFullYear() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getMonth(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
-        : JS('int', r'#.getMonth() + 1', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'#.getUTCMonth() + 1', lazyAsJsDate(receiver))
+        : JS<int>('!', r'#.getMonth() + 1', lazyAsJsDate(receiver));
   }
 
   static int getDay(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCDate() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getDate() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getHours(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCHours() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getHours() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getMinutes(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCMinutes() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getMinutes() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getSeconds(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCSeconds() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getSeconds() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getMilliseconds(DateTime receiver) {
     return (receiver.isUtc)
-        ? JS('int', r'(#.getUTCMilliseconds() + 0)', lazyAsJsDate(receiver))
-        : JS('int', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'(#.getUTCMilliseconds() + 0)', lazyAsJsDate(receiver))
+        : JS<int>('!', r'(#.getMilliseconds() + 0)', lazyAsJsDate(receiver));
   }
 
   static int getWeekday(DateTime receiver) {
     int weekday = (receiver.isUtc)
-        ? JS('int', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
-        : JS('int', r'#.getDay() + 0', lazyAsJsDate(receiver));
+        ? JS<int>('!', r'#.getUTCDay() + 0', lazyAsJsDate(receiver))
+        : JS<int>('!', r'#.getDay() + 0', lazyAsJsDate(receiver));
     // Adjust by one because JS weeks start on Sunday.
     return (weekday + 6) % 7 + 1;
   }
@@ -522,7 +522,7 @@
 
 @notNull
 int stringLastIndexOfUnchecked(receiver, element, start) =>
-    JS('int', r'#.lastIndexOf(#, #)', receiver, element, start);
+    JS<int>('!', r'#.lastIndexOf(#, #)', receiver, element, start);
 
 /// 'factory' for constructing ArgumentError.value to keep the call sites small.
 @NoInline()
@@ -598,7 +598,7 @@
 }
 
 bool jsHasOwnProperty(var jsObject, String property) {
-  return JS('bool', r'#.hasOwnProperty(#)', jsObject, property);
+  return JS<bool>('!', r'#.hasOwnProperty(#)', jsObject, property);
 }
 
 jsPropertyAccess(var jsObject, String property) {
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_mirrors.dart b/sdk/lib/_internal/js_dev_runtime/private/js_mirrors.dart
index 7a61bf2..a93f5fb 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_mirrors.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_mirrors.dart
@@ -79,7 +79,7 @@
 
 String _getNameForESSymbol(member) {
   // Convert private JS symbol "Symbol(_foo)" to string "_foo".
-  assert(JS('bool', 'typeof # == "symbol"', member));
+  assert(JS<bool>('!', 'typeof # == "symbol"', member));
   var str = member.toString();
   assert(str.startsWith('Symbol(') && str.endsWith(')'));
   return str.substring(7, str.length - 1);
@@ -288,7 +288,7 @@
       });
 
       getterType(type) {
-        if (JS('bool', '# instanceof Array', type)) {
+        if (JS<bool>('!', '# instanceof Array', type)) {
           var array = JS('', '#.slice()', type);
           type = JS('', '#[0]', array);
           JS('', '#[0] = #', array, dart.fnType(type, []));
@@ -305,7 +305,7 @@
       });
 
       setterType(type) {
-        if (JS('bool', '# instanceof Array', type)) {
+        if (JS<bool>('!', '# instanceof Array', type)) {
           var array = JS('', '#.slice()', type);
           type = JS('', '#[0]', array);
           JS('', '#[0] = #', array, dart.fnType(dart.void_, [type]));
@@ -353,7 +353,7 @@
   JsClassMirror._(Type cls, {bool instantiated = true})
       : _cls = cls,
         _raw = instantiated ? dart.getGenericClass(dart.unwrapType(cls)) : null,
-        simpleName = Symbol(JS('String', '#.name', dart.unwrapType(cls))) {
+        simpleName = Symbol(JS<String>('!', '#.name', dart.unwrapType(cls))) {
     var typeArgs = dart.getGenericArgs(dart.unwrapType(_cls));
     if (typeArgs == null) {
       _typeArguments = const [];
@@ -373,7 +373,7 @@
     var cls = dart.unwrapType(_cls);
     var ctr = JS('', '#.#', cls, name);
     // Only generative Dart constructors are wired up as real JS constructors.
-    var instance = JS('bool', '#.prototype == #.prototype', cls, ctr)
+    var instance = JS<bool>('!', '#.prototype == #.prototype', cls, ctr)
         // Generative
         ? JS('', 'new #(...#)', ctr, args)
         // Factory
@@ -444,7 +444,7 @@
       return null;
     } else {
       return reflectType(
-          dart.wrapType(JS('Type', '#.__proto__', dart.unwrapType(_cls))));
+          dart.wrapType(JS<Type>('!', '#.__proto__', dart.unwrapType(_cls))));
     }
   }
 
@@ -489,7 +489,7 @@
   JsVariableMirror._fromField(Symbol symbol, fieldInfo)
       : this._(symbol, dart.wrapType(JS('', '#.type', fieldInfo)),
             JS('', '#.metadata', fieldInfo),
-            isFinal: JS('bool', '#.isFinal', fieldInfo));
+            isFinal: JS<bool>('!', '#.isFinal', fieldInfo));
 
   String toString() => "VariableMirror on '$_name'";
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
index 2a1fb74..5f8c7e0 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_number.dart
@@ -40,23 +40,24 @@
   bool get isNegative => (this == 0) ? (1 / this) < 0 : this < 0;
 
   @notNull
-  bool get isNaN => JS('bool', r'isNaN(#)', this);
+  bool get isNaN => JS<bool>('!', r'isNaN(#)', this);
 
   @notNull
   bool get isInfinite {
-    return JS('bool', r'# == (1/0)', this) || JS('bool', r'# == (-1/0)', this);
+    return JS<bool>('!', r'# == (1/0)', this) ||
+        JS<bool>('!', r'# == (-1/0)', this);
   }
 
   @notNull
-  bool get isFinite => JS('bool', r'isFinite(#)', this);
+  bool get isFinite => JS<bool>('!', r'isFinite(#)', this);
 
   @notNull
   JSNumber remainder(@nullCheck num b) {
-    return JS('num', r'# % #', this, b);
+    return JS<num>('!', r'# % #', this, b);
   }
 
   @notNull
-  JSNumber abs() => JS('num', r'Math.abs(#)', this);
+  JSNumber abs() => JS<num>('!', r'Math.abs(#)', this);
 
   @notNull
   JSNumber get sign => this > 0 ? 1 : this < 0 ? -1 : this;
@@ -69,10 +70,11 @@
   @notNull
   int toInt() {
     if (this >= _MIN_INT32 && this <= _MAX_INT32) {
-      return JS('int', '# | 0', this);
+      return JS<int>('!', '# | 0', this);
     }
-    if (JS('bool', r'isFinite(#)', this)) {
-      return JS('int', r'# + 0', truncateToDouble()); // Converts -0.0 to +0.0.
+    if (JS<bool>('!', r'isFinite(#)', this)) {
+      return JS<int>(
+          '!', r'# + 0', truncateToDouble()); // Converts -0.0 to +0.0.
     }
     // This is either NaN, Infinity or -Infinity.
     throw UnsupportedError(JS("String", '"" + #', this));
@@ -92,33 +94,33 @@
     if (this > 0) {
       // This path excludes the special cases -0.0, NaN and -Infinity, leaving
       // only +Infinity, for which a direct test is faster than [isFinite].
-      if (JS('bool', r'# !== (1/0)', this)) {
-        return JS('int', r'Math.round(#)', this);
+      if (JS<bool>('!', r'# !== (1/0)', this)) {
+        return JS<int>('!', r'Math.round(#)', this);
       }
-    } else if (JS('bool', '# > (-1/0)', this)) {
+    } else if (JS<bool>('!', '# > (-1/0)', this)) {
       // This test excludes NaN and -Infinity, leaving only -0.0.
       //
       // Subtraction from zero rather than negation forces -0.0 to 0.0 so code
       // inside Math.round and code to handle result never sees -0.0, which on
       // some JavaScript VMs can be a slow path.
-      return JS('int', r'0 - Math.round(0 - #)', this);
+      return JS<int>('!', r'0 - Math.round(0 - #)', this);
     }
     // This is either NaN, Infinity or -Infinity.
     throw UnsupportedError(JS("String", '"" + #', this));
   }
 
   @notNull
-  double ceilToDouble() => JS('num', r'Math.ceil(#)', this);
+  double ceilToDouble() => JS<num>('!', r'Math.ceil(#)', this);
 
   @notNull
-  double floorToDouble() => JS('num', r'Math.floor(#)', this);
+  double floorToDouble() => JS<num>('!', r'Math.floor(#)', this);
 
   @notNull
   double roundToDouble() {
     if (this < 0) {
-      return JS('num', r'-Math.round(-#)', this);
+      return JS<num>('!', r'-Math.round(-#)', this);
     } else {
-      return JS('num', r'Math.round(#)', this);
+      return JS<num>('!', r'Math.round(#)', this);
     }
   }
 
@@ -143,7 +145,7 @@
     if (fractionDigits < 0 || fractionDigits > 20) {
       throw RangeError.range(fractionDigits, 0, 20, "fractionDigits");
     }
-    String result = JS('String', r'#.toFixed(#)', this, fractionDigits);
+    String result = JS<String>('!', r'#.toFixed(#)', this, fractionDigits);
     if (this == 0 && isNegative) return "-$result";
     return result;
   }
@@ -157,9 +159,9 @@
       if (_fractionDigits < 0 || _fractionDigits > 20) {
         throw RangeError.range(_fractionDigits, 0, 20, "fractionDigits");
       }
-      result = JS('String', r'#.toExponential(#)', this, _fractionDigits);
+      result = JS<String>('!', r'#.toExponential(#)', this, _fractionDigits);
     } else {
-      result = JS('String', r'#.toExponential()', this);
+      result = JS<String>('!', r'#.toExponential()', this);
     }
     if (this == 0 && isNegative) return "-$result";
     return result;
@@ -170,7 +172,7 @@
     if (precision < 1 || precision > 21) {
       throw RangeError.range(precision, 1, 21, "precision");
     }
-    String result = JS('String', r'#.toPrecision(#)', this, precision);
+    String result = JS<String>('!', r'#.toPrecision(#)', this, precision);
     if (this == 0 && isNegative) return "-$result";
     return result;
   }
@@ -180,7 +182,7 @@
     if (radix < 2 || radix > 36) {
       throw RangeError.range(radix, 2, 36, "radix");
     }
-    String result = JS('String', r'#.toString(#)', this, radix);
+    String result = JS<String>('!', r'#.toString(#)', this, radix);
     const int rightParenCode = 0x29;
     if (result.codeUnitAt(result.length - 1) != rightParenCode) {
       return result;
@@ -210,16 +212,16 @@
   // Note: if you change this, also change the function [S].
   @notNull
   String toString() {
-    if (this == 0 && JS('bool', '(1 / #) < 0', this)) {
+    if (this == 0 && JS<bool>('!', '(1 / #) < 0', this)) {
       return '-0.0';
     } else {
-      return JS('String', r'"" + (#)', this);
+      return JS<String>('!', r'"" + (#)', this);
     }
   }
 
   @notNull
   int get hashCode {
-    int intValue = JS('int', '# | 0', this);
+    int intValue = JS<int>('!', '# | 0', this);
     // Fast exit for integers in signed 32-bit range. Masking converts -0.0 to 0
     // and ensures that result fits in JavaScript engine's Smi range.
     if (this == intValue) return 0x1FFFFFFF & intValue;
@@ -227,12 +229,12 @@
     // We would like to access the exponent and mantissa as integers but there
     // are no JavaScript operations that do this, so use log2-floor-pow-divide
     // to extract the values.
-    num absolute = JS('num', 'Math.abs(#)', this);
-    num lnAbsolute = JS('num', 'Math.log(#)', absolute);
+    num absolute = JS<num>('!', 'Math.abs(#)', this);
+    num lnAbsolute = JS<num>('!', 'Math.log(#)', absolute);
     num log2 = lnAbsolute / ln2;
     // Floor via '# | 0' converts NaN to zero so the final result is not NaN.
-    int floorLog2 = JS('int', '# | 0', log2);
-    num factor = JS('num', 'Math.pow(2, #)', floorLog2);
+    int floorLog2 = JS<int>('!', '# | 0', log2);
+    num factor = JS<num>('!', 'Math.pow(2, #)', floorLog2);
     num scaled = absolute < 1 ? absolute / factor : factor / absolute;
     // [scaled] is in the range [0.5, 1].
 
@@ -245,8 +247,8 @@
     // all over the mantissa into low positions.
     num rescaled1 = scaled * 0x20000000000000;
     num rescaled2 = scaled * 0x0C95A6C285A6C9;
-    int d1 = JS('int', '# | 0', rescaled1);
-    int d2 = JS('int', '# | 0', rescaled2);
+    int d1 = JS<int>('!', '# | 0', rescaled1);
+    int d2 = JS<int>('!', '# | 0', rescaled2);
     // Mix in exponent to distinguish e.g. 1.25 from 2.5.
     int d3 = floorLog2;
     int h = 0x1FFFFFFF & ((d1 + d2) * (601 * 997) + d3 * (1259));
@@ -254,49 +256,49 @@
   }
 
   @notNull
-  JSNumber operator -() => JS('num', r'-#', this);
+  JSNumber operator -() => JS<num>('!', r'-#', this);
 
   @notNull
   JSNumber operator +(@nullCheck num other) {
-    return JS('num', '# + #', this, other);
+    return JS<num>('!', '# + #', this, other);
   }
 
   @notNull
   JSNumber operator -(@nullCheck num other) {
-    return JS('num', '# - #', this, other);
+    return JS<num>('!', '# - #', this, other);
   }
 
   @notNull
   double operator /(@nullCheck num other) {
-    return JS('num', '# / #', this, other);
+    return JS<num>('!', '# / #', this, other);
   }
 
   @notNull
   JSNumber operator *(@nullCheck num other) {
-    return JS('num', '# * #', this, other);
+    return JS<num>('!', '# * #', this, other);
   }
 
   @notNull
   JSNumber operator %(@nullCheck num other) {
     // Euclidean Modulo.
-    num result = JS('num', r'# % #', this, other);
+    num result = JS<num>('!', r'# % #', this, other);
     if (result == 0) return (0 as JSNumber); // Make sure we don't return -0.0.
     if (result > 0) return result;
-    if (JS('num', '#', other) < 0) {
-      return result - JS('num', '#', other);
+    if (JS<num>('!', '#', other) < 0) {
+      return result - JS<num>('!', '#', other);
     } else {
-      return result + JS('num', '#', other);
+      return result + JS<num>('!', '#', other);
     }
   }
 
   @notNull
   bool _isInt32(@notNull num value) =>
-      JS('bool', '(# | 0) === #', value, value);
+      JS<bool>('!', '(# | 0) === #', value, value);
 
   @notNull
   int operator ~/(@nullCheck num other) {
     if (_isInt32(this) && _isInt32(other) && 0 != other && -1 != other) {
-      return JS('int', r'(# / #) | 0', this, other);
+      return JS<int>('!', r'(# / #) | 0', this, other);
     } else {
       return _tdivSlow(other);
     }
@@ -304,7 +306,7 @@
 
   @notNull
   int _tdivSlow(num other) {
-    return (JS('num', r'# / #', this, other)).toInt();
+    return (JS<num>('!', r'# / #', this, other)).toInt();
   }
 
   // TODO(ngeoffray): Move the bit operations below to [JSInt] and
@@ -322,31 +324,31 @@
   int _shlPositive(@notNull num other) {
     // JavaScript only looks at the last 5 bits of the shift-amount. Shifting
     // by 33 is hence equivalent to a shift by 1.
-    return JS('bool', r'# > 31', other)
+    return JS<bool>('!', r'# > 31', other)
         ? 0
-        : JS('int', r'(# << #) >>> 0', this, other);
+        : JS<int>('!', r'(# << #) >>> 0', this, other);
   }
 
   @notNull
   int operator >>(@nullCheck num other) {
-    if (JS('num', '#', other) < 0) throwArgumentErrorValue(other);
+    if (JS<num>('!', '#', other) < 0) throwArgumentErrorValue(other);
     return _shrOtherPositive(other);
   }
 
   @notNull
   int _shrOtherPositive(@notNull num other) {
-    return JS('num', '#', this) > 0
+    return JS<num>('!', '#', this) > 0
         ? _shrBothPositive(other)
         // For negative numbers we just clamp the shift-by amount.
         // `this` could be negative but not have its 31st bit set.
         // The ">>" would then shift in 0s instead of 1s. Therefore
         // we cannot simply return 0xFFFFFFFF.
-        : JS('int', r'(# >> #) >>> 0', this, other > 31 ? 31 : other);
+        : JS<int>('!', r'(# >> #) >>> 0', this, other > 31 ? 31 : other);
   }
 
   @notNull
   int _shrBothPositive(@notNull num other) {
-    return JS('bool', r'# > 31', other)
+    return JS<bool>('!', r'# > 31', other)
         // JavaScript only looks at the last 5 bits of the shift-amount. In JS
         // shifting by 33 is hence equivalent to a shift by 1. Shortcut the
         // computation when that happens.
@@ -354,42 +356,42 @@
         // Given that `this` is positive we must not use '>>'. Otherwise a
         // number that has the 31st bit set would be treated as negative and
         // shift in ones.
-        : JS('int', r'# >>> #', this, other);
+        : JS<int>('!', r'# >>> #', this, other);
   }
 
   @notNull
   int operator &(@nullCheck num other) {
-    return JS('int', r'(# & #) >>> 0', this, other);
+    return JS<int>('!', r'(# & #) >>> 0', this, other);
   }
 
   @notNull
   int operator |(@nullCheck num other) {
-    return JS('int', r'(# | #) >>> 0', this, other);
+    return JS<int>('!', r'(# | #) >>> 0', this, other);
   }
 
   @notNull
   int operator ^(@nullCheck num other) {
-    return JS('int', r'(# ^ #) >>> 0', this, other);
+    return JS<int>('!', r'(# ^ #) >>> 0', this, other);
   }
 
   @notNull
   bool operator <(@nullCheck num other) {
-    return JS('bool', '# < #', this, other);
+    return JS<bool>('!', '# < #', this, other);
   }
 
   @notNull
   bool operator >(@nullCheck num other) {
-    return JS('bool', '# > #', this, other);
+    return JS<bool>('!', '# > #', this, other);
   }
 
   @notNull
   bool operator <=(@nullCheck num other) {
-    return JS('bool', '# <= #', this, other);
+    return JS<bool>('!', '# <= #', this, other);
   }
 
   @notNull
   bool operator >=(@nullCheck num other) {
-    return JS('bool', '# >= #', this, other);
+    return JS<bool>('!', '# >= #', this, other);
   }
 
   // int members.
@@ -437,6 +439,30 @@
     if (e < 0) throw RangeError.range(e, 0, null, "exponent");
     if (m <= 0) throw RangeError.range(m, 1, null, "modulus");
     if (e == 0) return 1;
+
+    const int maxPreciseInteger = 9007199254740991;
+
+    // Reject inputs that are outside the range of integer values that can be
+    // represented precisely as a Number (double).
+    if (this < -maxPreciseInteger || this > maxPreciseInteger) {
+      throw RangeError.range(
+          this, -maxPreciseInteger, maxPreciseInteger, 'receiver');
+    }
+    if (e > maxPreciseInteger) {
+      throw RangeError.range(e, 0, maxPreciseInteger, 'exponent');
+    }
+    if (m > maxPreciseInteger) {
+      throw RangeError.range(e, 1, maxPreciseInteger, 'modulus');
+    }
+
+    // This is floor(sqrt(maxPreciseInteger)).
+    const int maxValueThatCanBeSquaredWithoutTruncation = 94906265;
+    if (m > maxValueThatCanBeSquaredWithoutTruncation) {
+      // Use BigInt version to avoid truncation in multiplications below. The
+      // 'maxPreciseInteger' check on [m] ensures that toInt() does not round.
+      return BigInt.from(this).modPow(BigInt.from(e), BigInt.from(m)).toInt();
+    }
+
     int b = this;
     if (b < 0 || b > m) {
       b %= m;
@@ -577,11 +603,13 @@
   }
 
   @notNull
-  static int _shru(int value, int shift) => JS('int', '# >>> #', value, shift);
+  static int _shru(int value, int shift) =>
+      JS<int>('!', '# >>> #', value, shift);
   @notNull
-  static int _shrs(int value, int shift) => JS('int', '# >> #', value, shift);
+  static int _shrs(int value, int shift) =>
+      JS<int>('!', '# >> #', value, shift);
   @notNull
-  static int _ors(int a, int b) => JS('int', '# | #', a, b);
+  static int _ors(int a, int b) => JS<int>('!', '# | #', a, b);
 
   // Assumes i is <= 32-bit
   @notNull
@@ -595,5 +623,5 @@
   }
 
   @notNull
-  int operator ~() => JS('int', r'(~#) >>> 0', this);
+  int operator ~() => JS<int>('!', r'(~#) >>> 0', this);
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_primitives.dart b/sdk/lib/_internal/js_dev_runtime/private/js_primitives.dart
index 40c451c..1347b62 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_primitives.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_primitives.dart
@@ -18,26 +18,26 @@
  * to print ends in this method.
  */
 void printString(String string) {
-  if (JS('bool', r'typeof dartPrint == "function"')) {
+  if (JS<bool>('!', r'typeof dartPrint == "function"')) {
     // Support overriding print from JavaScript.
     JS('void', r'dartPrint(#)', string);
     return;
   }
 
   // Inside browser or nodejs.
-  if (JS('bool', r'typeof console == "object"') &&
-      JS('bool', r'typeof console.log != "undefined"')) {
+  if (JS<bool>('!', r'typeof console == "object"') &&
+      JS<bool>('!', r'typeof console.log != "undefined"')) {
     JS('void', r'console.log(#)', string);
     return;
   }
 
   // Don't throw inside IE, the console is only defined if dev tools is open.
-  if (JS('bool', r'typeof window == "object"')) {
+  if (JS<bool>('!', r'typeof window == "object"')) {
     return;
   }
 
   // Running in d8, the V8 developer shell, or in Firefox' js-shell.
-  if (JS('bool', r'typeof print == "function"')) {
+  if (JS<bool>('!', r'typeof print == "function"')) {
     JS('void', r'print(#)', string);
     return;
   }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_rti.dart b/sdk/lib/_internal/js_dev_runtime/private/js_rti.dart
index 549cd33..015c83e 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_rti.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_rti.dart
@@ -18,7 +18,7 @@
 /// Returns the length of the JavaScript array [array].
 int getLength(var array) {
   assert(isJsArray(array));
-  return JS('int', r'#.length', array);
+  return JS<int>('!', r'#.length', array);
 }
 
 /// Returns whether [value] is a JavaScript array.
diff --git a/sdk/lib/_internal/js_dev_runtime/private/js_string.dart b/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
index 6f2c382..4271d34 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/js_string.dart
@@ -22,7 +22,7 @@
     if (index < 0 || index >= len) {
       throw RangeError.index(index, this, 'index', null, len);
     }
-    return JS('int', r'#.charCodeAt(#)', this, index);
+    return JS<int>('!', r'#.charCodeAt(#)', this, index);
   }
 
   @notNull
@@ -52,7 +52,7 @@
 
   @notNull
   String operator +(@nullCheck String other) {
-    return JS('String', r'# + #', this, other);
+    return JS<String>('!', r'# + #', this, other);
   }
 
   @notNull
@@ -148,16 +148,17 @@
   bool startsWith(Pattern pattern, [@nullCheck int index = 0]) {
     // Suppress null check on length and all but the first
     // reference to index.
-    int length = JS('int', '#.length', this);
-    if (index < 0 || JS('int', '#', index) > length) {
+    int length = JS<int>('!', '#.length', this);
+    if (index < 0 || JS<int>('!', '#', index) > length) {
       throw RangeError.range(index, 0, this.length);
     }
     if (pattern is String) {
       String other = pattern;
-      int otherLength = JS('int', '#.length', other);
+      int otherLength = JS<int>('!', '#.length', other);
       int endIndex = index + otherLength;
       if (endIndex > length) return false;
-      return other == JS('String', r'#.substring(#, #)', this, index, endIndex);
+      return other ==
+          JS<String>('!', r'#.substring(#, #)', this, index, endIndex);
     }
     return pattern.matchAsPrefix(this, index) != null;
   }
@@ -169,17 +170,17 @@
     if (startIndex < 0) throw RangeError.value(startIndex);
     if (startIndex > endIndex) throw RangeError.value(startIndex);
     if (endIndex > length) throw RangeError.value(endIndex);
-    return JS('String', r'#.substring(#, #)', this, startIndex, endIndex);
+    return JS<String>('!', r'#.substring(#, #)', this, startIndex, endIndex);
   }
 
   @notNull
   String toLowerCase() {
-    return JS('String', r'#.toLowerCase()', this);
+    return JS<String>('!', r'#.toLowerCase()', this);
   }
 
   @notNull
   String toUpperCase() {
-    return JS('String', r'#.toUpperCase()', this);
+    return JS<String>('!', r'#.toUpperCase()', this);
   }
 
   // Characters with Whitespace property (Unicode 6.3).
@@ -304,7 +305,7 @@
       endIndex = _skipTrailingWhitespace(result, endIndex - 1);
     }
     if (startIndex == 0 && endIndex == length) return result;
-    return JS('String', r'#.substring(#, #)', result, startIndex, endIndex);
+    return JS<String>('!', r'#.substring(#, #)', result, startIndex, endIndex);
   }
 
   // Dart2js can't use JavaScript trimLeft directly,
@@ -318,8 +319,8 @@
     // the beginning of the string.
     String result;
     int startIndex = 0;
-    if (JS('bool', 'typeof #.trimLeft != "undefined"', this)) {
-      result = JS('String', '#.trimLeft()', this);
+    if (JS<bool>('!', 'typeof #.trimLeft != "undefined"', this)) {
+      result = JS<String>('!', '#.trimLeft()', this);
       if (result.length == 0) return result;
       int firstCode = result.codeUnitAt(0);
       if (firstCode == NEL) {
@@ -331,7 +332,7 @@
     }
     if (startIndex == 0) return result;
     if (startIndex == result.length) return "";
-    return JS('String', r'#.substring(#)', result, startIndex);
+    return JS<String>('!', r'#.substring(#)', result, startIndex);
   }
 
   // Dart2js can't use JavaScript trimRight directly,
@@ -348,8 +349,8 @@
     int endIndex = 0;
     // trimRight is implemented by Firefox and Chrome/Blink,
     // so use it if it is there.
-    if (JS('bool', 'typeof #.trimRight != "undefined"', this)) {
-      result = JS('String', '#.trimRight()', this);
+    if (JS<bool>('!', 'typeof #.trimRight != "undefined"', this)) {
+      result = JS<String>('!', '#.trimRight()', this);
       endIndex = result.length;
       if (endIndex == 0) return result;
       int lastCode = result.codeUnitAt(endIndex - 1);
@@ -363,14 +364,14 @@
 
     if (endIndex == result.length) return result;
     if (endIndex == 0) return "";
-    return JS('String', r'#.substring(#, #)', result, 0, endIndex);
+    return JS<String>('!', r'#.substring(#, #)', result, 0, endIndex);
   }
 
   @notNull
   String operator *(@nullCheck int times) {
     if (0 >= times) return '';
     if (times == 1 || this.length == 0) return this;
-    if (times != JS('int', '# >>> 0', times)) {
+    if (times != JS<int>('!', '# >>> 0', times)) {
       // times >= 2^32. We can't create a string that big.
       throw const OutOfMemoryError();
     }
@@ -378,7 +379,7 @@
     String s = this;
     while (true) {
       if (times & 1 == 1) result = s + result;
-      times = JS('int', '# >>> 1', times);
+      times = JS<int>('!', '# >>> 1', times);
       if (times == 0) break;
       s += s;
     }
@@ -461,7 +462,7 @@
 
   @notNull
   int compareTo(@nullCheck String other) {
-    return this == other ? 0 : JS('bool', r'# < #', this, other) ? -1 : 1;
+    return this == other ? 0 : JS<bool>('!', r'# < #', this, other) ? -1 : 1;
   }
 
   // Note: if you change this, also change the function [S].
@@ -483,10 +484,10 @@
     for (int i = 0; i < length; i++) {
       hash = 0x1fffffff & (hash + JS<int>('!', r'#.charCodeAt(#)', this, i));
       hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
-      hash = JS('int', '# ^ (# >> 6)', hash, hash);
+      hash = JS<int>('!', '# ^ (# >> 6)', hash, hash);
     }
     hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
-    hash = JS('int', '# ^ (# >> 11)', hash, hash);
+    hash = JS<int>('!', '# ^ (# >> 11)', hash, hash);
     return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
   }
 
@@ -498,9 +499,9 @@
 
   @notNull
   String operator [](@nullCheck int index) {
-    if (index >= JS('int', '#.length', this) || index < 0) {
+    if (index >= JS<int>('!', '#.length', this) || index < 0) {
       throw diagnoseIndexError(this, index);
     }
-    return JS('String', '#[#]', this, index);
+    return JS<String>('!', '#[#]', this, index);
   }
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart b/sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart
index f3bbaad..1c03db8 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/linked_hash_map.dart
@@ -73,8 +73,8 @@
       V value = JS('', '#[#]', entries, i + 1);
       if (key == null) {
         key = null;
-      } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
-          dart.identityEquals)) {
+      } else if (JS<bool>('!', '#[#] !== #', key,
+          dart.extensionSymbol('_equals'), dart.identityEquals)) {
         key = putLinkedMapKey(key, keyMap);
       }
       JS('', '#.set(#, #)', map, key, value);
@@ -85,10 +85,10 @@
   int get length => JS<int>('!', '#.size', _map);
 
   @notNull
-  bool get isEmpty => JS('bool', '#.size == 0', _map);
+  bool get isEmpty => JS<bool>('!', '#.size == 0', _map);
 
   @notNull
-  bool get isNotEmpty => JS('bool', '#.size != 0', _map);
+  bool get isNotEmpty => JS<bool>('!', '#.size != 0', _map);
 
   Iterable<K> get keys => _JSMapIterable<K>(this, true);
   Iterable<V> get values => _JSMapIterable<V>(this, false);
@@ -97,7 +97,7 @@
   bool containsKey(Object key) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -110,7 +110,7 @@
       }
       return false;
     }
-    return JS('bool', '#.has(#)', _map, key);
+    return JS<bool>('!', '#.has(#)', _map, key);
   }
 
   bool containsValue(Object value) {
@@ -126,8 +126,8 @@
     other.forEach((K key, V value) {
       if (key == null) {
         key = null;
-      } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
-          dart.identityEquals)) {
+      } else if (JS<bool>('!', '#[#] !== #', key,
+          dart.extensionSymbol('_equals'), dart.identityEquals)) {
         key = putLinkedMapKey(key, _keyMap);
       }
       JS('', '#.set(#, #)', _map, key, value);
@@ -140,7 +140,7 @@
   V operator [](Object key) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -160,7 +160,7 @@
   void operator []=(K key, V value) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       key = putLinkedMapKey(key, _keyMap);
     }
@@ -176,8 +176,8 @@
     var map = _map;
     if (key == null) {
       key = null;
-      if (JS('bool', '#.has(null)', map)) return JS('', '#.get(null)', map);
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+      if (JS<bool>('!', '#.has(null)', map)) return JS('', '#.get(null)', map);
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       K k = key;
@@ -192,7 +192,7 @@
         }
         JS('', '#.push(#)', buckets, key);
       }
-    } else if (JS('bool', '#.has(#)', map, key)) {
+    } else if (JS<bool>('!', '#.has(#)', map, key)) {
       return JS('', '#.get(#)', map, key);
     }
     V value = ifAbsent();
@@ -205,7 +205,7 @@
   V remove(Object key) {
     if (key == null) {
       key = null;
-    } else if (JS('bool', '#[#] !== #', key, dart.extensionSymbol('_equals'),
+    } else if (JS<bool>('!', '#[#] !== #', key, dart.extensionSymbol('_equals'),
         dart.identityEquals)) {
       @notNull
       var k = key;
@@ -228,7 +228,7 @@
     }
     var map = _map;
     V value = JS('', '#.get(#)', map, key);
-    if (JS('bool', '#.delete(#)', map, key)) {
+    if (JS<bool>('!', '#.delete(#)', map, key)) {
       _modifications = (_modifications + 1) & 0x3ffffff;
     }
     return value == null ? null : value; // coerce undefined to null.
diff --git a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
index 5947ad1..2a7a621 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/native_typed_data.dart
@@ -366,8 +366,8 @@
   }
 
   void _checkPosition(int position, int length, String name) {
-    if (JS('bool', '(# >>> 0) !== #', position, position) ||
-        JS('int', '#', position) > length) {
+    if (JS<bool>('!', '(# >>> 0) !== #', position, position) ||
+        JS<int>('!', '#', position) > length) {
       // 'int' guaranteed by above test.
       _invalidPosition(position, length, name);
     }
@@ -768,11 +768,11 @@
 
 abstract class NativeTypedArrayOfDouble extends NativeTypedArray
     with ListMixin<double>, FixedLengthListMixin<double> {
-  int get length => JS('int', '#.length', this);
+  int get length => JS<int>('!', '#.length', this);
 
   double operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('double', '#[#]', this, index);
+    return JS<double>('!', '#[#]', this, index);
   }
 
   void operator []=(int index, num value) {
@@ -793,7 +793,7 @@
 abstract class NativeTypedArrayOfInt extends NativeTypedArray
     with ListMixin<int>, FixedLengthListMixin<int>
     implements List<int> {
-  int get length => JS('int', '#.length', this);
+  int get length => JS<int>('!', '#.length', this);
 
   // operator[]() is not here since different versions have different return
   // types
@@ -833,18 +833,19 @@
 
   Float32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end);
+    var source =
+        JS<NativeFloat32List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeFloat32List _create1(arg) =>
-      JS('NativeFloat32List', 'new Float32Array(#)', arg);
+      JS<NativeFloat32List>('!', 'new Float32Array(#)', arg);
 
   static NativeFloat32List _create2(arg1, arg2) =>
-      JS('NativeFloat32List', 'new Float32Array(#, #)', arg1, arg2);
+      JS<NativeFloat32List>('!', 'new Float32Array(#, #)', arg1, arg2);
 
   static NativeFloat32List _create3(arg1, arg2, arg3) =>
-      JS('NativeFloat32List', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeFloat32List>('!', 'new Float32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 @Native("Float64Array")
@@ -900,7 +901,7 @@
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Int16List sublist(int start, [int end]) {
@@ -938,23 +939,23 @@
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Int32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeInt32List', '#.subarray(#, #)', this, start, end);
+    var source = JS<NativeInt32List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeInt32List _create1(arg) =>
-      JS('NativeInt32List', 'new Int32Array(#)', arg);
+      JS<NativeInt32List>('!', 'new Int32Array(#)', arg);
 
   static NativeInt32List _create2(arg1, arg2) =>
-      JS('NativeInt32List', 'new Int32Array(#, #)', arg1, arg2);
+      JS<NativeInt32List>('!', 'new Int32Array(#, #)', arg1, arg2);
 
   static NativeInt32List _create3(arg1, arg2, arg3) =>
-      JS('NativeInt32List', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeInt32List>('!', 'new Int32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 @Native("Int8Array")
@@ -976,23 +977,23 @@
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Int8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeInt8List', '#.subarray(#, #)', this, start, end);
+    var source = JS<NativeInt8List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeInt8List _create1(arg) =>
-      JS('NativeInt8List', 'new Int8Array(#)', arg);
+      JS<NativeInt8List>('!', 'new Int8Array(#)', arg);
 
   static NativeInt8List _create2(arg1, arg2) =>
-      JS('NativeInt8List', 'new Int8Array(#, #)', arg1, arg2);
+      JS<NativeInt8List>('!', 'new Int8Array(#, #)', arg1, arg2);
 
   static Int8List _create3(arg1, arg2, arg3) =>
-      JS('NativeInt8List', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeInt8List>('!', 'new Int8Array(#, #, #)', arg1, arg2, arg3);
 }
 
 @Native("Uint16Array")
@@ -1014,23 +1015,24 @@
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Uint16List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeUint16List', '#.subarray(#, #)', this, start, end);
+    var source =
+        JS<NativeUint16List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeUint16List _create1(arg) =>
-      JS('NativeUint16List', 'new Uint16Array(#)', arg);
+      JS<NativeUint16List>('!', 'new Uint16Array(#)', arg);
 
   static NativeUint16List _create2(arg1, arg2) =>
-      JS('NativeUint16List', 'new Uint16Array(#, #)', arg1, arg2);
+      JS<NativeUint16List>('!', 'new Uint16Array(#, #)', arg1, arg2);
 
   static NativeUint16List _create3(arg1, arg2, arg3) =>
-      JS('NativeUint16List', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeUint16List>('!', 'new Uint16Array(#, #, #)', arg1, arg2, arg3);
 }
 
 @Native("Uint32Array")
@@ -1052,23 +1054,24 @@
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Uint32List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeUint32List', '#.subarray(#, #)', this, start, end);
+    var source =
+        JS<NativeUint32List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeUint32List _create1(arg) =>
-      JS('NativeUint32List', 'new Uint32Array(#)', arg);
+      JS<NativeUint32List>('!', 'new Uint32Array(#)', arg);
 
   static NativeUint32List _create2(arg1, arg2) =>
-      JS('NativeUint32List', 'new Uint32Array(#, #)', arg1, arg2);
+      JS<NativeUint32List>('!', 'new Uint32Array(#, #)', arg1, arg2);
 
   static NativeUint32List _create3(arg1, arg2, arg3) =>
-      JS('NativeUint32List', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeUint32List>('!', 'new Uint32Array(#, #, #)', arg1, arg2, arg3);
 }
 
 @Native("Uint8ClampedArray,CanvasPixelArray")
@@ -1089,25 +1092,26 @@
 
   Type get runtimeType => Uint8ClampedList;
 
-  int get length => JS('int', '#.length', this);
+  int get length => JS<int>('!', '#.length', this);
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Uint8ClampedList sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
     var source =
-        JS('NativeUint8ClampedList', '#.subarray(#, #)', this, start, end);
+        JS<NativeUint8ClampedList>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeUint8ClampedList _create1(arg) =>
-      JS('NativeUint8ClampedList', 'new Uint8ClampedArray(#)', arg);
+      JS<NativeUint8ClampedList>('!', 'new Uint8ClampedArray(#)', arg);
 
   static NativeUint8ClampedList _create2(arg1, arg2) =>
-      JS('NativeUint8ClampedList', 'new Uint8ClampedArray(#, #)', arg1, arg2);
+      JS<NativeUint8ClampedList>(
+          '!', 'new Uint8ClampedArray(#, #)', arg1, arg2);
 
   static NativeUint8ClampedList _create3(arg1, arg2, arg3) => JS(
       'NativeUint8ClampedList',
@@ -1138,27 +1142,27 @@
 
   Type get runtimeType => Uint8List;
 
-  int get length => JS('int', '#.length', this);
+  int get length => JS<int>('!', '#.length', this);
 
   int operator [](int index) {
     _checkValidIndex(index, this, this.length);
-    return JS('int', '#[#]', this, index);
+    return JS<int>('!', '#[#]', this, index);
   }
 
   Uint8List sublist(int start, [int end]) {
     end = _checkValidRange(start, end, this.length);
-    var source = JS('NativeUint8List', '#.subarray(#, #)', this, start, end);
+    var source = JS<NativeUint8List>('!', '#.subarray(#, #)', this, start, end);
     return _create1(source);
   }
 
   static NativeUint8List _create1(arg) =>
-      JS('NativeUint8List', 'new Uint8Array(#)', arg);
+      JS<NativeUint8List>('!', 'new Uint8Array(#)', arg);
 
   static NativeUint8List _create2(arg1, arg2) =>
-      JS('NativeUint8List', 'new Uint8Array(#, #)', arg1, arg2);
+      JS<NativeUint8List>('!', 'new Uint8Array(#, #)', arg1, arg2);
 
   static NativeUint8List _create3(arg1, arg2, arg3) =>
-      JS('NativeUint8List', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
+      JS<NativeUint8List>('!', 'new Uint8Array(#, #, #)', arg1, arg2, arg3);
 }
 
 /**
@@ -1867,14 +1871,14 @@
 /// Checks that the value is a Uint32. If not, it's not valid as an array
 /// index or offset. Also ensures that the value is non-negative.
 bool _isInvalidArrayIndex(int index) {
-  return (JS('bool', '(# >>> 0 !== #)', index, index));
+  return (JS<bool>('!', '(# >>> 0 !== #)', index, index));
 }
 
 /// Checks that [index] is a valid index into [list] which has length [length].
 ///
 /// That is, [index] is an integer in the range `0..length - 1`.
 void _checkValidIndex(int index, List list, int length) {
-  if (_isInvalidArrayIndex(index) || JS('int', '#', index) >= length) {
+  if (_isInvalidArrayIndex(index) || JS<int>('!', '#', index) >= length) {
     throw diagnoseIndexError(list, index);
   }
 }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/profile.dart b/sdk/lib/_internal/js_dev_runtime/private/profile.dart
index 2a8edbe..d46f7f7 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/profile.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/profile.dart
@@ -109,10 +109,10 @@
 
 // We need to set this property while the sdk is only partially initialized
 // so we cannot use a regular Dart field.
-bool get _trackProfile => JS('bool', 'dart.__trackProfile');
+bool get _trackProfile => JS<bool>('!', 'dart.__trackProfile');
 
 trackCall(obj) {
-  if (JS('bool', '!#', _trackProfile)) return;
+  if (JS<bool>('!', '!#', _trackProfile)) return;
   int index = -1;
   _totalCallRecords++;
   if (_callMethodRecords.length == _callRecordSampleSize) {
@@ -122,7 +122,7 @@
     // appropriate probability randomly evicting one of the existing records.
     // Unfortunately we can't use the excellent Random.nextInt method defined
     // by Dart from within this library.
-    index = JS('int', 'Math.floor(Math.random() * #)', _totalCallRecords);
+    index = JS<int>('!', 'Math.floor(Math.random() * #)', _totalCallRecords);
     if (index >= _callMethodRecords.length) return; // don't sample
   }
   var record =
diff --git a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
index 1c31a09..fadcda0 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/regexp_helper.dart
@@ -48,7 +48,7 @@
   var _nativeAnchoredRegExp;
 
   String toString() =>
-      'RegExp/$pattern/' + JS('String', '#.flags', _nativeRegExp);
+      'RegExp/$pattern/' + JS<String>('!', '#.flags', _nativeRegExp);
 
   JSSyntaxRegExp(String source,
       {bool multiLine = false,
@@ -106,10 +106,10 @@
         u,
         s,
         g);
-    if (JS('bool', '# instanceof RegExp', regexp)) return regexp;
+    if (JS<bool>('!', '# instanceof RegExp', regexp)) return regexp;
     // The returned value is the JavaScript exception. Turn it into a
     // Dart exception.
-    String errorMessage = JS('String', r'String(#)', regexp);
+    String errorMessage = JS<String>('!', r'String(#)', regexp);
     throw FormatException("Illegal RegExp pattern: $source, $errorMessage");
   }
 
@@ -121,7 +121,7 @@
 
   @notNull
   bool hasMatch(@nullCheck String string) {
-    return JS('bool', r'#.test(#)', _nativeRegExp, string);
+    return JS<bool>('!', r'#.test(#)', _nativeRegExp, string);
   }
 
   String stringMatch(String string) {
@@ -202,7 +202,7 @@
     var groups = JS('Object', '#.groups', _match);
     if (groups != null) {
       var result = JS('String|Null', '#[#]', groups, name);
-      if (result != null || JS('bool', '# in #', name, groups)) {
+      if (result != null || JS<bool>('!', '# in #', name, groups)) {
         return result;
       }
     }
diff --git a/sdk/lib/_internal/js_dev_runtime/private/string_helper.dart b/sdk/lib/_internal/js_dev_runtime/private/string_helper.dart
index aeb4e2f..c1b5c18 100644
--- a/sdk/lib/_internal/js_dev_runtime/private/string_helper.dart
+++ b/sdk/lib/_internal/js_dev_runtime/private/string_helper.dart
@@ -6,7 +6,7 @@
 
 @notNull
 int stringIndexOfStringUnchecked(receiver, other, startIndex) {
-  return JS('int', '#.indexOf(#, #)', receiver, other, startIndex);
+  return JS<int>('!', '#.indexOf(#, #)', receiver, other, startIndex);
 }
 
 @notNull
@@ -123,8 +123,8 @@
   // The JavaScript String.replace method recognizes replacement
   // patterns in the replacement string. Dart does not have that
   // behavior.
-  replacement = JS('String', r'#.replace(/\$/g, "$$$$")', replacement);
-  return JS('String', r'#.replace(#, #)', receiver, replacer, replacement);
+  replacement = JS<String>('!', r'#.replace(/\$/g, "$$$$")', replacement);
+  return JS<String>('!', r'#.replace(#, #)', receiver, replacer, replacement);
 }
 
 @notNull
@@ -141,7 +141,7 @@
 /// escaping all RegExp metacharacters.
 @notNull
 String quoteStringForRegExp(string) {
-  return JS('String', r'#.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&")', string);
+  return JS<String>('!', r'#.replace(/[[\]{}()*+?.\\^$|]/g, "\\$&")', string);
 }
 
 @notNull
@@ -162,7 +162,8 @@
         return result.toString();
       }
     } else {
-      return JS('String', '#.split(#).join(#)', receiver, pattern, replacement);
+      return JS<String>(
+          '!', '#.split(#).join(#)', receiver, pattern, replacement);
     }
   } else if (pattern is JSSyntaxRegExp) {
     var re = regExpGetGlobalNative(pattern);
@@ -284,7 +285,7 @@
 
 @notNull
 String stringJoinUnchecked(array, separator) {
-  return JS('String', r'#.join(#)', array, separator);
+  return JS<String>('!', r'#.join(#)', array, separator);
 }
 
 @notNull
diff --git a/sdk/lib/_internal/js_runtime/lib/core_patch.dart b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
index 5fc220c..c655fc2 100644
--- a/sdk/lib/_internal/js_runtime/lib/core_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/core_patch.dart
@@ -700,8 +700,8 @@
   static final bool _isWindowsCached = JS(
       'bool',
       'typeof process != "undefined" && '
-      'Object.prototype.toString.call(process) == "[object process]" && '
-      'process.platform == "win32"');
+          'Object.prototype.toString.call(process) == "[object process]" && '
+          'process.platform == "win32"');
 
   // Matches a String that _uriEncodes to itself regardless of the kind of
   // component.  This corresponds to [_unreservedTable], i.e. characters that
@@ -2511,7 +2511,7 @@
       dIsNegative = false;
     } else {
       while ((dDigits[maxUsed] != 0) ||
-        (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) >= 0)) {
+          (_compareDigits(dDigits, maxUsed, xDigits, maxUsed) >= 0)) {
         // d -= x
         _absSub(dDigits, abcdUsed, xDigits, maxUsed, dDigits);
       }
diff --git a/sdk/lib/_internal/js_runtime/lib/io_patch.dart b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
index b8619d1..4f3894d 100644
--- a/sdk/lib/_internal/js_runtime/lib/io_patch.dart
+++ b/sdk/lib/_internal/js_runtime/lib/io_patch.dart
@@ -546,7 +546,7 @@
 @patch
 class _SecureFilter {
   @patch
-  factory _SecureFilter() {
+  factory _SecureFilter._() {
     throw new UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
diff --git a/sdk/lib/_internal/js_runtime/lib/js_array.dart b/sdk/lib/_internal/js_runtime/lib/js_array.dart
index c6956d9..ff820d4 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_array.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_array.dart
@@ -97,15 +97,31 @@
     return JS('JSUnmodifiableArray', '#', list);
   }
 
-  checkMutable(reason) {
-    if (this is! JSMutableArray) {
-      throw new UnsupportedError(reason);
+  static bool isFixedLength(JSArray a) {
+    return !JS('bool', r'!#.fixed$length', a);
+  }
+
+  static bool isUnmodifiable(JSArray a) {
+    return !JS('bool', r'!#.immutable$list', a);
+  }
+
+  static bool isGrowable(JSArray a) {
+    return !isFixedLength(a);
+  }
+
+  static bool isMutable(JSArray a) {
+    return !isUnmodifiable(a);
+  }
+
+  checkMutable(String reason) {
+    if (!isMutable(this)) {
+      throw UnsupportedError(reason);
     }
   }
 
-  checkGrowable(reason) {
-    if (this is! JSExtendableArray) {
-      throw new UnsupportedError(reason);
+  checkGrowable(String reason) {
+    if (!isGrowable(this)) {
+      throw UnsupportedError(reason);
     }
   }
 
diff --git a/sdk/lib/_internal/js_runtime/lib/js_helper.dart b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
index 654019c..e83144b 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_helper.dart
@@ -59,7 +59,12 @@
         unmangleGlobalNameIfPreservedAnyways,
         unmangleAllIdentifiersIfPreservedAnyways;
 
-import 'dart:_rti' as newRti show createRuntimeType, getRuntimeType;
+import 'dart:_rti' as newRti
+    show
+        createRuntimeType,
+        evalInInstance,
+        getRuntimeType,
+        getTypeFromTypesTable;
 
 part 'annotations.dart';
 part 'constant_map.dart';
@@ -476,7 +481,7 @@
     if (!JS(
         'bool',
         r'/^\s*[+-]?(?:Infinity|NaN|'
-        r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
+            r'(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(#)',
         source)) {
       return null;
     }
@@ -729,15 +734,15 @@
         'JSArray|Null',
         // Thu followed by a space.
         r'/^[A-Z,a-z]{3}\s'
-        // Oct 31 followed by space.
-        r'[A-Z,a-z]{3}\s\d+\s'
-        // Time followed by a space.
-        r'\d{2}:\d{2}:\d{2}\s'
-        // The time zone name followed by a space.
-        r'([A-Z]{3,5})\s'
-        // The year.
-        r'\d{4}$/'
-        '.exec(#.toString())',
+            // Oct 31 followed by space.
+            r'[A-Z,a-z]{3}\s\d+\s'
+            // Time followed by a space.
+            r'\d{2}:\d{2}:\d{2}\s'
+            // The time zone name followed by a space.
+            r'([A-Z]{3,5})\s'
+            // The year.
+            r'\d{4}$/'
+            '.exec(#.toString())',
         d);
     if (match != null) return match[1];
 
@@ -1479,7 +1484,7 @@
     return JS(
         '',
         r'{ $method$: null, '
-        r'toString: function() { return "$receiver$"; } }');
+            r'toString: function() { return "$receiver$"; } }');
   }
 
   /// Extract a pattern from a JavaScript TypeError message.
@@ -1527,13 +1532,13 @@
     String pattern = JS(
         'String',
         r"#.replace(new RegExp('\\\\\\$arguments\\\\\\$', 'g'), "
-        r"'((?:x|[^x])*)')"
-        r".replace(new RegExp('\\\\\\$argumentsExpr\\\\\\$', 'g'),  "
-        r"'((?:x|[^x])*)')"
-        r".replace(new RegExp('\\\\\\$expr\\\\\\$', 'g'),  '((?:x|[^x])*)')"
-        r".replace(new RegExp('\\\\\\$method\\\\\\$', 'g'),  '((?:x|[^x])*)')"
-        r".replace(new RegExp('\\\\\\$receiver\\\\\\$', 'g'),  "
-        r"'((?:x|[^x])*)')",
+            r"'((?:x|[^x])*)')"
+            r".replace(new RegExp('\\\\\\$argumentsExpr\\\\\\$', 'g'),  "
+            r"'((?:x|[^x])*)')"
+            r".replace(new RegExp('\\\\\\$expr\\\\\\$', 'g'),  '((?:x|[^x])*)')"
+            r".replace(new RegExp('\\\\\\$method\\\\\\$', 'g'),  '((?:x|[^x])*)')"
+            r".replace(new RegExp('\\\\\\$receiver\\\\\\$', 'g'),  "
+            r"'((?:x|[^x])*)')",
         message);
 
     return new TypeErrorDecoder(
@@ -2038,8 +2043,12 @@
       // The functions are called here to model the calls from JS forms below.
       // The types in the JS forms in the arguments are propagated in type
       // inference.
-      BoundClosure.receiverOf(JS('BoundClosure', '0'));
-      BoundClosure.selfOf(JS('BoundClosure', '0'));
+      var aBoundClosure = JS('BoundClosure', '0');
+      var aString = JS('String', '0');
+      BoundClosure.receiverOf(aBoundClosure);
+      BoundClosure.selfOf(aBoundClosure);
+      BoundClosure.evalRecipeIntercepted(aBoundClosure, aString);
+      BoundClosure.evalRecipe(aBoundClosure, aString);
       getType(JS('int', '0'));
     });
     // TODO(ahe): All the place below using \$ should be rewritten to go
@@ -2098,7 +2107,7 @@
             : JS(
                 '',
                 'new Function("a,b,c,d" + #,'
-                ' "this.\$initialize(a,b,c,d" + # + ")")',
+                    ' "this.\$initialize(a,b,c,d" + # + ")")',
                 functionCounter,
                 functionCounter++);
 
@@ -2118,42 +2127,10 @@
           propertyName);
     }
 
-    var signatureFunction;
-    if (JS('bool', 'typeof # == "number"', functionType)) {
-      // We cannot call [getType] here, since the types-metadata might not be
-      // set yet. This is, because fromTearOff might be called for constants
-      // when the program isn't completely set up yet.
-      //
-      // Note that we cannot just textually inline the call
-      // `getType(functionType)` since we cannot guarantee that the (then)
-      // captured variable `functionType` isn't reused.
-      signatureFunction = JS(
-          '',
-          '''(function(getType, t) {
-                    return function(){ return getType(t); };
-                })(#, #)''',
-          RAW_DART_FUNCTION_REF(getType),
-          functionType);
-    } else if (JS('bool', 'typeof # == "function"', functionType)) {
-      if (isStatic) {
-        signatureFunction = functionType;
-      } else {
-        var getReceiver = isIntercepted
-            ? RAW_DART_FUNCTION_REF(BoundClosure.receiverOf)
-            : RAW_DART_FUNCTION_REF(BoundClosure.selfOf);
-        signatureFunction = JS(
-            '',
-            'function(f,r){'
-            'return function(){'
-            'return f.apply({\$receiver:r(this)},arguments)'
-            '}'
-            '}(#,#)',
-            functionType,
-            getReceiver);
-      }
-    } else {
-      throw 'Error in reflectionInfo.';
-    }
+    var signatureFunction = JS_GET_FLAG('USE_NEW_RTI')
+        ? _computeSignatureFunctionNewRti(functionType, isStatic, isIntercepted)
+        : _computeSignatureFunctionLegacy(
+            functionType, isStatic, isIntercepted);
 
     JS('', '#[#] = #', prototype, JS_GET_NAME(JsGetName.SIGNATURE_NAME),
         signatureFunction);
@@ -2183,6 +2160,83 @@
     return constructor;
   }
 
+  static _computeSignatureFunctionLegacy(
+      Object functionType, bool isStatic, bool isIntercepted) {
+    if (JS('bool', 'typeof # == "number"', functionType)) {
+      // We cannot call [getType] here, since the types-metadata might not be
+      // set yet. This is, because fromTearOff might be called for constants
+      // when the program isn't completely set up yet.
+      //
+      // Note that we cannot just textually inline the call
+      // `getType(functionType)` since we cannot guarantee that the (then)
+      // captured variable `functionType` isn't reused.
+      return JS(
+          '',
+          '''(function(getType, t) {
+                    return function(){ return getType(t); };
+                })(#, #)''',
+          RAW_DART_FUNCTION_REF(getType),
+          functionType);
+    }
+    if (JS('bool', 'typeof # == "function"', functionType)) {
+      if (isStatic) {
+        return functionType;
+      } else {
+        var getReceiver = isIntercepted
+            ? RAW_DART_FUNCTION_REF(BoundClosure.receiverOf)
+            : RAW_DART_FUNCTION_REF(BoundClosure.selfOf);
+        return JS(
+            '',
+            'function(f,r){'
+                'return function(){'
+                'return f.apply({\$receiver:r(this)},arguments)'
+                '}'
+                '}(#,#)',
+            functionType,
+            getReceiver);
+      }
+    }
+    throw 'Error in functionType of tearoff';
+  }
+
+  static _computeSignatureFunctionNewRti(
+      Object functionType, bool isStatic, bool isIntercepted) {
+    if (JS('bool', 'typeof # == "number"', functionType)) {
+      // Index into types table.
+      //
+      // We cannot call [getTypeFromTypesTable] here, since the types-metadata
+      // might not be set yet. This is, because fromTearOff might be called for
+      // constants when the program isn't completely set up yet. We also want to
+      // avoid creating lots of types at startup.
+      return JS(
+          '',
+          '''(function(getType, t) {
+                 return function(){ return getType(t); };
+             })(#, #)''',
+          RAW_DART_FUNCTION_REF(newRti.getTypeFromTypesTable),
+          functionType);
+    }
+    if (JS('bool', 'typeof # == "string"', functionType)) {
+      // A recipe to evaluate against the instance type.
+      if (isStatic) {
+        throw 'TODO: Recipe for static tearoff.';
+      }
+      var typeEvalMethod = isIntercepted
+          ? RAW_DART_FUNCTION_REF(BoundClosure.evalRecipeIntercepted)
+          : RAW_DART_FUNCTION_REF(BoundClosure.evalRecipe);
+      return JS(
+          '',
+          '    function(recipe, evalOnReceiver) {'
+              '  return function() {'
+              '    return evalOnReceiver(this, recipe);'
+              '  };'
+              '}(#,#)',
+          functionType,
+          typeEvalMethod);
+    }
+    throw 'Error in functionType of tearoff';
+  }
+
   static cspForwardCall(
       int arity, bool isSuperCall, String stubName, function) {
     var getSelf = RAW_DART_FUNCTION_REF(BoundClosure.selfOf);
@@ -2193,70 +2247,70 @@
         return JS(
             '',
             'function(n,S){'
-            'return function(){'
-            'return S(this)[n]()'
-            '}'
-            '}(#,#)',
+                'return function(){'
+                'return S(this)[n]()'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       case 1:
         return JS(
             '',
             'function(n,S){'
-            'return function(a){'
-            'return S(this)[n](a)'
-            '}'
-            '}(#,#)',
+                'return function(a){'
+                'return S(this)[n](a)'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       case 2:
         return JS(
             '',
             'function(n,S){'
-            'return function(a,b){'
-            'return S(this)[n](a,b)'
-            '}'
-            '}(#,#)',
+                'return function(a,b){'
+                'return S(this)[n](a,b)'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       case 3:
         return JS(
             '',
             'function(n,S){'
-            'return function(a,b,c){'
-            'return S(this)[n](a,b,c)'
-            '}'
-            '}(#,#)',
+                'return function(a,b,c){'
+                'return S(this)[n](a,b,c)'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       case 4:
         return JS(
             '',
             'function(n,S){'
-            'return function(a,b,c,d){'
-            'return S(this)[n](a,b,c,d)'
-            '}'
-            '}(#,#)',
+                'return function(a,b,c,d){'
+                'return S(this)[n](a,b,c,d)'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       case 5:
         return JS(
             '',
             'function(n,S){'
-            'return function(a,b,c,d,e){'
-            'return S(this)[n](a,b,c,d,e)'
-            '}'
-            '}(#,#)',
+                'return function(a,b,c,d,e){'
+                'return S(this)[n](a,b,c,d,e)'
+                '}'
+                '}(#,#)',
             stubName,
             getSelf);
       default:
         return JS(
             '',
             'function(f,s){'
-            'return function(){'
-            'return f.apply(s(this),arguments)'
-            '}'
-            '}(#,#)',
+                'return function(){'
+                'return f.apply(s(this),arguments)'
+                '}'
+                '}(#,#)',
             function,
             getSelf);
     }
@@ -2286,9 +2340,9 @@
           '',
           '(new Function(#))()',
           'return function(){'
-          'var $selfName = this.${BoundClosure.selfFieldName()};'
-          'return $selfName.$stubName();'
-          '}');
+              'var $selfName = this.${BoundClosure.selfFieldName()};'
+              'return $selfName.$stubName();'
+              '}');
     }
     assert(1 <= arity && arity < 27);
     String arguments = JS('String',
@@ -2298,8 +2352,8 @@
         '',
         '(new Function(#))()',
         'return function($arguments){'
-        'return this.${BoundClosure.selfFieldName()}.$stubName($arguments);'
-        '}');
+            'return this.${BoundClosure.selfFieldName()}.$stubName($arguments);'
+            '}');
   }
 
   static cspForwardInterceptedCall(
@@ -2317,10 +2371,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(){'
-            'return s(this)[n](r(this))'
-            '}'
-            '}(#,#,#)',
+                'return function(){'
+                'return s(this)[n](r(this))'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2328,10 +2382,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(a){'
-            'return s(this)[n](r(this),a)'
-            '}'
-            '}(#,#,#)',
+                'return function(a){'
+                'return s(this)[n](r(this),a)'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2339,10 +2393,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(a,b){'
-            'return s(this)[n](r(this),a,b)'
-            '}'
-            '}(#,#,#)',
+                'return function(a,b){'
+                'return s(this)[n](r(this),a,b)'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2350,10 +2404,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(a,b,c){'
-            'return s(this)[n](r(this),a,b,c)'
-            '}'
-            '}(#,#,#)',
+                'return function(a,b,c){'
+                'return s(this)[n](r(this),a,b,c)'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2361,10 +2415,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(a,b,c,d){'
-            'return s(this)[n](r(this),a,b,c,d)'
-            '}'
-            '}(#,#,#)',
+                'return function(a,b,c,d){'
+                'return s(this)[n](r(this),a,b,c,d)'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2372,10 +2426,10 @@
         return JS(
             '',
             'function(n,s,r){'
-            'return function(a,b,c,d,e){'
-            'return s(this)[n](r(this),a,b,c,d,e)'
-            '}'
-            '}(#,#,#)',
+                'return function(a,b,c,d,e){'
+                'return s(this)[n](r(this),a,b,c,d,e)'
+                '}'
+                '}(#,#,#)',
             name,
             getSelf,
             getReceiver);
@@ -2383,12 +2437,12 @@
         return JS(
             '',
             'function(f,s,r,a){'
-            'return function(){'
-            'a=[r(this)];'
-            'Array.prototype.push.apply(a,arguments);'
-            'return f.apply(s(this),a)'
-            '}'
-            '}(#,#,#)',
+                'return function(){'
+                'a=[r(this)];'
+                'Array.prototype.push.apply(a,arguments);'
+                'return f.apply(s(this),a)'
+                '}'
+                '}(#,#,#)',
             function,
             getSelf,
             getReceiver);
@@ -2416,9 +2470,9 @@
           '',
           '(new Function(#))()',
           'return function(){'
-          'return this.$selfField.$stubName(this.$receiverField);'
-          '${functionCounter++}'
-          '}');
+              'return this.$selfField.$stubName(this.$receiverField);'
+              '${functionCounter++}'
+              '}');
     }
     assert(1 < arity && arity < 28);
     String arguments = JS(
@@ -2429,9 +2483,9 @@
         '',
         '(new Function(#))()',
         'return function($arguments){'
-        'return this.$selfField.$stubName(this.$receiverField, $arguments);'
-        '${functionCounter++}'
-        '}');
+            'return this.$selfField.$stubName(this.$receiverField, $arguments);'
+            '${functionCounter++}'
+            '}');
   }
 
   // The backend adds a special getter of the form
@@ -2456,7 +2510,7 @@
   return Closure.fromTearOff(
       receiver,
       JS('JSArray', '#', functions),
-      applyTrampolineIndex,
+      JS('int|Null', '#', applyTrampolineIndex),
       reflectionInfo,
       JS('bool', '!!#', isStatic),
       JS('bool', '!!#', isIntercepted),
@@ -2528,6 +2582,14 @@
         "${Primitives.objectToHumanReadableString(receiver)}";
   }
 
+  static evalRecipe(BoundClosure closure, String recipe) {
+    return newRti.evalInInstance(closure._self, recipe);
+  }
+
+  static evalRecipeIntercepted(BoundClosure closure, String recipe) {
+    return newRti.evalInInstance(closure._receiver, recipe);
+  }
+
   @pragma('dart2js:noInline')
   static selfOf(BoundClosure closure) => closure._self;
 
@@ -3248,8 +3310,8 @@
     stack = JS(
         'String|Null',
         '(function() {'
-        'try { throw new Error() } catch(e) { return e.stack }'
-        '})()');
+            'try { throw new Error() } catch(e) { return e.stack }'
+            '})()');
     if (stack == null) throw new UnsupportedError('No stack trace');
   }
   var pattern, matches;
diff --git a/sdk/lib/_internal/js_runtime/lib/js_names.dart b/sdk/lib/_internal/js_runtime/lib/js_names.dart
index 1f1fec4..06b633a 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_names.dart
@@ -149,8 +149,8 @@
 /// *if* names are being preserved for other reasons (use of dart:mirrors, for
 /// example).
 String unmangleGlobalNameIfPreservedAnyways(String name) {
-  var names = JS_EMBEDDED_GLOBAL('=Object', MANGLED_GLOBAL_NAMES);
-  return JsCache.fetch(names, name);
+  var names = JS_EMBEDDED_GLOBAL('', MANGLED_GLOBAL_NAMES);
+  return JS('String|Null', '#', JsCache.fetch(names, name));
 }
 
 String unmangleAllIdentifiersIfPreservedAnyways(String str) {
diff --git a/sdk/lib/_internal/js_runtime/lib/js_number.dart b/sdk/lib/_internal/js_runtime/lib/js_number.dart
index 8e5dde1..918c1ba 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_number.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_number.dart
@@ -503,14 +503,38 @@
   // Returns pow(this, e) % m.
   int modPow(int e, int m) {
     if (e is! int) {
-      throw new ArgumentError.value(e, 'exponent', 'not an integer');
+      throw ArgumentError.value(e, 'exponent', 'not an integer');
     }
     if (m is! int) {
-      throw new ArgumentError.value(m, 'modulus', 'not an integer');
+      throw ArgumentError.value(m, 'modulus', 'not an integer');
     }
-    if (e < 0) throw new RangeError.range(e, 0, null, 'exponent');
-    if (m <= 0) throw new RangeError.range(m, 1, null, 'modulus');
+    if (e < 0) throw RangeError.range(e, 0, null, 'exponent');
+    if (m <= 0) throw RangeError.range(m, 1, null, 'modulus');
     if (e == 0) return 1;
+
+    const int maxPreciseInteger = 9007199254740991;
+
+    // Reject inputs that are outside the range of integer values that can be
+    // represented precisely as a Number (double).
+    if (this < -maxPreciseInteger || this > maxPreciseInteger) {
+      throw RangeError.range(
+          this, -maxPreciseInteger, maxPreciseInteger, 'receiver');
+    }
+    if (e > maxPreciseInteger) {
+      throw RangeError.range(e, 0, maxPreciseInteger, 'exponent');
+    }
+    if (m > maxPreciseInteger) {
+      throw RangeError.range(e, 1, maxPreciseInteger, 'modulus');
+    }
+
+    // This is floor(sqrt(maxPreciseInteger)).
+    const int maxValueThatCanBeSquaredWithoutTruncation = 94906265;
+    if (m > maxValueThatCanBeSquaredWithoutTruncation) {
+      // Use BigInt version to avoid truncation in multiplications below. The
+      // 'maxPreciseInteger' check on [m] ensures that toInt() does not round.
+      return BigInt.from(this).modPow(BigInt.from(e), BigInt.from(m)).toInt();
+    }
+
     int b = this;
     if (b < 0 || b > m) {
       b %= m;
diff --git a/sdk/lib/_internal/js_runtime/lib/js_rti.dart b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
index 6250aa0..fd82931 100644
--- a/sdk/lib/_internal/js_runtime/lib/js_rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/js_rti.dart
@@ -713,16 +713,6 @@
 
   if (isNullType(s)) return true;
 
-  if (isDartFunctionType(t)) {
-    return _isFunctionSubtype(s, sEnv, t, tEnv);
-  }
-
-  if (isDartFunctionType(s)) {
-    // Check function types against the `Function` class (`Object` is also a
-    // supertype, but is tested above with other 'top' types.).
-    return isDartFunctionTypeRti(t);
-  }
-
   // Get the object describing the class and check for the subtyping flag
   // constructed from the type of [s].
   var typeOfS = isJsArray(s) ? getIndex(s, 0) : s;
@@ -755,6 +745,16 @@
     }
   }
 
+  if (isDartFunctionType(t)) {
+    return _isFunctionSubtype(s, sEnv, t, tEnv);
+  }
+
+  if (isDartFunctionType(s)) {
+    // Check function types against the `Function` class (`Object` is also a
+    // supertype, but is tested above with other 'top' types.).
+    return isDartFunctionTypeRti(t);
+  }
+
   // Get the object describing the class and check for the subtyping flag
   // constructed from the type of [t].
   var typeOfT = isJsArray(t) ? getIndex(t, 0) : t;
diff --git a/sdk/lib/_internal/js_runtime/lib/native_helper.dart b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
index 04e1e46..ccfa26f 100644
--- a/sdk/lib/_internal/js_runtime/lib/native_helper.dart
+++ b/sdk/lib/_internal/js_runtime/lib/native_helper.dart
@@ -72,7 +72,7 @@
   JS(
       'void',
       'Object.defineProperty(#, #, '
-      '{value: #, enumerable: false, writable: true, configurable: true})',
+          '{value: #, enumerable: false, writable: true, configurable: true})',
       obj,
       property,
       value);
diff --git a/sdk/lib/_internal/js_runtime/lib/rti.dart b/sdk/lib/_internal/js_runtime/lib/rti.dart
index d0bd80f..eac3473 100644
--- a/sdk/lib/_internal/js_runtime/lib/rti.dart
+++ b/sdk/lib/_internal/js_runtime/lib/rti.dart
@@ -12,12 +12,17 @@
         JS,
         JS_BUILTIN,
         JS_EMBEDDED_GLOBAL,
+        JS_GET_FLAG,
         JS_GET_NAME,
+        JS_STRING_CONCAT,
         RAW_DART_FUNCTION_REF;
+
 import 'dart:_interceptors' show JSArray, JSUnmodifiableArray;
 
+import 'dart:_js_names' show unmangleGlobalNameIfPreservedAnyways;
+
 import 'dart:_js_embedded_names'
-    show JsBuiltin, JsGetName, RtiUniverseFieldNames, RTI_UNIVERSE;
+    show JsBuiltin, JsGetName, RtiUniverseFieldNames, RTI_UNIVERSE, TYPES;
 
 import 'dart:_recipe_syntax';
 
@@ -62,6 +67,12 @@
     rti._is = fn;
   }
 
+  @pragma('dart2js:tryInline')
+  static bool _isCheck(Rti rti, object) {
+    return JS(
+        'bool', '#.#(#)', rti, JS_GET_NAME(JsGetName.RTI_FIELD_IS), object);
+  }
+
   /// Method called from generated code to evaluate a type environment recipe in
   /// `this` type environment.
   Rti _eval(recipe) {
@@ -125,12 +136,20 @@
   static const kindGenericFunction = 11;
   static const kindGenericFunctionParameter = 12;
 
+  static bool _isFunctionType(Rti rti) {
+    int kind = Rti._getKind(rti);
+    return kind == kindFunction || kind == kindGenericFunction;
+  }
+
   /// Primary data associated with type.
   ///
   /// - Minified name of interface for interface types.
   /// - Underlying type for unary terms.
   /// - Class part of a type environment inside a generic class, or `null` for
   ///   type tuple.
+  /// - Return type of a function type.
+  /// - Underlying function type for a generic function.
+  /// - de Bruijn index for a generic function parameter.
   dynamic _primary;
 
   static Object _getPrimary(Rti rti) => rti._primary;
@@ -143,7 +162,8 @@
   /// - The type arguments of an interface type.
   /// - The type arguments from enclosing functions and closures for a
   ///   kindBinding.
-  /// - TBD for kindFunction and kindGenericFunction.
+  /// - The [_FunctionParameters] of a function type.
+  /// - The type parameter bounds of a generic function.
   dynamic _rest;
 
   static Object _getRest(Rti rti) => rti._rest;
@@ -173,11 +193,46 @@
     return JS('JSUnmodifiableArray', '#', _getRest(rti));
   }
 
+  static Rti _getStarArgument(Rti rti) {
+    assert(_getKind(rti) == kindStar);
+    return _castToRti(_getPrimary(rti));
+  }
+
+  static Rti _getQuestionArgument(Rti rti) {
+    assert(_getKind(rti) == kindQuestion);
+    return _castToRti(_getPrimary(rti));
+  }
+
   static Rti _getFutureOrArgument(Rti rti) {
     assert(_getKind(rti) == kindFutureOr);
     return _castToRti(_getPrimary(rti));
   }
 
+  static Rti _getReturnType(Rti rti) {
+    assert(_getKind(rti) == kindFunction);
+    return _castToRti(_getPrimary(rti));
+  }
+
+  static _FunctionParameters _getFunctionParameters(Rti rti) {
+    assert(_getKind(rti) == kindFunction);
+    return JS('_FunctionParameters', '#', _getRest(rti));
+  }
+
+  static Rti _getGenericFunctionBase(Rti rti) {
+    assert(_getKind(rti) == kindGenericFunction);
+    return _castToRti(_getPrimary(rti));
+  }
+
+  static JSArray _getGenericFunctionBounds(Rti rti) {
+    assert(_getKind(rti) == kindGenericFunction);
+    return JS('JSUnmodifiableArray', '#', _getRest(rti));
+  }
+
+  static int _getGenericFunctionParameterIndex(Rti rti) {
+    assert(_getKind(rti) == kindGenericFunctionParameter);
+    return _Utils.asInt(_getPrimary(rti));
+  }
+
   /// On [Rti]s that are type environments*, derived types are cached on the
   /// environment to ensure fast canonicalization. Ground-term types (i.e. not
   /// dependent on class or function type parameters) are cached in the
@@ -217,7 +272,7 @@
   Object _canonicalRecipe;
 
   static String _getCanonicalRecipe(Rti rti) {
-    var s = rti._canonicalRecipe;
+    Object s = rti._canonicalRecipe;
     assert(_Utils.isString(s), 'Missing canonical recipe');
     return _Utils.asString(s);
   }
@@ -227,6 +282,45 @@
   }
 }
 
+class _FunctionParameters {
+  // TODO(fishythefish): Support required named parameters.
+
+  static _FunctionParameters allocate() => _FunctionParameters();
+
+  Object _requiredPositional;
+  static JSArray _getRequiredPositional(_FunctionParameters parameters) =>
+      JS('JSUnmodifiableArray', '#', parameters._requiredPositional);
+  static void _setRequiredPositional(
+      _FunctionParameters parameters, Object requiredPositional) {
+    parameters._requiredPositional = requiredPositional;
+  }
+
+  Object _optionalPositional;
+  static JSArray _getOptionalPositional(_FunctionParameters parameters) =>
+      JS('JSUnmodifiableArray', '#', parameters._optionalPositional);
+  static void _setOptionalPositional(
+      _FunctionParameters parameters, Object optionalPositional) {
+    parameters._optionalPositional = optionalPositional;
+  }
+
+  /// These are alternating name/type pairs; that is, the optional named
+  /// parameters of the function
+  ///
+  ///   void foo({int bar, double baz})
+  ///
+  /// would be encoded as ["bar", int, "baz", double], where the even indices are
+  /// the name [String]s and the odd indices are the type [Rti]s.
+  ///
+  /// Invariant: These pairs are sorted by name in lexicographically ascending order.
+  Object _optionalNamed;
+  static JSArray _getOptionalNamed(_FunctionParameters parameters) =>
+      JS('JSUnmodifiableArray', '#', parameters._optionalNamed);
+  static void _setOptionalNamed(
+      _FunctionParameters parameters, Object optionalNamed) {
+    parameters._optionalNamed = optionalNamed;
+  }
+}
+
 Object _theUniverse() => JS_EMBEDDED_GLOBAL('', RTI_UNIVERSE);
 
 Rti _rtiEval(Rti environment, String recipe) {
@@ -247,6 +341,24 @@
   return _Universe.eval(_theUniverse(), recipe);
 }
 
+/// Evaluate a type recipe in the environment of an instance.
+Rti evalInInstance(instance, String recipe) {
+  return _rtiEval(instanceType(instance), recipe);
+}
+
+/// Returns the Rti type of [object]. Closures have both an interface type
+/// (Closures implement `Function`) and a structural function type. Uses
+/// [testRti] to choose the appropriate type.
+///
+/// Called from generated code.
+Rti instanceOrFunctionType(object, Rti testRti) {
+  if (Rti._isFunctionType(testRti)) {
+    Rti rti = _instanceFunctionType(object);
+    if (rti != null) return rti;
+  }
+  return instanceType(object);
+}
+
 /// Returns the Rti type of [object].
 /// Called from generated code.
 Rti instanceType(object) {
@@ -262,6 +374,19 @@
           'depends:none;effects:none;', JsBuiltin.dartObjectConstructor))) {
     var rti = JS('', r'#[#]', object, JS_GET_NAME(JsGetName.RTI_NAME));
     if (rti != null) return _castToRti(rti);
+
+    // Subclasses of Closure are synthetic classes. The synthetic classes all
+    // extend a 'normal' class (Closure, BoundClosure, StaticClosure), so make
+    // them appear to be the superclass.
+    // TODO(sra): Can this be done less expensively, e.g. by putting $ti on the
+    // prototype of Closure/BoundClosure/StaticClosure classes?
+    var closureClassConstructor = JS_BUILTIN(
+        'depends:none;effects:none;', JsBuiltin.dartClosureConstructor);
+    if (_Utils.instanceOf(object, closureClassConstructor)) {
+      return _instanceTypeFromConstructor(
+          JS('', '#.__proto__.__proto__.constructor', object));
+    }
+
     return _instanceTypeFromConstructor(JS('', '#.constructor', object));
   }
 
@@ -284,8 +409,41 @@
   return findType(JS('String', '#.name', constructor));
 }
 
+/// Returns the structural function type of [object], or `null` if the object is
+/// not a closure.
+Rti _instanceFunctionType(object) {
+  if (_Utils.instanceOf(
+      object,
+      JS_BUILTIN(
+          'depends:none;effects:none;', JsBuiltin.dartClosureConstructor))) {
+    var signatureName = JS_GET_NAME(JsGetName.SIGNATURE_NAME);
+    var signature = JS('', '#[#]', object, signatureName);
+    if (signature != null) {
+      if (JS('bool', 'typeof # == "number"', signature)) {
+        return getTypeFromTypesTable(_Utils.asInt(signature));
+      }
+      return _castToRti(JS('', '#[#]()', object, signatureName));
+    }
+  }
+  return null;
+}
+
+/// Returns Rti from types table. The types table is initialized with recipe
+/// strings.
+Rti getTypeFromTypesTable(/*int*/ _index) {
+  int index = _Utils.asInt(_index);
+  var table = JS_EMBEDDED_GLOBAL('', TYPES);
+  var type = _Utils.arrayAt(table, index);
+  if (_Utils.isString(type)) {
+    Rti rti = findType(_Utils.asString(type));
+    _Utils.arraySetAt(table, index, rti);
+    return rti;
+  }
+  return _castToRti(type);
+}
+
 Type getRuntimeType(object) {
-  Rti rti = instanceType(object);
+  Rti rti = _instanceFunctionType(object) ?? instanceType(object);
   return _createRuntimeType(rti);
 }
 
@@ -329,7 +487,7 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  Rti objectRti = instanceType(object);
+  Rti objectRti = instanceOrFunctionType(object, testRti);
   return isSubtype(_theUniverse(), objectRti, testRti);
 }
 
@@ -339,12 +497,12 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  Rti objectRti = instanceType(object);
-  if (isSubtype(_theUniverse(), objectRti, testRti)) return object;
-  var message = "${Error.safeToString(object)}:"
-      " type '${_rtiToString(objectRti, null)}'"
-      " is not a subtype of type '${_rtiToString(testRti, null)}'";
-  throw new _CastError.fromMessage('CastError: $message');
+  if (Rti._isCheck(testRti, object)) return object;
+
+  Rti objectRti = instanceOrFunctionType(object, testRti);
+  String message =
+      _Error.compose(object, objectRti, _rtiToString(testRti, null));
+  throw _CastError.fromMessage(message);
 }
 
 /// Called from generated code.
@@ -353,37 +511,272 @@
   // This static method is installed on an Rti object as a JavaScript instance
   // method. The Rti object is 'this'.
   Rti testRti = _castToRti(JS('', 'this'));
-  Rti objectRti = instanceType(object);
-  if (isSubtype(_theUniverse(), objectRti, testRti)) return object;
-  var message = "${Error.safeToString(object)}:"
-      " type '${_rtiToString(objectRti, null)}'"
-      " is not a subtype of type '${_rtiToString(testRti, null)}'";
-  throw new _TypeError.fromMessage('TypeError: $message');
+  if (Rti._isCheck(testRti, object)) return object;
+
+  Rti objectRti = instanceOrFunctionType(object, testRti);
+  String message =
+      _Error.compose(object, objectRti, _rtiToString(testRti, null));
+  throw _TypeError.fromMessage(message);
 }
 
 /// Called from generated code.
 checkTypeBound(Rti type, Rti bound, variable) {
   if (isSubtype(_theUniverse(), type, bound)) return type;
-  var message = "Type '${_rtiToString(type, null)}'"
+  String message = "Type '${_rtiToString(type, null)}'"
       " is not a subtype of type '${_rtiToString(bound, null)}'"
       " of '${_Utils.asString(variable)}'";
-  throw _TypeError.fromMessage('TypeError: $message');
+  throw _TypeError.fromMessage(message);
 }
 
-class _CastError extends Error implements CastError {
-  final String message;
-  _CastError.fromMessage(this.message);
+/// Base class to _CastError and _TypeError.
+class _Error extends Error {
+  final String _message;
+  _Error(this._message);
+
+  static String compose(object, objectRti, checkedTypeDescription) {
+    String objectDescription = Error.safeToString(object);
+    objectRti ??= instanceType(object);
+    String objectTypeDescription = _rtiToString(objectRti, null);
+    return "${objectDescription}:"
+        " type '${objectTypeDescription}'"
+        " is not a subtype of type '${checkedTypeDescription}'";
+  }
 
   @override
-  String toString() => message;
+  String toString() => _message;
 }
 
-class _TypeError extends Error implements TypeError {
-  final String message;
-  _TypeError.fromMessage(this.message);
+class _CastError extends _Error implements CastError {
+  _CastError.fromMessage(String message) : super('CastError: $message');
+
+  factory _CastError.forType(object, String type) {
+    return _CastError.fromMessage(_Error.compose(object, null, type));
+  }
+}
+
+class _TypeError extends _Error implements TypeError {
+  _TypeError.fromMessage(String message) : super('TypeError: $message');
+
+  factory _TypeError.forType(object, String type) {
+    return _TypeError.fromMessage(_Error.compose(object, null, type));
+  }
 
   @override
-  String toString() => message;
+  String get message => _message;
+}
+
+// Specializations.
+//
+// Specializations can be placed on Rti objects as the _as, _check and _is
+// 'methods'. They can also be called directly called from generated code.
+
+/// Specialization for 'is bool'.
+/// Called from generated code.
+bool _isBool(object) {
+  return true == object || false == object;
+}
+
+/// Specialization for 'as bool?'.
+/// Called from generated code.
+bool /*?*/ _asBoolNullable(object) {
+  if (object is bool) return object;
+  if (object == null) return object;
+  throw _CastError.forType(object, 'bool');
+}
+
+/// Specialization for check on 'bool?'.
+/// Called from generated code.
+bool /*?*/ _checkBoolNullable(object) {
+  if (object is bool) return object;
+  if (object == null) return object;
+  throw _TypeError.forType(object, 'bool');
+}
+
+/// Specialization for 'as double?'.
+/// Called from generated code.
+double /*?*/ _asDoubleNullable(object) {
+  if (object is double) return object;
+  if (object == null) return object;
+  throw _CastError.forType(object, 'double');
+}
+
+/// Specialization for check on 'double?'.
+/// Called from generated code.
+double /*?*/ _checkDoubleNullable(object) {
+  if (object is double) return object;
+  if (object == null) return object;
+  throw _TypeError.forType(object, 'double');
+}
+
+/// Specialization for 'is int'.
+/// Called from generated code.
+bool _isInt(object) {
+  return JS('bool', 'typeof # == "number"', object) &&
+      JS('bool', 'Math.floor(#) === #', object, object);
+}
+
+/// Specialization for 'as int?'.
+/// Called from generated code.
+int /*?*/ _asIntNullable(object) {
+  if (object is int) return object;
+  if (object == null) return object;
+  throw _CastError.forType(object, 'int');
+}
+
+/// Specialization for check on 'int?'.
+/// Called from generated code.
+int /*?*/ _checkIntNullable(object) {
+  if (object is int) return object;
+  if (object == null) return object;
+  throw _TypeError.forType(object, 'int');
+}
+
+/// Specialization for 'is num' and 'is double'.
+/// Called from generated code.
+bool _isNum(object) {
+  return JS('bool', 'typeof # == "number"', object);
+}
+
+/// Specialization for 'as num?'.
+/// Called from generated code.
+num /*?*/ _asNumNullable(object) {
+  if (object is num) return object;
+  if (object == null) return object;
+  throw _CastError.forType(object, 'num');
+}
+
+/// Specialization for check on 'num?'.
+/// Called from generated code.
+num /*?*/ _checkNumNullable(object) {
+  if (object is num) return object;
+  if (object == null) return object;
+  throw _TypeError.forType(object, 'num');
+}
+
+/// Specialization for 'is String'.
+/// Called from generated code.
+bool _isString(object) {
+  return JS('bool', 'typeof # == "string"', object);
+}
+
+/// Specialization for 'as String?'.
+/// Called from generated code.
+String /*?*/ _asStringNullable(object) {
+  if (object is String) return object;
+  if (object == null) return object;
+  throw _CastError.forType(object, 'String');
+}
+
+/// Specialization for check on 'String?'.
+/// Called from generated code.
+String /*?*/ _checkStringNullable(object) {
+  if (object is String) return object;
+  if (object == null) return object;
+  throw _TypeError.forType(object, 'String');
+}
+
+String _rtiArrayToString(Object array, List<String> genericContext) {
+  String s = '', sep = '';
+  for (int i = 0; i < _Utils.arrayLength(array); i++) {
+    s += sep +
+        _rtiToString(_castToRti(_Utils.arrayAt(array, i)), genericContext);
+    sep = ', ';
+  }
+  return s;
+}
+
+String _functionRtiToString(Rti functionType, List<String> genericContext,
+    {Object bounds = null}) {
+  String typeParametersText = '';
+  int outerContextLength;
+
+  if (bounds != null) {
+    int boundsLength = _Utils.arrayLength(bounds);
+    if (genericContext == null) {
+      genericContext = <String>[];
+    } else {
+      outerContextLength = genericContext.length;
+    }
+    int offset = genericContext.length;
+    for (int i = boundsLength; i > 0; i--) {
+      genericContext.add('T${offset + i}');
+    }
+
+    String typeSep = '';
+    typeParametersText = '<';
+    for (int i = 0; i < boundsLength; i++) {
+      typeParametersText += typeSep;
+      typeParametersText += genericContext[genericContext.length - 1 - i];
+      Rti boundRti = _castToRti(_Utils.arrayAt(bounds, i));
+      if (!isTopType(boundRti)) {
+        typeParametersText +=
+            ' extends ' + _rtiToString(boundRti, genericContext);
+      }
+      typeSep = ', ';
+    }
+    typeParametersText += '>';
+  }
+
+  // TODO(fishythefish): Support required named parameters.
+  Rti returnType = Rti._getReturnType(functionType);
+  _FunctionParameters parameters = Rti._getFunctionParameters(functionType);
+  var requiredPositional =
+      _FunctionParameters._getRequiredPositional(parameters);
+  int requiredPositionalLength = _Utils.arrayLength(requiredPositional);
+  var optionalPositional =
+      _FunctionParameters._getOptionalPositional(parameters);
+  int optionalPositionalLength = _Utils.arrayLength(optionalPositional);
+  var optionalNamed = _FunctionParameters._getOptionalNamed(parameters);
+  int optionalNamedLength = _Utils.arrayLength(optionalNamed);
+  assert(optionalPositionalLength == 0 || optionalNamedLength == 0);
+
+  String returnTypeText = _rtiToString(returnType, genericContext);
+
+  String argumentsText = '';
+  String sep = '';
+  for (int i = 0; i < requiredPositionalLength; i++) {
+    argumentsText += sep +
+        _rtiToString(
+            _castToRti(_Utils.arrayAt(requiredPositional, i)), genericContext);
+    sep = ', ';
+  }
+
+  if (optionalPositionalLength > 0) {
+    argumentsText += sep + '[';
+    sep = '';
+    for (int i = 0; i < optionalPositionalLength; i++) {
+      argumentsText += sep +
+          _rtiToString(_castToRti(_Utils.arrayAt(optionalPositional, i)),
+              genericContext);
+      sep = ', ';
+    }
+    argumentsText += ']';
+  }
+
+  if (optionalNamedLength > 0) {
+    argumentsText += sep + '{';
+    sep = '';
+    for (int i = 0; i < optionalNamedLength; i += 2) {
+      argumentsText += sep +
+          _rtiToString(_castToRti(_Utils.arrayAt(optionalNamed, i + 1)),
+              genericContext) +
+          ' ' +
+          _Utils.asString(_Utils.arrayAt(optionalNamed, i));
+      sep = ', ';
+    }
+    argumentsText += '}';
+  }
+
+  if (outerContextLength != null) {
+    // Pop all of the generic type parameters.
+    JS('', '#.length = #', genericContext, outerContextLength);
+  }
+
+  // TODO(fishythefish): Below is the same format as the VM. Change to:
+  //
+  //     return '${returnTypeText} Function${typeParametersText}(${argumentsText})';
+  //
+  return '${typeParametersText}(${argumentsText}) => ${returnTypeText}';
 }
 
 String _rtiToString(Rti rti, List<String> genericContext) {
@@ -394,33 +787,112 @@
   if (kind == Rti.kindNever) return 'Never';
   if (kind == Rti.kindAny) return 'any';
 
+  if (kind == Rti.kindStar) {
+    Rti starArgument = Rti._getStarArgument(rti);
+    return '${_rtiToString(starArgument, genericContext)}*';
+  }
+
+  if (kind == Rti.kindQuestion) {
+    Rti questionArgument = Rti._getQuestionArgument(rti);
+    return '${_rtiToString(questionArgument, genericContext)}?';
+  }
+
+  if (kind == Rti.kindFutureOr) {
+    Rti futureOrArgument = Rti._getFutureOrArgument(rti);
+    return 'FutureOr<${_rtiToString(futureOrArgument, genericContext)}>';
+  }
+
   if (kind == Rti.kindInterface) {
     String name = Rti._getInterfaceName(rti);
+    name = _unminifyOrTag(name);
     var arguments = Rti._getInterfaceTypeArguments(rti);
     if (arguments.length != 0) {
-      name += '<';
-      for (int i = 0; i < arguments.length; i++) {
-        if (i > 0) name += ', ';
-        name += _rtiToString(_castToRti(arguments[i]), genericContext);
-      }
-      name += '>';
+      name += '<' + _rtiArrayToString(arguments, genericContext) + '>';
     }
     return name;
   }
 
+  if (kind == Rti.kindFunction) {
+    return _functionRtiToString(rti, genericContext);
+  }
+
+  if (kind == Rti.kindGenericFunction) {
+    Rti baseFunctionType = Rti._getGenericFunctionBase(rti);
+    Object bounds = Rti._getGenericFunctionBounds(rti);
+    return _functionRtiToString(baseFunctionType, genericContext,
+        bounds: bounds);
+  }
+
+  if (kind == Rti.kindGenericFunctionParameter) {
+    int index = Rti._getGenericFunctionParameterIndex(rti);
+    return genericContext[genericContext.length - 1 - index];
+  }
+
   return '?';
 }
 
-String _rtiToDebugString(Rti rti) {
-  String arrayToString(Object array) {
-    String s = '[', sep = '';
-    for (int i = 0; i < _Utils.arrayLength(array); i++) {
-      s += sep + _rtiToDebugString(_castToRti(_Utils.arrayAt(array, i)));
-      sep = ', ';
-    }
-    return s + ']';
+String _unminifyOrTag(String rawClassName) {
+  String preserved = unmangleGlobalNameIfPreservedAnyways(rawClassName);
+  if (preserved != null) return preserved;
+  return JS_GET_FLAG('MINIFIED') ? 'minified:$rawClassName' : rawClassName;
+}
+
+String _rtiArrayToDebugString(Object array) {
+  String s = '[', sep = '';
+  for (int i = 0; i < _Utils.arrayLength(array); i++) {
+    s += sep + _rtiToDebugString(_castToRti(_Utils.arrayAt(array, i)));
+    sep = ', ';
+  }
+  return s + ']';
+}
+
+String functionParametersToString(_FunctionParameters parameters) {
+  // TODO(fishythefish): Support required named parameters.
+  String s = '(', sep = '';
+  var requiredPositional =
+      _FunctionParameters._getRequiredPositional(parameters);
+  int requiredPositionalLength = _Utils.arrayLength(requiredPositional);
+  var optionalPositional =
+      _FunctionParameters._getOptionalPositional(parameters);
+  int optionalPositionalLength = _Utils.arrayLength(optionalPositional);
+  var optionalNamed = _FunctionParameters._getOptionalNamed(parameters);
+  int optionalNamedLength = _Utils.arrayLength(optionalNamed);
+  assert(optionalPositionalLength == 0 || optionalNamedLength == 0);
+
+  for (int i = 0; i < requiredPositionalLength; i++) {
+    s += sep +
+        _rtiToDebugString(_castToRti(_Utils.arrayAt(requiredPositional, i)));
+    sep = ', ';
   }
 
+  if (optionalPositionalLength > 0) {
+    s += sep + '[';
+    sep = '';
+    for (int i = 0; i < optionalPositionalLength; i++) {
+      s += sep +
+          _rtiToDebugString(_castToRti(_Utils.arrayAt(optionalPositional, i)));
+      sep = ', ';
+    }
+    s += ']';
+  }
+
+  if (optionalNamedLength > 0) {
+    s += sep + '{';
+    sep = '';
+    for (int i = 0; i < optionalNamedLength; i += 2) {
+      s += sep +
+          _rtiToDebugString(_castToRti(_Utils.arrayAt(optionalNamed, i + 1))) +
+          ' ' +
+          _Utils.asString(_Utils.arrayAt(optionalNamed, i));
+      sep = ', ';
+    }
+    s += '}';
+  }
+
+  return s + ')';
+}
+
+String _rtiToDebugString(Rti rti) {
   int kind = Rti._getKind(rti);
 
   if (kind == Rti.kindDynamic) return 'dynamic';
@@ -428,20 +900,52 @@
   if (kind == Rti.kindNever) return 'Never';
   if (kind == Rti.kindAny) return 'any';
 
+  if (kind == Rti.kindStar) {
+    Rti starArgument = Rti._getStarArgument(rti);
+    return 'star(${_rtiToDebugString(starArgument)})';
+  }
+
+  if (kind == Rti.kindQuestion) {
+    Rti questionArgument = Rti._getQuestionArgument(rti);
+    return 'question(${_rtiToDebugString(questionArgument)})';
+  }
+
+  if (kind == Rti.kindFutureOr) {
+    Rti futureOrArgument = Rti._getFutureOrArgument(rti);
+    return 'FutureOr(${_rtiToDebugString(futureOrArgument)})';
+  }
+
   if (kind == Rti.kindInterface) {
     String name = Rti._getInterfaceName(rti);
     var arguments = Rti._getInterfaceTypeArguments(rti);
     if (_Utils.arrayLength(arguments) == 0) {
       return 'interface("$name")';
     } else {
-      return 'interface("$name", ${arrayToString(arguments)})';
+      return 'interface("$name", ${_rtiArrayToDebugString(arguments)})';
     }
   }
 
   if (kind == Rti.kindBinding) {
-    var base = Rti._getBindingBase(rti);
+    Rti base = Rti._getBindingBase(rti);
     var arguments = Rti._getBindingArguments(rti);
-    return 'binding(${_rtiToDebugString(base)}, ${arrayToString(arguments)})';
+    return 'binding(${_rtiToDebugString(base)}, ${_rtiArrayToDebugString(arguments)})';
+  }
+
+  if (kind == Rti.kindFunction) {
+    Rti returnType = Rti._getReturnType(rti);
+    _FunctionParameters parameters = Rti._getFunctionParameters(rti);
+    return 'function(${_rtiToDebugString(returnType)}, ${functionParametersToString(parameters)})';
+  }
+
+  if (kind == Rti.kindGenericFunction) {
+    Rti baseFunctionType = Rti._getGenericFunctionBase(rti);
+    Object bounds = Rti._getGenericFunctionBounds(rti);
+    return 'genericFunction(${_rtiToDebugString(baseFunctionType)}, ${_rtiArrayToDebugString(bounds)})';
+  }
+
+  if (kind == Rti.kindGenericFunctionParameter) {
+    int index = Rti._getGenericFunctionParameterIndex(rti);
+    return 'genericFunctionParameter($index)';
   }
 
   return 'other(kind=$kind)';
@@ -486,7 +990,14 @@
       JS('', '#.#', typeRules(universe), targetType);
 
   static void addRules(universe, rules) {
-    JS('', 'Object.assign(#, #)', typeRules(universe), rules);
+    // TODO(fishythefish): Use `Object.assign()` when IE11 is deprecated.
+    var keys = JS('JSArray', 'Object.keys(#)', rules);
+    int length = _Utils.arrayLength(keys);
+    Object ruleset = typeRules(universe);
+    for (int i = 0; i < length; i++) {
+      String targetType = _Utils.asString(_Utils.arrayAt(keys, i));
+      JS('', '#[#] = #[#]', ruleset, targetType, rules, targetType);
+    }
   }
 
   static Object sharedEmptyArray(universe) =>
@@ -497,7 +1008,7 @@
     var cache = evalCache(universe);
     var probe = _cacheGet(cache, recipe);
     if (probe != null) return _castToRti(probe);
-    var rti = _parseRecipe(universe, null, recipe);
+    Rti rti = _parseRecipe(universe, null, recipe);
     _cacheSet(cache, recipe, rti);
     return rti;
   }
@@ -511,7 +1022,7 @@
     }
     var probe = _cacheGet(cache, recipe);
     if (probe != null) return _castToRti(probe);
-    var rti = _parseRecipe(universe, environment, recipe);
+    Rti rti = _parseRecipe(universe, environment, recipe);
     _cacheSet(cache, recipe, rti);
     return rti;
   }
@@ -522,7 +1033,7 @@
       cache = JS('', 'new Map()');
       Rti._setBindCache(environment, cache);
     }
-    var argumentsRecipe = Rti._getCanonicalRecipe(argumentsRti);
+    String argumentsRecipe = Rti._getCanonicalRecipe(argumentsRti);
     var probe = _cacheGet(cache, argumentsRecipe);
     if (probe != null) return _castToRti(probe);
     var argumentsArray;
@@ -531,7 +1042,7 @@
     } else {
       argumentsArray = JS('', '[#]', argumentsRti);
     }
-    var rti = _lookupBindingRti(universe, environment, argumentsArray);
+    Rti rti = _lookupBindingRti(universe, environment, argumentsArray);
     _cacheSet(cache, argumentsRecipe, rti);
     return rti;
   }
@@ -541,7 +1052,16 @@
   }
 
   static Rti evalTypeVariable(Object universe, Rti environment, String name) {
-    throw UnimplementedError('_Universe.evalTypeVariable("$name")');
+    if (Rti._getKind(environment) == Rti.kindBinding) {
+      environment = Rti._getBindingBase(environment);
+    }
+
+    assert(Rti._getKind(environment) == Rti.kindInterface);
+    String interfaceName = Rti._getInterfaceName(environment);
+    Object rule = _Universe.findRule(universe, interfaceName);
+    assert(rule != null);
+    String recipe = TypeRule.lookupTypeVariable(rule, name);
+    return _Universe.evalInEnvironment(universe, environment, recipe);
   }
 
   static _cacheGet(cache, key) => JS('', '#.get(#)', cache, key);
@@ -550,7 +1070,7 @@
   }
 
   static Rti _parseRecipe(Object universe, Object environment, String recipe) {
-    var parser = _Parser.create(universe, environment, recipe);
+    Object parser = _Parser.create(universe, environment, recipe);
     Rti rti = _Parser.parse(parser);
     if (rti != null) return rti;
     throw UnimplementedError('_Universe._parseRecipe("$recipe")');
@@ -561,15 +1081,29 @@
     String key = Rti._getCanonicalRecipe(rti);
     _cacheSet(evalCache(universe), key, rti);
 
-    // Set up methods to type tests.
-    // TODO(sra): Install specializations.
-    Rti._setAsCheckFunction(
-        rti, RAW_DART_FUNCTION_REF(_generalAsCheckImplementation));
-    Rti._setTypeCheckFunction(
-        rti, RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation));
-    Rti._setIsTestFunction(
-        rti, RAW_DART_FUNCTION_REF(_generalIsTestImplementation));
+    // Set up methods to perform type tests.
 
+    // TODO(sra): Find better way to install specializations. Perhaps the
+    // installed version should replace itself with the specialization.
+    var checkFn = RAW_DART_FUNCTION_REF(_generalTypeCheckImplementation);
+    var asFn = RAW_DART_FUNCTION_REF(_generalAsCheckImplementation);
+    var isFn = RAW_DART_FUNCTION_REF(_generalIsTestImplementation);
+
+    if (JS_GET_NAME(JsGetName.INT_RECIPE) == key) {
+      isFn = RAW_DART_FUNCTION_REF(_isInt);
+    } else if (JS_GET_NAME(JsGetName.DOUBLE_RECIPE) == key) {
+      isFn = RAW_DART_FUNCTION_REF(_isNum);
+    } else if (JS_GET_NAME(JsGetName.NUM_RECIPE) == key) {
+      isFn = RAW_DART_FUNCTION_REF(_isNum);
+    } else if (JS_GET_NAME(JsGetName.STRING_RECIPE) == key) {
+      isFn = RAW_DART_FUNCTION_REF(_isString);
+    } else if (JS_GET_NAME(JsGetName.BOOL_RECIPE) == key) {
+      isFn = RAW_DART_FUNCTION_REF(_isBool);
+    }
+
+    Rti._setAsCheckFunction(rti, asFn);
+    Rti._setTypeCheckFunction(rti, checkFn);
+    Rti._setIsTestFunction(rti, isFn);
     return rti;
   }
 
@@ -591,6 +1125,9 @@
   static String _canonicalRecipeOfFutureOr(Rti baseType) =>
       Rti._getCanonicalRecipe(baseType) + Recipe.wrapFutureOrString;
 
+  static String _canonicalRecipeOfGenericFunctionParameter(int index) =>
+      '$index' + Recipe.genericFunctionTypeParameterIndexString;
+
   static Rti _lookupDynamicRti(universe) {
     return _lookupTerminalRti(
         universe, Rti.kindDynamic, _canonicalRecipeOfDynamic());
@@ -617,7 +1154,7 @@
   }
 
   static Rti _createTerminalRti(universe, int kind, String canonicalRecipe) {
-    var rti = Rti.allocate();
+    Rti rti = Rti.allocate();
     Rti._setKind(rti, kind);
     Rti._setCanonicalRecipe(rti, canonicalRecipe);
     return _finishRti(universe, rti);
@@ -633,13 +1170,30 @@
 
   static Rti _createFutureOrRti(
       universe, Rti baseType, String canonicalRecipe) {
-    var rti = Rti.allocate();
+    Rti rti = Rti.allocate();
     Rti._setKind(rti, Rti.kindFutureOr);
     Rti._setPrimary(rti, baseType);
     Rti._setCanonicalRecipe(rti, canonicalRecipe);
     return _finishRti(universe, rti);
   }
 
+  static Rti _lookupGenericFunctionParameterRti(universe, int index) {
+    String canonicalRecipe = _canonicalRecipeOfGenericFunctionParameter(index);
+    var cache = evalCache(universe);
+    var probe = _cacheGet(cache, canonicalRecipe);
+    if (probe != null) return _castToRti(probe);
+    return _createGenericFunctionParameterRti(universe, index, canonicalRecipe);
+  }
+
+  static Rti _createGenericFunctionParameterRti(
+      universe, int index, String canonicalRecipe) {
+    Rti rti = Rti.allocate();
+    Rti._setKind(rti, Rti.kindGenericFunctionParameter);
+    Rti._setPrimary(rti, index);
+    Rti._setCanonicalRecipe(rti, canonicalRecipe);
+    return _finishRti(universe, rti);
+  }
+
   static String _canonicalRecipeJoin(Object arguments) {
     String s = '', sep = '';
     int length = _Utils.arrayLength(arguments);
@@ -652,6 +1206,20 @@
     return s;
   }
 
+  static String _canonicalRecipeJoinNamed(Object arguments) {
+    String s = '', sep = '';
+    int length = _Utils.arrayLength(arguments);
+    assert(length.isEven);
+    for (int i = 0; i < length; i += 2) {
+      String name = _Utils.asString(_Utils.arrayAt(arguments, i));
+      Rti type = _castToRti(_Utils.arrayAt(arguments, i + 1));
+      String subrecipe = Rti._getCanonicalRecipe(type);
+      s += sep + name + Recipe.nameSeparatorString + subrecipe;
+      sep = Recipe.separatorString;
+    }
+    return s;
+  }
+
   static String _canonicalRecipeOfInterface(String name, Object arguments) {
     assert(_Utils.isString(name));
     String s = _Utils.asString(name);
@@ -675,7 +1243,7 @@
 
   static Rti _createInterfaceRti(
       Object universe, String name, Object typeArguments, String key) {
-    var rti = Rti.allocate();
+    Rti rti = Rti.allocate();
     Rti._setKind(rti, Rti.kindInterface);
     Rti._setPrimary(rti, name);
     Rti._setRest(rti, typeArguments);
@@ -696,7 +1264,7 @@
   /// [arguments] becomes owned by the created Rti.
   static Rti _lookupBindingRti(Object universe, Rti base, Object arguments) {
     Rti newBase = base;
-    var newArguments = arguments;
+    Object newArguments = arguments;
     if (Rti._getKind(base) == Rti.kindBinding) {
       newBase = Rti._getBindingBase(base);
       newArguments =
@@ -711,13 +1279,98 @@
 
   static Rti _createBindingRti(
       Object universe, Rti base, Object arguments, String key) {
-    var rti = Rti.allocate();
+    Rti rti = Rti.allocate();
     Rti._setKind(rti, Rti.kindBinding);
     Rti._setPrimary(rti, base);
     Rti._setRest(rti, arguments);
     Rti._setCanonicalRecipe(rti, key);
     return _finishRti(universe, rti);
   }
+
+  static String _canonicalRecipeOfFunction(
+          Rti returnType, _FunctionParameters parameters) =>
+      Rti._getCanonicalRecipe(returnType) +
+      _canonicalRecipeOfFunctionParameters(parameters);
+
+  // TODO(fishythefish): Support required named parameters.
+  static String _canonicalRecipeOfFunctionParameters(
+      _FunctionParameters parameters) {
+    var requiredPositional =
+        _FunctionParameters._getRequiredPositional(parameters);
+    int requiredPositionalLength = _Utils.arrayLength(requiredPositional);
+    var optionalPositional =
+        _FunctionParameters._getOptionalPositional(parameters);
+    int optionalPositionalLength = _Utils.arrayLength(optionalPositional);
+    var optionalNamed = _FunctionParameters._getOptionalNamed(parameters);
+    int optionalNamedLength = _Utils.arrayLength(optionalNamed);
+    assert(optionalPositionalLength == 0 || optionalNamedLength == 0);
+
+    String recipe = Recipe.startFunctionArgumentsString +
+        _canonicalRecipeJoin(requiredPositional);
+
+    if (optionalPositionalLength > 0) {
+      String sep = requiredPositionalLength > 0 ? Recipe.separatorString : '';
+      recipe += sep +
+          Recipe.startOptionalGroupString +
+          _canonicalRecipeJoin(optionalPositional) +
+          Recipe.endOptionalGroupString;
+    }
+
+    if (optionalNamedLength > 0) {
+      String sep = requiredPositionalLength > 0 ? Recipe.separatorString : '';
+      recipe += sep +
+          Recipe.startNamedGroupString +
+          _canonicalRecipeJoinNamed(optionalNamed) +
+          Recipe.endNamedGroupString;
+    }
+
+    return recipe + Recipe.endFunctionArgumentsString;
+  }
+
+  static Rti _lookupFunctionRti(
+      Object universe, Rti returnType, _FunctionParameters parameters) {
+    String key = _canonicalRecipeOfFunction(returnType, parameters);
+    var cache = evalCache(universe);
+    var probe = _cacheGet(cache, key);
+    if (probe != null) return _castToRti(probe);
+    return _createFunctionRti(universe, returnType, parameters, key);
+  }
+
+  static Rti _createFunctionRti(Object universe, Rti returnType,
+      _FunctionParameters parameters, String canonicalRecipe) {
+    Rti rti = Rti.allocate();
+    Rti._setKind(rti, Rti.kindFunction);
+    Rti._setPrimary(rti, returnType);
+    Rti._setRest(rti, parameters);
+    Rti._setCanonicalRecipe(rti, canonicalRecipe);
+    return _finishRti(universe, rti);
+  }
+
+  static String _canonicalRecipeOfGenericFunction(
+          Rti baseFunctionType, Object bounds) =>
+      Rti._getCanonicalRecipe(baseFunctionType) +
+      Recipe.startTypeArgumentsString +
+      _canonicalRecipeJoin(bounds) +
+      Recipe.endTypeArgumentsString;
+
+  static Rti _lookupGenericFunctionRti(
+      Object universe, Rti baseFunctionType, Object bounds) {
+    String key = _canonicalRecipeOfGenericFunction(baseFunctionType, bounds);
+    var cache = evalCache(universe);
+    var probe = _cacheGet(cache, key);
+    if (probe != null) return _castToRti(probe);
+    return _createGenericFunctionRti(universe, baseFunctionType, bounds, key);
+  }
+
+  static Rti _createGenericFunctionRti(Object universe, Rti baseFunctionType,
+      Object bounds, String canonicalRecipe) {
+    Rti rti = Rti.allocate();
+    Rti._setKind(rti, Rti.kindGenericFunction);
+    Rti._setPrimary(rti, baseFunctionType);
+    Rti._setRest(rti, bounds);
+    Rti._setCanonicalRecipe(rti, canonicalRecipe);
+    return _finishRti(universe, rti);
+  }
 }
 
 /// Class of static methods implementing recipe parser.
@@ -874,7 +1527,7 @@
 
   static Rti parse(Object parser) {
     String source = _Parser.recipe(parser);
-    var stack = _Parser.stack(parser);
+    Object stack = _Parser.stack(parser);
     int i = 0;
     while (i < source.length) {
       int ch = charCodeAt(source, i);
@@ -890,11 +1543,19 @@
           case Recipe.separator:
             break;
 
+          case Recipe.nameSeparator:
+            break;
+
           case Recipe.toType:
             push(stack,
                 toType(universe(parser), environment(parser), pop(stack)));
             break;
 
+          case Recipe.genericFunctionTypeParameterIndex:
+            push(stack,
+                toGenericFunctionParameter(universe(parser), pop(stack)));
+            break;
+
           case Recipe.pushDynamic:
             push(stack, _Universe._lookupDynamicRti(universe(parser)));
             break;
@@ -904,8 +1565,7 @@
             break;
 
           case Recipe.startTypeArguments:
-            push(stack, position(parser));
-            setPosition(parser, _Utils.arrayLength(stack));
+            pushStackFrame(parser, stack);
             break;
 
           case Recipe.endTypeArguments:
@@ -917,13 +1577,37 @@
             break;
 
           case Recipe.wrapFutureOr:
-            var u = universe(parser);
+            Object u = universe(parser);
             push(
                 stack,
                 _Universe._lookupFutureOrRti(
                     u, toType(u, environment(parser), pop(stack))));
             break;
 
+          case Recipe.startFunctionArguments:
+            pushStackFrame(parser, stack);
+            break;
+
+          case Recipe.endFunctionArguments:
+            handleFunctionArguments(parser, stack);
+            break;
+
+          case Recipe.startOptionalGroup:
+            pushStackFrame(parser, stack);
+            break;
+
+          case Recipe.endOptionalGroup:
+            handleOptionalGroup(parser, stack);
+            break;
+
+          case Recipe.startNamedGroup:
+            pushStackFrame(parser, stack);
+            break;
+
+          case Recipe.endNamedGroup:
+            handleNamedGroup(parser, stack);
+            break;
+
           default:
             JS('', 'throw "Bad character " + #', ch);
         }
@@ -933,6 +1617,11 @@
     return toType(universe(parser), environment(parser), item);
   }
 
+  static void pushStackFrame(Object parser, Object stack) {
+    push(stack, position(parser));
+    setPosition(parser, _Utils.arrayLength(stack));
+  }
+
   static int handleDigit(int i, int digit, String source, Object stack) {
     int value = Recipe.digitValue(digit);
     for (; i < source.length; i++) {
@@ -971,20 +1660,78 @@
   }
 
   static void handleTypeArguments(Object parser, Object stack) {
-    var universe = _Parser.universe(parser);
-    var arguments = collectArray(parser, stack);
-    var head = pop(stack);
+    Object universe = _Parser.universe(parser);
+    Object arguments = collectArray(parser, stack);
+    Object head = pop(stack);
     if (_Utils.isString(head)) {
       String name = _Utils.asString(head);
       push(stack, _Universe._lookupInterfaceRti(universe, name, arguments));
     } else {
       Rti base = toType(universe, environment(parser), head);
-      push(stack, _Universe._lookupBindingRti(universe, base, arguments));
+      switch (Rti._getKind(base)) {
+        case Rti.kindFunction:
+          push(stack,
+              _Universe._lookupGenericFunctionRti(universe, base, arguments));
+          break;
+
+        default:
+          push(stack, _Universe._lookupBindingRti(universe, base, arguments));
+          break;
+      }
     }
   }
 
+  static const int optionalPositionalSentinel = -1;
+  static const int optionalNamedSentinel = -2;
+
+  static void handleFunctionArguments(Object parser, Object stack) {
+    Object universe = _Parser.universe(parser);
+    _FunctionParameters parameters = _FunctionParameters.allocate();
+    var optionalPositional = _Universe.sharedEmptyArray(universe);
+    var optionalNamed = _Universe.sharedEmptyArray(universe);
+
+    Object head = pop(stack);
+    if (_Utils.isNum(head)) {
+      int sentinel = _Utils.asInt(head);
+      switch (sentinel) {
+        case optionalPositionalSentinel:
+          optionalPositional = pop(stack);
+          break;
+
+        case optionalNamedSentinel:
+          optionalNamed = pop(stack);
+          break;
+
+        default:
+          push(stack, head);
+          break;
+      }
+    } else {
+      push(stack, head);
+    }
+
+    _FunctionParameters._setRequiredPositional(
+        parameters, collectArray(parser, stack));
+    _FunctionParameters._setOptionalPositional(parameters, optionalPositional);
+    _FunctionParameters._setOptionalNamed(parameters, optionalNamed);
+    Rti returnType = toType(universe, environment(parser), pop(stack));
+    push(stack, _Universe._lookupFunctionRti(universe, returnType, parameters));
+  }
+
+  static void handleOptionalGroup(Object parser, Object stack) {
+    Object parameters = collectArray(parser, stack);
+    push(stack, parameters);
+    push(stack, optionalPositionalSentinel);
+  }
+
+  static void handleNamedGroup(Object parser, Object stack) {
+    Object parameters = collectNamed(parser, stack);
+    push(stack, parameters);
+    push(stack, optionalNamedSentinel);
+  }
+
   static void handleExtendedOperations(Object parser, Object stack) {
-    var top = pop(stack);
+    Object top = pop(stack);
     if (0 == top) {
       push(stack, _Universe._lookupNeverRti(universe(parser)));
       return;
@@ -1003,6 +1750,13 @@
     return array;
   }
 
+  static Object collectNamed(Object parser, Object stack) {
+    var array = _Utils.arraySplice(stack, position(parser));
+    toTypesNamed(_Parser.universe(parser), environment(parser), array);
+    setPosition(parser, _Utils.asInt(pop(stack)));
+    return array;
+  }
+
   /// Coerce a stack item into an Rti object. Strings are converted to interface
   /// types, integers are looked up in the type environment.
   static Rti toType(Object universe, Rti environment, Object item) {
@@ -1025,7 +1779,17 @@
     int length = _Utils.arrayLength(items);
     for (int i = 0; i < length; i++) {
       var item = _Utils.arrayAt(items, i);
-      var type = toType(universe, environment, item);
+      Rti type = toType(universe, environment, item);
+      _Utils.arraySetAt(items, i, type);
+    }
+  }
+
+  static void toTypesNamed(Object universe, Rti environment, Object items) {
+    int length = _Utils.arrayLength(items);
+    assert(length.isEven);
+    for (int i = 1; i < length; i += 2) {
+      var item = _Utils.arrayAt(items, i);
+      Rti type = toType(universe, environment, item);
       _Utils.arraySetAt(items, i, type);
     }
   }
@@ -1056,6 +1820,12 @@
     }
     throw AssertionError('Bad index $index for $environment');
   }
+
+  static Rti toGenericFunctionParameter(Object universe, Object item) {
+    assert(_Utils.isNum(item));
+    return _Universe._lookupGenericFunctionParameterRti(
+        universe, _Utils.asInt(item));
+  }
 }
 
 /// Represents the set of supertypes and type variable bindings for a given
@@ -1076,21 +1846,9 @@
 
 // Future entry point from compiled code.
 bool isSubtype(universe, Rti s, Rti t) {
-  // TODO(sra): When more tests are working, remove this rediculous hack.
-  // Temporary 'metering' of isSubtype calls to force tests that endlessly loop
-  // to fail.
-  int next = JS('int', '(#||0) + 1', _ticks);
-  _ticks = next;
-  if (next > 10 * 1000 * 1000) {
-    throw StateError('Too many isSubtype calls'
-        '  ${_rtiToString(s, null)}  <:  ${_rtiToString(t, null)}');
-  }
-
   return _isSubtype(universe, s, null, t, null);
 }
 
-int _ticks = 0;
-
 bool _isSubtype(universe, Rti s, sEnv, Rti t, tEnv) {
   // TODO(fishythefish): Update for NNBD. See
   // https://github.com/dart-lang/language/blob/master/resources/type-system/subtyping.md#rules
@@ -1106,36 +1864,25 @@
     if (isGenericFunctionTypeParameter(t)) return false;
     if (isFutureOrType(t)) {
       // [t] is FutureOr<T>. Check [s] <: T.
-      var tTypeArgument = Rti._getFutureOrArgument(t);
+      Rti tTypeArgument = Rti._getFutureOrArgument(t);
       return _isSubtype(universe, s, sEnv, tTypeArgument, tEnv);
     }
     return false;
   }
 
   // Generic function type parameters must match exactly, which would have
-  // exited earlier. The de Bruijn indexing ensures the representation as a
-  // small number can be used for type comparison.
-  // TODO(fishythefish): Use the bound of the type variable.
+  // exited earlier.
   if (isGenericFunctionTypeParameter(s)) return false;
   if (isGenericFunctionTypeParameter(t)) return false;
 
   if (isNullType(s)) return true;
 
-  if (isFunctionKind(t)) {
-    // TODO(fishythefish): Check if s is a function subtype of t.
-    throw UnimplementedError("isFunctionKind(t)");
-  }
-
-  if (isFunctionKind(s)) {
-    return isFunctionType(t);
-  }
-
   if (isFutureOrType(t)) {
     // [t] is FutureOr<T>.
-    var tTypeArgument = Rti._getFutureOrArgument(t);
+    Rti tTypeArgument = Rti._getFutureOrArgument(t);
     if (isFutureOrType(s)) {
       // [s] is FutureOr<S>. Check S <: T.
-      var sTypeArgument = Rti._getFutureOrArgument(s);
+      Rti sTypeArgument = Rti._getFutureOrArgument(s);
       return _isSubtype(universe, sTypeArgument, sEnv, tTypeArgument, tEnv);
     } else if (_isSubtype(universe, s, sEnv, tTypeArgument, tEnv)) {
       // `true` because [s] <: T.
@@ -1149,6 +1896,14 @@
     }
   }
 
+  if (Rti._isFunctionType(t)) {
+    return _isFunctionSubtype(universe, s, sEnv, t, tEnv);
+  }
+
+  if (Rti._isFunctionType(s)) {
+    return isFunctionType(t);
+  }
+
   assert(Rti._getKind(t) == Rti.kindInterface);
   String tName = Rti._getInterfaceName(t);
   var tArgs = Rti._getInterfaceTypeArguments(t);
@@ -1156,6 +1911,94 @@
   return _isSubtypeOfInterface(universe, s, sEnv, tName, tArgs, tEnv);
 }
 
+// TODO(fishythefish): Support required named parameters.
+bool _isFunctionSubtype(universe, Rti s, sEnv, Rti t, tEnv) {
+  assert(Rti._isFunctionType(t));
+  if (!Rti._isFunctionType(s)) return false;
+
+  if (isGenericFunctionKind(s)) {
+    if (!isGenericFunctionKind(t)) return false;
+    var sBounds = Rti._getGenericFunctionBounds(s);
+    var tBounds = Rti._getGenericFunctionBounds(t);
+    if (!typesEqual(sBounds, tBounds)) return false;
+    // TODO(fishythefish): Extend [sEnv] and [tEnv] with bindings for the [s]
+    // and [t] type parameters to enable checking the bound against
+    // non-type-parameter terms.
+
+    s = Rti._getGenericFunctionBase(s);
+    t = Rti._getGenericFunctionBase(t);
+  } else if (isGenericFunctionKind(t)) {
+    return false;
+  }
+
+  Rti sReturnType = Rti._getReturnType(s);
+  Rti tReturnType = Rti._getReturnType(t);
+  if (!_isSubtype(universe, sReturnType, sEnv, tReturnType, tEnv)) return false;
+
+  _FunctionParameters sParameters = Rti._getFunctionParameters(s);
+  _FunctionParameters tParameters = Rti._getFunctionParameters(t);
+
+  var sRequiredPositional =
+      _FunctionParameters._getRequiredPositional(sParameters);
+  var tRequiredPositional =
+      _FunctionParameters._getRequiredPositional(tParameters);
+  int sRequiredPositionalLength = _Utils.arrayLength(sRequiredPositional);
+  int tRequiredPositionalLength = _Utils.arrayLength(tRequiredPositional);
+  if (sRequiredPositionalLength > tRequiredPositionalLength) return false;
+  int requiredPositionalDelta =
+      tRequiredPositionalLength - sRequiredPositionalLength;
+
+  var sOptionalPositional =
+      _FunctionParameters._getOptionalPositional(sParameters);
+  var tOptionalPositional =
+      _FunctionParameters._getOptionalPositional(tParameters);
+  int sOptionalPositionalLength = _Utils.arrayLength(sOptionalPositional);
+  int tOptionalPositionalLength = _Utils.arrayLength(tOptionalPositional);
+  if (sRequiredPositionalLength + sOptionalPositionalLength <
+      tRequiredPositionalLength + tOptionalPositionalLength) return false;
+
+  for (int i = 0; i < sRequiredPositionalLength; i++) {
+    Rti sParameter = _castToRti(_Utils.arrayAt(sRequiredPositional, i));
+    Rti tParameter = _castToRti(_Utils.arrayAt(tRequiredPositional, i));
+    if (!_isSubtype(universe, tParameter, tEnv, sParameter, sEnv)) return false;
+  }
+
+  for (int i = 0; i < requiredPositionalDelta; i++) {
+    Rti sParameter = _castToRti(_Utils.arrayAt(sOptionalPositional, i));
+    Rti tParameter = _castToRti(
+        _Utils.arrayAt(tRequiredPositional, sRequiredPositionalLength + i));
+    if (!_isSubtype(universe, tParameter, tEnv, sParameter, sEnv)) return false;
+  }
+
+  for (int i = 0; i < tOptionalPositionalLength; i++) {
+    Rti sParameter = _castToRti(
+        _Utils.arrayAt(sOptionalPositional, requiredPositionalDelta + i));
+    Rti tParameter = _castToRti(_Utils.arrayAt(tOptionalPositional, i));
+    if (!_isSubtype(universe, tParameter, tEnv, sParameter, sEnv)) return false;
+  }
+
+  var sOptionalNamed = _FunctionParameters._getOptionalNamed(sParameters);
+  var tOptionalNamed = _FunctionParameters._getOptionalNamed(tParameters);
+  int sOptionalNamedLength = _Utils.arrayLength(sOptionalNamed);
+  int tOptionalNamedLength = _Utils.arrayLength(tOptionalNamed);
+
+  for (int i = 0, j = 0; j < tOptionalNamedLength; j += 2) {
+    String sName;
+    String tName = _Utils.asString(_Utils.arrayAt(tOptionalNamed, j));
+    do {
+      if (i >= sOptionalNamedLength) return false;
+      sName = _Utils.asString(_Utils.arrayAt(sOptionalNamed, i));
+      i += 2;
+    } while (_Utils.stringLessThan(sName, tName));
+    if (_Utils.stringLessThan(tName, sName)) return false;
+    Rti sType = _castToRti(_Utils.arrayAt(sOptionalNamed, i - 1));
+    Rti tType = _castToRti(_Utils.arrayAt(tOptionalNamed, j + 1));
+    if (!_isSubtype(universe, tType, tEnv, sType, sEnv)) return false;
+  }
+
+  return true;
+}
+
 bool _isSubtypeOfInterface(
     universe, Rti s, sEnv, String tName, Object tArgs, tEnv) {
   assert(Rti._getKind(s) == Rti.kindInterface);
@@ -1173,15 +2016,14 @@
     return true;
   }
 
-  // TODO(fishythefish): Should we recursively attempt to find supertypes?
-  var rule = _Universe.findRule(universe, sName);
+  Object rule = _Universe.findRule(universe, sName);
   if (rule == null) return false;
   var supertypeArgs = TypeRule.lookupSupertype(rule, tName);
   if (supertypeArgs == null) return false;
   int length = _Utils.arrayLength(supertypeArgs);
   assert(length == _Utils.arrayLength(tArgs));
   for (int i = 0; i < length; i++) {
-    String recipe = _Utils.arrayAt(supertypeArgs, i);
+    String recipe = _Utils.asString(_Utils.arrayAt(supertypeArgs, i));
     Rti supertypeArg = _Universe.evalInEnvironment(universe, s, recipe);
     Rti tArg = _castToRti(_Utils.arrayAt(tArgs, i));
     if (!_isSubtype(universe, supertypeArg, sEnv, tArg, tEnv)) return false;
@@ -1190,14 +2032,99 @@
   return true;
 }
 
+/// Types are equal if they are structurally equal up to renaming of bound type
+/// variables and equating all top types.
+///
+/// We ignore renaming of bound type variables because we operate on de Bruijn
+/// indices, not names.
+bool typeEqual(Rti s, Rti t) {
+  if (_Utils.isIdentical(s, t)) return true;
+
+  if (isTopType(s)) return isTopType(t);
+
+  int sKind = Rti._getKind(s);
+  int tKind = Rti._getKind(t);
+  if (sKind != tKind) return false;
+
+  switch (sKind) {
+    case Rti.kindStar:
+    case Rti.kindQuestion:
+    case Rti.kindFutureOr:
+      return typeEqual(
+          _castToRti(Rti._getPrimary(s)), _castToRti(Rti._getPrimary(t)));
+
+    case Rti.kindInterface:
+      if (Rti._getInterfaceName(s) != Rti._getInterfaceName(t)) return false;
+      return typesEqual(
+          Rti._getInterfaceTypeArguments(s), Rti._getInterfaceTypeArguments(t));
+
+    case Rti.kindBinding:
+      return typeEqual(Rti._getBindingBase(s), Rti._getBindingBase(t)) &&
+          typesEqual(Rti._getBindingArguments(s), Rti._getBindingArguments(t));
+
+    case Rti.kindFunction:
+      return typeEqual(Rti._getReturnType(s), Rti._getReturnType(t)) &&
+          functionParametersEqual(
+              Rti._getFunctionParameters(s), Rti._getFunctionParameters(t));
+
+    case Rti.kindGenericFunction:
+      return typeEqual(
+              Rti._getGenericFunctionBase(s), Rti._getGenericFunctionBase(t)) &&
+          typesEqual(Rti._getGenericFunctionBounds(s),
+              Rti._getGenericFunctionBounds(t));
+
+    default:
+      return false;
+  }
+}
+
+bool typesEqual(Object sArray, Object tArray) {
+  int sLength = _Utils.arrayLength(sArray);
+  int tLength = _Utils.arrayLength(tArray);
+  if (sLength != tLength) return false;
+  for (int i = 0; i < sLength; i++) {
+    if (!typeEqual(_castToRti(_Utils.arrayAt(sArray, i)),
+        _castToRti(_Utils.arrayAt(tArray, i)))) return false;
+  }
+  return true;
+}
+
+bool namedTypesEqual(Object sArray, Object tArray) {
+  int sLength = _Utils.arrayLength(sArray);
+  int tLength = _Utils.arrayLength(tArray);
+  assert(sLength.isEven);
+  assert(tLength.isEven);
+  if (sLength != tLength) return false;
+  for (int i = 0; i < sLength; i += 2) {
+    if (_Utils.asString(_Utils.arrayAt(sArray, i)) !=
+        _Utils.asString(_Utils.arrayAt(tArray, i))) return false;
+    if (!typeEqual(_castToRti(_Utils.arrayAt(sArray, i + 1)),
+        _castToRti(_Utils.arrayAt(tArray, i + 1)))) return false;
+  }
+  return true;
+}
+
+// TODO(fishythefish): Support required named parameters.
+bool functionParametersEqual(
+        _FunctionParameters sParameters, _FunctionParameters tParameters) =>
+    typesEqual(_FunctionParameters._getRequiredPositional(sParameters),
+        _FunctionParameters._getRequiredPositional(tParameters)) &&
+    typesEqual(_FunctionParameters._getOptionalPositional(sParameters),
+        _FunctionParameters._getOptionalPositional(tParameters)) &&
+    namedTypesEqual(_FunctionParameters._getOptionalNamed(sParameters),
+        _FunctionParameters._getOptionalNamed(tParameters));
+
 bool isTopType(Rti t) =>
     isDynamicType(t) || isVoidType(t) || isObjectType(t) || isJsInteropType(t);
 
 bool isDynamicType(Rti t) => Rti._getKind(t) == Rti.kindDynamic;
 bool isVoidType(Rti t) => Rti._getKind(t) == Rti.kindVoid;
 bool isJsInteropType(Rti t) => Rti._getKind(t) == Rti.kindAny;
+
 bool isFutureOrType(Rti t) => Rti._getKind(t) == Rti.kindFutureOr;
-bool isFunctionKind(Rti t) => Rti._getKind(t) == Rti.kindFunction;
+
+bool isGenericFunctionKind(Rti t) => Rti._getKind(t) == Rti.kindGenericFunction;
+
 bool isGenericFunctionTypeParameter(Rti t) =>
     Rti._getKind(t) == Rti.kindGenericFunctionParameter;
 
@@ -1237,7 +2164,7 @@
 
   static Object arrayAt(Object array, int i) => JS('', '#[#]', array, i);
 
-  static Object arraySetAt(Object array, int i, Object value) {
+  static void arraySetAt(Object array, int i, Object value) {
     JS('', '#[#] = #', array, i, value);
   }
 
@@ -1254,6 +2181,9 @@
   static String substring(String s, int start, int end) =>
       JS('String', '#.substring(#, #)', s, start, end);
 
+  static bool stringLessThan(String s1, String s2) =>
+      JS('bool', '# < #', s1, s2);
+
   static mapGet(cache, key) => JS('', '#.get(#)', cache, key);
 
   static void mapSet(cache, key, value) {
diff --git a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
index 95231a0..50cf7e8 100644
--- a/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
+++ b/sdk/lib/_internal/js_runtime/lib/shared/embedded_names.dart
@@ -325,6 +325,24 @@
 
   /// String representation of the type of the function class.
   FUNCTION_CLASS_TYPE_NAME,
+
+  /// String recipe for the [bool] type.
+  BOOL_RECIPE,
+
+  /// String recipe for the [double] type.
+  DOUBLE_RECIPE,
+
+  /// String recipe for the [int] type.
+  INT_RECIPE,
+
+  /// String recipe for the [num] type.
+  NUM_RECIPE,
+
+  /// String recipe for the [String] type.
+  STRING_RECIPE,
+
+  /// Property name for Rti._is field.
+  RTI_FIELD_IS,
 }
 
 enum JsBuiltin {
@@ -336,6 +354,15 @@
   ///       ...
   dartObjectConstructor,
 
+  /// Returns the JavaScript constructor function for the runtime's Closure
+  /// class, the base class of all closure objects.  This can be used for type
+  /// tests, as in
+  ///
+  ///     var constructor = JS_BUILTIN('', JsBuiltin.dartClosureConstructor);
+  ///     if (JS('bool', '# instanceof #', obj, constructor))
+  ///       ...
+  dartClosureConstructor,
+
   /// Returns the JavaScript-constructor name given an [isCheckProperty].
   ///
   /// This relies on a deterministic encoding of is-check properties (for
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index 82b88ee..95a8b97 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -100,6 +100,63 @@
   const factory Stream.empty() = _EmptyStream<T>;
 
   /**
+   * Creates a stream which emits a single data event before completing.
+   *
+   * This stream emits a single data event of [value]
+   * and then completes with a done event.
+   *
+   * Example:
+   * ```dart
+   * Future<void> printThings(Stream<String> data) async {
+   *   await for (var x in data) {
+   *     print(x);
+   *   }
+   * }
+   * printThings(Stream<String>.value("ok")); // prints "ok".
+   * ```
+   *
+   * The returned stream is effectively equivalent to one created by
+   * `(() async* { yield value; } ())` or `Future<T>.value(value).asStream()`.
+   */
+  @Since("2.5")
+  factory Stream.value(T value) =>
+      (_AsyncStreamController<T>(null, null, null, null)
+            .._add(value)
+            .._closeUnchecked())
+          .stream;
+
+  /**
+   * Creates a stream which emits a single error event before completing.
+   *
+   * This stream emits a single error event of [error] and [stackTrace]
+   * and then completes with a done event.
+   *
+   * Example:
+   * ```dart
+   * Future<void> tryThings(Stream<int> data) async {
+   *   try {
+   *     await for (var x in data) {
+   *       print("Data: $x");
+   *     }
+   *   } catch (e) {
+   *     print(e);
+   *   }
+   * }
+   * tryThings(Stream<int>.error("Error")); // prints "Error".
+   * ```
+   * The returned stream is effectively equivalent to one created by
+   * `Future<T>.error(error, stackTrace).asStream()`, by or
+   * `(() async* { throw error; } ())`, except that you can control the
+   * stack trace as well.
+   */
+  @Since("2.5")
+  factory Stream.error(Object error, [StackTrace stackTrace]) =>
+      (_AsyncStreamController<T>(null, null, null, null)
+            .._addError(error, stackTrace)
+            .._closeUnchecked())
+          .stream;
+
+  /**
    * Creates a new single-subscription stream from the future.
    *
    * When the future completes, the stream will fire one event, either
@@ -109,7 +166,8 @@
     // Use the controller's buffering to fill in the value even before
     // the stream has a listener. For a single value, it's not worth it
     // to wait for a listener before doing the `then` on the future.
-    _StreamController<T> controller = new StreamController<T>(sync: true);
+    _StreamController<T> controller =
+        new _SyncStreamController<T>(null, null, null, null);
     future.then((value) {
       controller._add(value);
       controller._closeUnchecked();
@@ -136,7 +194,8 @@
    * If [futures] is empty, the stream closes as soon as possible.
    */
   factory Stream.fromFutures(Iterable<Future<T>> futures) {
-    _StreamController<T> controller = new StreamController<T>(sync: true);
+    _StreamController<T> controller =
+        new _SyncStreamController<T>(null, null, null, null);
     int count = 0;
     // Declare these as variables holding closures instead of as
     // function declarations.
@@ -1502,8 +1561,11 @@
 
     void onData(T event) {
       timer.cancel();
-      controller.add(event);
       timer = zone.createTimer(timeLimit, timeout);
+      // It might close the stream and cancel timer, so create recuring Timer
+      // before calling into add();
+      // issue: https://github.com/dart-lang/sdk/issues/37565
+      controller.add(event);
     }
 
     void onError(error, StackTrace stackTrace) {
diff --git a/sdk/lib/collection/list.dart b/sdk/lib/collection/list.dart
index 77ce66a..1d83aa4 100644
--- a/sdk/lib/collection/list.dart
+++ b/sdk/lib/collection/list.dart
@@ -67,6 +67,7 @@
     }
   }
 
+  @pragma("vm:prefer-inline")
   bool get isEmpty => length == 0;
 
   bool get isNotEmpty => !isEmpty;
diff --git a/sdk/lib/core/date_time.dart b/sdk/lib/core/date_time.dart
index 00ea5a4..dd242de 100644
--- a/sdk/lib/core/date_time.dart
+++ b/sdk/lib/core/date_time.dart
@@ -248,7 +248,7 @@
    *   part and an optional two digit minute part. The sign must be either
    *   "+" or "-", and can not be omitted.
    *   The minutes may be separated from the hours by a ':'.
-   *   Examples: "Z", "-10", "01:30", "1130".
+   *   Examples: "Z", "-10", "+01:30", "+1130".
    *
    * This includes the output of both [toString] and [toIso8601String], which
    * will be parsed back into a `DateTime` object with the same time as the
diff --git a/sdk/lib/core/int.dart b/sdk/lib/core/int.dart
index 2c4a3ca..bc493fb 100644
--- a/sdk/lib/core/int.dart
+++ b/sdk/lib/core/int.dart
@@ -64,7 +64,7 @@
    * of `this` and [other]
    *
    * If both operands are non-negative, the result is non-negative,
-   * otherwise the result us negative.
+   * otherwise the result is negative.
    */
   int operator |(int other);
 
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 044c863..2ca94a1 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -1254,11 +1254,11 @@
    * defaults ot the end of the string.
    *
    * Some examples of IPv6 addresses:
-   *  * ::1
-   *  * FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
-   *  * 3ffe:2a00:100:7031::1
-   *  * ::FFFF:129.144.52.38
-   *  * 2010:836B:4179::836B:4179
+   *  * `::1`
+   *  * `FEDC:BA98:7654:3210:FEDC:BA98:7654:3210`
+   *  * `3ffe:2a00:100:7031::1`
+   *  * `::FFFF:129.144.52.38`
+   *  * `2010:836B:4179::836B:4179`
    */
   static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
     end ??= host.length;
diff --git a/sdk/lib/ffi/ffi.dart b/sdk/lib/ffi/ffi.dart
index 4b9a50f..85837e1 100644
--- a/sdk/lib/ffi/ffi.dart
+++ b/sdk/lib/ffi/ffi.dart
@@ -6,6 +6,8 @@
 /// {@nodoc}
 library dart.ffi;
 
+import 'dart:typed_data' show TypedData;
+
 part "native_type.dart";
 part "annotations.dart";
 part "dynamic_library.dart";
@@ -22,8 +24,6 @@
 /// Represents a pointer into the native C memory. Cannot be extended.
 @pragma("vm:entry-point")
 class Pointer<T extends NativeType> extends NativeType {
-  const Pointer();
-
   /// Allocate [count] elements of type [T] on the native heap via malloc() and
   /// return a pointer to the newly allocated memory.
   ///
@@ -93,6 +93,35 @@
   /// Note that this zeros out the address.
   external void free();
 
+  /// Creates an *external* typed data array backed by this pointer.
+  ///
+  /// The typed data array returned is only valid for as long as the backing
+  /// [Pointer]. Accessing any element of the type data array after this
+  /// [Pointer] has been [Pointer.free()]d will cause undefined behavior.
+  ///
+  /// Since [Pointer]s do not know their length, the size of the typed data is
+  /// controlled by `count`, in units of the size of the native type for this
+  /// [Pointer] (similarly to [Pointer.allocate]).
+  ///
+  /// The kind of TypedData produced depends on the native type:
+  ///
+  ///   Pointer<Int8> -> Int8List
+  ///   Pointer<Uint8> -> Uint8List
+  ///   etc. up to Int64/Uint64
+  ///   Pointer<IntPtr> -> Int32List/Int64List depending on platform word size
+  ///   Pointer<Float> -> Float32List
+  ///   Pointer<Double> -> Float64List
+  ///
+  /// Creation of a [Uint8ClampedList] is not supported. Creation of a typed
+  /// data from a [Pointer] to any other native type is not supported.
+  ///
+  /// The pointer must be aligned to a multiple of the native type's size.
+  //
+  // TODO(37773): Use extension methods to articulate more precise return types.
+  // We should still keep this member though as a generic way to access a
+  // Pointer of unknown type.
+  external TypedData asExternalTypedData({int count: 1});
+
   /// Equality for Pointers only depends on their address.
   bool operator ==(other) {
     if (other == null) return false;
diff --git a/sdk/lib/html/dart2js/html_dart2js.dart b/sdk/lib/html/dart2js/html_dart2js.dart
index e9c8707..0752d4e6 100644
--- a/sdk/lib/html/dart2js/html_dart2js.dart
+++ b/sdk/lib/html/dart2js/html_dart2js.dart
@@ -2676,7 +2676,7 @@
     JS(
         'void',
         'typeof #.lineDashOffset != "undefined" ? #.lineDashOffset = # : '
-        '#.webkitLineDashOffset = #',
+            '#.webkitLineDashOffset = #',
         this,
         this,
         value,
@@ -3755,7 +3755,7 @@
     return JS(
         'String',
         r'#.replace(/-([\da-z])/ig,'
-        r'function(_, letter) { return letter.toUpperCase();})',
+            r'function(_, letter) { return letter.toUpperCase();})',
         replacedMs);
   }
 
@@ -9845,7 +9845,7 @@
   String get visibilityState => JS(
       'String',
       '(#.visibilityState || #.mozVisibilityState || #.msVisibilityState ||'
-      '#.webkitVisibilityState)',
+          '#.webkitVisibilityState)',
       this,
       this,
       this,
@@ -13199,6 +13199,9 @@
 
   String get innerHtml => _innerHtml;
 
+  @JSName('innerText')
+  String innerText;
+
   /**
    * This is an ease-of-use accessor for event streams which should only be
    * used when an explicit accessor is not available.
@@ -13944,8 +13947,6 @@
   @JSName('innerHTML')
   String _innerHtml;
 
-  String innerText;
-
   @JSName('localName')
   final String _localName;
 
@@ -21429,7 +21430,7 @@
     return JS(
         'MutationObserver',
         'new(window.MutationObserver||window.WebKitMutationObserver||'
-        'window.MozMutationObserver)(#)',
+            'window.MozMutationObserver)(#)',
         convertDartClosureToJS(_wrapBinaryZone(callback), 2));
   }
 }
@@ -21566,8 +21567,8 @@
       JS(
           'void',
           '#.getUserMedia = '
-          '(#.getUserMedia || #.webkitGetUserMedia || #.mozGetUserMedia ||'
-          '#.msGetUserMedia)',
+              '(#.getUserMedia || #.webkitGetUserMedia || #.mozGetUserMedia ||'
+              '#.msGetUserMedia)',
           this,
           this,
           this,
@@ -22988,8 +22989,7 @@
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
   CanvasPattern createPattern(
-      /*CanvasImageSource*/ image,
-      String repetitionType) native;
+      /*CanvasImageSource*/ image, String repetitionType) native;
 
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
@@ -23365,8 +23365,7 @@
   CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) native;
 
   CanvasPattern createPattern(
-      /*CanvasImageSource*/ image,
-      String repetitionType) native;
+      /*CanvasImageSource*/ image, String repetitionType) native;
 
   CanvasGradient createRadialGradient(
       num x0, num y0, num r0, num x1, num y1, num r1) native;
@@ -24372,10 +24371,12 @@
 
   void refresh(bool reload) native;
 }
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
+// 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.
 
+// WARNING: Do not edit - generated code.
+
 @Native("PointerEvent")
 class PointerEvent extends MouseEvent {
   // To suppress missing implicit constructor warnings.
@@ -24416,6 +24417,17 @@
   final num width;
 
   List<PointerEvent> getCoalescedEvents() native;
+
+  /**
+   * PointerEvent used for both touch and mouse.  To check if touch is supported
+   * call the property TouchEvent.supported
+   */
+  static bool get supported {
+    try {
+      return PointerEvent('pointerover') is PointerEvent;
+    } catch (_) {}
+    return false;
+  }
 }
 // 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
@@ -26651,7 +26663,7 @@
   static bool get supported => JS(
       'bool',
       '!!(Element.prototype.createShadowRoot||'
-      'Element.prototype.webkitCreateShadowRoot)');
+          'Element.prototype.webkitCreateShadowRoot)');
 
   static bool _shadowRootDeprecationReported = false;
   static void _shadowRootDeprecationReport() {
@@ -28900,11 +28912,14 @@
 
   /**
    * Checks if touch events supported on the current platform.
-   *
-   * Note that touch events are only supported if the user is using a touch
-   * device.
    */
-  static bool get supported => Device.isEventTypeSupported('TouchEvent');
+  static bool get supported {
+    try {
+      return TouchEvent('touches') is TouchEvent;
+    } catch (_) {}
+
+    return false;
+  }
 }
 // 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
@@ -30549,7 +30564,7 @@
   // TODO: consider forcing users to do: window.location.assign('string').
   /**
    * Sets the window's location, which causes the browser to navigate to the new
-   * location. [value] may be a Location object or a String.
+   * location.
    */
   set location(value) {
     _location = value;
@@ -34572,12 +34587,14 @@
    *     var other = window.open('http://www.example.com', 'foo');
    *     // Closes other window, as it is script-closeable.
    *     other.close();
-   *     print(other.closed()); // 'true'
+   *     print(other.closed); // 'true'
    *
-   *     window.location('http://www.mysite.com', 'foo');
+   *     var newLocation = window.location
+   *         ..href = 'http://www.mysite.com';
+   *     window.location = newLocation;
    *     // Does not close this window, as the history has changed.
    *     window.close();
-   *     print(window.closed()); // 'false'
+   *     print(window.closed); // 'false'
    *
    * See also:
    *
@@ -38909,17 +38926,17 @@
     JS(
         'void',
         "Object.defineProperty(#, 'keyCode', {"
-        "  get : function() { return this.keyCodeVal; } })",
+            "  get : function() { return this.keyCodeVal; } })",
         eventObj);
     JS(
         'void',
         "Object.defineProperty(#, 'which', {"
-        "  get : function() { return this.keyCodeVal; } })",
+            "  get : function() { return this.keyCodeVal; } })",
         eventObj);
     JS(
         'void',
         "Object.defineProperty(#, 'charCode', {"
-        "  get : function() { return this.charCodeVal; } })",
+            "  get : function() { return this.charCodeVal; } })",
         eventObj);
 
     var keyIdentifier = _convertToHexString(charCode, keyCode);
@@ -38942,7 +38959,7 @@
   static bool get canUseDispatchEvent => JS(
       'bool',
       '(typeof document.body.dispatchEvent == "function")'
-      '&& document.body.dispatchEvent.length > 0');
+          '&& document.body.dispatchEvent.length > 0');
 
   /** The currently registered target for this event. */
   EventTarget get currentTarget => _currentTarget;
diff --git a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
index 50962df..b664b7d 100644
--- a/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
+++ b/sdk/lib/indexed_db/dart2js/indexed_db_dart2js.dart
@@ -464,8 +464,8 @@
     return JS(
         'bool',
         '!!(window.indexedDB || '
-        'window.webkitIndexedDB || '
-        'window.mozIndexedDB)');
+            'window.webkitIndexedDB || '
+            'window.mozIndexedDB)');
   }
 
   Future<Database> open(String name,
diff --git a/sdk/lib/internal/iterable.dart b/sdk/lib/internal/iterable.dart
index 10f0898..b3e8e4e 100644
--- a/sdk/lib/internal/iterable.dart
+++ b/sdk/lib/internal/iterable.dart
@@ -331,6 +331,7 @@
 
   E get current => _current;
 
+  @pragma("vm:prefer-inline")
   bool moveNext() {
     int length = _iterable.length;
     if (_length != length) {
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index 2f51fe9..33c615d 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -414,7 +414,7 @@
     if (sink is! ByteConversionSink) {
       sink = new ByteConversionSink.from(sink);
     }
-    return new _ZLibEncoderSink(
+    return new _ZLibEncoderSink._(
         sink, gzip, level, windowBits, memLevel, strategy, dictionary, raw);
   }
 }
@@ -476,7 +476,7 @@
     if (sink is! ByteConversionSink) {
       sink = new ByteConversionSink.from(sink);
     }
-    return new _ZLibDecoderSink(sink, windowBits, dictionary, raw);
+    return new _ZLibDecoderSink._(sink, windowBits, dictionary, raw);
   }
 }
 
@@ -562,7 +562,7 @@
 }
 
 class _ZLibEncoderSink extends _FilterSink {
-  _ZLibEncoderSink(
+  _ZLibEncoderSink._(
       ByteConversionSink sink,
       bool gzip,
       int level,
@@ -578,7 +578,7 @@
 }
 
 class _ZLibDecoderSink extends _FilterSink {
-  _ZLibDecoderSink(
+  _ZLibDecoderSink._(
       ByteConversionSink sink, int windowBits, List<int> dictionary, bool raw)
       : super(sink,
             RawZLibFilter._makeZLibInflateFilter(windowBits, dictionary, raw));
diff --git a/sdk/lib/io/file.dart b/sdk/lib/io/file.dart
index 768ba51..861ce47 100644
--- a/sdk/lib/io/file.dart
+++ b/sdk/lib/io/file.dart
@@ -483,7 +483,7 @@
    * must be read to completion or the subscription on the stream must
    * be cancelled.
    */
-  Stream<Uint8List> openRead([int start, int end]);
+  Stream<List<int>> openRead([int start, int end]);
 
   /**
    * Creates a new independent [IOSink] for the file. The
diff --git a/sdk/lib/io/file_impl.dart b/sdk/lib/io/file_impl.dart
index 66a4134..410182c 100644
--- a/sdk/lib/io/file_impl.dart
+++ b/sdk/lib/io/file_impl.dart
@@ -7,7 +7,7 @@
 // Read the file in blocks of size 64k.
 const int _blockSize = 64 * 1024;
 
-class _FileStream extends Stream<Uint8List> {
+class _FileStream extends Stream<List<int>> {
   // Stream controller.
   StreamController<Uint8List> _controller;
 
@@ -498,7 +498,7 @@
     return new _RandomAccessFile(id, "");
   }
 
-  Stream<Uint8List> openRead([int start, int end]) {
+  Stream<List<int>> openRead([int start, int end]) {
     return new _FileStream(path, start, end);
   }
 
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index c37f75e..d7c7ff7 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -460,7 +460,7 @@
   bool _filterPending = false;
   bool _filterActive = false;
 
-  _SecureFilter _secureFilter = new _SecureFilter();
+  _SecureFilter _secureFilter = new _SecureFilter._();
   String _selectedProtocol;
 
   static Future<_RawSecureSocket> connect(
@@ -1226,7 +1226,7 @@
 }
 
 abstract class _SecureFilter {
-  external factory _SecureFilter();
+  external factory _SecureFilter._();
 
   void connect(
       String hostName,
diff --git a/sdk/lib/io/socket.dart b/sdk/lib/io/socket.dart
index 8d76549..df60490 100644
--- a/sdk/lib/io/socket.dart
+++ b/sdk/lib/io/socket.dart
@@ -710,7 +710,7 @@
  * The [Socket] exposes both a [Stream] and a [IOSink] interface, making it
  * ideal for using together with other [Stream]s.
  */
-abstract class Socket implements Stream<List<int>>, IOSink {
+abstract class Socket implements Stream<Uint8List>, IOSink {
   /**
    * Creates a new socket connection to the host and port and returns a [Future]
    * that will complete with either a [Socket] once connected or an error
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index e786e16..a697db4 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -755,7 +755,7 @@
   String toString() => _description;
 }
 
-/*
+/**
  * An efficiently transferable sequence of byte values.
  *
  * A [TransferableTypedData] is created from a number of bytes.
diff --git a/sdk/lib/libraries.json b/sdk/lib/libraries.json
index 30197aa2..4bf7129 100644
--- a/sdk/lib/libraries.json
+++ b/sdk/lib/libraries.json
@@ -65,9 +65,9 @@
       },
       "ffi": {
         "patches": [
+          "../../runtime/lib/ffi_patch.dart",
           "../../runtime/lib/ffi_dynamic_library_patch.dart",
-          "../../runtime/lib/ffi_native_type_patch.dart",
-          "../../runtime/lib/ffi_patch.dart"
+          "../../runtime/lib/ffi_native_type_patch.dart"
         ],
         "uri": "ffi/ffi.dart"
       },
diff --git a/sdk/lib/libraries.yaml b/sdk/lib/libraries.yaml
index 8eea310..01144b8 100644
--- a/sdk/lib/libraries.yaml
+++ b/sdk/lib/libraries.yaml
@@ -90,9 +90,9 @@
     ffi:
       uri: "ffi/ffi.dart"
       patches:
+        - "../../runtime/lib/ffi_patch.dart"
         - "../../runtime/lib/ffi_dynamic_library_patch.dart"
         - "../../runtime/lib/ffi_native_type_patch.dart"
-        - "../../runtime/lib/ffi_patch.dart"
 
     _http:
       uri: "_http/http.dart"
diff --git a/sdk/lib/vmservice/message.dart b/sdk/lib/vmservice/message.dart
index 570b9ec..9e4375a 100644
--- a/sdk/lib/vmservice/message.dart
+++ b/sdk/lib/vmservice/message.dart
@@ -241,7 +241,12 @@
   }
 
   void _setResponseFromPort(dynamic response) {
-    _completer.complete(new Response.from(response));
+    if (response == null) {
+      // We should only have a null response for Notifications.
+      assert(type == MessageType.Notification);
+      return null;
+    }
+    _completer.complete(Response.from(response));
   }
 
   void setResponse(String response) {
diff --git a/sdk/lib/vmservice/vmservice.dart b/sdk/lib/vmservice/vmservice.dart
index 636feb9..0c340ee 100644
--- a/sdk/lib/vmservice/vmservice.dart
+++ b/sdk/lib/vmservice/vmservice.dart
@@ -228,12 +228,12 @@
     }
     for (var service in client.services.keys) {
       _eventMessageHandler(
-          '_Service',
+          'Service',
           new Response.json({
             'jsonrpc': '2.0',
             'method': 'streamNotify',
             'params': {
-              'streamId': '_Service',
+              'streamId': 'Service',
               'event': {
                 "type": "Event",
                 "kind": "ServiceUnregistered",
@@ -420,7 +420,7 @@
     return null;
   }
 
-  static const kServiceStream = '_Service';
+  static const kServiceStream = 'Service';
   static const serviceStreams = const [kServiceStream];
 
   Future<String> _streamListen(Message message) async {
@@ -597,7 +597,13 @@
   }
 
   Future<Response> routeRequest(VMService _, Message message) async {
-    return new Response.from(await _routeRequestImpl(message));
+    final response = await _routeRequestImpl(message);
+    if (response == null) {
+      // We should only have a null response for Notifications.
+      assert(message.type == MessageType.Notification);
+      return null;
+    }
+    return new Response.from(response);
   }
 
   Future _routeRequestImpl(Message message) async {
@@ -611,7 +617,7 @@
       if (message.method == 'streamCancel') {
         return await _streamCancel(message);
       }
-      if (message.method == '_registerService') {
+      if (message.method == 'registerService') {
         return await _registerService(message);
       }
       if (message.method == '_spawnUri') {
diff --git a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
index 4ded0e1..ef2ee67 100644
--- a/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
+++ b/sdk/lib/web_audio/dart2js/web_audio_dart2js.dart
@@ -190,7 +190,7 @@
     var function = JS(
         '=Object',
         '#.createScriptProcessor || '
-        '#.createJavaScriptNode',
+            '#.createJavaScriptNode',
         this,
         this);
     if (numberOfOutputChannels != null) {
diff --git a/tests/README b/tests/README
deleted file mode 100644
index 41f95e6..0000000
--- a/tests/README
+++ /dev/null
@@ -1,43 +0,0 @@
-Run Existing Tests
-==================
-
-See the output of
-
-  ../tools/test.py --help
-
-for how to run tests.
-
-See also
-
-  https://code.google.com/p/dart/wiki/Building#Testing
-
-for detailed examples.
-
-Create New Tests
-================
-
-See comments above
-
-  factory StandardTestSuite.forDirectory
-
-in
-
-  ../pkg/test_runner/lib/src/test_suite.dart
-
-for the default test directory layout. By default test-file names must
-end in "_test.dart", but some test suites, such as ./co19, subclass
-StandardTestSuite and override this default.
-
-See comments at the beginning of
-
-  ../pkg/test_runner/lib/src/multitest.dart
-
-for how to create tests that pass by failing with a known error. For
-example,
-
-  ...
-  int x = "not an int"; //# 01: static type warning
-  ...
-
-as part of a test will only pass the "--compiler dart2analyzer" test if
-the assignment generates a static type warning.
diff --git a/tests/README.md b/tests/README.md
new file mode 100644
index 0000000..59159c5
--- /dev/null
+++ b/tests/README.md
@@ -0,0 +1,2 @@
+This directory contains tests of the language and core library implementations.
+For more information, see https://github.com/dart-lang/sdk/wiki/Testing.
diff --git a/tests/co19_2/co19_2-dart2js.status b/tests/co19_2/co19_2-dart2js.status
index b51c141..387bd0e 100644
--- a/tests/co19_2/co19_2-dart2js.status
+++ b/tests/co19_2/co19_2-dart2js.status
@@ -2,8 +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.
 
-[ $builder_tag != run_webgl_tests && $compiler == dart2js ]
-LayoutTests/fast/canvas/webgl*: Skip # Only run WebGL on special builders, issue 29961
+[ $compiler == dartdevc ]
+LanguageFeatures/Extension-methods/*: SkipByDesign # Analyzer DDC is expected to be turned down before releasing extension methods.
 
 [ $compiler == dart2js && $runtime == d8 ]
 LayoutTests/*: SkipByDesign # d8 is not a browser
@@ -33,8 +33,10 @@
 
 [ $compiler == dart2js || $compiler == dartdevc || $compiler == dartdevk ]
 Language/Expressions/Spawning_an_Isolate/new_isolate_t01: SkipByDesign
+LayoutTests/*: Skip # These tests are going to be removed.
 LibTest/io/*: SkipByDesign # dart:io not supported.
 LibTest/isolate/*: SkipByDesign # dart:isolate not supported.
+WebPlatformTest/*: Skip # These tests are going to be removed.
 
 [ $compiler == dartdevc || $compiler == dartdevk ]
 Language/Classes/Constructors/Generative_Constructors/formal_parameter_t07: Skip # Times out
diff --git a/tests/co19_2/co19_2-kernel.status b/tests/co19_2/co19_2-kernel.status
index e74c130..e074d1d 100644
--- a/tests/co19_2/co19_2-kernel.status
+++ b/tests/co19_2/co19_2-kernel.status
@@ -5,6 +5,11 @@
 [ $compiler == dartk ]
 LanguageFeatures/Set-literals/syntax_compatibility_A01_t02: RuntimeError
 
+[ $compiler == dartkb ]
+LibTest/isolate/Isolate/kill_A01_t01: Skip # Issue 37699
+LibTest/isolate/Isolate/pause_A01_t01: Skip # Issue 37699
+LibTest/isolate/Isolate/pause_A01_t02: Skip # Issue 37699
+
 [ $compiler == dartkp ]
 Language/Expressions/Instance_Creation/New/evaluation_t20: RuntimeError
 Language/Libraries_and_Scripts/Imports/deferred_import_t01: RuntimeError
diff --git a/tests/compiler/dart2js/analyses/analysis_helper.dart b/tests/compiler/dart2js/analyses/analysis_helper.dart
index 8dd2091..4b6234d 100644
--- a/tests/compiler/dart2js/analyses/analysis_helper.dart
+++ b/tests/compiler/dart2js/analyses/analysis_helper.dart
@@ -17,11 +17,10 @@
 import 'package:compiler/src/ir/util.dart';
 import 'package:compiler/src/kernel/dart2js_target.dart';
 import 'package:compiler/src/kernel/loader.dart';
-import 'package:compiler/src/util/uri_extras.dart';
 import 'package:expect/expect.dart';
 import 'package:front_end/src/api_prototype/constant_evaluator.dart' as ir;
 import 'package:front_end/src/api_unstable/dart2js.dart'
-    show isRedirectingFactory;
+    show isRedirectingFactory, relativizeUri;
 import 'package:kernel/ast.dart' as ir;
 import 'package:kernel/class_hierarchy.dart' as ir;
 import 'package:kernel/core_types.dart' as ir;
@@ -82,10 +81,9 @@
             new ir.TypeEnvironment(new ir.CoreTypes(component), classHierarchy),
             classHierarchy) {
     _constantEvaluator = new ir.ConstantEvaluator(
-        const Dart2jsConstantsBackend(),
+        const Dart2jsConstantsBackend(supportsUnevaluatedConstants: true),
         const {},
         typeEnvironment,
-        false,
         const ir.SimpleErrorReporter());
   }
 
@@ -241,11 +239,11 @@
 ********************************************************************************
 *  Unexpected dynamic invocations found by test:
 *
-*    ${relativize(Uri.base, Platform.script, Platform.isWindows)}
+*    ${relativizeUri(Uri.base, Platform.script, Platform.isWindows)}
 *
 *  Please address the reported errors, or, if the errors are as expected, run
 *
-*    dart ${relativize(Uri.base, Platform.script, Platform.isWindows)} -g
+*    dart ${relativizeUri(Uri.base, Platform.script, Platform.isWindows)} -g
 *
 *  to update the expectation file.
 ********************************************************************************
@@ -373,7 +371,7 @@
   void registerError(ir.Node node, String message) {
     SourceSpan span = computeSourceSpanFromTreeNode(node);
     Uri uri = span.uri;
-    String uriString = relativize(Uri.base, uri, Platform.isWindows);
+    String uriString = relativizeUri(Uri.base, uri, Platform.isWindows);
     Map<String, List<DiagnosticMessage>> actualMap = _actualMessages
         .putIfAbsent(uriString, () => <String, List<DiagnosticMessage>>{});
     if (uri.scheme == 'org-dartlang-sdk') {
diff --git a/tests/compiler/dart2js/analyses/api_allowed.json b/tests/compiler/dart2js/analyses/api_allowed.json
index cec99f0..a97e98f 100644
--- a/tests/compiler/dart2js/analyses/api_allowed.json
+++ b/tests/compiler/dart2js/analyses/api_allowed.json
@@ -237,8 +237,6 @@
     "Dynamic invocation of 'close'.": 1
   },
   "org-dartlang-sdk:///sdk/lib/_http/websocket_impl.dart": {
-    "Dynamic invocation of 'transform'.": 1,
-    "Dynamic invocation of 'listen'.": 1,
     "Dynamic access of 'address'.": 1,
     "Dynamic access of 'host'.": 1,
     "Dynamic access of 'port'.": 1,
diff --git a/tests/compiler/dart2js/annotations/annotations_test.dart b/tests/compiler/dart2js/annotations/annotations_test.dart
new file mode 100644
index 0000000..b590f6e
--- /dev/null
+++ b/tests/compiler/dart2js/annotations/annotations_test.dart
@@ -0,0 +1,102 @@
+// 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';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/closure.dart';
+import 'package:compiler/src/common.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/js_backend/annotations.dart';
+import 'package:compiler/src/js_model/element_map.dart';
+import 'package:compiler/src/js_model/js_world.dart';
+import 'package:compiler/src/util/enumset.dart';
+import 'package:front_end/src/testing/features.dart';
+import 'package:kernel/ast.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
+    await checkTests(dataDir, const AnnotationDataComputer(),
+        args: args, testedConfigs: allStrongConfigs);
+  });
+}
+
+class AnnotationDataComputer extends DataComputer<String> {
+  const AnnotationDataComputer();
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
+    JsToElementMap elementMap = closedWorld.elementMap;
+    MemberDefinition definition = elementMap.getMemberDefinition(member);
+    new AnnotationIrComputer(compiler.reporter, actualMap, elementMap, member,
+            closedWorld.closureDataLookup, closedWorld.annotationsData)
+        .run(definition.node);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  @override
+  String computeErrorData(
+      Compiler compiler, Id id, List<CollectedMessage> errors) {
+    return '[${errors.map((error) => error.message.message).join(',')}]';
+  }
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+/// AST visitor for computing inference data for a member.
+class AnnotationIrComputer extends IrDataExtractor<String> {
+  final JsToElementMap _elementMap;
+  final ClosureData _closureDataLookup;
+  final AnnotationsDataImpl _annotationData;
+
+  AnnotationIrComputer(
+      DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap,
+      this._elementMap,
+      MemberEntity member,
+      this._closureDataLookup,
+      this._annotationData)
+      : super(reporter, actualMap);
+
+  String getMemberValue(MemberEntity member) {
+    EnumSet<PragmaAnnotation> pragmas =
+        _annotationData.pragmaAnnotations[member];
+    if (pragmas != null) {
+      Features features = new Features();
+      for (PragmaAnnotation pragma
+          in pragmas.iterable(PragmaAnnotation.values)) {
+        features.add(pragma.name);
+      }
+      return features.getText();
+    }
+    return null;
+  }
+
+  @override
+  String computeMemberValue(Id id, ir.Member node) {
+    return getMemberValue(_elementMap.getMember(node));
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionExpression || node is ir.FunctionDeclaration) {
+      ClosureRepresentationInfo info = _closureDataLookup.getClosureInfo(node);
+      return getMemberValue(info.callMethod);
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/annotations/data/basic.dart b/tests/compiler/dart2js/annotations/data/basic.dart
new file mode 100644
index 0000000..c60693b
--- /dev/null
+++ b/tests/compiler/dart2js/annotations/data/basic.dart
@@ -0,0 +1,38 @@
+// 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.
+
+main() {
+  noInline();
+  tryInline();
+  noElision();
+  noThrows();
+  noSideEffects();
+  assumeDynamic();
+}
+
+/*member: noInline:noInline*/
+@pragma('dart2js:noInline')
+noInline() {}
+
+/*member: tryInline:tryInline*/
+@pragma('dart2js:tryInline')
+tryInline() {}
+
+/*member: noElision:noElision*/
+@pragma('dart2js:noElision')
+noElision() {}
+
+/*member: noThrows:noInline,noThrows*/
+@pragma('dart2js:noThrows')
+@pragma('dart2js:noInline')
+noThrows() {}
+
+/*member: noSideEffects:noInline,noSideEffects*/
+@pragma('dart2js:noSideEffects')
+@pragma('dart2js:noInline')
+noSideEffects() {}
+
+/*member: assumeDynamic:assumeDynamic*/
+@pragma('dart2js:assumeDynamic')
+assumeDynamic() {}
diff --git a/tests/compiler/dart2js/annotations/data/directives.dart b/tests/compiler/dart2js/annotations/data/directives.dart
new file mode 100644
index 0000000..dbebee2
--- /dev/null
+++ b/tests/compiler/dart2js/annotations/data/directives.dart
@@ -0,0 +1,46 @@
+// 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.
+
+main() {
+  typesTrust();
+  typesCheck();
+  asTrust();
+  asCheck();
+  downcastTrust();
+  downcastCheck();
+  parameterTrust();
+  parameterCheck();
+}
+
+/*member: typesTrust:types:trust*/
+@pragma('dart2js:types:trust')
+typesTrust() {}
+
+/*member: typesCheck:types:check*/
+@pragma('dart2js:types:check')
+typesCheck() {}
+
+/*member: asTrust:as:trust*/
+@pragma('dart2js:as:trust')
+asTrust() {}
+
+/*member: asCheck:as:check*/
+@pragma('dart2js:as:check')
+asCheck() {}
+
+/*member: downcastTrust:downcast:trust*/
+@pragma('dart2js:downcast:trust')
+downcastTrust() {}
+
+/*member: downcastCheck:downcast:check*/
+@pragma('dart2js:downcast:check')
+downcastCheck() {}
+
+/*member: parameterTrust:parameter:trust*/
+@pragma('dart2js:parameter:trust')
+parameterTrust() {}
+
+/*member: parameterCheck:parameter:check*/
+@pragma('dart2js:parameter:check')
+parameterCheck() {}
diff --git a/tests/compiler/dart2js/annotations/data/errors.dart b/tests/compiler/dart2js/annotations/data/errors.dart
new file mode 100644
index 0000000..c170331
--- /dev/null
+++ b/tests/compiler/dart2js/annotations/data/errors.dart
@@ -0,0 +1,81 @@
+// 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.
+
+main() {
+  unknown();
+  noInlineField;
+  tryInlineField;
+  noThrowsWithoutNoInline();
+  noSideEffectsWithoutNoInline();
+  asConflict1();
+  asConflict2();
+  parameterConflict1();
+  parameterConflict2();
+  downcastConflict1();
+  downcastConflict2();
+  typesConflict1();
+  typesConflict2();
+}
+
+@pragma('dart2js:unknown')
+/*error: [Unknown dart2js pragma @pragma('dart2js:unknown')]*/
+unknown() {}
+
+@pragma('dart2js:noInline')
+var
+/*error: [@pragma('dart2js:noInline') annotation is only supported for methods and constructors.]*/
+    noInlineField;
+
+@pragma('dart2js:tryInline')
+var
+/*error: [@pragma('dart2js:tryInline') annotation is only supported for methods and constructors.]*/
+    tryInlineField;
+
+@pragma('dart2js:noThrows')
+/*error: [@pragma('dart2js:noThrows') should always be combined with @pragma('dart2js:noInline').]*/
+noThrowsWithoutNoInline() {}
+
+@pragma('dart2js:noSideEffects')
+/*error: [@pragma('dart2js:noSideEffects') should always be combined with @pragma('dart2js:noInline').]*/
+noSideEffectsWithoutNoInline() {}
+
+@pragma('dart2js:as:trust')
+@pragma('dart2js:as:check')
+/*error: [@pragma('dart2js:as:check') must not be used with @pragma('dart2js:as:trust').]*/
+asConflict1() {}
+
+@pragma('dart2js:as:trust')
+@pragma('dart2js:as:check')
+/*error: [@pragma('dart2js:as:check') must not be used with @pragma('dart2js:as:trust').]*/
+asConflict2() {}
+
+@pragma('dart2js:parameter:trust')
+@pragma('dart2js:parameter:check')
+/*error: [@pragma('dart2js:parameter:check') must not be used with @pragma('dart2js:parameter:trust').]*/
+parameterConflict1() {}
+
+@pragma('dart2js:parameter:trust')
+@pragma('dart2js:parameter:check')
+/*error: [@pragma('dart2js:parameter:check') must not be used with @pragma('dart2js:parameter:trust').]*/
+parameterConflict2() {}
+
+@pragma('dart2js:downcast:trust')
+@pragma('dart2js:downcast:check')
+/*error: [@pragma('dart2js:downcast:check') must not be used with @pragma('dart2js:downcast:trust').]*/
+downcastConflict1() {}
+
+@pragma('dart2js:downcast:trust')
+@pragma('dart2js:downcast:check')
+/*error: [@pragma('dart2js:downcast:check') must not be used with @pragma('dart2js:downcast:trust').]*/
+downcastConflict2() {}
+
+@pragma('dart2js:types:trust')
+@pragma('dart2js:types:check')
+/*error: [@pragma('dart2js:types:check') must not be used with @pragma('dart2js:types:trust').]*/
+typesConflict1() {}
+
+@pragma('dart2js:types:trust')
+@pragma('dart2js:types:check')
+/*error: [@pragma('dart2js:types:check') must not be used with @pragma('dart2js:types:trust').]*/
+typesConflict2() {}
diff --git a/tests/compiler/dart2js/closure/closure_test.dart b/tests/compiler/dart2js/closure/closure_test.dart
index 941efb5..91e687c 100644
--- a/tests/compiler/dart2js/closure/closure_test.dart
+++ b/tests/compiler/dart2js/closure/closure_test.dart
@@ -12,13 +12,13 @@
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/locals.dart';
-import 'package:compiler/src/util/features.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
+import 'package:front_end/src/fasta/util/link.dart' show Link;
+import 'package:front_end/src/testing/features.dart';
+import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
-import 'package:front_end/src/fasta/util/link.dart' show Link;
-import 'package:kernel/ast.dart' as ir;
 
 main(List<String> args) {
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/codegen/model_test.dart b/tests/compiler/dart2js/codegen/model_test.dart
index 666ddff..51f8b30 100644
--- a/tests/compiler/dart2js/codegen/model_test.dart
+++ b/tests/compiler/dart2js/codegen/model_test.dart
@@ -15,7 +15,7 @@
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_world.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:js_ast/js_ast.dart' as js;
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
@@ -27,7 +27,7 @@
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('model_data'));
     await checkTests(dataDir, const ModelDataComputer(),
-        args: args, testCFEConstants: true);
+        args: args, testedConfigs: allInternalConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/codegen/string_escapes_test.dart b/tests/compiler/dart2js/codegen/string_escapes_test.dart
index 16d469d..9e774d2 100644
--- a/tests/compiler/dart2js/codegen/string_escapes_test.dart
+++ b/tests/compiler/dart2js/codegen/string_escapes_test.dart
@@ -18,15 +18,15 @@
 
     await compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
       Expect.isTrue(
-          generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"),
+          generated.contains(r'"\n\u2028\u2029"') ||
+              generated.contains(r"'\n\u2028\u2029'"),
           generated);
     });
     await compileExpression("r''' \n\r\u2028\u2029'''")
         .then((String generated) {
       Expect.isTrue(
-          generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"),
+          generated.contains(r'"\n\u2028\u2029"') ||
+              generated.contains(r"'\n\u2028\u2029'"),
           generated);
     });
     await compileExpression("r''' \r\n\u2028\u2029'''")
@@ -52,24 +52,24 @@
             "r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
         .then((String generated) {
       Expect.isTrue(
-          generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"),
+          generated.contains(r'"\n\u2028\u2029"') ||
+              generated.contains(r"'\n\u2028\u2029'"),
           generated);
     });
     await compileExpression(
             "r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
         .then((String generated) {
       Expect.isTrue(
-          generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"),
+          generated.contains(r'"\n\u2028\u2029"') ||
+              generated.contains(r"'\n\u2028\u2029'"),
           generated);
     });
     await compileExpression(
             "r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
         .then((String generated) {
       Expect.isTrue(
-          generated.contains(r'"\r\u2028\u2029"') ||
-              generated.contains(r"'\r\u2028\u2029'"),
+          generated.contains(r'"\n\u2028\u2029"') ||
+              generated.contains(r"'\n\u2028\u2029'"),
           generated);
     });
     await compileExpression(
diff --git a/tests/compiler/dart2js/codegen/tdiv_test.dart b/tests/compiler/dart2js/codegen/tdiv_test.dart
index 86e6f08..2a212c7 100644
--- a/tests/compiler/dart2js/codegen/tdiv_test.dart
+++ b/tests/compiler/dart2js/codegen/tdiv_test.dart
@@ -52,7 +52,7 @@
 foo(param1, param2) {
   var a = param1 ? 0xFFFFFFFF : 0;
   var b = param2 ? 3 : 4;
-  return a ~/ param2;
+  return a ~/ b;
   // We could optimize this with range analysis, but type inference summarizes
   // '3 or 4' to uint31, which is not >= 2.
   // present: '$tdiv'
@@ -60,6 +60,18 @@
 }
 """;
 
+const String TEST_REGRESS_37502 = r"""
+foo(param1, param2) {
+  var a = param1 ? 1.2 : 12.3;
+  var b = param2 ? 3.14 : 2.81;
+  return (a ~/ b).gcd(2);
+  // The result of ~/ is int; gcd is defined only on int and is too complex
+  // to be inlined.
+  //
+  // present: 'JSInt_methods.gcd'
+}
+""";
+
 main() {
   runTests() async {
     Future check(String test) {
@@ -71,6 +83,7 @@
     await check(TEST3);
     await check(TEST4);
     await check(TEST5);
+    await check(TEST_REGRESS_37502);
   }
 
   asyncTest(() async {
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 84af435..9bee6c9 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -10,6 +10,7 @@
 codegen/list_tracer_length_test: Fail # Issue 33051
 codegen/load_elimination_test: Pass, Slow
 codegen/logical_expression_test: Fail # Issue 17027
+codegen/model_test: Pass, Slow
 codegen/side_effect_tdiv_regression_test: Fail # Issue 33050
 codegen/simple_function_subtype_test: Fail # simple_function_subtype_test is temporarily(?) disabled due to new method for building function type tests.
 codegen/string_escapes_test: Fail # Issue 33060
@@ -19,8 +20,11 @@
 end_to_end/show_package_warnings_test: RuntimeError # missing errors from the FE
 equivalence/id_equivalence1_test: Pass, Slow
 equivalence/id_equivalence2_test: Pass, Slow
+impact/impact_test: Pass, Slow
 inference/inference0_test: Slow, Pass
 inference/inference1_test: Slow, Pass
+inference/inference2_test: Slow, Pass
+inference/inference3_test: Slow, Pass
 inference/simple_inferrer_const_closure2_test: Fail # Issue 16507
 inference/simple_inferrer_const_closure_test: Fail # Issue 16507
 inference/simple_inferrer_global_field_closure_test: Fail # Issue 16507
@@ -35,11 +39,13 @@
 rti/rti_emission_test: Pass, Slow
 rti/rti_need0_test: Pass, Slow
 rti/rti_need1_test: Pass, Slow
+serialization/serialization_test: Pass, Slow
 sourcemaps/d2js_validity_test: RuntimeError # Issue 33072
 sourcemaps/deferred_d2js_validity_test: RuntimeError # Issue 33072
 sourcemaps/source_mapping_invokes_test: Pass, Slow
 sourcemaps/source_mapping_operators_test: Pass, Slow
 sourcemaps/source_mapping_test: Pass, Slow
+sourcemaps/stacktrace_test: Pass, Slow
 
 [ $mode == debug ]
 deferred/load_graph_segmentation_test: Pass, Slow
diff --git a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
index 880c642..749adc9 100644
--- a/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
+++ b/tests/compiler/dart2js/deferred_loading/deferred_loading_test.dart
@@ -36,7 +36,7 @@
         options: compilerOptions,
         args: args, setUpFunction: () {
       importPrefixes.clear();
-    }, testOmit: false, testCFEConstants: true);
+    }, testedConfigs: allStrongConfigs);
   });
 }
 
@@ -91,32 +91,21 @@
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
     MemberDefinition definition = elementMap.getMemberDefinition(member);
-    new OutputUnitIrComputer(compiler.reporter, actualMap, elementMap, member,
+    new OutputUnitIrComputer(compiler.reporter, actualMap, elementMap,
             closedWorld.outputUnitData, closedWorld.closureDataLookup)
         .run(definition.node);
   }
 
   @override
-  bool get computesClassData => true;
-
-  @override
   void computeClassData(
       Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
-    OutputUnitData data = closedWorld.outputUnitData;
-    String value = outputUnitString(data.outputUnitForClassForTesting(cls));
-
     JsToElementMap elementMap = closedWorld.elementMap;
     ClassDefinition definition = elementMap.getClassDefinition(cls);
-
-    _registerValue(
-        new ClassId(cls.name),
-        value,
-        cls,
-        computeSourceSpanFromTreeNode(definition.node),
-        actualMap,
-        compiler.reporter);
+    new OutputUnitIrComputer(compiler.reporter, actualMap, elementMap,
+            closedWorld.outputUnitData, closedWorld.closureDataLookup)
+        .computeForClass(definition.node);
   }
 
   @override
@@ -134,7 +123,6 @@
       DiagnosticReporter reporter,
       Map<Id, ActualData<String>> actualMap,
       this._elementMap,
-      MemberEntity member,
       this._data,
       this._closureDataLookup)
       : super(reporter, actualMap);
@@ -150,6 +138,12 @@
   }
 
   @override
+  String computeClassValue(Id id, ir.Class node) {
+    return outputUnitString(
+        _data.outputUnitForClassForTesting(_elementMap.getClass(node)));
+  }
+
+  @override
   String computeMemberValue(Id id, ir.Member node) {
     if (node is ir.Field && node.isConst) {
       ir.Expression initializer = node.initializer;
diff --git a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
index 56bf3e6..bc2076e 100644
--- a/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/dill_loader_test.dart
@@ -37,7 +37,7 @@
       ..verify = true;
 
     List<int> kernelBinary =
-        serializeComponent(await kernelForProgram(uri, options));
+        serializeComponent((await kernelForProgram(uri, options)).component);
     CompilerImpl compiler = compilerFor(
         entryPoint: entryPoint,
         memorySourceFiles: {'main.dill': kernelBinary},
diff --git a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
index b1a1d98..3b3cd0b 100644
--- a/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
+++ b/tests/compiler/dart2js/end_to_end/modular_loader_test.dart
@@ -81,7 +81,7 @@
     ..packagesFileUri = toTestUri('.packages');
   var inputUris = inputs.map(toTestUri).toList();
   var inputUriSet = inputUris.toSet();
-  var component = await kernelForComponent(inputUris, options);
+  var component = (await kernelForModule(inputUris, options)).component;
   for (var lib in component.libraries) {
     if (!inputUriSet.contains(lib.importUri)) {
       component.root.getChildFromUri(lib.importUri).bindTo(lib.reference);
diff --git a/tests/compiler/dart2js/end_to_end/output_type_test.dart b/tests/compiler/dart2js/end_to_end/output_type_test.dart
index aa4dcf1..93726a9 100644
--- a/tests/compiler/dart2js/end_to_end/output_type_test.dart
+++ b/tests/compiler/dart2js/end_to_end/output_type_test.dart
@@ -15,7 +15,7 @@
 import 'package:compiler/src/null_compiler_output.dart';
 import 'package:compiler/src/options.dart';
 import 'package:compiler/src/source_file_provider.dart';
-import 'package:compiler/src/util/uri_extras.dart';
+import 'package:front_end/src/api_unstable/dart2js.dart' as fe;
 import 'package:compiler/src/inferrer/debug.dart' show PRINT_GRAPH;
 import 'package:compiler/src/tracer.dart' show TRACE_FILTER_PATTERN_FOR_TEST;
 import 'package:expect/expect.dart';
@@ -28,7 +28,7 @@
 
   @override
   OutputSink createOutputSink(String name, String extension, OutputType type) {
-    outputs.add(relativize(provider.out,
+    outputs.add(fe.relativizeUri(provider.out,
         provider.createUri(name, extension, type), Platform.isWindows));
     return NullSink.outputProvider(name, extension, type);
   }
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence.dart b/tests/compiler/dart2js/equivalence/id_equivalence.dart
index 762af65..c815fb2 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence.dart
@@ -14,7 +14,14 @@
 export 'package:front_end/src/testing/id_extractor.dart';
 
 SourceSpan computeSourceSpanFromUriOffset(Uri uri, int offset) {
-  return uri != null ? new SourceSpan(uri, offset, offset + 1) : null;
+  if (uri != null) {
+    if (offset != null) {
+      return new SourceSpan(uri, offset, offset + 1);
+    } else {
+      return new SourceSpan(uri, 0, 0);
+    }
+  }
+  return null;
 }
 
 abstract class IrDataRegistryMixin<T> implements DataRegistry<T> {
diff --git a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
index 548568d..2d986f7 100644
--- a/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
+++ b/tests/compiler/dart2js/equivalence/id_equivalence_helper.dart
@@ -5,89 +5,78 @@
 import 'dart:async';
 import 'dart:io';
 
-import 'package:compiler/src/colors.dart' as colors;
 import 'package:compiler/src/common.dart';
 import 'package:compiler/compiler_new.dart';
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/commandline_options.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
 import 'package:expect/expect.dart';
-import 'package:front_end/src/testing/annotated_code_helper.dart';
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:kernel/ast.dart' as ir;
 
 import '../helpers/memory_compiler.dart';
 import '../equivalence/id_equivalence.dart';
 
-/// `true` if ANSI colors are supported by stdout.
-bool useColors = stdout.supportsAnsiEscapes;
+export 'package:front_end/src/testing/id_testing.dart'
+    show DataInterpreter, StringDataInterpreter;
+export '../helpers/memory_compiler.dart' show CollectedMessage;
 
-/// Colorize a message [text], if ANSI colors are supported.
-String colorizeMessage(String text) {
-  if (useColors) {
-    return '${colors.yellow(text)}';
-  } else {
-    return text;
-  }
-}
+const String strongMarker = 'strong';
+const String omitMarker = 'omit';
+const String strongConstMarker = 'strongConst';
+const String omitConstMarker = 'omitConst';
 
-/// Colorize a matching annotation [text], if ANSI colors are supported.
-String colorizeMatch(String text) {
-  if (useColors) {
-    return '${colors.blue(text)}';
-  } else {
-    return text;
-  }
-}
+const TestConfig strongConfig = const TestConfig(strongMarker, 'strong mode',
+    ['${Flags.enableLanguageExperiments}=no-constant-update-2018']);
 
-/// Colorize a single annotation [text], if ANSI colors are supported.
-String colorizeSingle(String text) {
-  if (useColors) {
-    return '${colors.green(text)}';
-  } else {
-    return text;
-  }
-}
+const TestConfig omitConfig =
+    const TestConfig(omitMarker, 'strong mode without implicit checks', [
+  Flags.omitImplicitChecks,
+  Flags.laxRuntimeTypeToString,
+  '${Flags.enableLanguageExperiments}=no-constant-update-2018'
+]);
 
-/// Colorize the actual annotation [text], if ANSI colors are supported.
-String colorizeActual(String text) {
-  if (useColors) {
-    return '${colors.red(text)}';
-  } else {
-    return text;
-  }
-}
+const TestConfig strongConstConfig = const TestConfig(
+    strongConstMarker,
+    'strong mode with cfe constants',
+    ['${Flags.enableLanguageExperiments}=constant-update-2018']);
 
-/// Colorize an expected annotation [text], if ANSI colors are supported.
-String colorizeExpected(String text) {
-  if (useColors) {
-    return '${colors.green(text)}';
-  } else {
-    return text;
-  }
-}
+const TestConfig omitConstConfig = const TestConfig(omitConstMarker,
+    'strong mode with cfe constants and without implicit checks', [
+  Flags.omitImplicitChecks,
+  Flags.laxRuntimeTypeToString,
+  '${Flags.enableLanguageExperiments}=constant-update-2018'
+]);
 
-/// Colorize delimiter [text], if ANSI colors are supported.
-String colorizeDelimiter(String text) {
-  if (useColors) {
-    return '${colors.yellow(text)}';
-  } else {
-    return text;
-  }
-}
+const List<String> allInternalMarkers = const [
+  strongMarker,
+  omitMarker,
+  strongConstMarker,
+  omitConstMarker,
+];
 
-/// Colorize diffs [expected] and [actual] and [delimiter], if ANSI colors are
-/// supported.
-String colorizeDiff(String expected, String delimiter, String actual) {
-  return '${colorizeExpected(expected)}'
-      '${colorizeDelimiter(delimiter)}${colorizeActual(actual)}';
-}
+const List<TestConfig> defaultInternalConfigs = const [
+  strongConfig,
+  omitConfig
+];
 
-/// Colorize annotation delimiters [start] and [end] surrounding [text], if
-/// ANSI colors are supported.
-String colorizeAnnotation(String start, String text, String end) {
-  return '${colorizeDelimiter(start)}$text${colorizeDelimiter(end)}';
-}
+const List<TestConfig> allInternalConfigs = const [
+  strongConfig,
+  omitConfig,
+  strongConstConfig,
+  omitConstConfig,
+];
+
+const List<TestConfig> allStrongConfigs = const [
+  strongConfig,
+  strongConstConfig,
+];
+
+const TestConfig sharedConfig = const TestConfig(dart2jsMarker, 'dart2js',
+    ['${Flags.enableLanguageExperiments}=constant-update-2018']);
 
 abstract class DataComputer<T> {
   const DataComputer();
@@ -95,31 +84,41 @@
   /// Called before testing to setup flags needed for data collection.
   void setup() {}
 
-  /// Called before testing to setup flags needed for data collection.
-  void onCompilation(Compiler compiler) {}
-
   /// Function that computes a data mapping for [member].
   ///
-  /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-  /// for the data origin.
+  /// Fills [actualMap] with the data.
   void computeMemberData(
       Compiler compiler, MemberEntity member, Map<Id, ActualData<T>> actualMap,
       {bool verbose});
 
-  /// Returns `true` if [computeClassData] is supported.
-  bool get computesClassData => false;
-
   /// Returns `true` if frontend member should be tested.
   bool get testFrontend => false;
 
   /// Function that computes a data mapping for [cls].
   ///
-  /// Fills [actualMap] with the data and [sourceSpanMap] with the source spans
-  /// for the data origin.
+  /// Fills [actualMap] with the data.
   void computeClassData(
       Compiler compiler, ClassEntity cls, Map<Id, ActualData<T>> actualMap,
       {bool verbose}) {}
 
+  /// Function that computes a data mapping for [library].
+  ///
+  /// Fills [actualMap] with the data.
+  void computeLibraryData(Compiler compiler, LibraryEntity library,
+      Map<Id, ActualData<T>> actualMap,
+      {bool verbose}) {}
+
+  /// Returns `true` if this data computer supports tests with compile-time
+  /// errors.
+  ///
+  /// Unsuccessful compilation might leave the compiler in an inconsistent
+  /// state, so this testing feature is opt-in.
+  bool get supportsErrors => false;
+
+  /// Returns data corresponding to [error].
+  T computeErrorData(Compiler compiler, Id id, List<CollectedMessage> errors) =>
+      null;
+
   DataInterpreter<T> get dataValidator;
 }
 
@@ -132,13 +131,6 @@
       .reportErrorMessage(spannable, MessageKind.GENERIC, {'text': message});
 }
 
-/// Display name used for strong mode compilation using the new common frontend.
-const String strongName = 'strong mode';
-
-/// Display name used for strong mode compilation without implicit checks using
-/// the new common frontend.
-const String omitName = 'strong mode without implicit checks';
-
 /// Compute actual data for all members defined in the program with the
 /// [entryPoint] and [memorySourceFiles].
 ///
@@ -154,18 +146,32 @@
     bool skipFailedCompilations: false,
     Iterable<Id> globalIds: const <Id>[]}) async {
   OutputCollector outputCollector = new OutputCollector();
+  DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
+  Uri packageConfig;
+  Uri wantedPackageConfig = createUriForFileName(".packages", isLib: false);
+  for (String key in memorySourceFiles.keys) {
+    if (key == wantedPackageConfig.path) {
+      packageConfig = wantedPackageConfig;
+      break;
+    }
+  }
   CompilationResult result = await runCompiler(
       entryPoint: entryPoint,
       memorySourceFiles: memorySourceFiles,
       outputProvider: outputCollector,
+      diagnosticHandler: diagnosticCollector,
       options: options,
       beforeRun: (compiler) {
         compiler.stopAfterTypeInference =
             options.contains(stopAfterTypeInference);
-      });
+      },
+      packageConfig: packageConfig);
   if (!result.isSuccess) {
     if (skipFailedCompilations) return null;
-    Expect.isTrue(result.isSuccess, "Unexpected compilation error.");
+    Expect.isTrue(
+        dataComputer.supportsErrors,
+        "Compilation with compile-time errors not supported for this "
+        "testing setup.");
   }
   if (printCode) {
     print('--code------------------------------------------------------------');
@@ -173,21 +179,48 @@
     print('------------------------------------------------------------------');
   }
   Compiler compiler = result.compiler;
-  dataComputer.onCompilation(compiler);
-  dynamic closedWorld = testFrontend
-      ? compiler.resolutionWorldBuilder.closedWorldForTesting
-      : compiler.backendClosedWorldForTesting;
-  ElementEnvironment elementEnvironment = closedWorld.elementEnvironment;
-  CommonElements commonElements = closedWorld.commonElements;
 
   Map<Uri, Map<Id, ActualData<T>>> actualMaps = <Uri, Map<Id, ActualData<T>>>{};
   Map<Id, ActualData<T>> globalData = <Id, ActualData<T>>{};
 
+  Map<Id, ActualData<T>> actualMapForUri(Uri uri) {
+    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
+  }
+
+  Map<Uri, Map<int, List<CollectedMessage>>> errors = {};
+  for (CollectedMessage error in diagnosticCollector.errors) {
+    Map<int, List<CollectedMessage>> map =
+        errors.putIfAbsent(error.uri, () => {});
+    List<CollectedMessage> list = map.putIfAbsent(error.begin, () => []);
+    list.add(error);
+  }
+
+  errors.forEach((Uri uri, Map<int, List<CollectedMessage>> map) {
+    map.forEach((int offset, List<CollectedMessage> list) {
+      NodeId id = new NodeId(offset, IdKind.error);
+      T data = dataComputer.computeErrorData(compiler, id, list);
+      if (data != null) {
+        Map<Id, ActualData<T>> actualMap = actualMapForUri(uri);
+        actualMap[id] = new ActualData<T>(id, data, uri, offset, list);
+      }
+    });
+  });
+
+  if (!result.isSuccess) {
+    return new Dart2jsCompiledData<T>(
+        compiler, null, entryPoint, actualMaps, globalData);
+  }
+
+  dynamic closedWorld = testFrontend
+      ? compiler.resolutionWorldBuilder.closedWorldForTesting
+      : compiler.backendClosedWorldForTesting;
+  ElementEnvironment elementEnvironment = closedWorld?.elementEnvironment;
+  CommonElements commonElements = closedWorld.commonElements;
+
   Map<Id, ActualData<T>> actualMapFor(Entity entity) {
     SourceSpan span =
         compiler.backendStrategy.spanFromSpannable(entity, entity);
-    Uri uri = span.uri;
-    return actualMaps.putIfAbsent(uri, () => <Id, ActualData<T>>{});
+    return actualMapForUri(span.uri);
   }
 
   void processMember(MemberEntity member, Map<Id, ActualData<T>> actualMap) {
@@ -228,16 +261,32 @@
             library.canonicalUri.scheme == 'package');
   }
 
-  if (dataComputer.computesClassData) {
-    for (LibraryEntity library in elementEnvironment.libraries) {
-      if (excludeLibrary(library)) continue;
-      elementEnvironment.forEachClass(library, (ClassEntity cls) {
-        processClass(cls, actualMapFor(cls));
-      });
-    }
+  ir.Library getIrLibrary(LibraryEntity library) {
+    KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    LibraryEntity kLibrary =
+        elementMap.elementEnvironment.lookupLibrary(library.canonicalUri);
+    return elementMap.getLibraryNode(kLibrary);
   }
+
+  for (LibraryEntity library in elementEnvironment.libraries) {
+    if (excludeLibrary(library) &&
+        !memorySourceFiles.containsKey(getIrLibrary(library).fileUri.path)) {
+      continue;
+    }
+
+    dataComputer.computeLibraryData(
+        compiler, library, actualMapForUri(getIrLibrary(library).fileUri),
+        verbose: verbose);
+    elementEnvironment.forEachClass(library, (ClassEntity cls) {
+      processClass(cls, actualMapFor(cls));
+    });
+  }
+
   for (MemberEntity member in closedWorld.processedMembers) {
-    if (excludeLibrary(member.library)) continue;
+    if (excludeLibrary(member.library) &&
+        !memorySourceFiles
+            .containsKey(getIrLibrary(member.library).fileUri.path)) continue;
     processMember(member, actualMapFor(member));
   }
 
@@ -293,220 +342,56 @@
       }
       processMember(member, globalData);
     } else if (id is ClassId) {
-      if (dataComputer.computesClassData) {
-        ClassEntity cls = getGlobalClass(id.className);
-        processClass(cls, globalData);
-      }
+      ClassEntity cls = getGlobalClass(id.className);
+      processClass(cls, globalData);
     } else {
       throw new UnsupportedError("Unexpected global id: $id");
     }
   }
 
-  return new CompiledData<T>(
+  return new Dart2jsCompiledData<T>(
       compiler, elementEnvironment, entryPoint, actualMaps, globalData);
 }
 
-class CompiledData<T> {
+class Dart2jsCompiledData<T> extends CompiledData<T> {
   final Compiler compiler;
   final ElementEnvironment elementEnvironment;
-  final Uri mainUri;
-  final Map<Uri, Map<Id, ActualData<T>>> actualMaps;
-  final Map<Id, ActualData<T>> globalData;
 
-  CompiledData(this.compiler, this.elementEnvironment, this.mainUri,
-      this.actualMaps, this.globalData);
+  Dart2jsCompiledData(
+      this.compiler,
+      this.elementEnvironment,
+      Uri mainUri,
+      Map<Uri, Map<Id, ActualData<T>>> actualMaps,
+      Map<Id, ActualData<T>> globalData)
+      : super(mainUri, actualMaps, globalData);
 
-  Map<int, List<String>> computeAnnotations(Uri uri) {
-    Map<Id, ActualData<T>> thisMap = actualMaps[uri];
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData<T> data1) {
-      String value1 = '${data1.value}';
-      annotations
-          .putIfAbsent(data1.offset, () => [])
-          .add(colorizeActual(value1));
-    });
-    return annotations;
-  }
-
-  Map<int, List<String>> computeDiffAnnotationsAgainst(
-      Map<Id, ActualData<T>> thisMap, Map<Id, ActualData<T>> otherMap, Uri uri,
-      {bool includeMatches: false}) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    thisMap.forEach((Id id, ActualData<T> data1) {
-      ActualData<T> data2 = otherMap[id];
-      String value1 = '${data1.value}';
-      if (data1.value != data2?.value) {
-        String value2 = '${data2?.value ?? '---'}';
-        annotations
-            .putIfAbsent(data1.offset, () => [])
-            .add(colorizeDiff(value1, ' | ', value2));
-      } else if (includeMatches) {
-        annotations
-            .putIfAbsent(data1.offset, () => [])
-            .add(colorizeMatch(value1));
-      }
-    });
-    otherMap.forEach((Id id, ActualData<T> data2) {
-      if (!thisMap.containsKey(id)) {
-        String value1 = '---';
-        String value2 = '${data2.value}';
-        annotations
-            .putIfAbsent(data2.offset, () => [])
-            .add(colorizeDiff(value1, ' | ', value2));
-      }
-    });
-    return annotations;
-  }
-}
-
-String withAnnotations(String sourceCode, Map<int, List<String>> annotations) {
-  StringBuffer sb = new StringBuffer();
-  int end = 0;
-  for (int offset in annotations.keys.toList()..sort()) {
-    if (offset >= sourceCode.length) {
-      sb.write('...');
-      return sb.toString();
-    }
-    if (offset > end) {
-      sb.write(sourceCode.substring(end, offset));
-    }
-    for (String annotation in annotations[offset]) {
-      sb.write(colorizeAnnotation('/*', annotation, '*/'));
-    }
-    end = offset;
-  }
-  if (end < sourceCode.length) {
-    sb.write(sourceCode.substring(end));
-  }
-  return sb.toString();
-}
-
-/// Data collected by [computeData].
-class IdData<T> {
-  final Map<Uri, AnnotatedCode> code;
-  final MemberAnnotations<IdValue> expectedMaps;
-  final CompiledData _compiledData;
-  final MemberAnnotations<ActualData<T>> _actualMaps = new MemberAnnotations();
-
-  IdData(this.code, this.expectedMaps, this._compiledData) {
-    for (Uri uri in code.keys) {
-      _actualMaps[uri] = _compiledData.actualMaps[uri] ?? <Id, ActualData<T>>{};
-    }
-    _actualMaps.globalData.addAll(_compiledData.globalData);
-  }
-
-  Compiler get compiler => _compiledData.compiler;
-  ElementEnvironment get elementEnvironment => _compiledData.elementEnvironment;
-  Uri get mainUri => _compiledData.mainUri;
-  MemberAnnotations<ActualData<T>> get actualMaps => _actualMaps;
-
-  String actualCode(Uri uri) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData<T> data) {
-      annotations.putIfAbsent(data.offset, () => []).add('${data.value}');
-    });
-    return withAnnotations(code[uri].sourceCode, annotations);
-  }
-
-  String diffCode(Uri uri, DataInterpreter<T> dataValidator) {
-    Map<int, List<String>> annotations = <int, List<String>>{};
-    actualMaps[uri].forEach((Id id, ActualData<T> data) {
-      IdValue expectedValue = expectedMaps[uri][id];
-      T actualValue = data.value;
-      String unexpectedMessage =
-          dataValidator.isAsExpected(actualValue, expectedValue?.value);
-      if (unexpectedMessage != null) {
-        String expected = expectedValue?.toString() ?? '';
-        String actual = dataValidator.getText(actualValue);
-        int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '${expected}';
-          String value2 = IdValue.idToString(id, '${actual}');
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
-      }
-    });
-    expectedMaps[uri].forEach((Id id, IdValue expected) {
-      if (!actualMaps[uri].containsKey(id)) {
-        int offset = getOffsetFromId(id, uri);
-        if (offset != null) {
-          String value1 = '${expected}';
-          String value2 = '---';
-          annotations
-              .putIfAbsent(offset, () => [])
-              .add(colorizeDiff(value1, ' | ', value2));
-        }
-      }
-    });
-    return withAnnotations(code[uri].sourceCode, annotations);
-  }
-
+  @override
   int getOffsetFromId(Id id, Uri uri) {
     return compiler.reporter
         .spanFromSpannable(computeSpannable(elementEnvironment, uri, id))
         ?.begin;
   }
-}
-
-/// Encapsulates the member data computed for each source file of interest.
-/// It's a glorified wrapper around a map of maps, but written this way to
-/// provide a little more information about what it's doing. [DataType] refers
-/// to the type this map is holding -- it is either [IdValue] or [ActualData].
-class MemberAnnotations<DataType> {
-  /// For each Uri, we create a map associating an element id with its
-  /// corresponding annotations.
-  final Map<Uri, Map<Id, DataType>> _computedDataForEachFile =
-      new Map<Uri, Map<Id, DataType>>();
-
-  /// Member or class annotations that don't refer to any of the user files.
-  final Map<Id, DataType> globalData = <Id, DataType>{};
-
-  void operator []=(Uri file, Map<Id, DataType> computedData) {
-    _computedDataForEachFile[file] = computedData;
-  }
-
-  void forEach(void f(Uri file, Map<Id, DataType> computedData)) {
-    _computedDataForEachFile.forEach(f);
-  }
-
-  Map<Id, DataType> operator [](Uri file) {
-    if (!_computedDataForEachFile.containsKey(file)) {
-      _computedDataForEachFile[file] = <Id, DataType>{};
-    }
-    return _computedDataForEachFile[file];
-  }
 
   @override
-  String toString() {
-    StringBuffer sb = new StringBuffer();
-    sb.write('MemberAnnotations(');
-    String comma = '';
-    if (_computedDataForEachFile.isNotEmpty &&
-        (_computedDataForEachFile.length > 1 ||
-            _computedDataForEachFile.values.single.isNotEmpty)) {
-      sb.write('data:{');
-      _computedDataForEachFile.forEach((Uri uri, Map<Id, DataType> data) {
-        sb.write(comma);
-        sb.write('$uri:');
-        sb.write(data);
-        comma = ',';
-      });
-      sb.write('}');
-    }
-    if (globalData.isNotEmpty) {
-      sb.write(comma);
-      sb.write('global:');
-      sb.write(globalData);
-    }
-    sb.write(')');
-    return sb.toString();
+  void reportError(Uri uri, int offset, String message,
+      {bool succinct: false}) {
+    compiler.reporter.reportErrorMessage(
+        computeSourceSpanFromUriOffset(uri, offset),
+        MessageKind.GENERIC,
+        {'text': message});
   }
 }
 
 typedef void Callback();
 
+class TestConfig {
+  final String marker;
+  final String name;
+  final List<String> options;
+
+  const TestConfig(this.marker, this.name, this.options);
+}
+
 /// Check code for all test files int [data] using [computeFromAst] and
 /// [computeFromKernel] from the respective front ends. If [skipForKernel]
 /// contains the name of the test file it isn't tested for kernel.
@@ -530,418 +415,102 @@
     Callback setUpFunction,
     int shards: 1,
     int shardIndex: 0,
-    bool testOmit: true,
-    bool testCFEConstants: false,
-    void onTest(Uri uri)}) async {
+    void onTest(Uri uri),
+    Iterable<String> supportedMarkers = allInternalMarkers,
+    List<TestConfig> testedConfigs = defaultInternalConfigs}) async {
+  Set<String> testedMarkers =
+      testedConfigs.map((config) => config.marker).toSet();
+  Expect.isTrue(
+      testedConfigs.length == testedMarkers.length,
+      "Unexpected test markers $testedMarkers. "
+      "Tested configs: $testedConfigs.");
+  Iterable<String> unknownMarkers =
+      testedMarkers.where((marker) => !supportedMarkers.contains(marker));
+  Expect.isTrue(
+      unknownMarkers.isEmpty,
+      "Unexpected test markers $unknownMarkers. "
+      "Supported markers: $supportedMarkers.");
+
   dataComputer.setup();
 
-  args = args.toList();
-  bool verbose = args.remove('-v');
-  bool shouldContinue = args.remove('-c');
-  bool testAfterFailures = args.remove('-a');
-  bool printCode = args.remove('-p');
-  bool continued = false;
-  bool hasFailures = false;
-
-  var relativeDir = dataDir.uri.path.replaceAll(Uri.base.path, '');
-  print('Data dir: ${relativeDir}');
-  List<FileSystemEntity> entities = dataDir.listSync();
-  if (shards > 1) {
-    int start = entities.length * shardIndex ~/ shards;
-    int end = entities.length * (shardIndex + 1) ~/ shards;
-    entities = entities.sublist(start, end);
-  }
-  int testCount = 0;
-  for (FileSystemEntity entity in entities) {
-    String name = entity.uri.pathSegments.last;
-    if (args.isNotEmpty && !args.contains(name) && !continued) continue;
-    if (shouldContinue) continued = true;
-    testCount++;
+  Future<bool> checkTest(TestData testData,
+      {bool testAfterFailures,
+      bool verbose,
+      bool succinct,
+      bool printCode}) async {
+    bool hasFailures = false;
+    String name = testData.name;
     List<String> testOptions = options.toList();
     if (name.endsWith('_ea.dart')) {
       testOptions.add(Flags.enableAsserts);
     }
 
-    if (onTest != null) {
-      onTest(entity.uri);
-    }
-    print('----------------------------------------------------------------');
-    print('Test file: ${entity.uri}');
-    // Pretend this is a dart2js_native test to allow use of 'native' keyword
-    // and import of private libraries.
-    String commonTestPath = 'sdk/tests/compiler';
-    Uri entryPoint =
-        Uri.parse('memory:$commonTestPath/dart2js_native/main.dart');
-    String annotatedCode = await new File.fromUri(entity.uri).readAsString();
-    userFiles.add('main.dart');
-    Map<Uri, AnnotatedCode> code = {
-      entryPoint:
-          new AnnotatedCode.fromText(annotatedCode, commentStart, commentEnd)
-    };
-    Map<String, MemberAnnotations<IdValue>> expectedMaps = {
-      strongMarker: new MemberAnnotations<IdValue>(),
-      omitMarker: new MemberAnnotations<IdValue>(),
-      strongConstMarker: new MemberAnnotations<IdValue>(),
-      omitConstMarker: new MemberAnnotations<IdValue>(),
-    };
-    computeExpectedMap(entryPoint, code[entryPoint], expectedMaps);
-    Map<String, String> memorySourceFiles = {
-      entryPoint.path: code[entryPoint].sourceCode
-    };
-
-    if (libDirectory != null) {
-      print('Supporting libraries:');
-      String filePrefix = name.substring(0, name.lastIndexOf('.'));
-      await for (FileSystemEntity libEntity in libDirectory.list()) {
-        String libFileName = libEntity.uri.pathSegments.last;
-        if (libFileName.startsWith(filePrefix)) {
-          print('    - libs/$libFileName');
-          Uri libFileUri =
-              Uri.parse('memory:$commonTestPath/libs/$libFileName');
-          userFiles.add(libEntity.uri.pathSegments.last);
-          String libCode = await new File.fromUri(libEntity.uri).readAsString();
-          AnnotatedCode annotatedLibCode =
-              new AnnotatedCode.fromText(libCode, commentStart, commentEnd);
-          memorySourceFiles[libFileUri.path] = annotatedLibCode.sourceCode;
-          code[libFileUri] = annotatedLibCode;
-          computeExpectedMap(libFileUri, annotatedLibCode, expectedMaps);
-        }
-      }
-    }
-
     if (setUpFunction != null) setUpFunction();
 
-    Future runTests({bool useCFEConstants: false}) async {
-      if (skipForStrong.contains(name)) {
-        print('--skipped for kernel (strong mode)----------------------------');
-      } else {
-        print('--from kernel (strong mode)-----------------------------------');
-        List<String> options = new List<String>.from(testOptions);
-        String marker = strongMarker;
-        if (useCFEConstants) {
-          marker = strongConstMarker;
-          options
-              .add('${Flags.enableLanguageExperiments}=constant-update-2018');
-        } else {
-          options.add(
-              '${Flags.enableLanguageExperiments}=no-constant-update-2018');
-        }
-        MemberAnnotations<IdValue> annotations = expectedMaps[marker];
-        CompiledData<T> compiledData2 = await computeData(
-            entryPoint, memorySourceFiles, dataComputer,
-            options: options,
-            verbose: verbose,
-            printCode: printCode,
-            testFrontend: dataComputer.testFrontend,
-            forUserLibrariesOnly: forUserLibrariesOnly,
-            globalIds: annotations.globalData.keys);
-        if (await checkCode(strongName, entity.uri, code, annotations,
-            compiledData2, dataComputer.dataValidator,
+    if (skipForStrong.contains(name)) {
+      print('--skipped ------------------------------------------------------');
+    } else {
+      for (TestConfig testConfiguration in testedConfigs) {
+        print('--from (${testConfiguration.name})-------------');
+        if (await runTestForConfiguration(
+            testConfiguration, dataComputer, testData, testOptions,
             filterActualData: filterActualData,
-            fatalErrors: !testAfterFailures)) {
+            verbose: verbose,
+            testAfterFailures: testAfterFailures,
+            forUserLibrariesOnly: forUserLibrariesOnly,
+            printCode: printCode)) {
           hasFailures = true;
         }
       }
-      if (testOmit) {
-        if (skipForStrong.contains(name)) {
-          print(
-              '--skipped for kernel (strong mode, omit-implicit-checks)------');
-        } else {
-          print(
-              '--from kernel (strong mode, omit-implicit-checks)-------------');
-          List<String> options = [
-            Flags.omitImplicitChecks,
-            Flags.laxRuntimeTypeToString
-          ]..addAll(testOptions);
-          String marker = omitMarker;
-          if (useCFEConstants) {
-            marker = omitConstMarker;
-            options
-                .add('${Flags.enableLanguageExperiments}=constant-update-2018');
-          } else {
-            options.add(
-                '${Flags.enableLanguageExperiments}=no-constant-update-2018');
-          }
-          MemberAnnotations<IdValue> annotations = expectedMaps[marker];
-          CompiledData<T> compiledData2 = await computeData(
-              entryPoint, memorySourceFiles, dataComputer,
-              options: options,
-              verbose: verbose,
-              testFrontend: dataComputer.testFrontend,
-              forUserLibrariesOnly: forUserLibrariesOnly,
-              globalIds: annotations.globalData.keys);
-          if (await checkCode(omitName, entity.uri, code, annotations,
-              compiledData2, dataComputer.dataValidator,
-              filterActualData: filterActualData,
-              fatalErrors: !testAfterFailures)) {
-            hasFailures = true;
-          }
-        }
-      }
     }
-
-    await runTests();
-    if (testCFEConstants) {
-      print('--use cfe constants---------------------------------------------');
-      await runTests(useCFEConstants: true);
-    }
+    return hasFailures;
   }
-  Expect.isFalse(hasFailures, 'Errors found.');
-  Expect.isTrue(testCount > 0, "No files were tested.");
+
+  await runTests(dataDir,
+      args: args,
+      shards: shards,
+      shardIndex: shardIndex,
+      onTest: onTest,
+      libDirectory: libDirectory,
+      supportedMarkers: supportedMarkers,
+      createUriForFileName: createUriForFileName,
+      onFailure: Expect.fail,
+      runTest: checkTest);
 }
 
-final Set<String> userFiles = new Set<String>();
-
-/// Interface used for interpreting annotations.
-abstract class DataInterpreter<T> {
-  /// Returns `null` if [actualData] satisfies the [expectedData] annotation.
-  /// Otherwise, a message is returned contain the information about the
-  /// problems found.
-  String isAsExpected(T actualData, String expectedData);
-
-  /// Returns `true` if [actualData] corresponds to empty data.
-  bool isEmpty(T actualData);
-
-  /// Returns a textual representation of [actualData].
-  String getText(T actualData);
-}
-
-/// Default data interpreter for string data.
-class StringDataInterpreter implements DataInterpreter<String> {
-  const StringDataInterpreter();
-
-  @override
-  String isAsExpected(String actualData, String expectedData) {
-    actualData ??= '';
-    expectedData ??= '';
-    if (actualData != expectedData) {
-      return "Expected $expectedData, found $actualData";
-    }
-    return null;
-  }
-
-  @override
-  bool isEmpty(String actualData) {
-    return actualData == '';
-  }
-
-  @override
-  String getText(String actualData) {
-    return actualData;
+Uri createUriForFileName(String fileName, {bool isLib}) {
+  String commonTestPath = 'sdk/tests/compiler';
+  if (isLib) {
+    return Uri.parse('memory:$commonTestPath/libs/$fileName');
+  } else {
+    // Pretend this is a dart2js_native test to allow use of 'native'
+    // keyword and import of private libraries.
+    return Uri.parse('memory:$commonTestPath/dart2js_native/$fileName');
   }
 }
 
-class FeaturesDataInterpreter implements DataInterpreter<Features> {
-  const FeaturesDataInterpreter();
-
-  @override
-  String isAsExpected(Features actualFeatures, String expectedData) {
-    if (expectedData == '*') {
-      return null;
-    } else if (expectedData == '') {
-      return actualFeatures.isNotEmpty ? "Expected empty data." : null;
-    } else {
-      List<String> errorsFound = [];
-      Features expectedFeatures = Features.fromText(expectedData);
-      Set<String> validatedFeatures = new Set<String>();
-      expectedFeatures.forEach((String key, Object expectedValue) {
-        bool expectMatch = true;
-        if (key.startsWith('!')) {
-          key = key.substring(1);
-          expectMatch = false;
-        }
-        validatedFeatures.add(key);
-        Object actualValue = actualFeatures[key];
-        if (!expectMatch) {
-          if (actualFeatures.containsKey(key)) {
-            errorsFound.add('Unexpected data found for $key=$actualValue');
-          }
-        } else if (!actualFeatures.containsKey(key)) {
-          errorsFound.add('No data found for $key');
-        } else if (expectedValue == '') {
-          if (actualValue != '') {
-            errorsFound.add('Non-empty data found for $key');
-          }
-        } else if (expectedValue == '*') {
-          return;
-        } else if (expectedValue is List) {
-          if (actualValue is List) {
-            List actualList = actualValue.toList();
-            for (Object expectedObject in expectedValue) {
-              String expectedText = '$expectedObject';
-              bool matchFound = false;
-              if (expectedText.endsWith('*')) {
-                // Wildcard matcher.
-                String prefix =
-                    expectedText.substring(0, expectedText.indexOf('*'));
-                List matches = [];
-                for (Object actualObject in actualList) {
-                  if ('$actualObject'.startsWith(prefix)) {
-                    matches.add(actualObject);
-                    matchFound = true;
-                  }
-                }
-                for (Object match in matches) {
-                  actualList.remove(match);
-                }
-              } else {
-                for (Object actualObject in actualList) {
-                  if (expectedText == '$actualObject') {
-                    actualList.remove(actualObject);
-                    matchFound = true;
-                    break;
-                  }
-                }
-              }
-              if (!matchFound) {
-                errorsFound.add("No match found for $key=[$expectedText]");
-              }
-            }
-            if (actualList.isNotEmpty) {
-              errorsFound
-                  .add("Extra data found $key=[${actualList.join(',')}]");
-            }
-          } else {
-            errorsFound.add("List data expected for $key: "
-                "expected '$expectedValue', found '${actualValue}'");
-          }
-        } else if (expectedValue != actualValue) {
-          errorsFound.add(
-              "Mismatch for $key: expected '$expectedValue', found '${actualValue}'");
-        }
-      });
-      actualFeatures.forEach((String key, Object value) {
-        if (!validatedFeatures.contains(key)) {
-          if (value == '') {
-            errorsFound.add("Extra data found '$key'");
-          } else {
-            errorsFound.add("Extra data found $key=$value");
-          }
-        }
-      });
-      return errorsFound.isNotEmpty ? errorsFound.join('\n ') : null;
-    }
-  }
-
-  @override
-  String getText(Features actualData) {
-    return actualData.getText();
-  }
-
-  @override
-  bool isEmpty(Features actualData) {
-    return actualData == null || actualData.isEmpty;
-  }
-}
-
-/// Checks [compiledData] against the expected data in [expectedMap] derived
-/// from [code].
-Future<bool> checkCode<T>(
-    String mode,
-    Uri mainFileUri,
-    Map<Uri, AnnotatedCode> code,
-    MemberAnnotations<IdValue> expectedMaps,
-    CompiledData compiledData,
-    DataInterpreter<T> dataValidator,
-    {bool filterActualData(IdValue expected, ActualData<T> actualData),
-    bool fatalErrors: true}) async {
-  IdData<T> data = new IdData<T>(code, expectedMaps, compiledData);
-  bool hasFailure = false;
-  Set<Uri> neededDiffs = new Set<Uri>();
-
-  void checkActualMap(
-      Map<Id, ActualData<T>> actualMap, Map<Id, IdValue> expectedMap,
-      [Uri uri]) {
-    bool hasLocalFailure = false;
-    actualMap.forEach((Id id, ActualData<T> actualData) {
-      T actual = actualData.value;
-      String actualText = dataValidator.getText(actual);
-
-      if (!expectedMap.containsKey(id)) {
-        if (!dataValidator.isEmpty(actual)) {
-          reportError(
-              data.compiler.reporter,
-              computeSourceSpanFromUriOffset(actualData.uri, actualData.offset),
-              'EXTRA $mode DATA for ${id.descriptor}:\n '
-              'object   : ${actualData.objectText}\n '
-              'actual   : ${colorizeActual('${IdValue.idToString(id, actualText)}')}\n '
-              'Data was expected for these ids: ${expectedMap.keys}');
-          if (filterActualData == null || filterActualData(null, actualData)) {
-            hasLocalFailure = true;
-          }
-        }
-      } else {
-        IdValue expected = expectedMap[id];
-        String unexpectedMessage =
-            dataValidator.isAsExpected(actual, expected.value);
-        if (unexpectedMessage != null) {
-          reportError(
-              data.compiler.reporter,
-              computeSourceSpanFromUriOffset(actualData.uri, actualData.offset),
-              'UNEXPECTED $mode DATA for ${id.descriptor}:\n '
-              'detail  : ${colorizeMessage(unexpectedMessage)}\n '
-              'object  : ${actualData.objectText}\n '
-              'expected: ${colorizeExpected('$expected')}\n '
-              'actual  : ${colorizeActual('${IdValue.idToString(id, actualText)}')}');
-          if (filterActualData == null ||
-              filterActualData(expected, actualData)) {
-            hasLocalFailure = true;
-          }
-        }
-      }
-    });
-    if (hasLocalFailure) {
-      hasFailure = true;
-      if (uri != null) {
-        neededDiffs.add(uri);
-      }
-    }
-  }
-
-  data.actualMaps.forEach((Uri uri, Map<Id, ActualData<T>> actualMap) {
-    checkActualMap(actualMap, data.expectedMaps[uri], uri);
-  });
-  checkActualMap(data.actualMaps.globalData, data.expectedMaps.globalData);
-
-  Set<Id> missingIds = new Set<Id>();
-  void checkMissing(
-      Map<Id, IdValue> expectedMap, Map<Id, ActualData<T>> actualMap,
-      [Uri uri]) {
-    expectedMap.forEach((Id id, IdValue expected) {
-      if (!actualMap.containsKey(id)) {
-        missingIds.add(id);
-        String message = 'MISSING $mode DATA for ${id.descriptor}: '
-            'Expected ${colors.green('$expected')}';
-        if (uri != null) {
-          reportError(data.compiler.reporter,
-              computeSpannable(data.elementEnvironment, uri, id), message);
-        } else {
-          print(message);
-        }
-      }
-    });
-    if (missingIds.isNotEmpty && uri != null) {
-      neededDiffs.add(uri);
-    }
-  }
-
-  data.expectedMaps.forEach((Uri uri, Map<Id, IdValue> expectedMap) {
-    checkMissing(expectedMap, data.actualMaps[uri], uri);
-  });
-  checkMissing(data.expectedMaps.globalData, data.actualMaps.globalData);
-  for (Uri uri in neededDiffs) {
-    print('--annotations diff [${uri.pathSegments.last}]-------------');
-    print(data.diffCode(uri, dataValidator));
-    print('----------------------------------------------------------');
-  }
-  if (missingIds.isNotEmpty) {
-    print("MISSING ids: ${missingIds}.");
-    hasFailure = true;
-  }
-  if (hasFailure && fatalErrors) {
-    Expect.fail('Errors found.');
-  }
-  return hasFailure;
+Future<bool> runTestForConfiguration<T>(TestConfig testConfiguration,
+    DataComputer<T> dataComputer, TestData testData, List<String> options,
+    {bool filterActualData(IdValue idValue, ActualData<T> actualData),
+    bool verbose: false,
+    bool printCode: false,
+    bool forUserLibrariesOnly: true,
+    bool testAfterFailures: false}) async {
+  MemberAnnotations<IdValue> annotations =
+      testData.expectedMaps[testConfiguration.marker];
+  CompiledData<T> compiledData = await computeData(
+      testData.entryPoint, testData.memorySourceFiles, dataComputer,
+      options: [...options, ...testConfiguration.options],
+      verbose: verbose,
+      printCode: printCode,
+      testFrontend: dataComputer.testFrontend,
+      forUserLibrariesOnly: forUserLibrariesOnly,
+      globalIds: annotations.globalData.keys);
+  return await checkCode(testConfiguration.name, testData.testFileUri,
+      testData.code, annotations, compiledData, dataComputer.dataValidator,
+      filterActualData: filterActualData,
+      fatalErrors: !testAfterFailures,
+      onFailure: Expect.fail);
 }
 
 /// Compute a [Spannable] from an [id] in the library [mainUri].
@@ -950,6 +519,11 @@
   if (id is NodeId) {
     return new SourceSpan(mainUri, id.value, id.value + 1);
   } else if (id is MemberId) {
+    if (elementEnvironment == null) {
+      // If compilation resulted in error we might not have an
+      // element environment.
+      return NO_LOCATION_SPANNABLE;
+    }
     String memberName = id.memberName;
     bool isSetter = false;
     if (memberName != '[]=' && memberName != '==' && memberName.endsWith('=')) {
@@ -996,53 +570,8 @@
       return NO_LOCATION_SPANNABLE;
     }
     return cls;
+  } else if (id is LibraryId) {
+    return new SourceSpan(id.uri, null, null);
   }
   throw new UnsupportedError('Unsupported id $id.');
 }
-
-const String strongMarker = 'strong.';
-const String omitMarker = 'omit.';
-const String strongConstMarker = 'strongConst.';
-const String omitConstMarker = 'omitConst.';
-
-/// Compute three [MemberAnnotations] objects from [code] specifying the
-/// expected annotations we anticipate encountering; one corresponding to the
-/// old implementation, one for the new implementation, and one for the new
-/// implementation using strong mode.
-///
-/// If an annotation starts with 'ast.' it is only expected for the old
-/// implementation, if it starts with 'kernel.' it is only expected for the
-/// new implementation, and if it starts with 'strong.' it is only expected for
-/// strong mode (using the common frontend). Otherwise it is expected for all
-/// implementations.
-///
-/// Most nodes have the same and expectations should match this by using
-/// annotations without prefixes.
-void computeExpectedMap(Uri sourceUri, AnnotatedCode code,
-    Map<String, MemberAnnotations<IdValue>> maps) {
-  List<String> mapKeys = maps.keys.toList();
-  Map<String, AnnotatedCode> split = splitByPrefixes(code, mapKeys);
-
-  split.forEach((String marker, AnnotatedCode code) {
-    MemberAnnotations<IdValue> fileAnnotations = maps[marker];
-    assert(fileAnnotations != null, "No annotations for $marker in $maps");
-    Map<Id, IdValue> expectedValues = fileAnnotations[sourceUri];
-    for (Annotation annotation in code.annotations) {
-      String text = annotation.text;
-      IdValue idValue = IdValue.decode(annotation.offset, text);
-      if (idValue.id.isGlobal) {
-        Expect.isFalse(
-            fileAnnotations.globalData.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id} in $marker: "
-            "${idValue} and ${fileAnnotations.globalData[idValue.id]}.");
-        fileAnnotations.globalData[idValue.id] = idValue;
-      } else {
-        Expect.isFalse(
-            expectedValues.containsKey(idValue.id),
-            "Duplicate annotations for ${idValue.id} in $marker: "
-            "${idValue} and ${expectedValues[idValue.id]}.");
-        expectedValues[idValue.id] = idValue;
-      }
-    }
-  });
-}
diff --git a/tests/compiler/dart2js/equivalence/id_testing_test.dart b/tests/compiler/dart2js/equivalence/id_testing_test.dart
new file mode 100644
index 0000000..a24168a
--- /dev/null
+++ b/tests/compiler/dart2js/equivalence/id_testing_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.
+
+import 'dart:io';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:front_end/src/testing/id_testing_utils.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+
+main(List<String> args) {
+  asyncTest(() async {
+    Directory dataDir = new Directory.fromUri(Platform.script
+        .resolve('../../../../pkg/front_end/test/id_testing/data'));
+    await checkTests(dataDir, new IdTestingDataComputer(),
+        args: args,
+        testedConfigs: [sharedConfig],
+        supportedMarkers: sharedMarkers);
+  });
+}
+
+class IdTestingDataComputer extends DataComputer<String> {
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    ir.Member node = elementMap.getMemberNode(member);
+    new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
+        .run(node);
+  }
+
+  @override
+  void computeClassData(
+      Compiler compiler, ClassEntity cls, Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    ir.Class node = elementMap.getClassNode(cls);
+    new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
+        .computeForClass(node);
+  }
+
+  @override
+  void computeLibraryData(Compiler compiler, LibraryEntity library,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose}) {
+    KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    ir.Library node = elementMap.getLibraryNode(library);
+    new IdTestingDataExtractor(compiler.reporter, actualMap, elementMap)
+        .computeForLibrary(node, useFileUri: true);
+  }
+
+  @override
+  bool get supportsErrors => true;
+
+  @override
+  String computeErrorData(
+      Compiler compiler, Id id, List<CollectedMessage> errors) {
+    return errors.map((c) => c.message.message).join(',');
+  }
+
+  @override
+  bool get testFrontend => true;
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+/// IR visitor for computing inference data for a member.
+class IdTestingDataExtractor extends IrDataExtractor<String> {
+  final KernelToElementMapImpl elementMap;
+
+  IdTestingDataExtractor(DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap, this.elementMap)
+      : super(reporter, actualMap);
+
+  @override
+  String computeLibraryValue(Id id, ir.Library library) {
+    StringBuffer sb = new StringBuffer();
+    sb.write('file=${library.importUri.pathSegments.last}');
+    if (library.name != null) {
+      sb.write(',name=${library.name}');
+    }
+    return sb.toString();
+  }
+
+  String computeClassName(ir.Class cls) {
+    return cls.name;
+  }
+
+  String computeMemberName(ir.Member member) {
+    if (member.enclosingClass != null) {
+      return '${computeClassName(member.enclosingClass)}.'
+          '${getMemberName(member)}';
+    }
+    return getMemberName(member);
+  }
+
+  @override
+  String computeClassValue(Id id, ir.Class cls) {
+    return computeClassName(cls);
+  }
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.FunctionDeclaration) {
+      return '${computeMemberName(getEnclosingMember(node))}.'
+          '${node.variable.name}';
+    } else if (node is ir.FunctionExpression) {
+      return '${computeMemberName(getEnclosingMember(node))}.'
+          '<anonymous>';
+    }
+    return null;
+  }
+
+  @override
+  String computeMemberValue(Id id, ir.Member member) {
+    return computeMemberName(member);
+  }
+}
diff --git a/tests/compiler/dart2js/equivalence/show_helper.dart b/tests/compiler/dart2js/equivalence/show_helper.dart
index 8b8d4bc..c89194b 100644
--- a/tests/compiler/dart2js/equivalence/show_helper.dart
+++ b/tests/compiler/dart2js/equivalence/show_helper.dart
@@ -10,6 +10,7 @@
 import 'package:compiler/src/filenames.dart';
 import 'package:compiler/src/io/source_file.dart';
 import 'package:compiler/src/source_file_provider.dart';
+import 'package:front_end/src/testing/id_testing.dart';
 import 'id_equivalence_helper.dart';
 
 ArgParser createArgParser() {
@@ -48,7 +49,7 @@
   if (omitImplicitChecks) {
     options.add(Flags.omitImplicitChecks);
   }
-  CompiledData<T> data = await computeData<T>(
+  Dart2jsCompiledData<T> data = await computeData<T>(
       entryPoint, const {}, dataComputer,
       options: options,
       testFrontend: dataComputer.testFrontend,
diff --git a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
index 1a7ebe6..5003c2e 100644
--- a/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/jfield_analysis_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/field_analysis.dart';
 import 'package:compiler/src/js_model/js_world.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -17,7 +17,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('jdata'));
     await checkTests(dataDir, const JAllocatorAnalysisDataComputer(),
-        args: args, testOmit: false, testCFEConstants: true);
+        args: args, testedConfigs: allStrongConfigs);
   });
 }
 
@@ -76,7 +76,7 @@
       if (fieldData.isEffectivelyFinal && !fieldData.isEffectivelyConstant) {
         features.add(Tags.isEffectivelyFinal);
       }
-      Id id = computeEntityId(node);
+      Id id = computeMemberId(node);
       ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
       actualMap[id] = new ActualData<Features>(id, features,
           nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
diff --git a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
index 1f8c21a..fb1c5e0 100644
--- a/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
+++ b/tests/compiler/dart2js/field_analysis/kfield_analysis_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/js_backend/field_analysis.dart';
 import 'package:compiler/src/kernel/kernel_strategy.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -17,7 +17,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('kdata'));
     await checkTests(dataDir, const KAllocatorAnalysisDataComputer(),
-        args: args, testOmit: false, testCFEConstants: true);
+        args: args, testedConfigs: allStrongConfigs);
   });
 }
 
@@ -60,7 +60,7 @@
         }
         features[Tags.complexity] = staticFieldData.complexity.shortText;
       }
-      Id id = computeEntityId(node);
+      Id id = computeMemberId(node);
       ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
       actualMap[id] = new ActualData<Features>(id, features,
           nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
diff --git a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart b/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
index b1e0be0..6c3baf4 100644
--- a/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/helpers/memory_source_file_helper.dart
@@ -43,20 +43,19 @@
           'No such memory file $resourceUri in ${memorySourceFiles.keys}'));
     }
     Input<List<int>> input;
+    StringSourceFile stringFile;
+    if (source is String) {
+      stringFile = new StringSourceFile.fromUri(resourceUri, source);
+    }
     switch (inputKind) {
       case InputKind.UTF8:
-        if (source is String) {
-          input = new StringSourceFile.fromUri(resourceUri, source);
-        } else {
-          input = new Utf8BytesSourceFile(resourceUri, source);
-        }
+        input = stringFile ?? new Utf8BytesSourceFile(resourceUri, source);
         utf8SourceFiles[resourceUri] = input;
         break;
       case InputKind.binary:
-        if (source is String) {
-          utf8SourceFiles[resourceUri] =
-              new StringSourceFile.fromUri(resourceUri, source);
-          source = source.codeUnits;
+        if (stringFile != null) {
+          utf8SourceFiles[resourceUri] = stringFile;
+          source = stringFile.data;
         }
         input =
             binarySourceFiles[resourceUri] = new Binary(resourceUri, source);
diff --git a/tests/compiler/dart2js/helpers/shared_helper.dart b/tests/compiler/dart2js/helpers/shared_helper.dart
new file mode 100644
index 0000000..d03dddc
--- /dev/null
+++ b/tests/compiler/dart2js/helpers/shared_helper.dart
@@ -0,0 +1,253 @@
+// 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:compiler/src/constants/values.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/elements/types.dart';
+
+String constantToText(ConstantValue constant) {
+  StringBuffer sb = new StringBuffer();
+  new ConstantToTextVisitor().visit(constant, sb);
+  return sb.toString();
+}
+
+class DartTypeToTextVisitor extends DartTypeVisitor<void, StringBuffer> {
+  String visitList(Iterable<DartType> types, StringBuffer sb,
+      [String comma = '']) {
+    for (DartType type in types) {
+      sb.write(comma);
+      visit(type, sb);
+      comma = ',';
+    }
+    return comma;
+  }
+
+  @override
+  void visitVoidType(VoidType type, StringBuffer sb) {
+    sb.write('void');
+  }
+
+  @override
+  void visitTypeVariableType(TypeVariableType type, StringBuffer sb) {
+    sb.write(type.element.name);
+  }
+
+  @override
+  void visitFunctionTypeVariable(FunctionTypeVariable type, StringBuffer sb) {
+    sb.write(type.index);
+  }
+
+  @override
+  void visitFunctionType(FunctionType type, StringBuffer sb) {
+    sb.write('(');
+    String comma = visitList(type.parameterTypes, sb);
+    if (type.optionalParameterTypes.isNotEmpty) {
+      sb.write(comma);
+      sb.write('[');
+      visitList(type.optionalParameterTypes, sb);
+      sb.write(']');
+      comma = ',';
+    }
+    if (type.namedParameters.isNotEmpty) {
+      sb.write(comma);
+      sb.write('{');
+      comma = '';
+      for (int index = 0; index < type.namedParameters.length; index++) {
+        sb.write(comma);
+        visit(type.namedParameterTypes[index], sb);
+        sb.write(' ');
+        sb.write(type.namedParameters[index]);
+        comma = ',';
+      }
+      sb.write('}');
+    }
+    sb.write(')->');
+    visit(type.returnType, sb);
+  }
+
+  @override
+  void visitInterfaceType(InterfaceType type, StringBuffer sb) {
+    sb.write(type.element.name);
+    if (type.typeArguments.isNotEmpty) {
+      sb.write('<');
+      visitList(type.typeArguments, sb);
+      sb.write('>');
+    }
+  }
+
+  @override
+  void visitTypedefType(TypedefType type, StringBuffer sb) {
+    sb.write(type.element.name);
+    if (type.typeArguments.isNotEmpty) {
+      sb.write('<');
+      visitList(type.typeArguments, sb);
+      sb.write('>');
+    }
+  }
+
+  @override
+  void visitDynamicType(DynamicType type, StringBuffer sb) {
+    sb.write('dynamic');
+  }
+
+  @override
+  void visitFutureOrType(FutureOrType type, StringBuffer sb) {
+    sb.write('FutureOr<');
+    visit(type.typeArgument, sb);
+    sb.write('>');
+  }
+}
+
+class ConstantToTextVisitor
+    implements ConstantValueVisitor<void, StringBuffer> {
+  final DartTypeToTextVisitor typeToText = new DartTypeToTextVisitor();
+
+  void visit(ConstantValue constant, StringBuffer sb) =>
+      constant.accept(this, sb);
+
+  void visitConstants(Iterable<ConstantValue> constants, StringBuffer sb) {
+    String comma = '';
+    for (ConstantValue constant in constants) {
+      sb.write(comma);
+      visit(constant, sb);
+      comma = ',';
+    }
+  }
+
+  @override
+  void visitFunction(FunctionConstantValue constant, StringBuffer sb) {
+    sb.write('Function(${constant.element.name})');
+  }
+
+  @override
+  void visitNull(NullConstantValue constant, StringBuffer sb) {
+    sb.write('Null()');
+  }
+
+  @override
+  void visitInt(IntConstantValue constant, StringBuffer sb) {
+    sb.write('Int(${constant.intValue})');
+  }
+
+  @override
+  void visitDouble(DoubleConstantValue constant, StringBuffer sb) {
+    sb.write('Double(${constant.doubleValue})');
+  }
+
+  @override
+  void visitBool(BoolConstantValue constant, StringBuffer sb) {
+    sb.write('Bool(${constant.boolValue})');
+  }
+
+  @override
+  void visitString(StringConstantValue constant, StringBuffer sb) {
+    sb.write('String(${constant.stringValue})');
+  }
+
+  @override
+  void visitList(ListConstantValue constant, StringBuffer sb) {
+    sb.write('List<');
+    typeToText.visitList(constant.type.typeArguments, sb);
+    sb.write('>(');
+    visitConstants(constant.entries, sb);
+    sb.write(')');
+  }
+
+  @override
+  void visitSet(SetConstantValue constant, StringBuffer sb) {
+    sb.write('Set<');
+    typeToText.visitList(constant.type.typeArguments, sb);
+    sb.write('>(');
+    visitConstants(constant.values, sb);
+    sb.write(')');
+  }
+
+  @override
+  void visitMap(MapConstantValue constant, StringBuffer sb) {
+    sb.write('Map<');
+    typeToText.visitList(constant.type.typeArguments, sb);
+    sb.write('>(');
+    for (int index = 0; index < constant.keys.length; index++) {
+      if (index > 0) {
+        sb.write(',');
+      }
+      visit(constant.keys[index], sb);
+      sb.write(':');
+      visit(constant.values[index], sb);
+    }
+    sb.write(')');
+  }
+
+  @override
+  void visitConstructed(ConstructedConstantValue constant, StringBuffer sb) {
+    sb.write('Instance(');
+    typeToText.visit(constant.type, sb);
+    if (constant.fields.isNotEmpty) {
+      sb.write(',{');
+      String comma = '';
+      constant.fields.forEach((FieldEntity field, ConstantValue value) {
+        sb.write(comma);
+        sb.write(field.name);
+        sb.write(':');
+        visit(value, sb);
+        comma = ',';
+      });
+    }
+    sb.write(')');
+  }
+
+  @override
+  void visitType(TypeConstantValue constant, StringBuffer sb) {
+    sb.write('TypeLiteral(');
+    typeToText.visit(constant.representedType, sb);
+    sb.write(')');
+  }
+
+  @override
+  void visitInterceptor(InterceptorConstantValue constant, StringBuffer sb) {
+    throw new UnsupportedError(
+        'Unsupported constant value: ${constant.toStructuredText()}');
+  }
+
+  @override
+  void visitDummyInterceptor(
+      DummyInterceptorConstantValue constant, StringBuffer sb) {
+    throw new UnsupportedError(
+        'Unsupported constant value: ${constant.toStructuredText()}');
+  }
+
+  @override
+  void visitUnreachable(UnreachableConstantValue constant, StringBuffer sb) {
+    throw new UnsupportedError(
+        'Unsupported constant value: ${constant.toStructuredText()}');
+  }
+
+  @override
+  void visitJsName(JsNameConstantValue constant, StringBuffer sb) {
+    throw new UnsupportedError(
+        'Unsupported constant value: ${constant.toStructuredText()}');
+  }
+
+  @override
+  void visitDeferredGlobal(
+      DeferredGlobalConstantValue constant, StringBuffer sb) {
+    throw new UnsupportedError(
+        'Unsupported constant value: ${constant.toStructuredText()}');
+  }
+
+  @override
+  void visitNonConstant(NonConstantValue constant, StringBuffer sb) {
+    sb.write('NonConstant()');
+  }
+
+  @override
+  void visitInstantiation(
+      InstantiationConstantValue constant, StringBuffer sb) {
+    sb.write('Instantiation(');
+    sb.write(constant.function.element.name);
+    sb.write('<');
+    typeToText.visitList(constant.typeArguments, sb);
+    sb.write('>)');
+  }
+}
diff --git a/tests/compiler/dart2js/impact/impact_test.dart b/tests/compiler/dart2js/impact/impact_test.dart
index 879ff50..2fddf60 100644
--- a/tests/compiler/dart2js/impact/impact_test.dart
+++ b/tests/compiler/dart2js/impact/impact_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/universe/feature.dart';
 import 'package:compiler/src/universe/use.dart';
 import 'package:compiler/src/universe/world_impact.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -25,7 +25,7 @@
     print('==================================================================');
     useImpactDataForTesting = false;
     await checkTests(dataDir, const ImpactDataComputer(),
-        libDirectory: libDirectory, args: args, testOmit: false);
+        libDirectory: libDirectory, args: args, testedConfigs: [strongConfig]);
 
     print('Testing computation of ResolutionImpact through ImpactData');
     print('==================================================================');
@@ -33,8 +33,7 @@
     await checkTests(dataDir, const ImpactDataComputer(),
         libDirectory: libDirectory,
         args: args,
-        testOmit: false,
-        testCFEConstants: true);
+        testedConfigs: allStrongConfigs);
   });
 }
 
@@ -84,7 +83,7 @@
         features.addElement(Tags.runtimeTypeUse, use.shortText);
       }
     }
-    Id id = computeEntityId(node);
+    Id id = computeMemberId(node);
     ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
     actualMap[id] = new ActualData<Features>(id, features,
         nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
diff --git a/tests/compiler/dart2js/inference/inference_data_test.dart b/tests/compiler/dart2js/inference/inference_data_test.dart
index a3cad1f..9041fc7 100644
--- a/tests/compiler/dart2js/inference/inference_data_test.dart
+++ b/tests/compiler/dart2js/inference/inference_data_test.dart
@@ -12,7 +12,7 @@
 import 'package:compiler/src/js_backend/inferred_data.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_world.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -22,7 +22,9 @@
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('inference_data'));
     await checkTests(dataDir, const InferenceDataComputer(),
-        args: args, testOmit: false, options: [stopAfterTypeInference]);
+        args: args,
+        testedConfigs: [strongConfig],
+        options: [stopAfterTypeInference]);
   });
 }
 
diff --git a/tests/compiler/dart2js/inference/inference_test_helper.dart b/tests/compiler/dart2js/inference/inference_test_helper.dart
index bd0eddb..5d4b610 100644
--- a/tests/compiler/dart2js/inference/inference_test_helper.dart
+++ b/tests/compiler/dart2js/inference/inference_test_helper.dart
@@ -35,7 +35,7 @@
         forUserLibrariesOnly: true,
         args: args,
         options: [stopAfterTypeInference],
-        testCFEConstants: true,
+        testedConfigs: allInternalConfigs,
         skipForStrong: skipForStrong,
         shardIndex: shardIndex ?? 0,
         shards: shardIndex != null ? 4 : 1);
diff --git a/tests/compiler/dart2js/inference/side_effects/foreign.dart b/tests/compiler/dart2js/inference/side_effects/foreign.dart
index dc8ad67..1eb5a1f 100644
--- a/tests/compiler/dart2js/inference/side_effects/foreign.dart
+++ b/tests/compiler/dart2js/inference/side_effects/foreign.dart
@@ -29,12 +29,20 @@
   return JS_BUILTIN('String', JsBuiltin.rawRtiToJsConstructorName, null);
 }
 
-/*member: jsEmbeddedGlobal_getTypeFromName:SideEffects(reads static; writes nothing)*/
+/*strong.member: jsEmbeddedGlobal_getTypeFromName:SideEffects(reads static; writes nothing)*/
+/*omit.member: jsEmbeddedGlobal_getTypeFromName:SideEffects(reads static; writes nothing)*/
+// With CFE constant we no longer get the noise from the static get if GET_TYPE_FROM_NAME.
+/*strongConst.member: jsEmbeddedGlobal_getTypeFromName:SideEffects(reads nothing; writes nothing)*/
+/*omitConst.member: jsEmbeddedGlobal_getTypeFromName:SideEffects(reads nothing; writes nothing)*/
 jsEmbeddedGlobal_getTypeFromName() {
   return JS_EMBEDDED_GLOBAL('', GET_TYPE_FROM_NAME);
 }
 
-/*member: jsEmbeddedGlobal_libraries:SideEffects(reads static; writes nothing)*/
+/*strong.member: jsEmbeddedGlobal_libraries:SideEffects(reads static; writes nothing)*/
+/*omit.member: jsEmbeddedGlobal_libraries:SideEffects(reads static; writes nothing)*/
+// With CFE constant we no longer get the noise from the static get if LIBRARIES.
+/*strongConst.member: jsEmbeddedGlobal_libraries:SideEffects(reads nothing; writes nothing)*/
+/*omitConst.member: jsEmbeddedGlobal_libraries:SideEffects(reads nothing; writes nothing)*/
 jsEmbeddedGlobal_libraries() {
   return JS_EMBEDDED_GLOBAL('JSExtendableArray|Null', LIBRARIES);
 }
diff --git a/tests/compiler/dart2js/inference/side_effects_test.dart b/tests/compiler/dart2js/inference/side_effects_test.dart
index ec23f4e..09f0bb4 100644
--- a/tests/compiler/dart2js/inference/side_effects_test.dart
+++ b/tests/compiler/dart2js/inference/side_effects_test.dart
@@ -21,7 +21,9 @@
     Directory dataDir =
         new Directory.fromUri(Platform.script.resolve('side_effects'));
     await checkTests(dataDir, const SideEffectsDataComputer(),
-        args: args, options: [stopAfterTypeInference]);
+        args: args,
+        options: [stopAfterTypeInference],
+        testedConfigs: allInternalConfigs);
   });
 }
 
diff --git a/tests/compiler/dart2js/inference/type_mask2_test.dart b/tests/compiler/dart2js/inference/type_mask2_test.dart
index d817014..9d93908 100644
--- a/tests/compiler/dart2js/inference/type_mask2_test.dart
+++ b/tests/compiler/dart2js/inference/type_mask2_test.dart
@@ -12,17 +12,6 @@
 import 'package:compiler/src/world.dart' show JClosedWorld;
 import '../helpers/type_test_helper.dart';
 
-isCheckedMode() {
-  try {
-    dynamic i = 1;
-    // ignore: UNUSED_LOCAL_VARIABLE
-    String s = i;
-    return false;
-  } catch (e) {
-    return true;
-  }
-}
-
 void main() {
   runTests() async {
     await testUnionTypeMaskFlatten();
@@ -46,15 +35,10 @@
   Expect.listEquals(disjointMasks, disjoint,
       'Unexpected disjoint masks: $disjoint, expected $disjointMasks.');
   if (flattened == null) {
-    // We only do the invalid call to flatten in checked mode, as flatten's
-    // behaviour in unchecked mode is not defined and thus cannot be
-    // reliably tested.
-    if (isCheckedMode()) {
-      Expect.throws(
-          () => UnionTypeMask.flatten(disjoint, closedWorld),
-          (e) => e is AssertionError,
-          'Expect assertion failure on flattening of $disjoint.');
-    }
+    Expect.throws(
+        () => UnionTypeMask.flatten(disjoint, closedWorld),
+        (e) => e is ArgumentError,
+        'Expect argument error on flattening of $disjoint.');
   } else {
     TypeMask flattenResult = UnionTypeMask.flatten(disjoint, closedWorld);
     Expect.equals(
@@ -141,13 +125,23 @@
   TypeMask exactD = new TypeMask.nonNullExact(D, closedWorld);
   TypeMask exactE = new TypeMask.nonNullExact(E, closedWorld);
 
-  check([], result: empty, disjointMasks: [], containedClasses: []);
+  check([],
+      result: empty,
+      disjointMasks: [],
+      flattened: null, // 'flatten' throws.
+      containedClasses: []);
 
   check([exactA],
-      result: exactA, disjointMasks: [exactA], containedClasses: [A]);
+      result: exactA,
+      disjointMasks: [exactA],
+      flattened: subtypeA, // TODO(37602): Imprecise.
+      containedClasses: [A]);
 
   check([exactA, exactA],
-      result: exactA, disjointMasks: [exactA], containedClasses: [A]);
+      result: exactA,
+      disjointMasks: [exactA],
+      flattened: subtypeA, // TODO(37602): Imprecise.
+      containedClasses: [A]);
 
   check([exactA, exactB],
       disjointMasks: [exactA, exactB],
@@ -157,15 +151,20 @@
   check([subclassObject],
       result: subclassObject,
       disjointMasks: [subclassObject],
+      flattened: subclassObject,
       containedClasses: [Object_, A, B, C, D, E]);
 
   check([subclassObject, exactA],
       disjointMasks: [subclassObject],
       result: subclassObject,
+      flattened: subclassObject,
       containedClasses: [Object_, A, B, C, D, E]);
 
   check([exactA, exactC],
-      disjointMasks: [subclassA], result: subclassA, containedClasses: [A, C]);
+      disjointMasks: [subclassA],
+      result: subclassA,
+      flattened: subtypeA, // TODO(37602): Imprecise.
+      containedClasses: [A, C]);
 
   check([exactA, exactB, exactC],
       disjointMasks: [subclassA, exactB],
@@ -175,6 +174,7 @@
   check([exactA, exactD],
       disjointMasks: [subtypeA],
       result: subtypeA,
+      flattened: subtypeA,
       containedClasses: [A, C, D, E]);
 
   check([exactA, exactB, exactD],
@@ -185,6 +185,7 @@
   check([exactA, exactE],
       disjointMasks: [subtypeA],
       result: subtypeA,
+      flattened: subtypeA,
       containedClasses: [A, C, D, E]);
 
   check([exactA, exactB, exactE],
@@ -220,7 +221,9 @@
   ClassEntity String_ = env.getElement("String");
   ClassEntity JSString = closedWorld.commonElements.jsStringClass;
 
-  Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(Object_));
+  // TODO(37602): Track down why `Object` is directly instantiated:
+  // Expect.isFalse(closedWorld.classHierarchy.isDirectlyInstantiated(Object_));
+
   Expect.isTrue(closedWorld.classHierarchy.isIndirectlyInstantiated(Object_));
   Expect.isTrue(closedWorld.classHierarchy.isInstantiated(Object_));
 
diff --git a/tests/compiler/dart2js/jumps/jump_test.dart b/tests/compiler/dart2js/jumps/jump_test.dart
index 04d8988..5d3320a 100644
--- a/tests/compiler/dart2js/jumps/jump_test.dart
+++ b/tests/compiler/dart2js/jumps/jump_test.dart
@@ -129,11 +129,6 @@
     return null;
   }
 
-  @override
-  String computeMemberValue(Id id, ir.Member member) {
-    return null;
-  }
-
   void addTargetData(ir.TreeNode node, NodeId id, JumpTarget target) {
     if (target != null) {
       SourceSpan sourceSpan = computeSourceSpan(node);
diff --git a/tests/compiler/dart2js/member_usage/member_usage_test.dart b/tests/compiler/dart2js/member_usage/member_usage_test.dart
index fdccf53..dbc4022 100644
--- a/tests/compiler/dart2js/member_usage/member_usage_test.dart
+++ b/tests/compiler/dart2js/member_usage/member_usage_test.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/universe/member_usage.dart';
 import 'package:compiler/src/universe/resolution_world_builder.dart';
 import 'package:compiler/src/util/enumset.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -23,12 +23,12 @@
     print(' Test with enqueuer checks');
     print('------------------------------------------------------------------');
     await checkTests(dataDir, const ClosedWorldDataComputer(false),
-        args: args, testOmit: false, testCFEConstants: true);
+        args: args, testedConfigs: allStrongConfigs);
     print('------------------------------------------------------------------');
     print(' Test without enqueuer checks');
     print('------------------------------------------------------------------');
     await checkTests(dataDir, const ClosedWorldDataComputer(true),
-        args: args, testOmit: false, testCFEConstants: true);
+        args: args, testedConfigs: allStrongConfigs);
   });
 }
 
@@ -106,7 +106,7 @@
         }
       }
     }
-    Id id = computeEntityId(node);
+    Id id = computeMemberId(node);
     ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
     actualMap[id] = new ActualData<Features>(id, features,
         nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset, member);
diff --git a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
index 8eb6746..12c4bca 100644
--- a/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_evaluation_test.dart
@@ -580,6 +580,7 @@
     KernelToElementMapImpl elementMap = frontEndStrategy.elementMap;
     KElementEnvironment elementEnvironment =
         compiler.frontendStrategy.elementEnvironment;
+    ConstantValuefier constantValuefier = new ConstantValuefier(elementMap);
     LibraryEntity library = elementEnvironment.mainLibrary;
     constants.forEach((String name, ConstantData data) {
       IndexedField field =
@@ -604,14 +605,11 @@
             // all unevaluated constants have no uri.
             errors.add(message.code.name);
             reportLocatedMessage(elementMap.reporter, message, context);
-          },
-                  enableAsserts: true,
-                  environment: environment,
-                  supportReevaluationForTesting: true);
+          }, environment: environment, supportReevaluationForTesting: true);
           ir.Constant evaluatedConstant = evaluator.evaluate(initializer);
 
           ConstantValue value = evaluatedConstant is! ir.UnevaluatedConstant
-              ? evaluatedConstant.accept(new ConstantValuefier(elementMap))
+              ? constantValuefier.visitConstant(evaluatedConstant)
               : new NonConstantValue();
 
           Expect.isNotNull(
diff --git a/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart b/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
new file mode 100644
index 0000000..1a7dd18
--- /dev/null
+++ b/tests/compiler/dart2js/model/cfe_constant_swarm_test.dart
@@ -0,0 +1,29 @@
+// 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:args/args.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/commandline_options.dart';
+
+import '../helpers/args_helper.dart';
+import '../helpers/memory_compiler.dart';
+
+main(List<String> args) {
+  ArgParser argParser = createArgParser();
+
+  asyncTest(() async {
+    ArgResults argResults = argParser.parse(args);
+    Uri entryPoint = getEntryPoint(argResults) ??
+        Uri.base.resolve('samples-dev/swarm/swarm.dart');
+    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
+    Uri packageConfig = getPackages(argResults);
+    List<String> options = getOptions(argResults);
+    await runCompiler(
+        entryPoint: entryPoint,
+        packageConfig: packageConfig,
+        librariesSpecificationUri: librariesSpecificationUri,
+        options: ['${Flags.enableLanguageExperiments}=constant-update-2018']
+          ..addAll(options));
+  });
+}
diff --git a/tests/compiler/dart2js/model/cfe_constant_test.dart b/tests/compiler/dart2js/model/cfe_constant_test.dart
index 1a7dd18..1818979 100644
--- a/tests/compiler/dart2js/model/cfe_constant_test.dart
+++ b/tests/compiler/dart2js/model/cfe_constant_test.dart
@@ -2,28 +2,80 @@
 // for 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/args.dart';
+import 'dart:io';
 import 'package:async_helper/async_helper.dart';
-import 'package:compiler/src/commandline_options.dart';
-
-import '../helpers/args_helper.dart';
-import '../helpers/memory_compiler.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
+import 'package:compiler/src/elements/entities.dart';
+import 'package:compiler/src/kernel/element_map_impl.dart';
+import 'package:compiler/src/kernel/kernel_strategy.dart';
+import 'package:front_end/src/testing/id_testing.dart';
+import 'package:kernel/ast.dart' as ir;
+import 'package:kernel/class_hierarchy.dart' as ir;
+import 'package:kernel/core_types.dart' as ir;
+import 'package:kernel/type_algebra.dart' as ir;
+import 'package:kernel/type_environment.dart' as ir;
+import '../equivalence/id_equivalence.dart';
+import '../equivalence/id_equivalence_helper.dart';
+import '../helpers/shared_helper.dart';
 
 main(List<String> args) {
-  ArgParser argParser = createArgParser();
-
   asyncTest(() async {
-    ArgResults argResults = argParser.parse(args);
-    Uri entryPoint = getEntryPoint(argResults) ??
-        Uri.base.resolve('samples-dev/swarm/swarm.dart');
-    Uri librariesSpecificationUri = getLibrariesSpec(argResults);
-    Uri packageConfig = getPackages(argResults);
-    List<String> options = getOptions(argResults);
-    await runCompiler(
-        entryPoint: entryPoint,
-        packageConfig: packageConfig,
-        librariesSpecificationUri: librariesSpecificationUri,
-        options: ['${Flags.enableLanguageExperiments}=constant-update-2018']
-          ..addAll(options));
+    Directory dataDir = new Directory.fromUri(Platform.script
+        .resolve('../../../../pkg/front_end/test/constants/data'));
+    await checkTests(dataDir, new ConstantDataComputer(),
+        args: args,
+        testedConfigs: [sharedConfig],
+        supportedMarkers: sharedMarkers);
   });
 }
+
+class ConstantDataComputer extends DataComputer<String> {
+  ir.TypeEnvironment _typeEnvironment;
+
+  ir.TypeEnvironment getTypeEnvironment(KernelToElementMapImpl elementMap) {
+    if (_typeEnvironment == null) {
+      ir.Component component = elementMap.env.mainComponent;
+      _typeEnvironment = new ir.TypeEnvironment(
+          new ir.CoreTypes(component), new ir.ClassHierarchy(component));
+    }
+    return _typeEnvironment;
+  }
+
+  /// Compute type inference data for [member] from kernel based inference.
+  ///
+  /// Fills [actualMap] with the data.
+  @override
+  void computeMemberData(Compiler compiler, MemberEntity member,
+      Map<Id, ActualData<String>> actualMap,
+      {bool verbose: false}) {
+    KernelFrontendStrategy frontendStrategy = compiler.frontendStrategy;
+    KernelToElementMapImpl elementMap = frontendStrategy.elementMap;
+    ir.Member node = elementMap.getMemberNode(member);
+    new ConstantDataExtractor(compiler.reporter, actualMap, elementMap)
+        .run(node);
+  }
+
+  @override
+  bool get testFrontend => true;
+
+  @override
+  DataInterpreter<String> get dataValidator => const StringDataInterpreter();
+}
+
+/// IR visitor for computing inference data for a member.
+class ConstantDataExtractor extends IrDataExtractor<String> {
+  final KernelToElementMapImpl elementMap;
+
+  ConstantDataExtractor(DiagnosticReporter reporter,
+      Map<Id, ActualData<String>> actualMap, this.elementMap)
+      : super(reporter, actualMap);
+
+  @override
+  String computeNodeValue(Id id, ir.TreeNode node) {
+    if (node is ir.ConstantExpression) {
+      return constantToText(elementMap.getConstantValue(node));
+    }
+    return null;
+  }
+}
diff --git a/tests/compiler/dart2js/model/uri_extras_test.dart b/tests/compiler/dart2js/model/uri_extras_test.dart
deleted file mode 100644
index 7a500f1..0000000
--- a/tests/compiler/dart2js/model/uri_extras_test.dart
+++ /dev/null
@@ -1,88 +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.
-
-import "package:expect/expect.dart";
-
-import 'package:compiler/src/util/uri_extras.dart';
-
-void testRelativize() {
-  void c(String expected, String base, String path, bool isWindows) {
-    if (isWindows == null) {
-      c(expected, base, path, true);
-      c(expected, base, path, false);
-      return;
-    }
-
-    test(Uri base, Uri uri) {
-      String r = relativize(base, uri, isWindows);
-      Uri resolved = base.resolve(r);
-      Expect.equals(uri.scheme.toLowerCase(), resolved.scheme.toLowerCase());
-      if (isWindows) {
-        Expect.equals(uri.path.toLowerCase(), resolved.path.toLowerCase());
-      } else {
-        Expect.equals(uri.path, resolved.path);
-      }
-      Expect.stringEquals(expected, r);
-    }
-
-    test(Uri.parse('file:$base'), Uri.parse('file:$path'));
-
-    test(Uri.parse('FILE:$base'), Uri.parse('FILE:$path'));
-
-    test(Uri.parse('file:$base'), Uri.parse('FILE:$path'));
-
-    test(Uri.parse('FILE:$base'), Uri.parse('file:$path'));
-  }
-
-  c('bar', '/', '/bar', null);
-  c('bar', '/foo', '/bar', null);
-  c('/bar', '/foo/', '/bar', null);
-
-  c('bar', '///c:/', '///c:/bar', true);
-  c('bar', '///c:/foo', '///c:/bar', true);
-  c('/c:/bar', '///c:/foo/', '///c:/bar', true);
-
-  c('BAR', '///c:/', '///c:/BAR', true);
-  c('BAR', '///c:/foo', '///c:/BAR', true);
-  c('/c:/BAR', '///c:/foo/', '///c:/BAR', true);
-
-  c(
-      '../sdk/lib/_internal/compiler/implementation/dart2js.dart',
-      '///C:/Users/person/dart_checkout_for_stuff/dart/ReleaseIA32/dart.exe',
-      '///c:/Users/person/dart_checkout_for_stuff/dart/sdk/lib/_internal/compiler/'
-          'implementation/dart2js.dart',
-      true);
-
-  c('/Users/person/file.dart', '/users/person/', '/Users/person/file.dart',
-      false);
-
-  c('file.dart', '/Users/person/', '/Users/person/file.dart', null);
-
-  c('../person/file.dart', '/Users/other/', '/Users/person/file.dart', false);
-
-  c('/Users/person/file.dart', '/Users/other/', '/Users/person/file.dart',
-      true);
-
-  c('out.js.map', '/Users/person/out.js', '/Users/person/out.js.map', null);
-
-  c('../person/out.js.map', '/Users/other/out.js', '/Users/person/out.js.map',
-      false);
-
-  c('/Users/person/out.js.map', '/Users/other/out.js',
-      '/Users/person/out.js.map', true);
-
-  c('out.js', '/Users/person/out.js.map', '/Users/person/out.js', null);
-
-  c('../person/out.js', '/Users/other/out.js.map', '/Users/person/out.js',
-      false);
-
-  c('/Users/person/out.js', '/Users/other/out.js.map', '/Users/person/out.js',
-      true);
-
-  c('out.js', '/out.js.map', '/out.js', null);
-}
-
-void main() {
-  testRelativize();
-}
diff --git a/tests/compiler/dart2js/optimization/optimization_test.dart b/tests/compiler/dart2js/optimization/optimization_test.dart
index a1bc198..f42c259 100644
--- a/tests/compiler/dart2js/optimization/optimization_test.dart
+++ b/tests/compiler/dart2js/optimization/optimization_test.dart
@@ -15,7 +15,7 @@
 import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/ssa/logging.dart';
 import 'package:compiler/src/ssa/ssa.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
new file mode 100644
index 0000000..1d245c1
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_instance.dart
@@ -0,0 +1,105 @@
+// 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.
+
+main() {
+  var c = new Class();
+  c.method1a(null);
+  c.method1b(null);
+  c.method2a(null);
+  c.method2b(null);
+  c.method3a(null);
+  c.method3b(null);
+  c.method4a(null);
+  c.method4b(null);
+  c.method5a(null);
+  c.method5b(null);
+  c.method6a(null);
+  c.method6b(null);
+}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class1a:explicit=[Class1a]*/
+class Class1a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class1b:*/
+class Class1b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class2a:explicit=[Class2a]*/
+class Class2a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class2b:*/
+class Class2b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class3a:explicit=[Class3a]*/
+class Class3a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class3b:*/
+class Class3b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class4a:explicit=[Class4a<int>],needsArgs*/
+class Class4a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class4b:*/
+class Class4b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class5a:explicit=[Class5a<int>],needsArgs*/
+class Class5a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class5b:*/
+class Class5b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class6a:explicit=[Class6a<int>],needsArgs*/
+class Class6a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class6b:*/
+class Class6b<T> {}
+
+class Class {
+  @pragma('dart2js:parameter:check')
+  method1a(Class1a c) {}
+
+  @pragma('dart2js:parameter:trust')
+  method1b(Class1b c) {}
+
+  @pragma('dart2js:downcast:check')
+  Class2a method2a(o) => o;
+
+  @pragma('dart2js:downcast:trust')
+  Class2b method2b(o) => o;
+
+  @pragma('dart2js:as:check')
+  method3a(o) => o as Class3a;
+
+  @pragma('dart2js:as:trust')
+  method3b(o) => o as Class3b;
+
+  @pragma('dart2js:parameter:check')
+  method4a(Class4a<int> c) {}
+
+  @pragma('dart2js:parameter:trust')
+  method4b(Class4b<int> c) {}
+
+  @pragma('dart2js:downcast:check')
+  Class5a<int> method5a(o) => o;
+
+  @pragma('dart2js:downcast:trust')
+  Class5b<int> method5b(o) => o;
+
+  @pragma('dart2js:as:check')
+  method6a(o) => o as Class6a<int>;
+
+  @pragma('dart2js:as:trust')
+  method6b(o) => o as Class6b<int>;
+}
diff --git a/tests/compiler/dart2js/rti/data/pragma_directives_static.dart b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
new file mode 100644
index 0000000..b923edb
--- /dev/null
+++ b/tests/compiler/dart2js/rti/data/pragma_directives_static.dart
@@ -0,0 +1,102 @@
+// 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.
+
+main() {
+  method1a(null);
+  method1b(null);
+  method2a(null);
+  method2b(null);
+  method3a(null);
+  method3b(null);
+  method4a(null);
+  method4b(null);
+  method5a(null);
+  method5b(null);
+  method6a(null);
+  method6b(null);
+}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class1a:explicit=[Class1a]*/
+class Class1a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class1b:*/
+class Class1b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class2a:explicit=[Class2a]*/
+class Class2a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class2b:*/
+class Class2b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class3a:explicit=[Class3a]*/
+class Class3a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class3b:*/
+class Class3b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class4a:explicit=[Class4a<int>],needsArgs*/
+class Class4a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class4b:*/
+class Class4b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class5a:explicit=[Class5a<int>],needsArgs*/
+class Class5a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class5b:*/
+class Class5b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class6a:explicit=[Class6a<int>],needsArgs*/
+class Class6a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class6b:*/
+class Class6b<T> {}
+
+@pragma('dart2js:parameter:check')
+method1a(Class1a c) {}
+
+@pragma('dart2js:parameter:trust')
+method1b(Class1b c) {}
+
+@pragma('dart2js:downcast:check')
+Class2a method2a(o) => o;
+
+@pragma('dart2js:downcast:trust')
+Class2b method2b(o) => o;
+
+@pragma('dart2js:as:check')
+method3a(o) => o as Class3a;
+
+@pragma('dart2js:as:trust')
+method3b(o) => o as Class3b;
+
+@pragma('dart2js:parameter:check')
+method4a(Class4a<int> c) {}
+
+@pragma('dart2js:parameter:trust')
+method4b(Class4b<int> c) {}
+
+@pragma('dart2js:downcast:check')
+Class5a<int> method5a(o) => o;
+
+@pragma('dart2js:downcast:trust')
+Class5b<int> method5b(o) => o;
+
+@pragma('dart2js:as:check')
+method6a(o) => o as Class6a<int>;
+
+@pragma('dart2js:as:trust')
+method6b(o) => o as Class6b<int>;
diff --git a/tests/compiler/dart2js/rti/disable_rti_test.dart b/tests/compiler/dart2js/rti/disable_rti_test.dart
index 9e7b1aa..9c55ff6 100644
--- a/tests/compiler/dart2js/rti/disable_rti_test.dart
+++ b/tests/compiler/dart2js/rti/disable_rti_test.dart
@@ -7,7 +7,7 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/js_backend/runtime_types_resolution.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/world.dart';
 import 'package:expect/expect.dart';
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
new file mode 100644
index 0000000..c241513
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_instance.dart
@@ -0,0 +1,110 @@
+// 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.
+
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+value(o) => o;
+
+main() {
+  var c = new Class();
+  value(c).method1a(value(null));
+  value(c).method1b(value(null));
+  value(c).method2a(value(null));
+  value(c).method2b(value(null));
+  value(c).method3a(value(null));
+  value(c).method3b(value(null));
+  value(c).method4a(value(null));
+  value(c).method4b(value(null));
+  value(c).method5a(value(null));
+  value(c).method5b(value(null));
+  value(c).method6a(value(null));
+  value(c).method6b(value(null));
+}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class1a:checkedInstance*/
+class Class1a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class1b:*/
+class Class1b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class2a:checkedInstance*/
+class Class2a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class2b:*/
+class Class2b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class3a:checkedInstance*/
+class Class3a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class3b:*/
+class Class3b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class4a:checkedInstance*/
+class Class4a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class4b:*/
+class Class4b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class5a:checkedInstance*/
+class Class5a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class5b:*/
+class Class5b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class6a:checkedInstance*/
+class Class6a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class6b:*/
+class Class6b<T> {}
+
+/*class: Class:checks=[],instance*/
+class Class {
+  @pragma('dart2js:parameter:check')
+  method1a(Class1a c) {}
+
+  @pragma('dart2js:parameter:trust')
+  method1b(Class1b c) {}
+
+  @pragma('dart2js:downcast:check')
+  Class2a method2a(o) => o;
+
+  @pragma('dart2js:downcast:trust')
+  Class2b method2b(o) => o;
+
+  @pragma('dart2js:as:check')
+  method3a(o) => o as Class3a;
+
+  @pragma('dart2js:as:trust')
+  method3b(o) => o as Class3b;
+
+  @pragma('dart2js:parameter:check')
+  method4a(Class4a<int> c) {}
+
+  @pragma('dart2js:parameter:trust')
+  method4b(Class4b<int> c) {}
+
+  @pragma('dart2js:downcast:check')
+  Class5a<int> method5a(o) => o;
+
+  @pragma('dart2js:downcast:trust')
+  Class5b<int> method5b(o) => o;
+
+  @pragma('dart2js:as:check')
+  method6a(o) => o as Class6a<int>;
+
+  @pragma('dart2js:as:trust')
+  method6b(o) => o as Class6b<int>;
+}
diff --git a/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
new file mode 100644
index 0000000..379ea28
--- /dev/null
+++ b/tests/compiler/dart2js/rti/emission/pragma_directives_static.dart
@@ -0,0 +1,111 @@
+// 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.
+
+@pragma('dart2js:noInline')
+@pragma('dart2js:assumeDynamic')
+value(o) => o;
+
+main() {
+  method1a(value(null));
+  method1b(value(null));
+  method2a(value(null));
+  method2b(value(null));
+  method3a(value(null));
+  method3b(value(null));
+  method4a(value(null));
+  method4b(value(null));
+  method5a(value(null));
+  method5b(value(null));
+  method6a(value(null));
+  method6b(value(null));
+}
+
+// TODO(johnniwinther,sra): Find a way to check parameter checks on static
+// methods. For [Class1a], [Class1b], [Class4a] and [Class4b] either the CFE
+// inserts an implicit cast at the call-site or we disregard the forced check
+// because it is a static call.
+
+/*strong.class: Class1a:checkedInstance*/
+/*omit.class: Class1a:*/
+class Class1a {}
+
+/*strong.class: Class1b:checkedInstance*/
+/*omit.class: Class1b:*/
+class Class1b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class2a:checkedInstance*/
+class Class2a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class2b:*/
+class Class2b {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class3a:checkedInstance*/
+class Class3a {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class3b:*/
+class Class3b {}
+
+/*strong.class: Class4a:checkedInstance*/
+/*omit.class: Class4a:*/
+class Class4a<T> {}
+
+/*strong.class: Class4b:checkedInstance*/
+/*omit.class: Class4b:*/
+class Class4b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class5a:checkedInstance*/
+class Class5a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class5b:*/
+class Class5b<T> {}
+
+// Checks are needed both with and without --omit-implicit-checks.
+/*class: Class6a:checkedInstance*/
+class Class6a<T> {}
+
+// Checks are needed neither with nor without --omit-implicit-checks.
+/*class: Class6b:*/
+class Class6b<T> {}
+
+@pragma('dart2js:parameter:check')
+method1a(Class1a c) {}
+
+@pragma('dart2js:parameter:trust')
+method1b(Class1b c) {}
+
+@pragma('dart2js:downcast:check')
+Class2a method2a(o) => o;
+
+@pragma('dart2js:downcast:trust')
+Class2b method2b(o) => o;
+
+@pragma('dart2js:as:check')
+method3a(o) => o as Class3a;
+
+@pragma('dart2js:as:trust')
+method3b(o) => o as Class3b;
+
+@pragma('dart2js:parameter:check')
+method4a(Class4a<int> c) {}
+
+@pragma('dart2js:parameter:trust')
+method4b(Class4b<int> c) {}
+
+@pragma('dart2js:downcast:check')
+Class5a<int> method5a(o) => o;
+
+@pragma('dart2js:downcast:trust')
+Class5b<int> method5b(o) => o;
+
+@pragma('dart2js:as:check')
+method6a(o) => o as Class6a<int>;
+
+@pragma('dart2js:as:trust')
+method6b(o) => o as Class6b<int>;
diff --git a/tests/compiler/dart2js/rti/factory_call_test.dart b/tests/compiler/dart2js/rti/factory_call_test.dart
index f92fd7e..803b0be 100644
--- a/tests/compiler/dart2js/rti/factory_call_test.dart
+++ b/tests/compiler/dart2js/rti/factory_call_test.dart
@@ -6,7 +6,7 @@
 import 'package:compiler/src/common_elements.dart';
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
-import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/js_backend/runtime_types_resolution.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js/js.dart' as js;
diff --git a/tests/compiler/dart2js/rti/instance_call_test.dart b/tests/compiler/dart2js/rti/instance_call_test.dart
index 41c88ea..16f5538 100644
--- a/tests/compiler/dart2js/rti/instance_call_test.dart
+++ b/tests/compiler/dart2js/rti/instance_call_test.dart
@@ -8,7 +8,7 @@
 import 'package:compiler/src/compiler.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/names.dart';
-import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/js_backend/runtime_types_resolution.dart';
 import 'package:compiler/src/js_emitter/model.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js/js.dart' as js;
diff --git a/tests/compiler/dart2js/rti/rti_emission_test.dart b/tests/compiler/dart2js/rti/rti_emission_test.dart
index a6fc1c2..284074b 100644
--- a/tests/compiler/dart2js/rti/rti_emission_test.dart
+++ b/tests/compiler/dart2js/rti/rti_emission_test.dart
@@ -14,7 +14,7 @@
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/js_model/js_strategy.dart';
 import 'package:compiler/src/js_model/js_world.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/id_equivalence.dart';
 import '../equivalence/id_equivalence_helper.dart';
@@ -97,17 +97,14 @@
   const RtiEmissionDataComputer();
 
   @override
-  bool get computesClassData => true;
-
-  @override
   void computeMemberData(Compiler compiler, MemberEntity member,
       Map<Id, ActualData<String>> actualMap,
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
     MemberDefinition definition = elementMap.getMemberDefinition(member);
-    new RtiMemberEmissionIrComputer(compiler.reporter, actualMap, elementMap,
-            member, compiler, closedWorld.closureDataLookup)
+    new RtiEmissionIrComputer(compiler.reporter, actualMap, elementMap,
+            compiler, closedWorld.closureDataLookup)
         .run(definition.node);
   }
 
@@ -117,53 +114,36 @@
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
-    new RtiClassEmissionIrComputer(compiler, elementMap, actualMap)
-        .computeClassValue(cls);
+    new RtiEmissionIrComputer(compiler.reporter, actualMap, elementMap,
+            compiler, closedWorld.closureDataLookup)
+        .computeForClass(elementMap.getClassDefinition(cls).node);
   }
 
   @override
   DataInterpreter<String> get dataValidator => const StringDataInterpreter();
 }
 
-class RtiClassEmissionIrComputer extends DataRegistry<String>
-    with ComputeValueMixin, IrDataRegistryMixin<String> {
-  @override
-  final Compiler compiler;
-  final JsToElementMap _elementMap;
-  @override
-  final Map<Id, ActualData<String>> actualMap;
-
-  RtiClassEmissionIrComputer(this.compiler, this._elementMap, this.actualMap);
-
-  @override
-  DiagnosticReporter get reporter => compiler.reporter;
-
-  void computeClassValue(ClassEntity cls) {
-    Id id = new ClassId(cls.name);
-    ir.TreeNode node = _elementMap.getClassDefinition(cls).node;
-    ir.TreeNode nodeWithOffset = computeTreeNodeWithOffset(node);
-    registerValue(nodeWithOffset?.location?.file, nodeWithOffset?.fileOffset,
-        id, getClassValue(cls), cls);
-  }
-}
-
-class RtiMemberEmissionIrComputer extends IrDataExtractor<String>
+class RtiEmissionIrComputer extends IrDataExtractor<String>
     with ComputeValueMixin {
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
   @override
   final Compiler compiler;
 
-  RtiMemberEmissionIrComputer(
+  RtiEmissionIrComputer(
       DiagnosticReporter reporter,
       Map<Id, ActualData<String>> actualMap,
       this._elementMap,
-      MemberEntity member,
       this.compiler,
       this._closureDataLookup)
       : super(reporter, actualMap);
 
   @override
+  String computeClassValue(Id id, ir.Class node) {
+    return getClassValue(_elementMap.getClass(node));
+  }
+
+  @override
   String computeMemberValue(Id id, ir.Member node) {
     return getMemberValue(_elementMap.getMember(node));
   }
diff --git a/tests/compiler/dart2js/rti/rti_need_test_helper.dart b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
index bbdd2c2..1514c94 100644
--- a/tests/compiler/dart2js/rti/rti_need_test_helper.dart
+++ b/tests/compiler/dart2js/rti/rti_need_test_helper.dart
@@ -11,7 +11,7 @@
 import 'package:compiler/src/diagnostics/diagnostic_listener.dart';
 import 'package:compiler/src/elements/entities.dart';
 import 'package:compiler/src/elements/types.dart';
-import 'package:compiler/src/js_backend/runtime_types.dart';
+import 'package:compiler/src/js_backend/runtime_types_resolution.dart';
 import 'package:compiler/src/js_model/js_world.dart';
 import 'package:compiler/src/js_model/element_map.dart';
 import 'package:compiler/src/kernel/element_map.dart';
@@ -19,7 +19,7 @@
 import 'package:compiler/src/universe/feature.dart';
 import 'package:compiler/src/universe/resolution_world_builder.dart';
 import 'package:compiler/src/universe/selector.dart';
-import 'package:compiler/src/util/features.dart';
+import 'package:front_end/src/testing/features.dart';
 import 'package:kernel/ast.dart' as ir;
 import '../equivalence/check_helpers.dart';
 import '../equivalence/id_equivalence.dart';
@@ -233,9 +233,6 @@
 class RtiNeedDataComputer extends DataComputer<String> {
   const RtiNeedDataComputer();
 
-  @override
-  bool get computesClassData => true;
-
   /// Compute RTI need data for [member] from the new frontend.
   ///
   /// Fills [actualMap] with the data.
@@ -246,8 +243,8 @@
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
     MemberDefinition definition = elementMap.getMemberDefinition(member);
-    new RtiMemberNeedIrComputer(compiler.reporter, actualMap, elementMap,
-            member, compiler, closedWorld.closureDataLookup)
+    new RtiNeedIrComputer(compiler.reporter, actualMap, elementMap, compiler,
+            closedWorld.closureDataLookup)
         .run(definition.node);
   }
 
@@ -260,8 +257,9 @@
       {bool verbose: false}) {
     JsClosedWorld closedWorld = compiler.backendClosedWorldForTesting;
     JsToElementMap elementMap = closedWorld.elementMap;
-    new RtiClassNeedIrComputer(compiler, elementMap, actualMap)
-        .computeClassValue(cls);
+    new RtiNeedIrComputer(compiler.reporter, actualMap, elementMap, compiler,
+            closedWorld.closureDataLookup)
+        .computeForClass(elementMap.getClassDefinition(cls).node);
   }
 
   @override
@@ -339,23 +337,27 @@
 }
 
 /// AST visitor for computing inference data for a member.
-class RtiMemberNeedIrComputer extends IrDataExtractor<String>
+class RtiNeedIrComputer extends IrDataExtractor<String>
     with ComputeValueMixin, IrMixin {
   final JsToElementMap _elementMap;
   final ClosureData _closureDataLookup;
   @override
   final Compiler compiler;
 
-  RtiMemberNeedIrComputer(
+  RtiNeedIrComputer(
       DiagnosticReporter reporter,
       Map<Id, ActualData<String>> actualMap,
       this._elementMap,
-      MemberEntity member,
       this.compiler,
       this._closureDataLookup)
       : super(reporter, actualMap);
 
   @override
+  String computeClassValue(Id id, ir.Class node) {
+    return getClassValue(_elementMap.getClass(node));
+  }
+
+  @override
   String computeMemberValue(Id id, ir.Member node) {
     return getMemberValue(_elementMap.getMember(node));
   }
diff --git a/tests/compiler/dart2js/static_type/static_type_test.dart b/tests/compiler/dart2js/static_type/static_type_test.dart
index e530f19..c546b5f 100644
--- a/tests/compiler/dart2js/static_type/static_type_test.dart
+++ b/tests/compiler/dart2js/static_type/static_type_test.dart
@@ -25,7 +25,7 @@
   asyncTest(() async {
     Directory dataDir = new Directory.fromUri(Platform.script.resolve('data'));
     await checkTests(dataDir, new StaticTypeDataComputer(),
-        args: args, testOmit: false);
+        args: args, testedConfigs: [strongConfig]);
   });
 }
 
@@ -78,11 +78,6 @@
       : super(reporter, actualMap);
 
   @override
-  String computeMemberValue(Id id, ir.Member node) {
-    return null;
-  }
-
-  @override
   String computeNodeValue(Id id, ir.TreeNode node) {
     if (node is ir.VariableGet) {
       return typeToText(node.accept(staticTypeCache));
diff --git a/tests/compiler/dart2js/static_type/type_promotion_test.dart b/tests/compiler/dart2js/static_type/type_promotion_test.dart
index 1367dd3..ecbffe1 100644
--- a/tests/compiler/dart2js/static_type/type_promotion_test.dart
+++ b/tests/compiler/dart2js/static_type/type_promotion_test.dart
@@ -71,11 +71,6 @@
       : super(reporter, actualMap);
 
   @override
-  String computeMemberValue(Id id, ir.Member node) {
-    return null;
-  }
-
-  @override
   String computeNodeValue(Id id, ir.TreeNode node) {
     if (node is ir.VariableGet) {
       TypeMap type = typeMaps[node];
diff --git a/tests/compiler/dart2js_extra/37494_test.dart b/tests/compiler/dart2js_extra/37494_test.dart
new file mode 100644
index 0000000..d2d8283
--- /dev/null
+++ b/tests/compiler/dart2js_extra/37494_test.dart
@@ -0,0 +1,52 @@
+// 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.
+
+// Regression test for http://dartbug.com/37494
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+void main() {
+  final u8 = Uint8List(10);
+  // Uint8List.{sort,join} are ListMixin.{sort,join} which takes and explicit
+  // receiver because Uint8List is an intercepted type.
+  u8.sort();
+  print(u8.join());
+
+  final list = Example();
+  list.addAll([1, 2, 3]);
+  list.sort();
+  print(list.join());
+}
+
+class Example<T> extends ListBase<T> {
+  final _list = <T>[];
+
+  @override
+  operator [](int index) => _list[index];
+
+  @override
+  operator []=(int index, T value) {
+    _list[index] = value;
+  }
+
+  @override
+  int get length => _list.length;
+
+  @override
+  set length(int value) {
+    _list.length = value;
+  }
+
+  @override
+  String join([String separator = ""]) {
+    return super.join(separator); // This super call had bad dummy interceptor.
+  }
+
+  @override
+  @pragma('dart2js:noInline')
+  void sort([int compare(T a, T b)]) {
+    super.sort(compare); // This super call had bad dummy interceptor.
+  }
+}
diff --git a/tests/compiler/dart2js_extra/class_test.dart b/tests/compiler/dart2js_extra/class_test.dart
deleted file mode 100644
index d7b33ba..0000000
--- a/tests/compiler/dart2js_extra/class_test.dart
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
-// for 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 {
-  fisk() {
-    print('in fisk');
-  }
-}
-
-void main() {
-  // TODO(ahe): Should be "new Foo()" instead of "null".
-  Foo x = null;
-  x.fisk();
-}
diff --git a/tests/compiler/dart2js_extra/conditional_rewrite_test.dart b/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
new file mode 100644
index 0000000..57b0a42
--- /dev/null
+++ b/tests/compiler/dart2js_extra/conditional_rewrite_test.dart
@@ -0,0 +1,60 @@
+// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+// Test that dart2js does not rewrite conditional into logical operators
+// in cases where it changes which falsy value is returned.
+
+posFalse(x, y) => x != null ? y : false;
+negFalse(x, y) => x != null ? !y : false;
+posNull(x, y) => x != null ? y : null;
+negNull(x, y) => x != null ? !y : null;
+
+main() {
+  Expect.equals(false, posFalse(null, false));
+  Expect.equals(false, negFalse(null, false));
+  Expect.equals(null, posNull(null, false));
+  Expect.equals(null, negNull(null, false));
+
+  Expect.equals(false, posFalse(null, true));
+  Expect.equals(false, negFalse(null, true));
+  Expect.equals(null, posNull(null, true));
+  Expect.equals(null, negNull(null, true));
+
+  Expect.equals(false, posFalse([], false));
+  Expect.equals(true, negFalse([], false));
+  Expect.equals(false, posNull([], false));
+  Expect.equals(true, negNull([], false));
+
+  Expect.equals(true, posFalse([], true));
+  Expect.equals(false, negFalse([], true));
+  Expect.equals(true, posNull([], true));
+  Expect.equals(false, negNull([], true));
+
+  if (isConditionCheckDisabled) {
+    Expect.equals(null, posFalse([], null));
+    Expect.equals(true, negFalse([], null));
+    Expect.equals(null, posNull([], null));
+    Expect.equals(true, negNull([], null));
+
+    var y = {};
+    Expect.identical(y, posFalse([], y));
+    Expect.equals(true, negFalse([], y));
+    Expect.identical(y, posNull([], y));
+    Expect.equals(true, negNull([], y));
+  }
+}
+
+bool get isConditionCheckDisabled {
+  bool b = null;
+  for (int i = 0; i < 3; i++) {
+    try {
+      b = !b;
+    } catch (e) {
+      return false;
+    }
+  }
+  return true;
+}
diff --git a/tests/compiler/dart2js_extra/rti/bind_test.dart b/tests/compiler/dart2js_extra/rti/bind_test.dart
index ca75c20..4e38ba6 100644
--- a/tests/compiler/dart2js_extra/rti/bind_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bind_test.dart
@@ -11,33 +11,41 @@
       identical(rti1, rti2), 'identical(${format(rti1)}, ${format(rti2)}');
 }
 
+void checkToString(String expected, Object rti1) {
+  String result = rti.testingRtiToString(rti1);
+  if (expected == result) return;
+  Expect.equals(expected, result.replaceAll('minified:', ''));
+}
+
 test1() {
   var universe = rti.testingCreateUniverse();
 
   // Extend environment in one step
   var env1a = rti.testingUniverseEval(universe, 'Foo');
-  var args1 = rti.testingUniverseEval(universe, '@<aa,bb>');
+  var args1 = rti.testingUniverseEval(universe, '@<aaa,bbb>');
   var env1b = rti.testingEnvironmentBind(universe, env1a, args1);
 
-  var rti1 = rti.testingEnvironmentEval(universe, env1b, 'A<0,1,2>');
-  Expect.equals('A<Foo, aa, bb>', rti.testingRtiToString(rti1));
+  var rti1 = rti.testingEnvironmentEval(universe, env1b, 'AAA<0,1,2>');
+  checkToString('AAA<Foo, aaa, bbb>', rti1);
 
-  Expect.equals('binding(interface("Foo"), [interface("aa"), interface("bb")])',
+  Expect.equals(
+      'binding(interface("Foo"), [interface("aaa"), interface("bbb")])',
       rti.testingRtiToDebugString(env1b));
 
   // Extend environment in two steps
   var env2a = rti.testingUniverseEval(universe, 'Foo');
-  var args2a = rti.testingUniverseEval(universe, 'aa');
+  var args2a = rti.testingUniverseEval(universe, 'aaa');
   var env2b = rti.testingEnvironmentBind(universe, env2a, args2a);
-  var args2b = rti.testingUniverseEval(universe, 'bb');
+  var args2b = rti.testingUniverseEval(universe, 'bbb');
   var env2c = rti.testingEnvironmentBind(universe, env2b, args2b);
 
-  var rti2 = rti.testingEnvironmentEval(universe, env2c, 'A<0,1,2>');
-  Expect.equals('A<Foo, aa, bb>', rti.testingRtiToString(rti2));
+  var rti2 = rti.testingEnvironmentEval(universe, env2c, 'AAA<0,1,2>');
+  checkToString('AAA<Foo, aaa, bbb>', rti2);
 
-  Expect.equals('binding(interface("Foo"), [interface("aa")])',
+  Expect.equals('binding(interface("Foo"), [interface("aaa")])',
       rti.testingRtiToDebugString(env2b));
-  Expect.equals('binding(interface("Foo"), [interface("aa"), interface("bb")])',
+  Expect.equals(
+      'binding(interface("Foo"), [interface("aaa"), interface("bbb")])',
       rti.testingRtiToDebugString(env2c));
 
   checkRtiIdentical(env1b, env2c);
diff --git a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart b/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
index 5628d8a..67f8ec3 100644
--- a/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/bound_environment_test.dart
@@ -11,6 +11,12 @@
       identical(rti1, rti2), 'identical(${format(rti1)}, ${format(rti2)}');
 }
 
+void checkToString(String expected, Object rti1) {
+  String result = rti.testingRtiToString(rti1);
+  if (expected == result) return;
+  Expect.equals(expected, result.replaceAll('minified:', ''));
+}
+
 test1() {
   var universe = rti.testingCreateUniverse();
 
@@ -18,12 +24,12 @@
   var rti1 = rti.testingUniverseEval(universe, 'int');
   var rti2 = rti.testingEnvironmentEval(universe, env, '1');
 
-  Expect.equals('int', rti.testingRtiToString(rti1));
-  Expect.equals('int', rti.testingRtiToString(rti2));
+  checkToString('int', rti1);
+  checkToString('int', rti2);
   checkRtiIdentical(rti1, rti2);
 
-  var rti3 = rti.testingEnvironmentEval(universe, env, 'A<0,1,2>');
-  Expect.equals('A<Foo<bool>, int, bool>', rti.testingRtiToString(rti3));
+  var rti3 = rti.testingEnvironmentEval(universe, env, 'AAA<0,1,2>');
+  checkToString('AAA<Foo<bool>, int, bool>', rti3);
 }
 
 test2() {
@@ -35,34 +41,33 @@
   var env1 = rti.testingUniverseEval(universe, 'Foo<bool><int>');
   var env2 = rti.testingUniverseEval(universe, 'Foo;<bool><int>');
 
-  var rti1 = rti.testingEnvironmentEval(universe, env1, 'A<0,1,2>');
-  var rti2 = rti.testingEnvironmentEval(universe, env2, 'A<0,1,2>');
-  Expect.equals('A<Foo<bool>, int, bool>', rti.testingRtiToString(rti1));
-  Expect.equals('A<Foo, bool, int>', rti.testingRtiToString(rti2));
+  var rti1 = rti.testingEnvironmentEval(universe, env1, 'AAA<0,1,2>');
+  var rti2 = rti.testingEnvironmentEval(universe, env2, 'AAA<0,1,2>');
+  checkToString('AAA<Foo<bool>, int, bool>', rti1);
+  checkToString('AAA<Foo, bool, int>', rti2);
 }
 
 test3() {
   var universe = rti.testingCreateUniverse();
-  var env = rti.testingUniverseEval(universe, 'C<aa,bb><cc,@>');
-  var rti1 = rti.testingEnvironmentEval(universe, env, 'A<0,1,2,3,4>');
-  Expect.equals(
-      'A<C<aa, bb>, cc, dynamic, aa, bb>', rti.testingRtiToString(rti1));
+  var env = rti.testingUniverseEval(universe, 'CCC<aaa,bbb><ccc,@>');
+  var rti1 = rti.testingEnvironmentEval(universe, env, 'AAA<0,1,2,3,4>');
+  checkToString('AAA<CCC<aaa, bbb>, ccc, dynamic, aaa, bbb>', rti1);
 }
 
 test4() {
   var universe = rti.testingCreateUniverse();
-  var env = rti.testingUniverseEval(universe, '@<aa,bb>');
-  var rti1 = rti.testingEnvironmentEval(universe, env, 'A<0,1,2>');
-  Expect.equals('A<dynamic, aa, bb>', rti.testingRtiToString(rti1));
+  var env = rti.testingUniverseEval(universe, '@<aaa,bbb>');
+  var rti1 = rti.testingEnvironmentEval(universe, env, 'AAA<0,1,2>');
+  checkToString('AAA<dynamic, aaa, bbb>', rti1);
 }
 
 test5() {
   var universe = rti.testingCreateUniverse();
-  var env1 = rti.testingUniverseEval(universe, '@<aa><bb><cc>');
-  var env2 = rti.testingUniverseEval(universe, '@;<aa><bb><cc>');
-  var rti1 = rti.testingEnvironmentEval(universe, env1, 'A<0,1,2,3>');
-  var rti2 = rti.testingEnvironmentEval(universe, env2, 'A<0,1,2,3>');
-  Expect.equals('A<dynamic, aa, bb, cc>', rti.testingRtiToString(rti1));
+  var env1 = rti.testingUniverseEval(universe, '@<aaa><bbb><ccc>');
+  var env2 = rti.testingUniverseEval(universe, '@;<aaa><bbb><ccc>');
+  var rti1 = rti.testingEnvironmentEval(universe, env1, 'AAA<0,1,2,3>');
+  var rti2 = rti.testingEnvironmentEval(universe, env2, 'AAA<0,1,2,3>');
+  checkToString('AAA<dynamic, aaa, bbb, ccc>', rti1);
   checkRtiIdentical(rti1, rti2);
 }
 
diff --git a/tests/compiler/dart2js_extra/rti/class_environment_test.dart b/tests/compiler/dart2js_extra/rti/class_environment_test.dart
index 1651fdf..4cf7d9e 100644
--- a/tests/compiler/dart2js_extra/rti/class_environment_test.dart
+++ b/tests/compiler/dart2js_extra/rti/class_environment_test.dart
@@ -11,6 +11,12 @@
       identical(rti1, rti2), 'identical(${format(rti1)}, ${format(rti2)}');
 }
 
+void checkToString(String expected, Object rti1) {
+  String result = rti.testingRtiToString(rti1);
+  if (expected == result) return;
+  Expect.equals(expected, result.replaceAll('minified:', ''));
+}
+
 testInterface1() {
   var universe = rti.testingCreateUniverse();
 
@@ -18,8 +24,8 @@
   var rti1 = rti.testingUniverseEval(universe, 'int');
   var rti2 = rti.testingEnvironmentEval(universe, env, '1');
 
-  Expect.equals('int', rti.testingRtiToString(rti1));
-  Expect.equals('int', rti.testingRtiToString(rti2));
+  checkToString('int', rti1);
+  checkToString('int', rti2);
   checkRtiIdentical(rti1, rti2);
 }
 
@@ -31,9 +37,9 @@
   var rti2 = rti.testingEnvironmentEval(universe, env, '2');
   var rti3 = rti.testingEnvironmentEval(universe, env, 'List<1>');
 
-  Expect.equals('List<int>', rti.testingRtiToString(rti1));
-  Expect.equals('List<int>', rti.testingRtiToString(rti2));
-  Expect.equals('List<int>', rti.testingRtiToString(rti3));
+  checkToString('List<int>', rti1);
+  checkToString('List<int>', rti2);
+  checkToString('List<int>', rti3);
   checkRtiIdentical(rti1, rti2);
   checkRtiIdentical(rti1, rti3);
 }
diff --git a/tests/compiler/dart2js_extra/rti/constant_type_test.dart b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
new file mode 100644
index 0000000..6281f06
--- /dev/null
+++ b/tests/compiler/dart2js_extra/rti/constant_type_test.dart
@@ -0,0 +1,40 @@
+// 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.
+//
+// dart2jsOptions=--experiment-new-rti --no-minify
+
+import "package:expect/expect.dart";
+
+class Thingy {
+  const Thingy();
+}
+
+class Generic<AA> {
+  const Generic();
+}
+
+@pragma('dart2js:noInline')
+void check<T>(o) {
+  Expect.isTrue(o is T);
+  Expect.isFalse(o is! T);
+}
+
+main() {
+  check<Thingy>(const Thingy());
+
+  check<Generic<int>>(const Generic<int>());
+
+  check<Generic<dynamic>>(const Generic<dynamic>());
+  check<Generic<Object>>(const Generic<Object>());
+  check<Generic<Object>>(const Generic<dynamic>());
+  check<Generic<dynamic>>(const Generic<Object>());
+
+  check<List<int>>(const [1]);
+  check<List<String>>(const ['one']);
+
+  check<Set<int>>(const {1, 2, 3});
+  check<Map<String, int>>(const {'one': 1});
+
+  check<Symbol>(#hello);
+}
diff --git a/tests/compiler/dart2js_extra/rti/simple_2_test.dart b/tests/compiler/dart2js_extra/rti/simple_2_test.dart
index e092311..ac77e3c 100644
--- a/tests/compiler/dart2js_extra/rti/simple_2_test.dart
+++ b/tests/compiler/dart2js_extra/rti/simple_2_test.dart
@@ -5,6 +5,12 @@
 import 'dart:_rti' as rti;
 import "package:expect/expect.dart";
 
+void checkToString(String expected, Object rti1) {
+  String result = rti.testingRtiToString(rti1);
+  if (expected == result) return;
+  Expect.equals(expected, result.replaceAll('minified:', ''));
+}
+
 testDynamic1() {
   var universe = rti.testingCreateUniverse();
 
@@ -13,7 +19,7 @@
 
   Expect.isTrue(identical(rti1, rti2), 'dynamic should be identical');
   Expect.isFalse(rti1 is String);
-  Expect.equals('dynamic', rti.testingRtiToString(rti1));
+  checkToString('dynamic', rti1);
 }
 
 testDynamic2() {
@@ -24,7 +30,7 @@
 
   Expect.isTrue(identical(rti1, rti2), 'dynamic should be identical');
   Expect.isFalse(rti1 is String);
-  Expect.equals('dynamic', rti.testingRtiToString(rti1));
+  checkToString('dynamic', rti1);
 }
 
 testVoid() {
@@ -35,7 +41,7 @@
 
   Expect.isTrue(identical(rti1, rti2), 'void should be identical');
   Expect.isFalse(rti1 is String);
-  Expect.equals('void', rti.testingRtiToString(rti1));
+  checkToString('void', rti1);
 }
 
 testNever() {
@@ -46,7 +52,7 @@
 
   Expect.isTrue(identical(rti1, rti2), 'Never should be identical');
   Expect.isFalse(rti1 is String);
-  Expect.equals('Never', rti.testingRtiToString(rti1));
+  checkToString('Never', rti1);
 }
 
 testAny() {
@@ -57,7 +63,7 @@
 
   Expect.isTrue(identical(rti1, rti2), "'any' should be identical");
   Expect.isFalse(rti1 is String);
-  Expect.equals('any', rti.testingRtiToString(rti1));
+  checkToString('any', rti1);
 }
 
 testTerminal() {
@@ -84,7 +90,7 @@
 
   Expect.isTrue(identical(rti1, rti2));
   Expect.isFalse(rti1 is String);
-  Expect.equals('int', rti.testingRtiToString(rti1));
+  checkToString('int', rti1);
 }
 
 testInterface2() {
@@ -95,7 +101,7 @@
 
   Expect.isTrue(identical(rti1, rti2));
   Expect.isFalse(rti1 is String);
-  Expect.equals('Foo<int, bool>', rti.testingRtiToString(rti1));
+  checkToString('Foo<int, bool>', rti1);
 }
 
 testInterface3() {
@@ -106,7 +112,7 @@
 
   Expect.isTrue(identical(rti1, rti2));
   Expect.isFalse(rti1 is String);
-  Expect.equals('Foo<Bar<int>, Bar<bool>>', rti.testingRtiToString(rti1));
+  checkToString('Foo<Bar<int>, Bar<bool>>', rti1);
 }
 
 testInterface4() {
@@ -117,7 +123,7 @@
 
   Expect.isTrue(identical(rti1, rti2));
   Expect.isFalse(rti1 is String);
-  Expect.equals('Foo<Foo<Foo<Foo<int>>>>', rti.testingRtiToString(rti1));
+  checkToString('Foo<Foo<Foo<Foo<int>>>>', rti1);
 }
 
 main() {
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
new file mode 100644
index 0000000..1ed2045
--- /dev/null
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type2_test.dart
@@ -0,0 +1,51 @@
+// 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.
+//
+// dart2jsOptions=--experiment-new-rti
+
+import "package:expect/expect.dart";
+
+int fnInt2Int(int x) => x;
+int fnIntOptInt2Int(int x, [int y = 0]) => x + y;
+
+make1<A, B>(A a) {
+  return (B b) => a;
+}
+
+make2<A, B>(A a) {
+  A foo(B b) => a;
+  return foo;
+}
+
+class C<A> {
+  final A a;
+  C(this.a);
+  make<B>() => (B b) => a;
+  make2<B>() => (B b) => 'x';
+}
+
+main() {
+  Expect.isTrue(make1<int, int>(1) is int Function(int));
+  Expect.isTrue(make1<int, int>(1) is Object Function(int));
+  Expect.isTrue(make1<int, int>(1) is! String Function(int));
+  Expect.isTrue(make1<int, int>(1) is! int Function(String));
+
+  Expect.isTrue(make2<int, int>(1) is int Function(int));
+  Expect.isTrue(make2<int, int>(1) is Object Function(int));
+  Expect.isTrue(make2<int, int>(1) is! String Function(int));
+  Expect.isTrue(make2<int, int>(1) is! int Function(String));
+
+  Expect.isTrue(C<int>(1).make<String>() is int Function(String));
+  Expect.isTrue(C<int>(1).make<String>() is Object Function(String));
+  Expect.isTrue(C<int>(1).make<String>() is! String Function(int));
+
+  Expect.isTrue(C<int>(1).make2<int>() is String Function(int));
+  Expect.isTrue(C<int>(1).make2<int>() is Object Function(int));
+  Expect.isTrue(C<int>(1).make2<int>() is! int Function(String));
+  Expect.isTrue(C<int>(1).make2<int>() is! int Function(int));
+  Expect.isTrue(C<int>(1).make2<String>() is String Function(String));
+  Expect.isTrue(C<int>(1).make2<String>() is Object Function(String));
+  Expect.isTrue(C<int>(1).make2<String>() is! int Function(String));
+  Expect.isTrue(C<int>(1).make2<String>() is! String Function(int));
+}
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
new file mode 100644
index 0000000..9843216
--- /dev/null
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type3_test.dart
@@ -0,0 +1,31 @@
+// 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.
+//
+// dart2jsOptions=--experiment-new-rti
+
+// Test that some closures are 'is Function'.
+
+import "package:expect/expect.dart";
+
+@pragma('dart2js:noInline')
+confuse(x) => x;
+
+main() {
+  // static tear-off.
+  Expect.isTrue(confuse(main) is Function);
+
+  // instance tear-off.
+  Expect.isTrue(confuse([].add) is Function);
+
+  // function expression.
+  Expect.isTrue(confuse(() => 1) is Function);
+
+  // local function.
+  int add1(int x) => x;
+
+  Expect.isTrue(confuse(add1) is Function);
+
+  Expect.isFalse(confuse(null) is Function);
+  Expect.isFalse(confuse(1) is Function);
+}
diff --git a/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
new file mode 100644
index 0000000..d87c89c
--- /dev/null
+++ b/tests/compiler/dart2js_extra/rti/simple_is_function_type_test.dart
@@ -0,0 +1,23 @@
+// 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.
+//
+// dart2jsOptions=--experiment-new-rti
+
+import 'dart:_rti' as rti;
+import "package:expect/expect.dart";
+
+int fnInt2Int(int x) => x;
+int fnIntOptInt2Int(int x, [int y = 0]) => x + y;
+
+main() {
+  Expect.isTrue(fnInt2Int is int Function(int));
+
+  Expect.isTrue(fnInt2Int is void Function(int));
+  Expect.isFalse(fnInt2Int is int Function());
+
+  Expect.isTrue(fnIntOptInt2Int is int Function(int, [int]));
+
+  Expect.isTrue(fnIntOptInt2Int is int Function(int, int));
+  Expect.isTrue(fnIntOptInt2Int is int Function(int));
+}
diff --git a/tests/compiler/dart2js_extra/rti/subtype_test.dart b/tests/compiler/dart2js_extra/rti/subtype_test.dart
index c90f0f7..06a624f 100644
--- a/tests/compiler/dart2js_extra/rti/subtype_test.dart
+++ b/tests/compiler/dart2js_extra/rti/subtype_test.dart
@@ -14,6 +14,7 @@
 const typeRulesJson = r'''
 {
   "int": {"num": []},
+  "double": {"num": []},
   "List": {"Iterable": ["1"]},
   "CodeUnits": {
     "List": ["int"],
@@ -35,6 +36,8 @@
   testTopTypes();
   testNull();
   testFutureOr();
+  testFunctions();
+  testGenericFunctions();
 }
 
 void testInterfaces() {
@@ -83,6 +86,65 @@
   equivalent('@/', '~/');
 }
 
+void testFunctions() {
+  equivalent('~()', '~()');
+  equivalent('@()', '~()');
+  unrelated('int()', 'int(int)');
+  strictSubtype('int()', 'num()');
+  strictSubtype('~(num)', '~(int)');
+  strictSubtype('int(Iterable<num>)', 'num(CodeUnits)');
+
+  equivalent('~(int,@,num)', '~(int,@,num)');
+  equivalent('@(int,~,num)', '~(int,@,num)');
+  unrelated('int(int,double)', 'void(String)');
+  unrelated('int(int,double)', 'int(int)');
+  unrelated('int(int,double)', 'int(double)');
+  unrelated('int(int,double)', 'int(int,int)');
+  unrelated('int(int,double)', 'int(String,double)');
+  strictSubtype('int(int,double)', '~(int,double)');
+  strictSubtype('int(int,double)', 'num(int,double)');
+  strictSubtype('int(num,double)', 'int(int,double)');
+  strictSubtype('int(int,num)', 'int(int,double)');
+  strictSubtype('int(num,num)', 'int(int,double)');
+  strictSubtype('double(num,Iterable<num>,int/)', 'num(int,CodeUnits,int)');
+
+  equivalent('~([@])', '~([@])');
+  equivalent('~(int,[double])', '~(int,[double])');
+  equivalent('~(int,[double,CodeUnits])', '~(int,[double,CodeUnits])');
+  unrelated('~([int])', '~([double])');
+  unrelated('~(int,[int])', '~(int,[double])');
+  unrelated('~(int,[CodeUnits,int])', '~(int,[CodeUnits,double])');
+  strictSubtype('~([num])', '~([int])');
+  strictSubtype('~([num,num])', '~([int,double])');
+  strictSubtype('~([int,double])', '~(int,[double])');
+  strictSubtype('~([int,double,CodeUnits])', '~([int,double])');
+  strictSubtype('~([int,double,CodeUnits])', '~(int,[double])');
+
+  equivalent('~({foo:@})', '~({foo:@})');
+  unrelated('~({foo:@})', '~({bar:@})');
+  unrelated('~({foo:@,quux:@})', '~({bar:@,baz:@})');
+  unrelated('~(@,{foo:@})', '~(@,@)');
+  unrelated('~(@,{foo:@})', '~({bar:@,foo:@})');
+  equivalent('~({bar:int,foo:double})', '~({bar:int,foo:double})');
+  strictSubtype('~({bar:int,foo:double})', '~({bar:int})');
+  strictSubtype('~({bar:int,foo:double})', '~({foo:double})');
+  strictSubtype('~({bar:num,baz:num,foo:num})', '~({baz:int,foo:double})');
+}
+
+void testGenericFunctions() {
+  equivalent('~()<int>', '~()<int>');
+  unrelated('~()<int>', '~()<double>');
+  unrelated('~()<int>', '~()<int,int>');
+  unrelated('~()<int>', '~()<num>');
+  unrelated('~()<int,double>', '~()<double,int>');
+  strictSubtype('List<0^>()<int>', 'Iterable<0^>()<int>');
+  strictSubtype('~(Iterable<0^>)<int>', '~(List<0^>)<int>');
+
+  equivalent('~()<@>', '~()<~>');
+  equivalent('~()<List<@/>>', '~()<List<~/>>');
+  unrelated('~()<List<int/>>', '~()<List<num/>>');
+}
+
 String reason(String s, String t) => "$s <: $t";
 
 void strictSubtype(String s, String t) {
diff --git a/tests/compiler/dartdevc_native/hot_restart_test.dart b/tests/compiler/dartdevc_native/hot_restart_test.dart
new file mode 100644
index 0000000..37f01ba
--- /dev/null
+++ b/tests/compiler/dartdevc_native/hot_restart_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.
+
+import 'package:expect/expect.dart';
+import 'dart:_foreign_helper' show JS;
+import 'dart:_runtime' as dart;
+
+class Foo<T> {
+  Type type() => typeOf<Foo<T>>();
+}
+
+class Bar {}
+
+Type typeOf<T>() => T;
+
+Type fooOf<T>() => typeOf<Foo<T>>();
+
+typedef funcType = Function(String);
+
+void func(Object o) {}
+
+void main() {
+  var f1 = Foo<Bar>();
+  var t1 = typeOf<Foo<Bar>>();
+  Expect.equals(f1.type(), t1);
+  var s1 = fooOf<Bar>();
+  Expect.equals(t1, s1);
+
+  Expect.isTrue(func is funcType);
+
+  dart.hotRestart();
+
+  var f2 = Foo<Bar>();
+  Expect.isTrue(f2 is Foo<Bar>);
+  var t2 = typeOf<Foo<Bar>>();
+  Expect.equals(f2.type(), t2);
+  var s2 = fooOf<Bar>();
+  Expect.equals(t2, s2);
+
+  Expect.isTrue(func is funcType);
+}
diff --git a/tests/compiler/dartdevc_native/js_interop_test.dart b/tests/compiler/dartdevc_native/js_interop_test.dart
new file mode 100644
index 0000000..b2c3f08
--- /dev/null
+++ b/tests/compiler/dartdevc_native/js_interop_test.dart
@@ -0,0 +1,49 @@
+// 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.
+
+@JS()
+library js_interop_test;
+
+import 'package:expect/expect.dart';
+import 'package:js/js.dart';
+import 'dart:_foreign_helper' as helper show JS;
+import 'dart:_runtime' as dart;
+
+@JS()
+class Console {
+  @JS()
+  external void log(arg);
+}
+
+@JS('console')
+external Console get console;
+
+@JS('console.log')
+external void log(String s);
+
+void dartLog(String s) => log(s);
+
+@JS('foo')
+external set _foo(Function f);
+
+@JS('foo')
+external void foo(String s);
+
+void main() {
+  Function(String) jsFunc = helper.JS('', '(x) => {}');
+  Expect.equals(dart.assertInterop(jsFunc), jsFunc);
+
+  Expect.equals(dart.assertInterop(log), log);
+  Expect.equals(dart.assertInterop(console.log), console.log);
+  Expect.throws(() => dart.assertInterop(dartLog));
+
+  Expect.isNull(foo);
+  _foo = jsFunc;
+  Expect.isNotNull(foo);
+  Expect.equals(dart.assertInterop(foo), foo);
+
+  // TODO(vsm): We should inject an assert here and fail on this assignment.
+  _foo = dartLog;
+  Expect.throws(() => dart.assertInterop(foo));
+}
diff --git a/tests/compiler/dartdevc_native/subtype_test.dart b/tests/compiler/dartdevc_native/subtype_test.dart
index 4a14499..fd89ae0 100644
--- a/tests/compiler/dartdevc_native/subtype_test.dart
+++ b/tests/compiler/dartdevc_native/subtype_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:expect/expect.dart";
 import 'dart:_foreign_helper' show JS;
 import 'dart:_runtime' as dart;
+import 'dart:async';
+
+import 'package:expect/expect.dart';
 
 class A {}
 
@@ -14,6 +16,10 @@
 
 class D<T extends B> {}
 
+class E<T, S> {}
+
+class F extends E<B, B> {}
+
 // Returns sWrapped<tWrapped> as a wrapped type.
 Object generic1(Type sWrapped, Type tWrapped) {
   var s = dart.unwrapType(sWrapped);
@@ -22,25 +28,178 @@
   return dart.wrapType(JS('', '#(#)', sGeneric, t));
 }
 
+// Returns sWrapped<tWrapped, rWrapped> as a wrapped type.
+Object generic2(Type sWrapped, Type tWrapped, Type rWrapped) {
+  var s = dart.unwrapType(sWrapped);
+  var t = dart.unwrapType(tWrapped);
+  var r = dart.unwrapType(rWrapped);
+  var sGeneric = dart.getGenericClass(s);
+  return dart.wrapType(JS('', '#(#, #)', sGeneric, t, r));
+}
+
+// Returns a function type of argWrapped -> returnWrapped as a wrapped type.
+Object function1(Type returnWrapped, Type argWrapped) {
+  var returnType = dart.unwrapType(returnWrapped);
+  var argType = dart.unwrapType(argWrapped);
+  var fun = dart.fnType(returnType, [argType]);
+  return dart.wrapType(fun);
+}
+
+// Returns a function type with a bounded type argument that takes no argument
+// and returns void as a wrapped type.
+Object genericFunction(Type boundWrapped) => dart.wrapType(dart.gFnType(
+    (T) => [dart.VoidType, []], (T) => [dart.unwrapType(boundWrapped)]));
+
+// Returns a function type with a bounded generic return type of
+// <T extends typeBoud> argWrapped -> T as a wrapped type.
+Object functionGenericReturn(Type boundWrapped, Type argWrapped) =>
+    dart.wrapType(dart.gFnType(
+        (T) => [
+              T,
+              [dart.unwrapType(argWrapped)]
+            ],
+        (T) => [dart.unwrapType(boundWrapped)]));
+
+// Returns a function with a bounded generic argument type of
+// <T extends typeBoud> T -> returnWrapped as a wrapped type.
+Object functionGenericArg(Type boundWrapped, Type returnWrapped) =>
+    dart.wrapType(dart.gFnType(
+        (T) => [
+              dart.unwrapType(returnWrapped),
+              [T]
+            ],
+        (T) => [dart.unwrapType(boundWrapped)]));
+
 void checkSubtype(Type sWrapped, Type tWrapped) {
   var s = dart.unwrapType(sWrapped);
   var t = dart.unwrapType(tWrapped);
-  Expect.isTrue(dart.isSubtypeOf(s, t));
+  Expect.isTrue(dart.isSubtypeOf(s, t), '$s should be subtype of $t.');
 }
 
 void checkProperSubtype(Type sWrapped, Type tWrapped) {
   var s = dart.unwrapType(sWrapped);
   var t = dart.unwrapType(tWrapped);
-  Expect.isTrue(dart.isSubtypeOf(s, t));
-  Expect.isFalse(dart.isSubtypeOf(t, s));
+  Expect.isTrue(dart.isSubtypeOf(s, t), '$s should be subtype of $t.');
+  Expect.isFalse(dart.isSubtypeOf(t, s), '$t should not be subtype of $s.');
 }
 
 void main() {
+  // A <: dynamic
+  checkProperSubtype(A, dynamic);
+  // A <: Object
+  checkProperSubtype(A, Object);
+  // TODO(nshahan) Test void as top? A <: void
+
+  // Null <: A
+  checkProperSubtype(Null, A);
+
+  // FutureOr<Null> <: Future<Null>
+  checkSubtype(generic1(FutureOr, Null), generic1(Future, Null));
+  // Future<B> <: FutureOr<A>
+  checkProperSubtype(generic1(Future, B), generic1(FutureOr, A));
+  // B <: <: FutureOr<A>
+  checkProperSubtype(B, generic1(FutureOr, A));
+  // Future<B> <: Future<A>
+  checkProperSubtype(generic1(Future, B), generic1(Future, A));
+  // B <: A
   checkProperSubtype(B, A);
+
+  // A <: A
+  checkSubtype(A, A);
+  // C <: B
   checkProperSubtype(C, B);
+  // C <: A
   checkProperSubtype(C, A);
 
+  // A -> B <: Function
+  checkProperSubtype(function1(B, A), Function);
+
+  // A -> B <: A -> B
+  checkSubtype(function1(B, A), function1(B, A));
+
+  // A -> B <: B -> B
+  checkProperSubtype(function1(B, A), function1(B, B));
+  // TODO(nshahan) Subtype check with covariant keyword?
+
+  // A -> B <: A -> A
+  checkSubtype(function1(B, A), function1(A, A));
+
+  // Generic Function Subtypes.
+  // Bound is a built in type.
+  // <T extends int> void -> void <: <T extends int> void -> void
+  checkSubtype(genericFunction(int), genericFunction(int));
+
+  // <T extends String> A -> T <: <T extends String> B -> T
+  checkProperSubtype(
+      functionGenericReturn(String, A), functionGenericReturn(String, B));
+
+  // <T extends double> T -> B <: <T extends double> T -> A
+  checkProperSubtype(
+      functionGenericArg(double, B), functionGenericArg(double, A));
+
+  // Bound is a function type.
+  // <T extends A -> B> void -> void <: <T extends A -> B> void -> void
+  checkSubtype(
+      genericFunction(function1(B, A)), genericFunction(function1(B, A)));
+
+  // <T extends A -> B> A -> T <: <T extends A -> B> B -> T
+  checkProperSubtype(functionGenericReturn(function1(B, A), A),
+      functionGenericReturn(function1(B, A), B));
+
+  // <T extends A -> B> T -> B <: <T extends A -> B> T -> A
+  checkProperSubtype(functionGenericArg(function1(B, A), B),
+      functionGenericArg(function1(B, A), A));
+
+  // Bound is a user defined class.
+  // <T extends B> void -> void <: <T extends B> void -> void
+  checkSubtype(genericFunction(B), genericFunction(B));
+
+  // <T extends B> A -> T <: <T extends B> B -> T
+  checkProperSubtype(functionGenericReturn(B, A), functionGenericReturn(B, B));
+
+  // <T extends B> T -> B <: <T extends B> T -> A
+  checkProperSubtype(functionGenericArg(B, B), functionGenericArg(B, A));
+
+  // Bound is a Future.
+  // <T extends Future<B>> void -> void <: <T extends Future<B>> void -> void
+  checkSubtype(genericFunction(generic1(Future, B)),
+      genericFunction(generic1(Future, B)));
+
+  // <T extends Future<B>> A -> T <: <T extends Future<B>> B -> T
+  checkProperSubtype(functionGenericReturn(generic1(Future, B), A),
+      functionGenericReturn(generic1(Future, B), B));
+
+  // <T extends Future<B>> T -> B <: <T extends Future<B>> T -> A
+  checkProperSubtype(functionGenericArg(generic1(Future, B), B),
+      functionGenericArg(generic1(Future, B), A));
+
+  // Bound is a FutureOr.
+  // <T extends FutureOr<B>> void -> void <:
+  //    <T extends FutureOr<B>> void -> void
+  checkSubtype(genericFunction(generic1(FutureOr, B)),
+      genericFunction(generic1(FutureOr, B)));
+
+  // <T extends FutureOr<B>> A -> T <: <T extends FutureOr<B>> B -> T
+  checkProperSubtype(functionGenericReturn(generic1(FutureOr, B), A),
+      functionGenericReturn(generic1(FutureOr, B), B));
+
+  // <T extends FutureOr<B>> T -> B <: <T extends FutureOr<B>> T -> A
+  checkProperSubtype(functionGenericArg(generic1(FutureOr, B), B),
+      functionGenericArg(generic1(FutureOr, B), A));
+
+  // D <: D<B>
   checkSubtype(D, generic1(D, B));
+  // D<B> <: D
   checkSubtype(generic1(D, B), D);
+  // D<C> <: D<B>
   checkProperSubtype(generic1(D, C), generic1(D, B));
+
+  // F <: E
+  checkProperSubtype(F, E);
+  // F <: E<A, A>
+  checkProperSubtype(F, generic2(E, A, A));
+  // // E<B, B> <: E<A, A>
+  checkProperSubtype(generic2(E, B, B), E);
+  // // E<B, B> <: E<A, A>
+  checkProperSubtype(generic2(E, B, B), generic2(E, A, A));
 }
diff --git a/tests/corelib_2/bigint_from_test.dart b/tests/corelib_2/bigint_from_test.dart
index feb47eb..1ef06b3 100644
--- a/tests/corelib_2/bigint_from_test.dart
+++ b/tests/corelib_2/bigint_from_test.dart
@@ -64,6 +64,12 @@
 testInt(int n) {
   var bigint = new BigInt.from(n);
   Expect.equals(n, bigint.toInt());
+
+  // If the integers are inexact (e.g. > 2^53 when represented by doubles as
+  // when compiled to JavaScript numbers) then the 'toString' might be rounded
+  // to the nearest equivalent 'nicer looking' number.
+  if (n == n + 1 || n == n - 1) return;
+
   Expect.equals("$n", "$bigint");
 }
 
diff --git a/tests/corelib_2/corelib_2.status b/tests/corelib_2/corelib_2.status
index c58a56d..6c280d1 100644
--- a/tests/corelib_2/corelib_2.status
+++ b/tests/corelib_2/corelib_2.status
@@ -39,8 +39,6 @@
 integer_to_string_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 iterable_return_type_test/02: RuntimeError # Dart2js does not support Uint64*.
 list_unmodifiable_test: Pass, RuntimeError # Issue 28712
-num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 
 [ $compiler != dartdevc ]
 error_stack_trace_test/static: MissingCompileTimeError
@@ -106,6 +104,7 @@
 apply_test: Skip # Uses new Symbol via symbolMapToStringMap helper
 dynamic_nosuchmethod_test: SkipByDesign # Expects names in NSM
 error_stack_trace1_test: SkipByDesign # Expects unobfuscated stack trace
+type_tostring_test: SkipByDesign # Expects names in Type.toString()
 
 # All static_tests have expected compile-time errors.
 [ $compiler != app_jitk && $compiler != dart2analyzer && $compiler != dart2js && $compiler != dartdevc && $compiler != dartdevk && $compiler != dartk && $compiler != dartkb && $compiler != dartkp && $compiler != fasta ]
@@ -316,8 +315,6 @@
 list_removeat_test: RuntimeError # Issue 29921
 main_test: RuntimeError # Issue 29921
 nan_infinity_test/01: RuntimeError # Issue 29921
-num_parse_test/01: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
-num_parse_test/none: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 regexp/alternative-length-miscalculation_test: RuntimeError # Issue 29921
 regexp/ascii-regexp-subject_test: RuntimeError # Issue 29921
 regexp/bol-with-multiline_test: RuntimeError # Issue 29921
diff --git a/tests/corelib_2/int_modpow_hard_test.dart b/tests/corelib_2/int_modpow_hard_test.dart
new file mode 100644
index 0000000..0024c9a
--- /dev/null
+++ b/tests/corelib_2/int_modpow_hard_test.dart
@@ -0,0 +1,47 @@
+// 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.
+
+// Extreme values from int_modulo_arith_test. Test cases that that have
+// intermediate values that overflow the precision of 'int'.
+
+import "package:expect/expect.dart";
+
+import "dart:math" show pow;
+
+main() {
+  test(x, e, m, expectedResult) {
+    var result = x.modPow(e, m);
+    Expect.equals(expectedResult, result, "$x.modPow($e, $m)");
+  }
+
+  for (int mBase in [
+    50000000,
+    94906266, // Smallest integer with square over 2^53.
+    100000000,
+    1000000000,
+    3037000500, // Smallest integer with square over 2^63.
+    4000000000,
+    0x7FFFFFFFFFFFF000 + 0xFFC
+  ]) {
+    // On 'web' platforms skip values outside web number safe range.
+    if (mBase == mBase + 1) continue;
+
+    for (int mAdjustment in [0, 1, 2, 3, -1]) {
+      int m = mBase + mAdjustment;
+      for (int e = 1; e < 100; e++) {
+        // Test "M-k ^ N mod M == (-k) ^ N mod M" for some small values of k.
+        test(m - 1, e, m, pow(-1, e) % m);
+        if (e < 53) {
+          test(m - 2, e, m, pow(-2, e) % m);
+        }
+        if (e < 33) {
+          test(m - 3, e, m, pow(-3, e) % m);
+        }
+        if (e < 26) {
+          test(m - 4, e, m, pow(-4, e) % m);
+        }
+      }
+    }
+  }
+}
diff --git a/tests/corelib_2/num_parse_test.dart b/tests/corelib_2/num_parse_test.dart
index d4eb08f..b1049e5 100644
--- a/tests/corelib_2/num_parse_test.dart
+++ b/tests/corelib_2/num_parse_test.dart
@@ -135,7 +135,9 @@
   testIntAround(0x10000000000000); // 2^52
   testIntAround(0x20000000000000); // 2^53
   testIntAround(0x40000000000000); // 2^54
-  testIntAround(0x7ffffffffffffffe); // 2^63
+  // 0x7ffffffffffffffe on int-is-64-bit implementations, rounded up on
+  // int-is-double implementations.
+  testIntAround(0x7ffffffffffff000 + 0xffe); // 2^63
 
   testDouble(0.0);
   testDouble(5e-324);
diff --git a/tests/corelib_2/type_tostring_test.dart b/tests/corelib_2/type_tostring_test.dart
new file mode 100644
index 0000000..dab89c9
--- /dev/null
+++ b/tests/corelib_2/type_tostring_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.
+
+// Testing the behavior of `Type.toString`.
+//
+// The behavior is *unspecified*, but users may depend on it.
+// This test ensures that we do not change the format inadvertently.
+// If we decide to change the format, it should be deliberate and consistent.
+
+import "dart:async" show FutureOr;
+
+import "package:expect/expect.dart";
+
+void expectType(Type type, Pattern text) {
+  var typeString = "$type";
+  if (typeString.contains("minified:")) {
+    return; // No checks for minimized types.
+  }
+  if (text is String) {
+    Expect.equals(text, typeString);
+    return;
+  }
+  var match = text.matchAsPrefix(typeString);
+  if (match != null && match.end == typeString.length) return;
+  Expect.fail(
+      "$typeString was not matched by $text${match == null ? "" : ", match: ${match[0]}"}");
+}
+
+void expect<T>(Pattern text) {
+  expectType(T, text);
+}
+
+void main() {
+  // Simple interface types.
+  expect<int>("int");
+  expect<Object>("Object");
+  expect<Null>("Null");
+  expect<Base>("Base");
+  expect<Mixin>("Mixin");
+  // Named mixin applications use their name.
+  expect<MixinApplication>("MixinApplication");
+
+  // Non-class, non-function types.
+  expect<void>("void");
+  expect<dynamic>("dynamic");
+  expect<Function>("Function");
+  // TODO: Add Never with NNBD.
+
+  // Generic interface types.
+  expect<List<int>>("List<int>");
+  expect<Iterable<Object>>("Iterable<Object>");
+  expect<Map<List<String>, Future<void>>>("Map<List<String>, Future<void>>");
+  expect<GenericMixin<String>>("GenericMixin<String>");
+
+  // Generic non-class, non-function type.
+  expect<FutureOr<int>>("FutureOr<int>");
+  expect<FutureOr<Object>>("FutureOr<Object>");
+  expect<FutureOr<FutureOr<Future<Object>>>>(
+      "FutureOr<FutureOr<Future<Object>>>");
+  expect<FutureOr<Null>>("FutureOr<Null>");
+  // TODO: Add nullable types with NNBD.
+
+  // Private names may be mangled.
+  expect<_Private>(re(r'_Private\b.*$'));
+
+  // Function types.
+  expect<void Function()>("() => void");
+  expect<String Function()>("() => String");
+  expect<String Function(String)>("(String) => String");
+  expect<String Function(int, [String])>("(int, [String]) => String");
+  expect<String Function(int, {String z})>("(int, {String z}) => String");
+  expect<int Function(void Function(String))>("((String) => void) => int");
+  expect<int Function(void) Function(String)>("(String) => (void) => int");
+
+  // A type alias is expanded to its type.
+  expect<Typedef>("(dynamic) => dynamic");
+  expect<Typedef<int>>("(int) => int");
+  expectType(Typedef, "(dynamic) => dynamic");
+
+  // Generic functions do not promise to preserve type variable names,
+  // but do keep the structure of `<typevars>(params) => result`.
+
+  // Cannot pass a generic type as type argument, so passing the Type object
+  // derived from evaluating the typedef name.
+
+  // Format: <T>() => void
+  expectType(G0, re(r"<\w+>\(\) => void$"));
+  // Format: <T>() => T
+  expectType(G1, re(r"<(\w+)>\(\) => \1$"));
+  // Format: <T>(T) => T
+  expectType(G2, re(r"<(\w+)>\(\1\) => \1$"));
+  // Format: <T>(<S>(S, T) => S) => T
+  expectType(G3, re(r"<(\w+)>\(<(\w+)>\(\2, \1\) => \2\) => \1$"));
+  // Format: <S>(S) => <T>(S, T) => S
+  expectType(G4, re(r"<(\w+)>\(\1\) => <(\w+)>\(\1, \2\) => \1$"));
+  // Format: <S, T>(S, T) => S
+  expectType(G5, re(r"<(\w+), (\w+)>\(\1, \2\) => \1$"));
+
+  // Format: <T>(<S>(S) => S) => T
+  expectType(Weird, re(r"<(\w+)>\(<(\w+)>\(\2\) => \2\) => \1$"));
+
+  // One with everything.
+  expect<FutureOr<void Function([T Function<S, T>(Map<dynamic, Typedef<S>>)])>>(
+      // Format: FutureOr<([<S, T>(Map<dynamic, (S) => S>) => T]) => void>
+      re(r"FutureOr<\(\[<(\w+), (\w+)>\(Map<dynamic, "
+          r"\(\1\) => \1>\) => \2\]\) => void>$"));
+}
+
+// Types to test against.
+class _Private {}
+
+class Base {}
+
+mixin Mixin {}
+
+class MixinApplication = Base with Mixin;
+
+mixin GenericMixin<T> implements List<T> {}
+
+typedef Typedef<T> = T Function(T);
+
+// Generic function types.
+typedef G0 = void Function<T>();
+typedef G1 = T Function<T>();
+typedef G2 = T Function<T>(T);
+typedef G3 = T Function<T>(S Function<S>(S, T));
+typedef G4 = S Function<T>(S, T) Function<S>(S);
+typedef G5 = S Function<S, T>(S, T);
+
+typedef Weird = Function Function<Function>(
+    Function Function<Function>(Function));
+
+RegExp re(String source) => RegExp(source);
diff --git a/tests/ffi/aliasing_test.dart b/tests/ffi/aliasing_test.dart
index 34a32fe..0413d8e 100644
--- a/tests/ffi/aliasing_test.dart
+++ b/tests/ffi/aliasing_test.dart
@@ -6,7 +6,7 @@
 // from and stores to C memory are not aliased.
 //
 // SharedObjects=ffi_test_functions
-// VMOptions=--deterministic --optimization-counter-threshold=50 --enable-inlining-annotations
+// VMOptions=--deterministic --optimization-counter-threshold=50
 
 library FfiTest;
 
@@ -200,10 +200,7 @@
   source.free();
 }
 
-// TODO(dacoharkes): Replace with @pragma annotations once available.
-const NeverInline = 'NeverInline';
-
-@NeverInline
+@pragma('vm:never-inline')
 Pointer<Int8> makeDerived(Pointer<Int64> source) =>
     source.offsetBy(7).cast<Int8>();
 
diff --git a/tests/ffi/coordinate.dart b/tests/ffi/coordinate.dart
index 8c8b4d4..dbe0f3e 100644
--- a/tests/ffi/coordinate.dart
+++ b/tests/ffi/coordinate.dart
@@ -14,7 +14,6 @@
   @Double()
   double y;
 
-  @Pointer()
   Pointer<Coordinate> next;
 
   factory Coordinate.allocate(double x, double y, Pointer<Coordinate> next) {
diff --git a/tests/ffi/coordinate_bare.dart b/tests/ffi/coordinate_bare.dart
index 7858882..83d5d4b 100644
--- a/tests/ffi/coordinate_bare.dart
+++ b/tests/ffi/coordinate_bare.dart
@@ -14,6 +14,5 @@
   @Double()
   double y;
 
-  @Pointer()
   Pointer<Coordinate> next;
 }
diff --git a/tests/ffi/cstring.dart b/tests/ffi/cstring.dart
deleted file mode 100644
index b0bfdae..0000000
--- a/tests/ffi/cstring.dart
+++ /dev/null
@@ -1,36 +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.
-
-library FfiTest;
-
-import 'dart:convert';
-import 'dart:ffi' as ffi;
-import 'dart:ffi' show Pointer;
-
-/// Sample non-struct Pointer wrapper for dart:ffi library.
-class Utf8 extends ffi.Struct<Utf8> {
-  @ffi.Int8()
-  int char;
-
-  static String fromUtf8(Pointer<Utf8> str) {
-    List<int> units = [];
-    int len = 0;
-    while (true) {
-      int char = str.elementAt(len++).load<Utf8>().char;
-      if (char == 0) break;
-      units.add(char);
-    }
-    return Utf8Decoder().convert(units);
-  }
-
-  static Pointer<Utf8> toUtf8(String s) {
-    Pointer<Utf8> result = Pointer<Utf8>.allocate(count: s.length + 1).cast();
-    List<int> units = Utf8Encoder().convert(s);
-    for (int i = 0; i < s.length; i++) {
-      result.elementAt(i).load<Utf8>().char = units[i];
-    }
-    result.elementAt(s.length).load<Utf8>().char = 0;
-    return result;
-  }
-}
diff --git a/tests/ffi/enable_structs_test.dart b/tests/ffi/enable_structs_test.dart
deleted file mode 100644
index 21f48d0..0000000
--- a/tests/ffi/enable_structs_test.dart
+++ /dev/null
@@ -1,22 +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 test program for testing that structs are locked out on 32-bit platforms.
-
-library FfiTest;
-
-import 'dart:ffi';
-
-import "package:expect/expect.dart";
-
-class C extends Struct<C> {
-  @IntPtr()
-  int x;
-}
-
-void main() {
-  final C c = nullptr.cast<C>().load();
-  Expect.throws<UnimplementedError>(() => c.x);
-  Expect.throws<UnimplementedError>(() => c.x = 0);
-}
diff --git a/tests/ffi/external_typed_data_test.dart b/tests/ffi/external_typed_data_test.dart
new file mode 100644
index 0000000..266d3fb
--- /dev/null
+++ b/tests/ffi/external_typed_data_test.dart
@@ -0,0 +1,307 @@
+// 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:ffi';
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:expect/expect.dart';
+
+main() {
+  testInt8Load();
+  testInt8Store();
+  testUint8Load();
+  testUint8Store();
+  testInt16Load();
+  testInt16Store();
+  testUint16Load();
+  testUint16Store();
+  testInt32Load();
+  testInt32Store();
+  testUint32Load();
+  testUint32Store();
+  testInt64Load();
+  testInt64Store();
+  testUint64Load();
+  testUint64Store();
+  testIntPtr();
+  testFloatLoad();
+  testFloatStore();
+  testDoubleLoad();
+  testDoubleStore();
+  testArrayLoad();
+  testArrayStore();
+  testNegativeArray();
+  testAlignment();
+}
+
+// For signed int tests, we store 0xf* and load -1 to check sign-extension.
+// For unsigned int tests, we store 0xf* and load the same to check truncation.
+
+void testInt8Load() {
+  // Load
+  Pointer<Int8> ptr = Pointer.allocate();
+  ptr.store(0xff);
+  Int8List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], -1);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testInt8Store() {
+  // Store
+  Pointer<Int8> ptr = Pointer.allocate();
+  Int8List list = ptr.asExternalTypedData();
+  list[0] = 0xff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), -1);
+  ptr.free();
+}
+
+void testUint8Load() {
+  // Load
+  Pointer<Uint8> ptr = Pointer.allocate();
+  ptr.store(0xff);
+  Uint8List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], 0xff);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testUint8Store() {
+  // Store
+  Pointer<Uint8> ptr = Pointer.allocate();
+  Uint8List list = ptr.asExternalTypedData();
+  list[0] = 0xff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), 0xff);
+  ptr.free();
+}
+
+void testInt16Load() {
+  // Load
+  Pointer<Int16> ptr = Pointer.allocate();
+  ptr.store(0xffff);
+  Int16List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], -1);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testInt16Store() {
+  // Store
+  Pointer<Int16> ptr = Pointer.allocate();
+  Int16List list = ptr.asExternalTypedData();
+  list[0] = 0xffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), -1);
+  ptr.free();
+}
+
+void testUint16Load() {
+  // Load
+  Pointer<Uint16> ptr = Pointer.allocate();
+  ptr.store(0xffff);
+  Uint16List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], 0xffff);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testUint16Store() {
+  // Store
+  Pointer<Uint16> ptr = Pointer.allocate();
+  Uint16List list = ptr.asExternalTypedData();
+  list[0] = 0xffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), 0xffff);
+  ptr.free();
+}
+
+void testInt32Load() {
+  // Load
+  Pointer<Int32> ptr = Pointer.allocate();
+  ptr.store(0xffffffff);
+  Int32List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], -1);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testInt32Store() {
+  // Store
+  Pointer<Int32> ptr = Pointer.allocate();
+  Int32List list = ptr.asExternalTypedData();
+  list[0] = 0xffffffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), -1);
+  ptr.free();
+}
+
+void testUint32Load() {
+  // Load
+  Pointer<Uint32> ptr = Pointer.allocate();
+  ptr.store(0xffffffff);
+  Uint32List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], 0xffffffff);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testUint32Store() {
+  // Store
+  Pointer<Uint32> ptr = Pointer.allocate();
+  Uint32List list = ptr.asExternalTypedData();
+  list[0] = 0xffffffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), 0xffffffff);
+  ptr.free();
+}
+
+void testInt64Load() {
+  // Load
+  Pointer<Int64> ptr = Pointer.allocate();
+  ptr.store(0xffffffffffffffff);
+  Int64List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], -1);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testInt64Store() {
+  // Store
+  Pointer<Int64> ptr = Pointer.allocate();
+  Int64List list = ptr.asExternalTypedData();
+  list[0] = 0xffffffffffffffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), -1);
+  ptr.free();
+}
+
+void testUint64Load() {
+  // Load
+  Pointer<Uint64> ptr = Pointer.allocate();
+  ptr.store(0xffffffffffffffff);
+  Uint64List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], 0xffffffffffffffff);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testUint64Store() {
+  // Store
+  Pointer<Uint64> ptr = Pointer.allocate();
+  Uint64List list = ptr.asExternalTypedData();
+  list[0] = 0xffffffffffffffff;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<int>(), 0xffffffffffffffff);
+  ptr.free();
+}
+
+void testIntPtr() {
+  bool is32Bit = sizeOf<IntPtr>() == 4;
+  Pointer<IntPtr> ptr = Pointer.allocate();
+  final array = ptr.asExternalTypedData();
+  if (is32Bit) {
+    Expect.type<Int32List>(array);
+  } else {
+    Expect.type<Int64List>(array);
+  }
+  ptr.free();
+}
+
+double maxFloat = (2 - pow(2, -23)) * pow(2, 127);
+double maxDouble = (2 - pow(2, -52)) * pow(2, pow(2, 10) - 1);
+
+void testFloatLoad() {
+  // Load
+  Pointer<Float> ptr = Pointer.allocate();
+  ptr.store(maxFloat);
+  Float32List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], maxFloat);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testFloatStore() {
+  // Store
+  Pointer<Float> ptr = Pointer.allocate();
+  Float32List list = ptr.asExternalTypedData();
+  list[0] = maxFloat;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<double>(), maxFloat);
+  ptr.free();
+}
+
+void testDoubleLoad() {
+  // Load
+  Pointer<Double> ptr = Pointer.allocate();
+  ptr.store(maxDouble);
+  Float64List list = ptr.asExternalTypedData();
+  Expect.equals(list[0], maxDouble);
+  Expect.equals(list.length, 1);
+  ptr.free();
+}
+
+void testDoubleStore() {
+  // Store
+  Pointer<Double> ptr = Pointer.allocate();
+  Float64List list = ptr.asExternalTypedData();
+  list[0] = maxDouble;
+  Expect.equals(list.length, 1);
+  Expect.equals(ptr.load<double>(), maxDouble);
+  ptr.free();
+}
+
+void testArrayLoad() {
+  const int count = 0x100;
+  Pointer<Int32> ptr = Pointer.allocate(count: count);
+  for (int i = 0; i < count; ++i) {
+    ptr.elementAt(i).store(i);
+  }
+  Int32List array = ptr.asExternalTypedData(count: count);
+  for (int i = 0; i < count; ++i) {
+    Expect.equals(array[i], i);
+  }
+  ptr.free();
+}
+
+void testArrayStore() {
+  const int count = 0x100;
+  Pointer<Int32> ptr = Pointer.allocate(count: count);
+  Int32List array = ptr.asExternalTypedData(count: count);
+  for (int i = 0; i < count; ++i) {
+    array[i] = i;
+  }
+  for (int i = 0; i < count; ++i) {
+    Expect.equals(ptr.elementAt(i).load<int>(), i);
+  }
+  ptr.free();
+}
+
+void testNegativeArray() {
+  Pointer<Int32> ptr = nullptr.cast();
+  Expect.throws<ArgumentError>(() => ptr.asExternalTypedData(count: -1));
+}
+
+// Tests that the address we're creating an ExternalTypedData from is aligned to
+// the element size.
+void testAlignment() {
+  Expect.throws<ArgumentError>(
+      () => Pointer<Int16>.fromAddress(1).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Int32>.fromAddress(2).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Int64>.fromAddress(4).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Uint16>.fromAddress(1).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Uint32>.fromAddress(2).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Uint64>.fromAddress(4).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Float>.fromAddress(2).asExternalTypedData());
+  Expect.throws<ArgumentError>(
+      () => Pointer<Double>.fromAddress(4).asExternalTypedData());
+}
diff --git a/tests/ffi/ffi.status b/tests/ffi/ffi.status
index de333a5..76f5ff2 100644
--- a/tests/ffi/ffi.status
+++ b/tests/ffi/ffi.status
@@ -24,8 +24,8 @@
 [ $arch == arm && $system != android ]
 *: Skip # "hardfp" calling convention is not yet supported (iOS is also supported but not tested): dartbug.com/36309
 
-[ $arch == simdbc64 && $system != android && $system != linux && $system != macos ]
-*: Skip # FFI not yet supported outside x64 Linux: dartbug.com/36809
+[ $arch == simdbc64 && $system != linux && $system != macos ]
+*: Skip # DBC is only supported on MacOS and Linux for testing
 
 [ $runtime != dart_precompiled && $runtime != vm ]
 *: SkipByDesign # FFI is a VM-only feature. (This test suite is part of the default set.)
@@ -33,13 +33,5 @@
 [ $system != android && $system != linux && $system != macos && $system != windows ]
 *: Skip # FFI not yet supported on other OSes.
 
-# dartbug.com/35768: Structs not supported on 32-bit.
-[ $arch == arm || $arch == ia32 || $arch == simdbc ]
-function_structs_test: Skip
-structs_test: Skip
-
-[ $arch == arm64 || $arch == simdbc64 || $arch == x64 ]
-enable_structs_test: SkipByDesign # Tests that structs don't work on 32-bit systems.
-
 [ $arch == simarm || $arch == simarm64 ]
 *: Skip # FFI not yet supported on the arm simulator.
diff --git a/tests/ffi/function_gc_test.dart b/tests/ffi/function_gc_test.dart
index 8fa794d..00724a3 100644
--- a/tests/ffi/function_gc_test.dart
+++ b/tests/ffi/function_gc_test.dart
@@ -4,6 +4,8 @@
 //
 // VMOptions=--deterministic --optimization-counter-threshold=500 --enable-testing-pragmas
 // VMOptions=--deterministic --optimization-counter-threshold=-1 --enable-testing-pragmas
+// VMOptions=--deterministic --optimization-counter-threshold=500 --enable-testing-pragmas --no-dual-map-code --write-protect-code
+// VMOptions=--deterministic --optimization-counter-threshold=-1 --enable-testing-pragmas --no-dual-map-code --write-protect-code
 //
 // Dart test program for stress-testing boxing and GC in return paths from FFI
 // trampolines.
@@ -25,6 +27,7 @@
   testBoxPointer();
   testAllocateInNative();
   testRegress37069();
+  testWriteProtection();
 }
 
 typedef NativeNullaryOp64 = ffi.Int64 Function();
@@ -106,3 +109,14 @@
 void testRegress37069() {
   regress37069(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11);
 }
+
+final unprotectCode = ffiTestFunctions.lookupFunction<
+    ffi.Pointer<ffi.Void> Function(),
+    ffi.Pointer<ffi.Void> Function()>("UnprotectCode");
+final waitForHelper = ffiTestFunctions.lookupFunction<
+    ffi.Void Function(ffi.Pointer<ffi.Void>),
+    void Function(ffi.Pointer<ffi.Void>)>("WaitForHelper");
+
+void testWriteProtection() {
+  waitForHelper(unprotectCode());
+}
diff --git a/tests/ffi/function_structs_test.dart b/tests/ffi/function_structs_test.dart
index 875f621..bf41a08 100644
--- a/tests/ffi/function_structs_test.dart
+++ b/tests/ffi/function_structs_test.dart
@@ -105,11 +105,11 @@
     struct.smallLastField = 1;
   }
   vls1.parent = vls2.addressOf;
-  vls1.numChidlren = 2;
+  vls1.numChildren = 2;
   vls1.children = vls1.addressOf;
   vls2.parent = vls2.addressOf;
   vls2.parent = ffi.nullptr.cast();
-  vls2.numChidlren = 0;
+  vls2.numChildren = 0;
   vls2.children = ffi.nullptr.cast();
 
   int result = f(vls1.addressOf);
diff --git a/tests/ffi/function_test.dart b/tests/ffi/function_test.dart
index f31a470..68529bd 100644
--- a/tests/ffi/function_test.dart
+++ b/tests/ffi/function_test.dart
@@ -7,6 +7,8 @@
 // VMOptions=
 // VMOptions=--deterministic --optimization-counter-threshold=10
 // VMOptions=--use-slow-path
+// VMOptions=--write-protect-code --no-dual-map-code
+// VMOptions=--write-protect-code --no-dual-map-code --use-slow-path
 // SharedObjects=ffi_test_functions
 
 library FfiTest;
diff --git a/tests/ffi/object_gc_test.dart b/tests/ffi/object_gc_test.dart
index deecb10..165f9bc 100644
--- a/tests/ffi/object_gc_test.dart
+++ b/tests/ffi/object_gc_test.dart
@@ -12,7 +12,7 @@
 
 import "package:expect/expect.dart";
 
-import 'cstring.dart';
+import 'utf8.dart';
 import 'dylib_utils.dart';
 
 DynamicLibrary ffiTestFunctions = dlopenPlatformSpecific("ffi_test_functions");
diff --git a/tests/ffi/static_checks_test.dart b/tests/ffi/static_checks_test.dart
index 7b8cdfb..0a24b6d 100644
--- a/tests/ffi/static_checks_test.dart
+++ b/tests/ffi/static_checks_test.dart
@@ -357,7 +357,8 @@
 class TestStruct10 extends ffi.Struct<ffi.Int8> {} //# 59: compile-time error
 
 // Struct classes may not be generic.
-class TestStruct11<T> extends ffi.Struct<TestStruct11<dynamic>> {} //# 60: compile-time error
+class TestStruct11<T> extends //# 60: compile-time error
+    ffi.Struct<TestStruct11<dynamic>> {} //# 60: compile-time error
 
 // Structs may not appear inside structs (currently, there is no suitable
 // annotation).
@@ -366,6 +367,17 @@
   TestStruct9 struct; //# 61: compile-time error
 }
 
+class DummyAnnotation {
+  const DummyAnnotation();
+}
+
+// Structs fields may have other annotations.
+class TestStruct13 extends ffi.Struct<TestStruct13> {
+  @DummyAnnotation()
+  @ffi.Double()
+  double z;
+}
+
 // Cannot extend native types.
 
 class ENativeType extends ffi.NativeType {} //# 90: compile-time error
@@ -428,7 +440,9 @@
 
 class IVoid implements ffi.Void {} //# 812: compile-time error
 
-class INativeFunction implements ffi.NativeFunction {} //# 813: compile-time error
+class INativeFunction //# 813: compile-time error
+    implements //# 813: compile-time error
+        ffi.NativeFunction {} //# 813: compile-time error
 
 class IPointer implements ffi.Pointer {} //# 814: compile-time error
 
diff --git a/tests/ffi/structs_test.dart b/tests/ffi/structs_test.dart
index a2ed758..ef6c86e 100644
--- a/tests/ffi/structs_test.dart
+++ b/tests/ffi/structs_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 //
 // Dart test program for testing dart:ffi struct pointers.
+//
+// VMOptions=--deterministic --optimization-counter-threshold=50 --enable-inlining-annotations
 
 library FfiTest;
 
@@ -12,13 +14,17 @@
 
 import 'coordinate_bare.dart' as bare;
 import 'coordinate.dart';
+import 'utf8.dart';
 
 void main() {
-  testStructAllocate();
-  testStructFromAddress();
-  testStructWithNulls();
-  testBareStruct();
-  testTypeTest();
+  for (int i = 0; i < 100; i++) {
+    testStructAllocate();
+    testStructFromAddress();
+    testStructWithNulls();
+    testBareStruct();
+    testTypeTest();
+    testUtf8();
+  }
 }
 
 /// allocates each coordinate separately in c memory
@@ -118,3 +124,10 @@
   Expect.isTrue(c is Struct<Coordinate>);
   c.addressOf.free();
 }
+
+void testUtf8() {
+  final String test = 'Hasta Mañana';
+  final Pointer<Utf8> medium = Utf8.toUtf8(test);
+  Expect.equals(test, Utf8.fromUtf8(medium));
+  medium.free();
+}
diff --git a/tests/ffi/utf8.dart b/tests/ffi/utf8.dart
new file mode 100644
index 0000000..cdaccf8
--- /dev/null
+++ b/tests/ffi/utf8.dart
@@ -0,0 +1,37 @@
+// 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 Utf8;
+
+import 'dart:convert';
+import 'dart:ffi' as ffi;
+import 'dart:ffi' show Pointer;
+
+/// Sample non-struct Pointer wrapper for dart:ffi library.
+class Utf8 extends ffi.Struct<Utf8> {
+  @ffi.Uint8()
+  int char;
+
+  static String fromUtf8(Pointer<Utf8> str) {
+    List<int> units = [];
+    int len = 0;
+    while (true) {
+      int char = str.elementAt(len++).load<Utf8>().char;
+      if (char == 0) break;
+      units.add(char);
+    }
+    return Utf8Decoder().convert(units);
+  }
+
+  static Pointer<Utf8> toUtf8(String s) {
+    List<int> units = Utf8Encoder().convert(s);
+    Pointer<Utf8> result =
+        Pointer<Utf8>.allocate(count: units.length + 1).cast();
+    for (int i = 0; i < units.length; i++) {
+      result.elementAt(i).load<Utf8>().char = units[i];
+    }
+    result.elementAt(units.length).load<Utf8>().char = 0;
+    return result;
+  }
+}
diff --git a/tests/ffi/very_large_struct.dart b/tests/ffi/very_large_struct.dart
index 06cbac6..36202f6 100644
--- a/tests/ffi/very_large_struct.dart
+++ b/tests/ffi/very_large_struct.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.
 
-library FfiTestCoordinateBare;
-
 import 'dart:ffi';
 
 /// Large sample struct for dart:ffi library.
@@ -35,19 +33,17 @@
   @IntPtr()
   int i;
 
-  @Float()
+  @Double()
   double j;
 
-  @Double()
+  @Float()
   double k;
 
-  @Pointer()
   Pointer<VeryLargeStruct> parent;
 
   @IntPtr()
-  int numChidlren;
+  int numChildren;
 
-  @Pointer()
   Pointer<VeryLargeStruct> children;
 
   @Int8()
diff --git a/tests/language_2/bit_operations_test.dart b/tests/language_2/bit_operations_test.dart
index b8e77cf..c6fd13c 100644
--- a/tests/language_2/bit_operations_test.dart
+++ b/tests/language_2/bit_operations_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.
 // Dart test for testing bitwise operations.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 import "package:expect/expect.dart";
 
-const neverInline = "NeverInline";
-
 void main() {
   for (int i = 0; i < 4; i++) {
     test();
@@ -226,7 +224,7 @@
   Expect.notEquals((a & b) << (c ^ d), a & b << c ^ d);
 }
 
-@neverInline
+@pragma('vm:never-inline')
 rightShift65Noinline(a) => a >> 65;
 
 testRightShift65() {
diff --git a/tests/language_2/canonicalization_hashing_memoize_array_test.dart b/tests/language_2/canonicalization_hashing_memoize_array_test.dart
new file mode 100644
index 0000000..20f789f
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_memoize_array_test.dart
@@ -0,0 +1,218 @@
+// 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.
+
+// If canonicalization uses deep structural hashing without memoizing, this
+// will exhibit superlinear time.
+
+const list1_0 = <Object>[null, null];
+const list1_1 = <Object>[list1_0, list1_0];
+const list1_2 = <Object>[list1_1, list1_1];
+const list1_3 = <Object>[list1_2, list1_2];
+const list1_4 = <Object>[list1_3, list1_3];
+const list1_5 = <Object>[list1_4, list1_4];
+const list1_6 = <Object>[list1_5, list1_5];
+const list1_7 = <Object>[list1_6, list1_6];
+const list1_8 = <Object>[list1_7, list1_7];
+const list1_9 = <Object>[list1_8, list1_8];
+const list1_10 = <Object>[list1_9, list1_9];
+const list1_11 = <Object>[list1_10, list1_10];
+const list1_12 = <Object>[list1_11, list1_11];
+const list1_13 = <Object>[list1_12, list1_12];
+const list1_14 = <Object>[list1_13, list1_13];
+const list1_15 = <Object>[list1_14, list1_14];
+const list1_16 = <Object>[list1_15, list1_15];
+const list1_17 = <Object>[list1_16, list1_16];
+const list1_18 = <Object>[list1_17, list1_17];
+const list1_19 = <Object>[list1_18, list1_18];
+const list1_20 = <Object>[list1_19, list1_19];
+const list1_21 = <Object>[list1_20, list1_20];
+const list1_22 = <Object>[list1_21, list1_21];
+const list1_23 = <Object>[list1_22, list1_22];
+const list1_24 = <Object>[list1_23, list1_23];
+const list1_25 = <Object>[list1_24, list1_24];
+const list1_26 = <Object>[list1_25, list1_25];
+const list1_27 = <Object>[list1_26, list1_26];
+const list1_28 = <Object>[list1_27, list1_27];
+const list1_29 = <Object>[list1_28, list1_28];
+const list1_30 = <Object>[list1_29, list1_29];
+const list1_31 = <Object>[list1_30, list1_30];
+const list1_32 = <Object>[list1_31, list1_31];
+const list1_33 = <Object>[list1_32, list1_32];
+const list1_34 = <Object>[list1_33, list1_33];
+const list1_35 = <Object>[list1_34, list1_34];
+const list1_36 = <Object>[list1_35, list1_35];
+const list1_37 = <Object>[list1_36, list1_36];
+const list1_38 = <Object>[list1_37, list1_37];
+const list1_39 = <Object>[list1_38, list1_38];
+const list1_40 = <Object>[list1_39, list1_39];
+const list1_41 = <Object>[list1_40, list1_40];
+const list1_42 = <Object>[list1_41, list1_41];
+const list1_43 = <Object>[list1_42, list1_42];
+const list1_44 = <Object>[list1_43, list1_43];
+const list1_45 = <Object>[list1_44, list1_44];
+const list1_46 = <Object>[list1_45, list1_45];
+const list1_47 = <Object>[list1_46, list1_46];
+const list1_48 = <Object>[list1_47, list1_47];
+const list1_49 = <Object>[list1_48, list1_48];
+const list1_50 = <Object>[list1_49, list1_49];
+const list1_51 = <Object>[list1_50, list1_50];
+const list1_52 = <Object>[list1_51, list1_51];
+const list1_53 = <Object>[list1_52, list1_52];
+const list1_54 = <Object>[list1_53, list1_53];
+const list1_55 = <Object>[list1_54, list1_54];
+const list1_56 = <Object>[list1_55, list1_55];
+const list1_57 = <Object>[list1_56, list1_56];
+const list1_58 = <Object>[list1_57, list1_57];
+const list1_59 = <Object>[list1_58, list1_58];
+const list1_60 = <Object>[list1_59, list1_59];
+const list1_61 = <Object>[list1_60, list1_60];
+const list1_62 = <Object>[list1_61, list1_61];
+const list1_63 = <Object>[list1_62, list1_62];
+const list1_64 = <Object>[list1_63, list1_63];
+const list1_65 = <Object>[list1_64, list1_64];
+const list1_66 = <Object>[list1_65, list1_65];
+const list1_67 = <Object>[list1_66, list1_66];
+const list1_68 = <Object>[list1_67, list1_67];
+const list1_69 = <Object>[list1_68, list1_68];
+const list1_70 = <Object>[list1_69, list1_69];
+const list1_71 = <Object>[list1_70, list1_70];
+const list1_72 = <Object>[list1_71, list1_71];
+const list1_73 = <Object>[list1_72, list1_72];
+const list1_74 = <Object>[list1_73, list1_73];
+const list1_75 = <Object>[list1_74, list1_74];
+const list1_76 = <Object>[list1_75, list1_75];
+const list1_77 = <Object>[list1_76, list1_76];
+const list1_78 = <Object>[list1_77, list1_77];
+const list1_79 = <Object>[list1_78, list1_78];
+const list1_80 = <Object>[list1_79, list1_79];
+const list1_81 = <Object>[list1_80, list1_80];
+const list1_82 = <Object>[list1_81, list1_81];
+const list1_83 = <Object>[list1_82, list1_82];
+const list1_84 = <Object>[list1_83, list1_83];
+const list1_85 = <Object>[list1_84, list1_84];
+const list1_86 = <Object>[list1_85, list1_85];
+const list1_87 = <Object>[list1_86, list1_86];
+const list1_88 = <Object>[list1_87, list1_87];
+const list1_89 = <Object>[list1_88, list1_88];
+const list1_90 = <Object>[list1_89, list1_89];
+const list1_91 = <Object>[list1_90, list1_90];
+const list1_92 = <Object>[list1_91, list1_91];
+const list1_93 = <Object>[list1_92, list1_92];
+const list1_94 = <Object>[list1_93, list1_93];
+const list1_95 = <Object>[list1_94, list1_94];
+const list1_96 = <Object>[list1_95, list1_95];
+const list1_97 = <Object>[list1_96, list1_96];
+const list1_98 = <Object>[list1_97, list1_97];
+const list1_99 = <Object>[list1_98, list1_98];
+
+const list2_0 = <Object>[null, null];
+const list2_1 = <Object>[list2_0, list2_0];
+const list2_2 = <Object>[list2_1, list2_1];
+const list2_3 = <Object>[list2_2, list2_2];
+const list2_4 = <Object>[list2_3, list2_3];
+const list2_5 = <Object>[list2_4, list2_4];
+const list2_6 = <Object>[list2_5, list2_5];
+const list2_7 = <Object>[list2_6, list2_6];
+const list2_8 = <Object>[list2_7, list2_7];
+const list2_9 = <Object>[list2_8, list2_8];
+const list2_10 = <Object>[list2_9, list2_9];
+const list2_11 = <Object>[list2_10, list2_10];
+const list2_12 = <Object>[list2_11, list2_11];
+const list2_13 = <Object>[list2_12, list2_12];
+const list2_14 = <Object>[list2_13, list2_13];
+const list2_15 = <Object>[list2_14, list2_14];
+const list2_16 = <Object>[list2_15, list2_15];
+const list2_17 = <Object>[list2_16, list2_16];
+const list2_18 = <Object>[list2_17, list2_17];
+const list2_19 = <Object>[list2_18, list2_18];
+const list2_20 = <Object>[list2_19, list2_19];
+const list2_21 = <Object>[list2_20, list2_20];
+const list2_22 = <Object>[list2_21, list2_21];
+const list2_23 = <Object>[list2_22, list2_22];
+const list2_24 = <Object>[list2_23, list2_23];
+const list2_25 = <Object>[list2_24, list2_24];
+const list2_26 = <Object>[list2_25, list2_25];
+const list2_27 = <Object>[list2_26, list2_26];
+const list2_28 = <Object>[list2_27, list2_27];
+const list2_29 = <Object>[list2_28, list2_28];
+const list2_30 = <Object>[list2_29, list2_29];
+const list2_31 = <Object>[list2_30, list2_30];
+const list2_32 = <Object>[list2_31, list2_31];
+const list2_33 = <Object>[list2_32, list2_32];
+const list2_34 = <Object>[list2_33, list2_33];
+const list2_35 = <Object>[list2_34, list2_34];
+const list2_36 = <Object>[list2_35, list2_35];
+const list2_37 = <Object>[list2_36, list2_36];
+const list2_38 = <Object>[list2_37, list2_37];
+const list2_39 = <Object>[list2_38, list2_38];
+const list2_40 = <Object>[list2_39, list2_39];
+const list2_41 = <Object>[list2_40, list2_40];
+const list2_42 = <Object>[list2_41, list2_41];
+const list2_43 = <Object>[list2_42, list2_42];
+const list2_44 = <Object>[list2_43, list2_43];
+const list2_45 = <Object>[list2_44, list2_44];
+const list2_46 = <Object>[list2_45, list2_45];
+const list2_47 = <Object>[list2_46, list2_46];
+const list2_48 = <Object>[list2_47, list2_47];
+const list2_49 = <Object>[list2_48, list2_48];
+const list2_50 = <Object>[list2_49, list2_49];
+const list2_51 = <Object>[list2_50, list2_50];
+const list2_52 = <Object>[list2_51, list2_51];
+const list2_53 = <Object>[list2_52, list2_52];
+const list2_54 = <Object>[list2_53, list2_53];
+const list2_55 = <Object>[list2_54, list2_54];
+const list2_56 = <Object>[list2_55, list2_55];
+const list2_57 = <Object>[list2_56, list2_56];
+const list2_58 = <Object>[list2_57, list2_57];
+const list2_59 = <Object>[list2_58, list2_58];
+const list2_60 = <Object>[list2_59, list2_59];
+const list2_61 = <Object>[list2_60, list2_60];
+const list2_62 = <Object>[list2_61, list2_61];
+const list2_63 = <Object>[list2_62, list2_62];
+const list2_64 = <Object>[list2_63, list2_63];
+const list2_65 = <Object>[list2_64, list2_64];
+const list2_66 = <Object>[list2_65, list2_65];
+const list2_67 = <Object>[list2_66, list2_66];
+const list2_68 = <Object>[list2_67, list2_67];
+const list2_69 = <Object>[list2_68, list2_68];
+const list2_70 = <Object>[list2_69, list2_69];
+const list2_71 = <Object>[list2_70, list2_70];
+const list2_72 = <Object>[list2_71, list2_71];
+const list2_73 = <Object>[list2_72, list2_72];
+const list2_74 = <Object>[list2_73, list2_73];
+const list2_75 = <Object>[list2_74, list2_74];
+const list2_76 = <Object>[list2_75, list2_75];
+const list2_77 = <Object>[list2_76, list2_76];
+const list2_78 = <Object>[list2_77, list2_77];
+const list2_79 = <Object>[list2_78, list2_78];
+const list2_80 = <Object>[list2_79, list2_79];
+const list2_81 = <Object>[list2_80, list2_80];
+const list2_82 = <Object>[list2_81, list2_81];
+const list2_83 = <Object>[list2_82, list2_82];
+const list2_84 = <Object>[list2_83, list2_83];
+const list2_85 = <Object>[list2_84, list2_84];
+const list2_86 = <Object>[list2_85, list2_85];
+const list2_87 = <Object>[list2_86, list2_86];
+const list2_88 = <Object>[list2_87, list2_87];
+const list2_89 = <Object>[list2_88, list2_88];
+const list2_90 = <Object>[list2_89, list2_89];
+const list2_91 = <Object>[list2_90, list2_90];
+const list2_92 = <Object>[list2_91, list2_91];
+const list2_93 = <Object>[list2_92, list2_92];
+const list2_94 = <Object>[list2_93, list2_93];
+const list2_95 = <Object>[list2_94, list2_94];
+const list2_96 = <Object>[list2_95, list2_95];
+const list2_97 = <Object>[list2_96, list2_96];
+const list2_98 = <Object>[list2_97, list2_97];
+const list2_99 = <Object>[list2_98, list2_98];
+
+confuse(x) {
+  try { throw x; } catch (e) { return e; }
+}
+
+main() {
+  if (!identical(confuse(list1_99), confuse(list2_99))) {
+    throw new Exception("list1_99 !== list2_99");
+  }
+}
diff --git a/tests/language_2/canonicalization_hashing_memoize_instance_test.dart b/tests/language_2/canonicalization_hashing_memoize_instance_test.dart
new file mode 100644
index 0000000..5a9185eb
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_memoize_instance_test.dart
@@ -0,0 +1,224 @@
+// 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.
+
+// If canonicalization uses deep structural hashing without memoizing, this
+// will exhibit superlinear time.
+
+class Box {
+  final Object content1;
+  final Object content2;
+  const Box(this.content1, this.content2);
+}
+
+const box1_0 = Box(null, null);
+const box1_1 = Box(box1_0, box1_0);
+const box1_2 = Box(box1_1, box1_1);
+const box1_3 = Box(box1_2, box1_2);
+const box1_4 = Box(box1_3, box1_3);
+const box1_5 = Box(box1_4, box1_4);
+const box1_6 = Box(box1_5, box1_5);
+const box1_7 = Box(box1_6, box1_6);
+const box1_8 = Box(box1_7, box1_7);
+const box1_9 = Box(box1_8, box1_8);
+const box1_10 = Box(box1_9, box1_9);
+const box1_11 = Box(box1_10, box1_10);
+const box1_12 = Box(box1_11, box1_11);
+const box1_13 = Box(box1_12, box1_12);
+const box1_14 = Box(box1_13, box1_13);
+const box1_15 = Box(box1_14, box1_14);
+const box1_16 = Box(box1_15, box1_15);
+const box1_17 = Box(box1_16, box1_16);
+const box1_18 = Box(box1_17, box1_17);
+const box1_19 = Box(box1_18, box1_18);
+const box1_20 = Box(box1_19, box1_19);
+const box1_21 = Box(box1_20, box1_20);
+const box1_22 = Box(box1_21, box1_21);
+const box1_23 = Box(box1_22, box1_22);
+const box1_24 = Box(box1_23, box1_23);
+const box1_25 = Box(box1_24, box1_24);
+const box1_26 = Box(box1_25, box1_25);
+const box1_27 = Box(box1_26, box1_26);
+const box1_28 = Box(box1_27, box1_27);
+const box1_29 = Box(box1_28, box1_28);
+const box1_30 = Box(box1_29, box1_29);
+const box1_31 = Box(box1_30, box1_30);
+const box1_32 = Box(box1_31, box1_31);
+const box1_33 = Box(box1_32, box1_32);
+const box1_34 = Box(box1_33, box1_33);
+const box1_35 = Box(box1_34, box1_34);
+const box1_36 = Box(box1_35, box1_35);
+const box1_37 = Box(box1_36, box1_36);
+const box1_38 = Box(box1_37, box1_37);
+const box1_39 = Box(box1_38, box1_38);
+const box1_40 = Box(box1_39, box1_39);
+const box1_41 = Box(box1_40, box1_40);
+const box1_42 = Box(box1_41, box1_41);
+const box1_43 = Box(box1_42, box1_42);
+const box1_44 = Box(box1_43, box1_43);
+const box1_45 = Box(box1_44, box1_44);
+const box1_46 = Box(box1_45, box1_45);
+const box1_47 = Box(box1_46, box1_46);
+const box1_48 = Box(box1_47, box1_47);
+const box1_49 = Box(box1_48, box1_48);
+const box1_50 = Box(box1_49, box1_49);
+const box1_51 = Box(box1_50, box1_50);
+const box1_52 = Box(box1_51, box1_51);
+const box1_53 = Box(box1_52, box1_52);
+const box1_54 = Box(box1_53, box1_53);
+const box1_55 = Box(box1_54, box1_54);
+const box1_56 = Box(box1_55, box1_55);
+const box1_57 = Box(box1_56, box1_56);
+const box1_58 = Box(box1_57, box1_57);
+const box1_59 = Box(box1_58, box1_58);
+const box1_60 = Box(box1_59, box1_59);
+const box1_61 = Box(box1_60, box1_60);
+const box1_62 = Box(box1_61, box1_61);
+const box1_63 = Box(box1_62, box1_62);
+const box1_64 = Box(box1_63, box1_63);
+const box1_65 = Box(box1_64, box1_64);
+const box1_66 = Box(box1_65, box1_65);
+const box1_67 = Box(box1_66, box1_66);
+const box1_68 = Box(box1_67, box1_67);
+const box1_69 = Box(box1_68, box1_68);
+const box1_70 = Box(box1_69, box1_69);
+const box1_71 = Box(box1_70, box1_70);
+const box1_72 = Box(box1_71, box1_71);
+const box1_73 = Box(box1_72, box1_72);
+const box1_74 = Box(box1_73, box1_73);
+const box1_75 = Box(box1_74, box1_74);
+const box1_76 = Box(box1_75, box1_75);
+const box1_77 = Box(box1_76, box1_76);
+const box1_78 = Box(box1_77, box1_77);
+const box1_79 = Box(box1_78, box1_78);
+const box1_80 = Box(box1_79, box1_79);
+const box1_81 = Box(box1_80, box1_80);
+const box1_82 = Box(box1_81, box1_81);
+const box1_83 = Box(box1_82, box1_82);
+const box1_84 = Box(box1_83, box1_83);
+const box1_85 = Box(box1_84, box1_84);
+const box1_86 = Box(box1_85, box1_85);
+const box1_87 = Box(box1_86, box1_86);
+const box1_88 = Box(box1_87, box1_87);
+const box1_89 = Box(box1_88, box1_88);
+const box1_90 = Box(box1_89, box1_89);
+const box1_91 = Box(box1_90, box1_90);
+const box1_92 = Box(box1_91, box1_91);
+const box1_93 = Box(box1_92, box1_92);
+const box1_94 = Box(box1_93, box1_93);
+const box1_95 = Box(box1_94, box1_94);
+const box1_96 = Box(box1_95, box1_95);
+const box1_97 = Box(box1_96, box1_96);
+const box1_98 = Box(box1_97, box1_97);
+const box1_99 = Box(box1_98, box1_98);
+
+const box2_0 = Box(null, null);
+const box2_1 = Box(box2_0, box2_0);
+const box2_2 = Box(box2_1, box2_1);
+const box2_3 = Box(box2_2, box2_2);
+const box2_4 = Box(box2_3, box2_3);
+const box2_5 = Box(box2_4, box2_4);
+const box2_6 = Box(box2_5, box2_5);
+const box2_7 = Box(box2_6, box2_6);
+const box2_8 = Box(box2_7, box2_7);
+const box2_9 = Box(box2_8, box2_8);
+const box2_10 = Box(box2_9, box2_9);
+const box2_11 = Box(box2_10, box2_10);
+const box2_12 = Box(box2_11, box2_11);
+const box2_13 = Box(box2_12, box2_12);
+const box2_14 = Box(box2_13, box2_13);
+const box2_15 = Box(box2_14, box2_14);
+const box2_16 = Box(box2_15, box2_15);
+const box2_17 = Box(box2_16, box2_16);
+const box2_18 = Box(box2_17, box2_17);
+const box2_19 = Box(box2_18, box2_18);
+const box2_20 = Box(box2_19, box2_19);
+const box2_21 = Box(box2_20, box2_20);
+const box2_22 = Box(box2_21, box2_21);
+const box2_23 = Box(box2_22, box2_22);
+const box2_24 = Box(box2_23, box2_23);
+const box2_25 = Box(box2_24, box2_24);
+const box2_26 = Box(box2_25, box2_25);
+const box2_27 = Box(box2_26, box2_26);
+const box2_28 = Box(box2_27, box2_27);
+const box2_29 = Box(box2_28, box2_28);
+const box2_30 = Box(box2_29, box2_29);
+const box2_31 = Box(box2_30, box2_30);
+const box2_32 = Box(box2_31, box2_31);
+const box2_33 = Box(box2_32, box2_32);
+const box2_34 = Box(box2_33, box2_33);
+const box2_35 = Box(box2_34, box2_34);
+const box2_36 = Box(box2_35, box2_35);
+const box2_37 = Box(box2_36, box2_36);
+const box2_38 = Box(box2_37, box2_37);
+const box2_39 = Box(box2_38, box2_38);
+const box2_40 = Box(box2_39, box2_39);
+const box2_41 = Box(box2_40, box2_40);
+const box2_42 = Box(box2_41, box2_41);
+const box2_43 = Box(box2_42, box2_42);
+const box2_44 = Box(box2_43, box2_43);
+const box2_45 = Box(box2_44, box2_44);
+const box2_46 = Box(box2_45, box2_45);
+const box2_47 = Box(box2_46, box2_46);
+const box2_48 = Box(box2_47, box2_47);
+const box2_49 = Box(box2_48, box2_48);
+const box2_50 = Box(box2_49, box2_49);
+const box2_51 = Box(box2_50, box2_50);
+const box2_52 = Box(box2_51, box2_51);
+const box2_53 = Box(box2_52, box2_52);
+const box2_54 = Box(box2_53, box2_53);
+const box2_55 = Box(box2_54, box2_54);
+const box2_56 = Box(box2_55, box2_55);
+const box2_57 = Box(box2_56, box2_56);
+const box2_58 = Box(box2_57, box2_57);
+const box2_59 = Box(box2_58, box2_58);
+const box2_60 = Box(box2_59, box2_59);
+const box2_61 = Box(box2_60, box2_60);
+const box2_62 = Box(box2_61, box2_61);
+const box2_63 = Box(box2_62, box2_62);
+const box2_64 = Box(box2_63, box2_63);
+const box2_65 = Box(box2_64, box2_64);
+const box2_66 = Box(box2_65, box2_65);
+const box2_67 = Box(box2_66, box2_66);
+const box2_68 = Box(box2_67, box2_67);
+const box2_69 = Box(box2_68, box2_68);
+const box2_70 = Box(box2_69, box2_69);
+const box2_71 = Box(box2_70, box2_70);
+const box2_72 = Box(box2_71, box2_71);
+const box2_73 = Box(box2_72, box2_72);
+const box2_74 = Box(box2_73, box2_73);
+const box2_75 = Box(box2_74, box2_74);
+const box2_76 = Box(box2_75, box2_75);
+const box2_77 = Box(box2_76, box2_76);
+const box2_78 = Box(box2_77, box2_77);
+const box2_79 = Box(box2_78, box2_78);
+const box2_80 = Box(box2_79, box2_79);
+const box2_81 = Box(box2_80, box2_80);
+const box2_82 = Box(box2_81, box2_81);
+const box2_83 = Box(box2_82, box2_82);
+const box2_84 = Box(box2_83, box2_83);
+const box2_85 = Box(box2_84, box2_84);
+const box2_86 = Box(box2_85, box2_85);
+const box2_87 = Box(box2_86, box2_86);
+const box2_88 = Box(box2_87, box2_87);
+const box2_89 = Box(box2_88, box2_88);
+const box2_90 = Box(box2_89, box2_89);
+const box2_91 = Box(box2_90, box2_90);
+const box2_92 = Box(box2_91, box2_91);
+const box2_93 = Box(box2_92, box2_92);
+const box2_94 = Box(box2_93, box2_93);
+const box2_95 = Box(box2_94, box2_94);
+const box2_96 = Box(box2_95, box2_95);
+const box2_97 = Box(box2_96, box2_96);
+const box2_98 = Box(box2_97, box2_97);
+const box2_99 = Box(box2_98, box2_98);
+
+confuse(x) {
+  try { throw x; } catch (e) { return e; }
+}
+
+main() {
+  if (!identical(confuse(box1_99), confuse(box2_99))) {
+    throw new Exception("box1_99 !== box2_99");
+  }
+}
diff --git a/tests/language_2/canonicalization_hashing_shallow_collision_array_test.dart b/tests/language_2/canonicalization_hashing_shallow_collision_array_test.dart
new file mode 100644
index 0000000..e094e06
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_shallow_collision_array_test.dart
@@ -0,0 +1,20024 @@
+// 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.
+
+// If canonicialization hashes with only a field's cid, this will exhibit
+// quadratic time.
+
+// 10,000 elements.
+const list1 = [
+[[0]],
+[[1]],
+[[2]],
+[[3]],
+[[4]],
+[[5]],
+[[6]],
+[[7]],
+[[8]],
+[[9]],
+[[10]],
+[[11]],
+[[12]],
+[[13]],
+[[14]],
+[[15]],
+[[16]],
+[[17]],
+[[18]],
+[[19]],
+[[20]],
+[[21]],
+[[22]],
+[[23]],
+[[24]],
+[[25]],
+[[26]],
+[[27]],
+[[28]],
+[[29]],
+[[30]],
+[[31]],
+[[32]],
+[[33]],
+[[34]],
+[[35]],
+[[36]],
+[[37]],
+[[38]],
+[[39]],
+[[40]],
+[[41]],
+[[42]],
+[[43]],
+[[44]],
+[[45]],
+[[46]],
+[[47]],
+[[48]],
+[[49]],
+[[50]],
+[[51]],
+[[52]],
+[[53]],
+[[54]],
+[[55]],
+[[56]],
+[[57]],
+[[58]],
+[[59]],
+[[60]],
+[[61]],
+[[62]],
+[[63]],
+[[64]],
+[[65]],
+[[66]],
+[[67]],
+[[68]],
+[[69]],
+[[70]],
+[[71]],
+[[72]],
+[[73]],
+[[74]],
+[[75]],
+[[76]],
+[[77]],
+[[78]],
+[[79]],
+[[80]],
+[[81]],
+[[82]],
+[[83]],
+[[84]],
+[[85]],
+[[86]],
+[[87]],
+[[88]],
+[[89]],
+[[90]],
+[[91]],
+[[92]],
+[[93]],
+[[94]],
+[[95]],
+[[96]],
+[[97]],
+[[98]],
+[[99]],
+[[100]],
+[[101]],
+[[102]],
+[[103]],
+[[104]],
+[[105]],
+[[106]],
+[[107]],
+[[108]],
+[[109]],
+[[110]],
+[[111]],
+[[112]],
+[[113]],
+[[114]],
+[[115]],
+[[116]],
+[[117]],
+[[118]],
+[[119]],
+[[120]],
+[[121]],
+[[122]],
+[[123]],
+[[124]],
+[[125]],
+[[126]],
+[[127]],
+[[128]],
+[[129]],
+[[130]],
+[[131]],
+[[132]],
+[[133]],
+[[134]],
+[[135]],
+[[136]],
+[[137]],
+[[138]],
+[[139]],
+[[140]],
+[[141]],
+[[142]],
+[[143]],
+[[144]],
+[[145]],
+[[146]],
+[[147]],
+[[148]],
+[[149]],
+[[150]],
+[[151]],
+[[152]],
+[[153]],
+[[154]],
+[[155]],
+[[156]],
+[[157]],
+[[158]],
+[[159]],
+[[160]],
+[[161]],
+[[162]],
+[[163]],
+[[164]],
+[[165]],
+[[166]],
+[[167]],
+[[168]],
+[[169]],
+[[170]],
+[[171]],
+[[172]],
+[[173]],
+[[174]],
+[[175]],
+[[176]],
+[[177]],
+[[178]],
+[[179]],
+[[180]],
+[[181]],
+[[182]],
+[[183]],
+[[184]],
+[[185]],
+[[186]],
+[[187]],
+[[188]],
+[[189]],
+[[190]],
+[[191]],
+[[192]],
+[[193]],
+[[194]],
+[[195]],
+[[196]],
+[[197]],
+[[198]],
+[[199]],
+[[200]],
+[[201]],
+[[202]],
+[[203]],
+[[204]],
+[[205]],
+[[206]],
+[[207]],
+[[208]],
+[[209]],
+[[210]],
+[[211]],
+[[212]],
+[[213]],
+[[214]],
+[[215]],
+[[216]],
+[[217]],
+[[218]],
+[[219]],
+[[220]],
+[[221]],
+[[222]],
+[[223]],
+[[224]],
+[[225]],
+[[226]],
+[[227]],
+[[228]],
+[[229]],
+[[230]],
+[[231]],
+[[232]],
+[[233]],
+[[234]],
+[[235]],
+[[236]],
+[[237]],
+[[238]],
+[[239]],
+[[240]],
+[[241]],
+[[242]],
+[[243]],
+[[244]],
+[[245]],
+[[246]],
+[[247]],
+[[248]],
+[[249]],
+[[250]],
+[[251]],
+[[252]],
+[[253]],
+[[254]],
+[[255]],
+[[256]],
+[[257]],
+[[258]],
+[[259]],
+[[260]],
+[[261]],
+[[262]],
+[[263]],
+[[264]],
+[[265]],
+[[266]],
+[[267]],
+[[268]],
+[[269]],
+[[270]],
+[[271]],
+[[272]],
+[[273]],
+[[274]],
+[[275]],
+[[276]],
+[[277]],
+[[278]],
+[[279]],
+[[280]],
+[[281]],
+[[282]],
+[[283]],
+[[284]],
+[[285]],
+[[286]],
+[[287]],
+[[288]],
+[[289]],
+[[290]],
+[[291]],
+[[292]],
+[[293]],
+[[294]],
+[[295]],
+[[296]],
+[[297]],
+[[298]],
+[[299]],
+[[300]],
+[[301]],
+[[302]],
+[[303]],
+[[304]],
+[[305]],
+[[306]],
+[[307]],
+[[308]],
+[[309]],
+[[310]],
+[[311]],
+[[312]],
+[[313]],
+[[314]],
+[[315]],
+[[316]],
+[[317]],
+[[318]],
+[[319]],
+[[320]],
+[[321]],
+[[322]],
+[[323]],
+[[324]],
+[[325]],
+[[326]],
+[[327]],
+[[328]],
+[[329]],
+[[330]],
+[[331]],
+[[332]],
+[[333]],
+[[334]],
+[[335]],
+[[336]],
+[[337]],
+[[338]],
+[[339]],
+[[340]],
+[[341]],
+[[342]],
+[[343]],
+[[344]],
+[[345]],
+[[346]],
+[[347]],
+[[348]],
+[[349]],
+[[350]],
+[[351]],
+[[352]],
+[[353]],
+[[354]],
+[[355]],
+[[356]],
+[[357]],
+[[358]],
+[[359]],
+[[360]],
+[[361]],
+[[362]],
+[[363]],
+[[364]],
+[[365]],
+[[366]],
+[[367]],
+[[368]],
+[[369]],
+[[370]],
+[[371]],
+[[372]],
+[[373]],
+[[374]],
+[[375]],
+[[376]],
+[[377]],
+[[378]],
+[[379]],
+[[380]],
+[[381]],
+[[382]],
+[[383]],
+[[384]],
+[[385]],
+[[386]],
+[[387]],
+[[388]],
+[[389]],
+[[390]],
+[[391]],
+[[392]],
+[[393]],
+[[394]],
+[[395]],
+[[396]],
+[[397]],
+[[398]],
+[[399]],
+[[400]],
+[[401]],
+[[402]],
+[[403]],
+[[404]],
+[[405]],
+[[406]],
+[[407]],
+[[408]],
+[[409]],
+[[410]],
+[[411]],
+[[412]],
+[[413]],
+[[414]],
+[[415]],
+[[416]],
+[[417]],
+[[418]],
+[[419]],
+[[420]],
+[[421]],
+[[422]],
+[[423]],
+[[424]],
+[[425]],
+[[426]],
+[[427]],
+[[428]],
+[[429]],
+[[430]],
+[[431]],
+[[432]],
+[[433]],
+[[434]],
+[[435]],
+[[436]],
+[[437]],
+[[438]],
+[[439]],
+[[440]],
+[[441]],
+[[442]],
+[[443]],
+[[444]],
+[[445]],
+[[446]],
+[[447]],
+[[448]],
+[[449]],
+[[450]],
+[[451]],
+[[452]],
+[[453]],
+[[454]],
+[[455]],
+[[456]],
+[[457]],
+[[458]],
+[[459]],
+[[460]],
+[[461]],
+[[462]],
+[[463]],
+[[464]],
+[[465]],
+[[466]],
+[[467]],
+[[468]],
+[[469]],
+[[470]],
+[[471]],
+[[472]],
+[[473]],
+[[474]],
+[[475]],
+[[476]],
+[[477]],
+[[478]],
+[[479]],
+[[480]],
+[[481]],
+[[482]],
+[[483]],
+[[484]],
+[[485]],
+[[486]],
+[[487]],
+[[488]],
+[[489]],
+[[490]],
+[[491]],
+[[492]],
+[[493]],
+[[494]],
+[[495]],
+[[496]],
+[[497]],
+[[498]],
+[[499]],
+[[500]],
+[[501]],
+[[502]],
+[[503]],
+[[504]],
+[[505]],
+[[506]],
+[[507]],
+[[508]],
+[[509]],
+[[510]],
+[[511]],
+[[512]],
+[[513]],
+[[514]],
+[[515]],
+[[516]],
+[[517]],
+[[518]],
+[[519]],
+[[520]],
+[[521]],
+[[522]],
+[[523]],
+[[524]],
+[[525]],
+[[526]],
+[[527]],
+[[528]],
+[[529]],
+[[530]],
+[[531]],
+[[532]],
+[[533]],
+[[534]],
+[[535]],
+[[536]],
+[[537]],
+[[538]],
+[[539]],
+[[540]],
+[[541]],
+[[542]],
+[[543]],
+[[544]],
+[[545]],
+[[546]],
+[[547]],
+[[548]],
+[[549]],
+[[550]],
+[[551]],
+[[552]],
+[[553]],
+[[554]],
+[[555]],
+[[556]],
+[[557]],
+[[558]],
+[[559]],
+[[560]],
+[[561]],
+[[562]],
+[[563]],
+[[564]],
+[[565]],
+[[566]],
+[[567]],
+[[568]],
+[[569]],
+[[570]],
+[[571]],
+[[572]],
+[[573]],
+[[574]],
+[[575]],
+[[576]],
+[[577]],
+[[578]],
+[[579]],
+[[580]],
+[[581]],
+[[582]],
+[[583]],
+[[584]],
+[[585]],
+[[586]],
+[[587]],
+[[588]],
+[[589]],
+[[590]],
+[[591]],
+[[592]],
+[[593]],
+[[594]],
+[[595]],
+[[596]],
+[[597]],
+[[598]],
+[[599]],
+[[600]],
+[[601]],
+[[602]],
+[[603]],
+[[604]],
+[[605]],
+[[606]],
+[[607]],
+[[608]],
+[[609]],
+[[610]],
+[[611]],
+[[612]],
+[[613]],
+[[614]],
+[[615]],
+[[616]],
+[[617]],
+[[618]],
+[[619]],
+[[620]],
+[[621]],
+[[622]],
+[[623]],
+[[624]],
+[[625]],
+[[626]],
+[[627]],
+[[628]],
+[[629]],
+[[630]],
+[[631]],
+[[632]],
+[[633]],
+[[634]],
+[[635]],
+[[636]],
+[[637]],
+[[638]],
+[[639]],
+[[640]],
+[[641]],
+[[642]],
+[[643]],
+[[644]],
+[[645]],
+[[646]],
+[[647]],
+[[648]],
+[[649]],
+[[650]],
+[[651]],
+[[652]],
+[[653]],
+[[654]],
+[[655]],
+[[656]],
+[[657]],
+[[658]],
+[[659]],
+[[660]],
+[[661]],
+[[662]],
+[[663]],
+[[664]],
+[[665]],
+[[666]],
+[[667]],
+[[668]],
+[[669]],
+[[670]],
+[[671]],
+[[672]],
+[[673]],
+[[674]],
+[[675]],
+[[676]],
+[[677]],
+[[678]],
+[[679]],
+[[680]],
+[[681]],
+[[682]],
+[[683]],
+[[684]],
+[[685]],
+[[686]],
+[[687]],
+[[688]],
+[[689]],
+[[690]],
+[[691]],
+[[692]],
+[[693]],
+[[694]],
+[[695]],
+[[696]],
+[[697]],
+[[698]],
+[[699]],
+[[700]],
+[[701]],
+[[702]],
+[[703]],
+[[704]],
+[[705]],
+[[706]],
+[[707]],
+[[708]],
+[[709]],
+[[710]],
+[[711]],
+[[712]],
+[[713]],
+[[714]],
+[[715]],
+[[716]],
+[[717]],
+[[718]],
+[[719]],
+[[720]],
+[[721]],
+[[722]],
+[[723]],
+[[724]],
+[[725]],
+[[726]],
+[[727]],
+[[728]],
+[[729]],
+[[730]],
+[[731]],
+[[732]],
+[[733]],
+[[734]],
+[[735]],
+[[736]],
+[[737]],
+[[738]],
+[[739]],
+[[740]],
+[[741]],
+[[742]],
+[[743]],
+[[744]],
+[[745]],
+[[746]],
+[[747]],
+[[748]],
+[[749]],
+[[750]],
+[[751]],
+[[752]],
+[[753]],
+[[754]],
+[[755]],
+[[756]],
+[[757]],
+[[758]],
+[[759]],
+[[760]],
+[[761]],
+[[762]],
+[[763]],
+[[764]],
+[[765]],
+[[766]],
+[[767]],
+[[768]],
+[[769]],
+[[770]],
+[[771]],
+[[772]],
+[[773]],
+[[774]],
+[[775]],
+[[776]],
+[[777]],
+[[778]],
+[[779]],
+[[780]],
+[[781]],
+[[782]],
+[[783]],
+[[784]],
+[[785]],
+[[786]],
+[[787]],
+[[788]],
+[[789]],
+[[790]],
+[[791]],
+[[792]],
+[[793]],
+[[794]],
+[[795]],
+[[796]],
+[[797]],
+[[798]],
+[[799]],
+[[800]],
+[[801]],
+[[802]],
+[[803]],
+[[804]],
+[[805]],
+[[806]],
+[[807]],
+[[808]],
+[[809]],
+[[810]],
+[[811]],
+[[812]],
+[[813]],
+[[814]],
+[[815]],
+[[816]],
+[[817]],
+[[818]],
+[[819]],
+[[820]],
+[[821]],
+[[822]],
+[[823]],
+[[824]],
+[[825]],
+[[826]],
+[[827]],
+[[828]],
+[[829]],
+[[830]],
+[[831]],
+[[832]],
+[[833]],
+[[834]],
+[[835]],
+[[836]],
+[[837]],
+[[838]],
+[[839]],
+[[840]],
+[[841]],
+[[842]],
+[[843]],
+[[844]],
+[[845]],
+[[846]],
+[[847]],
+[[848]],
+[[849]],
+[[850]],
+[[851]],
+[[852]],
+[[853]],
+[[854]],
+[[855]],
+[[856]],
+[[857]],
+[[858]],
+[[859]],
+[[860]],
+[[861]],
+[[862]],
+[[863]],
+[[864]],
+[[865]],
+[[866]],
+[[867]],
+[[868]],
+[[869]],
+[[870]],
+[[871]],
+[[872]],
+[[873]],
+[[874]],
+[[875]],
+[[876]],
+[[877]],
+[[878]],
+[[879]],
+[[880]],
+[[881]],
+[[882]],
+[[883]],
+[[884]],
+[[885]],
+[[886]],
+[[887]],
+[[888]],
+[[889]],
+[[890]],
+[[891]],
+[[892]],
+[[893]],
+[[894]],
+[[895]],
+[[896]],
+[[897]],
+[[898]],
+[[899]],
+[[900]],
+[[901]],
+[[902]],
+[[903]],
+[[904]],
+[[905]],
+[[906]],
+[[907]],
+[[908]],
+[[909]],
+[[910]],
+[[911]],
+[[912]],
+[[913]],
+[[914]],
+[[915]],
+[[916]],
+[[917]],
+[[918]],
+[[919]],
+[[920]],
+[[921]],
+[[922]],
+[[923]],
+[[924]],
+[[925]],
+[[926]],
+[[927]],
+[[928]],
+[[929]],
+[[930]],
+[[931]],
+[[932]],
+[[933]],
+[[934]],
+[[935]],
+[[936]],
+[[937]],
+[[938]],
+[[939]],
+[[940]],
+[[941]],
+[[942]],
+[[943]],
+[[944]],
+[[945]],
+[[946]],
+[[947]],
+[[948]],
+[[949]],
+[[950]],
+[[951]],
+[[952]],
+[[953]],
+[[954]],
+[[955]],
+[[956]],
+[[957]],
+[[958]],
+[[959]],
+[[960]],
+[[961]],
+[[962]],
+[[963]],
+[[964]],
+[[965]],
+[[966]],
+[[967]],
+[[968]],
+[[969]],
+[[970]],
+[[971]],
+[[972]],
+[[973]],
+[[974]],
+[[975]],
+[[976]],
+[[977]],
+[[978]],
+[[979]],
+[[980]],
+[[981]],
+[[982]],
+[[983]],
+[[984]],
+[[985]],
+[[986]],
+[[987]],
+[[988]],
+[[989]],
+[[990]],
+[[991]],
+[[992]],
+[[993]],
+[[994]],
+[[995]],
+[[996]],
+[[997]],
+[[998]],
+[[999]],
+[[1000]],
+[[1001]],
+[[1002]],
+[[1003]],
+[[1004]],
+[[1005]],
+[[1006]],
+[[1007]],
+[[1008]],
+[[1009]],
+[[1010]],
+[[1011]],
+[[1012]],
+[[1013]],
+[[1014]],
+[[1015]],
+[[1016]],
+[[1017]],
+[[1018]],
+[[1019]],
+[[1020]],
+[[1021]],
+[[1022]],
+[[1023]],
+[[1024]],
+[[1025]],
+[[1026]],
+[[1027]],
+[[1028]],
+[[1029]],
+[[1030]],
+[[1031]],
+[[1032]],
+[[1033]],
+[[1034]],
+[[1035]],
+[[1036]],
+[[1037]],
+[[1038]],
+[[1039]],
+[[1040]],
+[[1041]],
+[[1042]],
+[[1043]],
+[[1044]],
+[[1045]],
+[[1046]],
+[[1047]],
+[[1048]],
+[[1049]],
+[[1050]],
+[[1051]],
+[[1052]],
+[[1053]],
+[[1054]],
+[[1055]],
+[[1056]],
+[[1057]],
+[[1058]],
+[[1059]],
+[[1060]],
+[[1061]],
+[[1062]],
+[[1063]],
+[[1064]],
+[[1065]],
+[[1066]],
+[[1067]],
+[[1068]],
+[[1069]],
+[[1070]],
+[[1071]],
+[[1072]],
+[[1073]],
+[[1074]],
+[[1075]],
+[[1076]],
+[[1077]],
+[[1078]],
+[[1079]],
+[[1080]],
+[[1081]],
+[[1082]],
+[[1083]],
+[[1084]],
+[[1085]],
+[[1086]],
+[[1087]],
+[[1088]],
+[[1089]],
+[[1090]],
+[[1091]],
+[[1092]],
+[[1093]],
+[[1094]],
+[[1095]],
+[[1096]],
+[[1097]],
+[[1098]],
+[[1099]],
+[[1100]],
+[[1101]],
+[[1102]],
+[[1103]],
+[[1104]],
+[[1105]],
+[[1106]],
+[[1107]],
+[[1108]],
+[[1109]],
+[[1110]],
+[[1111]],
+[[1112]],
+[[1113]],
+[[1114]],
+[[1115]],
+[[1116]],
+[[1117]],
+[[1118]],
+[[1119]],
+[[1120]],
+[[1121]],
+[[1122]],
+[[1123]],
+[[1124]],
+[[1125]],
+[[1126]],
+[[1127]],
+[[1128]],
+[[1129]],
+[[1130]],
+[[1131]],
+[[1132]],
+[[1133]],
+[[1134]],
+[[1135]],
+[[1136]],
+[[1137]],
+[[1138]],
+[[1139]],
+[[1140]],
+[[1141]],
+[[1142]],
+[[1143]],
+[[1144]],
+[[1145]],
+[[1146]],
+[[1147]],
+[[1148]],
+[[1149]],
+[[1150]],
+[[1151]],
+[[1152]],
+[[1153]],
+[[1154]],
+[[1155]],
+[[1156]],
+[[1157]],
+[[1158]],
+[[1159]],
+[[1160]],
+[[1161]],
+[[1162]],
+[[1163]],
+[[1164]],
+[[1165]],
+[[1166]],
+[[1167]],
+[[1168]],
+[[1169]],
+[[1170]],
+[[1171]],
+[[1172]],
+[[1173]],
+[[1174]],
+[[1175]],
+[[1176]],
+[[1177]],
+[[1178]],
+[[1179]],
+[[1180]],
+[[1181]],
+[[1182]],
+[[1183]],
+[[1184]],
+[[1185]],
+[[1186]],
+[[1187]],
+[[1188]],
+[[1189]],
+[[1190]],
+[[1191]],
+[[1192]],
+[[1193]],
+[[1194]],
+[[1195]],
+[[1196]],
+[[1197]],
+[[1198]],
+[[1199]],
+[[1200]],
+[[1201]],
+[[1202]],
+[[1203]],
+[[1204]],
+[[1205]],
+[[1206]],
+[[1207]],
+[[1208]],
+[[1209]],
+[[1210]],
+[[1211]],
+[[1212]],
+[[1213]],
+[[1214]],
+[[1215]],
+[[1216]],
+[[1217]],
+[[1218]],
+[[1219]],
+[[1220]],
+[[1221]],
+[[1222]],
+[[1223]],
+[[1224]],
+[[1225]],
+[[1226]],
+[[1227]],
+[[1228]],
+[[1229]],
+[[1230]],
+[[1231]],
+[[1232]],
+[[1233]],
+[[1234]],
+[[1235]],
+[[1236]],
+[[1237]],
+[[1238]],
+[[1239]],
+[[1240]],
+[[1241]],
+[[1242]],
+[[1243]],
+[[1244]],
+[[1245]],
+[[1246]],
+[[1247]],
+[[1248]],
+[[1249]],
+[[1250]],
+[[1251]],
+[[1252]],
+[[1253]],
+[[1254]],
+[[1255]],
+[[1256]],
+[[1257]],
+[[1258]],
+[[1259]],
+[[1260]],
+[[1261]],
+[[1262]],
+[[1263]],
+[[1264]],
+[[1265]],
+[[1266]],
+[[1267]],
+[[1268]],
+[[1269]],
+[[1270]],
+[[1271]],
+[[1272]],
+[[1273]],
+[[1274]],
+[[1275]],
+[[1276]],
+[[1277]],
+[[1278]],
+[[1279]],
+[[1280]],
+[[1281]],
+[[1282]],
+[[1283]],
+[[1284]],
+[[1285]],
+[[1286]],
+[[1287]],
+[[1288]],
+[[1289]],
+[[1290]],
+[[1291]],
+[[1292]],
+[[1293]],
+[[1294]],
+[[1295]],
+[[1296]],
+[[1297]],
+[[1298]],
+[[1299]],
+[[1300]],
+[[1301]],
+[[1302]],
+[[1303]],
+[[1304]],
+[[1305]],
+[[1306]],
+[[1307]],
+[[1308]],
+[[1309]],
+[[1310]],
+[[1311]],
+[[1312]],
+[[1313]],
+[[1314]],
+[[1315]],
+[[1316]],
+[[1317]],
+[[1318]],
+[[1319]],
+[[1320]],
+[[1321]],
+[[1322]],
+[[1323]],
+[[1324]],
+[[1325]],
+[[1326]],
+[[1327]],
+[[1328]],
+[[1329]],
+[[1330]],
+[[1331]],
+[[1332]],
+[[1333]],
+[[1334]],
+[[1335]],
+[[1336]],
+[[1337]],
+[[1338]],
+[[1339]],
+[[1340]],
+[[1341]],
+[[1342]],
+[[1343]],
+[[1344]],
+[[1345]],
+[[1346]],
+[[1347]],
+[[1348]],
+[[1349]],
+[[1350]],
+[[1351]],
+[[1352]],
+[[1353]],
+[[1354]],
+[[1355]],
+[[1356]],
+[[1357]],
+[[1358]],
+[[1359]],
+[[1360]],
+[[1361]],
+[[1362]],
+[[1363]],
+[[1364]],
+[[1365]],
+[[1366]],
+[[1367]],
+[[1368]],
+[[1369]],
+[[1370]],
+[[1371]],
+[[1372]],
+[[1373]],
+[[1374]],
+[[1375]],
+[[1376]],
+[[1377]],
+[[1378]],
+[[1379]],
+[[1380]],
+[[1381]],
+[[1382]],
+[[1383]],
+[[1384]],
+[[1385]],
+[[1386]],
+[[1387]],
+[[1388]],
+[[1389]],
+[[1390]],
+[[1391]],
+[[1392]],
+[[1393]],
+[[1394]],
+[[1395]],
+[[1396]],
+[[1397]],
+[[1398]],
+[[1399]],
+[[1400]],
+[[1401]],
+[[1402]],
+[[1403]],
+[[1404]],
+[[1405]],
+[[1406]],
+[[1407]],
+[[1408]],
+[[1409]],
+[[1410]],
+[[1411]],
+[[1412]],
+[[1413]],
+[[1414]],
+[[1415]],
+[[1416]],
+[[1417]],
+[[1418]],
+[[1419]],
+[[1420]],
+[[1421]],
+[[1422]],
+[[1423]],
+[[1424]],
+[[1425]],
+[[1426]],
+[[1427]],
+[[1428]],
+[[1429]],
+[[1430]],
+[[1431]],
+[[1432]],
+[[1433]],
+[[1434]],
+[[1435]],
+[[1436]],
+[[1437]],
+[[1438]],
+[[1439]],
+[[1440]],
+[[1441]],
+[[1442]],
+[[1443]],
+[[1444]],
+[[1445]],
+[[1446]],
+[[1447]],
+[[1448]],
+[[1449]],
+[[1450]],
+[[1451]],
+[[1452]],
+[[1453]],
+[[1454]],
+[[1455]],
+[[1456]],
+[[1457]],
+[[1458]],
+[[1459]],
+[[1460]],
+[[1461]],
+[[1462]],
+[[1463]],
+[[1464]],
+[[1465]],
+[[1466]],
+[[1467]],
+[[1468]],
+[[1469]],
+[[1470]],
+[[1471]],
+[[1472]],
+[[1473]],
+[[1474]],
+[[1475]],
+[[1476]],
+[[1477]],
+[[1478]],
+[[1479]],
+[[1480]],
+[[1481]],
+[[1482]],
+[[1483]],
+[[1484]],
+[[1485]],
+[[1486]],
+[[1487]],
+[[1488]],
+[[1489]],
+[[1490]],
+[[1491]],
+[[1492]],
+[[1493]],
+[[1494]],
+[[1495]],
+[[1496]],
+[[1497]],
+[[1498]],
+[[1499]],
+[[1500]],
+[[1501]],
+[[1502]],
+[[1503]],
+[[1504]],
+[[1505]],
+[[1506]],
+[[1507]],
+[[1508]],
+[[1509]],
+[[1510]],
+[[1511]],
+[[1512]],
+[[1513]],
+[[1514]],
+[[1515]],
+[[1516]],
+[[1517]],
+[[1518]],
+[[1519]],
+[[1520]],
+[[1521]],
+[[1522]],
+[[1523]],
+[[1524]],
+[[1525]],
+[[1526]],
+[[1527]],
+[[1528]],
+[[1529]],
+[[1530]],
+[[1531]],
+[[1532]],
+[[1533]],
+[[1534]],
+[[1535]],
+[[1536]],
+[[1537]],
+[[1538]],
+[[1539]],
+[[1540]],
+[[1541]],
+[[1542]],
+[[1543]],
+[[1544]],
+[[1545]],
+[[1546]],
+[[1547]],
+[[1548]],
+[[1549]],
+[[1550]],
+[[1551]],
+[[1552]],
+[[1553]],
+[[1554]],
+[[1555]],
+[[1556]],
+[[1557]],
+[[1558]],
+[[1559]],
+[[1560]],
+[[1561]],
+[[1562]],
+[[1563]],
+[[1564]],
+[[1565]],
+[[1566]],
+[[1567]],
+[[1568]],
+[[1569]],
+[[1570]],
+[[1571]],
+[[1572]],
+[[1573]],
+[[1574]],
+[[1575]],
+[[1576]],
+[[1577]],
+[[1578]],
+[[1579]],
+[[1580]],
+[[1581]],
+[[1582]],
+[[1583]],
+[[1584]],
+[[1585]],
+[[1586]],
+[[1587]],
+[[1588]],
+[[1589]],
+[[1590]],
+[[1591]],
+[[1592]],
+[[1593]],
+[[1594]],
+[[1595]],
+[[1596]],
+[[1597]],
+[[1598]],
+[[1599]],
+[[1600]],
+[[1601]],
+[[1602]],
+[[1603]],
+[[1604]],
+[[1605]],
+[[1606]],
+[[1607]],
+[[1608]],
+[[1609]],
+[[1610]],
+[[1611]],
+[[1612]],
+[[1613]],
+[[1614]],
+[[1615]],
+[[1616]],
+[[1617]],
+[[1618]],
+[[1619]],
+[[1620]],
+[[1621]],
+[[1622]],
+[[1623]],
+[[1624]],
+[[1625]],
+[[1626]],
+[[1627]],
+[[1628]],
+[[1629]],
+[[1630]],
+[[1631]],
+[[1632]],
+[[1633]],
+[[1634]],
+[[1635]],
+[[1636]],
+[[1637]],
+[[1638]],
+[[1639]],
+[[1640]],
+[[1641]],
+[[1642]],
+[[1643]],
+[[1644]],
+[[1645]],
+[[1646]],
+[[1647]],
+[[1648]],
+[[1649]],
+[[1650]],
+[[1651]],
+[[1652]],
+[[1653]],
+[[1654]],
+[[1655]],
+[[1656]],
+[[1657]],
+[[1658]],
+[[1659]],
+[[1660]],
+[[1661]],
+[[1662]],
+[[1663]],
+[[1664]],
+[[1665]],
+[[1666]],
+[[1667]],
+[[1668]],
+[[1669]],
+[[1670]],
+[[1671]],
+[[1672]],
+[[1673]],
+[[1674]],
+[[1675]],
+[[1676]],
+[[1677]],
+[[1678]],
+[[1679]],
+[[1680]],
+[[1681]],
+[[1682]],
+[[1683]],
+[[1684]],
+[[1685]],
+[[1686]],
+[[1687]],
+[[1688]],
+[[1689]],
+[[1690]],
+[[1691]],
+[[1692]],
+[[1693]],
+[[1694]],
+[[1695]],
+[[1696]],
+[[1697]],
+[[1698]],
+[[1699]],
+[[1700]],
+[[1701]],
+[[1702]],
+[[1703]],
+[[1704]],
+[[1705]],
+[[1706]],
+[[1707]],
+[[1708]],
+[[1709]],
+[[1710]],
+[[1711]],
+[[1712]],
+[[1713]],
+[[1714]],
+[[1715]],
+[[1716]],
+[[1717]],
+[[1718]],
+[[1719]],
+[[1720]],
+[[1721]],
+[[1722]],
+[[1723]],
+[[1724]],
+[[1725]],
+[[1726]],
+[[1727]],
+[[1728]],
+[[1729]],
+[[1730]],
+[[1731]],
+[[1732]],
+[[1733]],
+[[1734]],
+[[1735]],
+[[1736]],
+[[1737]],
+[[1738]],
+[[1739]],
+[[1740]],
+[[1741]],
+[[1742]],
+[[1743]],
+[[1744]],
+[[1745]],
+[[1746]],
+[[1747]],
+[[1748]],
+[[1749]],
+[[1750]],
+[[1751]],
+[[1752]],
+[[1753]],
+[[1754]],
+[[1755]],
+[[1756]],
+[[1757]],
+[[1758]],
+[[1759]],
+[[1760]],
+[[1761]],
+[[1762]],
+[[1763]],
+[[1764]],
+[[1765]],
+[[1766]],
+[[1767]],
+[[1768]],
+[[1769]],
+[[1770]],
+[[1771]],
+[[1772]],
+[[1773]],
+[[1774]],
+[[1775]],
+[[1776]],
+[[1777]],
+[[1778]],
+[[1779]],
+[[1780]],
+[[1781]],
+[[1782]],
+[[1783]],
+[[1784]],
+[[1785]],
+[[1786]],
+[[1787]],
+[[1788]],
+[[1789]],
+[[1790]],
+[[1791]],
+[[1792]],
+[[1793]],
+[[1794]],
+[[1795]],
+[[1796]],
+[[1797]],
+[[1798]],
+[[1799]],
+[[1800]],
+[[1801]],
+[[1802]],
+[[1803]],
+[[1804]],
+[[1805]],
+[[1806]],
+[[1807]],
+[[1808]],
+[[1809]],
+[[1810]],
+[[1811]],
+[[1812]],
+[[1813]],
+[[1814]],
+[[1815]],
+[[1816]],
+[[1817]],
+[[1818]],
+[[1819]],
+[[1820]],
+[[1821]],
+[[1822]],
+[[1823]],
+[[1824]],
+[[1825]],
+[[1826]],
+[[1827]],
+[[1828]],
+[[1829]],
+[[1830]],
+[[1831]],
+[[1832]],
+[[1833]],
+[[1834]],
+[[1835]],
+[[1836]],
+[[1837]],
+[[1838]],
+[[1839]],
+[[1840]],
+[[1841]],
+[[1842]],
+[[1843]],
+[[1844]],
+[[1845]],
+[[1846]],
+[[1847]],
+[[1848]],
+[[1849]],
+[[1850]],
+[[1851]],
+[[1852]],
+[[1853]],
+[[1854]],
+[[1855]],
+[[1856]],
+[[1857]],
+[[1858]],
+[[1859]],
+[[1860]],
+[[1861]],
+[[1862]],
+[[1863]],
+[[1864]],
+[[1865]],
+[[1866]],
+[[1867]],
+[[1868]],
+[[1869]],
+[[1870]],
+[[1871]],
+[[1872]],
+[[1873]],
+[[1874]],
+[[1875]],
+[[1876]],
+[[1877]],
+[[1878]],
+[[1879]],
+[[1880]],
+[[1881]],
+[[1882]],
+[[1883]],
+[[1884]],
+[[1885]],
+[[1886]],
+[[1887]],
+[[1888]],
+[[1889]],
+[[1890]],
+[[1891]],
+[[1892]],
+[[1893]],
+[[1894]],
+[[1895]],
+[[1896]],
+[[1897]],
+[[1898]],
+[[1899]],
+[[1900]],
+[[1901]],
+[[1902]],
+[[1903]],
+[[1904]],
+[[1905]],
+[[1906]],
+[[1907]],
+[[1908]],
+[[1909]],
+[[1910]],
+[[1911]],
+[[1912]],
+[[1913]],
+[[1914]],
+[[1915]],
+[[1916]],
+[[1917]],
+[[1918]],
+[[1919]],
+[[1920]],
+[[1921]],
+[[1922]],
+[[1923]],
+[[1924]],
+[[1925]],
+[[1926]],
+[[1927]],
+[[1928]],
+[[1929]],
+[[1930]],
+[[1931]],
+[[1932]],
+[[1933]],
+[[1934]],
+[[1935]],
+[[1936]],
+[[1937]],
+[[1938]],
+[[1939]],
+[[1940]],
+[[1941]],
+[[1942]],
+[[1943]],
+[[1944]],
+[[1945]],
+[[1946]],
+[[1947]],
+[[1948]],
+[[1949]],
+[[1950]],
+[[1951]],
+[[1952]],
+[[1953]],
+[[1954]],
+[[1955]],
+[[1956]],
+[[1957]],
+[[1958]],
+[[1959]],
+[[1960]],
+[[1961]],
+[[1962]],
+[[1963]],
+[[1964]],
+[[1965]],
+[[1966]],
+[[1967]],
+[[1968]],
+[[1969]],
+[[1970]],
+[[1971]],
+[[1972]],
+[[1973]],
+[[1974]],
+[[1975]],
+[[1976]],
+[[1977]],
+[[1978]],
+[[1979]],
+[[1980]],
+[[1981]],
+[[1982]],
+[[1983]],
+[[1984]],
+[[1985]],
+[[1986]],
+[[1987]],
+[[1988]],
+[[1989]],
+[[1990]],
+[[1991]],
+[[1992]],
+[[1993]],
+[[1994]],
+[[1995]],
+[[1996]],
+[[1997]],
+[[1998]],
+[[1999]],
+[[2000]],
+[[2001]],
+[[2002]],
+[[2003]],
+[[2004]],
+[[2005]],
+[[2006]],
+[[2007]],
+[[2008]],
+[[2009]],
+[[2010]],
+[[2011]],
+[[2012]],
+[[2013]],
+[[2014]],
+[[2015]],
+[[2016]],
+[[2017]],
+[[2018]],
+[[2019]],
+[[2020]],
+[[2021]],
+[[2022]],
+[[2023]],
+[[2024]],
+[[2025]],
+[[2026]],
+[[2027]],
+[[2028]],
+[[2029]],
+[[2030]],
+[[2031]],
+[[2032]],
+[[2033]],
+[[2034]],
+[[2035]],
+[[2036]],
+[[2037]],
+[[2038]],
+[[2039]],
+[[2040]],
+[[2041]],
+[[2042]],
+[[2043]],
+[[2044]],
+[[2045]],
+[[2046]],
+[[2047]],
+[[2048]],
+[[2049]],
+[[2050]],
+[[2051]],
+[[2052]],
+[[2053]],
+[[2054]],
+[[2055]],
+[[2056]],
+[[2057]],
+[[2058]],
+[[2059]],
+[[2060]],
+[[2061]],
+[[2062]],
+[[2063]],
+[[2064]],
+[[2065]],
+[[2066]],
+[[2067]],
+[[2068]],
+[[2069]],
+[[2070]],
+[[2071]],
+[[2072]],
+[[2073]],
+[[2074]],
+[[2075]],
+[[2076]],
+[[2077]],
+[[2078]],
+[[2079]],
+[[2080]],
+[[2081]],
+[[2082]],
+[[2083]],
+[[2084]],
+[[2085]],
+[[2086]],
+[[2087]],
+[[2088]],
+[[2089]],
+[[2090]],
+[[2091]],
+[[2092]],
+[[2093]],
+[[2094]],
+[[2095]],
+[[2096]],
+[[2097]],
+[[2098]],
+[[2099]],
+[[2100]],
+[[2101]],
+[[2102]],
+[[2103]],
+[[2104]],
+[[2105]],
+[[2106]],
+[[2107]],
+[[2108]],
+[[2109]],
+[[2110]],
+[[2111]],
+[[2112]],
+[[2113]],
+[[2114]],
+[[2115]],
+[[2116]],
+[[2117]],
+[[2118]],
+[[2119]],
+[[2120]],
+[[2121]],
+[[2122]],
+[[2123]],
+[[2124]],
+[[2125]],
+[[2126]],
+[[2127]],
+[[2128]],
+[[2129]],
+[[2130]],
+[[2131]],
+[[2132]],
+[[2133]],
+[[2134]],
+[[2135]],
+[[2136]],
+[[2137]],
+[[2138]],
+[[2139]],
+[[2140]],
+[[2141]],
+[[2142]],
+[[2143]],
+[[2144]],
+[[2145]],
+[[2146]],
+[[2147]],
+[[2148]],
+[[2149]],
+[[2150]],
+[[2151]],
+[[2152]],
+[[2153]],
+[[2154]],
+[[2155]],
+[[2156]],
+[[2157]],
+[[2158]],
+[[2159]],
+[[2160]],
+[[2161]],
+[[2162]],
+[[2163]],
+[[2164]],
+[[2165]],
+[[2166]],
+[[2167]],
+[[2168]],
+[[2169]],
+[[2170]],
+[[2171]],
+[[2172]],
+[[2173]],
+[[2174]],
+[[2175]],
+[[2176]],
+[[2177]],
+[[2178]],
+[[2179]],
+[[2180]],
+[[2181]],
+[[2182]],
+[[2183]],
+[[2184]],
+[[2185]],
+[[2186]],
+[[2187]],
+[[2188]],
+[[2189]],
+[[2190]],
+[[2191]],
+[[2192]],
+[[2193]],
+[[2194]],
+[[2195]],
+[[2196]],
+[[2197]],
+[[2198]],
+[[2199]],
+[[2200]],
+[[2201]],
+[[2202]],
+[[2203]],
+[[2204]],
+[[2205]],
+[[2206]],
+[[2207]],
+[[2208]],
+[[2209]],
+[[2210]],
+[[2211]],
+[[2212]],
+[[2213]],
+[[2214]],
+[[2215]],
+[[2216]],
+[[2217]],
+[[2218]],
+[[2219]],
+[[2220]],
+[[2221]],
+[[2222]],
+[[2223]],
+[[2224]],
+[[2225]],
+[[2226]],
+[[2227]],
+[[2228]],
+[[2229]],
+[[2230]],
+[[2231]],
+[[2232]],
+[[2233]],
+[[2234]],
+[[2235]],
+[[2236]],
+[[2237]],
+[[2238]],
+[[2239]],
+[[2240]],
+[[2241]],
+[[2242]],
+[[2243]],
+[[2244]],
+[[2245]],
+[[2246]],
+[[2247]],
+[[2248]],
+[[2249]],
+[[2250]],
+[[2251]],
+[[2252]],
+[[2253]],
+[[2254]],
+[[2255]],
+[[2256]],
+[[2257]],
+[[2258]],
+[[2259]],
+[[2260]],
+[[2261]],
+[[2262]],
+[[2263]],
+[[2264]],
+[[2265]],
+[[2266]],
+[[2267]],
+[[2268]],
+[[2269]],
+[[2270]],
+[[2271]],
+[[2272]],
+[[2273]],
+[[2274]],
+[[2275]],
+[[2276]],
+[[2277]],
+[[2278]],
+[[2279]],
+[[2280]],
+[[2281]],
+[[2282]],
+[[2283]],
+[[2284]],
+[[2285]],
+[[2286]],
+[[2287]],
+[[2288]],
+[[2289]],
+[[2290]],
+[[2291]],
+[[2292]],
+[[2293]],
+[[2294]],
+[[2295]],
+[[2296]],
+[[2297]],
+[[2298]],
+[[2299]],
+[[2300]],
+[[2301]],
+[[2302]],
+[[2303]],
+[[2304]],
+[[2305]],
+[[2306]],
+[[2307]],
+[[2308]],
+[[2309]],
+[[2310]],
+[[2311]],
+[[2312]],
+[[2313]],
+[[2314]],
+[[2315]],
+[[2316]],
+[[2317]],
+[[2318]],
+[[2319]],
+[[2320]],
+[[2321]],
+[[2322]],
+[[2323]],
+[[2324]],
+[[2325]],
+[[2326]],
+[[2327]],
+[[2328]],
+[[2329]],
+[[2330]],
+[[2331]],
+[[2332]],
+[[2333]],
+[[2334]],
+[[2335]],
+[[2336]],
+[[2337]],
+[[2338]],
+[[2339]],
+[[2340]],
+[[2341]],
+[[2342]],
+[[2343]],
+[[2344]],
+[[2345]],
+[[2346]],
+[[2347]],
+[[2348]],
+[[2349]],
+[[2350]],
+[[2351]],
+[[2352]],
+[[2353]],
+[[2354]],
+[[2355]],
+[[2356]],
+[[2357]],
+[[2358]],
+[[2359]],
+[[2360]],
+[[2361]],
+[[2362]],
+[[2363]],
+[[2364]],
+[[2365]],
+[[2366]],
+[[2367]],
+[[2368]],
+[[2369]],
+[[2370]],
+[[2371]],
+[[2372]],
+[[2373]],
+[[2374]],
+[[2375]],
+[[2376]],
+[[2377]],
+[[2378]],
+[[2379]],
+[[2380]],
+[[2381]],
+[[2382]],
+[[2383]],
+[[2384]],
+[[2385]],
+[[2386]],
+[[2387]],
+[[2388]],
+[[2389]],
+[[2390]],
+[[2391]],
+[[2392]],
+[[2393]],
+[[2394]],
+[[2395]],
+[[2396]],
+[[2397]],
+[[2398]],
+[[2399]],
+[[2400]],
+[[2401]],
+[[2402]],
+[[2403]],
+[[2404]],
+[[2405]],
+[[2406]],
+[[2407]],
+[[2408]],
+[[2409]],
+[[2410]],
+[[2411]],
+[[2412]],
+[[2413]],
+[[2414]],
+[[2415]],
+[[2416]],
+[[2417]],
+[[2418]],
+[[2419]],
+[[2420]],
+[[2421]],
+[[2422]],
+[[2423]],
+[[2424]],
+[[2425]],
+[[2426]],
+[[2427]],
+[[2428]],
+[[2429]],
+[[2430]],
+[[2431]],
+[[2432]],
+[[2433]],
+[[2434]],
+[[2435]],
+[[2436]],
+[[2437]],
+[[2438]],
+[[2439]],
+[[2440]],
+[[2441]],
+[[2442]],
+[[2443]],
+[[2444]],
+[[2445]],
+[[2446]],
+[[2447]],
+[[2448]],
+[[2449]],
+[[2450]],
+[[2451]],
+[[2452]],
+[[2453]],
+[[2454]],
+[[2455]],
+[[2456]],
+[[2457]],
+[[2458]],
+[[2459]],
+[[2460]],
+[[2461]],
+[[2462]],
+[[2463]],
+[[2464]],
+[[2465]],
+[[2466]],
+[[2467]],
+[[2468]],
+[[2469]],
+[[2470]],
+[[2471]],
+[[2472]],
+[[2473]],
+[[2474]],
+[[2475]],
+[[2476]],
+[[2477]],
+[[2478]],
+[[2479]],
+[[2480]],
+[[2481]],
+[[2482]],
+[[2483]],
+[[2484]],
+[[2485]],
+[[2486]],
+[[2487]],
+[[2488]],
+[[2489]],
+[[2490]],
+[[2491]],
+[[2492]],
+[[2493]],
+[[2494]],
+[[2495]],
+[[2496]],
+[[2497]],
+[[2498]],
+[[2499]],
+[[2500]],
+[[2501]],
+[[2502]],
+[[2503]],
+[[2504]],
+[[2505]],
+[[2506]],
+[[2507]],
+[[2508]],
+[[2509]],
+[[2510]],
+[[2511]],
+[[2512]],
+[[2513]],
+[[2514]],
+[[2515]],
+[[2516]],
+[[2517]],
+[[2518]],
+[[2519]],
+[[2520]],
+[[2521]],
+[[2522]],
+[[2523]],
+[[2524]],
+[[2525]],
+[[2526]],
+[[2527]],
+[[2528]],
+[[2529]],
+[[2530]],
+[[2531]],
+[[2532]],
+[[2533]],
+[[2534]],
+[[2535]],
+[[2536]],
+[[2537]],
+[[2538]],
+[[2539]],
+[[2540]],
+[[2541]],
+[[2542]],
+[[2543]],
+[[2544]],
+[[2545]],
+[[2546]],
+[[2547]],
+[[2548]],
+[[2549]],
+[[2550]],
+[[2551]],
+[[2552]],
+[[2553]],
+[[2554]],
+[[2555]],
+[[2556]],
+[[2557]],
+[[2558]],
+[[2559]],
+[[2560]],
+[[2561]],
+[[2562]],
+[[2563]],
+[[2564]],
+[[2565]],
+[[2566]],
+[[2567]],
+[[2568]],
+[[2569]],
+[[2570]],
+[[2571]],
+[[2572]],
+[[2573]],
+[[2574]],
+[[2575]],
+[[2576]],
+[[2577]],
+[[2578]],
+[[2579]],
+[[2580]],
+[[2581]],
+[[2582]],
+[[2583]],
+[[2584]],
+[[2585]],
+[[2586]],
+[[2587]],
+[[2588]],
+[[2589]],
+[[2590]],
+[[2591]],
+[[2592]],
+[[2593]],
+[[2594]],
+[[2595]],
+[[2596]],
+[[2597]],
+[[2598]],
+[[2599]],
+[[2600]],
+[[2601]],
+[[2602]],
+[[2603]],
+[[2604]],
+[[2605]],
+[[2606]],
+[[2607]],
+[[2608]],
+[[2609]],
+[[2610]],
+[[2611]],
+[[2612]],
+[[2613]],
+[[2614]],
+[[2615]],
+[[2616]],
+[[2617]],
+[[2618]],
+[[2619]],
+[[2620]],
+[[2621]],
+[[2622]],
+[[2623]],
+[[2624]],
+[[2625]],
+[[2626]],
+[[2627]],
+[[2628]],
+[[2629]],
+[[2630]],
+[[2631]],
+[[2632]],
+[[2633]],
+[[2634]],
+[[2635]],
+[[2636]],
+[[2637]],
+[[2638]],
+[[2639]],
+[[2640]],
+[[2641]],
+[[2642]],
+[[2643]],
+[[2644]],
+[[2645]],
+[[2646]],
+[[2647]],
+[[2648]],
+[[2649]],
+[[2650]],
+[[2651]],
+[[2652]],
+[[2653]],
+[[2654]],
+[[2655]],
+[[2656]],
+[[2657]],
+[[2658]],
+[[2659]],
+[[2660]],
+[[2661]],
+[[2662]],
+[[2663]],
+[[2664]],
+[[2665]],
+[[2666]],
+[[2667]],
+[[2668]],
+[[2669]],
+[[2670]],
+[[2671]],
+[[2672]],
+[[2673]],
+[[2674]],
+[[2675]],
+[[2676]],
+[[2677]],
+[[2678]],
+[[2679]],
+[[2680]],
+[[2681]],
+[[2682]],
+[[2683]],
+[[2684]],
+[[2685]],
+[[2686]],
+[[2687]],
+[[2688]],
+[[2689]],
+[[2690]],
+[[2691]],
+[[2692]],
+[[2693]],
+[[2694]],
+[[2695]],
+[[2696]],
+[[2697]],
+[[2698]],
+[[2699]],
+[[2700]],
+[[2701]],
+[[2702]],
+[[2703]],
+[[2704]],
+[[2705]],
+[[2706]],
+[[2707]],
+[[2708]],
+[[2709]],
+[[2710]],
+[[2711]],
+[[2712]],
+[[2713]],
+[[2714]],
+[[2715]],
+[[2716]],
+[[2717]],
+[[2718]],
+[[2719]],
+[[2720]],
+[[2721]],
+[[2722]],
+[[2723]],
+[[2724]],
+[[2725]],
+[[2726]],
+[[2727]],
+[[2728]],
+[[2729]],
+[[2730]],
+[[2731]],
+[[2732]],
+[[2733]],
+[[2734]],
+[[2735]],
+[[2736]],
+[[2737]],
+[[2738]],
+[[2739]],
+[[2740]],
+[[2741]],
+[[2742]],
+[[2743]],
+[[2744]],
+[[2745]],
+[[2746]],
+[[2747]],
+[[2748]],
+[[2749]],
+[[2750]],
+[[2751]],
+[[2752]],
+[[2753]],
+[[2754]],
+[[2755]],
+[[2756]],
+[[2757]],
+[[2758]],
+[[2759]],
+[[2760]],
+[[2761]],
+[[2762]],
+[[2763]],
+[[2764]],
+[[2765]],
+[[2766]],
+[[2767]],
+[[2768]],
+[[2769]],
+[[2770]],
+[[2771]],
+[[2772]],
+[[2773]],
+[[2774]],
+[[2775]],
+[[2776]],
+[[2777]],
+[[2778]],
+[[2779]],
+[[2780]],
+[[2781]],
+[[2782]],
+[[2783]],
+[[2784]],
+[[2785]],
+[[2786]],
+[[2787]],
+[[2788]],
+[[2789]],
+[[2790]],
+[[2791]],
+[[2792]],
+[[2793]],
+[[2794]],
+[[2795]],
+[[2796]],
+[[2797]],
+[[2798]],
+[[2799]],
+[[2800]],
+[[2801]],
+[[2802]],
+[[2803]],
+[[2804]],
+[[2805]],
+[[2806]],
+[[2807]],
+[[2808]],
+[[2809]],
+[[2810]],
+[[2811]],
+[[2812]],
+[[2813]],
+[[2814]],
+[[2815]],
+[[2816]],
+[[2817]],
+[[2818]],
+[[2819]],
+[[2820]],
+[[2821]],
+[[2822]],
+[[2823]],
+[[2824]],
+[[2825]],
+[[2826]],
+[[2827]],
+[[2828]],
+[[2829]],
+[[2830]],
+[[2831]],
+[[2832]],
+[[2833]],
+[[2834]],
+[[2835]],
+[[2836]],
+[[2837]],
+[[2838]],
+[[2839]],
+[[2840]],
+[[2841]],
+[[2842]],
+[[2843]],
+[[2844]],
+[[2845]],
+[[2846]],
+[[2847]],
+[[2848]],
+[[2849]],
+[[2850]],
+[[2851]],
+[[2852]],
+[[2853]],
+[[2854]],
+[[2855]],
+[[2856]],
+[[2857]],
+[[2858]],
+[[2859]],
+[[2860]],
+[[2861]],
+[[2862]],
+[[2863]],
+[[2864]],
+[[2865]],
+[[2866]],
+[[2867]],
+[[2868]],
+[[2869]],
+[[2870]],
+[[2871]],
+[[2872]],
+[[2873]],
+[[2874]],
+[[2875]],
+[[2876]],
+[[2877]],
+[[2878]],
+[[2879]],
+[[2880]],
+[[2881]],
+[[2882]],
+[[2883]],
+[[2884]],
+[[2885]],
+[[2886]],
+[[2887]],
+[[2888]],
+[[2889]],
+[[2890]],
+[[2891]],
+[[2892]],
+[[2893]],
+[[2894]],
+[[2895]],
+[[2896]],
+[[2897]],
+[[2898]],
+[[2899]],
+[[2900]],
+[[2901]],
+[[2902]],
+[[2903]],
+[[2904]],
+[[2905]],
+[[2906]],
+[[2907]],
+[[2908]],
+[[2909]],
+[[2910]],
+[[2911]],
+[[2912]],
+[[2913]],
+[[2914]],
+[[2915]],
+[[2916]],
+[[2917]],
+[[2918]],
+[[2919]],
+[[2920]],
+[[2921]],
+[[2922]],
+[[2923]],
+[[2924]],
+[[2925]],
+[[2926]],
+[[2927]],
+[[2928]],
+[[2929]],
+[[2930]],
+[[2931]],
+[[2932]],
+[[2933]],
+[[2934]],
+[[2935]],
+[[2936]],
+[[2937]],
+[[2938]],
+[[2939]],
+[[2940]],
+[[2941]],
+[[2942]],
+[[2943]],
+[[2944]],
+[[2945]],
+[[2946]],
+[[2947]],
+[[2948]],
+[[2949]],
+[[2950]],
+[[2951]],
+[[2952]],
+[[2953]],
+[[2954]],
+[[2955]],
+[[2956]],
+[[2957]],
+[[2958]],
+[[2959]],
+[[2960]],
+[[2961]],
+[[2962]],
+[[2963]],
+[[2964]],
+[[2965]],
+[[2966]],
+[[2967]],
+[[2968]],
+[[2969]],
+[[2970]],
+[[2971]],
+[[2972]],
+[[2973]],
+[[2974]],
+[[2975]],
+[[2976]],
+[[2977]],
+[[2978]],
+[[2979]],
+[[2980]],
+[[2981]],
+[[2982]],
+[[2983]],
+[[2984]],
+[[2985]],
+[[2986]],
+[[2987]],
+[[2988]],
+[[2989]],
+[[2990]],
+[[2991]],
+[[2992]],
+[[2993]],
+[[2994]],
+[[2995]],
+[[2996]],
+[[2997]],
+[[2998]],
+[[2999]],
+[[3000]],
+[[3001]],
+[[3002]],
+[[3003]],
+[[3004]],
+[[3005]],
+[[3006]],
+[[3007]],
+[[3008]],
+[[3009]],
+[[3010]],
+[[3011]],
+[[3012]],
+[[3013]],
+[[3014]],
+[[3015]],
+[[3016]],
+[[3017]],
+[[3018]],
+[[3019]],
+[[3020]],
+[[3021]],
+[[3022]],
+[[3023]],
+[[3024]],
+[[3025]],
+[[3026]],
+[[3027]],
+[[3028]],
+[[3029]],
+[[3030]],
+[[3031]],
+[[3032]],
+[[3033]],
+[[3034]],
+[[3035]],
+[[3036]],
+[[3037]],
+[[3038]],
+[[3039]],
+[[3040]],
+[[3041]],
+[[3042]],
+[[3043]],
+[[3044]],
+[[3045]],
+[[3046]],
+[[3047]],
+[[3048]],
+[[3049]],
+[[3050]],
+[[3051]],
+[[3052]],
+[[3053]],
+[[3054]],
+[[3055]],
+[[3056]],
+[[3057]],
+[[3058]],
+[[3059]],
+[[3060]],
+[[3061]],
+[[3062]],
+[[3063]],
+[[3064]],
+[[3065]],
+[[3066]],
+[[3067]],
+[[3068]],
+[[3069]],
+[[3070]],
+[[3071]],
+[[3072]],
+[[3073]],
+[[3074]],
+[[3075]],
+[[3076]],
+[[3077]],
+[[3078]],
+[[3079]],
+[[3080]],
+[[3081]],
+[[3082]],
+[[3083]],
+[[3084]],
+[[3085]],
+[[3086]],
+[[3087]],
+[[3088]],
+[[3089]],
+[[3090]],
+[[3091]],
+[[3092]],
+[[3093]],
+[[3094]],
+[[3095]],
+[[3096]],
+[[3097]],
+[[3098]],
+[[3099]],
+[[3100]],
+[[3101]],
+[[3102]],
+[[3103]],
+[[3104]],
+[[3105]],
+[[3106]],
+[[3107]],
+[[3108]],
+[[3109]],
+[[3110]],
+[[3111]],
+[[3112]],
+[[3113]],
+[[3114]],
+[[3115]],
+[[3116]],
+[[3117]],
+[[3118]],
+[[3119]],
+[[3120]],
+[[3121]],
+[[3122]],
+[[3123]],
+[[3124]],
+[[3125]],
+[[3126]],
+[[3127]],
+[[3128]],
+[[3129]],
+[[3130]],
+[[3131]],
+[[3132]],
+[[3133]],
+[[3134]],
+[[3135]],
+[[3136]],
+[[3137]],
+[[3138]],
+[[3139]],
+[[3140]],
+[[3141]],
+[[3142]],
+[[3143]],
+[[3144]],
+[[3145]],
+[[3146]],
+[[3147]],
+[[3148]],
+[[3149]],
+[[3150]],
+[[3151]],
+[[3152]],
+[[3153]],
+[[3154]],
+[[3155]],
+[[3156]],
+[[3157]],
+[[3158]],
+[[3159]],
+[[3160]],
+[[3161]],
+[[3162]],
+[[3163]],
+[[3164]],
+[[3165]],
+[[3166]],
+[[3167]],
+[[3168]],
+[[3169]],
+[[3170]],
+[[3171]],
+[[3172]],
+[[3173]],
+[[3174]],
+[[3175]],
+[[3176]],
+[[3177]],
+[[3178]],
+[[3179]],
+[[3180]],
+[[3181]],
+[[3182]],
+[[3183]],
+[[3184]],
+[[3185]],
+[[3186]],
+[[3187]],
+[[3188]],
+[[3189]],
+[[3190]],
+[[3191]],
+[[3192]],
+[[3193]],
+[[3194]],
+[[3195]],
+[[3196]],
+[[3197]],
+[[3198]],
+[[3199]],
+[[3200]],
+[[3201]],
+[[3202]],
+[[3203]],
+[[3204]],
+[[3205]],
+[[3206]],
+[[3207]],
+[[3208]],
+[[3209]],
+[[3210]],
+[[3211]],
+[[3212]],
+[[3213]],
+[[3214]],
+[[3215]],
+[[3216]],
+[[3217]],
+[[3218]],
+[[3219]],
+[[3220]],
+[[3221]],
+[[3222]],
+[[3223]],
+[[3224]],
+[[3225]],
+[[3226]],
+[[3227]],
+[[3228]],
+[[3229]],
+[[3230]],
+[[3231]],
+[[3232]],
+[[3233]],
+[[3234]],
+[[3235]],
+[[3236]],
+[[3237]],
+[[3238]],
+[[3239]],
+[[3240]],
+[[3241]],
+[[3242]],
+[[3243]],
+[[3244]],
+[[3245]],
+[[3246]],
+[[3247]],
+[[3248]],
+[[3249]],
+[[3250]],
+[[3251]],
+[[3252]],
+[[3253]],
+[[3254]],
+[[3255]],
+[[3256]],
+[[3257]],
+[[3258]],
+[[3259]],
+[[3260]],
+[[3261]],
+[[3262]],
+[[3263]],
+[[3264]],
+[[3265]],
+[[3266]],
+[[3267]],
+[[3268]],
+[[3269]],
+[[3270]],
+[[3271]],
+[[3272]],
+[[3273]],
+[[3274]],
+[[3275]],
+[[3276]],
+[[3277]],
+[[3278]],
+[[3279]],
+[[3280]],
+[[3281]],
+[[3282]],
+[[3283]],
+[[3284]],
+[[3285]],
+[[3286]],
+[[3287]],
+[[3288]],
+[[3289]],
+[[3290]],
+[[3291]],
+[[3292]],
+[[3293]],
+[[3294]],
+[[3295]],
+[[3296]],
+[[3297]],
+[[3298]],
+[[3299]],
+[[3300]],
+[[3301]],
+[[3302]],
+[[3303]],
+[[3304]],
+[[3305]],
+[[3306]],
+[[3307]],
+[[3308]],
+[[3309]],
+[[3310]],
+[[3311]],
+[[3312]],
+[[3313]],
+[[3314]],
+[[3315]],
+[[3316]],
+[[3317]],
+[[3318]],
+[[3319]],
+[[3320]],
+[[3321]],
+[[3322]],
+[[3323]],
+[[3324]],
+[[3325]],
+[[3326]],
+[[3327]],
+[[3328]],
+[[3329]],
+[[3330]],
+[[3331]],
+[[3332]],
+[[3333]],
+[[3334]],
+[[3335]],
+[[3336]],
+[[3337]],
+[[3338]],
+[[3339]],
+[[3340]],
+[[3341]],
+[[3342]],
+[[3343]],
+[[3344]],
+[[3345]],
+[[3346]],
+[[3347]],
+[[3348]],
+[[3349]],
+[[3350]],
+[[3351]],
+[[3352]],
+[[3353]],
+[[3354]],
+[[3355]],
+[[3356]],
+[[3357]],
+[[3358]],
+[[3359]],
+[[3360]],
+[[3361]],
+[[3362]],
+[[3363]],
+[[3364]],
+[[3365]],
+[[3366]],
+[[3367]],
+[[3368]],
+[[3369]],
+[[3370]],
+[[3371]],
+[[3372]],
+[[3373]],
+[[3374]],
+[[3375]],
+[[3376]],
+[[3377]],
+[[3378]],
+[[3379]],
+[[3380]],
+[[3381]],
+[[3382]],
+[[3383]],
+[[3384]],
+[[3385]],
+[[3386]],
+[[3387]],
+[[3388]],
+[[3389]],
+[[3390]],
+[[3391]],
+[[3392]],
+[[3393]],
+[[3394]],
+[[3395]],
+[[3396]],
+[[3397]],
+[[3398]],
+[[3399]],
+[[3400]],
+[[3401]],
+[[3402]],
+[[3403]],
+[[3404]],
+[[3405]],
+[[3406]],
+[[3407]],
+[[3408]],
+[[3409]],
+[[3410]],
+[[3411]],
+[[3412]],
+[[3413]],
+[[3414]],
+[[3415]],
+[[3416]],
+[[3417]],
+[[3418]],
+[[3419]],
+[[3420]],
+[[3421]],
+[[3422]],
+[[3423]],
+[[3424]],
+[[3425]],
+[[3426]],
+[[3427]],
+[[3428]],
+[[3429]],
+[[3430]],
+[[3431]],
+[[3432]],
+[[3433]],
+[[3434]],
+[[3435]],
+[[3436]],
+[[3437]],
+[[3438]],
+[[3439]],
+[[3440]],
+[[3441]],
+[[3442]],
+[[3443]],
+[[3444]],
+[[3445]],
+[[3446]],
+[[3447]],
+[[3448]],
+[[3449]],
+[[3450]],
+[[3451]],
+[[3452]],
+[[3453]],
+[[3454]],
+[[3455]],
+[[3456]],
+[[3457]],
+[[3458]],
+[[3459]],
+[[3460]],
+[[3461]],
+[[3462]],
+[[3463]],
+[[3464]],
+[[3465]],
+[[3466]],
+[[3467]],
+[[3468]],
+[[3469]],
+[[3470]],
+[[3471]],
+[[3472]],
+[[3473]],
+[[3474]],
+[[3475]],
+[[3476]],
+[[3477]],
+[[3478]],
+[[3479]],
+[[3480]],
+[[3481]],
+[[3482]],
+[[3483]],
+[[3484]],
+[[3485]],
+[[3486]],
+[[3487]],
+[[3488]],
+[[3489]],
+[[3490]],
+[[3491]],
+[[3492]],
+[[3493]],
+[[3494]],
+[[3495]],
+[[3496]],
+[[3497]],
+[[3498]],
+[[3499]],
+[[3500]],
+[[3501]],
+[[3502]],
+[[3503]],
+[[3504]],
+[[3505]],
+[[3506]],
+[[3507]],
+[[3508]],
+[[3509]],
+[[3510]],
+[[3511]],
+[[3512]],
+[[3513]],
+[[3514]],
+[[3515]],
+[[3516]],
+[[3517]],
+[[3518]],
+[[3519]],
+[[3520]],
+[[3521]],
+[[3522]],
+[[3523]],
+[[3524]],
+[[3525]],
+[[3526]],
+[[3527]],
+[[3528]],
+[[3529]],
+[[3530]],
+[[3531]],
+[[3532]],
+[[3533]],
+[[3534]],
+[[3535]],
+[[3536]],
+[[3537]],
+[[3538]],
+[[3539]],
+[[3540]],
+[[3541]],
+[[3542]],
+[[3543]],
+[[3544]],
+[[3545]],
+[[3546]],
+[[3547]],
+[[3548]],
+[[3549]],
+[[3550]],
+[[3551]],
+[[3552]],
+[[3553]],
+[[3554]],
+[[3555]],
+[[3556]],
+[[3557]],
+[[3558]],
+[[3559]],
+[[3560]],
+[[3561]],
+[[3562]],
+[[3563]],
+[[3564]],
+[[3565]],
+[[3566]],
+[[3567]],
+[[3568]],
+[[3569]],
+[[3570]],
+[[3571]],
+[[3572]],
+[[3573]],
+[[3574]],
+[[3575]],
+[[3576]],
+[[3577]],
+[[3578]],
+[[3579]],
+[[3580]],
+[[3581]],
+[[3582]],
+[[3583]],
+[[3584]],
+[[3585]],
+[[3586]],
+[[3587]],
+[[3588]],
+[[3589]],
+[[3590]],
+[[3591]],
+[[3592]],
+[[3593]],
+[[3594]],
+[[3595]],
+[[3596]],
+[[3597]],
+[[3598]],
+[[3599]],
+[[3600]],
+[[3601]],
+[[3602]],
+[[3603]],
+[[3604]],
+[[3605]],
+[[3606]],
+[[3607]],
+[[3608]],
+[[3609]],
+[[3610]],
+[[3611]],
+[[3612]],
+[[3613]],
+[[3614]],
+[[3615]],
+[[3616]],
+[[3617]],
+[[3618]],
+[[3619]],
+[[3620]],
+[[3621]],
+[[3622]],
+[[3623]],
+[[3624]],
+[[3625]],
+[[3626]],
+[[3627]],
+[[3628]],
+[[3629]],
+[[3630]],
+[[3631]],
+[[3632]],
+[[3633]],
+[[3634]],
+[[3635]],
+[[3636]],
+[[3637]],
+[[3638]],
+[[3639]],
+[[3640]],
+[[3641]],
+[[3642]],
+[[3643]],
+[[3644]],
+[[3645]],
+[[3646]],
+[[3647]],
+[[3648]],
+[[3649]],
+[[3650]],
+[[3651]],
+[[3652]],
+[[3653]],
+[[3654]],
+[[3655]],
+[[3656]],
+[[3657]],
+[[3658]],
+[[3659]],
+[[3660]],
+[[3661]],
+[[3662]],
+[[3663]],
+[[3664]],
+[[3665]],
+[[3666]],
+[[3667]],
+[[3668]],
+[[3669]],
+[[3670]],
+[[3671]],
+[[3672]],
+[[3673]],
+[[3674]],
+[[3675]],
+[[3676]],
+[[3677]],
+[[3678]],
+[[3679]],
+[[3680]],
+[[3681]],
+[[3682]],
+[[3683]],
+[[3684]],
+[[3685]],
+[[3686]],
+[[3687]],
+[[3688]],
+[[3689]],
+[[3690]],
+[[3691]],
+[[3692]],
+[[3693]],
+[[3694]],
+[[3695]],
+[[3696]],
+[[3697]],
+[[3698]],
+[[3699]],
+[[3700]],
+[[3701]],
+[[3702]],
+[[3703]],
+[[3704]],
+[[3705]],
+[[3706]],
+[[3707]],
+[[3708]],
+[[3709]],
+[[3710]],
+[[3711]],
+[[3712]],
+[[3713]],
+[[3714]],
+[[3715]],
+[[3716]],
+[[3717]],
+[[3718]],
+[[3719]],
+[[3720]],
+[[3721]],
+[[3722]],
+[[3723]],
+[[3724]],
+[[3725]],
+[[3726]],
+[[3727]],
+[[3728]],
+[[3729]],
+[[3730]],
+[[3731]],
+[[3732]],
+[[3733]],
+[[3734]],
+[[3735]],
+[[3736]],
+[[3737]],
+[[3738]],
+[[3739]],
+[[3740]],
+[[3741]],
+[[3742]],
+[[3743]],
+[[3744]],
+[[3745]],
+[[3746]],
+[[3747]],
+[[3748]],
+[[3749]],
+[[3750]],
+[[3751]],
+[[3752]],
+[[3753]],
+[[3754]],
+[[3755]],
+[[3756]],
+[[3757]],
+[[3758]],
+[[3759]],
+[[3760]],
+[[3761]],
+[[3762]],
+[[3763]],
+[[3764]],
+[[3765]],
+[[3766]],
+[[3767]],
+[[3768]],
+[[3769]],
+[[3770]],
+[[3771]],
+[[3772]],
+[[3773]],
+[[3774]],
+[[3775]],
+[[3776]],
+[[3777]],
+[[3778]],
+[[3779]],
+[[3780]],
+[[3781]],
+[[3782]],
+[[3783]],
+[[3784]],
+[[3785]],
+[[3786]],
+[[3787]],
+[[3788]],
+[[3789]],
+[[3790]],
+[[3791]],
+[[3792]],
+[[3793]],
+[[3794]],
+[[3795]],
+[[3796]],
+[[3797]],
+[[3798]],
+[[3799]],
+[[3800]],
+[[3801]],
+[[3802]],
+[[3803]],
+[[3804]],
+[[3805]],
+[[3806]],
+[[3807]],
+[[3808]],
+[[3809]],
+[[3810]],
+[[3811]],
+[[3812]],
+[[3813]],
+[[3814]],
+[[3815]],
+[[3816]],
+[[3817]],
+[[3818]],
+[[3819]],
+[[3820]],
+[[3821]],
+[[3822]],
+[[3823]],
+[[3824]],
+[[3825]],
+[[3826]],
+[[3827]],
+[[3828]],
+[[3829]],
+[[3830]],
+[[3831]],
+[[3832]],
+[[3833]],
+[[3834]],
+[[3835]],
+[[3836]],
+[[3837]],
+[[3838]],
+[[3839]],
+[[3840]],
+[[3841]],
+[[3842]],
+[[3843]],
+[[3844]],
+[[3845]],
+[[3846]],
+[[3847]],
+[[3848]],
+[[3849]],
+[[3850]],
+[[3851]],
+[[3852]],
+[[3853]],
+[[3854]],
+[[3855]],
+[[3856]],
+[[3857]],
+[[3858]],
+[[3859]],
+[[3860]],
+[[3861]],
+[[3862]],
+[[3863]],
+[[3864]],
+[[3865]],
+[[3866]],
+[[3867]],
+[[3868]],
+[[3869]],
+[[3870]],
+[[3871]],
+[[3872]],
+[[3873]],
+[[3874]],
+[[3875]],
+[[3876]],
+[[3877]],
+[[3878]],
+[[3879]],
+[[3880]],
+[[3881]],
+[[3882]],
+[[3883]],
+[[3884]],
+[[3885]],
+[[3886]],
+[[3887]],
+[[3888]],
+[[3889]],
+[[3890]],
+[[3891]],
+[[3892]],
+[[3893]],
+[[3894]],
+[[3895]],
+[[3896]],
+[[3897]],
+[[3898]],
+[[3899]],
+[[3900]],
+[[3901]],
+[[3902]],
+[[3903]],
+[[3904]],
+[[3905]],
+[[3906]],
+[[3907]],
+[[3908]],
+[[3909]],
+[[3910]],
+[[3911]],
+[[3912]],
+[[3913]],
+[[3914]],
+[[3915]],
+[[3916]],
+[[3917]],
+[[3918]],
+[[3919]],
+[[3920]],
+[[3921]],
+[[3922]],
+[[3923]],
+[[3924]],
+[[3925]],
+[[3926]],
+[[3927]],
+[[3928]],
+[[3929]],
+[[3930]],
+[[3931]],
+[[3932]],
+[[3933]],
+[[3934]],
+[[3935]],
+[[3936]],
+[[3937]],
+[[3938]],
+[[3939]],
+[[3940]],
+[[3941]],
+[[3942]],
+[[3943]],
+[[3944]],
+[[3945]],
+[[3946]],
+[[3947]],
+[[3948]],
+[[3949]],
+[[3950]],
+[[3951]],
+[[3952]],
+[[3953]],
+[[3954]],
+[[3955]],
+[[3956]],
+[[3957]],
+[[3958]],
+[[3959]],
+[[3960]],
+[[3961]],
+[[3962]],
+[[3963]],
+[[3964]],
+[[3965]],
+[[3966]],
+[[3967]],
+[[3968]],
+[[3969]],
+[[3970]],
+[[3971]],
+[[3972]],
+[[3973]],
+[[3974]],
+[[3975]],
+[[3976]],
+[[3977]],
+[[3978]],
+[[3979]],
+[[3980]],
+[[3981]],
+[[3982]],
+[[3983]],
+[[3984]],
+[[3985]],
+[[3986]],
+[[3987]],
+[[3988]],
+[[3989]],
+[[3990]],
+[[3991]],
+[[3992]],
+[[3993]],
+[[3994]],
+[[3995]],
+[[3996]],
+[[3997]],
+[[3998]],
+[[3999]],
+[[4000]],
+[[4001]],
+[[4002]],
+[[4003]],
+[[4004]],
+[[4005]],
+[[4006]],
+[[4007]],
+[[4008]],
+[[4009]],
+[[4010]],
+[[4011]],
+[[4012]],
+[[4013]],
+[[4014]],
+[[4015]],
+[[4016]],
+[[4017]],
+[[4018]],
+[[4019]],
+[[4020]],
+[[4021]],
+[[4022]],
+[[4023]],
+[[4024]],
+[[4025]],
+[[4026]],
+[[4027]],
+[[4028]],
+[[4029]],
+[[4030]],
+[[4031]],
+[[4032]],
+[[4033]],
+[[4034]],
+[[4035]],
+[[4036]],
+[[4037]],
+[[4038]],
+[[4039]],
+[[4040]],
+[[4041]],
+[[4042]],
+[[4043]],
+[[4044]],
+[[4045]],
+[[4046]],
+[[4047]],
+[[4048]],
+[[4049]],
+[[4050]],
+[[4051]],
+[[4052]],
+[[4053]],
+[[4054]],
+[[4055]],
+[[4056]],
+[[4057]],
+[[4058]],
+[[4059]],
+[[4060]],
+[[4061]],
+[[4062]],
+[[4063]],
+[[4064]],
+[[4065]],
+[[4066]],
+[[4067]],
+[[4068]],
+[[4069]],
+[[4070]],
+[[4071]],
+[[4072]],
+[[4073]],
+[[4074]],
+[[4075]],
+[[4076]],
+[[4077]],
+[[4078]],
+[[4079]],
+[[4080]],
+[[4081]],
+[[4082]],
+[[4083]],
+[[4084]],
+[[4085]],
+[[4086]],
+[[4087]],
+[[4088]],
+[[4089]],
+[[4090]],
+[[4091]],
+[[4092]],
+[[4093]],
+[[4094]],
+[[4095]],
+[[4096]],
+[[4097]],
+[[4098]],
+[[4099]],
+[[4100]],
+[[4101]],
+[[4102]],
+[[4103]],
+[[4104]],
+[[4105]],
+[[4106]],
+[[4107]],
+[[4108]],
+[[4109]],
+[[4110]],
+[[4111]],
+[[4112]],
+[[4113]],
+[[4114]],
+[[4115]],
+[[4116]],
+[[4117]],
+[[4118]],
+[[4119]],
+[[4120]],
+[[4121]],
+[[4122]],
+[[4123]],
+[[4124]],
+[[4125]],
+[[4126]],
+[[4127]],
+[[4128]],
+[[4129]],
+[[4130]],
+[[4131]],
+[[4132]],
+[[4133]],
+[[4134]],
+[[4135]],
+[[4136]],
+[[4137]],
+[[4138]],
+[[4139]],
+[[4140]],
+[[4141]],
+[[4142]],
+[[4143]],
+[[4144]],
+[[4145]],
+[[4146]],
+[[4147]],
+[[4148]],
+[[4149]],
+[[4150]],
+[[4151]],
+[[4152]],
+[[4153]],
+[[4154]],
+[[4155]],
+[[4156]],
+[[4157]],
+[[4158]],
+[[4159]],
+[[4160]],
+[[4161]],
+[[4162]],
+[[4163]],
+[[4164]],
+[[4165]],
+[[4166]],
+[[4167]],
+[[4168]],
+[[4169]],
+[[4170]],
+[[4171]],
+[[4172]],
+[[4173]],
+[[4174]],
+[[4175]],
+[[4176]],
+[[4177]],
+[[4178]],
+[[4179]],
+[[4180]],
+[[4181]],
+[[4182]],
+[[4183]],
+[[4184]],
+[[4185]],
+[[4186]],
+[[4187]],
+[[4188]],
+[[4189]],
+[[4190]],
+[[4191]],
+[[4192]],
+[[4193]],
+[[4194]],
+[[4195]],
+[[4196]],
+[[4197]],
+[[4198]],
+[[4199]],
+[[4200]],
+[[4201]],
+[[4202]],
+[[4203]],
+[[4204]],
+[[4205]],
+[[4206]],
+[[4207]],
+[[4208]],
+[[4209]],
+[[4210]],
+[[4211]],
+[[4212]],
+[[4213]],
+[[4214]],
+[[4215]],
+[[4216]],
+[[4217]],
+[[4218]],
+[[4219]],
+[[4220]],
+[[4221]],
+[[4222]],
+[[4223]],
+[[4224]],
+[[4225]],
+[[4226]],
+[[4227]],
+[[4228]],
+[[4229]],
+[[4230]],
+[[4231]],
+[[4232]],
+[[4233]],
+[[4234]],
+[[4235]],
+[[4236]],
+[[4237]],
+[[4238]],
+[[4239]],
+[[4240]],
+[[4241]],
+[[4242]],
+[[4243]],
+[[4244]],
+[[4245]],
+[[4246]],
+[[4247]],
+[[4248]],
+[[4249]],
+[[4250]],
+[[4251]],
+[[4252]],
+[[4253]],
+[[4254]],
+[[4255]],
+[[4256]],
+[[4257]],
+[[4258]],
+[[4259]],
+[[4260]],
+[[4261]],
+[[4262]],
+[[4263]],
+[[4264]],
+[[4265]],
+[[4266]],
+[[4267]],
+[[4268]],
+[[4269]],
+[[4270]],
+[[4271]],
+[[4272]],
+[[4273]],
+[[4274]],
+[[4275]],
+[[4276]],
+[[4277]],
+[[4278]],
+[[4279]],
+[[4280]],
+[[4281]],
+[[4282]],
+[[4283]],
+[[4284]],
+[[4285]],
+[[4286]],
+[[4287]],
+[[4288]],
+[[4289]],
+[[4290]],
+[[4291]],
+[[4292]],
+[[4293]],
+[[4294]],
+[[4295]],
+[[4296]],
+[[4297]],
+[[4298]],
+[[4299]],
+[[4300]],
+[[4301]],
+[[4302]],
+[[4303]],
+[[4304]],
+[[4305]],
+[[4306]],
+[[4307]],
+[[4308]],
+[[4309]],
+[[4310]],
+[[4311]],
+[[4312]],
+[[4313]],
+[[4314]],
+[[4315]],
+[[4316]],
+[[4317]],
+[[4318]],
+[[4319]],
+[[4320]],
+[[4321]],
+[[4322]],
+[[4323]],
+[[4324]],
+[[4325]],
+[[4326]],
+[[4327]],
+[[4328]],
+[[4329]],
+[[4330]],
+[[4331]],
+[[4332]],
+[[4333]],
+[[4334]],
+[[4335]],
+[[4336]],
+[[4337]],
+[[4338]],
+[[4339]],
+[[4340]],
+[[4341]],
+[[4342]],
+[[4343]],
+[[4344]],
+[[4345]],
+[[4346]],
+[[4347]],
+[[4348]],
+[[4349]],
+[[4350]],
+[[4351]],
+[[4352]],
+[[4353]],
+[[4354]],
+[[4355]],
+[[4356]],
+[[4357]],
+[[4358]],
+[[4359]],
+[[4360]],
+[[4361]],
+[[4362]],
+[[4363]],
+[[4364]],
+[[4365]],
+[[4366]],
+[[4367]],
+[[4368]],
+[[4369]],
+[[4370]],
+[[4371]],
+[[4372]],
+[[4373]],
+[[4374]],
+[[4375]],
+[[4376]],
+[[4377]],
+[[4378]],
+[[4379]],
+[[4380]],
+[[4381]],
+[[4382]],
+[[4383]],
+[[4384]],
+[[4385]],
+[[4386]],
+[[4387]],
+[[4388]],
+[[4389]],
+[[4390]],
+[[4391]],
+[[4392]],
+[[4393]],
+[[4394]],
+[[4395]],
+[[4396]],
+[[4397]],
+[[4398]],
+[[4399]],
+[[4400]],
+[[4401]],
+[[4402]],
+[[4403]],
+[[4404]],
+[[4405]],
+[[4406]],
+[[4407]],
+[[4408]],
+[[4409]],
+[[4410]],
+[[4411]],
+[[4412]],
+[[4413]],
+[[4414]],
+[[4415]],
+[[4416]],
+[[4417]],
+[[4418]],
+[[4419]],
+[[4420]],
+[[4421]],
+[[4422]],
+[[4423]],
+[[4424]],
+[[4425]],
+[[4426]],
+[[4427]],
+[[4428]],
+[[4429]],
+[[4430]],
+[[4431]],
+[[4432]],
+[[4433]],
+[[4434]],
+[[4435]],
+[[4436]],
+[[4437]],
+[[4438]],
+[[4439]],
+[[4440]],
+[[4441]],
+[[4442]],
+[[4443]],
+[[4444]],
+[[4445]],
+[[4446]],
+[[4447]],
+[[4448]],
+[[4449]],
+[[4450]],
+[[4451]],
+[[4452]],
+[[4453]],
+[[4454]],
+[[4455]],
+[[4456]],
+[[4457]],
+[[4458]],
+[[4459]],
+[[4460]],
+[[4461]],
+[[4462]],
+[[4463]],
+[[4464]],
+[[4465]],
+[[4466]],
+[[4467]],
+[[4468]],
+[[4469]],
+[[4470]],
+[[4471]],
+[[4472]],
+[[4473]],
+[[4474]],
+[[4475]],
+[[4476]],
+[[4477]],
+[[4478]],
+[[4479]],
+[[4480]],
+[[4481]],
+[[4482]],
+[[4483]],
+[[4484]],
+[[4485]],
+[[4486]],
+[[4487]],
+[[4488]],
+[[4489]],
+[[4490]],
+[[4491]],
+[[4492]],
+[[4493]],
+[[4494]],
+[[4495]],
+[[4496]],
+[[4497]],
+[[4498]],
+[[4499]],
+[[4500]],
+[[4501]],
+[[4502]],
+[[4503]],
+[[4504]],
+[[4505]],
+[[4506]],
+[[4507]],
+[[4508]],
+[[4509]],
+[[4510]],
+[[4511]],
+[[4512]],
+[[4513]],
+[[4514]],
+[[4515]],
+[[4516]],
+[[4517]],
+[[4518]],
+[[4519]],
+[[4520]],
+[[4521]],
+[[4522]],
+[[4523]],
+[[4524]],
+[[4525]],
+[[4526]],
+[[4527]],
+[[4528]],
+[[4529]],
+[[4530]],
+[[4531]],
+[[4532]],
+[[4533]],
+[[4534]],
+[[4535]],
+[[4536]],
+[[4537]],
+[[4538]],
+[[4539]],
+[[4540]],
+[[4541]],
+[[4542]],
+[[4543]],
+[[4544]],
+[[4545]],
+[[4546]],
+[[4547]],
+[[4548]],
+[[4549]],
+[[4550]],
+[[4551]],
+[[4552]],
+[[4553]],
+[[4554]],
+[[4555]],
+[[4556]],
+[[4557]],
+[[4558]],
+[[4559]],
+[[4560]],
+[[4561]],
+[[4562]],
+[[4563]],
+[[4564]],
+[[4565]],
+[[4566]],
+[[4567]],
+[[4568]],
+[[4569]],
+[[4570]],
+[[4571]],
+[[4572]],
+[[4573]],
+[[4574]],
+[[4575]],
+[[4576]],
+[[4577]],
+[[4578]],
+[[4579]],
+[[4580]],
+[[4581]],
+[[4582]],
+[[4583]],
+[[4584]],
+[[4585]],
+[[4586]],
+[[4587]],
+[[4588]],
+[[4589]],
+[[4590]],
+[[4591]],
+[[4592]],
+[[4593]],
+[[4594]],
+[[4595]],
+[[4596]],
+[[4597]],
+[[4598]],
+[[4599]],
+[[4600]],
+[[4601]],
+[[4602]],
+[[4603]],
+[[4604]],
+[[4605]],
+[[4606]],
+[[4607]],
+[[4608]],
+[[4609]],
+[[4610]],
+[[4611]],
+[[4612]],
+[[4613]],
+[[4614]],
+[[4615]],
+[[4616]],
+[[4617]],
+[[4618]],
+[[4619]],
+[[4620]],
+[[4621]],
+[[4622]],
+[[4623]],
+[[4624]],
+[[4625]],
+[[4626]],
+[[4627]],
+[[4628]],
+[[4629]],
+[[4630]],
+[[4631]],
+[[4632]],
+[[4633]],
+[[4634]],
+[[4635]],
+[[4636]],
+[[4637]],
+[[4638]],
+[[4639]],
+[[4640]],
+[[4641]],
+[[4642]],
+[[4643]],
+[[4644]],
+[[4645]],
+[[4646]],
+[[4647]],
+[[4648]],
+[[4649]],
+[[4650]],
+[[4651]],
+[[4652]],
+[[4653]],
+[[4654]],
+[[4655]],
+[[4656]],
+[[4657]],
+[[4658]],
+[[4659]],
+[[4660]],
+[[4661]],
+[[4662]],
+[[4663]],
+[[4664]],
+[[4665]],
+[[4666]],
+[[4667]],
+[[4668]],
+[[4669]],
+[[4670]],
+[[4671]],
+[[4672]],
+[[4673]],
+[[4674]],
+[[4675]],
+[[4676]],
+[[4677]],
+[[4678]],
+[[4679]],
+[[4680]],
+[[4681]],
+[[4682]],
+[[4683]],
+[[4684]],
+[[4685]],
+[[4686]],
+[[4687]],
+[[4688]],
+[[4689]],
+[[4690]],
+[[4691]],
+[[4692]],
+[[4693]],
+[[4694]],
+[[4695]],
+[[4696]],
+[[4697]],
+[[4698]],
+[[4699]],
+[[4700]],
+[[4701]],
+[[4702]],
+[[4703]],
+[[4704]],
+[[4705]],
+[[4706]],
+[[4707]],
+[[4708]],
+[[4709]],
+[[4710]],
+[[4711]],
+[[4712]],
+[[4713]],
+[[4714]],
+[[4715]],
+[[4716]],
+[[4717]],
+[[4718]],
+[[4719]],
+[[4720]],
+[[4721]],
+[[4722]],
+[[4723]],
+[[4724]],
+[[4725]],
+[[4726]],
+[[4727]],
+[[4728]],
+[[4729]],
+[[4730]],
+[[4731]],
+[[4732]],
+[[4733]],
+[[4734]],
+[[4735]],
+[[4736]],
+[[4737]],
+[[4738]],
+[[4739]],
+[[4740]],
+[[4741]],
+[[4742]],
+[[4743]],
+[[4744]],
+[[4745]],
+[[4746]],
+[[4747]],
+[[4748]],
+[[4749]],
+[[4750]],
+[[4751]],
+[[4752]],
+[[4753]],
+[[4754]],
+[[4755]],
+[[4756]],
+[[4757]],
+[[4758]],
+[[4759]],
+[[4760]],
+[[4761]],
+[[4762]],
+[[4763]],
+[[4764]],
+[[4765]],
+[[4766]],
+[[4767]],
+[[4768]],
+[[4769]],
+[[4770]],
+[[4771]],
+[[4772]],
+[[4773]],
+[[4774]],
+[[4775]],
+[[4776]],
+[[4777]],
+[[4778]],
+[[4779]],
+[[4780]],
+[[4781]],
+[[4782]],
+[[4783]],
+[[4784]],
+[[4785]],
+[[4786]],
+[[4787]],
+[[4788]],
+[[4789]],
+[[4790]],
+[[4791]],
+[[4792]],
+[[4793]],
+[[4794]],
+[[4795]],
+[[4796]],
+[[4797]],
+[[4798]],
+[[4799]],
+[[4800]],
+[[4801]],
+[[4802]],
+[[4803]],
+[[4804]],
+[[4805]],
+[[4806]],
+[[4807]],
+[[4808]],
+[[4809]],
+[[4810]],
+[[4811]],
+[[4812]],
+[[4813]],
+[[4814]],
+[[4815]],
+[[4816]],
+[[4817]],
+[[4818]],
+[[4819]],
+[[4820]],
+[[4821]],
+[[4822]],
+[[4823]],
+[[4824]],
+[[4825]],
+[[4826]],
+[[4827]],
+[[4828]],
+[[4829]],
+[[4830]],
+[[4831]],
+[[4832]],
+[[4833]],
+[[4834]],
+[[4835]],
+[[4836]],
+[[4837]],
+[[4838]],
+[[4839]],
+[[4840]],
+[[4841]],
+[[4842]],
+[[4843]],
+[[4844]],
+[[4845]],
+[[4846]],
+[[4847]],
+[[4848]],
+[[4849]],
+[[4850]],
+[[4851]],
+[[4852]],
+[[4853]],
+[[4854]],
+[[4855]],
+[[4856]],
+[[4857]],
+[[4858]],
+[[4859]],
+[[4860]],
+[[4861]],
+[[4862]],
+[[4863]],
+[[4864]],
+[[4865]],
+[[4866]],
+[[4867]],
+[[4868]],
+[[4869]],
+[[4870]],
+[[4871]],
+[[4872]],
+[[4873]],
+[[4874]],
+[[4875]],
+[[4876]],
+[[4877]],
+[[4878]],
+[[4879]],
+[[4880]],
+[[4881]],
+[[4882]],
+[[4883]],
+[[4884]],
+[[4885]],
+[[4886]],
+[[4887]],
+[[4888]],
+[[4889]],
+[[4890]],
+[[4891]],
+[[4892]],
+[[4893]],
+[[4894]],
+[[4895]],
+[[4896]],
+[[4897]],
+[[4898]],
+[[4899]],
+[[4900]],
+[[4901]],
+[[4902]],
+[[4903]],
+[[4904]],
+[[4905]],
+[[4906]],
+[[4907]],
+[[4908]],
+[[4909]],
+[[4910]],
+[[4911]],
+[[4912]],
+[[4913]],
+[[4914]],
+[[4915]],
+[[4916]],
+[[4917]],
+[[4918]],
+[[4919]],
+[[4920]],
+[[4921]],
+[[4922]],
+[[4923]],
+[[4924]],
+[[4925]],
+[[4926]],
+[[4927]],
+[[4928]],
+[[4929]],
+[[4930]],
+[[4931]],
+[[4932]],
+[[4933]],
+[[4934]],
+[[4935]],
+[[4936]],
+[[4937]],
+[[4938]],
+[[4939]],
+[[4940]],
+[[4941]],
+[[4942]],
+[[4943]],
+[[4944]],
+[[4945]],
+[[4946]],
+[[4947]],
+[[4948]],
+[[4949]],
+[[4950]],
+[[4951]],
+[[4952]],
+[[4953]],
+[[4954]],
+[[4955]],
+[[4956]],
+[[4957]],
+[[4958]],
+[[4959]],
+[[4960]],
+[[4961]],
+[[4962]],
+[[4963]],
+[[4964]],
+[[4965]],
+[[4966]],
+[[4967]],
+[[4968]],
+[[4969]],
+[[4970]],
+[[4971]],
+[[4972]],
+[[4973]],
+[[4974]],
+[[4975]],
+[[4976]],
+[[4977]],
+[[4978]],
+[[4979]],
+[[4980]],
+[[4981]],
+[[4982]],
+[[4983]],
+[[4984]],
+[[4985]],
+[[4986]],
+[[4987]],
+[[4988]],
+[[4989]],
+[[4990]],
+[[4991]],
+[[4992]],
+[[4993]],
+[[4994]],
+[[4995]],
+[[4996]],
+[[4997]],
+[[4998]],
+[[4999]],
+[[5000]],
+[[5001]],
+[[5002]],
+[[5003]],
+[[5004]],
+[[5005]],
+[[5006]],
+[[5007]],
+[[5008]],
+[[5009]],
+[[5010]],
+[[5011]],
+[[5012]],
+[[5013]],
+[[5014]],
+[[5015]],
+[[5016]],
+[[5017]],
+[[5018]],
+[[5019]],
+[[5020]],
+[[5021]],
+[[5022]],
+[[5023]],
+[[5024]],
+[[5025]],
+[[5026]],
+[[5027]],
+[[5028]],
+[[5029]],
+[[5030]],
+[[5031]],
+[[5032]],
+[[5033]],
+[[5034]],
+[[5035]],
+[[5036]],
+[[5037]],
+[[5038]],
+[[5039]],
+[[5040]],
+[[5041]],
+[[5042]],
+[[5043]],
+[[5044]],
+[[5045]],
+[[5046]],
+[[5047]],
+[[5048]],
+[[5049]],
+[[5050]],
+[[5051]],
+[[5052]],
+[[5053]],
+[[5054]],
+[[5055]],
+[[5056]],
+[[5057]],
+[[5058]],
+[[5059]],
+[[5060]],
+[[5061]],
+[[5062]],
+[[5063]],
+[[5064]],
+[[5065]],
+[[5066]],
+[[5067]],
+[[5068]],
+[[5069]],
+[[5070]],
+[[5071]],
+[[5072]],
+[[5073]],
+[[5074]],
+[[5075]],
+[[5076]],
+[[5077]],
+[[5078]],
+[[5079]],
+[[5080]],
+[[5081]],
+[[5082]],
+[[5083]],
+[[5084]],
+[[5085]],
+[[5086]],
+[[5087]],
+[[5088]],
+[[5089]],
+[[5090]],
+[[5091]],
+[[5092]],
+[[5093]],
+[[5094]],
+[[5095]],
+[[5096]],
+[[5097]],
+[[5098]],
+[[5099]],
+[[5100]],
+[[5101]],
+[[5102]],
+[[5103]],
+[[5104]],
+[[5105]],
+[[5106]],
+[[5107]],
+[[5108]],
+[[5109]],
+[[5110]],
+[[5111]],
+[[5112]],
+[[5113]],
+[[5114]],
+[[5115]],
+[[5116]],
+[[5117]],
+[[5118]],
+[[5119]],
+[[5120]],
+[[5121]],
+[[5122]],
+[[5123]],
+[[5124]],
+[[5125]],
+[[5126]],
+[[5127]],
+[[5128]],
+[[5129]],
+[[5130]],
+[[5131]],
+[[5132]],
+[[5133]],
+[[5134]],
+[[5135]],
+[[5136]],
+[[5137]],
+[[5138]],
+[[5139]],
+[[5140]],
+[[5141]],
+[[5142]],
+[[5143]],
+[[5144]],
+[[5145]],
+[[5146]],
+[[5147]],
+[[5148]],
+[[5149]],
+[[5150]],
+[[5151]],
+[[5152]],
+[[5153]],
+[[5154]],
+[[5155]],
+[[5156]],
+[[5157]],
+[[5158]],
+[[5159]],
+[[5160]],
+[[5161]],
+[[5162]],
+[[5163]],
+[[5164]],
+[[5165]],
+[[5166]],
+[[5167]],
+[[5168]],
+[[5169]],
+[[5170]],
+[[5171]],
+[[5172]],
+[[5173]],
+[[5174]],
+[[5175]],
+[[5176]],
+[[5177]],
+[[5178]],
+[[5179]],
+[[5180]],
+[[5181]],
+[[5182]],
+[[5183]],
+[[5184]],
+[[5185]],
+[[5186]],
+[[5187]],
+[[5188]],
+[[5189]],
+[[5190]],
+[[5191]],
+[[5192]],
+[[5193]],
+[[5194]],
+[[5195]],
+[[5196]],
+[[5197]],
+[[5198]],
+[[5199]],
+[[5200]],
+[[5201]],
+[[5202]],
+[[5203]],
+[[5204]],
+[[5205]],
+[[5206]],
+[[5207]],
+[[5208]],
+[[5209]],
+[[5210]],
+[[5211]],
+[[5212]],
+[[5213]],
+[[5214]],
+[[5215]],
+[[5216]],
+[[5217]],
+[[5218]],
+[[5219]],
+[[5220]],
+[[5221]],
+[[5222]],
+[[5223]],
+[[5224]],
+[[5225]],
+[[5226]],
+[[5227]],
+[[5228]],
+[[5229]],
+[[5230]],
+[[5231]],
+[[5232]],
+[[5233]],
+[[5234]],
+[[5235]],
+[[5236]],
+[[5237]],
+[[5238]],
+[[5239]],
+[[5240]],
+[[5241]],
+[[5242]],
+[[5243]],
+[[5244]],
+[[5245]],
+[[5246]],
+[[5247]],
+[[5248]],
+[[5249]],
+[[5250]],
+[[5251]],
+[[5252]],
+[[5253]],
+[[5254]],
+[[5255]],
+[[5256]],
+[[5257]],
+[[5258]],
+[[5259]],
+[[5260]],
+[[5261]],
+[[5262]],
+[[5263]],
+[[5264]],
+[[5265]],
+[[5266]],
+[[5267]],
+[[5268]],
+[[5269]],
+[[5270]],
+[[5271]],
+[[5272]],
+[[5273]],
+[[5274]],
+[[5275]],
+[[5276]],
+[[5277]],
+[[5278]],
+[[5279]],
+[[5280]],
+[[5281]],
+[[5282]],
+[[5283]],
+[[5284]],
+[[5285]],
+[[5286]],
+[[5287]],
+[[5288]],
+[[5289]],
+[[5290]],
+[[5291]],
+[[5292]],
+[[5293]],
+[[5294]],
+[[5295]],
+[[5296]],
+[[5297]],
+[[5298]],
+[[5299]],
+[[5300]],
+[[5301]],
+[[5302]],
+[[5303]],
+[[5304]],
+[[5305]],
+[[5306]],
+[[5307]],
+[[5308]],
+[[5309]],
+[[5310]],
+[[5311]],
+[[5312]],
+[[5313]],
+[[5314]],
+[[5315]],
+[[5316]],
+[[5317]],
+[[5318]],
+[[5319]],
+[[5320]],
+[[5321]],
+[[5322]],
+[[5323]],
+[[5324]],
+[[5325]],
+[[5326]],
+[[5327]],
+[[5328]],
+[[5329]],
+[[5330]],
+[[5331]],
+[[5332]],
+[[5333]],
+[[5334]],
+[[5335]],
+[[5336]],
+[[5337]],
+[[5338]],
+[[5339]],
+[[5340]],
+[[5341]],
+[[5342]],
+[[5343]],
+[[5344]],
+[[5345]],
+[[5346]],
+[[5347]],
+[[5348]],
+[[5349]],
+[[5350]],
+[[5351]],
+[[5352]],
+[[5353]],
+[[5354]],
+[[5355]],
+[[5356]],
+[[5357]],
+[[5358]],
+[[5359]],
+[[5360]],
+[[5361]],
+[[5362]],
+[[5363]],
+[[5364]],
+[[5365]],
+[[5366]],
+[[5367]],
+[[5368]],
+[[5369]],
+[[5370]],
+[[5371]],
+[[5372]],
+[[5373]],
+[[5374]],
+[[5375]],
+[[5376]],
+[[5377]],
+[[5378]],
+[[5379]],
+[[5380]],
+[[5381]],
+[[5382]],
+[[5383]],
+[[5384]],
+[[5385]],
+[[5386]],
+[[5387]],
+[[5388]],
+[[5389]],
+[[5390]],
+[[5391]],
+[[5392]],
+[[5393]],
+[[5394]],
+[[5395]],
+[[5396]],
+[[5397]],
+[[5398]],
+[[5399]],
+[[5400]],
+[[5401]],
+[[5402]],
+[[5403]],
+[[5404]],
+[[5405]],
+[[5406]],
+[[5407]],
+[[5408]],
+[[5409]],
+[[5410]],
+[[5411]],
+[[5412]],
+[[5413]],
+[[5414]],
+[[5415]],
+[[5416]],
+[[5417]],
+[[5418]],
+[[5419]],
+[[5420]],
+[[5421]],
+[[5422]],
+[[5423]],
+[[5424]],
+[[5425]],
+[[5426]],
+[[5427]],
+[[5428]],
+[[5429]],
+[[5430]],
+[[5431]],
+[[5432]],
+[[5433]],
+[[5434]],
+[[5435]],
+[[5436]],
+[[5437]],
+[[5438]],
+[[5439]],
+[[5440]],
+[[5441]],
+[[5442]],
+[[5443]],
+[[5444]],
+[[5445]],
+[[5446]],
+[[5447]],
+[[5448]],
+[[5449]],
+[[5450]],
+[[5451]],
+[[5452]],
+[[5453]],
+[[5454]],
+[[5455]],
+[[5456]],
+[[5457]],
+[[5458]],
+[[5459]],
+[[5460]],
+[[5461]],
+[[5462]],
+[[5463]],
+[[5464]],
+[[5465]],
+[[5466]],
+[[5467]],
+[[5468]],
+[[5469]],
+[[5470]],
+[[5471]],
+[[5472]],
+[[5473]],
+[[5474]],
+[[5475]],
+[[5476]],
+[[5477]],
+[[5478]],
+[[5479]],
+[[5480]],
+[[5481]],
+[[5482]],
+[[5483]],
+[[5484]],
+[[5485]],
+[[5486]],
+[[5487]],
+[[5488]],
+[[5489]],
+[[5490]],
+[[5491]],
+[[5492]],
+[[5493]],
+[[5494]],
+[[5495]],
+[[5496]],
+[[5497]],
+[[5498]],
+[[5499]],
+[[5500]],
+[[5501]],
+[[5502]],
+[[5503]],
+[[5504]],
+[[5505]],
+[[5506]],
+[[5507]],
+[[5508]],
+[[5509]],
+[[5510]],
+[[5511]],
+[[5512]],
+[[5513]],
+[[5514]],
+[[5515]],
+[[5516]],
+[[5517]],
+[[5518]],
+[[5519]],
+[[5520]],
+[[5521]],
+[[5522]],
+[[5523]],
+[[5524]],
+[[5525]],
+[[5526]],
+[[5527]],
+[[5528]],
+[[5529]],
+[[5530]],
+[[5531]],
+[[5532]],
+[[5533]],
+[[5534]],
+[[5535]],
+[[5536]],
+[[5537]],
+[[5538]],
+[[5539]],
+[[5540]],
+[[5541]],
+[[5542]],
+[[5543]],
+[[5544]],
+[[5545]],
+[[5546]],
+[[5547]],
+[[5548]],
+[[5549]],
+[[5550]],
+[[5551]],
+[[5552]],
+[[5553]],
+[[5554]],
+[[5555]],
+[[5556]],
+[[5557]],
+[[5558]],
+[[5559]],
+[[5560]],
+[[5561]],
+[[5562]],
+[[5563]],
+[[5564]],
+[[5565]],
+[[5566]],
+[[5567]],
+[[5568]],
+[[5569]],
+[[5570]],
+[[5571]],
+[[5572]],
+[[5573]],
+[[5574]],
+[[5575]],
+[[5576]],
+[[5577]],
+[[5578]],
+[[5579]],
+[[5580]],
+[[5581]],
+[[5582]],
+[[5583]],
+[[5584]],
+[[5585]],
+[[5586]],
+[[5587]],
+[[5588]],
+[[5589]],
+[[5590]],
+[[5591]],
+[[5592]],
+[[5593]],
+[[5594]],
+[[5595]],
+[[5596]],
+[[5597]],
+[[5598]],
+[[5599]],
+[[5600]],
+[[5601]],
+[[5602]],
+[[5603]],
+[[5604]],
+[[5605]],
+[[5606]],
+[[5607]],
+[[5608]],
+[[5609]],
+[[5610]],
+[[5611]],
+[[5612]],
+[[5613]],
+[[5614]],
+[[5615]],
+[[5616]],
+[[5617]],
+[[5618]],
+[[5619]],
+[[5620]],
+[[5621]],
+[[5622]],
+[[5623]],
+[[5624]],
+[[5625]],
+[[5626]],
+[[5627]],
+[[5628]],
+[[5629]],
+[[5630]],
+[[5631]],
+[[5632]],
+[[5633]],
+[[5634]],
+[[5635]],
+[[5636]],
+[[5637]],
+[[5638]],
+[[5639]],
+[[5640]],
+[[5641]],
+[[5642]],
+[[5643]],
+[[5644]],
+[[5645]],
+[[5646]],
+[[5647]],
+[[5648]],
+[[5649]],
+[[5650]],
+[[5651]],
+[[5652]],
+[[5653]],
+[[5654]],
+[[5655]],
+[[5656]],
+[[5657]],
+[[5658]],
+[[5659]],
+[[5660]],
+[[5661]],
+[[5662]],
+[[5663]],
+[[5664]],
+[[5665]],
+[[5666]],
+[[5667]],
+[[5668]],
+[[5669]],
+[[5670]],
+[[5671]],
+[[5672]],
+[[5673]],
+[[5674]],
+[[5675]],
+[[5676]],
+[[5677]],
+[[5678]],
+[[5679]],
+[[5680]],
+[[5681]],
+[[5682]],
+[[5683]],
+[[5684]],
+[[5685]],
+[[5686]],
+[[5687]],
+[[5688]],
+[[5689]],
+[[5690]],
+[[5691]],
+[[5692]],
+[[5693]],
+[[5694]],
+[[5695]],
+[[5696]],
+[[5697]],
+[[5698]],
+[[5699]],
+[[5700]],
+[[5701]],
+[[5702]],
+[[5703]],
+[[5704]],
+[[5705]],
+[[5706]],
+[[5707]],
+[[5708]],
+[[5709]],
+[[5710]],
+[[5711]],
+[[5712]],
+[[5713]],
+[[5714]],
+[[5715]],
+[[5716]],
+[[5717]],
+[[5718]],
+[[5719]],
+[[5720]],
+[[5721]],
+[[5722]],
+[[5723]],
+[[5724]],
+[[5725]],
+[[5726]],
+[[5727]],
+[[5728]],
+[[5729]],
+[[5730]],
+[[5731]],
+[[5732]],
+[[5733]],
+[[5734]],
+[[5735]],
+[[5736]],
+[[5737]],
+[[5738]],
+[[5739]],
+[[5740]],
+[[5741]],
+[[5742]],
+[[5743]],
+[[5744]],
+[[5745]],
+[[5746]],
+[[5747]],
+[[5748]],
+[[5749]],
+[[5750]],
+[[5751]],
+[[5752]],
+[[5753]],
+[[5754]],
+[[5755]],
+[[5756]],
+[[5757]],
+[[5758]],
+[[5759]],
+[[5760]],
+[[5761]],
+[[5762]],
+[[5763]],
+[[5764]],
+[[5765]],
+[[5766]],
+[[5767]],
+[[5768]],
+[[5769]],
+[[5770]],
+[[5771]],
+[[5772]],
+[[5773]],
+[[5774]],
+[[5775]],
+[[5776]],
+[[5777]],
+[[5778]],
+[[5779]],
+[[5780]],
+[[5781]],
+[[5782]],
+[[5783]],
+[[5784]],
+[[5785]],
+[[5786]],
+[[5787]],
+[[5788]],
+[[5789]],
+[[5790]],
+[[5791]],
+[[5792]],
+[[5793]],
+[[5794]],
+[[5795]],
+[[5796]],
+[[5797]],
+[[5798]],
+[[5799]],
+[[5800]],
+[[5801]],
+[[5802]],
+[[5803]],
+[[5804]],
+[[5805]],
+[[5806]],
+[[5807]],
+[[5808]],
+[[5809]],
+[[5810]],
+[[5811]],
+[[5812]],
+[[5813]],
+[[5814]],
+[[5815]],
+[[5816]],
+[[5817]],
+[[5818]],
+[[5819]],
+[[5820]],
+[[5821]],
+[[5822]],
+[[5823]],
+[[5824]],
+[[5825]],
+[[5826]],
+[[5827]],
+[[5828]],
+[[5829]],
+[[5830]],
+[[5831]],
+[[5832]],
+[[5833]],
+[[5834]],
+[[5835]],
+[[5836]],
+[[5837]],
+[[5838]],
+[[5839]],
+[[5840]],
+[[5841]],
+[[5842]],
+[[5843]],
+[[5844]],
+[[5845]],
+[[5846]],
+[[5847]],
+[[5848]],
+[[5849]],
+[[5850]],
+[[5851]],
+[[5852]],
+[[5853]],
+[[5854]],
+[[5855]],
+[[5856]],
+[[5857]],
+[[5858]],
+[[5859]],
+[[5860]],
+[[5861]],
+[[5862]],
+[[5863]],
+[[5864]],
+[[5865]],
+[[5866]],
+[[5867]],
+[[5868]],
+[[5869]],
+[[5870]],
+[[5871]],
+[[5872]],
+[[5873]],
+[[5874]],
+[[5875]],
+[[5876]],
+[[5877]],
+[[5878]],
+[[5879]],
+[[5880]],
+[[5881]],
+[[5882]],
+[[5883]],
+[[5884]],
+[[5885]],
+[[5886]],
+[[5887]],
+[[5888]],
+[[5889]],
+[[5890]],
+[[5891]],
+[[5892]],
+[[5893]],
+[[5894]],
+[[5895]],
+[[5896]],
+[[5897]],
+[[5898]],
+[[5899]],
+[[5900]],
+[[5901]],
+[[5902]],
+[[5903]],
+[[5904]],
+[[5905]],
+[[5906]],
+[[5907]],
+[[5908]],
+[[5909]],
+[[5910]],
+[[5911]],
+[[5912]],
+[[5913]],
+[[5914]],
+[[5915]],
+[[5916]],
+[[5917]],
+[[5918]],
+[[5919]],
+[[5920]],
+[[5921]],
+[[5922]],
+[[5923]],
+[[5924]],
+[[5925]],
+[[5926]],
+[[5927]],
+[[5928]],
+[[5929]],
+[[5930]],
+[[5931]],
+[[5932]],
+[[5933]],
+[[5934]],
+[[5935]],
+[[5936]],
+[[5937]],
+[[5938]],
+[[5939]],
+[[5940]],
+[[5941]],
+[[5942]],
+[[5943]],
+[[5944]],
+[[5945]],
+[[5946]],
+[[5947]],
+[[5948]],
+[[5949]],
+[[5950]],
+[[5951]],
+[[5952]],
+[[5953]],
+[[5954]],
+[[5955]],
+[[5956]],
+[[5957]],
+[[5958]],
+[[5959]],
+[[5960]],
+[[5961]],
+[[5962]],
+[[5963]],
+[[5964]],
+[[5965]],
+[[5966]],
+[[5967]],
+[[5968]],
+[[5969]],
+[[5970]],
+[[5971]],
+[[5972]],
+[[5973]],
+[[5974]],
+[[5975]],
+[[5976]],
+[[5977]],
+[[5978]],
+[[5979]],
+[[5980]],
+[[5981]],
+[[5982]],
+[[5983]],
+[[5984]],
+[[5985]],
+[[5986]],
+[[5987]],
+[[5988]],
+[[5989]],
+[[5990]],
+[[5991]],
+[[5992]],
+[[5993]],
+[[5994]],
+[[5995]],
+[[5996]],
+[[5997]],
+[[5998]],
+[[5999]],
+[[6000]],
+[[6001]],
+[[6002]],
+[[6003]],
+[[6004]],
+[[6005]],
+[[6006]],
+[[6007]],
+[[6008]],
+[[6009]],
+[[6010]],
+[[6011]],
+[[6012]],
+[[6013]],
+[[6014]],
+[[6015]],
+[[6016]],
+[[6017]],
+[[6018]],
+[[6019]],
+[[6020]],
+[[6021]],
+[[6022]],
+[[6023]],
+[[6024]],
+[[6025]],
+[[6026]],
+[[6027]],
+[[6028]],
+[[6029]],
+[[6030]],
+[[6031]],
+[[6032]],
+[[6033]],
+[[6034]],
+[[6035]],
+[[6036]],
+[[6037]],
+[[6038]],
+[[6039]],
+[[6040]],
+[[6041]],
+[[6042]],
+[[6043]],
+[[6044]],
+[[6045]],
+[[6046]],
+[[6047]],
+[[6048]],
+[[6049]],
+[[6050]],
+[[6051]],
+[[6052]],
+[[6053]],
+[[6054]],
+[[6055]],
+[[6056]],
+[[6057]],
+[[6058]],
+[[6059]],
+[[6060]],
+[[6061]],
+[[6062]],
+[[6063]],
+[[6064]],
+[[6065]],
+[[6066]],
+[[6067]],
+[[6068]],
+[[6069]],
+[[6070]],
+[[6071]],
+[[6072]],
+[[6073]],
+[[6074]],
+[[6075]],
+[[6076]],
+[[6077]],
+[[6078]],
+[[6079]],
+[[6080]],
+[[6081]],
+[[6082]],
+[[6083]],
+[[6084]],
+[[6085]],
+[[6086]],
+[[6087]],
+[[6088]],
+[[6089]],
+[[6090]],
+[[6091]],
+[[6092]],
+[[6093]],
+[[6094]],
+[[6095]],
+[[6096]],
+[[6097]],
+[[6098]],
+[[6099]],
+[[6100]],
+[[6101]],
+[[6102]],
+[[6103]],
+[[6104]],
+[[6105]],
+[[6106]],
+[[6107]],
+[[6108]],
+[[6109]],
+[[6110]],
+[[6111]],
+[[6112]],
+[[6113]],
+[[6114]],
+[[6115]],
+[[6116]],
+[[6117]],
+[[6118]],
+[[6119]],
+[[6120]],
+[[6121]],
+[[6122]],
+[[6123]],
+[[6124]],
+[[6125]],
+[[6126]],
+[[6127]],
+[[6128]],
+[[6129]],
+[[6130]],
+[[6131]],
+[[6132]],
+[[6133]],
+[[6134]],
+[[6135]],
+[[6136]],
+[[6137]],
+[[6138]],
+[[6139]],
+[[6140]],
+[[6141]],
+[[6142]],
+[[6143]],
+[[6144]],
+[[6145]],
+[[6146]],
+[[6147]],
+[[6148]],
+[[6149]],
+[[6150]],
+[[6151]],
+[[6152]],
+[[6153]],
+[[6154]],
+[[6155]],
+[[6156]],
+[[6157]],
+[[6158]],
+[[6159]],
+[[6160]],
+[[6161]],
+[[6162]],
+[[6163]],
+[[6164]],
+[[6165]],
+[[6166]],
+[[6167]],
+[[6168]],
+[[6169]],
+[[6170]],
+[[6171]],
+[[6172]],
+[[6173]],
+[[6174]],
+[[6175]],
+[[6176]],
+[[6177]],
+[[6178]],
+[[6179]],
+[[6180]],
+[[6181]],
+[[6182]],
+[[6183]],
+[[6184]],
+[[6185]],
+[[6186]],
+[[6187]],
+[[6188]],
+[[6189]],
+[[6190]],
+[[6191]],
+[[6192]],
+[[6193]],
+[[6194]],
+[[6195]],
+[[6196]],
+[[6197]],
+[[6198]],
+[[6199]],
+[[6200]],
+[[6201]],
+[[6202]],
+[[6203]],
+[[6204]],
+[[6205]],
+[[6206]],
+[[6207]],
+[[6208]],
+[[6209]],
+[[6210]],
+[[6211]],
+[[6212]],
+[[6213]],
+[[6214]],
+[[6215]],
+[[6216]],
+[[6217]],
+[[6218]],
+[[6219]],
+[[6220]],
+[[6221]],
+[[6222]],
+[[6223]],
+[[6224]],
+[[6225]],
+[[6226]],
+[[6227]],
+[[6228]],
+[[6229]],
+[[6230]],
+[[6231]],
+[[6232]],
+[[6233]],
+[[6234]],
+[[6235]],
+[[6236]],
+[[6237]],
+[[6238]],
+[[6239]],
+[[6240]],
+[[6241]],
+[[6242]],
+[[6243]],
+[[6244]],
+[[6245]],
+[[6246]],
+[[6247]],
+[[6248]],
+[[6249]],
+[[6250]],
+[[6251]],
+[[6252]],
+[[6253]],
+[[6254]],
+[[6255]],
+[[6256]],
+[[6257]],
+[[6258]],
+[[6259]],
+[[6260]],
+[[6261]],
+[[6262]],
+[[6263]],
+[[6264]],
+[[6265]],
+[[6266]],
+[[6267]],
+[[6268]],
+[[6269]],
+[[6270]],
+[[6271]],
+[[6272]],
+[[6273]],
+[[6274]],
+[[6275]],
+[[6276]],
+[[6277]],
+[[6278]],
+[[6279]],
+[[6280]],
+[[6281]],
+[[6282]],
+[[6283]],
+[[6284]],
+[[6285]],
+[[6286]],
+[[6287]],
+[[6288]],
+[[6289]],
+[[6290]],
+[[6291]],
+[[6292]],
+[[6293]],
+[[6294]],
+[[6295]],
+[[6296]],
+[[6297]],
+[[6298]],
+[[6299]],
+[[6300]],
+[[6301]],
+[[6302]],
+[[6303]],
+[[6304]],
+[[6305]],
+[[6306]],
+[[6307]],
+[[6308]],
+[[6309]],
+[[6310]],
+[[6311]],
+[[6312]],
+[[6313]],
+[[6314]],
+[[6315]],
+[[6316]],
+[[6317]],
+[[6318]],
+[[6319]],
+[[6320]],
+[[6321]],
+[[6322]],
+[[6323]],
+[[6324]],
+[[6325]],
+[[6326]],
+[[6327]],
+[[6328]],
+[[6329]],
+[[6330]],
+[[6331]],
+[[6332]],
+[[6333]],
+[[6334]],
+[[6335]],
+[[6336]],
+[[6337]],
+[[6338]],
+[[6339]],
+[[6340]],
+[[6341]],
+[[6342]],
+[[6343]],
+[[6344]],
+[[6345]],
+[[6346]],
+[[6347]],
+[[6348]],
+[[6349]],
+[[6350]],
+[[6351]],
+[[6352]],
+[[6353]],
+[[6354]],
+[[6355]],
+[[6356]],
+[[6357]],
+[[6358]],
+[[6359]],
+[[6360]],
+[[6361]],
+[[6362]],
+[[6363]],
+[[6364]],
+[[6365]],
+[[6366]],
+[[6367]],
+[[6368]],
+[[6369]],
+[[6370]],
+[[6371]],
+[[6372]],
+[[6373]],
+[[6374]],
+[[6375]],
+[[6376]],
+[[6377]],
+[[6378]],
+[[6379]],
+[[6380]],
+[[6381]],
+[[6382]],
+[[6383]],
+[[6384]],
+[[6385]],
+[[6386]],
+[[6387]],
+[[6388]],
+[[6389]],
+[[6390]],
+[[6391]],
+[[6392]],
+[[6393]],
+[[6394]],
+[[6395]],
+[[6396]],
+[[6397]],
+[[6398]],
+[[6399]],
+[[6400]],
+[[6401]],
+[[6402]],
+[[6403]],
+[[6404]],
+[[6405]],
+[[6406]],
+[[6407]],
+[[6408]],
+[[6409]],
+[[6410]],
+[[6411]],
+[[6412]],
+[[6413]],
+[[6414]],
+[[6415]],
+[[6416]],
+[[6417]],
+[[6418]],
+[[6419]],
+[[6420]],
+[[6421]],
+[[6422]],
+[[6423]],
+[[6424]],
+[[6425]],
+[[6426]],
+[[6427]],
+[[6428]],
+[[6429]],
+[[6430]],
+[[6431]],
+[[6432]],
+[[6433]],
+[[6434]],
+[[6435]],
+[[6436]],
+[[6437]],
+[[6438]],
+[[6439]],
+[[6440]],
+[[6441]],
+[[6442]],
+[[6443]],
+[[6444]],
+[[6445]],
+[[6446]],
+[[6447]],
+[[6448]],
+[[6449]],
+[[6450]],
+[[6451]],
+[[6452]],
+[[6453]],
+[[6454]],
+[[6455]],
+[[6456]],
+[[6457]],
+[[6458]],
+[[6459]],
+[[6460]],
+[[6461]],
+[[6462]],
+[[6463]],
+[[6464]],
+[[6465]],
+[[6466]],
+[[6467]],
+[[6468]],
+[[6469]],
+[[6470]],
+[[6471]],
+[[6472]],
+[[6473]],
+[[6474]],
+[[6475]],
+[[6476]],
+[[6477]],
+[[6478]],
+[[6479]],
+[[6480]],
+[[6481]],
+[[6482]],
+[[6483]],
+[[6484]],
+[[6485]],
+[[6486]],
+[[6487]],
+[[6488]],
+[[6489]],
+[[6490]],
+[[6491]],
+[[6492]],
+[[6493]],
+[[6494]],
+[[6495]],
+[[6496]],
+[[6497]],
+[[6498]],
+[[6499]],
+[[6500]],
+[[6501]],
+[[6502]],
+[[6503]],
+[[6504]],
+[[6505]],
+[[6506]],
+[[6507]],
+[[6508]],
+[[6509]],
+[[6510]],
+[[6511]],
+[[6512]],
+[[6513]],
+[[6514]],
+[[6515]],
+[[6516]],
+[[6517]],
+[[6518]],
+[[6519]],
+[[6520]],
+[[6521]],
+[[6522]],
+[[6523]],
+[[6524]],
+[[6525]],
+[[6526]],
+[[6527]],
+[[6528]],
+[[6529]],
+[[6530]],
+[[6531]],
+[[6532]],
+[[6533]],
+[[6534]],
+[[6535]],
+[[6536]],
+[[6537]],
+[[6538]],
+[[6539]],
+[[6540]],
+[[6541]],
+[[6542]],
+[[6543]],
+[[6544]],
+[[6545]],
+[[6546]],
+[[6547]],
+[[6548]],
+[[6549]],
+[[6550]],
+[[6551]],
+[[6552]],
+[[6553]],
+[[6554]],
+[[6555]],
+[[6556]],
+[[6557]],
+[[6558]],
+[[6559]],
+[[6560]],
+[[6561]],
+[[6562]],
+[[6563]],
+[[6564]],
+[[6565]],
+[[6566]],
+[[6567]],
+[[6568]],
+[[6569]],
+[[6570]],
+[[6571]],
+[[6572]],
+[[6573]],
+[[6574]],
+[[6575]],
+[[6576]],
+[[6577]],
+[[6578]],
+[[6579]],
+[[6580]],
+[[6581]],
+[[6582]],
+[[6583]],
+[[6584]],
+[[6585]],
+[[6586]],
+[[6587]],
+[[6588]],
+[[6589]],
+[[6590]],
+[[6591]],
+[[6592]],
+[[6593]],
+[[6594]],
+[[6595]],
+[[6596]],
+[[6597]],
+[[6598]],
+[[6599]],
+[[6600]],
+[[6601]],
+[[6602]],
+[[6603]],
+[[6604]],
+[[6605]],
+[[6606]],
+[[6607]],
+[[6608]],
+[[6609]],
+[[6610]],
+[[6611]],
+[[6612]],
+[[6613]],
+[[6614]],
+[[6615]],
+[[6616]],
+[[6617]],
+[[6618]],
+[[6619]],
+[[6620]],
+[[6621]],
+[[6622]],
+[[6623]],
+[[6624]],
+[[6625]],
+[[6626]],
+[[6627]],
+[[6628]],
+[[6629]],
+[[6630]],
+[[6631]],
+[[6632]],
+[[6633]],
+[[6634]],
+[[6635]],
+[[6636]],
+[[6637]],
+[[6638]],
+[[6639]],
+[[6640]],
+[[6641]],
+[[6642]],
+[[6643]],
+[[6644]],
+[[6645]],
+[[6646]],
+[[6647]],
+[[6648]],
+[[6649]],
+[[6650]],
+[[6651]],
+[[6652]],
+[[6653]],
+[[6654]],
+[[6655]],
+[[6656]],
+[[6657]],
+[[6658]],
+[[6659]],
+[[6660]],
+[[6661]],
+[[6662]],
+[[6663]],
+[[6664]],
+[[6665]],
+[[6666]],
+[[6667]],
+[[6668]],
+[[6669]],
+[[6670]],
+[[6671]],
+[[6672]],
+[[6673]],
+[[6674]],
+[[6675]],
+[[6676]],
+[[6677]],
+[[6678]],
+[[6679]],
+[[6680]],
+[[6681]],
+[[6682]],
+[[6683]],
+[[6684]],
+[[6685]],
+[[6686]],
+[[6687]],
+[[6688]],
+[[6689]],
+[[6690]],
+[[6691]],
+[[6692]],
+[[6693]],
+[[6694]],
+[[6695]],
+[[6696]],
+[[6697]],
+[[6698]],
+[[6699]],
+[[6700]],
+[[6701]],
+[[6702]],
+[[6703]],
+[[6704]],
+[[6705]],
+[[6706]],
+[[6707]],
+[[6708]],
+[[6709]],
+[[6710]],
+[[6711]],
+[[6712]],
+[[6713]],
+[[6714]],
+[[6715]],
+[[6716]],
+[[6717]],
+[[6718]],
+[[6719]],
+[[6720]],
+[[6721]],
+[[6722]],
+[[6723]],
+[[6724]],
+[[6725]],
+[[6726]],
+[[6727]],
+[[6728]],
+[[6729]],
+[[6730]],
+[[6731]],
+[[6732]],
+[[6733]],
+[[6734]],
+[[6735]],
+[[6736]],
+[[6737]],
+[[6738]],
+[[6739]],
+[[6740]],
+[[6741]],
+[[6742]],
+[[6743]],
+[[6744]],
+[[6745]],
+[[6746]],
+[[6747]],
+[[6748]],
+[[6749]],
+[[6750]],
+[[6751]],
+[[6752]],
+[[6753]],
+[[6754]],
+[[6755]],
+[[6756]],
+[[6757]],
+[[6758]],
+[[6759]],
+[[6760]],
+[[6761]],
+[[6762]],
+[[6763]],
+[[6764]],
+[[6765]],
+[[6766]],
+[[6767]],
+[[6768]],
+[[6769]],
+[[6770]],
+[[6771]],
+[[6772]],
+[[6773]],
+[[6774]],
+[[6775]],
+[[6776]],
+[[6777]],
+[[6778]],
+[[6779]],
+[[6780]],
+[[6781]],
+[[6782]],
+[[6783]],
+[[6784]],
+[[6785]],
+[[6786]],
+[[6787]],
+[[6788]],
+[[6789]],
+[[6790]],
+[[6791]],
+[[6792]],
+[[6793]],
+[[6794]],
+[[6795]],
+[[6796]],
+[[6797]],
+[[6798]],
+[[6799]],
+[[6800]],
+[[6801]],
+[[6802]],
+[[6803]],
+[[6804]],
+[[6805]],
+[[6806]],
+[[6807]],
+[[6808]],
+[[6809]],
+[[6810]],
+[[6811]],
+[[6812]],
+[[6813]],
+[[6814]],
+[[6815]],
+[[6816]],
+[[6817]],
+[[6818]],
+[[6819]],
+[[6820]],
+[[6821]],
+[[6822]],
+[[6823]],
+[[6824]],
+[[6825]],
+[[6826]],
+[[6827]],
+[[6828]],
+[[6829]],
+[[6830]],
+[[6831]],
+[[6832]],
+[[6833]],
+[[6834]],
+[[6835]],
+[[6836]],
+[[6837]],
+[[6838]],
+[[6839]],
+[[6840]],
+[[6841]],
+[[6842]],
+[[6843]],
+[[6844]],
+[[6845]],
+[[6846]],
+[[6847]],
+[[6848]],
+[[6849]],
+[[6850]],
+[[6851]],
+[[6852]],
+[[6853]],
+[[6854]],
+[[6855]],
+[[6856]],
+[[6857]],
+[[6858]],
+[[6859]],
+[[6860]],
+[[6861]],
+[[6862]],
+[[6863]],
+[[6864]],
+[[6865]],
+[[6866]],
+[[6867]],
+[[6868]],
+[[6869]],
+[[6870]],
+[[6871]],
+[[6872]],
+[[6873]],
+[[6874]],
+[[6875]],
+[[6876]],
+[[6877]],
+[[6878]],
+[[6879]],
+[[6880]],
+[[6881]],
+[[6882]],
+[[6883]],
+[[6884]],
+[[6885]],
+[[6886]],
+[[6887]],
+[[6888]],
+[[6889]],
+[[6890]],
+[[6891]],
+[[6892]],
+[[6893]],
+[[6894]],
+[[6895]],
+[[6896]],
+[[6897]],
+[[6898]],
+[[6899]],
+[[6900]],
+[[6901]],
+[[6902]],
+[[6903]],
+[[6904]],
+[[6905]],
+[[6906]],
+[[6907]],
+[[6908]],
+[[6909]],
+[[6910]],
+[[6911]],
+[[6912]],
+[[6913]],
+[[6914]],
+[[6915]],
+[[6916]],
+[[6917]],
+[[6918]],
+[[6919]],
+[[6920]],
+[[6921]],
+[[6922]],
+[[6923]],
+[[6924]],
+[[6925]],
+[[6926]],
+[[6927]],
+[[6928]],
+[[6929]],
+[[6930]],
+[[6931]],
+[[6932]],
+[[6933]],
+[[6934]],
+[[6935]],
+[[6936]],
+[[6937]],
+[[6938]],
+[[6939]],
+[[6940]],
+[[6941]],
+[[6942]],
+[[6943]],
+[[6944]],
+[[6945]],
+[[6946]],
+[[6947]],
+[[6948]],
+[[6949]],
+[[6950]],
+[[6951]],
+[[6952]],
+[[6953]],
+[[6954]],
+[[6955]],
+[[6956]],
+[[6957]],
+[[6958]],
+[[6959]],
+[[6960]],
+[[6961]],
+[[6962]],
+[[6963]],
+[[6964]],
+[[6965]],
+[[6966]],
+[[6967]],
+[[6968]],
+[[6969]],
+[[6970]],
+[[6971]],
+[[6972]],
+[[6973]],
+[[6974]],
+[[6975]],
+[[6976]],
+[[6977]],
+[[6978]],
+[[6979]],
+[[6980]],
+[[6981]],
+[[6982]],
+[[6983]],
+[[6984]],
+[[6985]],
+[[6986]],
+[[6987]],
+[[6988]],
+[[6989]],
+[[6990]],
+[[6991]],
+[[6992]],
+[[6993]],
+[[6994]],
+[[6995]],
+[[6996]],
+[[6997]],
+[[6998]],
+[[6999]],
+[[7000]],
+[[7001]],
+[[7002]],
+[[7003]],
+[[7004]],
+[[7005]],
+[[7006]],
+[[7007]],
+[[7008]],
+[[7009]],
+[[7010]],
+[[7011]],
+[[7012]],
+[[7013]],
+[[7014]],
+[[7015]],
+[[7016]],
+[[7017]],
+[[7018]],
+[[7019]],
+[[7020]],
+[[7021]],
+[[7022]],
+[[7023]],
+[[7024]],
+[[7025]],
+[[7026]],
+[[7027]],
+[[7028]],
+[[7029]],
+[[7030]],
+[[7031]],
+[[7032]],
+[[7033]],
+[[7034]],
+[[7035]],
+[[7036]],
+[[7037]],
+[[7038]],
+[[7039]],
+[[7040]],
+[[7041]],
+[[7042]],
+[[7043]],
+[[7044]],
+[[7045]],
+[[7046]],
+[[7047]],
+[[7048]],
+[[7049]],
+[[7050]],
+[[7051]],
+[[7052]],
+[[7053]],
+[[7054]],
+[[7055]],
+[[7056]],
+[[7057]],
+[[7058]],
+[[7059]],
+[[7060]],
+[[7061]],
+[[7062]],
+[[7063]],
+[[7064]],
+[[7065]],
+[[7066]],
+[[7067]],
+[[7068]],
+[[7069]],
+[[7070]],
+[[7071]],
+[[7072]],
+[[7073]],
+[[7074]],
+[[7075]],
+[[7076]],
+[[7077]],
+[[7078]],
+[[7079]],
+[[7080]],
+[[7081]],
+[[7082]],
+[[7083]],
+[[7084]],
+[[7085]],
+[[7086]],
+[[7087]],
+[[7088]],
+[[7089]],
+[[7090]],
+[[7091]],
+[[7092]],
+[[7093]],
+[[7094]],
+[[7095]],
+[[7096]],
+[[7097]],
+[[7098]],
+[[7099]],
+[[7100]],
+[[7101]],
+[[7102]],
+[[7103]],
+[[7104]],
+[[7105]],
+[[7106]],
+[[7107]],
+[[7108]],
+[[7109]],
+[[7110]],
+[[7111]],
+[[7112]],
+[[7113]],
+[[7114]],
+[[7115]],
+[[7116]],
+[[7117]],
+[[7118]],
+[[7119]],
+[[7120]],
+[[7121]],
+[[7122]],
+[[7123]],
+[[7124]],
+[[7125]],
+[[7126]],
+[[7127]],
+[[7128]],
+[[7129]],
+[[7130]],
+[[7131]],
+[[7132]],
+[[7133]],
+[[7134]],
+[[7135]],
+[[7136]],
+[[7137]],
+[[7138]],
+[[7139]],
+[[7140]],
+[[7141]],
+[[7142]],
+[[7143]],
+[[7144]],
+[[7145]],
+[[7146]],
+[[7147]],
+[[7148]],
+[[7149]],
+[[7150]],
+[[7151]],
+[[7152]],
+[[7153]],
+[[7154]],
+[[7155]],
+[[7156]],
+[[7157]],
+[[7158]],
+[[7159]],
+[[7160]],
+[[7161]],
+[[7162]],
+[[7163]],
+[[7164]],
+[[7165]],
+[[7166]],
+[[7167]],
+[[7168]],
+[[7169]],
+[[7170]],
+[[7171]],
+[[7172]],
+[[7173]],
+[[7174]],
+[[7175]],
+[[7176]],
+[[7177]],
+[[7178]],
+[[7179]],
+[[7180]],
+[[7181]],
+[[7182]],
+[[7183]],
+[[7184]],
+[[7185]],
+[[7186]],
+[[7187]],
+[[7188]],
+[[7189]],
+[[7190]],
+[[7191]],
+[[7192]],
+[[7193]],
+[[7194]],
+[[7195]],
+[[7196]],
+[[7197]],
+[[7198]],
+[[7199]],
+[[7200]],
+[[7201]],
+[[7202]],
+[[7203]],
+[[7204]],
+[[7205]],
+[[7206]],
+[[7207]],
+[[7208]],
+[[7209]],
+[[7210]],
+[[7211]],
+[[7212]],
+[[7213]],
+[[7214]],
+[[7215]],
+[[7216]],
+[[7217]],
+[[7218]],
+[[7219]],
+[[7220]],
+[[7221]],
+[[7222]],
+[[7223]],
+[[7224]],
+[[7225]],
+[[7226]],
+[[7227]],
+[[7228]],
+[[7229]],
+[[7230]],
+[[7231]],
+[[7232]],
+[[7233]],
+[[7234]],
+[[7235]],
+[[7236]],
+[[7237]],
+[[7238]],
+[[7239]],
+[[7240]],
+[[7241]],
+[[7242]],
+[[7243]],
+[[7244]],
+[[7245]],
+[[7246]],
+[[7247]],
+[[7248]],
+[[7249]],
+[[7250]],
+[[7251]],
+[[7252]],
+[[7253]],
+[[7254]],
+[[7255]],
+[[7256]],
+[[7257]],
+[[7258]],
+[[7259]],
+[[7260]],
+[[7261]],
+[[7262]],
+[[7263]],
+[[7264]],
+[[7265]],
+[[7266]],
+[[7267]],
+[[7268]],
+[[7269]],
+[[7270]],
+[[7271]],
+[[7272]],
+[[7273]],
+[[7274]],
+[[7275]],
+[[7276]],
+[[7277]],
+[[7278]],
+[[7279]],
+[[7280]],
+[[7281]],
+[[7282]],
+[[7283]],
+[[7284]],
+[[7285]],
+[[7286]],
+[[7287]],
+[[7288]],
+[[7289]],
+[[7290]],
+[[7291]],
+[[7292]],
+[[7293]],
+[[7294]],
+[[7295]],
+[[7296]],
+[[7297]],
+[[7298]],
+[[7299]],
+[[7300]],
+[[7301]],
+[[7302]],
+[[7303]],
+[[7304]],
+[[7305]],
+[[7306]],
+[[7307]],
+[[7308]],
+[[7309]],
+[[7310]],
+[[7311]],
+[[7312]],
+[[7313]],
+[[7314]],
+[[7315]],
+[[7316]],
+[[7317]],
+[[7318]],
+[[7319]],
+[[7320]],
+[[7321]],
+[[7322]],
+[[7323]],
+[[7324]],
+[[7325]],
+[[7326]],
+[[7327]],
+[[7328]],
+[[7329]],
+[[7330]],
+[[7331]],
+[[7332]],
+[[7333]],
+[[7334]],
+[[7335]],
+[[7336]],
+[[7337]],
+[[7338]],
+[[7339]],
+[[7340]],
+[[7341]],
+[[7342]],
+[[7343]],
+[[7344]],
+[[7345]],
+[[7346]],
+[[7347]],
+[[7348]],
+[[7349]],
+[[7350]],
+[[7351]],
+[[7352]],
+[[7353]],
+[[7354]],
+[[7355]],
+[[7356]],
+[[7357]],
+[[7358]],
+[[7359]],
+[[7360]],
+[[7361]],
+[[7362]],
+[[7363]],
+[[7364]],
+[[7365]],
+[[7366]],
+[[7367]],
+[[7368]],
+[[7369]],
+[[7370]],
+[[7371]],
+[[7372]],
+[[7373]],
+[[7374]],
+[[7375]],
+[[7376]],
+[[7377]],
+[[7378]],
+[[7379]],
+[[7380]],
+[[7381]],
+[[7382]],
+[[7383]],
+[[7384]],
+[[7385]],
+[[7386]],
+[[7387]],
+[[7388]],
+[[7389]],
+[[7390]],
+[[7391]],
+[[7392]],
+[[7393]],
+[[7394]],
+[[7395]],
+[[7396]],
+[[7397]],
+[[7398]],
+[[7399]],
+[[7400]],
+[[7401]],
+[[7402]],
+[[7403]],
+[[7404]],
+[[7405]],
+[[7406]],
+[[7407]],
+[[7408]],
+[[7409]],
+[[7410]],
+[[7411]],
+[[7412]],
+[[7413]],
+[[7414]],
+[[7415]],
+[[7416]],
+[[7417]],
+[[7418]],
+[[7419]],
+[[7420]],
+[[7421]],
+[[7422]],
+[[7423]],
+[[7424]],
+[[7425]],
+[[7426]],
+[[7427]],
+[[7428]],
+[[7429]],
+[[7430]],
+[[7431]],
+[[7432]],
+[[7433]],
+[[7434]],
+[[7435]],
+[[7436]],
+[[7437]],
+[[7438]],
+[[7439]],
+[[7440]],
+[[7441]],
+[[7442]],
+[[7443]],
+[[7444]],
+[[7445]],
+[[7446]],
+[[7447]],
+[[7448]],
+[[7449]],
+[[7450]],
+[[7451]],
+[[7452]],
+[[7453]],
+[[7454]],
+[[7455]],
+[[7456]],
+[[7457]],
+[[7458]],
+[[7459]],
+[[7460]],
+[[7461]],
+[[7462]],
+[[7463]],
+[[7464]],
+[[7465]],
+[[7466]],
+[[7467]],
+[[7468]],
+[[7469]],
+[[7470]],
+[[7471]],
+[[7472]],
+[[7473]],
+[[7474]],
+[[7475]],
+[[7476]],
+[[7477]],
+[[7478]],
+[[7479]],
+[[7480]],
+[[7481]],
+[[7482]],
+[[7483]],
+[[7484]],
+[[7485]],
+[[7486]],
+[[7487]],
+[[7488]],
+[[7489]],
+[[7490]],
+[[7491]],
+[[7492]],
+[[7493]],
+[[7494]],
+[[7495]],
+[[7496]],
+[[7497]],
+[[7498]],
+[[7499]],
+[[7500]],
+[[7501]],
+[[7502]],
+[[7503]],
+[[7504]],
+[[7505]],
+[[7506]],
+[[7507]],
+[[7508]],
+[[7509]],
+[[7510]],
+[[7511]],
+[[7512]],
+[[7513]],
+[[7514]],
+[[7515]],
+[[7516]],
+[[7517]],
+[[7518]],
+[[7519]],
+[[7520]],
+[[7521]],
+[[7522]],
+[[7523]],
+[[7524]],
+[[7525]],
+[[7526]],
+[[7527]],
+[[7528]],
+[[7529]],
+[[7530]],
+[[7531]],
+[[7532]],
+[[7533]],
+[[7534]],
+[[7535]],
+[[7536]],
+[[7537]],
+[[7538]],
+[[7539]],
+[[7540]],
+[[7541]],
+[[7542]],
+[[7543]],
+[[7544]],
+[[7545]],
+[[7546]],
+[[7547]],
+[[7548]],
+[[7549]],
+[[7550]],
+[[7551]],
+[[7552]],
+[[7553]],
+[[7554]],
+[[7555]],
+[[7556]],
+[[7557]],
+[[7558]],
+[[7559]],
+[[7560]],
+[[7561]],
+[[7562]],
+[[7563]],
+[[7564]],
+[[7565]],
+[[7566]],
+[[7567]],
+[[7568]],
+[[7569]],
+[[7570]],
+[[7571]],
+[[7572]],
+[[7573]],
+[[7574]],
+[[7575]],
+[[7576]],
+[[7577]],
+[[7578]],
+[[7579]],
+[[7580]],
+[[7581]],
+[[7582]],
+[[7583]],
+[[7584]],
+[[7585]],
+[[7586]],
+[[7587]],
+[[7588]],
+[[7589]],
+[[7590]],
+[[7591]],
+[[7592]],
+[[7593]],
+[[7594]],
+[[7595]],
+[[7596]],
+[[7597]],
+[[7598]],
+[[7599]],
+[[7600]],
+[[7601]],
+[[7602]],
+[[7603]],
+[[7604]],
+[[7605]],
+[[7606]],
+[[7607]],
+[[7608]],
+[[7609]],
+[[7610]],
+[[7611]],
+[[7612]],
+[[7613]],
+[[7614]],
+[[7615]],
+[[7616]],
+[[7617]],
+[[7618]],
+[[7619]],
+[[7620]],
+[[7621]],
+[[7622]],
+[[7623]],
+[[7624]],
+[[7625]],
+[[7626]],
+[[7627]],
+[[7628]],
+[[7629]],
+[[7630]],
+[[7631]],
+[[7632]],
+[[7633]],
+[[7634]],
+[[7635]],
+[[7636]],
+[[7637]],
+[[7638]],
+[[7639]],
+[[7640]],
+[[7641]],
+[[7642]],
+[[7643]],
+[[7644]],
+[[7645]],
+[[7646]],
+[[7647]],
+[[7648]],
+[[7649]],
+[[7650]],
+[[7651]],
+[[7652]],
+[[7653]],
+[[7654]],
+[[7655]],
+[[7656]],
+[[7657]],
+[[7658]],
+[[7659]],
+[[7660]],
+[[7661]],
+[[7662]],
+[[7663]],
+[[7664]],
+[[7665]],
+[[7666]],
+[[7667]],
+[[7668]],
+[[7669]],
+[[7670]],
+[[7671]],
+[[7672]],
+[[7673]],
+[[7674]],
+[[7675]],
+[[7676]],
+[[7677]],
+[[7678]],
+[[7679]],
+[[7680]],
+[[7681]],
+[[7682]],
+[[7683]],
+[[7684]],
+[[7685]],
+[[7686]],
+[[7687]],
+[[7688]],
+[[7689]],
+[[7690]],
+[[7691]],
+[[7692]],
+[[7693]],
+[[7694]],
+[[7695]],
+[[7696]],
+[[7697]],
+[[7698]],
+[[7699]],
+[[7700]],
+[[7701]],
+[[7702]],
+[[7703]],
+[[7704]],
+[[7705]],
+[[7706]],
+[[7707]],
+[[7708]],
+[[7709]],
+[[7710]],
+[[7711]],
+[[7712]],
+[[7713]],
+[[7714]],
+[[7715]],
+[[7716]],
+[[7717]],
+[[7718]],
+[[7719]],
+[[7720]],
+[[7721]],
+[[7722]],
+[[7723]],
+[[7724]],
+[[7725]],
+[[7726]],
+[[7727]],
+[[7728]],
+[[7729]],
+[[7730]],
+[[7731]],
+[[7732]],
+[[7733]],
+[[7734]],
+[[7735]],
+[[7736]],
+[[7737]],
+[[7738]],
+[[7739]],
+[[7740]],
+[[7741]],
+[[7742]],
+[[7743]],
+[[7744]],
+[[7745]],
+[[7746]],
+[[7747]],
+[[7748]],
+[[7749]],
+[[7750]],
+[[7751]],
+[[7752]],
+[[7753]],
+[[7754]],
+[[7755]],
+[[7756]],
+[[7757]],
+[[7758]],
+[[7759]],
+[[7760]],
+[[7761]],
+[[7762]],
+[[7763]],
+[[7764]],
+[[7765]],
+[[7766]],
+[[7767]],
+[[7768]],
+[[7769]],
+[[7770]],
+[[7771]],
+[[7772]],
+[[7773]],
+[[7774]],
+[[7775]],
+[[7776]],
+[[7777]],
+[[7778]],
+[[7779]],
+[[7780]],
+[[7781]],
+[[7782]],
+[[7783]],
+[[7784]],
+[[7785]],
+[[7786]],
+[[7787]],
+[[7788]],
+[[7789]],
+[[7790]],
+[[7791]],
+[[7792]],
+[[7793]],
+[[7794]],
+[[7795]],
+[[7796]],
+[[7797]],
+[[7798]],
+[[7799]],
+[[7800]],
+[[7801]],
+[[7802]],
+[[7803]],
+[[7804]],
+[[7805]],
+[[7806]],
+[[7807]],
+[[7808]],
+[[7809]],
+[[7810]],
+[[7811]],
+[[7812]],
+[[7813]],
+[[7814]],
+[[7815]],
+[[7816]],
+[[7817]],
+[[7818]],
+[[7819]],
+[[7820]],
+[[7821]],
+[[7822]],
+[[7823]],
+[[7824]],
+[[7825]],
+[[7826]],
+[[7827]],
+[[7828]],
+[[7829]],
+[[7830]],
+[[7831]],
+[[7832]],
+[[7833]],
+[[7834]],
+[[7835]],
+[[7836]],
+[[7837]],
+[[7838]],
+[[7839]],
+[[7840]],
+[[7841]],
+[[7842]],
+[[7843]],
+[[7844]],
+[[7845]],
+[[7846]],
+[[7847]],
+[[7848]],
+[[7849]],
+[[7850]],
+[[7851]],
+[[7852]],
+[[7853]],
+[[7854]],
+[[7855]],
+[[7856]],
+[[7857]],
+[[7858]],
+[[7859]],
+[[7860]],
+[[7861]],
+[[7862]],
+[[7863]],
+[[7864]],
+[[7865]],
+[[7866]],
+[[7867]],
+[[7868]],
+[[7869]],
+[[7870]],
+[[7871]],
+[[7872]],
+[[7873]],
+[[7874]],
+[[7875]],
+[[7876]],
+[[7877]],
+[[7878]],
+[[7879]],
+[[7880]],
+[[7881]],
+[[7882]],
+[[7883]],
+[[7884]],
+[[7885]],
+[[7886]],
+[[7887]],
+[[7888]],
+[[7889]],
+[[7890]],
+[[7891]],
+[[7892]],
+[[7893]],
+[[7894]],
+[[7895]],
+[[7896]],
+[[7897]],
+[[7898]],
+[[7899]],
+[[7900]],
+[[7901]],
+[[7902]],
+[[7903]],
+[[7904]],
+[[7905]],
+[[7906]],
+[[7907]],
+[[7908]],
+[[7909]],
+[[7910]],
+[[7911]],
+[[7912]],
+[[7913]],
+[[7914]],
+[[7915]],
+[[7916]],
+[[7917]],
+[[7918]],
+[[7919]],
+[[7920]],
+[[7921]],
+[[7922]],
+[[7923]],
+[[7924]],
+[[7925]],
+[[7926]],
+[[7927]],
+[[7928]],
+[[7929]],
+[[7930]],
+[[7931]],
+[[7932]],
+[[7933]],
+[[7934]],
+[[7935]],
+[[7936]],
+[[7937]],
+[[7938]],
+[[7939]],
+[[7940]],
+[[7941]],
+[[7942]],
+[[7943]],
+[[7944]],
+[[7945]],
+[[7946]],
+[[7947]],
+[[7948]],
+[[7949]],
+[[7950]],
+[[7951]],
+[[7952]],
+[[7953]],
+[[7954]],
+[[7955]],
+[[7956]],
+[[7957]],
+[[7958]],
+[[7959]],
+[[7960]],
+[[7961]],
+[[7962]],
+[[7963]],
+[[7964]],
+[[7965]],
+[[7966]],
+[[7967]],
+[[7968]],
+[[7969]],
+[[7970]],
+[[7971]],
+[[7972]],
+[[7973]],
+[[7974]],
+[[7975]],
+[[7976]],
+[[7977]],
+[[7978]],
+[[7979]],
+[[7980]],
+[[7981]],
+[[7982]],
+[[7983]],
+[[7984]],
+[[7985]],
+[[7986]],
+[[7987]],
+[[7988]],
+[[7989]],
+[[7990]],
+[[7991]],
+[[7992]],
+[[7993]],
+[[7994]],
+[[7995]],
+[[7996]],
+[[7997]],
+[[7998]],
+[[7999]],
+[[8000]],
+[[8001]],
+[[8002]],
+[[8003]],
+[[8004]],
+[[8005]],
+[[8006]],
+[[8007]],
+[[8008]],
+[[8009]],
+[[8010]],
+[[8011]],
+[[8012]],
+[[8013]],
+[[8014]],
+[[8015]],
+[[8016]],
+[[8017]],
+[[8018]],
+[[8019]],
+[[8020]],
+[[8021]],
+[[8022]],
+[[8023]],
+[[8024]],
+[[8025]],
+[[8026]],
+[[8027]],
+[[8028]],
+[[8029]],
+[[8030]],
+[[8031]],
+[[8032]],
+[[8033]],
+[[8034]],
+[[8035]],
+[[8036]],
+[[8037]],
+[[8038]],
+[[8039]],
+[[8040]],
+[[8041]],
+[[8042]],
+[[8043]],
+[[8044]],
+[[8045]],
+[[8046]],
+[[8047]],
+[[8048]],
+[[8049]],
+[[8050]],
+[[8051]],
+[[8052]],
+[[8053]],
+[[8054]],
+[[8055]],
+[[8056]],
+[[8057]],
+[[8058]],
+[[8059]],
+[[8060]],
+[[8061]],
+[[8062]],
+[[8063]],
+[[8064]],
+[[8065]],
+[[8066]],
+[[8067]],
+[[8068]],
+[[8069]],
+[[8070]],
+[[8071]],
+[[8072]],
+[[8073]],
+[[8074]],
+[[8075]],
+[[8076]],
+[[8077]],
+[[8078]],
+[[8079]],
+[[8080]],
+[[8081]],
+[[8082]],
+[[8083]],
+[[8084]],
+[[8085]],
+[[8086]],
+[[8087]],
+[[8088]],
+[[8089]],
+[[8090]],
+[[8091]],
+[[8092]],
+[[8093]],
+[[8094]],
+[[8095]],
+[[8096]],
+[[8097]],
+[[8098]],
+[[8099]],
+[[8100]],
+[[8101]],
+[[8102]],
+[[8103]],
+[[8104]],
+[[8105]],
+[[8106]],
+[[8107]],
+[[8108]],
+[[8109]],
+[[8110]],
+[[8111]],
+[[8112]],
+[[8113]],
+[[8114]],
+[[8115]],
+[[8116]],
+[[8117]],
+[[8118]],
+[[8119]],
+[[8120]],
+[[8121]],
+[[8122]],
+[[8123]],
+[[8124]],
+[[8125]],
+[[8126]],
+[[8127]],
+[[8128]],
+[[8129]],
+[[8130]],
+[[8131]],
+[[8132]],
+[[8133]],
+[[8134]],
+[[8135]],
+[[8136]],
+[[8137]],
+[[8138]],
+[[8139]],
+[[8140]],
+[[8141]],
+[[8142]],
+[[8143]],
+[[8144]],
+[[8145]],
+[[8146]],
+[[8147]],
+[[8148]],
+[[8149]],
+[[8150]],
+[[8151]],
+[[8152]],
+[[8153]],
+[[8154]],
+[[8155]],
+[[8156]],
+[[8157]],
+[[8158]],
+[[8159]],
+[[8160]],
+[[8161]],
+[[8162]],
+[[8163]],
+[[8164]],
+[[8165]],
+[[8166]],
+[[8167]],
+[[8168]],
+[[8169]],
+[[8170]],
+[[8171]],
+[[8172]],
+[[8173]],
+[[8174]],
+[[8175]],
+[[8176]],
+[[8177]],
+[[8178]],
+[[8179]],
+[[8180]],
+[[8181]],
+[[8182]],
+[[8183]],
+[[8184]],
+[[8185]],
+[[8186]],
+[[8187]],
+[[8188]],
+[[8189]],
+[[8190]],
+[[8191]],
+[[8192]],
+[[8193]],
+[[8194]],
+[[8195]],
+[[8196]],
+[[8197]],
+[[8198]],
+[[8199]],
+[[8200]],
+[[8201]],
+[[8202]],
+[[8203]],
+[[8204]],
+[[8205]],
+[[8206]],
+[[8207]],
+[[8208]],
+[[8209]],
+[[8210]],
+[[8211]],
+[[8212]],
+[[8213]],
+[[8214]],
+[[8215]],
+[[8216]],
+[[8217]],
+[[8218]],
+[[8219]],
+[[8220]],
+[[8221]],
+[[8222]],
+[[8223]],
+[[8224]],
+[[8225]],
+[[8226]],
+[[8227]],
+[[8228]],
+[[8229]],
+[[8230]],
+[[8231]],
+[[8232]],
+[[8233]],
+[[8234]],
+[[8235]],
+[[8236]],
+[[8237]],
+[[8238]],
+[[8239]],
+[[8240]],
+[[8241]],
+[[8242]],
+[[8243]],
+[[8244]],
+[[8245]],
+[[8246]],
+[[8247]],
+[[8248]],
+[[8249]],
+[[8250]],
+[[8251]],
+[[8252]],
+[[8253]],
+[[8254]],
+[[8255]],
+[[8256]],
+[[8257]],
+[[8258]],
+[[8259]],
+[[8260]],
+[[8261]],
+[[8262]],
+[[8263]],
+[[8264]],
+[[8265]],
+[[8266]],
+[[8267]],
+[[8268]],
+[[8269]],
+[[8270]],
+[[8271]],
+[[8272]],
+[[8273]],
+[[8274]],
+[[8275]],
+[[8276]],
+[[8277]],
+[[8278]],
+[[8279]],
+[[8280]],
+[[8281]],
+[[8282]],
+[[8283]],
+[[8284]],
+[[8285]],
+[[8286]],
+[[8287]],
+[[8288]],
+[[8289]],
+[[8290]],
+[[8291]],
+[[8292]],
+[[8293]],
+[[8294]],
+[[8295]],
+[[8296]],
+[[8297]],
+[[8298]],
+[[8299]],
+[[8300]],
+[[8301]],
+[[8302]],
+[[8303]],
+[[8304]],
+[[8305]],
+[[8306]],
+[[8307]],
+[[8308]],
+[[8309]],
+[[8310]],
+[[8311]],
+[[8312]],
+[[8313]],
+[[8314]],
+[[8315]],
+[[8316]],
+[[8317]],
+[[8318]],
+[[8319]],
+[[8320]],
+[[8321]],
+[[8322]],
+[[8323]],
+[[8324]],
+[[8325]],
+[[8326]],
+[[8327]],
+[[8328]],
+[[8329]],
+[[8330]],
+[[8331]],
+[[8332]],
+[[8333]],
+[[8334]],
+[[8335]],
+[[8336]],
+[[8337]],
+[[8338]],
+[[8339]],
+[[8340]],
+[[8341]],
+[[8342]],
+[[8343]],
+[[8344]],
+[[8345]],
+[[8346]],
+[[8347]],
+[[8348]],
+[[8349]],
+[[8350]],
+[[8351]],
+[[8352]],
+[[8353]],
+[[8354]],
+[[8355]],
+[[8356]],
+[[8357]],
+[[8358]],
+[[8359]],
+[[8360]],
+[[8361]],
+[[8362]],
+[[8363]],
+[[8364]],
+[[8365]],
+[[8366]],
+[[8367]],
+[[8368]],
+[[8369]],
+[[8370]],
+[[8371]],
+[[8372]],
+[[8373]],
+[[8374]],
+[[8375]],
+[[8376]],
+[[8377]],
+[[8378]],
+[[8379]],
+[[8380]],
+[[8381]],
+[[8382]],
+[[8383]],
+[[8384]],
+[[8385]],
+[[8386]],
+[[8387]],
+[[8388]],
+[[8389]],
+[[8390]],
+[[8391]],
+[[8392]],
+[[8393]],
+[[8394]],
+[[8395]],
+[[8396]],
+[[8397]],
+[[8398]],
+[[8399]],
+[[8400]],
+[[8401]],
+[[8402]],
+[[8403]],
+[[8404]],
+[[8405]],
+[[8406]],
+[[8407]],
+[[8408]],
+[[8409]],
+[[8410]],
+[[8411]],
+[[8412]],
+[[8413]],
+[[8414]],
+[[8415]],
+[[8416]],
+[[8417]],
+[[8418]],
+[[8419]],
+[[8420]],
+[[8421]],
+[[8422]],
+[[8423]],
+[[8424]],
+[[8425]],
+[[8426]],
+[[8427]],
+[[8428]],
+[[8429]],
+[[8430]],
+[[8431]],
+[[8432]],
+[[8433]],
+[[8434]],
+[[8435]],
+[[8436]],
+[[8437]],
+[[8438]],
+[[8439]],
+[[8440]],
+[[8441]],
+[[8442]],
+[[8443]],
+[[8444]],
+[[8445]],
+[[8446]],
+[[8447]],
+[[8448]],
+[[8449]],
+[[8450]],
+[[8451]],
+[[8452]],
+[[8453]],
+[[8454]],
+[[8455]],
+[[8456]],
+[[8457]],
+[[8458]],
+[[8459]],
+[[8460]],
+[[8461]],
+[[8462]],
+[[8463]],
+[[8464]],
+[[8465]],
+[[8466]],
+[[8467]],
+[[8468]],
+[[8469]],
+[[8470]],
+[[8471]],
+[[8472]],
+[[8473]],
+[[8474]],
+[[8475]],
+[[8476]],
+[[8477]],
+[[8478]],
+[[8479]],
+[[8480]],
+[[8481]],
+[[8482]],
+[[8483]],
+[[8484]],
+[[8485]],
+[[8486]],
+[[8487]],
+[[8488]],
+[[8489]],
+[[8490]],
+[[8491]],
+[[8492]],
+[[8493]],
+[[8494]],
+[[8495]],
+[[8496]],
+[[8497]],
+[[8498]],
+[[8499]],
+[[8500]],
+[[8501]],
+[[8502]],
+[[8503]],
+[[8504]],
+[[8505]],
+[[8506]],
+[[8507]],
+[[8508]],
+[[8509]],
+[[8510]],
+[[8511]],
+[[8512]],
+[[8513]],
+[[8514]],
+[[8515]],
+[[8516]],
+[[8517]],
+[[8518]],
+[[8519]],
+[[8520]],
+[[8521]],
+[[8522]],
+[[8523]],
+[[8524]],
+[[8525]],
+[[8526]],
+[[8527]],
+[[8528]],
+[[8529]],
+[[8530]],
+[[8531]],
+[[8532]],
+[[8533]],
+[[8534]],
+[[8535]],
+[[8536]],
+[[8537]],
+[[8538]],
+[[8539]],
+[[8540]],
+[[8541]],
+[[8542]],
+[[8543]],
+[[8544]],
+[[8545]],
+[[8546]],
+[[8547]],
+[[8548]],
+[[8549]],
+[[8550]],
+[[8551]],
+[[8552]],
+[[8553]],
+[[8554]],
+[[8555]],
+[[8556]],
+[[8557]],
+[[8558]],
+[[8559]],
+[[8560]],
+[[8561]],
+[[8562]],
+[[8563]],
+[[8564]],
+[[8565]],
+[[8566]],
+[[8567]],
+[[8568]],
+[[8569]],
+[[8570]],
+[[8571]],
+[[8572]],
+[[8573]],
+[[8574]],
+[[8575]],
+[[8576]],
+[[8577]],
+[[8578]],
+[[8579]],
+[[8580]],
+[[8581]],
+[[8582]],
+[[8583]],
+[[8584]],
+[[8585]],
+[[8586]],
+[[8587]],
+[[8588]],
+[[8589]],
+[[8590]],
+[[8591]],
+[[8592]],
+[[8593]],
+[[8594]],
+[[8595]],
+[[8596]],
+[[8597]],
+[[8598]],
+[[8599]],
+[[8600]],
+[[8601]],
+[[8602]],
+[[8603]],
+[[8604]],
+[[8605]],
+[[8606]],
+[[8607]],
+[[8608]],
+[[8609]],
+[[8610]],
+[[8611]],
+[[8612]],
+[[8613]],
+[[8614]],
+[[8615]],
+[[8616]],
+[[8617]],
+[[8618]],
+[[8619]],
+[[8620]],
+[[8621]],
+[[8622]],
+[[8623]],
+[[8624]],
+[[8625]],
+[[8626]],
+[[8627]],
+[[8628]],
+[[8629]],
+[[8630]],
+[[8631]],
+[[8632]],
+[[8633]],
+[[8634]],
+[[8635]],
+[[8636]],
+[[8637]],
+[[8638]],
+[[8639]],
+[[8640]],
+[[8641]],
+[[8642]],
+[[8643]],
+[[8644]],
+[[8645]],
+[[8646]],
+[[8647]],
+[[8648]],
+[[8649]],
+[[8650]],
+[[8651]],
+[[8652]],
+[[8653]],
+[[8654]],
+[[8655]],
+[[8656]],
+[[8657]],
+[[8658]],
+[[8659]],
+[[8660]],
+[[8661]],
+[[8662]],
+[[8663]],
+[[8664]],
+[[8665]],
+[[8666]],
+[[8667]],
+[[8668]],
+[[8669]],
+[[8670]],
+[[8671]],
+[[8672]],
+[[8673]],
+[[8674]],
+[[8675]],
+[[8676]],
+[[8677]],
+[[8678]],
+[[8679]],
+[[8680]],
+[[8681]],
+[[8682]],
+[[8683]],
+[[8684]],
+[[8685]],
+[[8686]],
+[[8687]],
+[[8688]],
+[[8689]],
+[[8690]],
+[[8691]],
+[[8692]],
+[[8693]],
+[[8694]],
+[[8695]],
+[[8696]],
+[[8697]],
+[[8698]],
+[[8699]],
+[[8700]],
+[[8701]],
+[[8702]],
+[[8703]],
+[[8704]],
+[[8705]],
+[[8706]],
+[[8707]],
+[[8708]],
+[[8709]],
+[[8710]],
+[[8711]],
+[[8712]],
+[[8713]],
+[[8714]],
+[[8715]],
+[[8716]],
+[[8717]],
+[[8718]],
+[[8719]],
+[[8720]],
+[[8721]],
+[[8722]],
+[[8723]],
+[[8724]],
+[[8725]],
+[[8726]],
+[[8727]],
+[[8728]],
+[[8729]],
+[[8730]],
+[[8731]],
+[[8732]],
+[[8733]],
+[[8734]],
+[[8735]],
+[[8736]],
+[[8737]],
+[[8738]],
+[[8739]],
+[[8740]],
+[[8741]],
+[[8742]],
+[[8743]],
+[[8744]],
+[[8745]],
+[[8746]],
+[[8747]],
+[[8748]],
+[[8749]],
+[[8750]],
+[[8751]],
+[[8752]],
+[[8753]],
+[[8754]],
+[[8755]],
+[[8756]],
+[[8757]],
+[[8758]],
+[[8759]],
+[[8760]],
+[[8761]],
+[[8762]],
+[[8763]],
+[[8764]],
+[[8765]],
+[[8766]],
+[[8767]],
+[[8768]],
+[[8769]],
+[[8770]],
+[[8771]],
+[[8772]],
+[[8773]],
+[[8774]],
+[[8775]],
+[[8776]],
+[[8777]],
+[[8778]],
+[[8779]],
+[[8780]],
+[[8781]],
+[[8782]],
+[[8783]],
+[[8784]],
+[[8785]],
+[[8786]],
+[[8787]],
+[[8788]],
+[[8789]],
+[[8790]],
+[[8791]],
+[[8792]],
+[[8793]],
+[[8794]],
+[[8795]],
+[[8796]],
+[[8797]],
+[[8798]],
+[[8799]],
+[[8800]],
+[[8801]],
+[[8802]],
+[[8803]],
+[[8804]],
+[[8805]],
+[[8806]],
+[[8807]],
+[[8808]],
+[[8809]],
+[[8810]],
+[[8811]],
+[[8812]],
+[[8813]],
+[[8814]],
+[[8815]],
+[[8816]],
+[[8817]],
+[[8818]],
+[[8819]],
+[[8820]],
+[[8821]],
+[[8822]],
+[[8823]],
+[[8824]],
+[[8825]],
+[[8826]],
+[[8827]],
+[[8828]],
+[[8829]],
+[[8830]],
+[[8831]],
+[[8832]],
+[[8833]],
+[[8834]],
+[[8835]],
+[[8836]],
+[[8837]],
+[[8838]],
+[[8839]],
+[[8840]],
+[[8841]],
+[[8842]],
+[[8843]],
+[[8844]],
+[[8845]],
+[[8846]],
+[[8847]],
+[[8848]],
+[[8849]],
+[[8850]],
+[[8851]],
+[[8852]],
+[[8853]],
+[[8854]],
+[[8855]],
+[[8856]],
+[[8857]],
+[[8858]],
+[[8859]],
+[[8860]],
+[[8861]],
+[[8862]],
+[[8863]],
+[[8864]],
+[[8865]],
+[[8866]],
+[[8867]],
+[[8868]],
+[[8869]],
+[[8870]],
+[[8871]],
+[[8872]],
+[[8873]],
+[[8874]],
+[[8875]],
+[[8876]],
+[[8877]],
+[[8878]],
+[[8879]],
+[[8880]],
+[[8881]],
+[[8882]],
+[[8883]],
+[[8884]],
+[[8885]],
+[[8886]],
+[[8887]],
+[[8888]],
+[[8889]],
+[[8890]],
+[[8891]],
+[[8892]],
+[[8893]],
+[[8894]],
+[[8895]],
+[[8896]],
+[[8897]],
+[[8898]],
+[[8899]],
+[[8900]],
+[[8901]],
+[[8902]],
+[[8903]],
+[[8904]],
+[[8905]],
+[[8906]],
+[[8907]],
+[[8908]],
+[[8909]],
+[[8910]],
+[[8911]],
+[[8912]],
+[[8913]],
+[[8914]],
+[[8915]],
+[[8916]],
+[[8917]],
+[[8918]],
+[[8919]],
+[[8920]],
+[[8921]],
+[[8922]],
+[[8923]],
+[[8924]],
+[[8925]],
+[[8926]],
+[[8927]],
+[[8928]],
+[[8929]],
+[[8930]],
+[[8931]],
+[[8932]],
+[[8933]],
+[[8934]],
+[[8935]],
+[[8936]],
+[[8937]],
+[[8938]],
+[[8939]],
+[[8940]],
+[[8941]],
+[[8942]],
+[[8943]],
+[[8944]],
+[[8945]],
+[[8946]],
+[[8947]],
+[[8948]],
+[[8949]],
+[[8950]],
+[[8951]],
+[[8952]],
+[[8953]],
+[[8954]],
+[[8955]],
+[[8956]],
+[[8957]],
+[[8958]],
+[[8959]],
+[[8960]],
+[[8961]],
+[[8962]],
+[[8963]],
+[[8964]],
+[[8965]],
+[[8966]],
+[[8967]],
+[[8968]],
+[[8969]],
+[[8970]],
+[[8971]],
+[[8972]],
+[[8973]],
+[[8974]],
+[[8975]],
+[[8976]],
+[[8977]],
+[[8978]],
+[[8979]],
+[[8980]],
+[[8981]],
+[[8982]],
+[[8983]],
+[[8984]],
+[[8985]],
+[[8986]],
+[[8987]],
+[[8988]],
+[[8989]],
+[[8990]],
+[[8991]],
+[[8992]],
+[[8993]],
+[[8994]],
+[[8995]],
+[[8996]],
+[[8997]],
+[[8998]],
+[[8999]],
+[[9000]],
+[[9001]],
+[[9002]],
+[[9003]],
+[[9004]],
+[[9005]],
+[[9006]],
+[[9007]],
+[[9008]],
+[[9009]],
+[[9010]],
+[[9011]],
+[[9012]],
+[[9013]],
+[[9014]],
+[[9015]],
+[[9016]],
+[[9017]],
+[[9018]],
+[[9019]],
+[[9020]],
+[[9021]],
+[[9022]],
+[[9023]],
+[[9024]],
+[[9025]],
+[[9026]],
+[[9027]],
+[[9028]],
+[[9029]],
+[[9030]],
+[[9031]],
+[[9032]],
+[[9033]],
+[[9034]],
+[[9035]],
+[[9036]],
+[[9037]],
+[[9038]],
+[[9039]],
+[[9040]],
+[[9041]],
+[[9042]],
+[[9043]],
+[[9044]],
+[[9045]],
+[[9046]],
+[[9047]],
+[[9048]],
+[[9049]],
+[[9050]],
+[[9051]],
+[[9052]],
+[[9053]],
+[[9054]],
+[[9055]],
+[[9056]],
+[[9057]],
+[[9058]],
+[[9059]],
+[[9060]],
+[[9061]],
+[[9062]],
+[[9063]],
+[[9064]],
+[[9065]],
+[[9066]],
+[[9067]],
+[[9068]],
+[[9069]],
+[[9070]],
+[[9071]],
+[[9072]],
+[[9073]],
+[[9074]],
+[[9075]],
+[[9076]],
+[[9077]],
+[[9078]],
+[[9079]],
+[[9080]],
+[[9081]],
+[[9082]],
+[[9083]],
+[[9084]],
+[[9085]],
+[[9086]],
+[[9087]],
+[[9088]],
+[[9089]],
+[[9090]],
+[[9091]],
+[[9092]],
+[[9093]],
+[[9094]],
+[[9095]],
+[[9096]],
+[[9097]],
+[[9098]],
+[[9099]],
+[[9100]],
+[[9101]],
+[[9102]],
+[[9103]],
+[[9104]],
+[[9105]],
+[[9106]],
+[[9107]],
+[[9108]],
+[[9109]],
+[[9110]],
+[[9111]],
+[[9112]],
+[[9113]],
+[[9114]],
+[[9115]],
+[[9116]],
+[[9117]],
+[[9118]],
+[[9119]],
+[[9120]],
+[[9121]],
+[[9122]],
+[[9123]],
+[[9124]],
+[[9125]],
+[[9126]],
+[[9127]],
+[[9128]],
+[[9129]],
+[[9130]],
+[[9131]],
+[[9132]],
+[[9133]],
+[[9134]],
+[[9135]],
+[[9136]],
+[[9137]],
+[[9138]],
+[[9139]],
+[[9140]],
+[[9141]],
+[[9142]],
+[[9143]],
+[[9144]],
+[[9145]],
+[[9146]],
+[[9147]],
+[[9148]],
+[[9149]],
+[[9150]],
+[[9151]],
+[[9152]],
+[[9153]],
+[[9154]],
+[[9155]],
+[[9156]],
+[[9157]],
+[[9158]],
+[[9159]],
+[[9160]],
+[[9161]],
+[[9162]],
+[[9163]],
+[[9164]],
+[[9165]],
+[[9166]],
+[[9167]],
+[[9168]],
+[[9169]],
+[[9170]],
+[[9171]],
+[[9172]],
+[[9173]],
+[[9174]],
+[[9175]],
+[[9176]],
+[[9177]],
+[[9178]],
+[[9179]],
+[[9180]],
+[[9181]],
+[[9182]],
+[[9183]],
+[[9184]],
+[[9185]],
+[[9186]],
+[[9187]],
+[[9188]],
+[[9189]],
+[[9190]],
+[[9191]],
+[[9192]],
+[[9193]],
+[[9194]],
+[[9195]],
+[[9196]],
+[[9197]],
+[[9198]],
+[[9199]],
+[[9200]],
+[[9201]],
+[[9202]],
+[[9203]],
+[[9204]],
+[[9205]],
+[[9206]],
+[[9207]],
+[[9208]],
+[[9209]],
+[[9210]],
+[[9211]],
+[[9212]],
+[[9213]],
+[[9214]],
+[[9215]],
+[[9216]],
+[[9217]],
+[[9218]],
+[[9219]],
+[[9220]],
+[[9221]],
+[[9222]],
+[[9223]],
+[[9224]],
+[[9225]],
+[[9226]],
+[[9227]],
+[[9228]],
+[[9229]],
+[[9230]],
+[[9231]],
+[[9232]],
+[[9233]],
+[[9234]],
+[[9235]],
+[[9236]],
+[[9237]],
+[[9238]],
+[[9239]],
+[[9240]],
+[[9241]],
+[[9242]],
+[[9243]],
+[[9244]],
+[[9245]],
+[[9246]],
+[[9247]],
+[[9248]],
+[[9249]],
+[[9250]],
+[[9251]],
+[[9252]],
+[[9253]],
+[[9254]],
+[[9255]],
+[[9256]],
+[[9257]],
+[[9258]],
+[[9259]],
+[[9260]],
+[[9261]],
+[[9262]],
+[[9263]],
+[[9264]],
+[[9265]],
+[[9266]],
+[[9267]],
+[[9268]],
+[[9269]],
+[[9270]],
+[[9271]],
+[[9272]],
+[[9273]],
+[[9274]],
+[[9275]],
+[[9276]],
+[[9277]],
+[[9278]],
+[[9279]],
+[[9280]],
+[[9281]],
+[[9282]],
+[[9283]],
+[[9284]],
+[[9285]],
+[[9286]],
+[[9287]],
+[[9288]],
+[[9289]],
+[[9290]],
+[[9291]],
+[[9292]],
+[[9293]],
+[[9294]],
+[[9295]],
+[[9296]],
+[[9297]],
+[[9298]],
+[[9299]],
+[[9300]],
+[[9301]],
+[[9302]],
+[[9303]],
+[[9304]],
+[[9305]],
+[[9306]],
+[[9307]],
+[[9308]],
+[[9309]],
+[[9310]],
+[[9311]],
+[[9312]],
+[[9313]],
+[[9314]],
+[[9315]],
+[[9316]],
+[[9317]],
+[[9318]],
+[[9319]],
+[[9320]],
+[[9321]],
+[[9322]],
+[[9323]],
+[[9324]],
+[[9325]],
+[[9326]],
+[[9327]],
+[[9328]],
+[[9329]],
+[[9330]],
+[[9331]],
+[[9332]],
+[[9333]],
+[[9334]],
+[[9335]],
+[[9336]],
+[[9337]],
+[[9338]],
+[[9339]],
+[[9340]],
+[[9341]],
+[[9342]],
+[[9343]],
+[[9344]],
+[[9345]],
+[[9346]],
+[[9347]],
+[[9348]],
+[[9349]],
+[[9350]],
+[[9351]],
+[[9352]],
+[[9353]],
+[[9354]],
+[[9355]],
+[[9356]],
+[[9357]],
+[[9358]],
+[[9359]],
+[[9360]],
+[[9361]],
+[[9362]],
+[[9363]],
+[[9364]],
+[[9365]],
+[[9366]],
+[[9367]],
+[[9368]],
+[[9369]],
+[[9370]],
+[[9371]],
+[[9372]],
+[[9373]],
+[[9374]],
+[[9375]],
+[[9376]],
+[[9377]],
+[[9378]],
+[[9379]],
+[[9380]],
+[[9381]],
+[[9382]],
+[[9383]],
+[[9384]],
+[[9385]],
+[[9386]],
+[[9387]],
+[[9388]],
+[[9389]],
+[[9390]],
+[[9391]],
+[[9392]],
+[[9393]],
+[[9394]],
+[[9395]],
+[[9396]],
+[[9397]],
+[[9398]],
+[[9399]],
+[[9400]],
+[[9401]],
+[[9402]],
+[[9403]],
+[[9404]],
+[[9405]],
+[[9406]],
+[[9407]],
+[[9408]],
+[[9409]],
+[[9410]],
+[[9411]],
+[[9412]],
+[[9413]],
+[[9414]],
+[[9415]],
+[[9416]],
+[[9417]],
+[[9418]],
+[[9419]],
+[[9420]],
+[[9421]],
+[[9422]],
+[[9423]],
+[[9424]],
+[[9425]],
+[[9426]],
+[[9427]],
+[[9428]],
+[[9429]],
+[[9430]],
+[[9431]],
+[[9432]],
+[[9433]],
+[[9434]],
+[[9435]],
+[[9436]],
+[[9437]],
+[[9438]],
+[[9439]],
+[[9440]],
+[[9441]],
+[[9442]],
+[[9443]],
+[[9444]],
+[[9445]],
+[[9446]],
+[[9447]],
+[[9448]],
+[[9449]],
+[[9450]],
+[[9451]],
+[[9452]],
+[[9453]],
+[[9454]],
+[[9455]],
+[[9456]],
+[[9457]],
+[[9458]],
+[[9459]],
+[[9460]],
+[[9461]],
+[[9462]],
+[[9463]],
+[[9464]],
+[[9465]],
+[[9466]],
+[[9467]],
+[[9468]],
+[[9469]],
+[[9470]],
+[[9471]],
+[[9472]],
+[[9473]],
+[[9474]],
+[[9475]],
+[[9476]],
+[[9477]],
+[[9478]],
+[[9479]],
+[[9480]],
+[[9481]],
+[[9482]],
+[[9483]],
+[[9484]],
+[[9485]],
+[[9486]],
+[[9487]],
+[[9488]],
+[[9489]],
+[[9490]],
+[[9491]],
+[[9492]],
+[[9493]],
+[[9494]],
+[[9495]],
+[[9496]],
+[[9497]],
+[[9498]],
+[[9499]],
+[[9500]],
+[[9501]],
+[[9502]],
+[[9503]],
+[[9504]],
+[[9505]],
+[[9506]],
+[[9507]],
+[[9508]],
+[[9509]],
+[[9510]],
+[[9511]],
+[[9512]],
+[[9513]],
+[[9514]],
+[[9515]],
+[[9516]],
+[[9517]],
+[[9518]],
+[[9519]],
+[[9520]],
+[[9521]],
+[[9522]],
+[[9523]],
+[[9524]],
+[[9525]],
+[[9526]],
+[[9527]],
+[[9528]],
+[[9529]],
+[[9530]],
+[[9531]],
+[[9532]],
+[[9533]],
+[[9534]],
+[[9535]],
+[[9536]],
+[[9537]],
+[[9538]],
+[[9539]],
+[[9540]],
+[[9541]],
+[[9542]],
+[[9543]],
+[[9544]],
+[[9545]],
+[[9546]],
+[[9547]],
+[[9548]],
+[[9549]],
+[[9550]],
+[[9551]],
+[[9552]],
+[[9553]],
+[[9554]],
+[[9555]],
+[[9556]],
+[[9557]],
+[[9558]],
+[[9559]],
+[[9560]],
+[[9561]],
+[[9562]],
+[[9563]],
+[[9564]],
+[[9565]],
+[[9566]],
+[[9567]],
+[[9568]],
+[[9569]],
+[[9570]],
+[[9571]],
+[[9572]],
+[[9573]],
+[[9574]],
+[[9575]],
+[[9576]],
+[[9577]],
+[[9578]],
+[[9579]],
+[[9580]],
+[[9581]],
+[[9582]],
+[[9583]],
+[[9584]],
+[[9585]],
+[[9586]],
+[[9587]],
+[[9588]],
+[[9589]],
+[[9590]],
+[[9591]],
+[[9592]],
+[[9593]],
+[[9594]],
+[[9595]],
+[[9596]],
+[[9597]],
+[[9598]],
+[[9599]],
+[[9600]],
+[[9601]],
+[[9602]],
+[[9603]],
+[[9604]],
+[[9605]],
+[[9606]],
+[[9607]],
+[[9608]],
+[[9609]],
+[[9610]],
+[[9611]],
+[[9612]],
+[[9613]],
+[[9614]],
+[[9615]],
+[[9616]],
+[[9617]],
+[[9618]],
+[[9619]],
+[[9620]],
+[[9621]],
+[[9622]],
+[[9623]],
+[[9624]],
+[[9625]],
+[[9626]],
+[[9627]],
+[[9628]],
+[[9629]],
+[[9630]],
+[[9631]],
+[[9632]],
+[[9633]],
+[[9634]],
+[[9635]],
+[[9636]],
+[[9637]],
+[[9638]],
+[[9639]],
+[[9640]],
+[[9641]],
+[[9642]],
+[[9643]],
+[[9644]],
+[[9645]],
+[[9646]],
+[[9647]],
+[[9648]],
+[[9649]],
+[[9650]],
+[[9651]],
+[[9652]],
+[[9653]],
+[[9654]],
+[[9655]],
+[[9656]],
+[[9657]],
+[[9658]],
+[[9659]],
+[[9660]],
+[[9661]],
+[[9662]],
+[[9663]],
+[[9664]],
+[[9665]],
+[[9666]],
+[[9667]],
+[[9668]],
+[[9669]],
+[[9670]],
+[[9671]],
+[[9672]],
+[[9673]],
+[[9674]],
+[[9675]],
+[[9676]],
+[[9677]],
+[[9678]],
+[[9679]],
+[[9680]],
+[[9681]],
+[[9682]],
+[[9683]],
+[[9684]],
+[[9685]],
+[[9686]],
+[[9687]],
+[[9688]],
+[[9689]],
+[[9690]],
+[[9691]],
+[[9692]],
+[[9693]],
+[[9694]],
+[[9695]],
+[[9696]],
+[[9697]],
+[[9698]],
+[[9699]],
+[[9700]],
+[[9701]],
+[[9702]],
+[[9703]],
+[[9704]],
+[[9705]],
+[[9706]],
+[[9707]],
+[[9708]],
+[[9709]],
+[[9710]],
+[[9711]],
+[[9712]],
+[[9713]],
+[[9714]],
+[[9715]],
+[[9716]],
+[[9717]],
+[[9718]],
+[[9719]],
+[[9720]],
+[[9721]],
+[[9722]],
+[[9723]],
+[[9724]],
+[[9725]],
+[[9726]],
+[[9727]],
+[[9728]],
+[[9729]],
+[[9730]],
+[[9731]],
+[[9732]],
+[[9733]],
+[[9734]],
+[[9735]],
+[[9736]],
+[[9737]],
+[[9738]],
+[[9739]],
+[[9740]],
+[[9741]],
+[[9742]],
+[[9743]],
+[[9744]],
+[[9745]],
+[[9746]],
+[[9747]],
+[[9748]],
+[[9749]],
+[[9750]],
+[[9751]],
+[[9752]],
+[[9753]],
+[[9754]],
+[[9755]],
+[[9756]],
+[[9757]],
+[[9758]],
+[[9759]],
+[[9760]],
+[[9761]],
+[[9762]],
+[[9763]],
+[[9764]],
+[[9765]],
+[[9766]],
+[[9767]],
+[[9768]],
+[[9769]],
+[[9770]],
+[[9771]],
+[[9772]],
+[[9773]],
+[[9774]],
+[[9775]],
+[[9776]],
+[[9777]],
+[[9778]],
+[[9779]],
+[[9780]],
+[[9781]],
+[[9782]],
+[[9783]],
+[[9784]],
+[[9785]],
+[[9786]],
+[[9787]],
+[[9788]],
+[[9789]],
+[[9790]],
+[[9791]],
+[[9792]],
+[[9793]],
+[[9794]],
+[[9795]],
+[[9796]],
+[[9797]],
+[[9798]],
+[[9799]],
+[[9800]],
+[[9801]],
+[[9802]],
+[[9803]],
+[[9804]],
+[[9805]],
+[[9806]],
+[[9807]],
+[[9808]],
+[[9809]],
+[[9810]],
+[[9811]],
+[[9812]],
+[[9813]],
+[[9814]],
+[[9815]],
+[[9816]],
+[[9817]],
+[[9818]],
+[[9819]],
+[[9820]],
+[[9821]],
+[[9822]],
+[[9823]],
+[[9824]],
+[[9825]],
+[[9826]],
+[[9827]],
+[[9828]],
+[[9829]],
+[[9830]],
+[[9831]],
+[[9832]],
+[[9833]],
+[[9834]],
+[[9835]],
+[[9836]],
+[[9837]],
+[[9838]],
+[[9839]],
+[[9840]],
+[[9841]],
+[[9842]],
+[[9843]],
+[[9844]],
+[[9845]],
+[[9846]],
+[[9847]],
+[[9848]],
+[[9849]],
+[[9850]],
+[[9851]],
+[[9852]],
+[[9853]],
+[[9854]],
+[[9855]],
+[[9856]],
+[[9857]],
+[[9858]],
+[[9859]],
+[[9860]],
+[[9861]],
+[[9862]],
+[[9863]],
+[[9864]],
+[[9865]],
+[[9866]],
+[[9867]],
+[[9868]],
+[[9869]],
+[[9870]],
+[[9871]],
+[[9872]],
+[[9873]],
+[[9874]],
+[[9875]],
+[[9876]],
+[[9877]],
+[[9878]],
+[[9879]],
+[[9880]],
+[[9881]],
+[[9882]],
+[[9883]],
+[[9884]],
+[[9885]],
+[[9886]],
+[[9887]],
+[[9888]],
+[[9889]],
+[[9890]],
+[[9891]],
+[[9892]],
+[[9893]],
+[[9894]],
+[[9895]],
+[[9896]],
+[[9897]],
+[[9898]],
+[[9899]],
+[[9900]],
+[[9901]],
+[[9902]],
+[[9903]],
+[[9904]],
+[[9905]],
+[[9906]],
+[[9907]],
+[[9908]],
+[[9909]],
+[[9910]],
+[[9911]],
+[[9912]],
+[[9913]],
+[[9914]],
+[[9915]],
+[[9916]],
+[[9917]],
+[[9918]],
+[[9919]],
+[[9920]],
+[[9921]],
+[[9922]],
+[[9923]],
+[[9924]],
+[[9925]],
+[[9926]],
+[[9927]],
+[[9928]],
+[[9929]],
+[[9930]],
+[[9931]],
+[[9932]],
+[[9933]],
+[[9934]],
+[[9935]],
+[[9936]],
+[[9937]],
+[[9938]],
+[[9939]],
+[[9940]],
+[[9941]],
+[[9942]],
+[[9943]],
+[[9944]],
+[[9945]],
+[[9946]],
+[[9947]],
+[[9948]],
+[[9949]],
+[[9950]],
+[[9951]],
+[[9952]],
+[[9953]],
+[[9954]],
+[[9955]],
+[[9956]],
+[[9957]],
+[[9958]],
+[[9959]],
+[[9960]],
+[[9961]],
+[[9962]],
+[[9963]],
+[[9964]],
+[[9965]],
+[[9966]],
+[[9967]],
+[[9968]],
+[[9969]],
+[[9970]],
+[[9971]],
+[[9972]],
+[[9973]],
+[[9974]],
+[[9975]],
+[[9976]],
+[[9977]],
+[[9978]],
+[[9979]],
+[[9980]],
+[[9981]],
+[[9982]],
+[[9983]],
+[[9984]],
+[[9985]],
+[[9986]],
+[[9987]],
+[[9988]],
+[[9989]],
+[[9990]],
+[[9991]],
+[[9992]],
+[[9993]],
+[[9994]],
+[[9995]],
+[[9996]],
+[[9997]],
+[[9998]],
+[[9999]],
+];
+
+// 10,000 elements.
+const list2 = [
+[[0]],
+[[1]],
+[[2]],
+[[3]],
+[[4]],
+[[5]],
+[[6]],
+[[7]],
+[[8]],
+[[9]],
+[[10]],
+[[11]],
+[[12]],
+[[13]],
+[[14]],
+[[15]],
+[[16]],
+[[17]],
+[[18]],
+[[19]],
+[[20]],
+[[21]],
+[[22]],
+[[23]],
+[[24]],
+[[25]],
+[[26]],
+[[27]],
+[[28]],
+[[29]],
+[[30]],
+[[31]],
+[[32]],
+[[33]],
+[[34]],
+[[35]],
+[[36]],
+[[37]],
+[[38]],
+[[39]],
+[[40]],
+[[41]],
+[[42]],
+[[43]],
+[[44]],
+[[45]],
+[[46]],
+[[47]],
+[[48]],
+[[49]],
+[[50]],
+[[51]],
+[[52]],
+[[53]],
+[[54]],
+[[55]],
+[[56]],
+[[57]],
+[[58]],
+[[59]],
+[[60]],
+[[61]],
+[[62]],
+[[63]],
+[[64]],
+[[65]],
+[[66]],
+[[67]],
+[[68]],
+[[69]],
+[[70]],
+[[71]],
+[[72]],
+[[73]],
+[[74]],
+[[75]],
+[[76]],
+[[77]],
+[[78]],
+[[79]],
+[[80]],
+[[81]],
+[[82]],
+[[83]],
+[[84]],
+[[85]],
+[[86]],
+[[87]],
+[[88]],
+[[89]],
+[[90]],
+[[91]],
+[[92]],
+[[93]],
+[[94]],
+[[95]],
+[[96]],
+[[97]],
+[[98]],
+[[99]],
+[[100]],
+[[101]],
+[[102]],
+[[103]],
+[[104]],
+[[105]],
+[[106]],
+[[107]],
+[[108]],
+[[109]],
+[[110]],
+[[111]],
+[[112]],
+[[113]],
+[[114]],
+[[115]],
+[[116]],
+[[117]],
+[[118]],
+[[119]],
+[[120]],
+[[121]],
+[[122]],
+[[123]],
+[[124]],
+[[125]],
+[[126]],
+[[127]],
+[[128]],
+[[129]],
+[[130]],
+[[131]],
+[[132]],
+[[133]],
+[[134]],
+[[135]],
+[[136]],
+[[137]],
+[[138]],
+[[139]],
+[[140]],
+[[141]],
+[[142]],
+[[143]],
+[[144]],
+[[145]],
+[[146]],
+[[147]],
+[[148]],
+[[149]],
+[[150]],
+[[151]],
+[[152]],
+[[153]],
+[[154]],
+[[155]],
+[[156]],
+[[157]],
+[[158]],
+[[159]],
+[[160]],
+[[161]],
+[[162]],
+[[163]],
+[[164]],
+[[165]],
+[[166]],
+[[167]],
+[[168]],
+[[169]],
+[[170]],
+[[171]],
+[[172]],
+[[173]],
+[[174]],
+[[175]],
+[[176]],
+[[177]],
+[[178]],
+[[179]],
+[[180]],
+[[181]],
+[[182]],
+[[183]],
+[[184]],
+[[185]],
+[[186]],
+[[187]],
+[[188]],
+[[189]],
+[[190]],
+[[191]],
+[[192]],
+[[193]],
+[[194]],
+[[195]],
+[[196]],
+[[197]],
+[[198]],
+[[199]],
+[[200]],
+[[201]],
+[[202]],
+[[203]],
+[[204]],
+[[205]],
+[[206]],
+[[207]],
+[[208]],
+[[209]],
+[[210]],
+[[211]],
+[[212]],
+[[213]],
+[[214]],
+[[215]],
+[[216]],
+[[217]],
+[[218]],
+[[219]],
+[[220]],
+[[221]],
+[[222]],
+[[223]],
+[[224]],
+[[225]],
+[[226]],
+[[227]],
+[[228]],
+[[229]],
+[[230]],
+[[231]],
+[[232]],
+[[233]],
+[[234]],
+[[235]],
+[[236]],
+[[237]],
+[[238]],
+[[239]],
+[[240]],
+[[241]],
+[[242]],
+[[243]],
+[[244]],
+[[245]],
+[[246]],
+[[247]],
+[[248]],
+[[249]],
+[[250]],
+[[251]],
+[[252]],
+[[253]],
+[[254]],
+[[255]],
+[[256]],
+[[257]],
+[[258]],
+[[259]],
+[[260]],
+[[261]],
+[[262]],
+[[263]],
+[[264]],
+[[265]],
+[[266]],
+[[267]],
+[[268]],
+[[269]],
+[[270]],
+[[271]],
+[[272]],
+[[273]],
+[[274]],
+[[275]],
+[[276]],
+[[277]],
+[[278]],
+[[279]],
+[[280]],
+[[281]],
+[[282]],
+[[283]],
+[[284]],
+[[285]],
+[[286]],
+[[287]],
+[[288]],
+[[289]],
+[[290]],
+[[291]],
+[[292]],
+[[293]],
+[[294]],
+[[295]],
+[[296]],
+[[297]],
+[[298]],
+[[299]],
+[[300]],
+[[301]],
+[[302]],
+[[303]],
+[[304]],
+[[305]],
+[[306]],
+[[307]],
+[[308]],
+[[309]],
+[[310]],
+[[311]],
+[[312]],
+[[313]],
+[[314]],
+[[315]],
+[[316]],
+[[317]],
+[[318]],
+[[319]],
+[[320]],
+[[321]],
+[[322]],
+[[323]],
+[[324]],
+[[325]],
+[[326]],
+[[327]],
+[[328]],
+[[329]],
+[[330]],
+[[331]],
+[[332]],
+[[333]],
+[[334]],
+[[335]],
+[[336]],
+[[337]],
+[[338]],
+[[339]],
+[[340]],
+[[341]],
+[[342]],
+[[343]],
+[[344]],
+[[345]],
+[[346]],
+[[347]],
+[[348]],
+[[349]],
+[[350]],
+[[351]],
+[[352]],
+[[353]],
+[[354]],
+[[355]],
+[[356]],
+[[357]],
+[[358]],
+[[359]],
+[[360]],
+[[361]],
+[[362]],
+[[363]],
+[[364]],
+[[365]],
+[[366]],
+[[367]],
+[[368]],
+[[369]],
+[[370]],
+[[371]],
+[[372]],
+[[373]],
+[[374]],
+[[375]],
+[[376]],
+[[377]],
+[[378]],
+[[379]],
+[[380]],
+[[381]],
+[[382]],
+[[383]],
+[[384]],
+[[385]],
+[[386]],
+[[387]],
+[[388]],
+[[389]],
+[[390]],
+[[391]],
+[[392]],
+[[393]],
+[[394]],
+[[395]],
+[[396]],
+[[397]],
+[[398]],
+[[399]],
+[[400]],
+[[401]],
+[[402]],
+[[403]],
+[[404]],
+[[405]],
+[[406]],
+[[407]],
+[[408]],
+[[409]],
+[[410]],
+[[411]],
+[[412]],
+[[413]],
+[[414]],
+[[415]],
+[[416]],
+[[417]],
+[[418]],
+[[419]],
+[[420]],
+[[421]],
+[[422]],
+[[423]],
+[[424]],
+[[425]],
+[[426]],
+[[427]],
+[[428]],
+[[429]],
+[[430]],
+[[431]],
+[[432]],
+[[433]],
+[[434]],
+[[435]],
+[[436]],
+[[437]],
+[[438]],
+[[439]],
+[[440]],
+[[441]],
+[[442]],
+[[443]],
+[[444]],
+[[445]],
+[[446]],
+[[447]],
+[[448]],
+[[449]],
+[[450]],
+[[451]],
+[[452]],
+[[453]],
+[[454]],
+[[455]],
+[[456]],
+[[457]],
+[[458]],
+[[459]],
+[[460]],
+[[461]],
+[[462]],
+[[463]],
+[[464]],
+[[465]],
+[[466]],
+[[467]],
+[[468]],
+[[469]],
+[[470]],
+[[471]],
+[[472]],
+[[473]],
+[[474]],
+[[475]],
+[[476]],
+[[477]],
+[[478]],
+[[479]],
+[[480]],
+[[481]],
+[[482]],
+[[483]],
+[[484]],
+[[485]],
+[[486]],
+[[487]],
+[[488]],
+[[489]],
+[[490]],
+[[491]],
+[[492]],
+[[493]],
+[[494]],
+[[495]],
+[[496]],
+[[497]],
+[[498]],
+[[499]],
+[[500]],
+[[501]],
+[[502]],
+[[503]],
+[[504]],
+[[505]],
+[[506]],
+[[507]],
+[[508]],
+[[509]],
+[[510]],
+[[511]],
+[[512]],
+[[513]],
+[[514]],
+[[515]],
+[[516]],
+[[517]],
+[[518]],
+[[519]],
+[[520]],
+[[521]],
+[[522]],
+[[523]],
+[[524]],
+[[525]],
+[[526]],
+[[527]],
+[[528]],
+[[529]],
+[[530]],
+[[531]],
+[[532]],
+[[533]],
+[[534]],
+[[535]],
+[[536]],
+[[537]],
+[[538]],
+[[539]],
+[[540]],
+[[541]],
+[[542]],
+[[543]],
+[[544]],
+[[545]],
+[[546]],
+[[547]],
+[[548]],
+[[549]],
+[[550]],
+[[551]],
+[[552]],
+[[553]],
+[[554]],
+[[555]],
+[[556]],
+[[557]],
+[[558]],
+[[559]],
+[[560]],
+[[561]],
+[[562]],
+[[563]],
+[[564]],
+[[565]],
+[[566]],
+[[567]],
+[[568]],
+[[569]],
+[[570]],
+[[571]],
+[[572]],
+[[573]],
+[[574]],
+[[575]],
+[[576]],
+[[577]],
+[[578]],
+[[579]],
+[[580]],
+[[581]],
+[[582]],
+[[583]],
+[[584]],
+[[585]],
+[[586]],
+[[587]],
+[[588]],
+[[589]],
+[[590]],
+[[591]],
+[[592]],
+[[593]],
+[[594]],
+[[595]],
+[[596]],
+[[597]],
+[[598]],
+[[599]],
+[[600]],
+[[601]],
+[[602]],
+[[603]],
+[[604]],
+[[605]],
+[[606]],
+[[607]],
+[[608]],
+[[609]],
+[[610]],
+[[611]],
+[[612]],
+[[613]],
+[[614]],
+[[615]],
+[[616]],
+[[617]],
+[[618]],
+[[619]],
+[[620]],
+[[621]],
+[[622]],
+[[623]],
+[[624]],
+[[625]],
+[[626]],
+[[627]],
+[[628]],
+[[629]],
+[[630]],
+[[631]],
+[[632]],
+[[633]],
+[[634]],
+[[635]],
+[[636]],
+[[637]],
+[[638]],
+[[639]],
+[[640]],
+[[641]],
+[[642]],
+[[643]],
+[[644]],
+[[645]],
+[[646]],
+[[647]],
+[[648]],
+[[649]],
+[[650]],
+[[651]],
+[[652]],
+[[653]],
+[[654]],
+[[655]],
+[[656]],
+[[657]],
+[[658]],
+[[659]],
+[[660]],
+[[661]],
+[[662]],
+[[663]],
+[[664]],
+[[665]],
+[[666]],
+[[667]],
+[[668]],
+[[669]],
+[[670]],
+[[671]],
+[[672]],
+[[673]],
+[[674]],
+[[675]],
+[[676]],
+[[677]],
+[[678]],
+[[679]],
+[[680]],
+[[681]],
+[[682]],
+[[683]],
+[[684]],
+[[685]],
+[[686]],
+[[687]],
+[[688]],
+[[689]],
+[[690]],
+[[691]],
+[[692]],
+[[693]],
+[[694]],
+[[695]],
+[[696]],
+[[697]],
+[[698]],
+[[699]],
+[[700]],
+[[701]],
+[[702]],
+[[703]],
+[[704]],
+[[705]],
+[[706]],
+[[707]],
+[[708]],
+[[709]],
+[[710]],
+[[711]],
+[[712]],
+[[713]],
+[[714]],
+[[715]],
+[[716]],
+[[717]],
+[[718]],
+[[719]],
+[[720]],
+[[721]],
+[[722]],
+[[723]],
+[[724]],
+[[725]],
+[[726]],
+[[727]],
+[[728]],
+[[729]],
+[[730]],
+[[731]],
+[[732]],
+[[733]],
+[[734]],
+[[735]],
+[[736]],
+[[737]],
+[[738]],
+[[739]],
+[[740]],
+[[741]],
+[[742]],
+[[743]],
+[[744]],
+[[745]],
+[[746]],
+[[747]],
+[[748]],
+[[749]],
+[[750]],
+[[751]],
+[[752]],
+[[753]],
+[[754]],
+[[755]],
+[[756]],
+[[757]],
+[[758]],
+[[759]],
+[[760]],
+[[761]],
+[[762]],
+[[763]],
+[[764]],
+[[765]],
+[[766]],
+[[767]],
+[[768]],
+[[769]],
+[[770]],
+[[771]],
+[[772]],
+[[773]],
+[[774]],
+[[775]],
+[[776]],
+[[777]],
+[[778]],
+[[779]],
+[[780]],
+[[781]],
+[[782]],
+[[783]],
+[[784]],
+[[785]],
+[[786]],
+[[787]],
+[[788]],
+[[789]],
+[[790]],
+[[791]],
+[[792]],
+[[793]],
+[[794]],
+[[795]],
+[[796]],
+[[797]],
+[[798]],
+[[799]],
+[[800]],
+[[801]],
+[[802]],
+[[803]],
+[[804]],
+[[805]],
+[[806]],
+[[807]],
+[[808]],
+[[809]],
+[[810]],
+[[811]],
+[[812]],
+[[813]],
+[[814]],
+[[815]],
+[[816]],
+[[817]],
+[[818]],
+[[819]],
+[[820]],
+[[821]],
+[[822]],
+[[823]],
+[[824]],
+[[825]],
+[[826]],
+[[827]],
+[[828]],
+[[829]],
+[[830]],
+[[831]],
+[[832]],
+[[833]],
+[[834]],
+[[835]],
+[[836]],
+[[837]],
+[[838]],
+[[839]],
+[[840]],
+[[841]],
+[[842]],
+[[843]],
+[[844]],
+[[845]],
+[[846]],
+[[847]],
+[[848]],
+[[849]],
+[[850]],
+[[851]],
+[[852]],
+[[853]],
+[[854]],
+[[855]],
+[[856]],
+[[857]],
+[[858]],
+[[859]],
+[[860]],
+[[861]],
+[[862]],
+[[863]],
+[[864]],
+[[865]],
+[[866]],
+[[867]],
+[[868]],
+[[869]],
+[[870]],
+[[871]],
+[[872]],
+[[873]],
+[[874]],
+[[875]],
+[[876]],
+[[877]],
+[[878]],
+[[879]],
+[[880]],
+[[881]],
+[[882]],
+[[883]],
+[[884]],
+[[885]],
+[[886]],
+[[887]],
+[[888]],
+[[889]],
+[[890]],
+[[891]],
+[[892]],
+[[893]],
+[[894]],
+[[895]],
+[[896]],
+[[897]],
+[[898]],
+[[899]],
+[[900]],
+[[901]],
+[[902]],
+[[903]],
+[[904]],
+[[905]],
+[[906]],
+[[907]],
+[[908]],
+[[909]],
+[[910]],
+[[911]],
+[[912]],
+[[913]],
+[[914]],
+[[915]],
+[[916]],
+[[917]],
+[[918]],
+[[919]],
+[[920]],
+[[921]],
+[[922]],
+[[923]],
+[[924]],
+[[925]],
+[[926]],
+[[927]],
+[[928]],
+[[929]],
+[[930]],
+[[931]],
+[[932]],
+[[933]],
+[[934]],
+[[935]],
+[[936]],
+[[937]],
+[[938]],
+[[939]],
+[[940]],
+[[941]],
+[[942]],
+[[943]],
+[[944]],
+[[945]],
+[[946]],
+[[947]],
+[[948]],
+[[949]],
+[[950]],
+[[951]],
+[[952]],
+[[953]],
+[[954]],
+[[955]],
+[[956]],
+[[957]],
+[[958]],
+[[959]],
+[[960]],
+[[961]],
+[[962]],
+[[963]],
+[[964]],
+[[965]],
+[[966]],
+[[967]],
+[[968]],
+[[969]],
+[[970]],
+[[971]],
+[[972]],
+[[973]],
+[[974]],
+[[975]],
+[[976]],
+[[977]],
+[[978]],
+[[979]],
+[[980]],
+[[981]],
+[[982]],
+[[983]],
+[[984]],
+[[985]],
+[[986]],
+[[987]],
+[[988]],
+[[989]],
+[[990]],
+[[991]],
+[[992]],
+[[993]],
+[[994]],
+[[995]],
+[[996]],
+[[997]],
+[[998]],
+[[999]],
+[[1000]],
+[[1001]],
+[[1002]],
+[[1003]],
+[[1004]],
+[[1005]],
+[[1006]],
+[[1007]],
+[[1008]],
+[[1009]],
+[[1010]],
+[[1011]],
+[[1012]],
+[[1013]],
+[[1014]],
+[[1015]],
+[[1016]],
+[[1017]],
+[[1018]],
+[[1019]],
+[[1020]],
+[[1021]],
+[[1022]],
+[[1023]],
+[[1024]],
+[[1025]],
+[[1026]],
+[[1027]],
+[[1028]],
+[[1029]],
+[[1030]],
+[[1031]],
+[[1032]],
+[[1033]],
+[[1034]],
+[[1035]],
+[[1036]],
+[[1037]],
+[[1038]],
+[[1039]],
+[[1040]],
+[[1041]],
+[[1042]],
+[[1043]],
+[[1044]],
+[[1045]],
+[[1046]],
+[[1047]],
+[[1048]],
+[[1049]],
+[[1050]],
+[[1051]],
+[[1052]],
+[[1053]],
+[[1054]],
+[[1055]],
+[[1056]],
+[[1057]],
+[[1058]],
+[[1059]],
+[[1060]],
+[[1061]],
+[[1062]],
+[[1063]],
+[[1064]],
+[[1065]],
+[[1066]],
+[[1067]],
+[[1068]],
+[[1069]],
+[[1070]],
+[[1071]],
+[[1072]],
+[[1073]],
+[[1074]],
+[[1075]],
+[[1076]],
+[[1077]],
+[[1078]],
+[[1079]],
+[[1080]],
+[[1081]],
+[[1082]],
+[[1083]],
+[[1084]],
+[[1085]],
+[[1086]],
+[[1087]],
+[[1088]],
+[[1089]],
+[[1090]],
+[[1091]],
+[[1092]],
+[[1093]],
+[[1094]],
+[[1095]],
+[[1096]],
+[[1097]],
+[[1098]],
+[[1099]],
+[[1100]],
+[[1101]],
+[[1102]],
+[[1103]],
+[[1104]],
+[[1105]],
+[[1106]],
+[[1107]],
+[[1108]],
+[[1109]],
+[[1110]],
+[[1111]],
+[[1112]],
+[[1113]],
+[[1114]],
+[[1115]],
+[[1116]],
+[[1117]],
+[[1118]],
+[[1119]],
+[[1120]],
+[[1121]],
+[[1122]],
+[[1123]],
+[[1124]],
+[[1125]],
+[[1126]],
+[[1127]],
+[[1128]],
+[[1129]],
+[[1130]],
+[[1131]],
+[[1132]],
+[[1133]],
+[[1134]],
+[[1135]],
+[[1136]],
+[[1137]],
+[[1138]],
+[[1139]],
+[[1140]],
+[[1141]],
+[[1142]],
+[[1143]],
+[[1144]],
+[[1145]],
+[[1146]],
+[[1147]],
+[[1148]],
+[[1149]],
+[[1150]],
+[[1151]],
+[[1152]],
+[[1153]],
+[[1154]],
+[[1155]],
+[[1156]],
+[[1157]],
+[[1158]],
+[[1159]],
+[[1160]],
+[[1161]],
+[[1162]],
+[[1163]],
+[[1164]],
+[[1165]],
+[[1166]],
+[[1167]],
+[[1168]],
+[[1169]],
+[[1170]],
+[[1171]],
+[[1172]],
+[[1173]],
+[[1174]],
+[[1175]],
+[[1176]],
+[[1177]],
+[[1178]],
+[[1179]],
+[[1180]],
+[[1181]],
+[[1182]],
+[[1183]],
+[[1184]],
+[[1185]],
+[[1186]],
+[[1187]],
+[[1188]],
+[[1189]],
+[[1190]],
+[[1191]],
+[[1192]],
+[[1193]],
+[[1194]],
+[[1195]],
+[[1196]],
+[[1197]],
+[[1198]],
+[[1199]],
+[[1200]],
+[[1201]],
+[[1202]],
+[[1203]],
+[[1204]],
+[[1205]],
+[[1206]],
+[[1207]],
+[[1208]],
+[[1209]],
+[[1210]],
+[[1211]],
+[[1212]],
+[[1213]],
+[[1214]],
+[[1215]],
+[[1216]],
+[[1217]],
+[[1218]],
+[[1219]],
+[[1220]],
+[[1221]],
+[[1222]],
+[[1223]],
+[[1224]],
+[[1225]],
+[[1226]],
+[[1227]],
+[[1228]],
+[[1229]],
+[[1230]],
+[[1231]],
+[[1232]],
+[[1233]],
+[[1234]],
+[[1235]],
+[[1236]],
+[[1237]],
+[[1238]],
+[[1239]],
+[[1240]],
+[[1241]],
+[[1242]],
+[[1243]],
+[[1244]],
+[[1245]],
+[[1246]],
+[[1247]],
+[[1248]],
+[[1249]],
+[[1250]],
+[[1251]],
+[[1252]],
+[[1253]],
+[[1254]],
+[[1255]],
+[[1256]],
+[[1257]],
+[[1258]],
+[[1259]],
+[[1260]],
+[[1261]],
+[[1262]],
+[[1263]],
+[[1264]],
+[[1265]],
+[[1266]],
+[[1267]],
+[[1268]],
+[[1269]],
+[[1270]],
+[[1271]],
+[[1272]],
+[[1273]],
+[[1274]],
+[[1275]],
+[[1276]],
+[[1277]],
+[[1278]],
+[[1279]],
+[[1280]],
+[[1281]],
+[[1282]],
+[[1283]],
+[[1284]],
+[[1285]],
+[[1286]],
+[[1287]],
+[[1288]],
+[[1289]],
+[[1290]],
+[[1291]],
+[[1292]],
+[[1293]],
+[[1294]],
+[[1295]],
+[[1296]],
+[[1297]],
+[[1298]],
+[[1299]],
+[[1300]],
+[[1301]],
+[[1302]],
+[[1303]],
+[[1304]],
+[[1305]],
+[[1306]],
+[[1307]],
+[[1308]],
+[[1309]],
+[[1310]],
+[[1311]],
+[[1312]],
+[[1313]],
+[[1314]],
+[[1315]],
+[[1316]],
+[[1317]],
+[[1318]],
+[[1319]],
+[[1320]],
+[[1321]],
+[[1322]],
+[[1323]],
+[[1324]],
+[[1325]],
+[[1326]],
+[[1327]],
+[[1328]],
+[[1329]],
+[[1330]],
+[[1331]],
+[[1332]],
+[[1333]],
+[[1334]],
+[[1335]],
+[[1336]],
+[[1337]],
+[[1338]],
+[[1339]],
+[[1340]],
+[[1341]],
+[[1342]],
+[[1343]],
+[[1344]],
+[[1345]],
+[[1346]],
+[[1347]],
+[[1348]],
+[[1349]],
+[[1350]],
+[[1351]],
+[[1352]],
+[[1353]],
+[[1354]],
+[[1355]],
+[[1356]],
+[[1357]],
+[[1358]],
+[[1359]],
+[[1360]],
+[[1361]],
+[[1362]],
+[[1363]],
+[[1364]],
+[[1365]],
+[[1366]],
+[[1367]],
+[[1368]],
+[[1369]],
+[[1370]],
+[[1371]],
+[[1372]],
+[[1373]],
+[[1374]],
+[[1375]],
+[[1376]],
+[[1377]],
+[[1378]],
+[[1379]],
+[[1380]],
+[[1381]],
+[[1382]],
+[[1383]],
+[[1384]],
+[[1385]],
+[[1386]],
+[[1387]],
+[[1388]],
+[[1389]],
+[[1390]],
+[[1391]],
+[[1392]],
+[[1393]],
+[[1394]],
+[[1395]],
+[[1396]],
+[[1397]],
+[[1398]],
+[[1399]],
+[[1400]],
+[[1401]],
+[[1402]],
+[[1403]],
+[[1404]],
+[[1405]],
+[[1406]],
+[[1407]],
+[[1408]],
+[[1409]],
+[[1410]],
+[[1411]],
+[[1412]],
+[[1413]],
+[[1414]],
+[[1415]],
+[[1416]],
+[[1417]],
+[[1418]],
+[[1419]],
+[[1420]],
+[[1421]],
+[[1422]],
+[[1423]],
+[[1424]],
+[[1425]],
+[[1426]],
+[[1427]],
+[[1428]],
+[[1429]],
+[[1430]],
+[[1431]],
+[[1432]],
+[[1433]],
+[[1434]],
+[[1435]],
+[[1436]],
+[[1437]],
+[[1438]],
+[[1439]],
+[[1440]],
+[[1441]],
+[[1442]],
+[[1443]],
+[[1444]],
+[[1445]],
+[[1446]],
+[[1447]],
+[[1448]],
+[[1449]],
+[[1450]],
+[[1451]],
+[[1452]],
+[[1453]],
+[[1454]],
+[[1455]],
+[[1456]],
+[[1457]],
+[[1458]],
+[[1459]],
+[[1460]],
+[[1461]],
+[[1462]],
+[[1463]],
+[[1464]],
+[[1465]],
+[[1466]],
+[[1467]],
+[[1468]],
+[[1469]],
+[[1470]],
+[[1471]],
+[[1472]],
+[[1473]],
+[[1474]],
+[[1475]],
+[[1476]],
+[[1477]],
+[[1478]],
+[[1479]],
+[[1480]],
+[[1481]],
+[[1482]],
+[[1483]],
+[[1484]],
+[[1485]],
+[[1486]],
+[[1487]],
+[[1488]],
+[[1489]],
+[[1490]],
+[[1491]],
+[[1492]],
+[[1493]],
+[[1494]],
+[[1495]],
+[[1496]],
+[[1497]],
+[[1498]],
+[[1499]],
+[[1500]],
+[[1501]],
+[[1502]],
+[[1503]],
+[[1504]],
+[[1505]],
+[[1506]],
+[[1507]],
+[[1508]],
+[[1509]],
+[[1510]],
+[[1511]],
+[[1512]],
+[[1513]],
+[[1514]],
+[[1515]],
+[[1516]],
+[[1517]],
+[[1518]],
+[[1519]],
+[[1520]],
+[[1521]],
+[[1522]],
+[[1523]],
+[[1524]],
+[[1525]],
+[[1526]],
+[[1527]],
+[[1528]],
+[[1529]],
+[[1530]],
+[[1531]],
+[[1532]],
+[[1533]],
+[[1534]],
+[[1535]],
+[[1536]],
+[[1537]],
+[[1538]],
+[[1539]],
+[[1540]],
+[[1541]],
+[[1542]],
+[[1543]],
+[[1544]],
+[[1545]],
+[[1546]],
+[[1547]],
+[[1548]],
+[[1549]],
+[[1550]],
+[[1551]],
+[[1552]],
+[[1553]],
+[[1554]],
+[[1555]],
+[[1556]],
+[[1557]],
+[[1558]],
+[[1559]],
+[[1560]],
+[[1561]],
+[[1562]],
+[[1563]],
+[[1564]],
+[[1565]],
+[[1566]],
+[[1567]],
+[[1568]],
+[[1569]],
+[[1570]],
+[[1571]],
+[[1572]],
+[[1573]],
+[[1574]],
+[[1575]],
+[[1576]],
+[[1577]],
+[[1578]],
+[[1579]],
+[[1580]],
+[[1581]],
+[[1582]],
+[[1583]],
+[[1584]],
+[[1585]],
+[[1586]],
+[[1587]],
+[[1588]],
+[[1589]],
+[[1590]],
+[[1591]],
+[[1592]],
+[[1593]],
+[[1594]],
+[[1595]],
+[[1596]],
+[[1597]],
+[[1598]],
+[[1599]],
+[[1600]],
+[[1601]],
+[[1602]],
+[[1603]],
+[[1604]],
+[[1605]],
+[[1606]],
+[[1607]],
+[[1608]],
+[[1609]],
+[[1610]],
+[[1611]],
+[[1612]],
+[[1613]],
+[[1614]],
+[[1615]],
+[[1616]],
+[[1617]],
+[[1618]],
+[[1619]],
+[[1620]],
+[[1621]],
+[[1622]],
+[[1623]],
+[[1624]],
+[[1625]],
+[[1626]],
+[[1627]],
+[[1628]],
+[[1629]],
+[[1630]],
+[[1631]],
+[[1632]],
+[[1633]],
+[[1634]],
+[[1635]],
+[[1636]],
+[[1637]],
+[[1638]],
+[[1639]],
+[[1640]],
+[[1641]],
+[[1642]],
+[[1643]],
+[[1644]],
+[[1645]],
+[[1646]],
+[[1647]],
+[[1648]],
+[[1649]],
+[[1650]],
+[[1651]],
+[[1652]],
+[[1653]],
+[[1654]],
+[[1655]],
+[[1656]],
+[[1657]],
+[[1658]],
+[[1659]],
+[[1660]],
+[[1661]],
+[[1662]],
+[[1663]],
+[[1664]],
+[[1665]],
+[[1666]],
+[[1667]],
+[[1668]],
+[[1669]],
+[[1670]],
+[[1671]],
+[[1672]],
+[[1673]],
+[[1674]],
+[[1675]],
+[[1676]],
+[[1677]],
+[[1678]],
+[[1679]],
+[[1680]],
+[[1681]],
+[[1682]],
+[[1683]],
+[[1684]],
+[[1685]],
+[[1686]],
+[[1687]],
+[[1688]],
+[[1689]],
+[[1690]],
+[[1691]],
+[[1692]],
+[[1693]],
+[[1694]],
+[[1695]],
+[[1696]],
+[[1697]],
+[[1698]],
+[[1699]],
+[[1700]],
+[[1701]],
+[[1702]],
+[[1703]],
+[[1704]],
+[[1705]],
+[[1706]],
+[[1707]],
+[[1708]],
+[[1709]],
+[[1710]],
+[[1711]],
+[[1712]],
+[[1713]],
+[[1714]],
+[[1715]],
+[[1716]],
+[[1717]],
+[[1718]],
+[[1719]],
+[[1720]],
+[[1721]],
+[[1722]],
+[[1723]],
+[[1724]],
+[[1725]],
+[[1726]],
+[[1727]],
+[[1728]],
+[[1729]],
+[[1730]],
+[[1731]],
+[[1732]],
+[[1733]],
+[[1734]],
+[[1735]],
+[[1736]],
+[[1737]],
+[[1738]],
+[[1739]],
+[[1740]],
+[[1741]],
+[[1742]],
+[[1743]],
+[[1744]],
+[[1745]],
+[[1746]],
+[[1747]],
+[[1748]],
+[[1749]],
+[[1750]],
+[[1751]],
+[[1752]],
+[[1753]],
+[[1754]],
+[[1755]],
+[[1756]],
+[[1757]],
+[[1758]],
+[[1759]],
+[[1760]],
+[[1761]],
+[[1762]],
+[[1763]],
+[[1764]],
+[[1765]],
+[[1766]],
+[[1767]],
+[[1768]],
+[[1769]],
+[[1770]],
+[[1771]],
+[[1772]],
+[[1773]],
+[[1774]],
+[[1775]],
+[[1776]],
+[[1777]],
+[[1778]],
+[[1779]],
+[[1780]],
+[[1781]],
+[[1782]],
+[[1783]],
+[[1784]],
+[[1785]],
+[[1786]],
+[[1787]],
+[[1788]],
+[[1789]],
+[[1790]],
+[[1791]],
+[[1792]],
+[[1793]],
+[[1794]],
+[[1795]],
+[[1796]],
+[[1797]],
+[[1798]],
+[[1799]],
+[[1800]],
+[[1801]],
+[[1802]],
+[[1803]],
+[[1804]],
+[[1805]],
+[[1806]],
+[[1807]],
+[[1808]],
+[[1809]],
+[[1810]],
+[[1811]],
+[[1812]],
+[[1813]],
+[[1814]],
+[[1815]],
+[[1816]],
+[[1817]],
+[[1818]],
+[[1819]],
+[[1820]],
+[[1821]],
+[[1822]],
+[[1823]],
+[[1824]],
+[[1825]],
+[[1826]],
+[[1827]],
+[[1828]],
+[[1829]],
+[[1830]],
+[[1831]],
+[[1832]],
+[[1833]],
+[[1834]],
+[[1835]],
+[[1836]],
+[[1837]],
+[[1838]],
+[[1839]],
+[[1840]],
+[[1841]],
+[[1842]],
+[[1843]],
+[[1844]],
+[[1845]],
+[[1846]],
+[[1847]],
+[[1848]],
+[[1849]],
+[[1850]],
+[[1851]],
+[[1852]],
+[[1853]],
+[[1854]],
+[[1855]],
+[[1856]],
+[[1857]],
+[[1858]],
+[[1859]],
+[[1860]],
+[[1861]],
+[[1862]],
+[[1863]],
+[[1864]],
+[[1865]],
+[[1866]],
+[[1867]],
+[[1868]],
+[[1869]],
+[[1870]],
+[[1871]],
+[[1872]],
+[[1873]],
+[[1874]],
+[[1875]],
+[[1876]],
+[[1877]],
+[[1878]],
+[[1879]],
+[[1880]],
+[[1881]],
+[[1882]],
+[[1883]],
+[[1884]],
+[[1885]],
+[[1886]],
+[[1887]],
+[[1888]],
+[[1889]],
+[[1890]],
+[[1891]],
+[[1892]],
+[[1893]],
+[[1894]],
+[[1895]],
+[[1896]],
+[[1897]],
+[[1898]],
+[[1899]],
+[[1900]],
+[[1901]],
+[[1902]],
+[[1903]],
+[[1904]],
+[[1905]],
+[[1906]],
+[[1907]],
+[[1908]],
+[[1909]],
+[[1910]],
+[[1911]],
+[[1912]],
+[[1913]],
+[[1914]],
+[[1915]],
+[[1916]],
+[[1917]],
+[[1918]],
+[[1919]],
+[[1920]],
+[[1921]],
+[[1922]],
+[[1923]],
+[[1924]],
+[[1925]],
+[[1926]],
+[[1927]],
+[[1928]],
+[[1929]],
+[[1930]],
+[[1931]],
+[[1932]],
+[[1933]],
+[[1934]],
+[[1935]],
+[[1936]],
+[[1937]],
+[[1938]],
+[[1939]],
+[[1940]],
+[[1941]],
+[[1942]],
+[[1943]],
+[[1944]],
+[[1945]],
+[[1946]],
+[[1947]],
+[[1948]],
+[[1949]],
+[[1950]],
+[[1951]],
+[[1952]],
+[[1953]],
+[[1954]],
+[[1955]],
+[[1956]],
+[[1957]],
+[[1958]],
+[[1959]],
+[[1960]],
+[[1961]],
+[[1962]],
+[[1963]],
+[[1964]],
+[[1965]],
+[[1966]],
+[[1967]],
+[[1968]],
+[[1969]],
+[[1970]],
+[[1971]],
+[[1972]],
+[[1973]],
+[[1974]],
+[[1975]],
+[[1976]],
+[[1977]],
+[[1978]],
+[[1979]],
+[[1980]],
+[[1981]],
+[[1982]],
+[[1983]],
+[[1984]],
+[[1985]],
+[[1986]],
+[[1987]],
+[[1988]],
+[[1989]],
+[[1990]],
+[[1991]],
+[[1992]],
+[[1993]],
+[[1994]],
+[[1995]],
+[[1996]],
+[[1997]],
+[[1998]],
+[[1999]],
+[[2000]],
+[[2001]],
+[[2002]],
+[[2003]],
+[[2004]],
+[[2005]],
+[[2006]],
+[[2007]],
+[[2008]],
+[[2009]],
+[[2010]],
+[[2011]],
+[[2012]],
+[[2013]],
+[[2014]],
+[[2015]],
+[[2016]],
+[[2017]],
+[[2018]],
+[[2019]],
+[[2020]],
+[[2021]],
+[[2022]],
+[[2023]],
+[[2024]],
+[[2025]],
+[[2026]],
+[[2027]],
+[[2028]],
+[[2029]],
+[[2030]],
+[[2031]],
+[[2032]],
+[[2033]],
+[[2034]],
+[[2035]],
+[[2036]],
+[[2037]],
+[[2038]],
+[[2039]],
+[[2040]],
+[[2041]],
+[[2042]],
+[[2043]],
+[[2044]],
+[[2045]],
+[[2046]],
+[[2047]],
+[[2048]],
+[[2049]],
+[[2050]],
+[[2051]],
+[[2052]],
+[[2053]],
+[[2054]],
+[[2055]],
+[[2056]],
+[[2057]],
+[[2058]],
+[[2059]],
+[[2060]],
+[[2061]],
+[[2062]],
+[[2063]],
+[[2064]],
+[[2065]],
+[[2066]],
+[[2067]],
+[[2068]],
+[[2069]],
+[[2070]],
+[[2071]],
+[[2072]],
+[[2073]],
+[[2074]],
+[[2075]],
+[[2076]],
+[[2077]],
+[[2078]],
+[[2079]],
+[[2080]],
+[[2081]],
+[[2082]],
+[[2083]],
+[[2084]],
+[[2085]],
+[[2086]],
+[[2087]],
+[[2088]],
+[[2089]],
+[[2090]],
+[[2091]],
+[[2092]],
+[[2093]],
+[[2094]],
+[[2095]],
+[[2096]],
+[[2097]],
+[[2098]],
+[[2099]],
+[[2100]],
+[[2101]],
+[[2102]],
+[[2103]],
+[[2104]],
+[[2105]],
+[[2106]],
+[[2107]],
+[[2108]],
+[[2109]],
+[[2110]],
+[[2111]],
+[[2112]],
+[[2113]],
+[[2114]],
+[[2115]],
+[[2116]],
+[[2117]],
+[[2118]],
+[[2119]],
+[[2120]],
+[[2121]],
+[[2122]],
+[[2123]],
+[[2124]],
+[[2125]],
+[[2126]],
+[[2127]],
+[[2128]],
+[[2129]],
+[[2130]],
+[[2131]],
+[[2132]],
+[[2133]],
+[[2134]],
+[[2135]],
+[[2136]],
+[[2137]],
+[[2138]],
+[[2139]],
+[[2140]],
+[[2141]],
+[[2142]],
+[[2143]],
+[[2144]],
+[[2145]],
+[[2146]],
+[[2147]],
+[[2148]],
+[[2149]],
+[[2150]],
+[[2151]],
+[[2152]],
+[[2153]],
+[[2154]],
+[[2155]],
+[[2156]],
+[[2157]],
+[[2158]],
+[[2159]],
+[[2160]],
+[[2161]],
+[[2162]],
+[[2163]],
+[[2164]],
+[[2165]],
+[[2166]],
+[[2167]],
+[[2168]],
+[[2169]],
+[[2170]],
+[[2171]],
+[[2172]],
+[[2173]],
+[[2174]],
+[[2175]],
+[[2176]],
+[[2177]],
+[[2178]],
+[[2179]],
+[[2180]],
+[[2181]],
+[[2182]],
+[[2183]],
+[[2184]],
+[[2185]],
+[[2186]],
+[[2187]],
+[[2188]],
+[[2189]],
+[[2190]],
+[[2191]],
+[[2192]],
+[[2193]],
+[[2194]],
+[[2195]],
+[[2196]],
+[[2197]],
+[[2198]],
+[[2199]],
+[[2200]],
+[[2201]],
+[[2202]],
+[[2203]],
+[[2204]],
+[[2205]],
+[[2206]],
+[[2207]],
+[[2208]],
+[[2209]],
+[[2210]],
+[[2211]],
+[[2212]],
+[[2213]],
+[[2214]],
+[[2215]],
+[[2216]],
+[[2217]],
+[[2218]],
+[[2219]],
+[[2220]],
+[[2221]],
+[[2222]],
+[[2223]],
+[[2224]],
+[[2225]],
+[[2226]],
+[[2227]],
+[[2228]],
+[[2229]],
+[[2230]],
+[[2231]],
+[[2232]],
+[[2233]],
+[[2234]],
+[[2235]],
+[[2236]],
+[[2237]],
+[[2238]],
+[[2239]],
+[[2240]],
+[[2241]],
+[[2242]],
+[[2243]],
+[[2244]],
+[[2245]],
+[[2246]],
+[[2247]],
+[[2248]],
+[[2249]],
+[[2250]],
+[[2251]],
+[[2252]],
+[[2253]],
+[[2254]],
+[[2255]],
+[[2256]],
+[[2257]],
+[[2258]],
+[[2259]],
+[[2260]],
+[[2261]],
+[[2262]],
+[[2263]],
+[[2264]],
+[[2265]],
+[[2266]],
+[[2267]],
+[[2268]],
+[[2269]],
+[[2270]],
+[[2271]],
+[[2272]],
+[[2273]],
+[[2274]],
+[[2275]],
+[[2276]],
+[[2277]],
+[[2278]],
+[[2279]],
+[[2280]],
+[[2281]],
+[[2282]],
+[[2283]],
+[[2284]],
+[[2285]],
+[[2286]],
+[[2287]],
+[[2288]],
+[[2289]],
+[[2290]],
+[[2291]],
+[[2292]],
+[[2293]],
+[[2294]],
+[[2295]],
+[[2296]],
+[[2297]],
+[[2298]],
+[[2299]],
+[[2300]],
+[[2301]],
+[[2302]],
+[[2303]],
+[[2304]],
+[[2305]],
+[[2306]],
+[[2307]],
+[[2308]],
+[[2309]],
+[[2310]],
+[[2311]],
+[[2312]],
+[[2313]],
+[[2314]],
+[[2315]],
+[[2316]],
+[[2317]],
+[[2318]],
+[[2319]],
+[[2320]],
+[[2321]],
+[[2322]],
+[[2323]],
+[[2324]],
+[[2325]],
+[[2326]],
+[[2327]],
+[[2328]],
+[[2329]],
+[[2330]],
+[[2331]],
+[[2332]],
+[[2333]],
+[[2334]],
+[[2335]],
+[[2336]],
+[[2337]],
+[[2338]],
+[[2339]],
+[[2340]],
+[[2341]],
+[[2342]],
+[[2343]],
+[[2344]],
+[[2345]],
+[[2346]],
+[[2347]],
+[[2348]],
+[[2349]],
+[[2350]],
+[[2351]],
+[[2352]],
+[[2353]],
+[[2354]],
+[[2355]],
+[[2356]],
+[[2357]],
+[[2358]],
+[[2359]],
+[[2360]],
+[[2361]],
+[[2362]],
+[[2363]],
+[[2364]],
+[[2365]],
+[[2366]],
+[[2367]],
+[[2368]],
+[[2369]],
+[[2370]],
+[[2371]],
+[[2372]],
+[[2373]],
+[[2374]],
+[[2375]],
+[[2376]],
+[[2377]],
+[[2378]],
+[[2379]],
+[[2380]],
+[[2381]],
+[[2382]],
+[[2383]],
+[[2384]],
+[[2385]],
+[[2386]],
+[[2387]],
+[[2388]],
+[[2389]],
+[[2390]],
+[[2391]],
+[[2392]],
+[[2393]],
+[[2394]],
+[[2395]],
+[[2396]],
+[[2397]],
+[[2398]],
+[[2399]],
+[[2400]],
+[[2401]],
+[[2402]],
+[[2403]],
+[[2404]],
+[[2405]],
+[[2406]],
+[[2407]],
+[[2408]],
+[[2409]],
+[[2410]],
+[[2411]],
+[[2412]],
+[[2413]],
+[[2414]],
+[[2415]],
+[[2416]],
+[[2417]],
+[[2418]],
+[[2419]],
+[[2420]],
+[[2421]],
+[[2422]],
+[[2423]],
+[[2424]],
+[[2425]],
+[[2426]],
+[[2427]],
+[[2428]],
+[[2429]],
+[[2430]],
+[[2431]],
+[[2432]],
+[[2433]],
+[[2434]],
+[[2435]],
+[[2436]],
+[[2437]],
+[[2438]],
+[[2439]],
+[[2440]],
+[[2441]],
+[[2442]],
+[[2443]],
+[[2444]],
+[[2445]],
+[[2446]],
+[[2447]],
+[[2448]],
+[[2449]],
+[[2450]],
+[[2451]],
+[[2452]],
+[[2453]],
+[[2454]],
+[[2455]],
+[[2456]],
+[[2457]],
+[[2458]],
+[[2459]],
+[[2460]],
+[[2461]],
+[[2462]],
+[[2463]],
+[[2464]],
+[[2465]],
+[[2466]],
+[[2467]],
+[[2468]],
+[[2469]],
+[[2470]],
+[[2471]],
+[[2472]],
+[[2473]],
+[[2474]],
+[[2475]],
+[[2476]],
+[[2477]],
+[[2478]],
+[[2479]],
+[[2480]],
+[[2481]],
+[[2482]],
+[[2483]],
+[[2484]],
+[[2485]],
+[[2486]],
+[[2487]],
+[[2488]],
+[[2489]],
+[[2490]],
+[[2491]],
+[[2492]],
+[[2493]],
+[[2494]],
+[[2495]],
+[[2496]],
+[[2497]],
+[[2498]],
+[[2499]],
+[[2500]],
+[[2501]],
+[[2502]],
+[[2503]],
+[[2504]],
+[[2505]],
+[[2506]],
+[[2507]],
+[[2508]],
+[[2509]],
+[[2510]],
+[[2511]],
+[[2512]],
+[[2513]],
+[[2514]],
+[[2515]],
+[[2516]],
+[[2517]],
+[[2518]],
+[[2519]],
+[[2520]],
+[[2521]],
+[[2522]],
+[[2523]],
+[[2524]],
+[[2525]],
+[[2526]],
+[[2527]],
+[[2528]],
+[[2529]],
+[[2530]],
+[[2531]],
+[[2532]],
+[[2533]],
+[[2534]],
+[[2535]],
+[[2536]],
+[[2537]],
+[[2538]],
+[[2539]],
+[[2540]],
+[[2541]],
+[[2542]],
+[[2543]],
+[[2544]],
+[[2545]],
+[[2546]],
+[[2547]],
+[[2548]],
+[[2549]],
+[[2550]],
+[[2551]],
+[[2552]],
+[[2553]],
+[[2554]],
+[[2555]],
+[[2556]],
+[[2557]],
+[[2558]],
+[[2559]],
+[[2560]],
+[[2561]],
+[[2562]],
+[[2563]],
+[[2564]],
+[[2565]],
+[[2566]],
+[[2567]],
+[[2568]],
+[[2569]],
+[[2570]],
+[[2571]],
+[[2572]],
+[[2573]],
+[[2574]],
+[[2575]],
+[[2576]],
+[[2577]],
+[[2578]],
+[[2579]],
+[[2580]],
+[[2581]],
+[[2582]],
+[[2583]],
+[[2584]],
+[[2585]],
+[[2586]],
+[[2587]],
+[[2588]],
+[[2589]],
+[[2590]],
+[[2591]],
+[[2592]],
+[[2593]],
+[[2594]],
+[[2595]],
+[[2596]],
+[[2597]],
+[[2598]],
+[[2599]],
+[[2600]],
+[[2601]],
+[[2602]],
+[[2603]],
+[[2604]],
+[[2605]],
+[[2606]],
+[[2607]],
+[[2608]],
+[[2609]],
+[[2610]],
+[[2611]],
+[[2612]],
+[[2613]],
+[[2614]],
+[[2615]],
+[[2616]],
+[[2617]],
+[[2618]],
+[[2619]],
+[[2620]],
+[[2621]],
+[[2622]],
+[[2623]],
+[[2624]],
+[[2625]],
+[[2626]],
+[[2627]],
+[[2628]],
+[[2629]],
+[[2630]],
+[[2631]],
+[[2632]],
+[[2633]],
+[[2634]],
+[[2635]],
+[[2636]],
+[[2637]],
+[[2638]],
+[[2639]],
+[[2640]],
+[[2641]],
+[[2642]],
+[[2643]],
+[[2644]],
+[[2645]],
+[[2646]],
+[[2647]],
+[[2648]],
+[[2649]],
+[[2650]],
+[[2651]],
+[[2652]],
+[[2653]],
+[[2654]],
+[[2655]],
+[[2656]],
+[[2657]],
+[[2658]],
+[[2659]],
+[[2660]],
+[[2661]],
+[[2662]],
+[[2663]],
+[[2664]],
+[[2665]],
+[[2666]],
+[[2667]],
+[[2668]],
+[[2669]],
+[[2670]],
+[[2671]],
+[[2672]],
+[[2673]],
+[[2674]],
+[[2675]],
+[[2676]],
+[[2677]],
+[[2678]],
+[[2679]],
+[[2680]],
+[[2681]],
+[[2682]],
+[[2683]],
+[[2684]],
+[[2685]],
+[[2686]],
+[[2687]],
+[[2688]],
+[[2689]],
+[[2690]],
+[[2691]],
+[[2692]],
+[[2693]],
+[[2694]],
+[[2695]],
+[[2696]],
+[[2697]],
+[[2698]],
+[[2699]],
+[[2700]],
+[[2701]],
+[[2702]],
+[[2703]],
+[[2704]],
+[[2705]],
+[[2706]],
+[[2707]],
+[[2708]],
+[[2709]],
+[[2710]],
+[[2711]],
+[[2712]],
+[[2713]],
+[[2714]],
+[[2715]],
+[[2716]],
+[[2717]],
+[[2718]],
+[[2719]],
+[[2720]],
+[[2721]],
+[[2722]],
+[[2723]],
+[[2724]],
+[[2725]],
+[[2726]],
+[[2727]],
+[[2728]],
+[[2729]],
+[[2730]],
+[[2731]],
+[[2732]],
+[[2733]],
+[[2734]],
+[[2735]],
+[[2736]],
+[[2737]],
+[[2738]],
+[[2739]],
+[[2740]],
+[[2741]],
+[[2742]],
+[[2743]],
+[[2744]],
+[[2745]],
+[[2746]],
+[[2747]],
+[[2748]],
+[[2749]],
+[[2750]],
+[[2751]],
+[[2752]],
+[[2753]],
+[[2754]],
+[[2755]],
+[[2756]],
+[[2757]],
+[[2758]],
+[[2759]],
+[[2760]],
+[[2761]],
+[[2762]],
+[[2763]],
+[[2764]],
+[[2765]],
+[[2766]],
+[[2767]],
+[[2768]],
+[[2769]],
+[[2770]],
+[[2771]],
+[[2772]],
+[[2773]],
+[[2774]],
+[[2775]],
+[[2776]],
+[[2777]],
+[[2778]],
+[[2779]],
+[[2780]],
+[[2781]],
+[[2782]],
+[[2783]],
+[[2784]],
+[[2785]],
+[[2786]],
+[[2787]],
+[[2788]],
+[[2789]],
+[[2790]],
+[[2791]],
+[[2792]],
+[[2793]],
+[[2794]],
+[[2795]],
+[[2796]],
+[[2797]],
+[[2798]],
+[[2799]],
+[[2800]],
+[[2801]],
+[[2802]],
+[[2803]],
+[[2804]],
+[[2805]],
+[[2806]],
+[[2807]],
+[[2808]],
+[[2809]],
+[[2810]],
+[[2811]],
+[[2812]],
+[[2813]],
+[[2814]],
+[[2815]],
+[[2816]],
+[[2817]],
+[[2818]],
+[[2819]],
+[[2820]],
+[[2821]],
+[[2822]],
+[[2823]],
+[[2824]],
+[[2825]],
+[[2826]],
+[[2827]],
+[[2828]],
+[[2829]],
+[[2830]],
+[[2831]],
+[[2832]],
+[[2833]],
+[[2834]],
+[[2835]],
+[[2836]],
+[[2837]],
+[[2838]],
+[[2839]],
+[[2840]],
+[[2841]],
+[[2842]],
+[[2843]],
+[[2844]],
+[[2845]],
+[[2846]],
+[[2847]],
+[[2848]],
+[[2849]],
+[[2850]],
+[[2851]],
+[[2852]],
+[[2853]],
+[[2854]],
+[[2855]],
+[[2856]],
+[[2857]],
+[[2858]],
+[[2859]],
+[[2860]],
+[[2861]],
+[[2862]],
+[[2863]],
+[[2864]],
+[[2865]],
+[[2866]],
+[[2867]],
+[[2868]],
+[[2869]],
+[[2870]],
+[[2871]],
+[[2872]],
+[[2873]],
+[[2874]],
+[[2875]],
+[[2876]],
+[[2877]],
+[[2878]],
+[[2879]],
+[[2880]],
+[[2881]],
+[[2882]],
+[[2883]],
+[[2884]],
+[[2885]],
+[[2886]],
+[[2887]],
+[[2888]],
+[[2889]],
+[[2890]],
+[[2891]],
+[[2892]],
+[[2893]],
+[[2894]],
+[[2895]],
+[[2896]],
+[[2897]],
+[[2898]],
+[[2899]],
+[[2900]],
+[[2901]],
+[[2902]],
+[[2903]],
+[[2904]],
+[[2905]],
+[[2906]],
+[[2907]],
+[[2908]],
+[[2909]],
+[[2910]],
+[[2911]],
+[[2912]],
+[[2913]],
+[[2914]],
+[[2915]],
+[[2916]],
+[[2917]],
+[[2918]],
+[[2919]],
+[[2920]],
+[[2921]],
+[[2922]],
+[[2923]],
+[[2924]],
+[[2925]],
+[[2926]],
+[[2927]],
+[[2928]],
+[[2929]],
+[[2930]],
+[[2931]],
+[[2932]],
+[[2933]],
+[[2934]],
+[[2935]],
+[[2936]],
+[[2937]],
+[[2938]],
+[[2939]],
+[[2940]],
+[[2941]],
+[[2942]],
+[[2943]],
+[[2944]],
+[[2945]],
+[[2946]],
+[[2947]],
+[[2948]],
+[[2949]],
+[[2950]],
+[[2951]],
+[[2952]],
+[[2953]],
+[[2954]],
+[[2955]],
+[[2956]],
+[[2957]],
+[[2958]],
+[[2959]],
+[[2960]],
+[[2961]],
+[[2962]],
+[[2963]],
+[[2964]],
+[[2965]],
+[[2966]],
+[[2967]],
+[[2968]],
+[[2969]],
+[[2970]],
+[[2971]],
+[[2972]],
+[[2973]],
+[[2974]],
+[[2975]],
+[[2976]],
+[[2977]],
+[[2978]],
+[[2979]],
+[[2980]],
+[[2981]],
+[[2982]],
+[[2983]],
+[[2984]],
+[[2985]],
+[[2986]],
+[[2987]],
+[[2988]],
+[[2989]],
+[[2990]],
+[[2991]],
+[[2992]],
+[[2993]],
+[[2994]],
+[[2995]],
+[[2996]],
+[[2997]],
+[[2998]],
+[[2999]],
+[[3000]],
+[[3001]],
+[[3002]],
+[[3003]],
+[[3004]],
+[[3005]],
+[[3006]],
+[[3007]],
+[[3008]],
+[[3009]],
+[[3010]],
+[[3011]],
+[[3012]],
+[[3013]],
+[[3014]],
+[[3015]],
+[[3016]],
+[[3017]],
+[[3018]],
+[[3019]],
+[[3020]],
+[[3021]],
+[[3022]],
+[[3023]],
+[[3024]],
+[[3025]],
+[[3026]],
+[[3027]],
+[[3028]],
+[[3029]],
+[[3030]],
+[[3031]],
+[[3032]],
+[[3033]],
+[[3034]],
+[[3035]],
+[[3036]],
+[[3037]],
+[[3038]],
+[[3039]],
+[[3040]],
+[[3041]],
+[[3042]],
+[[3043]],
+[[3044]],
+[[3045]],
+[[3046]],
+[[3047]],
+[[3048]],
+[[3049]],
+[[3050]],
+[[3051]],
+[[3052]],
+[[3053]],
+[[3054]],
+[[3055]],
+[[3056]],
+[[3057]],
+[[3058]],
+[[3059]],
+[[3060]],
+[[3061]],
+[[3062]],
+[[3063]],
+[[3064]],
+[[3065]],
+[[3066]],
+[[3067]],
+[[3068]],
+[[3069]],
+[[3070]],
+[[3071]],
+[[3072]],
+[[3073]],
+[[3074]],
+[[3075]],
+[[3076]],
+[[3077]],
+[[3078]],
+[[3079]],
+[[3080]],
+[[3081]],
+[[3082]],
+[[3083]],
+[[3084]],
+[[3085]],
+[[3086]],
+[[3087]],
+[[3088]],
+[[3089]],
+[[3090]],
+[[3091]],
+[[3092]],
+[[3093]],
+[[3094]],
+[[3095]],
+[[3096]],
+[[3097]],
+[[3098]],
+[[3099]],
+[[3100]],
+[[3101]],
+[[3102]],
+[[3103]],
+[[3104]],
+[[3105]],
+[[3106]],
+[[3107]],
+[[3108]],
+[[3109]],
+[[3110]],
+[[3111]],
+[[3112]],
+[[3113]],
+[[3114]],
+[[3115]],
+[[3116]],
+[[3117]],
+[[3118]],
+[[3119]],
+[[3120]],
+[[3121]],
+[[3122]],
+[[3123]],
+[[3124]],
+[[3125]],
+[[3126]],
+[[3127]],
+[[3128]],
+[[3129]],
+[[3130]],
+[[3131]],
+[[3132]],
+[[3133]],
+[[3134]],
+[[3135]],
+[[3136]],
+[[3137]],
+[[3138]],
+[[3139]],
+[[3140]],
+[[3141]],
+[[3142]],
+[[3143]],
+[[3144]],
+[[3145]],
+[[3146]],
+[[3147]],
+[[3148]],
+[[3149]],
+[[3150]],
+[[3151]],
+[[3152]],
+[[3153]],
+[[3154]],
+[[3155]],
+[[3156]],
+[[3157]],
+[[3158]],
+[[3159]],
+[[3160]],
+[[3161]],
+[[3162]],
+[[3163]],
+[[3164]],
+[[3165]],
+[[3166]],
+[[3167]],
+[[3168]],
+[[3169]],
+[[3170]],
+[[3171]],
+[[3172]],
+[[3173]],
+[[3174]],
+[[3175]],
+[[3176]],
+[[3177]],
+[[3178]],
+[[3179]],
+[[3180]],
+[[3181]],
+[[3182]],
+[[3183]],
+[[3184]],
+[[3185]],
+[[3186]],
+[[3187]],
+[[3188]],
+[[3189]],
+[[3190]],
+[[3191]],
+[[3192]],
+[[3193]],
+[[3194]],
+[[3195]],
+[[3196]],
+[[3197]],
+[[3198]],
+[[3199]],
+[[3200]],
+[[3201]],
+[[3202]],
+[[3203]],
+[[3204]],
+[[3205]],
+[[3206]],
+[[3207]],
+[[3208]],
+[[3209]],
+[[3210]],
+[[3211]],
+[[3212]],
+[[3213]],
+[[3214]],
+[[3215]],
+[[3216]],
+[[3217]],
+[[3218]],
+[[3219]],
+[[3220]],
+[[3221]],
+[[3222]],
+[[3223]],
+[[3224]],
+[[3225]],
+[[3226]],
+[[3227]],
+[[3228]],
+[[3229]],
+[[3230]],
+[[3231]],
+[[3232]],
+[[3233]],
+[[3234]],
+[[3235]],
+[[3236]],
+[[3237]],
+[[3238]],
+[[3239]],
+[[3240]],
+[[3241]],
+[[3242]],
+[[3243]],
+[[3244]],
+[[3245]],
+[[3246]],
+[[3247]],
+[[3248]],
+[[3249]],
+[[3250]],
+[[3251]],
+[[3252]],
+[[3253]],
+[[3254]],
+[[3255]],
+[[3256]],
+[[3257]],
+[[3258]],
+[[3259]],
+[[3260]],
+[[3261]],
+[[3262]],
+[[3263]],
+[[3264]],
+[[3265]],
+[[3266]],
+[[3267]],
+[[3268]],
+[[3269]],
+[[3270]],
+[[3271]],
+[[3272]],
+[[3273]],
+[[3274]],
+[[3275]],
+[[3276]],
+[[3277]],
+[[3278]],
+[[3279]],
+[[3280]],
+[[3281]],
+[[3282]],
+[[3283]],
+[[3284]],
+[[3285]],
+[[3286]],
+[[3287]],
+[[3288]],
+[[3289]],
+[[3290]],
+[[3291]],
+[[3292]],
+[[3293]],
+[[3294]],
+[[3295]],
+[[3296]],
+[[3297]],
+[[3298]],
+[[3299]],
+[[3300]],
+[[3301]],
+[[3302]],
+[[3303]],
+[[3304]],
+[[3305]],
+[[3306]],
+[[3307]],
+[[3308]],
+[[3309]],
+[[3310]],
+[[3311]],
+[[3312]],
+[[3313]],
+[[3314]],
+[[3315]],
+[[3316]],
+[[3317]],
+[[3318]],
+[[3319]],
+[[3320]],
+[[3321]],
+[[3322]],
+[[3323]],
+[[3324]],
+[[3325]],
+[[3326]],
+[[3327]],
+[[3328]],
+[[3329]],
+[[3330]],
+[[3331]],
+[[3332]],
+[[3333]],
+[[3334]],
+[[3335]],
+[[3336]],
+[[3337]],
+[[3338]],
+[[3339]],
+[[3340]],
+[[3341]],
+[[3342]],
+[[3343]],
+[[3344]],
+[[3345]],
+[[3346]],
+[[3347]],
+[[3348]],
+[[3349]],
+[[3350]],
+[[3351]],
+[[3352]],
+[[3353]],
+[[3354]],
+[[3355]],
+[[3356]],
+[[3357]],
+[[3358]],
+[[3359]],
+[[3360]],
+[[3361]],
+[[3362]],
+[[3363]],
+[[3364]],
+[[3365]],
+[[3366]],
+[[3367]],
+[[3368]],
+[[3369]],
+[[3370]],
+[[3371]],
+[[3372]],
+[[3373]],
+[[3374]],
+[[3375]],
+[[3376]],
+[[3377]],
+[[3378]],
+[[3379]],
+[[3380]],
+[[3381]],
+[[3382]],
+[[3383]],
+[[3384]],
+[[3385]],
+[[3386]],
+[[3387]],
+[[3388]],
+[[3389]],
+[[3390]],
+[[3391]],
+[[3392]],
+[[3393]],
+[[3394]],
+[[3395]],
+[[3396]],
+[[3397]],
+[[3398]],
+[[3399]],
+[[3400]],
+[[3401]],
+[[3402]],
+[[3403]],
+[[3404]],
+[[3405]],
+[[3406]],
+[[3407]],
+[[3408]],
+[[3409]],
+[[3410]],
+[[3411]],
+[[3412]],
+[[3413]],
+[[3414]],
+[[3415]],
+[[3416]],
+[[3417]],
+[[3418]],
+[[3419]],
+[[3420]],
+[[3421]],
+[[3422]],
+[[3423]],
+[[3424]],
+[[3425]],
+[[3426]],
+[[3427]],
+[[3428]],
+[[3429]],
+[[3430]],
+[[3431]],
+[[3432]],
+[[3433]],
+[[3434]],
+[[3435]],
+[[3436]],
+[[3437]],
+[[3438]],
+[[3439]],
+[[3440]],
+[[3441]],
+[[3442]],
+[[3443]],
+[[3444]],
+[[3445]],
+[[3446]],
+[[3447]],
+[[3448]],
+[[3449]],
+[[3450]],
+[[3451]],
+[[3452]],
+[[3453]],
+[[3454]],
+[[3455]],
+[[3456]],
+[[3457]],
+[[3458]],
+[[3459]],
+[[3460]],
+[[3461]],
+[[3462]],
+[[3463]],
+[[3464]],
+[[3465]],
+[[3466]],
+[[3467]],
+[[3468]],
+[[3469]],
+[[3470]],
+[[3471]],
+[[3472]],
+[[3473]],
+[[3474]],
+[[3475]],
+[[3476]],
+[[3477]],
+[[3478]],
+[[3479]],
+[[3480]],
+[[3481]],
+[[3482]],
+[[3483]],
+[[3484]],
+[[3485]],
+[[3486]],
+[[3487]],
+[[3488]],
+[[3489]],
+[[3490]],
+[[3491]],
+[[3492]],
+[[3493]],
+[[3494]],
+[[3495]],
+[[3496]],
+[[3497]],
+[[3498]],
+[[3499]],
+[[3500]],
+[[3501]],
+[[3502]],
+[[3503]],
+[[3504]],
+[[3505]],
+[[3506]],
+[[3507]],
+[[3508]],
+[[3509]],
+[[3510]],
+[[3511]],
+[[3512]],
+[[3513]],
+[[3514]],
+[[3515]],
+[[3516]],
+[[3517]],
+[[3518]],
+[[3519]],
+[[3520]],
+[[3521]],
+[[3522]],
+[[3523]],
+[[3524]],
+[[3525]],
+[[3526]],
+[[3527]],
+[[3528]],
+[[3529]],
+[[3530]],
+[[3531]],
+[[3532]],
+[[3533]],
+[[3534]],
+[[3535]],
+[[3536]],
+[[3537]],
+[[3538]],
+[[3539]],
+[[3540]],
+[[3541]],
+[[3542]],
+[[3543]],
+[[3544]],
+[[3545]],
+[[3546]],
+[[3547]],
+[[3548]],
+[[3549]],
+[[3550]],
+[[3551]],
+[[3552]],
+[[3553]],
+[[3554]],
+[[3555]],
+[[3556]],
+[[3557]],
+[[3558]],
+[[3559]],
+[[3560]],
+[[3561]],
+[[3562]],
+[[3563]],
+[[3564]],
+[[3565]],
+[[3566]],
+[[3567]],
+[[3568]],
+[[3569]],
+[[3570]],
+[[3571]],
+[[3572]],
+[[3573]],
+[[3574]],
+[[3575]],
+[[3576]],
+[[3577]],
+[[3578]],
+[[3579]],
+[[3580]],
+[[3581]],
+[[3582]],
+[[3583]],
+[[3584]],
+[[3585]],
+[[3586]],
+[[3587]],
+[[3588]],
+[[3589]],
+[[3590]],
+[[3591]],
+[[3592]],
+[[3593]],
+[[3594]],
+[[3595]],
+[[3596]],
+[[3597]],
+[[3598]],
+[[3599]],
+[[3600]],
+[[3601]],
+[[3602]],
+[[3603]],
+[[3604]],
+[[3605]],
+[[3606]],
+[[3607]],
+[[3608]],
+[[3609]],
+[[3610]],
+[[3611]],
+[[3612]],
+[[3613]],
+[[3614]],
+[[3615]],
+[[3616]],
+[[3617]],
+[[3618]],
+[[3619]],
+[[3620]],
+[[3621]],
+[[3622]],
+[[3623]],
+[[3624]],
+[[3625]],
+[[3626]],
+[[3627]],
+[[3628]],
+[[3629]],
+[[3630]],
+[[3631]],
+[[3632]],
+[[3633]],
+[[3634]],
+[[3635]],
+[[3636]],
+[[3637]],
+[[3638]],
+[[3639]],
+[[3640]],
+[[3641]],
+[[3642]],
+[[3643]],
+[[3644]],
+[[3645]],
+[[3646]],
+[[3647]],
+[[3648]],
+[[3649]],
+[[3650]],
+[[3651]],
+[[3652]],
+[[3653]],
+[[3654]],
+[[3655]],
+[[3656]],
+[[3657]],
+[[3658]],
+[[3659]],
+[[3660]],
+[[3661]],
+[[3662]],
+[[3663]],
+[[3664]],
+[[3665]],
+[[3666]],
+[[3667]],
+[[3668]],
+[[3669]],
+[[3670]],
+[[3671]],
+[[3672]],
+[[3673]],
+[[3674]],
+[[3675]],
+[[3676]],
+[[3677]],
+[[3678]],
+[[3679]],
+[[3680]],
+[[3681]],
+[[3682]],
+[[3683]],
+[[3684]],
+[[3685]],
+[[3686]],
+[[3687]],
+[[3688]],
+[[3689]],
+[[3690]],
+[[3691]],
+[[3692]],
+[[3693]],
+[[3694]],
+[[3695]],
+[[3696]],
+[[3697]],
+[[3698]],
+[[3699]],
+[[3700]],
+[[3701]],
+[[3702]],
+[[3703]],
+[[3704]],
+[[3705]],
+[[3706]],
+[[3707]],
+[[3708]],
+[[3709]],
+[[3710]],
+[[3711]],
+[[3712]],
+[[3713]],
+[[3714]],
+[[3715]],
+[[3716]],
+[[3717]],
+[[3718]],
+[[3719]],
+[[3720]],
+[[3721]],
+[[3722]],
+[[3723]],
+[[3724]],
+[[3725]],
+[[3726]],
+[[3727]],
+[[3728]],
+[[3729]],
+[[3730]],
+[[3731]],
+[[3732]],
+[[3733]],
+[[3734]],
+[[3735]],
+[[3736]],
+[[3737]],
+[[3738]],
+[[3739]],
+[[3740]],
+[[3741]],
+[[3742]],
+[[3743]],
+[[3744]],
+[[3745]],
+[[3746]],
+[[3747]],
+[[3748]],
+[[3749]],
+[[3750]],
+[[3751]],
+[[3752]],
+[[3753]],
+[[3754]],
+[[3755]],
+[[3756]],
+[[3757]],
+[[3758]],
+[[3759]],
+[[3760]],
+[[3761]],
+[[3762]],
+[[3763]],
+[[3764]],
+[[3765]],
+[[3766]],
+[[3767]],
+[[3768]],
+[[3769]],
+[[3770]],
+[[3771]],
+[[3772]],
+[[3773]],
+[[3774]],
+[[3775]],
+[[3776]],
+[[3777]],
+[[3778]],
+[[3779]],
+[[3780]],
+[[3781]],
+[[3782]],
+[[3783]],
+[[3784]],
+[[3785]],
+[[3786]],
+[[3787]],
+[[3788]],
+[[3789]],
+[[3790]],
+[[3791]],
+[[3792]],
+[[3793]],
+[[3794]],
+[[3795]],
+[[3796]],
+[[3797]],
+[[3798]],
+[[3799]],
+[[3800]],
+[[3801]],
+[[3802]],
+[[3803]],
+[[3804]],
+[[3805]],
+[[3806]],
+[[3807]],
+[[3808]],
+[[3809]],
+[[3810]],
+[[3811]],
+[[3812]],
+[[3813]],
+[[3814]],
+[[3815]],
+[[3816]],
+[[3817]],
+[[3818]],
+[[3819]],
+[[3820]],
+[[3821]],
+[[3822]],
+[[3823]],
+[[3824]],
+[[3825]],
+[[3826]],
+[[3827]],
+[[3828]],
+[[3829]],
+[[3830]],
+[[3831]],
+[[3832]],
+[[3833]],
+[[3834]],
+[[3835]],
+[[3836]],
+[[3837]],
+[[3838]],
+[[3839]],
+[[3840]],
+[[3841]],
+[[3842]],
+[[3843]],
+[[3844]],
+[[3845]],
+[[3846]],
+[[3847]],
+[[3848]],
+[[3849]],
+[[3850]],
+[[3851]],
+[[3852]],
+[[3853]],
+[[3854]],
+[[3855]],
+[[3856]],
+[[3857]],
+[[3858]],
+[[3859]],
+[[3860]],
+[[3861]],
+[[3862]],
+[[3863]],
+[[3864]],
+[[3865]],
+[[3866]],
+[[3867]],
+[[3868]],
+[[3869]],
+[[3870]],
+[[3871]],
+[[3872]],
+[[3873]],
+[[3874]],
+[[3875]],
+[[3876]],
+[[3877]],
+[[3878]],
+[[3879]],
+[[3880]],
+[[3881]],
+[[3882]],
+[[3883]],
+[[3884]],
+[[3885]],
+[[3886]],
+[[3887]],
+[[3888]],
+[[3889]],
+[[3890]],
+[[3891]],
+[[3892]],
+[[3893]],
+[[3894]],
+[[3895]],
+[[3896]],
+[[3897]],
+[[3898]],
+[[3899]],
+[[3900]],
+[[3901]],
+[[3902]],
+[[3903]],
+[[3904]],
+[[3905]],
+[[3906]],
+[[3907]],
+[[3908]],
+[[3909]],
+[[3910]],
+[[3911]],
+[[3912]],
+[[3913]],
+[[3914]],
+[[3915]],
+[[3916]],
+[[3917]],
+[[3918]],
+[[3919]],
+[[3920]],
+[[3921]],
+[[3922]],
+[[3923]],
+[[3924]],
+[[3925]],
+[[3926]],
+[[3927]],
+[[3928]],
+[[3929]],
+[[3930]],
+[[3931]],
+[[3932]],
+[[3933]],
+[[3934]],
+[[3935]],
+[[3936]],
+[[3937]],
+[[3938]],
+[[3939]],
+[[3940]],
+[[3941]],
+[[3942]],
+[[3943]],
+[[3944]],
+[[3945]],
+[[3946]],
+[[3947]],
+[[3948]],
+[[3949]],
+[[3950]],
+[[3951]],
+[[3952]],
+[[3953]],
+[[3954]],
+[[3955]],
+[[3956]],
+[[3957]],
+[[3958]],
+[[3959]],
+[[3960]],
+[[3961]],
+[[3962]],
+[[3963]],
+[[3964]],
+[[3965]],
+[[3966]],
+[[3967]],
+[[3968]],
+[[3969]],
+[[3970]],
+[[3971]],
+[[3972]],
+[[3973]],
+[[3974]],
+[[3975]],
+[[3976]],
+[[3977]],
+[[3978]],
+[[3979]],
+[[3980]],
+[[3981]],
+[[3982]],
+[[3983]],
+[[3984]],
+[[3985]],
+[[3986]],
+[[3987]],
+[[3988]],
+[[3989]],
+[[3990]],
+[[3991]],
+[[3992]],
+[[3993]],
+[[3994]],
+[[3995]],
+[[3996]],
+[[3997]],
+[[3998]],
+[[3999]],
+[[4000]],
+[[4001]],
+[[4002]],
+[[4003]],
+[[4004]],
+[[4005]],
+[[4006]],
+[[4007]],
+[[4008]],
+[[4009]],
+[[4010]],
+[[4011]],
+[[4012]],
+[[4013]],
+[[4014]],
+[[4015]],
+[[4016]],
+[[4017]],
+[[4018]],
+[[4019]],
+[[4020]],
+[[4021]],
+[[4022]],
+[[4023]],
+[[4024]],
+[[4025]],
+[[4026]],
+[[4027]],
+[[4028]],
+[[4029]],
+[[4030]],
+[[4031]],
+[[4032]],
+[[4033]],
+[[4034]],
+[[4035]],
+[[4036]],
+[[4037]],
+[[4038]],
+[[4039]],
+[[4040]],
+[[4041]],
+[[4042]],
+[[4043]],
+[[4044]],
+[[4045]],
+[[4046]],
+[[4047]],
+[[4048]],
+[[4049]],
+[[4050]],
+[[4051]],
+[[4052]],
+[[4053]],
+[[4054]],
+[[4055]],
+[[4056]],
+[[4057]],
+[[4058]],
+[[4059]],
+[[4060]],
+[[4061]],
+[[4062]],
+[[4063]],
+[[4064]],
+[[4065]],
+[[4066]],
+[[4067]],
+[[4068]],
+[[4069]],
+[[4070]],
+[[4071]],
+[[4072]],
+[[4073]],
+[[4074]],
+[[4075]],
+[[4076]],
+[[4077]],
+[[4078]],
+[[4079]],
+[[4080]],
+[[4081]],
+[[4082]],
+[[4083]],
+[[4084]],
+[[4085]],
+[[4086]],
+[[4087]],
+[[4088]],
+[[4089]],
+[[4090]],
+[[4091]],
+[[4092]],
+[[4093]],
+[[4094]],
+[[4095]],
+[[4096]],
+[[4097]],
+[[4098]],
+[[4099]],
+[[4100]],
+[[4101]],
+[[4102]],
+[[4103]],
+[[4104]],
+[[4105]],
+[[4106]],
+[[4107]],
+[[4108]],
+[[4109]],
+[[4110]],
+[[4111]],
+[[4112]],
+[[4113]],
+[[4114]],
+[[4115]],
+[[4116]],
+[[4117]],
+[[4118]],
+[[4119]],
+[[4120]],
+[[4121]],
+[[4122]],
+[[4123]],
+[[4124]],
+[[4125]],
+[[4126]],
+[[4127]],
+[[4128]],
+[[4129]],
+[[4130]],
+[[4131]],
+[[4132]],
+[[4133]],
+[[4134]],
+[[4135]],
+[[4136]],
+[[4137]],
+[[4138]],
+[[4139]],
+[[4140]],
+[[4141]],
+[[4142]],
+[[4143]],
+[[4144]],
+[[4145]],
+[[4146]],
+[[4147]],
+[[4148]],
+[[4149]],
+[[4150]],
+[[4151]],
+[[4152]],
+[[4153]],
+[[4154]],
+[[4155]],
+[[4156]],
+[[4157]],
+[[4158]],
+[[4159]],
+[[4160]],
+[[4161]],
+[[4162]],
+[[4163]],
+[[4164]],
+[[4165]],
+[[4166]],
+[[4167]],
+[[4168]],
+[[4169]],
+[[4170]],
+[[4171]],
+[[4172]],
+[[4173]],
+[[4174]],
+[[4175]],
+[[4176]],
+[[4177]],
+[[4178]],
+[[4179]],
+[[4180]],
+[[4181]],
+[[4182]],
+[[4183]],
+[[4184]],
+[[4185]],
+[[4186]],
+[[4187]],
+[[4188]],
+[[4189]],
+[[4190]],
+[[4191]],
+[[4192]],
+[[4193]],
+[[4194]],
+[[4195]],
+[[4196]],
+[[4197]],
+[[4198]],
+[[4199]],
+[[4200]],
+[[4201]],
+[[4202]],
+[[4203]],
+[[4204]],
+[[4205]],
+[[4206]],
+[[4207]],
+[[4208]],
+[[4209]],
+[[4210]],
+[[4211]],
+[[4212]],
+[[4213]],
+[[4214]],
+[[4215]],
+[[4216]],
+[[4217]],
+[[4218]],
+[[4219]],
+[[4220]],
+[[4221]],
+[[4222]],
+[[4223]],
+[[4224]],
+[[4225]],
+[[4226]],
+[[4227]],
+[[4228]],
+[[4229]],
+[[4230]],
+[[4231]],
+[[4232]],
+[[4233]],
+[[4234]],
+[[4235]],
+[[4236]],
+[[4237]],
+[[4238]],
+[[4239]],
+[[4240]],
+[[4241]],
+[[4242]],
+[[4243]],
+[[4244]],
+[[4245]],
+[[4246]],
+[[4247]],
+[[4248]],
+[[4249]],
+[[4250]],
+[[4251]],
+[[4252]],
+[[4253]],
+[[4254]],
+[[4255]],
+[[4256]],
+[[4257]],
+[[4258]],
+[[4259]],
+[[4260]],
+[[4261]],
+[[4262]],
+[[4263]],
+[[4264]],
+[[4265]],
+[[4266]],
+[[4267]],
+[[4268]],
+[[4269]],
+[[4270]],
+[[4271]],
+[[4272]],
+[[4273]],
+[[4274]],
+[[4275]],
+[[4276]],
+[[4277]],
+[[4278]],
+[[4279]],
+[[4280]],
+[[4281]],
+[[4282]],
+[[4283]],
+[[4284]],
+[[4285]],
+[[4286]],
+[[4287]],
+[[4288]],
+[[4289]],
+[[4290]],
+[[4291]],
+[[4292]],
+[[4293]],
+[[4294]],
+[[4295]],
+[[4296]],
+[[4297]],
+[[4298]],
+[[4299]],
+[[4300]],
+[[4301]],
+[[4302]],
+[[4303]],
+[[4304]],
+[[4305]],
+[[4306]],
+[[4307]],
+[[4308]],
+[[4309]],
+[[4310]],
+[[4311]],
+[[4312]],
+[[4313]],
+[[4314]],
+[[4315]],
+[[4316]],
+[[4317]],
+[[4318]],
+[[4319]],
+[[4320]],
+[[4321]],
+[[4322]],
+[[4323]],
+[[4324]],
+[[4325]],
+[[4326]],
+[[4327]],
+[[4328]],
+[[4329]],
+[[4330]],
+[[4331]],
+[[4332]],
+[[4333]],
+[[4334]],
+[[4335]],
+[[4336]],
+[[4337]],
+[[4338]],
+[[4339]],
+[[4340]],
+[[4341]],
+[[4342]],
+[[4343]],
+[[4344]],
+[[4345]],
+[[4346]],
+[[4347]],
+[[4348]],
+[[4349]],
+[[4350]],
+[[4351]],
+[[4352]],
+[[4353]],
+[[4354]],
+[[4355]],
+[[4356]],
+[[4357]],
+[[4358]],
+[[4359]],
+[[4360]],
+[[4361]],
+[[4362]],
+[[4363]],
+[[4364]],
+[[4365]],
+[[4366]],
+[[4367]],
+[[4368]],
+[[4369]],
+[[4370]],
+[[4371]],
+[[4372]],
+[[4373]],
+[[4374]],
+[[4375]],
+[[4376]],
+[[4377]],
+[[4378]],
+[[4379]],
+[[4380]],
+[[4381]],
+[[4382]],
+[[4383]],
+[[4384]],
+[[4385]],
+[[4386]],
+[[4387]],
+[[4388]],
+[[4389]],
+[[4390]],
+[[4391]],
+[[4392]],
+[[4393]],
+[[4394]],
+[[4395]],
+[[4396]],
+[[4397]],
+[[4398]],
+[[4399]],
+[[4400]],
+[[4401]],
+[[4402]],
+[[4403]],
+[[4404]],
+[[4405]],
+[[4406]],
+[[4407]],
+[[4408]],
+[[4409]],
+[[4410]],
+[[4411]],
+[[4412]],
+[[4413]],
+[[4414]],
+[[4415]],
+[[4416]],
+[[4417]],
+[[4418]],
+[[4419]],
+[[4420]],
+[[4421]],
+[[4422]],
+[[4423]],
+[[4424]],
+[[4425]],
+[[4426]],
+[[4427]],
+[[4428]],
+[[4429]],
+[[4430]],
+[[4431]],
+[[4432]],
+[[4433]],
+[[4434]],
+[[4435]],
+[[4436]],
+[[4437]],
+[[4438]],
+[[4439]],
+[[4440]],
+[[4441]],
+[[4442]],
+[[4443]],
+[[4444]],
+[[4445]],
+[[4446]],
+[[4447]],
+[[4448]],
+[[4449]],
+[[4450]],
+[[4451]],
+[[4452]],
+[[4453]],
+[[4454]],
+[[4455]],
+[[4456]],
+[[4457]],
+[[4458]],
+[[4459]],
+[[4460]],
+[[4461]],
+[[4462]],
+[[4463]],
+[[4464]],
+[[4465]],
+[[4466]],
+[[4467]],
+[[4468]],
+[[4469]],
+[[4470]],
+[[4471]],
+[[4472]],
+[[4473]],
+[[4474]],
+[[4475]],
+[[4476]],
+[[4477]],
+[[4478]],
+[[4479]],
+[[4480]],
+[[4481]],
+[[4482]],
+[[4483]],
+[[4484]],
+[[4485]],
+[[4486]],
+[[4487]],
+[[4488]],
+[[4489]],
+[[4490]],
+[[4491]],
+[[4492]],
+[[4493]],
+[[4494]],
+[[4495]],
+[[4496]],
+[[4497]],
+[[4498]],
+[[4499]],
+[[4500]],
+[[4501]],
+[[4502]],
+[[4503]],
+[[4504]],
+[[4505]],
+[[4506]],
+[[4507]],
+[[4508]],
+[[4509]],
+[[4510]],
+[[4511]],
+[[4512]],
+[[4513]],
+[[4514]],
+[[4515]],
+[[4516]],
+[[4517]],
+[[4518]],
+[[4519]],
+[[4520]],
+[[4521]],
+[[4522]],
+[[4523]],
+[[4524]],
+[[4525]],
+[[4526]],
+[[4527]],
+[[4528]],
+[[4529]],
+[[4530]],
+[[4531]],
+[[4532]],
+[[4533]],
+[[4534]],
+[[4535]],
+[[4536]],
+[[4537]],
+[[4538]],
+[[4539]],
+[[4540]],
+[[4541]],
+[[4542]],
+[[4543]],
+[[4544]],
+[[4545]],
+[[4546]],
+[[4547]],
+[[4548]],
+[[4549]],
+[[4550]],
+[[4551]],
+[[4552]],
+[[4553]],
+[[4554]],
+[[4555]],
+[[4556]],
+[[4557]],
+[[4558]],
+[[4559]],
+[[4560]],
+[[4561]],
+[[4562]],
+[[4563]],
+[[4564]],
+[[4565]],
+[[4566]],
+[[4567]],
+[[4568]],
+[[4569]],
+[[4570]],
+[[4571]],
+[[4572]],
+[[4573]],
+[[4574]],
+[[4575]],
+[[4576]],
+[[4577]],
+[[4578]],
+[[4579]],
+[[4580]],
+[[4581]],
+[[4582]],
+[[4583]],
+[[4584]],
+[[4585]],
+[[4586]],
+[[4587]],
+[[4588]],
+[[4589]],
+[[4590]],
+[[4591]],
+[[4592]],
+[[4593]],
+[[4594]],
+[[4595]],
+[[4596]],
+[[4597]],
+[[4598]],
+[[4599]],
+[[4600]],
+[[4601]],
+[[4602]],
+[[4603]],
+[[4604]],
+[[4605]],
+[[4606]],
+[[4607]],
+[[4608]],
+[[4609]],
+[[4610]],
+[[4611]],
+[[4612]],
+[[4613]],
+[[4614]],
+[[4615]],
+[[4616]],
+[[4617]],
+[[4618]],
+[[4619]],
+[[4620]],
+[[4621]],
+[[4622]],
+[[4623]],
+[[4624]],
+[[4625]],
+[[4626]],
+[[4627]],
+[[4628]],
+[[4629]],
+[[4630]],
+[[4631]],
+[[4632]],
+[[4633]],
+[[4634]],
+[[4635]],
+[[4636]],
+[[4637]],
+[[4638]],
+[[4639]],
+[[4640]],
+[[4641]],
+[[4642]],
+[[4643]],
+[[4644]],
+[[4645]],
+[[4646]],
+[[4647]],
+[[4648]],
+[[4649]],
+[[4650]],
+[[4651]],
+[[4652]],
+[[4653]],
+[[4654]],
+[[4655]],
+[[4656]],
+[[4657]],
+[[4658]],
+[[4659]],
+[[4660]],
+[[4661]],
+[[4662]],
+[[4663]],
+[[4664]],
+[[4665]],
+[[4666]],
+[[4667]],
+[[4668]],
+[[4669]],
+[[4670]],
+[[4671]],
+[[4672]],
+[[4673]],
+[[4674]],
+[[4675]],
+[[4676]],
+[[4677]],
+[[4678]],
+[[4679]],
+[[4680]],
+[[4681]],
+[[4682]],
+[[4683]],
+[[4684]],
+[[4685]],
+[[4686]],
+[[4687]],
+[[4688]],
+[[4689]],
+[[4690]],
+[[4691]],
+[[4692]],
+[[4693]],
+[[4694]],
+[[4695]],
+[[4696]],
+[[4697]],
+[[4698]],
+[[4699]],
+[[4700]],
+[[4701]],
+[[4702]],
+[[4703]],
+[[4704]],
+[[4705]],
+[[4706]],
+[[4707]],
+[[4708]],
+[[4709]],
+[[4710]],
+[[4711]],
+[[4712]],
+[[4713]],
+[[4714]],
+[[4715]],
+[[4716]],
+[[4717]],
+[[4718]],
+[[4719]],
+[[4720]],
+[[4721]],
+[[4722]],
+[[4723]],
+[[4724]],
+[[4725]],
+[[4726]],
+[[4727]],
+[[4728]],
+[[4729]],
+[[4730]],
+[[4731]],
+[[4732]],
+[[4733]],
+[[4734]],
+[[4735]],
+[[4736]],
+[[4737]],
+[[4738]],
+[[4739]],
+[[4740]],
+[[4741]],
+[[4742]],
+[[4743]],
+[[4744]],
+[[4745]],
+[[4746]],
+[[4747]],
+[[4748]],
+[[4749]],
+[[4750]],
+[[4751]],
+[[4752]],
+[[4753]],
+[[4754]],
+[[4755]],
+[[4756]],
+[[4757]],
+[[4758]],
+[[4759]],
+[[4760]],
+[[4761]],
+[[4762]],
+[[4763]],
+[[4764]],
+[[4765]],
+[[4766]],
+[[4767]],
+[[4768]],
+[[4769]],
+[[4770]],
+[[4771]],
+[[4772]],
+[[4773]],
+[[4774]],
+[[4775]],
+[[4776]],
+[[4777]],
+[[4778]],
+[[4779]],
+[[4780]],
+[[4781]],
+[[4782]],
+[[4783]],
+[[4784]],
+[[4785]],
+[[4786]],
+[[4787]],
+[[4788]],
+[[4789]],
+[[4790]],
+[[4791]],
+[[4792]],
+[[4793]],
+[[4794]],
+[[4795]],
+[[4796]],
+[[4797]],
+[[4798]],
+[[4799]],
+[[4800]],
+[[4801]],
+[[4802]],
+[[4803]],
+[[4804]],
+[[4805]],
+[[4806]],
+[[4807]],
+[[4808]],
+[[4809]],
+[[4810]],
+[[4811]],
+[[4812]],
+[[4813]],
+[[4814]],
+[[4815]],
+[[4816]],
+[[4817]],
+[[4818]],
+[[4819]],
+[[4820]],
+[[4821]],
+[[4822]],
+[[4823]],
+[[4824]],
+[[4825]],
+[[4826]],
+[[4827]],
+[[4828]],
+[[4829]],
+[[4830]],
+[[4831]],
+[[4832]],
+[[4833]],
+[[4834]],
+[[4835]],
+[[4836]],
+[[4837]],
+[[4838]],
+[[4839]],
+[[4840]],
+[[4841]],
+[[4842]],
+[[4843]],
+[[4844]],
+[[4845]],
+[[4846]],
+[[4847]],
+[[4848]],
+[[4849]],
+[[4850]],
+[[4851]],
+[[4852]],
+[[4853]],
+[[4854]],
+[[4855]],
+[[4856]],
+[[4857]],
+[[4858]],
+[[4859]],
+[[4860]],
+[[4861]],
+[[4862]],
+[[4863]],
+[[4864]],
+[[4865]],
+[[4866]],
+[[4867]],
+[[4868]],
+[[4869]],
+[[4870]],
+[[4871]],
+[[4872]],
+[[4873]],
+[[4874]],
+[[4875]],
+[[4876]],
+[[4877]],
+[[4878]],
+[[4879]],
+[[4880]],
+[[4881]],
+[[4882]],
+[[4883]],
+[[4884]],
+[[4885]],
+[[4886]],
+[[4887]],
+[[4888]],
+[[4889]],
+[[4890]],
+[[4891]],
+[[4892]],
+[[4893]],
+[[4894]],
+[[4895]],
+[[4896]],
+[[4897]],
+[[4898]],
+[[4899]],
+[[4900]],
+[[4901]],
+[[4902]],
+[[4903]],
+[[4904]],
+[[4905]],
+[[4906]],
+[[4907]],
+[[4908]],
+[[4909]],
+[[4910]],
+[[4911]],
+[[4912]],
+[[4913]],
+[[4914]],
+[[4915]],
+[[4916]],
+[[4917]],
+[[4918]],
+[[4919]],
+[[4920]],
+[[4921]],
+[[4922]],
+[[4923]],
+[[4924]],
+[[4925]],
+[[4926]],
+[[4927]],
+[[4928]],
+[[4929]],
+[[4930]],
+[[4931]],
+[[4932]],
+[[4933]],
+[[4934]],
+[[4935]],
+[[4936]],
+[[4937]],
+[[4938]],
+[[4939]],
+[[4940]],
+[[4941]],
+[[4942]],
+[[4943]],
+[[4944]],
+[[4945]],
+[[4946]],
+[[4947]],
+[[4948]],
+[[4949]],
+[[4950]],
+[[4951]],
+[[4952]],
+[[4953]],
+[[4954]],
+[[4955]],
+[[4956]],
+[[4957]],
+[[4958]],
+[[4959]],
+[[4960]],
+[[4961]],
+[[4962]],
+[[4963]],
+[[4964]],
+[[4965]],
+[[4966]],
+[[4967]],
+[[4968]],
+[[4969]],
+[[4970]],
+[[4971]],
+[[4972]],
+[[4973]],
+[[4974]],
+[[4975]],
+[[4976]],
+[[4977]],
+[[4978]],
+[[4979]],
+[[4980]],
+[[4981]],
+[[4982]],
+[[4983]],
+[[4984]],
+[[4985]],
+[[4986]],
+[[4987]],
+[[4988]],
+[[4989]],
+[[4990]],
+[[4991]],
+[[4992]],
+[[4993]],
+[[4994]],
+[[4995]],
+[[4996]],
+[[4997]],
+[[4998]],
+[[4999]],
+[[5000]],
+[[5001]],
+[[5002]],
+[[5003]],
+[[5004]],
+[[5005]],
+[[5006]],
+[[5007]],
+[[5008]],
+[[5009]],
+[[5010]],
+[[5011]],
+[[5012]],
+[[5013]],
+[[5014]],
+[[5015]],
+[[5016]],
+[[5017]],
+[[5018]],
+[[5019]],
+[[5020]],
+[[5021]],
+[[5022]],
+[[5023]],
+[[5024]],
+[[5025]],
+[[5026]],
+[[5027]],
+[[5028]],
+[[5029]],
+[[5030]],
+[[5031]],
+[[5032]],
+[[5033]],
+[[5034]],
+[[5035]],
+[[5036]],
+[[5037]],
+[[5038]],
+[[5039]],
+[[5040]],
+[[5041]],
+[[5042]],
+[[5043]],
+[[5044]],
+[[5045]],
+[[5046]],
+[[5047]],
+[[5048]],
+[[5049]],
+[[5050]],
+[[5051]],
+[[5052]],
+[[5053]],
+[[5054]],
+[[5055]],
+[[5056]],
+[[5057]],
+[[5058]],
+[[5059]],
+[[5060]],
+[[5061]],
+[[5062]],
+[[5063]],
+[[5064]],
+[[5065]],
+[[5066]],
+[[5067]],
+[[5068]],
+[[5069]],
+[[5070]],
+[[5071]],
+[[5072]],
+[[5073]],
+[[5074]],
+[[5075]],
+[[5076]],
+[[5077]],
+[[5078]],
+[[5079]],
+[[5080]],
+[[5081]],
+[[5082]],
+[[5083]],
+[[5084]],
+[[5085]],
+[[5086]],
+[[5087]],
+[[5088]],
+[[5089]],
+[[5090]],
+[[5091]],
+[[5092]],
+[[5093]],
+[[5094]],
+[[5095]],
+[[5096]],
+[[5097]],
+[[5098]],
+[[5099]],
+[[5100]],
+[[5101]],
+[[5102]],
+[[5103]],
+[[5104]],
+[[5105]],
+[[5106]],
+[[5107]],
+[[5108]],
+[[5109]],
+[[5110]],
+[[5111]],
+[[5112]],
+[[5113]],
+[[5114]],
+[[5115]],
+[[5116]],
+[[5117]],
+[[5118]],
+[[5119]],
+[[5120]],
+[[5121]],
+[[5122]],
+[[5123]],
+[[5124]],
+[[5125]],
+[[5126]],
+[[5127]],
+[[5128]],
+[[5129]],
+[[5130]],
+[[5131]],
+[[5132]],
+[[5133]],
+[[5134]],
+[[5135]],
+[[5136]],
+[[5137]],
+[[5138]],
+[[5139]],
+[[5140]],
+[[5141]],
+[[5142]],
+[[5143]],
+[[5144]],
+[[5145]],
+[[5146]],
+[[5147]],
+[[5148]],
+[[5149]],
+[[5150]],
+[[5151]],
+[[5152]],
+[[5153]],
+[[5154]],
+[[5155]],
+[[5156]],
+[[5157]],
+[[5158]],
+[[5159]],
+[[5160]],
+[[5161]],
+[[5162]],
+[[5163]],
+[[5164]],
+[[5165]],
+[[5166]],
+[[5167]],
+[[5168]],
+[[5169]],
+[[5170]],
+[[5171]],
+[[5172]],
+[[5173]],
+[[5174]],
+[[5175]],
+[[5176]],
+[[5177]],
+[[5178]],
+[[5179]],
+[[5180]],
+[[5181]],
+[[5182]],
+[[5183]],
+[[5184]],
+[[5185]],
+[[5186]],
+[[5187]],
+[[5188]],
+[[5189]],
+[[5190]],
+[[5191]],
+[[5192]],
+[[5193]],
+[[5194]],
+[[5195]],
+[[5196]],
+[[5197]],
+[[5198]],
+[[5199]],
+[[5200]],
+[[5201]],
+[[5202]],
+[[5203]],
+[[5204]],
+[[5205]],
+[[5206]],
+[[5207]],
+[[5208]],
+[[5209]],
+[[5210]],
+[[5211]],
+[[5212]],
+[[5213]],
+[[5214]],
+[[5215]],
+[[5216]],
+[[5217]],
+[[5218]],
+[[5219]],
+[[5220]],
+[[5221]],
+[[5222]],
+[[5223]],
+[[5224]],
+[[5225]],
+[[5226]],
+[[5227]],
+[[5228]],
+[[5229]],
+[[5230]],
+[[5231]],
+[[5232]],
+[[5233]],
+[[5234]],
+[[5235]],
+[[5236]],
+[[5237]],
+[[5238]],
+[[5239]],
+[[5240]],
+[[5241]],
+[[5242]],
+[[5243]],
+[[5244]],
+[[5245]],
+[[5246]],
+[[5247]],
+[[5248]],
+[[5249]],
+[[5250]],
+[[5251]],
+[[5252]],
+[[5253]],
+[[5254]],
+[[5255]],
+[[5256]],
+[[5257]],
+[[5258]],
+[[5259]],
+[[5260]],
+[[5261]],
+[[5262]],
+[[5263]],
+[[5264]],
+[[5265]],
+[[5266]],
+[[5267]],
+[[5268]],
+[[5269]],
+[[5270]],
+[[5271]],
+[[5272]],
+[[5273]],
+[[5274]],
+[[5275]],
+[[5276]],
+[[5277]],
+[[5278]],
+[[5279]],
+[[5280]],
+[[5281]],
+[[5282]],
+[[5283]],
+[[5284]],
+[[5285]],
+[[5286]],
+[[5287]],
+[[5288]],
+[[5289]],
+[[5290]],
+[[5291]],
+[[5292]],
+[[5293]],
+[[5294]],
+[[5295]],
+[[5296]],
+[[5297]],
+[[5298]],
+[[5299]],
+[[5300]],
+[[5301]],
+[[5302]],
+[[5303]],
+[[5304]],
+[[5305]],
+[[5306]],
+[[5307]],
+[[5308]],
+[[5309]],
+[[5310]],
+[[5311]],
+[[5312]],
+[[5313]],
+[[5314]],
+[[5315]],
+[[5316]],
+[[5317]],
+[[5318]],
+[[5319]],
+[[5320]],
+[[5321]],
+[[5322]],
+[[5323]],
+[[5324]],
+[[5325]],
+[[5326]],
+[[5327]],
+[[5328]],
+[[5329]],
+[[5330]],
+[[5331]],
+[[5332]],
+[[5333]],
+[[5334]],
+[[5335]],
+[[5336]],
+[[5337]],
+[[5338]],
+[[5339]],
+[[5340]],
+[[5341]],
+[[5342]],
+[[5343]],
+[[5344]],
+[[5345]],
+[[5346]],
+[[5347]],
+[[5348]],
+[[5349]],
+[[5350]],
+[[5351]],
+[[5352]],
+[[5353]],
+[[5354]],
+[[5355]],
+[[5356]],
+[[5357]],
+[[5358]],
+[[5359]],
+[[5360]],
+[[5361]],
+[[5362]],
+[[5363]],
+[[5364]],
+[[5365]],
+[[5366]],
+[[5367]],
+[[5368]],
+[[5369]],
+[[5370]],
+[[5371]],
+[[5372]],
+[[5373]],
+[[5374]],
+[[5375]],
+[[5376]],
+[[5377]],
+[[5378]],
+[[5379]],
+[[5380]],
+[[5381]],
+[[5382]],
+[[5383]],
+[[5384]],
+[[5385]],
+[[5386]],
+[[5387]],
+[[5388]],
+[[5389]],
+[[5390]],
+[[5391]],
+[[5392]],
+[[5393]],
+[[5394]],
+[[5395]],
+[[5396]],
+[[5397]],
+[[5398]],
+[[5399]],
+[[5400]],
+[[5401]],
+[[5402]],
+[[5403]],
+[[5404]],
+[[5405]],
+[[5406]],
+[[5407]],
+[[5408]],
+[[5409]],
+[[5410]],
+[[5411]],
+[[5412]],
+[[5413]],
+[[5414]],
+[[5415]],
+[[5416]],
+[[5417]],
+[[5418]],
+[[5419]],
+[[5420]],
+[[5421]],
+[[5422]],
+[[5423]],
+[[5424]],
+[[5425]],
+[[5426]],
+[[5427]],
+[[5428]],
+[[5429]],
+[[5430]],
+[[5431]],
+[[5432]],
+[[5433]],
+[[5434]],
+[[5435]],
+[[5436]],
+[[5437]],
+[[5438]],
+[[5439]],
+[[5440]],
+[[5441]],
+[[5442]],
+[[5443]],
+[[5444]],
+[[5445]],
+[[5446]],
+[[5447]],
+[[5448]],
+[[5449]],
+[[5450]],
+[[5451]],
+[[5452]],
+[[5453]],
+[[5454]],
+[[5455]],
+[[5456]],
+[[5457]],
+[[5458]],
+[[5459]],
+[[5460]],
+[[5461]],
+[[5462]],
+[[5463]],
+[[5464]],
+[[5465]],
+[[5466]],
+[[5467]],
+[[5468]],
+[[5469]],
+[[5470]],
+[[5471]],
+[[5472]],
+[[5473]],
+[[5474]],
+[[5475]],
+[[5476]],
+[[5477]],
+[[5478]],
+[[5479]],
+[[5480]],
+[[5481]],
+[[5482]],
+[[5483]],
+[[5484]],
+[[5485]],
+[[5486]],
+[[5487]],
+[[5488]],
+[[5489]],
+[[5490]],
+[[5491]],
+[[5492]],
+[[5493]],
+[[5494]],
+[[5495]],
+[[5496]],
+[[5497]],
+[[5498]],
+[[5499]],
+[[5500]],
+[[5501]],
+[[5502]],
+[[5503]],
+[[5504]],
+[[5505]],
+[[5506]],
+[[5507]],
+[[5508]],
+[[5509]],
+[[5510]],
+[[5511]],
+[[5512]],
+[[5513]],
+[[5514]],
+[[5515]],
+[[5516]],
+[[5517]],
+[[5518]],
+[[5519]],
+[[5520]],
+[[5521]],
+[[5522]],
+[[5523]],
+[[5524]],
+[[5525]],
+[[5526]],
+[[5527]],
+[[5528]],
+[[5529]],
+[[5530]],
+[[5531]],
+[[5532]],
+[[5533]],
+[[5534]],
+[[5535]],
+[[5536]],
+[[5537]],
+[[5538]],
+[[5539]],
+[[5540]],
+[[5541]],
+[[5542]],
+[[5543]],
+[[5544]],
+[[5545]],
+[[5546]],
+[[5547]],
+[[5548]],
+[[5549]],
+[[5550]],
+[[5551]],
+[[5552]],
+[[5553]],
+[[5554]],
+[[5555]],
+[[5556]],
+[[5557]],
+[[5558]],
+[[5559]],
+[[5560]],
+[[5561]],
+[[5562]],
+[[5563]],
+[[5564]],
+[[5565]],
+[[5566]],
+[[5567]],
+[[5568]],
+[[5569]],
+[[5570]],
+[[5571]],
+[[5572]],
+[[5573]],
+[[5574]],
+[[5575]],
+[[5576]],
+[[5577]],
+[[5578]],
+[[5579]],
+[[5580]],
+[[5581]],
+[[5582]],
+[[5583]],
+[[5584]],
+[[5585]],
+[[5586]],
+[[5587]],
+[[5588]],
+[[5589]],
+[[5590]],
+[[5591]],
+[[5592]],
+[[5593]],
+[[5594]],
+[[5595]],
+[[5596]],
+[[5597]],
+[[5598]],
+[[5599]],
+[[5600]],
+[[5601]],
+[[5602]],
+[[5603]],
+[[5604]],
+[[5605]],
+[[5606]],
+[[5607]],
+[[5608]],
+[[5609]],
+[[5610]],
+[[5611]],
+[[5612]],
+[[5613]],
+[[5614]],
+[[5615]],
+[[5616]],
+[[5617]],
+[[5618]],
+[[5619]],
+[[5620]],
+[[5621]],
+[[5622]],
+[[5623]],
+[[5624]],
+[[5625]],
+[[5626]],
+[[5627]],
+[[5628]],
+[[5629]],
+[[5630]],
+[[5631]],
+[[5632]],
+[[5633]],
+[[5634]],
+[[5635]],
+[[5636]],
+[[5637]],
+[[5638]],
+[[5639]],
+[[5640]],
+[[5641]],
+[[5642]],
+[[5643]],
+[[5644]],
+[[5645]],
+[[5646]],
+[[5647]],
+[[5648]],
+[[5649]],
+[[5650]],
+[[5651]],
+[[5652]],
+[[5653]],
+[[5654]],
+[[5655]],
+[[5656]],
+[[5657]],
+[[5658]],
+[[5659]],
+[[5660]],
+[[5661]],
+[[5662]],
+[[5663]],
+[[5664]],
+[[5665]],
+[[5666]],
+[[5667]],
+[[5668]],
+[[5669]],
+[[5670]],
+[[5671]],
+[[5672]],
+[[5673]],
+[[5674]],
+[[5675]],
+[[5676]],
+[[5677]],
+[[5678]],
+[[5679]],
+[[5680]],
+[[5681]],
+[[5682]],
+[[5683]],
+[[5684]],
+[[5685]],
+[[5686]],
+[[5687]],
+[[5688]],
+[[5689]],
+[[5690]],
+[[5691]],
+[[5692]],
+[[5693]],
+[[5694]],
+[[5695]],
+[[5696]],
+[[5697]],
+[[5698]],
+[[5699]],
+[[5700]],
+[[5701]],
+[[5702]],
+[[5703]],
+[[5704]],
+[[5705]],
+[[5706]],
+[[5707]],
+[[5708]],
+[[5709]],
+[[5710]],
+[[5711]],
+[[5712]],
+[[5713]],
+[[5714]],
+[[5715]],
+[[5716]],
+[[5717]],
+[[5718]],
+[[5719]],
+[[5720]],
+[[5721]],
+[[5722]],
+[[5723]],
+[[5724]],
+[[5725]],
+[[5726]],
+[[5727]],
+[[5728]],
+[[5729]],
+[[5730]],
+[[5731]],
+[[5732]],
+[[5733]],
+[[5734]],
+[[5735]],
+[[5736]],
+[[5737]],
+[[5738]],
+[[5739]],
+[[5740]],
+[[5741]],
+[[5742]],
+[[5743]],
+[[5744]],
+[[5745]],
+[[5746]],
+[[5747]],
+[[5748]],
+[[5749]],
+[[5750]],
+[[5751]],
+[[5752]],
+[[5753]],
+[[5754]],
+[[5755]],
+[[5756]],
+[[5757]],
+[[5758]],
+[[5759]],
+[[5760]],
+[[5761]],
+[[5762]],
+[[5763]],
+[[5764]],
+[[5765]],
+[[5766]],
+[[5767]],
+[[5768]],
+[[5769]],
+[[5770]],
+[[5771]],
+[[5772]],
+[[5773]],
+[[5774]],
+[[5775]],
+[[5776]],
+[[5777]],
+[[5778]],
+[[5779]],
+[[5780]],
+[[5781]],
+[[5782]],
+[[5783]],
+[[5784]],
+[[5785]],
+[[5786]],
+[[5787]],
+[[5788]],
+[[5789]],
+[[5790]],
+[[5791]],
+[[5792]],
+[[5793]],
+[[5794]],
+[[5795]],
+[[5796]],
+[[5797]],
+[[5798]],
+[[5799]],
+[[5800]],
+[[5801]],
+[[5802]],
+[[5803]],
+[[5804]],
+[[5805]],
+[[5806]],
+[[5807]],
+[[5808]],
+[[5809]],
+[[5810]],
+[[5811]],
+[[5812]],
+[[5813]],
+[[5814]],
+[[5815]],
+[[5816]],
+[[5817]],
+[[5818]],
+[[5819]],
+[[5820]],
+[[5821]],
+[[5822]],
+[[5823]],
+[[5824]],
+[[5825]],
+[[5826]],
+[[5827]],
+[[5828]],
+[[5829]],
+[[5830]],
+[[5831]],
+[[5832]],
+[[5833]],
+[[5834]],
+[[5835]],
+[[5836]],
+[[5837]],
+[[5838]],
+[[5839]],
+[[5840]],
+[[5841]],
+[[5842]],
+[[5843]],
+[[5844]],
+[[5845]],
+[[5846]],
+[[5847]],
+[[5848]],
+[[5849]],
+[[5850]],
+[[5851]],
+[[5852]],
+[[5853]],
+[[5854]],
+[[5855]],
+[[5856]],
+[[5857]],
+[[5858]],
+[[5859]],
+[[5860]],
+[[5861]],
+[[5862]],
+[[5863]],
+[[5864]],
+[[5865]],
+[[5866]],
+[[5867]],
+[[5868]],
+[[5869]],
+[[5870]],
+[[5871]],
+[[5872]],
+[[5873]],
+[[5874]],
+[[5875]],
+[[5876]],
+[[5877]],
+[[5878]],
+[[5879]],
+[[5880]],
+[[5881]],
+[[5882]],
+[[5883]],
+[[5884]],
+[[5885]],
+[[5886]],
+[[5887]],
+[[5888]],
+[[5889]],
+[[5890]],
+[[5891]],
+[[5892]],
+[[5893]],
+[[5894]],
+[[5895]],
+[[5896]],
+[[5897]],
+[[5898]],
+[[5899]],
+[[5900]],
+[[5901]],
+[[5902]],
+[[5903]],
+[[5904]],
+[[5905]],
+[[5906]],
+[[5907]],
+[[5908]],
+[[5909]],
+[[5910]],
+[[5911]],
+[[5912]],
+[[5913]],
+[[5914]],
+[[5915]],
+[[5916]],
+[[5917]],
+[[5918]],
+[[5919]],
+[[5920]],
+[[5921]],
+[[5922]],
+[[5923]],
+[[5924]],
+[[5925]],
+[[5926]],
+[[5927]],
+[[5928]],
+[[5929]],
+[[5930]],
+[[5931]],
+[[5932]],
+[[5933]],
+[[5934]],
+[[5935]],
+[[5936]],
+[[5937]],
+[[5938]],
+[[5939]],
+[[5940]],
+[[5941]],
+[[5942]],
+[[5943]],
+[[5944]],
+[[5945]],
+[[5946]],
+[[5947]],
+[[5948]],
+[[5949]],
+[[5950]],
+[[5951]],
+[[5952]],
+[[5953]],
+[[5954]],
+[[5955]],
+[[5956]],
+[[5957]],
+[[5958]],
+[[5959]],
+[[5960]],
+[[5961]],
+[[5962]],
+[[5963]],
+[[5964]],
+[[5965]],
+[[5966]],
+[[5967]],
+[[5968]],
+[[5969]],
+[[5970]],
+[[5971]],
+[[5972]],
+[[5973]],
+[[5974]],
+[[5975]],
+[[5976]],
+[[5977]],
+[[5978]],
+[[5979]],
+[[5980]],
+[[5981]],
+[[5982]],
+[[5983]],
+[[5984]],
+[[5985]],
+[[5986]],
+[[5987]],
+[[5988]],
+[[5989]],
+[[5990]],
+[[5991]],
+[[5992]],
+[[5993]],
+[[5994]],
+[[5995]],
+[[5996]],
+[[5997]],
+[[5998]],
+[[5999]],
+[[6000]],
+[[6001]],
+[[6002]],
+[[6003]],
+[[6004]],
+[[6005]],
+[[6006]],
+[[6007]],
+[[6008]],
+[[6009]],
+[[6010]],
+[[6011]],
+[[6012]],
+[[6013]],
+[[6014]],
+[[6015]],
+[[6016]],
+[[6017]],
+[[6018]],
+[[6019]],
+[[6020]],
+[[6021]],
+[[6022]],
+[[6023]],
+[[6024]],
+[[6025]],
+[[6026]],
+[[6027]],
+[[6028]],
+[[6029]],
+[[6030]],
+[[6031]],
+[[6032]],
+[[6033]],
+[[6034]],
+[[6035]],
+[[6036]],
+[[6037]],
+[[6038]],
+[[6039]],
+[[6040]],
+[[6041]],
+[[6042]],
+[[6043]],
+[[6044]],
+[[6045]],
+[[6046]],
+[[6047]],
+[[6048]],
+[[6049]],
+[[6050]],
+[[6051]],
+[[6052]],
+[[6053]],
+[[6054]],
+[[6055]],
+[[6056]],
+[[6057]],
+[[6058]],
+[[6059]],
+[[6060]],
+[[6061]],
+[[6062]],
+[[6063]],
+[[6064]],
+[[6065]],
+[[6066]],
+[[6067]],
+[[6068]],
+[[6069]],
+[[6070]],
+[[6071]],
+[[6072]],
+[[6073]],
+[[6074]],
+[[6075]],
+[[6076]],
+[[6077]],
+[[6078]],
+[[6079]],
+[[6080]],
+[[6081]],
+[[6082]],
+[[6083]],
+[[6084]],
+[[6085]],
+[[6086]],
+[[6087]],
+[[6088]],
+[[6089]],
+[[6090]],
+[[6091]],
+[[6092]],
+[[6093]],
+[[6094]],
+[[6095]],
+[[6096]],
+[[6097]],
+[[6098]],
+[[6099]],
+[[6100]],
+[[6101]],
+[[6102]],
+[[6103]],
+[[6104]],
+[[6105]],
+[[6106]],
+[[6107]],
+[[6108]],
+[[6109]],
+[[6110]],
+[[6111]],
+[[6112]],
+[[6113]],
+[[6114]],
+[[6115]],
+[[6116]],
+[[6117]],
+[[6118]],
+[[6119]],
+[[6120]],
+[[6121]],
+[[6122]],
+[[6123]],
+[[6124]],
+[[6125]],
+[[6126]],
+[[6127]],
+[[6128]],
+[[6129]],
+[[6130]],
+[[6131]],
+[[6132]],
+[[6133]],
+[[6134]],
+[[6135]],
+[[6136]],
+[[6137]],
+[[6138]],
+[[6139]],
+[[6140]],
+[[6141]],
+[[6142]],
+[[6143]],
+[[6144]],
+[[6145]],
+[[6146]],
+[[6147]],
+[[6148]],
+[[6149]],
+[[6150]],
+[[6151]],
+[[6152]],
+[[6153]],
+[[6154]],
+[[6155]],
+[[6156]],
+[[6157]],
+[[6158]],
+[[6159]],
+[[6160]],
+[[6161]],
+[[6162]],
+[[6163]],
+[[6164]],
+[[6165]],
+[[6166]],
+[[6167]],
+[[6168]],
+[[6169]],
+[[6170]],
+[[6171]],
+[[6172]],
+[[6173]],
+[[6174]],
+[[6175]],
+[[6176]],
+[[6177]],
+[[6178]],
+[[6179]],
+[[6180]],
+[[6181]],
+[[6182]],
+[[6183]],
+[[6184]],
+[[6185]],
+[[6186]],
+[[6187]],
+[[6188]],
+[[6189]],
+[[6190]],
+[[6191]],
+[[6192]],
+[[6193]],
+[[6194]],
+[[6195]],
+[[6196]],
+[[6197]],
+[[6198]],
+[[6199]],
+[[6200]],
+[[6201]],
+[[6202]],
+[[6203]],
+[[6204]],
+[[6205]],
+[[6206]],
+[[6207]],
+[[6208]],
+[[6209]],
+[[6210]],
+[[6211]],
+[[6212]],
+[[6213]],
+[[6214]],
+[[6215]],
+[[6216]],
+[[6217]],
+[[6218]],
+[[6219]],
+[[6220]],
+[[6221]],
+[[6222]],
+[[6223]],
+[[6224]],
+[[6225]],
+[[6226]],
+[[6227]],
+[[6228]],
+[[6229]],
+[[6230]],
+[[6231]],
+[[6232]],
+[[6233]],
+[[6234]],
+[[6235]],
+[[6236]],
+[[6237]],
+[[6238]],
+[[6239]],
+[[6240]],
+[[6241]],
+[[6242]],
+[[6243]],
+[[6244]],
+[[6245]],
+[[6246]],
+[[6247]],
+[[6248]],
+[[6249]],
+[[6250]],
+[[6251]],
+[[6252]],
+[[6253]],
+[[6254]],
+[[6255]],
+[[6256]],
+[[6257]],
+[[6258]],
+[[6259]],
+[[6260]],
+[[6261]],
+[[6262]],
+[[6263]],
+[[6264]],
+[[6265]],
+[[6266]],
+[[6267]],
+[[6268]],
+[[6269]],
+[[6270]],
+[[6271]],
+[[6272]],
+[[6273]],
+[[6274]],
+[[6275]],
+[[6276]],
+[[6277]],
+[[6278]],
+[[6279]],
+[[6280]],
+[[6281]],
+[[6282]],
+[[6283]],
+[[6284]],
+[[6285]],
+[[6286]],
+[[6287]],
+[[6288]],
+[[6289]],
+[[6290]],
+[[6291]],
+[[6292]],
+[[6293]],
+[[6294]],
+[[6295]],
+[[6296]],
+[[6297]],
+[[6298]],
+[[6299]],
+[[6300]],
+[[6301]],
+[[6302]],
+[[6303]],
+[[6304]],
+[[6305]],
+[[6306]],
+[[6307]],
+[[6308]],
+[[6309]],
+[[6310]],
+[[6311]],
+[[6312]],
+[[6313]],
+[[6314]],
+[[6315]],
+[[6316]],
+[[6317]],
+[[6318]],
+[[6319]],
+[[6320]],
+[[6321]],
+[[6322]],
+[[6323]],
+[[6324]],
+[[6325]],
+[[6326]],
+[[6327]],
+[[6328]],
+[[6329]],
+[[6330]],
+[[6331]],
+[[6332]],
+[[6333]],
+[[6334]],
+[[6335]],
+[[6336]],
+[[6337]],
+[[6338]],
+[[6339]],
+[[6340]],
+[[6341]],
+[[6342]],
+[[6343]],
+[[6344]],
+[[6345]],
+[[6346]],
+[[6347]],
+[[6348]],
+[[6349]],
+[[6350]],
+[[6351]],
+[[6352]],
+[[6353]],
+[[6354]],
+[[6355]],
+[[6356]],
+[[6357]],
+[[6358]],
+[[6359]],
+[[6360]],
+[[6361]],
+[[6362]],
+[[6363]],
+[[6364]],
+[[6365]],
+[[6366]],
+[[6367]],
+[[6368]],
+[[6369]],
+[[6370]],
+[[6371]],
+[[6372]],
+[[6373]],
+[[6374]],
+[[6375]],
+[[6376]],
+[[6377]],
+[[6378]],
+[[6379]],
+[[6380]],
+[[6381]],
+[[6382]],
+[[6383]],
+[[6384]],
+[[6385]],
+[[6386]],
+[[6387]],
+[[6388]],
+[[6389]],
+[[6390]],
+[[6391]],
+[[6392]],
+[[6393]],
+[[6394]],
+[[6395]],
+[[6396]],
+[[6397]],
+[[6398]],
+[[6399]],
+[[6400]],
+[[6401]],
+[[6402]],
+[[6403]],
+[[6404]],
+[[6405]],
+[[6406]],
+[[6407]],
+[[6408]],
+[[6409]],
+[[6410]],
+[[6411]],
+[[6412]],
+[[6413]],
+[[6414]],
+[[6415]],
+[[6416]],
+[[6417]],
+[[6418]],
+[[6419]],
+[[6420]],
+[[6421]],
+[[6422]],
+[[6423]],
+[[6424]],
+[[6425]],
+[[6426]],
+[[6427]],
+[[6428]],
+[[6429]],
+[[6430]],
+[[6431]],
+[[6432]],
+[[6433]],
+[[6434]],
+[[6435]],
+[[6436]],
+[[6437]],
+[[6438]],
+[[6439]],
+[[6440]],
+[[6441]],
+[[6442]],
+[[6443]],
+[[6444]],
+[[6445]],
+[[6446]],
+[[6447]],
+[[6448]],
+[[6449]],
+[[6450]],
+[[6451]],
+[[6452]],
+[[6453]],
+[[6454]],
+[[6455]],
+[[6456]],
+[[6457]],
+[[6458]],
+[[6459]],
+[[6460]],
+[[6461]],
+[[6462]],
+[[6463]],
+[[6464]],
+[[6465]],
+[[6466]],
+[[6467]],
+[[6468]],
+[[6469]],
+[[6470]],
+[[6471]],
+[[6472]],
+[[6473]],
+[[6474]],
+[[6475]],
+[[6476]],
+[[6477]],
+[[6478]],
+[[6479]],
+[[6480]],
+[[6481]],
+[[6482]],
+[[6483]],
+[[6484]],
+[[6485]],
+[[6486]],
+[[6487]],
+[[6488]],
+[[6489]],
+[[6490]],
+[[6491]],
+[[6492]],
+[[6493]],
+[[6494]],
+[[6495]],
+[[6496]],
+[[6497]],
+[[6498]],
+[[6499]],
+[[6500]],
+[[6501]],
+[[6502]],
+[[6503]],
+[[6504]],
+[[6505]],
+[[6506]],
+[[6507]],
+[[6508]],
+[[6509]],
+[[6510]],
+[[6511]],
+[[6512]],
+[[6513]],
+[[6514]],
+[[6515]],
+[[6516]],
+[[6517]],
+[[6518]],
+[[6519]],
+[[6520]],
+[[6521]],
+[[6522]],
+[[6523]],
+[[6524]],
+[[6525]],
+[[6526]],
+[[6527]],
+[[6528]],
+[[6529]],
+[[6530]],
+[[6531]],
+[[6532]],
+[[6533]],
+[[6534]],
+[[6535]],
+[[6536]],
+[[6537]],
+[[6538]],
+[[6539]],
+[[6540]],
+[[6541]],
+[[6542]],
+[[6543]],
+[[6544]],
+[[6545]],
+[[6546]],
+[[6547]],
+[[6548]],
+[[6549]],
+[[6550]],
+[[6551]],
+[[6552]],
+[[6553]],
+[[6554]],
+[[6555]],
+[[6556]],
+[[6557]],
+[[6558]],
+[[6559]],
+[[6560]],
+[[6561]],
+[[6562]],
+[[6563]],
+[[6564]],
+[[6565]],
+[[6566]],
+[[6567]],
+[[6568]],
+[[6569]],
+[[6570]],
+[[6571]],
+[[6572]],
+[[6573]],
+[[6574]],
+[[6575]],
+[[6576]],
+[[6577]],
+[[6578]],
+[[6579]],
+[[6580]],
+[[6581]],
+[[6582]],
+[[6583]],
+[[6584]],
+[[6585]],
+[[6586]],
+[[6587]],
+[[6588]],
+[[6589]],
+[[6590]],
+[[6591]],
+[[6592]],
+[[6593]],
+[[6594]],
+[[6595]],
+[[6596]],
+[[6597]],
+[[6598]],
+[[6599]],
+[[6600]],
+[[6601]],
+[[6602]],
+[[6603]],
+[[6604]],
+[[6605]],
+[[6606]],
+[[6607]],
+[[6608]],
+[[6609]],
+[[6610]],
+[[6611]],
+[[6612]],
+[[6613]],
+[[6614]],
+[[6615]],
+[[6616]],
+[[6617]],
+[[6618]],
+[[6619]],
+[[6620]],
+[[6621]],
+[[6622]],
+[[6623]],
+[[6624]],
+[[6625]],
+[[6626]],
+[[6627]],
+[[6628]],
+[[6629]],
+[[6630]],
+[[6631]],
+[[6632]],
+[[6633]],
+[[6634]],
+[[6635]],
+[[6636]],
+[[6637]],
+[[6638]],
+[[6639]],
+[[6640]],
+[[6641]],
+[[6642]],
+[[6643]],
+[[6644]],
+[[6645]],
+[[6646]],
+[[6647]],
+[[6648]],
+[[6649]],
+[[6650]],
+[[6651]],
+[[6652]],
+[[6653]],
+[[6654]],
+[[6655]],
+[[6656]],
+[[6657]],
+[[6658]],
+[[6659]],
+[[6660]],
+[[6661]],
+[[6662]],
+[[6663]],
+[[6664]],
+[[6665]],
+[[6666]],
+[[6667]],
+[[6668]],
+[[6669]],
+[[6670]],
+[[6671]],
+[[6672]],
+[[6673]],
+[[6674]],
+[[6675]],
+[[6676]],
+[[6677]],
+[[6678]],
+[[6679]],
+[[6680]],
+[[6681]],
+[[6682]],
+[[6683]],
+[[6684]],
+[[6685]],
+[[6686]],
+[[6687]],
+[[6688]],
+[[6689]],
+[[6690]],
+[[6691]],
+[[6692]],
+[[6693]],
+[[6694]],
+[[6695]],
+[[6696]],
+[[6697]],
+[[6698]],
+[[6699]],
+[[6700]],
+[[6701]],
+[[6702]],
+[[6703]],
+[[6704]],
+[[6705]],
+[[6706]],
+[[6707]],
+[[6708]],
+[[6709]],
+[[6710]],
+[[6711]],
+[[6712]],
+[[6713]],
+[[6714]],
+[[6715]],
+[[6716]],
+[[6717]],
+[[6718]],
+[[6719]],
+[[6720]],
+[[6721]],
+[[6722]],
+[[6723]],
+[[6724]],
+[[6725]],
+[[6726]],
+[[6727]],
+[[6728]],
+[[6729]],
+[[6730]],
+[[6731]],
+[[6732]],
+[[6733]],
+[[6734]],
+[[6735]],
+[[6736]],
+[[6737]],
+[[6738]],
+[[6739]],
+[[6740]],
+[[6741]],
+[[6742]],
+[[6743]],
+[[6744]],
+[[6745]],
+[[6746]],
+[[6747]],
+[[6748]],
+[[6749]],
+[[6750]],
+[[6751]],
+[[6752]],
+[[6753]],
+[[6754]],
+[[6755]],
+[[6756]],
+[[6757]],
+[[6758]],
+[[6759]],
+[[6760]],
+[[6761]],
+[[6762]],
+[[6763]],
+[[6764]],
+[[6765]],
+[[6766]],
+[[6767]],
+[[6768]],
+[[6769]],
+[[6770]],
+[[6771]],
+[[6772]],
+[[6773]],
+[[6774]],
+[[6775]],
+[[6776]],
+[[6777]],
+[[6778]],
+[[6779]],
+[[6780]],
+[[6781]],
+[[6782]],
+[[6783]],
+[[6784]],
+[[6785]],
+[[6786]],
+[[6787]],
+[[6788]],
+[[6789]],
+[[6790]],
+[[6791]],
+[[6792]],
+[[6793]],
+[[6794]],
+[[6795]],
+[[6796]],
+[[6797]],
+[[6798]],
+[[6799]],
+[[6800]],
+[[6801]],
+[[6802]],
+[[6803]],
+[[6804]],
+[[6805]],
+[[6806]],
+[[6807]],
+[[6808]],
+[[6809]],
+[[6810]],
+[[6811]],
+[[6812]],
+[[6813]],
+[[6814]],
+[[6815]],
+[[6816]],
+[[6817]],
+[[6818]],
+[[6819]],
+[[6820]],
+[[6821]],
+[[6822]],
+[[6823]],
+[[6824]],
+[[6825]],
+[[6826]],
+[[6827]],
+[[6828]],
+[[6829]],
+[[6830]],
+[[6831]],
+[[6832]],
+[[6833]],
+[[6834]],
+[[6835]],
+[[6836]],
+[[6837]],
+[[6838]],
+[[6839]],
+[[6840]],
+[[6841]],
+[[6842]],
+[[6843]],
+[[6844]],
+[[6845]],
+[[6846]],
+[[6847]],
+[[6848]],
+[[6849]],
+[[6850]],
+[[6851]],
+[[6852]],
+[[6853]],
+[[6854]],
+[[6855]],
+[[6856]],
+[[6857]],
+[[6858]],
+[[6859]],
+[[6860]],
+[[6861]],
+[[6862]],
+[[6863]],
+[[6864]],
+[[6865]],
+[[6866]],
+[[6867]],
+[[6868]],
+[[6869]],
+[[6870]],
+[[6871]],
+[[6872]],
+[[6873]],
+[[6874]],
+[[6875]],
+[[6876]],
+[[6877]],
+[[6878]],
+[[6879]],
+[[6880]],
+[[6881]],
+[[6882]],
+[[6883]],
+[[6884]],
+[[6885]],
+[[6886]],
+[[6887]],
+[[6888]],
+[[6889]],
+[[6890]],
+[[6891]],
+[[6892]],
+[[6893]],
+[[6894]],
+[[6895]],
+[[6896]],
+[[6897]],
+[[6898]],
+[[6899]],
+[[6900]],
+[[6901]],
+[[6902]],
+[[6903]],
+[[6904]],
+[[6905]],
+[[6906]],
+[[6907]],
+[[6908]],
+[[6909]],
+[[6910]],
+[[6911]],
+[[6912]],
+[[6913]],
+[[6914]],
+[[6915]],
+[[6916]],
+[[6917]],
+[[6918]],
+[[6919]],
+[[6920]],
+[[6921]],
+[[6922]],
+[[6923]],
+[[6924]],
+[[6925]],
+[[6926]],
+[[6927]],
+[[6928]],
+[[6929]],
+[[6930]],
+[[6931]],
+[[6932]],
+[[6933]],
+[[6934]],
+[[6935]],
+[[6936]],
+[[6937]],
+[[6938]],
+[[6939]],
+[[6940]],
+[[6941]],
+[[6942]],
+[[6943]],
+[[6944]],
+[[6945]],
+[[6946]],
+[[6947]],
+[[6948]],
+[[6949]],
+[[6950]],
+[[6951]],
+[[6952]],
+[[6953]],
+[[6954]],
+[[6955]],
+[[6956]],
+[[6957]],
+[[6958]],
+[[6959]],
+[[6960]],
+[[6961]],
+[[6962]],
+[[6963]],
+[[6964]],
+[[6965]],
+[[6966]],
+[[6967]],
+[[6968]],
+[[6969]],
+[[6970]],
+[[6971]],
+[[6972]],
+[[6973]],
+[[6974]],
+[[6975]],
+[[6976]],
+[[6977]],
+[[6978]],
+[[6979]],
+[[6980]],
+[[6981]],
+[[6982]],
+[[6983]],
+[[6984]],
+[[6985]],
+[[6986]],
+[[6987]],
+[[6988]],
+[[6989]],
+[[6990]],
+[[6991]],
+[[6992]],
+[[6993]],
+[[6994]],
+[[6995]],
+[[6996]],
+[[6997]],
+[[6998]],
+[[6999]],
+[[7000]],
+[[7001]],
+[[7002]],
+[[7003]],
+[[7004]],
+[[7005]],
+[[7006]],
+[[7007]],
+[[7008]],
+[[7009]],
+[[7010]],
+[[7011]],
+[[7012]],
+[[7013]],
+[[7014]],
+[[7015]],
+[[7016]],
+[[7017]],
+[[7018]],
+[[7019]],
+[[7020]],
+[[7021]],
+[[7022]],
+[[7023]],
+[[7024]],
+[[7025]],
+[[7026]],
+[[7027]],
+[[7028]],
+[[7029]],
+[[7030]],
+[[7031]],
+[[7032]],
+[[7033]],
+[[7034]],
+[[7035]],
+[[7036]],
+[[7037]],
+[[7038]],
+[[7039]],
+[[7040]],
+[[7041]],
+[[7042]],
+[[7043]],
+[[7044]],
+[[7045]],
+[[7046]],
+[[7047]],
+[[7048]],
+[[7049]],
+[[7050]],
+[[7051]],
+[[7052]],
+[[7053]],
+[[7054]],
+[[7055]],
+[[7056]],
+[[7057]],
+[[7058]],
+[[7059]],
+[[7060]],
+[[7061]],
+[[7062]],
+[[7063]],
+[[7064]],
+[[7065]],
+[[7066]],
+[[7067]],
+[[7068]],
+[[7069]],
+[[7070]],
+[[7071]],
+[[7072]],
+[[7073]],
+[[7074]],
+[[7075]],
+[[7076]],
+[[7077]],
+[[7078]],
+[[7079]],
+[[7080]],
+[[7081]],
+[[7082]],
+[[7083]],
+[[7084]],
+[[7085]],
+[[7086]],
+[[7087]],
+[[7088]],
+[[7089]],
+[[7090]],
+[[7091]],
+[[7092]],
+[[7093]],
+[[7094]],
+[[7095]],
+[[7096]],
+[[7097]],
+[[7098]],
+[[7099]],
+[[7100]],
+[[7101]],
+[[7102]],
+[[7103]],
+[[7104]],
+[[7105]],
+[[7106]],
+[[7107]],
+[[7108]],
+[[7109]],
+[[7110]],
+[[7111]],
+[[7112]],
+[[7113]],
+[[7114]],
+[[7115]],
+[[7116]],
+[[7117]],
+[[7118]],
+[[7119]],
+[[7120]],
+[[7121]],
+[[7122]],
+[[7123]],
+[[7124]],
+[[7125]],
+[[7126]],
+[[7127]],
+[[7128]],
+[[7129]],
+[[7130]],
+[[7131]],
+[[7132]],
+[[7133]],
+[[7134]],
+[[7135]],
+[[7136]],
+[[7137]],
+[[7138]],
+[[7139]],
+[[7140]],
+[[7141]],
+[[7142]],
+[[7143]],
+[[7144]],
+[[7145]],
+[[7146]],
+[[7147]],
+[[7148]],
+[[7149]],
+[[7150]],
+[[7151]],
+[[7152]],
+[[7153]],
+[[7154]],
+[[7155]],
+[[7156]],
+[[7157]],
+[[7158]],
+[[7159]],
+[[7160]],
+[[7161]],
+[[7162]],
+[[7163]],
+[[7164]],
+[[7165]],
+[[7166]],
+[[7167]],
+[[7168]],
+[[7169]],
+[[7170]],
+[[7171]],
+[[7172]],
+[[7173]],
+[[7174]],
+[[7175]],
+[[7176]],
+[[7177]],
+[[7178]],
+[[7179]],
+[[7180]],
+[[7181]],
+[[7182]],
+[[7183]],
+[[7184]],
+[[7185]],
+[[7186]],
+[[7187]],
+[[7188]],
+[[7189]],
+[[7190]],
+[[7191]],
+[[7192]],
+[[7193]],
+[[7194]],
+[[7195]],
+[[7196]],
+[[7197]],
+[[7198]],
+[[7199]],
+[[7200]],
+[[7201]],
+[[7202]],
+[[7203]],
+[[7204]],
+[[7205]],
+[[7206]],
+[[7207]],
+[[7208]],
+[[7209]],
+[[7210]],
+[[7211]],
+[[7212]],
+[[7213]],
+[[7214]],
+[[7215]],
+[[7216]],
+[[7217]],
+[[7218]],
+[[7219]],
+[[7220]],
+[[7221]],
+[[7222]],
+[[7223]],
+[[7224]],
+[[7225]],
+[[7226]],
+[[7227]],
+[[7228]],
+[[7229]],
+[[7230]],
+[[7231]],
+[[7232]],
+[[7233]],
+[[7234]],
+[[7235]],
+[[7236]],
+[[7237]],
+[[7238]],
+[[7239]],
+[[7240]],
+[[7241]],
+[[7242]],
+[[7243]],
+[[7244]],
+[[7245]],
+[[7246]],
+[[7247]],
+[[7248]],
+[[7249]],
+[[7250]],
+[[7251]],
+[[7252]],
+[[7253]],
+[[7254]],
+[[7255]],
+[[7256]],
+[[7257]],
+[[7258]],
+[[7259]],
+[[7260]],
+[[7261]],
+[[7262]],
+[[7263]],
+[[7264]],
+[[7265]],
+[[7266]],
+[[7267]],
+[[7268]],
+[[7269]],
+[[7270]],
+[[7271]],
+[[7272]],
+[[7273]],
+[[7274]],
+[[7275]],
+[[7276]],
+[[7277]],
+[[7278]],
+[[7279]],
+[[7280]],
+[[7281]],
+[[7282]],
+[[7283]],
+[[7284]],
+[[7285]],
+[[7286]],
+[[7287]],
+[[7288]],
+[[7289]],
+[[7290]],
+[[7291]],
+[[7292]],
+[[7293]],
+[[7294]],
+[[7295]],
+[[7296]],
+[[7297]],
+[[7298]],
+[[7299]],
+[[7300]],
+[[7301]],
+[[7302]],
+[[7303]],
+[[7304]],
+[[7305]],
+[[7306]],
+[[7307]],
+[[7308]],
+[[7309]],
+[[7310]],
+[[7311]],
+[[7312]],
+[[7313]],
+[[7314]],
+[[7315]],
+[[7316]],
+[[7317]],
+[[7318]],
+[[7319]],
+[[7320]],
+[[7321]],
+[[7322]],
+[[7323]],
+[[7324]],
+[[7325]],
+[[7326]],
+[[7327]],
+[[7328]],
+[[7329]],
+[[7330]],
+[[7331]],
+[[7332]],
+[[7333]],
+[[7334]],
+[[7335]],
+[[7336]],
+[[7337]],
+[[7338]],
+[[7339]],
+[[7340]],
+[[7341]],
+[[7342]],
+[[7343]],
+[[7344]],
+[[7345]],
+[[7346]],
+[[7347]],
+[[7348]],
+[[7349]],
+[[7350]],
+[[7351]],
+[[7352]],
+[[7353]],
+[[7354]],
+[[7355]],
+[[7356]],
+[[7357]],
+[[7358]],
+[[7359]],
+[[7360]],
+[[7361]],
+[[7362]],
+[[7363]],
+[[7364]],
+[[7365]],
+[[7366]],
+[[7367]],
+[[7368]],
+[[7369]],
+[[7370]],
+[[7371]],
+[[7372]],
+[[7373]],
+[[7374]],
+[[7375]],
+[[7376]],
+[[7377]],
+[[7378]],
+[[7379]],
+[[7380]],
+[[7381]],
+[[7382]],
+[[7383]],
+[[7384]],
+[[7385]],
+[[7386]],
+[[7387]],
+[[7388]],
+[[7389]],
+[[7390]],
+[[7391]],
+[[7392]],
+[[7393]],
+[[7394]],
+[[7395]],
+[[7396]],
+[[7397]],
+[[7398]],
+[[7399]],
+[[7400]],
+[[7401]],
+[[7402]],
+[[7403]],
+[[7404]],
+[[7405]],
+[[7406]],
+[[7407]],
+[[7408]],
+[[7409]],
+[[7410]],
+[[7411]],
+[[7412]],
+[[7413]],
+[[7414]],
+[[7415]],
+[[7416]],
+[[7417]],
+[[7418]],
+[[7419]],
+[[7420]],
+[[7421]],
+[[7422]],
+[[7423]],
+[[7424]],
+[[7425]],
+[[7426]],
+[[7427]],
+[[7428]],
+[[7429]],
+[[7430]],
+[[7431]],
+[[7432]],
+[[7433]],
+[[7434]],
+[[7435]],
+[[7436]],
+[[7437]],
+[[7438]],
+[[7439]],
+[[7440]],
+[[7441]],
+[[7442]],
+[[7443]],
+[[7444]],
+[[7445]],
+[[7446]],
+[[7447]],
+[[7448]],
+[[7449]],
+[[7450]],
+[[7451]],
+[[7452]],
+[[7453]],
+[[7454]],
+[[7455]],
+[[7456]],
+[[7457]],
+[[7458]],
+[[7459]],
+[[7460]],
+[[7461]],
+[[7462]],
+[[7463]],
+[[7464]],
+[[7465]],
+[[7466]],
+[[7467]],
+[[7468]],
+[[7469]],
+[[7470]],
+[[7471]],
+[[7472]],
+[[7473]],
+[[7474]],
+[[7475]],
+[[7476]],
+[[7477]],
+[[7478]],
+[[7479]],
+[[7480]],
+[[7481]],
+[[7482]],
+[[7483]],
+[[7484]],
+[[7485]],
+[[7486]],
+[[7487]],
+[[7488]],
+[[7489]],
+[[7490]],
+[[7491]],
+[[7492]],
+[[7493]],
+[[7494]],
+[[7495]],
+[[7496]],
+[[7497]],
+[[7498]],
+[[7499]],
+[[7500]],
+[[7501]],
+[[7502]],
+[[7503]],
+[[7504]],
+[[7505]],
+[[7506]],
+[[7507]],
+[[7508]],
+[[7509]],
+[[7510]],
+[[7511]],
+[[7512]],
+[[7513]],
+[[7514]],
+[[7515]],
+[[7516]],
+[[7517]],
+[[7518]],
+[[7519]],
+[[7520]],
+[[7521]],
+[[7522]],
+[[7523]],
+[[7524]],
+[[7525]],
+[[7526]],
+[[7527]],
+[[7528]],
+[[7529]],
+[[7530]],
+[[7531]],
+[[7532]],
+[[7533]],
+[[7534]],
+[[7535]],
+[[7536]],
+[[7537]],
+[[7538]],
+[[7539]],
+[[7540]],
+[[7541]],
+[[7542]],
+[[7543]],
+[[7544]],
+[[7545]],
+[[7546]],
+[[7547]],
+[[7548]],
+[[7549]],
+[[7550]],
+[[7551]],
+[[7552]],
+[[7553]],
+[[7554]],
+[[7555]],
+[[7556]],
+[[7557]],
+[[7558]],
+[[7559]],
+[[7560]],
+[[7561]],
+[[7562]],
+[[7563]],
+[[7564]],
+[[7565]],
+[[7566]],
+[[7567]],
+[[7568]],
+[[7569]],
+[[7570]],
+[[7571]],
+[[7572]],
+[[7573]],
+[[7574]],
+[[7575]],
+[[7576]],
+[[7577]],
+[[7578]],
+[[7579]],
+[[7580]],
+[[7581]],
+[[7582]],
+[[7583]],
+[[7584]],
+[[7585]],
+[[7586]],
+[[7587]],
+[[7588]],
+[[7589]],
+[[7590]],
+[[7591]],
+[[7592]],
+[[7593]],
+[[7594]],
+[[7595]],
+[[7596]],
+[[7597]],
+[[7598]],
+[[7599]],
+[[7600]],
+[[7601]],
+[[7602]],
+[[7603]],
+[[7604]],
+[[7605]],
+[[7606]],
+[[7607]],
+[[7608]],
+[[7609]],
+[[7610]],
+[[7611]],
+[[7612]],
+[[7613]],
+[[7614]],
+[[7615]],
+[[7616]],
+[[7617]],
+[[7618]],
+[[7619]],
+[[7620]],
+[[7621]],
+[[7622]],
+[[7623]],
+[[7624]],
+[[7625]],
+[[7626]],
+[[7627]],
+[[7628]],
+[[7629]],
+[[7630]],
+[[7631]],
+[[7632]],
+[[7633]],
+[[7634]],
+[[7635]],
+[[7636]],
+[[7637]],
+[[7638]],
+[[7639]],
+[[7640]],
+[[7641]],
+[[7642]],
+[[7643]],
+[[7644]],
+[[7645]],
+[[7646]],
+[[7647]],
+[[7648]],
+[[7649]],
+[[7650]],
+[[7651]],
+[[7652]],
+[[7653]],
+[[7654]],
+[[7655]],
+[[7656]],
+[[7657]],
+[[7658]],
+[[7659]],
+[[7660]],
+[[7661]],
+[[7662]],
+[[7663]],
+[[7664]],
+[[7665]],
+[[7666]],
+[[7667]],
+[[7668]],
+[[7669]],
+[[7670]],
+[[7671]],
+[[7672]],
+[[7673]],
+[[7674]],
+[[7675]],
+[[7676]],
+[[7677]],
+[[7678]],
+[[7679]],
+[[7680]],
+[[7681]],
+[[7682]],
+[[7683]],
+[[7684]],
+[[7685]],
+[[7686]],
+[[7687]],
+[[7688]],
+[[7689]],
+[[7690]],
+[[7691]],
+[[7692]],
+[[7693]],
+[[7694]],
+[[7695]],
+[[7696]],
+[[7697]],
+[[7698]],
+[[7699]],
+[[7700]],
+[[7701]],
+[[7702]],
+[[7703]],
+[[7704]],
+[[7705]],
+[[7706]],
+[[7707]],
+[[7708]],
+[[7709]],
+[[7710]],
+[[7711]],
+[[7712]],
+[[7713]],
+[[7714]],
+[[7715]],
+[[7716]],
+[[7717]],
+[[7718]],
+[[7719]],
+[[7720]],
+[[7721]],
+[[7722]],
+[[7723]],
+[[7724]],
+[[7725]],
+[[7726]],
+[[7727]],
+[[7728]],
+[[7729]],
+[[7730]],
+[[7731]],
+[[7732]],
+[[7733]],
+[[7734]],
+[[7735]],
+[[7736]],
+[[7737]],
+[[7738]],
+[[7739]],
+[[7740]],
+[[7741]],
+[[7742]],
+[[7743]],
+[[7744]],
+[[7745]],
+[[7746]],
+[[7747]],
+[[7748]],
+[[7749]],
+[[7750]],
+[[7751]],
+[[7752]],
+[[7753]],
+[[7754]],
+[[7755]],
+[[7756]],
+[[7757]],
+[[7758]],
+[[7759]],
+[[7760]],
+[[7761]],
+[[7762]],
+[[7763]],
+[[7764]],
+[[7765]],
+[[7766]],
+[[7767]],
+[[7768]],
+[[7769]],
+[[7770]],
+[[7771]],
+[[7772]],
+[[7773]],
+[[7774]],
+[[7775]],
+[[7776]],
+[[7777]],
+[[7778]],
+[[7779]],
+[[7780]],
+[[7781]],
+[[7782]],
+[[7783]],
+[[7784]],
+[[7785]],
+[[7786]],
+[[7787]],
+[[7788]],
+[[7789]],
+[[7790]],
+[[7791]],
+[[7792]],
+[[7793]],
+[[7794]],
+[[7795]],
+[[7796]],
+[[7797]],
+[[7798]],
+[[7799]],
+[[7800]],
+[[7801]],
+[[7802]],
+[[7803]],
+[[7804]],
+[[7805]],
+[[7806]],
+[[7807]],
+[[7808]],
+[[7809]],
+[[7810]],
+[[7811]],
+[[7812]],
+[[7813]],
+[[7814]],
+[[7815]],
+[[7816]],
+[[7817]],
+[[7818]],
+[[7819]],
+[[7820]],
+[[7821]],
+[[7822]],
+[[7823]],
+[[7824]],
+[[7825]],
+[[7826]],
+[[7827]],
+[[7828]],
+[[7829]],
+[[7830]],
+[[7831]],
+[[7832]],
+[[7833]],
+[[7834]],
+[[7835]],
+[[7836]],
+[[7837]],
+[[7838]],
+[[7839]],
+[[7840]],
+[[7841]],
+[[7842]],
+[[7843]],
+[[7844]],
+[[7845]],
+[[7846]],
+[[7847]],
+[[7848]],
+[[7849]],
+[[7850]],
+[[7851]],
+[[7852]],
+[[7853]],
+[[7854]],
+[[7855]],
+[[7856]],
+[[7857]],
+[[7858]],
+[[7859]],
+[[7860]],
+[[7861]],
+[[7862]],
+[[7863]],
+[[7864]],
+[[7865]],
+[[7866]],
+[[7867]],
+[[7868]],
+[[7869]],
+[[7870]],
+[[7871]],
+[[7872]],
+[[7873]],
+[[7874]],
+[[7875]],
+[[7876]],
+[[7877]],
+[[7878]],
+[[7879]],
+[[7880]],
+[[7881]],
+[[7882]],
+[[7883]],
+[[7884]],
+[[7885]],
+[[7886]],
+[[7887]],
+[[7888]],
+[[7889]],
+[[7890]],
+[[7891]],
+[[7892]],
+[[7893]],
+[[7894]],
+[[7895]],
+[[7896]],
+[[7897]],
+[[7898]],
+[[7899]],
+[[7900]],
+[[7901]],
+[[7902]],
+[[7903]],
+[[7904]],
+[[7905]],
+[[7906]],
+[[7907]],
+[[7908]],
+[[7909]],
+[[7910]],
+[[7911]],
+[[7912]],
+[[7913]],
+[[7914]],
+[[7915]],
+[[7916]],
+[[7917]],
+[[7918]],
+[[7919]],
+[[7920]],
+[[7921]],
+[[7922]],
+[[7923]],
+[[7924]],
+[[7925]],
+[[7926]],
+[[7927]],
+[[7928]],
+[[7929]],
+[[7930]],
+[[7931]],
+[[7932]],
+[[7933]],
+[[7934]],
+[[7935]],
+[[7936]],
+[[7937]],
+[[7938]],
+[[7939]],
+[[7940]],
+[[7941]],
+[[7942]],
+[[7943]],
+[[7944]],
+[[7945]],
+[[7946]],
+[[7947]],
+[[7948]],
+[[7949]],
+[[7950]],
+[[7951]],
+[[7952]],
+[[7953]],
+[[7954]],
+[[7955]],
+[[7956]],
+[[7957]],
+[[7958]],
+[[7959]],
+[[7960]],
+[[7961]],
+[[7962]],
+[[7963]],
+[[7964]],
+[[7965]],
+[[7966]],
+[[7967]],
+[[7968]],
+[[7969]],
+[[7970]],
+[[7971]],
+[[7972]],
+[[7973]],
+[[7974]],
+[[7975]],
+[[7976]],
+[[7977]],
+[[7978]],
+[[7979]],
+[[7980]],
+[[7981]],
+[[7982]],
+[[7983]],
+[[7984]],
+[[7985]],
+[[7986]],
+[[7987]],
+[[7988]],
+[[7989]],
+[[7990]],
+[[7991]],
+[[7992]],
+[[7993]],
+[[7994]],
+[[7995]],
+[[7996]],
+[[7997]],
+[[7998]],
+[[7999]],
+[[8000]],
+[[8001]],
+[[8002]],
+[[8003]],
+[[8004]],
+[[8005]],
+[[8006]],
+[[8007]],
+[[8008]],
+[[8009]],
+[[8010]],
+[[8011]],
+[[8012]],
+[[8013]],
+[[8014]],
+[[8015]],
+[[8016]],
+[[8017]],
+[[8018]],
+[[8019]],
+[[8020]],
+[[8021]],
+[[8022]],
+[[8023]],
+[[8024]],
+[[8025]],
+[[8026]],
+[[8027]],
+[[8028]],
+[[8029]],
+[[8030]],
+[[8031]],
+[[8032]],
+[[8033]],
+[[8034]],
+[[8035]],
+[[8036]],
+[[8037]],
+[[8038]],
+[[8039]],
+[[8040]],
+[[8041]],
+[[8042]],
+[[8043]],
+[[8044]],
+[[8045]],
+[[8046]],
+[[8047]],
+[[8048]],
+[[8049]],
+[[8050]],
+[[8051]],
+[[8052]],
+[[8053]],
+[[8054]],
+[[8055]],
+[[8056]],
+[[8057]],
+[[8058]],
+[[8059]],
+[[8060]],
+[[8061]],
+[[8062]],
+[[8063]],
+[[8064]],
+[[8065]],
+[[8066]],
+[[8067]],
+[[8068]],
+[[8069]],
+[[8070]],
+[[8071]],
+[[8072]],
+[[8073]],
+[[8074]],
+[[8075]],
+[[8076]],
+[[8077]],
+[[8078]],
+[[8079]],
+[[8080]],
+[[8081]],
+[[8082]],
+[[8083]],
+[[8084]],
+[[8085]],
+[[8086]],
+[[8087]],
+[[8088]],
+[[8089]],
+[[8090]],
+[[8091]],
+[[8092]],
+[[8093]],
+[[8094]],
+[[8095]],
+[[8096]],
+[[8097]],
+[[8098]],
+[[8099]],
+[[8100]],
+[[8101]],
+[[8102]],
+[[8103]],
+[[8104]],
+[[8105]],
+[[8106]],
+[[8107]],
+[[8108]],
+[[8109]],
+[[8110]],
+[[8111]],
+[[8112]],
+[[8113]],
+[[8114]],
+[[8115]],
+[[8116]],
+[[8117]],
+[[8118]],
+[[8119]],
+[[8120]],
+[[8121]],
+[[8122]],
+[[8123]],
+[[8124]],
+[[8125]],
+[[8126]],
+[[8127]],
+[[8128]],
+[[8129]],
+[[8130]],
+[[8131]],
+[[8132]],
+[[8133]],
+[[8134]],
+[[8135]],
+[[8136]],
+[[8137]],
+[[8138]],
+[[8139]],
+[[8140]],
+[[8141]],
+[[8142]],
+[[8143]],
+[[8144]],
+[[8145]],
+[[8146]],
+[[8147]],
+[[8148]],
+[[8149]],
+[[8150]],
+[[8151]],
+[[8152]],
+[[8153]],
+[[8154]],
+[[8155]],
+[[8156]],
+[[8157]],
+[[8158]],
+[[8159]],
+[[8160]],
+[[8161]],
+[[8162]],
+[[8163]],
+[[8164]],
+[[8165]],
+[[8166]],
+[[8167]],
+[[8168]],
+[[8169]],
+[[8170]],
+[[8171]],
+[[8172]],
+[[8173]],
+[[8174]],
+[[8175]],
+[[8176]],
+[[8177]],
+[[8178]],
+[[8179]],
+[[8180]],
+[[8181]],
+[[8182]],
+[[8183]],
+[[8184]],
+[[8185]],
+[[8186]],
+[[8187]],
+[[8188]],
+[[8189]],
+[[8190]],
+[[8191]],
+[[8192]],
+[[8193]],
+[[8194]],
+[[8195]],
+[[8196]],
+[[8197]],
+[[8198]],
+[[8199]],
+[[8200]],
+[[8201]],
+[[8202]],
+[[8203]],
+[[8204]],
+[[8205]],
+[[8206]],
+[[8207]],
+[[8208]],
+[[8209]],
+[[8210]],
+[[8211]],
+[[8212]],
+[[8213]],
+[[8214]],
+[[8215]],
+[[8216]],
+[[8217]],
+[[8218]],
+[[8219]],
+[[8220]],
+[[8221]],
+[[8222]],
+[[8223]],
+[[8224]],
+[[8225]],
+[[8226]],
+[[8227]],
+[[8228]],
+[[8229]],
+[[8230]],
+[[8231]],
+[[8232]],
+[[8233]],
+[[8234]],
+[[8235]],
+[[8236]],
+[[8237]],
+[[8238]],
+[[8239]],
+[[8240]],
+[[8241]],
+[[8242]],
+[[8243]],
+[[8244]],
+[[8245]],
+[[8246]],
+[[8247]],
+[[8248]],
+[[8249]],
+[[8250]],
+[[8251]],
+[[8252]],
+[[8253]],
+[[8254]],
+[[8255]],
+[[8256]],
+[[8257]],
+[[8258]],
+[[8259]],
+[[8260]],
+[[8261]],
+[[8262]],
+[[8263]],
+[[8264]],
+[[8265]],
+[[8266]],
+[[8267]],
+[[8268]],
+[[8269]],
+[[8270]],
+[[8271]],
+[[8272]],
+[[8273]],
+[[8274]],
+[[8275]],
+[[8276]],
+[[8277]],
+[[8278]],
+[[8279]],
+[[8280]],
+[[8281]],
+[[8282]],
+[[8283]],
+[[8284]],
+[[8285]],
+[[8286]],
+[[8287]],
+[[8288]],
+[[8289]],
+[[8290]],
+[[8291]],
+[[8292]],
+[[8293]],
+[[8294]],
+[[8295]],
+[[8296]],
+[[8297]],
+[[8298]],
+[[8299]],
+[[8300]],
+[[8301]],
+[[8302]],
+[[8303]],
+[[8304]],
+[[8305]],
+[[8306]],
+[[8307]],
+[[8308]],
+[[8309]],
+[[8310]],
+[[8311]],
+[[8312]],
+[[8313]],
+[[8314]],
+[[8315]],
+[[8316]],
+[[8317]],
+[[8318]],
+[[8319]],
+[[8320]],
+[[8321]],
+[[8322]],
+[[8323]],
+[[8324]],
+[[8325]],
+[[8326]],
+[[8327]],
+[[8328]],
+[[8329]],
+[[8330]],
+[[8331]],
+[[8332]],
+[[8333]],
+[[8334]],
+[[8335]],
+[[8336]],
+[[8337]],
+[[8338]],
+[[8339]],
+[[8340]],
+[[8341]],
+[[8342]],
+[[8343]],
+[[8344]],
+[[8345]],
+[[8346]],
+[[8347]],
+[[8348]],
+[[8349]],
+[[8350]],
+[[8351]],
+[[8352]],
+[[8353]],
+[[8354]],
+[[8355]],
+[[8356]],
+[[8357]],
+[[8358]],
+[[8359]],
+[[8360]],
+[[8361]],
+[[8362]],
+[[8363]],
+[[8364]],
+[[8365]],
+[[8366]],
+[[8367]],
+[[8368]],
+[[8369]],
+[[8370]],
+[[8371]],
+[[8372]],
+[[8373]],
+[[8374]],
+[[8375]],
+[[8376]],
+[[8377]],
+[[8378]],
+[[8379]],
+[[8380]],
+[[8381]],
+[[8382]],
+[[8383]],
+[[8384]],
+[[8385]],
+[[8386]],
+[[8387]],
+[[8388]],
+[[8389]],
+[[8390]],
+[[8391]],
+[[8392]],
+[[8393]],
+[[8394]],
+[[8395]],
+[[8396]],
+[[8397]],
+[[8398]],
+[[8399]],
+[[8400]],
+[[8401]],
+[[8402]],
+[[8403]],
+[[8404]],
+[[8405]],
+[[8406]],
+[[8407]],
+[[8408]],
+[[8409]],
+[[8410]],
+[[8411]],
+[[8412]],
+[[8413]],
+[[8414]],
+[[8415]],
+[[8416]],
+[[8417]],
+[[8418]],
+[[8419]],
+[[8420]],
+[[8421]],
+[[8422]],
+[[8423]],
+[[8424]],
+[[8425]],
+[[8426]],
+[[8427]],
+[[8428]],
+[[8429]],
+[[8430]],
+[[8431]],
+[[8432]],
+[[8433]],
+[[8434]],
+[[8435]],
+[[8436]],
+[[8437]],
+[[8438]],
+[[8439]],
+[[8440]],
+[[8441]],
+[[8442]],
+[[8443]],
+[[8444]],
+[[8445]],
+[[8446]],
+[[8447]],
+[[8448]],
+[[8449]],
+[[8450]],
+[[8451]],
+[[8452]],
+[[8453]],
+[[8454]],
+[[8455]],
+[[8456]],
+[[8457]],
+[[8458]],
+[[8459]],
+[[8460]],
+[[8461]],
+[[8462]],
+[[8463]],
+[[8464]],
+[[8465]],
+[[8466]],
+[[8467]],
+[[8468]],
+[[8469]],
+[[8470]],
+[[8471]],
+[[8472]],
+[[8473]],
+[[8474]],
+[[8475]],
+[[8476]],
+[[8477]],
+[[8478]],
+[[8479]],
+[[8480]],
+[[8481]],
+[[8482]],
+[[8483]],
+[[8484]],
+[[8485]],
+[[8486]],
+[[8487]],
+[[8488]],
+[[8489]],
+[[8490]],
+[[8491]],
+[[8492]],
+[[8493]],
+[[8494]],
+[[8495]],
+[[8496]],
+[[8497]],
+[[8498]],
+[[8499]],
+[[8500]],
+[[8501]],
+[[8502]],
+[[8503]],
+[[8504]],
+[[8505]],
+[[8506]],
+[[8507]],
+[[8508]],
+[[8509]],
+[[8510]],
+[[8511]],
+[[8512]],
+[[8513]],
+[[8514]],
+[[8515]],
+[[8516]],
+[[8517]],
+[[8518]],
+[[8519]],
+[[8520]],
+[[8521]],
+[[8522]],
+[[8523]],
+[[8524]],
+[[8525]],
+[[8526]],
+[[8527]],
+[[8528]],
+[[8529]],
+[[8530]],
+[[8531]],
+[[8532]],
+[[8533]],
+[[8534]],
+[[8535]],
+[[8536]],
+[[8537]],
+[[8538]],
+[[8539]],
+[[8540]],
+[[8541]],
+[[8542]],
+[[8543]],
+[[8544]],
+[[8545]],
+[[8546]],
+[[8547]],
+[[8548]],
+[[8549]],
+[[8550]],
+[[8551]],
+[[8552]],
+[[8553]],
+[[8554]],
+[[8555]],
+[[8556]],
+[[8557]],
+[[8558]],
+[[8559]],
+[[8560]],
+[[8561]],
+[[8562]],
+[[8563]],
+[[8564]],
+[[8565]],
+[[8566]],
+[[8567]],
+[[8568]],
+[[8569]],
+[[8570]],
+[[8571]],
+[[8572]],
+[[8573]],
+[[8574]],
+[[8575]],
+[[8576]],
+[[8577]],
+[[8578]],
+[[8579]],
+[[8580]],
+[[8581]],
+[[8582]],
+[[8583]],
+[[8584]],
+[[8585]],
+[[8586]],
+[[8587]],
+[[8588]],
+[[8589]],
+[[8590]],
+[[8591]],
+[[8592]],
+[[8593]],
+[[8594]],
+[[8595]],
+[[8596]],
+[[8597]],
+[[8598]],
+[[8599]],
+[[8600]],
+[[8601]],
+[[8602]],
+[[8603]],
+[[8604]],
+[[8605]],
+[[8606]],
+[[8607]],
+[[8608]],
+[[8609]],
+[[8610]],
+[[8611]],
+[[8612]],
+[[8613]],
+[[8614]],
+[[8615]],
+[[8616]],
+[[8617]],
+[[8618]],
+[[8619]],
+[[8620]],
+[[8621]],
+[[8622]],
+[[8623]],
+[[8624]],
+[[8625]],
+[[8626]],
+[[8627]],
+[[8628]],
+[[8629]],
+[[8630]],
+[[8631]],
+[[8632]],
+[[8633]],
+[[8634]],
+[[8635]],
+[[8636]],
+[[8637]],
+[[8638]],
+[[8639]],
+[[8640]],
+[[8641]],
+[[8642]],
+[[8643]],
+[[8644]],
+[[8645]],
+[[8646]],
+[[8647]],
+[[8648]],
+[[8649]],
+[[8650]],
+[[8651]],
+[[8652]],
+[[8653]],
+[[8654]],
+[[8655]],
+[[8656]],
+[[8657]],
+[[8658]],
+[[8659]],
+[[8660]],
+[[8661]],
+[[8662]],
+[[8663]],
+[[8664]],
+[[8665]],
+[[8666]],
+[[8667]],
+[[8668]],
+[[8669]],
+[[8670]],
+[[8671]],
+[[8672]],
+[[8673]],
+[[8674]],
+[[8675]],
+[[8676]],
+[[8677]],
+[[8678]],
+[[8679]],
+[[8680]],
+[[8681]],
+[[8682]],
+[[8683]],
+[[8684]],
+[[8685]],
+[[8686]],
+[[8687]],
+[[8688]],
+[[8689]],
+[[8690]],
+[[8691]],
+[[8692]],
+[[8693]],
+[[8694]],
+[[8695]],
+[[8696]],
+[[8697]],
+[[8698]],
+[[8699]],
+[[8700]],
+[[8701]],
+[[8702]],
+[[8703]],
+[[8704]],
+[[8705]],
+[[8706]],
+[[8707]],
+[[8708]],
+[[8709]],
+[[8710]],
+[[8711]],
+[[8712]],
+[[8713]],
+[[8714]],
+[[8715]],
+[[8716]],
+[[8717]],
+[[8718]],
+[[8719]],
+[[8720]],
+[[8721]],
+[[8722]],
+[[8723]],
+[[8724]],
+[[8725]],
+[[8726]],
+[[8727]],
+[[8728]],
+[[8729]],
+[[8730]],
+[[8731]],
+[[8732]],
+[[8733]],
+[[8734]],
+[[8735]],
+[[8736]],
+[[8737]],
+[[8738]],
+[[8739]],
+[[8740]],
+[[8741]],
+[[8742]],
+[[8743]],
+[[8744]],
+[[8745]],
+[[8746]],
+[[8747]],
+[[8748]],
+[[8749]],
+[[8750]],
+[[8751]],
+[[8752]],
+[[8753]],
+[[8754]],
+[[8755]],
+[[8756]],
+[[8757]],
+[[8758]],
+[[8759]],
+[[8760]],
+[[8761]],
+[[8762]],
+[[8763]],
+[[8764]],
+[[8765]],
+[[8766]],
+[[8767]],
+[[8768]],
+[[8769]],
+[[8770]],
+[[8771]],
+[[8772]],
+[[8773]],
+[[8774]],
+[[8775]],
+[[8776]],
+[[8777]],
+[[8778]],
+[[8779]],
+[[8780]],
+[[8781]],
+[[8782]],
+[[8783]],
+[[8784]],
+[[8785]],
+[[8786]],
+[[8787]],
+[[8788]],
+[[8789]],
+[[8790]],
+[[8791]],
+[[8792]],
+[[8793]],
+[[8794]],
+[[8795]],
+[[8796]],
+[[8797]],
+[[8798]],
+[[8799]],
+[[8800]],
+[[8801]],
+[[8802]],
+[[8803]],
+[[8804]],
+[[8805]],
+[[8806]],
+[[8807]],
+[[8808]],
+[[8809]],
+[[8810]],
+[[8811]],
+[[8812]],
+[[8813]],
+[[8814]],
+[[8815]],
+[[8816]],
+[[8817]],
+[[8818]],
+[[8819]],
+[[8820]],
+[[8821]],
+[[8822]],
+[[8823]],
+[[8824]],
+[[8825]],
+[[8826]],
+[[8827]],
+[[8828]],
+[[8829]],
+[[8830]],
+[[8831]],
+[[8832]],
+[[8833]],
+[[8834]],
+[[8835]],
+[[8836]],
+[[8837]],
+[[8838]],
+[[8839]],
+[[8840]],
+[[8841]],
+[[8842]],
+[[8843]],
+[[8844]],
+[[8845]],
+[[8846]],
+[[8847]],
+[[8848]],
+[[8849]],
+[[8850]],
+[[8851]],
+[[8852]],
+[[8853]],
+[[8854]],
+[[8855]],
+[[8856]],
+[[8857]],
+[[8858]],
+[[8859]],
+[[8860]],
+[[8861]],
+[[8862]],
+[[8863]],
+[[8864]],
+[[8865]],
+[[8866]],
+[[8867]],
+[[8868]],
+[[8869]],
+[[8870]],
+[[8871]],
+[[8872]],
+[[8873]],
+[[8874]],
+[[8875]],
+[[8876]],
+[[8877]],
+[[8878]],
+[[8879]],
+[[8880]],
+[[8881]],
+[[8882]],
+[[8883]],
+[[8884]],
+[[8885]],
+[[8886]],
+[[8887]],
+[[8888]],
+[[8889]],
+[[8890]],
+[[8891]],
+[[8892]],
+[[8893]],
+[[8894]],
+[[8895]],
+[[8896]],
+[[8897]],
+[[8898]],
+[[8899]],
+[[8900]],
+[[8901]],
+[[8902]],
+[[8903]],
+[[8904]],
+[[8905]],
+[[8906]],
+[[8907]],
+[[8908]],
+[[8909]],
+[[8910]],
+[[8911]],
+[[8912]],
+[[8913]],
+[[8914]],
+[[8915]],
+[[8916]],
+[[8917]],
+[[8918]],
+[[8919]],
+[[8920]],
+[[8921]],
+[[8922]],
+[[8923]],
+[[8924]],
+[[8925]],
+[[8926]],
+[[8927]],
+[[8928]],
+[[8929]],
+[[8930]],
+[[8931]],
+[[8932]],
+[[8933]],
+[[8934]],
+[[8935]],
+[[8936]],
+[[8937]],
+[[8938]],
+[[8939]],
+[[8940]],
+[[8941]],
+[[8942]],
+[[8943]],
+[[8944]],
+[[8945]],
+[[8946]],
+[[8947]],
+[[8948]],
+[[8949]],
+[[8950]],
+[[8951]],
+[[8952]],
+[[8953]],
+[[8954]],
+[[8955]],
+[[8956]],
+[[8957]],
+[[8958]],
+[[8959]],
+[[8960]],
+[[8961]],
+[[8962]],
+[[8963]],
+[[8964]],
+[[8965]],
+[[8966]],
+[[8967]],
+[[8968]],
+[[8969]],
+[[8970]],
+[[8971]],
+[[8972]],
+[[8973]],
+[[8974]],
+[[8975]],
+[[8976]],
+[[8977]],
+[[8978]],
+[[8979]],
+[[8980]],
+[[8981]],
+[[8982]],
+[[8983]],
+[[8984]],
+[[8985]],
+[[8986]],
+[[8987]],
+[[8988]],
+[[8989]],
+[[8990]],
+[[8991]],
+[[8992]],
+[[8993]],
+[[8994]],
+[[8995]],
+[[8996]],
+[[8997]],
+[[8998]],
+[[8999]],
+[[9000]],
+[[9001]],
+[[9002]],
+[[9003]],
+[[9004]],
+[[9005]],
+[[9006]],
+[[9007]],
+[[9008]],
+[[9009]],
+[[9010]],
+[[9011]],
+[[9012]],
+[[9013]],
+[[9014]],
+[[9015]],
+[[9016]],
+[[9017]],
+[[9018]],
+[[9019]],
+[[9020]],
+[[9021]],
+[[9022]],
+[[9023]],
+[[9024]],
+[[9025]],
+[[9026]],
+[[9027]],
+[[9028]],
+[[9029]],
+[[9030]],
+[[9031]],
+[[9032]],
+[[9033]],
+[[9034]],
+[[9035]],
+[[9036]],
+[[9037]],
+[[9038]],
+[[9039]],
+[[9040]],
+[[9041]],
+[[9042]],
+[[9043]],
+[[9044]],
+[[9045]],
+[[9046]],
+[[9047]],
+[[9048]],
+[[9049]],
+[[9050]],
+[[9051]],
+[[9052]],
+[[9053]],
+[[9054]],
+[[9055]],
+[[9056]],
+[[9057]],
+[[9058]],
+[[9059]],
+[[9060]],
+[[9061]],
+[[9062]],
+[[9063]],
+[[9064]],
+[[9065]],
+[[9066]],
+[[9067]],
+[[9068]],
+[[9069]],
+[[9070]],
+[[9071]],
+[[9072]],
+[[9073]],
+[[9074]],
+[[9075]],
+[[9076]],
+[[9077]],
+[[9078]],
+[[9079]],
+[[9080]],
+[[9081]],
+[[9082]],
+[[9083]],
+[[9084]],
+[[9085]],
+[[9086]],
+[[9087]],
+[[9088]],
+[[9089]],
+[[9090]],
+[[9091]],
+[[9092]],
+[[9093]],
+[[9094]],
+[[9095]],
+[[9096]],
+[[9097]],
+[[9098]],
+[[9099]],
+[[9100]],
+[[9101]],
+[[9102]],
+[[9103]],
+[[9104]],
+[[9105]],
+[[9106]],
+[[9107]],
+[[9108]],
+[[9109]],
+[[9110]],
+[[9111]],
+[[9112]],
+[[9113]],
+[[9114]],
+[[9115]],
+[[9116]],
+[[9117]],
+[[9118]],
+[[9119]],
+[[9120]],
+[[9121]],
+[[9122]],
+[[9123]],
+[[9124]],
+[[9125]],
+[[9126]],
+[[9127]],
+[[9128]],
+[[9129]],
+[[9130]],
+[[9131]],
+[[9132]],
+[[9133]],
+[[9134]],
+[[9135]],
+[[9136]],
+[[9137]],
+[[9138]],
+[[9139]],
+[[9140]],
+[[9141]],
+[[9142]],
+[[9143]],
+[[9144]],
+[[9145]],
+[[9146]],
+[[9147]],
+[[9148]],
+[[9149]],
+[[9150]],
+[[9151]],
+[[9152]],
+[[9153]],
+[[9154]],
+[[9155]],
+[[9156]],
+[[9157]],
+[[9158]],
+[[9159]],
+[[9160]],
+[[9161]],
+[[9162]],
+[[9163]],
+[[9164]],
+[[9165]],
+[[9166]],
+[[9167]],
+[[9168]],
+[[9169]],
+[[9170]],
+[[9171]],
+[[9172]],
+[[9173]],
+[[9174]],
+[[9175]],
+[[9176]],
+[[9177]],
+[[9178]],
+[[9179]],
+[[9180]],
+[[9181]],
+[[9182]],
+[[9183]],
+[[9184]],
+[[9185]],
+[[9186]],
+[[9187]],
+[[9188]],
+[[9189]],
+[[9190]],
+[[9191]],
+[[9192]],
+[[9193]],
+[[9194]],
+[[9195]],
+[[9196]],
+[[9197]],
+[[9198]],
+[[9199]],
+[[9200]],
+[[9201]],
+[[9202]],
+[[9203]],
+[[9204]],
+[[9205]],
+[[9206]],
+[[9207]],
+[[9208]],
+[[9209]],
+[[9210]],
+[[9211]],
+[[9212]],
+[[9213]],
+[[9214]],
+[[9215]],
+[[9216]],
+[[9217]],
+[[9218]],
+[[9219]],
+[[9220]],
+[[9221]],
+[[9222]],
+[[9223]],
+[[9224]],
+[[9225]],
+[[9226]],
+[[9227]],
+[[9228]],
+[[9229]],
+[[9230]],
+[[9231]],
+[[9232]],
+[[9233]],
+[[9234]],
+[[9235]],
+[[9236]],
+[[9237]],
+[[9238]],
+[[9239]],
+[[9240]],
+[[9241]],
+[[9242]],
+[[9243]],
+[[9244]],
+[[9245]],
+[[9246]],
+[[9247]],
+[[9248]],
+[[9249]],
+[[9250]],
+[[9251]],
+[[9252]],
+[[9253]],
+[[9254]],
+[[9255]],
+[[9256]],
+[[9257]],
+[[9258]],
+[[9259]],
+[[9260]],
+[[9261]],
+[[9262]],
+[[9263]],
+[[9264]],
+[[9265]],
+[[9266]],
+[[9267]],
+[[9268]],
+[[9269]],
+[[9270]],
+[[9271]],
+[[9272]],
+[[9273]],
+[[9274]],
+[[9275]],
+[[9276]],
+[[9277]],
+[[9278]],
+[[9279]],
+[[9280]],
+[[9281]],
+[[9282]],
+[[9283]],
+[[9284]],
+[[9285]],
+[[9286]],
+[[9287]],
+[[9288]],
+[[9289]],
+[[9290]],
+[[9291]],
+[[9292]],
+[[9293]],
+[[9294]],
+[[9295]],
+[[9296]],
+[[9297]],
+[[9298]],
+[[9299]],
+[[9300]],
+[[9301]],
+[[9302]],
+[[9303]],
+[[9304]],
+[[9305]],
+[[9306]],
+[[9307]],
+[[9308]],
+[[9309]],
+[[9310]],
+[[9311]],
+[[9312]],
+[[9313]],
+[[9314]],
+[[9315]],
+[[9316]],
+[[9317]],
+[[9318]],
+[[9319]],
+[[9320]],
+[[9321]],
+[[9322]],
+[[9323]],
+[[9324]],
+[[9325]],
+[[9326]],
+[[9327]],
+[[9328]],
+[[9329]],
+[[9330]],
+[[9331]],
+[[9332]],
+[[9333]],
+[[9334]],
+[[9335]],
+[[9336]],
+[[9337]],
+[[9338]],
+[[9339]],
+[[9340]],
+[[9341]],
+[[9342]],
+[[9343]],
+[[9344]],
+[[9345]],
+[[9346]],
+[[9347]],
+[[9348]],
+[[9349]],
+[[9350]],
+[[9351]],
+[[9352]],
+[[9353]],
+[[9354]],
+[[9355]],
+[[9356]],
+[[9357]],
+[[9358]],
+[[9359]],
+[[9360]],
+[[9361]],
+[[9362]],
+[[9363]],
+[[9364]],
+[[9365]],
+[[9366]],
+[[9367]],
+[[9368]],
+[[9369]],
+[[9370]],
+[[9371]],
+[[9372]],
+[[9373]],
+[[9374]],
+[[9375]],
+[[9376]],
+[[9377]],
+[[9378]],
+[[9379]],
+[[9380]],
+[[9381]],
+[[9382]],
+[[9383]],
+[[9384]],
+[[9385]],
+[[9386]],
+[[9387]],
+[[9388]],
+[[9389]],
+[[9390]],
+[[9391]],
+[[9392]],
+[[9393]],
+[[9394]],
+[[9395]],
+[[9396]],
+[[9397]],
+[[9398]],
+[[9399]],
+[[9400]],
+[[9401]],
+[[9402]],
+[[9403]],
+[[9404]],
+[[9405]],
+[[9406]],
+[[9407]],
+[[9408]],
+[[9409]],
+[[9410]],
+[[9411]],
+[[9412]],
+[[9413]],
+[[9414]],
+[[9415]],
+[[9416]],
+[[9417]],
+[[9418]],
+[[9419]],
+[[9420]],
+[[9421]],
+[[9422]],
+[[9423]],
+[[9424]],
+[[9425]],
+[[9426]],
+[[9427]],
+[[9428]],
+[[9429]],
+[[9430]],
+[[9431]],
+[[9432]],
+[[9433]],
+[[9434]],
+[[9435]],
+[[9436]],
+[[9437]],
+[[9438]],
+[[9439]],
+[[9440]],
+[[9441]],
+[[9442]],
+[[9443]],
+[[9444]],
+[[9445]],
+[[9446]],
+[[9447]],
+[[9448]],
+[[9449]],
+[[9450]],
+[[9451]],
+[[9452]],
+[[9453]],
+[[9454]],
+[[9455]],
+[[9456]],
+[[9457]],
+[[9458]],
+[[9459]],
+[[9460]],
+[[9461]],
+[[9462]],
+[[9463]],
+[[9464]],
+[[9465]],
+[[9466]],
+[[9467]],
+[[9468]],
+[[9469]],
+[[9470]],
+[[9471]],
+[[9472]],
+[[9473]],
+[[9474]],
+[[9475]],
+[[9476]],
+[[9477]],
+[[9478]],
+[[9479]],
+[[9480]],
+[[9481]],
+[[9482]],
+[[9483]],
+[[9484]],
+[[9485]],
+[[9486]],
+[[9487]],
+[[9488]],
+[[9489]],
+[[9490]],
+[[9491]],
+[[9492]],
+[[9493]],
+[[9494]],
+[[9495]],
+[[9496]],
+[[9497]],
+[[9498]],
+[[9499]],
+[[9500]],
+[[9501]],
+[[9502]],
+[[9503]],
+[[9504]],
+[[9505]],
+[[9506]],
+[[9507]],
+[[9508]],
+[[9509]],
+[[9510]],
+[[9511]],
+[[9512]],
+[[9513]],
+[[9514]],
+[[9515]],
+[[9516]],
+[[9517]],
+[[9518]],
+[[9519]],
+[[9520]],
+[[9521]],
+[[9522]],
+[[9523]],
+[[9524]],
+[[9525]],
+[[9526]],
+[[9527]],
+[[9528]],
+[[9529]],
+[[9530]],
+[[9531]],
+[[9532]],
+[[9533]],
+[[9534]],
+[[9535]],
+[[9536]],
+[[9537]],
+[[9538]],
+[[9539]],
+[[9540]],
+[[9541]],
+[[9542]],
+[[9543]],
+[[9544]],
+[[9545]],
+[[9546]],
+[[9547]],
+[[9548]],
+[[9549]],
+[[9550]],
+[[9551]],
+[[9552]],
+[[9553]],
+[[9554]],
+[[9555]],
+[[9556]],
+[[9557]],
+[[9558]],
+[[9559]],
+[[9560]],
+[[9561]],
+[[9562]],
+[[9563]],
+[[9564]],
+[[9565]],
+[[9566]],
+[[9567]],
+[[9568]],
+[[9569]],
+[[9570]],
+[[9571]],
+[[9572]],
+[[9573]],
+[[9574]],
+[[9575]],
+[[9576]],
+[[9577]],
+[[9578]],
+[[9579]],
+[[9580]],
+[[9581]],
+[[9582]],
+[[9583]],
+[[9584]],
+[[9585]],
+[[9586]],
+[[9587]],
+[[9588]],
+[[9589]],
+[[9590]],
+[[9591]],
+[[9592]],
+[[9593]],
+[[9594]],
+[[9595]],
+[[9596]],
+[[9597]],
+[[9598]],
+[[9599]],
+[[9600]],
+[[9601]],
+[[9602]],
+[[9603]],
+[[9604]],
+[[9605]],
+[[9606]],
+[[9607]],
+[[9608]],
+[[9609]],
+[[9610]],
+[[9611]],
+[[9612]],
+[[9613]],
+[[9614]],
+[[9615]],
+[[9616]],
+[[9617]],
+[[9618]],
+[[9619]],
+[[9620]],
+[[9621]],
+[[9622]],
+[[9623]],
+[[9624]],
+[[9625]],
+[[9626]],
+[[9627]],
+[[9628]],
+[[9629]],
+[[9630]],
+[[9631]],
+[[9632]],
+[[9633]],
+[[9634]],
+[[9635]],
+[[9636]],
+[[9637]],
+[[9638]],
+[[9639]],
+[[9640]],
+[[9641]],
+[[9642]],
+[[9643]],
+[[9644]],
+[[9645]],
+[[9646]],
+[[9647]],
+[[9648]],
+[[9649]],
+[[9650]],
+[[9651]],
+[[9652]],
+[[9653]],
+[[9654]],
+[[9655]],
+[[9656]],
+[[9657]],
+[[9658]],
+[[9659]],
+[[9660]],
+[[9661]],
+[[9662]],
+[[9663]],
+[[9664]],
+[[9665]],
+[[9666]],
+[[9667]],
+[[9668]],
+[[9669]],
+[[9670]],
+[[9671]],
+[[9672]],
+[[9673]],
+[[9674]],
+[[9675]],
+[[9676]],
+[[9677]],
+[[9678]],
+[[9679]],
+[[9680]],
+[[9681]],
+[[9682]],
+[[9683]],
+[[9684]],
+[[9685]],
+[[9686]],
+[[9687]],
+[[9688]],
+[[9689]],
+[[9690]],
+[[9691]],
+[[9692]],
+[[9693]],
+[[9694]],
+[[9695]],
+[[9696]],
+[[9697]],
+[[9698]],
+[[9699]],
+[[9700]],
+[[9701]],
+[[9702]],
+[[9703]],
+[[9704]],
+[[9705]],
+[[9706]],
+[[9707]],
+[[9708]],
+[[9709]],
+[[9710]],
+[[9711]],
+[[9712]],
+[[9713]],
+[[9714]],
+[[9715]],
+[[9716]],
+[[9717]],
+[[9718]],
+[[9719]],
+[[9720]],
+[[9721]],
+[[9722]],
+[[9723]],
+[[9724]],
+[[9725]],
+[[9726]],
+[[9727]],
+[[9728]],
+[[9729]],
+[[9730]],
+[[9731]],
+[[9732]],
+[[9733]],
+[[9734]],
+[[9735]],
+[[9736]],
+[[9737]],
+[[9738]],
+[[9739]],
+[[9740]],
+[[9741]],
+[[9742]],
+[[9743]],
+[[9744]],
+[[9745]],
+[[9746]],
+[[9747]],
+[[9748]],
+[[9749]],
+[[9750]],
+[[9751]],
+[[9752]],
+[[9753]],
+[[9754]],
+[[9755]],
+[[9756]],
+[[9757]],
+[[9758]],
+[[9759]],
+[[9760]],
+[[9761]],
+[[9762]],
+[[9763]],
+[[9764]],
+[[9765]],
+[[9766]],
+[[9767]],
+[[9768]],
+[[9769]],
+[[9770]],
+[[9771]],
+[[9772]],
+[[9773]],
+[[9774]],
+[[9775]],
+[[9776]],
+[[9777]],
+[[9778]],
+[[9779]],
+[[9780]],
+[[9781]],
+[[9782]],
+[[9783]],
+[[9784]],
+[[9785]],
+[[9786]],
+[[9787]],
+[[9788]],
+[[9789]],
+[[9790]],
+[[9791]],
+[[9792]],
+[[9793]],
+[[9794]],
+[[9795]],
+[[9796]],
+[[9797]],
+[[9798]],
+[[9799]],
+[[9800]],
+[[9801]],
+[[9802]],
+[[9803]],
+[[9804]],
+[[9805]],
+[[9806]],
+[[9807]],
+[[9808]],
+[[9809]],
+[[9810]],
+[[9811]],
+[[9812]],
+[[9813]],
+[[9814]],
+[[9815]],
+[[9816]],
+[[9817]],
+[[9818]],
+[[9819]],
+[[9820]],
+[[9821]],
+[[9822]],
+[[9823]],
+[[9824]],
+[[9825]],
+[[9826]],
+[[9827]],
+[[9828]],
+[[9829]],
+[[9830]],
+[[9831]],
+[[9832]],
+[[9833]],
+[[9834]],
+[[9835]],
+[[9836]],
+[[9837]],
+[[9838]],
+[[9839]],
+[[9840]],
+[[9841]],
+[[9842]],
+[[9843]],
+[[9844]],
+[[9845]],
+[[9846]],
+[[9847]],
+[[9848]],
+[[9849]],
+[[9850]],
+[[9851]],
+[[9852]],
+[[9853]],
+[[9854]],
+[[9855]],
+[[9856]],
+[[9857]],
+[[9858]],
+[[9859]],
+[[9860]],
+[[9861]],
+[[9862]],
+[[9863]],
+[[9864]],
+[[9865]],
+[[9866]],
+[[9867]],
+[[9868]],
+[[9869]],
+[[9870]],
+[[9871]],
+[[9872]],
+[[9873]],
+[[9874]],
+[[9875]],
+[[9876]],
+[[9877]],
+[[9878]],
+[[9879]],
+[[9880]],
+[[9881]],
+[[9882]],
+[[9883]],
+[[9884]],
+[[9885]],
+[[9886]],
+[[9887]],
+[[9888]],
+[[9889]],
+[[9890]],
+[[9891]],
+[[9892]],
+[[9893]],
+[[9894]],
+[[9895]],
+[[9896]],
+[[9897]],
+[[9898]],
+[[9899]],
+[[9900]],
+[[9901]],
+[[9902]],
+[[9903]],
+[[9904]],
+[[9905]],
+[[9906]],
+[[9907]],
+[[9908]],
+[[9909]],
+[[9910]],
+[[9911]],
+[[9912]],
+[[9913]],
+[[9914]],
+[[9915]],
+[[9916]],
+[[9917]],
+[[9918]],
+[[9919]],
+[[9920]],
+[[9921]],
+[[9922]],
+[[9923]],
+[[9924]],
+[[9925]],
+[[9926]],
+[[9927]],
+[[9928]],
+[[9929]],
+[[9930]],
+[[9931]],
+[[9932]],
+[[9933]],
+[[9934]],
+[[9935]],
+[[9936]],
+[[9937]],
+[[9938]],
+[[9939]],
+[[9940]],
+[[9941]],
+[[9942]],
+[[9943]],
+[[9944]],
+[[9945]],
+[[9946]],
+[[9947]],
+[[9948]],
+[[9949]],
+[[9950]],
+[[9951]],
+[[9952]],
+[[9953]],
+[[9954]],
+[[9955]],
+[[9956]],
+[[9957]],
+[[9958]],
+[[9959]],
+[[9960]],
+[[9961]],
+[[9962]],
+[[9963]],
+[[9964]],
+[[9965]],
+[[9966]],
+[[9967]],
+[[9968]],
+[[9969]],
+[[9970]],
+[[9971]],
+[[9972]],
+[[9973]],
+[[9974]],
+[[9975]],
+[[9976]],
+[[9977]],
+[[9978]],
+[[9979]],
+[[9980]],
+[[9981]],
+[[9982]],
+[[9983]],
+[[9984]],
+[[9985]],
+[[9986]],
+[[9987]],
+[[9988]],
+[[9989]],
+[[9990]],
+[[9991]],
+[[9992]],
+[[9993]],
+[[9994]],
+[[9995]],
+[[9996]],
+[[9997]],
+[[9998]],
+[[9999]],
+];
+
+confuse(x) {
+  try { throw x; } catch (e) { return e; }
+}
+
+main() {
+  if (!identical(confuse(list1), confuse(list2))) {
+    throw new Exception("list1 !== list2");
+  }
+}
diff --git a/tests/language_2/canonicalization_hashing_shallow_collision_instance_2_test.dart b/tests/language_2/canonicalization_hashing_shallow_collision_instance_2_test.dart
new file mode 100644
index 0000000..621b68e
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_shallow_collision_instance_2_test.dart
@@ -0,0 +1,20034 @@
+// 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.
+
+// If canonicialization hashes with only a field's cid, this will exhibit
+// quadratic time.
+
+class Box {
+  final Object a;
+  final Object b;
+  const Box(this.a, this.b);
+}
+
+// 10,000 elements.
+const list1 = [
+  Box(0, 0),
+  Box(1, 1),
+  Box(2, 2),
+  Box(3, 3),
+  Box(4, 4),
+  Box(5, 5),
+  Box(6, 6),
+  Box(7, 7),
+  Box(8, 8),
+  Box(9, 9),
+  Box(10, 10),
+  Box(11, 11),
+  Box(12, 12),
+  Box(13, 13),
+  Box(14, 14),
+  Box(15, 15),
+  Box(16, 16),
+  Box(17, 17),
+  Box(18, 18),
+  Box(19, 19),
+  Box(20, 20),
+  Box(21, 21),
+  Box(22, 22),
+  Box(23, 23),
+  Box(24, 24),
+  Box(25, 25),
+  Box(26, 26),
+  Box(27, 27),
+  Box(28, 28),
+  Box(29, 29),
+  Box(30, 30),
+  Box(31, 31),
+  Box(32, 32),
+  Box(33, 33),
+  Box(34, 34),
+  Box(35, 35),
+  Box(36, 36),
+  Box(37, 37),
+  Box(38, 38),
+  Box(39, 39),
+  Box(40, 40),
+  Box(41, 41),
+  Box(42, 42),
+  Box(43, 43),
+  Box(44, 44),
+  Box(45, 45),
+  Box(46, 46),
+  Box(47, 47),
+  Box(48, 48),
+  Box(49, 49),
+  Box(50, 50),
+  Box(51, 51),
+  Box(52, 52),
+  Box(53, 53),
+  Box(54, 54),
+  Box(55, 55),
+  Box(56, 56),
+  Box(57, 57),
+  Box(58, 58),
+  Box(59, 59),
+  Box(60, 60),
+  Box(61, 61),
+  Box(62, 62),
+  Box(63, 63),
+  Box(64, 64),
+  Box(65, 65),
+  Box(66, 66),
+  Box(67, 67),
+  Box(68, 68),
+  Box(69, 69),
+  Box(70, 70),
+  Box(71, 71),
+  Box(72, 72),
+  Box(73, 73),
+  Box(74, 74),
+  Box(75, 75),
+  Box(76, 76),
+  Box(77, 77),
+  Box(78, 78),
+  Box(79, 79),
+  Box(80, 80),
+  Box(81, 81),
+  Box(82, 82),
+  Box(83, 83),
+  Box(84, 84),
+  Box(85, 85),
+  Box(86, 86),
+  Box(87, 87),
+  Box(88, 88),
+  Box(89, 89),
+  Box(90, 90),
+  Box(91, 91),
+  Box(92, 92),
+  Box(93, 93),
+  Box(94, 94),
+  Box(95, 95),
+  Box(96, 96),
+  Box(97, 97),
+  Box(98, 98),
+  Box(99, 99),
+  Box(100, 100),
+  Box(101, 101),
+  Box(102, 102),
+  Box(103, 103),
+  Box(104, 104),
+  Box(105, 105),
+  Box(106, 106),
+  Box(107, 107),
+  Box(108, 108),
+  Box(109, 109),
+  Box(110, 110),
+  Box(111, 111),
+  Box(112, 112),
+  Box(113, 113),
+  Box(114, 114),
+  Box(115, 115),
+  Box(116, 116),
+  Box(117, 117),
+  Box(118, 118),
+  Box(119, 119),
+  Box(120, 120),
+  Box(121, 121),
+  Box(122, 122),
+  Box(123, 123),
+  Box(124, 124),
+  Box(125, 125),
+  Box(126, 126),
+  Box(127, 127),
+  Box(128, 128),
+  Box(129, 129),
+  Box(130, 130),
+  Box(131, 131),
+  Box(132, 132),
+  Box(133, 133),
+  Box(134, 134),
+  Box(135, 135),
+  Box(136, 136),
+  Box(137, 137),
+  Box(138, 138),
+  Box(139, 139),
+  Box(140, 140),
+  Box(141, 141),
+  Box(142, 142),
+  Box(143, 143),
+  Box(144, 144),
+  Box(145, 145),
+  Box(146, 146),
+  Box(147, 147),
+  Box(148, 148),
+  Box(149, 149),
+  Box(150, 150),
+  Box(151, 151),
+  Box(152, 152),
+  Box(153, 153),
+  Box(154, 154),
+  Box(155, 155),
+  Box(156, 156),
+  Box(157, 157),
+  Box(158, 158),
+  Box(159, 159),
+  Box(160, 160),
+  Box(161, 161),
+  Box(162, 162),
+  Box(163, 163),
+  Box(164, 164),
+  Box(165, 165),
+  Box(166, 166),
+  Box(167, 167),
+  Box(168, 168),
+  Box(169, 169),
+  Box(170, 170),
+  Box(171, 171),
+  Box(172, 172),
+  Box(173, 173),
+  Box(174, 174),
+  Box(175, 175),
+  Box(176, 176),
+  Box(177, 177),
+  Box(178, 178),
+  Box(179, 179),
+  Box(180, 180),
+  Box(181, 181),
+  Box(182, 182),
+  Box(183, 183),
+  Box(184, 184),
+  Box(185, 185),
+  Box(186, 186),
+  Box(187, 187),
+  Box(188, 188),
+  Box(189, 189),
+  Box(190, 190),
+  Box(191, 191),
+  Box(192, 192),
+  Box(193, 193),
+  Box(194, 194),
+  Box(195, 195),
+  Box(196, 196),
+  Box(197, 197),
+  Box(198, 198),
+  Box(199, 199),
+  Box(200, 200),
+  Box(201, 201),
+  Box(202, 202),
+  Box(203, 203),
+  Box(204, 204),
+  Box(205, 205),
+  Box(206, 206),
+  Box(207, 207),
+  Box(208, 208),
+  Box(209, 209),
+  Box(210, 210),
+  Box(211, 211),
+  Box(212, 212),
+  Box(213, 213),
+  Box(214, 214),
+  Box(215, 215),
+  Box(216, 216),
+  Box(217, 217),
+  Box(218, 218),
+  Box(219, 219),
+  Box(220, 220),
+  Box(221, 221),
+  Box(222, 222),
+  Box(223, 223),
+  Box(224, 224),
+  Box(225, 225),
+  Box(226, 226),
+  Box(227, 227),
+  Box(228, 228),
+  Box(229, 229),
+  Box(230, 230),
+  Box(231, 231),
+  Box(232, 232),
+  Box(233, 233),
+  Box(234, 234),
+  Box(235, 235),
+  Box(236, 236),
+  Box(237, 237),
+  Box(238, 238),
+  Box(239, 239),
+  Box(240, 240),
+  Box(241, 241),
+  Box(242, 242),
+  Box(243, 243),
+  Box(244, 244),
+  Box(245, 245),
+  Box(246, 246),
+  Box(247, 247),
+  Box(248, 248),
+  Box(249, 249),
+  Box(250, 250),
+  Box(251, 251),
+  Box(252, 252),
+  Box(253, 253),
+  Box(254, 254),
+  Box(255, 255),
+  Box(256, 256),
+  Box(257, 257),
+  Box(258, 258),
+  Box(259, 259),
+  Box(260, 260),
+  Box(261, 261),
+  Box(262, 262),
+  Box(263, 263),
+  Box(264, 264),
+  Box(265, 265),
+  Box(266, 266),
+  Box(267, 267),
+  Box(268, 268),
+  Box(269, 269),
+  Box(270, 270),
+  Box(271, 271),
+  Box(272, 272),
+  Box(273, 273),
+  Box(274, 274),
+  Box(275, 275),
+  Box(276, 276),
+  Box(277, 277),
+  Box(278, 278),
+  Box(279, 279),
+  Box(280, 280),
+  Box(281, 281),
+  Box(282, 282),
+  Box(283, 283),
+  Box(284, 284),
+  Box(285, 285),
+  Box(286, 286),
+  Box(287, 287),
+  Box(288, 288),
+  Box(289, 289),
+  Box(290, 290),
+  Box(291, 291),
+  Box(292, 292),
+  Box(293, 293),
+  Box(294, 294),
+  Box(295, 295),
+  Box(296, 296),
+  Box(297, 297),
+  Box(298, 298),
+  Box(299, 299),
+  Box(300, 300),
+  Box(301, 301),
+  Box(302, 302),
+  Box(303, 303),
+  Box(304, 304),
+  Box(305, 305),
+  Box(306, 306),
+  Box(307, 307),
+  Box(308, 308),
+  Box(309, 309),
+  Box(310, 310),
+  Box(311, 311),
+  Box(312, 312),
+  Box(313, 313),
+  Box(314, 314),
+  Box(315, 315),
+  Box(316, 316),
+  Box(317, 317),
+  Box(318, 318),
+  Box(319, 319),
+  Box(320, 320),
+  Box(321, 321),
+  Box(322, 322),
+  Box(323, 323),
+  Box(324, 324),
+  Box(325, 325),
+  Box(326, 326),
+  Box(327, 327),
+  Box(328, 328),
+  Box(329, 329),
+  Box(330, 330),
+  Box(331, 331),
+  Box(332, 332),
+  Box(333, 333),
+  Box(334, 334),
+  Box(335, 335),
+  Box(336, 336),
+  Box(337, 337),
+  Box(338, 338),
+  Box(339, 339),
+  Box(340, 340),
+  Box(341, 341),
+  Box(342, 342),
+  Box(343, 343),
+  Box(344, 344),
+  Box(345, 345),
+  Box(346, 346),
+  Box(347, 347),
+  Box(348, 348),
+  Box(349, 349),
+  Box(350, 350),
+  Box(351, 351),
+  Box(352, 352),
+  Box(353, 353),
+  Box(354, 354),
+  Box(355, 355),
+  Box(356, 356),
+  Box(357, 357),
+  Box(358, 358),
+  Box(359, 359),
+  Box(360, 360),
+  Box(361, 361),
+  Box(362, 362),
+  Box(363, 363),
+  Box(364, 364),
+  Box(365, 365),
+  Box(366, 366),
+  Box(367, 367),
+  Box(368, 368),
+  Box(369, 369),
+  Box(370, 370),
+  Box(371, 371),
+  Box(372, 372),
+  Box(373, 373),
+  Box(374, 374),
+  Box(375, 375),
+  Box(376, 376),
+  Box(377, 377),
+  Box(378, 378),
+  Box(379, 379),
+  Box(380, 380),
+  Box(381, 381),
+  Box(382, 382),
+  Box(383, 383),
+  Box(384, 384),
+  Box(385, 385),
+  Box(386, 386),
+  Box(387, 387),
+  Box(388, 388),
+  Box(389, 389),
+  Box(390, 390),
+  Box(391, 391),
+  Box(392, 392),
+  Box(393, 393),
+  Box(394, 394),
+  Box(395, 395),
+  Box(396, 396),
+  Box(397, 397),
+  Box(398, 398),
+  Box(399, 399),
+  Box(400, 400),
+  Box(401, 401),
+  Box(402, 402),
+  Box(403, 403),
+  Box(404, 404),
+  Box(405, 405),
+  Box(406, 406),
+  Box(407, 407),
+  Box(408, 408),
+  Box(409, 409),
+  Box(410, 410),
+  Box(411, 411),
+  Box(412, 412),
+  Box(413, 413),
+  Box(414, 414),
+  Box(415, 415),
+  Box(416, 416),
+  Box(417, 417),
+  Box(418, 418),
+  Box(419, 419),
+  Box(420, 420),
+  Box(421, 421),
+  Box(422, 422),
+  Box(423, 423),
+  Box(424, 424),
+  Box(425, 425),
+  Box(426, 426),
+  Box(427, 427),
+  Box(428, 428),
+  Box(429, 429),
+  Box(430, 430),
+  Box(431, 431),
+  Box(432, 432),
+  Box(433, 433),
+  Box(434, 434),
+  Box(435, 435),
+  Box(436, 436),
+  Box(437, 437),
+  Box(438, 438),
+  Box(439, 439),
+  Box(440, 440),
+  Box(441, 441),
+  Box(442, 442),
+  Box(443, 443),
+  Box(444, 444),
+  Box(445, 445),
+  Box(446, 446),
+  Box(447, 447),
+  Box(448, 448),
+  Box(449, 449),
+  Box(450, 450),
+  Box(451, 451),
+  Box(452, 452),
+  Box(453, 453),
+  Box(454, 454),
+  Box(455, 455),
+  Box(456, 456),
+  Box(457, 457),
+  Box(458, 458),
+  Box(459, 459),
+  Box(460, 460),
+  Box(461, 461),
+  Box(462, 462),
+  Box(463, 463),
+  Box(464, 464),
+  Box(465, 465),
+  Box(466, 466),
+  Box(467, 467),
+  Box(468, 468),
+  Box(469, 469),
+  Box(470, 470),
+  Box(471, 471),
+  Box(472, 472),
+  Box(473, 473),
+  Box(474, 474),
+  Box(475, 475),
+  Box(476, 476),
+  Box(477, 477),
+  Box(478, 478),
+  Box(479, 479),
+  Box(480, 480),
+  Box(481, 481),
+  Box(482, 482),
+  Box(483, 483),
+  Box(484, 484),
+  Box(485, 485),
+  Box(486, 486),
+  Box(487, 487),
+  Box(488, 488),
+  Box(489, 489),
+  Box(490, 490),
+  Box(491, 491),
+  Box(492, 492),
+  Box(493, 493),
+  Box(494, 494),
+  Box(495, 495),
+  Box(496, 496),
+  Box(497, 497),
+  Box(498, 498),
+  Box(499, 499),
+  Box(500, 500),
+  Box(501, 501),
+  Box(502, 502),
+  Box(503, 503),
+  Box(504, 504),
+  Box(505, 505),
+  Box(506, 506),
+  Box(507, 507),
+  Box(508, 508),
+  Box(509, 509),
+  Box(510, 510),
+  Box(511, 511),
+  Box(512, 512),
+  Box(513, 513),
+  Box(514, 514),
+  Box(515, 515),
+  Box(516, 516),
+  Box(517, 517),
+  Box(518, 518),
+  Box(519, 519),
+  Box(520, 520),
+  Box(521, 521),
+  Box(522, 522),
+  Box(523, 523),
+  Box(524, 524),
+  Box(525, 525),
+  Box(526, 526),
+  Box(527, 527),
+  Box(528, 528),
+  Box(529, 529),
+  Box(530, 530),
+  Box(531, 531),
+  Box(532, 532),
+  Box(533, 533),
+  Box(534, 534),
+  Box(535, 535),
+  Box(536, 536),
+  Box(537, 537),
+  Box(538, 538),
+  Box(539, 539),
+  Box(540, 540),
+  Box(541, 541),
+  Box(542, 542),
+  Box(543, 543),
+  Box(544, 544),
+  Box(545, 545),
+  Box(546, 546),
+  Box(547, 547),
+  Box(548, 548),
+  Box(549, 549),
+  Box(550, 550),
+  Box(551, 551),
+  Box(552, 552),
+  Box(553, 553),
+  Box(554, 554),
+  Box(555, 555),
+  Box(556, 556),
+  Box(557, 557),
+  Box(558, 558),
+  Box(559, 559),
+  Box(560, 560),
+  Box(561, 561),
+  Box(562, 562),
+  Box(563, 563),
+  Box(564, 564),
+  Box(565, 565),
+  Box(566, 566),
+  Box(567, 567),
+  Box(568, 568),
+  Box(569, 569),
+  Box(570, 570),
+  Box(571, 571),
+  Box(572, 572),
+  Box(573, 573),
+  Box(574, 574),
+  Box(575, 575),
+  Box(576, 576),
+  Box(577, 577),
+  Box(578, 578),
+  Box(579, 579),
+  Box(580, 580),
+  Box(581, 581),
+  Box(582, 582),
+  Box(583, 583),
+  Box(584, 584),
+  Box(585, 585),
+  Box(586, 586),
+  Box(587, 587),
+  Box(588, 588),
+  Box(589, 589),
+  Box(590, 590),
+  Box(591, 591),
+  Box(592, 592),
+  Box(593, 593),
+  Box(594, 594),
+  Box(595, 595),
+  Box(596, 596),
+  Box(597, 597),
+  Box(598, 598),
+  Box(599, 599),
+  Box(600, 600),
+  Box(601, 601),
+  Box(602, 602),
+  Box(603, 603),
+  Box(604, 604),
+  Box(605, 605),
+  Box(606, 606),
+  Box(607, 607),
+  Box(608, 608),
+  Box(609, 609),
+  Box(610, 610),
+  Box(611, 611),
+  Box(612, 612),
+  Box(613, 613),
+  Box(614, 614),
+  Box(615, 615),
+  Box(616, 616),
+  Box(617, 617),
+  Box(618, 618),
+  Box(619, 619),
+  Box(620, 620),
+  Box(621, 621),
+  Box(622, 622),
+  Box(623, 623),
+  Box(624, 624),
+  Box(625, 625),
+  Box(626, 626),
+  Box(627, 627),
+  Box(628, 628),
+  Box(629, 629),
+  Box(630, 630),
+  Box(631, 631),
+  Box(632, 632),
+  Box(633, 633),
+  Box(634, 634),
+  Box(635, 635),
+  Box(636, 636),
+  Box(637, 637),
+  Box(638, 638),
+  Box(639, 639),
+  Box(640, 640),
+  Box(641, 641),
+  Box(642, 642),
+  Box(643, 643),
+  Box(644, 644),
+  Box(645, 645),
+  Box(646, 646),
+  Box(647, 647),
+  Box(648, 648),
+  Box(649, 649),
+  Box(650, 650),
+  Box(651, 651),
+  Box(652, 652),
+  Box(653, 653),
+  Box(654, 654),
+  Box(655, 655),
+  Box(656, 656),
+  Box(657, 657),
+  Box(658, 658),
+  Box(659, 659),
+  Box(660, 660),
+  Box(661, 661),
+  Box(662, 662),
+  Box(663, 663),
+  Box(664, 664),
+  Box(665, 665),
+  Box(666, 666),
+  Box(667, 667),
+  Box(668, 668),
+  Box(669, 669),
+  Box(670, 670),
+  Box(671, 671),
+  Box(672, 672),
+  Box(673, 673),
+  Box(674, 674),
+  Box(675, 675),
+  Box(676, 676),
+  Box(677, 677),
+  Box(678, 678),
+  Box(679, 679),
+  Box(680, 680),
+  Box(681, 681),
+  Box(682, 682),
+  Box(683, 683),
+  Box(684, 684),
+  Box(685, 685),
+  Box(686, 686),
+  Box(687, 687),
+  Box(688, 688),
+  Box(689, 689),
+  Box(690, 690),
+  Box(691, 691),
+  Box(692, 692),
+  Box(693, 693),
+  Box(694, 694),
+  Box(695, 695),
+  Box(696, 696),
+  Box(697, 697),
+  Box(698, 698),
+  Box(699, 699),
+  Box(700, 700),
+  Box(701, 701),
+  Box(702, 702),
+  Box(703, 703),
+  Box(704, 704),
+  Box(705, 705),
+  Box(706, 706),
+  Box(707, 707),
+  Box(708, 708),
+  Box(709, 709),
+  Box(710, 710),
+  Box(711, 711),
+  Box(712, 712),
+  Box(713, 713),
+  Box(714, 714),
+  Box(715, 715),
+  Box(716, 716),
+  Box(717, 717),
+  Box(718, 718),
+  Box(719, 719),
+  Box(720, 720),
+  Box(721, 721),
+  Box(722, 722),
+  Box(723, 723),
+  Box(724, 724),
+  Box(725, 725),
+  Box(726, 726),
+  Box(727, 727),
+  Box(728, 728),
+  Box(729, 729),
+  Box(730, 730),
+  Box(731, 731),
+  Box(732, 732),
+  Box(733, 733),
+  Box(734, 734),
+  Box(735, 735),
+  Box(736, 736),
+  Box(737, 737),
+  Box(738, 738),
+  Box(739, 739),
+  Box(740, 740),
+  Box(741, 741),
+  Box(742, 742),
+  Box(743, 743),
+  Box(744, 744),
+  Box(745, 745),
+  Box(746, 746),
+  Box(747, 747),
+  Box(748, 748),
+  Box(749, 749),
+  Box(750, 750),
+  Box(751, 751),
+  Box(752, 752),
+  Box(753, 753),
+  Box(754, 754),
+  Box(755, 755),
+  Box(756, 756),
+  Box(757, 757),
+  Box(758, 758),
+  Box(759, 759),
+  Box(760, 760),
+  Box(761, 761),
+  Box(762, 762),
+  Box(763, 763),
+  Box(764, 764),
+  Box(765, 765),
+  Box(766, 766),
+  Box(767, 767),
+  Box(768, 768),
+  Box(769, 769),
+  Box(770, 770),
+  Box(771, 771),
+  Box(772, 772),
+  Box(773, 773),
+  Box(774, 774),
+  Box(775, 775),
+  Box(776, 776),
+  Box(777, 777),
+  Box(778, 778),
+  Box(779, 779),
+  Box(780, 780),
+  Box(781, 781),
+  Box(782, 782),
+  Box(783, 783),
+  Box(784, 784),
+  Box(785, 785),
+  Box(786, 786),
+  Box(787, 787),
+  Box(788, 788),
+  Box(789, 789),
+  Box(790, 790),
+  Box(791, 791),
+  Box(792, 792),
+  Box(793, 793),
+  Box(794, 794),
+  Box(795, 795),
+  Box(796, 796),
+  Box(797, 797),
+  Box(798, 798),
+  Box(799, 799),
+  Box(800, 800),
+  Box(801, 801),
+  Box(802, 802),
+  Box(803, 803),
+  Box(804, 804),
+  Box(805, 805),
+  Box(806, 806),
+  Box(807, 807),
+  Box(808, 808),
+  Box(809, 809),
+  Box(810, 810),
+  Box(811, 811),
+  Box(812, 812),
+  Box(813, 813),
+  Box(814, 814),
+  Box(815, 815),
+  Box(816, 816),
+  Box(817, 817),
+  Box(818, 818),
+  Box(819, 819),
+  Box(820, 820),
+  Box(821, 821),
+  Box(822, 822),
+  Box(823, 823),
+  Box(824, 824),
+  Box(825, 825),
+  Box(826, 826),
+  Box(827, 827),
+  Box(828, 828),
+  Box(829, 829),
+  Box(830, 830),
+  Box(831, 831),
+  Box(832, 832),
+  Box(833, 833),
+  Box(834, 834),
+  Box(835, 835),
+  Box(836, 836),
+  Box(837, 837),
+  Box(838, 838),
+  Box(839, 839),
+  Box(840, 840),
+  Box(841, 841),
+  Box(842, 842),
+  Box(843, 843),
+  Box(844, 844),
+  Box(845, 845),
+  Box(846, 846),
+  Box(847, 847),
+  Box(848, 848),
+  Box(849, 849),
+  Box(850, 850),
+  Box(851, 851),
+  Box(852, 852),
+  Box(853, 853),
+  Box(854, 854),
+  Box(855, 855),
+  Box(856, 856),
+  Box(857, 857),
+  Box(858, 858),
+  Box(859, 859),
+  Box(860, 860),
+  Box(861, 861),
+  Box(862, 862),
+  Box(863, 863),
+  Box(864, 864),
+  Box(865, 865),
+  Box(866, 866),
+  Box(867, 867),
+  Box(868, 868),
+  Box(869, 869),
+  Box(870, 870),
+  Box(871, 871),
+  Box(872, 872),
+  Box(873, 873),
+  Box(874, 874),
+  Box(875, 875),
+  Box(876, 876),
+  Box(877, 877),
+  Box(878, 878),
+  Box(879, 879),
+  Box(880, 880),
+  Box(881, 881),
+  Box(882, 882),
+  Box(883, 883),
+  Box(884, 884),
+  Box(885, 885),
+  Box(886, 886),
+  Box(887, 887),
+  Box(888, 888),
+  Box(889, 889),
+  Box(890, 890),
+  Box(891, 891),
+  Box(892, 892),
+  Box(893, 893),
+  Box(894, 894),
+  Box(895, 895),
+  Box(896, 896),
+  Box(897, 897),
+  Box(898, 898),
+  Box(899, 899),
+  Box(900, 900),
+  Box(901, 901),
+  Box(902, 902),
+  Box(903, 903),
+  Box(904, 904),
+  Box(905, 905),
+  Box(906, 906),
+  Box(907, 907),
+  Box(908, 908),
+  Box(909, 909),
+  Box(910, 910),
+  Box(911, 911),
+  Box(912, 912),
+  Box(913, 913),
+  Box(914, 914),
+  Box(915, 915),
+  Box(916, 916),
+  Box(917, 917),
+  Box(918, 918),
+  Box(919, 919),
+  Box(920, 920),
+  Box(921, 921),
+  Box(922, 922),
+  Box(923, 923),
+  Box(924, 924),
+  Box(925, 925),
+  Box(926, 926),
+  Box(927, 927),
+  Box(928, 928),
+  Box(929, 929),
+  Box(930, 930),
+  Box(931, 931),
+  Box(932, 932),
+  Box(933, 933),
+  Box(934, 934),
+  Box(935, 935),
+  Box(936, 936),
+  Box(937, 937),
+  Box(938, 938),
+  Box(939, 939),
+  Box(940, 940),
+  Box(941, 941),
+  Box(942, 942),
+  Box(943, 943),
+  Box(944, 944),
+  Box(945, 945),
+  Box(946, 946),
+  Box(947, 947),
+  Box(948, 948),
+  Box(949, 949),
+  Box(950, 950),
+  Box(951, 951),
+  Box(952, 952),
+  Box(953, 953),
+  Box(954, 954),
+  Box(955, 955),
+  Box(956, 956),
+  Box(957, 957),
+  Box(958, 958),
+  Box(959, 959),
+  Box(960, 960),
+  Box(961, 961),
+  Box(962, 962),
+  Box(963, 963),
+  Box(964, 964),
+  Box(965, 965),
+  Box(966, 966),
+  Box(967, 967),
+  Box(968, 968),
+  Box(969, 969),
+  Box(970, 970),
+  Box(971, 971),
+  Box(972, 972),
+  Box(973, 973),
+  Box(974, 974),
+  Box(975, 975),
+  Box(976, 976),
+  Box(977, 977),
+  Box(978, 978),
+  Box(979, 979),
+  Box(980, 980),
+  Box(981, 981),
+  Box(982, 982),
+  Box(983, 983),
+  Box(984, 984),
+  Box(985, 985),
+  Box(986, 986),
+  Box(987, 987),
+  Box(988, 988),
+  Box(989, 989),
+  Box(990, 990),
+  Box(991, 991),
+  Box(992, 992),
+  Box(993, 993),
+  Box(994, 994),
+  Box(995, 995),
+  Box(996, 996),
+  Box(997, 997),
+  Box(998, 998),
+  Box(999, 999),
+  Box(1000, 1000),
+  Box(1001, 1001),
+  Box(1002, 1002),
+  Box(1003, 1003),
+  Box(1004, 1004),
+  Box(1005, 1005),
+  Box(1006, 1006),
+  Box(1007, 1007),
+  Box(1008, 1008),
+  Box(1009, 1009),
+  Box(1010, 1010),
+  Box(1011, 1011),
+  Box(1012, 1012),
+  Box(1013, 1013),
+  Box(1014, 1014),
+  Box(1015, 1015),
+  Box(1016, 1016),
+  Box(1017, 1017),
+  Box(1018, 1018),
+  Box(1019, 1019),
+  Box(1020, 1020),
+  Box(1021, 1021),
+  Box(1022, 1022),
+  Box(1023, 1023),
+  Box(1024, 1024),
+  Box(1025, 1025),
+  Box(1026, 1026),
+  Box(1027, 1027),
+  Box(1028, 1028),
+  Box(1029, 1029),
+  Box(1030, 1030),
+  Box(1031, 1031),
+  Box(1032, 1032),
+  Box(1033, 1033),
+  Box(1034, 1034),
+  Box(1035, 1035),
+  Box(1036, 1036),
+  Box(1037, 1037),
+  Box(1038, 1038),
+  Box(1039, 1039),
+  Box(1040, 1040),
+  Box(1041, 1041),
+  Box(1042, 1042),
+  Box(1043, 1043),
+  Box(1044, 1044),
+  Box(1045, 1045),
+  Box(1046, 1046),
+  Box(1047, 1047),
+  Box(1048, 1048),
+  Box(1049, 1049),
+  Box(1050, 1050),
+  Box(1051, 1051),
+  Box(1052, 1052),
+  Box(1053, 1053),
+  Box(1054, 1054),
+  Box(1055, 1055),
+  Box(1056, 1056),
+  Box(1057, 1057),
+  Box(1058, 1058),
+  Box(1059, 1059),
+  Box(1060, 1060),
+  Box(1061, 1061),
+  Box(1062, 1062),
+  Box(1063, 1063),
+  Box(1064, 1064),
+  Box(1065, 1065),
+  Box(1066, 1066),
+  Box(1067, 1067),
+  Box(1068, 1068),
+  Box(1069, 1069),
+  Box(1070, 1070),
+  Box(1071, 1071),
+  Box(1072, 1072),
+  Box(1073, 1073),
+  Box(1074, 1074),
+  Box(1075, 1075),
+  Box(1076, 1076),
+  Box(1077, 1077),
+  Box(1078, 1078),
+  Box(1079, 1079),
+  Box(1080, 1080),
+  Box(1081, 1081),
+  Box(1082, 1082),
+  Box(1083, 1083),
+  Box(1084, 1084),
+  Box(1085, 1085),
+  Box(1086, 1086),
+  Box(1087, 1087),
+  Box(1088, 1088),
+  Box(1089, 1089),
+  Box(1090, 1090),
+  Box(1091, 1091),
+  Box(1092, 1092),
+  Box(1093, 1093),
+  Box(1094, 1094),
+  Box(1095, 1095),
+  Box(1096, 1096),
+  Box(1097, 1097),
+  Box(1098, 1098),
+  Box(1099, 1099),
+  Box(1100, 1100),
+  Box(1101, 1101),
+  Box(1102, 1102),
+  Box(1103, 1103),
+  Box(1104, 1104),
+  Box(1105, 1105),
+  Box(1106, 1106),
+  Box(1107, 1107),
+  Box(1108, 1108),
+  Box(1109, 1109),
+  Box(1110, 1110),
+  Box(1111, 1111),
+  Box(1112, 1112),
+  Box(1113, 1113),
+  Box(1114, 1114),
+  Box(1115, 1115),
+  Box(1116, 1116),
+  Box(1117, 1117),
+  Box(1118, 1118),
+  Box(1119, 1119),
+  Box(1120, 1120),
+  Box(1121, 1121),
+  Box(1122, 1122),
+  Box(1123, 1123),
+  Box(1124, 1124),
+  Box(1125, 1125),
+  Box(1126, 1126),
+  Box(1127, 1127),
+  Box(1128, 1128),
+  Box(1129, 1129),
+  Box(1130, 1130),
+  Box(1131, 1131),
+  Box(1132, 1132),
+  Box(1133, 1133),
+  Box(1134, 1134),
+  Box(1135, 1135),
+  Box(1136, 1136),
+  Box(1137, 1137),
+  Box(1138, 1138),
+  Box(1139, 1139),
+  Box(1140, 1140),
+  Box(1141, 1141),
+  Box(1142, 1142),
+  Box(1143, 1143),
+  Box(1144, 1144),
+  Box(1145, 1145),
+  Box(1146, 1146),
+  Box(1147, 1147),
+  Box(1148, 1148),
+  Box(1149, 1149),
+  Box(1150, 1150),
+  Box(1151, 1151),
+  Box(1152, 1152),
+  Box(1153, 1153),
+  Box(1154, 1154),
+  Box(1155, 1155),
+  Box(1156, 1156),
+  Box(1157, 1157),
+  Box(1158, 1158),
+  Box(1159, 1159),
+  Box(1160, 1160),
+  Box(1161, 1161),
+  Box(1162, 1162),
+  Box(1163, 1163),
+  Box(1164, 1164),
+  Box(1165, 1165),
+  Box(1166, 1166),
+  Box(1167, 1167),
+  Box(1168, 1168),
+  Box(1169, 1169),
+  Box(1170, 1170),
+  Box(1171, 1171),
+  Box(1172, 1172),
+  Box(1173, 1173),
+  Box(1174, 1174),
+  Box(1175, 1175),
+  Box(1176, 1176),
+  Box(1177, 1177),
+  Box(1178, 1178),
+  Box(1179, 1179),
+  Box(1180, 1180),
+  Box(1181, 1181),
+  Box(1182, 1182),
+  Box(1183, 1183),
+  Box(1184, 1184),
+  Box(1185, 1185),
+  Box(1186, 1186),
+  Box(1187, 1187),
+  Box(1188, 1188),
+  Box(1189, 1189),
+  Box(1190, 1190),
+  Box(1191, 1191),
+  Box(1192, 1192),
+  Box(1193, 1193),
+  Box(1194, 1194),
+  Box(1195, 1195),
+  Box(1196, 1196),
+  Box(1197, 1197),
+  Box(1198, 1198),
+  Box(1199, 1199),
+  Box(1200, 1200),
+  Box(1201, 1201),
+  Box(1202, 1202),
+  Box(1203, 1203),
+  Box(1204, 1204),
+  Box(1205, 1205),
+  Box(1206, 1206),
+  Box(1207, 1207),
+  Box(1208, 1208),
+  Box(1209, 1209),
+  Box(1210, 1210),
+  Box(1211, 1211),
+  Box(1212, 1212),
+  Box(1213, 1213),
+  Box(1214, 1214),
+  Box(1215, 1215),
+  Box(1216, 1216),
+  Box(1217, 1217),
+  Box(1218, 1218),
+  Box(1219, 1219),
+  Box(1220, 1220),
+  Box(1221, 1221),
+  Box(1222, 1222),
+  Box(1223, 1223),
+  Box(1224, 1224),
+  Box(1225, 1225),
+  Box(1226, 1226),
+  Box(1227, 1227),
+  Box(1228, 1228),
+  Box(1229, 1229),
+  Box(1230, 1230),
+  Box(1231, 1231),
+  Box(1232, 1232),
+  Box(1233, 1233),
+  Box(1234, 1234),
+  Box(1235, 1235),
+  Box(1236, 1236),
+  Box(1237, 1237),
+  Box(1238, 1238),
+  Box(1239, 1239),
+  Box(1240, 1240),
+  Box(1241, 1241),
+  Box(1242, 1242),
+  Box(1243, 1243),
+  Box(1244, 1244),
+  Box(1245, 1245),
+  Box(1246, 1246),
+  Box(1247, 1247),
+  Box(1248, 1248),
+  Box(1249, 1249),
+  Box(1250, 1250),
+  Box(1251, 1251),
+  Box(1252, 1252),
+  Box(1253, 1253),
+  Box(1254, 1254),
+  Box(1255, 1255),
+  Box(1256, 1256),
+  Box(1257, 1257),
+  Box(1258, 1258),
+  Box(1259, 1259),
+  Box(1260, 1260),
+  Box(1261, 1261),
+  Box(1262, 1262),
+  Box(1263, 1263),
+  Box(1264, 1264),
+  Box(1265, 1265),
+  Box(1266, 1266),
+  Box(1267, 1267),
+  Box(1268, 1268),
+  Box(1269, 1269),
+  Box(1270, 1270),
+  Box(1271, 1271),
+  Box(1272, 1272),
+  Box(1273, 1273),
+  Box(1274, 1274),
+  Box(1275, 1275),
+  Box(1276, 1276),
+  Box(1277, 1277),
+  Box(1278, 1278),
+  Box(1279, 1279),
+  Box(1280, 1280),
+  Box(1281, 1281),
+  Box(1282, 1282),
+  Box(1283, 1283),
+  Box(1284, 1284),
+  Box(1285, 1285),
+  Box(1286, 1286),
+  Box(1287, 1287),
+  Box(1288, 1288),
+  Box(1289, 1289),
+  Box(1290, 1290),
+  Box(1291, 1291),
+  Box(1292, 1292),
+  Box(1293, 1293),
+  Box(1294, 1294),
+  Box(1295, 1295),
+  Box(1296, 1296),
+  Box(1297, 1297),
+  Box(1298, 1298),
+  Box(1299, 1299),
+  Box(1300, 1300),
+  Box(1301, 1301),
+  Box(1302, 1302),
+  Box(1303, 1303),
+  Box(1304, 1304),
+  Box(1305, 1305),
+  Box(1306, 1306),
+  Box(1307, 1307),
+  Box(1308, 1308),
+  Box(1309, 1309),
+  Box(1310, 1310),
+  Box(1311, 1311),
+  Box(1312, 1312),
+  Box(1313, 1313),
+  Box(1314, 1314),
+  Box(1315, 1315),
+  Box(1316, 1316),
+  Box(1317, 1317),
+  Box(1318, 1318),
+  Box(1319, 1319),
+  Box(1320, 1320),
+  Box(1321, 1321),
+  Box(1322, 1322),
+  Box(1323, 1323),
+  Box(1324, 1324),
+  Box(1325, 1325),
+  Box(1326, 1326),
+  Box(1327, 1327),
+  Box(1328, 1328),
+  Box(1329, 1329),
+  Box(1330, 1330),
+  Box(1331, 1331),
+  Box(1332, 1332),
+  Box(1333, 1333),
+  Box(1334, 1334),
+  Box(1335, 1335),
+  Box(1336, 1336),
+  Box(1337, 1337),
+  Box(1338, 1338),
+  Box(1339, 1339),
+  Box(1340, 1340),
+  Box(1341, 1341),
+  Box(1342, 1342),
+  Box(1343, 1343),
+  Box(1344, 1344),
+  Box(1345, 1345),
+  Box(1346, 1346),
+  Box(1347, 1347),
+  Box(1348, 1348),
+  Box(1349, 1349),
+  Box(1350, 1350),
+  Box(1351, 1351),
+  Box(1352, 1352),
+  Box(1353, 1353),
+  Box(1354, 1354),
+  Box(1355, 1355),
+  Box(1356, 1356),
+  Box(1357, 1357),
+  Box(1358, 1358),
+  Box(1359, 1359),
+  Box(1360, 1360),
+  Box(1361, 1361),
+  Box(1362, 1362),
+  Box(1363, 1363),
+  Box(1364, 1364),
+  Box(1365, 1365),
+  Box(1366, 1366),
+  Box(1367, 1367),
+  Box(1368, 1368),
+  Box(1369, 1369),
+  Box(1370, 1370),
+  Box(1371, 1371),
+  Box(1372, 1372),
+  Box(1373, 1373),
+  Box(1374, 1374),
+  Box(1375, 1375),
+  Box(1376, 1376),
+  Box(1377, 1377),
+  Box(1378, 1378),
+  Box(1379, 1379),
+  Box(1380, 1380),
+  Box(1381, 1381),
+  Box(1382, 1382),
+  Box(1383, 1383),
+  Box(1384, 1384),
+  Box(1385, 1385),
+  Box(1386, 1386),
+  Box(1387, 1387),
+  Box(1388, 1388),
+  Box(1389, 1389),
+  Box(1390, 1390),
+  Box(1391, 1391),
+  Box(1392, 1392),
+  Box(1393, 1393),
+  Box(1394, 1394),
+  Box(1395, 1395),
+  Box(1396, 1396),
+  Box(1397, 1397),
+  Box(1398, 1398),
+  Box(1399, 1399),
+  Box(1400, 1400),
+  Box(1401, 1401),
+  Box(1402, 1402),
+  Box(1403, 1403),
+  Box(1404, 1404),
+  Box(1405, 1405),
+  Box(1406, 1406),
+  Box(1407, 1407),
+  Box(1408, 1408),
+  Box(1409, 1409),
+  Box(1410, 1410),
+  Box(1411, 1411),
+  Box(1412, 1412),
+  Box(1413, 1413),
+  Box(1414, 1414),
+  Box(1415, 1415),
+  Box(1416, 1416),
+  Box(1417, 1417),
+  Box(1418, 1418),
+  Box(1419, 1419),
+  Box(1420, 1420),
+  Box(1421, 1421),
+  Box(1422, 1422),
+  Box(1423, 1423),
+  Box(1424, 1424),
+  Box(1425, 1425),
+  Box(1426, 1426),
+  Box(1427, 1427),
+  Box(1428, 1428),
+  Box(1429, 1429),
+  Box(1430, 1430),
+  Box(1431, 1431),
+  Box(1432, 1432),
+  Box(1433, 1433),
+  Box(1434, 1434),
+  Box(1435, 1435),
+  Box(1436, 1436),
+  Box(1437, 1437),
+  Box(1438, 1438),
+  Box(1439, 1439),
+  Box(1440, 1440),
+  Box(1441, 1441),
+  Box(1442, 1442),
+  Box(1443, 1443),
+  Box(1444, 1444),
+  Box(1445, 1445),
+  Box(1446, 1446),
+  Box(1447, 1447),
+  Box(1448, 1448),
+  Box(1449, 1449),
+  Box(1450, 1450),
+  Box(1451, 1451),
+  Box(1452, 1452),
+  Box(1453, 1453),
+  Box(1454, 1454),
+  Box(1455, 1455),
+  Box(1456, 1456),
+  Box(1457, 1457),
+  Box(1458, 1458),
+  Box(1459, 1459),
+  Box(1460, 1460),
+  Box(1461, 1461),
+  Box(1462, 1462),
+  Box(1463, 1463),
+  Box(1464, 1464),
+  Box(1465, 1465),
+  Box(1466, 1466),
+  Box(1467, 1467),
+  Box(1468, 1468),
+  Box(1469, 1469),
+  Box(1470, 1470),
+  Box(1471, 1471),
+  Box(1472, 1472),
+  Box(1473, 1473),
+  Box(1474, 1474),
+  Box(1475, 1475),
+  Box(1476, 1476),
+  Box(1477, 1477),
+  Box(1478, 1478),
+  Box(1479, 1479),
+  Box(1480, 1480),
+  Box(1481, 1481),
+  Box(1482, 1482),
+  Box(1483, 1483),
+  Box(1484, 1484),
+  Box(1485, 1485),
+  Box(1486, 1486),
+  Box(1487, 1487),
+  Box(1488, 1488),
+  Box(1489, 1489),
+  Box(1490, 1490),
+  Box(1491, 1491),
+  Box(1492, 1492),
+  Box(1493, 1493),
+  Box(1494, 1494),
+  Box(1495, 1495),
+  Box(1496, 1496),
+  Box(1497, 1497),
+  Box(1498, 1498),
+  Box(1499, 1499),
+  Box(1500, 1500),
+  Box(1501, 1501),
+  Box(1502, 1502),
+  Box(1503, 1503),
+  Box(1504, 1504),
+  Box(1505, 1505),
+  Box(1506, 1506),
+  Box(1507, 1507),
+  Box(1508, 1508),
+  Box(1509, 1509),
+  Box(1510, 1510),
+  Box(1511, 1511),
+  Box(1512, 1512),
+  Box(1513, 1513),
+  Box(1514, 1514),
+  Box(1515, 1515),
+  Box(1516, 1516),
+  Box(1517, 1517),
+  Box(1518, 1518),
+  Box(1519, 1519),
+  Box(1520, 1520),
+  Box(1521, 1521),
+  Box(1522, 1522),
+  Box(1523, 1523),
+  Box(1524, 1524),
+  Box(1525, 1525),
+  Box(1526, 1526),
+  Box(1527, 1527),
+  Box(1528, 1528),
+  Box(1529, 1529),
+  Box(1530, 1530),
+  Box(1531, 1531),
+  Box(1532, 1532),
+  Box(1533, 1533),
+  Box(1534, 1534),
+  Box(1535, 1535),
+  Box(1536, 1536),
+  Box(1537, 1537),
+  Box(1538, 1538),
+  Box(1539, 1539),
+  Box(1540, 1540),
+  Box(1541, 1541),
+  Box(1542, 1542),
+  Box(1543, 1543),
+  Box(1544, 1544),
+  Box(1545, 1545),
+  Box(1546, 1546),
+  Box(1547, 1547),
+  Box(1548, 1548),
+  Box(1549, 1549),
+  Box(1550, 1550),
+  Box(1551, 1551),
+  Box(1552, 1552),
+  Box(1553, 1553),
+  Box(1554, 1554),
+  Box(1555, 1555),
+  Box(1556, 1556),
+  Box(1557, 1557),
+  Box(1558, 1558),
+  Box(1559, 1559),
+  Box(1560, 1560),
+  Box(1561, 1561),
+  Box(1562, 1562),
+  Box(1563, 1563),
+  Box(1564, 1564),
+  Box(1565, 1565),
+  Box(1566, 1566),
+  Box(1567, 1567),
+  Box(1568, 1568),
+  Box(1569, 1569),
+  Box(1570, 1570),
+  Box(1571, 1571),
+  Box(1572, 1572),
+  Box(1573, 1573),
+  Box(1574, 1574),
+  Box(1575, 1575),
+  Box(1576, 1576),
+  Box(1577, 1577),
+  Box(1578, 1578),
+  Box(1579, 1579),
+  Box(1580, 1580),
+  Box(1581, 1581),
+  Box(1582, 1582),
+  Box(1583, 1583),
+  Box(1584, 1584),
+  Box(1585, 1585),
+  Box(1586, 1586),
+  Box(1587, 1587),
+  Box(1588, 1588),
+  Box(1589, 1589),
+  Box(1590, 1590),
+  Box(1591, 1591),
+  Box(1592, 1592),
+  Box(1593, 1593),
+  Box(1594, 1594),
+  Box(1595, 1595),
+  Box(1596, 1596),
+  Box(1597, 1597),
+  Box(1598, 1598),
+  Box(1599, 1599),
+  Box(1600, 1600),
+  Box(1601, 1601),
+  Box(1602, 1602),
+  Box(1603, 1603),
+  Box(1604, 1604),
+  Box(1605, 1605),
+  Box(1606, 1606),
+  Box(1607, 1607),
+  Box(1608, 1608),
+  Box(1609, 1609),
+  Box(1610, 1610),
+  Box(1611, 1611),
+  Box(1612, 1612),
+  Box(1613, 1613),
+  Box(1614, 1614),
+  Box(1615, 1615),
+  Box(1616, 1616),
+  Box(1617, 1617),
+  Box(1618, 1618),
+  Box(1619, 1619),
+  Box(1620, 1620),
+  Box(1621, 1621),
+  Box(1622, 1622),
+  Box(1623, 1623),
+  Box(1624, 1624),
+  Box(1625, 1625),
+  Box(1626, 1626),
+  Box(1627, 1627),
+  Box(1628, 1628),
+  Box(1629, 1629),
+  Box(1630, 1630),
+  Box(1631, 1631),
+  Box(1632, 1632),
+  Box(1633, 1633),
+  Box(1634, 1634),
+  Box(1635, 1635),
+  Box(1636, 1636),
+  Box(1637, 1637),
+  Box(1638, 1638),
+  Box(1639, 1639),
+  Box(1640, 1640),
+  Box(1641, 1641),
+  Box(1642, 1642),
+  Box(1643, 1643),
+  Box(1644, 1644),
+  Box(1645, 1645),
+  Box(1646, 1646),
+  Box(1647, 1647),
+  Box(1648, 1648),
+  Box(1649, 1649),
+  Box(1650, 1650),
+  Box(1651, 1651),
+  Box(1652, 1652),
+  Box(1653, 1653),
+  Box(1654, 1654),
+  Box(1655, 1655),
+  Box(1656, 1656),
+  Box(1657, 1657),
+  Box(1658, 1658),
+  Box(1659, 1659),
+  Box(1660, 1660),
+  Box(1661, 1661),
+  Box(1662, 1662),
+  Box(1663, 1663),
+  Box(1664, 1664),
+  Box(1665, 1665),
+  Box(1666, 1666),
+  Box(1667, 1667),
+  Box(1668, 1668),
+  Box(1669, 1669),
+  Box(1670, 1670),
+  Box(1671, 1671),
+  Box(1672, 1672),
+  Box(1673, 1673),
+  Box(1674, 1674),
+  Box(1675, 1675),
+  Box(1676, 1676),
+  Box(1677, 1677),
+  Box(1678, 1678),
+  Box(1679, 1679),
+  Box(1680, 1680),
+  Box(1681, 1681),
+  Box(1682, 1682),
+  Box(1683, 1683),
+  Box(1684, 1684),
+  Box(1685, 1685),
+  Box(1686, 1686),
+  Box(1687, 1687),
+  Box(1688, 1688),
+  Box(1689, 1689),
+  Box(1690, 1690),
+  Box(1691, 1691),
+  Box(1692, 1692),
+  Box(1693, 1693),
+  Box(1694, 1694),
+  Box(1695, 1695),
+  Box(1696, 1696),
+  Box(1697, 1697),
+  Box(1698, 1698),
+  Box(1699, 1699),
+  Box(1700, 1700),
+  Box(1701, 1701),
+  Box(1702, 1702),
+  Box(1703, 1703),
+  Box(1704, 1704),
+  Box(1705, 1705),
+  Box(1706, 1706),
+  Box(1707, 1707),
+  Box(1708, 1708),
+  Box(1709, 1709),
+  Box(1710, 1710),
+  Box(1711, 1711),
+  Box(1712, 1712),
+  Box(1713, 1713),
+  Box(1714, 1714),
+  Box(1715, 1715),
+  Box(1716, 1716),
+  Box(1717, 1717),
+  Box(1718, 1718),
+  Box(1719, 1719),
+  Box(1720, 1720),
+  Box(1721, 1721),
+  Box(1722, 1722),
+  Box(1723, 1723),
+  Box(1724, 1724),
+  Box(1725, 1725),
+  Box(1726, 1726),
+  Box(1727, 1727),
+  Box(1728, 1728),
+  Box(1729, 1729),
+  Box(1730, 1730),
+  Box(1731, 1731),
+  Box(1732, 1732),
+  Box(1733, 1733),
+  Box(1734, 1734),
+  Box(1735, 1735),
+  Box(1736, 1736),
+  Box(1737, 1737),
+  Box(1738, 1738),
+  Box(1739, 1739),
+  Box(1740, 1740),
+  Box(1741, 1741),
+  Box(1742, 1742),
+  Box(1743, 1743),
+  Box(1744, 1744),
+  Box(1745, 1745),
+  Box(1746, 1746),
+  Box(1747, 1747),
+  Box(1748, 1748),
+  Box(1749, 1749),
+  Box(1750, 1750),
+  Box(1751, 1751),
+  Box(1752, 1752),
+  Box(1753, 1753),
+  Box(1754, 1754),
+  Box(1755, 1755),
+  Box(1756, 1756),
+  Box(1757, 1757),
+  Box(1758, 1758),
+  Box(1759, 1759),
+  Box(1760, 1760),
+  Box(1761, 1761),
+  Box(1762, 1762),
+  Box(1763, 1763),
+  Box(1764, 1764),
+  Box(1765, 1765),
+  Box(1766, 1766),
+  Box(1767, 1767),
+  Box(1768, 1768),
+  Box(1769, 1769),
+  Box(1770, 1770),
+  Box(1771, 1771),
+  Box(1772, 1772),
+  Box(1773, 1773),
+  Box(1774, 1774),
+  Box(1775, 1775),
+  Box(1776, 1776),
+  Box(1777, 1777),
+  Box(1778, 1778),
+  Box(1779, 1779),
+  Box(1780, 1780),
+  Box(1781, 1781),
+  Box(1782, 1782),
+  Box(1783, 1783),
+  Box(1784, 1784),
+  Box(1785, 1785),
+  Box(1786, 1786),
+  Box(1787, 1787),
+  Box(1788, 1788),
+  Box(1789, 1789),
+  Box(1790, 1790),
+  Box(1791, 1791),
+  Box(1792, 1792),
+  Box(1793, 1793),
+  Box(1794, 1794),
+  Box(1795, 1795),
+  Box(1796, 1796),
+  Box(1797, 1797),
+  Box(1798, 1798),
+  Box(1799, 1799),
+  Box(1800, 1800),
+  Box(1801, 1801),
+  Box(1802, 1802),
+  Box(1803, 1803),
+  Box(1804, 1804),
+  Box(1805, 1805),
+  Box(1806, 1806),
+  Box(1807, 1807),
+  Box(1808, 1808),
+  Box(1809, 1809),
+  Box(1810, 1810),
+  Box(1811, 1811),
+  Box(1812, 1812),
+  Box(1813, 1813),
+  Box(1814, 1814),
+  Box(1815, 1815),
+  Box(1816, 1816),
+  Box(1817, 1817),
+  Box(1818, 1818),
+  Box(1819, 1819),
+  Box(1820, 1820),
+  Box(1821, 1821),
+  Box(1822, 1822),
+  Box(1823, 1823),
+  Box(1824, 1824),
+  Box(1825, 1825),
+  Box(1826, 1826),
+  Box(1827, 1827),
+  Box(1828, 1828),
+  Box(1829, 1829),
+  Box(1830, 1830),
+  Box(1831, 1831),
+  Box(1832, 1832),
+  Box(1833, 1833),
+  Box(1834, 1834),
+  Box(1835, 1835),
+  Box(1836, 1836),
+  Box(1837, 1837),
+  Box(1838, 1838),
+  Box(1839, 1839),
+  Box(1840, 1840),
+  Box(1841, 1841),
+  Box(1842, 1842),
+  Box(1843, 1843),
+  Box(1844, 1844),
+  Box(1845, 1845),
+  Box(1846, 1846),
+  Box(1847, 1847),
+  Box(1848, 1848),
+  Box(1849, 1849),
+  Box(1850, 1850),
+  Box(1851, 1851),
+  Box(1852, 1852),
+  Box(1853, 1853),
+  Box(1854, 1854),
+  Box(1855, 1855),
+  Box(1856, 1856),
+  Box(1857, 1857),
+  Box(1858, 1858),
+  Box(1859, 1859),
+  Box(1860, 1860),
+  Box(1861, 1861),
+  Box(1862, 1862),
+  Box(1863, 1863),
+  Box(1864, 1864),
+  Box(1865, 1865),
+  Box(1866, 1866),
+  Box(1867, 1867),
+  Box(1868, 1868),
+  Box(1869, 1869),
+  Box(1870, 1870),
+  Box(1871, 1871),
+  Box(1872, 1872),
+  Box(1873, 1873),
+  Box(1874, 1874),
+  Box(1875, 1875),
+  Box(1876, 1876),
+  Box(1877, 1877),
+  Box(1878, 1878),
+  Box(1879, 1879),
+  Box(1880, 1880),
+  Box(1881, 1881),
+  Box(1882, 1882),
+  Box(1883, 1883),
+  Box(1884, 1884),
+  Box(1885, 1885),
+  Box(1886, 1886),
+  Box(1887, 1887),
+  Box(1888, 1888),
+  Box(1889, 1889),
+  Box(1890, 1890),
+  Box(1891, 1891),
+  Box(1892, 1892),
+  Box(1893, 1893),
+  Box(1894, 1894),
+  Box(1895, 1895),
+  Box(1896, 1896),
+  Box(1897, 1897),
+  Box(1898, 1898),
+  Box(1899, 1899),
+  Box(1900, 1900),
+  Box(1901, 1901),
+  Box(1902, 1902),
+  Box(1903, 1903),
+  Box(1904, 1904),
+  Box(1905, 1905),
+  Box(1906, 1906),
+  Box(1907, 1907),
+  Box(1908, 1908),
+  Box(1909, 1909),
+  Box(1910, 1910),
+  Box(1911, 1911),
+  Box(1912, 1912),
+  Box(1913, 1913),
+  Box(1914, 1914),
+  Box(1915, 1915),
+  Box(1916, 1916),
+  Box(1917, 1917),
+  Box(1918, 1918),
+  Box(1919, 1919),
+  Box(1920, 1920),
+  Box(1921, 1921),
+  Box(1922, 1922),
+  Box(1923, 1923),
+  Box(1924, 1924),
+  Box(1925, 1925),
+  Box(1926, 1926),
+  Box(1927, 1927),
+  Box(1928, 1928),
+  Box(1929, 1929),
+  Box(1930, 1930),
+  Box(1931, 1931),
+  Box(1932, 1932),
+  Box(1933, 1933),
+  Box(1934, 1934),
+  Box(1935, 1935),
+  Box(1936, 1936),
+  Box(1937, 1937),
+  Box(1938, 1938),
+  Box(1939, 1939),
+  Box(1940, 1940),
+  Box(1941, 1941),
+  Box(1942, 1942),
+  Box(1943, 1943),
+  Box(1944, 1944),
+  Box(1945, 1945),
+  Box(1946, 1946),
+  Box(1947, 1947),
+  Box(1948, 1948),
+  Box(1949, 1949),
+  Box(1950, 1950),
+  Box(1951, 1951),
+  Box(1952, 1952),
+  Box(1953, 1953),
+  Box(1954, 1954),
+  Box(1955, 1955),
+  Box(1956, 1956),
+  Box(1957, 1957),
+  Box(1958, 1958),
+  Box(1959, 1959),
+  Box(1960, 1960),
+  Box(1961, 1961),
+  Box(1962, 1962),
+  Box(1963, 1963),
+  Box(1964, 1964),
+  Box(1965, 1965),
+  Box(1966, 1966),
+  Box(1967, 1967),
+  Box(1968, 1968),
+  Box(1969, 1969),
+  Box(1970, 1970),
+  Box(1971, 1971),
+  Box(1972, 1972),
+  Box(1973, 1973),
+  Box(1974, 1974),
+  Box(1975, 1975),
+  Box(1976, 1976),
+  Box(1977, 1977),
+  Box(1978, 1978),
+  Box(1979, 1979),
+  Box(1980, 1980),
+  Box(1981, 1981),
+  Box(1982, 1982),
+  Box(1983, 1983),
+  Box(1984, 1984),
+  Box(1985, 1985),
+  Box(1986, 1986),
+  Box(1987, 1987),
+  Box(1988, 1988),
+  Box(1989, 1989),
+  Box(1990, 1990),
+  Box(1991, 1991),
+  Box(1992, 1992),
+  Box(1993, 1993),
+  Box(1994, 1994),
+  Box(1995, 1995),
+  Box(1996, 1996),
+  Box(1997, 1997),
+  Box(1998, 1998),
+  Box(1999, 1999),
+  Box(2000, 2000),
+  Box(2001, 2001),
+  Box(2002, 2002),
+  Box(2003, 2003),
+  Box(2004, 2004),
+  Box(2005, 2005),
+  Box(2006, 2006),
+  Box(2007, 2007),
+  Box(2008, 2008),
+  Box(2009, 2009),
+  Box(2010, 2010),
+  Box(2011, 2011),
+  Box(2012, 2012),
+  Box(2013, 2013),
+  Box(2014, 2014),
+  Box(2015, 2015),
+  Box(2016, 2016),
+  Box(2017, 2017),
+  Box(2018, 2018),
+  Box(2019, 2019),
+  Box(2020, 2020),
+  Box(2021, 2021),
+  Box(2022, 2022),
+  Box(2023, 2023),
+  Box(2024, 2024),
+  Box(2025, 2025),
+  Box(2026, 2026),
+  Box(2027, 2027),
+  Box(2028, 2028),
+  Box(2029, 2029),
+  Box(2030, 2030),
+  Box(2031, 2031),
+  Box(2032, 2032),
+  Box(2033, 2033),
+  Box(2034, 2034),
+  Box(2035, 2035),
+  Box(2036, 2036),
+  Box(2037, 2037),
+  Box(2038, 2038),
+  Box(2039, 2039),
+  Box(2040, 2040),
+  Box(2041, 2041),
+  Box(2042, 2042),
+  Box(2043, 2043),
+  Box(2044, 2044),
+  Box(2045, 2045),
+  Box(2046, 2046),
+  Box(2047, 2047),
+  Box(2048, 2048),
+  Box(2049, 2049),
+  Box(2050, 2050),
+  Box(2051, 2051),
+  Box(2052, 2052),
+  Box(2053, 2053),
+  Box(2054, 2054),
+  Box(2055, 2055),
+  Box(2056, 2056),
+  Box(2057, 2057),
+  Box(2058, 2058),
+  Box(2059, 2059),
+  Box(2060, 2060),
+  Box(2061, 2061),
+  Box(2062, 2062),
+  Box(2063, 2063),
+  Box(2064, 2064),
+  Box(2065, 2065),
+  Box(2066, 2066),
+  Box(2067, 2067),
+  Box(2068, 2068),
+  Box(2069, 2069),
+  Box(2070, 2070),
+  Box(2071, 2071),
+  Box(2072, 2072),
+  Box(2073, 2073),
+  Box(2074, 2074),
+  Box(2075, 2075),
+  Box(2076, 2076),
+  Box(2077, 2077),
+  Box(2078, 2078),
+  Box(2079, 2079),
+  Box(2080, 2080),
+  Box(2081, 2081),
+  Box(2082, 2082),
+  Box(2083, 2083),
+  Box(2084, 2084),
+  Box(2085, 2085),
+  Box(2086, 2086),
+  Box(2087, 2087),
+  Box(2088, 2088),
+  Box(2089, 2089),
+  Box(2090, 2090),
+  Box(2091, 2091),
+  Box(2092, 2092),
+  Box(2093, 2093),
+  Box(2094, 2094),
+  Box(2095, 2095),
+  Box(2096, 2096),
+  Box(2097, 2097),
+  Box(2098, 2098),
+  Box(2099, 2099),
+  Box(2100, 2100),
+  Box(2101, 2101),
+  Box(2102, 2102),
+  Box(2103, 2103),
+  Box(2104, 2104),
+  Box(2105, 2105),
+  Box(2106, 2106),
+  Box(2107, 2107),
+  Box(2108, 2108),
+  Box(2109, 2109),
+  Box(2110, 2110),
+  Box(2111, 2111),
+  Box(2112, 2112),
+  Box(2113, 2113),
+  Box(2114, 2114),
+  Box(2115, 2115),
+  Box(2116, 2116),
+  Box(2117, 2117),
+  Box(2118, 2118),
+  Box(2119, 2119),
+  Box(2120, 2120),
+  Box(2121, 2121),
+  Box(2122, 2122),
+  Box(2123, 2123),
+  Box(2124, 2124),
+  Box(2125, 2125),
+  Box(2126, 2126),
+  Box(2127, 2127),
+  Box(2128, 2128),
+  Box(2129, 2129),
+  Box(2130, 2130),
+  Box(2131, 2131),
+  Box(2132, 2132),
+  Box(2133, 2133),
+  Box(2134, 2134),
+  Box(2135, 2135),
+  Box(2136, 2136),
+  Box(2137, 2137),
+  Box(2138, 2138),
+  Box(2139, 2139),
+  Box(2140, 2140),
+  Box(2141, 2141),
+  Box(2142, 2142),
+  Box(2143, 2143),
+  Box(2144, 2144),
+  Box(2145, 2145),
+  Box(2146, 2146),
+  Box(2147, 2147),
+  Box(2148, 2148),
+  Box(2149, 2149),
+  Box(2150, 2150),
+  Box(2151, 2151),
+  Box(2152, 2152),
+  Box(2153, 2153),
+  Box(2154, 2154),
+  Box(2155, 2155),
+  Box(2156, 2156),
+  Box(2157, 2157),
+  Box(2158, 2158),
+  Box(2159, 2159),
+  Box(2160, 2160),
+  Box(2161, 2161),
+  Box(2162, 2162),
+  Box(2163, 2163),
+  Box(2164, 2164),
+  Box(2165, 2165),
+  Box(2166, 2166),
+  Box(2167, 2167),
+  Box(2168, 2168),
+  Box(2169, 2169),
+  Box(2170, 2170),
+  Box(2171, 2171),
+  Box(2172, 2172),
+  Box(2173, 2173),
+  Box(2174, 2174),
+  Box(2175, 2175),
+  Box(2176, 2176),
+  Box(2177, 2177),
+  Box(2178, 2178),
+  Box(2179, 2179),
+  Box(2180, 2180),
+  Box(2181, 2181),
+  Box(2182, 2182),
+  Box(2183, 2183),
+  Box(2184, 2184),
+  Box(2185, 2185),
+  Box(2186, 2186),
+  Box(2187, 2187),
+  Box(2188, 2188),
+  Box(2189, 2189),
+  Box(2190, 2190),
+  Box(2191, 2191),
+  Box(2192, 2192),
+  Box(2193, 2193),
+  Box(2194, 2194),
+  Box(2195, 2195),
+  Box(2196, 2196),
+  Box(2197, 2197),
+  Box(2198, 2198),
+  Box(2199, 2199),
+  Box(2200, 2200),
+  Box(2201, 2201),
+  Box(2202, 2202),
+  Box(2203, 2203),
+  Box(2204, 2204),
+  Box(2205, 2205),
+  Box(2206, 2206),
+  Box(2207, 2207),
+  Box(2208, 2208),
+  Box(2209, 2209),
+  Box(2210, 2210),
+  Box(2211, 2211),
+  Box(2212, 2212),
+  Box(2213, 2213),
+  Box(2214, 2214),
+  Box(2215, 2215),
+  Box(2216, 2216),
+  Box(2217, 2217),
+  Box(2218, 2218),
+  Box(2219, 2219),
+  Box(2220, 2220),
+  Box(2221, 2221),
+  Box(2222, 2222),
+  Box(2223, 2223),
+  Box(2224, 2224),
+  Box(2225, 2225),
+  Box(2226, 2226),
+  Box(2227, 2227),
+  Box(2228, 2228),
+  Box(2229, 2229),
+  Box(2230, 2230),
+  Box(2231, 2231),
+  Box(2232, 2232),
+  Box(2233, 2233),
+  Box(2234, 2234),
+  Box(2235, 2235),
+  Box(2236, 2236),
+  Box(2237, 2237),
+  Box(2238, 2238),
+  Box(2239, 2239),
+  Box(2240, 2240),
+  Box(2241, 2241),
+  Box(2242, 2242),
+  Box(2243, 2243),
+  Box(2244, 2244),
+  Box(2245, 2245),
+  Box(2246, 2246),
+  Box(2247, 2247),
+  Box(2248, 2248),
+  Box(2249, 2249),
+  Box(2250, 2250),
+  Box(2251, 2251),
+  Box(2252, 2252),
+  Box(2253, 2253),
+  Box(2254, 2254),
+  Box(2255, 2255),
+  Box(2256, 2256),
+  Box(2257, 2257),
+  Box(2258, 2258),
+  Box(2259, 2259),
+  Box(2260, 2260),
+  Box(2261, 2261),
+  Box(2262, 2262),
+  Box(2263, 2263),
+  Box(2264, 2264),
+  Box(2265, 2265),
+  Box(2266, 2266),
+  Box(2267, 2267),
+  Box(2268, 2268),
+  Box(2269, 2269),
+  Box(2270, 2270),
+  Box(2271, 2271),
+  Box(2272, 2272),
+  Box(2273, 2273),
+  Box(2274, 2274),
+  Box(2275, 2275),
+  Box(2276, 2276),
+  Box(2277, 2277),
+  Box(2278, 2278),
+  Box(2279, 2279),
+  Box(2280, 2280),
+  Box(2281, 2281),
+  Box(2282, 2282),
+  Box(2283, 2283),
+  Box(2284, 2284),
+  Box(2285, 2285),
+  Box(2286, 2286),
+  Box(2287, 2287),
+  Box(2288, 2288),
+  Box(2289, 2289),
+  Box(2290, 2290),
+  Box(2291, 2291),
+  Box(2292, 2292),
+  Box(2293, 2293),
+  Box(2294, 2294),
+  Box(2295, 2295),
+  Box(2296, 2296),
+  Box(2297, 2297),
+  Box(2298, 2298),
+  Box(2299, 2299),
+  Box(2300, 2300),
+  Box(2301, 2301),
+  Box(2302, 2302),
+  Box(2303, 2303),
+  Box(2304, 2304),
+  Box(2305, 2305),
+  Box(2306, 2306),
+  Box(2307, 2307),
+  Box(2308, 2308),
+  Box(2309, 2309),
+  Box(2310, 2310),
+  Box(2311, 2311),
+  Box(2312, 2312),
+  Box(2313, 2313),
+  Box(2314, 2314),
+  Box(2315, 2315),
+  Box(2316, 2316),
+  Box(2317, 2317),
+  Box(2318, 2318),
+  Box(2319, 2319),
+  Box(2320, 2320),
+  Box(2321, 2321),
+  Box(2322, 2322),
+  Box(2323, 2323),
+  Box(2324, 2324),
+  Box(2325, 2325),
+  Box(2326, 2326),
+  Box(2327, 2327),
+  Box(2328, 2328),
+  Box(2329, 2329),
+  Box(2330, 2330),
+  Box(2331, 2331),
+  Box(2332, 2332),
+  Box(2333, 2333),
+  Box(2334, 2334),
+  Box(2335, 2335),
+  Box(2336, 2336),
+  Box(2337, 2337),
+  Box(2338, 2338),
+  Box(2339, 2339),
+  Box(2340, 2340),
+  Box(2341, 2341),
+  Box(2342, 2342),
+  Box(2343, 2343),
+  Box(2344, 2344),
+  Box(2345, 2345),
+  Box(2346, 2346),
+  Box(2347, 2347),
+  Box(2348, 2348),
+  Box(2349, 2349),
+  Box(2350, 2350),
+  Box(2351, 2351),
+  Box(2352, 2352),
+  Box(2353, 2353),
+  Box(2354, 2354),
+  Box(2355, 2355),
+  Box(2356, 2356),
+  Box(2357, 2357),
+  Box(2358, 2358),
+  Box(2359, 2359),
+  Box(2360, 2360),
+  Box(2361, 2361),
+  Box(2362, 2362),
+  Box(2363, 2363),
+  Box(2364, 2364),
+  Box(2365, 2365),
+  Box(2366, 2366),
+  Box(2367, 2367),
+  Box(2368, 2368),
+  Box(2369, 2369),
+  Box(2370, 2370),
+  Box(2371, 2371),
+  Box(2372, 2372),
+  Box(2373, 2373),
+  Box(2374, 2374),
+  Box(2375, 2375),
+  Box(2376, 2376),
+  Box(2377, 2377),
+  Box(2378, 2378),
+  Box(2379, 2379),
+  Box(2380, 2380),
+  Box(2381, 2381),
+  Box(2382, 2382),
+  Box(2383, 2383),
+  Box(2384, 2384),
+  Box(2385, 2385),
+  Box(2386, 2386),
+  Box(2387, 2387),
+  Box(2388, 2388),
+  Box(2389, 2389),
+  Box(2390, 2390),
+  Box(2391, 2391),
+  Box(2392, 2392),
+  Box(2393, 2393),
+  Box(2394, 2394),
+  Box(2395, 2395),
+  Box(2396, 2396),
+  Box(2397, 2397),
+  Box(2398, 2398),
+  Box(2399, 2399),
+  Box(2400, 2400),
+  Box(2401, 2401),
+  Box(2402, 2402),
+  Box(2403, 2403),
+  Box(2404, 2404),
+  Box(2405, 2405),
+  Box(2406, 2406),
+  Box(2407, 2407),
+  Box(2408, 2408),
+  Box(2409, 2409),
+  Box(2410, 2410),
+  Box(2411, 2411),
+  Box(2412, 2412),
+  Box(2413, 2413),
+  Box(2414, 2414),
+  Box(2415, 2415),
+  Box(2416, 2416),
+  Box(2417, 2417),
+  Box(2418, 2418),
+  Box(2419, 2419),
+  Box(2420, 2420),
+  Box(2421, 2421),
+  Box(2422, 2422),
+  Box(2423, 2423),
+  Box(2424, 2424),
+  Box(2425, 2425),
+  Box(2426, 2426),
+  Box(2427, 2427),
+  Box(2428, 2428),
+  Box(2429, 2429),
+  Box(2430, 2430),
+  Box(2431, 2431),
+  Box(2432, 2432),
+  Box(2433, 2433),
+  Box(2434, 2434),
+  Box(2435, 2435),
+  Box(2436, 2436),
+  Box(2437, 2437),
+  Box(2438, 2438),
+  Box(2439, 2439),
+  Box(2440, 2440),
+  Box(2441, 2441),
+  Box(2442, 2442),
+  Box(2443, 2443),
+  Box(2444, 2444),
+  Box(2445, 2445),
+  Box(2446, 2446),
+  Box(2447, 2447),
+  Box(2448, 2448),
+  Box(2449, 2449),
+  Box(2450, 2450),
+  Box(2451, 2451),
+  Box(2452, 2452),
+  Box(2453, 2453),
+  Box(2454, 2454),
+  Box(2455, 2455),
+  Box(2456, 2456),
+  Box(2457, 2457),
+  Box(2458, 2458),
+  Box(2459, 2459),
+  Box(2460, 2460),
+  Box(2461, 2461),
+  Box(2462, 2462),
+  Box(2463, 2463),
+  Box(2464, 2464),
+  Box(2465, 2465),
+  Box(2466, 2466),
+  Box(2467, 2467),
+  Box(2468, 2468),
+  Box(2469, 2469),
+  Box(2470, 2470),
+  Box(2471, 2471),
+  Box(2472, 2472),
+  Box(2473, 2473),
+  Box(2474, 2474),
+  Box(2475, 2475),
+  Box(2476, 2476),
+  Box(2477, 2477),
+  Box(2478, 2478),
+  Box(2479, 2479),
+  Box(2480, 2480),
+  Box(2481, 2481),
+  Box(2482, 2482),
+  Box(2483, 2483),
+  Box(2484, 2484),
+  Box(2485, 2485),
+  Box(2486, 2486),
+  Box(2487, 2487),
+  Box(2488, 2488),
+  Box(2489, 2489),
+  Box(2490, 2490),
+  Box(2491, 2491),
+  Box(2492, 2492),
+  Box(2493, 2493),
+  Box(2494, 2494),
+  Box(2495, 2495),
+  Box(2496, 2496),
+  Box(2497, 2497),
+  Box(2498, 2498),
+  Box(2499, 2499),
+  Box(2500, 2500),
+  Box(2501, 2501),
+  Box(2502, 2502),
+  Box(2503, 2503),
+  Box(2504, 2504),
+  Box(2505, 2505),
+  Box(2506, 2506),
+  Box(2507, 2507),
+  Box(2508, 2508),
+  Box(2509, 2509),
+  Box(2510, 2510),
+  Box(2511, 2511),
+  Box(2512, 2512),
+  Box(2513, 2513),
+  Box(2514, 2514),
+  Box(2515, 2515),
+  Box(2516, 2516),
+  Box(2517, 2517),
+  Box(2518, 2518),
+  Box(2519, 2519),
+  Box(2520, 2520),
+  Box(2521, 2521),
+  Box(2522, 2522),
+  Box(2523, 2523),
+  Box(2524, 2524),
+  Box(2525, 2525),
+  Box(2526, 2526),
+  Box(2527, 2527),
+  Box(2528, 2528),
+  Box(2529, 2529),
+  Box(2530, 2530),
+  Box(2531, 2531),
+  Box(2532, 2532),
+  Box(2533, 2533),
+  Box(2534, 2534),
+  Box(2535, 2535),
+  Box(2536, 2536),
+  Box(2537, 2537),
+  Box(2538, 2538),
+  Box(2539, 2539),
+  Box(2540, 2540),
+  Box(2541, 2541),
+  Box(2542, 2542),
+  Box(2543, 2543),
+  Box(2544, 2544),
+  Box(2545, 2545),
+  Box(2546, 2546),
+  Box(2547, 2547),
+  Box(2548, 2548),
+  Box(2549, 2549),
+  Box(2550, 2550),
+  Box(2551, 2551),
+  Box(2552, 2552),
+  Box(2553, 2553),
+  Box(2554, 2554),
+  Box(2555, 2555),
+  Box(2556, 2556),
+  Box(2557, 2557),
+  Box(2558, 2558),
+  Box(2559, 2559),
+  Box(2560, 2560),
+  Box(2561, 2561),
+  Box(2562, 2562),
+  Box(2563, 2563),
+  Box(2564, 2564),
+  Box(2565, 2565),
+  Box(2566, 2566),
+  Box(2567, 2567),
+  Box(2568, 2568),
+  Box(2569, 2569),
+  Box(2570, 2570),
+  Box(2571, 2571),
+  Box(2572, 2572),
+  Box(2573, 2573),
+  Box(2574, 2574),
+  Box(2575, 2575),
+  Box(2576, 2576),
+  Box(2577, 2577),
+  Box(2578, 2578),
+  Box(2579, 2579),
+  Box(2580, 2580),
+  Box(2581, 2581),
+  Box(2582, 2582),
+  Box(2583, 2583),
+  Box(2584, 2584),
+  Box(2585, 2585),
+  Box(2586, 2586),
+  Box(2587, 2587),
+  Box(2588, 2588),
+  Box(2589, 2589),
+  Box(2590, 2590),
+  Box(2591, 2591),
+  Box(2592, 2592),
+  Box(2593, 2593),
+  Box(2594, 2594),
+  Box(2595, 2595),
+  Box(2596, 2596),
+  Box(2597, 2597),
+  Box(2598, 2598),
+  Box(2599, 2599),
+  Box(2600, 2600),
+  Box(2601, 2601),
+  Box(2602, 2602),
+  Box(2603, 2603),
+  Box(2604, 2604),
+  Box(2605, 2605),
+  Box(2606, 2606),
+  Box(2607, 2607),
+  Box(2608, 2608),
+  Box(2609, 2609),
+  Box(2610, 2610),
+  Box(2611, 2611),
+  Box(2612, 2612),
+  Box(2613, 2613),
+  Box(2614, 2614),
+  Box(2615, 2615),
+  Box(2616, 2616),
+  Box(2617, 2617),
+  Box(2618, 2618),
+  Box(2619, 2619),
+  Box(2620, 2620),
+  Box(2621, 2621),
+  Box(2622, 2622),
+  Box(2623, 2623),
+  Box(2624, 2624),
+  Box(2625, 2625),
+  Box(2626, 2626),
+  Box(2627, 2627),
+  Box(2628, 2628),
+  Box(2629, 2629),
+  Box(2630, 2630),
+  Box(2631, 2631),
+  Box(2632, 2632),
+  Box(2633, 2633),
+  Box(2634, 2634),
+  Box(2635, 2635),
+  Box(2636, 2636),
+  Box(2637, 2637),
+  Box(2638, 2638),
+  Box(2639, 2639),
+  Box(2640, 2640),
+  Box(2641, 2641),
+  Box(2642, 2642),
+  Box(2643, 2643),
+  Box(2644, 2644),
+  Box(2645, 2645),
+  Box(2646, 2646),
+  Box(2647, 2647),
+  Box(2648, 2648),
+  Box(2649, 2649),
+  Box(2650, 2650),
+  Box(2651, 2651),
+  Box(2652, 2652),
+  Box(2653, 2653),
+  Box(2654, 2654),
+  Box(2655, 2655),
+  Box(2656, 2656),
+  Box(2657, 2657),
+  Box(2658, 2658),
+  Box(2659, 2659),
+  Box(2660, 2660),
+  Box(2661, 2661),
+  Box(2662, 2662),
+  Box(2663, 2663),
+  Box(2664, 2664),
+  Box(2665, 2665),
+  Box(2666, 2666),
+  Box(2667, 2667),
+  Box(2668, 2668),
+  Box(2669, 2669),
+  Box(2670, 2670),
+  Box(2671, 2671),
+  Box(2672, 2672),
+  Box(2673, 2673),
+  Box(2674, 2674),
+  Box(2675, 2675),
+  Box(2676, 2676),
+  Box(2677, 2677),
+  Box(2678, 2678),
+  Box(2679, 2679),
+  Box(2680, 2680),
+  Box(2681, 2681),
+  Box(2682, 2682),
+  Box(2683, 2683),
+  Box(2684, 2684),
+  Box(2685, 2685),
+  Box(2686, 2686),
+  Box(2687, 2687),
+  Box(2688, 2688),
+  Box(2689, 2689),
+  Box(2690, 2690),
+  Box(2691, 2691),
+  Box(2692, 2692),
+  Box(2693, 2693),
+  Box(2694, 2694),
+  Box(2695, 2695),
+  Box(2696, 2696),
+  Box(2697, 2697),
+  Box(2698, 2698),
+  Box(2699, 2699),
+  Box(2700, 2700),
+  Box(2701, 2701),
+  Box(2702, 2702),
+  Box(2703, 2703),
+  Box(2704, 2704),
+  Box(2705, 2705),
+  Box(2706, 2706),
+  Box(2707, 2707),
+  Box(2708, 2708),
+  Box(2709, 2709),
+  Box(2710, 2710),
+  Box(2711, 2711),
+  Box(2712, 2712),
+  Box(2713, 2713),
+  Box(2714, 2714),
+  Box(2715, 2715),
+  Box(2716, 2716),
+  Box(2717, 2717),
+  Box(2718, 2718),
+  Box(2719, 2719),
+  Box(2720, 2720),
+  Box(2721, 2721),
+  Box(2722, 2722),
+  Box(2723, 2723),
+  Box(2724, 2724),
+  Box(2725, 2725),
+  Box(2726, 2726),
+  Box(2727, 2727),
+  Box(2728, 2728),
+  Box(2729, 2729),
+  Box(2730, 2730),
+  Box(2731, 2731),
+  Box(2732, 2732),
+  Box(2733, 2733),
+  Box(2734, 2734),
+  Box(2735, 2735),
+  Box(2736, 2736),
+  Box(2737, 2737),
+  Box(2738, 2738),
+  Box(2739, 2739),
+  Box(2740, 2740),
+  Box(2741, 2741),
+  Box(2742, 2742),
+  Box(2743, 2743),
+  Box(2744, 2744),
+  Box(2745, 2745),
+  Box(2746, 2746),
+  Box(2747, 2747),
+  Box(2748, 2748),
+  Box(2749, 2749),
+  Box(2750, 2750),
+  Box(2751, 2751),
+  Box(2752, 2752),
+  Box(2753, 2753),
+  Box(2754, 2754),
+  Box(2755, 2755),
+  Box(2756, 2756),
+  Box(2757, 2757),
+  Box(2758, 2758),
+  Box(2759, 2759),
+  Box(2760, 2760),
+  Box(2761, 2761),
+  Box(2762, 2762),
+  Box(2763, 2763),
+  Box(2764, 2764),
+  Box(2765, 2765),
+  Box(2766, 2766),
+  Box(2767, 2767),
+  Box(2768, 2768),
+  Box(2769, 2769),
+  Box(2770, 2770),
+  Box(2771, 2771),
+  Box(2772, 2772),
+  Box(2773, 2773),
+  Box(2774, 2774),
+  Box(2775, 2775),
+  Box(2776, 2776),
+  Box(2777, 2777),
+  Box(2778, 2778),
+  Box(2779, 2779),
+  Box(2780, 2780),
+  Box(2781, 2781),
+  Box(2782, 2782),
+  Box(2783, 2783),
+  Box(2784, 2784),
+  Box(2785, 2785),
+  Box(2786, 2786),
+  Box(2787, 2787),
+  Box(2788, 2788),
+  Box(2789, 2789),
+  Box(2790, 2790),
+  Box(2791, 2791),
+  Box(2792, 2792),
+  Box(2793, 2793),
+  Box(2794, 2794),
+  Box(2795, 2795),
+  Box(2796, 2796),
+  Box(2797, 2797),
+  Box(2798, 2798),
+  Box(2799, 2799),
+  Box(2800, 2800),
+  Box(2801, 2801),
+  Box(2802, 2802),
+  Box(2803, 2803),
+  Box(2804, 2804),
+  Box(2805, 2805),
+  Box(2806, 2806),
+  Box(2807, 2807),
+  Box(2808, 2808),
+  Box(2809, 2809),
+  Box(2810, 2810),
+  Box(2811, 2811),
+  Box(2812, 2812),
+  Box(2813, 2813),
+  Box(2814, 2814),
+  Box(2815, 2815),
+  Box(2816, 2816),
+  Box(2817, 2817),
+  Box(2818, 2818),
+  Box(2819, 2819),
+  Box(2820, 2820),
+  Box(2821, 2821),
+  Box(2822, 2822),
+  Box(2823, 2823),
+  Box(2824, 2824),
+  Box(2825, 2825),
+  Box(2826, 2826),
+  Box(2827, 2827),
+  Box(2828, 2828),
+  Box(2829, 2829),
+  Box(2830, 2830),
+  Box(2831, 2831),
+  Box(2832, 2832),
+  Box(2833, 2833),
+  Box(2834, 2834),
+  Box(2835, 2835),
+  Box(2836, 2836),
+  Box(2837, 2837),
+  Box(2838, 2838),
+  Box(2839, 2839),
+  Box(2840, 2840),
+  Box(2841, 2841),
+  Box(2842, 2842),
+  Box(2843, 2843),
+  Box(2844, 2844),
+  Box(2845, 2845),
+  Box(2846, 2846),
+  Box(2847, 2847),
+  Box(2848, 2848),
+  Box(2849, 2849),
+  Box(2850, 2850),
+  Box(2851, 2851),
+  Box(2852, 2852),
+  Box(2853, 2853),
+  Box(2854, 2854),
+  Box(2855, 2855),
+  Box(2856, 2856),
+  Box(2857, 2857),
+  Box(2858, 2858),
+  Box(2859, 2859),
+  Box(2860, 2860),
+  Box(2861, 2861),
+  Box(2862, 2862),
+  Box(2863, 2863),
+  Box(2864, 2864),
+  Box(2865, 2865),
+  Box(2866, 2866),
+  Box(2867, 2867),
+  Box(2868, 2868),
+  Box(2869, 2869),
+  Box(2870, 2870),
+  Box(2871, 2871),
+  Box(2872, 2872),
+  Box(2873, 2873),
+  Box(2874, 2874),
+  Box(2875, 2875),
+  Box(2876, 2876),
+  Box(2877, 2877),
+  Box(2878, 2878),
+  Box(2879, 2879),
+  Box(2880, 2880),
+  Box(2881, 2881),
+  Box(2882, 2882),
+  Box(2883, 2883),
+  Box(2884, 2884),
+  Box(2885, 2885),
+  Box(2886, 2886),
+  Box(2887, 2887),
+  Box(2888, 2888),
+  Box(2889, 2889),
+  Box(2890, 2890),
+  Box(2891, 2891),
+  Box(2892, 2892),
+  Box(2893, 2893),
+  Box(2894, 2894),
+  Box(2895, 2895),
+  Box(2896, 2896),
+  Box(2897, 2897),
+  Box(2898, 2898),
+  Box(2899, 2899),
+  Box(2900, 2900),
+  Box(2901, 2901),
+  Box(2902, 2902),
+  Box(2903, 2903),
+  Box(2904, 2904),
+  Box(2905, 2905),
+  Box(2906, 2906),
+  Box(2907, 2907),
+  Box(2908, 2908),
+  Box(2909, 2909),
+  Box(2910, 2910),
+  Box(2911, 2911),
+  Box(2912, 2912),
+  Box(2913, 2913),
+  Box(2914, 2914),
+  Box(2915, 2915),
+  Box(2916, 2916),
+  Box(2917, 2917),
+  Box(2918, 2918),
+  Box(2919, 2919),
+  Box(2920, 2920),
+  Box(2921, 2921),
+  Box(2922, 2922),
+  Box(2923, 2923),
+  Box(2924, 2924),
+  Box(2925, 2925),
+  Box(2926, 2926),
+  Box(2927, 2927),
+  Box(2928, 2928),
+  Box(2929, 2929),
+  Box(2930, 2930),
+  Box(2931, 2931),
+  Box(2932, 2932),
+  Box(2933, 2933),
+  Box(2934, 2934),
+  Box(2935, 2935),
+  Box(2936, 2936),
+  Box(2937, 2937),
+  Box(2938, 2938),
+  Box(2939, 2939),
+  Box(2940, 2940),
+  Box(2941, 2941),
+  Box(2942, 2942),
+  Box(2943, 2943),
+  Box(2944, 2944),
+  Box(2945, 2945),
+  Box(2946, 2946),
+  Box(2947, 2947),
+  Box(2948, 2948),
+  Box(2949, 2949),
+  Box(2950, 2950),
+  Box(2951, 2951),
+  Box(2952, 2952),
+  Box(2953, 2953),
+  Box(2954, 2954),
+  Box(2955, 2955),
+  Box(2956, 2956),
+  Box(2957, 2957),
+  Box(2958, 2958),
+  Box(2959, 2959),
+  Box(2960, 2960),
+  Box(2961, 2961),
+  Box(2962, 2962),
+  Box(2963, 2963),
+  Box(2964, 2964),
+  Box(2965, 2965),
+  Box(2966, 2966),
+  Box(2967, 2967),
+  Box(2968, 2968),
+  Box(2969, 2969),
+  Box(2970, 2970),
+  Box(2971, 2971),
+  Box(2972, 2972),
+  Box(2973, 2973),
+  Box(2974, 2974),
+  Box(2975, 2975),
+  Box(2976, 2976),
+  Box(2977, 2977),
+  Box(2978, 2978),
+  Box(2979, 2979),
+  Box(2980, 2980),
+  Box(2981, 2981),
+  Box(2982, 2982),
+  Box(2983, 2983),
+  Box(2984, 2984),
+  Box(2985, 2985),
+  Box(2986, 2986),
+  Box(2987, 2987),
+  Box(2988, 2988),
+  Box(2989, 2989),
+  Box(2990, 2990),
+  Box(2991, 2991),
+  Box(2992, 2992),
+  Box(2993, 2993),
+  Box(2994, 2994),
+  Box(2995, 2995),
+  Box(2996, 2996),
+  Box(2997, 2997),
+  Box(2998, 2998),
+  Box(2999, 2999),
+  Box(3000, 3000),
+  Box(3001, 3001),
+  Box(3002, 3002),
+  Box(3003, 3003),
+  Box(3004, 3004),
+  Box(3005, 3005),
+  Box(3006, 3006),
+  Box(3007, 3007),
+  Box(3008, 3008),
+  Box(3009, 3009),
+  Box(3010, 3010),
+  Box(3011, 3011),
+  Box(3012, 3012),
+  Box(3013, 3013),
+  Box(3014, 3014),
+  Box(3015, 3015),
+  Box(3016, 3016),
+  Box(3017, 3017),
+  Box(3018, 3018),
+  Box(3019, 3019),
+  Box(3020, 3020),
+  Box(3021, 3021),
+  Box(3022, 3022),
+  Box(3023, 3023),
+  Box(3024, 3024),
+  Box(3025, 3025),
+  Box(3026, 3026),
+  Box(3027, 3027),
+  Box(3028, 3028),
+  Box(3029, 3029),
+  Box(3030, 3030),
+  Box(3031, 3031),
+  Box(3032, 3032),
+  Box(3033, 3033),
+  Box(3034, 3034),
+  Box(3035, 3035),
+  Box(3036, 3036),
+  Box(3037, 3037),
+  Box(3038, 3038),
+  Box(3039, 3039),
+  Box(3040, 3040),
+  Box(3041, 3041),
+  Box(3042, 3042),
+  Box(3043, 3043),
+  Box(3044, 3044),
+  Box(3045, 3045),
+  Box(3046, 3046),
+  Box(3047, 3047),
+  Box(3048, 3048),
+  Box(3049, 3049),
+  Box(3050, 3050),
+  Box(3051, 3051),
+  Box(3052, 3052),
+  Box(3053, 3053),
+  Box(3054, 3054),
+  Box(3055, 3055),
+  Box(3056, 3056),
+  Box(3057, 3057),
+  Box(3058, 3058),
+  Box(3059, 3059),
+  Box(3060, 3060),
+  Box(3061, 3061),
+  Box(3062, 3062),
+  Box(3063, 3063),
+  Box(3064, 3064),
+  Box(3065, 3065),
+  Box(3066, 3066),
+  Box(3067, 3067),
+  Box(3068, 3068),
+  Box(3069, 3069),
+  Box(3070, 3070),
+  Box(3071, 3071),
+  Box(3072, 3072),
+  Box(3073, 3073),
+  Box(3074, 3074),
+  Box(3075, 3075),
+  Box(3076, 3076),
+  Box(3077, 3077),
+  Box(3078, 3078),
+  Box(3079, 3079),
+  Box(3080, 3080),
+  Box(3081, 3081),
+  Box(3082, 3082),
+  Box(3083, 3083),
+  Box(3084, 3084),
+  Box(3085, 3085),
+  Box(3086, 3086),
+  Box(3087, 3087),
+  Box(3088, 3088),
+  Box(3089, 3089),
+  Box(3090, 3090),
+  Box(3091, 3091),
+  Box(3092, 3092),
+  Box(3093, 3093),
+  Box(3094, 3094),
+  Box(3095, 3095),
+  Box(3096, 3096),
+  Box(3097, 3097),
+  Box(3098, 3098),
+  Box(3099, 3099),
+  Box(3100, 3100),
+  Box(3101, 3101),
+  Box(3102, 3102),
+  Box(3103, 3103),
+  Box(3104, 3104),
+  Box(3105, 3105),
+  Box(3106, 3106),
+  Box(3107, 3107),
+  Box(3108, 3108),
+  Box(3109, 3109),
+  Box(3110, 3110),
+  Box(3111, 3111),
+  Box(3112, 3112),
+  Box(3113, 3113),
+  Box(3114, 3114),
+  Box(3115, 3115),
+  Box(3116, 3116),
+  Box(3117, 3117),
+  Box(3118, 3118),
+  Box(3119, 3119),
+  Box(3120, 3120),
+  Box(3121, 3121),
+  Box(3122, 3122),
+  Box(3123, 3123),
+  Box(3124, 3124),
+  Box(3125, 3125),
+  Box(3126, 3126),
+  Box(3127, 3127),
+  Box(3128, 3128),
+  Box(3129, 3129),
+  Box(3130, 3130),
+  Box(3131, 3131),
+  Box(3132, 3132),
+  Box(3133, 3133),
+  Box(3134, 3134),
+  Box(3135, 3135),
+  Box(3136, 3136),
+  Box(3137, 3137),
+  Box(3138, 3138),
+  Box(3139, 3139),
+  Box(3140, 3140),
+  Box(3141, 3141),
+  Box(3142, 3142),
+  Box(3143, 3143),
+  Box(3144, 3144),
+  Box(3145, 3145),
+  Box(3146, 3146),
+  Box(3147, 3147),
+  Box(3148, 3148),
+  Box(3149, 3149),
+  Box(3150, 3150),
+  Box(3151, 3151),
+  Box(3152, 3152),
+  Box(3153, 3153),
+  Box(3154, 3154),
+  Box(3155, 3155),
+  Box(3156, 3156),
+  Box(3157, 3157),
+  Box(3158, 3158),
+  Box(3159, 3159),
+  Box(3160, 3160),
+  Box(3161, 3161),
+  Box(3162, 3162),
+  Box(3163, 3163),
+  Box(3164, 3164),
+  Box(3165, 3165),
+  Box(3166, 3166),
+  Box(3167, 3167),
+  Box(3168, 3168),
+  Box(3169, 3169),
+  Box(3170, 3170),
+  Box(3171, 3171),
+  Box(3172, 3172),
+  Box(3173, 3173),
+  Box(3174, 3174),
+  Box(3175, 3175),
+  Box(3176, 3176),
+  Box(3177, 3177),
+  Box(3178, 3178),
+  Box(3179, 3179),
+  Box(3180, 3180),
+  Box(3181, 3181),
+  Box(3182, 3182),
+  Box(3183, 3183),
+  Box(3184, 3184),
+  Box(3185, 3185),
+  Box(3186, 3186),
+  Box(3187, 3187),
+  Box(3188, 3188),
+  Box(3189, 3189),
+  Box(3190, 3190),
+  Box(3191, 3191),
+  Box(3192, 3192),
+  Box(3193, 3193),
+  Box(3194, 3194),
+  Box(3195, 3195),
+  Box(3196, 3196),
+  Box(3197, 3197),
+  Box(3198, 3198),
+  Box(3199, 3199),
+  Box(3200, 3200),
+  Box(3201, 3201),
+  Box(3202, 3202),
+  Box(3203, 3203),
+  Box(3204, 3204),
+  Box(3205, 3205),
+  Box(3206, 3206),
+  Box(3207, 3207),
+  Box(3208, 3208),
+  Box(3209, 3209),
+  Box(3210, 3210),
+  Box(3211, 3211),
+  Box(3212, 3212),
+  Box(3213, 3213),
+  Box(3214, 3214),
+  Box(3215, 3215),
+  Box(3216, 3216),
+  Box(3217, 3217),
+  Box(3218, 3218),
+  Box(3219, 3219),
+  Box(3220, 3220),
+  Box(3221, 3221),
+  Box(3222, 3222),
+  Box(3223, 3223),
+  Box(3224, 3224),
+  Box(3225, 3225),
+  Box(3226, 3226),
+  Box(3227, 3227),
+  Box(3228, 3228),
+  Box(3229, 3229),
+  Box(3230, 3230),
+  Box(3231, 3231),
+  Box(3232, 3232),
+  Box(3233, 3233),
+  Box(3234, 3234),
+  Box(3235, 3235),
+  Box(3236, 3236),
+  Box(3237, 3237),
+  Box(3238, 3238),
+  Box(3239, 3239),
+  Box(3240, 3240),
+  Box(3241, 3241),
+  Box(3242, 3242),
+  Box(3243, 3243),
+  Box(3244, 3244),
+  Box(3245, 3245),
+  Box(3246, 3246),
+  Box(3247, 3247),
+  Box(3248, 3248),
+  Box(3249, 3249),
+  Box(3250, 3250),
+  Box(3251, 3251),
+  Box(3252, 3252),
+  Box(3253, 3253),
+  Box(3254, 3254),
+  Box(3255, 3255),
+  Box(3256, 3256),
+  Box(3257, 3257),
+  Box(3258, 3258),
+  Box(3259, 3259),
+  Box(3260, 3260),
+  Box(3261, 3261),
+  Box(3262, 3262),
+  Box(3263, 3263),
+  Box(3264, 3264),
+  Box(3265, 3265),
+  Box(3266, 3266),
+  Box(3267, 3267),
+  Box(3268, 3268),
+  Box(3269, 3269),
+  Box(3270, 3270),
+  Box(3271, 3271),
+  Box(3272, 3272),
+  Box(3273, 3273),
+  Box(3274, 3274),
+  Box(3275, 3275),
+  Box(3276, 3276),
+  Box(3277, 3277),
+  Box(3278, 3278),
+  Box(3279, 3279),
+  Box(3280, 3280),
+  Box(3281, 3281),
+  Box(3282, 3282),
+  Box(3283, 3283),
+  Box(3284, 3284),
+  Box(3285, 3285),
+  Box(3286, 3286),
+  Box(3287, 3287),
+  Box(3288, 3288),
+  Box(3289, 3289),
+  Box(3290, 3290),
+  Box(3291, 3291),
+  Box(3292, 3292),
+  Box(3293, 3293),
+  Box(3294, 3294),
+  Box(3295, 3295),
+  Box(3296, 3296),
+  Box(3297, 3297),
+  Box(3298, 3298),
+  Box(3299, 3299),
+  Box(3300, 3300),
+  Box(3301, 3301),
+  Box(3302, 3302),
+  Box(3303, 3303),
+  Box(3304, 3304),
+  Box(3305, 3305),
+  Box(3306, 3306),
+  Box(3307, 3307),
+  Box(3308, 3308),
+  Box(3309, 3309),
+  Box(3310, 3310),
+  Box(3311, 3311),
+  Box(3312, 3312),
+  Box(3313, 3313),
+  Box(3314, 3314),
+  Box(3315, 3315),
+  Box(3316, 3316),
+  Box(3317, 3317),
+  Box(3318, 3318),
+  Box(3319, 3319),
+  Box(3320, 3320),
+  Box(3321, 3321),
+  Box(3322, 3322),
+  Box(3323, 3323),
+  Box(3324, 3324),
+  Box(3325, 3325),
+  Box(3326, 3326),
+  Box(3327, 3327),
+  Box(3328, 3328),
+  Box(3329, 3329),
+  Box(3330, 3330),
+  Box(3331, 3331),
+  Box(3332, 3332),
+  Box(3333, 3333),
+  Box(3334, 3334),
+  Box(3335, 3335),
+  Box(3336, 3336),
+  Box(3337, 3337),
+  Box(3338, 3338),
+  Box(3339, 3339),
+  Box(3340, 3340),
+  Box(3341, 3341),
+  Box(3342, 3342),
+  Box(3343, 3343),
+  Box(3344, 3344),
+  Box(3345, 3345),
+  Box(3346, 3346),
+  Box(3347, 3347),
+  Box(3348, 3348),
+  Box(3349, 3349),
+  Box(3350, 3350),
+  Box(3351, 3351),
+  Box(3352, 3352),
+  Box(3353, 3353),
+  Box(3354, 3354),
+  Box(3355, 3355),
+  Box(3356, 3356),
+  Box(3357, 3357),
+  Box(3358, 3358),
+  Box(3359, 3359),
+  Box(3360, 3360),
+  Box(3361, 3361),
+  Box(3362, 3362),
+  Box(3363, 3363),
+  Box(3364, 3364),
+  Box(3365, 3365),
+  Box(3366, 3366),
+  Box(3367, 3367),
+  Box(3368, 3368),
+  Box(3369, 3369),
+  Box(3370, 3370),
+  Box(3371, 3371),
+  Box(3372, 3372),
+  Box(3373, 3373),
+  Box(3374, 3374),
+  Box(3375, 3375),
+  Box(3376, 3376),
+  Box(3377, 3377),
+  Box(3378, 3378),
+  Box(3379, 3379),
+  Box(3380, 3380),
+  Box(3381, 3381),
+  Box(3382, 3382),
+  Box(3383, 3383),
+  Box(3384, 3384),
+  Box(3385, 3385),
+  Box(3386, 3386),
+  Box(3387, 3387),
+  Box(3388, 3388),
+  Box(3389, 3389),
+  Box(3390, 3390),
+  Box(3391, 3391),
+  Box(3392, 3392),
+  Box(3393, 3393),
+  Box(3394, 3394),
+  Box(3395, 3395),
+  Box(3396, 3396),
+  Box(3397, 3397),
+  Box(3398, 3398),
+  Box(3399, 3399),
+  Box(3400, 3400),
+  Box(3401, 3401),
+  Box(3402, 3402),
+  Box(3403, 3403),
+  Box(3404, 3404),
+  Box(3405, 3405),
+  Box(3406, 3406),
+  Box(3407, 3407),
+  Box(3408, 3408),
+  Box(3409, 3409),
+  Box(3410, 3410),
+  Box(3411, 3411),
+  Box(3412, 3412),
+  Box(3413, 3413),
+  Box(3414, 3414),
+  Box(3415, 3415),
+  Box(3416, 3416),
+  Box(3417, 3417),
+  Box(3418, 3418),
+  Box(3419, 3419),
+  Box(3420, 3420),
+  Box(3421, 3421),
+  Box(3422, 3422),
+  Box(3423, 3423),
+  Box(3424, 3424),
+  Box(3425, 3425),
+  Box(3426, 3426),
+  Box(3427, 3427),
+  Box(3428, 3428),
+  Box(3429, 3429),
+  Box(3430, 3430),
+  Box(3431, 3431),
+  Box(3432, 3432),
+  Box(3433, 3433),
+  Box(3434, 3434),
+  Box(3435, 3435),
+  Box(3436, 3436),
+  Box(3437, 3437),
+  Box(3438, 3438),
+  Box(3439, 3439),
+  Box(3440, 3440),
+  Box(3441, 3441),
+  Box(3442, 3442),
+  Box(3443, 3443),
+  Box(3444, 3444),
+  Box(3445, 3445),
+  Box(3446, 3446),
+  Box(3447, 3447),
+  Box(3448, 3448),
+  Box(3449, 3449),
+  Box(3450, 3450),
+  Box(3451, 3451),
+  Box(3452, 3452),
+  Box(3453, 3453),
+  Box(3454, 3454),
+  Box(3455, 3455),
+  Box(3456, 3456),
+  Box(3457, 3457),
+  Box(3458, 3458),
+  Box(3459, 3459),
+  Box(3460, 3460),
+  Box(3461, 3461),
+  Box(3462, 3462),
+  Box(3463, 3463),
+  Box(3464, 3464),
+  Box(3465, 3465),
+  Box(3466, 3466),
+  Box(3467, 3467),
+  Box(3468, 3468),
+  Box(3469, 3469),
+  Box(3470, 3470),
+  Box(3471, 3471),
+  Box(3472, 3472),
+  Box(3473, 3473),
+  Box(3474, 3474),
+  Box(3475, 3475),
+  Box(3476, 3476),
+  Box(3477, 3477),
+  Box(3478, 3478),
+  Box(3479, 3479),
+  Box(3480, 3480),
+  Box(3481, 3481),
+  Box(3482, 3482),
+  Box(3483, 3483),
+  Box(3484, 3484),
+  Box(3485, 3485),
+  Box(3486, 3486),
+  Box(3487, 3487),
+  Box(3488, 3488),
+  Box(3489, 3489),
+  Box(3490, 3490),
+  Box(3491, 3491),
+  Box(3492, 3492),
+  Box(3493, 3493),
+  Box(3494, 3494),
+  Box(3495, 3495),
+  Box(3496, 3496),
+  Box(3497, 3497),
+  Box(3498, 3498),
+  Box(3499, 3499),
+  Box(3500, 3500),
+  Box(3501, 3501),
+  Box(3502, 3502),
+  Box(3503, 3503),
+  Box(3504, 3504),
+  Box(3505, 3505),
+  Box(3506, 3506),
+  Box(3507, 3507),
+  Box(3508, 3508),
+  Box(3509, 3509),
+  Box(3510, 3510),
+  Box(3511, 3511),
+  Box(3512, 3512),
+  Box(3513, 3513),
+  Box(3514, 3514),
+  Box(3515, 3515),
+  Box(3516, 3516),
+  Box(3517, 3517),
+  Box(3518, 3518),
+  Box(3519, 3519),
+  Box(3520, 3520),
+  Box(3521, 3521),
+  Box(3522, 3522),
+  Box(3523, 3523),
+  Box(3524, 3524),
+  Box(3525, 3525),
+  Box(3526, 3526),
+  Box(3527, 3527),
+  Box(3528, 3528),
+  Box(3529, 3529),
+  Box(3530, 3530),
+  Box(3531, 3531),
+  Box(3532, 3532),
+  Box(3533, 3533),
+  Box(3534, 3534),
+  Box(3535, 3535),
+  Box(3536, 3536),
+  Box(3537, 3537),
+  Box(3538, 3538),
+  Box(3539, 3539),
+  Box(3540, 3540),
+  Box(3541, 3541),
+  Box(3542, 3542),
+  Box(3543, 3543),
+  Box(3544, 3544),
+  Box(3545, 3545),
+  Box(3546, 3546),
+  Box(3547, 3547),
+  Box(3548, 3548),
+  Box(3549, 3549),
+  Box(3550, 3550),
+  Box(3551, 3551),
+  Box(3552, 3552),
+  Box(3553, 3553),
+  Box(3554, 3554),
+  Box(3555, 3555),
+  Box(3556, 3556),
+  Box(3557, 3557),
+  Box(3558, 3558),
+  Box(3559, 3559),
+  Box(3560, 3560),
+  Box(3561, 3561),
+  Box(3562, 3562),
+  Box(3563, 3563),
+  Box(3564, 3564),
+  Box(3565, 3565),
+  Box(3566, 3566),
+  Box(3567, 3567),
+  Box(3568, 3568),
+  Box(3569, 3569),
+  Box(3570, 3570),
+  Box(3571, 3571),
+  Box(3572, 3572),
+  Box(3573, 3573),
+  Box(3574, 3574),
+  Box(3575, 3575),
+  Box(3576, 3576),
+  Box(3577, 3577),
+  Box(3578, 3578),
+  Box(3579, 3579),
+  Box(3580, 3580),
+  Box(3581, 3581),
+  Box(3582, 3582),
+  Box(3583, 3583),
+  Box(3584, 3584),
+  Box(3585, 3585),
+  Box(3586, 3586),
+  Box(3587, 3587),
+  Box(3588, 3588),
+  Box(3589, 3589),
+  Box(3590, 3590),
+  Box(3591, 3591),
+  Box(3592, 3592),
+  Box(3593, 3593),
+  Box(3594, 3594),
+  Box(3595, 3595),
+  Box(3596, 3596),
+  Box(3597, 3597),
+  Box(3598, 3598),
+  Box(3599, 3599),
+  Box(3600, 3600),
+  Box(3601, 3601),
+  Box(3602, 3602),
+  Box(3603, 3603),
+  Box(3604, 3604),
+  Box(3605, 3605),
+  Box(3606, 3606),
+  Box(3607, 3607),
+  Box(3608, 3608),
+  Box(3609, 3609),
+  Box(3610, 3610),
+  Box(3611, 3611),
+  Box(3612, 3612),
+  Box(3613, 3613),
+  Box(3614, 3614),
+  Box(3615, 3615),
+  Box(3616, 3616),
+  Box(3617, 3617),
+  Box(3618, 3618),
+  Box(3619, 3619),
+  Box(3620, 3620),
+  Box(3621, 3621),
+  Box(3622, 3622),
+  Box(3623, 3623),
+  Box(3624, 3624),
+  Box(3625, 3625),
+  Box(3626, 3626),
+  Box(3627, 3627),
+  Box(3628, 3628),
+  Box(3629, 3629),
+  Box(3630, 3630),
+  Box(3631, 3631),
+  Box(3632, 3632),
+  Box(3633, 3633),
+  Box(3634, 3634),
+  Box(3635, 3635),
+  Box(3636, 3636),
+  Box(3637, 3637),
+  Box(3638, 3638),
+  Box(3639, 3639),
+  Box(3640, 3640),
+  Box(3641, 3641),
+  Box(3642, 3642),
+  Box(3643, 3643),
+  Box(3644, 3644),
+  Box(3645, 3645),
+  Box(3646, 3646),
+  Box(3647, 3647),
+  Box(3648, 3648),
+  Box(3649, 3649),
+  Box(3650, 3650),
+  Box(3651, 3651),
+  Box(3652, 3652),
+  Box(3653, 3653),
+  Box(3654, 3654),
+  Box(3655, 3655),
+  Box(3656, 3656),
+  Box(3657, 3657),
+  Box(3658, 3658),
+  Box(3659, 3659),
+  Box(3660, 3660),
+  Box(3661, 3661),
+  Box(3662, 3662),
+  Box(3663, 3663),
+  Box(3664, 3664),
+  Box(3665, 3665),
+  Box(3666, 3666),
+  Box(3667, 3667),
+  Box(3668, 3668),
+  Box(3669, 3669),
+  Box(3670, 3670),
+  Box(3671, 3671),
+  Box(3672, 3672),
+  Box(3673, 3673),
+  Box(3674, 3674),
+  Box(3675, 3675),
+  Box(3676, 3676),
+  Box(3677, 3677),
+  Box(3678, 3678),
+  Box(3679, 3679),
+  Box(3680, 3680),
+  Box(3681, 3681),
+  Box(3682, 3682),
+  Box(3683, 3683),
+  Box(3684, 3684),
+  Box(3685, 3685),
+  Box(3686, 3686),
+  Box(3687, 3687),
+  Box(3688, 3688),
+  Box(3689, 3689),
+  Box(3690, 3690),
+  Box(3691, 3691),
+  Box(3692, 3692),
+  Box(3693, 3693),
+  Box(3694, 3694),
+  Box(3695, 3695),
+  Box(3696, 3696),
+  Box(3697, 3697),
+  Box(3698, 3698),
+  Box(3699, 3699),
+  Box(3700, 3700),
+  Box(3701, 3701),
+  Box(3702, 3702),
+  Box(3703, 3703),
+  Box(3704, 3704),
+  Box(3705, 3705),
+  Box(3706, 3706),
+  Box(3707, 3707),
+  Box(3708, 3708),
+  Box(3709, 3709),
+  Box(3710, 3710),
+  Box(3711, 3711),
+  Box(3712, 3712),
+  Box(3713, 3713),
+  Box(3714, 3714),
+  Box(3715, 3715),
+  Box(3716, 3716),
+  Box(3717, 3717),
+  Box(3718, 3718),
+  Box(3719, 3719),
+  Box(3720, 3720),
+  Box(3721, 3721),
+  Box(3722, 3722),
+  Box(3723, 3723),
+  Box(3724, 3724),
+  Box(3725, 3725),
+  Box(3726, 3726),
+  Box(3727, 3727),
+  Box(3728, 3728),
+  Box(3729, 3729),
+  Box(3730, 3730),
+  Box(3731, 3731),
+  Box(3732, 3732),
+  Box(3733, 3733),
+  Box(3734, 3734),
+  Box(3735, 3735),
+  Box(3736, 3736),
+  Box(3737, 3737),
+  Box(3738, 3738),
+  Box(3739, 3739),
+  Box(3740, 3740),
+  Box(3741, 3741),
+  Box(3742, 3742),
+  Box(3743, 3743),
+  Box(3744, 3744),
+  Box(3745, 3745),
+  Box(3746, 3746),
+  Box(3747, 3747),
+  Box(3748, 3748),
+  Box(3749, 3749),
+  Box(3750, 3750),
+  Box(3751, 3751),
+  Box(3752, 3752),
+  Box(3753, 3753),
+  Box(3754, 3754),
+  Box(3755, 3755),
+  Box(3756, 3756),
+  Box(3757, 3757),
+  Box(3758, 3758),
+  Box(3759, 3759),
+  Box(3760, 3760),
+  Box(3761, 3761),
+  Box(3762, 3762),
+  Box(3763, 3763),
+  Box(3764, 3764),
+  Box(3765, 3765),
+  Box(3766, 3766),
+  Box(3767, 3767),
+  Box(3768, 3768),
+  Box(3769, 3769),
+  Box(3770, 3770),
+  Box(3771, 3771),
+  Box(3772, 3772),
+  Box(3773, 3773),
+  Box(3774, 3774),
+  Box(3775, 3775),
+  Box(3776, 3776),
+  Box(3777, 3777),
+  Box(3778, 3778),
+  Box(3779, 3779),
+  Box(3780, 3780),
+  Box(3781, 3781),
+  Box(3782, 3782),
+  Box(3783, 3783),
+  Box(3784, 3784),
+  Box(3785, 3785),
+  Box(3786, 3786),
+  Box(3787, 3787),
+  Box(3788, 3788),
+  Box(3789, 3789),
+  Box(3790, 3790),
+  Box(3791, 3791),
+  Box(3792, 3792),
+  Box(3793, 3793),
+  Box(3794, 3794),
+  Box(3795, 3795),
+  Box(3796, 3796),
+  Box(3797, 3797),
+  Box(3798, 3798),
+  Box(3799, 3799),
+  Box(3800, 3800),
+  Box(3801, 3801),
+  Box(3802, 3802),
+  Box(3803, 3803),
+  Box(3804, 3804),
+  Box(3805, 3805),
+  Box(3806, 3806),
+  Box(3807, 3807),
+  Box(3808, 3808),
+  Box(3809, 3809),
+  Box(3810, 3810),
+  Box(3811, 3811),
+  Box(3812, 3812),
+  Box(3813, 3813),
+  Box(3814, 3814),
+  Box(3815, 3815),
+  Box(3816, 3816),
+  Box(3817, 3817),
+  Box(3818, 3818),
+  Box(3819, 3819),
+  Box(3820, 3820),
+  Box(3821, 3821),
+  Box(3822, 3822),
+  Box(3823, 3823),
+  Box(3824, 3824),
+  Box(3825, 3825),
+  Box(3826, 3826),
+  Box(3827, 3827),
+  Box(3828, 3828),
+  Box(3829, 3829),
+  Box(3830, 3830),
+  Box(3831, 3831),
+  Box(3832, 3832),
+  Box(3833, 3833),
+  Box(3834, 3834),
+  Box(3835, 3835),
+  Box(3836, 3836),
+  Box(3837, 3837),
+  Box(3838, 3838),
+  Box(3839, 3839),
+  Box(3840, 3840),
+  Box(3841, 3841),
+  Box(3842, 3842),
+  Box(3843, 3843),
+  Box(3844, 3844),
+  Box(3845, 3845),
+  Box(3846, 3846),
+  Box(3847, 3847),
+  Box(3848, 3848),
+  Box(3849, 3849),
+  Box(3850, 3850),
+  Box(3851, 3851),
+  Box(3852, 3852),
+  Box(3853, 3853),
+  Box(3854, 3854),
+  Box(3855, 3855),
+  Box(3856, 3856),
+  Box(3857, 3857),
+  Box(3858, 3858),
+  Box(3859, 3859),
+  Box(3860, 3860),
+  Box(3861, 3861),
+  Box(3862, 3862),
+  Box(3863, 3863),
+  Box(3864, 3864),
+  Box(3865, 3865),
+  Box(3866, 3866),
+  Box(3867, 3867),
+  Box(3868, 3868),
+  Box(3869, 3869),
+  Box(3870, 3870),
+  Box(3871, 3871),
+  Box(3872, 3872),
+  Box(3873, 3873),
+  Box(3874, 3874),
+  Box(3875, 3875),
+  Box(3876, 3876),
+  Box(3877, 3877),
+  Box(3878, 3878),
+  Box(3879, 3879),
+  Box(3880, 3880),
+  Box(3881, 3881),
+  Box(3882, 3882),
+  Box(3883, 3883),
+  Box(3884, 3884),
+  Box(3885, 3885),
+  Box(3886, 3886),
+  Box(3887, 3887),
+  Box(3888, 3888),
+  Box(3889, 3889),
+  Box(3890, 3890),
+  Box(3891, 3891),
+  Box(3892, 3892),
+  Box(3893, 3893),
+  Box(3894, 3894),
+  Box(3895, 3895),
+  Box(3896, 3896),
+  Box(3897, 3897),
+  Box(3898, 3898),
+  Box(3899, 3899),
+  Box(3900, 3900),
+  Box(3901, 3901),
+  Box(3902, 3902),
+  Box(3903, 3903),
+  Box(3904, 3904),
+  Box(3905, 3905),
+  Box(3906, 3906),
+  Box(3907, 3907),
+  Box(3908, 3908),
+  Box(3909, 3909),
+  Box(3910, 3910),
+  Box(3911, 3911),
+  Box(3912, 3912),
+  Box(3913, 3913),
+  Box(3914, 3914),
+  Box(3915, 3915),
+  Box(3916, 3916),
+  Box(3917, 3917),
+  Box(3918, 3918),
+  Box(3919, 3919),
+  Box(3920, 3920),
+  Box(3921, 3921),
+  Box(3922, 3922),
+  Box(3923, 3923),
+  Box(3924, 3924),
+  Box(3925, 3925),
+  Box(3926, 3926),
+  Box(3927, 3927),
+  Box(3928, 3928),
+  Box(3929, 3929),
+  Box(3930, 3930),
+  Box(3931, 3931),
+  Box(3932, 3932),
+  Box(3933, 3933),
+  Box(3934, 3934),
+  Box(3935, 3935),
+  Box(3936, 3936),
+  Box(3937, 3937),
+  Box(3938, 3938),
+  Box(3939, 3939),
+  Box(3940, 3940),
+  Box(3941, 3941),
+  Box(3942, 3942),
+  Box(3943, 3943),
+  Box(3944, 3944),
+  Box(3945, 3945),
+  Box(3946, 3946),
+  Box(3947, 3947),
+  Box(3948, 3948),
+  Box(3949, 3949),
+  Box(3950, 3950),
+  Box(3951, 3951),
+  Box(3952, 3952),
+  Box(3953, 3953),
+  Box(3954, 3954),
+  Box(3955, 3955),
+  Box(3956, 3956),
+  Box(3957, 3957),
+  Box(3958, 3958),
+  Box(3959, 3959),
+  Box(3960, 3960),
+  Box(3961, 3961),
+  Box(3962, 3962),
+  Box(3963, 3963),
+  Box(3964, 3964),
+  Box(3965, 3965),
+  Box(3966, 3966),
+  Box(3967, 3967),
+  Box(3968, 3968),
+  Box(3969, 3969),
+  Box(3970, 3970),
+  Box(3971, 3971),
+  Box(3972, 3972),
+  Box(3973, 3973),
+  Box(3974, 3974),
+  Box(3975, 3975),
+  Box(3976, 3976),
+  Box(3977, 3977),
+  Box(3978, 3978),
+  Box(3979, 3979),
+  Box(3980, 3980),
+  Box(3981, 3981),
+  Box(3982, 3982),
+  Box(3983, 3983),
+  Box(3984, 3984),
+  Box(3985, 3985),
+  Box(3986, 3986),
+  Box(3987, 3987),
+  Box(3988, 3988),
+  Box(3989, 3989),
+  Box(3990, 3990),
+  Box(3991, 3991),
+  Box(3992, 3992),
+  Box(3993, 3993),
+  Box(3994, 3994),
+  Box(3995, 3995),
+  Box(3996, 3996),
+  Box(3997, 3997),
+  Box(3998, 3998),
+  Box(3999, 3999),
+  Box(4000, 4000),
+  Box(4001, 4001),
+  Box(4002, 4002),
+  Box(4003, 4003),
+  Box(4004, 4004),
+  Box(4005, 4005),
+  Box(4006, 4006),
+  Box(4007, 4007),
+  Box(4008, 4008),
+  Box(4009, 4009),
+  Box(4010, 4010),
+  Box(4011, 4011),
+  Box(4012, 4012),
+  Box(4013, 4013),
+  Box(4014, 4014),
+  Box(4015, 4015),
+  Box(4016, 4016),
+  Box(4017, 4017),
+  Box(4018, 4018),
+  Box(4019, 4019),
+  Box(4020, 4020),
+  Box(4021, 4021),
+  Box(4022, 4022),
+  Box(4023, 4023),
+  Box(4024, 4024),
+  Box(4025, 4025),
+  Box(4026, 4026),
+  Box(4027, 4027),
+  Box(4028, 4028),
+  Box(4029, 4029),
+  Box(4030, 4030),
+  Box(4031, 4031),
+  Box(4032, 4032),
+  Box(4033, 4033),
+  Box(4034, 4034),
+  Box(4035, 4035),
+  Box(4036, 4036),
+  Box(4037, 4037),
+  Box(4038, 4038),
+  Box(4039, 4039),
+  Box(4040, 4040),
+  Box(4041, 4041),
+  Box(4042, 4042),
+  Box(4043, 4043),
+  Box(4044, 4044),
+  Box(4045, 4045),
+  Box(4046, 4046),
+  Box(4047, 4047),
+  Box(4048, 4048),
+  Box(4049, 4049),
+  Box(4050, 4050),
+  Box(4051, 4051),
+  Box(4052, 4052),
+  Box(4053, 4053),
+  Box(4054, 4054),
+  Box(4055, 4055),
+  Box(4056, 4056),
+  Box(4057, 4057),
+  Box(4058, 4058),
+  Box(4059, 4059),
+  Box(4060, 4060),
+  Box(4061, 4061),
+  Box(4062, 4062),
+  Box(4063, 4063),
+  Box(4064, 4064),
+  Box(4065, 4065),
+  Box(4066, 4066),
+  Box(4067, 4067),
+  Box(4068, 4068),
+  Box(4069, 4069),
+  Box(4070, 4070),
+  Box(4071, 4071),
+  Box(4072, 4072),
+  Box(4073, 4073),
+  Box(4074, 4074),
+  Box(4075, 4075),
+  Box(4076, 4076),
+  Box(4077, 4077),
+  Box(4078, 4078),
+  Box(4079, 4079),
+  Box(4080, 4080),
+  Box(4081, 4081),
+  Box(4082, 4082),
+  Box(4083, 4083),
+  Box(4084, 4084),
+  Box(4085, 4085),
+  Box(4086, 4086),
+  Box(4087, 4087),
+  Box(4088, 4088),
+  Box(4089, 4089),
+  Box(4090, 4090),
+  Box(4091, 4091),
+  Box(4092, 4092),
+  Box(4093, 4093),
+  Box(4094, 4094),
+  Box(4095, 4095),
+  Box(4096, 4096),
+  Box(4097, 4097),
+  Box(4098, 4098),
+  Box(4099, 4099),
+  Box(4100, 4100),
+  Box(4101, 4101),
+  Box(4102, 4102),
+  Box(4103, 4103),
+  Box(4104, 4104),
+  Box(4105, 4105),
+  Box(4106, 4106),
+  Box(4107, 4107),
+  Box(4108, 4108),
+  Box(4109, 4109),
+  Box(4110, 4110),
+  Box(4111, 4111),
+  Box(4112, 4112),
+  Box(4113, 4113),
+  Box(4114, 4114),
+  Box(4115, 4115),
+  Box(4116, 4116),
+  Box(4117, 4117),
+  Box(4118, 4118),
+  Box(4119, 4119),
+  Box(4120, 4120),
+  Box(4121, 4121),
+  Box(4122, 4122),
+  Box(4123, 4123),
+  Box(4124, 4124),
+  Box(4125, 4125),
+  Box(4126, 4126),
+  Box(4127, 4127),
+  Box(4128, 4128),
+  Box(4129, 4129),
+  Box(4130, 4130),
+  Box(4131, 4131),
+  Box(4132, 4132),
+  Box(4133, 4133),
+  Box(4134, 4134),
+  Box(4135, 4135),
+  Box(4136, 4136),
+  Box(4137, 4137),
+  Box(4138, 4138),
+  Box(4139, 4139),
+  Box(4140, 4140),
+  Box(4141, 4141),
+  Box(4142, 4142),
+  Box(4143, 4143),
+  Box(4144, 4144),
+  Box(4145, 4145),
+  Box(4146, 4146),
+  Box(4147, 4147),
+  Box(4148, 4148),
+  Box(4149, 4149),
+  Box(4150, 4150),
+  Box(4151, 4151),
+  Box(4152, 4152),
+  Box(4153, 4153),
+  Box(4154, 4154),
+  Box(4155, 4155),
+  Box(4156, 4156),
+  Box(4157, 4157),
+  Box(4158, 4158),
+  Box(4159, 4159),
+  Box(4160, 4160),
+  Box(4161, 4161),
+  Box(4162, 4162),
+  Box(4163, 4163),
+  Box(4164, 4164),
+  Box(4165, 4165),
+  Box(4166, 4166),
+  Box(4167, 4167),
+  Box(4168, 4168),
+  Box(4169, 4169),
+  Box(4170, 4170),
+  Box(4171, 4171),
+  Box(4172, 4172),
+  Box(4173, 4173),
+  Box(4174, 4174),
+  Box(4175, 4175),
+  Box(4176, 4176),
+  Box(4177, 4177),
+  Box(4178, 4178),
+  Box(4179, 4179),
+  Box(4180, 4180),
+  Box(4181, 4181),
+  Box(4182, 4182),
+  Box(4183, 4183),
+  Box(4184, 4184),
+  Box(4185, 4185),
+  Box(4186, 4186),
+  Box(4187, 4187),
+  Box(4188, 4188),
+  Box(4189, 4189),
+  Box(4190, 4190),
+  Box(4191, 4191),
+  Box(4192, 4192),
+  Box(4193, 4193),
+  Box(4194, 4194),
+  Box(4195, 4195),
+  Box(4196, 4196),
+  Box(4197, 4197),
+  Box(4198, 4198),
+  Box(4199, 4199),
+  Box(4200, 4200),
+  Box(4201, 4201),
+  Box(4202, 4202),
+  Box(4203, 4203),
+  Box(4204, 4204),
+  Box(4205, 4205),
+  Box(4206, 4206),
+  Box(4207, 4207),
+  Box(4208, 4208),
+  Box(4209, 4209),
+  Box(4210, 4210),
+  Box(4211, 4211),
+  Box(4212, 4212),
+  Box(4213, 4213),
+  Box(4214, 4214),
+  Box(4215, 4215),
+  Box(4216, 4216),
+  Box(4217, 4217),
+  Box(4218, 4218),
+  Box(4219, 4219),
+  Box(4220, 4220),
+  Box(4221, 4221),
+  Box(4222, 4222),
+  Box(4223, 4223),
+  Box(4224, 4224),
+  Box(4225, 4225),
+  Box(4226, 4226),
+  Box(4227, 4227),
+  Box(4228, 4228),
+  Box(4229, 4229),
+  Box(4230, 4230),
+  Box(4231, 4231),
+  Box(4232, 4232),
+  Box(4233, 4233),
+  Box(4234, 4234),
+  Box(4235, 4235),
+  Box(4236, 4236),
+  Box(4237, 4237),
+  Box(4238, 4238),
+  Box(4239, 4239),
+  Box(4240, 4240),
+  Box(4241, 4241),
+  Box(4242, 4242),
+  Box(4243, 4243),
+  Box(4244, 4244),
+  Box(4245, 4245),
+  Box(4246, 4246),
+  Box(4247, 4247),
+  Box(4248, 4248),
+  Box(4249, 4249),
+  Box(4250, 4250),
+  Box(4251, 4251),
+  Box(4252, 4252),
+  Box(4253, 4253),
+  Box(4254, 4254),
+  Box(4255, 4255),
+  Box(4256, 4256),
+  Box(4257, 4257),
+  Box(4258, 4258),
+  Box(4259, 4259),
+  Box(4260, 4260),
+  Box(4261, 4261),
+  Box(4262, 4262),
+  Box(4263, 4263),
+  Box(4264, 4264),
+  Box(4265, 4265),
+  Box(4266, 4266),
+  Box(4267, 4267),
+  Box(4268, 4268),
+  Box(4269, 4269),
+  Box(4270, 4270),
+  Box(4271, 4271),
+  Box(4272, 4272),
+  Box(4273, 4273),
+  Box(4274, 4274),
+  Box(4275, 4275),
+  Box(4276, 4276),
+  Box(4277, 4277),
+  Box(4278, 4278),
+  Box(4279, 4279),
+  Box(4280, 4280),
+  Box(4281, 4281),
+  Box(4282, 4282),
+  Box(4283, 4283),
+  Box(4284, 4284),
+  Box(4285, 4285),
+  Box(4286, 4286),
+  Box(4287, 4287),
+  Box(4288, 4288),
+  Box(4289, 4289),
+  Box(4290, 4290),
+  Box(4291, 4291),
+  Box(4292, 4292),
+  Box(4293, 4293),
+  Box(4294, 4294),
+  Box(4295, 4295),
+  Box(4296, 4296),
+  Box(4297, 4297),
+  Box(4298, 4298),
+  Box(4299, 4299),
+  Box(4300, 4300),
+  Box(4301, 4301),
+  Box(4302, 4302),
+  Box(4303, 4303),
+  Box(4304, 4304),
+  Box(4305, 4305),
+  Box(4306, 4306),
+  Box(4307, 4307),
+  Box(4308, 4308),
+  Box(4309, 4309),
+  Box(4310, 4310),
+  Box(4311, 4311),
+  Box(4312, 4312),
+  Box(4313, 4313),
+  Box(4314, 4314),
+  Box(4315, 4315),
+  Box(4316, 4316),
+  Box(4317, 4317),
+  Box(4318, 4318),
+  Box(4319, 4319),
+  Box(4320, 4320),
+  Box(4321, 4321),
+  Box(4322, 4322),
+  Box(4323, 4323),
+  Box(4324, 4324),
+  Box(4325, 4325),
+  Box(4326, 4326),
+  Box(4327, 4327),
+  Box(4328, 4328),
+  Box(4329, 4329),
+  Box(4330, 4330),
+  Box(4331, 4331),
+  Box(4332, 4332),
+  Box(4333, 4333),
+  Box(4334, 4334),
+  Box(4335, 4335),
+  Box(4336, 4336),
+  Box(4337, 4337),
+  Box(4338, 4338),
+  Box(4339, 4339),
+  Box(4340, 4340),
+  Box(4341, 4341),
+  Box(4342, 4342),
+  Box(4343, 4343),
+  Box(4344, 4344),
+  Box(4345, 4345),
+  Box(4346, 4346),
+  Box(4347, 4347),
+  Box(4348, 4348),
+  Box(4349, 4349),
+  Box(4350, 4350),
+  Box(4351, 4351),
+  Box(4352, 4352),
+  Box(4353, 4353),
+  Box(4354, 4354),
+  Box(4355, 4355),
+  Box(4356, 4356),
+  Box(4357, 4357),
+  Box(4358, 4358),
+  Box(4359, 4359),
+  Box(4360, 4360),
+  Box(4361, 4361),
+  Box(4362, 4362),
+  Box(4363, 4363),
+  Box(4364, 4364),
+  Box(4365, 4365),
+  Box(4366, 4366),
+  Box(4367, 4367),
+  Box(4368, 4368),
+  Box(4369, 4369),
+  Box(4370, 4370),
+  Box(4371, 4371),
+  Box(4372, 4372),
+  Box(4373, 4373),
+  Box(4374, 4374),
+  Box(4375, 4375),
+  Box(4376, 4376),
+  Box(4377, 4377),
+  Box(4378, 4378),
+  Box(4379, 4379),
+  Box(4380, 4380),
+  Box(4381, 4381),
+  Box(4382, 4382),
+  Box(4383, 4383),
+  Box(4384, 4384),
+  Box(4385, 4385),
+  Box(4386, 4386),
+  Box(4387, 4387),
+  Box(4388, 4388),
+  Box(4389, 4389),
+  Box(4390, 4390),
+  Box(4391, 4391),
+  Box(4392, 4392),
+  Box(4393, 4393),
+  Box(4394, 4394),
+  Box(4395, 4395),
+  Box(4396, 4396),
+  Box(4397, 4397),
+  Box(4398, 4398),
+  Box(4399, 4399),
+  Box(4400, 4400),
+  Box(4401, 4401),
+  Box(4402, 4402),
+  Box(4403, 4403),
+  Box(4404, 4404),
+  Box(4405, 4405),
+  Box(4406, 4406),
+  Box(4407, 4407),
+  Box(4408, 4408),
+  Box(4409, 4409),
+  Box(4410, 4410),
+  Box(4411, 4411),
+  Box(4412, 4412),
+  Box(4413, 4413),
+  Box(4414, 4414),
+  Box(4415, 4415),
+  Box(4416, 4416),
+  Box(4417, 4417),
+  Box(4418, 4418),
+  Box(4419, 4419),
+  Box(4420, 4420),
+  Box(4421, 4421),
+  Box(4422, 4422),
+  Box(4423, 4423),
+  Box(4424, 4424),
+  Box(4425, 4425),
+  Box(4426, 4426),
+  Box(4427, 4427),
+  Box(4428, 4428),
+  Box(4429, 4429),
+  Box(4430, 4430),
+  Box(4431, 4431),
+  Box(4432, 4432),
+  Box(4433, 4433),
+  Box(4434, 4434),
+  Box(4435, 4435),
+  Box(4436, 4436),
+  Box(4437, 4437),
+  Box(4438, 4438),
+  Box(4439, 4439),
+  Box(4440, 4440),
+  Box(4441, 4441),
+  Box(4442, 4442),
+  Box(4443, 4443),
+  Box(4444, 4444),
+  Box(4445, 4445),
+  Box(4446, 4446),
+  Box(4447, 4447),
+  Box(4448, 4448),
+  Box(4449, 4449),
+  Box(4450, 4450),
+  Box(4451, 4451),
+  Box(4452, 4452),
+  Box(4453, 4453),
+  Box(4454, 4454),
+  Box(4455, 4455),
+  Box(4456, 4456),
+  Box(4457, 4457),
+  Box(4458, 4458),
+  Box(4459, 4459),
+  Box(4460, 4460),
+  Box(4461, 4461),
+  Box(4462, 4462),
+  Box(4463, 4463),
+  Box(4464, 4464),
+  Box(4465, 4465),
+  Box(4466, 4466),
+  Box(4467, 4467),
+  Box(4468, 4468),
+  Box(4469, 4469),
+  Box(4470, 4470),
+  Box(4471, 4471),
+  Box(4472, 4472),
+  Box(4473, 4473),
+  Box(4474, 4474),
+  Box(4475, 4475),
+  Box(4476, 4476),
+  Box(4477, 4477),
+  Box(4478, 4478),
+  Box(4479, 4479),
+  Box(4480, 4480),
+  Box(4481, 4481),
+  Box(4482, 4482),
+  Box(4483, 4483),
+  Box(4484, 4484),
+  Box(4485, 4485),
+  Box(4486, 4486),
+  Box(4487, 4487),
+  Box(4488, 4488),
+  Box(4489, 4489),
+  Box(4490, 4490),
+  Box(4491, 4491),
+  Box(4492, 4492),
+  Box(4493, 4493),
+  Box(4494, 4494),
+  Box(4495, 4495),
+  Box(4496, 4496),
+  Box(4497, 4497),
+  Box(4498, 4498),
+  Box(4499, 4499),
+  Box(4500, 4500),
+  Box(4501, 4501),
+  Box(4502, 4502),
+  Box(4503, 4503),
+  Box(4504, 4504),
+  Box(4505, 4505),
+  Box(4506, 4506),
+  Box(4507, 4507),
+  Box(4508, 4508),
+  Box(4509, 4509),
+  Box(4510, 4510),
+  Box(4511, 4511),
+  Box(4512, 4512),
+  Box(4513, 4513),
+  Box(4514, 4514),
+  Box(4515, 4515),
+  Box(4516, 4516),
+  Box(4517, 4517),
+  Box(4518, 4518),
+  Box(4519, 4519),
+  Box(4520, 4520),
+  Box(4521, 4521),
+  Box(4522, 4522),
+  Box(4523, 4523),
+  Box(4524, 4524),
+  Box(4525, 4525),
+  Box(4526, 4526),
+  Box(4527, 4527),
+  Box(4528, 4528),
+  Box(4529, 4529),
+  Box(4530, 4530),
+  Box(4531, 4531),
+  Box(4532, 4532),
+  Box(4533, 4533),
+  Box(4534, 4534),
+  Box(4535, 4535),
+  Box(4536, 4536),
+  Box(4537, 4537),
+  Box(4538, 4538),
+  Box(4539, 4539),
+  Box(4540, 4540),
+  Box(4541, 4541),
+  Box(4542, 4542),
+  Box(4543, 4543),
+  Box(4544, 4544),
+  Box(4545, 4545),
+  Box(4546, 4546),
+  Box(4547, 4547),
+  Box(4548, 4548),
+  Box(4549, 4549),
+  Box(4550, 4550),
+  Box(4551, 4551),
+  Box(4552, 4552),
+  Box(4553, 4553),
+  Box(4554, 4554),
+  Box(4555, 4555),
+  Box(4556, 4556),
+  Box(4557, 4557),
+  Box(4558, 4558),
+  Box(4559, 4559),
+  Box(4560, 4560),
+  Box(4561, 4561),
+  Box(4562, 4562),
+  Box(4563, 4563),
+  Box(4564, 4564),
+  Box(4565, 4565),
+  Box(4566, 4566),
+  Box(4567, 4567),
+  Box(4568, 4568),
+  Box(4569, 4569),
+  Box(4570, 4570),
+  Box(4571, 4571),
+  Box(4572, 4572),
+  Box(4573, 4573),
+  Box(4574, 4574),
+  Box(4575, 4575),
+  Box(4576, 4576),
+  Box(4577, 4577),
+  Box(4578, 4578),
+  Box(4579, 4579),
+  Box(4580, 4580),
+  Box(4581, 4581),
+  Box(4582, 4582),
+  Box(4583, 4583),
+  Box(4584, 4584),
+  Box(4585, 4585),
+  Box(4586, 4586),
+  Box(4587, 4587),
+  Box(4588, 4588),
+  Box(4589, 4589),
+  Box(4590, 4590),
+  Box(4591, 4591),
+  Box(4592, 4592),
+  Box(4593, 4593),
+  Box(4594, 4594),
+  Box(4595, 4595),
+  Box(4596, 4596),
+  Box(4597, 4597),
+  Box(4598, 4598),
+  Box(4599, 4599),
+  Box(4600, 4600),
+  Box(4601, 4601),
+  Box(4602, 4602),
+  Box(4603, 4603),
+  Box(4604, 4604),
+  Box(4605, 4605),
+  Box(4606, 4606),
+  Box(4607, 4607),
+  Box(4608, 4608),
+  Box(4609, 4609),
+  Box(4610, 4610),
+  Box(4611, 4611),
+  Box(4612, 4612),
+  Box(4613, 4613),
+  Box(4614, 4614),
+  Box(4615, 4615),
+  Box(4616, 4616),
+  Box(4617, 4617),
+  Box(4618, 4618),
+  Box(4619, 4619),
+  Box(4620, 4620),
+  Box(4621, 4621),
+  Box(4622, 4622),
+  Box(4623, 4623),
+  Box(4624, 4624),
+  Box(4625, 4625),
+  Box(4626, 4626),
+  Box(4627, 4627),
+  Box(4628, 4628),
+  Box(4629, 4629),
+  Box(4630, 4630),
+  Box(4631, 4631),
+  Box(4632, 4632),
+  Box(4633, 4633),
+  Box(4634, 4634),
+  Box(4635, 4635),
+  Box(4636, 4636),
+  Box(4637, 4637),
+  Box(4638, 4638),
+  Box(4639, 4639),
+  Box(4640, 4640),
+  Box(4641, 4641),
+  Box(4642, 4642),
+  Box(4643, 4643),
+  Box(4644, 4644),
+  Box(4645, 4645),
+  Box(4646, 4646),
+  Box(4647, 4647),
+  Box(4648, 4648),
+  Box(4649, 4649),
+  Box(4650, 4650),
+  Box(4651, 4651),
+  Box(4652, 4652),
+  Box(4653, 4653),
+  Box(4654, 4654),
+  Box(4655, 4655),
+  Box(4656, 4656),
+  Box(4657, 4657),
+  Box(4658, 4658),
+  Box(4659, 4659),
+  Box(4660, 4660),
+  Box(4661, 4661),
+  Box(4662, 4662),
+  Box(4663, 4663),
+  Box(4664, 4664),
+  Box(4665, 4665),
+  Box(4666, 4666),
+  Box(4667, 4667),
+  Box(4668, 4668),
+  Box(4669, 4669),
+  Box(4670, 4670),
+  Box(4671, 4671),
+  Box(4672, 4672),
+  Box(4673, 4673),
+  Box(4674, 4674),
+  Box(4675, 4675),
+  Box(4676, 4676),
+  Box(4677, 4677),
+  Box(4678, 4678),
+  Box(4679, 4679),
+  Box(4680, 4680),
+  Box(4681, 4681),
+  Box(4682, 4682),
+  Box(4683, 4683),
+  Box(4684, 4684),
+  Box(4685, 4685),
+  Box(4686, 4686),
+  Box(4687, 4687),
+  Box(4688, 4688),
+  Box(4689, 4689),
+  Box(4690, 4690),
+  Box(4691, 4691),
+  Box(4692, 4692),
+  Box(4693, 4693),
+  Box(4694, 4694),
+  Box(4695, 4695),
+  Box(4696, 4696),
+  Box(4697, 4697),
+  Box(4698, 4698),
+  Box(4699, 4699),
+  Box(4700, 4700),
+  Box(4701, 4701),
+  Box(4702, 4702),
+  Box(4703, 4703),
+  Box(4704, 4704),
+  Box(4705, 4705),
+  Box(4706, 4706),
+  Box(4707, 4707),
+  Box(4708, 4708),
+  Box(4709, 4709),
+  Box(4710, 4710),
+  Box(4711, 4711),
+  Box(4712, 4712),
+  Box(4713, 4713),
+  Box(4714, 4714),
+  Box(4715, 4715),
+  Box(4716, 4716),
+  Box(4717, 4717),
+  Box(4718, 4718),
+  Box(4719, 4719),
+  Box(4720, 4720),
+  Box(4721, 4721),
+  Box(4722, 4722),
+  Box(4723, 4723),
+  Box(4724, 4724),
+  Box(4725, 4725),
+  Box(4726, 4726),
+  Box(4727, 4727),
+  Box(4728, 4728),
+  Box(4729, 4729),
+  Box(4730, 4730),
+  Box(4731, 4731),
+  Box(4732, 4732),
+  Box(4733, 4733),
+  Box(4734, 4734),
+  Box(4735, 4735),
+  Box(4736, 4736),
+  Box(4737, 4737),
+  Box(4738, 4738),
+  Box(4739, 4739),
+  Box(4740, 4740),
+  Box(4741, 4741),
+  Box(4742, 4742),
+  Box(4743, 4743),
+  Box(4744, 4744),
+  Box(4745, 4745),
+  Box(4746, 4746),
+  Box(4747, 4747),
+  Box(4748, 4748),
+  Box(4749, 4749),
+  Box(4750, 4750),
+  Box(4751, 4751),
+  Box(4752, 4752),
+  Box(4753, 4753),
+  Box(4754, 4754),
+  Box(4755, 4755),
+  Box(4756, 4756),
+  Box(4757, 4757),
+  Box(4758, 4758),
+  Box(4759, 4759),
+  Box(4760, 4760),
+  Box(4761, 4761),
+  Box(4762, 4762),
+  Box(4763, 4763),
+  Box(4764, 4764),
+  Box(4765, 4765),
+  Box(4766, 4766),
+  Box(4767, 4767),
+  Box(4768, 4768),
+  Box(4769, 4769),
+  Box(4770, 4770),
+  Box(4771, 4771),
+  Box(4772, 4772),
+  Box(4773, 4773),
+  Box(4774, 4774),
+  Box(4775, 4775),
+  Box(4776, 4776),
+  Box(4777, 4777),
+  Box(4778, 4778),
+  Box(4779, 4779),
+  Box(4780, 4780),
+  Box(4781, 4781),
+  Box(4782, 4782),
+  Box(4783, 4783),
+  Box(4784, 4784),
+  Box(4785, 4785),
+  Box(4786, 4786),
+  Box(4787, 4787),
+  Box(4788, 4788),
+  Box(4789, 4789),
+  Box(4790, 4790),
+  Box(4791, 4791),
+  Box(4792, 4792),
+  Box(4793, 4793),
+  Box(4794, 4794),
+  Box(4795, 4795),
+  Box(4796, 4796),
+  Box(4797, 4797),
+  Box(4798, 4798),
+  Box(4799, 4799),
+  Box(4800, 4800),
+  Box(4801, 4801),
+  Box(4802, 4802),
+  Box(4803, 4803),
+  Box(4804, 4804),
+  Box(4805, 4805),
+  Box(4806, 4806),
+  Box(4807, 4807),
+  Box(4808, 4808),
+  Box(4809, 4809),
+  Box(4810, 4810),
+  Box(4811, 4811),
+  Box(4812, 4812),
+  Box(4813, 4813),
+  Box(4814, 4814),
+  Box(4815, 4815),
+  Box(4816, 4816),
+  Box(4817, 4817),
+  Box(4818, 4818),
+  Box(4819, 4819),
+  Box(4820, 4820),
+  Box(4821, 4821),
+  Box(4822, 4822),
+  Box(4823, 4823),
+  Box(4824, 4824),
+  Box(4825, 4825),
+  Box(4826, 4826),
+  Box(4827, 4827),
+  Box(4828, 4828),
+  Box(4829, 4829),
+  Box(4830, 4830),
+  Box(4831, 4831),
+  Box(4832, 4832),
+  Box(4833, 4833),
+  Box(4834, 4834),
+  Box(4835, 4835),
+  Box(4836, 4836),
+  Box(4837, 4837),
+  Box(4838, 4838),
+  Box(4839, 4839),
+  Box(4840, 4840),
+  Box(4841, 4841),
+  Box(4842, 4842),
+  Box(4843, 4843),
+  Box(4844, 4844),
+  Box(4845, 4845),
+  Box(4846, 4846),
+  Box(4847, 4847),
+  Box(4848, 4848),
+  Box(4849, 4849),
+  Box(4850, 4850),
+  Box(4851, 4851),
+  Box(4852, 4852),
+  Box(4853, 4853),
+  Box(4854, 4854),
+  Box(4855, 4855),
+  Box(4856, 4856),
+  Box(4857, 4857),
+  Box(4858, 4858),
+  Box(4859, 4859),
+  Box(4860, 4860),
+  Box(4861, 4861),
+  Box(4862, 4862),
+  Box(4863, 4863),
+  Box(4864, 4864),
+  Box(4865, 4865),
+  Box(4866, 4866),
+  Box(4867, 4867),
+  Box(4868, 4868),
+  Box(4869, 4869),
+  Box(4870, 4870),
+  Box(4871, 4871),
+  Box(4872, 4872),
+  Box(4873, 4873),
+  Box(4874, 4874),
+  Box(4875, 4875),
+  Box(4876, 4876),
+  Box(4877, 4877),
+  Box(4878, 4878),
+  Box(4879, 4879),
+  Box(4880, 4880),
+  Box(4881, 4881),
+  Box(4882, 4882),
+  Box(4883, 4883),
+  Box(4884, 4884),
+  Box(4885, 4885),
+  Box(4886, 4886),
+  Box(4887, 4887),
+  Box(4888, 4888),
+  Box(4889, 4889),
+  Box(4890, 4890),
+  Box(4891, 4891),
+  Box(4892, 4892),
+  Box(4893, 4893),
+  Box(4894, 4894),
+  Box(4895, 4895),
+  Box(4896, 4896),
+  Box(4897, 4897),
+  Box(4898, 4898),
+  Box(4899, 4899),
+  Box(4900, 4900),
+  Box(4901, 4901),
+  Box(4902, 4902),
+  Box(4903, 4903),
+  Box(4904, 4904),
+  Box(4905, 4905),
+  Box(4906, 4906),
+  Box(4907, 4907),
+  Box(4908, 4908),
+  Box(4909, 4909),
+  Box(4910, 4910),
+  Box(4911, 4911),
+  Box(4912, 4912),
+  Box(4913, 4913),
+  Box(4914, 4914),
+  Box(4915, 4915),
+  Box(4916, 4916),
+  Box(4917, 4917),
+  Box(4918, 4918),
+  Box(4919, 4919),
+  Box(4920, 4920),
+  Box(4921, 4921),
+  Box(4922, 4922),
+  Box(4923, 4923),
+  Box(4924, 4924),
+  Box(4925, 4925),
+  Box(4926, 4926),
+  Box(4927, 4927),
+  Box(4928, 4928),
+  Box(4929, 4929),
+  Box(4930, 4930),
+  Box(4931, 4931),
+  Box(4932, 4932),
+  Box(4933, 4933),
+  Box(4934, 4934),
+  Box(4935, 4935),
+  Box(4936, 4936),
+  Box(4937, 4937),
+  Box(4938, 4938),
+  Box(4939, 4939),
+  Box(4940, 4940),
+  Box(4941, 4941),
+  Box(4942, 4942),
+  Box(4943, 4943),
+  Box(4944, 4944),
+  Box(4945, 4945),
+  Box(4946, 4946),
+  Box(4947, 4947),
+  Box(4948, 4948),
+  Box(4949, 4949),
+  Box(4950, 4950),
+  Box(4951, 4951),
+  Box(4952, 4952),
+  Box(4953, 4953),
+  Box(4954, 4954),
+  Box(4955, 4955),
+  Box(4956, 4956),
+  Box(4957, 4957),
+  Box(4958, 4958),
+  Box(4959, 4959),
+  Box(4960, 4960),
+  Box(4961, 4961),
+  Box(4962, 4962),
+  Box(4963, 4963),
+  Box(4964, 4964),
+  Box(4965, 4965),
+  Box(4966, 4966),
+  Box(4967, 4967),
+  Box(4968, 4968),
+  Box(4969, 4969),
+  Box(4970, 4970),
+  Box(4971, 4971),
+  Box(4972, 4972),
+  Box(4973, 4973),
+  Box(4974, 4974),
+  Box(4975, 4975),
+  Box(4976, 4976),
+  Box(4977, 4977),
+  Box(4978, 4978),
+  Box(4979, 4979),
+  Box(4980, 4980),
+  Box(4981, 4981),
+  Box(4982, 4982),
+  Box(4983, 4983),
+  Box(4984, 4984),
+  Box(4985, 4985),
+  Box(4986, 4986),
+  Box(4987, 4987),
+  Box(4988, 4988),
+  Box(4989, 4989),
+  Box(4990, 4990),
+  Box(4991, 4991),
+  Box(4992, 4992),
+  Box(4993, 4993),
+  Box(4994, 4994),
+  Box(4995, 4995),
+  Box(4996, 4996),
+  Box(4997, 4997),
+  Box(4998, 4998),
+  Box(4999, 4999),
+  Box(5000, 5000),
+  Box(5001, 5001),
+  Box(5002, 5002),
+  Box(5003, 5003),
+  Box(5004, 5004),
+  Box(5005, 5005),
+  Box(5006, 5006),
+  Box(5007, 5007),
+  Box(5008, 5008),
+  Box(5009, 5009),
+  Box(5010, 5010),
+  Box(5011, 5011),
+  Box(5012, 5012),
+  Box(5013, 5013),
+  Box(5014, 5014),
+  Box(5015, 5015),
+  Box(5016, 5016),
+  Box(5017, 5017),
+  Box(5018, 5018),
+  Box(5019, 5019),
+  Box(5020, 5020),
+  Box(5021, 5021),
+  Box(5022, 5022),
+  Box(5023, 5023),
+  Box(5024, 5024),
+  Box(5025, 5025),
+  Box(5026, 5026),
+  Box(5027, 5027),
+  Box(5028, 5028),
+  Box(5029, 5029),
+  Box(5030, 5030),
+  Box(5031, 5031),
+  Box(5032, 5032),
+  Box(5033, 5033),
+  Box(5034, 5034),
+  Box(5035, 5035),
+  Box(5036, 5036),
+  Box(5037, 5037),
+  Box(5038, 5038),
+  Box(5039, 5039),
+  Box(5040, 5040),
+  Box(5041, 5041),
+  Box(5042, 5042),
+  Box(5043, 5043),
+  Box(5044, 5044),
+  Box(5045, 5045),
+  Box(5046, 5046),
+  Box(5047, 5047),
+  Box(5048, 5048),
+  Box(5049, 5049),
+  Box(5050, 5050),
+  Box(5051, 5051),
+  Box(5052, 5052),
+  Box(5053, 5053),
+  Box(5054, 5054),
+  Box(5055, 5055),
+  Box(5056, 5056),
+  Box(5057, 5057),
+  Box(5058, 5058),
+  Box(5059, 5059),
+  Box(5060, 5060),
+  Box(5061, 5061),
+  Box(5062, 5062),
+  Box(5063, 5063),
+  Box(5064, 5064),
+  Box(5065, 5065),
+  Box(5066, 5066),
+  Box(5067, 5067),
+  Box(5068, 5068),
+  Box(5069, 5069),
+  Box(5070, 5070),
+  Box(5071, 5071),
+  Box(5072, 5072),
+  Box(5073, 5073),
+  Box(5074, 5074),
+  Box(5075, 5075),
+  Box(5076, 5076),
+  Box(5077, 5077),
+  Box(5078, 5078),
+  Box(5079, 5079),
+  Box(5080, 5080),
+  Box(5081, 5081),
+  Box(5082, 5082),
+  Box(5083, 5083),
+  Box(5084, 5084),
+  Box(5085, 5085),
+  Box(5086, 5086),
+  Box(5087, 5087),
+  Box(5088, 5088),
+  Box(5089, 5089),
+  Box(5090, 5090),
+  Box(5091, 5091),
+  Box(5092, 5092),
+  Box(5093, 5093),
+  Box(5094, 5094),
+  Box(5095, 5095),
+  Box(5096, 5096),
+  Box(5097, 5097),
+  Box(5098, 5098),
+  Box(5099, 5099),
+  Box(5100, 5100),
+  Box(5101, 5101),
+  Box(5102, 5102),
+  Box(5103, 5103),
+  Box(5104, 5104),
+  Box(5105, 5105),
+  Box(5106, 5106),
+  Box(5107, 5107),
+  Box(5108, 5108),
+  Box(5109, 5109),
+  Box(5110, 5110),
+  Box(5111, 5111),
+  Box(5112, 5112),
+  Box(5113, 5113),
+  Box(5114, 5114),
+  Box(5115, 5115),
+  Box(5116, 5116),
+  Box(5117, 5117),
+  Box(5118, 5118),
+  Box(5119, 5119),
+  Box(5120, 5120),
+  Box(5121, 5121),
+  Box(5122, 5122),
+  Box(5123, 5123),
+  Box(5124, 5124),
+  Box(5125, 5125),
+  Box(5126, 5126),
+  Box(5127, 5127),
+  Box(5128, 5128),
+  Box(5129, 5129),
+  Box(5130, 5130),
+  Box(5131, 5131),
+  Box(5132, 5132),
+  Box(5133, 5133),
+  Box(5134, 5134),
+  Box(5135, 5135),
+  Box(5136, 5136),
+  Box(5137, 5137),
+  Box(5138, 5138),
+  Box(5139, 5139),
+  Box(5140, 5140),
+  Box(5141, 5141),
+  Box(5142, 5142),
+  Box(5143, 5143),
+  Box(5144, 5144),
+  Box(5145, 5145),
+  Box(5146, 5146),
+  Box(5147, 5147),
+  Box(5148, 5148),
+  Box(5149, 5149),
+  Box(5150, 5150),
+  Box(5151, 5151),
+  Box(5152, 5152),
+  Box(5153, 5153),
+  Box(5154, 5154),
+  Box(5155, 5155),
+  Box(5156, 5156),
+  Box(5157, 5157),
+  Box(5158, 5158),
+  Box(5159, 5159),
+  Box(5160, 5160),
+  Box(5161, 5161),
+  Box(5162, 5162),
+  Box(5163, 5163),
+  Box(5164, 5164),
+  Box(5165, 5165),
+  Box(5166, 5166),
+  Box(5167, 5167),
+  Box(5168, 5168),
+  Box(5169, 5169),
+  Box(5170, 5170),
+  Box(5171, 5171),
+  Box(5172, 5172),
+  Box(5173, 5173),
+  Box(5174, 5174),
+  Box(5175, 5175),
+  Box(5176, 5176),
+  Box(5177, 5177),
+  Box(5178, 5178),
+  Box(5179, 5179),
+  Box(5180, 5180),
+  Box(5181, 5181),
+  Box(5182, 5182),
+  Box(5183, 5183),
+  Box(5184, 5184),
+  Box(5185, 5185),
+  Box(5186, 5186),
+  Box(5187, 5187),
+  Box(5188, 5188),
+  Box(5189, 5189),
+  Box(5190, 5190),
+  Box(5191, 5191),
+  Box(5192, 5192),
+  Box(5193, 5193),
+  Box(5194, 5194),
+  Box(5195, 5195),
+  Box(5196, 5196),
+  Box(5197, 5197),
+  Box(5198, 5198),
+  Box(5199, 5199),
+  Box(5200, 5200),
+  Box(5201, 5201),
+  Box(5202, 5202),
+  Box(5203, 5203),
+  Box(5204, 5204),
+  Box(5205, 5205),
+  Box(5206, 5206),
+  Box(5207, 5207),
+  Box(5208, 5208),
+  Box(5209, 5209),
+  Box(5210, 5210),
+  Box(5211, 5211),
+  Box(5212, 5212),
+  Box(5213, 5213),
+  Box(5214, 5214),
+  Box(5215, 5215),
+  Box(5216, 5216),
+  Box(5217, 5217),
+  Box(5218, 5218),
+  Box(5219, 5219),
+  Box(5220, 5220),
+  Box(5221, 5221),
+  Box(5222, 5222),
+  Box(5223, 5223),
+  Box(5224, 5224),
+  Box(5225, 5225),
+  Box(5226, 5226),
+  Box(5227, 5227),
+  Box(5228, 5228),
+  Box(5229, 5229),
+  Box(5230, 5230),
+  Box(5231, 5231),
+  Box(5232, 5232),
+  Box(5233, 5233),
+  Box(5234, 5234),
+  Box(5235, 5235),
+  Box(5236, 5236),
+  Box(5237, 5237),
+  Box(5238, 5238),
+  Box(5239, 5239),
+  Box(5240, 5240),
+  Box(5241, 5241),
+  Box(5242, 5242),
+  Box(5243, 5243),
+  Box(5244, 5244),
+  Box(5245, 5245),
+  Box(5246, 5246),
+  Box(5247, 5247),
+  Box(5248, 5248),
+  Box(5249, 5249),
+  Box(5250, 5250),
+  Box(5251, 5251),
+  Box(5252, 5252),
+  Box(5253, 5253),
+  Box(5254, 5254),
+  Box(5255, 5255),
+  Box(5256, 5256),
+  Box(5257, 5257),
+  Box(5258, 5258),
+  Box(5259, 5259),
+  Box(5260, 5260),
+  Box(5261, 5261),
+  Box(5262, 5262),
+  Box(5263, 5263),
+  Box(5264, 5264),
+  Box(5265, 5265),
+  Box(5266, 5266),
+  Box(5267, 5267),
+  Box(5268, 5268),
+  Box(5269, 5269),
+  Box(5270, 5270),
+  Box(5271, 5271),
+  Box(5272, 5272),
+  Box(5273, 5273),
+  Box(5274, 5274),
+  Box(5275, 5275),
+  Box(5276, 5276),
+  Box(5277, 5277),
+  Box(5278, 5278),
+  Box(5279, 5279),
+  Box(5280, 5280),
+  Box(5281, 5281),
+  Box(5282, 5282),
+  Box(5283, 5283),
+  Box(5284, 5284),
+  Box(5285, 5285),
+  Box(5286, 5286),
+  Box(5287, 5287),
+  Box(5288, 5288),
+  Box(5289, 5289),
+  Box(5290, 5290),
+  Box(5291, 5291),
+  Box(5292, 5292),
+  Box(5293, 5293),
+  Box(5294, 5294),
+  Box(5295, 5295),
+  Box(5296, 5296),
+  Box(5297, 5297),
+  Box(5298, 5298),
+  Box(5299, 5299),
+  Box(5300, 5300),
+  Box(5301, 5301),
+  Box(5302, 5302),
+  Box(5303, 5303),
+  Box(5304, 5304),
+  Box(5305, 5305),
+  Box(5306, 5306),
+  Box(5307, 5307),
+  Box(5308, 5308),
+  Box(5309, 5309),
+  Box(5310, 5310),
+  Box(5311, 5311),
+  Box(5312, 5312),
+  Box(5313, 5313),
+  Box(5314, 5314),
+  Box(5315, 5315),
+  Box(5316, 5316),
+  Box(5317, 5317),
+  Box(5318, 5318),
+  Box(5319, 5319),
+  Box(5320, 5320),
+  Box(5321, 5321),
+  Box(5322, 5322),
+  Box(5323, 5323),
+  Box(5324, 5324),
+  Box(5325, 5325),
+  Box(5326, 5326),
+  Box(5327, 5327),
+  Box(5328, 5328),
+  Box(5329, 5329),
+  Box(5330, 5330),
+  Box(5331, 5331),
+  Box(5332, 5332),
+  Box(5333, 5333),
+  Box(5334, 5334),
+  Box(5335, 5335),
+  Box(5336, 5336),
+  Box(5337, 5337),
+  Box(5338, 5338),
+  Box(5339, 5339),
+  Box(5340, 5340),
+  Box(5341, 5341),
+  Box(5342, 5342),
+  Box(5343, 5343),
+  Box(5344, 5344),
+  Box(5345, 5345),
+  Box(5346, 5346),
+  Box(5347, 5347),
+  Box(5348, 5348),
+  Box(5349, 5349),
+  Box(5350, 5350),
+  Box(5351, 5351),
+  Box(5352, 5352),
+  Box(5353, 5353),
+  Box(5354, 5354),
+  Box(5355, 5355),
+  Box(5356, 5356),
+  Box(5357, 5357),
+  Box(5358, 5358),
+  Box(5359, 5359),
+  Box(5360, 5360),
+  Box(5361, 5361),
+  Box(5362, 5362),
+  Box(5363, 5363),
+  Box(5364, 5364),
+  Box(5365, 5365),
+  Box(5366, 5366),
+  Box(5367, 5367),
+  Box(5368, 5368),
+  Box(5369, 5369),
+  Box(5370, 5370),
+  Box(5371, 5371),
+  Box(5372, 5372),
+  Box(5373, 5373),
+  Box(5374, 5374),
+  Box(5375, 5375),
+  Box(5376, 5376),
+  Box(5377, 5377),
+  Box(5378, 5378),
+  Box(5379, 5379),
+  Box(5380, 5380),
+  Box(5381, 5381),
+  Box(5382, 5382),
+  Box(5383, 5383),
+  Box(5384, 5384),
+  Box(5385, 5385),
+  Box(5386, 5386),
+  Box(5387, 5387),
+  Box(5388, 5388),
+  Box(5389, 5389),
+  Box(5390, 5390),
+  Box(5391, 5391),
+  Box(5392, 5392),
+  Box(5393, 5393),
+  Box(5394, 5394),
+  Box(5395, 5395),
+  Box(5396, 5396),
+  Box(5397, 5397),
+  Box(5398, 5398),
+  Box(5399, 5399),
+  Box(5400, 5400),
+  Box(5401, 5401),
+  Box(5402, 5402),
+  Box(5403, 5403),
+  Box(5404, 5404),
+  Box(5405, 5405),
+  Box(5406, 5406),
+  Box(5407, 5407),
+  Box(5408, 5408),
+  Box(5409, 5409),
+  Box(5410, 5410),
+  Box(5411, 5411),
+  Box(5412, 5412),
+  Box(5413, 5413),
+  Box(5414, 5414),
+  Box(5415, 5415),
+  Box(5416, 5416),
+  Box(5417, 5417),
+  Box(5418, 5418),
+  Box(5419, 5419),
+  Box(5420, 5420),
+  Box(5421, 5421),
+  Box(5422, 5422),
+  Box(5423, 5423),
+  Box(5424, 5424),
+  Box(5425, 5425),
+  Box(5426, 5426),
+  Box(5427, 5427),
+  Box(5428, 5428),
+  Box(5429, 5429),
+  Box(5430, 5430),
+  Box(5431, 5431),
+  Box(5432, 5432),
+  Box(5433, 5433),
+  Box(5434, 5434),
+  Box(5435, 5435),
+  Box(5436, 5436),
+  Box(5437, 5437),
+  Box(5438, 5438),
+  Box(5439, 5439),
+  Box(5440, 5440),
+  Box(5441, 5441),
+  Box(5442, 5442),
+  Box(5443, 5443),
+  Box(5444, 5444),
+  Box(5445, 5445),
+  Box(5446, 5446),
+  Box(5447, 5447),
+  Box(5448, 5448),
+  Box(5449, 5449),
+  Box(5450, 5450),
+  Box(5451, 5451),
+  Box(5452, 5452),
+  Box(5453, 5453),
+  Box(5454, 5454),
+  Box(5455, 5455),
+  Box(5456, 5456),
+  Box(5457, 5457),
+  Box(5458, 5458),
+  Box(5459, 5459),
+  Box(5460, 5460),
+  Box(5461, 5461),
+  Box(5462, 5462),
+  Box(5463, 5463),
+  Box(5464, 5464),
+  Box(5465, 5465),
+  Box(5466, 5466),
+  Box(5467, 5467),
+  Box(5468, 5468),
+  Box(5469, 5469),
+  Box(5470, 5470),
+  Box(5471, 5471),
+  Box(5472, 5472),
+  Box(5473, 5473),
+  Box(5474, 5474),
+  Box(5475, 5475),
+  Box(5476, 5476),
+  Box(5477, 5477),
+  Box(5478, 5478),
+  Box(5479, 5479),
+  Box(5480, 5480),
+  Box(5481, 5481),
+  Box(5482, 5482),
+  Box(5483, 5483),
+  Box(5484, 5484),
+  Box(5485, 5485),
+  Box(5486, 5486),
+  Box(5487, 5487),
+  Box(5488, 5488),
+  Box(5489, 5489),
+  Box(5490, 5490),
+  Box(5491, 5491),
+  Box(5492, 5492),
+  Box(5493, 5493),
+  Box(5494, 5494),
+  Box(5495, 5495),
+  Box(5496, 5496),
+  Box(5497, 5497),
+  Box(5498, 5498),
+  Box(5499, 5499),
+  Box(5500, 5500),
+  Box(5501, 5501),
+  Box(5502, 5502),
+  Box(5503, 5503),
+  Box(5504, 5504),
+  Box(5505, 5505),
+  Box(5506, 5506),
+  Box(5507, 5507),
+  Box(5508, 5508),
+  Box(5509, 5509),
+  Box(5510, 5510),
+  Box(5511, 5511),
+  Box(5512, 5512),
+  Box(5513, 5513),
+  Box(5514, 5514),
+  Box(5515, 5515),
+  Box(5516, 5516),
+  Box(5517, 5517),
+  Box(5518, 5518),
+  Box(5519, 5519),
+  Box(5520, 5520),
+  Box(5521, 5521),
+  Box(5522, 5522),
+  Box(5523, 5523),
+  Box(5524, 5524),
+  Box(5525, 5525),
+  Box(5526, 5526),
+  Box(5527, 5527),
+  Box(5528, 5528),
+  Box(5529, 5529),
+  Box(5530, 5530),
+  Box(5531, 5531),
+  Box(5532, 5532),
+  Box(5533, 5533),
+  Box(5534, 5534),
+  Box(5535, 5535),
+  Box(5536, 5536),
+  Box(5537, 5537),
+  Box(5538, 5538),
+  Box(5539, 5539),
+  Box(5540, 5540),
+  Box(5541, 5541),
+  Box(5542, 5542),
+  Box(5543, 5543),
+  Box(5544, 5544),
+  Box(5545, 5545),
+  Box(5546, 5546),
+  Box(5547, 5547),
+  Box(5548, 5548),
+  Box(5549, 5549),
+  Box(5550, 5550),
+  Box(5551, 5551),
+  Box(5552, 5552),
+  Box(5553, 5553),
+  Box(5554, 5554),
+  Box(5555, 5555),
+  Box(5556, 5556),
+  Box(5557, 5557),
+  Box(5558, 5558),
+  Box(5559, 5559),
+  Box(5560, 5560),
+  Box(5561, 5561),
+  Box(5562, 5562),
+  Box(5563, 5563),
+  Box(5564, 5564),
+  Box(5565, 5565),
+  Box(5566, 5566),
+  Box(5567, 5567),
+  Box(5568, 5568),
+  Box(5569, 5569),
+  Box(5570, 5570),
+  Box(5571, 5571),
+  Box(5572, 5572),
+  Box(5573, 5573),
+  Box(5574, 5574),
+  Box(5575, 5575),
+  Box(5576, 5576),
+  Box(5577, 5577),
+  Box(5578, 5578),
+  Box(5579, 5579),
+  Box(5580, 5580),
+  Box(5581, 5581),
+  Box(5582, 5582),
+  Box(5583, 5583),
+  Box(5584, 5584),
+  Box(5585, 5585),
+  Box(5586, 5586),
+  Box(5587, 5587),
+  Box(5588, 5588),
+  Box(5589, 5589),
+  Box(5590, 5590),
+  Box(5591, 5591),
+  Box(5592, 5592),
+  Box(5593, 5593),
+  Box(5594, 5594),
+  Box(5595, 5595),
+  Box(5596, 5596),
+  Box(5597, 5597),
+  Box(5598, 5598),
+  Box(5599, 5599),
+  Box(5600, 5600),
+  Box(5601, 5601),
+  Box(5602, 5602),
+  Box(5603, 5603),
+  Box(5604, 5604),
+  Box(5605, 5605),
+  Box(5606, 5606),
+  Box(5607, 5607),
+  Box(5608, 5608),
+  Box(5609, 5609),
+  Box(5610, 5610),
+  Box(5611, 5611),
+  Box(5612, 5612),
+  Box(5613, 5613),
+  Box(5614, 5614),
+  Box(5615, 5615),
+  Box(5616, 5616),
+  Box(5617, 5617),
+  Box(5618, 5618),
+  Box(5619, 5619),
+  Box(5620, 5620),
+  Box(5621, 5621),
+  Box(5622, 5622),
+  Box(5623, 5623),
+  Box(5624, 5624),
+  Box(5625, 5625),
+  Box(5626, 5626),
+  Box(5627, 5627),
+  Box(5628, 5628),
+  Box(5629, 5629),
+  Box(5630, 5630),
+  Box(5631, 5631),
+  Box(5632, 5632),
+  Box(5633, 5633),
+  Box(5634, 5634),
+  Box(5635, 5635),
+  Box(5636, 5636),
+  Box(5637, 5637),
+  Box(5638, 5638),
+  Box(5639, 5639),
+  Box(5640, 5640),
+  Box(5641, 5641),
+  Box(5642, 5642),
+  Box(5643, 5643),
+  Box(5644, 5644),
+  Box(5645, 5645),
+  Box(5646, 5646),
+  Box(5647, 5647),
+  Box(5648, 5648),
+  Box(5649, 5649),
+  Box(5650, 5650),
+  Box(5651, 5651),
+  Box(5652, 5652),
+  Box(5653, 5653),
+  Box(5654, 5654),
+  Box(5655, 5655),
+  Box(5656, 5656),
+  Box(5657, 5657),
+  Box(5658, 5658),
+  Box(5659, 5659),
+  Box(5660, 5660),
+  Box(5661, 5661),
+  Box(5662, 5662),
+  Box(5663, 5663),
+  Box(5664, 5664),
+  Box(5665, 5665),
+  Box(5666, 5666),
+  Box(5667, 5667),
+  Box(5668, 5668),
+  Box(5669, 5669),
+  Box(5670, 5670),
+  Box(5671, 5671),
+  Box(5672, 5672),
+  Box(5673, 5673),
+  Box(5674, 5674),
+  Box(5675, 5675),
+  Box(5676, 5676),
+  Box(5677, 5677),
+  Box(5678, 5678),
+  Box(5679, 5679),
+  Box(5680, 5680),
+  Box(5681, 5681),
+  Box(5682, 5682),
+  Box(5683, 5683),
+  Box(5684, 5684),
+  Box(5685, 5685),
+  Box(5686, 5686),
+  Box(5687, 5687),
+  Box(5688, 5688),
+  Box(5689, 5689),
+  Box(5690, 5690),
+  Box(5691, 5691),
+  Box(5692, 5692),
+  Box(5693, 5693),
+  Box(5694, 5694),
+  Box(5695, 5695),
+  Box(5696, 5696),
+  Box(5697, 5697),
+  Box(5698, 5698),
+  Box(5699, 5699),
+  Box(5700, 5700),
+  Box(5701, 5701),
+  Box(5702, 5702),
+  Box(5703, 5703),
+  Box(5704, 5704),
+  Box(5705, 5705),
+  Box(5706, 5706),
+  Box(5707, 5707),
+  Box(5708, 5708),
+  Box(5709, 5709),
+  Box(5710, 5710),
+  Box(5711, 5711),
+  Box(5712, 5712),
+  Box(5713, 5713),
+  Box(5714, 5714),
+  Box(5715, 5715),
+  Box(5716, 5716),
+  Box(5717, 5717),
+  Box(5718, 5718),
+  Box(5719, 5719),
+  Box(5720, 5720),
+  Box(5721, 5721),
+  Box(5722, 5722),
+  Box(5723, 5723),
+  Box(5724, 5724),
+  Box(5725, 5725),
+  Box(5726, 5726),
+  Box(5727, 5727),
+  Box(5728, 5728),
+  Box(5729, 5729),
+  Box(5730, 5730),
+  Box(5731, 5731),
+  Box(5732, 5732),
+  Box(5733, 5733),
+  Box(5734, 5734),
+  Box(5735, 5735),
+  Box(5736, 5736),
+  Box(5737, 5737),
+  Box(5738, 5738),
+  Box(5739, 5739),
+  Box(5740, 5740),
+  Box(5741, 5741),
+  Box(5742, 5742),
+  Box(5743, 5743),
+  Box(5744, 5744),
+  Box(5745, 5745),
+  Box(5746, 5746),
+  Box(5747, 5747),
+  Box(5748, 5748),
+  Box(5749, 5749),
+  Box(5750, 5750),
+  Box(5751, 5751),
+  Box(5752, 5752),
+  Box(5753, 5753),
+  Box(5754, 5754),
+  Box(5755, 5755),
+  Box(5756, 5756),
+  Box(5757, 5757),
+  Box(5758, 5758),
+  Box(5759, 5759),
+  Box(5760, 5760),
+  Box(5761, 5761),
+  Box(5762, 5762),
+  Box(5763, 5763),
+  Box(5764, 5764),
+  Box(5765, 5765),
+  Box(5766, 5766),
+  Box(5767, 5767),
+  Box(5768, 5768),
+  Box(5769, 5769),
+  Box(5770, 5770),
+  Box(5771, 5771),
+  Box(5772, 5772),
+  Box(5773, 5773),
+  Box(5774, 5774),
+  Box(5775, 5775),
+  Box(5776, 5776),
+  Box(5777, 5777),
+  Box(5778, 5778),
+  Box(5779, 5779),
+  Box(5780, 5780),
+  Box(5781, 5781),
+  Box(5782, 5782),
+  Box(5783, 5783),
+  Box(5784, 5784),
+  Box(5785, 5785),
+  Box(5786, 5786),
+  Box(5787, 5787),
+  Box(5788, 5788),
+  Box(5789, 5789),
+  Box(5790, 5790),
+  Box(5791, 5791),
+  Box(5792, 5792),
+  Box(5793, 5793),
+  Box(5794, 5794),
+  Box(5795, 5795),
+  Box(5796, 5796),
+  Box(5797, 5797),
+  Box(5798, 5798),
+  Box(5799, 5799),
+  Box(5800, 5800),
+  Box(5801, 5801),
+  Box(5802, 5802),
+  Box(5803, 5803),
+  Box(5804, 5804),
+  Box(5805, 5805),
+  Box(5806, 5806),
+  Box(5807, 5807),
+  Box(5808, 5808),
+  Box(5809, 5809),
+  Box(5810, 5810),
+  Box(5811, 5811),
+  Box(5812, 5812),
+  Box(5813, 5813),
+  Box(5814, 5814),
+  Box(5815, 5815),
+  Box(5816, 5816),
+  Box(5817, 5817),
+  Box(5818, 5818),
+  Box(5819, 5819),
+  Box(5820, 5820),
+  Box(5821, 5821),
+  Box(5822, 5822),
+  Box(5823, 5823),
+  Box(5824, 5824),
+  Box(5825, 5825),
+  Box(5826, 5826),
+  Box(5827, 5827),
+  Box(5828, 5828),
+  Box(5829, 5829),
+  Box(5830, 5830),
+  Box(5831, 5831),
+  Box(5832, 5832),
+  Box(5833, 5833),
+  Box(5834, 5834),
+  Box(5835, 5835),
+  Box(5836, 5836),
+  Box(5837, 5837),
+  Box(5838, 5838),
+  Box(5839, 5839),
+  Box(5840, 5840),
+  Box(5841, 5841),
+  Box(5842, 5842),
+  Box(5843, 5843),
+  Box(5844, 5844),
+  Box(5845, 5845),
+  Box(5846, 5846),
+  Box(5847, 5847),
+  Box(5848, 5848),
+  Box(5849, 5849),
+  Box(5850, 5850),
+  Box(5851, 5851),
+  Box(5852, 5852),
+  Box(5853, 5853),
+  Box(5854, 5854),
+  Box(5855, 5855),
+  Box(5856, 5856),
+  Box(5857, 5857),
+  Box(5858, 5858),
+  Box(5859, 5859),
+  Box(5860, 5860),
+  Box(5861, 5861),
+  Box(5862, 5862),
+  Box(5863, 5863),
+  Box(5864, 5864),
+  Box(5865, 5865),
+  Box(5866, 5866),
+  Box(5867, 5867),
+  Box(5868, 5868),
+  Box(5869, 5869),
+  Box(5870, 5870),
+  Box(5871, 5871),
+  Box(5872, 5872),
+  Box(5873, 5873),
+  Box(5874, 5874),
+  Box(5875, 5875),
+  Box(5876, 5876),
+  Box(5877, 5877),
+  Box(5878, 5878),
+  Box(5879, 5879),
+  Box(5880, 5880),
+  Box(5881, 5881),
+  Box(5882, 5882),
+  Box(5883, 5883),
+  Box(5884, 5884),
+  Box(5885, 5885),
+  Box(5886, 5886),
+  Box(5887, 5887),
+  Box(5888, 5888),
+  Box(5889, 5889),
+  Box(5890, 5890),
+  Box(5891, 5891),
+  Box(5892, 5892),
+  Box(5893, 5893),
+  Box(5894, 5894),
+  Box(5895, 5895),
+  Box(5896, 5896),
+  Box(5897, 5897),
+  Box(5898, 5898),
+  Box(5899, 5899),
+  Box(5900, 5900),
+  Box(5901, 5901),
+  Box(5902, 5902),
+  Box(5903, 5903),
+  Box(5904, 5904),
+  Box(5905, 5905),
+  Box(5906, 5906),
+  Box(5907, 5907),
+  Box(5908, 5908),
+  Box(5909, 5909),
+  Box(5910, 5910),
+  Box(5911, 5911),
+  Box(5912, 5912),
+  Box(5913, 5913),
+  Box(5914, 5914),
+  Box(5915, 5915),
+  Box(5916, 5916),
+  Box(5917, 5917),
+  Box(5918, 5918),
+  Box(5919, 5919),
+  Box(5920, 5920),
+  Box(5921, 5921),
+  Box(5922, 5922),
+  Box(5923, 5923),
+  Box(5924, 5924),
+  Box(5925, 5925),
+  Box(5926, 5926),
+  Box(5927, 5927),
+  Box(5928, 5928),
+  Box(5929, 5929),
+  Box(5930, 5930),
+  Box(5931, 5931),
+  Box(5932, 5932),
+  Box(5933, 5933),
+  Box(5934, 5934),
+  Box(5935, 5935),
+  Box(5936, 5936),
+  Box(5937, 5937),
+  Box(5938, 5938),
+  Box(5939, 5939),
+  Box(5940, 5940),
+  Box(5941, 5941),
+  Box(5942, 5942),
+  Box(5943, 5943),
+  Box(5944, 5944),
+  Box(5945, 5945),
+  Box(5946, 5946),
+  Box(5947, 5947),
+  Box(5948, 5948),
+  Box(5949, 5949),
+  Box(5950, 5950),
+  Box(5951, 5951),
+  Box(5952, 5952),
+  Box(5953, 5953),
+  Box(5954, 5954),
+  Box(5955, 5955),
+  Box(5956, 5956),
+  Box(5957, 5957),
+  Box(5958, 5958),
+  Box(5959, 5959),
+  Box(5960, 5960),
+  Box(5961, 5961),
+  Box(5962, 5962),
+  Box(5963, 5963),
+  Box(5964, 5964),
+  Box(5965, 5965),
+  Box(5966, 5966),
+  Box(5967, 5967),
+  Box(5968, 5968),
+  Box(5969, 5969),
+  Box(5970, 5970),
+  Box(5971, 5971),
+  Box(5972, 5972),
+  Box(5973, 5973),
+  Box(5974, 5974),
+  Box(5975, 5975),
+  Box(5976, 5976),
+  Box(5977, 5977),
+  Box(5978, 5978),
+  Box(5979, 5979),
+  Box(5980, 5980),
+  Box(5981, 5981),
+  Box(5982, 5982),
+  Box(5983, 5983),
+  Box(5984, 5984),
+  Box(5985, 5985),
+  Box(5986, 5986),
+  Box(5987, 5987),
+  Box(5988, 5988),
+  Box(5989, 5989),
+  Box(5990, 5990),
+  Box(5991, 5991),
+  Box(5992, 5992),
+  Box(5993, 5993),
+  Box(5994, 5994),
+  Box(5995, 5995),
+  Box(5996, 5996),
+  Box(5997, 5997),
+  Box(5998, 5998),
+  Box(5999, 5999),
+  Box(6000, 6000),
+  Box(6001, 6001),
+  Box(6002, 6002),
+  Box(6003, 6003),
+  Box(6004, 6004),
+  Box(6005, 6005),
+  Box(6006, 6006),
+  Box(6007, 6007),
+  Box(6008, 6008),
+  Box(6009, 6009),
+  Box(6010, 6010),
+  Box(6011, 6011),
+  Box(6012, 6012),
+  Box(6013, 6013),
+  Box(6014, 6014),
+  Box(6015, 6015),
+  Box(6016, 6016),
+  Box(6017, 6017),
+  Box(6018, 6018),
+  Box(6019, 6019),
+  Box(6020, 6020),
+  Box(6021, 6021),
+  Box(6022, 6022),
+  Box(6023, 6023),
+  Box(6024, 6024),
+  Box(6025, 6025),
+  Box(6026, 6026),
+  Box(6027, 6027),
+  Box(6028, 6028),
+  Box(6029, 6029),
+  Box(6030, 6030),
+  Box(6031, 6031),
+  Box(6032, 6032),
+  Box(6033, 6033),
+  Box(6034, 6034),
+  Box(6035, 6035),
+  Box(6036, 6036),
+  Box(6037, 6037),
+  Box(6038, 6038),
+  Box(6039, 6039),
+  Box(6040, 6040),
+  Box(6041, 6041),
+  Box(6042, 6042),
+  Box(6043, 6043),
+  Box(6044, 6044),
+  Box(6045, 6045),
+  Box(6046, 6046),
+  Box(6047, 6047),
+  Box(6048, 6048),
+  Box(6049, 6049),
+  Box(6050, 6050),
+  Box(6051, 6051),
+  Box(6052, 6052),
+  Box(6053, 6053),
+  Box(6054, 6054),
+  Box(6055, 6055),
+  Box(6056, 6056),
+  Box(6057, 6057),
+  Box(6058, 6058),
+  Box(6059, 6059),
+  Box(6060, 6060),
+  Box(6061, 6061),
+  Box(6062, 6062),
+  Box(6063, 6063),
+  Box(6064, 6064),
+  Box(6065, 6065),
+  Box(6066, 6066),
+  Box(6067, 6067),
+  Box(6068, 6068),
+  Box(6069, 6069),
+  Box(6070, 6070),
+  Box(6071, 6071),
+  Box(6072, 6072),
+  Box(6073, 6073),
+  Box(6074, 6074),
+  Box(6075, 6075),
+  Box(6076, 6076),
+  Box(6077, 6077),
+  Box(6078, 6078),
+  Box(6079, 6079),
+  Box(6080, 6080),
+  Box(6081, 6081),
+  Box(6082, 6082),
+  Box(6083, 6083),
+  Box(6084, 6084),
+  Box(6085, 6085),
+  Box(6086, 6086),
+  Box(6087, 6087),
+  Box(6088, 6088),
+  Box(6089, 6089),
+  Box(6090, 6090),
+  Box(6091, 6091),
+  Box(6092, 6092),
+  Box(6093, 6093),
+  Box(6094, 6094),
+  Box(6095, 6095),
+  Box(6096, 6096),
+  Box(6097, 6097),
+  Box(6098, 6098),
+  Box(6099, 6099),
+  Box(6100, 6100),
+  Box(6101, 6101),
+  Box(6102, 6102),
+  Box(6103, 6103),
+  Box(6104, 6104),
+  Box(6105, 6105),
+  Box(6106, 6106),
+  Box(6107, 6107),
+  Box(6108, 6108),
+  Box(6109, 6109),
+  Box(6110, 6110),
+  Box(6111, 6111),
+  Box(6112, 6112),
+  Box(6113, 6113),
+  Box(6114, 6114),
+  Box(6115, 6115),
+  Box(6116, 6116),
+  Box(6117, 6117),
+  Box(6118, 6118),
+  Box(6119, 6119),
+  Box(6120, 6120),
+  Box(6121, 6121),
+  Box(6122, 6122),
+  Box(6123, 6123),
+  Box(6124, 6124),
+  Box(6125, 6125),
+  Box(6126, 6126),
+  Box(6127, 6127),
+  Box(6128, 6128),
+  Box(6129, 6129),
+  Box(6130, 6130),
+  Box(6131, 6131),
+  Box(6132, 6132),
+  Box(6133, 6133),
+  Box(6134, 6134),
+  Box(6135, 6135),
+  Box(6136, 6136),
+  Box(6137, 6137),
+  Box(6138, 6138),
+  Box(6139, 6139),
+  Box(6140, 6140),
+  Box(6141, 6141),
+  Box(6142, 6142),
+  Box(6143, 6143),
+  Box(6144, 6144),
+  Box(6145, 6145),
+  Box(6146, 6146),
+  Box(6147, 6147),
+  Box(6148, 6148),
+  Box(6149, 6149),
+  Box(6150, 6150),
+  Box(6151, 6151),
+  Box(6152, 6152),
+  Box(6153, 6153),
+  Box(6154, 6154),
+  Box(6155, 6155),
+  Box(6156, 6156),
+  Box(6157, 6157),
+  Box(6158, 6158),
+  Box(6159, 6159),
+  Box(6160, 6160),
+  Box(6161, 6161),
+  Box(6162, 6162),
+  Box(6163, 6163),
+  Box(6164, 6164),
+  Box(6165, 6165),
+  Box(6166, 6166),
+  Box(6167, 6167),
+  Box(6168, 6168),
+  Box(6169, 6169),
+  Box(6170, 6170),
+  Box(6171, 6171),
+  Box(6172, 6172),
+  Box(6173, 6173),
+  Box(6174, 6174),
+  Box(6175, 6175),
+  Box(6176, 6176),
+  Box(6177, 6177),
+  Box(6178, 6178),
+  Box(6179, 6179),
+  Box(6180, 6180),
+  Box(6181, 6181),
+  Box(6182, 6182),
+  Box(6183, 6183),
+  Box(6184, 6184),
+  Box(6185, 6185),
+  Box(6186, 6186),
+  Box(6187, 6187),
+  Box(6188, 6188),
+  Box(6189, 6189),
+  Box(6190, 6190),
+  Box(6191, 6191),
+  Box(6192, 6192),
+  Box(6193, 6193),
+  Box(6194, 6194),
+  Box(6195, 6195),
+  Box(6196, 6196),
+  Box(6197, 6197),
+  Box(6198, 6198),
+  Box(6199, 6199),
+  Box(6200, 6200),
+  Box(6201, 6201),
+  Box(6202, 6202),
+  Box(6203, 6203),
+  Box(6204, 6204),
+  Box(6205, 6205),
+  Box(6206, 6206),
+  Box(6207, 6207),
+  Box(6208, 6208),
+  Box(6209, 6209),
+  Box(6210, 6210),
+  Box(6211, 6211),
+  Box(6212, 6212),
+  Box(6213, 6213),
+  Box(6214, 6214),
+  Box(6215, 6215),
+  Box(6216, 6216),
+  Box(6217, 6217),
+  Box(6218, 6218),
+  Box(6219, 6219),
+  Box(6220, 6220),
+  Box(6221, 6221),
+  Box(6222, 6222),
+  Box(6223, 6223),
+  Box(6224, 6224),
+  Box(6225, 6225),
+  Box(6226, 6226),
+  Box(6227, 6227),
+  Box(6228, 6228),
+  Box(6229, 6229),
+  Box(6230, 6230),
+  Box(6231, 6231),
+  Box(6232, 6232),
+  Box(6233, 6233),
+  Box(6234, 6234),
+  Box(6235, 6235),
+  Box(6236, 6236),
+  Box(6237, 6237),
+  Box(6238, 6238),
+  Box(6239, 6239),
+  Box(6240, 6240),
+  Box(6241, 6241),
+  Box(6242, 6242),
+  Box(6243, 6243),
+  Box(6244, 6244),
+  Box(6245, 6245),
+  Box(6246, 6246),
+  Box(6247, 6247),
+  Box(6248, 6248),
+  Box(6249, 6249),
+  Box(6250, 6250),
+  Box(6251, 6251),
+  Box(6252, 6252),
+  Box(6253, 6253),
+  Box(6254, 6254),
+  Box(6255, 6255),
+  Box(6256, 6256),
+  Box(6257, 6257),
+  Box(6258, 6258),
+  Box(6259, 6259),
+  Box(6260, 6260),
+  Box(6261, 6261),
+  Box(6262, 6262),
+  Box(6263, 6263),
+  Box(6264, 6264),
+  Box(6265, 6265),
+  Box(6266, 6266),
+  Box(6267, 6267),
+  Box(6268, 6268),
+  Box(6269, 6269),
+  Box(6270, 6270),
+  Box(6271, 6271),
+  Box(6272, 6272),
+  Box(6273, 6273),
+  Box(6274, 6274),
+  Box(6275, 6275),
+  Box(6276, 6276),
+  Box(6277, 6277),
+  Box(6278, 6278),
+  Box(6279, 6279),
+  Box(6280, 6280),
+  Box(6281, 6281),
+  Box(6282, 6282),
+  Box(6283, 6283),
+  Box(6284, 6284),
+  Box(6285, 6285),
+  Box(6286, 6286),
+  Box(6287, 6287),
+  Box(6288, 6288),
+  Box(6289, 6289),
+  Box(6290, 6290),
+  Box(6291, 6291),
+  Box(6292, 6292),
+  Box(6293, 6293),
+  Box(6294, 6294),
+  Box(6295, 6295),
+  Box(6296, 6296),
+  Box(6297, 6297),
+  Box(6298, 6298),
+  Box(6299, 6299),
+  Box(6300, 6300),
+  Box(6301, 6301),
+  Box(6302, 6302),
+  Box(6303, 6303),
+  Box(6304, 6304),
+  Box(6305, 6305),
+  Box(6306, 6306),
+  Box(6307, 6307),
+  Box(6308, 6308),
+  Box(6309, 6309),
+  Box(6310, 6310),
+  Box(6311, 6311),
+  Box(6312, 6312),
+  Box(6313, 6313),
+  Box(6314, 6314),
+  Box(6315, 6315),
+  Box(6316, 6316),
+  Box(6317, 6317),
+  Box(6318, 6318),
+  Box(6319, 6319),
+  Box(6320, 6320),
+  Box(6321, 6321),
+  Box(6322, 6322),
+  Box(6323, 6323),
+  Box(6324, 6324),
+  Box(6325, 6325),
+  Box(6326, 6326),
+  Box(6327, 6327),
+  Box(6328, 6328),
+  Box(6329, 6329),
+  Box(6330, 6330),
+  Box(6331, 6331),
+  Box(6332, 6332),
+  Box(6333, 6333),
+  Box(6334, 6334),
+  Box(6335, 6335),
+  Box(6336, 6336),
+  Box(6337, 6337),
+  Box(6338, 6338),
+  Box(6339, 6339),
+  Box(6340, 6340),
+  Box(6341, 6341),
+  Box(6342, 6342),
+  Box(6343, 6343),
+  Box(6344, 6344),
+  Box(6345, 6345),
+  Box(6346, 6346),
+  Box(6347, 6347),
+  Box(6348, 6348),
+  Box(6349, 6349),
+  Box(6350, 6350),
+  Box(6351, 6351),
+  Box(6352, 6352),
+  Box(6353, 6353),
+  Box(6354, 6354),
+  Box(6355, 6355),
+  Box(6356, 6356),
+  Box(6357, 6357),
+  Box(6358, 6358),
+  Box(6359, 6359),
+  Box(6360, 6360),
+  Box(6361, 6361),
+  Box(6362, 6362),
+  Box(6363, 6363),
+  Box(6364, 6364),
+  Box(6365, 6365),
+  Box(6366, 6366),
+  Box(6367, 6367),
+  Box(6368, 6368),
+  Box(6369, 6369),
+  Box(6370, 6370),
+  Box(6371, 6371),
+  Box(6372, 6372),
+  Box(6373, 6373),
+  Box(6374, 6374),
+  Box(6375, 6375),
+  Box(6376, 6376),
+  Box(6377, 6377),
+  Box(6378, 6378),
+  Box(6379, 6379),
+  Box(6380, 6380),
+  Box(6381, 6381),
+  Box(6382, 6382),
+  Box(6383, 6383),
+  Box(6384, 6384),
+  Box(6385, 6385),
+  Box(6386, 6386),
+  Box(6387, 6387),
+  Box(6388, 6388),
+  Box(6389, 6389),
+  Box(6390, 6390),
+  Box(6391, 6391),
+  Box(6392, 6392),
+  Box(6393, 6393),
+  Box(6394, 6394),
+  Box(6395, 6395),
+  Box(6396, 6396),
+  Box(6397, 6397),
+  Box(6398, 6398),
+  Box(6399, 6399),
+  Box(6400, 6400),
+  Box(6401, 6401),
+  Box(6402, 6402),
+  Box(6403, 6403),
+  Box(6404, 6404),
+  Box(6405, 6405),
+  Box(6406, 6406),
+  Box(6407, 6407),
+  Box(6408, 6408),
+  Box(6409, 6409),
+  Box(6410, 6410),
+  Box(6411, 6411),
+  Box(6412, 6412),
+  Box(6413, 6413),
+  Box(6414, 6414),
+  Box(6415, 6415),
+  Box(6416, 6416),
+  Box(6417, 6417),
+  Box(6418, 6418),
+  Box(6419, 6419),
+  Box(6420, 6420),
+  Box(6421, 6421),
+  Box(6422, 6422),
+  Box(6423, 6423),
+  Box(6424, 6424),
+  Box(6425, 6425),
+  Box(6426, 6426),
+  Box(6427, 6427),
+  Box(6428, 6428),
+  Box(6429, 6429),
+  Box(6430, 6430),
+  Box(6431, 6431),
+  Box(6432, 6432),
+  Box(6433, 6433),
+  Box(6434, 6434),
+  Box(6435, 6435),
+  Box(6436, 6436),
+  Box(6437, 6437),
+  Box(6438, 6438),
+  Box(6439, 6439),
+  Box(6440, 6440),
+  Box(6441, 6441),
+  Box(6442, 6442),
+  Box(6443, 6443),
+  Box(6444, 6444),
+  Box(6445, 6445),
+  Box(6446, 6446),
+  Box(6447, 6447),
+  Box(6448, 6448),
+  Box(6449, 6449),
+  Box(6450, 6450),
+  Box(6451, 6451),
+  Box(6452, 6452),
+  Box(6453, 6453),
+  Box(6454, 6454),
+  Box(6455, 6455),
+  Box(6456, 6456),
+  Box(6457, 6457),
+  Box(6458, 6458),
+  Box(6459, 6459),
+  Box(6460, 6460),
+  Box(6461, 6461),
+  Box(6462, 6462),
+  Box(6463, 6463),
+  Box(6464, 6464),
+  Box(6465, 6465),
+  Box(6466, 6466),
+  Box(6467, 6467),
+  Box(6468, 6468),
+  Box(6469, 6469),
+  Box(6470, 6470),
+  Box(6471, 6471),
+  Box(6472, 6472),
+  Box(6473, 6473),
+  Box(6474, 6474),
+  Box(6475, 6475),
+  Box(6476, 6476),
+  Box(6477, 6477),
+  Box(6478, 6478),
+  Box(6479, 6479),
+  Box(6480, 6480),
+  Box(6481, 6481),
+  Box(6482, 6482),
+  Box(6483, 6483),
+  Box(6484, 6484),
+  Box(6485, 6485),
+  Box(6486, 6486),
+  Box(6487, 6487),
+  Box(6488, 6488),
+  Box(6489, 6489),
+  Box(6490, 6490),
+  Box(6491, 6491),
+  Box(6492, 6492),
+  Box(6493, 6493),
+  Box(6494, 6494),
+  Box(6495, 6495),
+  Box(6496, 6496),
+  Box(6497, 6497),
+  Box(6498, 6498),
+  Box(6499, 6499),
+  Box(6500, 6500),
+  Box(6501, 6501),
+  Box(6502, 6502),
+  Box(6503, 6503),
+  Box(6504, 6504),
+  Box(6505, 6505),
+  Box(6506, 6506),
+  Box(6507, 6507),
+  Box(6508, 6508),
+  Box(6509, 6509),
+  Box(6510, 6510),
+  Box(6511, 6511),
+  Box(6512, 6512),
+  Box(6513, 6513),
+  Box(6514, 6514),
+  Box(6515, 6515),
+  Box(6516, 6516),
+  Box(6517, 6517),
+  Box(6518, 6518),
+  Box(6519, 6519),
+  Box(6520, 6520),
+  Box(6521, 6521),
+  Box(6522, 6522),
+  Box(6523, 6523),
+  Box(6524, 6524),
+  Box(6525, 6525),
+  Box(6526, 6526),
+  Box(6527, 6527),
+  Box(6528, 6528),
+  Box(6529, 6529),
+  Box(6530, 6530),
+  Box(6531, 6531),
+  Box(6532, 6532),
+  Box(6533, 6533),
+  Box(6534, 6534),
+  Box(6535, 6535),
+  Box(6536, 6536),
+  Box(6537, 6537),
+  Box(6538, 6538),
+  Box(6539, 6539),
+  Box(6540, 6540),
+  Box(6541, 6541),
+  Box(6542, 6542),
+  Box(6543, 6543),
+  Box(6544, 6544),
+  Box(6545, 6545),
+  Box(6546, 6546),
+  Box(6547, 6547),
+  Box(6548, 6548),
+  Box(6549, 6549),
+  Box(6550, 6550),
+  Box(6551, 6551),
+  Box(6552, 6552),
+  Box(6553, 6553),
+  Box(6554, 6554),
+  Box(6555, 6555),
+  Box(6556, 6556),
+  Box(6557, 6557),
+  Box(6558, 6558),
+  Box(6559, 6559),
+  Box(6560, 6560),
+  Box(6561, 6561),
+  Box(6562, 6562),
+  Box(6563, 6563),
+  Box(6564, 6564),
+  Box(6565, 6565),
+  Box(6566, 6566),
+  Box(6567, 6567),
+  Box(6568, 6568),
+  Box(6569, 6569),
+  Box(6570, 6570),
+  Box(6571, 6571),
+  Box(6572, 6572),
+  Box(6573, 6573),
+  Box(6574, 6574),
+  Box(6575, 6575),
+  Box(6576, 6576),
+  Box(6577, 6577),
+  Box(6578, 6578),
+  Box(6579, 6579),
+  Box(6580, 6580),
+  Box(6581, 6581),
+  Box(6582, 6582),
+  Box(6583, 6583),
+  Box(6584, 6584),
+  Box(6585, 6585),
+  Box(6586, 6586),
+  Box(6587, 6587),
+  Box(6588, 6588),
+  Box(6589, 6589),
+  Box(6590, 6590),
+  Box(6591, 6591),
+  Box(6592, 6592),
+  Box(6593, 6593),
+  Box(6594, 6594),
+  Box(6595, 6595),
+  Box(6596, 6596),
+  Box(6597, 6597),
+  Box(6598, 6598),
+  Box(6599, 6599),
+  Box(6600, 6600),
+  Box(6601, 6601),
+  Box(6602, 6602),
+  Box(6603, 6603),
+  Box(6604, 6604),
+  Box(6605, 6605),
+  Box(6606, 6606),
+  Box(6607, 6607),
+  Box(6608, 6608),
+  Box(6609, 6609),
+  Box(6610, 6610),
+  Box(6611, 6611),
+  Box(6612, 6612),
+  Box(6613, 6613),
+  Box(6614, 6614),
+  Box(6615, 6615),
+  Box(6616, 6616),
+  Box(6617, 6617),
+  Box(6618, 6618),
+  Box(6619, 6619),
+  Box(6620, 6620),
+  Box(6621, 6621),
+  Box(6622, 6622),
+  Box(6623, 6623),
+  Box(6624, 6624),
+  Box(6625, 6625),
+  Box(6626, 6626),
+  Box(6627, 6627),
+  Box(6628, 6628),
+  Box(6629, 6629),
+  Box(6630, 6630),
+  Box(6631, 6631),
+  Box(6632, 6632),
+  Box(6633, 6633),
+  Box(6634, 6634),
+  Box(6635, 6635),
+  Box(6636, 6636),
+  Box(6637, 6637),
+  Box(6638, 6638),
+  Box(6639, 6639),
+  Box(6640, 6640),
+  Box(6641, 6641),
+  Box(6642, 6642),
+  Box(6643, 6643),
+  Box(6644, 6644),
+  Box(6645, 6645),
+  Box(6646, 6646),
+  Box(6647, 6647),
+  Box(6648, 6648),
+  Box(6649, 6649),
+  Box(6650, 6650),
+  Box(6651, 6651),
+  Box(6652, 6652),
+  Box(6653, 6653),
+  Box(6654, 6654),
+  Box(6655, 6655),
+  Box(6656, 6656),
+  Box(6657, 6657),
+  Box(6658, 6658),
+  Box(6659, 6659),
+  Box(6660, 6660),
+  Box(6661, 6661),
+  Box(6662, 6662),
+  Box(6663, 6663),
+  Box(6664, 6664),
+  Box(6665, 6665),
+  Box(6666, 6666),
+  Box(6667, 6667),
+  Box(6668, 6668),
+  Box(6669, 6669),
+  Box(6670, 6670),
+  Box(6671, 6671),
+  Box(6672, 6672),
+  Box(6673, 6673),
+  Box(6674, 6674),
+  Box(6675, 6675),
+  Box(6676, 6676),
+  Box(6677, 6677),
+  Box(6678, 6678),
+  Box(6679, 6679),
+  Box(6680, 6680),
+  Box(6681, 6681),
+  Box(6682, 6682),
+  Box(6683, 6683),
+  Box(6684, 6684),
+  Box(6685, 6685),
+  Box(6686, 6686),
+  Box(6687, 6687),
+  Box(6688, 6688),
+  Box(6689, 6689),
+  Box(6690, 6690),
+  Box(6691, 6691),
+  Box(6692, 6692),
+  Box(6693, 6693),
+  Box(6694, 6694),
+  Box(6695, 6695),
+  Box(6696, 6696),
+  Box(6697, 6697),
+  Box(6698, 6698),
+  Box(6699, 6699),
+  Box(6700, 6700),
+  Box(6701, 6701),
+  Box(6702, 6702),
+  Box(6703, 6703),
+  Box(6704, 6704),
+  Box(6705, 6705),
+  Box(6706, 6706),
+  Box(6707, 6707),
+  Box(6708, 6708),
+  Box(6709, 6709),
+  Box(6710, 6710),
+  Box(6711, 6711),
+  Box(6712, 6712),
+  Box(6713, 6713),
+  Box(6714, 6714),
+  Box(6715, 6715),
+  Box(6716, 6716),
+  Box(6717, 6717),
+  Box(6718, 6718),
+  Box(6719, 6719),
+  Box(6720, 6720),
+  Box(6721, 6721),
+  Box(6722, 6722),
+  Box(6723, 6723),
+  Box(6724, 6724),
+  Box(6725, 6725),
+  Box(6726, 6726),
+  Box(6727, 6727),
+  Box(6728, 6728),
+  Box(6729, 6729),
+  Box(6730, 6730),
+  Box(6731, 6731),
+  Box(6732, 6732),
+  Box(6733, 6733),
+  Box(6734, 6734),
+  Box(6735, 6735),
+  Box(6736, 6736),
+  Box(6737, 6737),
+  Box(6738, 6738),
+  Box(6739, 6739),
+  Box(6740, 6740),
+  Box(6741, 6741),
+  Box(6742, 6742),
+  Box(6743, 6743),
+  Box(6744, 6744),
+  Box(6745, 6745),
+  Box(6746, 6746),
+  Box(6747, 6747),
+  Box(6748, 6748),
+  Box(6749, 6749),
+  Box(6750, 6750),
+  Box(6751, 6751),
+  Box(6752, 6752),
+  Box(6753, 6753),
+  Box(6754, 6754),
+  Box(6755, 6755),
+  Box(6756, 6756),
+  Box(6757, 6757),
+  Box(6758, 6758),
+  Box(6759, 6759),
+  Box(6760, 6760),
+  Box(6761, 6761),
+  Box(6762, 6762),
+  Box(6763, 6763),
+  Box(6764, 6764),
+  Box(6765, 6765),
+  Box(6766, 6766),
+  Box(6767, 6767),
+  Box(6768, 6768),
+  Box(6769, 6769),
+  Box(6770, 6770),
+  Box(6771, 6771),
+  Box(6772, 6772),
+  Box(6773, 6773),
+  Box(6774, 6774),
+  Box(6775, 6775),
+  Box(6776, 6776),
+  Box(6777, 6777),
+  Box(6778, 6778),
+  Box(6779, 6779),
+  Box(6780, 6780),
+  Box(6781, 6781),
+  Box(6782, 6782),
+  Box(6783, 6783),
+  Box(6784, 6784),
+  Box(6785, 6785),
+  Box(6786, 6786),
+  Box(6787, 6787),
+  Box(6788, 6788),
+  Box(6789, 6789),
+  Box(6790, 6790),
+  Box(6791, 6791),
+  Box(6792, 6792),
+  Box(6793, 6793),
+  Box(6794, 6794),
+  Box(6795, 6795),
+  Box(6796, 6796),
+  Box(6797, 6797),
+  Box(6798, 6798),
+  Box(6799, 6799),
+  Box(6800, 6800),
+  Box(6801, 6801),
+  Box(6802, 6802),
+  Box(6803, 6803),
+  Box(6804, 6804),
+  Box(6805, 6805),
+  Box(6806, 6806),
+  Box(6807, 6807),
+  Box(6808, 6808),
+  Box(6809, 6809),
+  Box(6810, 6810),
+  Box(6811, 6811),
+  Box(6812, 6812),
+  Box(6813, 6813),
+  Box(6814, 6814),
+  Box(6815, 6815),
+  Box(6816, 6816),
+  Box(6817, 6817),
+  Box(6818, 6818),
+  Box(6819, 6819),
+  Box(6820, 6820),
+  Box(6821, 6821),
+  Box(6822, 6822),
+  Box(6823, 6823),
+  Box(6824, 6824),
+  Box(6825, 6825),
+  Box(6826, 6826),
+  Box(6827, 6827),
+  Box(6828, 6828),
+  Box(6829, 6829),
+  Box(6830, 6830),
+  Box(6831, 6831),
+  Box(6832, 6832),
+  Box(6833, 6833),
+  Box(6834, 6834),
+  Box(6835, 6835),
+  Box(6836, 6836),
+  Box(6837, 6837),
+  Box(6838, 6838),
+  Box(6839, 6839),
+  Box(6840, 6840),
+  Box(6841, 6841),
+  Box(6842, 6842),
+  Box(6843, 6843),
+  Box(6844, 6844),
+  Box(6845, 6845),
+  Box(6846, 6846),
+  Box(6847, 6847),
+  Box(6848, 6848),
+  Box(6849, 6849),
+  Box(6850, 6850),
+  Box(6851, 6851),
+  Box(6852, 6852),
+  Box(6853, 6853),
+  Box(6854, 6854),
+  Box(6855, 6855),
+  Box(6856, 6856),
+  Box(6857, 6857),
+  Box(6858, 6858),
+  Box(6859, 6859),
+  Box(6860, 6860),
+  Box(6861, 6861),
+  Box(6862, 6862),
+  Box(6863, 6863),
+  Box(6864, 6864),
+  Box(6865, 6865),
+  Box(6866, 6866),
+  Box(6867, 6867),
+  Box(6868, 6868),
+  Box(6869, 6869),
+  Box(6870, 6870),
+  Box(6871, 6871),
+  Box(6872, 6872),
+  Box(6873, 6873),
+  Box(6874, 6874),
+  Box(6875, 6875),
+  Box(6876, 6876),
+  Box(6877, 6877),
+  Box(6878, 6878),
+  Box(6879, 6879),
+  Box(6880, 6880),
+  Box(6881, 6881),
+  Box(6882, 6882),
+  Box(6883, 6883),
+  Box(6884, 6884),
+  Box(6885, 6885),
+  Box(6886, 6886),
+  Box(6887, 6887),
+  Box(6888, 6888),
+  Box(6889, 6889),
+  Box(6890, 6890),
+  Box(6891, 6891),
+  Box(6892, 6892),
+  Box(6893, 6893),
+  Box(6894, 6894),
+  Box(6895, 6895),
+  Box(6896, 6896),
+  Box(6897, 6897),
+  Box(6898, 6898),
+  Box(6899, 6899),
+  Box(6900, 6900),
+  Box(6901, 6901),
+  Box(6902, 6902),
+  Box(6903, 6903),
+  Box(6904, 6904),
+  Box(6905, 6905),
+  Box(6906, 6906),
+  Box(6907, 6907),
+  Box(6908, 6908),
+  Box(6909, 6909),
+  Box(6910, 6910),
+  Box(6911, 6911),
+  Box(6912, 6912),
+  Box(6913, 6913),
+  Box(6914, 6914),
+  Box(6915, 6915),
+  Box(6916, 6916),
+  Box(6917, 6917),
+  Box(6918, 6918),
+  Box(6919, 6919),
+  Box(6920, 6920),
+  Box(6921, 6921),
+  Box(6922, 6922),
+  Box(6923, 6923),
+  Box(6924, 6924),
+  Box(6925, 6925),
+  Box(6926, 6926),
+  Box(6927, 6927),
+  Box(6928, 6928),
+  Box(6929, 6929),
+  Box(6930, 6930),
+  Box(6931, 6931),
+  Box(6932, 6932),
+  Box(6933, 6933),
+  Box(6934, 6934),
+  Box(6935, 6935),
+  Box(6936, 6936),
+  Box(6937, 6937),
+  Box(6938, 6938),
+  Box(6939, 6939),
+  Box(6940, 6940),
+  Box(6941, 6941),
+  Box(6942, 6942),
+  Box(6943, 6943),
+  Box(6944, 6944),
+  Box(6945, 6945),
+  Box(6946, 6946),
+  Box(6947, 6947),
+  Box(6948, 6948),
+  Box(6949, 6949),
+  Box(6950, 6950),
+  Box(6951, 6951),
+  Box(6952, 6952),
+  Box(6953, 6953),
+  Box(6954, 6954),
+  Box(6955, 6955),
+  Box(6956, 6956),
+  Box(6957, 6957),
+  Box(6958, 6958),
+  Box(6959, 6959),
+  Box(6960, 6960),
+  Box(6961, 6961),
+  Box(6962, 6962),
+  Box(6963, 6963),
+  Box(6964, 6964),
+  Box(6965, 6965),
+  Box(6966, 6966),
+  Box(6967, 6967),
+  Box(6968, 6968),
+  Box(6969, 6969),
+  Box(6970, 6970),
+  Box(6971, 6971),
+  Box(6972, 6972),
+  Box(6973, 6973),
+  Box(6974, 6974),
+  Box(6975, 6975),
+  Box(6976, 6976),
+  Box(6977, 6977),
+  Box(6978, 6978),
+  Box(6979, 6979),
+  Box(6980, 6980),
+  Box(6981, 6981),
+  Box(6982, 6982),
+  Box(6983, 6983),
+  Box(6984, 6984),
+  Box(6985, 6985),
+  Box(6986, 6986),
+  Box(6987, 6987),
+  Box(6988, 6988),
+  Box(6989, 6989),
+  Box(6990, 6990),
+  Box(6991, 6991),
+  Box(6992, 6992),
+  Box(6993, 6993),
+  Box(6994, 6994),
+  Box(6995, 6995),
+  Box(6996, 6996),
+  Box(6997, 6997),
+  Box(6998, 6998),
+  Box(6999, 6999),
+  Box(7000, 7000),
+  Box(7001, 7001),
+  Box(7002, 7002),
+  Box(7003, 7003),
+  Box(7004, 7004),
+  Box(7005, 7005),
+  Box(7006, 7006),
+  Box(7007, 7007),
+  Box(7008, 7008),
+  Box(7009, 7009),
+  Box(7010, 7010),
+  Box(7011, 7011),
+  Box(7012, 7012),
+  Box(7013, 7013),
+  Box(7014, 7014),
+  Box(7015, 7015),
+  Box(7016, 7016),
+  Box(7017, 7017),
+  Box(7018, 7018),
+  Box(7019, 7019),
+  Box(7020, 7020),
+  Box(7021, 7021),
+  Box(7022, 7022),
+  Box(7023, 7023),
+  Box(7024, 7024),
+  Box(7025, 7025),
+  Box(7026, 7026),
+  Box(7027, 7027),
+  Box(7028, 7028),
+  Box(7029, 7029),
+  Box(7030, 7030),
+  Box(7031, 7031),
+  Box(7032, 7032),
+  Box(7033, 7033),
+  Box(7034, 7034),
+  Box(7035, 7035),
+  Box(7036, 7036),
+  Box(7037, 7037),
+  Box(7038, 7038),
+  Box(7039, 7039),
+  Box(7040, 7040),
+  Box(7041, 7041),
+  Box(7042, 7042),
+  Box(7043, 7043),
+  Box(7044, 7044),
+  Box(7045, 7045),
+  Box(7046, 7046),
+  Box(7047, 7047),
+  Box(7048, 7048),
+  Box(7049, 7049),
+  Box(7050, 7050),
+  Box(7051, 7051),
+  Box(7052, 7052),
+  Box(7053, 7053),
+  Box(7054, 7054),
+  Box(7055, 7055),
+  Box(7056, 7056),
+  Box(7057, 7057),
+  Box(7058, 7058),
+  Box(7059, 7059),
+  Box(7060, 7060),
+  Box(7061, 7061),
+  Box(7062, 7062),
+  Box(7063, 7063),
+  Box(7064, 7064),
+  Box(7065, 7065),
+  Box(7066, 7066),
+  Box(7067, 7067),
+  Box(7068, 7068),
+  Box(7069, 7069),
+  Box(7070, 7070),
+  Box(7071, 7071),
+  Box(7072, 7072),
+  Box(7073, 7073),
+  Box(7074, 7074),
+  Box(7075, 7075),
+  Box(7076, 7076),
+  Box(7077, 7077),
+  Box(7078, 7078),
+  Box(7079, 7079),
+  Box(7080, 7080),
+  Box(7081, 7081),
+  Box(7082, 7082),
+  Box(7083, 7083),
+  Box(7084, 7084),
+  Box(7085, 7085),
+  Box(7086, 7086),
+  Box(7087, 7087),
+  Box(7088, 7088),
+  Box(7089, 7089),
+  Box(7090, 7090),
+  Box(7091, 7091),
+  Box(7092, 7092),
+  Box(7093, 7093),
+  Box(7094, 7094),
+  Box(7095, 7095),
+  Box(7096, 7096),
+  Box(7097, 7097),
+  Box(7098, 7098),
+  Box(7099, 7099),
+  Box(7100, 7100),
+  Box(7101, 7101),
+  Box(7102, 7102),
+  Box(7103, 7103),
+  Box(7104, 7104),
+  Box(7105, 7105),
+  Box(7106, 7106),
+  Box(7107, 7107),
+  Box(7108, 7108),
+  Box(7109, 7109),
+  Box(7110, 7110),
+  Box(7111, 7111),
+  Box(7112, 7112),
+  Box(7113, 7113),
+  Box(7114, 7114),
+  Box(7115, 7115),
+  Box(7116, 7116),
+  Box(7117, 7117),
+  Box(7118, 7118),
+  Box(7119, 7119),
+  Box(7120, 7120),
+  Box(7121, 7121),
+  Box(7122, 7122),
+  Box(7123, 7123),
+  Box(7124, 7124),
+  Box(7125, 7125),
+  Box(7126, 7126),
+  Box(7127, 7127),
+  Box(7128, 7128),
+  Box(7129, 7129),
+  Box(7130, 7130),
+  Box(7131, 7131),
+  Box(7132, 7132),
+  Box(7133, 7133),
+  Box(7134, 7134),
+  Box(7135, 7135),
+  Box(7136, 7136),
+  Box(7137, 7137),
+  Box(7138, 7138),
+  Box(7139, 7139),
+  Box(7140, 7140),
+  Box(7141, 7141),
+  Box(7142, 7142),
+  Box(7143, 7143),
+  Box(7144, 7144),
+  Box(7145, 7145),
+  Box(7146, 7146),
+  Box(7147, 7147),
+  Box(7148, 7148),
+  Box(7149, 7149),
+  Box(7150, 7150),
+  Box(7151, 7151),
+  Box(7152, 7152),
+  Box(7153, 7153),
+  Box(7154, 7154),
+  Box(7155, 7155),
+  Box(7156, 7156),
+  Box(7157, 7157),
+  Box(7158, 7158),
+  Box(7159, 7159),
+  Box(7160, 7160),
+  Box(7161, 7161),
+  Box(7162, 7162),
+  Box(7163, 7163),
+  Box(7164, 7164),
+  Box(7165, 7165),
+  Box(7166, 7166),
+  Box(7167, 7167),
+  Box(7168, 7168),
+  Box(7169, 7169),
+  Box(7170, 7170),
+  Box(7171, 7171),
+  Box(7172, 7172),
+  Box(7173, 7173),
+  Box(7174, 7174),
+  Box(7175, 7175),
+  Box(7176, 7176),
+  Box(7177, 7177),
+  Box(7178, 7178),
+  Box(7179, 7179),
+  Box(7180, 7180),
+  Box(7181, 7181),
+  Box(7182, 7182),
+  Box(7183, 7183),
+  Box(7184, 7184),
+  Box(7185, 7185),
+  Box(7186, 7186),
+  Box(7187, 7187),
+  Box(7188, 7188),
+  Box(7189, 7189),
+  Box(7190, 7190),
+  Box(7191, 7191),
+  Box(7192, 7192),
+  Box(7193, 7193),
+  Box(7194, 7194),
+  Box(7195, 7195),
+  Box(7196, 7196),
+  Box(7197, 7197),
+  Box(7198, 7198),
+  Box(7199, 7199),
+  Box(7200, 7200),
+  Box(7201, 7201),
+  Box(7202, 7202),
+  Box(7203, 7203),
+  Box(7204, 7204),
+  Box(7205, 7205),
+  Box(7206, 7206),
+  Box(7207, 7207),
+  Box(7208, 7208),
+  Box(7209, 7209),
+  Box(7210, 7210),
+  Box(7211, 7211),
+  Box(7212, 7212),
+  Box(7213, 7213),
+  Box(7214, 7214),
+  Box(7215, 7215),
+  Box(7216, 7216),
+  Box(7217, 7217),
+  Box(7218, 7218),
+  Box(7219, 7219),
+  Box(7220, 7220),
+  Box(7221, 7221),
+  Box(7222, 7222),
+  Box(7223, 7223),
+  Box(7224, 7224),
+  Box(7225, 7225),
+  Box(7226, 7226),
+  Box(7227, 7227),
+  Box(7228, 7228),
+  Box(7229, 7229),
+  Box(7230, 7230),
+  Box(7231, 7231),
+  Box(7232, 7232),
+  Box(7233, 7233),
+  Box(7234, 7234),
+  Box(7235, 7235),
+  Box(7236, 7236),
+  Box(7237, 7237),
+  Box(7238, 7238),
+  Box(7239, 7239),
+  Box(7240, 7240),
+  Box(7241, 7241),
+  Box(7242, 7242),
+  Box(7243, 7243),
+  Box(7244, 7244),
+  Box(7245, 7245),
+  Box(7246, 7246),
+  Box(7247, 7247),
+  Box(7248, 7248),
+  Box(7249, 7249),
+  Box(7250, 7250),
+  Box(7251, 7251),
+  Box(7252, 7252),
+  Box(7253, 7253),
+  Box(7254, 7254),
+  Box(7255, 7255),
+  Box(7256, 7256),
+  Box(7257, 7257),
+  Box(7258, 7258),
+  Box(7259, 7259),
+  Box(7260, 7260),
+  Box(7261, 7261),
+  Box(7262, 7262),
+  Box(7263, 7263),
+  Box(7264, 7264),
+  Box(7265, 7265),
+  Box(7266, 7266),
+  Box(7267, 7267),
+  Box(7268, 7268),
+  Box(7269, 7269),
+  Box(7270, 7270),
+  Box(7271, 7271),
+  Box(7272, 7272),
+  Box(7273, 7273),
+  Box(7274, 7274),
+  Box(7275, 7275),
+  Box(7276, 7276),
+  Box(7277, 7277),
+  Box(7278, 7278),
+  Box(7279, 7279),
+  Box(7280, 7280),
+  Box(7281, 7281),
+  Box(7282, 7282),
+  Box(7283, 7283),
+  Box(7284, 7284),
+  Box(7285, 7285),
+  Box(7286, 7286),
+  Box(7287, 7287),
+  Box(7288, 7288),
+  Box(7289, 7289),
+  Box(7290, 7290),
+  Box(7291, 7291),
+  Box(7292, 7292),
+  Box(7293, 7293),
+  Box(7294, 7294),
+  Box(7295, 7295),
+  Box(7296, 7296),
+  Box(7297, 7297),
+  Box(7298, 7298),
+  Box(7299, 7299),
+  Box(7300, 7300),
+  Box(7301, 7301),
+  Box(7302, 7302),
+  Box(7303, 7303),
+  Box(7304, 7304),
+  Box(7305, 7305),
+  Box(7306, 7306),
+  Box(7307, 7307),
+  Box(7308, 7308),
+  Box(7309, 7309),
+  Box(7310, 7310),
+  Box(7311, 7311),
+  Box(7312, 7312),
+  Box(7313, 7313),
+  Box(7314, 7314),
+  Box(7315, 7315),
+  Box(7316, 7316),
+  Box(7317, 7317),
+  Box(7318, 7318),
+  Box(7319, 7319),
+  Box(7320, 7320),
+  Box(7321, 7321),
+  Box(7322, 7322),
+  Box(7323, 7323),
+  Box(7324, 7324),
+  Box(7325, 7325),
+  Box(7326, 7326),
+  Box(7327, 7327),
+  Box(7328, 7328),
+  Box(7329, 7329),
+  Box(7330, 7330),
+  Box(7331, 7331),
+  Box(7332, 7332),
+  Box(7333, 7333),
+  Box(7334, 7334),
+  Box(7335, 7335),
+  Box(7336, 7336),
+  Box(7337, 7337),
+  Box(7338, 7338),
+  Box(7339, 7339),
+  Box(7340, 7340),
+  Box(7341, 7341),
+  Box(7342, 7342),
+  Box(7343, 7343),
+  Box(7344, 7344),
+  Box(7345, 7345),
+  Box(7346, 7346),
+  Box(7347, 7347),
+  Box(7348, 7348),
+  Box(7349, 7349),
+  Box(7350, 7350),
+  Box(7351, 7351),
+  Box(7352, 7352),
+  Box(7353, 7353),
+  Box(7354, 7354),
+  Box(7355, 7355),
+  Box(7356, 7356),
+  Box(7357, 7357),
+  Box(7358, 7358),
+  Box(7359, 7359),
+  Box(7360, 7360),
+  Box(7361, 7361),
+  Box(7362, 7362),
+  Box(7363, 7363),
+  Box(7364, 7364),
+  Box(7365, 7365),
+  Box(7366, 7366),
+  Box(7367, 7367),
+  Box(7368, 7368),
+  Box(7369, 7369),
+  Box(7370, 7370),
+  Box(7371, 7371),
+  Box(7372, 7372),
+  Box(7373, 7373),
+  Box(7374, 7374),
+  Box(7375, 7375),
+  Box(7376, 7376),
+  Box(7377, 7377),
+  Box(7378, 7378),
+  Box(7379, 7379),
+  Box(7380, 7380),
+  Box(7381, 7381),
+  Box(7382, 7382),
+  Box(7383, 7383),
+  Box(7384, 7384),
+  Box(7385, 7385),
+  Box(7386, 7386),
+  Box(7387, 7387),
+  Box(7388, 7388),
+  Box(7389, 7389),
+  Box(7390, 7390),
+  Box(7391, 7391),
+  Box(7392, 7392),
+  Box(7393, 7393),
+  Box(7394, 7394),
+  Box(7395, 7395),
+  Box(7396, 7396),
+  Box(7397, 7397),
+  Box(7398, 7398),
+  Box(7399, 7399),
+  Box(7400, 7400),
+  Box(7401, 7401),
+  Box(7402, 7402),
+  Box(7403, 7403),
+  Box(7404, 7404),
+  Box(7405, 7405),
+  Box(7406, 7406),
+  Box(7407, 7407),
+  Box(7408, 7408),
+  Box(7409, 7409),
+  Box(7410, 7410),
+  Box(7411, 7411),
+  Box(7412, 7412),
+  Box(7413, 7413),
+  Box(7414, 7414),
+  Box(7415, 7415),
+  Box(7416, 7416),
+  Box(7417, 7417),
+  Box(7418, 7418),
+  Box(7419, 7419),
+  Box(7420, 7420),
+  Box(7421, 7421),
+  Box(7422, 7422),
+  Box(7423, 7423),
+  Box(7424, 7424),
+  Box(7425, 7425),
+  Box(7426, 7426),
+  Box(7427, 7427),
+  Box(7428, 7428),
+  Box(7429, 7429),
+  Box(7430, 7430),
+  Box(7431, 7431),
+  Box(7432, 7432),
+  Box(7433, 7433),
+  Box(7434, 7434),
+  Box(7435, 7435),
+  Box(7436, 7436),
+  Box(7437, 7437),
+  Box(7438, 7438),
+  Box(7439, 7439),
+  Box(7440, 7440),
+  Box(7441, 7441),
+  Box(7442, 7442),
+  Box(7443, 7443),
+  Box(7444, 7444),
+  Box(7445, 7445),
+  Box(7446, 7446),
+  Box(7447, 7447),
+  Box(7448, 7448),
+  Box(7449, 7449),
+  Box(7450, 7450),
+  Box(7451, 7451),
+  Box(7452, 7452),
+  Box(7453, 7453),
+  Box(7454, 7454),
+  Box(7455, 7455),
+  Box(7456, 7456),
+  Box(7457, 7457),
+  Box(7458, 7458),
+  Box(7459, 7459),
+  Box(7460, 7460),
+  Box(7461, 7461),
+  Box(7462, 7462),
+  Box(7463, 7463),
+  Box(7464, 7464),
+  Box(7465, 7465),
+  Box(7466, 7466),
+  Box(7467, 7467),
+  Box(7468, 7468),
+  Box(7469, 7469),
+  Box(7470, 7470),
+  Box(7471, 7471),
+  Box(7472, 7472),
+  Box(7473, 7473),
+  Box(7474, 7474),
+  Box(7475, 7475),
+  Box(7476, 7476),
+  Box(7477, 7477),
+  Box(7478, 7478),
+  Box(7479, 7479),
+  Box(7480, 7480),
+  Box(7481, 7481),
+  Box(7482, 7482),
+  Box(7483, 7483),
+  Box(7484, 7484),
+  Box(7485, 7485),
+  Box(7486, 7486),
+  Box(7487, 7487),
+  Box(7488, 7488),
+  Box(7489, 7489),
+  Box(7490, 7490),
+  Box(7491, 7491),
+  Box(7492, 7492),
+  Box(7493, 7493),
+  Box(7494, 7494),
+  Box(7495, 7495),
+  Box(7496, 7496),
+  Box(7497, 7497),
+  Box(7498, 7498),
+  Box(7499, 7499),
+  Box(7500, 7500),
+  Box(7501, 7501),
+  Box(7502, 7502),
+  Box(7503, 7503),
+  Box(7504, 7504),
+  Box(7505, 7505),
+  Box(7506, 7506),
+  Box(7507, 7507),
+  Box(7508, 7508),
+  Box(7509, 7509),
+  Box(7510, 7510),
+  Box(7511, 7511),
+  Box(7512, 7512),
+  Box(7513, 7513),
+  Box(7514, 7514),
+  Box(7515, 7515),
+  Box(7516, 7516),
+  Box(7517, 7517),
+  Box(7518, 7518),
+  Box(7519, 7519),
+  Box(7520, 7520),
+  Box(7521, 7521),
+  Box(7522, 7522),
+  Box(7523, 7523),
+  Box(7524, 7524),
+  Box(7525, 7525),
+  Box(7526, 7526),
+  Box(7527, 7527),
+  Box(7528, 7528),
+  Box(7529, 7529),
+  Box(7530, 7530),
+  Box(7531, 7531),
+  Box(7532, 7532),
+  Box(7533, 7533),
+  Box(7534, 7534),
+  Box(7535, 7535),
+  Box(7536, 7536),
+  Box(7537, 7537),
+  Box(7538, 7538),
+  Box(7539, 7539),
+  Box(7540, 7540),
+  Box(7541, 7541),
+  Box(7542, 7542),
+  Box(7543, 7543),
+  Box(7544, 7544),
+  Box(7545, 7545),
+  Box(7546, 7546),
+  Box(7547, 7547),
+  Box(7548, 7548),
+  Box(7549, 7549),
+  Box(7550, 7550),
+  Box(7551, 7551),
+  Box(7552, 7552),
+  Box(7553, 7553),
+  Box(7554, 7554),
+  Box(7555, 7555),
+  Box(7556, 7556),
+  Box(7557, 7557),
+  Box(7558, 7558),
+  Box(7559, 7559),
+  Box(7560, 7560),
+  Box(7561, 7561),
+  Box(7562, 7562),
+  Box(7563, 7563),
+  Box(7564, 7564),
+  Box(7565, 7565),
+  Box(7566, 7566),
+  Box(7567, 7567),
+  Box(7568, 7568),
+  Box(7569, 7569),
+  Box(7570, 7570),
+  Box(7571, 7571),
+  Box(7572, 7572),
+  Box(7573, 7573),
+  Box(7574, 7574),
+  Box(7575, 7575),
+  Box(7576, 7576),
+  Box(7577, 7577),
+  Box(7578, 7578),
+  Box(7579, 7579),
+  Box(7580, 7580),
+  Box(7581, 7581),
+  Box(7582, 7582),
+  Box(7583, 7583),
+  Box(7584, 7584),
+  Box(7585, 7585),
+  Box(7586, 7586),
+  Box(7587, 7587),
+  Box(7588, 7588),
+  Box(7589, 7589),
+  Box(7590, 7590),
+  Box(7591, 7591),
+  Box(7592, 7592),
+  Box(7593, 7593),
+  Box(7594, 7594),
+  Box(7595, 7595),
+  Box(7596, 7596),
+  Box(7597, 7597),
+  Box(7598, 7598),
+  Box(7599, 7599),
+  Box(7600, 7600),
+  Box(7601, 7601),
+  Box(7602, 7602),
+  Box(7603, 7603),
+  Box(7604, 7604),
+  Box(7605, 7605),
+  Box(7606, 7606),
+  Box(7607, 7607),
+  Box(7608, 7608),
+  Box(7609, 7609),
+  Box(7610, 7610),
+  Box(7611, 7611),
+  Box(7612, 7612),
+  Box(7613, 7613),
+  Box(7614, 7614),
+  Box(7615, 7615),
+  Box(7616, 7616),
+  Box(7617, 7617),
+  Box(7618, 7618),
+  Box(7619, 7619),
+  Box(7620, 7620),
+  Box(7621, 7621),
+  Box(7622, 7622),
+  Box(7623, 7623),
+  Box(7624, 7624),
+  Box(7625, 7625),
+  Box(7626, 7626),
+  Box(7627, 7627),
+  Box(7628, 7628),
+  Box(7629, 7629),
+  Box(7630, 7630),
+  Box(7631, 7631),
+  Box(7632, 7632),
+  Box(7633, 7633),
+  Box(7634, 7634),
+  Box(7635, 7635),
+  Box(7636, 7636),
+  Box(7637, 7637),
+  Box(7638, 7638),
+  Box(7639, 7639),
+  Box(7640, 7640),
+  Box(7641, 7641),
+  Box(7642, 7642),
+  Box(7643, 7643),
+  Box(7644, 7644),
+  Box(7645, 7645),
+  Box(7646, 7646),
+  Box(7647, 7647),
+  Box(7648, 7648),
+  Box(7649, 7649),
+  Box(7650, 7650),
+  Box(7651, 7651),
+  Box(7652, 7652),
+  Box(7653, 7653),
+  Box(7654, 7654),
+  Box(7655, 7655),
+  Box(7656, 7656),
+  Box(7657, 7657),
+  Box(7658, 7658),
+  Box(7659, 7659),
+  Box(7660, 7660),
+  Box(7661, 7661),
+  Box(7662, 7662),
+  Box(7663, 7663),
+  Box(7664, 7664),
+  Box(7665, 7665),
+  Box(7666, 7666),
+  Box(7667, 7667),
+  Box(7668, 7668),
+  Box(7669, 7669),
+  Box(7670, 7670),
+  Box(7671, 7671),
+  Box(7672, 7672),
+  Box(7673, 7673),
+  Box(7674, 7674),
+  Box(7675, 7675),
+  Box(7676, 7676),
+  Box(7677, 7677),
+  Box(7678, 7678),
+  Box(7679, 7679),
+  Box(7680, 7680),
+  Box(7681, 7681),
+  Box(7682, 7682),
+  Box(7683, 7683),
+  Box(7684, 7684),
+  Box(7685, 7685),
+  Box(7686, 7686),
+  Box(7687, 7687),
+  Box(7688, 7688),
+  Box(7689, 7689),
+  Box(7690, 7690),
+  Box(7691, 7691),
+  Box(7692, 7692),
+  Box(7693, 7693),
+  Box(7694, 7694),
+  Box(7695, 7695),
+  Box(7696, 7696),
+  Box(7697, 7697),
+  Box(7698, 7698),
+  Box(7699, 7699),
+  Box(7700, 7700),
+  Box(7701, 7701),
+  Box(7702, 7702),
+  Box(7703, 7703),
+  Box(7704, 7704),
+  Box(7705, 7705),
+  Box(7706, 7706),
+  Box(7707, 7707),
+  Box(7708, 7708),
+  Box(7709, 7709),
+  Box(7710, 7710),
+  Box(7711, 7711),
+  Box(7712, 7712),
+  Box(7713, 7713),
+  Box(7714, 7714),
+  Box(7715, 7715),
+  Box(7716, 7716),
+  Box(7717, 7717),
+  Box(7718, 7718),
+  Box(7719, 7719),
+  Box(7720, 7720),
+  Box(7721, 7721),
+  Box(7722, 7722),
+  Box(7723, 7723),
+  Box(7724, 7724),
+  Box(7725, 7725),
+  Box(7726, 7726),
+  Box(7727, 7727),
+  Box(7728, 7728),
+  Box(7729, 7729),
+  Box(7730, 7730),
+  Box(7731, 7731),
+  Box(7732, 7732),
+  Box(7733, 7733),
+  Box(7734, 7734),
+  Box(7735, 7735),
+  Box(7736, 7736),
+  Box(7737, 7737),
+  Box(7738, 7738),
+  Box(7739, 7739),
+  Box(7740, 7740),
+  Box(7741, 7741),
+  Box(7742, 7742),
+  Box(7743, 7743),
+  Box(7744, 7744),
+  Box(7745, 7745),
+  Box(7746, 7746),
+  Box(7747, 7747),
+  Box(7748, 7748),
+  Box(7749, 7749),
+  Box(7750, 7750),
+  Box(7751, 7751),
+  Box(7752, 7752),
+  Box(7753, 7753),
+  Box(7754, 7754),
+  Box(7755, 7755),
+  Box(7756, 7756),
+  Box(7757, 7757),
+  Box(7758, 7758),
+  Box(7759, 7759),
+  Box(7760, 7760),
+  Box(7761, 7761),
+  Box(7762, 7762),
+  Box(7763, 7763),
+  Box(7764, 7764),
+  Box(7765, 7765),
+  Box(7766, 7766),
+  Box(7767, 7767),
+  Box(7768, 7768),
+  Box(7769, 7769),
+  Box(7770, 7770),
+  Box(7771, 7771),
+  Box(7772, 7772),
+  Box(7773, 7773),
+  Box(7774, 7774),
+  Box(7775, 7775),
+  Box(7776, 7776),
+  Box(7777, 7777),
+  Box(7778, 7778),
+  Box(7779, 7779),
+  Box(7780, 7780),
+  Box(7781, 7781),
+  Box(7782, 7782),
+  Box(7783, 7783),
+  Box(7784, 7784),
+  Box(7785, 7785),
+  Box(7786, 7786),
+  Box(7787, 7787),
+  Box(7788, 7788),
+  Box(7789, 7789),
+  Box(7790, 7790),
+  Box(7791, 7791),
+  Box(7792, 7792),
+  Box(7793, 7793),
+  Box(7794, 7794),
+  Box(7795, 7795),
+  Box(7796, 7796),
+  Box(7797, 7797),
+  Box(7798, 7798),
+  Box(7799, 7799),
+  Box(7800, 7800),
+  Box(7801, 7801),
+  Box(7802, 7802),
+  Box(7803, 7803),
+  Box(7804, 7804),
+  Box(7805, 7805),
+  Box(7806, 7806),
+  Box(7807, 7807),
+  Box(7808, 7808),
+  Box(7809, 7809),
+  Box(7810, 7810),
+  Box(7811, 7811),
+  Box(7812, 7812),
+  Box(7813, 7813),
+  Box(7814, 7814),
+  Box(7815, 7815),
+  Box(7816, 7816),
+  Box(7817, 7817),
+  Box(7818, 7818),
+  Box(7819, 7819),
+  Box(7820, 7820),
+  Box(7821, 7821),
+  Box(7822, 7822),
+  Box(7823, 7823),
+  Box(7824, 7824),
+  Box(7825, 7825),
+  Box(7826, 7826),
+  Box(7827, 7827),
+  Box(7828, 7828),
+  Box(7829, 7829),
+  Box(7830, 7830),
+  Box(7831, 7831),
+  Box(7832, 7832),
+  Box(7833, 7833),
+  Box(7834, 7834),
+  Box(7835, 7835),
+  Box(7836, 7836),
+  Box(7837, 7837),
+  Box(7838, 7838),
+  Box(7839, 7839),
+  Box(7840, 7840),
+  Box(7841, 7841),
+  Box(7842, 7842),
+  Box(7843, 7843),
+  Box(7844, 7844),
+  Box(7845, 7845),
+  Box(7846, 7846),
+  Box(7847, 7847),
+  Box(7848, 7848),
+  Box(7849, 7849),
+  Box(7850, 7850),
+  Box(7851, 7851),
+  Box(7852, 7852),
+  Box(7853, 7853),
+  Box(7854, 7854),
+  Box(7855, 7855),
+  Box(7856, 7856),
+  Box(7857, 7857),
+  Box(7858, 7858),
+  Box(7859, 7859),
+  Box(7860, 7860),
+  Box(7861, 7861),
+  Box(7862, 7862),
+  Box(7863, 7863),
+  Box(7864, 7864),
+  Box(7865, 7865),
+  Box(7866, 7866),
+  Box(7867, 7867),
+  Box(7868, 7868),
+  Box(7869, 7869),
+  Box(7870, 7870),
+  Box(7871, 7871),
+  Box(7872, 7872),
+  Box(7873, 7873),
+  Box(7874, 7874),
+  Box(7875, 7875),
+  Box(7876, 7876),
+  Box(7877, 7877),
+  Box(7878, 7878),
+  Box(7879, 7879),
+  Box(7880, 7880),
+  Box(7881, 7881),
+  Box(7882, 7882),
+  Box(7883, 7883),
+  Box(7884, 7884),
+  Box(7885, 7885),
+  Box(7886, 7886),
+  Box(7887, 7887),
+  Box(7888, 7888),
+  Box(7889, 7889),
+  Box(7890, 7890),
+  Box(7891, 7891),
+  Box(7892, 7892),
+  Box(7893, 7893),
+  Box(7894, 7894),
+  Box(7895, 7895),
+  Box(7896, 7896),
+  Box(7897, 7897),
+  Box(7898, 7898),
+  Box(7899, 7899),
+  Box(7900, 7900),
+  Box(7901, 7901),
+  Box(7902, 7902),
+  Box(7903, 7903),
+  Box(7904, 7904),
+  Box(7905, 7905),
+  Box(7906, 7906),
+  Box(7907, 7907),
+  Box(7908, 7908),
+  Box(7909, 7909),
+  Box(7910, 7910),
+  Box(7911, 7911),
+  Box(7912, 7912),
+  Box(7913, 7913),
+  Box(7914, 7914),
+  Box(7915, 7915),
+  Box(7916, 7916),
+  Box(7917, 7917),
+  Box(7918, 7918),
+  Box(7919, 7919),
+  Box(7920, 7920),
+  Box(7921, 7921),
+  Box(7922, 7922),
+  Box(7923, 7923),
+  Box(7924, 7924),
+  Box(7925, 7925),
+  Box(7926, 7926),
+  Box(7927, 7927),
+  Box(7928, 7928),
+  Box(7929, 7929),
+  Box(7930, 7930),
+  Box(7931, 7931),
+  Box(7932, 7932),
+  Box(7933, 7933),
+  Box(7934, 7934),
+  Box(7935, 7935),
+  Box(7936, 7936),
+  Box(7937, 7937),
+  Box(7938, 7938),
+  Box(7939, 7939),
+  Box(7940, 7940),
+  Box(7941, 7941),
+  Box(7942, 7942),
+  Box(7943, 7943),
+  Box(7944, 7944),
+  Box(7945, 7945),
+  Box(7946, 7946),
+  Box(7947, 7947),
+  Box(7948, 7948),
+  Box(7949, 7949),
+  Box(7950, 7950),
+  Box(7951, 7951),
+  Box(7952, 7952),
+  Box(7953, 7953),
+  Box(7954, 7954),
+  Box(7955, 7955),
+  Box(7956, 7956),
+  Box(7957, 7957),
+  Box(7958, 7958),
+  Box(7959, 7959),
+  Box(7960, 7960),
+  Box(7961, 7961),
+  Box(7962, 7962),
+  Box(7963, 7963),
+  Box(7964, 7964),
+  Box(7965, 7965),
+  Box(7966, 7966),
+  Box(7967, 7967),
+  Box(7968, 7968),
+  Box(7969, 7969),
+  Box(7970, 7970),
+  Box(7971, 7971),
+  Box(7972, 7972),
+  Box(7973, 7973),
+  Box(7974, 7974),
+  Box(7975, 7975),
+  Box(7976, 7976),
+  Box(7977, 7977),
+  Box(7978, 7978),
+  Box(7979, 7979),
+  Box(7980, 7980),
+  Box(7981, 7981),
+  Box(7982, 7982),
+  Box(7983, 7983),
+  Box(7984, 7984),
+  Box(7985, 7985),
+  Box(7986, 7986),
+  Box(7987, 7987),
+  Box(7988, 7988),
+  Box(7989, 7989),
+  Box(7990, 7990),
+  Box(7991, 7991),
+  Box(7992, 7992),
+  Box(7993, 7993),
+  Box(7994, 7994),
+  Box(7995, 7995),
+  Box(7996, 7996),
+  Box(7997, 7997),
+  Box(7998, 7998),
+  Box(7999, 7999),
+  Box(8000, 8000),
+  Box(8001, 8001),
+  Box(8002, 8002),
+  Box(8003, 8003),
+  Box(8004, 8004),
+  Box(8005, 8005),
+  Box(8006, 8006),
+  Box(8007, 8007),
+  Box(8008, 8008),
+  Box(8009, 8009),
+  Box(8010, 8010),
+  Box(8011, 8011),
+  Box(8012, 8012),
+  Box(8013, 8013),
+  Box(8014, 8014),
+  Box(8015, 8015),
+  Box(8016, 8016),
+  Box(8017, 8017),
+  Box(8018, 8018),
+  Box(8019, 8019),
+  Box(8020, 8020),
+  Box(8021, 8021),
+  Box(8022, 8022),
+  Box(8023, 8023),
+  Box(8024, 8024),
+  Box(8025, 8025),
+  Box(8026, 8026),
+  Box(8027, 8027),
+  Box(8028, 8028),
+  Box(8029, 8029),
+  Box(8030, 8030),
+  Box(8031, 8031),
+  Box(8032, 8032),
+  Box(8033, 8033),
+  Box(8034, 8034),
+  Box(8035, 8035),
+  Box(8036, 8036),
+  Box(8037, 8037),
+  Box(8038, 8038),
+  Box(8039, 8039),
+  Box(8040, 8040),
+  Box(8041, 8041),
+  Box(8042, 8042),
+  Box(8043, 8043),
+  Box(8044, 8044),
+  Box(8045, 8045),
+  Box(8046, 8046),
+  Box(8047, 8047),
+  Box(8048, 8048),
+  Box(8049, 8049),
+  Box(8050, 8050),
+  Box(8051, 8051),
+  Box(8052, 8052),
+  Box(8053, 8053),
+  Box(8054, 8054),
+  Box(8055, 8055),
+  Box(8056, 8056),
+  Box(8057, 8057),
+  Box(8058, 8058),
+  Box(8059, 8059),
+  Box(8060, 8060),
+  Box(8061, 8061),
+  Box(8062, 8062),
+  Box(8063, 8063),
+  Box(8064, 8064),
+  Box(8065, 8065),
+  Box(8066, 8066),
+  Box(8067, 8067),
+  Box(8068, 8068),
+  Box(8069, 8069),
+  Box(8070, 8070),
+  Box(8071, 8071),
+  Box(8072, 8072),
+  Box(8073, 8073),
+  Box(8074, 8074),
+  Box(8075, 8075),
+  Box(8076, 8076),
+  Box(8077, 8077),
+  Box(8078, 8078),
+  Box(8079, 8079),
+  Box(8080, 8080),
+  Box(8081, 8081),
+  Box(8082, 8082),
+  Box(8083, 8083),
+  Box(8084, 8084),
+  Box(8085, 8085),
+  Box(8086, 8086),
+  Box(8087, 8087),
+  Box(8088, 8088),
+  Box(8089, 8089),
+  Box(8090, 8090),
+  Box(8091, 8091),
+  Box(8092, 8092),
+  Box(8093, 8093),
+  Box(8094, 8094),
+  Box(8095, 8095),
+  Box(8096, 8096),
+  Box(8097, 8097),
+  Box(8098, 8098),
+  Box(8099, 8099),
+  Box(8100, 8100),
+  Box(8101, 8101),
+  Box(8102, 8102),
+  Box(8103, 8103),
+  Box(8104, 8104),
+  Box(8105, 8105),
+  Box(8106, 8106),
+  Box(8107, 8107),
+  Box(8108, 8108),
+  Box(8109, 8109),
+  Box(8110, 8110),
+  Box(8111, 8111),
+  Box(8112, 8112),
+  Box(8113, 8113),
+  Box(8114, 8114),
+  Box(8115, 8115),
+  Box(8116, 8116),
+  Box(8117, 8117),
+  Box(8118, 8118),
+  Box(8119, 8119),
+  Box(8120, 8120),
+  Box(8121, 8121),
+  Box(8122, 8122),
+  Box(8123, 8123),
+  Box(8124, 8124),
+  Box(8125, 8125),
+  Box(8126, 8126),
+  Box(8127, 8127),
+  Box(8128, 8128),
+  Box(8129, 8129),
+  Box(8130, 8130),
+  Box(8131, 8131),
+  Box(8132, 8132),
+  Box(8133, 8133),
+  Box(8134, 8134),
+  Box(8135, 8135),
+  Box(8136, 8136),
+  Box(8137, 8137),
+  Box(8138, 8138),
+  Box(8139, 8139),
+  Box(8140, 8140),
+  Box(8141, 8141),
+  Box(8142, 8142),
+  Box(8143, 8143),
+  Box(8144, 8144),
+  Box(8145, 8145),
+  Box(8146, 8146),
+  Box(8147, 8147),
+  Box(8148, 8148),
+  Box(8149, 8149),
+  Box(8150, 8150),
+  Box(8151, 8151),
+  Box(8152, 8152),
+  Box(8153, 8153),
+  Box(8154, 8154),
+  Box(8155, 8155),
+  Box(8156, 8156),
+  Box(8157, 8157),
+  Box(8158, 8158),
+  Box(8159, 8159),
+  Box(8160, 8160),
+  Box(8161, 8161),
+  Box(8162, 8162),
+  Box(8163, 8163),
+  Box(8164, 8164),
+  Box(8165, 8165),
+  Box(8166, 8166),
+  Box(8167, 8167),
+  Box(8168, 8168),
+  Box(8169, 8169),
+  Box(8170, 8170),
+  Box(8171, 8171),
+  Box(8172, 8172),
+  Box(8173, 8173),
+  Box(8174, 8174),
+  Box(8175, 8175),
+  Box(8176, 8176),
+  Box(8177, 8177),
+  Box(8178, 8178),
+  Box(8179, 8179),
+  Box(8180, 8180),
+  Box(8181, 8181),
+  Box(8182, 8182),
+  Box(8183, 8183),
+  Box(8184, 8184),
+  Box(8185, 8185),
+  Box(8186, 8186),
+  Box(8187, 8187),
+  Box(8188, 8188),
+  Box(8189, 8189),
+  Box(8190, 8190),
+  Box(8191, 8191),
+  Box(8192, 8192),
+  Box(8193, 8193),
+  Box(8194, 8194),
+  Box(8195, 8195),
+  Box(8196, 8196),
+  Box(8197, 8197),
+  Box(8198, 8198),
+  Box(8199, 8199),
+  Box(8200, 8200),
+  Box(8201, 8201),
+  Box(8202, 8202),
+  Box(8203, 8203),
+  Box(8204, 8204),
+  Box(8205, 8205),
+  Box(8206, 8206),
+  Box(8207, 8207),
+  Box(8208, 8208),
+  Box(8209, 8209),
+  Box(8210, 8210),
+  Box(8211, 8211),
+  Box(8212, 8212),
+  Box(8213, 8213),
+  Box(8214, 8214),
+  Box(8215, 8215),
+  Box(8216, 8216),
+  Box(8217, 8217),
+  Box(8218, 8218),
+  Box(8219, 8219),
+  Box(8220, 8220),
+  Box(8221, 8221),
+  Box(8222, 8222),
+  Box(8223, 8223),
+  Box(8224, 8224),
+  Box(8225, 8225),
+  Box(8226, 8226),
+  Box(8227, 8227),
+  Box(8228, 8228),
+  Box(8229, 8229),
+  Box(8230, 8230),
+  Box(8231, 8231),
+  Box(8232, 8232),
+  Box(8233, 8233),
+  Box(8234, 8234),
+  Box(8235, 8235),
+  Box(8236, 8236),
+  Box(8237, 8237),
+  Box(8238, 8238),
+  Box(8239, 8239),
+  Box(8240, 8240),
+  Box(8241, 8241),
+  Box(8242, 8242),
+  Box(8243, 8243),
+  Box(8244, 8244),
+  Box(8245, 8245),
+  Box(8246, 8246),
+  Box(8247, 8247),
+  Box(8248, 8248),
+  Box(8249, 8249),
+  Box(8250, 8250),
+  Box(8251, 8251),
+  Box(8252, 8252),
+  Box(8253, 8253),
+  Box(8254, 8254),
+  Box(8255, 8255),
+  Box(8256, 8256),
+  Box(8257, 8257),
+  Box(8258, 8258),
+  Box(8259, 8259),
+  Box(8260, 8260),
+  Box(8261, 8261),
+  Box(8262, 8262),
+  Box(8263, 8263),
+  Box(8264, 8264),
+  Box(8265, 8265),
+  Box(8266, 8266),
+  Box(8267, 8267),
+  Box(8268, 8268),
+  Box(8269, 8269),
+  Box(8270, 8270),
+  Box(8271, 8271),
+  Box(8272, 8272),
+  Box(8273, 8273),
+  Box(8274, 8274),
+  Box(8275, 8275),
+  Box(8276, 8276),
+  Box(8277, 8277),
+  Box(8278, 8278),
+  Box(8279, 8279),
+  Box(8280, 8280),
+  Box(8281, 8281),
+  Box(8282, 8282),
+  Box(8283, 8283),
+  Box(8284, 8284),
+  Box(8285, 8285),
+  Box(8286, 8286),
+  Box(8287, 8287),
+  Box(8288, 8288),
+  Box(8289, 8289),
+  Box(8290, 8290),
+  Box(8291, 8291),
+  Box(8292, 8292),
+  Box(8293, 8293),
+  Box(8294, 8294),
+  Box(8295, 8295),
+  Box(8296, 8296),
+  Box(8297, 8297),
+  Box(8298, 8298),
+  Box(8299, 8299),
+  Box(8300, 8300),
+  Box(8301, 8301),
+  Box(8302, 8302),
+  Box(8303, 8303),
+  Box(8304, 8304),
+  Box(8305, 8305),
+  Box(8306, 8306),
+  Box(8307, 8307),
+  Box(8308, 8308),
+  Box(8309, 8309),
+  Box(8310, 8310),
+  Box(8311, 8311),
+  Box(8312, 8312),
+  Box(8313, 8313),
+  Box(8314, 8314),
+  Box(8315, 8315),
+  Box(8316, 8316),
+  Box(8317, 8317),
+  Box(8318, 8318),
+  Box(8319, 8319),
+  Box(8320, 8320),
+  Box(8321, 8321),
+  Box(8322, 8322),
+  Box(8323, 8323),
+  Box(8324, 8324),
+  Box(8325, 8325),
+  Box(8326, 8326),
+  Box(8327, 8327),
+  Box(8328, 8328),
+  Box(8329, 8329),
+  Box(8330, 8330),
+  Box(8331, 8331),
+  Box(8332, 8332),
+  Box(8333, 8333),
+  Box(8334, 8334),
+  Box(8335, 8335),
+  Box(8336, 8336),
+  Box(8337, 8337),
+  Box(8338, 8338),
+  Box(8339, 8339),
+  Box(8340, 8340),
+  Box(8341, 8341),
+  Box(8342, 8342),
+  Box(8343, 8343),
+  Box(8344, 8344),
+  Box(8345, 8345),
+  Box(8346, 8346),
+  Box(8347, 8347),
+  Box(8348, 8348),
+  Box(8349, 8349),
+  Box(8350, 8350),
+  Box(8351, 8351),
+  Box(8352, 8352),
+  Box(8353, 8353),
+  Box(8354, 8354),
+  Box(8355, 8355),
+  Box(8356, 8356),
+  Box(8357, 8357),
+  Box(8358, 8358),
+  Box(8359, 8359),
+  Box(8360, 8360),
+  Box(8361, 8361),
+  Box(8362, 8362),
+  Box(8363, 8363),
+  Box(8364, 8364),
+  Box(8365, 8365),
+  Box(8366, 8366),
+  Box(8367, 8367),
+  Box(8368, 8368),
+  Box(8369, 8369),
+  Box(8370, 8370),
+  Box(8371, 8371),
+  Box(8372, 8372),
+  Box(8373, 8373),
+  Box(8374, 8374),
+  Box(8375, 8375),
+  Box(8376, 8376),
+  Box(8377, 8377),
+  Box(8378, 8378),
+  Box(8379, 8379),
+  Box(8380, 8380),
+  Box(8381, 8381),
+  Box(8382, 8382),
+  Box(8383, 8383),
+  Box(8384, 8384),
+  Box(8385, 8385),
+  Box(8386, 8386),
+  Box(8387, 8387),
+  Box(8388, 8388),
+  Box(8389, 8389),
+  Box(8390, 8390),
+  Box(8391, 8391),
+  Box(8392, 8392),
+  Box(8393, 8393),
+  Box(8394, 8394),
+  Box(8395, 8395),
+  Box(8396, 8396),
+  Box(8397, 8397),
+  Box(8398, 8398),
+  Box(8399, 8399),
+  Box(8400, 8400),
+  Box(8401, 8401),
+  Box(8402, 8402),
+  Box(8403, 8403),
+  Box(8404, 8404),
+  Box(8405, 8405),
+  Box(8406, 8406),
+  Box(8407, 8407),
+  Box(8408, 8408),
+  Box(8409, 8409),
+  Box(8410, 8410),
+  Box(8411, 8411),
+  Box(8412, 8412),
+  Box(8413, 8413),
+  Box(8414, 8414),
+  Box(8415, 8415),
+  Box(8416, 8416),
+  Box(8417, 8417),
+  Box(8418, 8418),
+  Box(8419, 8419),
+  Box(8420, 8420),
+  Box(8421, 8421),
+  Box(8422, 8422),
+  Box(8423, 8423),
+  Box(8424, 8424),
+  Box(8425, 8425),
+  Box(8426, 8426),
+  Box(8427, 8427),
+  Box(8428, 8428),
+  Box(8429, 8429),
+  Box(8430, 8430),
+  Box(8431, 8431),
+  Box(8432, 8432),
+  Box(8433, 8433),
+  Box(8434, 8434),
+  Box(8435, 8435),
+  Box(8436, 8436),
+  Box(8437, 8437),
+  Box(8438, 8438),
+  Box(8439, 8439),
+  Box(8440, 8440),
+  Box(8441, 8441),
+  Box(8442, 8442),
+  Box(8443, 8443),
+  Box(8444, 8444),
+  Box(8445, 8445),
+  Box(8446, 8446),
+  Box(8447, 8447),
+  Box(8448, 8448),
+  Box(8449, 8449),
+  Box(8450, 8450),
+  Box(8451, 8451),
+  Box(8452, 8452),
+  Box(8453, 8453),
+  Box(8454, 8454),
+  Box(8455, 8455),
+  Box(8456, 8456),
+  Box(8457, 8457),
+  Box(8458, 8458),
+  Box(8459, 8459),
+  Box(8460, 8460),
+  Box(8461, 8461),
+  Box(8462, 8462),
+  Box(8463, 8463),
+  Box(8464, 8464),
+  Box(8465, 8465),
+  Box(8466, 8466),
+  Box(8467, 8467),
+  Box(8468, 8468),
+  Box(8469, 8469),
+  Box(8470, 8470),
+  Box(8471, 8471),
+  Box(8472, 8472),
+  Box(8473, 8473),
+  Box(8474, 8474),
+  Box(8475, 8475),
+  Box(8476, 8476),
+  Box(8477, 8477),
+  Box(8478, 8478),
+  Box(8479, 8479),
+  Box(8480, 8480),
+  Box(8481, 8481),
+  Box(8482, 8482),
+  Box(8483, 8483),
+  Box(8484, 8484),
+  Box(8485, 8485),
+  Box(8486, 8486),
+  Box(8487, 8487),
+  Box(8488, 8488),
+  Box(8489, 8489),
+  Box(8490, 8490),
+  Box(8491, 8491),
+  Box(8492, 8492),
+  Box(8493, 8493),
+  Box(8494, 8494),
+  Box(8495, 8495),
+  Box(8496, 8496),
+  Box(8497, 8497),
+  Box(8498, 8498),
+  Box(8499, 8499),
+  Box(8500, 8500),
+  Box(8501, 8501),
+  Box(8502, 8502),
+  Box(8503, 8503),
+  Box(8504, 8504),
+  Box(8505, 8505),
+  Box(8506, 8506),
+  Box(8507, 8507),
+  Box(8508, 8508),
+  Box(8509, 8509),
+  Box(8510, 8510),
+  Box(8511, 8511),
+  Box(8512, 8512),
+  Box(8513, 8513),
+  Box(8514, 8514),
+  Box(8515, 8515),
+  Box(8516, 8516),
+  Box(8517, 8517),
+  Box(8518, 8518),
+  Box(8519, 8519),
+  Box(8520, 8520),
+  Box(8521, 8521),
+  Box(8522, 8522),
+  Box(8523, 8523),
+  Box(8524, 8524),
+  Box(8525, 8525),
+  Box(8526, 8526),
+  Box(8527, 8527),
+  Box(8528, 8528),
+  Box(8529, 8529),
+  Box(8530, 8530),
+  Box(8531, 8531),
+  Box(8532, 8532),
+  Box(8533, 8533),
+  Box(8534, 8534),
+  Box(8535, 8535),
+  Box(8536, 8536),
+  Box(8537, 8537),
+  Box(8538, 8538),
+  Box(8539, 8539),
+  Box(8540, 8540),
+  Box(8541, 8541),
+  Box(8542, 8542),
+  Box(8543, 8543),
+  Box(8544, 8544),
+  Box(8545, 8545),
+  Box(8546, 8546),
+  Box(8547, 8547),
+  Box(8548, 8548),
+  Box(8549, 8549),
+  Box(8550, 8550),
+  Box(8551, 8551),
+  Box(8552, 8552),
+  Box(8553, 8553),
+  Box(8554, 8554),
+  Box(8555, 8555),
+  Box(8556, 8556),
+  Box(8557, 8557),
+  Box(8558, 8558),
+  Box(8559, 8559),
+  Box(8560, 8560),
+  Box(8561, 8561),
+  Box(8562, 8562),
+  Box(8563, 8563),
+  Box(8564, 8564),
+  Box(8565, 8565),
+  Box(8566, 8566),
+  Box(8567, 8567),
+  Box(8568, 8568),
+  Box(8569, 8569),
+  Box(8570, 8570),
+  Box(8571, 8571),
+  Box(8572, 8572),
+  Box(8573, 8573),
+  Box(8574, 8574),
+  Box(8575, 8575),
+  Box(8576, 8576),
+  Box(8577, 8577),
+  Box(8578, 8578),
+  Box(8579, 8579),
+  Box(8580, 8580),
+  Box(8581, 8581),
+  Box(8582, 8582),
+  Box(8583, 8583),
+  Box(8584, 8584),
+  Box(8585, 8585),
+  Box(8586, 8586),
+  Box(8587, 8587),
+  Box(8588, 8588),
+  Box(8589, 8589),
+  Box(8590, 8590),
+  Box(8591, 8591),
+  Box(8592, 8592),
+  Box(8593, 8593),
+  Box(8594, 8594),
+  Box(8595, 8595),
+  Box(8596, 8596),
+  Box(8597, 8597),
+  Box(8598, 8598),
+  Box(8599, 8599),
+  Box(8600, 8600),
+  Box(8601, 8601),
+  Box(8602, 8602),
+  Box(8603, 8603),
+  Box(8604, 8604),
+  Box(8605, 8605),
+  Box(8606, 8606),
+  Box(8607, 8607),
+  Box(8608, 8608),
+  Box(8609, 8609),
+  Box(8610, 8610),
+  Box(8611, 8611),
+  Box(8612, 8612),
+  Box(8613, 8613),
+  Box(8614, 8614),
+  Box(8615, 8615),
+  Box(8616, 8616),
+  Box(8617, 8617),
+  Box(8618, 8618),
+  Box(8619, 8619),
+  Box(8620, 8620),
+  Box(8621, 8621),
+  Box(8622, 8622),
+  Box(8623, 8623),
+  Box(8624, 8624),
+  Box(8625, 8625),
+  Box(8626, 8626),
+  Box(8627, 8627),
+  Box(8628, 8628),
+  Box(8629, 8629),
+  Box(8630, 8630),
+  Box(8631, 8631),
+  Box(8632, 8632),
+  Box(8633, 8633),
+  Box(8634, 8634),
+  Box(8635, 8635),
+  Box(8636, 8636),
+  Box(8637, 8637),
+  Box(8638, 8638),
+  Box(8639, 8639),
+  Box(8640, 8640),
+  Box(8641, 8641),
+  Box(8642, 8642),
+  Box(8643, 8643),
+  Box(8644, 8644),
+  Box(8645, 8645),
+  Box(8646, 8646),
+  Box(8647, 8647),
+  Box(8648, 8648),
+  Box(8649, 8649),
+  Box(8650, 8650),
+  Box(8651, 8651),
+  Box(8652, 8652),
+  Box(8653, 8653),
+  Box(8654, 8654),
+  Box(8655, 8655),
+  Box(8656, 8656),
+  Box(8657, 8657),
+  Box(8658, 8658),
+  Box(8659, 8659),
+  Box(8660, 8660),
+  Box(8661, 8661),
+  Box(8662, 8662),
+  Box(8663, 8663),
+  Box(8664, 8664),
+  Box(8665, 8665),
+  Box(8666, 8666),
+  Box(8667, 8667),
+  Box(8668, 8668),
+  Box(8669, 8669),
+  Box(8670, 8670),
+  Box(8671, 8671),
+  Box(8672, 8672),
+  Box(8673, 8673),
+  Box(8674, 8674),
+  Box(8675, 8675),
+  Box(8676, 8676),
+  Box(8677, 8677),
+  Box(8678, 8678),
+  Box(8679, 8679),
+  Box(8680, 8680),
+  Box(8681, 8681),
+  Box(8682, 8682),
+  Box(8683, 8683),
+  Box(8684, 8684),
+  Box(8685, 8685),
+  Box(8686, 8686),
+  Box(8687, 8687),
+  Box(8688, 8688),
+  Box(8689, 8689),
+  Box(8690, 8690),
+  Box(8691, 8691),
+  Box(8692, 8692),
+  Box(8693, 8693),
+  Box(8694, 8694),
+  Box(8695, 8695),
+  Box(8696, 8696),
+  Box(8697, 8697),
+  Box(8698, 8698),
+  Box(8699, 8699),
+  Box(8700, 8700),
+  Box(8701, 8701),
+  Box(8702, 8702),
+  Box(8703, 8703),
+  Box(8704, 8704),
+  Box(8705, 8705),
+  Box(8706, 8706),
+  Box(8707, 8707),
+  Box(8708, 8708),
+  Box(8709, 8709),
+  Box(8710, 8710),
+  Box(8711, 8711),
+  Box(8712, 8712),
+  Box(8713, 8713),
+  Box(8714, 8714),
+  Box(8715, 8715),
+  Box(8716, 8716),
+  Box(8717, 8717),
+  Box(8718, 8718),
+  Box(8719, 8719),
+  Box(8720, 8720),
+  Box(8721, 8721),
+  Box(8722, 8722),
+  Box(8723, 8723),
+  Box(8724, 8724),
+  Box(8725, 8725),
+  Box(8726, 8726),
+  Box(8727, 8727),
+  Box(8728, 8728),
+  Box(8729, 8729),
+  Box(8730, 8730),
+  Box(8731, 8731),
+  Box(8732, 8732),
+  Box(8733, 8733),
+  Box(8734, 8734),
+  Box(8735, 8735),
+  Box(8736, 8736),
+  Box(8737, 8737),
+  Box(8738, 8738),
+  Box(8739, 8739),
+  Box(8740, 8740),
+  Box(8741, 8741),
+  Box(8742, 8742),
+  Box(8743, 8743),
+  Box(8744, 8744),
+  Box(8745, 8745),
+  Box(8746, 8746),
+  Box(8747, 8747),
+  Box(8748, 8748),
+  Box(8749, 8749),
+  Box(8750, 8750),
+  Box(8751, 8751),
+  Box(8752, 8752),
+  Box(8753, 8753),
+  Box(8754, 8754),
+  Box(8755, 8755),
+  Box(8756, 8756),
+  Box(8757, 8757),
+  Box(8758, 8758),
+  Box(8759, 8759),
+  Box(8760, 8760),
+  Box(8761, 8761),
+  Box(8762, 8762),
+  Box(8763, 8763),
+  Box(8764, 8764),
+  Box(8765, 8765),
+  Box(8766, 8766),
+  Box(8767, 8767),
+  Box(8768, 8768),
+  Box(8769, 8769),
+  Box(8770, 8770),
+  Box(8771, 8771),
+  Box(8772, 8772),
+  Box(8773, 8773),
+  Box(8774, 8774),
+  Box(8775, 8775),
+  Box(8776, 8776),
+  Box(8777, 8777),
+  Box(8778, 8778),
+  Box(8779, 8779),
+  Box(8780, 8780),
+  Box(8781, 8781),
+  Box(8782, 8782),
+  Box(8783, 8783),
+  Box(8784, 8784),
+  Box(8785, 8785),
+  Box(8786, 8786),
+  Box(8787, 8787),
+  Box(8788, 8788),
+  Box(8789, 8789),
+  Box(8790, 8790),
+  Box(8791, 8791),
+  Box(8792, 8792),
+  Box(8793, 8793),
+  Box(8794, 8794),
+  Box(8795, 8795),
+  Box(8796, 8796),
+  Box(8797, 8797),
+  Box(8798, 8798),
+  Box(8799, 8799),
+  Box(8800, 8800),
+  Box(8801, 8801),
+  Box(8802, 8802),
+  Box(8803, 8803),
+  Box(8804, 8804),
+  Box(8805, 8805),
+  Box(8806, 8806),
+  Box(8807, 8807),
+  Box(8808, 8808),
+  Box(8809, 8809),
+  Box(8810, 8810),
+  Box(8811, 8811),
+  Box(8812, 8812),
+  Box(8813, 8813),
+  Box(8814, 8814),
+  Box(8815, 8815),
+  Box(8816, 8816),
+  Box(8817, 8817),
+  Box(8818, 8818),
+  Box(8819, 8819),
+  Box(8820, 8820),
+  Box(8821, 8821),
+  Box(8822, 8822),
+  Box(8823, 8823),
+  Box(8824, 8824),
+  Box(8825, 8825),
+  Box(8826, 8826),
+  Box(8827, 8827),
+  Box(8828, 8828),
+  Box(8829, 8829),
+  Box(8830, 8830),
+  Box(8831, 8831),
+  Box(8832, 8832),
+  Box(8833, 8833),
+  Box(8834, 8834),
+  Box(8835, 8835),
+  Box(8836, 8836),
+  Box(8837, 8837),
+  Box(8838, 8838),
+  Box(8839, 8839),
+  Box(8840, 8840),
+  Box(8841, 8841),
+  Box(8842, 8842),
+  Box(8843, 8843),
+  Box(8844, 8844),
+  Box(8845, 8845),
+  Box(8846, 8846),
+  Box(8847, 8847),
+  Box(8848, 8848),
+  Box(8849, 8849),
+  Box(8850, 8850),
+  Box(8851, 8851),
+  Box(8852, 8852),
+  Box(8853, 8853),
+  Box(8854, 8854),
+  Box(8855, 8855),
+  Box(8856, 8856),
+  Box(8857, 8857),
+  Box(8858, 8858),
+  Box(8859, 8859),
+  Box(8860, 8860),
+  Box(8861, 8861),
+  Box(8862, 8862),
+  Box(8863, 8863),
+  Box(8864, 8864),
+  Box(8865, 8865),
+  Box(8866, 8866),
+  Box(8867, 8867),
+  Box(8868, 8868),
+  Box(8869, 8869),
+  Box(8870, 8870),
+  Box(8871, 8871),
+  Box(8872, 8872),
+  Box(8873, 8873),
+  Box(8874, 8874),
+  Box(8875, 8875),
+  Box(8876, 8876),
+  Box(8877, 8877),
+  Box(8878, 8878),
+  Box(8879, 8879),
+  Box(8880, 8880),
+  Box(8881, 8881),
+  Box(8882, 8882),
+  Box(8883, 8883),
+  Box(8884, 8884),
+  Box(8885, 8885),
+  Box(8886, 8886),
+  Box(8887, 8887),
+  Box(8888, 8888),
+  Box(8889, 8889),
+  Box(8890, 8890),
+  Box(8891, 8891),
+  Box(8892, 8892),
+  Box(8893, 8893),
+  Box(8894, 8894),
+  Box(8895, 8895),
+  Box(8896, 8896),
+  Box(8897, 8897),
+  Box(8898, 8898),
+  Box(8899, 8899),
+  Box(8900, 8900),
+  Box(8901, 8901),
+  Box(8902, 8902),
+  Box(8903, 8903),
+  Box(8904, 8904),
+  Box(8905, 8905),
+  Box(8906, 8906),
+  Box(8907, 8907),
+  Box(8908, 8908),
+  Box(8909, 8909),
+  Box(8910, 8910),
+  Box(8911, 8911),
+  Box(8912, 8912),
+  Box(8913, 8913),
+  Box(8914, 8914),
+  Box(8915, 8915),
+  Box(8916, 8916),
+  Box(8917, 8917),
+  Box(8918, 8918),
+  Box(8919, 8919),
+  Box(8920, 8920),
+  Box(8921, 8921),
+  Box(8922, 8922),
+  Box(8923, 8923),
+  Box(8924, 8924),
+  Box(8925, 8925),
+  Box(8926, 8926),
+  Box(8927, 8927),
+  Box(8928, 8928),
+  Box(8929, 8929),
+  Box(8930, 8930),
+  Box(8931, 8931),
+  Box(8932, 8932),
+  Box(8933, 8933),
+  Box(8934, 8934),
+  Box(8935, 8935),
+  Box(8936, 8936),
+  Box(8937, 8937),
+  Box(8938, 8938),
+  Box(8939, 8939),
+  Box(8940, 8940),
+  Box(8941, 8941),
+  Box(8942, 8942),
+  Box(8943, 8943),
+  Box(8944, 8944),
+  Box(8945, 8945),
+  Box(8946, 8946),
+  Box(8947, 8947),
+  Box(8948, 8948),
+  Box(8949, 8949),
+  Box(8950, 8950),
+  Box(8951, 8951),
+  Box(8952, 8952),
+  Box(8953, 8953),
+  Box(8954, 8954),
+  Box(8955, 8955),
+  Box(8956, 8956),
+  Box(8957, 8957),
+  Box(8958, 8958),
+  Box(8959, 8959),
+  Box(8960, 8960),
+  Box(8961, 8961),
+  Box(8962, 8962),
+  Box(8963, 8963),
+  Box(8964, 8964),
+  Box(8965, 8965),
+  Box(8966, 8966),
+  Box(8967, 8967),
+  Box(8968, 8968),
+  Box(8969, 8969),
+  Box(8970, 8970),
+  Box(8971, 8971),
+  Box(8972, 8972),
+  Box(8973, 8973),
+  Box(8974, 8974),
+  Box(8975, 8975),
+  Box(8976, 8976),
+  Box(8977, 8977),
+  Box(8978, 8978),
+  Box(8979, 8979),
+  Box(8980, 8980),
+  Box(8981, 8981),
+  Box(8982, 8982),
+  Box(8983, 8983),
+  Box(8984, 8984),
+  Box(8985, 8985),
+  Box(8986, 8986),
+  Box(8987, 8987),
+  Box(8988, 8988),
+  Box(8989, 8989),
+  Box(8990, 8990),
+  Box(8991, 8991),
+  Box(8992, 8992),
+  Box(8993, 8993),
+  Box(8994, 8994),
+  Box(8995, 8995),
+  Box(8996, 8996),
+  Box(8997, 8997),
+  Box(8998, 8998),
+  Box(8999, 8999),
+  Box(9000, 9000),
+  Box(9001, 9001),
+  Box(9002, 9002),
+  Box(9003, 9003),
+  Box(9004, 9004),
+  Box(9005, 9005),
+  Box(9006, 9006),
+  Box(9007, 9007),
+  Box(9008, 9008),
+  Box(9009, 9009),
+  Box(9010, 9010),
+  Box(9011, 9011),
+  Box(9012, 9012),
+  Box(9013, 9013),
+  Box(9014, 9014),
+  Box(9015, 9015),
+  Box(9016, 9016),
+  Box(9017, 9017),
+  Box(9018, 9018),
+  Box(9019, 9019),
+  Box(9020, 9020),
+  Box(9021, 9021),
+  Box(9022, 9022),
+  Box(9023, 9023),
+  Box(9024, 9024),
+  Box(9025, 9025),
+  Box(9026, 9026),
+  Box(9027, 9027),
+  Box(9028, 9028),
+  Box(9029, 9029),
+  Box(9030, 9030),
+  Box(9031, 9031),
+  Box(9032, 9032),
+  Box(9033, 9033),
+  Box(9034, 9034),
+  Box(9035, 9035),
+  Box(9036, 9036),
+  Box(9037, 9037),
+  Box(9038, 9038),
+  Box(9039, 9039),
+  Box(9040, 9040),
+  Box(9041, 9041),
+  Box(9042, 9042),
+  Box(9043, 9043),
+  Box(9044, 9044),
+  Box(9045, 9045),
+  Box(9046, 9046),
+  Box(9047, 9047),
+  Box(9048, 9048),
+  Box(9049, 9049),
+  Box(9050, 9050),
+  Box(9051, 9051),
+  Box(9052, 9052),
+  Box(9053, 9053),
+  Box(9054, 9054),
+  Box(9055, 9055),
+  Box(9056, 9056),
+  Box(9057, 9057),
+  Box(9058, 9058),
+  Box(9059, 9059),
+  Box(9060, 9060),
+  Box(9061, 9061),
+  Box(9062, 9062),
+  Box(9063, 9063),
+  Box(9064, 9064),
+  Box(9065, 9065),
+  Box(9066, 9066),
+  Box(9067, 9067),
+  Box(9068, 9068),
+  Box(9069, 9069),
+  Box(9070, 9070),
+  Box(9071, 9071),
+  Box(9072, 9072),
+  Box(9073, 9073),
+  Box(9074, 9074),
+  Box(9075, 9075),
+  Box(9076, 9076),
+  Box(9077, 9077),
+  Box(9078, 9078),
+  Box(9079, 9079),
+  Box(9080, 9080),
+  Box(9081, 9081),
+  Box(9082, 9082),
+  Box(9083, 9083),
+  Box(9084, 9084),
+  Box(9085, 9085),
+  Box(9086, 9086),
+  Box(9087, 9087),
+  Box(9088, 9088),
+  Box(9089, 9089),
+  Box(9090, 9090),
+  Box(9091, 9091),
+  Box(9092, 9092),
+  Box(9093, 9093),
+  Box(9094, 9094),
+  Box(9095, 9095),
+  Box(9096, 9096),
+  Box(9097, 9097),
+  Box(9098, 9098),
+  Box(9099, 9099),
+  Box(9100, 9100),
+  Box(9101, 9101),
+  Box(9102, 9102),
+  Box(9103, 9103),
+  Box(9104, 9104),
+  Box(9105, 9105),
+  Box(9106, 9106),
+  Box(9107, 9107),
+  Box(9108, 9108),
+  Box(9109, 9109),
+  Box(9110, 9110),
+  Box(9111, 9111),
+  Box(9112, 9112),
+  Box(9113, 9113),
+  Box(9114, 9114),
+  Box(9115, 9115),
+  Box(9116, 9116),
+  Box(9117, 9117),
+  Box(9118, 9118),
+  Box(9119, 9119),
+  Box(9120, 9120),
+  Box(9121, 9121),
+  Box(9122, 9122),
+  Box(9123, 9123),
+  Box(9124, 9124),
+  Box(9125, 9125),
+  Box(9126, 9126),
+  Box(9127, 9127),
+  Box(9128, 9128),
+  Box(9129, 9129),
+  Box(9130, 9130),
+  Box(9131, 9131),
+  Box(9132, 9132),
+  Box(9133, 9133),
+  Box(9134, 9134),
+  Box(9135, 9135),
+  Box(9136, 9136),
+  Box(9137, 9137),
+  Box(9138, 9138),
+  Box(9139, 9139),
+  Box(9140, 9140),
+  Box(9141, 9141),
+  Box(9142, 9142),
+  Box(9143, 9143),
+  Box(9144, 9144),
+  Box(9145, 9145),
+  Box(9146, 9146),
+  Box(9147, 9147),
+  Box(9148, 9148),
+  Box(9149, 9149),
+  Box(9150, 9150),
+  Box(9151, 9151),
+  Box(9152, 9152),
+  Box(9153, 9153),
+  Box(9154, 9154),
+  Box(9155, 9155),
+  Box(9156, 9156),
+  Box(9157, 9157),
+  Box(9158, 9158),
+  Box(9159, 9159),
+  Box(9160, 9160),
+  Box(9161, 9161),
+  Box(9162, 9162),
+  Box(9163, 9163),
+  Box(9164, 9164),
+  Box(9165, 9165),
+  Box(9166, 9166),
+  Box(9167, 9167),
+  Box(9168, 9168),
+  Box(9169, 9169),
+  Box(9170, 9170),
+  Box(9171, 9171),
+  Box(9172, 9172),
+  Box(9173, 9173),
+  Box(9174, 9174),
+  Box(9175, 9175),
+  Box(9176, 9176),
+  Box(9177, 9177),
+  Box(9178, 9178),
+  Box(9179, 9179),
+  Box(9180, 9180),
+  Box(9181, 9181),
+  Box(9182, 9182),
+  Box(9183, 9183),
+  Box(9184, 9184),
+  Box(9185, 9185),
+  Box(9186, 9186),
+  Box(9187, 9187),
+  Box(9188, 9188),
+  Box(9189, 9189),
+  Box(9190, 9190),
+  Box(9191, 9191),
+  Box(9192, 9192),
+  Box(9193, 9193),
+  Box(9194, 9194),
+  Box(9195, 9195),
+  Box(9196, 9196),
+  Box(9197, 9197),
+  Box(9198, 9198),
+  Box(9199, 9199),
+  Box(9200, 9200),
+  Box(9201, 9201),
+  Box(9202, 9202),
+  Box(9203, 9203),
+  Box(9204, 9204),
+  Box(9205, 9205),
+  Box(9206, 9206),
+  Box(9207, 9207),
+  Box(9208, 9208),
+  Box(9209, 9209),
+  Box(9210, 9210),
+  Box(9211, 9211),
+  Box(9212, 9212),
+  Box(9213, 9213),
+  Box(9214, 9214),
+  Box(9215, 9215),
+  Box(9216, 9216),
+  Box(9217, 9217),
+  Box(9218, 9218),
+  Box(9219, 9219),
+  Box(9220, 9220),
+  Box(9221, 9221),
+  Box(9222, 9222),
+  Box(9223, 9223),
+  Box(9224, 9224),
+  Box(9225, 9225),
+  Box(9226, 9226),
+  Box(9227, 9227),
+  Box(9228, 9228),
+  Box(9229, 9229),
+  Box(9230, 9230),
+  Box(9231, 9231),
+  Box(9232, 9232),
+  Box(9233, 9233),
+  Box(9234, 9234),
+  Box(9235, 9235),
+  Box(9236, 9236),
+  Box(9237, 9237),
+  Box(9238, 9238),
+  Box(9239, 9239),
+  Box(9240, 9240),
+  Box(9241, 9241),
+  Box(9242, 9242),
+  Box(9243, 9243),
+  Box(9244, 9244),
+  Box(9245, 9245),
+  Box(9246, 9246),
+  Box(9247, 9247),
+  Box(9248, 9248),
+  Box(9249, 9249),
+  Box(9250, 9250),
+  Box(9251, 9251),
+  Box(9252, 9252),
+  Box(9253, 9253),
+  Box(9254, 9254),
+  Box(9255, 9255),
+  Box(9256, 9256),
+  Box(9257, 9257),
+  Box(9258, 9258),
+  Box(9259, 9259),
+  Box(9260, 9260),
+  Box(9261, 9261),
+  Box(9262, 9262),
+  Box(9263, 9263),
+  Box(9264, 9264),
+  Box(9265, 9265),
+  Box(9266, 9266),
+  Box(9267, 9267),
+  Box(9268, 9268),
+  Box(9269, 9269),
+  Box(9270, 9270),
+  Box(9271, 9271),
+  Box(9272, 9272),
+  Box(9273, 9273),
+  Box(9274, 9274),
+  Box(9275, 9275),
+  Box(9276, 9276),
+  Box(9277, 9277),
+  Box(9278, 9278),
+  Box(9279, 9279),
+  Box(9280, 9280),
+  Box(9281, 9281),
+  Box(9282, 9282),
+  Box(9283, 9283),
+  Box(9284, 9284),
+  Box(9285, 9285),
+  Box(9286, 9286),
+  Box(9287, 9287),
+  Box(9288, 9288),
+  Box(9289, 9289),
+  Box(9290, 9290),
+  Box(9291, 9291),
+  Box(9292, 9292),
+  Box(9293, 9293),
+  Box(9294, 9294),
+  Box(9295, 9295),
+  Box(9296, 9296),
+  Box(9297, 9297),
+  Box(9298, 9298),
+  Box(9299, 9299),
+  Box(9300, 9300),
+  Box(9301, 9301),
+  Box(9302, 9302),
+  Box(9303, 9303),
+  Box(9304, 9304),
+  Box(9305, 9305),
+  Box(9306, 9306),
+  Box(9307, 9307),
+  Box(9308, 9308),
+  Box(9309, 9309),
+  Box(9310, 9310),
+  Box(9311, 9311),
+  Box(9312, 9312),
+  Box(9313, 9313),
+  Box(9314, 9314),
+  Box(9315, 9315),
+  Box(9316, 9316),
+  Box(9317, 9317),
+  Box(9318, 9318),
+  Box(9319, 9319),
+  Box(9320, 9320),
+  Box(9321, 9321),
+  Box(9322, 9322),
+  Box(9323, 9323),
+  Box(9324, 9324),
+  Box(9325, 9325),
+  Box(9326, 9326),
+  Box(9327, 9327),
+  Box(9328, 9328),
+  Box(9329, 9329),
+  Box(9330, 9330),
+  Box(9331, 9331),
+  Box(9332, 9332),
+  Box(9333, 9333),
+  Box(9334, 9334),
+  Box(9335, 9335),
+  Box(9336, 9336),
+  Box(9337, 9337),
+  Box(9338, 9338),
+  Box(9339, 9339),
+  Box(9340, 9340),
+  Box(9341, 9341),
+  Box(9342, 9342),
+  Box(9343, 9343),
+  Box(9344, 9344),
+  Box(9345, 9345),
+  Box(9346, 9346),
+  Box(9347, 9347),
+  Box(9348, 9348),
+  Box(9349, 9349),
+  Box(9350, 9350),
+  Box(9351, 9351),
+  Box(9352, 9352),
+  Box(9353, 9353),
+  Box(9354, 9354),
+  Box(9355, 9355),
+  Box(9356, 9356),
+  Box(9357, 9357),
+  Box(9358, 9358),
+  Box(9359, 9359),
+  Box(9360, 9360),
+  Box(9361, 9361),
+  Box(9362, 9362),
+  Box(9363, 9363),
+  Box(9364, 9364),
+  Box(9365, 9365),
+  Box(9366, 9366),
+  Box(9367, 9367),
+  Box(9368, 9368),
+  Box(9369, 9369),
+  Box(9370, 9370),
+  Box(9371, 9371),
+  Box(9372, 9372),
+  Box(9373, 9373),
+  Box(9374, 9374),
+  Box(9375, 9375),
+  Box(9376, 9376),
+  Box(9377, 9377),
+  Box(9378, 9378),
+  Box(9379, 9379),
+  Box(9380, 9380),
+  Box(9381, 9381),
+  Box(9382, 9382),
+  Box(9383, 9383),
+  Box(9384, 9384),
+  Box(9385, 9385),
+  Box(9386, 9386),
+  Box(9387, 9387),
+  Box(9388, 9388),
+  Box(9389, 9389),
+  Box(9390, 9390),
+  Box(9391, 9391),
+  Box(9392, 9392),
+  Box(9393, 9393),
+  Box(9394, 9394),
+  Box(9395, 9395),
+  Box(9396, 9396),
+  Box(9397, 9397),
+  Box(9398, 9398),
+  Box(9399, 9399),
+  Box(9400, 9400),
+  Box(9401, 9401),
+  Box(9402, 9402),
+  Box(9403, 9403),
+  Box(9404, 9404),
+  Box(9405, 9405),
+  Box(9406, 9406),
+  Box(9407, 9407),
+  Box(9408, 9408),
+  Box(9409, 9409),
+  Box(9410, 9410),
+  Box(9411, 9411),
+  Box(9412, 9412),
+  Box(9413, 9413),
+  Box(9414, 9414),
+  Box(9415, 9415),
+  Box(9416, 9416),
+  Box(9417, 9417),
+  Box(9418, 9418),
+  Box(9419, 9419),
+  Box(9420, 9420),
+  Box(9421, 9421),
+  Box(9422, 9422),
+  Box(9423, 9423),
+  Box(9424, 9424),
+  Box(9425, 9425),
+  Box(9426, 9426),
+  Box(9427, 9427),
+  Box(9428, 9428),
+  Box(9429, 9429),
+  Box(9430, 9430),
+  Box(9431, 9431),
+  Box(9432, 9432),
+  Box(9433, 9433),
+  Box(9434, 9434),
+  Box(9435, 9435),
+  Box(9436, 9436),
+  Box(9437, 9437),
+  Box(9438, 9438),
+  Box(9439, 9439),
+  Box(9440, 9440),
+  Box(9441, 9441),
+  Box(9442, 9442),
+  Box(9443, 9443),
+  Box(9444, 9444),
+  Box(9445, 9445),
+  Box(9446, 9446),
+  Box(9447, 9447),
+  Box(9448, 9448),
+  Box(9449, 9449),
+  Box(9450, 9450),
+  Box(9451, 9451),
+  Box(9452, 9452),
+  Box(9453, 9453),
+  Box(9454, 9454),
+  Box(9455, 9455),
+  Box(9456, 9456),
+  Box(9457, 9457),
+  Box(9458, 9458),
+  Box(9459, 9459),
+  Box(9460, 9460),
+  Box(9461, 9461),
+  Box(9462, 9462),
+  Box(9463, 9463),
+  Box(9464, 9464),
+  Box(9465, 9465),
+  Box(9466, 9466),
+  Box(9467, 9467),
+  Box(9468, 9468),
+  Box(9469, 9469),
+  Box(9470, 9470),
+  Box(9471, 9471),
+  Box(9472, 9472),
+  Box(9473, 9473),
+  Box(9474, 9474),
+  Box(9475, 9475),
+  Box(9476, 9476),
+  Box(9477, 9477),
+  Box(9478, 9478),
+  Box(9479, 9479),
+  Box(9480, 9480),
+  Box(9481, 9481),
+  Box(9482, 9482),
+  Box(9483, 9483),
+  Box(9484, 9484),
+  Box(9485, 9485),
+  Box(9486, 9486),
+  Box(9487, 9487),
+  Box(9488, 9488),
+  Box(9489, 9489),
+  Box(9490, 9490),
+  Box(9491, 9491),
+  Box(9492, 9492),
+  Box(9493, 9493),
+  Box(9494, 9494),
+  Box(9495, 9495),
+  Box(9496, 9496),
+  Box(9497, 9497),
+  Box(9498, 9498),
+  Box(9499, 9499),
+  Box(9500, 9500),
+  Box(9501, 9501),
+  Box(9502, 9502),
+  Box(9503, 9503),
+  Box(9504, 9504),
+  Box(9505, 9505),
+  Box(9506, 9506),
+  Box(9507, 9507),
+  Box(9508, 9508),
+  Box(9509, 9509),
+  Box(9510, 9510),
+  Box(9511, 9511),
+  Box(9512, 9512),
+  Box(9513, 9513),
+  Box(9514, 9514),
+  Box(9515, 9515),
+  Box(9516, 9516),
+  Box(9517, 9517),
+  Box(9518, 9518),
+  Box(9519, 9519),
+  Box(9520, 9520),
+  Box(9521, 9521),
+  Box(9522, 9522),
+  Box(9523, 9523),
+  Box(9524, 9524),
+  Box(9525, 9525),
+  Box(9526, 9526),
+  Box(9527, 9527),
+  Box(9528, 9528),
+  Box(9529, 9529),
+  Box(9530, 9530),
+  Box(9531, 9531),
+  Box(9532, 9532),
+  Box(9533, 9533),
+  Box(9534, 9534),
+  Box(9535, 9535),
+  Box(9536, 9536),
+  Box(9537, 9537),
+  Box(9538, 9538),
+  Box(9539, 9539),
+  Box(9540, 9540),
+  Box(9541, 9541),
+  Box(9542, 9542),
+  Box(9543, 9543),
+  Box(9544, 9544),
+  Box(9545, 9545),
+  Box(9546, 9546),
+  Box(9547, 9547),
+  Box(9548, 9548),
+  Box(9549, 9549),
+  Box(9550, 9550),
+  Box(9551, 9551),
+  Box(9552, 9552),
+  Box(9553, 9553),
+  Box(9554, 9554),
+  Box(9555, 9555),
+  Box(9556, 9556),
+  Box(9557, 9557),
+  Box(9558, 9558),
+  Box(9559, 9559),
+  Box(9560, 9560),
+  Box(9561, 9561),
+  Box(9562, 9562),
+  Box(9563, 9563),
+  Box(9564, 9564),
+  Box(9565, 9565),
+  Box(9566, 9566),
+  Box(9567, 9567),
+  Box(9568, 9568),
+  Box(9569, 9569),
+  Box(9570, 9570),
+  Box(9571, 9571),
+  Box(9572, 9572),
+  Box(9573, 9573),
+  Box(9574, 9574),
+  Box(9575, 9575),
+  Box(9576, 9576),
+  Box(9577, 9577),
+  Box(9578, 9578),
+  Box(9579, 9579),
+  Box(9580, 9580),
+  Box(9581, 9581),
+  Box(9582, 9582),
+  Box(9583, 9583),
+  Box(9584, 9584),
+  Box(9585, 9585),
+  Box(9586, 9586),
+  Box(9587, 9587),
+  Box(9588, 9588),
+  Box(9589, 9589),
+  Box(9590, 9590),
+  Box(9591, 9591),
+  Box(9592, 9592),
+  Box(9593, 9593),
+  Box(9594, 9594),
+  Box(9595, 9595),
+  Box(9596, 9596),
+  Box(9597, 9597),
+  Box(9598, 9598),
+  Box(9599, 9599),
+  Box(9600, 9600),
+  Box(9601, 9601),
+  Box(9602, 9602),
+  Box(9603, 9603),
+  Box(9604, 9604),
+  Box(9605, 9605),
+  Box(9606, 9606),
+  Box(9607, 9607),
+  Box(9608, 9608),
+  Box(9609, 9609),
+  Box(9610, 9610),
+  Box(9611, 9611),
+  Box(9612, 9612),
+  Box(9613, 9613),
+  Box(9614, 9614),
+  Box(9615, 9615),
+  Box(9616, 9616),
+  Box(9617, 9617),
+  Box(9618, 9618),
+  Box(9619, 9619),
+  Box(9620, 9620),
+  Box(9621, 9621),
+  Box(9622, 9622),
+  Box(9623, 9623),
+  Box(9624, 9624),
+  Box(9625, 9625),
+  Box(9626, 9626),
+  Box(9627, 9627),
+  Box(9628, 9628),
+  Box(9629, 9629),
+  Box(9630, 9630),
+  Box(9631, 9631),
+  Box(9632, 9632),
+  Box(9633, 9633),
+  Box(9634, 9634),
+  Box(9635, 9635),
+  Box(9636, 9636),
+  Box(9637, 9637),
+  Box(9638, 9638),
+  Box(9639, 9639),
+  Box(9640, 9640),
+  Box(9641, 9641),
+  Box(9642, 9642),
+  Box(9643, 9643),
+  Box(9644, 9644),
+  Box(9645, 9645),
+  Box(9646, 9646),
+  Box(9647, 9647),
+  Box(9648, 9648),
+  Box(9649, 9649),
+  Box(9650, 9650),
+  Box(9651, 9651),
+  Box(9652, 9652),
+  Box(9653, 9653),
+  Box(9654, 9654),
+  Box(9655, 9655),
+  Box(9656, 9656),
+  Box(9657, 9657),
+  Box(9658, 9658),
+  Box(9659, 9659),
+  Box(9660, 9660),
+  Box(9661, 9661),
+  Box(9662, 9662),
+  Box(9663, 9663),
+  Box(9664, 9664),
+  Box(9665, 9665),
+  Box(9666, 9666),
+  Box(9667, 9667),
+  Box(9668, 9668),
+  Box(9669, 9669),
+  Box(9670, 9670),
+  Box(9671, 9671),
+  Box(9672, 9672),
+  Box(9673, 9673),
+  Box(9674, 9674),
+  Box(9675, 9675),
+  Box(9676, 9676),
+  Box(9677, 9677),
+  Box(9678, 9678),
+  Box(9679, 9679),
+  Box(9680, 9680),
+  Box(9681, 9681),
+  Box(9682, 9682),
+  Box(9683, 9683),
+  Box(9684, 9684),
+  Box(9685, 9685),
+  Box(9686, 9686),
+  Box(9687, 9687),
+  Box(9688, 9688),
+  Box(9689, 9689),
+  Box(9690, 9690),
+  Box(9691, 9691),
+  Box(9692, 9692),
+  Box(9693, 9693),
+  Box(9694, 9694),
+  Box(9695, 9695),
+  Box(9696, 9696),
+  Box(9697, 9697),
+  Box(9698, 9698),
+  Box(9699, 9699),
+  Box(9700, 9700),
+  Box(9701, 9701),
+  Box(9702, 9702),
+  Box(9703, 9703),
+  Box(9704, 9704),
+  Box(9705, 9705),
+  Box(9706, 9706),
+  Box(9707, 9707),
+  Box(9708, 9708),
+  Box(9709, 9709),
+  Box(9710, 9710),
+  Box(9711, 9711),
+  Box(9712, 9712),
+  Box(9713, 9713),
+  Box(9714, 9714),
+  Box(9715, 9715),
+  Box(9716, 9716),
+  Box(9717, 9717),
+  Box(9718, 9718),
+  Box(9719, 9719),
+  Box(9720, 9720),
+  Box(9721, 9721),
+  Box(9722, 9722),
+  Box(9723, 9723),
+  Box(9724, 9724),
+  Box(9725, 9725),
+  Box(9726, 9726),
+  Box(9727, 9727),
+  Box(9728, 9728),
+  Box(9729, 9729),
+  Box(9730, 9730),
+  Box(9731, 9731),
+  Box(9732, 9732),
+  Box(9733, 9733),
+  Box(9734, 9734),
+  Box(9735, 9735),
+  Box(9736, 9736),
+  Box(9737, 9737),
+  Box(9738, 9738),
+  Box(9739, 9739),
+  Box(9740, 9740),
+  Box(9741, 9741),
+  Box(9742, 9742),
+  Box(9743, 9743),
+  Box(9744, 9744),
+  Box(9745, 9745),
+  Box(9746, 9746),
+  Box(9747, 9747),
+  Box(9748, 9748),
+  Box(9749, 9749),
+  Box(9750, 9750),
+  Box(9751, 9751),
+  Box(9752, 9752),
+  Box(9753, 9753),
+  Box(9754, 9754),
+  Box(9755, 9755),
+  Box(9756, 9756),
+  Box(9757, 9757),
+  Box(9758, 9758),
+  Box(9759, 9759),
+  Box(9760, 9760),
+  Box(9761, 9761),
+  Box(9762, 9762),
+  Box(9763, 9763),
+  Box(9764, 9764),
+  Box(9765, 9765),
+  Box(9766, 9766),
+  Box(9767, 9767),
+  Box(9768, 9768),
+  Box(9769, 9769),
+  Box(9770, 9770),
+  Box(9771, 9771),
+  Box(9772, 9772),
+  Box(9773, 9773),
+  Box(9774, 9774),
+  Box(9775, 9775),
+  Box(9776, 9776),
+  Box(9777, 9777),
+  Box(9778, 9778),
+  Box(9779, 9779),
+  Box(9780, 9780),
+  Box(9781, 9781),
+  Box(9782, 9782),
+  Box(9783, 9783),
+  Box(9784, 9784),
+  Box(9785, 9785),
+  Box(9786, 9786),
+  Box(9787, 9787),
+  Box(9788, 9788),
+  Box(9789, 9789),
+  Box(9790, 9790),
+  Box(9791, 9791),
+  Box(9792, 9792),
+  Box(9793, 9793),
+  Box(9794, 9794),
+  Box(9795, 9795),
+  Box(9796, 9796),
+  Box(9797, 9797),
+  Box(9798, 9798),
+  Box(9799, 9799),
+  Box(9800, 9800),
+  Box(9801, 9801),
+  Box(9802, 9802),
+  Box(9803, 9803),
+  Box(9804, 9804),
+  Box(9805, 9805),
+  Box(9806, 9806),
+  Box(9807, 9807),
+  Box(9808, 9808),
+  Box(9809, 9809),
+  Box(9810, 9810),
+  Box(9811, 9811),
+  Box(9812, 9812),
+  Box(9813, 9813),
+  Box(9814, 9814),
+  Box(9815, 9815),
+  Box(9816, 9816),
+  Box(9817, 9817),
+  Box(9818, 9818),
+  Box(9819, 9819),
+  Box(9820, 9820),
+  Box(9821, 9821),
+  Box(9822, 9822),
+  Box(9823, 9823),
+  Box(9824, 9824),
+  Box(9825, 9825),
+  Box(9826, 9826),
+  Box(9827, 9827),
+  Box(9828, 9828),
+  Box(9829, 9829),
+  Box(9830, 9830),
+  Box(9831, 9831),
+  Box(9832, 9832),
+  Box(9833, 9833),
+  Box(9834, 9834),
+  Box(9835, 9835),
+  Box(9836, 9836),
+  Box(9837, 9837),
+  Box(9838, 9838),
+  Box(9839, 9839),
+  Box(9840, 9840),
+  Box(9841, 9841),
+  Box(9842, 9842),
+  Box(9843, 9843),
+  Box(9844, 9844),
+  Box(9845, 9845),
+  Box(9846, 9846),
+  Box(9847, 9847),
+  Box(9848, 9848),
+  Box(9849, 9849),
+  Box(9850, 9850),
+  Box(9851, 9851),
+  Box(9852, 9852),
+  Box(9853, 9853),
+  Box(9854, 9854),
+  Box(9855, 9855),
+  Box(9856, 9856),
+  Box(9857, 9857),
+  Box(9858, 9858),
+  Box(9859, 9859),
+  Box(9860, 9860),
+  Box(9861, 9861),
+  Box(9862, 9862),
+  Box(9863, 9863),
+  Box(9864, 9864),
+  Box(9865, 9865),
+  Box(9866, 9866),
+  Box(9867, 9867),
+  Box(9868, 9868),
+  Box(9869, 9869),
+  Box(9870, 9870),
+  Box(9871, 9871),
+  Box(9872, 9872),
+  Box(9873, 9873),
+  Box(9874, 9874),
+  Box(9875, 9875),
+  Box(9876, 9876),
+  Box(9877, 9877),
+  Box(9878, 9878),
+  Box(9879, 9879),
+  Box(9880, 9880),
+  Box(9881, 9881),
+  Box(9882, 9882),
+  Box(9883, 9883),
+  Box(9884, 9884),
+  Box(9885, 9885),
+  Box(9886, 9886),
+  Box(9887, 9887),
+  Box(9888, 9888),
+  Box(9889, 9889),
+  Box(9890, 9890),
+  Box(9891, 9891),
+  Box(9892, 9892),
+  Box(9893, 9893),
+  Box(9894, 9894),
+  Box(9895, 9895),
+  Box(9896, 9896),
+  Box(9897, 9897),
+  Box(9898, 9898),
+  Box(9899, 9899),
+  Box(9900, 9900),
+  Box(9901, 9901),
+  Box(9902, 9902),
+  Box(9903, 9903),
+  Box(9904, 9904),
+  Box(9905, 9905),
+  Box(9906, 9906),
+  Box(9907, 9907),
+  Box(9908, 9908),
+  Box(9909, 9909),
+  Box(9910, 9910),
+  Box(9911, 9911),
+  Box(9912, 9912),
+  Box(9913, 9913),
+  Box(9914, 9914),
+  Box(9915, 9915),
+  Box(9916, 9916),
+  Box(9917, 9917),
+  Box(9918, 9918),
+  Box(9919, 9919),
+  Box(9920, 9920),
+  Box(9921, 9921),
+  Box(9922, 9922),
+  Box(9923, 9923),
+  Box(9924, 9924),
+  Box(9925, 9925),
+  Box(9926, 9926),
+  Box(9927, 9927),
+  Box(9928, 9928),
+  Box(9929, 9929),
+  Box(9930, 9930),
+  Box(9931, 9931),
+  Box(9932, 9932),
+  Box(9933, 9933),
+  Box(9934, 9934),
+  Box(9935, 9935),
+  Box(9936, 9936),
+  Box(9937, 9937),
+  Box(9938, 9938),
+  Box(9939, 9939),
+  Box(9940, 9940),
+  Box(9941, 9941),
+  Box(9942, 9942),
+  Box(9943, 9943),
+  Box(9944, 9944),
+  Box(9945, 9945),
+  Box(9946, 9946),
+  Box(9947, 9947),
+  Box(9948, 9948),
+  Box(9949, 9949),
+  Box(9950, 9950),
+  Box(9951, 9951),
+  Box(9952, 9952),
+  Box(9953, 9953),
+  Box(9954, 9954),
+  Box(9955, 9955),
+  Box(9956, 9956),
+  Box(9957, 9957),
+  Box(9958, 9958),
+  Box(9959, 9959),
+  Box(9960, 9960),
+  Box(9961, 9961),
+  Box(9962, 9962),
+  Box(9963, 9963),
+  Box(9964, 9964),
+  Box(9965, 9965),
+  Box(9966, 9966),
+  Box(9967, 9967),
+  Box(9968, 9968),
+  Box(9969, 9969),
+  Box(9970, 9970),
+  Box(9971, 9971),
+  Box(9972, 9972),
+  Box(9973, 9973),
+  Box(9974, 9974),
+  Box(9975, 9975),
+  Box(9976, 9976),
+  Box(9977, 9977),
+  Box(9978, 9978),
+  Box(9979, 9979),
+  Box(9980, 9980),
+  Box(9981, 9981),
+  Box(9982, 9982),
+  Box(9983, 9983),
+  Box(9984, 9984),
+  Box(9985, 9985),
+  Box(9986, 9986),
+  Box(9987, 9987),
+  Box(9988, 9988),
+  Box(9989, 9989),
+  Box(9990, 9990),
+  Box(9991, 9991),
+  Box(9992, 9992),
+  Box(9993, 9993),
+  Box(9994, 9994),
+  Box(9995, 9995),
+  Box(9996, 9996),
+  Box(9997, 9997),
+  Box(9998, 9998),
+  Box(9999, 9999),
+];
+
+// 10,000 elements.
+const list2 = [
+  Box(0, 0),
+  Box(1, 1),
+  Box(2, 2),
+  Box(3, 3),
+  Box(4, 4),
+  Box(5, 5),
+  Box(6, 6),
+  Box(7, 7),
+  Box(8, 8),
+  Box(9, 9),
+  Box(10, 10),
+  Box(11, 11),
+  Box(12, 12),
+  Box(13, 13),
+  Box(14, 14),
+  Box(15, 15),
+  Box(16, 16),
+  Box(17, 17),
+  Box(18, 18),
+  Box(19, 19),
+  Box(20, 20),
+  Box(21, 21),
+  Box(22, 22),
+  Box(23, 23),
+  Box(24, 24),
+  Box(25, 25),
+  Box(26, 26),
+  Box(27, 27),
+  Box(28, 28),
+  Box(29, 29),
+  Box(30, 30),
+  Box(31, 31),
+  Box(32, 32),
+  Box(33, 33),
+  Box(34, 34),
+  Box(35, 35),
+  Box(36, 36),
+  Box(37, 37),
+  Box(38, 38),
+  Box(39, 39),
+  Box(40, 40),
+  Box(41, 41),
+  Box(42, 42),
+  Box(43, 43),
+  Box(44, 44),
+  Box(45, 45),
+  Box(46, 46),
+  Box(47, 47),
+  Box(48, 48),
+  Box(49, 49),
+  Box(50, 50),
+  Box(51, 51),
+  Box(52, 52),
+  Box(53, 53),
+  Box(54, 54),
+  Box(55, 55),
+  Box(56, 56),
+  Box(57, 57),
+  Box(58, 58),
+  Box(59, 59),
+  Box(60, 60),
+  Box(61, 61),
+  Box(62, 62),
+  Box(63, 63),
+  Box(64, 64),
+  Box(65, 65),
+  Box(66, 66),
+  Box(67, 67),
+  Box(68, 68),
+  Box(69, 69),
+  Box(70, 70),
+  Box(71, 71),
+  Box(72, 72),
+  Box(73, 73),
+  Box(74, 74),
+  Box(75, 75),
+  Box(76, 76),
+  Box(77, 77),
+  Box(78, 78),
+  Box(79, 79),
+  Box(80, 80),
+  Box(81, 81),
+  Box(82, 82),
+  Box(83, 83),
+  Box(84, 84),
+  Box(85, 85),
+  Box(86, 86),
+  Box(87, 87),
+  Box(88, 88),
+  Box(89, 89),
+  Box(90, 90),
+  Box(91, 91),
+  Box(92, 92),
+  Box(93, 93),
+  Box(94, 94),
+  Box(95, 95),
+  Box(96, 96),
+  Box(97, 97),
+  Box(98, 98),
+  Box(99, 99),
+  Box(100, 100),
+  Box(101, 101),
+  Box(102, 102),
+  Box(103, 103),
+  Box(104, 104),
+  Box(105, 105),
+  Box(106, 106),
+  Box(107, 107),
+  Box(108, 108),
+  Box(109, 109),
+  Box(110, 110),
+  Box(111, 111),
+  Box(112, 112),
+  Box(113, 113),
+  Box(114, 114),
+  Box(115, 115),
+  Box(116, 116),
+  Box(117, 117),
+  Box(118, 118),
+  Box(119, 119),
+  Box(120, 120),
+  Box(121, 121),
+  Box(122, 122),
+  Box(123, 123),
+  Box(124, 124),
+  Box(125, 125),
+  Box(126, 126),
+  Box(127, 127),
+  Box(128, 128),
+  Box(129, 129),
+  Box(130, 130),
+  Box(131, 131),
+  Box(132, 132),
+  Box(133, 133),
+  Box(134, 134),
+  Box(135, 135),
+  Box(136, 136),
+  Box(137, 137),
+  Box(138, 138),
+  Box(139, 139),
+  Box(140, 140),
+  Box(141, 141),
+  Box(142, 142),
+  Box(143, 143),
+  Box(144, 144),
+  Box(145, 145),
+  Box(146, 146),
+  Box(147, 147),
+  Box(148, 148),
+  Box(149, 149),
+  Box(150, 150),
+  Box(151, 151),
+  Box(152, 152),
+  Box(153, 153),
+  Box(154, 154),
+  Box(155, 155),
+  Box(156, 156),
+  Box(157, 157),
+  Box(158, 158),
+  Box(159, 159),
+  Box(160, 160),
+  Box(161, 161),
+  Box(162, 162),
+  Box(163, 163),
+  Box(164, 164),
+  Box(165, 165),
+  Box(166, 166),
+  Box(167, 167),
+  Box(168, 168),
+  Box(169, 169),
+  Box(170, 170),
+  Box(171, 171),
+  Box(172, 172),
+  Box(173, 173),
+  Box(174, 174),
+  Box(175, 175),
+  Box(176, 176),
+  Box(177, 177),
+  Box(178, 178),
+  Box(179, 179),
+  Box(180, 180),
+  Box(181, 181),
+  Box(182, 182),
+  Box(183, 183),
+  Box(184, 184),
+  Box(185, 185),
+  Box(186, 186),
+  Box(187, 187),
+  Box(188, 188),
+  Box(189, 189),
+  Box(190, 190),
+  Box(191, 191),
+  Box(192, 192),
+  Box(193, 193),
+  Box(194, 194),
+  Box(195, 195),
+  Box(196, 196),
+  Box(197, 197),
+  Box(198, 198),
+  Box(199, 199),
+  Box(200, 200),
+  Box(201, 201),
+  Box(202, 202),
+  Box(203, 203),
+  Box(204, 204),
+  Box(205, 205),
+  Box(206, 206),
+  Box(207, 207),
+  Box(208, 208),
+  Box(209, 209),
+  Box(210, 210),
+  Box(211, 211),
+  Box(212, 212),
+  Box(213, 213),
+  Box(214, 214),
+  Box(215, 215),
+  Box(216, 216),
+  Box(217, 217),
+  Box(218, 218),
+  Box(219, 219),
+  Box(220, 220),
+  Box(221, 221),
+  Box(222, 222),
+  Box(223, 223),
+  Box(224, 224),
+  Box(225, 225),
+  Box(226, 226),
+  Box(227, 227),
+  Box(228, 228),
+  Box(229, 229),
+  Box(230, 230),
+  Box(231, 231),
+  Box(232, 232),
+  Box(233, 233),
+  Box(234, 234),
+  Box(235, 235),
+  Box(236, 236),
+  Box(237, 237),
+  Box(238, 238),
+  Box(239, 239),
+  Box(240, 240),
+  Box(241, 241),
+  Box(242, 242),
+  Box(243, 243),
+  Box(244, 244),
+  Box(245, 245),
+  Box(246, 246),
+  Box(247, 247),
+  Box(248, 248),
+  Box(249, 249),
+  Box(250, 250),
+  Box(251, 251),
+  Box(252, 252),
+  Box(253, 253),
+  Box(254, 254),
+  Box(255, 255),
+  Box(256, 256),
+  Box(257, 257),
+  Box(258, 258),
+  Box(259, 259),
+  Box(260, 260),
+  Box(261, 261),
+  Box(262, 262),
+  Box(263, 263),
+  Box(264, 264),
+  Box(265, 265),
+  Box(266, 266),
+  Box(267, 267),
+  Box(268, 268),
+  Box(269, 269),
+  Box(270, 270),
+  Box(271, 271),
+  Box(272, 272),
+  Box(273, 273),
+  Box(274, 274),
+  Box(275, 275),
+  Box(276, 276),
+  Box(277, 277),
+  Box(278, 278),
+  Box(279, 279),
+  Box(280, 280),
+  Box(281, 281),
+  Box(282, 282),
+  Box(283, 283),
+  Box(284, 284),
+  Box(285, 285),
+  Box(286, 286),
+  Box(287, 287),
+  Box(288, 288),
+  Box(289, 289),
+  Box(290, 290),
+  Box(291, 291),
+  Box(292, 292),
+  Box(293, 293),
+  Box(294, 294),
+  Box(295, 295),
+  Box(296, 296),
+  Box(297, 297),
+  Box(298, 298),
+  Box(299, 299),
+  Box(300, 300),
+  Box(301, 301),
+  Box(302, 302),
+  Box(303, 303),
+  Box(304, 304),
+  Box(305, 305),
+  Box(306, 306),
+  Box(307, 307),
+  Box(308, 308),
+  Box(309, 309),
+  Box(310, 310),
+  Box(311, 311),
+  Box(312, 312),
+  Box(313, 313),
+  Box(314, 314),
+  Box(315, 315),
+  Box(316, 316),
+  Box(317, 317),
+  Box(318, 318),
+  Box(319, 319),
+  Box(320, 320),
+  Box(321, 321),
+  Box(322, 322),
+  Box(323, 323),
+  Box(324, 324),
+  Box(325, 325),
+  Box(326, 326),
+  Box(327, 327),
+  Box(328, 328),
+  Box(329, 329),
+  Box(330, 330),
+  Box(331, 331),
+  Box(332, 332),
+  Box(333, 333),
+  Box(334, 334),
+  Box(335, 335),
+  Box(336, 336),
+  Box(337, 337),
+  Box(338, 338),
+  Box(339, 339),
+  Box(340, 340),
+  Box(341, 341),
+  Box(342, 342),
+  Box(343, 343),
+  Box(344, 344),
+  Box(345, 345),
+  Box(346, 346),
+  Box(347, 347),
+  Box(348, 348),
+  Box(349, 349),
+  Box(350, 350),
+  Box(351, 351),
+  Box(352, 352),
+  Box(353, 353),
+  Box(354, 354),
+  Box(355, 355),
+  Box(356, 356),
+  Box(357, 357),
+  Box(358, 358),
+  Box(359, 359),
+  Box(360, 360),
+  Box(361, 361),
+  Box(362, 362),
+  Box(363, 363),
+  Box(364, 364),
+  Box(365, 365),
+  Box(366, 366),
+  Box(367, 367),
+  Box(368, 368),
+  Box(369, 369),
+  Box(370, 370),
+  Box(371, 371),
+  Box(372, 372),
+  Box(373, 373),
+  Box(374, 374),
+  Box(375, 375),
+  Box(376, 376),
+  Box(377, 377),
+  Box(378, 378),
+  Box(379, 379),
+  Box(380, 380),
+  Box(381, 381),
+  Box(382, 382),
+  Box(383, 383),
+  Box(384, 384),
+  Box(385, 385),
+  Box(386, 386),
+  Box(387, 387),
+  Box(388, 388),
+  Box(389, 389),
+  Box(390, 390),
+  Box(391, 391),
+  Box(392, 392),
+  Box(393, 393),
+  Box(394, 394),
+  Box(395, 395),
+  Box(396, 396),
+  Box(397, 397),
+  Box(398, 398),
+  Box(399, 399),
+  Box(400, 400),
+  Box(401, 401),
+  Box(402, 402),
+  Box(403, 403),
+  Box(404, 404),
+  Box(405, 405),
+  Box(406, 406),
+  Box(407, 407),
+  Box(408, 408),
+  Box(409, 409),
+  Box(410, 410),
+  Box(411, 411),
+  Box(412, 412),
+  Box(413, 413),
+  Box(414, 414),
+  Box(415, 415),
+  Box(416, 416),
+  Box(417, 417),
+  Box(418, 418),
+  Box(419, 419),
+  Box(420, 420),
+  Box(421, 421),
+  Box(422, 422),
+  Box(423, 423),
+  Box(424, 424),
+  Box(425, 425),
+  Box(426, 426),
+  Box(427, 427),
+  Box(428, 428),
+  Box(429, 429),
+  Box(430, 430),
+  Box(431, 431),
+  Box(432, 432),
+  Box(433, 433),
+  Box(434, 434),
+  Box(435, 435),
+  Box(436, 436),
+  Box(437, 437),
+  Box(438, 438),
+  Box(439, 439),
+  Box(440, 440),
+  Box(441, 441),
+  Box(442, 442),
+  Box(443, 443),
+  Box(444, 444),
+  Box(445, 445),
+  Box(446, 446),
+  Box(447, 447),
+  Box(448, 448),
+  Box(449, 449),
+  Box(450, 450),
+  Box(451, 451),
+  Box(452, 452),
+  Box(453, 453),
+  Box(454, 454),
+  Box(455, 455),
+  Box(456, 456),
+  Box(457, 457),
+  Box(458, 458),
+  Box(459, 459),
+  Box(460, 460),
+  Box(461, 461),
+  Box(462, 462),
+  Box(463, 463),
+  Box(464, 464),
+  Box(465, 465),
+  Box(466, 466),
+  Box(467, 467),
+  Box(468, 468),
+  Box(469, 469),
+  Box(470, 470),
+  Box(471, 471),
+  Box(472, 472),
+  Box(473, 473),
+  Box(474, 474),
+  Box(475, 475),
+  Box(476, 476),
+  Box(477, 477),
+  Box(478, 478),
+  Box(479, 479),
+  Box(480, 480),
+  Box(481, 481),
+  Box(482, 482),
+  Box(483, 483),
+  Box(484, 484),
+  Box(485, 485),
+  Box(486, 486),
+  Box(487, 487),
+  Box(488, 488),
+  Box(489, 489),
+  Box(490, 490),
+  Box(491, 491),
+  Box(492, 492),
+  Box(493, 493),
+  Box(494, 494),
+  Box(495, 495),
+  Box(496, 496),
+  Box(497, 497),
+  Box(498, 498),
+  Box(499, 499),
+  Box(500, 500),
+  Box(501, 501),
+  Box(502, 502),
+  Box(503, 503),
+  Box(504, 504),
+  Box(505, 505),
+  Box(506, 506),
+  Box(507, 507),
+  Box(508, 508),
+  Box(509, 509),
+  Box(510, 510),
+  Box(511, 511),
+  Box(512, 512),
+  Box(513, 513),
+  Box(514, 514),
+  Box(515, 515),
+  Box(516, 516),
+  Box(517, 517),
+  Box(518, 518),
+  Box(519, 519),
+  Box(520, 520),
+  Box(521, 521),
+  Box(522, 522),
+  Box(523, 523),
+  Box(524, 524),
+  Box(525, 525),
+  Box(526, 526),
+  Box(527, 527),
+  Box(528, 528),
+  Box(529, 529),
+  Box(530, 530),
+  Box(531, 531),
+  Box(532, 532),
+  Box(533, 533),
+  Box(534, 534),
+  Box(535, 535),
+  Box(536, 536),
+  Box(537, 537),
+  Box(538, 538),
+  Box(539, 539),
+  Box(540, 540),
+  Box(541, 541),
+  Box(542, 542),
+  Box(543, 543),
+  Box(544, 544),
+  Box(545, 545),
+  Box(546, 546),
+  Box(547, 547),
+  Box(548, 548),
+  Box(549, 549),
+  Box(550, 550),
+  Box(551, 551),
+  Box(552, 552),
+  Box(553, 553),
+  Box(554, 554),
+  Box(555, 555),
+  Box(556, 556),
+  Box(557, 557),
+  Box(558, 558),
+  Box(559, 559),
+  Box(560, 560),
+  Box(561, 561),
+  Box(562, 562),
+  Box(563, 563),
+  Box(564, 564),
+  Box(565, 565),
+  Box(566, 566),
+  Box(567, 567),
+  Box(568, 568),
+  Box(569, 569),
+  Box(570, 570),
+  Box(571, 571),
+  Box(572, 572),
+  Box(573, 573),
+  Box(574, 574),
+  Box(575, 575),
+  Box(576, 576),
+  Box(577, 577),
+  Box(578, 578),
+  Box(579, 579),
+  Box(580, 580),
+  Box(581, 581),
+  Box(582, 582),
+  Box(583, 583),
+  Box(584, 584),
+  Box(585, 585),
+  Box(586, 586),
+  Box(587, 587),
+  Box(588, 588),
+  Box(589, 589),
+  Box(590, 590),
+  Box(591, 591),
+  Box(592, 592),
+  Box(593, 593),
+  Box(594, 594),
+  Box(595, 595),
+  Box(596, 596),
+  Box(597, 597),
+  Box(598, 598),
+  Box(599, 599),
+  Box(600, 600),
+  Box(601, 601),
+  Box(602, 602),
+  Box(603, 603),
+  Box(604, 604),
+  Box(605, 605),
+  Box(606, 606),
+  Box(607, 607),
+  Box(608, 608),
+  Box(609, 609),
+  Box(610, 610),
+  Box(611, 611),
+  Box(612, 612),
+  Box(613, 613),
+  Box(614, 614),
+  Box(615, 615),
+  Box(616, 616),
+  Box(617, 617),
+  Box(618, 618),
+  Box(619, 619),
+  Box(620, 620),
+  Box(621, 621),
+  Box(622, 622),
+  Box(623, 623),
+  Box(624, 624),
+  Box(625, 625),
+  Box(626, 626),
+  Box(627, 627),
+  Box(628, 628),
+  Box(629, 629),
+  Box(630, 630),
+  Box(631, 631),
+  Box(632, 632),
+  Box(633, 633),
+  Box(634, 634),
+  Box(635, 635),
+  Box(636, 636),
+  Box(637, 637),
+  Box(638, 638),
+  Box(639, 639),
+  Box(640, 640),
+  Box(641, 641),
+  Box(642, 642),
+  Box(643, 643),
+  Box(644, 644),
+  Box(645, 645),
+  Box(646, 646),
+  Box(647, 647),
+  Box(648, 648),
+  Box(649, 649),
+  Box(650, 650),
+  Box(651, 651),
+  Box(652, 652),
+  Box(653, 653),
+  Box(654, 654),
+  Box(655, 655),
+  Box(656, 656),
+  Box(657, 657),
+  Box(658, 658),
+  Box(659, 659),
+  Box(660, 660),
+  Box(661, 661),
+  Box(662, 662),
+  Box(663, 663),
+  Box(664, 664),
+  Box(665, 665),
+  Box(666, 666),
+  Box(667, 667),
+  Box(668, 668),
+  Box(669, 669),
+  Box(670, 670),
+  Box(671, 671),
+  Box(672, 672),
+  Box(673, 673),
+  Box(674, 674),
+  Box(675, 675),
+  Box(676, 676),
+  Box(677, 677),
+  Box(678, 678),
+  Box(679, 679),
+  Box(680, 680),
+  Box(681, 681),
+  Box(682, 682),
+  Box(683, 683),
+  Box(684, 684),
+  Box(685, 685),
+  Box(686, 686),
+  Box(687, 687),
+  Box(688, 688),
+  Box(689, 689),
+  Box(690, 690),
+  Box(691, 691),
+  Box(692, 692),
+  Box(693, 693),
+  Box(694, 694),
+  Box(695, 695),
+  Box(696, 696),
+  Box(697, 697),
+  Box(698, 698),
+  Box(699, 699),
+  Box(700, 700),
+  Box(701, 701),
+  Box(702, 702),
+  Box(703, 703),
+  Box(704, 704),
+  Box(705, 705),
+  Box(706, 706),
+  Box(707, 707),
+  Box(708, 708),
+  Box(709, 709),
+  Box(710, 710),
+  Box(711, 711),
+  Box(712, 712),
+  Box(713, 713),
+  Box(714, 714),
+  Box(715, 715),
+  Box(716, 716),
+  Box(717, 717),
+  Box(718, 718),
+  Box(719, 719),
+  Box(720, 720),
+  Box(721, 721),
+  Box(722, 722),
+  Box(723, 723),
+  Box(724, 724),
+  Box(725, 725),
+  Box(726, 726),
+  Box(727, 727),
+  Box(728, 728),
+  Box(729, 729),
+  Box(730, 730),
+  Box(731, 731),
+  Box(732, 732),
+  Box(733, 733),
+  Box(734, 734),
+  Box(735, 735),
+  Box(736, 736),
+  Box(737, 737),
+  Box(738, 738),
+  Box(739, 739),
+  Box(740, 740),
+  Box(741, 741),
+  Box(742, 742),
+  Box(743, 743),
+  Box(744, 744),
+  Box(745, 745),
+  Box(746, 746),
+  Box(747, 747),
+  Box(748, 748),
+  Box(749, 749),
+  Box(750, 750),
+  Box(751, 751),
+  Box(752, 752),
+  Box(753, 753),
+  Box(754, 754),
+  Box(755, 755),
+  Box(756, 756),
+  Box(757, 757),
+  Box(758, 758),
+  Box(759, 759),
+  Box(760, 760),
+  Box(761, 761),
+  Box(762, 762),
+  Box(763, 763),
+  Box(764, 764),
+  Box(765, 765),
+  Box(766, 766),
+  Box(767, 767),
+  Box(768, 768),
+  Box(769, 769),
+  Box(770, 770),
+  Box(771, 771),
+  Box(772, 772),
+  Box(773, 773),
+  Box(774, 774),
+  Box(775, 775),
+  Box(776, 776),
+  Box(777, 777),
+  Box(778, 778),
+  Box(779, 779),
+  Box(780, 780),
+  Box(781, 781),
+  Box(782, 782),
+  Box(783, 783),
+  Box(784, 784),
+  Box(785, 785),
+  Box(786, 786),
+  Box(787, 787),
+  Box(788, 788),
+  Box(789, 789),
+  Box(790, 790),
+  Box(791, 791),
+  Box(792, 792),
+  Box(793, 793),
+  Box(794, 794),
+  Box(795, 795),
+  Box(796, 796),
+  Box(797, 797),
+  Box(798, 798),
+  Box(799, 799),
+  Box(800, 800),
+  Box(801, 801),
+  Box(802, 802),
+  Box(803, 803),
+  Box(804, 804),
+  Box(805, 805),
+  Box(806, 806),
+  Box(807, 807),
+  Box(808, 808),
+  Box(809, 809),
+  Box(810, 810),
+  Box(811, 811),
+  Box(812, 812),
+  Box(813, 813),
+  Box(814, 814),
+  Box(815, 815),
+  Box(816, 816),
+  Box(817, 817),
+  Box(818, 818),
+  Box(819, 819),
+  Box(820, 820),
+  Box(821, 821),
+  Box(822, 822),
+  Box(823, 823),
+  Box(824, 824),
+  Box(825, 825),
+  Box(826, 826),
+  Box(827, 827),
+  Box(828, 828),
+  Box(829, 829),
+  Box(830, 830),
+  Box(831, 831),
+  Box(832, 832),
+  Box(833, 833),
+  Box(834, 834),
+  Box(835, 835),
+  Box(836, 836),
+  Box(837, 837),
+  Box(838, 838),
+  Box(839, 839),
+  Box(840, 840),
+  Box(841, 841),
+  Box(842, 842),
+  Box(843, 843),
+  Box(844, 844),
+  Box(845, 845),
+  Box(846, 846),
+  Box(847, 847),
+  Box(848, 848),
+  Box(849, 849),
+  Box(850, 850),
+  Box(851, 851),
+  Box(852, 852),
+  Box(853, 853),
+  Box(854, 854),
+  Box(855, 855),
+  Box(856, 856),
+  Box(857, 857),
+  Box(858, 858),
+  Box(859, 859),
+  Box(860, 860),
+  Box(861, 861),
+  Box(862, 862),
+  Box(863, 863),
+  Box(864, 864),
+  Box(865, 865),
+  Box(866, 866),
+  Box(867, 867),
+  Box(868, 868),
+  Box(869, 869),
+  Box(870, 870),
+  Box(871, 871),
+  Box(872, 872),
+  Box(873, 873),
+  Box(874, 874),
+  Box(875, 875),
+  Box(876, 876),
+  Box(877, 877),
+  Box(878, 878),
+  Box(879, 879),
+  Box(880, 880),
+  Box(881, 881),
+  Box(882, 882),
+  Box(883, 883),
+  Box(884, 884),
+  Box(885, 885),
+  Box(886, 886),
+  Box(887, 887),
+  Box(888, 888),
+  Box(889, 889),
+  Box(890, 890),
+  Box(891, 891),
+  Box(892, 892),
+  Box(893, 893),
+  Box(894, 894),
+  Box(895, 895),
+  Box(896, 896),
+  Box(897, 897),
+  Box(898, 898),
+  Box(899, 899),
+  Box(900, 900),
+  Box(901, 901),
+  Box(902, 902),
+  Box(903, 903),
+  Box(904, 904),
+  Box(905, 905),
+  Box(906, 906),
+  Box(907, 907),
+  Box(908, 908),
+  Box(909, 909),
+  Box(910, 910),
+  Box(911, 911),
+  Box(912, 912),
+  Box(913, 913),
+  Box(914, 914),
+  Box(915, 915),
+  Box(916, 916),
+  Box(917, 917),
+  Box(918, 918),
+  Box(919, 919),
+  Box(920, 920),
+  Box(921, 921),
+  Box(922, 922),
+  Box(923, 923),
+  Box(924, 924),
+  Box(925, 925),
+  Box(926, 926),
+  Box(927, 927),
+  Box(928, 928),
+  Box(929, 929),
+  Box(930, 930),
+  Box(931, 931),
+  Box(932, 932),
+  Box(933, 933),
+  Box(934, 934),
+  Box(935, 935),
+  Box(936, 936),
+  Box(937, 937),
+  Box(938, 938),
+  Box(939, 939),
+  Box(940, 940),
+  Box(941, 941),
+  Box(942, 942),
+  Box(943, 943),
+  Box(944, 944),
+  Box(945, 945),
+  Box(946, 946),
+  Box(947, 947),
+  Box(948, 948),
+  Box(949, 949),
+  Box(950, 950),
+  Box(951, 951),
+  Box(952, 952),
+  Box(953, 953),
+  Box(954, 954),
+  Box(955, 955),
+  Box(956, 956),
+  Box(957, 957),
+  Box(958, 958),
+  Box(959, 959),
+  Box(960, 960),
+  Box(961, 961),
+  Box(962, 962),
+  Box(963, 963),
+  Box(964, 964),
+  Box(965, 965),
+  Box(966, 966),
+  Box(967, 967),
+  Box(968, 968),
+  Box(969, 969),
+  Box(970, 970),
+  Box(971, 971),
+  Box(972, 972),
+  Box(973, 973),
+  Box(974, 974),
+  Box(975, 975),
+  Box(976, 976),
+  Box(977, 977),
+  Box(978, 978),
+  Box(979, 979),
+  Box(980, 980),
+  Box(981, 981),
+  Box(982, 982),
+  Box(983, 983),
+  Box(984, 984),
+  Box(985, 985),
+  Box(986, 986),
+  Box(987, 987),
+  Box(988, 988),
+  Box(989, 989),
+  Box(990, 990),
+  Box(991, 991),
+  Box(992, 992),
+  Box(993, 993),
+  Box(994, 994),
+  Box(995, 995),
+  Box(996, 996),
+  Box(997, 997),
+  Box(998, 998),
+  Box(999, 999),
+  Box(1000, 1000),
+  Box(1001, 1001),
+  Box(1002, 1002),
+  Box(1003, 1003),
+  Box(1004, 1004),
+  Box(1005, 1005),
+  Box(1006, 1006),
+  Box(1007, 1007),
+  Box(1008, 1008),
+  Box(1009, 1009),
+  Box(1010, 1010),
+  Box(1011, 1011),
+  Box(1012, 1012),
+  Box(1013, 1013),
+  Box(1014, 1014),
+  Box(1015, 1015),
+  Box(1016, 1016),
+  Box(1017, 1017),
+  Box(1018, 1018),
+  Box(1019, 1019),
+  Box(1020, 1020),
+  Box(1021, 1021),
+  Box(1022, 1022),
+  Box(1023, 1023),
+  Box(1024, 1024),
+  Box(1025, 1025),
+  Box(1026, 1026),
+  Box(1027, 1027),
+  Box(1028, 1028),
+  Box(1029, 1029),
+  Box(1030, 1030),
+  Box(1031, 1031),
+  Box(1032, 1032),
+  Box(1033, 1033),
+  Box(1034, 1034),
+  Box(1035, 1035),
+  Box(1036, 1036),
+  Box(1037, 1037),
+  Box(1038, 1038),
+  Box(1039, 1039),
+  Box(1040, 1040),
+  Box(1041, 1041),
+  Box(1042, 1042),
+  Box(1043, 1043),
+  Box(1044, 1044),
+  Box(1045, 1045),
+  Box(1046, 1046),
+  Box(1047, 1047),
+  Box(1048, 1048),
+  Box(1049, 1049),
+  Box(1050, 1050),
+  Box(1051, 1051),
+  Box(1052, 1052),
+  Box(1053, 1053),
+  Box(1054, 1054),
+  Box(1055, 1055),
+  Box(1056, 1056),
+  Box(1057, 1057),
+  Box(1058, 1058),
+  Box(1059, 1059),
+  Box(1060, 1060),
+  Box(1061, 1061),
+  Box(1062, 1062),
+  Box(1063, 1063),
+  Box(1064, 1064),
+  Box(1065, 1065),
+  Box(1066, 1066),
+  Box(1067, 1067),
+  Box(1068, 1068),
+  Box(1069, 1069),
+  Box(1070, 1070),
+  Box(1071, 1071),
+  Box(1072, 1072),
+  Box(1073, 1073),
+  Box(1074, 1074),
+  Box(1075, 1075),
+  Box(1076, 1076),
+  Box(1077, 1077),
+  Box(1078, 1078),
+  Box(1079, 1079),
+  Box(1080, 1080),
+  Box(1081, 1081),
+  Box(1082, 1082),
+  Box(1083, 1083),
+  Box(1084, 1084),
+  Box(1085, 1085),
+  Box(1086, 1086),
+  Box(1087, 1087),
+  Box(1088, 1088),
+  Box(1089, 1089),
+  Box(1090, 1090),
+  Box(1091, 1091),
+  Box(1092, 1092),
+  Box(1093, 1093),
+  Box(1094, 1094),
+  Box(1095, 1095),
+  Box(1096, 1096),
+  Box(1097, 1097),
+  Box(1098, 1098),
+  Box(1099, 1099),
+  Box(1100, 1100),
+  Box(1101, 1101),
+  Box(1102, 1102),
+  Box(1103, 1103),
+  Box(1104, 1104),
+  Box(1105, 1105),
+  Box(1106, 1106),
+  Box(1107, 1107),
+  Box(1108, 1108),
+  Box(1109, 1109),
+  Box(1110, 1110),
+  Box(1111, 1111),
+  Box(1112, 1112),
+  Box(1113, 1113),
+  Box(1114, 1114),
+  Box(1115, 1115),
+  Box(1116, 1116),
+  Box(1117, 1117),
+  Box(1118, 1118),
+  Box(1119, 1119),
+  Box(1120, 1120),
+  Box(1121, 1121),
+  Box(1122, 1122),
+  Box(1123, 1123),
+  Box(1124, 1124),
+  Box(1125, 1125),
+  Box(1126, 1126),
+  Box(1127, 1127),
+  Box(1128, 1128),
+  Box(1129, 1129),
+  Box(1130, 1130),
+  Box(1131, 1131),
+  Box(1132, 1132),
+  Box(1133, 1133),
+  Box(1134, 1134),
+  Box(1135, 1135),
+  Box(1136, 1136),
+  Box(1137, 1137),
+  Box(1138, 1138),
+  Box(1139, 1139),
+  Box(1140, 1140),
+  Box(1141, 1141),
+  Box(1142, 1142),
+  Box(1143, 1143),
+  Box(1144, 1144),
+  Box(1145, 1145),
+  Box(1146, 1146),
+  Box(1147, 1147),
+  Box(1148, 1148),
+  Box(1149, 1149),
+  Box(1150, 1150),
+  Box(1151, 1151),
+  Box(1152, 1152),
+  Box(1153, 1153),
+  Box(1154, 1154),
+  Box(1155, 1155),
+  Box(1156, 1156),
+  Box(1157, 1157),
+  Box(1158, 1158),
+  Box(1159, 1159),
+  Box(1160, 1160),
+  Box(1161, 1161),
+  Box(1162, 1162),
+  Box(1163, 1163),
+  Box(1164, 1164),
+  Box(1165, 1165),
+  Box(1166, 1166),
+  Box(1167, 1167),
+  Box(1168, 1168),
+  Box(1169, 1169),
+  Box(1170, 1170),
+  Box(1171, 1171),
+  Box(1172, 1172),
+  Box(1173, 1173),
+  Box(1174, 1174),
+  Box(1175, 1175),
+  Box(1176, 1176),
+  Box(1177, 1177),
+  Box(1178, 1178),
+  Box(1179, 1179),
+  Box(1180, 1180),
+  Box(1181, 1181),
+  Box(1182, 1182),
+  Box(1183, 1183),
+  Box(1184, 1184),
+  Box(1185, 1185),
+  Box(1186, 1186),
+  Box(1187, 1187),
+  Box(1188, 1188),
+  Box(1189, 1189),
+  Box(1190, 1190),
+  Box(1191, 1191),
+  Box(1192, 1192),
+  Box(1193, 1193),
+  Box(1194, 1194),
+  Box(1195, 1195),
+  Box(1196, 1196),
+  Box(1197, 1197),
+  Box(1198, 1198),
+  Box(1199, 1199),
+  Box(1200, 1200),
+  Box(1201, 1201),
+  Box(1202, 1202),
+  Box(1203, 1203),
+  Box(1204, 1204),
+  Box(1205, 1205),
+  Box(1206, 1206),
+  Box(1207, 1207),
+  Box(1208, 1208),
+  Box(1209, 1209),
+  Box(1210, 1210),
+  Box(1211, 1211),
+  Box(1212, 1212),
+  Box(1213, 1213),
+  Box(1214, 1214),
+  Box(1215, 1215),
+  Box(1216, 1216),
+  Box(1217, 1217),
+  Box(1218, 1218),
+  Box(1219, 1219),
+  Box(1220, 1220),
+  Box(1221, 1221),
+  Box(1222, 1222),
+  Box(1223, 1223),
+  Box(1224, 1224),
+  Box(1225, 1225),
+  Box(1226, 1226),
+  Box(1227, 1227),
+  Box(1228, 1228),
+  Box(1229, 1229),
+  Box(1230, 1230),
+  Box(1231, 1231),
+  Box(1232, 1232),
+  Box(1233, 1233),
+  Box(1234, 1234),
+  Box(1235, 1235),
+  Box(1236, 1236),
+  Box(1237, 1237),
+  Box(1238, 1238),
+  Box(1239, 1239),
+  Box(1240, 1240),
+  Box(1241, 1241),
+  Box(1242, 1242),
+  Box(1243, 1243),
+  Box(1244, 1244),
+  Box(1245, 1245),
+  Box(1246, 1246),
+  Box(1247, 1247),
+  Box(1248, 1248),
+  Box(1249, 1249),
+  Box(1250, 1250),
+  Box(1251, 1251),
+  Box(1252, 1252),
+  Box(1253, 1253),
+  Box(1254, 1254),
+  Box(1255, 1255),
+  Box(1256, 1256),
+  Box(1257, 1257),
+  Box(1258, 1258),
+  Box(1259, 1259),
+  Box(1260, 1260),
+  Box(1261, 1261),
+  Box(1262, 1262),
+  Box(1263, 1263),
+  Box(1264, 1264),
+  Box(1265, 1265),
+  Box(1266, 1266),
+  Box(1267, 1267),
+  Box(1268, 1268),
+  Box(1269, 1269),
+  Box(1270, 1270),
+  Box(1271, 1271),
+  Box(1272, 1272),
+  Box(1273, 1273),
+  Box(1274, 1274),
+  Box(1275, 1275),
+  Box(1276, 1276),
+  Box(1277, 1277),
+  Box(1278, 1278),
+  Box(1279, 1279),
+  Box(1280, 1280),
+  Box(1281, 1281),
+  Box(1282, 1282),
+  Box(1283, 1283),
+  Box(1284, 1284),
+  Box(1285, 1285),
+  Box(1286, 1286),
+  Box(1287, 1287),
+  Box(1288, 1288),
+  Box(1289, 1289),
+  Box(1290, 1290),
+  Box(1291, 1291),
+  Box(1292, 1292),
+  Box(1293, 1293),
+  Box(1294, 1294),
+  Box(1295, 1295),
+  Box(1296, 1296),
+  Box(1297, 1297),
+  Box(1298, 1298),
+  Box(1299, 1299),
+  Box(1300, 1300),
+  Box(1301, 1301),
+  Box(1302, 1302),
+  Box(1303, 1303),
+  Box(1304, 1304),
+  Box(1305, 1305),
+  Box(1306, 1306),
+  Box(1307, 1307),
+  Box(1308, 1308),
+  Box(1309, 1309),
+  Box(1310, 1310),
+  Box(1311, 1311),
+  Box(1312, 1312),
+  Box(1313, 1313),
+  Box(1314, 1314),
+  Box(1315, 1315),
+  Box(1316, 1316),
+  Box(1317, 1317),
+  Box(1318, 1318),
+  Box(1319, 1319),
+  Box(1320, 1320),
+  Box(1321, 1321),
+  Box(1322, 1322),
+  Box(1323, 1323),
+  Box(1324, 1324),
+  Box(1325, 1325),
+  Box(1326, 1326),
+  Box(1327, 1327),
+  Box(1328, 1328),
+  Box(1329, 1329),
+  Box(1330, 1330),
+  Box(1331, 1331),
+  Box(1332, 1332),
+  Box(1333, 1333),
+  Box(1334, 1334),
+  Box(1335, 1335),
+  Box(1336, 1336),
+  Box(1337, 1337),
+  Box(1338, 1338),
+  Box(1339, 1339),
+  Box(1340, 1340),
+  Box(1341, 1341),
+  Box(1342, 1342),
+  Box(1343, 1343),
+  Box(1344, 1344),
+  Box(1345, 1345),
+  Box(1346, 1346),
+  Box(1347, 1347),
+  Box(1348, 1348),
+  Box(1349, 1349),
+  Box(1350, 1350),
+  Box(1351, 1351),
+  Box(1352, 1352),
+  Box(1353, 1353),
+  Box(1354, 1354),
+  Box(1355, 1355),
+  Box(1356, 1356),
+  Box(1357, 1357),
+  Box(1358, 1358),
+  Box(1359, 1359),
+  Box(1360, 1360),
+  Box(1361, 1361),
+  Box(1362, 1362),
+  Box(1363, 1363),
+  Box(1364, 1364),
+  Box(1365, 1365),
+  Box(1366, 1366),
+  Box(1367, 1367),
+  Box(1368, 1368),
+  Box(1369, 1369),
+  Box(1370, 1370),
+  Box(1371, 1371),
+  Box(1372, 1372),
+  Box(1373, 1373),
+  Box(1374, 1374),
+  Box(1375, 1375),
+  Box(1376, 1376),
+  Box(1377, 1377),
+  Box(1378, 1378),
+  Box(1379, 1379),
+  Box(1380, 1380),
+  Box(1381, 1381),
+  Box(1382, 1382),
+  Box(1383, 1383),
+  Box(1384, 1384),
+  Box(1385, 1385),
+  Box(1386, 1386),
+  Box(1387, 1387),
+  Box(1388, 1388),
+  Box(1389, 1389),
+  Box(1390, 1390),
+  Box(1391, 1391),
+  Box(1392, 1392),
+  Box(1393, 1393),
+  Box(1394, 1394),
+  Box(1395, 1395),
+  Box(1396, 1396),
+  Box(1397, 1397),
+  Box(1398, 1398),
+  Box(1399, 1399),
+  Box(1400, 1400),
+  Box(1401, 1401),
+  Box(1402, 1402),
+  Box(1403, 1403),
+  Box(1404, 1404),
+  Box(1405, 1405),
+  Box(1406, 1406),
+  Box(1407, 1407),
+  Box(1408, 1408),
+  Box(1409, 1409),
+  Box(1410, 1410),
+  Box(1411, 1411),
+  Box(1412, 1412),
+  Box(1413, 1413),
+  Box(1414, 1414),
+  Box(1415, 1415),
+  Box(1416, 1416),
+  Box(1417, 1417),
+  Box(1418, 1418),
+  Box(1419, 1419),
+  Box(1420, 1420),
+  Box(1421, 1421),
+  Box(1422, 1422),
+  Box(1423, 1423),
+  Box(1424, 1424),
+  Box(1425, 1425),
+  Box(1426, 1426),
+  Box(1427, 1427),
+  Box(1428, 1428),
+  Box(1429, 1429),
+  Box(1430, 1430),
+  Box(1431, 1431),
+  Box(1432, 1432),
+  Box(1433, 1433),
+  Box(1434, 1434),
+  Box(1435, 1435),
+  Box(1436, 1436),
+  Box(1437, 1437),
+  Box(1438, 1438),
+  Box(1439, 1439),
+  Box(1440, 1440),
+  Box(1441, 1441),
+  Box(1442, 1442),
+  Box(1443, 1443),
+  Box(1444, 1444),
+  Box(1445, 1445),
+  Box(1446, 1446),
+  Box(1447, 1447),
+  Box(1448, 1448),
+  Box(1449, 1449),
+  Box(1450, 1450),
+  Box(1451, 1451),
+  Box(1452, 1452),
+  Box(1453, 1453),
+  Box(1454, 1454),
+  Box(1455, 1455),
+  Box(1456, 1456),
+  Box(1457, 1457),
+  Box(1458, 1458),
+  Box(1459, 1459),
+  Box(1460, 1460),
+  Box(1461, 1461),
+  Box(1462, 1462),
+  Box(1463, 1463),
+  Box(1464, 1464),
+  Box(1465, 1465),
+  Box(1466, 1466),
+  Box(1467, 1467),
+  Box(1468, 1468),
+  Box(1469, 1469),
+  Box(1470, 1470),
+  Box(1471, 1471),
+  Box(1472, 1472),
+  Box(1473, 1473),
+  Box(1474, 1474),
+  Box(1475, 1475),
+  Box(1476, 1476),
+  Box(1477, 1477),
+  Box(1478, 1478),
+  Box(1479, 1479),
+  Box(1480, 1480),
+  Box(1481, 1481),
+  Box(1482, 1482),
+  Box(1483, 1483),
+  Box(1484, 1484),
+  Box(1485, 1485),
+  Box(1486, 1486),
+  Box(1487, 1487),
+  Box(1488, 1488),
+  Box(1489, 1489),
+  Box(1490, 1490),
+  Box(1491, 1491),
+  Box(1492, 1492),
+  Box(1493, 1493),
+  Box(1494, 1494),
+  Box(1495, 1495),
+  Box(1496, 1496),
+  Box(1497, 1497),
+  Box(1498, 1498),
+  Box(1499, 1499),
+  Box(1500, 1500),
+  Box(1501, 1501),
+  Box(1502, 1502),
+  Box(1503, 1503),
+  Box(1504, 1504),
+  Box(1505, 1505),
+  Box(1506, 1506),
+  Box(1507, 1507),
+  Box(1508, 1508),
+  Box(1509, 1509),
+  Box(1510, 1510),
+  Box(1511, 1511),
+  Box(1512, 1512),
+  Box(1513, 1513),
+  Box(1514, 1514),
+  Box(1515, 1515),
+  Box(1516, 1516),
+  Box(1517, 1517),
+  Box(1518, 1518),
+  Box(1519, 1519),
+  Box(1520, 1520),
+  Box(1521, 1521),
+  Box(1522, 1522),
+  Box(1523, 1523),
+  Box(1524, 1524),
+  Box(1525, 1525),
+  Box(1526, 1526),
+  Box(1527, 1527),
+  Box(1528, 1528),
+  Box(1529, 1529),
+  Box(1530, 1530),
+  Box(1531, 1531),
+  Box(1532, 1532),
+  Box(1533, 1533),
+  Box(1534, 1534),
+  Box(1535, 1535),
+  Box(1536, 1536),
+  Box(1537, 1537),
+  Box(1538, 1538),
+  Box(1539, 1539),
+  Box(1540, 1540),
+  Box(1541, 1541),
+  Box(1542, 1542),
+  Box(1543, 1543),
+  Box(1544, 1544),
+  Box(1545, 1545),
+  Box(1546, 1546),
+  Box(1547, 1547),
+  Box(1548, 1548),
+  Box(1549, 1549),
+  Box(1550, 1550),
+  Box(1551, 1551),
+  Box(1552, 1552),
+  Box(1553, 1553),
+  Box(1554, 1554),
+  Box(1555, 1555),
+  Box(1556, 1556),
+  Box(1557, 1557),
+  Box(1558, 1558),
+  Box(1559, 1559),
+  Box(1560, 1560),
+  Box(1561, 1561),
+  Box(1562, 1562),
+  Box(1563, 1563),
+  Box(1564, 1564),
+  Box(1565, 1565),
+  Box(1566, 1566),
+  Box(1567, 1567),
+  Box(1568, 1568),
+  Box(1569, 1569),
+  Box(1570, 1570),
+  Box(1571, 1571),
+  Box(1572, 1572),
+  Box(1573, 1573),
+  Box(1574, 1574),
+  Box(1575, 1575),
+  Box(1576, 1576),
+  Box(1577, 1577),
+  Box(1578, 1578),
+  Box(1579, 1579),
+  Box(1580, 1580),
+  Box(1581, 1581),
+  Box(1582, 1582),
+  Box(1583, 1583),
+  Box(1584, 1584),
+  Box(1585, 1585),
+  Box(1586, 1586),
+  Box(1587, 1587),
+  Box(1588, 1588),
+  Box(1589, 1589),
+  Box(1590, 1590),
+  Box(1591, 1591),
+  Box(1592, 1592),
+  Box(1593, 1593),
+  Box(1594, 1594),
+  Box(1595, 1595),
+  Box(1596, 1596),
+  Box(1597, 1597),
+  Box(1598, 1598),
+  Box(1599, 1599),
+  Box(1600, 1600),
+  Box(1601, 1601),
+  Box(1602, 1602),
+  Box(1603, 1603),
+  Box(1604, 1604),
+  Box(1605, 1605),
+  Box(1606, 1606),
+  Box(1607, 1607),
+  Box(1608, 1608),
+  Box(1609, 1609),
+  Box(1610, 1610),
+  Box(1611, 1611),
+  Box(1612, 1612),
+  Box(1613, 1613),
+  Box(1614, 1614),
+  Box(1615, 1615),
+  Box(1616, 1616),
+  Box(1617, 1617),
+  Box(1618, 1618),
+  Box(1619, 1619),
+  Box(1620, 1620),
+  Box(1621, 1621),
+  Box(1622, 1622),
+  Box(1623, 1623),
+  Box(1624, 1624),
+  Box(1625, 1625),
+  Box(1626, 1626),
+  Box(1627, 1627),
+  Box(1628, 1628),
+  Box(1629, 1629),
+  Box(1630, 1630),
+  Box(1631, 1631),
+  Box(1632, 1632),
+  Box(1633, 1633),
+  Box(1634, 1634),
+  Box(1635, 1635),
+  Box(1636, 1636),
+  Box(1637, 1637),
+  Box(1638, 1638),
+  Box(1639, 1639),
+  Box(1640, 1640),
+  Box(1641, 1641),
+  Box(1642, 1642),
+  Box(1643, 1643),
+  Box(1644, 1644),
+  Box(1645, 1645),
+  Box(1646, 1646),
+  Box(1647, 1647),
+  Box(1648, 1648),
+  Box(1649, 1649),
+  Box(1650, 1650),
+  Box(1651, 1651),
+  Box(1652, 1652),
+  Box(1653, 1653),
+  Box(1654, 1654),
+  Box(1655, 1655),
+  Box(1656, 1656),
+  Box(1657, 1657),
+  Box(1658, 1658),
+  Box(1659, 1659),
+  Box(1660, 1660),
+  Box(1661, 1661),
+  Box(1662, 1662),
+  Box(1663, 1663),
+  Box(1664, 1664),
+  Box(1665, 1665),
+  Box(1666, 1666),
+  Box(1667, 1667),
+  Box(1668, 1668),
+  Box(1669, 1669),
+  Box(1670, 1670),
+  Box(1671, 1671),
+  Box(1672, 1672),
+  Box(1673, 1673),
+  Box(1674, 1674),
+  Box(1675, 1675),
+  Box(1676, 1676),
+  Box(1677, 1677),
+  Box(1678, 1678),
+  Box(1679, 1679),
+  Box(1680, 1680),
+  Box(1681, 1681),
+  Box(1682, 1682),
+  Box(1683, 1683),
+  Box(1684, 1684),
+  Box(1685, 1685),
+  Box(1686, 1686),
+  Box(1687, 1687),
+  Box(1688, 1688),
+  Box(1689, 1689),
+  Box(1690, 1690),
+  Box(1691, 1691),
+  Box(1692, 1692),
+  Box(1693, 1693),
+  Box(1694, 1694),
+  Box(1695, 1695),
+  Box(1696, 1696),
+  Box(1697, 1697),
+  Box(1698, 1698),
+  Box(1699, 1699),
+  Box(1700, 1700),
+  Box(1701, 1701),
+  Box(1702, 1702),
+  Box(1703, 1703),
+  Box(1704, 1704),
+  Box(1705, 1705),
+  Box(1706, 1706),
+  Box(1707, 1707),
+  Box(1708, 1708),
+  Box(1709, 1709),
+  Box(1710, 1710),
+  Box(1711, 1711),
+  Box(1712, 1712),
+  Box(1713, 1713),
+  Box(1714, 1714),
+  Box(1715, 1715),
+  Box(1716, 1716),
+  Box(1717, 1717),
+  Box(1718, 1718),
+  Box(1719, 1719),
+  Box(1720, 1720),
+  Box(1721, 1721),
+  Box(1722, 1722),
+  Box(1723, 1723),
+  Box(1724, 1724),
+  Box(1725, 1725),
+  Box(1726, 1726),
+  Box(1727, 1727),
+  Box(1728, 1728),
+  Box(1729, 1729),
+  Box(1730, 1730),
+  Box(1731, 1731),
+  Box(1732, 1732),
+  Box(1733, 1733),
+  Box(1734, 1734),
+  Box(1735, 1735),
+  Box(1736, 1736),
+  Box(1737, 1737),
+  Box(1738, 1738),
+  Box(1739, 1739),
+  Box(1740, 1740),
+  Box(1741, 1741),
+  Box(1742, 1742),
+  Box(1743, 1743),
+  Box(1744, 1744),
+  Box(1745, 1745),
+  Box(1746, 1746),
+  Box(1747, 1747),
+  Box(1748, 1748),
+  Box(1749, 1749),
+  Box(1750, 1750),
+  Box(1751, 1751),
+  Box(1752, 1752),
+  Box(1753, 1753),
+  Box(1754, 1754),
+  Box(1755, 1755),
+  Box(1756, 1756),
+  Box(1757, 1757),
+  Box(1758, 1758),
+  Box(1759, 1759),
+  Box(1760, 1760),
+  Box(1761, 1761),
+  Box(1762, 1762),
+  Box(1763, 1763),
+  Box(1764, 1764),
+  Box(1765, 1765),
+  Box(1766, 1766),
+  Box(1767, 1767),
+  Box(1768, 1768),
+  Box(1769, 1769),
+  Box(1770, 1770),
+  Box(1771, 1771),
+  Box(1772, 1772),
+  Box(1773, 1773),
+  Box(1774, 1774),
+  Box(1775, 1775),
+  Box(1776, 1776),
+  Box(1777, 1777),
+  Box(1778, 1778),
+  Box(1779, 1779),
+  Box(1780, 1780),
+  Box(1781, 1781),
+  Box(1782, 1782),
+  Box(1783, 1783),
+  Box(1784, 1784),
+  Box(1785, 1785),
+  Box(1786, 1786),
+  Box(1787, 1787),
+  Box(1788, 1788),
+  Box(1789, 1789),
+  Box(1790, 1790),
+  Box(1791, 1791),
+  Box(1792, 1792),
+  Box(1793, 1793),
+  Box(1794, 1794),
+  Box(1795, 1795),
+  Box(1796, 1796),
+  Box(1797, 1797),
+  Box(1798, 1798),
+  Box(1799, 1799),
+  Box(1800, 1800),
+  Box(1801, 1801),
+  Box(1802, 1802),
+  Box(1803, 1803),
+  Box(1804, 1804),
+  Box(1805, 1805),
+  Box(1806, 1806),
+  Box(1807, 1807),
+  Box(1808, 1808),
+  Box(1809, 1809),
+  Box(1810, 1810),
+  Box(1811, 1811),
+  Box(1812, 1812),
+  Box(1813, 1813),
+  Box(1814, 1814),
+  Box(1815, 1815),
+  Box(1816, 1816),
+  Box(1817, 1817),
+  Box(1818, 1818),
+  Box(1819, 1819),
+  Box(1820, 1820),
+  Box(1821, 1821),
+  Box(1822, 1822),
+  Box(1823, 1823),
+  Box(1824, 1824),
+  Box(1825, 1825),
+  Box(1826, 1826),
+  Box(1827, 1827),
+  Box(1828, 1828),
+  Box(1829, 1829),
+  Box(1830, 1830),
+  Box(1831, 1831),
+  Box(1832, 1832),
+  Box(1833, 1833),
+  Box(1834, 1834),
+  Box(1835, 1835),
+  Box(1836, 1836),
+  Box(1837, 1837),
+  Box(1838, 1838),
+  Box(1839, 1839),
+  Box(1840, 1840),
+  Box(1841, 1841),
+  Box(1842, 1842),
+  Box(1843, 1843),
+  Box(1844, 1844),
+  Box(1845, 1845),
+  Box(1846, 1846),
+  Box(1847, 1847),
+  Box(1848, 1848),
+  Box(1849, 1849),
+  Box(1850, 1850),
+  Box(1851, 1851),
+  Box(1852, 1852),
+  Box(1853, 1853),
+  Box(1854, 1854),
+  Box(1855, 1855),
+  Box(1856, 1856),
+  Box(1857, 1857),
+  Box(1858, 1858),
+  Box(1859, 1859),
+  Box(1860, 1860),
+  Box(1861, 1861),
+  Box(1862, 1862),
+  Box(1863, 1863),
+  Box(1864, 1864),
+  Box(1865, 1865),
+  Box(1866, 1866),
+  Box(1867, 1867),
+  Box(1868, 1868),
+  Box(1869, 1869),
+  Box(1870, 1870),
+  Box(1871, 1871),
+  Box(1872, 1872),
+  Box(1873, 1873),
+  Box(1874, 1874),
+  Box(1875, 1875),
+  Box(1876, 1876),
+  Box(1877, 1877),
+  Box(1878, 1878),
+  Box(1879, 1879),
+  Box(1880, 1880),
+  Box(1881, 1881),
+  Box(1882, 1882),
+  Box(1883, 1883),
+  Box(1884, 1884),
+  Box(1885, 1885),
+  Box(1886, 1886),
+  Box(1887, 1887),
+  Box(1888, 1888),
+  Box(1889, 1889),
+  Box(1890, 1890),
+  Box(1891, 1891),
+  Box(1892, 1892),
+  Box(1893, 1893),
+  Box(1894, 1894),
+  Box(1895, 1895),
+  Box(1896, 1896),
+  Box(1897, 1897),
+  Box(1898, 1898),
+  Box(1899, 1899),
+  Box(1900, 1900),
+  Box(1901, 1901),
+  Box(1902, 1902),
+  Box(1903, 1903),
+  Box(1904, 1904),
+  Box(1905, 1905),
+  Box(1906, 1906),
+  Box(1907, 1907),
+  Box(1908, 1908),
+  Box(1909, 1909),
+  Box(1910, 1910),
+  Box(1911, 1911),
+  Box(1912, 1912),
+  Box(1913, 1913),
+  Box(1914, 1914),
+  Box(1915, 1915),
+  Box(1916, 1916),
+  Box(1917, 1917),
+  Box(1918, 1918),
+  Box(1919, 1919),
+  Box(1920, 1920),
+  Box(1921, 1921),
+  Box(1922, 1922),
+  Box(1923, 1923),
+  Box(1924, 1924),
+  Box(1925, 1925),
+  Box(1926, 1926),
+  Box(1927, 1927),
+  Box(1928, 1928),
+  Box(1929, 1929),
+  Box(1930, 1930),
+  Box(1931, 1931),
+  Box(1932, 1932),
+  Box(1933, 1933),
+  Box(1934, 1934),
+  Box(1935, 1935),
+  Box(1936, 1936),
+  Box(1937, 1937),
+  Box(1938, 1938),
+  Box(1939, 1939),
+  Box(1940, 1940),
+  Box(1941, 1941),
+  Box(1942, 1942),
+  Box(1943, 1943),
+  Box(1944, 1944),
+  Box(1945, 1945),
+  Box(1946, 1946),
+  Box(1947, 1947),
+  Box(1948, 1948),
+  Box(1949, 1949),
+  Box(1950, 1950),
+  Box(1951, 1951),
+  Box(1952, 1952),
+  Box(1953, 1953),
+  Box(1954, 1954),
+  Box(1955, 1955),
+  Box(1956, 1956),
+  Box(1957, 1957),
+  Box(1958, 1958),
+  Box(1959, 1959),
+  Box(1960, 1960),
+  Box(1961, 1961),
+  Box(1962, 1962),
+  Box(1963, 1963),
+  Box(1964, 1964),
+  Box(1965, 1965),
+  Box(1966, 1966),
+  Box(1967, 1967),
+  Box(1968, 1968),
+  Box(1969, 1969),
+  Box(1970, 1970),
+  Box(1971, 1971),
+  Box(1972, 1972),
+  Box(1973, 1973),
+  Box(1974, 1974),
+  Box(1975, 1975),
+  Box(1976, 1976),
+  Box(1977, 1977),
+  Box(1978, 1978),
+  Box(1979, 1979),
+  Box(1980, 1980),
+  Box(1981, 1981),
+  Box(1982, 1982),
+  Box(1983, 1983),
+  Box(1984, 1984),
+  Box(1985, 1985),
+  Box(1986, 1986),
+  Box(1987, 1987),
+  Box(1988, 1988),
+  Box(1989, 1989),
+  Box(1990, 1990),
+  Box(1991, 1991),
+  Box(1992, 1992),
+  Box(1993, 1993),
+  Box(1994, 1994),
+  Box(1995, 1995),
+  Box(1996, 1996),
+  Box(1997, 1997),
+  Box(1998, 1998),
+  Box(1999, 1999),
+  Box(2000, 2000),
+  Box(2001, 2001),
+  Box(2002, 2002),
+  Box(2003, 2003),
+  Box(2004, 2004),
+  Box(2005, 2005),
+  Box(2006, 2006),
+  Box(2007, 2007),
+  Box(2008, 2008),
+  Box(2009, 2009),
+  Box(2010, 2010),
+  Box(2011, 2011),
+  Box(2012, 2012),
+  Box(2013, 2013),
+  Box(2014, 2014),
+  Box(2015, 2015),
+  Box(2016, 2016),
+  Box(2017, 2017),
+  Box(2018, 2018),
+  Box(2019, 2019),
+  Box(2020, 2020),
+  Box(2021, 2021),
+  Box(2022, 2022),
+  Box(2023, 2023),
+  Box(2024, 2024),
+  Box(2025, 2025),
+  Box(2026, 2026),
+  Box(2027, 2027),
+  Box(2028, 2028),
+  Box(2029, 2029),
+  Box(2030, 2030),
+  Box(2031, 2031),
+  Box(2032, 2032),
+  Box(2033, 2033),
+  Box(2034, 2034),
+  Box(2035, 2035),
+  Box(2036, 2036),
+  Box(2037, 2037),
+  Box(2038, 2038),
+  Box(2039, 2039),
+  Box(2040, 2040),
+  Box(2041, 2041),
+  Box(2042, 2042),
+  Box(2043, 2043),
+  Box(2044, 2044),
+  Box(2045, 2045),
+  Box(2046, 2046),
+  Box(2047, 2047),
+  Box(2048, 2048),
+  Box(2049, 2049),
+  Box(2050, 2050),
+  Box(2051, 2051),
+  Box(2052, 2052),
+  Box(2053, 2053),
+  Box(2054, 2054),
+  Box(2055, 2055),
+  Box(2056, 2056),
+  Box(2057, 2057),
+  Box(2058, 2058),
+  Box(2059, 2059),
+  Box(2060, 2060),
+  Box(2061, 2061),
+  Box(2062, 2062),
+  Box(2063, 2063),
+  Box(2064, 2064),
+  Box(2065, 2065),
+  Box(2066, 2066),
+  Box(2067, 2067),
+  Box(2068, 2068),
+  Box(2069, 2069),
+  Box(2070, 2070),
+  Box(2071, 2071),
+  Box(2072, 2072),
+  Box(2073, 2073),
+  Box(2074, 2074),
+  Box(2075, 2075),
+  Box(2076, 2076),
+  Box(2077, 2077),
+  Box(2078, 2078),
+  Box(2079, 2079),
+  Box(2080, 2080),
+  Box(2081, 2081),
+  Box(2082, 2082),
+  Box(2083, 2083),
+  Box(2084, 2084),
+  Box(2085, 2085),
+  Box(2086, 2086),
+  Box(2087, 2087),
+  Box(2088, 2088),
+  Box(2089, 2089),
+  Box(2090, 2090),
+  Box(2091, 2091),
+  Box(2092, 2092),
+  Box(2093, 2093),
+  Box(2094, 2094),
+  Box(2095, 2095),
+  Box(2096, 2096),
+  Box(2097, 2097),
+  Box(2098, 2098),
+  Box(2099, 2099),
+  Box(2100, 2100),
+  Box(2101, 2101),
+  Box(2102, 2102),
+  Box(2103, 2103),
+  Box(2104, 2104),
+  Box(2105, 2105),
+  Box(2106, 2106),
+  Box(2107, 2107),
+  Box(2108, 2108),
+  Box(2109, 2109),
+  Box(2110, 2110),
+  Box(2111, 2111),
+  Box(2112, 2112),
+  Box(2113, 2113),
+  Box(2114, 2114),
+  Box(2115, 2115),
+  Box(2116, 2116),
+  Box(2117, 2117),
+  Box(2118, 2118),
+  Box(2119, 2119),
+  Box(2120, 2120),
+  Box(2121, 2121),
+  Box(2122, 2122),
+  Box(2123, 2123),
+  Box(2124, 2124),
+  Box(2125, 2125),
+  Box(2126, 2126),
+  Box(2127, 2127),
+  Box(2128, 2128),
+  Box(2129, 2129),
+  Box(2130, 2130),
+  Box(2131, 2131),
+  Box(2132, 2132),
+  Box(2133, 2133),
+  Box(2134, 2134),
+  Box(2135, 2135),
+  Box(2136, 2136),
+  Box(2137, 2137),
+  Box(2138, 2138),
+  Box(2139, 2139),
+  Box(2140, 2140),
+  Box(2141, 2141),
+  Box(2142, 2142),
+  Box(2143, 2143),
+  Box(2144, 2144),
+  Box(2145, 2145),
+  Box(2146, 2146),
+  Box(2147, 2147),
+  Box(2148, 2148),
+  Box(2149, 2149),
+  Box(2150, 2150),
+  Box(2151, 2151),
+  Box(2152, 2152),
+  Box(2153, 2153),
+  Box(2154, 2154),
+  Box(2155, 2155),
+  Box(2156, 2156),
+  Box(2157, 2157),
+  Box(2158, 2158),
+  Box(2159, 2159),
+  Box(2160, 2160),
+  Box(2161, 2161),
+  Box(2162, 2162),
+  Box(2163, 2163),
+  Box(2164, 2164),
+  Box(2165, 2165),
+  Box(2166, 2166),
+  Box(2167, 2167),
+  Box(2168, 2168),
+  Box(2169, 2169),
+  Box(2170, 2170),
+  Box(2171, 2171),
+  Box(2172, 2172),
+  Box(2173, 2173),
+  Box(2174, 2174),
+  Box(2175, 2175),
+  Box(2176, 2176),
+  Box(2177, 2177),
+  Box(2178, 2178),
+  Box(2179, 2179),
+  Box(2180, 2180),
+  Box(2181, 2181),
+  Box(2182, 2182),
+  Box(2183, 2183),
+  Box(2184, 2184),
+  Box(2185, 2185),
+  Box(2186, 2186),
+  Box(2187, 2187),
+  Box(2188, 2188),
+  Box(2189, 2189),
+  Box(2190, 2190),
+  Box(2191, 2191),
+  Box(2192, 2192),
+  Box(2193, 2193),
+  Box(2194, 2194),
+  Box(2195, 2195),
+  Box(2196, 2196),
+  Box(2197, 2197),
+  Box(2198, 2198),
+  Box(2199, 2199),
+  Box(2200, 2200),
+  Box(2201, 2201),
+  Box(2202, 2202),
+  Box(2203, 2203),
+  Box(2204, 2204),
+  Box(2205, 2205),
+  Box(2206, 2206),
+  Box(2207, 2207),
+  Box(2208, 2208),
+  Box(2209, 2209),
+  Box(2210, 2210),
+  Box(2211, 2211),
+  Box(2212, 2212),
+  Box(2213, 2213),
+  Box(2214, 2214),
+  Box(2215, 2215),
+  Box(2216, 2216),
+  Box(2217, 2217),
+  Box(2218, 2218),
+  Box(2219, 2219),
+  Box(2220, 2220),
+  Box(2221, 2221),
+  Box(2222, 2222),
+  Box(2223, 2223),
+  Box(2224, 2224),
+  Box(2225, 2225),
+  Box(2226, 2226),
+  Box(2227, 2227),
+  Box(2228, 2228),
+  Box(2229, 2229),
+  Box(2230, 2230),
+  Box(2231, 2231),
+  Box(2232, 2232),
+  Box(2233, 2233),
+  Box(2234, 2234),
+  Box(2235, 2235),
+  Box(2236, 2236),
+  Box(2237, 2237),
+  Box(2238, 2238),
+  Box(2239, 2239),
+  Box(2240, 2240),
+  Box(2241, 2241),
+  Box(2242, 2242),
+  Box(2243, 2243),
+  Box(2244, 2244),
+  Box(2245, 2245),
+  Box(2246, 2246),
+  Box(2247, 2247),
+  Box(2248, 2248),
+  Box(2249, 2249),
+  Box(2250, 2250),
+  Box(2251, 2251),
+  Box(2252, 2252),
+  Box(2253, 2253),
+  Box(2254, 2254),
+  Box(2255, 2255),
+  Box(2256, 2256),
+  Box(2257, 2257),
+  Box(2258, 2258),
+  Box(2259, 2259),
+  Box(2260, 2260),
+  Box(2261, 2261),
+  Box(2262, 2262),
+  Box(2263, 2263),
+  Box(2264, 2264),
+  Box(2265, 2265),
+  Box(2266, 2266),
+  Box(2267, 2267),
+  Box(2268, 2268),
+  Box(2269, 2269),
+  Box(2270, 2270),
+  Box(2271, 2271),
+  Box(2272, 2272),
+  Box(2273, 2273),
+  Box(2274, 2274),
+  Box(2275, 2275),
+  Box(2276, 2276),
+  Box(2277, 2277),
+  Box(2278, 2278),
+  Box(2279, 2279),
+  Box(2280, 2280),
+  Box(2281, 2281),
+  Box(2282, 2282),
+  Box(2283, 2283),
+  Box(2284, 2284),
+  Box(2285, 2285),
+  Box(2286, 2286),
+  Box(2287, 2287),
+  Box(2288, 2288),
+  Box(2289, 2289),
+  Box(2290, 2290),
+  Box(2291, 2291),
+  Box(2292, 2292),
+  Box(2293, 2293),
+  Box(2294, 2294),
+  Box(2295, 2295),
+  Box(2296, 2296),
+  Box(2297, 2297),
+  Box(2298, 2298),
+  Box(2299, 2299),
+  Box(2300, 2300),
+  Box(2301, 2301),
+  Box(2302, 2302),
+  Box(2303, 2303),
+  Box(2304, 2304),
+  Box(2305, 2305),
+  Box(2306, 2306),
+  Box(2307, 2307),
+  Box(2308, 2308),
+  Box(2309, 2309),
+  Box(2310, 2310),
+  Box(2311, 2311),
+  Box(2312, 2312),
+  Box(2313, 2313),
+  Box(2314, 2314),
+  Box(2315, 2315),
+  Box(2316, 2316),
+  Box(2317, 2317),
+  Box(2318, 2318),
+  Box(2319, 2319),
+  Box(2320, 2320),
+  Box(2321, 2321),
+  Box(2322, 2322),
+  Box(2323, 2323),
+  Box(2324, 2324),
+  Box(2325, 2325),
+  Box(2326, 2326),
+  Box(2327, 2327),
+  Box(2328, 2328),
+  Box(2329, 2329),
+  Box(2330, 2330),
+  Box(2331, 2331),
+  Box(2332, 2332),
+  Box(2333, 2333),
+  Box(2334, 2334),
+  Box(2335, 2335),
+  Box(2336, 2336),
+  Box(2337, 2337),
+  Box(2338, 2338),
+  Box(2339, 2339),
+  Box(2340, 2340),
+  Box(2341, 2341),
+  Box(2342, 2342),
+  Box(2343, 2343),
+  Box(2344, 2344),
+  Box(2345, 2345),
+  Box(2346, 2346),
+  Box(2347, 2347),
+  Box(2348, 2348),
+  Box(2349, 2349),
+  Box(2350, 2350),
+  Box(2351, 2351),
+  Box(2352, 2352),
+  Box(2353, 2353),
+  Box(2354, 2354),
+  Box(2355, 2355),
+  Box(2356, 2356),
+  Box(2357, 2357),
+  Box(2358, 2358),
+  Box(2359, 2359),
+  Box(2360, 2360),
+  Box(2361, 2361),
+  Box(2362, 2362),
+  Box(2363, 2363),
+  Box(2364, 2364),
+  Box(2365, 2365),
+  Box(2366, 2366),
+  Box(2367, 2367),
+  Box(2368, 2368),
+  Box(2369, 2369),
+  Box(2370, 2370),
+  Box(2371, 2371),
+  Box(2372, 2372),
+  Box(2373, 2373),
+  Box(2374, 2374),
+  Box(2375, 2375),
+  Box(2376, 2376),
+  Box(2377, 2377),
+  Box(2378, 2378),
+  Box(2379, 2379),
+  Box(2380, 2380),
+  Box(2381, 2381),
+  Box(2382, 2382),
+  Box(2383, 2383),
+  Box(2384, 2384),
+  Box(2385, 2385),
+  Box(2386, 2386),
+  Box(2387, 2387),
+  Box(2388, 2388),
+  Box(2389, 2389),
+  Box(2390, 2390),
+  Box(2391, 2391),
+  Box(2392, 2392),
+  Box(2393, 2393),
+  Box(2394, 2394),
+  Box(2395, 2395),
+  Box(2396, 2396),
+  Box(2397, 2397),
+  Box(2398, 2398),
+  Box(2399, 2399),
+  Box(2400, 2400),
+  Box(2401, 2401),
+  Box(2402, 2402),
+  Box(2403, 2403),
+  Box(2404, 2404),
+  Box(2405, 2405),
+  Box(2406, 2406),
+  Box(2407, 2407),
+  Box(2408, 2408),
+  Box(2409, 2409),
+  Box(2410, 2410),
+  Box(2411, 2411),
+  Box(2412, 2412),
+  Box(2413, 2413),
+  Box(2414, 2414),
+  Box(2415, 2415),
+  Box(2416, 2416),
+  Box(2417, 2417),
+  Box(2418, 2418),
+  Box(2419, 2419),
+  Box(2420, 2420),
+  Box(2421, 2421),
+  Box(2422, 2422),
+  Box(2423, 2423),
+  Box(2424, 2424),
+  Box(2425, 2425),
+  Box(2426, 2426),
+  Box(2427, 2427),
+  Box(2428, 2428),
+  Box(2429, 2429),
+  Box(2430, 2430),
+  Box(2431, 2431),
+  Box(2432, 2432),
+  Box(2433, 2433),
+  Box(2434, 2434),
+  Box(2435, 2435),
+  Box(2436, 2436),
+  Box(2437, 2437),
+  Box(2438, 2438),
+  Box(2439, 2439),
+  Box(2440, 2440),
+  Box(2441, 2441),
+  Box(2442, 2442),
+  Box(2443, 2443),
+  Box(2444, 2444),
+  Box(2445, 2445),
+  Box(2446, 2446),
+  Box(2447, 2447),
+  Box(2448, 2448),
+  Box(2449, 2449),
+  Box(2450, 2450),
+  Box(2451, 2451),
+  Box(2452, 2452),
+  Box(2453, 2453),
+  Box(2454, 2454),
+  Box(2455, 2455),
+  Box(2456, 2456),
+  Box(2457, 2457),
+  Box(2458, 2458),
+  Box(2459, 2459),
+  Box(2460, 2460),
+  Box(2461, 2461),
+  Box(2462, 2462),
+  Box(2463, 2463),
+  Box(2464, 2464),
+  Box(2465, 2465),
+  Box(2466, 2466),
+  Box(2467, 2467),
+  Box(2468, 2468),
+  Box(2469, 2469),
+  Box(2470, 2470),
+  Box(2471, 2471),
+  Box(2472, 2472),
+  Box(2473, 2473),
+  Box(2474, 2474),
+  Box(2475, 2475),
+  Box(2476, 2476),
+  Box(2477, 2477),
+  Box(2478, 2478),
+  Box(2479, 2479),
+  Box(2480, 2480),
+  Box(2481, 2481),
+  Box(2482, 2482),
+  Box(2483, 2483),
+  Box(2484, 2484),
+  Box(2485, 2485),
+  Box(2486, 2486),
+  Box(2487, 2487),
+  Box(2488, 2488),
+  Box(2489, 2489),
+  Box(2490, 2490),
+  Box(2491, 2491),
+  Box(2492, 2492),
+  Box(2493, 2493),
+  Box(2494, 2494),
+  Box(2495, 2495),
+  Box(2496, 2496),
+  Box(2497, 2497),
+  Box(2498, 2498),
+  Box(2499, 2499),
+  Box(2500, 2500),
+  Box(2501, 2501),
+  Box(2502, 2502),
+  Box(2503, 2503),
+  Box(2504, 2504),
+  Box(2505, 2505),
+  Box(2506, 2506),
+  Box(2507, 2507),
+  Box(2508, 2508),
+  Box(2509, 2509),
+  Box(2510, 2510),
+  Box(2511, 2511),
+  Box(2512, 2512),
+  Box(2513, 2513),
+  Box(2514, 2514),
+  Box(2515, 2515),
+  Box(2516, 2516),
+  Box(2517, 2517),
+  Box(2518, 2518),
+  Box(2519, 2519),
+  Box(2520, 2520),
+  Box(2521, 2521),
+  Box(2522, 2522),
+  Box(2523, 2523),
+  Box(2524, 2524),
+  Box(2525, 2525),
+  Box(2526, 2526),
+  Box(2527, 2527),
+  Box(2528, 2528),
+  Box(2529, 2529),
+  Box(2530, 2530),
+  Box(2531, 2531),
+  Box(2532, 2532),
+  Box(2533, 2533),
+  Box(2534, 2534),
+  Box(2535, 2535),
+  Box(2536, 2536),
+  Box(2537, 2537),
+  Box(2538, 2538),
+  Box(2539, 2539),
+  Box(2540, 2540),
+  Box(2541, 2541),
+  Box(2542, 2542),
+  Box(2543, 2543),
+  Box(2544, 2544),
+  Box(2545, 2545),
+  Box(2546, 2546),
+  Box(2547, 2547),
+  Box(2548, 2548),
+  Box(2549, 2549),
+  Box(2550, 2550),
+  Box(2551, 2551),
+  Box(2552, 2552),
+  Box(2553, 2553),
+  Box(2554, 2554),
+  Box(2555, 2555),
+  Box(2556, 2556),
+  Box(2557, 2557),
+  Box(2558, 2558),
+  Box(2559, 2559),
+  Box(2560, 2560),
+  Box(2561, 2561),
+  Box(2562, 2562),
+  Box(2563, 2563),
+  Box(2564, 2564),
+  Box(2565, 2565),
+  Box(2566, 2566),
+  Box(2567, 2567),
+  Box(2568, 2568),
+  Box(2569, 2569),
+  Box(2570, 2570),
+  Box(2571, 2571),
+  Box(2572, 2572),
+  Box(2573, 2573),
+  Box(2574, 2574),
+  Box(2575, 2575),
+  Box(2576, 2576),
+  Box(2577, 2577),
+  Box(2578, 2578),
+  Box(2579, 2579),
+  Box(2580, 2580),
+  Box(2581, 2581),
+  Box(2582, 2582),
+  Box(2583, 2583),
+  Box(2584, 2584),
+  Box(2585, 2585),
+  Box(2586, 2586),
+  Box(2587, 2587),
+  Box(2588, 2588),
+  Box(2589, 2589),
+  Box(2590, 2590),
+  Box(2591, 2591),
+  Box(2592, 2592),
+  Box(2593, 2593),
+  Box(2594, 2594),
+  Box(2595, 2595),
+  Box(2596, 2596),
+  Box(2597, 2597),
+  Box(2598, 2598),
+  Box(2599, 2599),
+  Box(2600, 2600),
+  Box(2601, 2601),
+  Box(2602, 2602),
+  Box(2603, 2603),
+  Box(2604, 2604),
+  Box(2605, 2605),
+  Box(2606, 2606),
+  Box(2607, 2607),
+  Box(2608, 2608),
+  Box(2609, 2609),
+  Box(2610, 2610),
+  Box(2611, 2611),
+  Box(2612, 2612),
+  Box(2613, 2613),
+  Box(2614, 2614),
+  Box(2615, 2615),
+  Box(2616, 2616),
+  Box(2617, 2617),
+  Box(2618, 2618),
+  Box(2619, 2619),
+  Box(2620, 2620),
+  Box(2621, 2621),
+  Box(2622, 2622),
+  Box(2623, 2623),
+  Box(2624, 2624),
+  Box(2625, 2625),
+  Box(2626, 2626),
+  Box(2627, 2627),
+  Box(2628, 2628),
+  Box(2629, 2629),
+  Box(2630, 2630),
+  Box(2631, 2631),
+  Box(2632, 2632),
+  Box(2633, 2633),
+  Box(2634, 2634),
+  Box(2635, 2635),
+  Box(2636, 2636),
+  Box(2637, 2637),
+  Box(2638, 2638),
+  Box(2639, 2639),
+  Box(2640, 2640),
+  Box(2641, 2641),
+  Box(2642, 2642),
+  Box(2643, 2643),
+  Box(2644, 2644),
+  Box(2645, 2645),
+  Box(2646, 2646),
+  Box(2647, 2647),
+  Box(2648, 2648),
+  Box(2649, 2649),
+  Box(2650, 2650),
+  Box(2651, 2651),
+  Box(2652, 2652),
+  Box(2653, 2653),
+  Box(2654, 2654),
+  Box(2655, 2655),
+  Box(2656, 2656),
+  Box(2657, 2657),
+  Box(2658, 2658),
+  Box(2659, 2659),
+  Box(2660, 2660),
+  Box(2661, 2661),
+  Box(2662, 2662),
+  Box(2663, 2663),
+  Box(2664, 2664),
+  Box(2665, 2665),
+  Box(2666, 2666),
+  Box(2667, 2667),
+  Box(2668, 2668),
+  Box(2669, 2669),
+  Box(2670, 2670),
+  Box(2671, 2671),
+  Box(2672, 2672),
+  Box(2673, 2673),
+  Box(2674, 2674),
+  Box(2675, 2675),
+  Box(2676, 2676),
+  Box(2677, 2677),
+  Box(2678, 2678),
+  Box(2679, 2679),
+  Box(2680, 2680),
+  Box(2681, 2681),
+  Box(2682, 2682),
+  Box(2683, 2683),
+  Box(2684, 2684),
+  Box(2685, 2685),
+  Box(2686, 2686),
+  Box(2687, 2687),
+  Box(2688, 2688),
+  Box(2689, 2689),
+  Box(2690, 2690),
+  Box(2691, 2691),
+  Box(2692, 2692),
+  Box(2693, 2693),
+  Box(2694, 2694),
+  Box(2695, 2695),
+  Box(2696, 2696),
+  Box(2697, 2697),
+  Box(2698, 2698),
+  Box(2699, 2699),
+  Box(2700, 2700),
+  Box(2701, 2701),
+  Box(2702, 2702),
+  Box(2703, 2703),
+  Box(2704, 2704),
+  Box(2705, 2705),
+  Box(2706, 2706),
+  Box(2707, 2707),
+  Box(2708, 2708),
+  Box(2709, 2709),
+  Box(2710, 2710),
+  Box(2711, 2711),
+  Box(2712, 2712),
+  Box(2713, 2713),
+  Box(2714, 2714),
+  Box(2715, 2715),
+  Box(2716, 2716),
+  Box(2717, 2717),
+  Box(2718, 2718),
+  Box(2719, 2719),
+  Box(2720, 2720),
+  Box(2721, 2721),
+  Box(2722, 2722),
+  Box(2723, 2723),
+  Box(2724, 2724),
+  Box(2725, 2725),
+  Box(2726, 2726),
+  Box(2727, 2727),
+  Box(2728, 2728),
+  Box(2729, 2729),
+  Box(2730, 2730),
+  Box(2731, 2731),
+  Box(2732, 2732),
+  Box(2733, 2733),
+  Box(2734, 2734),
+  Box(2735, 2735),
+  Box(2736, 2736),
+  Box(2737, 2737),
+  Box(2738, 2738),
+  Box(2739, 2739),
+  Box(2740, 2740),
+  Box(2741, 2741),
+  Box(2742, 2742),
+  Box(2743, 2743),
+  Box(2744, 2744),
+  Box(2745, 2745),
+  Box(2746, 2746),
+  Box(2747, 2747),
+  Box(2748, 2748),
+  Box(2749, 2749),
+  Box(2750, 2750),
+  Box(2751, 2751),
+  Box(2752, 2752),
+  Box(2753, 2753),
+  Box(2754, 2754),
+  Box(2755, 2755),
+  Box(2756, 2756),
+  Box(2757, 2757),
+  Box(2758, 2758),
+  Box(2759, 2759),
+  Box(2760, 2760),
+  Box(2761, 2761),
+  Box(2762, 2762),
+  Box(2763, 2763),
+  Box(2764, 2764),
+  Box(2765, 2765),
+  Box(2766, 2766),
+  Box(2767, 2767),
+  Box(2768, 2768),
+  Box(2769, 2769),
+  Box(2770, 2770),
+  Box(2771, 2771),
+  Box(2772, 2772),
+  Box(2773, 2773),
+  Box(2774, 2774),
+  Box(2775, 2775),
+  Box(2776, 2776),
+  Box(2777, 2777),
+  Box(2778, 2778),
+  Box(2779, 2779),
+  Box(2780, 2780),
+  Box(2781, 2781),
+  Box(2782, 2782),
+  Box(2783, 2783),
+  Box(2784, 2784),
+  Box(2785, 2785),
+  Box(2786, 2786),
+  Box(2787, 2787),
+  Box(2788, 2788),
+  Box(2789, 2789),
+  Box(2790, 2790),
+  Box(2791, 2791),
+  Box(2792, 2792),
+  Box(2793, 2793),
+  Box(2794, 2794),
+  Box(2795, 2795),
+  Box(2796, 2796),
+  Box(2797, 2797),
+  Box(2798, 2798),
+  Box(2799, 2799),
+  Box(2800, 2800),
+  Box(2801, 2801),
+  Box(2802, 2802),
+  Box(2803, 2803),
+  Box(2804, 2804),
+  Box(2805, 2805),
+  Box(2806, 2806),
+  Box(2807, 2807),
+  Box(2808, 2808),
+  Box(2809, 2809),
+  Box(2810, 2810),
+  Box(2811, 2811),
+  Box(2812, 2812),
+  Box(2813, 2813),
+  Box(2814, 2814),
+  Box(2815, 2815),
+  Box(2816, 2816),
+  Box(2817, 2817),
+  Box(2818, 2818),
+  Box(2819, 2819),
+  Box(2820, 2820),
+  Box(2821, 2821),
+  Box(2822, 2822),
+  Box(2823, 2823),
+  Box(2824, 2824),
+  Box(2825, 2825),
+  Box(2826, 2826),
+  Box(2827, 2827),
+  Box(2828, 2828),
+  Box(2829, 2829),
+  Box(2830, 2830),
+  Box(2831, 2831),
+  Box(2832, 2832),
+  Box(2833, 2833),
+  Box(2834, 2834),
+  Box(2835, 2835),
+  Box(2836, 2836),
+  Box(2837, 2837),
+  Box(2838, 2838),
+  Box(2839, 2839),
+  Box(2840, 2840),
+  Box(2841, 2841),
+  Box(2842, 2842),
+  Box(2843, 2843),
+  Box(2844, 2844),
+  Box(2845, 2845),
+  Box(2846, 2846),
+  Box(2847, 2847),
+  Box(2848, 2848),
+  Box(2849, 2849),
+  Box(2850, 2850),
+  Box(2851, 2851),
+  Box(2852, 2852),
+  Box(2853, 2853),
+  Box(2854, 2854),
+  Box(2855, 2855),
+  Box(2856, 2856),
+  Box(2857, 2857),
+  Box(2858, 2858),
+  Box(2859, 2859),
+  Box(2860, 2860),
+  Box(2861, 2861),
+  Box(2862, 2862),
+  Box(2863, 2863),
+  Box(2864, 2864),
+  Box(2865, 2865),
+  Box(2866, 2866),
+  Box(2867, 2867),
+  Box(2868, 2868),
+  Box(2869, 2869),
+  Box(2870, 2870),
+  Box(2871, 2871),
+  Box(2872, 2872),
+  Box(2873, 2873),
+  Box(2874, 2874),
+  Box(2875, 2875),
+  Box(2876, 2876),
+  Box(2877, 2877),
+  Box(2878, 2878),
+  Box(2879, 2879),
+  Box(2880, 2880),
+  Box(2881, 2881),
+  Box(2882, 2882),
+  Box(2883, 2883),
+  Box(2884, 2884),
+  Box(2885, 2885),
+  Box(2886, 2886),
+  Box(2887, 2887),
+  Box(2888, 2888),
+  Box(2889, 2889),
+  Box(2890, 2890),
+  Box(2891, 2891),
+  Box(2892, 2892),
+  Box(2893, 2893),
+  Box(2894, 2894),
+  Box(2895, 2895),
+  Box(2896, 2896),
+  Box(2897, 2897),
+  Box(2898, 2898),
+  Box(2899, 2899),
+  Box(2900, 2900),
+  Box(2901, 2901),
+  Box(2902, 2902),
+  Box(2903, 2903),
+  Box(2904, 2904),
+  Box(2905, 2905),
+  Box(2906, 2906),
+  Box(2907, 2907),
+  Box(2908, 2908),
+  Box(2909, 2909),
+  Box(2910, 2910),
+  Box(2911, 2911),
+  Box(2912, 2912),
+  Box(2913, 2913),
+  Box(2914, 2914),
+  Box(2915, 2915),
+  Box(2916, 2916),
+  Box(2917, 2917),
+  Box(2918, 2918),
+  Box(2919, 2919),
+  Box(2920, 2920),
+  Box(2921, 2921),
+  Box(2922, 2922),
+  Box(2923, 2923),
+  Box(2924, 2924),
+  Box(2925, 2925),
+  Box(2926, 2926),
+  Box(2927, 2927),
+  Box(2928, 2928),
+  Box(2929, 2929),
+  Box(2930, 2930),
+  Box(2931, 2931),
+  Box(2932, 2932),
+  Box(2933, 2933),
+  Box(2934, 2934),
+  Box(2935, 2935),
+  Box(2936, 2936),
+  Box(2937, 2937),
+  Box(2938, 2938),
+  Box(2939, 2939),
+  Box(2940, 2940),
+  Box(2941, 2941),
+  Box(2942, 2942),
+  Box(2943, 2943),
+  Box(2944, 2944),
+  Box(2945, 2945),
+  Box(2946, 2946),
+  Box(2947, 2947),
+  Box(2948, 2948),
+  Box(2949, 2949),
+  Box(2950, 2950),
+  Box(2951, 2951),
+  Box(2952, 2952),
+  Box(2953, 2953),
+  Box(2954, 2954),
+  Box(2955, 2955),
+  Box(2956, 2956),
+  Box(2957, 2957),
+  Box(2958, 2958),
+  Box(2959, 2959),
+  Box(2960, 2960),
+  Box(2961, 2961),
+  Box(2962, 2962),
+  Box(2963, 2963),
+  Box(2964, 2964),
+  Box(2965, 2965),
+  Box(2966, 2966),
+  Box(2967, 2967),
+  Box(2968, 2968),
+  Box(2969, 2969),
+  Box(2970, 2970),
+  Box(2971, 2971),
+  Box(2972, 2972),
+  Box(2973, 2973),
+  Box(2974, 2974),
+  Box(2975, 2975),
+  Box(2976, 2976),
+  Box(2977, 2977),
+  Box(2978, 2978),
+  Box(2979, 2979),
+  Box(2980, 2980),
+  Box(2981, 2981),
+  Box(2982, 2982),
+  Box(2983, 2983),
+  Box(2984, 2984),
+  Box(2985, 2985),
+  Box(2986, 2986),
+  Box(2987, 2987),
+  Box(2988, 2988),
+  Box(2989, 2989),
+  Box(2990, 2990),
+  Box(2991, 2991),
+  Box(2992, 2992),
+  Box(2993, 2993),
+  Box(2994, 2994),
+  Box(2995, 2995),
+  Box(2996, 2996),
+  Box(2997, 2997),
+  Box(2998, 2998),
+  Box(2999, 2999),
+  Box(3000, 3000),
+  Box(3001, 3001),
+  Box(3002, 3002),
+  Box(3003, 3003),
+  Box(3004, 3004),
+  Box(3005, 3005),
+  Box(3006, 3006),
+  Box(3007, 3007),
+  Box(3008, 3008),
+  Box(3009, 3009),
+  Box(3010, 3010),
+  Box(3011, 3011),
+  Box(3012, 3012),
+  Box(3013, 3013),
+  Box(3014, 3014),
+  Box(3015, 3015),
+  Box(3016, 3016),
+  Box(3017, 3017),
+  Box(3018, 3018),
+  Box(3019, 3019),
+  Box(3020, 3020),
+  Box(3021, 3021),
+  Box(3022, 3022),
+  Box(3023, 3023),
+  Box(3024, 3024),
+  Box(3025, 3025),
+  Box(3026, 3026),
+  Box(3027, 3027),
+  Box(3028, 3028),
+  Box(3029, 3029),
+  Box(3030, 3030),
+  Box(3031, 3031),
+  Box(3032, 3032),
+  Box(3033, 3033),
+  Box(3034, 3034),
+  Box(3035, 3035),
+  Box(3036, 3036),
+  Box(3037, 3037),
+  Box(3038, 3038),
+  Box(3039, 3039),
+  Box(3040, 3040),
+  Box(3041, 3041),
+  Box(3042, 3042),
+  Box(3043, 3043),
+  Box(3044, 3044),
+  Box(3045, 3045),
+  Box(3046, 3046),
+  Box(3047, 3047),
+  Box(3048, 3048),
+  Box(3049, 3049),
+  Box(3050, 3050),
+  Box(3051, 3051),
+  Box(3052, 3052),
+  Box(3053, 3053),
+  Box(3054, 3054),
+  Box(3055, 3055),
+  Box(3056, 3056),
+  Box(3057, 3057),
+  Box(3058, 3058),
+  Box(3059, 3059),
+  Box(3060, 3060),
+  Box(3061, 3061),
+  Box(3062, 3062),
+  Box(3063, 3063),
+  Box(3064, 3064),
+  Box(3065, 3065),
+  Box(3066, 3066),
+  Box(3067, 3067),
+  Box(3068, 3068),
+  Box(3069, 3069),
+  Box(3070, 3070),
+  Box(3071, 3071),
+  Box(3072, 3072),
+  Box(3073, 3073),
+  Box(3074, 3074),
+  Box(3075, 3075),
+  Box(3076, 3076),
+  Box(3077, 3077),
+  Box(3078, 3078),
+  Box(3079, 3079),
+  Box(3080, 3080),
+  Box(3081, 3081),
+  Box(3082, 3082),
+  Box(3083, 3083),
+  Box(3084, 3084),
+  Box(3085, 3085),
+  Box(3086, 3086),
+  Box(3087, 3087),
+  Box(3088, 3088),
+  Box(3089, 3089),
+  Box(3090, 3090),
+  Box(3091, 3091),
+  Box(3092, 3092),
+  Box(3093, 3093),
+  Box(3094, 3094),
+  Box(3095, 3095),
+  Box(3096, 3096),
+  Box(3097, 3097),
+  Box(3098, 3098),
+  Box(3099, 3099),
+  Box(3100, 3100),
+  Box(3101, 3101),
+  Box(3102, 3102),
+  Box(3103, 3103),
+  Box(3104, 3104),
+  Box(3105, 3105),
+  Box(3106, 3106),
+  Box(3107, 3107),
+  Box(3108, 3108),
+  Box(3109, 3109),
+  Box(3110, 3110),
+  Box(3111, 3111),
+  Box(3112, 3112),
+  Box(3113, 3113),
+  Box(3114, 3114),
+  Box(3115, 3115),
+  Box(3116, 3116),
+  Box(3117, 3117),
+  Box(3118, 3118),
+  Box(3119, 3119),
+  Box(3120, 3120),
+  Box(3121, 3121),
+  Box(3122, 3122),
+  Box(3123, 3123),
+  Box(3124, 3124),
+  Box(3125, 3125),
+  Box(3126, 3126),
+  Box(3127, 3127),
+  Box(3128, 3128),
+  Box(3129, 3129),
+  Box(3130, 3130),
+  Box(3131, 3131),
+  Box(3132, 3132),
+  Box(3133, 3133),
+  Box(3134, 3134),
+  Box(3135, 3135),
+  Box(3136, 3136),
+  Box(3137, 3137),
+  Box(3138, 3138),
+  Box(3139, 3139),
+  Box(3140, 3140),
+  Box(3141, 3141),
+  Box(3142, 3142),
+  Box(3143, 3143),
+  Box(3144, 3144),
+  Box(3145, 3145),
+  Box(3146, 3146),
+  Box(3147, 3147),
+  Box(3148, 3148),
+  Box(3149, 3149),
+  Box(3150, 3150),
+  Box(3151, 3151),
+  Box(3152, 3152),
+  Box(3153, 3153),
+  Box(3154, 3154),
+  Box(3155, 3155),
+  Box(3156, 3156),
+  Box(3157, 3157),
+  Box(3158, 3158),
+  Box(3159, 3159),
+  Box(3160, 3160),
+  Box(3161, 3161),
+  Box(3162, 3162),
+  Box(3163, 3163),
+  Box(3164, 3164),
+  Box(3165, 3165),
+  Box(3166, 3166),
+  Box(3167, 3167),
+  Box(3168, 3168),
+  Box(3169, 3169),
+  Box(3170, 3170),
+  Box(3171, 3171),
+  Box(3172, 3172),
+  Box(3173, 3173),
+  Box(3174, 3174),
+  Box(3175, 3175),
+  Box(3176, 3176),
+  Box(3177, 3177),
+  Box(3178, 3178),
+  Box(3179, 3179),
+  Box(3180, 3180),
+  Box(3181, 3181),
+  Box(3182, 3182),
+  Box(3183, 3183),
+  Box(3184, 3184),
+  Box(3185, 3185),
+  Box(3186, 3186),
+  Box(3187, 3187),
+  Box(3188, 3188),
+  Box(3189, 3189),
+  Box(3190, 3190),
+  Box(3191, 3191),
+  Box(3192, 3192),
+  Box(3193, 3193),
+  Box(3194, 3194),
+  Box(3195, 3195),
+  Box(3196, 3196),
+  Box(3197, 3197),
+  Box(3198, 3198),
+  Box(3199, 3199),
+  Box(3200, 3200),
+  Box(3201, 3201),
+  Box(3202, 3202),
+  Box(3203, 3203),
+  Box(3204, 3204),
+  Box(3205, 3205),
+  Box(3206, 3206),
+  Box(3207, 3207),
+  Box(3208, 3208),
+  Box(3209, 3209),
+  Box(3210, 3210),
+  Box(3211, 3211),
+  Box(3212, 3212),
+  Box(3213, 3213),
+  Box(3214, 3214),
+  Box(3215, 3215),
+  Box(3216, 3216),
+  Box(3217, 3217),
+  Box(3218, 3218),
+  Box(3219, 3219),
+  Box(3220, 3220),
+  Box(3221, 3221),
+  Box(3222, 3222),
+  Box(3223, 3223),
+  Box(3224, 3224),
+  Box(3225, 3225),
+  Box(3226, 3226),
+  Box(3227, 3227),
+  Box(3228, 3228),
+  Box(3229, 3229),
+  Box(3230, 3230),
+  Box(3231, 3231),
+  Box(3232, 3232),
+  Box(3233, 3233),
+  Box(3234, 3234),
+  Box(3235, 3235),
+  Box(3236, 3236),
+  Box(3237, 3237),
+  Box(3238, 3238),
+  Box(3239, 3239),
+  Box(3240, 3240),
+  Box(3241, 3241),
+  Box(3242, 3242),
+  Box(3243, 3243),
+  Box(3244, 3244),
+  Box(3245, 3245),
+  Box(3246, 3246),
+  Box(3247, 3247),
+  Box(3248, 3248),
+  Box(3249, 3249),
+  Box(3250, 3250),
+  Box(3251, 3251),
+  Box(3252, 3252),
+  Box(3253, 3253),
+  Box(3254, 3254),
+  Box(3255, 3255),
+  Box(3256, 3256),
+  Box(3257, 3257),
+  Box(3258, 3258),
+  Box(3259, 3259),
+  Box(3260, 3260),
+  Box(3261, 3261),
+  Box(3262, 3262),
+  Box(3263, 3263),
+  Box(3264, 3264),
+  Box(3265, 3265),
+  Box(3266, 3266),
+  Box(3267, 3267),
+  Box(3268, 3268),
+  Box(3269, 3269),
+  Box(3270, 3270),
+  Box(3271, 3271),
+  Box(3272, 3272),
+  Box(3273, 3273),
+  Box(3274, 3274),
+  Box(3275, 3275),
+  Box(3276, 3276),
+  Box(3277, 3277),
+  Box(3278, 3278),
+  Box(3279, 3279),
+  Box(3280, 3280),
+  Box(3281, 3281),
+  Box(3282, 3282),
+  Box(3283, 3283),
+  Box(3284, 3284),
+  Box(3285, 3285),
+  Box(3286, 3286),
+  Box(3287, 3287),
+  Box(3288, 3288),
+  Box(3289, 3289),
+  Box(3290, 3290),
+  Box(3291, 3291),
+  Box(3292, 3292),
+  Box(3293, 3293),
+  Box(3294, 3294),
+  Box(3295, 3295),
+  Box(3296, 3296),
+  Box(3297, 3297),
+  Box(3298, 3298),
+  Box(3299, 3299),
+  Box(3300, 3300),
+  Box(3301, 3301),
+  Box(3302, 3302),
+  Box(3303, 3303),
+  Box(3304, 3304),
+  Box(3305, 3305),
+  Box(3306, 3306),
+  Box(3307, 3307),
+  Box(3308, 3308),
+  Box(3309, 3309),
+  Box(3310, 3310),
+  Box(3311, 3311),
+  Box(3312, 3312),
+  Box(3313, 3313),
+  Box(3314, 3314),
+  Box(3315, 3315),
+  Box(3316, 3316),
+  Box(3317, 3317),
+  Box(3318, 3318),
+  Box(3319, 3319),
+  Box(3320, 3320),
+  Box(3321, 3321),
+  Box(3322, 3322),
+  Box(3323, 3323),
+  Box(3324, 3324),
+  Box(3325, 3325),
+  Box(3326, 3326),
+  Box(3327, 3327),
+  Box(3328, 3328),
+  Box(3329, 3329),
+  Box(3330, 3330),
+  Box(3331, 3331),
+  Box(3332, 3332),
+  Box(3333, 3333),
+  Box(3334, 3334),
+  Box(3335, 3335),
+  Box(3336, 3336),
+  Box(3337, 3337),
+  Box(3338, 3338),
+  Box(3339, 3339),
+  Box(3340, 3340),
+  Box(3341, 3341),
+  Box(3342, 3342),
+  Box(3343, 3343),
+  Box(3344, 3344),
+  Box(3345, 3345),
+  Box(3346, 3346),
+  Box(3347, 3347),
+  Box(3348, 3348),
+  Box(3349, 3349),
+  Box(3350, 3350),
+  Box(3351, 3351),
+  Box(3352, 3352),
+  Box(3353, 3353),
+  Box(3354, 3354),
+  Box(3355, 3355),
+  Box(3356, 3356),
+  Box(3357, 3357),
+  Box(3358, 3358),
+  Box(3359, 3359),
+  Box(3360, 3360),
+  Box(3361, 3361),
+  Box(3362, 3362),
+  Box(3363, 3363),
+  Box(3364, 3364),
+  Box(3365, 3365),
+  Box(3366, 3366),
+  Box(3367, 3367),
+  Box(3368, 3368),
+  Box(3369, 3369),
+  Box(3370, 3370),
+  Box(3371, 3371),
+  Box(3372, 3372),
+  Box(3373, 3373),
+  Box(3374, 3374),
+  Box(3375, 3375),
+  Box(3376, 3376),
+  Box(3377, 3377),
+  Box(3378, 3378),
+  Box(3379, 3379),
+  Box(3380, 3380),
+  Box(3381, 3381),
+  Box(3382, 3382),
+  Box(3383, 3383),
+  Box(3384, 3384),
+  Box(3385, 3385),
+  Box(3386, 3386),
+  Box(3387, 3387),
+  Box(3388, 3388),
+  Box(3389, 3389),
+  Box(3390, 3390),
+  Box(3391, 3391),
+  Box(3392, 3392),
+  Box(3393, 3393),
+  Box(3394, 3394),
+  Box(3395, 3395),
+  Box(3396, 3396),
+  Box(3397, 3397),
+  Box(3398, 3398),
+  Box(3399, 3399),
+  Box(3400, 3400),
+  Box(3401, 3401),
+  Box(3402, 3402),
+  Box(3403, 3403),
+  Box(3404, 3404),
+  Box(3405, 3405),
+  Box(3406, 3406),
+  Box(3407, 3407),
+  Box(3408, 3408),
+  Box(3409, 3409),
+  Box(3410, 3410),
+  Box(3411, 3411),
+  Box(3412, 3412),
+  Box(3413, 3413),
+  Box(3414, 3414),
+  Box(3415, 3415),
+  Box(3416, 3416),
+  Box(3417, 3417),
+  Box(3418, 3418),
+  Box(3419, 3419),
+  Box(3420, 3420),
+  Box(3421, 3421),
+  Box(3422, 3422),
+  Box(3423, 3423),
+  Box(3424, 3424),
+  Box(3425, 3425),
+  Box(3426, 3426),
+  Box(3427, 3427),
+  Box(3428, 3428),
+  Box(3429, 3429),
+  Box(3430, 3430),
+  Box(3431, 3431),
+  Box(3432, 3432),
+  Box(3433, 3433),
+  Box(3434, 3434),
+  Box(3435, 3435),
+  Box(3436, 3436),
+  Box(3437, 3437),
+  Box(3438, 3438),
+  Box(3439, 3439),
+  Box(3440, 3440),
+  Box(3441, 3441),
+  Box(3442, 3442),
+  Box(3443, 3443),
+  Box(3444, 3444),
+  Box(3445, 3445),
+  Box(3446, 3446),
+  Box(3447, 3447),
+  Box(3448, 3448),
+  Box(3449, 3449),
+  Box(3450, 3450),
+  Box(3451, 3451),
+  Box(3452, 3452),
+  Box(3453, 3453),
+  Box(3454, 3454),
+  Box(3455, 3455),
+  Box(3456, 3456),
+  Box(3457, 3457),
+  Box(3458, 3458),
+  Box(3459, 3459),
+  Box(3460, 3460),
+  Box(3461, 3461),
+  Box(3462, 3462),
+  Box(3463, 3463),
+  Box(3464, 3464),
+  Box(3465, 3465),
+  Box(3466, 3466),
+  Box(3467, 3467),
+  Box(3468, 3468),
+  Box(3469, 3469),
+  Box(3470, 3470),
+  Box(3471, 3471),
+  Box(3472, 3472),
+  Box(3473, 3473),
+  Box(3474, 3474),
+  Box(3475, 3475),
+  Box(3476, 3476),
+  Box(3477, 3477),
+  Box(3478, 3478),
+  Box(3479, 3479),
+  Box(3480, 3480),
+  Box(3481, 3481),
+  Box(3482, 3482),
+  Box(3483, 3483),
+  Box(3484, 3484),
+  Box(3485, 3485),
+  Box(3486, 3486),
+  Box(3487, 3487),
+  Box(3488, 3488),
+  Box(3489, 3489),
+  Box(3490, 3490),
+  Box(3491, 3491),
+  Box(3492, 3492),
+  Box(3493, 3493),
+  Box(3494, 3494),
+  Box(3495, 3495),
+  Box(3496, 3496),
+  Box(3497, 3497),
+  Box(3498, 3498),
+  Box(3499, 3499),
+  Box(3500, 3500),
+  Box(3501, 3501),
+  Box(3502, 3502),
+  Box(3503, 3503),
+  Box(3504, 3504),
+  Box(3505, 3505),
+  Box(3506, 3506),
+  Box(3507, 3507),
+  Box(3508, 3508),
+  Box(3509, 3509),
+  Box(3510, 3510),
+  Box(3511, 3511),
+  Box(3512, 3512),
+  Box(3513, 3513),
+  Box(3514, 3514),
+  Box(3515, 3515),
+  Box(3516, 3516),
+  Box(3517, 3517),
+  Box(3518, 3518),
+  Box(3519, 3519),
+  Box(3520, 3520),
+  Box(3521, 3521),
+  Box(3522, 3522),
+  Box(3523, 3523),
+  Box(3524, 3524),
+  Box(3525, 3525),
+  Box(3526, 3526),
+  Box(3527, 3527),
+  Box(3528, 3528),
+  Box(3529, 3529),
+  Box(3530, 3530),
+  Box(3531, 3531),
+  Box(3532, 3532),
+  Box(3533, 3533),
+  Box(3534, 3534),
+  Box(3535, 3535),
+  Box(3536, 3536),
+  Box(3537, 3537),
+  Box(3538, 3538),
+  Box(3539, 3539),
+  Box(3540, 3540),
+  Box(3541, 3541),
+  Box(3542, 3542),
+  Box(3543, 3543),
+  Box(3544, 3544),
+  Box(3545, 3545),
+  Box(3546, 3546),
+  Box(3547, 3547),
+  Box(3548, 3548),
+  Box(3549, 3549),
+  Box(3550, 3550),
+  Box(3551, 3551),
+  Box(3552, 3552),
+  Box(3553, 3553),
+  Box(3554, 3554),
+  Box(3555, 3555),
+  Box(3556, 3556),
+  Box(3557, 3557),
+  Box(3558, 3558),
+  Box(3559, 3559),
+  Box(3560, 3560),
+  Box(3561, 3561),
+  Box(3562, 3562),
+  Box(3563, 3563),
+  Box(3564, 3564),
+  Box(3565, 3565),
+  Box(3566, 3566),
+  Box(3567, 3567),
+  Box(3568, 3568),
+  Box(3569, 3569),
+  Box(3570, 3570),
+  Box(3571, 3571),
+  Box(3572, 3572),
+  Box(3573, 3573),
+  Box(3574, 3574),
+  Box(3575, 3575),
+  Box(3576, 3576),
+  Box(3577, 3577),
+  Box(3578, 3578),
+  Box(3579, 3579),
+  Box(3580, 3580),
+  Box(3581, 3581),
+  Box(3582, 3582),
+  Box(3583, 3583),
+  Box(3584, 3584),
+  Box(3585, 3585),
+  Box(3586, 3586),
+  Box(3587, 3587),
+  Box(3588, 3588),
+  Box(3589, 3589),
+  Box(3590, 3590),
+  Box(3591, 3591),
+  Box(3592, 3592),
+  Box(3593, 3593),
+  Box(3594, 3594),
+  Box(3595, 3595),
+  Box(3596, 3596),
+  Box(3597, 3597),
+  Box(3598, 3598),
+  Box(3599, 3599),
+  Box(3600, 3600),
+  Box(3601, 3601),
+  Box(3602, 3602),
+  Box(3603, 3603),
+  Box(3604, 3604),
+  Box(3605, 3605),
+  Box(3606, 3606),
+  Box(3607, 3607),
+  Box(3608, 3608),
+  Box(3609, 3609),
+  Box(3610, 3610),
+  Box(3611, 3611),
+  Box(3612, 3612),
+  Box(3613, 3613),
+  Box(3614, 3614),
+  Box(3615, 3615),
+  Box(3616, 3616),
+  Box(3617, 3617),
+  Box(3618, 3618),
+  Box(3619, 3619),
+  Box(3620, 3620),
+  Box(3621, 3621),
+  Box(3622, 3622),
+  Box(3623, 3623),
+  Box(3624, 3624),
+  Box(3625, 3625),
+  Box(3626, 3626),
+  Box(3627, 3627),
+  Box(3628, 3628),
+  Box(3629, 3629),
+  Box(3630, 3630),
+  Box(3631, 3631),
+  Box(3632, 3632),
+  Box(3633, 3633),
+  Box(3634, 3634),
+  Box(3635, 3635),
+  Box(3636, 3636),
+  Box(3637, 3637),
+  Box(3638, 3638),
+  Box(3639, 3639),
+  Box(3640, 3640),
+  Box(3641, 3641),
+  Box(3642, 3642),
+  Box(3643, 3643),
+  Box(3644, 3644),
+  Box(3645, 3645),
+  Box(3646, 3646),
+  Box(3647, 3647),
+  Box(3648, 3648),
+  Box(3649, 3649),
+  Box(3650, 3650),
+  Box(3651, 3651),
+  Box(3652, 3652),
+  Box(3653, 3653),
+  Box(3654, 3654),
+  Box(3655, 3655),
+  Box(3656, 3656),
+  Box(3657, 3657),
+  Box(3658, 3658),
+  Box(3659, 3659),
+  Box(3660, 3660),
+  Box(3661, 3661),
+  Box(3662, 3662),
+  Box(3663, 3663),
+  Box(3664, 3664),
+  Box(3665, 3665),
+  Box(3666, 3666),
+  Box(3667, 3667),
+  Box(3668, 3668),
+  Box(3669, 3669),
+  Box(3670, 3670),
+  Box(3671, 3671),
+  Box(3672, 3672),
+  Box(3673, 3673),
+  Box(3674, 3674),
+  Box(3675, 3675),
+  Box(3676, 3676),
+  Box(3677, 3677),
+  Box(3678, 3678),
+  Box(3679, 3679),
+  Box(3680, 3680),
+  Box(3681, 3681),
+  Box(3682, 3682),
+  Box(3683, 3683),
+  Box(3684, 3684),
+  Box(3685, 3685),
+  Box(3686, 3686),
+  Box(3687, 3687),
+  Box(3688, 3688),
+  Box(3689, 3689),
+  Box(3690, 3690),
+  Box(3691, 3691),
+  Box(3692, 3692),
+  Box(3693, 3693),
+  Box(3694, 3694),
+  Box(3695, 3695),
+  Box(3696, 3696),
+  Box(3697, 3697),
+  Box(3698, 3698),
+  Box(3699, 3699),
+  Box(3700, 3700),
+  Box(3701, 3701),
+  Box(3702, 3702),
+  Box(3703, 3703),
+  Box(3704, 3704),
+  Box(3705, 3705),
+  Box(3706, 3706),
+  Box(3707, 3707),
+  Box(3708, 3708),
+  Box(3709, 3709),
+  Box(3710, 3710),
+  Box(3711, 3711),
+  Box(3712, 3712),
+  Box(3713, 3713),
+  Box(3714, 3714),
+  Box(3715, 3715),
+  Box(3716, 3716),
+  Box(3717, 3717),
+  Box(3718, 3718),
+  Box(3719, 3719),
+  Box(3720, 3720),
+  Box(3721, 3721),
+  Box(3722, 3722),
+  Box(3723, 3723),
+  Box(3724, 3724),
+  Box(3725, 3725),
+  Box(3726, 3726),
+  Box(3727, 3727),
+  Box(3728, 3728),
+  Box(3729, 3729),
+  Box(3730, 3730),
+  Box(3731, 3731),
+  Box(3732, 3732),
+  Box(3733, 3733),
+  Box(3734, 3734),
+  Box(3735, 3735),
+  Box(3736, 3736),
+  Box(3737, 3737),
+  Box(3738, 3738),
+  Box(3739, 3739),
+  Box(3740, 3740),
+  Box(3741, 3741),
+  Box(3742, 3742),
+  Box(3743, 3743),
+  Box(3744, 3744),
+  Box(3745, 3745),
+  Box(3746, 3746),
+  Box(3747, 3747),
+  Box(3748, 3748),
+  Box(3749, 3749),
+  Box(3750, 3750),
+  Box(3751, 3751),
+  Box(3752, 3752),
+  Box(3753, 3753),
+  Box(3754, 3754),
+  Box(3755, 3755),
+  Box(3756, 3756),
+  Box(3757, 3757),
+  Box(3758, 3758),
+  Box(3759, 3759),
+  Box(3760, 3760),
+  Box(3761, 3761),
+  Box(3762, 3762),
+  Box(3763, 3763),
+  Box(3764, 3764),
+  Box(3765, 3765),
+  Box(3766, 3766),
+  Box(3767, 3767),
+  Box(3768, 3768),
+  Box(3769, 3769),
+  Box(3770, 3770),
+  Box(3771, 3771),
+  Box(3772, 3772),
+  Box(3773, 3773),
+  Box(3774, 3774),
+  Box(3775, 3775),
+  Box(3776, 3776),
+  Box(3777, 3777),
+  Box(3778, 3778),
+  Box(3779, 3779),
+  Box(3780, 3780),
+  Box(3781, 3781),
+  Box(3782, 3782),
+  Box(3783, 3783),
+  Box(3784, 3784),
+  Box(3785, 3785),
+  Box(3786, 3786),
+  Box(3787, 3787),
+  Box(3788, 3788),
+  Box(3789, 3789),
+  Box(3790, 3790),
+  Box(3791, 3791),
+  Box(3792, 3792),
+  Box(3793, 3793),
+  Box(3794, 3794),
+  Box(3795, 3795),
+  Box(3796, 3796),
+  Box(3797, 3797),
+  Box(3798, 3798),
+  Box(3799, 3799),
+  Box(3800, 3800),
+  Box(3801, 3801),
+  Box(3802, 3802),
+  Box(3803, 3803),
+  Box(3804, 3804),
+  Box(3805, 3805),
+  Box(3806, 3806),
+  Box(3807, 3807),
+  Box(3808, 3808),
+  Box(3809, 3809),
+  Box(3810, 3810),
+  Box(3811, 3811),
+  Box(3812, 3812),
+  Box(3813, 3813),
+  Box(3814, 3814),
+  Box(3815, 3815),
+  Box(3816, 3816),
+  Box(3817, 3817),
+  Box(3818, 3818),
+  Box(3819, 3819),
+  Box(3820, 3820),
+  Box(3821, 3821),
+  Box(3822, 3822),
+  Box(3823, 3823),
+  Box(3824, 3824),
+  Box(3825, 3825),
+  Box(3826, 3826),
+  Box(3827, 3827),
+  Box(3828, 3828),
+  Box(3829, 3829),
+  Box(3830, 3830),
+  Box(3831, 3831),
+  Box(3832, 3832),
+  Box(3833, 3833),
+  Box(3834, 3834),
+  Box(3835, 3835),
+  Box(3836, 3836),
+  Box(3837, 3837),
+  Box(3838, 3838),
+  Box(3839, 3839),
+  Box(3840, 3840),
+  Box(3841, 3841),
+  Box(3842, 3842),
+  Box(3843, 3843),
+  Box(3844, 3844),
+  Box(3845, 3845),
+  Box(3846, 3846),
+  Box(3847, 3847),
+  Box(3848, 3848),
+  Box(3849, 3849),
+  Box(3850, 3850),
+  Box(3851, 3851),
+  Box(3852, 3852),
+  Box(3853, 3853),
+  Box(3854, 3854),
+  Box(3855, 3855),
+  Box(3856, 3856),
+  Box(3857, 3857),
+  Box(3858, 3858),
+  Box(3859, 3859),
+  Box(3860, 3860),
+  Box(3861, 3861),
+  Box(3862, 3862),
+  Box(3863, 3863),
+  Box(3864, 3864),
+  Box(3865, 3865),
+  Box(3866, 3866),
+  Box(3867, 3867),
+  Box(3868, 3868),
+  Box(3869, 3869),
+  Box(3870, 3870),
+  Box(3871, 3871),
+  Box(3872, 3872),
+  Box(3873, 3873),
+  Box(3874, 3874),
+  Box(3875, 3875),
+  Box(3876, 3876),
+  Box(3877, 3877),
+  Box(3878, 3878),
+  Box(3879, 3879),
+  Box(3880, 3880),
+  Box(3881, 3881),
+  Box(3882, 3882),
+  Box(3883, 3883),
+  Box(3884, 3884),
+  Box(3885, 3885),
+  Box(3886, 3886),
+  Box(3887, 3887),
+  Box(3888, 3888),
+  Box(3889, 3889),
+  Box(3890, 3890),
+  Box(3891, 3891),
+  Box(3892, 3892),
+  Box(3893, 3893),
+  Box(3894, 3894),
+  Box(3895, 3895),
+  Box(3896, 3896),
+  Box(3897, 3897),
+  Box(3898, 3898),
+  Box(3899, 3899),
+  Box(3900, 3900),
+  Box(3901, 3901),
+  Box(3902, 3902),
+  Box(3903, 3903),
+  Box(3904, 3904),
+  Box(3905, 3905),
+  Box(3906, 3906),
+  Box(3907, 3907),
+  Box(3908, 3908),
+  Box(3909, 3909),
+  Box(3910, 3910),
+  Box(3911, 3911),
+  Box(3912, 3912),
+  Box(3913, 3913),
+  Box(3914, 3914),
+  Box(3915, 3915),
+  Box(3916, 3916),
+  Box(3917, 3917),
+  Box(3918, 3918),
+  Box(3919, 3919),
+  Box(3920, 3920),
+  Box(3921, 3921),
+  Box(3922, 3922),
+  Box(3923, 3923),
+  Box(3924, 3924),
+  Box(3925, 3925),
+  Box(3926, 3926),
+  Box(3927, 3927),
+  Box(3928, 3928),
+  Box(3929, 3929),
+  Box(3930, 3930),
+  Box(3931, 3931),
+  Box(3932, 3932),
+  Box(3933, 3933),
+  Box(3934, 3934),
+  Box(3935, 3935),
+  Box(3936, 3936),
+  Box(3937, 3937),
+  Box(3938, 3938),
+  Box(3939, 3939),
+  Box(3940, 3940),
+  Box(3941, 3941),
+  Box(3942, 3942),
+  Box(3943, 3943),
+  Box(3944, 3944),
+  Box(3945, 3945),
+  Box(3946, 3946),
+  Box(3947, 3947),
+  Box(3948, 3948),
+  Box(3949, 3949),
+  Box(3950, 3950),
+  Box(3951, 3951),
+  Box(3952, 3952),
+  Box(3953, 3953),
+  Box(3954, 3954),
+  Box(3955, 3955),
+  Box(3956, 3956),
+  Box(3957, 3957),
+  Box(3958, 3958),
+  Box(3959, 3959),
+  Box(3960, 3960),
+  Box(3961, 3961),
+  Box(3962, 3962),
+  Box(3963, 3963),
+  Box(3964, 3964),
+  Box(3965, 3965),
+  Box(3966, 3966),
+  Box(3967, 3967),
+  Box(3968, 3968),
+  Box(3969, 3969),
+  Box(3970, 3970),
+  Box(3971, 3971),
+  Box(3972, 3972),
+  Box(3973, 3973),
+  Box(3974, 3974),
+  Box(3975, 3975),
+  Box(3976, 3976),
+  Box(3977, 3977),
+  Box(3978, 3978),
+  Box(3979, 3979),
+  Box(3980, 3980),
+  Box(3981, 3981),
+  Box(3982, 3982),
+  Box(3983, 3983),
+  Box(3984, 3984),
+  Box(3985, 3985),
+  Box(3986, 3986),
+  Box(3987, 3987),
+  Box(3988, 3988),
+  Box(3989, 3989),
+  Box(3990, 3990),
+  Box(3991, 3991),
+  Box(3992, 3992),
+  Box(3993, 3993),
+  Box(3994, 3994),
+  Box(3995, 3995),
+  Box(3996, 3996),
+  Box(3997, 3997),
+  Box(3998, 3998),
+  Box(3999, 3999),
+  Box(4000, 4000),
+  Box(4001, 4001),
+  Box(4002, 4002),
+  Box(4003, 4003),
+  Box(4004, 4004),
+  Box(4005, 4005),
+  Box(4006, 4006),
+  Box(4007, 4007),
+  Box(4008, 4008),
+  Box(4009, 4009),
+  Box(4010, 4010),
+  Box(4011, 4011),
+  Box(4012, 4012),
+  Box(4013, 4013),
+  Box(4014, 4014),
+  Box(4015, 4015),
+  Box(4016, 4016),
+  Box(4017, 4017),
+  Box(4018, 4018),
+  Box(4019, 4019),
+  Box(4020, 4020),
+  Box(4021, 4021),
+  Box(4022, 4022),
+  Box(4023, 4023),
+  Box(4024, 4024),
+  Box(4025, 4025),
+  Box(4026, 4026),
+  Box(4027, 4027),
+  Box(4028, 4028),
+  Box(4029, 4029),
+  Box(4030, 4030),
+  Box(4031, 4031),
+  Box(4032, 4032),
+  Box(4033, 4033),
+  Box(4034, 4034),
+  Box(4035, 4035),
+  Box(4036, 4036),
+  Box(4037, 4037),
+  Box(4038, 4038),
+  Box(4039, 4039),
+  Box(4040, 4040),
+  Box(4041, 4041),
+  Box(4042, 4042),
+  Box(4043, 4043),
+  Box(4044, 4044),
+  Box(4045, 4045),
+  Box(4046, 4046),
+  Box(4047, 4047),
+  Box(4048, 4048),
+  Box(4049, 4049),
+  Box(4050, 4050),
+  Box(4051, 4051),
+  Box(4052, 4052),
+  Box(4053, 4053),
+  Box(4054, 4054),
+  Box(4055, 4055),
+  Box(4056, 4056),
+  Box(4057, 4057),
+  Box(4058, 4058),
+  Box(4059, 4059),
+  Box(4060, 4060),
+  Box(4061, 4061),
+  Box(4062, 4062),
+  Box(4063, 4063),
+  Box(4064, 4064),
+  Box(4065, 4065),
+  Box(4066, 4066),
+  Box(4067, 4067),
+  Box(4068, 4068),
+  Box(4069, 4069),
+  Box(4070, 4070),
+  Box(4071, 4071),
+  Box(4072, 4072),
+  Box(4073, 4073),
+  Box(4074, 4074),
+  Box(4075, 4075),
+  Box(4076, 4076),
+  Box(4077, 4077),
+  Box(4078, 4078),
+  Box(4079, 4079),
+  Box(4080, 4080),
+  Box(4081, 4081),
+  Box(4082, 4082),
+  Box(4083, 4083),
+  Box(4084, 4084),
+  Box(4085, 4085),
+  Box(4086, 4086),
+  Box(4087, 4087),
+  Box(4088, 4088),
+  Box(4089, 4089),
+  Box(4090, 4090),
+  Box(4091, 4091),
+  Box(4092, 4092),
+  Box(4093, 4093),
+  Box(4094, 4094),
+  Box(4095, 4095),
+  Box(4096, 4096),
+  Box(4097, 4097),
+  Box(4098, 4098),
+  Box(4099, 4099),
+  Box(4100, 4100),
+  Box(4101, 4101),
+  Box(4102, 4102),
+  Box(4103, 4103),
+  Box(4104, 4104),
+  Box(4105, 4105),
+  Box(4106, 4106),
+  Box(4107, 4107),
+  Box(4108, 4108),
+  Box(4109, 4109),
+  Box(4110, 4110),
+  Box(4111, 4111),
+  Box(4112, 4112),
+  Box(4113, 4113),
+  Box(4114, 4114),
+  Box(4115, 4115),
+  Box(4116, 4116),
+  Box(4117, 4117),
+  Box(4118, 4118),
+  Box(4119, 4119),
+  Box(4120, 4120),
+  Box(4121, 4121),
+  Box(4122, 4122),
+  Box(4123, 4123),
+  Box(4124, 4124),
+  Box(4125, 4125),
+  Box(4126, 4126),
+  Box(4127, 4127),
+  Box(4128, 4128),
+  Box(4129, 4129),
+  Box(4130, 4130),
+  Box(4131, 4131),
+  Box(4132, 4132),
+  Box(4133, 4133),
+  Box(4134, 4134),
+  Box(4135, 4135),
+  Box(4136, 4136),
+  Box(4137, 4137),
+  Box(4138, 4138),
+  Box(4139, 4139),
+  Box(4140, 4140),
+  Box(4141, 4141),
+  Box(4142, 4142),
+  Box(4143, 4143),
+  Box(4144, 4144),
+  Box(4145, 4145),
+  Box(4146, 4146),
+  Box(4147, 4147),
+  Box(4148, 4148),
+  Box(4149, 4149),
+  Box(4150, 4150),
+  Box(4151, 4151),
+  Box(4152, 4152),
+  Box(4153, 4153),
+  Box(4154, 4154),
+  Box(4155, 4155),
+  Box(4156, 4156),
+  Box(4157, 4157),
+  Box(4158, 4158),
+  Box(4159, 4159),
+  Box(4160, 4160),
+  Box(4161, 4161),
+  Box(4162, 4162),
+  Box(4163, 4163),
+  Box(4164, 4164),
+  Box(4165, 4165),
+  Box(4166, 4166),
+  Box(4167, 4167),
+  Box(4168, 4168),
+  Box(4169, 4169),
+  Box(4170, 4170),
+  Box(4171, 4171),
+  Box(4172, 4172),
+  Box(4173, 4173),
+  Box(4174, 4174),
+  Box(4175, 4175),
+  Box(4176, 4176),
+  Box(4177, 4177),
+  Box(4178, 4178),
+  Box(4179, 4179),
+  Box(4180, 4180),
+  Box(4181, 4181),
+  Box(4182, 4182),
+  Box(4183, 4183),
+  Box(4184, 4184),
+  Box(4185, 4185),
+  Box(4186, 4186),
+  Box(4187, 4187),
+  Box(4188, 4188),
+  Box(4189, 4189),
+  Box(4190, 4190),
+  Box(4191, 4191),
+  Box(4192, 4192),
+  Box(4193, 4193),
+  Box(4194, 4194),
+  Box(4195, 4195),
+  Box(4196, 4196),
+  Box(4197, 4197),
+  Box(4198, 4198),
+  Box(4199, 4199),
+  Box(4200, 4200),
+  Box(4201, 4201),
+  Box(4202, 4202),
+  Box(4203, 4203),
+  Box(4204, 4204),
+  Box(4205, 4205),
+  Box(4206, 4206),
+  Box(4207, 4207),
+  Box(4208, 4208),
+  Box(4209, 4209),
+  Box(4210, 4210),
+  Box(4211, 4211),
+  Box(4212, 4212),
+  Box(4213, 4213),
+  Box(4214, 4214),
+  Box(4215, 4215),
+  Box(4216, 4216),
+  Box(4217, 4217),
+  Box(4218, 4218),
+  Box(4219, 4219),
+  Box(4220, 4220),
+  Box(4221, 4221),
+  Box(4222, 4222),
+  Box(4223, 4223),
+  Box(4224, 4224),
+  Box(4225, 4225),
+  Box(4226, 4226),
+  Box(4227, 4227),
+  Box(4228, 4228),
+  Box(4229, 4229),
+  Box(4230, 4230),
+  Box(4231, 4231),
+  Box(4232, 4232),
+  Box(4233, 4233),
+  Box(4234, 4234),
+  Box(4235, 4235),
+  Box(4236, 4236),
+  Box(4237, 4237),
+  Box(4238, 4238),
+  Box(4239, 4239),
+  Box(4240, 4240),
+  Box(4241, 4241),
+  Box(4242, 4242),
+  Box(4243, 4243),
+  Box(4244, 4244),
+  Box(4245, 4245),
+  Box(4246, 4246),
+  Box(4247, 4247),
+  Box(4248, 4248),
+  Box(4249, 4249),
+  Box(4250, 4250),
+  Box(4251, 4251),
+  Box(4252, 4252),
+  Box(4253, 4253),
+  Box(4254, 4254),
+  Box(4255, 4255),
+  Box(4256, 4256),
+  Box(4257, 4257),
+  Box(4258, 4258),
+  Box(4259, 4259),
+  Box(4260, 4260),
+  Box(4261, 4261),
+  Box(4262, 4262),
+  Box(4263, 4263),
+  Box(4264, 4264),
+  Box(4265, 4265),
+  Box(4266, 4266),
+  Box(4267, 4267),
+  Box(4268, 4268),
+  Box(4269, 4269),
+  Box(4270, 4270),
+  Box(4271, 4271),
+  Box(4272, 4272),
+  Box(4273, 4273),
+  Box(4274, 4274),
+  Box(4275, 4275),
+  Box(4276, 4276),
+  Box(4277, 4277),
+  Box(4278, 4278),
+  Box(4279, 4279),
+  Box(4280, 4280),
+  Box(4281, 4281),
+  Box(4282, 4282),
+  Box(4283, 4283),
+  Box(4284, 4284),
+  Box(4285, 4285),
+  Box(4286, 4286),
+  Box(4287, 4287),
+  Box(4288, 4288),
+  Box(4289, 4289),
+  Box(4290, 4290),
+  Box(4291, 4291),
+  Box(4292, 4292),
+  Box(4293, 4293),
+  Box(4294, 4294),
+  Box(4295, 4295),
+  Box(4296, 4296),
+  Box(4297, 4297),
+  Box(4298, 4298),
+  Box(4299, 4299),
+  Box(4300, 4300),
+  Box(4301, 4301),
+  Box(4302, 4302),
+  Box(4303, 4303),
+  Box(4304, 4304),
+  Box(4305, 4305),
+  Box(4306, 4306),
+  Box(4307, 4307),
+  Box(4308, 4308),
+  Box(4309, 4309),
+  Box(4310, 4310),
+  Box(4311, 4311),
+  Box(4312, 4312),
+  Box(4313, 4313),
+  Box(4314, 4314),
+  Box(4315, 4315),
+  Box(4316, 4316),
+  Box(4317, 4317),
+  Box(4318, 4318),
+  Box(4319, 4319),
+  Box(4320, 4320),
+  Box(4321, 4321),
+  Box(4322, 4322),
+  Box(4323, 4323),
+  Box(4324, 4324),
+  Box(4325, 4325),
+  Box(4326, 4326),
+  Box(4327, 4327),
+  Box(4328, 4328),
+  Box(4329, 4329),
+  Box(4330, 4330),
+  Box(4331, 4331),
+  Box(4332, 4332),
+  Box(4333, 4333),
+  Box(4334, 4334),
+  Box(4335, 4335),
+  Box(4336, 4336),
+  Box(4337, 4337),
+  Box(4338, 4338),
+  Box(4339, 4339),
+  Box(4340, 4340),
+  Box(4341, 4341),
+  Box(4342, 4342),
+  Box(4343, 4343),
+  Box(4344, 4344),
+  Box(4345, 4345),
+  Box(4346, 4346),
+  Box(4347, 4347),
+  Box(4348, 4348),
+  Box(4349, 4349),
+  Box(4350, 4350),
+  Box(4351, 4351),
+  Box(4352, 4352),
+  Box(4353, 4353),
+  Box(4354, 4354),
+  Box(4355, 4355),
+  Box(4356, 4356),
+  Box(4357, 4357),
+  Box(4358, 4358),
+  Box(4359, 4359),
+  Box(4360, 4360),
+  Box(4361, 4361),
+  Box(4362, 4362),
+  Box(4363, 4363),
+  Box(4364, 4364),
+  Box(4365, 4365),
+  Box(4366, 4366),
+  Box(4367, 4367),
+  Box(4368, 4368),
+  Box(4369, 4369),
+  Box(4370, 4370),
+  Box(4371, 4371),
+  Box(4372, 4372),
+  Box(4373, 4373),
+  Box(4374, 4374),
+  Box(4375, 4375),
+  Box(4376, 4376),
+  Box(4377, 4377),
+  Box(4378, 4378),
+  Box(4379, 4379),
+  Box(4380, 4380),
+  Box(4381, 4381),
+  Box(4382, 4382),
+  Box(4383, 4383),
+  Box(4384, 4384),
+  Box(4385, 4385),
+  Box(4386, 4386),
+  Box(4387, 4387),
+  Box(4388, 4388),
+  Box(4389, 4389),
+  Box(4390, 4390),
+  Box(4391, 4391),
+  Box(4392, 4392),
+  Box(4393, 4393),
+  Box(4394, 4394),
+  Box(4395, 4395),
+  Box(4396, 4396),
+  Box(4397, 4397),
+  Box(4398, 4398),
+  Box(4399, 4399),
+  Box(4400, 4400),
+  Box(4401, 4401),
+  Box(4402, 4402),
+  Box(4403, 4403),
+  Box(4404, 4404),
+  Box(4405, 4405),
+  Box(4406, 4406),
+  Box(4407, 4407),
+  Box(4408, 4408),
+  Box(4409, 4409),
+  Box(4410, 4410),
+  Box(4411, 4411),
+  Box(4412, 4412),
+  Box(4413, 4413),
+  Box(4414, 4414),
+  Box(4415, 4415),
+  Box(4416, 4416),
+  Box(4417, 4417),
+  Box(4418, 4418),
+  Box(4419, 4419),
+  Box(4420, 4420),
+  Box(4421, 4421),
+  Box(4422, 4422),
+  Box(4423, 4423),
+  Box(4424, 4424),
+  Box(4425, 4425),
+  Box(4426, 4426),
+  Box(4427, 4427),
+  Box(4428, 4428),
+  Box(4429, 4429),
+  Box(4430, 4430),
+  Box(4431, 4431),
+  Box(4432, 4432),
+  Box(4433, 4433),
+  Box(4434, 4434),
+  Box(4435, 4435),
+  Box(4436, 4436),
+  Box(4437, 4437),
+  Box(4438, 4438),
+  Box(4439, 4439),
+  Box(4440, 4440),
+  Box(4441, 4441),
+  Box(4442, 4442),
+  Box(4443, 4443),
+  Box(4444, 4444),
+  Box(4445, 4445),
+  Box(4446, 4446),
+  Box(4447, 4447),
+  Box(4448, 4448),
+  Box(4449, 4449),
+  Box(4450, 4450),
+  Box(4451, 4451),
+  Box(4452, 4452),
+  Box(4453, 4453),
+  Box(4454, 4454),
+  Box(4455, 4455),
+  Box(4456, 4456),
+  Box(4457, 4457),
+  Box(4458, 4458),
+  Box(4459, 4459),
+  Box(4460, 4460),
+  Box(4461, 4461),
+  Box(4462, 4462),
+  Box(4463, 4463),
+  Box(4464, 4464),
+  Box(4465, 4465),
+  Box(4466, 4466),
+  Box(4467, 4467),
+  Box(4468, 4468),
+  Box(4469, 4469),
+  Box(4470, 4470),
+  Box(4471, 4471),
+  Box(4472, 4472),
+  Box(4473, 4473),
+  Box(4474, 4474),
+  Box(4475, 4475),
+  Box(4476, 4476),
+  Box(4477, 4477),
+  Box(4478, 4478),
+  Box(4479, 4479),
+  Box(4480, 4480),
+  Box(4481, 4481),
+  Box(4482, 4482),
+  Box(4483, 4483),
+  Box(4484, 4484),
+  Box(4485, 4485),
+  Box(4486, 4486),
+  Box(4487, 4487),
+  Box(4488, 4488),
+  Box(4489, 4489),
+  Box(4490, 4490),
+  Box(4491, 4491),
+  Box(4492, 4492),
+  Box(4493, 4493),
+  Box(4494, 4494),
+  Box(4495, 4495),
+  Box(4496, 4496),
+  Box(4497, 4497),
+  Box(4498, 4498),
+  Box(4499, 4499),
+  Box(4500, 4500),
+  Box(4501, 4501),
+  Box(4502, 4502),
+  Box(4503, 4503),
+  Box(4504, 4504),
+  Box(4505, 4505),
+  Box(4506, 4506),
+  Box(4507, 4507),
+  Box(4508, 4508),
+  Box(4509, 4509),
+  Box(4510, 4510),
+  Box(4511, 4511),
+  Box(4512, 4512),
+  Box(4513, 4513),
+  Box(4514, 4514),
+  Box(4515, 4515),
+  Box(4516, 4516),
+  Box(4517, 4517),
+  Box(4518, 4518),
+  Box(4519, 4519),
+  Box(4520, 4520),
+  Box(4521, 4521),
+  Box(4522, 4522),
+  Box(4523, 4523),
+  Box(4524, 4524),
+  Box(4525, 4525),
+  Box(4526, 4526),
+  Box(4527, 4527),
+  Box(4528, 4528),
+  Box(4529, 4529),
+  Box(4530, 4530),
+  Box(4531, 4531),
+  Box(4532, 4532),
+  Box(4533, 4533),
+  Box(4534, 4534),
+  Box(4535, 4535),
+  Box(4536, 4536),
+  Box(4537, 4537),
+  Box(4538, 4538),
+  Box(4539, 4539),
+  Box(4540, 4540),
+  Box(4541, 4541),
+  Box(4542, 4542),
+  Box(4543, 4543),
+  Box(4544, 4544),
+  Box(4545, 4545),
+  Box(4546, 4546),
+  Box(4547, 4547),
+  Box(4548, 4548),
+  Box(4549, 4549),
+  Box(4550, 4550),
+  Box(4551, 4551),
+  Box(4552, 4552),
+  Box(4553, 4553),
+  Box(4554, 4554),
+  Box(4555, 4555),
+  Box(4556, 4556),
+  Box(4557, 4557),
+  Box(4558, 4558),
+  Box(4559, 4559),
+  Box(4560, 4560),
+  Box(4561, 4561),
+  Box(4562, 4562),
+  Box(4563, 4563),
+  Box(4564, 4564),
+  Box(4565, 4565),
+  Box(4566, 4566),
+  Box(4567, 4567),
+  Box(4568, 4568),
+  Box(4569, 4569),
+  Box(4570, 4570),
+  Box(4571, 4571),
+  Box(4572, 4572),
+  Box(4573, 4573),
+  Box(4574, 4574),
+  Box(4575, 4575),
+  Box(4576, 4576),
+  Box(4577, 4577),
+  Box(4578, 4578),
+  Box(4579, 4579),
+  Box(4580, 4580),
+  Box(4581, 4581),
+  Box(4582, 4582),
+  Box(4583, 4583),
+  Box(4584, 4584),
+  Box(4585, 4585),
+  Box(4586, 4586),
+  Box(4587, 4587),
+  Box(4588, 4588),
+  Box(4589, 4589),
+  Box(4590, 4590),
+  Box(4591, 4591),
+  Box(4592, 4592),
+  Box(4593, 4593),
+  Box(4594, 4594),
+  Box(4595, 4595),
+  Box(4596, 4596),
+  Box(4597, 4597),
+  Box(4598, 4598),
+  Box(4599, 4599),
+  Box(4600, 4600),
+  Box(4601, 4601),
+  Box(4602, 4602),
+  Box(4603, 4603),
+  Box(4604, 4604),
+  Box(4605, 4605),
+  Box(4606, 4606),
+  Box(4607, 4607),
+  Box(4608, 4608),
+  Box(4609, 4609),
+  Box(4610, 4610),
+  Box(4611, 4611),
+  Box(4612, 4612),
+  Box(4613, 4613),
+  Box(4614, 4614),
+  Box(4615, 4615),
+  Box(4616, 4616),
+  Box(4617, 4617),
+  Box(4618, 4618),
+  Box(4619, 4619),
+  Box(4620, 4620),
+  Box(4621, 4621),
+  Box(4622, 4622),
+  Box(4623, 4623),
+  Box(4624, 4624),
+  Box(4625, 4625),
+  Box(4626, 4626),
+  Box(4627, 4627),
+  Box(4628, 4628),
+  Box(4629, 4629),
+  Box(4630, 4630),
+  Box(4631, 4631),
+  Box(4632, 4632),
+  Box(4633, 4633),
+  Box(4634, 4634),
+  Box(4635, 4635),
+  Box(4636, 4636),
+  Box(4637, 4637),
+  Box(4638, 4638),
+  Box(4639, 4639),
+  Box(4640, 4640),
+  Box(4641, 4641),
+  Box(4642, 4642),
+  Box(4643, 4643),
+  Box(4644, 4644),
+  Box(4645, 4645),
+  Box(4646, 4646),
+  Box(4647, 4647),
+  Box(4648, 4648),
+  Box(4649, 4649),
+  Box(4650, 4650),
+  Box(4651, 4651),
+  Box(4652, 4652),
+  Box(4653, 4653),
+  Box(4654, 4654),
+  Box(4655, 4655),
+  Box(4656, 4656),
+  Box(4657, 4657),
+  Box(4658, 4658),
+  Box(4659, 4659),
+  Box(4660, 4660),
+  Box(4661, 4661),
+  Box(4662, 4662),
+  Box(4663, 4663),
+  Box(4664, 4664),
+  Box(4665, 4665),
+  Box(4666, 4666),
+  Box(4667, 4667),
+  Box(4668, 4668),
+  Box(4669, 4669),
+  Box(4670, 4670),
+  Box(4671, 4671),
+  Box(4672, 4672),
+  Box(4673, 4673),
+  Box(4674, 4674),
+  Box(4675, 4675),
+  Box(4676, 4676),
+  Box(4677, 4677),
+  Box(4678, 4678),
+  Box(4679, 4679),
+  Box(4680, 4680),
+  Box(4681, 4681),
+  Box(4682, 4682),
+  Box(4683, 4683),
+  Box(4684, 4684),
+  Box(4685, 4685),
+  Box(4686, 4686),
+  Box(4687, 4687),
+  Box(4688, 4688),
+  Box(4689, 4689),
+  Box(4690, 4690),
+  Box(4691, 4691),
+  Box(4692, 4692),
+  Box(4693, 4693),
+  Box(4694, 4694),
+  Box(4695, 4695),
+  Box(4696, 4696),
+  Box(4697, 4697),
+  Box(4698, 4698),
+  Box(4699, 4699),
+  Box(4700, 4700),
+  Box(4701, 4701),
+  Box(4702, 4702),
+  Box(4703, 4703),
+  Box(4704, 4704),
+  Box(4705, 4705),
+  Box(4706, 4706),
+  Box(4707, 4707),
+  Box(4708, 4708),
+  Box(4709, 4709),
+  Box(4710, 4710),
+  Box(4711, 4711),
+  Box(4712, 4712),
+  Box(4713, 4713),
+  Box(4714, 4714),
+  Box(4715, 4715),
+  Box(4716, 4716),
+  Box(4717, 4717),
+  Box(4718, 4718),
+  Box(4719, 4719),
+  Box(4720, 4720),
+  Box(4721, 4721),
+  Box(4722, 4722),
+  Box(4723, 4723),
+  Box(4724, 4724),
+  Box(4725, 4725),
+  Box(4726, 4726),
+  Box(4727, 4727),
+  Box(4728, 4728),
+  Box(4729, 4729),
+  Box(4730, 4730),
+  Box(4731, 4731),
+  Box(4732, 4732),
+  Box(4733, 4733),
+  Box(4734, 4734),
+  Box(4735, 4735),
+  Box(4736, 4736),
+  Box(4737, 4737),
+  Box(4738, 4738),
+  Box(4739, 4739),
+  Box(4740, 4740),
+  Box(4741, 4741),
+  Box(4742, 4742),
+  Box(4743, 4743),
+  Box(4744, 4744),
+  Box(4745, 4745),
+  Box(4746, 4746),
+  Box(4747, 4747),
+  Box(4748, 4748),
+  Box(4749, 4749),
+  Box(4750, 4750),
+  Box(4751, 4751),
+  Box(4752, 4752),
+  Box(4753, 4753),
+  Box(4754, 4754),
+  Box(4755, 4755),
+  Box(4756, 4756),
+  Box(4757, 4757),
+  Box(4758, 4758),
+  Box(4759, 4759),
+  Box(4760, 4760),
+  Box(4761, 4761),
+  Box(4762, 4762),
+  Box(4763, 4763),
+  Box(4764, 4764),
+  Box(4765, 4765),
+  Box(4766, 4766),
+  Box(4767, 4767),
+  Box(4768, 4768),
+  Box(4769, 4769),
+  Box(4770, 4770),
+  Box(4771, 4771),
+  Box(4772, 4772),
+  Box(4773, 4773),
+  Box(4774, 4774),
+  Box(4775, 4775),
+  Box(4776, 4776),
+  Box(4777, 4777),
+  Box(4778, 4778),
+  Box(4779, 4779),
+  Box(4780, 4780),
+  Box(4781, 4781),
+  Box(4782, 4782),
+  Box(4783, 4783),
+  Box(4784, 4784),
+  Box(4785, 4785),
+  Box(4786, 4786),
+  Box(4787, 4787),
+  Box(4788, 4788),
+  Box(4789, 4789),
+  Box(4790, 4790),
+  Box(4791, 4791),
+  Box(4792, 4792),
+  Box(4793, 4793),
+  Box(4794, 4794),
+  Box(4795, 4795),
+  Box(4796, 4796),
+  Box(4797, 4797),
+  Box(4798, 4798),
+  Box(4799, 4799),
+  Box(4800, 4800),
+  Box(4801, 4801),
+  Box(4802, 4802),
+  Box(4803, 4803),
+  Box(4804, 4804),
+  Box(4805, 4805),
+  Box(4806, 4806),
+  Box(4807, 4807),
+  Box(4808, 4808),
+  Box(4809, 4809),
+  Box(4810, 4810),
+  Box(4811, 4811),
+  Box(4812, 4812),
+  Box(4813, 4813),
+  Box(4814, 4814),
+  Box(4815, 4815),
+  Box(4816, 4816),
+  Box(4817, 4817),
+  Box(4818, 4818),
+  Box(4819, 4819),
+  Box(4820, 4820),
+  Box(4821, 4821),
+  Box(4822, 4822),
+  Box(4823, 4823),
+  Box(4824, 4824),
+  Box(4825, 4825),
+  Box(4826, 4826),
+  Box(4827, 4827),
+  Box(4828, 4828),
+  Box(4829, 4829),
+  Box(4830, 4830),
+  Box(4831, 4831),
+  Box(4832, 4832),
+  Box(4833, 4833),
+  Box(4834, 4834),
+  Box(4835, 4835),
+  Box(4836, 4836),
+  Box(4837, 4837),
+  Box(4838, 4838),
+  Box(4839, 4839),
+  Box(4840, 4840),
+  Box(4841, 4841),
+  Box(4842, 4842),
+  Box(4843, 4843),
+  Box(4844, 4844),
+  Box(4845, 4845),
+  Box(4846, 4846),
+  Box(4847, 4847),
+  Box(4848, 4848),
+  Box(4849, 4849),
+  Box(4850, 4850),
+  Box(4851, 4851),
+  Box(4852, 4852),
+  Box(4853, 4853),
+  Box(4854, 4854),
+  Box(4855, 4855),
+  Box(4856, 4856),
+  Box(4857, 4857),
+  Box(4858, 4858),
+  Box(4859, 4859),
+  Box(4860, 4860),
+  Box(4861, 4861),
+  Box(4862, 4862),
+  Box(4863, 4863),
+  Box(4864, 4864),
+  Box(4865, 4865),
+  Box(4866, 4866),
+  Box(4867, 4867),
+  Box(4868, 4868),
+  Box(4869, 4869),
+  Box(4870, 4870),
+  Box(4871, 4871),
+  Box(4872, 4872),
+  Box(4873, 4873),
+  Box(4874, 4874),
+  Box(4875, 4875),
+  Box(4876, 4876),
+  Box(4877, 4877),
+  Box(4878, 4878),
+  Box(4879, 4879),
+  Box(4880, 4880),
+  Box(4881, 4881),
+  Box(4882, 4882),
+  Box(4883, 4883),
+  Box(4884, 4884),
+  Box(4885, 4885),
+  Box(4886, 4886),
+  Box(4887, 4887),
+  Box(4888, 4888),
+  Box(4889, 4889),
+  Box(4890, 4890),
+  Box(4891, 4891),
+  Box(4892, 4892),
+  Box(4893, 4893),
+  Box(4894, 4894),
+  Box(4895, 4895),
+  Box(4896, 4896),
+  Box(4897, 4897),
+  Box(4898, 4898),
+  Box(4899, 4899),
+  Box(4900, 4900),
+  Box(4901, 4901),
+  Box(4902, 4902),
+  Box(4903, 4903),
+  Box(4904, 4904),
+  Box(4905, 4905),
+  Box(4906, 4906),
+  Box(4907, 4907),
+  Box(4908, 4908),
+  Box(4909, 4909),
+  Box(4910, 4910),
+  Box(4911, 4911),
+  Box(4912, 4912),
+  Box(4913, 4913),
+  Box(4914, 4914),
+  Box(4915, 4915),
+  Box(4916, 4916),
+  Box(4917, 4917),
+  Box(4918, 4918),
+  Box(4919, 4919),
+  Box(4920, 4920),
+  Box(4921, 4921),
+  Box(4922, 4922),
+  Box(4923, 4923),
+  Box(4924, 4924),
+  Box(4925, 4925),
+  Box(4926, 4926),
+  Box(4927, 4927),
+  Box(4928, 4928),
+  Box(4929, 4929),
+  Box(4930, 4930),
+  Box(4931, 4931),
+  Box(4932, 4932),
+  Box(4933, 4933),
+  Box(4934, 4934),
+  Box(4935, 4935),
+  Box(4936, 4936),
+  Box(4937, 4937),
+  Box(4938, 4938),
+  Box(4939, 4939),
+  Box(4940, 4940),
+  Box(4941, 4941),
+  Box(4942, 4942),
+  Box(4943, 4943),
+  Box(4944, 4944),
+  Box(4945, 4945),
+  Box(4946, 4946),
+  Box(4947, 4947),
+  Box(4948, 4948),
+  Box(4949, 4949),
+  Box(4950, 4950),
+  Box(4951, 4951),
+  Box(4952, 4952),
+  Box(4953, 4953),
+  Box(4954, 4954),
+  Box(4955, 4955),
+  Box(4956, 4956),
+  Box(4957, 4957),
+  Box(4958, 4958),
+  Box(4959, 4959),
+  Box(4960, 4960),
+  Box(4961, 4961),
+  Box(4962, 4962),
+  Box(4963, 4963),
+  Box(4964, 4964),
+  Box(4965, 4965),
+  Box(4966, 4966),
+  Box(4967, 4967),
+  Box(4968, 4968),
+  Box(4969, 4969),
+  Box(4970, 4970),
+  Box(4971, 4971),
+  Box(4972, 4972),
+  Box(4973, 4973),
+  Box(4974, 4974),
+  Box(4975, 4975),
+  Box(4976, 4976),
+  Box(4977, 4977),
+  Box(4978, 4978),
+  Box(4979, 4979),
+  Box(4980, 4980),
+  Box(4981, 4981),
+  Box(4982, 4982),
+  Box(4983, 4983),
+  Box(4984, 4984),
+  Box(4985, 4985),
+  Box(4986, 4986),
+  Box(4987, 4987),
+  Box(4988, 4988),
+  Box(4989, 4989),
+  Box(4990, 4990),
+  Box(4991, 4991),
+  Box(4992, 4992),
+  Box(4993, 4993),
+  Box(4994, 4994),
+  Box(4995, 4995),
+  Box(4996, 4996),
+  Box(4997, 4997),
+  Box(4998, 4998),
+  Box(4999, 4999),
+  Box(5000, 5000),
+  Box(5001, 5001),
+  Box(5002, 5002),
+  Box(5003, 5003),
+  Box(5004, 5004),
+  Box(5005, 5005),
+  Box(5006, 5006),
+  Box(5007, 5007),
+  Box(5008, 5008),
+  Box(5009, 5009),
+  Box(5010, 5010),
+  Box(5011, 5011),
+  Box(5012, 5012),
+  Box(5013, 5013),
+  Box(5014, 5014),
+  Box(5015, 5015),
+  Box(5016, 5016),
+  Box(5017, 5017),
+  Box(5018, 5018),
+  Box(5019, 5019),
+  Box(5020, 5020),
+  Box(5021, 5021),
+  Box(5022, 5022),
+  Box(5023, 5023),
+  Box(5024, 5024),
+  Box(5025, 5025),
+  Box(5026, 5026),
+  Box(5027, 5027),
+  Box(5028, 5028),
+  Box(5029, 5029),
+  Box(5030, 5030),
+  Box(5031, 5031),
+  Box(5032, 5032),
+  Box(5033, 5033),
+  Box(5034, 5034),
+  Box(5035, 5035),
+  Box(5036, 5036),
+  Box(5037, 5037),
+  Box(5038, 5038),
+  Box(5039, 5039),
+  Box(5040, 5040),
+  Box(5041, 5041),
+  Box(5042, 5042),
+  Box(5043, 5043),
+  Box(5044, 5044),
+  Box(5045, 5045),
+  Box(5046, 5046),
+  Box(5047, 5047),
+  Box(5048, 5048),
+  Box(5049, 5049),
+  Box(5050, 5050),
+  Box(5051, 5051),
+  Box(5052, 5052),
+  Box(5053, 5053),
+  Box(5054, 5054),
+  Box(5055, 5055),
+  Box(5056, 5056),
+  Box(5057, 5057),
+  Box(5058, 5058),
+  Box(5059, 5059),
+  Box(5060, 5060),
+  Box(5061, 5061),
+  Box(5062, 5062),
+  Box(5063, 5063),
+  Box(5064, 5064),
+  Box(5065, 5065),
+  Box(5066, 5066),
+  Box(5067, 5067),
+  Box(5068, 5068),
+  Box(5069, 5069),
+  Box(5070, 5070),
+  Box(5071, 5071),
+  Box(5072, 5072),
+  Box(5073, 5073),
+  Box(5074, 5074),
+  Box(5075, 5075),
+  Box(5076, 5076),
+  Box(5077, 5077),
+  Box(5078, 5078),
+  Box(5079, 5079),
+  Box(5080, 5080),
+  Box(5081, 5081),
+  Box(5082, 5082),
+  Box(5083, 5083),
+  Box(5084, 5084),
+  Box(5085, 5085),
+  Box(5086, 5086),
+  Box(5087, 5087),
+  Box(5088, 5088),
+  Box(5089, 5089),
+  Box(5090, 5090),
+  Box(5091, 5091),
+  Box(5092, 5092),
+  Box(5093, 5093),
+  Box(5094, 5094),
+  Box(5095, 5095),
+  Box(5096, 5096),
+  Box(5097, 5097),
+  Box(5098, 5098),
+  Box(5099, 5099),
+  Box(5100, 5100),
+  Box(5101, 5101),
+  Box(5102, 5102),
+  Box(5103, 5103),
+  Box(5104, 5104),
+  Box(5105, 5105),
+  Box(5106, 5106),
+  Box(5107, 5107),
+  Box(5108, 5108),
+  Box(5109, 5109),
+  Box(5110, 5110),
+  Box(5111, 5111),
+  Box(5112, 5112),
+  Box(5113, 5113),
+  Box(5114, 5114),
+  Box(5115, 5115),
+  Box(5116, 5116),
+  Box(5117, 5117),
+  Box(5118, 5118),
+  Box(5119, 5119),
+  Box(5120, 5120),
+  Box(5121, 5121),
+  Box(5122, 5122),
+  Box(5123, 5123),
+  Box(5124, 5124),
+  Box(5125, 5125),
+  Box(5126, 5126),
+  Box(5127, 5127),
+  Box(5128, 5128),
+  Box(5129, 5129),
+  Box(5130, 5130),
+  Box(5131, 5131),
+  Box(5132, 5132),
+  Box(5133, 5133),
+  Box(5134, 5134),
+  Box(5135, 5135),
+  Box(5136, 5136),
+  Box(5137, 5137),
+  Box(5138, 5138),
+  Box(5139, 5139),
+  Box(5140, 5140),
+  Box(5141, 5141),
+  Box(5142, 5142),
+  Box(5143, 5143),
+  Box(5144, 5144),
+  Box(5145, 5145),
+  Box(5146, 5146),
+  Box(5147, 5147),
+  Box(5148, 5148),
+  Box(5149, 5149),
+  Box(5150, 5150),
+  Box(5151, 5151),
+  Box(5152, 5152),
+  Box(5153, 5153),
+  Box(5154, 5154),
+  Box(5155, 5155),
+  Box(5156, 5156),
+  Box(5157, 5157),
+  Box(5158, 5158),
+  Box(5159, 5159),
+  Box(5160, 5160),
+  Box(5161, 5161),
+  Box(5162, 5162),
+  Box(5163, 5163),
+  Box(5164, 5164),
+  Box(5165, 5165),
+  Box(5166, 5166),
+  Box(5167, 5167),
+  Box(5168, 5168),
+  Box(5169, 5169),
+  Box(5170, 5170),
+  Box(5171, 5171),
+  Box(5172, 5172),
+  Box(5173, 5173),
+  Box(5174, 5174),
+  Box(5175, 5175),
+  Box(5176, 5176),
+  Box(5177, 5177),
+  Box(5178, 5178),
+  Box(5179, 5179),
+  Box(5180, 5180),
+  Box(5181, 5181),
+  Box(5182, 5182),
+  Box(5183, 5183),
+  Box(5184, 5184),
+  Box(5185, 5185),
+  Box(5186, 5186),
+  Box(5187, 5187),
+  Box(5188, 5188),
+  Box(5189, 5189),
+  Box(5190, 5190),
+  Box(5191, 5191),
+  Box(5192, 5192),
+  Box(5193, 5193),
+  Box(5194, 5194),
+  Box(5195, 5195),
+  Box(5196, 5196),
+  Box(5197, 5197),
+  Box(5198, 5198),
+  Box(5199, 5199),
+  Box(5200, 5200),
+  Box(5201, 5201),
+  Box(5202, 5202),
+  Box(5203, 5203),
+  Box(5204, 5204),
+  Box(5205, 5205),
+  Box(5206, 5206),
+  Box(5207, 5207),
+  Box(5208, 5208),
+  Box(5209, 5209),
+  Box(5210, 5210),
+  Box(5211, 5211),
+  Box(5212, 5212),
+  Box(5213, 5213),
+  Box(5214, 5214),
+  Box(5215, 5215),
+  Box(5216, 5216),
+  Box(5217, 5217),
+  Box(5218, 5218),
+  Box(5219, 5219),
+  Box(5220, 5220),
+  Box(5221, 5221),
+  Box(5222, 5222),
+  Box(5223, 5223),
+  Box(5224, 5224),
+  Box(5225, 5225),
+  Box(5226, 5226),
+  Box(5227, 5227),
+  Box(5228, 5228),
+  Box(5229, 5229),
+  Box(5230, 5230),
+  Box(5231, 5231),
+  Box(5232, 5232),
+  Box(5233, 5233),
+  Box(5234, 5234),
+  Box(5235, 5235),
+  Box(5236, 5236),
+  Box(5237, 5237),
+  Box(5238, 5238),
+  Box(5239, 5239),
+  Box(5240, 5240),
+  Box(5241, 5241),
+  Box(5242, 5242),
+  Box(5243, 5243),
+  Box(5244, 5244),
+  Box(5245, 5245),
+  Box(5246, 5246),
+  Box(5247, 5247),
+  Box(5248, 5248),
+  Box(5249, 5249),
+  Box(5250, 5250),
+  Box(5251, 5251),
+  Box(5252, 5252),
+  Box(5253, 5253),
+  Box(5254, 5254),
+  Box(5255, 5255),
+  Box(5256, 5256),
+  Box(5257, 5257),
+  Box(5258, 5258),
+  Box(5259, 5259),
+  Box(5260, 5260),
+  Box(5261, 5261),
+  Box(5262, 5262),
+  Box(5263, 5263),
+  Box(5264, 5264),
+  Box(5265, 5265),
+  Box(5266, 5266),
+  Box(5267, 5267),
+  Box(5268, 5268),
+  Box(5269, 5269),
+  Box(5270, 5270),
+  Box(5271, 5271),
+  Box(5272, 5272),
+  Box(5273, 5273),
+  Box(5274, 5274),
+  Box(5275, 5275),
+  Box(5276, 5276),
+  Box(5277, 5277),
+  Box(5278, 5278),
+  Box(5279, 5279),
+  Box(5280, 5280),
+  Box(5281, 5281),
+  Box(5282, 5282),
+  Box(5283, 5283),
+  Box(5284, 5284),
+  Box(5285, 5285),
+  Box(5286, 5286),
+  Box(5287, 5287),
+  Box(5288, 5288),
+  Box(5289, 5289),
+  Box(5290, 5290),
+  Box(5291, 5291),
+  Box(5292, 5292),
+  Box(5293, 5293),
+  Box(5294, 5294),
+  Box(5295, 5295),
+  Box(5296, 5296),
+  Box(5297, 5297),
+  Box(5298, 5298),
+  Box(5299, 5299),
+  Box(5300, 5300),
+  Box(5301, 5301),
+  Box(5302, 5302),
+  Box(5303, 5303),
+  Box(5304, 5304),
+  Box(5305, 5305),
+  Box(5306, 5306),
+  Box(5307, 5307),
+  Box(5308, 5308),
+  Box(5309, 5309),
+  Box(5310, 5310),
+  Box(5311, 5311),
+  Box(5312, 5312),
+  Box(5313, 5313),
+  Box(5314, 5314),
+  Box(5315, 5315),
+  Box(5316, 5316),
+  Box(5317, 5317),
+  Box(5318, 5318),
+  Box(5319, 5319),
+  Box(5320, 5320),
+  Box(5321, 5321),
+  Box(5322, 5322),
+  Box(5323, 5323),
+  Box(5324, 5324),
+  Box(5325, 5325),
+  Box(5326, 5326),
+  Box(5327, 5327),
+  Box(5328, 5328),
+  Box(5329, 5329),
+  Box(5330, 5330),
+  Box(5331, 5331),
+  Box(5332, 5332),
+  Box(5333, 5333),
+  Box(5334, 5334),
+  Box(5335, 5335),
+  Box(5336, 5336),
+  Box(5337, 5337),
+  Box(5338, 5338),
+  Box(5339, 5339),
+  Box(5340, 5340),
+  Box(5341, 5341),
+  Box(5342, 5342),
+  Box(5343, 5343),
+  Box(5344, 5344),
+  Box(5345, 5345),
+  Box(5346, 5346),
+  Box(5347, 5347),
+  Box(5348, 5348),
+  Box(5349, 5349),
+  Box(5350, 5350),
+  Box(5351, 5351),
+  Box(5352, 5352),
+  Box(5353, 5353),
+  Box(5354, 5354),
+  Box(5355, 5355),
+  Box(5356, 5356),
+  Box(5357, 5357),
+  Box(5358, 5358),
+  Box(5359, 5359),
+  Box(5360, 5360),
+  Box(5361, 5361),
+  Box(5362, 5362),
+  Box(5363, 5363),
+  Box(5364, 5364),
+  Box(5365, 5365),
+  Box(5366, 5366),
+  Box(5367, 5367),
+  Box(5368, 5368),
+  Box(5369, 5369),
+  Box(5370, 5370),
+  Box(5371, 5371),
+  Box(5372, 5372),
+  Box(5373, 5373),
+  Box(5374, 5374),
+  Box(5375, 5375),
+  Box(5376, 5376),
+  Box(5377, 5377),
+  Box(5378, 5378),
+  Box(5379, 5379),
+  Box(5380, 5380),
+  Box(5381, 5381),
+  Box(5382, 5382),
+  Box(5383, 5383),
+  Box(5384, 5384),
+  Box(5385, 5385),
+  Box(5386, 5386),
+  Box(5387, 5387),
+  Box(5388, 5388),
+  Box(5389, 5389),
+  Box(5390, 5390),
+  Box(5391, 5391),
+  Box(5392, 5392),
+  Box(5393, 5393),
+  Box(5394, 5394),
+  Box(5395, 5395),
+  Box(5396, 5396),
+  Box(5397, 5397),
+  Box(5398, 5398),
+  Box(5399, 5399),
+  Box(5400, 5400),
+  Box(5401, 5401),
+  Box(5402, 5402),
+  Box(5403, 5403),
+  Box(5404, 5404),
+  Box(5405, 5405),
+  Box(5406, 5406),
+  Box(5407, 5407),
+  Box(5408, 5408),
+  Box(5409, 5409),
+  Box(5410, 5410),
+  Box(5411, 5411),
+  Box(5412, 5412),
+  Box(5413, 5413),
+  Box(5414, 5414),
+  Box(5415, 5415),
+  Box(5416, 5416),
+  Box(5417, 5417),
+  Box(5418, 5418),
+  Box(5419, 5419),
+  Box(5420, 5420),
+  Box(5421, 5421),
+  Box(5422, 5422),
+  Box(5423, 5423),
+  Box(5424, 5424),
+  Box(5425, 5425),
+  Box(5426, 5426),
+  Box(5427, 5427),
+  Box(5428, 5428),
+  Box(5429, 5429),
+  Box(5430, 5430),
+  Box(5431, 5431),
+  Box(5432, 5432),
+  Box(5433, 5433),
+  Box(5434, 5434),
+  Box(5435, 5435),
+  Box(5436, 5436),
+  Box(5437, 5437),
+  Box(5438, 5438),
+  Box(5439, 5439),
+  Box(5440, 5440),
+  Box(5441, 5441),
+  Box(5442, 5442),
+  Box(5443, 5443),
+  Box(5444, 5444),
+  Box(5445, 5445),
+  Box(5446, 5446),
+  Box(5447, 5447),
+  Box(5448, 5448),
+  Box(5449, 5449),
+  Box(5450, 5450),
+  Box(5451, 5451),
+  Box(5452, 5452),
+  Box(5453, 5453),
+  Box(5454, 5454),
+  Box(5455, 5455),
+  Box(5456, 5456),
+  Box(5457, 5457),
+  Box(5458, 5458),
+  Box(5459, 5459),
+  Box(5460, 5460),
+  Box(5461, 5461),
+  Box(5462, 5462),
+  Box(5463, 5463),
+  Box(5464, 5464),
+  Box(5465, 5465),
+  Box(5466, 5466),
+  Box(5467, 5467),
+  Box(5468, 5468),
+  Box(5469, 5469),
+  Box(5470, 5470),
+  Box(5471, 5471),
+  Box(5472, 5472),
+  Box(5473, 5473),
+  Box(5474, 5474),
+  Box(5475, 5475),
+  Box(5476, 5476),
+  Box(5477, 5477),
+  Box(5478, 5478),
+  Box(5479, 5479),
+  Box(5480, 5480),
+  Box(5481, 5481),
+  Box(5482, 5482),
+  Box(5483, 5483),
+  Box(5484, 5484),
+  Box(5485, 5485),
+  Box(5486, 5486),
+  Box(5487, 5487),
+  Box(5488, 5488),
+  Box(5489, 5489),
+  Box(5490, 5490),
+  Box(5491, 5491),
+  Box(5492, 5492),
+  Box(5493, 5493),
+  Box(5494, 5494),
+  Box(5495, 5495),
+  Box(5496, 5496),
+  Box(5497, 5497),
+  Box(5498, 5498),
+  Box(5499, 5499),
+  Box(5500, 5500),
+  Box(5501, 5501),
+  Box(5502, 5502),
+  Box(5503, 5503),
+  Box(5504, 5504),
+  Box(5505, 5505),
+  Box(5506, 5506),
+  Box(5507, 5507),
+  Box(5508, 5508),
+  Box(5509, 5509),
+  Box(5510, 5510),
+  Box(5511, 5511),
+  Box(5512, 5512),
+  Box(5513, 5513),
+  Box(5514, 5514),
+  Box(5515, 5515),
+  Box(5516, 5516),
+  Box(5517, 5517),
+  Box(5518, 5518),
+  Box(5519, 5519),
+  Box(5520, 5520),
+  Box(5521, 5521),
+  Box(5522, 5522),
+  Box(5523, 5523),
+  Box(5524, 5524),
+  Box(5525, 5525),
+  Box(5526, 5526),
+  Box(5527, 5527),
+  Box(5528, 5528),
+  Box(5529, 5529),
+  Box(5530, 5530),
+  Box(5531, 5531),
+  Box(5532, 5532),
+  Box(5533, 5533),
+  Box(5534, 5534),
+  Box(5535, 5535),
+  Box(5536, 5536),
+  Box(5537, 5537),
+  Box(5538, 5538),
+  Box(5539, 5539),
+  Box(5540, 5540),
+  Box(5541, 5541),
+  Box(5542, 5542),
+  Box(5543, 5543),
+  Box(5544, 5544),
+  Box(5545, 5545),
+  Box(5546, 5546),
+  Box(5547, 5547),
+  Box(5548, 5548),
+  Box(5549, 5549),
+  Box(5550, 5550),
+  Box(5551, 5551),
+  Box(5552, 5552),
+  Box(5553, 5553),
+  Box(5554, 5554),
+  Box(5555, 5555),
+  Box(5556, 5556),
+  Box(5557, 5557),
+  Box(5558, 5558),
+  Box(5559, 5559),
+  Box(5560, 5560),
+  Box(5561, 5561),
+  Box(5562, 5562),
+  Box(5563, 5563),
+  Box(5564, 5564),
+  Box(5565, 5565),
+  Box(5566, 5566),
+  Box(5567, 5567),
+  Box(5568, 5568),
+  Box(5569, 5569),
+  Box(5570, 5570),
+  Box(5571, 5571),
+  Box(5572, 5572),
+  Box(5573, 5573),
+  Box(5574, 5574),
+  Box(5575, 5575),
+  Box(5576, 5576),
+  Box(5577, 5577),
+  Box(5578, 5578),
+  Box(5579, 5579),
+  Box(5580, 5580),
+  Box(5581, 5581),
+  Box(5582, 5582),
+  Box(5583, 5583),
+  Box(5584, 5584),
+  Box(5585, 5585),
+  Box(5586, 5586),
+  Box(5587, 5587),
+  Box(5588, 5588),
+  Box(5589, 5589),
+  Box(5590, 5590),
+  Box(5591, 5591),
+  Box(5592, 5592),
+  Box(5593, 5593),
+  Box(5594, 5594),
+  Box(5595, 5595),
+  Box(5596, 5596),
+  Box(5597, 5597),
+  Box(5598, 5598),
+  Box(5599, 5599),
+  Box(5600, 5600),
+  Box(5601, 5601),
+  Box(5602, 5602),
+  Box(5603, 5603),
+  Box(5604, 5604),
+  Box(5605, 5605),
+  Box(5606, 5606),
+  Box(5607, 5607),
+  Box(5608, 5608),
+  Box(5609, 5609),
+  Box(5610, 5610),
+  Box(5611, 5611),
+  Box(5612, 5612),
+  Box(5613, 5613),
+  Box(5614, 5614),
+  Box(5615, 5615),
+  Box(5616, 5616),
+  Box(5617, 5617),
+  Box(5618, 5618),
+  Box(5619, 5619),
+  Box(5620, 5620),
+  Box(5621, 5621),
+  Box(5622, 5622),
+  Box(5623, 5623),
+  Box(5624, 5624),
+  Box(5625, 5625),
+  Box(5626, 5626),
+  Box(5627, 5627),
+  Box(5628, 5628),
+  Box(5629, 5629),
+  Box(5630, 5630),
+  Box(5631, 5631),
+  Box(5632, 5632),
+  Box(5633, 5633),
+  Box(5634, 5634),
+  Box(5635, 5635),
+  Box(5636, 5636),
+  Box(5637, 5637),
+  Box(5638, 5638),
+  Box(5639, 5639),
+  Box(5640, 5640),
+  Box(5641, 5641),
+  Box(5642, 5642),
+  Box(5643, 5643),
+  Box(5644, 5644),
+  Box(5645, 5645),
+  Box(5646, 5646),
+  Box(5647, 5647),
+  Box(5648, 5648),
+  Box(5649, 5649),
+  Box(5650, 5650),
+  Box(5651, 5651),
+  Box(5652, 5652),
+  Box(5653, 5653),
+  Box(5654, 5654),
+  Box(5655, 5655),
+  Box(5656, 5656),
+  Box(5657, 5657),
+  Box(5658, 5658),
+  Box(5659, 5659),
+  Box(5660, 5660),
+  Box(5661, 5661),
+  Box(5662, 5662),
+  Box(5663, 5663),
+  Box(5664, 5664),
+  Box(5665, 5665),
+  Box(5666, 5666),
+  Box(5667, 5667),
+  Box(5668, 5668),
+  Box(5669, 5669),
+  Box(5670, 5670),
+  Box(5671, 5671),
+  Box(5672, 5672),
+  Box(5673, 5673),
+  Box(5674, 5674),
+  Box(5675, 5675),
+  Box(5676, 5676),
+  Box(5677, 5677),
+  Box(5678, 5678),
+  Box(5679, 5679),
+  Box(5680, 5680),
+  Box(5681, 5681),
+  Box(5682, 5682),
+  Box(5683, 5683),
+  Box(5684, 5684),
+  Box(5685, 5685),
+  Box(5686, 5686),
+  Box(5687, 5687),
+  Box(5688, 5688),
+  Box(5689, 5689),
+  Box(5690, 5690),
+  Box(5691, 5691),
+  Box(5692, 5692),
+  Box(5693, 5693),
+  Box(5694, 5694),
+  Box(5695, 5695),
+  Box(5696, 5696),
+  Box(5697, 5697),
+  Box(5698, 5698),
+  Box(5699, 5699),
+  Box(5700, 5700),
+  Box(5701, 5701),
+  Box(5702, 5702),
+  Box(5703, 5703),
+  Box(5704, 5704),
+  Box(5705, 5705),
+  Box(5706, 5706),
+  Box(5707, 5707),
+  Box(5708, 5708),
+  Box(5709, 5709),
+  Box(5710, 5710),
+  Box(5711, 5711),
+  Box(5712, 5712),
+  Box(5713, 5713),
+  Box(5714, 5714),
+  Box(5715, 5715),
+  Box(5716, 5716),
+  Box(5717, 5717),
+  Box(5718, 5718),
+  Box(5719, 5719),
+  Box(5720, 5720),
+  Box(5721, 5721),
+  Box(5722, 5722),
+  Box(5723, 5723),
+  Box(5724, 5724),
+  Box(5725, 5725),
+  Box(5726, 5726),
+  Box(5727, 5727),
+  Box(5728, 5728),
+  Box(5729, 5729),
+  Box(5730, 5730),
+  Box(5731, 5731),
+  Box(5732, 5732),
+  Box(5733, 5733),
+  Box(5734, 5734),
+  Box(5735, 5735),
+  Box(5736, 5736),
+  Box(5737, 5737),
+  Box(5738, 5738),
+  Box(5739, 5739),
+  Box(5740, 5740),
+  Box(5741, 5741),
+  Box(5742, 5742),
+  Box(5743, 5743),
+  Box(5744, 5744),
+  Box(5745, 5745),
+  Box(5746, 5746),
+  Box(5747, 5747),
+  Box(5748, 5748),
+  Box(5749, 5749),
+  Box(5750, 5750),
+  Box(5751, 5751),
+  Box(5752, 5752),
+  Box(5753, 5753),
+  Box(5754, 5754),
+  Box(5755, 5755),
+  Box(5756, 5756),
+  Box(5757, 5757),
+  Box(5758, 5758),
+  Box(5759, 5759),
+  Box(5760, 5760),
+  Box(5761, 5761),
+  Box(5762, 5762),
+  Box(5763, 5763),
+  Box(5764, 5764),
+  Box(5765, 5765),
+  Box(5766, 5766),
+  Box(5767, 5767),
+  Box(5768, 5768),
+  Box(5769, 5769),
+  Box(5770, 5770),
+  Box(5771, 5771),
+  Box(5772, 5772),
+  Box(5773, 5773),
+  Box(5774, 5774),
+  Box(5775, 5775),
+  Box(5776, 5776),
+  Box(5777, 5777),
+  Box(5778, 5778),
+  Box(5779, 5779),
+  Box(5780, 5780),
+  Box(5781, 5781),
+  Box(5782, 5782),
+  Box(5783, 5783),
+  Box(5784, 5784),
+  Box(5785, 5785),
+  Box(5786, 5786),
+  Box(5787, 5787),
+  Box(5788, 5788),
+  Box(5789, 5789),
+  Box(5790, 5790),
+  Box(5791, 5791),
+  Box(5792, 5792),
+  Box(5793, 5793),
+  Box(5794, 5794),
+  Box(5795, 5795),
+  Box(5796, 5796),
+  Box(5797, 5797),
+  Box(5798, 5798),
+  Box(5799, 5799),
+  Box(5800, 5800),
+  Box(5801, 5801),
+  Box(5802, 5802),
+  Box(5803, 5803),
+  Box(5804, 5804),
+  Box(5805, 5805),
+  Box(5806, 5806),
+  Box(5807, 5807),
+  Box(5808, 5808),
+  Box(5809, 5809),
+  Box(5810, 5810),
+  Box(5811, 5811),
+  Box(5812, 5812),
+  Box(5813, 5813),
+  Box(5814, 5814),
+  Box(5815, 5815),
+  Box(5816, 5816),
+  Box(5817, 5817),
+  Box(5818, 5818),
+  Box(5819, 5819),
+  Box(5820, 5820),
+  Box(5821, 5821),
+  Box(5822, 5822),
+  Box(5823, 5823),
+  Box(5824, 5824),
+  Box(5825, 5825),
+  Box(5826, 5826),
+  Box(5827, 5827),
+  Box(5828, 5828),
+  Box(5829, 5829),
+  Box(5830, 5830),
+  Box(5831, 5831),
+  Box(5832, 5832),
+  Box(5833, 5833),
+  Box(5834, 5834),
+  Box(5835, 5835),
+  Box(5836, 5836),
+  Box(5837, 5837),
+  Box(5838, 5838),
+  Box(5839, 5839),
+  Box(5840, 5840),
+  Box(5841, 5841),
+  Box(5842, 5842),
+  Box(5843, 5843),
+  Box(5844, 5844),
+  Box(5845, 5845),
+  Box(5846, 5846),
+  Box(5847, 5847),
+  Box(5848, 5848),
+  Box(5849, 5849),
+  Box(5850, 5850),
+  Box(5851, 5851),
+  Box(5852, 5852),
+  Box(5853, 5853),
+  Box(5854, 5854),
+  Box(5855, 5855),
+  Box(5856, 5856),
+  Box(5857, 5857),
+  Box(5858, 5858),
+  Box(5859, 5859),
+  Box(5860, 5860),
+  Box(5861, 5861),
+  Box(5862, 5862),
+  Box(5863, 5863),
+  Box(5864, 5864),
+  Box(5865, 5865),
+  Box(5866, 5866),
+  Box(5867, 5867),
+  Box(5868, 5868),
+  Box(5869, 5869),
+  Box(5870, 5870),
+  Box(5871, 5871),
+  Box(5872, 5872),
+  Box(5873, 5873),
+  Box(5874, 5874),
+  Box(5875, 5875),
+  Box(5876, 5876),
+  Box(5877, 5877),
+  Box(5878, 5878),
+  Box(5879, 5879),
+  Box(5880, 5880),
+  Box(5881, 5881),
+  Box(5882, 5882),
+  Box(5883, 5883),
+  Box(5884, 5884),
+  Box(5885, 5885),
+  Box(5886, 5886),
+  Box(5887, 5887),
+  Box(5888, 5888),
+  Box(5889, 5889),
+  Box(5890, 5890),
+  Box(5891, 5891),
+  Box(5892, 5892),
+  Box(5893, 5893),
+  Box(5894, 5894),
+  Box(5895, 5895),
+  Box(5896, 5896),
+  Box(5897, 5897),
+  Box(5898, 5898),
+  Box(5899, 5899),
+  Box(5900, 5900),
+  Box(5901, 5901),
+  Box(5902, 5902),
+  Box(5903, 5903),
+  Box(5904, 5904),
+  Box(5905, 5905),
+  Box(5906, 5906),
+  Box(5907, 5907),
+  Box(5908, 5908),
+  Box(5909, 5909),
+  Box(5910, 5910),
+  Box(5911, 5911),
+  Box(5912, 5912),
+  Box(5913, 5913),
+  Box(5914, 5914),
+  Box(5915, 5915),
+  Box(5916, 5916),
+  Box(5917, 5917),
+  Box(5918, 5918),
+  Box(5919, 5919),
+  Box(5920, 5920),
+  Box(5921, 5921),
+  Box(5922, 5922),
+  Box(5923, 5923),
+  Box(5924, 5924),
+  Box(5925, 5925),
+  Box(5926, 5926),
+  Box(5927, 5927),
+  Box(5928, 5928),
+  Box(5929, 5929),
+  Box(5930, 5930),
+  Box(5931, 5931),
+  Box(5932, 5932),
+  Box(5933, 5933),
+  Box(5934, 5934),
+  Box(5935, 5935),
+  Box(5936, 5936),
+  Box(5937, 5937),
+  Box(5938, 5938),
+  Box(5939, 5939),
+  Box(5940, 5940),
+  Box(5941, 5941),
+  Box(5942, 5942),
+  Box(5943, 5943),
+  Box(5944, 5944),
+  Box(5945, 5945),
+  Box(5946, 5946),
+  Box(5947, 5947),
+  Box(5948, 5948),
+  Box(5949, 5949),
+  Box(5950, 5950),
+  Box(5951, 5951),
+  Box(5952, 5952),
+  Box(5953, 5953),
+  Box(5954, 5954),
+  Box(5955, 5955),
+  Box(5956, 5956),
+  Box(5957, 5957),
+  Box(5958, 5958),
+  Box(5959, 5959),
+  Box(5960, 5960),
+  Box(5961, 5961),
+  Box(5962, 5962),
+  Box(5963, 5963),
+  Box(5964, 5964),
+  Box(5965, 5965),
+  Box(5966, 5966),
+  Box(5967, 5967),
+  Box(5968, 5968),
+  Box(5969, 5969),
+  Box(5970, 5970),
+  Box(5971, 5971),
+  Box(5972, 5972),
+  Box(5973, 5973),
+  Box(5974, 5974),
+  Box(5975, 5975),
+  Box(5976, 5976),
+  Box(5977, 5977),
+  Box(5978, 5978),
+  Box(5979, 5979),
+  Box(5980, 5980),
+  Box(5981, 5981),
+  Box(5982, 5982),
+  Box(5983, 5983),
+  Box(5984, 5984),
+  Box(5985, 5985),
+  Box(5986, 5986),
+  Box(5987, 5987),
+  Box(5988, 5988),
+  Box(5989, 5989),
+  Box(5990, 5990),
+  Box(5991, 5991),
+  Box(5992, 5992),
+  Box(5993, 5993),
+  Box(5994, 5994),
+  Box(5995, 5995),
+  Box(5996, 5996),
+  Box(5997, 5997),
+  Box(5998, 5998),
+  Box(5999, 5999),
+  Box(6000, 6000),
+  Box(6001, 6001),
+  Box(6002, 6002),
+  Box(6003, 6003),
+  Box(6004, 6004),
+  Box(6005, 6005),
+  Box(6006, 6006),
+  Box(6007, 6007),
+  Box(6008, 6008),
+  Box(6009, 6009),
+  Box(6010, 6010),
+  Box(6011, 6011),
+  Box(6012, 6012),
+  Box(6013, 6013),
+  Box(6014, 6014),
+  Box(6015, 6015),
+  Box(6016, 6016),
+  Box(6017, 6017),
+  Box(6018, 6018),
+  Box(6019, 6019),
+  Box(6020, 6020),
+  Box(6021, 6021),
+  Box(6022, 6022),
+  Box(6023, 6023),
+  Box(6024, 6024),
+  Box(6025, 6025),
+  Box(6026, 6026),
+  Box(6027, 6027),
+  Box(6028, 6028),
+  Box(6029, 6029),
+  Box(6030, 6030),
+  Box(6031, 6031),
+  Box(6032, 6032),
+  Box(6033, 6033),
+  Box(6034, 6034),
+  Box(6035, 6035),
+  Box(6036, 6036),
+  Box(6037, 6037),
+  Box(6038, 6038),
+  Box(6039, 6039),
+  Box(6040, 6040),
+  Box(6041, 6041),
+  Box(6042, 6042),
+  Box(6043, 6043),
+  Box(6044, 6044),
+  Box(6045, 6045),
+  Box(6046, 6046),
+  Box(6047, 6047),
+  Box(6048, 6048),
+  Box(6049, 6049),
+  Box(6050, 6050),
+  Box(6051, 6051),
+  Box(6052, 6052),
+  Box(6053, 6053),
+  Box(6054, 6054),
+  Box(6055, 6055),
+  Box(6056, 6056),
+  Box(6057, 6057),
+  Box(6058, 6058),
+  Box(6059, 6059),
+  Box(6060, 6060),
+  Box(6061, 6061),
+  Box(6062, 6062),
+  Box(6063, 6063),
+  Box(6064, 6064),
+  Box(6065, 6065),
+  Box(6066, 6066),
+  Box(6067, 6067),
+  Box(6068, 6068),
+  Box(6069, 6069),
+  Box(6070, 6070),
+  Box(6071, 6071),
+  Box(6072, 6072),
+  Box(6073, 6073),
+  Box(6074, 6074),
+  Box(6075, 6075),
+  Box(6076, 6076),
+  Box(6077, 6077),
+  Box(6078, 6078),
+  Box(6079, 6079),
+  Box(6080, 6080),
+  Box(6081, 6081),
+  Box(6082, 6082),
+  Box(6083, 6083),
+  Box(6084, 6084),
+  Box(6085, 6085),
+  Box(6086, 6086),
+  Box(6087, 6087),
+  Box(6088, 6088),
+  Box(6089, 6089),
+  Box(6090, 6090),
+  Box(6091, 6091),
+  Box(6092, 6092),
+  Box(6093, 6093),
+  Box(6094, 6094),
+  Box(6095, 6095),
+  Box(6096, 6096),
+  Box(6097, 6097),
+  Box(6098, 6098),
+  Box(6099, 6099),
+  Box(6100, 6100),
+  Box(6101, 6101),
+  Box(6102, 6102),
+  Box(6103, 6103),
+  Box(6104, 6104),
+  Box(6105, 6105),
+  Box(6106, 6106),
+  Box(6107, 6107),
+  Box(6108, 6108),
+  Box(6109, 6109),
+  Box(6110, 6110),
+  Box(6111, 6111),
+  Box(6112, 6112),
+  Box(6113, 6113),
+  Box(6114, 6114),
+  Box(6115, 6115),
+  Box(6116, 6116),
+  Box(6117, 6117),
+  Box(6118, 6118),
+  Box(6119, 6119),
+  Box(6120, 6120),
+  Box(6121, 6121),
+  Box(6122, 6122),
+  Box(6123, 6123),
+  Box(6124, 6124),
+  Box(6125, 6125),
+  Box(6126, 6126),
+  Box(6127, 6127),
+  Box(6128, 6128),
+  Box(6129, 6129),
+  Box(6130, 6130),
+  Box(6131, 6131),
+  Box(6132, 6132),
+  Box(6133, 6133),
+  Box(6134, 6134),
+  Box(6135, 6135),
+  Box(6136, 6136),
+  Box(6137, 6137),
+  Box(6138, 6138),
+  Box(6139, 6139),
+  Box(6140, 6140),
+  Box(6141, 6141),
+  Box(6142, 6142),
+  Box(6143, 6143),
+  Box(6144, 6144),
+  Box(6145, 6145),
+  Box(6146, 6146),
+  Box(6147, 6147),
+  Box(6148, 6148),
+  Box(6149, 6149),
+  Box(6150, 6150),
+  Box(6151, 6151),
+  Box(6152, 6152),
+  Box(6153, 6153),
+  Box(6154, 6154),
+  Box(6155, 6155),
+  Box(6156, 6156),
+  Box(6157, 6157),
+  Box(6158, 6158),
+  Box(6159, 6159),
+  Box(6160, 6160),
+  Box(6161, 6161),
+  Box(6162, 6162),
+  Box(6163, 6163),
+  Box(6164, 6164),
+  Box(6165, 6165),
+  Box(6166, 6166),
+  Box(6167, 6167),
+  Box(6168, 6168),
+  Box(6169, 6169),
+  Box(6170, 6170),
+  Box(6171, 6171),
+  Box(6172, 6172),
+  Box(6173, 6173),
+  Box(6174, 6174),
+  Box(6175, 6175),
+  Box(6176, 6176),
+  Box(6177, 6177),
+  Box(6178, 6178),
+  Box(6179, 6179),
+  Box(6180, 6180),
+  Box(6181, 6181),
+  Box(6182, 6182),
+  Box(6183, 6183),
+  Box(6184, 6184),
+  Box(6185, 6185),
+  Box(6186, 6186),
+  Box(6187, 6187),
+  Box(6188, 6188),
+  Box(6189, 6189),
+  Box(6190, 6190),
+  Box(6191, 6191),
+  Box(6192, 6192),
+  Box(6193, 6193),
+  Box(6194, 6194),
+  Box(6195, 6195),
+  Box(6196, 6196),
+  Box(6197, 6197),
+  Box(6198, 6198),
+  Box(6199, 6199),
+  Box(6200, 6200),
+  Box(6201, 6201),
+  Box(6202, 6202),
+  Box(6203, 6203),
+  Box(6204, 6204),
+  Box(6205, 6205),
+  Box(6206, 6206),
+  Box(6207, 6207),
+  Box(6208, 6208),
+  Box(6209, 6209),
+  Box(6210, 6210),
+  Box(6211, 6211),
+  Box(6212, 6212),
+  Box(6213, 6213),
+  Box(6214, 6214),
+  Box(6215, 6215),
+  Box(6216, 6216),
+  Box(6217, 6217),
+  Box(6218, 6218),
+  Box(6219, 6219),
+  Box(6220, 6220),
+  Box(6221, 6221),
+  Box(6222, 6222),
+  Box(6223, 6223),
+  Box(6224, 6224),
+  Box(6225, 6225),
+  Box(6226, 6226),
+  Box(6227, 6227),
+  Box(6228, 6228),
+  Box(6229, 6229),
+  Box(6230, 6230),
+  Box(6231, 6231),
+  Box(6232, 6232),
+  Box(6233, 6233),
+  Box(6234, 6234),
+  Box(6235, 6235),
+  Box(6236, 6236),
+  Box(6237, 6237),
+  Box(6238, 6238),
+  Box(6239, 6239),
+  Box(6240, 6240),
+  Box(6241, 6241),
+  Box(6242, 6242),
+  Box(6243, 6243),
+  Box(6244, 6244),
+  Box(6245, 6245),
+  Box(6246, 6246),
+  Box(6247, 6247),
+  Box(6248, 6248),
+  Box(6249, 6249),
+  Box(6250, 6250),
+  Box(6251, 6251),
+  Box(6252, 6252),
+  Box(6253, 6253),
+  Box(6254, 6254),
+  Box(6255, 6255),
+  Box(6256, 6256),
+  Box(6257, 6257),
+  Box(6258, 6258),
+  Box(6259, 6259),
+  Box(6260, 6260),
+  Box(6261, 6261),
+  Box(6262, 6262),
+  Box(6263, 6263),
+  Box(6264, 6264),
+  Box(6265, 6265),
+  Box(6266, 6266),
+  Box(6267, 6267),
+  Box(6268, 6268),
+  Box(6269, 6269),
+  Box(6270, 6270),
+  Box(6271, 6271),
+  Box(6272, 6272),
+  Box(6273, 6273),
+  Box(6274, 6274),
+  Box(6275, 6275),
+  Box(6276, 6276),
+  Box(6277, 6277),
+  Box(6278, 6278),
+  Box(6279, 6279),
+  Box(6280, 6280),
+  Box(6281, 6281),
+  Box(6282, 6282),
+  Box(6283, 6283),
+  Box(6284, 6284),
+  Box(6285, 6285),
+  Box(6286, 6286),
+  Box(6287, 6287),
+  Box(6288, 6288),
+  Box(6289, 6289),
+  Box(6290, 6290),
+  Box(6291, 6291),
+  Box(6292, 6292),
+  Box(6293, 6293),
+  Box(6294, 6294),
+  Box(6295, 6295),
+  Box(6296, 6296),
+  Box(6297, 6297),
+  Box(6298, 6298),
+  Box(6299, 6299),
+  Box(6300, 6300),
+  Box(6301, 6301),
+  Box(6302, 6302),
+  Box(6303, 6303),
+  Box(6304, 6304),
+  Box(6305, 6305),
+  Box(6306, 6306),
+  Box(6307, 6307),
+  Box(6308, 6308),
+  Box(6309, 6309),
+  Box(6310, 6310),
+  Box(6311, 6311),
+  Box(6312, 6312),
+  Box(6313, 6313),
+  Box(6314, 6314),
+  Box(6315, 6315),
+  Box(6316, 6316),
+  Box(6317, 6317),
+  Box(6318, 6318),
+  Box(6319, 6319),
+  Box(6320, 6320),
+  Box(6321, 6321),
+  Box(6322, 6322),
+  Box(6323, 6323),
+  Box(6324, 6324),
+  Box(6325, 6325),
+  Box(6326, 6326),
+  Box(6327, 6327),
+  Box(6328, 6328),
+  Box(6329, 6329),
+  Box(6330, 6330),
+  Box(6331, 6331),
+  Box(6332, 6332),
+  Box(6333, 6333),
+  Box(6334, 6334),
+  Box(6335, 6335),
+  Box(6336, 6336),
+  Box(6337, 6337),
+  Box(6338, 6338),
+  Box(6339, 6339),
+  Box(6340, 6340),
+  Box(6341, 6341),
+  Box(6342, 6342),
+  Box(6343, 6343),
+  Box(6344, 6344),
+  Box(6345, 6345),
+  Box(6346, 6346),
+  Box(6347, 6347),
+  Box(6348, 6348),
+  Box(6349, 6349),
+  Box(6350, 6350),
+  Box(6351, 6351),
+  Box(6352, 6352),
+  Box(6353, 6353),
+  Box(6354, 6354),
+  Box(6355, 6355),
+  Box(6356, 6356),
+  Box(6357, 6357),
+  Box(6358, 6358),
+  Box(6359, 6359),
+  Box(6360, 6360),
+  Box(6361, 6361),
+  Box(6362, 6362),
+  Box(6363, 6363),
+  Box(6364, 6364),
+  Box(6365, 6365),
+  Box(6366, 6366),
+  Box(6367, 6367),
+  Box(6368, 6368),
+  Box(6369, 6369),
+  Box(6370, 6370),
+  Box(6371, 6371),
+  Box(6372, 6372),
+  Box(6373, 6373),
+  Box(6374, 6374),
+  Box(6375, 6375),
+  Box(6376, 6376),
+  Box(6377, 6377),
+  Box(6378, 6378),
+  Box(6379, 6379),
+  Box(6380, 6380),
+  Box(6381, 6381),
+  Box(6382, 6382),
+  Box(6383, 6383),
+  Box(6384, 6384),
+  Box(6385, 6385),
+  Box(6386, 6386),
+  Box(6387, 6387),
+  Box(6388, 6388),
+  Box(6389, 6389),
+  Box(6390, 6390),
+  Box(6391, 6391),
+  Box(6392, 6392),
+  Box(6393, 6393),
+  Box(6394, 6394),
+  Box(6395, 6395),
+  Box(6396, 6396),
+  Box(6397, 6397),
+  Box(6398, 6398),
+  Box(6399, 6399),
+  Box(6400, 6400),
+  Box(6401, 6401),
+  Box(6402, 6402),
+  Box(6403, 6403),
+  Box(6404, 6404),
+  Box(6405, 6405),
+  Box(6406, 6406),
+  Box(6407, 6407),
+  Box(6408, 6408),
+  Box(6409, 6409),
+  Box(6410, 6410),
+  Box(6411, 6411),
+  Box(6412, 6412),
+  Box(6413, 6413),
+  Box(6414, 6414),
+  Box(6415, 6415),
+  Box(6416, 6416),
+  Box(6417, 6417),
+  Box(6418, 6418),
+  Box(6419, 6419),
+  Box(6420, 6420),
+  Box(6421, 6421),
+  Box(6422, 6422),
+  Box(6423, 6423),
+  Box(6424, 6424),
+  Box(6425, 6425),
+  Box(6426, 6426),
+  Box(6427, 6427),
+  Box(6428, 6428),
+  Box(6429, 6429),
+  Box(6430, 6430),
+  Box(6431, 6431),
+  Box(6432, 6432),
+  Box(6433, 6433),
+  Box(6434, 6434),
+  Box(6435, 6435),
+  Box(6436, 6436),
+  Box(6437, 6437),
+  Box(6438, 6438),
+  Box(6439, 6439),
+  Box(6440, 6440),
+  Box(6441, 6441),
+  Box(6442, 6442),
+  Box(6443, 6443),
+  Box(6444, 6444),
+  Box(6445, 6445),
+  Box(6446, 6446),
+  Box(6447, 6447),
+  Box(6448, 6448),
+  Box(6449, 6449),
+  Box(6450, 6450),
+  Box(6451, 6451),
+  Box(6452, 6452),
+  Box(6453, 6453),
+  Box(6454, 6454),
+  Box(6455, 6455),
+  Box(6456, 6456),
+  Box(6457, 6457),
+  Box(6458, 6458),
+  Box(6459, 6459),
+  Box(6460, 6460),
+  Box(6461, 6461),
+  Box(6462, 6462),
+  Box(6463, 6463),
+  Box(6464, 6464),
+  Box(6465, 6465),
+  Box(6466, 6466),
+  Box(6467, 6467),
+  Box(6468, 6468),
+  Box(6469, 6469),
+  Box(6470, 6470),
+  Box(6471, 6471),
+  Box(6472, 6472),
+  Box(6473, 6473),
+  Box(6474, 6474),
+  Box(6475, 6475),
+  Box(6476, 6476),
+  Box(6477, 6477),
+  Box(6478, 6478),
+  Box(6479, 6479),
+  Box(6480, 6480),
+  Box(6481, 6481),
+  Box(6482, 6482),
+  Box(6483, 6483),
+  Box(6484, 6484),
+  Box(6485, 6485),
+  Box(6486, 6486),
+  Box(6487, 6487),
+  Box(6488, 6488),
+  Box(6489, 6489),
+  Box(6490, 6490),
+  Box(6491, 6491),
+  Box(6492, 6492),
+  Box(6493, 6493),
+  Box(6494, 6494),
+  Box(6495, 6495),
+  Box(6496, 6496),
+  Box(6497, 6497),
+  Box(6498, 6498),
+  Box(6499, 6499),
+  Box(6500, 6500),
+  Box(6501, 6501),
+  Box(6502, 6502),
+  Box(6503, 6503),
+  Box(6504, 6504),
+  Box(6505, 6505),
+  Box(6506, 6506),
+  Box(6507, 6507),
+  Box(6508, 6508),
+  Box(6509, 6509),
+  Box(6510, 6510),
+  Box(6511, 6511),
+  Box(6512, 6512),
+  Box(6513, 6513),
+  Box(6514, 6514),
+  Box(6515, 6515),
+  Box(6516, 6516),
+  Box(6517, 6517),
+  Box(6518, 6518),
+  Box(6519, 6519),
+  Box(6520, 6520),
+  Box(6521, 6521),
+  Box(6522, 6522),
+  Box(6523, 6523),
+  Box(6524, 6524),
+  Box(6525, 6525),
+  Box(6526, 6526),
+  Box(6527, 6527),
+  Box(6528, 6528),
+  Box(6529, 6529),
+  Box(6530, 6530),
+  Box(6531, 6531),
+  Box(6532, 6532),
+  Box(6533, 6533),
+  Box(6534, 6534),
+  Box(6535, 6535),
+  Box(6536, 6536),
+  Box(6537, 6537),
+  Box(6538, 6538),
+  Box(6539, 6539),
+  Box(6540, 6540),
+  Box(6541, 6541),
+  Box(6542, 6542),
+  Box(6543, 6543),
+  Box(6544, 6544),
+  Box(6545, 6545),
+  Box(6546, 6546),
+  Box(6547, 6547),
+  Box(6548, 6548),
+  Box(6549, 6549),
+  Box(6550, 6550),
+  Box(6551, 6551),
+  Box(6552, 6552),
+  Box(6553, 6553),
+  Box(6554, 6554),
+  Box(6555, 6555),
+  Box(6556, 6556),
+  Box(6557, 6557),
+  Box(6558, 6558),
+  Box(6559, 6559),
+  Box(6560, 6560),
+  Box(6561, 6561),
+  Box(6562, 6562),
+  Box(6563, 6563),
+  Box(6564, 6564),
+  Box(6565, 6565),
+  Box(6566, 6566),
+  Box(6567, 6567),
+  Box(6568, 6568),
+  Box(6569, 6569),
+  Box(6570, 6570),
+  Box(6571, 6571),
+  Box(6572, 6572),
+  Box(6573, 6573),
+  Box(6574, 6574),
+  Box(6575, 6575),
+  Box(6576, 6576),
+  Box(6577, 6577),
+  Box(6578, 6578),
+  Box(6579, 6579),
+  Box(6580, 6580),
+  Box(6581, 6581),
+  Box(6582, 6582),
+  Box(6583, 6583),
+  Box(6584, 6584),
+  Box(6585, 6585),
+  Box(6586, 6586),
+  Box(6587, 6587),
+  Box(6588, 6588),
+  Box(6589, 6589),
+  Box(6590, 6590),
+  Box(6591, 6591),
+  Box(6592, 6592),
+  Box(6593, 6593),
+  Box(6594, 6594),
+  Box(6595, 6595),
+  Box(6596, 6596),
+  Box(6597, 6597),
+  Box(6598, 6598),
+  Box(6599, 6599),
+  Box(6600, 6600),
+  Box(6601, 6601),
+  Box(6602, 6602),
+  Box(6603, 6603),
+  Box(6604, 6604),
+  Box(6605, 6605),
+  Box(6606, 6606),
+  Box(6607, 6607),
+  Box(6608, 6608),
+  Box(6609, 6609),
+  Box(6610, 6610),
+  Box(6611, 6611),
+  Box(6612, 6612),
+  Box(6613, 6613),
+  Box(6614, 6614),
+  Box(6615, 6615),
+  Box(6616, 6616),
+  Box(6617, 6617),
+  Box(6618, 6618),
+  Box(6619, 6619),
+  Box(6620, 6620),
+  Box(6621, 6621),
+  Box(6622, 6622),
+  Box(6623, 6623),
+  Box(6624, 6624),
+  Box(6625, 6625),
+  Box(6626, 6626),
+  Box(6627, 6627),
+  Box(6628, 6628),
+  Box(6629, 6629),
+  Box(6630, 6630),
+  Box(6631, 6631),
+  Box(6632, 6632),
+  Box(6633, 6633),
+  Box(6634, 6634),
+  Box(6635, 6635),
+  Box(6636, 6636),
+  Box(6637, 6637),
+  Box(6638, 6638),
+  Box(6639, 6639),
+  Box(6640, 6640),
+  Box(6641, 6641),
+  Box(6642, 6642),
+  Box(6643, 6643),
+  Box(6644, 6644),
+  Box(6645, 6645),
+  Box(6646, 6646),
+  Box(6647, 6647),
+  Box(6648, 6648),
+  Box(6649, 6649),
+  Box(6650, 6650),
+  Box(6651, 6651),
+  Box(6652, 6652),
+  Box(6653, 6653),
+  Box(6654, 6654),
+  Box(6655, 6655),
+  Box(6656, 6656),
+  Box(6657, 6657),
+  Box(6658, 6658),
+  Box(6659, 6659),
+  Box(6660, 6660),
+  Box(6661, 6661),
+  Box(6662, 6662),
+  Box(6663, 6663),
+  Box(6664, 6664),
+  Box(6665, 6665),
+  Box(6666, 6666),
+  Box(6667, 6667),
+  Box(6668, 6668),
+  Box(6669, 6669),
+  Box(6670, 6670),
+  Box(6671, 6671),
+  Box(6672, 6672),
+  Box(6673, 6673),
+  Box(6674, 6674),
+  Box(6675, 6675),
+  Box(6676, 6676),
+  Box(6677, 6677),
+  Box(6678, 6678),
+  Box(6679, 6679),
+  Box(6680, 6680),
+  Box(6681, 6681),
+  Box(6682, 6682),
+  Box(6683, 6683),
+  Box(6684, 6684),
+  Box(6685, 6685),
+  Box(6686, 6686),
+  Box(6687, 6687),
+  Box(6688, 6688),
+  Box(6689, 6689),
+  Box(6690, 6690),
+  Box(6691, 6691),
+  Box(6692, 6692),
+  Box(6693, 6693),
+  Box(6694, 6694),
+  Box(6695, 6695),
+  Box(6696, 6696),
+  Box(6697, 6697),
+  Box(6698, 6698),
+  Box(6699, 6699),
+  Box(6700, 6700),
+  Box(6701, 6701),
+  Box(6702, 6702),
+  Box(6703, 6703),
+  Box(6704, 6704),
+  Box(6705, 6705),
+  Box(6706, 6706),
+  Box(6707, 6707),
+  Box(6708, 6708),
+  Box(6709, 6709),
+  Box(6710, 6710),
+  Box(6711, 6711),
+  Box(6712, 6712),
+  Box(6713, 6713),
+  Box(6714, 6714),
+  Box(6715, 6715),
+  Box(6716, 6716),
+  Box(6717, 6717),
+  Box(6718, 6718),
+  Box(6719, 6719),
+  Box(6720, 6720),
+  Box(6721, 6721),
+  Box(6722, 6722),
+  Box(6723, 6723),
+  Box(6724, 6724),
+  Box(6725, 6725),
+  Box(6726, 6726),
+  Box(6727, 6727),
+  Box(6728, 6728),
+  Box(6729, 6729),
+  Box(6730, 6730),
+  Box(6731, 6731),
+  Box(6732, 6732),
+  Box(6733, 6733),
+  Box(6734, 6734),
+  Box(6735, 6735),
+  Box(6736, 6736),
+  Box(6737, 6737),
+  Box(6738, 6738),
+  Box(6739, 6739),
+  Box(6740, 6740),
+  Box(6741, 6741),
+  Box(6742, 6742),
+  Box(6743, 6743),
+  Box(6744, 6744),
+  Box(6745, 6745),
+  Box(6746, 6746),
+  Box(6747, 6747),
+  Box(6748, 6748),
+  Box(6749, 6749),
+  Box(6750, 6750),
+  Box(6751, 6751),
+  Box(6752, 6752),
+  Box(6753, 6753),
+  Box(6754, 6754),
+  Box(6755, 6755),
+  Box(6756, 6756),
+  Box(6757, 6757),
+  Box(6758, 6758),
+  Box(6759, 6759),
+  Box(6760, 6760),
+  Box(6761, 6761),
+  Box(6762, 6762),
+  Box(6763, 6763),
+  Box(6764, 6764),
+  Box(6765, 6765),
+  Box(6766, 6766),
+  Box(6767, 6767),
+  Box(6768, 6768),
+  Box(6769, 6769),
+  Box(6770, 6770),
+  Box(6771, 6771),
+  Box(6772, 6772),
+  Box(6773, 6773),
+  Box(6774, 6774),
+  Box(6775, 6775),
+  Box(6776, 6776),
+  Box(6777, 6777),
+  Box(6778, 6778),
+  Box(6779, 6779),
+  Box(6780, 6780),
+  Box(6781, 6781),
+  Box(6782, 6782),
+  Box(6783, 6783),
+  Box(6784, 6784),
+  Box(6785, 6785),
+  Box(6786, 6786),
+  Box(6787, 6787),
+  Box(6788, 6788),
+  Box(6789, 6789),
+  Box(6790, 6790),
+  Box(6791, 6791),
+  Box(6792, 6792),
+  Box(6793, 6793),
+  Box(6794, 6794),
+  Box(6795, 6795),
+  Box(6796, 6796),
+  Box(6797, 6797),
+  Box(6798, 6798),
+  Box(6799, 6799),
+  Box(6800, 6800),
+  Box(6801, 6801),
+  Box(6802, 6802),
+  Box(6803, 6803),
+  Box(6804, 6804),
+  Box(6805, 6805),
+  Box(6806, 6806),
+  Box(6807, 6807),
+  Box(6808, 6808),
+  Box(6809, 6809),
+  Box(6810, 6810),
+  Box(6811, 6811),
+  Box(6812, 6812),
+  Box(6813, 6813),
+  Box(6814, 6814),
+  Box(6815, 6815),
+  Box(6816, 6816),
+  Box(6817, 6817),
+  Box(6818, 6818),
+  Box(6819, 6819),
+  Box(6820, 6820),
+  Box(6821, 6821),
+  Box(6822, 6822),
+  Box(6823, 6823),
+  Box(6824, 6824),
+  Box(6825, 6825),
+  Box(6826, 6826),
+  Box(6827, 6827),
+  Box(6828, 6828),
+  Box(6829, 6829),
+  Box(6830, 6830),
+  Box(6831, 6831),
+  Box(6832, 6832),
+  Box(6833, 6833),
+  Box(6834, 6834),
+  Box(6835, 6835),
+  Box(6836, 6836),
+  Box(6837, 6837),
+  Box(6838, 6838),
+  Box(6839, 6839),
+  Box(6840, 6840),
+  Box(6841, 6841),
+  Box(6842, 6842),
+  Box(6843, 6843),
+  Box(6844, 6844),
+  Box(6845, 6845),
+  Box(6846, 6846),
+  Box(6847, 6847),
+  Box(6848, 6848),
+  Box(6849, 6849),
+  Box(6850, 6850),
+  Box(6851, 6851),
+  Box(6852, 6852),
+  Box(6853, 6853),
+  Box(6854, 6854),
+  Box(6855, 6855),
+  Box(6856, 6856),
+  Box(6857, 6857),
+  Box(6858, 6858),
+  Box(6859, 6859),
+  Box(6860, 6860),
+  Box(6861, 6861),
+  Box(6862, 6862),
+  Box(6863, 6863),
+  Box(6864, 6864),
+  Box(6865, 6865),
+  Box(6866, 6866),
+  Box(6867, 6867),
+  Box(6868, 6868),
+  Box(6869, 6869),
+  Box(6870, 6870),
+  Box(6871, 6871),
+  Box(6872, 6872),
+  Box(6873, 6873),
+  Box(6874, 6874),
+  Box(6875, 6875),
+  Box(6876, 6876),
+  Box(6877, 6877),
+  Box(6878, 6878),
+  Box(6879, 6879),
+  Box(6880, 6880),
+  Box(6881, 6881),
+  Box(6882, 6882),
+  Box(6883, 6883),
+  Box(6884, 6884),
+  Box(6885, 6885),
+  Box(6886, 6886),
+  Box(6887, 6887),
+  Box(6888, 6888),
+  Box(6889, 6889),
+  Box(6890, 6890),
+  Box(6891, 6891),
+  Box(6892, 6892),
+  Box(6893, 6893),
+  Box(6894, 6894),
+  Box(6895, 6895),
+  Box(6896, 6896),
+  Box(6897, 6897),
+  Box(6898, 6898),
+  Box(6899, 6899),
+  Box(6900, 6900),
+  Box(6901, 6901),
+  Box(6902, 6902),
+  Box(6903, 6903),
+  Box(6904, 6904),
+  Box(6905, 6905),
+  Box(6906, 6906),
+  Box(6907, 6907),
+  Box(6908, 6908),
+  Box(6909, 6909),
+  Box(6910, 6910),
+  Box(6911, 6911),
+  Box(6912, 6912),
+  Box(6913, 6913),
+  Box(6914, 6914),
+  Box(6915, 6915),
+  Box(6916, 6916),
+  Box(6917, 6917),
+  Box(6918, 6918),
+  Box(6919, 6919),
+  Box(6920, 6920),
+  Box(6921, 6921),
+  Box(6922, 6922),
+  Box(6923, 6923),
+  Box(6924, 6924),
+  Box(6925, 6925),
+  Box(6926, 6926),
+  Box(6927, 6927),
+  Box(6928, 6928),
+  Box(6929, 6929),
+  Box(6930, 6930),
+  Box(6931, 6931),
+  Box(6932, 6932),
+  Box(6933, 6933),
+  Box(6934, 6934),
+  Box(6935, 6935),
+  Box(6936, 6936),
+  Box(6937, 6937),
+  Box(6938, 6938),
+  Box(6939, 6939),
+  Box(6940, 6940),
+  Box(6941, 6941),
+  Box(6942, 6942),
+  Box(6943, 6943),
+  Box(6944, 6944),
+  Box(6945, 6945),
+  Box(6946, 6946),
+  Box(6947, 6947),
+  Box(6948, 6948),
+  Box(6949, 6949),
+  Box(6950, 6950),
+  Box(6951, 6951),
+  Box(6952, 6952),
+  Box(6953, 6953),
+  Box(6954, 6954),
+  Box(6955, 6955),
+  Box(6956, 6956),
+  Box(6957, 6957),
+  Box(6958, 6958),
+  Box(6959, 6959),
+  Box(6960, 6960),
+  Box(6961, 6961),
+  Box(6962, 6962),
+  Box(6963, 6963),
+  Box(6964, 6964),
+  Box(6965, 6965),
+  Box(6966, 6966),
+  Box(6967, 6967),
+  Box(6968, 6968),
+  Box(6969, 6969),
+  Box(6970, 6970),
+  Box(6971, 6971),
+  Box(6972, 6972),
+  Box(6973, 6973),
+  Box(6974, 6974),
+  Box(6975, 6975),
+  Box(6976, 6976),
+  Box(6977, 6977),
+  Box(6978, 6978),
+  Box(6979, 6979),
+  Box(6980, 6980),
+  Box(6981, 6981),
+  Box(6982, 6982),
+  Box(6983, 6983),
+  Box(6984, 6984),
+  Box(6985, 6985),
+  Box(6986, 6986),
+  Box(6987, 6987),
+  Box(6988, 6988),
+  Box(6989, 6989),
+  Box(6990, 6990),
+  Box(6991, 6991),
+  Box(6992, 6992),
+  Box(6993, 6993),
+  Box(6994, 6994),
+  Box(6995, 6995),
+  Box(6996, 6996),
+  Box(6997, 6997),
+  Box(6998, 6998),
+  Box(6999, 6999),
+  Box(7000, 7000),
+  Box(7001, 7001),
+  Box(7002, 7002),
+  Box(7003, 7003),
+  Box(7004, 7004),
+  Box(7005, 7005),
+  Box(7006, 7006),
+  Box(7007, 7007),
+  Box(7008, 7008),
+  Box(7009, 7009),
+  Box(7010, 7010),
+  Box(7011, 7011),
+  Box(7012, 7012),
+  Box(7013, 7013),
+  Box(7014, 7014),
+  Box(7015, 7015),
+  Box(7016, 7016),
+  Box(7017, 7017),
+  Box(7018, 7018),
+  Box(7019, 7019),
+  Box(7020, 7020),
+  Box(7021, 7021),
+  Box(7022, 7022),
+  Box(7023, 7023),
+  Box(7024, 7024),
+  Box(7025, 7025),
+  Box(7026, 7026),
+  Box(7027, 7027),
+  Box(7028, 7028),
+  Box(7029, 7029),
+  Box(7030, 7030),
+  Box(7031, 7031),
+  Box(7032, 7032),
+  Box(7033, 7033),
+  Box(7034, 7034),
+  Box(7035, 7035),
+  Box(7036, 7036),
+  Box(7037, 7037),
+  Box(7038, 7038),
+  Box(7039, 7039),
+  Box(7040, 7040),
+  Box(7041, 7041),
+  Box(7042, 7042),
+  Box(7043, 7043),
+  Box(7044, 7044),
+  Box(7045, 7045),
+  Box(7046, 7046),
+  Box(7047, 7047),
+  Box(7048, 7048),
+  Box(7049, 7049),
+  Box(7050, 7050),
+  Box(7051, 7051),
+  Box(7052, 7052),
+  Box(7053, 7053),
+  Box(7054, 7054),
+  Box(7055, 7055),
+  Box(7056, 7056),
+  Box(7057, 7057),
+  Box(7058, 7058),
+  Box(7059, 7059),
+  Box(7060, 7060),
+  Box(7061, 7061),
+  Box(7062, 7062),
+  Box(7063, 7063),
+  Box(7064, 7064),
+  Box(7065, 7065),
+  Box(7066, 7066),
+  Box(7067, 7067),
+  Box(7068, 7068),
+  Box(7069, 7069),
+  Box(7070, 7070),
+  Box(7071, 7071),
+  Box(7072, 7072),
+  Box(7073, 7073),
+  Box(7074, 7074),
+  Box(7075, 7075),
+  Box(7076, 7076),
+  Box(7077, 7077),
+  Box(7078, 7078),
+  Box(7079, 7079),
+  Box(7080, 7080),
+  Box(7081, 7081),
+  Box(7082, 7082),
+  Box(7083, 7083),
+  Box(7084, 7084),
+  Box(7085, 7085),
+  Box(7086, 7086),
+  Box(7087, 7087),
+  Box(7088, 7088),
+  Box(7089, 7089),
+  Box(7090, 7090),
+  Box(7091, 7091),
+  Box(7092, 7092),
+  Box(7093, 7093),
+  Box(7094, 7094),
+  Box(7095, 7095),
+  Box(7096, 7096),
+  Box(7097, 7097),
+  Box(7098, 7098),
+  Box(7099, 7099),
+  Box(7100, 7100),
+  Box(7101, 7101),
+  Box(7102, 7102),
+  Box(7103, 7103),
+  Box(7104, 7104),
+  Box(7105, 7105),
+  Box(7106, 7106),
+  Box(7107, 7107),
+  Box(7108, 7108),
+  Box(7109, 7109),
+  Box(7110, 7110),
+  Box(7111, 7111),
+  Box(7112, 7112),
+  Box(7113, 7113),
+  Box(7114, 7114),
+  Box(7115, 7115),
+  Box(7116, 7116),
+  Box(7117, 7117),
+  Box(7118, 7118),
+  Box(7119, 7119),
+  Box(7120, 7120),
+  Box(7121, 7121),
+  Box(7122, 7122),
+  Box(7123, 7123),
+  Box(7124, 7124),
+  Box(7125, 7125),
+  Box(7126, 7126),
+  Box(7127, 7127),
+  Box(7128, 7128),
+  Box(7129, 7129),
+  Box(7130, 7130),
+  Box(7131, 7131),
+  Box(7132, 7132),
+  Box(7133, 7133),
+  Box(7134, 7134),
+  Box(7135, 7135),
+  Box(7136, 7136),
+  Box(7137, 7137),
+  Box(7138, 7138),
+  Box(7139, 7139),
+  Box(7140, 7140),
+  Box(7141, 7141),
+  Box(7142, 7142),
+  Box(7143, 7143),
+  Box(7144, 7144),
+  Box(7145, 7145),
+  Box(7146, 7146),
+  Box(7147, 7147),
+  Box(7148, 7148),
+  Box(7149, 7149),
+  Box(7150, 7150),
+  Box(7151, 7151),
+  Box(7152, 7152),
+  Box(7153, 7153),
+  Box(7154, 7154),
+  Box(7155, 7155),
+  Box(7156, 7156),
+  Box(7157, 7157),
+  Box(7158, 7158),
+  Box(7159, 7159),
+  Box(7160, 7160),
+  Box(7161, 7161),
+  Box(7162, 7162),
+  Box(7163, 7163),
+  Box(7164, 7164),
+  Box(7165, 7165),
+  Box(7166, 7166),
+  Box(7167, 7167),
+  Box(7168, 7168),
+  Box(7169, 7169),
+  Box(7170, 7170),
+  Box(7171, 7171),
+  Box(7172, 7172),
+  Box(7173, 7173),
+  Box(7174, 7174),
+  Box(7175, 7175),
+  Box(7176, 7176),
+  Box(7177, 7177),
+  Box(7178, 7178),
+  Box(7179, 7179),
+  Box(7180, 7180),
+  Box(7181, 7181),
+  Box(7182, 7182),
+  Box(7183, 7183),
+  Box(7184, 7184),
+  Box(7185, 7185),
+  Box(7186, 7186),
+  Box(7187, 7187),
+  Box(7188, 7188),
+  Box(7189, 7189),
+  Box(7190, 7190),
+  Box(7191, 7191),
+  Box(7192, 7192),
+  Box(7193, 7193),
+  Box(7194, 7194),
+  Box(7195, 7195),
+  Box(7196, 7196),
+  Box(7197, 7197),
+  Box(7198, 7198),
+  Box(7199, 7199),
+  Box(7200, 7200),
+  Box(7201, 7201),
+  Box(7202, 7202),
+  Box(7203, 7203),
+  Box(7204, 7204),
+  Box(7205, 7205),
+  Box(7206, 7206),
+  Box(7207, 7207),
+  Box(7208, 7208),
+  Box(7209, 7209),
+  Box(7210, 7210),
+  Box(7211, 7211),
+  Box(7212, 7212),
+  Box(7213, 7213),
+  Box(7214, 7214),
+  Box(7215, 7215),
+  Box(7216, 7216),
+  Box(7217, 7217),
+  Box(7218, 7218),
+  Box(7219, 7219),
+  Box(7220, 7220),
+  Box(7221, 7221),
+  Box(7222, 7222),
+  Box(7223, 7223),
+  Box(7224, 7224),
+  Box(7225, 7225),
+  Box(7226, 7226),
+  Box(7227, 7227),
+  Box(7228, 7228),
+  Box(7229, 7229),
+  Box(7230, 7230),
+  Box(7231, 7231),
+  Box(7232, 7232),
+  Box(7233, 7233),
+  Box(7234, 7234),
+  Box(7235, 7235),
+  Box(7236, 7236),
+  Box(7237, 7237),
+  Box(7238, 7238),
+  Box(7239, 7239),
+  Box(7240, 7240),
+  Box(7241, 7241),
+  Box(7242, 7242),
+  Box(7243, 7243),
+  Box(7244, 7244),
+  Box(7245, 7245),
+  Box(7246, 7246),
+  Box(7247, 7247),
+  Box(7248, 7248),
+  Box(7249, 7249),
+  Box(7250, 7250),
+  Box(7251, 7251),
+  Box(7252, 7252),
+  Box(7253, 7253),
+  Box(7254, 7254),
+  Box(7255, 7255),
+  Box(7256, 7256),
+  Box(7257, 7257),
+  Box(7258, 7258),
+  Box(7259, 7259),
+  Box(7260, 7260),
+  Box(7261, 7261),
+  Box(7262, 7262),
+  Box(7263, 7263),
+  Box(7264, 7264),
+  Box(7265, 7265),
+  Box(7266, 7266),
+  Box(7267, 7267),
+  Box(7268, 7268),
+  Box(7269, 7269),
+  Box(7270, 7270),
+  Box(7271, 7271),
+  Box(7272, 7272),
+  Box(7273, 7273),
+  Box(7274, 7274),
+  Box(7275, 7275),
+  Box(7276, 7276),
+  Box(7277, 7277),
+  Box(7278, 7278),
+  Box(7279, 7279),
+  Box(7280, 7280),
+  Box(7281, 7281),
+  Box(7282, 7282),
+  Box(7283, 7283),
+  Box(7284, 7284),
+  Box(7285, 7285),
+  Box(7286, 7286),
+  Box(7287, 7287),
+  Box(7288, 7288),
+  Box(7289, 7289),
+  Box(7290, 7290),
+  Box(7291, 7291),
+  Box(7292, 7292),
+  Box(7293, 7293),
+  Box(7294, 7294),
+  Box(7295, 7295),
+  Box(7296, 7296),
+  Box(7297, 7297),
+  Box(7298, 7298),
+  Box(7299, 7299),
+  Box(7300, 7300),
+  Box(7301, 7301),
+  Box(7302, 7302),
+  Box(7303, 7303),
+  Box(7304, 7304),
+  Box(7305, 7305),
+  Box(7306, 7306),
+  Box(7307, 7307),
+  Box(7308, 7308),
+  Box(7309, 7309),
+  Box(7310, 7310),
+  Box(7311, 7311),
+  Box(7312, 7312),
+  Box(7313, 7313),
+  Box(7314, 7314),
+  Box(7315, 7315),
+  Box(7316, 7316),
+  Box(7317, 7317),
+  Box(7318, 7318),
+  Box(7319, 7319),
+  Box(7320, 7320),
+  Box(7321, 7321),
+  Box(7322, 7322),
+  Box(7323, 7323),
+  Box(7324, 7324),
+  Box(7325, 7325),
+  Box(7326, 7326),
+  Box(7327, 7327),
+  Box(7328, 7328),
+  Box(7329, 7329),
+  Box(7330, 7330),
+  Box(7331, 7331),
+  Box(7332, 7332),
+  Box(7333, 7333),
+  Box(7334, 7334),
+  Box(7335, 7335),
+  Box(7336, 7336),
+  Box(7337, 7337),
+  Box(7338, 7338),
+  Box(7339, 7339),
+  Box(7340, 7340),
+  Box(7341, 7341),
+  Box(7342, 7342),
+  Box(7343, 7343),
+  Box(7344, 7344),
+  Box(7345, 7345),
+  Box(7346, 7346),
+  Box(7347, 7347),
+  Box(7348, 7348),
+  Box(7349, 7349),
+  Box(7350, 7350),
+  Box(7351, 7351),
+  Box(7352, 7352),
+  Box(7353, 7353),
+  Box(7354, 7354),
+  Box(7355, 7355),
+  Box(7356, 7356),
+  Box(7357, 7357),
+  Box(7358, 7358),
+  Box(7359, 7359),
+  Box(7360, 7360),
+  Box(7361, 7361),
+  Box(7362, 7362),
+  Box(7363, 7363),
+  Box(7364, 7364),
+  Box(7365, 7365),
+  Box(7366, 7366),
+  Box(7367, 7367),
+  Box(7368, 7368),
+  Box(7369, 7369),
+  Box(7370, 7370),
+  Box(7371, 7371),
+  Box(7372, 7372),
+  Box(7373, 7373),
+  Box(7374, 7374),
+  Box(7375, 7375),
+  Box(7376, 7376),
+  Box(7377, 7377),
+  Box(7378, 7378),
+  Box(7379, 7379),
+  Box(7380, 7380),
+  Box(7381, 7381),
+  Box(7382, 7382),
+  Box(7383, 7383),
+  Box(7384, 7384),
+  Box(7385, 7385),
+  Box(7386, 7386),
+  Box(7387, 7387),
+  Box(7388, 7388),
+  Box(7389, 7389),
+  Box(7390, 7390),
+  Box(7391, 7391),
+  Box(7392, 7392),
+  Box(7393, 7393),
+  Box(7394, 7394),
+  Box(7395, 7395),
+  Box(7396, 7396),
+  Box(7397, 7397),
+  Box(7398, 7398),
+  Box(7399, 7399),
+  Box(7400, 7400),
+  Box(7401, 7401),
+  Box(7402, 7402),
+  Box(7403, 7403),
+  Box(7404, 7404),
+  Box(7405, 7405),
+  Box(7406, 7406),
+  Box(7407, 7407),
+  Box(7408, 7408),
+  Box(7409, 7409),
+  Box(7410, 7410),
+  Box(7411, 7411),
+  Box(7412, 7412),
+  Box(7413, 7413),
+  Box(7414, 7414),
+  Box(7415, 7415),
+  Box(7416, 7416),
+  Box(7417, 7417),
+  Box(7418, 7418),
+  Box(7419, 7419),
+  Box(7420, 7420),
+  Box(7421, 7421),
+  Box(7422, 7422),
+  Box(7423, 7423),
+  Box(7424, 7424),
+  Box(7425, 7425),
+  Box(7426, 7426),
+  Box(7427, 7427),
+  Box(7428, 7428),
+  Box(7429, 7429),
+  Box(7430, 7430),
+  Box(7431, 7431),
+  Box(7432, 7432),
+  Box(7433, 7433),
+  Box(7434, 7434),
+  Box(7435, 7435),
+  Box(7436, 7436),
+  Box(7437, 7437),
+  Box(7438, 7438),
+  Box(7439, 7439),
+  Box(7440, 7440),
+  Box(7441, 7441),
+  Box(7442, 7442),
+  Box(7443, 7443),
+  Box(7444, 7444),
+  Box(7445, 7445),
+  Box(7446, 7446),
+  Box(7447, 7447),
+  Box(7448, 7448),
+  Box(7449, 7449),
+  Box(7450, 7450),
+  Box(7451, 7451),
+  Box(7452, 7452),
+  Box(7453, 7453),
+  Box(7454, 7454),
+  Box(7455, 7455),
+  Box(7456, 7456),
+  Box(7457, 7457),
+  Box(7458, 7458),
+  Box(7459, 7459),
+  Box(7460, 7460),
+  Box(7461, 7461),
+  Box(7462, 7462),
+  Box(7463, 7463),
+  Box(7464, 7464),
+  Box(7465, 7465),
+  Box(7466, 7466),
+  Box(7467, 7467),
+  Box(7468, 7468),
+  Box(7469, 7469),
+  Box(7470, 7470),
+  Box(7471, 7471),
+  Box(7472, 7472),
+  Box(7473, 7473),
+  Box(7474, 7474),
+  Box(7475, 7475),
+  Box(7476, 7476),
+  Box(7477, 7477),
+  Box(7478, 7478),
+  Box(7479, 7479),
+  Box(7480, 7480),
+  Box(7481, 7481),
+  Box(7482, 7482),
+  Box(7483, 7483),
+  Box(7484, 7484),
+  Box(7485, 7485),
+  Box(7486, 7486),
+  Box(7487, 7487),
+  Box(7488, 7488),
+  Box(7489, 7489),
+  Box(7490, 7490),
+  Box(7491, 7491),
+  Box(7492, 7492),
+  Box(7493, 7493),
+  Box(7494, 7494),
+  Box(7495, 7495),
+  Box(7496, 7496),
+  Box(7497, 7497),
+  Box(7498, 7498),
+  Box(7499, 7499),
+  Box(7500, 7500),
+  Box(7501, 7501),
+  Box(7502, 7502),
+  Box(7503, 7503),
+  Box(7504, 7504),
+  Box(7505, 7505),
+  Box(7506, 7506),
+  Box(7507, 7507),
+  Box(7508, 7508),
+  Box(7509, 7509),
+  Box(7510, 7510),
+  Box(7511, 7511),
+  Box(7512, 7512),
+  Box(7513, 7513),
+  Box(7514, 7514),
+  Box(7515, 7515),
+  Box(7516, 7516),
+  Box(7517, 7517),
+  Box(7518, 7518),
+  Box(7519, 7519),
+  Box(7520, 7520),
+  Box(7521, 7521),
+  Box(7522, 7522),
+  Box(7523, 7523),
+  Box(7524, 7524),
+  Box(7525, 7525),
+  Box(7526, 7526),
+  Box(7527, 7527),
+  Box(7528, 7528),
+  Box(7529, 7529),
+  Box(7530, 7530),
+  Box(7531, 7531),
+  Box(7532, 7532),
+  Box(7533, 7533),
+  Box(7534, 7534),
+  Box(7535, 7535),
+  Box(7536, 7536),
+  Box(7537, 7537),
+  Box(7538, 7538),
+  Box(7539, 7539),
+  Box(7540, 7540),
+  Box(7541, 7541),
+  Box(7542, 7542),
+  Box(7543, 7543),
+  Box(7544, 7544),
+  Box(7545, 7545),
+  Box(7546, 7546),
+  Box(7547, 7547),
+  Box(7548, 7548),
+  Box(7549, 7549),
+  Box(7550, 7550),
+  Box(7551, 7551),
+  Box(7552, 7552),
+  Box(7553, 7553),
+  Box(7554, 7554),
+  Box(7555, 7555),
+  Box(7556, 7556),
+  Box(7557, 7557),
+  Box(7558, 7558),
+  Box(7559, 7559),
+  Box(7560, 7560),
+  Box(7561, 7561),
+  Box(7562, 7562),
+  Box(7563, 7563),
+  Box(7564, 7564),
+  Box(7565, 7565),
+  Box(7566, 7566),
+  Box(7567, 7567),
+  Box(7568, 7568),
+  Box(7569, 7569),
+  Box(7570, 7570),
+  Box(7571, 7571),
+  Box(7572, 7572),
+  Box(7573, 7573),
+  Box(7574, 7574),
+  Box(7575, 7575),
+  Box(7576, 7576),
+  Box(7577, 7577),
+  Box(7578, 7578),
+  Box(7579, 7579),
+  Box(7580, 7580),
+  Box(7581, 7581),
+  Box(7582, 7582),
+  Box(7583, 7583),
+  Box(7584, 7584),
+  Box(7585, 7585),
+  Box(7586, 7586),
+  Box(7587, 7587),
+  Box(7588, 7588),
+  Box(7589, 7589),
+  Box(7590, 7590),
+  Box(7591, 7591),
+  Box(7592, 7592),
+  Box(7593, 7593),
+  Box(7594, 7594),
+  Box(7595, 7595),
+  Box(7596, 7596),
+  Box(7597, 7597),
+  Box(7598, 7598),
+  Box(7599, 7599),
+  Box(7600, 7600),
+  Box(7601, 7601),
+  Box(7602, 7602),
+  Box(7603, 7603),
+  Box(7604, 7604),
+  Box(7605, 7605),
+  Box(7606, 7606),
+  Box(7607, 7607),
+  Box(7608, 7608),
+  Box(7609, 7609),
+  Box(7610, 7610),
+  Box(7611, 7611),
+  Box(7612, 7612),
+  Box(7613, 7613),
+  Box(7614, 7614),
+  Box(7615, 7615),
+  Box(7616, 7616),
+  Box(7617, 7617),
+  Box(7618, 7618),
+  Box(7619, 7619),
+  Box(7620, 7620),
+  Box(7621, 7621),
+  Box(7622, 7622),
+  Box(7623, 7623),
+  Box(7624, 7624),
+  Box(7625, 7625),
+  Box(7626, 7626),
+  Box(7627, 7627),
+  Box(7628, 7628),
+  Box(7629, 7629),
+  Box(7630, 7630),
+  Box(7631, 7631),
+  Box(7632, 7632),
+  Box(7633, 7633),
+  Box(7634, 7634),
+  Box(7635, 7635),
+  Box(7636, 7636),
+  Box(7637, 7637),
+  Box(7638, 7638),
+  Box(7639, 7639),
+  Box(7640, 7640),
+  Box(7641, 7641),
+  Box(7642, 7642),
+  Box(7643, 7643),
+  Box(7644, 7644),
+  Box(7645, 7645),
+  Box(7646, 7646),
+  Box(7647, 7647),
+  Box(7648, 7648),
+  Box(7649, 7649),
+  Box(7650, 7650),
+  Box(7651, 7651),
+  Box(7652, 7652),
+  Box(7653, 7653),
+  Box(7654, 7654),
+  Box(7655, 7655),
+  Box(7656, 7656),
+  Box(7657, 7657),
+  Box(7658, 7658),
+  Box(7659, 7659),
+  Box(7660, 7660),
+  Box(7661, 7661),
+  Box(7662, 7662),
+  Box(7663, 7663),
+  Box(7664, 7664),
+  Box(7665, 7665),
+  Box(7666, 7666),
+  Box(7667, 7667),
+  Box(7668, 7668),
+  Box(7669, 7669),
+  Box(7670, 7670),
+  Box(7671, 7671),
+  Box(7672, 7672),
+  Box(7673, 7673),
+  Box(7674, 7674),
+  Box(7675, 7675),
+  Box(7676, 7676),
+  Box(7677, 7677),
+  Box(7678, 7678),
+  Box(7679, 7679),
+  Box(7680, 7680),
+  Box(7681, 7681),
+  Box(7682, 7682),
+  Box(7683, 7683),
+  Box(7684, 7684),
+  Box(7685, 7685),
+  Box(7686, 7686),
+  Box(7687, 7687),
+  Box(7688, 7688),
+  Box(7689, 7689),
+  Box(7690, 7690),
+  Box(7691, 7691),
+  Box(7692, 7692),
+  Box(7693, 7693),
+  Box(7694, 7694),
+  Box(7695, 7695),
+  Box(7696, 7696),
+  Box(7697, 7697),
+  Box(7698, 7698),
+  Box(7699, 7699),
+  Box(7700, 7700),
+  Box(7701, 7701),
+  Box(7702, 7702),
+  Box(7703, 7703),
+  Box(7704, 7704),
+  Box(7705, 7705),
+  Box(7706, 7706),
+  Box(7707, 7707),
+  Box(7708, 7708),
+  Box(7709, 7709),
+  Box(7710, 7710),
+  Box(7711, 7711),
+  Box(7712, 7712),
+  Box(7713, 7713),
+  Box(7714, 7714),
+  Box(7715, 7715),
+  Box(7716, 7716),
+  Box(7717, 7717),
+  Box(7718, 7718),
+  Box(7719, 7719),
+  Box(7720, 7720),
+  Box(7721, 7721),
+  Box(7722, 7722),
+  Box(7723, 7723),
+  Box(7724, 7724),
+  Box(7725, 7725),
+  Box(7726, 7726),
+  Box(7727, 7727),
+  Box(7728, 7728),
+  Box(7729, 7729),
+  Box(7730, 7730),
+  Box(7731, 7731),
+  Box(7732, 7732),
+  Box(7733, 7733),
+  Box(7734, 7734),
+  Box(7735, 7735),
+  Box(7736, 7736),
+  Box(7737, 7737),
+  Box(7738, 7738),
+  Box(7739, 7739),
+  Box(7740, 7740),
+  Box(7741, 7741),
+  Box(7742, 7742),
+  Box(7743, 7743),
+  Box(7744, 7744),
+  Box(7745, 7745),
+  Box(7746, 7746),
+  Box(7747, 7747),
+  Box(7748, 7748),
+  Box(7749, 7749),
+  Box(7750, 7750),
+  Box(7751, 7751),
+  Box(7752, 7752),
+  Box(7753, 7753),
+  Box(7754, 7754),
+  Box(7755, 7755),
+  Box(7756, 7756),
+  Box(7757, 7757),
+  Box(7758, 7758),
+  Box(7759, 7759),
+  Box(7760, 7760),
+  Box(7761, 7761),
+  Box(7762, 7762),
+  Box(7763, 7763),
+  Box(7764, 7764),
+  Box(7765, 7765),
+  Box(7766, 7766),
+  Box(7767, 7767),
+  Box(7768, 7768),
+  Box(7769, 7769),
+  Box(7770, 7770),
+  Box(7771, 7771),
+  Box(7772, 7772),
+  Box(7773, 7773),
+  Box(7774, 7774),
+  Box(7775, 7775),
+  Box(7776, 7776),
+  Box(7777, 7777),
+  Box(7778, 7778),
+  Box(7779, 7779),
+  Box(7780, 7780),
+  Box(7781, 7781),
+  Box(7782, 7782),
+  Box(7783, 7783),
+  Box(7784, 7784),
+  Box(7785, 7785),
+  Box(7786, 7786),
+  Box(7787, 7787),
+  Box(7788, 7788),
+  Box(7789, 7789),
+  Box(7790, 7790),
+  Box(7791, 7791),
+  Box(7792, 7792),
+  Box(7793, 7793),
+  Box(7794, 7794),
+  Box(7795, 7795),
+  Box(7796, 7796),
+  Box(7797, 7797),
+  Box(7798, 7798),
+  Box(7799, 7799),
+  Box(7800, 7800),
+  Box(7801, 7801),
+  Box(7802, 7802),
+  Box(7803, 7803),
+  Box(7804, 7804),
+  Box(7805, 7805),
+  Box(7806, 7806),
+  Box(7807, 7807),
+  Box(7808, 7808),
+  Box(7809, 7809),
+  Box(7810, 7810),
+  Box(7811, 7811),
+  Box(7812, 7812),
+  Box(7813, 7813),
+  Box(7814, 7814),
+  Box(7815, 7815),
+  Box(7816, 7816),
+  Box(7817, 7817),
+  Box(7818, 7818),
+  Box(7819, 7819),
+  Box(7820, 7820),
+  Box(7821, 7821),
+  Box(7822, 7822),
+  Box(7823, 7823),
+  Box(7824, 7824),
+  Box(7825, 7825),
+  Box(7826, 7826),
+  Box(7827, 7827),
+  Box(7828, 7828),
+  Box(7829, 7829),
+  Box(7830, 7830),
+  Box(7831, 7831),
+  Box(7832, 7832),
+  Box(7833, 7833),
+  Box(7834, 7834),
+  Box(7835, 7835),
+  Box(7836, 7836),
+  Box(7837, 7837),
+  Box(7838, 7838),
+  Box(7839, 7839),
+  Box(7840, 7840),
+  Box(7841, 7841),
+  Box(7842, 7842),
+  Box(7843, 7843),
+  Box(7844, 7844),
+  Box(7845, 7845),
+  Box(7846, 7846),
+  Box(7847, 7847),
+  Box(7848, 7848),
+  Box(7849, 7849),
+  Box(7850, 7850),
+  Box(7851, 7851),
+  Box(7852, 7852),
+  Box(7853, 7853),
+  Box(7854, 7854),
+  Box(7855, 7855),
+  Box(7856, 7856),
+  Box(7857, 7857),
+  Box(7858, 7858),
+  Box(7859, 7859),
+  Box(7860, 7860),
+  Box(7861, 7861),
+  Box(7862, 7862),
+  Box(7863, 7863),
+  Box(7864, 7864),
+  Box(7865, 7865),
+  Box(7866, 7866),
+  Box(7867, 7867),
+  Box(7868, 7868),
+  Box(7869, 7869),
+  Box(7870, 7870),
+  Box(7871, 7871),
+  Box(7872, 7872),
+  Box(7873, 7873),
+  Box(7874, 7874),
+  Box(7875, 7875),
+  Box(7876, 7876),
+  Box(7877, 7877),
+  Box(7878, 7878),
+  Box(7879, 7879),
+  Box(7880, 7880),
+  Box(7881, 7881),
+  Box(7882, 7882),
+  Box(7883, 7883),
+  Box(7884, 7884),
+  Box(7885, 7885),
+  Box(7886, 7886),
+  Box(7887, 7887),
+  Box(7888, 7888),
+  Box(7889, 7889),
+  Box(7890, 7890),
+  Box(7891, 7891),
+  Box(7892, 7892),
+  Box(7893, 7893),
+  Box(7894, 7894),
+  Box(7895, 7895),
+  Box(7896, 7896),
+  Box(7897, 7897),
+  Box(7898, 7898),
+  Box(7899, 7899),
+  Box(7900, 7900),
+  Box(7901, 7901),
+  Box(7902, 7902),
+  Box(7903, 7903),
+  Box(7904, 7904),
+  Box(7905, 7905),
+  Box(7906, 7906),
+  Box(7907, 7907),
+  Box(7908, 7908),
+  Box(7909, 7909),
+  Box(7910, 7910),
+  Box(7911, 7911),
+  Box(7912, 7912),
+  Box(7913, 7913),
+  Box(7914, 7914),
+  Box(7915, 7915),
+  Box(7916, 7916),
+  Box(7917, 7917),
+  Box(7918, 7918),
+  Box(7919, 7919),
+  Box(7920, 7920),
+  Box(7921, 7921),
+  Box(7922, 7922),
+  Box(7923, 7923),
+  Box(7924, 7924),
+  Box(7925, 7925),
+  Box(7926, 7926),
+  Box(7927, 7927),
+  Box(7928, 7928),
+  Box(7929, 7929),
+  Box(7930, 7930),
+  Box(7931, 7931),
+  Box(7932, 7932),
+  Box(7933, 7933),
+  Box(7934, 7934),
+  Box(7935, 7935),
+  Box(7936, 7936),
+  Box(7937, 7937),
+  Box(7938, 7938),
+  Box(7939, 7939),
+  Box(7940, 7940),
+  Box(7941, 7941),
+  Box(7942, 7942),
+  Box(7943, 7943),
+  Box(7944, 7944),
+  Box(7945, 7945),
+  Box(7946, 7946),
+  Box(7947, 7947),
+  Box(7948, 7948),
+  Box(7949, 7949),
+  Box(7950, 7950),
+  Box(7951, 7951),
+  Box(7952, 7952),
+  Box(7953, 7953),
+  Box(7954, 7954),
+  Box(7955, 7955),
+  Box(7956, 7956),
+  Box(7957, 7957),
+  Box(7958, 7958),
+  Box(7959, 7959),
+  Box(7960, 7960),
+  Box(7961, 7961),
+  Box(7962, 7962),
+  Box(7963, 7963),
+  Box(7964, 7964),
+  Box(7965, 7965),
+  Box(7966, 7966),
+  Box(7967, 7967),
+  Box(7968, 7968),
+  Box(7969, 7969),
+  Box(7970, 7970),
+  Box(7971, 7971),
+  Box(7972, 7972),
+  Box(7973, 7973),
+  Box(7974, 7974),
+  Box(7975, 7975),
+  Box(7976, 7976),
+  Box(7977, 7977),
+  Box(7978, 7978),
+  Box(7979, 7979),
+  Box(7980, 7980),
+  Box(7981, 7981),
+  Box(7982, 7982),
+  Box(7983, 7983),
+  Box(7984, 7984),
+  Box(7985, 7985),
+  Box(7986, 7986),
+  Box(7987, 7987),
+  Box(7988, 7988),
+  Box(7989, 7989),
+  Box(7990, 7990),
+  Box(7991, 7991),
+  Box(7992, 7992),
+  Box(7993, 7993),
+  Box(7994, 7994),
+  Box(7995, 7995),
+  Box(7996, 7996),
+  Box(7997, 7997),
+  Box(7998, 7998),
+  Box(7999, 7999),
+  Box(8000, 8000),
+  Box(8001, 8001),
+  Box(8002, 8002),
+  Box(8003, 8003),
+  Box(8004, 8004),
+  Box(8005, 8005),
+  Box(8006, 8006),
+  Box(8007, 8007),
+  Box(8008, 8008),
+  Box(8009, 8009),
+  Box(8010, 8010),
+  Box(8011, 8011),
+  Box(8012, 8012),
+  Box(8013, 8013),
+  Box(8014, 8014),
+  Box(8015, 8015),
+  Box(8016, 8016),
+  Box(8017, 8017),
+  Box(8018, 8018),
+  Box(8019, 8019),
+  Box(8020, 8020),
+  Box(8021, 8021),
+  Box(8022, 8022),
+  Box(8023, 8023),
+  Box(8024, 8024),
+  Box(8025, 8025),
+  Box(8026, 8026),
+  Box(8027, 8027),
+  Box(8028, 8028),
+  Box(8029, 8029),
+  Box(8030, 8030),
+  Box(8031, 8031),
+  Box(8032, 8032),
+  Box(8033, 8033),
+  Box(8034, 8034),
+  Box(8035, 8035),
+  Box(8036, 8036),
+  Box(8037, 8037),
+  Box(8038, 8038),
+  Box(8039, 8039),
+  Box(8040, 8040),
+  Box(8041, 8041),
+  Box(8042, 8042),
+  Box(8043, 8043),
+  Box(8044, 8044),
+  Box(8045, 8045),
+  Box(8046, 8046),
+  Box(8047, 8047),
+  Box(8048, 8048),
+  Box(8049, 8049),
+  Box(8050, 8050),
+  Box(8051, 8051),
+  Box(8052, 8052),
+  Box(8053, 8053),
+  Box(8054, 8054),
+  Box(8055, 8055),
+  Box(8056, 8056),
+  Box(8057, 8057),
+  Box(8058, 8058),
+  Box(8059, 8059),
+  Box(8060, 8060),
+  Box(8061, 8061),
+  Box(8062, 8062),
+  Box(8063, 8063),
+  Box(8064, 8064),
+  Box(8065, 8065),
+  Box(8066, 8066),
+  Box(8067, 8067),
+  Box(8068, 8068),
+  Box(8069, 8069),
+  Box(8070, 8070),
+  Box(8071, 8071),
+  Box(8072, 8072),
+  Box(8073, 8073),
+  Box(8074, 8074),
+  Box(8075, 8075),
+  Box(8076, 8076),
+  Box(8077, 8077),
+  Box(8078, 8078),
+  Box(8079, 8079),
+  Box(8080, 8080),
+  Box(8081, 8081),
+  Box(8082, 8082),
+  Box(8083, 8083),
+  Box(8084, 8084),
+  Box(8085, 8085),
+  Box(8086, 8086),
+  Box(8087, 8087),
+  Box(8088, 8088),
+  Box(8089, 8089),
+  Box(8090, 8090),
+  Box(8091, 8091),
+  Box(8092, 8092),
+  Box(8093, 8093),
+  Box(8094, 8094),
+  Box(8095, 8095),
+  Box(8096, 8096),
+  Box(8097, 8097),
+  Box(8098, 8098),
+  Box(8099, 8099),
+  Box(8100, 8100),
+  Box(8101, 8101),
+  Box(8102, 8102),
+  Box(8103, 8103),
+  Box(8104, 8104),
+  Box(8105, 8105),
+  Box(8106, 8106),
+  Box(8107, 8107),
+  Box(8108, 8108),
+  Box(8109, 8109),
+  Box(8110, 8110),
+  Box(8111, 8111),
+  Box(8112, 8112),
+  Box(8113, 8113),
+  Box(8114, 8114),
+  Box(8115, 8115),
+  Box(8116, 8116),
+  Box(8117, 8117),
+  Box(8118, 8118),
+  Box(8119, 8119),
+  Box(8120, 8120),
+  Box(8121, 8121),
+  Box(8122, 8122),
+  Box(8123, 8123),
+  Box(8124, 8124),
+  Box(8125, 8125),
+  Box(8126, 8126),
+  Box(8127, 8127),
+  Box(8128, 8128),
+  Box(8129, 8129),
+  Box(8130, 8130),
+  Box(8131, 8131),
+  Box(8132, 8132),
+  Box(8133, 8133),
+  Box(8134, 8134),
+  Box(8135, 8135),
+  Box(8136, 8136),
+  Box(8137, 8137),
+  Box(8138, 8138),
+  Box(8139, 8139),
+  Box(8140, 8140),
+  Box(8141, 8141),
+  Box(8142, 8142),
+  Box(8143, 8143),
+  Box(8144, 8144),
+  Box(8145, 8145),
+  Box(8146, 8146),
+  Box(8147, 8147),
+  Box(8148, 8148),
+  Box(8149, 8149),
+  Box(8150, 8150),
+  Box(8151, 8151),
+  Box(8152, 8152),
+  Box(8153, 8153),
+  Box(8154, 8154),
+  Box(8155, 8155),
+  Box(8156, 8156),
+  Box(8157, 8157),
+  Box(8158, 8158),
+  Box(8159, 8159),
+  Box(8160, 8160),
+  Box(8161, 8161),
+  Box(8162, 8162),
+  Box(8163, 8163),
+  Box(8164, 8164),
+  Box(8165, 8165),
+  Box(8166, 8166),
+  Box(8167, 8167),
+  Box(8168, 8168),
+  Box(8169, 8169),
+  Box(8170, 8170),
+  Box(8171, 8171),
+  Box(8172, 8172),
+  Box(8173, 8173),
+  Box(8174, 8174),
+  Box(8175, 8175),
+  Box(8176, 8176),
+  Box(8177, 8177),
+  Box(8178, 8178),
+  Box(8179, 8179),
+  Box(8180, 8180),
+  Box(8181, 8181),
+  Box(8182, 8182),
+  Box(8183, 8183),
+  Box(8184, 8184),
+  Box(8185, 8185),
+  Box(8186, 8186),
+  Box(8187, 8187),
+  Box(8188, 8188),
+  Box(8189, 8189),
+  Box(8190, 8190),
+  Box(8191, 8191),
+  Box(8192, 8192),
+  Box(8193, 8193),
+  Box(8194, 8194),
+  Box(8195, 8195),
+  Box(8196, 8196),
+  Box(8197, 8197),
+  Box(8198, 8198),
+  Box(8199, 8199),
+  Box(8200, 8200),
+  Box(8201, 8201),
+  Box(8202, 8202),
+  Box(8203, 8203),
+  Box(8204, 8204),
+  Box(8205, 8205),
+  Box(8206, 8206),
+  Box(8207, 8207),
+  Box(8208, 8208),
+  Box(8209, 8209),
+  Box(8210, 8210),
+  Box(8211, 8211),
+  Box(8212, 8212),
+  Box(8213, 8213),
+  Box(8214, 8214),
+  Box(8215, 8215),
+  Box(8216, 8216),
+  Box(8217, 8217),
+  Box(8218, 8218),
+  Box(8219, 8219),
+  Box(8220, 8220),
+  Box(8221, 8221),
+  Box(8222, 8222),
+  Box(8223, 8223),
+  Box(8224, 8224),
+  Box(8225, 8225),
+  Box(8226, 8226),
+  Box(8227, 8227),
+  Box(8228, 8228),
+  Box(8229, 8229),
+  Box(8230, 8230),
+  Box(8231, 8231),
+  Box(8232, 8232),
+  Box(8233, 8233),
+  Box(8234, 8234),
+  Box(8235, 8235),
+  Box(8236, 8236),
+  Box(8237, 8237),
+  Box(8238, 8238),
+  Box(8239, 8239),
+  Box(8240, 8240),
+  Box(8241, 8241),
+  Box(8242, 8242),
+  Box(8243, 8243),
+  Box(8244, 8244),
+  Box(8245, 8245),
+  Box(8246, 8246),
+  Box(8247, 8247),
+  Box(8248, 8248),
+  Box(8249, 8249),
+  Box(8250, 8250),
+  Box(8251, 8251),
+  Box(8252, 8252),
+  Box(8253, 8253),
+  Box(8254, 8254),
+  Box(8255, 8255),
+  Box(8256, 8256),
+  Box(8257, 8257),
+  Box(8258, 8258),
+  Box(8259, 8259),
+  Box(8260, 8260),
+  Box(8261, 8261),
+  Box(8262, 8262),
+  Box(8263, 8263),
+  Box(8264, 8264),
+  Box(8265, 8265),
+  Box(8266, 8266),
+  Box(8267, 8267),
+  Box(8268, 8268),
+  Box(8269, 8269),
+  Box(8270, 8270),
+  Box(8271, 8271),
+  Box(8272, 8272),
+  Box(8273, 8273),
+  Box(8274, 8274),
+  Box(8275, 8275),
+  Box(8276, 8276),
+  Box(8277, 8277),
+  Box(8278, 8278),
+  Box(8279, 8279),
+  Box(8280, 8280),
+  Box(8281, 8281),
+  Box(8282, 8282),
+  Box(8283, 8283),
+  Box(8284, 8284),
+  Box(8285, 8285),
+  Box(8286, 8286),
+  Box(8287, 8287),
+  Box(8288, 8288),
+  Box(8289, 8289),
+  Box(8290, 8290),
+  Box(8291, 8291),
+  Box(8292, 8292),
+  Box(8293, 8293),
+  Box(8294, 8294),
+  Box(8295, 8295),
+  Box(8296, 8296),
+  Box(8297, 8297),
+  Box(8298, 8298),
+  Box(8299, 8299),
+  Box(8300, 8300),
+  Box(8301, 8301),
+  Box(8302, 8302),
+  Box(8303, 8303),
+  Box(8304, 8304),
+  Box(8305, 8305),
+  Box(8306, 8306),
+  Box(8307, 8307),
+  Box(8308, 8308),
+  Box(8309, 8309),
+  Box(8310, 8310),
+  Box(8311, 8311),
+  Box(8312, 8312),
+  Box(8313, 8313),
+  Box(8314, 8314),
+  Box(8315, 8315),
+  Box(8316, 8316),
+  Box(8317, 8317),
+  Box(8318, 8318),
+  Box(8319, 8319),
+  Box(8320, 8320),
+  Box(8321, 8321),
+  Box(8322, 8322),
+  Box(8323, 8323),
+  Box(8324, 8324),
+  Box(8325, 8325),
+  Box(8326, 8326),
+  Box(8327, 8327),
+  Box(8328, 8328),
+  Box(8329, 8329),
+  Box(8330, 8330),
+  Box(8331, 8331),
+  Box(8332, 8332),
+  Box(8333, 8333),
+  Box(8334, 8334),
+  Box(8335, 8335),
+  Box(8336, 8336),
+  Box(8337, 8337),
+  Box(8338, 8338),
+  Box(8339, 8339),
+  Box(8340, 8340),
+  Box(8341, 8341),
+  Box(8342, 8342),
+  Box(8343, 8343),
+  Box(8344, 8344),
+  Box(8345, 8345),
+  Box(8346, 8346),
+  Box(8347, 8347),
+  Box(8348, 8348),
+  Box(8349, 8349),
+  Box(8350, 8350),
+  Box(8351, 8351),
+  Box(8352, 8352),
+  Box(8353, 8353),
+  Box(8354, 8354),
+  Box(8355, 8355),
+  Box(8356, 8356),
+  Box(8357, 8357),
+  Box(8358, 8358),
+  Box(8359, 8359),
+  Box(8360, 8360),
+  Box(8361, 8361),
+  Box(8362, 8362),
+  Box(8363, 8363),
+  Box(8364, 8364),
+  Box(8365, 8365),
+  Box(8366, 8366),
+  Box(8367, 8367),
+  Box(8368, 8368),
+  Box(8369, 8369),
+  Box(8370, 8370),
+  Box(8371, 8371),
+  Box(8372, 8372),
+  Box(8373, 8373),
+  Box(8374, 8374),
+  Box(8375, 8375),
+  Box(8376, 8376),
+  Box(8377, 8377),
+  Box(8378, 8378),
+  Box(8379, 8379),
+  Box(8380, 8380),
+  Box(8381, 8381),
+  Box(8382, 8382),
+  Box(8383, 8383),
+  Box(8384, 8384),
+  Box(8385, 8385),
+  Box(8386, 8386),
+  Box(8387, 8387),
+  Box(8388, 8388),
+  Box(8389, 8389),
+  Box(8390, 8390),
+  Box(8391, 8391),
+  Box(8392, 8392),
+  Box(8393, 8393),
+  Box(8394, 8394),
+  Box(8395, 8395),
+  Box(8396, 8396),
+  Box(8397, 8397),
+  Box(8398, 8398),
+  Box(8399, 8399),
+  Box(8400, 8400),
+  Box(8401, 8401),
+  Box(8402, 8402),
+  Box(8403, 8403),
+  Box(8404, 8404),
+  Box(8405, 8405),
+  Box(8406, 8406),
+  Box(8407, 8407),
+  Box(8408, 8408),
+  Box(8409, 8409),
+  Box(8410, 8410),
+  Box(8411, 8411),
+  Box(8412, 8412),
+  Box(8413, 8413),
+  Box(8414, 8414),
+  Box(8415, 8415),
+  Box(8416, 8416),
+  Box(8417, 8417),
+  Box(8418, 8418),
+  Box(8419, 8419),
+  Box(8420, 8420),
+  Box(8421, 8421),
+  Box(8422, 8422),
+  Box(8423, 8423),
+  Box(8424, 8424),
+  Box(8425, 8425),
+  Box(8426, 8426),
+  Box(8427, 8427),
+  Box(8428, 8428),
+  Box(8429, 8429),
+  Box(8430, 8430),
+  Box(8431, 8431),
+  Box(8432, 8432),
+  Box(8433, 8433),
+  Box(8434, 8434),
+  Box(8435, 8435),
+  Box(8436, 8436),
+  Box(8437, 8437),
+  Box(8438, 8438),
+  Box(8439, 8439),
+  Box(8440, 8440),
+  Box(8441, 8441),
+  Box(8442, 8442),
+  Box(8443, 8443),
+  Box(8444, 8444),
+  Box(8445, 8445),
+  Box(8446, 8446),
+  Box(8447, 8447),
+  Box(8448, 8448),
+  Box(8449, 8449),
+  Box(8450, 8450),
+  Box(8451, 8451),
+  Box(8452, 8452),
+  Box(8453, 8453),
+  Box(8454, 8454),
+  Box(8455, 8455),
+  Box(8456, 8456),
+  Box(8457, 8457),
+  Box(8458, 8458),
+  Box(8459, 8459),
+  Box(8460, 8460),
+  Box(8461, 8461),
+  Box(8462, 8462),
+  Box(8463, 8463),
+  Box(8464, 8464),
+  Box(8465, 8465),
+  Box(8466, 8466),
+  Box(8467, 8467),
+  Box(8468, 8468),
+  Box(8469, 8469),
+  Box(8470, 8470),
+  Box(8471, 8471),
+  Box(8472, 8472),
+  Box(8473, 8473),
+  Box(8474, 8474),
+  Box(8475, 8475),
+  Box(8476, 8476),
+  Box(8477, 8477),
+  Box(8478, 8478),
+  Box(8479, 8479),
+  Box(8480, 8480),
+  Box(8481, 8481),
+  Box(8482, 8482),
+  Box(8483, 8483),
+  Box(8484, 8484),
+  Box(8485, 8485),
+  Box(8486, 8486),
+  Box(8487, 8487),
+  Box(8488, 8488),
+  Box(8489, 8489),
+  Box(8490, 8490),
+  Box(8491, 8491),
+  Box(8492, 8492),
+  Box(8493, 8493),
+  Box(8494, 8494),
+  Box(8495, 8495),
+  Box(8496, 8496),
+  Box(8497, 8497),
+  Box(8498, 8498),
+  Box(8499, 8499),
+  Box(8500, 8500),
+  Box(8501, 8501),
+  Box(8502, 8502),
+  Box(8503, 8503),
+  Box(8504, 8504),
+  Box(8505, 8505),
+  Box(8506, 8506),
+  Box(8507, 8507),
+  Box(8508, 8508),
+  Box(8509, 8509),
+  Box(8510, 8510),
+  Box(8511, 8511),
+  Box(8512, 8512),
+  Box(8513, 8513),
+  Box(8514, 8514),
+  Box(8515, 8515),
+  Box(8516, 8516),
+  Box(8517, 8517),
+  Box(8518, 8518),
+  Box(8519, 8519),
+  Box(8520, 8520),
+  Box(8521, 8521),
+  Box(8522, 8522),
+  Box(8523, 8523),
+  Box(8524, 8524),
+  Box(8525, 8525),
+  Box(8526, 8526),
+  Box(8527, 8527),
+  Box(8528, 8528),
+  Box(8529, 8529),
+  Box(8530, 8530),
+  Box(8531, 8531),
+  Box(8532, 8532),
+  Box(8533, 8533),
+  Box(8534, 8534),
+  Box(8535, 8535),
+  Box(8536, 8536),
+  Box(8537, 8537),
+  Box(8538, 8538),
+  Box(8539, 8539),
+  Box(8540, 8540),
+  Box(8541, 8541),
+  Box(8542, 8542),
+  Box(8543, 8543),
+  Box(8544, 8544),
+  Box(8545, 8545),
+  Box(8546, 8546),
+  Box(8547, 8547),
+  Box(8548, 8548),
+  Box(8549, 8549),
+  Box(8550, 8550),
+  Box(8551, 8551),
+  Box(8552, 8552),
+  Box(8553, 8553),
+  Box(8554, 8554),
+  Box(8555, 8555),
+  Box(8556, 8556),
+  Box(8557, 8557),
+  Box(8558, 8558),
+  Box(8559, 8559),
+  Box(8560, 8560),
+  Box(8561, 8561),
+  Box(8562, 8562),
+  Box(8563, 8563),
+  Box(8564, 8564),
+  Box(8565, 8565),
+  Box(8566, 8566),
+  Box(8567, 8567),
+  Box(8568, 8568),
+  Box(8569, 8569),
+  Box(8570, 8570),
+  Box(8571, 8571),
+  Box(8572, 8572),
+  Box(8573, 8573),
+  Box(8574, 8574),
+  Box(8575, 8575),
+  Box(8576, 8576),
+  Box(8577, 8577),
+  Box(8578, 8578),
+  Box(8579, 8579),
+  Box(8580, 8580),
+  Box(8581, 8581),
+  Box(8582, 8582),
+  Box(8583, 8583),
+  Box(8584, 8584),
+  Box(8585, 8585),
+  Box(8586, 8586),
+  Box(8587, 8587),
+  Box(8588, 8588),
+  Box(8589, 8589),
+  Box(8590, 8590),
+  Box(8591, 8591),
+  Box(8592, 8592),
+  Box(8593, 8593),
+  Box(8594, 8594),
+  Box(8595, 8595),
+  Box(8596, 8596),
+  Box(8597, 8597),
+  Box(8598, 8598),
+  Box(8599, 8599),
+  Box(8600, 8600),
+  Box(8601, 8601),
+  Box(8602, 8602),
+  Box(8603, 8603),
+  Box(8604, 8604),
+  Box(8605, 8605),
+  Box(8606, 8606),
+  Box(8607, 8607),
+  Box(8608, 8608),
+  Box(8609, 8609),
+  Box(8610, 8610),
+  Box(8611, 8611),
+  Box(8612, 8612),
+  Box(8613, 8613),
+  Box(8614, 8614),
+  Box(8615, 8615),
+  Box(8616, 8616),
+  Box(8617, 8617),
+  Box(8618, 8618),
+  Box(8619, 8619),
+  Box(8620, 8620),
+  Box(8621, 8621),
+  Box(8622, 8622),
+  Box(8623, 8623),
+  Box(8624, 8624),
+  Box(8625, 8625),
+  Box(8626, 8626),
+  Box(8627, 8627),
+  Box(8628, 8628),
+  Box(8629, 8629),
+  Box(8630, 8630),
+  Box(8631, 8631),
+  Box(8632, 8632),
+  Box(8633, 8633),
+  Box(8634, 8634),
+  Box(8635, 8635),
+  Box(8636, 8636),
+  Box(8637, 8637),
+  Box(8638, 8638),
+  Box(8639, 8639),
+  Box(8640, 8640),
+  Box(8641, 8641),
+  Box(8642, 8642),
+  Box(8643, 8643),
+  Box(8644, 8644),
+  Box(8645, 8645),
+  Box(8646, 8646),
+  Box(8647, 8647),
+  Box(8648, 8648),
+  Box(8649, 8649),
+  Box(8650, 8650),
+  Box(8651, 8651),
+  Box(8652, 8652),
+  Box(8653, 8653),
+  Box(8654, 8654),
+  Box(8655, 8655),
+  Box(8656, 8656),
+  Box(8657, 8657),
+  Box(8658, 8658),
+  Box(8659, 8659),
+  Box(8660, 8660),
+  Box(8661, 8661),
+  Box(8662, 8662),
+  Box(8663, 8663),
+  Box(8664, 8664),
+  Box(8665, 8665),
+  Box(8666, 8666),
+  Box(8667, 8667),
+  Box(8668, 8668),
+  Box(8669, 8669),
+  Box(8670, 8670),
+  Box(8671, 8671),
+  Box(8672, 8672),
+  Box(8673, 8673),
+  Box(8674, 8674),
+  Box(8675, 8675),
+  Box(8676, 8676),
+  Box(8677, 8677),
+  Box(8678, 8678),
+  Box(8679, 8679),
+  Box(8680, 8680),
+  Box(8681, 8681),
+  Box(8682, 8682),
+  Box(8683, 8683),
+  Box(8684, 8684),
+  Box(8685, 8685),
+  Box(8686, 8686),
+  Box(8687, 8687),
+  Box(8688, 8688),
+  Box(8689, 8689),
+  Box(8690, 8690),
+  Box(8691, 8691),
+  Box(8692, 8692),
+  Box(8693, 8693),
+  Box(8694, 8694),
+  Box(8695, 8695),
+  Box(8696, 8696),
+  Box(8697, 8697),
+  Box(8698, 8698),
+  Box(8699, 8699),
+  Box(8700, 8700),
+  Box(8701, 8701),
+  Box(8702, 8702),
+  Box(8703, 8703),
+  Box(8704, 8704),
+  Box(8705, 8705),
+  Box(8706, 8706),
+  Box(8707, 8707),
+  Box(8708, 8708),
+  Box(8709, 8709),
+  Box(8710, 8710),
+  Box(8711, 8711),
+  Box(8712, 8712),
+  Box(8713, 8713),
+  Box(8714, 8714),
+  Box(8715, 8715),
+  Box(8716, 8716),
+  Box(8717, 8717),
+  Box(8718, 8718),
+  Box(8719, 8719),
+  Box(8720, 8720),
+  Box(8721, 8721),
+  Box(8722, 8722),
+  Box(8723, 8723),
+  Box(8724, 8724),
+  Box(8725, 8725),
+  Box(8726, 8726),
+  Box(8727, 8727),
+  Box(8728, 8728),
+  Box(8729, 8729),
+  Box(8730, 8730),
+  Box(8731, 8731),
+  Box(8732, 8732),
+  Box(8733, 8733),
+  Box(8734, 8734),
+  Box(8735, 8735),
+  Box(8736, 8736),
+  Box(8737, 8737),
+  Box(8738, 8738),
+  Box(8739, 8739),
+  Box(8740, 8740),
+  Box(8741, 8741),
+  Box(8742, 8742),
+  Box(8743, 8743),
+  Box(8744, 8744),
+  Box(8745, 8745),
+  Box(8746, 8746),
+  Box(8747, 8747),
+  Box(8748, 8748),
+  Box(8749, 8749),
+  Box(8750, 8750),
+  Box(8751, 8751),
+  Box(8752, 8752),
+  Box(8753, 8753),
+  Box(8754, 8754),
+  Box(8755, 8755),
+  Box(8756, 8756),
+  Box(8757, 8757),
+  Box(8758, 8758),
+  Box(8759, 8759),
+  Box(8760, 8760),
+  Box(8761, 8761),
+  Box(8762, 8762),
+  Box(8763, 8763),
+  Box(8764, 8764),
+  Box(8765, 8765),
+  Box(8766, 8766),
+  Box(8767, 8767),
+  Box(8768, 8768),
+  Box(8769, 8769),
+  Box(8770, 8770),
+  Box(8771, 8771),
+  Box(8772, 8772),
+  Box(8773, 8773),
+  Box(8774, 8774),
+  Box(8775, 8775),
+  Box(8776, 8776),
+  Box(8777, 8777),
+  Box(8778, 8778),
+  Box(8779, 8779),
+  Box(8780, 8780),
+  Box(8781, 8781),
+  Box(8782, 8782),
+  Box(8783, 8783),
+  Box(8784, 8784),
+  Box(8785, 8785),
+  Box(8786, 8786),
+  Box(8787, 8787),
+  Box(8788, 8788),
+  Box(8789, 8789),
+  Box(8790, 8790),
+  Box(8791, 8791),
+  Box(8792, 8792),
+  Box(8793, 8793),
+  Box(8794, 8794),
+  Box(8795, 8795),
+  Box(8796, 8796),
+  Box(8797, 8797),
+  Box(8798, 8798),
+  Box(8799, 8799),
+  Box(8800, 8800),
+  Box(8801, 8801),
+  Box(8802, 8802),
+  Box(8803, 8803),
+  Box(8804, 8804),
+  Box(8805, 8805),
+  Box(8806, 8806),
+  Box(8807, 8807),
+  Box(8808, 8808),
+  Box(8809, 8809),
+  Box(8810, 8810),
+  Box(8811, 8811),
+  Box(8812, 8812),
+  Box(8813, 8813),
+  Box(8814, 8814),
+  Box(8815, 8815),
+  Box(8816, 8816),
+  Box(8817, 8817),
+  Box(8818, 8818),
+  Box(8819, 8819),
+  Box(8820, 8820),
+  Box(8821, 8821),
+  Box(8822, 8822),
+  Box(8823, 8823),
+  Box(8824, 8824),
+  Box(8825, 8825),
+  Box(8826, 8826),
+  Box(8827, 8827),
+  Box(8828, 8828),
+  Box(8829, 8829),
+  Box(8830, 8830),
+  Box(8831, 8831),
+  Box(8832, 8832),
+  Box(8833, 8833),
+  Box(8834, 8834),
+  Box(8835, 8835),
+  Box(8836, 8836),
+  Box(8837, 8837),
+  Box(8838, 8838),
+  Box(8839, 8839),
+  Box(8840, 8840),
+  Box(8841, 8841),
+  Box(8842, 8842),
+  Box(8843, 8843),
+  Box(8844, 8844),
+  Box(8845, 8845),
+  Box(8846, 8846),
+  Box(8847, 8847),
+  Box(8848, 8848),
+  Box(8849, 8849),
+  Box(8850, 8850),
+  Box(8851, 8851),
+  Box(8852, 8852),
+  Box(8853, 8853),
+  Box(8854, 8854),
+  Box(8855, 8855),
+  Box(8856, 8856),
+  Box(8857, 8857),
+  Box(8858, 8858),
+  Box(8859, 8859),
+  Box(8860, 8860),
+  Box(8861, 8861),
+  Box(8862, 8862),
+  Box(8863, 8863),
+  Box(8864, 8864),
+  Box(8865, 8865),
+  Box(8866, 8866),
+  Box(8867, 8867),
+  Box(8868, 8868),
+  Box(8869, 8869),
+  Box(8870, 8870),
+  Box(8871, 8871),
+  Box(8872, 8872),
+  Box(8873, 8873),
+  Box(8874, 8874),
+  Box(8875, 8875),
+  Box(8876, 8876),
+  Box(8877, 8877),
+  Box(8878, 8878),
+  Box(8879, 8879),
+  Box(8880, 8880),
+  Box(8881, 8881),
+  Box(8882, 8882),
+  Box(8883, 8883),
+  Box(8884, 8884),
+  Box(8885, 8885),
+  Box(8886, 8886),
+  Box(8887, 8887),
+  Box(8888, 8888),
+  Box(8889, 8889),
+  Box(8890, 8890),
+  Box(8891, 8891),
+  Box(8892, 8892),
+  Box(8893, 8893),
+  Box(8894, 8894),
+  Box(8895, 8895),
+  Box(8896, 8896),
+  Box(8897, 8897),
+  Box(8898, 8898),
+  Box(8899, 8899),
+  Box(8900, 8900),
+  Box(8901, 8901),
+  Box(8902, 8902),
+  Box(8903, 8903),
+  Box(8904, 8904),
+  Box(8905, 8905),
+  Box(8906, 8906),
+  Box(8907, 8907),
+  Box(8908, 8908),
+  Box(8909, 8909),
+  Box(8910, 8910),
+  Box(8911, 8911),
+  Box(8912, 8912),
+  Box(8913, 8913),
+  Box(8914, 8914),
+  Box(8915, 8915),
+  Box(8916, 8916),
+  Box(8917, 8917),
+  Box(8918, 8918),
+  Box(8919, 8919),
+  Box(8920, 8920),
+  Box(8921, 8921),
+  Box(8922, 8922),
+  Box(8923, 8923),
+  Box(8924, 8924),
+  Box(8925, 8925),
+  Box(8926, 8926),
+  Box(8927, 8927),
+  Box(8928, 8928),
+  Box(8929, 8929),
+  Box(8930, 8930),
+  Box(8931, 8931),
+  Box(8932, 8932),
+  Box(8933, 8933),
+  Box(8934, 8934),
+  Box(8935, 8935),
+  Box(8936, 8936),
+  Box(8937, 8937),
+  Box(8938, 8938),
+  Box(8939, 8939),
+  Box(8940, 8940),
+  Box(8941, 8941),
+  Box(8942, 8942),
+  Box(8943, 8943),
+  Box(8944, 8944),
+  Box(8945, 8945),
+  Box(8946, 8946),
+  Box(8947, 8947),
+  Box(8948, 8948),
+  Box(8949, 8949),
+  Box(8950, 8950),
+  Box(8951, 8951),
+  Box(8952, 8952),
+  Box(8953, 8953),
+  Box(8954, 8954),
+  Box(8955, 8955),
+  Box(8956, 8956),
+  Box(8957, 8957),
+  Box(8958, 8958),
+  Box(8959, 8959),
+  Box(8960, 8960),
+  Box(8961, 8961),
+  Box(8962, 8962),
+  Box(8963, 8963),
+  Box(8964, 8964),
+  Box(8965, 8965),
+  Box(8966, 8966),
+  Box(8967, 8967),
+  Box(8968, 8968),
+  Box(8969, 8969),
+  Box(8970, 8970),
+  Box(8971, 8971),
+  Box(8972, 8972),
+  Box(8973, 8973),
+  Box(8974, 8974),
+  Box(8975, 8975),
+  Box(8976, 8976),
+  Box(8977, 8977),
+  Box(8978, 8978),
+  Box(8979, 8979),
+  Box(8980, 8980),
+  Box(8981, 8981),
+  Box(8982, 8982),
+  Box(8983, 8983),
+  Box(8984, 8984),
+  Box(8985, 8985),
+  Box(8986, 8986),
+  Box(8987, 8987),
+  Box(8988, 8988),
+  Box(8989, 8989),
+  Box(8990, 8990),
+  Box(8991, 8991),
+  Box(8992, 8992),
+  Box(8993, 8993),
+  Box(8994, 8994),
+  Box(8995, 8995),
+  Box(8996, 8996),
+  Box(8997, 8997),
+  Box(8998, 8998),
+  Box(8999, 8999),
+  Box(9000, 9000),
+  Box(9001, 9001),
+  Box(9002, 9002),
+  Box(9003, 9003),
+  Box(9004, 9004),
+  Box(9005, 9005),
+  Box(9006, 9006),
+  Box(9007, 9007),
+  Box(9008, 9008),
+  Box(9009, 9009),
+  Box(9010, 9010),
+  Box(9011, 9011),
+  Box(9012, 9012),
+  Box(9013, 9013),
+  Box(9014, 9014),
+  Box(9015, 9015),
+  Box(9016, 9016),
+  Box(9017, 9017),
+  Box(9018, 9018),
+  Box(9019, 9019),
+  Box(9020, 9020),
+  Box(9021, 9021),
+  Box(9022, 9022),
+  Box(9023, 9023),
+  Box(9024, 9024),
+  Box(9025, 9025),
+  Box(9026, 9026),
+  Box(9027, 9027),
+  Box(9028, 9028),
+  Box(9029, 9029),
+  Box(9030, 9030),
+  Box(9031, 9031),
+  Box(9032, 9032),
+  Box(9033, 9033),
+  Box(9034, 9034),
+  Box(9035, 9035),
+  Box(9036, 9036),
+  Box(9037, 9037),
+  Box(9038, 9038),
+  Box(9039, 9039),
+  Box(9040, 9040),
+  Box(9041, 9041),
+  Box(9042, 9042),
+  Box(9043, 9043),
+  Box(9044, 9044),
+  Box(9045, 9045),
+  Box(9046, 9046),
+  Box(9047, 9047),
+  Box(9048, 9048),
+  Box(9049, 9049),
+  Box(9050, 9050),
+  Box(9051, 9051),
+  Box(9052, 9052),
+  Box(9053, 9053),
+  Box(9054, 9054),
+  Box(9055, 9055),
+  Box(9056, 9056),
+  Box(9057, 9057),
+  Box(9058, 9058),
+  Box(9059, 9059),
+  Box(9060, 9060),
+  Box(9061, 9061),
+  Box(9062, 9062),
+  Box(9063, 9063),
+  Box(9064, 9064),
+  Box(9065, 9065),
+  Box(9066, 9066),
+  Box(9067, 9067),
+  Box(9068, 9068),
+  Box(9069, 9069),
+  Box(9070, 9070),
+  Box(9071, 9071),
+  Box(9072, 9072),
+  Box(9073, 9073),
+  Box(9074, 9074),
+  Box(9075, 9075),
+  Box(9076, 9076),
+  Box(9077, 9077),
+  Box(9078, 9078),
+  Box(9079, 9079),
+  Box(9080, 9080),
+  Box(9081, 9081),
+  Box(9082, 9082),
+  Box(9083, 9083),
+  Box(9084, 9084),
+  Box(9085, 9085),
+  Box(9086, 9086),
+  Box(9087, 9087),
+  Box(9088, 9088),
+  Box(9089, 9089),
+  Box(9090, 9090),
+  Box(9091, 9091),
+  Box(9092, 9092),
+  Box(9093, 9093),
+  Box(9094, 9094),
+  Box(9095, 9095),
+  Box(9096, 9096),
+  Box(9097, 9097),
+  Box(9098, 9098),
+  Box(9099, 9099),
+  Box(9100, 9100),
+  Box(9101, 9101),
+  Box(9102, 9102),
+  Box(9103, 9103),
+  Box(9104, 9104),
+  Box(9105, 9105),
+  Box(9106, 9106),
+  Box(9107, 9107),
+  Box(9108, 9108),
+  Box(9109, 9109),
+  Box(9110, 9110),
+  Box(9111, 9111),
+  Box(9112, 9112),
+  Box(9113, 9113),
+  Box(9114, 9114),
+  Box(9115, 9115),
+  Box(9116, 9116),
+  Box(9117, 9117),
+  Box(9118, 9118),
+  Box(9119, 9119),
+  Box(9120, 9120),
+  Box(9121, 9121),
+  Box(9122, 9122),
+  Box(9123, 9123),
+  Box(9124, 9124),
+  Box(9125, 9125),
+  Box(9126, 9126),
+  Box(9127, 9127),
+  Box(9128, 9128),
+  Box(9129, 9129),
+  Box(9130, 9130),
+  Box(9131, 9131),
+  Box(9132, 9132),
+  Box(9133, 9133),
+  Box(9134, 9134),
+  Box(9135, 9135),
+  Box(9136, 9136),
+  Box(9137, 9137),
+  Box(9138, 9138),
+  Box(9139, 9139),
+  Box(9140, 9140),
+  Box(9141, 9141),
+  Box(9142, 9142),
+  Box(9143, 9143),
+  Box(9144, 9144),
+  Box(9145, 9145),
+  Box(9146, 9146),
+  Box(9147, 9147),
+  Box(9148, 9148),
+  Box(9149, 9149),
+  Box(9150, 9150),
+  Box(9151, 9151),
+  Box(9152, 9152),
+  Box(9153, 9153),
+  Box(9154, 9154),
+  Box(9155, 9155),
+  Box(9156, 9156),
+  Box(9157, 9157),
+  Box(9158, 9158),
+  Box(9159, 9159),
+  Box(9160, 9160),
+  Box(9161, 9161),
+  Box(9162, 9162),
+  Box(9163, 9163),
+  Box(9164, 9164),
+  Box(9165, 9165),
+  Box(9166, 9166),
+  Box(9167, 9167),
+  Box(9168, 9168),
+  Box(9169, 9169),
+  Box(9170, 9170),
+  Box(9171, 9171),
+  Box(9172, 9172),
+  Box(9173, 9173),
+  Box(9174, 9174),
+  Box(9175, 9175),
+  Box(9176, 9176),
+  Box(9177, 9177),
+  Box(9178, 9178),
+  Box(9179, 9179),
+  Box(9180, 9180),
+  Box(9181, 9181),
+  Box(9182, 9182),
+  Box(9183, 9183),
+  Box(9184, 9184),
+  Box(9185, 9185),
+  Box(9186, 9186),
+  Box(9187, 9187),
+  Box(9188, 9188),
+  Box(9189, 9189),
+  Box(9190, 9190),
+  Box(9191, 9191),
+  Box(9192, 9192),
+  Box(9193, 9193),
+  Box(9194, 9194),
+  Box(9195, 9195),
+  Box(9196, 9196),
+  Box(9197, 9197),
+  Box(9198, 9198),
+  Box(9199, 9199),
+  Box(9200, 9200),
+  Box(9201, 9201),
+  Box(9202, 9202),
+  Box(9203, 9203),
+  Box(9204, 9204),
+  Box(9205, 9205),
+  Box(9206, 9206),
+  Box(9207, 9207),
+  Box(9208, 9208),
+  Box(9209, 9209),
+  Box(9210, 9210),
+  Box(9211, 9211),
+  Box(9212, 9212),
+  Box(9213, 9213),
+  Box(9214, 9214),
+  Box(9215, 9215),
+  Box(9216, 9216),
+  Box(9217, 9217),
+  Box(9218, 9218),
+  Box(9219, 9219),
+  Box(9220, 9220),
+  Box(9221, 9221),
+  Box(9222, 9222),
+  Box(9223, 9223),
+  Box(9224, 9224),
+  Box(9225, 9225),
+  Box(9226, 9226),
+  Box(9227, 9227),
+  Box(9228, 9228),
+  Box(9229, 9229),
+  Box(9230, 9230),
+  Box(9231, 9231),
+  Box(9232, 9232),
+  Box(9233, 9233),
+  Box(9234, 9234),
+  Box(9235, 9235),
+  Box(9236, 9236),
+  Box(9237, 9237),
+  Box(9238, 9238),
+  Box(9239, 9239),
+  Box(9240, 9240),
+  Box(9241, 9241),
+  Box(9242, 9242),
+  Box(9243, 9243),
+  Box(9244, 9244),
+  Box(9245, 9245),
+  Box(9246, 9246),
+  Box(9247, 9247),
+  Box(9248, 9248),
+  Box(9249, 9249),
+  Box(9250, 9250),
+  Box(9251, 9251),
+  Box(9252, 9252),
+  Box(9253, 9253),
+  Box(9254, 9254),
+  Box(9255, 9255),
+  Box(9256, 9256),
+  Box(9257, 9257),
+  Box(9258, 9258),
+  Box(9259, 9259),
+  Box(9260, 9260),
+  Box(9261, 9261),
+  Box(9262, 9262),
+  Box(9263, 9263),
+  Box(9264, 9264),
+  Box(9265, 9265),
+  Box(9266, 9266),
+  Box(9267, 9267),
+  Box(9268, 9268),
+  Box(9269, 9269),
+  Box(9270, 9270),
+  Box(9271, 9271),
+  Box(9272, 9272),
+  Box(9273, 9273),
+  Box(9274, 9274),
+  Box(9275, 9275),
+  Box(9276, 9276),
+  Box(9277, 9277),
+  Box(9278, 9278),
+  Box(9279, 9279),
+  Box(9280, 9280),
+  Box(9281, 9281),
+  Box(9282, 9282),
+  Box(9283, 9283),
+  Box(9284, 9284),
+  Box(9285, 9285),
+  Box(9286, 9286),
+  Box(9287, 9287),
+  Box(9288, 9288),
+  Box(9289, 9289),
+  Box(9290, 9290),
+  Box(9291, 9291),
+  Box(9292, 9292),
+  Box(9293, 9293),
+  Box(9294, 9294),
+  Box(9295, 9295),
+  Box(9296, 9296),
+  Box(9297, 9297),
+  Box(9298, 9298),
+  Box(9299, 9299),
+  Box(9300, 9300),
+  Box(9301, 9301),
+  Box(9302, 9302),
+  Box(9303, 9303),
+  Box(9304, 9304),
+  Box(9305, 9305),
+  Box(9306, 9306),
+  Box(9307, 9307),
+  Box(9308, 9308),
+  Box(9309, 9309),
+  Box(9310, 9310),
+  Box(9311, 9311),
+  Box(9312, 9312),
+  Box(9313, 9313),
+  Box(9314, 9314),
+  Box(9315, 9315),
+  Box(9316, 9316),
+  Box(9317, 9317),
+  Box(9318, 9318),
+  Box(9319, 9319),
+  Box(9320, 9320),
+  Box(9321, 9321),
+  Box(9322, 9322),
+  Box(9323, 9323),
+  Box(9324, 9324),
+  Box(9325, 9325),
+  Box(9326, 9326),
+  Box(9327, 9327),
+  Box(9328, 9328),
+  Box(9329, 9329),
+  Box(9330, 9330),
+  Box(9331, 9331),
+  Box(9332, 9332),
+  Box(9333, 9333),
+  Box(9334, 9334),
+  Box(9335, 9335),
+  Box(9336, 9336),
+  Box(9337, 9337),
+  Box(9338, 9338),
+  Box(9339, 9339),
+  Box(9340, 9340),
+  Box(9341, 9341),
+  Box(9342, 9342),
+  Box(9343, 9343),
+  Box(9344, 9344),
+  Box(9345, 9345),
+  Box(9346, 9346),
+  Box(9347, 9347),
+  Box(9348, 9348),
+  Box(9349, 9349),
+  Box(9350, 9350),
+  Box(9351, 9351),
+  Box(9352, 9352),
+  Box(9353, 9353),
+  Box(9354, 9354),
+  Box(9355, 9355),
+  Box(9356, 9356),
+  Box(9357, 9357),
+  Box(9358, 9358),
+  Box(9359, 9359),
+  Box(9360, 9360),
+  Box(9361, 9361),
+  Box(9362, 9362),
+  Box(9363, 9363),
+  Box(9364, 9364),
+  Box(9365, 9365),
+  Box(9366, 9366),
+  Box(9367, 9367),
+  Box(9368, 9368),
+  Box(9369, 9369),
+  Box(9370, 9370),
+  Box(9371, 9371),
+  Box(9372, 9372),
+  Box(9373, 9373),
+  Box(9374, 9374),
+  Box(9375, 9375),
+  Box(9376, 9376),
+  Box(9377, 9377),
+  Box(9378, 9378),
+  Box(9379, 9379),
+  Box(9380, 9380),
+  Box(9381, 9381),
+  Box(9382, 9382),
+  Box(9383, 9383),
+  Box(9384, 9384),
+  Box(9385, 9385),
+  Box(9386, 9386),
+  Box(9387, 9387),
+  Box(9388, 9388),
+  Box(9389, 9389),
+  Box(9390, 9390),
+  Box(9391, 9391),
+  Box(9392, 9392),
+  Box(9393, 9393),
+  Box(9394, 9394),
+  Box(9395, 9395),
+  Box(9396, 9396),
+  Box(9397, 9397),
+  Box(9398, 9398),
+  Box(9399, 9399),
+  Box(9400, 9400),
+  Box(9401, 9401),
+  Box(9402, 9402),
+  Box(9403, 9403),
+  Box(9404, 9404),
+  Box(9405, 9405),
+  Box(9406, 9406),
+  Box(9407, 9407),
+  Box(9408, 9408),
+  Box(9409, 9409),
+  Box(9410, 9410),
+  Box(9411, 9411),
+  Box(9412, 9412),
+  Box(9413, 9413),
+  Box(9414, 9414),
+  Box(9415, 9415),
+  Box(9416, 9416),
+  Box(9417, 9417),
+  Box(9418, 9418),
+  Box(9419, 9419),
+  Box(9420, 9420),
+  Box(9421, 9421),
+  Box(9422, 9422),
+  Box(9423, 9423),
+  Box(9424, 9424),
+  Box(9425, 9425),
+  Box(9426, 9426),
+  Box(9427, 9427),
+  Box(9428, 9428),
+  Box(9429, 9429),
+  Box(9430, 9430),
+  Box(9431, 9431),
+  Box(9432, 9432),
+  Box(9433, 9433),
+  Box(9434, 9434),
+  Box(9435, 9435),
+  Box(9436, 9436),
+  Box(9437, 9437),
+  Box(9438, 9438),
+  Box(9439, 9439),
+  Box(9440, 9440),
+  Box(9441, 9441),
+  Box(9442, 9442),
+  Box(9443, 9443),
+  Box(9444, 9444),
+  Box(9445, 9445),
+  Box(9446, 9446),
+  Box(9447, 9447),
+  Box(9448, 9448),
+  Box(9449, 9449),
+  Box(9450, 9450),
+  Box(9451, 9451),
+  Box(9452, 9452),
+  Box(9453, 9453),
+  Box(9454, 9454),
+  Box(9455, 9455),
+  Box(9456, 9456),
+  Box(9457, 9457),
+  Box(9458, 9458),
+  Box(9459, 9459),
+  Box(9460, 9460),
+  Box(9461, 9461),
+  Box(9462, 9462),
+  Box(9463, 9463),
+  Box(9464, 9464),
+  Box(9465, 9465),
+  Box(9466, 9466),
+  Box(9467, 9467),
+  Box(9468, 9468),
+  Box(9469, 9469),
+  Box(9470, 9470),
+  Box(9471, 9471),
+  Box(9472, 9472),
+  Box(9473, 9473),
+  Box(9474, 9474),
+  Box(9475, 9475),
+  Box(9476, 9476),
+  Box(9477, 9477),
+  Box(9478, 9478),
+  Box(9479, 9479),
+  Box(9480, 9480),
+  Box(9481, 9481),
+  Box(9482, 9482),
+  Box(9483, 9483),
+  Box(9484, 9484),
+  Box(9485, 9485),
+  Box(9486, 9486),
+  Box(9487, 9487),
+  Box(9488, 9488),
+  Box(9489, 9489),
+  Box(9490, 9490),
+  Box(9491, 9491),
+  Box(9492, 9492),
+  Box(9493, 9493),
+  Box(9494, 9494),
+  Box(9495, 9495),
+  Box(9496, 9496),
+  Box(9497, 9497),
+  Box(9498, 9498),
+  Box(9499, 9499),
+  Box(9500, 9500),
+  Box(9501, 9501),
+  Box(9502, 9502),
+  Box(9503, 9503),
+  Box(9504, 9504),
+  Box(9505, 9505),
+  Box(9506, 9506),
+  Box(9507, 9507),
+  Box(9508, 9508),
+  Box(9509, 9509),
+  Box(9510, 9510),
+  Box(9511, 9511),
+  Box(9512, 9512),
+  Box(9513, 9513),
+  Box(9514, 9514),
+  Box(9515, 9515),
+  Box(9516, 9516),
+  Box(9517, 9517),
+  Box(9518, 9518),
+  Box(9519, 9519),
+  Box(9520, 9520),
+  Box(9521, 9521),
+  Box(9522, 9522),
+  Box(9523, 9523),
+  Box(9524, 9524),
+  Box(9525, 9525),
+  Box(9526, 9526),
+  Box(9527, 9527),
+  Box(9528, 9528),
+  Box(9529, 9529),
+  Box(9530, 9530),
+  Box(9531, 9531),
+  Box(9532, 9532),
+  Box(9533, 9533),
+  Box(9534, 9534),
+  Box(9535, 9535),
+  Box(9536, 9536),
+  Box(9537, 9537),
+  Box(9538, 9538),
+  Box(9539, 9539),
+  Box(9540, 9540),
+  Box(9541, 9541),
+  Box(9542, 9542),
+  Box(9543, 9543),
+  Box(9544, 9544),
+  Box(9545, 9545),
+  Box(9546, 9546),
+  Box(9547, 9547),
+  Box(9548, 9548),
+  Box(9549, 9549),
+  Box(9550, 9550),
+  Box(9551, 9551),
+  Box(9552, 9552),
+  Box(9553, 9553),
+  Box(9554, 9554),
+  Box(9555, 9555),
+  Box(9556, 9556),
+  Box(9557, 9557),
+  Box(9558, 9558),
+  Box(9559, 9559),
+  Box(9560, 9560),
+  Box(9561, 9561),
+  Box(9562, 9562),
+  Box(9563, 9563),
+  Box(9564, 9564),
+  Box(9565, 9565),
+  Box(9566, 9566),
+  Box(9567, 9567),
+  Box(9568, 9568),
+  Box(9569, 9569),
+  Box(9570, 9570),
+  Box(9571, 9571),
+  Box(9572, 9572),
+  Box(9573, 9573),
+  Box(9574, 9574),
+  Box(9575, 9575),
+  Box(9576, 9576),
+  Box(9577, 9577),
+  Box(9578, 9578),
+  Box(9579, 9579),
+  Box(9580, 9580),
+  Box(9581, 9581),
+  Box(9582, 9582),
+  Box(9583, 9583),
+  Box(9584, 9584),
+  Box(9585, 9585),
+  Box(9586, 9586),
+  Box(9587, 9587),
+  Box(9588, 9588),
+  Box(9589, 9589),
+  Box(9590, 9590),
+  Box(9591, 9591),
+  Box(9592, 9592),
+  Box(9593, 9593),
+  Box(9594, 9594),
+  Box(9595, 9595),
+  Box(9596, 9596),
+  Box(9597, 9597),
+  Box(9598, 9598),
+  Box(9599, 9599),
+  Box(9600, 9600),
+  Box(9601, 9601),
+  Box(9602, 9602),
+  Box(9603, 9603),
+  Box(9604, 9604),
+  Box(9605, 9605),
+  Box(9606, 9606),
+  Box(9607, 9607),
+  Box(9608, 9608),
+  Box(9609, 9609),
+  Box(9610, 9610),
+  Box(9611, 9611),
+  Box(9612, 9612),
+  Box(9613, 9613),
+  Box(9614, 9614),
+  Box(9615, 9615),
+  Box(9616, 9616),
+  Box(9617, 9617),
+  Box(9618, 9618),
+  Box(9619, 9619),
+  Box(9620, 9620),
+  Box(9621, 9621),
+  Box(9622, 9622),
+  Box(9623, 9623),
+  Box(9624, 9624),
+  Box(9625, 9625),
+  Box(9626, 9626),
+  Box(9627, 9627),
+  Box(9628, 9628),
+  Box(9629, 9629),
+  Box(9630, 9630),
+  Box(9631, 9631),
+  Box(9632, 9632),
+  Box(9633, 9633),
+  Box(9634, 9634),
+  Box(9635, 9635),
+  Box(9636, 9636),
+  Box(9637, 9637),
+  Box(9638, 9638),
+  Box(9639, 9639),
+  Box(9640, 9640),
+  Box(9641, 9641),
+  Box(9642, 9642),
+  Box(9643, 9643),
+  Box(9644, 9644),
+  Box(9645, 9645),
+  Box(9646, 9646),
+  Box(9647, 9647),
+  Box(9648, 9648),
+  Box(9649, 9649),
+  Box(9650, 9650),
+  Box(9651, 9651),
+  Box(9652, 9652),
+  Box(9653, 9653),
+  Box(9654, 9654),
+  Box(9655, 9655),
+  Box(9656, 9656),
+  Box(9657, 9657),
+  Box(9658, 9658),
+  Box(9659, 9659),
+  Box(9660, 9660),
+  Box(9661, 9661),
+  Box(9662, 9662),
+  Box(9663, 9663),
+  Box(9664, 9664),
+  Box(9665, 9665),
+  Box(9666, 9666),
+  Box(9667, 9667),
+  Box(9668, 9668),
+  Box(9669, 9669),
+  Box(9670, 9670),
+  Box(9671, 9671),
+  Box(9672, 9672),
+  Box(9673, 9673),
+  Box(9674, 9674),
+  Box(9675, 9675),
+  Box(9676, 9676),
+  Box(9677, 9677),
+  Box(9678, 9678),
+  Box(9679, 9679),
+  Box(9680, 9680),
+  Box(9681, 9681),
+  Box(9682, 9682),
+  Box(9683, 9683),
+  Box(9684, 9684),
+  Box(9685, 9685),
+  Box(9686, 9686),
+  Box(9687, 9687),
+  Box(9688, 9688),
+  Box(9689, 9689),
+  Box(9690, 9690),
+  Box(9691, 9691),
+  Box(9692, 9692),
+  Box(9693, 9693),
+  Box(9694, 9694),
+  Box(9695, 9695),
+  Box(9696, 9696),
+  Box(9697, 9697),
+  Box(9698, 9698),
+  Box(9699, 9699),
+  Box(9700, 9700),
+  Box(9701, 9701),
+  Box(9702, 9702),
+  Box(9703, 9703),
+  Box(9704, 9704),
+  Box(9705, 9705),
+  Box(9706, 9706),
+  Box(9707, 9707),
+  Box(9708, 9708),
+  Box(9709, 9709),
+  Box(9710, 9710),
+  Box(9711, 9711),
+  Box(9712, 9712),
+  Box(9713, 9713),
+  Box(9714, 9714),
+  Box(9715, 9715),
+  Box(9716, 9716),
+  Box(9717, 9717),
+  Box(9718, 9718),
+  Box(9719, 9719),
+  Box(9720, 9720),
+  Box(9721, 9721),
+  Box(9722, 9722),
+  Box(9723, 9723),
+  Box(9724, 9724),
+  Box(9725, 9725),
+  Box(9726, 9726),
+  Box(9727, 9727),
+  Box(9728, 9728),
+  Box(9729, 9729),
+  Box(9730, 9730),
+  Box(9731, 9731),
+  Box(9732, 9732),
+  Box(9733, 9733),
+  Box(9734, 9734),
+  Box(9735, 9735),
+  Box(9736, 9736),
+  Box(9737, 9737),
+  Box(9738, 9738),
+  Box(9739, 9739),
+  Box(9740, 9740),
+  Box(9741, 9741),
+  Box(9742, 9742),
+  Box(9743, 9743),
+  Box(9744, 9744),
+  Box(9745, 9745),
+  Box(9746, 9746),
+  Box(9747, 9747),
+  Box(9748, 9748),
+  Box(9749, 9749),
+  Box(9750, 9750),
+  Box(9751, 9751),
+  Box(9752, 9752),
+  Box(9753, 9753),
+  Box(9754, 9754),
+  Box(9755, 9755),
+  Box(9756, 9756),
+  Box(9757, 9757),
+  Box(9758, 9758),
+  Box(9759, 9759),
+  Box(9760, 9760),
+  Box(9761, 9761),
+  Box(9762, 9762),
+  Box(9763, 9763),
+  Box(9764, 9764),
+  Box(9765, 9765),
+  Box(9766, 9766),
+  Box(9767, 9767),
+  Box(9768, 9768),
+  Box(9769, 9769),
+  Box(9770, 9770),
+  Box(9771, 9771),
+  Box(9772, 9772),
+  Box(9773, 9773),
+  Box(9774, 9774),
+  Box(9775, 9775),
+  Box(9776, 9776),
+  Box(9777, 9777),
+  Box(9778, 9778),
+  Box(9779, 9779),
+  Box(9780, 9780),
+  Box(9781, 9781),
+  Box(9782, 9782),
+  Box(9783, 9783),
+  Box(9784, 9784),
+  Box(9785, 9785),
+  Box(9786, 9786),
+  Box(9787, 9787),
+  Box(9788, 9788),
+  Box(9789, 9789),
+  Box(9790, 9790),
+  Box(9791, 9791),
+  Box(9792, 9792),
+  Box(9793, 9793),
+  Box(9794, 9794),
+  Box(9795, 9795),
+  Box(9796, 9796),
+  Box(9797, 9797),
+  Box(9798, 9798),
+  Box(9799, 9799),
+  Box(9800, 9800),
+  Box(9801, 9801),
+  Box(9802, 9802),
+  Box(9803, 9803),
+  Box(9804, 9804),
+  Box(9805, 9805),
+  Box(9806, 9806),
+  Box(9807, 9807),
+  Box(9808, 9808),
+  Box(9809, 9809),
+  Box(9810, 9810),
+  Box(9811, 9811),
+  Box(9812, 9812),
+  Box(9813, 9813),
+  Box(9814, 9814),
+  Box(9815, 9815),
+  Box(9816, 9816),
+  Box(9817, 9817),
+  Box(9818, 9818),
+  Box(9819, 9819),
+  Box(9820, 9820),
+  Box(9821, 9821),
+  Box(9822, 9822),
+  Box(9823, 9823),
+  Box(9824, 9824),
+  Box(9825, 9825),
+  Box(9826, 9826),
+  Box(9827, 9827),
+  Box(9828, 9828),
+  Box(9829, 9829),
+  Box(9830, 9830),
+  Box(9831, 9831),
+  Box(9832, 9832),
+  Box(9833, 9833),
+  Box(9834, 9834),
+  Box(9835, 9835),
+  Box(9836, 9836),
+  Box(9837, 9837),
+  Box(9838, 9838),
+  Box(9839, 9839),
+  Box(9840, 9840),
+  Box(9841, 9841),
+  Box(9842, 9842),
+  Box(9843, 9843),
+  Box(9844, 9844),
+  Box(9845, 9845),
+  Box(9846, 9846),
+  Box(9847, 9847),
+  Box(9848, 9848),
+  Box(9849, 9849),
+  Box(9850, 9850),
+  Box(9851, 9851),
+  Box(9852, 9852),
+  Box(9853, 9853),
+  Box(9854, 9854),
+  Box(9855, 9855),
+  Box(9856, 9856),
+  Box(9857, 9857),
+  Box(9858, 9858),
+  Box(9859, 9859),
+  Box(9860, 9860),
+  Box(9861, 9861),
+  Box(9862, 9862),
+  Box(9863, 9863),
+  Box(9864, 9864),
+  Box(9865, 9865),
+  Box(9866, 9866),
+  Box(9867, 9867),
+  Box(9868, 9868),
+  Box(9869, 9869),
+  Box(9870, 9870),
+  Box(9871, 9871),
+  Box(9872, 9872),
+  Box(9873, 9873),
+  Box(9874, 9874),
+  Box(9875, 9875),
+  Box(9876, 9876),
+  Box(9877, 9877),
+  Box(9878, 9878),
+  Box(9879, 9879),
+  Box(9880, 9880),
+  Box(9881, 9881),
+  Box(9882, 9882),
+  Box(9883, 9883),
+  Box(9884, 9884),
+  Box(9885, 9885),
+  Box(9886, 9886),
+  Box(9887, 9887),
+  Box(9888, 9888),
+  Box(9889, 9889),
+  Box(9890, 9890),
+  Box(9891, 9891),
+  Box(9892, 9892),
+  Box(9893, 9893),
+  Box(9894, 9894),
+  Box(9895, 9895),
+  Box(9896, 9896),
+  Box(9897, 9897),
+  Box(9898, 9898),
+  Box(9899, 9899),
+  Box(9900, 9900),
+  Box(9901, 9901),
+  Box(9902, 9902),
+  Box(9903, 9903),
+  Box(9904, 9904),
+  Box(9905, 9905),
+  Box(9906, 9906),
+  Box(9907, 9907),
+  Box(9908, 9908),
+  Box(9909, 9909),
+  Box(9910, 9910),
+  Box(9911, 9911),
+  Box(9912, 9912),
+  Box(9913, 9913),
+  Box(9914, 9914),
+  Box(9915, 9915),
+  Box(9916, 9916),
+  Box(9917, 9917),
+  Box(9918, 9918),
+  Box(9919, 9919),
+  Box(9920, 9920),
+  Box(9921, 9921),
+  Box(9922, 9922),
+  Box(9923, 9923),
+  Box(9924, 9924),
+  Box(9925, 9925),
+  Box(9926, 9926),
+  Box(9927, 9927),
+  Box(9928, 9928),
+  Box(9929, 9929),
+  Box(9930, 9930),
+  Box(9931, 9931),
+  Box(9932, 9932),
+  Box(9933, 9933),
+  Box(9934, 9934),
+  Box(9935, 9935),
+  Box(9936, 9936),
+  Box(9937, 9937),
+  Box(9938, 9938),
+  Box(9939, 9939),
+  Box(9940, 9940),
+  Box(9941, 9941),
+  Box(9942, 9942),
+  Box(9943, 9943),
+  Box(9944, 9944),
+  Box(9945, 9945),
+  Box(9946, 9946),
+  Box(9947, 9947),
+  Box(9948, 9948),
+  Box(9949, 9949),
+  Box(9950, 9950),
+  Box(9951, 9951),
+  Box(9952, 9952),
+  Box(9953, 9953),
+  Box(9954, 9954),
+  Box(9955, 9955),
+  Box(9956, 9956),
+  Box(9957, 9957),
+  Box(9958, 9958),
+  Box(9959, 9959),
+  Box(9960, 9960),
+  Box(9961, 9961),
+  Box(9962, 9962),
+  Box(9963, 9963),
+  Box(9964, 9964),
+  Box(9965, 9965),
+  Box(9966, 9966),
+  Box(9967, 9967),
+  Box(9968, 9968),
+  Box(9969, 9969),
+  Box(9970, 9970),
+  Box(9971, 9971),
+  Box(9972, 9972),
+  Box(9973, 9973),
+  Box(9974, 9974),
+  Box(9975, 9975),
+  Box(9976, 9976),
+  Box(9977, 9977),
+  Box(9978, 9978),
+  Box(9979, 9979),
+  Box(9980, 9980),
+  Box(9981, 9981),
+  Box(9982, 9982),
+  Box(9983, 9983),
+  Box(9984, 9984),
+  Box(9985, 9985),
+  Box(9986, 9986),
+  Box(9987, 9987),
+  Box(9988, 9988),
+  Box(9989, 9989),
+  Box(9990, 9990),
+  Box(9991, 9991),
+  Box(9992, 9992),
+  Box(9993, 9993),
+  Box(9994, 9994),
+  Box(9995, 9995),
+  Box(9996, 9996),
+  Box(9997, 9997),
+  Box(9998, 9998),
+  Box(9999, 9999),
+];
+
+confuse(x) {
+  try {
+    throw x;
+  } catch (e) {
+    return e;
+  }
+}
+
+main() {
+  if (!identical(confuse(list1), confuse(list2))) {
+    throw new Exception("list1 !== list2");
+  }
+}
diff --git a/tests/language_2/canonicalization_hashing_shallow_collision_instance_3_test.dart b/tests/language_2/canonicalization_hashing_shallow_collision_instance_3_test.dart
new file mode 100644
index 0000000..b806b6a
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_shallow_collision_instance_3_test.dart
@@ -0,0 +1,20034 @@
+// 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.
+
+// If canonicialization hashes with only a field's cid, this will exhibit
+// quadratic time.
+
+class Box {
+  final Object a;
+  final Object b;
+  const Box(this.a, this.b);
+}
+
+// 10,000 elements.
+const list1 = [
+  Box(Box(0, 0), Box(0, 0)),
+  Box(Box(1, 1), Box(1, 1)),
+  Box(Box(2, 2), Box(2, 2)),
+  Box(Box(3, 3), Box(3, 3)),
+  Box(Box(4, 4), Box(4, 4)),
+  Box(Box(5, 5), Box(5, 5)),
+  Box(Box(6, 6), Box(6, 6)),
+  Box(Box(7, 7), Box(7, 7)),
+  Box(Box(8, 8), Box(8, 8)),
+  Box(Box(9, 9), Box(9, 9)),
+  Box(Box(10, 10), Box(10, 10)),
+  Box(Box(11, 11), Box(11, 11)),
+  Box(Box(12, 12), Box(12, 12)),
+  Box(Box(13, 13), Box(13, 13)),
+  Box(Box(14, 14), Box(14, 14)),
+  Box(Box(15, 15), Box(15, 15)),
+  Box(Box(16, 16), Box(16, 16)),
+  Box(Box(17, 17), Box(17, 17)),
+  Box(Box(18, 18), Box(18, 18)),
+  Box(Box(19, 19), Box(19, 19)),
+  Box(Box(20, 20), Box(20, 20)),
+  Box(Box(21, 21), Box(21, 21)),
+  Box(Box(22, 22), Box(22, 22)),
+  Box(Box(23, 23), Box(23, 23)),
+  Box(Box(24, 24), Box(24, 24)),
+  Box(Box(25, 25), Box(25, 25)),
+  Box(Box(26, 26), Box(26, 26)),
+  Box(Box(27, 27), Box(27, 27)),
+  Box(Box(28, 28), Box(28, 28)),
+  Box(Box(29, 29), Box(29, 29)),
+  Box(Box(30, 30), Box(30, 30)),
+  Box(Box(31, 31), Box(31, 31)),
+  Box(Box(32, 32), Box(32, 32)),
+  Box(Box(33, 33), Box(33, 33)),
+  Box(Box(34, 34), Box(34, 34)),
+  Box(Box(35, 35), Box(35, 35)),
+  Box(Box(36, 36), Box(36, 36)),
+  Box(Box(37, 37), Box(37, 37)),
+  Box(Box(38, 38), Box(38, 38)),
+  Box(Box(39, 39), Box(39, 39)),
+  Box(Box(40, 40), Box(40, 40)),
+  Box(Box(41, 41), Box(41, 41)),
+  Box(Box(42, 42), Box(42, 42)),
+  Box(Box(43, 43), Box(43, 43)),
+  Box(Box(44, 44), Box(44, 44)),
+  Box(Box(45, 45), Box(45, 45)),
+  Box(Box(46, 46), Box(46, 46)),
+  Box(Box(47, 47), Box(47, 47)),
+  Box(Box(48, 48), Box(48, 48)),
+  Box(Box(49, 49), Box(49, 49)),
+  Box(Box(50, 50), Box(50, 50)),
+  Box(Box(51, 51), Box(51, 51)),
+  Box(Box(52, 52), Box(52, 52)),
+  Box(Box(53, 53), Box(53, 53)),
+  Box(Box(54, 54), Box(54, 54)),
+  Box(Box(55, 55), Box(55, 55)),
+  Box(Box(56, 56), Box(56, 56)),
+  Box(Box(57, 57), Box(57, 57)),
+  Box(Box(58, 58), Box(58, 58)),
+  Box(Box(59, 59), Box(59, 59)),
+  Box(Box(60, 60), Box(60, 60)),
+  Box(Box(61, 61), Box(61, 61)),
+  Box(Box(62, 62), Box(62, 62)),
+  Box(Box(63, 63), Box(63, 63)),
+  Box(Box(64, 64), Box(64, 64)),
+  Box(Box(65, 65), Box(65, 65)),
+  Box(Box(66, 66), Box(66, 66)),
+  Box(Box(67, 67), Box(67, 67)),
+  Box(Box(68, 68), Box(68, 68)),
+  Box(Box(69, 69), Box(69, 69)),
+  Box(Box(70, 70), Box(70, 70)),
+  Box(Box(71, 71), Box(71, 71)),
+  Box(Box(72, 72), Box(72, 72)),
+  Box(Box(73, 73), Box(73, 73)),
+  Box(Box(74, 74), Box(74, 74)),
+  Box(Box(75, 75), Box(75, 75)),
+  Box(Box(76, 76), Box(76, 76)),
+  Box(Box(77, 77), Box(77, 77)),
+  Box(Box(78, 78), Box(78, 78)),
+  Box(Box(79, 79), Box(79, 79)),
+  Box(Box(80, 80), Box(80, 80)),
+  Box(Box(81, 81), Box(81, 81)),
+  Box(Box(82, 82), Box(82, 82)),
+  Box(Box(83, 83), Box(83, 83)),
+  Box(Box(84, 84), Box(84, 84)),
+  Box(Box(85, 85), Box(85, 85)),
+  Box(Box(86, 86), Box(86, 86)),
+  Box(Box(87, 87), Box(87, 87)),
+  Box(Box(88, 88), Box(88, 88)),
+  Box(Box(89, 89), Box(89, 89)),
+  Box(Box(90, 90), Box(90, 90)),
+  Box(Box(91, 91), Box(91, 91)),
+  Box(Box(92, 92), Box(92, 92)),
+  Box(Box(93, 93), Box(93, 93)),
+  Box(Box(94, 94), Box(94, 94)),
+  Box(Box(95, 95), Box(95, 95)),
+  Box(Box(96, 96), Box(96, 96)),
+  Box(Box(97, 97), Box(97, 97)),
+  Box(Box(98, 98), Box(98, 98)),
+  Box(Box(99, 99), Box(99, 99)),
+  Box(Box(100, 100), Box(100, 100)),
+  Box(Box(101, 101), Box(101, 101)),
+  Box(Box(102, 102), Box(102, 102)),
+  Box(Box(103, 103), Box(103, 103)),
+  Box(Box(104, 104), Box(104, 104)),
+  Box(Box(105, 105), Box(105, 105)),
+  Box(Box(106, 106), Box(106, 106)),
+  Box(Box(107, 107), Box(107, 107)),
+  Box(Box(108, 108), Box(108, 108)),
+  Box(Box(109, 109), Box(109, 109)),
+  Box(Box(110, 110), Box(110, 110)),
+  Box(Box(111, 111), Box(111, 111)),
+  Box(Box(112, 112), Box(112, 112)),
+  Box(Box(113, 113), Box(113, 113)),
+  Box(Box(114, 114), Box(114, 114)),
+  Box(Box(115, 115), Box(115, 115)),
+  Box(Box(116, 116), Box(116, 116)),
+  Box(Box(117, 117), Box(117, 117)),
+  Box(Box(118, 118), Box(118, 118)),
+  Box(Box(119, 119), Box(119, 119)),
+  Box(Box(120, 120), Box(120, 120)),
+  Box(Box(121, 121), Box(121, 121)),
+  Box(Box(122, 122), Box(122, 122)),
+  Box(Box(123, 123), Box(123, 123)),
+  Box(Box(124, 124), Box(124, 124)),
+  Box(Box(125, 125), Box(125, 125)),
+  Box(Box(126, 126), Box(126, 126)),
+  Box(Box(127, 127), Box(127, 127)),
+  Box(Box(128, 128), Box(128, 128)),
+  Box(Box(129, 129), Box(129, 129)),
+  Box(Box(130, 130), Box(130, 130)),
+  Box(Box(131, 131), Box(131, 131)),
+  Box(Box(132, 132), Box(132, 132)),
+  Box(Box(133, 133), Box(133, 133)),
+  Box(Box(134, 134), Box(134, 134)),
+  Box(Box(135, 135), Box(135, 135)),
+  Box(Box(136, 136), Box(136, 136)),
+  Box(Box(137, 137), Box(137, 137)),
+  Box(Box(138, 138), Box(138, 138)),
+  Box(Box(139, 139), Box(139, 139)),
+  Box(Box(140, 140), Box(140, 140)),
+  Box(Box(141, 141), Box(141, 141)),
+  Box(Box(142, 142), Box(142, 142)),
+  Box(Box(143, 143), Box(143, 143)),
+  Box(Box(144, 144), Box(144, 144)),
+  Box(Box(145, 145), Box(145, 145)),
+  Box(Box(146, 146), Box(146, 146)),
+  Box(Box(147, 147), Box(147, 147)),
+  Box(Box(148, 148), Box(148, 148)),
+  Box(Box(149, 149), Box(149, 149)),
+  Box(Box(150, 150), Box(150, 150)),
+  Box(Box(151, 151), Box(151, 151)),
+  Box(Box(152, 152), Box(152, 152)),
+  Box(Box(153, 153), Box(153, 153)),
+  Box(Box(154, 154), Box(154, 154)),
+  Box(Box(155, 155), Box(155, 155)),
+  Box(Box(156, 156), Box(156, 156)),
+  Box(Box(157, 157), Box(157, 157)),
+  Box(Box(158, 158), Box(158, 158)),
+  Box(Box(159, 159), Box(159, 159)),
+  Box(Box(160, 160), Box(160, 160)),
+  Box(Box(161, 161), Box(161, 161)),
+  Box(Box(162, 162), Box(162, 162)),
+  Box(Box(163, 163), Box(163, 163)),
+  Box(Box(164, 164), Box(164, 164)),
+  Box(Box(165, 165), Box(165, 165)),
+  Box(Box(166, 166), Box(166, 166)),
+  Box(Box(167, 167), Box(167, 167)),
+  Box(Box(168, 168), Box(168, 168)),
+  Box(Box(169, 169), Box(169, 169)),
+  Box(Box(170, 170), Box(170, 170)),
+  Box(Box(171, 171), Box(171, 171)),
+  Box(Box(172, 172), Box(172, 172)),
+  Box(Box(173, 173), Box(173, 173)),
+  Box(Box(174, 174), Box(174, 174)),
+  Box(Box(175, 175), Box(175, 175)),
+  Box(Box(176, 176), Box(176, 176)),
+  Box(Box(177, 177), Box(177, 177)),
+  Box(Box(178, 178), Box(178, 178)),
+  Box(Box(179, 179), Box(179, 179)),
+  Box(Box(180, 180), Box(180, 180)),
+  Box(Box(181, 181), Box(181, 181)),
+  Box(Box(182, 182), Box(182, 182)),
+  Box(Box(183, 183), Box(183, 183)),
+  Box(Box(184, 184), Box(184, 184)),
+  Box(Box(185, 185), Box(185, 185)),
+  Box(Box(186, 186), Box(186, 186)),
+  Box(Box(187, 187), Box(187, 187)),
+  Box(Box(188, 188), Box(188, 188)),
+  Box(Box(189, 189), Box(189, 189)),
+  Box(Box(190, 190), Box(190, 190)),
+  Box(Box(191, 191), Box(191, 191)),
+  Box(Box(192, 192), Box(192, 192)),
+  Box(Box(193, 193), Box(193, 193)),
+  Box(Box(194, 194), Box(194, 194)),
+  Box(Box(195, 195), Box(195, 195)),
+  Box(Box(196, 196), Box(196, 196)),
+  Box(Box(197, 197), Box(197, 197)),
+  Box(Box(198, 198), Box(198, 198)),
+  Box(Box(199, 199), Box(199, 199)),
+  Box(Box(200, 200), Box(200, 200)),
+  Box(Box(201, 201), Box(201, 201)),
+  Box(Box(202, 202), Box(202, 202)),
+  Box(Box(203, 203), Box(203, 203)),
+  Box(Box(204, 204), Box(204, 204)),
+  Box(Box(205, 205), Box(205, 205)),
+  Box(Box(206, 206), Box(206, 206)),
+  Box(Box(207, 207), Box(207, 207)),
+  Box(Box(208, 208), Box(208, 208)),
+  Box(Box(209, 209), Box(209, 209)),
+  Box(Box(210, 210), Box(210, 210)),
+  Box(Box(211, 211), Box(211, 211)),
+  Box(Box(212, 212), Box(212, 212)),
+  Box(Box(213, 213), Box(213, 213)),
+  Box(Box(214, 214), Box(214, 214)),
+  Box(Box(215, 215), Box(215, 215)),
+  Box(Box(216, 216), Box(216, 216)),
+  Box(Box(217, 217), Box(217, 217)),
+  Box(Box(218, 218), Box(218, 218)),
+  Box(Box(219, 219), Box(219, 219)),
+  Box(Box(220, 220), Box(220, 220)),
+  Box(Box(221, 221), Box(221, 221)),
+  Box(Box(222, 222), Box(222, 222)),
+  Box(Box(223, 223), Box(223, 223)),
+  Box(Box(224, 224), Box(224, 224)),
+  Box(Box(225, 225), Box(225, 225)),
+  Box(Box(226, 226), Box(226, 226)),
+  Box(Box(227, 227), Box(227, 227)),
+  Box(Box(228, 228), Box(228, 228)),
+  Box(Box(229, 229), Box(229, 229)),
+  Box(Box(230, 230), Box(230, 230)),
+  Box(Box(231, 231), Box(231, 231)),
+  Box(Box(232, 232), Box(232, 232)),
+  Box(Box(233, 233), Box(233, 233)),
+  Box(Box(234, 234), Box(234, 234)),
+  Box(Box(235, 235), Box(235, 235)),
+  Box(Box(236, 236), Box(236, 236)),
+  Box(Box(237, 237), Box(237, 237)),
+  Box(Box(238, 238), Box(238, 238)),
+  Box(Box(239, 239), Box(239, 239)),
+  Box(Box(240, 240), Box(240, 240)),
+  Box(Box(241, 241), Box(241, 241)),
+  Box(Box(242, 242), Box(242, 242)),
+  Box(Box(243, 243), Box(243, 243)),
+  Box(Box(244, 244), Box(244, 244)),
+  Box(Box(245, 245), Box(245, 245)),
+  Box(Box(246, 246), Box(246, 246)),
+  Box(Box(247, 247), Box(247, 247)),
+  Box(Box(248, 248), Box(248, 248)),
+  Box(Box(249, 249), Box(249, 249)),
+  Box(Box(250, 250), Box(250, 250)),
+  Box(Box(251, 251), Box(251, 251)),
+  Box(Box(252, 252), Box(252, 252)),
+  Box(Box(253, 253), Box(253, 253)),
+  Box(Box(254, 254), Box(254, 254)),
+  Box(Box(255, 255), Box(255, 255)),
+  Box(Box(256, 256), Box(256, 256)),
+  Box(Box(257, 257), Box(257, 257)),
+  Box(Box(258, 258), Box(258, 258)),
+  Box(Box(259, 259), Box(259, 259)),
+  Box(Box(260, 260), Box(260, 260)),
+  Box(Box(261, 261), Box(261, 261)),
+  Box(Box(262, 262), Box(262, 262)),
+  Box(Box(263, 263), Box(263, 263)),
+  Box(Box(264, 264), Box(264, 264)),
+  Box(Box(265, 265), Box(265, 265)),
+  Box(Box(266, 266), Box(266, 266)),
+  Box(Box(267, 267), Box(267, 267)),
+  Box(Box(268, 268), Box(268, 268)),
+  Box(Box(269, 269), Box(269, 269)),
+  Box(Box(270, 270), Box(270, 270)),
+  Box(Box(271, 271), Box(271, 271)),
+  Box(Box(272, 272), Box(272, 272)),
+  Box(Box(273, 273), Box(273, 273)),
+  Box(Box(274, 274), Box(274, 274)),
+  Box(Box(275, 275), Box(275, 275)),
+  Box(Box(276, 276), Box(276, 276)),
+  Box(Box(277, 277), Box(277, 277)),
+  Box(Box(278, 278), Box(278, 278)),
+  Box(Box(279, 279), Box(279, 279)),
+  Box(Box(280, 280), Box(280, 280)),
+  Box(Box(281, 281), Box(281, 281)),
+  Box(Box(282, 282), Box(282, 282)),
+  Box(Box(283, 283), Box(283, 283)),
+  Box(Box(284, 284), Box(284, 284)),
+  Box(Box(285, 285), Box(285, 285)),
+  Box(Box(286, 286), Box(286, 286)),
+  Box(Box(287, 287), Box(287, 287)),
+  Box(Box(288, 288), Box(288, 288)),
+  Box(Box(289, 289), Box(289, 289)),
+  Box(Box(290, 290), Box(290, 290)),
+  Box(Box(291, 291), Box(291, 291)),
+  Box(Box(292, 292), Box(292, 292)),
+  Box(Box(293, 293), Box(293, 293)),
+  Box(Box(294, 294), Box(294, 294)),
+  Box(Box(295, 295), Box(295, 295)),
+  Box(Box(296, 296), Box(296, 296)),
+  Box(Box(297, 297), Box(297, 297)),
+  Box(Box(298, 298), Box(298, 298)),
+  Box(Box(299, 299), Box(299, 299)),
+  Box(Box(300, 300), Box(300, 300)),
+  Box(Box(301, 301), Box(301, 301)),
+  Box(Box(302, 302), Box(302, 302)),
+  Box(Box(303, 303), Box(303, 303)),
+  Box(Box(304, 304), Box(304, 304)),
+  Box(Box(305, 305), Box(305, 305)),
+  Box(Box(306, 306), Box(306, 306)),
+  Box(Box(307, 307), Box(307, 307)),
+  Box(Box(308, 308), Box(308, 308)),
+  Box(Box(309, 309), Box(309, 309)),
+  Box(Box(310, 310), Box(310, 310)),
+  Box(Box(311, 311), Box(311, 311)),
+  Box(Box(312, 312), Box(312, 312)),
+  Box(Box(313, 313), Box(313, 313)),
+  Box(Box(314, 314), Box(314, 314)),
+  Box(Box(315, 315), Box(315, 315)),
+  Box(Box(316, 316), Box(316, 316)),
+  Box(Box(317, 317), Box(317, 317)),
+  Box(Box(318, 318), Box(318, 318)),
+  Box(Box(319, 319), Box(319, 319)),
+  Box(Box(320, 320), Box(320, 320)),
+  Box(Box(321, 321), Box(321, 321)),
+  Box(Box(322, 322), Box(322, 322)),
+  Box(Box(323, 323), Box(323, 323)),
+  Box(Box(324, 324), Box(324, 324)),
+  Box(Box(325, 325), Box(325, 325)),
+  Box(Box(326, 326), Box(326, 326)),
+  Box(Box(327, 327), Box(327, 327)),
+  Box(Box(328, 328), Box(328, 328)),
+  Box(Box(329, 329), Box(329, 329)),
+  Box(Box(330, 330), Box(330, 330)),
+  Box(Box(331, 331), Box(331, 331)),
+  Box(Box(332, 332), Box(332, 332)),
+  Box(Box(333, 333), Box(333, 333)),
+  Box(Box(334, 334), Box(334, 334)),
+  Box(Box(335, 335), Box(335, 335)),
+  Box(Box(336, 336), Box(336, 336)),
+  Box(Box(337, 337), Box(337, 337)),
+  Box(Box(338, 338), Box(338, 338)),
+  Box(Box(339, 339), Box(339, 339)),
+  Box(Box(340, 340), Box(340, 340)),
+  Box(Box(341, 341), Box(341, 341)),
+  Box(Box(342, 342), Box(342, 342)),
+  Box(Box(343, 343), Box(343, 343)),
+  Box(Box(344, 344), Box(344, 344)),
+  Box(Box(345, 345), Box(345, 345)),
+  Box(Box(346, 346), Box(346, 346)),
+  Box(Box(347, 347), Box(347, 347)),
+  Box(Box(348, 348), Box(348, 348)),
+  Box(Box(349, 349), Box(349, 349)),
+  Box(Box(350, 350), Box(350, 350)),
+  Box(Box(351, 351), Box(351, 351)),
+  Box(Box(352, 352), Box(352, 352)),
+  Box(Box(353, 353), Box(353, 353)),
+  Box(Box(354, 354), Box(354, 354)),
+  Box(Box(355, 355), Box(355, 355)),
+  Box(Box(356, 356), Box(356, 356)),
+  Box(Box(357, 357), Box(357, 357)),
+  Box(Box(358, 358), Box(358, 358)),
+  Box(Box(359, 359), Box(359, 359)),
+  Box(Box(360, 360), Box(360, 360)),
+  Box(Box(361, 361), Box(361, 361)),
+  Box(Box(362, 362), Box(362, 362)),
+  Box(Box(363, 363), Box(363, 363)),
+  Box(Box(364, 364), Box(364, 364)),
+  Box(Box(365, 365), Box(365, 365)),
+  Box(Box(366, 366), Box(366, 366)),
+  Box(Box(367, 367), Box(367, 367)),
+  Box(Box(368, 368), Box(368, 368)),
+  Box(Box(369, 369), Box(369, 369)),
+  Box(Box(370, 370), Box(370, 370)),
+  Box(Box(371, 371), Box(371, 371)),
+  Box(Box(372, 372), Box(372, 372)),
+  Box(Box(373, 373), Box(373, 373)),
+  Box(Box(374, 374), Box(374, 374)),
+  Box(Box(375, 375), Box(375, 375)),
+  Box(Box(376, 376), Box(376, 376)),
+  Box(Box(377, 377), Box(377, 377)),
+  Box(Box(378, 378), Box(378, 378)),
+  Box(Box(379, 379), Box(379, 379)),
+  Box(Box(380, 380), Box(380, 380)),
+  Box(Box(381, 381), Box(381, 381)),
+  Box(Box(382, 382), Box(382, 382)),
+  Box(Box(383, 383), Box(383, 383)),
+  Box(Box(384, 384), Box(384, 384)),
+  Box(Box(385, 385), Box(385, 385)),
+  Box(Box(386, 386), Box(386, 386)),
+  Box(Box(387, 387), Box(387, 387)),
+  Box(Box(388, 388), Box(388, 388)),
+  Box(Box(389, 389), Box(389, 389)),
+  Box(Box(390, 390), Box(390, 390)),
+  Box(Box(391, 391), Box(391, 391)),
+  Box(Box(392, 392), Box(392, 392)),
+  Box(Box(393, 393), Box(393, 393)),
+  Box(Box(394, 394), Box(394, 394)),
+  Box(Box(395, 395), Box(395, 395)),
+  Box(Box(396, 396), Box(396, 396)),
+  Box(Box(397, 397), Box(397, 397)),
+  Box(Box(398, 398), Box(398, 398)),
+  Box(Box(399, 399), Box(399, 399)),
+  Box(Box(400, 400), Box(400, 400)),
+  Box(Box(401, 401), Box(401, 401)),
+  Box(Box(402, 402), Box(402, 402)),
+  Box(Box(403, 403), Box(403, 403)),
+  Box(Box(404, 404), Box(404, 404)),
+  Box(Box(405, 405), Box(405, 405)),
+  Box(Box(406, 406), Box(406, 406)),
+  Box(Box(407, 407), Box(407, 407)),
+  Box(Box(408, 408), Box(408, 408)),
+  Box(Box(409, 409), Box(409, 409)),
+  Box(Box(410, 410), Box(410, 410)),
+  Box(Box(411, 411), Box(411, 411)),
+  Box(Box(412, 412), Box(412, 412)),
+  Box(Box(413, 413), Box(413, 413)),
+  Box(Box(414, 414), Box(414, 414)),
+  Box(Box(415, 415), Box(415, 415)),
+  Box(Box(416, 416), Box(416, 416)),
+  Box(Box(417, 417), Box(417, 417)),
+  Box(Box(418, 418), Box(418, 418)),
+  Box(Box(419, 419), Box(419, 419)),
+  Box(Box(420, 420), Box(420, 420)),
+  Box(Box(421, 421), Box(421, 421)),
+  Box(Box(422, 422), Box(422, 422)),
+  Box(Box(423, 423), Box(423, 423)),
+  Box(Box(424, 424), Box(424, 424)),
+  Box(Box(425, 425), Box(425, 425)),
+  Box(Box(426, 426), Box(426, 426)),
+  Box(Box(427, 427), Box(427, 427)),
+  Box(Box(428, 428), Box(428, 428)),
+  Box(Box(429, 429), Box(429, 429)),
+  Box(Box(430, 430), Box(430, 430)),
+  Box(Box(431, 431), Box(431, 431)),
+  Box(Box(432, 432), Box(432, 432)),
+  Box(Box(433, 433), Box(433, 433)),
+  Box(Box(434, 434), Box(434, 434)),
+  Box(Box(435, 435), Box(435, 435)),
+  Box(Box(436, 436), Box(436, 436)),
+  Box(Box(437, 437), Box(437, 437)),
+  Box(Box(438, 438), Box(438, 438)),
+  Box(Box(439, 439), Box(439, 439)),
+  Box(Box(440, 440), Box(440, 440)),
+  Box(Box(441, 441), Box(441, 441)),
+  Box(Box(442, 442), Box(442, 442)),
+  Box(Box(443, 443), Box(443, 443)),
+  Box(Box(444, 444), Box(444, 444)),
+  Box(Box(445, 445), Box(445, 445)),
+  Box(Box(446, 446), Box(446, 446)),
+  Box(Box(447, 447), Box(447, 447)),
+  Box(Box(448, 448), Box(448, 448)),
+  Box(Box(449, 449), Box(449, 449)),
+  Box(Box(450, 450), Box(450, 450)),
+  Box(Box(451, 451), Box(451, 451)),
+  Box(Box(452, 452), Box(452, 452)),
+  Box(Box(453, 453), Box(453, 453)),
+  Box(Box(454, 454), Box(454, 454)),
+  Box(Box(455, 455), Box(455, 455)),
+  Box(Box(456, 456), Box(456, 456)),
+  Box(Box(457, 457), Box(457, 457)),
+  Box(Box(458, 458), Box(458, 458)),
+  Box(Box(459, 459), Box(459, 459)),
+  Box(Box(460, 460), Box(460, 460)),
+  Box(Box(461, 461), Box(461, 461)),
+  Box(Box(462, 462), Box(462, 462)),
+  Box(Box(463, 463), Box(463, 463)),
+  Box(Box(464, 464), Box(464, 464)),
+  Box(Box(465, 465), Box(465, 465)),
+  Box(Box(466, 466), Box(466, 466)),
+  Box(Box(467, 467), Box(467, 467)),
+  Box(Box(468, 468), Box(468, 468)),
+  Box(Box(469, 469), Box(469, 469)),
+  Box(Box(470, 470), Box(470, 470)),
+  Box(Box(471, 471), Box(471, 471)),
+  Box(Box(472, 472), Box(472, 472)),
+  Box(Box(473, 473), Box(473, 473)),
+  Box(Box(474, 474), Box(474, 474)),
+  Box(Box(475, 475), Box(475, 475)),
+  Box(Box(476, 476), Box(476, 476)),
+  Box(Box(477, 477), Box(477, 477)),
+  Box(Box(478, 478), Box(478, 478)),
+  Box(Box(479, 479), Box(479, 479)),
+  Box(Box(480, 480), Box(480, 480)),
+  Box(Box(481, 481), Box(481, 481)),
+  Box(Box(482, 482), Box(482, 482)),
+  Box(Box(483, 483), Box(483, 483)),
+  Box(Box(484, 484), Box(484, 484)),
+  Box(Box(485, 485), Box(485, 485)),
+  Box(Box(486, 486), Box(486, 486)),
+  Box(Box(487, 487), Box(487, 487)),
+  Box(Box(488, 488), Box(488, 488)),
+  Box(Box(489, 489), Box(489, 489)),
+  Box(Box(490, 490), Box(490, 490)),
+  Box(Box(491, 491), Box(491, 491)),
+  Box(Box(492, 492), Box(492, 492)),
+  Box(Box(493, 493), Box(493, 493)),
+  Box(Box(494, 494), Box(494, 494)),
+  Box(Box(495, 495), Box(495, 495)),
+  Box(Box(496, 496), Box(496, 496)),
+  Box(Box(497, 497), Box(497, 497)),
+  Box(Box(498, 498), Box(498, 498)),
+  Box(Box(499, 499), Box(499, 499)),
+  Box(Box(500, 500), Box(500, 500)),
+  Box(Box(501, 501), Box(501, 501)),
+  Box(Box(502, 502), Box(502, 502)),
+  Box(Box(503, 503), Box(503, 503)),
+  Box(Box(504, 504), Box(504, 504)),
+  Box(Box(505, 505), Box(505, 505)),
+  Box(Box(506, 506), Box(506, 506)),
+  Box(Box(507, 507), Box(507, 507)),
+  Box(Box(508, 508), Box(508, 508)),
+  Box(Box(509, 509), Box(509, 509)),
+  Box(Box(510, 510), Box(510, 510)),
+  Box(Box(511, 511), Box(511, 511)),
+  Box(Box(512, 512), Box(512, 512)),
+  Box(Box(513, 513), Box(513, 513)),
+  Box(Box(514, 514), Box(514, 514)),
+  Box(Box(515, 515), Box(515, 515)),
+  Box(Box(516, 516), Box(516, 516)),
+  Box(Box(517, 517), Box(517, 517)),
+  Box(Box(518, 518), Box(518, 518)),
+  Box(Box(519, 519), Box(519, 519)),
+  Box(Box(520, 520), Box(520, 520)),
+  Box(Box(521, 521), Box(521, 521)),
+  Box(Box(522, 522), Box(522, 522)),
+  Box(Box(523, 523), Box(523, 523)),
+  Box(Box(524, 524), Box(524, 524)),
+  Box(Box(525, 525), Box(525, 525)),
+  Box(Box(526, 526), Box(526, 526)),
+  Box(Box(527, 527), Box(527, 527)),
+  Box(Box(528, 528), Box(528, 528)),
+  Box(Box(529, 529), Box(529, 529)),
+  Box(Box(530, 530), Box(530, 530)),
+  Box(Box(531, 531), Box(531, 531)),
+  Box(Box(532, 532), Box(532, 532)),
+  Box(Box(533, 533), Box(533, 533)),
+  Box(Box(534, 534), Box(534, 534)),
+  Box(Box(535, 535), Box(535, 535)),
+  Box(Box(536, 536), Box(536, 536)),
+  Box(Box(537, 537), Box(537, 537)),
+  Box(Box(538, 538), Box(538, 538)),
+  Box(Box(539, 539), Box(539, 539)),
+  Box(Box(540, 540), Box(540, 540)),
+  Box(Box(541, 541), Box(541, 541)),
+  Box(Box(542, 542), Box(542, 542)),
+  Box(Box(543, 543), Box(543, 543)),
+  Box(Box(544, 544), Box(544, 544)),
+  Box(Box(545, 545), Box(545, 545)),
+  Box(Box(546, 546), Box(546, 546)),
+  Box(Box(547, 547), Box(547, 547)),
+  Box(Box(548, 548), Box(548, 548)),
+  Box(Box(549, 549), Box(549, 549)),
+  Box(Box(550, 550), Box(550, 550)),
+  Box(Box(551, 551), Box(551, 551)),
+  Box(Box(552, 552), Box(552, 552)),
+  Box(Box(553, 553), Box(553, 553)),
+  Box(Box(554, 554), Box(554, 554)),
+  Box(Box(555, 555), Box(555, 555)),
+  Box(Box(556, 556), Box(556, 556)),
+  Box(Box(557, 557), Box(557, 557)),
+  Box(Box(558, 558), Box(558, 558)),
+  Box(Box(559, 559), Box(559, 559)),
+  Box(Box(560, 560), Box(560, 560)),
+  Box(Box(561, 561), Box(561, 561)),
+  Box(Box(562, 562), Box(562, 562)),
+  Box(Box(563, 563), Box(563, 563)),
+  Box(Box(564, 564), Box(564, 564)),
+  Box(Box(565, 565), Box(565, 565)),
+  Box(Box(566, 566), Box(566, 566)),
+  Box(Box(567, 567), Box(567, 567)),
+  Box(Box(568, 568), Box(568, 568)),
+  Box(Box(569, 569), Box(569, 569)),
+  Box(Box(570, 570), Box(570, 570)),
+  Box(Box(571, 571), Box(571, 571)),
+  Box(Box(572, 572), Box(572, 572)),
+  Box(Box(573, 573), Box(573, 573)),
+  Box(Box(574, 574), Box(574, 574)),
+  Box(Box(575, 575), Box(575, 575)),
+  Box(Box(576, 576), Box(576, 576)),
+  Box(Box(577, 577), Box(577, 577)),
+  Box(Box(578, 578), Box(578, 578)),
+  Box(Box(579, 579), Box(579, 579)),
+  Box(Box(580, 580), Box(580, 580)),
+  Box(Box(581, 581), Box(581, 581)),
+  Box(Box(582, 582), Box(582, 582)),
+  Box(Box(583, 583), Box(583, 583)),
+  Box(Box(584, 584), Box(584, 584)),
+  Box(Box(585, 585), Box(585, 585)),
+  Box(Box(586, 586), Box(586, 586)),
+  Box(Box(587, 587), Box(587, 587)),
+  Box(Box(588, 588), Box(588, 588)),
+  Box(Box(589, 589), Box(589, 589)),
+  Box(Box(590, 590), Box(590, 590)),
+  Box(Box(591, 591), Box(591, 591)),
+  Box(Box(592, 592), Box(592, 592)),
+  Box(Box(593, 593), Box(593, 593)),
+  Box(Box(594, 594), Box(594, 594)),
+  Box(Box(595, 595), Box(595, 595)),
+  Box(Box(596, 596), Box(596, 596)),
+  Box(Box(597, 597), Box(597, 597)),
+  Box(Box(598, 598), Box(598, 598)),
+  Box(Box(599, 599), Box(599, 599)),
+  Box(Box(600, 600), Box(600, 600)),
+  Box(Box(601, 601), Box(601, 601)),
+  Box(Box(602, 602), Box(602, 602)),
+  Box(Box(603, 603), Box(603, 603)),
+  Box(Box(604, 604), Box(604, 604)),
+  Box(Box(605, 605), Box(605, 605)),
+  Box(Box(606, 606), Box(606, 606)),
+  Box(Box(607, 607), Box(607, 607)),
+  Box(Box(608, 608), Box(608, 608)),
+  Box(Box(609, 609), Box(609, 609)),
+  Box(Box(610, 610), Box(610, 610)),
+  Box(Box(611, 611), Box(611, 611)),
+  Box(Box(612, 612), Box(612, 612)),
+  Box(Box(613, 613), Box(613, 613)),
+  Box(Box(614, 614), Box(614, 614)),
+  Box(Box(615, 615), Box(615, 615)),
+  Box(Box(616, 616), Box(616, 616)),
+  Box(Box(617, 617), Box(617, 617)),
+  Box(Box(618, 618), Box(618, 618)),
+  Box(Box(619, 619), Box(619, 619)),
+  Box(Box(620, 620), Box(620, 620)),
+  Box(Box(621, 621), Box(621, 621)),
+  Box(Box(622, 622), Box(622, 622)),
+  Box(Box(623, 623), Box(623, 623)),
+  Box(Box(624, 624), Box(624, 624)),
+  Box(Box(625, 625), Box(625, 625)),
+  Box(Box(626, 626), Box(626, 626)),
+  Box(Box(627, 627), Box(627, 627)),
+  Box(Box(628, 628), Box(628, 628)),
+  Box(Box(629, 629), Box(629, 629)),
+  Box(Box(630, 630), Box(630, 630)),
+  Box(Box(631, 631), Box(631, 631)),
+  Box(Box(632, 632), Box(632, 632)),
+  Box(Box(633, 633), Box(633, 633)),
+  Box(Box(634, 634), Box(634, 634)),
+  Box(Box(635, 635), Box(635, 635)),
+  Box(Box(636, 636), Box(636, 636)),
+  Box(Box(637, 637), Box(637, 637)),
+  Box(Box(638, 638), Box(638, 638)),
+  Box(Box(639, 639), Box(639, 639)),
+  Box(Box(640, 640), Box(640, 640)),
+  Box(Box(641, 641), Box(641, 641)),
+  Box(Box(642, 642), Box(642, 642)),
+  Box(Box(643, 643), Box(643, 643)),
+  Box(Box(644, 644), Box(644, 644)),
+  Box(Box(645, 645), Box(645, 645)),
+  Box(Box(646, 646), Box(646, 646)),
+  Box(Box(647, 647), Box(647, 647)),
+  Box(Box(648, 648), Box(648, 648)),
+  Box(Box(649, 649), Box(649, 649)),
+  Box(Box(650, 650), Box(650, 650)),
+  Box(Box(651, 651), Box(651, 651)),
+  Box(Box(652, 652), Box(652, 652)),
+  Box(Box(653, 653), Box(653, 653)),
+  Box(Box(654, 654), Box(654, 654)),
+  Box(Box(655, 655), Box(655, 655)),
+  Box(Box(656, 656), Box(656, 656)),
+  Box(Box(657, 657), Box(657, 657)),
+  Box(Box(658, 658), Box(658, 658)),
+  Box(Box(659, 659), Box(659, 659)),
+  Box(Box(660, 660), Box(660, 660)),
+  Box(Box(661, 661), Box(661, 661)),
+  Box(Box(662, 662), Box(662, 662)),
+  Box(Box(663, 663), Box(663, 663)),
+  Box(Box(664, 664), Box(664, 664)),
+  Box(Box(665, 665), Box(665, 665)),
+  Box(Box(666, 666), Box(666, 666)),
+  Box(Box(667, 667), Box(667, 667)),
+  Box(Box(668, 668), Box(668, 668)),
+  Box(Box(669, 669), Box(669, 669)),
+  Box(Box(670, 670), Box(670, 670)),
+  Box(Box(671, 671), Box(671, 671)),
+  Box(Box(672, 672), Box(672, 672)),
+  Box(Box(673, 673), Box(673, 673)),
+  Box(Box(674, 674), Box(674, 674)),
+  Box(Box(675, 675), Box(675, 675)),
+  Box(Box(676, 676), Box(676, 676)),
+  Box(Box(677, 677), Box(677, 677)),
+  Box(Box(678, 678), Box(678, 678)),
+  Box(Box(679, 679), Box(679, 679)),
+  Box(Box(680, 680), Box(680, 680)),
+  Box(Box(681, 681), Box(681, 681)),
+  Box(Box(682, 682), Box(682, 682)),
+  Box(Box(683, 683), Box(683, 683)),
+  Box(Box(684, 684), Box(684, 684)),
+  Box(Box(685, 685), Box(685, 685)),
+  Box(Box(686, 686), Box(686, 686)),
+  Box(Box(687, 687), Box(687, 687)),
+  Box(Box(688, 688), Box(688, 688)),
+  Box(Box(689, 689), Box(689, 689)),
+  Box(Box(690, 690), Box(690, 690)),
+  Box(Box(691, 691), Box(691, 691)),
+  Box(Box(692, 692), Box(692, 692)),
+  Box(Box(693, 693), Box(693, 693)),
+  Box(Box(694, 694), Box(694, 694)),
+  Box(Box(695, 695), Box(695, 695)),
+  Box(Box(696, 696), Box(696, 696)),
+  Box(Box(697, 697), Box(697, 697)),
+  Box(Box(698, 698), Box(698, 698)),
+  Box(Box(699, 699), Box(699, 699)),
+  Box(Box(700, 700), Box(700, 700)),
+  Box(Box(701, 701), Box(701, 701)),
+  Box(Box(702, 702), Box(702, 702)),
+  Box(Box(703, 703), Box(703, 703)),
+  Box(Box(704, 704), Box(704, 704)),
+  Box(Box(705, 705), Box(705, 705)),
+  Box(Box(706, 706), Box(706, 706)),
+  Box(Box(707, 707), Box(707, 707)),
+  Box(Box(708, 708), Box(708, 708)),
+  Box(Box(709, 709), Box(709, 709)),
+  Box(Box(710, 710), Box(710, 710)),
+  Box(Box(711, 711), Box(711, 711)),
+  Box(Box(712, 712), Box(712, 712)),
+  Box(Box(713, 713), Box(713, 713)),
+  Box(Box(714, 714), Box(714, 714)),
+  Box(Box(715, 715), Box(715, 715)),
+  Box(Box(716, 716), Box(716, 716)),
+  Box(Box(717, 717), Box(717, 717)),
+  Box(Box(718, 718), Box(718, 718)),
+  Box(Box(719, 719), Box(719, 719)),
+  Box(Box(720, 720), Box(720, 720)),
+  Box(Box(721, 721), Box(721, 721)),
+  Box(Box(722, 722), Box(722, 722)),
+  Box(Box(723, 723), Box(723, 723)),
+  Box(Box(724, 724), Box(724, 724)),
+  Box(Box(725, 725), Box(725, 725)),
+  Box(Box(726, 726), Box(726, 726)),
+  Box(Box(727, 727), Box(727, 727)),
+  Box(Box(728, 728), Box(728, 728)),
+  Box(Box(729, 729), Box(729, 729)),
+  Box(Box(730, 730), Box(730, 730)),
+  Box(Box(731, 731), Box(731, 731)),
+  Box(Box(732, 732), Box(732, 732)),
+  Box(Box(733, 733), Box(733, 733)),
+  Box(Box(734, 734), Box(734, 734)),
+  Box(Box(735, 735), Box(735, 735)),
+  Box(Box(736, 736), Box(736, 736)),
+  Box(Box(737, 737), Box(737, 737)),
+  Box(Box(738, 738), Box(738, 738)),
+  Box(Box(739, 739), Box(739, 739)),
+  Box(Box(740, 740), Box(740, 740)),
+  Box(Box(741, 741), Box(741, 741)),
+  Box(Box(742, 742), Box(742, 742)),
+  Box(Box(743, 743), Box(743, 743)),
+  Box(Box(744, 744), Box(744, 744)),
+  Box(Box(745, 745), Box(745, 745)),
+  Box(Box(746, 746), Box(746, 746)),
+  Box(Box(747, 747), Box(747, 747)),
+  Box(Box(748, 748), Box(748, 748)),
+  Box(Box(749, 749), Box(749, 749)),
+  Box(Box(750, 750), Box(750, 750)),
+  Box(Box(751, 751), Box(751, 751)),
+  Box(Box(752, 752), Box(752, 752)),
+  Box(Box(753, 753), Box(753, 753)),
+  Box(Box(754, 754), Box(754, 754)),
+  Box(Box(755, 755), Box(755, 755)),
+  Box(Box(756, 756), Box(756, 756)),
+  Box(Box(757, 757), Box(757, 757)),
+  Box(Box(758, 758), Box(758, 758)),
+  Box(Box(759, 759), Box(759, 759)),
+  Box(Box(760, 760), Box(760, 760)),
+  Box(Box(761, 761), Box(761, 761)),
+  Box(Box(762, 762), Box(762, 762)),
+  Box(Box(763, 763), Box(763, 763)),
+  Box(Box(764, 764), Box(764, 764)),
+  Box(Box(765, 765), Box(765, 765)),
+  Box(Box(766, 766), Box(766, 766)),
+  Box(Box(767, 767), Box(767, 767)),
+  Box(Box(768, 768), Box(768, 768)),
+  Box(Box(769, 769), Box(769, 769)),
+  Box(Box(770, 770), Box(770, 770)),
+  Box(Box(771, 771), Box(771, 771)),
+  Box(Box(772, 772), Box(772, 772)),
+  Box(Box(773, 773), Box(773, 773)),
+  Box(Box(774, 774), Box(774, 774)),
+  Box(Box(775, 775), Box(775, 775)),
+  Box(Box(776, 776), Box(776, 776)),
+  Box(Box(777, 777), Box(777, 777)),
+  Box(Box(778, 778), Box(778, 778)),
+  Box(Box(779, 779), Box(779, 779)),
+  Box(Box(780, 780), Box(780, 780)),
+  Box(Box(781, 781), Box(781, 781)),
+  Box(Box(782, 782), Box(782, 782)),
+  Box(Box(783, 783), Box(783, 783)),
+  Box(Box(784, 784), Box(784, 784)),
+  Box(Box(785, 785), Box(785, 785)),
+  Box(Box(786, 786), Box(786, 786)),
+  Box(Box(787, 787), Box(787, 787)),
+  Box(Box(788, 788), Box(788, 788)),
+  Box(Box(789, 789), Box(789, 789)),
+  Box(Box(790, 790), Box(790, 790)),
+  Box(Box(791, 791), Box(791, 791)),
+  Box(Box(792, 792), Box(792, 792)),
+  Box(Box(793, 793), Box(793, 793)),
+  Box(Box(794, 794), Box(794, 794)),
+  Box(Box(795, 795), Box(795, 795)),
+  Box(Box(796, 796), Box(796, 796)),
+  Box(Box(797, 797), Box(797, 797)),
+  Box(Box(798, 798), Box(798, 798)),
+  Box(Box(799, 799), Box(799, 799)),
+  Box(Box(800, 800), Box(800, 800)),
+  Box(Box(801, 801), Box(801, 801)),
+  Box(Box(802, 802), Box(802, 802)),
+  Box(Box(803, 803), Box(803, 803)),
+  Box(Box(804, 804), Box(804, 804)),
+  Box(Box(805, 805), Box(805, 805)),
+  Box(Box(806, 806), Box(806, 806)),
+  Box(Box(807, 807), Box(807, 807)),
+  Box(Box(808, 808), Box(808, 808)),
+  Box(Box(809, 809), Box(809, 809)),
+  Box(Box(810, 810), Box(810, 810)),
+  Box(Box(811, 811), Box(811, 811)),
+  Box(Box(812, 812), Box(812, 812)),
+  Box(Box(813, 813), Box(813, 813)),
+  Box(Box(814, 814), Box(814, 814)),
+  Box(Box(815, 815), Box(815, 815)),
+  Box(Box(816, 816), Box(816, 816)),
+  Box(Box(817, 817), Box(817, 817)),
+  Box(Box(818, 818), Box(818, 818)),
+  Box(Box(819, 819), Box(819, 819)),
+  Box(Box(820, 820), Box(820, 820)),
+  Box(Box(821, 821), Box(821, 821)),
+  Box(Box(822, 822), Box(822, 822)),
+  Box(Box(823, 823), Box(823, 823)),
+  Box(Box(824, 824), Box(824, 824)),
+  Box(Box(825, 825), Box(825, 825)),
+  Box(Box(826, 826), Box(826, 826)),
+  Box(Box(827, 827), Box(827, 827)),
+  Box(Box(828, 828), Box(828, 828)),
+  Box(Box(829, 829), Box(829, 829)),
+  Box(Box(830, 830), Box(830, 830)),
+  Box(Box(831, 831), Box(831, 831)),
+  Box(Box(832, 832), Box(832, 832)),
+  Box(Box(833, 833), Box(833, 833)),
+  Box(Box(834, 834), Box(834, 834)),
+  Box(Box(835, 835), Box(835, 835)),
+  Box(Box(836, 836), Box(836, 836)),
+  Box(Box(837, 837), Box(837, 837)),
+  Box(Box(838, 838), Box(838, 838)),
+  Box(Box(839, 839), Box(839, 839)),
+  Box(Box(840, 840), Box(840, 840)),
+  Box(Box(841, 841), Box(841, 841)),
+  Box(Box(842, 842), Box(842, 842)),
+  Box(Box(843, 843), Box(843, 843)),
+  Box(Box(844, 844), Box(844, 844)),
+  Box(Box(845, 845), Box(845, 845)),
+  Box(Box(846, 846), Box(846, 846)),
+  Box(Box(847, 847), Box(847, 847)),
+  Box(Box(848, 848), Box(848, 848)),
+  Box(Box(849, 849), Box(849, 849)),
+  Box(Box(850, 850), Box(850, 850)),
+  Box(Box(851, 851), Box(851, 851)),
+  Box(Box(852, 852), Box(852, 852)),
+  Box(Box(853, 853), Box(853, 853)),
+  Box(Box(854, 854), Box(854, 854)),
+  Box(Box(855, 855), Box(855, 855)),
+  Box(Box(856, 856), Box(856, 856)),
+  Box(Box(857, 857), Box(857, 857)),
+  Box(Box(858, 858), Box(858, 858)),
+  Box(Box(859, 859), Box(859, 859)),
+  Box(Box(860, 860), Box(860, 860)),
+  Box(Box(861, 861), Box(861, 861)),
+  Box(Box(862, 862), Box(862, 862)),
+  Box(Box(863, 863), Box(863, 863)),
+  Box(Box(864, 864), Box(864, 864)),
+  Box(Box(865, 865), Box(865, 865)),
+  Box(Box(866, 866), Box(866, 866)),
+  Box(Box(867, 867), Box(867, 867)),
+  Box(Box(868, 868), Box(868, 868)),
+  Box(Box(869, 869), Box(869, 869)),
+  Box(Box(870, 870), Box(870, 870)),
+  Box(Box(871, 871), Box(871, 871)),
+  Box(Box(872, 872), Box(872, 872)),
+  Box(Box(873, 873), Box(873, 873)),
+  Box(Box(874, 874), Box(874, 874)),
+  Box(Box(875, 875), Box(875, 875)),
+  Box(Box(876, 876), Box(876, 876)),
+  Box(Box(877, 877), Box(877, 877)),
+  Box(Box(878, 878), Box(878, 878)),
+  Box(Box(879, 879), Box(879, 879)),
+  Box(Box(880, 880), Box(880, 880)),
+  Box(Box(881, 881), Box(881, 881)),
+  Box(Box(882, 882), Box(882, 882)),
+  Box(Box(883, 883), Box(883, 883)),
+  Box(Box(884, 884), Box(884, 884)),
+  Box(Box(885, 885), Box(885, 885)),
+  Box(Box(886, 886), Box(886, 886)),
+  Box(Box(887, 887), Box(887, 887)),
+  Box(Box(888, 888), Box(888, 888)),
+  Box(Box(889, 889), Box(889, 889)),
+  Box(Box(890, 890), Box(890, 890)),
+  Box(Box(891, 891), Box(891, 891)),
+  Box(Box(892, 892), Box(892, 892)),
+  Box(Box(893, 893), Box(893, 893)),
+  Box(Box(894, 894), Box(894, 894)),
+  Box(Box(895, 895), Box(895, 895)),
+  Box(Box(896, 896), Box(896, 896)),
+  Box(Box(897, 897), Box(897, 897)),
+  Box(Box(898, 898), Box(898, 898)),
+  Box(Box(899, 899), Box(899, 899)),
+  Box(Box(900, 900), Box(900, 900)),
+  Box(Box(901, 901), Box(901, 901)),
+  Box(Box(902, 902), Box(902, 902)),
+  Box(Box(903, 903), Box(903, 903)),
+  Box(Box(904, 904), Box(904, 904)),
+  Box(Box(905, 905), Box(905, 905)),
+  Box(Box(906, 906), Box(906, 906)),
+  Box(Box(907, 907), Box(907, 907)),
+  Box(Box(908, 908), Box(908, 908)),
+  Box(Box(909, 909), Box(909, 909)),
+  Box(Box(910, 910), Box(910, 910)),
+  Box(Box(911, 911), Box(911, 911)),
+  Box(Box(912, 912), Box(912, 912)),
+  Box(Box(913, 913), Box(913, 913)),
+  Box(Box(914, 914), Box(914, 914)),
+  Box(Box(915, 915), Box(915, 915)),
+  Box(Box(916, 916), Box(916, 916)),
+  Box(Box(917, 917), Box(917, 917)),
+  Box(Box(918, 918), Box(918, 918)),
+  Box(Box(919, 919), Box(919, 919)),
+  Box(Box(920, 920), Box(920, 920)),
+  Box(Box(921, 921), Box(921, 921)),
+  Box(Box(922, 922), Box(922, 922)),
+  Box(Box(923, 923), Box(923, 923)),
+  Box(Box(924, 924), Box(924, 924)),
+  Box(Box(925, 925), Box(925, 925)),
+  Box(Box(926, 926), Box(926, 926)),
+  Box(Box(927, 927), Box(927, 927)),
+  Box(Box(928, 928), Box(928, 928)),
+  Box(Box(929, 929), Box(929, 929)),
+  Box(Box(930, 930), Box(930, 930)),
+  Box(Box(931, 931), Box(931, 931)),
+  Box(Box(932, 932), Box(932, 932)),
+  Box(Box(933, 933), Box(933, 933)),
+  Box(Box(934, 934), Box(934, 934)),
+  Box(Box(935, 935), Box(935, 935)),
+  Box(Box(936, 936), Box(936, 936)),
+  Box(Box(937, 937), Box(937, 937)),
+  Box(Box(938, 938), Box(938, 938)),
+  Box(Box(939, 939), Box(939, 939)),
+  Box(Box(940, 940), Box(940, 940)),
+  Box(Box(941, 941), Box(941, 941)),
+  Box(Box(942, 942), Box(942, 942)),
+  Box(Box(943, 943), Box(943, 943)),
+  Box(Box(944, 944), Box(944, 944)),
+  Box(Box(945, 945), Box(945, 945)),
+  Box(Box(946, 946), Box(946, 946)),
+  Box(Box(947, 947), Box(947, 947)),
+  Box(Box(948, 948), Box(948, 948)),
+  Box(Box(949, 949), Box(949, 949)),
+  Box(Box(950, 950), Box(950, 950)),
+  Box(Box(951, 951), Box(951, 951)),
+  Box(Box(952, 952), Box(952, 952)),
+  Box(Box(953, 953), Box(953, 953)),
+  Box(Box(954, 954), Box(954, 954)),
+  Box(Box(955, 955), Box(955, 955)),
+  Box(Box(956, 956), Box(956, 956)),
+  Box(Box(957, 957), Box(957, 957)),
+  Box(Box(958, 958), Box(958, 958)),
+  Box(Box(959, 959), Box(959, 959)),
+  Box(Box(960, 960), Box(960, 960)),
+  Box(Box(961, 961), Box(961, 961)),
+  Box(Box(962, 962), Box(962, 962)),
+  Box(Box(963, 963), Box(963, 963)),
+  Box(Box(964, 964), Box(964, 964)),
+  Box(Box(965, 965), Box(965, 965)),
+  Box(Box(966, 966), Box(966, 966)),
+  Box(Box(967, 967), Box(967, 967)),
+  Box(Box(968, 968), Box(968, 968)),
+  Box(Box(969, 969), Box(969, 969)),
+  Box(Box(970, 970), Box(970, 970)),
+  Box(Box(971, 971), Box(971, 971)),
+  Box(Box(972, 972), Box(972, 972)),
+  Box(Box(973, 973), Box(973, 973)),
+  Box(Box(974, 974), Box(974, 974)),
+  Box(Box(975, 975), Box(975, 975)),
+  Box(Box(976, 976), Box(976, 976)),
+  Box(Box(977, 977), Box(977, 977)),
+  Box(Box(978, 978), Box(978, 978)),
+  Box(Box(979, 979), Box(979, 979)),
+  Box(Box(980, 980), Box(980, 980)),
+  Box(Box(981, 981), Box(981, 981)),
+  Box(Box(982, 982), Box(982, 982)),
+  Box(Box(983, 983), Box(983, 983)),
+  Box(Box(984, 984), Box(984, 984)),
+  Box(Box(985, 985), Box(985, 985)),
+  Box(Box(986, 986), Box(986, 986)),
+  Box(Box(987, 987), Box(987, 987)),
+  Box(Box(988, 988), Box(988, 988)),
+  Box(Box(989, 989), Box(989, 989)),
+  Box(Box(990, 990), Box(990, 990)),
+  Box(Box(991, 991), Box(991, 991)),
+  Box(Box(992, 992), Box(992, 992)),
+  Box(Box(993, 993), Box(993, 993)),
+  Box(Box(994, 994), Box(994, 994)),
+  Box(Box(995, 995), Box(995, 995)),
+  Box(Box(996, 996), Box(996, 996)),
+  Box(Box(997, 997), Box(997, 997)),
+  Box(Box(998, 998), Box(998, 998)),
+  Box(Box(999, 999), Box(999, 999)),
+  Box(Box(1000, 1000), Box(1000, 1000)),
+  Box(Box(1001, 1001), Box(1001, 1001)),
+  Box(Box(1002, 1002), Box(1002, 1002)),
+  Box(Box(1003, 1003), Box(1003, 1003)),
+  Box(Box(1004, 1004), Box(1004, 1004)),
+  Box(Box(1005, 1005), Box(1005, 1005)),
+  Box(Box(1006, 1006), Box(1006, 1006)),
+  Box(Box(1007, 1007), Box(1007, 1007)),
+  Box(Box(1008, 1008), Box(1008, 1008)),
+  Box(Box(1009, 1009), Box(1009, 1009)),
+  Box(Box(1010, 1010), Box(1010, 1010)),
+  Box(Box(1011, 1011), Box(1011, 1011)),
+  Box(Box(1012, 1012), Box(1012, 1012)),
+  Box(Box(1013, 1013), Box(1013, 1013)),
+  Box(Box(1014, 1014), Box(1014, 1014)),
+  Box(Box(1015, 1015), Box(1015, 1015)),
+  Box(Box(1016, 1016), Box(1016, 1016)),
+  Box(Box(1017, 1017), Box(1017, 1017)),
+  Box(Box(1018, 1018), Box(1018, 1018)),
+  Box(Box(1019, 1019), Box(1019, 1019)),
+  Box(Box(1020, 1020), Box(1020, 1020)),
+  Box(Box(1021, 1021), Box(1021, 1021)),
+  Box(Box(1022, 1022), Box(1022, 1022)),
+  Box(Box(1023, 1023), Box(1023, 1023)),
+  Box(Box(1024, 1024), Box(1024, 1024)),
+  Box(Box(1025, 1025), Box(1025, 1025)),
+  Box(Box(1026, 1026), Box(1026, 1026)),
+  Box(Box(1027, 1027), Box(1027, 1027)),
+  Box(Box(1028, 1028), Box(1028, 1028)),
+  Box(Box(1029, 1029), Box(1029, 1029)),
+  Box(Box(1030, 1030), Box(1030, 1030)),
+  Box(Box(1031, 1031), Box(1031, 1031)),
+  Box(Box(1032, 1032), Box(1032, 1032)),
+  Box(Box(1033, 1033), Box(1033, 1033)),
+  Box(Box(1034, 1034), Box(1034, 1034)),
+  Box(Box(1035, 1035), Box(1035, 1035)),
+  Box(Box(1036, 1036), Box(1036, 1036)),
+  Box(Box(1037, 1037), Box(1037, 1037)),
+  Box(Box(1038, 1038), Box(1038, 1038)),
+  Box(Box(1039, 1039), Box(1039, 1039)),
+  Box(Box(1040, 1040), Box(1040, 1040)),
+  Box(Box(1041, 1041), Box(1041, 1041)),
+  Box(Box(1042, 1042), Box(1042, 1042)),
+  Box(Box(1043, 1043), Box(1043, 1043)),
+  Box(Box(1044, 1044), Box(1044, 1044)),
+  Box(Box(1045, 1045), Box(1045, 1045)),
+  Box(Box(1046, 1046), Box(1046, 1046)),
+  Box(Box(1047, 1047), Box(1047, 1047)),
+  Box(Box(1048, 1048), Box(1048, 1048)),
+  Box(Box(1049, 1049), Box(1049, 1049)),
+  Box(Box(1050, 1050), Box(1050, 1050)),
+  Box(Box(1051, 1051), Box(1051, 1051)),
+  Box(Box(1052, 1052), Box(1052, 1052)),
+  Box(Box(1053, 1053), Box(1053, 1053)),
+  Box(Box(1054, 1054), Box(1054, 1054)),
+  Box(Box(1055, 1055), Box(1055, 1055)),
+  Box(Box(1056, 1056), Box(1056, 1056)),
+  Box(Box(1057, 1057), Box(1057, 1057)),
+  Box(Box(1058, 1058), Box(1058, 1058)),
+  Box(Box(1059, 1059), Box(1059, 1059)),
+  Box(Box(1060, 1060), Box(1060, 1060)),
+  Box(Box(1061, 1061), Box(1061, 1061)),
+  Box(Box(1062, 1062), Box(1062, 1062)),
+  Box(Box(1063, 1063), Box(1063, 1063)),
+  Box(Box(1064, 1064), Box(1064, 1064)),
+  Box(Box(1065, 1065), Box(1065, 1065)),
+  Box(Box(1066, 1066), Box(1066, 1066)),
+  Box(Box(1067, 1067), Box(1067, 1067)),
+  Box(Box(1068, 1068), Box(1068, 1068)),
+  Box(Box(1069, 1069), Box(1069, 1069)),
+  Box(Box(1070, 1070), Box(1070, 1070)),
+  Box(Box(1071, 1071), Box(1071, 1071)),
+  Box(Box(1072, 1072), Box(1072, 1072)),
+  Box(Box(1073, 1073), Box(1073, 1073)),
+  Box(Box(1074, 1074), Box(1074, 1074)),
+  Box(Box(1075, 1075), Box(1075, 1075)),
+  Box(Box(1076, 1076), Box(1076, 1076)),
+  Box(Box(1077, 1077), Box(1077, 1077)),
+  Box(Box(1078, 1078), Box(1078, 1078)),
+  Box(Box(1079, 1079), Box(1079, 1079)),
+  Box(Box(1080, 1080), Box(1080, 1080)),
+  Box(Box(1081, 1081), Box(1081, 1081)),
+  Box(Box(1082, 1082), Box(1082, 1082)),
+  Box(Box(1083, 1083), Box(1083, 1083)),
+  Box(Box(1084, 1084), Box(1084, 1084)),
+  Box(Box(1085, 1085), Box(1085, 1085)),
+  Box(Box(1086, 1086), Box(1086, 1086)),
+  Box(Box(1087, 1087), Box(1087, 1087)),
+  Box(Box(1088, 1088), Box(1088, 1088)),
+  Box(Box(1089, 1089), Box(1089, 1089)),
+  Box(Box(1090, 1090), Box(1090, 1090)),
+  Box(Box(1091, 1091), Box(1091, 1091)),
+  Box(Box(1092, 1092), Box(1092, 1092)),
+  Box(Box(1093, 1093), Box(1093, 1093)),
+  Box(Box(1094, 1094), Box(1094, 1094)),
+  Box(Box(1095, 1095), Box(1095, 1095)),
+  Box(Box(1096, 1096), Box(1096, 1096)),
+  Box(Box(1097, 1097), Box(1097, 1097)),
+  Box(Box(1098, 1098), Box(1098, 1098)),
+  Box(Box(1099, 1099), Box(1099, 1099)),
+  Box(Box(1100, 1100), Box(1100, 1100)),
+  Box(Box(1101, 1101), Box(1101, 1101)),
+  Box(Box(1102, 1102), Box(1102, 1102)),
+  Box(Box(1103, 1103), Box(1103, 1103)),
+  Box(Box(1104, 1104), Box(1104, 1104)),
+  Box(Box(1105, 1105), Box(1105, 1105)),
+  Box(Box(1106, 1106), Box(1106, 1106)),
+  Box(Box(1107, 1107), Box(1107, 1107)),
+  Box(Box(1108, 1108), Box(1108, 1108)),
+  Box(Box(1109, 1109), Box(1109, 1109)),
+  Box(Box(1110, 1110), Box(1110, 1110)),
+  Box(Box(1111, 1111), Box(1111, 1111)),
+  Box(Box(1112, 1112), Box(1112, 1112)),
+  Box(Box(1113, 1113), Box(1113, 1113)),
+  Box(Box(1114, 1114), Box(1114, 1114)),
+  Box(Box(1115, 1115), Box(1115, 1115)),
+  Box(Box(1116, 1116), Box(1116, 1116)),
+  Box(Box(1117, 1117), Box(1117, 1117)),
+  Box(Box(1118, 1118), Box(1118, 1118)),
+  Box(Box(1119, 1119), Box(1119, 1119)),
+  Box(Box(1120, 1120), Box(1120, 1120)),
+  Box(Box(1121, 1121), Box(1121, 1121)),
+  Box(Box(1122, 1122), Box(1122, 1122)),
+  Box(Box(1123, 1123), Box(1123, 1123)),
+  Box(Box(1124, 1124), Box(1124, 1124)),
+  Box(Box(1125, 1125), Box(1125, 1125)),
+  Box(Box(1126, 1126), Box(1126, 1126)),
+  Box(Box(1127, 1127), Box(1127, 1127)),
+  Box(Box(1128, 1128), Box(1128, 1128)),
+  Box(Box(1129, 1129), Box(1129, 1129)),
+  Box(Box(1130, 1130), Box(1130, 1130)),
+  Box(Box(1131, 1131), Box(1131, 1131)),
+  Box(Box(1132, 1132), Box(1132, 1132)),
+  Box(Box(1133, 1133), Box(1133, 1133)),
+  Box(Box(1134, 1134), Box(1134, 1134)),
+  Box(Box(1135, 1135), Box(1135, 1135)),
+  Box(Box(1136, 1136), Box(1136, 1136)),
+  Box(Box(1137, 1137), Box(1137, 1137)),
+  Box(Box(1138, 1138), Box(1138, 1138)),
+  Box(Box(1139, 1139), Box(1139, 1139)),
+  Box(Box(1140, 1140), Box(1140, 1140)),
+  Box(Box(1141, 1141), Box(1141, 1141)),
+  Box(Box(1142, 1142), Box(1142, 1142)),
+  Box(Box(1143, 1143), Box(1143, 1143)),
+  Box(Box(1144, 1144), Box(1144, 1144)),
+  Box(Box(1145, 1145), Box(1145, 1145)),
+  Box(Box(1146, 1146), Box(1146, 1146)),
+  Box(Box(1147, 1147), Box(1147, 1147)),
+  Box(Box(1148, 1148), Box(1148, 1148)),
+  Box(Box(1149, 1149), Box(1149, 1149)),
+  Box(Box(1150, 1150), Box(1150, 1150)),
+  Box(Box(1151, 1151), Box(1151, 1151)),
+  Box(Box(1152, 1152), Box(1152, 1152)),
+  Box(Box(1153, 1153), Box(1153, 1153)),
+  Box(Box(1154, 1154), Box(1154, 1154)),
+  Box(Box(1155, 1155), Box(1155, 1155)),
+  Box(Box(1156, 1156), Box(1156, 1156)),
+  Box(Box(1157, 1157), Box(1157, 1157)),
+  Box(Box(1158, 1158), Box(1158, 1158)),
+  Box(Box(1159, 1159), Box(1159, 1159)),
+  Box(Box(1160, 1160), Box(1160, 1160)),
+  Box(Box(1161, 1161), Box(1161, 1161)),
+  Box(Box(1162, 1162), Box(1162, 1162)),
+  Box(Box(1163, 1163), Box(1163, 1163)),
+  Box(Box(1164, 1164), Box(1164, 1164)),
+  Box(Box(1165, 1165), Box(1165, 1165)),
+  Box(Box(1166, 1166), Box(1166, 1166)),
+  Box(Box(1167, 1167), Box(1167, 1167)),
+  Box(Box(1168, 1168), Box(1168, 1168)),
+  Box(Box(1169, 1169), Box(1169, 1169)),
+  Box(Box(1170, 1170), Box(1170, 1170)),
+  Box(Box(1171, 1171), Box(1171, 1171)),
+  Box(Box(1172, 1172), Box(1172, 1172)),
+  Box(Box(1173, 1173), Box(1173, 1173)),
+  Box(Box(1174, 1174), Box(1174, 1174)),
+  Box(Box(1175, 1175), Box(1175, 1175)),
+  Box(Box(1176, 1176), Box(1176, 1176)),
+  Box(Box(1177, 1177), Box(1177, 1177)),
+  Box(Box(1178, 1178), Box(1178, 1178)),
+  Box(Box(1179, 1179), Box(1179, 1179)),
+  Box(Box(1180, 1180), Box(1180, 1180)),
+  Box(Box(1181, 1181), Box(1181, 1181)),
+  Box(Box(1182, 1182), Box(1182, 1182)),
+  Box(Box(1183, 1183), Box(1183, 1183)),
+  Box(Box(1184, 1184), Box(1184, 1184)),
+  Box(Box(1185, 1185), Box(1185, 1185)),
+  Box(Box(1186, 1186), Box(1186, 1186)),
+  Box(Box(1187, 1187), Box(1187, 1187)),
+  Box(Box(1188, 1188), Box(1188, 1188)),
+  Box(Box(1189, 1189), Box(1189, 1189)),
+  Box(Box(1190, 1190), Box(1190, 1190)),
+  Box(Box(1191, 1191), Box(1191, 1191)),
+  Box(Box(1192, 1192), Box(1192, 1192)),
+  Box(Box(1193, 1193), Box(1193, 1193)),
+  Box(Box(1194, 1194), Box(1194, 1194)),
+  Box(Box(1195, 1195), Box(1195, 1195)),
+  Box(Box(1196, 1196), Box(1196, 1196)),
+  Box(Box(1197, 1197), Box(1197, 1197)),
+  Box(Box(1198, 1198), Box(1198, 1198)),
+  Box(Box(1199, 1199), Box(1199, 1199)),
+  Box(Box(1200, 1200), Box(1200, 1200)),
+  Box(Box(1201, 1201), Box(1201, 1201)),
+  Box(Box(1202, 1202), Box(1202, 1202)),
+  Box(Box(1203, 1203), Box(1203, 1203)),
+  Box(Box(1204, 1204), Box(1204, 1204)),
+  Box(Box(1205, 1205), Box(1205, 1205)),
+  Box(Box(1206, 1206), Box(1206, 1206)),
+  Box(Box(1207, 1207), Box(1207, 1207)),
+  Box(Box(1208, 1208), Box(1208, 1208)),
+  Box(Box(1209, 1209), Box(1209, 1209)),
+  Box(Box(1210, 1210), Box(1210, 1210)),
+  Box(Box(1211, 1211), Box(1211, 1211)),
+  Box(Box(1212, 1212), Box(1212, 1212)),
+  Box(Box(1213, 1213), Box(1213, 1213)),
+  Box(Box(1214, 1214), Box(1214, 1214)),
+  Box(Box(1215, 1215), Box(1215, 1215)),
+  Box(Box(1216, 1216), Box(1216, 1216)),
+  Box(Box(1217, 1217), Box(1217, 1217)),
+  Box(Box(1218, 1218), Box(1218, 1218)),
+  Box(Box(1219, 1219), Box(1219, 1219)),
+  Box(Box(1220, 1220), Box(1220, 1220)),
+  Box(Box(1221, 1221), Box(1221, 1221)),
+  Box(Box(1222, 1222), Box(1222, 1222)),
+  Box(Box(1223, 1223), Box(1223, 1223)),
+  Box(Box(1224, 1224), Box(1224, 1224)),
+  Box(Box(1225, 1225), Box(1225, 1225)),
+  Box(Box(1226, 1226), Box(1226, 1226)),
+  Box(Box(1227, 1227), Box(1227, 1227)),
+  Box(Box(1228, 1228), Box(1228, 1228)),
+  Box(Box(1229, 1229), Box(1229, 1229)),
+  Box(Box(1230, 1230), Box(1230, 1230)),
+  Box(Box(1231, 1231), Box(1231, 1231)),
+  Box(Box(1232, 1232), Box(1232, 1232)),
+  Box(Box(1233, 1233), Box(1233, 1233)),
+  Box(Box(1234, 1234), Box(1234, 1234)),
+  Box(Box(1235, 1235), Box(1235, 1235)),
+  Box(Box(1236, 1236), Box(1236, 1236)),
+  Box(Box(1237, 1237), Box(1237, 1237)),
+  Box(Box(1238, 1238), Box(1238, 1238)),
+  Box(Box(1239, 1239), Box(1239, 1239)),
+  Box(Box(1240, 1240), Box(1240, 1240)),
+  Box(Box(1241, 1241), Box(1241, 1241)),
+  Box(Box(1242, 1242), Box(1242, 1242)),
+  Box(Box(1243, 1243), Box(1243, 1243)),
+  Box(Box(1244, 1244), Box(1244, 1244)),
+  Box(Box(1245, 1245), Box(1245, 1245)),
+  Box(Box(1246, 1246), Box(1246, 1246)),
+  Box(Box(1247, 1247), Box(1247, 1247)),
+  Box(Box(1248, 1248), Box(1248, 1248)),
+  Box(Box(1249, 1249), Box(1249, 1249)),
+  Box(Box(1250, 1250), Box(1250, 1250)),
+  Box(Box(1251, 1251), Box(1251, 1251)),
+  Box(Box(1252, 1252), Box(1252, 1252)),
+  Box(Box(1253, 1253), Box(1253, 1253)),
+  Box(Box(1254, 1254), Box(1254, 1254)),
+  Box(Box(1255, 1255), Box(1255, 1255)),
+  Box(Box(1256, 1256), Box(1256, 1256)),
+  Box(Box(1257, 1257), Box(1257, 1257)),
+  Box(Box(1258, 1258), Box(1258, 1258)),
+  Box(Box(1259, 1259), Box(1259, 1259)),
+  Box(Box(1260, 1260), Box(1260, 1260)),
+  Box(Box(1261, 1261), Box(1261, 1261)),
+  Box(Box(1262, 1262), Box(1262, 1262)),
+  Box(Box(1263, 1263), Box(1263, 1263)),
+  Box(Box(1264, 1264), Box(1264, 1264)),
+  Box(Box(1265, 1265), Box(1265, 1265)),
+  Box(Box(1266, 1266), Box(1266, 1266)),
+  Box(Box(1267, 1267), Box(1267, 1267)),
+  Box(Box(1268, 1268), Box(1268, 1268)),
+  Box(Box(1269, 1269), Box(1269, 1269)),
+  Box(Box(1270, 1270), Box(1270, 1270)),
+  Box(Box(1271, 1271), Box(1271, 1271)),
+  Box(Box(1272, 1272), Box(1272, 1272)),
+  Box(Box(1273, 1273), Box(1273, 1273)),
+  Box(Box(1274, 1274), Box(1274, 1274)),
+  Box(Box(1275, 1275), Box(1275, 1275)),
+  Box(Box(1276, 1276), Box(1276, 1276)),
+  Box(Box(1277, 1277), Box(1277, 1277)),
+  Box(Box(1278, 1278), Box(1278, 1278)),
+  Box(Box(1279, 1279), Box(1279, 1279)),
+  Box(Box(1280, 1280), Box(1280, 1280)),
+  Box(Box(1281, 1281), Box(1281, 1281)),
+  Box(Box(1282, 1282), Box(1282, 1282)),
+  Box(Box(1283, 1283), Box(1283, 1283)),
+  Box(Box(1284, 1284), Box(1284, 1284)),
+  Box(Box(1285, 1285), Box(1285, 1285)),
+  Box(Box(1286, 1286), Box(1286, 1286)),
+  Box(Box(1287, 1287), Box(1287, 1287)),
+  Box(Box(1288, 1288), Box(1288, 1288)),
+  Box(Box(1289, 1289), Box(1289, 1289)),
+  Box(Box(1290, 1290), Box(1290, 1290)),
+  Box(Box(1291, 1291), Box(1291, 1291)),
+  Box(Box(1292, 1292), Box(1292, 1292)),
+  Box(Box(1293, 1293), Box(1293, 1293)),
+  Box(Box(1294, 1294), Box(1294, 1294)),
+  Box(Box(1295, 1295), Box(1295, 1295)),
+  Box(Box(1296, 1296), Box(1296, 1296)),
+  Box(Box(1297, 1297), Box(1297, 1297)),
+  Box(Box(1298, 1298), Box(1298, 1298)),
+  Box(Box(1299, 1299), Box(1299, 1299)),
+  Box(Box(1300, 1300), Box(1300, 1300)),
+  Box(Box(1301, 1301), Box(1301, 1301)),
+  Box(Box(1302, 1302), Box(1302, 1302)),
+  Box(Box(1303, 1303), Box(1303, 1303)),
+  Box(Box(1304, 1304), Box(1304, 1304)),
+  Box(Box(1305, 1305), Box(1305, 1305)),
+  Box(Box(1306, 1306), Box(1306, 1306)),
+  Box(Box(1307, 1307), Box(1307, 1307)),
+  Box(Box(1308, 1308), Box(1308, 1308)),
+  Box(Box(1309, 1309), Box(1309, 1309)),
+  Box(Box(1310, 1310), Box(1310, 1310)),
+  Box(Box(1311, 1311), Box(1311, 1311)),
+  Box(Box(1312, 1312), Box(1312, 1312)),
+  Box(Box(1313, 1313), Box(1313, 1313)),
+  Box(Box(1314, 1314), Box(1314, 1314)),
+  Box(Box(1315, 1315), Box(1315, 1315)),
+  Box(Box(1316, 1316), Box(1316, 1316)),
+  Box(Box(1317, 1317), Box(1317, 1317)),
+  Box(Box(1318, 1318), Box(1318, 1318)),
+  Box(Box(1319, 1319), Box(1319, 1319)),
+  Box(Box(1320, 1320), Box(1320, 1320)),
+  Box(Box(1321, 1321), Box(1321, 1321)),
+  Box(Box(1322, 1322), Box(1322, 1322)),
+  Box(Box(1323, 1323), Box(1323, 1323)),
+  Box(Box(1324, 1324), Box(1324, 1324)),
+  Box(Box(1325, 1325), Box(1325, 1325)),
+  Box(Box(1326, 1326), Box(1326, 1326)),
+  Box(Box(1327, 1327), Box(1327, 1327)),
+  Box(Box(1328, 1328), Box(1328, 1328)),
+  Box(Box(1329, 1329), Box(1329, 1329)),
+  Box(Box(1330, 1330), Box(1330, 1330)),
+  Box(Box(1331, 1331), Box(1331, 1331)),
+  Box(Box(1332, 1332), Box(1332, 1332)),
+  Box(Box(1333, 1333), Box(1333, 1333)),
+  Box(Box(1334, 1334), Box(1334, 1334)),
+  Box(Box(1335, 1335), Box(1335, 1335)),
+  Box(Box(1336, 1336), Box(1336, 1336)),
+  Box(Box(1337, 1337), Box(1337, 1337)),
+  Box(Box(1338, 1338), Box(1338, 1338)),
+  Box(Box(1339, 1339), Box(1339, 1339)),
+  Box(Box(1340, 1340), Box(1340, 1340)),
+  Box(Box(1341, 1341), Box(1341, 1341)),
+  Box(Box(1342, 1342), Box(1342, 1342)),
+  Box(Box(1343, 1343), Box(1343, 1343)),
+  Box(Box(1344, 1344), Box(1344, 1344)),
+  Box(Box(1345, 1345), Box(1345, 1345)),
+  Box(Box(1346, 1346), Box(1346, 1346)),
+  Box(Box(1347, 1347), Box(1347, 1347)),
+  Box(Box(1348, 1348), Box(1348, 1348)),
+  Box(Box(1349, 1349), Box(1349, 1349)),
+  Box(Box(1350, 1350), Box(1350, 1350)),
+  Box(Box(1351, 1351), Box(1351, 1351)),
+  Box(Box(1352, 1352), Box(1352, 1352)),
+  Box(Box(1353, 1353), Box(1353, 1353)),
+  Box(Box(1354, 1354), Box(1354, 1354)),
+  Box(Box(1355, 1355), Box(1355, 1355)),
+  Box(Box(1356, 1356), Box(1356, 1356)),
+  Box(Box(1357, 1357), Box(1357, 1357)),
+  Box(Box(1358, 1358), Box(1358, 1358)),
+  Box(Box(1359, 1359), Box(1359, 1359)),
+  Box(Box(1360, 1360), Box(1360, 1360)),
+  Box(Box(1361, 1361), Box(1361, 1361)),
+  Box(Box(1362, 1362), Box(1362, 1362)),
+  Box(Box(1363, 1363), Box(1363, 1363)),
+  Box(Box(1364, 1364), Box(1364, 1364)),
+  Box(Box(1365, 1365), Box(1365, 1365)),
+  Box(Box(1366, 1366), Box(1366, 1366)),
+  Box(Box(1367, 1367), Box(1367, 1367)),
+  Box(Box(1368, 1368), Box(1368, 1368)),
+  Box(Box(1369, 1369), Box(1369, 1369)),
+  Box(Box(1370, 1370), Box(1370, 1370)),
+  Box(Box(1371, 1371), Box(1371, 1371)),
+  Box(Box(1372, 1372), Box(1372, 1372)),
+  Box(Box(1373, 1373), Box(1373, 1373)),
+  Box(Box(1374, 1374), Box(1374, 1374)),
+  Box(Box(1375, 1375), Box(1375, 1375)),
+  Box(Box(1376, 1376), Box(1376, 1376)),
+  Box(Box(1377, 1377), Box(1377, 1377)),
+  Box(Box(1378, 1378), Box(1378, 1378)),
+  Box(Box(1379, 1379), Box(1379, 1379)),
+  Box(Box(1380, 1380), Box(1380, 1380)),
+  Box(Box(1381, 1381), Box(1381, 1381)),
+  Box(Box(1382, 1382), Box(1382, 1382)),
+  Box(Box(1383, 1383), Box(1383, 1383)),
+  Box(Box(1384, 1384), Box(1384, 1384)),
+  Box(Box(1385, 1385), Box(1385, 1385)),
+  Box(Box(1386, 1386), Box(1386, 1386)),
+  Box(Box(1387, 1387), Box(1387, 1387)),
+  Box(Box(1388, 1388), Box(1388, 1388)),
+  Box(Box(1389, 1389), Box(1389, 1389)),
+  Box(Box(1390, 1390), Box(1390, 1390)),
+  Box(Box(1391, 1391), Box(1391, 1391)),
+  Box(Box(1392, 1392), Box(1392, 1392)),
+  Box(Box(1393, 1393), Box(1393, 1393)),
+  Box(Box(1394, 1394), Box(1394, 1394)),
+  Box(Box(1395, 1395), Box(1395, 1395)),
+  Box(Box(1396, 1396), Box(1396, 1396)),
+  Box(Box(1397, 1397), Box(1397, 1397)),
+  Box(Box(1398, 1398), Box(1398, 1398)),
+  Box(Box(1399, 1399), Box(1399, 1399)),
+  Box(Box(1400, 1400), Box(1400, 1400)),
+  Box(Box(1401, 1401), Box(1401, 1401)),
+  Box(Box(1402, 1402), Box(1402, 1402)),
+  Box(Box(1403, 1403), Box(1403, 1403)),
+  Box(Box(1404, 1404), Box(1404, 1404)),
+  Box(Box(1405, 1405), Box(1405, 1405)),
+  Box(Box(1406, 1406), Box(1406, 1406)),
+  Box(Box(1407, 1407), Box(1407, 1407)),
+  Box(Box(1408, 1408), Box(1408, 1408)),
+  Box(Box(1409, 1409), Box(1409, 1409)),
+  Box(Box(1410, 1410), Box(1410, 1410)),
+  Box(Box(1411, 1411), Box(1411, 1411)),
+  Box(Box(1412, 1412), Box(1412, 1412)),
+  Box(Box(1413, 1413), Box(1413, 1413)),
+  Box(Box(1414, 1414), Box(1414, 1414)),
+  Box(Box(1415, 1415), Box(1415, 1415)),
+  Box(Box(1416, 1416), Box(1416, 1416)),
+  Box(Box(1417, 1417), Box(1417, 1417)),
+  Box(Box(1418, 1418), Box(1418, 1418)),
+  Box(Box(1419, 1419), Box(1419, 1419)),
+  Box(Box(1420, 1420), Box(1420, 1420)),
+  Box(Box(1421, 1421), Box(1421, 1421)),
+  Box(Box(1422, 1422), Box(1422, 1422)),
+  Box(Box(1423, 1423), Box(1423, 1423)),
+  Box(Box(1424, 1424), Box(1424, 1424)),
+  Box(Box(1425, 1425), Box(1425, 1425)),
+  Box(Box(1426, 1426), Box(1426, 1426)),
+  Box(Box(1427, 1427), Box(1427, 1427)),
+  Box(Box(1428, 1428), Box(1428, 1428)),
+  Box(Box(1429, 1429), Box(1429, 1429)),
+  Box(Box(1430, 1430), Box(1430, 1430)),
+  Box(Box(1431, 1431), Box(1431, 1431)),
+  Box(Box(1432, 1432), Box(1432, 1432)),
+  Box(Box(1433, 1433), Box(1433, 1433)),
+  Box(Box(1434, 1434), Box(1434, 1434)),
+  Box(Box(1435, 1435), Box(1435, 1435)),
+  Box(Box(1436, 1436), Box(1436, 1436)),
+  Box(Box(1437, 1437), Box(1437, 1437)),
+  Box(Box(1438, 1438), Box(1438, 1438)),
+  Box(Box(1439, 1439), Box(1439, 1439)),
+  Box(Box(1440, 1440), Box(1440, 1440)),
+  Box(Box(1441, 1441), Box(1441, 1441)),
+  Box(Box(1442, 1442), Box(1442, 1442)),
+  Box(Box(1443, 1443), Box(1443, 1443)),
+  Box(Box(1444, 1444), Box(1444, 1444)),
+  Box(Box(1445, 1445), Box(1445, 1445)),
+  Box(Box(1446, 1446), Box(1446, 1446)),
+  Box(Box(1447, 1447), Box(1447, 1447)),
+  Box(Box(1448, 1448), Box(1448, 1448)),
+  Box(Box(1449, 1449), Box(1449, 1449)),
+  Box(Box(1450, 1450), Box(1450, 1450)),
+  Box(Box(1451, 1451), Box(1451, 1451)),
+  Box(Box(1452, 1452), Box(1452, 1452)),
+  Box(Box(1453, 1453), Box(1453, 1453)),
+  Box(Box(1454, 1454), Box(1454, 1454)),
+  Box(Box(1455, 1455), Box(1455, 1455)),
+  Box(Box(1456, 1456), Box(1456, 1456)),
+  Box(Box(1457, 1457), Box(1457, 1457)),
+  Box(Box(1458, 1458), Box(1458, 1458)),
+  Box(Box(1459, 1459), Box(1459, 1459)),
+  Box(Box(1460, 1460), Box(1460, 1460)),
+  Box(Box(1461, 1461), Box(1461, 1461)),
+  Box(Box(1462, 1462), Box(1462, 1462)),
+  Box(Box(1463, 1463), Box(1463, 1463)),
+  Box(Box(1464, 1464), Box(1464, 1464)),
+  Box(Box(1465, 1465), Box(1465, 1465)),
+  Box(Box(1466, 1466), Box(1466, 1466)),
+  Box(Box(1467, 1467), Box(1467, 1467)),
+  Box(Box(1468, 1468), Box(1468, 1468)),
+  Box(Box(1469, 1469), Box(1469, 1469)),
+  Box(Box(1470, 1470), Box(1470, 1470)),
+  Box(Box(1471, 1471), Box(1471, 1471)),
+  Box(Box(1472, 1472), Box(1472, 1472)),
+  Box(Box(1473, 1473), Box(1473, 1473)),
+  Box(Box(1474, 1474), Box(1474, 1474)),
+  Box(Box(1475, 1475), Box(1475, 1475)),
+  Box(Box(1476, 1476), Box(1476, 1476)),
+  Box(Box(1477, 1477), Box(1477, 1477)),
+  Box(Box(1478, 1478), Box(1478, 1478)),
+  Box(Box(1479, 1479), Box(1479, 1479)),
+  Box(Box(1480, 1480), Box(1480, 1480)),
+  Box(Box(1481, 1481), Box(1481, 1481)),
+  Box(Box(1482, 1482), Box(1482, 1482)),
+  Box(Box(1483, 1483), Box(1483, 1483)),
+  Box(Box(1484, 1484), Box(1484, 1484)),
+  Box(Box(1485, 1485), Box(1485, 1485)),
+  Box(Box(1486, 1486), Box(1486, 1486)),
+  Box(Box(1487, 1487), Box(1487, 1487)),
+  Box(Box(1488, 1488), Box(1488, 1488)),
+  Box(Box(1489, 1489), Box(1489, 1489)),
+  Box(Box(1490, 1490), Box(1490, 1490)),
+  Box(Box(1491, 1491), Box(1491, 1491)),
+  Box(Box(1492, 1492), Box(1492, 1492)),
+  Box(Box(1493, 1493), Box(1493, 1493)),
+  Box(Box(1494, 1494), Box(1494, 1494)),
+  Box(Box(1495, 1495), Box(1495, 1495)),
+  Box(Box(1496, 1496), Box(1496, 1496)),
+  Box(Box(1497, 1497), Box(1497, 1497)),
+  Box(Box(1498, 1498), Box(1498, 1498)),
+  Box(Box(1499, 1499), Box(1499, 1499)),
+  Box(Box(1500, 1500), Box(1500, 1500)),
+  Box(Box(1501, 1501), Box(1501, 1501)),
+  Box(Box(1502, 1502), Box(1502, 1502)),
+  Box(Box(1503, 1503), Box(1503, 1503)),
+  Box(Box(1504, 1504), Box(1504, 1504)),
+  Box(Box(1505, 1505), Box(1505, 1505)),
+  Box(Box(1506, 1506), Box(1506, 1506)),
+  Box(Box(1507, 1507), Box(1507, 1507)),
+  Box(Box(1508, 1508), Box(1508, 1508)),
+  Box(Box(1509, 1509), Box(1509, 1509)),
+  Box(Box(1510, 1510), Box(1510, 1510)),
+  Box(Box(1511, 1511), Box(1511, 1511)),
+  Box(Box(1512, 1512), Box(1512, 1512)),
+  Box(Box(1513, 1513), Box(1513, 1513)),
+  Box(Box(1514, 1514), Box(1514, 1514)),
+  Box(Box(1515, 1515), Box(1515, 1515)),
+  Box(Box(1516, 1516), Box(1516, 1516)),
+  Box(Box(1517, 1517), Box(1517, 1517)),
+  Box(Box(1518, 1518), Box(1518, 1518)),
+  Box(Box(1519, 1519), Box(1519, 1519)),
+  Box(Box(1520, 1520), Box(1520, 1520)),
+  Box(Box(1521, 1521), Box(1521, 1521)),
+  Box(Box(1522, 1522), Box(1522, 1522)),
+  Box(Box(1523, 1523), Box(1523, 1523)),
+  Box(Box(1524, 1524), Box(1524, 1524)),
+  Box(Box(1525, 1525), Box(1525, 1525)),
+  Box(Box(1526, 1526), Box(1526, 1526)),
+  Box(Box(1527, 1527), Box(1527, 1527)),
+  Box(Box(1528, 1528), Box(1528, 1528)),
+  Box(Box(1529, 1529), Box(1529, 1529)),
+  Box(Box(1530, 1530), Box(1530, 1530)),
+  Box(Box(1531, 1531), Box(1531, 1531)),
+  Box(Box(1532, 1532), Box(1532, 1532)),
+  Box(Box(1533, 1533), Box(1533, 1533)),
+  Box(Box(1534, 1534), Box(1534, 1534)),
+  Box(Box(1535, 1535), Box(1535, 1535)),
+  Box(Box(1536, 1536), Box(1536, 1536)),
+  Box(Box(1537, 1537), Box(1537, 1537)),
+  Box(Box(1538, 1538), Box(1538, 1538)),
+  Box(Box(1539, 1539), Box(1539, 1539)),
+  Box(Box(1540, 1540), Box(1540, 1540)),
+  Box(Box(1541, 1541), Box(1541, 1541)),
+  Box(Box(1542, 1542), Box(1542, 1542)),
+  Box(Box(1543, 1543), Box(1543, 1543)),
+  Box(Box(1544, 1544), Box(1544, 1544)),
+  Box(Box(1545, 1545), Box(1545, 1545)),
+  Box(Box(1546, 1546), Box(1546, 1546)),
+  Box(Box(1547, 1547), Box(1547, 1547)),
+  Box(Box(1548, 1548), Box(1548, 1548)),
+  Box(Box(1549, 1549), Box(1549, 1549)),
+  Box(Box(1550, 1550), Box(1550, 1550)),
+  Box(Box(1551, 1551), Box(1551, 1551)),
+  Box(Box(1552, 1552), Box(1552, 1552)),
+  Box(Box(1553, 1553), Box(1553, 1553)),
+  Box(Box(1554, 1554), Box(1554, 1554)),
+  Box(Box(1555, 1555), Box(1555, 1555)),
+  Box(Box(1556, 1556), Box(1556, 1556)),
+  Box(Box(1557, 1557), Box(1557, 1557)),
+  Box(Box(1558, 1558), Box(1558, 1558)),
+  Box(Box(1559, 1559), Box(1559, 1559)),
+  Box(Box(1560, 1560), Box(1560, 1560)),
+  Box(Box(1561, 1561), Box(1561, 1561)),
+  Box(Box(1562, 1562), Box(1562, 1562)),
+  Box(Box(1563, 1563), Box(1563, 1563)),
+  Box(Box(1564, 1564), Box(1564, 1564)),
+  Box(Box(1565, 1565), Box(1565, 1565)),
+  Box(Box(1566, 1566), Box(1566, 1566)),
+  Box(Box(1567, 1567), Box(1567, 1567)),
+  Box(Box(1568, 1568), Box(1568, 1568)),
+  Box(Box(1569, 1569), Box(1569, 1569)),
+  Box(Box(1570, 1570), Box(1570, 1570)),
+  Box(Box(1571, 1571), Box(1571, 1571)),
+  Box(Box(1572, 1572), Box(1572, 1572)),
+  Box(Box(1573, 1573), Box(1573, 1573)),
+  Box(Box(1574, 1574), Box(1574, 1574)),
+  Box(Box(1575, 1575), Box(1575, 1575)),
+  Box(Box(1576, 1576), Box(1576, 1576)),
+  Box(Box(1577, 1577), Box(1577, 1577)),
+  Box(Box(1578, 1578), Box(1578, 1578)),
+  Box(Box(1579, 1579), Box(1579, 1579)),
+  Box(Box(1580, 1580), Box(1580, 1580)),
+  Box(Box(1581, 1581), Box(1581, 1581)),
+  Box(Box(1582, 1582), Box(1582, 1582)),
+  Box(Box(1583, 1583), Box(1583, 1583)),
+  Box(Box(1584, 1584), Box(1584, 1584)),
+  Box(Box(1585, 1585), Box(1585, 1585)),
+  Box(Box(1586, 1586), Box(1586, 1586)),
+  Box(Box(1587, 1587), Box(1587, 1587)),
+  Box(Box(1588, 1588), Box(1588, 1588)),
+  Box(Box(1589, 1589), Box(1589, 1589)),
+  Box(Box(1590, 1590), Box(1590, 1590)),
+  Box(Box(1591, 1591), Box(1591, 1591)),
+  Box(Box(1592, 1592), Box(1592, 1592)),
+  Box(Box(1593, 1593), Box(1593, 1593)),
+  Box(Box(1594, 1594), Box(1594, 1594)),
+  Box(Box(1595, 1595), Box(1595, 1595)),
+  Box(Box(1596, 1596), Box(1596, 1596)),
+  Box(Box(1597, 1597), Box(1597, 1597)),
+  Box(Box(1598, 1598), Box(1598, 1598)),
+  Box(Box(1599, 1599), Box(1599, 1599)),
+  Box(Box(1600, 1600), Box(1600, 1600)),
+  Box(Box(1601, 1601), Box(1601, 1601)),
+  Box(Box(1602, 1602), Box(1602, 1602)),
+  Box(Box(1603, 1603), Box(1603, 1603)),
+  Box(Box(1604, 1604), Box(1604, 1604)),
+  Box(Box(1605, 1605), Box(1605, 1605)),
+  Box(Box(1606, 1606), Box(1606, 1606)),
+  Box(Box(1607, 1607), Box(1607, 1607)),
+  Box(Box(1608, 1608), Box(1608, 1608)),
+  Box(Box(1609, 1609), Box(1609, 1609)),
+  Box(Box(1610, 1610), Box(1610, 1610)),
+  Box(Box(1611, 1611), Box(1611, 1611)),
+  Box(Box(1612, 1612), Box(1612, 1612)),
+  Box(Box(1613, 1613), Box(1613, 1613)),
+  Box(Box(1614, 1614), Box(1614, 1614)),
+  Box(Box(1615, 1615), Box(1615, 1615)),
+  Box(Box(1616, 1616), Box(1616, 1616)),
+  Box(Box(1617, 1617), Box(1617, 1617)),
+  Box(Box(1618, 1618), Box(1618, 1618)),
+  Box(Box(1619, 1619), Box(1619, 1619)),
+  Box(Box(1620, 1620), Box(1620, 1620)),
+  Box(Box(1621, 1621), Box(1621, 1621)),
+  Box(Box(1622, 1622), Box(1622, 1622)),
+  Box(Box(1623, 1623), Box(1623, 1623)),
+  Box(Box(1624, 1624), Box(1624, 1624)),
+  Box(Box(1625, 1625), Box(1625, 1625)),
+  Box(Box(1626, 1626), Box(1626, 1626)),
+  Box(Box(1627, 1627), Box(1627, 1627)),
+  Box(Box(1628, 1628), Box(1628, 1628)),
+  Box(Box(1629, 1629), Box(1629, 1629)),
+  Box(Box(1630, 1630), Box(1630, 1630)),
+  Box(Box(1631, 1631), Box(1631, 1631)),
+  Box(Box(1632, 1632), Box(1632, 1632)),
+  Box(Box(1633, 1633), Box(1633, 1633)),
+  Box(Box(1634, 1634), Box(1634, 1634)),
+  Box(Box(1635, 1635), Box(1635, 1635)),
+  Box(Box(1636, 1636), Box(1636, 1636)),
+  Box(Box(1637, 1637), Box(1637, 1637)),
+  Box(Box(1638, 1638), Box(1638, 1638)),
+  Box(Box(1639, 1639), Box(1639, 1639)),
+  Box(Box(1640, 1640), Box(1640, 1640)),
+  Box(Box(1641, 1641), Box(1641, 1641)),
+  Box(Box(1642, 1642), Box(1642, 1642)),
+  Box(Box(1643, 1643), Box(1643, 1643)),
+  Box(Box(1644, 1644), Box(1644, 1644)),
+  Box(Box(1645, 1645), Box(1645, 1645)),
+  Box(Box(1646, 1646), Box(1646, 1646)),
+  Box(Box(1647, 1647), Box(1647, 1647)),
+  Box(Box(1648, 1648), Box(1648, 1648)),
+  Box(Box(1649, 1649), Box(1649, 1649)),
+  Box(Box(1650, 1650), Box(1650, 1650)),
+  Box(Box(1651, 1651), Box(1651, 1651)),
+  Box(Box(1652, 1652), Box(1652, 1652)),
+  Box(Box(1653, 1653), Box(1653, 1653)),
+  Box(Box(1654, 1654), Box(1654, 1654)),
+  Box(Box(1655, 1655), Box(1655, 1655)),
+  Box(Box(1656, 1656), Box(1656, 1656)),
+  Box(Box(1657, 1657), Box(1657, 1657)),
+  Box(Box(1658, 1658), Box(1658, 1658)),
+  Box(Box(1659, 1659), Box(1659, 1659)),
+  Box(Box(1660, 1660), Box(1660, 1660)),
+  Box(Box(1661, 1661), Box(1661, 1661)),
+  Box(Box(1662, 1662), Box(1662, 1662)),
+  Box(Box(1663, 1663), Box(1663, 1663)),
+  Box(Box(1664, 1664), Box(1664, 1664)),
+  Box(Box(1665, 1665), Box(1665, 1665)),
+  Box(Box(1666, 1666), Box(1666, 1666)),
+  Box(Box(1667, 1667), Box(1667, 1667)),
+  Box(Box(1668, 1668), Box(1668, 1668)),
+  Box(Box(1669, 1669), Box(1669, 1669)),
+  Box(Box(1670, 1670), Box(1670, 1670)),
+  Box(Box(1671, 1671), Box(1671, 1671)),
+  Box(Box(1672, 1672), Box(1672, 1672)),
+  Box(Box(1673, 1673), Box(1673, 1673)),
+  Box(Box(1674, 1674), Box(1674, 1674)),
+  Box(Box(1675, 1675), Box(1675, 1675)),
+  Box(Box(1676, 1676), Box(1676, 1676)),
+  Box(Box(1677, 1677), Box(1677, 1677)),
+  Box(Box(1678, 1678), Box(1678, 1678)),
+  Box(Box(1679, 1679), Box(1679, 1679)),
+  Box(Box(1680, 1680), Box(1680, 1680)),
+  Box(Box(1681, 1681), Box(1681, 1681)),
+  Box(Box(1682, 1682), Box(1682, 1682)),
+  Box(Box(1683, 1683), Box(1683, 1683)),
+  Box(Box(1684, 1684), Box(1684, 1684)),
+  Box(Box(1685, 1685), Box(1685, 1685)),
+  Box(Box(1686, 1686), Box(1686, 1686)),
+  Box(Box(1687, 1687), Box(1687, 1687)),
+  Box(Box(1688, 1688), Box(1688, 1688)),
+  Box(Box(1689, 1689), Box(1689, 1689)),
+  Box(Box(1690, 1690), Box(1690, 1690)),
+  Box(Box(1691, 1691), Box(1691, 1691)),
+  Box(Box(1692, 1692), Box(1692, 1692)),
+  Box(Box(1693, 1693), Box(1693, 1693)),
+  Box(Box(1694, 1694), Box(1694, 1694)),
+  Box(Box(1695, 1695), Box(1695, 1695)),
+  Box(Box(1696, 1696), Box(1696, 1696)),
+  Box(Box(1697, 1697), Box(1697, 1697)),
+  Box(Box(1698, 1698), Box(1698, 1698)),
+  Box(Box(1699, 1699), Box(1699, 1699)),
+  Box(Box(1700, 1700), Box(1700, 1700)),
+  Box(Box(1701, 1701), Box(1701, 1701)),
+  Box(Box(1702, 1702), Box(1702, 1702)),
+  Box(Box(1703, 1703), Box(1703, 1703)),
+  Box(Box(1704, 1704), Box(1704, 1704)),
+  Box(Box(1705, 1705), Box(1705, 1705)),
+  Box(Box(1706, 1706), Box(1706, 1706)),
+  Box(Box(1707, 1707), Box(1707, 1707)),
+  Box(Box(1708, 1708), Box(1708, 1708)),
+  Box(Box(1709, 1709), Box(1709, 1709)),
+  Box(Box(1710, 1710), Box(1710, 1710)),
+  Box(Box(1711, 1711), Box(1711, 1711)),
+  Box(Box(1712, 1712), Box(1712, 1712)),
+  Box(Box(1713, 1713), Box(1713, 1713)),
+  Box(Box(1714, 1714), Box(1714, 1714)),
+  Box(Box(1715, 1715), Box(1715, 1715)),
+  Box(Box(1716, 1716), Box(1716, 1716)),
+  Box(Box(1717, 1717), Box(1717, 1717)),
+  Box(Box(1718, 1718), Box(1718, 1718)),
+  Box(Box(1719, 1719), Box(1719, 1719)),
+  Box(Box(1720, 1720), Box(1720, 1720)),
+  Box(Box(1721, 1721), Box(1721, 1721)),
+  Box(Box(1722, 1722), Box(1722, 1722)),
+  Box(Box(1723, 1723), Box(1723, 1723)),
+  Box(Box(1724, 1724), Box(1724, 1724)),
+  Box(Box(1725, 1725), Box(1725, 1725)),
+  Box(Box(1726, 1726), Box(1726, 1726)),
+  Box(Box(1727, 1727), Box(1727, 1727)),
+  Box(Box(1728, 1728), Box(1728, 1728)),
+  Box(Box(1729, 1729), Box(1729, 1729)),
+  Box(Box(1730, 1730), Box(1730, 1730)),
+  Box(Box(1731, 1731), Box(1731, 1731)),
+  Box(Box(1732, 1732), Box(1732, 1732)),
+  Box(Box(1733, 1733), Box(1733, 1733)),
+  Box(Box(1734, 1734), Box(1734, 1734)),
+  Box(Box(1735, 1735), Box(1735, 1735)),
+  Box(Box(1736, 1736), Box(1736, 1736)),
+  Box(Box(1737, 1737), Box(1737, 1737)),
+  Box(Box(1738, 1738), Box(1738, 1738)),
+  Box(Box(1739, 1739), Box(1739, 1739)),
+  Box(Box(1740, 1740), Box(1740, 1740)),
+  Box(Box(1741, 1741), Box(1741, 1741)),
+  Box(Box(1742, 1742), Box(1742, 1742)),
+  Box(Box(1743, 1743), Box(1743, 1743)),
+  Box(Box(1744, 1744), Box(1744, 1744)),
+  Box(Box(1745, 1745), Box(1745, 1745)),
+  Box(Box(1746, 1746), Box(1746, 1746)),
+  Box(Box(1747, 1747), Box(1747, 1747)),
+  Box(Box(1748, 1748), Box(1748, 1748)),
+  Box(Box(1749, 1749), Box(1749, 1749)),
+  Box(Box(1750, 1750), Box(1750, 1750)),
+  Box(Box(1751, 1751), Box(1751, 1751)),
+  Box(Box(1752, 1752), Box(1752, 1752)),
+  Box(Box(1753, 1753), Box(1753, 1753)),
+  Box(Box(1754, 1754), Box(1754, 1754)),
+  Box(Box(1755, 1755), Box(1755, 1755)),
+  Box(Box(1756, 1756), Box(1756, 1756)),
+  Box(Box(1757, 1757), Box(1757, 1757)),
+  Box(Box(1758, 1758), Box(1758, 1758)),
+  Box(Box(1759, 1759), Box(1759, 1759)),
+  Box(Box(1760, 1760), Box(1760, 1760)),
+  Box(Box(1761, 1761), Box(1761, 1761)),
+  Box(Box(1762, 1762), Box(1762, 1762)),
+  Box(Box(1763, 1763), Box(1763, 1763)),
+  Box(Box(1764, 1764), Box(1764, 1764)),
+  Box(Box(1765, 1765), Box(1765, 1765)),
+  Box(Box(1766, 1766), Box(1766, 1766)),
+  Box(Box(1767, 1767), Box(1767, 1767)),
+  Box(Box(1768, 1768), Box(1768, 1768)),
+  Box(Box(1769, 1769), Box(1769, 1769)),
+  Box(Box(1770, 1770), Box(1770, 1770)),
+  Box(Box(1771, 1771), Box(1771, 1771)),
+  Box(Box(1772, 1772), Box(1772, 1772)),
+  Box(Box(1773, 1773), Box(1773, 1773)),
+  Box(Box(1774, 1774), Box(1774, 1774)),
+  Box(Box(1775, 1775), Box(1775, 1775)),
+  Box(Box(1776, 1776), Box(1776, 1776)),
+  Box(Box(1777, 1777), Box(1777, 1777)),
+  Box(Box(1778, 1778), Box(1778, 1778)),
+  Box(Box(1779, 1779), Box(1779, 1779)),
+  Box(Box(1780, 1780), Box(1780, 1780)),
+  Box(Box(1781, 1781), Box(1781, 1781)),
+  Box(Box(1782, 1782), Box(1782, 1782)),
+  Box(Box(1783, 1783), Box(1783, 1783)),
+  Box(Box(1784, 1784), Box(1784, 1784)),
+  Box(Box(1785, 1785), Box(1785, 1785)),
+  Box(Box(1786, 1786), Box(1786, 1786)),
+  Box(Box(1787, 1787), Box(1787, 1787)),
+  Box(Box(1788, 1788), Box(1788, 1788)),
+  Box(Box(1789, 1789), Box(1789, 1789)),
+  Box(Box(1790, 1790), Box(1790, 1790)),
+  Box(Box(1791, 1791), Box(1791, 1791)),
+  Box(Box(1792, 1792), Box(1792, 1792)),
+  Box(Box(1793, 1793), Box(1793, 1793)),
+  Box(Box(1794, 1794), Box(1794, 1794)),
+  Box(Box(1795, 1795), Box(1795, 1795)),
+  Box(Box(1796, 1796), Box(1796, 1796)),
+  Box(Box(1797, 1797), Box(1797, 1797)),
+  Box(Box(1798, 1798), Box(1798, 1798)),
+  Box(Box(1799, 1799), Box(1799, 1799)),
+  Box(Box(1800, 1800), Box(1800, 1800)),
+  Box(Box(1801, 1801), Box(1801, 1801)),
+  Box(Box(1802, 1802), Box(1802, 1802)),
+  Box(Box(1803, 1803), Box(1803, 1803)),
+  Box(Box(1804, 1804), Box(1804, 1804)),
+  Box(Box(1805, 1805), Box(1805, 1805)),
+  Box(Box(1806, 1806), Box(1806, 1806)),
+  Box(Box(1807, 1807), Box(1807, 1807)),
+  Box(Box(1808, 1808), Box(1808, 1808)),
+  Box(Box(1809, 1809), Box(1809, 1809)),
+  Box(Box(1810, 1810), Box(1810, 1810)),
+  Box(Box(1811, 1811), Box(1811, 1811)),
+  Box(Box(1812, 1812), Box(1812, 1812)),
+  Box(Box(1813, 1813), Box(1813, 1813)),
+  Box(Box(1814, 1814), Box(1814, 1814)),
+  Box(Box(1815, 1815), Box(1815, 1815)),
+  Box(Box(1816, 1816), Box(1816, 1816)),
+  Box(Box(1817, 1817), Box(1817, 1817)),
+  Box(Box(1818, 1818), Box(1818, 1818)),
+  Box(Box(1819, 1819), Box(1819, 1819)),
+  Box(Box(1820, 1820), Box(1820, 1820)),
+  Box(Box(1821, 1821), Box(1821, 1821)),
+  Box(Box(1822, 1822), Box(1822, 1822)),
+  Box(Box(1823, 1823), Box(1823, 1823)),
+  Box(Box(1824, 1824), Box(1824, 1824)),
+  Box(Box(1825, 1825), Box(1825, 1825)),
+  Box(Box(1826, 1826), Box(1826, 1826)),
+  Box(Box(1827, 1827), Box(1827, 1827)),
+  Box(Box(1828, 1828), Box(1828, 1828)),
+  Box(Box(1829, 1829), Box(1829, 1829)),
+  Box(Box(1830, 1830), Box(1830, 1830)),
+  Box(Box(1831, 1831), Box(1831, 1831)),
+  Box(Box(1832, 1832), Box(1832, 1832)),
+  Box(Box(1833, 1833), Box(1833, 1833)),
+  Box(Box(1834, 1834), Box(1834, 1834)),
+  Box(Box(1835, 1835), Box(1835, 1835)),
+  Box(Box(1836, 1836), Box(1836, 1836)),
+  Box(Box(1837, 1837), Box(1837, 1837)),
+  Box(Box(1838, 1838), Box(1838, 1838)),
+  Box(Box(1839, 1839), Box(1839, 1839)),
+  Box(Box(1840, 1840), Box(1840, 1840)),
+  Box(Box(1841, 1841), Box(1841, 1841)),
+  Box(Box(1842, 1842), Box(1842, 1842)),
+  Box(Box(1843, 1843), Box(1843, 1843)),
+  Box(Box(1844, 1844), Box(1844, 1844)),
+  Box(Box(1845, 1845), Box(1845, 1845)),
+  Box(Box(1846, 1846), Box(1846, 1846)),
+  Box(Box(1847, 1847), Box(1847, 1847)),
+  Box(Box(1848, 1848), Box(1848, 1848)),
+  Box(Box(1849, 1849), Box(1849, 1849)),
+  Box(Box(1850, 1850), Box(1850, 1850)),
+  Box(Box(1851, 1851), Box(1851, 1851)),
+  Box(Box(1852, 1852), Box(1852, 1852)),
+  Box(Box(1853, 1853), Box(1853, 1853)),
+  Box(Box(1854, 1854), Box(1854, 1854)),
+  Box(Box(1855, 1855), Box(1855, 1855)),
+  Box(Box(1856, 1856), Box(1856, 1856)),
+  Box(Box(1857, 1857), Box(1857, 1857)),
+  Box(Box(1858, 1858), Box(1858, 1858)),
+  Box(Box(1859, 1859), Box(1859, 1859)),
+  Box(Box(1860, 1860), Box(1860, 1860)),
+  Box(Box(1861, 1861), Box(1861, 1861)),
+  Box(Box(1862, 1862), Box(1862, 1862)),
+  Box(Box(1863, 1863), Box(1863, 1863)),
+  Box(Box(1864, 1864), Box(1864, 1864)),
+  Box(Box(1865, 1865), Box(1865, 1865)),
+  Box(Box(1866, 1866), Box(1866, 1866)),
+  Box(Box(1867, 1867), Box(1867, 1867)),
+  Box(Box(1868, 1868), Box(1868, 1868)),
+  Box(Box(1869, 1869), Box(1869, 1869)),
+  Box(Box(1870, 1870), Box(1870, 1870)),
+  Box(Box(1871, 1871), Box(1871, 1871)),
+  Box(Box(1872, 1872), Box(1872, 1872)),
+  Box(Box(1873, 1873), Box(1873, 1873)),
+  Box(Box(1874, 1874), Box(1874, 1874)),
+  Box(Box(1875, 1875), Box(1875, 1875)),
+  Box(Box(1876, 1876), Box(1876, 1876)),
+  Box(Box(1877, 1877), Box(1877, 1877)),
+  Box(Box(1878, 1878), Box(1878, 1878)),
+  Box(Box(1879, 1879), Box(1879, 1879)),
+  Box(Box(1880, 1880), Box(1880, 1880)),
+  Box(Box(1881, 1881), Box(1881, 1881)),
+  Box(Box(1882, 1882), Box(1882, 1882)),
+  Box(Box(1883, 1883), Box(1883, 1883)),
+  Box(Box(1884, 1884), Box(1884, 1884)),
+  Box(Box(1885, 1885), Box(1885, 1885)),
+  Box(Box(1886, 1886), Box(1886, 1886)),
+  Box(Box(1887, 1887), Box(1887, 1887)),
+  Box(Box(1888, 1888), Box(1888, 1888)),
+  Box(Box(1889, 1889), Box(1889, 1889)),
+  Box(Box(1890, 1890), Box(1890, 1890)),
+  Box(Box(1891, 1891), Box(1891, 1891)),
+  Box(Box(1892, 1892), Box(1892, 1892)),
+  Box(Box(1893, 1893), Box(1893, 1893)),
+  Box(Box(1894, 1894), Box(1894, 1894)),
+  Box(Box(1895, 1895), Box(1895, 1895)),
+  Box(Box(1896, 1896), Box(1896, 1896)),
+  Box(Box(1897, 1897), Box(1897, 1897)),
+  Box(Box(1898, 1898), Box(1898, 1898)),
+  Box(Box(1899, 1899), Box(1899, 1899)),
+  Box(Box(1900, 1900), Box(1900, 1900)),
+  Box(Box(1901, 1901), Box(1901, 1901)),
+  Box(Box(1902, 1902), Box(1902, 1902)),
+  Box(Box(1903, 1903), Box(1903, 1903)),
+  Box(Box(1904, 1904), Box(1904, 1904)),
+  Box(Box(1905, 1905), Box(1905, 1905)),
+  Box(Box(1906, 1906), Box(1906, 1906)),
+  Box(Box(1907, 1907), Box(1907, 1907)),
+  Box(Box(1908, 1908), Box(1908, 1908)),
+  Box(Box(1909, 1909), Box(1909, 1909)),
+  Box(Box(1910, 1910), Box(1910, 1910)),
+  Box(Box(1911, 1911), Box(1911, 1911)),
+  Box(Box(1912, 1912), Box(1912, 1912)),
+  Box(Box(1913, 1913), Box(1913, 1913)),
+  Box(Box(1914, 1914), Box(1914, 1914)),
+  Box(Box(1915, 1915), Box(1915, 1915)),
+  Box(Box(1916, 1916), Box(1916, 1916)),
+  Box(Box(1917, 1917), Box(1917, 1917)),
+  Box(Box(1918, 1918), Box(1918, 1918)),
+  Box(Box(1919, 1919), Box(1919, 1919)),
+  Box(Box(1920, 1920), Box(1920, 1920)),
+  Box(Box(1921, 1921), Box(1921, 1921)),
+  Box(Box(1922, 1922), Box(1922, 1922)),
+  Box(Box(1923, 1923), Box(1923, 1923)),
+  Box(Box(1924, 1924), Box(1924, 1924)),
+  Box(Box(1925, 1925), Box(1925, 1925)),
+  Box(Box(1926, 1926), Box(1926, 1926)),
+  Box(Box(1927, 1927), Box(1927, 1927)),
+  Box(Box(1928, 1928), Box(1928, 1928)),
+  Box(Box(1929, 1929), Box(1929, 1929)),
+  Box(Box(1930, 1930), Box(1930, 1930)),
+  Box(Box(1931, 1931), Box(1931, 1931)),
+  Box(Box(1932, 1932), Box(1932, 1932)),
+  Box(Box(1933, 1933), Box(1933, 1933)),
+  Box(Box(1934, 1934), Box(1934, 1934)),
+  Box(Box(1935, 1935), Box(1935, 1935)),
+  Box(Box(1936, 1936), Box(1936, 1936)),
+  Box(Box(1937, 1937), Box(1937, 1937)),
+  Box(Box(1938, 1938), Box(1938, 1938)),
+  Box(Box(1939, 1939), Box(1939, 1939)),
+  Box(Box(1940, 1940), Box(1940, 1940)),
+  Box(Box(1941, 1941), Box(1941, 1941)),
+  Box(Box(1942, 1942), Box(1942, 1942)),
+  Box(Box(1943, 1943), Box(1943, 1943)),
+  Box(Box(1944, 1944), Box(1944, 1944)),
+  Box(Box(1945, 1945), Box(1945, 1945)),
+  Box(Box(1946, 1946), Box(1946, 1946)),
+  Box(Box(1947, 1947), Box(1947, 1947)),
+  Box(Box(1948, 1948), Box(1948, 1948)),
+  Box(Box(1949, 1949), Box(1949, 1949)),
+  Box(Box(1950, 1950), Box(1950, 1950)),
+  Box(Box(1951, 1951), Box(1951, 1951)),
+  Box(Box(1952, 1952), Box(1952, 1952)),
+  Box(Box(1953, 1953), Box(1953, 1953)),
+  Box(Box(1954, 1954), Box(1954, 1954)),
+  Box(Box(1955, 1955), Box(1955, 1955)),
+  Box(Box(1956, 1956), Box(1956, 1956)),
+  Box(Box(1957, 1957), Box(1957, 1957)),
+  Box(Box(1958, 1958), Box(1958, 1958)),
+  Box(Box(1959, 1959), Box(1959, 1959)),
+  Box(Box(1960, 1960), Box(1960, 1960)),
+  Box(Box(1961, 1961), Box(1961, 1961)),
+  Box(Box(1962, 1962), Box(1962, 1962)),
+  Box(Box(1963, 1963), Box(1963, 1963)),
+  Box(Box(1964, 1964), Box(1964, 1964)),
+  Box(Box(1965, 1965), Box(1965, 1965)),
+  Box(Box(1966, 1966), Box(1966, 1966)),
+  Box(Box(1967, 1967), Box(1967, 1967)),
+  Box(Box(1968, 1968), Box(1968, 1968)),
+  Box(Box(1969, 1969), Box(1969, 1969)),
+  Box(Box(1970, 1970), Box(1970, 1970)),
+  Box(Box(1971, 1971), Box(1971, 1971)),
+  Box(Box(1972, 1972), Box(1972, 1972)),
+  Box(Box(1973, 1973), Box(1973, 1973)),
+  Box(Box(1974, 1974), Box(1974, 1974)),
+  Box(Box(1975, 1975), Box(1975, 1975)),
+  Box(Box(1976, 1976), Box(1976, 1976)),
+  Box(Box(1977, 1977), Box(1977, 1977)),
+  Box(Box(1978, 1978), Box(1978, 1978)),
+  Box(Box(1979, 1979), Box(1979, 1979)),
+  Box(Box(1980, 1980), Box(1980, 1980)),
+  Box(Box(1981, 1981), Box(1981, 1981)),
+  Box(Box(1982, 1982), Box(1982, 1982)),
+  Box(Box(1983, 1983), Box(1983, 1983)),
+  Box(Box(1984, 1984), Box(1984, 1984)),
+  Box(Box(1985, 1985), Box(1985, 1985)),
+  Box(Box(1986, 1986), Box(1986, 1986)),
+  Box(Box(1987, 1987), Box(1987, 1987)),
+  Box(Box(1988, 1988), Box(1988, 1988)),
+  Box(Box(1989, 1989), Box(1989, 1989)),
+  Box(Box(1990, 1990), Box(1990, 1990)),
+  Box(Box(1991, 1991), Box(1991, 1991)),
+  Box(Box(1992, 1992), Box(1992, 1992)),
+  Box(Box(1993, 1993), Box(1993, 1993)),
+  Box(Box(1994, 1994), Box(1994, 1994)),
+  Box(Box(1995, 1995), Box(1995, 1995)),
+  Box(Box(1996, 1996), Box(1996, 1996)),
+  Box(Box(1997, 1997), Box(1997, 1997)),
+  Box(Box(1998, 1998), Box(1998, 1998)),
+  Box(Box(1999, 1999), Box(1999, 1999)),
+  Box(Box(2000, 2000), Box(2000, 2000)),
+  Box(Box(2001, 2001), Box(2001, 2001)),
+  Box(Box(2002, 2002), Box(2002, 2002)),
+  Box(Box(2003, 2003), Box(2003, 2003)),
+  Box(Box(2004, 2004), Box(2004, 2004)),
+  Box(Box(2005, 2005), Box(2005, 2005)),
+  Box(Box(2006, 2006), Box(2006, 2006)),
+  Box(Box(2007, 2007), Box(2007, 2007)),
+  Box(Box(2008, 2008), Box(2008, 2008)),
+  Box(Box(2009, 2009), Box(2009, 2009)),
+  Box(Box(2010, 2010), Box(2010, 2010)),
+  Box(Box(2011, 2011), Box(2011, 2011)),
+  Box(Box(2012, 2012), Box(2012, 2012)),
+  Box(Box(2013, 2013), Box(2013, 2013)),
+  Box(Box(2014, 2014), Box(2014, 2014)),
+  Box(Box(2015, 2015), Box(2015, 2015)),
+  Box(Box(2016, 2016), Box(2016, 2016)),
+  Box(Box(2017, 2017), Box(2017, 2017)),
+  Box(Box(2018, 2018), Box(2018, 2018)),
+  Box(Box(2019, 2019), Box(2019, 2019)),
+  Box(Box(2020, 2020), Box(2020, 2020)),
+  Box(Box(2021, 2021), Box(2021, 2021)),
+  Box(Box(2022, 2022), Box(2022, 2022)),
+  Box(Box(2023, 2023), Box(2023, 2023)),
+  Box(Box(2024, 2024), Box(2024, 2024)),
+  Box(Box(2025, 2025), Box(2025, 2025)),
+  Box(Box(2026, 2026), Box(2026, 2026)),
+  Box(Box(2027, 2027), Box(2027, 2027)),
+  Box(Box(2028, 2028), Box(2028, 2028)),
+  Box(Box(2029, 2029), Box(2029, 2029)),
+  Box(Box(2030, 2030), Box(2030, 2030)),
+  Box(Box(2031, 2031), Box(2031, 2031)),
+  Box(Box(2032, 2032), Box(2032, 2032)),
+  Box(Box(2033, 2033), Box(2033, 2033)),
+  Box(Box(2034, 2034), Box(2034, 2034)),
+  Box(Box(2035, 2035), Box(2035, 2035)),
+  Box(Box(2036, 2036), Box(2036, 2036)),
+  Box(Box(2037, 2037), Box(2037, 2037)),
+  Box(Box(2038, 2038), Box(2038, 2038)),
+  Box(Box(2039, 2039), Box(2039, 2039)),
+  Box(Box(2040, 2040), Box(2040, 2040)),
+  Box(Box(2041, 2041), Box(2041, 2041)),
+  Box(Box(2042, 2042), Box(2042, 2042)),
+  Box(Box(2043, 2043), Box(2043, 2043)),
+  Box(Box(2044, 2044), Box(2044, 2044)),
+  Box(Box(2045, 2045), Box(2045, 2045)),
+  Box(Box(2046, 2046), Box(2046, 2046)),
+  Box(Box(2047, 2047), Box(2047, 2047)),
+  Box(Box(2048, 2048), Box(2048, 2048)),
+  Box(Box(2049, 2049), Box(2049, 2049)),
+  Box(Box(2050, 2050), Box(2050, 2050)),
+  Box(Box(2051, 2051), Box(2051, 2051)),
+  Box(Box(2052, 2052), Box(2052, 2052)),
+  Box(Box(2053, 2053), Box(2053, 2053)),
+  Box(Box(2054, 2054), Box(2054, 2054)),
+  Box(Box(2055, 2055), Box(2055, 2055)),
+  Box(Box(2056, 2056), Box(2056, 2056)),
+  Box(Box(2057, 2057), Box(2057, 2057)),
+  Box(Box(2058, 2058), Box(2058, 2058)),
+  Box(Box(2059, 2059), Box(2059, 2059)),
+  Box(Box(2060, 2060), Box(2060, 2060)),
+  Box(Box(2061, 2061), Box(2061, 2061)),
+  Box(Box(2062, 2062), Box(2062, 2062)),
+  Box(Box(2063, 2063), Box(2063, 2063)),
+  Box(Box(2064, 2064), Box(2064, 2064)),
+  Box(Box(2065, 2065), Box(2065, 2065)),
+  Box(Box(2066, 2066), Box(2066, 2066)),
+  Box(Box(2067, 2067), Box(2067, 2067)),
+  Box(Box(2068, 2068), Box(2068, 2068)),
+  Box(Box(2069, 2069), Box(2069, 2069)),
+  Box(Box(2070, 2070), Box(2070, 2070)),
+  Box(Box(2071, 2071), Box(2071, 2071)),
+  Box(Box(2072, 2072), Box(2072, 2072)),
+  Box(Box(2073, 2073), Box(2073, 2073)),
+  Box(Box(2074, 2074), Box(2074, 2074)),
+  Box(Box(2075, 2075), Box(2075, 2075)),
+  Box(Box(2076, 2076), Box(2076, 2076)),
+  Box(Box(2077, 2077), Box(2077, 2077)),
+  Box(Box(2078, 2078), Box(2078, 2078)),
+  Box(Box(2079, 2079), Box(2079, 2079)),
+  Box(Box(2080, 2080), Box(2080, 2080)),
+  Box(Box(2081, 2081), Box(2081, 2081)),
+  Box(Box(2082, 2082), Box(2082, 2082)),
+  Box(Box(2083, 2083), Box(2083, 2083)),
+  Box(Box(2084, 2084), Box(2084, 2084)),
+  Box(Box(2085, 2085), Box(2085, 2085)),
+  Box(Box(2086, 2086), Box(2086, 2086)),
+  Box(Box(2087, 2087), Box(2087, 2087)),
+  Box(Box(2088, 2088), Box(2088, 2088)),
+  Box(Box(2089, 2089), Box(2089, 2089)),
+  Box(Box(2090, 2090), Box(2090, 2090)),
+  Box(Box(2091, 2091), Box(2091, 2091)),
+  Box(Box(2092, 2092), Box(2092, 2092)),
+  Box(Box(2093, 2093), Box(2093, 2093)),
+  Box(Box(2094, 2094), Box(2094, 2094)),
+  Box(Box(2095, 2095), Box(2095, 2095)),
+  Box(Box(2096, 2096), Box(2096, 2096)),
+  Box(Box(2097, 2097), Box(2097, 2097)),
+  Box(Box(2098, 2098), Box(2098, 2098)),
+  Box(Box(2099, 2099), Box(2099, 2099)),
+  Box(Box(2100, 2100), Box(2100, 2100)),
+  Box(Box(2101, 2101), Box(2101, 2101)),
+  Box(Box(2102, 2102), Box(2102, 2102)),
+  Box(Box(2103, 2103), Box(2103, 2103)),
+  Box(Box(2104, 2104), Box(2104, 2104)),
+  Box(Box(2105, 2105), Box(2105, 2105)),
+  Box(Box(2106, 2106), Box(2106, 2106)),
+  Box(Box(2107, 2107), Box(2107, 2107)),
+  Box(Box(2108, 2108), Box(2108, 2108)),
+  Box(Box(2109, 2109), Box(2109, 2109)),
+  Box(Box(2110, 2110), Box(2110, 2110)),
+  Box(Box(2111, 2111), Box(2111, 2111)),
+  Box(Box(2112, 2112), Box(2112, 2112)),
+  Box(Box(2113, 2113), Box(2113, 2113)),
+  Box(Box(2114, 2114), Box(2114, 2114)),
+  Box(Box(2115, 2115), Box(2115, 2115)),
+  Box(Box(2116, 2116), Box(2116, 2116)),
+  Box(Box(2117, 2117), Box(2117, 2117)),
+  Box(Box(2118, 2118), Box(2118, 2118)),
+  Box(Box(2119, 2119), Box(2119, 2119)),
+  Box(Box(2120, 2120), Box(2120, 2120)),
+  Box(Box(2121, 2121), Box(2121, 2121)),
+  Box(Box(2122, 2122), Box(2122, 2122)),
+  Box(Box(2123, 2123), Box(2123, 2123)),
+  Box(Box(2124, 2124), Box(2124, 2124)),
+  Box(Box(2125, 2125), Box(2125, 2125)),
+  Box(Box(2126, 2126), Box(2126, 2126)),
+  Box(Box(2127, 2127), Box(2127, 2127)),
+  Box(Box(2128, 2128), Box(2128, 2128)),
+  Box(Box(2129, 2129), Box(2129, 2129)),
+  Box(Box(2130, 2130), Box(2130, 2130)),
+  Box(Box(2131, 2131), Box(2131, 2131)),
+  Box(Box(2132, 2132), Box(2132, 2132)),
+  Box(Box(2133, 2133), Box(2133, 2133)),
+  Box(Box(2134, 2134), Box(2134, 2134)),
+  Box(Box(2135, 2135), Box(2135, 2135)),
+  Box(Box(2136, 2136), Box(2136, 2136)),
+  Box(Box(2137, 2137), Box(2137, 2137)),
+  Box(Box(2138, 2138), Box(2138, 2138)),
+  Box(Box(2139, 2139), Box(2139, 2139)),
+  Box(Box(2140, 2140), Box(2140, 2140)),
+  Box(Box(2141, 2141), Box(2141, 2141)),
+  Box(Box(2142, 2142), Box(2142, 2142)),
+  Box(Box(2143, 2143), Box(2143, 2143)),
+  Box(Box(2144, 2144), Box(2144, 2144)),
+  Box(Box(2145, 2145), Box(2145, 2145)),
+  Box(Box(2146, 2146), Box(2146, 2146)),
+  Box(Box(2147, 2147), Box(2147, 2147)),
+  Box(Box(2148, 2148), Box(2148, 2148)),
+  Box(Box(2149, 2149), Box(2149, 2149)),
+  Box(Box(2150, 2150), Box(2150, 2150)),
+  Box(Box(2151, 2151), Box(2151, 2151)),
+  Box(Box(2152, 2152), Box(2152, 2152)),
+  Box(Box(2153, 2153), Box(2153, 2153)),
+  Box(Box(2154, 2154), Box(2154, 2154)),
+  Box(Box(2155, 2155), Box(2155, 2155)),
+  Box(Box(2156, 2156), Box(2156, 2156)),
+  Box(Box(2157, 2157), Box(2157, 2157)),
+  Box(Box(2158, 2158), Box(2158, 2158)),
+  Box(Box(2159, 2159), Box(2159, 2159)),
+  Box(Box(2160, 2160), Box(2160, 2160)),
+  Box(Box(2161, 2161), Box(2161, 2161)),
+  Box(Box(2162, 2162), Box(2162, 2162)),
+  Box(Box(2163, 2163), Box(2163, 2163)),
+  Box(Box(2164, 2164), Box(2164, 2164)),
+  Box(Box(2165, 2165), Box(2165, 2165)),
+  Box(Box(2166, 2166), Box(2166, 2166)),
+  Box(Box(2167, 2167), Box(2167, 2167)),
+  Box(Box(2168, 2168), Box(2168, 2168)),
+  Box(Box(2169, 2169), Box(2169, 2169)),
+  Box(Box(2170, 2170), Box(2170, 2170)),
+  Box(Box(2171, 2171), Box(2171, 2171)),
+  Box(Box(2172, 2172), Box(2172, 2172)),
+  Box(Box(2173, 2173), Box(2173, 2173)),
+  Box(Box(2174, 2174), Box(2174, 2174)),
+  Box(Box(2175, 2175), Box(2175, 2175)),
+  Box(Box(2176, 2176), Box(2176, 2176)),
+  Box(Box(2177, 2177), Box(2177, 2177)),
+  Box(Box(2178, 2178), Box(2178, 2178)),
+  Box(Box(2179, 2179), Box(2179, 2179)),
+  Box(Box(2180, 2180), Box(2180, 2180)),
+  Box(Box(2181, 2181), Box(2181, 2181)),
+  Box(Box(2182, 2182), Box(2182, 2182)),
+  Box(Box(2183, 2183), Box(2183, 2183)),
+  Box(Box(2184, 2184), Box(2184, 2184)),
+  Box(Box(2185, 2185), Box(2185, 2185)),
+  Box(Box(2186, 2186), Box(2186, 2186)),
+  Box(Box(2187, 2187), Box(2187, 2187)),
+  Box(Box(2188, 2188), Box(2188, 2188)),
+  Box(Box(2189, 2189), Box(2189, 2189)),
+  Box(Box(2190, 2190), Box(2190, 2190)),
+  Box(Box(2191, 2191), Box(2191, 2191)),
+  Box(Box(2192, 2192), Box(2192, 2192)),
+  Box(Box(2193, 2193), Box(2193, 2193)),
+  Box(Box(2194, 2194), Box(2194, 2194)),
+  Box(Box(2195, 2195), Box(2195, 2195)),
+  Box(Box(2196, 2196), Box(2196, 2196)),
+  Box(Box(2197, 2197), Box(2197, 2197)),
+  Box(Box(2198, 2198), Box(2198, 2198)),
+  Box(Box(2199, 2199), Box(2199, 2199)),
+  Box(Box(2200, 2200), Box(2200, 2200)),
+  Box(Box(2201, 2201), Box(2201, 2201)),
+  Box(Box(2202, 2202), Box(2202, 2202)),
+  Box(Box(2203, 2203), Box(2203, 2203)),
+  Box(Box(2204, 2204), Box(2204, 2204)),
+  Box(Box(2205, 2205), Box(2205, 2205)),
+  Box(Box(2206, 2206), Box(2206, 2206)),
+  Box(Box(2207, 2207), Box(2207, 2207)),
+  Box(Box(2208, 2208), Box(2208, 2208)),
+  Box(Box(2209, 2209), Box(2209, 2209)),
+  Box(Box(2210, 2210), Box(2210, 2210)),
+  Box(Box(2211, 2211), Box(2211, 2211)),
+  Box(Box(2212, 2212), Box(2212, 2212)),
+  Box(Box(2213, 2213), Box(2213, 2213)),
+  Box(Box(2214, 2214), Box(2214, 2214)),
+  Box(Box(2215, 2215), Box(2215, 2215)),
+  Box(Box(2216, 2216), Box(2216, 2216)),
+  Box(Box(2217, 2217), Box(2217, 2217)),
+  Box(Box(2218, 2218), Box(2218, 2218)),
+  Box(Box(2219, 2219), Box(2219, 2219)),
+  Box(Box(2220, 2220), Box(2220, 2220)),
+  Box(Box(2221, 2221), Box(2221, 2221)),
+  Box(Box(2222, 2222), Box(2222, 2222)),
+  Box(Box(2223, 2223), Box(2223, 2223)),
+  Box(Box(2224, 2224), Box(2224, 2224)),
+  Box(Box(2225, 2225), Box(2225, 2225)),
+  Box(Box(2226, 2226), Box(2226, 2226)),
+  Box(Box(2227, 2227), Box(2227, 2227)),
+  Box(Box(2228, 2228), Box(2228, 2228)),
+  Box(Box(2229, 2229), Box(2229, 2229)),
+  Box(Box(2230, 2230), Box(2230, 2230)),
+  Box(Box(2231, 2231), Box(2231, 2231)),
+  Box(Box(2232, 2232), Box(2232, 2232)),
+  Box(Box(2233, 2233), Box(2233, 2233)),
+  Box(Box(2234, 2234), Box(2234, 2234)),
+  Box(Box(2235, 2235), Box(2235, 2235)),
+  Box(Box(2236, 2236), Box(2236, 2236)),
+  Box(Box(2237, 2237), Box(2237, 2237)),
+  Box(Box(2238, 2238), Box(2238, 2238)),
+  Box(Box(2239, 2239), Box(2239, 2239)),
+  Box(Box(2240, 2240), Box(2240, 2240)),
+  Box(Box(2241, 2241), Box(2241, 2241)),
+  Box(Box(2242, 2242), Box(2242, 2242)),
+  Box(Box(2243, 2243), Box(2243, 2243)),
+  Box(Box(2244, 2244), Box(2244, 2244)),
+  Box(Box(2245, 2245), Box(2245, 2245)),
+  Box(Box(2246, 2246), Box(2246, 2246)),
+  Box(Box(2247, 2247), Box(2247, 2247)),
+  Box(Box(2248, 2248), Box(2248, 2248)),
+  Box(Box(2249, 2249), Box(2249, 2249)),
+  Box(Box(2250, 2250), Box(2250, 2250)),
+  Box(Box(2251, 2251), Box(2251, 2251)),
+  Box(Box(2252, 2252), Box(2252, 2252)),
+  Box(Box(2253, 2253), Box(2253, 2253)),
+  Box(Box(2254, 2254), Box(2254, 2254)),
+  Box(Box(2255, 2255), Box(2255, 2255)),
+  Box(Box(2256, 2256), Box(2256, 2256)),
+  Box(Box(2257, 2257), Box(2257, 2257)),
+  Box(Box(2258, 2258), Box(2258, 2258)),
+  Box(Box(2259, 2259), Box(2259, 2259)),
+  Box(Box(2260, 2260), Box(2260, 2260)),
+  Box(Box(2261, 2261), Box(2261, 2261)),
+  Box(Box(2262, 2262), Box(2262, 2262)),
+  Box(Box(2263, 2263), Box(2263, 2263)),
+  Box(Box(2264, 2264), Box(2264, 2264)),
+  Box(Box(2265, 2265), Box(2265, 2265)),
+  Box(Box(2266, 2266), Box(2266, 2266)),
+  Box(Box(2267, 2267), Box(2267, 2267)),
+  Box(Box(2268, 2268), Box(2268, 2268)),
+  Box(Box(2269, 2269), Box(2269, 2269)),
+  Box(Box(2270, 2270), Box(2270, 2270)),
+  Box(Box(2271, 2271), Box(2271, 2271)),
+  Box(Box(2272, 2272), Box(2272, 2272)),
+  Box(Box(2273, 2273), Box(2273, 2273)),
+  Box(Box(2274, 2274), Box(2274, 2274)),
+  Box(Box(2275, 2275), Box(2275, 2275)),
+  Box(Box(2276, 2276), Box(2276, 2276)),
+  Box(Box(2277, 2277), Box(2277, 2277)),
+  Box(Box(2278, 2278), Box(2278, 2278)),
+  Box(Box(2279, 2279), Box(2279, 2279)),
+  Box(Box(2280, 2280), Box(2280, 2280)),
+  Box(Box(2281, 2281), Box(2281, 2281)),
+  Box(Box(2282, 2282), Box(2282, 2282)),
+  Box(Box(2283, 2283), Box(2283, 2283)),
+  Box(Box(2284, 2284), Box(2284, 2284)),
+  Box(Box(2285, 2285), Box(2285, 2285)),
+  Box(Box(2286, 2286), Box(2286, 2286)),
+  Box(Box(2287, 2287), Box(2287, 2287)),
+  Box(Box(2288, 2288), Box(2288, 2288)),
+  Box(Box(2289, 2289), Box(2289, 2289)),
+  Box(Box(2290, 2290), Box(2290, 2290)),
+  Box(Box(2291, 2291), Box(2291, 2291)),
+  Box(Box(2292, 2292), Box(2292, 2292)),
+  Box(Box(2293, 2293), Box(2293, 2293)),
+  Box(Box(2294, 2294), Box(2294, 2294)),
+  Box(Box(2295, 2295), Box(2295, 2295)),
+  Box(Box(2296, 2296), Box(2296, 2296)),
+  Box(Box(2297, 2297), Box(2297, 2297)),
+  Box(Box(2298, 2298), Box(2298, 2298)),
+  Box(Box(2299, 2299), Box(2299, 2299)),
+  Box(Box(2300, 2300), Box(2300, 2300)),
+  Box(Box(2301, 2301), Box(2301, 2301)),
+  Box(Box(2302, 2302), Box(2302, 2302)),
+  Box(Box(2303, 2303), Box(2303, 2303)),
+  Box(Box(2304, 2304), Box(2304, 2304)),
+  Box(Box(2305, 2305), Box(2305, 2305)),
+  Box(Box(2306, 2306), Box(2306, 2306)),
+  Box(Box(2307, 2307), Box(2307, 2307)),
+  Box(Box(2308, 2308), Box(2308, 2308)),
+  Box(Box(2309, 2309), Box(2309, 2309)),
+  Box(Box(2310, 2310), Box(2310, 2310)),
+  Box(Box(2311, 2311), Box(2311, 2311)),
+  Box(Box(2312, 2312), Box(2312, 2312)),
+  Box(Box(2313, 2313), Box(2313, 2313)),
+  Box(Box(2314, 2314), Box(2314, 2314)),
+  Box(Box(2315, 2315), Box(2315, 2315)),
+  Box(Box(2316, 2316), Box(2316, 2316)),
+  Box(Box(2317, 2317), Box(2317, 2317)),
+  Box(Box(2318, 2318), Box(2318, 2318)),
+  Box(Box(2319, 2319), Box(2319, 2319)),
+  Box(Box(2320, 2320), Box(2320, 2320)),
+  Box(Box(2321, 2321), Box(2321, 2321)),
+  Box(Box(2322, 2322), Box(2322, 2322)),
+  Box(Box(2323, 2323), Box(2323, 2323)),
+  Box(Box(2324, 2324), Box(2324, 2324)),
+  Box(Box(2325, 2325), Box(2325, 2325)),
+  Box(Box(2326, 2326), Box(2326, 2326)),
+  Box(Box(2327, 2327), Box(2327, 2327)),
+  Box(Box(2328, 2328), Box(2328, 2328)),
+  Box(Box(2329, 2329), Box(2329, 2329)),
+  Box(Box(2330, 2330), Box(2330, 2330)),
+  Box(Box(2331, 2331), Box(2331, 2331)),
+  Box(Box(2332, 2332), Box(2332, 2332)),
+  Box(Box(2333, 2333), Box(2333, 2333)),
+  Box(Box(2334, 2334), Box(2334, 2334)),
+  Box(Box(2335, 2335), Box(2335, 2335)),
+  Box(Box(2336, 2336), Box(2336, 2336)),
+  Box(Box(2337, 2337), Box(2337, 2337)),
+  Box(Box(2338, 2338), Box(2338, 2338)),
+  Box(Box(2339, 2339), Box(2339, 2339)),
+  Box(Box(2340, 2340), Box(2340, 2340)),
+  Box(Box(2341, 2341), Box(2341, 2341)),
+  Box(Box(2342, 2342), Box(2342, 2342)),
+  Box(Box(2343, 2343), Box(2343, 2343)),
+  Box(Box(2344, 2344), Box(2344, 2344)),
+  Box(Box(2345, 2345), Box(2345, 2345)),
+  Box(Box(2346, 2346), Box(2346, 2346)),
+  Box(Box(2347, 2347), Box(2347, 2347)),
+  Box(Box(2348, 2348), Box(2348, 2348)),
+  Box(Box(2349, 2349), Box(2349, 2349)),
+  Box(Box(2350, 2350), Box(2350, 2350)),
+  Box(Box(2351, 2351), Box(2351, 2351)),
+  Box(Box(2352, 2352), Box(2352, 2352)),
+  Box(Box(2353, 2353), Box(2353, 2353)),
+  Box(Box(2354, 2354), Box(2354, 2354)),
+  Box(Box(2355, 2355), Box(2355, 2355)),
+  Box(Box(2356, 2356), Box(2356, 2356)),
+  Box(Box(2357, 2357), Box(2357, 2357)),
+  Box(Box(2358, 2358), Box(2358, 2358)),
+  Box(Box(2359, 2359), Box(2359, 2359)),
+  Box(Box(2360, 2360), Box(2360, 2360)),
+  Box(Box(2361, 2361), Box(2361, 2361)),
+  Box(Box(2362, 2362), Box(2362, 2362)),
+  Box(Box(2363, 2363), Box(2363, 2363)),
+  Box(Box(2364, 2364), Box(2364, 2364)),
+  Box(Box(2365, 2365), Box(2365, 2365)),
+  Box(Box(2366, 2366), Box(2366, 2366)),
+  Box(Box(2367, 2367), Box(2367, 2367)),
+  Box(Box(2368, 2368), Box(2368, 2368)),
+  Box(Box(2369, 2369), Box(2369, 2369)),
+  Box(Box(2370, 2370), Box(2370, 2370)),
+  Box(Box(2371, 2371), Box(2371, 2371)),
+  Box(Box(2372, 2372), Box(2372, 2372)),
+  Box(Box(2373, 2373), Box(2373, 2373)),
+  Box(Box(2374, 2374), Box(2374, 2374)),
+  Box(Box(2375, 2375), Box(2375, 2375)),
+  Box(Box(2376, 2376), Box(2376, 2376)),
+  Box(Box(2377, 2377), Box(2377, 2377)),
+  Box(Box(2378, 2378), Box(2378, 2378)),
+  Box(Box(2379, 2379), Box(2379, 2379)),
+  Box(Box(2380, 2380), Box(2380, 2380)),
+  Box(Box(2381, 2381), Box(2381, 2381)),
+  Box(Box(2382, 2382), Box(2382, 2382)),
+  Box(Box(2383, 2383), Box(2383, 2383)),
+  Box(Box(2384, 2384), Box(2384, 2384)),
+  Box(Box(2385, 2385), Box(2385, 2385)),
+  Box(Box(2386, 2386), Box(2386, 2386)),
+  Box(Box(2387, 2387), Box(2387, 2387)),
+  Box(Box(2388, 2388), Box(2388, 2388)),
+  Box(Box(2389, 2389), Box(2389, 2389)),
+  Box(Box(2390, 2390), Box(2390, 2390)),
+  Box(Box(2391, 2391), Box(2391, 2391)),
+  Box(Box(2392, 2392), Box(2392, 2392)),
+  Box(Box(2393, 2393), Box(2393, 2393)),
+  Box(Box(2394, 2394), Box(2394, 2394)),
+  Box(Box(2395, 2395), Box(2395, 2395)),
+  Box(Box(2396, 2396), Box(2396, 2396)),
+  Box(Box(2397, 2397), Box(2397, 2397)),
+  Box(Box(2398, 2398), Box(2398, 2398)),
+  Box(Box(2399, 2399), Box(2399, 2399)),
+  Box(Box(2400, 2400), Box(2400, 2400)),
+  Box(Box(2401, 2401), Box(2401, 2401)),
+  Box(Box(2402, 2402), Box(2402, 2402)),
+  Box(Box(2403, 2403), Box(2403, 2403)),
+  Box(Box(2404, 2404), Box(2404, 2404)),
+  Box(Box(2405, 2405), Box(2405, 2405)),
+  Box(Box(2406, 2406), Box(2406, 2406)),
+  Box(Box(2407, 2407), Box(2407, 2407)),
+  Box(Box(2408, 2408), Box(2408, 2408)),
+  Box(Box(2409, 2409), Box(2409, 2409)),
+  Box(Box(2410, 2410), Box(2410, 2410)),
+  Box(Box(2411, 2411), Box(2411, 2411)),
+  Box(Box(2412, 2412), Box(2412, 2412)),
+  Box(Box(2413, 2413), Box(2413, 2413)),
+  Box(Box(2414, 2414), Box(2414, 2414)),
+  Box(Box(2415, 2415), Box(2415, 2415)),
+  Box(Box(2416, 2416), Box(2416, 2416)),
+  Box(Box(2417, 2417), Box(2417, 2417)),
+  Box(Box(2418, 2418), Box(2418, 2418)),
+  Box(Box(2419, 2419), Box(2419, 2419)),
+  Box(Box(2420, 2420), Box(2420, 2420)),
+  Box(Box(2421, 2421), Box(2421, 2421)),
+  Box(Box(2422, 2422), Box(2422, 2422)),
+  Box(Box(2423, 2423), Box(2423, 2423)),
+  Box(Box(2424, 2424), Box(2424, 2424)),
+  Box(Box(2425, 2425), Box(2425, 2425)),
+  Box(Box(2426, 2426), Box(2426, 2426)),
+  Box(Box(2427, 2427), Box(2427, 2427)),
+  Box(Box(2428, 2428), Box(2428, 2428)),
+  Box(Box(2429, 2429), Box(2429, 2429)),
+  Box(Box(2430, 2430), Box(2430, 2430)),
+  Box(Box(2431, 2431), Box(2431, 2431)),
+  Box(Box(2432, 2432), Box(2432, 2432)),
+  Box(Box(2433, 2433), Box(2433, 2433)),
+  Box(Box(2434, 2434), Box(2434, 2434)),
+  Box(Box(2435, 2435), Box(2435, 2435)),
+  Box(Box(2436, 2436), Box(2436, 2436)),
+  Box(Box(2437, 2437), Box(2437, 2437)),
+  Box(Box(2438, 2438), Box(2438, 2438)),
+  Box(Box(2439, 2439), Box(2439, 2439)),
+  Box(Box(2440, 2440), Box(2440, 2440)),
+  Box(Box(2441, 2441), Box(2441, 2441)),
+  Box(Box(2442, 2442), Box(2442, 2442)),
+  Box(Box(2443, 2443), Box(2443, 2443)),
+  Box(Box(2444, 2444), Box(2444, 2444)),
+  Box(Box(2445, 2445), Box(2445, 2445)),
+  Box(Box(2446, 2446), Box(2446, 2446)),
+  Box(Box(2447, 2447), Box(2447, 2447)),
+  Box(Box(2448, 2448), Box(2448, 2448)),
+  Box(Box(2449, 2449), Box(2449, 2449)),
+  Box(Box(2450, 2450), Box(2450, 2450)),
+  Box(Box(2451, 2451), Box(2451, 2451)),
+  Box(Box(2452, 2452), Box(2452, 2452)),
+  Box(Box(2453, 2453), Box(2453, 2453)),
+  Box(Box(2454, 2454), Box(2454, 2454)),
+  Box(Box(2455, 2455), Box(2455, 2455)),
+  Box(Box(2456, 2456), Box(2456, 2456)),
+  Box(Box(2457, 2457), Box(2457, 2457)),
+  Box(Box(2458, 2458), Box(2458, 2458)),
+  Box(Box(2459, 2459), Box(2459, 2459)),
+  Box(Box(2460, 2460), Box(2460, 2460)),
+  Box(Box(2461, 2461), Box(2461, 2461)),
+  Box(Box(2462, 2462), Box(2462, 2462)),
+  Box(Box(2463, 2463), Box(2463, 2463)),
+  Box(Box(2464, 2464), Box(2464, 2464)),
+  Box(Box(2465, 2465), Box(2465, 2465)),
+  Box(Box(2466, 2466), Box(2466, 2466)),
+  Box(Box(2467, 2467), Box(2467, 2467)),
+  Box(Box(2468, 2468), Box(2468, 2468)),
+  Box(Box(2469, 2469), Box(2469, 2469)),
+  Box(Box(2470, 2470), Box(2470, 2470)),
+  Box(Box(2471, 2471), Box(2471, 2471)),
+  Box(Box(2472, 2472), Box(2472, 2472)),
+  Box(Box(2473, 2473), Box(2473, 2473)),
+  Box(Box(2474, 2474), Box(2474, 2474)),
+  Box(Box(2475, 2475), Box(2475, 2475)),
+  Box(Box(2476, 2476), Box(2476, 2476)),
+  Box(Box(2477, 2477), Box(2477, 2477)),
+  Box(Box(2478, 2478), Box(2478, 2478)),
+  Box(Box(2479, 2479), Box(2479, 2479)),
+  Box(Box(2480, 2480), Box(2480, 2480)),
+  Box(Box(2481, 2481), Box(2481, 2481)),
+  Box(Box(2482, 2482), Box(2482, 2482)),
+  Box(Box(2483, 2483), Box(2483, 2483)),
+  Box(Box(2484, 2484), Box(2484, 2484)),
+  Box(Box(2485, 2485), Box(2485, 2485)),
+  Box(Box(2486, 2486), Box(2486, 2486)),
+  Box(Box(2487, 2487), Box(2487, 2487)),
+  Box(Box(2488, 2488), Box(2488, 2488)),
+  Box(Box(2489, 2489), Box(2489, 2489)),
+  Box(Box(2490, 2490), Box(2490, 2490)),
+  Box(Box(2491, 2491), Box(2491, 2491)),
+  Box(Box(2492, 2492), Box(2492, 2492)),
+  Box(Box(2493, 2493), Box(2493, 2493)),
+  Box(Box(2494, 2494), Box(2494, 2494)),
+  Box(Box(2495, 2495), Box(2495, 2495)),
+  Box(Box(2496, 2496), Box(2496, 2496)),
+  Box(Box(2497, 2497), Box(2497, 2497)),
+  Box(Box(2498, 2498), Box(2498, 2498)),
+  Box(Box(2499, 2499), Box(2499, 2499)),
+  Box(Box(2500, 2500), Box(2500, 2500)),
+  Box(Box(2501, 2501), Box(2501, 2501)),
+  Box(Box(2502, 2502), Box(2502, 2502)),
+  Box(Box(2503, 2503), Box(2503, 2503)),
+  Box(Box(2504, 2504), Box(2504, 2504)),
+  Box(Box(2505, 2505), Box(2505, 2505)),
+  Box(Box(2506, 2506), Box(2506, 2506)),
+  Box(Box(2507, 2507), Box(2507, 2507)),
+  Box(Box(2508, 2508), Box(2508, 2508)),
+  Box(Box(2509, 2509), Box(2509, 2509)),
+  Box(Box(2510, 2510), Box(2510, 2510)),
+  Box(Box(2511, 2511), Box(2511, 2511)),
+  Box(Box(2512, 2512), Box(2512, 2512)),
+  Box(Box(2513, 2513), Box(2513, 2513)),
+  Box(Box(2514, 2514), Box(2514, 2514)),
+  Box(Box(2515, 2515), Box(2515, 2515)),
+  Box(Box(2516, 2516), Box(2516, 2516)),
+  Box(Box(2517, 2517), Box(2517, 2517)),
+  Box(Box(2518, 2518), Box(2518, 2518)),
+  Box(Box(2519, 2519), Box(2519, 2519)),
+  Box(Box(2520, 2520), Box(2520, 2520)),
+  Box(Box(2521, 2521), Box(2521, 2521)),
+  Box(Box(2522, 2522), Box(2522, 2522)),
+  Box(Box(2523, 2523), Box(2523, 2523)),
+  Box(Box(2524, 2524), Box(2524, 2524)),
+  Box(Box(2525, 2525), Box(2525, 2525)),
+  Box(Box(2526, 2526), Box(2526, 2526)),
+  Box(Box(2527, 2527), Box(2527, 2527)),
+  Box(Box(2528, 2528), Box(2528, 2528)),
+  Box(Box(2529, 2529), Box(2529, 2529)),
+  Box(Box(2530, 2530), Box(2530, 2530)),
+  Box(Box(2531, 2531), Box(2531, 2531)),
+  Box(Box(2532, 2532), Box(2532, 2532)),
+  Box(Box(2533, 2533), Box(2533, 2533)),
+  Box(Box(2534, 2534), Box(2534, 2534)),
+  Box(Box(2535, 2535), Box(2535, 2535)),
+  Box(Box(2536, 2536), Box(2536, 2536)),
+  Box(Box(2537, 2537), Box(2537, 2537)),
+  Box(Box(2538, 2538), Box(2538, 2538)),
+  Box(Box(2539, 2539), Box(2539, 2539)),
+  Box(Box(2540, 2540), Box(2540, 2540)),
+  Box(Box(2541, 2541), Box(2541, 2541)),
+  Box(Box(2542, 2542), Box(2542, 2542)),
+  Box(Box(2543, 2543), Box(2543, 2543)),
+  Box(Box(2544, 2544), Box(2544, 2544)),
+  Box(Box(2545, 2545), Box(2545, 2545)),
+  Box(Box(2546, 2546), Box(2546, 2546)),
+  Box(Box(2547, 2547), Box(2547, 2547)),
+  Box(Box(2548, 2548), Box(2548, 2548)),
+  Box(Box(2549, 2549), Box(2549, 2549)),
+  Box(Box(2550, 2550), Box(2550, 2550)),
+  Box(Box(2551, 2551), Box(2551, 2551)),
+  Box(Box(2552, 2552), Box(2552, 2552)),
+  Box(Box(2553, 2553), Box(2553, 2553)),
+  Box(Box(2554, 2554), Box(2554, 2554)),
+  Box(Box(2555, 2555), Box(2555, 2555)),
+  Box(Box(2556, 2556), Box(2556, 2556)),
+  Box(Box(2557, 2557), Box(2557, 2557)),
+  Box(Box(2558, 2558), Box(2558, 2558)),
+  Box(Box(2559, 2559), Box(2559, 2559)),
+  Box(Box(2560, 2560), Box(2560, 2560)),
+  Box(Box(2561, 2561), Box(2561, 2561)),
+  Box(Box(2562, 2562), Box(2562, 2562)),
+  Box(Box(2563, 2563), Box(2563, 2563)),
+  Box(Box(2564, 2564), Box(2564, 2564)),
+  Box(Box(2565, 2565), Box(2565, 2565)),
+  Box(Box(2566, 2566), Box(2566, 2566)),
+  Box(Box(2567, 2567), Box(2567, 2567)),
+  Box(Box(2568, 2568), Box(2568, 2568)),
+  Box(Box(2569, 2569), Box(2569, 2569)),
+  Box(Box(2570, 2570), Box(2570, 2570)),
+  Box(Box(2571, 2571), Box(2571, 2571)),
+  Box(Box(2572, 2572), Box(2572, 2572)),
+  Box(Box(2573, 2573), Box(2573, 2573)),
+  Box(Box(2574, 2574), Box(2574, 2574)),
+  Box(Box(2575, 2575), Box(2575, 2575)),
+  Box(Box(2576, 2576), Box(2576, 2576)),
+  Box(Box(2577, 2577), Box(2577, 2577)),
+  Box(Box(2578, 2578), Box(2578, 2578)),
+  Box(Box(2579, 2579), Box(2579, 2579)),
+  Box(Box(2580, 2580), Box(2580, 2580)),
+  Box(Box(2581, 2581), Box(2581, 2581)),
+  Box(Box(2582, 2582), Box(2582, 2582)),
+  Box(Box(2583, 2583), Box(2583, 2583)),
+  Box(Box(2584, 2584), Box(2584, 2584)),
+  Box(Box(2585, 2585), Box(2585, 2585)),
+  Box(Box(2586, 2586), Box(2586, 2586)),
+  Box(Box(2587, 2587), Box(2587, 2587)),
+  Box(Box(2588, 2588), Box(2588, 2588)),
+  Box(Box(2589, 2589), Box(2589, 2589)),
+  Box(Box(2590, 2590), Box(2590, 2590)),
+  Box(Box(2591, 2591), Box(2591, 2591)),
+  Box(Box(2592, 2592), Box(2592, 2592)),
+  Box(Box(2593, 2593), Box(2593, 2593)),
+  Box(Box(2594, 2594), Box(2594, 2594)),
+  Box(Box(2595, 2595), Box(2595, 2595)),
+  Box(Box(2596, 2596), Box(2596, 2596)),
+  Box(Box(2597, 2597), Box(2597, 2597)),
+  Box(Box(2598, 2598), Box(2598, 2598)),
+  Box(Box(2599, 2599), Box(2599, 2599)),
+  Box(Box(2600, 2600), Box(2600, 2600)),
+  Box(Box(2601, 2601), Box(2601, 2601)),
+  Box(Box(2602, 2602), Box(2602, 2602)),
+  Box(Box(2603, 2603), Box(2603, 2603)),
+  Box(Box(2604, 2604), Box(2604, 2604)),
+  Box(Box(2605, 2605), Box(2605, 2605)),
+  Box(Box(2606, 2606), Box(2606, 2606)),
+  Box(Box(2607, 2607), Box(2607, 2607)),
+  Box(Box(2608, 2608), Box(2608, 2608)),
+  Box(Box(2609, 2609), Box(2609, 2609)),
+  Box(Box(2610, 2610), Box(2610, 2610)),
+  Box(Box(2611, 2611), Box(2611, 2611)),
+  Box(Box(2612, 2612), Box(2612, 2612)),
+  Box(Box(2613, 2613), Box(2613, 2613)),
+  Box(Box(2614, 2614), Box(2614, 2614)),
+  Box(Box(2615, 2615), Box(2615, 2615)),
+  Box(Box(2616, 2616), Box(2616, 2616)),
+  Box(Box(2617, 2617), Box(2617, 2617)),
+  Box(Box(2618, 2618), Box(2618, 2618)),
+  Box(Box(2619, 2619), Box(2619, 2619)),
+  Box(Box(2620, 2620), Box(2620, 2620)),
+  Box(Box(2621, 2621), Box(2621, 2621)),
+  Box(Box(2622, 2622), Box(2622, 2622)),
+  Box(Box(2623, 2623), Box(2623, 2623)),
+  Box(Box(2624, 2624), Box(2624, 2624)),
+  Box(Box(2625, 2625), Box(2625, 2625)),
+  Box(Box(2626, 2626), Box(2626, 2626)),
+  Box(Box(2627, 2627), Box(2627, 2627)),
+  Box(Box(2628, 2628), Box(2628, 2628)),
+  Box(Box(2629, 2629), Box(2629, 2629)),
+  Box(Box(2630, 2630), Box(2630, 2630)),
+  Box(Box(2631, 2631), Box(2631, 2631)),
+  Box(Box(2632, 2632), Box(2632, 2632)),
+  Box(Box(2633, 2633), Box(2633, 2633)),
+  Box(Box(2634, 2634), Box(2634, 2634)),
+  Box(Box(2635, 2635), Box(2635, 2635)),
+  Box(Box(2636, 2636), Box(2636, 2636)),
+  Box(Box(2637, 2637), Box(2637, 2637)),
+  Box(Box(2638, 2638), Box(2638, 2638)),
+  Box(Box(2639, 2639), Box(2639, 2639)),
+  Box(Box(2640, 2640), Box(2640, 2640)),
+  Box(Box(2641, 2641), Box(2641, 2641)),
+  Box(Box(2642, 2642), Box(2642, 2642)),
+  Box(Box(2643, 2643), Box(2643, 2643)),
+  Box(Box(2644, 2644), Box(2644, 2644)),
+  Box(Box(2645, 2645), Box(2645, 2645)),
+  Box(Box(2646, 2646), Box(2646, 2646)),
+  Box(Box(2647, 2647), Box(2647, 2647)),
+  Box(Box(2648, 2648), Box(2648, 2648)),
+  Box(Box(2649, 2649), Box(2649, 2649)),
+  Box(Box(2650, 2650), Box(2650, 2650)),
+  Box(Box(2651, 2651), Box(2651, 2651)),
+  Box(Box(2652, 2652), Box(2652, 2652)),
+  Box(Box(2653, 2653), Box(2653, 2653)),
+  Box(Box(2654, 2654), Box(2654, 2654)),
+  Box(Box(2655, 2655), Box(2655, 2655)),
+  Box(Box(2656, 2656), Box(2656, 2656)),
+  Box(Box(2657, 2657), Box(2657, 2657)),
+  Box(Box(2658, 2658), Box(2658, 2658)),
+  Box(Box(2659, 2659), Box(2659, 2659)),
+  Box(Box(2660, 2660), Box(2660, 2660)),
+  Box(Box(2661, 2661), Box(2661, 2661)),
+  Box(Box(2662, 2662), Box(2662, 2662)),
+  Box(Box(2663, 2663), Box(2663, 2663)),
+  Box(Box(2664, 2664), Box(2664, 2664)),
+  Box(Box(2665, 2665), Box(2665, 2665)),
+  Box(Box(2666, 2666), Box(2666, 2666)),
+  Box(Box(2667, 2667), Box(2667, 2667)),
+  Box(Box(2668, 2668), Box(2668, 2668)),
+  Box(Box(2669, 2669), Box(2669, 2669)),
+  Box(Box(2670, 2670), Box(2670, 2670)),
+  Box(Box(2671, 2671), Box(2671, 2671)),
+  Box(Box(2672, 2672), Box(2672, 2672)),
+  Box(Box(2673, 2673), Box(2673, 2673)),
+  Box(Box(2674, 2674), Box(2674, 2674)),
+  Box(Box(2675, 2675), Box(2675, 2675)),
+  Box(Box(2676, 2676), Box(2676, 2676)),
+  Box(Box(2677, 2677), Box(2677, 2677)),
+  Box(Box(2678, 2678), Box(2678, 2678)),
+  Box(Box(2679, 2679), Box(2679, 2679)),
+  Box(Box(2680, 2680), Box(2680, 2680)),
+  Box(Box(2681, 2681), Box(2681, 2681)),
+  Box(Box(2682, 2682), Box(2682, 2682)),
+  Box(Box(2683, 2683), Box(2683, 2683)),
+  Box(Box(2684, 2684), Box(2684, 2684)),
+  Box(Box(2685, 2685), Box(2685, 2685)),
+  Box(Box(2686, 2686), Box(2686, 2686)),
+  Box(Box(2687, 2687), Box(2687, 2687)),
+  Box(Box(2688, 2688), Box(2688, 2688)),
+  Box(Box(2689, 2689), Box(2689, 2689)),
+  Box(Box(2690, 2690), Box(2690, 2690)),
+  Box(Box(2691, 2691), Box(2691, 2691)),
+  Box(Box(2692, 2692), Box(2692, 2692)),
+  Box(Box(2693, 2693), Box(2693, 2693)),
+  Box(Box(2694, 2694), Box(2694, 2694)),
+  Box(Box(2695, 2695), Box(2695, 2695)),
+  Box(Box(2696, 2696), Box(2696, 2696)),
+  Box(Box(2697, 2697), Box(2697, 2697)),
+  Box(Box(2698, 2698), Box(2698, 2698)),
+  Box(Box(2699, 2699), Box(2699, 2699)),
+  Box(Box(2700, 2700), Box(2700, 2700)),
+  Box(Box(2701, 2701), Box(2701, 2701)),
+  Box(Box(2702, 2702), Box(2702, 2702)),
+  Box(Box(2703, 2703), Box(2703, 2703)),
+  Box(Box(2704, 2704), Box(2704, 2704)),
+  Box(Box(2705, 2705), Box(2705, 2705)),
+  Box(Box(2706, 2706), Box(2706, 2706)),
+  Box(Box(2707, 2707), Box(2707, 2707)),
+  Box(Box(2708, 2708), Box(2708, 2708)),
+  Box(Box(2709, 2709), Box(2709, 2709)),
+  Box(Box(2710, 2710), Box(2710, 2710)),
+  Box(Box(2711, 2711), Box(2711, 2711)),
+  Box(Box(2712, 2712), Box(2712, 2712)),
+  Box(Box(2713, 2713), Box(2713, 2713)),
+  Box(Box(2714, 2714), Box(2714, 2714)),
+  Box(Box(2715, 2715), Box(2715, 2715)),
+  Box(Box(2716, 2716), Box(2716, 2716)),
+  Box(Box(2717, 2717), Box(2717, 2717)),
+  Box(Box(2718, 2718), Box(2718, 2718)),
+  Box(Box(2719, 2719), Box(2719, 2719)),
+  Box(Box(2720, 2720), Box(2720, 2720)),
+  Box(Box(2721, 2721), Box(2721, 2721)),
+  Box(Box(2722, 2722), Box(2722, 2722)),
+  Box(Box(2723, 2723), Box(2723, 2723)),
+  Box(Box(2724, 2724), Box(2724, 2724)),
+  Box(Box(2725, 2725), Box(2725, 2725)),
+  Box(Box(2726, 2726), Box(2726, 2726)),
+  Box(Box(2727, 2727), Box(2727, 2727)),
+  Box(Box(2728, 2728), Box(2728, 2728)),
+  Box(Box(2729, 2729), Box(2729, 2729)),
+  Box(Box(2730, 2730), Box(2730, 2730)),
+  Box(Box(2731, 2731), Box(2731, 2731)),
+  Box(Box(2732, 2732), Box(2732, 2732)),
+  Box(Box(2733, 2733), Box(2733, 2733)),
+  Box(Box(2734, 2734), Box(2734, 2734)),
+  Box(Box(2735, 2735), Box(2735, 2735)),
+  Box(Box(2736, 2736), Box(2736, 2736)),
+  Box(Box(2737, 2737), Box(2737, 2737)),
+  Box(Box(2738, 2738), Box(2738, 2738)),
+  Box(Box(2739, 2739), Box(2739, 2739)),
+  Box(Box(2740, 2740), Box(2740, 2740)),
+  Box(Box(2741, 2741), Box(2741, 2741)),
+  Box(Box(2742, 2742), Box(2742, 2742)),
+  Box(Box(2743, 2743), Box(2743, 2743)),
+  Box(Box(2744, 2744), Box(2744, 2744)),
+  Box(Box(2745, 2745), Box(2745, 2745)),
+  Box(Box(2746, 2746), Box(2746, 2746)),
+  Box(Box(2747, 2747), Box(2747, 2747)),
+  Box(Box(2748, 2748), Box(2748, 2748)),
+  Box(Box(2749, 2749), Box(2749, 2749)),
+  Box(Box(2750, 2750), Box(2750, 2750)),
+  Box(Box(2751, 2751), Box(2751, 2751)),
+  Box(Box(2752, 2752), Box(2752, 2752)),
+  Box(Box(2753, 2753), Box(2753, 2753)),
+  Box(Box(2754, 2754), Box(2754, 2754)),
+  Box(Box(2755, 2755), Box(2755, 2755)),
+  Box(Box(2756, 2756), Box(2756, 2756)),
+  Box(Box(2757, 2757), Box(2757, 2757)),
+  Box(Box(2758, 2758), Box(2758, 2758)),
+  Box(Box(2759, 2759), Box(2759, 2759)),
+  Box(Box(2760, 2760), Box(2760, 2760)),
+  Box(Box(2761, 2761), Box(2761, 2761)),
+  Box(Box(2762, 2762), Box(2762, 2762)),
+  Box(Box(2763, 2763), Box(2763, 2763)),
+  Box(Box(2764, 2764), Box(2764, 2764)),
+  Box(Box(2765, 2765), Box(2765, 2765)),
+  Box(Box(2766, 2766), Box(2766, 2766)),
+  Box(Box(2767, 2767), Box(2767, 2767)),
+  Box(Box(2768, 2768), Box(2768, 2768)),
+  Box(Box(2769, 2769), Box(2769, 2769)),
+  Box(Box(2770, 2770), Box(2770, 2770)),
+  Box(Box(2771, 2771), Box(2771, 2771)),
+  Box(Box(2772, 2772), Box(2772, 2772)),
+  Box(Box(2773, 2773), Box(2773, 2773)),
+  Box(Box(2774, 2774), Box(2774, 2774)),
+  Box(Box(2775, 2775), Box(2775, 2775)),
+  Box(Box(2776, 2776), Box(2776, 2776)),
+  Box(Box(2777, 2777), Box(2777, 2777)),
+  Box(Box(2778, 2778), Box(2778, 2778)),
+  Box(Box(2779, 2779), Box(2779, 2779)),
+  Box(Box(2780, 2780), Box(2780, 2780)),
+  Box(Box(2781, 2781), Box(2781, 2781)),
+  Box(Box(2782, 2782), Box(2782, 2782)),
+  Box(Box(2783, 2783), Box(2783, 2783)),
+  Box(Box(2784, 2784), Box(2784, 2784)),
+  Box(Box(2785, 2785), Box(2785, 2785)),
+  Box(Box(2786, 2786), Box(2786, 2786)),
+  Box(Box(2787, 2787), Box(2787, 2787)),
+  Box(Box(2788, 2788), Box(2788, 2788)),
+  Box(Box(2789, 2789), Box(2789, 2789)),
+  Box(Box(2790, 2790), Box(2790, 2790)),
+  Box(Box(2791, 2791), Box(2791, 2791)),
+  Box(Box(2792, 2792), Box(2792, 2792)),
+  Box(Box(2793, 2793), Box(2793, 2793)),
+  Box(Box(2794, 2794), Box(2794, 2794)),
+  Box(Box(2795, 2795), Box(2795, 2795)),
+  Box(Box(2796, 2796), Box(2796, 2796)),
+  Box(Box(2797, 2797), Box(2797, 2797)),
+  Box(Box(2798, 2798), Box(2798, 2798)),
+  Box(Box(2799, 2799), Box(2799, 2799)),
+  Box(Box(2800, 2800), Box(2800, 2800)),
+  Box(Box(2801, 2801), Box(2801, 2801)),
+  Box(Box(2802, 2802), Box(2802, 2802)),
+  Box(Box(2803, 2803), Box(2803, 2803)),
+  Box(Box(2804, 2804), Box(2804, 2804)),
+  Box(Box(2805, 2805), Box(2805, 2805)),
+  Box(Box(2806, 2806), Box(2806, 2806)),
+  Box(Box(2807, 2807), Box(2807, 2807)),
+  Box(Box(2808, 2808), Box(2808, 2808)),
+  Box(Box(2809, 2809), Box(2809, 2809)),
+  Box(Box(2810, 2810), Box(2810, 2810)),
+  Box(Box(2811, 2811), Box(2811, 2811)),
+  Box(Box(2812, 2812), Box(2812, 2812)),
+  Box(Box(2813, 2813), Box(2813, 2813)),
+  Box(Box(2814, 2814), Box(2814, 2814)),
+  Box(Box(2815, 2815), Box(2815, 2815)),
+  Box(Box(2816, 2816), Box(2816, 2816)),
+  Box(Box(2817, 2817), Box(2817, 2817)),
+  Box(Box(2818, 2818), Box(2818, 2818)),
+  Box(Box(2819, 2819), Box(2819, 2819)),
+  Box(Box(2820, 2820), Box(2820, 2820)),
+  Box(Box(2821, 2821), Box(2821, 2821)),
+  Box(Box(2822, 2822), Box(2822, 2822)),
+  Box(Box(2823, 2823), Box(2823, 2823)),
+  Box(Box(2824, 2824), Box(2824, 2824)),
+  Box(Box(2825, 2825), Box(2825, 2825)),
+  Box(Box(2826, 2826), Box(2826, 2826)),
+  Box(Box(2827, 2827), Box(2827, 2827)),
+  Box(Box(2828, 2828), Box(2828, 2828)),
+  Box(Box(2829, 2829), Box(2829, 2829)),
+  Box(Box(2830, 2830), Box(2830, 2830)),
+  Box(Box(2831, 2831), Box(2831, 2831)),
+  Box(Box(2832, 2832), Box(2832, 2832)),
+  Box(Box(2833, 2833), Box(2833, 2833)),
+  Box(Box(2834, 2834), Box(2834, 2834)),
+  Box(Box(2835, 2835), Box(2835, 2835)),
+  Box(Box(2836, 2836), Box(2836, 2836)),
+  Box(Box(2837, 2837), Box(2837, 2837)),
+  Box(Box(2838, 2838), Box(2838, 2838)),
+  Box(Box(2839, 2839), Box(2839, 2839)),
+  Box(Box(2840, 2840), Box(2840, 2840)),
+  Box(Box(2841, 2841), Box(2841, 2841)),
+  Box(Box(2842, 2842), Box(2842, 2842)),
+  Box(Box(2843, 2843), Box(2843, 2843)),
+  Box(Box(2844, 2844), Box(2844, 2844)),
+  Box(Box(2845, 2845), Box(2845, 2845)),
+  Box(Box(2846, 2846), Box(2846, 2846)),
+  Box(Box(2847, 2847), Box(2847, 2847)),
+  Box(Box(2848, 2848), Box(2848, 2848)),
+  Box(Box(2849, 2849), Box(2849, 2849)),
+  Box(Box(2850, 2850), Box(2850, 2850)),
+  Box(Box(2851, 2851), Box(2851, 2851)),
+  Box(Box(2852, 2852), Box(2852, 2852)),
+  Box(Box(2853, 2853), Box(2853, 2853)),
+  Box(Box(2854, 2854), Box(2854, 2854)),
+  Box(Box(2855, 2855), Box(2855, 2855)),
+  Box(Box(2856, 2856), Box(2856, 2856)),
+  Box(Box(2857, 2857), Box(2857, 2857)),
+  Box(Box(2858, 2858), Box(2858, 2858)),
+  Box(Box(2859, 2859), Box(2859, 2859)),
+  Box(Box(2860, 2860), Box(2860, 2860)),
+  Box(Box(2861, 2861), Box(2861, 2861)),
+  Box(Box(2862, 2862), Box(2862, 2862)),
+  Box(Box(2863, 2863), Box(2863, 2863)),
+  Box(Box(2864, 2864), Box(2864, 2864)),
+  Box(Box(2865, 2865), Box(2865, 2865)),
+  Box(Box(2866, 2866), Box(2866, 2866)),
+  Box(Box(2867, 2867), Box(2867, 2867)),
+  Box(Box(2868, 2868), Box(2868, 2868)),
+  Box(Box(2869, 2869), Box(2869, 2869)),
+  Box(Box(2870, 2870), Box(2870, 2870)),
+  Box(Box(2871, 2871), Box(2871, 2871)),
+  Box(Box(2872, 2872), Box(2872, 2872)),
+  Box(Box(2873, 2873), Box(2873, 2873)),
+  Box(Box(2874, 2874), Box(2874, 2874)),
+  Box(Box(2875, 2875), Box(2875, 2875)),
+  Box(Box(2876, 2876), Box(2876, 2876)),
+  Box(Box(2877, 2877), Box(2877, 2877)),
+  Box(Box(2878, 2878), Box(2878, 2878)),
+  Box(Box(2879, 2879), Box(2879, 2879)),
+  Box(Box(2880, 2880), Box(2880, 2880)),
+  Box(Box(2881, 2881), Box(2881, 2881)),
+  Box(Box(2882, 2882), Box(2882, 2882)),
+  Box(Box(2883, 2883), Box(2883, 2883)),
+  Box(Box(2884, 2884), Box(2884, 2884)),
+  Box(Box(2885, 2885), Box(2885, 2885)),
+  Box(Box(2886, 2886), Box(2886, 2886)),
+  Box(Box(2887, 2887), Box(2887, 2887)),
+  Box(Box(2888, 2888), Box(2888, 2888)),
+  Box(Box(2889, 2889), Box(2889, 2889)),
+  Box(Box(2890, 2890), Box(2890, 2890)),
+  Box(Box(2891, 2891), Box(2891, 2891)),
+  Box(Box(2892, 2892), Box(2892, 2892)),
+  Box(Box(2893, 2893), Box(2893, 2893)),
+  Box(Box(2894, 2894), Box(2894, 2894)),
+  Box(Box(2895, 2895), Box(2895, 2895)),
+  Box(Box(2896, 2896), Box(2896, 2896)),
+  Box(Box(2897, 2897), Box(2897, 2897)),
+  Box(Box(2898, 2898), Box(2898, 2898)),
+  Box(Box(2899, 2899), Box(2899, 2899)),
+  Box(Box(2900, 2900), Box(2900, 2900)),
+  Box(Box(2901, 2901), Box(2901, 2901)),
+  Box(Box(2902, 2902), Box(2902, 2902)),
+  Box(Box(2903, 2903), Box(2903, 2903)),
+  Box(Box(2904, 2904), Box(2904, 2904)),
+  Box(Box(2905, 2905), Box(2905, 2905)),
+  Box(Box(2906, 2906), Box(2906, 2906)),
+  Box(Box(2907, 2907), Box(2907, 2907)),
+  Box(Box(2908, 2908), Box(2908, 2908)),
+  Box(Box(2909, 2909), Box(2909, 2909)),
+  Box(Box(2910, 2910), Box(2910, 2910)),
+  Box(Box(2911, 2911), Box(2911, 2911)),
+  Box(Box(2912, 2912), Box(2912, 2912)),
+  Box(Box(2913, 2913), Box(2913, 2913)),
+  Box(Box(2914, 2914), Box(2914, 2914)),
+  Box(Box(2915, 2915), Box(2915, 2915)),
+  Box(Box(2916, 2916), Box(2916, 2916)),
+  Box(Box(2917, 2917), Box(2917, 2917)),
+  Box(Box(2918, 2918), Box(2918, 2918)),
+  Box(Box(2919, 2919), Box(2919, 2919)),
+  Box(Box(2920, 2920), Box(2920, 2920)),
+  Box(Box(2921, 2921), Box(2921, 2921)),
+  Box(Box(2922, 2922), Box(2922, 2922)),
+  Box(Box(2923, 2923), Box(2923, 2923)),
+  Box(Box(2924, 2924), Box(2924, 2924)),
+  Box(Box(2925, 2925), Box(2925, 2925)),
+  Box(Box(2926, 2926), Box(2926, 2926)),
+  Box(Box(2927, 2927), Box(2927, 2927)),
+  Box(Box(2928, 2928), Box(2928, 2928)),
+  Box(Box(2929, 2929), Box(2929, 2929)),
+  Box(Box(2930, 2930), Box(2930, 2930)),
+  Box(Box(2931, 2931), Box(2931, 2931)),
+  Box(Box(2932, 2932), Box(2932, 2932)),
+  Box(Box(2933, 2933), Box(2933, 2933)),
+  Box(Box(2934, 2934), Box(2934, 2934)),
+  Box(Box(2935, 2935), Box(2935, 2935)),
+  Box(Box(2936, 2936), Box(2936, 2936)),
+  Box(Box(2937, 2937), Box(2937, 2937)),
+  Box(Box(2938, 2938), Box(2938, 2938)),
+  Box(Box(2939, 2939), Box(2939, 2939)),
+  Box(Box(2940, 2940), Box(2940, 2940)),
+  Box(Box(2941, 2941), Box(2941, 2941)),
+  Box(Box(2942, 2942), Box(2942, 2942)),
+  Box(Box(2943, 2943), Box(2943, 2943)),
+  Box(Box(2944, 2944), Box(2944, 2944)),
+  Box(Box(2945, 2945), Box(2945, 2945)),
+  Box(Box(2946, 2946), Box(2946, 2946)),
+  Box(Box(2947, 2947), Box(2947, 2947)),
+  Box(Box(2948, 2948), Box(2948, 2948)),
+  Box(Box(2949, 2949), Box(2949, 2949)),
+  Box(Box(2950, 2950), Box(2950, 2950)),
+  Box(Box(2951, 2951), Box(2951, 2951)),
+  Box(Box(2952, 2952), Box(2952, 2952)),
+  Box(Box(2953, 2953), Box(2953, 2953)),
+  Box(Box(2954, 2954), Box(2954, 2954)),
+  Box(Box(2955, 2955), Box(2955, 2955)),
+  Box(Box(2956, 2956), Box(2956, 2956)),
+  Box(Box(2957, 2957), Box(2957, 2957)),
+  Box(Box(2958, 2958), Box(2958, 2958)),
+  Box(Box(2959, 2959), Box(2959, 2959)),
+  Box(Box(2960, 2960), Box(2960, 2960)),
+  Box(Box(2961, 2961), Box(2961, 2961)),
+  Box(Box(2962, 2962), Box(2962, 2962)),
+  Box(Box(2963, 2963), Box(2963, 2963)),
+  Box(Box(2964, 2964), Box(2964, 2964)),
+  Box(Box(2965, 2965), Box(2965, 2965)),
+  Box(Box(2966, 2966), Box(2966, 2966)),
+  Box(Box(2967, 2967), Box(2967, 2967)),
+  Box(Box(2968, 2968), Box(2968, 2968)),
+  Box(Box(2969, 2969), Box(2969, 2969)),
+  Box(Box(2970, 2970), Box(2970, 2970)),
+  Box(Box(2971, 2971), Box(2971, 2971)),
+  Box(Box(2972, 2972), Box(2972, 2972)),
+  Box(Box(2973, 2973), Box(2973, 2973)),
+  Box(Box(2974, 2974), Box(2974, 2974)),
+  Box(Box(2975, 2975), Box(2975, 2975)),
+  Box(Box(2976, 2976), Box(2976, 2976)),
+  Box(Box(2977, 2977), Box(2977, 2977)),
+  Box(Box(2978, 2978), Box(2978, 2978)),
+  Box(Box(2979, 2979), Box(2979, 2979)),
+  Box(Box(2980, 2980), Box(2980, 2980)),
+  Box(Box(2981, 2981), Box(2981, 2981)),
+  Box(Box(2982, 2982), Box(2982, 2982)),
+  Box(Box(2983, 2983), Box(2983, 2983)),
+  Box(Box(2984, 2984), Box(2984, 2984)),
+  Box(Box(2985, 2985), Box(2985, 2985)),
+  Box(Box(2986, 2986), Box(2986, 2986)),
+  Box(Box(2987, 2987), Box(2987, 2987)),
+  Box(Box(2988, 2988), Box(2988, 2988)),
+  Box(Box(2989, 2989), Box(2989, 2989)),
+  Box(Box(2990, 2990), Box(2990, 2990)),
+  Box(Box(2991, 2991), Box(2991, 2991)),
+  Box(Box(2992, 2992), Box(2992, 2992)),
+  Box(Box(2993, 2993), Box(2993, 2993)),
+  Box(Box(2994, 2994), Box(2994, 2994)),
+  Box(Box(2995, 2995), Box(2995, 2995)),
+  Box(Box(2996, 2996), Box(2996, 2996)),
+  Box(Box(2997, 2997), Box(2997, 2997)),
+  Box(Box(2998, 2998), Box(2998, 2998)),
+  Box(Box(2999, 2999), Box(2999, 2999)),
+  Box(Box(3000, 3000), Box(3000, 3000)),
+  Box(Box(3001, 3001), Box(3001, 3001)),
+  Box(Box(3002, 3002), Box(3002, 3002)),
+  Box(Box(3003, 3003), Box(3003, 3003)),
+  Box(Box(3004, 3004), Box(3004, 3004)),
+  Box(Box(3005, 3005), Box(3005, 3005)),
+  Box(Box(3006, 3006), Box(3006, 3006)),
+  Box(Box(3007, 3007), Box(3007, 3007)),
+  Box(Box(3008, 3008), Box(3008, 3008)),
+  Box(Box(3009, 3009), Box(3009, 3009)),
+  Box(Box(3010, 3010), Box(3010, 3010)),
+  Box(Box(3011, 3011), Box(3011, 3011)),
+  Box(Box(3012, 3012), Box(3012, 3012)),
+  Box(Box(3013, 3013), Box(3013, 3013)),
+  Box(Box(3014, 3014), Box(3014, 3014)),
+  Box(Box(3015, 3015), Box(3015, 3015)),
+  Box(Box(3016, 3016), Box(3016, 3016)),
+  Box(Box(3017, 3017), Box(3017, 3017)),
+  Box(Box(3018, 3018), Box(3018, 3018)),
+  Box(Box(3019, 3019), Box(3019, 3019)),
+  Box(Box(3020, 3020), Box(3020, 3020)),
+  Box(Box(3021, 3021), Box(3021, 3021)),
+  Box(Box(3022, 3022), Box(3022, 3022)),
+  Box(Box(3023, 3023), Box(3023, 3023)),
+  Box(Box(3024, 3024), Box(3024, 3024)),
+  Box(Box(3025, 3025), Box(3025, 3025)),
+  Box(Box(3026, 3026), Box(3026, 3026)),
+  Box(Box(3027, 3027), Box(3027, 3027)),
+  Box(Box(3028, 3028), Box(3028, 3028)),
+  Box(Box(3029, 3029), Box(3029, 3029)),
+  Box(Box(3030, 3030), Box(3030, 3030)),
+  Box(Box(3031, 3031), Box(3031, 3031)),
+  Box(Box(3032, 3032), Box(3032, 3032)),
+  Box(Box(3033, 3033), Box(3033, 3033)),
+  Box(Box(3034, 3034), Box(3034, 3034)),
+  Box(Box(3035, 3035), Box(3035, 3035)),
+  Box(Box(3036, 3036), Box(3036, 3036)),
+  Box(Box(3037, 3037), Box(3037, 3037)),
+  Box(Box(3038, 3038), Box(3038, 3038)),
+  Box(Box(3039, 3039), Box(3039, 3039)),
+  Box(Box(3040, 3040), Box(3040, 3040)),
+  Box(Box(3041, 3041), Box(3041, 3041)),
+  Box(Box(3042, 3042), Box(3042, 3042)),
+  Box(Box(3043, 3043), Box(3043, 3043)),
+  Box(Box(3044, 3044), Box(3044, 3044)),
+  Box(Box(3045, 3045), Box(3045, 3045)),
+  Box(Box(3046, 3046), Box(3046, 3046)),
+  Box(Box(3047, 3047), Box(3047, 3047)),
+  Box(Box(3048, 3048), Box(3048, 3048)),
+  Box(Box(3049, 3049), Box(3049, 3049)),
+  Box(Box(3050, 3050), Box(3050, 3050)),
+  Box(Box(3051, 3051), Box(3051, 3051)),
+  Box(Box(3052, 3052), Box(3052, 3052)),
+  Box(Box(3053, 3053), Box(3053, 3053)),
+  Box(Box(3054, 3054), Box(3054, 3054)),
+  Box(Box(3055, 3055), Box(3055, 3055)),
+  Box(Box(3056, 3056), Box(3056, 3056)),
+  Box(Box(3057, 3057), Box(3057, 3057)),
+  Box(Box(3058, 3058), Box(3058, 3058)),
+  Box(Box(3059, 3059), Box(3059, 3059)),
+  Box(Box(3060, 3060), Box(3060, 3060)),
+  Box(Box(3061, 3061), Box(3061, 3061)),
+  Box(Box(3062, 3062), Box(3062, 3062)),
+  Box(Box(3063, 3063), Box(3063, 3063)),
+  Box(Box(3064, 3064), Box(3064, 3064)),
+  Box(Box(3065, 3065), Box(3065, 3065)),
+  Box(Box(3066, 3066), Box(3066, 3066)),
+  Box(Box(3067, 3067), Box(3067, 3067)),
+  Box(Box(3068, 3068), Box(3068, 3068)),
+  Box(Box(3069, 3069), Box(3069, 3069)),
+  Box(Box(3070, 3070), Box(3070, 3070)),
+  Box(Box(3071, 3071), Box(3071, 3071)),
+  Box(Box(3072, 3072), Box(3072, 3072)),
+  Box(Box(3073, 3073), Box(3073, 3073)),
+  Box(Box(3074, 3074), Box(3074, 3074)),
+  Box(Box(3075, 3075), Box(3075, 3075)),
+  Box(Box(3076, 3076), Box(3076, 3076)),
+  Box(Box(3077, 3077), Box(3077, 3077)),
+  Box(Box(3078, 3078), Box(3078, 3078)),
+  Box(Box(3079, 3079), Box(3079, 3079)),
+  Box(Box(3080, 3080), Box(3080, 3080)),
+  Box(Box(3081, 3081), Box(3081, 3081)),
+  Box(Box(3082, 3082), Box(3082, 3082)),
+  Box(Box(3083, 3083), Box(3083, 3083)),
+  Box(Box(3084, 3084), Box(3084, 3084)),
+  Box(Box(3085, 3085), Box(3085, 3085)),
+  Box(Box(3086, 3086), Box(3086, 3086)),
+  Box(Box(3087, 3087), Box(3087, 3087)),
+  Box(Box(3088, 3088), Box(3088, 3088)),
+  Box(Box(3089, 3089), Box(3089, 3089)),
+  Box(Box(3090, 3090), Box(3090, 3090)),
+  Box(Box(3091, 3091), Box(3091, 3091)),
+  Box(Box(3092, 3092), Box(3092, 3092)),
+  Box(Box(3093, 3093), Box(3093, 3093)),
+  Box(Box(3094, 3094), Box(3094, 3094)),
+  Box(Box(3095, 3095), Box(3095, 3095)),
+  Box(Box(3096, 3096), Box(3096, 3096)),
+  Box(Box(3097, 3097), Box(3097, 3097)),
+  Box(Box(3098, 3098), Box(3098, 3098)),
+  Box(Box(3099, 3099), Box(3099, 3099)),
+  Box(Box(3100, 3100), Box(3100, 3100)),
+  Box(Box(3101, 3101), Box(3101, 3101)),
+  Box(Box(3102, 3102), Box(3102, 3102)),
+  Box(Box(3103, 3103), Box(3103, 3103)),
+  Box(Box(3104, 3104), Box(3104, 3104)),
+  Box(Box(3105, 3105), Box(3105, 3105)),
+  Box(Box(3106, 3106), Box(3106, 3106)),
+  Box(Box(3107, 3107), Box(3107, 3107)),
+  Box(Box(3108, 3108), Box(3108, 3108)),
+  Box(Box(3109, 3109), Box(3109, 3109)),
+  Box(Box(3110, 3110), Box(3110, 3110)),
+  Box(Box(3111, 3111), Box(3111, 3111)),
+  Box(Box(3112, 3112), Box(3112, 3112)),
+  Box(Box(3113, 3113), Box(3113, 3113)),
+  Box(Box(3114, 3114), Box(3114, 3114)),
+  Box(Box(3115, 3115), Box(3115, 3115)),
+  Box(Box(3116, 3116), Box(3116, 3116)),
+  Box(Box(3117, 3117), Box(3117, 3117)),
+  Box(Box(3118, 3118), Box(3118, 3118)),
+  Box(Box(3119, 3119), Box(3119, 3119)),
+  Box(Box(3120, 3120), Box(3120, 3120)),
+  Box(Box(3121, 3121), Box(3121, 3121)),
+  Box(Box(3122, 3122), Box(3122, 3122)),
+  Box(Box(3123, 3123), Box(3123, 3123)),
+  Box(Box(3124, 3124), Box(3124, 3124)),
+  Box(Box(3125, 3125), Box(3125, 3125)),
+  Box(Box(3126, 3126), Box(3126, 3126)),
+  Box(Box(3127, 3127), Box(3127, 3127)),
+  Box(Box(3128, 3128), Box(3128, 3128)),
+  Box(Box(3129, 3129), Box(3129, 3129)),
+  Box(Box(3130, 3130), Box(3130, 3130)),
+  Box(Box(3131, 3131), Box(3131, 3131)),
+  Box(Box(3132, 3132), Box(3132, 3132)),
+  Box(Box(3133, 3133), Box(3133, 3133)),
+  Box(Box(3134, 3134), Box(3134, 3134)),
+  Box(Box(3135, 3135), Box(3135, 3135)),
+  Box(Box(3136, 3136), Box(3136, 3136)),
+  Box(Box(3137, 3137), Box(3137, 3137)),
+  Box(Box(3138, 3138), Box(3138, 3138)),
+  Box(Box(3139, 3139), Box(3139, 3139)),
+  Box(Box(3140, 3140), Box(3140, 3140)),
+  Box(Box(3141, 3141), Box(3141, 3141)),
+  Box(Box(3142, 3142), Box(3142, 3142)),
+  Box(Box(3143, 3143), Box(3143, 3143)),
+  Box(Box(3144, 3144), Box(3144, 3144)),
+  Box(Box(3145, 3145), Box(3145, 3145)),
+  Box(Box(3146, 3146), Box(3146, 3146)),
+  Box(Box(3147, 3147), Box(3147, 3147)),
+  Box(Box(3148, 3148), Box(3148, 3148)),
+  Box(Box(3149, 3149), Box(3149, 3149)),
+  Box(Box(3150, 3150), Box(3150, 3150)),
+  Box(Box(3151, 3151), Box(3151, 3151)),
+  Box(Box(3152, 3152), Box(3152, 3152)),
+  Box(Box(3153, 3153), Box(3153, 3153)),
+  Box(Box(3154, 3154), Box(3154, 3154)),
+  Box(Box(3155, 3155), Box(3155, 3155)),
+  Box(Box(3156, 3156), Box(3156, 3156)),
+  Box(Box(3157, 3157), Box(3157, 3157)),
+  Box(Box(3158, 3158), Box(3158, 3158)),
+  Box(Box(3159, 3159), Box(3159, 3159)),
+  Box(Box(3160, 3160), Box(3160, 3160)),
+  Box(Box(3161, 3161), Box(3161, 3161)),
+  Box(Box(3162, 3162), Box(3162, 3162)),
+  Box(Box(3163, 3163), Box(3163, 3163)),
+  Box(Box(3164, 3164), Box(3164, 3164)),
+  Box(Box(3165, 3165), Box(3165, 3165)),
+  Box(Box(3166, 3166), Box(3166, 3166)),
+  Box(Box(3167, 3167), Box(3167, 3167)),
+  Box(Box(3168, 3168), Box(3168, 3168)),
+  Box(Box(3169, 3169), Box(3169, 3169)),
+  Box(Box(3170, 3170), Box(3170, 3170)),
+  Box(Box(3171, 3171), Box(3171, 3171)),
+  Box(Box(3172, 3172), Box(3172, 3172)),
+  Box(Box(3173, 3173), Box(3173, 3173)),
+  Box(Box(3174, 3174), Box(3174, 3174)),
+  Box(Box(3175, 3175), Box(3175, 3175)),
+  Box(Box(3176, 3176), Box(3176, 3176)),
+  Box(Box(3177, 3177), Box(3177, 3177)),
+  Box(Box(3178, 3178), Box(3178, 3178)),
+  Box(Box(3179, 3179), Box(3179, 3179)),
+  Box(Box(3180, 3180), Box(3180, 3180)),
+  Box(Box(3181, 3181), Box(3181, 3181)),
+  Box(Box(3182, 3182), Box(3182, 3182)),
+  Box(Box(3183, 3183), Box(3183, 3183)),
+  Box(Box(3184, 3184), Box(3184, 3184)),
+  Box(Box(3185, 3185), Box(3185, 3185)),
+  Box(Box(3186, 3186), Box(3186, 3186)),
+  Box(Box(3187, 3187), Box(3187, 3187)),
+  Box(Box(3188, 3188), Box(3188, 3188)),
+  Box(Box(3189, 3189), Box(3189, 3189)),
+  Box(Box(3190, 3190), Box(3190, 3190)),
+  Box(Box(3191, 3191), Box(3191, 3191)),
+  Box(Box(3192, 3192), Box(3192, 3192)),
+  Box(Box(3193, 3193), Box(3193, 3193)),
+  Box(Box(3194, 3194), Box(3194, 3194)),
+  Box(Box(3195, 3195), Box(3195, 3195)),
+  Box(Box(3196, 3196), Box(3196, 3196)),
+  Box(Box(3197, 3197), Box(3197, 3197)),
+  Box(Box(3198, 3198), Box(3198, 3198)),
+  Box(Box(3199, 3199), Box(3199, 3199)),
+  Box(Box(3200, 3200), Box(3200, 3200)),
+  Box(Box(3201, 3201), Box(3201, 3201)),
+  Box(Box(3202, 3202), Box(3202, 3202)),
+  Box(Box(3203, 3203), Box(3203, 3203)),
+  Box(Box(3204, 3204), Box(3204, 3204)),
+  Box(Box(3205, 3205), Box(3205, 3205)),
+  Box(Box(3206, 3206), Box(3206, 3206)),
+  Box(Box(3207, 3207), Box(3207, 3207)),
+  Box(Box(3208, 3208), Box(3208, 3208)),
+  Box(Box(3209, 3209), Box(3209, 3209)),
+  Box(Box(3210, 3210), Box(3210, 3210)),
+  Box(Box(3211, 3211), Box(3211, 3211)),
+  Box(Box(3212, 3212), Box(3212, 3212)),
+  Box(Box(3213, 3213), Box(3213, 3213)),
+  Box(Box(3214, 3214), Box(3214, 3214)),
+  Box(Box(3215, 3215), Box(3215, 3215)),
+  Box(Box(3216, 3216), Box(3216, 3216)),
+  Box(Box(3217, 3217), Box(3217, 3217)),
+  Box(Box(3218, 3218), Box(3218, 3218)),
+  Box(Box(3219, 3219), Box(3219, 3219)),
+  Box(Box(3220, 3220), Box(3220, 3220)),
+  Box(Box(3221, 3221), Box(3221, 3221)),
+  Box(Box(3222, 3222), Box(3222, 3222)),
+  Box(Box(3223, 3223), Box(3223, 3223)),
+  Box(Box(3224, 3224), Box(3224, 3224)),
+  Box(Box(3225, 3225), Box(3225, 3225)),
+  Box(Box(3226, 3226), Box(3226, 3226)),
+  Box(Box(3227, 3227), Box(3227, 3227)),
+  Box(Box(3228, 3228), Box(3228, 3228)),
+  Box(Box(3229, 3229), Box(3229, 3229)),
+  Box(Box(3230, 3230), Box(3230, 3230)),
+  Box(Box(3231, 3231), Box(3231, 3231)),
+  Box(Box(3232, 3232), Box(3232, 3232)),
+  Box(Box(3233, 3233), Box(3233, 3233)),
+  Box(Box(3234, 3234), Box(3234, 3234)),
+  Box(Box(3235, 3235), Box(3235, 3235)),
+  Box(Box(3236, 3236), Box(3236, 3236)),
+  Box(Box(3237, 3237), Box(3237, 3237)),
+  Box(Box(3238, 3238), Box(3238, 3238)),
+  Box(Box(3239, 3239), Box(3239, 3239)),
+  Box(Box(3240, 3240), Box(3240, 3240)),
+  Box(Box(3241, 3241), Box(3241, 3241)),
+  Box(Box(3242, 3242), Box(3242, 3242)),
+  Box(Box(3243, 3243), Box(3243, 3243)),
+  Box(Box(3244, 3244), Box(3244, 3244)),
+  Box(Box(3245, 3245), Box(3245, 3245)),
+  Box(Box(3246, 3246), Box(3246, 3246)),
+  Box(Box(3247, 3247), Box(3247, 3247)),
+  Box(Box(3248, 3248), Box(3248, 3248)),
+  Box(Box(3249, 3249), Box(3249, 3249)),
+  Box(Box(3250, 3250), Box(3250, 3250)),
+  Box(Box(3251, 3251), Box(3251, 3251)),
+  Box(Box(3252, 3252), Box(3252, 3252)),
+  Box(Box(3253, 3253), Box(3253, 3253)),
+  Box(Box(3254, 3254), Box(3254, 3254)),
+  Box(Box(3255, 3255), Box(3255, 3255)),
+  Box(Box(3256, 3256), Box(3256, 3256)),
+  Box(Box(3257, 3257), Box(3257, 3257)),
+  Box(Box(3258, 3258), Box(3258, 3258)),
+  Box(Box(3259, 3259), Box(3259, 3259)),
+  Box(Box(3260, 3260), Box(3260, 3260)),
+  Box(Box(3261, 3261), Box(3261, 3261)),
+  Box(Box(3262, 3262), Box(3262, 3262)),
+  Box(Box(3263, 3263), Box(3263, 3263)),
+  Box(Box(3264, 3264), Box(3264, 3264)),
+  Box(Box(3265, 3265), Box(3265, 3265)),
+  Box(Box(3266, 3266), Box(3266, 3266)),
+  Box(Box(3267, 3267), Box(3267, 3267)),
+  Box(Box(3268, 3268), Box(3268, 3268)),
+  Box(Box(3269, 3269), Box(3269, 3269)),
+  Box(Box(3270, 3270), Box(3270, 3270)),
+  Box(Box(3271, 3271), Box(3271, 3271)),
+  Box(Box(3272, 3272), Box(3272, 3272)),
+  Box(Box(3273, 3273), Box(3273, 3273)),
+  Box(Box(3274, 3274), Box(3274, 3274)),
+  Box(Box(3275, 3275), Box(3275, 3275)),
+  Box(Box(3276, 3276), Box(3276, 3276)),
+  Box(Box(3277, 3277), Box(3277, 3277)),
+  Box(Box(3278, 3278), Box(3278, 3278)),
+  Box(Box(3279, 3279), Box(3279, 3279)),
+  Box(Box(3280, 3280), Box(3280, 3280)),
+  Box(Box(3281, 3281), Box(3281, 3281)),
+  Box(Box(3282, 3282), Box(3282, 3282)),
+  Box(Box(3283, 3283), Box(3283, 3283)),
+  Box(Box(3284, 3284), Box(3284, 3284)),
+  Box(Box(3285, 3285), Box(3285, 3285)),
+  Box(Box(3286, 3286), Box(3286, 3286)),
+  Box(Box(3287, 3287), Box(3287, 3287)),
+  Box(Box(3288, 3288), Box(3288, 3288)),
+  Box(Box(3289, 3289), Box(3289, 3289)),
+  Box(Box(3290, 3290), Box(3290, 3290)),
+  Box(Box(3291, 3291), Box(3291, 3291)),
+  Box(Box(3292, 3292), Box(3292, 3292)),
+  Box(Box(3293, 3293), Box(3293, 3293)),
+  Box(Box(3294, 3294), Box(3294, 3294)),
+  Box(Box(3295, 3295), Box(3295, 3295)),
+  Box(Box(3296, 3296), Box(3296, 3296)),
+  Box(Box(3297, 3297), Box(3297, 3297)),
+  Box(Box(3298, 3298), Box(3298, 3298)),
+  Box(Box(3299, 3299), Box(3299, 3299)),
+  Box(Box(3300, 3300), Box(3300, 3300)),
+  Box(Box(3301, 3301), Box(3301, 3301)),
+  Box(Box(3302, 3302), Box(3302, 3302)),
+  Box(Box(3303, 3303), Box(3303, 3303)),
+  Box(Box(3304, 3304), Box(3304, 3304)),
+  Box(Box(3305, 3305), Box(3305, 3305)),
+  Box(Box(3306, 3306), Box(3306, 3306)),
+  Box(Box(3307, 3307), Box(3307, 3307)),
+  Box(Box(3308, 3308), Box(3308, 3308)),
+  Box(Box(3309, 3309), Box(3309, 3309)),
+  Box(Box(3310, 3310), Box(3310, 3310)),
+  Box(Box(3311, 3311), Box(3311, 3311)),
+  Box(Box(3312, 3312), Box(3312, 3312)),
+  Box(Box(3313, 3313), Box(3313, 3313)),
+  Box(Box(3314, 3314), Box(3314, 3314)),
+  Box(Box(3315, 3315), Box(3315, 3315)),
+  Box(Box(3316, 3316), Box(3316, 3316)),
+  Box(Box(3317, 3317), Box(3317, 3317)),
+  Box(Box(3318, 3318), Box(3318, 3318)),
+  Box(Box(3319, 3319), Box(3319, 3319)),
+  Box(Box(3320, 3320), Box(3320, 3320)),
+  Box(Box(3321, 3321), Box(3321, 3321)),
+  Box(Box(3322, 3322), Box(3322, 3322)),
+  Box(Box(3323, 3323), Box(3323, 3323)),
+  Box(Box(3324, 3324), Box(3324, 3324)),
+  Box(Box(3325, 3325), Box(3325, 3325)),
+  Box(Box(3326, 3326), Box(3326, 3326)),
+  Box(Box(3327, 3327), Box(3327, 3327)),
+  Box(Box(3328, 3328), Box(3328, 3328)),
+  Box(Box(3329, 3329), Box(3329, 3329)),
+  Box(Box(3330, 3330), Box(3330, 3330)),
+  Box(Box(3331, 3331), Box(3331, 3331)),
+  Box(Box(3332, 3332), Box(3332, 3332)),
+  Box(Box(3333, 3333), Box(3333, 3333)),
+  Box(Box(3334, 3334), Box(3334, 3334)),
+  Box(Box(3335, 3335), Box(3335, 3335)),
+  Box(Box(3336, 3336), Box(3336, 3336)),
+  Box(Box(3337, 3337), Box(3337, 3337)),
+  Box(Box(3338, 3338), Box(3338, 3338)),
+  Box(Box(3339, 3339), Box(3339, 3339)),
+  Box(Box(3340, 3340), Box(3340, 3340)),
+  Box(Box(3341, 3341), Box(3341, 3341)),
+  Box(Box(3342, 3342), Box(3342, 3342)),
+  Box(Box(3343, 3343), Box(3343, 3343)),
+  Box(Box(3344, 3344), Box(3344, 3344)),
+  Box(Box(3345, 3345), Box(3345, 3345)),
+  Box(Box(3346, 3346), Box(3346, 3346)),
+  Box(Box(3347, 3347), Box(3347, 3347)),
+  Box(Box(3348, 3348), Box(3348, 3348)),
+  Box(Box(3349, 3349), Box(3349, 3349)),
+  Box(Box(3350, 3350), Box(3350, 3350)),
+  Box(Box(3351, 3351), Box(3351, 3351)),
+  Box(Box(3352, 3352), Box(3352, 3352)),
+  Box(Box(3353, 3353), Box(3353, 3353)),
+  Box(Box(3354, 3354), Box(3354, 3354)),
+  Box(Box(3355, 3355), Box(3355, 3355)),
+  Box(Box(3356, 3356), Box(3356, 3356)),
+  Box(Box(3357, 3357), Box(3357, 3357)),
+  Box(Box(3358, 3358), Box(3358, 3358)),
+  Box(Box(3359, 3359), Box(3359, 3359)),
+  Box(Box(3360, 3360), Box(3360, 3360)),
+  Box(Box(3361, 3361), Box(3361, 3361)),
+  Box(Box(3362, 3362), Box(3362, 3362)),
+  Box(Box(3363, 3363), Box(3363, 3363)),
+  Box(Box(3364, 3364), Box(3364, 3364)),
+  Box(Box(3365, 3365), Box(3365, 3365)),
+  Box(Box(3366, 3366), Box(3366, 3366)),
+  Box(Box(3367, 3367), Box(3367, 3367)),
+  Box(Box(3368, 3368), Box(3368, 3368)),
+  Box(Box(3369, 3369), Box(3369, 3369)),
+  Box(Box(3370, 3370), Box(3370, 3370)),
+  Box(Box(3371, 3371), Box(3371, 3371)),
+  Box(Box(3372, 3372), Box(3372, 3372)),
+  Box(Box(3373, 3373), Box(3373, 3373)),
+  Box(Box(3374, 3374), Box(3374, 3374)),
+  Box(Box(3375, 3375), Box(3375, 3375)),
+  Box(Box(3376, 3376), Box(3376, 3376)),
+  Box(Box(3377, 3377), Box(3377, 3377)),
+  Box(Box(3378, 3378), Box(3378, 3378)),
+  Box(Box(3379, 3379), Box(3379, 3379)),
+  Box(Box(3380, 3380), Box(3380, 3380)),
+  Box(Box(3381, 3381), Box(3381, 3381)),
+  Box(Box(3382, 3382), Box(3382, 3382)),
+  Box(Box(3383, 3383), Box(3383, 3383)),
+  Box(Box(3384, 3384), Box(3384, 3384)),
+  Box(Box(3385, 3385), Box(3385, 3385)),
+  Box(Box(3386, 3386), Box(3386, 3386)),
+  Box(Box(3387, 3387), Box(3387, 3387)),
+  Box(Box(3388, 3388), Box(3388, 3388)),
+  Box(Box(3389, 3389), Box(3389, 3389)),
+  Box(Box(3390, 3390), Box(3390, 3390)),
+  Box(Box(3391, 3391), Box(3391, 3391)),
+  Box(Box(3392, 3392), Box(3392, 3392)),
+  Box(Box(3393, 3393), Box(3393, 3393)),
+  Box(Box(3394, 3394), Box(3394, 3394)),
+  Box(Box(3395, 3395), Box(3395, 3395)),
+  Box(Box(3396, 3396), Box(3396, 3396)),
+  Box(Box(3397, 3397), Box(3397, 3397)),
+  Box(Box(3398, 3398), Box(3398, 3398)),
+  Box(Box(3399, 3399), Box(3399, 3399)),
+  Box(Box(3400, 3400), Box(3400, 3400)),
+  Box(Box(3401, 3401), Box(3401, 3401)),
+  Box(Box(3402, 3402), Box(3402, 3402)),
+  Box(Box(3403, 3403), Box(3403, 3403)),
+  Box(Box(3404, 3404), Box(3404, 3404)),
+  Box(Box(3405, 3405), Box(3405, 3405)),
+  Box(Box(3406, 3406), Box(3406, 3406)),
+  Box(Box(3407, 3407), Box(3407, 3407)),
+  Box(Box(3408, 3408), Box(3408, 3408)),
+  Box(Box(3409, 3409), Box(3409, 3409)),
+  Box(Box(3410, 3410), Box(3410, 3410)),
+  Box(Box(3411, 3411), Box(3411, 3411)),
+  Box(Box(3412, 3412), Box(3412, 3412)),
+  Box(Box(3413, 3413), Box(3413, 3413)),
+  Box(Box(3414, 3414), Box(3414, 3414)),
+  Box(Box(3415, 3415), Box(3415, 3415)),
+  Box(Box(3416, 3416), Box(3416, 3416)),
+  Box(Box(3417, 3417), Box(3417, 3417)),
+  Box(Box(3418, 3418), Box(3418, 3418)),
+  Box(Box(3419, 3419), Box(3419, 3419)),
+  Box(Box(3420, 3420), Box(3420, 3420)),
+  Box(Box(3421, 3421), Box(3421, 3421)),
+  Box(Box(3422, 3422), Box(3422, 3422)),
+  Box(Box(3423, 3423), Box(3423, 3423)),
+  Box(Box(3424, 3424), Box(3424, 3424)),
+  Box(Box(3425, 3425), Box(3425, 3425)),
+  Box(Box(3426, 3426), Box(3426, 3426)),
+  Box(Box(3427, 3427), Box(3427, 3427)),
+  Box(Box(3428, 3428), Box(3428, 3428)),
+  Box(Box(3429, 3429), Box(3429, 3429)),
+  Box(Box(3430, 3430), Box(3430, 3430)),
+  Box(Box(3431, 3431), Box(3431, 3431)),
+  Box(Box(3432, 3432), Box(3432, 3432)),
+  Box(Box(3433, 3433), Box(3433, 3433)),
+  Box(Box(3434, 3434), Box(3434, 3434)),
+  Box(Box(3435, 3435), Box(3435, 3435)),
+  Box(Box(3436, 3436), Box(3436, 3436)),
+  Box(Box(3437, 3437), Box(3437, 3437)),
+  Box(Box(3438, 3438), Box(3438, 3438)),
+  Box(Box(3439, 3439), Box(3439, 3439)),
+  Box(Box(3440, 3440), Box(3440, 3440)),
+  Box(Box(3441, 3441), Box(3441, 3441)),
+  Box(Box(3442, 3442), Box(3442, 3442)),
+  Box(Box(3443, 3443), Box(3443, 3443)),
+  Box(Box(3444, 3444), Box(3444, 3444)),
+  Box(Box(3445, 3445), Box(3445, 3445)),
+  Box(Box(3446, 3446), Box(3446, 3446)),
+  Box(Box(3447, 3447), Box(3447, 3447)),
+  Box(Box(3448, 3448), Box(3448, 3448)),
+  Box(Box(3449, 3449), Box(3449, 3449)),
+  Box(Box(3450, 3450), Box(3450, 3450)),
+  Box(Box(3451, 3451), Box(3451, 3451)),
+  Box(Box(3452, 3452), Box(3452, 3452)),
+  Box(Box(3453, 3453), Box(3453, 3453)),
+  Box(Box(3454, 3454), Box(3454, 3454)),
+  Box(Box(3455, 3455), Box(3455, 3455)),
+  Box(Box(3456, 3456), Box(3456, 3456)),
+  Box(Box(3457, 3457), Box(3457, 3457)),
+  Box(Box(3458, 3458), Box(3458, 3458)),
+  Box(Box(3459, 3459), Box(3459, 3459)),
+  Box(Box(3460, 3460), Box(3460, 3460)),
+  Box(Box(3461, 3461), Box(3461, 3461)),
+  Box(Box(3462, 3462), Box(3462, 3462)),
+  Box(Box(3463, 3463), Box(3463, 3463)),
+  Box(Box(3464, 3464), Box(3464, 3464)),
+  Box(Box(3465, 3465), Box(3465, 3465)),
+  Box(Box(3466, 3466), Box(3466, 3466)),
+  Box(Box(3467, 3467), Box(3467, 3467)),
+  Box(Box(3468, 3468), Box(3468, 3468)),
+  Box(Box(3469, 3469), Box(3469, 3469)),
+  Box(Box(3470, 3470), Box(3470, 3470)),
+  Box(Box(3471, 3471), Box(3471, 3471)),
+  Box(Box(3472, 3472), Box(3472, 3472)),
+  Box(Box(3473, 3473), Box(3473, 3473)),
+  Box(Box(3474, 3474), Box(3474, 3474)),
+  Box(Box(3475, 3475), Box(3475, 3475)),
+  Box(Box(3476, 3476), Box(3476, 3476)),
+  Box(Box(3477, 3477), Box(3477, 3477)),
+  Box(Box(3478, 3478), Box(3478, 3478)),
+  Box(Box(3479, 3479), Box(3479, 3479)),
+  Box(Box(3480, 3480), Box(3480, 3480)),
+  Box(Box(3481, 3481), Box(3481, 3481)),
+  Box(Box(3482, 3482), Box(3482, 3482)),
+  Box(Box(3483, 3483), Box(3483, 3483)),
+  Box(Box(3484, 3484), Box(3484, 3484)),
+  Box(Box(3485, 3485), Box(3485, 3485)),
+  Box(Box(3486, 3486), Box(3486, 3486)),
+  Box(Box(3487, 3487), Box(3487, 3487)),
+  Box(Box(3488, 3488), Box(3488, 3488)),
+  Box(Box(3489, 3489), Box(3489, 3489)),
+  Box(Box(3490, 3490), Box(3490, 3490)),
+  Box(Box(3491, 3491), Box(3491, 3491)),
+  Box(Box(3492, 3492), Box(3492, 3492)),
+  Box(Box(3493, 3493), Box(3493, 3493)),
+  Box(Box(3494, 3494), Box(3494, 3494)),
+  Box(Box(3495, 3495), Box(3495, 3495)),
+  Box(Box(3496, 3496), Box(3496, 3496)),
+  Box(Box(3497, 3497), Box(3497, 3497)),
+  Box(Box(3498, 3498), Box(3498, 3498)),
+  Box(Box(3499, 3499), Box(3499, 3499)),
+  Box(Box(3500, 3500), Box(3500, 3500)),
+  Box(Box(3501, 3501), Box(3501, 3501)),
+  Box(Box(3502, 3502), Box(3502, 3502)),
+  Box(Box(3503, 3503), Box(3503, 3503)),
+  Box(Box(3504, 3504), Box(3504, 3504)),
+  Box(Box(3505, 3505), Box(3505, 3505)),
+  Box(Box(3506, 3506), Box(3506, 3506)),
+  Box(Box(3507, 3507), Box(3507, 3507)),
+  Box(Box(3508, 3508), Box(3508, 3508)),
+  Box(Box(3509, 3509), Box(3509, 3509)),
+  Box(Box(3510, 3510), Box(3510, 3510)),
+  Box(Box(3511, 3511), Box(3511, 3511)),
+  Box(Box(3512, 3512), Box(3512, 3512)),
+  Box(Box(3513, 3513), Box(3513, 3513)),
+  Box(Box(3514, 3514), Box(3514, 3514)),
+  Box(Box(3515, 3515), Box(3515, 3515)),
+  Box(Box(3516, 3516), Box(3516, 3516)),
+  Box(Box(3517, 3517), Box(3517, 3517)),
+  Box(Box(3518, 3518), Box(3518, 3518)),
+  Box(Box(3519, 3519), Box(3519, 3519)),
+  Box(Box(3520, 3520), Box(3520, 3520)),
+  Box(Box(3521, 3521), Box(3521, 3521)),
+  Box(Box(3522, 3522), Box(3522, 3522)),
+  Box(Box(3523, 3523), Box(3523, 3523)),
+  Box(Box(3524, 3524), Box(3524, 3524)),
+  Box(Box(3525, 3525), Box(3525, 3525)),
+  Box(Box(3526, 3526), Box(3526, 3526)),
+  Box(Box(3527, 3527), Box(3527, 3527)),
+  Box(Box(3528, 3528), Box(3528, 3528)),
+  Box(Box(3529, 3529), Box(3529, 3529)),
+  Box(Box(3530, 3530), Box(3530, 3530)),
+  Box(Box(3531, 3531), Box(3531, 3531)),
+  Box(Box(3532, 3532), Box(3532, 3532)),
+  Box(Box(3533, 3533), Box(3533, 3533)),
+  Box(Box(3534, 3534), Box(3534, 3534)),
+  Box(Box(3535, 3535), Box(3535, 3535)),
+  Box(Box(3536, 3536), Box(3536, 3536)),
+  Box(Box(3537, 3537), Box(3537, 3537)),
+  Box(Box(3538, 3538), Box(3538, 3538)),
+  Box(Box(3539, 3539), Box(3539, 3539)),
+  Box(Box(3540, 3540), Box(3540, 3540)),
+  Box(Box(3541, 3541), Box(3541, 3541)),
+  Box(Box(3542, 3542), Box(3542, 3542)),
+  Box(Box(3543, 3543), Box(3543, 3543)),
+  Box(Box(3544, 3544), Box(3544, 3544)),
+  Box(Box(3545, 3545), Box(3545, 3545)),
+  Box(Box(3546, 3546), Box(3546, 3546)),
+  Box(Box(3547, 3547), Box(3547, 3547)),
+  Box(Box(3548, 3548), Box(3548, 3548)),
+  Box(Box(3549, 3549), Box(3549, 3549)),
+  Box(Box(3550, 3550), Box(3550, 3550)),
+  Box(Box(3551, 3551), Box(3551, 3551)),
+  Box(Box(3552, 3552), Box(3552, 3552)),
+  Box(Box(3553, 3553), Box(3553, 3553)),
+  Box(Box(3554, 3554), Box(3554, 3554)),
+  Box(Box(3555, 3555), Box(3555, 3555)),
+  Box(Box(3556, 3556), Box(3556, 3556)),
+  Box(Box(3557, 3557), Box(3557, 3557)),
+  Box(Box(3558, 3558), Box(3558, 3558)),
+  Box(Box(3559, 3559), Box(3559, 3559)),
+  Box(Box(3560, 3560), Box(3560, 3560)),
+  Box(Box(3561, 3561), Box(3561, 3561)),
+  Box(Box(3562, 3562), Box(3562, 3562)),
+  Box(Box(3563, 3563), Box(3563, 3563)),
+  Box(Box(3564, 3564), Box(3564, 3564)),
+  Box(Box(3565, 3565), Box(3565, 3565)),
+  Box(Box(3566, 3566), Box(3566, 3566)),
+  Box(Box(3567, 3567), Box(3567, 3567)),
+  Box(Box(3568, 3568), Box(3568, 3568)),
+  Box(Box(3569, 3569), Box(3569, 3569)),
+  Box(Box(3570, 3570), Box(3570, 3570)),
+  Box(Box(3571, 3571), Box(3571, 3571)),
+  Box(Box(3572, 3572), Box(3572, 3572)),
+  Box(Box(3573, 3573), Box(3573, 3573)),
+  Box(Box(3574, 3574), Box(3574, 3574)),
+  Box(Box(3575, 3575), Box(3575, 3575)),
+  Box(Box(3576, 3576), Box(3576, 3576)),
+  Box(Box(3577, 3577), Box(3577, 3577)),
+  Box(Box(3578, 3578), Box(3578, 3578)),
+  Box(Box(3579, 3579), Box(3579, 3579)),
+  Box(Box(3580, 3580), Box(3580, 3580)),
+  Box(Box(3581, 3581), Box(3581, 3581)),
+  Box(Box(3582, 3582), Box(3582, 3582)),
+  Box(Box(3583, 3583), Box(3583, 3583)),
+  Box(Box(3584, 3584), Box(3584, 3584)),
+  Box(Box(3585, 3585), Box(3585, 3585)),
+  Box(Box(3586, 3586), Box(3586, 3586)),
+  Box(Box(3587, 3587), Box(3587, 3587)),
+  Box(Box(3588, 3588), Box(3588, 3588)),
+  Box(Box(3589, 3589), Box(3589, 3589)),
+  Box(Box(3590, 3590), Box(3590, 3590)),
+  Box(Box(3591, 3591), Box(3591, 3591)),
+  Box(Box(3592, 3592), Box(3592, 3592)),
+  Box(Box(3593, 3593), Box(3593, 3593)),
+  Box(Box(3594, 3594), Box(3594, 3594)),
+  Box(Box(3595, 3595), Box(3595, 3595)),
+  Box(Box(3596, 3596), Box(3596, 3596)),
+  Box(Box(3597, 3597), Box(3597, 3597)),
+  Box(Box(3598, 3598), Box(3598, 3598)),
+  Box(Box(3599, 3599), Box(3599, 3599)),
+  Box(Box(3600, 3600), Box(3600, 3600)),
+  Box(Box(3601, 3601), Box(3601, 3601)),
+  Box(Box(3602, 3602), Box(3602, 3602)),
+  Box(Box(3603, 3603), Box(3603, 3603)),
+  Box(Box(3604, 3604), Box(3604, 3604)),
+  Box(Box(3605, 3605), Box(3605, 3605)),
+  Box(Box(3606, 3606), Box(3606, 3606)),
+  Box(Box(3607, 3607), Box(3607, 3607)),
+  Box(Box(3608, 3608), Box(3608, 3608)),
+  Box(Box(3609, 3609), Box(3609, 3609)),
+  Box(Box(3610, 3610), Box(3610, 3610)),
+  Box(Box(3611, 3611), Box(3611, 3611)),
+  Box(Box(3612, 3612), Box(3612, 3612)),
+  Box(Box(3613, 3613), Box(3613, 3613)),
+  Box(Box(3614, 3614), Box(3614, 3614)),
+  Box(Box(3615, 3615), Box(3615, 3615)),
+  Box(Box(3616, 3616), Box(3616, 3616)),
+  Box(Box(3617, 3617), Box(3617, 3617)),
+  Box(Box(3618, 3618), Box(3618, 3618)),
+  Box(Box(3619, 3619), Box(3619, 3619)),
+  Box(Box(3620, 3620), Box(3620, 3620)),
+  Box(Box(3621, 3621), Box(3621, 3621)),
+  Box(Box(3622, 3622), Box(3622, 3622)),
+  Box(Box(3623, 3623), Box(3623, 3623)),
+  Box(Box(3624, 3624), Box(3624, 3624)),
+  Box(Box(3625, 3625), Box(3625, 3625)),
+  Box(Box(3626, 3626), Box(3626, 3626)),
+  Box(Box(3627, 3627), Box(3627, 3627)),
+  Box(Box(3628, 3628), Box(3628, 3628)),
+  Box(Box(3629, 3629), Box(3629, 3629)),
+  Box(Box(3630, 3630), Box(3630, 3630)),
+  Box(Box(3631, 3631), Box(3631, 3631)),
+  Box(Box(3632, 3632), Box(3632, 3632)),
+  Box(Box(3633, 3633), Box(3633, 3633)),
+  Box(Box(3634, 3634), Box(3634, 3634)),
+  Box(Box(3635, 3635), Box(3635, 3635)),
+  Box(Box(3636, 3636), Box(3636, 3636)),
+  Box(Box(3637, 3637), Box(3637, 3637)),
+  Box(Box(3638, 3638), Box(3638, 3638)),
+  Box(Box(3639, 3639), Box(3639, 3639)),
+  Box(Box(3640, 3640), Box(3640, 3640)),
+  Box(Box(3641, 3641), Box(3641, 3641)),
+  Box(Box(3642, 3642), Box(3642, 3642)),
+  Box(Box(3643, 3643), Box(3643, 3643)),
+  Box(Box(3644, 3644), Box(3644, 3644)),
+  Box(Box(3645, 3645), Box(3645, 3645)),
+  Box(Box(3646, 3646), Box(3646, 3646)),
+  Box(Box(3647, 3647), Box(3647, 3647)),
+  Box(Box(3648, 3648), Box(3648, 3648)),
+  Box(Box(3649, 3649), Box(3649, 3649)),
+  Box(Box(3650, 3650), Box(3650, 3650)),
+  Box(Box(3651, 3651), Box(3651, 3651)),
+  Box(Box(3652, 3652), Box(3652, 3652)),
+  Box(Box(3653, 3653), Box(3653, 3653)),
+  Box(Box(3654, 3654), Box(3654, 3654)),
+  Box(Box(3655, 3655), Box(3655, 3655)),
+  Box(Box(3656, 3656), Box(3656, 3656)),
+  Box(Box(3657, 3657), Box(3657, 3657)),
+  Box(Box(3658, 3658), Box(3658, 3658)),
+  Box(Box(3659, 3659), Box(3659, 3659)),
+  Box(Box(3660, 3660), Box(3660, 3660)),
+  Box(Box(3661, 3661), Box(3661, 3661)),
+  Box(Box(3662, 3662), Box(3662, 3662)),
+  Box(Box(3663, 3663), Box(3663, 3663)),
+  Box(Box(3664, 3664), Box(3664, 3664)),
+  Box(Box(3665, 3665), Box(3665, 3665)),
+  Box(Box(3666, 3666), Box(3666, 3666)),
+  Box(Box(3667, 3667), Box(3667, 3667)),
+  Box(Box(3668, 3668), Box(3668, 3668)),
+  Box(Box(3669, 3669), Box(3669, 3669)),
+  Box(Box(3670, 3670), Box(3670, 3670)),
+  Box(Box(3671, 3671), Box(3671, 3671)),
+  Box(Box(3672, 3672), Box(3672, 3672)),
+  Box(Box(3673, 3673), Box(3673, 3673)),
+  Box(Box(3674, 3674), Box(3674, 3674)),
+  Box(Box(3675, 3675), Box(3675, 3675)),
+  Box(Box(3676, 3676), Box(3676, 3676)),
+  Box(Box(3677, 3677), Box(3677, 3677)),
+  Box(Box(3678, 3678), Box(3678, 3678)),
+  Box(Box(3679, 3679), Box(3679, 3679)),
+  Box(Box(3680, 3680), Box(3680, 3680)),
+  Box(Box(3681, 3681), Box(3681, 3681)),
+  Box(Box(3682, 3682), Box(3682, 3682)),
+  Box(Box(3683, 3683), Box(3683, 3683)),
+  Box(Box(3684, 3684), Box(3684, 3684)),
+  Box(Box(3685, 3685), Box(3685, 3685)),
+  Box(Box(3686, 3686), Box(3686, 3686)),
+  Box(Box(3687, 3687), Box(3687, 3687)),
+  Box(Box(3688, 3688), Box(3688, 3688)),
+  Box(Box(3689, 3689), Box(3689, 3689)),
+  Box(Box(3690, 3690), Box(3690, 3690)),
+  Box(Box(3691, 3691), Box(3691, 3691)),
+  Box(Box(3692, 3692), Box(3692, 3692)),
+  Box(Box(3693, 3693), Box(3693, 3693)),
+  Box(Box(3694, 3694), Box(3694, 3694)),
+  Box(Box(3695, 3695), Box(3695, 3695)),
+  Box(Box(3696, 3696), Box(3696, 3696)),
+  Box(Box(3697, 3697), Box(3697, 3697)),
+  Box(Box(3698, 3698), Box(3698, 3698)),
+  Box(Box(3699, 3699), Box(3699, 3699)),
+  Box(Box(3700, 3700), Box(3700, 3700)),
+  Box(Box(3701, 3701), Box(3701, 3701)),
+  Box(Box(3702, 3702), Box(3702, 3702)),
+  Box(Box(3703, 3703), Box(3703, 3703)),
+  Box(Box(3704, 3704), Box(3704, 3704)),
+  Box(Box(3705, 3705), Box(3705, 3705)),
+  Box(Box(3706, 3706), Box(3706, 3706)),
+  Box(Box(3707, 3707), Box(3707, 3707)),
+  Box(Box(3708, 3708), Box(3708, 3708)),
+  Box(Box(3709, 3709), Box(3709, 3709)),
+  Box(Box(3710, 3710), Box(3710, 3710)),
+  Box(Box(3711, 3711), Box(3711, 3711)),
+  Box(Box(3712, 3712), Box(3712, 3712)),
+  Box(Box(3713, 3713), Box(3713, 3713)),
+  Box(Box(3714, 3714), Box(3714, 3714)),
+  Box(Box(3715, 3715), Box(3715, 3715)),
+  Box(Box(3716, 3716), Box(3716, 3716)),
+  Box(Box(3717, 3717), Box(3717, 3717)),
+  Box(Box(3718, 3718), Box(3718, 3718)),
+  Box(Box(3719, 3719), Box(3719, 3719)),
+  Box(Box(3720, 3720), Box(3720, 3720)),
+  Box(Box(3721, 3721), Box(3721, 3721)),
+  Box(Box(3722, 3722), Box(3722, 3722)),
+  Box(Box(3723, 3723), Box(3723, 3723)),
+  Box(Box(3724, 3724), Box(3724, 3724)),
+  Box(Box(3725, 3725), Box(3725, 3725)),
+  Box(Box(3726, 3726), Box(3726, 3726)),
+  Box(Box(3727, 3727), Box(3727, 3727)),
+  Box(Box(3728, 3728), Box(3728, 3728)),
+  Box(Box(3729, 3729), Box(3729, 3729)),
+  Box(Box(3730, 3730), Box(3730, 3730)),
+  Box(Box(3731, 3731), Box(3731, 3731)),
+  Box(Box(3732, 3732), Box(3732, 3732)),
+  Box(Box(3733, 3733), Box(3733, 3733)),
+  Box(Box(3734, 3734), Box(3734, 3734)),
+  Box(Box(3735, 3735), Box(3735, 3735)),
+  Box(Box(3736, 3736), Box(3736, 3736)),
+  Box(Box(3737, 3737), Box(3737, 3737)),
+  Box(Box(3738, 3738), Box(3738, 3738)),
+  Box(Box(3739, 3739), Box(3739, 3739)),
+  Box(Box(3740, 3740), Box(3740, 3740)),
+  Box(Box(3741, 3741), Box(3741, 3741)),
+  Box(Box(3742, 3742), Box(3742, 3742)),
+  Box(Box(3743, 3743), Box(3743, 3743)),
+  Box(Box(3744, 3744), Box(3744, 3744)),
+  Box(Box(3745, 3745), Box(3745, 3745)),
+  Box(Box(3746, 3746), Box(3746, 3746)),
+  Box(Box(3747, 3747), Box(3747, 3747)),
+  Box(Box(3748, 3748), Box(3748, 3748)),
+  Box(Box(3749, 3749), Box(3749, 3749)),
+  Box(Box(3750, 3750), Box(3750, 3750)),
+  Box(Box(3751, 3751), Box(3751, 3751)),
+  Box(Box(3752, 3752), Box(3752, 3752)),
+  Box(Box(3753, 3753), Box(3753, 3753)),
+  Box(Box(3754, 3754), Box(3754, 3754)),
+  Box(Box(3755, 3755), Box(3755, 3755)),
+  Box(Box(3756, 3756), Box(3756, 3756)),
+  Box(Box(3757, 3757), Box(3757, 3757)),
+  Box(Box(3758, 3758), Box(3758, 3758)),
+  Box(Box(3759, 3759), Box(3759, 3759)),
+  Box(Box(3760, 3760), Box(3760, 3760)),
+  Box(Box(3761, 3761), Box(3761, 3761)),
+  Box(Box(3762, 3762), Box(3762, 3762)),
+  Box(Box(3763, 3763), Box(3763, 3763)),
+  Box(Box(3764, 3764), Box(3764, 3764)),
+  Box(Box(3765, 3765), Box(3765, 3765)),
+  Box(Box(3766, 3766), Box(3766, 3766)),
+  Box(Box(3767, 3767), Box(3767, 3767)),
+  Box(Box(3768, 3768), Box(3768, 3768)),
+  Box(Box(3769, 3769), Box(3769, 3769)),
+  Box(Box(3770, 3770), Box(3770, 3770)),
+  Box(Box(3771, 3771), Box(3771, 3771)),
+  Box(Box(3772, 3772), Box(3772, 3772)),
+  Box(Box(3773, 3773), Box(3773, 3773)),
+  Box(Box(3774, 3774), Box(3774, 3774)),
+  Box(Box(3775, 3775), Box(3775, 3775)),
+  Box(Box(3776, 3776), Box(3776, 3776)),
+  Box(Box(3777, 3777), Box(3777, 3777)),
+  Box(Box(3778, 3778), Box(3778, 3778)),
+  Box(Box(3779, 3779), Box(3779, 3779)),
+  Box(Box(3780, 3780), Box(3780, 3780)),
+  Box(Box(3781, 3781), Box(3781, 3781)),
+  Box(Box(3782, 3782), Box(3782, 3782)),
+  Box(Box(3783, 3783), Box(3783, 3783)),
+  Box(Box(3784, 3784), Box(3784, 3784)),
+  Box(Box(3785, 3785), Box(3785, 3785)),
+  Box(Box(3786, 3786), Box(3786, 3786)),
+  Box(Box(3787, 3787), Box(3787, 3787)),
+  Box(Box(3788, 3788), Box(3788, 3788)),
+  Box(Box(3789, 3789), Box(3789, 3789)),
+  Box(Box(3790, 3790), Box(3790, 3790)),
+  Box(Box(3791, 3791), Box(3791, 3791)),
+  Box(Box(3792, 3792), Box(3792, 3792)),
+  Box(Box(3793, 3793), Box(3793, 3793)),
+  Box(Box(3794, 3794), Box(3794, 3794)),
+  Box(Box(3795, 3795), Box(3795, 3795)),
+  Box(Box(3796, 3796), Box(3796, 3796)),
+  Box(Box(3797, 3797), Box(3797, 3797)),
+  Box(Box(3798, 3798), Box(3798, 3798)),
+  Box(Box(3799, 3799), Box(3799, 3799)),
+  Box(Box(3800, 3800), Box(3800, 3800)),
+  Box(Box(3801, 3801), Box(3801, 3801)),
+  Box(Box(3802, 3802), Box(3802, 3802)),
+  Box(Box(3803, 3803), Box(3803, 3803)),
+  Box(Box(3804, 3804), Box(3804, 3804)),
+  Box(Box(3805, 3805), Box(3805, 3805)),
+  Box(Box(3806, 3806), Box(3806, 3806)),
+  Box(Box(3807, 3807), Box(3807, 3807)),
+  Box(Box(3808, 3808), Box(3808, 3808)),
+  Box(Box(3809, 3809), Box(3809, 3809)),
+  Box(Box(3810, 3810), Box(3810, 3810)),
+  Box(Box(3811, 3811), Box(3811, 3811)),
+  Box(Box(3812, 3812), Box(3812, 3812)),
+  Box(Box(3813, 3813), Box(3813, 3813)),
+  Box(Box(3814, 3814), Box(3814, 3814)),
+  Box(Box(3815, 3815), Box(3815, 3815)),
+  Box(Box(3816, 3816), Box(3816, 3816)),
+  Box(Box(3817, 3817), Box(3817, 3817)),
+  Box(Box(3818, 3818), Box(3818, 3818)),
+  Box(Box(3819, 3819), Box(3819, 3819)),
+  Box(Box(3820, 3820), Box(3820, 3820)),
+  Box(Box(3821, 3821), Box(3821, 3821)),
+  Box(Box(3822, 3822), Box(3822, 3822)),
+  Box(Box(3823, 3823), Box(3823, 3823)),
+  Box(Box(3824, 3824), Box(3824, 3824)),
+  Box(Box(3825, 3825), Box(3825, 3825)),
+  Box(Box(3826, 3826), Box(3826, 3826)),
+  Box(Box(3827, 3827), Box(3827, 3827)),
+  Box(Box(3828, 3828), Box(3828, 3828)),
+  Box(Box(3829, 3829), Box(3829, 3829)),
+  Box(Box(3830, 3830), Box(3830, 3830)),
+  Box(Box(3831, 3831), Box(3831, 3831)),
+  Box(Box(3832, 3832), Box(3832, 3832)),
+  Box(Box(3833, 3833), Box(3833, 3833)),
+  Box(Box(3834, 3834), Box(3834, 3834)),
+  Box(Box(3835, 3835), Box(3835, 3835)),
+  Box(Box(3836, 3836), Box(3836, 3836)),
+  Box(Box(3837, 3837), Box(3837, 3837)),
+  Box(Box(3838, 3838), Box(3838, 3838)),
+  Box(Box(3839, 3839), Box(3839, 3839)),
+  Box(Box(3840, 3840), Box(3840, 3840)),
+  Box(Box(3841, 3841), Box(3841, 3841)),
+  Box(Box(3842, 3842), Box(3842, 3842)),
+  Box(Box(3843, 3843), Box(3843, 3843)),
+  Box(Box(3844, 3844), Box(3844, 3844)),
+  Box(Box(3845, 3845), Box(3845, 3845)),
+  Box(Box(3846, 3846), Box(3846, 3846)),
+  Box(Box(3847, 3847), Box(3847, 3847)),
+  Box(Box(3848, 3848), Box(3848, 3848)),
+  Box(Box(3849, 3849), Box(3849, 3849)),
+  Box(Box(3850, 3850), Box(3850, 3850)),
+  Box(Box(3851, 3851), Box(3851, 3851)),
+  Box(Box(3852, 3852), Box(3852, 3852)),
+  Box(Box(3853, 3853), Box(3853, 3853)),
+  Box(Box(3854, 3854), Box(3854, 3854)),
+  Box(Box(3855, 3855), Box(3855, 3855)),
+  Box(Box(3856, 3856), Box(3856, 3856)),
+  Box(Box(3857, 3857), Box(3857, 3857)),
+  Box(Box(3858, 3858), Box(3858, 3858)),
+  Box(Box(3859, 3859), Box(3859, 3859)),
+  Box(Box(3860, 3860), Box(3860, 3860)),
+  Box(Box(3861, 3861), Box(3861, 3861)),
+  Box(Box(3862, 3862), Box(3862, 3862)),
+  Box(Box(3863, 3863), Box(3863, 3863)),
+  Box(Box(3864, 3864), Box(3864, 3864)),
+  Box(Box(3865, 3865), Box(3865, 3865)),
+  Box(Box(3866, 3866), Box(3866, 3866)),
+  Box(Box(3867, 3867), Box(3867, 3867)),
+  Box(Box(3868, 3868), Box(3868, 3868)),
+  Box(Box(3869, 3869), Box(3869, 3869)),
+  Box(Box(3870, 3870), Box(3870, 3870)),
+  Box(Box(3871, 3871), Box(3871, 3871)),
+  Box(Box(3872, 3872), Box(3872, 3872)),
+  Box(Box(3873, 3873), Box(3873, 3873)),
+  Box(Box(3874, 3874), Box(3874, 3874)),
+  Box(Box(3875, 3875), Box(3875, 3875)),
+  Box(Box(3876, 3876), Box(3876, 3876)),
+  Box(Box(3877, 3877), Box(3877, 3877)),
+  Box(Box(3878, 3878), Box(3878, 3878)),
+  Box(Box(3879, 3879), Box(3879, 3879)),
+  Box(Box(3880, 3880), Box(3880, 3880)),
+  Box(Box(3881, 3881), Box(3881, 3881)),
+  Box(Box(3882, 3882), Box(3882, 3882)),
+  Box(Box(3883, 3883), Box(3883, 3883)),
+  Box(Box(3884, 3884), Box(3884, 3884)),
+  Box(Box(3885, 3885), Box(3885, 3885)),
+  Box(Box(3886, 3886), Box(3886, 3886)),
+  Box(Box(3887, 3887), Box(3887, 3887)),
+  Box(Box(3888, 3888), Box(3888, 3888)),
+  Box(Box(3889, 3889), Box(3889, 3889)),
+  Box(Box(3890, 3890), Box(3890, 3890)),
+  Box(Box(3891, 3891), Box(3891, 3891)),
+  Box(Box(3892, 3892), Box(3892, 3892)),
+  Box(Box(3893, 3893), Box(3893, 3893)),
+  Box(Box(3894, 3894), Box(3894, 3894)),
+  Box(Box(3895, 3895), Box(3895, 3895)),
+  Box(Box(3896, 3896), Box(3896, 3896)),
+  Box(Box(3897, 3897), Box(3897, 3897)),
+  Box(Box(3898, 3898), Box(3898, 3898)),
+  Box(Box(3899, 3899), Box(3899, 3899)),
+  Box(Box(3900, 3900), Box(3900, 3900)),
+  Box(Box(3901, 3901), Box(3901, 3901)),
+  Box(Box(3902, 3902), Box(3902, 3902)),
+  Box(Box(3903, 3903), Box(3903, 3903)),
+  Box(Box(3904, 3904), Box(3904, 3904)),
+  Box(Box(3905, 3905), Box(3905, 3905)),
+  Box(Box(3906, 3906), Box(3906, 3906)),
+  Box(Box(3907, 3907), Box(3907, 3907)),
+  Box(Box(3908, 3908), Box(3908, 3908)),
+  Box(Box(3909, 3909), Box(3909, 3909)),
+  Box(Box(3910, 3910), Box(3910, 3910)),
+  Box(Box(3911, 3911), Box(3911, 3911)),
+  Box(Box(3912, 3912), Box(3912, 3912)),
+  Box(Box(3913, 3913), Box(3913, 3913)),
+  Box(Box(3914, 3914), Box(3914, 3914)),
+  Box(Box(3915, 3915), Box(3915, 3915)),
+  Box(Box(3916, 3916), Box(3916, 3916)),
+  Box(Box(3917, 3917), Box(3917, 3917)),
+  Box(Box(3918, 3918), Box(3918, 3918)),
+  Box(Box(3919, 3919), Box(3919, 3919)),
+  Box(Box(3920, 3920), Box(3920, 3920)),
+  Box(Box(3921, 3921), Box(3921, 3921)),
+  Box(Box(3922, 3922), Box(3922, 3922)),
+  Box(Box(3923, 3923), Box(3923, 3923)),
+  Box(Box(3924, 3924), Box(3924, 3924)),
+  Box(Box(3925, 3925), Box(3925, 3925)),
+  Box(Box(3926, 3926), Box(3926, 3926)),
+  Box(Box(3927, 3927), Box(3927, 3927)),
+  Box(Box(3928, 3928), Box(3928, 3928)),
+  Box(Box(3929, 3929), Box(3929, 3929)),
+  Box(Box(3930, 3930), Box(3930, 3930)),
+  Box(Box(3931, 3931), Box(3931, 3931)),
+  Box(Box(3932, 3932), Box(3932, 3932)),
+  Box(Box(3933, 3933), Box(3933, 3933)),
+  Box(Box(3934, 3934), Box(3934, 3934)),
+  Box(Box(3935, 3935), Box(3935, 3935)),
+  Box(Box(3936, 3936), Box(3936, 3936)),
+  Box(Box(3937, 3937), Box(3937, 3937)),
+  Box(Box(3938, 3938), Box(3938, 3938)),
+  Box(Box(3939, 3939), Box(3939, 3939)),
+  Box(Box(3940, 3940), Box(3940, 3940)),
+  Box(Box(3941, 3941), Box(3941, 3941)),
+  Box(Box(3942, 3942), Box(3942, 3942)),
+  Box(Box(3943, 3943), Box(3943, 3943)),
+  Box(Box(3944, 3944), Box(3944, 3944)),
+  Box(Box(3945, 3945), Box(3945, 3945)),
+  Box(Box(3946, 3946), Box(3946, 3946)),
+  Box(Box(3947, 3947), Box(3947, 3947)),
+  Box(Box(3948, 3948), Box(3948, 3948)),
+  Box(Box(3949, 3949), Box(3949, 3949)),
+  Box(Box(3950, 3950), Box(3950, 3950)),
+  Box(Box(3951, 3951), Box(3951, 3951)),
+  Box(Box(3952, 3952), Box(3952, 3952)),
+  Box(Box(3953, 3953), Box(3953, 3953)),
+  Box(Box(3954, 3954), Box(3954, 3954)),
+  Box(Box(3955, 3955), Box(3955, 3955)),
+  Box(Box(3956, 3956), Box(3956, 3956)),
+  Box(Box(3957, 3957), Box(3957, 3957)),
+  Box(Box(3958, 3958), Box(3958, 3958)),
+  Box(Box(3959, 3959), Box(3959, 3959)),
+  Box(Box(3960, 3960), Box(3960, 3960)),
+  Box(Box(3961, 3961), Box(3961, 3961)),
+  Box(Box(3962, 3962), Box(3962, 3962)),
+  Box(Box(3963, 3963), Box(3963, 3963)),
+  Box(Box(3964, 3964), Box(3964, 3964)),
+  Box(Box(3965, 3965), Box(3965, 3965)),
+  Box(Box(3966, 3966), Box(3966, 3966)),
+  Box(Box(3967, 3967), Box(3967, 3967)),
+  Box(Box(3968, 3968), Box(3968, 3968)),
+  Box(Box(3969, 3969), Box(3969, 3969)),
+  Box(Box(3970, 3970), Box(3970, 3970)),
+  Box(Box(3971, 3971), Box(3971, 3971)),
+  Box(Box(3972, 3972), Box(3972, 3972)),
+  Box(Box(3973, 3973), Box(3973, 3973)),
+  Box(Box(3974, 3974), Box(3974, 3974)),
+  Box(Box(3975, 3975), Box(3975, 3975)),
+  Box(Box(3976, 3976), Box(3976, 3976)),
+  Box(Box(3977, 3977), Box(3977, 3977)),
+  Box(Box(3978, 3978), Box(3978, 3978)),
+  Box(Box(3979, 3979), Box(3979, 3979)),
+  Box(Box(3980, 3980), Box(3980, 3980)),
+  Box(Box(3981, 3981), Box(3981, 3981)),
+  Box(Box(3982, 3982), Box(3982, 3982)),
+  Box(Box(3983, 3983), Box(3983, 3983)),
+  Box(Box(3984, 3984), Box(3984, 3984)),
+  Box(Box(3985, 3985), Box(3985, 3985)),
+  Box(Box(3986, 3986), Box(3986, 3986)),
+  Box(Box(3987, 3987), Box(3987, 3987)),
+  Box(Box(3988, 3988), Box(3988, 3988)),
+  Box(Box(3989, 3989), Box(3989, 3989)),
+  Box(Box(3990, 3990), Box(3990, 3990)),
+  Box(Box(3991, 3991), Box(3991, 3991)),
+  Box(Box(3992, 3992), Box(3992, 3992)),
+  Box(Box(3993, 3993), Box(3993, 3993)),
+  Box(Box(3994, 3994), Box(3994, 3994)),
+  Box(Box(3995, 3995), Box(3995, 3995)),
+  Box(Box(3996, 3996), Box(3996, 3996)),
+  Box(Box(3997, 3997), Box(3997, 3997)),
+  Box(Box(3998, 3998), Box(3998, 3998)),
+  Box(Box(3999, 3999), Box(3999, 3999)),
+  Box(Box(4000, 4000), Box(4000, 4000)),
+  Box(Box(4001, 4001), Box(4001, 4001)),
+  Box(Box(4002, 4002), Box(4002, 4002)),
+  Box(Box(4003, 4003), Box(4003, 4003)),
+  Box(Box(4004, 4004), Box(4004, 4004)),
+  Box(Box(4005, 4005), Box(4005, 4005)),
+  Box(Box(4006, 4006), Box(4006, 4006)),
+  Box(Box(4007, 4007), Box(4007, 4007)),
+  Box(Box(4008, 4008), Box(4008, 4008)),
+  Box(Box(4009, 4009), Box(4009, 4009)),
+  Box(Box(4010, 4010), Box(4010, 4010)),
+  Box(Box(4011, 4011), Box(4011, 4011)),
+  Box(Box(4012, 4012), Box(4012, 4012)),
+  Box(Box(4013, 4013), Box(4013, 4013)),
+  Box(Box(4014, 4014), Box(4014, 4014)),
+  Box(Box(4015, 4015), Box(4015, 4015)),
+  Box(Box(4016, 4016), Box(4016, 4016)),
+  Box(Box(4017, 4017), Box(4017, 4017)),
+  Box(Box(4018, 4018), Box(4018, 4018)),
+  Box(Box(4019, 4019), Box(4019, 4019)),
+  Box(Box(4020, 4020), Box(4020, 4020)),
+  Box(Box(4021, 4021), Box(4021, 4021)),
+  Box(Box(4022, 4022), Box(4022, 4022)),
+  Box(Box(4023, 4023), Box(4023, 4023)),
+  Box(Box(4024, 4024), Box(4024, 4024)),
+  Box(Box(4025, 4025), Box(4025, 4025)),
+  Box(Box(4026, 4026), Box(4026, 4026)),
+  Box(Box(4027, 4027), Box(4027, 4027)),
+  Box(Box(4028, 4028), Box(4028, 4028)),
+  Box(Box(4029, 4029), Box(4029, 4029)),
+  Box(Box(4030, 4030), Box(4030, 4030)),
+  Box(Box(4031, 4031), Box(4031, 4031)),
+  Box(Box(4032, 4032), Box(4032, 4032)),
+  Box(Box(4033, 4033), Box(4033, 4033)),
+  Box(Box(4034, 4034), Box(4034, 4034)),
+  Box(Box(4035, 4035), Box(4035, 4035)),
+  Box(Box(4036, 4036), Box(4036, 4036)),
+  Box(Box(4037, 4037), Box(4037, 4037)),
+  Box(Box(4038, 4038), Box(4038, 4038)),
+  Box(Box(4039, 4039), Box(4039, 4039)),
+  Box(Box(4040, 4040), Box(4040, 4040)),
+  Box(Box(4041, 4041), Box(4041, 4041)),
+  Box(Box(4042, 4042), Box(4042, 4042)),
+  Box(Box(4043, 4043), Box(4043, 4043)),
+  Box(Box(4044, 4044), Box(4044, 4044)),
+  Box(Box(4045, 4045), Box(4045, 4045)),
+  Box(Box(4046, 4046), Box(4046, 4046)),
+  Box(Box(4047, 4047), Box(4047, 4047)),
+  Box(Box(4048, 4048), Box(4048, 4048)),
+  Box(Box(4049, 4049), Box(4049, 4049)),
+  Box(Box(4050, 4050), Box(4050, 4050)),
+  Box(Box(4051, 4051), Box(4051, 4051)),
+  Box(Box(4052, 4052), Box(4052, 4052)),
+  Box(Box(4053, 4053), Box(4053, 4053)),
+  Box(Box(4054, 4054), Box(4054, 4054)),
+  Box(Box(4055, 4055), Box(4055, 4055)),
+  Box(Box(4056, 4056), Box(4056, 4056)),
+  Box(Box(4057, 4057), Box(4057, 4057)),
+  Box(Box(4058, 4058), Box(4058, 4058)),
+  Box(Box(4059, 4059), Box(4059, 4059)),
+  Box(Box(4060, 4060), Box(4060, 4060)),
+  Box(Box(4061, 4061), Box(4061, 4061)),
+  Box(Box(4062, 4062), Box(4062, 4062)),
+  Box(Box(4063, 4063), Box(4063, 4063)),
+  Box(Box(4064, 4064), Box(4064, 4064)),
+  Box(Box(4065, 4065), Box(4065, 4065)),
+  Box(Box(4066, 4066), Box(4066, 4066)),
+  Box(Box(4067, 4067), Box(4067, 4067)),
+  Box(Box(4068, 4068), Box(4068, 4068)),
+  Box(Box(4069, 4069), Box(4069, 4069)),
+  Box(Box(4070, 4070), Box(4070, 4070)),
+  Box(Box(4071, 4071), Box(4071, 4071)),
+  Box(Box(4072, 4072), Box(4072, 4072)),
+  Box(Box(4073, 4073), Box(4073, 4073)),
+  Box(Box(4074, 4074), Box(4074, 4074)),
+  Box(Box(4075, 4075), Box(4075, 4075)),
+  Box(Box(4076, 4076), Box(4076, 4076)),
+  Box(Box(4077, 4077), Box(4077, 4077)),
+  Box(Box(4078, 4078), Box(4078, 4078)),
+  Box(Box(4079, 4079), Box(4079, 4079)),
+  Box(Box(4080, 4080), Box(4080, 4080)),
+  Box(Box(4081, 4081), Box(4081, 4081)),
+  Box(Box(4082, 4082), Box(4082, 4082)),
+  Box(Box(4083, 4083), Box(4083, 4083)),
+  Box(Box(4084, 4084), Box(4084, 4084)),
+  Box(Box(4085, 4085), Box(4085, 4085)),
+  Box(Box(4086, 4086), Box(4086, 4086)),
+  Box(Box(4087, 4087), Box(4087, 4087)),
+  Box(Box(4088, 4088), Box(4088, 4088)),
+  Box(Box(4089, 4089), Box(4089, 4089)),
+  Box(Box(4090, 4090), Box(4090, 4090)),
+  Box(Box(4091, 4091), Box(4091, 4091)),
+  Box(Box(4092, 4092), Box(4092, 4092)),
+  Box(Box(4093, 4093), Box(4093, 4093)),
+  Box(Box(4094, 4094), Box(4094, 4094)),
+  Box(Box(4095, 4095), Box(4095, 4095)),
+  Box(Box(4096, 4096), Box(4096, 4096)),
+  Box(Box(4097, 4097), Box(4097, 4097)),
+  Box(Box(4098, 4098), Box(4098, 4098)),
+  Box(Box(4099, 4099), Box(4099, 4099)),
+  Box(Box(4100, 4100), Box(4100, 4100)),
+  Box(Box(4101, 4101), Box(4101, 4101)),
+  Box(Box(4102, 4102), Box(4102, 4102)),
+  Box(Box(4103, 4103), Box(4103, 4103)),
+  Box(Box(4104, 4104), Box(4104, 4104)),
+  Box(Box(4105, 4105), Box(4105, 4105)),
+  Box(Box(4106, 4106), Box(4106, 4106)),
+  Box(Box(4107, 4107), Box(4107, 4107)),
+  Box(Box(4108, 4108), Box(4108, 4108)),
+  Box(Box(4109, 4109), Box(4109, 4109)),
+  Box(Box(4110, 4110), Box(4110, 4110)),
+  Box(Box(4111, 4111), Box(4111, 4111)),
+  Box(Box(4112, 4112), Box(4112, 4112)),
+  Box(Box(4113, 4113), Box(4113, 4113)),
+  Box(Box(4114, 4114), Box(4114, 4114)),
+  Box(Box(4115, 4115), Box(4115, 4115)),
+  Box(Box(4116, 4116), Box(4116, 4116)),
+  Box(Box(4117, 4117), Box(4117, 4117)),
+  Box(Box(4118, 4118), Box(4118, 4118)),
+  Box(Box(4119, 4119), Box(4119, 4119)),
+  Box(Box(4120, 4120), Box(4120, 4120)),
+  Box(Box(4121, 4121), Box(4121, 4121)),
+  Box(Box(4122, 4122), Box(4122, 4122)),
+  Box(Box(4123, 4123), Box(4123, 4123)),
+  Box(Box(4124, 4124), Box(4124, 4124)),
+  Box(Box(4125, 4125), Box(4125, 4125)),
+  Box(Box(4126, 4126), Box(4126, 4126)),
+  Box(Box(4127, 4127), Box(4127, 4127)),
+  Box(Box(4128, 4128), Box(4128, 4128)),
+  Box(Box(4129, 4129), Box(4129, 4129)),
+  Box(Box(4130, 4130), Box(4130, 4130)),
+  Box(Box(4131, 4131), Box(4131, 4131)),
+  Box(Box(4132, 4132), Box(4132, 4132)),
+  Box(Box(4133, 4133), Box(4133, 4133)),
+  Box(Box(4134, 4134), Box(4134, 4134)),
+  Box(Box(4135, 4135), Box(4135, 4135)),
+  Box(Box(4136, 4136), Box(4136, 4136)),
+  Box(Box(4137, 4137), Box(4137, 4137)),
+  Box(Box(4138, 4138), Box(4138, 4138)),
+  Box(Box(4139, 4139), Box(4139, 4139)),
+  Box(Box(4140, 4140), Box(4140, 4140)),
+  Box(Box(4141, 4141), Box(4141, 4141)),
+  Box(Box(4142, 4142), Box(4142, 4142)),
+  Box(Box(4143, 4143), Box(4143, 4143)),
+  Box(Box(4144, 4144), Box(4144, 4144)),
+  Box(Box(4145, 4145), Box(4145, 4145)),
+  Box(Box(4146, 4146), Box(4146, 4146)),
+  Box(Box(4147, 4147), Box(4147, 4147)),
+  Box(Box(4148, 4148), Box(4148, 4148)),
+  Box(Box(4149, 4149), Box(4149, 4149)),
+  Box(Box(4150, 4150), Box(4150, 4150)),
+  Box(Box(4151, 4151), Box(4151, 4151)),
+  Box(Box(4152, 4152), Box(4152, 4152)),
+  Box(Box(4153, 4153), Box(4153, 4153)),
+  Box(Box(4154, 4154), Box(4154, 4154)),
+  Box(Box(4155, 4155), Box(4155, 4155)),
+  Box(Box(4156, 4156), Box(4156, 4156)),
+  Box(Box(4157, 4157), Box(4157, 4157)),
+  Box(Box(4158, 4158), Box(4158, 4158)),
+  Box(Box(4159, 4159), Box(4159, 4159)),
+  Box(Box(4160, 4160), Box(4160, 4160)),
+  Box(Box(4161, 4161), Box(4161, 4161)),
+  Box(Box(4162, 4162), Box(4162, 4162)),
+  Box(Box(4163, 4163), Box(4163, 4163)),
+  Box(Box(4164, 4164), Box(4164, 4164)),
+  Box(Box(4165, 4165), Box(4165, 4165)),
+  Box(Box(4166, 4166), Box(4166, 4166)),
+  Box(Box(4167, 4167), Box(4167, 4167)),
+  Box(Box(4168, 4168), Box(4168, 4168)),
+  Box(Box(4169, 4169), Box(4169, 4169)),
+  Box(Box(4170, 4170), Box(4170, 4170)),
+  Box(Box(4171, 4171), Box(4171, 4171)),
+  Box(Box(4172, 4172), Box(4172, 4172)),
+  Box(Box(4173, 4173), Box(4173, 4173)),
+  Box(Box(4174, 4174), Box(4174, 4174)),
+  Box(Box(4175, 4175), Box(4175, 4175)),
+  Box(Box(4176, 4176), Box(4176, 4176)),
+  Box(Box(4177, 4177), Box(4177, 4177)),
+  Box(Box(4178, 4178), Box(4178, 4178)),
+  Box(Box(4179, 4179), Box(4179, 4179)),
+  Box(Box(4180, 4180), Box(4180, 4180)),
+  Box(Box(4181, 4181), Box(4181, 4181)),
+  Box(Box(4182, 4182), Box(4182, 4182)),
+  Box(Box(4183, 4183), Box(4183, 4183)),
+  Box(Box(4184, 4184), Box(4184, 4184)),
+  Box(Box(4185, 4185), Box(4185, 4185)),
+  Box(Box(4186, 4186), Box(4186, 4186)),
+  Box(Box(4187, 4187), Box(4187, 4187)),
+  Box(Box(4188, 4188), Box(4188, 4188)),
+  Box(Box(4189, 4189), Box(4189, 4189)),
+  Box(Box(4190, 4190), Box(4190, 4190)),
+  Box(Box(4191, 4191), Box(4191, 4191)),
+  Box(Box(4192, 4192), Box(4192, 4192)),
+  Box(Box(4193, 4193), Box(4193, 4193)),
+  Box(Box(4194, 4194), Box(4194, 4194)),
+  Box(Box(4195, 4195), Box(4195, 4195)),
+  Box(Box(4196, 4196), Box(4196, 4196)),
+  Box(Box(4197, 4197), Box(4197, 4197)),
+  Box(Box(4198, 4198), Box(4198, 4198)),
+  Box(Box(4199, 4199), Box(4199, 4199)),
+  Box(Box(4200, 4200), Box(4200, 4200)),
+  Box(Box(4201, 4201), Box(4201, 4201)),
+  Box(Box(4202, 4202), Box(4202, 4202)),
+  Box(Box(4203, 4203), Box(4203, 4203)),
+  Box(Box(4204, 4204), Box(4204, 4204)),
+  Box(Box(4205, 4205), Box(4205, 4205)),
+  Box(Box(4206, 4206), Box(4206, 4206)),
+  Box(Box(4207, 4207), Box(4207, 4207)),
+  Box(Box(4208, 4208), Box(4208, 4208)),
+  Box(Box(4209, 4209), Box(4209, 4209)),
+  Box(Box(4210, 4210), Box(4210, 4210)),
+  Box(Box(4211, 4211), Box(4211, 4211)),
+  Box(Box(4212, 4212), Box(4212, 4212)),
+  Box(Box(4213, 4213), Box(4213, 4213)),
+  Box(Box(4214, 4214), Box(4214, 4214)),
+  Box(Box(4215, 4215), Box(4215, 4215)),
+  Box(Box(4216, 4216), Box(4216, 4216)),
+  Box(Box(4217, 4217), Box(4217, 4217)),
+  Box(Box(4218, 4218), Box(4218, 4218)),
+  Box(Box(4219, 4219), Box(4219, 4219)),
+  Box(Box(4220, 4220), Box(4220, 4220)),
+  Box(Box(4221, 4221), Box(4221, 4221)),
+  Box(Box(4222, 4222), Box(4222, 4222)),
+  Box(Box(4223, 4223), Box(4223, 4223)),
+  Box(Box(4224, 4224), Box(4224, 4224)),
+  Box(Box(4225, 4225), Box(4225, 4225)),
+  Box(Box(4226, 4226), Box(4226, 4226)),
+  Box(Box(4227, 4227), Box(4227, 4227)),
+  Box(Box(4228, 4228), Box(4228, 4228)),
+  Box(Box(4229, 4229), Box(4229, 4229)),
+  Box(Box(4230, 4230), Box(4230, 4230)),
+  Box(Box(4231, 4231), Box(4231, 4231)),
+  Box(Box(4232, 4232), Box(4232, 4232)),
+  Box(Box(4233, 4233), Box(4233, 4233)),
+  Box(Box(4234, 4234), Box(4234, 4234)),
+  Box(Box(4235, 4235), Box(4235, 4235)),
+  Box(Box(4236, 4236), Box(4236, 4236)),
+  Box(Box(4237, 4237), Box(4237, 4237)),
+  Box(Box(4238, 4238), Box(4238, 4238)),
+  Box(Box(4239, 4239), Box(4239, 4239)),
+  Box(Box(4240, 4240), Box(4240, 4240)),
+  Box(Box(4241, 4241), Box(4241, 4241)),
+  Box(Box(4242, 4242), Box(4242, 4242)),
+  Box(Box(4243, 4243), Box(4243, 4243)),
+  Box(Box(4244, 4244), Box(4244, 4244)),
+  Box(Box(4245, 4245), Box(4245, 4245)),
+  Box(Box(4246, 4246), Box(4246, 4246)),
+  Box(Box(4247, 4247), Box(4247, 4247)),
+  Box(Box(4248, 4248), Box(4248, 4248)),
+  Box(Box(4249, 4249), Box(4249, 4249)),
+  Box(Box(4250, 4250), Box(4250, 4250)),
+  Box(Box(4251, 4251), Box(4251, 4251)),
+  Box(Box(4252, 4252), Box(4252, 4252)),
+  Box(Box(4253, 4253), Box(4253, 4253)),
+  Box(Box(4254, 4254), Box(4254, 4254)),
+  Box(Box(4255, 4255), Box(4255, 4255)),
+  Box(Box(4256, 4256), Box(4256, 4256)),
+  Box(Box(4257, 4257), Box(4257, 4257)),
+  Box(Box(4258, 4258), Box(4258, 4258)),
+  Box(Box(4259, 4259), Box(4259, 4259)),
+  Box(Box(4260, 4260), Box(4260, 4260)),
+  Box(Box(4261, 4261), Box(4261, 4261)),
+  Box(Box(4262, 4262), Box(4262, 4262)),
+  Box(Box(4263, 4263), Box(4263, 4263)),
+  Box(Box(4264, 4264), Box(4264, 4264)),
+  Box(Box(4265, 4265), Box(4265, 4265)),
+  Box(Box(4266, 4266), Box(4266, 4266)),
+  Box(Box(4267, 4267), Box(4267, 4267)),
+  Box(Box(4268, 4268), Box(4268, 4268)),
+  Box(Box(4269, 4269), Box(4269, 4269)),
+  Box(Box(4270, 4270), Box(4270, 4270)),
+  Box(Box(4271, 4271), Box(4271, 4271)),
+  Box(Box(4272, 4272), Box(4272, 4272)),
+  Box(Box(4273, 4273), Box(4273, 4273)),
+  Box(Box(4274, 4274), Box(4274, 4274)),
+  Box(Box(4275, 4275), Box(4275, 4275)),
+  Box(Box(4276, 4276), Box(4276, 4276)),
+  Box(Box(4277, 4277), Box(4277, 4277)),
+  Box(Box(4278, 4278), Box(4278, 4278)),
+  Box(Box(4279, 4279), Box(4279, 4279)),
+  Box(Box(4280, 4280), Box(4280, 4280)),
+  Box(Box(4281, 4281), Box(4281, 4281)),
+  Box(Box(4282, 4282), Box(4282, 4282)),
+  Box(Box(4283, 4283), Box(4283, 4283)),
+  Box(Box(4284, 4284), Box(4284, 4284)),
+  Box(Box(4285, 4285), Box(4285, 4285)),
+  Box(Box(4286, 4286), Box(4286, 4286)),
+  Box(Box(4287, 4287), Box(4287, 4287)),
+  Box(Box(4288, 4288), Box(4288, 4288)),
+  Box(Box(4289, 4289), Box(4289, 4289)),
+  Box(Box(4290, 4290), Box(4290, 4290)),
+  Box(Box(4291, 4291), Box(4291, 4291)),
+  Box(Box(4292, 4292), Box(4292, 4292)),
+  Box(Box(4293, 4293), Box(4293, 4293)),
+  Box(Box(4294, 4294), Box(4294, 4294)),
+  Box(Box(4295, 4295), Box(4295, 4295)),
+  Box(Box(4296, 4296), Box(4296, 4296)),
+  Box(Box(4297, 4297), Box(4297, 4297)),
+  Box(Box(4298, 4298), Box(4298, 4298)),
+  Box(Box(4299, 4299), Box(4299, 4299)),
+  Box(Box(4300, 4300), Box(4300, 4300)),
+  Box(Box(4301, 4301), Box(4301, 4301)),
+  Box(Box(4302, 4302), Box(4302, 4302)),
+  Box(Box(4303, 4303), Box(4303, 4303)),
+  Box(Box(4304, 4304), Box(4304, 4304)),
+  Box(Box(4305, 4305), Box(4305, 4305)),
+  Box(Box(4306, 4306), Box(4306, 4306)),
+  Box(Box(4307, 4307), Box(4307, 4307)),
+  Box(Box(4308, 4308), Box(4308, 4308)),
+  Box(Box(4309, 4309), Box(4309, 4309)),
+  Box(Box(4310, 4310), Box(4310, 4310)),
+  Box(Box(4311, 4311), Box(4311, 4311)),
+  Box(Box(4312, 4312), Box(4312, 4312)),
+  Box(Box(4313, 4313), Box(4313, 4313)),
+  Box(Box(4314, 4314), Box(4314, 4314)),
+  Box(Box(4315, 4315), Box(4315, 4315)),
+  Box(Box(4316, 4316), Box(4316, 4316)),
+  Box(Box(4317, 4317), Box(4317, 4317)),
+  Box(Box(4318, 4318), Box(4318, 4318)),
+  Box(Box(4319, 4319), Box(4319, 4319)),
+  Box(Box(4320, 4320), Box(4320, 4320)),
+  Box(Box(4321, 4321), Box(4321, 4321)),
+  Box(Box(4322, 4322), Box(4322, 4322)),
+  Box(Box(4323, 4323), Box(4323, 4323)),
+  Box(Box(4324, 4324), Box(4324, 4324)),
+  Box(Box(4325, 4325), Box(4325, 4325)),
+  Box(Box(4326, 4326), Box(4326, 4326)),
+  Box(Box(4327, 4327), Box(4327, 4327)),
+  Box(Box(4328, 4328), Box(4328, 4328)),
+  Box(Box(4329, 4329), Box(4329, 4329)),
+  Box(Box(4330, 4330), Box(4330, 4330)),
+  Box(Box(4331, 4331), Box(4331, 4331)),
+  Box(Box(4332, 4332), Box(4332, 4332)),
+  Box(Box(4333, 4333), Box(4333, 4333)),
+  Box(Box(4334, 4334), Box(4334, 4334)),
+  Box(Box(4335, 4335), Box(4335, 4335)),
+  Box(Box(4336, 4336), Box(4336, 4336)),
+  Box(Box(4337, 4337), Box(4337, 4337)),
+  Box(Box(4338, 4338), Box(4338, 4338)),
+  Box(Box(4339, 4339), Box(4339, 4339)),
+  Box(Box(4340, 4340), Box(4340, 4340)),
+  Box(Box(4341, 4341), Box(4341, 4341)),
+  Box(Box(4342, 4342), Box(4342, 4342)),
+  Box(Box(4343, 4343), Box(4343, 4343)),
+  Box(Box(4344, 4344), Box(4344, 4344)),
+  Box(Box(4345, 4345), Box(4345, 4345)),
+  Box(Box(4346, 4346), Box(4346, 4346)),
+  Box(Box(4347, 4347), Box(4347, 4347)),
+  Box(Box(4348, 4348), Box(4348, 4348)),
+  Box(Box(4349, 4349), Box(4349, 4349)),
+  Box(Box(4350, 4350), Box(4350, 4350)),
+  Box(Box(4351, 4351), Box(4351, 4351)),
+  Box(Box(4352, 4352), Box(4352, 4352)),
+  Box(Box(4353, 4353), Box(4353, 4353)),
+  Box(Box(4354, 4354), Box(4354, 4354)),
+  Box(Box(4355, 4355), Box(4355, 4355)),
+  Box(Box(4356, 4356), Box(4356, 4356)),
+  Box(Box(4357, 4357), Box(4357, 4357)),
+  Box(Box(4358, 4358), Box(4358, 4358)),
+  Box(Box(4359, 4359), Box(4359, 4359)),
+  Box(Box(4360, 4360), Box(4360, 4360)),
+  Box(Box(4361, 4361), Box(4361, 4361)),
+  Box(Box(4362, 4362), Box(4362, 4362)),
+  Box(Box(4363, 4363), Box(4363, 4363)),
+  Box(Box(4364, 4364), Box(4364, 4364)),
+  Box(Box(4365, 4365), Box(4365, 4365)),
+  Box(Box(4366, 4366), Box(4366, 4366)),
+  Box(Box(4367, 4367), Box(4367, 4367)),
+  Box(Box(4368, 4368), Box(4368, 4368)),
+  Box(Box(4369, 4369), Box(4369, 4369)),
+  Box(Box(4370, 4370), Box(4370, 4370)),
+  Box(Box(4371, 4371), Box(4371, 4371)),
+  Box(Box(4372, 4372), Box(4372, 4372)),
+  Box(Box(4373, 4373), Box(4373, 4373)),
+  Box(Box(4374, 4374), Box(4374, 4374)),
+  Box(Box(4375, 4375), Box(4375, 4375)),
+  Box(Box(4376, 4376), Box(4376, 4376)),
+  Box(Box(4377, 4377), Box(4377, 4377)),
+  Box(Box(4378, 4378), Box(4378, 4378)),
+  Box(Box(4379, 4379), Box(4379, 4379)),
+  Box(Box(4380, 4380), Box(4380, 4380)),
+  Box(Box(4381, 4381), Box(4381, 4381)),
+  Box(Box(4382, 4382), Box(4382, 4382)),
+  Box(Box(4383, 4383), Box(4383, 4383)),
+  Box(Box(4384, 4384), Box(4384, 4384)),
+  Box(Box(4385, 4385), Box(4385, 4385)),
+  Box(Box(4386, 4386), Box(4386, 4386)),
+  Box(Box(4387, 4387), Box(4387, 4387)),
+  Box(Box(4388, 4388), Box(4388, 4388)),
+  Box(Box(4389, 4389), Box(4389, 4389)),
+  Box(Box(4390, 4390), Box(4390, 4390)),
+  Box(Box(4391, 4391), Box(4391, 4391)),
+  Box(Box(4392, 4392), Box(4392, 4392)),
+  Box(Box(4393, 4393), Box(4393, 4393)),
+  Box(Box(4394, 4394), Box(4394, 4394)),
+  Box(Box(4395, 4395), Box(4395, 4395)),
+  Box(Box(4396, 4396), Box(4396, 4396)),
+  Box(Box(4397, 4397), Box(4397, 4397)),
+  Box(Box(4398, 4398), Box(4398, 4398)),
+  Box(Box(4399, 4399), Box(4399, 4399)),
+  Box(Box(4400, 4400), Box(4400, 4400)),
+  Box(Box(4401, 4401), Box(4401, 4401)),
+  Box(Box(4402, 4402), Box(4402, 4402)),
+  Box(Box(4403, 4403), Box(4403, 4403)),
+  Box(Box(4404, 4404), Box(4404, 4404)),
+  Box(Box(4405, 4405), Box(4405, 4405)),
+  Box(Box(4406, 4406), Box(4406, 4406)),
+  Box(Box(4407, 4407), Box(4407, 4407)),
+  Box(Box(4408, 4408), Box(4408, 4408)),
+  Box(Box(4409, 4409), Box(4409, 4409)),
+  Box(Box(4410, 4410), Box(4410, 4410)),
+  Box(Box(4411, 4411), Box(4411, 4411)),
+  Box(Box(4412, 4412), Box(4412, 4412)),
+  Box(Box(4413, 4413), Box(4413, 4413)),
+  Box(Box(4414, 4414), Box(4414, 4414)),
+  Box(Box(4415, 4415), Box(4415, 4415)),
+  Box(Box(4416, 4416), Box(4416, 4416)),
+  Box(Box(4417, 4417), Box(4417, 4417)),
+  Box(Box(4418, 4418), Box(4418, 4418)),
+  Box(Box(4419, 4419), Box(4419, 4419)),
+  Box(Box(4420, 4420), Box(4420, 4420)),
+  Box(Box(4421, 4421), Box(4421, 4421)),
+  Box(Box(4422, 4422), Box(4422, 4422)),
+  Box(Box(4423, 4423), Box(4423, 4423)),
+  Box(Box(4424, 4424), Box(4424, 4424)),
+  Box(Box(4425, 4425), Box(4425, 4425)),
+  Box(Box(4426, 4426), Box(4426, 4426)),
+  Box(Box(4427, 4427), Box(4427, 4427)),
+  Box(Box(4428, 4428), Box(4428, 4428)),
+  Box(Box(4429, 4429), Box(4429, 4429)),
+  Box(Box(4430, 4430), Box(4430, 4430)),
+  Box(Box(4431, 4431), Box(4431, 4431)),
+  Box(Box(4432, 4432), Box(4432, 4432)),
+  Box(Box(4433, 4433), Box(4433, 4433)),
+  Box(Box(4434, 4434), Box(4434, 4434)),
+  Box(Box(4435, 4435), Box(4435, 4435)),
+  Box(Box(4436, 4436), Box(4436, 4436)),
+  Box(Box(4437, 4437), Box(4437, 4437)),
+  Box(Box(4438, 4438), Box(4438, 4438)),
+  Box(Box(4439, 4439), Box(4439, 4439)),
+  Box(Box(4440, 4440), Box(4440, 4440)),
+  Box(Box(4441, 4441), Box(4441, 4441)),
+  Box(Box(4442, 4442), Box(4442, 4442)),
+  Box(Box(4443, 4443), Box(4443, 4443)),
+  Box(Box(4444, 4444), Box(4444, 4444)),
+  Box(Box(4445, 4445), Box(4445, 4445)),
+  Box(Box(4446, 4446), Box(4446, 4446)),
+  Box(Box(4447, 4447), Box(4447, 4447)),
+  Box(Box(4448, 4448), Box(4448, 4448)),
+  Box(Box(4449, 4449), Box(4449, 4449)),
+  Box(Box(4450, 4450), Box(4450, 4450)),
+  Box(Box(4451, 4451), Box(4451, 4451)),
+  Box(Box(4452, 4452), Box(4452, 4452)),
+  Box(Box(4453, 4453), Box(4453, 4453)),
+  Box(Box(4454, 4454), Box(4454, 4454)),
+  Box(Box(4455, 4455), Box(4455, 4455)),
+  Box(Box(4456, 4456), Box(4456, 4456)),
+  Box(Box(4457, 4457), Box(4457, 4457)),
+  Box(Box(4458, 4458), Box(4458, 4458)),
+  Box(Box(4459, 4459), Box(4459, 4459)),
+  Box(Box(4460, 4460), Box(4460, 4460)),
+  Box(Box(4461, 4461), Box(4461, 4461)),
+  Box(Box(4462, 4462), Box(4462, 4462)),
+  Box(Box(4463, 4463), Box(4463, 4463)),
+  Box(Box(4464, 4464), Box(4464, 4464)),
+  Box(Box(4465, 4465), Box(4465, 4465)),
+  Box(Box(4466, 4466), Box(4466, 4466)),
+  Box(Box(4467, 4467), Box(4467, 4467)),
+  Box(Box(4468, 4468), Box(4468, 4468)),
+  Box(Box(4469, 4469), Box(4469, 4469)),
+  Box(Box(4470, 4470), Box(4470, 4470)),
+  Box(Box(4471, 4471), Box(4471, 4471)),
+  Box(Box(4472, 4472), Box(4472, 4472)),
+  Box(Box(4473, 4473), Box(4473, 4473)),
+  Box(Box(4474, 4474), Box(4474, 4474)),
+  Box(Box(4475, 4475), Box(4475, 4475)),
+  Box(Box(4476, 4476), Box(4476, 4476)),
+  Box(Box(4477, 4477), Box(4477, 4477)),
+  Box(Box(4478, 4478), Box(4478, 4478)),
+  Box(Box(4479, 4479), Box(4479, 4479)),
+  Box(Box(4480, 4480), Box(4480, 4480)),
+  Box(Box(4481, 4481), Box(4481, 4481)),
+  Box(Box(4482, 4482), Box(4482, 4482)),
+  Box(Box(4483, 4483), Box(4483, 4483)),
+  Box(Box(4484, 4484), Box(4484, 4484)),
+  Box(Box(4485, 4485), Box(4485, 4485)),
+  Box(Box(4486, 4486), Box(4486, 4486)),
+  Box(Box(4487, 4487), Box(4487, 4487)),
+  Box(Box(4488, 4488), Box(4488, 4488)),
+  Box(Box(4489, 4489), Box(4489, 4489)),
+  Box(Box(4490, 4490), Box(4490, 4490)),
+  Box(Box(4491, 4491), Box(4491, 4491)),
+  Box(Box(4492, 4492), Box(4492, 4492)),
+  Box(Box(4493, 4493), Box(4493, 4493)),
+  Box(Box(4494, 4494), Box(4494, 4494)),
+  Box(Box(4495, 4495), Box(4495, 4495)),
+  Box(Box(4496, 4496), Box(4496, 4496)),
+  Box(Box(4497, 4497), Box(4497, 4497)),
+  Box(Box(4498, 4498), Box(4498, 4498)),
+  Box(Box(4499, 4499), Box(4499, 4499)),
+  Box(Box(4500, 4500), Box(4500, 4500)),
+  Box(Box(4501, 4501), Box(4501, 4501)),
+  Box(Box(4502, 4502), Box(4502, 4502)),
+  Box(Box(4503, 4503), Box(4503, 4503)),
+  Box(Box(4504, 4504), Box(4504, 4504)),
+  Box(Box(4505, 4505), Box(4505, 4505)),
+  Box(Box(4506, 4506), Box(4506, 4506)),
+  Box(Box(4507, 4507), Box(4507, 4507)),
+  Box(Box(4508, 4508), Box(4508, 4508)),
+  Box(Box(4509, 4509), Box(4509, 4509)),
+  Box(Box(4510, 4510), Box(4510, 4510)),
+  Box(Box(4511, 4511), Box(4511, 4511)),
+  Box(Box(4512, 4512), Box(4512, 4512)),
+  Box(Box(4513, 4513), Box(4513, 4513)),
+  Box(Box(4514, 4514), Box(4514, 4514)),
+  Box(Box(4515, 4515), Box(4515, 4515)),
+  Box(Box(4516, 4516), Box(4516, 4516)),
+  Box(Box(4517, 4517), Box(4517, 4517)),
+  Box(Box(4518, 4518), Box(4518, 4518)),
+  Box(Box(4519, 4519), Box(4519, 4519)),
+  Box(Box(4520, 4520), Box(4520, 4520)),
+  Box(Box(4521, 4521), Box(4521, 4521)),
+  Box(Box(4522, 4522), Box(4522, 4522)),
+  Box(Box(4523, 4523), Box(4523, 4523)),
+  Box(Box(4524, 4524), Box(4524, 4524)),
+  Box(Box(4525, 4525), Box(4525, 4525)),
+  Box(Box(4526, 4526), Box(4526, 4526)),
+  Box(Box(4527, 4527), Box(4527, 4527)),
+  Box(Box(4528, 4528), Box(4528, 4528)),
+  Box(Box(4529, 4529), Box(4529, 4529)),
+  Box(Box(4530, 4530), Box(4530, 4530)),
+  Box(Box(4531, 4531), Box(4531, 4531)),
+  Box(Box(4532, 4532), Box(4532, 4532)),
+  Box(Box(4533, 4533), Box(4533, 4533)),
+  Box(Box(4534, 4534), Box(4534, 4534)),
+  Box(Box(4535, 4535), Box(4535, 4535)),
+  Box(Box(4536, 4536), Box(4536, 4536)),
+  Box(Box(4537, 4537), Box(4537, 4537)),
+  Box(Box(4538, 4538), Box(4538, 4538)),
+  Box(Box(4539, 4539), Box(4539, 4539)),
+  Box(Box(4540, 4540), Box(4540, 4540)),
+  Box(Box(4541, 4541), Box(4541, 4541)),
+  Box(Box(4542, 4542), Box(4542, 4542)),
+  Box(Box(4543, 4543), Box(4543, 4543)),
+  Box(Box(4544, 4544), Box(4544, 4544)),
+  Box(Box(4545, 4545), Box(4545, 4545)),
+  Box(Box(4546, 4546), Box(4546, 4546)),
+  Box(Box(4547, 4547), Box(4547, 4547)),
+  Box(Box(4548, 4548), Box(4548, 4548)),
+  Box(Box(4549, 4549), Box(4549, 4549)),
+  Box(Box(4550, 4550), Box(4550, 4550)),
+  Box(Box(4551, 4551), Box(4551, 4551)),
+  Box(Box(4552, 4552), Box(4552, 4552)),
+  Box(Box(4553, 4553), Box(4553, 4553)),
+  Box(Box(4554, 4554), Box(4554, 4554)),
+  Box(Box(4555, 4555), Box(4555, 4555)),
+  Box(Box(4556, 4556), Box(4556, 4556)),
+  Box(Box(4557, 4557), Box(4557, 4557)),
+  Box(Box(4558, 4558), Box(4558, 4558)),
+  Box(Box(4559, 4559), Box(4559, 4559)),
+  Box(Box(4560, 4560), Box(4560, 4560)),
+  Box(Box(4561, 4561), Box(4561, 4561)),
+  Box(Box(4562, 4562), Box(4562, 4562)),
+  Box(Box(4563, 4563), Box(4563, 4563)),
+  Box(Box(4564, 4564), Box(4564, 4564)),
+  Box(Box(4565, 4565), Box(4565, 4565)),
+  Box(Box(4566, 4566), Box(4566, 4566)),
+  Box(Box(4567, 4567), Box(4567, 4567)),
+  Box(Box(4568, 4568), Box(4568, 4568)),
+  Box(Box(4569, 4569), Box(4569, 4569)),
+  Box(Box(4570, 4570), Box(4570, 4570)),
+  Box(Box(4571, 4571), Box(4571, 4571)),
+  Box(Box(4572, 4572), Box(4572, 4572)),
+  Box(Box(4573, 4573), Box(4573, 4573)),
+  Box(Box(4574, 4574), Box(4574, 4574)),
+  Box(Box(4575, 4575), Box(4575, 4575)),
+  Box(Box(4576, 4576), Box(4576, 4576)),
+  Box(Box(4577, 4577), Box(4577, 4577)),
+  Box(Box(4578, 4578), Box(4578, 4578)),
+  Box(Box(4579, 4579), Box(4579, 4579)),
+  Box(Box(4580, 4580), Box(4580, 4580)),
+  Box(Box(4581, 4581), Box(4581, 4581)),
+  Box(Box(4582, 4582), Box(4582, 4582)),
+  Box(Box(4583, 4583), Box(4583, 4583)),
+  Box(Box(4584, 4584), Box(4584, 4584)),
+  Box(Box(4585, 4585), Box(4585, 4585)),
+  Box(Box(4586, 4586), Box(4586, 4586)),
+  Box(Box(4587, 4587), Box(4587, 4587)),
+  Box(Box(4588, 4588), Box(4588, 4588)),
+  Box(Box(4589, 4589), Box(4589, 4589)),
+  Box(Box(4590, 4590), Box(4590, 4590)),
+  Box(Box(4591, 4591), Box(4591, 4591)),
+  Box(Box(4592, 4592), Box(4592, 4592)),
+  Box(Box(4593, 4593), Box(4593, 4593)),
+  Box(Box(4594, 4594), Box(4594, 4594)),
+  Box(Box(4595, 4595), Box(4595, 4595)),
+  Box(Box(4596, 4596), Box(4596, 4596)),
+  Box(Box(4597, 4597), Box(4597, 4597)),
+  Box(Box(4598, 4598), Box(4598, 4598)),
+  Box(Box(4599, 4599), Box(4599, 4599)),
+  Box(Box(4600, 4600), Box(4600, 4600)),
+  Box(Box(4601, 4601), Box(4601, 4601)),
+  Box(Box(4602, 4602), Box(4602, 4602)),
+  Box(Box(4603, 4603), Box(4603, 4603)),
+  Box(Box(4604, 4604), Box(4604, 4604)),
+  Box(Box(4605, 4605), Box(4605, 4605)),
+  Box(Box(4606, 4606), Box(4606, 4606)),
+  Box(Box(4607, 4607), Box(4607, 4607)),
+  Box(Box(4608, 4608), Box(4608, 4608)),
+  Box(Box(4609, 4609), Box(4609, 4609)),
+  Box(Box(4610, 4610), Box(4610, 4610)),
+  Box(Box(4611, 4611), Box(4611, 4611)),
+  Box(Box(4612, 4612), Box(4612, 4612)),
+  Box(Box(4613, 4613), Box(4613, 4613)),
+  Box(Box(4614, 4614), Box(4614, 4614)),
+  Box(Box(4615, 4615), Box(4615, 4615)),
+  Box(Box(4616, 4616), Box(4616, 4616)),
+  Box(Box(4617, 4617), Box(4617, 4617)),
+  Box(Box(4618, 4618), Box(4618, 4618)),
+  Box(Box(4619, 4619), Box(4619, 4619)),
+  Box(Box(4620, 4620), Box(4620, 4620)),
+  Box(Box(4621, 4621), Box(4621, 4621)),
+  Box(Box(4622, 4622), Box(4622, 4622)),
+  Box(Box(4623, 4623), Box(4623, 4623)),
+  Box(Box(4624, 4624), Box(4624, 4624)),
+  Box(Box(4625, 4625), Box(4625, 4625)),
+  Box(Box(4626, 4626), Box(4626, 4626)),
+  Box(Box(4627, 4627), Box(4627, 4627)),
+  Box(Box(4628, 4628), Box(4628, 4628)),
+  Box(Box(4629, 4629), Box(4629, 4629)),
+  Box(Box(4630, 4630), Box(4630, 4630)),
+  Box(Box(4631, 4631), Box(4631, 4631)),
+  Box(Box(4632, 4632), Box(4632, 4632)),
+  Box(Box(4633, 4633), Box(4633, 4633)),
+  Box(Box(4634, 4634), Box(4634, 4634)),
+  Box(Box(4635, 4635), Box(4635, 4635)),
+  Box(Box(4636, 4636), Box(4636, 4636)),
+  Box(Box(4637, 4637), Box(4637, 4637)),
+  Box(Box(4638, 4638), Box(4638, 4638)),
+  Box(Box(4639, 4639), Box(4639, 4639)),
+  Box(Box(4640, 4640), Box(4640, 4640)),
+  Box(Box(4641, 4641), Box(4641, 4641)),
+  Box(Box(4642, 4642), Box(4642, 4642)),
+  Box(Box(4643, 4643), Box(4643, 4643)),
+  Box(Box(4644, 4644), Box(4644, 4644)),
+  Box(Box(4645, 4645), Box(4645, 4645)),
+  Box(Box(4646, 4646), Box(4646, 4646)),
+  Box(Box(4647, 4647), Box(4647, 4647)),
+  Box(Box(4648, 4648), Box(4648, 4648)),
+  Box(Box(4649, 4649), Box(4649, 4649)),
+  Box(Box(4650, 4650), Box(4650, 4650)),
+  Box(Box(4651, 4651), Box(4651, 4651)),
+  Box(Box(4652, 4652), Box(4652, 4652)),
+  Box(Box(4653, 4653), Box(4653, 4653)),
+  Box(Box(4654, 4654), Box(4654, 4654)),
+  Box(Box(4655, 4655), Box(4655, 4655)),
+  Box(Box(4656, 4656), Box(4656, 4656)),
+  Box(Box(4657, 4657), Box(4657, 4657)),
+  Box(Box(4658, 4658), Box(4658, 4658)),
+  Box(Box(4659, 4659), Box(4659, 4659)),
+  Box(Box(4660, 4660), Box(4660, 4660)),
+  Box(Box(4661, 4661), Box(4661, 4661)),
+  Box(Box(4662, 4662), Box(4662, 4662)),
+  Box(Box(4663, 4663), Box(4663, 4663)),
+  Box(Box(4664, 4664), Box(4664, 4664)),
+  Box(Box(4665, 4665), Box(4665, 4665)),
+  Box(Box(4666, 4666), Box(4666, 4666)),
+  Box(Box(4667, 4667), Box(4667, 4667)),
+  Box(Box(4668, 4668), Box(4668, 4668)),
+  Box(Box(4669, 4669), Box(4669, 4669)),
+  Box(Box(4670, 4670), Box(4670, 4670)),
+  Box(Box(4671, 4671), Box(4671, 4671)),
+  Box(Box(4672, 4672), Box(4672, 4672)),
+  Box(Box(4673, 4673), Box(4673, 4673)),
+  Box(Box(4674, 4674), Box(4674, 4674)),
+  Box(Box(4675, 4675), Box(4675, 4675)),
+  Box(Box(4676, 4676), Box(4676, 4676)),
+  Box(Box(4677, 4677), Box(4677, 4677)),
+  Box(Box(4678, 4678), Box(4678, 4678)),
+  Box(Box(4679, 4679), Box(4679, 4679)),
+  Box(Box(4680, 4680), Box(4680, 4680)),
+  Box(Box(4681, 4681), Box(4681, 4681)),
+  Box(Box(4682, 4682), Box(4682, 4682)),
+  Box(Box(4683, 4683), Box(4683, 4683)),
+  Box(Box(4684, 4684), Box(4684, 4684)),
+  Box(Box(4685, 4685), Box(4685, 4685)),
+  Box(Box(4686, 4686), Box(4686, 4686)),
+  Box(Box(4687, 4687), Box(4687, 4687)),
+  Box(Box(4688, 4688), Box(4688, 4688)),
+  Box(Box(4689, 4689), Box(4689, 4689)),
+  Box(Box(4690, 4690), Box(4690, 4690)),
+  Box(Box(4691, 4691), Box(4691, 4691)),
+  Box(Box(4692, 4692), Box(4692, 4692)),
+  Box(Box(4693, 4693), Box(4693, 4693)),
+  Box(Box(4694, 4694), Box(4694, 4694)),
+  Box(Box(4695, 4695), Box(4695, 4695)),
+  Box(Box(4696, 4696), Box(4696, 4696)),
+  Box(Box(4697, 4697), Box(4697, 4697)),
+  Box(Box(4698, 4698), Box(4698, 4698)),
+  Box(Box(4699, 4699), Box(4699, 4699)),
+  Box(Box(4700, 4700), Box(4700, 4700)),
+  Box(Box(4701, 4701), Box(4701, 4701)),
+  Box(Box(4702, 4702), Box(4702, 4702)),
+  Box(Box(4703, 4703), Box(4703, 4703)),
+  Box(Box(4704, 4704), Box(4704, 4704)),
+  Box(Box(4705, 4705), Box(4705, 4705)),
+  Box(Box(4706, 4706), Box(4706, 4706)),
+  Box(Box(4707, 4707), Box(4707, 4707)),
+  Box(Box(4708, 4708), Box(4708, 4708)),
+  Box(Box(4709, 4709), Box(4709, 4709)),
+  Box(Box(4710, 4710), Box(4710, 4710)),
+  Box(Box(4711, 4711), Box(4711, 4711)),
+  Box(Box(4712, 4712), Box(4712, 4712)),
+  Box(Box(4713, 4713), Box(4713, 4713)),
+  Box(Box(4714, 4714), Box(4714, 4714)),
+  Box(Box(4715, 4715), Box(4715, 4715)),
+  Box(Box(4716, 4716), Box(4716, 4716)),
+  Box(Box(4717, 4717), Box(4717, 4717)),
+  Box(Box(4718, 4718), Box(4718, 4718)),
+  Box(Box(4719, 4719), Box(4719, 4719)),
+  Box(Box(4720, 4720), Box(4720, 4720)),
+  Box(Box(4721, 4721), Box(4721, 4721)),
+  Box(Box(4722, 4722), Box(4722, 4722)),
+  Box(Box(4723, 4723), Box(4723, 4723)),
+  Box(Box(4724, 4724), Box(4724, 4724)),
+  Box(Box(4725, 4725), Box(4725, 4725)),
+  Box(Box(4726, 4726), Box(4726, 4726)),
+  Box(Box(4727, 4727), Box(4727, 4727)),
+  Box(Box(4728, 4728), Box(4728, 4728)),
+  Box(Box(4729, 4729), Box(4729, 4729)),
+  Box(Box(4730, 4730), Box(4730, 4730)),
+  Box(Box(4731, 4731), Box(4731, 4731)),
+  Box(Box(4732, 4732), Box(4732, 4732)),
+  Box(Box(4733, 4733), Box(4733, 4733)),
+  Box(Box(4734, 4734), Box(4734, 4734)),
+  Box(Box(4735, 4735), Box(4735, 4735)),
+  Box(Box(4736, 4736), Box(4736, 4736)),
+  Box(Box(4737, 4737), Box(4737, 4737)),
+  Box(Box(4738, 4738), Box(4738, 4738)),
+  Box(Box(4739, 4739), Box(4739, 4739)),
+  Box(Box(4740, 4740), Box(4740, 4740)),
+  Box(Box(4741, 4741), Box(4741, 4741)),
+  Box(Box(4742, 4742), Box(4742, 4742)),
+  Box(Box(4743, 4743), Box(4743, 4743)),
+  Box(Box(4744, 4744), Box(4744, 4744)),
+  Box(Box(4745, 4745), Box(4745, 4745)),
+  Box(Box(4746, 4746), Box(4746, 4746)),
+  Box(Box(4747, 4747), Box(4747, 4747)),
+  Box(Box(4748, 4748), Box(4748, 4748)),
+  Box(Box(4749, 4749), Box(4749, 4749)),
+  Box(Box(4750, 4750), Box(4750, 4750)),
+  Box(Box(4751, 4751), Box(4751, 4751)),
+  Box(Box(4752, 4752), Box(4752, 4752)),
+  Box(Box(4753, 4753), Box(4753, 4753)),
+  Box(Box(4754, 4754), Box(4754, 4754)),
+  Box(Box(4755, 4755), Box(4755, 4755)),
+  Box(Box(4756, 4756), Box(4756, 4756)),
+  Box(Box(4757, 4757), Box(4757, 4757)),
+  Box(Box(4758, 4758), Box(4758, 4758)),
+  Box(Box(4759, 4759), Box(4759, 4759)),
+  Box(Box(4760, 4760), Box(4760, 4760)),
+  Box(Box(4761, 4761), Box(4761, 4761)),
+  Box(Box(4762, 4762), Box(4762, 4762)),
+  Box(Box(4763, 4763), Box(4763, 4763)),
+  Box(Box(4764, 4764), Box(4764, 4764)),
+  Box(Box(4765, 4765), Box(4765, 4765)),
+  Box(Box(4766, 4766), Box(4766, 4766)),
+  Box(Box(4767, 4767), Box(4767, 4767)),
+  Box(Box(4768, 4768), Box(4768, 4768)),
+  Box(Box(4769, 4769), Box(4769, 4769)),
+  Box(Box(4770, 4770), Box(4770, 4770)),
+  Box(Box(4771, 4771), Box(4771, 4771)),
+  Box(Box(4772, 4772), Box(4772, 4772)),
+  Box(Box(4773, 4773), Box(4773, 4773)),
+  Box(Box(4774, 4774), Box(4774, 4774)),
+  Box(Box(4775, 4775), Box(4775, 4775)),
+  Box(Box(4776, 4776), Box(4776, 4776)),
+  Box(Box(4777, 4777), Box(4777, 4777)),
+  Box(Box(4778, 4778), Box(4778, 4778)),
+  Box(Box(4779, 4779), Box(4779, 4779)),
+  Box(Box(4780, 4780), Box(4780, 4780)),
+  Box(Box(4781, 4781), Box(4781, 4781)),
+  Box(Box(4782, 4782), Box(4782, 4782)),
+  Box(Box(4783, 4783), Box(4783, 4783)),
+  Box(Box(4784, 4784), Box(4784, 4784)),
+  Box(Box(4785, 4785), Box(4785, 4785)),
+  Box(Box(4786, 4786), Box(4786, 4786)),
+  Box(Box(4787, 4787), Box(4787, 4787)),
+  Box(Box(4788, 4788), Box(4788, 4788)),
+  Box(Box(4789, 4789), Box(4789, 4789)),
+  Box(Box(4790, 4790), Box(4790, 4790)),
+  Box(Box(4791, 4791), Box(4791, 4791)),
+  Box(Box(4792, 4792), Box(4792, 4792)),
+  Box(Box(4793, 4793), Box(4793, 4793)),
+  Box(Box(4794, 4794), Box(4794, 4794)),
+  Box(Box(4795, 4795), Box(4795, 4795)),
+  Box(Box(4796, 4796), Box(4796, 4796)),
+  Box(Box(4797, 4797), Box(4797, 4797)),
+  Box(Box(4798, 4798), Box(4798, 4798)),
+  Box(Box(4799, 4799), Box(4799, 4799)),
+  Box(Box(4800, 4800), Box(4800, 4800)),
+  Box(Box(4801, 4801), Box(4801, 4801)),
+  Box(Box(4802, 4802), Box(4802, 4802)),
+  Box(Box(4803, 4803), Box(4803, 4803)),
+  Box(Box(4804, 4804), Box(4804, 4804)),
+  Box(Box(4805, 4805), Box(4805, 4805)),
+  Box(Box(4806, 4806), Box(4806, 4806)),
+  Box(Box(4807, 4807), Box(4807, 4807)),
+  Box(Box(4808, 4808), Box(4808, 4808)),
+  Box(Box(4809, 4809), Box(4809, 4809)),
+  Box(Box(4810, 4810), Box(4810, 4810)),
+  Box(Box(4811, 4811), Box(4811, 4811)),
+  Box(Box(4812, 4812), Box(4812, 4812)),
+  Box(Box(4813, 4813), Box(4813, 4813)),
+  Box(Box(4814, 4814), Box(4814, 4814)),
+  Box(Box(4815, 4815), Box(4815, 4815)),
+  Box(Box(4816, 4816), Box(4816, 4816)),
+  Box(Box(4817, 4817), Box(4817, 4817)),
+  Box(Box(4818, 4818), Box(4818, 4818)),
+  Box(Box(4819, 4819), Box(4819, 4819)),
+  Box(Box(4820, 4820), Box(4820, 4820)),
+  Box(Box(4821, 4821), Box(4821, 4821)),
+  Box(Box(4822, 4822), Box(4822, 4822)),
+  Box(Box(4823, 4823), Box(4823, 4823)),
+  Box(Box(4824, 4824), Box(4824, 4824)),
+  Box(Box(4825, 4825), Box(4825, 4825)),
+  Box(Box(4826, 4826), Box(4826, 4826)),
+  Box(Box(4827, 4827), Box(4827, 4827)),
+  Box(Box(4828, 4828), Box(4828, 4828)),
+  Box(Box(4829, 4829), Box(4829, 4829)),
+  Box(Box(4830, 4830), Box(4830, 4830)),
+  Box(Box(4831, 4831), Box(4831, 4831)),
+  Box(Box(4832, 4832), Box(4832, 4832)),
+  Box(Box(4833, 4833), Box(4833, 4833)),
+  Box(Box(4834, 4834), Box(4834, 4834)),
+  Box(Box(4835, 4835), Box(4835, 4835)),
+  Box(Box(4836, 4836), Box(4836, 4836)),
+  Box(Box(4837, 4837), Box(4837, 4837)),
+  Box(Box(4838, 4838), Box(4838, 4838)),
+  Box(Box(4839, 4839), Box(4839, 4839)),
+  Box(Box(4840, 4840), Box(4840, 4840)),
+  Box(Box(4841, 4841), Box(4841, 4841)),
+  Box(Box(4842, 4842), Box(4842, 4842)),
+  Box(Box(4843, 4843), Box(4843, 4843)),
+  Box(Box(4844, 4844), Box(4844, 4844)),
+  Box(Box(4845, 4845), Box(4845, 4845)),
+  Box(Box(4846, 4846), Box(4846, 4846)),
+  Box(Box(4847, 4847), Box(4847, 4847)),
+  Box(Box(4848, 4848), Box(4848, 4848)),
+  Box(Box(4849, 4849), Box(4849, 4849)),
+  Box(Box(4850, 4850), Box(4850, 4850)),
+  Box(Box(4851, 4851), Box(4851, 4851)),
+  Box(Box(4852, 4852), Box(4852, 4852)),
+  Box(Box(4853, 4853), Box(4853, 4853)),
+  Box(Box(4854, 4854), Box(4854, 4854)),
+  Box(Box(4855, 4855), Box(4855, 4855)),
+  Box(Box(4856, 4856), Box(4856, 4856)),
+  Box(Box(4857, 4857), Box(4857, 4857)),
+  Box(Box(4858, 4858), Box(4858, 4858)),
+  Box(Box(4859, 4859), Box(4859, 4859)),
+  Box(Box(4860, 4860), Box(4860, 4860)),
+  Box(Box(4861, 4861), Box(4861, 4861)),
+  Box(Box(4862, 4862), Box(4862, 4862)),
+  Box(Box(4863, 4863), Box(4863, 4863)),
+  Box(Box(4864, 4864), Box(4864, 4864)),
+  Box(Box(4865, 4865), Box(4865, 4865)),
+  Box(Box(4866, 4866), Box(4866, 4866)),
+  Box(Box(4867, 4867), Box(4867, 4867)),
+  Box(Box(4868, 4868), Box(4868, 4868)),
+  Box(Box(4869, 4869), Box(4869, 4869)),
+  Box(Box(4870, 4870), Box(4870, 4870)),
+  Box(Box(4871, 4871), Box(4871, 4871)),
+  Box(Box(4872, 4872), Box(4872, 4872)),
+  Box(Box(4873, 4873), Box(4873, 4873)),
+  Box(Box(4874, 4874), Box(4874, 4874)),
+  Box(Box(4875, 4875), Box(4875, 4875)),
+  Box(Box(4876, 4876), Box(4876, 4876)),
+  Box(Box(4877, 4877), Box(4877, 4877)),
+  Box(Box(4878, 4878), Box(4878, 4878)),
+  Box(Box(4879, 4879), Box(4879, 4879)),
+  Box(Box(4880, 4880), Box(4880, 4880)),
+  Box(Box(4881, 4881), Box(4881, 4881)),
+  Box(Box(4882, 4882), Box(4882, 4882)),
+  Box(Box(4883, 4883), Box(4883, 4883)),
+  Box(Box(4884, 4884), Box(4884, 4884)),
+  Box(Box(4885, 4885), Box(4885, 4885)),
+  Box(Box(4886, 4886), Box(4886, 4886)),
+  Box(Box(4887, 4887), Box(4887, 4887)),
+  Box(Box(4888, 4888), Box(4888, 4888)),
+  Box(Box(4889, 4889), Box(4889, 4889)),
+  Box(Box(4890, 4890), Box(4890, 4890)),
+  Box(Box(4891, 4891), Box(4891, 4891)),
+  Box(Box(4892, 4892), Box(4892, 4892)),
+  Box(Box(4893, 4893), Box(4893, 4893)),
+  Box(Box(4894, 4894), Box(4894, 4894)),
+  Box(Box(4895, 4895), Box(4895, 4895)),
+  Box(Box(4896, 4896), Box(4896, 4896)),
+  Box(Box(4897, 4897), Box(4897, 4897)),
+  Box(Box(4898, 4898), Box(4898, 4898)),
+  Box(Box(4899, 4899), Box(4899, 4899)),
+  Box(Box(4900, 4900), Box(4900, 4900)),
+  Box(Box(4901, 4901), Box(4901, 4901)),
+  Box(Box(4902, 4902), Box(4902, 4902)),
+  Box(Box(4903, 4903), Box(4903, 4903)),
+  Box(Box(4904, 4904), Box(4904, 4904)),
+  Box(Box(4905, 4905), Box(4905, 4905)),
+  Box(Box(4906, 4906), Box(4906, 4906)),
+  Box(Box(4907, 4907), Box(4907, 4907)),
+  Box(Box(4908, 4908), Box(4908, 4908)),
+  Box(Box(4909, 4909), Box(4909, 4909)),
+  Box(Box(4910, 4910), Box(4910, 4910)),
+  Box(Box(4911, 4911), Box(4911, 4911)),
+  Box(Box(4912, 4912), Box(4912, 4912)),
+  Box(Box(4913, 4913), Box(4913, 4913)),
+  Box(Box(4914, 4914), Box(4914, 4914)),
+  Box(Box(4915, 4915), Box(4915, 4915)),
+  Box(Box(4916, 4916), Box(4916, 4916)),
+  Box(Box(4917, 4917), Box(4917, 4917)),
+  Box(Box(4918, 4918), Box(4918, 4918)),
+  Box(Box(4919, 4919), Box(4919, 4919)),
+  Box(Box(4920, 4920), Box(4920, 4920)),
+  Box(Box(4921, 4921), Box(4921, 4921)),
+  Box(Box(4922, 4922), Box(4922, 4922)),
+  Box(Box(4923, 4923), Box(4923, 4923)),
+  Box(Box(4924, 4924), Box(4924, 4924)),
+  Box(Box(4925, 4925), Box(4925, 4925)),
+  Box(Box(4926, 4926), Box(4926, 4926)),
+  Box(Box(4927, 4927), Box(4927, 4927)),
+  Box(Box(4928, 4928), Box(4928, 4928)),
+  Box(Box(4929, 4929), Box(4929, 4929)),
+  Box(Box(4930, 4930), Box(4930, 4930)),
+  Box(Box(4931, 4931), Box(4931, 4931)),
+  Box(Box(4932, 4932), Box(4932, 4932)),
+  Box(Box(4933, 4933), Box(4933, 4933)),
+  Box(Box(4934, 4934), Box(4934, 4934)),
+  Box(Box(4935, 4935), Box(4935, 4935)),
+  Box(Box(4936, 4936), Box(4936, 4936)),
+  Box(Box(4937, 4937), Box(4937, 4937)),
+  Box(Box(4938, 4938), Box(4938, 4938)),
+  Box(Box(4939, 4939), Box(4939, 4939)),
+  Box(Box(4940, 4940), Box(4940, 4940)),
+  Box(Box(4941, 4941), Box(4941, 4941)),
+  Box(Box(4942, 4942), Box(4942, 4942)),
+  Box(Box(4943, 4943), Box(4943, 4943)),
+  Box(Box(4944, 4944), Box(4944, 4944)),
+  Box(Box(4945, 4945), Box(4945, 4945)),
+  Box(Box(4946, 4946), Box(4946, 4946)),
+  Box(Box(4947, 4947), Box(4947, 4947)),
+  Box(Box(4948, 4948), Box(4948, 4948)),
+  Box(Box(4949, 4949), Box(4949, 4949)),
+  Box(Box(4950, 4950), Box(4950, 4950)),
+  Box(Box(4951, 4951), Box(4951, 4951)),
+  Box(Box(4952, 4952), Box(4952, 4952)),
+  Box(Box(4953, 4953), Box(4953, 4953)),
+  Box(Box(4954, 4954), Box(4954, 4954)),
+  Box(Box(4955, 4955), Box(4955, 4955)),
+  Box(Box(4956, 4956), Box(4956, 4956)),
+  Box(Box(4957, 4957), Box(4957, 4957)),
+  Box(Box(4958, 4958), Box(4958, 4958)),
+  Box(Box(4959, 4959), Box(4959, 4959)),
+  Box(Box(4960, 4960), Box(4960, 4960)),
+  Box(Box(4961, 4961), Box(4961, 4961)),
+  Box(Box(4962, 4962), Box(4962, 4962)),
+  Box(Box(4963, 4963), Box(4963, 4963)),
+  Box(Box(4964, 4964), Box(4964, 4964)),
+  Box(Box(4965, 4965), Box(4965, 4965)),
+  Box(Box(4966, 4966), Box(4966, 4966)),
+  Box(Box(4967, 4967), Box(4967, 4967)),
+  Box(Box(4968, 4968), Box(4968, 4968)),
+  Box(Box(4969, 4969), Box(4969, 4969)),
+  Box(Box(4970, 4970), Box(4970, 4970)),
+  Box(Box(4971, 4971), Box(4971, 4971)),
+  Box(Box(4972, 4972), Box(4972, 4972)),
+  Box(Box(4973, 4973), Box(4973, 4973)),
+  Box(Box(4974, 4974), Box(4974, 4974)),
+  Box(Box(4975, 4975), Box(4975, 4975)),
+  Box(Box(4976, 4976), Box(4976, 4976)),
+  Box(Box(4977, 4977), Box(4977, 4977)),
+  Box(Box(4978, 4978), Box(4978, 4978)),
+  Box(Box(4979, 4979), Box(4979, 4979)),
+  Box(Box(4980, 4980), Box(4980, 4980)),
+  Box(Box(4981, 4981), Box(4981, 4981)),
+  Box(Box(4982, 4982), Box(4982, 4982)),
+  Box(Box(4983, 4983), Box(4983, 4983)),
+  Box(Box(4984, 4984), Box(4984, 4984)),
+  Box(Box(4985, 4985), Box(4985, 4985)),
+  Box(Box(4986, 4986), Box(4986, 4986)),
+  Box(Box(4987, 4987), Box(4987, 4987)),
+  Box(Box(4988, 4988), Box(4988, 4988)),
+  Box(Box(4989, 4989), Box(4989, 4989)),
+  Box(Box(4990, 4990), Box(4990, 4990)),
+  Box(Box(4991, 4991), Box(4991, 4991)),
+  Box(Box(4992, 4992), Box(4992, 4992)),
+  Box(Box(4993, 4993), Box(4993, 4993)),
+  Box(Box(4994, 4994), Box(4994, 4994)),
+  Box(Box(4995, 4995), Box(4995, 4995)),
+  Box(Box(4996, 4996), Box(4996, 4996)),
+  Box(Box(4997, 4997), Box(4997, 4997)),
+  Box(Box(4998, 4998), Box(4998, 4998)),
+  Box(Box(4999, 4999), Box(4999, 4999)),
+  Box(Box(5000, 5000), Box(5000, 5000)),
+  Box(Box(5001, 5001), Box(5001, 5001)),
+  Box(Box(5002, 5002), Box(5002, 5002)),
+  Box(Box(5003, 5003), Box(5003, 5003)),
+  Box(Box(5004, 5004), Box(5004, 5004)),
+  Box(Box(5005, 5005), Box(5005, 5005)),
+  Box(Box(5006, 5006), Box(5006, 5006)),
+  Box(Box(5007, 5007), Box(5007, 5007)),
+  Box(Box(5008, 5008), Box(5008, 5008)),
+  Box(Box(5009, 5009), Box(5009, 5009)),
+  Box(Box(5010, 5010), Box(5010, 5010)),
+  Box(Box(5011, 5011), Box(5011, 5011)),
+  Box(Box(5012, 5012), Box(5012, 5012)),
+  Box(Box(5013, 5013), Box(5013, 5013)),
+  Box(Box(5014, 5014), Box(5014, 5014)),
+  Box(Box(5015, 5015), Box(5015, 5015)),
+  Box(Box(5016, 5016), Box(5016, 5016)),
+  Box(Box(5017, 5017), Box(5017, 5017)),
+  Box(Box(5018, 5018), Box(5018, 5018)),
+  Box(Box(5019, 5019), Box(5019, 5019)),
+  Box(Box(5020, 5020), Box(5020, 5020)),
+  Box(Box(5021, 5021), Box(5021, 5021)),
+  Box(Box(5022, 5022), Box(5022, 5022)),
+  Box(Box(5023, 5023), Box(5023, 5023)),
+  Box(Box(5024, 5024), Box(5024, 5024)),
+  Box(Box(5025, 5025), Box(5025, 5025)),
+  Box(Box(5026, 5026), Box(5026, 5026)),
+  Box(Box(5027, 5027), Box(5027, 5027)),
+  Box(Box(5028, 5028), Box(5028, 5028)),
+  Box(Box(5029, 5029), Box(5029, 5029)),
+  Box(Box(5030, 5030), Box(5030, 5030)),
+  Box(Box(5031, 5031), Box(5031, 5031)),
+  Box(Box(5032, 5032), Box(5032, 5032)),
+  Box(Box(5033, 5033), Box(5033, 5033)),
+  Box(Box(5034, 5034), Box(5034, 5034)),
+  Box(Box(5035, 5035), Box(5035, 5035)),
+  Box(Box(5036, 5036), Box(5036, 5036)),
+  Box(Box(5037, 5037), Box(5037, 5037)),
+  Box(Box(5038, 5038), Box(5038, 5038)),
+  Box(Box(5039, 5039), Box(5039, 5039)),
+  Box(Box(5040, 5040), Box(5040, 5040)),
+  Box(Box(5041, 5041), Box(5041, 5041)),
+  Box(Box(5042, 5042), Box(5042, 5042)),
+  Box(Box(5043, 5043), Box(5043, 5043)),
+  Box(Box(5044, 5044), Box(5044, 5044)),
+  Box(Box(5045, 5045), Box(5045, 5045)),
+  Box(Box(5046, 5046), Box(5046, 5046)),
+  Box(Box(5047, 5047), Box(5047, 5047)),
+  Box(Box(5048, 5048), Box(5048, 5048)),
+  Box(Box(5049, 5049), Box(5049, 5049)),
+  Box(Box(5050, 5050), Box(5050, 5050)),
+  Box(Box(5051, 5051), Box(5051, 5051)),
+  Box(Box(5052, 5052), Box(5052, 5052)),
+  Box(Box(5053, 5053), Box(5053, 5053)),
+  Box(Box(5054, 5054), Box(5054, 5054)),
+  Box(Box(5055, 5055), Box(5055, 5055)),
+  Box(Box(5056, 5056), Box(5056, 5056)),
+  Box(Box(5057, 5057), Box(5057, 5057)),
+  Box(Box(5058, 5058), Box(5058, 5058)),
+  Box(Box(5059, 5059), Box(5059, 5059)),
+  Box(Box(5060, 5060), Box(5060, 5060)),
+  Box(Box(5061, 5061), Box(5061, 5061)),
+  Box(Box(5062, 5062), Box(5062, 5062)),
+  Box(Box(5063, 5063), Box(5063, 5063)),
+  Box(Box(5064, 5064), Box(5064, 5064)),
+  Box(Box(5065, 5065), Box(5065, 5065)),
+  Box(Box(5066, 5066), Box(5066, 5066)),
+  Box(Box(5067, 5067), Box(5067, 5067)),
+  Box(Box(5068, 5068), Box(5068, 5068)),
+  Box(Box(5069, 5069), Box(5069, 5069)),
+  Box(Box(5070, 5070), Box(5070, 5070)),
+  Box(Box(5071, 5071), Box(5071, 5071)),
+  Box(Box(5072, 5072), Box(5072, 5072)),
+  Box(Box(5073, 5073), Box(5073, 5073)),
+  Box(Box(5074, 5074), Box(5074, 5074)),
+  Box(Box(5075, 5075), Box(5075, 5075)),
+  Box(Box(5076, 5076), Box(5076, 5076)),
+  Box(Box(5077, 5077), Box(5077, 5077)),
+  Box(Box(5078, 5078), Box(5078, 5078)),
+  Box(Box(5079, 5079), Box(5079, 5079)),
+  Box(Box(5080, 5080), Box(5080, 5080)),
+  Box(Box(5081, 5081), Box(5081, 5081)),
+  Box(Box(5082, 5082), Box(5082, 5082)),
+  Box(Box(5083, 5083), Box(5083, 5083)),
+  Box(Box(5084, 5084), Box(5084, 5084)),
+  Box(Box(5085, 5085), Box(5085, 5085)),
+  Box(Box(5086, 5086), Box(5086, 5086)),
+  Box(Box(5087, 5087), Box(5087, 5087)),
+  Box(Box(5088, 5088), Box(5088, 5088)),
+  Box(Box(5089, 5089), Box(5089, 5089)),
+  Box(Box(5090, 5090), Box(5090, 5090)),
+  Box(Box(5091, 5091), Box(5091, 5091)),
+  Box(Box(5092, 5092), Box(5092, 5092)),
+  Box(Box(5093, 5093), Box(5093, 5093)),
+  Box(Box(5094, 5094), Box(5094, 5094)),
+  Box(Box(5095, 5095), Box(5095, 5095)),
+  Box(Box(5096, 5096), Box(5096, 5096)),
+  Box(Box(5097, 5097), Box(5097, 5097)),
+  Box(Box(5098, 5098), Box(5098, 5098)),
+  Box(Box(5099, 5099), Box(5099, 5099)),
+  Box(Box(5100, 5100), Box(5100, 5100)),
+  Box(Box(5101, 5101), Box(5101, 5101)),
+  Box(Box(5102, 5102), Box(5102, 5102)),
+  Box(Box(5103, 5103), Box(5103, 5103)),
+  Box(Box(5104, 5104), Box(5104, 5104)),
+  Box(Box(5105, 5105), Box(5105, 5105)),
+  Box(Box(5106, 5106), Box(5106, 5106)),
+  Box(Box(5107, 5107), Box(5107, 5107)),
+  Box(Box(5108, 5108), Box(5108, 5108)),
+  Box(Box(5109, 5109), Box(5109, 5109)),
+  Box(Box(5110, 5110), Box(5110, 5110)),
+  Box(Box(5111, 5111), Box(5111, 5111)),
+  Box(Box(5112, 5112), Box(5112, 5112)),
+  Box(Box(5113, 5113), Box(5113, 5113)),
+  Box(Box(5114, 5114), Box(5114, 5114)),
+  Box(Box(5115, 5115), Box(5115, 5115)),
+  Box(Box(5116, 5116), Box(5116, 5116)),
+  Box(Box(5117, 5117), Box(5117, 5117)),
+  Box(Box(5118, 5118), Box(5118, 5118)),
+  Box(Box(5119, 5119), Box(5119, 5119)),
+  Box(Box(5120, 5120), Box(5120, 5120)),
+  Box(Box(5121, 5121), Box(5121, 5121)),
+  Box(Box(5122, 5122), Box(5122, 5122)),
+  Box(Box(5123, 5123), Box(5123, 5123)),
+  Box(Box(5124, 5124), Box(5124, 5124)),
+  Box(Box(5125, 5125), Box(5125, 5125)),
+  Box(Box(5126, 5126), Box(5126, 5126)),
+  Box(Box(5127, 5127), Box(5127, 5127)),
+  Box(Box(5128, 5128), Box(5128, 5128)),
+  Box(Box(5129, 5129), Box(5129, 5129)),
+  Box(Box(5130, 5130), Box(5130, 5130)),
+  Box(Box(5131, 5131), Box(5131, 5131)),
+  Box(Box(5132, 5132), Box(5132, 5132)),
+  Box(Box(5133, 5133), Box(5133, 5133)),
+  Box(Box(5134, 5134), Box(5134, 5134)),
+  Box(Box(5135, 5135), Box(5135, 5135)),
+  Box(Box(5136, 5136), Box(5136, 5136)),
+  Box(Box(5137, 5137), Box(5137, 5137)),
+  Box(Box(5138, 5138), Box(5138, 5138)),
+  Box(Box(5139, 5139), Box(5139, 5139)),
+  Box(Box(5140, 5140), Box(5140, 5140)),
+  Box(Box(5141, 5141), Box(5141, 5141)),
+  Box(Box(5142, 5142), Box(5142, 5142)),
+  Box(Box(5143, 5143), Box(5143, 5143)),
+  Box(Box(5144, 5144), Box(5144, 5144)),
+  Box(Box(5145, 5145), Box(5145, 5145)),
+  Box(Box(5146, 5146), Box(5146, 5146)),
+  Box(Box(5147, 5147), Box(5147, 5147)),
+  Box(Box(5148, 5148), Box(5148, 5148)),
+  Box(Box(5149, 5149), Box(5149, 5149)),
+  Box(Box(5150, 5150), Box(5150, 5150)),
+  Box(Box(5151, 5151), Box(5151, 5151)),
+  Box(Box(5152, 5152), Box(5152, 5152)),
+  Box(Box(5153, 5153), Box(5153, 5153)),
+  Box(Box(5154, 5154), Box(5154, 5154)),
+  Box(Box(5155, 5155), Box(5155, 5155)),
+  Box(Box(5156, 5156), Box(5156, 5156)),
+  Box(Box(5157, 5157), Box(5157, 5157)),
+  Box(Box(5158, 5158), Box(5158, 5158)),
+  Box(Box(5159, 5159), Box(5159, 5159)),
+  Box(Box(5160, 5160), Box(5160, 5160)),
+  Box(Box(5161, 5161), Box(5161, 5161)),
+  Box(Box(5162, 5162), Box(5162, 5162)),
+  Box(Box(5163, 5163), Box(5163, 5163)),
+  Box(Box(5164, 5164), Box(5164, 5164)),
+  Box(Box(5165, 5165), Box(5165, 5165)),
+  Box(Box(5166, 5166), Box(5166, 5166)),
+  Box(Box(5167, 5167), Box(5167, 5167)),
+  Box(Box(5168, 5168), Box(5168, 5168)),
+  Box(Box(5169, 5169), Box(5169, 5169)),
+  Box(Box(5170, 5170), Box(5170, 5170)),
+  Box(Box(5171, 5171), Box(5171, 5171)),
+  Box(Box(5172, 5172), Box(5172, 5172)),
+  Box(Box(5173, 5173), Box(5173, 5173)),
+  Box(Box(5174, 5174), Box(5174, 5174)),
+  Box(Box(5175, 5175), Box(5175, 5175)),
+  Box(Box(5176, 5176), Box(5176, 5176)),
+  Box(Box(5177, 5177), Box(5177, 5177)),
+  Box(Box(5178, 5178), Box(5178, 5178)),
+  Box(Box(5179, 5179), Box(5179, 5179)),
+  Box(Box(5180, 5180), Box(5180, 5180)),
+  Box(Box(5181, 5181), Box(5181, 5181)),
+  Box(Box(5182, 5182), Box(5182, 5182)),
+  Box(Box(5183, 5183), Box(5183, 5183)),
+  Box(Box(5184, 5184), Box(5184, 5184)),
+  Box(Box(5185, 5185), Box(5185, 5185)),
+  Box(Box(5186, 5186), Box(5186, 5186)),
+  Box(Box(5187, 5187), Box(5187, 5187)),
+  Box(Box(5188, 5188), Box(5188, 5188)),
+  Box(Box(5189, 5189), Box(5189, 5189)),
+  Box(Box(5190, 5190), Box(5190, 5190)),
+  Box(Box(5191, 5191), Box(5191, 5191)),
+  Box(Box(5192, 5192), Box(5192, 5192)),
+  Box(Box(5193, 5193), Box(5193, 5193)),
+  Box(Box(5194, 5194), Box(5194, 5194)),
+  Box(Box(5195, 5195), Box(5195, 5195)),
+  Box(Box(5196, 5196), Box(5196, 5196)),
+  Box(Box(5197, 5197), Box(5197, 5197)),
+  Box(Box(5198, 5198), Box(5198, 5198)),
+  Box(Box(5199, 5199), Box(5199, 5199)),
+  Box(Box(5200, 5200), Box(5200, 5200)),
+  Box(Box(5201, 5201), Box(5201, 5201)),
+  Box(Box(5202, 5202), Box(5202, 5202)),
+  Box(Box(5203, 5203), Box(5203, 5203)),
+  Box(Box(5204, 5204), Box(5204, 5204)),
+  Box(Box(5205, 5205), Box(5205, 5205)),
+  Box(Box(5206, 5206), Box(5206, 5206)),
+  Box(Box(5207, 5207), Box(5207, 5207)),
+  Box(Box(5208, 5208), Box(5208, 5208)),
+  Box(Box(5209, 5209), Box(5209, 5209)),
+  Box(Box(5210, 5210), Box(5210, 5210)),
+  Box(Box(5211, 5211), Box(5211, 5211)),
+  Box(Box(5212, 5212), Box(5212, 5212)),
+  Box(Box(5213, 5213), Box(5213, 5213)),
+  Box(Box(5214, 5214), Box(5214, 5214)),
+  Box(Box(5215, 5215), Box(5215, 5215)),
+  Box(Box(5216, 5216), Box(5216, 5216)),
+  Box(Box(5217, 5217), Box(5217, 5217)),
+  Box(Box(5218, 5218), Box(5218, 5218)),
+  Box(Box(5219, 5219), Box(5219, 5219)),
+  Box(Box(5220, 5220), Box(5220, 5220)),
+  Box(Box(5221, 5221), Box(5221, 5221)),
+  Box(Box(5222, 5222), Box(5222, 5222)),
+  Box(Box(5223, 5223), Box(5223, 5223)),
+  Box(Box(5224, 5224), Box(5224, 5224)),
+  Box(Box(5225, 5225), Box(5225, 5225)),
+  Box(Box(5226, 5226), Box(5226, 5226)),
+  Box(Box(5227, 5227), Box(5227, 5227)),
+  Box(Box(5228, 5228), Box(5228, 5228)),
+  Box(Box(5229, 5229), Box(5229, 5229)),
+  Box(Box(5230, 5230), Box(5230, 5230)),
+  Box(Box(5231, 5231), Box(5231, 5231)),
+  Box(Box(5232, 5232), Box(5232, 5232)),
+  Box(Box(5233, 5233), Box(5233, 5233)),
+  Box(Box(5234, 5234), Box(5234, 5234)),
+  Box(Box(5235, 5235), Box(5235, 5235)),
+  Box(Box(5236, 5236), Box(5236, 5236)),
+  Box(Box(5237, 5237), Box(5237, 5237)),
+  Box(Box(5238, 5238), Box(5238, 5238)),
+  Box(Box(5239, 5239), Box(5239, 5239)),
+  Box(Box(5240, 5240), Box(5240, 5240)),
+  Box(Box(5241, 5241), Box(5241, 5241)),
+  Box(Box(5242, 5242), Box(5242, 5242)),
+  Box(Box(5243, 5243), Box(5243, 5243)),
+  Box(Box(5244, 5244), Box(5244, 5244)),
+  Box(Box(5245, 5245), Box(5245, 5245)),
+  Box(Box(5246, 5246), Box(5246, 5246)),
+  Box(Box(5247, 5247), Box(5247, 5247)),
+  Box(Box(5248, 5248), Box(5248, 5248)),
+  Box(Box(5249, 5249), Box(5249, 5249)),
+  Box(Box(5250, 5250), Box(5250, 5250)),
+  Box(Box(5251, 5251), Box(5251, 5251)),
+  Box(Box(5252, 5252), Box(5252, 5252)),
+  Box(Box(5253, 5253), Box(5253, 5253)),
+  Box(Box(5254, 5254), Box(5254, 5254)),
+  Box(Box(5255, 5255), Box(5255, 5255)),
+  Box(Box(5256, 5256), Box(5256, 5256)),
+  Box(Box(5257, 5257), Box(5257, 5257)),
+  Box(Box(5258, 5258), Box(5258, 5258)),
+  Box(Box(5259, 5259), Box(5259, 5259)),
+  Box(Box(5260, 5260), Box(5260, 5260)),
+  Box(Box(5261, 5261), Box(5261, 5261)),
+  Box(Box(5262, 5262), Box(5262, 5262)),
+  Box(Box(5263, 5263), Box(5263, 5263)),
+  Box(Box(5264, 5264), Box(5264, 5264)),
+  Box(Box(5265, 5265), Box(5265, 5265)),
+  Box(Box(5266, 5266), Box(5266, 5266)),
+  Box(Box(5267, 5267), Box(5267, 5267)),
+  Box(Box(5268, 5268), Box(5268, 5268)),
+  Box(Box(5269, 5269), Box(5269, 5269)),
+  Box(Box(5270, 5270), Box(5270, 5270)),
+  Box(Box(5271, 5271), Box(5271, 5271)),
+  Box(Box(5272, 5272), Box(5272, 5272)),
+  Box(Box(5273, 5273), Box(5273, 5273)),
+  Box(Box(5274, 5274), Box(5274, 5274)),
+  Box(Box(5275, 5275), Box(5275, 5275)),
+  Box(Box(5276, 5276), Box(5276, 5276)),
+  Box(Box(5277, 5277), Box(5277, 5277)),
+  Box(Box(5278, 5278), Box(5278, 5278)),
+  Box(Box(5279, 5279), Box(5279, 5279)),
+  Box(Box(5280, 5280), Box(5280, 5280)),
+  Box(Box(5281, 5281), Box(5281, 5281)),
+  Box(Box(5282, 5282), Box(5282, 5282)),
+  Box(Box(5283, 5283), Box(5283, 5283)),
+  Box(Box(5284, 5284), Box(5284, 5284)),
+  Box(Box(5285, 5285), Box(5285, 5285)),
+  Box(Box(5286, 5286), Box(5286, 5286)),
+  Box(Box(5287, 5287), Box(5287, 5287)),
+  Box(Box(5288, 5288), Box(5288, 5288)),
+  Box(Box(5289, 5289), Box(5289, 5289)),
+  Box(Box(5290, 5290), Box(5290, 5290)),
+  Box(Box(5291, 5291), Box(5291, 5291)),
+  Box(Box(5292, 5292), Box(5292, 5292)),
+  Box(Box(5293, 5293), Box(5293, 5293)),
+  Box(Box(5294, 5294), Box(5294, 5294)),
+  Box(Box(5295, 5295), Box(5295, 5295)),
+  Box(Box(5296, 5296), Box(5296, 5296)),
+  Box(Box(5297, 5297), Box(5297, 5297)),
+  Box(Box(5298, 5298), Box(5298, 5298)),
+  Box(Box(5299, 5299), Box(5299, 5299)),
+  Box(Box(5300, 5300), Box(5300, 5300)),
+  Box(Box(5301, 5301), Box(5301, 5301)),
+  Box(Box(5302, 5302), Box(5302, 5302)),
+  Box(Box(5303, 5303), Box(5303, 5303)),
+  Box(Box(5304, 5304), Box(5304, 5304)),
+  Box(Box(5305, 5305), Box(5305, 5305)),
+  Box(Box(5306, 5306), Box(5306, 5306)),
+  Box(Box(5307, 5307), Box(5307, 5307)),
+  Box(Box(5308, 5308), Box(5308, 5308)),
+  Box(Box(5309, 5309), Box(5309, 5309)),
+  Box(Box(5310, 5310), Box(5310, 5310)),
+  Box(Box(5311, 5311), Box(5311, 5311)),
+  Box(Box(5312, 5312), Box(5312, 5312)),
+  Box(Box(5313, 5313), Box(5313, 5313)),
+  Box(Box(5314, 5314), Box(5314, 5314)),
+  Box(Box(5315, 5315), Box(5315, 5315)),
+  Box(Box(5316, 5316), Box(5316, 5316)),
+  Box(Box(5317, 5317), Box(5317, 5317)),
+  Box(Box(5318, 5318), Box(5318, 5318)),
+  Box(Box(5319, 5319), Box(5319, 5319)),
+  Box(Box(5320, 5320), Box(5320, 5320)),
+  Box(Box(5321, 5321), Box(5321, 5321)),
+  Box(Box(5322, 5322), Box(5322, 5322)),
+  Box(Box(5323, 5323), Box(5323, 5323)),
+  Box(Box(5324, 5324), Box(5324, 5324)),
+  Box(Box(5325, 5325), Box(5325, 5325)),
+  Box(Box(5326, 5326), Box(5326, 5326)),
+  Box(Box(5327, 5327), Box(5327, 5327)),
+  Box(Box(5328, 5328), Box(5328, 5328)),
+  Box(Box(5329, 5329), Box(5329, 5329)),
+  Box(Box(5330, 5330), Box(5330, 5330)),
+  Box(Box(5331, 5331), Box(5331, 5331)),
+  Box(Box(5332, 5332), Box(5332, 5332)),
+  Box(Box(5333, 5333), Box(5333, 5333)),
+  Box(Box(5334, 5334), Box(5334, 5334)),
+  Box(Box(5335, 5335), Box(5335, 5335)),
+  Box(Box(5336, 5336), Box(5336, 5336)),
+  Box(Box(5337, 5337), Box(5337, 5337)),
+  Box(Box(5338, 5338), Box(5338, 5338)),
+  Box(Box(5339, 5339), Box(5339, 5339)),
+  Box(Box(5340, 5340), Box(5340, 5340)),
+  Box(Box(5341, 5341), Box(5341, 5341)),
+  Box(Box(5342, 5342), Box(5342, 5342)),
+  Box(Box(5343, 5343), Box(5343, 5343)),
+  Box(Box(5344, 5344), Box(5344, 5344)),
+  Box(Box(5345, 5345), Box(5345, 5345)),
+  Box(Box(5346, 5346), Box(5346, 5346)),
+  Box(Box(5347, 5347), Box(5347, 5347)),
+  Box(Box(5348, 5348), Box(5348, 5348)),
+  Box(Box(5349, 5349), Box(5349, 5349)),
+  Box(Box(5350, 5350), Box(5350, 5350)),
+  Box(Box(5351, 5351), Box(5351, 5351)),
+  Box(Box(5352, 5352), Box(5352, 5352)),
+  Box(Box(5353, 5353), Box(5353, 5353)),
+  Box(Box(5354, 5354), Box(5354, 5354)),
+  Box(Box(5355, 5355), Box(5355, 5355)),
+  Box(Box(5356, 5356), Box(5356, 5356)),
+  Box(Box(5357, 5357), Box(5357, 5357)),
+  Box(Box(5358, 5358), Box(5358, 5358)),
+  Box(Box(5359, 5359), Box(5359, 5359)),
+  Box(Box(5360, 5360), Box(5360, 5360)),
+  Box(Box(5361, 5361), Box(5361, 5361)),
+  Box(Box(5362, 5362), Box(5362, 5362)),
+  Box(Box(5363, 5363), Box(5363, 5363)),
+  Box(Box(5364, 5364), Box(5364, 5364)),
+  Box(Box(5365, 5365), Box(5365, 5365)),
+  Box(Box(5366, 5366), Box(5366, 5366)),
+  Box(Box(5367, 5367), Box(5367, 5367)),
+  Box(Box(5368, 5368), Box(5368, 5368)),
+  Box(Box(5369, 5369), Box(5369, 5369)),
+  Box(Box(5370, 5370), Box(5370, 5370)),
+  Box(Box(5371, 5371), Box(5371, 5371)),
+  Box(Box(5372, 5372), Box(5372, 5372)),
+  Box(Box(5373, 5373), Box(5373, 5373)),
+  Box(Box(5374, 5374), Box(5374, 5374)),
+  Box(Box(5375, 5375), Box(5375, 5375)),
+  Box(Box(5376, 5376), Box(5376, 5376)),
+  Box(Box(5377, 5377), Box(5377, 5377)),
+  Box(Box(5378, 5378), Box(5378, 5378)),
+  Box(Box(5379, 5379), Box(5379, 5379)),
+  Box(Box(5380, 5380), Box(5380, 5380)),
+  Box(Box(5381, 5381), Box(5381, 5381)),
+  Box(Box(5382, 5382), Box(5382, 5382)),
+  Box(Box(5383, 5383), Box(5383, 5383)),
+  Box(Box(5384, 5384), Box(5384, 5384)),
+  Box(Box(5385, 5385), Box(5385, 5385)),
+  Box(Box(5386, 5386), Box(5386, 5386)),
+  Box(Box(5387, 5387), Box(5387, 5387)),
+  Box(Box(5388, 5388), Box(5388, 5388)),
+  Box(Box(5389, 5389), Box(5389, 5389)),
+  Box(Box(5390, 5390), Box(5390, 5390)),
+  Box(Box(5391, 5391), Box(5391, 5391)),
+  Box(Box(5392, 5392), Box(5392, 5392)),
+  Box(Box(5393, 5393), Box(5393, 5393)),
+  Box(Box(5394, 5394), Box(5394, 5394)),
+  Box(Box(5395, 5395), Box(5395, 5395)),
+  Box(Box(5396, 5396), Box(5396, 5396)),
+  Box(Box(5397, 5397), Box(5397, 5397)),
+  Box(Box(5398, 5398), Box(5398, 5398)),
+  Box(Box(5399, 5399), Box(5399, 5399)),
+  Box(Box(5400, 5400), Box(5400, 5400)),
+  Box(Box(5401, 5401), Box(5401, 5401)),
+  Box(Box(5402, 5402), Box(5402, 5402)),
+  Box(Box(5403, 5403), Box(5403, 5403)),
+  Box(Box(5404, 5404), Box(5404, 5404)),
+  Box(Box(5405, 5405), Box(5405, 5405)),
+  Box(Box(5406, 5406), Box(5406, 5406)),
+  Box(Box(5407, 5407), Box(5407, 5407)),
+  Box(Box(5408, 5408), Box(5408, 5408)),
+  Box(Box(5409, 5409), Box(5409, 5409)),
+  Box(Box(5410, 5410), Box(5410, 5410)),
+  Box(Box(5411, 5411), Box(5411, 5411)),
+  Box(Box(5412, 5412), Box(5412, 5412)),
+  Box(Box(5413, 5413), Box(5413, 5413)),
+  Box(Box(5414, 5414), Box(5414, 5414)),
+  Box(Box(5415, 5415), Box(5415, 5415)),
+  Box(Box(5416, 5416), Box(5416, 5416)),
+  Box(Box(5417, 5417), Box(5417, 5417)),
+  Box(Box(5418, 5418), Box(5418, 5418)),
+  Box(Box(5419, 5419), Box(5419, 5419)),
+  Box(Box(5420, 5420), Box(5420, 5420)),
+  Box(Box(5421, 5421), Box(5421, 5421)),
+  Box(Box(5422, 5422), Box(5422, 5422)),
+  Box(Box(5423, 5423), Box(5423, 5423)),
+  Box(Box(5424, 5424), Box(5424, 5424)),
+  Box(Box(5425, 5425), Box(5425, 5425)),
+  Box(Box(5426, 5426), Box(5426, 5426)),
+  Box(Box(5427, 5427), Box(5427, 5427)),
+  Box(Box(5428, 5428), Box(5428, 5428)),
+  Box(Box(5429, 5429), Box(5429, 5429)),
+  Box(Box(5430, 5430), Box(5430, 5430)),
+  Box(Box(5431, 5431), Box(5431, 5431)),
+  Box(Box(5432, 5432), Box(5432, 5432)),
+  Box(Box(5433, 5433), Box(5433, 5433)),
+  Box(Box(5434, 5434), Box(5434, 5434)),
+  Box(Box(5435, 5435), Box(5435, 5435)),
+  Box(Box(5436, 5436), Box(5436, 5436)),
+  Box(Box(5437, 5437), Box(5437, 5437)),
+  Box(Box(5438, 5438), Box(5438, 5438)),
+  Box(Box(5439, 5439), Box(5439, 5439)),
+  Box(Box(5440, 5440), Box(5440, 5440)),
+  Box(Box(5441, 5441), Box(5441, 5441)),
+  Box(Box(5442, 5442), Box(5442, 5442)),
+  Box(Box(5443, 5443), Box(5443, 5443)),
+  Box(Box(5444, 5444), Box(5444, 5444)),
+  Box(Box(5445, 5445), Box(5445, 5445)),
+  Box(Box(5446, 5446), Box(5446, 5446)),
+  Box(Box(5447, 5447), Box(5447, 5447)),
+  Box(Box(5448, 5448), Box(5448, 5448)),
+  Box(Box(5449, 5449), Box(5449, 5449)),
+  Box(Box(5450, 5450), Box(5450, 5450)),
+  Box(Box(5451, 5451), Box(5451, 5451)),
+  Box(Box(5452, 5452), Box(5452, 5452)),
+  Box(Box(5453, 5453), Box(5453, 5453)),
+  Box(Box(5454, 5454), Box(5454, 5454)),
+  Box(Box(5455, 5455), Box(5455, 5455)),
+  Box(Box(5456, 5456), Box(5456, 5456)),
+  Box(Box(5457, 5457), Box(5457, 5457)),
+  Box(Box(5458, 5458), Box(5458, 5458)),
+  Box(Box(5459, 5459), Box(5459, 5459)),
+  Box(Box(5460, 5460), Box(5460, 5460)),
+  Box(Box(5461, 5461), Box(5461, 5461)),
+  Box(Box(5462, 5462), Box(5462, 5462)),
+  Box(Box(5463, 5463), Box(5463, 5463)),
+  Box(Box(5464, 5464), Box(5464, 5464)),
+  Box(Box(5465, 5465), Box(5465, 5465)),
+  Box(Box(5466, 5466), Box(5466, 5466)),
+  Box(Box(5467, 5467), Box(5467, 5467)),
+  Box(Box(5468, 5468), Box(5468, 5468)),
+  Box(Box(5469, 5469), Box(5469, 5469)),
+  Box(Box(5470, 5470), Box(5470, 5470)),
+  Box(Box(5471, 5471), Box(5471, 5471)),
+  Box(Box(5472, 5472), Box(5472, 5472)),
+  Box(Box(5473, 5473), Box(5473, 5473)),
+  Box(Box(5474, 5474), Box(5474, 5474)),
+  Box(Box(5475, 5475), Box(5475, 5475)),
+  Box(Box(5476, 5476), Box(5476, 5476)),
+  Box(Box(5477, 5477), Box(5477, 5477)),
+  Box(Box(5478, 5478), Box(5478, 5478)),
+  Box(Box(5479, 5479), Box(5479, 5479)),
+  Box(Box(5480, 5480), Box(5480, 5480)),
+  Box(Box(5481, 5481), Box(5481, 5481)),
+  Box(Box(5482, 5482), Box(5482, 5482)),
+  Box(Box(5483, 5483), Box(5483, 5483)),
+  Box(Box(5484, 5484), Box(5484, 5484)),
+  Box(Box(5485, 5485), Box(5485, 5485)),
+  Box(Box(5486, 5486), Box(5486, 5486)),
+  Box(Box(5487, 5487), Box(5487, 5487)),
+  Box(Box(5488, 5488), Box(5488, 5488)),
+  Box(Box(5489, 5489), Box(5489, 5489)),
+  Box(Box(5490, 5490), Box(5490, 5490)),
+  Box(Box(5491, 5491), Box(5491, 5491)),
+  Box(Box(5492, 5492), Box(5492, 5492)),
+  Box(Box(5493, 5493), Box(5493, 5493)),
+  Box(Box(5494, 5494), Box(5494, 5494)),
+  Box(Box(5495, 5495), Box(5495, 5495)),
+  Box(Box(5496, 5496), Box(5496, 5496)),
+  Box(Box(5497, 5497), Box(5497, 5497)),
+  Box(Box(5498, 5498), Box(5498, 5498)),
+  Box(Box(5499, 5499), Box(5499, 5499)),
+  Box(Box(5500, 5500), Box(5500, 5500)),
+  Box(Box(5501, 5501), Box(5501, 5501)),
+  Box(Box(5502, 5502), Box(5502, 5502)),
+  Box(Box(5503, 5503), Box(5503, 5503)),
+  Box(Box(5504, 5504), Box(5504, 5504)),
+  Box(Box(5505, 5505), Box(5505, 5505)),
+  Box(Box(5506, 5506), Box(5506, 5506)),
+  Box(Box(5507, 5507), Box(5507, 5507)),
+  Box(Box(5508, 5508), Box(5508, 5508)),
+  Box(Box(5509, 5509), Box(5509, 5509)),
+  Box(Box(5510, 5510), Box(5510, 5510)),
+  Box(Box(5511, 5511), Box(5511, 5511)),
+  Box(Box(5512, 5512), Box(5512, 5512)),
+  Box(Box(5513, 5513), Box(5513, 5513)),
+  Box(Box(5514, 5514), Box(5514, 5514)),
+  Box(Box(5515, 5515), Box(5515, 5515)),
+  Box(Box(5516, 5516), Box(5516, 5516)),
+  Box(Box(5517, 5517), Box(5517, 5517)),
+  Box(Box(5518, 5518), Box(5518, 5518)),
+  Box(Box(5519, 5519), Box(5519, 5519)),
+  Box(Box(5520, 5520), Box(5520, 5520)),
+  Box(Box(5521, 5521), Box(5521, 5521)),
+  Box(Box(5522, 5522), Box(5522, 5522)),
+  Box(Box(5523, 5523), Box(5523, 5523)),
+  Box(Box(5524, 5524), Box(5524, 5524)),
+  Box(Box(5525, 5525), Box(5525, 5525)),
+  Box(Box(5526, 5526), Box(5526, 5526)),
+  Box(Box(5527, 5527), Box(5527, 5527)),
+  Box(Box(5528, 5528), Box(5528, 5528)),
+  Box(Box(5529, 5529), Box(5529, 5529)),
+  Box(Box(5530, 5530), Box(5530, 5530)),
+  Box(Box(5531, 5531), Box(5531, 5531)),
+  Box(Box(5532, 5532), Box(5532, 5532)),
+  Box(Box(5533, 5533), Box(5533, 5533)),
+  Box(Box(5534, 5534), Box(5534, 5534)),
+  Box(Box(5535, 5535), Box(5535, 5535)),
+  Box(Box(5536, 5536), Box(5536, 5536)),
+  Box(Box(5537, 5537), Box(5537, 5537)),
+  Box(Box(5538, 5538), Box(5538, 5538)),
+  Box(Box(5539, 5539), Box(5539, 5539)),
+  Box(Box(5540, 5540), Box(5540, 5540)),
+  Box(Box(5541, 5541), Box(5541, 5541)),
+  Box(Box(5542, 5542), Box(5542, 5542)),
+  Box(Box(5543, 5543), Box(5543, 5543)),
+  Box(Box(5544, 5544), Box(5544, 5544)),
+  Box(Box(5545, 5545), Box(5545, 5545)),
+  Box(Box(5546, 5546), Box(5546, 5546)),
+  Box(Box(5547, 5547), Box(5547, 5547)),
+  Box(Box(5548, 5548), Box(5548, 5548)),
+  Box(Box(5549, 5549), Box(5549, 5549)),
+  Box(Box(5550, 5550), Box(5550, 5550)),
+  Box(Box(5551, 5551), Box(5551, 5551)),
+  Box(Box(5552, 5552), Box(5552, 5552)),
+  Box(Box(5553, 5553), Box(5553, 5553)),
+  Box(Box(5554, 5554), Box(5554, 5554)),
+  Box(Box(5555, 5555), Box(5555, 5555)),
+  Box(Box(5556, 5556), Box(5556, 5556)),
+  Box(Box(5557, 5557), Box(5557, 5557)),
+  Box(Box(5558, 5558), Box(5558, 5558)),
+  Box(Box(5559, 5559), Box(5559, 5559)),
+  Box(Box(5560, 5560), Box(5560, 5560)),
+  Box(Box(5561, 5561), Box(5561, 5561)),
+  Box(Box(5562, 5562), Box(5562, 5562)),
+  Box(Box(5563, 5563), Box(5563, 5563)),
+  Box(Box(5564, 5564), Box(5564, 5564)),
+  Box(Box(5565, 5565), Box(5565, 5565)),
+  Box(Box(5566, 5566), Box(5566, 5566)),
+  Box(Box(5567, 5567), Box(5567, 5567)),
+  Box(Box(5568, 5568), Box(5568, 5568)),
+  Box(Box(5569, 5569), Box(5569, 5569)),
+  Box(Box(5570, 5570), Box(5570, 5570)),
+  Box(Box(5571, 5571), Box(5571, 5571)),
+  Box(Box(5572, 5572), Box(5572, 5572)),
+  Box(Box(5573, 5573), Box(5573, 5573)),
+  Box(Box(5574, 5574), Box(5574, 5574)),
+  Box(Box(5575, 5575), Box(5575, 5575)),
+  Box(Box(5576, 5576), Box(5576, 5576)),
+  Box(Box(5577, 5577), Box(5577, 5577)),
+  Box(Box(5578, 5578), Box(5578, 5578)),
+  Box(Box(5579, 5579), Box(5579, 5579)),
+  Box(Box(5580, 5580), Box(5580, 5580)),
+  Box(Box(5581, 5581), Box(5581, 5581)),
+  Box(Box(5582, 5582), Box(5582, 5582)),
+  Box(Box(5583, 5583), Box(5583, 5583)),
+  Box(Box(5584, 5584), Box(5584, 5584)),
+  Box(Box(5585, 5585), Box(5585, 5585)),
+  Box(Box(5586, 5586), Box(5586, 5586)),
+  Box(Box(5587, 5587), Box(5587, 5587)),
+  Box(Box(5588, 5588), Box(5588, 5588)),
+  Box(Box(5589, 5589), Box(5589, 5589)),
+  Box(Box(5590, 5590), Box(5590, 5590)),
+  Box(Box(5591, 5591), Box(5591, 5591)),
+  Box(Box(5592, 5592), Box(5592, 5592)),
+  Box(Box(5593, 5593), Box(5593, 5593)),
+  Box(Box(5594, 5594), Box(5594, 5594)),
+  Box(Box(5595, 5595), Box(5595, 5595)),
+  Box(Box(5596, 5596), Box(5596, 5596)),
+  Box(Box(5597, 5597), Box(5597, 5597)),
+  Box(Box(5598, 5598), Box(5598, 5598)),
+  Box(Box(5599, 5599), Box(5599, 5599)),
+  Box(Box(5600, 5600), Box(5600, 5600)),
+  Box(Box(5601, 5601), Box(5601, 5601)),
+  Box(Box(5602, 5602), Box(5602, 5602)),
+  Box(Box(5603, 5603), Box(5603, 5603)),
+  Box(Box(5604, 5604), Box(5604, 5604)),
+  Box(Box(5605, 5605), Box(5605, 5605)),
+  Box(Box(5606, 5606), Box(5606, 5606)),
+  Box(Box(5607, 5607), Box(5607, 5607)),
+  Box(Box(5608, 5608), Box(5608, 5608)),
+  Box(Box(5609, 5609), Box(5609, 5609)),
+  Box(Box(5610, 5610), Box(5610, 5610)),
+  Box(Box(5611, 5611), Box(5611, 5611)),
+  Box(Box(5612, 5612), Box(5612, 5612)),
+  Box(Box(5613, 5613), Box(5613, 5613)),
+  Box(Box(5614, 5614), Box(5614, 5614)),
+  Box(Box(5615, 5615), Box(5615, 5615)),
+  Box(Box(5616, 5616), Box(5616, 5616)),
+  Box(Box(5617, 5617), Box(5617, 5617)),
+  Box(Box(5618, 5618), Box(5618, 5618)),
+  Box(Box(5619, 5619), Box(5619, 5619)),
+  Box(Box(5620, 5620), Box(5620, 5620)),
+  Box(Box(5621, 5621), Box(5621, 5621)),
+  Box(Box(5622, 5622), Box(5622, 5622)),
+  Box(Box(5623, 5623), Box(5623, 5623)),
+  Box(Box(5624, 5624), Box(5624, 5624)),
+  Box(Box(5625, 5625), Box(5625, 5625)),
+  Box(Box(5626, 5626), Box(5626, 5626)),
+  Box(Box(5627, 5627), Box(5627, 5627)),
+  Box(Box(5628, 5628), Box(5628, 5628)),
+  Box(Box(5629, 5629), Box(5629, 5629)),
+  Box(Box(5630, 5630), Box(5630, 5630)),
+  Box(Box(5631, 5631), Box(5631, 5631)),
+  Box(Box(5632, 5632), Box(5632, 5632)),
+  Box(Box(5633, 5633), Box(5633, 5633)),
+  Box(Box(5634, 5634), Box(5634, 5634)),
+  Box(Box(5635, 5635), Box(5635, 5635)),
+  Box(Box(5636, 5636), Box(5636, 5636)),
+  Box(Box(5637, 5637), Box(5637, 5637)),
+  Box(Box(5638, 5638), Box(5638, 5638)),
+  Box(Box(5639, 5639), Box(5639, 5639)),
+  Box(Box(5640, 5640), Box(5640, 5640)),
+  Box(Box(5641, 5641), Box(5641, 5641)),
+  Box(Box(5642, 5642), Box(5642, 5642)),
+  Box(Box(5643, 5643), Box(5643, 5643)),
+  Box(Box(5644, 5644), Box(5644, 5644)),
+  Box(Box(5645, 5645), Box(5645, 5645)),
+  Box(Box(5646, 5646), Box(5646, 5646)),
+  Box(Box(5647, 5647), Box(5647, 5647)),
+  Box(Box(5648, 5648), Box(5648, 5648)),
+  Box(Box(5649, 5649), Box(5649, 5649)),
+  Box(Box(5650, 5650), Box(5650, 5650)),
+  Box(Box(5651, 5651), Box(5651, 5651)),
+  Box(Box(5652, 5652), Box(5652, 5652)),
+  Box(Box(5653, 5653), Box(5653, 5653)),
+  Box(Box(5654, 5654), Box(5654, 5654)),
+  Box(Box(5655, 5655), Box(5655, 5655)),
+  Box(Box(5656, 5656), Box(5656, 5656)),
+  Box(Box(5657, 5657), Box(5657, 5657)),
+  Box(Box(5658, 5658), Box(5658, 5658)),
+  Box(Box(5659, 5659), Box(5659, 5659)),
+  Box(Box(5660, 5660), Box(5660, 5660)),
+  Box(Box(5661, 5661), Box(5661, 5661)),
+  Box(Box(5662, 5662), Box(5662, 5662)),
+  Box(Box(5663, 5663), Box(5663, 5663)),
+  Box(Box(5664, 5664), Box(5664, 5664)),
+  Box(Box(5665, 5665), Box(5665, 5665)),
+  Box(Box(5666, 5666), Box(5666, 5666)),
+  Box(Box(5667, 5667), Box(5667, 5667)),
+  Box(Box(5668, 5668), Box(5668, 5668)),
+  Box(Box(5669, 5669), Box(5669, 5669)),
+  Box(Box(5670, 5670), Box(5670, 5670)),
+  Box(Box(5671, 5671), Box(5671, 5671)),
+  Box(Box(5672, 5672), Box(5672, 5672)),
+  Box(Box(5673, 5673), Box(5673, 5673)),
+  Box(Box(5674, 5674), Box(5674, 5674)),
+  Box(Box(5675, 5675), Box(5675, 5675)),
+  Box(Box(5676, 5676), Box(5676, 5676)),
+  Box(Box(5677, 5677), Box(5677, 5677)),
+  Box(Box(5678, 5678), Box(5678, 5678)),
+  Box(Box(5679, 5679), Box(5679, 5679)),
+  Box(Box(5680, 5680), Box(5680, 5680)),
+  Box(Box(5681, 5681), Box(5681, 5681)),
+  Box(Box(5682, 5682), Box(5682, 5682)),
+  Box(Box(5683, 5683), Box(5683, 5683)),
+  Box(Box(5684, 5684), Box(5684, 5684)),
+  Box(Box(5685, 5685), Box(5685, 5685)),
+  Box(Box(5686, 5686), Box(5686, 5686)),
+  Box(Box(5687, 5687), Box(5687, 5687)),
+  Box(Box(5688, 5688), Box(5688, 5688)),
+  Box(Box(5689, 5689), Box(5689, 5689)),
+  Box(Box(5690, 5690), Box(5690, 5690)),
+  Box(Box(5691, 5691), Box(5691, 5691)),
+  Box(Box(5692, 5692), Box(5692, 5692)),
+  Box(Box(5693, 5693), Box(5693, 5693)),
+  Box(Box(5694, 5694), Box(5694, 5694)),
+  Box(Box(5695, 5695), Box(5695, 5695)),
+  Box(Box(5696, 5696), Box(5696, 5696)),
+  Box(Box(5697, 5697), Box(5697, 5697)),
+  Box(Box(5698, 5698), Box(5698, 5698)),
+  Box(Box(5699, 5699), Box(5699, 5699)),
+  Box(Box(5700, 5700), Box(5700, 5700)),
+  Box(Box(5701, 5701), Box(5701, 5701)),
+  Box(Box(5702, 5702), Box(5702, 5702)),
+  Box(Box(5703, 5703), Box(5703, 5703)),
+  Box(Box(5704, 5704), Box(5704, 5704)),
+  Box(Box(5705, 5705), Box(5705, 5705)),
+  Box(Box(5706, 5706), Box(5706, 5706)),
+  Box(Box(5707, 5707), Box(5707, 5707)),
+  Box(Box(5708, 5708), Box(5708, 5708)),
+  Box(Box(5709, 5709), Box(5709, 5709)),
+  Box(Box(5710, 5710), Box(5710, 5710)),
+  Box(Box(5711, 5711), Box(5711, 5711)),
+  Box(Box(5712, 5712), Box(5712, 5712)),
+  Box(Box(5713, 5713), Box(5713, 5713)),
+  Box(Box(5714, 5714), Box(5714, 5714)),
+  Box(Box(5715, 5715), Box(5715, 5715)),
+  Box(Box(5716, 5716), Box(5716, 5716)),
+  Box(Box(5717, 5717), Box(5717, 5717)),
+  Box(Box(5718, 5718), Box(5718, 5718)),
+  Box(Box(5719, 5719), Box(5719, 5719)),
+  Box(Box(5720, 5720), Box(5720, 5720)),
+  Box(Box(5721, 5721), Box(5721, 5721)),
+  Box(Box(5722, 5722), Box(5722, 5722)),
+  Box(Box(5723, 5723), Box(5723, 5723)),
+  Box(Box(5724, 5724), Box(5724, 5724)),
+  Box(Box(5725, 5725), Box(5725, 5725)),
+  Box(Box(5726, 5726), Box(5726, 5726)),
+  Box(Box(5727, 5727), Box(5727, 5727)),
+  Box(Box(5728, 5728), Box(5728, 5728)),
+  Box(Box(5729, 5729), Box(5729, 5729)),
+  Box(Box(5730, 5730), Box(5730, 5730)),
+  Box(Box(5731, 5731), Box(5731, 5731)),
+  Box(Box(5732, 5732), Box(5732, 5732)),
+  Box(Box(5733, 5733), Box(5733, 5733)),
+  Box(Box(5734, 5734), Box(5734, 5734)),
+  Box(Box(5735, 5735), Box(5735, 5735)),
+  Box(Box(5736, 5736), Box(5736, 5736)),
+  Box(Box(5737, 5737), Box(5737, 5737)),
+  Box(Box(5738, 5738), Box(5738, 5738)),
+  Box(Box(5739, 5739), Box(5739, 5739)),
+  Box(Box(5740, 5740), Box(5740, 5740)),
+  Box(Box(5741, 5741), Box(5741, 5741)),
+  Box(Box(5742, 5742), Box(5742, 5742)),
+  Box(Box(5743, 5743), Box(5743, 5743)),
+  Box(Box(5744, 5744), Box(5744, 5744)),
+  Box(Box(5745, 5745), Box(5745, 5745)),
+  Box(Box(5746, 5746), Box(5746, 5746)),
+  Box(Box(5747, 5747), Box(5747, 5747)),
+  Box(Box(5748, 5748), Box(5748, 5748)),
+  Box(Box(5749, 5749), Box(5749, 5749)),
+  Box(Box(5750, 5750), Box(5750, 5750)),
+  Box(Box(5751, 5751), Box(5751, 5751)),
+  Box(Box(5752, 5752), Box(5752, 5752)),
+  Box(Box(5753, 5753), Box(5753, 5753)),
+  Box(Box(5754, 5754), Box(5754, 5754)),
+  Box(Box(5755, 5755), Box(5755, 5755)),
+  Box(Box(5756, 5756), Box(5756, 5756)),
+  Box(Box(5757, 5757), Box(5757, 5757)),
+  Box(Box(5758, 5758), Box(5758, 5758)),
+  Box(Box(5759, 5759), Box(5759, 5759)),
+  Box(Box(5760, 5760), Box(5760, 5760)),
+  Box(Box(5761, 5761), Box(5761, 5761)),
+  Box(Box(5762, 5762), Box(5762, 5762)),
+  Box(Box(5763, 5763), Box(5763, 5763)),
+  Box(Box(5764, 5764), Box(5764, 5764)),
+  Box(Box(5765, 5765), Box(5765, 5765)),
+  Box(Box(5766, 5766), Box(5766, 5766)),
+  Box(Box(5767, 5767), Box(5767, 5767)),
+  Box(Box(5768, 5768), Box(5768, 5768)),
+  Box(Box(5769, 5769), Box(5769, 5769)),
+  Box(Box(5770, 5770), Box(5770, 5770)),
+  Box(Box(5771, 5771), Box(5771, 5771)),
+  Box(Box(5772, 5772), Box(5772, 5772)),
+  Box(Box(5773, 5773), Box(5773, 5773)),
+  Box(Box(5774, 5774), Box(5774, 5774)),
+  Box(Box(5775, 5775), Box(5775, 5775)),
+  Box(Box(5776, 5776), Box(5776, 5776)),
+  Box(Box(5777, 5777), Box(5777, 5777)),
+  Box(Box(5778, 5778), Box(5778, 5778)),
+  Box(Box(5779, 5779), Box(5779, 5779)),
+  Box(Box(5780, 5780), Box(5780, 5780)),
+  Box(Box(5781, 5781), Box(5781, 5781)),
+  Box(Box(5782, 5782), Box(5782, 5782)),
+  Box(Box(5783, 5783), Box(5783, 5783)),
+  Box(Box(5784, 5784), Box(5784, 5784)),
+  Box(Box(5785, 5785), Box(5785, 5785)),
+  Box(Box(5786, 5786), Box(5786, 5786)),
+  Box(Box(5787, 5787), Box(5787, 5787)),
+  Box(Box(5788, 5788), Box(5788, 5788)),
+  Box(Box(5789, 5789), Box(5789, 5789)),
+  Box(Box(5790, 5790), Box(5790, 5790)),
+  Box(Box(5791, 5791), Box(5791, 5791)),
+  Box(Box(5792, 5792), Box(5792, 5792)),
+  Box(Box(5793, 5793), Box(5793, 5793)),
+  Box(Box(5794, 5794), Box(5794, 5794)),
+  Box(Box(5795, 5795), Box(5795, 5795)),
+  Box(Box(5796, 5796), Box(5796, 5796)),
+  Box(Box(5797, 5797), Box(5797, 5797)),
+  Box(Box(5798, 5798), Box(5798, 5798)),
+  Box(Box(5799, 5799), Box(5799, 5799)),
+  Box(Box(5800, 5800), Box(5800, 5800)),
+  Box(Box(5801, 5801), Box(5801, 5801)),
+  Box(Box(5802, 5802), Box(5802, 5802)),
+  Box(Box(5803, 5803), Box(5803, 5803)),
+  Box(Box(5804, 5804), Box(5804, 5804)),
+  Box(Box(5805, 5805), Box(5805, 5805)),
+  Box(Box(5806, 5806), Box(5806, 5806)),
+  Box(Box(5807, 5807), Box(5807, 5807)),
+  Box(Box(5808, 5808), Box(5808, 5808)),
+  Box(Box(5809, 5809), Box(5809, 5809)),
+  Box(Box(5810, 5810), Box(5810, 5810)),
+  Box(Box(5811, 5811), Box(5811, 5811)),
+  Box(Box(5812, 5812), Box(5812, 5812)),
+  Box(Box(5813, 5813), Box(5813, 5813)),
+  Box(Box(5814, 5814), Box(5814, 5814)),
+  Box(Box(5815, 5815), Box(5815, 5815)),
+  Box(Box(5816, 5816), Box(5816, 5816)),
+  Box(Box(5817, 5817), Box(5817, 5817)),
+  Box(Box(5818, 5818), Box(5818, 5818)),
+  Box(Box(5819, 5819), Box(5819, 5819)),
+  Box(Box(5820, 5820), Box(5820, 5820)),
+  Box(Box(5821, 5821), Box(5821, 5821)),
+  Box(Box(5822, 5822), Box(5822, 5822)),
+  Box(Box(5823, 5823), Box(5823, 5823)),
+  Box(Box(5824, 5824), Box(5824, 5824)),
+  Box(Box(5825, 5825), Box(5825, 5825)),
+  Box(Box(5826, 5826), Box(5826, 5826)),
+  Box(Box(5827, 5827), Box(5827, 5827)),
+  Box(Box(5828, 5828), Box(5828, 5828)),
+  Box(Box(5829, 5829), Box(5829, 5829)),
+  Box(Box(5830, 5830), Box(5830, 5830)),
+  Box(Box(5831, 5831), Box(5831, 5831)),
+  Box(Box(5832, 5832), Box(5832, 5832)),
+  Box(Box(5833, 5833), Box(5833, 5833)),
+  Box(Box(5834, 5834), Box(5834, 5834)),
+  Box(Box(5835, 5835), Box(5835, 5835)),
+  Box(Box(5836, 5836), Box(5836, 5836)),
+  Box(Box(5837, 5837), Box(5837, 5837)),
+  Box(Box(5838, 5838), Box(5838, 5838)),
+  Box(Box(5839, 5839), Box(5839, 5839)),
+  Box(Box(5840, 5840), Box(5840, 5840)),
+  Box(Box(5841, 5841), Box(5841, 5841)),
+  Box(Box(5842, 5842), Box(5842, 5842)),
+  Box(Box(5843, 5843), Box(5843, 5843)),
+  Box(Box(5844, 5844), Box(5844, 5844)),
+  Box(Box(5845, 5845), Box(5845, 5845)),
+  Box(Box(5846, 5846), Box(5846, 5846)),
+  Box(Box(5847, 5847), Box(5847, 5847)),
+  Box(Box(5848, 5848), Box(5848, 5848)),
+  Box(Box(5849, 5849), Box(5849, 5849)),
+  Box(Box(5850, 5850), Box(5850, 5850)),
+  Box(Box(5851, 5851), Box(5851, 5851)),
+  Box(Box(5852, 5852), Box(5852, 5852)),
+  Box(Box(5853, 5853), Box(5853, 5853)),
+  Box(Box(5854, 5854), Box(5854, 5854)),
+  Box(Box(5855, 5855), Box(5855, 5855)),
+  Box(Box(5856, 5856), Box(5856, 5856)),
+  Box(Box(5857, 5857), Box(5857, 5857)),
+  Box(Box(5858, 5858), Box(5858, 5858)),
+  Box(Box(5859, 5859), Box(5859, 5859)),
+  Box(Box(5860, 5860), Box(5860, 5860)),
+  Box(Box(5861, 5861), Box(5861, 5861)),
+  Box(Box(5862, 5862), Box(5862, 5862)),
+  Box(Box(5863, 5863), Box(5863, 5863)),
+  Box(Box(5864, 5864), Box(5864, 5864)),
+  Box(Box(5865, 5865), Box(5865, 5865)),
+  Box(Box(5866, 5866), Box(5866, 5866)),
+  Box(Box(5867, 5867), Box(5867, 5867)),
+  Box(Box(5868, 5868), Box(5868, 5868)),
+  Box(Box(5869, 5869), Box(5869, 5869)),
+  Box(Box(5870, 5870), Box(5870, 5870)),
+  Box(Box(5871, 5871), Box(5871, 5871)),
+  Box(Box(5872, 5872), Box(5872, 5872)),
+  Box(Box(5873, 5873), Box(5873, 5873)),
+  Box(Box(5874, 5874), Box(5874, 5874)),
+  Box(Box(5875, 5875), Box(5875, 5875)),
+  Box(Box(5876, 5876), Box(5876, 5876)),
+  Box(Box(5877, 5877), Box(5877, 5877)),
+  Box(Box(5878, 5878), Box(5878, 5878)),
+  Box(Box(5879, 5879), Box(5879, 5879)),
+  Box(Box(5880, 5880), Box(5880, 5880)),
+  Box(Box(5881, 5881), Box(5881, 5881)),
+  Box(Box(5882, 5882), Box(5882, 5882)),
+  Box(Box(5883, 5883), Box(5883, 5883)),
+  Box(Box(5884, 5884), Box(5884, 5884)),
+  Box(Box(5885, 5885), Box(5885, 5885)),
+  Box(Box(5886, 5886), Box(5886, 5886)),
+  Box(Box(5887, 5887), Box(5887, 5887)),
+  Box(Box(5888, 5888), Box(5888, 5888)),
+  Box(Box(5889, 5889), Box(5889, 5889)),
+  Box(Box(5890, 5890), Box(5890, 5890)),
+  Box(Box(5891, 5891), Box(5891, 5891)),
+  Box(Box(5892, 5892), Box(5892, 5892)),
+  Box(Box(5893, 5893), Box(5893, 5893)),
+  Box(Box(5894, 5894), Box(5894, 5894)),
+  Box(Box(5895, 5895), Box(5895, 5895)),
+  Box(Box(5896, 5896), Box(5896, 5896)),
+  Box(Box(5897, 5897), Box(5897, 5897)),
+  Box(Box(5898, 5898), Box(5898, 5898)),
+  Box(Box(5899, 5899), Box(5899, 5899)),
+  Box(Box(5900, 5900), Box(5900, 5900)),
+  Box(Box(5901, 5901), Box(5901, 5901)),
+  Box(Box(5902, 5902), Box(5902, 5902)),
+  Box(Box(5903, 5903), Box(5903, 5903)),
+  Box(Box(5904, 5904), Box(5904, 5904)),
+  Box(Box(5905, 5905), Box(5905, 5905)),
+  Box(Box(5906, 5906), Box(5906, 5906)),
+  Box(Box(5907, 5907), Box(5907, 5907)),
+  Box(Box(5908, 5908), Box(5908, 5908)),
+  Box(Box(5909, 5909), Box(5909, 5909)),
+  Box(Box(5910, 5910), Box(5910, 5910)),
+  Box(Box(5911, 5911), Box(5911, 5911)),
+  Box(Box(5912, 5912), Box(5912, 5912)),
+  Box(Box(5913, 5913), Box(5913, 5913)),
+  Box(Box(5914, 5914), Box(5914, 5914)),
+  Box(Box(5915, 5915), Box(5915, 5915)),
+  Box(Box(5916, 5916), Box(5916, 5916)),
+  Box(Box(5917, 5917), Box(5917, 5917)),
+  Box(Box(5918, 5918), Box(5918, 5918)),
+  Box(Box(5919, 5919), Box(5919, 5919)),
+  Box(Box(5920, 5920), Box(5920, 5920)),
+  Box(Box(5921, 5921), Box(5921, 5921)),
+  Box(Box(5922, 5922), Box(5922, 5922)),
+  Box(Box(5923, 5923), Box(5923, 5923)),
+  Box(Box(5924, 5924), Box(5924, 5924)),
+  Box(Box(5925, 5925), Box(5925, 5925)),
+  Box(Box(5926, 5926), Box(5926, 5926)),
+  Box(Box(5927, 5927), Box(5927, 5927)),
+  Box(Box(5928, 5928), Box(5928, 5928)),
+  Box(Box(5929, 5929), Box(5929, 5929)),
+  Box(Box(5930, 5930), Box(5930, 5930)),
+  Box(Box(5931, 5931), Box(5931, 5931)),
+  Box(Box(5932, 5932), Box(5932, 5932)),
+  Box(Box(5933, 5933), Box(5933, 5933)),
+  Box(Box(5934, 5934), Box(5934, 5934)),
+  Box(Box(5935, 5935), Box(5935, 5935)),
+  Box(Box(5936, 5936), Box(5936, 5936)),
+  Box(Box(5937, 5937), Box(5937, 5937)),
+  Box(Box(5938, 5938), Box(5938, 5938)),
+  Box(Box(5939, 5939), Box(5939, 5939)),
+  Box(Box(5940, 5940), Box(5940, 5940)),
+  Box(Box(5941, 5941), Box(5941, 5941)),
+  Box(Box(5942, 5942), Box(5942, 5942)),
+  Box(Box(5943, 5943), Box(5943, 5943)),
+  Box(Box(5944, 5944), Box(5944, 5944)),
+  Box(Box(5945, 5945), Box(5945, 5945)),
+  Box(Box(5946, 5946), Box(5946, 5946)),
+  Box(Box(5947, 5947), Box(5947, 5947)),
+  Box(Box(5948, 5948), Box(5948, 5948)),
+  Box(Box(5949, 5949), Box(5949, 5949)),
+  Box(Box(5950, 5950), Box(5950, 5950)),
+  Box(Box(5951, 5951), Box(5951, 5951)),
+  Box(Box(5952, 5952), Box(5952, 5952)),
+  Box(Box(5953, 5953), Box(5953, 5953)),
+  Box(Box(5954, 5954), Box(5954, 5954)),
+  Box(Box(5955, 5955), Box(5955, 5955)),
+  Box(Box(5956, 5956), Box(5956, 5956)),
+  Box(Box(5957, 5957), Box(5957, 5957)),
+  Box(Box(5958, 5958), Box(5958, 5958)),
+  Box(Box(5959, 5959), Box(5959, 5959)),
+  Box(Box(5960, 5960), Box(5960, 5960)),
+  Box(Box(5961, 5961), Box(5961, 5961)),
+  Box(Box(5962, 5962), Box(5962, 5962)),
+  Box(Box(5963, 5963), Box(5963, 5963)),
+  Box(Box(5964, 5964), Box(5964, 5964)),
+  Box(Box(5965, 5965), Box(5965, 5965)),
+  Box(Box(5966, 5966), Box(5966, 5966)),
+  Box(Box(5967, 5967), Box(5967, 5967)),
+  Box(Box(5968, 5968), Box(5968, 5968)),
+  Box(Box(5969, 5969), Box(5969, 5969)),
+  Box(Box(5970, 5970), Box(5970, 5970)),
+  Box(Box(5971, 5971), Box(5971, 5971)),
+  Box(Box(5972, 5972), Box(5972, 5972)),
+  Box(Box(5973, 5973), Box(5973, 5973)),
+  Box(Box(5974, 5974), Box(5974, 5974)),
+  Box(Box(5975, 5975), Box(5975, 5975)),
+  Box(Box(5976, 5976), Box(5976, 5976)),
+  Box(Box(5977, 5977), Box(5977, 5977)),
+  Box(Box(5978, 5978), Box(5978, 5978)),
+  Box(Box(5979, 5979), Box(5979, 5979)),
+  Box(Box(5980, 5980), Box(5980, 5980)),
+  Box(Box(5981, 5981), Box(5981, 5981)),
+  Box(Box(5982, 5982), Box(5982, 5982)),
+  Box(Box(5983, 5983), Box(5983, 5983)),
+  Box(Box(5984, 5984), Box(5984, 5984)),
+  Box(Box(5985, 5985), Box(5985, 5985)),
+  Box(Box(5986, 5986), Box(5986, 5986)),
+  Box(Box(5987, 5987), Box(5987, 5987)),
+  Box(Box(5988, 5988), Box(5988, 5988)),
+  Box(Box(5989, 5989), Box(5989, 5989)),
+  Box(Box(5990, 5990), Box(5990, 5990)),
+  Box(Box(5991, 5991), Box(5991, 5991)),
+  Box(Box(5992, 5992), Box(5992, 5992)),
+  Box(Box(5993, 5993), Box(5993, 5993)),
+  Box(Box(5994, 5994), Box(5994, 5994)),
+  Box(Box(5995, 5995), Box(5995, 5995)),
+  Box(Box(5996, 5996), Box(5996, 5996)),
+  Box(Box(5997, 5997), Box(5997, 5997)),
+  Box(Box(5998, 5998), Box(5998, 5998)),
+  Box(Box(5999, 5999), Box(5999, 5999)),
+  Box(Box(6000, 6000), Box(6000, 6000)),
+  Box(Box(6001, 6001), Box(6001, 6001)),
+  Box(Box(6002, 6002), Box(6002, 6002)),
+  Box(Box(6003, 6003), Box(6003, 6003)),
+  Box(Box(6004, 6004), Box(6004, 6004)),
+  Box(Box(6005, 6005), Box(6005, 6005)),
+  Box(Box(6006, 6006), Box(6006, 6006)),
+  Box(Box(6007, 6007), Box(6007, 6007)),
+  Box(Box(6008, 6008), Box(6008, 6008)),
+  Box(Box(6009, 6009), Box(6009, 6009)),
+  Box(Box(6010, 6010), Box(6010, 6010)),
+  Box(Box(6011, 6011), Box(6011, 6011)),
+  Box(Box(6012, 6012), Box(6012, 6012)),
+  Box(Box(6013, 6013), Box(6013, 6013)),
+  Box(Box(6014, 6014), Box(6014, 6014)),
+  Box(Box(6015, 6015), Box(6015, 6015)),
+  Box(Box(6016, 6016), Box(6016, 6016)),
+  Box(Box(6017, 6017), Box(6017, 6017)),
+  Box(Box(6018, 6018), Box(6018, 6018)),
+  Box(Box(6019, 6019), Box(6019, 6019)),
+  Box(Box(6020, 6020), Box(6020, 6020)),
+  Box(Box(6021, 6021), Box(6021, 6021)),
+  Box(Box(6022, 6022), Box(6022, 6022)),
+  Box(Box(6023, 6023), Box(6023, 6023)),
+  Box(Box(6024, 6024), Box(6024, 6024)),
+  Box(Box(6025, 6025), Box(6025, 6025)),
+  Box(Box(6026, 6026), Box(6026, 6026)),
+  Box(Box(6027, 6027), Box(6027, 6027)),
+  Box(Box(6028, 6028), Box(6028, 6028)),
+  Box(Box(6029, 6029), Box(6029, 6029)),
+  Box(Box(6030, 6030), Box(6030, 6030)),
+  Box(Box(6031, 6031), Box(6031, 6031)),
+  Box(Box(6032, 6032), Box(6032, 6032)),
+  Box(Box(6033, 6033), Box(6033, 6033)),
+  Box(Box(6034, 6034), Box(6034, 6034)),
+  Box(Box(6035, 6035), Box(6035, 6035)),
+  Box(Box(6036, 6036), Box(6036, 6036)),
+  Box(Box(6037, 6037), Box(6037, 6037)),
+  Box(Box(6038, 6038), Box(6038, 6038)),
+  Box(Box(6039, 6039), Box(6039, 6039)),
+  Box(Box(6040, 6040), Box(6040, 6040)),
+  Box(Box(6041, 6041), Box(6041, 6041)),
+  Box(Box(6042, 6042), Box(6042, 6042)),
+  Box(Box(6043, 6043), Box(6043, 6043)),
+  Box(Box(6044, 6044), Box(6044, 6044)),
+  Box(Box(6045, 6045), Box(6045, 6045)),
+  Box(Box(6046, 6046), Box(6046, 6046)),
+  Box(Box(6047, 6047), Box(6047, 6047)),
+  Box(Box(6048, 6048), Box(6048, 6048)),
+  Box(Box(6049, 6049), Box(6049, 6049)),
+  Box(Box(6050, 6050), Box(6050, 6050)),
+  Box(Box(6051, 6051), Box(6051, 6051)),
+  Box(Box(6052, 6052), Box(6052, 6052)),
+  Box(Box(6053, 6053), Box(6053, 6053)),
+  Box(Box(6054, 6054), Box(6054, 6054)),
+  Box(Box(6055, 6055), Box(6055, 6055)),
+  Box(Box(6056, 6056), Box(6056, 6056)),
+  Box(Box(6057, 6057), Box(6057, 6057)),
+  Box(Box(6058, 6058), Box(6058, 6058)),
+  Box(Box(6059, 6059), Box(6059, 6059)),
+  Box(Box(6060, 6060), Box(6060, 6060)),
+  Box(Box(6061, 6061), Box(6061, 6061)),
+  Box(Box(6062, 6062), Box(6062, 6062)),
+  Box(Box(6063, 6063), Box(6063, 6063)),
+  Box(Box(6064, 6064), Box(6064, 6064)),
+  Box(Box(6065, 6065), Box(6065, 6065)),
+  Box(Box(6066, 6066), Box(6066, 6066)),
+  Box(Box(6067, 6067), Box(6067, 6067)),
+  Box(Box(6068, 6068), Box(6068, 6068)),
+  Box(Box(6069, 6069), Box(6069, 6069)),
+  Box(Box(6070, 6070), Box(6070, 6070)),
+  Box(Box(6071, 6071), Box(6071, 6071)),
+  Box(Box(6072, 6072), Box(6072, 6072)),
+  Box(Box(6073, 6073), Box(6073, 6073)),
+  Box(Box(6074, 6074), Box(6074, 6074)),
+  Box(Box(6075, 6075), Box(6075, 6075)),
+  Box(Box(6076, 6076), Box(6076, 6076)),
+  Box(Box(6077, 6077), Box(6077, 6077)),
+  Box(Box(6078, 6078), Box(6078, 6078)),
+  Box(Box(6079, 6079), Box(6079, 6079)),
+  Box(Box(6080, 6080), Box(6080, 6080)),
+  Box(Box(6081, 6081), Box(6081, 6081)),
+  Box(Box(6082, 6082), Box(6082, 6082)),
+  Box(Box(6083, 6083), Box(6083, 6083)),
+  Box(Box(6084, 6084), Box(6084, 6084)),
+  Box(Box(6085, 6085), Box(6085, 6085)),
+  Box(Box(6086, 6086), Box(6086, 6086)),
+  Box(Box(6087, 6087), Box(6087, 6087)),
+  Box(Box(6088, 6088), Box(6088, 6088)),
+  Box(Box(6089, 6089), Box(6089, 6089)),
+  Box(Box(6090, 6090), Box(6090, 6090)),
+  Box(Box(6091, 6091), Box(6091, 6091)),
+  Box(Box(6092, 6092), Box(6092, 6092)),
+  Box(Box(6093, 6093), Box(6093, 6093)),
+  Box(Box(6094, 6094), Box(6094, 6094)),
+  Box(Box(6095, 6095), Box(6095, 6095)),
+  Box(Box(6096, 6096), Box(6096, 6096)),
+  Box(Box(6097, 6097), Box(6097, 6097)),
+  Box(Box(6098, 6098), Box(6098, 6098)),
+  Box(Box(6099, 6099), Box(6099, 6099)),
+  Box(Box(6100, 6100), Box(6100, 6100)),
+  Box(Box(6101, 6101), Box(6101, 6101)),
+  Box(Box(6102, 6102), Box(6102, 6102)),
+  Box(Box(6103, 6103), Box(6103, 6103)),
+  Box(Box(6104, 6104), Box(6104, 6104)),
+  Box(Box(6105, 6105), Box(6105, 6105)),
+  Box(Box(6106, 6106), Box(6106, 6106)),
+  Box(Box(6107, 6107), Box(6107, 6107)),
+  Box(Box(6108, 6108), Box(6108, 6108)),
+  Box(Box(6109, 6109), Box(6109, 6109)),
+  Box(Box(6110, 6110), Box(6110, 6110)),
+  Box(Box(6111, 6111), Box(6111, 6111)),
+  Box(Box(6112, 6112), Box(6112, 6112)),
+  Box(Box(6113, 6113), Box(6113, 6113)),
+  Box(Box(6114, 6114), Box(6114, 6114)),
+  Box(Box(6115, 6115), Box(6115, 6115)),
+  Box(Box(6116, 6116), Box(6116, 6116)),
+  Box(Box(6117, 6117), Box(6117, 6117)),
+  Box(Box(6118, 6118), Box(6118, 6118)),
+  Box(Box(6119, 6119), Box(6119, 6119)),
+  Box(Box(6120, 6120), Box(6120, 6120)),
+  Box(Box(6121, 6121), Box(6121, 6121)),
+  Box(Box(6122, 6122), Box(6122, 6122)),
+  Box(Box(6123, 6123), Box(6123, 6123)),
+  Box(Box(6124, 6124), Box(6124, 6124)),
+  Box(Box(6125, 6125), Box(6125, 6125)),
+  Box(Box(6126, 6126), Box(6126, 6126)),
+  Box(Box(6127, 6127), Box(6127, 6127)),
+  Box(Box(6128, 6128), Box(6128, 6128)),
+  Box(Box(6129, 6129), Box(6129, 6129)),
+  Box(Box(6130, 6130), Box(6130, 6130)),
+  Box(Box(6131, 6131), Box(6131, 6131)),
+  Box(Box(6132, 6132), Box(6132, 6132)),
+  Box(Box(6133, 6133), Box(6133, 6133)),
+  Box(Box(6134, 6134), Box(6134, 6134)),
+  Box(Box(6135, 6135), Box(6135, 6135)),
+  Box(Box(6136, 6136), Box(6136, 6136)),
+  Box(Box(6137, 6137), Box(6137, 6137)),
+  Box(Box(6138, 6138), Box(6138, 6138)),
+  Box(Box(6139, 6139), Box(6139, 6139)),
+  Box(Box(6140, 6140), Box(6140, 6140)),
+  Box(Box(6141, 6141), Box(6141, 6141)),
+  Box(Box(6142, 6142), Box(6142, 6142)),
+  Box(Box(6143, 6143), Box(6143, 6143)),
+  Box(Box(6144, 6144), Box(6144, 6144)),
+  Box(Box(6145, 6145), Box(6145, 6145)),
+  Box(Box(6146, 6146), Box(6146, 6146)),
+  Box(Box(6147, 6147), Box(6147, 6147)),
+  Box(Box(6148, 6148), Box(6148, 6148)),
+  Box(Box(6149, 6149), Box(6149, 6149)),
+  Box(Box(6150, 6150), Box(6150, 6150)),
+  Box(Box(6151, 6151), Box(6151, 6151)),
+  Box(Box(6152, 6152), Box(6152, 6152)),
+  Box(Box(6153, 6153), Box(6153, 6153)),
+  Box(Box(6154, 6154), Box(6154, 6154)),
+  Box(Box(6155, 6155), Box(6155, 6155)),
+  Box(Box(6156, 6156), Box(6156, 6156)),
+  Box(Box(6157, 6157), Box(6157, 6157)),
+  Box(Box(6158, 6158), Box(6158, 6158)),
+  Box(Box(6159, 6159), Box(6159, 6159)),
+  Box(Box(6160, 6160), Box(6160, 6160)),
+  Box(Box(6161, 6161), Box(6161, 6161)),
+  Box(Box(6162, 6162), Box(6162, 6162)),
+  Box(Box(6163, 6163), Box(6163, 6163)),
+  Box(Box(6164, 6164), Box(6164, 6164)),
+  Box(Box(6165, 6165), Box(6165, 6165)),
+  Box(Box(6166, 6166), Box(6166, 6166)),
+  Box(Box(6167, 6167), Box(6167, 6167)),
+  Box(Box(6168, 6168), Box(6168, 6168)),
+  Box(Box(6169, 6169), Box(6169, 6169)),
+  Box(Box(6170, 6170), Box(6170, 6170)),
+  Box(Box(6171, 6171), Box(6171, 6171)),
+  Box(Box(6172, 6172), Box(6172, 6172)),
+  Box(Box(6173, 6173), Box(6173, 6173)),
+  Box(Box(6174, 6174), Box(6174, 6174)),
+  Box(Box(6175, 6175), Box(6175, 6175)),
+  Box(Box(6176, 6176), Box(6176, 6176)),
+  Box(Box(6177, 6177), Box(6177, 6177)),
+  Box(Box(6178, 6178), Box(6178, 6178)),
+  Box(Box(6179, 6179), Box(6179, 6179)),
+  Box(Box(6180, 6180), Box(6180, 6180)),
+  Box(Box(6181, 6181), Box(6181, 6181)),
+  Box(Box(6182, 6182), Box(6182, 6182)),
+  Box(Box(6183, 6183), Box(6183, 6183)),
+  Box(Box(6184, 6184), Box(6184, 6184)),
+  Box(Box(6185, 6185), Box(6185, 6185)),
+  Box(Box(6186, 6186), Box(6186, 6186)),
+  Box(Box(6187, 6187), Box(6187, 6187)),
+  Box(Box(6188, 6188), Box(6188, 6188)),
+  Box(Box(6189, 6189), Box(6189, 6189)),
+  Box(Box(6190, 6190), Box(6190, 6190)),
+  Box(Box(6191, 6191), Box(6191, 6191)),
+  Box(Box(6192, 6192), Box(6192, 6192)),
+  Box(Box(6193, 6193), Box(6193, 6193)),
+  Box(Box(6194, 6194), Box(6194, 6194)),
+  Box(Box(6195, 6195), Box(6195, 6195)),
+  Box(Box(6196, 6196), Box(6196, 6196)),
+  Box(Box(6197, 6197), Box(6197, 6197)),
+  Box(Box(6198, 6198), Box(6198, 6198)),
+  Box(Box(6199, 6199), Box(6199, 6199)),
+  Box(Box(6200, 6200), Box(6200, 6200)),
+  Box(Box(6201, 6201), Box(6201, 6201)),
+  Box(Box(6202, 6202), Box(6202, 6202)),
+  Box(Box(6203, 6203), Box(6203, 6203)),
+  Box(Box(6204, 6204), Box(6204, 6204)),
+  Box(Box(6205, 6205), Box(6205, 6205)),
+  Box(Box(6206, 6206), Box(6206, 6206)),
+  Box(Box(6207, 6207), Box(6207, 6207)),
+  Box(Box(6208, 6208), Box(6208, 6208)),
+  Box(Box(6209, 6209), Box(6209, 6209)),
+  Box(Box(6210, 6210), Box(6210, 6210)),
+  Box(Box(6211, 6211), Box(6211, 6211)),
+  Box(Box(6212, 6212), Box(6212, 6212)),
+  Box(Box(6213, 6213), Box(6213, 6213)),
+  Box(Box(6214, 6214), Box(6214, 6214)),
+  Box(Box(6215, 6215), Box(6215, 6215)),
+  Box(Box(6216, 6216), Box(6216, 6216)),
+  Box(Box(6217, 6217), Box(6217, 6217)),
+  Box(Box(6218, 6218), Box(6218, 6218)),
+  Box(Box(6219, 6219), Box(6219, 6219)),
+  Box(Box(6220, 6220), Box(6220, 6220)),
+  Box(Box(6221, 6221), Box(6221, 6221)),
+  Box(Box(6222, 6222), Box(6222, 6222)),
+  Box(Box(6223, 6223), Box(6223, 6223)),
+  Box(Box(6224, 6224), Box(6224, 6224)),
+  Box(Box(6225, 6225), Box(6225, 6225)),
+  Box(Box(6226, 6226), Box(6226, 6226)),
+  Box(Box(6227, 6227), Box(6227, 6227)),
+  Box(Box(6228, 6228), Box(6228, 6228)),
+  Box(Box(6229, 6229), Box(6229, 6229)),
+  Box(Box(6230, 6230), Box(6230, 6230)),
+  Box(Box(6231, 6231), Box(6231, 6231)),
+  Box(Box(6232, 6232), Box(6232, 6232)),
+  Box(Box(6233, 6233), Box(6233, 6233)),
+  Box(Box(6234, 6234), Box(6234, 6234)),
+  Box(Box(6235, 6235), Box(6235, 6235)),
+  Box(Box(6236, 6236), Box(6236, 6236)),
+  Box(Box(6237, 6237), Box(6237, 6237)),
+  Box(Box(6238, 6238), Box(6238, 6238)),
+  Box(Box(6239, 6239), Box(6239, 6239)),
+  Box(Box(6240, 6240), Box(6240, 6240)),
+  Box(Box(6241, 6241), Box(6241, 6241)),
+  Box(Box(6242, 6242), Box(6242, 6242)),
+  Box(Box(6243, 6243), Box(6243, 6243)),
+  Box(Box(6244, 6244), Box(6244, 6244)),
+  Box(Box(6245, 6245), Box(6245, 6245)),
+  Box(Box(6246, 6246), Box(6246, 6246)),
+  Box(Box(6247, 6247), Box(6247, 6247)),
+  Box(Box(6248, 6248), Box(6248, 6248)),
+  Box(Box(6249, 6249), Box(6249, 6249)),
+  Box(Box(6250, 6250), Box(6250, 6250)),
+  Box(Box(6251, 6251), Box(6251, 6251)),
+  Box(Box(6252, 6252), Box(6252, 6252)),
+  Box(Box(6253, 6253), Box(6253, 6253)),
+  Box(Box(6254, 6254), Box(6254, 6254)),
+  Box(Box(6255, 6255), Box(6255, 6255)),
+  Box(Box(6256, 6256), Box(6256, 6256)),
+  Box(Box(6257, 6257), Box(6257, 6257)),
+  Box(Box(6258, 6258), Box(6258, 6258)),
+  Box(Box(6259, 6259), Box(6259, 6259)),
+  Box(Box(6260, 6260), Box(6260, 6260)),
+  Box(Box(6261, 6261), Box(6261, 6261)),
+  Box(Box(6262, 6262), Box(6262, 6262)),
+  Box(Box(6263, 6263), Box(6263, 6263)),
+  Box(Box(6264, 6264), Box(6264, 6264)),
+  Box(Box(6265, 6265), Box(6265, 6265)),
+  Box(Box(6266, 6266), Box(6266, 6266)),
+  Box(Box(6267, 6267), Box(6267, 6267)),
+  Box(Box(6268, 6268), Box(6268, 6268)),
+  Box(Box(6269, 6269), Box(6269, 6269)),
+  Box(Box(6270, 6270), Box(6270, 6270)),
+  Box(Box(6271, 6271), Box(6271, 6271)),
+  Box(Box(6272, 6272), Box(6272, 6272)),
+  Box(Box(6273, 6273), Box(6273, 6273)),
+  Box(Box(6274, 6274), Box(6274, 6274)),
+  Box(Box(6275, 6275), Box(6275, 6275)),
+  Box(Box(6276, 6276), Box(6276, 6276)),
+  Box(Box(6277, 6277), Box(6277, 6277)),
+  Box(Box(6278, 6278), Box(6278, 6278)),
+  Box(Box(6279, 6279), Box(6279, 6279)),
+  Box(Box(6280, 6280), Box(6280, 6280)),
+  Box(Box(6281, 6281), Box(6281, 6281)),
+  Box(Box(6282, 6282), Box(6282, 6282)),
+  Box(Box(6283, 6283), Box(6283, 6283)),
+  Box(Box(6284, 6284), Box(6284, 6284)),
+  Box(Box(6285, 6285), Box(6285, 6285)),
+  Box(Box(6286, 6286), Box(6286, 6286)),
+  Box(Box(6287, 6287), Box(6287, 6287)),
+  Box(Box(6288, 6288), Box(6288, 6288)),
+  Box(Box(6289, 6289), Box(6289, 6289)),
+  Box(Box(6290, 6290), Box(6290, 6290)),
+  Box(Box(6291, 6291), Box(6291, 6291)),
+  Box(Box(6292, 6292), Box(6292, 6292)),
+  Box(Box(6293, 6293), Box(6293, 6293)),
+  Box(Box(6294, 6294), Box(6294, 6294)),
+  Box(Box(6295, 6295), Box(6295, 6295)),
+  Box(Box(6296, 6296), Box(6296, 6296)),
+  Box(Box(6297, 6297), Box(6297, 6297)),
+  Box(Box(6298, 6298), Box(6298, 6298)),
+  Box(Box(6299, 6299), Box(6299, 6299)),
+  Box(Box(6300, 6300), Box(6300, 6300)),
+  Box(Box(6301, 6301), Box(6301, 6301)),
+  Box(Box(6302, 6302), Box(6302, 6302)),
+  Box(Box(6303, 6303), Box(6303, 6303)),
+  Box(Box(6304, 6304), Box(6304, 6304)),
+  Box(Box(6305, 6305), Box(6305, 6305)),
+  Box(Box(6306, 6306), Box(6306, 6306)),
+  Box(Box(6307, 6307), Box(6307, 6307)),
+  Box(Box(6308, 6308), Box(6308, 6308)),
+  Box(Box(6309, 6309), Box(6309, 6309)),
+  Box(Box(6310, 6310), Box(6310, 6310)),
+  Box(Box(6311, 6311), Box(6311, 6311)),
+  Box(Box(6312, 6312), Box(6312, 6312)),
+  Box(Box(6313, 6313), Box(6313, 6313)),
+  Box(Box(6314, 6314), Box(6314, 6314)),
+  Box(Box(6315, 6315), Box(6315, 6315)),
+  Box(Box(6316, 6316), Box(6316, 6316)),
+  Box(Box(6317, 6317), Box(6317, 6317)),
+  Box(Box(6318, 6318), Box(6318, 6318)),
+  Box(Box(6319, 6319), Box(6319, 6319)),
+  Box(Box(6320, 6320), Box(6320, 6320)),
+  Box(Box(6321, 6321), Box(6321, 6321)),
+  Box(Box(6322, 6322), Box(6322, 6322)),
+  Box(Box(6323, 6323), Box(6323, 6323)),
+  Box(Box(6324, 6324), Box(6324, 6324)),
+  Box(Box(6325, 6325), Box(6325, 6325)),
+  Box(Box(6326, 6326), Box(6326, 6326)),
+  Box(Box(6327, 6327), Box(6327, 6327)),
+  Box(Box(6328, 6328), Box(6328, 6328)),
+  Box(Box(6329, 6329), Box(6329, 6329)),
+  Box(Box(6330, 6330), Box(6330, 6330)),
+  Box(Box(6331, 6331), Box(6331, 6331)),
+  Box(Box(6332, 6332), Box(6332, 6332)),
+  Box(Box(6333, 6333), Box(6333, 6333)),
+  Box(Box(6334, 6334), Box(6334, 6334)),
+  Box(Box(6335, 6335), Box(6335, 6335)),
+  Box(Box(6336, 6336), Box(6336, 6336)),
+  Box(Box(6337, 6337), Box(6337, 6337)),
+  Box(Box(6338, 6338), Box(6338, 6338)),
+  Box(Box(6339, 6339), Box(6339, 6339)),
+  Box(Box(6340, 6340), Box(6340, 6340)),
+  Box(Box(6341, 6341), Box(6341, 6341)),
+  Box(Box(6342, 6342), Box(6342, 6342)),
+  Box(Box(6343, 6343), Box(6343, 6343)),
+  Box(Box(6344, 6344), Box(6344, 6344)),
+  Box(Box(6345, 6345), Box(6345, 6345)),
+  Box(Box(6346, 6346), Box(6346, 6346)),
+  Box(Box(6347, 6347), Box(6347, 6347)),
+  Box(Box(6348, 6348), Box(6348, 6348)),
+  Box(Box(6349, 6349), Box(6349, 6349)),
+  Box(Box(6350, 6350), Box(6350, 6350)),
+  Box(Box(6351, 6351), Box(6351, 6351)),
+  Box(Box(6352, 6352), Box(6352, 6352)),
+  Box(Box(6353, 6353), Box(6353, 6353)),
+  Box(Box(6354, 6354), Box(6354, 6354)),
+  Box(Box(6355, 6355), Box(6355, 6355)),
+  Box(Box(6356, 6356), Box(6356, 6356)),
+  Box(Box(6357, 6357), Box(6357, 6357)),
+  Box(Box(6358, 6358), Box(6358, 6358)),
+  Box(Box(6359, 6359), Box(6359, 6359)),
+  Box(Box(6360, 6360), Box(6360, 6360)),
+  Box(Box(6361, 6361), Box(6361, 6361)),
+  Box(Box(6362, 6362), Box(6362, 6362)),
+  Box(Box(6363, 6363), Box(6363, 6363)),
+  Box(Box(6364, 6364), Box(6364, 6364)),
+  Box(Box(6365, 6365), Box(6365, 6365)),
+  Box(Box(6366, 6366), Box(6366, 6366)),
+  Box(Box(6367, 6367), Box(6367, 6367)),
+  Box(Box(6368, 6368), Box(6368, 6368)),
+  Box(Box(6369, 6369), Box(6369, 6369)),
+  Box(Box(6370, 6370), Box(6370, 6370)),
+  Box(Box(6371, 6371), Box(6371, 6371)),
+  Box(Box(6372, 6372), Box(6372, 6372)),
+  Box(Box(6373, 6373), Box(6373, 6373)),
+  Box(Box(6374, 6374), Box(6374, 6374)),
+  Box(Box(6375, 6375), Box(6375, 6375)),
+  Box(Box(6376, 6376), Box(6376, 6376)),
+  Box(Box(6377, 6377), Box(6377, 6377)),
+  Box(Box(6378, 6378), Box(6378, 6378)),
+  Box(Box(6379, 6379), Box(6379, 6379)),
+  Box(Box(6380, 6380), Box(6380, 6380)),
+  Box(Box(6381, 6381), Box(6381, 6381)),
+  Box(Box(6382, 6382), Box(6382, 6382)),
+  Box(Box(6383, 6383), Box(6383, 6383)),
+  Box(Box(6384, 6384), Box(6384, 6384)),
+  Box(Box(6385, 6385), Box(6385, 6385)),
+  Box(Box(6386, 6386), Box(6386, 6386)),
+  Box(Box(6387, 6387), Box(6387, 6387)),
+  Box(Box(6388, 6388), Box(6388, 6388)),
+  Box(Box(6389, 6389), Box(6389, 6389)),
+  Box(Box(6390, 6390), Box(6390, 6390)),
+  Box(Box(6391, 6391), Box(6391, 6391)),
+  Box(Box(6392, 6392), Box(6392, 6392)),
+  Box(Box(6393, 6393), Box(6393, 6393)),
+  Box(Box(6394, 6394), Box(6394, 6394)),
+  Box(Box(6395, 6395), Box(6395, 6395)),
+  Box(Box(6396, 6396), Box(6396, 6396)),
+  Box(Box(6397, 6397), Box(6397, 6397)),
+  Box(Box(6398, 6398), Box(6398, 6398)),
+  Box(Box(6399, 6399), Box(6399, 6399)),
+  Box(Box(6400, 6400), Box(6400, 6400)),
+  Box(Box(6401, 6401), Box(6401, 6401)),
+  Box(Box(6402, 6402), Box(6402, 6402)),
+  Box(Box(6403, 6403), Box(6403, 6403)),
+  Box(Box(6404, 6404), Box(6404, 6404)),
+  Box(Box(6405, 6405), Box(6405, 6405)),
+  Box(Box(6406, 6406), Box(6406, 6406)),
+  Box(Box(6407, 6407), Box(6407, 6407)),
+  Box(Box(6408, 6408), Box(6408, 6408)),
+  Box(Box(6409, 6409), Box(6409, 6409)),
+  Box(Box(6410, 6410), Box(6410, 6410)),
+  Box(Box(6411, 6411), Box(6411, 6411)),
+  Box(Box(6412, 6412), Box(6412, 6412)),
+  Box(Box(6413, 6413), Box(6413, 6413)),
+  Box(Box(6414, 6414), Box(6414, 6414)),
+  Box(Box(6415, 6415), Box(6415, 6415)),
+  Box(Box(6416, 6416), Box(6416, 6416)),
+  Box(Box(6417, 6417), Box(6417, 6417)),
+  Box(Box(6418, 6418), Box(6418, 6418)),
+  Box(Box(6419, 6419), Box(6419, 6419)),
+  Box(Box(6420, 6420), Box(6420, 6420)),
+  Box(Box(6421, 6421), Box(6421, 6421)),
+  Box(Box(6422, 6422), Box(6422, 6422)),
+  Box(Box(6423, 6423), Box(6423, 6423)),
+  Box(Box(6424, 6424), Box(6424, 6424)),
+  Box(Box(6425, 6425), Box(6425, 6425)),
+  Box(Box(6426, 6426), Box(6426, 6426)),
+  Box(Box(6427, 6427), Box(6427, 6427)),
+  Box(Box(6428, 6428), Box(6428, 6428)),
+  Box(Box(6429, 6429), Box(6429, 6429)),
+  Box(Box(6430, 6430), Box(6430, 6430)),
+  Box(Box(6431, 6431), Box(6431, 6431)),
+  Box(Box(6432, 6432), Box(6432, 6432)),
+  Box(Box(6433, 6433), Box(6433, 6433)),
+  Box(Box(6434, 6434), Box(6434, 6434)),
+  Box(Box(6435, 6435), Box(6435, 6435)),
+  Box(Box(6436, 6436), Box(6436, 6436)),
+  Box(Box(6437, 6437), Box(6437, 6437)),
+  Box(Box(6438, 6438), Box(6438, 6438)),
+  Box(Box(6439, 6439), Box(6439, 6439)),
+  Box(Box(6440, 6440), Box(6440, 6440)),
+  Box(Box(6441, 6441), Box(6441, 6441)),
+  Box(Box(6442, 6442), Box(6442, 6442)),
+  Box(Box(6443, 6443), Box(6443, 6443)),
+  Box(Box(6444, 6444), Box(6444, 6444)),
+  Box(Box(6445, 6445), Box(6445, 6445)),
+  Box(Box(6446, 6446), Box(6446, 6446)),
+  Box(Box(6447, 6447), Box(6447, 6447)),
+  Box(Box(6448, 6448), Box(6448, 6448)),
+  Box(Box(6449, 6449), Box(6449, 6449)),
+  Box(Box(6450, 6450), Box(6450, 6450)),
+  Box(Box(6451, 6451), Box(6451, 6451)),
+  Box(Box(6452, 6452), Box(6452, 6452)),
+  Box(Box(6453, 6453), Box(6453, 6453)),
+  Box(Box(6454, 6454), Box(6454, 6454)),
+  Box(Box(6455, 6455), Box(6455, 6455)),
+  Box(Box(6456, 6456), Box(6456, 6456)),
+  Box(Box(6457, 6457), Box(6457, 6457)),
+  Box(Box(6458, 6458), Box(6458, 6458)),
+  Box(Box(6459, 6459), Box(6459, 6459)),
+  Box(Box(6460, 6460), Box(6460, 6460)),
+  Box(Box(6461, 6461), Box(6461, 6461)),
+  Box(Box(6462, 6462), Box(6462, 6462)),
+  Box(Box(6463, 6463), Box(6463, 6463)),
+  Box(Box(6464, 6464), Box(6464, 6464)),
+  Box(Box(6465, 6465), Box(6465, 6465)),
+  Box(Box(6466, 6466), Box(6466, 6466)),
+  Box(Box(6467, 6467), Box(6467, 6467)),
+  Box(Box(6468, 6468), Box(6468, 6468)),
+  Box(Box(6469, 6469), Box(6469, 6469)),
+  Box(Box(6470, 6470), Box(6470, 6470)),
+  Box(Box(6471, 6471), Box(6471, 6471)),
+  Box(Box(6472, 6472), Box(6472, 6472)),
+  Box(Box(6473, 6473), Box(6473, 6473)),
+  Box(Box(6474, 6474), Box(6474, 6474)),
+  Box(Box(6475, 6475), Box(6475, 6475)),
+  Box(Box(6476, 6476), Box(6476, 6476)),
+  Box(Box(6477, 6477), Box(6477, 6477)),
+  Box(Box(6478, 6478), Box(6478, 6478)),
+  Box(Box(6479, 6479), Box(6479, 6479)),
+  Box(Box(6480, 6480), Box(6480, 6480)),
+  Box(Box(6481, 6481), Box(6481, 6481)),
+  Box(Box(6482, 6482), Box(6482, 6482)),
+  Box(Box(6483, 6483), Box(6483, 6483)),
+  Box(Box(6484, 6484), Box(6484, 6484)),
+  Box(Box(6485, 6485), Box(6485, 6485)),
+  Box(Box(6486, 6486), Box(6486, 6486)),
+  Box(Box(6487, 6487), Box(6487, 6487)),
+  Box(Box(6488, 6488), Box(6488, 6488)),
+  Box(Box(6489, 6489), Box(6489, 6489)),
+  Box(Box(6490, 6490), Box(6490, 6490)),
+  Box(Box(6491, 6491), Box(6491, 6491)),
+  Box(Box(6492, 6492), Box(6492, 6492)),
+  Box(Box(6493, 6493), Box(6493, 6493)),
+  Box(Box(6494, 6494), Box(6494, 6494)),
+  Box(Box(6495, 6495), Box(6495, 6495)),
+  Box(Box(6496, 6496), Box(6496, 6496)),
+  Box(Box(6497, 6497), Box(6497, 6497)),
+  Box(Box(6498, 6498), Box(6498, 6498)),
+  Box(Box(6499, 6499), Box(6499, 6499)),
+  Box(Box(6500, 6500), Box(6500, 6500)),
+  Box(Box(6501, 6501), Box(6501, 6501)),
+  Box(Box(6502, 6502), Box(6502, 6502)),
+  Box(Box(6503, 6503), Box(6503, 6503)),
+  Box(Box(6504, 6504), Box(6504, 6504)),
+  Box(Box(6505, 6505), Box(6505, 6505)),
+  Box(Box(6506, 6506), Box(6506, 6506)),
+  Box(Box(6507, 6507), Box(6507, 6507)),
+  Box(Box(6508, 6508), Box(6508, 6508)),
+  Box(Box(6509, 6509), Box(6509, 6509)),
+  Box(Box(6510, 6510), Box(6510, 6510)),
+  Box(Box(6511, 6511), Box(6511, 6511)),
+  Box(Box(6512, 6512), Box(6512, 6512)),
+  Box(Box(6513, 6513), Box(6513, 6513)),
+  Box(Box(6514, 6514), Box(6514, 6514)),
+  Box(Box(6515, 6515), Box(6515, 6515)),
+  Box(Box(6516, 6516), Box(6516, 6516)),
+  Box(Box(6517, 6517), Box(6517, 6517)),
+  Box(Box(6518, 6518), Box(6518, 6518)),
+  Box(Box(6519, 6519), Box(6519, 6519)),
+  Box(Box(6520, 6520), Box(6520, 6520)),
+  Box(Box(6521, 6521), Box(6521, 6521)),
+  Box(Box(6522, 6522), Box(6522, 6522)),
+  Box(Box(6523, 6523), Box(6523, 6523)),
+  Box(Box(6524, 6524), Box(6524, 6524)),
+  Box(Box(6525, 6525), Box(6525, 6525)),
+  Box(Box(6526, 6526), Box(6526, 6526)),
+  Box(Box(6527, 6527), Box(6527, 6527)),
+  Box(Box(6528, 6528), Box(6528, 6528)),
+  Box(Box(6529, 6529), Box(6529, 6529)),
+  Box(Box(6530, 6530), Box(6530, 6530)),
+  Box(Box(6531, 6531), Box(6531, 6531)),
+  Box(Box(6532, 6532), Box(6532, 6532)),
+  Box(Box(6533, 6533), Box(6533, 6533)),
+  Box(Box(6534, 6534), Box(6534, 6534)),
+  Box(Box(6535, 6535), Box(6535, 6535)),
+  Box(Box(6536, 6536), Box(6536, 6536)),
+  Box(Box(6537, 6537), Box(6537, 6537)),
+  Box(Box(6538, 6538), Box(6538, 6538)),
+  Box(Box(6539, 6539), Box(6539, 6539)),
+  Box(Box(6540, 6540), Box(6540, 6540)),
+  Box(Box(6541, 6541), Box(6541, 6541)),
+  Box(Box(6542, 6542), Box(6542, 6542)),
+  Box(Box(6543, 6543), Box(6543, 6543)),
+  Box(Box(6544, 6544), Box(6544, 6544)),
+  Box(Box(6545, 6545), Box(6545, 6545)),
+  Box(Box(6546, 6546), Box(6546, 6546)),
+  Box(Box(6547, 6547), Box(6547, 6547)),
+  Box(Box(6548, 6548), Box(6548, 6548)),
+  Box(Box(6549, 6549), Box(6549, 6549)),
+  Box(Box(6550, 6550), Box(6550, 6550)),
+  Box(Box(6551, 6551), Box(6551, 6551)),
+  Box(Box(6552, 6552), Box(6552, 6552)),
+  Box(Box(6553, 6553), Box(6553, 6553)),
+  Box(Box(6554, 6554), Box(6554, 6554)),
+  Box(Box(6555, 6555), Box(6555, 6555)),
+  Box(Box(6556, 6556), Box(6556, 6556)),
+  Box(Box(6557, 6557), Box(6557, 6557)),
+  Box(Box(6558, 6558), Box(6558, 6558)),
+  Box(Box(6559, 6559), Box(6559, 6559)),
+  Box(Box(6560, 6560), Box(6560, 6560)),
+  Box(Box(6561, 6561), Box(6561, 6561)),
+  Box(Box(6562, 6562), Box(6562, 6562)),
+  Box(Box(6563, 6563), Box(6563, 6563)),
+  Box(Box(6564, 6564), Box(6564, 6564)),
+  Box(Box(6565, 6565), Box(6565, 6565)),
+  Box(Box(6566, 6566), Box(6566, 6566)),
+  Box(Box(6567, 6567), Box(6567, 6567)),
+  Box(Box(6568, 6568), Box(6568, 6568)),
+  Box(Box(6569, 6569), Box(6569, 6569)),
+  Box(Box(6570, 6570), Box(6570, 6570)),
+  Box(Box(6571, 6571), Box(6571, 6571)),
+  Box(Box(6572, 6572), Box(6572, 6572)),
+  Box(Box(6573, 6573), Box(6573, 6573)),
+  Box(Box(6574, 6574), Box(6574, 6574)),
+  Box(Box(6575, 6575), Box(6575, 6575)),
+  Box(Box(6576, 6576), Box(6576, 6576)),
+  Box(Box(6577, 6577), Box(6577, 6577)),
+  Box(Box(6578, 6578), Box(6578, 6578)),
+  Box(Box(6579, 6579), Box(6579, 6579)),
+  Box(Box(6580, 6580), Box(6580, 6580)),
+  Box(Box(6581, 6581), Box(6581, 6581)),
+  Box(Box(6582, 6582), Box(6582, 6582)),
+  Box(Box(6583, 6583), Box(6583, 6583)),
+  Box(Box(6584, 6584), Box(6584, 6584)),
+  Box(Box(6585, 6585), Box(6585, 6585)),
+  Box(Box(6586, 6586), Box(6586, 6586)),
+  Box(Box(6587, 6587), Box(6587, 6587)),
+  Box(Box(6588, 6588), Box(6588, 6588)),
+  Box(Box(6589, 6589), Box(6589, 6589)),
+  Box(Box(6590, 6590), Box(6590, 6590)),
+  Box(Box(6591, 6591), Box(6591, 6591)),
+  Box(Box(6592, 6592), Box(6592, 6592)),
+  Box(Box(6593, 6593), Box(6593, 6593)),
+  Box(Box(6594, 6594), Box(6594, 6594)),
+  Box(Box(6595, 6595), Box(6595, 6595)),
+  Box(Box(6596, 6596), Box(6596, 6596)),
+  Box(Box(6597, 6597), Box(6597, 6597)),
+  Box(Box(6598, 6598), Box(6598, 6598)),
+  Box(Box(6599, 6599), Box(6599, 6599)),
+  Box(Box(6600, 6600), Box(6600, 6600)),
+  Box(Box(6601, 6601), Box(6601, 6601)),
+  Box(Box(6602, 6602), Box(6602, 6602)),
+  Box(Box(6603, 6603), Box(6603, 6603)),
+  Box(Box(6604, 6604), Box(6604, 6604)),
+  Box(Box(6605, 6605), Box(6605, 6605)),
+  Box(Box(6606, 6606), Box(6606, 6606)),
+  Box(Box(6607, 6607), Box(6607, 6607)),
+  Box(Box(6608, 6608), Box(6608, 6608)),
+  Box(Box(6609, 6609), Box(6609, 6609)),
+  Box(Box(6610, 6610), Box(6610, 6610)),
+  Box(Box(6611, 6611), Box(6611, 6611)),
+  Box(Box(6612, 6612), Box(6612, 6612)),
+  Box(Box(6613, 6613), Box(6613, 6613)),
+  Box(Box(6614, 6614), Box(6614, 6614)),
+  Box(Box(6615, 6615), Box(6615, 6615)),
+  Box(Box(6616, 6616), Box(6616, 6616)),
+  Box(Box(6617, 6617), Box(6617, 6617)),
+  Box(Box(6618, 6618), Box(6618, 6618)),
+  Box(Box(6619, 6619), Box(6619, 6619)),
+  Box(Box(6620, 6620), Box(6620, 6620)),
+  Box(Box(6621, 6621), Box(6621, 6621)),
+  Box(Box(6622, 6622), Box(6622, 6622)),
+  Box(Box(6623, 6623), Box(6623, 6623)),
+  Box(Box(6624, 6624), Box(6624, 6624)),
+  Box(Box(6625, 6625), Box(6625, 6625)),
+  Box(Box(6626, 6626), Box(6626, 6626)),
+  Box(Box(6627, 6627), Box(6627, 6627)),
+  Box(Box(6628, 6628), Box(6628, 6628)),
+  Box(Box(6629, 6629), Box(6629, 6629)),
+  Box(Box(6630, 6630), Box(6630, 6630)),
+  Box(Box(6631, 6631), Box(6631, 6631)),
+  Box(Box(6632, 6632), Box(6632, 6632)),
+  Box(Box(6633, 6633), Box(6633, 6633)),
+  Box(Box(6634, 6634), Box(6634, 6634)),
+  Box(Box(6635, 6635), Box(6635, 6635)),
+  Box(Box(6636, 6636), Box(6636, 6636)),
+  Box(Box(6637, 6637), Box(6637, 6637)),
+  Box(Box(6638, 6638), Box(6638, 6638)),
+  Box(Box(6639, 6639), Box(6639, 6639)),
+  Box(Box(6640, 6640), Box(6640, 6640)),
+  Box(Box(6641, 6641), Box(6641, 6641)),
+  Box(Box(6642, 6642), Box(6642, 6642)),
+  Box(Box(6643, 6643), Box(6643, 6643)),
+  Box(Box(6644, 6644), Box(6644, 6644)),
+  Box(Box(6645, 6645), Box(6645, 6645)),
+  Box(Box(6646, 6646), Box(6646, 6646)),
+  Box(Box(6647, 6647), Box(6647, 6647)),
+  Box(Box(6648, 6648), Box(6648, 6648)),
+  Box(Box(6649, 6649), Box(6649, 6649)),
+  Box(Box(6650, 6650), Box(6650, 6650)),
+  Box(Box(6651, 6651), Box(6651, 6651)),
+  Box(Box(6652, 6652), Box(6652, 6652)),
+  Box(Box(6653, 6653), Box(6653, 6653)),
+  Box(Box(6654, 6654), Box(6654, 6654)),
+  Box(Box(6655, 6655), Box(6655, 6655)),
+  Box(Box(6656, 6656), Box(6656, 6656)),
+  Box(Box(6657, 6657), Box(6657, 6657)),
+  Box(Box(6658, 6658), Box(6658, 6658)),
+  Box(Box(6659, 6659), Box(6659, 6659)),
+  Box(Box(6660, 6660), Box(6660, 6660)),
+  Box(Box(6661, 6661), Box(6661, 6661)),
+  Box(Box(6662, 6662), Box(6662, 6662)),
+  Box(Box(6663, 6663), Box(6663, 6663)),
+  Box(Box(6664, 6664), Box(6664, 6664)),
+  Box(Box(6665, 6665), Box(6665, 6665)),
+  Box(Box(6666, 6666), Box(6666, 6666)),
+  Box(Box(6667, 6667), Box(6667, 6667)),
+  Box(Box(6668, 6668), Box(6668, 6668)),
+  Box(Box(6669, 6669), Box(6669, 6669)),
+  Box(Box(6670, 6670), Box(6670, 6670)),
+  Box(Box(6671, 6671), Box(6671, 6671)),
+  Box(Box(6672, 6672), Box(6672, 6672)),
+  Box(Box(6673, 6673), Box(6673, 6673)),
+  Box(Box(6674, 6674), Box(6674, 6674)),
+  Box(Box(6675, 6675), Box(6675, 6675)),
+  Box(Box(6676, 6676), Box(6676, 6676)),
+  Box(Box(6677, 6677), Box(6677, 6677)),
+  Box(Box(6678, 6678), Box(6678, 6678)),
+  Box(Box(6679, 6679), Box(6679, 6679)),
+  Box(Box(6680, 6680), Box(6680, 6680)),
+  Box(Box(6681, 6681), Box(6681, 6681)),
+  Box(Box(6682, 6682), Box(6682, 6682)),
+  Box(Box(6683, 6683), Box(6683, 6683)),
+  Box(Box(6684, 6684), Box(6684, 6684)),
+  Box(Box(6685, 6685), Box(6685, 6685)),
+  Box(Box(6686, 6686), Box(6686, 6686)),
+  Box(Box(6687, 6687), Box(6687, 6687)),
+  Box(Box(6688, 6688), Box(6688, 6688)),
+  Box(Box(6689, 6689), Box(6689, 6689)),
+  Box(Box(6690, 6690), Box(6690, 6690)),
+  Box(Box(6691, 6691), Box(6691, 6691)),
+  Box(Box(6692, 6692), Box(6692, 6692)),
+  Box(Box(6693, 6693), Box(6693, 6693)),
+  Box(Box(6694, 6694), Box(6694, 6694)),
+  Box(Box(6695, 6695), Box(6695, 6695)),
+  Box(Box(6696, 6696), Box(6696, 6696)),
+  Box(Box(6697, 6697), Box(6697, 6697)),
+  Box(Box(6698, 6698), Box(6698, 6698)),
+  Box(Box(6699, 6699), Box(6699, 6699)),
+  Box(Box(6700, 6700), Box(6700, 6700)),
+  Box(Box(6701, 6701), Box(6701, 6701)),
+  Box(Box(6702, 6702), Box(6702, 6702)),
+  Box(Box(6703, 6703), Box(6703, 6703)),
+  Box(Box(6704, 6704), Box(6704, 6704)),
+  Box(Box(6705, 6705), Box(6705, 6705)),
+  Box(Box(6706, 6706), Box(6706, 6706)),
+  Box(Box(6707, 6707), Box(6707, 6707)),
+  Box(Box(6708, 6708), Box(6708, 6708)),
+  Box(Box(6709, 6709), Box(6709, 6709)),
+  Box(Box(6710, 6710), Box(6710, 6710)),
+  Box(Box(6711, 6711), Box(6711, 6711)),
+  Box(Box(6712, 6712), Box(6712, 6712)),
+  Box(Box(6713, 6713), Box(6713, 6713)),
+  Box(Box(6714, 6714), Box(6714, 6714)),
+  Box(Box(6715, 6715), Box(6715, 6715)),
+  Box(Box(6716, 6716), Box(6716, 6716)),
+  Box(Box(6717, 6717), Box(6717, 6717)),
+  Box(Box(6718, 6718), Box(6718, 6718)),
+  Box(Box(6719, 6719), Box(6719, 6719)),
+  Box(Box(6720, 6720), Box(6720, 6720)),
+  Box(Box(6721, 6721), Box(6721, 6721)),
+  Box(Box(6722, 6722), Box(6722, 6722)),
+  Box(Box(6723, 6723), Box(6723, 6723)),
+  Box(Box(6724, 6724), Box(6724, 6724)),
+  Box(Box(6725, 6725), Box(6725, 6725)),
+  Box(Box(6726, 6726), Box(6726, 6726)),
+  Box(Box(6727, 6727), Box(6727, 6727)),
+  Box(Box(6728, 6728), Box(6728, 6728)),
+  Box(Box(6729, 6729), Box(6729, 6729)),
+  Box(Box(6730, 6730), Box(6730, 6730)),
+  Box(Box(6731, 6731), Box(6731, 6731)),
+  Box(Box(6732, 6732), Box(6732, 6732)),
+  Box(Box(6733, 6733), Box(6733, 6733)),
+  Box(Box(6734, 6734), Box(6734, 6734)),
+  Box(Box(6735, 6735), Box(6735, 6735)),
+  Box(Box(6736, 6736), Box(6736, 6736)),
+  Box(Box(6737, 6737), Box(6737, 6737)),
+  Box(Box(6738, 6738), Box(6738, 6738)),
+  Box(Box(6739, 6739), Box(6739, 6739)),
+  Box(Box(6740, 6740), Box(6740, 6740)),
+  Box(Box(6741, 6741), Box(6741, 6741)),
+  Box(Box(6742, 6742), Box(6742, 6742)),
+  Box(Box(6743, 6743), Box(6743, 6743)),
+  Box(Box(6744, 6744), Box(6744, 6744)),
+  Box(Box(6745, 6745), Box(6745, 6745)),
+  Box(Box(6746, 6746), Box(6746, 6746)),
+  Box(Box(6747, 6747), Box(6747, 6747)),
+  Box(Box(6748, 6748), Box(6748, 6748)),
+  Box(Box(6749, 6749), Box(6749, 6749)),
+  Box(Box(6750, 6750), Box(6750, 6750)),
+  Box(Box(6751, 6751), Box(6751, 6751)),
+  Box(Box(6752, 6752), Box(6752, 6752)),
+  Box(Box(6753, 6753), Box(6753, 6753)),
+  Box(Box(6754, 6754), Box(6754, 6754)),
+  Box(Box(6755, 6755), Box(6755, 6755)),
+  Box(Box(6756, 6756), Box(6756, 6756)),
+  Box(Box(6757, 6757), Box(6757, 6757)),
+  Box(Box(6758, 6758), Box(6758, 6758)),
+  Box(Box(6759, 6759), Box(6759, 6759)),
+  Box(Box(6760, 6760), Box(6760, 6760)),
+  Box(Box(6761, 6761), Box(6761, 6761)),
+  Box(Box(6762, 6762), Box(6762, 6762)),
+  Box(Box(6763, 6763), Box(6763, 6763)),
+  Box(Box(6764, 6764), Box(6764, 6764)),
+  Box(Box(6765, 6765), Box(6765, 6765)),
+  Box(Box(6766, 6766), Box(6766, 6766)),
+  Box(Box(6767, 6767), Box(6767, 6767)),
+  Box(Box(6768, 6768), Box(6768, 6768)),
+  Box(Box(6769, 6769), Box(6769, 6769)),
+  Box(Box(6770, 6770), Box(6770, 6770)),
+  Box(Box(6771, 6771), Box(6771, 6771)),
+  Box(Box(6772, 6772), Box(6772, 6772)),
+  Box(Box(6773, 6773), Box(6773, 6773)),
+  Box(Box(6774, 6774), Box(6774, 6774)),
+  Box(Box(6775, 6775), Box(6775, 6775)),
+  Box(Box(6776, 6776), Box(6776, 6776)),
+  Box(Box(6777, 6777), Box(6777, 6777)),
+  Box(Box(6778, 6778), Box(6778, 6778)),
+  Box(Box(6779, 6779), Box(6779, 6779)),
+  Box(Box(6780, 6780), Box(6780, 6780)),
+  Box(Box(6781, 6781), Box(6781, 6781)),
+  Box(Box(6782, 6782), Box(6782, 6782)),
+  Box(Box(6783, 6783), Box(6783, 6783)),
+  Box(Box(6784, 6784), Box(6784, 6784)),
+  Box(Box(6785, 6785), Box(6785, 6785)),
+  Box(Box(6786, 6786), Box(6786, 6786)),
+  Box(Box(6787, 6787), Box(6787, 6787)),
+  Box(Box(6788, 6788), Box(6788, 6788)),
+  Box(Box(6789, 6789), Box(6789, 6789)),
+  Box(Box(6790, 6790), Box(6790, 6790)),
+  Box(Box(6791, 6791), Box(6791, 6791)),
+  Box(Box(6792, 6792), Box(6792, 6792)),
+  Box(Box(6793, 6793), Box(6793, 6793)),
+  Box(Box(6794, 6794), Box(6794, 6794)),
+  Box(Box(6795, 6795), Box(6795, 6795)),
+  Box(Box(6796, 6796), Box(6796, 6796)),
+  Box(Box(6797, 6797), Box(6797, 6797)),
+  Box(Box(6798, 6798), Box(6798, 6798)),
+  Box(Box(6799, 6799), Box(6799, 6799)),
+  Box(Box(6800, 6800), Box(6800, 6800)),
+  Box(Box(6801, 6801), Box(6801, 6801)),
+  Box(Box(6802, 6802), Box(6802, 6802)),
+  Box(Box(6803, 6803), Box(6803, 6803)),
+  Box(Box(6804, 6804), Box(6804, 6804)),
+  Box(Box(6805, 6805), Box(6805, 6805)),
+  Box(Box(6806, 6806), Box(6806, 6806)),
+  Box(Box(6807, 6807), Box(6807, 6807)),
+  Box(Box(6808, 6808), Box(6808, 6808)),
+  Box(Box(6809, 6809), Box(6809, 6809)),
+  Box(Box(6810, 6810), Box(6810, 6810)),
+  Box(Box(6811, 6811), Box(6811, 6811)),
+  Box(Box(6812, 6812), Box(6812, 6812)),
+  Box(Box(6813, 6813), Box(6813, 6813)),
+  Box(Box(6814, 6814), Box(6814, 6814)),
+  Box(Box(6815, 6815), Box(6815, 6815)),
+  Box(Box(6816, 6816), Box(6816, 6816)),
+  Box(Box(6817, 6817), Box(6817, 6817)),
+  Box(Box(6818, 6818), Box(6818, 6818)),
+  Box(Box(6819, 6819), Box(6819, 6819)),
+  Box(Box(6820, 6820), Box(6820, 6820)),
+  Box(Box(6821, 6821), Box(6821, 6821)),
+  Box(Box(6822, 6822), Box(6822, 6822)),
+  Box(Box(6823, 6823), Box(6823, 6823)),
+  Box(Box(6824, 6824), Box(6824, 6824)),
+  Box(Box(6825, 6825), Box(6825, 6825)),
+  Box(Box(6826, 6826), Box(6826, 6826)),
+  Box(Box(6827, 6827), Box(6827, 6827)),
+  Box(Box(6828, 6828), Box(6828, 6828)),
+  Box(Box(6829, 6829), Box(6829, 6829)),
+  Box(Box(6830, 6830), Box(6830, 6830)),
+  Box(Box(6831, 6831), Box(6831, 6831)),
+  Box(Box(6832, 6832), Box(6832, 6832)),
+  Box(Box(6833, 6833), Box(6833, 6833)),
+  Box(Box(6834, 6834), Box(6834, 6834)),
+  Box(Box(6835, 6835), Box(6835, 6835)),
+  Box(Box(6836, 6836), Box(6836, 6836)),
+  Box(Box(6837, 6837), Box(6837, 6837)),
+  Box(Box(6838, 6838), Box(6838, 6838)),
+  Box(Box(6839, 6839), Box(6839, 6839)),
+  Box(Box(6840, 6840), Box(6840, 6840)),
+  Box(Box(6841, 6841), Box(6841, 6841)),
+  Box(Box(6842, 6842), Box(6842, 6842)),
+  Box(Box(6843, 6843), Box(6843, 6843)),
+  Box(Box(6844, 6844), Box(6844, 6844)),
+  Box(Box(6845, 6845), Box(6845, 6845)),
+  Box(Box(6846, 6846), Box(6846, 6846)),
+  Box(Box(6847, 6847), Box(6847, 6847)),
+  Box(Box(6848, 6848), Box(6848, 6848)),
+  Box(Box(6849, 6849), Box(6849, 6849)),
+  Box(Box(6850, 6850), Box(6850, 6850)),
+  Box(Box(6851, 6851), Box(6851, 6851)),
+  Box(Box(6852, 6852), Box(6852, 6852)),
+  Box(Box(6853, 6853), Box(6853, 6853)),
+  Box(Box(6854, 6854), Box(6854, 6854)),
+  Box(Box(6855, 6855), Box(6855, 6855)),
+  Box(Box(6856, 6856), Box(6856, 6856)),
+  Box(Box(6857, 6857), Box(6857, 6857)),
+  Box(Box(6858, 6858), Box(6858, 6858)),
+  Box(Box(6859, 6859), Box(6859, 6859)),
+  Box(Box(6860, 6860), Box(6860, 6860)),
+  Box(Box(6861, 6861), Box(6861, 6861)),
+  Box(Box(6862, 6862), Box(6862, 6862)),
+  Box(Box(6863, 6863), Box(6863, 6863)),
+  Box(Box(6864, 6864), Box(6864, 6864)),
+  Box(Box(6865, 6865), Box(6865, 6865)),
+  Box(Box(6866, 6866), Box(6866, 6866)),
+  Box(Box(6867, 6867), Box(6867, 6867)),
+  Box(Box(6868, 6868), Box(6868, 6868)),
+  Box(Box(6869, 6869), Box(6869, 6869)),
+  Box(Box(6870, 6870), Box(6870, 6870)),
+  Box(Box(6871, 6871), Box(6871, 6871)),
+  Box(Box(6872, 6872), Box(6872, 6872)),
+  Box(Box(6873, 6873), Box(6873, 6873)),
+  Box(Box(6874, 6874), Box(6874, 6874)),
+  Box(Box(6875, 6875), Box(6875, 6875)),
+  Box(Box(6876, 6876), Box(6876, 6876)),
+  Box(Box(6877, 6877), Box(6877, 6877)),
+  Box(Box(6878, 6878), Box(6878, 6878)),
+  Box(Box(6879, 6879), Box(6879, 6879)),
+  Box(Box(6880, 6880), Box(6880, 6880)),
+  Box(Box(6881, 6881), Box(6881, 6881)),
+  Box(Box(6882, 6882), Box(6882, 6882)),
+  Box(Box(6883, 6883), Box(6883, 6883)),
+  Box(Box(6884, 6884), Box(6884, 6884)),
+  Box(Box(6885, 6885), Box(6885, 6885)),
+  Box(Box(6886, 6886), Box(6886, 6886)),
+  Box(Box(6887, 6887), Box(6887, 6887)),
+  Box(Box(6888, 6888), Box(6888, 6888)),
+  Box(Box(6889, 6889), Box(6889, 6889)),
+  Box(Box(6890, 6890), Box(6890, 6890)),
+  Box(Box(6891, 6891), Box(6891, 6891)),
+  Box(Box(6892, 6892), Box(6892, 6892)),
+  Box(Box(6893, 6893), Box(6893, 6893)),
+  Box(Box(6894, 6894), Box(6894, 6894)),
+  Box(Box(6895, 6895), Box(6895, 6895)),
+  Box(Box(6896, 6896), Box(6896, 6896)),
+  Box(Box(6897, 6897), Box(6897, 6897)),
+  Box(Box(6898, 6898), Box(6898, 6898)),
+  Box(Box(6899, 6899), Box(6899, 6899)),
+  Box(Box(6900, 6900), Box(6900, 6900)),
+  Box(Box(6901, 6901), Box(6901, 6901)),
+  Box(Box(6902, 6902), Box(6902, 6902)),
+  Box(Box(6903, 6903), Box(6903, 6903)),
+  Box(Box(6904, 6904), Box(6904, 6904)),
+  Box(Box(6905, 6905), Box(6905, 6905)),
+  Box(Box(6906, 6906), Box(6906, 6906)),
+  Box(Box(6907, 6907), Box(6907, 6907)),
+  Box(Box(6908, 6908), Box(6908, 6908)),
+  Box(Box(6909, 6909), Box(6909, 6909)),
+  Box(Box(6910, 6910), Box(6910, 6910)),
+  Box(Box(6911, 6911), Box(6911, 6911)),
+  Box(Box(6912, 6912), Box(6912, 6912)),
+  Box(Box(6913, 6913), Box(6913, 6913)),
+  Box(Box(6914, 6914), Box(6914, 6914)),
+  Box(Box(6915, 6915), Box(6915, 6915)),
+  Box(Box(6916, 6916), Box(6916, 6916)),
+  Box(Box(6917, 6917), Box(6917, 6917)),
+  Box(Box(6918, 6918), Box(6918, 6918)),
+  Box(Box(6919, 6919), Box(6919, 6919)),
+  Box(Box(6920, 6920), Box(6920, 6920)),
+  Box(Box(6921, 6921), Box(6921, 6921)),
+  Box(Box(6922, 6922), Box(6922, 6922)),
+  Box(Box(6923, 6923), Box(6923, 6923)),
+  Box(Box(6924, 6924), Box(6924, 6924)),
+  Box(Box(6925, 6925), Box(6925, 6925)),
+  Box(Box(6926, 6926), Box(6926, 6926)),
+  Box(Box(6927, 6927), Box(6927, 6927)),
+  Box(Box(6928, 6928), Box(6928, 6928)),
+  Box(Box(6929, 6929), Box(6929, 6929)),
+  Box(Box(6930, 6930), Box(6930, 6930)),
+  Box(Box(6931, 6931), Box(6931, 6931)),
+  Box(Box(6932, 6932), Box(6932, 6932)),
+  Box(Box(6933, 6933), Box(6933, 6933)),
+  Box(Box(6934, 6934), Box(6934, 6934)),
+  Box(Box(6935, 6935), Box(6935, 6935)),
+  Box(Box(6936, 6936), Box(6936, 6936)),
+  Box(Box(6937, 6937), Box(6937, 6937)),
+  Box(Box(6938, 6938), Box(6938, 6938)),
+  Box(Box(6939, 6939), Box(6939, 6939)),
+  Box(Box(6940, 6940), Box(6940, 6940)),
+  Box(Box(6941, 6941), Box(6941, 6941)),
+  Box(Box(6942, 6942), Box(6942, 6942)),
+  Box(Box(6943, 6943), Box(6943, 6943)),
+  Box(Box(6944, 6944), Box(6944, 6944)),
+  Box(Box(6945, 6945), Box(6945, 6945)),
+  Box(Box(6946, 6946), Box(6946, 6946)),
+  Box(Box(6947, 6947), Box(6947, 6947)),
+  Box(Box(6948, 6948), Box(6948, 6948)),
+  Box(Box(6949, 6949), Box(6949, 6949)),
+  Box(Box(6950, 6950), Box(6950, 6950)),
+  Box(Box(6951, 6951), Box(6951, 6951)),
+  Box(Box(6952, 6952), Box(6952, 6952)),
+  Box(Box(6953, 6953), Box(6953, 6953)),
+  Box(Box(6954, 6954), Box(6954, 6954)),
+  Box(Box(6955, 6955), Box(6955, 6955)),
+  Box(Box(6956, 6956), Box(6956, 6956)),
+  Box(Box(6957, 6957), Box(6957, 6957)),
+  Box(Box(6958, 6958), Box(6958, 6958)),
+  Box(Box(6959, 6959), Box(6959, 6959)),
+  Box(Box(6960, 6960), Box(6960, 6960)),
+  Box(Box(6961, 6961), Box(6961, 6961)),
+  Box(Box(6962, 6962), Box(6962, 6962)),
+  Box(Box(6963, 6963), Box(6963, 6963)),
+  Box(Box(6964, 6964), Box(6964, 6964)),
+  Box(Box(6965, 6965), Box(6965, 6965)),
+  Box(Box(6966, 6966), Box(6966, 6966)),
+  Box(Box(6967, 6967), Box(6967, 6967)),
+  Box(Box(6968, 6968), Box(6968, 6968)),
+  Box(Box(6969, 6969), Box(6969, 6969)),
+  Box(Box(6970, 6970), Box(6970, 6970)),
+  Box(Box(6971, 6971), Box(6971, 6971)),
+  Box(Box(6972, 6972), Box(6972, 6972)),
+  Box(Box(6973, 6973), Box(6973, 6973)),
+  Box(Box(6974, 6974), Box(6974, 6974)),
+  Box(Box(6975, 6975), Box(6975, 6975)),
+  Box(Box(6976, 6976), Box(6976, 6976)),
+  Box(Box(6977, 6977), Box(6977, 6977)),
+  Box(Box(6978, 6978), Box(6978, 6978)),
+  Box(Box(6979, 6979), Box(6979, 6979)),
+  Box(Box(6980, 6980), Box(6980, 6980)),
+  Box(Box(6981, 6981), Box(6981, 6981)),
+  Box(Box(6982, 6982), Box(6982, 6982)),
+  Box(Box(6983, 6983), Box(6983, 6983)),
+  Box(Box(6984, 6984), Box(6984, 6984)),
+  Box(Box(6985, 6985), Box(6985, 6985)),
+  Box(Box(6986, 6986), Box(6986, 6986)),
+  Box(Box(6987, 6987), Box(6987, 6987)),
+  Box(Box(6988, 6988), Box(6988, 6988)),
+  Box(Box(6989, 6989), Box(6989, 6989)),
+  Box(Box(6990, 6990), Box(6990, 6990)),
+  Box(Box(6991, 6991), Box(6991, 6991)),
+  Box(Box(6992, 6992), Box(6992, 6992)),
+  Box(Box(6993, 6993), Box(6993, 6993)),
+  Box(Box(6994, 6994), Box(6994, 6994)),
+  Box(Box(6995, 6995), Box(6995, 6995)),
+  Box(Box(6996, 6996), Box(6996, 6996)),
+  Box(Box(6997, 6997), Box(6997, 6997)),
+  Box(Box(6998, 6998), Box(6998, 6998)),
+  Box(Box(6999, 6999), Box(6999, 6999)),
+  Box(Box(7000, 7000), Box(7000, 7000)),
+  Box(Box(7001, 7001), Box(7001, 7001)),
+  Box(Box(7002, 7002), Box(7002, 7002)),
+  Box(Box(7003, 7003), Box(7003, 7003)),
+  Box(Box(7004, 7004), Box(7004, 7004)),
+  Box(Box(7005, 7005), Box(7005, 7005)),
+  Box(Box(7006, 7006), Box(7006, 7006)),
+  Box(Box(7007, 7007), Box(7007, 7007)),
+  Box(Box(7008, 7008), Box(7008, 7008)),
+  Box(Box(7009, 7009), Box(7009, 7009)),
+  Box(Box(7010, 7010), Box(7010, 7010)),
+  Box(Box(7011, 7011), Box(7011, 7011)),
+  Box(Box(7012, 7012), Box(7012, 7012)),
+  Box(Box(7013, 7013), Box(7013, 7013)),
+  Box(Box(7014, 7014), Box(7014, 7014)),
+  Box(Box(7015, 7015), Box(7015, 7015)),
+  Box(Box(7016, 7016), Box(7016, 7016)),
+  Box(Box(7017, 7017), Box(7017, 7017)),
+  Box(Box(7018, 7018), Box(7018, 7018)),
+  Box(Box(7019, 7019), Box(7019, 7019)),
+  Box(Box(7020, 7020), Box(7020, 7020)),
+  Box(Box(7021, 7021), Box(7021, 7021)),
+  Box(Box(7022, 7022), Box(7022, 7022)),
+  Box(Box(7023, 7023), Box(7023, 7023)),
+  Box(Box(7024, 7024), Box(7024, 7024)),
+  Box(Box(7025, 7025), Box(7025, 7025)),
+  Box(Box(7026, 7026), Box(7026, 7026)),
+  Box(Box(7027, 7027), Box(7027, 7027)),
+  Box(Box(7028, 7028), Box(7028, 7028)),
+  Box(Box(7029, 7029), Box(7029, 7029)),
+  Box(Box(7030, 7030), Box(7030, 7030)),
+  Box(Box(7031, 7031), Box(7031, 7031)),
+  Box(Box(7032, 7032), Box(7032, 7032)),
+  Box(Box(7033, 7033), Box(7033, 7033)),
+  Box(Box(7034, 7034), Box(7034, 7034)),
+  Box(Box(7035, 7035), Box(7035, 7035)),
+  Box(Box(7036, 7036), Box(7036, 7036)),
+  Box(Box(7037, 7037), Box(7037, 7037)),
+  Box(Box(7038, 7038), Box(7038, 7038)),
+  Box(Box(7039, 7039), Box(7039, 7039)),
+  Box(Box(7040, 7040), Box(7040, 7040)),
+  Box(Box(7041, 7041), Box(7041, 7041)),
+  Box(Box(7042, 7042), Box(7042, 7042)),
+  Box(Box(7043, 7043), Box(7043, 7043)),
+  Box(Box(7044, 7044), Box(7044, 7044)),
+  Box(Box(7045, 7045), Box(7045, 7045)),
+  Box(Box(7046, 7046), Box(7046, 7046)),
+  Box(Box(7047, 7047), Box(7047, 7047)),
+  Box(Box(7048, 7048), Box(7048, 7048)),
+  Box(Box(7049, 7049), Box(7049, 7049)),
+  Box(Box(7050, 7050), Box(7050, 7050)),
+  Box(Box(7051, 7051), Box(7051, 7051)),
+  Box(Box(7052, 7052), Box(7052, 7052)),
+  Box(Box(7053, 7053), Box(7053, 7053)),
+  Box(Box(7054, 7054), Box(7054, 7054)),
+  Box(Box(7055, 7055), Box(7055, 7055)),
+  Box(Box(7056, 7056), Box(7056, 7056)),
+  Box(Box(7057, 7057), Box(7057, 7057)),
+  Box(Box(7058, 7058), Box(7058, 7058)),
+  Box(Box(7059, 7059), Box(7059, 7059)),
+  Box(Box(7060, 7060), Box(7060, 7060)),
+  Box(Box(7061, 7061), Box(7061, 7061)),
+  Box(Box(7062, 7062), Box(7062, 7062)),
+  Box(Box(7063, 7063), Box(7063, 7063)),
+  Box(Box(7064, 7064), Box(7064, 7064)),
+  Box(Box(7065, 7065), Box(7065, 7065)),
+  Box(Box(7066, 7066), Box(7066, 7066)),
+  Box(Box(7067, 7067), Box(7067, 7067)),
+  Box(Box(7068, 7068), Box(7068, 7068)),
+  Box(Box(7069, 7069), Box(7069, 7069)),
+  Box(Box(7070, 7070), Box(7070, 7070)),
+  Box(Box(7071, 7071), Box(7071, 7071)),
+  Box(Box(7072, 7072), Box(7072, 7072)),
+  Box(Box(7073, 7073), Box(7073, 7073)),
+  Box(Box(7074, 7074), Box(7074, 7074)),
+  Box(Box(7075, 7075), Box(7075, 7075)),
+  Box(Box(7076, 7076), Box(7076, 7076)),
+  Box(Box(7077, 7077), Box(7077, 7077)),
+  Box(Box(7078, 7078), Box(7078, 7078)),
+  Box(Box(7079, 7079), Box(7079, 7079)),
+  Box(Box(7080, 7080), Box(7080, 7080)),
+  Box(Box(7081, 7081), Box(7081, 7081)),
+  Box(Box(7082, 7082), Box(7082, 7082)),
+  Box(Box(7083, 7083), Box(7083, 7083)),
+  Box(Box(7084, 7084), Box(7084, 7084)),
+  Box(Box(7085, 7085), Box(7085, 7085)),
+  Box(Box(7086, 7086), Box(7086, 7086)),
+  Box(Box(7087, 7087), Box(7087, 7087)),
+  Box(Box(7088, 7088), Box(7088, 7088)),
+  Box(Box(7089, 7089), Box(7089, 7089)),
+  Box(Box(7090, 7090), Box(7090, 7090)),
+  Box(Box(7091, 7091), Box(7091, 7091)),
+  Box(Box(7092, 7092), Box(7092, 7092)),
+  Box(Box(7093, 7093), Box(7093, 7093)),
+  Box(Box(7094, 7094), Box(7094, 7094)),
+  Box(Box(7095, 7095), Box(7095, 7095)),
+  Box(Box(7096, 7096), Box(7096, 7096)),
+  Box(Box(7097, 7097), Box(7097, 7097)),
+  Box(Box(7098, 7098), Box(7098, 7098)),
+  Box(Box(7099, 7099), Box(7099, 7099)),
+  Box(Box(7100, 7100), Box(7100, 7100)),
+  Box(Box(7101, 7101), Box(7101, 7101)),
+  Box(Box(7102, 7102), Box(7102, 7102)),
+  Box(Box(7103, 7103), Box(7103, 7103)),
+  Box(Box(7104, 7104), Box(7104, 7104)),
+  Box(Box(7105, 7105), Box(7105, 7105)),
+  Box(Box(7106, 7106), Box(7106, 7106)),
+  Box(Box(7107, 7107), Box(7107, 7107)),
+  Box(Box(7108, 7108), Box(7108, 7108)),
+  Box(Box(7109, 7109), Box(7109, 7109)),
+  Box(Box(7110, 7110), Box(7110, 7110)),
+  Box(Box(7111, 7111), Box(7111, 7111)),
+  Box(Box(7112, 7112), Box(7112, 7112)),
+  Box(Box(7113, 7113), Box(7113, 7113)),
+  Box(Box(7114, 7114), Box(7114, 7114)),
+  Box(Box(7115, 7115), Box(7115, 7115)),
+  Box(Box(7116, 7116), Box(7116, 7116)),
+  Box(Box(7117, 7117), Box(7117, 7117)),
+  Box(Box(7118, 7118), Box(7118, 7118)),
+  Box(Box(7119, 7119), Box(7119, 7119)),
+  Box(Box(7120, 7120), Box(7120, 7120)),
+  Box(Box(7121, 7121), Box(7121, 7121)),
+  Box(Box(7122, 7122), Box(7122, 7122)),
+  Box(Box(7123, 7123), Box(7123, 7123)),
+  Box(Box(7124, 7124), Box(7124, 7124)),
+  Box(Box(7125, 7125), Box(7125, 7125)),
+  Box(Box(7126, 7126), Box(7126, 7126)),
+  Box(Box(7127, 7127), Box(7127, 7127)),
+  Box(Box(7128, 7128), Box(7128, 7128)),
+  Box(Box(7129, 7129), Box(7129, 7129)),
+  Box(Box(7130, 7130), Box(7130, 7130)),
+  Box(Box(7131, 7131), Box(7131, 7131)),
+  Box(Box(7132, 7132), Box(7132, 7132)),
+  Box(Box(7133, 7133), Box(7133, 7133)),
+  Box(Box(7134, 7134), Box(7134, 7134)),
+  Box(Box(7135, 7135), Box(7135, 7135)),
+  Box(Box(7136, 7136), Box(7136, 7136)),
+  Box(Box(7137, 7137), Box(7137, 7137)),
+  Box(Box(7138, 7138), Box(7138, 7138)),
+  Box(Box(7139, 7139), Box(7139, 7139)),
+  Box(Box(7140, 7140), Box(7140, 7140)),
+  Box(Box(7141, 7141), Box(7141, 7141)),
+  Box(Box(7142, 7142), Box(7142, 7142)),
+  Box(Box(7143, 7143), Box(7143, 7143)),
+  Box(Box(7144, 7144), Box(7144, 7144)),
+  Box(Box(7145, 7145), Box(7145, 7145)),
+  Box(Box(7146, 7146), Box(7146, 7146)),
+  Box(Box(7147, 7147), Box(7147, 7147)),
+  Box(Box(7148, 7148), Box(7148, 7148)),
+  Box(Box(7149, 7149), Box(7149, 7149)),
+  Box(Box(7150, 7150), Box(7150, 7150)),
+  Box(Box(7151, 7151), Box(7151, 7151)),
+  Box(Box(7152, 7152), Box(7152, 7152)),
+  Box(Box(7153, 7153), Box(7153, 7153)),
+  Box(Box(7154, 7154), Box(7154, 7154)),
+  Box(Box(7155, 7155), Box(7155, 7155)),
+  Box(Box(7156, 7156), Box(7156, 7156)),
+  Box(Box(7157, 7157), Box(7157, 7157)),
+  Box(Box(7158, 7158), Box(7158, 7158)),
+  Box(Box(7159, 7159), Box(7159, 7159)),
+  Box(Box(7160, 7160), Box(7160, 7160)),
+  Box(Box(7161, 7161), Box(7161, 7161)),
+  Box(Box(7162, 7162), Box(7162, 7162)),
+  Box(Box(7163, 7163), Box(7163, 7163)),
+  Box(Box(7164, 7164), Box(7164, 7164)),
+  Box(Box(7165, 7165), Box(7165, 7165)),
+  Box(Box(7166, 7166), Box(7166, 7166)),
+  Box(Box(7167, 7167), Box(7167, 7167)),
+  Box(Box(7168, 7168), Box(7168, 7168)),
+  Box(Box(7169, 7169), Box(7169, 7169)),
+  Box(Box(7170, 7170), Box(7170, 7170)),
+  Box(Box(7171, 7171), Box(7171, 7171)),
+  Box(Box(7172, 7172), Box(7172, 7172)),
+  Box(Box(7173, 7173), Box(7173, 7173)),
+  Box(Box(7174, 7174), Box(7174, 7174)),
+  Box(Box(7175, 7175), Box(7175, 7175)),
+  Box(Box(7176, 7176), Box(7176, 7176)),
+  Box(Box(7177, 7177), Box(7177, 7177)),
+  Box(Box(7178, 7178), Box(7178, 7178)),
+  Box(Box(7179, 7179), Box(7179, 7179)),
+  Box(Box(7180, 7180), Box(7180, 7180)),
+  Box(Box(7181, 7181), Box(7181, 7181)),
+  Box(Box(7182, 7182), Box(7182, 7182)),
+  Box(Box(7183, 7183), Box(7183, 7183)),
+  Box(Box(7184, 7184), Box(7184, 7184)),
+  Box(Box(7185, 7185), Box(7185, 7185)),
+  Box(Box(7186, 7186), Box(7186, 7186)),
+  Box(Box(7187, 7187), Box(7187, 7187)),
+  Box(Box(7188, 7188), Box(7188, 7188)),
+  Box(Box(7189, 7189), Box(7189, 7189)),
+  Box(Box(7190, 7190), Box(7190, 7190)),
+  Box(Box(7191, 7191), Box(7191, 7191)),
+  Box(Box(7192, 7192), Box(7192, 7192)),
+  Box(Box(7193, 7193), Box(7193, 7193)),
+  Box(Box(7194, 7194), Box(7194, 7194)),
+  Box(Box(7195, 7195), Box(7195, 7195)),
+  Box(Box(7196, 7196), Box(7196, 7196)),
+  Box(Box(7197, 7197), Box(7197, 7197)),
+  Box(Box(7198, 7198), Box(7198, 7198)),
+  Box(Box(7199, 7199), Box(7199, 7199)),
+  Box(Box(7200, 7200), Box(7200, 7200)),
+  Box(Box(7201, 7201), Box(7201, 7201)),
+  Box(Box(7202, 7202), Box(7202, 7202)),
+  Box(Box(7203, 7203), Box(7203, 7203)),
+  Box(Box(7204, 7204), Box(7204, 7204)),
+  Box(Box(7205, 7205), Box(7205, 7205)),
+  Box(Box(7206, 7206), Box(7206, 7206)),
+  Box(Box(7207, 7207), Box(7207, 7207)),
+  Box(Box(7208, 7208), Box(7208, 7208)),
+  Box(Box(7209, 7209), Box(7209, 7209)),
+  Box(Box(7210, 7210), Box(7210, 7210)),
+  Box(Box(7211, 7211), Box(7211, 7211)),
+  Box(Box(7212, 7212), Box(7212, 7212)),
+  Box(Box(7213, 7213), Box(7213, 7213)),
+  Box(Box(7214, 7214), Box(7214, 7214)),
+  Box(Box(7215, 7215), Box(7215, 7215)),
+  Box(Box(7216, 7216), Box(7216, 7216)),
+  Box(Box(7217, 7217), Box(7217, 7217)),
+  Box(Box(7218, 7218), Box(7218, 7218)),
+  Box(Box(7219, 7219), Box(7219, 7219)),
+  Box(Box(7220, 7220), Box(7220, 7220)),
+  Box(Box(7221, 7221), Box(7221, 7221)),
+  Box(Box(7222, 7222), Box(7222, 7222)),
+  Box(Box(7223, 7223), Box(7223, 7223)),
+  Box(Box(7224, 7224), Box(7224, 7224)),
+  Box(Box(7225, 7225), Box(7225, 7225)),
+  Box(Box(7226, 7226), Box(7226, 7226)),
+  Box(Box(7227, 7227), Box(7227, 7227)),
+  Box(Box(7228, 7228), Box(7228, 7228)),
+  Box(Box(7229, 7229), Box(7229, 7229)),
+  Box(Box(7230, 7230), Box(7230, 7230)),
+  Box(Box(7231, 7231), Box(7231, 7231)),
+  Box(Box(7232, 7232), Box(7232, 7232)),
+  Box(Box(7233, 7233), Box(7233, 7233)),
+  Box(Box(7234, 7234), Box(7234, 7234)),
+  Box(Box(7235, 7235), Box(7235, 7235)),
+  Box(Box(7236, 7236), Box(7236, 7236)),
+  Box(Box(7237, 7237), Box(7237, 7237)),
+  Box(Box(7238, 7238), Box(7238, 7238)),
+  Box(Box(7239, 7239), Box(7239, 7239)),
+  Box(Box(7240, 7240), Box(7240, 7240)),
+  Box(Box(7241, 7241), Box(7241, 7241)),
+  Box(Box(7242, 7242), Box(7242, 7242)),
+  Box(Box(7243, 7243), Box(7243, 7243)),
+  Box(Box(7244, 7244), Box(7244, 7244)),
+  Box(Box(7245, 7245), Box(7245, 7245)),
+  Box(Box(7246, 7246), Box(7246, 7246)),
+  Box(Box(7247, 7247), Box(7247, 7247)),
+  Box(Box(7248, 7248), Box(7248, 7248)),
+  Box(Box(7249, 7249), Box(7249, 7249)),
+  Box(Box(7250, 7250), Box(7250, 7250)),
+  Box(Box(7251, 7251), Box(7251, 7251)),
+  Box(Box(7252, 7252), Box(7252, 7252)),
+  Box(Box(7253, 7253), Box(7253, 7253)),
+  Box(Box(7254, 7254), Box(7254, 7254)),
+  Box(Box(7255, 7255), Box(7255, 7255)),
+  Box(Box(7256, 7256), Box(7256, 7256)),
+  Box(Box(7257, 7257), Box(7257, 7257)),
+  Box(Box(7258, 7258), Box(7258, 7258)),
+  Box(Box(7259, 7259), Box(7259, 7259)),
+  Box(Box(7260, 7260), Box(7260, 7260)),
+  Box(Box(7261, 7261), Box(7261, 7261)),
+  Box(Box(7262, 7262), Box(7262, 7262)),
+  Box(Box(7263, 7263), Box(7263, 7263)),
+  Box(Box(7264, 7264), Box(7264, 7264)),
+  Box(Box(7265, 7265), Box(7265, 7265)),
+  Box(Box(7266, 7266), Box(7266, 7266)),
+  Box(Box(7267, 7267), Box(7267, 7267)),
+  Box(Box(7268, 7268), Box(7268, 7268)),
+  Box(Box(7269, 7269), Box(7269, 7269)),
+  Box(Box(7270, 7270), Box(7270, 7270)),
+  Box(Box(7271, 7271), Box(7271, 7271)),
+  Box(Box(7272, 7272), Box(7272, 7272)),
+  Box(Box(7273, 7273), Box(7273, 7273)),
+  Box(Box(7274, 7274), Box(7274, 7274)),
+  Box(Box(7275, 7275), Box(7275, 7275)),
+  Box(Box(7276, 7276), Box(7276, 7276)),
+  Box(Box(7277, 7277), Box(7277, 7277)),
+  Box(Box(7278, 7278), Box(7278, 7278)),
+  Box(Box(7279, 7279), Box(7279, 7279)),
+  Box(Box(7280, 7280), Box(7280, 7280)),
+  Box(Box(7281, 7281), Box(7281, 7281)),
+  Box(Box(7282, 7282), Box(7282, 7282)),
+  Box(Box(7283, 7283), Box(7283, 7283)),
+  Box(Box(7284, 7284), Box(7284, 7284)),
+  Box(Box(7285, 7285), Box(7285, 7285)),
+  Box(Box(7286, 7286), Box(7286, 7286)),
+  Box(Box(7287, 7287), Box(7287, 7287)),
+  Box(Box(7288, 7288), Box(7288, 7288)),
+  Box(Box(7289, 7289), Box(7289, 7289)),
+  Box(Box(7290, 7290), Box(7290, 7290)),
+  Box(Box(7291, 7291), Box(7291, 7291)),
+  Box(Box(7292, 7292), Box(7292, 7292)),
+  Box(Box(7293, 7293), Box(7293, 7293)),
+  Box(Box(7294, 7294), Box(7294, 7294)),
+  Box(Box(7295, 7295), Box(7295, 7295)),
+  Box(Box(7296, 7296), Box(7296, 7296)),
+  Box(Box(7297, 7297), Box(7297, 7297)),
+  Box(Box(7298, 7298), Box(7298, 7298)),
+  Box(Box(7299, 7299), Box(7299, 7299)),
+  Box(Box(7300, 7300), Box(7300, 7300)),
+  Box(Box(7301, 7301), Box(7301, 7301)),
+  Box(Box(7302, 7302), Box(7302, 7302)),
+  Box(Box(7303, 7303), Box(7303, 7303)),
+  Box(Box(7304, 7304), Box(7304, 7304)),
+  Box(Box(7305, 7305), Box(7305, 7305)),
+  Box(Box(7306, 7306), Box(7306, 7306)),
+  Box(Box(7307, 7307), Box(7307, 7307)),
+  Box(Box(7308, 7308), Box(7308, 7308)),
+  Box(Box(7309, 7309), Box(7309, 7309)),
+  Box(Box(7310, 7310), Box(7310, 7310)),
+  Box(Box(7311, 7311), Box(7311, 7311)),
+  Box(Box(7312, 7312), Box(7312, 7312)),
+  Box(Box(7313, 7313), Box(7313, 7313)),
+  Box(Box(7314, 7314), Box(7314, 7314)),
+  Box(Box(7315, 7315), Box(7315, 7315)),
+  Box(Box(7316, 7316), Box(7316, 7316)),
+  Box(Box(7317, 7317), Box(7317, 7317)),
+  Box(Box(7318, 7318), Box(7318, 7318)),
+  Box(Box(7319, 7319), Box(7319, 7319)),
+  Box(Box(7320, 7320), Box(7320, 7320)),
+  Box(Box(7321, 7321), Box(7321, 7321)),
+  Box(Box(7322, 7322), Box(7322, 7322)),
+  Box(Box(7323, 7323), Box(7323, 7323)),
+  Box(Box(7324, 7324), Box(7324, 7324)),
+  Box(Box(7325, 7325), Box(7325, 7325)),
+  Box(Box(7326, 7326), Box(7326, 7326)),
+  Box(Box(7327, 7327), Box(7327, 7327)),
+  Box(Box(7328, 7328), Box(7328, 7328)),
+  Box(Box(7329, 7329), Box(7329, 7329)),
+  Box(Box(7330, 7330), Box(7330, 7330)),
+  Box(Box(7331, 7331), Box(7331, 7331)),
+  Box(Box(7332, 7332), Box(7332, 7332)),
+  Box(Box(7333, 7333), Box(7333, 7333)),
+  Box(Box(7334, 7334), Box(7334, 7334)),
+  Box(Box(7335, 7335), Box(7335, 7335)),
+  Box(Box(7336, 7336), Box(7336, 7336)),
+  Box(Box(7337, 7337), Box(7337, 7337)),
+  Box(Box(7338, 7338), Box(7338, 7338)),
+  Box(Box(7339, 7339), Box(7339, 7339)),
+  Box(Box(7340, 7340), Box(7340, 7340)),
+  Box(Box(7341, 7341), Box(7341, 7341)),
+  Box(Box(7342, 7342), Box(7342, 7342)),
+  Box(Box(7343, 7343), Box(7343, 7343)),
+  Box(Box(7344, 7344), Box(7344, 7344)),
+  Box(Box(7345, 7345), Box(7345, 7345)),
+  Box(Box(7346, 7346), Box(7346, 7346)),
+  Box(Box(7347, 7347), Box(7347, 7347)),
+  Box(Box(7348, 7348), Box(7348, 7348)),
+  Box(Box(7349, 7349), Box(7349, 7349)),
+  Box(Box(7350, 7350), Box(7350, 7350)),
+  Box(Box(7351, 7351), Box(7351, 7351)),
+  Box(Box(7352, 7352), Box(7352, 7352)),
+  Box(Box(7353, 7353), Box(7353, 7353)),
+  Box(Box(7354, 7354), Box(7354, 7354)),
+  Box(Box(7355, 7355), Box(7355, 7355)),
+  Box(Box(7356, 7356), Box(7356, 7356)),
+  Box(Box(7357, 7357), Box(7357, 7357)),
+  Box(Box(7358, 7358), Box(7358, 7358)),
+  Box(Box(7359, 7359), Box(7359, 7359)),
+  Box(Box(7360, 7360), Box(7360, 7360)),
+  Box(Box(7361, 7361), Box(7361, 7361)),
+  Box(Box(7362, 7362), Box(7362, 7362)),
+  Box(Box(7363, 7363), Box(7363, 7363)),
+  Box(Box(7364, 7364), Box(7364, 7364)),
+  Box(Box(7365, 7365), Box(7365, 7365)),
+  Box(Box(7366, 7366), Box(7366, 7366)),
+  Box(Box(7367, 7367), Box(7367, 7367)),
+  Box(Box(7368, 7368), Box(7368, 7368)),
+  Box(Box(7369, 7369), Box(7369, 7369)),
+  Box(Box(7370, 7370), Box(7370, 7370)),
+  Box(Box(7371, 7371), Box(7371, 7371)),
+  Box(Box(7372, 7372), Box(7372, 7372)),
+  Box(Box(7373, 7373), Box(7373, 7373)),
+  Box(Box(7374, 7374), Box(7374, 7374)),
+  Box(Box(7375, 7375), Box(7375, 7375)),
+  Box(Box(7376, 7376), Box(7376, 7376)),
+  Box(Box(7377, 7377), Box(7377, 7377)),
+  Box(Box(7378, 7378), Box(7378, 7378)),
+  Box(Box(7379, 7379), Box(7379, 7379)),
+  Box(Box(7380, 7380), Box(7380, 7380)),
+  Box(Box(7381, 7381), Box(7381, 7381)),
+  Box(Box(7382, 7382), Box(7382, 7382)),
+  Box(Box(7383, 7383), Box(7383, 7383)),
+  Box(Box(7384, 7384), Box(7384, 7384)),
+  Box(Box(7385, 7385), Box(7385, 7385)),
+  Box(Box(7386, 7386), Box(7386, 7386)),
+  Box(Box(7387, 7387), Box(7387, 7387)),
+  Box(Box(7388, 7388), Box(7388, 7388)),
+  Box(Box(7389, 7389), Box(7389, 7389)),
+  Box(Box(7390, 7390), Box(7390, 7390)),
+  Box(Box(7391, 7391), Box(7391, 7391)),
+  Box(Box(7392, 7392), Box(7392, 7392)),
+  Box(Box(7393, 7393), Box(7393, 7393)),
+  Box(Box(7394, 7394), Box(7394, 7394)),
+  Box(Box(7395, 7395), Box(7395, 7395)),
+  Box(Box(7396, 7396), Box(7396, 7396)),
+  Box(Box(7397, 7397), Box(7397, 7397)),
+  Box(Box(7398, 7398), Box(7398, 7398)),
+  Box(Box(7399, 7399), Box(7399, 7399)),
+  Box(Box(7400, 7400), Box(7400, 7400)),
+  Box(Box(7401, 7401), Box(7401, 7401)),
+  Box(Box(7402, 7402), Box(7402, 7402)),
+  Box(Box(7403, 7403), Box(7403, 7403)),
+  Box(Box(7404, 7404), Box(7404, 7404)),
+  Box(Box(7405, 7405), Box(7405, 7405)),
+  Box(Box(7406, 7406), Box(7406, 7406)),
+  Box(Box(7407, 7407), Box(7407, 7407)),
+  Box(Box(7408, 7408), Box(7408, 7408)),
+  Box(Box(7409, 7409), Box(7409, 7409)),
+  Box(Box(7410, 7410), Box(7410, 7410)),
+  Box(Box(7411, 7411), Box(7411, 7411)),
+  Box(Box(7412, 7412), Box(7412, 7412)),
+  Box(Box(7413, 7413), Box(7413, 7413)),
+  Box(Box(7414, 7414), Box(7414, 7414)),
+  Box(Box(7415, 7415), Box(7415, 7415)),
+  Box(Box(7416, 7416), Box(7416, 7416)),
+  Box(Box(7417, 7417), Box(7417, 7417)),
+  Box(Box(7418, 7418), Box(7418, 7418)),
+  Box(Box(7419, 7419), Box(7419, 7419)),
+  Box(Box(7420, 7420), Box(7420, 7420)),
+  Box(Box(7421, 7421), Box(7421, 7421)),
+  Box(Box(7422, 7422), Box(7422, 7422)),
+  Box(Box(7423, 7423), Box(7423, 7423)),
+  Box(Box(7424, 7424), Box(7424, 7424)),
+  Box(Box(7425, 7425), Box(7425, 7425)),
+  Box(Box(7426, 7426), Box(7426, 7426)),
+  Box(Box(7427, 7427), Box(7427, 7427)),
+  Box(Box(7428, 7428), Box(7428, 7428)),
+  Box(Box(7429, 7429), Box(7429, 7429)),
+  Box(Box(7430, 7430), Box(7430, 7430)),
+  Box(Box(7431, 7431), Box(7431, 7431)),
+  Box(Box(7432, 7432), Box(7432, 7432)),
+  Box(Box(7433, 7433), Box(7433, 7433)),
+  Box(Box(7434, 7434), Box(7434, 7434)),
+  Box(Box(7435, 7435), Box(7435, 7435)),
+  Box(Box(7436, 7436), Box(7436, 7436)),
+  Box(Box(7437, 7437), Box(7437, 7437)),
+  Box(Box(7438, 7438), Box(7438, 7438)),
+  Box(Box(7439, 7439), Box(7439, 7439)),
+  Box(Box(7440, 7440), Box(7440, 7440)),
+  Box(Box(7441, 7441), Box(7441, 7441)),
+  Box(Box(7442, 7442), Box(7442, 7442)),
+  Box(Box(7443, 7443), Box(7443, 7443)),
+  Box(Box(7444, 7444), Box(7444, 7444)),
+  Box(Box(7445, 7445), Box(7445, 7445)),
+  Box(Box(7446, 7446), Box(7446, 7446)),
+  Box(Box(7447, 7447), Box(7447, 7447)),
+  Box(Box(7448, 7448), Box(7448, 7448)),
+  Box(Box(7449, 7449), Box(7449, 7449)),
+  Box(Box(7450, 7450), Box(7450, 7450)),
+  Box(Box(7451, 7451), Box(7451, 7451)),
+  Box(Box(7452, 7452), Box(7452, 7452)),
+  Box(Box(7453, 7453), Box(7453, 7453)),
+  Box(Box(7454, 7454), Box(7454, 7454)),
+  Box(Box(7455, 7455), Box(7455, 7455)),
+  Box(Box(7456, 7456), Box(7456, 7456)),
+  Box(Box(7457, 7457), Box(7457, 7457)),
+  Box(Box(7458, 7458), Box(7458, 7458)),
+  Box(Box(7459, 7459), Box(7459, 7459)),
+  Box(Box(7460, 7460), Box(7460, 7460)),
+  Box(Box(7461, 7461), Box(7461, 7461)),
+  Box(Box(7462, 7462), Box(7462, 7462)),
+  Box(Box(7463, 7463), Box(7463, 7463)),
+  Box(Box(7464, 7464), Box(7464, 7464)),
+  Box(Box(7465, 7465), Box(7465, 7465)),
+  Box(Box(7466, 7466), Box(7466, 7466)),
+  Box(Box(7467, 7467), Box(7467, 7467)),
+  Box(Box(7468, 7468), Box(7468, 7468)),
+  Box(Box(7469, 7469), Box(7469, 7469)),
+  Box(Box(7470, 7470), Box(7470, 7470)),
+  Box(Box(7471, 7471), Box(7471, 7471)),
+  Box(Box(7472, 7472), Box(7472, 7472)),
+  Box(Box(7473, 7473), Box(7473, 7473)),
+  Box(Box(7474, 7474), Box(7474, 7474)),
+  Box(Box(7475, 7475), Box(7475, 7475)),
+  Box(Box(7476, 7476), Box(7476, 7476)),
+  Box(Box(7477, 7477), Box(7477, 7477)),
+  Box(Box(7478, 7478), Box(7478, 7478)),
+  Box(Box(7479, 7479), Box(7479, 7479)),
+  Box(Box(7480, 7480), Box(7480, 7480)),
+  Box(Box(7481, 7481), Box(7481, 7481)),
+  Box(Box(7482, 7482), Box(7482, 7482)),
+  Box(Box(7483, 7483), Box(7483, 7483)),
+  Box(Box(7484, 7484), Box(7484, 7484)),
+  Box(Box(7485, 7485), Box(7485, 7485)),
+  Box(Box(7486, 7486), Box(7486, 7486)),
+  Box(Box(7487, 7487), Box(7487, 7487)),
+  Box(Box(7488, 7488), Box(7488, 7488)),
+  Box(Box(7489, 7489), Box(7489, 7489)),
+  Box(Box(7490, 7490), Box(7490, 7490)),
+  Box(Box(7491, 7491), Box(7491, 7491)),
+  Box(Box(7492, 7492), Box(7492, 7492)),
+  Box(Box(7493, 7493), Box(7493, 7493)),
+  Box(Box(7494, 7494), Box(7494, 7494)),
+  Box(Box(7495, 7495), Box(7495, 7495)),
+  Box(Box(7496, 7496), Box(7496, 7496)),
+  Box(Box(7497, 7497), Box(7497, 7497)),
+  Box(Box(7498, 7498), Box(7498, 7498)),
+  Box(Box(7499, 7499), Box(7499, 7499)),
+  Box(Box(7500, 7500), Box(7500, 7500)),
+  Box(Box(7501, 7501), Box(7501, 7501)),
+  Box(Box(7502, 7502), Box(7502, 7502)),
+  Box(Box(7503, 7503), Box(7503, 7503)),
+  Box(Box(7504, 7504), Box(7504, 7504)),
+  Box(Box(7505, 7505), Box(7505, 7505)),
+  Box(Box(7506, 7506), Box(7506, 7506)),
+  Box(Box(7507, 7507), Box(7507, 7507)),
+  Box(Box(7508, 7508), Box(7508, 7508)),
+  Box(Box(7509, 7509), Box(7509, 7509)),
+  Box(Box(7510, 7510), Box(7510, 7510)),
+  Box(Box(7511, 7511), Box(7511, 7511)),
+  Box(Box(7512, 7512), Box(7512, 7512)),
+  Box(Box(7513, 7513), Box(7513, 7513)),
+  Box(Box(7514, 7514), Box(7514, 7514)),
+  Box(Box(7515, 7515), Box(7515, 7515)),
+  Box(Box(7516, 7516), Box(7516, 7516)),
+  Box(Box(7517, 7517), Box(7517, 7517)),
+  Box(Box(7518, 7518), Box(7518, 7518)),
+  Box(Box(7519, 7519), Box(7519, 7519)),
+  Box(Box(7520, 7520), Box(7520, 7520)),
+  Box(Box(7521, 7521), Box(7521, 7521)),
+  Box(Box(7522, 7522), Box(7522, 7522)),
+  Box(Box(7523, 7523), Box(7523, 7523)),
+  Box(Box(7524, 7524), Box(7524, 7524)),
+  Box(Box(7525, 7525), Box(7525, 7525)),
+  Box(Box(7526, 7526), Box(7526, 7526)),
+  Box(Box(7527, 7527), Box(7527, 7527)),
+  Box(Box(7528, 7528), Box(7528, 7528)),
+  Box(Box(7529, 7529), Box(7529, 7529)),
+  Box(Box(7530, 7530), Box(7530, 7530)),
+  Box(Box(7531, 7531), Box(7531, 7531)),
+  Box(Box(7532, 7532), Box(7532, 7532)),
+  Box(Box(7533, 7533), Box(7533, 7533)),
+  Box(Box(7534, 7534), Box(7534, 7534)),
+  Box(Box(7535, 7535), Box(7535, 7535)),
+  Box(Box(7536, 7536), Box(7536, 7536)),
+  Box(Box(7537, 7537), Box(7537, 7537)),
+  Box(Box(7538, 7538), Box(7538, 7538)),
+  Box(Box(7539, 7539), Box(7539, 7539)),
+  Box(Box(7540, 7540), Box(7540, 7540)),
+  Box(Box(7541, 7541), Box(7541, 7541)),
+  Box(Box(7542, 7542), Box(7542, 7542)),
+  Box(Box(7543, 7543), Box(7543, 7543)),
+  Box(Box(7544, 7544), Box(7544, 7544)),
+  Box(Box(7545, 7545), Box(7545, 7545)),
+  Box(Box(7546, 7546), Box(7546, 7546)),
+  Box(Box(7547, 7547), Box(7547, 7547)),
+  Box(Box(7548, 7548), Box(7548, 7548)),
+  Box(Box(7549, 7549), Box(7549, 7549)),
+  Box(Box(7550, 7550), Box(7550, 7550)),
+  Box(Box(7551, 7551), Box(7551, 7551)),
+  Box(Box(7552, 7552), Box(7552, 7552)),
+  Box(Box(7553, 7553), Box(7553, 7553)),
+  Box(Box(7554, 7554), Box(7554, 7554)),
+  Box(Box(7555, 7555), Box(7555, 7555)),
+  Box(Box(7556, 7556), Box(7556, 7556)),
+  Box(Box(7557, 7557), Box(7557, 7557)),
+  Box(Box(7558, 7558), Box(7558, 7558)),
+  Box(Box(7559, 7559), Box(7559, 7559)),
+  Box(Box(7560, 7560), Box(7560, 7560)),
+  Box(Box(7561, 7561), Box(7561, 7561)),
+  Box(Box(7562, 7562), Box(7562, 7562)),
+  Box(Box(7563, 7563), Box(7563, 7563)),
+  Box(Box(7564, 7564), Box(7564, 7564)),
+  Box(Box(7565, 7565), Box(7565, 7565)),
+  Box(Box(7566, 7566), Box(7566, 7566)),
+  Box(Box(7567, 7567), Box(7567, 7567)),
+  Box(Box(7568, 7568), Box(7568, 7568)),
+  Box(Box(7569, 7569), Box(7569, 7569)),
+  Box(Box(7570, 7570), Box(7570, 7570)),
+  Box(Box(7571, 7571), Box(7571, 7571)),
+  Box(Box(7572, 7572), Box(7572, 7572)),
+  Box(Box(7573, 7573), Box(7573, 7573)),
+  Box(Box(7574, 7574), Box(7574, 7574)),
+  Box(Box(7575, 7575), Box(7575, 7575)),
+  Box(Box(7576, 7576), Box(7576, 7576)),
+  Box(Box(7577, 7577), Box(7577, 7577)),
+  Box(Box(7578, 7578), Box(7578, 7578)),
+  Box(Box(7579, 7579), Box(7579, 7579)),
+  Box(Box(7580, 7580), Box(7580, 7580)),
+  Box(Box(7581, 7581), Box(7581, 7581)),
+  Box(Box(7582, 7582), Box(7582, 7582)),
+  Box(Box(7583, 7583), Box(7583, 7583)),
+  Box(Box(7584, 7584), Box(7584, 7584)),
+  Box(Box(7585, 7585), Box(7585, 7585)),
+  Box(Box(7586, 7586), Box(7586, 7586)),
+  Box(Box(7587, 7587), Box(7587, 7587)),
+  Box(Box(7588, 7588), Box(7588, 7588)),
+  Box(Box(7589, 7589), Box(7589, 7589)),
+  Box(Box(7590, 7590), Box(7590, 7590)),
+  Box(Box(7591, 7591), Box(7591, 7591)),
+  Box(Box(7592, 7592), Box(7592, 7592)),
+  Box(Box(7593, 7593), Box(7593, 7593)),
+  Box(Box(7594, 7594), Box(7594, 7594)),
+  Box(Box(7595, 7595), Box(7595, 7595)),
+  Box(Box(7596, 7596), Box(7596, 7596)),
+  Box(Box(7597, 7597), Box(7597, 7597)),
+  Box(Box(7598, 7598), Box(7598, 7598)),
+  Box(Box(7599, 7599), Box(7599, 7599)),
+  Box(Box(7600, 7600), Box(7600, 7600)),
+  Box(Box(7601, 7601), Box(7601, 7601)),
+  Box(Box(7602, 7602), Box(7602, 7602)),
+  Box(Box(7603, 7603), Box(7603, 7603)),
+  Box(Box(7604, 7604), Box(7604, 7604)),
+  Box(Box(7605, 7605), Box(7605, 7605)),
+  Box(Box(7606, 7606), Box(7606, 7606)),
+  Box(Box(7607, 7607), Box(7607, 7607)),
+  Box(Box(7608, 7608), Box(7608, 7608)),
+  Box(Box(7609, 7609), Box(7609, 7609)),
+  Box(Box(7610, 7610), Box(7610, 7610)),
+  Box(Box(7611, 7611), Box(7611, 7611)),
+  Box(Box(7612, 7612), Box(7612, 7612)),
+  Box(Box(7613, 7613), Box(7613, 7613)),
+  Box(Box(7614, 7614), Box(7614, 7614)),
+  Box(Box(7615, 7615), Box(7615, 7615)),
+  Box(Box(7616, 7616), Box(7616, 7616)),
+  Box(Box(7617, 7617), Box(7617, 7617)),
+  Box(Box(7618, 7618), Box(7618, 7618)),
+  Box(Box(7619, 7619), Box(7619, 7619)),
+  Box(Box(7620, 7620), Box(7620, 7620)),
+  Box(Box(7621, 7621), Box(7621, 7621)),
+  Box(Box(7622, 7622), Box(7622, 7622)),
+  Box(Box(7623, 7623), Box(7623, 7623)),
+  Box(Box(7624, 7624), Box(7624, 7624)),
+  Box(Box(7625, 7625), Box(7625, 7625)),
+  Box(Box(7626, 7626), Box(7626, 7626)),
+  Box(Box(7627, 7627), Box(7627, 7627)),
+  Box(Box(7628, 7628), Box(7628, 7628)),
+  Box(Box(7629, 7629), Box(7629, 7629)),
+  Box(Box(7630, 7630), Box(7630, 7630)),
+  Box(Box(7631, 7631), Box(7631, 7631)),
+  Box(Box(7632, 7632), Box(7632, 7632)),
+  Box(Box(7633, 7633), Box(7633, 7633)),
+  Box(Box(7634, 7634), Box(7634, 7634)),
+  Box(Box(7635, 7635), Box(7635, 7635)),
+  Box(Box(7636, 7636), Box(7636, 7636)),
+  Box(Box(7637, 7637), Box(7637, 7637)),
+  Box(Box(7638, 7638), Box(7638, 7638)),
+  Box(Box(7639, 7639), Box(7639, 7639)),
+  Box(Box(7640, 7640), Box(7640, 7640)),
+  Box(Box(7641, 7641), Box(7641, 7641)),
+  Box(Box(7642, 7642), Box(7642, 7642)),
+  Box(Box(7643, 7643), Box(7643, 7643)),
+  Box(Box(7644, 7644), Box(7644, 7644)),
+  Box(Box(7645, 7645), Box(7645, 7645)),
+  Box(Box(7646, 7646), Box(7646, 7646)),
+  Box(Box(7647, 7647), Box(7647, 7647)),
+  Box(Box(7648, 7648), Box(7648, 7648)),
+  Box(Box(7649, 7649), Box(7649, 7649)),
+  Box(Box(7650, 7650), Box(7650, 7650)),
+  Box(Box(7651, 7651), Box(7651, 7651)),
+  Box(Box(7652, 7652), Box(7652, 7652)),
+  Box(Box(7653, 7653), Box(7653, 7653)),
+  Box(Box(7654, 7654), Box(7654, 7654)),
+  Box(Box(7655, 7655), Box(7655, 7655)),
+  Box(Box(7656, 7656), Box(7656, 7656)),
+  Box(Box(7657, 7657), Box(7657, 7657)),
+  Box(Box(7658, 7658), Box(7658, 7658)),
+  Box(Box(7659, 7659), Box(7659, 7659)),
+  Box(Box(7660, 7660), Box(7660, 7660)),
+  Box(Box(7661, 7661), Box(7661, 7661)),
+  Box(Box(7662, 7662), Box(7662, 7662)),
+  Box(Box(7663, 7663), Box(7663, 7663)),
+  Box(Box(7664, 7664), Box(7664, 7664)),
+  Box(Box(7665, 7665), Box(7665, 7665)),
+  Box(Box(7666, 7666), Box(7666, 7666)),
+  Box(Box(7667, 7667), Box(7667, 7667)),
+  Box(Box(7668, 7668), Box(7668, 7668)),
+  Box(Box(7669, 7669), Box(7669, 7669)),
+  Box(Box(7670, 7670), Box(7670, 7670)),
+  Box(Box(7671, 7671), Box(7671, 7671)),
+  Box(Box(7672, 7672), Box(7672, 7672)),
+  Box(Box(7673, 7673), Box(7673, 7673)),
+  Box(Box(7674, 7674), Box(7674, 7674)),
+  Box(Box(7675, 7675), Box(7675, 7675)),
+  Box(Box(7676, 7676), Box(7676, 7676)),
+  Box(Box(7677, 7677), Box(7677, 7677)),
+  Box(Box(7678, 7678), Box(7678, 7678)),
+  Box(Box(7679, 7679), Box(7679, 7679)),
+  Box(Box(7680, 7680), Box(7680, 7680)),
+  Box(Box(7681, 7681), Box(7681, 7681)),
+  Box(Box(7682, 7682), Box(7682, 7682)),
+  Box(Box(7683, 7683), Box(7683, 7683)),
+  Box(Box(7684, 7684), Box(7684, 7684)),
+  Box(Box(7685, 7685), Box(7685, 7685)),
+  Box(Box(7686, 7686), Box(7686, 7686)),
+  Box(Box(7687, 7687), Box(7687, 7687)),
+  Box(Box(7688, 7688), Box(7688, 7688)),
+  Box(Box(7689, 7689), Box(7689, 7689)),
+  Box(Box(7690, 7690), Box(7690, 7690)),
+  Box(Box(7691, 7691), Box(7691, 7691)),
+  Box(Box(7692, 7692), Box(7692, 7692)),
+  Box(Box(7693, 7693), Box(7693, 7693)),
+  Box(Box(7694, 7694), Box(7694, 7694)),
+  Box(Box(7695, 7695), Box(7695, 7695)),
+  Box(Box(7696, 7696), Box(7696, 7696)),
+  Box(Box(7697, 7697), Box(7697, 7697)),
+  Box(Box(7698, 7698), Box(7698, 7698)),
+  Box(Box(7699, 7699), Box(7699, 7699)),
+  Box(Box(7700, 7700), Box(7700, 7700)),
+  Box(Box(7701, 7701), Box(7701, 7701)),
+  Box(Box(7702, 7702), Box(7702, 7702)),
+  Box(Box(7703, 7703), Box(7703, 7703)),
+  Box(Box(7704, 7704), Box(7704, 7704)),
+  Box(Box(7705, 7705), Box(7705, 7705)),
+  Box(Box(7706, 7706), Box(7706, 7706)),
+  Box(Box(7707, 7707), Box(7707, 7707)),
+  Box(Box(7708, 7708), Box(7708, 7708)),
+  Box(Box(7709, 7709), Box(7709, 7709)),
+  Box(Box(7710, 7710), Box(7710, 7710)),
+  Box(Box(7711, 7711), Box(7711, 7711)),
+  Box(Box(7712, 7712), Box(7712, 7712)),
+  Box(Box(7713, 7713), Box(7713, 7713)),
+  Box(Box(7714, 7714), Box(7714, 7714)),
+  Box(Box(7715, 7715), Box(7715, 7715)),
+  Box(Box(7716, 7716), Box(7716, 7716)),
+  Box(Box(7717, 7717), Box(7717, 7717)),
+  Box(Box(7718, 7718), Box(7718, 7718)),
+  Box(Box(7719, 7719), Box(7719, 7719)),
+  Box(Box(7720, 7720), Box(7720, 7720)),
+  Box(Box(7721, 7721), Box(7721, 7721)),
+  Box(Box(7722, 7722), Box(7722, 7722)),
+  Box(Box(7723, 7723), Box(7723, 7723)),
+  Box(Box(7724, 7724), Box(7724, 7724)),
+  Box(Box(7725, 7725), Box(7725, 7725)),
+  Box(Box(7726, 7726), Box(7726, 7726)),
+  Box(Box(7727, 7727), Box(7727, 7727)),
+  Box(Box(7728, 7728), Box(7728, 7728)),
+  Box(Box(7729, 7729), Box(7729, 7729)),
+  Box(Box(7730, 7730), Box(7730, 7730)),
+  Box(Box(7731, 7731), Box(7731, 7731)),
+  Box(Box(7732, 7732), Box(7732, 7732)),
+  Box(Box(7733, 7733), Box(7733, 7733)),
+  Box(Box(7734, 7734), Box(7734, 7734)),
+  Box(Box(7735, 7735), Box(7735, 7735)),
+  Box(Box(7736, 7736), Box(7736, 7736)),
+  Box(Box(7737, 7737), Box(7737, 7737)),
+  Box(Box(7738, 7738), Box(7738, 7738)),
+  Box(Box(7739, 7739), Box(7739, 7739)),
+  Box(Box(7740, 7740), Box(7740, 7740)),
+  Box(Box(7741, 7741), Box(7741, 7741)),
+  Box(Box(7742, 7742), Box(7742, 7742)),
+  Box(Box(7743, 7743), Box(7743, 7743)),
+  Box(Box(7744, 7744), Box(7744, 7744)),
+  Box(Box(7745, 7745), Box(7745, 7745)),
+  Box(Box(7746, 7746), Box(7746, 7746)),
+  Box(Box(7747, 7747), Box(7747, 7747)),
+  Box(Box(7748, 7748), Box(7748, 7748)),
+  Box(Box(7749, 7749), Box(7749, 7749)),
+  Box(Box(7750, 7750), Box(7750, 7750)),
+  Box(Box(7751, 7751), Box(7751, 7751)),
+  Box(Box(7752, 7752), Box(7752, 7752)),
+  Box(Box(7753, 7753), Box(7753, 7753)),
+  Box(Box(7754, 7754), Box(7754, 7754)),
+  Box(Box(7755, 7755), Box(7755, 7755)),
+  Box(Box(7756, 7756), Box(7756, 7756)),
+  Box(Box(7757, 7757), Box(7757, 7757)),
+  Box(Box(7758, 7758), Box(7758, 7758)),
+  Box(Box(7759, 7759), Box(7759, 7759)),
+  Box(Box(7760, 7760), Box(7760, 7760)),
+  Box(Box(7761, 7761), Box(7761, 7761)),
+  Box(Box(7762, 7762), Box(7762, 7762)),
+  Box(Box(7763, 7763), Box(7763, 7763)),
+  Box(Box(7764, 7764), Box(7764, 7764)),
+  Box(Box(7765, 7765), Box(7765, 7765)),
+  Box(Box(7766, 7766), Box(7766, 7766)),
+  Box(Box(7767, 7767), Box(7767, 7767)),
+  Box(Box(7768, 7768), Box(7768, 7768)),
+  Box(Box(7769, 7769), Box(7769, 7769)),
+  Box(Box(7770, 7770), Box(7770, 7770)),
+  Box(Box(7771, 7771), Box(7771, 7771)),
+  Box(Box(7772, 7772), Box(7772, 7772)),
+  Box(Box(7773, 7773), Box(7773, 7773)),
+  Box(Box(7774, 7774), Box(7774, 7774)),
+  Box(Box(7775, 7775), Box(7775, 7775)),
+  Box(Box(7776, 7776), Box(7776, 7776)),
+  Box(Box(7777, 7777), Box(7777, 7777)),
+  Box(Box(7778, 7778), Box(7778, 7778)),
+  Box(Box(7779, 7779), Box(7779, 7779)),
+  Box(Box(7780, 7780), Box(7780, 7780)),
+  Box(Box(7781, 7781), Box(7781, 7781)),
+  Box(Box(7782, 7782), Box(7782, 7782)),
+  Box(Box(7783, 7783), Box(7783, 7783)),
+  Box(Box(7784, 7784), Box(7784, 7784)),
+  Box(Box(7785, 7785), Box(7785, 7785)),
+  Box(Box(7786, 7786), Box(7786, 7786)),
+  Box(Box(7787, 7787), Box(7787, 7787)),
+  Box(Box(7788, 7788), Box(7788, 7788)),
+  Box(Box(7789, 7789), Box(7789, 7789)),
+  Box(Box(7790, 7790), Box(7790, 7790)),
+  Box(Box(7791, 7791), Box(7791, 7791)),
+  Box(Box(7792, 7792), Box(7792, 7792)),
+  Box(Box(7793, 7793), Box(7793, 7793)),
+  Box(Box(7794, 7794), Box(7794, 7794)),
+  Box(Box(7795, 7795), Box(7795, 7795)),
+  Box(Box(7796, 7796), Box(7796, 7796)),
+  Box(Box(7797, 7797), Box(7797, 7797)),
+  Box(Box(7798, 7798), Box(7798, 7798)),
+  Box(Box(7799, 7799), Box(7799, 7799)),
+  Box(Box(7800, 7800), Box(7800, 7800)),
+  Box(Box(7801, 7801), Box(7801, 7801)),
+  Box(Box(7802, 7802), Box(7802, 7802)),
+  Box(Box(7803, 7803), Box(7803, 7803)),
+  Box(Box(7804, 7804), Box(7804, 7804)),
+  Box(Box(7805, 7805), Box(7805, 7805)),
+  Box(Box(7806, 7806), Box(7806, 7806)),
+  Box(Box(7807, 7807), Box(7807, 7807)),
+  Box(Box(7808, 7808), Box(7808, 7808)),
+  Box(Box(7809, 7809), Box(7809, 7809)),
+  Box(Box(7810, 7810), Box(7810, 7810)),
+  Box(Box(7811, 7811), Box(7811, 7811)),
+  Box(Box(7812, 7812), Box(7812, 7812)),
+  Box(Box(7813, 7813), Box(7813, 7813)),
+  Box(Box(7814, 7814), Box(7814, 7814)),
+  Box(Box(7815, 7815), Box(7815, 7815)),
+  Box(Box(7816, 7816), Box(7816, 7816)),
+  Box(Box(7817, 7817), Box(7817, 7817)),
+  Box(Box(7818, 7818), Box(7818, 7818)),
+  Box(Box(7819, 7819), Box(7819, 7819)),
+  Box(Box(7820, 7820), Box(7820, 7820)),
+  Box(Box(7821, 7821), Box(7821, 7821)),
+  Box(Box(7822, 7822), Box(7822, 7822)),
+  Box(Box(7823, 7823), Box(7823, 7823)),
+  Box(Box(7824, 7824), Box(7824, 7824)),
+  Box(Box(7825, 7825), Box(7825, 7825)),
+  Box(Box(7826, 7826), Box(7826, 7826)),
+  Box(Box(7827, 7827), Box(7827, 7827)),
+  Box(Box(7828, 7828), Box(7828, 7828)),
+  Box(Box(7829, 7829), Box(7829, 7829)),
+  Box(Box(7830, 7830), Box(7830, 7830)),
+  Box(Box(7831, 7831), Box(7831, 7831)),
+  Box(Box(7832, 7832), Box(7832, 7832)),
+  Box(Box(7833, 7833), Box(7833, 7833)),
+  Box(Box(7834, 7834), Box(7834, 7834)),
+  Box(Box(7835, 7835), Box(7835, 7835)),
+  Box(Box(7836, 7836), Box(7836, 7836)),
+  Box(Box(7837, 7837), Box(7837, 7837)),
+  Box(Box(7838, 7838), Box(7838, 7838)),
+  Box(Box(7839, 7839), Box(7839, 7839)),
+  Box(Box(7840, 7840), Box(7840, 7840)),
+  Box(Box(7841, 7841), Box(7841, 7841)),
+  Box(Box(7842, 7842), Box(7842, 7842)),
+  Box(Box(7843, 7843), Box(7843, 7843)),
+  Box(Box(7844, 7844), Box(7844, 7844)),
+  Box(Box(7845, 7845), Box(7845, 7845)),
+  Box(Box(7846, 7846), Box(7846, 7846)),
+  Box(Box(7847, 7847), Box(7847, 7847)),
+  Box(Box(7848, 7848), Box(7848, 7848)),
+  Box(Box(7849, 7849), Box(7849, 7849)),
+  Box(Box(7850, 7850), Box(7850, 7850)),
+  Box(Box(7851, 7851), Box(7851, 7851)),
+  Box(Box(7852, 7852), Box(7852, 7852)),
+  Box(Box(7853, 7853), Box(7853, 7853)),
+  Box(Box(7854, 7854), Box(7854, 7854)),
+  Box(Box(7855, 7855), Box(7855, 7855)),
+  Box(Box(7856, 7856), Box(7856, 7856)),
+  Box(Box(7857, 7857), Box(7857, 7857)),
+  Box(Box(7858, 7858), Box(7858, 7858)),
+  Box(Box(7859, 7859), Box(7859, 7859)),
+  Box(Box(7860, 7860), Box(7860, 7860)),
+  Box(Box(7861, 7861), Box(7861, 7861)),
+  Box(Box(7862, 7862), Box(7862, 7862)),
+  Box(Box(7863, 7863), Box(7863, 7863)),
+  Box(Box(7864, 7864), Box(7864, 7864)),
+  Box(Box(7865, 7865), Box(7865, 7865)),
+  Box(Box(7866, 7866), Box(7866, 7866)),
+  Box(Box(7867, 7867), Box(7867, 7867)),
+  Box(Box(7868, 7868), Box(7868, 7868)),
+  Box(Box(7869, 7869), Box(7869, 7869)),
+  Box(Box(7870, 7870), Box(7870, 7870)),
+  Box(Box(7871, 7871), Box(7871, 7871)),
+  Box(Box(7872, 7872), Box(7872, 7872)),
+  Box(Box(7873, 7873), Box(7873, 7873)),
+  Box(Box(7874, 7874), Box(7874, 7874)),
+  Box(Box(7875, 7875), Box(7875, 7875)),
+  Box(Box(7876, 7876), Box(7876, 7876)),
+  Box(Box(7877, 7877), Box(7877, 7877)),
+  Box(Box(7878, 7878), Box(7878, 7878)),
+  Box(Box(7879, 7879), Box(7879, 7879)),
+  Box(Box(7880, 7880), Box(7880, 7880)),
+  Box(Box(7881, 7881), Box(7881, 7881)),
+  Box(Box(7882, 7882), Box(7882, 7882)),
+  Box(Box(7883, 7883), Box(7883, 7883)),
+  Box(Box(7884, 7884), Box(7884, 7884)),
+  Box(Box(7885, 7885), Box(7885, 7885)),
+  Box(Box(7886, 7886), Box(7886, 7886)),
+  Box(Box(7887, 7887), Box(7887, 7887)),
+  Box(Box(7888, 7888), Box(7888, 7888)),
+  Box(Box(7889, 7889), Box(7889, 7889)),
+  Box(Box(7890, 7890), Box(7890, 7890)),
+  Box(Box(7891, 7891), Box(7891, 7891)),
+  Box(Box(7892, 7892), Box(7892, 7892)),
+  Box(Box(7893, 7893), Box(7893, 7893)),
+  Box(Box(7894, 7894), Box(7894, 7894)),
+  Box(Box(7895, 7895), Box(7895, 7895)),
+  Box(Box(7896, 7896), Box(7896, 7896)),
+  Box(Box(7897, 7897), Box(7897, 7897)),
+  Box(Box(7898, 7898), Box(7898, 7898)),
+  Box(Box(7899, 7899), Box(7899, 7899)),
+  Box(Box(7900, 7900), Box(7900, 7900)),
+  Box(Box(7901, 7901), Box(7901, 7901)),
+  Box(Box(7902, 7902), Box(7902, 7902)),
+  Box(Box(7903, 7903), Box(7903, 7903)),
+  Box(Box(7904, 7904), Box(7904, 7904)),
+  Box(Box(7905, 7905), Box(7905, 7905)),
+  Box(Box(7906, 7906), Box(7906, 7906)),
+  Box(Box(7907, 7907), Box(7907, 7907)),
+  Box(Box(7908, 7908), Box(7908, 7908)),
+  Box(Box(7909, 7909), Box(7909, 7909)),
+  Box(Box(7910, 7910), Box(7910, 7910)),
+  Box(Box(7911, 7911), Box(7911, 7911)),
+  Box(Box(7912, 7912), Box(7912, 7912)),
+  Box(Box(7913, 7913), Box(7913, 7913)),
+  Box(Box(7914, 7914), Box(7914, 7914)),
+  Box(Box(7915, 7915), Box(7915, 7915)),
+  Box(Box(7916, 7916), Box(7916, 7916)),
+  Box(Box(7917, 7917), Box(7917, 7917)),
+  Box(Box(7918, 7918), Box(7918, 7918)),
+  Box(Box(7919, 7919), Box(7919, 7919)),
+  Box(Box(7920, 7920), Box(7920, 7920)),
+  Box(Box(7921, 7921), Box(7921, 7921)),
+  Box(Box(7922, 7922), Box(7922, 7922)),
+  Box(Box(7923, 7923), Box(7923, 7923)),
+  Box(Box(7924, 7924), Box(7924, 7924)),
+  Box(Box(7925, 7925), Box(7925, 7925)),
+  Box(Box(7926, 7926), Box(7926, 7926)),
+  Box(Box(7927, 7927), Box(7927, 7927)),
+  Box(Box(7928, 7928), Box(7928, 7928)),
+  Box(Box(7929, 7929), Box(7929, 7929)),
+  Box(Box(7930, 7930), Box(7930, 7930)),
+  Box(Box(7931, 7931), Box(7931, 7931)),
+  Box(Box(7932, 7932), Box(7932, 7932)),
+  Box(Box(7933, 7933), Box(7933, 7933)),
+  Box(Box(7934, 7934), Box(7934, 7934)),
+  Box(Box(7935, 7935), Box(7935, 7935)),
+  Box(Box(7936, 7936), Box(7936, 7936)),
+  Box(Box(7937, 7937), Box(7937, 7937)),
+  Box(Box(7938, 7938), Box(7938, 7938)),
+  Box(Box(7939, 7939), Box(7939, 7939)),
+  Box(Box(7940, 7940), Box(7940, 7940)),
+  Box(Box(7941, 7941), Box(7941, 7941)),
+  Box(Box(7942, 7942), Box(7942, 7942)),
+  Box(Box(7943, 7943), Box(7943, 7943)),
+  Box(Box(7944, 7944), Box(7944, 7944)),
+  Box(Box(7945, 7945), Box(7945, 7945)),
+  Box(Box(7946, 7946), Box(7946, 7946)),
+  Box(Box(7947, 7947), Box(7947, 7947)),
+  Box(Box(7948, 7948), Box(7948, 7948)),
+  Box(Box(7949, 7949), Box(7949, 7949)),
+  Box(Box(7950, 7950), Box(7950, 7950)),
+  Box(Box(7951, 7951), Box(7951, 7951)),
+  Box(Box(7952, 7952), Box(7952, 7952)),
+  Box(Box(7953, 7953), Box(7953, 7953)),
+  Box(Box(7954, 7954), Box(7954, 7954)),
+  Box(Box(7955, 7955), Box(7955, 7955)),
+  Box(Box(7956, 7956), Box(7956, 7956)),
+  Box(Box(7957, 7957), Box(7957, 7957)),
+  Box(Box(7958, 7958), Box(7958, 7958)),
+  Box(Box(7959, 7959), Box(7959, 7959)),
+  Box(Box(7960, 7960), Box(7960, 7960)),
+  Box(Box(7961, 7961), Box(7961, 7961)),
+  Box(Box(7962, 7962), Box(7962, 7962)),
+  Box(Box(7963, 7963), Box(7963, 7963)),
+  Box(Box(7964, 7964), Box(7964, 7964)),
+  Box(Box(7965, 7965), Box(7965, 7965)),
+  Box(Box(7966, 7966), Box(7966, 7966)),
+  Box(Box(7967, 7967), Box(7967, 7967)),
+  Box(Box(7968, 7968), Box(7968, 7968)),
+  Box(Box(7969, 7969), Box(7969, 7969)),
+  Box(Box(7970, 7970), Box(7970, 7970)),
+  Box(Box(7971, 7971), Box(7971, 7971)),
+  Box(Box(7972, 7972), Box(7972, 7972)),
+  Box(Box(7973, 7973), Box(7973, 7973)),
+  Box(Box(7974, 7974), Box(7974, 7974)),
+  Box(Box(7975, 7975), Box(7975, 7975)),
+  Box(Box(7976, 7976), Box(7976, 7976)),
+  Box(Box(7977, 7977), Box(7977, 7977)),
+  Box(Box(7978, 7978), Box(7978, 7978)),
+  Box(Box(7979, 7979), Box(7979, 7979)),
+  Box(Box(7980, 7980), Box(7980, 7980)),
+  Box(Box(7981, 7981), Box(7981, 7981)),
+  Box(Box(7982, 7982), Box(7982, 7982)),
+  Box(Box(7983, 7983), Box(7983, 7983)),
+  Box(Box(7984, 7984), Box(7984, 7984)),
+  Box(Box(7985, 7985), Box(7985, 7985)),
+  Box(Box(7986, 7986), Box(7986, 7986)),
+  Box(Box(7987, 7987), Box(7987, 7987)),
+  Box(Box(7988, 7988), Box(7988, 7988)),
+  Box(Box(7989, 7989), Box(7989, 7989)),
+  Box(Box(7990, 7990), Box(7990, 7990)),
+  Box(Box(7991, 7991), Box(7991, 7991)),
+  Box(Box(7992, 7992), Box(7992, 7992)),
+  Box(Box(7993, 7993), Box(7993, 7993)),
+  Box(Box(7994, 7994), Box(7994, 7994)),
+  Box(Box(7995, 7995), Box(7995, 7995)),
+  Box(Box(7996, 7996), Box(7996, 7996)),
+  Box(Box(7997, 7997), Box(7997, 7997)),
+  Box(Box(7998, 7998), Box(7998, 7998)),
+  Box(Box(7999, 7999), Box(7999, 7999)),
+  Box(Box(8000, 8000), Box(8000, 8000)),
+  Box(Box(8001, 8001), Box(8001, 8001)),
+  Box(Box(8002, 8002), Box(8002, 8002)),
+  Box(Box(8003, 8003), Box(8003, 8003)),
+  Box(Box(8004, 8004), Box(8004, 8004)),
+  Box(Box(8005, 8005), Box(8005, 8005)),
+  Box(Box(8006, 8006), Box(8006, 8006)),
+  Box(Box(8007, 8007), Box(8007, 8007)),
+  Box(Box(8008, 8008), Box(8008, 8008)),
+  Box(Box(8009, 8009), Box(8009, 8009)),
+  Box(Box(8010, 8010), Box(8010, 8010)),
+  Box(Box(8011, 8011), Box(8011, 8011)),
+  Box(Box(8012, 8012), Box(8012, 8012)),
+  Box(Box(8013, 8013), Box(8013, 8013)),
+  Box(Box(8014, 8014), Box(8014, 8014)),
+  Box(Box(8015, 8015), Box(8015, 8015)),
+  Box(Box(8016, 8016), Box(8016, 8016)),
+  Box(Box(8017, 8017), Box(8017, 8017)),
+  Box(Box(8018, 8018), Box(8018, 8018)),
+  Box(Box(8019, 8019), Box(8019, 8019)),
+  Box(Box(8020, 8020), Box(8020, 8020)),
+  Box(Box(8021, 8021), Box(8021, 8021)),
+  Box(Box(8022, 8022), Box(8022, 8022)),
+  Box(Box(8023, 8023), Box(8023, 8023)),
+  Box(Box(8024, 8024), Box(8024, 8024)),
+  Box(Box(8025, 8025), Box(8025, 8025)),
+  Box(Box(8026, 8026), Box(8026, 8026)),
+  Box(Box(8027, 8027), Box(8027, 8027)),
+  Box(Box(8028, 8028), Box(8028, 8028)),
+  Box(Box(8029, 8029), Box(8029, 8029)),
+  Box(Box(8030, 8030), Box(8030, 8030)),
+  Box(Box(8031, 8031), Box(8031, 8031)),
+  Box(Box(8032, 8032), Box(8032, 8032)),
+  Box(Box(8033, 8033), Box(8033, 8033)),
+  Box(Box(8034, 8034), Box(8034, 8034)),
+  Box(Box(8035, 8035), Box(8035, 8035)),
+  Box(Box(8036, 8036), Box(8036, 8036)),
+  Box(Box(8037, 8037), Box(8037, 8037)),
+  Box(Box(8038, 8038), Box(8038, 8038)),
+  Box(Box(8039, 8039), Box(8039, 8039)),
+  Box(Box(8040, 8040), Box(8040, 8040)),
+  Box(Box(8041, 8041), Box(8041, 8041)),
+  Box(Box(8042, 8042), Box(8042, 8042)),
+  Box(Box(8043, 8043), Box(8043, 8043)),
+  Box(Box(8044, 8044), Box(8044, 8044)),
+  Box(Box(8045, 8045), Box(8045, 8045)),
+  Box(Box(8046, 8046), Box(8046, 8046)),
+  Box(Box(8047, 8047), Box(8047, 8047)),
+  Box(Box(8048, 8048), Box(8048, 8048)),
+  Box(Box(8049, 8049), Box(8049, 8049)),
+  Box(Box(8050, 8050), Box(8050, 8050)),
+  Box(Box(8051, 8051), Box(8051, 8051)),
+  Box(Box(8052, 8052), Box(8052, 8052)),
+  Box(Box(8053, 8053), Box(8053, 8053)),
+  Box(Box(8054, 8054), Box(8054, 8054)),
+  Box(Box(8055, 8055), Box(8055, 8055)),
+  Box(Box(8056, 8056), Box(8056, 8056)),
+  Box(Box(8057, 8057), Box(8057, 8057)),
+  Box(Box(8058, 8058), Box(8058, 8058)),
+  Box(Box(8059, 8059), Box(8059, 8059)),
+  Box(Box(8060, 8060), Box(8060, 8060)),
+  Box(Box(8061, 8061), Box(8061, 8061)),
+  Box(Box(8062, 8062), Box(8062, 8062)),
+  Box(Box(8063, 8063), Box(8063, 8063)),
+  Box(Box(8064, 8064), Box(8064, 8064)),
+  Box(Box(8065, 8065), Box(8065, 8065)),
+  Box(Box(8066, 8066), Box(8066, 8066)),
+  Box(Box(8067, 8067), Box(8067, 8067)),
+  Box(Box(8068, 8068), Box(8068, 8068)),
+  Box(Box(8069, 8069), Box(8069, 8069)),
+  Box(Box(8070, 8070), Box(8070, 8070)),
+  Box(Box(8071, 8071), Box(8071, 8071)),
+  Box(Box(8072, 8072), Box(8072, 8072)),
+  Box(Box(8073, 8073), Box(8073, 8073)),
+  Box(Box(8074, 8074), Box(8074, 8074)),
+  Box(Box(8075, 8075), Box(8075, 8075)),
+  Box(Box(8076, 8076), Box(8076, 8076)),
+  Box(Box(8077, 8077), Box(8077, 8077)),
+  Box(Box(8078, 8078), Box(8078, 8078)),
+  Box(Box(8079, 8079), Box(8079, 8079)),
+  Box(Box(8080, 8080), Box(8080, 8080)),
+  Box(Box(8081, 8081), Box(8081, 8081)),
+  Box(Box(8082, 8082), Box(8082, 8082)),
+  Box(Box(8083, 8083), Box(8083, 8083)),
+  Box(Box(8084, 8084), Box(8084, 8084)),
+  Box(Box(8085, 8085), Box(8085, 8085)),
+  Box(Box(8086, 8086), Box(8086, 8086)),
+  Box(Box(8087, 8087), Box(8087, 8087)),
+  Box(Box(8088, 8088), Box(8088, 8088)),
+  Box(Box(8089, 8089), Box(8089, 8089)),
+  Box(Box(8090, 8090), Box(8090, 8090)),
+  Box(Box(8091, 8091), Box(8091, 8091)),
+  Box(Box(8092, 8092), Box(8092, 8092)),
+  Box(Box(8093, 8093), Box(8093, 8093)),
+  Box(Box(8094, 8094), Box(8094, 8094)),
+  Box(Box(8095, 8095), Box(8095, 8095)),
+  Box(Box(8096, 8096), Box(8096, 8096)),
+  Box(Box(8097, 8097), Box(8097, 8097)),
+  Box(Box(8098, 8098), Box(8098, 8098)),
+  Box(Box(8099, 8099), Box(8099, 8099)),
+  Box(Box(8100, 8100), Box(8100, 8100)),
+  Box(Box(8101, 8101), Box(8101, 8101)),
+  Box(Box(8102, 8102), Box(8102, 8102)),
+  Box(Box(8103, 8103), Box(8103, 8103)),
+  Box(Box(8104, 8104), Box(8104, 8104)),
+  Box(Box(8105, 8105), Box(8105, 8105)),
+  Box(Box(8106, 8106), Box(8106, 8106)),
+  Box(Box(8107, 8107), Box(8107, 8107)),
+  Box(Box(8108, 8108), Box(8108, 8108)),
+  Box(Box(8109, 8109), Box(8109, 8109)),
+  Box(Box(8110, 8110), Box(8110, 8110)),
+  Box(Box(8111, 8111), Box(8111, 8111)),
+  Box(Box(8112, 8112), Box(8112, 8112)),
+  Box(Box(8113, 8113), Box(8113, 8113)),
+  Box(Box(8114, 8114), Box(8114, 8114)),
+  Box(Box(8115, 8115), Box(8115, 8115)),
+  Box(Box(8116, 8116), Box(8116, 8116)),
+  Box(Box(8117, 8117), Box(8117, 8117)),
+  Box(Box(8118, 8118), Box(8118, 8118)),
+  Box(Box(8119, 8119), Box(8119, 8119)),
+  Box(Box(8120, 8120), Box(8120, 8120)),
+  Box(Box(8121, 8121), Box(8121, 8121)),
+  Box(Box(8122, 8122), Box(8122, 8122)),
+  Box(Box(8123, 8123), Box(8123, 8123)),
+  Box(Box(8124, 8124), Box(8124, 8124)),
+  Box(Box(8125, 8125), Box(8125, 8125)),
+  Box(Box(8126, 8126), Box(8126, 8126)),
+  Box(Box(8127, 8127), Box(8127, 8127)),
+  Box(Box(8128, 8128), Box(8128, 8128)),
+  Box(Box(8129, 8129), Box(8129, 8129)),
+  Box(Box(8130, 8130), Box(8130, 8130)),
+  Box(Box(8131, 8131), Box(8131, 8131)),
+  Box(Box(8132, 8132), Box(8132, 8132)),
+  Box(Box(8133, 8133), Box(8133, 8133)),
+  Box(Box(8134, 8134), Box(8134, 8134)),
+  Box(Box(8135, 8135), Box(8135, 8135)),
+  Box(Box(8136, 8136), Box(8136, 8136)),
+  Box(Box(8137, 8137), Box(8137, 8137)),
+  Box(Box(8138, 8138), Box(8138, 8138)),
+  Box(Box(8139, 8139), Box(8139, 8139)),
+  Box(Box(8140, 8140), Box(8140, 8140)),
+  Box(Box(8141, 8141), Box(8141, 8141)),
+  Box(Box(8142, 8142), Box(8142, 8142)),
+  Box(Box(8143, 8143), Box(8143, 8143)),
+  Box(Box(8144, 8144), Box(8144, 8144)),
+  Box(Box(8145, 8145), Box(8145, 8145)),
+  Box(Box(8146, 8146), Box(8146, 8146)),
+  Box(Box(8147, 8147), Box(8147, 8147)),
+  Box(Box(8148, 8148), Box(8148, 8148)),
+  Box(Box(8149, 8149), Box(8149, 8149)),
+  Box(Box(8150, 8150), Box(8150, 8150)),
+  Box(Box(8151, 8151), Box(8151, 8151)),
+  Box(Box(8152, 8152), Box(8152, 8152)),
+  Box(Box(8153, 8153), Box(8153, 8153)),
+  Box(Box(8154, 8154), Box(8154, 8154)),
+  Box(Box(8155, 8155), Box(8155, 8155)),
+  Box(Box(8156, 8156), Box(8156, 8156)),
+  Box(Box(8157, 8157), Box(8157, 8157)),
+  Box(Box(8158, 8158), Box(8158, 8158)),
+  Box(Box(8159, 8159), Box(8159, 8159)),
+  Box(Box(8160, 8160), Box(8160, 8160)),
+  Box(Box(8161, 8161), Box(8161, 8161)),
+  Box(Box(8162, 8162), Box(8162, 8162)),
+  Box(Box(8163, 8163), Box(8163, 8163)),
+  Box(Box(8164, 8164), Box(8164, 8164)),
+  Box(Box(8165, 8165), Box(8165, 8165)),
+  Box(Box(8166, 8166), Box(8166, 8166)),
+  Box(Box(8167, 8167), Box(8167, 8167)),
+  Box(Box(8168, 8168), Box(8168, 8168)),
+  Box(Box(8169, 8169), Box(8169, 8169)),
+  Box(Box(8170, 8170), Box(8170, 8170)),
+  Box(Box(8171, 8171), Box(8171, 8171)),
+  Box(Box(8172, 8172), Box(8172, 8172)),
+  Box(Box(8173, 8173), Box(8173, 8173)),
+  Box(Box(8174, 8174), Box(8174, 8174)),
+  Box(Box(8175, 8175), Box(8175, 8175)),
+  Box(Box(8176, 8176), Box(8176, 8176)),
+  Box(Box(8177, 8177), Box(8177, 8177)),
+  Box(Box(8178, 8178), Box(8178, 8178)),
+  Box(Box(8179, 8179), Box(8179, 8179)),
+  Box(Box(8180, 8180), Box(8180, 8180)),
+  Box(Box(8181, 8181), Box(8181, 8181)),
+  Box(Box(8182, 8182), Box(8182, 8182)),
+  Box(Box(8183, 8183), Box(8183, 8183)),
+  Box(Box(8184, 8184), Box(8184, 8184)),
+  Box(Box(8185, 8185), Box(8185, 8185)),
+  Box(Box(8186, 8186), Box(8186, 8186)),
+  Box(Box(8187, 8187), Box(8187, 8187)),
+  Box(Box(8188, 8188), Box(8188, 8188)),
+  Box(Box(8189, 8189), Box(8189, 8189)),
+  Box(Box(8190, 8190), Box(8190, 8190)),
+  Box(Box(8191, 8191), Box(8191, 8191)),
+  Box(Box(8192, 8192), Box(8192, 8192)),
+  Box(Box(8193, 8193), Box(8193, 8193)),
+  Box(Box(8194, 8194), Box(8194, 8194)),
+  Box(Box(8195, 8195), Box(8195, 8195)),
+  Box(Box(8196, 8196), Box(8196, 8196)),
+  Box(Box(8197, 8197), Box(8197, 8197)),
+  Box(Box(8198, 8198), Box(8198, 8198)),
+  Box(Box(8199, 8199), Box(8199, 8199)),
+  Box(Box(8200, 8200), Box(8200, 8200)),
+  Box(Box(8201, 8201), Box(8201, 8201)),
+  Box(Box(8202, 8202), Box(8202, 8202)),
+  Box(Box(8203, 8203), Box(8203, 8203)),
+  Box(Box(8204, 8204), Box(8204, 8204)),
+  Box(Box(8205, 8205), Box(8205, 8205)),
+  Box(Box(8206, 8206), Box(8206, 8206)),
+  Box(Box(8207, 8207), Box(8207, 8207)),
+  Box(Box(8208, 8208), Box(8208, 8208)),
+  Box(Box(8209, 8209), Box(8209, 8209)),
+  Box(Box(8210, 8210), Box(8210, 8210)),
+  Box(Box(8211, 8211), Box(8211, 8211)),
+  Box(Box(8212, 8212), Box(8212, 8212)),
+  Box(Box(8213, 8213), Box(8213, 8213)),
+  Box(Box(8214, 8214), Box(8214, 8214)),
+  Box(Box(8215, 8215), Box(8215, 8215)),
+  Box(Box(8216, 8216), Box(8216, 8216)),
+  Box(Box(8217, 8217), Box(8217, 8217)),
+  Box(Box(8218, 8218), Box(8218, 8218)),
+  Box(Box(8219, 8219), Box(8219, 8219)),
+  Box(Box(8220, 8220), Box(8220, 8220)),
+  Box(Box(8221, 8221), Box(8221, 8221)),
+  Box(Box(8222, 8222), Box(8222, 8222)),
+  Box(Box(8223, 8223), Box(8223, 8223)),
+  Box(Box(8224, 8224), Box(8224, 8224)),
+  Box(Box(8225, 8225), Box(8225, 8225)),
+  Box(Box(8226, 8226), Box(8226, 8226)),
+  Box(Box(8227, 8227), Box(8227, 8227)),
+  Box(Box(8228, 8228), Box(8228, 8228)),
+  Box(Box(8229, 8229), Box(8229, 8229)),
+  Box(Box(8230, 8230), Box(8230, 8230)),
+  Box(Box(8231, 8231), Box(8231, 8231)),
+  Box(Box(8232, 8232), Box(8232, 8232)),
+  Box(Box(8233, 8233), Box(8233, 8233)),
+  Box(Box(8234, 8234), Box(8234, 8234)),
+  Box(Box(8235, 8235), Box(8235, 8235)),
+  Box(Box(8236, 8236), Box(8236, 8236)),
+  Box(Box(8237, 8237), Box(8237, 8237)),
+  Box(Box(8238, 8238), Box(8238, 8238)),
+  Box(Box(8239, 8239), Box(8239, 8239)),
+  Box(Box(8240, 8240), Box(8240, 8240)),
+  Box(Box(8241, 8241), Box(8241, 8241)),
+  Box(Box(8242, 8242), Box(8242, 8242)),
+  Box(Box(8243, 8243), Box(8243, 8243)),
+  Box(Box(8244, 8244), Box(8244, 8244)),
+  Box(Box(8245, 8245), Box(8245, 8245)),
+  Box(Box(8246, 8246), Box(8246, 8246)),
+  Box(Box(8247, 8247), Box(8247, 8247)),
+  Box(Box(8248, 8248), Box(8248, 8248)),
+  Box(Box(8249, 8249), Box(8249, 8249)),
+  Box(Box(8250, 8250), Box(8250, 8250)),
+  Box(Box(8251, 8251), Box(8251, 8251)),
+  Box(Box(8252, 8252), Box(8252, 8252)),
+  Box(Box(8253, 8253), Box(8253, 8253)),
+  Box(Box(8254, 8254), Box(8254, 8254)),
+  Box(Box(8255, 8255), Box(8255, 8255)),
+  Box(Box(8256, 8256), Box(8256, 8256)),
+  Box(Box(8257, 8257), Box(8257, 8257)),
+  Box(Box(8258, 8258), Box(8258, 8258)),
+  Box(Box(8259, 8259), Box(8259, 8259)),
+  Box(Box(8260, 8260), Box(8260, 8260)),
+  Box(Box(8261, 8261), Box(8261, 8261)),
+  Box(Box(8262, 8262), Box(8262, 8262)),
+  Box(Box(8263, 8263), Box(8263, 8263)),
+  Box(Box(8264, 8264), Box(8264, 8264)),
+  Box(Box(8265, 8265), Box(8265, 8265)),
+  Box(Box(8266, 8266), Box(8266, 8266)),
+  Box(Box(8267, 8267), Box(8267, 8267)),
+  Box(Box(8268, 8268), Box(8268, 8268)),
+  Box(Box(8269, 8269), Box(8269, 8269)),
+  Box(Box(8270, 8270), Box(8270, 8270)),
+  Box(Box(8271, 8271), Box(8271, 8271)),
+  Box(Box(8272, 8272), Box(8272, 8272)),
+  Box(Box(8273, 8273), Box(8273, 8273)),
+  Box(Box(8274, 8274), Box(8274, 8274)),
+  Box(Box(8275, 8275), Box(8275, 8275)),
+  Box(Box(8276, 8276), Box(8276, 8276)),
+  Box(Box(8277, 8277), Box(8277, 8277)),
+  Box(Box(8278, 8278), Box(8278, 8278)),
+  Box(Box(8279, 8279), Box(8279, 8279)),
+  Box(Box(8280, 8280), Box(8280, 8280)),
+  Box(Box(8281, 8281), Box(8281, 8281)),
+  Box(Box(8282, 8282), Box(8282, 8282)),
+  Box(Box(8283, 8283), Box(8283, 8283)),
+  Box(Box(8284, 8284), Box(8284, 8284)),
+  Box(Box(8285, 8285), Box(8285, 8285)),
+  Box(Box(8286, 8286), Box(8286, 8286)),
+  Box(Box(8287, 8287), Box(8287, 8287)),
+  Box(Box(8288, 8288), Box(8288, 8288)),
+  Box(Box(8289, 8289), Box(8289, 8289)),
+  Box(Box(8290, 8290), Box(8290, 8290)),
+  Box(Box(8291, 8291), Box(8291, 8291)),
+  Box(Box(8292, 8292), Box(8292, 8292)),
+  Box(Box(8293, 8293), Box(8293, 8293)),
+  Box(Box(8294, 8294), Box(8294, 8294)),
+  Box(Box(8295, 8295), Box(8295, 8295)),
+  Box(Box(8296, 8296), Box(8296, 8296)),
+  Box(Box(8297, 8297), Box(8297, 8297)),
+  Box(Box(8298, 8298), Box(8298, 8298)),
+  Box(Box(8299, 8299), Box(8299, 8299)),
+  Box(Box(8300, 8300), Box(8300, 8300)),
+  Box(Box(8301, 8301), Box(8301, 8301)),
+  Box(Box(8302, 8302), Box(8302, 8302)),
+  Box(Box(8303, 8303), Box(8303, 8303)),
+  Box(Box(8304, 8304), Box(8304, 8304)),
+  Box(Box(8305, 8305), Box(8305, 8305)),
+  Box(Box(8306, 8306), Box(8306, 8306)),
+  Box(Box(8307, 8307), Box(8307, 8307)),
+  Box(Box(8308, 8308), Box(8308, 8308)),
+  Box(Box(8309, 8309), Box(8309, 8309)),
+  Box(Box(8310, 8310), Box(8310, 8310)),
+  Box(Box(8311, 8311), Box(8311, 8311)),
+  Box(Box(8312, 8312), Box(8312, 8312)),
+  Box(Box(8313, 8313), Box(8313, 8313)),
+  Box(Box(8314, 8314), Box(8314, 8314)),
+  Box(Box(8315, 8315), Box(8315, 8315)),
+  Box(Box(8316, 8316), Box(8316, 8316)),
+  Box(Box(8317, 8317), Box(8317, 8317)),
+  Box(Box(8318, 8318), Box(8318, 8318)),
+  Box(Box(8319, 8319), Box(8319, 8319)),
+  Box(Box(8320, 8320), Box(8320, 8320)),
+  Box(Box(8321, 8321), Box(8321, 8321)),
+  Box(Box(8322, 8322), Box(8322, 8322)),
+  Box(Box(8323, 8323), Box(8323, 8323)),
+  Box(Box(8324, 8324), Box(8324, 8324)),
+  Box(Box(8325, 8325), Box(8325, 8325)),
+  Box(Box(8326, 8326), Box(8326, 8326)),
+  Box(Box(8327, 8327), Box(8327, 8327)),
+  Box(Box(8328, 8328), Box(8328, 8328)),
+  Box(Box(8329, 8329), Box(8329, 8329)),
+  Box(Box(8330, 8330), Box(8330, 8330)),
+  Box(Box(8331, 8331), Box(8331, 8331)),
+  Box(Box(8332, 8332), Box(8332, 8332)),
+  Box(Box(8333, 8333), Box(8333, 8333)),
+  Box(Box(8334, 8334), Box(8334, 8334)),
+  Box(Box(8335, 8335), Box(8335, 8335)),
+  Box(Box(8336, 8336), Box(8336, 8336)),
+  Box(Box(8337, 8337), Box(8337, 8337)),
+  Box(Box(8338, 8338), Box(8338, 8338)),
+  Box(Box(8339, 8339), Box(8339, 8339)),
+  Box(Box(8340, 8340), Box(8340, 8340)),
+  Box(Box(8341, 8341), Box(8341, 8341)),
+  Box(Box(8342, 8342), Box(8342, 8342)),
+  Box(Box(8343, 8343), Box(8343, 8343)),
+  Box(Box(8344, 8344), Box(8344, 8344)),
+  Box(Box(8345, 8345), Box(8345, 8345)),
+  Box(Box(8346, 8346), Box(8346, 8346)),
+  Box(Box(8347, 8347), Box(8347, 8347)),
+  Box(Box(8348, 8348), Box(8348, 8348)),
+  Box(Box(8349, 8349), Box(8349, 8349)),
+  Box(Box(8350, 8350), Box(8350, 8350)),
+  Box(Box(8351, 8351), Box(8351, 8351)),
+  Box(Box(8352, 8352), Box(8352, 8352)),
+  Box(Box(8353, 8353), Box(8353, 8353)),
+  Box(Box(8354, 8354), Box(8354, 8354)),
+  Box(Box(8355, 8355), Box(8355, 8355)),
+  Box(Box(8356, 8356), Box(8356, 8356)),
+  Box(Box(8357, 8357), Box(8357, 8357)),
+  Box(Box(8358, 8358), Box(8358, 8358)),
+  Box(Box(8359, 8359), Box(8359, 8359)),
+  Box(Box(8360, 8360), Box(8360, 8360)),
+  Box(Box(8361, 8361), Box(8361, 8361)),
+  Box(Box(8362, 8362), Box(8362, 8362)),
+  Box(Box(8363, 8363), Box(8363, 8363)),
+  Box(Box(8364, 8364), Box(8364, 8364)),
+  Box(Box(8365, 8365), Box(8365, 8365)),
+  Box(Box(8366, 8366), Box(8366, 8366)),
+  Box(Box(8367, 8367), Box(8367, 8367)),
+  Box(Box(8368, 8368), Box(8368, 8368)),
+  Box(Box(8369, 8369), Box(8369, 8369)),
+  Box(Box(8370, 8370), Box(8370, 8370)),
+  Box(Box(8371, 8371), Box(8371, 8371)),
+  Box(Box(8372, 8372), Box(8372, 8372)),
+  Box(Box(8373, 8373), Box(8373, 8373)),
+  Box(Box(8374, 8374), Box(8374, 8374)),
+  Box(Box(8375, 8375), Box(8375, 8375)),
+  Box(Box(8376, 8376), Box(8376, 8376)),
+  Box(Box(8377, 8377), Box(8377, 8377)),
+  Box(Box(8378, 8378), Box(8378, 8378)),
+  Box(Box(8379, 8379), Box(8379, 8379)),
+  Box(Box(8380, 8380), Box(8380, 8380)),
+  Box(Box(8381, 8381), Box(8381, 8381)),
+  Box(Box(8382, 8382), Box(8382, 8382)),
+  Box(Box(8383, 8383), Box(8383, 8383)),
+  Box(Box(8384, 8384), Box(8384, 8384)),
+  Box(Box(8385, 8385), Box(8385, 8385)),
+  Box(Box(8386, 8386), Box(8386, 8386)),
+  Box(Box(8387, 8387), Box(8387, 8387)),
+  Box(Box(8388, 8388), Box(8388, 8388)),
+  Box(Box(8389, 8389), Box(8389, 8389)),
+  Box(Box(8390, 8390), Box(8390, 8390)),
+  Box(Box(8391, 8391), Box(8391, 8391)),
+  Box(Box(8392, 8392), Box(8392, 8392)),
+  Box(Box(8393, 8393), Box(8393, 8393)),
+  Box(Box(8394, 8394), Box(8394, 8394)),
+  Box(Box(8395, 8395), Box(8395, 8395)),
+  Box(Box(8396, 8396), Box(8396, 8396)),
+  Box(Box(8397, 8397), Box(8397, 8397)),
+  Box(Box(8398, 8398), Box(8398, 8398)),
+  Box(Box(8399, 8399), Box(8399, 8399)),
+  Box(Box(8400, 8400), Box(8400, 8400)),
+  Box(Box(8401, 8401), Box(8401, 8401)),
+  Box(Box(8402, 8402), Box(8402, 8402)),
+  Box(Box(8403, 8403), Box(8403, 8403)),
+  Box(Box(8404, 8404), Box(8404, 8404)),
+  Box(Box(8405, 8405), Box(8405, 8405)),
+  Box(Box(8406, 8406), Box(8406, 8406)),
+  Box(Box(8407, 8407), Box(8407, 8407)),
+  Box(Box(8408, 8408), Box(8408, 8408)),
+  Box(Box(8409, 8409), Box(8409, 8409)),
+  Box(Box(8410, 8410), Box(8410, 8410)),
+  Box(Box(8411, 8411), Box(8411, 8411)),
+  Box(Box(8412, 8412), Box(8412, 8412)),
+  Box(Box(8413, 8413), Box(8413, 8413)),
+  Box(Box(8414, 8414), Box(8414, 8414)),
+  Box(Box(8415, 8415), Box(8415, 8415)),
+  Box(Box(8416, 8416), Box(8416, 8416)),
+  Box(Box(8417, 8417), Box(8417, 8417)),
+  Box(Box(8418, 8418), Box(8418, 8418)),
+  Box(Box(8419, 8419), Box(8419, 8419)),
+  Box(Box(8420, 8420), Box(8420, 8420)),
+  Box(Box(8421, 8421), Box(8421, 8421)),
+  Box(Box(8422, 8422), Box(8422, 8422)),
+  Box(Box(8423, 8423), Box(8423, 8423)),
+  Box(Box(8424, 8424), Box(8424, 8424)),
+  Box(Box(8425, 8425), Box(8425, 8425)),
+  Box(Box(8426, 8426), Box(8426, 8426)),
+  Box(Box(8427, 8427), Box(8427, 8427)),
+  Box(Box(8428, 8428), Box(8428, 8428)),
+  Box(Box(8429, 8429), Box(8429, 8429)),
+  Box(Box(8430, 8430), Box(8430, 8430)),
+  Box(Box(8431, 8431), Box(8431, 8431)),
+  Box(Box(8432, 8432), Box(8432, 8432)),
+  Box(Box(8433, 8433), Box(8433, 8433)),
+  Box(Box(8434, 8434), Box(8434, 8434)),
+  Box(Box(8435, 8435), Box(8435, 8435)),
+  Box(Box(8436, 8436), Box(8436, 8436)),
+  Box(Box(8437, 8437), Box(8437, 8437)),
+  Box(Box(8438, 8438), Box(8438, 8438)),
+  Box(Box(8439, 8439), Box(8439, 8439)),
+  Box(Box(8440, 8440), Box(8440, 8440)),
+  Box(Box(8441, 8441), Box(8441, 8441)),
+  Box(Box(8442, 8442), Box(8442, 8442)),
+  Box(Box(8443, 8443), Box(8443, 8443)),
+  Box(Box(8444, 8444), Box(8444, 8444)),
+  Box(Box(8445, 8445), Box(8445, 8445)),
+  Box(Box(8446, 8446), Box(8446, 8446)),
+  Box(Box(8447, 8447), Box(8447, 8447)),
+  Box(Box(8448, 8448), Box(8448, 8448)),
+  Box(Box(8449, 8449), Box(8449, 8449)),
+  Box(Box(8450, 8450), Box(8450, 8450)),
+  Box(Box(8451, 8451), Box(8451, 8451)),
+  Box(Box(8452, 8452), Box(8452, 8452)),
+  Box(Box(8453, 8453), Box(8453, 8453)),
+  Box(Box(8454, 8454), Box(8454, 8454)),
+  Box(Box(8455, 8455), Box(8455, 8455)),
+  Box(Box(8456, 8456), Box(8456, 8456)),
+  Box(Box(8457, 8457), Box(8457, 8457)),
+  Box(Box(8458, 8458), Box(8458, 8458)),
+  Box(Box(8459, 8459), Box(8459, 8459)),
+  Box(Box(8460, 8460), Box(8460, 8460)),
+  Box(Box(8461, 8461), Box(8461, 8461)),
+  Box(Box(8462, 8462), Box(8462, 8462)),
+  Box(Box(8463, 8463), Box(8463, 8463)),
+  Box(Box(8464, 8464), Box(8464, 8464)),
+  Box(Box(8465, 8465), Box(8465, 8465)),
+  Box(Box(8466, 8466), Box(8466, 8466)),
+  Box(Box(8467, 8467), Box(8467, 8467)),
+  Box(Box(8468, 8468), Box(8468, 8468)),
+  Box(Box(8469, 8469), Box(8469, 8469)),
+  Box(Box(8470, 8470), Box(8470, 8470)),
+  Box(Box(8471, 8471), Box(8471, 8471)),
+  Box(Box(8472, 8472), Box(8472, 8472)),
+  Box(Box(8473, 8473), Box(8473, 8473)),
+  Box(Box(8474, 8474), Box(8474, 8474)),
+  Box(Box(8475, 8475), Box(8475, 8475)),
+  Box(Box(8476, 8476), Box(8476, 8476)),
+  Box(Box(8477, 8477), Box(8477, 8477)),
+  Box(Box(8478, 8478), Box(8478, 8478)),
+  Box(Box(8479, 8479), Box(8479, 8479)),
+  Box(Box(8480, 8480), Box(8480, 8480)),
+  Box(Box(8481, 8481), Box(8481, 8481)),
+  Box(Box(8482, 8482), Box(8482, 8482)),
+  Box(Box(8483, 8483), Box(8483, 8483)),
+  Box(Box(8484, 8484), Box(8484, 8484)),
+  Box(Box(8485, 8485), Box(8485, 8485)),
+  Box(Box(8486, 8486), Box(8486, 8486)),
+  Box(Box(8487, 8487), Box(8487, 8487)),
+  Box(Box(8488, 8488), Box(8488, 8488)),
+  Box(Box(8489, 8489), Box(8489, 8489)),
+  Box(Box(8490, 8490), Box(8490, 8490)),
+  Box(Box(8491, 8491), Box(8491, 8491)),
+  Box(Box(8492, 8492), Box(8492, 8492)),
+  Box(Box(8493, 8493), Box(8493, 8493)),
+  Box(Box(8494, 8494), Box(8494, 8494)),
+  Box(Box(8495, 8495), Box(8495, 8495)),
+  Box(Box(8496, 8496), Box(8496, 8496)),
+  Box(Box(8497, 8497), Box(8497, 8497)),
+  Box(Box(8498, 8498), Box(8498, 8498)),
+  Box(Box(8499, 8499), Box(8499, 8499)),
+  Box(Box(8500, 8500), Box(8500, 8500)),
+  Box(Box(8501, 8501), Box(8501, 8501)),
+  Box(Box(8502, 8502), Box(8502, 8502)),
+  Box(Box(8503, 8503), Box(8503, 8503)),
+  Box(Box(8504, 8504), Box(8504, 8504)),
+  Box(Box(8505, 8505), Box(8505, 8505)),
+  Box(Box(8506, 8506), Box(8506, 8506)),
+  Box(Box(8507, 8507), Box(8507, 8507)),
+  Box(Box(8508, 8508), Box(8508, 8508)),
+  Box(Box(8509, 8509), Box(8509, 8509)),
+  Box(Box(8510, 8510), Box(8510, 8510)),
+  Box(Box(8511, 8511), Box(8511, 8511)),
+  Box(Box(8512, 8512), Box(8512, 8512)),
+  Box(Box(8513, 8513), Box(8513, 8513)),
+  Box(Box(8514, 8514), Box(8514, 8514)),
+  Box(Box(8515, 8515), Box(8515, 8515)),
+  Box(Box(8516, 8516), Box(8516, 8516)),
+  Box(Box(8517, 8517), Box(8517, 8517)),
+  Box(Box(8518, 8518), Box(8518, 8518)),
+  Box(Box(8519, 8519), Box(8519, 8519)),
+  Box(Box(8520, 8520), Box(8520, 8520)),
+  Box(Box(8521, 8521), Box(8521, 8521)),
+  Box(Box(8522, 8522), Box(8522, 8522)),
+  Box(Box(8523, 8523), Box(8523, 8523)),
+  Box(Box(8524, 8524), Box(8524, 8524)),
+  Box(Box(8525, 8525), Box(8525, 8525)),
+  Box(Box(8526, 8526), Box(8526, 8526)),
+  Box(Box(8527, 8527), Box(8527, 8527)),
+  Box(Box(8528, 8528), Box(8528, 8528)),
+  Box(Box(8529, 8529), Box(8529, 8529)),
+  Box(Box(8530, 8530), Box(8530, 8530)),
+  Box(Box(8531, 8531), Box(8531, 8531)),
+  Box(Box(8532, 8532), Box(8532, 8532)),
+  Box(Box(8533, 8533), Box(8533, 8533)),
+  Box(Box(8534, 8534), Box(8534, 8534)),
+  Box(Box(8535, 8535), Box(8535, 8535)),
+  Box(Box(8536, 8536), Box(8536, 8536)),
+  Box(Box(8537, 8537), Box(8537, 8537)),
+  Box(Box(8538, 8538), Box(8538, 8538)),
+  Box(Box(8539, 8539), Box(8539, 8539)),
+  Box(Box(8540, 8540), Box(8540, 8540)),
+  Box(Box(8541, 8541), Box(8541, 8541)),
+  Box(Box(8542, 8542), Box(8542, 8542)),
+  Box(Box(8543, 8543), Box(8543, 8543)),
+  Box(Box(8544, 8544), Box(8544, 8544)),
+  Box(Box(8545, 8545), Box(8545, 8545)),
+  Box(Box(8546, 8546), Box(8546, 8546)),
+  Box(Box(8547, 8547), Box(8547, 8547)),
+  Box(Box(8548, 8548), Box(8548, 8548)),
+  Box(Box(8549, 8549), Box(8549, 8549)),
+  Box(Box(8550, 8550), Box(8550, 8550)),
+  Box(Box(8551, 8551), Box(8551, 8551)),
+  Box(Box(8552, 8552), Box(8552, 8552)),
+  Box(Box(8553, 8553), Box(8553, 8553)),
+  Box(Box(8554, 8554), Box(8554, 8554)),
+  Box(Box(8555, 8555), Box(8555, 8555)),
+  Box(Box(8556, 8556), Box(8556, 8556)),
+  Box(Box(8557, 8557), Box(8557, 8557)),
+  Box(Box(8558, 8558), Box(8558, 8558)),
+  Box(Box(8559, 8559), Box(8559, 8559)),
+  Box(Box(8560, 8560), Box(8560, 8560)),
+  Box(Box(8561, 8561), Box(8561, 8561)),
+  Box(Box(8562, 8562), Box(8562, 8562)),
+  Box(Box(8563, 8563), Box(8563, 8563)),
+  Box(Box(8564, 8564), Box(8564, 8564)),
+  Box(Box(8565, 8565), Box(8565, 8565)),
+  Box(Box(8566, 8566), Box(8566, 8566)),
+  Box(Box(8567, 8567), Box(8567, 8567)),
+  Box(Box(8568, 8568), Box(8568, 8568)),
+  Box(Box(8569, 8569), Box(8569, 8569)),
+  Box(Box(8570, 8570), Box(8570, 8570)),
+  Box(Box(8571, 8571), Box(8571, 8571)),
+  Box(Box(8572, 8572), Box(8572, 8572)),
+  Box(Box(8573, 8573), Box(8573, 8573)),
+  Box(Box(8574, 8574), Box(8574, 8574)),
+  Box(Box(8575, 8575), Box(8575, 8575)),
+  Box(Box(8576, 8576), Box(8576, 8576)),
+  Box(Box(8577, 8577), Box(8577, 8577)),
+  Box(Box(8578, 8578), Box(8578, 8578)),
+  Box(Box(8579, 8579), Box(8579, 8579)),
+  Box(Box(8580, 8580), Box(8580, 8580)),
+  Box(Box(8581, 8581), Box(8581, 8581)),
+  Box(Box(8582, 8582), Box(8582, 8582)),
+  Box(Box(8583, 8583), Box(8583, 8583)),
+  Box(Box(8584, 8584), Box(8584, 8584)),
+  Box(Box(8585, 8585), Box(8585, 8585)),
+  Box(Box(8586, 8586), Box(8586, 8586)),
+  Box(Box(8587, 8587), Box(8587, 8587)),
+  Box(Box(8588, 8588), Box(8588, 8588)),
+  Box(Box(8589, 8589), Box(8589, 8589)),
+  Box(Box(8590, 8590), Box(8590, 8590)),
+  Box(Box(8591, 8591), Box(8591, 8591)),
+  Box(Box(8592, 8592), Box(8592, 8592)),
+  Box(Box(8593, 8593), Box(8593, 8593)),
+  Box(Box(8594, 8594), Box(8594, 8594)),
+  Box(Box(8595, 8595), Box(8595, 8595)),
+  Box(Box(8596, 8596), Box(8596, 8596)),
+  Box(Box(8597, 8597), Box(8597, 8597)),
+  Box(Box(8598, 8598), Box(8598, 8598)),
+  Box(Box(8599, 8599), Box(8599, 8599)),
+  Box(Box(8600, 8600), Box(8600, 8600)),
+  Box(Box(8601, 8601), Box(8601, 8601)),
+  Box(Box(8602, 8602), Box(8602, 8602)),
+  Box(Box(8603, 8603), Box(8603, 8603)),
+  Box(Box(8604, 8604), Box(8604, 8604)),
+  Box(Box(8605, 8605), Box(8605, 8605)),
+  Box(Box(8606, 8606), Box(8606, 8606)),
+  Box(Box(8607, 8607), Box(8607, 8607)),
+  Box(Box(8608, 8608), Box(8608, 8608)),
+  Box(Box(8609, 8609), Box(8609, 8609)),
+  Box(Box(8610, 8610), Box(8610, 8610)),
+  Box(Box(8611, 8611), Box(8611, 8611)),
+  Box(Box(8612, 8612), Box(8612, 8612)),
+  Box(Box(8613, 8613), Box(8613, 8613)),
+  Box(Box(8614, 8614), Box(8614, 8614)),
+  Box(Box(8615, 8615), Box(8615, 8615)),
+  Box(Box(8616, 8616), Box(8616, 8616)),
+  Box(Box(8617, 8617), Box(8617, 8617)),
+  Box(Box(8618, 8618), Box(8618, 8618)),
+  Box(Box(8619, 8619), Box(8619, 8619)),
+  Box(Box(8620, 8620), Box(8620, 8620)),
+  Box(Box(8621, 8621), Box(8621, 8621)),
+  Box(Box(8622, 8622), Box(8622, 8622)),
+  Box(Box(8623, 8623), Box(8623, 8623)),
+  Box(Box(8624, 8624), Box(8624, 8624)),
+  Box(Box(8625, 8625), Box(8625, 8625)),
+  Box(Box(8626, 8626), Box(8626, 8626)),
+  Box(Box(8627, 8627), Box(8627, 8627)),
+  Box(Box(8628, 8628), Box(8628, 8628)),
+  Box(Box(8629, 8629), Box(8629, 8629)),
+  Box(Box(8630, 8630), Box(8630, 8630)),
+  Box(Box(8631, 8631), Box(8631, 8631)),
+  Box(Box(8632, 8632), Box(8632, 8632)),
+  Box(Box(8633, 8633), Box(8633, 8633)),
+  Box(Box(8634, 8634), Box(8634, 8634)),
+  Box(Box(8635, 8635), Box(8635, 8635)),
+  Box(Box(8636, 8636), Box(8636, 8636)),
+  Box(Box(8637, 8637), Box(8637, 8637)),
+  Box(Box(8638, 8638), Box(8638, 8638)),
+  Box(Box(8639, 8639), Box(8639, 8639)),
+  Box(Box(8640, 8640), Box(8640, 8640)),
+  Box(Box(8641, 8641), Box(8641, 8641)),
+  Box(Box(8642, 8642), Box(8642, 8642)),
+  Box(Box(8643, 8643), Box(8643, 8643)),
+  Box(Box(8644, 8644), Box(8644, 8644)),
+  Box(Box(8645, 8645), Box(8645, 8645)),
+  Box(Box(8646, 8646), Box(8646, 8646)),
+  Box(Box(8647, 8647), Box(8647, 8647)),
+  Box(Box(8648, 8648), Box(8648, 8648)),
+  Box(Box(8649, 8649), Box(8649, 8649)),
+  Box(Box(8650, 8650), Box(8650, 8650)),
+  Box(Box(8651, 8651), Box(8651, 8651)),
+  Box(Box(8652, 8652), Box(8652, 8652)),
+  Box(Box(8653, 8653), Box(8653, 8653)),
+  Box(Box(8654, 8654), Box(8654, 8654)),
+  Box(Box(8655, 8655), Box(8655, 8655)),
+  Box(Box(8656, 8656), Box(8656, 8656)),
+  Box(Box(8657, 8657), Box(8657, 8657)),
+  Box(Box(8658, 8658), Box(8658, 8658)),
+  Box(Box(8659, 8659), Box(8659, 8659)),
+  Box(Box(8660, 8660), Box(8660, 8660)),
+  Box(Box(8661, 8661), Box(8661, 8661)),
+  Box(Box(8662, 8662), Box(8662, 8662)),
+  Box(Box(8663, 8663), Box(8663, 8663)),
+  Box(Box(8664, 8664), Box(8664, 8664)),
+  Box(Box(8665, 8665), Box(8665, 8665)),
+  Box(Box(8666, 8666), Box(8666, 8666)),
+  Box(Box(8667, 8667), Box(8667, 8667)),
+  Box(Box(8668, 8668), Box(8668, 8668)),
+  Box(Box(8669, 8669), Box(8669, 8669)),
+  Box(Box(8670, 8670), Box(8670, 8670)),
+  Box(Box(8671, 8671), Box(8671, 8671)),
+  Box(Box(8672, 8672), Box(8672, 8672)),
+  Box(Box(8673, 8673), Box(8673, 8673)),
+  Box(Box(8674, 8674), Box(8674, 8674)),
+  Box(Box(8675, 8675), Box(8675, 8675)),
+  Box(Box(8676, 8676), Box(8676, 8676)),
+  Box(Box(8677, 8677), Box(8677, 8677)),
+  Box(Box(8678, 8678), Box(8678, 8678)),
+  Box(Box(8679, 8679), Box(8679, 8679)),
+  Box(Box(8680, 8680), Box(8680, 8680)),
+  Box(Box(8681, 8681), Box(8681, 8681)),
+  Box(Box(8682, 8682), Box(8682, 8682)),
+  Box(Box(8683, 8683), Box(8683, 8683)),
+  Box(Box(8684, 8684), Box(8684, 8684)),
+  Box(Box(8685, 8685), Box(8685, 8685)),
+  Box(Box(8686, 8686), Box(8686, 8686)),
+  Box(Box(8687, 8687), Box(8687, 8687)),
+  Box(Box(8688, 8688), Box(8688, 8688)),
+  Box(Box(8689, 8689), Box(8689, 8689)),
+  Box(Box(8690, 8690), Box(8690, 8690)),
+  Box(Box(8691, 8691), Box(8691, 8691)),
+  Box(Box(8692, 8692), Box(8692, 8692)),
+  Box(Box(8693, 8693), Box(8693, 8693)),
+  Box(Box(8694, 8694), Box(8694, 8694)),
+  Box(Box(8695, 8695), Box(8695, 8695)),
+  Box(Box(8696, 8696), Box(8696, 8696)),
+  Box(Box(8697, 8697), Box(8697, 8697)),
+  Box(Box(8698, 8698), Box(8698, 8698)),
+  Box(Box(8699, 8699), Box(8699, 8699)),
+  Box(Box(8700, 8700), Box(8700, 8700)),
+  Box(Box(8701, 8701), Box(8701, 8701)),
+  Box(Box(8702, 8702), Box(8702, 8702)),
+  Box(Box(8703, 8703), Box(8703, 8703)),
+  Box(Box(8704, 8704), Box(8704, 8704)),
+  Box(Box(8705, 8705), Box(8705, 8705)),
+  Box(Box(8706, 8706), Box(8706, 8706)),
+  Box(Box(8707, 8707), Box(8707, 8707)),
+  Box(Box(8708, 8708), Box(8708, 8708)),
+  Box(Box(8709, 8709), Box(8709, 8709)),
+  Box(Box(8710, 8710), Box(8710, 8710)),
+  Box(Box(8711, 8711), Box(8711, 8711)),
+  Box(Box(8712, 8712), Box(8712, 8712)),
+  Box(Box(8713, 8713), Box(8713, 8713)),
+  Box(Box(8714, 8714), Box(8714, 8714)),
+  Box(Box(8715, 8715), Box(8715, 8715)),
+  Box(Box(8716, 8716), Box(8716, 8716)),
+  Box(Box(8717, 8717), Box(8717, 8717)),
+  Box(Box(8718, 8718), Box(8718, 8718)),
+  Box(Box(8719, 8719), Box(8719, 8719)),
+  Box(Box(8720, 8720), Box(8720, 8720)),
+  Box(Box(8721, 8721), Box(8721, 8721)),
+  Box(Box(8722, 8722), Box(8722, 8722)),
+  Box(Box(8723, 8723), Box(8723, 8723)),
+  Box(Box(8724, 8724), Box(8724, 8724)),
+  Box(Box(8725, 8725), Box(8725, 8725)),
+  Box(Box(8726, 8726), Box(8726, 8726)),
+  Box(Box(8727, 8727), Box(8727, 8727)),
+  Box(Box(8728, 8728), Box(8728, 8728)),
+  Box(Box(8729, 8729), Box(8729, 8729)),
+  Box(Box(8730, 8730), Box(8730, 8730)),
+  Box(Box(8731, 8731), Box(8731, 8731)),
+  Box(Box(8732, 8732), Box(8732, 8732)),
+  Box(Box(8733, 8733), Box(8733, 8733)),
+  Box(Box(8734, 8734), Box(8734, 8734)),
+  Box(Box(8735, 8735), Box(8735, 8735)),
+  Box(Box(8736, 8736), Box(8736, 8736)),
+  Box(Box(8737, 8737), Box(8737, 8737)),
+  Box(Box(8738, 8738), Box(8738, 8738)),
+  Box(Box(8739, 8739), Box(8739, 8739)),
+  Box(Box(8740, 8740), Box(8740, 8740)),
+  Box(Box(8741, 8741), Box(8741, 8741)),
+  Box(Box(8742, 8742), Box(8742, 8742)),
+  Box(Box(8743, 8743), Box(8743, 8743)),
+  Box(Box(8744, 8744), Box(8744, 8744)),
+  Box(Box(8745, 8745), Box(8745, 8745)),
+  Box(Box(8746, 8746), Box(8746, 8746)),
+  Box(Box(8747, 8747), Box(8747, 8747)),
+  Box(Box(8748, 8748), Box(8748, 8748)),
+  Box(Box(8749, 8749), Box(8749, 8749)),
+  Box(Box(8750, 8750), Box(8750, 8750)),
+  Box(Box(8751, 8751), Box(8751, 8751)),
+  Box(Box(8752, 8752), Box(8752, 8752)),
+  Box(Box(8753, 8753), Box(8753, 8753)),
+  Box(Box(8754, 8754), Box(8754, 8754)),
+  Box(Box(8755, 8755), Box(8755, 8755)),
+  Box(Box(8756, 8756), Box(8756, 8756)),
+  Box(Box(8757, 8757), Box(8757, 8757)),
+  Box(Box(8758, 8758), Box(8758, 8758)),
+  Box(Box(8759, 8759), Box(8759, 8759)),
+  Box(Box(8760, 8760), Box(8760, 8760)),
+  Box(Box(8761, 8761), Box(8761, 8761)),
+  Box(Box(8762, 8762), Box(8762, 8762)),
+  Box(Box(8763, 8763), Box(8763, 8763)),
+  Box(Box(8764, 8764), Box(8764, 8764)),
+  Box(Box(8765, 8765), Box(8765, 8765)),
+  Box(Box(8766, 8766), Box(8766, 8766)),
+  Box(Box(8767, 8767), Box(8767, 8767)),
+  Box(Box(8768, 8768), Box(8768, 8768)),
+  Box(Box(8769, 8769), Box(8769, 8769)),
+  Box(Box(8770, 8770), Box(8770, 8770)),
+  Box(Box(8771, 8771), Box(8771, 8771)),
+  Box(Box(8772, 8772), Box(8772, 8772)),
+  Box(Box(8773, 8773), Box(8773, 8773)),
+  Box(Box(8774, 8774), Box(8774, 8774)),
+  Box(Box(8775, 8775), Box(8775, 8775)),
+  Box(Box(8776, 8776), Box(8776, 8776)),
+  Box(Box(8777, 8777), Box(8777, 8777)),
+  Box(Box(8778, 8778), Box(8778, 8778)),
+  Box(Box(8779, 8779), Box(8779, 8779)),
+  Box(Box(8780, 8780), Box(8780, 8780)),
+  Box(Box(8781, 8781), Box(8781, 8781)),
+  Box(Box(8782, 8782), Box(8782, 8782)),
+  Box(Box(8783, 8783), Box(8783, 8783)),
+  Box(Box(8784, 8784), Box(8784, 8784)),
+  Box(Box(8785, 8785), Box(8785, 8785)),
+  Box(Box(8786, 8786), Box(8786, 8786)),
+  Box(Box(8787, 8787), Box(8787, 8787)),
+  Box(Box(8788, 8788), Box(8788, 8788)),
+  Box(Box(8789, 8789), Box(8789, 8789)),
+  Box(Box(8790, 8790), Box(8790, 8790)),
+  Box(Box(8791, 8791), Box(8791, 8791)),
+  Box(Box(8792, 8792), Box(8792, 8792)),
+  Box(Box(8793, 8793), Box(8793, 8793)),
+  Box(Box(8794, 8794), Box(8794, 8794)),
+  Box(Box(8795, 8795), Box(8795, 8795)),
+  Box(Box(8796, 8796), Box(8796, 8796)),
+  Box(Box(8797, 8797), Box(8797, 8797)),
+  Box(Box(8798, 8798), Box(8798, 8798)),
+  Box(Box(8799, 8799), Box(8799, 8799)),
+  Box(Box(8800, 8800), Box(8800, 8800)),
+  Box(Box(8801, 8801), Box(8801, 8801)),
+  Box(Box(8802, 8802), Box(8802, 8802)),
+  Box(Box(8803, 8803), Box(8803, 8803)),
+  Box(Box(8804, 8804), Box(8804, 8804)),
+  Box(Box(8805, 8805), Box(8805, 8805)),
+  Box(Box(8806, 8806), Box(8806, 8806)),
+  Box(Box(8807, 8807), Box(8807, 8807)),
+  Box(Box(8808, 8808), Box(8808, 8808)),
+  Box(Box(8809, 8809), Box(8809, 8809)),
+  Box(Box(8810, 8810), Box(8810, 8810)),
+  Box(Box(8811, 8811), Box(8811, 8811)),
+  Box(Box(8812, 8812), Box(8812, 8812)),
+  Box(Box(8813, 8813), Box(8813, 8813)),
+  Box(Box(8814, 8814), Box(8814, 8814)),
+  Box(Box(8815, 8815), Box(8815, 8815)),
+  Box(Box(8816, 8816), Box(8816, 8816)),
+  Box(Box(8817, 8817), Box(8817, 8817)),
+  Box(Box(8818, 8818), Box(8818, 8818)),
+  Box(Box(8819, 8819), Box(8819, 8819)),
+  Box(Box(8820, 8820), Box(8820, 8820)),
+  Box(Box(8821, 8821), Box(8821, 8821)),
+  Box(Box(8822, 8822), Box(8822, 8822)),
+  Box(Box(8823, 8823), Box(8823, 8823)),
+  Box(Box(8824, 8824), Box(8824, 8824)),
+  Box(Box(8825, 8825), Box(8825, 8825)),
+  Box(Box(8826, 8826), Box(8826, 8826)),
+  Box(Box(8827, 8827), Box(8827, 8827)),
+  Box(Box(8828, 8828), Box(8828, 8828)),
+  Box(Box(8829, 8829), Box(8829, 8829)),
+  Box(Box(8830, 8830), Box(8830, 8830)),
+  Box(Box(8831, 8831), Box(8831, 8831)),
+  Box(Box(8832, 8832), Box(8832, 8832)),
+  Box(Box(8833, 8833), Box(8833, 8833)),
+  Box(Box(8834, 8834), Box(8834, 8834)),
+  Box(Box(8835, 8835), Box(8835, 8835)),
+  Box(Box(8836, 8836), Box(8836, 8836)),
+  Box(Box(8837, 8837), Box(8837, 8837)),
+  Box(Box(8838, 8838), Box(8838, 8838)),
+  Box(Box(8839, 8839), Box(8839, 8839)),
+  Box(Box(8840, 8840), Box(8840, 8840)),
+  Box(Box(8841, 8841), Box(8841, 8841)),
+  Box(Box(8842, 8842), Box(8842, 8842)),
+  Box(Box(8843, 8843), Box(8843, 8843)),
+  Box(Box(8844, 8844), Box(8844, 8844)),
+  Box(Box(8845, 8845), Box(8845, 8845)),
+  Box(Box(8846, 8846), Box(8846, 8846)),
+  Box(Box(8847, 8847), Box(8847, 8847)),
+  Box(Box(8848, 8848), Box(8848, 8848)),
+  Box(Box(8849, 8849), Box(8849, 8849)),
+  Box(Box(8850, 8850), Box(8850, 8850)),
+  Box(Box(8851, 8851), Box(8851, 8851)),
+  Box(Box(8852, 8852), Box(8852, 8852)),
+  Box(Box(8853, 8853), Box(8853, 8853)),
+  Box(Box(8854, 8854), Box(8854, 8854)),
+  Box(Box(8855, 8855), Box(8855, 8855)),
+  Box(Box(8856, 8856), Box(8856, 8856)),
+  Box(Box(8857, 8857), Box(8857, 8857)),
+  Box(Box(8858, 8858), Box(8858, 8858)),
+  Box(Box(8859, 8859), Box(8859, 8859)),
+  Box(Box(8860, 8860), Box(8860, 8860)),
+  Box(Box(8861, 8861), Box(8861, 8861)),
+  Box(Box(8862, 8862), Box(8862, 8862)),
+  Box(Box(8863, 8863), Box(8863, 8863)),
+  Box(Box(8864, 8864), Box(8864, 8864)),
+  Box(Box(8865, 8865), Box(8865, 8865)),
+  Box(Box(8866, 8866), Box(8866, 8866)),
+  Box(Box(8867, 8867), Box(8867, 8867)),
+  Box(Box(8868, 8868), Box(8868, 8868)),
+  Box(Box(8869, 8869), Box(8869, 8869)),
+  Box(Box(8870, 8870), Box(8870, 8870)),
+  Box(Box(8871, 8871), Box(8871, 8871)),
+  Box(Box(8872, 8872), Box(8872, 8872)),
+  Box(Box(8873, 8873), Box(8873, 8873)),
+  Box(Box(8874, 8874), Box(8874, 8874)),
+  Box(Box(8875, 8875), Box(8875, 8875)),
+  Box(Box(8876, 8876), Box(8876, 8876)),
+  Box(Box(8877, 8877), Box(8877, 8877)),
+  Box(Box(8878, 8878), Box(8878, 8878)),
+  Box(Box(8879, 8879), Box(8879, 8879)),
+  Box(Box(8880, 8880), Box(8880, 8880)),
+  Box(Box(8881, 8881), Box(8881, 8881)),
+  Box(Box(8882, 8882), Box(8882, 8882)),
+  Box(Box(8883, 8883), Box(8883, 8883)),
+  Box(Box(8884, 8884), Box(8884, 8884)),
+  Box(Box(8885, 8885), Box(8885, 8885)),
+  Box(Box(8886, 8886), Box(8886, 8886)),
+  Box(Box(8887, 8887), Box(8887, 8887)),
+  Box(Box(8888, 8888), Box(8888, 8888)),
+  Box(Box(8889, 8889), Box(8889, 8889)),
+  Box(Box(8890, 8890), Box(8890, 8890)),
+  Box(Box(8891, 8891), Box(8891, 8891)),
+  Box(Box(8892, 8892), Box(8892, 8892)),
+  Box(Box(8893, 8893), Box(8893, 8893)),
+  Box(Box(8894, 8894), Box(8894, 8894)),
+  Box(Box(8895, 8895), Box(8895, 8895)),
+  Box(Box(8896, 8896), Box(8896, 8896)),
+  Box(Box(8897, 8897), Box(8897, 8897)),
+  Box(Box(8898, 8898), Box(8898, 8898)),
+  Box(Box(8899, 8899), Box(8899, 8899)),
+  Box(Box(8900, 8900), Box(8900, 8900)),
+  Box(Box(8901, 8901), Box(8901, 8901)),
+  Box(Box(8902, 8902), Box(8902, 8902)),
+  Box(Box(8903, 8903), Box(8903, 8903)),
+  Box(Box(8904, 8904), Box(8904, 8904)),
+  Box(Box(8905, 8905), Box(8905, 8905)),
+  Box(Box(8906, 8906), Box(8906, 8906)),
+  Box(Box(8907, 8907), Box(8907, 8907)),
+  Box(Box(8908, 8908), Box(8908, 8908)),
+  Box(Box(8909, 8909), Box(8909, 8909)),
+  Box(Box(8910, 8910), Box(8910, 8910)),
+  Box(Box(8911, 8911), Box(8911, 8911)),
+  Box(Box(8912, 8912), Box(8912, 8912)),
+  Box(Box(8913, 8913), Box(8913, 8913)),
+  Box(Box(8914, 8914), Box(8914, 8914)),
+  Box(Box(8915, 8915), Box(8915, 8915)),
+  Box(Box(8916, 8916), Box(8916, 8916)),
+  Box(Box(8917, 8917), Box(8917, 8917)),
+  Box(Box(8918, 8918), Box(8918, 8918)),
+  Box(Box(8919, 8919), Box(8919, 8919)),
+  Box(Box(8920, 8920), Box(8920, 8920)),
+  Box(Box(8921, 8921), Box(8921, 8921)),
+  Box(Box(8922, 8922), Box(8922, 8922)),
+  Box(Box(8923, 8923), Box(8923, 8923)),
+  Box(Box(8924, 8924), Box(8924, 8924)),
+  Box(Box(8925, 8925), Box(8925, 8925)),
+  Box(Box(8926, 8926), Box(8926, 8926)),
+  Box(Box(8927, 8927), Box(8927, 8927)),
+  Box(Box(8928, 8928), Box(8928, 8928)),
+  Box(Box(8929, 8929), Box(8929, 8929)),
+  Box(Box(8930, 8930), Box(8930, 8930)),
+  Box(Box(8931, 8931), Box(8931, 8931)),
+  Box(Box(8932, 8932), Box(8932, 8932)),
+  Box(Box(8933, 8933), Box(8933, 8933)),
+  Box(Box(8934, 8934), Box(8934, 8934)),
+  Box(Box(8935, 8935), Box(8935, 8935)),
+  Box(Box(8936, 8936), Box(8936, 8936)),
+  Box(Box(8937, 8937), Box(8937, 8937)),
+  Box(Box(8938, 8938), Box(8938, 8938)),
+  Box(Box(8939, 8939), Box(8939, 8939)),
+  Box(Box(8940, 8940), Box(8940, 8940)),
+  Box(Box(8941, 8941), Box(8941, 8941)),
+  Box(Box(8942, 8942), Box(8942, 8942)),
+  Box(Box(8943, 8943), Box(8943, 8943)),
+  Box(Box(8944, 8944), Box(8944, 8944)),
+  Box(Box(8945, 8945), Box(8945, 8945)),
+  Box(Box(8946, 8946), Box(8946, 8946)),
+  Box(Box(8947, 8947), Box(8947, 8947)),
+  Box(Box(8948, 8948), Box(8948, 8948)),
+  Box(Box(8949, 8949), Box(8949, 8949)),
+  Box(Box(8950, 8950), Box(8950, 8950)),
+  Box(Box(8951, 8951), Box(8951, 8951)),
+  Box(Box(8952, 8952), Box(8952, 8952)),
+  Box(Box(8953, 8953), Box(8953, 8953)),
+  Box(Box(8954, 8954), Box(8954, 8954)),
+  Box(Box(8955, 8955), Box(8955, 8955)),
+  Box(Box(8956, 8956), Box(8956, 8956)),
+  Box(Box(8957, 8957), Box(8957, 8957)),
+  Box(Box(8958, 8958), Box(8958, 8958)),
+  Box(Box(8959, 8959), Box(8959, 8959)),
+  Box(Box(8960, 8960), Box(8960, 8960)),
+  Box(Box(8961, 8961), Box(8961, 8961)),
+  Box(Box(8962, 8962), Box(8962, 8962)),
+  Box(Box(8963, 8963), Box(8963, 8963)),
+  Box(Box(8964, 8964), Box(8964, 8964)),
+  Box(Box(8965, 8965), Box(8965, 8965)),
+  Box(Box(8966, 8966), Box(8966, 8966)),
+  Box(Box(8967, 8967), Box(8967, 8967)),
+  Box(Box(8968, 8968), Box(8968, 8968)),
+  Box(Box(8969, 8969), Box(8969, 8969)),
+  Box(Box(8970, 8970), Box(8970, 8970)),
+  Box(Box(8971, 8971), Box(8971, 8971)),
+  Box(Box(8972, 8972), Box(8972, 8972)),
+  Box(Box(8973, 8973), Box(8973, 8973)),
+  Box(Box(8974, 8974), Box(8974, 8974)),
+  Box(Box(8975, 8975), Box(8975, 8975)),
+  Box(Box(8976, 8976), Box(8976, 8976)),
+  Box(Box(8977, 8977), Box(8977, 8977)),
+  Box(Box(8978, 8978), Box(8978, 8978)),
+  Box(Box(8979, 8979), Box(8979, 8979)),
+  Box(Box(8980, 8980), Box(8980, 8980)),
+  Box(Box(8981, 8981), Box(8981, 8981)),
+  Box(Box(8982, 8982), Box(8982, 8982)),
+  Box(Box(8983, 8983), Box(8983, 8983)),
+  Box(Box(8984, 8984), Box(8984, 8984)),
+  Box(Box(8985, 8985), Box(8985, 8985)),
+  Box(Box(8986, 8986), Box(8986, 8986)),
+  Box(Box(8987, 8987), Box(8987, 8987)),
+  Box(Box(8988, 8988), Box(8988, 8988)),
+  Box(Box(8989, 8989), Box(8989, 8989)),
+  Box(Box(8990, 8990), Box(8990, 8990)),
+  Box(Box(8991, 8991), Box(8991, 8991)),
+  Box(Box(8992, 8992), Box(8992, 8992)),
+  Box(Box(8993, 8993), Box(8993, 8993)),
+  Box(Box(8994, 8994), Box(8994, 8994)),
+  Box(Box(8995, 8995), Box(8995, 8995)),
+  Box(Box(8996, 8996), Box(8996, 8996)),
+  Box(Box(8997, 8997), Box(8997, 8997)),
+  Box(Box(8998, 8998), Box(8998, 8998)),
+  Box(Box(8999, 8999), Box(8999, 8999)),
+  Box(Box(9000, 9000), Box(9000, 9000)),
+  Box(Box(9001, 9001), Box(9001, 9001)),
+  Box(Box(9002, 9002), Box(9002, 9002)),
+  Box(Box(9003, 9003), Box(9003, 9003)),
+  Box(Box(9004, 9004), Box(9004, 9004)),
+  Box(Box(9005, 9005), Box(9005, 9005)),
+  Box(Box(9006, 9006), Box(9006, 9006)),
+  Box(Box(9007, 9007), Box(9007, 9007)),
+  Box(Box(9008, 9008), Box(9008, 9008)),
+  Box(Box(9009, 9009), Box(9009, 9009)),
+  Box(Box(9010, 9010), Box(9010, 9010)),
+  Box(Box(9011, 9011), Box(9011, 9011)),
+  Box(Box(9012, 9012), Box(9012, 9012)),
+  Box(Box(9013, 9013), Box(9013, 9013)),
+  Box(Box(9014, 9014), Box(9014, 9014)),
+  Box(Box(9015, 9015), Box(9015, 9015)),
+  Box(Box(9016, 9016), Box(9016, 9016)),
+  Box(Box(9017, 9017), Box(9017, 9017)),
+  Box(Box(9018, 9018), Box(9018, 9018)),
+  Box(Box(9019, 9019), Box(9019, 9019)),
+  Box(Box(9020, 9020), Box(9020, 9020)),
+  Box(Box(9021, 9021), Box(9021, 9021)),
+  Box(Box(9022, 9022), Box(9022, 9022)),
+  Box(Box(9023, 9023), Box(9023, 9023)),
+  Box(Box(9024, 9024), Box(9024, 9024)),
+  Box(Box(9025, 9025), Box(9025, 9025)),
+  Box(Box(9026, 9026), Box(9026, 9026)),
+  Box(Box(9027, 9027), Box(9027, 9027)),
+  Box(Box(9028, 9028), Box(9028, 9028)),
+  Box(Box(9029, 9029), Box(9029, 9029)),
+  Box(Box(9030, 9030), Box(9030, 9030)),
+  Box(Box(9031, 9031), Box(9031, 9031)),
+  Box(Box(9032, 9032), Box(9032, 9032)),
+  Box(Box(9033, 9033), Box(9033, 9033)),
+  Box(Box(9034, 9034), Box(9034, 9034)),
+  Box(Box(9035, 9035), Box(9035, 9035)),
+  Box(Box(9036, 9036), Box(9036, 9036)),
+  Box(Box(9037, 9037), Box(9037, 9037)),
+  Box(Box(9038, 9038), Box(9038, 9038)),
+  Box(Box(9039, 9039), Box(9039, 9039)),
+  Box(Box(9040, 9040), Box(9040, 9040)),
+  Box(Box(9041, 9041), Box(9041, 9041)),
+  Box(Box(9042, 9042), Box(9042, 9042)),
+  Box(Box(9043, 9043), Box(9043, 9043)),
+  Box(Box(9044, 9044), Box(9044, 9044)),
+  Box(Box(9045, 9045), Box(9045, 9045)),
+  Box(Box(9046, 9046), Box(9046, 9046)),
+  Box(Box(9047, 9047), Box(9047, 9047)),
+  Box(Box(9048, 9048), Box(9048, 9048)),
+  Box(Box(9049, 9049), Box(9049, 9049)),
+  Box(Box(9050, 9050), Box(9050, 9050)),
+  Box(Box(9051, 9051), Box(9051, 9051)),
+  Box(Box(9052, 9052), Box(9052, 9052)),
+  Box(Box(9053, 9053), Box(9053, 9053)),
+  Box(Box(9054, 9054), Box(9054, 9054)),
+  Box(Box(9055, 9055), Box(9055, 9055)),
+  Box(Box(9056, 9056), Box(9056, 9056)),
+  Box(Box(9057, 9057), Box(9057, 9057)),
+  Box(Box(9058, 9058), Box(9058, 9058)),
+  Box(Box(9059, 9059), Box(9059, 9059)),
+  Box(Box(9060, 9060), Box(9060, 9060)),
+  Box(Box(9061, 9061), Box(9061, 9061)),
+  Box(Box(9062, 9062), Box(9062, 9062)),
+  Box(Box(9063, 9063), Box(9063, 9063)),
+  Box(Box(9064, 9064), Box(9064, 9064)),
+  Box(Box(9065, 9065), Box(9065, 9065)),
+  Box(Box(9066, 9066), Box(9066, 9066)),
+  Box(Box(9067, 9067), Box(9067, 9067)),
+  Box(Box(9068, 9068), Box(9068, 9068)),
+  Box(Box(9069, 9069), Box(9069, 9069)),
+  Box(Box(9070, 9070), Box(9070, 9070)),
+  Box(Box(9071, 9071), Box(9071, 9071)),
+  Box(Box(9072, 9072), Box(9072, 9072)),
+  Box(Box(9073, 9073), Box(9073, 9073)),
+  Box(Box(9074, 9074), Box(9074, 9074)),
+  Box(Box(9075, 9075), Box(9075, 9075)),
+  Box(Box(9076, 9076), Box(9076, 9076)),
+  Box(Box(9077, 9077), Box(9077, 9077)),
+  Box(Box(9078, 9078), Box(9078, 9078)),
+  Box(Box(9079, 9079), Box(9079, 9079)),
+  Box(Box(9080, 9080), Box(9080, 9080)),
+  Box(Box(9081, 9081), Box(9081, 9081)),
+  Box(Box(9082, 9082), Box(9082, 9082)),
+  Box(Box(9083, 9083), Box(9083, 9083)),
+  Box(Box(9084, 9084), Box(9084, 9084)),
+  Box(Box(9085, 9085), Box(9085, 9085)),
+  Box(Box(9086, 9086), Box(9086, 9086)),
+  Box(Box(9087, 9087), Box(9087, 9087)),
+  Box(Box(9088, 9088), Box(9088, 9088)),
+  Box(Box(9089, 9089), Box(9089, 9089)),
+  Box(Box(9090, 9090), Box(9090, 9090)),
+  Box(Box(9091, 9091), Box(9091, 9091)),
+  Box(Box(9092, 9092), Box(9092, 9092)),
+  Box(Box(9093, 9093), Box(9093, 9093)),
+  Box(Box(9094, 9094), Box(9094, 9094)),
+  Box(Box(9095, 9095), Box(9095, 9095)),
+  Box(Box(9096, 9096), Box(9096, 9096)),
+  Box(Box(9097, 9097), Box(9097, 9097)),
+  Box(Box(9098, 9098), Box(9098, 9098)),
+  Box(Box(9099, 9099), Box(9099, 9099)),
+  Box(Box(9100, 9100), Box(9100, 9100)),
+  Box(Box(9101, 9101), Box(9101, 9101)),
+  Box(Box(9102, 9102), Box(9102, 9102)),
+  Box(Box(9103, 9103), Box(9103, 9103)),
+  Box(Box(9104, 9104), Box(9104, 9104)),
+  Box(Box(9105, 9105), Box(9105, 9105)),
+  Box(Box(9106, 9106), Box(9106, 9106)),
+  Box(Box(9107, 9107), Box(9107, 9107)),
+  Box(Box(9108, 9108), Box(9108, 9108)),
+  Box(Box(9109, 9109), Box(9109, 9109)),
+  Box(Box(9110, 9110), Box(9110, 9110)),
+  Box(Box(9111, 9111), Box(9111, 9111)),
+  Box(Box(9112, 9112), Box(9112, 9112)),
+  Box(Box(9113, 9113), Box(9113, 9113)),
+  Box(Box(9114, 9114), Box(9114, 9114)),
+  Box(Box(9115, 9115), Box(9115, 9115)),
+  Box(Box(9116, 9116), Box(9116, 9116)),
+  Box(Box(9117, 9117), Box(9117, 9117)),
+  Box(Box(9118, 9118), Box(9118, 9118)),
+  Box(Box(9119, 9119), Box(9119, 9119)),
+  Box(Box(9120, 9120), Box(9120, 9120)),
+  Box(Box(9121, 9121), Box(9121, 9121)),
+  Box(Box(9122, 9122), Box(9122, 9122)),
+  Box(Box(9123, 9123), Box(9123, 9123)),
+  Box(Box(9124, 9124), Box(9124, 9124)),
+  Box(Box(9125, 9125), Box(9125, 9125)),
+  Box(Box(9126, 9126), Box(9126, 9126)),
+  Box(Box(9127, 9127), Box(9127, 9127)),
+  Box(Box(9128, 9128), Box(9128, 9128)),
+  Box(Box(9129, 9129), Box(9129, 9129)),
+  Box(Box(9130, 9130), Box(9130, 9130)),
+  Box(Box(9131, 9131), Box(9131, 9131)),
+  Box(Box(9132, 9132), Box(9132, 9132)),
+  Box(Box(9133, 9133), Box(9133, 9133)),
+  Box(Box(9134, 9134), Box(9134, 9134)),
+  Box(Box(9135, 9135), Box(9135, 9135)),
+  Box(Box(9136, 9136), Box(9136, 9136)),
+  Box(Box(9137, 9137), Box(9137, 9137)),
+  Box(Box(9138, 9138), Box(9138, 9138)),
+  Box(Box(9139, 9139), Box(9139, 9139)),
+  Box(Box(9140, 9140), Box(9140, 9140)),
+  Box(Box(9141, 9141), Box(9141, 9141)),
+  Box(Box(9142, 9142), Box(9142, 9142)),
+  Box(Box(9143, 9143), Box(9143, 9143)),
+  Box(Box(9144, 9144), Box(9144, 9144)),
+  Box(Box(9145, 9145), Box(9145, 9145)),
+  Box(Box(9146, 9146), Box(9146, 9146)),
+  Box(Box(9147, 9147), Box(9147, 9147)),
+  Box(Box(9148, 9148), Box(9148, 9148)),
+  Box(Box(9149, 9149), Box(9149, 9149)),
+  Box(Box(9150, 9150), Box(9150, 9150)),
+  Box(Box(9151, 9151), Box(9151, 9151)),
+  Box(Box(9152, 9152), Box(9152, 9152)),
+  Box(Box(9153, 9153), Box(9153, 9153)),
+  Box(Box(9154, 9154), Box(9154, 9154)),
+  Box(Box(9155, 9155), Box(9155, 9155)),
+  Box(Box(9156, 9156), Box(9156, 9156)),
+  Box(Box(9157, 9157), Box(9157, 9157)),
+  Box(Box(9158, 9158), Box(9158, 9158)),
+  Box(Box(9159, 9159), Box(9159, 9159)),
+  Box(Box(9160, 9160), Box(9160, 9160)),
+  Box(Box(9161, 9161), Box(9161, 9161)),
+  Box(Box(9162, 9162), Box(9162, 9162)),
+  Box(Box(9163, 9163), Box(9163, 9163)),
+  Box(Box(9164, 9164), Box(9164, 9164)),
+  Box(Box(9165, 9165), Box(9165, 9165)),
+  Box(Box(9166, 9166), Box(9166, 9166)),
+  Box(Box(9167, 9167), Box(9167, 9167)),
+  Box(Box(9168, 9168), Box(9168, 9168)),
+  Box(Box(9169, 9169), Box(9169, 9169)),
+  Box(Box(9170, 9170), Box(9170, 9170)),
+  Box(Box(9171, 9171), Box(9171, 9171)),
+  Box(Box(9172, 9172), Box(9172, 9172)),
+  Box(Box(9173, 9173), Box(9173, 9173)),
+  Box(Box(9174, 9174), Box(9174, 9174)),
+  Box(Box(9175, 9175), Box(9175, 9175)),
+  Box(Box(9176, 9176), Box(9176, 9176)),
+  Box(Box(9177, 9177), Box(9177, 9177)),
+  Box(Box(9178, 9178), Box(9178, 9178)),
+  Box(Box(9179, 9179), Box(9179, 9179)),
+  Box(Box(9180, 9180), Box(9180, 9180)),
+  Box(Box(9181, 9181), Box(9181, 9181)),
+  Box(Box(9182, 9182), Box(9182, 9182)),
+  Box(Box(9183, 9183), Box(9183, 9183)),
+  Box(Box(9184, 9184), Box(9184, 9184)),
+  Box(Box(9185, 9185), Box(9185, 9185)),
+  Box(Box(9186, 9186), Box(9186, 9186)),
+  Box(Box(9187, 9187), Box(9187, 9187)),
+  Box(Box(9188, 9188), Box(9188, 9188)),
+  Box(Box(9189, 9189), Box(9189, 9189)),
+  Box(Box(9190, 9190), Box(9190, 9190)),
+  Box(Box(9191, 9191), Box(9191, 9191)),
+  Box(Box(9192, 9192), Box(9192, 9192)),
+  Box(Box(9193, 9193), Box(9193, 9193)),
+  Box(Box(9194, 9194), Box(9194, 9194)),
+  Box(Box(9195, 9195), Box(9195, 9195)),
+  Box(Box(9196, 9196), Box(9196, 9196)),
+  Box(Box(9197, 9197), Box(9197, 9197)),
+  Box(Box(9198, 9198), Box(9198, 9198)),
+  Box(Box(9199, 9199), Box(9199, 9199)),
+  Box(Box(9200, 9200), Box(9200, 9200)),
+  Box(Box(9201, 9201), Box(9201, 9201)),
+  Box(Box(9202, 9202), Box(9202, 9202)),
+  Box(Box(9203, 9203), Box(9203, 9203)),
+  Box(Box(9204, 9204), Box(9204, 9204)),
+  Box(Box(9205, 9205), Box(9205, 9205)),
+  Box(Box(9206, 9206), Box(9206, 9206)),
+  Box(Box(9207, 9207), Box(9207, 9207)),
+  Box(Box(9208, 9208), Box(9208, 9208)),
+  Box(Box(9209, 9209), Box(9209, 9209)),
+  Box(Box(9210, 9210), Box(9210, 9210)),
+  Box(Box(9211, 9211), Box(9211, 9211)),
+  Box(Box(9212, 9212), Box(9212, 9212)),
+  Box(Box(9213, 9213), Box(9213, 9213)),
+  Box(Box(9214, 9214), Box(9214, 9214)),
+  Box(Box(9215, 9215), Box(9215, 9215)),
+  Box(Box(9216, 9216), Box(9216, 9216)),
+  Box(Box(9217, 9217), Box(9217, 9217)),
+  Box(Box(9218, 9218), Box(9218, 9218)),
+  Box(Box(9219, 9219), Box(9219, 9219)),
+  Box(Box(9220, 9220), Box(9220, 9220)),
+  Box(Box(9221, 9221), Box(9221, 9221)),
+  Box(Box(9222, 9222), Box(9222, 9222)),
+  Box(Box(9223, 9223), Box(9223, 9223)),
+  Box(Box(9224, 9224), Box(9224, 9224)),
+  Box(Box(9225, 9225), Box(9225, 9225)),
+  Box(Box(9226, 9226), Box(9226, 9226)),
+  Box(Box(9227, 9227), Box(9227, 9227)),
+  Box(Box(9228, 9228), Box(9228, 9228)),
+  Box(Box(9229, 9229), Box(9229, 9229)),
+  Box(Box(9230, 9230), Box(9230, 9230)),
+  Box(Box(9231, 9231), Box(9231, 9231)),
+  Box(Box(9232, 9232), Box(9232, 9232)),
+  Box(Box(9233, 9233), Box(9233, 9233)),
+  Box(Box(9234, 9234), Box(9234, 9234)),
+  Box(Box(9235, 9235), Box(9235, 9235)),
+  Box(Box(9236, 9236), Box(9236, 9236)),
+  Box(Box(9237, 9237), Box(9237, 9237)),
+  Box(Box(9238, 9238), Box(9238, 9238)),
+  Box(Box(9239, 9239), Box(9239, 9239)),
+  Box(Box(9240, 9240), Box(9240, 9240)),
+  Box(Box(9241, 9241), Box(9241, 9241)),
+  Box(Box(9242, 9242), Box(9242, 9242)),
+  Box(Box(9243, 9243), Box(9243, 9243)),
+  Box(Box(9244, 9244), Box(9244, 9244)),
+  Box(Box(9245, 9245), Box(9245, 9245)),
+  Box(Box(9246, 9246), Box(9246, 9246)),
+  Box(Box(9247, 9247), Box(9247, 9247)),
+  Box(Box(9248, 9248), Box(9248, 9248)),
+  Box(Box(9249, 9249), Box(9249, 9249)),
+  Box(Box(9250, 9250), Box(9250, 9250)),
+  Box(Box(9251, 9251), Box(9251, 9251)),
+  Box(Box(9252, 9252), Box(9252, 9252)),
+  Box(Box(9253, 9253), Box(9253, 9253)),
+  Box(Box(9254, 9254), Box(9254, 9254)),
+  Box(Box(9255, 9255), Box(9255, 9255)),
+  Box(Box(9256, 9256), Box(9256, 9256)),
+  Box(Box(9257, 9257), Box(9257, 9257)),
+  Box(Box(9258, 9258), Box(9258, 9258)),
+  Box(Box(9259, 9259), Box(9259, 9259)),
+  Box(Box(9260, 9260), Box(9260, 9260)),
+  Box(Box(9261, 9261), Box(9261, 9261)),
+  Box(Box(9262, 9262), Box(9262, 9262)),
+  Box(Box(9263, 9263), Box(9263, 9263)),
+  Box(Box(9264, 9264), Box(9264, 9264)),
+  Box(Box(9265, 9265), Box(9265, 9265)),
+  Box(Box(9266, 9266), Box(9266, 9266)),
+  Box(Box(9267, 9267), Box(9267, 9267)),
+  Box(Box(9268, 9268), Box(9268, 9268)),
+  Box(Box(9269, 9269), Box(9269, 9269)),
+  Box(Box(9270, 9270), Box(9270, 9270)),
+  Box(Box(9271, 9271), Box(9271, 9271)),
+  Box(Box(9272, 9272), Box(9272, 9272)),
+  Box(Box(9273, 9273), Box(9273, 9273)),
+  Box(Box(9274, 9274), Box(9274, 9274)),
+  Box(Box(9275, 9275), Box(9275, 9275)),
+  Box(Box(9276, 9276), Box(9276, 9276)),
+  Box(Box(9277, 9277), Box(9277, 9277)),
+  Box(Box(9278, 9278), Box(9278, 9278)),
+  Box(Box(9279, 9279), Box(9279, 9279)),
+  Box(Box(9280, 9280), Box(9280, 9280)),
+  Box(Box(9281, 9281), Box(9281, 9281)),
+  Box(Box(9282, 9282), Box(9282, 9282)),
+  Box(Box(9283, 9283), Box(9283, 9283)),
+  Box(Box(9284, 9284), Box(9284, 9284)),
+  Box(Box(9285, 9285), Box(9285, 9285)),
+  Box(Box(9286, 9286), Box(9286, 9286)),
+  Box(Box(9287, 9287), Box(9287, 9287)),
+  Box(Box(9288, 9288), Box(9288, 9288)),
+  Box(Box(9289, 9289), Box(9289, 9289)),
+  Box(Box(9290, 9290), Box(9290, 9290)),
+  Box(Box(9291, 9291), Box(9291, 9291)),
+  Box(Box(9292, 9292), Box(9292, 9292)),
+  Box(Box(9293, 9293), Box(9293, 9293)),
+  Box(Box(9294, 9294), Box(9294, 9294)),
+  Box(Box(9295, 9295), Box(9295, 9295)),
+  Box(Box(9296, 9296), Box(9296, 9296)),
+  Box(Box(9297, 9297), Box(9297, 9297)),
+  Box(Box(9298, 9298), Box(9298, 9298)),
+  Box(Box(9299, 9299), Box(9299, 9299)),
+  Box(Box(9300, 9300), Box(9300, 9300)),
+  Box(Box(9301, 9301), Box(9301, 9301)),
+  Box(Box(9302, 9302), Box(9302, 9302)),
+  Box(Box(9303, 9303), Box(9303, 9303)),
+  Box(Box(9304, 9304), Box(9304, 9304)),
+  Box(Box(9305, 9305), Box(9305, 9305)),
+  Box(Box(9306, 9306), Box(9306, 9306)),
+  Box(Box(9307, 9307), Box(9307, 9307)),
+  Box(Box(9308, 9308), Box(9308, 9308)),
+  Box(Box(9309, 9309), Box(9309, 9309)),
+  Box(Box(9310, 9310), Box(9310, 9310)),
+  Box(Box(9311, 9311), Box(9311, 9311)),
+  Box(Box(9312, 9312), Box(9312, 9312)),
+  Box(Box(9313, 9313), Box(9313, 9313)),
+  Box(Box(9314, 9314), Box(9314, 9314)),
+  Box(Box(9315, 9315), Box(9315, 9315)),
+  Box(Box(9316, 9316), Box(9316, 9316)),
+  Box(Box(9317, 9317), Box(9317, 9317)),
+  Box(Box(9318, 9318), Box(9318, 9318)),
+  Box(Box(9319, 9319), Box(9319, 9319)),
+  Box(Box(9320, 9320), Box(9320, 9320)),
+  Box(Box(9321, 9321), Box(9321, 9321)),
+  Box(Box(9322, 9322), Box(9322, 9322)),
+  Box(Box(9323, 9323), Box(9323, 9323)),
+  Box(Box(9324, 9324), Box(9324, 9324)),
+  Box(Box(9325, 9325), Box(9325, 9325)),
+  Box(Box(9326, 9326), Box(9326, 9326)),
+  Box(Box(9327, 9327), Box(9327, 9327)),
+  Box(Box(9328, 9328), Box(9328, 9328)),
+  Box(Box(9329, 9329), Box(9329, 9329)),
+  Box(Box(9330, 9330), Box(9330, 9330)),
+  Box(Box(9331, 9331), Box(9331, 9331)),
+  Box(Box(9332, 9332), Box(9332, 9332)),
+  Box(Box(9333, 9333), Box(9333, 9333)),
+  Box(Box(9334, 9334), Box(9334, 9334)),
+  Box(Box(9335, 9335), Box(9335, 9335)),
+  Box(Box(9336, 9336), Box(9336, 9336)),
+  Box(Box(9337, 9337), Box(9337, 9337)),
+  Box(Box(9338, 9338), Box(9338, 9338)),
+  Box(Box(9339, 9339), Box(9339, 9339)),
+  Box(Box(9340, 9340), Box(9340, 9340)),
+  Box(Box(9341, 9341), Box(9341, 9341)),
+  Box(Box(9342, 9342), Box(9342, 9342)),
+  Box(Box(9343, 9343), Box(9343, 9343)),
+  Box(Box(9344, 9344), Box(9344, 9344)),
+  Box(Box(9345, 9345), Box(9345, 9345)),
+  Box(Box(9346, 9346), Box(9346, 9346)),
+  Box(Box(9347, 9347), Box(9347, 9347)),
+  Box(Box(9348, 9348), Box(9348, 9348)),
+  Box(Box(9349, 9349), Box(9349, 9349)),
+  Box(Box(9350, 9350), Box(9350, 9350)),
+  Box(Box(9351, 9351), Box(9351, 9351)),
+  Box(Box(9352, 9352), Box(9352, 9352)),
+  Box(Box(9353, 9353), Box(9353, 9353)),
+  Box(Box(9354, 9354), Box(9354, 9354)),
+  Box(Box(9355, 9355), Box(9355, 9355)),
+  Box(Box(9356, 9356), Box(9356, 9356)),
+  Box(Box(9357, 9357), Box(9357, 9357)),
+  Box(Box(9358, 9358), Box(9358, 9358)),
+  Box(Box(9359, 9359), Box(9359, 9359)),
+  Box(Box(9360, 9360), Box(9360, 9360)),
+  Box(Box(9361, 9361), Box(9361, 9361)),
+  Box(Box(9362, 9362), Box(9362, 9362)),
+  Box(Box(9363, 9363), Box(9363, 9363)),
+  Box(Box(9364, 9364), Box(9364, 9364)),
+  Box(Box(9365, 9365), Box(9365, 9365)),
+  Box(Box(9366, 9366), Box(9366, 9366)),
+  Box(Box(9367, 9367), Box(9367, 9367)),
+  Box(Box(9368, 9368), Box(9368, 9368)),
+  Box(Box(9369, 9369), Box(9369, 9369)),
+  Box(Box(9370, 9370), Box(9370, 9370)),
+  Box(Box(9371, 9371), Box(9371, 9371)),
+  Box(Box(9372, 9372), Box(9372, 9372)),
+  Box(Box(9373, 9373), Box(9373, 9373)),
+  Box(Box(9374, 9374), Box(9374, 9374)),
+  Box(Box(9375, 9375), Box(9375, 9375)),
+  Box(Box(9376, 9376), Box(9376, 9376)),
+  Box(Box(9377, 9377), Box(9377, 9377)),
+  Box(Box(9378, 9378), Box(9378, 9378)),
+  Box(Box(9379, 9379), Box(9379, 9379)),
+  Box(Box(9380, 9380), Box(9380, 9380)),
+  Box(Box(9381, 9381), Box(9381, 9381)),
+  Box(Box(9382, 9382), Box(9382, 9382)),
+  Box(Box(9383, 9383), Box(9383, 9383)),
+  Box(Box(9384, 9384), Box(9384, 9384)),
+  Box(Box(9385, 9385), Box(9385, 9385)),
+  Box(Box(9386, 9386), Box(9386, 9386)),
+  Box(Box(9387, 9387), Box(9387, 9387)),
+  Box(Box(9388, 9388), Box(9388, 9388)),
+  Box(Box(9389, 9389), Box(9389, 9389)),
+  Box(Box(9390, 9390), Box(9390, 9390)),
+  Box(Box(9391, 9391), Box(9391, 9391)),
+  Box(Box(9392, 9392), Box(9392, 9392)),
+  Box(Box(9393, 9393), Box(9393, 9393)),
+  Box(Box(9394, 9394), Box(9394, 9394)),
+  Box(Box(9395, 9395), Box(9395, 9395)),
+  Box(Box(9396, 9396), Box(9396, 9396)),
+  Box(Box(9397, 9397), Box(9397, 9397)),
+  Box(Box(9398, 9398), Box(9398, 9398)),
+  Box(Box(9399, 9399), Box(9399, 9399)),
+  Box(Box(9400, 9400), Box(9400, 9400)),
+  Box(Box(9401, 9401), Box(9401, 9401)),
+  Box(Box(9402, 9402), Box(9402, 9402)),
+  Box(Box(9403, 9403), Box(9403, 9403)),
+  Box(Box(9404, 9404), Box(9404, 9404)),
+  Box(Box(9405, 9405), Box(9405, 9405)),
+  Box(Box(9406, 9406), Box(9406, 9406)),
+  Box(Box(9407, 9407), Box(9407, 9407)),
+  Box(Box(9408, 9408), Box(9408, 9408)),
+  Box(Box(9409, 9409), Box(9409, 9409)),
+  Box(Box(9410, 9410), Box(9410, 9410)),
+  Box(Box(9411, 9411), Box(9411, 9411)),
+  Box(Box(9412, 9412), Box(9412, 9412)),
+  Box(Box(9413, 9413), Box(9413, 9413)),
+  Box(Box(9414, 9414), Box(9414, 9414)),
+  Box(Box(9415, 9415), Box(9415, 9415)),
+  Box(Box(9416, 9416), Box(9416, 9416)),
+  Box(Box(9417, 9417), Box(9417, 9417)),
+  Box(Box(9418, 9418), Box(9418, 9418)),
+  Box(Box(9419, 9419), Box(9419, 9419)),
+  Box(Box(9420, 9420), Box(9420, 9420)),
+  Box(Box(9421, 9421), Box(9421, 9421)),
+  Box(Box(9422, 9422), Box(9422, 9422)),
+  Box(Box(9423, 9423), Box(9423, 9423)),
+  Box(Box(9424, 9424), Box(9424, 9424)),
+  Box(Box(9425, 9425), Box(9425, 9425)),
+  Box(Box(9426, 9426), Box(9426, 9426)),
+  Box(Box(9427, 9427), Box(9427, 9427)),
+  Box(Box(9428, 9428), Box(9428, 9428)),
+  Box(Box(9429, 9429), Box(9429, 9429)),
+  Box(Box(9430, 9430), Box(9430, 9430)),
+  Box(Box(9431, 9431), Box(9431, 9431)),
+  Box(Box(9432, 9432), Box(9432, 9432)),
+  Box(Box(9433, 9433), Box(9433, 9433)),
+  Box(Box(9434, 9434), Box(9434, 9434)),
+  Box(Box(9435, 9435), Box(9435, 9435)),
+  Box(Box(9436, 9436), Box(9436, 9436)),
+  Box(Box(9437, 9437), Box(9437, 9437)),
+  Box(Box(9438, 9438), Box(9438, 9438)),
+  Box(Box(9439, 9439), Box(9439, 9439)),
+  Box(Box(9440, 9440), Box(9440, 9440)),
+  Box(Box(9441, 9441), Box(9441, 9441)),
+  Box(Box(9442, 9442), Box(9442, 9442)),
+  Box(Box(9443, 9443), Box(9443, 9443)),
+  Box(Box(9444, 9444), Box(9444, 9444)),
+  Box(Box(9445, 9445), Box(9445, 9445)),
+  Box(Box(9446, 9446), Box(9446, 9446)),
+  Box(Box(9447, 9447), Box(9447, 9447)),
+  Box(Box(9448, 9448), Box(9448, 9448)),
+  Box(Box(9449, 9449), Box(9449, 9449)),
+  Box(Box(9450, 9450), Box(9450, 9450)),
+  Box(Box(9451, 9451), Box(9451, 9451)),
+  Box(Box(9452, 9452), Box(9452, 9452)),
+  Box(Box(9453, 9453), Box(9453, 9453)),
+  Box(Box(9454, 9454), Box(9454, 9454)),
+  Box(Box(9455, 9455), Box(9455, 9455)),
+  Box(Box(9456, 9456), Box(9456, 9456)),
+  Box(Box(9457, 9457), Box(9457, 9457)),
+  Box(Box(9458, 9458), Box(9458, 9458)),
+  Box(Box(9459, 9459), Box(9459, 9459)),
+  Box(Box(9460, 9460), Box(9460, 9460)),
+  Box(Box(9461, 9461), Box(9461, 9461)),
+  Box(Box(9462, 9462), Box(9462, 9462)),
+  Box(Box(9463, 9463), Box(9463, 9463)),
+  Box(Box(9464, 9464), Box(9464, 9464)),
+  Box(Box(9465, 9465), Box(9465, 9465)),
+  Box(Box(9466, 9466), Box(9466, 9466)),
+  Box(Box(9467, 9467), Box(9467, 9467)),
+  Box(Box(9468, 9468), Box(9468, 9468)),
+  Box(Box(9469, 9469), Box(9469, 9469)),
+  Box(Box(9470, 9470), Box(9470, 9470)),
+  Box(Box(9471, 9471), Box(9471, 9471)),
+  Box(Box(9472, 9472), Box(9472, 9472)),
+  Box(Box(9473, 9473), Box(9473, 9473)),
+  Box(Box(9474, 9474), Box(9474, 9474)),
+  Box(Box(9475, 9475), Box(9475, 9475)),
+  Box(Box(9476, 9476), Box(9476, 9476)),
+  Box(Box(9477, 9477), Box(9477, 9477)),
+  Box(Box(9478, 9478), Box(9478, 9478)),
+  Box(Box(9479, 9479), Box(9479, 9479)),
+  Box(Box(9480, 9480), Box(9480, 9480)),
+  Box(Box(9481, 9481), Box(9481, 9481)),
+  Box(Box(9482, 9482), Box(9482, 9482)),
+  Box(Box(9483, 9483), Box(9483, 9483)),
+  Box(Box(9484, 9484), Box(9484, 9484)),
+  Box(Box(9485, 9485), Box(9485, 9485)),
+  Box(Box(9486, 9486), Box(9486, 9486)),
+  Box(Box(9487, 9487), Box(9487, 9487)),
+  Box(Box(9488, 9488), Box(9488, 9488)),
+  Box(Box(9489, 9489), Box(9489, 9489)),
+  Box(Box(9490, 9490), Box(9490, 9490)),
+  Box(Box(9491, 9491), Box(9491, 9491)),
+  Box(Box(9492, 9492), Box(9492, 9492)),
+  Box(Box(9493, 9493), Box(9493, 9493)),
+  Box(Box(9494, 9494), Box(9494, 9494)),
+  Box(Box(9495, 9495), Box(9495, 9495)),
+  Box(Box(9496, 9496), Box(9496, 9496)),
+  Box(Box(9497, 9497), Box(9497, 9497)),
+  Box(Box(9498, 9498), Box(9498, 9498)),
+  Box(Box(9499, 9499), Box(9499, 9499)),
+  Box(Box(9500, 9500), Box(9500, 9500)),
+  Box(Box(9501, 9501), Box(9501, 9501)),
+  Box(Box(9502, 9502), Box(9502, 9502)),
+  Box(Box(9503, 9503), Box(9503, 9503)),
+  Box(Box(9504, 9504), Box(9504, 9504)),
+  Box(Box(9505, 9505), Box(9505, 9505)),
+  Box(Box(9506, 9506), Box(9506, 9506)),
+  Box(Box(9507, 9507), Box(9507, 9507)),
+  Box(Box(9508, 9508), Box(9508, 9508)),
+  Box(Box(9509, 9509), Box(9509, 9509)),
+  Box(Box(9510, 9510), Box(9510, 9510)),
+  Box(Box(9511, 9511), Box(9511, 9511)),
+  Box(Box(9512, 9512), Box(9512, 9512)),
+  Box(Box(9513, 9513), Box(9513, 9513)),
+  Box(Box(9514, 9514), Box(9514, 9514)),
+  Box(Box(9515, 9515), Box(9515, 9515)),
+  Box(Box(9516, 9516), Box(9516, 9516)),
+  Box(Box(9517, 9517), Box(9517, 9517)),
+  Box(Box(9518, 9518), Box(9518, 9518)),
+  Box(Box(9519, 9519), Box(9519, 9519)),
+  Box(Box(9520, 9520), Box(9520, 9520)),
+  Box(Box(9521, 9521), Box(9521, 9521)),
+  Box(Box(9522, 9522), Box(9522, 9522)),
+  Box(Box(9523, 9523), Box(9523, 9523)),
+  Box(Box(9524, 9524), Box(9524, 9524)),
+  Box(Box(9525, 9525), Box(9525, 9525)),
+  Box(Box(9526, 9526), Box(9526, 9526)),
+  Box(Box(9527, 9527), Box(9527, 9527)),
+  Box(Box(9528, 9528), Box(9528, 9528)),
+  Box(Box(9529, 9529), Box(9529, 9529)),
+  Box(Box(9530, 9530), Box(9530, 9530)),
+  Box(Box(9531, 9531), Box(9531, 9531)),
+  Box(Box(9532, 9532), Box(9532, 9532)),
+  Box(Box(9533, 9533), Box(9533, 9533)),
+  Box(Box(9534, 9534), Box(9534, 9534)),
+  Box(Box(9535, 9535), Box(9535, 9535)),
+  Box(Box(9536, 9536), Box(9536, 9536)),
+  Box(Box(9537, 9537), Box(9537, 9537)),
+  Box(Box(9538, 9538), Box(9538, 9538)),
+  Box(Box(9539, 9539), Box(9539, 9539)),
+  Box(Box(9540, 9540), Box(9540, 9540)),
+  Box(Box(9541, 9541), Box(9541, 9541)),
+  Box(Box(9542, 9542), Box(9542, 9542)),
+  Box(Box(9543, 9543), Box(9543, 9543)),
+  Box(Box(9544, 9544), Box(9544, 9544)),
+  Box(Box(9545, 9545), Box(9545, 9545)),
+  Box(Box(9546, 9546), Box(9546, 9546)),
+  Box(Box(9547, 9547), Box(9547, 9547)),
+  Box(Box(9548, 9548), Box(9548, 9548)),
+  Box(Box(9549, 9549), Box(9549, 9549)),
+  Box(Box(9550, 9550), Box(9550, 9550)),
+  Box(Box(9551, 9551), Box(9551, 9551)),
+  Box(Box(9552, 9552), Box(9552, 9552)),
+  Box(Box(9553, 9553), Box(9553, 9553)),
+  Box(Box(9554, 9554), Box(9554, 9554)),
+  Box(Box(9555, 9555), Box(9555, 9555)),
+  Box(Box(9556, 9556), Box(9556, 9556)),
+  Box(Box(9557, 9557), Box(9557, 9557)),
+  Box(Box(9558, 9558), Box(9558, 9558)),
+  Box(Box(9559, 9559), Box(9559, 9559)),
+  Box(Box(9560, 9560), Box(9560, 9560)),
+  Box(Box(9561, 9561), Box(9561, 9561)),
+  Box(Box(9562, 9562), Box(9562, 9562)),
+  Box(Box(9563, 9563), Box(9563, 9563)),
+  Box(Box(9564, 9564), Box(9564, 9564)),
+  Box(Box(9565, 9565), Box(9565, 9565)),
+  Box(Box(9566, 9566), Box(9566, 9566)),
+  Box(Box(9567, 9567), Box(9567, 9567)),
+  Box(Box(9568, 9568), Box(9568, 9568)),
+  Box(Box(9569, 9569), Box(9569, 9569)),
+  Box(Box(9570, 9570), Box(9570, 9570)),
+  Box(Box(9571, 9571), Box(9571, 9571)),
+  Box(Box(9572, 9572), Box(9572, 9572)),
+  Box(Box(9573, 9573), Box(9573, 9573)),
+  Box(Box(9574, 9574), Box(9574, 9574)),
+  Box(Box(9575, 9575), Box(9575, 9575)),
+  Box(Box(9576, 9576), Box(9576, 9576)),
+  Box(Box(9577, 9577), Box(9577, 9577)),
+  Box(Box(9578, 9578), Box(9578, 9578)),
+  Box(Box(9579, 9579), Box(9579, 9579)),
+  Box(Box(9580, 9580), Box(9580, 9580)),
+  Box(Box(9581, 9581), Box(9581, 9581)),
+  Box(Box(9582, 9582), Box(9582, 9582)),
+  Box(Box(9583, 9583), Box(9583, 9583)),
+  Box(Box(9584, 9584), Box(9584, 9584)),
+  Box(Box(9585, 9585), Box(9585, 9585)),
+  Box(Box(9586, 9586), Box(9586, 9586)),
+  Box(Box(9587, 9587), Box(9587, 9587)),
+  Box(Box(9588, 9588), Box(9588, 9588)),
+  Box(Box(9589, 9589), Box(9589, 9589)),
+  Box(Box(9590, 9590), Box(9590, 9590)),
+  Box(Box(9591, 9591), Box(9591, 9591)),
+  Box(Box(9592, 9592), Box(9592, 9592)),
+  Box(Box(9593, 9593), Box(9593, 9593)),
+  Box(Box(9594, 9594), Box(9594, 9594)),
+  Box(Box(9595, 9595), Box(9595, 9595)),
+  Box(Box(9596, 9596), Box(9596, 9596)),
+  Box(Box(9597, 9597), Box(9597, 9597)),
+  Box(Box(9598, 9598), Box(9598, 9598)),
+  Box(Box(9599, 9599), Box(9599, 9599)),
+  Box(Box(9600, 9600), Box(9600, 9600)),
+  Box(Box(9601, 9601), Box(9601, 9601)),
+  Box(Box(9602, 9602), Box(9602, 9602)),
+  Box(Box(9603, 9603), Box(9603, 9603)),
+  Box(Box(9604, 9604), Box(9604, 9604)),
+  Box(Box(9605, 9605), Box(9605, 9605)),
+  Box(Box(9606, 9606), Box(9606, 9606)),
+  Box(Box(9607, 9607), Box(9607, 9607)),
+  Box(Box(9608, 9608), Box(9608, 9608)),
+  Box(Box(9609, 9609), Box(9609, 9609)),
+  Box(Box(9610, 9610), Box(9610, 9610)),
+  Box(Box(9611, 9611), Box(9611, 9611)),
+  Box(Box(9612, 9612), Box(9612, 9612)),
+  Box(Box(9613, 9613), Box(9613, 9613)),
+  Box(Box(9614, 9614), Box(9614, 9614)),
+  Box(Box(9615, 9615), Box(9615, 9615)),
+  Box(Box(9616, 9616), Box(9616, 9616)),
+  Box(Box(9617, 9617), Box(9617, 9617)),
+  Box(Box(9618, 9618), Box(9618, 9618)),
+  Box(Box(9619, 9619), Box(9619, 9619)),
+  Box(Box(9620, 9620), Box(9620, 9620)),
+  Box(Box(9621, 9621), Box(9621, 9621)),
+  Box(Box(9622, 9622), Box(9622, 9622)),
+  Box(Box(9623, 9623), Box(9623, 9623)),
+  Box(Box(9624, 9624), Box(9624, 9624)),
+  Box(Box(9625, 9625), Box(9625, 9625)),
+  Box(Box(9626, 9626), Box(9626, 9626)),
+  Box(Box(9627, 9627), Box(9627, 9627)),
+  Box(Box(9628, 9628), Box(9628, 9628)),
+  Box(Box(9629, 9629), Box(9629, 9629)),
+  Box(Box(9630, 9630), Box(9630, 9630)),
+  Box(Box(9631, 9631), Box(9631, 9631)),
+  Box(Box(9632, 9632), Box(9632, 9632)),
+  Box(Box(9633, 9633), Box(9633, 9633)),
+  Box(Box(9634, 9634), Box(9634, 9634)),
+  Box(Box(9635, 9635), Box(9635, 9635)),
+  Box(Box(9636, 9636), Box(9636, 9636)),
+  Box(Box(9637, 9637), Box(9637, 9637)),
+  Box(Box(9638, 9638), Box(9638, 9638)),
+  Box(Box(9639, 9639), Box(9639, 9639)),
+  Box(Box(9640, 9640), Box(9640, 9640)),
+  Box(Box(9641, 9641), Box(9641, 9641)),
+  Box(Box(9642, 9642), Box(9642, 9642)),
+  Box(Box(9643, 9643), Box(9643, 9643)),
+  Box(Box(9644, 9644), Box(9644, 9644)),
+  Box(Box(9645, 9645), Box(9645, 9645)),
+  Box(Box(9646, 9646), Box(9646, 9646)),
+  Box(Box(9647, 9647), Box(9647, 9647)),
+  Box(Box(9648, 9648), Box(9648, 9648)),
+  Box(Box(9649, 9649), Box(9649, 9649)),
+  Box(Box(9650, 9650), Box(9650, 9650)),
+  Box(Box(9651, 9651), Box(9651, 9651)),
+  Box(Box(9652, 9652), Box(9652, 9652)),
+  Box(Box(9653, 9653), Box(9653, 9653)),
+  Box(Box(9654, 9654), Box(9654, 9654)),
+  Box(Box(9655, 9655), Box(9655, 9655)),
+  Box(Box(9656, 9656), Box(9656, 9656)),
+  Box(Box(9657, 9657), Box(9657, 9657)),
+  Box(Box(9658, 9658), Box(9658, 9658)),
+  Box(Box(9659, 9659), Box(9659, 9659)),
+  Box(Box(9660, 9660), Box(9660, 9660)),
+  Box(Box(9661, 9661), Box(9661, 9661)),
+  Box(Box(9662, 9662), Box(9662, 9662)),
+  Box(Box(9663, 9663), Box(9663, 9663)),
+  Box(Box(9664, 9664), Box(9664, 9664)),
+  Box(Box(9665, 9665), Box(9665, 9665)),
+  Box(Box(9666, 9666), Box(9666, 9666)),
+  Box(Box(9667, 9667), Box(9667, 9667)),
+  Box(Box(9668, 9668), Box(9668, 9668)),
+  Box(Box(9669, 9669), Box(9669, 9669)),
+  Box(Box(9670, 9670), Box(9670, 9670)),
+  Box(Box(9671, 9671), Box(9671, 9671)),
+  Box(Box(9672, 9672), Box(9672, 9672)),
+  Box(Box(9673, 9673), Box(9673, 9673)),
+  Box(Box(9674, 9674), Box(9674, 9674)),
+  Box(Box(9675, 9675), Box(9675, 9675)),
+  Box(Box(9676, 9676), Box(9676, 9676)),
+  Box(Box(9677, 9677), Box(9677, 9677)),
+  Box(Box(9678, 9678), Box(9678, 9678)),
+  Box(Box(9679, 9679), Box(9679, 9679)),
+  Box(Box(9680, 9680), Box(9680, 9680)),
+  Box(Box(9681, 9681), Box(9681, 9681)),
+  Box(Box(9682, 9682), Box(9682, 9682)),
+  Box(Box(9683, 9683), Box(9683, 9683)),
+  Box(Box(9684, 9684), Box(9684, 9684)),
+  Box(Box(9685, 9685), Box(9685, 9685)),
+  Box(Box(9686, 9686), Box(9686, 9686)),
+  Box(Box(9687, 9687), Box(9687, 9687)),
+  Box(Box(9688, 9688), Box(9688, 9688)),
+  Box(Box(9689, 9689), Box(9689, 9689)),
+  Box(Box(9690, 9690), Box(9690, 9690)),
+  Box(Box(9691, 9691), Box(9691, 9691)),
+  Box(Box(9692, 9692), Box(9692, 9692)),
+  Box(Box(9693, 9693), Box(9693, 9693)),
+  Box(Box(9694, 9694), Box(9694, 9694)),
+  Box(Box(9695, 9695), Box(9695, 9695)),
+  Box(Box(9696, 9696), Box(9696, 9696)),
+  Box(Box(9697, 9697), Box(9697, 9697)),
+  Box(Box(9698, 9698), Box(9698, 9698)),
+  Box(Box(9699, 9699), Box(9699, 9699)),
+  Box(Box(9700, 9700), Box(9700, 9700)),
+  Box(Box(9701, 9701), Box(9701, 9701)),
+  Box(Box(9702, 9702), Box(9702, 9702)),
+  Box(Box(9703, 9703), Box(9703, 9703)),
+  Box(Box(9704, 9704), Box(9704, 9704)),
+  Box(Box(9705, 9705), Box(9705, 9705)),
+  Box(Box(9706, 9706), Box(9706, 9706)),
+  Box(Box(9707, 9707), Box(9707, 9707)),
+  Box(Box(9708, 9708), Box(9708, 9708)),
+  Box(Box(9709, 9709), Box(9709, 9709)),
+  Box(Box(9710, 9710), Box(9710, 9710)),
+  Box(Box(9711, 9711), Box(9711, 9711)),
+  Box(Box(9712, 9712), Box(9712, 9712)),
+  Box(Box(9713, 9713), Box(9713, 9713)),
+  Box(Box(9714, 9714), Box(9714, 9714)),
+  Box(Box(9715, 9715), Box(9715, 9715)),
+  Box(Box(9716, 9716), Box(9716, 9716)),
+  Box(Box(9717, 9717), Box(9717, 9717)),
+  Box(Box(9718, 9718), Box(9718, 9718)),
+  Box(Box(9719, 9719), Box(9719, 9719)),
+  Box(Box(9720, 9720), Box(9720, 9720)),
+  Box(Box(9721, 9721), Box(9721, 9721)),
+  Box(Box(9722, 9722), Box(9722, 9722)),
+  Box(Box(9723, 9723), Box(9723, 9723)),
+  Box(Box(9724, 9724), Box(9724, 9724)),
+  Box(Box(9725, 9725), Box(9725, 9725)),
+  Box(Box(9726, 9726), Box(9726, 9726)),
+  Box(Box(9727, 9727), Box(9727, 9727)),
+  Box(Box(9728, 9728), Box(9728, 9728)),
+  Box(Box(9729, 9729), Box(9729, 9729)),
+  Box(Box(9730, 9730), Box(9730, 9730)),
+  Box(Box(9731, 9731), Box(9731, 9731)),
+  Box(Box(9732, 9732), Box(9732, 9732)),
+  Box(Box(9733, 9733), Box(9733, 9733)),
+  Box(Box(9734, 9734), Box(9734, 9734)),
+  Box(Box(9735, 9735), Box(9735, 9735)),
+  Box(Box(9736, 9736), Box(9736, 9736)),
+  Box(Box(9737, 9737), Box(9737, 9737)),
+  Box(Box(9738, 9738), Box(9738, 9738)),
+  Box(Box(9739, 9739), Box(9739, 9739)),
+  Box(Box(9740, 9740), Box(9740, 9740)),
+  Box(Box(9741, 9741), Box(9741, 9741)),
+  Box(Box(9742, 9742), Box(9742, 9742)),
+  Box(Box(9743, 9743), Box(9743, 9743)),
+  Box(Box(9744, 9744), Box(9744, 9744)),
+  Box(Box(9745, 9745), Box(9745, 9745)),
+  Box(Box(9746, 9746), Box(9746, 9746)),
+  Box(Box(9747, 9747), Box(9747, 9747)),
+  Box(Box(9748, 9748), Box(9748, 9748)),
+  Box(Box(9749, 9749), Box(9749, 9749)),
+  Box(Box(9750, 9750), Box(9750, 9750)),
+  Box(Box(9751, 9751), Box(9751, 9751)),
+  Box(Box(9752, 9752), Box(9752, 9752)),
+  Box(Box(9753, 9753), Box(9753, 9753)),
+  Box(Box(9754, 9754), Box(9754, 9754)),
+  Box(Box(9755, 9755), Box(9755, 9755)),
+  Box(Box(9756, 9756), Box(9756, 9756)),
+  Box(Box(9757, 9757), Box(9757, 9757)),
+  Box(Box(9758, 9758), Box(9758, 9758)),
+  Box(Box(9759, 9759), Box(9759, 9759)),
+  Box(Box(9760, 9760), Box(9760, 9760)),
+  Box(Box(9761, 9761), Box(9761, 9761)),
+  Box(Box(9762, 9762), Box(9762, 9762)),
+  Box(Box(9763, 9763), Box(9763, 9763)),
+  Box(Box(9764, 9764), Box(9764, 9764)),
+  Box(Box(9765, 9765), Box(9765, 9765)),
+  Box(Box(9766, 9766), Box(9766, 9766)),
+  Box(Box(9767, 9767), Box(9767, 9767)),
+  Box(Box(9768, 9768), Box(9768, 9768)),
+  Box(Box(9769, 9769), Box(9769, 9769)),
+  Box(Box(9770, 9770), Box(9770, 9770)),
+  Box(Box(9771, 9771), Box(9771, 9771)),
+  Box(Box(9772, 9772), Box(9772, 9772)),
+  Box(Box(9773, 9773), Box(9773, 9773)),
+  Box(Box(9774, 9774), Box(9774, 9774)),
+  Box(Box(9775, 9775), Box(9775, 9775)),
+  Box(Box(9776, 9776), Box(9776, 9776)),
+  Box(Box(9777, 9777), Box(9777, 9777)),
+  Box(Box(9778, 9778), Box(9778, 9778)),
+  Box(Box(9779, 9779), Box(9779, 9779)),
+  Box(Box(9780, 9780), Box(9780, 9780)),
+  Box(Box(9781, 9781), Box(9781, 9781)),
+  Box(Box(9782, 9782), Box(9782, 9782)),
+  Box(Box(9783, 9783), Box(9783, 9783)),
+  Box(Box(9784, 9784), Box(9784, 9784)),
+  Box(Box(9785, 9785), Box(9785, 9785)),
+  Box(Box(9786, 9786), Box(9786, 9786)),
+  Box(Box(9787, 9787), Box(9787, 9787)),
+  Box(Box(9788, 9788), Box(9788, 9788)),
+  Box(Box(9789, 9789), Box(9789, 9789)),
+  Box(Box(9790, 9790), Box(9790, 9790)),
+  Box(Box(9791, 9791), Box(9791, 9791)),
+  Box(Box(9792, 9792), Box(9792, 9792)),
+  Box(Box(9793, 9793), Box(9793, 9793)),
+  Box(Box(9794, 9794), Box(9794, 9794)),
+  Box(Box(9795, 9795), Box(9795, 9795)),
+  Box(Box(9796, 9796), Box(9796, 9796)),
+  Box(Box(9797, 9797), Box(9797, 9797)),
+  Box(Box(9798, 9798), Box(9798, 9798)),
+  Box(Box(9799, 9799), Box(9799, 9799)),
+  Box(Box(9800, 9800), Box(9800, 9800)),
+  Box(Box(9801, 9801), Box(9801, 9801)),
+  Box(Box(9802, 9802), Box(9802, 9802)),
+  Box(Box(9803, 9803), Box(9803, 9803)),
+  Box(Box(9804, 9804), Box(9804, 9804)),
+  Box(Box(9805, 9805), Box(9805, 9805)),
+  Box(Box(9806, 9806), Box(9806, 9806)),
+  Box(Box(9807, 9807), Box(9807, 9807)),
+  Box(Box(9808, 9808), Box(9808, 9808)),
+  Box(Box(9809, 9809), Box(9809, 9809)),
+  Box(Box(9810, 9810), Box(9810, 9810)),
+  Box(Box(9811, 9811), Box(9811, 9811)),
+  Box(Box(9812, 9812), Box(9812, 9812)),
+  Box(Box(9813, 9813), Box(9813, 9813)),
+  Box(Box(9814, 9814), Box(9814, 9814)),
+  Box(Box(9815, 9815), Box(9815, 9815)),
+  Box(Box(9816, 9816), Box(9816, 9816)),
+  Box(Box(9817, 9817), Box(9817, 9817)),
+  Box(Box(9818, 9818), Box(9818, 9818)),
+  Box(Box(9819, 9819), Box(9819, 9819)),
+  Box(Box(9820, 9820), Box(9820, 9820)),
+  Box(Box(9821, 9821), Box(9821, 9821)),
+  Box(Box(9822, 9822), Box(9822, 9822)),
+  Box(Box(9823, 9823), Box(9823, 9823)),
+  Box(Box(9824, 9824), Box(9824, 9824)),
+  Box(Box(9825, 9825), Box(9825, 9825)),
+  Box(Box(9826, 9826), Box(9826, 9826)),
+  Box(Box(9827, 9827), Box(9827, 9827)),
+  Box(Box(9828, 9828), Box(9828, 9828)),
+  Box(Box(9829, 9829), Box(9829, 9829)),
+  Box(Box(9830, 9830), Box(9830, 9830)),
+  Box(Box(9831, 9831), Box(9831, 9831)),
+  Box(Box(9832, 9832), Box(9832, 9832)),
+  Box(Box(9833, 9833), Box(9833, 9833)),
+  Box(Box(9834, 9834), Box(9834, 9834)),
+  Box(Box(9835, 9835), Box(9835, 9835)),
+  Box(Box(9836, 9836), Box(9836, 9836)),
+  Box(Box(9837, 9837), Box(9837, 9837)),
+  Box(Box(9838, 9838), Box(9838, 9838)),
+  Box(Box(9839, 9839), Box(9839, 9839)),
+  Box(Box(9840, 9840), Box(9840, 9840)),
+  Box(Box(9841, 9841), Box(9841, 9841)),
+  Box(Box(9842, 9842), Box(9842, 9842)),
+  Box(Box(9843, 9843), Box(9843, 9843)),
+  Box(Box(9844, 9844), Box(9844, 9844)),
+  Box(Box(9845, 9845), Box(9845, 9845)),
+  Box(Box(9846, 9846), Box(9846, 9846)),
+  Box(Box(9847, 9847), Box(9847, 9847)),
+  Box(Box(9848, 9848), Box(9848, 9848)),
+  Box(Box(9849, 9849), Box(9849, 9849)),
+  Box(Box(9850, 9850), Box(9850, 9850)),
+  Box(Box(9851, 9851), Box(9851, 9851)),
+  Box(Box(9852, 9852), Box(9852, 9852)),
+  Box(Box(9853, 9853), Box(9853, 9853)),
+  Box(Box(9854, 9854), Box(9854, 9854)),
+  Box(Box(9855, 9855), Box(9855, 9855)),
+  Box(Box(9856, 9856), Box(9856, 9856)),
+  Box(Box(9857, 9857), Box(9857, 9857)),
+  Box(Box(9858, 9858), Box(9858, 9858)),
+  Box(Box(9859, 9859), Box(9859, 9859)),
+  Box(Box(9860, 9860), Box(9860, 9860)),
+  Box(Box(9861, 9861), Box(9861, 9861)),
+  Box(Box(9862, 9862), Box(9862, 9862)),
+  Box(Box(9863, 9863), Box(9863, 9863)),
+  Box(Box(9864, 9864), Box(9864, 9864)),
+  Box(Box(9865, 9865), Box(9865, 9865)),
+  Box(Box(9866, 9866), Box(9866, 9866)),
+  Box(Box(9867, 9867), Box(9867, 9867)),
+  Box(Box(9868, 9868), Box(9868, 9868)),
+  Box(Box(9869, 9869), Box(9869, 9869)),
+  Box(Box(9870, 9870), Box(9870, 9870)),
+  Box(Box(9871, 9871), Box(9871, 9871)),
+  Box(Box(9872, 9872), Box(9872, 9872)),
+  Box(Box(9873, 9873), Box(9873, 9873)),
+  Box(Box(9874, 9874), Box(9874, 9874)),
+  Box(Box(9875, 9875), Box(9875, 9875)),
+  Box(Box(9876, 9876), Box(9876, 9876)),
+  Box(Box(9877, 9877), Box(9877, 9877)),
+  Box(Box(9878, 9878), Box(9878, 9878)),
+  Box(Box(9879, 9879), Box(9879, 9879)),
+  Box(Box(9880, 9880), Box(9880, 9880)),
+  Box(Box(9881, 9881), Box(9881, 9881)),
+  Box(Box(9882, 9882), Box(9882, 9882)),
+  Box(Box(9883, 9883), Box(9883, 9883)),
+  Box(Box(9884, 9884), Box(9884, 9884)),
+  Box(Box(9885, 9885), Box(9885, 9885)),
+  Box(Box(9886, 9886), Box(9886, 9886)),
+  Box(Box(9887, 9887), Box(9887, 9887)),
+  Box(Box(9888, 9888), Box(9888, 9888)),
+  Box(Box(9889, 9889), Box(9889, 9889)),
+  Box(Box(9890, 9890), Box(9890, 9890)),
+  Box(Box(9891, 9891), Box(9891, 9891)),
+  Box(Box(9892, 9892), Box(9892, 9892)),
+  Box(Box(9893, 9893), Box(9893, 9893)),
+  Box(Box(9894, 9894), Box(9894, 9894)),
+  Box(Box(9895, 9895), Box(9895, 9895)),
+  Box(Box(9896, 9896), Box(9896, 9896)),
+  Box(Box(9897, 9897), Box(9897, 9897)),
+  Box(Box(9898, 9898), Box(9898, 9898)),
+  Box(Box(9899, 9899), Box(9899, 9899)),
+  Box(Box(9900, 9900), Box(9900, 9900)),
+  Box(Box(9901, 9901), Box(9901, 9901)),
+  Box(Box(9902, 9902), Box(9902, 9902)),
+  Box(Box(9903, 9903), Box(9903, 9903)),
+  Box(Box(9904, 9904), Box(9904, 9904)),
+  Box(Box(9905, 9905), Box(9905, 9905)),
+  Box(Box(9906, 9906), Box(9906, 9906)),
+  Box(Box(9907, 9907), Box(9907, 9907)),
+  Box(Box(9908, 9908), Box(9908, 9908)),
+  Box(Box(9909, 9909), Box(9909, 9909)),
+  Box(Box(9910, 9910), Box(9910, 9910)),
+  Box(Box(9911, 9911), Box(9911, 9911)),
+  Box(Box(9912, 9912), Box(9912, 9912)),
+  Box(Box(9913, 9913), Box(9913, 9913)),
+  Box(Box(9914, 9914), Box(9914, 9914)),
+  Box(Box(9915, 9915), Box(9915, 9915)),
+  Box(Box(9916, 9916), Box(9916, 9916)),
+  Box(Box(9917, 9917), Box(9917, 9917)),
+  Box(Box(9918, 9918), Box(9918, 9918)),
+  Box(Box(9919, 9919), Box(9919, 9919)),
+  Box(Box(9920, 9920), Box(9920, 9920)),
+  Box(Box(9921, 9921), Box(9921, 9921)),
+  Box(Box(9922, 9922), Box(9922, 9922)),
+  Box(Box(9923, 9923), Box(9923, 9923)),
+  Box(Box(9924, 9924), Box(9924, 9924)),
+  Box(Box(9925, 9925), Box(9925, 9925)),
+  Box(Box(9926, 9926), Box(9926, 9926)),
+  Box(Box(9927, 9927), Box(9927, 9927)),
+  Box(Box(9928, 9928), Box(9928, 9928)),
+  Box(Box(9929, 9929), Box(9929, 9929)),
+  Box(Box(9930, 9930), Box(9930, 9930)),
+  Box(Box(9931, 9931), Box(9931, 9931)),
+  Box(Box(9932, 9932), Box(9932, 9932)),
+  Box(Box(9933, 9933), Box(9933, 9933)),
+  Box(Box(9934, 9934), Box(9934, 9934)),
+  Box(Box(9935, 9935), Box(9935, 9935)),
+  Box(Box(9936, 9936), Box(9936, 9936)),
+  Box(Box(9937, 9937), Box(9937, 9937)),
+  Box(Box(9938, 9938), Box(9938, 9938)),
+  Box(Box(9939, 9939), Box(9939, 9939)),
+  Box(Box(9940, 9940), Box(9940, 9940)),
+  Box(Box(9941, 9941), Box(9941, 9941)),
+  Box(Box(9942, 9942), Box(9942, 9942)),
+  Box(Box(9943, 9943), Box(9943, 9943)),
+  Box(Box(9944, 9944), Box(9944, 9944)),
+  Box(Box(9945, 9945), Box(9945, 9945)),
+  Box(Box(9946, 9946), Box(9946, 9946)),
+  Box(Box(9947, 9947), Box(9947, 9947)),
+  Box(Box(9948, 9948), Box(9948, 9948)),
+  Box(Box(9949, 9949), Box(9949, 9949)),
+  Box(Box(9950, 9950), Box(9950, 9950)),
+  Box(Box(9951, 9951), Box(9951, 9951)),
+  Box(Box(9952, 9952), Box(9952, 9952)),
+  Box(Box(9953, 9953), Box(9953, 9953)),
+  Box(Box(9954, 9954), Box(9954, 9954)),
+  Box(Box(9955, 9955), Box(9955, 9955)),
+  Box(Box(9956, 9956), Box(9956, 9956)),
+  Box(Box(9957, 9957), Box(9957, 9957)),
+  Box(Box(9958, 9958), Box(9958, 9958)),
+  Box(Box(9959, 9959), Box(9959, 9959)),
+  Box(Box(9960, 9960), Box(9960, 9960)),
+  Box(Box(9961, 9961), Box(9961, 9961)),
+  Box(Box(9962, 9962), Box(9962, 9962)),
+  Box(Box(9963, 9963), Box(9963, 9963)),
+  Box(Box(9964, 9964), Box(9964, 9964)),
+  Box(Box(9965, 9965), Box(9965, 9965)),
+  Box(Box(9966, 9966), Box(9966, 9966)),
+  Box(Box(9967, 9967), Box(9967, 9967)),
+  Box(Box(9968, 9968), Box(9968, 9968)),
+  Box(Box(9969, 9969), Box(9969, 9969)),
+  Box(Box(9970, 9970), Box(9970, 9970)),
+  Box(Box(9971, 9971), Box(9971, 9971)),
+  Box(Box(9972, 9972), Box(9972, 9972)),
+  Box(Box(9973, 9973), Box(9973, 9973)),
+  Box(Box(9974, 9974), Box(9974, 9974)),
+  Box(Box(9975, 9975), Box(9975, 9975)),
+  Box(Box(9976, 9976), Box(9976, 9976)),
+  Box(Box(9977, 9977), Box(9977, 9977)),
+  Box(Box(9978, 9978), Box(9978, 9978)),
+  Box(Box(9979, 9979), Box(9979, 9979)),
+  Box(Box(9980, 9980), Box(9980, 9980)),
+  Box(Box(9981, 9981), Box(9981, 9981)),
+  Box(Box(9982, 9982), Box(9982, 9982)),
+  Box(Box(9983, 9983), Box(9983, 9983)),
+  Box(Box(9984, 9984), Box(9984, 9984)),
+  Box(Box(9985, 9985), Box(9985, 9985)),
+  Box(Box(9986, 9986), Box(9986, 9986)),
+  Box(Box(9987, 9987), Box(9987, 9987)),
+  Box(Box(9988, 9988), Box(9988, 9988)),
+  Box(Box(9989, 9989), Box(9989, 9989)),
+  Box(Box(9990, 9990), Box(9990, 9990)),
+  Box(Box(9991, 9991), Box(9991, 9991)),
+  Box(Box(9992, 9992), Box(9992, 9992)),
+  Box(Box(9993, 9993), Box(9993, 9993)),
+  Box(Box(9994, 9994), Box(9994, 9994)),
+  Box(Box(9995, 9995), Box(9995, 9995)),
+  Box(Box(9996, 9996), Box(9996, 9996)),
+  Box(Box(9997, 9997), Box(9997, 9997)),
+  Box(Box(9998, 9998), Box(9998, 9998)),
+  Box(Box(9999, 9999), Box(9999, 9999)),
+];
+
+// 10,000 elements.
+const list2 = [
+  Box(Box(0, 0), Box(0, 0)),
+  Box(Box(1, 1), Box(1, 1)),
+  Box(Box(2, 2), Box(2, 2)),
+  Box(Box(3, 3), Box(3, 3)),
+  Box(Box(4, 4), Box(4, 4)),
+  Box(Box(5, 5), Box(5, 5)),
+  Box(Box(6, 6), Box(6, 6)),
+  Box(Box(7, 7), Box(7, 7)),
+  Box(Box(8, 8), Box(8, 8)),
+  Box(Box(9, 9), Box(9, 9)),
+  Box(Box(10, 10), Box(10, 10)),
+  Box(Box(11, 11), Box(11, 11)),
+  Box(Box(12, 12), Box(12, 12)),
+  Box(Box(13, 13), Box(13, 13)),
+  Box(Box(14, 14), Box(14, 14)),
+  Box(Box(15, 15), Box(15, 15)),
+  Box(Box(16, 16), Box(16, 16)),
+  Box(Box(17, 17), Box(17, 17)),
+  Box(Box(18, 18), Box(18, 18)),
+  Box(Box(19, 19), Box(19, 19)),
+  Box(Box(20, 20), Box(20, 20)),
+  Box(Box(21, 21), Box(21, 21)),
+  Box(Box(22, 22), Box(22, 22)),
+  Box(Box(23, 23), Box(23, 23)),
+  Box(Box(24, 24), Box(24, 24)),
+  Box(Box(25, 25), Box(25, 25)),
+  Box(Box(26, 26), Box(26, 26)),
+  Box(Box(27, 27), Box(27, 27)),
+  Box(Box(28, 28), Box(28, 28)),
+  Box(Box(29, 29), Box(29, 29)),
+  Box(Box(30, 30), Box(30, 30)),
+  Box(Box(31, 31), Box(31, 31)),
+  Box(Box(32, 32), Box(32, 32)),
+  Box(Box(33, 33), Box(33, 33)),
+  Box(Box(34, 34), Box(34, 34)),
+  Box(Box(35, 35), Box(35, 35)),
+  Box(Box(36, 36), Box(36, 36)),
+  Box(Box(37, 37), Box(37, 37)),
+  Box(Box(38, 38), Box(38, 38)),
+  Box(Box(39, 39), Box(39, 39)),
+  Box(Box(40, 40), Box(40, 40)),
+  Box(Box(41, 41), Box(41, 41)),
+  Box(Box(42, 42), Box(42, 42)),
+  Box(Box(43, 43), Box(43, 43)),
+  Box(Box(44, 44), Box(44, 44)),
+  Box(Box(45, 45), Box(45, 45)),
+  Box(Box(46, 46), Box(46, 46)),
+  Box(Box(47, 47), Box(47, 47)),
+  Box(Box(48, 48), Box(48, 48)),
+  Box(Box(49, 49), Box(49, 49)),
+  Box(Box(50, 50), Box(50, 50)),
+  Box(Box(51, 51), Box(51, 51)),
+  Box(Box(52, 52), Box(52, 52)),
+  Box(Box(53, 53), Box(53, 53)),
+  Box(Box(54, 54), Box(54, 54)),
+  Box(Box(55, 55), Box(55, 55)),
+  Box(Box(56, 56), Box(56, 56)),
+  Box(Box(57, 57), Box(57, 57)),
+  Box(Box(58, 58), Box(58, 58)),
+  Box(Box(59, 59), Box(59, 59)),
+  Box(Box(60, 60), Box(60, 60)),
+  Box(Box(61, 61), Box(61, 61)),
+  Box(Box(62, 62), Box(62, 62)),
+  Box(Box(63, 63), Box(63, 63)),
+  Box(Box(64, 64), Box(64, 64)),
+  Box(Box(65, 65), Box(65, 65)),
+  Box(Box(66, 66), Box(66, 66)),
+  Box(Box(67, 67), Box(67, 67)),
+  Box(Box(68, 68), Box(68, 68)),
+  Box(Box(69, 69), Box(69, 69)),
+  Box(Box(70, 70), Box(70, 70)),
+  Box(Box(71, 71), Box(71, 71)),
+  Box(Box(72, 72), Box(72, 72)),
+  Box(Box(73, 73), Box(73, 73)),
+  Box(Box(74, 74), Box(74, 74)),
+  Box(Box(75, 75), Box(75, 75)),
+  Box(Box(76, 76), Box(76, 76)),
+  Box(Box(77, 77), Box(77, 77)),
+  Box(Box(78, 78), Box(78, 78)),
+  Box(Box(79, 79), Box(79, 79)),
+  Box(Box(80, 80), Box(80, 80)),
+  Box(Box(81, 81), Box(81, 81)),
+  Box(Box(82, 82), Box(82, 82)),
+  Box(Box(83, 83), Box(83, 83)),
+  Box(Box(84, 84), Box(84, 84)),
+  Box(Box(85, 85), Box(85, 85)),
+  Box(Box(86, 86), Box(86, 86)),
+  Box(Box(87, 87), Box(87, 87)),
+  Box(Box(88, 88), Box(88, 88)),
+  Box(Box(89, 89), Box(89, 89)),
+  Box(Box(90, 90), Box(90, 90)),
+  Box(Box(91, 91), Box(91, 91)),
+  Box(Box(92, 92), Box(92, 92)),
+  Box(Box(93, 93), Box(93, 93)),
+  Box(Box(94, 94), Box(94, 94)),
+  Box(Box(95, 95), Box(95, 95)),
+  Box(Box(96, 96), Box(96, 96)),
+  Box(Box(97, 97), Box(97, 97)),
+  Box(Box(98, 98), Box(98, 98)),
+  Box(Box(99, 99), Box(99, 99)),
+  Box(Box(100, 100), Box(100, 100)),
+  Box(Box(101, 101), Box(101, 101)),
+  Box(Box(102, 102), Box(102, 102)),
+  Box(Box(103, 103), Box(103, 103)),
+  Box(Box(104, 104), Box(104, 104)),
+  Box(Box(105, 105), Box(105, 105)),
+  Box(Box(106, 106), Box(106, 106)),
+  Box(Box(107, 107), Box(107, 107)),
+  Box(Box(108, 108), Box(108, 108)),
+  Box(Box(109, 109), Box(109, 109)),
+  Box(Box(110, 110), Box(110, 110)),
+  Box(Box(111, 111), Box(111, 111)),
+  Box(Box(112, 112), Box(112, 112)),
+  Box(Box(113, 113), Box(113, 113)),
+  Box(Box(114, 114), Box(114, 114)),
+  Box(Box(115, 115), Box(115, 115)),
+  Box(Box(116, 116), Box(116, 116)),
+  Box(Box(117, 117), Box(117, 117)),
+  Box(Box(118, 118), Box(118, 118)),
+  Box(Box(119, 119), Box(119, 119)),
+  Box(Box(120, 120), Box(120, 120)),
+  Box(Box(121, 121), Box(121, 121)),
+  Box(Box(122, 122), Box(122, 122)),
+  Box(Box(123, 123), Box(123, 123)),
+  Box(Box(124, 124), Box(124, 124)),
+  Box(Box(125, 125), Box(125, 125)),
+  Box(Box(126, 126), Box(126, 126)),
+  Box(Box(127, 127), Box(127, 127)),
+  Box(Box(128, 128), Box(128, 128)),
+  Box(Box(129, 129), Box(129, 129)),
+  Box(Box(130, 130), Box(130, 130)),
+  Box(Box(131, 131), Box(131, 131)),
+  Box(Box(132, 132), Box(132, 132)),
+  Box(Box(133, 133), Box(133, 133)),
+  Box(Box(134, 134), Box(134, 134)),
+  Box(Box(135, 135), Box(135, 135)),
+  Box(Box(136, 136), Box(136, 136)),
+  Box(Box(137, 137), Box(137, 137)),
+  Box(Box(138, 138), Box(138, 138)),
+  Box(Box(139, 139), Box(139, 139)),
+  Box(Box(140, 140), Box(140, 140)),
+  Box(Box(141, 141), Box(141, 141)),
+  Box(Box(142, 142), Box(142, 142)),
+  Box(Box(143, 143), Box(143, 143)),
+  Box(Box(144, 144), Box(144, 144)),
+  Box(Box(145, 145), Box(145, 145)),
+  Box(Box(146, 146), Box(146, 146)),
+  Box(Box(147, 147), Box(147, 147)),
+  Box(Box(148, 148), Box(148, 148)),
+  Box(Box(149, 149), Box(149, 149)),
+  Box(Box(150, 150), Box(150, 150)),
+  Box(Box(151, 151), Box(151, 151)),
+  Box(Box(152, 152), Box(152, 152)),
+  Box(Box(153, 153), Box(153, 153)),
+  Box(Box(154, 154), Box(154, 154)),
+  Box(Box(155, 155), Box(155, 155)),
+  Box(Box(156, 156), Box(156, 156)),
+  Box(Box(157, 157), Box(157, 157)),
+  Box(Box(158, 158), Box(158, 158)),
+  Box(Box(159, 159), Box(159, 159)),
+  Box(Box(160, 160), Box(160, 160)),
+  Box(Box(161, 161), Box(161, 161)),
+  Box(Box(162, 162), Box(162, 162)),
+  Box(Box(163, 163), Box(163, 163)),
+  Box(Box(164, 164), Box(164, 164)),
+  Box(Box(165, 165), Box(165, 165)),
+  Box(Box(166, 166), Box(166, 166)),
+  Box(Box(167, 167), Box(167, 167)),
+  Box(Box(168, 168), Box(168, 168)),
+  Box(Box(169, 169), Box(169, 169)),
+  Box(Box(170, 170), Box(170, 170)),
+  Box(Box(171, 171), Box(171, 171)),
+  Box(Box(172, 172), Box(172, 172)),
+  Box(Box(173, 173), Box(173, 173)),
+  Box(Box(174, 174), Box(174, 174)),
+  Box(Box(175, 175), Box(175, 175)),
+  Box(Box(176, 176), Box(176, 176)),
+  Box(Box(177, 177), Box(177, 177)),
+  Box(Box(178, 178), Box(178, 178)),
+  Box(Box(179, 179), Box(179, 179)),
+  Box(Box(180, 180), Box(180, 180)),
+  Box(Box(181, 181), Box(181, 181)),
+  Box(Box(182, 182), Box(182, 182)),
+  Box(Box(183, 183), Box(183, 183)),
+  Box(Box(184, 184), Box(184, 184)),
+  Box(Box(185, 185), Box(185, 185)),
+  Box(Box(186, 186), Box(186, 186)),
+  Box(Box(187, 187), Box(187, 187)),
+  Box(Box(188, 188), Box(188, 188)),
+  Box(Box(189, 189), Box(189, 189)),
+  Box(Box(190, 190), Box(190, 190)),
+  Box(Box(191, 191), Box(191, 191)),
+  Box(Box(192, 192), Box(192, 192)),
+  Box(Box(193, 193), Box(193, 193)),
+  Box(Box(194, 194), Box(194, 194)),
+  Box(Box(195, 195), Box(195, 195)),
+  Box(Box(196, 196), Box(196, 196)),
+  Box(Box(197, 197), Box(197, 197)),
+  Box(Box(198, 198), Box(198, 198)),
+  Box(Box(199, 199), Box(199, 199)),
+  Box(Box(200, 200), Box(200, 200)),
+  Box(Box(201, 201), Box(201, 201)),
+  Box(Box(202, 202), Box(202, 202)),
+  Box(Box(203, 203), Box(203, 203)),
+  Box(Box(204, 204), Box(204, 204)),
+  Box(Box(205, 205), Box(205, 205)),
+  Box(Box(206, 206), Box(206, 206)),
+  Box(Box(207, 207), Box(207, 207)),
+  Box(Box(208, 208), Box(208, 208)),
+  Box(Box(209, 209), Box(209, 209)),
+  Box(Box(210, 210), Box(210, 210)),
+  Box(Box(211, 211), Box(211, 211)),
+  Box(Box(212, 212), Box(212, 212)),
+  Box(Box(213, 213), Box(213, 213)),
+  Box(Box(214, 214), Box(214, 214)),
+  Box(Box(215, 215), Box(215, 215)),
+  Box(Box(216, 216), Box(216, 216)),
+  Box(Box(217, 217), Box(217, 217)),
+  Box(Box(218, 218), Box(218, 218)),
+  Box(Box(219, 219), Box(219, 219)),
+  Box(Box(220, 220), Box(220, 220)),
+  Box(Box(221, 221), Box(221, 221)),
+  Box(Box(222, 222), Box(222, 222)),
+  Box(Box(223, 223), Box(223, 223)),
+  Box(Box(224, 224), Box(224, 224)),
+  Box(Box(225, 225), Box(225, 225)),
+  Box(Box(226, 226), Box(226, 226)),
+  Box(Box(227, 227), Box(227, 227)),
+  Box(Box(228, 228), Box(228, 228)),
+  Box(Box(229, 229), Box(229, 229)),
+  Box(Box(230, 230), Box(230, 230)),
+  Box(Box(231, 231), Box(231, 231)),
+  Box(Box(232, 232), Box(232, 232)),
+  Box(Box(233, 233), Box(233, 233)),
+  Box(Box(234, 234), Box(234, 234)),
+  Box(Box(235, 235), Box(235, 235)),
+  Box(Box(236, 236), Box(236, 236)),
+  Box(Box(237, 237), Box(237, 237)),
+  Box(Box(238, 238), Box(238, 238)),
+  Box(Box(239, 239), Box(239, 239)),
+  Box(Box(240, 240), Box(240, 240)),
+  Box(Box(241, 241), Box(241, 241)),
+  Box(Box(242, 242), Box(242, 242)),
+  Box(Box(243, 243), Box(243, 243)),
+  Box(Box(244, 244), Box(244, 244)),
+  Box(Box(245, 245), Box(245, 245)),
+  Box(Box(246, 246), Box(246, 246)),
+  Box(Box(247, 247), Box(247, 247)),
+  Box(Box(248, 248), Box(248, 248)),
+  Box(Box(249, 249), Box(249, 249)),
+  Box(Box(250, 250), Box(250, 250)),
+  Box(Box(251, 251), Box(251, 251)),
+  Box(Box(252, 252), Box(252, 252)),
+  Box(Box(253, 253), Box(253, 253)),
+  Box(Box(254, 254), Box(254, 254)),
+  Box(Box(255, 255), Box(255, 255)),
+  Box(Box(256, 256), Box(256, 256)),
+  Box(Box(257, 257), Box(257, 257)),
+  Box(Box(258, 258), Box(258, 258)),
+  Box(Box(259, 259), Box(259, 259)),
+  Box(Box(260, 260), Box(260, 260)),
+  Box(Box(261, 261), Box(261, 261)),
+  Box(Box(262, 262), Box(262, 262)),
+  Box(Box(263, 263), Box(263, 263)),
+  Box(Box(264, 264), Box(264, 264)),
+  Box(Box(265, 265), Box(265, 265)),
+  Box(Box(266, 266), Box(266, 266)),
+  Box(Box(267, 267), Box(267, 267)),
+  Box(Box(268, 268), Box(268, 268)),
+  Box(Box(269, 269), Box(269, 269)),
+  Box(Box(270, 270), Box(270, 270)),
+  Box(Box(271, 271), Box(271, 271)),
+  Box(Box(272, 272), Box(272, 272)),
+  Box(Box(273, 273), Box(273, 273)),
+  Box(Box(274, 274), Box(274, 274)),
+  Box(Box(275, 275), Box(275, 275)),
+  Box(Box(276, 276), Box(276, 276)),
+  Box(Box(277, 277), Box(277, 277)),
+  Box(Box(278, 278), Box(278, 278)),
+  Box(Box(279, 279), Box(279, 279)),
+  Box(Box(280, 280), Box(280, 280)),
+  Box(Box(281, 281), Box(281, 281)),
+  Box(Box(282, 282), Box(282, 282)),
+  Box(Box(283, 283), Box(283, 283)),
+  Box(Box(284, 284), Box(284, 284)),
+  Box(Box(285, 285), Box(285, 285)),
+  Box(Box(286, 286), Box(286, 286)),
+  Box(Box(287, 287), Box(287, 287)),
+  Box(Box(288, 288), Box(288, 288)),
+  Box(Box(289, 289), Box(289, 289)),
+  Box(Box(290, 290), Box(290, 290)),
+  Box(Box(291, 291), Box(291, 291)),
+  Box(Box(292, 292), Box(292, 292)),
+  Box(Box(293, 293), Box(293, 293)),
+  Box(Box(294, 294), Box(294, 294)),
+  Box(Box(295, 295), Box(295, 295)),
+  Box(Box(296, 296), Box(296, 296)),
+  Box(Box(297, 297), Box(297, 297)),
+  Box(Box(298, 298), Box(298, 298)),
+  Box(Box(299, 299), Box(299, 299)),
+  Box(Box(300, 300), Box(300, 300)),
+  Box(Box(301, 301), Box(301, 301)),
+  Box(Box(302, 302), Box(302, 302)),
+  Box(Box(303, 303), Box(303, 303)),
+  Box(Box(304, 304), Box(304, 304)),
+  Box(Box(305, 305), Box(305, 305)),
+  Box(Box(306, 306), Box(306, 306)),
+  Box(Box(307, 307), Box(307, 307)),
+  Box(Box(308, 308), Box(308, 308)),
+  Box(Box(309, 309), Box(309, 309)),
+  Box(Box(310, 310), Box(310, 310)),
+  Box(Box(311, 311), Box(311, 311)),
+  Box(Box(312, 312), Box(312, 312)),
+  Box(Box(313, 313), Box(313, 313)),
+  Box(Box(314, 314), Box(314, 314)),
+  Box(Box(315, 315), Box(315, 315)),
+  Box(Box(316, 316), Box(316, 316)),
+  Box(Box(317, 317), Box(317, 317)),
+  Box(Box(318, 318), Box(318, 318)),
+  Box(Box(319, 319), Box(319, 319)),
+  Box(Box(320, 320), Box(320, 320)),
+  Box(Box(321, 321), Box(321, 321)),
+  Box(Box(322, 322), Box(322, 322)),
+  Box(Box(323, 323), Box(323, 323)),
+  Box(Box(324, 324), Box(324, 324)),
+  Box(Box(325, 325), Box(325, 325)),
+  Box(Box(326, 326), Box(326, 326)),
+  Box(Box(327, 327), Box(327, 327)),
+  Box(Box(328, 328), Box(328, 328)),
+  Box(Box(329, 329), Box(329, 329)),
+  Box(Box(330, 330), Box(330, 330)),
+  Box(Box(331, 331), Box(331, 331)),
+  Box(Box(332, 332), Box(332, 332)),
+  Box(Box(333, 333), Box(333, 333)),
+  Box(Box(334, 334), Box(334, 334)),
+  Box(Box(335, 335), Box(335, 335)),
+  Box(Box(336, 336), Box(336, 336)),
+  Box(Box(337, 337), Box(337, 337)),
+  Box(Box(338, 338), Box(338, 338)),
+  Box(Box(339, 339), Box(339, 339)),
+  Box(Box(340, 340), Box(340, 340)),
+  Box(Box(341, 341), Box(341, 341)),
+  Box(Box(342, 342), Box(342, 342)),
+  Box(Box(343, 343), Box(343, 343)),
+  Box(Box(344, 344), Box(344, 344)),
+  Box(Box(345, 345), Box(345, 345)),
+  Box(Box(346, 346), Box(346, 346)),
+  Box(Box(347, 347), Box(347, 347)),
+  Box(Box(348, 348), Box(348, 348)),
+  Box(Box(349, 349), Box(349, 349)),
+  Box(Box(350, 350), Box(350, 350)),
+  Box(Box(351, 351), Box(351, 351)),
+  Box(Box(352, 352), Box(352, 352)),
+  Box(Box(353, 353), Box(353, 353)),
+  Box(Box(354, 354), Box(354, 354)),
+  Box(Box(355, 355), Box(355, 355)),
+  Box(Box(356, 356), Box(356, 356)),
+  Box(Box(357, 357), Box(357, 357)),
+  Box(Box(358, 358), Box(358, 358)),
+  Box(Box(359, 359), Box(359, 359)),
+  Box(Box(360, 360), Box(360, 360)),
+  Box(Box(361, 361), Box(361, 361)),
+  Box(Box(362, 362), Box(362, 362)),
+  Box(Box(363, 363), Box(363, 363)),
+  Box(Box(364, 364), Box(364, 364)),
+  Box(Box(365, 365), Box(365, 365)),
+  Box(Box(366, 366), Box(366, 366)),
+  Box(Box(367, 367), Box(367, 367)),
+  Box(Box(368, 368), Box(368, 368)),
+  Box(Box(369, 369), Box(369, 369)),
+  Box(Box(370, 370), Box(370, 370)),
+  Box(Box(371, 371), Box(371, 371)),
+  Box(Box(372, 372), Box(372, 372)),
+  Box(Box(373, 373), Box(373, 373)),
+  Box(Box(374, 374), Box(374, 374)),
+  Box(Box(375, 375), Box(375, 375)),
+  Box(Box(376, 376), Box(376, 376)),
+  Box(Box(377, 377), Box(377, 377)),
+  Box(Box(378, 378), Box(378, 378)),
+  Box(Box(379, 379), Box(379, 379)),
+  Box(Box(380, 380), Box(380, 380)),
+  Box(Box(381, 381), Box(381, 381)),
+  Box(Box(382, 382), Box(382, 382)),
+  Box(Box(383, 383), Box(383, 383)),
+  Box(Box(384, 384), Box(384, 384)),
+  Box(Box(385, 385), Box(385, 385)),
+  Box(Box(386, 386), Box(386, 386)),
+  Box(Box(387, 387), Box(387, 387)),
+  Box(Box(388, 388), Box(388, 388)),
+  Box(Box(389, 389), Box(389, 389)),
+  Box(Box(390, 390), Box(390, 390)),
+  Box(Box(391, 391), Box(391, 391)),
+  Box(Box(392, 392), Box(392, 392)),
+  Box(Box(393, 393), Box(393, 393)),
+  Box(Box(394, 394), Box(394, 394)),
+  Box(Box(395, 395), Box(395, 395)),
+  Box(Box(396, 396), Box(396, 396)),
+  Box(Box(397, 397), Box(397, 397)),
+  Box(Box(398, 398), Box(398, 398)),
+  Box(Box(399, 399), Box(399, 399)),
+  Box(Box(400, 400), Box(400, 400)),
+  Box(Box(401, 401), Box(401, 401)),
+  Box(Box(402, 402), Box(402, 402)),
+  Box(Box(403, 403), Box(403, 403)),
+  Box(Box(404, 404), Box(404, 404)),
+  Box(Box(405, 405), Box(405, 405)),
+  Box(Box(406, 406), Box(406, 406)),
+  Box(Box(407, 407), Box(407, 407)),
+  Box(Box(408, 408), Box(408, 408)),
+  Box(Box(409, 409), Box(409, 409)),
+  Box(Box(410, 410), Box(410, 410)),
+  Box(Box(411, 411), Box(411, 411)),
+  Box(Box(412, 412), Box(412, 412)),
+  Box(Box(413, 413), Box(413, 413)),
+  Box(Box(414, 414), Box(414, 414)),
+  Box(Box(415, 415), Box(415, 415)),
+  Box(Box(416, 416), Box(416, 416)),
+  Box(Box(417, 417), Box(417, 417)),
+  Box(Box(418, 418), Box(418, 418)),
+  Box(Box(419, 419), Box(419, 419)),
+  Box(Box(420, 420), Box(420, 420)),
+  Box(Box(421, 421), Box(421, 421)),
+  Box(Box(422, 422), Box(422, 422)),
+  Box(Box(423, 423), Box(423, 423)),
+  Box(Box(424, 424), Box(424, 424)),
+  Box(Box(425, 425), Box(425, 425)),
+  Box(Box(426, 426), Box(426, 426)),
+  Box(Box(427, 427), Box(427, 427)),
+  Box(Box(428, 428), Box(428, 428)),
+  Box(Box(429, 429), Box(429, 429)),
+  Box(Box(430, 430), Box(430, 430)),
+  Box(Box(431, 431), Box(431, 431)),
+  Box(Box(432, 432), Box(432, 432)),
+  Box(Box(433, 433), Box(433, 433)),
+  Box(Box(434, 434), Box(434, 434)),
+  Box(Box(435, 435), Box(435, 435)),
+  Box(Box(436, 436), Box(436, 436)),
+  Box(Box(437, 437), Box(437, 437)),
+  Box(Box(438, 438), Box(438, 438)),
+  Box(Box(439, 439), Box(439, 439)),
+  Box(Box(440, 440), Box(440, 440)),
+  Box(Box(441, 441), Box(441, 441)),
+  Box(Box(442, 442), Box(442, 442)),
+  Box(Box(443, 443), Box(443, 443)),
+  Box(Box(444, 444), Box(444, 444)),
+  Box(Box(445, 445), Box(445, 445)),
+  Box(Box(446, 446), Box(446, 446)),
+  Box(Box(447, 447), Box(447, 447)),
+  Box(Box(448, 448), Box(448, 448)),
+  Box(Box(449, 449), Box(449, 449)),
+  Box(Box(450, 450), Box(450, 450)),
+  Box(Box(451, 451), Box(451, 451)),
+  Box(Box(452, 452), Box(452, 452)),
+  Box(Box(453, 453), Box(453, 453)),
+  Box(Box(454, 454), Box(454, 454)),
+  Box(Box(455, 455), Box(455, 455)),
+  Box(Box(456, 456), Box(456, 456)),
+  Box(Box(457, 457), Box(457, 457)),
+  Box(Box(458, 458), Box(458, 458)),
+  Box(Box(459, 459), Box(459, 459)),
+  Box(Box(460, 460), Box(460, 460)),
+  Box(Box(461, 461), Box(461, 461)),
+  Box(Box(462, 462), Box(462, 462)),
+  Box(Box(463, 463), Box(463, 463)),
+  Box(Box(464, 464), Box(464, 464)),
+  Box(Box(465, 465), Box(465, 465)),
+  Box(Box(466, 466), Box(466, 466)),
+  Box(Box(467, 467), Box(467, 467)),
+  Box(Box(468, 468), Box(468, 468)),
+  Box(Box(469, 469), Box(469, 469)),
+  Box(Box(470, 470), Box(470, 470)),
+  Box(Box(471, 471), Box(471, 471)),
+  Box(Box(472, 472), Box(472, 472)),
+  Box(Box(473, 473), Box(473, 473)),
+  Box(Box(474, 474), Box(474, 474)),
+  Box(Box(475, 475), Box(475, 475)),
+  Box(Box(476, 476), Box(476, 476)),
+  Box(Box(477, 477), Box(477, 477)),
+  Box(Box(478, 478), Box(478, 478)),
+  Box(Box(479, 479), Box(479, 479)),
+  Box(Box(480, 480), Box(480, 480)),
+  Box(Box(481, 481), Box(481, 481)),
+  Box(Box(482, 482), Box(482, 482)),
+  Box(Box(483, 483), Box(483, 483)),
+  Box(Box(484, 484), Box(484, 484)),
+  Box(Box(485, 485), Box(485, 485)),
+  Box(Box(486, 486), Box(486, 486)),
+  Box(Box(487, 487), Box(487, 487)),
+  Box(Box(488, 488), Box(488, 488)),
+  Box(Box(489, 489), Box(489, 489)),
+  Box(Box(490, 490), Box(490, 490)),
+  Box(Box(491, 491), Box(491, 491)),
+  Box(Box(492, 492), Box(492, 492)),
+  Box(Box(493, 493), Box(493, 493)),
+  Box(Box(494, 494), Box(494, 494)),
+  Box(Box(495, 495), Box(495, 495)),
+  Box(Box(496, 496), Box(496, 496)),
+  Box(Box(497, 497), Box(497, 497)),
+  Box(Box(498, 498), Box(498, 498)),
+  Box(Box(499, 499), Box(499, 499)),
+  Box(Box(500, 500), Box(500, 500)),
+  Box(Box(501, 501), Box(501, 501)),
+  Box(Box(502, 502), Box(502, 502)),
+  Box(Box(503, 503), Box(503, 503)),
+  Box(Box(504, 504), Box(504, 504)),
+  Box(Box(505, 505), Box(505, 505)),
+  Box(Box(506, 506), Box(506, 506)),
+  Box(Box(507, 507), Box(507, 507)),
+  Box(Box(508, 508), Box(508, 508)),
+  Box(Box(509, 509), Box(509, 509)),
+  Box(Box(510, 510), Box(510, 510)),
+  Box(Box(511, 511), Box(511, 511)),
+  Box(Box(512, 512), Box(512, 512)),
+  Box(Box(513, 513), Box(513, 513)),
+  Box(Box(514, 514), Box(514, 514)),
+  Box(Box(515, 515), Box(515, 515)),
+  Box(Box(516, 516), Box(516, 516)),
+  Box(Box(517, 517), Box(517, 517)),
+  Box(Box(518, 518), Box(518, 518)),
+  Box(Box(519, 519), Box(519, 519)),
+  Box(Box(520, 520), Box(520, 520)),
+  Box(Box(521, 521), Box(521, 521)),
+  Box(Box(522, 522), Box(522, 522)),
+  Box(Box(523, 523), Box(523, 523)),
+  Box(Box(524, 524), Box(524, 524)),
+  Box(Box(525, 525), Box(525, 525)),
+  Box(Box(526, 526), Box(526, 526)),
+  Box(Box(527, 527), Box(527, 527)),
+  Box(Box(528, 528), Box(528, 528)),
+  Box(Box(529, 529), Box(529, 529)),
+  Box(Box(530, 530), Box(530, 530)),
+  Box(Box(531, 531), Box(531, 531)),
+  Box(Box(532, 532), Box(532, 532)),
+  Box(Box(533, 533), Box(533, 533)),
+  Box(Box(534, 534), Box(534, 534)),
+  Box(Box(535, 535), Box(535, 535)),
+  Box(Box(536, 536), Box(536, 536)),
+  Box(Box(537, 537), Box(537, 537)),
+  Box(Box(538, 538), Box(538, 538)),
+  Box(Box(539, 539), Box(539, 539)),
+  Box(Box(540, 540), Box(540, 540)),
+  Box(Box(541, 541), Box(541, 541)),
+  Box(Box(542, 542), Box(542, 542)),
+  Box(Box(543, 543), Box(543, 543)),
+  Box(Box(544, 544), Box(544, 544)),
+  Box(Box(545, 545), Box(545, 545)),
+  Box(Box(546, 546), Box(546, 546)),
+  Box(Box(547, 547), Box(547, 547)),
+  Box(Box(548, 548), Box(548, 548)),
+  Box(Box(549, 549), Box(549, 549)),
+  Box(Box(550, 550), Box(550, 550)),
+  Box(Box(551, 551), Box(551, 551)),
+  Box(Box(552, 552), Box(552, 552)),
+  Box(Box(553, 553), Box(553, 553)),
+  Box(Box(554, 554), Box(554, 554)),
+  Box(Box(555, 555), Box(555, 555)),
+  Box(Box(556, 556), Box(556, 556)),
+  Box(Box(557, 557), Box(557, 557)),
+  Box(Box(558, 558), Box(558, 558)),
+  Box(Box(559, 559), Box(559, 559)),
+  Box(Box(560, 560), Box(560, 560)),
+  Box(Box(561, 561), Box(561, 561)),
+  Box(Box(562, 562), Box(562, 562)),
+  Box(Box(563, 563), Box(563, 563)),
+  Box(Box(564, 564), Box(564, 564)),
+  Box(Box(565, 565), Box(565, 565)),
+  Box(Box(566, 566), Box(566, 566)),
+  Box(Box(567, 567), Box(567, 567)),
+  Box(Box(568, 568), Box(568, 568)),
+  Box(Box(569, 569), Box(569, 569)),
+  Box(Box(570, 570), Box(570, 570)),
+  Box(Box(571, 571), Box(571, 571)),
+  Box(Box(572, 572), Box(572, 572)),
+  Box(Box(573, 573), Box(573, 573)),
+  Box(Box(574, 574), Box(574, 574)),
+  Box(Box(575, 575), Box(575, 575)),
+  Box(Box(576, 576), Box(576, 576)),
+  Box(Box(577, 577), Box(577, 577)),
+  Box(Box(578, 578), Box(578, 578)),
+  Box(Box(579, 579), Box(579, 579)),
+  Box(Box(580, 580), Box(580, 580)),
+  Box(Box(581, 581), Box(581, 581)),
+  Box(Box(582, 582), Box(582, 582)),
+  Box(Box(583, 583), Box(583, 583)),
+  Box(Box(584, 584), Box(584, 584)),
+  Box(Box(585, 585), Box(585, 585)),
+  Box(Box(586, 586), Box(586, 586)),
+  Box(Box(587, 587), Box(587, 587)),
+  Box(Box(588, 588), Box(588, 588)),
+  Box(Box(589, 589), Box(589, 589)),
+  Box(Box(590, 590), Box(590, 590)),
+  Box(Box(591, 591), Box(591, 591)),
+  Box(Box(592, 592), Box(592, 592)),
+  Box(Box(593, 593), Box(593, 593)),
+  Box(Box(594, 594), Box(594, 594)),
+  Box(Box(595, 595), Box(595, 595)),
+  Box(Box(596, 596), Box(596, 596)),
+  Box(Box(597, 597), Box(597, 597)),
+  Box(Box(598, 598), Box(598, 598)),
+  Box(Box(599, 599), Box(599, 599)),
+  Box(Box(600, 600), Box(600, 600)),
+  Box(Box(601, 601), Box(601, 601)),
+  Box(Box(602, 602), Box(602, 602)),
+  Box(Box(603, 603), Box(603, 603)),
+  Box(Box(604, 604), Box(604, 604)),
+  Box(Box(605, 605), Box(605, 605)),
+  Box(Box(606, 606), Box(606, 606)),
+  Box(Box(607, 607), Box(607, 607)),
+  Box(Box(608, 608), Box(608, 608)),
+  Box(Box(609, 609), Box(609, 609)),
+  Box(Box(610, 610), Box(610, 610)),
+  Box(Box(611, 611), Box(611, 611)),
+  Box(Box(612, 612), Box(612, 612)),
+  Box(Box(613, 613), Box(613, 613)),
+  Box(Box(614, 614), Box(614, 614)),
+  Box(Box(615, 615), Box(615, 615)),
+  Box(Box(616, 616), Box(616, 616)),
+  Box(Box(617, 617), Box(617, 617)),
+  Box(Box(618, 618), Box(618, 618)),
+  Box(Box(619, 619), Box(619, 619)),
+  Box(Box(620, 620), Box(620, 620)),
+  Box(Box(621, 621), Box(621, 621)),
+  Box(Box(622, 622), Box(622, 622)),
+  Box(Box(623, 623), Box(623, 623)),
+  Box(Box(624, 624), Box(624, 624)),
+  Box(Box(625, 625), Box(625, 625)),
+  Box(Box(626, 626), Box(626, 626)),
+  Box(Box(627, 627), Box(627, 627)),
+  Box(Box(628, 628), Box(628, 628)),
+  Box(Box(629, 629), Box(629, 629)),
+  Box(Box(630, 630), Box(630, 630)),
+  Box(Box(631, 631), Box(631, 631)),
+  Box(Box(632, 632), Box(632, 632)),
+  Box(Box(633, 633), Box(633, 633)),
+  Box(Box(634, 634), Box(634, 634)),
+  Box(Box(635, 635), Box(635, 635)),
+  Box(Box(636, 636), Box(636, 636)),
+  Box(Box(637, 637), Box(637, 637)),
+  Box(Box(638, 638), Box(638, 638)),
+  Box(Box(639, 639), Box(639, 639)),
+  Box(Box(640, 640), Box(640, 640)),
+  Box(Box(641, 641), Box(641, 641)),
+  Box(Box(642, 642), Box(642, 642)),
+  Box(Box(643, 643), Box(643, 643)),
+  Box(Box(644, 644), Box(644, 644)),
+  Box(Box(645, 645), Box(645, 645)),
+  Box(Box(646, 646), Box(646, 646)),
+  Box(Box(647, 647), Box(647, 647)),
+  Box(Box(648, 648), Box(648, 648)),
+  Box(Box(649, 649), Box(649, 649)),
+  Box(Box(650, 650), Box(650, 650)),
+  Box(Box(651, 651), Box(651, 651)),
+  Box(Box(652, 652), Box(652, 652)),
+  Box(Box(653, 653), Box(653, 653)),
+  Box(Box(654, 654), Box(654, 654)),
+  Box(Box(655, 655), Box(655, 655)),
+  Box(Box(656, 656), Box(656, 656)),
+  Box(Box(657, 657), Box(657, 657)),
+  Box(Box(658, 658), Box(658, 658)),
+  Box(Box(659, 659), Box(659, 659)),
+  Box(Box(660, 660), Box(660, 660)),
+  Box(Box(661, 661), Box(661, 661)),
+  Box(Box(662, 662), Box(662, 662)),
+  Box(Box(663, 663), Box(663, 663)),
+  Box(Box(664, 664), Box(664, 664)),
+  Box(Box(665, 665), Box(665, 665)),
+  Box(Box(666, 666), Box(666, 666)),
+  Box(Box(667, 667), Box(667, 667)),
+  Box(Box(668, 668), Box(668, 668)),
+  Box(Box(669, 669), Box(669, 669)),
+  Box(Box(670, 670), Box(670, 670)),
+  Box(Box(671, 671), Box(671, 671)),
+  Box(Box(672, 672), Box(672, 672)),
+  Box(Box(673, 673), Box(673, 673)),
+  Box(Box(674, 674), Box(674, 674)),
+  Box(Box(675, 675), Box(675, 675)),
+  Box(Box(676, 676), Box(676, 676)),
+  Box(Box(677, 677), Box(677, 677)),
+  Box(Box(678, 678), Box(678, 678)),
+  Box(Box(679, 679), Box(679, 679)),
+  Box(Box(680, 680), Box(680, 680)),
+  Box(Box(681, 681), Box(681, 681)),
+  Box(Box(682, 682), Box(682, 682)),
+  Box(Box(683, 683), Box(683, 683)),
+  Box(Box(684, 684), Box(684, 684)),
+  Box(Box(685, 685), Box(685, 685)),
+  Box(Box(686, 686), Box(686, 686)),
+  Box(Box(687, 687), Box(687, 687)),
+  Box(Box(688, 688), Box(688, 688)),
+  Box(Box(689, 689), Box(689, 689)),
+  Box(Box(690, 690), Box(690, 690)),
+  Box(Box(691, 691), Box(691, 691)),
+  Box(Box(692, 692), Box(692, 692)),
+  Box(Box(693, 693), Box(693, 693)),
+  Box(Box(694, 694), Box(694, 694)),
+  Box(Box(695, 695), Box(695, 695)),
+  Box(Box(696, 696), Box(696, 696)),
+  Box(Box(697, 697), Box(697, 697)),
+  Box(Box(698, 698), Box(698, 698)),
+  Box(Box(699, 699), Box(699, 699)),
+  Box(Box(700, 700), Box(700, 700)),
+  Box(Box(701, 701), Box(701, 701)),
+  Box(Box(702, 702), Box(702, 702)),
+  Box(Box(703, 703), Box(703, 703)),
+  Box(Box(704, 704), Box(704, 704)),
+  Box(Box(705, 705), Box(705, 705)),
+  Box(Box(706, 706), Box(706, 706)),
+  Box(Box(707, 707), Box(707, 707)),
+  Box(Box(708, 708), Box(708, 708)),
+  Box(Box(709, 709), Box(709, 709)),
+  Box(Box(710, 710), Box(710, 710)),
+  Box(Box(711, 711), Box(711, 711)),
+  Box(Box(712, 712), Box(712, 712)),
+  Box(Box(713, 713), Box(713, 713)),
+  Box(Box(714, 714), Box(714, 714)),
+  Box(Box(715, 715), Box(715, 715)),
+  Box(Box(716, 716), Box(716, 716)),
+  Box(Box(717, 717), Box(717, 717)),
+  Box(Box(718, 718), Box(718, 718)),
+  Box(Box(719, 719), Box(719, 719)),
+  Box(Box(720, 720), Box(720, 720)),
+  Box(Box(721, 721), Box(721, 721)),
+  Box(Box(722, 722), Box(722, 722)),
+  Box(Box(723, 723), Box(723, 723)),
+  Box(Box(724, 724), Box(724, 724)),
+  Box(Box(725, 725), Box(725, 725)),
+  Box(Box(726, 726), Box(726, 726)),
+  Box(Box(727, 727), Box(727, 727)),
+  Box(Box(728, 728), Box(728, 728)),
+  Box(Box(729, 729), Box(729, 729)),
+  Box(Box(730, 730), Box(730, 730)),
+  Box(Box(731, 731), Box(731, 731)),
+  Box(Box(732, 732), Box(732, 732)),
+  Box(Box(733, 733), Box(733, 733)),
+  Box(Box(734, 734), Box(734, 734)),
+  Box(Box(735, 735), Box(735, 735)),
+  Box(Box(736, 736), Box(736, 736)),
+  Box(Box(737, 737), Box(737, 737)),
+  Box(Box(738, 738), Box(738, 738)),
+  Box(Box(739, 739), Box(739, 739)),
+  Box(Box(740, 740), Box(740, 740)),
+  Box(Box(741, 741), Box(741, 741)),
+  Box(Box(742, 742), Box(742, 742)),
+  Box(Box(743, 743), Box(743, 743)),
+  Box(Box(744, 744), Box(744, 744)),
+  Box(Box(745, 745), Box(745, 745)),
+  Box(Box(746, 746), Box(746, 746)),
+  Box(Box(747, 747), Box(747, 747)),
+  Box(Box(748, 748), Box(748, 748)),
+  Box(Box(749, 749), Box(749, 749)),
+  Box(Box(750, 750), Box(750, 750)),
+  Box(Box(751, 751), Box(751, 751)),
+  Box(Box(752, 752), Box(752, 752)),
+  Box(Box(753, 753), Box(753, 753)),
+  Box(Box(754, 754), Box(754, 754)),
+  Box(Box(755, 755), Box(755, 755)),
+  Box(Box(756, 756), Box(756, 756)),
+  Box(Box(757, 757), Box(757, 757)),
+  Box(Box(758, 758), Box(758, 758)),
+  Box(Box(759, 759), Box(759, 759)),
+  Box(Box(760, 760), Box(760, 760)),
+  Box(Box(761, 761), Box(761, 761)),
+  Box(Box(762, 762), Box(762, 762)),
+  Box(Box(763, 763), Box(763, 763)),
+  Box(Box(764, 764), Box(764, 764)),
+  Box(Box(765, 765), Box(765, 765)),
+  Box(Box(766, 766), Box(766, 766)),
+  Box(Box(767, 767), Box(767, 767)),
+  Box(Box(768, 768), Box(768, 768)),
+  Box(Box(769, 769), Box(769, 769)),
+  Box(Box(770, 770), Box(770, 770)),
+  Box(Box(771, 771), Box(771, 771)),
+  Box(Box(772, 772), Box(772, 772)),
+  Box(Box(773, 773), Box(773, 773)),
+  Box(Box(774, 774), Box(774, 774)),
+  Box(Box(775, 775), Box(775, 775)),
+  Box(Box(776, 776), Box(776, 776)),
+  Box(Box(777, 777), Box(777, 777)),
+  Box(Box(778, 778), Box(778, 778)),
+  Box(Box(779, 779), Box(779, 779)),
+  Box(Box(780, 780), Box(780, 780)),
+  Box(Box(781, 781), Box(781, 781)),
+  Box(Box(782, 782), Box(782, 782)),
+  Box(Box(783, 783), Box(783, 783)),
+  Box(Box(784, 784), Box(784, 784)),
+  Box(Box(785, 785), Box(785, 785)),
+  Box(Box(786, 786), Box(786, 786)),
+  Box(Box(787, 787), Box(787, 787)),
+  Box(Box(788, 788), Box(788, 788)),
+  Box(Box(789, 789), Box(789, 789)),
+  Box(Box(790, 790), Box(790, 790)),
+  Box(Box(791, 791), Box(791, 791)),
+  Box(Box(792, 792), Box(792, 792)),
+  Box(Box(793, 793), Box(793, 793)),
+  Box(Box(794, 794), Box(794, 794)),
+  Box(Box(795, 795), Box(795, 795)),
+  Box(Box(796, 796), Box(796, 796)),
+  Box(Box(797, 797), Box(797, 797)),
+  Box(Box(798, 798), Box(798, 798)),
+  Box(Box(799, 799), Box(799, 799)),
+  Box(Box(800, 800), Box(800, 800)),
+  Box(Box(801, 801), Box(801, 801)),
+  Box(Box(802, 802), Box(802, 802)),
+  Box(Box(803, 803), Box(803, 803)),
+  Box(Box(804, 804), Box(804, 804)),
+  Box(Box(805, 805), Box(805, 805)),
+  Box(Box(806, 806), Box(806, 806)),
+  Box(Box(807, 807), Box(807, 807)),
+  Box(Box(808, 808), Box(808, 808)),
+  Box(Box(809, 809), Box(809, 809)),
+  Box(Box(810, 810), Box(810, 810)),
+  Box(Box(811, 811), Box(811, 811)),
+  Box(Box(812, 812), Box(812, 812)),
+  Box(Box(813, 813), Box(813, 813)),
+  Box(Box(814, 814), Box(814, 814)),
+  Box(Box(815, 815), Box(815, 815)),
+  Box(Box(816, 816), Box(816, 816)),
+  Box(Box(817, 817), Box(817, 817)),
+  Box(Box(818, 818), Box(818, 818)),
+  Box(Box(819, 819), Box(819, 819)),
+  Box(Box(820, 820), Box(820, 820)),
+  Box(Box(821, 821), Box(821, 821)),
+  Box(Box(822, 822), Box(822, 822)),
+  Box(Box(823, 823), Box(823, 823)),
+  Box(Box(824, 824), Box(824, 824)),
+  Box(Box(825, 825), Box(825, 825)),
+  Box(Box(826, 826), Box(826, 826)),
+  Box(Box(827, 827), Box(827, 827)),
+  Box(Box(828, 828), Box(828, 828)),
+  Box(Box(829, 829), Box(829, 829)),
+  Box(Box(830, 830), Box(830, 830)),
+  Box(Box(831, 831), Box(831, 831)),
+  Box(Box(832, 832), Box(832, 832)),
+  Box(Box(833, 833), Box(833, 833)),
+  Box(Box(834, 834), Box(834, 834)),
+  Box(Box(835, 835), Box(835, 835)),
+  Box(Box(836, 836), Box(836, 836)),
+  Box(Box(837, 837), Box(837, 837)),
+  Box(Box(838, 838), Box(838, 838)),
+  Box(Box(839, 839), Box(839, 839)),
+  Box(Box(840, 840), Box(840, 840)),
+  Box(Box(841, 841), Box(841, 841)),
+  Box(Box(842, 842), Box(842, 842)),
+  Box(Box(843, 843), Box(843, 843)),
+  Box(Box(844, 844), Box(844, 844)),
+  Box(Box(845, 845), Box(845, 845)),
+  Box(Box(846, 846), Box(846, 846)),
+  Box(Box(847, 847), Box(847, 847)),
+  Box(Box(848, 848), Box(848, 848)),
+  Box(Box(849, 849), Box(849, 849)),
+  Box(Box(850, 850), Box(850, 850)),
+  Box(Box(851, 851), Box(851, 851)),
+  Box(Box(852, 852), Box(852, 852)),
+  Box(Box(853, 853), Box(853, 853)),
+  Box(Box(854, 854), Box(854, 854)),
+  Box(Box(855, 855), Box(855, 855)),
+  Box(Box(856, 856), Box(856, 856)),
+  Box(Box(857, 857), Box(857, 857)),
+  Box(Box(858, 858), Box(858, 858)),
+  Box(Box(859, 859), Box(859, 859)),
+  Box(Box(860, 860), Box(860, 860)),
+  Box(Box(861, 861), Box(861, 861)),
+  Box(Box(862, 862), Box(862, 862)),
+  Box(Box(863, 863), Box(863, 863)),
+  Box(Box(864, 864), Box(864, 864)),
+  Box(Box(865, 865), Box(865, 865)),
+  Box(Box(866, 866), Box(866, 866)),
+  Box(Box(867, 867), Box(867, 867)),
+  Box(Box(868, 868), Box(868, 868)),
+  Box(Box(869, 869), Box(869, 869)),
+  Box(Box(870, 870), Box(870, 870)),
+  Box(Box(871, 871), Box(871, 871)),
+  Box(Box(872, 872), Box(872, 872)),
+  Box(Box(873, 873), Box(873, 873)),
+  Box(Box(874, 874), Box(874, 874)),
+  Box(Box(875, 875), Box(875, 875)),
+  Box(Box(876, 876), Box(876, 876)),
+  Box(Box(877, 877), Box(877, 877)),
+  Box(Box(878, 878), Box(878, 878)),
+  Box(Box(879, 879), Box(879, 879)),
+  Box(Box(880, 880), Box(880, 880)),
+  Box(Box(881, 881), Box(881, 881)),
+  Box(Box(882, 882), Box(882, 882)),
+  Box(Box(883, 883), Box(883, 883)),
+  Box(Box(884, 884), Box(884, 884)),
+  Box(Box(885, 885), Box(885, 885)),
+  Box(Box(886, 886), Box(886, 886)),
+  Box(Box(887, 887), Box(887, 887)),
+  Box(Box(888, 888), Box(888, 888)),
+  Box(Box(889, 889), Box(889, 889)),
+  Box(Box(890, 890), Box(890, 890)),
+  Box(Box(891, 891), Box(891, 891)),
+  Box(Box(892, 892), Box(892, 892)),
+  Box(Box(893, 893), Box(893, 893)),
+  Box(Box(894, 894), Box(894, 894)),
+  Box(Box(895, 895), Box(895, 895)),
+  Box(Box(896, 896), Box(896, 896)),
+  Box(Box(897, 897), Box(897, 897)),
+  Box(Box(898, 898), Box(898, 898)),
+  Box(Box(899, 899), Box(899, 899)),
+  Box(Box(900, 900), Box(900, 900)),
+  Box(Box(901, 901), Box(901, 901)),
+  Box(Box(902, 902), Box(902, 902)),
+  Box(Box(903, 903), Box(903, 903)),
+  Box(Box(904, 904), Box(904, 904)),
+  Box(Box(905, 905), Box(905, 905)),
+  Box(Box(906, 906), Box(906, 906)),
+  Box(Box(907, 907), Box(907, 907)),
+  Box(Box(908, 908), Box(908, 908)),
+  Box(Box(909, 909), Box(909, 909)),
+  Box(Box(910, 910), Box(910, 910)),
+  Box(Box(911, 911), Box(911, 911)),
+  Box(Box(912, 912), Box(912, 912)),
+  Box(Box(913, 913), Box(913, 913)),
+  Box(Box(914, 914), Box(914, 914)),
+  Box(Box(915, 915), Box(915, 915)),
+  Box(Box(916, 916), Box(916, 916)),
+  Box(Box(917, 917), Box(917, 917)),
+  Box(Box(918, 918), Box(918, 918)),
+  Box(Box(919, 919), Box(919, 919)),
+  Box(Box(920, 920), Box(920, 920)),
+  Box(Box(921, 921), Box(921, 921)),
+  Box(Box(922, 922), Box(922, 922)),
+  Box(Box(923, 923), Box(923, 923)),
+  Box(Box(924, 924), Box(924, 924)),
+  Box(Box(925, 925), Box(925, 925)),
+  Box(Box(926, 926), Box(926, 926)),
+  Box(Box(927, 927), Box(927, 927)),
+  Box(Box(928, 928), Box(928, 928)),
+  Box(Box(929, 929), Box(929, 929)),
+  Box(Box(930, 930), Box(930, 930)),
+  Box(Box(931, 931), Box(931, 931)),
+  Box(Box(932, 932), Box(932, 932)),
+  Box(Box(933, 933), Box(933, 933)),
+  Box(Box(934, 934), Box(934, 934)),
+  Box(Box(935, 935), Box(935, 935)),
+  Box(Box(936, 936), Box(936, 936)),
+  Box(Box(937, 937), Box(937, 937)),
+  Box(Box(938, 938), Box(938, 938)),
+  Box(Box(939, 939), Box(939, 939)),
+  Box(Box(940, 940), Box(940, 940)),
+  Box(Box(941, 941), Box(941, 941)),
+  Box(Box(942, 942), Box(942, 942)),
+  Box(Box(943, 943), Box(943, 943)),
+  Box(Box(944, 944), Box(944, 944)),
+  Box(Box(945, 945), Box(945, 945)),
+  Box(Box(946, 946), Box(946, 946)),
+  Box(Box(947, 947), Box(947, 947)),
+  Box(Box(948, 948), Box(948, 948)),
+  Box(Box(949, 949), Box(949, 949)),
+  Box(Box(950, 950), Box(950, 950)),
+  Box(Box(951, 951), Box(951, 951)),
+  Box(Box(952, 952), Box(952, 952)),
+  Box(Box(953, 953), Box(953, 953)),
+  Box(Box(954, 954), Box(954, 954)),
+  Box(Box(955, 955), Box(955, 955)),
+  Box(Box(956, 956), Box(956, 956)),
+  Box(Box(957, 957), Box(957, 957)),
+  Box(Box(958, 958), Box(958, 958)),
+  Box(Box(959, 959), Box(959, 959)),
+  Box(Box(960, 960), Box(960, 960)),
+  Box(Box(961, 961), Box(961, 961)),
+  Box(Box(962, 962), Box(962, 962)),
+  Box(Box(963, 963), Box(963, 963)),
+  Box(Box(964, 964), Box(964, 964)),
+  Box(Box(965, 965), Box(965, 965)),
+  Box(Box(966, 966), Box(966, 966)),
+  Box(Box(967, 967), Box(967, 967)),
+  Box(Box(968, 968), Box(968, 968)),
+  Box(Box(969, 969), Box(969, 969)),
+  Box(Box(970, 970), Box(970, 970)),
+  Box(Box(971, 971), Box(971, 971)),
+  Box(Box(972, 972), Box(972, 972)),
+  Box(Box(973, 973), Box(973, 973)),
+  Box(Box(974, 974), Box(974, 974)),
+  Box(Box(975, 975), Box(975, 975)),
+  Box(Box(976, 976), Box(976, 976)),
+  Box(Box(977, 977), Box(977, 977)),
+  Box(Box(978, 978), Box(978, 978)),
+  Box(Box(979, 979), Box(979, 979)),
+  Box(Box(980, 980), Box(980, 980)),
+  Box(Box(981, 981), Box(981, 981)),
+  Box(Box(982, 982), Box(982, 982)),
+  Box(Box(983, 983), Box(983, 983)),
+  Box(Box(984, 984), Box(984, 984)),
+  Box(Box(985, 985), Box(985, 985)),
+  Box(Box(986, 986), Box(986, 986)),
+  Box(Box(987, 987), Box(987, 987)),
+  Box(Box(988, 988), Box(988, 988)),
+  Box(Box(989, 989), Box(989, 989)),
+  Box(Box(990, 990), Box(990, 990)),
+  Box(Box(991, 991), Box(991, 991)),
+  Box(Box(992, 992), Box(992, 992)),
+  Box(Box(993, 993), Box(993, 993)),
+  Box(Box(994, 994), Box(994, 994)),
+  Box(Box(995, 995), Box(995, 995)),
+  Box(Box(996, 996), Box(996, 996)),
+  Box(Box(997, 997), Box(997, 997)),
+  Box(Box(998, 998), Box(998, 998)),
+  Box(Box(999, 999), Box(999, 999)),
+  Box(Box(1000, 1000), Box(1000, 1000)),
+  Box(Box(1001, 1001), Box(1001, 1001)),
+  Box(Box(1002, 1002), Box(1002, 1002)),
+  Box(Box(1003, 1003), Box(1003, 1003)),
+  Box(Box(1004, 1004), Box(1004, 1004)),
+  Box(Box(1005, 1005), Box(1005, 1005)),
+  Box(Box(1006, 1006), Box(1006, 1006)),
+  Box(Box(1007, 1007), Box(1007, 1007)),
+  Box(Box(1008, 1008), Box(1008, 1008)),
+  Box(Box(1009, 1009), Box(1009, 1009)),
+  Box(Box(1010, 1010), Box(1010, 1010)),
+  Box(Box(1011, 1011), Box(1011, 1011)),
+  Box(Box(1012, 1012), Box(1012, 1012)),
+  Box(Box(1013, 1013), Box(1013, 1013)),
+  Box(Box(1014, 1014), Box(1014, 1014)),
+  Box(Box(1015, 1015), Box(1015, 1015)),
+  Box(Box(1016, 1016), Box(1016, 1016)),
+  Box(Box(1017, 1017), Box(1017, 1017)),
+  Box(Box(1018, 1018), Box(1018, 1018)),
+  Box(Box(1019, 1019), Box(1019, 1019)),
+  Box(Box(1020, 1020), Box(1020, 1020)),
+  Box(Box(1021, 1021), Box(1021, 1021)),
+  Box(Box(1022, 1022), Box(1022, 1022)),
+  Box(Box(1023, 1023), Box(1023, 1023)),
+  Box(Box(1024, 1024), Box(1024, 1024)),
+  Box(Box(1025, 1025), Box(1025, 1025)),
+  Box(Box(1026, 1026), Box(1026, 1026)),
+  Box(Box(1027, 1027), Box(1027, 1027)),
+  Box(Box(1028, 1028), Box(1028, 1028)),
+  Box(Box(1029, 1029), Box(1029, 1029)),
+  Box(Box(1030, 1030), Box(1030, 1030)),
+  Box(Box(1031, 1031), Box(1031, 1031)),
+  Box(Box(1032, 1032), Box(1032, 1032)),
+  Box(Box(1033, 1033), Box(1033, 1033)),
+  Box(Box(1034, 1034), Box(1034, 1034)),
+  Box(Box(1035, 1035), Box(1035, 1035)),
+  Box(Box(1036, 1036), Box(1036, 1036)),
+  Box(Box(1037, 1037), Box(1037, 1037)),
+  Box(Box(1038, 1038), Box(1038, 1038)),
+  Box(Box(1039, 1039), Box(1039, 1039)),
+  Box(Box(1040, 1040), Box(1040, 1040)),
+  Box(Box(1041, 1041), Box(1041, 1041)),
+  Box(Box(1042, 1042), Box(1042, 1042)),
+  Box(Box(1043, 1043), Box(1043, 1043)),
+  Box(Box(1044, 1044), Box(1044, 1044)),
+  Box(Box(1045, 1045), Box(1045, 1045)),
+  Box(Box(1046, 1046), Box(1046, 1046)),
+  Box(Box(1047, 1047), Box(1047, 1047)),
+  Box(Box(1048, 1048), Box(1048, 1048)),
+  Box(Box(1049, 1049), Box(1049, 1049)),
+  Box(Box(1050, 1050), Box(1050, 1050)),
+  Box(Box(1051, 1051), Box(1051, 1051)),
+  Box(Box(1052, 1052), Box(1052, 1052)),
+  Box(Box(1053, 1053), Box(1053, 1053)),
+  Box(Box(1054, 1054), Box(1054, 1054)),
+  Box(Box(1055, 1055), Box(1055, 1055)),
+  Box(Box(1056, 1056), Box(1056, 1056)),
+  Box(Box(1057, 1057), Box(1057, 1057)),
+  Box(Box(1058, 1058), Box(1058, 1058)),
+  Box(Box(1059, 1059), Box(1059, 1059)),
+  Box(Box(1060, 1060), Box(1060, 1060)),
+  Box(Box(1061, 1061), Box(1061, 1061)),
+  Box(Box(1062, 1062), Box(1062, 1062)),
+  Box(Box(1063, 1063), Box(1063, 1063)),
+  Box(Box(1064, 1064), Box(1064, 1064)),
+  Box(Box(1065, 1065), Box(1065, 1065)),
+  Box(Box(1066, 1066), Box(1066, 1066)),
+  Box(Box(1067, 1067), Box(1067, 1067)),
+  Box(Box(1068, 1068), Box(1068, 1068)),
+  Box(Box(1069, 1069), Box(1069, 1069)),
+  Box(Box(1070, 1070), Box(1070, 1070)),
+  Box(Box(1071, 1071), Box(1071, 1071)),
+  Box(Box(1072, 1072), Box(1072, 1072)),
+  Box(Box(1073, 1073), Box(1073, 1073)),
+  Box(Box(1074, 1074), Box(1074, 1074)),
+  Box(Box(1075, 1075), Box(1075, 1075)),
+  Box(Box(1076, 1076), Box(1076, 1076)),
+  Box(Box(1077, 1077), Box(1077, 1077)),
+  Box(Box(1078, 1078), Box(1078, 1078)),
+  Box(Box(1079, 1079), Box(1079, 1079)),
+  Box(Box(1080, 1080), Box(1080, 1080)),
+  Box(Box(1081, 1081), Box(1081, 1081)),
+  Box(Box(1082, 1082), Box(1082, 1082)),
+  Box(Box(1083, 1083), Box(1083, 1083)),
+  Box(Box(1084, 1084), Box(1084, 1084)),
+  Box(Box(1085, 1085), Box(1085, 1085)),
+  Box(Box(1086, 1086), Box(1086, 1086)),
+  Box(Box(1087, 1087), Box(1087, 1087)),
+  Box(Box(1088, 1088), Box(1088, 1088)),
+  Box(Box(1089, 1089), Box(1089, 1089)),
+  Box(Box(1090, 1090), Box(1090, 1090)),
+  Box(Box(1091, 1091), Box(1091, 1091)),
+  Box(Box(1092, 1092), Box(1092, 1092)),
+  Box(Box(1093, 1093), Box(1093, 1093)),
+  Box(Box(1094, 1094), Box(1094, 1094)),
+  Box(Box(1095, 1095), Box(1095, 1095)),
+  Box(Box(1096, 1096), Box(1096, 1096)),
+  Box(Box(1097, 1097), Box(1097, 1097)),
+  Box(Box(1098, 1098), Box(1098, 1098)),
+  Box(Box(1099, 1099), Box(1099, 1099)),
+  Box(Box(1100, 1100), Box(1100, 1100)),
+  Box(Box(1101, 1101), Box(1101, 1101)),
+  Box(Box(1102, 1102), Box(1102, 1102)),
+  Box(Box(1103, 1103), Box(1103, 1103)),
+  Box(Box(1104, 1104), Box(1104, 1104)),
+  Box(Box(1105, 1105), Box(1105, 1105)),
+  Box(Box(1106, 1106), Box(1106, 1106)),
+  Box(Box(1107, 1107), Box(1107, 1107)),
+  Box(Box(1108, 1108), Box(1108, 1108)),
+  Box(Box(1109, 1109), Box(1109, 1109)),
+  Box(Box(1110, 1110), Box(1110, 1110)),
+  Box(Box(1111, 1111), Box(1111, 1111)),
+  Box(Box(1112, 1112), Box(1112, 1112)),
+  Box(Box(1113, 1113), Box(1113, 1113)),
+  Box(Box(1114, 1114), Box(1114, 1114)),
+  Box(Box(1115, 1115), Box(1115, 1115)),
+  Box(Box(1116, 1116), Box(1116, 1116)),
+  Box(Box(1117, 1117), Box(1117, 1117)),
+  Box(Box(1118, 1118), Box(1118, 1118)),
+  Box(Box(1119, 1119), Box(1119, 1119)),
+  Box(Box(1120, 1120), Box(1120, 1120)),
+  Box(Box(1121, 1121), Box(1121, 1121)),
+  Box(Box(1122, 1122), Box(1122, 1122)),
+  Box(Box(1123, 1123), Box(1123, 1123)),
+  Box(Box(1124, 1124), Box(1124, 1124)),
+  Box(Box(1125, 1125), Box(1125, 1125)),
+  Box(Box(1126, 1126), Box(1126, 1126)),
+  Box(Box(1127, 1127), Box(1127, 1127)),
+  Box(Box(1128, 1128), Box(1128, 1128)),
+  Box(Box(1129, 1129), Box(1129, 1129)),
+  Box(Box(1130, 1130), Box(1130, 1130)),
+  Box(Box(1131, 1131), Box(1131, 1131)),
+  Box(Box(1132, 1132), Box(1132, 1132)),
+  Box(Box(1133, 1133), Box(1133, 1133)),
+  Box(Box(1134, 1134), Box(1134, 1134)),
+  Box(Box(1135, 1135), Box(1135, 1135)),
+  Box(Box(1136, 1136), Box(1136, 1136)),
+  Box(Box(1137, 1137), Box(1137, 1137)),
+  Box(Box(1138, 1138), Box(1138, 1138)),
+  Box(Box(1139, 1139), Box(1139, 1139)),
+  Box(Box(1140, 1140), Box(1140, 1140)),
+  Box(Box(1141, 1141), Box(1141, 1141)),
+  Box(Box(1142, 1142), Box(1142, 1142)),
+  Box(Box(1143, 1143), Box(1143, 1143)),
+  Box(Box(1144, 1144), Box(1144, 1144)),
+  Box(Box(1145, 1145), Box(1145, 1145)),
+  Box(Box(1146, 1146), Box(1146, 1146)),
+  Box(Box(1147, 1147), Box(1147, 1147)),
+  Box(Box(1148, 1148), Box(1148, 1148)),
+  Box(Box(1149, 1149), Box(1149, 1149)),
+  Box(Box(1150, 1150), Box(1150, 1150)),
+  Box(Box(1151, 1151), Box(1151, 1151)),
+  Box(Box(1152, 1152), Box(1152, 1152)),
+  Box(Box(1153, 1153), Box(1153, 1153)),
+  Box(Box(1154, 1154), Box(1154, 1154)),
+  Box(Box(1155, 1155), Box(1155, 1155)),
+  Box(Box(1156, 1156), Box(1156, 1156)),
+  Box(Box(1157, 1157), Box(1157, 1157)),
+  Box(Box(1158, 1158), Box(1158, 1158)),
+  Box(Box(1159, 1159), Box(1159, 1159)),
+  Box(Box(1160, 1160), Box(1160, 1160)),
+  Box(Box(1161, 1161), Box(1161, 1161)),
+  Box(Box(1162, 1162), Box(1162, 1162)),
+  Box(Box(1163, 1163), Box(1163, 1163)),
+  Box(Box(1164, 1164), Box(1164, 1164)),
+  Box(Box(1165, 1165), Box(1165, 1165)),
+  Box(Box(1166, 1166), Box(1166, 1166)),
+  Box(Box(1167, 1167), Box(1167, 1167)),
+  Box(Box(1168, 1168), Box(1168, 1168)),
+  Box(Box(1169, 1169), Box(1169, 1169)),
+  Box(Box(1170, 1170), Box(1170, 1170)),
+  Box(Box(1171, 1171), Box(1171, 1171)),
+  Box(Box(1172, 1172), Box(1172, 1172)),
+  Box(Box(1173, 1173), Box(1173, 1173)),
+  Box(Box(1174, 1174), Box(1174, 1174)),
+  Box(Box(1175, 1175), Box(1175, 1175)),
+  Box(Box(1176, 1176), Box(1176, 1176)),
+  Box(Box(1177, 1177), Box(1177, 1177)),
+  Box(Box(1178, 1178), Box(1178, 1178)),
+  Box(Box(1179, 1179), Box(1179, 1179)),
+  Box(Box(1180, 1180), Box(1180, 1180)),
+  Box(Box(1181, 1181), Box(1181, 1181)),
+  Box(Box(1182, 1182), Box(1182, 1182)),
+  Box(Box(1183, 1183), Box(1183, 1183)),
+  Box(Box(1184, 1184), Box(1184, 1184)),
+  Box(Box(1185, 1185), Box(1185, 1185)),
+  Box(Box(1186, 1186), Box(1186, 1186)),
+  Box(Box(1187, 1187), Box(1187, 1187)),
+  Box(Box(1188, 1188), Box(1188, 1188)),
+  Box(Box(1189, 1189), Box(1189, 1189)),
+  Box(Box(1190, 1190), Box(1190, 1190)),
+  Box(Box(1191, 1191), Box(1191, 1191)),
+  Box(Box(1192, 1192), Box(1192, 1192)),
+  Box(Box(1193, 1193), Box(1193, 1193)),
+  Box(Box(1194, 1194), Box(1194, 1194)),
+  Box(Box(1195, 1195), Box(1195, 1195)),
+  Box(Box(1196, 1196), Box(1196, 1196)),
+  Box(Box(1197, 1197), Box(1197, 1197)),
+  Box(Box(1198, 1198), Box(1198, 1198)),
+  Box(Box(1199, 1199), Box(1199, 1199)),
+  Box(Box(1200, 1200), Box(1200, 1200)),
+  Box(Box(1201, 1201), Box(1201, 1201)),
+  Box(Box(1202, 1202), Box(1202, 1202)),
+  Box(Box(1203, 1203), Box(1203, 1203)),
+  Box(Box(1204, 1204), Box(1204, 1204)),
+  Box(Box(1205, 1205), Box(1205, 1205)),
+  Box(Box(1206, 1206), Box(1206, 1206)),
+  Box(Box(1207, 1207), Box(1207, 1207)),
+  Box(Box(1208, 1208), Box(1208, 1208)),
+  Box(Box(1209, 1209), Box(1209, 1209)),
+  Box(Box(1210, 1210), Box(1210, 1210)),
+  Box(Box(1211, 1211), Box(1211, 1211)),
+  Box(Box(1212, 1212), Box(1212, 1212)),
+  Box(Box(1213, 1213), Box(1213, 1213)),
+  Box(Box(1214, 1214), Box(1214, 1214)),
+  Box(Box(1215, 1215), Box(1215, 1215)),
+  Box(Box(1216, 1216), Box(1216, 1216)),
+  Box(Box(1217, 1217), Box(1217, 1217)),
+  Box(Box(1218, 1218), Box(1218, 1218)),
+  Box(Box(1219, 1219), Box(1219, 1219)),
+  Box(Box(1220, 1220), Box(1220, 1220)),
+  Box(Box(1221, 1221), Box(1221, 1221)),
+  Box(Box(1222, 1222), Box(1222, 1222)),
+  Box(Box(1223, 1223), Box(1223, 1223)),
+  Box(Box(1224, 1224), Box(1224, 1224)),
+  Box(Box(1225, 1225), Box(1225, 1225)),
+  Box(Box(1226, 1226), Box(1226, 1226)),
+  Box(Box(1227, 1227), Box(1227, 1227)),
+  Box(Box(1228, 1228), Box(1228, 1228)),
+  Box(Box(1229, 1229), Box(1229, 1229)),
+  Box(Box(1230, 1230), Box(1230, 1230)),
+  Box(Box(1231, 1231), Box(1231, 1231)),
+  Box(Box(1232, 1232), Box(1232, 1232)),
+  Box(Box(1233, 1233), Box(1233, 1233)),
+  Box(Box(1234, 1234), Box(1234, 1234)),
+  Box(Box(1235, 1235), Box(1235, 1235)),
+  Box(Box(1236, 1236), Box(1236, 1236)),
+  Box(Box(1237, 1237), Box(1237, 1237)),
+  Box(Box(1238, 1238), Box(1238, 1238)),
+  Box(Box(1239, 1239), Box(1239, 1239)),
+  Box(Box(1240, 1240), Box(1240, 1240)),
+  Box(Box(1241, 1241), Box(1241, 1241)),
+  Box(Box(1242, 1242), Box(1242, 1242)),
+  Box(Box(1243, 1243), Box(1243, 1243)),
+  Box(Box(1244, 1244), Box(1244, 1244)),
+  Box(Box(1245, 1245), Box(1245, 1245)),
+  Box(Box(1246, 1246), Box(1246, 1246)),
+  Box(Box(1247, 1247), Box(1247, 1247)),
+  Box(Box(1248, 1248), Box(1248, 1248)),
+  Box(Box(1249, 1249), Box(1249, 1249)),
+  Box(Box(1250, 1250), Box(1250, 1250)),
+  Box(Box(1251, 1251), Box(1251, 1251)),
+  Box(Box(1252, 1252), Box(1252, 1252)),
+  Box(Box(1253, 1253), Box(1253, 1253)),
+  Box(Box(1254, 1254), Box(1254, 1254)),
+  Box(Box(1255, 1255), Box(1255, 1255)),
+  Box(Box(1256, 1256), Box(1256, 1256)),
+  Box(Box(1257, 1257), Box(1257, 1257)),
+  Box(Box(1258, 1258), Box(1258, 1258)),
+  Box(Box(1259, 1259), Box(1259, 1259)),
+  Box(Box(1260, 1260), Box(1260, 1260)),
+  Box(Box(1261, 1261), Box(1261, 1261)),
+  Box(Box(1262, 1262), Box(1262, 1262)),
+  Box(Box(1263, 1263), Box(1263, 1263)),
+  Box(Box(1264, 1264), Box(1264, 1264)),
+  Box(Box(1265, 1265), Box(1265, 1265)),
+  Box(Box(1266, 1266), Box(1266, 1266)),
+  Box(Box(1267, 1267), Box(1267, 1267)),
+  Box(Box(1268, 1268), Box(1268, 1268)),
+  Box(Box(1269, 1269), Box(1269, 1269)),
+  Box(Box(1270, 1270), Box(1270, 1270)),
+  Box(Box(1271, 1271), Box(1271, 1271)),
+  Box(Box(1272, 1272), Box(1272, 1272)),
+  Box(Box(1273, 1273), Box(1273, 1273)),
+  Box(Box(1274, 1274), Box(1274, 1274)),
+  Box(Box(1275, 1275), Box(1275, 1275)),
+  Box(Box(1276, 1276), Box(1276, 1276)),
+  Box(Box(1277, 1277), Box(1277, 1277)),
+  Box(Box(1278, 1278), Box(1278, 1278)),
+  Box(Box(1279, 1279), Box(1279, 1279)),
+  Box(Box(1280, 1280), Box(1280, 1280)),
+  Box(Box(1281, 1281), Box(1281, 1281)),
+  Box(Box(1282, 1282), Box(1282, 1282)),
+  Box(Box(1283, 1283), Box(1283, 1283)),
+  Box(Box(1284, 1284), Box(1284, 1284)),
+  Box(Box(1285, 1285), Box(1285, 1285)),
+  Box(Box(1286, 1286), Box(1286, 1286)),
+  Box(Box(1287, 1287), Box(1287, 1287)),
+  Box(Box(1288, 1288), Box(1288, 1288)),
+  Box(Box(1289, 1289), Box(1289, 1289)),
+  Box(Box(1290, 1290), Box(1290, 1290)),
+  Box(Box(1291, 1291), Box(1291, 1291)),
+  Box(Box(1292, 1292), Box(1292, 1292)),
+  Box(Box(1293, 1293), Box(1293, 1293)),
+  Box(Box(1294, 1294), Box(1294, 1294)),
+  Box(Box(1295, 1295), Box(1295, 1295)),
+  Box(Box(1296, 1296), Box(1296, 1296)),
+  Box(Box(1297, 1297), Box(1297, 1297)),
+  Box(Box(1298, 1298), Box(1298, 1298)),
+  Box(Box(1299, 1299), Box(1299, 1299)),
+  Box(Box(1300, 1300), Box(1300, 1300)),
+  Box(Box(1301, 1301), Box(1301, 1301)),
+  Box(Box(1302, 1302), Box(1302, 1302)),
+  Box(Box(1303, 1303), Box(1303, 1303)),
+  Box(Box(1304, 1304), Box(1304, 1304)),
+  Box(Box(1305, 1305), Box(1305, 1305)),
+  Box(Box(1306, 1306), Box(1306, 1306)),
+  Box(Box(1307, 1307), Box(1307, 1307)),
+  Box(Box(1308, 1308), Box(1308, 1308)),
+  Box(Box(1309, 1309), Box(1309, 1309)),
+  Box(Box(1310, 1310), Box(1310, 1310)),
+  Box(Box(1311, 1311), Box(1311, 1311)),
+  Box(Box(1312, 1312), Box(1312, 1312)),
+  Box(Box(1313, 1313), Box(1313, 1313)),
+  Box(Box(1314, 1314), Box(1314, 1314)),
+  Box(Box(1315, 1315), Box(1315, 1315)),
+  Box(Box(1316, 1316), Box(1316, 1316)),
+  Box(Box(1317, 1317), Box(1317, 1317)),
+  Box(Box(1318, 1318), Box(1318, 1318)),
+  Box(Box(1319, 1319), Box(1319, 1319)),
+  Box(Box(1320, 1320), Box(1320, 1320)),
+  Box(Box(1321, 1321), Box(1321, 1321)),
+  Box(Box(1322, 1322), Box(1322, 1322)),
+  Box(Box(1323, 1323), Box(1323, 1323)),
+  Box(Box(1324, 1324), Box(1324, 1324)),
+  Box(Box(1325, 1325), Box(1325, 1325)),
+  Box(Box(1326, 1326), Box(1326, 1326)),
+  Box(Box(1327, 1327), Box(1327, 1327)),
+  Box(Box(1328, 1328), Box(1328, 1328)),
+  Box(Box(1329, 1329), Box(1329, 1329)),
+  Box(Box(1330, 1330), Box(1330, 1330)),
+  Box(Box(1331, 1331), Box(1331, 1331)),
+  Box(Box(1332, 1332), Box(1332, 1332)),
+  Box(Box(1333, 1333), Box(1333, 1333)),
+  Box(Box(1334, 1334), Box(1334, 1334)),
+  Box(Box(1335, 1335), Box(1335, 1335)),
+  Box(Box(1336, 1336), Box(1336, 1336)),
+  Box(Box(1337, 1337), Box(1337, 1337)),
+  Box(Box(1338, 1338), Box(1338, 1338)),
+  Box(Box(1339, 1339), Box(1339, 1339)),
+  Box(Box(1340, 1340), Box(1340, 1340)),
+  Box(Box(1341, 1341), Box(1341, 1341)),
+  Box(Box(1342, 1342), Box(1342, 1342)),
+  Box(Box(1343, 1343), Box(1343, 1343)),
+  Box(Box(1344, 1344), Box(1344, 1344)),
+  Box(Box(1345, 1345), Box(1345, 1345)),
+  Box(Box(1346, 1346), Box(1346, 1346)),
+  Box(Box(1347, 1347), Box(1347, 1347)),
+  Box(Box(1348, 1348), Box(1348, 1348)),
+  Box(Box(1349, 1349), Box(1349, 1349)),
+  Box(Box(1350, 1350), Box(1350, 1350)),
+  Box(Box(1351, 1351), Box(1351, 1351)),
+  Box(Box(1352, 1352), Box(1352, 1352)),
+  Box(Box(1353, 1353), Box(1353, 1353)),
+  Box(Box(1354, 1354), Box(1354, 1354)),
+  Box(Box(1355, 1355), Box(1355, 1355)),
+  Box(Box(1356, 1356), Box(1356, 1356)),
+  Box(Box(1357, 1357), Box(1357, 1357)),
+  Box(Box(1358, 1358), Box(1358, 1358)),
+  Box(Box(1359, 1359), Box(1359, 1359)),
+  Box(Box(1360, 1360), Box(1360, 1360)),
+  Box(Box(1361, 1361), Box(1361, 1361)),
+  Box(Box(1362, 1362), Box(1362, 1362)),
+  Box(Box(1363, 1363), Box(1363, 1363)),
+  Box(Box(1364, 1364), Box(1364, 1364)),
+  Box(Box(1365, 1365), Box(1365, 1365)),
+  Box(Box(1366, 1366), Box(1366, 1366)),
+  Box(Box(1367, 1367), Box(1367, 1367)),
+  Box(Box(1368, 1368), Box(1368, 1368)),
+  Box(Box(1369, 1369), Box(1369, 1369)),
+  Box(Box(1370, 1370), Box(1370, 1370)),
+  Box(Box(1371, 1371), Box(1371, 1371)),
+  Box(Box(1372, 1372), Box(1372, 1372)),
+  Box(Box(1373, 1373), Box(1373, 1373)),
+  Box(Box(1374, 1374), Box(1374, 1374)),
+  Box(Box(1375, 1375), Box(1375, 1375)),
+  Box(Box(1376, 1376), Box(1376, 1376)),
+  Box(Box(1377, 1377), Box(1377, 1377)),
+  Box(Box(1378, 1378), Box(1378, 1378)),
+  Box(Box(1379, 1379), Box(1379, 1379)),
+  Box(Box(1380, 1380), Box(1380, 1380)),
+  Box(Box(1381, 1381), Box(1381, 1381)),
+  Box(Box(1382, 1382), Box(1382, 1382)),
+  Box(Box(1383, 1383), Box(1383, 1383)),
+  Box(Box(1384, 1384), Box(1384, 1384)),
+  Box(Box(1385, 1385), Box(1385, 1385)),
+  Box(Box(1386, 1386), Box(1386, 1386)),
+  Box(Box(1387, 1387), Box(1387, 1387)),
+  Box(Box(1388, 1388), Box(1388, 1388)),
+  Box(Box(1389, 1389), Box(1389, 1389)),
+  Box(Box(1390, 1390), Box(1390, 1390)),
+  Box(Box(1391, 1391), Box(1391, 1391)),
+  Box(Box(1392, 1392), Box(1392, 1392)),
+  Box(Box(1393, 1393), Box(1393, 1393)),
+  Box(Box(1394, 1394), Box(1394, 1394)),
+  Box(Box(1395, 1395), Box(1395, 1395)),
+  Box(Box(1396, 1396), Box(1396, 1396)),
+  Box(Box(1397, 1397), Box(1397, 1397)),
+  Box(Box(1398, 1398), Box(1398, 1398)),
+  Box(Box(1399, 1399), Box(1399, 1399)),
+  Box(Box(1400, 1400), Box(1400, 1400)),
+  Box(Box(1401, 1401), Box(1401, 1401)),
+  Box(Box(1402, 1402), Box(1402, 1402)),
+  Box(Box(1403, 1403), Box(1403, 1403)),
+  Box(Box(1404, 1404), Box(1404, 1404)),
+  Box(Box(1405, 1405), Box(1405, 1405)),
+  Box(Box(1406, 1406), Box(1406, 1406)),
+  Box(Box(1407, 1407), Box(1407, 1407)),
+  Box(Box(1408, 1408), Box(1408, 1408)),
+  Box(Box(1409, 1409), Box(1409, 1409)),
+  Box(Box(1410, 1410), Box(1410, 1410)),
+  Box(Box(1411, 1411), Box(1411, 1411)),
+  Box(Box(1412, 1412), Box(1412, 1412)),
+  Box(Box(1413, 1413), Box(1413, 1413)),
+  Box(Box(1414, 1414), Box(1414, 1414)),
+  Box(Box(1415, 1415), Box(1415, 1415)),
+  Box(Box(1416, 1416), Box(1416, 1416)),
+  Box(Box(1417, 1417), Box(1417, 1417)),
+  Box(Box(1418, 1418), Box(1418, 1418)),
+  Box(Box(1419, 1419), Box(1419, 1419)),
+  Box(Box(1420, 1420), Box(1420, 1420)),
+  Box(Box(1421, 1421), Box(1421, 1421)),
+  Box(Box(1422, 1422), Box(1422, 1422)),
+  Box(Box(1423, 1423), Box(1423, 1423)),
+  Box(Box(1424, 1424), Box(1424, 1424)),
+  Box(Box(1425, 1425), Box(1425, 1425)),
+  Box(Box(1426, 1426), Box(1426, 1426)),
+  Box(Box(1427, 1427), Box(1427, 1427)),
+  Box(Box(1428, 1428), Box(1428, 1428)),
+  Box(Box(1429, 1429), Box(1429, 1429)),
+  Box(Box(1430, 1430), Box(1430, 1430)),
+  Box(Box(1431, 1431), Box(1431, 1431)),
+  Box(Box(1432, 1432), Box(1432, 1432)),
+  Box(Box(1433, 1433), Box(1433, 1433)),
+  Box(Box(1434, 1434), Box(1434, 1434)),
+  Box(Box(1435, 1435), Box(1435, 1435)),
+  Box(Box(1436, 1436), Box(1436, 1436)),
+  Box(Box(1437, 1437), Box(1437, 1437)),
+  Box(Box(1438, 1438), Box(1438, 1438)),
+  Box(Box(1439, 1439), Box(1439, 1439)),
+  Box(Box(1440, 1440), Box(1440, 1440)),
+  Box(Box(1441, 1441), Box(1441, 1441)),
+  Box(Box(1442, 1442), Box(1442, 1442)),
+  Box(Box(1443, 1443), Box(1443, 1443)),
+  Box(Box(1444, 1444), Box(1444, 1444)),
+  Box(Box(1445, 1445), Box(1445, 1445)),
+  Box(Box(1446, 1446), Box(1446, 1446)),
+  Box(Box(1447, 1447), Box(1447, 1447)),
+  Box(Box(1448, 1448), Box(1448, 1448)),
+  Box(Box(1449, 1449), Box(1449, 1449)),
+  Box(Box(1450, 1450), Box(1450, 1450)),
+  Box(Box(1451, 1451), Box(1451, 1451)),
+  Box(Box(1452, 1452), Box(1452, 1452)),
+  Box(Box(1453, 1453), Box(1453, 1453)),
+  Box(Box(1454, 1454), Box(1454, 1454)),
+  Box(Box(1455, 1455), Box(1455, 1455)),
+  Box(Box(1456, 1456), Box(1456, 1456)),
+  Box(Box(1457, 1457), Box(1457, 1457)),
+  Box(Box(1458, 1458), Box(1458, 1458)),
+  Box(Box(1459, 1459), Box(1459, 1459)),
+  Box(Box(1460, 1460), Box(1460, 1460)),
+  Box(Box(1461, 1461), Box(1461, 1461)),
+  Box(Box(1462, 1462), Box(1462, 1462)),
+  Box(Box(1463, 1463), Box(1463, 1463)),
+  Box(Box(1464, 1464), Box(1464, 1464)),
+  Box(Box(1465, 1465), Box(1465, 1465)),
+  Box(Box(1466, 1466), Box(1466, 1466)),
+  Box(Box(1467, 1467), Box(1467, 1467)),
+  Box(Box(1468, 1468), Box(1468, 1468)),
+  Box(Box(1469, 1469), Box(1469, 1469)),
+  Box(Box(1470, 1470), Box(1470, 1470)),
+  Box(Box(1471, 1471), Box(1471, 1471)),
+  Box(Box(1472, 1472), Box(1472, 1472)),
+  Box(Box(1473, 1473), Box(1473, 1473)),
+  Box(Box(1474, 1474), Box(1474, 1474)),
+  Box(Box(1475, 1475), Box(1475, 1475)),
+  Box(Box(1476, 1476), Box(1476, 1476)),
+  Box(Box(1477, 1477), Box(1477, 1477)),
+  Box(Box(1478, 1478), Box(1478, 1478)),
+  Box(Box(1479, 1479), Box(1479, 1479)),
+  Box(Box(1480, 1480), Box(1480, 1480)),
+  Box(Box(1481, 1481), Box(1481, 1481)),
+  Box(Box(1482, 1482), Box(1482, 1482)),
+  Box(Box(1483, 1483), Box(1483, 1483)),
+  Box(Box(1484, 1484), Box(1484, 1484)),
+  Box(Box(1485, 1485), Box(1485, 1485)),
+  Box(Box(1486, 1486), Box(1486, 1486)),
+  Box(Box(1487, 1487), Box(1487, 1487)),
+  Box(Box(1488, 1488), Box(1488, 1488)),
+  Box(Box(1489, 1489), Box(1489, 1489)),
+  Box(Box(1490, 1490), Box(1490, 1490)),
+  Box(Box(1491, 1491), Box(1491, 1491)),
+  Box(Box(1492, 1492), Box(1492, 1492)),
+  Box(Box(1493, 1493), Box(1493, 1493)),
+  Box(Box(1494, 1494), Box(1494, 1494)),
+  Box(Box(1495, 1495), Box(1495, 1495)),
+  Box(Box(1496, 1496), Box(1496, 1496)),
+  Box(Box(1497, 1497), Box(1497, 1497)),
+  Box(Box(1498, 1498), Box(1498, 1498)),
+  Box(Box(1499, 1499), Box(1499, 1499)),
+  Box(Box(1500, 1500), Box(1500, 1500)),
+  Box(Box(1501, 1501), Box(1501, 1501)),
+  Box(Box(1502, 1502), Box(1502, 1502)),
+  Box(Box(1503, 1503), Box(1503, 1503)),
+  Box(Box(1504, 1504), Box(1504, 1504)),
+  Box(Box(1505, 1505), Box(1505, 1505)),
+  Box(Box(1506, 1506), Box(1506, 1506)),
+  Box(Box(1507, 1507), Box(1507, 1507)),
+  Box(Box(1508, 1508), Box(1508, 1508)),
+  Box(Box(1509, 1509), Box(1509, 1509)),
+  Box(Box(1510, 1510), Box(1510, 1510)),
+  Box(Box(1511, 1511), Box(1511, 1511)),
+  Box(Box(1512, 1512), Box(1512, 1512)),
+  Box(Box(1513, 1513), Box(1513, 1513)),
+  Box(Box(1514, 1514), Box(1514, 1514)),
+  Box(Box(1515, 1515), Box(1515, 1515)),
+  Box(Box(1516, 1516), Box(1516, 1516)),
+  Box(Box(1517, 1517), Box(1517, 1517)),
+  Box(Box(1518, 1518), Box(1518, 1518)),
+  Box(Box(1519, 1519), Box(1519, 1519)),
+  Box(Box(1520, 1520), Box(1520, 1520)),
+  Box(Box(1521, 1521), Box(1521, 1521)),
+  Box(Box(1522, 1522), Box(1522, 1522)),
+  Box(Box(1523, 1523), Box(1523, 1523)),
+  Box(Box(1524, 1524), Box(1524, 1524)),
+  Box(Box(1525, 1525), Box(1525, 1525)),
+  Box(Box(1526, 1526), Box(1526, 1526)),
+  Box(Box(1527, 1527), Box(1527, 1527)),
+  Box(Box(1528, 1528), Box(1528, 1528)),
+  Box(Box(1529, 1529), Box(1529, 1529)),
+  Box(Box(1530, 1530), Box(1530, 1530)),
+  Box(Box(1531, 1531), Box(1531, 1531)),
+  Box(Box(1532, 1532), Box(1532, 1532)),
+  Box(Box(1533, 1533), Box(1533, 1533)),
+  Box(Box(1534, 1534), Box(1534, 1534)),
+  Box(Box(1535, 1535), Box(1535, 1535)),
+  Box(Box(1536, 1536), Box(1536, 1536)),
+  Box(Box(1537, 1537), Box(1537, 1537)),
+  Box(Box(1538, 1538), Box(1538, 1538)),
+  Box(Box(1539, 1539), Box(1539, 1539)),
+  Box(Box(1540, 1540), Box(1540, 1540)),
+  Box(Box(1541, 1541), Box(1541, 1541)),
+  Box(Box(1542, 1542), Box(1542, 1542)),
+  Box(Box(1543, 1543), Box(1543, 1543)),
+  Box(Box(1544, 1544), Box(1544, 1544)),
+  Box(Box(1545, 1545), Box(1545, 1545)),
+  Box(Box(1546, 1546), Box(1546, 1546)),
+  Box(Box(1547, 1547), Box(1547, 1547)),
+  Box(Box(1548, 1548), Box(1548, 1548)),
+  Box(Box(1549, 1549), Box(1549, 1549)),
+  Box(Box(1550, 1550), Box(1550, 1550)),
+  Box(Box(1551, 1551), Box(1551, 1551)),
+  Box(Box(1552, 1552), Box(1552, 1552)),
+  Box(Box(1553, 1553), Box(1553, 1553)),
+  Box(Box(1554, 1554), Box(1554, 1554)),
+  Box(Box(1555, 1555), Box(1555, 1555)),
+  Box(Box(1556, 1556), Box(1556, 1556)),
+  Box(Box(1557, 1557), Box(1557, 1557)),
+  Box(Box(1558, 1558), Box(1558, 1558)),
+  Box(Box(1559, 1559), Box(1559, 1559)),
+  Box(Box(1560, 1560), Box(1560, 1560)),
+  Box(Box(1561, 1561), Box(1561, 1561)),
+  Box(Box(1562, 1562), Box(1562, 1562)),
+  Box(Box(1563, 1563), Box(1563, 1563)),
+  Box(Box(1564, 1564), Box(1564, 1564)),
+  Box(Box(1565, 1565), Box(1565, 1565)),
+  Box(Box(1566, 1566), Box(1566, 1566)),
+  Box(Box(1567, 1567), Box(1567, 1567)),
+  Box(Box(1568, 1568), Box(1568, 1568)),
+  Box(Box(1569, 1569), Box(1569, 1569)),
+  Box(Box(1570, 1570), Box(1570, 1570)),
+  Box(Box(1571, 1571), Box(1571, 1571)),
+  Box(Box(1572, 1572), Box(1572, 1572)),
+  Box(Box(1573, 1573), Box(1573, 1573)),
+  Box(Box(1574, 1574), Box(1574, 1574)),
+  Box(Box(1575, 1575), Box(1575, 1575)),
+  Box(Box(1576, 1576), Box(1576, 1576)),
+  Box(Box(1577, 1577), Box(1577, 1577)),
+  Box(Box(1578, 1578), Box(1578, 1578)),
+  Box(Box(1579, 1579), Box(1579, 1579)),
+  Box(Box(1580, 1580), Box(1580, 1580)),
+  Box(Box(1581, 1581), Box(1581, 1581)),
+  Box(Box(1582, 1582), Box(1582, 1582)),
+  Box(Box(1583, 1583), Box(1583, 1583)),
+  Box(Box(1584, 1584), Box(1584, 1584)),
+  Box(Box(1585, 1585), Box(1585, 1585)),
+  Box(Box(1586, 1586), Box(1586, 1586)),
+  Box(Box(1587, 1587), Box(1587, 1587)),
+  Box(Box(1588, 1588), Box(1588, 1588)),
+  Box(Box(1589, 1589), Box(1589, 1589)),
+  Box(Box(1590, 1590), Box(1590, 1590)),
+  Box(Box(1591, 1591), Box(1591, 1591)),
+  Box(Box(1592, 1592), Box(1592, 1592)),
+  Box(Box(1593, 1593), Box(1593, 1593)),
+  Box(Box(1594, 1594), Box(1594, 1594)),
+  Box(Box(1595, 1595), Box(1595, 1595)),
+  Box(Box(1596, 1596), Box(1596, 1596)),
+  Box(Box(1597, 1597), Box(1597, 1597)),
+  Box(Box(1598, 1598), Box(1598, 1598)),
+  Box(Box(1599, 1599), Box(1599, 1599)),
+  Box(Box(1600, 1600), Box(1600, 1600)),
+  Box(Box(1601, 1601), Box(1601, 1601)),
+  Box(Box(1602, 1602), Box(1602, 1602)),
+  Box(Box(1603, 1603), Box(1603, 1603)),
+  Box(Box(1604, 1604), Box(1604, 1604)),
+  Box(Box(1605, 1605), Box(1605, 1605)),
+  Box(Box(1606, 1606), Box(1606, 1606)),
+  Box(Box(1607, 1607), Box(1607, 1607)),
+  Box(Box(1608, 1608), Box(1608, 1608)),
+  Box(Box(1609, 1609), Box(1609, 1609)),
+  Box(Box(1610, 1610), Box(1610, 1610)),
+  Box(Box(1611, 1611), Box(1611, 1611)),
+  Box(Box(1612, 1612), Box(1612, 1612)),
+  Box(Box(1613, 1613), Box(1613, 1613)),
+  Box(Box(1614, 1614), Box(1614, 1614)),
+  Box(Box(1615, 1615), Box(1615, 1615)),
+  Box(Box(1616, 1616), Box(1616, 1616)),
+  Box(Box(1617, 1617), Box(1617, 1617)),
+  Box(Box(1618, 1618), Box(1618, 1618)),
+  Box(Box(1619, 1619), Box(1619, 1619)),
+  Box(Box(1620, 1620), Box(1620, 1620)),
+  Box(Box(1621, 1621), Box(1621, 1621)),
+  Box(Box(1622, 1622), Box(1622, 1622)),
+  Box(Box(1623, 1623), Box(1623, 1623)),
+  Box(Box(1624, 1624), Box(1624, 1624)),
+  Box(Box(1625, 1625), Box(1625, 1625)),
+  Box(Box(1626, 1626), Box(1626, 1626)),
+  Box(Box(1627, 1627), Box(1627, 1627)),
+  Box(Box(1628, 1628), Box(1628, 1628)),
+  Box(Box(1629, 1629), Box(1629, 1629)),
+  Box(Box(1630, 1630), Box(1630, 1630)),
+  Box(Box(1631, 1631), Box(1631, 1631)),
+  Box(Box(1632, 1632), Box(1632, 1632)),
+  Box(Box(1633, 1633), Box(1633, 1633)),
+  Box(Box(1634, 1634), Box(1634, 1634)),
+  Box(Box(1635, 1635), Box(1635, 1635)),
+  Box(Box(1636, 1636), Box(1636, 1636)),
+  Box(Box(1637, 1637), Box(1637, 1637)),
+  Box(Box(1638, 1638), Box(1638, 1638)),
+  Box(Box(1639, 1639), Box(1639, 1639)),
+  Box(Box(1640, 1640), Box(1640, 1640)),
+  Box(Box(1641, 1641), Box(1641, 1641)),
+  Box(Box(1642, 1642), Box(1642, 1642)),
+  Box(Box(1643, 1643), Box(1643, 1643)),
+  Box(Box(1644, 1644), Box(1644, 1644)),
+  Box(Box(1645, 1645), Box(1645, 1645)),
+  Box(Box(1646, 1646), Box(1646, 1646)),
+  Box(Box(1647, 1647), Box(1647, 1647)),
+  Box(Box(1648, 1648), Box(1648, 1648)),
+  Box(Box(1649, 1649), Box(1649, 1649)),
+  Box(Box(1650, 1650), Box(1650, 1650)),
+  Box(Box(1651, 1651), Box(1651, 1651)),
+  Box(Box(1652, 1652), Box(1652, 1652)),
+  Box(Box(1653, 1653), Box(1653, 1653)),
+  Box(Box(1654, 1654), Box(1654, 1654)),
+  Box(Box(1655, 1655), Box(1655, 1655)),
+  Box(Box(1656, 1656), Box(1656, 1656)),
+  Box(Box(1657, 1657), Box(1657, 1657)),
+  Box(Box(1658, 1658), Box(1658, 1658)),
+  Box(Box(1659, 1659), Box(1659, 1659)),
+  Box(Box(1660, 1660), Box(1660, 1660)),
+  Box(Box(1661, 1661), Box(1661, 1661)),
+  Box(Box(1662, 1662), Box(1662, 1662)),
+  Box(Box(1663, 1663), Box(1663, 1663)),
+  Box(Box(1664, 1664), Box(1664, 1664)),
+  Box(Box(1665, 1665), Box(1665, 1665)),
+  Box(Box(1666, 1666), Box(1666, 1666)),
+  Box(Box(1667, 1667), Box(1667, 1667)),
+  Box(Box(1668, 1668), Box(1668, 1668)),
+  Box(Box(1669, 1669), Box(1669, 1669)),
+  Box(Box(1670, 1670), Box(1670, 1670)),
+  Box(Box(1671, 1671), Box(1671, 1671)),
+  Box(Box(1672, 1672), Box(1672, 1672)),
+  Box(Box(1673, 1673), Box(1673, 1673)),
+  Box(Box(1674, 1674), Box(1674, 1674)),
+  Box(Box(1675, 1675), Box(1675, 1675)),
+  Box(Box(1676, 1676), Box(1676, 1676)),
+  Box(Box(1677, 1677), Box(1677, 1677)),
+  Box(Box(1678, 1678), Box(1678, 1678)),
+  Box(Box(1679, 1679), Box(1679, 1679)),
+  Box(Box(1680, 1680), Box(1680, 1680)),
+  Box(Box(1681, 1681), Box(1681, 1681)),
+  Box(Box(1682, 1682), Box(1682, 1682)),
+  Box(Box(1683, 1683), Box(1683, 1683)),
+  Box(Box(1684, 1684), Box(1684, 1684)),
+  Box(Box(1685, 1685), Box(1685, 1685)),
+  Box(Box(1686, 1686), Box(1686, 1686)),
+  Box(Box(1687, 1687), Box(1687, 1687)),
+  Box(Box(1688, 1688), Box(1688, 1688)),
+  Box(Box(1689, 1689), Box(1689, 1689)),
+  Box(Box(1690, 1690), Box(1690, 1690)),
+  Box(Box(1691, 1691), Box(1691, 1691)),
+  Box(Box(1692, 1692), Box(1692, 1692)),
+  Box(Box(1693, 1693), Box(1693, 1693)),
+  Box(Box(1694, 1694), Box(1694, 1694)),
+  Box(Box(1695, 1695), Box(1695, 1695)),
+  Box(Box(1696, 1696), Box(1696, 1696)),
+  Box(Box(1697, 1697), Box(1697, 1697)),
+  Box(Box(1698, 1698), Box(1698, 1698)),
+  Box(Box(1699, 1699), Box(1699, 1699)),
+  Box(Box(1700, 1700), Box(1700, 1700)),
+  Box(Box(1701, 1701), Box(1701, 1701)),
+  Box(Box(1702, 1702), Box(1702, 1702)),
+  Box(Box(1703, 1703), Box(1703, 1703)),
+  Box(Box(1704, 1704), Box(1704, 1704)),
+  Box(Box(1705, 1705), Box(1705, 1705)),
+  Box(Box(1706, 1706), Box(1706, 1706)),
+  Box(Box(1707, 1707), Box(1707, 1707)),
+  Box(Box(1708, 1708), Box(1708, 1708)),
+  Box(Box(1709, 1709), Box(1709, 1709)),
+  Box(Box(1710, 1710), Box(1710, 1710)),
+  Box(Box(1711, 1711), Box(1711, 1711)),
+  Box(Box(1712, 1712), Box(1712, 1712)),
+  Box(Box(1713, 1713), Box(1713, 1713)),
+  Box(Box(1714, 1714), Box(1714, 1714)),
+  Box(Box(1715, 1715), Box(1715, 1715)),
+  Box(Box(1716, 1716), Box(1716, 1716)),
+  Box(Box(1717, 1717), Box(1717, 1717)),
+  Box(Box(1718, 1718), Box(1718, 1718)),
+  Box(Box(1719, 1719), Box(1719, 1719)),
+  Box(Box(1720, 1720), Box(1720, 1720)),
+  Box(Box(1721, 1721), Box(1721, 1721)),
+  Box(Box(1722, 1722), Box(1722, 1722)),
+  Box(Box(1723, 1723), Box(1723, 1723)),
+  Box(Box(1724, 1724), Box(1724, 1724)),
+  Box(Box(1725, 1725), Box(1725, 1725)),
+  Box(Box(1726, 1726), Box(1726, 1726)),
+  Box(Box(1727, 1727), Box(1727, 1727)),
+  Box(Box(1728, 1728), Box(1728, 1728)),
+  Box(Box(1729, 1729), Box(1729, 1729)),
+  Box(Box(1730, 1730), Box(1730, 1730)),
+  Box(Box(1731, 1731), Box(1731, 1731)),
+  Box(Box(1732, 1732), Box(1732, 1732)),
+  Box(Box(1733, 1733), Box(1733, 1733)),
+  Box(Box(1734, 1734), Box(1734, 1734)),
+  Box(Box(1735, 1735), Box(1735, 1735)),
+  Box(Box(1736, 1736), Box(1736, 1736)),
+  Box(Box(1737, 1737), Box(1737, 1737)),
+  Box(Box(1738, 1738), Box(1738, 1738)),
+  Box(Box(1739, 1739), Box(1739, 1739)),
+  Box(Box(1740, 1740), Box(1740, 1740)),
+  Box(Box(1741, 1741), Box(1741, 1741)),
+  Box(Box(1742, 1742), Box(1742, 1742)),
+  Box(Box(1743, 1743), Box(1743, 1743)),
+  Box(Box(1744, 1744), Box(1744, 1744)),
+  Box(Box(1745, 1745), Box(1745, 1745)),
+  Box(Box(1746, 1746), Box(1746, 1746)),
+  Box(Box(1747, 1747), Box(1747, 1747)),
+  Box(Box(1748, 1748), Box(1748, 1748)),
+  Box(Box(1749, 1749), Box(1749, 1749)),
+  Box(Box(1750, 1750), Box(1750, 1750)),
+  Box(Box(1751, 1751), Box(1751, 1751)),
+  Box(Box(1752, 1752), Box(1752, 1752)),
+  Box(Box(1753, 1753), Box(1753, 1753)),
+  Box(Box(1754, 1754), Box(1754, 1754)),
+  Box(Box(1755, 1755), Box(1755, 1755)),
+  Box(Box(1756, 1756), Box(1756, 1756)),
+  Box(Box(1757, 1757), Box(1757, 1757)),
+  Box(Box(1758, 1758), Box(1758, 1758)),
+  Box(Box(1759, 1759), Box(1759, 1759)),
+  Box(Box(1760, 1760), Box(1760, 1760)),
+  Box(Box(1761, 1761), Box(1761, 1761)),
+  Box(Box(1762, 1762), Box(1762, 1762)),
+  Box(Box(1763, 1763), Box(1763, 1763)),
+  Box(Box(1764, 1764), Box(1764, 1764)),
+  Box(Box(1765, 1765), Box(1765, 1765)),
+  Box(Box(1766, 1766), Box(1766, 1766)),
+  Box(Box(1767, 1767), Box(1767, 1767)),
+  Box(Box(1768, 1768), Box(1768, 1768)),
+  Box(Box(1769, 1769), Box(1769, 1769)),
+  Box(Box(1770, 1770), Box(1770, 1770)),
+  Box(Box(1771, 1771), Box(1771, 1771)),
+  Box(Box(1772, 1772), Box(1772, 1772)),
+  Box(Box(1773, 1773), Box(1773, 1773)),
+  Box(Box(1774, 1774), Box(1774, 1774)),
+  Box(Box(1775, 1775), Box(1775, 1775)),
+  Box(Box(1776, 1776), Box(1776, 1776)),
+  Box(Box(1777, 1777), Box(1777, 1777)),
+  Box(Box(1778, 1778), Box(1778, 1778)),
+  Box(Box(1779, 1779), Box(1779, 1779)),
+  Box(Box(1780, 1780), Box(1780, 1780)),
+  Box(Box(1781, 1781), Box(1781, 1781)),
+  Box(Box(1782, 1782), Box(1782, 1782)),
+  Box(Box(1783, 1783), Box(1783, 1783)),
+  Box(Box(1784, 1784), Box(1784, 1784)),
+  Box(Box(1785, 1785), Box(1785, 1785)),
+  Box(Box(1786, 1786), Box(1786, 1786)),
+  Box(Box(1787, 1787), Box(1787, 1787)),
+  Box(Box(1788, 1788), Box(1788, 1788)),
+  Box(Box(1789, 1789), Box(1789, 1789)),
+  Box(Box(1790, 1790), Box(1790, 1790)),
+  Box(Box(1791, 1791), Box(1791, 1791)),
+  Box(Box(1792, 1792), Box(1792, 1792)),
+  Box(Box(1793, 1793), Box(1793, 1793)),
+  Box(Box(1794, 1794), Box(1794, 1794)),
+  Box(Box(1795, 1795), Box(1795, 1795)),
+  Box(Box(1796, 1796), Box(1796, 1796)),
+  Box(Box(1797, 1797), Box(1797, 1797)),
+  Box(Box(1798, 1798), Box(1798, 1798)),
+  Box(Box(1799, 1799), Box(1799, 1799)),
+  Box(Box(1800, 1800), Box(1800, 1800)),
+  Box(Box(1801, 1801), Box(1801, 1801)),
+  Box(Box(1802, 1802), Box(1802, 1802)),
+  Box(Box(1803, 1803), Box(1803, 1803)),
+  Box(Box(1804, 1804), Box(1804, 1804)),
+  Box(Box(1805, 1805), Box(1805, 1805)),
+  Box(Box(1806, 1806), Box(1806, 1806)),
+  Box(Box(1807, 1807), Box(1807, 1807)),
+  Box(Box(1808, 1808), Box(1808, 1808)),
+  Box(Box(1809, 1809), Box(1809, 1809)),
+  Box(Box(1810, 1810), Box(1810, 1810)),
+  Box(Box(1811, 1811), Box(1811, 1811)),
+  Box(Box(1812, 1812), Box(1812, 1812)),
+  Box(Box(1813, 1813), Box(1813, 1813)),
+  Box(Box(1814, 1814), Box(1814, 1814)),
+  Box(Box(1815, 1815), Box(1815, 1815)),
+  Box(Box(1816, 1816), Box(1816, 1816)),
+  Box(Box(1817, 1817), Box(1817, 1817)),
+  Box(Box(1818, 1818), Box(1818, 1818)),
+  Box(Box(1819, 1819), Box(1819, 1819)),
+  Box(Box(1820, 1820), Box(1820, 1820)),
+  Box(Box(1821, 1821), Box(1821, 1821)),
+  Box(Box(1822, 1822), Box(1822, 1822)),
+  Box(Box(1823, 1823), Box(1823, 1823)),
+  Box(Box(1824, 1824), Box(1824, 1824)),
+  Box(Box(1825, 1825), Box(1825, 1825)),
+  Box(Box(1826, 1826), Box(1826, 1826)),
+  Box(Box(1827, 1827), Box(1827, 1827)),
+  Box(Box(1828, 1828), Box(1828, 1828)),
+  Box(Box(1829, 1829), Box(1829, 1829)),
+  Box(Box(1830, 1830), Box(1830, 1830)),
+  Box(Box(1831, 1831), Box(1831, 1831)),
+  Box(Box(1832, 1832), Box(1832, 1832)),
+  Box(Box(1833, 1833), Box(1833, 1833)),
+  Box(Box(1834, 1834), Box(1834, 1834)),
+  Box(Box(1835, 1835), Box(1835, 1835)),
+  Box(Box(1836, 1836), Box(1836, 1836)),
+  Box(Box(1837, 1837), Box(1837, 1837)),
+  Box(Box(1838, 1838), Box(1838, 1838)),
+  Box(Box(1839, 1839), Box(1839, 1839)),
+  Box(Box(1840, 1840), Box(1840, 1840)),
+  Box(Box(1841, 1841), Box(1841, 1841)),
+  Box(Box(1842, 1842), Box(1842, 1842)),
+  Box(Box(1843, 1843), Box(1843, 1843)),
+  Box(Box(1844, 1844), Box(1844, 1844)),
+  Box(Box(1845, 1845), Box(1845, 1845)),
+  Box(Box(1846, 1846), Box(1846, 1846)),
+  Box(Box(1847, 1847), Box(1847, 1847)),
+  Box(Box(1848, 1848), Box(1848, 1848)),
+  Box(Box(1849, 1849), Box(1849, 1849)),
+  Box(Box(1850, 1850), Box(1850, 1850)),
+  Box(Box(1851, 1851), Box(1851, 1851)),
+  Box(Box(1852, 1852), Box(1852, 1852)),
+  Box(Box(1853, 1853), Box(1853, 1853)),
+  Box(Box(1854, 1854), Box(1854, 1854)),
+  Box(Box(1855, 1855), Box(1855, 1855)),
+  Box(Box(1856, 1856), Box(1856, 1856)),
+  Box(Box(1857, 1857), Box(1857, 1857)),
+  Box(Box(1858, 1858), Box(1858, 1858)),
+  Box(Box(1859, 1859), Box(1859, 1859)),
+  Box(Box(1860, 1860), Box(1860, 1860)),
+  Box(Box(1861, 1861), Box(1861, 1861)),
+  Box(Box(1862, 1862), Box(1862, 1862)),
+  Box(Box(1863, 1863), Box(1863, 1863)),
+  Box(Box(1864, 1864), Box(1864, 1864)),
+  Box(Box(1865, 1865), Box(1865, 1865)),
+  Box(Box(1866, 1866), Box(1866, 1866)),
+  Box(Box(1867, 1867), Box(1867, 1867)),
+  Box(Box(1868, 1868), Box(1868, 1868)),
+  Box(Box(1869, 1869), Box(1869, 1869)),
+  Box(Box(1870, 1870), Box(1870, 1870)),
+  Box(Box(1871, 1871), Box(1871, 1871)),
+  Box(Box(1872, 1872), Box(1872, 1872)),
+  Box(Box(1873, 1873), Box(1873, 1873)),
+  Box(Box(1874, 1874), Box(1874, 1874)),
+  Box(Box(1875, 1875), Box(1875, 1875)),
+  Box(Box(1876, 1876), Box(1876, 1876)),
+  Box(Box(1877, 1877), Box(1877, 1877)),
+  Box(Box(1878, 1878), Box(1878, 1878)),
+  Box(Box(1879, 1879), Box(1879, 1879)),
+  Box(Box(1880, 1880), Box(1880, 1880)),
+  Box(Box(1881, 1881), Box(1881, 1881)),
+  Box(Box(1882, 1882), Box(1882, 1882)),
+  Box(Box(1883, 1883), Box(1883, 1883)),
+  Box(Box(1884, 1884), Box(1884, 1884)),
+  Box(Box(1885, 1885), Box(1885, 1885)),
+  Box(Box(1886, 1886), Box(1886, 1886)),
+  Box(Box(1887, 1887), Box(1887, 1887)),
+  Box(Box(1888, 1888), Box(1888, 1888)),
+  Box(Box(1889, 1889), Box(1889, 1889)),
+  Box(Box(1890, 1890), Box(1890, 1890)),
+  Box(Box(1891, 1891), Box(1891, 1891)),
+  Box(Box(1892, 1892), Box(1892, 1892)),
+  Box(Box(1893, 1893), Box(1893, 1893)),
+  Box(Box(1894, 1894), Box(1894, 1894)),
+  Box(Box(1895, 1895), Box(1895, 1895)),
+  Box(Box(1896, 1896), Box(1896, 1896)),
+  Box(Box(1897, 1897), Box(1897, 1897)),
+  Box(Box(1898, 1898), Box(1898, 1898)),
+  Box(Box(1899, 1899), Box(1899, 1899)),
+  Box(Box(1900, 1900), Box(1900, 1900)),
+  Box(Box(1901, 1901), Box(1901, 1901)),
+  Box(Box(1902, 1902), Box(1902, 1902)),
+  Box(Box(1903, 1903), Box(1903, 1903)),
+  Box(Box(1904, 1904), Box(1904, 1904)),
+  Box(Box(1905, 1905), Box(1905, 1905)),
+  Box(Box(1906, 1906), Box(1906, 1906)),
+  Box(Box(1907, 1907), Box(1907, 1907)),
+  Box(Box(1908, 1908), Box(1908, 1908)),
+  Box(Box(1909, 1909), Box(1909, 1909)),
+  Box(Box(1910, 1910), Box(1910, 1910)),
+  Box(Box(1911, 1911), Box(1911, 1911)),
+  Box(Box(1912, 1912), Box(1912, 1912)),
+  Box(Box(1913, 1913), Box(1913, 1913)),
+  Box(Box(1914, 1914), Box(1914, 1914)),
+  Box(Box(1915, 1915), Box(1915, 1915)),
+  Box(Box(1916, 1916), Box(1916, 1916)),
+  Box(Box(1917, 1917), Box(1917, 1917)),
+  Box(Box(1918, 1918), Box(1918, 1918)),
+  Box(Box(1919, 1919), Box(1919, 1919)),
+  Box(Box(1920, 1920), Box(1920, 1920)),
+  Box(Box(1921, 1921), Box(1921, 1921)),
+  Box(Box(1922, 1922), Box(1922, 1922)),
+  Box(Box(1923, 1923), Box(1923, 1923)),
+  Box(Box(1924, 1924), Box(1924, 1924)),
+  Box(Box(1925, 1925), Box(1925, 1925)),
+  Box(Box(1926, 1926), Box(1926, 1926)),
+  Box(Box(1927, 1927), Box(1927, 1927)),
+  Box(Box(1928, 1928), Box(1928, 1928)),
+  Box(Box(1929, 1929), Box(1929, 1929)),
+  Box(Box(1930, 1930), Box(1930, 1930)),
+  Box(Box(1931, 1931), Box(1931, 1931)),
+  Box(Box(1932, 1932), Box(1932, 1932)),
+  Box(Box(1933, 1933), Box(1933, 1933)),
+  Box(Box(1934, 1934), Box(1934, 1934)),
+  Box(Box(1935, 1935), Box(1935, 1935)),
+  Box(Box(1936, 1936), Box(1936, 1936)),
+  Box(Box(1937, 1937), Box(1937, 1937)),
+  Box(Box(1938, 1938), Box(1938, 1938)),
+  Box(Box(1939, 1939), Box(1939, 1939)),
+  Box(Box(1940, 1940), Box(1940, 1940)),
+  Box(Box(1941, 1941), Box(1941, 1941)),
+  Box(Box(1942, 1942), Box(1942, 1942)),
+  Box(Box(1943, 1943), Box(1943, 1943)),
+  Box(Box(1944, 1944), Box(1944, 1944)),
+  Box(Box(1945, 1945), Box(1945, 1945)),
+  Box(Box(1946, 1946), Box(1946, 1946)),
+  Box(Box(1947, 1947), Box(1947, 1947)),
+  Box(Box(1948, 1948), Box(1948, 1948)),
+  Box(Box(1949, 1949), Box(1949, 1949)),
+  Box(Box(1950, 1950), Box(1950, 1950)),
+  Box(Box(1951, 1951), Box(1951, 1951)),
+  Box(Box(1952, 1952), Box(1952, 1952)),
+  Box(Box(1953, 1953), Box(1953, 1953)),
+  Box(Box(1954, 1954), Box(1954, 1954)),
+  Box(Box(1955, 1955), Box(1955, 1955)),
+  Box(Box(1956, 1956), Box(1956, 1956)),
+  Box(Box(1957, 1957), Box(1957, 1957)),
+  Box(Box(1958, 1958), Box(1958, 1958)),
+  Box(Box(1959, 1959), Box(1959, 1959)),
+  Box(Box(1960, 1960), Box(1960, 1960)),
+  Box(Box(1961, 1961), Box(1961, 1961)),
+  Box(Box(1962, 1962), Box(1962, 1962)),
+  Box(Box(1963, 1963), Box(1963, 1963)),
+  Box(Box(1964, 1964), Box(1964, 1964)),
+  Box(Box(1965, 1965), Box(1965, 1965)),
+  Box(Box(1966, 1966), Box(1966, 1966)),
+  Box(Box(1967, 1967), Box(1967, 1967)),
+  Box(Box(1968, 1968), Box(1968, 1968)),
+  Box(Box(1969, 1969), Box(1969, 1969)),
+  Box(Box(1970, 1970), Box(1970, 1970)),
+  Box(Box(1971, 1971), Box(1971, 1971)),
+  Box(Box(1972, 1972), Box(1972, 1972)),
+  Box(Box(1973, 1973), Box(1973, 1973)),
+  Box(Box(1974, 1974), Box(1974, 1974)),
+  Box(Box(1975, 1975), Box(1975, 1975)),
+  Box(Box(1976, 1976), Box(1976, 1976)),
+  Box(Box(1977, 1977), Box(1977, 1977)),
+  Box(Box(1978, 1978), Box(1978, 1978)),
+  Box(Box(1979, 1979), Box(1979, 1979)),
+  Box(Box(1980, 1980), Box(1980, 1980)),
+  Box(Box(1981, 1981), Box(1981, 1981)),
+  Box(Box(1982, 1982), Box(1982, 1982)),
+  Box(Box(1983, 1983), Box(1983, 1983)),
+  Box(Box(1984, 1984), Box(1984, 1984)),
+  Box(Box(1985, 1985), Box(1985, 1985)),
+  Box(Box(1986, 1986), Box(1986, 1986)),
+  Box(Box(1987, 1987), Box(1987, 1987)),
+  Box(Box(1988, 1988), Box(1988, 1988)),
+  Box(Box(1989, 1989), Box(1989, 1989)),
+  Box(Box(1990, 1990), Box(1990, 1990)),
+  Box(Box(1991, 1991), Box(1991, 1991)),
+  Box(Box(1992, 1992), Box(1992, 1992)),
+  Box(Box(1993, 1993), Box(1993, 1993)),
+  Box(Box(1994, 1994), Box(1994, 1994)),
+  Box(Box(1995, 1995), Box(1995, 1995)),
+  Box(Box(1996, 1996), Box(1996, 1996)),
+  Box(Box(1997, 1997), Box(1997, 1997)),
+  Box(Box(1998, 1998), Box(1998, 1998)),
+  Box(Box(1999, 1999), Box(1999, 1999)),
+  Box(Box(2000, 2000), Box(2000, 2000)),
+  Box(Box(2001, 2001), Box(2001, 2001)),
+  Box(Box(2002, 2002), Box(2002, 2002)),
+  Box(Box(2003, 2003), Box(2003, 2003)),
+  Box(Box(2004, 2004), Box(2004, 2004)),
+  Box(Box(2005, 2005), Box(2005, 2005)),
+  Box(Box(2006, 2006), Box(2006, 2006)),
+  Box(Box(2007, 2007), Box(2007, 2007)),
+  Box(Box(2008, 2008), Box(2008, 2008)),
+  Box(Box(2009, 2009), Box(2009, 2009)),
+  Box(Box(2010, 2010), Box(2010, 2010)),
+  Box(Box(2011, 2011), Box(2011, 2011)),
+  Box(Box(2012, 2012), Box(2012, 2012)),
+  Box(Box(2013, 2013), Box(2013, 2013)),
+  Box(Box(2014, 2014), Box(2014, 2014)),
+  Box(Box(2015, 2015), Box(2015, 2015)),
+  Box(Box(2016, 2016), Box(2016, 2016)),
+  Box(Box(2017, 2017), Box(2017, 2017)),
+  Box(Box(2018, 2018), Box(2018, 2018)),
+  Box(Box(2019, 2019), Box(2019, 2019)),
+  Box(Box(2020, 2020), Box(2020, 2020)),
+  Box(Box(2021, 2021), Box(2021, 2021)),
+  Box(Box(2022, 2022), Box(2022, 2022)),
+  Box(Box(2023, 2023), Box(2023, 2023)),
+  Box(Box(2024, 2024), Box(2024, 2024)),
+  Box(Box(2025, 2025), Box(2025, 2025)),
+  Box(Box(2026, 2026), Box(2026, 2026)),
+  Box(Box(2027, 2027), Box(2027, 2027)),
+  Box(Box(2028, 2028), Box(2028, 2028)),
+  Box(Box(2029, 2029), Box(2029, 2029)),
+  Box(Box(2030, 2030), Box(2030, 2030)),
+  Box(Box(2031, 2031), Box(2031, 2031)),
+  Box(Box(2032, 2032), Box(2032, 2032)),
+  Box(Box(2033, 2033), Box(2033, 2033)),
+  Box(Box(2034, 2034), Box(2034, 2034)),
+  Box(Box(2035, 2035), Box(2035, 2035)),
+  Box(Box(2036, 2036), Box(2036, 2036)),
+  Box(Box(2037, 2037), Box(2037, 2037)),
+  Box(Box(2038, 2038), Box(2038, 2038)),
+  Box(Box(2039, 2039), Box(2039, 2039)),
+  Box(Box(2040, 2040), Box(2040, 2040)),
+  Box(Box(2041, 2041), Box(2041, 2041)),
+  Box(Box(2042, 2042), Box(2042, 2042)),
+  Box(Box(2043, 2043), Box(2043, 2043)),
+  Box(Box(2044, 2044), Box(2044, 2044)),
+  Box(Box(2045, 2045), Box(2045, 2045)),
+  Box(Box(2046, 2046), Box(2046, 2046)),
+  Box(Box(2047, 2047), Box(2047, 2047)),
+  Box(Box(2048, 2048), Box(2048, 2048)),
+  Box(Box(2049, 2049), Box(2049, 2049)),
+  Box(Box(2050, 2050), Box(2050, 2050)),
+  Box(Box(2051, 2051), Box(2051, 2051)),
+  Box(Box(2052, 2052), Box(2052, 2052)),
+  Box(Box(2053, 2053), Box(2053, 2053)),
+  Box(Box(2054, 2054), Box(2054, 2054)),
+  Box(Box(2055, 2055), Box(2055, 2055)),
+  Box(Box(2056, 2056), Box(2056, 2056)),
+  Box(Box(2057, 2057), Box(2057, 2057)),
+  Box(Box(2058, 2058), Box(2058, 2058)),
+  Box(Box(2059, 2059), Box(2059, 2059)),
+  Box(Box(2060, 2060), Box(2060, 2060)),
+  Box(Box(2061, 2061), Box(2061, 2061)),
+  Box(Box(2062, 2062), Box(2062, 2062)),
+  Box(Box(2063, 2063), Box(2063, 2063)),
+  Box(Box(2064, 2064), Box(2064, 2064)),
+  Box(Box(2065, 2065), Box(2065, 2065)),
+  Box(Box(2066, 2066), Box(2066, 2066)),
+  Box(Box(2067, 2067), Box(2067, 2067)),
+  Box(Box(2068, 2068), Box(2068, 2068)),
+  Box(Box(2069, 2069), Box(2069, 2069)),
+  Box(Box(2070, 2070), Box(2070, 2070)),
+  Box(Box(2071, 2071), Box(2071, 2071)),
+  Box(Box(2072, 2072), Box(2072, 2072)),
+  Box(Box(2073, 2073), Box(2073, 2073)),
+  Box(Box(2074, 2074), Box(2074, 2074)),
+  Box(Box(2075, 2075), Box(2075, 2075)),
+  Box(Box(2076, 2076), Box(2076, 2076)),
+  Box(Box(2077, 2077), Box(2077, 2077)),
+  Box(Box(2078, 2078), Box(2078, 2078)),
+  Box(Box(2079, 2079), Box(2079, 2079)),
+  Box(Box(2080, 2080), Box(2080, 2080)),
+  Box(Box(2081, 2081), Box(2081, 2081)),
+  Box(Box(2082, 2082), Box(2082, 2082)),
+  Box(Box(2083, 2083), Box(2083, 2083)),
+  Box(Box(2084, 2084), Box(2084, 2084)),
+  Box(Box(2085, 2085), Box(2085, 2085)),
+  Box(Box(2086, 2086), Box(2086, 2086)),
+  Box(Box(2087, 2087), Box(2087, 2087)),
+  Box(Box(2088, 2088), Box(2088, 2088)),
+  Box(Box(2089, 2089), Box(2089, 2089)),
+  Box(Box(2090, 2090), Box(2090, 2090)),
+  Box(Box(2091, 2091), Box(2091, 2091)),
+  Box(Box(2092, 2092), Box(2092, 2092)),
+  Box(Box(2093, 2093), Box(2093, 2093)),
+  Box(Box(2094, 2094), Box(2094, 2094)),
+  Box(Box(2095, 2095), Box(2095, 2095)),
+  Box(Box(2096, 2096), Box(2096, 2096)),
+  Box(Box(2097, 2097), Box(2097, 2097)),
+  Box(Box(2098, 2098), Box(2098, 2098)),
+  Box(Box(2099, 2099), Box(2099, 2099)),
+  Box(Box(2100, 2100), Box(2100, 2100)),
+  Box(Box(2101, 2101), Box(2101, 2101)),
+  Box(Box(2102, 2102), Box(2102, 2102)),
+  Box(Box(2103, 2103), Box(2103, 2103)),
+  Box(Box(2104, 2104), Box(2104, 2104)),
+  Box(Box(2105, 2105), Box(2105, 2105)),
+  Box(Box(2106, 2106), Box(2106, 2106)),
+  Box(Box(2107, 2107), Box(2107, 2107)),
+  Box(Box(2108, 2108), Box(2108, 2108)),
+  Box(Box(2109, 2109), Box(2109, 2109)),
+  Box(Box(2110, 2110), Box(2110, 2110)),
+  Box(Box(2111, 2111), Box(2111, 2111)),
+  Box(Box(2112, 2112), Box(2112, 2112)),
+  Box(Box(2113, 2113), Box(2113, 2113)),
+  Box(Box(2114, 2114), Box(2114, 2114)),
+  Box(Box(2115, 2115), Box(2115, 2115)),
+  Box(Box(2116, 2116), Box(2116, 2116)),
+  Box(Box(2117, 2117), Box(2117, 2117)),
+  Box(Box(2118, 2118), Box(2118, 2118)),
+  Box(Box(2119, 2119), Box(2119, 2119)),
+  Box(Box(2120, 2120), Box(2120, 2120)),
+  Box(Box(2121, 2121), Box(2121, 2121)),
+  Box(Box(2122, 2122), Box(2122, 2122)),
+  Box(Box(2123, 2123), Box(2123, 2123)),
+  Box(Box(2124, 2124), Box(2124, 2124)),
+  Box(Box(2125, 2125), Box(2125, 2125)),
+  Box(Box(2126, 2126), Box(2126, 2126)),
+  Box(Box(2127, 2127), Box(2127, 2127)),
+  Box(Box(2128, 2128), Box(2128, 2128)),
+  Box(Box(2129, 2129), Box(2129, 2129)),
+  Box(Box(2130, 2130), Box(2130, 2130)),
+  Box(Box(2131, 2131), Box(2131, 2131)),
+  Box(Box(2132, 2132), Box(2132, 2132)),
+  Box(Box(2133, 2133), Box(2133, 2133)),
+  Box(Box(2134, 2134), Box(2134, 2134)),
+  Box(Box(2135, 2135), Box(2135, 2135)),
+  Box(Box(2136, 2136), Box(2136, 2136)),
+  Box(Box(2137, 2137), Box(2137, 2137)),
+  Box(Box(2138, 2138), Box(2138, 2138)),
+  Box(Box(2139, 2139), Box(2139, 2139)),
+  Box(Box(2140, 2140), Box(2140, 2140)),
+  Box(Box(2141, 2141), Box(2141, 2141)),
+  Box(Box(2142, 2142), Box(2142, 2142)),
+  Box(Box(2143, 2143), Box(2143, 2143)),
+  Box(Box(2144, 2144), Box(2144, 2144)),
+  Box(Box(2145, 2145), Box(2145, 2145)),
+  Box(Box(2146, 2146), Box(2146, 2146)),
+  Box(Box(2147, 2147), Box(2147, 2147)),
+  Box(Box(2148, 2148), Box(2148, 2148)),
+  Box(Box(2149, 2149), Box(2149, 2149)),
+  Box(Box(2150, 2150), Box(2150, 2150)),
+  Box(Box(2151, 2151), Box(2151, 2151)),
+  Box(Box(2152, 2152), Box(2152, 2152)),
+  Box(Box(2153, 2153), Box(2153, 2153)),
+  Box(Box(2154, 2154), Box(2154, 2154)),
+  Box(Box(2155, 2155), Box(2155, 2155)),
+  Box(Box(2156, 2156), Box(2156, 2156)),
+  Box(Box(2157, 2157), Box(2157, 2157)),
+  Box(Box(2158, 2158), Box(2158, 2158)),
+  Box(Box(2159, 2159), Box(2159, 2159)),
+  Box(Box(2160, 2160), Box(2160, 2160)),
+  Box(Box(2161, 2161), Box(2161, 2161)),
+  Box(Box(2162, 2162), Box(2162, 2162)),
+  Box(Box(2163, 2163), Box(2163, 2163)),
+  Box(Box(2164, 2164), Box(2164, 2164)),
+  Box(Box(2165, 2165), Box(2165, 2165)),
+  Box(Box(2166, 2166), Box(2166, 2166)),
+  Box(Box(2167, 2167), Box(2167, 2167)),
+  Box(Box(2168, 2168), Box(2168, 2168)),
+  Box(Box(2169, 2169), Box(2169, 2169)),
+  Box(Box(2170, 2170), Box(2170, 2170)),
+  Box(Box(2171, 2171), Box(2171, 2171)),
+  Box(Box(2172, 2172), Box(2172, 2172)),
+  Box(Box(2173, 2173), Box(2173, 2173)),
+  Box(Box(2174, 2174), Box(2174, 2174)),
+  Box(Box(2175, 2175), Box(2175, 2175)),
+  Box(Box(2176, 2176), Box(2176, 2176)),
+  Box(Box(2177, 2177), Box(2177, 2177)),
+  Box(Box(2178, 2178), Box(2178, 2178)),
+  Box(Box(2179, 2179), Box(2179, 2179)),
+  Box(Box(2180, 2180), Box(2180, 2180)),
+  Box(Box(2181, 2181), Box(2181, 2181)),
+  Box(Box(2182, 2182), Box(2182, 2182)),
+  Box(Box(2183, 2183), Box(2183, 2183)),
+  Box(Box(2184, 2184), Box(2184, 2184)),
+  Box(Box(2185, 2185), Box(2185, 2185)),
+  Box(Box(2186, 2186), Box(2186, 2186)),
+  Box(Box(2187, 2187), Box(2187, 2187)),
+  Box(Box(2188, 2188), Box(2188, 2188)),
+  Box(Box(2189, 2189), Box(2189, 2189)),
+  Box(Box(2190, 2190), Box(2190, 2190)),
+  Box(Box(2191, 2191), Box(2191, 2191)),
+  Box(Box(2192, 2192), Box(2192, 2192)),
+  Box(Box(2193, 2193), Box(2193, 2193)),
+  Box(Box(2194, 2194), Box(2194, 2194)),
+  Box(Box(2195, 2195), Box(2195, 2195)),
+  Box(Box(2196, 2196), Box(2196, 2196)),
+  Box(Box(2197, 2197), Box(2197, 2197)),
+  Box(Box(2198, 2198), Box(2198, 2198)),
+  Box(Box(2199, 2199), Box(2199, 2199)),
+  Box(Box(2200, 2200), Box(2200, 2200)),
+  Box(Box(2201, 2201), Box(2201, 2201)),
+  Box(Box(2202, 2202), Box(2202, 2202)),
+  Box(Box(2203, 2203), Box(2203, 2203)),
+  Box(Box(2204, 2204), Box(2204, 2204)),
+  Box(Box(2205, 2205), Box(2205, 2205)),
+  Box(Box(2206, 2206), Box(2206, 2206)),
+  Box(Box(2207, 2207), Box(2207, 2207)),
+  Box(Box(2208, 2208), Box(2208, 2208)),
+  Box(Box(2209, 2209), Box(2209, 2209)),
+  Box(Box(2210, 2210), Box(2210, 2210)),
+  Box(Box(2211, 2211), Box(2211, 2211)),
+  Box(Box(2212, 2212), Box(2212, 2212)),
+  Box(Box(2213, 2213), Box(2213, 2213)),
+  Box(Box(2214, 2214), Box(2214, 2214)),
+  Box(Box(2215, 2215), Box(2215, 2215)),
+  Box(Box(2216, 2216), Box(2216, 2216)),
+  Box(Box(2217, 2217), Box(2217, 2217)),
+  Box(Box(2218, 2218), Box(2218, 2218)),
+  Box(Box(2219, 2219), Box(2219, 2219)),
+  Box(Box(2220, 2220), Box(2220, 2220)),
+  Box(Box(2221, 2221), Box(2221, 2221)),
+  Box(Box(2222, 2222), Box(2222, 2222)),
+  Box(Box(2223, 2223), Box(2223, 2223)),
+  Box(Box(2224, 2224), Box(2224, 2224)),
+  Box(Box(2225, 2225), Box(2225, 2225)),
+  Box(Box(2226, 2226), Box(2226, 2226)),
+  Box(Box(2227, 2227), Box(2227, 2227)),
+  Box(Box(2228, 2228), Box(2228, 2228)),
+  Box(Box(2229, 2229), Box(2229, 2229)),
+  Box(Box(2230, 2230), Box(2230, 2230)),
+  Box(Box(2231, 2231), Box(2231, 2231)),
+  Box(Box(2232, 2232), Box(2232, 2232)),
+  Box(Box(2233, 2233), Box(2233, 2233)),
+  Box(Box(2234, 2234), Box(2234, 2234)),
+  Box(Box(2235, 2235), Box(2235, 2235)),
+  Box(Box(2236, 2236), Box(2236, 2236)),
+  Box(Box(2237, 2237), Box(2237, 2237)),
+  Box(Box(2238, 2238), Box(2238, 2238)),
+  Box(Box(2239, 2239), Box(2239, 2239)),
+  Box(Box(2240, 2240), Box(2240, 2240)),
+  Box(Box(2241, 2241), Box(2241, 2241)),
+  Box(Box(2242, 2242), Box(2242, 2242)),
+  Box(Box(2243, 2243), Box(2243, 2243)),
+  Box(Box(2244, 2244), Box(2244, 2244)),
+  Box(Box(2245, 2245), Box(2245, 2245)),
+  Box(Box(2246, 2246), Box(2246, 2246)),
+  Box(Box(2247, 2247), Box(2247, 2247)),
+  Box(Box(2248, 2248), Box(2248, 2248)),
+  Box(Box(2249, 2249), Box(2249, 2249)),
+  Box(Box(2250, 2250), Box(2250, 2250)),
+  Box(Box(2251, 2251), Box(2251, 2251)),
+  Box(Box(2252, 2252), Box(2252, 2252)),
+  Box(Box(2253, 2253), Box(2253, 2253)),
+  Box(Box(2254, 2254), Box(2254, 2254)),
+  Box(Box(2255, 2255), Box(2255, 2255)),
+  Box(Box(2256, 2256), Box(2256, 2256)),
+  Box(Box(2257, 2257), Box(2257, 2257)),
+  Box(Box(2258, 2258), Box(2258, 2258)),
+  Box(Box(2259, 2259), Box(2259, 2259)),
+  Box(Box(2260, 2260), Box(2260, 2260)),
+  Box(Box(2261, 2261), Box(2261, 2261)),
+  Box(Box(2262, 2262), Box(2262, 2262)),
+  Box(Box(2263, 2263), Box(2263, 2263)),
+  Box(Box(2264, 2264), Box(2264, 2264)),
+  Box(Box(2265, 2265), Box(2265, 2265)),
+  Box(Box(2266, 2266), Box(2266, 2266)),
+  Box(Box(2267, 2267), Box(2267, 2267)),
+  Box(Box(2268, 2268), Box(2268, 2268)),
+  Box(Box(2269, 2269), Box(2269, 2269)),
+  Box(Box(2270, 2270), Box(2270, 2270)),
+  Box(Box(2271, 2271), Box(2271, 2271)),
+  Box(Box(2272, 2272), Box(2272, 2272)),
+  Box(Box(2273, 2273), Box(2273, 2273)),
+  Box(Box(2274, 2274), Box(2274, 2274)),
+  Box(Box(2275, 2275), Box(2275, 2275)),
+  Box(Box(2276, 2276), Box(2276, 2276)),
+  Box(Box(2277, 2277), Box(2277, 2277)),
+  Box(Box(2278, 2278), Box(2278, 2278)),
+  Box(Box(2279, 2279), Box(2279, 2279)),
+  Box(Box(2280, 2280), Box(2280, 2280)),
+  Box(Box(2281, 2281), Box(2281, 2281)),
+  Box(Box(2282, 2282), Box(2282, 2282)),
+  Box(Box(2283, 2283), Box(2283, 2283)),
+  Box(Box(2284, 2284), Box(2284, 2284)),
+  Box(Box(2285, 2285), Box(2285, 2285)),
+  Box(Box(2286, 2286), Box(2286, 2286)),
+  Box(Box(2287, 2287), Box(2287, 2287)),
+  Box(Box(2288, 2288), Box(2288, 2288)),
+  Box(Box(2289, 2289), Box(2289, 2289)),
+  Box(Box(2290, 2290), Box(2290, 2290)),
+  Box(Box(2291, 2291), Box(2291, 2291)),
+  Box(Box(2292, 2292), Box(2292, 2292)),
+  Box(Box(2293, 2293), Box(2293, 2293)),
+  Box(Box(2294, 2294), Box(2294, 2294)),
+  Box(Box(2295, 2295), Box(2295, 2295)),
+  Box(Box(2296, 2296), Box(2296, 2296)),
+  Box(Box(2297, 2297), Box(2297, 2297)),
+  Box(Box(2298, 2298), Box(2298, 2298)),
+  Box(Box(2299, 2299), Box(2299, 2299)),
+  Box(Box(2300, 2300), Box(2300, 2300)),
+  Box(Box(2301, 2301), Box(2301, 2301)),
+  Box(Box(2302, 2302), Box(2302, 2302)),
+  Box(Box(2303, 2303), Box(2303, 2303)),
+  Box(Box(2304, 2304), Box(2304, 2304)),
+  Box(Box(2305, 2305), Box(2305, 2305)),
+  Box(Box(2306, 2306), Box(2306, 2306)),
+  Box(Box(2307, 2307), Box(2307, 2307)),
+  Box(Box(2308, 2308), Box(2308, 2308)),
+  Box(Box(2309, 2309), Box(2309, 2309)),
+  Box(Box(2310, 2310), Box(2310, 2310)),
+  Box(Box(2311, 2311), Box(2311, 2311)),
+  Box(Box(2312, 2312), Box(2312, 2312)),
+  Box(Box(2313, 2313), Box(2313, 2313)),
+  Box(Box(2314, 2314), Box(2314, 2314)),
+  Box(Box(2315, 2315), Box(2315, 2315)),
+  Box(Box(2316, 2316), Box(2316, 2316)),
+  Box(Box(2317, 2317), Box(2317, 2317)),
+  Box(Box(2318, 2318), Box(2318, 2318)),
+  Box(Box(2319, 2319), Box(2319, 2319)),
+  Box(Box(2320, 2320), Box(2320, 2320)),
+  Box(Box(2321, 2321), Box(2321, 2321)),
+  Box(Box(2322, 2322), Box(2322, 2322)),
+  Box(Box(2323, 2323), Box(2323, 2323)),
+  Box(Box(2324, 2324), Box(2324, 2324)),
+  Box(Box(2325, 2325), Box(2325, 2325)),
+  Box(Box(2326, 2326), Box(2326, 2326)),
+  Box(Box(2327, 2327), Box(2327, 2327)),
+  Box(Box(2328, 2328), Box(2328, 2328)),
+  Box(Box(2329, 2329), Box(2329, 2329)),
+  Box(Box(2330, 2330), Box(2330, 2330)),
+  Box(Box(2331, 2331), Box(2331, 2331)),
+  Box(Box(2332, 2332), Box(2332, 2332)),
+  Box(Box(2333, 2333), Box(2333, 2333)),
+  Box(Box(2334, 2334), Box(2334, 2334)),
+  Box(Box(2335, 2335), Box(2335, 2335)),
+  Box(Box(2336, 2336), Box(2336, 2336)),
+  Box(Box(2337, 2337), Box(2337, 2337)),
+  Box(Box(2338, 2338), Box(2338, 2338)),
+  Box(Box(2339, 2339), Box(2339, 2339)),
+  Box(Box(2340, 2340), Box(2340, 2340)),
+  Box(Box(2341, 2341), Box(2341, 2341)),
+  Box(Box(2342, 2342), Box(2342, 2342)),
+  Box(Box(2343, 2343), Box(2343, 2343)),
+  Box(Box(2344, 2344), Box(2344, 2344)),
+  Box(Box(2345, 2345), Box(2345, 2345)),
+  Box(Box(2346, 2346), Box(2346, 2346)),
+  Box(Box(2347, 2347), Box(2347, 2347)),
+  Box(Box(2348, 2348), Box(2348, 2348)),
+  Box(Box(2349, 2349), Box(2349, 2349)),
+  Box(Box(2350, 2350), Box(2350, 2350)),
+  Box(Box(2351, 2351), Box(2351, 2351)),
+  Box(Box(2352, 2352), Box(2352, 2352)),
+  Box(Box(2353, 2353), Box(2353, 2353)),
+  Box(Box(2354, 2354), Box(2354, 2354)),
+  Box(Box(2355, 2355), Box(2355, 2355)),
+  Box(Box(2356, 2356), Box(2356, 2356)),
+  Box(Box(2357, 2357), Box(2357, 2357)),
+  Box(Box(2358, 2358), Box(2358, 2358)),
+  Box(Box(2359, 2359), Box(2359, 2359)),
+  Box(Box(2360, 2360), Box(2360, 2360)),
+  Box(Box(2361, 2361), Box(2361, 2361)),
+  Box(Box(2362, 2362), Box(2362, 2362)),
+  Box(Box(2363, 2363), Box(2363, 2363)),
+  Box(Box(2364, 2364), Box(2364, 2364)),
+  Box(Box(2365, 2365), Box(2365, 2365)),
+  Box(Box(2366, 2366), Box(2366, 2366)),
+  Box(Box(2367, 2367), Box(2367, 2367)),
+  Box(Box(2368, 2368), Box(2368, 2368)),
+  Box(Box(2369, 2369), Box(2369, 2369)),
+  Box(Box(2370, 2370), Box(2370, 2370)),
+  Box(Box(2371, 2371), Box(2371, 2371)),
+  Box(Box(2372, 2372), Box(2372, 2372)),
+  Box(Box(2373, 2373), Box(2373, 2373)),
+  Box(Box(2374, 2374), Box(2374, 2374)),
+  Box(Box(2375, 2375), Box(2375, 2375)),
+  Box(Box(2376, 2376), Box(2376, 2376)),
+  Box(Box(2377, 2377), Box(2377, 2377)),
+  Box(Box(2378, 2378), Box(2378, 2378)),
+  Box(Box(2379, 2379), Box(2379, 2379)),
+  Box(Box(2380, 2380), Box(2380, 2380)),
+  Box(Box(2381, 2381), Box(2381, 2381)),
+  Box(Box(2382, 2382), Box(2382, 2382)),
+  Box(Box(2383, 2383), Box(2383, 2383)),
+  Box(Box(2384, 2384), Box(2384, 2384)),
+  Box(Box(2385, 2385), Box(2385, 2385)),
+  Box(Box(2386, 2386), Box(2386, 2386)),
+  Box(Box(2387, 2387), Box(2387, 2387)),
+  Box(Box(2388, 2388), Box(2388, 2388)),
+  Box(Box(2389, 2389), Box(2389, 2389)),
+  Box(Box(2390, 2390), Box(2390, 2390)),
+  Box(Box(2391, 2391), Box(2391, 2391)),
+  Box(Box(2392, 2392), Box(2392, 2392)),
+  Box(Box(2393, 2393), Box(2393, 2393)),
+  Box(Box(2394, 2394), Box(2394, 2394)),
+  Box(Box(2395, 2395), Box(2395, 2395)),
+  Box(Box(2396, 2396), Box(2396, 2396)),
+  Box(Box(2397, 2397), Box(2397, 2397)),
+  Box(Box(2398, 2398), Box(2398, 2398)),
+  Box(Box(2399, 2399), Box(2399, 2399)),
+  Box(Box(2400, 2400), Box(2400, 2400)),
+  Box(Box(2401, 2401), Box(2401, 2401)),
+  Box(Box(2402, 2402), Box(2402, 2402)),
+  Box(Box(2403, 2403), Box(2403, 2403)),
+  Box(Box(2404, 2404), Box(2404, 2404)),
+  Box(Box(2405, 2405), Box(2405, 2405)),
+  Box(Box(2406, 2406), Box(2406, 2406)),
+  Box(Box(2407, 2407), Box(2407, 2407)),
+  Box(Box(2408, 2408), Box(2408, 2408)),
+  Box(Box(2409, 2409), Box(2409, 2409)),
+  Box(Box(2410, 2410), Box(2410, 2410)),
+  Box(Box(2411, 2411), Box(2411, 2411)),
+  Box(Box(2412, 2412), Box(2412, 2412)),
+  Box(Box(2413, 2413), Box(2413, 2413)),
+  Box(Box(2414, 2414), Box(2414, 2414)),
+  Box(Box(2415, 2415), Box(2415, 2415)),
+  Box(Box(2416, 2416), Box(2416, 2416)),
+  Box(Box(2417, 2417), Box(2417, 2417)),
+  Box(Box(2418, 2418), Box(2418, 2418)),
+  Box(Box(2419, 2419), Box(2419, 2419)),
+  Box(Box(2420, 2420), Box(2420, 2420)),
+  Box(Box(2421, 2421), Box(2421, 2421)),
+  Box(Box(2422, 2422), Box(2422, 2422)),
+  Box(Box(2423, 2423), Box(2423, 2423)),
+  Box(Box(2424, 2424), Box(2424, 2424)),
+  Box(Box(2425, 2425), Box(2425, 2425)),
+  Box(Box(2426, 2426), Box(2426, 2426)),
+  Box(Box(2427, 2427), Box(2427, 2427)),
+  Box(Box(2428, 2428), Box(2428, 2428)),
+  Box(Box(2429, 2429), Box(2429, 2429)),
+  Box(Box(2430, 2430), Box(2430, 2430)),
+  Box(Box(2431, 2431), Box(2431, 2431)),
+  Box(Box(2432, 2432), Box(2432, 2432)),
+  Box(Box(2433, 2433), Box(2433, 2433)),
+  Box(Box(2434, 2434), Box(2434, 2434)),
+  Box(Box(2435, 2435), Box(2435, 2435)),
+  Box(Box(2436, 2436), Box(2436, 2436)),
+  Box(Box(2437, 2437), Box(2437, 2437)),
+  Box(Box(2438, 2438), Box(2438, 2438)),
+  Box(Box(2439, 2439), Box(2439, 2439)),
+  Box(Box(2440, 2440), Box(2440, 2440)),
+  Box(Box(2441, 2441), Box(2441, 2441)),
+  Box(Box(2442, 2442), Box(2442, 2442)),
+  Box(Box(2443, 2443), Box(2443, 2443)),
+  Box(Box(2444, 2444), Box(2444, 2444)),
+  Box(Box(2445, 2445), Box(2445, 2445)),
+  Box(Box(2446, 2446), Box(2446, 2446)),
+  Box(Box(2447, 2447), Box(2447, 2447)),
+  Box(Box(2448, 2448), Box(2448, 2448)),
+  Box(Box(2449, 2449), Box(2449, 2449)),
+  Box(Box(2450, 2450), Box(2450, 2450)),
+  Box(Box(2451, 2451), Box(2451, 2451)),
+  Box(Box(2452, 2452), Box(2452, 2452)),
+  Box(Box(2453, 2453), Box(2453, 2453)),
+  Box(Box(2454, 2454), Box(2454, 2454)),
+  Box(Box(2455, 2455), Box(2455, 2455)),
+  Box(Box(2456, 2456), Box(2456, 2456)),
+  Box(Box(2457, 2457), Box(2457, 2457)),
+  Box(Box(2458, 2458), Box(2458, 2458)),
+  Box(Box(2459, 2459), Box(2459, 2459)),
+  Box(Box(2460, 2460), Box(2460, 2460)),
+  Box(Box(2461, 2461), Box(2461, 2461)),
+  Box(Box(2462, 2462), Box(2462, 2462)),
+  Box(Box(2463, 2463), Box(2463, 2463)),
+  Box(Box(2464, 2464), Box(2464, 2464)),
+  Box(Box(2465, 2465), Box(2465, 2465)),
+  Box(Box(2466, 2466), Box(2466, 2466)),
+  Box(Box(2467, 2467), Box(2467, 2467)),
+  Box(Box(2468, 2468), Box(2468, 2468)),
+  Box(Box(2469, 2469), Box(2469, 2469)),
+  Box(Box(2470, 2470), Box(2470, 2470)),
+  Box(Box(2471, 2471), Box(2471, 2471)),
+  Box(Box(2472, 2472), Box(2472, 2472)),
+  Box(Box(2473, 2473), Box(2473, 2473)),
+  Box(Box(2474, 2474), Box(2474, 2474)),
+  Box(Box(2475, 2475), Box(2475, 2475)),
+  Box(Box(2476, 2476), Box(2476, 2476)),
+  Box(Box(2477, 2477), Box(2477, 2477)),
+  Box(Box(2478, 2478), Box(2478, 2478)),
+  Box(Box(2479, 2479), Box(2479, 2479)),
+  Box(Box(2480, 2480), Box(2480, 2480)),
+  Box(Box(2481, 2481), Box(2481, 2481)),
+  Box(Box(2482, 2482), Box(2482, 2482)),
+  Box(Box(2483, 2483), Box(2483, 2483)),
+  Box(Box(2484, 2484), Box(2484, 2484)),
+  Box(Box(2485, 2485), Box(2485, 2485)),
+  Box(Box(2486, 2486), Box(2486, 2486)),
+  Box(Box(2487, 2487), Box(2487, 2487)),
+  Box(Box(2488, 2488), Box(2488, 2488)),
+  Box(Box(2489, 2489), Box(2489, 2489)),
+  Box(Box(2490, 2490), Box(2490, 2490)),
+  Box(Box(2491, 2491), Box(2491, 2491)),
+  Box(Box(2492, 2492), Box(2492, 2492)),
+  Box(Box(2493, 2493), Box(2493, 2493)),
+  Box(Box(2494, 2494), Box(2494, 2494)),
+  Box(Box(2495, 2495), Box(2495, 2495)),
+  Box(Box(2496, 2496), Box(2496, 2496)),
+  Box(Box(2497, 2497), Box(2497, 2497)),
+  Box(Box(2498, 2498), Box(2498, 2498)),
+  Box(Box(2499, 2499), Box(2499, 2499)),
+  Box(Box(2500, 2500), Box(2500, 2500)),
+  Box(Box(2501, 2501), Box(2501, 2501)),
+  Box(Box(2502, 2502), Box(2502, 2502)),
+  Box(Box(2503, 2503), Box(2503, 2503)),
+  Box(Box(2504, 2504), Box(2504, 2504)),
+  Box(Box(2505, 2505), Box(2505, 2505)),
+  Box(Box(2506, 2506), Box(2506, 2506)),
+  Box(Box(2507, 2507), Box(2507, 2507)),
+  Box(Box(2508, 2508), Box(2508, 2508)),
+  Box(Box(2509, 2509), Box(2509, 2509)),
+  Box(Box(2510, 2510), Box(2510, 2510)),
+  Box(Box(2511, 2511), Box(2511, 2511)),
+  Box(Box(2512, 2512), Box(2512, 2512)),
+  Box(Box(2513, 2513), Box(2513, 2513)),
+  Box(Box(2514, 2514), Box(2514, 2514)),
+  Box(Box(2515, 2515), Box(2515, 2515)),
+  Box(Box(2516, 2516), Box(2516, 2516)),
+  Box(Box(2517, 2517), Box(2517, 2517)),
+  Box(Box(2518, 2518), Box(2518, 2518)),
+  Box(Box(2519, 2519), Box(2519, 2519)),
+  Box(Box(2520, 2520), Box(2520, 2520)),
+  Box(Box(2521, 2521), Box(2521, 2521)),
+  Box(Box(2522, 2522), Box(2522, 2522)),
+  Box(Box(2523, 2523), Box(2523, 2523)),
+  Box(Box(2524, 2524), Box(2524, 2524)),
+  Box(Box(2525, 2525), Box(2525, 2525)),
+  Box(Box(2526, 2526), Box(2526, 2526)),
+  Box(Box(2527, 2527), Box(2527, 2527)),
+  Box(Box(2528, 2528), Box(2528, 2528)),
+  Box(Box(2529, 2529), Box(2529, 2529)),
+  Box(Box(2530, 2530), Box(2530, 2530)),
+  Box(Box(2531, 2531), Box(2531, 2531)),
+  Box(Box(2532, 2532), Box(2532, 2532)),
+  Box(Box(2533, 2533), Box(2533, 2533)),
+  Box(Box(2534, 2534), Box(2534, 2534)),
+  Box(Box(2535, 2535), Box(2535, 2535)),
+  Box(Box(2536, 2536), Box(2536, 2536)),
+  Box(Box(2537, 2537), Box(2537, 2537)),
+  Box(Box(2538, 2538), Box(2538, 2538)),
+  Box(Box(2539, 2539), Box(2539, 2539)),
+  Box(Box(2540, 2540), Box(2540, 2540)),
+  Box(Box(2541, 2541), Box(2541, 2541)),
+  Box(Box(2542, 2542), Box(2542, 2542)),
+  Box(Box(2543, 2543), Box(2543, 2543)),
+  Box(Box(2544, 2544), Box(2544, 2544)),
+  Box(Box(2545, 2545), Box(2545, 2545)),
+  Box(Box(2546, 2546), Box(2546, 2546)),
+  Box(Box(2547, 2547), Box(2547, 2547)),
+  Box(Box(2548, 2548), Box(2548, 2548)),
+  Box(Box(2549, 2549), Box(2549, 2549)),
+  Box(Box(2550, 2550), Box(2550, 2550)),
+  Box(Box(2551, 2551), Box(2551, 2551)),
+  Box(Box(2552, 2552), Box(2552, 2552)),
+  Box(Box(2553, 2553), Box(2553, 2553)),
+  Box(Box(2554, 2554), Box(2554, 2554)),
+  Box(Box(2555, 2555), Box(2555, 2555)),
+  Box(Box(2556, 2556), Box(2556, 2556)),
+  Box(Box(2557, 2557), Box(2557, 2557)),
+  Box(Box(2558, 2558), Box(2558, 2558)),
+  Box(Box(2559, 2559), Box(2559, 2559)),
+  Box(Box(2560, 2560), Box(2560, 2560)),
+  Box(Box(2561, 2561), Box(2561, 2561)),
+  Box(Box(2562, 2562), Box(2562, 2562)),
+  Box(Box(2563, 2563), Box(2563, 2563)),
+  Box(Box(2564, 2564), Box(2564, 2564)),
+  Box(Box(2565, 2565), Box(2565, 2565)),
+  Box(Box(2566, 2566), Box(2566, 2566)),
+  Box(Box(2567, 2567), Box(2567, 2567)),
+  Box(Box(2568, 2568), Box(2568, 2568)),
+  Box(Box(2569, 2569), Box(2569, 2569)),
+  Box(Box(2570, 2570), Box(2570, 2570)),
+  Box(Box(2571, 2571), Box(2571, 2571)),
+  Box(Box(2572, 2572), Box(2572, 2572)),
+  Box(Box(2573, 2573), Box(2573, 2573)),
+  Box(Box(2574, 2574), Box(2574, 2574)),
+  Box(Box(2575, 2575), Box(2575, 2575)),
+  Box(Box(2576, 2576), Box(2576, 2576)),
+  Box(Box(2577, 2577), Box(2577, 2577)),
+  Box(Box(2578, 2578), Box(2578, 2578)),
+  Box(Box(2579, 2579), Box(2579, 2579)),
+  Box(Box(2580, 2580), Box(2580, 2580)),
+  Box(Box(2581, 2581), Box(2581, 2581)),
+  Box(Box(2582, 2582), Box(2582, 2582)),
+  Box(Box(2583, 2583), Box(2583, 2583)),
+  Box(Box(2584, 2584), Box(2584, 2584)),
+  Box(Box(2585, 2585), Box(2585, 2585)),
+  Box(Box(2586, 2586), Box(2586, 2586)),
+  Box(Box(2587, 2587), Box(2587, 2587)),
+  Box(Box(2588, 2588), Box(2588, 2588)),
+  Box(Box(2589, 2589), Box(2589, 2589)),
+  Box(Box(2590, 2590), Box(2590, 2590)),
+  Box(Box(2591, 2591), Box(2591, 2591)),
+  Box(Box(2592, 2592), Box(2592, 2592)),
+  Box(Box(2593, 2593), Box(2593, 2593)),
+  Box(Box(2594, 2594), Box(2594, 2594)),
+  Box(Box(2595, 2595), Box(2595, 2595)),
+  Box(Box(2596, 2596), Box(2596, 2596)),
+  Box(Box(2597, 2597), Box(2597, 2597)),
+  Box(Box(2598, 2598), Box(2598, 2598)),
+  Box(Box(2599, 2599), Box(2599, 2599)),
+  Box(Box(2600, 2600), Box(2600, 2600)),
+  Box(Box(2601, 2601), Box(2601, 2601)),
+  Box(Box(2602, 2602), Box(2602, 2602)),
+  Box(Box(2603, 2603), Box(2603, 2603)),
+  Box(Box(2604, 2604), Box(2604, 2604)),
+  Box(Box(2605, 2605), Box(2605, 2605)),
+  Box(Box(2606, 2606), Box(2606, 2606)),
+  Box(Box(2607, 2607), Box(2607, 2607)),
+  Box(Box(2608, 2608), Box(2608, 2608)),
+  Box(Box(2609, 2609), Box(2609, 2609)),
+  Box(Box(2610, 2610), Box(2610, 2610)),
+  Box(Box(2611, 2611), Box(2611, 2611)),
+  Box(Box(2612, 2612), Box(2612, 2612)),
+  Box(Box(2613, 2613), Box(2613, 2613)),
+  Box(Box(2614, 2614), Box(2614, 2614)),
+  Box(Box(2615, 2615), Box(2615, 2615)),
+  Box(Box(2616, 2616), Box(2616, 2616)),
+  Box(Box(2617, 2617), Box(2617, 2617)),
+  Box(Box(2618, 2618), Box(2618, 2618)),
+  Box(Box(2619, 2619), Box(2619, 2619)),
+  Box(Box(2620, 2620), Box(2620, 2620)),
+  Box(Box(2621, 2621), Box(2621, 2621)),
+  Box(Box(2622, 2622), Box(2622, 2622)),
+  Box(Box(2623, 2623), Box(2623, 2623)),
+  Box(Box(2624, 2624), Box(2624, 2624)),
+  Box(Box(2625, 2625), Box(2625, 2625)),
+  Box(Box(2626, 2626), Box(2626, 2626)),
+  Box(Box(2627, 2627), Box(2627, 2627)),
+  Box(Box(2628, 2628), Box(2628, 2628)),
+  Box(Box(2629, 2629), Box(2629, 2629)),
+  Box(Box(2630, 2630), Box(2630, 2630)),
+  Box(Box(2631, 2631), Box(2631, 2631)),
+  Box(Box(2632, 2632), Box(2632, 2632)),
+  Box(Box(2633, 2633), Box(2633, 2633)),
+  Box(Box(2634, 2634), Box(2634, 2634)),
+  Box(Box(2635, 2635), Box(2635, 2635)),
+  Box(Box(2636, 2636), Box(2636, 2636)),
+  Box(Box(2637, 2637), Box(2637, 2637)),
+  Box(Box(2638, 2638), Box(2638, 2638)),
+  Box(Box(2639, 2639), Box(2639, 2639)),
+  Box(Box(2640, 2640), Box(2640, 2640)),
+  Box(Box(2641, 2641), Box(2641, 2641)),
+  Box(Box(2642, 2642), Box(2642, 2642)),
+  Box(Box(2643, 2643), Box(2643, 2643)),
+  Box(Box(2644, 2644), Box(2644, 2644)),
+  Box(Box(2645, 2645), Box(2645, 2645)),
+  Box(Box(2646, 2646), Box(2646, 2646)),
+  Box(Box(2647, 2647), Box(2647, 2647)),
+  Box(Box(2648, 2648), Box(2648, 2648)),
+  Box(Box(2649, 2649), Box(2649, 2649)),
+  Box(Box(2650, 2650), Box(2650, 2650)),
+  Box(Box(2651, 2651), Box(2651, 2651)),
+  Box(Box(2652, 2652), Box(2652, 2652)),
+  Box(Box(2653, 2653), Box(2653, 2653)),
+  Box(Box(2654, 2654), Box(2654, 2654)),
+  Box(Box(2655, 2655), Box(2655, 2655)),
+  Box(Box(2656, 2656), Box(2656, 2656)),
+  Box(Box(2657, 2657), Box(2657, 2657)),
+  Box(Box(2658, 2658), Box(2658, 2658)),
+  Box(Box(2659, 2659), Box(2659, 2659)),
+  Box(Box(2660, 2660), Box(2660, 2660)),
+  Box(Box(2661, 2661), Box(2661, 2661)),
+  Box(Box(2662, 2662), Box(2662, 2662)),
+  Box(Box(2663, 2663), Box(2663, 2663)),
+  Box(Box(2664, 2664), Box(2664, 2664)),
+  Box(Box(2665, 2665), Box(2665, 2665)),
+  Box(Box(2666, 2666), Box(2666, 2666)),
+  Box(Box(2667, 2667), Box(2667, 2667)),
+  Box(Box(2668, 2668), Box(2668, 2668)),
+  Box(Box(2669, 2669), Box(2669, 2669)),
+  Box(Box(2670, 2670), Box(2670, 2670)),
+  Box(Box(2671, 2671), Box(2671, 2671)),
+  Box(Box(2672, 2672), Box(2672, 2672)),
+  Box(Box(2673, 2673), Box(2673, 2673)),
+  Box(Box(2674, 2674), Box(2674, 2674)),
+  Box(Box(2675, 2675), Box(2675, 2675)),
+  Box(Box(2676, 2676), Box(2676, 2676)),
+  Box(Box(2677, 2677), Box(2677, 2677)),
+  Box(Box(2678, 2678), Box(2678, 2678)),
+  Box(Box(2679, 2679), Box(2679, 2679)),
+  Box(Box(2680, 2680), Box(2680, 2680)),
+  Box(Box(2681, 2681), Box(2681, 2681)),
+  Box(Box(2682, 2682), Box(2682, 2682)),
+  Box(Box(2683, 2683), Box(2683, 2683)),
+  Box(Box(2684, 2684), Box(2684, 2684)),
+  Box(Box(2685, 2685), Box(2685, 2685)),
+  Box(Box(2686, 2686), Box(2686, 2686)),
+  Box(Box(2687, 2687), Box(2687, 2687)),
+  Box(Box(2688, 2688), Box(2688, 2688)),
+  Box(Box(2689, 2689), Box(2689, 2689)),
+  Box(Box(2690, 2690), Box(2690, 2690)),
+  Box(Box(2691, 2691), Box(2691, 2691)),
+  Box(Box(2692, 2692), Box(2692, 2692)),
+  Box(Box(2693, 2693), Box(2693, 2693)),
+  Box(Box(2694, 2694), Box(2694, 2694)),
+  Box(Box(2695, 2695), Box(2695, 2695)),
+  Box(Box(2696, 2696), Box(2696, 2696)),
+  Box(Box(2697, 2697), Box(2697, 2697)),
+  Box(Box(2698, 2698), Box(2698, 2698)),
+  Box(Box(2699, 2699), Box(2699, 2699)),
+  Box(Box(2700, 2700), Box(2700, 2700)),
+  Box(Box(2701, 2701), Box(2701, 2701)),
+  Box(Box(2702, 2702), Box(2702, 2702)),
+  Box(Box(2703, 2703), Box(2703, 2703)),
+  Box(Box(2704, 2704), Box(2704, 2704)),
+  Box(Box(2705, 2705), Box(2705, 2705)),
+  Box(Box(2706, 2706), Box(2706, 2706)),
+  Box(Box(2707, 2707), Box(2707, 2707)),
+  Box(Box(2708, 2708), Box(2708, 2708)),
+  Box(Box(2709, 2709), Box(2709, 2709)),
+  Box(Box(2710, 2710), Box(2710, 2710)),
+  Box(Box(2711, 2711), Box(2711, 2711)),
+  Box(Box(2712, 2712), Box(2712, 2712)),
+  Box(Box(2713, 2713), Box(2713, 2713)),
+  Box(Box(2714, 2714), Box(2714, 2714)),
+  Box(Box(2715, 2715), Box(2715, 2715)),
+  Box(Box(2716, 2716), Box(2716, 2716)),
+  Box(Box(2717, 2717), Box(2717, 2717)),
+  Box(Box(2718, 2718), Box(2718, 2718)),
+  Box(Box(2719, 2719), Box(2719, 2719)),
+  Box(Box(2720, 2720), Box(2720, 2720)),
+  Box(Box(2721, 2721), Box(2721, 2721)),
+  Box(Box(2722, 2722), Box(2722, 2722)),
+  Box(Box(2723, 2723), Box(2723, 2723)),
+  Box(Box(2724, 2724), Box(2724, 2724)),
+  Box(Box(2725, 2725), Box(2725, 2725)),
+  Box(Box(2726, 2726), Box(2726, 2726)),
+  Box(Box(2727, 2727), Box(2727, 2727)),
+  Box(Box(2728, 2728), Box(2728, 2728)),
+  Box(Box(2729, 2729), Box(2729, 2729)),
+  Box(Box(2730, 2730), Box(2730, 2730)),
+  Box(Box(2731, 2731), Box(2731, 2731)),
+  Box(Box(2732, 2732), Box(2732, 2732)),
+  Box(Box(2733, 2733), Box(2733, 2733)),
+  Box(Box(2734, 2734), Box(2734, 2734)),
+  Box(Box(2735, 2735), Box(2735, 2735)),
+  Box(Box(2736, 2736), Box(2736, 2736)),
+  Box(Box(2737, 2737), Box(2737, 2737)),
+  Box(Box(2738, 2738), Box(2738, 2738)),
+  Box(Box(2739, 2739), Box(2739, 2739)),
+  Box(Box(2740, 2740), Box(2740, 2740)),
+  Box(Box(2741, 2741), Box(2741, 2741)),
+  Box(Box(2742, 2742), Box(2742, 2742)),
+  Box(Box(2743, 2743), Box(2743, 2743)),
+  Box(Box(2744, 2744), Box(2744, 2744)),
+  Box(Box(2745, 2745), Box(2745, 2745)),
+  Box(Box(2746, 2746), Box(2746, 2746)),
+  Box(Box(2747, 2747), Box(2747, 2747)),
+  Box(Box(2748, 2748), Box(2748, 2748)),
+  Box(Box(2749, 2749), Box(2749, 2749)),
+  Box(Box(2750, 2750), Box(2750, 2750)),
+  Box(Box(2751, 2751), Box(2751, 2751)),
+  Box(Box(2752, 2752), Box(2752, 2752)),
+  Box(Box(2753, 2753), Box(2753, 2753)),
+  Box(Box(2754, 2754), Box(2754, 2754)),
+  Box(Box(2755, 2755), Box(2755, 2755)),
+  Box(Box(2756, 2756), Box(2756, 2756)),
+  Box(Box(2757, 2757), Box(2757, 2757)),
+  Box(Box(2758, 2758), Box(2758, 2758)),
+  Box(Box(2759, 2759), Box(2759, 2759)),
+  Box(Box(2760, 2760), Box(2760, 2760)),
+  Box(Box(2761, 2761), Box(2761, 2761)),
+  Box(Box(2762, 2762), Box(2762, 2762)),
+  Box(Box(2763, 2763), Box(2763, 2763)),
+  Box(Box(2764, 2764), Box(2764, 2764)),
+  Box(Box(2765, 2765), Box(2765, 2765)),
+  Box(Box(2766, 2766), Box(2766, 2766)),
+  Box(Box(2767, 2767), Box(2767, 2767)),
+  Box(Box(2768, 2768), Box(2768, 2768)),
+  Box(Box(2769, 2769), Box(2769, 2769)),
+  Box(Box(2770, 2770), Box(2770, 2770)),
+  Box(Box(2771, 2771), Box(2771, 2771)),
+  Box(Box(2772, 2772), Box(2772, 2772)),
+  Box(Box(2773, 2773), Box(2773, 2773)),
+  Box(Box(2774, 2774), Box(2774, 2774)),
+  Box(Box(2775, 2775), Box(2775, 2775)),
+  Box(Box(2776, 2776), Box(2776, 2776)),
+  Box(Box(2777, 2777), Box(2777, 2777)),
+  Box(Box(2778, 2778), Box(2778, 2778)),
+  Box(Box(2779, 2779), Box(2779, 2779)),
+  Box(Box(2780, 2780), Box(2780, 2780)),
+  Box(Box(2781, 2781), Box(2781, 2781)),
+  Box(Box(2782, 2782), Box(2782, 2782)),
+  Box(Box(2783, 2783), Box(2783, 2783)),
+  Box(Box(2784, 2784), Box(2784, 2784)),
+  Box(Box(2785, 2785), Box(2785, 2785)),
+  Box(Box(2786, 2786), Box(2786, 2786)),
+  Box(Box(2787, 2787), Box(2787, 2787)),
+  Box(Box(2788, 2788), Box(2788, 2788)),
+  Box(Box(2789, 2789), Box(2789, 2789)),
+  Box(Box(2790, 2790), Box(2790, 2790)),
+  Box(Box(2791, 2791), Box(2791, 2791)),
+  Box(Box(2792, 2792), Box(2792, 2792)),
+  Box(Box(2793, 2793), Box(2793, 2793)),
+  Box(Box(2794, 2794), Box(2794, 2794)),
+  Box(Box(2795, 2795), Box(2795, 2795)),
+  Box(Box(2796, 2796), Box(2796, 2796)),
+  Box(Box(2797, 2797), Box(2797, 2797)),
+  Box(Box(2798, 2798), Box(2798, 2798)),
+  Box(Box(2799, 2799), Box(2799, 2799)),
+  Box(Box(2800, 2800), Box(2800, 2800)),
+  Box(Box(2801, 2801), Box(2801, 2801)),
+  Box(Box(2802, 2802), Box(2802, 2802)),
+  Box(Box(2803, 2803), Box(2803, 2803)),
+  Box(Box(2804, 2804), Box(2804, 2804)),
+  Box(Box(2805, 2805), Box(2805, 2805)),
+  Box(Box(2806, 2806), Box(2806, 2806)),
+  Box(Box(2807, 2807), Box(2807, 2807)),
+  Box(Box(2808, 2808), Box(2808, 2808)),
+  Box(Box(2809, 2809), Box(2809, 2809)),
+  Box(Box(2810, 2810), Box(2810, 2810)),
+  Box(Box(2811, 2811), Box(2811, 2811)),
+  Box(Box(2812, 2812), Box(2812, 2812)),
+  Box(Box(2813, 2813), Box(2813, 2813)),
+  Box(Box(2814, 2814), Box(2814, 2814)),
+  Box(Box(2815, 2815), Box(2815, 2815)),
+  Box(Box(2816, 2816), Box(2816, 2816)),
+  Box(Box(2817, 2817), Box(2817, 2817)),
+  Box(Box(2818, 2818), Box(2818, 2818)),
+  Box(Box(2819, 2819), Box(2819, 2819)),
+  Box(Box(2820, 2820), Box(2820, 2820)),
+  Box(Box(2821, 2821), Box(2821, 2821)),
+  Box(Box(2822, 2822), Box(2822, 2822)),
+  Box(Box(2823, 2823), Box(2823, 2823)),
+  Box(Box(2824, 2824), Box(2824, 2824)),
+  Box(Box(2825, 2825), Box(2825, 2825)),
+  Box(Box(2826, 2826), Box(2826, 2826)),
+  Box(Box(2827, 2827), Box(2827, 2827)),
+  Box(Box(2828, 2828), Box(2828, 2828)),
+  Box(Box(2829, 2829), Box(2829, 2829)),
+  Box(Box(2830, 2830), Box(2830, 2830)),
+  Box(Box(2831, 2831), Box(2831, 2831)),
+  Box(Box(2832, 2832), Box(2832, 2832)),
+  Box(Box(2833, 2833), Box(2833, 2833)),
+  Box(Box(2834, 2834), Box(2834, 2834)),
+  Box(Box(2835, 2835), Box(2835, 2835)),
+  Box(Box(2836, 2836), Box(2836, 2836)),
+  Box(Box(2837, 2837), Box(2837, 2837)),
+  Box(Box(2838, 2838), Box(2838, 2838)),
+  Box(Box(2839, 2839), Box(2839, 2839)),
+  Box(Box(2840, 2840), Box(2840, 2840)),
+  Box(Box(2841, 2841), Box(2841, 2841)),
+  Box(Box(2842, 2842), Box(2842, 2842)),
+  Box(Box(2843, 2843), Box(2843, 2843)),
+  Box(Box(2844, 2844), Box(2844, 2844)),
+  Box(Box(2845, 2845), Box(2845, 2845)),
+  Box(Box(2846, 2846), Box(2846, 2846)),
+  Box(Box(2847, 2847), Box(2847, 2847)),
+  Box(Box(2848, 2848), Box(2848, 2848)),
+  Box(Box(2849, 2849), Box(2849, 2849)),
+  Box(Box(2850, 2850), Box(2850, 2850)),
+  Box(Box(2851, 2851), Box(2851, 2851)),
+  Box(Box(2852, 2852), Box(2852, 2852)),
+  Box(Box(2853, 2853), Box(2853, 2853)),
+  Box(Box(2854, 2854), Box(2854, 2854)),
+  Box(Box(2855, 2855), Box(2855, 2855)),
+  Box(Box(2856, 2856), Box(2856, 2856)),
+  Box(Box(2857, 2857), Box(2857, 2857)),
+  Box(Box(2858, 2858), Box(2858, 2858)),
+  Box(Box(2859, 2859), Box(2859, 2859)),
+  Box(Box(2860, 2860), Box(2860, 2860)),
+  Box(Box(2861, 2861), Box(2861, 2861)),
+  Box(Box(2862, 2862), Box(2862, 2862)),
+  Box(Box(2863, 2863), Box(2863, 2863)),
+  Box(Box(2864, 2864), Box(2864, 2864)),
+  Box(Box(2865, 2865), Box(2865, 2865)),
+  Box(Box(2866, 2866), Box(2866, 2866)),
+  Box(Box(2867, 2867), Box(2867, 2867)),
+  Box(Box(2868, 2868), Box(2868, 2868)),
+  Box(Box(2869, 2869), Box(2869, 2869)),
+  Box(Box(2870, 2870), Box(2870, 2870)),
+  Box(Box(2871, 2871), Box(2871, 2871)),
+  Box(Box(2872, 2872), Box(2872, 2872)),
+  Box(Box(2873, 2873), Box(2873, 2873)),
+  Box(Box(2874, 2874), Box(2874, 2874)),
+  Box(Box(2875, 2875), Box(2875, 2875)),
+  Box(Box(2876, 2876), Box(2876, 2876)),
+  Box(Box(2877, 2877), Box(2877, 2877)),
+  Box(Box(2878, 2878), Box(2878, 2878)),
+  Box(Box(2879, 2879), Box(2879, 2879)),
+  Box(Box(2880, 2880), Box(2880, 2880)),
+  Box(Box(2881, 2881), Box(2881, 2881)),
+  Box(Box(2882, 2882), Box(2882, 2882)),
+  Box(Box(2883, 2883), Box(2883, 2883)),
+  Box(Box(2884, 2884), Box(2884, 2884)),
+  Box(Box(2885, 2885), Box(2885, 2885)),
+  Box(Box(2886, 2886), Box(2886, 2886)),
+  Box(Box(2887, 2887), Box(2887, 2887)),
+  Box(Box(2888, 2888), Box(2888, 2888)),
+  Box(Box(2889, 2889), Box(2889, 2889)),
+  Box(Box(2890, 2890), Box(2890, 2890)),
+  Box(Box(2891, 2891), Box(2891, 2891)),
+  Box(Box(2892, 2892), Box(2892, 2892)),
+  Box(Box(2893, 2893), Box(2893, 2893)),
+  Box(Box(2894, 2894), Box(2894, 2894)),
+  Box(Box(2895, 2895), Box(2895, 2895)),
+  Box(Box(2896, 2896), Box(2896, 2896)),
+  Box(Box(2897, 2897), Box(2897, 2897)),
+  Box(Box(2898, 2898), Box(2898, 2898)),
+  Box(Box(2899, 2899), Box(2899, 2899)),
+  Box(Box(2900, 2900), Box(2900, 2900)),
+  Box(Box(2901, 2901), Box(2901, 2901)),
+  Box(Box(2902, 2902), Box(2902, 2902)),
+  Box(Box(2903, 2903), Box(2903, 2903)),
+  Box(Box(2904, 2904), Box(2904, 2904)),
+  Box(Box(2905, 2905), Box(2905, 2905)),
+  Box(Box(2906, 2906), Box(2906, 2906)),
+  Box(Box(2907, 2907), Box(2907, 2907)),
+  Box(Box(2908, 2908), Box(2908, 2908)),
+  Box(Box(2909, 2909), Box(2909, 2909)),
+  Box(Box(2910, 2910), Box(2910, 2910)),
+  Box(Box(2911, 2911), Box(2911, 2911)),
+  Box(Box(2912, 2912), Box(2912, 2912)),
+  Box(Box(2913, 2913), Box(2913, 2913)),
+  Box(Box(2914, 2914), Box(2914, 2914)),
+  Box(Box(2915, 2915), Box(2915, 2915)),
+  Box(Box(2916, 2916), Box(2916, 2916)),
+  Box(Box(2917, 2917), Box(2917, 2917)),
+  Box(Box(2918, 2918), Box(2918, 2918)),
+  Box(Box(2919, 2919), Box(2919, 2919)),
+  Box(Box(2920, 2920), Box(2920, 2920)),
+  Box(Box(2921, 2921), Box(2921, 2921)),
+  Box(Box(2922, 2922), Box(2922, 2922)),
+  Box(Box(2923, 2923), Box(2923, 2923)),
+  Box(Box(2924, 2924), Box(2924, 2924)),
+  Box(Box(2925, 2925), Box(2925, 2925)),
+  Box(Box(2926, 2926), Box(2926, 2926)),
+  Box(Box(2927, 2927), Box(2927, 2927)),
+  Box(Box(2928, 2928), Box(2928, 2928)),
+  Box(Box(2929, 2929), Box(2929, 2929)),
+  Box(Box(2930, 2930), Box(2930, 2930)),
+  Box(Box(2931, 2931), Box(2931, 2931)),
+  Box(Box(2932, 2932), Box(2932, 2932)),
+  Box(Box(2933, 2933), Box(2933, 2933)),
+  Box(Box(2934, 2934), Box(2934, 2934)),
+  Box(Box(2935, 2935), Box(2935, 2935)),
+  Box(Box(2936, 2936), Box(2936, 2936)),
+  Box(Box(2937, 2937), Box(2937, 2937)),
+  Box(Box(2938, 2938), Box(2938, 2938)),
+  Box(Box(2939, 2939), Box(2939, 2939)),
+  Box(Box(2940, 2940), Box(2940, 2940)),
+  Box(Box(2941, 2941), Box(2941, 2941)),
+  Box(Box(2942, 2942), Box(2942, 2942)),
+  Box(Box(2943, 2943), Box(2943, 2943)),
+  Box(Box(2944, 2944), Box(2944, 2944)),
+  Box(Box(2945, 2945), Box(2945, 2945)),
+  Box(Box(2946, 2946), Box(2946, 2946)),
+  Box(Box(2947, 2947), Box(2947, 2947)),
+  Box(Box(2948, 2948), Box(2948, 2948)),
+  Box(Box(2949, 2949), Box(2949, 2949)),
+  Box(Box(2950, 2950), Box(2950, 2950)),
+  Box(Box(2951, 2951), Box(2951, 2951)),
+  Box(Box(2952, 2952), Box(2952, 2952)),
+  Box(Box(2953, 2953), Box(2953, 2953)),
+  Box(Box(2954, 2954), Box(2954, 2954)),
+  Box(Box(2955, 2955), Box(2955, 2955)),
+  Box(Box(2956, 2956), Box(2956, 2956)),
+  Box(Box(2957, 2957), Box(2957, 2957)),
+  Box(Box(2958, 2958), Box(2958, 2958)),
+  Box(Box(2959, 2959), Box(2959, 2959)),
+  Box(Box(2960, 2960), Box(2960, 2960)),
+  Box(Box(2961, 2961), Box(2961, 2961)),
+  Box(Box(2962, 2962), Box(2962, 2962)),
+  Box(Box(2963, 2963), Box(2963, 2963)),
+  Box(Box(2964, 2964), Box(2964, 2964)),
+  Box(Box(2965, 2965), Box(2965, 2965)),
+  Box(Box(2966, 2966), Box(2966, 2966)),
+  Box(Box(2967, 2967), Box(2967, 2967)),
+  Box(Box(2968, 2968), Box(2968, 2968)),
+  Box(Box(2969, 2969), Box(2969, 2969)),
+  Box(Box(2970, 2970), Box(2970, 2970)),
+  Box(Box(2971, 2971), Box(2971, 2971)),
+  Box(Box(2972, 2972), Box(2972, 2972)),
+  Box(Box(2973, 2973), Box(2973, 2973)),
+  Box(Box(2974, 2974), Box(2974, 2974)),
+  Box(Box(2975, 2975), Box(2975, 2975)),
+  Box(Box(2976, 2976), Box(2976, 2976)),
+  Box(Box(2977, 2977), Box(2977, 2977)),
+  Box(Box(2978, 2978), Box(2978, 2978)),
+  Box(Box(2979, 2979), Box(2979, 2979)),
+  Box(Box(2980, 2980), Box(2980, 2980)),
+  Box(Box(2981, 2981), Box(2981, 2981)),
+  Box(Box(2982, 2982), Box(2982, 2982)),
+  Box(Box(2983, 2983), Box(2983, 2983)),
+  Box(Box(2984, 2984), Box(2984, 2984)),
+  Box(Box(2985, 2985), Box(2985, 2985)),
+  Box(Box(2986, 2986), Box(2986, 2986)),
+  Box(Box(2987, 2987), Box(2987, 2987)),
+  Box(Box(2988, 2988), Box(2988, 2988)),
+  Box(Box(2989, 2989), Box(2989, 2989)),
+  Box(Box(2990, 2990), Box(2990, 2990)),
+  Box(Box(2991, 2991), Box(2991, 2991)),
+  Box(Box(2992, 2992), Box(2992, 2992)),
+  Box(Box(2993, 2993), Box(2993, 2993)),
+  Box(Box(2994, 2994), Box(2994, 2994)),
+  Box(Box(2995, 2995), Box(2995, 2995)),
+  Box(Box(2996, 2996), Box(2996, 2996)),
+  Box(Box(2997, 2997), Box(2997, 2997)),
+  Box(Box(2998, 2998), Box(2998, 2998)),
+  Box(Box(2999, 2999), Box(2999, 2999)),
+  Box(Box(3000, 3000), Box(3000, 3000)),
+  Box(Box(3001, 3001), Box(3001, 3001)),
+  Box(Box(3002, 3002), Box(3002, 3002)),
+  Box(Box(3003, 3003), Box(3003, 3003)),
+  Box(Box(3004, 3004), Box(3004, 3004)),
+  Box(Box(3005, 3005), Box(3005, 3005)),
+  Box(Box(3006, 3006), Box(3006, 3006)),
+  Box(Box(3007, 3007), Box(3007, 3007)),
+  Box(Box(3008, 3008), Box(3008, 3008)),
+  Box(Box(3009, 3009), Box(3009, 3009)),
+  Box(Box(3010, 3010), Box(3010, 3010)),
+  Box(Box(3011, 3011), Box(3011, 3011)),
+  Box(Box(3012, 3012), Box(3012, 3012)),
+  Box(Box(3013, 3013), Box(3013, 3013)),
+  Box(Box(3014, 3014), Box(3014, 3014)),
+  Box(Box(3015, 3015), Box(3015, 3015)),
+  Box(Box(3016, 3016), Box(3016, 3016)),
+  Box(Box(3017, 3017), Box(3017, 3017)),
+  Box(Box(3018, 3018), Box(3018, 3018)),
+  Box(Box(3019, 3019), Box(3019, 3019)),
+  Box(Box(3020, 3020), Box(3020, 3020)),
+  Box(Box(3021, 3021), Box(3021, 3021)),
+  Box(Box(3022, 3022), Box(3022, 3022)),
+  Box(Box(3023, 3023), Box(3023, 3023)),
+  Box(Box(3024, 3024), Box(3024, 3024)),
+  Box(Box(3025, 3025), Box(3025, 3025)),
+  Box(Box(3026, 3026), Box(3026, 3026)),
+  Box(Box(3027, 3027), Box(3027, 3027)),
+  Box(Box(3028, 3028), Box(3028, 3028)),
+  Box(Box(3029, 3029), Box(3029, 3029)),
+  Box(Box(3030, 3030), Box(3030, 3030)),
+  Box(Box(3031, 3031), Box(3031, 3031)),
+  Box(Box(3032, 3032), Box(3032, 3032)),
+  Box(Box(3033, 3033), Box(3033, 3033)),
+  Box(Box(3034, 3034), Box(3034, 3034)),
+  Box(Box(3035, 3035), Box(3035, 3035)),
+  Box(Box(3036, 3036), Box(3036, 3036)),
+  Box(Box(3037, 3037), Box(3037, 3037)),
+  Box(Box(3038, 3038), Box(3038, 3038)),
+  Box(Box(3039, 3039), Box(3039, 3039)),
+  Box(Box(3040, 3040), Box(3040, 3040)),
+  Box(Box(3041, 3041), Box(3041, 3041)),
+  Box(Box(3042, 3042), Box(3042, 3042)),
+  Box(Box(3043, 3043), Box(3043, 3043)),
+  Box(Box(3044, 3044), Box(3044, 3044)),
+  Box(Box(3045, 3045), Box(3045, 3045)),
+  Box(Box(3046, 3046), Box(3046, 3046)),
+  Box(Box(3047, 3047), Box(3047, 3047)),
+  Box(Box(3048, 3048), Box(3048, 3048)),
+  Box(Box(3049, 3049), Box(3049, 3049)),
+  Box(Box(3050, 3050), Box(3050, 3050)),
+  Box(Box(3051, 3051), Box(3051, 3051)),
+  Box(Box(3052, 3052), Box(3052, 3052)),
+  Box(Box(3053, 3053), Box(3053, 3053)),
+  Box(Box(3054, 3054), Box(3054, 3054)),
+  Box(Box(3055, 3055), Box(3055, 3055)),
+  Box(Box(3056, 3056), Box(3056, 3056)),
+  Box(Box(3057, 3057), Box(3057, 3057)),
+  Box(Box(3058, 3058), Box(3058, 3058)),
+  Box(Box(3059, 3059), Box(3059, 3059)),
+  Box(Box(3060, 3060), Box(3060, 3060)),
+  Box(Box(3061, 3061), Box(3061, 3061)),
+  Box(Box(3062, 3062), Box(3062, 3062)),
+  Box(Box(3063, 3063), Box(3063, 3063)),
+  Box(Box(3064, 3064), Box(3064, 3064)),
+  Box(Box(3065, 3065), Box(3065, 3065)),
+  Box(Box(3066, 3066), Box(3066, 3066)),
+  Box(Box(3067, 3067), Box(3067, 3067)),
+  Box(Box(3068, 3068), Box(3068, 3068)),
+  Box(Box(3069, 3069), Box(3069, 3069)),
+  Box(Box(3070, 3070), Box(3070, 3070)),
+  Box(Box(3071, 3071), Box(3071, 3071)),
+  Box(Box(3072, 3072), Box(3072, 3072)),
+  Box(Box(3073, 3073), Box(3073, 3073)),
+  Box(Box(3074, 3074), Box(3074, 3074)),
+  Box(Box(3075, 3075), Box(3075, 3075)),
+  Box(Box(3076, 3076), Box(3076, 3076)),
+  Box(Box(3077, 3077), Box(3077, 3077)),
+  Box(Box(3078, 3078), Box(3078, 3078)),
+  Box(Box(3079, 3079), Box(3079, 3079)),
+  Box(Box(3080, 3080), Box(3080, 3080)),
+  Box(Box(3081, 3081), Box(3081, 3081)),
+  Box(Box(3082, 3082), Box(3082, 3082)),
+  Box(Box(3083, 3083), Box(3083, 3083)),
+  Box(Box(3084, 3084), Box(3084, 3084)),
+  Box(Box(3085, 3085), Box(3085, 3085)),
+  Box(Box(3086, 3086), Box(3086, 3086)),
+  Box(Box(3087, 3087), Box(3087, 3087)),
+  Box(Box(3088, 3088), Box(3088, 3088)),
+  Box(Box(3089, 3089), Box(3089, 3089)),
+  Box(Box(3090, 3090), Box(3090, 3090)),
+  Box(Box(3091, 3091), Box(3091, 3091)),
+  Box(Box(3092, 3092), Box(3092, 3092)),
+  Box(Box(3093, 3093), Box(3093, 3093)),
+  Box(Box(3094, 3094), Box(3094, 3094)),
+  Box(Box(3095, 3095), Box(3095, 3095)),
+  Box(Box(3096, 3096), Box(3096, 3096)),
+  Box(Box(3097, 3097), Box(3097, 3097)),
+  Box(Box(3098, 3098), Box(3098, 3098)),
+  Box(Box(3099, 3099), Box(3099, 3099)),
+  Box(Box(3100, 3100), Box(3100, 3100)),
+  Box(Box(3101, 3101), Box(3101, 3101)),
+  Box(Box(3102, 3102), Box(3102, 3102)),
+  Box(Box(3103, 3103), Box(3103, 3103)),
+  Box(Box(3104, 3104), Box(3104, 3104)),
+  Box(Box(3105, 3105), Box(3105, 3105)),
+  Box(Box(3106, 3106), Box(3106, 3106)),
+  Box(Box(3107, 3107), Box(3107, 3107)),
+  Box(Box(3108, 3108), Box(3108, 3108)),
+  Box(Box(3109, 3109), Box(3109, 3109)),
+  Box(Box(3110, 3110), Box(3110, 3110)),
+  Box(Box(3111, 3111), Box(3111, 3111)),
+  Box(Box(3112, 3112), Box(3112, 3112)),
+  Box(Box(3113, 3113), Box(3113, 3113)),
+  Box(Box(3114, 3114), Box(3114, 3114)),
+  Box(Box(3115, 3115), Box(3115, 3115)),
+  Box(Box(3116, 3116), Box(3116, 3116)),
+  Box(Box(3117, 3117), Box(3117, 3117)),
+  Box(Box(3118, 3118), Box(3118, 3118)),
+  Box(Box(3119, 3119), Box(3119, 3119)),
+  Box(Box(3120, 3120), Box(3120, 3120)),
+  Box(Box(3121, 3121), Box(3121, 3121)),
+  Box(Box(3122, 3122), Box(3122, 3122)),
+  Box(Box(3123, 3123), Box(3123, 3123)),
+  Box(Box(3124, 3124), Box(3124, 3124)),
+  Box(Box(3125, 3125), Box(3125, 3125)),
+  Box(Box(3126, 3126), Box(3126, 3126)),
+  Box(Box(3127, 3127), Box(3127, 3127)),
+  Box(Box(3128, 3128), Box(3128, 3128)),
+  Box(Box(3129, 3129), Box(3129, 3129)),
+  Box(Box(3130, 3130), Box(3130, 3130)),
+  Box(Box(3131, 3131), Box(3131, 3131)),
+  Box(Box(3132, 3132), Box(3132, 3132)),
+  Box(Box(3133, 3133), Box(3133, 3133)),
+  Box(Box(3134, 3134), Box(3134, 3134)),
+  Box(Box(3135, 3135), Box(3135, 3135)),
+  Box(Box(3136, 3136), Box(3136, 3136)),
+  Box(Box(3137, 3137), Box(3137, 3137)),
+  Box(Box(3138, 3138), Box(3138, 3138)),
+  Box(Box(3139, 3139), Box(3139, 3139)),
+  Box(Box(3140, 3140), Box(3140, 3140)),
+  Box(Box(3141, 3141), Box(3141, 3141)),
+  Box(Box(3142, 3142), Box(3142, 3142)),
+  Box(Box(3143, 3143), Box(3143, 3143)),
+  Box(Box(3144, 3144), Box(3144, 3144)),
+  Box(Box(3145, 3145), Box(3145, 3145)),
+  Box(Box(3146, 3146), Box(3146, 3146)),
+  Box(Box(3147, 3147), Box(3147, 3147)),
+  Box(Box(3148, 3148), Box(3148, 3148)),
+  Box(Box(3149, 3149), Box(3149, 3149)),
+  Box(Box(3150, 3150), Box(3150, 3150)),
+  Box(Box(3151, 3151), Box(3151, 3151)),
+  Box(Box(3152, 3152), Box(3152, 3152)),
+  Box(Box(3153, 3153), Box(3153, 3153)),
+  Box(Box(3154, 3154), Box(3154, 3154)),
+  Box(Box(3155, 3155), Box(3155, 3155)),
+  Box(Box(3156, 3156), Box(3156, 3156)),
+  Box(Box(3157, 3157), Box(3157, 3157)),
+  Box(Box(3158, 3158), Box(3158, 3158)),
+  Box(Box(3159, 3159), Box(3159, 3159)),
+  Box(Box(3160, 3160), Box(3160, 3160)),
+  Box(Box(3161, 3161), Box(3161, 3161)),
+  Box(Box(3162, 3162), Box(3162, 3162)),
+  Box(Box(3163, 3163), Box(3163, 3163)),
+  Box(Box(3164, 3164), Box(3164, 3164)),
+  Box(Box(3165, 3165), Box(3165, 3165)),
+  Box(Box(3166, 3166), Box(3166, 3166)),
+  Box(Box(3167, 3167), Box(3167, 3167)),
+  Box(Box(3168, 3168), Box(3168, 3168)),
+  Box(Box(3169, 3169), Box(3169, 3169)),
+  Box(Box(3170, 3170), Box(3170, 3170)),
+  Box(Box(3171, 3171), Box(3171, 3171)),
+  Box(Box(3172, 3172), Box(3172, 3172)),
+  Box(Box(3173, 3173), Box(3173, 3173)),
+  Box(Box(3174, 3174), Box(3174, 3174)),
+  Box(Box(3175, 3175), Box(3175, 3175)),
+  Box(Box(3176, 3176), Box(3176, 3176)),
+  Box(Box(3177, 3177), Box(3177, 3177)),
+  Box(Box(3178, 3178), Box(3178, 3178)),
+  Box(Box(3179, 3179), Box(3179, 3179)),
+  Box(Box(3180, 3180), Box(3180, 3180)),
+  Box(Box(3181, 3181), Box(3181, 3181)),
+  Box(Box(3182, 3182), Box(3182, 3182)),
+  Box(Box(3183, 3183), Box(3183, 3183)),
+  Box(Box(3184, 3184), Box(3184, 3184)),
+  Box(Box(3185, 3185), Box(3185, 3185)),
+  Box(Box(3186, 3186), Box(3186, 3186)),
+  Box(Box(3187, 3187), Box(3187, 3187)),
+  Box(Box(3188, 3188), Box(3188, 3188)),
+  Box(Box(3189, 3189), Box(3189, 3189)),
+  Box(Box(3190, 3190), Box(3190, 3190)),
+  Box(Box(3191, 3191), Box(3191, 3191)),
+  Box(Box(3192, 3192), Box(3192, 3192)),
+  Box(Box(3193, 3193), Box(3193, 3193)),
+  Box(Box(3194, 3194), Box(3194, 3194)),
+  Box(Box(3195, 3195), Box(3195, 3195)),
+  Box(Box(3196, 3196), Box(3196, 3196)),
+  Box(Box(3197, 3197), Box(3197, 3197)),
+  Box(Box(3198, 3198), Box(3198, 3198)),
+  Box(Box(3199, 3199), Box(3199, 3199)),
+  Box(Box(3200, 3200), Box(3200, 3200)),
+  Box(Box(3201, 3201), Box(3201, 3201)),
+  Box(Box(3202, 3202), Box(3202, 3202)),
+  Box(Box(3203, 3203), Box(3203, 3203)),
+  Box(Box(3204, 3204), Box(3204, 3204)),
+  Box(Box(3205, 3205), Box(3205, 3205)),
+  Box(Box(3206, 3206), Box(3206, 3206)),
+  Box(Box(3207, 3207), Box(3207, 3207)),
+  Box(Box(3208, 3208), Box(3208, 3208)),
+  Box(Box(3209, 3209), Box(3209, 3209)),
+  Box(Box(3210, 3210), Box(3210, 3210)),
+  Box(Box(3211, 3211), Box(3211, 3211)),
+  Box(Box(3212, 3212), Box(3212, 3212)),
+  Box(Box(3213, 3213), Box(3213, 3213)),
+  Box(Box(3214, 3214), Box(3214, 3214)),
+  Box(Box(3215, 3215), Box(3215, 3215)),
+  Box(Box(3216, 3216), Box(3216, 3216)),
+  Box(Box(3217, 3217), Box(3217, 3217)),
+  Box(Box(3218, 3218), Box(3218, 3218)),
+  Box(Box(3219, 3219), Box(3219, 3219)),
+  Box(Box(3220, 3220), Box(3220, 3220)),
+  Box(Box(3221, 3221), Box(3221, 3221)),
+  Box(Box(3222, 3222), Box(3222, 3222)),
+  Box(Box(3223, 3223), Box(3223, 3223)),
+  Box(Box(3224, 3224), Box(3224, 3224)),
+  Box(Box(3225, 3225), Box(3225, 3225)),
+  Box(Box(3226, 3226), Box(3226, 3226)),
+  Box(Box(3227, 3227), Box(3227, 3227)),
+  Box(Box(3228, 3228), Box(3228, 3228)),
+  Box(Box(3229, 3229), Box(3229, 3229)),
+  Box(Box(3230, 3230), Box(3230, 3230)),
+  Box(Box(3231, 3231), Box(3231, 3231)),
+  Box(Box(3232, 3232), Box(3232, 3232)),
+  Box(Box(3233, 3233), Box(3233, 3233)),
+  Box(Box(3234, 3234), Box(3234, 3234)),
+  Box(Box(3235, 3235), Box(3235, 3235)),
+  Box(Box(3236, 3236), Box(3236, 3236)),
+  Box(Box(3237, 3237), Box(3237, 3237)),
+  Box(Box(3238, 3238), Box(3238, 3238)),
+  Box(Box(3239, 3239), Box(3239, 3239)),
+  Box(Box(3240, 3240), Box(3240, 3240)),
+  Box(Box(3241, 3241), Box(3241, 3241)),
+  Box(Box(3242, 3242), Box(3242, 3242)),
+  Box(Box(3243, 3243), Box(3243, 3243)),
+  Box(Box(3244, 3244), Box(3244, 3244)),
+  Box(Box(3245, 3245), Box(3245, 3245)),
+  Box(Box(3246, 3246), Box(3246, 3246)),
+  Box(Box(3247, 3247), Box(3247, 3247)),
+  Box(Box(3248, 3248), Box(3248, 3248)),
+  Box(Box(3249, 3249), Box(3249, 3249)),
+  Box(Box(3250, 3250), Box(3250, 3250)),
+  Box(Box(3251, 3251), Box(3251, 3251)),
+  Box(Box(3252, 3252), Box(3252, 3252)),
+  Box(Box(3253, 3253), Box(3253, 3253)),
+  Box(Box(3254, 3254), Box(3254, 3254)),
+  Box(Box(3255, 3255), Box(3255, 3255)),
+  Box(Box(3256, 3256), Box(3256, 3256)),
+  Box(Box(3257, 3257), Box(3257, 3257)),
+  Box(Box(3258, 3258), Box(3258, 3258)),
+  Box(Box(3259, 3259), Box(3259, 3259)),
+  Box(Box(3260, 3260), Box(3260, 3260)),
+  Box(Box(3261, 3261), Box(3261, 3261)),
+  Box(Box(3262, 3262), Box(3262, 3262)),
+  Box(Box(3263, 3263), Box(3263, 3263)),
+  Box(Box(3264, 3264), Box(3264, 3264)),
+  Box(Box(3265, 3265), Box(3265, 3265)),
+  Box(Box(3266, 3266), Box(3266, 3266)),
+  Box(Box(3267, 3267), Box(3267, 3267)),
+  Box(Box(3268, 3268), Box(3268, 3268)),
+  Box(Box(3269, 3269), Box(3269, 3269)),
+  Box(Box(3270, 3270), Box(3270, 3270)),
+  Box(Box(3271, 3271), Box(3271, 3271)),
+  Box(Box(3272, 3272), Box(3272, 3272)),
+  Box(Box(3273, 3273), Box(3273, 3273)),
+  Box(Box(3274, 3274), Box(3274, 3274)),
+  Box(Box(3275, 3275), Box(3275, 3275)),
+  Box(Box(3276, 3276), Box(3276, 3276)),
+  Box(Box(3277, 3277), Box(3277, 3277)),
+  Box(Box(3278, 3278), Box(3278, 3278)),
+  Box(Box(3279, 3279), Box(3279, 3279)),
+  Box(Box(3280, 3280), Box(3280, 3280)),
+  Box(Box(3281, 3281), Box(3281, 3281)),
+  Box(Box(3282, 3282), Box(3282, 3282)),
+  Box(Box(3283, 3283), Box(3283, 3283)),
+  Box(Box(3284, 3284), Box(3284, 3284)),
+  Box(Box(3285, 3285), Box(3285, 3285)),
+  Box(Box(3286, 3286), Box(3286, 3286)),
+  Box(Box(3287, 3287), Box(3287, 3287)),
+  Box(Box(3288, 3288), Box(3288, 3288)),
+  Box(Box(3289, 3289), Box(3289, 3289)),
+  Box(Box(3290, 3290), Box(3290, 3290)),
+  Box(Box(3291, 3291), Box(3291, 3291)),
+  Box(Box(3292, 3292), Box(3292, 3292)),
+  Box(Box(3293, 3293), Box(3293, 3293)),
+  Box(Box(3294, 3294), Box(3294, 3294)),
+  Box(Box(3295, 3295), Box(3295, 3295)),
+  Box(Box(3296, 3296), Box(3296, 3296)),
+  Box(Box(3297, 3297), Box(3297, 3297)),
+  Box(Box(3298, 3298), Box(3298, 3298)),
+  Box(Box(3299, 3299), Box(3299, 3299)),
+  Box(Box(3300, 3300), Box(3300, 3300)),
+  Box(Box(3301, 3301), Box(3301, 3301)),
+  Box(Box(3302, 3302), Box(3302, 3302)),
+  Box(Box(3303, 3303), Box(3303, 3303)),
+  Box(Box(3304, 3304), Box(3304, 3304)),
+  Box(Box(3305, 3305), Box(3305, 3305)),
+  Box(Box(3306, 3306), Box(3306, 3306)),
+  Box(Box(3307, 3307), Box(3307, 3307)),
+  Box(Box(3308, 3308), Box(3308, 3308)),
+  Box(Box(3309, 3309), Box(3309, 3309)),
+  Box(Box(3310, 3310), Box(3310, 3310)),
+  Box(Box(3311, 3311), Box(3311, 3311)),
+  Box(Box(3312, 3312), Box(3312, 3312)),
+  Box(Box(3313, 3313), Box(3313, 3313)),
+  Box(Box(3314, 3314), Box(3314, 3314)),
+  Box(Box(3315, 3315), Box(3315, 3315)),
+  Box(Box(3316, 3316), Box(3316, 3316)),
+  Box(Box(3317, 3317), Box(3317, 3317)),
+  Box(Box(3318, 3318), Box(3318, 3318)),
+  Box(Box(3319, 3319), Box(3319, 3319)),
+  Box(Box(3320, 3320), Box(3320, 3320)),
+  Box(Box(3321, 3321), Box(3321, 3321)),
+  Box(Box(3322, 3322), Box(3322, 3322)),
+  Box(Box(3323, 3323), Box(3323, 3323)),
+  Box(Box(3324, 3324), Box(3324, 3324)),
+  Box(Box(3325, 3325), Box(3325, 3325)),
+  Box(Box(3326, 3326), Box(3326, 3326)),
+  Box(Box(3327, 3327), Box(3327, 3327)),
+  Box(Box(3328, 3328), Box(3328, 3328)),
+  Box(Box(3329, 3329), Box(3329, 3329)),
+  Box(Box(3330, 3330), Box(3330, 3330)),
+  Box(Box(3331, 3331), Box(3331, 3331)),
+  Box(Box(3332, 3332), Box(3332, 3332)),
+  Box(Box(3333, 3333), Box(3333, 3333)),
+  Box(Box(3334, 3334), Box(3334, 3334)),
+  Box(Box(3335, 3335), Box(3335, 3335)),
+  Box(Box(3336, 3336), Box(3336, 3336)),
+  Box(Box(3337, 3337), Box(3337, 3337)),
+  Box(Box(3338, 3338), Box(3338, 3338)),
+  Box(Box(3339, 3339), Box(3339, 3339)),
+  Box(Box(3340, 3340), Box(3340, 3340)),
+  Box(Box(3341, 3341), Box(3341, 3341)),
+  Box(Box(3342, 3342), Box(3342, 3342)),
+  Box(Box(3343, 3343), Box(3343, 3343)),
+  Box(Box(3344, 3344), Box(3344, 3344)),
+  Box(Box(3345, 3345), Box(3345, 3345)),
+  Box(Box(3346, 3346), Box(3346, 3346)),
+  Box(Box(3347, 3347), Box(3347, 3347)),
+  Box(Box(3348, 3348), Box(3348, 3348)),
+  Box(Box(3349, 3349), Box(3349, 3349)),
+  Box(Box(3350, 3350), Box(3350, 3350)),
+  Box(Box(3351, 3351), Box(3351, 3351)),
+  Box(Box(3352, 3352), Box(3352, 3352)),
+  Box(Box(3353, 3353), Box(3353, 3353)),
+  Box(Box(3354, 3354), Box(3354, 3354)),
+  Box(Box(3355, 3355), Box(3355, 3355)),
+  Box(Box(3356, 3356), Box(3356, 3356)),
+  Box(Box(3357, 3357), Box(3357, 3357)),
+  Box(Box(3358, 3358), Box(3358, 3358)),
+  Box(Box(3359, 3359), Box(3359, 3359)),
+  Box(Box(3360, 3360), Box(3360, 3360)),
+  Box(Box(3361, 3361), Box(3361, 3361)),
+  Box(Box(3362, 3362), Box(3362, 3362)),
+  Box(Box(3363, 3363), Box(3363, 3363)),
+  Box(Box(3364, 3364), Box(3364, 3364)),
+  Box(Box(3365, 3365), Box(3365, 3365)),
+  Box(Box(3366, 3366), Box(3366, 3366)),
+  Box(Box(3367, 3367), Box(3367, 3367)),
+  Box(Box(3368, 3368), Box(3368, 3368)),
+  Box(Box(3369, 3369), Box(3369, 3369)),
+  Box(Box(3370, 3370), Box(3370, 3370)),
+  Box(Box(3371, 3371), Box(3371, 3371)),
+  Box(Box(3372, 3372), Box(3372, 3372)),
+  Box(Box(3373, 3373), Box(3373, 3373)),
+  Box(Box(3374, 3374), Box(3374, 3374)),
+  Box(Box(3375, 3375), Box(3375, 3375)),
+  Box(Box(3376, 3376), Box(3376, 3376)),
+  Box(Box(3377, 3377), Box(3377, 3377)),
+  Box(Box(3378, 3378), Box(3378, 3378)),
+  Box(Box(3379, 3379), Box(3379, 3379)),
+  Box(Box(3380, 3380), Box(3380, 3380)),
+  Box(Box(3381, 3381), Box(3381, 3381)),
+  Box(Box(3382, 3382), Box(3382, 3382)),
+  Box(Box(3383, 3383), Box(3383, 3383)),
+  Box(Box(3384, 3384), Box(3384, 3384)),
+  Box(Box(3385, 3385), Box(3385, 3385)),
+  Box(Box(3386, 3386), Box(3386, 3386)),
+  Box(Box(3387, 3387), Box(3387, 3387)),
+  Box(Box(3388, 3388), Box(3388, 3388)),
+  Box(Box(3389, 3389), Box(3389, 3389)),
+  Box(Box(3390, 3390), Box(3390, 3390)),
+  Box(Box(3391, 3391), Box(3391, 3391)),
+  Box(Box(3392, 3392), Box(3392, 3392)),
+  Box(Box(3393, 3393), Box(3393, 3393)),
+  Box(Box(3394, 3394), Box(3394, 3394)),
+  Box(Box(3395, 3395), Box(3395, 3395)),
+  Box(Box(3396, 3396), Box(3396, 3396)),
+  Box(Box(3397, 3397), Box(3397, 3397)),
+  Box(Box(3398, 3398), Box(3398, 3398)),
+  Box(Box(3399, 3399), Box(3399, 3399)),
+  Box(Box(3400, 3400), Box(3400, 3400)),
+  Box(Box(3401, 3401), Box(3401, 3401)),
+  Box(Box(3402, 3402), Box(3402, 3402)),
+  Box(Box(3403, 3403), Box(3403, 3403)),
+  Box(Box(3404, 3404), Box(3404, 3404)),
+  Box(Box(3405, 3405), Box(3405, 3405)),
+  Box(Box(3406, 3406), Box(3406, 3406)),
+  Box(Box(3407, 3407), Box(3407, 3407)),
+  Box(Box(3408, 3408), Box(3408, 3408)),
+  Box(Box(3409, 3409), Box(3409, 3409)),
+  Box(Box(3410, 3410), Box(3410, 3410)),
+  Box(Box(3411, 3411), Box(3411, 3411)),
+  Box(Box(3412, 3412), Box(3412, 3412)),
+  Box(Box(3413, 3413), Box(3413, 3413)),
+  Box(Box(3414, 3414), Box(3414, 3414)),
+  Box(Box(3415, 3415), Box(3415, 3415)),
+  Box(Box(3416, 3416), Box(3416, 3416)),
+  Box(Box(3417, 3417), Box(3417, 3417)),
+  Box(Box(3418, 3418), Box(3418, 3418)),
+  Box(Box(3419, 3419), Box(3419, 3419)),
+  Box(Box(3420, 3420), Box(3420, 3420)),
+  Box(Box(3421, 3421), Box(3421, 3421)),
+  Box(Box(3422, 3422), Box(3422, 3422)),
+  Box(Box(3423, 3423), Box(3423, 3423)),
+  Box(Box(3424, 3424), Box(3424, 3424)),
+  Box(Box(3425, 3425), Box(3425, 3425)),
+  Box(Box(3426, 3426), Box(3426, 3426)),
+  Box(Box(3427, 3427), Box(3427, 3427)),
+  Box(Box(3428, 3428), Box(3428, 3428)),
+  Box(Box(3429, 3429), Box(3429, 3429)),
+  Box(Box(3430, 3430), Box(3430, 3430)),
+  Box(Box(3431, 3431), Box(3431, 3431)),
+  Box(Box(3432, 3432), Box(3432, 3432)),
+  Box(Box(3433, 3433), Box(3433, 3433)),
+  Box(Box(3434, 3434), Box(3434, 3434)),
+  Box(Box(3435, 3435), Box(3435, 3435)),
+  Box(Box(3436, 3436), Box(3436, 3436)),
+  Box(Box(3437, 3437), Box(3437, 3437)),
+  Box(Box(3438, 3438), Box(3438, 3438)),
+  Box(Box(3439, 3439), Box(3439, 3439)),
+  Box(Box(3440, 3440), Box(3440, 3440)),
+  Box(Box(3441, 3441), Box(3441, 3441)),
+  Box(Box(3442, 3442), Box(3442, 3442)),
+  Box(Box(3443, 3443), Box(3443, 3443)),
+  Box(Box(3444, 3444), Box(3444, 3444)),
+  Box(Box(3445, 3445), Box(3445, 3445)),
+  Box(Box(3446, 3446), Box(3446, 3446)),
+  Box(Box(3447, 3447), Box(3447, 3447)),
+  Box(Box(3448, 3448), Box(3448, 3448)),
+  Box(Box(3449, 3449), Box(3449, 3449)),
+  Box(Box(3450, 3450), Box(3450, 3450)),
+  Box(Box(3451, 3451), Box(3451, 3451)),
+  Box(Box(3452, 3452), Box(3452, 3452)),
+  Box(Box(3453, 3453), Box(3453, 3453)),
+  Box(Box(3454, 3454), Box(3454, 3454)),
+  Box(Box(3455, 3455), Box(3455, 3455)),
+  Box(Box(3456, 3456), Box(3456, 3456)),
+  Box(Box(3457, 3457), Box(3457, 3457)),
+  Box(Box(3458, 3458), Box(3458, 3458)),
+  Box(Box(3459, 3459), Box(3459, 3459)),
+  Box(Box(3460, 3460), Box(3460, 3460)),
+  Box(Box(3461, 3461), Box(3461, 3461)),
+  Box(Box(3462, 3462), Box(3462, 3462)),
+  Box(Box(3463, 3463), Box(3463, 3463)),
+  Box(Box(3464, 3464), Box(3464, 3464)),
+  Box(Box(3465, 3465), Box(3465, 3465)),
+  Box(Box(3466, 3466), Box(3466, 3466)),
+  Box(Box(3467, 3467), Box(3467, 3467)),
+  Box(Box(3468, 3468), Box(3468, 3468)),
+  Box(Box(3469, 3469), Box(3469, 3469)),
+  Box(Box(3470, 3470), Box(3470, 3470)),
+  Box(Box(3471, 3471), Box(3471, 3471)),
+  Box(Box(3472, 3472), Box(3472, 3472)),
+  Box(Box(3473, 3473), Box(3473, 3473)),
+  Box(Box(3474, 3474), Box(3474, 3474)),
+  Box(Box(3475, 3475), Box(3475, 3475)),
+  Box(Box(3476, 3476), Box(3476, 3476)),
+  Box(Box(3477, 3477), Box(3477, 3477)),
+  Box(Box(3478, 3478), Box(3478, 3478)),
+  Box(Box(3479, 3479), Box(3479, 3479)),
+  Box(Box(3480, 3480), Box(3480, 3480)),
+  Box(Box(3481, 3481), Box(3481, 3481)),
+  Box(Box(3482, 3482), Box(3482, 3482)),
+  Box(Box(3483, 3483), Box(3483, 3483)),
+  Box(Box(3484, 3484), Box(3484, 3484)),
+  Box(Box(3485, 3485), Box(3485, 3485)),
+  Box(Box(3486, 3486), Box(3486, 3486)),
+  Box(Box(3487, 3487), Box(3487, 3487)),
+  Box(Box(3488, 3488), Box(3488, 3488)),
+  Box(Box(3489, 3489), Box(3489, 3489)),
+  Box(Box(3490, 3490), Box(3490, 3490)),
+  Box(Box(3491, 3491), Box(3491, 3491)),
+  Box(Box(3492, 3492), Box(3492, 3492)),
+  Box(Box(3493, 3493), Box(3493, 3493)),
+  Box(Box(3494, 3494), Box(3494, 3494)),
+  Box(Box(3495, 3495), Box(3495, 3495)),
+  Box(Box(3496, 3496), Box(3496, 3496)),
+  Box(Box(3497, 3497), Box(3497, 3497)),
+  Box(Box(3498, 3498), Box(3498, 3498)),
+  Box(Box(3499, 3499), Box(3499, 3499)),
+  Box(Box(3500, 3500), Box(3500, 3500)),
+  Box(Box(3501, 3501), Box(3501, 3501)),
+  Box(Box(3502, 3502), Box(3502, 3502)),
+  Box(Box(3503, 3503), Box(3503, 3503)),
+  Box(Box(3504, 3504), Box(3504, 3504)),
+  Box(Box(3505, 3505), Box(3505, 3505)),
+  Box(Box(3506, 3506), Box(3506, 3506)),
+  Box(Box(3507, 3507), Box(3507, 3507)),
+  Box(Box(3508, 3508), Box(3508, 3508)),
+  Box(Box(3509, 3509), Box(3509, 3509)),
+  Box(Box(3510, 3510), Box(3510, 3510)),
+  Box(Box(3511, 3511), Box(3511, 3511)),
+  Box(Box(3512, 3512), Box(3512, 3512)),
+  Box(Box(3513, 3513), Box(3513, 3513)),
+  Box(Box(3514, 3514), Box(3514, 3514)),
+  Box(Box(3515, 3515), Box(3515, 3515)),
+  Box(Box(3516, 3516), Box(3516, 3516)),
+  Box(Box(3517, 3517), Box(3517, 3517)),
+  Box(Box(3518, 3518), Box(3518, 3518)),
+  Box(Box(3519, 3519), Box(3519, 3519)),
+  Box(Box(3520, 3520), Box(3520, 3520)),
+  Box(Box(3521, 3521), Box(3521, 3521)),
+  Box(Box(3522, 3522), Box(3522, 3522)),
+  Box(Box(3523, 3523), Box(3523, 3523)),
+  Box(Box(3524, 3524), Box(3524, 3524)),
+  Box(Box(3525, 3525), Box(3525, 3525)),
+  Box(Box(3526, 3526), Box(3526, 3526)),
+  Box(Box(3527, 3527), Box(3527, 3527)),
+  Box(Box(3528, 3528), Box(3528, 3528)),
+  Box(Box(3529, 3529), Box(3529, 3529)),
+  Box(Box(3530, 3530), Box(3530, 3530)),
+  Box(Box(3531, 3531), Box(3531, 3531)),
+  Box(Box(3532, 3532), Box(3532, 3532)),
+  Box(Box(3533, 3533), Box(3533, 3533)),
+  Box(Box(3534, 3534), Box(3534, 3534)),
+  Box(Box(3535, 3535), Box(3535, 3535)),
+  Box(Box(3536, 3536), Box(3536, 3536)),
+  Box(Box(3537, 3537), Box(3537, 3537)),
+  Box(Box(3538, 3538), Box(3538, 3538)),
+  Box(Box(3539, 3539), Box(3539, 3539)),
+  Box(Box(3540, 3540), Box(3540, 3540)),
+  Box(Box(3541, 3541), Box(3541, 3541)),
+  Box(Box(3542, 3542), Box(3542, 3542)),
+  Box(Box(3543, 3543), Box(3543, 3543)),
+  Box(Box(3544, 3544), Box(3544, 3544)),
+  Box(Box(3545, 3545), Box(3545, 3545)),
+  Box(Box(3546, 3546), Box(3546, 3546)),
+  Box(Box(3547, 3547), Box(3547, 3547)),
+  Box(Box(3548, 3548), Box(3548, 3548)),
+  Box(Box(3549, 3549), Box(3549, 3549)),
+  Box(Box(3550, 3550), Box(3550, 3550)),
+  Box(Box(3551, 3551), Box(3551, 3551)),
+  Box(Box(3552, 3552), Box(3552, 3552)),
+  Box(Box(3553, 3553), Box(3553, 3553)),
+  Box(Box(3554, 3554), Box(3554, 3554)),
+  Box(Box(3555, 3555), Box(3555, 3555)),
+  Box(Box(3556, 3556), Box(3556, 3556)),
+  Box(Box(3557, 3557), Box(3557, 3557)),
+  Box(Box(3558, 3558), Box(3558, 3558)),
+  Box(Box(3559, 3559), Box(3559, 3559)),
+  Box(Box(3560, 3560), Box(3560, 3560)),
+  Box(Box(3561, 3561), Box(3561, 3561)),
+  Box(Box(3562, 3562), Box(3562, 3562)),
+  Box(Box(3563, 3563), Box(3563, 3563)),
+  Box(Box(3564, 3564), Box(3564, 3564)),
+  Box(Box(3565, 3565), Box(3565, 3565)),
+  Box(Box(3566, 3566), Box(3566, 3566)),
+  Box(Box(3567, 3567), Box(3567, 3567)),
+  Box(Box(3568, 3568), Box(3568, 3568)),
+  Box(Box(3569, 3569), Box(3569, 3569)),
+  Box(Box(3570, 3570), Box(3570, 3570)),
+  Box(Box(3571, 3571), Box(3571, 3571)),
+  Box(Box(3572, 3572), Box(3572, 3572)),
+  Box(Box(3573, 3573), Box(3573, 3573)),
+  Box(Box(3574, 3574), Box(3574, 3574)),
+  Box(Box(3575, 3575), Box(3575, 3575)),
+  Box(Box(3576, 3576), Box(3576, 3576)),
+  Box(Box(3577, 3577), Box(3577, 3577)),
+  Box(Box(3578, 3578), Box(3578, 3578)),
+  Box(Box(3579, 3579), Box(3579, 3579)),
+  Box(Box(3580, 3580), Box(3580, 3580)),
+  Box(Box(3581, 3581), Box(3581, 3581)),
+  Box(Box(3582, 3582), Box(3582, 3582)),
+  Box(Box(3583, 3583), Box(3583, 3583)),
+  Box(Box(3584, 3584), Box(3584, 3584)),
+  Box(Box(3585, 3585), Box(3585, 3585)),
+  Box(Box(3586, 3586), Box(3586, 3586)),
+  Box(Box(3587, 3587), Box(3587, 3587)),
+  Box(Box(3588, 3588), Box(3588, 3588)),
+  Box(Box(3589, 3589), Box(3589, 3589)),
+  Box(Box(3590, 3590), Box(3590, 3590)),
+  Box(Box(3591, 3591), Box(3591, 3591)),
+  Box(Box(3592, 3592), Box(3592, 3592)),
+  Box(Box(3593, 3593), Box(3593, 3593)),
+  Box(Box(3594, 3594), Box(3594, 3594)),
+  Box(Box(3595, 3595), Box(3595, 3595)),
+  Box(Box(3596, 3596), Box(3596, 3596)),
+  Box(Box(3597, 3597), Box(3597, 3597)),
+  Box(Box(3598, 3598), Box(3598, 3598)),
+  Box(Box(3599, 3599), Box(3599, 3599)),
+  Box(Box(3600, 3600), Box(3600, 3600)),
+  Box(Box(3601, 3601), Box(3601, 3601)),
+  Box(Box(3602, 3602), Box(3602, 3602)),
+  Box(Box(3603, 3603), Box(3603, 3603)),
+  Box(Box(3604, 3604), Box(3604, 3604)),
+  Box(Box(3605, 3605), Box(3605, 3605)),
+  Box(Box(3606, 3606), Box(3606, 3606)),
+  Box(Box(3607, 3607), Box(3607, 3607)),
+  Box(Box(3608, 3608), Box(3608, 3608)),
+  Box(Box(3609, 3609), Box(3609, 3609)),
+  Box(Box(3610, 3610), Box(3610, 3610)),
+  Box(Box(3611, 3611), Box(3611, 3611)),
+  Box(Box(3612, 3612), Box(3612, 3612)),
+  Box(Box(3613, 3613), Box(3613, 3613)),
+  Box(Box(3614, 3614), Box(3614, 3614)),
+  Box(Box(3615, 3615), Box(3615, 3615)),
+  Box(Box(3616, 3616), Box(3616, 3616)),
+  Box(Box(3617, 3617), Box(3617, 3617)),
+  Box(Box(3618, 3618), Box(3618, 3618)),
+  Box(Box(3619, 3619), Box(3619, 3619)),
+  Box(Box(3620, 3620), Box(3620, 3620)),
+  Box(Box(3621, 3621), Box(3621, 3621)),
+  Box(Box(3622, 3622), Box(3622, 3622)),
+  Box(Box(3623, 3623), Box(3623, 3623)),
+  Box(Box(3624, 3624), Box(3624, 3624)),
+  Box(Box(3625, 3625), Box(3625, 3625)),
+  Box(Box(3626, 3626), Box(3626, 3626)),
+  Box(Box(3627, 3627), Box(3627, 3627)),
+  Box(Box(3628, 3628), Box(3628, 3628)),
+  Box(Box(3629, 3629), Box(3629, 3629)),
+  Box(Box(3630, 3630), Box(3630, 3630)),
+  Box(Box(3631, 3631), Box(3631, 3631)),
+  Box(Box(3632, 3632), Box(3632, 3632)),
+  Box(Box(3633, 3633), Box(3633, 3633)),
+  Box(Box(3634, 3634), Box(3634, 3634)),
+  Box(Box(3635, 3635), Box(3635, 3635)),
+  Box(Box(3636, 3636), Box(3636, 3636)),
+  Box(Box(3637, 3637), Box(3637, 3637)),
+  Box(Box(3638, 3638), Box(3638, 3638)),
+  Box(Box(3639, 3639), Box(3639, 3639)),
+  Box(Box(3640, 3640), Box(3640, 3640)),
+  Box(Box(3641, 3641), Box(3641, 3641)),
+  Box(Box(3642, 3642), Box(3642, 3642)),
+  Box(Box(3643, 3643), Box(3643, 3643)),
+  Box(Box(3644, 3644), Box(3644, 3644)),
+  Box(Box(3645, 3645), Box(3645, 3645)),
+  Box(Box(3646, 3646), Box(3646, 3646)),
+  Box(Box(3647, 3647), Box(3647, 3647)),
+  Box(Box(3648, 3648), Box(3648, 3648)),
+  Box(Box(3649, 3649), Box(3649, 3649)),
+  Box(Box(3650, 3650), Box(3650, 3650)),
+  Box(Box(3651, 3651), Box(3651, 3651)),
+  Box(Box(3652, 3652), Box(3652, 3652)),
+  Box(Box(3653, 3653), Box(3653, 3653)),
+  Box(Box(3654, 3654), Box(3654, 3654)),
+  Box(Box(3655, 3655), Box(3655, 3655)),
+  Box(Box(3656, 3656), Box(3656, 3656)),
+  Box(Box(3657, 3657), Box(3657, 3657)),
+  Box(Box(3658, 3658), Box(3658, 3658)),
+  Box(Box(3659, 3659), Box(3659, 3659)),
+  Box(Box(3660, 3660), Box(3660, 3660)),
+  Box(Box(3661, 3661), Box(3661, 3661)),
+  Box(Box(3662, 3662), Box(3662, 3662)),
+  Box(Box(3663, 3663), Box(3663, 3663)),
+  Box(Box(3664, 3664), Box(3664, 3664)),
+  Box(Box(3665, 3665), Box(3665, 3665)),
+  Box(Box(3666, 3666), Box(3666, 3666)),
+  Box(Box(3667, 3667), Box(3667, 3667)),
+  Box(Box(3668, 3668), Box(3668, 3668)),
+  Box(Box(3669, 3669), Box(3669, 3669)),
+  Box(Box(3670, 3670), Box(3670, 3670)),
+  Box(Box(3671, 3671), Box(3671, 3671)),
+  Box(Box(3672, 3672), Box(3672, 3672)),
+  Box(Box(3673, 3673), Box(3673, 3673)),
+  Box(Box(3674, 3674), Box(3674, 3674)),
+  Box(Box(3675, 3675), Box(3675, 3675)),
+  Box(Box(3676, 3676), Box(3676, 3676)),
+  Box(Box(3677, 3677), Box(3677, 3677)),
+  Box(Box(3678, 3678), Box(3678, 3678)),
+  Box(Box(3679, 3679), Box(3679, 3679)),
+  Box(Box(3680, 3680), Box(3680, 3680)),
+  Box(Box(3681, 3681), Box(3681, 3681)),
+  Box(Box(3682, 3682), Box(3682, 3682)),
+  Box(Box(3683, 3683), Box(3683, 3683)),
+  Box(Box(3684, 3684), Box(3684, 3684)),
+  Box(Box(3685, 3685), Box(3685, 3685)),
+  Box(Box(3686, 3686), Box(3686, 3686)),
+  Box(Box(3687, 3687), Box(3687, 3687)),
+  Box(Box(3688, 3688), Box(3688, 3688)),
+  Box(Box(3689, 3689), Box(3689, 3689)),
+  Box(Box(3690, 3690), Box(3690, 3690)),
+  Box(Box(3691, 3691), Box(3691, 3691)),
+  Box(Box(3692, 3692), Box(3692, 3692)),
+  Box(Box(3693, 3693), Box(3693, 3693)),
+  Box(Box(3694, 3694), Box(3694, 3694)),
+  Box(Box(3695, 3695), Box(3695, 3695)),
+  Box(Box(3696, 3696), Box(3696, 3696)),
+  Box(Box(3697, 3697), Box(3697, 3697)),
+  Box(Box(3698, 3698), Box(3698, 3698)),
+  Box(Box(3699, 3699), Box(3699, 3699)),
+  Box(Box(3700, 3700), Box(3700, 3700)),
+  Box(Box(3701, 3701), Box(3701, 3701)),
+  Box(Box(3702, 3702), Box(3702, 3702)),
+  Box(Box(3703, 3703), Box(3703, 3703)),
+  Box(Box(3704, 3704), Box(3704, 3704)),
+  Box(Box(3705, 3705), Box(3705, 3705)),
+  Box(Box(3706, 3706), Box(3706, 3706)),
+  Box(Box(3707, 3707), Box(3707, 3707)),
+  Box(Box(3708, 3708), Box(3708, 3708)),
+  Box(Box(3709, 3709), Box(3709, 3709)),
+  Box(Box(3710, 3710), Box(3710, 3710)),
+  Box(Box(3711, 3711), Box(3711, 3711)),
+  Box(Box(3712, 3712), Box(3712, 3712)),
+  Box(Box(3713, 3713), Box(3713, 3713)),
+  Box(Box(3714, 3714), Box(3714, 3714)),
+  Box(Box(3715, 3715), Box(3715, 3715)),
+  Box(Box(3716, 3716), Box(3716, 3716)),
+  Box(Box(3717, 3717), Box(3717, 3717)),
+  Box(Box(3718, 3718), Box(3718, 3718)),
+  Box(Box(3719, 3719), Box(3719, 3719)),
+  Box(Box(3720, 3720), Box(3720, 3720)),
+  Box(Box(3721, 3721), Box(3721, 3721)),
+  Box(Box(3722, 3722), Box(3722, 3722)),
+  Box(Box(3723, 3723), Box(3723, 3723)),
+  Box(Box(3724, 3724), Box(3724, 3724)),
+  Box(Box(3725, 3725), Box(3725, 3725)),
+  Box(Box(3726, 3726), Box(3726, 3726)),
+  Box(Box(3727, 3727), Box(3727, 3727)),
+  Box(Box(3728, 3728), Box(3728, 3728)),
+  Box(Box(3729, 3729), Box(3729, 3729)),
+  Box(Box(3730, 3730), Box(3730, 3730)),
+  Box(Box(3731, 3731), Box(3731, 3731)),
+  Box(Box(3732, 3732), Box(3732, 3732)),
+  Box(Box(3733, 3733), Box(3733, 3733)),
+  Box(Box(3734, 3734), Box(3734, 3734)),
+  Box(Box(3735, 3735), Box(3735, 3735)),
+  Box(Box(3736, 3736), Box(3736, 3736)),
+  Box(Box(3737, 3737), Box(3737, 3737)),
+  Box(Box(3738, 3738), Box(3738, 3738)),
+  Box(Box(3739, 3739), Box(3739, 3739)),
+  Box(Box(3740, 3740), Box(3740, 3740)),
+  Box(Box(3741, 3741), Box(3741, 3741)),
+  Box(Box(3742, 3742), Box(3742, 3742)),
+  Box(Box(3743, 3743), Box(3743, 3743)),
+  Box(Box(3744, 3744), Box(3744, 3744)),
+  Box(Box(3745, 3745), Box(3745, 3745)),
+  Box(Box(3746, 3746), Box(3746, 3746)),
+  Box(Box(3747, 3747), Box(3747, 3747)),
+  Box(Box(3748, 3748), Box(3748, 3748)),
+  Box(Box(3749, 3749), Box(3749, 3749)),
+  Box(Box(3750, 3750), Box(3750, 3750)),
+  Box(Box(3751, 3751), Box(3751, 3751)),
+  Box(Box(3752, 3752), Box(3752, 3752)),
+  Box(Box(3753, 3753), Box(3753, 3753)),
+  Box(Box(3754, 3754), Box(3754, 3754)),
+  Box(Box(3755, 3755), Box(3755, 3755)),
+  Box(Box(3756, 3756), Box(3756, 3756)),
+  Box(Box(3757, 3757), Box(3757, 3757)),
+  Box(Box(3758, 3758), Box(3758, 3758)),
+  Box(Box(3759, 3759), Box(3759, 3759)),
+  Box(Box(3760, 3760), Box(3760, 3760)),
+  Box(Box(3761, 3761), Box(3761, 3761)),
+  Box(Box(3762, 3762), Box(3762, 3762)),
+  Box(Box(3763, 3763), Box(3763, 3763)),
+  Box(Box(3764, 3764), Box(3764, 3764)),
+  Box(Box(3765, 3765), Box(3765, 3765)),
+  Box(Box(3766, 3766), Box(3766, 3766)),
+  Box(Box(3767, 3767), Box(3767, 3767)),
+  Box(Box(3768, 3768), Box(3768, 3768)),
+  Box(Box(3769, 3769), Box(3769, 3769)),
+  Box(Box(3770, 3770), Box(3770, 3770)),
+  Box(Box(3771, 3771), Box(3771, 3771)),
+  Box(Box(3772, 3772), Box(3772, 3772)),
+  Box(Box(3773, 3773), Box(3773, 3773)),
+  Box(Box(3774, 3774), Box(3774, 3774)),
+  Box(Box(3775, 3775), Box(3775, 3775)),
+  Box(Box(3776, 3776), Box(3776, 3776)),
+  Box(Box(3777, 3777), Box(3777, 3777)),
+  Box(Box(3778, 3778), Box(3778, 3778)),
+  Box(Box(3779, 3779), Box(3779, 3779)),
+  Box(Box(3780, 3780), Box(3780, 3780)),
+  Box(Box(3781, 3781), Box(3781, 3781)),
+  Box(Box(3782, 3782), Box(3782, 3782)),
+  Box(Box(3783, 3783), Box(3783, 3783)),
+  Box(Box(3784, 3784), Box(3784, 3784)),
+  Box(Box(3785, 3785), Box(3785, 3785)),
+  Box(Box(3786, 3786), Box(3786, 3786)),
+  Box(Box(3787, 3787), Box(3787, 3787)),
+  Box(Box(3788, 3788), Box(3788, 3788)),
+  Box(Box(3789, 3789), Box(3789, 3789)),
+  Box(Box(3790, 3790), Box(3790, 3790)),
+  Box(Box(3791, 3791), Box(3791, 3791)),
+  Box(Box(3792, 3792), Box(3792, 3792)),
+  Box(Box(3793, 3793), Box(3793, 3793)),
+  Box(Box(3794, 3794), Box(3794, 3794)),
+  Box(Box(3795, 3795), Box(3795, 3795)),
+  Box(Box(3796, 3796), Box(3796, 3796)),
+  Box(Box(3797, 3797), Box(3797, 3797)),
+  Box(Box(3798, 3798), Box(3798, 3798)),
+  Box(Box(3799, 3799), Box(3799, 3799)),
+  Box(Box(3800, 3800), Box(3800, 3800)),
+  Box(Box(3801, 3801), Box(3801, 3801)),
+  Box(Box(3802, 3802), Box(3802, 3802)),
+  Box(Box(3803, 3803), Box(3803, 3803)),
+  Box(Box(3804, 3804), Box(3804, 3804)),
+  Box(Box(3805, 3805), Box(3805, 3805)),
+  Box(Box(3806, 3806), Box(3806, 3806)),
+  Box(Box(3807, 3807), Box(3807, 3807)),
+  Box(Box(3808, 3808), Box(3808, 3808)),
+  Box(Box(3809, 3809), Box(3809, 3809)),
+  Box(Box(3810, 3810), Box(3810, 3810)),
+  Box(Box(3811, 3811), Box(3811, 3811)),
+  Box(Box(3812, 3812), Box(3812, 3812)),
+  Box(Box(3813, 3813), Box(3813, 3813)),
+  Box(Box(3814, 3814), Box(3814, 3814)),
+  Box(Box(3815, 3815), Box(3815, 3815)),
+  Box(Box(3816, 3816), Box(3816, 3816)),
+  Box(Box(3817, 3817), Box(3817, 3817)),
+  Box(Box(3818, 3818), Box(3818, 3818)),
+  Box(Box(3819, 3819), Box(3819, 3819)),
+  Box(Box(3820, 3820), Box(3820, 3820)),
+  Box(Box(3821, 3821), Box(3821, 3821)),
+  Box(Box(3822, 3822), Box(3822, 3822)),
+  Box(Box(3823, 3823), Box(3823, 3823)),
+  Box(Box(3824, 3824), Box(3824, 3824)),
+  Box(Box(3825, 3825), Box(3825, 3825)),
+  Box(Box(3826, 3826), Box(3826, 3826)),
+  Box(Box(3827, 3827), Box(3827, 3827)),
+  Box(Box(3828, 3828), Box(3828, 3828)),
+  Box(Box(3829, 3829), Box(3829, 3829)),
+  Box(Box(3830, 3830), Box(3830, 3830)),
+  Box(Box(3831, 3831), Box(3831, 3831)),
+  Box(Box(3832, 3832), Box(3832, 3832)),
+  Box(Box(3833, 3833), Box(3833, 3833)),
+  Box(Box(3834, 3834), Box(3834, 3834)),
+  Box(Box(3835, 3835), Box(3835, 3835)),
+  Box(Box(3836, 3836), Box(3836, 3836)),
+  Box(Box(3837, 3837), Box(3837, 3837)),
+  Box(Box(3838, 3838), Box(3838, 3838)),
+  Box(Box(3839, 3839), Box(3839, 3839)),
+  Box(Box(3840, 3840), Box(3840, 3840)),
+  Box(Box(3841, 3841), Box(3841, 3841)),
+  Box(Box(3842, 3842), Box(3842, 3842)),
+  Box(Box(3843, 3843), Box(3843, 3843)),
+  Box(Box(3844, 3844), Box(3844, 3844)),
+  Box(Box(3845, 3845), Box(3845, 3845)),
+  Box(Box(3846, 3846), Box(3846, 3846)),
+  Box(Box(3847, 3847), Box(3847, 3847)),
+  Box(Box(3848, 3848), Box(3848, 3848)),
+  Box(Box(3849, 3849), Box(3849, 3849)),
+  Box(Box(3850, 3850), Box(3850, 3850)),
+  Box(Box(3851, 3851), Box(3851, 3851)),
+  Box(Box(3852, 3852), Box(3852, 3852)),
+  Box(Box(3853, 3853), Box(3853, 3853)),
+  Box(Box(3854, 3854), Box(3854, 3854)),
+  Box(Box(3855, 3855), Box(3855, 3855)),
+  Box(Box(3856, 3856), Box(3856, 3856)),
+  Box(Box(3857, 3857), Box(3857, 3857)),
+  Box(Box(3858, 3858), Box(3858, 3858)),
+  Box(Box(3859, 3859), Box(3859, 3859)),
+  Box(Box(3860, 3860), Box(3860, 3860)),
+  Box(Box(3861, 3861), Box(3861, 3861)),
+  Box(Box(3862, 3862), Box(3862, 3862)),
+  Box(Box(3863, 3863), Box(3863, 3863)),
+  Box(Box(3864, 3864), Box(3864, 3864)),
+  Box(Box(3865, 3865), Box(3865, 3865)),
+  Box(Box(3866, 3866), Box(3866, 3866)),
+  Box(Box(3867, 3867), Box(3867, 3867)),
+  Box(Box(3868, 3868), Box(3868, 3868)),
+  Box(Box(3869, 3869), Box(3869, 3869)),
+  Box(Box(3870, 3870), Box(3870, 3870)),
+  Box(Box(3871, 3871), Box(3871, 3871)),
+  Box(Box(3872, 3872), Box(3872, 3872)),
+  Box(Box(3873, 3873), Box(3873, 3873)),
+  Box(Box(3874, 3874), Box(3874, 3874)),
+  Box(Box(3875, 3875), Box(3875, 3875)),
+  Box(Box(3876, 3876), Box(3876, 3876)),
+  Box(Box(3877, 3877), Box(3877, 3877)),
+  Box(Box(3878, 3878), Box(3878, 3878)),
+  Box(Box(3879, 3879), Box(3879, 3879)),
+  Box(Box(3880, 3880), Box(3880, 3880)),
+  Box(Box(3881, 3881), Box(3881, 3881)),
+  Box(Box(3882, 3882), Box(3882, 3882)),
+  Box(Box(3883, 3883), Box(3883, 3883)),
+  Box(Box(3884, 3884), Box(3884, 3884)),
+  Box(Box(3885, 3885), Box(3885, 3885)),
+  Box(Box(3886, 3886), Box(3886, 3886)),
+  Box(Box(3887, 3887), Box(3887, 3887)),
+  Box(Box(3888, 3888), Box(3888, 3888)),
+  Box(Box(3889, 3889), Box(3889, 3889)),
+  Box(Box(3890, 3890), Box(3890, 3890)),
+  Box(Box(3891, 3891), Box(3891, 3891)),
+  Box(Box(3892, 3892), Box(3892, 3892)),
+  Box(Box(3893, 3893), Box(3893, 3893)),
+  Box(Box(3894, 3894), Box(3894, 3894)),
+  Box(Box(3895, 3895), Box(3895, 3895)),
+  Box(Box(3896, 3896), Box(3896, 3896)),
+  Box(Box(3897, 3897), Box(3897, 3897)),
+  Box(Box(3898, 3898), Box(3898, 3898)),
+  Box(Box(3899, 3899), Box(3899, 3899)),
+  Box(Box(3900, 3900), Box(3900, 3900)),
+  Box(Box(3901, 3901), Box(3901, 3901)),
+  Box(Box(3902, 3902), Box(3902, 3902)),
+  Box(Box(3903, 3903), Box(3903, 3903)),
+  Box(Box(3904, 3904), Box(3904, 3904)),
+  Box(Box(3905, 3905), Box(3905, 3905)),
+  Box(Box(3906, 3906), Box(3906, 3906)),
+  Box(Box(3907, 3907), Box(3907, 3907)),
+  Box(Box(3908, 3908), Box(3908, 3908)),
+  Box(Box(3909, 3909), Box(3909, 3909)),
+  Box(Box(3910, 3910), Box(3910, 3910)),
+  Box(Box(3911, 3911), Box(3911, 3911)),
+  Box(Box(3912, 3912), Box(3912, 3912)),
+  Box(Box(3913, 3913), Box(3913, 3913)),
+  Box(Box(3914, 3914), Box(3914, 3914)),
+  Box(Box(3915, 3915), Box(3915, 3915)),
+  Box(Box(3916, 3916), Box(3916, 3916)),
+  Box(Box(3917, 3917), Box(3917, 3917)),
+  Box(Box(3918, 3918), Box(3918, 3918)),
+  Box(Box(3919, 3919), Box(3919, 3919)),
+  Box(Box(3920, 3920), Box(3920, 3920)),
+  Box(Box(3921, 3921), Box(3921, 3921)),
+  Box(Box(3922, 3922), Box(3922, 3922)),
+  Box(Box(3923, 3923), Box(3923, 3923)),
+  Box(Box(3924, 3924), Box(3924, 3924)),
+  Box(Box(3925, 3925), Box(3925, 3925)),
+  Box(Box(3926, 3926), Box(3926, 3926)),
+  Box(Box(3927, 3927), Box(3927, 3927)),
+  Box(Box(3928, 3928), Box(3928, 3928)),
+  Box(Box(3929, 3929), Box(3929, 3929)),
+  Box(Box(3930, 3930), Box(3930, 3930)),
+  Box(Box(3931, 3931), Box(3931, 3931)),
+  Box(Box(3932, 3932), Box(3932, 3932)),
+  Box(Box(3933, 3933), Box(3933, 3933)),
+  Box(Box(3934, 3934), Box(3934, 3934)),
+  Box(Box(3935, 3935), Box(3935, 3935)),
+  Box(Box(3936, 3936), Box(3936, 3936)),
+  Box(Box(3937, 3937), Box(3937, 3937)),
+  Box(Box(3938, 3938), Box(3938, 3938)),
+  Box(Box(3939, 3939), Box(3939, 3939)),
+  Box(Box(3940, 3940), Box(3940, 3940)),
+  Box(Box(3941, 3941), Box(3941, 3941)),
+  Box(Box(3942, 3942), Box(3942, 3942)),
+  Box(Box(3943, 3943), Box(3943, 3943)),
+  Box(Box(3944, 3944), Box(3944, 3944)),
+  Box(Box(3945, 3945), Box(3945, 3945)),
+  Box(Box(3946, 3946), Box(3946, 3946)),
+  Box(Box(3947, 3947), Box(3947, 3947)),
+  Box(Box(3948, 3948), Box(3948, 3948)),
+  Box(Box(3949, 3949), Box(3949, 3949)),
+  Box(Box(3950, 3950), Box(3950, 3950)),
+  Box(Box(3951, 3951), Box(3951, 3951)),
+  Box(Box(3952, 3952), Box(3952, 3952)),
+  Box(Box(3953, 3953), Box(3953, 3953)),
+  Box(Box(3954, 3954), Box(3954, 3954)),
+  Box(Box(3955, 3955), Box(3955, 3955)),
+  Box(Box(3956, 3956), Box(3956, 3956)),
+  Box(Box(3957, 3957), Box(3957, 3957)),
+  Box(Box(3958, 3958), Box(3958, 3958)),
+  Box(Box(3959, 3959), Box(3959, 3959)),
+  Box(Box(3960, 3960), Box(3960, 3960)),
+  Box(Box(3961, 3961), Box(3961, 3961)),
+  Box(Box(3962, 3962), Box(3962, 3962)),
+  Box(Box(3963, 3963), Box(3963, 3963)),
+  Box(Box(3964, 3964), Box(3964, 3964)),
+  Box(Box(3965, 3965), Box(3965, 3965)),
+  Box(Box(3966, 3966), Box(3966, 3966)),
+  Box(Box(3967, 3967), Box(3967, 3967)),
+  Box(Box(3968, 3968), Box(3968, 3968)),
+  Box(Box(3969, 3969), Box(3969, 3969)),
+  Box(Box(3970, 3970), Box(3970, 3970)),
+  Box(Box(3971, 3971), Box(3971, 3971)),
+  Box(Box(3972, 3972), Box(3972, 3972)),
+  Box(Box(3973, 3973), Box(3973, 3973)),
+  Box(Box(3974, 3974), Box(3974, 3974)),
+  Box(Box(3975, 3975), Box(3975, 3975)),
+  Box(Box(3976, 3976), Box(3976, 3976)),
+  Box(Box(3977, 3977), Box(3977, 3977)),
+  Box(Box(3978, 3978), Box(3978, 3978)),
+  Box(Box(3979, 3979), Box(3979, 3979)),
+  Box(Box(3980, 3980), Box(3980, 3980)),
+  Box(Box(3981, 3981), Box(3981, 3981)),
+  Box(Box(3982, 3982), Box(3982, 3982)),
+  Box(Box(3983, 3983), Box(3983, 3983)),
+  Box(Box(3984, 3984), Box(3984, 3984)),
+  Box(Box(3985, 3985), Box(3985, 3985)),
+  Box(Box(3986, 3986), Box(3986, 3986)),
+  Box(Box(3987, 3987), Box(3987, 3987)),
+  Box(Box(3988, 3988), Box(3988, 3988)),
+  Box(Box(3989, 3989), Box(3989, 3989)),
+  Box(Box(3990, 3990), Box(3990, 3990)),
+  Box(Box(3991, 3991), Box(3991, 3991)),
+  Box(Box(3992, 3992), Box(3992, 3992)),
+  Box(Box(3993, 3993), Box(3993, 3993)),
+  Box(Box(3994, 3994), Box(3994, 3994)),
+  Box(Box(3995, 3995), Box(3995, 3995)),
+  Box(Box(3996, 3996), Box(3996, 3996)),
+  Box(Box(3997, 3997), Box(3997, 3997)),
+  Box(Box(3998, 3998), Box(3998, 3998)),
+  Box(Box(3999, 3999), Box(3999, 3999)),
+  Box(Box(4000, 4000), Box(4000, 4000)),
+  Box(Box(4001, 4001), Box(4001, 4001)),
+  Box(Box(4002, 4002), Box(4002, 4002)),
+  Box(Box(4003, 4003), Box(4003, 4003)),
+  Box(Box(4004, 4004), Box(4004, 4004)),
+  Box(Box(4005, 4005), Box(4005, 4005)),
+  Box(Box(4006, 4006), Box(4006, 4006)),
+  Box(Box(4007, 4007), Box(4007, 4007)),
+  Box(Box(4008, 4008), Box(4008, 4008)),
+  Box(Box(4009, 4009), Box(4009, 4009)),
+  Box(Box(4010, 4010), Box(4010, 4010)),
+  Box(Box(4011, 4011), Box(4011, 4011)),
+  Box(Box(4012, 4012), Box(4012, 4012)),
+  Box(Box(4013, 4013), Box(4013, 4013)),
+  Box(Box(4014, 4014), Box(4014, 4014)),
+  Box(Box(4015, 4015), Box(4015, 4015)),
+  Box(Box(4016, 4016), Box(4016, 4016)),
+  Box(Box(4017, 4017), Box(4017, 4017)),
+  Box(Box(4018, 4018), Box(4018, 4018)),
+  Box(Box(4019, 4019), Box(4019, 4019)),
+  Box(Box(4020, 4020), Box(4020, 4020)),
+  Box(Box(4021, 4021), Box(4021, 4021)),
+  Box(Box(4022, 4022), Box(4022, 4022)),
+  Box(Box(4023, 4023), Box(4023, 4023)),
+  Box(Box(4024, 4024), Box(4024, 4024)),
+  Box(Box(4025, 4025), Box(4025, 4025)),
+  Box(Box(4026, 4026), Box(4026, 4026)),
+  Box(Box(4027, 4027), Box(4027, 4027)),
+  Box(Box(4028, 4028), Box(4028, 4028)),
+  Box(Box(4029, 4029), Box(4029, 4029)),
+  Box(Box(4030, 4030), Box(4030, 4030)),
+  Box(Box(4031, 4031), Box(4031, 4031)),
+  Box(Box(4032, 4032), Box(4032, 4032)),
+  Box(Box(4033, 4033), Box(4033, 4033)),
+  Box(Box(4034, 4034), Box(4034, 4034)),
+  Box(Box(4035, 4035), Box(4035, 4035)),
+  Box(Box(4036, 4036), Box(4036, 4036)),
+  Box(Box(4037, 4037), Box(4037, 4037)),
+  Box(Box(4038, 4038), Box(4038, 4038)),
+  Box(Box(4039, 4039), Box(4039, 4039)),
+  Box(Box(4040, 4040), Box(4040, 4040)),
+  Box(Box(4041, 4041), Box(4041, 4041)),
+  Box(Box(4042, 4042), Box(4042, 4042)),
+  Box(Box(4043, 4043), Box(4043, 4043)),
+  Box(Box(4044, 4044), Box(4044, 4044)),
+  Box(Box(4045, 4045), Box(4045, 4045)),
+  Box(Box(4046, 4046), Box(4046, 4046)),
+  Box(Box(4047, 4047), Box(4047, 4047)),
+  Box(Box(4048, 4048), Box(4048, 4048)),
+  Box(Box(4049, 4049), Box(4049, 4049)),
+  Box(Box(4050, 4050), Box(4050, 4050)),
+  Box(Box(4051, 4051), Box(4051, 4051)),
+  Box(Box(4052, 4052), Box(4052, 4052)),
+  Box(Box(4053, 4053), Box(4053, 4053)),
+  Box(Box(4054, 4054), Box(4054, 4054)),
+  Box(Box(4055, 4055), Box(4055, 4055)),
+  Box(Box(4056, 4056), Box(4056, 4056)),
+  Box(Box(4057, 4057), Box(4057, 4057)),
+  Box(Box(4058, 4058), Box(4058, 4058)),
+  Box(Box(4059, 4059), Box(4059, 4059)),
+  Box(Box(4060, 4060), Box(4060, 4060)),
+  Box(Box(4061, 4061), Box(4061, 4061)),
+  Box(Box(4062, 4062), Box(4062, 4062)),
+  Box(Box(4063, 4063), Box(4063, 4063)),
+  Box(Box(4064, 4064), Box(4064, 4064)),
+  Box(Box(4065, 4065), Box(4065, 4065)),
+  Box(Box(4066, 4066), Box(4066, 4066)),
+  Box(Box(4067, 4067), Box(4067, 4067)),
+  Box(Box(4068, 4068), Box(4068, 4068)),
+  Box(Box(4069, 4069), Box(4069, 4069)),
+  Box(Box(4070, 4070), Box(4070, 4070)),
+  Box(Box(4071, 4071), Box(4071, 4071)),
+  Box(Box(4072, 4072), Box(4072, 4072)),
+  Box(Box(4073, 4073), Box(4073, 4073)),
+  Box(Box(4074, 4074), Box(4074, 4074)),
+  Box(Box(4075, 4075), Box(4075, 4075)),
+  Box(Box(4076, 4076), Box(4076, 4076)),
+  Box(Box(4077, 4077), Box(4077, 4077)),
+  Box(Box(4078, 4078), Box(4078, 4078)),
+  Box(Box(4079, 4079), Box(4079, 4079)),
+  Box(Box(4080, 4080), Box(4080, 4080)),
+  Box(Box(4081, 4081), Box(4081, 4081)),
+  Box(Box(4082, 4082), Box(4082, 4082)),
+  Box(Box(4083, 4083), Box(4083, 4083)),
+  Box(Box(4084, 4084), Box(4084, 4084)),
+  Box(Box(4085, 4085), Box(4085, 4085)),
+  Box(Box(4086, 4086), Box(4086, 4086)),
+  Box(Box(4087, 4087), Box(4087, 4087)),
+  Box(Box(4088, 4088), Box(4088, 4088)),
+  Box(Box(4089, 4089), Box(4089, 4089)),
+  Box(Box(4090, 4090), Box(4090, 4090)),
+  Box(Box(4091, 4091), Box(4091, 4091)),
+  Box(Box(4092, 4092), Box(4092, 4092)),
+  Box(Box(4093, 4093), Box(4093, 4093)),
+  Box(Box(4094, 4094), Box(4094, 4094)),
+  Box(Box(4095, 4095), Box(4095, 4095)),
+  Box(Box(4096, 4096), Box(4096, 4096)),
+  Box(Box(4097, 4097), Box(4097, 4097)),
+  Box(Box(4098, 4098), Box(4098, 4098)),
+  Box(Box(4099, 4099), Box(4099, 4099)),
+  Box(Box(4100, 4100), Box(4100, 4100)),
+  Box(Box(4101, 4101), Box(4101, 4101)),
+  Box(Box(4102, 4102), Box(4102, 4102)),
+  Box(Box(4103, 4103), Box(4103, 4103)),
+  Box(Box(4104, 4104), Box(4104, 4104)),
+  Box(Box(4105, 4105), Box(4105, 4105)),
+  Box(Box(4106, 4106), Box(4106, 4106)),
+  Box(Box(4107, 4107), Box(4107, 4107)),
+  Box(Box(4108, 4108), Box(4108, 4108)),
+  Box(Box(4109, 4109), Box(4109, 4109)),
+  Box(Box(4110, 4110), Box(4110, 4110)),
+  Box(Box(4111, 4111), Box(4111, 4111)),
+  Box(Box(4112, 4112), Box(4112, 4112)),
+  Box(Box(4113, 4113), Box(4113, 4113)),
+  Box(Box(4114, 4114), Box(4114, 4114)),
+  Box(Box(4115, 4115), Box(4115, 4115)),
+  Box(Box(4116, 4116), Box(4116, 4116)),
+  Box(Box(4117, 4117), Box(4117, 4117)),
+  Box(Box(4118, 4118), Box(4118, 4118)),
+  Box(Box(4119, 4119), Box(4119, 4119)),
+  Box(Box(4120, 4120), Box(4120, 4120)),
+  Box(Box(4121, 4121), Box(4121, 4121)),
+  Box(Box(4122, 4122), Box(4122, 4122)),
+  Box(Box(4123, 4123), Box(4123, 4123)),
+  Box(Box(4124, 4124), Box(4124, 4124)),
+  Box(Box(4125, 4125), Box(4125, 4125)),
+  Box(Box(4126, 4126), Box(4126, 4126)),
+  Box(Box(4127, 4127), Box(4127, 4127)),
+  Box(Box(4128, 4128), Box(4128, 4128)),
+  Box(Box(4129, 4129), Box(4129, 4129)),
+  Box(Box(4130, 4130), Box(4130, 4130)),
+  Box(Box(4131, 4131), Box(4131, 4131)),
+  Box(Box(4132, 4132), Box(4132, 4132)),
+  Box(Box(4133, 4133), Box(4133, 4133)),
+  Box(Box(4134, 4134), Box(4134, 4134)),
+  Box(Box(4135, 4135), Box(4135, 4135)),
+  Box(Box(4136, 4136), Box(4136, 4136)),
+  Box(Box(4137, 4137), Box(4137, 4137)),
+  Box(Box(4138, 4138), Box(4138, 4138)),
+  Box(Box(4139, 4139), Box(4139, 4139)),
+  Box(Box(4140, 4140), Box(4140, 4140)),
+  Box(Box(4141, 4141), Box(4141, 4141)),
+  Box(Box(4142, 4142), Box(4142, 4142)),
+  Box(Box(4143, 4143), Box(4143, 4143)),
+  Box(Box(4144, 4144), Box(4144, 4144)),
+  Box(Box(4145, 4145), Box(4145, 4145)),
+  Box(Box(4146, 4146), Box(4146, 4146)),
+  Box(Box(4147, 4147), Box(4147, 4147)),
+  Box(Box(4148, 4148), Box(4148, 4148)),
+  Box(Box(4149, 4149), Box(4149, 4149)),
+  Box(Box(4150, 4150), Box(4150, 4150)),
+  Box(Box(4151, 4151), Box(4151, 4151)),
+  Box(Box(4152, 4152), Box(4152, 4152)),
+  Box(Box(4153, 4153), Box(4153, 4153)),
+  Box(Box(4154, 4154), Box(4154, 4154)),
+  Box(Box(4155, 4155), Box(4155, 4155)),
+  Box(Box(4156, 4156), Box(4156, 4156)),
+  Box(Box(4157, 4157), Box(4157, 4157)),
+  Box(Box(4158, 4158), Box(4158, 4158)),
+  Box(Box(4159, 4159), Box(4159, 4159)),
+  Box(Box(4160, 4160), Box(4160, 4160)),
+  Box(Box(4161, 4161), Box(4161, 4161)),
+  Box(Box(4162, 4162), Box(4162, 4162)),
+  Box(Box(4163, 4163), Box(4163, 4163)),
+  Box(Box(4164, 4164), Box(4164, 4164)),
+  Box(Box(4165, 4165), Box(4165, 4165)),
+  Box(Box(4166, 4166), Box(4166, 4166)),
+  Box(Box(4167, 4167), Box(4167, 4167)),
+  Box(Box(4168, 4168), Box(4168, 4168)),
+  Box(Box(4169, 4169), Box(4169, 4169)),
+  Box(Box(4170, 4170), Box(4170, 4170)),
+  Box(Box(4171, 4171), Box(4171, 4171)),
+  Box(Box(4172, 4172), Box(4172, 4172)),
+  Box(Box(4173, 4173), Box(4173, 4173)),
+  Box(Box(4174, 4174), Box(4174, 4174)),
+  Box(Box(4175, 4175), Box(4175, 4175)),
+  Box(Box(4176, 4176), Box(4176, 4176)),
+  Box(Box(4177, 4177), Box(4177, 4177)),
+  Box(Box(4178, 4178), Box(4178, 4178)),
+  Box(Box(4179, 4179), Box(4179, 4179)),
+  Box(Box(4180, 4180), Box(4180, 4180)),
+  Box(Box(4181, 4181), Box(4181, 4181)),
+  Box(Box(4182, 4182), Box(4182, 4182)),
+  Box(Box(4183, 4183), Box(4183, 4183)),
+  Box(Box(4184, 4184), Box(4184, 4184)),
+  Box(Box(4185, 4185), Box(4185, 4185)),
+  Box(Box(4186, 4186), Box(4186, 4186)),
+  Box(Box(4187, 4187), Box(4187, 4187)),
+  Box(Box(4188, 4188), Box(4188, 4188)),
+  Box(Box(4189, 4189), Box(4189, 4189)),
+  Box(Box(4190, 4190), Box(4190, 4190)),
+  Box(Box(4191, 4191), Box(4191, 4191)),
+  Box(Box(4192, 4192), Box(4192, 4192)),
+  Box(Box(4193, 4193), Box(4193, 4193)),
+  Box(Box(4194, 4194), Box(4194, 4194)),
+  Box(Box(4195, 4195), Box(4195, 4195)),
+  Box(Box(4196, 4196), Box(4196, 4196)),
+  Box(Box(4197, 4197), Box(4197, 4197)),
+  Box(Box(4198, 4198), Box(4198, 4198)),
+  Box(Box(4199, 4199), Box(4199, 4199)),
+  Box(Box(4200, 4200), Box(4200, 4200)),
+  Box(Box(4201, 4201), Box(4201, 4201)),
+  Box(Box(4202, 4202), Box(4202, 4202)),
+  Box(Box(4203, 4203), Box(4203, 4203)),
+  Box(Box(4204, 4204), Box(4204, 4204)),
+  Box(Box(4205, 4205), Box(4205, 4205)),
+  Box(Box(4206, 4206), Box(4206, 4206)),
+  Box(Box(4207, 4207), Box(4207, 4207)),
+  Box(Box(4208, 4208), Box(4208, 4208)),
+  Box(Box(4209, 4209), Box(4209, 4209)),
+  Box(Box(4210, 4210), Box(4210, 4210)),
+  Box(Box(4211, 4211), Box(4211, 4211)),
+  Box(Box(4212, 4212), Box(4212, 4212)),
+  Box(Box(4213, 4213), Box(4213, 4213)),
+  Box(Box(4214, 4214), Box(4214, 4214)),
+  Box(Box(4215, 4215), Box(4215, 4215)),
+  Box(Box(4216, 4216), Box(4216, 4216)),
+  Box(Box(4217, 4217), Box(4217, 4217)),
+  Box(Box(4218, 4218), Box(4218, 4218)),
+  Box(Box(4219, 4219), Box(4219, 4219)),
+  Box(Box(4220, 4220), Box(4220, 4220)),
+  Box(Box(4221, 4221), Box(4221, 4221)),
+  Box(Box(4222, 4222), Box(4222, 4222)),
+  Box(Box(4223, 4223), Box(4223, 4223)),
+  Box(Box(4224, 4224), Box(4224, 4224)),
+  Box(Box(4225, 4225), Box(4225, 4225)),
+  Box(Box(4226, 4226), Box(4226, 4226)),
+  Box(Box(4227, 4227), Box(4227, 4227)),
+  Box(Box(4228, 4228), Box(4228, 4228)),
+  Box(Box(4229, 4229), Box(4229, 4229)),
+  Box(Box(4230, 4230), Box(4230, 4230)),
+  Box(Box(4231, 4231), Box(4231, 4231)),
+  Box(Box(4232, 4232), Box(4232, 4232)),
+  Box(Box(4233, 4233), Box(4233, 4233)),
+  Box(Box(4234, 4234), Box(4234, 4234)),
+  Box(Box(4235, 4235), Box(4235, 4235)),
+  Box(Box(4236, 4236), Box(4236, 4236)),
+  Box(Box(4237, 4237), Box(4237, 4237)),
+  Box(Box(4238, 4238), Box(4238, 4238)),
+  Box(Box(4239, 4239), Box(4239, 4239)),
+  Box(Box(4240, 4240), Box(4240, 4240)),
+  Box(Box(4241, 4241), Box(4241, 4241)),
+  Box(Box(4242, 4242), Box(4242, 4242)),
+  Box(Box(4243, 4243), Box(4243, 4243)),
+  Box(Box(4244, 4244), Box(4244, 4244)),
+  Box(Box(4245, 4245), Box(4245, 4245)),
+  Box(Box(4246, 4246), Box(4246, 4246)),
+  Box(Box(4247, 4247), Box(4247, 4247)),
+  Box(Box(4248, 4248), Box(4248, 4248)),
+  Box(Box(4249, 4249), Box(4249, 4249)),
+  Box(Box(4250, 4250), Box(4250, 4250)),
+  Box(Box(4251, 4251), Box(4251, 4251)),
+  Box(Box(4252, 4252), Box(4252, 4252)),
+  Box(Box(4253, 4253), Box(4253, 4253)),
+  Box(Box(4254, 4254), Box(4254, 4254)),
+  Box(Box(4255, 4255), Box(4255, 4255)),
+  Box(Box(4256, 4256), Box(4256, 4256)),
+  Box(Box(4257, 4257), Box(4257, 4257)),
+  Box(Box(4258, 4258), Box(4258, 4258)),
+  Box(Box(4259, 4259), Box(4259, 4259)),
+  Box(Box(4260, 4260), Box(4260, 4260)),
+  Box(Box(4261, 4261), Box(4261, 4261)),
+  Box(Box(4262, 4262), Box(4262, 4262)),
+  Box(Box(4263, 4263), Box(4263, 4263)),
+  Box(Box(4264, 4264), Box(4264, 4264)),
+  Box(Box(4265, 4265), Box(4265, 4265)),
+  Box(Box(4266, 4266), Box(4266, 4266)),
+  Box(Box(4267, 4267), Box(4267, 4267)),
+  Box(Box(4268, 4268), Box(4268, 4268)),
+  Box(Box(4269, 4269), Box(4269, 4269)),
+  Box(Box(4270, 4270), Box(4270, 4270)),
+  Box(Box(4271, 4271), Box(4271, 4271)),
+  Box(Box(4272, 4272), Box(4272, 4272)),
+  Box(Box(4273, 4273), Box(4273, 4273)),
+  Box(Box(4274, 4274), Box(4274, 4274)),
+  Box(Box(4275, 4275), Box(4275, 4275)),
+  Box(Box(4276, 4276), Box(4276, 4276)),
+  Box(Box(4277, 4277), Box(4277, 4277)),
+  Box(Box(4278, 4278), Box(4278, 4278)),
+  Box(Box(4279, 4279), Box(4279, 4279)),
+  Box(Box(4280, 4280), Box(4280, 4280)),
+  Box(Box(4281, 4281), Box(4281, 4281)),
+  Box(Box(4282, 4282), Box(4282, 4282)),
+  Box(Box(4283, 4283), Box(4283, 4283)),
+  Box(Box(4284, 4284), Box(4284, 4284)),
+  Box(Box(4285, 4285), Box(4285, 4285)),
+  Box(Box(4286, 4286), Box(4286, 4286)),
+  Box(Box(4287, 4287), Box(4287, 4287)),
+  Box(Box(4288, 4288), Box(4288, 4288)),
+  Box(Box(4289, 4289), Box(4289, 4289)),
+  Box(Box(4290, 4290), Box(4290, 4290)),
+  Box(Box(4291, 4291), Box(4291, 4291)),
+  Box(Box(4292, 4292), Box(4292, 4292)),
+  Box(Box(4293, 4293), Box(4293, 4293)),
+  Box(Box(4294, 4294), Box(4294, 4294)),
+  Box(Box(4295, 4295), Box(4295, 4295)),
+  Box(Box(4296, 4296), Box(4296, 4296)),
+  Box(Box(4297, 4297), Box(4297, 4297)),
+  Box(Box(4298, 4298), Box(4298, 4298)),
+  Box(Box(4299, 4299), Box(4299, 4299)),
+  Box(Box(4300, 4300), Box(4300, 4300)),
+  Box(Box(4301, 4301), Box(4301, 4301)),
+  Box(Box(4302, 4302), Box(4302, 4302)),
+  Box(Box(4303, 4303), Box(4303, 4303)),
+  Box(Box(4304, 4304), Box(4304, 4304)),
+  Box(Box(4305, 4305), Box(4305, 4305)),
+  Box(Box(4306, 4306), Box(4306, 4306)),
+  Box(Box(4307, 4307), Box(4307, 4307)),
+  Box(Box(4308, 4308), Box(4308, 4308)),
+  Box(Box(4309, 4309), Box(4309, 4309)),
+  Box(Box(4310, 4310), Box(4310, 4310)),
+  Box(Box(4311, 4311), Box(4311, 4311)),
+  Box(Box(4312, 4312), Box(4312, 4312)),
+  Box(Box(4313, 4313), Box(4313, 4313)),
+  Box(Box(4314, 4314), Box(4314, 4314)),
+  Box(Box(4315, 4315), Box(4315, 4315)),
+  Box(Box(4316, 4316), Box(4316, 4316)),
+  Box(Box(4317, 4317), Box(4317, 4317)),
+  Box(Box(4318, 4318), Box(4318, 4318)),
+  Box(Box(4319, 4319), Box(4319, 4319)),
+  Box(Box(4320, 4320), Box(4320, 4320)),
+  Box(Box(4321, 4321), Box(4321, 4321)),
+  Box(Box(4322, 4322), Box(4322, 4322)),
+  Box(Box(4323, 4323), Box(4323, 4323)),
+  Box(Box(4324, 4324), Box(4324, 4324)),
+  Box(Box(4325, 4325), Box(4325, 4325)),
+  Box(Box(4326, 4326), Box(4326, 4326)),
+  Box(Box(4327, 4327), Box(4327, 4327)),
+  Box(Box(4328, 4328), Box(4328, 4328)),
+  Box(Box(4329, 4329), Box(4329, 4329)),
+  Box(Box(4330, 4330), Box(4330, 4330)),
+  Box(Box(4331, 4331), Box(4331, 4331)),
+  Box(Box(4332, 4332), Box(4332, 4332)),
+  Box(Box(4333, 4333), Box(4333, 4333)),
+  Box(Box(4334, 4334), Box(4334, 4334)),
+  Box(Box(4335, 4335), Box(4335, 4335)),
+  Box(Box(4336, 4336), Box(4336, 4336)),
+  Box(Box(4337, 4337), Box(4337, 4337)),
+  Box(Box(4338, 4338), Box(4338, 4338)),
+  Box(Box(4339, 4339), Box(4339, 4339)),
+  Box(Box(4340, 4340), Box(4340, 4340)),
+  Box(Box(4341, 4341), Box(4341, 4341)),
+  Box(Box(4342, 4342), Box(4342, 4342)),
+  Box(Box(4343, 4343), Box(4343, 4343)),
+  Box(Box(4344, 4344), Box(4344, 4344)),
+  Box(Box(4345, 4345), Box(4345, 4345)),
+  Box(Box(4346, 4346), Box(4346, 4346)),
+  Box(Box(4347, 4347), Box(4347, 4347)),
+  Box(Box(4348, 4348), Box(4348, 4348)),
+  Box(Box(4349, 4349), Box(4349, 4349)),
+  Box(Box(4350, 4350), Box(4350, 4350)),
+  Box(Box(4351, 4351), Box(4351, 4351)),
+  Box(Box(4352, 4352), Box(4352, 4352)),
+  Box(Box(4353, 4353), Box(4353, 4353)),
+  Box(Box(4354, 4354), Box(4354, 4354)),
+  Box(Box(4355, 4355), Box(4355, 4355)),
+  Box(Box(4356, 4356), Box(4356, 4356)),
+  Box(Box(4357, 4357), Box(4357, 4357)),
+  Box(Box(4358, 4358), Box(4358, 4358)),
+  Box(Box(4359, 4359), Box(4359, 4359)),
+  Box(Box(4360, 4360), Box(4360, 4360)),
+  Box(Box(4361, 4361), Box(4361, 4361)),
+  Box(Box(4362, 4362), Box(4362, 4362)),
+  Box(Box(4363, 4363), Box(4363, 4363)),
+  Box(Box(4364, 4364), Box(4364, 4364)),
+  Box(Box(4365, 4365), Box(4365, 4365)),
+  Box(Box(4366, 4366), Box(4366, 4366)),
+  Box(Box(4367, 4367), Box(4367, 4367)),
+  Box(Box(4368, 4368), Box(4368, 4368)),
+  Box(Box(4369, 4369), Box(4369, 4369)),
+  Box(Box(4370, 4370), Box(4370, 4370)),
+  Box(Box(4371, 4371), Box(4371, 4371)),
+  Box(Box(4372, 4372), Box(4372, 4372)),
+  Box(Box(4373, 4373), Box(4373, 4373)),
+  Box(Box(4374, 4374), Box(4374, 4374)),
+  Box(Box(4375, 4375), Box(4375, 4375)),
+  Box(Box(4376, 4376), Box(4376, 4376)),
+  Box(Box(4377, 4377), Box(4377, 4377)),
+  Box(Box(4378, 4378), Box(4378, 4378)),
+  Box(Box(4379, 4379), Box(4379, 4379)),
+  Box(Box(4380, 4380), Box(4380, 4380)),
+  Box(Box(4381, 4381), Box(4381, 4381)),
+  Box(Box(4382, 4382), Box(4382, 4382)),
+  Box(Box(4383, 4383), Box(4383, 4383)),
+  Box(Box(4384, 4384), Box(4384, 4384)),
+  Box(Box(4385, 4385), Box(4385, 4385)),
+  Box(Box(4386, 4386), Box(4386, 4386)),
+  Box(Box(4387, 4387), Box(4387, 4387)),
+  Box(Box(4388, 4388), Box(4388, 4388)),
+  Box(Box(4389, 4389), Box(4389, 4389)),
+  Box(Box(4390, 4390), Box(4390, 4390)),
+  Box(Box(4391, 4391), Box(4391, 4391)),
+  Box(Box(4392, 4392), Box(4392, 4392)),
+  Box(Box(4393, 4393), Box(4393, 4393)),
+  Box(Box(4394, 4394), Box(4394, 4394)),
+  Box(Box(4395, 4395), Box(4395, 4395)),
+  Box(Box(4396, 4396), Box(4396, 4396)),
+  Box(Box(4397, 4397), Box(4397, 4397)),
+  Box(Box(4398, 4398), Box(4398, 4398)),
+  Box(Box(4399, 4399), Box(4399, 4399)),
+  Box(Box(4400, 4400), Box(4400, 4400)),
+  Box(Box(4401, 4401), Box(4401, 4401)),
+  Box(Box(4402, 4402), Box(4402, 4402)),
+  Box(Box(4403, 4403), Box(4403, 4403)),
+  Box(Box(4404, 4404), Box(4404, 4404)),
+  Box(Box(4405, 4405), Box(4405, 4405)),
+  Box(Box(4406, 4406), Box(4406, 4406)),
+  Box(Box(4407, 4407), Box(4407, 4407)),
+  Box(Box(4408, 4408), Box(4408, 4408)),
+  Box(Box(4409, 4409), Box(4409, 4409)),
+  Box(Box(4410, 4410), Box(4410, 4410)),
+  Box(Box(4411, 4411), Box(4411, 4411)),
+  Box(Box(4412, 4412), Box(4412, 4412)),
+  Box(Box(4413, 4413), Box(4413, 4413)),
+  Box(Box(4414, 4414), Box(4414, 4414)),
+  Box(Box(4415, 4415), Box(4415, 4415)),
+  Box(Box(4416, 4416), Box(4416, 4416)),
+  Box(Box(4417, 4417), Box(4417, 4417)),
+  Box(Box(4418, 4418), Box(4418, 4418)),
+  Box(Box(4419, 4419), Box(4419, 4419)),
+  Box(Box(4420, 4420), Box(4420, 4420)),
+  Box(Box(4421, 4421), Box(4421, 4421)),
+  Box(Box(4422, 4422), Box(4422, 4422)),
+  Box(Box(4423, 4423), Box(4423, 4423)),
+  Box(Box(4424, 4424), Box(4424, 4424)),
+  Box(Box(4425, 4425), Box(4425, 4425)),
+  Box(Box(4426, 4426), Box(4426, 4426)),
+  Box(Box(4427, 4427), Box(4427, 4427)),
+  Box(Box(4428, 4428), Box(4428, 4428)),
+  Box(Box(4429, 4429), Box(4429, 4429)),
+  Box(Box(4430, 4430), Box(4430, 4430)),
+  Box(Box(4431, 4431), Box(4431, 4431)),
+  Box(Box(4432, 4432), Box(4432, 4432)),
+  Box(Box(4433, 4433), Box(4433, 4433)),
+  Box(Box(4434, 4434), Box(4434, 4434)),
+  Box(Box(4435, 4435), Box(4435, 4435)),
+  Box(Box(4436, 4436), Box(4436, 4436)),
+  Box(Box(4437, 4437), Box(4437, 4437)),
+  Box(Box(4438, 4438), Box(4438, 4438)),
+  Box(Box(4439, 4439), Box(4439, 4439)),
+  Box(Box(4440, 4440), Box(4440, 4440)),
+  Box(Box(4441, 4441), Box(4441, 4441)),
+  Box(Box(4442, 4442), Box(4442, 4442)),
+  Box(Box(4443, 4443), Box(4443, 4443)),
+  Box(Box(4444, 4444), Box(4444, 4444)),
+  Box(Box(4445, 4445), Box(4445, 4445)),
+  Box(Box(4446, 4446), Box(4446, 4446)),
+  Box(Box(4447, 4447), Box(4447, 4447)),
+  Box(Box(4448, 4448), Box(4448, 4448)),
+  Box(Box(4449, 4449), Box(4449, 4449)),
+  Box(Box(4450, 4450), Box(4450, 4450)),
+  Box(Box(4451, 4451), Box(4451, 4451)),
+  Box(Box(4452, 4452), Box(4452, 4452)),
+  Box(Box(4453, 4453), Box(4453, 4453)),
+  Box(Box(4454, 4454), Box(4454, 4454)),
+  Box(Box(4455, 4455), Box(4455, 4455)),
+  Box(Box(4456, 4456), Box(4456, 4456)),
+  Box(Box(4457, 4457), Box(4457, 4457)),
+  Box(Box(4458, 4458), Box(4458, 4458)),
+  Box(Box(4459, 4459), Box(4459, 4459)),
+  Box(Box(4460, 4460), Box(4460, 4460)),
+  Box(Box(4461, 4461), Box(4461, 4461)),
+  Box(Box(4462, 4462), Box(4462, 4462)),
+  Box(Box(4463, 4463), Box(4463, 4463)),
+  Box(Box(4464, 4464), Box(4464, 4464)),
+  Box(Box(4465, 4465), Box(4465, 4465)),
+  Box(Box(4466, 4466), Box(4466, 4466)),
+  Box(Box(4467, 4467), Box(4467, 4467)),
+  Box(Box(4468, 4468), Box(4468, 4468)),
+  Box(Box(4469, 4469), Box(4469, 4469)),
+  Box(Box(4470, 4470), Box(4470, 4470)),
+  Box(Box(4471, 4471), Box(4471, 4471)),
+  Box(Box(4472, 4472), Box(4472, 4472)),
+  Box(Box(4473, 4473), Box(4473, 4473)),
+  Box(Box(4474, 4474), Box(4474, 4474)),
+  Box(Box(4475, 4475), Box(4475, 4475)),
+  Box(Box(4476, 4476), Box(4476, 4476)),
+  Box(Box(4477, 4477), Box(4477, 4477)),
+  Box(Box(4478, 4478), Box(4478, 4478)),
+  Box(Box(4479, 4479), Box(4479, 4479)),
+  Box(Box(4480, 4480), Box(4480, 4480)),
+  Box(Box(4481, 4481), Box(4481, 4481)),
+  Box(Box(4482, 4482), Box(4482, 4482)),
+  Box(Box(4483, 4483), Box(4483, 4483)),
+  Box(Box(4484, 4484), Box(4484, 4484)),
+  Box(Box(4485, 4485), Box(4485, 4485)),
+  Box(Box(4486, 4486), Box(4486, 4486)),
+  Box(Box(4487, 4487), Box(4487, 4487)),
+  Box(Box(4488, 4488), Box(4488, 4488)),
+  Box(Box(4489, 4489), Box(4489, 4489)),
+  Box(Box(4490, 4490), Box(4490, 4490)),
+  Box(Box(4491, 4491), Box(4491, 4491)),
+  Box(Box(4492, 4492), Box(4492, 4492)),
+  Box(Box(4493, 4493), Box(4493, 4493)),
+  Box(Box(4494, 4494), Box(4494, 4494)),
+  Box(Box(4495, 4495), Box(4495, 4495)),
+  Box(Box(4496, 4496), Box(4496, 4496)),
+  Box(Box(4497, 4497), Box(4497, 4497)),
+  Box(Box(4498, 4498), Box(4498, 4498)),
+  Box(Box(4499, 4499), Box(4499, 4499)),
+  Box(Box(4500, 4500), Box(4500, 4500)),
+  Box(Box(4501, 4501), Box(4501, 4501)),
+  Box(Box(4502, 4502), Box(4502, 4502)),
+  Box(Box(4503, 4503), Box(4503, 4503)),
+  Box(Box(4504, 4504), Box(4504, 4504)),
+  Box(Box(4505, 4505), Box(4505, 4505)),
+  Box(Box(4506, 4506), Box(4506, 4506)),
+  Box(Box(4507, 4507), Box(4507, 4507)),
+  Box(Box(4508, 4508), Box(4508, 4508)),
+  Box(Box(4509, 4509), Box(4509, 4509)),
+  Box(Box(4510, 4510), Box(4510, 4510)),
+  Box(Box(4511, 4511), Box(4511, 4511)),
+  Box(Box(4512, 4512), Box(4512, 4512)),
+  Box(Box(4513, 4513), Box(4513, 4513)),
+  Box(Box(4514, 4514), Box(4514, 4514)),
+  Box(Box(4515, 4515), Box(4515, 4515)),
+  Box(Box(4516, 4516), Box(4516, 4516)),
+  Box(Box(4517, 4517), Box(4517, 4517)),
+  Box(Box(4518, 4518), Box(4518, 4518)),
+  Box(Box(4519, 4519), Box(4519, 4519)),
+  Box(Box(4520, 4520), Box(4520, 4520)),
+  Box(Box(4521, 4521), Box(4521, 4521)),
+  Box(Box(4522, 4522), Box(4522, 4522)),
+  Box(Box(4523, 4523), Box(4523, 4523)),
+  Box(Box(4524, 4524), Box(4524, 4524)),
+  Box(Box(4525, 4525), Box(4525, 4525)),
+  Box(Box(4526, 4526), Box(4526, 4526)),
+  Box(Box(4527, 4527), Box(4527, 4527)),
+  Box(Box(4528, 4528), Box(4528, 4528)),
+  Box(Box(4529, 4529), Box(4529, 4529)),
+  Box(Box(4530, 4530), Box(4530, 4530)),
+  Box(Box(4531, 4531), Box(4531, 4531)),
+  Box(Box(4532, 4532), Box(4532, 4532)),
+  Box(Box(4533, 4533), Box(4533, 4533)),
+  Box(Box(4534, 4534), Box(4534, 4534)),
+  Box(Box(4535, 4535), Box(4535, 4535)),
+  Box(Box(4536, 4536), Box(4536, 4536)),
+  Box(Box(4537, 4537), Box(4537, 4537)),
+  Box(Box(4538, 4538), Box(4538, 4538)),
+  Box(Box(4539, 4539), Box(4539, 4539)),
+  Box(Box(4540, 4540), Box(4540, 4540)),
+  Box(Box(4541, 4541), Box(4541, 4541)),
+  Box(Box(4542, 4542), Box(4542, 4542)),
+  Box(Box(4543, 4543), Box(4543, 4543)),
+  Box(Box(4544, 4544), Box(4544, 4544)),
+  Box(Box(4545, 4545), Box(4545, 4545)),
+  Box(Box(4546, 4546), Box(4546, 4546)),
+  Box(Box(4547, 4547), Box(4547, 4547)),
+  Box(Box(4548, 4548), Box(4548, 4548)),
+  Box(Box(4549, 4549), Box(4549, 4549)),
+  Box(Box(4550, 4550), Box(4550, 4550)),
+  Box(Box(4551, 4551), Box(4551, 4551)),
+  Box(Box(4552, 4552), Box(4552, 4552)),
+  Box(Box(4553, 4553), Box(4553, 4553)),
+  Box(Box(4554, 4554), Box(4554, 4554)),
+  Box(Box(4555, 4555), Box(4555, 4555)),
+  Box(Box(4556, 4556), Box(4556, 4556)),
+  Box(Box(4557, 4557), Box(4557, 4557)),
+  Box(Box(4558, 4558), Box(4558, 4558)),
+  Box(Box(4559, 4559), Box(4559, 4559)),
+  Box(Box(4560, 4560), Box(4560, 4560)),
+  Box(Box(4561, 4561), Box(4561, 4561)),
+  Box(Box(4562, 4562), Box(4562, 4562)),
+  Box(Box(4563, 4563), Box(4563, 4563)),
+  Box(Box(4564, 4564), Box(4564, 4564)),
+  Box(Box(4565, 4565), Box(4565, 4565)),
+  Box(Box(4566, 4566), Box(4566, 4566)),
+  Box(Box(4567, 4567), Box(4567, 4567)),
+  Box(Box(4568, 4568), Box(4568, 4568)),
+  Box(Box(4569, 4569), Box(4569, 4569)),
+  Box(Box(4570, 4570), Box(4570, 4570)),
+  Box(Box(4571, 4571), Box(4571, 4571)),
+  Box(Box(4572, 4572), Box(4572, 4572)),
+  Box(Box(4573, 4573), Box(4573, 4573)),
+  Box(Box(4574, 4574), Box(4574, 4574)),
+  Box(Box(4575, 4575), Box(4575, 4575)),
+  Box(Box(4576, 4576), Box(4576, 4576)),
+  Box(Box(4577, 4577), Box(4577, 4577)),
+  Box(Box(4578, 4578), Box(4578, 4578)),
+  Box(Box(4579, 4579), Box(4579, 4579)),
+  Box(Box(4580, 4580), Box(4580, 4580)),
+  Box(Box(4581, 4581), Box(4581, 4581)),
+  Box(Box(4582, 4582), Box(4582, 4582)),
+  Box(Box(4583, 4583), Box(4583, 4583)),
+  Box(Box(4584, 4584), Box(4584, 4584)),
+  Box(Box(4585, 4585), Box(4585, 4585)),
+  Box(Box(4586, 4586), Box(4586, 4586)),
+  Box(Box(4587, 4587), Box(4587, 4587)),
+  Box(Box(4588, 4588), Box(4588, 4588)),
+  Box(Box(4589, 4589), Box(4589, 4589)),
+  Box(Box(4590, 4590), Box(4590, 4590)),
+  Box(Box(4591, 4591), Box(4591, 4591)),
+  Box(Box(4592, 4592), Box(4592, 4592)),
+  Box(Box(4593, 4593), Box(4593, 4593)),
+  Box(Box(4594, 4594), Box(4594, 4594)),
+  Box(Box(4595, 4595), Box(4595, 4595)),
+  Box(Box(4596, 4596), Box(4596, 4596)),
+  Box(Box(4597, 4597), Box(4597, 4597)),
+  Box(Box(4598, 4598), Box(4598, 4598)),
+  Box(Box(4599, 4599), Box(4599, 4599)),
+  Box(Box(4600, 4600), Box(4600, 4600)),
+  Box(Box(4601, 4601), Box(4601, 4601)),
+  Box(Box(4602, 4602), Box(4602, 4602)),
+  Box(Box(4603, 4603), Box(4603, 4603)),
+  Box(Box(4604, 4604), Box(4604, 4604)),
+  Box(Box(4605, 4605), Box(4605, 4605)),
+  Box(Box(4606, 4606), Box(4606, 4606)),
+  Box(Box(4607, 4607), Box(4607, 4607)),
+  Box(Box(4608, 4608), Box(4608, 4608)),
+  Box(Box(4609, 4609), Box(4609, 4609)),
+  Box(Box(4610, 4610), Box(4610, 4610)),
+  Box(Box(4611, 4611), Box(4611, 4611)),
+  Box(Box(4612, 4612), Box(4612, 4612)),
+  Box(Box(4613, 4613), Box(4613, 4613)),
+  Box(Box(4614, 4614), Box(4614, 4614)),
+  Box(Box(4615, 4615), Box(4615, 4615)),
+  Box(Box(4616, 4616), Box(4616, 4616)),
+  Box(Box(4617, 4617), Box(4617, 4617)),
+  Box(Box(4618, 4618), Box(4618, 4618)),
+  Box(Box(4619, 4619), Box(4619, 4619)),
+  Box(Box(4620, 4620), Box(4620, 4620)),
+  Box(Box(4621, 4621), Box(4621, 4621)),
+  Box(Box(4622, 4622), Box(4622, 4622)),
+  Box(Box(4623, 4623), Box(4623, 4623)),
+  Box(Box(4624, 4624), Box(4624, 4624)),
+  Box(Box(4625, 4625), Box(4625, 4625)),
+  Box(Box(4626, 4626), Box(4626, 4626)),
+  Box(Box(4627, 4627), Box(4627, 4627)),
+  Box(Box(4628, 4628), Box(4628, 4628)),
+  Box(Box(4629, 4629), Box(4629, 4629)),
+  Box(Box(4630, 4630), Box(4630, 4630)),
+  Box(Box(4631, 4631), Box(4631, 4631)),
+  Box(Box(4632, 4632), Box(4632, 4632)),
+  Box(Box(4633, 4633), Box(4633, 4633)),
+  Box(Box(4634, 4634), Box(4634, 4634)),
+  Box(Box(4635, 4635), Box(4635, 4635)),
+  Box(Box(4636, 4636), Box(4636, 4636)),
+  Box(Box(4637, 4637), Box(4637, 4637)),
+  Box(Box(4638, 4638), Box(4638, 4638)),
+  Box(Box(4639, 4639), Box(4639, 4639)),
+  Box(Box(4640, 4640), Box(4640, 4640)),
+  Box(Box(4641, 4641), Box(4641, 4641)),
+  Box(Box(4642, 4642), Box(4642, 4642)),
+  Box(Box(4643, 4643), Box(4643, 4643)),
+  Box(Box(4644, 4644), Box(4644, 4644)),
+  Box(Box(4645, 4645), Box(4645, 4645)),
+  Box(Box(4646, 4646), Box(4646, 4646)),
+  Box(Box(4647, 4647), Box(4647, 4647)),
+  Box(Box(4648, 4648), Box(4648, 4648)),
+  Box(Box(4649, 4649), Box(4649, 4649)),
+  Box(Box(4650, 4650), Box(4650, 4650)),
+  Box(Box(4651, 4651), Box(4651, 4651)),
+  Box(Box(4652, 4652), Box(4652, 4652)),
+  Box(Box(4653, 4653), Box(4653, 4653)),
+  Box(Box(4654, 4654), Box(4654, 4654)),
+  Box(Box(4655, 4655), Box(4655, 4655)),
+  Box(Box(4656, 4656), Box(4656, 4656)),
+  Box(Box(4657, 4657), Box(4657, 4657)),
+  Box(Box(4658, 4658), Box(4658, 4658)),
+  Box(Box(4659, 4659), Box(4659, 4659)),
+  Box(Box(4660, 4660), Box(4660, 4660)),
+  Box(Box(4661, 4661), Box(4661, 4661)),
+  Box(Box(4662, 4662), Box(4662, 4662)),
+  Box(Box(4663, 4663), Box(4663, 4663)),
+  Box(Box(4664, 4664), Box(4664, 4664)),
+  Box(Box(4665, 4665), Box(4665, 4665)),
+  Box(Box(4666, 4666), Box(4666, 4666)),
+  Box(Box(4667, 4667), Box(4667, 4667)),
+  Box(Box(4668, 4668), Box(4668, 4668)),
+  Box(Box(4669, 4669), Box(4669, 4669)),
+  Box(Box(4670, 4670), Box(4670, 4670)),
+  Box(Box(4671, 4671), Box(4671, 4671)),
+  Box(Box(4672, 4672), Box(4672, 4672)),
+  Box(Box(4673, 4673), Box(4673, 4673)),
+  Box(Box(4674, 4674), Box(4674, 4674)),
+  Box(Box(4675, 4675), Box(4675, 4675)),
+  Box(Box(4676, 4676), Box(4676, 4676)),
+  Box(Box(4677, 4677), Box(4677, 4677)),
+  Box(Box(4678, 4678), Box(4678, 4678)),
+  Box(Box(4679, 4679), Box(4679, 4679)),
+  Box(Box(4680, 4680), Box(4680, 4680)),
+  Box(Box(4681, 4681), Box(4681, 4681)),
+  Box(Box(4682, 4682), Box(4682, 4682)),
+  Box(Box(4683, 4683), Box(4683, 4683)),
+  Box(Box(4684, 4684), Box(4684, 4684)),
+  Box(Box(4685, 4685), Box(4685, 4685)),
+  Box(Box(4686, 4686), Box(4686, 4686)),
+  Box(Box(4687, 4687), Box(4687, 4687)),
+  Box(Box(4688, 4688), Box(4688, 4688)),
+  Box(Box(4689, 4689), Box(4689, 4689)),
+  Box(Box(4690, 4690), Box(4690, 4690)),
+  Box(Box(4691, 4691), Box(4691, 4691)),
+  Box(Box(4692, 4692), Box(4692, 4692)),
+  Box(Box(4693, 4693), Box(4693, 4693)),
+  Box(Box(4694, 4694), Box(4694, 4694)),
+  Box(Box(4695, 4695), Box(4695, 4695)),
+  Box(Box(4696, 4696), Box(4696, 4696)),
+  Box(Box(4697, 4697), Box(4697, 4697)),
+  Box(Box(4698, 4698), Box(4698, 4698)),
+  Box(Box(4699, 4699), Box(4699, 4699)),
+  Box(Box(4700, 4700), Box(4700, 4700)),
+  Box(Box(4701, 4701), Box(4701, 4701)),
+  Box(Box(4702, 4702), Box(4702, 4702)),
+  Box(Box(4703, 4703), Box(4703, 4703)),
+  Box(Box(4704, 4704), Box(4704, 4704)),
+  Box(Box(4705, 4705), Box(4705, 4705)),
+  Box(Box(4706, 4706), Box(4706, 4706)),
+  Box(Box(4707, 4707), Box(4707, 4707)),
+  Box(Box(4708, 4708), Box(4708, 4708)),
+  Box(Box(4709, 4709), Box(4709, 4709)),
+  Box(Box(4710, 4710), Box(4710, 4710)),
+  Box(Box(4711, 4711), Box(4711, 4711)),
+  Box(Box(4712, 4712), Box(4712, 4712)),
+  Box(Box(4713, 4713), Box(4713, 4713)),
+  Box(Box(4714, 4714), Box(4714, 4714)),
+  Box(Box(4715, 4715), Box(4715, 4715)),
+  Box(Box(4716, 4716), Box(4716, 4716)),
+  Box(Box(4717, 4717), Box(4717, 4717)),
+  Box(Box(4718, 4718), Box(4718, 4718)),
+  Box(Box(4719, 4719), Box(4719, 4719)),
+  Box(Box(4720, 4720), Box(4720, 4720)),
+  Box(Box(4721, 4721), Box(4721, 4721)),
+  Box(Box(4722, 4722), Box(4722, 4722)),
+  Box(Box(4723, 4723), Box(4723, 4723)),
+  Box(Box(4724, 4724), Box(4724, 4724)),
+  Box(Box(4725, 4725), Box(4725, 4725)),
+  Box(Box(4726, 4726), Box(4726, 4726)),
+  Box(Box(4727, 4727), Box(4727, 4727)),
+  Box(Box(4728, 4728), Box(4728, 4728)),
+  Box(Box(4729, 4729), Box(4729, 4729)),
+  Box(Box(4730, 4730), Box(4730, 4730)),
+  Box(Box(4731, 4731), Box(4731, 4731)),
+  Box(Box(4732, 4732), Box(4732, 4732)),
+  Box(Box(4733, 4733), Box(4733, 4733)),
+  Box(Box(4734, 4734), Box(4734, 4734)),
+  Box(Box(4735, 4735), Box(4735, 4735)),
+  Box(Box(4736, 4736), Box(4736, 4736)),
+  Box(Box(4737, 4737), Box(4737, 4737)),
+  Box(Box(4738, 4738), Box(4738, 4738)),
+  Box(Box(4739, 4739), Box(4739, 4739)),
+  Box(Box(4740, 4740), Box(4740, 4740)),
+  Box(Box(4741, 4741), Box(4741, 4741)),
+  Box(Box(4742, 4742), Box(4742, 4742)),
+  Box(Box(4743, 4743), Box(4743, 4743)),
+  Box(Box(4744, 4744), Box(4744, 4744)),
+  Box(Box(4745, 4745), Box(4745, 4745)),
+  Box(Box(4746, 4746), Box(4746, 4746)),
+  Box(Box(4747, 4747), Box(4747, 4747)),
+  Box(Box(4748, 4748), Box(4748, 4748)),
+  Box(Box(4749, 4749), Box(4749, 4749)),
+  Box(Box(4750, 4750), Box(4750, 4750)),
+  Box(Box(4751, 4751), Box(4751, 4751)),
+  Box(Box(4752, 4752), Box(4752, 4752)),
+  Box(Box(4753, 4753), Box(4753, 4753)),
+  Box(Box(4754, 4754), Box(4754, 4754)),
+  Box(Box(4755, 4755), Box(4755, 4755)),
+  Box(Box(4756, 4756), Box(4756, 4756)),
+  Box(Box(4757, 4757), Box(4757, 4757)),
+  Box(Box(4758, 4758), Box(4758, 4758)),
+  Box(Box(4759, 4759), Box(4759, 4759)),
+  Box(Box(4760, 4760), Box(4760, 4760)),
+  Box(Box(4761, 4761), Box(4761, 4761)),
+  Box(Box(4762, 4762), Box(4762, 4762)),
+  Box(Box(4763, 4763), Box(4763, 4763)),
+  Box(Box(4764, 4764), Box(4764, 4764)),
+  Box(Box(4765, 4765), Box(4765, 4765)),
+  Box(Box(4766, 4766), Box(4766, 4766)),
+  Box(Box(4767, 4767), Box(4767, 4767)),
+  Box(Box(4768, 4768), Box(4768, 4768)),
+  Box(Box(4769, 4769), Box(4769, 4769)),
+  Box(Box(4770, 4770), Box(4770, 4770)),
+  Box(Box(4771, 4771), Box(4771, 4771)),
+  Box(Box(4772, 4772), Box(4772, 4772)),
+  Box(Box(4773, 4773), Box(4773, 4773)),
+  Box(Box(4774, 4774), Box(4774, 4774)),
+  Box(Box(4775, 4775), Box(4775, 4775)),
+  Box(Box(4776, 4776), Box(4776, 4776)),
+  Box(Box(4777, 4777), Box(4777, 4777)),
+  Box(Box(4778, 4778), Box(4778, 4778)),
+  Box(Box(4779, 4779), Box(4779, 4779)),
+  Box(Box(4780, 4780), Box(4780, 4780)),
+  Box(Box(4781, 4781), Box(4781, 4781)),
+  Box(Box(4782, 4782), Box(4782, 4782)),
+  Box(Box(4783, 4783), Box(4783, 4783)),
+  Box(Box(4784, 4784), Box(4784, 4784)),
+  Box(Box(4785, 4785), Box(4785, 4785)),
+  Box(Box(4786, 4786), Box(4786, 4786)),
+  Box(Box(4787, 4787), Box(4787, 4787)),
+  Box(Box(4788, 4788), Box(4788, 4788)),
+  Box(Box(4789, 4789), Box(4789, 4789)),
+  Box(Box(4790, 4790), Box(4790, 4790)),
+  Box(Box(4791, 4791), Box(4791, 4791)),
+  Box(Box(4792, 4792), Box(4792, 4792)),
+  Box(Box(4793, 4793), Box(4793, 4793)),
+  Box(Box(4794, 4794), Box(4794, 4794)),
+  Box(Box(4795, 4795), Box(4795, 4795)),
+  Box(Box(4796, 4796), Box(4796, 4796)),
+  Box(Box(4797, 4797), Box(4797, 4797)),
+  Box(Box(4798, 4798), Box(4798, 4798)),
+  Box(Box(4799, 4799), Box(4799, 4799)),
+  Box(Box(4800, 4800), Box(4800, 4800)),
+  Box(Box(4801, 4801), Box(4801, 4801)),
+  Box(Box(4802, 4802), Box(4802, 4802)),
+  Box(Box(4803, 4803), Box(4803, 4803)),
+  Box(Box(4804, 4804), Box(4804, 4804)),
+  Box(Box(4805, 4805), Box(4805, 4805)),
+  Box(Box(4806, 4806), Box(4806, 4806)),
+  Box(Box(4807, 4807), Box(4807, 4807)),
+  Box(Box(4808, 4808), Box(4808, 4808)),
+  Box(Box(4809, 4809), Box(4809, 4809)),
+  Box(Box(4810, 4810), Box(4810, 4810)),
+  Box(Box(4811, 4811), Box(4811, 4811)),
+  Box(Box(4812, 4812), Box(4812, 4812)),
+  Box(Box(4813, 4813), Box(4813, 4813)),
+  Box(Box(4814, 4814), Box(4814, 4814)),
+  Box(Box(4815, 4815), Box(4815, 4815)),
+  Box(Box(4816, 4816), Box(4816, 4816)),
+  Box(Box(4817, 4817), Box(4817, 4817)),
+  Box(Box(4818, 4818), Box(4818, 4818)),
+  Box(Box(4819, 4819), Box(4819, 4819)),
+  Box(Box(4820, 4820), Box(4820, 4820)),
+  Box(Box(4821, 4821), Box(4821, 4821)),
+  Box(Box(4822, 4822), Box(4822, 4822)),
+  Box(Box(4823, 4823), Box(4823, 4823)),
+  Box(Box(4824, 4824), Box(4824, 4824)),
+  Box(Box(4825, 4825), Box(4825, 4825)),
+  Box(Box(4826, 4826), Box(4826, 4826)),
+  Box(Box(4827, 4827), Box(4827, 4827)),
+  Box(Box(4828, 4828), Box(4828, 4828)),
+  Box(Box(4829, 4829), Box(4829, 4829)),
+  Box(Box(4830, 4830), Box(4830, 4830)),
+  Box(Box(4831, 4831), Box(4831, 4831)),
+  Box(Box(4832, 4832), Box(4832, 4832)),
+  Box(Box(4833, 4833), Box(4833, 4833)),
+  Box(Box(4834, 4834), Box(4834, 4834)),
+  Box(Box(4835, 4835), Box(4835, 4835)),
+  Box(Box(4836, 4836), Box(4836, 4836)),
+  Box(Box(4837, 4837), Box(4837, 4837)),
+  Box(Box(4838, 4838), Box(4838, 4838)),
+  Box(Box(4839, 4839), Box(4839, 4839)),
+  Box(Box(4840, 4840), Box(4840, 4840)),
+  Box(Box(4841, 4841), Box(4841, 4841)),
+  Box(Box(4842, 4842), Box(4842, 4842)),
+  Box(Box(4843, 4843), Box(4843, 4843)),
+  Box(Box(4844, 4844), Box(4844, 4844)),
+  Box(Box(4845, 4845), Box(4845, 4845)),
+  Box(Box(4846, 4846), Box(4846, 4846)),
+  Box(Box(4847, 4847), Box(4847, 4847)),
+  Box(Box(4848, 4848), Box(4848, 4848)),
+  Box(Box(4849, 4849), Box(4849, 4849)),
+  Box(Box(4850, 4850), Box(4850, 4850)),
+  Box(Box(4851, 4851), Box(4851, 4851)),
+  Box(Box(4852, 4852), Box(4852, 4852)),
+  Box(Box(4853, 4853), Box(4853, 4853)),
+  Box(Box(4854, 4854), Box(4854, 4854)),
+  Box(Box(4855, 4855), Box(4855, 4855)),
+  Box(Box(4856, 4856), Box(4856, 4856)),
+  Box(Box(4857, 4857), Box(4857, 4857)),
+  Box(Box(4858, 4858), Box(4858, 4858)),
+  Box(Box(4859, 4859), Box(4859, 4859)),
+  Box(Box(4860, 4860), Box(4860, 4860)),
+  Box(Box(4861, 4861), Box(4861, 4861)),
+  Box(Box(4862, 4862), Box(4862, 4862)),
+  Box(Box(4863, 4863), Box(4863, 4863)),
+  Box(Box(4864, 4864), Box(4864, 4864)),
+  Box(Box(4865, 4865), Box(4865, 4865)),
+  Box(Box(4866, 4866), Box(4866, 4866)),
+  Box(Box(4867, 4867), Box(4867, 4867)),
+  Box(Box(4868, 4868), Box(4868, 4868)),
+  Box(Box(4869, 4869), Box(4869, 4869)),
+  Box(Box(4870, 4870), Box(4870, 4870)),
+  Box(Box(4871, 4871), Box(4871, 4871)),
+  Box(Box(4872, 4872), Box(4872, 4872)),
+  Box(Box(4873, 4873), Box(4873, 4873)),
+  Box(Box(4874, 4874), Box(4874, 4874)),
+  Box(Box(4875, 4875), Box(4875, 4875)),
+  Box(Box(4876, 4876), Box(4876, 4876)),
+  Box(Box(4877, 4877), Box(4877, 4877)),
+  Box(Box(4878, 4878), Box(4878, 4878)),
+  Box(Box(4879, 4879), Box(4879, 4879)),
+  Box(Box(4880, 4880), Box(4880, 4880)),
+  Box(Box(4881, 4881), Box(4881, 4881)),
+  Box(Box(4882, 4882), Box(4882, 4882)),
+  Box(Box(4883, 4883), Box(4883, 4883)),
+  Box(Box(4884, 4884), Box(4884, 4884)),
+  Box(Box(4885, 4885), Box(4885, 4885)),
+  Box(Box(4886, 4886), Box(4886, 4886)),
+  Box(Box(4887, 4887), Box(4887, 4887)),
+  Box(Box(4888, 4888), Box(4888, 4888)),
+  Box(Box(4889, 4889), Box(4889, 4889)),
+  Box(Box(4890, 4890), Box(4890, 4890)),
+  Box(Box(4891, 4891), Box(4891, 4891)),
+  Box(Box(4892, 4892), Box(4892, 4892)),
+  Box(Box(4893, 4893), Box(4893, 4893)),
+  Box(Box(4894, 4894), Box(4894, 4894)),
+  Box(Box(4895, 4895), Box(4895, 4895)),
+  Box(Box(4896, 4896), Box(4896, 4896)),
+  Box(Box(4897, 4897), Box(4897, 4897)),
+  Box(Box(4898, 4898), Box(4898, 4898)),
+  Box(Box(4899, 4899), Box(4899, 4899)),
+  Box(Box(4900, 4900), Box(4900, 4900)),
+  Box(Box(4901, 4901), Box(4901, 4901)),
+  Box(Box(4902, 4902), Box(4902, 4902)),
+  Box(Box(4903, 4903), Box(4903, 4903)),
+  Box(Box(4904, 4904), Box(4904, 4904)),
+  Box(Box(4905, 4905), Box(4905, 4905)),
+  Box(Box(4906, 4906), Box(4906, 4906)),
+  Box(Box(4907, 4907), Box(4907, 4907)),
+  Box(Box(4908, 4908), Box(4908, 4908)),
+  Box(Box(4909, 4909), Box(4909, 4909)),
+  Box(Box(4910, 4910), Box(4910, 4910)),
+  Box(Box(4911, 4911), Box(4911, 4911)),
+  Box(Box(4912, 4912), Box(4912, 4912)),
+  Box(Box(4913, 4913), Box(4913, 4913)),
+  Box(Box(4914, 4914), Box(4914, 4914)),
+  Box(Box(4915, 4915), Box(4915, 4915)),
+  Box(Box(4916, 4916), Box(4916, 4916)),
+  Box(Box(4917, 4917), Box(4917, 4917)),
+  Box(Box(4918, 4918), Box(4918, 4918)),
+  Box(Box(4919, 4919), Box(4919, 4919)),
+  Box(Box(4920, 4920), Box(4920, 4920)),
+  Box(Box(4921, 4921), Box(4921, 4921)),
+  Box(Box(4922, 4922), Box(4922, 4922)),
+  Box(Box(4923, 4923), Box(4923, 4923)),
+  Box(Box(4924, 4924), Box(4924, 4924)),
+  Box(Box(4925, 4925), Box(4925, 4925)),
+  Box(Box(4926, 4926), Box(4926, 4926)),
+  Box(Box(4927, 4927), Box(4927, 4927)),
+  Box(Box(4928, 4928), Box(4928, 4928)),
+  Box(Box(4929, 4929), Box(4929, 4929)),
+  Box(Box(4930, 4930), Box(4930, 4930)),
+  Box(Box(4931, 4931), Box(4931, 4931)),
+  Box(Box(4932, 4932), Box(4932, 4932)),
+  Box(Box(4933, 4933), Box(4933, 4933)),
+  Box(Box(4934, 4934), Box(4934, 4934)),
+  Box(Box(4935, 4935), Box(4935, 4935)),
+  Box(Box(4936, 4936), Box(4936, 4936)),
+  Box(Box(4937, 4937), Box(4937, 4937)),
+  Box(Box(4938, 4938), Box(4938, 4938)),
+  Box(Box(4939, 4939), Box(4939, 4939)),
+  Box(Box(4940, 4940), Box(4940, 4940)),
+  Box(Box(4941, 4941), Box(4941, 4941)),
+  Box(Box(4942, 4942), Box(4942, 4942)),
+  Box(Box(4943, 4943), Box(4943, 4943)),
+  Box(Box(4944, 4944), Box(4944, 4944)),
+  Box(Box(4945, 4945), Box(4945, 4945)),
+  Box(Box(4946, 4946), Box(4946, 4946)),
+  Box(Box(4947, 4947), Box(4947, 4947)),
+  Box(Box(4948, 4948), Box(4948, 4948)),
+  Box(Box(4949, 4949), Box(4949, 4949)),
+  Box(Box(4950, 4950), Box(4950, 4950)),
+  Box(Box(4951, 4951), Box(4951, 4951)),
+  Box(Box(4952, 4952), Box(4952, 4952)),
+  Box(Box(4953, 4953), Box(4953, 4953)),
+  Box(Box(4954, 4954), Box(4954, 4954)),
+  Box(Box(4955, 4955), Box(4955, 4955)),
+  Box(Box(4956, 4956), Box(4956, 4956)),
+  Box(Box(4957, 4957), Box(4957, 4957)),
+  Box(Box(4958, 4958), Box(4958, 4958)),
+  Box(Box(4959, 4959), Box(4959, 4959)),
+  Box(Box(4960, 4960), Box(4960, 4960)),
+  Box(Box(4961, 4961), Box(4961, 4961)),
+  Box(Box(4962, 4962), Box(4962, 4962)),
+  Box(Box(4963, 4963), Box(4963, 4963)),
+  Box(Box(4964, 4964), Box(4964, 4964)),
+  Box(Box(4965, 4965), Box(4965, 4965)),
+  Box(Box(4966, 4966), Box(4966, 4966)),
+  Box(Box(4967, 4967), Box(4967, 4967)),
+  Box(Box(4968, 4968), Box(4968, 4968)),
+  Box(Box(4969, 4969), Box(4969, 4969)),
+  Box(Box(4970, 4970), Box(4970, 4970)),
+  Box(Box(4971, 4971), Box(4971, 4971)),
+  Box(Box(4972, 4972), Box(4972, 4972)),
+  Box(Box(4973, 4973), Box(4973, 4973)),
+  Box(Box(4974, 4974), Box(4974, 4974)),
+  Box(Box(4975, 4975), Box(4975, 4975)),
+  Box(Box(4976, 4976), Box(4976, 4976)),
+  Box(Box(4977, 4977), Box(4977, 4977)),
+  Box(Box(4978, 4978), Box(4978, 4978)),
+  Box(Box(4979, 4979), Box(4979, 4979)),
+  Box(Box(4980, 4980), Box(4980, 4980)),
+  Box(Box(4981, 4981), Box(4981, 4981)),
+  Box(Box(4982, 4982), Box(4982, 4982)),
+  Box(Box(4983, 4983), Box(4983, 4983)),
+  Box(Box(4984, 4984), Box(4984, 4984)),
+  Box(Box(4985, 4985), Box(4985, 4985)),
+  Box(Box(4986, 4986), Box(4986, 4986)),
+  Box(Box(4987, 4987), Box(4987, 4987)),
+  Box(Box(4988, 4988), Box(4988, 4988)),
+  Box(Box(4989, 4989), Box(4989, 4989)),
+  Box(Box(4990, 4990), Box(4990, 4990)),
+  Box(Box(4991, 4991), Box(4991, 4991)),
+  Box(Box(4992, 4992), Box(4992, 4992)),
+  Box(Box(4993, 4993), Box(4993, 4993)),
+  Box(Box(4994, 4994), Box(4994, 4994)),
+  Box(Box(4995, 4995), Box(4995, 4995)),
+  Box(Box(4996, 4996), Box(4996, 4996)),
+  Box(Box(4997, 4997), Box(4997, 4997)),
+  Box(Box(4998, 4998), Box(4998, 4998)),
+  Box(Box(4999, 4999), Box(4999, 4999)),
+  Box(Box(5000, 5000), Box(5000, 5000)),
+  Box(Box(5001, 5001), Box(5001, 5001)),
+  Box(Box(5002, 5002), Box(5002, 5002)),
+  Box(Box(5003, 5003), Box(5003, 5003)),
+  Box(Box(5004, 5004), Box(5004, 5004)),
+  Box(Box(5005, 5005), Box(5005, 5005)),
+  Box(Box(5006, 5006), Box(5006, 5006)),
+  Box(Box(5007, 5007), Box(5007, 5007)),
+  Box(Box(5008, 5008), Box(5008, 5008)),
+  Box(Box(5009, 5009), Box(5009, 5009)),
+  Box(Box(5010, 5010), Box(5010, 5010)),
+  Box(Box(5011, 5011), Box(5011, 5011)),
+  Box(Box(5012, 5012), Box(5012, 5012)),
+  Box(Box(5013, 5013), Box(5013, 5013)),
+  Box(Box(5014, 5014), Box(5014, 5014)),
+  Box(Box(5015, 5015), Box(5015, 5015)),
+  Box(Box(5016, 5016), Box(5016, 5016)),
+  Box(Box(5017, 5017), Box(5017, 5017)),
+  Box(Box(5018, 5018), Box(5018, 5018)),
+  Box(Box(5019, 5019), Box(5019, 5019)),
+  Box(Box(5020, 5020), Box(5020, 5020)),
+  Box(Box(5021, 5021), Box(5021, 5021)),
+  Box(Box(5022, 5022), Box(5022, 5022)),
+  Box(Box(5023, 5023), Box(5023, 5023)),
+  Box(Box(5024, 5024), Box(5024, 5024)),
+  Box(Box(5025, 5025), Box(5025, 5025)),
+  Box(Box(5026, 5026), Box(5026, 5026)),
+  Box(Box(5027, 5027), Box(5027, 5027)),
+  Box(Box(5028, 5028), Box(5028, 5028)),
+  Box(Box(5029, 5029), Box(5029, 5029)),
+  Box(Box(5030, 5030), Box(5030, 5030)),
+  Box(Box(5031, 5031), Box(5031, 5031)),
+  Box(Box(5032, 5032), Box(5032, 5032)),
+  Box(Box(5033, 5033), Box(5033, 5033)),
+  Box(Box(5034, 5034), Box(5034, 5034)),
+  Box(Box(5035, 5035), Box(5035, 5035)),
+  Box(Box(5036, 5036), Box(5036, 5036)),
+  Box(Box(5037, 5037), Box(5037, 5037)),
+  Box(Box(5038, 5038), Box(5038, 5038)),
+  Box(Box(5039, 5039), Box(5039, 5039)),
+  Box(Box(5040, 5040), Box(5040, 5040)),
+  Box(Box(5041, 5041), Box(5041, 5041)),
+  Box(Box(5042, 5042), Box(5042, 5042)),
+  Box(Box(5043, 5043), Box(5043, 5043)),
+  Box(Box(5044, 5044), Box(5044, 5044)),
+  Box(Box(5045, 5045), Box(5045, 5045)),
+  Box(Box(5046, 5046), Box(5046, 5046)),
+  Box(Box(5047, 5047), Box(5047, 5047)),
+  Box(Box(5048, 5048), Box(5048, 5048)),
+  Box(Box(5049, 5049), Box(5049, 5049)),
+  Box(Box(5050, 5050), Box(5050, 5050)),
+  Box(Box(5051, 5051), Box(5051, 5051)),
+  Box(Box(5052, 5052), Box(5052, 5052)),
+  Box(Box(5053, 5053), Box(5053, 5053)),
+  Box(Box(5054, 5054), Box(5054, 5054)),
+  Box(Box(5055, 5055), Box(5055, 5055)),
+  Box(Box(5056, 5056), Box(5056, 5056)),
+  Box(Box(5057, 5057), Box(5057, 5057)),
+  Box(Box(5058, 5058), Box(5058, 5058)),
+  Box(Box(5059, 5059), Box(5059, 5059)),
+  Box(Box(5060, 5060), Box(5060, 5060)),
+  Box(Box(5061, 5061), Box(5061, 5061)),
+  Box(Box(5062, 5062), Box(5062, 5062)),
+  Box(Box(5063, 5063), Box(5063, 5063)),
+  Box(Box(5064, 5064), Box(5064, 5064)),
+  Box(Box(5065, 5065), Box(5065, 5065)),
+  Box(Box(5066, 5066), Box(5066, 5066)),
+  Box(Box(5067, 5067), Box(5067, 5067)),
+  Box(Box(5068, 5068), Box(5068, 5068)),
+  Box(Box(5069, 5069), Box(5069, 5069)),
+  Box(Box(5070, 5070), Box(5070, 5070)),
+  Box(Box(5071, 5071), Box(5071, 5071)),
+  Box(Box(5072, 5072), Box(5072, 5072)),
+  Box(Box(5073, 5073), Box(5073, 5073)),
+  Box(Box(5074, 5074), Box(5074, 5074)),
+  Box(Box(5075, 5075), Box(5075, 5075)),
+  Box(Box(5076, 5076), Box(5076, 5076)),
+  Box(Box(5077, 5077), Box(5077, 5077)),
+  Box(Box(5078, 5078), Box(5078, 5078)),
+  Box(Box(5079, 5079), Box(5079, 5079)),
+  Box(Box(5080, 5080), Box(5080, 5080)),
+  Box(Box(5081, 5081), Box(5081, 5081)),
+  Box(Box(5082, 5082), Box(5082, 5082)),
+  Box(Box(5083, 5083), Box(5083, 5083)),
+  Box(Box(5084, 5084), Box(5084, 5084)),
+  Box(Box(5085, 5085), Box(5085, 5085)),
+  Box(Box(5086, 5086), Box(5086, 5086)),
+  Box(Box(5087, 5087), Box(5087, 5087)),
+  Box(Box(5088, 5088), Box(5088, 5088)),
+  Box(Box(5089, 5089), Box(5089, 5089)),
+  Box(Box(5090, 5090), Box(5090, 5090)),
+  Box(Box(5091, 5091), Box(5091, 5091)),
+  Box(Box(5092, 5092), Box(5092, 5092)),
+  Box(Box(5093, 5093), Box(5093, 5093)),
+  Box(Box(5094, 5094), Box(5094, 5094)),
+  Box(Box(5095, 5095), Box(5095, 5095)),
+  Box(Box(5096, 5096), Box(5096, 5096)),
+  Box(Box(5097, 5097), Box(5097, 5097)),
+  Box(Box(5098, 5098), Box(5098, 5098)),
+  Box(Box(5099, 5099), Box(5099, 5099)),
+  Box(Box(5100, 5100), Box(5100, 5100)),
+  Box(Box(5101, 5101), Box(5101, 5101)),
+  Box(Box(5102, 5102), Box(5102, 5102)),
+  Box(Box(5103, 5103), Box(5103, 5103)),
+  Box(Box(5104, 5104), Box(5104, 5104)),
+  Box(Box(5105, 5105), Box(5105, 5105)),
+  Box(Box(5106, 5106), Box(5106, 5106)),
+  Box(Box(5107, 5107), Box(5107, 5107)),
+  Box(Box(5108, 5108), Box(5108, 5108)),
+  Box(Box(5109, 5109), Box(5109, 5109)),
+  Box(Box(5110, 5110), Box(5110, 5110)),
+  Box(Box(5111, 5111), Box(5111, 5111)),
+  Box(Box(5112, 5112), Box(5112, 5112)),
+  Box(Box(5113, 5113), Box(5113, 5113)),
+  Box(Box(5114, 5114), Box(5114, 5114)),
+  Box(Box(5115, 5115), Box(5115, 5115)),
+  Box(Box(5116, 5116), Box(5116, 5116)),
+  Box(Box(5117, 5117), Box(5117, 5117)),
+  Box(Box(5118, 5118), Box(5118, 5118)),
+  Box(Box(5119, 5119), Box(5119, 5119)),
+  Box(Box(5120, 5120), Box(5120, 5120)),
+  Box(Box(5121, 5121), Box(5121, 5121)),
+  Box(Box(5122, 5122), Box(5122, 5122)),
+  Box(Box(5123, 5123), Box(5123, 5123)),
+  Box(Box(5124, 5124), Box(5124, 5124)),
+  Box(Box(5125, 5125), Box(5125, 5125)),
+  Box(Box(5126, 5126), Box(5126, 5126)),
+  Box(Box(5127, 5127), Box(5127, 5127)),
+  Box(Box(5128, 5128), Box(5128, 5128)),
+  Box(Box(5129, 5129), Box(5129, 5129)),
+  Box(Box(5130, 5130), Box(5130, 5130)),
+  Box(Box(5131, 5131), Box(5131, 5131)),
+  Box(Box(5132, 5132), Box(5132, 5132)),
+  Box(Box(5133, 5133), Box(5133, 5133)),
+  Box(Box(5134, 5134), Box(5134, 5134)),
+  Box(Box(5135, 5135), Box(5135, 5135)),
+  Box(Box(5136, 5136), Box(5136, 5136)),
+  Box(Box(5137, 5137), Box(5137, 5137)),
+  Box(Box(5138, 5138), Box(5138, 5138)),
+  Box(Box(5139, 5139), Box(5139, 5139)),
+  Box(Box(5140, 5140), Box(5140, 5140)),
+  Box(Box(5141, 5141), Box(5141, 5141)),
+  Box(Box(5142, 5142), Box(5142, 5142)),
+  Box(Box(5143, 5143), Box(5143, 5143)),
+  Box(Box(5144, 5144), Box(5144, 5144)),
+  Box(Box(5145, 5145), Box(5145, 5145)),
+  Box(Box(5146, 5146), Box(5146, 5146)),
+  Box(Box(5147, 5147), Box(5147, 5147)),
+  Box(Box(5148, 5148), Box(5148, 5148)),
+  Box(Box(5149, 5149), Box(5149, 5149)),
+  Box(Box(5150, 5150), Box(5150, 5150)),
+  Box(Box(5151, 5151), Box(5151, 5151)),
+  Box(Box(5152, 5152), Box(5152, 5152)),
+  Box(Box(5153, 5153), Box(5153, 5153)),
+  Box(Box(5154, 5154), Box(5154, 5154)),
+  Box(Box(5155, 5155), Box(5155, 5155)),
+  Box(Box(5156, 5156), Box(5156, 5156)),
+  Box(Box(5157, 5157), Box(5157, 5157)),
+  Box(Box(5158, 5158), Box(5158, 5158)),
+  Box(Box(5159, 5159), Box(5159, 5159)),
+  Box(Box(5160, 5160), Box(5160, 5160)),
+  Box(Box(5161, 5161), Box(5161, 5161)),
+  Box(Box(5162, 5162), Box(5162, 5162)),
+  Box(Box(5163, 5163), Box(5163, 5163)),
+  Box(Box(5164, 5164), Box(5164, 5164)),
+  Box(Box(5165, 5165), Box(5165, 5165)),
+  Box(Box(5166, 5166), Box(5166, 5166)),
+  Box(Box(5167, 5167), Box(5167, 5167)),
+  Box(Box(5168, 5168), Box(5168, 5168)),
+  Box(Box(5169, 5169), Box(5169, 5169)),
+  Box(Box(5170, 5170), Box(5170, 5170)),
+  Box(Box(5171, 5171), Box(5171, 5171)),
+  Box(Box(5172, 5172), Box(5172, 5172)),
+  Box(Box(5173, 5173), Box(5173, 5173)),
+  Box(Box(5174, 5174), Box(5174, 5174)),
+  Box(Box(5175, 5175), Box(5175, 5175)),
+  Box(Box(5176, 5176), Box(5176, 5176)),
+  Box(Box(5177, 5177), Box(5177, 5177)),
+  Box(Box(5178, 5178), Box(5178, 5178)),
+  Box(Box(5179, 5179), Box(5179, 5179)),
+  Box(Box(5180, 5180), Box(5180, 5180)),
+  Box(Box(5181, 5181), Box(5181, 5181)),
+  Box(Box(5182, 5182), Box(5182, 5182)),
+  Box(Box(5183, 5183), Box(5183, 5183)),
+  Box(Box(5184, 5184), Box(5184, 5184)),
+  Box(Box(5185, 5185), Box(5185, 5185)),
+  Box(Box(5186, 5186), Box(5186, 5186)),
+  Box(Box(5187, 5187), Box(5187, 5187)),
+  Box(Box(5188, 5188), Box(5188, 5188)),
+  Box(Box(5189, 5189), Box(5189, 5189)),
+  Box(Box(5190, 5190), Box(5190, 5190)),
+  Box(Box(5191, 5191), Box(5191, 5191)),
+  Box(Box(5192, 5192), Box(5192, 5192)),
+  Box(Box(5193, 5193), Box(5193, 5193)),
+  Box(Box(5194, 5194), Box(5194, 5194)),
+  Box(Box(5195, 5195), Box(5195, 5195)),
+  Box(Box(5196, 5196), Box(5196, 5196)),
+  Box(Box(5197, 5197), Box(5197, 5197)),
+  Box(Box(5198, 5198), Box(5198, 5198)),
+  Box(Box(5199, 5199), Box(5199, 5199)),
+  Box(Box(5200, 5200), Box(5200, 5200)),
+  Box(Box(5201, 5201), Box(5201, 5201)),
+  Box(Box(5202, 5202), Box(5202, 5202)),
+  Box(Box(5203, 5203), Box(5203, 5203)),
+  Box(Box(5204, 5204), Box(5204, 5204)),
+  Box(Box(5205, 5205), Box(5205, 5205)),
+  Box(Box(5206, 5206), Box(5206, 5206)),
+  Box(Box(5207, 5207), Box(5207, 5207)),
+  Box(Box(5208, 5208), Box(5208, 5208)),
+  Box(Box(5209, 5209), Box(5209, 5209)),
+  Box(Box(5210, 5210), Box(5210, 5210)),
+  Box(Box(5211, 5211), Box(5211, 5211)),
+  Box(Box(5212, 5212), Box(5212, 5212)),
+  Box(Box(5213, 5213), Box(5213, 5213)),
+  Box(Box(5214, 5214), Box(5214, 5214)),
+  Box(Box(5215, 5215), Box(5215, 5215)),
+  Box(Box(5216, 5216), Box(5216, 5216)),
+  Box(Box(5217, 5217), Box(5217, 5217)),
+  Box(Box(5218, 5218), Box(5218, 5218)),
+  Box(Box(5219, 5219), Box(5219, 5219)),
+  Box(Box(5220, 5220), Box(5220, 5220)),
+  Box(Box(5221, 5221), Box(5221, 5221)),
+  Box(Box(5222, 5222), Box(5222, 5222)),
+  Box(Box(5223, 5223), Box(5223, 5223)),
+  Box(Box(5224, 5224), Box(5224, 5224)),
+  Box(Box(5225, 5225), Box(5225, 5225)),
+  Box(Box(5226, 5226), Box(5226, 5226)),
+  Box(Box(5227, 5227), Box(5227, 5227)),
+  Box(Box(5228, 5228), Box(5228, 5228)),
+  Box(Box(5229, 5229), Box(5229, 5229)),
+  Box(Box(5230, 5230), Box(5230, 5230)),
+  Box(Box(5231, 5231), Box(5231, 5231)),
+  Box(Box(5232, 5232), Box(5232, 5232)),
+  Box(Box(5233, 5233), Box(5233, 5233)),
+  Box(Box(5234, 5234), Box(5234, 5234)),
+  Box(Box(5235, 5235), Box(5235, 5235)),
+  Box(Box(5236, 5236), Box(5236, 5236)),
+  Box(Box(5237, 5237), Box(5237, 5237)),
+  Box(Box(5238, 5238), Box(5238, 5238)),
+  Box(Box(5239, 5239), Box(5239, 5239)),
+  Box(Box(5240, 5240), Box(5240, 5240)),
+  Box(Box(5241, 5241), Box(5241, 5241)),
+  Box(Box(5242, 5242), Box(5242, 5242)),
+  Box(Box(5243, 5243), Box(5243, 5243)),
+  Box(Box(5244, 5244), Box(5244, 5244)),
+  Box(Box(5245, 5245), Box(5245, 5245)),
+  Box(Box(5246, 5246), Box(5246, 5246)),
+  Box(Box(5247, 5247), Box(5247, 5247)),
+  Box(Box(5248, 5248), Box(5248, 5248)),
+  Box(Box(5249, 5249), Box(5249, 5249)),
+  Box(Box(5250, 5250), Box(5250, 5250)),
+  Box(Box(5251, 5251), Box(5251, 5251)),
+  Box(Box(5252, 5252), Box(5252, 5252)),
+  Box(Box(5253, 5253), Box(5253, 5253)),
+  Box(Box(5254, 5254), Box(5254, 5254)),
+  Box(Box(5255, 5255), Box(5255, 5255)),
+  Box(Box(5256, 5256), Box(5256, 5256)),
+  Box(Box(5257, 5257), Box(5257, 5257)),
+  Box(Box(5258, 5258), Box(5258, 5258)),
+  Box(Box(5259, 5259), Box(5259, 5259)),
+  Box(Box(5260, 5260), Box(5260, 5260)),
+  Box(Box(5261, 5261), Box(5261, 5261)),
+  Box(Box(5262, 5262), Box(5262, 5262)),
+  Box(Box(5263, 5263), Box(5263, 5263)),
+  Box(Box(5264, 5264), Box(5264, 5264)),
+  Box(Box(5265, 5265), Box(5265, 5265)),
+  Box(Box(5266, 5266), Box(5266, 5266)),
+  Box(Box(5267, 5267), Box(5267, 5267)),
+  Box(Box(5268, 5268), Box(5268, 5268)),
+  Box(Box(5269, 5269), Box(5269, 5269)),
+  Box(Box(5270, 5270), Box(5270, 5270)),
+  Box(Box(5271, 5271), Box(5271, 5271)),
+  Box(Box(5272, 5272), Box(5272, 5272)),
+  Box(Box(5273, 5273), Box(5273, 5273)),
+  Box(Box(5274, 5274), Box(5274, 5274)),
+  Box(Box(5275, 5275), Box(5275, 5275)),
+  Box(Box(5276, 5276), Box(5276, 5276)),
+  Box(Box(5277, 5277), Box(5277, 5277)),
+  Box(Box(5278, 5278), Box(5278, 5278)),
+  Box(Box(5279, 5279), Box(5279, 5279)),
+  Box(Box(5280, 5280), Box(5280, 5280)),
+  Box(Box(5281, 5281), Box(5281, 5281)),
+  Box(Box(5282, 5282), Box(5282, 5282)),
+  Box(Box(5283, 5283), Box(5283, 5283)),
+  Box(Box(5284, 5284), Box(5284, 5284)),
+  Box(Box(5285, 5285), Box(5285, 5285)),
+  Box(Box(5286, 5286), Box(5286, 5286)),
+  Box(Box(5287, 5287), Box(5287, 5287)),
+  Box(Box(5288, 5288), Box(5288, 5288)),
+  Box(Box(5289, 5289), Box(5289, 5289)),
+  Box(Box(5290, 5290), Box(5290, 5290)),
+  Box(Box(5291, 5291), Box(5291, 5291)),
+  Box(Box(5292, 5292), Box(5292, 5292)),
+  Box(Box(5293, 5293), Box(5293, 5293)),
+  Box(Box(5294, 5294), Box(5294, 5294)),
+  Box(Box(5295, 5295), Box(5295, 5295)),
+  Box(Box(5296, 5296), Box(5296, 5296)),
+  Box(Box(5297, 5297), Box(5297, 5297)),
+  Box(Box(5298, 5298), Box(5298, 5298)),
+  Box(Box(5299, 5299), Box(5299, 5299)),
+  Box(Box(5300, 5300), Box(5300, 5300)),
+  Box(Box(5301, 5301), Box(5301, 5301)),
+  Box(Box(5302, 5302), Box(5302, 5302)),
+  Box(Box(5303, 5303), Box(5303, 5303)),
+  Box(Box(5304, 5304), Box(5304, 5304)),
+  Box(Box(5305, 5305), Box(5305, 5305)),
+  Box(Box(5306, 5306), Box(5306, 5306)),
+  Box(Box(5307, 5307), Box(5307, 5307)),
+  Box(Box(5308, 5308), Box(5308, 5308)),
+  Box(Box(5309, 5309), Box(5309, 5309)),
+  Box(Box(5310, 5310), Box(5310, 5310)),
+  Box(Box(5311, 5311), Box(5311, 5311)),
+  Box(Box(5312, 5312), Box(5312, 5312)),
+  Box(Box(5313, 5313), Box(5313, 5313)),
+  Box(Box(5314, 5314), Box(5314, 5314)),
+  Box(Box(5315, 5315), Box(5315, 5315)),
+  Box(Box(5316, 5316), Box(5316, 5316)),
+  Box(Box(5317, 5317), Box(5317, 5317)),
+  Box(Box(5318, 5318), Box(5318, 5318)),
+  Box(Box(5319, 5319), Box(5319, 5319)),
+  Box(Box(5320, 5320), Box(5320, 5320)),
+  Box(Box(5321, 5321), Box(5321, 5321)),
+  Box(Box(5322, 5322), Box(5322, 5322)),
+  Box(Box(5323, 5323), Box(5323, 5323)),
+  Box(Box(5324, 5324), Box(5324, 5324)),
+  Box(Box(5325, 5325), Box(5325, 5325)),
+  Box(Box(5326, 5326), Box(5326, 5326)),
+  Box(Box(5327, 5327), Box(5327, 5327)),
+  Box(Box(5328, 5328), Box(5328, 5328)),
+  Box(Box(5329, 5329), Box(5329, 5329)),
+  Box(Box(5330, 5330), Box(5330, 5330)),
+  Box(Box(5331, 5331), Box(5331, 5331)),
+  Box(Box(5332, 5332), Box(5332, 5332)),
+  Box(Box(5333, 5333), Box(5333, 5333)),
+  Box(Box(5334, 5334), Box(5334, 5334)),
+  Box(Box(5335, 5335), Box(5335, 5335)),
+  Box(Box(5336, 5336), Box(5336, 5336)),
+  Box(Box(5337, 5337), Box(5337, 5337)),
+  Box(Box(5338, 5338), Box(5338, 5338)),
+  Box(Box(5339, 5339), Box(5339, 5339)),
+  Box(Box(5340, 5340), Box(5340, 5340)),
+  Box(Box(5341, 5341), Box(5341, 5341)),
+  Box(Box(5342, 5342), Box(5342, 5342)),
+  Box(Box(5343, 5343), Box(5343, 5343)),
+  Box(Box(5344, 5344), Box(5344, 5344)),
+  Box(Box(5345, 5345), Box(5345, 5345)),
+  Box(Box(5346, 5346), Box(5346, 5346)),
+  Box(Box(5347, 5347), Box(5347, 5347)),
+  Box(Box(5348, 5348), Box(5348, 5348)),
+  Box(Box(5349, 5349), Box(5349, 5349)),
+  Box(Box(5350, 5350), Box(5350, 5350)),
+  Box(Box(5351, 5351), Box(5351, 5351)),
+  Box(Box(5352, 5352), Box(5352, 5352)),
+  Box(Box(5353, 5353), Box(5353, 5353)),
+  Box(Box(5354, 5354), Box(5354, 5354)),
+  Box(Box(5355, 5355), Box(5355, 5355)),
+  Box(Box(5356, 5356), Box(5356, 5356)),
+  Box(Box(5357, 5357), Box(5357, 5357)),
+  Box(Box(5358, 5358), Box(5358, 5358)),
+  Box(Box(5359, 5359), Box(5359, 5359)),
+  Box(Box(5360, 5360), Box(5360, 5360)),
+  Box(Box(5361, 5361), Box(5361, 5361)),
+  Box(Box(5362, 5362), Box(5362, 5362)),
+  Box(Box(5363, 5363), Box(5363, 5363)),
+  Box(Box(5364, 5364), Box(5364, 5364)),
+  Box(Box(5365, 5365), Box(5365, 5365)),
+  Box(Box(5366, 5366), Box(5366, 5366)),
+  Box(Box(5367, 5367), Box(5367, 5367)),
+  Box(Box(5368, 5368), Box(5368, 5368)),
+  Box(Box(5369, 5369), Box(5369, 5369)),
+  Box(Box(5370, 5370), Box(5370, 5370)),
+  Box(Box(5371, 5371), Box(5371, 5371)),
+  Box(Box(5372, 5372), Box(5372, 5372)),
+  Box(Box(5373, 5373), Box(5373, 5373)),
+  Box(Box(5374, 5374), Box(5374, 5374)),
+  Box(Box(5375, 5375), Box(5375, 5375)),
+  Box(Box(5376, 5376), Box(5376, 5376)),
+  Box(Box(5377, 5377), Box(5377, 5377)),
+  Box(Box(5378, 5378), Box(5378, 5378)),
+  Box(Box(5379, 5379), Box(5379, 5379)),
+  Box(Box(5380, 5380), Box(5380, 5380)),
+  Box(Box(5381, 5381), Box(5381, 5381)),
+  Box(Box(5382, 5382), Box(5382, 5382)),
+  Box(Box(5383, 5383), Box(5383, 5383)),
+  Box(Box(5384, 5384), Box(5384, 5384)),
+  Box(Box(5385, 5385), Box(5385, 5385)),
+  Box(Box(5386, 5386), Box(5386, 5386)),
+  Box(Box(5387, 5387), Box(5387, 5387)),
+  Box(Box(5388, 5388), Box(5388, 5388)),
+  Box(Box(5389, 5389), Box(5389, 5389)),
+  Box(Box(5390, 5390), Box(5390, 5390)),
+  Box(Box(5391, 5391), Box(5391, 5391)),
+  Box(Box(5392, 5392), Box(5392, 5392)),
+  Box(Box(5393, 5393), Box(5393, 5393)),
+  Box(Box(5394, 5394), Box(5394, 5394)),
+  Box(Box(5395, 5395), Box(5395, 5395)),
+  Box(Box(5396, 5396), Box(5396, 5396)),
+  Box(Box(5397, 5397), Box(5397, 5397)),
+  Box(Box(5398, 5398), Box(5398, 5398)),
+  Box(Box(5399, 5399), Box(5399, 5399)),
+  Box(Box(5400, 5400), Box(5400, 5400)),
+  Box(Box(5401, 5401), Box(5401, 5401)),
+  Box(Box(5402, 5402), Box(5402, 5402)),
+  Box(Box(5403, 5403), Box(5403, 5403)),
+  Box(Box(5404, 5404), Box(5404, 5404)),
+  Box(Box(5405, 5405), Box(5405, 5405)),
+  Box(Box(5406, 5406), Box(5406, 5406)),
+  Box(Box(5407, 5407), Box(5407, 5407)),
+  Box(Box(5408, 5408), Box(5408, 5408)),
+  Box(Box(5409, 5409), Box(5409, 5409)),
+  Box(Box(5410, 5410), Box(5410, 5410)),
+  Box(Box(5411, 5411), Box(5411, 5411)),
+  Box(Box(5412, 5412), Box(5412, 5412)),
+  Box(Box(5413, 5413), Box(5413, 5413)),
+  Box(Box(5414, 5414), Box(5414, 5414)),
+  Box(Box(5415, 5415), Box(5415, 5415)),
+  Box(Box(5416, 5416), Box(5416, 5416)),
+  Box(Box(5417, 5417), Box(5417, 5417)),
+  Box(Box(5418, 5418), Box(5418, 5418)),
+  Box(Box(5419, 5419), Box(5419, 5419)),
+  Box(Box(5420, 5420), Box(5420, 5420)),
+  Box(Box(5421, 5421), Box(5421, 5421)),
+  Box(Box(5422, 5422), Box(5422, 5422)),
+  Box(Box(5423, 5423), Box(5423, 5423)),
+  Box(Box(5424, 5424), Box(5424, 5424)),
+  Box(Box(5425, 5425), Box(5425, 5425)),
+  Box(Box(5426, 5426), Box(5426, 5426)),
+  Box(Box(5427, 5427), Box(5427, 5427)),
+  Box(Box(5428, 5428), Box(5428, 5428)),
+  Box(Box(5429, 5429), Box(5429, 5429)),
+  Box(Box(5430, 5430), Box(5430, 5430)),
+  Box(Box(5431, 5431), Box(5431, 5431)),
+  Box(Box(5432, 5432), Box(5432, 5432)),
+  Box(Box(5433, 5433), Box(5433, 5433)),
+  Box(Box(5434, 5434), Box(5434, 5434)),
+  Box(Box(5435, 5435), Box(5435, 5435)),
+  Box(Box(5436, 5436), Box(5436, 5436)),
+  Box(Box(5437, 5437), Box(5437, 5437)),
+  Box(Box(5438, 5438), Box(5438, 5438)),
+  Box(Box(5439, 5439), Box(5439, 5439)),
+  Box(Box(5440, 5440), Box(5440, 5440)),
+  Box(Box(5441, 5441), Box(5441, 5441)),
+  Box(Box(5442, 5442), Box(5442, 5442)),
+  Box(Box(5443, 5443), Box(5443, 5443)),
+  Box(Box(5444, 5444), Box(5444, 5444)),
+  Box(Box(5445, 5445), Box(5445, 5445)),
+  Box(Box(5446, 5446), Box(5446, 5446)),
+  Box(Box(5447, 5447), Box(5447, 5447)),
+  Box(Box(5448, 5448), Box(5448, 5448)),
+  Box(Box(5449, 5449), Box(5449, 5449)),
+  Box(Box(5450, 5450), Box(5450, 5450)),
+  Box(Box(5451, 5451), Box(5451, 5451)),
+  Box(Box(5452, 5452), Box(5452, 5452)),
+  Box(Box(5453, 5453), Box(5453, 5453)),
+  Box(Box(5454, 5454), Box(5454, 5454)),
+  Box(Box(5455, 5455), Box(5455, 5455)),
+  Box(Box(5456, 5456), Box(5456, 5456)),
+  Box(Box(5457, 5457), Box(5457, 5457)),
+  Box(Box(5458, 5458), Box(5458, 5458)),
+  Box(Box(5459, 5459), Box(5459, 5459)),
+  Box(Box(5460, 5460), Box(5460, 5460)),
+  Box(Box(5461, 5461), Box(5461, 5461)),
+  Box(Box(5462, 5462), Box(5462, 5462)),
+  Box(Box(5463, 5463), Box(5463, 5463)),
+  Box(Box(5464, 5464), Box(5464, 5464)),
+  Box(Box(5465, 5465), Box(5465, 5465)),
+  Box(Box(5466, 5466), Box(5466, 5466)),
+  Box(Box(5467, 5467), Box(5467, 5467)),
+  Box(Box(5468, 5468), Box(5468, 5468)),
+  Box(Box(5469, 5469), Box(5469, 5469)),
+  Box(Box(5470, 5470), Box(5470, 5470)),
+  Box(Box(5471, 5471), Box(5471, 5471)),
+  Box(Box(5472, 5472), Box(5472, 5472)),
+  Box(Box(5473, 5473), Box(5473, 5473)),
+  Box(Box(5474, 5474), Box(5474, 5474)),
+  Box(Box(5475, 5475), Box(5475, 5475)),
+  Box(Box(5476, 5476), Box(5476, 5476)),
+  Box(Box(5477, 5477), Box(5477, 5477)),
+  Box(Box(5478, 5478), Box(5478, 5478)),
+  Box(Box(5479, 5479), Box(5479, 5479)),
+  Box(Box(5480, 5480), Box(5480, 5480)),
+  Box(Box(5481, 5481), Box(5481, 5481)),
+  Box(Box(5482, 5482), Box(5482, 5482)),
+  Box(Box(5483, 5483), Box(5483, 5483)),
+  Box(Box(5484, 5484), Box(5484, 5484)),
+  Box(Box(5485, 5485), Box(5485, 5485)),
+  Box(Box(5486, 5486), Box(5486, 5486)),
+  Box(Box(5487, 5487), Box(5487, 5487)),
+  Box(Box(5488, 5488), Box(5488, 5488)),
+  Box(Box(5489, 5489), Box(5489, 5489)),
+  Box(Box(5490, 5490), Box(5490, 5490)),
+  Box(Box(5491, 5491), Box(5491, 5491)),
+  Box(Box(5492, 5492), Box(5492, 5492)),
+  Box(Box(5493, 5493), Box(5493, 5493)),
+  Box(Box(5494, 5494), Box(5494, 5494)),
+  Box(Box(5495, 5495), Box(5495, 5495)),
+  Box(Box(5496, 5496), Box(5496, 5496)),
+  Box(Box(5497, 5497), Box(5497, 5497)),
+  Box(Box(5498, 5498), Box(5498, 5498)),
+  Box(Box(5499, 5499), Box(5499, 5499)),
+  Box(Box(5500, 5500), Box(5500, 5500)),
+  Box(Box(5501, 5501), Box(5501, 5501)),
+  Box(Box(5502, 5502), Box(5502, 5502)),
+  Box(Box(5503, 5503), Box(5503, 5503)),
+  Box(Box(5504, 5504), Box(5504, 5504)),
+  Box(Box(5505, 5505), Box(5505, 5505)),
+  Box(Box(5506, 5506), Box(5506, 5506)),
+  Box(Box(5507, 5507), Box(5507, 5507)),
+  Box(Box(5508, 5508), Box(5508, 5508)),
+  Box(Box(5509, 5509), Box(5509, 5509)),
+  Box(Box(5510, 5510), Box(5510, 5510)),
+  Box(Box(5511, 5511), Box(5511, 5511)),
+  Box(Box(5512, 5512), Box(5512, 5512)),
+  Box(Box(5513, 5513), Box(5513, 5513)),
+  Box(Box(5514, 5514), Box(5514, 5514)),
+  Box(Box(5515, 5515), Box(5515, 5515)),
+  Box(Box(5516, 5516), Box(5516, 5516)),
+  Box(Box(5517, 5517), Box(5517, 5517)),
+  Box(Box(5518, 5518), Box(5518, 5518)),
+  Box(Box(5519, 5519), Box(5519, 5519)),
+  Box(Box(5520, 5520), Box(5520, 5520)),
+  Box(Box(5521, 5521), Box(5521, 5521)),
+  Box(Box(5522, 5522), Box(5522, 5522)),
+  Box(Box(5523, 5523), Box(5523, 5523)),
+  Box(Box(5524, 5524), Box(5524, 5524)),
+  Box(Box(5525, 5525), Box(5525, 5525)),
+  Box(Box(5526, 5526), Box(5526, 5526)),
+  Box(Box(5527, 5527), Box(5527, 5527)),
+  Box(Box(5528, 5528), Box(5528, 5528)),
+  Box(Box(5529, 5529), Box(5529, 5529)),
+  Box(Box(5530, 5530), Box(5530, 5530)),
+  Box(Box(5531, 5531), Box(5531, 5531)),
+  Box(Box(5532, 5532), Box(5532, 5532)),
+  Box(Box(5533, 5533), Box(5533, 5533)),
+  Box(Box(5534, 5534), Box(5534, 5534)),
+  Box(Box(5535, 5535), Box(5535, 5535)),
+  Box(Box(5536, 5536), Box(5536, 5536)),
+  Box(Box(5537, 5537), Box(5537, 5537)),
+  Box(Box(5538, 5538), Box(5538, 5538)),
+  Box(Box(5539, 5539), Box(5539, 5539)),
+  Box(Box(5540, 5540), Box(5540, 5540)),
+  Box(Box(5541, 5541), Box(5541, 5541)),
+  Box(Box(5542, 5542), Box(5542, 5542)),
+  Box(Box(5543, 5543), Box(5543, 5543)),
+  Box(Box(5544, 5544), Box(5544, 5544)),
+  Box(Box(5545, 5545), Box(5545, 5545)),
+  Box(Box(5546, 5546), Box(5546, 5546)),
+  Box(Box(5547, 5547), Box(5547, 5547)),
+  Box(Box(5548, 5548), Box(5548, 5548)),
+  Box(Box(5549, 5549), Box(5549, 5549)),
+  Box(Box(5550, 5550), Box(5550, 5550)),
+  Box(Box(5551, 5551), Box(5551, 5551)),
+  Box(Box(5552, 5552), Box(5552, 5552)),
+  Box(Box(5553, 5553), Box(5553, 5553)),
+  Box(Box(5554, 5554), Box(5554, 5554)),
+  Box(Box(5555, 5555), Box(5555, 5555)),
+  Box(Box(5556, 5556), Box(5556, 5556)),
+  Box(Box(5557, 5557), Box(5557, 5557)),
+  Box(Box(5558, 5558), Box(5558, 5558)),
+  Box(Box(5559, 5559), Box(5559, 5559)),
+  Box(Box(5560, 5560), Box(5560, 5560)),
+  Box(Box(5561, 5561), Box(5561, 5561)),
+  Box(Box(5562, 5562), Box(5562, 5562)),
+  Box(Box(5563, 5563), Box(5563, 5563)),
+  Box(Box(5564, 5564), Box(5564, 5564)),
+  Box(Box(5565, 5565), Box(5565, 5565)),
+  Box(Box(5566, 5566), Box(5566, 5566)),
+  Box(Box(5567, 5567), Box(5567, 5567)),
+  Box(Box(5568, 5568), Box(5568, 5568)),
+  Box(Box(5569, 5569), Box(5569, 5569)),
+  Box(Box(5570, 5570), Box(5570, 5570)),
+  Box(Box(5571, 5571), Box(5571, 5571)),
+  Box(Box(5572, 5572), Box(5572, 5572)),
+  Box(Box(5573, 5573), Box(5573, 5573)),
+  Box(Box(5574, 5574), Box(5574, 5574)),
+  Box(Box(5575, 5575), Box(5575, 5575)),
+  Box(Box(5576, 5576), Box(5576, 5576)),
+  Box(Box(5577, 5577), Box(5577, 5577)),
+  Box(Box(5578, 5578), Box(5578, 5578)),
+  Box(Box(5579, 5579), Box(5579, 5579)),
+  Box(Box(5580, 5580), Box(5580, 5580)),
+  Box(Box(5581, 5581), Box(5581, 5581)),
+  Box(Box(5582, 5582), Box(5582, 5582)),
+  Box(Box(5583, 5583), Box(5583, 5583)),
+  Box(Box(5584, 5584), Box(5584, 5584)),
+  Box(Box(5585, 5585), Box(5585, 5585)),
+  Box(Box(5586, 5586), Box(5586, 5586)),
+  Box(Box(5587, 5587), Box(5587, 5587)),
+  Box(Box(5588, 5588), Box(5588, 5588)),
+  Box(Box(5589, 5589), Box(5589, 5589)),
+  Box(Box(5590, 5590), Box(5590, 5590)),
+  Box(Box(5591, 5591), Box(5591, 5591)),
+  Box(Box(5592, 5592), Box(5592, 5592)),
+  Box(Box(5593, 5593), Box(5593, 5593)),
+  Box(Box(5594, 5594), Box(5594, 5594)),
+  Box(Box(5595, 5595), Box(5595, 5595)),
+  Box(Box(5596, 5596), Box(5596, 5596)),
+  Box(Box(5597, 5597), Box(5597, 5597)),
+  Box(Box(5598, 5598), Box(5598, 5598)),
+  Box(Box(5599, 5599), Box(5599, 5599)),
+  Box(Box(5600, 5600), Box(5600, 5600)),
+  Box(Box(5601, 5601), Box(5601, 5601)),
+  Box(Box(5602, 5602), Box(5602, 5602)),
+  Box(Box(5603, 5603), Box(5603, 5603)),
+  Box(Box(5604, 5604), Box(5604, 5604)),
+  Box(Box(5605, 5605), Box(5605, 5605)),
+  Box(Box(5606, 5606), Box(5606, 5606)),
+  Box(Box(5607, 5607), Box(5607, 5607)),
+  Box(Box(5608, 5608), Box(5608, 5608)),
+  Box(Box(5609, 5609), Box(5609, 5609)),
+  Box(Box(5610, 5610), Box(5610, 5610)),
+  Box(Box(5611, 5611), Box(5611, 5611)),
+  Box(Box(5612, 5612), Box(5612, 5612)),
+  Box(Box(5613, 5613), Box(5613, 5613)),
+  Box(Box(5614, 5614), Box(5614, 5614)),
+  Box(Box(5615, 5615), Box(5615, 5615)),
+  Box(Box(5616, 5616), Box(5616, 5616)),
+  Box(Box(5617, 5617), Box(5617, 5617)),
+  Box(Box(5618, 5618), Box(5618, 5618)),
+  Box(Box(5619, 5619), Box(5619, 5619)),
+  Box(Box(5620, 5620), Box(5620, 5620)),
+  Box(Box(5621, 5621), Box(5621, 5621)),
+  Box(Box(5622, 5622), Box(5622, 5622)),
+  Box(Box(5623, 5623), Box(5623, 5623)),
+  Box(Box(5624, 5624), Box(5624, 5624)),
+  Box(Box(5625, 5625), Box(5625, 5625)),
+  Box(Box(5626, 5626), Box(5626, 5626)),
+  Box(Box(5627, 5627), Box(5627, 5627)),
+  Box(Box(5628, 5628), Box(5628, 5628)),
+  Box(Box(5629, 5629), Box(5629, 5629)),
+  Box(Box(5630, 5630), Box(5630, 5630)),
+  Box(Box(5631, 5631), Box(5631, 5631)),
+  Box(Box(5632, 5632), Box(5632, 5632)),
+  Box(Box(5633, 5633), Box(5633, 5633)),
+  Box(Box(5634, 5634), Box(5634, 5634)),
+  Box(Box(5635, 5635), Box(5635, 5635)),
+  Box(Box(5636, 5636), Box(5636, 5636)),
+  Box(Box(5637, 5637), Box(5637, 5637)),
+  Box(Box(5638, 5638), Box(5638, 5638)),
+  Box(Box(5639, 5639), Box(5639, 5639)),
+  Box(Box(5640, 5640), Box(5640, 5640)),
+  Box(Box(5641, 5641), Box(5641, 5641)),
+  Box(Box(5642, 5642), Box(5642, 5642)),
+  Box(Box(5643, 5643), Box(5643, 5643)),
+  Box(Box(5644, 5644), Box(5644, 5644)),
+  Box(Box(5645, 5645), Box(5645, 5645)),
+  Box(Box(5646, 5646), Box(5646, 5646)),
+  Box(Box(5647, 5647), Box(5647, 5647)),
+  Box(Box(5648, 5648), Box(5648, 5648)),
+  Box(Box(5649, 5649), Box(5649, 5649)),
+  Box(Box(5650, 5650), Box(5650, 5650)),
+  Box(Box(5651, 5651), Box(5651, 5651)),
+  Box(Box(5652, 5652), Box(5652, 5652)),
+  Box(Box(5653, 5653), Box(5653, 5653)),
+  Box(Box(5654, 5654), Box(5654, 5654)),
+  Box(Box(5655, 5655), Box(5655, 5655)),
+  Box(Box(5656, 5656), Box(5656, 5656)),
+  Box(Box(5657, 5657), Box(5657, 5657)),
+  Box(Box(5658, 5658), Box(5658, 5658)),
+  Box(Box(5659, 5659), Box(5659, 5659)),
+  Box(Box(5660, 5660), Box(5660, 5660)),
+  Box(Box(5661, 5661), Box(5661, 5661)),
+  Box(Box(5662, 5662), Box(5662, 5662)),
+  Box(Box(5663, 5663), Box(5663, 5663)),
+  Box(Box(5664, 5664), Box(5664, 5664)),
+  Box(Box(5665, 5665), Box(5665, 5665)),
+  Box(Box(5666, 5666), Box(5666, 5666)),
+  Box(Box(5667, 5667), Box(5667, 5667)),
+  Box(Box(5668, 5668), Box(5668, 5668)),
+  Box(Box(5669, 5669), Box(5669, 5669)),
+  Box(Box(5670, 5670), Box(5670, 5670)),
+  Box(Box(5671, 5671), Box(5671, 5671)),
+  Box(Box(5672, 5672), Box(5672, 5672)),
+  Box(Box(5673, 5673), Box(5673, 5673)),
+  Box(Box(5674, 5674), Box(5674, 5674)),
+  Box(Box(5675, 5675), Box(5675, 5675)),
+  Box(Box(5676, 5676), Box(5676, 5676)),
+  Box(Box(5677, 5677), Box(5677, 5677)),
+  Box(Box(5678, 5678), Box(5678, 5678)),
+  Box(Box(5679, 5679), Box(5679, 5679)),
+  Box(Box(5680, 5680), Box(5680, 5680)),
+  Box(Box(5681, 5681), Box(5681, 5681)),
+  Box(Box(5682, 5682), Box(5682, 5682)),
+  Box(Box(5683, 5683), Box(5683, 5683)),
+  Box(Box(5684, 5684), Box(5684, 5684)),
+  Box(Box(5685, 5685), Box(5685, 5685)),
+  Box(Box(5686, 5686), Box(5686, 5686)),
+  Box(Box(5687, 5687), Box(5687, 5687)),
+  Box(Box(5688, 5688), Box(5688, 5688)),
+  Box(Box(5689, 5689), Box(5689, 5689)),
+  Box(Box(5690, 5690), Box(5690, 5690)),
+  Box(Box(5691, 5691), Box(5691, 5691)),
+  Box(Box(5692, 5692), Box(5692, 5692)),
+  Box(Box(5693, 5693), Box(5693, 5693)),
+  Box(Box(5694, 5694), Box(5694, 5694)),
+  Box(Box(5695, 5695), Box(5695, 5695)),
+  Box(Box(5696, 5696), Box(5696, 5696)),
+  Box(Box(5697, 5697), Box(5697, 5697)),
+  Box(Box(5698, 5698), Box(5698, 5698)),
+  Box(Box(5699, 5699), Box(5699, 5699)),
+  Box(Box(5700, 5700), Box(5700, 5700)),
+  Box(Box(5701, 5701), Box(5701, 5701)),
+  Box(Box(5702, 5702), Box(5702, 5702)),
+  Box(Box(5703, 5703), Box(5703, 5703)),
+  Box(Box(5704, 5704), Box(5704, 5704)),
+  Box(Box(5705, 5705), Box(5705, 5705)),
+  Box(Box(5706, 5706), Box(5706, 5706)),
+  Box(Box(5707, 5707), Box(5707, 5707)),
+  Box(Box(5708, 5708), Box(5708, 5708)),
+  Box(Box(5709, 5709), Box(5709, 5709)),
+  Box(Box(5710, 5710), Box(5710, 5710)),
+  Box(Box(5711, 5711), Box(5711, 5711)),
+  Box(Box(5712, 5712), Box(5712, 5712)),
+  Box(Box(5713, 5713), Box(5713, 5713)),
+  Box(Box(5714, 5714), Box(5714, 5714)),
+  Box(Box(5715, 5715), Box(5715, 5715)),
+  Box(Box(5716, 5716), Box(5716, 5716)),
+  Box(Box(5717, 5717), Box(5717, 5717)),
+  Box(Box(5718, 5718), Box(5718, 5718)),
+  Box(Box(5719, 5719), Box(5719, 5719)),
+  Box(Box(5720, 5720), Box(5720, 5720)),
+  Box(Box(5721, 5721), Box(5721, 5721)),
+  Box(Box(5722, 5722), Box(5722, 5722)),
+  Box(Box(5723, 5723), Box(5723, 5723)),
+  Box(Box(5724, 5724), Box(5724, 5724)),
+  Box(Box(5725, 5725), Box(5725, 5725)),
+  Box(Box(5726, 5726), Box(5726, 5726)),
+  Box(Box(5727, 5727), Box(5727, 5727)),
+  Box(Box(5728, 5728), Box(5728, 5728)),
+  Box(Box(5729, 5729), Box(5729, 5729)),
+  Box(Box(5730, 5730), Box(5730, 5730)),
+  Box(Box(5731, 5731), Box(5731, 5731)),
+  Box(Box(5732, 5732), Box(5732, 5732)),
+  Box(Box(5733, 5733), Box(5733, 5733)),
+  Box(Box(5734, 5734), Box(5734, 5734)),
+  Box(Box(5735, 5735), Box(5735, 5735)),
+  Box(Box(5736, 5736), Box(5736, 5736)),
+  Box(Box(5737, 5737), Box(5737, 5737)),
+  Box(Box(5738, 5738), Box(5738, 5738)),
+  Box(Box(5739, 5739), Box(5739, 5739)),
+  Box(Box(5740, 5740), Box(5740, 5740)),
+  Box(Box(5741, 5741), Box(5741, 5741)),
+  Box(Box(5742, 5742), Box(5742, 5742)),
+  Box(Box(5743, 5743), Box(5743, 5743)),
+  Box(Box(5744, 5744), Box(5744, 5744)),
+  Box(Box(5745, 5745), Box(5745, 5745)),
+  Box(Box(5746, 5746), Box(5746, 5746)),
+  Box(Box(5747, 5747), Box(5747, 5747)),
+  Box(Box(5748, 5748), Box(5748, 5748)),
+  Box(Box(5749, 5749), Box(5749, 5749)),
+  Box(Box(5750, 5750), Box(5750, 5750)),
+  Box(Box(5751, 5751), Box(5751, 5751)),
+  Box(Box(5752, 5752), Box(5752, 5752)),
+  Box(Box(5753, 5753), Box(5753, 5753)),
+  Box(Box(5754, 5754), Box(5754, 5754)),
+  Box(Box(5755, 5755), Box(5755, 5755)),
+  Box(Box(5756, 5756), Box(5756, 5756)),
+  Box(Box(5757, 5757), Box(5757, 5757)),
+  Box(Box(5758, 5758), Box(5758, 5758)),
+  Box(Box(5759, 5759), Box(5759, 5759)),
+  Box(Box(5760, 5760), Box(5760, 5760)),
+  Box(Box(5761, 5761), Box(5761, 5761)),
+  Box(Box(5762, 5762), Box(5762, 5762)),
+  Box(Box(5763, 5763), Box(5763, 5763)),
+  Box(Box(5764, 5764), Box(5764, 5764)),
+  Box(Box(5765, 5765), Box(5765, 5765)),
+  Box(Box(5766, 5766), Box(5766, 5766)),
+  Box(Box(5767, 5767), Box(5767, 5767)),
+  Box(Box(5768, 5768), Box(5768, 5768)),
+  Box(Box(5769, 5769), Box(5769, 5769)),
+  Box(Box(5770, 5770), Box(5770, 5770)),
+  Box(Box(5771, 5771), Box(5771, 5771)),
+  Box(Box(5772, 5772), Box(5772, 5772)),
+  Box(Box(5773, 5773), Box(5773, 5773)),
+  Box(Box(5774, 5774), Box(5774, 5774)),
+  Box(Box(5775, 5775), Box(5775, 5775)),
+  Box(Box(5776, 5776), Box(5776, 5776)),
+  Box(Box(5777, 5777), Box(5777, 5777)),
+  Box(Box(5778, 5778), Box(5778, 5778)),
+  Box(Box(5779, 5779), Box(5779, 5779)),
+  Box(Box(5780, 5780), Box(5780, 5780)),
+  Box(Box(5781, 5781), Box(5781, 5781)),
+  Box(Box(5782, 5782), Box(5782, 5782)),
+  Box(Box(5783, 5783), Box(5783, 5783)),
+  Box(Box(5784, 5784), Box(5784, 5784)),
+  Box(Box(5785, 5785), Box(5785, 5785)),
+  Box(Box(5786, 5786), Box(5786, 5786)),
+  Box(Box(5787, 5787), Box(5787, 5787)),
+  Box(Box(5788, 5788), Box(5788, 5788)),
+  Box(Box(5789, 5789), Box(5789, 5789)),
+  Box(Box(5790, 5790), Box(5790, 5790)),
+  Box(Box(5791, 5791), Box(5791, 5791)),
+  Box(Box(5792, 5792), Box(5792, 5792)),
+  Box(Box(5793, 5793), Box(5793, 5793)),
+  Box(Box(5794, 5794), Box(5794, 5794)),
+  Box(Box(5795, 5795), Box(5795, 5795)),
+  Box(Box(5796, 5796), Box(5796, 5796)),
+  Box(Box(5797, 5797), Box(5797, 5797)),
+  Box(Box(5798, 5798), Box(5798, 5798)),
+  Box(Box(5799, 5799), Box(5799, 5799)),
+  Box(Box(5800, 5800), Box(5800, 5800)),
+  Box(Box(5801, 5801), Box(5801, 5801)),
+  Box(Box(5802, 5802), Box(5802, 5802)),
+  Box(Box(5803, 5803), Box(5803, 5803)),
+  Box(Box(5804, 5804), Box(5804, 5804)),
+  Box(Box(5805, 5805), Box(5805, 5805)),
+  Box(Box(5806, 5806), Box(5806, 5806)),
+  Box(Box(5807, 5807), Box(5807, 5807)),
+  Box(Box(5808, 5808), Box(5808, 5808)),
+  Box(Box(5809, 5809), Box(5809, 5809)),
+  Box(Box(5810, 5810), Box(5810, 5810)),
+  Box(Box(5811, 5811), Box(5811, 5811)),
+  Box(Box(5812, 5812), Box(5812, 5812)),
+  Box(Box(5813, 5813), Box(5813, 5813)),
+  Box(Box(5814, 5814), Box(5814, 5814)),
+  Box(Box(5815, 5815), Box(5815, 5815)),
+  Box(Box(5816, 5816), Box(5816, 5816)),
+  Box(Box(5817, 5817), Box(5817, 5817)),
+  Box(Box(5818, 5818), Box(5818, 5818)),
+  Box(Box(5819, 5819), Box(5819, 5819)),
+  Box(Box(5820, 5820), Box(5820, 5820)),
+  Box(Box(5821, 5821), Box(5821, 5821)),
+  Box(Box(5822, 5822), Box(5822, 5822)),
+  Box(Box(5823, 5823), Box(5823, 5823)),
+  Box(Box(5824, 5824), Box(5824, 5824)),
+  Box(Box(5825, 5825), Box(5825, 5825)),
+  Box(Box(5826, 5826), Box(5826, 5826)),
+  Box(Box(5827, 5827), Box(5827, 5827)),
+  Box(Box(5828, 5828), Box(5828, 5828)),
+  Box(Box(5829, 5829), Box(5829, 5829)),
+  Box(Box(5830, 5830), Box(5830, 5830)),
+  Box(Box(5831, 5831), Box(5831, 5831)),
+  Box(Box(5832, 5832), Box(5832, 5832)),
+  Box(Box(5833, 5833), Box(5833, 5833)),
+  Box(Box(5834, 5834), Box(5834, 5834)),
+  Box(Box(5835, 5835), Box(5835, 5835)),
+  Box(Box(5836, 5836), Box(5836, 5836)),
+  Box(Box(5837, 5837), Box(5837, 5837)),
+  Box(Box(5838, 5838), Box(5838, 5838)),
+  Box(Box(5839, 5839), Box(5839, 5839)),
+  Box(Box(5840, 5840), Box(5840, 5840)),
+  Box(Box(5841, 5841), Box(5841, 5841)),
+  Box(Box(5842, 5842), Box(5842, 5842)),
+  Box(Box(5843, 5843), Box(5843, 5843)),
+  Box(Box(5844, 5844), Box(5844, 5844)),
+  Box(Box(5845, 5845), Box(5845, 5845)),
+  Box(Box(5846, 5846), Box(5846, 5846)),
+  Box(Box(5847, 5847), Box(5847, 5847)),
+  Box(Box(5848, 5848), Box(5848, 5848)),
+  Box(Box(5849, 5849), Box(5849, 5849)),
+  Box(Box(5850, 5850), Box(5850, 5850)),
+  Box(Box(5851, 5851), Box(5851, 5851)),
+  Box(Box(5852, 5852), Box(5852, 5852)),
+  Box(Box(5853, 5853), Box(5853, 5853)),
+  Box(Box(5854, 5854), Box(5854, 5854)),
+  Box(Box(5855, 5855), Box(5855, 5855)),
+  Box(Box(5856, 5856), Box(5856, 5856)),
+  Box(Box(5857, 5857), Box(5857, 5857)),
+  Box(Box(5858, 5858), Box(5858, 5858)),
+  Box(Box(5859, 5859), Box(5859, 5859)),
+  Box(Box(5860, 5860), Box(5860, 5860)),
+  Box(Box(5861, 5861), Box(5861, 5861)),
+  Box(Box(5862, 5862), Box(5862, 5862)),
+  Box(Box(5863, 5863), Box(5863, 5863)),
+  Box(Box(5864, 5864), Box(5864, 5864)),
+  Box(Box(5865, 5865), Box(5865, 5865)),
+  Box(Box(5866, 5866), Box(5866, 5866)),
+  Box(Box(5867, 5867), Box(5867, 5867)),
+  Box(Box(5868, 5868), Box(5868, 5868)),
+  Box(Box(5869, 5869), Box(5869, 5869)),
+  Box(Box(5870, 5870), Box(5870, 5870)),
+  Box(Box(5871, 5871), Box(5871, 5871)),
+  Box(Box(5872, 5872), Box(5872, 5872)),
+  Box(Box(5873, 5873), Box(5873, 5873)),
+  Box(Box(5874, 5874), Box(5874, 5874)),
+  Box(Box(5875, 5875), Box(5875, 5875)),
+  Box(Box(5876, 5876), Box(5876, 5876)),
+  Box(Box(5877, 5877), Box(5877, 5877)),
+  Box(Box(5878, 5878), Box(5878, 5878)),
+  Box(Box(5879, 5879), Box(5879, 5879)),
+  Box(Box(5880, 5880), Box(5880, 5880)),
+  Box(Box(5881, 5881), Box(5881, 5881)),
+  Box(Box(5882, 5882), Box(5882, 5882)),
+  Box(Box(5883, 5883), Box(5883, 5883)),
+  Box(Box(5884, 5884), Box(5884, 5884)),
+  Box(Box(5885, 5885), Box(5885, 5885)),
+  Box(Box(5886, 5886), Box(5886, 5886)),
+  Box(Box(5887, 5887), Box(5887, 5887)),
+  Box(Box(5888, 5888), Box(5888, 5888)),
+  Box(Box(5889, 5889), Box(5889, 5889)),
+  Box(Box(5890, 5890), Box(5890, 5890)),
+  Box(Box(5891, 5891), Box(5891, 5891)),
+  Box(Box(5892, 5892), Box(5892, 5892)),
+  Box(Box(5893, 5893), Box(5893, 5893)),
+  Box(Box(5894, 5894), Box(5894, 5894)),
+  Box(Box(5895, 5895), Box(5895, 5895)),
+  Box(Box(5896, 5896), Box(5896, 5896)),
+  Box(Box(5897, 5897), Box(5897, 5897)),
+  Box(Box(5898, 5898), Box(5898, 5898)),
+  Box(Box(5899, 5899), Box(5899, 5899)),
+  Box(Box(5900, 5900), Box(5900, 5900)),
+  Box(Box(5901, 5901), Box(5901, 5901)),
+  Box(Box(5902, 5902), Box(5902, 5902)),
+  Box(Box(5903, 5903), Box(5903, 5903)),
+  Box(Box(5904, 5904), Box(5904, 5904)),
+  Box(Box(5905, 5905), Box(5905, 5905)),
+  Box(Box(5906, 5906), Box(5906, 5906)),
+  Box(Box(5907, 5907), Box(5907, 5907)),
+  Box(Box(5908, 5908), Box(5908, 5908)),
+  Box(Box(5909, 5909), Box(5909, 5909)),
+  Box(Box(5910, 5910), Box(5910, 5910)),
+  Box(Box(5911, 5911), Box(5911, 5911)),
+  Box(Box(5912, 5912), Box(5912, 5912)),
+  Box(Box(5913, 5913), Box(5913, 5913)),
+  Box(Box(5914, 5914), Box(5914, 5914)),
+  Box(Box(5915, 5915), Box(5915, 5915)),
+  Box(Box(5916, 5916), Box(5916, 5916)),
+  Box(Box(5917, 5917), Box(5917, 5917)),
+  Box(Box(5918, 5918), Box(5918, 5918)),
+  Box(Box(5919, 5919), Box(5919, 5919)),
+  Box(Box(5920, 5920), Box(5920, 5920)),
+  Box(Box(5921, 5921), Box(5921, 5921)),
+  Box(Box(5922, 5922), Box(5922, 5922)),
+  Box(Box(5923, 5923), Box(5923, 5923)),
+  Box(Box(5924, 5924), Box(5924, 5924)),
+  Box(Box(5925, 5925), Box(5925, 5925)),
+  Box(Box(5926, 5926), Box(5926, 5926)),
+  Box(Box(5927, 5927), Box(5927, 5927)),
+  Box(Box(5928, 5928), Box(5928, 5928)),
+  Box(Box(5929, 5929), Box(5929, 5929)),
+  Box(Box(5930, 5930), Box(5930, 5930)),
+  Box(Box(5931, 5931), Box(5931, 5931)),
+  Box(Box(5932, 5932), Box(5932, 5932)),
+  Box(Box(5933, 5933), Box(5933, 5933)),
+  Box(Box(5934, 5934), Box(5934, 5934)),
+  Box(Box(5935, 5935), Box(5935, 5935)),
+  Box(Box(5936, 5936), Box(5936, 5936)),
+  Box(Box(5937, 5937), Box(5937, 5937)),
+  Box(Box(5938, 5938), Box(5938, 5938)),
+  Box(Box(5939, 5939), Box(5939, 5939)),
+  Box(Box(5940, 5940), Box(5940, 5940)),
+  Box(Box(5941, 5941), Box(5941, 5941)),
+  Box(Box(5942, 5942), Box(5942, 5942)),
+  Box(Box(5943, 5943), Box(5943, 5943)),
+  Box(Box(5944, 5944), Box(5944, 5944)),
+  Box(Box(5945, 5945), Box(5945, 5945)),
+  Box(Box(5946, 5946), Box(5946, 5946)),
+  Box(Box(5947, 5947), Box(5947, 5947)),
+  Box(Box(5948, 5948), Box(5948, 5948)),
+  Box(Box(5949, 5949), Box(5949, 5949)),
+  Box(Box(5950, 5950), Box(5950, 5950)),
+  Box(Box(5951, 5951), Box(5951, 5951)),
+  Box(Box(5952, 5952), Box(5952, 5952)),
+  Box(Box(5953, 5953), Box(5953, 5953)),
+  Box(Box(5954, 5954), Box(5954, 5954)),
+  Box(Box(5955, 5955), Box(5955, 5955)),
+  Box(Box(5956, 5956), Box(5956, 5956)),
+  Box(Box(5957, 5957), Box(5957, 5957)),
+  Box(Box(5958, 5958), Box(5958, 5958)),
+  Box(Box(5959, 5959), Box(5959, 5959)),
+  Box(Box(5960, 5960), Box(5960, 5960)),
+  Box(Box(5961, 5961), Box(5961, 5961)),
+  Box(Box(5962, 5962), Box(5962, 5962)),
+  Box(Box(5963, 5963), Box(5963, 5963)),
+  Box(Box(5964, 5964), Box(5964, 5964)),
+  Box(Box(5965, 5965), Box(5965, 5965)),
+  Box(Box(5966, 5966), Box(5966, 5966)),
+  Box(Box(5967, 5967), Box(5967, 5967)),
+  Box(Box(5968, 5968), Box(5968, 5968)),
+  Box(Box(5969, 5969), Box(5969, 5969)),
+  Box(Box(5970, 5970), Box(5970, 5970)),
+  Box(Box(5971, 5971), Box(5971, 5971)),
+  Box(Box(5972, 5972), Box(5972, 5972)),
+  Box(Box(5973, 5973), Box(5973, 5973)),
+  Box(Box(5974, 5974), Box(5974, 5974)),
+  Box(Box(5975, 5975), Box(5975, 5975)),
+  Box(Box(5976, 5976), Box(5976, 5976)),
+  Box(Box(5977, 5977), Box(5977, 5977)),
+  Box(Box(5978, 5978), Box(5978, 5978)),
+  Box(Box(5979, 5979), Box(5979, 5979)),
+  Box(Box(5980, 5980), Box(5980, 5980)),
+  Box(Box(5981, 5981), Box(5981, 5981)),
+  Box(Box(5982, 5982), Box(5982, 5982)),
+  Box(Box(5983, 5983), Box(5983, 5983)),
+  Box(Box(5984, 5984), Box(5984, 5984)),
+  Box(Box(5985, 5985), Box(5985, 5985)),
+  Box(Box(5986, 5986), Box(5986, 5986)),
+  Box(Box(5987, 5987), Box(5987, 5987)),
+  Box(Box(5988, 5988), Box(5988, 5988)),
+  Box(Box(5989, 5989), Box(5989, 5989)),
+  Box(Box(5990, 5990), Box(5990, 5990)),
+  Box(Box(5991, 5991), Box(5991, 5991)),
+  Box(Box(5992, 5992), Box(5992, 5992)),
+  Box(Box(5993, 5993), Box(5993, 5993)),
+  Box(Box(5994, 5994), Box(5994, 5994)),
+  Box(Box(5995, 5995), Box(5995, 5995)),
+  Box(Box(5996, 5996), Box(5996, 5996)),
+  Box(Box(5997, 5997), Box(5997, 5997)),
+  Box(Box(5998, 5998), Box(5998, 5998)),
+  Box(Box(5999, 5999), Box(5999, 5999)),
+  Box(Box(6000, 6000), Box(6000, 6000)),
+  Box(Box(6001, 6001), Box(6001, 6001)),
+  Box(Box(6002, 6002), Box(6002, 6002)),
+  Box(Box(6003, 6003), Box(6003, 6003)),
+  Box(Box(6004, 6004), Box(6004, 6004)),
+  Box(Box(6005, 6005), Box(6005, 6005)),
+  Box(Box(6006, 6006), Box(6006, 6006)),
+  Box(Box(6007, 6007), Box(6007, 6007)),
+  Box(Box(6008, 6008), Box(6008, 6008)),
+  Box(Box(6009, 6009), Box(6009, 6009)),
+  Box(Box(6010, 6010), Box(6010, 6010)),
+  Box(Box(6011, 6011), Box(6011, 6011)),
+  Box(Box(6012, 6012), Box(6012, 6012)),
+  Box(Box(6013, 6013), Box(6013, 6013)),
+  Box(Box(6014, 6014), Box(6014, 6014)),
+  Box(Box(6015, 6015), Box(6015, 6015)),
+  Box(Box(6016, 6016), Box(6016, 6016)),
+  Box(Box(6017, 6017), Box(6017, 6017)),
+  Box(Box(6018, 6018), Box(6018, 6018)),
+  Box(Box(6019, 6019), Box(6019, 6019)),
+  Box(Box(6020, 6020), Box(6020, 6020)),
+  Box(Box(6021, 6021), Box(6021, 6021)),
+  Box(Box(6022, 6022), Box(6022, 6022)),
+  Box(Box(6023, 6023), Box(6023, 6023)),
+  Box(Box(6024, 6024), Box(6024, 6024)),
+  Box(Box(6025, 6025), Box(6025, 6025)),
+  Box(Box(6026, 6026), Box(6026, 6026)),
+  Box(Box(6027, 6027), Box(6027, 6027)),
+  Box(Box(6028, 6028), Box(6028, 6028)),
+  Box(Box(6029, 6029), Box(6029, 6029)),
+  Box(Box(6030, 6030), Box(6030, 6030)),
+  Box(Box(6031, 6031), Box(6031, 6031)),
+  Box(Box(6032, 6032), Box(6032, 6032)),
+  Box(Box(6033, 6033), Box(6033, 6033)),
+  Box(Box(6034, 6034), Box(6034, 6034)),
+  Box(Box(6035, 6035), Box(6035, 6035)),
+  Box(Box(6036, 6036), Box(6036, 6036)),
+  Box(Box(6037, 6037), Box(6037, 6037)),
+  Box(Box(6038, 6038), Box(6038, 6038)),
+  Box(Box(6039, 6039), Box(6039, 6039)),
+  Box(Box(6040, 6040), Box(6040, 6040)),
+  Box(Box(6041, 6041), Box(6041, 6041)),
+  Box(Box(6042, 6042), Box(6042, 6042)),
+  Box(Box(6043, 6043), Box(6043, 6043)),
+  Box(Box(6044, 6044), Box(6044, 6044)),
+  Box(Box(6045, 6045), Box(6045, 6045)),
+  Box(Box(6046, 6046), Box(6046, 6046)),
+  Box(Box(6047, 6047), Box(6047, 6047)),
+  Box(Box(6048, 6048), Box(6048, 6048)),
+  Box(Box(6049, 6049), Box(6049, 6049)),
+  Box(Box(6050, 6050), Box(6050, 6050)),
+  Box(Box(6051, 6051), Box(6051, 6051)),
+  Box(Box(6052, 6052), Box(6052, 6052)),
+  Box(Box(6053, 6053), Box(6053, 6053)),
+  Box(Box(6054, 6054), Box(6054, 6054)),
+  Box(Box(6055, 6055), Box(6055, 6055)),
+  Box(Box(6056, 6056), Box(6056, 6056)),
+  Box(Box(6057, 6057), Box(6057, 6057)),
+  Box(Box(6058, 6058), Box(6058, 6058)),
+  Box(Box(6059, 6059), Box(6059, 6059)),
+  Box(Box(6060, 6060), Box(6060, 6060)),
+  Box(Box(6061, 6061), Box(6061, 6061)),
+  Box(Box(6062, 6062), Box(6062, 6062)),
+  Box(Box(6063, 6063), Box(6063, 6063)),
+  Box(Box(6064, 6064), Box(6064, 6064)),
+  Box(Box(6065, 6065), Box(6065, 6065)),
+  Box(Box(6066, 6066), Box(6066, 6066)),
+  Box(Box(6067, 6067), Box(6067, 6067)),
+  Box(Box(6068, 6068), Box(6068, 6068)),
+  Box(Box(6069, 6069), Box(6069, 6069)),
+  Box(Box(6070, 6070), Box(6070, 6070)),
+  Box(Box(6071, 6071), Box(6071, 6071)),
+  Box(Box(6072, 6072), Box(6072, 6072)),
+  Box(Box(6073, 6073), Box(6073, 6073)),
+  Box(Box(6074, 6074), Box(6074, 6074)),
+  Box(Box(6075, 6075), Box(6075, 6075)),
+  Box(Box(6076, 6076), Box(6076, 6076)),
+  Box(Box(6077, 6077), Box(6077, 6077)),
+  Box(Box(6078, 6078), Box(6078, 6078)),
+  Box(Box(6079, 6079), Box(6079, 6079)),
+  Box(Box(6080, 6080), Box(6080, 6080)),
+  Box(Box(6081, 6081), Box(6081, 6081)),
+  Box(Box(6082, 6082), Box(6082, 6082)),
+  Box(Box(6083, 6083), Box(6083, 6083)),
+  Box(Box(6084, 6084), Box(6084, 6084)),
+  Box(Box(6085, 6085), Box(6085, 6085)),
+  Box(Box(6086, 6086), Box(6086, 6086)),
+  Box(Box(6087, 6087), Box(6087, 6087)),
+  Box(Box(6088, 6088), Box(6088, 6088)),
+  Box(Box(6089, 6089), Box(6089, 6089)),
+  Box(Box(6090, 6090), Box(6090, 6090)),
+  Box(Box(6091, 6091), Box(6091, 6091)),
+  Box(Box(6092, 6092), Box(6092, 6092)),
+  Box(Box(6093, 6093), Box(6093, 6093)),
+  Box(Box(6094, 6094), Box(6094, 6094)),
+  Box(Box(6095, 6095), Box(6095, 6095)),
+  Box(Box(6096, 6096), Box(6096, 6096)),
+  Box(Box(6097, 6097), Box(6097, 6097)),
+  Box(Box(6098, 6098), Box(6098, 6098)),
+  Box(Box(6099, 6099), Box(6099, 6099)),
+  Box(Box(6100, 6100), Box(6100, 6100)),
+  Box(Box(6101, 6101), Box(6101, 6101)),
+  Box(Box(6102, 6102), Box(6102, 6102)),
+  Box(Box(6103, 6103), Box(6103, 6103)),
+  Box(Box(6104, 6104), Box(6104, 6104)),
+  Box(Box(6105, 6105), Box(6105, 6105)),
+  Box(Box(6106, 6106), Box(6106, 6106)),
+  Box(Box(6107, 6107), Box(6107, 6107)),
+  Box(Box(6108, 6108), Box(6108, 6108)),
+  Box(Box(6109, 6109), Box(6109, 6109)),
+  Box(Box(6110, 6110), Box(6110, 6110)),
+  Box(Box(6111, 6111), Box(6111, 6111)),
+  Box(Box(6112, 6112), Box(6112, 6112)),
+  Box(Box(6113, 6113), Box(6113, 6113)),
+  Box(Box(6114, 6114), Box(6114, 6114)),
+  Box(Box(6115, 6115), Box(6115, 6115)),
+  Box(Box(6116, 6116), Box(6116, 6116)),
+  Box(Box(6117, 6117), Box(6117, 6117)),
+  Box(Box(6118, 6118), Box(6118, 6118)),
+  Box(Box(6119, 6119), Box(6119, 6119)),
+  Box(Box(6120, 6120), Box(6120, 6120)),
+  Box(Box(6121, 6121), Box(6121, 6121)),
+  Box(Box(6122, 6122), Box(6122, 6122)),
+  Box(Box(6123, 6123), Box(6123, 6123)),
+  Box(Box(6124, 6124), Box(6124, 6124)),
+  Box(Box(6125, 6125), Box(6125, 6125)),
+  Box(Box(6126, 6126), Box(6126, 6126)),
+  Box(Box(6127, 6127), Box(6127, 6127)),
+  Box(Box(6128, 6128), Box(6128, 6128)),
+  Box(Box(6129, 6129), Box(6129, 6129)),
+  Box(Box(6130, 6130), Box(6130, 6130)),
+  Box(Box(6131, 6131), Box(6131, 6131)),
+  Box(Box(6132, 6132), Box(6132, 6132)),
+  Box(Box(6133, 6133), Box(6133, 6133)),
+  Box(Box(6134, 6134), Box(6134, 6134)),
+  Box(Box(6135, 6135), Box(6135, 6135)),
+  Box(Box(6136, 6136), Box(6136, 6136)),
+  Box(Box(6137, 6137), Box(6137, 6137)),
+  Box(Box(6138, 6138), Box(6138, 6138)),
+  Box(Box(6139, 6139), Box(6139, 6139)),
+  Box(Box(6140, 6140), Box(6140, 6140)),
+  Box(Box(6141, 6141), Box(6141, 6141)),
+  Box(Box(6142, 6142), Box(6142, 6142)),
+  Box(Box(6143, 6143), Box(6143, 6143)),
+  Box(Box(6144, 6144), Box(6144, 6144)),
+  Box(Box(6145, 6145), Box(6145, 6145)),
+  Box(Box(6146, 6146), Box(6146, 6146)),
+  Box(Box(6147, 6147), Box(6147, 6147)),
+  Box(Box(6148, 6148), Box(6148, 6148)),
+  Box(Box(6149, 6149), Box(6149, 6149)),
+  Box(Box(6150, 6150), Box(6150, 6150)),
+  Box(Box(6151, 6151), Box(6151, 6151)),
+  Box(Box(6152, 6152), Box(6152, 6152)),
+  Box(Box(6153, 6153), Box(6153, 6153)),
+  Box(Box(6154, 6154), Box(6154, 6154)),
+  Box(Box(6155, 6155), Box(6155, 6155)),
+  Box(Box(6156, 6156), Box(6156, 6156)),
+  Box(Box(6157, 6157), Box(6157, 6157)),
+  Box(Box(6158, 6158), Box(6158, 6158)),
+  Box(Box(6159, 6159), Box(6159, 6159)),
+  Box(Box(6160, 6160), Box(6160, 6160)),
+  Box(Box(6161, 6161), Box(6161, 6161)),
+  Box(Box(6162, 6162), Box(6162, 6162)),
+  Box(Box(6163, 6163), Box(6163, 6163)),
+  Box(Box(6164, 6164), Box(6164, 6164)),
+  Box(Box(6165, 6165), Box(6165, 6165)),
+  Box(Box(6166, 6166), Box(6166, 6166)),
+  Box(Box(6167, 6167), Box(6167, 6167)),
+  Box(Box(6168, 6168), Box(6168, 6168)),
+  Box(Box(6169, 6169), Box(6169, 6169)),
+  Box(Box(6170, 6170), Box(6170, 6170)),
+  Box(Box(6171, 6171), Box(6171, 6171)),
+  Box(Box(6172, 6172), Box(6172, 6172)),
+  Box(Box(6173, 6173), Box(6173, 6173)),
+  Box(Box(6174, 6174), Box(6174, 6174)),
+  Box(Box(6175, 6175), Box(6175, 6175)),
+  Box(Box(6176, 6176), Box(6176, 6176)),
+  Box(Box(6177, 6177), Box(6177, 6177)),
+  Box(Box(6178, 6178), Box(6178, 6178)),
+  Box(Box(6179, 6179), Box(6179, 6179)),
+  Box(Box(6180, 6180), Box(6180, 6180)),
+  Box(Box(6181, 6181), Box(6181, 6181)),
+  Box(Box(6182, 6182), Box(6182, 6182)),
+  Box(Box(6183, 6183), Box(6183, 6183)),
+  Box(Box(6184, 6184), Box(6184, 6184)),
+  Box(Box(6185, 6185), Box(6185, 6185)),
+  Box(Box(6186, 6186), Box(6186, 6186)),
+  Box(Box(6187, 6187), Box(6187, 6187)),
+  Box(Box(6188, 6188), Box(6188, 6188)),
+  Box(Box(6189, 6189), Box(6189, 6189)),
+  Box(Box(6190, 6190), Box(6190, 6190)),
+  Box(Box(6191, 6191), Box(6191, 6191)),
+  Box(Box(6192, 6192), Box(6192, 6192)),
+  Box(Box(6193, 6193), Box(6193, 6193)),
+  Box(Box(6194, 6194), Box(6194, 6194)),
+  Box(Box(6195, 6195), Box(6195, 6195)),
+  Box(Box(6196, 6196), Box(6196, 6196)),
+  Box(Box(6197, 6197), Box(6197, 6197)),
+  Box(Box(6198, 6198), Box(6198, 6198)),
+  Box(Box(6199, 6199), Box(6199, 6199)),
+  Box(Box(6200, 6200), Box(6200, 6200)),
+  Box(Box(6201, 6201), Box(6201, 6201)),
+  Box(Box(6202, 6202), Box(6202, 6202)),
+  Box(Box(6203, 6203), Box(6203, 6203)),
+  Box(Box(6204, 6204), Box(6204, 6204)),
+  Box(Box(6205, 6205), Box(6205, 6205)),
+  Box(Box(6206, 6206), Box(6206, 6206)),
+  Box(Box(6207, 6207), Box(6207, 6207)),
+  Box(Box(6208, 6208), Box(6208, 6208)),
+  Box(Box(6209, 6209), Box(6209, 6209)),
+  Box(Box(6210, 6210), Box(6210, 6210)),
+  Box(Box(6211, 6211), Box(6211, 6211)),
+  Box(Box(6212, 6212), Box(6212, 6212)),
+  Box(Box(6213, 6213), Box(6213, 6213)),
+  Box(Box(6214, 6214), Box(6214, 6214)),
+  Box(Box(6215, 6215), Box(6215, 6215)),
+  Box(Box(6216, 6216), Box(6216, 6216)),
+  Box(Box(6217, 6217), Box(6217, 6217)),
+  Box(Box(6218, 6218), Box(6218, 6218)),
+  Box(Box(6219, 6219), Box(6219, 6219)),
+  Box(Box(6220, 6220), Box(6220, 6220)),
+  Box(Box(6221, 6221), Box(6221, 6221)),
+  Box(Box(6222, 6222), Box(6222, 6222)),
+  Box(Box(6223, 6223), Box(6223, 6223)),
+  Box(Box(6224, 6224), Box(6224, 6224)),
+  Box(Box(6225, 6225), Box(6225, 6225)),
+  Box(Box(6226, 6226), Box(6226, 6226)),
+  Box(Box(6227, 6227), Box(6227, 6227)),
+  Box(Box(6228, 6228), Box(6228, 6228)),
+  Box(Box(6229, 6229), Box(6229, 6229)),
+  Box(Box(6230, 6230), Box(6230, 6230)),
+  Box(Box(6231, 6231), Box(6231, 6231)),
+  Box(Box(6232, 6232), Box(6232, 6232)),
+  Box(Box(6233, 6233), Box(6233, 6233)),
+  Box(Box(6234, 6234), Box(6234, 6234)),
+  Box(Box(6235, 6235), Box(6235, 6235)),
+  Box(Box(6236, 6236), Box(6236, 6236)),
+  Box(Box(6237, 6237), Box(6237, 6237)),
+  Box(Box(6238, 6238), Box(6238, 6238)),
+  Box(Box(6239, 6239), Box(6239, 6239)),
+  Box(Box(6240, 6240), Box(6240, 6240)),
+  Box(Box(6241, 6241), Box(6241, 6241)),
+  Box(Box(6242, 6242), Box(6242, 6242)),
+  Box(Box(6243, 6243), Box(6243, 6243)),
+  Box(Box(6244, 6244), Box(6244, 6244)),
+  Box(Box(6245, 6245), Box(6245, 6245)),
+  Box(Box(6246, 6246), Box(6246, 6246)),
+  Box(Box(6247, 6247), Box(6247, 6247)),
+  Box(Box(6248, 6248), Box(6248, 6248)),
+  Box(Box(6249, 6249), Box(6249, 6249)),
+  Box(Box(6250, 6250), Box(6250, 6250)),
+  Box(Box(6251, 6251), Box(6251, 6251)),
+  Box(Box(6252, 6252), Box(6252, 6252)),
+  Box(Box(6253, 6253), Box(6253, 6253)),
+  Box(Box(6254, 6254), Box(6254, 6254)),
+  Box(Box(6255, 6255), Box(6255, 6255)),
+  Box(Box(6256, 6256), Box(6256, 6256)),
+  Box(Box(6257, 6257), Box(6257, 6257)),
+  Box(Box(6258, 6258), Box(6258, 6258)),
+  Box(Box(6259, 6259), Box(6259, 6259)),
+  Box(Box(6260, 6260), Box(6260, 6260)),
+  Box(Box(6261, 6261), Box(6261, 6261)),
+  Box(Box(6262, 6262), Box(6262, 6262)),
+  Box(Box(6263, 6263), Box(6263, 6263)),
+  Box(Box(6264, 6264), Box(6264, 6264)),
+  Box(Box(6265, 6265), Box(6265, 6265)),
+  Box(Box(6266, 6266), Box(6266, 6266)),
+  Box(Box(6267, 6267), Box(6267, 6267)),
+  Box(Box(6268, 6268), Box(6268, 6268)),
+  Box(Box(6269, 6269), Box(6269, 6269)),
+  Box(Box(6270, 6270), Box(6270, 6270)),
+  Box(Box(6271, 6271), Box(6271, 6271)),
+  Box(Box(6272, 6272), Box(6272, 6272)),
+  Box(Box(6273, 6273), Box(6273, 6273)),
+  Box(Box(6274, 6274), Box(6274, 6274)),
+  Box(Box(6275, 6275), Box(6275, 6275)),
+  Box(Box(6276, 6276), Box(6276, 6276)),
+  Box(Box(6277, 6277), Box(6277, 6277)),
+  Box(Box(6278, 6278), Box(6278, 6278)),
+  Box(Box(6279, 6279), Box(6279, 6279)),
+  Box(Box(6280, 6280), Box(6280, 6280)),
+  Box(Box(6281, 6281), Box(6281, 6281)),
+  Box(Box(6282, 6282), Box(6282, 6282)),
+  Box(Box(6283, 6283), Box(6283, 6283)),
+  Box(Box(6284, 6284), Box(6284, 6284)),
+  Box(Box(6285, 6285), Box(6285, 6285)),
+  Box(Box(6286, 6286), Box(6286, 6286)),
+  Box(Box(6287, 6287), Box(6287, 6287)),
+  Box(Box(6288, 6288), Box(6288, 6288)),
+  Box(Box(6289, 6289), Box(6289, 6289)),
+  Box(Box(6290, 6290), Box(6290, 6290)),
+  Box(Box(6291, 6291), Box(6291, 6291)),
+  Box(Box(6292, 6292), Box(6292, 6292)),
+  Box(Box(6293, 6293), Box(6293, 6293)),
+  Box(Box(6294, 6294), Box(6294, 6294)),
+  Box(Box(6295, 6295), Box(6295, 6295)),
+  Box(Box(6296, 6296), Box(6296, 6296)),
+  Box(Box(6297, 6297), Box(6297, 6297)),
+  Box(Box(6298, 6298), Box(6298, 6298)),
+  Box(Box(6299, 6299), Box(6299, 6299)),
+  Box(Box(6300, 6300), Box(6300, 6300)),
+  Box(Box(6301, 6301), Box(6301, 6301)),
+  Box(Box(6302, 6302), Box(6302, 6302)),
+  Box(Box(6303, 6303), Box(6303, 6303)),
+  Box(Box(6304, 6304), Box(6304, 6304)),
+  Box(Box(6305, 6305), Box(6305, 6305)),
+  Box(Box(6306, 6306), Box(6306, 6306)),
+  Box(Box(6307, 6307), Box(6307, 6307)),
+  Box(Box(6308, 6308), Box(6308, 6308)),
+  Box(Box(6309, 6309), Box(6309, 6309)),
+  Box(Box(6310, 6310), Box(6310, 6310)),
+  Box(Box(6311, 6311), Box(6311, 6311)),
+  Box(Box(6312, 6312), Box(6312, 6312)),
+  Box(Box(6313, 6313), Box(6313, 6313)),
+  Box(Box(6314, 6314), Box(6314, 6314)),
+  Box(Box(6315, 6315), Box(6315, 6315)),
+  Box(Box(6316, 6316), Box(6316, 6316)),
+  Box(Box(6317, 6317), Box(6317, 6317)),
+  Box(Box(6318, 6318), Box(6318, 6318)),
+  Box(Box(6319, 6319), Box(6319, 6319)),
+  Box(Box(6320, 6320), Box(6320, 6320)),
+  Box(Box(6321, 6321), Box(6321, 6321)),
+  Box(Box(6322, 6322), Box(6322, 6322)),
+  Box(Box(6323, 6323), Box(6323, 6323)),
+  Box(Box(6324, 6324), Box(6324, 6324)),
+  Box(Box(6325, 6325), Box(6325, 6325)),
+  Box(Box(6326, 6326), Box(6326, 6326)),
+  Box(Box(6327, 6327), Box(6327, 6327)),
+  Box(Box(6328, 6328), Box(6328, 6328)),
+  Box(Box(6329, 6329), Box(6329, 6329)),
+  Box(Box(6330, 6330), Box(6330, 6330)),
+  Box(Box(6331, 6331), Box(6331, 6331)),
+  Box(Box(6332, 6332), Box(6332, 6332)),
+  Box(Box(6333, 6333), Box(6333, 6333)),
+  Box(Box(6334, 6334), Box(6334, 6334)),
+  Box(Box(6335, 6335), Box(6335, 6335)),
+  Box(Box(6336, 6336), Box(6336, 6336)),
+  Box(Box(6337, 6337), Box(6337, 6337)),
+  Box(Box(6338, 6338), Box(6338, 6338)),
+  Box(Box(6339, 6339), Box(6339, 6339)),
+  Box(Box(6340, 6340), Box(6340, 6340)),
+  Box(Box(6341, 6341), Box(6341, 6341)),
+  Box(Box(6342, 6342), Box(6342, 6342)),
+  Box(Box(6343, 6343), Box(6343, 6343)),
+  Box(Box(6344, 6344), Box(6344, 6344)),
+  Box(Box(6345, 6345), Box(6345, 6345)),
+  Box(Box(6346, 6346), Box(6346, 6346)),
+  Box(Box(6347, 6347), Box(6347, 6347)),
+  Box(Box(6348, 6348), Box(6348, 6348)),
+  Box(Box(6349, 6349), Box(6349, 6349)),
+  Box(Box(6350, 6350), Box(6350, 6350)),
+  Box(Box(6351, 6351), Box(6351, 6351)),
+  Box(Box(6352, 6352), Box(6352, 6352)),
+  Box(Box(6353, 6353), Box(6353, 6353)),
+  Box(Box(6354, 6354), Box(6354, 6354)),
+  Box(Box(6355, 6355), Box(6355, 6355)),
+  Box(Box(6356, 6356), Box(6356, 6356)),
+  Box(Box(6357, 6357), Box(6357, 6357)),
+  Box(Box(6358, 6358), Box(6358, 6358)),
+  Box(Box(6359, 6359), Box(6359, 6359)),
+  Box(Box(6360, 6360), Box(6360, 6360)),
+  Box(Box(6361, 6361), Box(6361, 6361)),
+  Box(Box(6362, 6362), Box(6362, 6362)),
+  Box(Box(6363, 6363), Box(6363, 6363)),
+  Box(Box(6364, 6364), Box(6364, 6364)),
+  Box(Box(6365, 6365), Box(6365, 6365)),
+  Box(Box(6366, 6366), Box(6366, 6366)),
+  Box(Box(6367, 6367), Box(6367, 6367)),
+  Box(Box(6368, 6368), Box(6368, 6368)),
+  Box(Box(6369, 6369), Box(6369, 6369)),
+  Box(Box(6370, 6370), Box(6370, 6370)),
+  Box(Box(6371, 6371), Box(6371, 6371)),
+  Box(Box(6372, 6372), Box(6372, 6372)),
+  Box(Box(6373, 6373), Box(6373, 6373)),
+  Box(Box(6374, 6374), Box(6374, 6374)),
+  Box(Box(6375, 6375), Box(6375, 6375)),
+  Box(Box(6376, 6376), Box(6376, 6376)),
+  Box(Box(6377, 6377), Box(6377, 6377)),
+  Box(Box(6378, 6378), Box(6378, 6378)),
+  Box(Box(6379, 6379), Box(6379, 6379)),
+  Box(Box(6380, 6380), Box(6380, 6380)),
+  Box(Box(6381, 6381), Box(6381, 6381)),
+  Box(Box(6382, 6382), Box(6382, 6382)),
+  Box(Box(6383, 6383), Box(6383, 6383)),
+  Box(Box(6384, 6384), Box(6384, 6384)),
+  Box(Box(6385, 6385), Box(6385, 6385)),
+  Box(Box(6386, 6386), Box(6386, 6386)),
+  Box(Box(6387, 6387), Box(6387, 6387)),
+  Box(Box(6388, 6388), Box(6388, 6388)),
+  Box(Box(6389, 6389), Box(6389, 6389)),
+  Box(Box(6390, 6390), Box(6390, 6390)),
+  Box(Box(6391, 6391), Box(6391, 6391)),
+  Box(Box(6392, 6392), Box(6392, 6392)),
+  Box(Box(6393, 6393), Box(6393, 6393)),
+  Box(Box(6394, 6394), Box(6394, 6394)),
+  Box(Box(6395, 6395), Box(6395, 6395)),
+  Box(Box(6396, 6396), Box(6396, 6396)),
+  Box(Box(6397, 6397), Box(6397, 6397)),
+  Box(Box(6398, 6398), Box(6398, 6398)),
+  Box(Box(6399, 6399), Box(6399, 6399)),
+  Box(Box(6400, 6400), Box(6400, 6400)),
+  Box(Box(6401, 6401), Box(6401, 6401)),
+  Box(Box(6402, 6402), Box(6402, 6402)),
+  Box(Box(6403, 6403), Box(6403, 6403)),
+  Box(Box(6404, 6404), Box(6404, 6404)),
+  Box(Box(6405, 6405), Box(6405, 6405)),
+  Box(Box(6406, 6406), Box(6406, 6406)),
+  Box(Box(6407, 6407), Box(6407, 6407)),
+  Box(Box(6408, 6408), Box(6408, 6408)),
+  Box(Box(6409, 6409), Box(6409, 6409)),
+  Box(Box(6410, 6410), Box(6410, 6410)),
+  Box(Box(6411, 6411), Box(6411, 6411)),
+  Box(Box(6412, 6412), Box(6412, 6412)),
+  Box(Box(6413, 6413), Box(6413, 6413)),
+  Box(Box(6414, 6414), Box(6414, 6414)),
+  Box(Box(6415, 6415), Box(6415, 6415)),
+  Box(Box(6416, 6416), Box(6416, 6416)),
+  Box(Box(6417, 6417), Box(6417, 6417)),
+  Box(Box(6418, 6418), Box(6418, 6418)),
+  Box(Box(6419, 6419), Box(6419, 6419)),
+  Box(Box(6420, 6420), Box(6420, 6420)),
+  Box(Box(6421, 6421), Box(6421, 6421)),
+  Box(Box(6422, 6422), Box(6422, 6422)),
+  Box(Box(6423, 6423), Box(6423, 6423)),
+  Box(Box(6424, 6424), Box(6424, 6424)),
+  Box(Box(6425, 6425), Box(6425, 6425)),
+  Box(Box(6426, 6426), Box(6426, 6426)),
+  Box(Box(6427, 6427), Box(6427, 6427)),
+  Box(Box(6428, 6428), Box(6428, 6428)),
+  Box(Box(6429, 6429), Box(6429, 6429)),
+  Box(Box(6430, 6430), Box(6430, 6430)),
+  Box(Box(6431, 6431), Box(6431, 6431)),
+  Box(Box(6432, 6432), Box(6432, 6432)),
+  Box(Box(6433, 6433), Box(6433, 6433)),
+  Box(Box(6434, 6434), Box(6434, 6434)),
+  Box(Box(6435, 6435), Box(6435, 6435)),
+  Box(Box(6436, 6436), Box(6436, 6436)),
+  Box(Box(6437, 6437), Box(6437, 6437)),
+  Box(Box(6438, 6438), Box(6438, 6438)),
+  Box(Box(6439, 6439), Box(6439, 6439)),
+  Box(Box(6440, 6440), Box(6440, 6440)),
+  Box(Box(6441, 6441), Box(6441, 6441)),
+  Box(Box(6442, 6442), Box(6442, 6442)),
+  Box(Box(6443, 6443), Box(6443, 6443)),
+  Box(Box(6444, 6444), Box(6444, 6444)),
+  Box(Box(6445, 6445), Box(6445, 6445)),
+  Box(Box(6446, 6446), Box(6446, 6446)),
+  Box(Box(6447, 6447), Box(6447, 6447)),
+  Box(Box(6448, 6448), Box(6448, 6448)),
+  Box(Box(6449, 6449), Box(6449, 6449)),
+  Box(Box(6450, 6450), Box(6450, 6450)),
+  Box(Box(6451, 6451), Box(6451, 6451)),
+  Box(Box(6452, 6452), Box(6452, 6452)),
+  Box(Box(6453, 6453), Box(6453, 6453)),
+  Box(Box(6454, 6454), Box(6454, 6454)),
+  Box(Box(6455, 6455), Box(6455, 6455)),
+  Box(Box(6456, 6456), Box(6456, 6456)),
+  Box(Box(6457, 6457), Box(6457, 6457)),
+  Box(Box(6458, 6458), Box(6458, 6458)),
+  Box(Box(6459, 6459), Box(6459, 6459)),
+  Box(Box(6460, 6460), Box(6460, 6460)),
+  Box(Box(6461, 6461), Box(6461, 6461)),
+  Box(Box(6462, 6462), Box(6462, 6462)),
+  Box(Box(6463, 6463), Box(6463, 6463)),
+  Box(Box(6464, 6464), Box(6464, 6464)),
+  Box(Box(6465, 6465), Box(6465, 6465)),
+  Box(Box(6466, 6466), Box(6466, 6466)),
+  Box(Box(6467, 6467), Box(6467, 6467)),
+  Box(Box(6468, 6468), Box(6468, 6468)),
+  Box(Box(6469, 6469), Box(6469, 6469)),
+  Box(Box(6470, 6470), Box(6470, 6470)),
+  Box(Box(6471, 6471), Box(6471, 6471)),
+  Box(Box(6472, 6472), Box(6472, 6472)),
+  Box(Box(6473, 6473), Box(6473, 6473)),
+  Box(Box(6474, 6474), Box(6474, 6474)),
+  Box(Box(6475, 6475), Box(6475, 6475)),
+  Box(Box(6476, 6476), Box(6476, 6476)),
+  Box(Box(6477, 6477), Box(6477, 6477)),
+  Box(Box(6478, 6478), Box(6478, 6478)),
+  Box(Box(6479, 6479), Box(6479, 6479)),
+  Box(Box(6480, 6480), Box(6480, 6480)),
+  Box(Box(6481, 6481), Box(6481, 6481)),
+  Box(Box(6482, 6482), Box(6482, 6482)),
+  Box(Box(6483, 6483), Box(6483, 6483)),
+  Box(Box(6484, 6484), Box(6484, 6484)),
+  Box(Box(6485, 6485), Box(6485, 6485)),
+  Box(Box(6486, 6486), Box(6486, 6486)),
+  Box(Box(6487, 6487), Box(6487, 6487)),
+  Box(Box(6488, 6488), Box(6488, 6488)),
+  Box(Box(6489, 6489), Box(6489, 6489)),
+  Box(Box(6490, 6490), Box(6490, 6490)),
+  Box(Box(6491, 6491), Box(6491, 6491)),
+  Box(Box(6492, 6492), Box(6492, 6492)),
+  Box(Box(6493, 6493), Box(6493, 6493)),
+  Box(Box(6494, 6494), Box(6494, 6494)),
+  Box(Box(6495, 6495), Box(6495, 6495)),
+  Box(Box(6496, 6496), Box(6496, 6496)),
+  Box(Box(6497, 6497), Box(6497, 6497)),
+  Box(Box(6498, 6498), Box(6498, 6498)),
+  Box(Box(6499, 6499), Box(6499, 6499)),
+  Box(Box(6500, 6500), Box(6500, 6500)),
+  Box(Box(6501, 6501), Box(6501, 6501)),
+  Box(Box(6502, 6502), Box(6502, 6502)),
+  Box(Box(6503, 6503), Box(6503, 6503)),
+  Box(Box(6504, 6504), Box(6504, 6504)),
+  Box(Box(6505, 6505), Box(6505, 6505)),
+  Box(Box(6506, 6506), Box(6506, 6506)),
+  Box(Box(6507, 6507), Box(6507, 6507)),
+  Box(Box(6508, 6508), Box(6508, 6508)),
+  Box(Box(6509, 6509), Box(6509, 6509)),
+  Box(Box(6510, 6510), Box(6510, 6510)),
+  Box(Box(6511, 6511), Box(6511, 6511)),
+  Box(Box(6512, 6512), Box(6512, 6512)),
+  Box(Box(6513, 6513), Box(6513, 6513)),
+  Box(Box(6514, 6514), Box(6514, 6514)),
+  Box(Box(6515, 6515), Box(6515, 6515)),
+  Box(Box(6516, 6516), Box(6516, 6516)),
+  Box(Box(6517, 6517), Box(6517, 6517)),
+  Box(Box(6518, 6518), Box(6518, 6518)),
+  Box(Box(6519, 6519), Box(6519, 6519)),
+  Box(Box(6520, 6520), Box(6520, 6520)),
+  Box(Box(6521, 6521), Box(6521, 6521)),
+  Box(Box(6522, 6522), Box(6522, 6522)),
+  Box(Box(6523, 6523), Box(6523, 6523)),
+  Box(Box(6524, 6524), Box(6524, 6524)),
+  Box(Box(6525, 6525), Box(6525, 6525)),
+  Box(Box(6526, 6526), Box(6526, 6526)),
+  Box(Box(6527, 6527), Box(6527, 6527)),
+  Box(Box(6528, 6528), Box(6528, 6528)),
+  Box(Box(6529, 6529), Box(6529, 6529)),
+  Box(Box(6530, 6530), Box(6530, 6530)),
+  Box(Box(6531, 6531), Box(6531, 6531)),
+  Box(Box(6532, 6532), Box(6532, 6532)),
+  Box(Box(6533, 6533), Box(6533, 6533)),
+  Box(Box(6534, 6534), Box(6534, 6534)),
+  Box(Box(6535, 6535), Box(6535, 6535)),
+  Box(Box(6536, 6536), Box(6536, 6536)),
+  Box(Box(6537, 6537), Box(6537, 6537)),
+  Box(Box(6538, 6538), Box(6538, 6538)),
+  Box(Box(6539, 6539), Box(6539, 6539)),
+  Box(Box(6540, 6540), Box(6540, 6540)),
+  Box(Box(6541, 6541), Box(6541, 6541)),
+  Box(Box(6542, 6542), Box(6542, 6542)),
+  Box(Box(6543, 6543), Box(6543, 6543)),
+  Box(Box(6544, 6544), Box(6544, 6544)),
+  Box(Box(6545, 6545), Box(6545, 6545)),
+  Box(Box(6546, 6546), Box(6546, 6546)),
+  Box(Box(6547, 6547), Box(6547, 6547)),
+  Box(Box(6548, 6548), Box(6548, 6548)),
+  Box(Box(6549, 6549), Box(6549, 6549)),
+  Box(Box(6550, 6550), Box(6550, 6550)),
+  Box(Box(6551, 6551), Box(6551, 6551)),
+  Box(Box(6552, 6552), Box(6552, 6552)),
+  Box(Box(6553, 6553), Box(6553, 6553)),
+  Box(Box(6554, 6554), Box(6554, 6554)),
+  Box(Box(6555, 6555), Box(6555, 6555)),
+  Box(Box(6556, 6556), Box(6556, 6556)),
+  Box(Box(6557, 6557), Box(6557, 6557)),
+  Box(Box(6558, 6558), Box(6558, 6558)),
+  Box(Box(6559, 6559), Box(6559, 6559)),
+  Box(Box(6560, 6560), Box(6560, 6560)),
+  Box(Box(6561, 6561), Box(6561, 6561)),
+  Box(Box(6562, 6562), Box(6562, 6562)),
+  Box(Box(6563, 6563), Box(6563, 6563)),
+  Box(Box(6564, 6564), Box(6564, 6564)),
+  Box(Box(6565, 6565), Box(6565, 6565)),
+  Box(Box(6566, 6566), Box(6566, 6566)),
+  Box(Box(6567, 6567), Box(6567, 6567)),
+  Box(Box(6568, 6568), Box(6568, 6568)),
+  Box(Box(6569, 6569), Box(6569, 6569)),
+  Box(Box(6570, 6570), Box(6570, 6570)),
+  Box(Box(6571, 6571), Box(6571, 6571)),
+  Box(Box(6572, 6572), Box(6572, 6572)),
+  Box(Box(6573, 6573), Box(6573, 6573)),
+  Box(Box(6574, 6574), Box(6574, 6574)),
+  Box(Box(6575, 6575), Box(6575, 6575)),
+  Box(Box(6576, 6576), Box(6576, 6576)),
+  Box(Box(6577, 6577), Box(6577, 6577)),
+  Box(Box(6578, 6578), Box(6578, 6578)),
+  Box(Box(6579, 6579), Box(6579, 6579)),
+  Box(Box(6580, 6580), Box(6580, 6580)),
+  Box(Box(6581, 6581), Box(6581, 6581)),
+  Box(Box(6582, 6582), Box(6582, 6582)),
+  Box(Box(6583, 6583), Box(6583, 6583)),
+  Box(Box(6584, 6584), Box(6584, 6584)),
+  Box(Box(6585, 6585), Box(6585, 6585)),
+  Box(Box(6586, 6586), Box(6586, 6586)),
+  Box(Box(6587, 6587), Box(6587, 6587)),
+  Box(Box(6588, 6588), Box(6588, 6588)),
+  Box(Box(6589, 6589), Box(6589, 6589)),
+  Box(Box(6590, 6590), Box(6590, 6590)),
+  Box(Box(6591, 6591), Box(6591, 6591)),
+  Box(Box(6592, 6592), Box(6592, 6592)),
+  Box(Box(6593, 6593), Box(6593, 6593)),
+  Box(Box(6594, 6594), Box(6594, 6594)),
+  Box(Box(6595, 6595), Box(6595, 6595)),
+  Box(Box(6596, 6596), Box(6596, 6596)),
+  Box(Box(6597, 6597), Box(6597, 6597)),
+  Box(Box(6598, 6598), Box(6598, 6598)),
+  Box(Box(6599, 6599), Box(6599, 6599)),
+  Box(Box(6600, 6600), Box(6600, 6600)),
+  Box(Box(6601, 6601), Box(6601, 6601)),
+  Box(Box(6602, 6602), Box(6602, 6602)),
+  Box(Box(6603, 6603), Box(6603, 6603)),
+  Box(Box(6604, 6604), Box(6604, 6604)),
+  Box(Box(6605, 6605), Box(6605, 6605)),
+  Box(Box(6606, 6606), Box(6606, 6606)),
+  Box(Box(6607, 6607), Box(6607, 6607)),
+  Box(Box(6608, 6608), Box(6608, 6608)),
+  Box(Box(6609, 6609), Box(6609, 6609)),
+  Box(Box(6610, 6610), Box(6610, 6610)),
+  Box(Box(6611, 6611), Box(6611, 6611)),
+  Box(Box(6612, 6612), Box(6612, 6612)),
+  Box(Box(6613, 6613), Box(6613, 6613)),
+  Box(Box(6614, 6614), Box(6614, 6614)),
+  Box(Box(6615, 6615), Box(6615, 6615)),
+  Box(Box(6616, 6616), Box(6616, 6616)),
+  Box(Box(6617, 6617), Box(6617, 6617)),
+  Box(Box(6618, 6618), Box(6618, 6618)),
+  Box(Box(6619, 6619), Box(6619, 6619)),
+  Box(Box(6620, 6620), Box(6620, 6620)),
+  Box(Box(6621, 6621), Box(6621, 6621)),
+  Box(Box(6622, 6622), Box(6622, 6622)),
+  Box(Box(6623, 6623), Box(6623, 6623)),
+  Box(Box(6624, 6624), Box(6624, 6624)),
+  Box(Box(6625, 6625), Box(6625, 6625)),
+  Box(Box(6626, 6626), Box(6626, 6626)),
+  Box(Box(6627, 6627), Box(6627, 6627)),
+  Box(Box(6628, 6628), Box(6628, 6628)),
+  Box(Box(6629, 6629), Box(6629, 6629)),
+  Box(Box(6630, 6630), Box(6630, 6630)),
+  Box(Box(6631, 6631), Box(6631, 6631)),
+  Box(Box(6632, 6632), Box(6632, 6632)),
+  Box(Box(6633, 6633), Box(6633, 6633)),
+  Box(Box(6634, 6634), Box(6634, 6634)),
+  Box(Box(6635, 6635), Box(6635, 6635)),
+  Box(Box(6636, 6636), Box(6636, 6636)),
+  Box(Box(6637, 6637), Box(6637, 6637)),
+  Box(Box(6638, 6638), Box(6638, 6638)),
+  Box(Box(6639, 6639), Box(6639, 6639)),
+  Box(Box(6640, 6640), Box(6640, 6640)),
+  Box(Box(6641, 6641), Box(6641, 6641)),
+  Box(Box(6642, 6642), Box(6642, 6642)),
+  Box(Box(6643, 6643), Box(6643, 6643)),
+  Box(Box(6644, 6644), Box(6644, 6644)),
+  Box(Box(6645, 6645), Box(6645, 6645)),
+  Box(Box(6646, 6646), Box(6646, 6646)),
+  Box(Box(6647, 6647), Box(6647, 6647)),
+  Box(Box(6648, 6648), Box(6648, 6648)),
+  Box(Box(6649, 6649), Box(6649, 6649)),
+  Box(Box(6650, 6650), Box(6650, 6650)),
+  Box(Box(6651, 6651), Box(6651, 6651)),
+  Box(Box(6652, 6652), Box(6652, 6652)),
+  Box(Box(6653, 6653), Box(6653, 6653)),
+  Box(Box(6654, 6654), Box(6654, 6654)),
+  Box(Box(6655, 6655), Box(6655, 6655)),
+  Box(Box(6656, 6656), Box(6656, 6656)),
+  Box(Box(6657, 6657), Box(6657, 6657)),
+  Box(Box(6658, 6658), Box(6658, 6658)),
+  Box(Box(6659, 6659), Box(6659, 6659)),
+  Box(Box(6660, 6660), Box(6660, 6660)),
+  Box(Box(6661, 6661), Box(6661, 6661)),
+  Box(Box(6662, 6662), Box(6662, 6662)),
+  Box(Box(6663, 6663), Box(6663, 6663)),
+  Box(Box(6664, 6664), Box(6664, 6664)),
+  Box(Box(6665, 6665), Box(6665, 6665)),
+  Box(Box(6666, 6666), Box(6666, 6666)),
+  Box(Box(6667, 6667), Box(6667, 6667)),
+  Box(Box(6668, 6668), Box(6668, 6668)),
+  Box(Box(6669, 6669), Box(6669, 6669)),
+  Box(Box(6670, 6670), Box(6670, 6670)),
+  Box(Box(6671, 6671), Box(6671, 6671)),
+  Box(Box(6672, 6672), Box(6672, 6672)),
+  Box(Box(6673, 6673), Box(6673, 6673)),
+  Box(Box(6674, 6674), Box(6674, 6674)),
+  Box(Box(6675, 6675), Box(6675, 6675)),
+  Box(Box(6676, 6676), Box(6676, 6676)),
+  Box(Box(6677, 6677), Box(6677, 6677)),
+  Box(Box(6678, 6678), Box(6678, 6678)),
+  Box(Box(6679, 6679), Box(6679, 6679)),
+  Box(Box(6680, 6680), Box(6680, 6680)),
+  Box(Box(6681, 6681), Box(6681, 6681)),
+  Box(Box(6682, 6682), Box(6682, 6682)),
+  Box(Box(6683, 6683), Box(6683, 6683)),
+  Box(Box(6684, 6684), Box(6684, 6684)),
+  Box(Box(6685, 6685), Box(6685, 6685)),
+  Box(Box(6686, 6686), Box(6686, 6686)),
+  Box(Box(6687, 6687), Box(6687, 6687)),
+  Box(Box(6688, 6688), Box(6688, 6688)),
+  Box(Box(6689, 6689), Box(6689, 6689)),
+  Box(Box(6690, 6690), Box(6690, 6690)),
+  Box(Box(6691, 6691), Box(6691, 6691)),
+  Box(Box(6692, 6692), Box(6692, 6692)),
+  Box(Box(6693, 6693), Box(6693, 6693)),
+  Box(Box(6694, 6694), Box(6694, 6694)),
+  Box(Box(6695, 6695), Box(6695, 6695)),
+  Box(Box(6696, 6696), Box(6696, 6696)),
+  Box(Box(6697, 6697), Box(6697, 6697)),
+  Box(Box(6698, 6698), Box(6698, 6698)),
+  Box(Box(6699, 6699), Box(6699, 6699)),
+  Box(Box(6700, 6700), Box(6700, 6700)),
+  Box(Box(6701, 6701), Box(6701, 6701)),
+  Box(Box(6702, 6702), Box(6702, 6702)),
+  Box(Box(6703, 6703), Box(6703, 6703)),
+  Box(Box(6704, 6704), Box(6704, 6704)),
+  Box(Box(6705, 6705), Box(6705, 6705)),
+  Box(Box(6706, 6706), Box(6706, 6706)),
+  Box(Box(6707, 6707), Box(6707, 6707)),
+  Box(Box(6708, 6708), Box(6708, 6708)),
+  Box(Box(6709, 6709), Box(6709, 6709)),
+  Box(Box(6710, 6710), Box(6710, 6710)),
+  Box(Box(6711, 6711), Box(6711, 6711)),
+  Box(Box(6712, 6712), Box(6712, 6712)),
+  Box(Box(6713, 6713), Box(6713, 6713)),
+  Box(Box(6714, 6714), Box(6714, 6714)),
+  Box(Box(6715, 6715), Box(6715, 6715)),
+  Box(Box(6716, 6716), Box(6716, 6716)),
+  Box(Box(6717, 6717), Box(6717, 6717)),
+  Box(Box(6718, 6718), Box(6718, 6718)),
+  Box(Box(6719, 6719), Box(6719, 6719)),
+  Box(Box(6720, 6720), Box(6720, 6720)),
+  Box(Box(6721, 6721), Box(6721, 6721)),
+  Box(Box(6722, 6722), Box(6722, 6722)),
+  Box(Box(6723, 6723), Box(6723, 6723)),
+  Box(Box(6724, 6724), Box(6724, 6724)),
+  Box(Box(6725, 6725), Box(6725, 6725)),
+  Box(Box(6726, 6726), Box(6726, 6726)),
+  Box(Box(6727, 6727), Box(6727, 6727)),
+  Box(Box(6728, 6728), Box(6728, 6728)),
+  Box(Box(6729, 6729), Box(6729, 6729)),
+  Box(Box(6730, 6730), Box(6730, 6730)),
+  Box(Box(6731, 6731), Box(6731, 6731)),
+  Box(Box(6732, 6732), Box(6732, 6732)),
+  Box(Box(6733, 6733), Box(6733, 6733)),
+  Box(Box(6734, 6734), Box(6734, 6734)),
+  Box(Box(6735, 6735), Box(6735, 6735)),
+  Box(Box(6736, 6736), Box(6736, 6736)),
+  Box(Box(6737, 6737), Box(6737, 6737)),
+  Box(Box(6738, 6738), Box(6738, 6738)),
+  Box(Box(6739, 6739), Box(6739, 6739)),
+  Box(Box(6740, 6740), Box(6740, 6740)),
+  Box(Box(6741, 6741), Box(6741, 6741)),
+  Box(Box(6742, 6742), Box(6742, 6742)),
+  Box(Box(6743, 6743), Box(6743, 6743)),
+  Box(Box(6744, 6744), Box(6744, 6744)),
+  Box(Box(6745, 6745), Box(6745, 6745)),
+  Box(Box(6746, 6746), Box(6746, 6746)),
+  Box(Box(6747, 6747), Box(6747, 6747)),
+  Box(Box(6748, 6748), Box(6748, 6748)),
+  Box(Box(6749, 6749), Box(6749, 6749)),
+  Box(Box(6750, 6750), Box(6750, 6750)),
+  Box(Box(6751, 6751), Box(6751, 6751)),
+  Box(Box(6752, 6752), Box(6752, 6752)),
+  Box(Box(6753, 6753), Box(6753, 6753)),
+  Box(Box(6754, 6754), Box(6754, 6754)),
+  Box(Box(6755, 6755), Box(6755, 6755)),
+  Box(Box(6756, 6756), Box(6756, 6756)),
+  Box(Box(6757, 6757), Box(6757, 6757)),
+  Box(Box(6758, 6758), Box(6758, 6758)),
+  Box(Box(6759, 6759), Box(6759, 6759)),
+  Box(Box(6760, 6760), Box(6760, 6760)),
+  Box(Box(6761, 6761), Box(6761, 6761)),
+  Box(Box(6762, 6762), Box(6762, 6762)),
+  Box(Box(6763, 6763), Box(6763, 6763)),
+  Box(Box(6764, 6764), Box(6764, 6764)),
+  Box(Box(6765, 6765), Box(6765, 6765)),
+  Box(Box(6766, 6766), Box(6766, 6766)),
+  Box(Box(6767, 6767), Box(6767, 6767)),
+  Box(Box(6768, 6768), Box(6768, 6768)),
+  Box(Box(6769, 6769), Box(6769, 6769)),
+  Box(Box(6770, 6770), Box(6770, 6770)),
+  Box(Box(6771, 6771), Box(6771, 6771)),
+  Box(Box(6772, 6772), Box(6772, 6772)),
+  Box(Box(6773, 6773), Box(6773, 6773)),
+  Box(Box(6774, 6774), Box(6774, 6774)),
+  Box(Box(6775, 6775), Box(6775, 6775)),
+  Box(Box(6776, 6776), Box(6776, 6776)),
+  Box(Box(6777, 6777), Box(6777, 6777)),
+  Box(Box(6778, 6778), Box(6778, 6778)),
+  Box(Box(6779, 6779), Box(6779, 6779)),
+  Box(Box(6780, 6780), Box(6780, 6780)),
+  Box(Box(6781, 6781), Box(6781, 6781)),
+  Box(Box(6782, 6782), Box(6782, 6782)),
+  Box(Box(6783, 6783), Box(6783, 6783)),
+  Box(Box(6784, 6784), Box(6784, 6784)),
+  Box(Box(6785, 6785), Box(6785, 6785)),
+  Box(Box(6786, 6786), Box(6786, 6786)),
+  Box(Box(6787, 6787), Box(6787, 6787)),
+  Box(Box(6788, 6788), Box(6788, 6788)),
+  Box(Box(6789, 6789), Box(6789, 6789)),
+  Box(Box(6790, 6790), Box(6790, 6790)),
+  Box(Box(6791, 6791), Box(6791, 6791)),
+  Box(Box(6792, 6792), Box(6792, 6792)),
+  Box(Box(6793, 6793), Box(6793, 6793)),
+  Box(Box(6794, 6794), Box(6794, 6794)),
+  Box(Box(6795, 6795), Box(6795, 6795)),
+  Box(Box(6796, 6796), Box(6796, 6796)),
+  Box(Box(6797, 6797), Box(6797, 6797)),
+  Box(Box(6798, 6798), Box(6798, 6798)),
+  Box(Box(6799, 6799), Box(6799, 6799)),
+  Box(Box(6800, 6800), Box(6800, 6800)),
+  Box(Box(6801, 6801), Box(6801, 6801)),
+  Box(Box(6802, 6802), Box(6802, 6802)),
+  Box(Box(6803, 6803), Box(6803, 6803)),
+  Box(Box(6804, 6804), Box(6804, 6804)),
+  Box(Box(6805, 6805), Box(6805, 6805)),
+  Box(Box(6806, 6806), Box(6806, 6806)),
+  Box(Box(6807, 6807), Box(6807, 6807)),
+  Box(Box(6808, 6808), Box(6808, 6808)),
+  Box(Box(6809, 6809), Box(6809, 6809)),
+  Box(Box(6810, 6810), Box(6810, 6810)),
+  Box(Box(6811, 6811), Box(6811, 6811)),
+  Box(Box(6812, 6812), Box(6812, 6812)),
+  Box(Box(6813, 6813), Box(6813, 6813)),
+  Box(Box(6814, 6814), Box(6814, 6814)),
+  Box(Box(6815, 6815), Box(6815, 6815)),
+  Box(Box(6816, 6816), Box(6816, 6816)),
+  Box(Box(6817, 6817), Box(6817, 6817)),
+  Box(Box(6818, 6818), Box(6818, 6818)),
+  Box(Box(6819, 6819), Box(6819, 6819)),
+  Box(Box(6820, 6820), Box(6820, 6820)),
+  Box(Box(6821, 6821), Box(6821, 6821)),
+  Box(Box(6822, 6822), Box(6822, 6822)),
+  Box(Box(6823, 6823), Box(6823, 6823)),
+  Box(Box(6824, 6824), Box(6824, 6824)),
+  Box(Box(6825, 6825), Box(6825, 6825)),
+  Box(Box(6826, 6826), Box(6826, 6826)),
+  Box(Box(6827, 6827), Box(6827, 6827)),
+  Box(Box(6828, 6828), Box(6828, 6828)),
+  Box(Box(6829, 6829), Box(6829, 6829)),
+  Box(Box(6830, 6830), Box(6830, 6830)),
+  Box(Box(6831, 6831), Box(6831, 6831)),
+  Box(Box(6832, 6832), Box(6832, 6832)),
+  Box(Box(6833, 6833), Box(6833, 6833)),
+  Box(Box(6834, 6834), Box(6834, 6834)),
+  Box(Box(6835, 6835), Box(6835, 6835)),
+  Box(Box(6836, 6836), Box(6836, 6836)),
+  Box(Box(6837, 6837), Box(6837, 6837)),
+  Box(Box(6838, 6838), Box(6838, 6838)),
+  Box(Box(6839, 6839), Box(6839, 6839)),
+  Box(Box(6840, 6840), Box(6840, 6840)),
+  Box(Box(6841, 6841), Box(6841, 6841)),
+  Box(Box(6842, 6842), Box(6842, 6842)),
+  Box(Box(6843, 6843), Box(6843, 6843)),
+  Box(Box(6844, 6844), Box(6844, 6844)),
+  Box(Box(6845, 6845), Box(6845, 6845)),
+  Box(Box(6846, 6846), Box(6846, 6846)),
+  Box(Box(6847, 6847), Box(6847, 6847)),
+  Box(Box(6848, 6848), Box(6848, 6848)),
+  Box(Box(6849, 6849), Box(6849, 6849)),
+  Box(Box(6850, 6850), Box(6850, 6850)),
+  Box(Box(6851, 6851), Box(6851, 6851)),
+  Box(Box(6852, 6852), Box(6852, 6852)),
+  Box(Box(6853, 6853), Box(6853, 6853)),
+  Box(Box(6854, 6854), Box(6854, 6854)),
+  Box(Box(6855, 6855), Box(6855, 6855)),
+  Box(Box(6856, 6856), Box(6856, 6856)),
+  Box(Box(6857, 6857), Box(6857, 6857)),
+  Box(Box(6858, 6858), Box(6858, 6858)),
+  Box(Box(6859, 6859), Box(6859, 6859)),
+  Box(Box(6860, 6860), Box(6860, 6860)),
+  Box(Box(6861, 6861), Box(6861, 6861)),
+  Box(Box(6862, 6862), Box(6862, 6862)),
+  Box(Box(6863, 6863), Box(6863, 6863)),
+  Box(Box(6864, 6864), Box(6864, 6864)),
+  Box(Box(6865, 6865), Box(6865, 6865)),
+  Box(Box(6866, 6866), Box(6866, 6866)),
+  Box(Box(6867, 6867), Box(6867, 6867)),
+  Box(Box(6868, 6868), Box(6868, 6868)),
+  Box(Box(6869, 6869), Box(6869, 6869)),
+  Box(Box(6870, 6870), Box(6870, 6870)),
+  Box(Box(6871, 6871), Box(6871, 6871)),
+  Box(Box(6872, 6872), Box(6872, 6872)),
+  Box(Box(6873, 6873), Box(6873, 6873)),
+  Box(Box(6874, 6874), Box(6874, 6874)),
+  Box(Box(6875, 6875), Box(6875, 6875)),
+  Box(Box(6876, 6876), Box(6876, 6876)),
+  Box(Box(6877, 6877), Box(6877, 6877)),
+  Box(Box(6878, 6878), Box(6878, 6878)),
+  Box(Box(6879, 6879), Box(6879, 6879)),
+  Box(Box(6880, 6880), Box(6880, 6880)),
+  Box(Box(6881, 6881), Box(6881, 6881)),
+  Box(Box(6882, 6882), Box(6882, 6882)),
+  Box(Box(6883, 6883), Box(6883, 6883)),
+  Box(Box(6884, 6884), Box(6884, 6884)),
+  Box(Box(6885, 6885), Box(6885, 6885)),
+  Box(Box(6886, 6886), Box(6886, 6886)),
+  Box(Box(6887, 6887), Box(6887, 6887)),
+  Box(Box(6888, 6888), Box(6888, 6888)),
+  Box(Box(6889, 6889), Box(6889, 6889)),
+  Box(Box(6890, 6890), Box(6890, 6890)),
+  Box(Box(6891, 6891), Box(6891, 6891)),
+  Box(Box(6892, 6892), Box(6892, 6892)),
+  Box(Box(6893, 6893), Box(6893, 6893)),
+  Box(Box(6894, 6894), Box(6894, 6894)),
+  Box(Box(6895, 6895), Box(6895, 6895)),
+  Box(Box(6896, 6896), Box(6896, 6896)),
+  Box(Box(6897, 6897), Box(6897, 6897)),
+  Box(Box(6898, 6898), Box(6898, 6898)),
+  Box(Box(6899, 6899), Box(6899, 6899)),
+  Box(Box(6900, 6900), Box(6900, 6900)),
+  Box(Box(6901, 6901), Box(6901, 6901)),
+  Box(Box(6902, 6902), Box(6902, 6902)),
+  Box(Box(6903, 6903), Box(6903, 6903)),
+  Box(Box(6904, 6904), Box(6904, 6904)),
+  Box(Box(6905, 6905), Box(6905, 6905)),
+  Box(Box(6906, 6906), Box(6906, 6906)),
+  Box(Box(6907, 6907), Box(6907, 6907)),
+  Box(Box(6908, 6908), Box(6908, 6908)),
+  Box(Box(6909, 6909), Box(6909, 6909)),
+  Box(Box(6910, 6910), Box(6910, 6910)),
+  Box(Box(6911, 6911), Box(6911, 6911)),
+  Box(Box(6912, 6912), Box(6912, 6912)),
+  Box(Box(6913, 6913), Box(6913, 6913)),
+  Box(Box(6914, 6914), Box(6914, 6914)),
+  Box(Box(6915, 6915), Box(6915, 6915)),
+  Box(Box(6916, 6916), Box(6916, 6916)),
+  Box(Box(6917, 6917), Box(6917, 6917)),
+  Box(Box(6918, 6918), Box(6918, 6918)),
+  Box(Box(6919, 6919), Box(6919, 6919)),
+  Box(Box(6920, 6920), Box(6920, 6920)),
+  Box(Box(6921, 6921), Box(6921, 6921)),
+  Box(Box(6922, 6922), Box(6922, 6922)),
+  Box(Box(6923, 6923), Box(6923, 6923)),
+  Box(Box(6924, 6924), Box(6924, 6924)),
+  Box(Box(6925, 6925), Box(6925, 6925)),
+  Box(Box(6926, 6926), Box(6926, 6926)),
+  Box(Box(6927, 6927), Box(6927, 6927)),
+  Box(Box(6928, 6928), Box(6928, 6928)),
+  Box(Box(6929, 6929), Box(6929, 6929)),
+  Box(Box(6930, 6930), Box(6930, 6930)),
+  Box(Box(6931, 6931), Box(6931, 6931)),
+  Box(Box(6932, 6932), Box(6932, 6932)),
+  Box(Box(6933, 6933), Box(6933, 6933)),
+  Box(Box(6934, 6934), Box(6934, 6934)),
+  Box(Box(6935, 6935), Box(6935, 6935)),
+  Box(Box(6936, 6936), Box(6936, 6936)),
+  Box(Box(6937, 6937), Box(6937, 6937)),
+  Box(Box(6938, 6938), Box(6938, 6938)),
+  Box(Box(6939, 6939), Box(6939, 6939)),
+  Box(Box(6940, 6940), Box(6940, 6940)),
+  Box(Box(6941, 6941), Box(6941, 6941)),
+  Box(Box(6942, 6942), Box(6942, 6942)),
+  Box(Box(6943, 6943), Box(6943, 6943)),
+  Box(Box(6944, 6944), Box(6944, 6944)),
+  Box(Box(6945, 6945), Box(6945, 6945)),
+  Box(Box(6946, 6946), Box(6946, 6946)),
+  Box(Box(6947, 6947), Box(6947, 6947)),
+  Box(Box(6948, 6948), Box(6948, 6948)),
+  Box(Box(6949, 6949), Box(6949, 6949)),
+  Box(Box(6950, 6950), Box(6950, 6950)),
+  Box(Box(6951, 6951), Box(6951, 6951)),
+  Box(Box(6952, 6952), Box(6952, 6952)),
+  Box(Box(6953, 6953), Box(6953, 6953)),
+  Box(Box(6954, 6954), Box(6954, 6954)),
+  Box(Box(6955, 6955), Box(6955, 6955)),
+  Box(Box(6956, 6956), Box(6956, 6956)),
+  Box(Box(6957, 6957), Box(6957, 6957)),
+  Box(Box(6958, 6958), Box(6958, 6958)),
+  Box(Box(6959, 6959), Box(6959, 6959)),
+  Box(Box(6960, 6960), Box(6960, 6960)),
+  Box(Box(6961, 6961), Box(6961, 6961)),
+  Box(Box(6962, 6962), Box(6962, 6962)),
+  Box(Box(6963, 6963), Box(6963, 6963)),
+  Box(Box(6964, 6964), Box(6964, 6964)),
+  Box(Box(6965, 6965), Box(6965, 6965)),
+  Box(Box(6966, 6966), Box(6966, 6966)),
+  Box(Box(6967, 6967), Box(6967, 6967)),
+  Box(Box(6968, 6968), Box(6968, 6968)),
+  Box(Box(6969, 6969), Box(6969, 6969)),
+  Box(Box(6970, 6970), Box(6970, 6970)),
+  Box(Box(6971, 6971), Box(6971, 6971)),
+  Box(Box(6972, 6972), Box(6972, 6972)),
+  Box(Box(6973, 6973), Box(6973, 6973)),
+  Box(Box(6974, 6974), Box(6974, 6974)),
+  Box(Box(6975, 6975), Box(6975, 6975)),
+  Box(Box(6976, 6976), Box(6976, 6976)),
+  Box(Box(6977, 6977), Box(6977, 6977)),
+  Box(Box(6978, 6978), Box(6978, 6978)),
+  Box(Box(6979, 6979), Box(6979, 6979)),
+  Box(Box(6980, 6980), Box(6980, 6980)),
+  Box(Box(6981, 6981), Box(6981, 6981)),
+  Box(Box(6982, 6982), Box(6982, 6982)),
+  Box(Box(6983, 6983), Box(6983, 6983)),
+  Box(Box(6984, 6984), Box(6984, 6984)),
+  Box(Box(6985, 6985), Box(6985, 6985)),
+  Box(Box(6986, 6986), Box(6986, 6986)),
+  Box(Box(6987, 6987), Box(6987, 6987)),
+  Box(Box(6988, 6988), Box(6988, 6988)),
+  Box(Box(6989, 6989), Box(6989, 6989)),
+  Box(Box(6990, 6990), Box(6990, 6990)),
+  Box(Box(6991, 6991), Box(6991, 6991)),
+  Box(Box(6992, 6992), Box(6992, 6992)),
+  Box(Box(6993, 6993), Box(6993, 6993)),
+  Box(Box(6994, 6994), Box(6994, 6994)),
+  Box(Box(6995, 6995), Box(6995, 6995)),
+  Box(Box(6996, 6996), Box(6996, 6996)),
+  Box(Box(6997, 6997), Box(6997, 6997)),
+  Box(Box(6998, 6998), Box(6998, 6998)),
+  Box(Box(6999, 6999), Box(6999, 6999)),
+  Box(Box(7000, 7000), Box(7000, 7000)),
+  Box(Box(7001, 7001), Box(7001, 7001)),
+  Box(Box(7002, 7002), Box(7002, 7002)),
+  Box(Box(7003, 7003), Box(7003, 7003)),
+  Box(Box(7004, 7004), Box(7004, 7004)),
+  Box(Box(7005, 7005), Box(7005, 7005)),
+  Box(Box(7006, 7006), Box(7006, 7006)),
+  Box(Box(7007, 7007), Box(7007, 7007)),
+  Box(Box(7008, 7008), Box(7008, 7008)),
+  Box(Box(7009, 7009), Box(7009, 7009)),
+  Box(Box(7010, 7010), Box(7010, 7010)),
+  Box(Box(7011, 7011), Box(7011, 7011)),
+  Box(Box(7012, 7012), Box(7012, 7012)),
+  Box(Box(7013, 7013), Box(7013, 7013)),
+  Box(Box(7014, 7014), Box(7014, 7014)),
+  Box(Box(7015, 7015), Box(7015, 7015)),
+  Box(Box(7016, 7016), Box(7016, 7016)),
+  Box(Box(7017, 7017), Box(7017, 7017)),
+  Box(Box(7018, 7018), Box(7018, 7018)),
+  Box(Box(7019, 7019), Box(7019, 7019)),
+  Box(Box(7020, 7020), Box(7020, 7020)),
+  Box(Box(7021, 7021), Box(7021, 7021)),
+  Box(Box(7022, 7022), Box(7022, 7022)),
+  Box(Box(7023, 7023), Box(7023, 7023)),
+  Box(Box(7024, 7024), Box(7024, 7024)),
+  Box(Box(7025, 7025), Box(7025, 7025)),
+  Box(Box(7026, 7026), Box(7026, 7026)),
+  Box(Box(7027, 7027), Box(7027, 7027)),
+  Box(Box(7028, 7028), Box(7028, 7028)),
+  Box(Box(7029, 7029), Box(7029, 7029)),
+  Box(Box(7030, 7030), Box(7030, 7030)),
+  Box(Box(7031, 7031), Box(7031, 7031)),
+  Box(Box(7032, 7032), Box(7032, 7032)),
+  Box(Box(7033, 7033), Box(7033, 7033)),
+  Box(Box(7034, 7034), Box(7034, 7034)),
+  Box(Box(7035, 7035), Box(7035, 7035)),
+  Box(Box(7036, 7036), Box(7036, 7036)),
+  Box(Box(7037, 7037), Box(7037, 7037)),
+  Box(Box(7038, 7038), Box(7038, 7038)),
+  Box(Box(7039, 7039), Box(7039, 7039)),
+  Box(Box(7040, 7040), Box(7040, 7040)),
+  Box(Box(7041, 7041), Box(7041, 7041)),
+  Box(Box(7042, 7042), Box(7042, 7042)),
+  Box(Box(7043, 7043), Box(7043, 7043)),
+  Box(Box(7044, 7044), Box(7044, 7044)),
+  Box(Box(7045, 7045), Box(7045, 7045)),
+  Box(Box(7046, 7046), Box(7046, 7046)),
+  Box(Box(7047, 7047), Box(7047, 7047)),
+  Box(Box(7048, 7048), Box(7048, 7048)),
+  Box(Box(7049, 7049), Box(7049, 7049)),
+  Box(Box(7050, 7050), Box(7050, 7050)),
+  Box(Box(7051, 7051), Box(7051, 7051)),
+  Box(Box(7052, 7052), Box(7052, 7052)),
+  Box(Box(7053, 7053), Box(7053, 7053)),
+  Box(Box(7054, 7054), Box(7054, 7054)),
+  Box(Box(7055, 7055), Box(7055, 7055)),
+  Box(Box(7056, 7056), Box(7056, 7056)),
+  Box(Box(7057, 7057), Box(7057, 7057)),
+  Box(Box(7058, 7058), Box(7058, 7058)),
+  Box(Box(7059, 7059), Box(7059, 7059)),
+  Box(Box(7060, 7060), Box(7060, 7060)),
+  Box(Box(7061, 7061), Box(7061, 7061)),
+  Box(Box(7062, 7062), Box(7062, 7062)),
+  Box(Box(7063, 7063), Box(7063, 7063)),
+  Box(Box(7064, 7064), Box(7064, 7064)),
+  Box(Box(7065, 7065), Box(7065, 7065)),
+  Box(Box(7066, 7066), Box(7066, 7066)),
+  Box(Box(7067, 7067), Box(7067, 7067)),
+  Box(Box(7068, 7068), Box(7068, 7068)),
+  Box(Box(7069, 7069), Box(7069, 7069)),
+  Box(Box(7070, 7070), Box(7070, 7070)),
+  Box(Box(7071, 7071), Box(7071, 7071)),
+  Box(Box(7072, 7072), Box(7072, 7072)),
+  Box(Box(7073, 7073), Box(7073, 7073)),
+  Box(Box(7074, 7074), Box(7074, 7074)),
+  Box(Box(7075, 7075), Box(7075, 7075)),
+  Box(Box(7076, 7076), Box(7076, 7076)),
+  Box(Box(7077, 7077), Box(7077, 7077)),
+  Box(Box(7078, 7078), Box(7078, 7078)),
+  Box(Box(7079, 7079), Box(7079, 7079)),
+  Box(Box(7080, 7080), Box(7080, 7080)),
+  Box(Box(7081, 7081), Box(7081, 7081)),
+  Box(Box(7082, 7082), Box(7082, 7082)),
+  Box(Box(7083, 7083), Box(7083, 7083)),
+  Box(Box(7084, 7084), Box(7084, 7084)),
+  Box(Box(7085, 7085), Box(7085, 7085)),
+  Box(Box(7086, 7086), Box(7086, 7086)),
+  Box(Box(7087, 7087), Box(7087, 7087)),
+  Box(Box(7088, 7088), Box(7088, 7088)),
+  Box(Box(7089, 7089), Box(7089, 7089)),
+  Box(Box(7090, 7090), Box(7090, 7090)),
+  Box(Box(7091, 7091), Box(7091, 7091)),
+  Box(Box(7092, 7092), Box(7092, 7092)),
+  Box(Box(7093, 7093), Box(7093, 7093)),
+  Box(Box(7094, 7094), Box(7094, 7094)),
+  Box(Box(7095, 7095), Box(7095, 7095)),
+  Box(Box(7096, 7096), Box(7096, 7096)),
+  Box(Box(7097, 7097), Box(7097, 7097)),
+  Box(Box(7098, 7098), Box(7098, 7098)),
+  Box(Box(7099, 7099), Box(7099, 7099)),
+  Box(Box(7100, 7100), Box(7100, 7100)),
+  Box(Box(7101, 7101), Box(7101, 7101)),
+  Box(Box(7102, 7102), Box(7102, 7102)),
+  Box(Box(7103, 7103), Box(7103, 7103)),
+  Box(Box(7104, 7104), Box(7104, 7104)),
+  Box(Box(7105, 7105), Box(7105, 7105)),
+  Box(Box(7106, 7106), Box(7106, 7106)),
+  Box(Box(7107, 7107), Box(7107, 7107)),
+  Box(Box(7108, 7108), Box(7108, 7108)),
+  Box(Box(7109, 7109), Box(7109, 7109)),
+  Box(Box(7110, 7110), Box(7110, 7110)),
+  Box(Box(7111, 7111), Box(7111, 7111)),
+  Box(Box(7112, 7112), Box(7112, 7112)),
+  Box(Box(7113, 7113), Box(7113, 7113)),
+  Box(Box(7114, 7114), Box(7114, 7114)),
+  Box(Box(7115, 7115), Box(7115, 7115)),
+  Box(Box(7116, 7116), Box(7116, 7116)),
+  Box(Box(7117, 7117), Box(7117, 7117)),
+  Box(Box(7118, 7118), Box(7118, 7118)),
+  Box(Box(7119, 7119), Box(7119, 7119)),
+  Box(Box(7120, 7120), Box(7120, 7120)),
+  Box(Box(7121, 7121), Box(7121, 7121)),
+  Box(Box(7122, 7122), Box(7122, 7122)),
+  Box(Box(7123, 7123), Box(7123, 7123)),
+  Box(Box(7124, 7124), Box(7124, 7124)),
+  Box(Box(7125, 7125), Box(7125, 7125)),
+  Box(Box(7126, 7126), Box(7126, 7126)),
+  Box(Box(7127, 7127), Box(7127, 7127)),
+  Box(Box(7128, 7128), Box(7128, 7128)),
+  Box(Box(7129, 7129), Box(7129, 7129)),
+  Box(Box(7130, 7130), Box(7130, 7130)),
+  Box(Box(7131, 7131), Box(7131, 7131)),
+  Box(Box(7132, 7132), Box(7132, 7132)),
+  Box(Box(7133, 7133), Box(7133, 7133)),
+  Box(Box(7134, 7134), Box(7134, 7134)),
+  Box(Box(7135, 7135), Box(7135, 7135)),
+  Box(Box(7136, 7136), Box(7136, 7136)),
+  Box(Box(7137, 7137), Box(7137, 7137)),
+  Box(Box(7138, 7138), Box(7138, 7138)),
+  Box(Box(7139, 7139), Box(7139, 7139)),
+  Box(Box(7140, 7140), Box(7140, 7140)),
+  Box(Box(7141, 7141), Box(7141, 7141)),
+  Box(Box(7142, 7142), Box(7142, 7142)),
+  Box(Box(7143, 7143), Box(7143, 7143)),
+  Box(Box(7144, 7144), Box(7144, 7144)),
+  Box(Box(7145, 7145), Box(7145, 7145)),
+  Box(Box(7146, 7146), Box(7146, 7146)),
+  Box(Box(7147, 7147), Box(7147, 7147)),
+  Box(Box(7148, 7148), Box(7148, 7148)),
+  Box(Box(7149, 7149), Box(7149, 7149)),
+  Box(Box(7150, 7150), Box(7150, 7150)),
+  Box(Box(7151, 7151), Box(7151, 7151)),
+  Box(Box(7152, 7152), Box(7152, 7152)),
+  Box(Box(7153, 7153), Box(7153, 7153)),
+  Box(Box(7154, 7154), Box(7154, 7154)),
+  Box(Box(7155, 7155), Box(7155, 7155)),
+  Box(Box(7156, 7156), Box(7156, 7156)),
+  Box(Box(7157, 7157), Box(7157, 7157)),
+  Box(Box(7158, 7158), Box(7158, 7158)),
+  Box(Box(7159, 7159), Box(7159, 7159)),
+  Box(Box(7160, 7160), Box(7160, 7160)),
+  Box(Box(7161, 7161), Box(7161, 7161)),
+  Box(Box(7162, 7162), Box(7162, 7162)),
+  Box(Box(7163, 7163), Box(7163, 7163)),
+  Box(Box(7164, 7164), Box(7164, 7164)),
+  Box(Box(7165, 7165), Box(7165, 7165)),
+  Box(Box(7166, 7166), Box(7166, 7166)),
+  Box(Box(7167, 7167), Box(7167, 7167)),
+  Box(Box(7168, 7168), Box(7168, 7168)),
+  Box(Box(7169, 7169), Box(7169, 7169)),
+  Box(Box(7170, 7170), Box(7170, 7170)),
+  Box(Box(7171, 7171), Box(7171, 7171)),
+  Box(Box(7172, 7172), Box(7172, 7172)),
+  Box(Box(7173, 7173), Box(7173, 7173)),
+  Box(Box(7174, 7174), Box(7174, 7174)),
+  Box(Box(7175, 7175), Box(7175, 7175)),
+  Box(Box(7176, 7176), Box(7176, 7176)),
+  Box(Box(7177, 7177), Box(7177, 7177)),
+  Box(Box(7178, 7178), Box(7178, 7178)),
+  Box(Box(7179, 7179), Box(7179, 7179)),
+  Box(Box(7180, 7180), Box(7180, 7180)),
+  Box(Box(7181, 7181), Box(7181, 7181)),
+  Box(Box(7182, 7182), Box(7182, 7182)),
+  Box(Box(7183, 7183), Box(7183, 7183)),
+  Box(Box(7184, 7184), Box(7184, 7184)),
+  Box(Box(7185, 7185), Box(7185, 7185)),
+  Box(Box(7186, 7186), Box(7186, 7186)),
+  Box(Box(7187, 7187), Box(7187, 7187)),
+  Box(Box(7188, 7188), Box(7188, 7188)),
+  Box(Box(7189, 7189), Box(7189, 7189)),
+  Box(Box(7190, 7190), Box(7190, 7190)),
+  Box(Box(7191, 7191), Box(7191, 7191)),
+  Box(Box(7192, 7192), Box(7192, 7192)),
+  Box(Box(7193, 7193), Box(7193, 7193)),
+  Box(Box(7194, 7194), Box(7194, 7194)),
+  Box(Box(7195, 7195), Box(7195, 7195)),
+  Box(Box(7196, 7196), Box(7196, 7196)),
+  Box(Box(7197, 7197), Box(7197, 7197)),
+  Box(Box(7198, 7198), Box(7198, 7198)),
+  Box(Box(7199, 7199), Box(7199, 7199)),
+  Box(Box(7200, 7200), Box(7200, 7200)),
+  Box(Box(7201, 7201), Box(7201, 7201)),
+  Box(Box(7202, 7202), Box(7202, 7202)),
+  Box(Box(7203, 7203), Box(7203, 7203)),
+  Box(Box(7204, 7204), Box(7204, 7204)),
+  Box(Box(7205, 7205), Box(7205, 7205)),
+  Box(Box(7206, 7206), Box(7206, 7206)),
+  Box(Box(7207, 7207), Box(7207, 7207)),
+  Box(Box(7208, 7208), Box(7208, 7208)),
+  Box(Box(7209, 7209), Box(7209, 7209)),
+  Box(Box(7210, 7210), Box(7210, 7210)),
+  Box(Box(7211, 7211), Box(7211, 7211)),
+  Box(Box(7212, 7212), Box(7212, 7212)),
+  Box(Box(7213, 7213), Box(7213, 7213)),
+  Box(Box(7214, 7214), Box(7214, 7214)),
+  Box(Box(7215, 7215), Box(7215, 7215)),
+  Box(Box(7216, 7216), Box(7216, 7216)),
+  Box(Box(7217, 7217), Box(7217, 7217)),
+  Box(Box(7218, 7218), Box(7218, 7218)),
+  Box(Box(7219, 7219), Box(7219, 7219)),
+  Box(Box(7220, 7220), Box(7220, 7220)),
+  Box(Box(7221, 7221), Box(7221, 7221)),
+  Box(Box(7222, 7222), Box(7222, 7222)),
+  Box(Box(7223, 7223), Box(7223, 7223)),
+  Box(Box(7224, 7224), Box(7224, 7224)),
+  Box(Box(7225, 7225), Box(7225, 7225)),
+  Box(Box(7226, 7226), Box(7226, 7226)),
+  Box(Box(7227, 7227), Box(7227, 7227)),
+  Box(Box(7228, 7228), Box(7228, 7228)),
+  Box(Box(7229, 7229), Box(7229, 7229)),
+  Box(Box(7230, 7230), Box(7230, 7230)),
+  Box(Box(7231, 7231), Box(7231, 7231)),
+  Box(Box(7232, 7232), Box(7232, 7232)),
+  Box(Box(7233, 7233), Box(7233, 7233)),
+  Box(Box(7234, 7234), Box(7234, 7234)),
+  Box(Box(7235, 7235), Box(7235, 7235)),
+  Box(Box(7236, 7236), Box(7236, 7236)),
+  Box(Box(7237, 7237), Box(7237, 7237)),
+  Box(Box(7238, 7238), Box(7238, 7238)),
+  Box(Box(7239, 7239), Box(7239, 7239)),
+  Box(Box(7240, 7240), Box(7240, 7240)),
+  Box(Box(7241, 7241), Box(7241, 7241)),
+  Box(Box(7242, 7242), Box(7242, 7242)),
+  Box(Box(7243, 7243), Box(7243, 7243)),
+  Box(Box(7244, 7244), Box(7244, 7244)),
+  Box(Box(7245, 7245), Box(7245, 7245)),
+  Box(Box(7246, 7246), Box(7246, 7246)),
+  Box(Box(7247, 7247), Box(7247, 7247)),
+  Box(Box(7248, 7248), Box(7248, 7248)),
+  Box(Box(7249, 7249), Box(7249, 7249)),
+  Box(Box(7250, 7250), Box(7250, 7250)),
+  Box(Box(7251, 7251), Box(7251, 7251)),
+  Box(Box(7252, 7252), Box(7252, 7252)),
+  Box(Box(7253, 7253), Box(7253, 7253)),
+  Box(Box(7254, 7254), Box(7254, 7254)),
+  Box(Box(7255, 7255), Box(7255, 7255)),
+  Box(Box(7256, 7256), Box(7256, 7256)),
+  Box(Box(7257, 7257), Box(7257, 7257)),
+  Box(Box(7258, 7258), Box(7258, 7258)),
+  Box(Box(7259, 7259), Box(7259, 7259)),
+  Box(Box(7260, 7260), Box(7260, 7260)),
+  Box(Box(7261, 7261), Box(7261, 7261)),
+  Box(Box(7262, 7262), Box(7262, 7262)),
+  Box(Box(7263, 7263), Box(7263, 7263)),
+  Box(Box(7264, 7264), Box(7264, 7264)),
+  Box(Box(7265, 7265), Box(7265, 7265)),
+  Box(Box(7266, 7266), Box(7266, 7266)),
+  Box(Box(7267, 7267), Box(7267, 7267)),
+  Box(Box(7268, 7268), Box(7268, 7268)),
+  Box(Box(7269, 7269), Box(7269, 7269)),
+  Box(Box(7270, 7270), Box(7270, 7270)),
+  Box(Box(7271, 7271), Box(7271, 7271)),
+  Box(Box(7272, 7272), Box(7272, 7272)),
+  Box(Box(7273, 7273), Box(7273, 7273)),
+  Box(Box(7274, 7274), Box(7274, 7274)),
+  Box(Box(7275, 7275), Box(7275, 7275)),
+  Box(Box(7276, 7276), Box(7276, 7276)),
+  Box(Box(7277, 7277), Box(7277, 7277)),
+  Box(Box(7278, 7278), Box(7278, 7278)),
+  Box(Box(7279, 7279), Box(7279, 7279)),
+  Box(Box(7280, 7280), Box(7280, 7280)),
+  Box(Box(7281, 7281), Box(7281, 7281)),
+  Box(Box(7282, 7282), Box(7282, 7282)),
+  Box(Box(7283, 7283), Box(7283, 7283)),
+  Box(Box(7284, 7284), Box(7284, 7284)),
+  Box(Box(7285, 7285), Box(7285, 7285)),
+  Box(Box(7286, 7286), Box(7286, 7286)),
+  Box(Box(7287, 7287), Box(7287, 7287)),
+  Box(Box(7288, 7288), Box(7288, 7288)),
+  Box(Box(7289, 7289), Box(7289, 7289)),
+  Box(Box(7290, 7290), Box(7290, 7290)),
+  Box(Box(7291, 7291), Box(7291, 7291)),
+  Box(Box(7292, 7292), Box(7292, 7292)),
+  Box(Box(7293, 7293), Box(7293, 7293)),
+  Box(Box(7294, 7294), Box(7294, 7294)),
+  Box(Box(7295, 7295), Box(7295, 7295)),
+  Box(Box(7296, 7296), Box(7296, 7296)),
+  Box(Box(7297, 7297), Box(7297, 7297)),
+  Box(Box(7298, 7298), Box(7298, 7298)),
+  Box(Box(7299, 7299), Box(7299, 7299)),
+  Box(Box(7300, 7300), Box(7300, 7300)),
+  Box(Box(7301, 7301), Box(7301, 7301)),
+  Box(Box(7302, 7302), Box(7302, 7302)),
+  Box(Box(7303, 7303), Box(7303, 7303)),
+  Box(Box(7304, 7304), Box(7304, 7304)),
+  Box(Box(7305, 7305), Box(7305, 7305)),
+  Box(Box(7306, 7306), Box(7306, 7306)),
+  Box(Box(7307, 7307), Box(7307, 7307)),
+  Box(Box(7308, 7308), Box(7308, 7308)),
+  Box(Box(7309, 7309), Box(7309, 7309)),
+  Box(Box(7310, 7310), Box(7310, 7310)),
+  Box(Box(7311, 7311), Box(7311, 7311)),
+  Box(Box(7312, 7312), Box(7312, 7312)),
+  Box(Box(7313, 7313), Box(7313, 7313)),
+  Box(Box(7314, 7314), Box(7314, 7314)),
+  Box(Box(7315, 7315), Box(7315, 7315)),
+  Box(Box(7316, 7316), Box(7316, 7316)),
+  Box(Box(7317, 7317), Box(7317, 7317)),
+  Box(Box(7318, 7318), Box(7318, 7318)),
+  Box(Box(7319, 7319), Box(7319, 7319)),
+  Box(Box(7320, 7320), Box(7320, 7320)),
+  Box(Box(7321, 7321), Box(7321, 7321)),
+  Box(Box(7322, 7322), Box(7322, 7322)),
+  Box(Box(7323, 7323), Box(7323, 7323)),
+  Box(Box(7324, 7324), Box(7324, 7324)),
+  Box(Box(7325, 7325), Box(7325, 7325)),
+  Box(Box(7326, 7326), Box(7326, 7326)),
+  Box(Box(7327, 7327), Box(7327, 7327)),
+  Box(Box(7328, 7328), Box(7328, 7328)),
+  Box(Box(7329, 7329), Box(7329, 7329)),
+  Box(Box(7330, 7330), Box(7330, 7330)),
+  Box(Box(7331, 7331), Box(7331, 7331)),
+  Box(Box(7332, 7332), Box(7332, 7332)),
+  Box(Box(7333, 7333), Box(7333, 7333)),
+  Box(Box(7334, 7334), Box(7334, 7334)),
+  Box(Box(7335, 7335), Box(7335, 7335)),
+  Box(Box(7336, 7336), Box(7336, 7336)),
+  Box(Box(7337, 7337), Box(7337, 7337)),
+  Box(Box(7338, 7338), Box(7338, 7338)),
+  Box(Box(7339, 7339), Box(7339, 7339)),
+  Box(Box(7340, 7340), Box(7340, 7340)),
+  Box(Box(7341, 7341), Box(7341, 7341)),
+  Box(Box(7342, 7342), Box(7342, 7342)),
+  Box(Box(7343, 7343), Box(7343, 7343)),
+  Box(Box(7344, 7344), Box(7344, 7344)),
+  Box(Box(7345, 7345), Box(7345, 7345)),
+  Box(Box(7346, 7346), Box(7346, 7346)),
+  Box(Box(7347, 7347), Box(7347, 7347)),
+  Box(Box(7348, 7348), Box(7348, 7348)),
+  Box(Box(7349, 7349), Box(7349, 7349)),
+  Box(Box(7350, 7350), Box(7350, 7350)),
+  Box(Box(7351, 7351), Box(7351, 7351)),
+  Box(Box(7352, 7352), Box(7352, 7352)),
+  Box(Box(7353, 7353), Box(7353, 7353)),
+  Box(Box(7354, 7354), Box(7354, 7354)),
+  Box(Box(7355, 7355), Box(7355, 7355)),
+  Box(Box(7356, 7356), Box(7356, 7356)),
+  Box(Box(7357, 7357), Box(7357, 7357)),
+  Box(Box(7358, 7358), Box(7358, 7358)),
+  Box(Box(7359, 7359), Box(7359, 7359)),
+  Box(Box(7360, 7360), Box(7360, 7360)),
+  Box(Box(7361, 7361), Box(7361, 7361)),
+  Box(Box(7362, 7362), Box(7362, 7362)),
+  Box(Box(7363, 7363), Box(7363, 7363)),
+  Box(Box(7364, 7364), Box(7364, 7364)),
+  Box(Box(7365, 7365), Box(7365, 7365)),
+  Box(Box(7366, 7366), Box(7366, 7366)),
+  Box(Box(7367, 7367), Box(7367, 7367)),
+  Box(Box(7368, 7368), Box(7368, 7368)),
+  Box(Box(7369, 7369), Box(7369, 7369)),
+  Box(Box(7370, 7370), Box(7370, 7370)),
+  Box(Box(7371, 7371), Box(7371, 7371)),
+  Box(Box(7372, 7372), Box(7372, 7372)),
+  Box(Box(7373, 7373), Box(7373, 7373)),
+  Box(Box(7374, 7374), Box(7374, 7374)),
+  Box(Box(7375, 7375), Box(7375, 7375)),
+  Box(Box(7376, 7376), Box(7376, 7376)),
+  Box(Box(7377, 7377), Box(7377, 7377)),
+  Box(Box(7378, 7378), Box(7378, 7378)),
+  Box(Box(7379, 7379), Box(7379, 7379)),
+  Box(Box(7380, 7380), Box(7380, 7380)),
+  Box(Box(7381, 7381), Box(7381, 7381)),
+  Box(Box(7382, 7382), Box(7382, 7382)),
+  Box(Box(7383, 7383), Box(7383, 7383)),
+  Box(Box(7384, 7384), Box(7384, 7384)),
+  Box(Box(7385, 7385), Box(7385, 7385)),
+  Box(Box(7386, 7386), Box(7386, 7386)),
+  Box(Box(7387, 7387), Box(7387, 7387)),
+  Box(Box(7388, 7388), Box(7388, 7388)),
+  Box(Box(7389, 7389), Box(7389, 7389)),
+  Box(Box(7390, 7390), Box(7390, 7390)),
+  Box(Box(7391, 7391), Box(7391, 7391)),
+  Box(Box(7392, 7392), Box(7392, 7392)),
+  Box(Box(7393, 7393), Box(7393, 7393)),
+  Box(Box(7394, 7394), Box(7394, 7394)),
+  Box(Box(7395, 7395), Box(7395, 7395)),
+  Box(Box(7396, 7396), Box(7396, 7396)),
+  Box(Box(7397, 7397), Box(7397, 7397)),
+  Box(Box(7398, 7398), Box(7398, 7398)),
+  Box(Box(7399, 7399), Box(7399, 7399)),
+  Box(Box(7400, 7400), Box(7400, 7400)),
+  Box(Box(7401, 7401), Box(7401, 7401)),
+  Box(Box(7402, 7402), Box(7402, 7402)),
+  Box(Box(7403, 7403), Box(7403, 7403)),
+  Box(Box(7404, 7404), Box(7404, 7404)),
+  Box(Box(7405, 7405), Box(7405, 7405)),
+  Box(Box(7406, 7406), Box(7406, 7406)),
+  Box(Box(7407, 7407), Box(7407, 7407)),
+  Box(Box(7408, 7408), Box(7408, 7408)),
+  Box(Box(7409, 7409), Box(7409, 7409)),
+  Box(Box(7410, 7410), Box(7410, 7410)),
+  Box(Box(7411, 7411), Box(7411, 7411)),
+  Box(Box(7412, 7412), Box(7412, 7412)),
+  Box(Box(7413, 7413), Box(7413, 7413)),
+  Box(Box(7414, 7414), Box(7414, 7414)),
+  Box(Box(7415, 7415), Box(7415, 7415)),
+  Box(Box(7416, 7416), Box(7416, 7416)),
+  Box(Box(7417, 7417), Box(7417, 7417)),
+  Box(Box(7418, 7418), Box(7418, 7418)),
+  Box(Box(7419, 7419), Box(7419, 7419)),
+  Box(Box(7420, 7420), Box(7420, 7420)),
+  Box(Box(7421, 7421), Box(7421, 7421)),
+  Box(Box(7422, 7422), Box(7422, 7422)),
+  Box(Box(7423, 7423), Box(7423, 7423)),
+  Box(Box(7424, 7424), Box(7424, 7424)),
+  Box(Box(7425, 7425), Box(7425, 7425)),
+  Box(Box(7426, 7426), Box(7426, 7426)),
+  Box(Box(7427, 7427), Box(7427, 7427)),
+  Box(Box(7428, 7428), Box(7428, 7428)),
+  Box(Box(7429, 7429), Box(7429, 7429)),
+  Box(Box(7430, 7430), Box(7430, 7430)),
+  Box(Box(7431, 7431), Box(7431, 7431)),
+  Box(Box(7432, 7432), Box(7432, 7432)),
+  Box(Box(7433, 7433), Box(7433, 7433)),
+  Box(Box(7434, 7434), Box(7434, 7434)),
+  Box(Box(7435, 7435), Box(7435, 7435)),
+  Box(Box(7436, 7436), Box(7436, 7436)),
+  Box(Box(7437, 7437), Box(7437, 7437)),
+  Box(Box(7438, 7438), Box(7438, 7438)),
+  Box(Box(7439, 7439), Box(7439, 7439)),
+  Box(Box(7440, 7440), Box(7440, 7440)),
+  Box(Box(7441, 7441), Box(7441, 7441)),
+  Box(Box(7442, 7442), Box(7442, 7442)),
+  Box(Box(7443, 7443), Box(7443, 7443)),
+  Box(Box(7444, 7444), Box(7444, 7444)),
+  Box(Box(7445, 7445), Box(7445, 7445)),
+  Box(Box(7446, 7446), Box(7446, 7446)),
+  Box(Box(7447, 7447), Box(7447, 7447)),
+  Box(Box(7448, 7448), Box(7448, 7448)),
+  Box(Box(7449, 7449), Box(7449, 7449)),
+  Box(Box(7450, 7450), Box(7450, 7450)),
+  Box(Box(7451, 7451), Box(7451, 7451)),
+  Box(Box(7452, 7452), Box(7452, 7452)),
+  Box(Box(7453, 7453), Box(7453, 7453)),
+  Box(Box(7454, 7454), Box(7454, 7454)),
+  Box(Box(7455, 7455), Box(7455, 7455)),
+  Box(Box(7456, 7456), Box(7456, 7456)),
+  Box(Box(7457, 7457), Box(7457, 7457)),
+  Box(Box(7458, 7458), Box(7458, 7458)),
+  Box(Box(7459, 7459), Box(7459, 7459)),
+  Box(Box(7460, 7460), Box(7460, 7460)),
+  Box(Box(7461, 7461), Box(7461, 7461)),
+  Box(Box(7462, 7462), Box(7462, 7462)),
+  Box(Box(7463, 7463), Box(7463, 7463)),
+  Box(Box(7464, 7464), Box(7464, 7464)),
+  Box(Box(7465, 7465), Box(7465, 7465)),
+  Box(Box(7466, 7466), Box(7466, 7466)),
+  Box(Box(7467, 7467), Box(7467, 7467)),
+  Box(Box(7468, 7468), Box(7468, 7468)),
+  Box(Box(7469, 7469), Box(7469, 7469)),
+  Box(Box(7470, 7470), Box(7470, 7470)),
+  Box(Box(7471, 7471), Box(7471, 7471)),
+  Box(Box(7472, 7472), Box(7472, 7472)),
+  Box(Box(7473, 7473), Box(7473, 7473)),
+  Box(Box(7474, 7474), Box(7474, 7474)),
+  Box(Box(7475, 7475), Box(7475, 7475)),
+  Box(Box(7476, 7476), Box(7476, 7476)),
+  Box(Box(7477, 7477), Box(7477, 7477)),
+  Box(Box(7478, 7478), Box(7478, 7478)),
+  Box(Box(7479, 7479), Box(7479, 7479)),
+  Box(Box(7480, 7480), Box(7480, 7480)),
+  Box(Box(7481, 7481), Box(7481, 7481)),
+  Box(Box(7482, 7482), Box(7482, 7482)),
+  Box(Box(7483, 7483), Box(7483, 7483)),
+  Box(Box(7484, 7484), Box(7484, 7484)),
+  Box(Box(7485, 7485), Box(7485, 7485)),
+  Box(Box(7486, 7486), Box(7486, 7486)),
+  Box(Box(7487, 7487), Box(7487, 7487)),
+  Box(Box(7488, 7488), Box(7488, 7488)),
+  Box(Box(7489, 7489), Box(7489, 7489)),
+  Box(Box(7490, 7490), Box(7490, 7490)),
+  Box(Box(7491, 7491), Box(7491, 7491)),
+  Box(Box(7492, 7492), Box(7492, 7492)),
+  Box(Box(7493, 7493), Box(7493, 7493)),
+  Box(Box(7494, 7494), Box(7494, 7494)),
+  Box(Box(7495, 7495), Box(7495, 7495)),
+  Box(Box(7496, 7496), Box(7496, 7496)),
+  Box(Box(7497, 7497), Box(7497, 7497)),
+  Box(Box(7498, 7498), Box(7498, 7498)),
+  Box(Box(7499, 7499), Box(7499, 7499)),
+  Box(Box(7500, 7500), Box(7500, 7500)),
+  Box(Box(7501, 7501), Box(7501, 7501)),
+  Box(Box(7502, 7502), Box(7502, 7502)),
+  Box(Box(7503, 7503), Box(7503, 7503)),
+  Box(Box(7504, 7504), Box(7504, 7504)),
+  Box(Box(7505, 7505), Box(7505, 7505)),
+  Box(Box(7506, 7506), Box(7506, 7506)),
+  Box(Box(7507, 7507), Box(7507, 7507)),
+  Box(Box(7508, 7508), Box(7508, 7508)),
+  Box(Box(7509, 7509), Box(7509, 7509)),
+  Box(Box(7510, 7510), Box(7510, 7510)),
+  Box(Box(7511, 7511), Box(7511, 7511)),
+  Box(Box(7512, 7512), Box(7512, 7512)),
+  Box(Box(7513, 7513), Box(7513, 7513)),
+  Box(Box(7514, 7514), Box(7514, 7514)),
+  Box(Box(7515, 7515), Box(7515, 7515)),
+  Box(Box(7516, 7516), Box(7516, 7516)),
+  Box(Box(7517, 7517), Box(7517, 7517)),
+  Box(Box(7518, 7518), Box(7518, 7518)),
+  Box(Box(7519, 7519), Box(7519, 7519)),
+  Box(Box(7520, 7520), Box(7520, 7520)),
+  Box(Box(7521, 7521), Box(7521, 7521)),
+  Box(Box(7522, 7522), Box(7522, 7522)),
+  Box(Box(7523, 7523), Box(7523, 7523)),
+  Box(Box(7524, 7524), Box(7524, 7524)),
+  Box(Box(7525, 7525), Box(7525, 7525)),
+  Box(Box(7526, 7526), Box(7526, 7526)),
+  Box(Box(7527, 7527), Box(7527, 7527)),
+  Box(Box(7528, 7528), Box(7528, 7528)),
+  Box(Box(7529, 7529), Box(7529, 7529)),
+  Box(Box(7530, 7530), Box(7530, 7530)),
+  Box(Box(7531, 7531), Box(7531, 7531)),
+  Box(Box(7532, 7532), Box(7532, 7532)),
+  Box(Box(7533, 7533), Box(7533, 7533)),
+  Box(Box(7534, 7534), Box(7534, 7534)),
+  Box(Box(7535, 7535), Box(7535, 7535)),
+  Box(Box(7536, 7536), Box(7536, 7536)),
+  Box(Box(7537, 7537), Box(7537, 7537)),
+  Box(Box(7538, 7538), Box(7538, 7538)),
+  Box(Box(7539, 7539), Box(7539, 7539)),
+  Box(Box(7540, 7540), Box(7540, 7540)),
+  Box(Box(7541, 7541), Box(7541, 7541)),
+  Box(Box(7542, 7542), Box(7542, 7542)),
+  Box(Box(7543, 7543), Box(7543, 7543)),
+  Box(Box(7544, 7544), Box(7544, 7544)),
+  Box(Box(7545, 7545), Box(7545, 7545)),
+  Box(Box(7546, 7546), Box(7546, 7546)),
+  Box(Box(7547, 7547), Box(7547, 7547)),
+  Box(Box(7548, 7548), Box(7548, 7548)),
+  Box(Box(7549, 7549), Box(7549, 7549)),
+  Box(Box(7550, 7550), Box(7550, 7550)),
+  Box(Box(7551, 7551), Box(7551, 7551)),
+  Box(Box(7552, 7552), Box(7552, 7552)),
+  Box(Box(7553, 7553), Box(7553, 7553)),
+  Box(Box(7554, 7554), Box(7554, 7554)),
+  Box(Box(7555, 7555), Box(7555, 7555)),
+  Box(Box(7556, 7556), Box(7556, 7556)),
+  Box(Box(7557, 7557), Box(7557, 7557)),
+  Box(Box(7558, 7558), Box(7558, 7558)),
+  Box(Box(7559, 7559), Box(7559, 7559)),
+  Box(Box(7560, 7560), Box(7560, 7560)),
+  Box(Box(7561, 7561), Box(7561, 7561)),
+  Box(Box(7562, 7562), Box(7562, 7562)),
+  Box(Box(7563, 7563), Box(7563, 7563)),
+  Box(Box(7564, 7564), Box(7564, 7564)),
+  Box(Box(7565, 7565), Box(7565, 7565)),
+  Box(Box(7566, 7566), Box(7566, 7566)),
+  Box(Box(7567, 7567), Box(7567, 7567)),
+  Box(Box(7568, 7568), Box(7568, 7568)),
+  Box(Box(7569, 7569), Box(7569, 7569)),
+  Box(Box(7570, 7570), Box(7570, 7570)),
+  Box(Box(7571, 7571), Box(7571, 7571)),
+  Box(Box(7572, 7572), Box(7572, 7572)),
+  Box(Box(7573, 7573), Box(7573, 7573)),
+  Box(Box(7574, 7574), Box(7574, 7574)),
+  Box(Box(7575, 7575), Box(7575, 7575)),
+  Box(Box(7576, 7576), Box(7576, 7576)),
+  Box(Box(7577, 7577), Box(7577, 7577)),
+  Box(Box(7578, 7578), Box(7578, 7578)),
+  Box(Box(7579, 7579), Box(7579, 7579)),
+  Box(Box(7580, 7580), Box(7580, 7580)),
+  Box(Box(7581, 7581), Box(7581, 7581)),
+  Box(Box(7582, 7582), Box(7582, 7582)),
+  Box(Box(7583, 7583), Box(7583, 7583)),
+  Box(Box(7584, 7584), Box(7584, 7584)),
+  Box(Box(7585, 7585), Box(7585, 7585)),
+  Box(Box(7586, 7586), Box(7586, 7586)),
+  Box(Box(7587, 7587), Box(7587, 7587)),
+  Box(Box(7588, 7588), Box(7588, 7588)),
+  Box(Box(7589, 7589), Box(7589, 7589)),
+  Box(Box(7590, 7590), Box(7590, 7590)),
+  Box(Box(7591, 7591), Box(7591, 7591)),
+  Box(Box(7592, 7592), Box(7592, 7592)),
+  Box(Box(7593, 7593), Box(7593, 7593)),
+  Box(Box(7594, 7594), Box(7594, 7594)),
+  Box(Box(7595, 7595), Box(7595, 7595)),
+  Box(Box(7596, 7596), Box(7596, 7596)),
+  Box(Box(7597, 7597), Box(7597, 7597)),
+  Box(Box(7598, 7598), Box(7598, 7598)),
+  Box(Box(7599, 7599), Box(7599, 7599)),
+  Box(Box(7600, 7600), Box(7600, 7600)),
+  Box(Box(7601, 7601), Box(7601, 7601)),
+  Box(Box(7602, 7602), Box(7602, 7602)),
+  Box(Box(7603, 7603), Box(7603, 7603)),
+  Box(Box(7604, 7604), Box(7604, 7604)),
+  Box(Box(7605, 7605), Box(7605, 7605)),
+  Box(Box(7606, 7606), Box(7606, 7606)),
+  Box(Box(7607, 7607), Box(7607, 7607)),
+  Box(Box(7608, 7608), Box(7608, 7608)),
+  Box(Box(7609, 7609), Box(7609, 7609)),
+  Box(Box(7610, 7610), Box(7610, 7610)),
+  Box(Box(7611, 7611), Box(7611, 7611)),
+  Box(Box(7612, 7612), Box(7612, 7612)),
+  Box(Box(7613, 7613), Box(7613, 7613)),
+  Box(Box(7614, 7614), Box(7614, 7614)),
+  Box(Box(7615, 7615), Box(7615, 7615)),
+  Box(Box(7616, 7616), Box(7616, 7616)),
+  Box(Box(7617, 7617), Box(7617, 7617)),
+  Box(Box(7618, 7618), Box(7618, 7618)),
+  Box(Box(7619, 7619), Box(7619, 7619)),
+  Box(Box(7620, 7620), Box(7620, 7620)),
+  Box(Box(7621, 7621), Box(7621, 7621)),
+  Box(Box(7622, 7622), Box(7622, 7622)),
+  Box(Box(7623, 7623), Box(7623, 7623)),
+  Box(Box(7624, 7624), Box(7624, 7624)),
+  Box(Box(7625, 7625), Box(7625, 7625)),
+  Box(Box(7626, 7626), Box(7626, 7626)),
+  Box(Box(7627, 7627), Box(7627, 7627)),
+  Box(Box(7628, 7628), Box(7628, 7628)),
+  Box(Box(7629, 7629), Box(7629, 7629)),
+  Box(Box(7630, 7630), Box(7630, 7630)),
+  Box(Box(7631, 7631), Box(7631, 7631)),
+  Box(Box(7632, 7632), Box(7632, 7632)),
+  Box(Box(7633, 7633), Box(7633, 7633)),
+  Box(Box(7634, 7634), Box(7634, 7634)),
+  Box(Box(7635, 7635), Box(7635, 7635)),
+  Box(Box(7636, 7636), Box(7636, 7636)),
+  Box(Box(7637, 7637), Box(7637, 7637)),
+  Box(Box(7638, 7638), Box(7638, 7638)),
+  Box(Box(7639, 7639), Box(7639, 7639)),
+  Box(Box(7640, 7640), Box(7640, 7640)),
+  Box(Box(7641, 7641), Box(7641, 7641)),
+  Box(Box(7642, 7642), Box(7642, 7642)),
+  Box(Box(7643, 7643), Box(7643, 7643)),
+  Box(Box(7644, 7644), Box(7644, 7644)),
+  Box(Box(7645, 7645), Box(7645, 7645)),
+  Box(Box(7646, 7646), Box(7646, 7646)),
+  Box(Box(7647, 7647), Box(7647, 7647)),
+  Box(Box(7648, 7648), Box(7648, 7648)),
+  Box(Box(7649, 7649), Box(7649, 7649)),
+  Box(Box(7650, 7650), Box(7650, 7650)),
+  Box(Box(7651, 7651), Box(7651, 7651)),
+  Box(Box(7652, 7652), Box(7652, 7652)),
+  Box(Box(7653, 7653), Box(7653, 7653)),
+  Box(Box(7654, 7654), Box(7654, 7654)),
+  Box(Box(7655, 7655), Box(7655, 7655)),
+  Box(Box(7656, 7656), Box(7656, 7656)),
+  Box(Box(7657, 7657), Box(7657, 7657)),
+  Box(Box(7658, 7658), Box(7658, 7658)),
+  Box(Box(7659, 7659), Box(7659, 7659)),
+  Box(Box(7660, 7660), Box(7660, 7660)),
+  Box(Box(7661, 7661), Box(7661, 7661)),
+  Box(Box(7662, 7662), Box(7662, 7662)),
+  Box(Box(7663, 7663), Box(7663, 7663)),
+  Box(Box(7664, 7664), Box(7664, 7664)),
+  Box(Box(7665, 7665), Box(7665, 7665)),
+  Box(Box(7666, 7666), Box(7666, 7666)),
+  Box(Box(7667, 7667), Box(7667, 7667)),
+  Box(Box(7668, 7668), Box(7668, 7668)),
+  Box(Box(7669, 7669), Box(7669, 7669)),
+  Box(Box(7670, 7670), Box(7670, 7670)),
+  Box(Box(7671, 7671), Box(7671, 7671)),
+  Box(Box(7672, 7672), Box(7672, 7672)),
+  Box(Box(7673, 7673), Box(7673, 7673)),
+  Box(Box(7674, 7674), Box(7674, 7674)),
+  Box(Box(7675, 7675), Box(7675, 7675)),
+  Box(Box(7676, 7676), Box(7676, 7676)),
+  Box(Box(7677, 7677), Box(7677, 7677)),
+  Box(Box(7678, 7678), Box(7678, 7678)),
+  Box(Box(7679, 7679), Box(7679, 7679)),
+  Box(Box(7680, 7680), Box(7680, 7680)),
+  Box(Box(7681, 7681), Box(7681, 7681)),
+  Box(Box(7682, 7682), Box(7682, 7682)),
+  Box(Box(7683, 7683), Box(7683, 7683)),
+  Box(Box(7684, 7684), Box(7684, 7684)),
+  Box(Box(7685, 7685), Box(7685, 7685)),
+  Box(Box(7686, 7686), Box(7686, 7686)),
+  Box(Box(7687, 7687), Box(7687, 7687)),
+  Box(Box(7688, 7688), Box(7688, 7688)),
+  Box(Box(7689, 7689), Box(7689, 7689)),
+  Box(Box(7690, 7690), Box(7690, 7690)),
+  Box(Box(7691, 7691), Box(7691, 7691)),
+  Box(Box(7692, 7692), Box(7692, 7692)),
+  Box(Box(7693, 7693), Box(7693, 7693)),
+  Box(Box(7694, 7694), Box(7694, 7694)),
+  Box(Box(7695, 7695), Box(7695, 7695)),
+  Box(Box(7696, 7696), Box(7696, 7696)),
+  Box(Box(7697, 7697), Box(7697, 7697)),
+  Box(Box(7698, 7698), Box(7698, 7698)),
+  Box(Box(7699, 7699), Box(7699, 7699)),
+  Box(Box(7700, 7700), Box(7700, 7700)),
+  Box(Box(7701, 7701), Box(7701, 7701)),
+  Box(Box(7702, 7702), Box(7702, 7702)),
+  Box(Box(7703, 7703), Box(7703, 7703)),
+  Box(Box(7704, 7704), Box(7704, 7704)),
+  Box(Box(7705, 7705), Box(7705, 7705)),
+  Box(Box(7706, 7706), Box(7706, 7706)),
+  Box(Box(7707, 7707), Box(7707, 7707)),
+  Box(Box(7708, 7708), Box(7708, 7708)),
+  Box(Box(7709, 7709), Box(7709, 7709)),
+  Box(Box(7710, 7710), Box(7710, 7710)),
+  Box(Box(7711, 7711), Box(7711, 7711)),
+  Box(Box(7712, 7712), Box(7712, 7712)),
+  Box(Box(7713, 7713), Box(7713, 7713)),
+  Box(Box(7714, 7714), Box(7714, 7714)),
+  Box(Box(7715, 7715), Box(7715, 7715)),
+  Box(Box(7716, 7716), Box(7716, 7716)),
+  Box(Box(7717, 7717), Box(7717, 7717)),
+  Box(Box(7718, 7718), Box(7718, 7718)),
+  Box(Box(7719, 7719), Box(7719, 7719)),
+  Box(Box(7720, 7720), Box(7720, 7720)),
+  Box(Box(7721, 7721), Box(7721, 7721)),
+  Box(Box(7722, 7722), Box(7722, 7722)),
+  Box(Box(7723, 7723), Box(7723, 7723)),
+  Box(Box(7724, 7724), Box(7724, 7724)),
+  Box(Box(7725, 7725), Box(7725, 7725)),
+  Box(Box(7726, 7726), Box(7726, 7726)),
+  Box(Box(7727, 7727), Box(7727, 7727)),
+  Box(Box(7728, 7728), Box(7728, 7728)),
+  Box(Box(7729, 7729), Box(7729, 7729)),
+  Box(Box(7730, 7730), Box(7730, 7730)),
+  Box(Box(7731, 7731), Box(7731, 7731)),
+  Box(Box(7732, 7732), Box(7732, 7732)),
+  Box(Box(7733, 7733), Box(7733, 7733)),
+  Box(Box(7734, 7734), Box(7734, 7734)),
+  Box(Box(7735, 7735), Box(7735, 7735)),
+  Box(Box(7736, 7736), Box(7736, 7736)),
+  Box(Box(7737, 7737), Box(7737, 7737)),
+  Box(Box(7738, 7738), Box(7738, 7738)),
+  Box(Box(7739, 7739), Box(7739, 7739)),
+  Box(Box(7740, 7740), Box(7740, 7740)),
+  Box(Box(7741, 7741), Box(7741, 7741)),
+  Box(Box(7742, 7742), Box(7742, 7742)),
+  Box(Box(7743, 7743), Box(7743, 7743)),
+  Box(Box(7744, 7744), Box(7744, 7744)),
+  Box(Box(7745, 7745), Box(7745, 7745)),
+  Box(Box(7746, 7746), Box(7746, 7746)),
+  Box(Box(7747, 7747), Box(7747, 7747)),
+  Box(Box(7748, 7748), Box(7748, 7748)),
+  Box(Box(7749, 7749), Box(7749, 7749)),
+  Box(Box(7750, 7750), Box(7750, 7750)),
+  Box(Box(7751, 7751), Box(7751, 7751)),
+  Box(Box(7752, 7752), Box(7752, 7752)),
+  Box(Box(7753, 7753), Box(7753, 7753)),
+  Box(Box(7754, 7754), Box(7754, 7754)),
+  Box(Box(7755, 7755), Box(7755, 7755)),
+  Box(Box(7756, 7756), Box(7756, 7756)),
+  Box(Box(7757, 7757), Box(7757, 7757)),
+  Box(Box(7758, 7758), Box(7758, 7758)),
+  Box(Box(7759, 7759), Box(7759, 7759)),
+  Box(Box(7760, 7760), Box(7760, 7760)),
+  Box(Box(7761, 7761), Box(7761, 7761)),
+  Box(Box(7762, 7762), Box(7762, 7762)),
+  Box(Box(7763, 7763), Box(7763, 7763)),
+  Box(Box(7764, 7764), Box(7764, 7764)),
+  Box(Box(7765, 7765), Box(7765, 7765)),
+  Box(Box(7766, 7766), Box(7766, 7766)),
+  Box(Box(7767, 7767), Box(7767, 7767)),
+  Box(Box(7768, 7768), Box(7768, 7768)),
+  Box(Box(7769, 7769), Box(7769, 7769)),
+  Box(Box(7770, 7770), Box(7770, 7770)),
+  Box(Box(7771, 7771), Box(7771, 7771)),
+  Box(Box(7772, 7772), Box(7772, 7772)),
+  Box(Box(7773, 7773), Box(7773, 7773)),
+  Box(Box(7774, 7774), Box(7774, 7774)),
+  Box(Box(7775, 7775), Box(7775, 7775)),
+  Box(Box(7776, 7776), Box(7776, 7776)),
+  Box(Box(7777, 7777), Box(7777, 7777)),
+  Box(Box(7778, 7778), Box(7778, 7778)),
+  Box(Box(7779, 7779), Box(7779, 7779)),
+  Box(Box(7780, 7780), Box(7780, 7780)),
+  Box(Box(7781, 7781), Box(7781, 7781)),
+  Box(Box(7782, 7782), Box(7782, 7782)),
+  Box(Box(7783, 7783), Box(7783, 7783)),
+  Box(Box(7784, 7784), Box(7784, 7784)),
+  Box(Box(7785, 7785), Box(7785, 7785)),
+  Box(Box(7786, 7786), Box(7786, 7786)),
+  Box(Box(7787, 7787), Box(7787, 7787)),
+  Box(Box(7788, 7788), Box(7788, 7788)),
+  Box(Box(7789, 7789), Box(7789, 7789)),
+  Box(Box(7790, 7790), Box(7790, 7790)),
+  Box(Box(7791, 7791), Box(7791, 7791)),
+  Box(Box(7792, 7792), Box(7792, 7792)),
+  Box(Box(7793, 7793), Box(7793, 7793)),
+  Box(Box(7794, 7794), Box(7794, 7794)),
+  Box(Box(7795, 7795), Box(7795, 7795)),
+  Box(Box(7796, 7796), Box(7796, 7796)),
+  Box(Box(7797, 7797), Box(7797, 7797)),
+  Box(Box(7798, 7798), Box(7798, 7798)),
+  Box(Box(7799, 7799), Box(7799, 7799)),
+  Box(Box(7800, 7800), Box(7800, 7800)),
+  Box(Box(7801, 7801), Box(7801, 7801)),
+  Box(Box(7802, 7802), Box(7802, 7802)),
+  Box(Box(7803, 7803), Box(7803, 7803)),
+  Box(Box(7804, 7804), Box(7804, 7804)),
+  Box(Box(7805, 7805), Box(7805, 7805)),
+  Box(Box(7806, 7806), Box(7806, 7806)),
+  Box(Box(7807, 7807), Box(7807, 7807)),
+  Box(Box(7808, 7808), Box(7808, 7808)),
+  Box(Box(7809, 7809), Box(7809, 7809)),
+  Box(Box(7810, 7810), Box(7810, 7810)),
+  Box(Box(7811, 7811), Box(7811, 7811)),
+  Box(Box(7812, 7812), Box(7812, 7812)),
+  Box(Box(7813, 7813), Box(7813, 7813)),
+  Box(Box(7814, 7814), Box(7814, 7814)),
+  Box(Box(7815, 7815), Box(7815, 7815)),
+  Box(Box(7816, 7816), Box(7816, 7816)),
+  Box(Box(7817, 7817), Box(7817, 7817)),
+  Box(Box(7818, 7818), Box(7818, 7818)),
+  Box(Box(7819, 7819), Box(7819, 7819)),
+  Box(Box(7820, 7820), Box(7820, 7820)),
+  Box(Box(7821, 7821), Box(7821, 7821)),
+  Box(Box(7822, 7822), Box(7822, 7822)),
+  Box(Box(7823, 7823), Box(7823, 7823)),
+  Box(Box(7824, 7824), Box(7824, 7824)),
+  Box(Box(7825, 7825), Box(7825, 7825)),
+  Box(Box(7826, 7826), Box(7826, 7826)),
+  Box(Box(7827, 7827), Box(7827, 7827)),
+  Box(Box(7828, 7828), Box(7828, 7828)),
+  Box(Box(7829, 7829), Box(7829, 7829)),
+  Box(Box(7830, 7830), Box(7830, 7830)),
+  Box(Box(7831, 7831), Box(7831, 7831)),
+  Box(Box(7832, 7832), Box(7832, 7832)),
+  Box(Box(7833, 7833), Box(7833, 7833)),
+  Box(Box(7834, 7834), Box(7834, 7834)),
+  Box(Box(7835, 7835), Box(7835, 7835)),
+  Box(Box(7836, 7836), Box(7836, 7836)),
+  Box(Box(7837, 7837), Box(7837, 7837)),
+  Box(Box(7838, 7838), Box(7838, 7838)),
+  Box(Box(7839, 7839), Box(7839, 7839)),
+  Box(Box(7840, 7840), Box(7840, 7840)),
+  Box(Box(7841, 7841), Box(7841, 7841)),
+  Box(Box(7842, 7842), Box(7842, 7842)),
+  Box(Box(7843, 7843), Box(7843, 7843)),
+  Box(Box(7844, 7844), Box(7844, 7844)),
+  Box(Box(7845, 7845), Box(7845, 7845)),
+  Box(Box(7846, 7846), Box(7846, 7846)),
+  Box(Box(7847, 7847), Box(7847, 7847)),
+  Box(Box(7848, 7848), Box(7848, 7848)),
+  Box(Box(7849, 7849), Box(7849, 7849)),
+  Box(Box(7850, 7850), Box(7850, 7850)),
+  Box(Box(7851, 7851), Box(7851, 7851)),
+  Box(Box(7852, 7852), Box(7852, 7852)),
+  Box(Box(7853, 7853), Box(7853, 7853)),
+  Box(Box(7854, 7854), Box(7854, 7854)),
+  Box(Box(7855, 7855), Box(7855, 7855)),
+  Box(Box(7856, 7856), Box(7856, 7856)),
+  Box(Box(7857, 7857), Box(7857, 7857)),
+  Box(Box(7858, 7858), Box(7858, 7858)),
+  Box(Box(7859, 7859), Box(7859, 7859)),
+  Box(Box(7860, 7860), Box(7860, 7860)),
+  Box(Box(7861, 7861), Box(7861, 7861)),
+  Box(Box(7862, 7862), Box(7862, 7862)),
+  Box(Box(7863, 7863), Box(7863, 7863)),
+  Box(Box(7864, 7864), Box(7864, 7864)),
+  Box(Box(7865, 7865), Box(7865, 7865)),
+  Box(Box(7866, 7866), Box(7866, 7866)),
+  Box(Box(7867, 7867), Box(7867, 7867)),
+  Box(Box(7868, 7868), Box(7868, 7868)),
+  Box(Box(7869, 7869), Box(7869, 7869)),
+  Box(Box(7870, 7870), Box(7870, 7870)),
+  Box(Box(7871, 7871), Box(7871, 7871)),
+  Box(Box(7872, 7872), Box(7872, 7872)),
+  Box(Box(7873, 7873), Box(7873, 7873)),
+  Box(Box(7874, 7874), Box(7874, 7874)),
+  Box(Box(7875, 7875), Box(7875, 7875)),
+  Box(Box(7876, 7876), Box(7876, 7876)),
+  Box(Box(7877, 7877), Box(7877, 7877)),
+  Box(Box(7878, 7878), Box(7878, 7878)),
+  Box(Box(7879, 7879), Box(7879, 7879)),
+  Box(Box(7880, 7880), Box(7880, 7880)),
+  Box(Box(7881, 7881), Box(7881, 7881)),
+  Box(Box(7882, 7882), Box(7882, 7882)),
+  Box(Box(7883, 7883), Box(7883, 7883)),
+  Box(Box(7884, 7884), Box(7884, 7884)),
+  Box(Box(7885, 7885), Box(7885, 7885)),
+  Box(Box(7886, 7886), Box(7886, 7886)),
+  Box(Box(7887, 7887), Box(7887, 7887)),
+  Box(Box(7888, 7888), Box(7888, 7888)),
+  Box(Box(7889, 7889), Box(7889, 7889)),
+  Box(Box(7890, 7890), Box(7890, 7890)),
+  Box(Box(7891, 7891), Box(7891, 7891)),
+  Box(Box(7892, 7892), Box(7892, 7892)),
+  Box(Box(7893, 7893), Box(7893, 7893)),
+  Box(Box(7894, 7894), Box(7894, 7894)),
+  Box(Box(7895, 7895), Box(7895, 7895)),
+  Box(Box(7896, 7896), Box(7896, 7896)),
+  Box(Box(7897, 7897), Box(7897, 7897)),
+  Box(Box(7898, 7898), Box(7898, 7898)),
+  Box(Box(7899, 7899), Box(7899, 7899)),
+  Box(Box(7900, 7900), Box(7900, 7900)),
+  Box(Box(7901, 7901), Box(7901, 7901)),
+  Box(Box(7902, 7902), Box(7902, 7902)),
+  Box(Box(7903, 7903), Box(7903, 7903)),
+  Box(Box(7904, 7904), Box(7904, 7904)),
+  Box(Box(7905, 7905), Box(7905, 7905)),
+  Box(Box(7906, 7906), Box(7906, 7906)),
+  Box(Box(7907, 7907), Box(7907, 7907)),
+  Box(Box(7908, 7908), Box(7908, 7908)),
+  Box(Box(7909, 7909), Box(7909, 7909)),
+  Box(Box(7910, 7910), Box(7910, 7910)),
+  Box(Box(7911, 7911), Box(7911, 7911)),
+  Box(Box(7912, 7912), Box(7912, 7912)),
+  Box(Box(7913, 7913), Box(7913, 7913)),
+  Box(Box(7914, 7914), Box(7914, 7914)),
+  Box(Box(7915, 7915), Box(7915, 7915)),
+  Box(Box(7916, 7916), Box(7916, 7916)),
+  Box(Box(7917, 7917), Box(7917, 7917)),
+  Box(Box(7918, 7918), Box(7918, 7918)),
+  Box(Box(7919, 7919), Box(7919, 7919)),
+  Box(Box(7920, 7920), Box(7920, 7920)),
+  Box(Box(7921, 7921), Box(7921, 7921)),
+  Box(Box(7922, 7922), Box(7922, 7922)),
+  Box(Box(7923, 7923), Box(7923, 7923)),
+  Box(Box(7924, 7924), Box(7924, 7924)),
+  Box(Box(7925, 7925), Box(7925, 7925)),
+  Box(Box(7926, 7926), Box(7926, 7926)),
+  Box(Box(7927, 7927), Box(7927, 7927)),
+  Box(Box(7928, 7928), Box(7928, 7928)),
+  Box(Box(7929, 7929), Box(7929, 7929)),
+  Box(Box(7930, 7930), Box(7930, 7930)),
+  Box(Box(7931, 7931), Box(7931, 7931)),
+  Box(Box(7932, 7932), Box(7932, 7932)),
+  Box(Box(7933, 7933), Box(7933, 7933)),
+  Box(Box(7934, 7934), Box(7934, 7934)),
+  Box(Box(7935, 7935), Box(7935, 7935)),
+  Box(Box(7936, 7936), Box(7936, 7936)),
+  Box(Box(7937, 7937), Box(7937, 7937)),
+  Box(Box(7938, 7938), Box(7938, 7938)),
+  Box(Box(7939, 7939), Box(7939, 7939)),
+  Box(Box(7940, 7940), Box(7940, 7940)),
+  Box(Box(7941, 7941), Box(7941, 7941)),
+  Box(Box(7942, 7942), Box(7942, 7942)),
+  Box(Box(7943, 7943), Box(7943, 7943)),
+  Box(Box(7944, 7944), Box(7944, 7944)),
+  Box(Box(7945, 7945), Box(7945, 7945)),
+  Box(Box(7946, 7946), Box(7946, 7946)),
+  Box(Box(7947, 7947), Box(7947, 7947)),
+  Box(Box(7948, 7948), Box(7948, 7948)),
+  Box(Box(7949, 7949), Box(7949, 7949)),
+  Box(Box(7950, 7950), Box(7950, 7950)),
+  Box(Box(7951, 7951), Box(7951, 7951)),
+  Box(Box(7952, 7952), Box(7952, 7952)),
+  Box(Box(7953, 7953), Box(7953, 7953)),
+  Box(Box(7954, 7954), Box(7954, 7954)),
+  Box(Box(7955, 7955), Box(7955, 7955)),
+  Box(Box(7956, 7956), Box(7956, 7956)),
+  Box(Box(7957, 7957), Box(7957, 7957)),
+  Box(Box(7958, 7958), Box(7958, 7958)),
+  Box(Box(7959, 7959), Box(7959, 7959)),
+  Box(Box(7960, 7960), Box(7960, 7960)),
+  Box(Box(7961, 7961), Box(7961, 7961)),
+  Box(Box(7962, 7962), Box(7962, 7962)),
+  Box(Box(7963, 7963), Box(7963, 7963)),
+  Box(Box(7964, 7964), Box(7964, 7964)),
+  Box(Box(7965, 7965), Box(7965, 7965)),
+  Box(Box(7966, 7966), Box(7966, 7966)),
+  Box(Box(7967, 7967), Box(7967, 7967)),
+  Box(Box(7968, 7968), Box(7968, 7968)),
+  Box(Box(7969, 7969), Box(7969, 7969)),
+  Box(Box(7970, 7970), Box(7970, 7970)),
+  Box(Box(7971, 7971), Box(7971, 7971)),
+  Box(Box(7972, 7972), Box(7972, 7972)),
+  Box(Box(7973, 7973), Box(7973, 7973)),
+  Box(Box(7974, 7974), Box(7974, 7974)),
+  Box(Box(7975, 7975), Box(7975, 7975)),
+  Box(Box(7976, 7976), Box(7976, 7976)),
+  Box(Box(7977, 7977), Box(7977, 7977)),
+  Box(Box(7978, 7978), Box(7978, 7978)),
+  Box(Box(7979, 7979), Box(7979, 7979)),
+  Box(Box(7980, 7980), Box(7980, 7980)),
+  Box(Box(7981, 7981), Box(7981, 7981)),
+  Box(Box(7982, 7982), Box(7982, 7982)),
+  Box(Box(7983, 7983), Box(7983, 7983)),
+  Box(Box(7984, 7984), Box(7984, 7984)),
+  Box(Box(7985, 7985), Box(7985, 7985)),
+  Box(Box(7986, 7986), Box(7986, 7986)),
+  Box(Box(7987, 7987), Box(7987, 7987)),
+  Box(Box(7988, 7988), Box(7988, 7988)),
+  Box(Box(7989, 7989), Box(7989, 7989)),
+  Box(Box(7990, 7990), Box(7990, 7990)),
+  Box(Box(7991, 7991), Box(7991, 7991)),
+  Box(Box(7992, 7992), Box(7992, 7992)),
+  Box(Box(7993, 7993), Box(7993, 7993)),
+  Box(Box(7994, 7994), Box(7994, 7994)),
+  Box(Box(7995, 7995), Box(7995, 7995)),
+  Box(Box(7996, 7996), Box(7996, 7996)),
+  Box(Box(7997, 7997), Box(7997, 7997)),
+  Box(Box(7998, 7998), Box(7998, 7998)),
+  Box(Box(7999, 7999), Box(7999, 7999)),
+  Box(Box(8000, 8000), Box(8000, 8000)),
+  Box(Box(8001, 8001), Box(8001, 8001)),
+  Box(Box(8002, 8002), Box(8002, 8002)),
+  Box(Box(8003, 8003), Box(8003, 8003)),
+  Box(Box(8004, 8004), Box(8004, 8004)),
+  Box(Box(8005, 8005), Box(8005, 8005)),
+  Box(Box(8006, 8006), Box(8006, 8006)),
+  Box(Box(8007, 8007), Box(8007, 8007)),
+  Box(Box(8008, 8008), Box(8008, 8008)),
+  Box(Box(8009, 8009), Box(8009, 8009)),
+  Box(Box(8010, 8010), Box(8010, 8010)),
+  Box(Box(8011, 8011), Box(8011, 8011)),
+  Box(Box(8012, 8012), Box(8012, 8012)),
+  Box(Box(8013, 8013), Box(8013, 8013)),
+  Box(Box(8014, 8014), Box(8014, 8014)),
+  Box(Box(8015, 8015), Box(8015, 8015)),
+  Box(Box(8016, 8016), Box(8016, 8016)),
+  Box(Box(8017, 8017), Box(8017, 8017)),
+  Box(Box(8018, 8018), Box(8018, 8018)),
+  Box(Box(8019, 8019), Box(8019, 8019)),
+  Box(Box(8020, 8020), Box(8020, 8020)),
+  Box(Box(8021, 8021), Box(8021, 8021)),
+  Box(Box(8022, 8022), Box(8022, 8022)),
+  Box(Box(8023, 8023), Box(8023, 8023)),
+  Box(Box(8024, 8024), Box(8024, 8024)),
+  Box(Box(8025, 8025), Box(8025, 8025)),
+  Box(Box(8026, 8026), Box(8026, 8026)),
+  Box(Box(8027, 8027), Box(8027, 8027)),
+  Box(Box(8028, 8028), Box(8028, 8028)),
+  Box(Box(8029, 8029), Box(8029, 8029)),
+  Box(Box(8030, 8030), Box(8030, 8030)),
+  Box(Box(8031, 8031), Box(8031, 8031)),
+  Box(Box(8032, 8032), Box(8032, 8032)),
+  Box(Box(8033, 8033), Box(8033, 8033)),
+  Box(Box(8034, 8034), Box(8034, 8034)),
+  Box(Box(8035, 8035), Box(8035, 8035)),
+  Box(Box(8036, 8036), Box(8036, 8036)),
+  Box(Box(8037, 8037), Box(8037, 8037)),
+  Box(Box(8038, 8038), Box(8038, 8038)),
+  Box(Box(8039, 8039), Box(8039, 8039)),
+  Box(Box(8040, 8040), Box(8040, 8040)),
+  Box(Box(8041, 8041), Box(8041, 8041)),
+  Box(Box(8042, 8042), Box(8042, 8042)),
+  Box(Box(8043, 8043), Box(8043, 8043)),
+  Box(Box(8044, 8044), Box(8044, 8044)),
+  Box(Box(8045, 8045), Box(8045, 8045)),
+  Box(Box(8046, 8046), Box(8046, 8046)),
+  Box(Box(8047, 8047), Box(8047, 8047)),
+  Box(Box(8048, 8048), Box(8048, 8048)),
+  Box(Box(8049, 8049), Box(8049, 8049)),
+  Box(Box(8050, 8050), Box(8050, 8050)),
+  Box(Box(8051, 8051), Box(8051, 8051)),
+  Box(Box(8052, 8052), Box(8052, 8052)),
+  Box(Box(8053, 8053), Box(8053, 8053)),
+  Box(Box(8054, 8054), Box(8054, 8054)),
+  Box(Box(8055, 8055), Box(8055, 8055)),
+  Box(Box(8056, 8056), Box(8056, 8056)),
+  Box(Box(8057, 8057), Box(8057, 8057)),
+  Box(Box(8058, 8058), Box(8058, 8058)),
+  Box(Box(8059, 8059), Box(8059, 8059)),
+  Box(Box(8060, 8060), Box(8060, 8060)),
+  Box(Box(8061, 8061), Box(8061, 8061)),
+  Box(Box(8062, 8062), Box(8062, 8062)),
+  Box(Box(8063, 8063), Box(8063, 8063)),
+  Box(Box(8064, 8064), Box(8064, 8064)),
+  Box(Box(8065, 8065), Box(8065, 8065)),
+  Box(Box(8066, 8066), Box(8066, 8066)),
+  Box(Box(8067, 8067), Box(8067, 8067)),
+  Box(Box(8068, 8068), Box(8068, 8068)),
+  Box(Box(8069, 8069), Box(8069, 8069)),
+  Box(Box(8070, 8070), Box(8070, 8070)),
+  Box(Box(8071, 8071), Box(8071, 8071)),
+  Box(Box(8072, 8072), Box(8072, 8072)),
+  Box(Box(8073, 8073), Box(8073, 8073)),
+  Box(Box(8074, 8074), Box(8074, 8074)),
+  Box(Box(8075, 8075), Box(8075, 8075)),
+  Box(Box(8076, 8076), Box(8076, 8076)),
+  Box(Box(8077, 8077), Box(8077, 8077)),
+  Box(Box(8078, 8078), Box(8078, 8078)),
+  Box(Box(8079, 8079), Box(8079, 8079)),
+  Box(Box(8080, 8080), Box(8080, 8080)),
+  Box(Box(8081, 8081), Box(8081, 8081)),
+  Box(Box(8082, 8082), Box(8082, 8082)),
+  Box(Box(8083, 8083), Box(8083, 8083)),
+  Box(Box(8084, 8084), Box(8084, 8084)),
+  Box(Box(8085, 8085), Box(8085, 8085)),
+  Box(Box(8086, 8086), Box(8086, 8086)),
+  Box(Box(8087, 8087), Box(8087, 8087)),
+  Box(Box(8088, 8088), Box(8088, 8088)),
+  Box(Box(8089, 8089), Box(8089, 8089)),
+  Box(Box(8090, 8090), Box(8090, 8090)),
+  Box(Box(8091, 8091), Box(8091, 8091)),
+  Box(Box(8092, 8092), Box(8092, 8092)),
+  Box(Box(8093, 8093), Box(8093, 8093)),
+  Box(Box(8094, 8094), Box(8094, 8094)),
+  Box(Box(8095, 8095), Box(8095, 8095)),
+  Box(Box(8096, 8096), Box(8096, 8096)),
+  Box(Box(8097, 8097), Box(8097, 8097)),
+  Box(Box(8098, 8098), Box(8098, 8098)),
+  Box(Box(8099, 8099), Box(8099, 8099)),
+  Box(Box(8100, 8100), Box(8100, 8100)),
+  Box(Box(8101, 8101), Box(8101, 8101)),
+  Box(Box(8102, 8102), Box(8102, 8102)),
+  Box(Box(8103, 8103), Box(8103, 8103)),
+  Box(Box(8104, 8104), Box(8104, 8104)),
+  Box(Box(8105, 8105), Box(8105, 8105)),
+  Box(Box(8106, 8106), Box(8106, 8106)),
+  Box(Box(8107, 8107), Box(8107, 8107)),
+  Box(Box(8108, 8108), Box(8108, 8108)),
+  Box(Box(8109, 8109), Box(8109, 8109)),
+  Box(Box(8110, 8110), Box(8110, 8110)),
+  Box(Box(8111, 8111), Box(8111, 8111)),
+  Box(Box(8112, 8112), Box(8112, 8112)),
+  Box(Box(8113, 8113), Box(8113, 8113)),
+  Box(Box(8114, 8114), Box(8114, 8114)),
+  Box(Box(8115, 8115), Box(8115, 8115)),
+  Box(Box(8116, 8116), Box(8116, 8116)),
+  Box(Box(8117, 8117), Box(8117, 8117)),
+  Box(Box(8118, 8118), Box(8118, 8118)),
+  Box(Box(8119, 8119), Box(8119, 8119)),
+  Box(Box(8120, 8120), Box(8120, 8120)),
+  Box(Box(8121, 8121), Box(8121, 8121)),
+  Box(Box(8122, 8122), Box(8122, 8122)),
+  Box(Box(8123, 8123), Box(8123, 8123)),
+  Box(Box(8124, 8124), Box(8124, 8124)),
+  Box(Box(8125, 8125), Box(8125, 8125)),
+  Box(Box(8126, 8126), Box(8126, 8126)),
+  Box(Box(8127, 8127), Box(8127, 8127)),
+  Box(Box(8128, 8128), Box(8128, 8128)),
+  Box(Box(8129, 8129), Box(8129, 8129)),
+  Box(Box(8130, 8130), Box(8130, 8130)),
+  Box(Box(8131, 8131), Box(8131, 8131)),
+  Box(Box(8132, 8132), Box(8132, 8132)),
+  Box(Box(8133, 8133), Box(8133, 8133)),
+  Box(Box(8134, 8134), Box(8134, 8134)),
+  Box(Box(8135, 8135), Box(8135, 8135)),
+  Box(Box(8136, 8136), Box(8136, 8136)),
+  Box(Box(8137, 8137), Box(8137, 8137)),
+  Box(Box(8138, 8138), Box(8138, 8138)),
+  Box(Box(8139, 8139), Box(8139, 8139)),
+  Box(Box(8140, 8140), Box(8140, 8140)),
+  Box(Box(8141, 8141), Box(8141, 8141)),
+  Box(Box(8142, 8142), Box(8142, 8142)),
+  Box(Box(8143, 8143), Box(8143, 8143)),
+  Box(Box(8144, 8144), Box(8144, 8144)),
+  Box(Box(8145, 8145), Box(8145, 8145)),
+  Box(Box(8146, 8146), Box(8146, 8146)),
+  Box(Box(8147, 8147), Box(8147, 8147)),
+  Box(Box(8148, 8148), Box(8148, 8148)),
+  Box(Box(8149, 8149), Box(8149, 8149)),
+  Box(Box(8150, 8150), Box(8150, 8150)),
+  Box(Box(8151, 8151), Box(8151, 8151)),
+  Box(Box(8152, 8152), Box(8152, 8152)),
+  Box(Box(8153, 8153), Box(8153, 8153)),
+  Box(Box(8154, 8154), Box(8154, 8154)),
+  Box(Box(8155, 8155), Box(8155, 8155)),
+  Box(Box(8156, 8156), Box(8156, 8156)),
+  Box(Box(8157, 8157), Box(8157, 8157)),
+  Box(Box(8158, 8158), Box(8158, 8158)),
+  Box(Box(8159, 8159), Box(8159, 8159)),
+  Box(Box(8160, 8160), Box(8160, 8160)),
+  Box(Box(8161, 8161), Box(8161, 8161)),
+  Box(Box(8162, 8162), Box(8162, 8162)),
+  Box(Box(8163, 8163), Box(8163, 8163)),
+  Box(Box(8164, 8164), Box(8164, 8164)),
+  Box(Box(8165, 8165), Box(8165, 8165)),
+  Box(Box(8166, 8166), Box(8166, 8166)),
+  Box(Box(8167, 8167), Box(8167, 8167)),
+  Box(Box(8168, 8168), Box(8168, 8168)),
+  Box(Box(8169, 8169), Box(8169, 8169)),
+  Box(Box(8170, 8170), Box(8170, 8170)),
+  Box(Box(8171, 8171), Box(8171, 8171)),
+  Box(Box(8172, 8172), Box(8172, 8172)),
+  Box(Box(8173, 8173), Box(8173, 8173)),
+  Box(Box(8174, 8174), Box(8174, 8174)),
+  Box(Box(8175, 8175), Box(8175, 8175)),
+  Box(Box(8176, 8176), Box(8176, 8176)),
+  Box(Box(8177, 8177), Box(8177, 8177)),
+  Box(Box(8178, 8178), Box(8178, 8178)),
+  Box(Box(8179, 8179), Box(8179, 8179)),
+  Box(Box(8180, 8180), Box(8180, 8180)),
+  Box(Box(8181, 8181), Box(8181, 8181)),
+  Box(Box(8182, 8182), Box(8182, 8182)),
+  Box(Box(8183, 8183), Box(8183, 8183)),
+  Box(Box(8184, 8184), Box(8184, 8184)),
+  Box(Box(8185, 8185), Box(8185, 8185)),
+  Box(Box(8186, 8186), Box(8186, 8186)),
+  Box(Box(8187, 8187), Box(8187, 8187)),
+  Box(Box(8188, 8188), Box(8188, 8188)),
+  Box(Box(8189, 8189), Box(8189, 8189)),
+  Box(Box(8190, 8190), Box(8190, 8190)),
+  Box(Box(8191, 8191), Box(8191, 8191)),
+  Box(Box(8192, 8192), Box(8192, 8192)),
+  Box(Box(8193, 8193), Box(8193, 8193)),
+  Box(Box(8194, 8194), Box(8194, 8194)),
+  Box(Box(8195, 8195), Box(8195, 8195)),
+  Box(Box(8196, 8196), Box(8196, 8196)),
+  Box(Box(8197, 8197), Box(8197, 8197)),
+  Box(Box(8198, 8198), Box(8198, 8198)),
+  Box(Box(8199, 8199), Box(8199, 8199)),
+  Box(Box(8200, 8200), Box(8200, 8200)),
+  Box(Box(8201, 8201), Box(8201, 8201)),
+  Box(Box(8202, 8202), Box(8202, 8202)),
+  Box(Box(8203, 8203), Box(8203, 8203)),
+  Box(Box(8204, 8204), Box(8204, 8204)),
+  Box(Box(8205, 8205), Box(8205, 8205)),
+  Box(Box(8206, 8206), Box(8206, 8206)),
+  Box(Box(8207, 8207), Box(8207, 8207)),
+  Box(Box(8208, 8208), Box(8208, 8208)),
+  Box(Box(8209, 8209), Box(8209, 8209)),
+  Box(Box(8210, 8210), Box(8210, 8210)),
+  Box(Box(8211, 8211), Box(8211, 8211)),
+  Box(Box(8212, 8212), Box(8212, 8212)),
+  Box(Box(8213, 8213), Box(8213, 8213)),
+  Box(Box(8214, 8214), Box(8214, 8214)),
+  Box(Box(8215, 8215), Box(8215, 8215)),
+  Box(Box(8216, 8216), Box(8216, 8216)),
+  Box(Box(8217, 8217), Box(8217, 8217)),
+  Box(Box(8218, 8218), Box(8218, 8218)),
+  Box(Box(8219, 8219), Box(8219, 8219)),
+  Box(Box(8220, 8220), Box(8220, 8220)),
+  Box(Box(8221, 8221), Box(8221, 8221)),
+  Box(Box(8222, 8222), Box(8222, 8222)),
+  Box(Box(8223, 8223), Box(8223, 8223)),
+  Box(Box(8224, 8224), Box(8224, 8224)),
+  Box(Box(8225, 8225), Box(8225, 8225)),
+  Box(Box(8226, 8226), Box(8226, 8226)),
+  Box(Box(8227, 8227), Box(8227, 8227)),
+  Box(Box(8228, 8228), Box(8228, 8228)),
+  Box(Box(8229, 8229), Box(8229, 8229)),
+  Box(Box(8230, 8230), Box(8230, 8230)),
+  Box(Box(8231, 8231), Box(8231, 8231)),
+  Box(Box(8232, 8232), Box(8232, 8232)),
+  Box(Box(8233, 8233), Box(8233, 8233)),
+  Box(Box(8234, 8234), Box(8234, 8234)),
+  Box(Box(8235, 8235), Box(8235, 8235)),
+  Box(Box(8236, 8236), Box(8236, 8236)),
+  Box(Box(8237, 8237), Box(8237, 8237)),
+  Box(Box(8238, 8238), Box(8238, 8238)),
+  Box(Box(8239, 8239), Box(8239, 8239)),
+  Box(Box(8240, 8240), Box(8240, 8240)),
+  Box(Box(8241, 8241), Box(8241, 8241)),
+  Box(Box(8242, 8242), Box(8242, 8242)),
+  Box(Box(8243, 8243), Box(8243, 8243)),
+  Box(Box(8244, 8244), Box(8244, 8244)),
+  Box(Box(8245, 8245), Box(8245, 8245)),
+  Box(Box(8246, 8246), Box(8246, 8246)),
+  Box(Box(8247, 8247), Box(8247, 8247)),
+  Box(Box(8248, 8248), Box(8248, 8248)),
+  Box(Box(8249, 8249), Box(8249, 8249)),
+  Box(Box(8250, 8250), Box(8250, 8250)),
+  Box(Box(8251, 8251), Box(8251, 8251)),
+  Box(Box(8252, 8252), Box(8252, 8252)),
+  Box(Box(8253, 8253), Box(8253, 8253)),
+  Box(Box(8254, 8254), Box(8254, 8254)),
+  Box(Box(8255, 8255), Box(8255, 8255)),
+  Box(Box(8256, 8256), Box(8256, 8256)),
+  Box(Box(8257, 8257), Box(8257, 8257)),
+  Box(Box(8258, 8258), Box(8258, 8258)),
+  Box(Box(8259, 8259), Box(8259, 8259)),
+  Box(Box(8260, 8260), Box(8260, 8260)),
+  Box(Box(8261, 8261), Box(8261, 8261)),
+  Box(Box(8262, 8262), Box(8262, 8262)),
+  Box(Box(8263, 8263), Box(8263, 8263)),
+  Box(Box(8264, 8264), Box(8264, 8264)),
+  Box(Box(8265, 8265), Box(8265, 8265)),
+  Box(Box(8266, 8266), Box(8266, 8266)),
+  Box(Box(8267, 8267), Box(8267, 8267)),
+  Box(Box(8268, 8268), Box(8268, 8268)),
+  Box(Box(8269, 8269), Box(8269, 8269)),
+  Box(Box(8270, 8270), Box(8270, 8270)),
+  Box(Box(8271, 8271), Box(8271, 8271)),
+  Box(Box(8272, 8272), Box(8272, 8272)),
+  Box(Box(8273, 8273), Box(8273, 8273)),
+  Box(Box(8274, 8274), Box(8274, 8274)),
+  Box(Box(8275, 8275), Box(8275, 8275)),
+  Box(Box(8276, 8276), Box(8276, 8276)),
+  Box(Box(8277, 8277), Box(8277, 8277)),
+  Box(Box(8278, 8278), Box(8278, 8278)),
+  Box(Box(8279, 8279), Box(8279, 8279)),
+  Box(Box(8280, 8280), Box(8280, 8280)),
+  Box(Box(8281, 8281), Box(8281, 8281)),
+  Box(Box(8282, 8282), Box(8282, 8282)),
+  Box(Box(8283, 8283), Box(8283, 8283)),
+  Box(Box(8284, 8284), Box(8284, 8284)),
+  Box(Box(8285, 8285), Box(8285, 8285)),
+  Box(Box(8286, 8286), Box(8286, 8286)),
+  Box(Box(8287, 8287), Box(8287, 8287)),
+  Box(Box(8288, 8288), Box(8288, 8288)),
+  Box(Box(8289, 8289), Box(8289, 8289)),
+  Box(Box(8290, 8290), Box(8290, 8290)),
+  Box(Box(8291, 8291), Box(8291, 8291)),
+  Box(Box(8292, 8292), Box(8292, 8292)),
+  Box(Box(8293, 8293), Box(8293, 8293)),
+  Box(Box(8294, 8294), Box(8294, 8294)),
+  Box(Box(8295, 8295), Box(8295, 8295)),
+  Box(Box(8296, 8296), Box(8296, 8296)),
+  Box(Box(8297, 8297), Box(8297, 8297)),
+  Box(Box(8298, 8298), Box(8298, 8298)),
+  Box(Box(8299, 8299), Box(8299, 8299)),
+  Box(Box(8300, 8300), Box(8300, 8300)),
+  Box(Box(8301, 8301), Box(8301, 8301)),
+  Box(Box(8302, 8302), Box(8302, 8302)),
+  Box(Box(8303, 8303), Box(8303, 8303)),
+  Box(Box(8304, 8304), Box(8304, 8304)),
+  Box(Box(8305, 8305), Box(8305, 8305)),
+  Box(Box(8306, 8306), Box(8306, 8306)),
+  Box(Box(8307, 8307), Box(8307, 8307)),
+  Box(Box(8308, 8308), Box(8308, 8308)),
+  Box(Box(8309, 8309), Box(8309, 8309)),
+  Box(Box(8310, 8310), Box(8310, 8310)),
+  Box(Box(8311, 8311), Box(8311, 8311)),
+  Box(Box(8312, 8312), Box(8312, 8312)),
+  Box(Box(8313, 8313), Box(8313, 8313)),
+  Box(Box(8314, 8314), Box(8314, 8314)),
+  Box(Box(8315, 8315), Box(8315, 8315)),
+  Box(Box(8316, 8316), Box(8316, 8316)),
+  Box(Box(8317, 8317), Box(8317, 8317)),
+  Box(Box(8318, 8318), Box(8318, 8318)),
+  Box(Box(8319, 8319), Box(8319, 8319)),
+  Box(Box(8320, 8320), Box(8320, 8320)),
+  Box(Box(8321, 8321), Box(8321, 8321)),
+  Box(Box(8322, 8322), Box(8322, 8322)),
+  Box(Box(8323, 8323), Box(8323, 8323)),
+  Box(Box(8324, 8324), Box(8324, 8324)),
+  Box(Box(8325, 8325), Box(8325, 8325)),
+  Box(Box(8326, 8326), Box(8326, 8326)),
+  Box(Box(8327, 8327), Box(8327, 8327)),
+  Box(Box(8328, 8328), Box(8328, 8328)),
+  Box(Box(8329, 8329), Box(8329, 8329)),
+  Box(Box(8330, 8330), Box(8330, 8330)),
+  Box(Box(8331, 8331), Box(8331, 8331)),
+  Box(Box(8332, 8332), Box(8332, 8332)),
+  Box(Box(8333, 8333), Box(8333, 8333)),
+  Box(Box(8334, 8334), Box(8334, 8334)),
+  Box(Box(8335, 8335), Box(8335, 8335)),
+  Box(Box(8336, 8336), Box(8336, 8336)),
+  Box(Box(8337, 8337), Box(8337, 8337)),
+  Box(Box(8338, 8338), Box(8338, 8338)),
+  Box(Box(8339, 8339), Box(8339, 8339)),
+  Box(Box(8340, 8340), Box(8340, 8340)),
+  Box(Box(8341, 8341), Box(8341, 8341)),
+  Box(Box(8342, 8342), Box(8342, 8342)),
+  Box(Box(8343, 8343), Box(8343, 8343)),
+  Box(Box(8344, 8344), Box(8344, 8344)),
+  Box(Box(8345, 8345), Box(8345, 8345)),
+  Box(Box(8346, 8346), Box(8346, 8346)),
+  Box(Box(8347, 8347), Box(8347, 8347)),
+  Box(Box(8348, 8348), Box(8348, 8348)),
+  Box(Box(8349, 8349), Box(8349, 8349)),
+  Box(Box(8350, 8350), Box(8350, 8350)),
+  Box(Box(8351, 8351), Box(8351, 8351)),
+  Box(Box(8352, 8352), Box(8352, 8352)),
+  Box(Box(8353, 8353), Box(8353, 8353)),
+  Box(Box(8354, 8354), Box(8354, 8354)),
+  Box(Box(8355, 8355), Box(8355, 8355)),
+  Box(Box(8356, 8356), Box(8356, 8356)),
+  Box(Box(8357, 8357), Box(8357, 8357)),
+  Box(Box(8358, 8358), Box(8358, 8358)),
+  Box(Box(8359, 8359), Box(8359, 8359)),
+  Box(Box(8360, 8360), Box(8360, 8360)),
+  Box(Box(8361, 8361), Box(8361, 8361)),
+  Box(Box(8362, 8362), Box(8362, 8362)),
+  Box(Box(8363, 8363), Box(8363, 8363)),
+  Box(Box(8364, 8364), Box(8364, 8364)),
+  Box(Box(8365, 8365), Box(8365, 8365)),
+  Box(Box(8366, 8366), Box(8366, 8366)),
+  Box(Box(8367, 8367), Box(8367, 8367)),
+  Box(Box(8368, 8368), Box(8368, 8368)),
+  Box(Box(8369, 8369), Box(8369, 8369)),
+  Box(Box(8370, 8370), Box(8370, 8370)),
+  Box(Box(8371, 8371), Box(8371, 8371)),
+  Box(Box(8372, 8372), Box(8372, 8372)),
+  Box(Box(8373, 8373), Box(8373, 8373)),
+  Box(Box(8374, 8374), Box(8374, 8374)),
+  Box(Box(8375, 8375), Box(8375, 8375)),
+  Box(Box(8376, 8376), Box(8376, 8376)),
+  Box(Box(8377, 8377), Box(8377, 8377)),
+  Box(Box(8378, 8378), Box(8378, 8378)),
+  Box(Box(8379, 8379), Box(8379, 8379)),
+  Box(Box(8380, 8380), Box(8380, 8380)),
+  Box(Box(8381, 8381), Box(8381, 8381)),
+  Box(Box(8382, 8382), Box(8382, 8382)),
+  Box(Box(8383, 8383), Box(8383, 8383)),
+  Box(Box(8384, 8384), Box(8384, 8384)),
+  Box(Box(8385, 8385), Box(8385, 8385)),
+  Box(Box(8386, 8386), Box(8386, 8386)),
+  Box(Box(8387, 8387), Box(8387, 8387)),
+  Box(Box(8388, 8388), Box(8388, 8388)),
+  Box(Box(8389, 8389), Box(8389, 8389)),
+  Box(Box(8390, 8390), Box(8390, 8390)),
+  Box(Box(8391, 8391), Box(8391, 8391)),
+  Box(Box(8392, 8392), Box(8392, 8392)),
+  Box(Box(8393, 8393), Box(8393, 8393)),
+  Box(Box(8394, 8394), Box(8394, 8394)),
+  Box(Box(8395, 8395), Box(8395, 8395)),
+  Box(Box(8396, 8396), Box(8396, 8396)),
+  Box(Box(8397, 8397), Box(8397, 8397)),
+  Box(Box(8398, 8398), Box(8398, 8398)),
+  Box(Box(8399, 8399), Box(8399, 8399)),
+  Box(Box(8400, 8400), Box(8400, 8400)),
+  Box(Box(8401, 8401), Box(8401, 8401)),
+  Box(Box(8402, 8402), Box(8402, 8402)),
+  Box(Box(8403, 8403), Box(8403, 8403)),
+  Box(Box(8404, 8404), Box(8404, 8404)),
+  Box(Box(8405, 8405), Box(8405, 8405)),
+  Box(Box(8406, 8406), Box(8406, 8406)),
+  Box(Box(8407, 8407), Box(8407, 8407)),
+  Box(Box(8408, 8408), Box(8408, 8408)),
+  Box(Box(8409, 8409), Box(8409, 8409)),
+  Box(Box(8410, 8410), Box(8410, 8410)),
+  Box(Box(8411, 8411), Box(8411, 8411)),
+  Box(Box(8412, 8412), Box(8412, 8412)),
+  Box(Box(8413, 8413), Box(8413, 8413)),
+  Box(Box(8414, 8414), Box(8414, 8414)),
+  Box(Box(8415, 8415), Box(8415, 8415)),
+  Box(Box(8416, 8416), Box(8416, 8416)),
+  Box(Box(8417, 8417), Box(8417, 8417)),
+  Box(Box(8418, 8418), Box(8418, 8418)),
+  Box(Box(8419, 8419), Box(8419, 8419)),
+  Box(Box(8420, 8420), Box(8420, 8420)),
+  Box(Box(8421, 8421), Box(8421, 8421)),
+  Box(Box(8422, 8422), Box(8422, 8422)),
+  Box(Box(8423, 8423), Box(8423, 8423)),
+  Box(Box(8424, 8424), Box(8424, 8424)),
+  Box(Box(8425, 8425), Box(8425, 8425)),
+  Box(Box(8426, 8426), Box(8426, 8426)),
+  Box(Box(8427, 8427), Box(8427, 8427)),
+  Box(Box(8428, 8428), Box(8428, 8428)),
+  Box(Box(8429, 8429), Box(8429, 8429)),
+  Box(Box(8430, 8430), Box(8430, 8430)),
+  Box(Box(8431, 8431), Box(8431, 8431)),
+  Box(Box(8432, 8432), Box(8432, 8432)),
+  Box(Box(8433, 8433), Box(8433, 8433)),
+  Box(Box(8434, 8434), Box(8434, 8434)),
+  Box(Box(8435, 8435), Box(8435, 8435)),
+  Box(Box(8436, 8436), Box(8436, 8436)),
+  Box(Box(8437, 8437), Box(8437, 8437)),
+  Box(Box(8438, 8438), Box(8438, 8438)),
+  Box(Box(8439, 8439), Box(8439, 8439)),
+  Box(Box(8440, 8440), Box(8440, 8440)),
+  Box(Box(8441, 8441), Box(8441, 8441)),
+  Box(Box(8442, 8442), Box(8442, 8442)),
+  Box(Box(8443, 8443), Box(8443, 8443)),
+  Box(Box(8444, 8444), Box(8444, 8444)),
+  Box(Box(8445, 8445), Box(8445, 8445)),
+  Box(Box(8446, 8446), Box(8446, 8446)),
+  Box(Box(8447, 8447), Box(8447, 8447)),
+  Box(Box(8448, 8448), Box(8448, 8448)),
+  Box(Box(8449, 8449), Box(8449, 8449)),
+  Box(Box(8450, 8450), Box(8450, 8450)),
+  Box(Box(8451, 8451), Box(8451, 8451)),
+  Box(Box(8452, 8452), Box(8452, 8452)),
+  Box(Box(8453, 8453), Box(8453, 8453)),
+  Box(Box(8454, 8454), Box(8454, 8454)),
+  Box(Box(8455, 8455), Box(8455, 8455)),
+  Box(Box(8456, 8456), Box(8456, 8456)),
+  Box(Box(8457, 8457), Box(8457, 8457)),
+  Box(Box(8458, 8458), Box(8458, 8458)),
+  Box(Box(8459, 8459), Box(8459, 8459)),
+  Box(Box(8460, 8460), Box(8460, 8460)),
+  Box(Box(8461, 8461), Box(8461, 8461)),
+  Box(Box(8462, 8462), Box(8462, 8462)),
+  Box(Box(8463, 8463), Box(8463, 8463)),
+  Box(Box(8464, 8464), Box(8464, 8464)),
+  Box(Box(8465, 8465), Box(8465, 8465)),
+  Box(Box(8466, 8466), Box(8466, 8466)),
+  Box(Box(8467, 8467), Box(8467, 8467)),
+  Box(Box(8468, 8468), Box(8468, 8468)),
+  Box(Box(8469, 8469), Box(8469, 8469)),
+  Box(Box(8470, 8470), Box(8470, 8470)),
+  Box(Box(8471, 8471), Box(8471, 8471)),
+  Box(Box(8472, 8472), Box(8472, 8472)),
+  Box(Box(8473, 8473), Box(8473, 8473)),
+  Box(Box(8474, 8474), Box(8474, 8474)),
+  Box(Box(8475, 8475), Box(8475, 8475)),
+  Box(Box(8476, 8476), Box(8476, 8476)),
+  Box(Box(8477, 8477), Box(8477, 8477)),
+  Box(Box(8478, 8478), Box(8478, 8478)),
+  Box(Box(8479, 8479), Box(8479, 8479)),
+  Box(Box(8480, 8480), Box(8480, 8480)),
+  Box(Box(8481, 8481), Box(8481, 8481)),
+  Box(Box(8482, 8482), Box(8482, 8482)),
+  Box(Box(8483, 8483), Box(8483, 8483)),
+  Box(Box(8484, 8484), Box(8484, 8484)),
+  Box(Box(8485, 8485), Box(8485, 8485)),
+  Box(Box(8486, 8486), Box(8486, 8486)),
+  Box(Box(8487, 8487), Box(8487, 8487)),
+  Box(Box(8488, 8488), Box(8488, 8488)),
+  Box(Box(8489, 8489), Box(8489, 8489)),
+  Box(Box(8490, 8490), Box(8490, 8490)),
+  Box(Box(8491, 8491), Box(8491, 8491)),
+  Box(Box(8492, 8492), Box(8492, 8492)),
+  Box(Box(8493, 8493), Box(8493, 8493)),
+  Box(Box(8494, 8494), Box(8494, 8494)),
+  Box(Box(8495, 8495), Box(8495, 8495)),
+  Box(Box(8496, 8496), Box(8496, 8496)),
+  Box(Box(8497, 8497), Box(8497, 8497)),
+  Box(Box(8498, 8498), Box(8498, 8498)),
+  Box(Box(8499, 8499), Box(8499, 8499)),
+  Box(Box(8500, 8500), Box(8500, 8500)),
+  Box(Box(8501, 8501), Box(8501, 8501)),
+  Box(Box(8502, 8502), Box(8502, 8502)),
+  Box(Box(8503, 8503), Box(8503, 8503)),
+  Box(Box(8504, 8504), Box(8504, 8504)),
+  Box(Box(8505, 8505), Box(8505, 8505)),
+  Box(Box(8506, 8506), Box(8506, 8506)),
+  Box(Box(8507, 8507), Box(8507, 8507)),
+  Box(Box(8508, 8508), Box(8508, 8508)),
+  Box(Box(8509, 8509), Box(8509, 8509)),
+  Box(Box(8510, 8510), Box(8510, 8510)),
+  Box(Box(8511, 8511), Box(8511, 8511)),
+  Box(Box(8512, 8512), Box(8512, 8512)),
+  Box(Box(8513, 8513), Box(8513, 8513)),
+  Box(Box(8514, 8514), Box(8514, 8514)),
+  Box(Box(8515, 8515), Box(8515, 8515)),
+  Box(Box(8516, 8516), Box(8516, 8516)),
+  Box(Box(8517, 8517), Box(8517, 8517)),
+  Box(Box(8518, 8518), Box(8518, 8518)),
+  Box(Box(8519, 8519), Box(8519, 8519)),
+  Box(Box(8520, 8520), Box(8520, 8520)),
+  Box(Box(8521, 8521), Box(8521, 8521)),
+  Box(Box(8522, 8522), Box(8522, 8522)),
+  Box(Box(8523, 8523), Box(8523, 8523)),
+  Box(Box(8524, 8524), Box(8524, 8524)),
+  Box(Box(8525, 8525), Box(8525, 8525)),
+  Box(Box(8526, 8526), Box(8526, 8526)),
+  Box(Box(8527, 8527), Box(8527, 8527)),
+  Box(Box(8528, 8528), Box(8528, 8528)),
+  Box(Box(8529, 8529), Box(8529, 8529)),
+  Box(Box(8530, 8530), Box(8530, 8530)),
+  Box(Box(8531, 8531), Box(8531, 8531)),
+  Box(Box(8532, 8532), Box(8532, 8532)),
+  Box(Box(8533, 8533), Box(8533, 8533)),
+  Box(Box(8534, 8534), Box(8534, 8534)),
+  Box(Box(8535, 8535), Box(8535, 8535)),
+  Box(Box(8536, 8536), Box(8536, 8536)),
+  Box(Box(8537, 8537), Box(8537, 8537)),
+  Box(Box(8538, 8538), Box(8538, 8538)),
+  Box(Box(8539, 8539), Box(8539, 8539)),
+  Box(Box(8540, 8540), Box(8540, 8540)),
+  Box(Box(8541, 8541), Box(8541, 8541)),
+  Box(Box(8542, 8542), Box(8542, 8542)),
+  Box(Box(8543, 8543), Box(8543, 8543)),
+  Box(Box(8544, 8544), Box(8544, 8544)),
+  Box(Box(8545, 8545), Box(8545, 8545)),
+  Box(Box(8546, 8546), Box(8546, 8546)),
+  Box(Box(8547, 8547), Box(8547, 8547)),
+  Box(Box(8548, 8548), Box(8548, 8548)),
+  Box(Box(8549, 8549), Box(8549, 8549)),
+  Box(Box(8550, 8550), Box(8550, 8550)),
+  Box(Box(8551, 8551), Box(8551, 8551)),
+  Box(Box(8552, 8552), Box(8552, 8552)),
+  Box(Box(8553, 8553), Box(8553, 8553)),
+  Box(Box(8554, 8554), Box(8554, 8554)),
+  Box(Box(8555, 8555), Box(8555, 8555)),
+  Box(Box(8556, 8556), Box(8556, 8556)),
+  Box(Box(8557, 8557), Box(8557, 8557)),
+  Box(Box(8558, 8558), Box(8558, 8558)),
+  Box(Box(8559, 8559), Box(8559, 8559)),
+  Box(Box(8560, 8560), Box(8560, 8560)),
+  Box(Box(8561, 8561), Box(8561, 8561)),
+  Box(Box(8562, 8562), Box(8562, 8562)),
+  Box(Box(8563, 8563), Box(8563, 8563)),
+  Box(Box(8564, 8564), Box(8564, 8564)),
+  Box(Box(8565, 8565), Box(8565, 8565)),
+  Box(Box(8566, 8566), Box(8566, 8566)),
+  Box(Box(8567, 8567), Box(8567, 8567)),
+  Box(Box(8568, 8568), Box(8568, 8568)),
+  Box(Box(8569, 8569), Box(8569, 8569)),
+  Box(Box(8570, 8570), Box(8570, 8570)),
+  Box(Box(8571, 8571), Box(8571, 8571)),
+  Box(Box(8572, 8572), Box(8572, 8572)),
+  Box(Box(8573, 8573), Box(8573, 8573)),
+  Box(Box(8574, 8574), Box(8574, 8574)),
+  Box(Box(8575, 8575), Box(8575, 8575)),
+  Box(Box(8576, 8576), Box(8576, 8576)),
+  Box(Box(8577, 8577), Box(8577, 8577)),
+  Box(Box(8578, 8578), Box(8578, 8578)),
+  Box(Box(8579, 8579), Box(8579, 8579)),
+  Box(Box(8580, 8580), Box(8580, 8580)),
+  Box(Box(8581, 8581), Box(8581, 8581)),
+  Box(Box(8582, 8582), Box(8582, 8582)),
+  Box(Box(8583, 8583), Box(8583, 8583)),
+  Box(Box(8584, 8584), Box(8584, 8584)),
+  Box(Box(8585, 8585), Box(8585, 8585)),
+  Box(Box(8586, 8586), Box(8586, 8586)),
+  Box(Box(8587, 8587), Box(8587, 8587)),
+  Box(Box(8588, 8588), Box(8588, 8588)),
+  Box(Box(8589, 8589), Box(8589, 8589)),
+  Box(Box(8590, 8590), Box(8590, 8590)),
+  Box(Box(8591, 8591), Box(8591, 8591)),
+  Box(Box(8592, 8592), Box(8592, 8592)),
+  Box(Box(8593, 8593), Box(8593, 8593)),
+  Box(Box(8594, 8594), Box(8594, 8594)),
+  Box(Box(8595, 8595), Box(8595, 8595)),
+  Box(Box(8596, 8596), Box(8596, 8596)),
+  Box(Box(8597, 8597), Box(8597, 8597)),
+  Box(Box(8598, 8598), Box(8598, 8598)),
+  Box(Box(8599, 8599), Box(8599, 8599)),
+  Box(Box(8600, 8600), Box(8600, 8600)),
+  Box(Box(8601, 8601), Box(8601, 8601)),
+  Box(Box(8602, 8602), Box(8602, 8602)),
+  Box(Box(8603, 8603), Box(8603, 8603)),
+  Box(Box(8604, 8604), Box(8604, 8604)),
+  Box(Box(8605, 8605), Box(8605, 8605)),
+  Box(Box(8606, 8606), Box(8606, 8606)),
+  Box(Box(8607, 8607), Box(8607, 8607)),
+  Box(Box(8608, 8608), Box(8608, 8608)),
+  Box(Box(8609, 8609), Box(8609, 8609)),
+  Box(Box(8610, 8610), Box(8610, 8610)),
+  Box(Box(8611, 8611), Box(8611, 8611)),
+  Box(Box(8612, 8612), Box(8612, 8612)),
+  Box(Box(8613, 8613), Box(8613, 8613)),
+  Box(Box(8614, 8614), Box(8614, 8614)),
+  Box(Box(8615, 8615), Box(8615, 8615)),
+  Box(Box(8616, 8616), Box(8616, 8616)),
+  Box(Box(8617, 8617), Box(8617, 8617)),
+  Box(Box(8618, 8618), Box(8618, 8618)),
+  Box(Box(8619, 8619), Box(8619, 8619)),
+  Box(Box(8620, 8620), Box(8620, 8620)),
+  Box(Box(8621, 8621), Box(8621, 8621)),
+  Box(Box(8622, 8622), Box(8622, 8622)),
+  Box(Box(8623, 8623), Box(8623, 8623)),
+  Box(Box(8624, 8624), Box(8624, 8624)),
+  Box(Box(8625, 8625), Box(8625, 8625)),
+  Box(Box(8626, 8626), Box(8626, 8626)),
+  Box(Box(8627, 8627), Box(8627, 8627)),
+  Box(Box(8628, 8628), Box(8628, 8628)),
+  Box(Box(8629, 8629), Box(8629, 8629)),
+  Box(Box(8630, 8630), Box(8630, 8630)),
+  Box(Box(8631, 8631), Box(8631, 8631)),
+  Box(Box(8632, 8632), Box(8632, 8632)),
+  Box(Box(8633, 8633), Box(8633, 8633)),
+  Box(Box(8634, 8634), Box(8634, 8634)),
+  Box(Box(8635, 8635), Box(8635, 8635)),
+  Box(Box(8636, 8636), Box(8636, 8636)),
+  Box(Box(8637, 8637), Box(8637, 8637)),
+  Box(Box(8638, 8638), Box(8638, 8638)),
+  Box(Box(8639, 8639), Box(8639, 8639)),
+  Box(Box(8640, 8640), Box(8640, 8640)),
+  Box(Box(8641, 8641), Box(8641, 8641)),
+  Box(Box(8642, 8642), Box(8642, 8642)),
+  Box(Box(8643, 8643), Box(8643, 8643)),
+  Box(Box(8644, 8644), Box(8644, 8644)),
+  Box(Box(8645, 8645), Box(8645, 8645)),
+  Box(Box(8646, 8646), Box(8646, 8646)),
+  Box(Box(8647, 8647), Box(8647, 8647)),
+  Box(Box(8648, 8648), Box(8648, 8648)),
+  Box(Box(8649, 8649), Box(8649, 8649)),
+  Box(Box(8650, 8650), Box(8650, 8650)),
+  Box(Box(8651, 8651), Box(8651, 8651)),
+  Box(Box(8652, 8652), Box(8652, 8652)),
+  Box(Box(8653, 8653), Box(8653, 8653)),
+  Box(Box(8654, 8654), Box(8654, 8654)),
+  Box(Box(8655, 8655), Box(8655, 8655)),
+  Box(Box(8656, 8656), Box(8656, 8656)),
+  Box(Box(8657, 8657), Box(8657, 8657)),
+  Box(Box(8658, 8658), Box(8658, 8658)),
+  Box(Box(8659, 8659), Box(8659, 8659)),
+  Box(Box(8660, 8660), Box(8660, 8660)),
+  Box(Box(8661, 8661), Box(8661, 8661)),
+  Box(Box(8662, 8662), Box(8662, 8662)),
+  Box(Box(8663, 8663), Box(8663, 8663)),
+  Box(Box(8664, 8664), Box(8664, 8664)),
+  Box(Box(8665, 8665), Box(8665, 8665)),
+  Box(Box(8666, 8666), Box(8666, 8666)),
+  Box(Box(8667, 8667), Box(8667, 8667)),
+  Box(Box(8668, 8668), Box(8668, 8668)),
+  Box(Box(8669, 8669), Box(8669, 8669)),
+  Box(Box(8670, 8670), Box(8670, 8670)),
+  Box(Box(8671, 8671), Box(8671, 8671)),
+  Box(Box(8672, 8672), Box(8672, 8672)),
+  Box(Box(8673, 8673), Box(8673, 8673)),
+  Box(Box(8674, 8674), Box(8674, 8674)),
+  Box(Box(8675, 8675), Box(8675, 8675)),
+  Box(Box(8676, 8676), Box(8676, 8676)),
+  Box(Box(8677, 8677), Box(8677, 8677)),
+  Box(Box(8678, 8678), Box(8678, 8678)),
+  Box(Box(8679, 8679), Box(8679, 8679)),
+  Box(Box(8680, 8680), Box(8680, 8680)),
+  Box(Box(8681, 8681), Box(8681, 8681)),
+  Box(Box(8682, 8682), Box(8682, 8682)),
+  Box(Box(8683, 8683), Box(8683, 8683)),
+  Box(Box(8684, 8684), Box(8684, 8684)),
+  Box(Box(8685, 8685), Box(8685, 8685)),
+  Box(Box(8686, 8686), Box(8686, 8686)),
+  Box(Box(8687, 8687), Box(8687, 8687)),
+  Box(Box(8688, 8688), Box(8688, 8688)),
+  Box(Box(8689, 8689), Box(8689, 8689)),
+  Box(Box(8690, 8690), Box(8690, 8690)),
+  Box(Box(8691, 8691), Box(8691, 8691)),
+  Box(Box(8692, 8692), Box(8692, 8692)),
+  Box(Box(8693, 8693), Box(8693, 8693)),
+  Box(Box(8694, 8694), Box(8694, 8694)),
+  Box(Box(8695, 8695), Box(8695, 8695)),
+  Box(Box(8696, 8696), Box(8696, 8696)),
+  Box(Box(8697, 8697), Box(8697, 8697)),
+  Box(Box(8698, 8698), Box(8698, 8698)),
+  Box(Box(8699, 8699), Box(8699, 8699)),
+  Box(Box(8700, 8700), Box(8700, 8700)),
+  Box(Box(8701, 8701), Box(8701, 8701)),
+  Box(Box(8702, 8702), Box(8702, 8702)),
+  Box(Box(8703, 8703), Box(8703, 8703)),
+  Box(Box(8704, 8704), Box(8704, 8704)),
+  Box(Box(8705, 8705), Box(8705, 8705)),
+  Box(Box(8706, 8706), Box(8706, 8706)),
+  Box(Box(8707, 8707), Box(8707, 8707)),
+  Box(Box(8708, 8708), Box(8708, 8708)),
+  Box(Box(8709, 8709), Box(8709, 8709)),
+  Box(Box(8710, 8710), Box(8710, 8710)),
+  Box(Box(8711, 8711), Box(8711, 8711)),
+  Box(Box(8712, 8712), Box(8712, 8712)),
+  Box(Box(8713, 8713), Box(8713, 8713)),
+  Box(Box(8714, 8714), Box(8714, 8714)),
+  Box(Box(8715, 8715), Box(8715, 8715)),
+  Box(Box(8716, 8716), Box(8716, 8716)),
+  Box(Box(8717, 8717), Box(8717, 8717)),
+  Box(Box(8718, 8718), Box(8718, 8718)),
+  Box(Box(8719, 8719), Box(8719, 8719)),
+  Box(Box(8720, 8720), Box(8720, 8720)),
+  Box(Box(8721, 8721), Box(8721, 8721)),
+  Box(Box(8722, 8722), Box(8722, 8722)),
+  Box(Box(8723, 8723), Box(8723, 8723)),
+  Box(Box(8724, 8724), Box(8724, 8724)),
+  Box(Box(8725, 8725), Box(8725, 8725)),
+  Box(Box(8726, 8726), Box(8726, 8726)),
+  Box(Box(8727, 8727), Box(8727, 8727)),
+  Box(Box(8728, 8728), Box(8728, 8728)),
+  Box(Box(8729, 8729), Box(8729, 8729)),
+  Box(Box(8730, 8730), Box(8730, 8730)),
+  Box(Box(8731, 8731), Box(8731, 8731)),
+  Box(Box(8732, 8732), Box(8732, 8732)),
+  Box(Box(8733, 8733), Box(8733, 8733)),
+  Box(Box(8734, 8734), Box(8734, 8734)),
+  Box(Box(8735, 8735), Box(8735, 8735)),
+  Box(Box(8736, 8736), Box(8736, 8736)),
+  Box(Box(8737, 8737), Box(8737, 8737)),
+  Box(Box(8738, 8738), Box(8738, 8738)),
+  Box(Box(8739, 8739), Box(8739, 8739)),
+  Box(Box(8740, 8740), Box(8740, 8740)),
+  Box(Box(8741, 8741), Box(8741, 8741)),
+  Box(Box(8742, 8742), Box(8742, 8742)),
+  Box(Box(8743, 8743), Box(8743, 8743)),
+  Box(Box(8744, 8744), Box(8744, 8744)),
+  Box(Box(8745, 8745), Box(8745, 8745)),
+  Box(Box(8746, 8746), Box(8746, 8746)),
+  Box(Box(8747, 8747), Box(8747, 8747)),
+  Box(Box(8748, 8748), Box(8748, 8748)),
+  Box(Box(8749, 8749), Box(8749, 8749)),
+  Box(Box(8750, 8750), Box(8750, 8750)),
+  Box(Box(8751, 8751), Box(8751, 8751)),
+  Box(Box(8752, 8752), Box(8752, 8752)),
+  Box(Box(8753, 8753), Box(8753, 8753)),
+  Box(Box(8754, 8754), Box(8754, 8754)),
+  Box(Box(8755, 8755), Box(8755, 8755)),
+  Box(Box(8756, 8756), Box(8756, 8756)),
+  Box(Box(8757, 8757), Box(8757, 8757)),
+  Box(Box(8758, 8758), Box(8758, 8758)),
+  Box(Box(8759, 8759), Box(8759, 8759)),
+  Box(Box(8760, 8760), Box(8760, 8760)),
+  Box(Box(8761, 8761), Box(8761, 8761)),
+  Box(Box(8762, 8762), Box(8762, 8762)),
+  Box(Box(8763, 8763), Box(8763, 8763)),
+  Box(Box(8764, 8764), Box(8764, 8764)),
+  Box(Box(8765, 8765), Box(8765, 8765)),
+  Box(Box(8766, 8766), Box(8766, 8766)),
+  Box(Box(8767, 8767), Box(8767, 8767)),
+  Box(Box(8768, 8768), Box(8768, 8768)),
+  Box(Box(8769, 8769), Box(8769, 8769)),
+  Box(Box(8770, 8770), Box(8770, 8770)),
+  Box(Box(8771, 8771), Box(8771, 8771)),
+  Box(Box(8772, 8772), Box(8772, 8772)),
+  Box(Box(8773, 8773), Box(8773, 8773)),
+  Box(Box(8774, 8774), Box(8774, 8774)),
+  Box(Box(8775, 8775), Box(8775, 8775)),
+  Box(Box(8776, 8776), Box(8776, 8776)),
+  Box(Box(8777, 8777), Box(8777, 8777)),
+  Box(Box(8778, 8778), Box(8778, 8778)),
+  Box(Box(8779, 8779), Box(8779, 8779)),
+  Box(Box(8780, 8780), Box(8780, 8780)),
+  Box(Box(8781, 8781), Box(8781, 8781)),
+  Box(Box(8782, 8782), Box(8782, 8782)),
+  Box(Box(8783, 8783), Box(8783, 8783)),
+  Box(Box(8784, 8784), Box(8784, 8784)),
+  Box(Box(8785, 8785), Box(8785, 8785)),
+  Box(Box(8786, 8786), Box(8786, 8786)),
+  Box(Box(8787, 8787), Box(8787, 8787)),
+  Box(Box(8788, 8788), Box(8788, 8788)),
+  Box(Box(8789, 8789), Box(8789, 8789)),
+  Box(Box(8790, 8790), Box(8790, 8790)),
+  Box(Box(8791, 8791), Box(8791, 8791)),
+  Box(Box(8792, 8792), Box(8792, 8792)),
+  Box(Box(8793, 8793), Box(8793, 8793)),
+  Box(Box(8794, 8794), Box(8794, 8794)),
+  Box(Box(8795, 8795), Box(8795, 8795)),
+  Box(Box(8796, 8796), Box(8796, 8796)),
+  Box(Box(8797, 8797), Box(8797, 8797)),
+  Box(Box(8798, 8798), Box(8798, 8798)),
+  Box(Box(8799, 8799), Box(8799, 8799)),
+  Box(Box(8800, 8800), Box(8800, 8800)),
+  Box(Box(8801, 8801), Box(8801, 8801)),
+  Box(Box(8802, 8802), Box(8802, 8802)),
+  Box(Box(8803, 8803), Box(8803, 8803)),
+  Box(Box(8804, 8804), Box(8804, 8804)),
+  Box(Box(8805, 8805), Box(8805, 8805)),
+  Box(Box(8806, 8806), Box(8806, 8806)),
+  Box(Box(8807, 8807), Box(8807, 8807)),
+  Box(Box(8808, 8808), Box(8808, 8808)),
+  Box(Box(8809, 8809), Box(8809, 8809)),
+  Box(Box(8810, 8810), Box(8810, 8810)),
+  Box(Box(8811, 8811), Box(8811, 8811)),
+  Box(Box(8812, 8812), Box(8812, 8812)),
+  Box(Box(8813, 8813), Box(8813, 8813)),
+  Box(Box(8814, 8814), Box(8814, 8814)),
+  Box(Box(8815, 8815), Box(8815, 8815)),
+  Box(Box(8816, 8816), Box(8816, 8816)),
+  Box(Box(8817, 8817), Box(8817, 8817)),
+  Box(Box(8818, 8818), Box(8818, 8818)),
+  Box(Box(8819, 8819), Box(8819, 8819)),
+  Box(Box(8820, 8820), Box(8820, 8820)),
+  Box(Box(8821, 8821), Box(8821, 8821)),
+  Box(Box(8822, 8822), Box(8822, 8822)),
+  Box(Box(8823, 8823), Box(8823, 8823)),
+  Box(Box(8824, 8824), Box(8824, 8824)),
+  Box(Box(8825, 8825), Box(8825, 8825)),
+  Box(Box(8826, 8826), Box(8826, 8826)),
+  Box(Box(8827, 8827), Box(8827, 8827)),
+  Box(Box(8828, 8828), Box(8828, 8828)),
+  Box(Box(8829, 8829), Box(8829, 8829)),
+  Box(Box(8830, 8830), Box(8830, 8830)),
+  Box(Box(8831, 8831), Box(8831, 8831)),
+  Box(Box(8832, 8832), Box(8832, 8832)),
+  Box(Box(8833, 8833), Box(8833, 8833)),
+  Box(Box(8834, 8834), Box(8834, 8834)),
+  Box(Box(8835, 8835), Box(8835, 8835)),
+  Box(Box(8836, 8836), Box(8836, 8836)),
+  Box(Box(8837, 8837), Box(8837, 8837)),
+  Box(Box(8838, 8838), Box(8838, 8838)),
+  Box(Box(8839, 8839), Box(8839, 8839)),
+  Box(Box(8840, 8840), Box(8840, 8840)),
+  Box(Box(8841, 8841), Box(8841, 8841)),
+  Box(Box(8842, 8842), Box(8842, 8842)),
+  Box(Box(8843, 8843), Box(8843, 8843)),
+  Box(Box(8844, 8844), Box(8844, 8844)),
+  Box(Box(8845, 8845), Box(8845, 8845)),
+  Box(Box(8846, 8846), Box(8846, 8846)),
+  Box(Box(8847, 8847), Box(8847, 8847)),
+  Box(Box(8848, 8848), Box(8848, 8848)),
+  Box(Box(8849, 8849), Box(8849, 8849)),
+  Box(Box(8850, 8850), Box(8850, 8850)),
+  Box(Box(8851, 8851), Box(8851, 8851)),
+  Box(Box(8852, 8852), Box(8852, 8852)),
+  Box(Box(8853, 8853), Box(8853, 8853)),
+  Box(Box(8854, 8854), Box(8854, 8854)),
+  Box(Box(8855, 8855), Box(8855, 8855)),
+  Box(Box(8856, 8856), Box(8856, 8856)),
+  Box(Box(8857, 8857), Box(8857, 8857)),
+  Box(Box(8858, 8858), Box(8858, 8858)),
+  Box(Box(8859, 8859), Box(8859, 8859)),
+  Box(Box(8860, 8860), Box(8860, 8860)),
+  Box(Box(8861, 8861), Box(8861, 8861)),
+  Box(Box(8862, 8862), Box(8862, 8862)),
+  Box(Box(8863, 8863), Box(8863, 8863)),
+  Box(Box(8864, 8864), Box(8864, 8864)),
+  Box(Box(8865, 8865), Box(8865, 8865)),
+  Box(Box(8866, 8866), Box(8866, 8866)),
+  Box(Box(8867, 8867), Box(8867, 8867)),
+  Box(Box(8868, 8868), Box(8868, 8868)),
+  Box(Box(8869, 8869), Box(8869, 8869)),
+  Box(Box(8870, 8870), Box(8870, 8870)),
+  Box(Box(8871, 8871), Box(8871, 8871)),
+  Box(Box(8872, 8872), Box(8872, 8872)),
+  Box(Box(8873, 8873), Box(8873, 8873)),
+  Box(Box(8874, 8874), Box(8874, 8874)),
+  Box(Box(8875, 8875), Box(8875, 8875)),
+  Box(Box(8876, 8876), Box(8876, 8876)),
+  Box(Box(8877, 8877), Box(8877, 8877)),
+  Box(Box(8878, 8878), Box(8878, 8878)),
+  Box(Box(8879, 8879), Box(8879, 8879)),
+  Box(Box(8880, 8880), Box(8880, 8880)),
+  Box(Box(8881, 8881), Box(8881, 8881)),
+  Box(Box(8882, 8882), Box(8882, 8882)),
+  Box(Box(8883, 8883), Box(8883, 8883)),
+  Box(Box(8884, 8884), Box(8884, 8884)),
+  Box(Box(8885, 8885), Box(8885, 8885)),
+  Box(Box(8886, 8886), Box(8886, 8886)),
+  Box(Box(8887, 8887), Box(8887, 8887)),
+  Box(Box(8888, 8888), Box(8888, 8888)),
+  Box(Box(8889, 8889), Box(8889, 8889)),
+  Box(Box(8890, 8890), Box(8890, 8890)),
+  Box(Box(8891, 8891), Box(8891, 8891)),
+  Box(Box(8892, 8892), Box(8892, 8892)),
+  Box(Box(8893, 8893), Box(8893, 8893)),
+  Box(Box(8894, 8894), Box(8894, 8894)),
+  Box(Box(8895, 8895), Box(8895, 8895)),
+  Box(Box(8896, 8896), Box(8896, 8896)),
+  Box(Box(8897, 8897), Box(8897, 8897)),
+  Box(Box(8898, 8898), Box(8898, 8898)),
+  Box(Box(8899, 8899), Box(8899, 8899)),
+  Box(Box(8900, 8900), Box(8900, 8900)),
+  Box(Box(8901, 8901), Box(8901, 8901)),
+  Box(Box(8902, 8902), Box(8902, 8902)),
+  Box(Box(8903, 8903), Box(8903, 8903)),
+  Box(Box(8904, 8904), Box(8904, 8904)),
+  Box(Box(8905, 8905), Box(8905, 8905)),
+  Box(Box(8906, 8906), Box(8906, 8906)),
+  Box(Box(8907, 8907), Box(8907, 8907)),
+  Box(Box(8908, 8908), Box(8908, 8908)),
+  Box(Box(8909, 8909), Box(8909, 8909)),
+  Box(Box(8910, 8910), Box(8910, 8910)),
+  Box(Box(8911, 8911), Box(8911, 8911)),
+  Box(Box(8912, 8912), Box(8912, 8912)),
+  Box(Box(8913, 8913), Box(8913, 8913)),
+  Box(Box(8914, 8914), Box(8914, 8914)),
+  Box(Box(8915, 8915), Box(8915, 8915)),
+  Box(Box(8916, 8916), Box(8916, 8916)),
+  Box(Box(8917, 8917), Box(8917, 8917)),
+  Box(Box(8918, 8918), Box(8918, 8918)),
+  Box(Box(8919, 8919), Box(8919, 8919)),
+  Box(Box(8920, 8920), Box(8920, 8920)),
+  Box(Box(8921, 8921), Box(8921, 8921)),
+  Box(Box(8922, 8922), Box(8922, 8922)),
+  Box(Box(8923, 8923), Box(8923, 8923)),
+  Box(Box(8924, 8924), Box(8924, 8924)),
+  Box(Box(8925, 8925), Box(8925, 8925)),
+  Box(Box(8926, 8926), Box(8926, 8926)),
+  Box(Box(8927, 8927), Box(8927, 8927)),
+  Box(Box(8928, 8928), Box(8928, 8928)),
+  Box(Box(8929, 8929), Box(8929, 8929)),
+  Box(Box(8930, 8930), Box(8930, 8930)),
+  Box(Box(8931, 8931), Box(8931, 8931)),
+  Box(Box(8932, 8932), Box(8932, 8932)),
+  Box(Box(8933, 8933), Box(8933, 8933)),
+  Box(Box(8934, 8934), Box(8934, 8934)),
+  Box(Box(8935, 8935), Box(8935, 8935)),
+  Box(Box(8936, 8936), Box(8936, 8936)),
+  Box(Box(8937, 8937), Box(8937, 8937)),
+  Box(Box(8938, 8938), Box(8938, 8938)),
+  Box(Box(8939, 8939), Box(8939, 8939)),
+  Box(Box(8940, 8940), Box(8940, 8940)),
+  Box(Box(8941, 8941), Box(8941, 8941)),
+  Box(Box(8942, 8942), Box(8942, 8942)),
+  Box(Box(8943, 8943), Box(8943, 8943)),
+  Box(Box(8944, 8944), Box(8944, 8944)),
+  Box(Box(8945, 8945), Box(8945, 8945)),
+  Box(Box(8946, 8946), Box(8946, 8946)),
+  Box(Box(8947, 8947), Box(8947, 8947)),
+  Box(Box(8948, 8948), Box(8948, 8948)),
+  Box(Box(8949, 8949), Box(8949, 8949)),
+  Box(Box(8950, 8950), Box(8950, 8950)),
+  Box(Box(8951, 8951), Box(8951, 8951)),
+  Box(Box(8952, 8952), Box(8952, 8952)),
+  Box(Box(8953, 8953), Box(8953, 8953)),
+  Box(Box(8954, 8954), Box(8954, 8954)),
+  Box(Box(8955, 8955), Box(8955, 8955)),
+  Box(Box(8956, 8956), Box(8956, 8956)),
+  Box(Box(8957, 8957), Box(8957, 8957)),
+  Box(Box(8958, 8958), Box(8958, 8958)),
+  Box(Box(8959, 8959), Box(8959, 8959)),
+  Box(Box(8960, 8960), Box(8960, 8960)),
+  Box(Box(8961, 8961), Box(8961, 8961)),
+  Box(Box(8962, 8962), Box(8962, 8962)),
+  Box(Box(8963, 8963), Box(8963, 8963)),
+  Box(Box(8964, 8964), Box(8964, 8964)),
+  Box(Box(8965, 8965), Box(8965, 8965)),
+  Box(Box(8966, 8966), Box(8966, 8966)),
+  Box(Box(8967, 8967), Box(8967, 8967)),
+  Box(Box(8968, 8968), Box(8968, 8968)),
+  Box(Box(8969, 8969), Box(8969, 8969)),
+  Box(Box(8970, 8970), Box(8970, 8970)),
+  Box(Box(8971, 8971), Box(8971, 8971)),
+  Box(Box(8972, 8972), Box(8972, 8972)),
+  Box(Box(8973, 8973), Box(8973, 8973)),
+  Box(Box(8974, 8974), Box(8974, 8974)),
+  Box(Box(8975, 8975), Box(8975, 8975)),
+  Box(Box(8976, 8976), Box(8976, 8976)),
+  Box(Box(8977, 8977), Box(8977, 8977)),
+  Box(Box(8978, 8978), Box(8978, 8978)),
+  Box(Box(8979, 8979), Box(8979, 8979)),
+  Box(Box(8980, 8980), Box(8980, 8980)),
+  Box(Box(8981, 8981), Box(8981, 8981)),
+  Box(Box(8982, 8982), Box(8982, 8982)),
+  Box(Box(8983, 8983), Box(8983, 8983)),
+  Box(Box(8984, 8984), Box(8984, 8984)),
+  Box(Box(8985, 8985), Box(8985, 8985)),
+  Box(Box(8986, 8986), Box(8986, 8986)),
+  Box(Box(8987, 8987), Box(8987, 8987)),
+  Box(Box(8988, 8988), Box(8988, 8988)),
+  Box(Box(8989, 8989), Box(8989, 8989)),
+  Box(Box(8990, 8990), Box(8990, 8990)),
+  Box(Box(8991, 8991), Box(8991, 8991)),
+  Box(Box(8992, 8992), Box(8992, 8992)),
+  Box(Box(8993, 8993), Box(8993, 8993)),
+  Box(Box(8994, 8994), Box(8994, 8994)),
+  Box(Box(8995, 8995), Box(8995, 8995)),
+  Box(Box(8996, 8996), Box(8996, 8996)),
+  Box(Box(8997, 8997), Box(8997, 8997)),
+  Box(Box(8998, 8998), Box(8998, 8998)),
+  Box(Box(8999, 8999), Box(8999, 8999)),
+  Box(Box(9000, 9000), Box(9000, 9000)),
+  Box(Box(9001, 9001), Box(9001, 9001)),
+  Box(Box(9002, 9002), Box(9002, 9002)),
+  Box(Box(9003, 9003), Box(9003, 9003)),
+  Box(Box(9004, 9004), Box(9004, 9004)),
+  Box(Box(9005, 9005), Box(9005, 9005)),
+  Box(Box(9006, 9006), Box(9006, 9006)),
+  Box(Box(9007, 9007), Box(9007, 9007)),
+  Box(Box(9008, 9008), Box(9008, 9008)),
+  Box(Box(9009, 9009), Box(9009, 9009)),
+  Box(Box(9010, 9010), Box(9010, 9010)),
+  Box(Box(9011, 9011), Box(9011, 9011)),
+  Box(Box(9012, 9012), Box(9012, 9012)),
+  Box(Box(9013, 9013), Box(9013, 9013)),
+  Box(Box(9014, 9014), Box(9014, 9014)),
+  Box(Box(9015, 9015), Box(9015, 9015)),
+  Box(Box(9016, 9016), Box(9016, 9016)),
+  Box(Box(9017, 9017), Box(9017, 9017)),
+  Box(Box(9018, 9018), Box(9018, 9018)),
+  Box(Box(9019, 9019), Box(9019, 9019)),
+  Box(Box(9020, 9020), Box(9020, 9020)),
+  Box(Box(9021, 9021), Box(9021, 9021)),
+  Box(Box(9022, 9022), Box(9022, 9022)),
+  Box(Box(9023, 9023), Box(9023, 9023)),
+  Box(Box(9024, 9024), Box(9024, 9024)),
+  Box(Box(9025, 9025), Box(9025, 9025)),
+  Box(Box(9026, 9026), Box(9026, 9026)),
+  Box(Box(9027, 9027), Box(9027, 9027)),
+  Box(Box(9028, 9028), Box(9028, 9028)),
+  Box(Box(9029, 9029), Box(9029, 9029)),
+  Box(Box(9030, 9030), Box(9030, 9030)),
+  Box(Box(9031, 9031), Box(9031, 9031)),
+  Box(Box(9032, 9032), Box(9032, 9032)),
+  Box(Box(9033, 9033), Box(9033, 9033)),
+  Box(Box(9034, 9034), Box(9034, 9034)),
+  Box(Box(9035, 9035), Box(9035, 9035)),
+  Box(Box(9036, 9036), Box(9036, 9036)),
+  Box(Box(9037, 9037), Box(9037, 9037)),
+  Box(Box(9038, 9038), Box(9038, 9038)),
+  Box(Box(9039, 9039), Box(9039, 9039)),
+  Box(Box(9040, 9040), Box(9040, 9040)),
+  Box(Box(9041, 9041), Box(9041, 9041)),
+  Box(Box(9042, 9042), Box(9042, 9042)),
+  Box(Box(9043, 9043), Box(9043, 9043)),
+  Box(Box(9044, 9044), Box(9044, 9044)),
+  Box(Box(9045, 9045), Box(9045, 9045)),
+  Box(Box(9046, 9046), Box(9046, 9046)),
+  Box(Box(9047, 9047), Box(9047, 9047)),
+  Box(Box(9048, 9048), Box(9048, 9048)),
+  Box(Box(9049, 9049), Box(9049, 9049)),
+  Box(Box(9050, 9050), Box(9050, 9050)),
+  Box(Box(9051, 9051), Box(9051, 9051)),
+  Box(Box(9052, 9052), Box(9052, 9052)),
+  Box(Box(9053, 9053), Box(9053, 9053)),
+  Box(Box(9054, 9054), Box(9054, 9054)),
+  Box(Box(9055, 9055), Box(9055, 9055)),
+  Box(Box(9056, 9056), Box(9056, 9056)),
+  Box(Box(9057, 9057), Box(9057, 9057)),
+  Box(Box(9058, 9058), Box(9058, 9058)),
+  Box(Box(9059, 9059), Box(9059, 9059)),
+  Box(Box(9060, 9060), Box(9060, 9060)),
+  Box(Box(9061, 9061), Box(9061, 9061)),
+  Box(Box(9062, 9062), Box(9062, 9062)),
+  Box(Box(9063, 9063), Box(9063, 9063)),
+  Box(Box(9064, 9064), Box(9064, 9064)),
+  Box(Box(9065, 9065), Box(9065, 9065)),
+  Box(Box(9066, 9066), Box(9066, 9066)),
+  Box(Box(9067, 9067), Box(9067, 9067)),
+  Box(Box(9068, 9068), Box(9068, 9068)),
+  Box(Box(9069, 9069), Box(9069, 9069)),
+  Box(Box(9070, 9070), Box(9070, 9070)),
+  Box(Box(9071, 9071), Box(9071, 9071)),
+  Box(Box(9072, 9072), Box(9072, 9072)),
+  Box(Box(9073, 9073), Box(9073, 9073)),
+  Box(Box(9074, 9074), Box(9074, 9074)),
+  Box(Box(9075, 9075), Box(9075, 9075)),
+  Box(Box(9076, 9076), Box(9076, 9076)),
+  Box(Box(9077, 9077), Box(9077, 9077)),
+  Box(Box(9078, 9078), Box(9078, 9078)),
+  Box(Box(9079, 9079), Box(9079, 9079)),
+  Box(Box(9080, 9080), Box(9080, 9080)),
+  Box(Box(9081, 9081), Box(9081, 9081)),
+  Box(Box(9082, 9082), Box(9082, 9082)),
+  Box(Box(9083, 9083), Box(9083, 9083)),
+  Box(Box(9084, 9084), Box(9084, 9084)),
+  Box(Box(9085, 9085), Box(9085, 9085)),
+  Box(Box(9086, 9086), Box(9086, 9086)),
+  Box(Box(9087, 9087), Box(9087, 9087)),
+  Box(Box(9088, 9088), Box(9088, 9088)),
+  Box(Box(9089, 9089), Box(9089, 9089)),
+  Box(Box(9090, 9090), Box(9090, 9090)),
+  Box(Box(9091, 9091), Box(9091, 9091)),
+  Box(Box(9092, 9092), Box(9092, 9092)),
+  Box(Box(9093, 9093), Box(9093, 9093)),
+  Box(Box(9094, 9094), Box(9094, 9094)),
+  Box(Box(9095, 9095), Box(9095, 9095)),
+  Box(Box(9096, 9096), Box(9096, 9096)),
+  Box(Box(9097, 9097), Box(9097, 9097)),
+  Box(Box(9098, 9098), Box(9098, 9098)),
+  Box(Box(9099, 9099), Box(9099, 9099)),
+  Box(Box(9100, 9100), Box(9100, 9100)),
+  Box(Box(9101, 9101), Box(9101, 9101)),
+  Box(Box(9102, 9102), Box(9102, 9102)),
+  Box(Box(9103, 9103), Box(9103, 9103)),
+  Box(Box(9104, 9104), Box(9104, 9104)),
+  Box(Box(9105, 9105), Box(9105, 9105)),
+  Box(Box(9106, 9106), Box(9106, 9106)),
+  Box(Box(9107, 9107), Box(9107, 9107)),
+  Box(Box(9108, 9108), Box(9108, 9108)),
+  Box(Box(9109, 9109), Box(9109, 9109)),
+  Box(Box(9110, 9110), Box(9110, 9110)),
+  Box(Box(9111, 9111), Box(9111, 9111)),
+  Box(Box(9112, 9112), Box(9112, 9112)),
+  Box(Box(9113, 9113), Box(9113, 9113)),
+  Box(Box(9114, 9114), Box(9114, 9114)),
+  Box(Box(9115, 9115), Box(9115, 9115)),
+  Box(Box(9116, 9116), Box(9116, 9116)),
+  Box(Box(9117, 9117), Box(9117, 9117)),
+  Box(Box(9118, 9118), Box(9118, 9118)),
+  Box(Box(9119, 9119), Box(9119, 9119)),
+  Box(Box(9120, 9120), Box(9120, 9120)),
+  Box(Box(9121, 9121), Box(9121, 9121)),
+  Box(Box(9122, 9122), Box(9122, 9122)),
+  Box(Box(9123, 9123), Box(9123, 9123)),
+  Box(Box(9124, 9124), Box(9124, 9124)),
+  Box(Box(9125, 9125), Box(9125, 9125)),
+  Box(Box(9126, 9126), Box(9126, 9126)),
+  Box(Box(9127, 9127), Box(9127, 9127)),
+  Box(Box(9128, 9128), Box(9128, 9128)),
+  Box(Box(9129, 9129), Box(9129, 9129)),
+  Box(Box(9130, 9130), Box(9130, 9130)),
+  Box(Box(9131, 9131), Box(9131, 9131)),
+  Box(Box(9132, 9132), Box(9132, 9132)),
+  Box(Box(9133, 9133), Box(9133, 9133)),
+  Box(Box(9134, 9134), Box(9134, 9134)),
+  Box(Box(9135, 9135), Box(9135, 9135)),
+  Box(Box(9136, 9136), Box(9136, 9136)),
+  Box(Box(9137, 9137), Box(9137, 9137)),
+  Box(Box(9138, 9138), Box(9138, 9138)),
+  Box(Box(9139, 9139), Box(9139, 9139)),
+  Box(Box(9140, 9140), Box(9140, 9140)),
+  Box(Box(9141, 9141), Box(9141, 9141)),
+  Box(Box(9142, 9142), Box(9142, 9142)),
+  Box(Box(9143, 9143), Box(9143, 9143)),
+  Box(Box(9144, 9144), Box(9144, 9144)),
+  Box(Box(9145, 9145), Box(9145, 9145)),
+  Box(Box(9146, 9146), Box(9146, 9146)),
+  Box(Box(9147, 9147), Box(9147, 9147)),
+  Box(Box(9148, 9148), Box(9148, 9148)),
+  Box(Box(9149, 9149), Box(9149, 9149)),
+  Box(Box(9150, 9150), Box(9150, 9150)),
+  Box(Box(9151, 9151), Box(9151, 9151)),
+  Box(Box(9152, 9152), Box(9152, 9152)),
+  Box(Box(9153, 9153), Box(9153, 9153)),
+  Box(Box(9154, 9154), Box(9154, 9154)),
+  Box(Box(9155, 9155), Box(9155, 9155)),
+  Box(Box(9156, 9156), Box(9156, 9156)),
+  Box(Box(9157, 9157), Box(9157, 9157)),
+  Box(Box(9158, 9158), Box(9158, 9158)),
+  Box(Box(9159, 9159), Box(9159, 9159)),
+  Box(Box(9160, 9160), Box(9160, 9160)),
+  Box(Box(9161, 9161), Box(9161, 9161)),
+  Box(Box(9162, 9162), Box(9162, 9162)),
+  Box(Box(9163, 9163), Box(9163, 9163)),
+  Box(Box(9164, 9164), Box(9164, 9164)),
+  Box(Box(9165, 9165), Box(9165, 9165)),
+  Box(Box(9166, 9166), Box(9166, 9166)),
+  Box(Box(9167, 9167), Box(9167, 9167)),
+  Box(Box(9168, 9168), Box(9168, 9168)),
+  Box(Box(9169, 9169), Box(9169, 9169)),
+  Box(Box(9170, 9170), Box(9170, 9170)),
+  Box(Box(9171, 9171), Box(9171, 9171)),
+  Box(Box(9172, 9172), Box(9172, 9172)),
+  Box(Box(9173, 9173), Box(9173, 9173)),
+  Box(Box(9174, 9174), Box(9174, 9174)),
+  Box(Box(9175, 9175), Box(9175, 9175)),
+  Box(Box(9176, 9176), Box(9176, 9176)),
+  Box(Box(9177, 9177), Box(9177, 9177)),
+  Box(Box(9178, 9178), Box(9178, 9178)),
+  Box(Box(9179, 9179), Box(9179, 9179)),
+  Box(Box(9180, 9180), Box(9180, 9180)),
+  Box(Box(9181, 9181), Box(9181, 9181)),
+  Box(Box(9182, 9182), Box(9182, 9182)),
+  Box(Box(9183, 9183), Box(9183, 9183)),
+  Box(Box(9184, 9184), Box(9184, 9184)),
+  Box(Box(9185, 9185), Box(9185, 9185)),
+  Box(Box(9186, 9186), Box(9186, 9186)),
+  Box(Box(9187, 9187), Box(9187, 9187)),
+  Box(Box(9188, 9188), Box(9188, 9188)),
+  Box(Box(9189, 9189), Box(9189, 9189)),
+  Box(Box(9190, 9190), Box(9190, 9190)),
+  Box(Box(9191, 9191), Box(9191, 9191)),
+  Box(Box(9192, 9192), Box(9192, 9192)),
+  Box(Box(9193, 9193), Box(9193, 9193)),
+  Box(Box(9194, 9194), Box(9194, 9194)),
+  Box(Box(9195, 9195), Box(9195, 9195)),
+  Box(Box(9196, 9196), Box(9196, 9196)),
+  Box(Box(9197, 9197), Box(9197, 9197)),
+  Box(Box(9198, 9198), Box(9198, 9198)),
+  Box(Box(9199, 9199), Box(9199, 9199)),
+  Box(Box(9200, 9200), Box(9200, 9200)),
+  Box(Box(9201, 9201), Box(9201, 9201)),
+  Box(Box(9202, 9202), Box(9202, 9202)),
+  Box(Box(9203, 9203), Box(9203, 9203)),
+  Box(Box(9204, 9204), Box(9204, 9204)),
+  Box(Box(9205, 9205), Box(9205, 9205)),
+  Box(Box(9206, 9206), Box(9206, 9206)),
+  Box(Box(9207, 9207), Box(9207, 9207)),
+  Box(Box(9208, 9208), Box(9208, 9208)),
+  Box(Box(9209, 9209), Box(9209, 9209)),
+  Box(Box(9210, 9210), Box(9210, 9210)),
+  Box(Box(9211, 9211), Box(9211, 9211)),
+  Box(Box(9212, 9212), Box(9212, 9212)),
+  Box(Box(9213, 9213), Box(9213, 9213)),
+  Box(Box(9214, 9214), Box(9214, 9214)),
+  Box(Box(9215, 9215), Box(9215, 9215)),
+  Box(Box(9216, 9216), Box(9216, 9216)),
+  Box(Box(9217, 9217), Box(9217, 9217)),
+  Box(Box(9218, 9218), Box(9218, 9218)),
+  Box(Box(9219, 9219), Box(9219, 9219)),
+  Box(Box(9220, 9220), Box(9220, 9220)),
+  Box(Box(9221, 9221), Box(9221, 9221)),
+  Box(Box(9222, 9222), Box(9222, 9222)),
+  Box(Box(9223, 9223), Box(9223, 9223)),
+  Box(Box(9224, 9224), Box(9224, 9224)),
+  Box(Box(9225, 9225), Box(9225, 9225)),
+  Box(Box(9226, 9226), Box(9226, 9226)),
+  Box(Box(9227, 9227), Box(9227, 9227)),
+  Box(Box(9228, 9228), Box(9228, 9228)),
+  Box(Box(9229, 9229), Box(9229, 9229)),
+  Box(Box(9230, 9230), Box(9230, 9230)),
+  Box(Box(9231, 9231), Box(9231, 9231)),
+  Box(Box(9232, 9232), Box(9232, 9232)),
+  Box(Box(9233, 9233), Box(9233, 9233)),
+  Box(Box(9234, 9234), Box(9234, 9234)),
+  Box(Box(9235, 9235), Box(9235, 9235)),
+  Box(Box(9236, 9236), Box(9236, 9236)),
+  Box(Box(9237, 9237), Box(9237, 9237)),
+  Box(Box(9238, 9238), Box(9238, 9238)),
+  Box(Box(9239, 9239), Box(9239, 9239)),
+  Box(Box(9240, 9240), Box(9240, 9240)),
+  Box(Box(9241, 9241), Box(9241, 9241)),
+  Box(Box(9242, 9242), Box(9242, 9242)),
+  Box(Box(9243, 9243), Box(9243, 9243)),
+  Box(Box(9244, 9244), Box(9244, 9244)),
+  Box(Box(9245, 9245), Box(9245, 9245)),
+  Box(Box(9246, 9246), Box(9246, 9246)),
+  Box(Box(9247, 9247), Box(9247, 9247)),
+  Box(Box(9248, 9248), Box(9248, 9248)),
+  Box(Box(9249, 9249), Box(9249, 9249)),
+  Box(Box(9250, 9250), Box(9250, 9250)),
+  Box(Box(9251, 9251), Box(9251, 9251)),
+  Box(Box(9252, 9252), Box(9252, 9252)),
+  Box(Box(9253, 9253), Box(9253, 9253)),
+  Box(Box(9254, 9254), Box(9254, 9254)),
+  Box(Box(9255, 9255), Box(9255, 9255)),
+  Box(Box(9256, 9256), Box(9256, 9256)),
+  Box(Box(9257, 9257), Box(9257, 9257)),
+  Box(Box(9258, 9258), Box(9258, 9258)),
+  Box(Box(9259, 9259), Box(9259, 9259)),
+  Box(Box(9260, 9260), Box(9260, 9260)),
+  Box(Box(9261, 9261), Box(9261, 9261)),
+  Box(Box(9262, 9262), Box(9262, 9262)),
+  Box(Box(9263, 9263), Box(9263, 9263)),
+  Box(Box(9264, 9264), Box(9264, 9264)),
+  Box(Box(9265, 9265), Box(9265, 9265)),
+  Box(Box(9266, 9266), Box(9266, 9266)),
+  Box(Box(9267, 9267), Box(9267, 9267)),
+  Box(Box(9268, 9268), Box(9268, 9268)),
+  Box(Box(9269, 9269), Box(9269, 9269)),
+  Box(Box(9270, 9270), Box(9270, 9270)),
+  Box(Box(9271, 9271), Box(9271, 9271)),
+  Box(Box(9272, 9272), Box(9272, 9272)),
+  Box(Box(9273, 9273), Box(9273, 9273)),
+  Box(Box(9274, 9274), Box(9274, 9274)),
+  Box(Box(9275, 9275), Box(9275, 9275)),
+  Box(Box(9276, 9276), Box(9276, 9276)),
+  Box(Box(9277, 9277), Box(9277, 9277)),
+  Box(Box(9278, 9278), Box(9278, 9278)),
+  Box(Box(9279, 9279), Box(9279, 9279)),
+  Box(Box(9280, 9280), Box(9280, 9280)),
+  Box(Box(9281, 9281), Box(9281, 9281)),
+  Box(Box(9282, 9282), Box(9282, 9282)),
+  Box(Box(9283, 9283), Box(9283, 9283)),
+  Box(Box(9284, 9284), Box(9284, 9284)),
+  Box(Box(9285, 9285), Box(9285, 9285)),
+  Box(Box(9286, 9286), Box(9286, 9286)),
+  Box(Box(9287, 9287), Box(9287, 9287)),
+  Box(Box(9288, 9288), Box(9288, 9288)),
+  Box(Box(9289, 9289), Box(9289, 9289)),
+  Box(Box(9290, 9290), Box(9290, 9290)),
+  Box(Box(9291, 9291), Box(9291, 9291)),
+  Box(Box(9292, 9292), Box(9292, 9292)),
+  Box(Box(9293, 9293), Box(9293, 9293)),
+  Box(Box(9294, 9294), Box(9294, 9294)),
+  Box(Box(9295, 9295), Box(9295, 9295)),
+  Box(Box(9296, 9296), Box(9296, 9296)),
+  Box(Box(9297, 9297), Box(9297, 9297)),
+  Box(Box(9298, 9298), Box(9298, 9298)),
+  Box(Box(9299, 9299), Box(9299, 9299)),
+  Box(Box(9300, 9300), Box(9300, 9300)),
+  Box(Box(9301, 9301), Box(9301, 9301)),
+  Box(Box(9302, 9302), Box(9302, 9302)),
+  Box(Box(9303, 9303), Box(9303, 9303)),
+  Box(Box(9304, 9304), Box(9304, 9304)),
+  Box(Box(9305, 9305), Box(9305, 9305)),
+  Box(Box(9306, 9306), Box(9306, 9306)),
+  Box(Box(9307, 9307), Box(9307, 9307)),
+  Box(Box(9308, 9308), Box(9308, 9308)),
+  Box(Box(9309, 9309), Box(9309, 9309)),
+  Box(Box(9310, 9310), Box(9310, 9310)),
+  Box(Box(9311, 9311), Box(9311, 9311)),
+  Box(Box(9312, 9312), Box(9312, 9312)),
+  Box(Box(9313, 9313), Box(9313, 9313)),
+  Box(Box(9314, 9314), Box(9314, 9314)),
+  Box(Box(9315, 9315), Box(9315, 9315)),
+  Box(Box(9316, 9316), Box(9316, 9316)),
+  Box(Box(9317, 9317), Box(9317, 9317)),
+  Box(Box(9318, 9318), Box(9318, 9318)),
+  Box(Box(9319, 9319), Box(9319, 9319)),
+  Box(Box(9320, 9320), Box(9320, 9320)),
+  Box(Box(9321, 9321), Box(9321, 9321)),
+  Box(Box(9322, 9322), Box(9322, 9322)),
+  Box(Box(9323, 9323), Box(9323, 9323)),
+  Box(Box(9324, 9324), Box(9324, 9324)),
+  Box(Box(9325, 9325), Box(9325, 9325)),
+  Box(Box(9326, 9326), Box(9326, 9326)),
+  Box(Box(9327, 9327), Box(9327, 9327)),
+  Box(Box(9328, 9328), Box(9328, 9328)),
+  Box(Box(9329, 9329), Box(9329, 9329)),
+  Box(Box(9330, 9330), Box(9330, 9330)),
+  Box(Box(9331, 9331), Box(9331, 9331)),
+  Box(Box(9332, 9332), Box(9332, 9332)),
+  Box(Box(9333, 9333), Box(9333, 9333)),
+  Box(Box(9334, 9334), Box(9334, 9334)),
+  Box(Box(9335, 9335), Box(9335, 9335)),
+  Box(Box(9336, 9336), Box(9336, 9336)),
+  Box(Box(9337, 9337), Box(9337, 9337)),
+  Box(Box(9338, 9338), Box(9338, 9338)),
+  Box(Box(9339, 9339), Box(9339, 9339)),
+  Box(Box(9340, 9340), Box(9340, 9340)),
+  Box(Box(9341, 9341), Box(9341, 9341)),
+  Box(Box(9342, 9342), Box(9342, 9342)),
+  Box(Box(9343, 9343), Box(9343, 9343)),
+  Box(Box(9344, 9344), Box(9344, 9344)),
+  Box(Box(9345, 9345), Box(9345, 9345)),
+  Box(Box(9346, 9346), Box(9346, 9346)),
+  Box(Box(9347, 9347), Box(9347, 9347)),
+  Box(Box(9348, 9348), Box(9348, 9348)),
+  Box(Box(9349, 9349), Box(9349, 9349)),
+  Box(Box(9350, 9350), Box(9350, 9350)),
+  Box(Box(9351, 9351), Box(9351, 9351)),
+  Box(Box(9352, 9352), Box(9352, 9352)),
+  Box(Box(9353, 9353), Box(9353, 9353)),
+  Box(Box(9354, 9354), Box(9354, 9354)),
+  Box(Box(9355, 9355), Box(9355, 9355)),
+  Box(Box(9356, 9356), Box(9356, 9356)),
+  Box(Box(9357, 9357), Box(9357, 9357)),
+  Box(Box(9358, 9358), Box(9358, 9358)),
+  Box(Box(9359, 9359), Box(9359, 9359)),
+  Box(Box(9360, 9360), Box(9360, 9360)),
+  Box(Box(9361, 9361), Box(9361, 9361)),
+  Box(Box(9362, 9362), Box(9362, 9362)),
+  Box(Box(9363, 9363), Box(9363, 9363)),
+  Box(Box(9364, 9364), Box(9364, 9364)),
+  Box(Box(9365, 9365), Box(9365, 9365)),
+  Box(Box(9366, 9366), Box(9366, 9366)),
+  Box(Box(9367, 9367), Box(9367, 9367)),
+  Box(Box(9368, 9368), Box(9368, 9368)),
+  Box(Box(9369, 9369), Box(9369, 9369)),
+  Box(Box(9370, 9370), Box(9370, 9370)),
+  Box(Box(9371, 9371), Box(9371, 9371)),
+  Box(Box(9372, 9372), Box(9372, 9372)),
+  Box(Box(9373, 9373), Box(9373, 9373)),
+  Box(Box(9374, 9374), Box(9374, 9374)),
+  Box(Box(9375, 9375), Box(9375, 9375)),
+  Box(Box(9376, 9376), Box(9376, 9376)),
+  Box(Box(9377, 9377), Box(9377, 9377)),
+  Box(Box(9378, 9378), Box(9378, 9378)),
+  Box(Box(9379, 9379), Box(9379, 9379)),
+  Box(Box(9380, 9380), Box(9380, 9380)),
+  Box(Box(9381, 9381), Box(9381, 9381)),
+  Box(Box(9382, 9382), Box(9382, 9382)),
+  Box(Box(9383, 9383), Box(9383, 9383)),
+  Box(Box(9384, 9384), Box(9384, 9384)),
+  Box(Box(9385, 9385), Box(9385, 9385)),
+  Box(Box(9386, 9386), Box(9386, 9386)),
+  Box(Box(9387, 9387), Box(9387, 9387)),
+  Box(Box(9388, 9388), Box(9388, 9388)),
+  Box(Box(9389, 9389), Box(9389, 9389)),
+  Box(Box(9390, 9390), Box(9390, 9390)),
+  Box(Box(9391, 9391), Box(9391, 9391)),
+  Box(Box(9392, 9392), Box(9392, 9392)),
+  Box(Box(9393, 9393), Box(9393, 9393)),
+  Box(Box(9394, 9394), Box(9394, 9394)),
+  Box(Box(9395, 9395), Box(9395, 9395)),
+  Box(Box(9396, 9396), Box(9396, 9396)),
+  Box(Box(9397, 9397), Box(9397, 9397)),
+  Box(Box(9398, 9398), Box(9398, 9398)),
+  Box(Box(9399, 9399), Box(9399, 9399)),
+  Box(Box(9400, 9400), Box(9400, 9400)),
+  Box(Box(9401, 9401), Box(9401, 9401)),
+  Box(Box(9402, 9402), Box(9402, 9402)),
+  Box(Box(9403, 9403), Box(9403, 9403)),
+  Box(Box(9404, 9404), Box(9404, 9404)),
+  Box(Box(9405, 9405), Box(9405, 9405)),
+  Box(Box(9406, 9406), Box(9406, 9406)),
+  Box(Box(9407, 9407), Box(9407, 9407)),
+  Box(Box(9408, 9408), Box(9408, 9408)),
+  Box(Box(9409, 9409), Box(9409, 9409)),
+  Box(Box(9410, 9410), Box(9410, 9410)),
+  Box(Box(9411, 9411), Box(9411, 9411)),
+  Box(Box(9412, 9412), Box(9412, 9412)),
+  Box(Box(9413, 9413), Box(9413, 9413)),
+  Box(Box(9414, 9414), Box(9414, 9414)),
+  Box(Box(9415, 9415), Box(9415, 9415)),
+  Box(Box(9416, 9416), Box(9416, 9416)),
+  Box(Box(9417, 9417), Box(9417, 9417)),
+  Box(Box(9418, 9418), Box(9418, 9418)),
+  Box(Box(9419, 9419), Box(9419, 9419)),
+  Box(Box(9420, 9420), Box(9420, 9420)),
+  Box(Box(9421, 9421), Box(9421, 9421)),
+  Box(Box(9422, 9422), Box(9422, 9422)),
+  Box(Box(9423, 9423), Box(9423, 9423)),
+  Box(Box(9424, 9424), Box(9424, 9424)),
+  Box(Box(9425, 9425), Box(9425, 9425)),
+  Box(Box(9426, 9426), Box(9426, 9426)),
+  Box(Box(9427, 9427), Box(9427, 9427)),
+  Box(Box(9428, 9428), Box(9428, 9428)),
+  Box(Box(9429, 9429), Box(9429, 9429)),
+  Box(Box(9430, 9430), Box(9430, 9430)),
+  Box(Box(9431, 9431), Box(9431, 9431)),
+  Box(Box(9432, 9432), Box(9432, 9432)),
+  Box(Box(9433, 9433), Box(9433, 9433)),
+  Box(Box(9434, 9434), Box(9434, 9434)),
+  Box(Box(9435, 9435), Box(9435, 9435)),
+  Box(Box(9436, 9436), Box(9436, 9436)),
+  Box(Box(9437, 9437), Box(9437, 9437)),
+  Box(Box(9438, 9438), Box(9438, 9438)),
+  Box(Box(9439, 9439), Box(9439, 9439)),
+  Box(Box(9440, 9440), Box(9440, 9440)),
+  Box(Box(9441, 9441), Box(9441, 9441)),
+  Box(Box(9442, 9442), Box(9442, 9442)),
+  Box(Box(9443, 9443), Box(9443, 9443)),
+  Box(Box(9444, 9444), Box(9444, 9444)),
+  Box(Box(9445, 9445), Box(9445, 9445)),
+  Box(Box(9446, 9446), Box(9446, 9446)),
+  Box(Box(9447, 9447), Box(9447, 9447)),
+  Box(Box(9448, 9448), Box(9448, 9448)),
+  Box(Box(9449, 9449), Box(9449, 9449)),
+  Box(Box(9450, 9450), Box(9450, 9450)),
+  Box(Box(9451, 9451), Box(9451, 9451)),
+  Box(Box(9452, 9452), Box(9452, 9452)),
+  Box(Box(9453, 9453), Box(9453, 9453)),
+  Box(Box(9454, 9454), Box(9454, 9454)),
+  Box(Box(9455, 9455), Box(9455, 9455)),
+  Box(Box(9456, 9456), Box(9456, 9456)),
+  Box(Box(9457, 9457), Box(9457, 9457)),
+  Box(Box(9458, 9458), Box(9458, 9458)),
+  Box(Box(9459, 9459), Box(9459, 9459)),
+  Box(Box(9460, 9460), Box(9460, 9460)),
+  Box(Box(9461, 9461), Box(9461, 9461)),
+  Box(Box(9462, 9462), Box(9462, 9462)),
+  Box(Box(9463, 9463), Box(9463, 9463)),
+  Box(Box(9464, 9464), Box(9464, 9464)),
+  Box(Box(9465, 9465), Box(9465, 9465)),
+  Box(Box(9466, 9466), Box(9466, 9466)),
+  Box(Box(9467, 9467), Box(9467, 9467)),
+  Box(Box(9468, 9468), Box(9468, 9468)),
+  Box(Box(9469, 9469), Box(9469, 9469)),
+  Box(Box(9470, 9470), Box(9470, 9470)),
+  Box(Box(9471, 9471), Box(9471, 9471)),
+  Box(Box(9472, 9472), Box(9472, 9472)),
+  Box(Box(9473, 9473), Box(9473, 9473)),
+  Box(Box(9474, 9474), Box(9474, 9474)),
+  Box(Box(9475, 9475), Box(9475, 9475)),
+  Box(Box(9476, 9476), Box(9476, 9476)),
+  Box(Box(9477, 9477), Box(9477, 9477)),
+  Box(Box(9478, 9478), Box(9478, 9478)),
+  Box(Box(9479, 9479), Box(9479, 9479)),
+  Box(Box(9480, 9480), Box(9480, 9480)),
+  Box(Box(9481, 9481), Box(9481, 9481)),
+  Box(Box(9482, 9482), Box(9482, 9482)),
+  Box(Box(9483, 9483), Box(9483, 9483)),
+  Box(Box(9484, 9484), Box(9484, 9484)),
+  Box(Box(9485, 9485), Box(9485, 9485)),
+  Box(Box(9486, 9486), Box(9486, 9486)),
+  Box(Box(9487, 9487), Box(9487, 9487)),
+  Box(Box(9488, 9488), Box(9488, 9488)),
+  Box(Box(9489, 9489), Box(9489, 9489)),
+  Box(Box(9490, 9490), Box(9490, 9490)),
+  Box(Box(9491, 9491), Box(9491, 9491)),
+  Box(Box(9492, 9492), Box(9492, 9492)),
+  Box(Box(9493, 9493), Box(9493, 9493)),
+  Box(Box(9494, 9494), Box(9494, 9494)),
+  Box(Box(9495, 9495), Box(9495, 9495)),
+  Box(Box(9496, 9496), Box(9496, 9496)),
+  Box(Box(9497, 9497), Box(9497, 9497)),
+  Box(Box(9498, 9498), Box(9498, 9498)),
+  Box(Box(9499, 9499), Box(9499, 9499)),
+  Box(Box(9500, 9500), Box(9500, 9500)),
+  Box(Box(9501, 9501), Box(9501, 9501)),
+  Box(Box(9502, 9502), Box(9502, 9502)),
+  Box(Box(9503, 9503), Box(9503, 9503)),
+  Box(Box(9504, 9504), Box(9504, 9504)),
+  Box(Box(9505, 9505), Box(9505, 9505)),
+  Box(Box(9506, 9506), Box(9506, 9506)),
+  Box(Box(9507, 9507), Box(9507, 9507)),
+  Box(Box(9508, 9508), Box(9508, 9508)),
+  Box(Box(9509, 9509), Box(9509, 9509)),
+  Box(Box(9510, 9510), Box(9510, 9510)),
+  Box(Box(9511, 9511), Box(9511, 9511)),
+  Box(Box(9512, 9512), Box(9512, 9512)),
+  Box(Box(9513, 9513), Box(9513, 9513)),
+  Box(Box(9514, 9514), Box(9514, 9514)),
+  Box(Box(9515, 9515), Box(9515, 9515)),
+  Box(Box(9516, 9516), Box(9516, 9516)),
+  Box(Box(9517, 9517), Box(9517, 9517)),
+  Box(Box(9518, 9518), Box(9518, 9518)),
+  Box(Box(9519, 9519), Box(9519, 9519)),
+  Box(Box(9520, 9520), Box(9520, 9520)),
+  Box(Box(9521, 9521), Box(9521, 9521)),
+  Box(Box(9522, 9522), Box(9522, 9522)),
+  Box(Box(9523, 9523), Box(9523, 9523)),
+  Box(Box(9524, 9524), Box(9524, 9524)),
+  Box(Box(9525, 9525), Box(9525, 9525)),
+  Box(Box(9526, 9526), Box(9526, 9526)),
+  Box(Box(9527, 9527), Box(9527, 9527)),
+  Box(Box(9528, 9528), Box(9528, 9528)),
+  Box(Box(9529, 9529), Box(9529, 9529)),
+  Box(Box(9530, 9530), Box(9530, 9530)),
+  Box(Box(9531, 9531), Box(9531, 9531)),
+  Box(Box(9532, 9532), Box(9532, 9532)),
+  Box(Box(9533, 9533), Box(9533, 9533)),
+  Box(Box(9534, 9534), Box(9534, 9534)),
+  Box(Box(9535, 9535), Box(9535, 9535)),
+  Box(Box(9536, 9536), Box(9536, 9536)),
+  Box(Box(9537, 9537), Box(9537, 9537)),
+  Box(Box(9538, 9538), Box(9538, 9538)),
+  Box(Box(9539, 9539), Box(9539, 9539)),
+  Box(Box(9540, 9540), Box(9540, 9540)),
+  Box(Box(9541, 9541), Box(9541, 9541)),
+  Box(Box(9542, 9542), Box(9542, 9542)),
+  Box(Box(9543, 9543), Box(9543, 9543)),
+  Box(Box(9544, 9544), Box(9544, 9544)),
+  Box(Box(9545, 9545), Box(9545, 9545)),
+  Box(Box(9546, 9546), Box(9546, 9546)),
+  Box(Box(9547, 9547), Box(9547, 9547)),
+  Box(Box(9548, 9548), Box(9548, 9548)),
+  Box(Box(9549, 9549), Box(9549, 9549)),
+  Box(Box(9550, 9550), Box(9550, 9550)),
+  Box(Box(9551, 9551), Box(9551, 9551)),
+  Box(Box(9552, 9552), Box(9552, 9552)),
+  Box(Box(9553, 9553), Box(9553, 9553)),
+  Box(Box(9554, 9554), Box(9554, 9554)),
+  Box(Box(9555, 9555), Box(9555, 9555)),
+  Box(Box(9556, 9556), Box(9556, 9556)),
+  Box(Box(9557, 9557), Box(9557, 9557)),
+  Box(Box(9558, 9558), Box(9558, 9558)),
+  Box(Box(9559, 9559), Box(9559, 9559)),
+  Box(Box(9560, 9560), Box(9560, 9560)),
+  Box(Box(9561, 9561), Box(9561, 9561)),
+  Box(Box(9562, 9562), Box(9562, 9562)),
+  Box(Box(9563, 9563), Box(9563, 9563)),
+  Box(Box(9564, 9564), Box(9564, 9564)),
+  Box(Box(9565, 9565), Box(9565, 9565)),
+  Box(Box(9566, 9566), Box(9566, 9566)),
+  Box(Box(9567, 9567), Box(9567, 9567)),
+  Box(Box(9568, 9568), Box(9568, 9568)),
+  Box(Box(9569, 9569), Box(9569, 9569)),
+  Box(Box(9570, 9570), Box(9570, 9570)),
+  Box(Box(9571, 9571), Box(9571, 9571)),
+  Box(Box(9572, 9572), Box(9572, 9572)),
+  Box(Box(9573, 9573), Box(9573, 9573)),
+  Box(Box(9574, 9574), Box(9574, 9574)),
+  Box(Box(9575, 9575), Box(9575, 9575)),
+  Box(Box(9576, 9576), Box(9576, 9576)),
+  Box(Box(9577, 9577), Box(9577, 9577)),
+  Box(Box(9578, 9578), Box(9578, 9578)),
+  Box(Box(9579, 9579), Box(9579, 9579)),
+  Box(Box(9580, 9580), Box(9580, 9580)),
+  Box(Box(9581, 9581), Box(9581, 9581)),
+  Box(Box(9582, 9582), Box(9582, 9582)),
+  Box(Box(9583, 9583), Box(9583, 9583)),
+  Box(Box(9584, 9584), Box(9584, 9584)),
+  Box(Box(9585, 9585), Box(9585, 9585)),
+  Box(Box(9586, 9586), Box(9586, 9586)),
+  Box(Box(9587, 9587), Box(9587, 9587)),
+  Box(Box(9588, 9588), Box(9588, 9588)),
+  Box(Box(9589, 9589), Box(9589, 9589)),
+  Box(Box(9590, 9590), Box(9590, 9590)),
+  Box(Box(9591, 9591), Box(9591, 9591)),
+  Box(Box(9592, 9592), Box(9592, 9592)),
+  Box(Box(9593, 9593), Box(9593, 9593)),
+  Box(Box(9594, 9594), Box(9594, 9594)),
+  Box(Box(9595, 9595), Box(9595, 9595)),
+  Box(Box(9596, 9596), Box(9596, 9596)),
+  Box(Box(9597, 9597), Box(9597, 9597)),
+  Box(Box(9598, 9598), Box(9598, 9598)),
+  Box(Box(9599, 9599), Box(9599, 9599)),
+  Box(Box(9600, 9600), Box(9600, 9600)),
+  Box(Box(9601, 9601), Box(9601, 9601)),
+  Box(Box(9602, 9602), Box(9602, 9602)),
+  Box(Box(9603, 9603), Box(9603, 9603)),
+  Box(Box(9604, 9604), Box(9604, 9604)),
+  Box(Box(9605, 9605), Box(9605, 9605)),
+  Box(Box(9606, 9606), Box(9606, 9606)),
+  Box(Box(9607, 9607), Box(9607, 9607)),
+  Box(Box(9608, 9608), Box(9608, 9608)),
+  Box(Box(9609, 9609), Box(9609, 9609)),
+  Box(Box(9610, 9610), Box(9610, 9610)),
+  Box(Box(9611, 9611), Box(9611, 9611)),
+  Box(Box(9612, 9612), Box(9612, 9612)),
+  Box(Box(9613, 9613), Box(9613, 9613)),
+  Box(Box(9614, 9614), Box(9614, 9614)),
+  Box(Box(9615, 9615), Box(9615, 9615)),
+  Box(Box(9616, 9616), Box(9616, 9616)),
+  Box(Box(9617, 9617), Box(9617, 9617)),
+  Box(Box(9618, 9618), Box(9618, 9618)),
+  Box(Box(9619, 9619), Box(9619, 9619)),
+  Box(Box(9620, 9620), Box(9620, 9620)),
+  Box(Box(9621, 9621), Box(9621, 9621)),
+  Box(Box(9622, 9622), Box(9622, 9622)),
+  Box(Box(9623, 9623), Box(9623, 9623)),
+  Box(Box(9624, 9624), Box(9624, 9624)),
+  Box(Box(9625, 9625), Box(9625, 9625)),
+  Box(Box(9626, 9626), Box(9626, 9626)),
+  Box(Box(9627, 9627), Box(9627, 9627)),
+  Box(Box(9628, 9628), Box(9628, 9628)),
+  Box(Box(9629, 9629), Box(9629, 9629)),
+  Box(Box(9630, 9630), Box(9630, 9630)),
+  Box(Box(9631, 9631), Box(9631, 9631)),
+  Box(Box(9632, 9632), Box(9632, 9632)),
+  Box(Box(9633, 9633), Box(9633, 9633)),
+  Box(Box(9634, 9634), Box(9634, 9634)),
+  Box(Box(9635, 9635), Box(9635, 9635)),
+  Box(Box(9636, 9636), Box(9636, 9636)),
+  Box(Box(9637, 9637), Box(9637, 9637)),
+  Box(Box(9638, 9638), Box(9638, 9638)),
+  Box(Box(9639, 9639), Box(9639, 9639)),
+  Box(Box(9640, 9640), Box(9640, 9640)),
+  Box(Box(9641, 9641), Box(9641, 9641)),
+  Box(Box(9642, 9642), Box(9642, 9642)),
+  Box(Box(9643, 9643), Box(9643, 9643)),
+  Box(Box(9644, 9644), Box(9644, 9644)),
+  Box(Box(9645, 9645), Box(9645, 9645)),
+  Box(Box(9646, 9646), Box(9646, 9646)),
+  Box(Box(9647, 9647), Box(9647, 9647)),
+  Box(Box(9648, 9648), Box(9648, 9648)),
+  Box(Box(9649, 9649), Box(9649, 9649)),
+  Box(Box(9650, 9650), Box(9650, 9650)),
+  Box(Box(9651, 9651), Box(9651, 9651)),
+  Box(Box(9652, 9652), Box(9652, 9652)),
+  Box(Box(9653, 9653), Box(9653, 9653)),
+  Box(Box(9654, 9654), Box(9654, 9654)),
+  Box(Box(9655, 9655), Box(9655, 9655)),
+  Box(Box(9656, 9656), Box(9656, 9656)),
+  Box(Box(9657, 9657), Box(9657, 9657)),
+  Box(Box(9658, 9658), Box(9658, 9658)),
+  Box(Box(9659, 9659), Box(9659, 9659)),
+  Box(Box(9660, 9660), Box(9660, 9660)),
+  Box(Box(9661, 9661), Box(9661, 9661)),
+  Box(Box(9662, 9662), Box(9662, 9662)),
+  Box(Box(9663, 9663), Box(9663, 9663)),
+  Box(Box(9664, 9664), Box(9664, 9664)),
+  Box(Box(9665, 9665), Box(9665, 9665)),
+  Box(Box(9666, 9666), Box(9666, 9666)),
+  Box(Box(9667, 9667), Box(9667, 9667)),
+  Box(Box(9668, 9668), Box(9668, 9668)),
+  Box(Box(9669, 9669), Box(9669, 9669)),
+  Box(Box(9670, 9670), Box(9670, 9670)),
+  Box(Box(9671, 9671), Box(9671, 9671)),
+  Box(Box(9672, 9672), Box(9672, 9672)),
+  Box(Box(9673, 9673), Box(9673, 9673)),
+  Box(Box(9674, 9674), Box(9674, 9674)),
+  Box(Box(9675, 9675), Box(9675, 9675)),
+  Box(Box(9676, 9676), Box(9676, 9676)),
+  Box(Box(9677, 9677), Box(9677, 9677)),
+  Box(Box(9678, 9678), Box(9678, 9678)),
+  Box(Box(9679, 9679), Box(9679, 9679)),
+  Box(Box(9680, 9680), Box(9680, 9680)),
+  Box(Box(9681, 9681), Box(9681, 9681)),
+  Box(Box(9682, 9682), Box(9682, 9682)),
+  Box(Box(9683, 9683), Box(9683, 9683)),
+  Box(Box(9684, 9684), Box(9684, 9684)),
+  Box(Box(9685, 9685), Box(9685, 9685)),
+  Box(Box(9686, 9686), Box(9686, 9686)),
+  Box(Box(9687, 9687), Box(9687, 9687)),
+  Box(Box(9688, 9688), Box(9688, 9688)),
+  Box(Box(9689, 9689), Box(9689, 9689)),
+  Box(Box(9690, 9690), Box(9690, 9690)),
+  Box(Box(9691, 9691), Box(9691, 9691)),
+  Box(Box(9692, 9692), Box(9692, 9692)),
+  Box(Box(9693, 9693), Box(9693, 9693)),
+  Box(Box(9694, 9694), Box(9694, 9694)),
+  Box(Box(9695, 9695), Box(9695, 9695)),
+  Box(Box(9696, 9696), Box(9696, 9696)),
+  Box(Box(9697, 9697), Box(9697, 9697)),
+  Box(Box(9698, 9698), Box(9698, 9698)),
+  Box(Box(9699, 9699), Box(9699, 9699)),
+  Box(Box(9700, 9700), Box(9700, 9700)),
+  Box(Box(9701, 9701), Box(9701, 9701)),
+  Box(Box(9702, 9702), Box(9702, 9702)),
+  Box(Box(9703, 9703), Box(9703, 9703)),
+  Box(Box(9704, 9704), Box(9704, 9704)),
+  Box(Box(9705, 9705), Box(9705, 9705)),
+  Box(Box(9706, 9706), Box(9706, 9706)),
+  Box(Box(9707, 9707), Box(9707, 9707)),
+  Box(Box(9708, 9708), Box(9708, 9708)),
+  Box(Box(9709, 9709), Box(9709, 9709)),
+  Box(Box(9710, 9710), Box(9710, 9710)),
+  Box(Box(9711, 9711), Box(9711, 9711)),
+  Box(Box(9712, 9712), Box(9712, 9712)),
+  Box(Box(9713, 9713), Box(9713, 9713)),
+  Box(Box(9714, 9714), Box(9714, 9714)),
+  Box(Box(9715, 9715), Box(9715, 9715)),
+  Box(Box(9716, 9716), Box(9716, 9716)),
+  Box(Box(9717, 9717), Box(9717, 9717)),
+  Box(Box(9718, 9718), Box(9718, 9718)),
+  Box(Box(9719, 9719), Box(9719, 9719)),
+  Box(Box(9720, 9720), Box(9720, 9720)),
+  Box(Box(9721, 9721), Box(9721, 9721)),
+  Box(Box(9722, 9722), Box(9722, 9722)),
+  Box(Box(9723, 9723), Box(9723, 9723)),
+  Box(Box(9724, 9724), Box(9724, 9724)),
+  Box(Box(9725, 9725), Box(9725, 9725)),
+  Box(Box(9726, 9726), Box(9726, 9726)),
+  Box(Box(9727, 9727), Box(9727, 9727)),
+  Box(Box(9728, 9728), Box(9728, 9728)),
+  Box(Box(9729, 9729), Box(9729, 9729)),
+  Box(Box(9730, 9730), Box(9730, 9730)),
+  Box(Box(9731, 9731), Box(9731, 9731)),
+  Box(Box(9732, 9732), Box(9732, 9732)),
+  Box(Box(9733, 9733), Box(9733, 9733)),
+  Box(Box(9734, 9734), Box(9734, 9734)),
+  Box(Box(9735, 9735), Box(9735, 9735)),
+  Box(Box(9736, 9736), Box(9736, 9736)),
+  Box(Box(9737, 9737), Box(9737, 9737)),
+  Box(Box(9738, 9738), Box(9738, 9738)),
+  Box(Box(9739, 9739), Box(9739, 9739)),
+  Box(Box(9740, 9740), Box(9740, 9740)),
+  Box(Box(9741, 9741), Box(9741, 9741)),
+  Box(Box(9742, 9742), Box(9742, 9742)),
+  Box(Box(9743, 9743), Box(9743, 9743)),
+  Box(Box(9744, 9744), Box(9744, 9744)),
+  Box(Box(9745, 9745), Box(9745, 9745)),
+  Box(Box(9746, 9746), Box(9746, 9746)),
+  Box(Box(9747, 9747), Box(9747, 9747)),
+  Box(Box(9748, 9748), Box(9748, 9748)),
+  Box(Box(9749, 9749), Box(9749, 9749)),
+  Box(Box(9750, 9750), Box(9750, 9750)),
+  Box(Box(9751, 9751), Box(9751, 9751)),
+  Box(Box(9752, 9752), Box(9752, 9752)),
+  Box(Box(9753, 9753), Box(9753, 9753)),
+  Box(Box(9754, 9754), Box(9754, 9754)),
+  Box(Box(9755, 9755), Box(9755, 9755)),
+  Box(Box(9756, 9756), Box(9756, 9756)),
+  Box(Box(9757, 9757), Box(9757, 9757)),
+  Box(Box(9758, 9758), Box(9758, 9758)),
+  Box(Box(9759, 9759), Box(9759, 9759)),
+  Box(Box(9760, 9760), Box(9760, 9760)),
+  Box(Box(9761, 9761), Box(9761, 9761)),
+  Box(Box(9762, 9762), Box(9762, 9762)),
+  Box(Box(9763, 9763), Box(9763, 9763)),
+  Box(Box(9764, 9764), Box(9764, 9764)),
+  Box(Box(9765, 9765), Box(9765, 9765)),
+  Box(Box(9766, 9766), Box(9766, 9766)),
+  Box(Box(9767, 9767), Box(9767, 9767)),
+  Box(Box(9768, 9768), Box(9768, 9768)),
+  Box(Box(9769, 9769), Box(9769, 9769)),
+  Box(Box(9770, 9770), Box(9770, 9770)),
+  Box(Box(9771, 9771), Box(9771, 9771)),
+  Box(Box(9772, 9772), Box(9772, 9772)),
+  Box(Box(9773, 9773), Box(9773, 9773)),
+  Box(Box(9774, 9774), Box(9774, 9774)),
+  Box(Box(9775, 9775), Box(9775, 9775)),
+  Box(Box(9776, 9776), Box(9776, 9776)),
+  Box(Box(9777, 9777), Box(9777, 9777)),
+  Box(Box(9778, 9778), Box(9778, 9778)),
+  Box(Box(9779, 9779), Box(9779, 9779)),
+  Box(Box(9780, 9780), Box(9780, 9780)),
+  Box(Box(9781, 9781), Box(9781, 9781)),
+  Box(Box(9782, 9782), Box(9782, 9782)),
+  Box(Box(9783, 9783), Box(9783, 9783)),
+  Box(Box(9784, 9784), Box(9784, 9784)),
+  Box(Box(9785, 9785), Box(9785, 9785)),
+  Box(Box(9786, 9786), Box(9786, 9786)),
+  Box(Box(9787, 9787), Box(9787, 9787)),
+  Box(Box(9788, 9788), Box(9788, 9788)),
+  Box(Box(9789, 9789), Box(9789, 9789)),
+  Box(Box(9790, 9790), Box(9790, 9790)),
+  Box(Box(9791, 9791), Box(9791, 9791)),
+  Box(Box(9792, 9792), Box(9792, 9792)),
+  Box(Box(9793, 9793), Box(9793, 9793)),
+  Box(Box(9794, 9794), Box(9794, 9794)),
+  Box(Box(9795, 9795), Box(9795, 9795)),
+  Box(Box(9796, 9796), Box(9796, 9796)),
+  Box(Box(9797, 9797), Box(9797, 9797)),
+  Box(Box(9798, 9798), Box(9798, 9798)),
+  Box(Box(9799, 9799), Box(9799, 9799)),
+  Box(Box(9800, 9800), Box(9800, 9800)),
+  Box(Box(9801, 9801), Box(9801, 9801)),
+  Box(Box(9802, 9802), Box(9802, 9802)),
+  Box(Box(9803, 9803), Box(9803, 9803)),
+  Box(Box(9804, 9804), Box(9804, 9804)),
+  Box(Box(9805, 9805), Box(9805, 9805)),
+  Box(Box(9806, 9806), Box(9806, 9806)),
+  Box(Box(9807, 9807), Box(9807, 9807)),
+  Box(Box(9808, 9808), Box(9808, 9808)),
+  Box(Box(9809, 9809), Box(9809, 9809)),
+  Box(Box(9810, 9810), Box(9810, 9810)),
+  Box(Box(9811, 9811), Box(9811, 9811)),
+  Box(Box(9812, 9812), Box(9812, 9812)),
+  Box(Box(9813, 9813), Box(9813, 9813)),
+  Box(Box(9814, 9814), Box(9814, 9814)),
+  Box(Box(9815, 9815), Box(9815, 9815)),
+  Box(Box(9816, 9816), Box(9816, 9816)),
+  Box(Box(9817, 9817), Box(9817, 9817)),
+  Box(Box(9818, 9818), Box(9818, 9818)),
+  Box(Box(9819, 9819), Box(9819, 9819)),
+  Box(Box(9820, 9820), Box(9820, 9820)),
+  Box(Box(9821, 9821), Box(9821, 9821)),
+  Box(Box(9822, 9822), Box(9822, 9822)),
+  Box(Box(9823, 9823), Box(9823, 9823)),
+  Box(Box(9824, 9824), Box(9824, 9824)),
+  Box(Box(9825, 9825), Box(9825, 9825)),
+  Box(Box(9826, 9826), Box(9826, 9826)),
+  Box(Box(9827, 9827), Box(9827, 9827)),
+  Box(Box(9828, 9828), Box(9828, 9828)),
+  Box(Box(9829, 9829), Box(9829, 9829)),
+  Box(Box(9830, 9830), Box(9830, 9830)),
+  Box(Box(9831, 9831), Box(9831, 9831)),
+  Box(Box(9832, 9832), Box(9832, 9832)),
+  Box(Box(9833, 9833), Box(9833, 9833)),
+  Box(Box(9834, 9834), Box(9834, 9834)),
+  Box(Box(9835, 9835), Box(9835, 9835)),
+  Box(Box(9836, 9836), Box(9836, 9836)),
+  Box(Box(9837, 9837), Box(9837, 9837)),
+  Box(Box(9838, 9838), Box(9838, 9838)),
+  Box(Box(9839, 9839), Box(9839, 9839)),
+  Box(Box(9840, 9840), Box(9840, 9840)),
+  Box(Box(9841, 9841), Box(9841, 9841)),
+  Box(Box(9842, 9842), Box(9842, 9842)),
+  Box(Box(9843, 9843), Box(9843, 9843)),
+  Box(Box(9844, 9844), Box(9844, 9844)),
+  Box(Box(9845, 9845), Box(9845, 9845)),
+  Box(Box(9846, 9846), Box(9846, 9846)),
+  Box(Box(9847, 9847), Box(9847, 9847)),
+  Box(Box(9848, 9848), Box(9848, 9848)),
+  Box(Box(9849, 9849), Box(9849, 9849)),
+  Box(Box(9850, 9850), Box(9850, 9850)),
+  Box(Box(9851, 9851), Box(9851, 9851)),
+  Box(Box(9852, 9852), Box(9852, 9852)),
+  Box(Box(9853, 9853), Box(9853, 9853)),
+  Box(Box(9854, 9854), Box(9854, 9854)),
+  Box(Box(9855, 9855), Box(9855, 9855)),
+  Box(Box(9856, 9856), Box(9856, 9856)),
+  Box(Box(9857, 9857), Box(9857, 9857)),
+  Box(Box(9858, 9858), Box(9858, 9858)),
+  Box(Box(9859, 9859), Box(9859, 9859)),
+  Box(Box(9860, 9860), Box(9860, 9860)),
+  Box(Box(9861, 9861), Box(9861, 9861)),
+  Box(Box(9862, 9862), Box(9862, 9862)),
+  Box(Box(9863, 9863), Box(9863, 9863)),
+  Box(Box(9864, 9864), Box(9864, 9864)),
+  Box(Box(9865, 9865), Box(9865, 9865)),
+  Box(Box(9866, 9866), Box(9866, 9866)),
+  Box(Box(9867, 9867), Box(9867, 9867)),
+  Box(Box(9868, 9868), Box(9868, 9868)),
+  Box(Box(9869, 9869), Box(9869, 9869)),
+  Box(Box(9870, 9870), Box(9870, 9870)),
+  Box(Box(9871, 9871), Box(9871, 9871)),
+  Box(Box(9872, 9872), Box(9872, 9872)),
+  Box(Box(9873, 9873), Box(9873, 9873)),
+  Box(Box(9874, 9874), Box(9874, 9874)),
+  Box(Box(9875, 9875), Box(9875, 9875)),
+  Box(Box(9876, 9876), Box(9876, 9876)),
+  Box(Box(9877, 9877), Box(9877, 9877)),
+  Box(Box(9878, 9878), Box(9878, 9878)),
+  Box(Box(9879, 9879), Box(9879, 9879)),
+  Box(Box(9880, 9880), Box(9880, 9880)),
+  Box(Box(9881, 9881), Box(9881, 9881)),
+  Box(Box(9882, 9882), Box(9882, 9882)),
+  Box(Box(9883, 9883), Box(9883, 9883)),
+  Box(Box(9884, 9884), Box(9884, 9884)),
+  Box(Box(9885, 9885), Box(9885, 9885)),
+  Box(Box(9886, 9886), Box(9886, 9886)),
+  Box(Box(9887, 9887), Box(9887, 9887)),
+  Box(Box(9888, 9888), Box(9888, 9888)),
+  Box(Box(9889, 9889), Box(9889, 9889)),
+  Box(Box(9890, 9890), Box(9890, 9890)),
+  Box(Box(9891, 9891), Box(9891, 9891)),
+  Box(Box(9892, 9892), Box(9892, 9892)),
+  Box(Box(9893, 9893), Box(9893, 9893)),
+  Box(Box(9894, 9894), Box(9894, 9894)),
+  Box(Box(9895, 9895), Box(9895, 9895)),
+  Box(Box(9896, 9896), Box(9896, 9896)),
+  Box(Box(9897, 9897), Box(9897, 9897)),
+  Box(Box(9898, 9898), Box(9898, 9898)),
+  Box(Box(9899, 9899), Box(9899, 9899)),
+  Box(Box(9900, 9900), Box(9900, 9900)),
+  Box(Box(9901, 9901), Box(9901, 9901)),
+  Box(Box(9902, 9902), Box(9902, 9902)),
+  Box(Box(9903, 9903), Box(9903, 9903)),
+  Box(Box(9904, 9904), Box(9904, 9904)),
+  Box(Box(9905, 9905), Box(9905, 9905)),
+  Box(Box(9906, 9906), Box(9906, 9906)),
+  Box(Box(9907, 9907), Box(9907, 9907)),
+  Box(Box(9908, 9908), Box(9908, 9908)),
+  Box(Box(9909, 9909), Box(9909, 9909)),
+  Box(Box(9910, 9910), Box(9910, 9910)),
+  Box(Box(9911, 9911), Box(9911, 9911)),
+  Box(Box(9912, 9912), Box(9912, 9912)),
+  Box(Box(9913, 9913), Box(9913, 9913)),
+  Box(Box(9914, 9914), Box(9914, 9914)),
+  Box(Box(9915, 9915), Box(9915, 9915)),
+  Box(Box(9916, 9916), Box(9916, 9916)),
+  Box(Box(9917, 9917), Box(9917, 9917)),
+  Box(Box(9918, 9918), Box(9918, 9918)),
+  Box(Box(9919, 9919), Box(9919, 9919)),
+  Box(Box(9920, 9920), Box(9920, 9920)),
+  Box(Box(9921, 9921), Box(9921, 9921)),
+  Box(Box(9922, 9922), Box(9922, 9922)),
+  Box(Box(9923, 9923), Box(9923, 9923)),
+  Box(Box(9924, 9924), Box(9924, 9924)),
+  Box(Box(9925, 9925), Box(9925, 9925)),
+  Box(Box(9926, 9926), Box(9926, 9926)),
+  Box(Box(9927, 9927), Box(9927, 9927)),
+  Box(Box(9928, 9928), Box(9928, 9928)),
+  Box(Box(9929, 9929), Box(9929, 9929)),
+  Box(Box(9930, 9930), Box(9930, 9930)),
+  Box(Box(9931, 9931), Box(9931, 9931)),
+  Box(Box(9932, 9932), Box(9932, 9932)),
+  Box(Box(9933, 9933), Box(9933, 9933)),
+  Box(Box(9934, 9934), Box(9934, 9934)),
+  Box(Box(9935, 9935), Box(9935, 9935)),
+  Box(Box(9936, 9936), Box(9936, 9936)),
+  Box(Box(9937, 9937), Box(9937, 9937)),
+  Box(Box(9938, 9938), Box(9938, 9938)),
+  Box(Box(9939, 9939), Box(9939, 9939)),
+  Box(Box(9940, 9940), Box(9940, 9940)),
+  Box(Box(9941, 9941), Box(9941, 9941)),
+  Box(Box(9942, 9942), Box(9942, 9942)),
+  Box(Box(9943, 9943), Box(9943, 9943)),
+  Box(Box(9944, 9944), Box(9944, 9944)),
+  Box(Box(9945, 9945), Box(9945, 9945)),
+  Box(Box(9946, 9946), Box(9946, 9946)),
+  Box(Box(9947, 9947), Box(9947, 9947)),
+  Box(Box(9948, 9948), Box(9948, 9948)),
+  Box(Box(9949, 9949), Box(9949, 9949)),
+  Box(Box(9950, 9950), Box(9950, 9950)),
+  Box(Box(9951, 9951), Box(9951, 9951)),
+  Box(Box(9952, 9952), Box(9952, 9952)),
+  Box(Box(9953, 9953), Box(9953, 9953)),
+  Box(Box(9954, 9954), Box(9954, 9954)),
+  Box(Box(9955, 9955), Box(9955, 9955)),
+  Box(Box(9956, 9956), Box(9956, 9956)),
+  Box(Box(9957, 9957), Box(9957, 9957)),
+  Box(Box(9958, 9958), Box(9958, 9958)),
+  Box(Box(9959, 9959), Box(9959, 9959)),
+  Box(Box(9960, 9960), Box(9960, 9960)),
+  Box(Box(9961, 9961), Box(9961, 9961)),
+  Box(Box(9962, 9962), Box(9962, 9962)),
+  Box(Box(9963, 9963), Box(9963, 9963)),
+  Box(Box(9964, 9964), Box(9964, 9964)),
+  Box(Box(9965, 9965), Box(9965, 9965)),
+  Box(Box(9966, 9966), Box(9966, 9966)),
+  Box(Box(9967, 9967), Box(9967, 9967)),
+  Box(Box(9968, 9968), Box(9968, 9968)),
+  Box(Box(9969, 9969), Box(9969, 9969)),
+  Box(Box(9970, 9970), Box(9970, 9970)),
+  Box(Box(9971, 9971), Box(9971, 9971)),
+  Box(Box(9972, 9972), Box(9972, 9972)),
+  Box(Box(9973, 9973), Box(9973, 9973)),
+  Box(Box(9974, 9974), Box(9974, 9974)),
+  Box(Box(9975, 9975), Box(9975, 9975)),
+  Box(Box(9976, 9976), Box(9976, 9976)),
+  Box(Box(9977, 9977), Box(9977, 9977)),
+  Box(Box(9978, 9978), Box(9978, 9978)),
+  Box(Box(9979, 9979), Box(9979, 9979)),
+  Box(Box(9980, 9980), Box(9980, 9980)),
+  Box(Box(9981, 9981), Box(9981, 9981)),
+  Box(Box(9982, 9982), Box(9982, 9982)),
+  Box(Box(9983, 9983), Box(9983, 9983)),
+  Box(Box(9984, 9984), Box(9984, 9984)),
+  Box(Box(9985, 9985), Box(9985, 9985)),
+  Box(Box(9986, 9986), Box(9986, 9986)),
+  Box(Box(9987, 9987), Box(9987, 9987)),
+  Box(Box(9988, 9988), Box(9988, 9988)),
+  Box(Box(9989, 9989), Box(9989, 9989)),
+  Box(Box(9990, 9990), Box(9990, 9990)),
+  Box(Box(9991, 9991), Box(9991, 9991)),
+  Box(Box(9992, 9992), Box(9992, 9992)),
+  Box(Box(9993, 9993), Box(9993, 9993)),
+  Box(Box(9994, 9994), Box(9994, 9994)),
+  Box(Box(9995, 9995), Box(9995, 9995)),
+  Box(Box(9996, 9996), Box(9996, 9996)),
+  Box(Box(9997, 9997), Box(9997, 9997)),
+  Box(Box(9998, 9998), Box(9998, 9998)),
+  Box(Box(9999, 9999), Box(9999, 9999)),
+];
+
+confuse(x) {
+  try {
+    throw x;
+  } catch (e) {
+    return e;
+  }
+}
+
+main() {
+  if (!identical(confuse(list1), confuse(list2))) {
+    throw new Exception("list1 !== list2");
+  }
+}
diff --git a/tests/language_2/canonicalization_hashing_shallow_collision_instance_test.dart b/tests/language_2/canonicalization_hashing_shallow_collision_instance_test.dart
new file mode 100644
index 0000000..2de48b2
--- /dev/null
+++ b/tests/language_2/canonicalization_hashing_shallow_collision_instance_test.dart
@@ -0,0 +1,20029 @@
+// 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.
+
+// If canonicialization hashes with only a field's cid, this will exhibit
+// quadratic time.
+
+class Box {
+  final Object content;
+  const Box(this.content);
+}
+
+// 10,000 elements.
+const list1 = [
+Box(Box(0)),
+Box(Box(1)),
+Box(Box(2)),
+Box(Box(3)),
+Box(Box(4)),
+Box(Box(5)),
+Box(Box(6)),
+Box(Box(7)),
+Box(Box(8)),
+Box(Box(9)),
+Box(Box(10)),
+Box(Box(11)),
+Box(Box(12)),
+Box(Box(13)),
+Box(Box(14)),
+Box(Box(15)),
+Box(Box(16)),
+Box(Box(17)),
+Box(Box(18)),
+Box(Box(19)),
+Box(Box(20)),
+Box(Box(21)),
+Box(Box(22)),
+Box(Box(23)),
+Box(Box(24)),
+Box(Box(25)),
+Box(Box(26)),
+Box(Box(27)),
+Box(Box(28)),
+Box(Box(29)),
+Box(Box(30)),
+Box(Box(31)),
+Box(Box(32)),
+Box(Box(33)),
+Box(Box(34)),
+Box(Box(35)),
+Box(Box(36)),
+Box(Box(37)),
+Box(Box(38)),
+Box(Box(39)),
+Box(Box(40)),
+Box(Box(41)),
+Box(Box(42)),
+Box(Box(43)),
+Box(Box(44)),
+Box(Box(45)),
+Box(Box(46)),
+Box(Box(47)),
+Box(Box(48)),
+Box(Box(49)),
+Box(Box(50)),
+Box(Box(51)),
+Box(Box(52)),
+Box(Box(53)),
+Box(Box(54)),
+Box(Box(55)),
+Box(Box(56)),
+Box(Box(57)),
+Box(Box(58)),
+Box(Box(59)),
+Box(Box(60)),
+Box(Box(61)),
+Box(Box(62)),
+Box(Box(63)),
+Box(Box(64)),
+Box(Box(65)),
+Box(Box(66)),
+Box(Box(67)),
+Box(Box(68)),
+Box(Box(69)),
+Box(Box(70)),
+Box(Box(71)),
+Box(Box(72)),
+Box(Box(73)),
+Box(Box(74)),
+Box(Box(75)),
+Box(Box(76)),
+Box(Box(77)),
+Box(Box(78)),
+Box(Box(79)),
+Box(Box(80)),
+Box(Box(81)),
+Box(Box(82)),
+Box(Box(83)),
+Box(Box(84)),
+Box(Box(85)),
+Box(Box(86)),
+Box(Box(87)),
+Box(Box(88)),
+Box(Box(89)),
+Box(Box(90)),
+Box(Box(91)),
+Box(Box(92)),
+Box(Box(93)),
+Box(Box(94)),
+Box(Box(95)),
+Box(Box(96)),
+Box(Box(97)),
+Box(Box(98)),
+Box(Box(99)),
+Box(Box(100)),
+Box(Box(101)),
+Box(Box(102)),
+Box(Box(103)),
+Box(Box(104)),
+Box(Box(105)),
+Box(Box(106)),
+Box(Box(107)),
+Box(Box(108)),
+Box(Box(109)),
+Box(Box(110)),
+Box(Box(111)),
+Box(Box(112)),
+Box(Box(113)),
+Box(Box(114)),
+Box(Box(115)),
+Box(Box(116)),
+Box(Box(117)),
+Box(Box(118)),
+Box(Box(119)),
+Box(Box(120)),
+Box(Box(121)),
+Box(Box(122)),
+Box(Box(123)),
+Box(Box(124)),
+Box(Box(125)),
+Box(Box(126)),
+Box(Box(127)),
+Box(Box(128)),
+Box(Box(129)),
+Box(Box(130)),
+Box(Box(131)),
+Box(Box(132)),
+Box(Box(133)),
+Box(Box(134)),
+Box(Box(135)),
+Box(Box(136)),
+Box(Box(137)),
+Box(Box(138)),
+Box(Box(139)),
+Box(Box(140)),
+Box(Box(141)),
+Box(Box(142)),
+Box(Box(143)),
+Box(Box(144)),
+Box(Box(145)),
+Box(Box(146)),
+Box(Box(147)),
+Box(Box(148)),
+Box(Box(149)),
+Box(Box(150)),
+Box(Box(151)),
+Box(Box(152)),
+Box(Box(153)),
+Box(Box(154)),
+Box(Box(155)),
+Box(Box(156)),
+Box(Box(157)),
+Box(Box(158)),
+Box(Box(159)),
+Box(Box(160)),
+Box(Box(161)),
+Box(Box(162)),
+Box(Box(163)),
+Box(Box(164)),
+Box(Box(165)),
+Box(Box(166)),
+Box(Box(167)),
+Box(Box(168)),
+Box(Box(169)),
+Box(Box(170)),
+Box(Box(171)),
+Box(Box(172)),
+Box(Box(173)),
+Box(Box(174)),
+Box(Box(175)),
+Box(Box(176)),
+Box(Box(177)),
+Box(Box(178)),
+Box(Box(179)),
+Box(Box(180)),
+Box(Box(181)),
+Box(Box(182)),
+Box(Box(183)),
+Box(Box(184)),
+Box(Box(185)),
+Box(Box(186)),
+Box(Box(187)),
+Box(Box(188)),
+Box(Box(189)),
+Box(Box(190)),
+Box(Box(191)),
+Box(Box(192)),
+Box(Box(193)),
+Box(Box(194)),
+Box(Box(195)),
+Box(Box(196)),
+Box(Box(197)),
+Box(Box(198)),
+Box(Box(199)),
+Box(Box(200)),
+Box(Box(201)),
+Box(Box(202)),
+Box(Box(203)),
+Box(Box(204)),
+Box(Box(205)),
+Box(Box(206)),
+Box(Box(207)),
+Box(Box(208)),
+Box(Box(209)),
+Box(Box(210)),
+Box(Box(211)),
+Box(Box(212)),
+Box(Box(213)),
+Box(Box(214)),
+Box(Box(215)),
+Box(Box(216)),
+Box(Box(217)),
+Box(Box(218)),
+Box(Box(219)),
+Box(Box(220)),
+Box(Box(221)),
+Box(Box(222)),
+Box(Box(223)),
+Box(Box(224)),
+Box(Box(225)),
+Box(Box(226)),
+Box(Box(227)),
+Box(Box(228)),
+Box(Box(229)),
+Box(Box(230)),
+Box(Box(231)),
+Box(Box(232)),
+Box(Box(233)),
+Box(Box(234)),
+Box(Box(235)),
+Box(Box(236)),
+Box(Box(237)),
+Box(Box(238)),
+Box(Box(239)),
+Box(Box(240)),
+Box(Box(241)),
+Box(Box(242)),
+Box(Box(243)),
+Box(Box(244)),
+Box(Box(245)),
+Box(Box(246)),
+Box(Box(247)),
+Box(Box(248)),
+Box(Box(249)),
+Box(Box(250)),
+Box(Box(251)),
+Box(Box(252)),
+Box(Box(253)),
+Box(Box(254)),
+Box(Box(255)),
+Box(Box(256)),
+Box(Box(257)),
+Box(Box(258)),
+Box(Box(259)),
+Box(Box(260)),
+Box(Box(261)),
+Box(Box(262)),
+Box(Box(263)),
+Box(Box(264)),
+Box(Box(265)),
+Box(Box(266)),
+Box(Box(267)),
+Box(Box(268)),
+Box(Box(269)),
+Box(Box(270)),
+Box(Box(271)),
+Box(Box(272)),
+Box(Box(273)),
+Box(Box(274)),
+Box(Box(275)),
+Box(Box(276)),
+Box(Box(277)),
+Box(Box(278)),
+Box(Box(279)),
+Box(Box(280)),
+Box(Box(281)),
+Box(Box(282)),
+Box(Box(283)),
+Box(Box(284)),
+Box(Box(285)),
+Box(Box(286)),
+Box(Box(287)),
+Box(Box(288)),
+Box(Box(289)),
+Box(Box(290)),
+Box(Box(291)),
+Box(Box(292)),
+Box(Box(293)),
+Box(Box(294)),
+Box(Box(295)),
+Box(Box(296)),
+Box(Box(297)),
+Box(Box(298)),
+Box(Box(299)),
+Box(Box(300)),
+Box(Box(301)),
+Box(Box(302)),
+Box(Box(303)),
+Box(Box(304)),
+Box(Box(305)),
+Box(Box(306)),
+Box(Box(307)),
+Box(Box(308)),
+Box(Box(309)),
+Box(Box(310)),
+Box(Box(311)),
+Box(Box(312)),
+Box(Box(313)),
+Box(Box(314)),
+Box(Box(315)),
+Box(Box(316)),
+Box(Box(317)),
+Box(Box(318)),
+Box(Box(319)),
+Box(Box(320)),
+Box(Box(321)),
+Box(Box(322)),
+Box(Box(323)),
+Box(Box(324)),
+Box(Box(325)),
+Box(Box(326)),
+Box(Box(327)),
+Box(Box(328)),
+Box(Box(329)),
+Box(Box(330)),
+Box(Box(331)),
+Box(Box(332)),
+Box(Box(333)),
+Box(Box(334)),
+Box(Box(335)),
+Box(Box(336)),
+Box(Box(337)),
+Box(Box(338)),
+Box(Box(339)),
+Box(Box(340)),
+Box(Box(341)),
+Box(Box(342)),
+Box(Box(343)),
+Box(Box(344)),
+Box(Box(345)),
+Box(Box(346)),
+Box(Box(347)),
+Box(Box(348)),
+Box(Box(349)),
+Box(Box(350)),
+Box(Box(351)),
+Box(Box(352)),
+Box(Box(353)),
+Box(Box(354)),
+Box(Box(355)),
+Box(Box(356)),
+Box(Box(357)),
+Box(Box(358)),
+Box(Box(359)),
+Box(Box(360)),
+Box(Box(361)),
+Box(Box(362)),
+Box(Box(363)),
+Box(Box(364)),
+Box(Box(365)),
+Box(Box(366)),
+Box(Box(367)),
+Box(Box(368)),
+Box(Box(369)),
+Box(Box(370)),
+Box(Box(371)),
+Box(Box(372)),
+Box(Box(373)),
+Box(Box(374)),
+Box(Box(375)),
+Box(Box(376)),
+Box(Box(377)),
+Box(Box(378)),
+Box(Box(379)),
+Box(Box(380)),
+Box(Box(381)),
+Box(Box(382)),
+Box(Box(383)),
+Box(Box(384)),
+Box(Box(385)),
+Box(Box(386)),
+Box(Box(387)),
+Box(Box(388)),
+Box(Box(389)),
+Box(Box(390)),
+Box(Box(391)),
+Box(Box(392)),
+Box(Box(393)),
+Box(Box(394)),
+Box(Box(395)),
+Box(Box(396)),
+Box(Box(397)),
+Box(Box(398)),
+Box(Box(399)),
+Box(Box(400)),
+Box(Box(401)),
+Box(Box(402)),
+Box(Box(403)),
+Box(Box(404)),
+Box(Box(405)),
+Box(Box(406)),
+Box(Box(407)),
+Box(Box(408)),
+Box(Box(409)),
+Box(Box(410)),
+Box(Box(411)),
+Box(Box(412)),
+Box(Box(413)),
+Box(Box(414)),
+Box(Box(415)),
+Box(Box(416)),
+Box(Box(417)),
+Box(Box(418)),
+Box(Box(419)),
+Box(Box(420)),
+Box(Box(421)),
+Box(Box(422)),
+Box(Box(423)),
+Box(Box(424)),
+Box(Box(425)),
+Box(Box(426)),
+Box(Box(427)),
+Box(Box(428)),
+Box(Box(429)),
+Box(Box(430)),
+Box(Box(431)),
+Box(Box(432)),
+Box(Box(433)),
+Box(Box(434)),
+Box(Box(435)),
+Box(Box(436)),
+Box(Box(437)),
+Box(Box(438)),
+Box(Box(439)),
+Box(Box(440)),
+Box(Box(441)),
+Box(Box(442)),
+Box(Box(443)),
+Box(Box(444)),
+Box(Box(445)),
+Box(Box(446)),
+Box(Box(447)),
+Box(Box(448)),
+Box(Box(449)),
+Box(Box(450)),
+Box(Box(451)),
+Box(Box(452)),
+Box(Box(453)),
+Box(Box(454)),
+Box(Box(455)),
+Box(Box(456)),
+Box(Box(457)),
+Box(Box(458)),
+Box(Box(459)),
+Box(Box(460)),
+Box(Box(461)),
+Box(Box(462)),
+Box(Box(463)),
+Box(Box(464)),
+Box(Box(465)),
+Box(Box(466)),
+Box(Box(467)),
+Box(Box(468)),
+Box(Box(469)),
+Box(Box(470)),
+Box(Box(471)),
+Box(Box(472)),
+Box(Box(473)),
+Box(Box(474)),
+Box(Box(475)),
+Box(Box(476)),
+Box(Box(477)),
+Box(Box(478)),
+Box(Box(479)),
+Box(Box(480)),
+Box(Box(481)),
+Box(Box(482)),
+Box(Box(483)),
+Box(Box(484)),
+Box(Box(485)),
+Box(Box(486)),
+Box(Box(487)),
+Box(Box(488)),
+Box(Box(489)),
+Box(Box(490)),
+Box(Box(491)),
+Box(Box(492)),
+Box(Box(493)),
+Box(Box(494)),
+Box(Box(495)),
+Box(Box(496)),
+Box(Box(497)),
+Box(Box(498)),
+Box(Box(499)),
+Box(Box(500)),
+Box(Box(501)),
+Box(Box(502)),
+Box(Box(503)),
+Box(Box(504)),
+Box(Box(505)),
+Box(Box(506)),
+Box(Box(507)),
+Box(Box(508)),
+Box(Box(509)),
+Box(Box(510)),
+Box(Box(511)),
+Box(Box(512)),
+Box(Box(513)),
+Box(Box(514)),
+Box(Box(515)),
+Box(Box(516)),
+Box(Box(517)),
+Box(Box(518)),
+Box(Box(519)),
+Box(Box(520)),
+Box(Box(521)),
+Box(Box(522)),
+Box(Box(523)),
+Box(Box(524)),
+Box(Box(525)),
+Box(Box(526)),
+Box(Box(527)),
+Box(Box(528)),
+Box(Box(529)),
+Box(Box(530)),
+Box(Box(531)),
+Box(Box(532)),
+Box(Box(533)),
+Box(Box(534)),
+Box(Box(535)),
+Box(Box(536)),
+Box(Box(537)),
+Box(Box(538)),
+Box(Box(539)),
+Box(Box(540)),
+Box(Box(541)),
+Box(Box(542)),
+Box(Box(543)),
+Box(Box(544)),
+Box(Box(545)),
+Box(Box(546)),
+Box(Box(547)),
+Box(Box(548)),
+Box(Box(549)),
+Box(Box(550)),
+Box(Box(551)),
+Box(Box(552)),
+Box(Box(553)),
+Box(Box(554)),
+Box(Box(555)),
+Box(Box(556)),
+Box(Box(557)),
+Box(Box(558)),
+Box(Box(559)),
+Box(Box(560)),
+Box(Box(561)),
+Box(Box(562)),
+Box(Box(563)),
+Box(Box(564)),
+Box(Box(565)),
+Box(Box(566)),
+Box(Box(567)),
+Box(Box(568)),
+Box(Box(569)),
+Box(Box(570)),
+Box(Box(571)),
+Box(Box(572)),
+Box(Box(573)),
+Box(Box(574)),
+Box(Box(575)),
+Box(Box(576)),
+Box(Box(577)),
+Box(Box(578)),
+Box(Box(579)),
+Box(Box(580)),
+Box(Box(581)),
+Box(Box(582)),
+Box(Box(583)),
+Box(Box(584)),
+Box(Box(585)),
+Box(Box(586)),
+Box(Box(587)),
+Box(Box(588)),
+Box(Box(589)),
+Box(Box(590)),
+Box(Box(591)),
+Box(Box(592)),
+Box(Box(593)),
+Box(Box(594)),
+Box(Box(595)),
+Box(Box(596)),
+Box(Box(597)),
+Box(Box(598)),
+Box(Box(599)),
+Box(Box(600)),
+Box(Box(601)),
+Box(Box(602)),
+Box(Box(603)),
+Box(Box(604)),
+Box(Box(605)),
+Box(Box(606)),
+Box(Box(607)),
+Box(Box(608)),
+Box(Box(609)),
+Box(Box(610)),
+Box(Box(611)),
+Box(Box(612)),
+Box(Box(613)),
+Box(Box(614)),
+Box(Box(615)),
+Box(Box(616)),
+Box(Box(617)),
+Box(Box(618)),
+Box(Box(619)),
+Box(Box(620)),
+Box(Box(621)),
+Box(Box(622)),
+Box(Box(623)),
+Box(Box(624)),
+Box(Box(625)),
+Box(Box(626)),
+Box(Box(627)),
+Box(Box(628)),
+Box(Box(629)),
+Box(Box(630)),
+Box(Box(631)),
+Box(Box(632)),
+Box(Box(633)),
+Box(Box(634)),
+Box(Box(635)),
+Box(Box(636)),
+Box(Box(637)),
+Box(Box(638)),
+Box(Box(639)),
+Box(Box(640)),
+Box(Box(641)),
+Box(Box(642)),
+Box(Box(643)),
+Box(Box(644)),
+Box(Box(645)),
+Box(Box(646)),
+Box(Box(647)),
+Box(Box(648)),
+Box(Box(649)),
+Box(Box(650)),
+Box(Box(651)),
+Box(Box(652)),
+Box(Box(653)),
+Box(Box(654)),
+Box(Box(655)),
+Box(Box(656)),
+Box(Box(657)),
+Box(Box(658)),
+Box(Box(659)),
+Box(Box(660)),
+Box(Box(661)),
+Box(Box(662)),
+Box(Box(663)),
+Box(Box(664)),
+Box(Box(665)),
+Box(Box(666)),
+Box(Box(667)),
+Box(Box(668)),
+Box(Box(669)),
+Box(Box(670)),
+Box(Box(671)),
+Box(Box(672)),
+Box(Box(673)),
+Box(Box(674)),
+Box(Box(675)),
+Box(Box(676)),
+Box(Box(677)),
+Box(Box(678)),
+Box(Box(679)),
+Box(Box(680)),
+Box(Box(681)),
+Box(Box(682)),
+Box(Box(683)),
+Box(Box(684)),
+Box(Box(685)),
+Box(Box(686)),
+Box(Box(687)),
+Box(Box(688)),
+Box(Box(689)),
+Box(Box(690)),
+Box(Box(691)),
+Box(Box(692)),
+Box(Box(693)),
+Box(Box(694)),
+Box(Box(695)),
+Box(Box(696)),
+Box(Box(697)),
+Box(Box(698)),
+Box(Box(699)),
+Box(Box(700)),
+Box(Box(701)),
+Box(Box(702)),
+Box(Box(703)),
+Box(Box(704)),
+Box(Box(705)),
+Box(Box(706)),
+Box(Box(707)),
+Box(Box(708)),
+Box(Box(709)),
+Box(Box(710)),
+Box(Box(711)),
+Box(Box(712)),
+Box(Box(713)),
+Box(Box(714)),
+Box(Box(715)),
+Box(Box(716)),
+Box(Box(717)),
+Box(Box(718)),
+Box(Box(719)),
+Box(Box(720)),
+Box(Box(721)),
+Box(Box(722)),
+Box(Box(723)),
+Box(Box(724)),
+Box(Box(725)),
+Box(Box(726)),
+Box(Box(727)),
+Box(Box(728)),
+Box(Box(729)),
+Box(Box(730)),
+Box(Box(731)),
+Box(Box(732)),
+Box(Box(733)),
+Box(Box(734)),
+Box(Box(735)),
+Box(Box(736)),
+Box(Box(737)),
+Box(Box(738)),
+Box(Box(739)),
+Box(Box(740)),
+Box(Box(741)),
+Box(Box(742)),
+Box(Box(743)),
+Box(Box(744)),
+Box(Box(745)),
+Box(Box(746)),
+Box(Box(747)),
+Box(Box(748)),
+Box(Box(749)),
+Box(Box(750)),
+Box(Box(751)),
+Box(Box(752)),
+Box(Box(753)),
+Box(Box(754)),
+Box(Box(755)),
+Box(Box(756)),
+Box(Box(757)),
+Box(Box(758)),
+Box(Box(759)),
+Box(Box(760)),
+Box(Box(761)),
+Box(Box(762)),
+Box(Box(763)),
+Box(Box(764)),
+Box(Box(765)),
+Box(Box(766)),
+Box(Box(767)),
+Box(Box(768)),
+Box(Box(769)),
+Box(Box(770)),
+Box(Box(771)),
+Box(Box(772)),
+Box(Box(773)),
+Box(Box(774)),
+Box(Box(775)),
+Box(Box(776)),
+Box(Box(777)),
+Box(Box(778)),
+Box(Box(779)),
+Box(Box(780)),
+Box(Box(781)),
+Box(Box(782)),
+Box(Box(783)),
+Box(Box(784)),
+Box(Box(785)),
+Box(Box(786)),
+Box(Box(787)),
+Box(Box(788)),
+Box(Box(789)),
+Box(Box(790)),
+Box(Box(791)),
+Box(Box(792)),
+Box(Box(793)),
+Box(Box(794)),
+Box(Box(795)),
+Box(Box(796)),
+Box(Box(797)),
+Box(Box(798)),
+Box(Box(799)),
+Box(Box(800)),
+Box(Box(801)),
+Box(Box(802)),
+Box(Box(803)),
+Box(Box(804)),
+Box(Box(805)),
+Box(Box(806)),
+Box(Box(807)),
+Box(Box(808)),
+Box(Box(809)),
+Box(Box(810)),
+Box(Box(811)),
+Box(Box(812)),
+Box(Box(813)),
+Box(Box(814)),
+Box(Box(815)),
+Box(Box(816)),
+Box(Box(817)),
+Box(Box(818)),
+Box(Box(819)),
+Box(Box(820)),
+Box(Box(821)),
+Box(Box(822)),
+Box(Box(823)),
+Box(Box(824)),
+Box(Box(825)),
+Box(Box(826)),
+Box(Box(827)),
+Box(Box(828)),
+Box(Box(829)),
+Box(Box(830)),
+Box(Box(831)),
+Box(Box(832)),
+Box(Box(833)),
+Box(Box(834)),
+Box(Box(835)),
+Box(Box(836)),
+Box(Box(837)),
+Box(Box(838)),
+Box(Box(839)),
+Box(Box(840)),
+Box(Box(841)),
+Box(Box(842)),
+Box(Box(843)),
+Box(Box(844)),
+Box(Box(845)),
+Box(Box(846)),
+Box(Box(847)),
+Box(Box(848)),
+Box(Box(849)),
+Box(Box(850)),
+Box(Box(851)),
+Box(Box(852)),
+Box(Box(853)),
+Box(Box(854)),
+Box(Box(855)),
+Box(Box(856)),
+Box(Box(857)),
+Box(Box(858)),
+Box(Box(859)),
+Box(Box(860)),
+Box(Box(861)),
+Box(Box(862)),
+Box(Box(863)),
+Box(Box(864)),
+Box(Box(865)),
+Box(Box(866)),
+Box(Box(867)),
+Box(Box(868)),
+Box(Box(869)),
+Box(Box(870)),
+Box(Box(871)),
+Box(Box(872)),
+Box(Box(873)),
+Box(Box(874)),
+Box(Box(875)),
+Box(Box(876)),
+Box(Box(877)),
+Box(Box(878)),
+Box(Box(879)),
+Box(Box(880)),
+Box(Box(881)),
+Box(Box(882)),
+Box(Box(883)),
+Box(Box(884)),
+Box(Box(885)),
+Box(Box(886)),
+Box(Box(887)),
+Box(Box(888)),
+Box(Box(889)),
+Box(Box(890)),
+Box(Box(891)),
+Box(Box(892)),
+Box(Box(893)),
+Box(Box(894)),
+Box(Box(895)),
+Box(Box(896)),
+Box(Box(897)),
+Box(Box(898)),
+Box(Box(899)),
+Box(Box(900)),
+Box(Box(901)),
+Box(Box(902)),
+Box(Box(903)),
+Box(Box(904)),
+Box(Box(905)),
+Box(Box(906)),
+Box(Box(907)),
+Box(Box(908)),
+Box(Box(909)),
+Box(Box(910)),
+Box(Box(911)),
+Box(Box(912)),
+Box(Box(913)),
+Box(Box(914)),
+Box(Box(915)),
+Box(Box(916)),
+Box(Box(917)),
+Box(Box(918)),
+Box(Box(919)),
+Box(Box(920)),
+Box(Box(921)),
+Box(Box(922)),
+Box(Box(923)),
+Box(Box(924)),
+Box(Box(925)),
+Box(Box(926)),
+Box(Box(927)),
+Box(Box(928)),
+Box(Box(929)),
+Box(Box(930)),
+Box(Box(931)),
+Box(Box(932)),
+Box(Box(933)),
+Box(Box(934)),
+Box(Box(935)),
+Box(Box(936)),
+Box(Box(937)),
+Box(Box(938)),
+Box(Box(939)),
+Box(Box(940)),
+Box(Box(941)),
+Box(Box(942)),
+Box(Box(943)),
+Box(Box(944)),
+Box(Box(945)),
+Box(Box(946)),
+Box(Box(947)),
+Box(Box(948)),
+Box(Box(949)),
+Box(Box(950)),
+Box(Box(951)),
+Box(Box(952)),
+Box(Box(953)),
+Box(Box(954)),
+Box(Box(955)),
+Box(Box(956)),
+Box(Box(957)),
+Box(Box(958)),
+Box(Box(959)),
+Box(Box(960)),
+Box(Box(961)),
+Box(Box(962)),
+Box(Box(963)),
+Box(Box(964)),
+Box(Box(965)),
+Box(Box(966)),
+Box(Box(967)),
+Box(Box(968)),
+Box(Box(969)),
+Box(Box(970)),
+Box(Box(971)),
+Box(Box(972)),
+Box(Box(973)),
+Box(Box(974)),
+Box(Box(975)),
+Box(Box(976)),
+Box(Box(977)),
+Box(Box(978)),
+Box(Box(979)),
+Box(Box(980)),
+Box(Box(981)),
+Box(Box(982)),
+Box(Box(983)),
+Box(Box(984)),
+Box(Box(985)),
+Box(Box(986)),
+Box(Box(987)),
+Box(Box(988)),
+Box(Box(989)),
+Box(Box(990)),
+Box(Box(991)),
+Box(Box(992)),
+Box(Box(993)),
+Box(Box(994)),
+Box(Box(995)),
+Box(Box(996)),
+Box(Box(997)),
+Box(Box(998)),
+Box(Box(999)),
+Box(Box(1000)),
+Box(Box(1001)),
+Box(Box(1002)),
+Box(Box(1003)),
+Box(Box(1004)),
+Box(Box(1005)),
+Box(Box(1006)),
+Box(Box(1007)),
+Box(Box(1008)),
+Box(Box(1009)),
+Box(Box(1010)),
+Box(Box(1011)),
+Box(Box(1012)),
+Box(Box(1013)),
+Box(Box(1014)),
+Box(Box(1015)),
+Box(Box(1016)),
+Box(Box(1017)),
+Box(Box(1018)),
+Box(Box(1019)),
+Box(Box(1020)),
+Box(Box(1021)),
+Box(Box(1022)),
+Box(Box(1023)),
+Box(Box(1024)),
+Box(Box(1025)),
+Box(Box(1026)),
+Box(Box(1027)),
+Box(Box(1028)),
+Box(Box(1029)),
+Box(Box(1030)),
+Box(Box(1031)),
+Box(Box(1032)),
+Box(Box(1033)),
+Box(Box(1034)),
+Box(Box(1035)),
+Box(Box(1036)),
+Box(Box(1037)),
+Box(Box(1038)),
+Box(Box(1039)),
+Box(Box(1040)),
+Box(Box(1041)),
+Box(Box(1042)),
+Box(Box(1043)),
+Box(Box(1044)),
+Box(Box(1045)),
+Box(Box(1046)),
+Box(Box(1047)),
+Box(Box(1048)),
+Box(Box(1049)),
+Box(Box(1050)),
+Box(Box(1051)),
+Box(Box(1052)),
+Box(Box(1053)),
+Box(Box(1054)),
+Box(Box(1055)),
+Box(Box(1056)),
+Box(Box(1057)),
+Box(Box(1058)),
+Box(Box(1059)),
+Box(Box(1060)),
+Box(Box(1061)),
+Box(Box(1062)),
+Box(Box(1063)),
+Box(Box(1064)),
+Box(Box(1065)),
+Box(Box(1066)),
+Box(Box(1067)),
+Box(Box(1068)),
+Box(Box(1069)),
+Box(Box(1070)),
+Box(Box(1071)),
+Box(Box(1072)),
+Box(Box(1073)),
+Box(Box(1074)),
+Box(Box(1075)),
+Box(Box(1076)),
+Box(Box(1077)),
+Box(Box(1078)),
+Box(Box(1079)),
+Box(Box(1080)),
+Box(Box(1081)),
+Box(Box(1082)),
+Box(Box(1083)),
+Box(Box(1084)),
+Box(Box(1085)),
+Box(Box(1086)),
+Box(Box(1087)),
+Box(Box(1088)),
+Box(Box(1089)),
+Box(Box(1090)),
+Box(Box(1091)),
+Box(Box(1092)),
+Box(Box(1093)),
+Box(Box(1094)),
+Box(Box(1095)),
+Box(Box(1096)),
+Box(Box(1097)),
+Box(Box(1098)),
+Box(Box(1099)),
+Box(Box(1100)),
+Box(Box(1101)),
+Box(Box(1102)),
+Box(Box(1103)),
+Box(Box(1104)),
+Box(Box(1105)),
+Box(Box(1106)),
+Box(Box(1107)),
+Box(Box(1108)),
+Box(Box(1109)),
+Box(Box(1110)),
+Box(Box(1111)),
+Box(Box(1112)),
+Box(Box(1113)),
+Box(Box(1114)),
+Box(Box(1115)),
+Box(Box(1116)),
+Box(Box(1117)),
+Box(Box(1118)),
+Box(Box(1119)),
+Box(Box(1120)),
+Box(Box(1121)),
+Box(Box(1122)),
+Box(Box(1123)),
+Box(Box(1124)),
+Box(Box(1125)),
+Box(Box(1126)),
+Box(Box(1127)),
+Box(Box(1128)),
+Box(Box(1129)),
+Box(Box(1130)),
+Box(Box(1131)),
+Box(Box(1132)),
+Box(Box(1133)),
+Box(Box(1134)),
+Box(Box(1135)),
+Box(Box(1136)),
+Box(Box(1137)),
+Box(Box(1138)),
+Box(Box(1139)),
+Box(Box(1140)),
+Box(Box(1141)),
+Box(Box(1142)),
+Box(Box(1143)),
+Box(Box(1144)),
+Box(Box(1145)),
+Box(Box(1146)),
+Box(Box(1147)),
+Box(Box(1148)),
+Box(Box(1149)),
+Box(Box(1150)),
+Box(Box(1151)),
+Box(Box(1152)),
+Box(Box(1153)),
+Box(Box(1154)),
+Box(Box(1155)),
+Box(Box(1156)),
+Box(Box(1157)),
+Box(Box(1158)),
+Box(Box(1159)),
+Box(Box(1160)),
+Box(Box(1161)),
+Box(Box(1162)),
+Box(Box(1163)),
+Box(Box(1164)),
+Box(Box(1165)),
+Box(Box(1166)),
+Box(Box(1167)),
+Box(Box(1168)),
+Box(Box(1169)),
+Box(Box(1170)),
+Box(Box(1171)),
+Box(Box(1172)),
+Box(Box(1173)),
+Box(Box(1174)),
+Box(Box(1175)),
+Box(Box(1176)),
+Box(Box(1177)),
+Box(Box(1178)),
+Box(Box(1179)),
+Box(Box(1180)),
+Box(Box(1181)),
+Box(Box(1182)),
+Box(Box(1183)),
+Box(Box(1184)),
+Box(Box(1185)),
+Box(Box(1186)),
+Box(Box(1187)),
+Box(Box(1188)),
+Box(Box(1189)),
+Box(Box(1190)),
+Box(Box(1191)),
+Box(Box(1192)),
+Box(Box(1193)),
+Box(Box(1194)),
+Box(Box(1195)),
+Box(Box(1196)),
+Box(Box(1197)),
+Box(Box(1198)),
+Box(Box(1199)),
+Box(Box(1200)),
+Box(Box(1201)),
+Box(Box(1202)),
+Box(Box(1203)),
+Box(Box(1204)),
+Box(Box(1205)),
+Box(Box(1206)),
+Box(Box(1207)),
+Box(Box(1208)),
+Box(Box(1209)),
+Box(Box(1210)),
+Box(Box(1211)),
+Box(Box(1212)),
+Box(Box(1213)),
+Box(Box(1214)),
+Box(Box(1215)),
+Box(Box(1216)),
+Box(Box(1217)),
+Box(Box(1218)),
+Box(Box(1219)),
+Box(Box(1220)),
+Box(Box(1221)),
+Box(Box(1222)),
+Box(Box(1223)),
+Box(Box(1224)),
+Box(Box(1225)),
+Box(Box(1226)),
+Box(Box(1227)),
+Box(Box(1228)),
+Box(Box(1229)),
+Box(Box(1230)),
+Box(Box(1231)),
+Box(Box(1232)),
+Box(Box(1233)),
+Box(Box(1234)),
+Box(Box(1235)),
+Box(Box(1236)),
+Box(Box(1237)),
+Box(Box(1238)),
+Box(Box(1239)),
+Box(Box(1240)),
+Box(Box(1241)),
+Box(Box(1242)),
+Box(Box(1243)),
+Box(Box(1244)),
+Box(Box(1245)),
+Box(Box(1246)),
+Box(Box(1247)),
+Box(Box(1248)),
+Box(Box(1249)),
+Box(Box(1250)),
+Box(Box(1251)),
+Box(Box(1252)),
+Box(Box(1253)),
+Box(Box(1254)),
+Box(Box(1255)),
+Box(Box(1256)),
+Box(Box(1257)),
+Box(Box(1258)),
+Box(Box(1259)),
+Box(Box(1260)),
+Box(Box(1261)),
+Box(Box(1262)),
+Box(Box(1263)),
+Box(Box(1264)),
+Box(Box(1265)),
+Box(Box(1266)),
+Box(Box(1267)),
+Box(Box(1268)),
+Box(Box(1269)),
+Box(Box(1270)),
+Box(Box(1271)),
+Box(Box(1272)),
+Box(Box(1273)),
+Box(Box(1274)),
+Box(Box(1275)),
+Box(Box(1276)),
+Box(Box(1277)),
+Box(Box(1278)),
+Box(Box(1279)),
+Box(Box(1280)),
+Box(Box(1281)),
+Box(Box(1282)),
+Box(Box(1283)),
+Box(Box(1284)),
+Box(Box(1285)),
+Box(Box(1286)),
+Box(Box(1287)),
+Box(Box(1288)),
+Box(Box(1289)),
+Box(Box(1290)),
+Box(Box(1291)),
+Box(Box(1292)),
+Box(Box(1293)),
+Box(Box(1294)),
+Box(Box(1295)),
+Box(Box(1296)),
+Box(Box(1297)),
+Box(Box(1298)),
+Box(Box(1299)),
+Box(Box(1300)),
+Box(Box(1301)),
+Box(Box(1302)),
+Box(Box(1303)),
+Box(Box(1304)),
+Box(Box(1305)),
+Box(Box(1306)),
+Box(Box(1307)),
+Box(Box(1308)),
+Box(Box(1309)),
+Box(Box(1310)),
+Box(Box(1311)),
+Box(Box(1312)),
+Box(Box(1313)),
+Box(Box(1314)),
+Box(Box(1315)),
+Box(Box(1316)),
+Box(Box(1317)),
+Box(Box(1318)),
+Box(Box(1319)),
+Box(Box(1320)),
+Box(Box(1321)),
+Box(Box(1322)),
+Box(Box(1323)),
+Box(Box(1324)),
+Box(Box(1325)),
+Box(Box(1326)),
+Box(Box(1327)),
+Box(Box(1328)),
+Box(Box(1329)),
+Box(Box(1330)),
+Box(Box(1331)),
+Box(Box(1332)),
+Box(Box(1333)),
+Box(Box(1334)),
+Box(Box(1335)),
+Box(Box(1336)),
+Box(Box(1337)),
+Box(Box(1338)),
+Box(Box(1339)),
+Box(Box(1340)),
+Box(Box(1341)),
+Box(Box(1342)),
+Box(Box(1343)),
+Box(Box(1344)),
+Box(Box(1345)),
+Box(Box(1346)),
+Box(Box(1347)),
+Box(Box(1348)),
+Box(Box(1349)),
+Box(Box(1350)),
+Box(Box(1351)),
+Box(Box(1352)),
+Box(Box(1353)),
+Box(Box(1354)),
+Box(Box(1355)),
+Box(Box(1356)),
+Box(Box(1357)),
+Box(Box(1358)),
+Box(Box(1359)),
+Box(Box(1360)),
+Box(Box(1361)),
+Box(Box(1362)),
+Box(Box(1363)),
+Box(Box(1364)),
+Box(Box(1365)),
+Box(Box(1366)),
+Box(Box(1367)),
+Box(Box(1368)),
+Box(Box(1369)),
+Box(Box(1370)),
+Box(Box(1371)),
+Box(Box(1372)),
+Box(Box(1373)),
+Box(Box(1374)),
+Box(Box(1375)),
+Box(Box(1376)),
+Box(Box(1377)),
+Box(Box(1378)),
+Box(Box(1379)),
+Box(Box(1380)),
+Box(Box(1381)),
+Box(Box(1382)),
+Box(Box(1383)),
+Box(Box(1384)),
+Box(Box(1385)),
+Box(Box(1386)),
+Box(Box(1387)),
+Box(Box(1388)),
+Box(Box(1389)),
+Box(Box(1390)),
+Box(Box(1391)),
+Box(Box(1392)),
+Box(Box(1393)),
+Box(Box(1394)),
+Box(Box(1395)),
+Box(Box(1396)),
+Box(Box(1397)),
+Box(Box(1398)),
+Box(Box(1399)),
+Box(Box(1400)),
+Box(Box(1401)),
+Box(Box(1402)),
+Box(Box(1403)),
+Box(Box(1404)),
+Box(Box(1405)),
+Box(Box(1406)),
+Box(Box(1407)),
+Box(Box(1408)),
+Box(Box(1409)),
+Box(Box(1410)),
+Box(Box(1411)),
+Box(Box(1412)),
+Box(Box(1413)),
+Box(Box(1414)),
+Box(Box(1415)),
+Box(Box(1416)),
+Box(Box(1417)),
+Box(Box(1418)),
+Box(Box(1419)),
+Box(Box(1420)),
+Box(Box(1421)),
+Box(Box(1422)),
+Box(Box(1423)),
+Box(Box(1424)),
+Box(Box(1425)),
+Box(Box(1426)),
+Box(Box(1427)),
+Box(Box(1428)),
+Box(Box(1429)),
+Box(Box(1430)),
+Box(Box(1431)),
+Box(Box(1432)),
+Box(Box(1433)),
+Box(Box(1434)),
+Box(Box(1435)),
+Box(Box(1436)),
+Box(Box(1437)),
+Box(Box(1438)),
+Box(Box(1439)),
+Box(Box(1440)),
+Box(Box(1441)),
+Box(Box(1442)),
+Box(Box(1443)),
+Box(Box(1444)),
+Box(Box(1445)),
+Box(Box(1446)),
+Box(Box(1447)),
+Box(Box(1448)),
+Box(Box(1449)),
+Box(Box(1450)),
+Box(Box(1451)),
+Box(Box(1452)),
+Box(Box(1453)),
+Box(Box(1454)),
+Box(Box(1455)),
+Box(Box(1456)),
+Box(Box(1457)),
+Box(Box(1458)),
+Box(Box(1459)),
+Box(Box(1460)),
+Box(Box(1461)),
+Box(Box(1462)),
+Box(Box(1463)),
+Box(Box(1464)),
+Box(Box(1465)),
+Box(Box(1466)),
+Box(Box(1467)),
+Box(Box(1468)),
+Box(Box(1469)),
+Box(Box(1470)),
+Box(Box(1471)),
+Box(Box(1472)),
+Box(Box(1473)),
+Box(Box(1474)),
+Box(Box(1475)),
+Box(Box(1476)),
+Box(Box(1477)),
+Box(Box(1478)),
+Box(Box(1479)),
+Box(Box(1480)),
+Box(Box(1481)),
+Box(Box(1482)),
+Box(Box(1483)),
+Box(Box(1484)),
+Box(Box(1485)),
+Box(Box(1486)),
+Box(Box(1487)),
+Box(Box(1488)),
+Box(Box(1489)),
+Box(Box(1490)),
+Box(Box(1491)),
+Box(Box(1492)),
+Box(Box(1493)),
+Box(Box(1494)),
+Box(Box(1495)),
+Box(Box(1496)),
+Box(Box(1497)),
+Box(Box(1498)),
+Box(Box(1499)),
+Box(Box(1500)),
+Box(Box(1501)),
+Box(Box(1502)),
+Box(Box(1503)),
+Box(Box(1504)),
+Box(Box(1505)),
+Box(Box(1506)),
+Box(Box(1507)),
+Box(Box(1508)),
+Box(Box(1509)),
+Box(Box(1510)),
+Box(Box(1511)),
+Box(Box(1512)),
+Box(Box(1513)),
+Box(Box(1514)),
+Box(Box(1515)),
+Box(Box(1516)),
+Box(Box(1517)),
+Box(Box(1518)),
+Box(Box(1519)),
+Box(Box(1520)),
+Box(Box(1521)),
+Box(Box(1522)),
+Box(Box(1523)),
+Box(Box(1524)),
+Box(Box(1525)),
+Box(Box(1526)),
+Box(Box(1527)),
+Box(Box(1528)),
+Box(Box(1529)),
+Box(Box(1530)),
+Box(Box(1531)),
+Box(Box(1532)),
+Box(Box(1533)),
+Box(Box(1534)),
+Box(Box(1535)),
+Box(Box(1536)),
+Box(Box(1537)),
+Box(Box(1538)),
+Box(Box(1539)),
+Box(Box(1540)),
+Box(Box(1541)),
+Box(Box(1542)),
+Box(Box(1543)),
+Box(Box(1544)),
+Box(Box(1545)),
+Box(Box(1546)),
+Box(Box(1547)),
+Box(Box(1548)),
+Box(Box(1549)),
+Box(Box(1550)),
+Box(Box(1551)),
+Box(Box(1552)),
+Box(Box(1553)),
+Box(Box(1554)),
+Box(Box(1555)),
+Box(Box(1556)),
+Box(Box(1557)),
+Box(Box(1558)),
+Box(Box(1559)),
+Box(Box(1560)),
+Box(Box(1561)),
+Box(Box(1562)),
+Box(Box(1563)),
+Box(Box(1564)),
+Box(Box(1565)),
+Box(Box(1566)),
+Box(Box(1567)),
+Box(Box(1568)),
+Box(Box(1569)),
+Box(Box(1570)),
+Box(Box(1571)),
+Box(Box(1572)),
+Box(Box(1573)),
+Box(Box(1574)),
+Box(Box(1575)),
+Box(Box(1576)),
+Box(Box(1577)),
+Box(Box(1578)),
+Box(Box(1579)),
+Box(Box(1580)),
+Box(Box(1581)),
+Box(Box(1582)),
+Box(Box(1583)),
+Box(Box(1584)),
+Box(Box(1585)),
+Box(Box(1586)),
+Box(Box(1587)),
+Box(Box(1588)),
+Box(Box(1589)),
+Box(Box(1590)),
+Box(Box(1591)),
+Box(Box(1592)),
+Box(Box(1593)),
+Box(Box(1594)),
+Box(Box(1595)),
+Box(Box(1596)),
+Box(Box(1597)),
+Box(Box(1598)),
+Box(Box(1599)),
+Box(Box(1600)),
+Box(Box(1601)),
+Box(Box(1602)),
+Box(Box(1603)),
+Box(Box(1604)),
+Box(Box(1605)),
+Box(Box(1606)),
+Box(Box(1607)),
+Box(Box(1608)),
+Box(Box(1609)),
+Box(Box(1610)),
+Box(Box(1611)),
+Box(Box(1612)),
+Box(Box(1613)),
+Box(Box(1614)),
+Box(Box(1615)),
+Box(Box(1616)),
+Box(Box(1617)),
+Box(Box(1618)),
+Box(Box(1619)),
+Box(Box(1620)),
+Box(Box(1621)),
+Box(Box(1622)),
+Box(Box(1623)),
+Box(Box(1624)),
+Box(Box(1625)),
+Box(Box(1626)),
+Box(Box(1627)),
+Box(Box(1628)),
+Box(Box(1629)),
+Box(Box(1630)),
+Box(Box(1631)),
+Box(Box(1632)),
+Box(Box(1633)),
+Box(Box(1634)),
+Box(Box(1635)),
+Box(Box(1636)),
+Box(Box(1637)),
+Box(Box(1638)),
+Box(Box(1639)),
+Box(Box(1640)),
+Box(Box(1641)),
+Box(Box(1642)),
+Box(Box(1643)),
+Box(Box(1644)),
+Box(Box(1645)),
+Box(Box(1646)),
+Box(Box(1647)),
+Box(Box(1648)),
+Box(Box(1649)),
+Box(Box(1650)),
+Box(Box(1651)),
+Box(Box(1652)),
+Box(Box(1653)),
+Box(Box(1654)),
+Box(Box(1655)),
+Box(Box(1656)),
+Box(Box(1657)),
+Box(Box(1658)),
+Box(Box(1659)),
+Box(Box(1660)),
+Box(Box(1661)),
+Box(Box(1662)),
+Box(Box(1663)),
+Box(Box(1664)),
+Box(Box(1665)),
+Box(Box(1666)),
+Box(Box(1667)),
+Box(Box(1668)),
+Box(Box(1669)),
+Box(Box(1670)),
+Box(Box(1671)),
+Box(Box(1672)),
+Box(Box(1673)),
+Box(Box(1674)),
+Box(Box(1675)),
+Box(Box(1676)),
+Box(Box(1677)),
+Box(Box(1678)),
+Box(Box(1679)),
+Box(Box(1680)),
+Box(Box(1681)),
+Box(Box(1682)),
+Box(Box(1683)),
+Box(Box(1684)),
+Box(Box(1685)),
+Box(Box(1686)),
+Box(Box(1687)),
+Box(Box(1688)),
+Box(Box(1689)),
+Box(Box(1690)),
+Box(Box(1691)),
+Box(Box(1692)),
+Box(Box(1693)),
+Box(Box(1694)),
+Box(Box(1695)),
+Box(Box(1696)),
+Box(Box(1697)),
+Box(Box(1698)),
+Box(Box(1699)),
+Box(Box(1700)),
+Box(Box(1701)),
+Box(Box(1702)),
+Box(Box(1703)),
+Box(Box(1704)),
+Box(Box(1705)),
+Box(Box(1706)),
+Box(Box(1707)),
+Box(Box(1708)),
+Box(Box(1709)),
+Box(Box(1710)),
+Box(Box(1711)),
+Box(Box(1712)),
+Box(Box(1713)),
+Box(Box(1714)),
+Box(Box(1715)),
+Box(Box(1716)),
+Box(Box(1717)),
+Box(Box(1718)),
+Box(Box(1719)),
+Box(Box(1720)),
+Box(Box(1721)),
+Box(Box(1722)),
+Box(Box(1723)),
+Box(Box(1724)),
+Box(Box(1725)),
+Box(Box(1726)),
+Box(Box(1727)),
+Box(Box(1728)),
+Box(Box(1729)),
+Box(Box(1730)),
+Box(Box(1731)),
+Box(Box(1732)),
+Box(Box(1733)),
+Box(Box(1734)),
+Box(Box(1735)),
+Box(Box(1736)),
+Box(Box(1737)),
+Box(Box(1738)),
+Box(Box(1739)),
+Box(Box(1740)),
+Box(Box(1741)),
+Box(Box(1742)),
+Box(Box(1743)),
+Box(Box(1744)),
+Box(Box(1745)),
+Box(Box(1746)),
+Box(Box(1747)),
+Box(Box(1748)),
+Box(Box(1749)),
+Box(Box(1750)),
+Box(Box(1751)),
+Box(Box(1752)),
+Box(Box(1753)),
+Box(Box(1754)),
+Box(Box(1755)),
+Box(Box(1756)),
+Box(Box(1757)),
+Box(Box(1758)),
+Box(Box(1759)),
+Box(Box(1760)),
+Box(Box(1761)),
+Box(Box(1762)),
+Box(Box(1763)),
+Box(Box(1764)),
+Box(Box(1765)),
+Box(Box(1766)),
+Box(Box(1767)),
+Box(Box(1768)),
+Box(Box(1769)),
+Box(Box(1770)),
+Box(Box(1771)),
+Box(Box(1772)),
+Box(Box(1773)),
+Box(Box(1774)),
+Box(Box(1775)),
+Box(Box(1776)),
+Box(Box(1777)),
+Box(Box(1778)),
+Box(Box(1779)),
+Box(Box(1780)),
+Box(Box(1781)),
+Box(Box(1782)),
+Box(Box(1783)),
+Box(Box(1784)),
+Box(Box(1785)),
+Box(Box(1786)),
+Box(Box(1787)),
+Box(Box(1788)),
+Box(Box(1789)),
+Box(Box(1790)),
+Box(Box(1791)),
+Box(Box(1792)),
+Box(Box(1793)),
+Box(Box(1794)),
+Box(Box(1795)),
+Box(Box(1796)),
+Box(Box(1797)),
+Box(Box(1798)),
+Box(Box(1799)),
+Box(Box(1800)),
+Box(Box(1801)),
+Box(Box(1802)),
+Box(Box(1803)),
+Box(Box(1804)),
+Box(Box(1805)),
+Box(Box(1806)),
+Box(Box(1807)),
+Box(Box(1808)),
+Box(Box(1809)),
+Box(Box(1810)),
+Box(Box(1811)),
+Box(Box(1812)),
+Box(Box(1813)),
+Box(Box(1814)),
+Box(Box(1815)),
+Box(Box(1816)),
+Box(Box(1817)),
+Box(Box(1818)),
+Box(Box(1819)),
+Box(Box(1820)),
+Box(Box(1821)),
+Box(Box(1822)),
+Box(Box(1823)),
+Box(Box(1824)),
+Box(Box(1825)),
+Box(Box(1826)),
+Box(Box(1827)),
+Box(Box(1828)),
+Box(Box(1829)),
+Box(Box(1830)),
+Box(Box(1831)),
+Box(Box(1832)),
+Box(Box(1833)),
+Box(Box(1834)),
+Box(Box(1835)),
+Box(Box(1836)),
+Box(Box(1837)),
+Box(Box(1838)),
+Box(Box(1839)),
+Box(Box(1840)),
+Box(Box(1841)),
+Box(Box(1842)),
+Box(Box(1843)),
+Box(Box(1844)),
+Box(Box(1845)),
+Box(Box(1846)),
+Box(Box(1847)),
+Box(Box(1848)),
+Box(Box(1849)),
+Box(Box(1850)),
+Box(Box(1851)),
+Box(Box(1852)),
+Box(Box(1853)),
+Box(Box(1854)),
+Box(Box(1855)),
+Box(Box(1856)),
+Box(Box(1857)),
+Box(Box(1858)),
+Box(Box(1859)),
+Box(Box(1860)),
+Box(Box(1861)),
+Box(Box(1862)),
+Box(Box(1863)),
+Box(Box(1864)),
+Box(Box(1865)),
+Box(Box(1866)),
+Box(Box(1867)),
+Box(Box(1868)),
+Box(Box(1869)),
+Box(Box(1870)),
+Box(Box(1871)),
+Box(Box(1872)),
+Box(Box(1873)),
+Box(Box(1874)),
+Box(Box(1875)),
+Box(Box(1876)),
+Box(Box(1877)),
+Box(Box(1878)),
+Box(Box(1879)),
+Box(Box(1880)),
+Box(Box(1881)),
+Box(Box(1882)),
+Box(Box(1883)),
+Box(Box(1884)),
+Box(Box(1885)),
+Box(Box(1886)),
+Box(Box(1887)),
+Box(Box(1888)),
+Box(Box(1889)),
+Box(Box(1890)),
+Box(Box(1891)),
+Box(Box(1892)),
+Box(Box(1893)),
+Box(Box(1894)),
+Box(Box(1895)),
+Box(Box(1896)),
+Box(Box(1897)),
+Box(Box(1898)),
+Box(Box(1899)),
+Box(Box(1900)),
+Box(Box(1901)),
+Box(Box(1902)),
+Box(Box(1903)),
+Box(Box(1904)),
+Box(Box(1905)),
+Box(Box(1906)),
+Box(Box(1907)),
+Box(Box(1908)),
+Box(Box(1909)),
+Box(Box(1910)),
+Box(Box(1911)),
+Box(Box(1912)),
+Box(Box(1913)),
+Box(Box(1914)),
+Box(Box(1915)),
+Box(Box(1916)),
+Box(Box(1917)),
+Box(Box(1918)),
+Box(Box(1919)),
+Box(Box(1920)),
+Box(Box(1921)),
+Box(Box(1922)),
+Box(Box(1923)),
+Box(Box(1924)),
+Box(Box(1925)),
+Box(Box(1926)),
+Box(Box(1927)),
+Box(Box(1928)),
+Box(Box(1929)),
+Box(Box(1930)),
+Box(Box(1931)),
+Box(Box(1932)),
+Box(Box(1933)),
+Box(Box(1934)),
+Box(Box(1935)),
+Box(Box(1936)),
+Box(Box(1937)),
+Box(Box(1938)),
+Box(Box(1939)),
+Box(Box(1940)),
+Box(Box(1941)),
+Box(Box(1942)),
+Box(Box(1943)),
+Box(Box(1944)),
+Box(Box(1945)),
+Box(Box(1946)),
+Box(Box(1947)),
+Box(Box(1948)),
+Box(Box(1949)),
+Box(Box(1950)),
+Box(Box(1951)),
+Box(Box(1952)),
+Box(Box(1953)),
+Box(Box(1954)),
+Box(Box(1955)),
+Box(Box(1956)),
+Box(Box(1957)),
+Box(Box(1958)),
+Box(Box(1959)),
+Box(Box(1960)),
+Box(Box(1961)),
+Box(Box(1962)),
+Box(Box(1963)),
+Box(Box(1964)),
+Box(Box(1965)),
+Box(Box(1966)),
+Box(Box(1967)),
+Box(Box(1968)),
+Box(Box(1969)),
+Box(Box(1970)),
+Box(Box(1971)),
+Box(Box(1972)),
+Box(Box(1973)),
+Box(Box(1974)),
+Box(Box(1975)),
+Box(Box(1976)),
+Box(Box(1977)),
+Box(Box(1978)),
+Box(Box(1979)),
+Box(Box(1980)),
+Box(Box(1981)),
+Box(Box(1982)),
+Box(Box(1983)),
+Box(Box(1984)),
+Box(Box(1985)),
+Box(Box(1986)),
+Box(Box(1987)),
+Box(Box(1988)),
+Box(Box(1989)),
+Box(Box(1990)),
+Box(Box(1991)),
+Box(Box(1992)),
+Box(Box(1993)),
+Box(Box(1994)),
+Box(Box(1995)),
+Box(Box(1996)),
+Box(Box(1997)),
+Box(Box(1998)),
+Box(Box(1999)),
+Box(Box(2000)),
+Box(Box(2001)),
+Box(Box(2002)),
+Box(Box(2003)),
+Box(Box(2004)),
+Box(Box(2005)),
+Box(Box(2006)),
+Box(Box(2007)),
+Box(Box(2008)),
+Box(Box(2009)),
+Box(Box(2010)),
+Box(Box(2011)),
+Box(Box(2012)),
+Box(Box(2013)),
+Box(Box(2014)),
+Box(Box(2015)),
+Box(Box(2016)),
+Box(Box(2017)),
+Box(Box(2018)),
+Box(Box(2019)),
+Box(Box(2020)),
+Box(Box(2021)),
+Box(Box(2022)),
+Box(Box(2023)),
+Box(Box(2024)),
+Box(Box(2025)),
+Box(Box(2026)),
+Box(Box(2027)),
+Box(Box(2028)),
+Box(Box(2029)),
+Box(Box(2030)),
+Box(Box(2031)),
+Box(Box(2032)),
+Box(Box(2033)),
+Box(Box(2034)),
+Box(Box(2035)),
+Box(Box(2036)),
+Box(Box(2037)),
+Box(Box(2038)),
+Box(Box(2039)),
+Box(Box(2040)),
+Box(Box(2041)),
+Box(Box(2042)),
+Box(Box(2043)),
+Box(Box(2044)),
+Box(Box(2045)),
+Box(Box(2046)),
+Box(Box(2047)),
+Box(Box(2048)),
+Box(Box(2049)),
+Box(Box(2050)),
+Box(Box(2051)),
+Box(Box(2052)),
+Box(Box(2053)),
+Box(Box(2054)),
+Box(Box(2055)),
+Box(Box(2056)),
+Box(Box(2057)),
+Box(Box(2058)),
+Box(Box(2059)),
+Box(Box(2060)),
+Box(Box(2061)),
+Box(Box(2062)),
+Box(Box(2063)),
+Box(Box(2064)),
+Box(Box(2065)),
+Box(Box(2066)),
+Box(Box(2067)),
+Box(Box(2068)),
+Box(Box(2069)),
+Box(Box(2070)),
+Box(Box(2071)),
+Box(Box(2072)),
+Box(Box(2073)),
+Box(Box(2074)),
+Box(Box(2075)),
+Box(Box(2076)),
+Box(Box(2077)),
+Box(Box(2078)),
+Box(Box(2079)),
+Box(Box(2080)),
+Box(Box(2081)),
+Box(Box(2082)),
+Box(Box(2083)),
+Box(Box(2084)),
+Box(Box(2085)),
+Box(Box(2086)),
+Box(Box(2087)),
+Box(Box(2088)),
+Box(Box(2089)),
+Box(Box(2090)),
+Box(Box(2091)),
+Box(Box(2092)),
+Box(Box(2093)),
+Box(Box(2094)),
+Box(Box(2095)),
+Box(Box(2096)),
+Box(Box(2097)),
+Box(Box(2098)),
+Box(Box(2099)),
+Box(Box(2100)),
+Box(Box(2101)),
+Box(Box(2102)),
+Box(Box(2103)),
+Box(Box(2104)),
+Box(Box(2105)),
+Box(Box(2106)),
+Box(Box(2107)),
+Box(Box(2108)),
+Box(Box(2109)),
+Box(Box(2110)),
+Box(Box(2111)),
+Box(Box(2112)),
+Box(Box(2113)),
+Box(Box(2114)),
+Box(Box(2115)),
+Box(Box(2116)),
+Box(Box(2117)),
+Box(Box(2118)),
+Box(Box(2119)),
+Box(Box(2120)),
+Box(Box(2121)),
+Box(Box(2122)),
+Box(Box(2123)),
+Box(Box(2124)),
+Box(Box(2125)),
+Box(Box(2126)),
+Box(Box(2127)),
+Box(Box(2128)),
+Box(Box(2129)),
+Box(Box(2130)),
+Box(Box(2131)),
+Box(Box(2132)),
+Box(Box(2133)),
+Box(Box(2134)),
+Box(Box(2135)),
+Box(Box(2136)),
+Box(Box(2137)),
+Box(Box(2138)),
+Box(Box(2139)),
+Box(Box(2140)),
+Box(Box(2141)),
+Box(Box(2142)),
+Box(Box(2143)),
+Box(Box(2144)),
+Box(Box(2145)),
+Box(Box(2146)),
+Box(Box(2147)),
+Box(Box(2148)),
+Box(Box(2149)),
+Box(Box(2150)),
+Box(Box(2151)),
+Box(Box(2152)),
+Box(Box(2153)),
+Box(Box(2154)),
+Box(Box(2155)),
+Box(Box(2156)),
+Box(Box(2157)),
+Box(Box(2158)),
+Box(Box(2159)),
+Box(Box(2160)),
+Box(Box(2161)),
+Box(Box(2162)),
+Box(Box(2163)),
+Box(Box(2164)),
+Box(Box(2165)),
+Box(Box(2166)),
+Box(Box(2167)),
+Box(Box(2168)),
+Box(Box(2169)),
+Box(Box(2170)),
+Box(Box(2171)),
+Box(Box(2172)),
+Box(Box(2173)),
+Box(Box(2174)),
+Box(Box(2175)),
+Box(Box(2176)),
+Box(Box(2177)),
+Box(Box(2178)),
+Box(Box(2179)),
+Box(Box(2180)),
+Box(Box(2181)),
+Box(Box(2182)),
+Box(Box(2183)),
+Box(Box(2184)),
+Box(Box(2185)),
+Box(Box(2186)),
+Box(Box(2187)),
+Box(Box(2188)),
+Box(Box(2189)),
+Box(Box(2190)),
+Box(Box(2191)),
+Box(Box(2192)),
+Box(Box(2193)),
+Box(Box(2194)),
+Box(Box(2195)),
+Box(Box(2196)),
+Box(Box(2197)),
+Box(Box(2198)),
+Box(Box(2199)),
+Box(Box(2200)),
+Box(Box(2201)),
+Box(Box(2202)),
+Box(Box(2203)),
+Box(Box(2204)),
+Box(Box(2205)),
+Box(Box(2206)),
+Box(Box(2207)),
+Box(Box(2208)),
+Box(Box(2209)),
+Box(Box(2210)),
+Box(Box(2211)),
+Box(Box(2212)),
+Box(Box(2213)),
+Box(Box(2214)),
+Box(Box(2215)),
+Box(Box(2216)),
+Box(Box(2217)),
+Box(Box(2218)),
+Box(Box(2219)),
+Box(Box(2220)),
+Box(Box(2221)),
+Box(Box(2222)),
+Box(Box(2223)),
+Box(Box(2224)),
+Box(Box(2225)),
+Box(Box(2226)),
+Box(Box(2227)),
+Box(Box(2228)),
+Box(Box(2229)),
+Box(Box(2230)),
+Box(Box(2231)),
+Box(Box(2232)),
+Box(Box(2233)),
+Box(Box(2234)),
+Box(Box(2235)),
+Box(Box(2236)),
+Box(Box(2237)),
+Box(Box(2238)),
+Box(Box(2239)),
+Box(Box(2240)),
+Box(Box(2241)),
+Box(Box(2242)),
+Box(Box(2243)),
+Box(Box(2244)),
+Box(Box(2245)),
+Box(Box(2246)),
+Box(Box(2247)),
+Box(Box(2248)),
+Box(Box(2249)),
+Box(Box(2250)),
+Box(Box(2251)),
+Box(Box(2252)),
+Box(Box(2253)),
+Box(Box(2254)),
+Box(Box(2255)),
+Box(Box(2256)),
+Box(Box(2257)),
+Box(Box(2258)),
+Box(Box(2259)),
+Box(Box(2260)),
+Box(Box(2261)),
+Box(Box(2262)),
+Box(Box(2263)),
+Box(Box(2264)),
+Box(Box(2265)),
+Box(Box(2266)),
+Box(Box(2267)),
+Box(Box(2268)),
+Box(Box(2269)),
+Box(Box(2270)),
+Box(Box(2271)),
+Box(Box(2272)),
+Box(Box(2273)),
+Box(Box(2274)),
+Box(Box(2275)),
+Box(Box(2276)),
+Box(Box(2277)),
+Box(Box(2278)),
+Box(Box(2279)),
+Box(Box(2280)),
+Box(Box(2281)),
+Box(Box(2282)),
+Box(Box(2283)),
+Box(Box(2284)),
+Box(Box(2285)),
+Box(Box(2286)),
+Box(Box(2287)),
+Box(Box(2288)),
+Box(Box(2289)),
+Box(Box(2290)),
+Box(Box(2291)),
+Box(Box(2292)),
+Box(Box(2293)),
+Box(Box(2294)),
+Box(Box(2295)),
+Box(Box(2296)),
+Box(Box(2297)),
+Box(Box(2298)),
+Box(Box(2299)),
+Box(Box(2300)),
+Box(Box(2301)),
+Box(Box(2302)),
+Box(Box(2303)),
+Box(Box(2304)),
+Box(Box(2305)),
+Box(Box(2306)),
+Box(Box(2307)),
+Box(Box(2308)),
+Box(Box(2309)),
+Box(Box(2310)),
+Box(Box(2311)),
+Box(Box(2312)),
+Box(Box(2313)),
+Box(Box(2314)),
+Box(Box(2315)),
+Box(Box(2316)),
+Box(Box(2317)),
+Box(Box(2318)),
+Box(Box(2319)),
+Box(Box(2320)),
+Box(Box(2321)),
+Box(Box(2322)),
+Box(Box(2323)),
+Box(Box(2324)),
+Box(Box(2325)),
+Box(Box(2326)),
+Box(Box(2327)),
+Box(Box(2328)),
+Box(Box(2329)),
+Box(Box(2330)),
+Box(Box(2331)),
+Box(Box(2332)),
+Box(Box(2333)),
+Box(Box(2334)),
+Box(Box(2335)),
+Box(Box(2336)),
+Box(Box(2337)),
+Box(Box(2338)),
+Box(Box(2339)),
+Box(Box(2340)),
+Box(Box(2341)),
+Box(Box(2342)),
+Box(Box(2343)),
+Box(Box(2344)),
+Box(Box(2345)),
+Box(Box(2346)),
+Box(Box(2347)),
+Box(Box(2348)),
+Box(Box(2349)),
+Box(Box(2350)),
+Box(Box(2351)),
+Box(Box(2352)),
+Box(Box(2353)),
+Box(Box(2354)),
+Box(Box(2355)),
+Box(Box(2356)),
+Box(Box(2357)),
+Box(Box(2358)),
+Box(Box(2359)),
+Box(Box(2360)),
+Box(Box(2361)),
+Box(Box(2362)),
+Box(Box(2363)),
+Box(Box(2364)),
+Box(Box(2365)),
+Box(Box(2366)),
+Box(Box(2367)),
+Box(Box(2368)),
+Box(Box(2369)),
+Box(Box(2370)),
+Box(Box(2371)),
+Box(Box(2372)),
+Box(Box(2373)),
+Box(Box(2374)),
+Box(Box(2375)),
+Box(Box(2376)),
+Box(Box(2377)),
+Box(Box(2378)),
+Box(Box(2379)),
+Box(Box(2380)),
+Box(Box(2381)),
+Box(Box(2382)),
+Box(Box(2383)),
+Box(Box(2384)),
+Box(Box(2385)),
+Box(Box(2386)),
+Box(Box(2387)),
+Box(Box(2388)),
+Box(Box(2389)),
+Box(Box(2390)),
+Box(Box(2391)),
+Box(Box(2392)),
+Box(Box(2393)),
+Box(Box(2394)),
+Box(Box(2395)),
+Box(Box(2396)),
+Box(Box(2397)),
+Box(Box(2398)),
+Box(Box(2399)),
+Box(Box(2400)),
+Box(Box(2401)),
+Box(Box(2402)),
+Box(Box(2403)),
+Box(Box(2404)),
+Box(Box(2405)),
+Box(Box(2406)),
+Box(Box(2407)),
+Box(Box(2408)),
+Box(Box(2409)),
+Box(Box(2410)),
+Box(Box(2411)),
+Box(Box(2412)),
+Box(Box(2413)),
+Box(Box(2414)),
+Box(Box(2415)),
+Box(Box(2416)),
+Box(Box(2417)),
+Box(Box(2418)),
+Box(Box(2419)),
+Box(Box(2420)),
+Box(Box(2421)),
+Box(Box(2422)),
+Box(Box(2423)),
+Box(Box(2424)),
+Box(Box(2425)),
+Box(Box(2426)),
+Box(Box(2427)),
+Box(Box(2428)),
+Box(Box(2429)),
+Box(Box(2430)),
+Box(Box(2431)),
+Box(Box(2432)),
+Box(Box(2433)),
+Box(Box(2434)),
+Box(Box(2435)),
+Box(Box(2436)),
+Box(Box(2437)),
+Box(Box(2438)),
+Box(Box(2439)),
+Box(Box(2440)),
+Box(Box(2441)),
+Box(Box(2442)),
+Box(Box(2443)),
+Box(Box(2444)),
+Box(Box(2445)),
+Box(Box(2446)),
+Box(Box(2447)),
+Box(Box(2448)),
+Box(Box(2449)),
+Box(Box(2450)),
+Box(Box(2451)),
+Box(Box(2452)),
+Box(Box(2453)),
+Box(Box(2454)),
+Box(Box(2455)),
+Box(Box(2456)),
+Box(Box(2457)),
+Box(Box(2458)),
+Box(Box(2459)),
+Box(Box(2460)),
+Box(Box(2461)),
+Box(Box(2462)),
+Box(Box(2463)),
+Box(Box(2464)),
+Box(Box(2465)),
+Box(Box(2466)),
+Box(Box(2467)),
+Box(Box(2468)),
+Box(Box(2469)),
+Box(Box(2470)),
+Box(Box(2471)),
+Box(Box(2472)),
+Box(Box(2473)),
+Box(Box(2474)),
+Box(Box(2475)),
+Box(Box(2476)),
+Box(Box(2477)),
+Box(Box(2478)),
+Box(Box(2479)),
+Box(Box(2480)),
+Box(Box(2481)),
+Box(Box(2482)),
+Box(Box(2483)),
+Box(Box(2484)),
+Box(Box(2485)),
+Box(Box(2486)),
+Box(Box(2487)),
+Box(Box(2488)),
+Box(Box(2489)),
+Box(Box(2490)),
+Box(Box(2491)),
+Box(Box(2492)),
+Box(Box(2493)),
+Box(Box(2494)),
+Box(Box(2495)),
+Box(Box(2496)),
+Box(Box(2497)),
+Box(Box(2498)),
+Box(Box(2499)),
+Box(Box(2500)),
+Box(Box(2501)),
+Box(Box(2502)),
+Box(Box(2503)),
+Box(Box(2504)),
+Box(Box(2505)),
+Box(Box(2506)),
+Box(Box(2507)),
+Box(Box(2508)),
+Box(Box(2509)),
+Box(Box(2510)),
+Box(Box(2511)),
+Box(Box(2512)),
+Box(Box(2513)),
+Box(Box(2514)),
+Box(Box(2515)),
+Box(Box(2516)),
+Box(Box(2517)),
+Box(Box(2518)),
+Box(Box(2519)),
+Box(Box(2520)),
+Box(Box(2521)),
+Box(Box(2522)),
+Box(Box(2523)),
+Box(Box(2524)),
+Box(Box(2525)),
+Box(Box(2526)),
+Box(Box(2527)),
+Box(Box(2528)),
+Box(Box(2529)),
+Box(Box(2530)),
+Box(Box(2531)),
+Box(Box(2532)),
+Box(Box(2533)),
+Box(Box(2534)),
+Box(Box(2535)),
+Box(Box(2536)),
+Box(Box(2537)),
+Box(Box(2538)),
+Box(Box(2539)),
+Box(Box(2540)),
+Box(Box(2541)),
+Box(Box(2542)),
+Box(Box(2543)),
+Box(Box(2544)),
+Box(Box(2545)),
+Box(Box(2546)),
+Box(Box(2547)),
+Box(Box(2548)),
+Box(Box(2549)),
+Box(Box(2550)),
+Box(Box(2551)),
+Box(Box(2552)),
+Box(Box(2553)),
+Box(Box(2554)),
+Box(Box(2555)),
+Box(Box(2556)),
+Box(Box(2557)),
+Box(Box(2558)),
+Box(Box(2559)),
+Box(Box(2560)),
+Box(Box(2561)),
+Box(Box(2562)),
+Box(Box(2563)),
+Box(Box(2564)),
+Box(Box(2565)),
+Box(Box(2566)),
+Box(Box(2567)),
+Box(Box(2568)),
+Box(Box(2569)),
+Box(Box(2570)),
+Box(Box(2571)),
+Box(Box(2572)),
+Box(Box(2573)),
+Box(Box(2574)),
+Box(Box(2575)),
+Box(Box(2576)),
+Box(Box(2577)),
+Box(Box(2578)),
+Box(Box(2579)),
+Box(Box(2580)),
+Box(Box(2581)),
+Box(Box(2582)),
+Box(Box(2583)),
+Box(Box(2584)),
+Box(Box(2585)),
+Box(Box(2586)),
+Box(Box(2587)),
+Box(Box(2588)),
+Box(Box(2589)),
+Box(Box(2590)),
+Box(Box(2591)),
+Box(Box(2592)),
+Box(Box(2593)),
+Box(Box(2594)),
+Box(Box(2595)),
+Box(Box(2596)),
+Box(Box(2597)),
+Box(Box(2598)),
+Box(Box(2599)),
+Box(Box(2600)),
+Box(Box(2601)),
+Box(Box(2602)),
+Box(Box(2603)),
+Box(Box(2604)),
+Box(Box(2605)),
+Box(Box(2606)),
+Box(Box(2607)),
+Box(Box(2608)),
+Box(Box(2609)),
+Box(Box(2610)),
+Box(Box(2611)),
+Box(Box(2612)),
+Box(Box(2613)),
+Box(Box(2614)),
+Box(Box(2615)),
+Box(Box(2616)),
+Box(Box(2617)),
+Box(Box(2618)),
+Box(Box(2619)),
+Box(Box(2620)),
+Box(Box(2621)),
+Box(Box(2622)),
+Box(Box(2623)),
+Box(Box(2624)),
+Box(Box(2625)),
+Box(Box(2626)),
+Box(Box(2627)),
+Box(Box(2628)),
+Box(Box(2629)),
+Box(Box(2630)),
+Box(Box(2631)),
+Box(Box(2632)),
+Box(Box(2633)),
+Box(Box(2634)),
+Box(Box(2635)),
+Box(Box(2636)),
+Box(Box(2637)),
+Box(Box(2638)),
+Box(Box(2639)),
+Box(Box(2640)),
+Box(Box(2641)),
+Box(Box(2642)),
+Box(Box(2643)),
+Box(Box(2644)),
+Box(Box(2645)),
+Box(Box(2646)),
+Box(Box(2647)),
+Box(Box(2648)),
+Box(Box(2649)),
+Box(Box(2650)),
+Box(Box(2651)),
+Box(Box(2652)),
+Box(Box(2653)),
+Box(Box(2654)),
+Box(Box(2655)),
+Box(Box(2656)),
+Box(Box(2657)),
+Box(Box(2658)),
+Box(Box(2659)),
+Box(Box(2660)),
+Box(Box(2661)),
+Box(Box(2662)),
+Box(Box(2663)),
+Box(Box(2664)),
+Box(Box(2665)),
+Box(Box(2666)),
+Box(Box(2667)),
+Box(Box(2668)),
+Box(Box(2669)),
+Box(Box(2670)),
+Box(Box(2671)),
+Box(Box(2672)),
+Box(Box(2673)),
+Box(Box(2674)),
+Box(Box(2675)),
+Box(Box(2676)),
+Box(Box(2677)),
+Box(Box(2678)),
+Box(Box(2679)),
+Box(Box(2680)),
+Box(Box(2681)),
+Box(Box(2682)),
+Box(Box(2683)),
+Box(Box(2684)),
+Box(Box(2685)),
+Box(Box(2686)),
+Box(Box(2687)),
+Box(Box(2688)),
+Box(Box(2689)),
+Box(Box(2690)),
+Box(Box(2691)),
+Box(Box(2692)),
+Box(Box(2693)),
+Box(Box(2694)),
+Box(Box(2695)),
+Box(Box(2696)),
+Box(Box(2697)),
+Box(Box(2698)),
+Box(Box(2699)),
+Box(Box(2700)),
+Box(Box(2701)),
+Box(Box(2702)),
+Box(Box(2703)),
+Box(Box(2704)),
+Box(Box(2705)),
+Box(Box(2706)),
+Box(Box(2707)),
+Box(Box(2708)),
+Box(Box(2709)),
+Box(Box(2710)),
+Box(Box(2711)),
+Box(Box(2712)),
+Box(Box(2713)),
+Box(Box(2714)),
+Box(Box(2715)),
+Box(Box(2716)),
+Box(Box(2717)),
+Box(Box(2718)),
+Box(Box(2719)),
+Box(Box(2720)),
+Box(Box(2721)),
+Box(Box(2722)),
+Box(Box(2723)),
+Box(Box(2724)),
+Box(Box(2725)),
+Box(Box(2726)),
+Box(Box(2727)),
+Box(Box(2728)),
+Box(Box(2729)),
+Box(Box(2730)),
+Box(Box(2731)),
+Box(Box(2732)),
+Box(Box(2733)),
+Box(Box(2734)),
+Box(Box(2735)),
+Box(Box(2736)),
+Box(Box(2737)),
+Box(Box(2738)),
+Box(Box(2739)),
+Box(Box(2740)),
+Box(Box(2741)),
+Box(Box(2742)),
+Box(Box(2743)),
+Box(Box(2744)),
+Box(Box(2745)),
+Box(Box(2746)),
+Box(Box(2747)),
+Box(Box(2748)),
+Box(Box(2749)),
+Box(Box(2750)),
+Box(Box(2751)),
+Box(Box(2752)),
+Box(Box(2753)),
+Box(Box(2754)),
+Box(Box(2755)),
+Box(Box(2756)),
+Box(Box(2757)),
+Box(Box(2758)),
+Box(Box(2759)),
+Box(Box(2760)),
+Box(Box(2761)),
+Box(Box(2762)),
+Box(Box(2763)),
+Box(Box(2764)),
+Box(Box(2765)),
+Box(Box(2766)),
+Box(Box(2767)),
+Box(Box(2768)),
+Box(Box(2769)),
+Box(Box(2770)),
+Box(Box(2771)),
+Box(Box(2772)),
+Box(Box(2773)),
+Box(Box(2774)),
+Box(Box(2775)),
+Box(Box(2776)),
+Box(Box(2777)),
+Box(Box(2778)),
+Box(Box(2779)),
+Box(Box(2780)),
+Box(Box(2781)),
+Box(Box(2782)),
+Box(Box(2783)),
+Box(Box(2784)),
+Box(Box(2785)),
+Box(Box(2786)),
+Box(Box(2787)),
+Box(Box(2788)),
+Box(Box(2789)),
+Box(Box(2790)),
+Box(Box(2791)),
+Box(Box(2792)),
+Box(Box(2793)),
+Box(Box(2794)),
+Box(Box(2795)),
+Box(Box(2796)),
+Box(Box(2797)),
+Box(Box(2798)),
+Box(Box(2799)),
+Box(Box(2800)),
+Box(Box(2801)),
+Box(Box(2802)),
+Box(Box(2803)),
+Box(Box(2804)),
+Box(Box(2805)),
+Box(Box(2806)),
+Box(Box(2807)),
+Box(Box(2808)),
+Box(Box(2809)),
+Box(Box(2810)),
+Box(Box(2811)),
+Box(Box(2812)),
+Box(Box(2813)),
+Box(Box(2814)),
+Box(Box(2815)),
+Box(Box(2816)),
+Box(Box(2817)),
+Box(Box(2818)),
+Box(Box(2819)),
+Box(Box(2820)),
+Box(Box(2821)),
+Box(Box(2822)),
+Box(Box(2823)),
+Box(Box(2824)),
+Box(Box(2825)),
+Box(Box(2826)),
+Box(Box(2827)),
+Box(Box(2828)),
+Box(Box(2829)),
+Box(Box(2830)),
+Box(Box(2831)),
+Box(Box(2832)),
+Box(Box(2833)),
+Box(Box(2834)),
+Box(Box(2835)),
+Box(Box(2836)),
+Box(Box(2837)),
+Box(Box(2838)),
+Box(Box(2839)),
+Box(Box(2840)),
+Box(Box(2841)),
+Box(Box(2842)),
+Box(Box(2843)),
+Box(Box(2844)),
+Box(Box(2845)),
+Box(Box(2846)),
+Box(Box(2847)),
+Box(Box(2848)),
+Box(Box(2849)),
+Box(Box(2850)),
+Box(Box(2851)),
+Box(Box(2852)),
+Box(Box(2853)),
+Box(Box(2854)),
+Box(Box(2855)),
+Box(Box(2856)),
+Box(Box(2857)),
+Box(Box(2858)),
+Box(Box(2859)),
+Box(Box(2860)),
+Box(Box(2861)),
+Box(Box(2862)),
+Box(Box(2863)),
+Box(Box(2864)),
+Box(Box(2865)),
+Box(Box(2866)),
+Box(Box(2867)),
+Box(Box(2868)),
+Box(Box(2869)),
+Box(Box(2870)),
+Box(Box(2871)),
+Box(Box(2872)),
+Box(Box(2873)),
+Box(Box(2874)),
+Box(Box(2875)),
+Box(Box(2876)),
+Box(Box(2877)),
+Box(Box(2878)),
+Box(Box(2879)),
+Box(Box(2880)),
+Box(Box(2881)),
+Box(Box(2882)),
+Box(Box(2883)),
+Box(Box(2884)),
+Box(Box(2885)),
+Box(Box(2886)),
+Box(Box(2887)),
+Box(Box(2888)),
+Box(Box(2889)),
+Box(Box(2890)),
+Box(Box(2891)),
+Box(Box(2892)),
+Box(Box(2893)),
+Box(Box(2894)),
+Box(Box(2895)),
+Box(Box(2896)),
+Box(Box(2897)),
+Box(Box(2898)),
+Box(Box(2899)),
+Box(Box(2900)),
+Box(Box(2901)),
+Box(Box(2902)),
+Box(Box(2903)),
+Box(Box(2904)),
+Box(Box(2905)),
+Box(Box(2906)),
+Box(Box(2907)),
+Box(Box(2908)),
+Box(Box(2909)),
+Box(Box(2910)),
+Box(Box(2911)),
+Box(Box(2912)),
+Box(Box(2913)),
+Box(Box(2914)),
+Box(Box(2915)),
+Box(Box(2916)),
+Box(Box(2917)),
+Box(Box(2918)),
+Box(Box(2919)),
+Box(Box(2920)),
+Box(Box(2921)),
+Box(Box(2922)),
+Box(Box(2923)),
+Box(Box(2924)),
+Box(Box(2925)),
+Box(Box(2926)),
+Box(Box(2927)),
+Box(Box(2928)),
+Box(Box(2929)),
+Box(Box(2930)),
+Box(Box(2931)),
+Box(Box(2932)),
+Box(Box(2933)),
+Box(Box(2934)),
+Box(Box(2935)),
+Box(Box(2936)),
+Box(Box(2937)),
+Box(Box(2938)),
+Box(Box(2939)),
+Box(Box(2940)),
+Box(Box(2941)),
+Box(Box(2942)),
+Box(Box(2943)),
+Box(Box(2944)),
+Box(Box(2945)),
+Box(Box(2946)),
+Box(Box(2947)),
+Box(Box(2948)),
+Box(Box(2949)),
+Box(Box(2950)),
+Box(Box(2951)),
+Box(Box(2952)),
+Box(Box(2953)),
+Box(Box(2954)),
+Box(Box(2955)),
+Box(Box(2956)),
+Box(Box(2957)),
+Box(Box(2958)),
+Box(Box(2959)),
+Box(Box(2960)),
+Box(Box(2961)),
+Box(Box(2962)),
+Box(Box(2963)),
+Box(Box(2964)),
+Box(Box(2965)),
+Box(Box(2966)),
+Box(Box(2967)),
+Box(Box(2968)),
+Box(Box(2969)),
+Box(Box(2970)),
+Box(Box(2971)),
+Box(Box(2972)),
+Box(Box(2973)),
+Box(Box(2974)),
+Box(Box(2975)),
+Box(Box(2976)),
+Box(Box(2977)),
+Box(Box(2978)),
+Box(Box(2979)),
+Box(Box(2980)),
+Box(Box(2981)),
+Box(Box(2982)),
+Box(Box(2983)),
+Box(Box(2984)),
+Box(Box(2985)),
+Box(Box(2986)),
+Box(Box(2987)),
+Box(Box(2988)),
+Box(Box(2989)),
+Box(Box(2990)),
+Box(Box(2991)),
+Box(Box(2992)),
+Box(Box(2993)),
+Box(Box(2994)),
+Box(Box(2995)),
+Box(Box(2996)),
+Box(Box(2997)),
+Box(Box(2998)),
+Box(Box(2999)),
+Box(Box(3000)),
+Box(Box(3001)),
+Box(Box(3002)),
+Box(Box(3003)),
+Box(Box(3004)),
+Box(Box(3005)),
+Box(Box(3006)),
+Box(Box(3007)),
+Box(Box(3008)),
+Box(Box(3009)),
+Box(Box(3010)),
+Box(Box(3011)),
+Box(Box(3012)),
+Box(Box(3013)),
+Box(Box(3014)),
+Box(Box(3015)),
+Box(Box(3016)),
+Box(Box(3017)),
+Box(Box(3018)),
+Box(Box(3019)),
+Box(Box(3020)),
+Box(Box(3021)),
+Box(Box(3022)),
+Box(Box(3023)),
+Box(Box(3024)),
+Box(Box(3025)),
+Box(Box(3026)),
+Box(Box(3027)),
+Box(Box(3028)),
+Box(Box(3029)),
+Box(Box(3030)),
+Box(Box(3031)),
+Box(Box(3032)),
+Box(Box(3033)),
+Box(Box(3034)),
+Box(Box(3035)),
+Box(Box(3036)),
+Box(Box(3037)),
+Box(Box(3038)),
+Box(Box(3039)),
+Box(Box(3040)),
+Box(Box(3041)),
+Box(Box(3042)),
+Box(Box(3043)),
+Box(Box(3044)),
+Box(Box(3045)),
+Box(Box(3046)),
+Box(Box(3047)),
+Box(Box(3048)),
+Box(Box(3049)),
+Box(Box(3050)),
+Box(Box(3051)),
+Box(Box(3052)),
+Box(Box(3053)),
+Box(Box(3054)),
+Box(Box(3055)),
+Box(Box(3056)),
+Box(Box(3057)),
+Box(Box(3058)),
+Box(Box(3059)),
+Box(Box(3060)),
+Box(Box(3061)),
+Box(Box(3062)),
+Box(Box(3063)),
+Box(Box(3064)),
+Box(Box(3065)),
+Box(Box(3066)),
+Box(Box(3067)),
+Box(Box(3068)),
+Box(Box(3069)),
+Box(Box(3070)),
+Box(Box(3071)),
+Box(Box(3072)),
+Box(Box(3073)),
+Box(Box(3074)),
+Box(Box(3075)),
+Box(Box(3076)),
+Box(Box(3077)),
+Box(Box(3078)),
+Box(Box(3079)),
+Box(Box(3080)),
+Box(Box(3081)),
+Box(Box(3082)),
+Box(Box(3083)),
+Box(Box(3084)),
+Box(Box(3085)),
+Box(Box(3086)),
+Box(Box(3087)),
+Box(Box(3088)),
+Box(Box(3089)),
+Box(Box(3090)),
+Box(Box(3091)),
+Box(Box(3092)),
+Box(Box(3093)),
+Box(Box(3094)),
+Box(Box(3095)),
+Box(Box(3096)),
+Box(Box(3097)),
+Box(Box(3098)),
+Box(Box(3099)),
+Box(Box(3100)),
+Box(Box(3101)),
+Box(Box(3102)),
+Box(Box(3103)),
+Box(Box(3104)),
+Box(Box(3105)),
+Box(Box(3106)),
+Box(Box(3107)),
+Box(Box(3108)),
+Box(Box(3109)),
+Box(Box(3110)),
+Box(Box(3111)),
+Box(Box(3112)),
+Box(Box(3113)),
+Box(Box(3114)),
+Box(Box(3115)),
+Box(Box(3116)),
+Box(Box(3117)),
+Box(Box(3118)),
+Box(Box(3119)),
+Box(Box(3120)),
+Box(Box(3121)),
+Box(Box(3122)),
+Box(Box(3123)),
+Box(Box(3124)),
+Box(Box(3125)),
+Box(Box(3126)),
+Box(Box(3127)),
+Box(Box(3128)),
+Box(Box(3129)),
+Box(Box(3130)),
+Box(Box(3131)),
+Box(Box(3132)),
+Box(Box(3133)),
+Box(Box(3134)),
+Box(Box(3135)),
+Box(Box(3136)),
+Box(Box(3137)),
+Box(Box(3138)),
+Box(Box(3139)),
+Box(Box(3140)),
+Box(Box(3141)),
+Box(Box(3142)),
+Box(Box(3143)),
+Box(Box(3144)),
+Box(Box(3145)),
+Box(Box(3146)),
+Box(Box(3147)),
+Box(Box(3148)),
+Box(Box(3149)),
+Box(Box(3150)),
+Box(Box(3151)),
+Box(Box(3152)),
+Box(Box(3153)),
+Box(Box(3154)),
+Box(Box(3155)),
+Box(Box(3156)),
+Box(Box(3157)),
+Box(Box(3158)),
+Box(Box(3159)),
+Box(Box(3160)),
+Box(Box(3161)),
+Box(Box(3162)),
+Box(Box(3163)),
+Box(Box(3164)),
+Box(Box(3165)),
+Box(Box(3166)),
+Box(Box(3167)),
+Box(Box(3168)),
+Box(Box(3169)),
+Box(Box(3170)),
+Box(Box(3171)),
+Box(Box(3172)),
+Box(Box(3173)),
+Box(Box(3174)),
+Box(Box(3175)),
+Box(Box(3176)),
+Box(Box(3177)),
+Box(Box(3178)),
+Box(Box(3179)),
+Box(Box(3180)),
+Box(Box(3181)),
+Box(Box(3182)),
+Box(Box(3183)),
+Box(Box(3184)),
+Box(Box(3185)),
+Box(Box(3186)),
+Box(Box(3187)),
+Box(Box(3188)),
+Box(Box(3189)),
+Box(Box(3190)),
+Box(Box(3191)),
+Box(Box(3192)),
+Box(Box(3193)),
+Box(Box(3194)),
+Box(Box(3195)),
+Box(Box(3196)),
+Box(Box(3197)),
+Box(Box(3198)),
+Box(Box(3199)),
+Box(Box(3200)),
+Box(Box(3201)),
+Box(Box(3202)),
+Box(Box(3203)),
+Box(Box(3204)),
+Box(Box(3205)),
+Box(Box(3206)),
+Box(Box(3207)),
+Box(Box(3208)),
+Box(Box(3209)),
+Box(Box(3210)),
+Box(Box(3211)),
+Box(Box(3212)),
+Box(Box(3213)),
+Box(Box(3214)),
+Box(Box(3215)),
+Box(Box(3216)),
+Box(Box(3217)),
+Box(Box(3218)),
+Box(Box(3219)),
+Box(Box(3220)),
+Box(Box(3221)),
+Box(Box(3222)),
+Box(Box(3223)),
+Box(Box(3224)),
+Box(Box(3225)),
+Box(Box(3226)),
+Box(Box(3227)),
+Box(Box(3228)),
+Box(Box(3229)),
+Box(Box(3230)),
+Box(Box(3231)),
+Box(Box(3232)),
+Box(Box(3233)),
+Box(Box(3234)),
+Box(Box(3235)),
+Box(Box(3236)),
+Box(Box(3237)),
+Box(Box(3238)),
+Box(Box(3239)),
+Box(Box(3240)),
+Box(Box(3241)),
+Box(Box(3242)),
+Box(Box(3243)),
+Box(Box(3244)),
+Box(Box(3245)),
+Box(Box(3246)),
+Box(Box(3247)),
+Box(Box(3248)),
+Box(Box(3249)),
+Box(Box(3250)),
+Box(Box(3251)),
+Box(Box(3252)),
+Box(Box(3253)),
+Box(Box(3254)),
+Box(Box(3255)),
+Box(Box(3256)),
+Box(Box(3257)),
+Box(Box(3258)),
+Box(Box(3259)),
+Box(Box(3260)),
+Box(Box(3261)),
+Box(Box(3262)),
+Box(Box(3263)),
+Box(Box(3264)),
+Box(Box(3265)),
+Box(Box(3266)),
+Box(Box(3267)),
+Box(Box(3268)),
+Box(Box(3269)),
+Box(Box(3270)),
+Box(Box(3271)),
+Box(Box(3272)),
+Box(Box(3273)),
+Box(Box(3274)),
+Box(Box(3275)),
+Box(Box(3276)),
+Box(Box(3277)),
+Box(Box(3278)),
+Box(Box(3279)),
+Box(Box(3280)),
+Box(Box(3281)),
+Box(Box(3282)),
+Box(Box(3283)),
+Box(Box(3284)),
+Box(Box(3285)),
+Box(Box(3286)),
+Box(Box(3287)),
+Box(Box(3288)),
+Box(Box(3289)),
+Box(Box(3290)),
+Box(Box(3291)),
+Box(Box(3292)),
+Box(Box(3293)),
+Box(Box(3294)),
+Box(Box(3295)),
+Box(Box(3296)),
+Box(Box(3297)),
+Box(Box(3298)),
+Box(Box(3299)),
+Box(Box(3300)),
+Box(Box(3301)),
+Box(Box(3302)),
+Box(Box(3303)),
+Box(Box(3304)),
+Box(Box(3305)),
+Box(Box(3306)),
+Box(Box(3307)),
+Box(Box(3308)),
+Box(Box(3309)),
+Box(Box(3310)),
+Box(Box(3311)),
+Box(Box(3312)),
+Box(Box(3313)),
+Box(Box(3314)),
+Box(Box(3315)),
+Box(Box(3316)),
+Box(Box(3317)),
+Box(Box(3318)),
+Box(Box(3319)),
+Box(Box(3320)),
+Box(Box(3321)),
+Box(Box(3322)),
+Box(Box(3323)),
+Box(Box(3324)),
+Box(Box(3325)),
+Box(Box(3326)),
+Box(Box(3327)),
+Box(Box(3328)),
+Box(Box(3329)),
+Box(Box(3330)),
+Box(Box(3331)),
+Box(Box(3332)),
+Box(Box(3333)),
+Box(Box(3334)),
+Box(Box(3335)),
+Box(Box(3336)),
+Box(Box(3337)),
+Box(Box(3338)),
+Box(Box(3339)),
+Box(Box(3340)),
+Box(Box(3341)),
+Box(Box(3342)),
+Box(Box(3343)),
+Box(Box(3344)),
+Box(Box(3345)),
+Box(Box(3346)),
+Box(Box(3347)),
+Box(Box(3348)),
+Box(Box(3349)),
+Box(Box(3350)),
+Box(Box(3351)),
+Box(Box(3352)),
+Box(Box(3353)),
+Box(Box(3354)),
+Box(Box(3355)),
+Box(Box(3356)),
+Box(Box(3357)),
+Box(Box(3358)),
+Box(Box(3359)),
+Box(Box(3360)),
+Box(Box(3361)),
+Box(Box(3362)),
+Box(Box(3363)),
+Box(Box(3364)),
+Box(Box(3365)),
+Box(Box(3366)),
+Box(Box(3367)),
+Box(Box(3368)),
+Box(Box(3369)),
+Box(Box(3370)),
+Box(Box(3371)),
+Box(Box(3372)),
+Box(Box(3373)),
+Box(Box(3374)),
+Box(Box(3375)),
+Box(Box(3376)),
+Box(Box(3377)),
+Box(Box(3378)),
+Box(Box(3379)),
+Box(Box(3380)),
+Box(Box(3381)),
+Box(Box(3382)),
+Box(Box(3383)),
+Box(Box(3384)),
+Box(Box(3385)),
+Box(Box(3386)),
+Box(Box(3387)),
+Box(Box(3388)),
+Box(Box(3389)),
+Box(Box(3390)),
+Box(Box(3391)),
+Box(Box(3392)),
+Box(Box(3393)),
+Box(Box(3394)),
+Box(Box(3395)),
+Box(Box(3396)),
+Box(Box(3397)),
+Box(Box(3398)),
+Box(Box(3399)),
+Box(Box(3400)),
+Box(Box(3401)),
+Box(Box(3402)),
+Box(Box(3403)),
+Box(Box(3404)),
+Box(Box(3405)),
+Box(Box(3406)),
+Box(Box(3407)),
+Box(Box(3408)),
+Box(Box(3409)),
+Box(Box(3410)),
+Box(Box(3411)),
+Box(Box(3412)),
+Box(Box(3413)),
+Box(Box(3414)),
+Box(Box(3415)),
+Box(Box(3416)),
+Box(Box(3417)),
+Box(Box(3418)),
+Box(Box(3419)),
+Box(Box(3420)),
+Box(Box(3421)),
+Box(Box(3422)),
+Box(Box(3423)),
+Box(Box(3424)),
+Box(Box(3425)),
+Box(Box(3426)),
+Box(Box(3427)),
+Box(Box(3428)),
+Box(Box(3429)),
+Box(Box(3430)),
+Box(Box(3431)),
+Box(Box(3432)),
+Box(Box(3433)),
+Box(Box(3434)),
+Box(Box(3435)),
+Box(Box(3436)),
+Box(Box(3437)),
+Box(Box(3438)),
+Box(Box(3439)),
+Box(Box(3440)),
+Box(Box(3441)),
+Box(Box(3442)),
+Box(Box(3443)),
+Box(Box(3444)),
+Box(Box(3445)),
+Box(Box(3446)),
+Box(Box(3447)),
+Box(Box(3448)),
+Box(Box(3449)),
+Box(Box(3450)),
+Box(Box(3451)),
+Box(Box(3452)),
+Box(Box(3453)),
+Box(Box(3454)),
+Box(Box(3455)),
+Box(Box(3456)),
+Box(Box(3457)),
+Box(Box(3458)),
+Box(Box(3459)),
+Box(Box(3460)),
+Box(Box(3461)),
+Box(Box(3462)),
+Box(Box(3463)),
+Box(Box(3464)),
+Box(Box(3465)),
+Box(Box(3466)),
+Box(Box(3467)),
+Box(Box(3468)),
+Box(Box(3469)),
+Box(Box(3470)),
+Box(Box(3471)),
+Box(Box(3472)),
+Box(Box(3473)),
+Box(Box(3474)),
+Box(Box(3475)),
+Box(Box(3476)),
+Box(Box(3477)),
+Box(Box(3478)),
+Box(Box(3479)),
+Box(Box(3480)),
+Box(Box(3481)),
+Box(Box(3482)),
+Box(Box(3483)),
+Box(Box(3484)),
+Box(Box(3485)),
+Box(Box(3486)),
+Box(Box(3487)),
+Box(Box(3488)),
+Box(Box(3489)),
+Box(Box(3490)),
+Box(Box(3491)),
+Box(Box(3492)),
+Box(Box(3493)),
+Box(Box(3494)),
+Box(Box(3495)),
+Box(Box(3496)),
+Box(Box(3497)),
+Box(Box(3498)),
+Box(Box(3499)),
+Box(Box(3500)),
+Box(Box(3501)),
+Box(Box(3502)),
+Box(Box(3503)),
+Box(Box(3504)),
+Box(Box(3505)),
+Box(Box(3506)),
+Box(Box(3507)),
+Box(Box(3508)),
+Box(Box(3509)),
+Box(Box(3510)),
+Box(Box(3511)),
+Box(Box(3512)),
+Box(Box(3513)),
+Box(Box(3514)),
+Box(Box(3515)),
+Box(Box(3516)),
+Box(Box(3517)),
+Box(Box(3518)),
+Box(Box(3519)),
+Box(Box(3520)),
+Box(Box(3521)),
+Box(Box(3522)),
+Box(Box(3523)),
+Box(Box(3524)),
+Box(Box(3525)),
+Box(Box(3526)),
+Box(Box(3527)),
+Box(Box(3528)),
+Box(Box(3529)),
+Box(Box(3530)),
+Box(Box(3531)),
+Box(Box(3532)),
+Box(Box(3533)),
+Box(Box(3534)),
+Box(Box(3535)),
+Box(Box(3536)),
+Box(Box(3537)),
+Box(Box(3538)),
+Box(Box(3539)),
+Box(Box(3540)),
+Box(Box(3541)),
+Box(Box(3542)),
+Box(Box(3543)),
+Box(Box(3544)),
+Box(Box(3545)),
+Box(Box(3546)),
+Box(Box(3547)),
+Box(Box(3548)),
+Box(Box(3549)),
+Box(Box(3550)),
+Box(Box(3551)),
+Box(Box(3552)),
+Box(Box(3553)),
+Box(Box(3554)),
+Box(Box(3555)),
+Box(Box(3556)),
+Box(Box(3557)),
+Box(Box(3558)),
+Box(Box(3559)),
+Box(Box(3560)),
+Box(Box(3561)),
+Box(Box(3562)),
+Box(Box(3563)),
+Box(Box(3564)),
+Box(Box(3565)),
+Box(Box(3566)),
+Box(Box(3567)),
+Box(Box(3568)),
+Box(Box(3569)),
+Box(Box(3570)),
+Box(Box(3571)),
+Box(Box(3572)),
+Box(Box(3573)),
+Box(Box(3574)),
+Box(Box(3575)),
+Box(Box(3576)),
+Box(Box(3577)),
+Box(Box(3578)),
+Box(Box(3579)),
+Box(Box(3580)),
+Box(Box(3581)),
+Box(Box(3582)),
+Box(Box(3583)),
+Box(Box(3584)),
+Box(Box(3585)),
+Box(Box(3586)),
+Box(Box(3587)),
+Box(Box(3588)),
+Box(Box(3589)),
+Box(Box(3590)),
+Box(Box(3591)),
+Box(Box(3592)),
+Box(Box(3593)),
+Box(Box(3594)),
+Box(Box(3595)),
+Box(Box(3596)),
+Box(Box(3597)),
+Box(Box(3598)),
+Box(Box(3599)),
+Box(Box(3600)),
+Box(Box(3601)),
+Box(Box(3602)),
+Box(Box(3603)),
+Box(Box(3604)),
+Box(Box(3605)),
+Box(Box(3606)),
+Box(Box(3607)),
+Box(Box(3608)),
+Box(Box(3609)),
+Box(Box(3610)),
+Box(Box(3611)),
+Box(Box(3612)),
+Box(Box(3613)),
+Box(Box(3614)),
+Box(Box(3615)),
+Box(Box(3616)),
+Box(Box(3617)),
+Box(Box(3618)),
+Box(Box(3619)),
+Box(Box(3620)),
+Box(Box(3621)),
+Box(Box(3622)),
+Box(Box(3623)),
+Box(Box(3624)),
+Box(Box(3625)),
+Box(Box(3626)),
+Box(Box(3627)),
+Box(Box(3628)),
+Box(Box(3629)),
+Box(Box(3630)),
+Box(Box(3631)),
+Box(Box(3632)),
+Box(Box(3633)),
+Box(Box(3634)),
+Box(Box(3635)),
+Box(Box(3636)),
+Box(Box(3637)),
+Box(Box(3638)),
+Box(Box(3639)),
+Box(Box(3640)),
+Box(Box(3641)),
+Box(Box(3642)),
+Box(Box(3643)),
+Box(Box(3644)),
+Box(Box(3645)),
+Box(Box(3646)),
+Box(Box(3647)),
+Box(Box(3648)),
+Box(Box(3649)),
+Box(Box(3650)),
+Box(Box(3651)),
+Box(Box(3652)),
+Box(Box(3653)),
+Box(Box(3654)),
+Box(Box(3655)),
+Box(Box(3656)),
+Box(Box(3657)),
+Box(Box(3658)),
+Box(Box(3659)),
+Box(Box(3660)),
+Box(Box(3661)),
+Box(Box(3662)),
+Box(Box(3663)),
+Box(Box(3664)),
+Box(Box(3665)),
+Box(Box(3666)),
+Box(Box(3667)),
+Box(Box(3668)),
+Box(Box(3669)),
+Box(Box(3670)),
+Box(Box(3671)),
+Box(Box(3672)),
+Box(Box(3673)),
+Box(Box(3674)),
+Box(Box(3675)),
+Box(Box(3676)),
+Box(Box(3677)),
+Box(Box(3678)),
+Box(Box(3679)),
+Box(Box(3680)),
+Box(Box(3681)),
+Box(Box(3682)),
+Box(Box(3683)),
+Box(Box(3684)),
+Box(Box(3685)),
+Box(Box(3686)),
+Box(Box(3687)),
+Box(Box(3688)),
+Box(Box(3689)),
+Box(Box(3690)),
+Box(Box(3691)),
+Box(Box(3692)),
+Box(Box(3693)),
+Box(Box(3694)),
+Box(Box(3695)),
+Box(Box(3696)),
+Box(Box(3697)),
+Box(Box(3698)),
+Box(Box(3699)),
+Box(Box(3700)),
+Box(Box(3701)),
+Box(Box(3702)),
+Box(Box(3703)),
+Box(Box(3704)),
+Box(Box(3705)),
+Box(Box(3706)),
+Box(Box(3707)),
+Box(Box(3708)),
+Box(Box(3709)),
+Box(Box(3710)),
+Box(Box(3711)),
+Box(Box(3712)),
+Box(Box(3713)),
+Box(Box(3714)),
+Box(Box(3715)),
+Box(Box(3716)),
+Box(Box(3717)),
+Box(Box(3718)),
+Box(Box(3719)),
+Box(Box(3720)),
+Box(Box(3721)),
+Box(Box(3722)),
+Box(Box(3723)),
+Box(Box(3724)),
+Box(Box(3725)),
+Box(Box(3726)),
+Box(Box(3727)),
+Box(Box(3728)),
+Box(Box(3729)),
+Box(Box(3730)),
+Box(Box(3731)),
+Box(Box(3732)),
+Box(Box(3733)),
+Box(Box(3734)),
+Box(Box(3735)),
+Box(Box(3736)),
+Box(Box(3737)),
+Box(Box(3738)),
+Box(Box(3739)),
+Box(Box(3740)),
+Box(Box(3741)),
+Box(Box(3742)),
+Box(Box(3743)),
+Box(Box(3744)),
+Box(Box(3745)),
+Box(Box(3746)),
+Box(Box(3747)),
+Box(Box(3748)),
+Box(Box(3749)),
+Box(Box(3750)),
+Box(Box(3751)),
+Box(Box(3752)),
+Box(Box(3753)),
+Box(Box(3754)),
+Box(Box(3755)),
+Box(Box(3756)),
+Box(Box(3757)),
+Box(Box(3758)),
+Box(Box(3759)),
+Box(Box(3760)),
+Box(Box(3761)),
+Box(Box(3762)),
+Box(Box(3763)),
+Box(Box(3764)),
+Box(Box(3765)),
+Box(Box(3766)),
+Box(Box(3767)),
+Box(Box(3768)),
+Box(Box(3769)),
+Box(Box(3770)),
+Box(Box(3771)),
+Box(Box(3772)),
+Box(Box(3773)),
+Box(Box(3774)),
+Box(Box(3775)),
+Box(Box(3776)),
+Box(Box(3777)),
+Box(Box(3778)),
+Box(Box(3779)),
+Box(Box(3780)),
+Box(Box(3781)),
+Box(Box(3782)),
+Box(Box(3783)),
+Box(Box(3784)),
+Box(Box(3785)),
+Box(Box(3786)),
+Box(Box(3787)),
+Box(Box(3788)),
+Box(Box(3789)),
+Box(Box(3790)),
+Box(Box(3791)),
+Box(Box(3792)),
+Box(Box(3793)),
+Box(Box(3794)),
+Box(Box(3795)),
+Box(Box(3796)),
+Box(Box(3797)),
+Box(Box(3798)),
+Box(Box(3799)),
+Box(Box(3800)),
+Box(Box(3801)),
+Box(Box(3802)),
+Box(Box(3803)),
+Box(Box(3804)),
+Box(Box(3805)),
+Box(Box(3806)),
+Box(Box(3807)),
+Box(Box(3808)),
+Box(Box(3809)),
+Box(Box(3810)),
+Box(Box(3811)),
+Box(Box(3812)),
+Box(Box(3813)),
+Box(Box(3814)),
+Box(Box(3815)),
+Box(Box(3816)),
+Box(Box(3817)),
+Box(Box(3818)),
+Box(Box(3819)),
+Box(Box(3820)),
+Box(Box(3821)),
+Box(Box(3822)),
+Box(Box(3823)),
+Box(Box(3824)),
+Box(Box(3825)),
+Box(Box(3826)),
+Box(Box(3827)),
+Box(Box(3828)),
+Box(Box(3829)),
+Box(Box(3830)),
+Box(Box(3831)),
+Box(Box(3832)),
+Box(Box(3833)),
+Box(Box(3834)),
+Box(Box(3835)),
+Box(Box(3836)),
+Box(Box(3837)),
+Box(Box(3838)),
+Box(Box(3839)),
+Box(Box(3840)),
+Box(Box(3841)),
+Box(Box(3842)),
+Box(Box(3843)),
+Box(Box(3844)),
+Box(Box(3845)),
+Box(Box(3846)),
+Box(Box(3847)),
+Box(Box(3848)),
+Box(Box(3849)),
+Box(Box(3850)),
+Box(Box(3851)),
+Box(Box(3852)),
+Box(Box(3853)),
+Box(Box(3854)),
+Box(Box(3855)),
+Box(Box(3856)),
+Box(Box(3857)),
+Box(Box(3858)),
+Box(Box(3859)),
+Box(Box(3860)),
+Box(Box(3861)),
+Box(Box(3862)),
+Box(Box(3863)),
+Box(Box(3864)),
+Box(Box(3865)),
+Box(Box(3866)),
+Box(Box(3867)),
+Box(Box(3868)),
+Box(Box(3869)),
+Box(Box(3870)),
+Box(Box(3871)),
+Box(Box(3872)),
+Box(Box(3873)),
+Box(Box(3874)),
+Box(Box(3875)),
+Box(Box(3876)),
+Box(Box(3877)),
+Box(Box(3878)),
+Box(Box(3879)),
+Box(Box(3880)),
+Box(Box(3881)),
+Box(Box(3882)),
+Box(Box(3883)),
+Box(Box(3884)),
+Box(Box(3885)),
+Box(Box(3886)),
+Box(Box(3887)),
+Box(Box(3888)),
+Box(Box(3889)),
+Box(Box(3890)),
+Box(Box(3891)),
+Box(Box(3892)),
+Box(Box(3893)),
+Box(Box(3894)),
+Box(Box(3895)),
+Box(Box(3896)),
+Box(Box(3897)),
+Box(Box(3898)),
+Box(Box(3899)),
+Box(Box(3900)),
+Box(Box(3901)),
+Box(Box(3902)),
+Box(Box(3903)),
+Box(Box(3904)),
+Box(Box(3905)),
+Box(Box(3906)),
+Box(Box(3907)),
+Box(Box(3908)),
+Box(Box(3909)),
+Box(Box(3910)),
+Box(Box(3911)),
+Box(Box(3912)),
+Box(Box(3913)),
+Box(Box(3914)),
+Box(Box(3915)),
+Box(Box(3916)),
+Box(Box(3917)),
+Box(Box(3918)),
+Box(Box(3919)),
+Box(Box(3920)),
+Box(Box(3921)),
+Box(Box(3922)),
+Box(Box(3923)),
+Box(Box(3924)),
+Box(Box(3925)),
+Box(Box(3926)),
+Box(Box(3927)),
+Box(Box(3928)),
+Box(Box(3929)),
+Box(Box(3930)),
+Box(Box(3931)),
+Box(Box(3932)),
+Box(Box(3933)),
+Box(Box(3934)),
+Box(Box(3935)),
+Box(Box(3936)),
+Box(Box(3937)),
+Box(Box(3938)),
+Box(Box(3939)),
+Box(Box(3940)),
+Box(Box(3941)),
+Box(Box(3942)),
+Box(Box(3943)),
+Box(Box(3944)),
+Box(Box(3945)),
+Box(Box(3946)),
+Box(Box(3947)),
+Box(Box(3948)),
+Box(Box(3949)),
+Box(Box(3950)),
+Box(Box(3951)),
+Box(Box(3952)),
+Box(Box(3953)),
+Box(Box(3954)),
+Box(Box(3955)),
+Box(Box(3956)),
+Box(Box(3957)),
+Box(Box(3958)),
+Box(Box(3959)),
+Box(Box(3960)),
+Box(Box(3961)),
+Box(Box(3962)),
+Box(Box(3963)),
+Box(Box(3964)),
+Box(Box(3965)),
+Box(Box(3966)),
+Box(Box(3967)),
+Box(Box(3968)),
+Box(Box(3969)),
+Box(Box(3970)),
+Box(Box(3971)),
+Box(Box(3972)),
+Box(Box(3973)),
+Box(Box(3974)),
+Box(Box(3975)),
+Box(Box(3976)),
+Box(Box(3977)),
+Box(Box(3978)),
+Box(Box(3979)),
+Box(Box(3980)),
+Box(Box(3981)),
+Box(Box(3982)),
+Box(Box(3983)),
+Box(Box(3984)),
+Box(Box(3985)),
+Box(Box(3986)),
+Box(Box(3987)),
+Box(Box(3988)),
+Box(Box(3989)),
+Box(Box(3990)),
+Box(Box(3991)),
+Box(Box(3992)),
+Box(Box(3993)),
+Box(Box(3994)),
+Box(Box(3995)),
+Box(Box(3996)),
+Box(Box(3997)),
+Box(Box(3998)),
+Box(Box(3999)),
+Box(Box(4000)),
+Box(Box(4001)),
+Box(Box(4002)),
+Box(Box(4003)),
+Box(Box(4004)),
+Box(Box(4005)),
+Box(Box(4006)),
+Box(Box(4007)),
+Box(Box(4008)),
+Box(Box(4009)),
+Box(Box(4010)),
+Box(Box(4011)),
+Box(Box(4012)),
+Box(Box(4013)),
+Box(Box(4014)),
+Box(Box(4015)),
+Box(Box(4016)),
+Box(Box(4017)),
+Box(Box(4018)),
+Box(Box(4019)),
+Box(Box(4020)),
+Box(Box(4021)),
+Box(Box(4022)),
+Box(Box(4023)),
+Box(Box(4024)),
+Box(Box(4025)),
+Box(Box(4026)),
+Box(Box(4027)),
+Box(Box(4028)),
+Box(Box(4029)),
+Box(Box(4030)),
+Box(Box(4031)),
+Box(Box(4032)),
+Box(Box(4033)),
+Box(Box(4034)),
+Box(Box(4035)),
+Box(Box(4036)),
+Box(Box(4037)),
+Box(Box(4038)),
+Box(Box(4039)),
+Box(Box(4040)),
+Box(Box(4041)),
+Box(Box(4042)),
+Box(Box(4043)),
+Box(Box(4044)),
+Box(Box(4045)),
+Box(Box(4046)),
+Box(Box(4047)),
+Box(Box(4048)),
+Box(Box(4049)),
+Box(Box(4050)),
+Box(Box(4051)),
+Box(Box(4052)),
+Box(Box(4053)),
+Box(Box(4054)),
+Box(Box(4055)),
+Box(Box(4056)),
+Box(Box(4057)),
+Box(Box(4058)),
+Box(Box(4059)),
+Box(Box(4060)),
+Box(Box(4061)),
+Box(Box(4062)),
+Box(Box(4063)),
+Box(Box(4064)),
+Box(Box(4065)),
+Box(Box(4066)),
+Box(Box(4067)),
+Box(Box(4068)),
+Box(Box(4069)),
+Box(Box(4070)),
+Box(Box(4071)),
+Box(Box(4072)),
+Box(Box(4073)),
+Box(Box(4074)),
+Box(Box(4075)),
+Box(Box(4076)),
+Box(Box(4077)),
+Box(Box(4078)),
+Box(Box(4079)),
+Box(Box(4080)),
+Box(Box(4081)),
+Box(Box(4082)),
+Box(Box(4083)),
+Box(Box(4084)),
+Box(Box(4085)),
+Box(Box(4086)),
+Box(Box(4087)),
+Box(Box(4088)),
+Box(Box(4089)),
+Box(Box(4090)),
+Box(Box(4091)),
+Box(Box(4092)),
+Box(Box(4093)),
+Box(Box(4094)),
+Box(Box(4095)),
+Box(Box(4096)),
+Box(Box(4097)),
+Box(Box(4098)),
+Box(Box(4099)),
+Box(Box(4100)),
+Box(Box(4101)),
+Box(Box(4102)),
+Box(Box(4103)),
+Box(Box(4104)),
+Box(Box(4105)),
+Box(Box(4106)),
+Box(Box(4107)),
+Box(Box(4108)),
+Box(Box(4109)),
+Box(Box(4110)),
+Box(Box(4111)),
+Box(Box(4112)),
+Box(Box(4113)),
+Box(Box(4114)),
+Box(Box(4115)),
+Box(Box(4116)),
+Box(Box(4117)),
+Box(Box(4118)),
+Box(Box(4119)),
+Box(Box(4120)),
+Box(Box(4121)),
+Box(Box(4122)),
+Box(Box(4123)),
+Box(Box(4124)),
+Box(Box(4125)),
+Box(Box(4126)),
+Box(Box(4127)),
+Box(Box(4128)),
+Box(Box(4129)),
+Box(Box(4130)),
+Box(Box(4131)),
+Box(Box(4132)),
+Box(Box(4133)),
+Box(Box(4134)),
+Box(Box(4135)),
+Box(Box(4136)),
+Box(Box(4137)),
+Box(Box(4138)),
+Box(Box(4139)),
+Box(Box(4140)),
+Box(Box(4141)),
+Box(Box(4142)),
+Box(Box(4143)),
+Box(Box(4144)),
+Box(Box(4145)),
+Box(Box(4146)),
+Box(Box(4147)),
+Box(Box(4148)),
+Box(Box(4149)),
+Box(Box(4150)),
+Box(Box(4151)),
+Box(Box(4152)),
+Box(Box(4153)),
+Box(Box(4154)),
+Box(Box(4155)),
+Box(Box(4156)),
+Box(Box(4157)),
+Box(Box(4158)),
+Box(Box(4159)),
+Box(Box(4160)),
+Box(Box(4161)),
+Box(Box(4162)),
+Box(Box(4163)),
+Box(Box(4164)),
+Box(Box(4165)),
+Box(Box(4166)),
+Box(Box(4167)),
+Box(Box(4168)),
+Box(Box(4169)),
+Box(Box(4170)),
+Box(Box(4171)),
+Box(Box(4172)),
+Box(Box(4173)),
+Box(Box(4174)),
+Box(Box(4175)),
+Box(Box(4176)),
+Box(Box(4177)),
+Box(Box(4178)),
+Box(Box(4179)),
+Box(Box(4180)),
+Box(Box(4181)),
+Box(Box(4182)),
+Box(Box(4183)),
+Box(Box(4184)),
+Box(Box(4185)),
+Box(Box(4186)),
+Box(Box(4187)),
+Box(Box(4188)),
+Box(Box(4189)),
+Box(Box(4190)),
+Box(Box(4191)),
+Box(Box(4192)),
+Box(Box(4193)),
+Box(Box(4194)),
+Box(Box(4195)),
+Box(Box(4196)),
+Box(Box(4197)),
+Box(Box(4198)),
+Box(Box(4199)),
+Box(Box(4200)),
+Box(Box(4201)),
+Box(Box(4202)),
+Box(Box(4203)),
+Box(Box(4204)),
+Box(Box(4205)),
+Box(Box(4206)),
+Box(Box(4207)),
+Box(Box(4208)),
+Box(Box(4209)),
+Box(Box(4210)),
+Box(Box(4211)),
+Box(Box(4212)),
+Box(Box(4213)),
+Box(Box(4214)),
+Box(Box(4215)),
+Box(Box(4216)),
+Box(Box(4217)),
+Box(Box(4218)),
+Box(Box(4219)),
+Box(Box(4220)),
+Box(Box(4221)),
+Box(Box(4222)),
+Box(Box(4223)),
+Box(Box(4224)),
+Box(Box(4225)),
+Box(Box(4226)),
+Box(Box(4227)),
+Box(Box(4228)),
+Box(Box(4229)),
+Box(Box(4230)),
+Box(Box(4231)),
+Box(Box(4232)),
+Box(Box(4233)),
+Box(Box(4234)),
+Box(Box(4235)),
+Box(Box(4236)),
+Box(Box(4237)),
+Box(Box(4238)),
+Box(Box(4239)),
+Box(Box(4240)),
+Box(Box(4241)),
+Box(Box(4242)),
+Box(Box(4243)),
+Box(Box(4244)),
+Box(Box(4245)),
+Box(Box(4246)),
+Box(Box(4247)),
+Box(Box(4248)),
+Box(Box(4249)),
+Box(Box(4250)),
+Box(Box(4251)),
+Box(Box(4252)),
+Box(Box(4253)),
+Box(Box(4254)),
+Box(Box(4255)),
+Box(Box(4256)),
+Box(Box(4257)),
+Box(Box(4258)),
+Box(Box(4259)),
+Box(Box(4260)),
+Box(Box(4261)),
+Box(Box(4262)),
+Box(Box(4263)),
+Box(Box(4264)),
+Box(Box(4265)),
+Box(Box(4266)),
+Box(Box(4267)),
+Box(Box(4268)),
+Box(Box(4269)),
+Box(Box(4270)),
+Box(Box(4271)),
+Box(Box(4272)),
+Box(Box(4273)),
+Box(Box(4274)),
+Box(Box(4275)),
+Box(Box(4276)),
+Box(Box(4277)),
+Box(Box(4278)),
+Box(Box(4279)),
+Box(Box(4280)),
+Box(Box(4281)),
+Box(Box(4282)),
+Box(Box(4283)),
+Box(Box(4284)),
+Box(Box(4285)),
+Box(Box(4286)),
+Box(Box(4287)),
+Box(Box(4288)),
+Box(Box(4289)),
+Box(Box(4290)),
+Box(Box(4291)),
+Box(Box(4292)),
+Box(Box(4293)),
+Box(Box(4294)),
+Box(Box(4295)),
+Box(Box(4296)),
+Box(Box(4297)),
+Box(Box(4298)),
+Box(Box(4299)),
+Box(Box(4300)),
+Box(Box(4301)),
+Box(Box(4302)),
+Box(Box(4303)),
+Box(Box(4304)),
+Box(Box(4305)),
+Box(Box(4306)),
+Box(Box(4307)),
+Box(Box(4308)),
+Box(Box(4309)),
+Box(Box(4310)),
+Box(Box(4311)),
+Box(Box(4312)),
+Box(Box(4313)),
+Box(Box(4314)),
+Box(Box(4315)),
+Box(Box(4316)),
+Box(Box(4317)),
+Box(Box(4318)),
+Box(Box(4319)),
+Box(Box(4320)),
+Box(Box(4321)),
+Box(Box(4322)),
+Box(Box(4323)),
+Box(Box(4324)),
+Box(Box(4325)),
+Box(Box(4326)),
+Box(Box(4327)),
+Box(Box(4328)),
+Box(Box(4329)),
+Box(Box(4330)),
+Box(Box(4331)),
+Box(Box(4332)),
+Box(Box(4333)),
+Box(Box(4334)),
+Box(Box(4335)),
+Box(Box(4336)),
+Box(Box(4337)),
+Box(Box(4338)),
+Box(Box(4339)),
+Box(Box(4340)),
+Box(Box(4341)),
+Box(Box(4342)),
+Box(Box(4343)),
+Box(Box(4344)),
+Box(Box(4345)),
+Box(Box(4346)),
+Box(Box(4347)),
+Box(Box(4348)),
+Box(Box(4349)),
+Box(Box(4350)),
+Box(Box(4351)),
+Box(Box(4352)),
+Box(Box(4353)),
+Box(Box(4354)),
+Box(Box(4355)),
+Box(Box(4356)),
+Box(Box(4357)),
+Box(Box(4358)),
+Box(Box(4359)),
+Box(Box(4360)),
+Box(Box(4361)),
+Box(Box(4362)),
+Box(Box(4363)),
+Box(Box(4364)),
+Box(Box(4365)),
+Box(Box(4366)),
+Box(Box(4367)),
+Box(Box(4368)),
+Box(Box(4369)),
+Box(Box(4370)),
+Box(Box(4371)),
+Box(Box(4372)),
+Box(Box(4373)),
+Box(Box(4374)),
+Box(Box(4375)),
+Box(Box(4376)),
+Box(Box(4377)),
+Box(Box(4378)),
+Box(Box(4379)),
+Box(Box(4380)),
+Box(Box(4381)),
+Box(Box(4382)),
+Box(Box(4383)),
+Box(Box(4384)),
+Box(Box(4385)),
+Box(Box(4386)),
+Box(Box(4387)),
+Box(Box(4388)),
+Box(Box(4389)),
+Box(Box(4390)),
+Box(Box(4391)),
+Box(Box(4392)),
+Box(Box(4393)),
+Box(Box(4394)),
+Box(Box(4395)),
+Box(Box(4396)),
+Box(Box(4397)),
+Box(Box(4398)),
+Box(Box(4399)),
+Box(Box(4400)),
+Box(Box(4401)),
+Box(Box(4402)),
+Box(Box(4403)),
+Box(Box(4404)),
+Box(Box(4405)),
+Box(Box(4406)),
+Box(Box(4407)),
+Box(Box(4408)),
+Box(Box(4409)),
+Box(Box(4410)),
+Box(Box(4411)),
+Box(Box(4412)),
+Box(Box(4413)),
+Box(Box(4414)),
+Box(Box(4415)),
+Box(Box(4416)),
+Box(Box(4417)),
+Box(Box(4418)),
+Box(Box(4419)),
+Box(Box(4420)),
+Box(Box(4421)),
+Box(Box(4422)),
+Box(Box(4423)),
+Box(Box(4424)),
+Box(Box(4425)),
+Box(Box(4426)),
+Box(Box(4427)),
+Box(Box(4428)),
+Box(Box(4429)),
+Box(Box(4430)),
+Box(Box(4431)),
+Box(Box(4432)),
+Box(Box(4433)),
+Box(Box(4434)),
+Box(Box(4435)),
+Box(Box(4436)),
+Box(Box(4437)),
+Box(Box(4438)),
+Box(Box(4439)),
+Box(Box(4440)),
+Box(Box(4441)),
+Box(Box(4442)),
+Box(Box(4443)),
+Box(Box(4444)),
+Box(Box(4445)),
+Box(Box(4446)),
+Box(Box(4447)),
+Box(Box(4448)),
+Box(Box(4449)),
+Box(Box(4450)),
+Box(Box(4451)),
+Box(Box(4452)),
+Box(Box(4453)),
+Box(Box(4454)),
+Box(Box(4455)),
+Box(Box(4456)),
+Box(Box(4457)),
+Box(Box(4458)),
+Box(Box(4459)),
+Box(Box(4460)),
+Box(Box(4461)),
+Box(Box(4462)),
+Box(Box(4463)),
+Box(Box(4464)),
+Box(Box(4465)),
+Box(Box(4466)),
+Box(Box(4467)),
+Box(Box(4468)),
+Box(Box(4469)),
+Box(Box(4470)),
+Box(Box(4471)),
+Box(Box(4472)),
+Box(Box(4473)),
+Box(Box(4474)),
+Box(Box(4475)),
+Box(Box(4476)),
+Box(Box(4477)),
+Box(Box(4478)),
+Box(Box(4479)),
+Box(Box(4480)),
+Box(Box(4481)),
+Box(Box(4482)),
+Box(Box(4483)),
+Box(Box(4484)),
+Box(Box(4485)),
+Box(Box(4486)),
+Box(Box(4487)),
+Box(Box(4488)),
+Box(Box(4489)),
+Box(Box(4490)),
+Box(Box(4491)),
+Box(Box(4492)),
+Box(Box(4493)),
+Box(Box(4494)),
+Box(Box(4495)),
+Box(Box(4496)),
+Box(Box(4497)),
+Box(Box(4498)),
+Box(Box(4499)),
+Box(Box(4500)),
+Box(Box(4501)),
+Box(Box(4502)),
+Box(Box(4503)),
+Box(Box(4504)),
+Box(Box(4505)),
+Box(Box(4506)),
+Box(Box(4507)),
+Box(Box(4508)),
+Box(Box(4509)),
+Box(Box(4510)),
+Box(Box(4511)),
+Box(Box(4512)),
+Box(Box(4513)),
+Box(Box(4514)),
+Box(Box(4515)),
+Box(Box(4516)),
+Box(Box(4517)),
+Box(Box(4518)),
+Box(Box(4519)),
+Box(Box(4520)),
+Box(Box(4521)),
+Box(Box(4522)),
+Box(Box(4523)),
+Box(Box(4524)),
+Box(Box(4525)),
+Box(Box(4526)),
+Box(Box(4527)),
+Box(Box(4528)),
+Box(Box(4529)),
+Box(Box(4530)),
+Box(Box(4531)),
+Box(Box(4532)),
+Box(Box(4533)),
+Box(Box(4534)),
+Box(Box(4535)),
+Box(Box(4536)),
+Box(Box(4537)),
+Box(Box(4538)),
+Box(Box(4539)),
+Box(Box(4540)),
+Box(Box(4541)),
+Box(Box(4542)),
+Box(Box(4543)),
+Box(Box(4544)),
+Box(Box(4545)),
+Box(Box(4546)),
+Box(Box(4547)),
+Box(Box(4548)),
+Box(Box(4549)),
+Box(Box(4550)),
+Box(Box(4551)),
+Box(Box(4552)),
+Box(Box(4553)),
+Box(Box(4554)),
+Box(Box(4555)),
+Box(Box(4556)),
+Box(Box(4557)),
+Box(Box(4558)),
+Box(Box(4559)),
+Box(Box(4560)),
+Box(Box(4561)),
+Box(Box(4562)),
+Box(Box(4563)),
+Box(Box(4564)),
+Box(Box(4565)),
+Box(Box(4566)),
+Box(Box(4567)),
+Box(Box(4568)),
+Box(Box(4569)),
+Box(Box(4570)),
+Box(Box(4571)),
+Box(Box(4572)),
+Box(Box(4573)),
+Box(Box(4574)),
+Box(Box(4575)),
+Box(Box(4576)),
+Box(Box(4577)),
+Box(Box(4578)),
+Box(Box(4579)),
+Box(Box(4580)),
+Box(Box(4581)),
+Box(Box(4582)),
+Box(Box(4583)),
+Box(Box(4584)),
+Box(Box(4585)),
+Box(Box(4586)),
+Box(Box(4587)),
+Box(Box(4588)),
+Box(Box(4589)),
+Box(Box(4590)),
+Box(Box(4591)),
+Box(Box(4592)),
+Box(Box(4593)),
+Box(Box(4594)),
+Box(Box(4595)),
+Box(Box(4596)),
+Box(Box(4597)),
+Box(Box(4598)),
+Box(Box(4599)),
+Box(Box(4600)),
+Box(Box(4601)),
+Box(Box(4602)),
+Box(Box(4603)),
+Box(Box(4604)),
+Box(Box(4605)),
+Box(Box(4606)),
+Box(Box(4607)),
+Box(Box(4608)),
+Box(Box(4609)),
+Box(Box(4610)),
+Box(Box(4611)),
+Box(Box(4612)),
+Box(Box(4613)),
+Box(Box(4614)),
+Box(Box(4615)),
+Box(Box(4616)),
+Box(Box(4617)),
+Box(Box(4618)),
+Box(Box(4619)),
+Box(Box(4620)),
+Box(Box(4621)),
+Box(Box(4622)),
+Box(Box(4623)),
+Box(Box(4624)),
+Box(Box(4625)),
+Box(Box(4626)),
+Box(Box(4627)),
+Box(Box(4628)),
+Box(Box(4629)),
+Box(Box(4630)),
+Box(Box(4631)),
+Box(Box(4632)),
+Box(Box(4633)),
+Box(Box(4634)),
+Box(Box(4635)),
+Box(Box(4636)),
+Box(Box(4637)),
+Box(Box(4638)),
+Box(Box(4639)),
+Box(Box(4640)),
+Box(Box(4641)),
+Box(Box(4642)),
+Box(Box(4643)),
+Box(Box(4644)),
+Box(Box(4645)),
+Box(Box(4646)),
+Box(Box(4647)),
+Box(Box(4648)),
+Box(Box(4649)),
+Box(Box(4650)),
+Box(Box(4651)),
+Box(Box(4652)),
+Box(Box(4653)),
+Box(Box(4654)),
+Box(Box(4655)),
+Box(Box(4656)),
+Box(Box(4657)),
+Box(Box(4658)),
+Box(Box(4659)),
+Box(Box(4660)),
+Box(Box(4661)),
+Box(Box(4662)),
+Box(Box(4663)),
+Box(Box(4664)),
+Box(Box(4665)),
+Box(Box(4666)),
+Box(Box(4667)),
+Box(Box(4668)),
+Box(Box(4669)),
+Box(Box(4670)),
+Box(Box(4671)),
+Box(Box(4672)),
+Box(Box(4673)),
+Box(Box(4674)),
+Box(Box(4675)),
+Box(Box(4676)),
+Box(Box(4677)),
+Box(Box(4678)),
+Box(Box(4679)),
+Box(Box(4680)),
+Box(Box(4681)),
+Box(Box(4682)),
+Box(Box(4683)),
+Box(Box(4684)),
+Box(Box(4685)),
+Box(Box(4686)),
+Box(Box(4687)),
+Box(Box(4688)),
+Box(Box(4689)),
+Box(Box(4690)),
+Box(Box(4691)),
+Box(Box(4692)),
+Box(Box(4693)),
+Box(Box(4694)),
+Box(Box(4695)),
+Box(Box(4696)),
+Box(Box(4697)),
+Box(Box(4698)),
+Box(Box(4699)),
+Box(Box(4700)),
+Box(Box(4701)),
+Box(Box(4702)),
+Box(Box(4703)),
+Box(Box(4704)),
+Box(Box(4705)),
+Box(Box(4706)),
+Box(Box(4707)),
+Box(Box(4708)),
+Box(Box(4709)),
+Box(Box(4710)),
+Box(Box(4711)),
+Box(Box(4712)),
+Box(Box(4713)),
+Box(Box(4714)),
+Box(Box(4715)),
+Box(Box(4716)),
+Box(Box(4717)),
+Box(Box(4718)),
+Box(Box(4719)),
+Box(Box(4720)),
+Box(Box(4721)),
+Box(Box(4722)),
+Box(Box(4723)),
+Box(Box(4724)),
+Box(Box(4725)),
+Box(Box(4726)),
+Box(Box(4727)),
+Box(Box(4728)),
+Box(Box(4729)),
+Box(Box(4730)),
+Box(Box(4731)),
+Box(Box(4732)),
+Box(Box(4733)),
+Box(Box(4734)),
+Box(Box(4735)),
+Box(Box(4736)),
+Box(Box(4737)),
+Box(Box(4738)),
+Box(Box(4739)),
+Box(Box(4740)),
+Box(Box(4741)),
+Box(Box(4742)),
+Box(Box(4743)),
+Box(Box(4744)),
+Box(Box(4745)),
+Box(Box(4746)),
+Box(Box(4747)),
+Box(Box(4748)),
+Box(Box(4749)),
+Box(Box(4750)),
+Box(Box(4751)),
+Box(Box(4752)),
+Box(Box(4753)),
+Box(Box(4754)),
+Box(Box(4755)),
+Box(Box(4756)),
+Box(Box(4757)),
+Box(Box(4758)),
+Box(Box(4759)),
+Box(Box(4760)),
+Box(Box(4761)),
+Box(Box(4762)),
+Box(Box(4763)),
+Box(Box(4764)),
+Box(Box(4765)),
+Box(Box(4766)),
+Box(Box(4767)),
+Box(Box(4768)),
+Box(Box(4769)),
+Box(Box(4770)),
+Box(Box(4771)),
+Box(Box(4772)),
+Box(Box(4773)),
+Box(Box(4774)),
+Box(Box(4775)),
+Box(Box(4776)),
+Box(Box(4777)),
+Box(Box(4778)),
+Box(Box(4779)),
+Box(Box(4780)),
+Box(Box(4781)),
+Box(Box(4782)),
+Box(Box(4783)),
+Box(Box(4784)),
+Box(Box(4785)),
+Box(Box(4786)),
+Box(Box(4787)),
+Box(Box(4788)),
+Box(Box(4789)),
+Box(Box(4790)),
+Box(Box(4791)),
+Box(Box(4792)),
+Box(Box(4793)),
+Box(Box(4794)),
+Box(Box(4795)),
+Box(Box(4796)),
+Box(Box(4797)),
+Box(Box(4798)),
+Box(Box(4799)),
+Box(Box(4800)),
+Box(Box(4801)),
+Box(Box(4802)),
+Box(Box(4803)),
+Box(Box(4804)),
+Box(Box(4805)),
+Box(Box(4806)),
+Box(Box(4807)),
+Box(Box(4808)),
+Box(Box(4809)),
+Box(Box(4810)),
+Box(Box(4811)),
+Box(Box(4812)),
+Box(Box(4813)),
+Box(Box(4814)),
+Box(Box(4815)),
+Box(Box(4816)),
+Box(Box(4817)),
+Box(Box(4818)),
+Box(Box(4819)),
+Box(Box(4820)),
+Box(Box(4821)),
+Box(Box(4822)),
+Box(Box(4823)),
+Box(Box(4824)),
+Box(Box(4825)),
+Box(Box(4826)),
+Box(Box(4827)),
+Box(Box(4828)),
+Box(Box(4829)),
+Box(Box(4830)),
+Box(Box(4831)),
+Box(Box(4832)),
+Box(Box(4833)),
+Box(Box(4834)),
+Box(Box(4835)),
+Box(Box(4836)),
+Box(Box(4837)),
+Box(Box(4838)),
+Box(Box(4839)),
+Box(Box(4840)),
+Box(Box(4841)),
+Box(Box(4842)),
+Box(Box(4843)),
+Box(Box(4844)),
+Box(Box(4845)),
+Box(Box(4846)),
+Box(Box(4847)),
+Box(Box(4848)),
+Box(Box(4849)),
+Box(Box(4850)),
+Box(Box(4851)),
+Box(Box(4852)),
+Box(Box(4853)),
+Box(Box(4854)),
+Box(Box(4855)),
+Box(Box(4856)),
+Box(Box(4857)),
+Box(Box(4858)),
+Box(Box(4859)),
+Box(Box(4860)),
+Box(Box(4861)),
+Box(Box(4862)),
+Box(Box(4863)),
+Box(Box(4864)),
+Box(Box(4865)),
+Box(Box(4866)),
+Box(Box(4867)),
+Box(Box(4868)),
+Box(Box(4869)),
+Box(Box(4870)),
+Box(Box(4871)),
+Box(Box(4872)),
+Box(Box(4873)),
+Box(Box(4874)),
+Box(Box(4875)),
+Box(Box(4876)),
+Box(Box(4877)),
+Box(Box(4878)),
+Box(Box(4879)),
+Box(Box(4880)),
+Box(Box(4881)),
+Box(Box(4882)),
+Box(Box(4883)),
+Box(Box(4884)),
+Box(Box(4885)),
+Box(Box(4886)),
+Box(Box(4887)),
+Box(Box(4888)),
+Box(Box(4889)),
+Box(Box(4890)),
+Box(Box(4891)),
+Box(Box(4892)),
+Box(Box(4893)),
+Box(Box(4894)),
+Box(Box(4895)),
+Box(Box(4896)),
+Box(Box(4897)),
+Box(Box(4898)),
+Box(Box(4899)),
+Box(Box(4900)),
+Box(Box(4901)),
+Box(Box(4902)),
+Box(Box(4903)),
+Box(Box(4904)),
+Box(Box(4905)),
+Box(Box(4906)),
+Box(Box(4907)),
+Box(Box(4908)),
+Box(Box(4909)),
+Box(Box(4910)),
+Box(Box(4911)),
+Box(Box(4912)),
+Box(Box(4913)),
+Box(Box(4914)),
+Box(Box(4915)),
+Box(Box(4916)),
+Box(Box(4917)),
+Box(Box(4918)),
+Box(Box(4919)),
+Box(Box(4920)),
+Box(Box(4921)),
+Box(Box(4922)),
+Box(Box(4923)),
+Box(Box(4924)),
+Box(Box(4925)),
+Box(Box(4926)),
+Box(Box(4927)),
+Box(Box(4928)),
+Box(Box(4929)),
+Box(Box(4930)),
+Box(Box(4931)),
+Box(Box(4932)),
+Box(Box(4933)),
+Box(Box(4934)),
+Box(Box(4935)),
+Box(Box(4936)),
+Box(Box(4937)),
+Box(Box(4938)),
+Box(Box(4939)),
+Box(Box(4940)),
+Box(Box(4941)),
+Box(Box(4942)),
+Box(Box(4943)),
+Box(Box(4944)),
+Box(Box(4945)),
+Box(Box(4946)),
+Box(Box(4947)),
+Box(Box(4948)),
+Box(Box(4949)),
+Box(Box(4950)),
+Box(Box(4951)),
+Box(Box(4952)),
+Box(Box(4953)),
+Box(Box(4954)),
+Box(Box(4955)),
+Box(Box(4956)),
+Box(Box(4957)),
+Box(Box(4958)),
+Box(Box(4959)),
+Box(Box(4960)),
+Box(Box(4961)),
+Box(Box(4962)),
+Box(Box(4963)),
+Box(Box(4964)),
+Box(Box(4965)),
+Box(Box(4966)),
+Box(Box(4967)),
+Box(Box(4968)),
+Box(Box(4969)),
+Box(Box(4970)),
+Box(Box(4971)),
+Box(Box(4972)),
+Box(Box(4973)),
+Box(Box(4974)),
+Box(Box(4975)),
+Box(Box(4976)),
+Box(Box(4977)),
+Box(Box(4978)),
+Box(Box(4979)),
+Box(Box(4980)),
+Box(Box(4981)),
+Box(Box(4982)),
+Box(Box(4983)),
+Box(Box(4984)),
+Box(Box(4985)),
+Box(Box(4986)),
+Box(Box(4987)),
+Box(Box(4988)),
+Box(Box(4989)),
+Box(Box(4990)),
+Box(Box(4991)),
+Box(Box(4992)),
+Box(Box(4993)),
+Box(Box(4994)),
+Box(Box(4995)),
+Box(Box(4996)),
+Box(Box(4997)),
+Box(Box(4998)),
+Box(Box(4999)),
+Box(Box(5000)),
+Box(Box(5001)),
+Box(Box(5002)),
+Box(Box(5003)),
+Box(Box(5004)),
+Box(Box(5005)),
+Box(Box(5006)),
+Box(Box(5007)),
+Box(Box(5008)),
+Box(Box(5009)),
+Box(Box(5010)),
+Box(Box(5011)),
+Box(Box(5012)),
+Box(Box(5013)),
+Box(Box(5014)),
+Box(Box(5015)),
+Box(Box(5016)),
+Box(Box(5017)),
+Box(Box(5018)),
+Box(Box(5019)),
+Box(Box(5020)),
+Box(Box(5021)),
+Box(Box(5022)),
+Box(Box(5023)),
+Box(Box(5024)),
+Box(Box(5025)),
+Box(Box(5026)),
+Box(Box(5027)),
+Box(Box(5028)),
+Box(Box(5029)),
+Box(Box(5030)),
+Box(Box(5031)),
+Box(Box(5032)),
+Box(Box(5033)),
+Box(Box(5034)),
+Box(Box(5035)),
+Box(Box(5036)),
+Box(Box(5037)),
+Box(Box(5038)),
+Box(Box(5039)),
+Box(Box(5040)),
+Box(Box(5041)),
+Box(Box(5042)),
+Box(Box(5043)),
+Box(Box(5044)),
+Box(Box(5045)),
+Box(Box(5046)),
+Box(Box(5047)),
+Box(Box(5048)),
+Box(Box(5049)),
+Box(Box(5050)),
+Box(Box(5051)),
+Box(Box(5052)),
+Box(Box(5053)),
+Box(Box(5054)),
+Box(Box(5055)),
+Box(Box(5056)),
+Box(Box(5057)),
+Box(Box(5058)),
+Box(Box(5059)),
+Box(Box(5060)),
+Box(Box(5061)),
+Box(Box(5062)),
+Box(Box(5063)),
+Box(Box(5064)),
+Box(Box(5065)),
+Box(Box(5066)),
+Box(Box(5067)),
+Box(Box(5068)),
+Box(Box(5069)),
+Box(Box(5070)),
+Box(Box(5071)),
+Box(Box(5072)),
+Box(Box(5073)),
+Box(Box(5074)),
+Box(Box(5075)),
+Box(Box(5076)),
+Box(Box(5077)),
+Box(Box(5078)),
+Box(Box(5079)),
+Box(Box(5080)),
+Box(Box(5081)),
+Box(Box(5082)),
+Box(Box(5083)),
+Box(Box(5084)),
+Box(Box(5085)),
+Box(Box(5086)),
+Box(Box(5087)),
+Box(Box(5088)),
+Box(Box(5089)),
+Box(Box(5090)),
+Box(Box(5091)),
+Box(Box(5092)),
+Box(Box(5093)),
+Box(Box(5094)),
+Box(Box(5095)),
+Box(Box(5096)),
+Box(Box(5097)),
+Box(Box(5098)),
+Box(Box(5099)),
+Box(Box(5100)),
+Box(Box(5101)),
+Box(Box(5102)),
+Box(Box(5103)),
+Box(Box(5104)),
+Box(Box(5105)),
+Box(Box(5106)),
+Box(Box(5107)),
+Box(Box(5108)),
+Box(Box(5109)),
+Box(Box(5110)),
+Box(Box(5111)),
+Box(Box(5112)),
+Box(Box(5113)),
+Box(Box(5114)),
+Box(Box(5115)),
+Box(Box(5116)),
+Box(Box(5117)),
+Box(Box(5118)),
+Box(Box(5119)),
+Box(Box(5120)),
+Box(Box(5121)),
+Box(Box(5122)),
+Box(Box(5123)),
+Box(Box(5124)),
+Box(Box(5125)),
+Box(Box(5126)),
+Box(Box(5127)),
+Box(Box(5128)),
+Box(Box(5129)),
+Box(Box(5130)),
+Box(Box(5131)),
+Box(Box(5132)),
+Box(Box(5133)),
+Box(Box(5134)),
+Box(Box(5135)),
+Box(Box(5136)),
+Box(Box(5137)),
+Box(Box(5138)),
+Box(Box(5139)),
+Box(Box(5140)),
+Box(Box(5141)),
+Box(Box(5142)),
+Box(Box(5143)),
+Box(Box(5144)),
+Box(Box(5145)),
+Box(Box(5146)),
+Box(Box(5147)),
+Box(Box(5148)),
+Box(Box(5149)),
+Box(Box(5150)),
+Box(Box(5151)),
+Box(Box(5152)),
+Box(Box(5153)),
+Box(Box(5154)),
+Box(Box(5155)),
+Box(Box(5156)),
+Box(Box(5157)),
+Box(Box(5158)),
+Box(Box(5159)),
+Box(Box(5160)),
+Box(Box(5161)),
+Box(Box(5162)),
+Box(Box(5163)),
+Box(Box(5164)),
+Box(Box(5165)),
+Box(Box(5166)),
+Box(Box(5167)),
+Box(Box(5168)),
+Box(Box(5169)),
+Box(Box(5170)),
+Box(Box(5171)),
+Box(Box(5172)),
+Box(Box(5173)),
+Box(Box(5174)),
+Box(Box(5175)),
+Box(Box(5176)),
+Box(Box(5177)),
+Box(Box(5178)),
+Box(Box(5179)),
+Box(Box(5180)),
+Box(Box(5181)),
+Box(Box(5182)),
+Box(Box(5183)),
+Box(Box(5184)),
+Box(Box(5185)),
+Box(Box(5186)),
+Box(Box(5187)),
+Box(Box(5188)),
+Box(Box(5189)),
+Box(Box(5190)),
+Box(Box(5191)),
+Box(Box(5192)),
+Box(Box(5193)),
+Box(Box(5194)),
+Box(Box(5195)),
+Box(Box(5196)),
+Box(Box(5197)),
+Box(Box(5198)),
+Box(Box(5199)),
+Box(Box(5200)),
+Box(Box(5201)),
+Box(Box(5202)),
+Box(Box(5203)),
+Box(Box(5204)),
+Box(Box(5205)),
+Box(Box(5206)),
+Box(Box(5207)),
+Box(Box(5208)),
+Box(Box(5209)),
+Box(Box(5210)),
+Box(Box(5211)),
+Box(Box(5212)),
+Box(Box(5213)),
+Box(Box(5214)),
+Box(Box(5215)),
+Box(Box(5216)),
+Box(Box(5217)),
+Box(Box(5218)),
+Box(Box(5219)),
+Box(Box(5220)),
+Box(Box(5221)),
+Box(Box(5222)),
+Box(Box(5223)),
+Box(Box(5224)),
+Box(Box(5225)),
+Box(Box(5226)),
+Box(Box(5227)),
+Box(Box(5228)),
+Box(Box(5229)),
+Box(Box(5230)),
+Box(Box(5231)),
+Box(Box(5232)),
+Box(Box(5233)),
+Box(Box(5234)),
+Box(Box(5235)),
+Box(Box(5236)),
+Box(Box(5237)),
+Box(Box(5238)),
+Box(Box(5239)),
+Box(Box(5240)),
+Box(Box(5241)),
+Box(Box(5242)),
+Box(Box(5243)),
+Box(Box(5244)),
+Box(Box(5245)),
+Box(Box(5246)),
+Box(Box(5247)),
+Box(Box(5248)),
+Box(Box(5249)),
+Box(Box(5250)),
+Box(Box(5251)),
+Box(Box(5252)),
+Box(Box(5253)),
+Box(Box(5254)),
+Box(Box(5255)),
+Box(Box(5256)),
+Box(Box(5257)),
+Box(Box(5258)),
+Box(Box(5259)),
+Box(Box(5260)),
+Box(Box(5261)),
+Box(Box(5262)),
+Box(Box(5263)),
+Box(Box(5264)),
+Box(Box(5265)),
+Box(Box(5266)),
+Box(Box(5267)),
+Box(Box(5268)),
+Box(Box(5269)),
+Box(Box(5270)),
+Box(Box(5271)),
+Box(Box(5272)),
+Box(Box(5273)),
+Box(Box(5274)),
+Box(Box(5275)),
+Box(Box(5276)),
+Box(Box(5277)),
+Box(Box(5278)),
+Box(Box(5279)),
+Box(Box(5280)),
+Box(Box(5281)),
+Box(Box(5282)),
+Box(Box(5283)),
+Box(Box(5284)),
+Box(Box(5285)),
+Box(Box(5286)),
+Box(Box(5287)),
+Box(Box(5288)),
+Box(Box(5289)),
+Box(Box(5290)),
+Box(Box(5291)),
+Box(Box(5292)),
+Box(Box(5293)),
+Box(Box(5294)),
+Box(Box(5295)),
+Box(Box(5296)),
+Box(Box(5297)),
+Box(Box(5298)),
+Box(Box(5299)),
+Box(Box(5300)),
+Box(Box(5301)),
+Box(Box(5302)),
+Box(Box(5303)),
+Box(Box(5304)),
+Box(Box(5305)),
+Box(Box(5306)),
+Box(Box(5307)),
+Box(Box(5308)),
+Box(Box(5309)),
+Box(Box(5310)),
+Box(Box(5311)),
+Box(Box(5312)),
+Box(Box(5313)),
+Box(Box(5314)),
+Box(Box(5315)),
+Box(Box(5316)),
+Box(Box(5317)),
+Box(Box(5318)),
+Box(Box(5319)),
+Box(Box(5320)),
+Box(Box(5321)),
+Box(Box(5322)),
+Box(Box(5323)),
+Box(Box(5324)),
+Box(Box(5325)),
+Box(Box(5326)),
+Box(Box(5327)),
+Box(Box(5328)),
+Box(Box(5329)),
+Box(Box(5330)),
+Box(Box(5331)),
+Box(Box(5332)),
+Box(Box(5333)),
+Box(Box(5334)),
+Box(Box(5335)),
+Box(Box(5336)),
+Box(Box(5337)),
+Box(Box(5338)),
+Box(Box(5339)),
+Box(Box(5340)),
+Box(Box(5341)),
+Box(Box(5342)),
+Box(Box(5343)),
+Box(Box(5344)),
+Box(Box(5345)),
+Box(Box(5346)),
+Box(Box(5347)),
+Box(Box(5348)),
+Box(Box(5349)),
+Box(Box(5350)),
+Box(Box(5351)),
+Box(Box(5352)),
+Box(Box(5353)),
+Box(Box(5354)),
+Box(Box(5355)),
+Box(Box(5356)),
+Box(Box(5357)),
+Box(Box(5358)),
+Box(Box(5359)),
+Box(Box(5360)),
+Box(Box(5361)),
+Box(Box(5362)),
+Box(Box(5363)),
+Box(Box(5364)),
+Box(Box(5365)),
+Box(Box(5366)),
+Box(Box(5367)),
+Box(Box(5368)),
+Box(Box(5369)),
+Box(Box(5370)),
+Box(Box(5371)),
+Box(Box(5372)),
+Box(Box(5373)),
+Box(Box(5374)),
+Box(Box(5375)),
+Box(Box(5376)),
+Box(Box(5377)),
+Box(Box(5378)),
+Box(Box(5379)),
+Box(Box(5380)),
+Box(Box(5381)),
+Box(Box(5382)),
+Box(Box(5383)),
+Box(Box(5384)),
+Box(Box(5385)),
+Box(Box(5386)),
+Box(Box(5387)),
+Box(Box(5388)),
+Box(Box(5389)),
+Box(Box(5390)),
+Box(Box(5391)),
+Box(Box(5392)),
+Box(Box(5393)),
+Box(Box(5394)),
+Box(Box(5395)),
+Box(Box(5396)),
+Box(Box(5397)),
+Box(Box(5398)),
+Box(Box(5399)),
+Box(Box(5400)),
+Box(Box(5401)),
+Box(Box(5402)),
+Box(Box(5403)),
+Box(Box(5404)),
+Box(Box(5405)),
+Box(Box(5406)),
+Box(Box(5407)),
+Box(Box(5408)),
+Box(Box(5409)),
+Box(Box(5410)),
+Box(Box(5411)),
+Box(Box(5412)),
+Box(Box(5413)),
+Box(Box(5414)),
+Box(Box(5415)),
+Box(Box(5416)),
+Box(Box(5417)),
+Box(Box(5418)),
+Box(Box(5419)),
+Box(Box(5420)),
+Box(Box(5421)),
+Box(Box(5422)),
+Box(Box(5423)),
+Box(Box(5424)),
+Box(Box(5425)),
+Box(Box(5426)),
+Box(Box(5427)),
+Box(Box(5428)),
+Box(Box(5429)),
+Box(Box(5430)),
+Box(Box(5431)),
+Box(Box(5432)),
+Box(Box(5433)),
+Box(Box(5434)),
+Box(Box(5435)),
+Box(Box(5436)),
+Box(Box(5437)),
+Box(Box(5438)),
+Box(Box(5439)),
+Box(Box(5440)),
+Box(Box(5441)),
+Box(Box(5442)),
+Box(Box(5443)),
+Box(Box(5444)),
+Box(Box(5445)),
+Box(Box(5446)),
+Box(Box(5447)),
+Box(Box(5448)),
+Box(Box(5449)),
+Box(Box(5450)),
+Box(Box(5451)),
+Box(Box(5452)),
+Box(Box(5453)),
+Box(Box(5454)),
+Box(Box(5455)),
+Box(Box(5456)),
+Box(Box(5457)),
+Box(Box(5458)),
+Box(Box(5459)),
+Box(Box(5460)),
+Box(Box(5461)),
+Box(Box(5462)),
+Box(Box(5463)),
+Box(Box(5464)),
+Box(Box(5465)),
+Box(Box(5466)),
+Box(Box(5467)),
+Box(Box(5468)),
+Box(Box(5469)),
+Box(Box(5470)),
+Box(Box(5471)),
+Box(Box(5472)),
+Box(Box(5473)),
+Box(Box(5474)),
+Box(Box(5475)),
+Box(Box(5476)),
+Box(Box(5477)),
+Box(Box(5478)),
+Box(Box(5479)),
+Box(Box(5480)),
+Box(Box(5481)),
+Box(Box(5482)),
+Box(Box(5483)),
+Box(Box(5484)),
+Box(Box(5485)),
+Box(Box(5486)),
+Box(Box(5487)),
+Box(Box(5488)),
+Box(Box(5489)),
+Box(Box(5490)),
+Box(Box(5491)),
+Box(Box(5492)),
+Box(Box(5493)),
+Box(Box(5494)),
+Box(Box(5495)),
+Box(Box(5496)),
+Box(Box(5497)),
+Box(Box(5498)),
+Box(Box(5499)),
+Box(Box(5500)),
+Box(Box(5501)),
+Box(Box(5502)),
+Box(Box(5503)),
+Box(Box(5504)),
+Box(Box(5505)),
+Box(Box(5506)),
+Box(Box(5507)),
+Box(Box(5508)),
+Box(Box(5509)),
+Box(Box(5510)),
+Box(Box(5511)),
+Box(Box(5512)),
+Box(Box(5513)),
+Box(Box(5514)),
+Box(Box(5515)),
+Box(Box(5516)),
+Box(Box(5517)),
+Box(Box(5518)),
+Box(Box(5519)),
+Box(Box(5520)),
+Box(Box(5521)),
+Box(Box(5522)),
+Box(Box(5523)),
+Box(Box(5524)),
+Box(Box(5525)),
+Box(Box(5526)),
+Box(Box(5527)),
+Box(Box(5528)),
+Box(Box(5529)),
+Box(Box(5530)),
+Box(Box(5531)),
+Box(Box(5532)),
+Box(Box(5533)),
+Box(Box(5534)),
+Box(Box(5535)),
+Box(Box(5536)),
+Box(Box(5537)),
+Box(Box(5538)),
+Box(Box(5539)),
+Box(Box(5540)),
+Box(Box(5541)),
+Box(Box(5542)),
+Box(Box(5543)),
+Box(Box(5544)),
+Box(Box(5545)),
+Box(Box(5546)),
+Box(Box(5547)),
+Box(Box(5548)),
+Box(Box(5549)),
+Box(Box(5550)),
+Box(Box(5551)),
+Box(Box(5552)),
+Box(Box(5553)),
+Box(Box(5554)),
+Box(Box(5555)),
+Box(Box(5556)),
+Box(Box(5557)),
+Box(Box(5558)),
+Box(Box(5559)),
+Box(Box(5560)),
+Box(Box(5561)),
+Box(Box(5562)),
+Box(Box(5563)),
+Box(Box(5564)),
+Box(Box(5565)),
+Box(Box(5566)),
+Box(Box(5567)),
+Box(Box(5568)),
+Box(Box(5569)),
+Box(Box(5570)),
+Box(Box(5571)),
+Box(Box(5572)),
+Box(Box(5573)),
+Box(Box(5574)),
+Box(Box(5575)),
+Box(Box(5576)),
+Box(Box(5577)),
+Box(Box(5578)),
+Box(Box(5579)),
+Box(Box(5580)),
+Box(Box(5581)),
+Box(Box(5582)),
+Box(Box(5583)),
+Box(Box(5584)),
+Box(Box(5585)),
+Box(Box(5586)),
+Box(Box(5587)),
+Box(Box(5588)),
+Box(Box(5589)),
+Box(Box(5590)),
+Box(Box(5591)),
+Box(Box(5592)),
+Box(Box(5593)),
+Box(Box(5594)),
+Box(Box(5595)),
+Box(Box(5596)),
+Box(Box(5597)),
+Box(Box(5598)),
+Box(Box(5599)),
+Box(Box(5600)),
+Box(Box(5601)),
+Box(Box(5602)),
+Box(Box(5603)),
+Box(Box(5604)),
+Box(Box(5605)),
+Box(Box(5606)),
+Box(Box(5607)),
+Box(Box(5608)),
+Box(Box(5609)),
+Box(Box(5610)),
+Box(Box(5611)),
+Box(Box(5612)),
+Box(Box(5613)),
+Box(Box(5614)),
+Box(Box(5615)),
+Box(Box(5616)),
+Box(Box(5617)),
+Box(Box(5618)),
+Box(Box(5619)),
+Box(Box(5620)),
+Box(Box(5621)),
+Box(Box(5622)),
+Box(Box(5623)),
+Box(Box(5624)),
+Box(Box(5625)),
+Box(Box(5626)),
+Box(Box(5627)),
+Box(Box(5628)),
+Box(Box(5629)),
+Box(Box(5630)),
+Box(Box(5631)),
+Box(Box(5632)),
+Box(Box(5633)),
+Box(Box(5634)),
+Box(Box(5635)),
+Box(Box(5636)),
+Box(Box(5637)),
+Box(Box(5638)),
+Box(Box(5639)),
+Box(Box(5640)),
+Box(Box(5641)),
+Box(Box(5642)),
+Box(Box(5643)),
+Box(Box(5644)),
+Box(Box(5645)),
+Box(Box(5646)),
+Box(Box(5647)),
+Box(Box(5648)),
+Box(Box(5649)),
+Box(Box(5650)),
+Box(Box(5651)),
+Box(Box(5652)),
+Box(Box(5653)),
+Box(Box(5654)),
+Box(Box(5655)),
+Box(Box(5656)),
+Box(Box(5657)),
+Box(Box(5658)),
+Box(Box(5659)),
+Box(Box(5660)),
+Box(Box(5661)),
+Box(Box(5662)),
+Box(Box(5663)),
+Box(Box(5664)),
+Box(Box(5665)),
+Box(Box(5666)),
+Box(Box(5667)),
+Box(Box(5668)),
+Box(Box(5669)),
+Box(Box(5670)),
+Box(Box(5671)),
+Box(Box(5672)),
+Box(Box(5673)),
+Box(Box(5674)),
+Box(Box(5675)),
+Box(Box(5676)),
+Box(Box(5677)),
+Box(Box(5678)),
+Box(Box(5679)),
+Box(Box(5680)),
+Box(Box(5681)),
+Box(Box(5682)),
+Box(Box(5683)),
+Box(Box(5684)),
+Box(Box(5685)),
+Box(Box(5686)),
+Box(Box(5687)),
+Box(Box(5688)),
+Box(Box(5689)),
+Box(Box(5690)),
+Box(Box(5691)),
+Box(Box(5692)),
+Box(Box(5693)),
+Box(Box(5694)),
+Box(Box(5695)),
+Box(Box(5696)),
+Box(Box(5697)),
+Box(Box(5698)),
+Box(Box(5699)),
+Box(Box(5700)),
+Box(Box(5701)),
+Box(Box(5702)),
+Box(Box(5703)),
+Box(Box(5704)),
+Box(Box(5705)),
+Box(Box(5706)),
+Box(Box(5707)),
+Box(Box(5708)),
+Box(Box(5709)),
+Box(Box(5710)),
+Box(Box(5711)),
+Box(Box(5712)),
+Box(Box(5713)),
+Box(Box(5714)),
+Box(Box(5715)),
+Box(Box(5716)),
+Box(Box(5717)),
+Box(Box(5718)),
+Box(Box(5719)),
+Box(Box(5720)),
+Box(Box(5721)),
+Box(Box(5722)),
+Box(Box(5723)),
+Box(Box(5724)),
+Box(Box(5725)),
+Box(Box(5726)),
+Box(Box(5727)),
+Box(Box(5728)),
+Box(Box(5729)),
+Box(Box(5730)),
+Box(Box(5731)),
+Box(Box(5732)),
+Box(Box(5733)),
+Box(Box(5734)),
+Box(Box(5735)),
+Box(Box(5736)),
+Box(Box(5737)),
+Box(Box(5738)),
+Box(Box(5739)),
+Box(Box(5740)),
+Box(Box(5741)),
+Box(Box(5742)),
+Box(Box(5743)),
+Box(Box(5744)),
+Box(Box(5745)),
+Box(Box(5746)),
+Box(Box(5747)),
+Box(Box(5748)),
+Box(Box(5749)),
+Box(Box(5750)),
+Box(Box(5751)),
+Box(Box(5752)),
+Box(Box(5753)),
+Box(Box(5754)),
+Box(Box(5755)),
+Box(Box(5756)),
+Box(Box(5757)),
+Box(Box(5758)),
+Box(Box(5759)),
+Box(Box(5760)),
+Box(Box(5761)),
+Box(Box(5762)),
+Box(Box(5763)),
+Box(Box(5764)),
+Box(Box(5765)),
+Box(Box(5766)),
+Box(Box(5767)),
+Box(Box(5768)),
+Box(Box(5769)),
+Box(Box(5770)),
+Box(Box(5771)),
+Box(Box(5772)),
+Box(Box(5773)),
+Box(Box(5774)),
+Box(Box(5775)),
+Box(Box(5776)),
+Box(Box(5777)),
+Box(Box(5778)),
+Box(Box(5779)),
+Box(Box(5780)),
+Box(Box(5781)),
+Box(Box(5782)),
+Box(Box(5783)),
+Box(Box(5784)),
+Box(Box(5785)),
+Box(Box(5786)),
+Box(Box(5787)),
+Box(Box(5788)),
+Box(Box(5789)),
+Box(Box(5790)),
+Box(Box(5791)),
+Box(Box(5792)),
+Box(Box(5793)),
+Box(Box(5794)),
+Box(Box(5795)),
+Box(Box(5796)),
+Box(Box(5797)),
+Box(Box(5798)),
+Box(Box(5799)),
+Box(Box(5800)),
+Box(Box(5801)),
+Box(Box(5802)),
+Box(Box(5803)),
+Box(Box(5804)),
+Box(Box(5805)),
+Box(Box(5806)),
+Box(Box(5807)),
+Box(Box(5808)),
+Box(Box(5809)),
+Box(Box(5810)),
+Box(Box(5811)),
+Box(Box(5812)),
+Box(Box(5813)),
+Box(Box(5814)),
+Box(Box(5815)),
+Box(Box(5816)),
+Box(Box(5817)),
+Box(Box(5818)),
+Box(Box(5819)),
+Box(Box(5820)),
+Box(Box(5821)),
+Box(Box(5822)),
+Box(Box(5823)),
+Box(Box(5824)),
+Box(Box(5825)),
+Box(Box(5826)),
+Box(Box(5827)),
+Box(Box(5828)),
+Box(Box(5829)),
+Box(Box(5830)),
+Box(Box(5831)),
+Box(Box(5832)),
+Box(Box(5833)),
+Box(Box(5834)),
+Box(Box(5835)),
+Box(Box(5836)),
+Box(Box(5837)),
+Box(Box(5838)),
+Box(Box(5839)),
+Box(Box(5840)),
+Box(Box(5841)),
+Box(Box(5842)),
+Box(Box(5843)),
+Box(Box(5844)),
+Box(Box(5845)),
+Box(Box(5846)),
+Box(Box(5847)),
+Box(Box(5848)),
+Box(Box(5849)),
+Box(Box(5850)),
+Box(Box(5851)),
+Box(Box(5852)),
+Box(Box(5853)),
+Box(Box(5854)),
+Box(Box(5855)),
+Box(Box(5856)),
+Box(Box(5857)),
+Box(Box(5858)),
+Box(Box(5859)),
+Box(Box(5860)),
+Box(Box(5861)),
+Box(Box(5862)),
+Box(Box(5863)),
+Box(Box(5864)),
+Box(Box(5865)),
+Box(Box(5866)),
+Box(Box(5867)),
+Box(Box(5868)),
+Box(Box(5869)),
+Box(Box(5870)),
+Box(Box(5871)),
+Box(Box(5872)),
+Box(Box(5873)),
+Box(Box(5874)),
+Box(Box(5875)),
+Box(Box(5876)),
+Box(Box(5877)),
+Box(Box(5878)),
+Box(Box(5879)),
+Box(Box(5880)),
+Box(Box(5881)),
+Box(Box(5882)),
+Box(Box(5883)),
+Box(Box(5884)),
+Box(Box(5885)),
+Box(Box(5886)),
+Box(Box(5887)),
+Box(Box(5888)),
+Box(Box(5889)),
+Box(Box(5890)),
+Box(Box(5891)),
+Box(Box(5892)),
+Box(Box(5893)),
+Box(Box(5894)),
+Box(Box(5895)),
+Box(Box(5896)),
+Box(Box(5897)),
+Box(Box(5898)),
+Box(Box(5899)),
+Box(Box(5900)),
+Box(Box(5901)),
+Box(Box(5902)),
+Box(Box(5903)),
+Box(Box(5904)),
+Box(Box(5905)),
+Box(Box(5906)),
+Box(Box(5907)),
+Box(Box(5908)),
+Box(Box(5909)),
+Box(Box(5910)),
+Box(Box(5911)),
+Box(Box(5912)),
+Box(Box(5913)),
+Box(Box(5914)),
+Box(Box(5915)),
+Box(Box(5916)),
+Box(Box(5917)),
+Box(Box(5918)),
+Box(Box(5919)),
+Box(Box(5920)),
+Box(Box(5921)),
+Box(Box(5922)),
+Box(Box(5923)),
+Box(Box(5924)),
+Box(Box(5925)),
+Box(Box(5926)),
+Box(Box(5927)),
+Box(Box(5928)),
+Box(Box(5929)),
+Box(Box(5930)),
+Box(Box(5931)),
+Box(Box(5932)),
+Box(Box(5933)),
+Box(Box(5934)),
+Box(Box(5935)),
+Box(Box(5936)),
+Box(Box(5937)),
+Box(Box(5938)),
+Box(Box(5939)),
+Box(Box(5940)),
+Box(Box(5941)),
+Box(Box(5942)),
+Box(Box(5943)),
+Box(Box(5944)),
+Box(Box(5945)),
+Box(Box(5946)),
+Box(Box(5947)),
+Box(Box(5948)),
+Box(Box(5949)),
+Box(Box(5950)),
+Box(Box(5951)),
+Box(Box(5952)),
+Box(Box(5953)),
+Box(Box(5954)),
+Box(Box(5955)),
+Box(Box(5956)),
+Box(Box(5957)),
+Box(Box(5958)),
+Box(Box(5959)),
+Box(Box(5960)),
+Box(Box(5961)),
+Box(Box(5962)),
+Box(Box(5963)),
+Box(Box(5964)),
+Box(Box(5965)),
+Box(Box(5966)),
+Box(Box(5967)),
+Box(Box(5968)),
+Box(Box(5969)),
+Box(Box(5970)),
+Box(Box(5971)),
+Box(Box(5972)),
+Box(Box(5973)),
+Box(Box(5974)),
+Box(Box(5975)),
+Box(Box(5976)),
+Box(Box(5977)),
+Box(Box(5978)),
+Box(Box(5979)),
+Box(Box(5980)),
+Box(Box(5981)),
+Box(Box(5982)),
+Box(Box(5983)),
+Box(Box(5984)),
+Box(Box(5985)),
+Box(Box(5986)),
+Box(Box(5987)),
+Box(Box(5988)),
+Box(Box(5989)),
+Box(Box(5990)),
+Box(Box(5991)),
+Box(Box(5992)),
+Box(Box(5993)),
+Box(Box(5994)),
+Box(Box(5995)),
+Box(Box(5996)),
+Box(Box(5997)),
+Box(Box(5998)),
+Box(Box(5999)),
+Box(Box(6000)),
+Box(Box(6001)),
+Box(Box(6002)),
+Box(Box(6003)),
+Box(Box(6004)),
+Box(Box(6005)),
+Box(Box(6006)),
+Box(Box(6007)),
+Box(Box(6008)),
+Box(Box(6009)),
+Box(Box(6010)),
+Box(Box(6011)),
+Box(Box(6012)),
+Box(Box(6013)),
+Box(Box(6014)),
+Box(Box(6015)),
+Box(Box(6016)),
+Box(Box(6017)),
+Box(Box(6018)),
+Box(Box(6019)),
+Box(Box(6020)),
+Box(Box(6021)),
+Box(Box(6022)),
+Box(Box(6023)),
+Box(Box(6024)),
+Box(Box(6025)),
+Box(Box(6026)),
+Box(Box(6027)),
+Box(Box(6028)),
+Box(Box(6029)),
+Box(Box(6030)),
+Box(Box(6031)),
+Box(Box(6032)),
+Box(Box(6033)),
+Box(Box(6034)),
+Box(Box(6035)),
+Box(Box(6036)),
+Box(Box(6037)),
+Box(Box(6038)),
+Box(Box(6039)),
+Box(Box(6040)),
+Box(Box(6041)),
+Box(Box(6042)),
+Box(Box(6043)),
+Box(Box(6044)),
+Box(Box(6045)),
+Box(Box(6046)),
+Box(Box(6047)),
+Box(Box(6048)),
+Box(Box(6049)),
+Box(Box(6050)),
+Box(Box(6051)),
+Box(Box(6052)),
+Box(Box(6053)),
+Box(Box(6054)),
+Box(Box(6055)),
+Box(Box(6056)),
+Box(Box(6057)),
+Box(Box(6058)),
+Box(Box(6059)),
+Box(Box(6060)),
+Box(Box(6061)),
+Box(Box(6062)),
+Box(Box(6063)),
+Box(Box(6064)),
+Box(Box(6065)),
+Box(Box(6066)),
+Box(Box(6067)),
+Box(Box(6068)),
+Box(Box(6069)),
+Box(Box(6070)),
+Box(Box(6071)),
+Box(Box(6072)),
+Box(Box(6073)),
+Box(Box(6074)),
+Box(Box(6075)),
+Box(Box(6076)),
+Box(Box(6077)),
+Box(Box(6078)),
+Box(Box(6079)),
+Box(Box(6080)),
+Box(Box(6081)),
+Box(Box(6082)),
+Box(Box(6083)),
+Box(Box(6084)),
+Box(Box(6085)),
+Box(Box(6086)),
+Box(Box(6087)),
+Box(Box(6088)),
+Box(Box(6089)),
+Box(Box(6090)),
+Box(Box(6091)),
+Box(Box(6092)),
+Box(Box(6093)),
+Box(Box(6094)),
+Box(Box(6095)),
+Box(Box(6096)),
+Box(Box(6097)),
+Box(Box(6098)),
+Box(Box(6099)),
+Box(Box(6100)),
+Box(Box(6101)),
+Box(Box(6102)),
+Box(Box(6103)),
+Box(Box(6104)),
+Box(Box(6105)),
+Box(Box(6106)),
+Box(Box(6107)),
+Box(Box(6108)),
+Box(Box(6109)),
+Box(Box(6110)),
+Box(Box(6111)),
+Box(Box(6112)),
+Box(Box(6113)),
+Box(Box(6114)),
+Box(Box(6115)),
+Box(Box(6116)),
+Box(Box(6117)),
+Box(Box(6118)),
+Box(Box(6119)),
+Box(Box(6120)),
+Box(Box(6121)),
+Box(Box(6122)),
+Box(Box(6123)),
+Box(Box(6124)),
+Box(Box(6125)),
+Box(Box(6126)),
+Box(Box(6127)),
+Box(Box(6128)),
+Box(Box(6129)),
+Box(Box(6130)),
+Box(Box(6131)),
+Box(Box(6132)),
+Box(Box(6133)),
+Box(Box(6134)),
+Box(Box(6135)),
+Box(Box(6136)),
+Box(Box(6137)),
+Box(Box(6138)),
+Box(Box(6139)),
+Box(Box(6140)),
+Box(Box(6141)),
+Box(Box(6142)),
+Box(Box(6143)),
+Box(Box(6144)),
+Box(Box(6145)),
+Box(Box(6146)),
+Box(Box(6147)),
+Box(Box(6148)),
+Box(Box(6149)),
+Box(Box(6150)),
+Box(Box(6151)),
+Box(Box(6152)),
+Box(Box(6153)),
+Box(Box(6154)),
+Box(Box(6155)),
+Box(Box(6156)),
+Box(Box(6157)),
+Box(Box(6158)),
+Box(Box(6159)),
+Box(Box(6160)),
+Box(Box(6161)),
+Box(Box(6162)),
+Box(Box(6163)),
+Box(Box(6164)),
+Box(Box(6165)),
+Box(Box(6166)),
+Box(Box(6167)),
+Box(Box(6168)),
+Box(Box(6169)),
+Box(Box(6170)),
+Box(Box(6171)),
+Box(Box(6172)),
+Box(Box(6173)),
+Box(Box(6174)),
+Box(Box(6175)),
+Box(Box(6176)),
+Box(Box(6177)),
+Box(Box(6178)),
+Box(Box(6179)),
+Box(Box(6180)),
+Box(Box(6181)),
+Box(Box(6182)),
+Box(Box(6183)),
+Box(Box(6184)),
+Box(Box(6185)),
+Box(Box(6186)),
+Box(Box(6187)),
+Box(Box(6188)),
+Box(Box(6189)),
+Box(Box(6190)),
+Box(Box(6191)),
+Box(Box(6192)),
+Box(Box(6193)),
+Box(Box(6194)),
+Box(Box(6195)),
+Box(Box(6196)),
+Box(Box(6197)),
+Box(Box(6198)),
+Box(Box(6199)),
+Box(Box(6200)),
+Box(Box(6201)),
+Box(Box(6202)),
+Box(Box(6203)),
+Box(Box(6204)),
+Box(Box(6205)),
+Box(Box(6206)),
+Box(Box(6207)),
+Box(Box(6208)),
+Box(Box(6209)),
+Box(Box(6210)),
+Box(Box(6211)),
+Box(Box(6212)),
+Box(Box(6213)),
+Box(Box(6214)),
+Box(Box(6215)),
+Box(Box(6216)),
+Box(Box(6217)),
+Box(Box(6218)),
+Box(Box(6219)),
+Box(Box(6220)),
+Box(Box(6221)),
+Box(Box(6222)),
+Box(Box(6223)),
+Box(Box(6224)),
+Box(Box(6225)),
+Box(Box(6226)),
+Box(Box(6227)),
+Box(Box(6228)),
+Box(Box(6229)),
+Box(Box(6230)),
+Box(Box(6231)),
+Box(Box(6232)),
+Box(Box(6233)),
+Box(Box(6234)),
+Box(Box(6235)),
+Box(Box(6236)),
+Box(Box(6237)),
+Box(Box(6238)),
+Box(Box(6239)),
+Box(Box(6240)),
+Box(Box(6241)),
+Box(Box(6242)),
+Box(Box(6243)),
+Box(Box(6244)),
+Box(Box(6245)),
+Box(Box(6246)),
+Box(Box(6247)),
+Box(Box(6248)),
+Box(Box(6249)),
+Box(Box(6250)),
+Box(Box(6251)),
+Box(Box(6252)),
+Box(Box(6253)),
+Box(Box(6254)),
+Box(Box(6255)),
+Box(Box(6256)),
+Box(Box(6257)),
+Box(Box(6258)),
+Box(Box(6259)),
+Box(Box(6260)),
+Box(Box(6261)),
+Box(Box(6262)),
+Box(Box(6263)),
+Box(Box(6264)),
+Box(Box(6265)),
+Box(Box(6266)),
+Box(Box(6267)),
+Box(Box(6268)),
+Box(Box(6269)),
+Box(Box(6270)),
+Box(Box(6271)),
+Box(Box(6272)),
+Box(Box(6273)),
+Box(Box(6274)),
+Box(Box(6275)),
+Box(Box(6276)),
+Box(Box(6277)),
+Box(Box(6278)),
+Box(Box(6279)),
+Box(Box(6280)),
+Box(Box(6281)),
+Box(Box(6282)),
+Box(Box(6283)),
+Box(Box(6284)),
+Box(Box(6285)),
+Box(Box(6286)),
+Box(Box(6287)),
+Box(Box(6288)),
+Box(Box(6289)),
+Box(Box(6290)),
+Box(Box(6291)),
+Box(Box(6292)),
+Box(Box(6293)),
+Box(Box(6294)),
+Box(Box(6295)),
+Box(Box(6296)),
+Box(Box(6297)),
+Box(Box(6298)),
+Box(Box(6299)),
+Box(Box(6300)),
+Box(Box(6301)),
+Box(Box(6302)),
+Box(Box(6303)),
+Box(Box(6304)),
+Box(Box(6305)),
+Box(Box(6306)),
+Box(Box(6307)),
+Box(Box(6308)),
+Box(Box(6309)),
+Box(Box(6310)),
+Box(Box(6311)),
+Box(Box(6312)),
+Box(Box(6313)),
+Box(Box(6314)),
+Box(Box(6315)),
+Box(Box(6316)),
+Box(Box(6317)),
+Box(Box(6318)),
+Box(Box(6319)),
+Box(Box(6320)),
+Box(Box(6321)),
+Box(Box(6322)),
+Box(Box(6323)),
+Box(Box(6324)),
+Box(Box(6325)),
+Box(Box(6326)),
+Box(Box(6327)),
+Box(Box(6328)),
+Box(Box(6329)),
+Box(Box(6330)),
+Box(Box(6331)),
+Box(Box(6332)),
+Box(Box(6333)),
+Box(Box(6334)),
+Box(Box(6335)),
+Box(Box(6336)),
+Box(Box(6337)),
+Box(Box(6338)),
+Box(Box(6339)),
+Box(Box(6340)),
+Box(Box(6341)),
+Box(Box(6342)),
+Box(Box(6343)),
+Box(Box(6344)),
+Box(Box(6345)),
+Box(Box(6346)),
+Box(Box(6347)),
+Box(Box(6348)),
+Box(Box(6349)),
+Box(Box(6350)),
+Box(Box(6351)),
+Box(Box(6352)),
+Box(Box(6353)),
+Box(Box(6354)),
+Box(Box(6355)),
+Box(Box(6356)),
+Box(Box(6357)),
+Box(Box(6358)),
+Box(Box(6359)),
+Box(Box(6360)),
+Box(Box(6361)),
+Box(Box(6362)),
+Box(Box(6363)),
+Box(Box(6364)),
+Box(Box(6365)),
+Box(Box(6366)),
+Box(Box(6367)),
+Box(Box(6368)),
+Box(Box(6369)),
+Box(Box(6370)),
+Box(Box(6371)),
+Box(Box(6372)),
+Box(Box(6373)),
+Box(Box(6374)),
+Box(Box(6375)),
+Box(Box(6376)),
+Box(Box(6377)),
+Box(Box(6378)),
+Box(Box(6379)),
+Box(Box(6380)),
+Box(Box(6381)),
+Box(Box(6382)),
+Box(Box(6383)),
+Box(Box(6384)),
+Box(Box(6385)),
+Box(Box(6386)),
+Box(Box(6387)),
+Box(Box(6388)),
+Box(Box(6389)),
+Box(Box(6390)),
+Box(Box(6391)),
+Box(Box(6392)),
+Box(Box(6393)),
+Box(Box(6394)),
+Box(Box(6395)),
+Box(Box(6396)),
+Box(Box(6397)),
+Box(Box(6398)),
+Box(Box(6399)),
+Box(Box(6400)),
+Box(Box(6401)),
+Box(Box(6402)),
+Box(Box(6403)),
+Box(Box(6404)),
+Box(Box(6405)),
+Box(Box(6406)),
+Box(Box(6407)),
+Box(Box(6408)),
+Box(Box(6409)),
+Box(Box(6410)),
+Box(Box(6411)),
+Box(Box(6412)),
+Box(Box(6413)),
+Box(Box(6414)),
+Box(Box(6415)),
+Box(Box(6416)),
+Box(Box(6417)),
+Box(Box(6418)),
+Box(Box(6419)),
+Box(Box(6420)),
+Box(Box(6421)),
+Box(Box(6422)),
+Box(Box(6423)),
+Box(Box(6424)),
+Box(Box(6425)),
+Box(Box(6426)),
+Box(Box(6427)),
+Box(Box(6428)),
+Box(Box(6429)),
+Box(Box(6430)),
+Box(Box(6431)),
+Box(Box(6432)),
+Box(Box(6433)),
+Box(Box(6434)),
+Box(Box(6435)),
+Box(Box(6436)),
+Box(Box(6437)),
+Box(Box(6438)),
+Box(Box(6439)),
+Box(Box(6440)),
+Box(Box(6441)),
+Box(Box(6442)),
+Box(Box(6443)),
+Box(Box(6444)),
+Box(Box(6445)),
+Box(Box(6446)),
+Box(Box(6447)),
+Box(Box(6448)),
+Box(Box(6449)),
+Box(Box(6450)),
+Box(Box(6451)),
+Box(Box(6452)),
+Box(Box(6453)),
+Box(Box(6454)),
+Box(Box(6455)),
+Box(Box(6456)),
+Box(Box(6457)),
+Box(Box(6458)),
+Box(Box(6459)),
+Box(Box(6460)),
+Box(Box(6461)),
+Box(Box(6462)),
+Box(Box(6463)),
+Box(Box(6464)),
+Box(Box(6465)),
+Box(Box(6466)),
+Box(Box(6467)),
+Box(Box(6468)),
+Box(Box(6469)),
+Box(Box(6470)),
+Box(Box(6471)),
+Box(Box(6472)),
+Box(Box(6473)),
+Box(Box(6474)),
+Box(Box(6475)),
+Box(Box(6476)),
+Box(Box(6477)),
+Box(Box(6478)),
+Box(Box(6479)),
+Box(Box(6480)),
+Box(Box(6481)),
+Box(Box(6482)),
+Box(Box(6483)),
+Box(Box(6484)),
+Box(Box(6485)),
+Box(Box(6486)),
+Box(Box(6487)),
+Box(Box(6488)),
+Box(Box(6489)),
+Box(Box(6490)),
+Box(Box(6491)),
+Box(Box(6492)),
+Box(Box(6493)),
+Box(Box(6494)),
+Box(Box(6495)),
+Box(Box(6496)),
+Box(Box(6497)),
+Box(Box(6498)),
+Box(Box(6499)),
+Box(Box(6500)),
+Box(Box(6501)),
+Box(Box(6502)),
+Box(Box(6503)),
+Box(Box(6504)),
+Box(Box(6505)),
+Box(Box(6506)),
+Box(Box(6507)),
+Box(Box(6508)),
+Box(Box(6509)),
+Box(Box(6510)),
+Box(Box(6511)),
+Box(Box(6512)),
+Box(Box(6513)),
+Box(Box(6514)),
+Box(Box(6515)),
+Box(Box(6516)),
+Box(Box(6517)),
+Box(Box(6518)),
+Box(Box(6519)),
+Box(Box(6520)),
+Box(Box(6521)),
+Box(Box(6522)),
+Box(Box(6523)),
+Box(Box(6524)),
+Box(Box(6525)),
+Box(Box(6526)),
+Box(Box(6527)),
+Box(Box(6528)),
+Box(Box(6529)),
+Box(Box(6530)),
+Box(Box(6531)),
+Box(Box(6532)),
+Box(Box(6533)),
+Box(Box(6534)),
+Box(Box(6535)),
+Box(Box(6536)),
+Box(Box(6537)),
+Box(Box(6538)),
+Box(Box(6539)),
+Box(Box(6540)),
+Box(Box(6541)),
+Box(Box(6542)),
+Box(Box(6543)),
+Box(Box(6544)),
+Box(Box(6545)),
+Box(Box(6546)),
+Box(Box(6547)),
+Box(Box(6548)),
+Box(Box(6549)),
+Box(Box(6550)),
+Box(Box(6551)),
+Box(Box(6552)),
+Box(Box(6553)),
+Box(Box(6554)),
+Box(Box(6555)),
+Box(Box(6556)),
+Box(Box(6557)),
+Box(Box(6558)),
+Box(Box(6559)),
+Box(Box(6560)),
+Box(Box(6561)),
+Box(Box(6562)),
+Box(Box(6563)),
+Box(Box(6564)),
+Box(Box(6565)),
+Box(Box(6566)),
+Box(Box(6567)),
+Box(Box(6568)),
+Box(Box(6569)),
+Box(Box(6570)),
+Box(Box(6571)),
+Box(Box(6572)),
+Box(Box(6573)),
+Box(Box(6574)),
+Box(Box(6575)),
+Box(Box(6576)),
+Box(Box(6577)),
+Box(Box(6578)),
+Box(Box(6579)),
+Box(Box(6580)),
+Box(Box(6581)),
+Box(Box(6582)),
+Box(Box(6583)),
+Box(Box(6584)),
+Box(Box(6585)),
+Box(Box(6586)),
+Box(Box(6587)),
+Box(Box(6588)),
+Box(Box(6589)),
+Box(Box(6590)),
+Box(Box(6591)),
+Box(Box(6592)),
+Box(Box(6593)),
+Box(Box(6594)),
+Box(Box(6595)),
+Box(Box(6596)),
+Box(Box(6597)),
+Box(Box(6598)),
+Box(Box(6599)),
+Box(Box(6600)),
+Box(Box(6601)),
+Box(Box(6602)),
+Box(Box(6603)),
+Box(Box(6604)),
+Box(Box(6605)),
+Box(Box(6606)),
+Box(Box(6607)),
+Box(Box(6608)),
+Box(Box(6609)),
+Box(Box(6610)),
+Box(Box(6611)),
+Box(Box(6612)),
+Box(Box(6613)),
+Box(Box(6614)),
+Box(Box(6615)),
+Box(Box(6616)),
+Box(Box(6617)),
+Box(Box(6618)),
+Box(Box(6619)),
+Box(Box(6620)),
+Box(Box(6621)),
+Box(Box(6622)),
+Box(Box(6623)),
+Box(Box(6624)),
+Box(Box(6625)),
+Box(Box(6626)),
+Box(Box(6627)),
+Box(Box(6628)),
+Box(Box(6629)),
+Box(Box(6630)),
+Box(Box(6631)),
+Box(Box(6632)),
+Box(Box(6633)),
+Box(Box(6634)),
+Box(Box(6635)),
+Box(Box(6636)),
+Box(Box(6637)),
+Box(Box(6638)),
+Box(Box(6639)),
+Box(Box(6640)),
+Box(Box(6641)),
+Box(Box(6642)),
+Box(Box(6643)),
+Box(Box(6644)),
+Box(Box(6645)),
+Box(Box(6646)),
+Box(Box(6647)),
+Box(Box(6648)),
+Box(Box(6649)),
+Box(Box(6650)),
+Box(Box(6651)),
+Box(Box(6652)),
+Box(Box(6653)),
+Box(Box(6654)),
+Box(Box(6655)),
+Box(Box(6656)),
+Box(Box(6657)),
+Box(Box(6658)),
+Box(Box(6659)),
+Box(Box(6660)),
+Box(Box(6661)),
+Box(Box(6662)),
+Box(Box(6663)),
+Box(Box(6664)),
+Box(Box(6665)),
+Box(Box(6666)),
+Box(Box(6667)),
+Box(Box(6668)),
+Box(Box(6669)),
+Box(Box(6670)),
+Box(Box(6671)),
+Box(Box(6672)),
+Box(Box(6673)),
+Box(Box(6674)),
+Box(Box(6675)),
+Box(Box(6676)),
+Box(Box(6677)),
+Box(Box(6678)),
+Box(Box(6679)),
+Box(Box(6680)),
+Box(Box(6681)),
+Box(Box(6682)),
+Box(Box(6683)),
+Box(Box(6684)),
+Box(Box(6685)),
+Box(Box(6686)),
+Box(Box(6687)),
+Box(Box(6688)),
+Box(Box(6689)),
+Box(Box(6690)),
+Box(Box(6691)),
+Box(Box(6692)),
+Box(Box(6693)),
+Box(Box(6694)),
+Box(Box(6695)),
+Box(Box(6696)),
+Box(Box(6697)),
+Box(Box(6698)),
+Box(Box(6699)),
+Box(Box(6700)),
+Box(Box(6701)),
+Box(Box(6702)),
+Box(Box(6703)),
+Box(Box(6704)),
+Box(Box(6705)),
+Box(Box(6706)),
+Box(Box(6707)),
+Box(Box(6708)),
+Box(Box(6709)),
+Box(Box(6710)),
+Box(Box(6711)),
+Box(Box(6712)),
+Box(Box(6713)),
+Box(Box(6714)),
+Box(Box(6715)),
+Box(Box(6716)),
+Box(Box(6717)),
+Box(Box(6718)),
+Box(Box(6719)),
+Box(Box(6720)),
+Box(Box(6721)),
+Box(Box(6722)),
+Box(Box(6723)),
+Box(Box(6724)),
+Box(Box(6725)),
+Box(Box(6726)),
+Box(Box(6727)),
+Box(Box(6728)),
+Box(Box(6729)),
+Box(Box(6730)),
+Box(Box(6731)),
+Box(Box(6732)),
+Box(Box(6733)),
+Box(Box(6734)),
+Box(Box(6735)),
+Box(Box(6736)),
+Box(Box(6737)),
+Box(Box(6738)),
+Box(Box(6739)),
+Box(Box(6740)),
+Box(Box(6741)),
+Box(Box(6742)),
+Box(Box(6743)),
+Box(Box(6744)),
+Box(Box(6745)),
+Box(Box(6746)),
+Box(Box(6747)),
+Box(Box(6748)),
+Box(Box(6749)),
+Box(Box(6750)),
+Box(Box(6751)),
+Box(Box(6752)),
+Box(Box(6753)),
+Box(Box(6754)),
+Box(Box(6755)),
+Box(Box(6756)),
+Box(Box(6757)),
+Box(Box(6758)),
+Box(Box(6759)),
+Box(Box(6760)),
+Box(Box(6761)),
+Box(Box(6762)),
+Box(Box(6763)),
+Box(Box(6764)),
+Box(Box(6765)),
+Box(Box(6766)),
+Box(Box(6767)),
+Box(Box(6768)),
+Box(Box(6769)),
+Box(Box(6770)),
+Box(Box(6771)),
+Box(Box(6772)),
+Box(Box(6773)),
+Box(Box(6774)),
+Box(Box(6775)),
+Box(Box(6776)),
+Box(Box(6777)),
+Box(Box(6778)),
+Box(Box(6779)),
+Box(Box(6780)),
+Box(Box(6781)),
+Box(Box(6782)),
+Box(Box(6783)),
+Box(Box(6784)),
+Box(Box(6785)),
+Box(Box(6786)),
+Box(Box(6787)),
+Box(Box(6788)),
+Box(Box(6789)),
+Box(Box(6790)),
+Box(Box(6791)),
+Box(Box(6792)),
+Box(Box(6793)),
+Box(Box(6794)),
+Box(Box(6795)),
+Box(Box(6796)),
+Box(Box(6797)),
+Box(Box(6798)),
+Box(Box(6799)),
+Box(Box(6800)),
+Box(Box(6801)),
+Box(Box(6802)),
+Box(Box(6803)),
+Box(Box(6804)),
+Box(Box(6805)),
+Box(Box(6806)),
+Box(Box(6807)),
+Box(Box(6808)),
+Box(Box(6809)),
+Box(Box(6810)),
+Box(Box(6811)),
+Box(Box(6812)),
+Box(Box(6813)),
+Box(Box(6814)),
+Box(Box(6815)),
+Box(Box(6816)),
+Box(Box(6817)),
+Box(Box(6818)),
+Box(Box(6819)),
+Box(Box(6820)),
+Box(Box(6821)),
+Box(Box(6822)),
+Box(Box(6823)),
+Box(Box(6824)),
+Box(Box(6825)),
+Box(Box(6826)),
+Box(Box(6827)),
+Box(Box(6828)),
+Box(Box(6829)),
+Box(Box(6830)),
+Box(Box(6831)),
+Box(Box(6832)),
+Box(Box(6833)),
+Box(Box(6834)),
+Box(Box(6835)),
+Box(Box(6836)),
+Box(Box(6837)),
+Box(Box(6838)),
+Box(Box(6839)),
+Box(Box(6840)),
+Box(Box(6841)),
+Box(Box(6842)),
+Box(Box(6843)),
+Box(Box(6844)),
+Box(Box(6845)),
+Box(Box(6846)),
+Box(Box(6847)),
+Box(Box(6848)),
+Box(Box(6849)),
+Box(Box(6850)),
+Box(Box(6851)),
+Box(Box(6852)),
+Box(Box(6853)),
+Box(Box(6854)),
+Box(Box(6855)),
+Box(Box(6856)),
+Box(Box(6857)),
+Box(Box(6858)),
+Box(Box(6859)),
+Box(Box(6860)),
+Box(Box(6861)),
+Box(Box(6862)),
+Box(Box(6863)),
+Box(Box(6864)),
+Box(Box(6865)),
+Box(Box(6866)),
+Box(Box(6867)),
+Box(Box(6868)),
+Box(Box(6869)),
+Box(Box(6870)),
+Box(Box(6871)),
+Box(Box(6872)),
+Box(Box(6873)),
+Box(Box(6874)),
+Box(Box(6875)),
+Box(Box(6876)),
+Box(Box(6877)),
+Box(Box(6878)),
+Box(Box(6879)),
+Box(Box(6880)),
+Box(Box(6881)),
+Box(Box(6882)),
+Box(Box(6883)),
+Box(Box(6884)),
+Box(Box(6885)),
+Box(Box(6886)),
+Box(Box(6887)),
+Box(Box(6888)),
+Box(Box(6889)),
+Box(Box(6890)),
+Box(Box(6891)),
+Box(Box(6892)),
+Box(Box(6893)),
+Box(Box(6894)),
+Box(Box(6895)),
+Box(Box(6896)),
+Box(Box(6897)),
+Box(Box(6898)),
+Box(Box(6899)),
+Box(Box(6900)),
+Box(Box(6901)),
+Box(Box(6902)),
+Box(Box(6903)),
+Box(Box(6904)),
+Box(Box(6905)),
+Box(Box(6906)),
+Box(Box(6907)),
+Box(Box(6908)),
+Box(Box(6909)),
+Box(Box(6910)),
+Box(Box(6911)),
+Box(Box(6912)),
+Box(Box(6913)),
+Box(Box(6914)),
+Box(Box(6915)),
+Box(Box(6916)),
+Box(Box(6917)),
+Box(Box(6918)),
+Box(Box(6919)),
+Box(Box(6920)),
+Box(Box(6921)),
+Box(Box(6922)),
+Box(Box(6923)),
+Box(Box(6924)),
+Box(Box(6925)),
+Box(Box(6926)),
+Box(Box(6927)),
+Box(Box(6928)),
+Box(Box(6929)),
+Box(Box(6930)),
+Box(Box(6931)),
+Box(Box(6932)),
+Box(Box(6933)),
+Box(Box(6934)),
+Box(Box(6935)),
+Box(Box(6936)),
+Box(Box(6937)),
+Box(Box(6938)),
+Box(Box(6939)),
+Box(Box(6940)),
+Box(Box(6941)),
+Box(Box(6942)),
+Box(Box(6943)),
+Box(Box(6944)),
+Box(Box(6945)),
+Box(Box(6946)),
+Box(Box(6947)),
+Box(Box(6948)),
+Box(Box(6949)),
+Box(Box(6950)),
+Box(Box(6951)),
+Box(Box(6952)),
+Box(Box(6953)),
+Box(Box(6954)),
+Box(Box(6955)),
+Box(Box(6956)),
+Box(Box(6957)),
+Box(Box(6958)),
+Box(Box(6959)),
+Box(Box(6960)),
+Box(Box(6961)),
+Box(Box(6962)),
+Box(Box(6963)),
+Box(Box(6964)),
+Box(Box(6965)),
+Box(Box(6966)),
+Box(Box(6967)),
+Box(Box(6968)),
+Box(Box(6969)),
+Box(Box(6970)),
+Box(Box(6971)),
+Box(Box(6972)),
+Box(Box(6973)),
+Box(Box(6974)),
+Box(Box(6975)),
+Box(Box(6976)),
+Box(Box(6977)),
+Box(Box(6978)),
+Box(Box(6979)),
+Box(Box(6980)),
+Box(Box(6981)),
+Box(Box(6982)),
+Box(Box(6983)),
+Box(Box(6984)),
+Box(Box(6985)),
+Box(Box(6986)),
+Box(Box(6987)),
+Box(Box(6988)),
+Box(Box(6989)),
+Box(Box(6990)),
+Box(Box(6991)),
+Box(Box(6992)),
+Box(Box(6993)),
+Box(Box(6994)),
+Box(Box(6995)),
+Box(Box(6996)),
+Box(Box(6997)),
+Box(Box(6998)),
+Box(Box(6999)),
+Box(Box(7000)),
+Box(Box(7001)),
+Box(Box(7002)),
+Box(Box(7003)),
+Box(Box(7004)),
+Box(Box(7005)),
+Box(Box(7006)),
+Box(Box(7007)),
+Box(Box(7008)),
+Box(Box(7009)),
+Box(Box(7010)),
+Box(Box(7011)),
+Box(Box(7012)),
+Box(Box(7013)),
+Box(Box(7014)),
+Box(Box(7015)),
+Box(Box(7016)),
+Box(Box(7017)),
+Box(Box(7018)),
+Box(Box(7019)),
+Box(Box(7020)),
+Box(Box(7021)),
+Box(Box(7022)),
+Box(Box(7023)),
+Box(Box(7024)),
+Box(Box(7025)),
+Box(Box(7026)),
+Box(Box(7027)),
+Box(Box(7028)),
+Box(Box(7029)),
+Box(Box(7030)),
+Box(Box(7031)),
+Box(Box(7032)),
+Box(Box(7033)),
+Box(Box(7034)),
+Box(Box(7035)),
+Box(Box(7036)),
+Box(Box(7037)),
+Box(Box(7038)),
+Box(Box(7039)),
+Box(Box(7040)),
+Box(Box(7041)),
+Box(Box(7042)),
+Box(Box(7043)),
+Box(Box(7044)),
+Box(Box(7045)),
+Box(Box(7046)),
+Box(Box(7047)),
+Box(Box(7048)),
+Box(Box(7049)),
+Box(Box(7050)),
+Box(Box(7051)),
+Box(Box(7052)),
+Box(Box(7053)),
+Box(Box(7054)),
+Box(Box(7055)),
+Box(Box(7056)),
+Box(Box(7057)),
+Box(Box(7058)),
+Box(Box(7059)),
+Box(Box(7060)),
+Box(Box(7061)),
+Box(Box(7062)),
+Box(Box(7063)),
+Box(Box(7064)),
+Box(Box(7065)),
+Box(Box(7066)),
+Box(Box(7067)),
+Box(Box(7068)),
+Box(Box(7069)),
+Box(Box(7070)),
+Box(Box(7071)),
+Box(Box(7072)),
+Box(Box(7073)),
+Box(Box(7074)),
+Box(Box(7075)),
+Box(Box(7076)),
+Box(Box(7077)),
+Box(Box(7078)),
+Box(Box(7079)),
+Box(Box(7080)),
+Box(Box(7081)),
+Box(Box(7082)),
+Box(Box(7083)),
+Box(Box(7084)),
+Box(Box(7085)),
+Box(Box(7086)),
+Box(Box(7087)),
+Box(Box(7088)),
+Box(Box(7089)),
+Box(Box(7090)),
+Box(Box(7091)),
+Box(Box(7092)),
+Box(Box(7093)),
+Box(Box(7094)),
+Box(Box(7095)),
+Box(Box(7096)),
+Box(Box(7097)),
+Box(Box(7098)),
+Box(Box(7099)),
+Box(Box(7100)),
+Box(Box(7101)),
+Box(Box(7102)),
+Box(Box(7103)),
+Box(Box(7104)),
+Box(Box(7105)),
+Box(Box(7106)),
+Box(Box(7107)),
+Box(Box(7108)),
+Box(Box(7109)),
+Box(Box(7110)),
+Box(Box(7111)),
+Box(Box(7112)),
+Box(Box(7113)),
+Box(Box(7114)),
+Box(Box(7115)),
+Box(Box(7116)),
+Box(Box(7117)),
+Box(Box(7118)),
+Box(Box(7119)),
+Box(Box(7120)),
+Box(Box(7121)),
+Box(Box(7122)),
+Box(Box(7123)),
+Box(Box(7124)),
+Box(Box(7125)),
+Box(Box(7126)),
+Box(Box(7127)),
+Box(Box(7128)),
+Box(Box(7129)),
+Box(Box(7130)),
+Box(Box(7131)),
+Box(Box(7132)),
+Box(Box(7133)),
+Box(Box(7134)),
+Box(Box(7135)),
+Box(Box(7136)),
+Box(Box(7137)),
+Box(Box(7138)),
+Box(Box(7139)),
+Box(Box(7140)),
+Box(Box(7141)),
+Box(Box(7142)),
+Box(Box(7143)),
+Box(Box(7144)),
+Box(Box(7145)),
+Box(Box(7146)),
+Box(Box(7147)),
+Box(Box(7148)),
+Box(Box(7149)),
+Box(Box(7150)),
+Box(Box(7151)),
+Box(Box(7152)),
+Box(Box(7153)),
+Box(Box(7154)),
+Box(Box(7155)),
+Box(Box(7156)),
+Box(Box(7157)),
+Box(Box(7158)),
+Box(Box(7159)),
+Box(Box(7160)),
+Box(Box(7161)),
+Box(Box(7162)),
+Box(Box(7163)),
+Box(Box(7164)),
+Box(Box(7165)),
+Box(Box(7166)),
+Box(Box(7167)),
+Box(Box(7168)),
+Box(Box(7169)),
+Box(Box(7170)),
+Box(Box(7171)),
+Box(Box(7172)),
+Box(Box(7173)),
+Box(Box(7174)),
+Box(Box(7175)),
+Box(Box(7176)),
+Box(Box(7177)),
+Box(Box(7178)),
+Box(Box(7179)),
+Box(Box(7180)),
+Box(Box(7181)),
+Box(Box(7182)),
+Box(Box(7183)),
+Box(Box(7184)),
+Box(Box(7185)),
+Box(Box(7186)),
+Box(Box(7187)),
+Box(Box(7188)),
+Box(Box(7189)),
+Box(Box(7190)),
+Box(Box(7191)),
+Box(Box(7192)),
+Box(Box(7193)),
+Box(Box(7194)),
+Box(Box(7195)),
+Box(Box(7196)),
+Box(Box(7197)),
+Box(Box(7198)),
+Box(Box(7199)),
+Box(Box(7200)),
+Box(Box(7201)),
+Box(Box(7202)),
+Box(Box(7203)),
+Box(Box(7204)),
+Box(Box(7205)),
+Box(Box(7206)),
+Box(Box(7207)),
+Box(Box(7208)),
+Box(Box(7209)),
+Box(Box(7210)),
+Box(Box(7211)),
+Box(Box(7212)),
+Box(Box(7213)),
+Box(Box(7214)),
+Box(Box(7215)),
+Box(Box(7216)),
+Box(Box(7217)),
+Box(Box(7218)),
+Box(Box(7219)),
+Box(Box(7220)),
+Box(Box(7221)),
+Box(Box(7222)),
+Box(Box(7223)),
+Box(Box(7224)),
+Box(Box(7225)),
+Box(Box(7226)),
+Box(Box(7227)),
+Box(Box(7228)),
+Box(Box(7229)),
+Box(Box(7230)),
+Box(Box(7231)),
+Box(Box(7232)),
+Box(Box(7233)),
+Box(Box(7234)),
+Box(Box(7235)),
+Box(Box(7236)),
+Box(Box(7237)),
+Box(Box(7238)),
+Box(Box(7239)),
+Box(Box(7240)),
+Box(Box(7241)),
+Box(Box(7242)),
+Box(Box(7243)),
+Box(Box(7244)),
+Box(Box(7245)),
+Box(Box(7246)),
+Box(Box(7247)),
+Box(Box(7248)),
+Box(Box(7249)),
+Box(Box(7250)),
+Box(Box(7251)),
+Box(Box(7252)),
+Box(Box(7253)),
+Box(Box(7254)),
+Box(Box(7255)),
+Box(Box(7256)),
+Box(Box(7257)),
+Box(Box(7258)),
+Box(Box(7259)),
+Box(Box(7260)),
+Box(Box(7261)),
+Box(Box(7262)),
+Box(Box(7263)),
+Box(Box(7264)),
+Box(Box(7265)),
+Box(Box(7266)),
+Box(Box(7267)),
+Box(Box(7268)),
+Box(Box(7269)),
+Box(Box(7270)),
+Box(Box(7271)),
+Box(Box(7272)),
+Box(Box(7273)),
+Box(Box(7274)),
+Box(Box(7275)),
+Box(Box(7276)),
+Box(Box(7277)),
+Box(Box(7278)),
+Box(Box(7279)),
+Box(Box(7280)),
+Box(Box(7281)),
+Box(Box(7282)),
+Box(Box(7283)),
+Box(Box(7284)),
+Box(Box(7285)),
+Box(Box(7286)),
+Box(Box(7287)),
+Box(Box(7288)),
+Box(Box(7289)),
+Box(Box(7290)),
+Box(Box(7291)),
+Box(Box(7292)),
+Box(Box(7293)),
+Box(Box(7294)),
+Box(Box(7295)),
+Box(Box(7296)),
+Box(Box(7297)),
+Box(Box(7298)),
+Box(Box(7299)),
+Box(Box(7300)),
+Box(Box(7301)),
+Box(Box(7302)),
+Box(Box(7303)),
+Box(Box(7304)),
+Box(Box(7305)),
+Box(Box(7306)),
+Box(Box(7307)),
+Box(Box(7308)),
+Box(Box(7309)),
+Box(Box(7310)),
+Box(Box(7311)),
+Box(Box(7312)),
+Box(Box(7313)),
+Box(Box(7314)),
+Box(Box(7315)),
+Box(Box(7316)),
+Box(Box(7317)),
+Box(Box(7318)),
+Box(Box(7319)),
+Box(Box(7320)),
+Box(Box(7321)),
+Box(Box(7322)),
+Box(Box(7323)),
+Box(Box(7324)),
+Box(Box(7325)),
+Box(Box(7326)),
+Box(Box(7327)),
+Box(Box(7328)),
+Box(Box(7329)),
+Box(Box(7330)),
+Box(Box(7331)),
+Box(Box(7332)),
+Box(Box(7333)),
+Box(Box(7334)),
+Box(Box(7335)),
+Box(Box(7336)),
+Box(Box(7337)),
+Box(Box(7338)),
+Box(Box(7339)),
+Box(Box(7340)),
+Box(Box(7341)),
+Box(Box(7342)),
+Box(Box(7343)),
+Box(Box(7344)),
+Box(Box(7345)),
+Box(Box(7346)),
+Box(Box(7347)),
+Box(Box(7348)),
+Box(Box(7349)),
+Box(Box(7350)),
+Box(Box(7351)),
+Box(Box(7352)),
+Box(Box(7353)),
+Box(Box(7354)),
+Box(Box(7355)),
+Box(Box(7356)),
+Box(Box(7357)),
+Box(Box(7358)),
+Box(Box(7359)),
+Box(Box(7360)),
+Box(Box(7361)),
+Box(Box(7362)),
+Box(Box(7363)),
+Box(Box(7364)),
+Box(Box(7365)),
+Box(Box(7366)),
+Box(Box(7367)),
+Box(Box(7368)),
+Box(Box(7369)),
+Box(Box(7370)),
+Box(Box(7371)),
+Box(Box(7372)),
+Box(Box(7373)),
+Box(Box(7374)),
+Box(Box(7375)),
+Box(Box(7376)),
+Box(Box(7377)),
+Box(Box(7378)),
+Box(Box(7379)),
+Box(Box(7380)),
+Box(Box(7381)),
+Box(Box(7382)),
+Box(Box(7383)),
+Box(Box(7384)),
+Box(Box(7385)),
+Box(Box(7386)),
+Box(Box(7387)),
+Box(Box(7388)),
+Box(Box(7389)),
+Box(Box(7390)),
+Box(Box(7391)),
+Box(Box(7392)),
+Box(Box(7393)),
+Box(Box(7394)),
+Box(Box(7395)),
+Box(Box(7396)),
+Box(Box(7397)),
+Box(Box(7398)),
+Box(Box(7399)),
+Box(Box(7400)),
+Box(Box(7401)),
+Box(Box(7402)),
+Box(Box(7403)),
+Box(Box(7404)),
+Box(Box(7405)),
+Box(Box(7406)),
+Box(Box(7407)),
+Box(Box(7408)),
+Box(Box(7409)),
+Box(Box(7410)),
+Box(Box(7411)),
+Box(Box(7412)),
+Box(Box(7413)),
+Box(Box(7414)),
+Box(Box(7415)),
+Box(Box(7416)),
+Box(Box(7417)),
+Box(Box(7418)),
+Box(Box(7419)),
+Box(Box(7420)),
+Box(Box(7421)),
+Box(Box(7422)),
+Box(Box(7423)),
+Box(Box(7424)),
+Box(Box(7425)),
+Box(Box(7426)),
+Box(Box(7427)),
+Box(Box(7428)),
+Box(Box(7429)),
+Box(Box(7430)),
+Box(Box(7431)),
+Box(Box(7432)),
+Box(Box(7433)),
+Box(Box(7434)),
+Box(Box(7435)),
+Box(Box(7436)),
+Box(Box(7437)),
+Box(Box(7438)),
+Box(Box(7439)),
+Box(Box(7440)),
+Box(Box(7441)),
+Box(Box(7442)),
+Box(Box(7443)),
+Box(Box(7444)),
+Box(Box(7445)),
+Box(Box(7446)),
+Box(Box(7447)),
+Box(Box(7448)),
+Box(Box(7449)),
+Box(Box(7450)),
+Box(Box(7451)),
+Box(Box(7452)),
+Box(Box(7453)),
+Box(Box(7454)),
+Box(Box(7455)),
+Box(Box(7456)),
+Box(Box(7457)),
+Box(Box(7458)),
+Box(Box(7459)),
+Box(Box(7460)),
+Box(Box(7461)),
+Box(Box(7462)),
+Box(Box(7463)),
+Box(Box(7464)),
+Box(Box(7465)),
+Box(Box(7466)),
+Box(Box(7467)),
+Box(Box(7468)),
+Box(Box(7469)),
+Box(Box(7470)),
+Box(Box(7471)),
+Box(Box(7472)),
+Box(Box(7473)),
+Box(Box(7474)),
+Box(Box(7475)),
+Box(Box(7476)),
+Box(Box(7477)),
+Box(Box(7478)),
+Box(Box(7479)),
+Box(Box(7480)),
+Box(Box(7481)),
+Box(Box(7482)),
+Box(Box(7483)),
+Box(Box(7484)),
+Box(Box(7485)),
+Box(Box(7486)),
+Box(Box(7487)),
+Box(Box(7488)),
+Box(Box(7489)),
+Box(Box(7490)),
+Box(Box(7491)),
+Box(Box(7492)),
+Box(Box(7493)),
+Box(Box(7494)),
+Box(Box(7495)),
+Box(Box(7496)),
+Box(Box(7497)),
+Box(Box(7498)),
+Box(Box(7499)),
+Box(Box(7500)),
+Box(Box(7501)),
+Box(Box(7502)),
+Box(Box(7503)),
+Box(Box(7504)),
+Box(Box(7505)),
+Box(Box(7506)),
+Box(Box(7507)),
+Box(Box(7508)),
+Box(Box(7509)),
+Box(Box(7510)),
+Box(Box(7511)),
+Box(Box(7512)),
+Box(Box(7513)),
+Box(Box(7514)),
+Box(Box(7515)),
+Box(Box(7516)),
+Box(Box(7517)),
+Box(Box(7518)),
+Box(Box(7519)),
+Box(Box(7520)),
+Box(Box(7521)),
+Box(Box(7522)),
+Box(Box(7523)),
+Box(Box(7524)),
+Box(Box(7525)),
+Box(Box(7526)),
+Box(Box(7527)),
+Box(Box(7528)),
+Box(Box(7529)),
+Box(Box(7530)),
+Box(Box(7531)),
+Box(Box(7532)),
+Box(Box(7533)),
+Box(Box(7534)),
+Box(Box(7535)),
+Box(Box(7536)),
+Box(Box(7537)),
+Box(Box(7538)),
+Box(Box(7539)),
+Box(Box(7540)),
+Box(Box(7541)),
+Box(Box(7542)),
+Box(Box(7543)),
+Box(Box(7544)),
+Box(Box(7545)),
+Box(Box(7546)),
+Box(Box(7547)),
+Box(Box(7548)),
+Box(Box(7549)),
+Box(Box(7550)),
+Box(Box(7551)),
+Box(Box(7552)),
+Box(Box(7553)),
+Box(Box(7554)),
+Box(Box(7555)),
+Box(Box(7556)),
+Box(Box(7557)),
+Box(Box(7558)),
+Box(Box(7559)),
+Box(Box(7560)),
+Box(Box(7561)),
+Box(Box(7562)),
+Box(Box(7563)),
+Box(Box(7564)),
+Box(Box(7565)),
+Box(Box(7566)),
+Box(Box(7567)),
+Box(Box(7568)),
+Box(Box(7569)),
+Box(Box(7570)),
+Box(Box(7571)),
+Box(Box(7572)),
+Box(Box(7573)),
+Box(Box(7574)),
+Box(Box(7575)),
+Box(Box(7576)),
+Box(Box(7577)),
+Box(Box(7578)),
+Box(Box(7579)),
+Box(Box(7580)),
+Box(Box(7581)),
+Box(Box(7582)),
+Box(Box(7583)),
+Box(Box(7584)),
+Box(Box(7585)),
+Box(Box(7586)),
+Box(Box(7587)),
+Box(Box(7588)),
+Box(Box(7589)),
+Box(Box(7590)),
+Box(Box(7591)),
+Box(Box(7592)),
+Box(Box(7593)),
+Box(Box(7594)),
+Box(Box(7595)),
+Box(Box(7596)),
+Box(Box(7597)),
+Box(Box(7598)),
+Box(Box(7599)),
+Box(Box(7600)),
+Box(Box(7601)),
+Box(Box(7602)),
+Box(Box(7603)),
+Box(Box(7604)),
+Box(Box(7605)),
+Box(Box(7606)),
+Box(Box(7607)),
+Box(Box(7608)),
+Box(Box(7609)),
+Box(Box(7610)),
+Box(Box(7611)),
+Box(Box(7612)),
+Box(Box(7613)),
+Box(Box(7614)),
+Box(Box(7615)),
+Box(Box(7616)),
+Box(Box(7617)),
+Box(Box(7618)),
+Box(Box(7619)),
+Box(Box(7620)),
+Box(Box(7621)),
+Box(Box(7622)),
+Box(Box(7623)),
+Box(Box(7624)),
+Box(Box(7625)),
+Box(Box(7626)),
+Box(Box(7627)),
+Box(Box(7628)),
+Box(Box(7629)),
+Box(Box(7630)),
+Box(Box(7631)),
+Box(Box(7632)),
+Box(Box(7633)),
+Box(Box(7634)),
+Box(Box(7635)),
+Box(Box(7636)),
+Box(Box(7637)),
+Box(Box(7638)),
+Box(Box(7639)),
+Box(Box(7640)),
+Box(Box(7641)),
+Box(Box(7642)),
+Box(Box(7643)),
+Box(Box(7644)),
+Box(Box(7645)),
+Box(Box(7646)),
+Box(Box(7647)),
+Box(Box(7648)),
+Box(Box(7649)),
+Box(Box(7650)),
+Box(Box(7651)),
+Box(Box(7652)),
+Box(Box(7653)),
+Box(Box(7654)),
+Box(Box(7655)),
+Box(Box(7656)),
+Box(Box(7657)),
+Box(Box(7658)),
+Box(Box(7659)),
+Box(Box(7660)),
+Box(Box(7661)),
+Box(Box(7662)),
+Box(Box(7663)),
+Box(Box(7664)),
+Box(Box(7665)),
+Box(Box(7666)),
+Box(Box(7667)),
+Box(Box(7668)),
+Box(Box(7669)),
+Box(Box(7670)),
+Box(Box(7671)),
+Box(Box(7672)),
+Box(Box(7673)),
+Box(Box(7674)),
+Box(Box(7675)),
+Box(Box(7676)),
+Box(Box(7677)),
+Box(Box(7678)),
+Box(Box(7679)),
+Box(Box(7680)),
+Box(Box(7681)),
+Box(Box(7682)),
+Box(Box(7683)),
+Box(Box(7684)),
+Box(Box(7685)),
+Box(Box(7686)),
+Box(Box(7687)),
+Box(Box(7688)),
+Box(Box(7689)),
+Box(Box(7690)),
+Box(Box(7691)),
+Box(Box(7692)),
+Box(Box(7693)),
+Box(Box(7694)),
+Box(Box(7695)),
+Box(Box(7696)),
+Box(Box(7697)),
+Box(Box(7698)),
+Box(Box(7699)),
+Box(Box(7700)),
+Box(Box(7701)),
+Box(Box(7702)),
+Box(Box(7703)),
+Box(Box(7704)),
+Box(Box(7705)),
+Box(Box(7706)),
+Box(Box(7707)),
+Box(Box(7708)),
+Box(Box(7709)),
+Box(Box(7710)),
+Box(Box(7711)),
+Box(Box(7712)),
+Box(Box(7713)),
+Box(Box(7714)),
+Box(Box(7715)),
+Box(Box(7716)),
+Box(Box(7717)),
+Box(Box(7718)),
+Box(Box(7719)),
+Box(Box(7720)),
+Box(Box(7721)),
+Box(Box(7722)),
+Box(Box(7723)),
+Box(Box(7724)),
+Box(Box(7725)),
+Box(Box(7726)),
+Box(Box(7727)),
+Box(Box(7728)),
+Box(Box(7729)),
+Box(Box(7730)),
+Box(Box(7731)),
+Box(Box(7732)),
+Box(Box(7733)),
+Box(Box(7734)),
+Box(Box(7735)),
+Box(Box(7736)),
+Box(Box(7737)),
+Box(Box(7738)),
+Box(Box(7739)),
+Box(Box(7740)),
+Box(Box(7741)),
+Box(Box(7742)),
+Box(Box(7743)),
+Box(Box(7744)),
+Box(Box(7745)),
+Box(Box(7746)),
+Box(Box(7747)),
+Box(Box(7748)),
+Box(Box(7749)),
+Box(Box(7750)),
+Box(Box(7751)),
+Box(Box(7752)),
+Box(Box(7753)),
+Box(Box(7754)),
+Box(Box(7755)),
+Box(Box(7756)),
+Box(Box(7757)),
+Box(Box(7758)),
+Box(Box(7759)),
+Box(Box(7760)),
+Box(Box(7761)),
+Box(Box(7762)),
+Box(Box(7763)),
+Box(Box(7764)),
+Box(Box(7765)),
+Box(Box(7766)),
+Box(Box(7767)),
+Box(Box(7768)),
+Box(Box(7769)),
+Box(Box(7770)),
+Box(Box(7771)),
+Box(Box(7772)),
+Box(Box(7773)),
+Box(Box(7774)),
+Box(Box(7775)),
+Box(Box(7776)),
+Box(Box(7777)),
+Box(Box(7778)),
+Box(Box(7779)),
+Box(Box(7780)),
+Box(Box(7781)),
+Box(Box(7782)),
+Box(Box(7783)),
+Box(Box(7784)),
+Box(Box(7785)),
+Box(Box(7786)),
+Box(Box(7787)),
+Box(Box(7788)),
+Box(Box(7789)),
+Box(Box(7790)),
+Box(Box(7791)),
+Box(Box(7792)),
+Box(Box(7793)),
+Box(Box(7794)),
+Box(Box(7795)),
+Box(Box(7796)),
+Box(Box(7797)),
+Box(Box(7798)),
+Box(Box(7799)),
+Box(Box(7800)),
+Box(Box(7801)),
+Box(Box(7802)),
+Box(Box(7803)),
+Box(Box(7804)),
+Box(Box(7805)),
+Box(Box(7806)),
+Box(Box(7807)),
+Box(Box(7808)),
+Box(Box(7809)),
+Box(Box(7810)),
+Box(Box(7811)),
+Box(Box(7812)),
+Box(Box(7813)),
+Box(Box(7814)),
+Box(Box(7815)),
+Box(Box(7816)),
+Box(Box(7817)),
+Box(Box(7818)),
+Box(Box(7819)),
+Box(Box(7820)),
+Box(Box(7821)),
+Box(Box(7822)),
+Box(Box(7823)),
+Box(Box(7824)),
+Box(Box(7825)),
+Box(Box(7826)),
+Box(Box(7827)),
+Box(Box(7828)),
+Box(Box(7829)),
+Box(Box(7830)),
+Box(Box(7831)),
+Box(Box(7832)),
+Box(Box(7833)),
+Box(Box(7834)),
+Box(Box(7835)),
+Box(Box(7836)),
+Box(Box(7837)),
+Box(Box(7838)),
+Box(Box(7839)),
+Box(Box(7840)),
+Box(Box(7841)),
+Box(Box(7842)),
+Box(Box(7843)),
+Box(Box(7844)),
+Box(Box(7845)),
+Box(Box(7846)),
+Box(Box(7847)),
+Box(Box(7848)),
+Box(Box(7849)),
+Box(Box(7850)),
+Box(Box(7851)),
+Box(Box(7852)),
+Box(Box(7853)),
+Box(Box(7854)),
+Box(Box(7855)),
+Box(Box(7856)),
+Box(Box(7857)),
+Box(Box(7858)),
+Box(Box(7859)),
+Box(Box(7860)),
+Box(Box(7861)),
+Box(Box(7862)),
+Box(Box(7863)),
+Box(Box(7864)),
+Box(Box(7865)),
+Box(Box(7866)),
+Box(Box(7867)),
+Box(Box(7868)),
+Box(Box(7869)),
+Box(Box(7870)),
+Box(Box(7871)),
+Box(Box(7872)),
+Box(Box(7873)),
+Box(Box(7874)),
+Box(Box(7875)),
+Box(Box(7876)),
+Box(Box(7877)),
+Box(Box(7878)),
+Box(Box(7879)),
+Box(Box(7880)),
+Box(Box(7881)),
+Box(Box(7882)),
+Box(Box(7883)),
+Box(Box(7884)),
+Box(Box(7885)),
+Box(Box(7886)),
+Box(Box(7887)),
+Box(Box(7888)),
+Box(Box(7889)),
+Box(Box(7890)),
+Box(Box(7891)),
+Box(Box(7892)),
+Box(Box(7893)),
+Box(Box(7894)),
+Box(Box(7895)),
+Box(Box(7896)),
+Box(Box(7897)),
+Box(Box(7898)),
+Box(Box(7899)),
+Box(Box(7900)),
+Box(Box(7901)),
+Box(Box(7902)),
+Box(Box(7903)),
+Box(Box(7904)),
+Box(Box(7905)),
+Box(Box(7906)),
+Box(Box(7907)),
+Box(Box(7908)),
+Box(Box(7909)),
+Box(Box(7910)),
+Box(Box(7911)),
+Box(Box(7912)),
+Box(Box(7913)),
+Box(Box(7914)),
+Box(Box(7915)),
+Box(Box(7916)),
+Box(Box(7917)),
+Box(Box(7918)),
+Box(Box(7919)),
+Box(Box(7920)),
+Box(Box(7921)),
+Box(Box(7922)),
+Box(Box(7923)),
+Box(Box(7924)),
+Box(Box(7925)),
+Box(Box(7926)),
+Box(Box(7927)),
+Box(Box(7928)),
+Box(Box(7929)),
+Box(Box(7930)),
+Box(Box(7931)),
+Box(Box(7932)),
+Box(Box(7933)),
+Box(Box(7934)),
+Box(Box(7935)),
+Box(Box(7936)),
+Box(Box(7937)),
+Box(Box(7938)),
+Box(Box(7939)),
+Box(Box(7940)),
+Box(Box(7941)),
+Box(Box(7942)),
+Box(Box(7943)),
+Box(Box(7944)),
+Box(Box(7945)),
+Box(Box(7946)),
+Box(Box(7947)),
+Box(Box(7948)),
+Box(Box(7949)),
+Box(Box(7950)),
+Box(Box(7951)),
+Box(Box(7952)),
+Box(Box(7953)),
+Box(Box(7954)),
+Box(Box(7955)),
+Box(Box(7956)),
+Box(Box(7957)),
+Box(Box(7958)),
+Box(Box(7959)),
+Box(Box(7960)),
+Box(Box(7961)),
+Box(Box(7962)),
+Box(Box(7963)),
+Box(Box(7964)),
+Box(Box(7965)),
+Box(Box(7966)),
+Box(Box(7967)),
+Box(Box(7968)),
+Box(Box(7969)),
+Box(Box(7970)),
+Box(Box(7971)),
+Box(Box(7972)),
+Box(Box(7973)),
+Box(Box(7974)),
+Box(Box(7975)),
+Box(Box(7976)),
+Box(Box(7977)),
+Box(Box(7978)),
+Box(Box(7979)),
+Box(Box(7980)),
+Box(Box(7981)),
+Box(Box(7982)),
+Box(Box(7983)),
+Box(Box(7984)),
+Box(Box(7985)),
+Box(Box(7986)),
+Box(Box(7987)),
+Box(Box(7988)),
+Box(Box(7989)),
+Box(Box(7990)),
+Box(Box(7991)),
+Box(Box(7992)),
+Box(Box(7993)),
+Box(Box(7994)),
+Box(Box(7995)),
+Box(Box(7996)),
+Box(Box(7997)),
+Box(Box(7998)),
+Box(Box(7999)),
+Box(Box(8000)),
+Box(Box(8001)),
+Box(Box(8002)),
+Box(Box(8003)),
+Box(Box(8004)),
+Box(Box(8005)),
+Box(Box(8006)),
+Box(Box(8007)),
+Box(Box(8008)),
+Box(Box(8009)),
+Box(Box(8010)),
+Box(Box(8011)),
+Box(Box(8012)),
+Box(Box(8013)),
+Box(Box(8014)),
+Box(Box(8015)),
+Box(Box(8016)),
+Box(Box(8017)),
+Box(Box(8018)),
+Box(Box(8019)),
+Box(Box(8020)),
+Box(Box(8021)),
+Box(Box(8022)),
+Box(Box(8023)),
+Box(Box(8024)),
+Box(Box(8025)),
+Box(Box(8026)),
+Box(Box(8027)),
+Box(Box(8028)),
+Box(Box(8029)),
+Box(Box(8030)),
+Box(Box(8031)),
+Box(Box(8032)),
+Box(Box(8033)),
+Box(Box(8034)),
+Box(Box(8035)),
+Box(Box(8036)),
+Box(Box(8037)),
+Box(Box(8038)),
+Box(Box(8039)),
+Box(Box(8040)),
+Box(Box(8041)),
+Box(Box(8042)),
+Box(Box(8043)),
+Box(Box(8044)),
+Box(Box(8045)),
+Box(Box(8046)),
+Box(Box(8047)),
+Box(Box(8048)),
+Box(Box(8049)),
+Box(Box(8050)),
+Box(Box(8051)),
+Box(Box(8052)),
+Box(Box(8053)),
+Box(Box(8054)),
+Box(Box(8055)),
+Box(Box(8056)),
+Box(Box(8057)),
+Box(Box(8058)),
+Box(Box(8059)),
+Box(Box(8060)),
+Box(Box(8061)),
+Box(Box(8062)),
+Box(Box(8063)),
+Box(Box(8064)),
+Box(Box(8065)),
+Box(Box(8066)),
+Box(Box(8067)),
+Box(Box(8068)),
+Box(Box(8069)),
+Box(Box(8070)),
+Box(Box(8071)),
+Box(Box(8072)),
+Box(Box(8073)),
+Box(Box(8074)),
+Box(Box(8075)),
+Box(Box(8076)),
+Box(Box(8077)),
+Box(Box(8078)),
+Box(Box(8079)),
+Box(Box(8080)),
+Box(Box(8081)),
+Box(Box(8082)),
+Box(Box(8083)),
+Box(Box(8084)),
+Box(Box(8085)),
+Box(Box(8086)),
+Box(Box(8087)),
+Box(Box(8088)),
+Box(Box(8089)),
+Box(Box(8090)),
+Box(Box(8091)),
+Box(Box(8092)),
+Box(Box(8093)),
+Box(Box(8094)),
+Box(Box(8095)),
+Box(Box(8096)),
+Box(Box(8097)),
+Box(Box(8098)),
+Box(Box(8099)),
+Box(Box(8100)),
+Box(Box(8101)),
+Box(Box(8102)),
+Box(Box(8103)),
+Box(Box(8104)),
+Box(Box(8105)),
+Box(Box(8106)),
+Box(Box(8107)),
+Box(Box(8108)),
+Box(Box(8109)),
+Box(Box(8110)),
+Box(Box(8111)),
+Box(Box(8112)),
+Box(Box(8113)),
+Box(Box(8114)),
+Box(Box(8115)),
+Box(Box(8116)),
+Box(Box(8117)),
+Box(Box(8118)),
+Box(Box(8119)),
+Box(Box(8120)),
+Box(Box(8121)),
+Box(Box(8122)),
+Box(Box(8123)),
+Box(Box(8124)),
+Box(Box(8125)),
+Box(Box(8126)),
+Box(Box(8127)),
+Box(Box(8128)),
+Box(Box(8129)),
+Box(Box(8130)),
+Box(Box(8131)),
+Box(Box(8132)),
+Box(Box(8133)),
+Box(Box(8134)),
+Box(Box(8135)),
+Box(Box(8136)),
+Box(Box(8137)),
+Box(Box(8138)),
+Box(Box(8139)),
+Box(Box(8140)),
+Box(Box(8141)),
+Box(Box(8142)),
+Box(Box(8143)),
+Box(Box(8144)),
+Box(Box(8145)),
+Box(Box(8146)),
+Box(Box(8147)),
+Box(Box(8148)),
+Box(Box(8149)),
+Box(Box(8150)),
+Box(Box(8151)),
+Box(Box(8152)),
+Box(Box(8153)),
+Box(Box(8154)),
+Box(Box(8155)),
+Box(Box(8156)),
+Box(Box(8157)),
+Box(Box(8158)),
+Box(Box(8159)),
+Box(Box(8160)),
+Box(Box(8161)),
+Box(Box(8162)),
+Box(Box(8163)),
+Box(Box(8164)),
+Box(Box(8165)),
+Box(Box(8166)),
+Box(Box(8167)),
+Box(Box(8168)),
+Box(Box(8169)),
+Box(Box(8170)),
+Box(Box(8171)),
+Box(Box(8172)),
+Box(Box(8173)),
+Box(Box(8174)),
+Box(Box(8175)),
+Box(Box(8176)),
+Box(Box(8177)),
+Box(Box(8178)),
+Box(Box(8179)),
+Box(Box(8180)),
+Box(Box(8181)),
+Box(Box(8182)),
+Box(Box(8183)),
+Box(Box(8184)),
+Box(Box(8185)),
+Box(Box(8186)),
+Box(Box(8187)),
+Box(Box(8188)),
+Box(Box(8189)),
+Box(Box(8190)),
+Box(Box(8191)),
+Box(Box(8192)),
+Box(Box(8193)),
+Box(Box(8194)),
+Box(Box(8195)),
+Box(Box(8196)),
+Box(Box(8197)),
+Box(Box(8198)),
+Box(Box(8199)),
+Box(Box(8200)),
+Box(Box(8201)),
+Box(Box(8202)),
+Box(Box(8203)),
+Box(Box(8204)),
+Box(Box(8205)),
+Box(Box(8206)),
+Box(Box(8207)),
+Box(Box(8208)),
+Box(Box(8209)),
+Box(Box(8210)),
+Box(Box(8211)),
+Box(Box(8212)),
+Box(Box(8213)),
+Box(Box(8214)),
+Box(Box(8215)),
+Box(Box(8216)),
+Box(Box(8217)),
+Box(Box(8218)),
+Box(Box(8219)),
+Box(Box(8220)),
+Box(Box(8221)),
+Box(Box(8222)),
+Box(Box(8223)),
+Box(Box(8224)),
+Box(Box(8225)),
+Box(Box(8226)),
+Box(Box(8227)),
+Box(Box(8228)),
+Box(Box(8229)),
+Box(Box(8230)),
+Box(Box(8231)),
+Box(Box(8232)),
+Box(Box(8233)),
+Box(Box(8234)),
+Box(Box(8235)),
+Box(Box(8236)),
+Box(Box(8237)),
+Box(Box(8238)),
+Box(Box(8239)),
+Box(Box(8240)),
+Box(Box(8241)),
+Box(Box(8242)),
+Box(Box(8243)),
+Box(Box(8244)),
+Box(Box(8245)),
+Box(Box(8246)),
+Box(Box(8247)),
+Box(Box(8248)),
+Box(Box(8249)),
+Box(Box(8250)),
+Box(Box(8251)),
+Box(Box(8252)),
+Box(Box(8253)),
+Box(Box(8254)),
+Box(Box(8255)),
+Box(Box(8256)),
+Box(Box(8257)),
+Box(Box(8258)),
+Box(Box(8259)),
+Box(Box(8260)),
+Box(Box(8261)),
+Box(Box(8262)),
+Box(Box(8263)),
+Box(Box(8264)),
+Box(Box(8265)),
+Box(Box(8266)),
+Box(Box(8267)),
+Box(Box(8268)),
+Box(Box(8269)),
+Box(Box(8270)),
+Box(Box(8271)),
+Box(Box(8272)),
+Box(Box(8273)),
+Box(Box(8274)),
+Box(Box(8275)),
+Box(Box(8276)),
+Box(Box(8277)),
+Box(Box(8278)),
+Box(Box(8279)),
+Box(Box(8280)),
+Box(Box(8281)),
+Box(Box(8282)),
+Box(Box(8283)),
+Box(Box(8284)),
+Box(Box(8285)),
+Box(Box(8286)),
+Box(Box(8287)),
+Box(Box(8288)),
+Box(Box(8289)),
+Box(Box(8290)),
+Box(Box(8291)),
+Box(Box(8292)),
+Box(Box(8293)),
+Box(Box(8294)),
+Box(Box(8295)),
+Box(Box(8296)),
+Box(Box(8297)),
+Box(Box(8298)),
+Box(Box(8299)),
+Box(Box(8300)),
+Box(Box(8301)),
+Box(Box(8302)),
+Box(Box(8303)),
+Box(Box(8304)),
+Box(Box(8305)),
+Box(Box(8306)),
+Box(Box(8307)),
+Box(Box(8308)),
+Box(Box(8309)),
+Box(Box(8310)),
+Box(Box(8311)),
+Box(Box(8312)),
+Box(Box(8313)),
+Box(Box(8314)),
+Box(Box(8315)),
+Box(Box(8316)),
+Box(Box(8317)),
+Box(Box(8318)),
+Box(Box(8319)),
+Box(Box(8320)),
+Box(Box(8321)),
+Box(Box(8322)),
+Box(Box(8323)),
+Box(Box(8324)),
+Box(Box(8325)),
+Box(Box(8326)),
+Box(Box(8327)),
+Box(Box(8328)),
+Box(Box(8329)),
+Box(Box(8330)),
+Box(Box(8331)),
+Box(Box(8332)),
+Box(Box(8333)),
+Box(Box(8334)),
+Box(Box(8335)),
+Box(Box(8336)),
+Box(Box(8337)),
+Box(Box(8338)),
+Box(Box(8339)),
+Box(Box(8340)),
+Box(Box(8341)),
+Box(Box(8342)),
+Box(Box(8343)),
+Box(Box(8344)),
+Box(Box(8345)),
+Box(Box(8346)),
+Box(Box(8347)),
+Box(Box(8348)),
+Box(Box(8349)),
+Box(Box(8350)),
+Box(Box(8351)),
+Box(Box(8352)),
+Box(Box(8353)),
+Box(Box(8354)),
+Box(Box(8355)),
+Box(Box(8356)),
+Box(Box(8357)),
+Box(Box(8358)),
+Box(Box(8359)),
+Box(Box(8360)),
+Box(Box(8361)),
+Box(Box(8362)),
+Box(Box(8363)),
+Box(Box(8364)),
+Box(Box(8365)),
+Box(Box(8366)),
+Box(Box(8367)),
+Box(Box(8368)),
+Box(Box(8369)),
+Box(Box(8370)),
+Box(Box(8371)),
+Box(Box(8372)),
+Box(Box(8373)),
+Box(Box(8374)),
+Box(Box(8375)),
+Box(Box(8376)),
+Box(Box(8377)),
+Box(Box(8378)),
+Box(Box(8379)),
+Box(Box(8380)),
+Box(Box(8381)),
+Box(Box(8382)),
+Box(Box(8383)),
+Box(Box(8384)),
+Box(Box(8385)),
+Box(Box(8386)),
+Box(Box(8387)),
+Box(Box(8388)),
+Box(Box(8389)),
+Box(Box(8390)),
+Box(Box(8391)),
+Box(Box(8392)),
+Box(Box(8393)),
+Box(Box(8394)),
+Box(Box(8395)),
+Box(Box(8396)),
+Box(Box(8397)),
+Box(Box(8398)),
+Box(Box(8399)),
+Box(Box(8400)),
+Box(Box(8401)),
+Box(Box(8402)),
+Box(Box(8403)),
+Box(Box(8404)),
+Box(Box(8405)),
+Box(Box(8406)),
+Box(Box(8407)),
+Box(Box(8408)),
+Box(Box(8409)),
+Box(Box(8410)),
+Box(Box(8411)),
+Box(Box(8412)),
+Box(Box(8413)),
+Box(Box(8414)),
+Box(Box(8415)),
+Box(Box(8416)),
+Box(Box(8417)),
+Box(Box(8418)),
+Box(Box(8419)),
+Box(Box(8420)),
+Box(Box(8421)),
+Box(Box(8422)),
+Box(Box(8423)),
+Box(Box(8424)),
+Box(Box(8425)),
+Box(Box(8426)),
+Box(Box(8427)),
+Box(Box(8428)),
+Box(Box(8429)),
+Box(Box(8430)),
+Box(Box(8431)),
+Box(Box(8432)),
+Box(Box(8433)),
+Box(Box(8434)),
+Box(Box(8435)),
+Box(Box(8436)),
+Box(Box(8437)),
+Box(Box(8438)),
+Box(Box(8439)),
+Box(Box(8440)),
+Box(Box(8441)),
+Box(Box(8442)),
+Box(Box(8443)),
+Box(Box(8444)),
+Box(Box(8445)),
+Box(Box(8446)),
+Box(Box(8447)),
+Box(Box(8448)),
+Box(Box(8449)),
+Box(Box(8450)),
+Box(Box(8451)),
+Box(Box(8452)),
+Box(Box(8453)),
+Box(Box(8454)),
+Box(Box(8455)),
+Box(Box(8456)),
+Box(Box(8457)),
+Box(Box(8458)),
+Box(Box(8459)),
+Box(Box(8460)),
+Box(Box(8461)),
+Box(Box(8462)),
+Box(Box(8463)),
+Box(Box(8464)),
+Box(Box(8465)),
+Box(Box(8466)),
+Box(Box(8467)),
+Box(Box(8468)),
+Box(Box(8469)),
+Box(Box(8470)),
+Box(Box(8471)),
+Box(Box(8472)),
+Box(Box(8473)),
+Box(Box(8474)),
+Box(Box(8475)),
+Box(Box(8476)),
+Box(Box(8477)),
+Box(Box(8478)),
+Box(Box(8479)),
+Box(Box(8480)),
+Box(Box(8481)),
+Box(Box(8482)),
+Box(Box(8483)),
+Box(Box(8484)),
+Box(Box(8485)),
+Box(Box(8486)),
+Box(Box(8487)),
+Box(Box(8488)),
+Box(Box(8489)),
+Box(Box(8490)),
+Box(Box(8491)),
+Box(Box(8492)),
+Box(Box(8493)),
+Box(Box(8494)),
+Box(Box(8495)),
+Box(Box(8496)),
+Box(Box(8497)),
+Box(Box(8498)),
+Box(Box(8499)),
+Box(Box(8500)),
+Box(Box(8501)),
+Box(Box(8502)),
+Box(Box(8503)),
+Box(Box(8504)),
+Box(Box(8505)),
+Box(Box(8506)),
+Box(Box(8507)),
+Box(Box(8508)),
+Box(Box(8509)),
+Box(Box(8510)),
+Box(Box(8511)),
+Box(Box(8512)),
+Box(Box(8513)),
+Box(Box(8514)),
+Box(Box(8515)),
+Box(Box(8516)),
+Box(Box(8517)),
+Box(Box(8518)),
+Box(Box(8519)),
+Box(Box(8520)),
+Box(Box(8521)),
+Box(Box(8522)),
+Box(Box(8523)),
+Box(Box(8524)),
+Box(Box(8525)),
+Box(Box(8526)),
+Box(Box(8527)),
+Box(Box(8528)),
+Box(Box(8529)),
+Box(Box(8530)),
+Box(Box(8531)),
+Box(Box(8532)),
+Box(Box(8533)),
+Box(Box(8534)),
+Box(Box(8535)),
+Box(Box(8536)),
+Box(Box(8537)),
+Box(Box(8538)),
+Box(Box(8539)),
+Box(Box(8540)),
+Box(Box(8541)),
+Box(Box(8542)),
+Box(Box(8543)),
+Box(Box(8544)),
+Box(Box(8545)),
+Box(Box(8546)),
+Box(Box(8547)),
+Box(Box(8548)),
+Box(Box(8549)),
+Box(Box(8550)),
+Box(Box(8551)),
+Box(Box(8552)),
+Box(Box(8553)),
+Box(Box(8554)),
+Box(Box(8555)),
+Box(Box(8556)),
+Box(Box(8557)),
+Box(Box(8558)),
+Box(Box(8559)),
+Box(Box(8560)),
+Box(Box(8561)),
+Box(Box(8562)),
+Box(Box(8563)),
+Box(Box(8564)),
+Box(Box(8565)),
+Box(Box(8566)),
+Box(Box(8567)),
+Box(Box(8568)),
+Box(Box(8569)),
+Box(Box(8570)),
+Box(Box(8571)),
+Box(Box(8572)),
+Box(Box(8573)),
+Box(Box(8574)),
+Box(Box(8575)),
+Box(Box(8576)),
+Box(Box(8577)),
+Box(Box(8578)),
+Box(Box(8579)),
+Box(Box(8580)),
+Box(Box(8581)),
+Box(Box(8582)),
+Box(Box(8583)),
+Box(Box(8584)),
+Box(Box(8585)),
+Box(Box(8586)),
+Box(Box(8587)),
+Box(Box(8588)),
+Box(Box(8589)),
+Box(Box(8590)),
+Box(Box(8591)),
+Box(Box(8592)),
+Box(Box(8593)),
+Box(Box(8594)),
+Box(Box(8595)),
+Box(Box(8596)),
+Box(Box(8597)),
+Box(Box(8598)),
+Box(Box(8599)),
+Box(Box(8600)),
+Box(Box(8601)),
+Box(Box(8602)),
+Box(Box(8603)),
+Box(Box(8604)),
+Box(Box(8605)),
+Box(Box(8606)),
+Box(Box(8607)),
+Box(Box(8608)),
+Box(Box(8609)),
+Box(Box(8610)),
+Box(Box(8611)),
+Box(Box(8612)),
+Box(Box(8613)),
+Box(Box(8614)),
+Box(Box(8615)),
+Box(Box(8616)),
+Box(Box(8617)),
+Box(Box(8618)),
+Box(Box(8619)),
+Box(Box(8620)),
+Box(Box(8621)),
+Box(Box(8622)),
+Box(Box(8623)),
+Box(Box(8624)),
+Box(Box(8625)),
+Box(Box(8626)),
+Box(Box(8627)),
+Box(Box(8628)),
+Box(Box(8629)),
+Box(Box(8630)),
+Box(Box(8631)),
+Box(Box(8632)),
+Box(Box(8633)),
+Box(Box(8634)),
+Box(Box(8635)),
+Box(Box(8636)),
+Box(Box(8637)),
+Box(Box(8638)),
+Box(Box(8639)),
+Box(Box(8640)),
+Box(Box(8641)),
+Box(Box(8642)),
+Box(Box(8643)),
+Box(Box(8644)),
+Box(Box(8645)),
+Box(Box(8646)),
+Box(Box(8647)),
+Box(Box(8648)),
+Box(Box(8649)),
+Box(Box(8650)),
+Box(Box(8651)),
+Box(Box(8652)),
+Box(Box(8653)),
+Box(Box(8654)),
+Box(Box(8655)),
+Box(Box(8656)),
+Box(Box(8657)),
+Box(Box(8658)),
+Box(Box(8659)),
+Box(Box(8660)),
+Box(Box(8661)),
+Box(Box(8662)),
+Box(Box(8663)),
+Box(Box(8664)),
+Box(Box(8665)),
+Box(Box(8666)),
+Box(Box(8667)),
+Box(Box(8668)),
+Box(Box(8669)),
+Box(Box(8670)),
+Box(Box(8671)),
+Box(Box(8672)),
+Box(Box(8673)),
+Box(Box(8674)),
+Box(Box(8675)),
+Box(Box(8676)),
+Box(Box(8677)),
+Box(Box(8678)),
+Box(Box(8679)),
+Box(Box(8680)),
+Box(Box(8681)),
+Box(Box(8682)),
+Box(Box(8683)),
+Box(Box(8684)),
+Box(Box(8685)),
+Box(Box(8686)),
+Box(Box(8687)),
+Box(Box(8688)),
+Box(Box(8689)),
+Box(Box(8690)),
+Box(Box(8691)),
+Box(Box(8692)),
+Box(Box(8693)),
+Box(Box(8694)),
+Box(Box(8695)),
+Box(Box(8696)),
+Box(Box(8697)),
+Box(Box(8698)),
+Box(Box(8699)),
+Box(Box(8700)),
+Box(Box(8701)),
+Box(Box(8702)),
+Box(Box(8703)),
+Box(Box(8704)),
+Box(Box(8705)),
+Box(Box(8706)),
+Box(Box(8707)),
+Box(Box(8708)),
+Box(Box(8709)),
+Box(Box(8710)),
+Box(Box(8711)),
+Box(Box(8712)),
+Box(Box(8713)),
+Box(Box(8714)),
+Box(Box(8715)),
+Box(Box(8716)),
+Box(Box(8717)),
+Box(Box(8718)),
+Box(Box(8719)),
+Box(Box(8720)),
+Box(Box(8721)),
+Box(Box(8722)),
+Box(Box(8723)),
+Box(Box(8724)),
+Box(Box(8725)),
+Box(Box(8726)),
+Box(Box(8727)),
+Box(Box(8728)),
+Box(Box(8729)),
+Box(Box(8730)),
+Box(Box(8731)),
+Box(Box(8732)),
+Box(Box(8733)),
+Box(Box(8734)),
+Box(Box(8735)),
+Box(Box(8736)),
+Box(Box(8737)),
+Box(Box(8738)),
+Box(Box(8739)),
+Box(Box(8740)),
+Box(Box(8741)),
+Box(Box(8742)),
+Box(Box(8743)),
+Box(Box(8744)),
+Box(Box(8745)),
+Box(Box(8746)),
+Box(Box(8747)),
+Box(Box(8748)),
+Box(Box(8749)),
+Box(Box(8750)),
+Box(Box(8751)),
+Box(Box(8752)),
+Box(Box(8753)),
+Box(Box(8754)),
+Box(Box(8755)),
+Box(Box(8756)),
+Box(Box(8757)),
+Box(Box(8758)),
+Box(Box(8759)),
+Box(Box(8760)),
+Box(Box(8761)),
+Box(Box(8762)),
+Box(Box(8763)),
+Box(Box(8764)),
+Box(Box(8765)),
+Box(Box(8766)),
+Box(Box(8767)),
+Box(Box(8768)),
+Box(Box(8769)),
+Box(Box(8770)),
+Box(Box(8771)),
+Box(Box(8772)),
+Box(Box(8773)),
+Box(Box(8774)),
+Box(Box(8775)),
+Box(Box(8776)),
+Box(Box(8777)),
+Box(Box(8778)),
+Box(Box(8779)),
+Box(Box(8780)),
+Box(Box(8781)),
+Box(Box(8782)),
+Box(Box(8783)),
+Box(Box(8784)),
+Box(Box(8785)),
+Box(Box(8786)),
+Box(Box(8787)),
+Box(Box(8788)),
+Box(Box(8789)),
+Box(Box(8790)),
+Box(Box(8791)),
+Box(Box(8792)),
+Box(Box(8793)),
+Box(Box(8794)),
+Box(Box(8795)),
+Box(Box(8796)),
+Box(Box(8797)),
+Box(Box(8798)),
+Box(Box(8799)),
+Box(Box(8800)),
+Box(Box(8801)),
+Box(Box(8802)),
+Box(Box(8803)),
+Box(Box(8804)),
+Box(Box(8805)),
+Box(Box(8806)),
+Box(Box(8807)),
+Box(Box(8808)),
+Box(Box(8809)),
+Box(Box(8810)),
+Box(Box(8811)),
+Box(Box(8812)),
+Box(Box(8813)),
+Box(Box(8814)),
+Box(Box(8815)),
+Box(Box(8816)),
+Box(Box(8817)),
+Box(Box(8818)),
+Box(Box(8819)),
+Box(Box(8820)),
+Box(Box(8821)),
+Box(Box(8822)),
+Box(Box(8823)),
+Box(Box(8824)),
+Box(Box(8825)),
+Box(Box(8826)),
+Box(Box(8827)),
+Box(Box(8828)),
+Box(Box(8829)),
+Box(Box(8830)),
+Box(Box(8831)),
+Box(Box(8832)),
+Box(Box(8833)),
+Box(Box(8834)),
+Box(Box(8835)),
+Box(Box(8836)),
+Box(Box(8837)),
+Box(Box(8838)),
+Box(Box(8839)),
+Box(Box(8840)),
+Box(Box(8841)),
+Box(Box(8842)),
+Box(Box(8843)),
+Box(Box(8844)),
+Box(Box(8845)),
+Box(Box(8846)),
+Box(Box(8847)),
+Box(Box(8848)),
+Box(Box(8849)),
+Box(Box(8850)),
+Box(Box(8851)),
+Box(Box(8852)),
+Box(Box(8853)),
+Box(Box(8854)),
+Box(Box(8855)),
+Box(Box(8856)),
+Box(Box(8857)),
+Box(Box(8858)),
+Box(Box(8859)),
+Box(Box(8860)),
+Box(Box(8861)),
+Box(Box(8862)),
+Box(Box(8863)),
+Box(Box(8864)),
+Box(Box(8865)),
+Box(Box(8866)),
+Box(Box(8867)),
+Box(Box(8868)),
+Box(Box(8869)),
+Box(Box(8870)),
+Box(Box(8871)),
+Box(Box(8872)),
+Box(Box(8873)),
+Box(Box(8874)),
+Box(Box(8875)),
+Box(Box(8876)),
+Box(Box(8877)),
+Box(Box(8878)),
+Box(Box(8879)),
+Box(Box(8880)),
+Box(Box(8881)),
+Box(Box(8882)),
+Box(Box(8883)),
+Box(Box(8884)),
+Box(Box(8885)),
+Box(Box(8886)),
+Box(Box(8887)),
+Box(Box(8888)),
+Box(Box(8889)),
+Box(Box(8890)),
+Box(Box(8891)),
+Box(Box(8892)),
+Box(Box(8893)),
+Box(Box(8894)),
+Box(Box(8895)),
+Box(Box(8896)),
+Box(Box(8897)),
+Box(Box(8898)),
+Box(Box(8899)),
+Box(Box(8900)),
+Box(Box(8901)),
+Box(Box(8902)),
+Box(Box(8903)),
+Box(Box(8904)),
+Box(Box(8905)),
+Box(Box(8906)),
+Box(Box(8907)),
+Box(Box(8908)),
+Box(Box(8909)),
+Box(Box(8910)),
+Box(Box(8911)),
+Box(Box(8912)),
+Box(Box(8913)),
+Box(Box(8914)),
+Box(Box(8915)),
+Box(Box(8916)),
+Box(Box(8917)),
+Box(Box(8918)),
+Box(Box(8919)),
+Box(Box(8920)),
+Box(Box(8921)),
+Box(Box(8922)),
+Box(Box(8923)),
+Box(Box(8924)),
+Box(Box(8925)),
+Box(Box(8926)),
+Box(Box(8927)),
+Box(Box(8928)),
+Box(Box(8929)),
+Box(Box(8930)),
+Box(Box(8931)),
+Box(Box(8932)),
+Box(Box(8933)),
+Box(Box(8934)),
+Box(Box(8935)),
+Box(Box(8936)),
+Box(Box(8937)),
+Box(Box(8938)),
+Box(Box(8939)),
+Box(Box(8940)),
+Box(Box(8941)),
+Box(Box(8942)),
+Box(Box(8943)),
+Box(Box(8944)),
+Box(Box(8945)),
+Box(Box(8946)),
+Box(Box(8947)),
+Box(Box(8948)),
+Box(Box(8949)),
+Box(Box(8950)),
+Box(Box(8951)),
+Box(Box(8952)),
+Box(Box(8953)),
+Box(Box(8954)),
+Box(Box(8955)),
+Box(Box(8956)),
+Box(Box(8957)),
+Box(Box(8958)),
+Box(Box(8959)),
+Box(Box(8960)),
+Box(Box(8961)),
+Box(Box(8962)),
+Box(Box(8963)),
+Box(Box(8964)),
+Box(Box(8965)),
+Box(Box(8966)),
+Box(Box(8967)),
+Box(Box(8968)),
+Box(Box(8969)),
+Box(Box(8970)),
+Box(Box(8971)),
+Box(Box(8972)),
+Box(Box(8973)),
+Box(Box(8974)),
+Box(Box(8975)),
+Box(Box(8976)),
+Box(Box(8977)),
+Box(Box(8978)),
+Box(Box(8979)),
+Box(Box(8980)),
+Box(Box(8981)),
+Box(Box(8982)),
+Box(Box(8983)),
+Box(Box(8984)),
+Box(Box(8985)),
+Box(Box(8986)),
+Box(Box(8987)),
+Box(Box(8988)),
+Box(Box(8989)),
+Box(Box(8990)),
+Box(Box(8991)),
+Box(Box(8992)),
+Box(Box(8993)),
+Box(Box(8994)),
+Box(Box(8995)),
+Box(Box(8996)),
+Box(Box(8997)),
+Box(Box(8998)),
+Box(Box(8999)),
+Box(Box(9000)),
+Box(Box(9001)),
+Box(Box(9002)),
+Box(Box(9003)),
+Box(Box(9004)),
+Box(Box(9005)),
+Box(Box(9006)),
+Box(Box(9007)),
+Box(Box(9008)),
+Box(Box(9009)),
+Box(Box(9010)),
+Box(Box(9011)),
+Box(Box(9012)),
+Box(Box(9013)),
+Box(Box(9014)),
+Box(Box(9015)),
+Box(Box(9016)),
+Box(Box(9017)),
+Box(Box(9018)),
+Box(Box(9019)),
+Box(Box(9020)),
+Box(Box(9021)),
+Box(Box(9022)),
+Box(Box(9023)),
+Box(Box(9024)),
+Box(Box(9025)),
+Box(Box(9026)),
+Box(Box(9027)),
+Box(Box(9028)),
+Box(Box(9029)),
+Box(Box(9030)),
+Box(Box(9031)),
+Box(Box(9032)),
+Box(Box(9033)),
+Box(Box(9034)),
+Box(Box(9035)),
+Box(Box(9036)),
+Box(Box(9037)),
+Box(Box(9038)),
+Box(Box(9039)),
+Box(Box(9040)),
+Box(Box(9041)),
+Box(Box(9042)),
+Box(Box(9043)),
+Box(Box(9044)),
+Box(Box(9045)),
+Box(Box(9046)),
+Box(Box(9047)),
+Box(Box(9048)),
+Box(Box(9049)),
+Box(Box(9050)),
+Box(Box(9051)),
+Box(Box(9052)),
+Box(Box(9053)),
+Box(Box(9054)),
+Box(Box(9055)),
+Box(Box(9056)),
+Box(Box(9057)),
+Box(Box(9058)),
+Box(Box(9059)),
+Box(Box(9060)),
+Box(Box(9061)),
+Box(Box(9062)),
+Box(Box(9063)),
+Box(Box(9064)),
+Box(Box(9065)),
+Box(Box(9066)),
+Box(Box(9067)),
+Box(Box(9068)),
+Box(Box(9069)),
+Box(Box(9070)),
+Box(Box(9071)),
+Box(Box(9072)),
+Box(Box(9073)),
+Box(Box(9074)),
+Box(Box(9075)),
+Box(Box(9076)),
+Box(Box(9077)),
+Box(Box(9078)),
+Box(Box(9079)),
+Box(Box(9080)),
+Box(Box(9081)),
+Box(Box(9082)),
+Box(Box(9083)),
+Box(Box(9084)),
+Box(Box(9085)),
+Box(Box(9086)),
+Box(Box(9087)),
+Box(Box(9088)),
+Box(Box(9089)),
+Box(Box(9090)),
+Box(Box(9091)),
+Box(Box(9092)),
+Box(Box(9093)),
+Box(Box(9094)),
+Box(Box(9095)),
+Box(Box(9096)),
+Box(Box(9097)),
+Box(Box(9098)),
+Box(Box(9099)),
+Box(Box(9100)),
+Box(Box(9101)),
+Box(Box(9102)),
+Box(Box(9103)),
+Box(Box(9104)),
+Box(Box(9105)),
+Box(Box(9106)),
+Box(Box(9107)),
+Box(Box(9108)),
+Box(Box(9109)),
+Box(Box(9110)),
+Box(Box(9111)),
+Box(Box(9112)),
+Box(Box(9113)),
+Box(Box(9114)),
+Box(Box(9115)),
+Box(Box(9116)),
+Box(Box(9117)),
+Box(Box(9118)),
+Box(Box(9119)),
+Box(Box(9120)),
+Box(Box(9121)),
+Box(Box(9122)),
+Box(Box(9123)),
+Box(Box(9124)),
+Box(Box(9125)),
+Box(Box(9126)),
+Box(Box(9127)),
+Box(Box(9128)),
+Box(Box(9129)),
+Box(Box(9130)),
+Box(Box(9131)),
+Box(Box(9132)),
+Box(Box(9133)),
+Box(Box(9134)),
+Box(Box(9135)),
+Box(Box(9136)),
+Box(Box(9137)),
+Box(Box(9138)),
+Box(Box(9139)),
+Box(Box(9140)),
+Box(Box(9141)),
+Box(Box(9142)),
+Box(Box(9143)),
+Box(Box(9144)),
+Box(Box(9145)),
+Box(Box(9146)),
+Box(Box(9147)),
+Box(Box(9148)),
+Box(Box(9149)),
+Box(Box(9150)),
+Box(Box(9151)),
+Box(Box(9152)),
+Box(Box(9153)),
+Box(Box(9154)),
+Box(Box(9155)),
+Box(Box(9156)),
+Box(Box(9157)),
+Box(Box(9158)),
+Box(Box(9159)),
+Box(Box(9160)),
+Box(Box(9161)),
+Box(Box(9162)),
+Box(Box(9163)),
+Box(Box(9164)),
+Box(Box(9165)),
+Box(Box(9166)),
+Box(Box(9167)),
+Box(Box(9168)),
+Box(Box(9169)),
+Box(Box(9170)),
+Box(Box(9171)),
+Box(Box(9172)),
+Box(Box(9173)),
+Box(Box(9174)),
+Box(Box(9175)),
+Box(Box(9176)),
+Box(Box(9177)),
+Box(Box(9178)),
+Box(Box(9179)),
+Box(Box(9180)),
+Box(Box(9181)),
+Box(Box(9182)),
+Box(Box(9183)),
+Box(Box(9184)),
+Box(Box(9185)),
+Box(Box(9186)),
+Box(Box(9187)),
+Box(Box(9188)),
+Box(Box(9189)),
+Box(Box(9190)),
+Box(Box(9191)),
+Box(Box(9192)),
+Box(Box(9193)),
+Box(Box(9194)),
+Box(Box(9195)),
+Box(Box(9196)),
+Box(Box(9197)),
+Box(Box(9198)),
+Box(Box(9199)),
+Box(Box(9200)),
+Box(Box(9201)),
+Box(Box(9202)),
+Box(Box(9203)),
+Box(Box(9204)),
+Box(Box(9205)),
+Box(Box(9206)),
+Box(Box(9207)),
+Box(Box(9208)),
+Box(Box(9209)),
+Box(Box(9210)),
+Box(Box(9211)),
+Box(Box(9212)),
+Box(Box(9213)),
+Box(Box(9214)),
+Box(Box(9215)),
+Box(Box(9216)),
+Box(Box(9217)),
+Box(Box(9218)),
+Box(Box(9219)),
+Box(Box(9220)),
+Box(Box(9221)),
+Box(Box(9222)),
+Box(Box(9223)),
+Box(Box(9224)),
+Box(Box(9225)),
+Box(Box(9226)),
+Box(Box(9227)),
+Box(Box(9228)),
+Box(Box(9229)),
+Box(Box(9230)),
+Box(Box(9231)),
+Box(Box(9232)),
+Box(Box(9233)),
+Box(Box(9234)),
+Box(Box(9235)),
+Box(Box(9236)),
+Box(Box(9237)),
+Box(Box(9238)),
+Box(Box(9239)),
+Box(Box(9240)),
+Box(Box(9241)),
+Box(Box(9242)),
+Box(Box(9243)),
+Box(Box(9244)),
+Box(Box(9245)),
+Box(Box(9246)),
+Box(Box(9247)),
+Box(Box(9248)),
+Box(Box(9249)),
+Box(Box(9250)),
+Box(Box(9251)),
+Box(Box(9252)),
+Box(Box(9253)),
+Box(Box(9254)),
+Box(Box(9255)),
+Box(Box(9256)),
+Box(Box(9257)),
+Box(Box(9258)),
+Box(Box(9259)),
+Box(Box(9260)),
+Box(Box(9261)),
+Box(Box(9262)),
+Box(Box(9263)),
+Box(Box(9264)),
+Box(Box(9265)),
+Box(Box(9266)),
+Box(Box(9267)),
+Box(Box(9268)),
+Box(Box(9269)),
+Box(Box(9270)),
+Box(Box(9271)),
+Box(Box(9272)),
+Box(Box(9273)),
+Box(Box(9274)),
+Box(Box(9275)),
+Box(Box(9276)),
+Box(Box(9277)),
+Box(Box(9278)),
+Box(Box(9279)),
+Box(Box(9280)),
+Box(Box(9281)),
+Box(Box(9282)),
+Box(Box(9283)),
+Box(Box(9284)),
+Box(Box(9285)),
+Box(Box(9286)),
+Box(Box(9287)),
+Box(Box(9288)),
+Box(Box(9289)),
+Box(Box(9290)),
+Box(Box(9291)),
+Box(Box(9292)),
+Box(Box(9293)),
+Box(Box(9294)),
+Box(Box(9295)),
+Box(Box(9296)),
+Box(Box(9297)),
+Box(Box(9298)),
+Box(Box(9299)),
+Box(Box(9300)),
+Box(Box(9301)),
+Box(Box(9302)),
+Box(Box(9303)),
+Box(Box(9304)),
+Box(Box(9305)),
+Box(Box(9306)),
+Box(Box(9307)),
+Box(Box(9308)),
+Box(Box(9309)),
+Box(Box(9310)),
+Box(Box(9311)),
+Box(Box(9312)),
+Box(Box(9313)),
+Box(Box(9314)),
+Box(Box(9315)),
+Box(Box(9316)),
+Box(Box(9317)),
+Box(Box(9318)),
+Box(Box(9319)),
+Box(Box(9320)),
+Box(Box(9321)),
+Box(Box(9322)),
+Box(Box(9323)),
+Box(Box(9324)),
+Box(Box(9325)),
+Box(Box(9326)),
+Box(Box(9327)),
+Box(Box(9328)),
+Box(Box(9329)),
+Box(Box(9330)),
+Box(Box(9331)),
+Box(Box(9332)),
+Box(Box(9333)),
+Box(Box(9334)),
+Box(Box(9335)),
+Box(Box(9336)),
+Box(Box(9337)),
+Box(Box(9338)),
+Box(Box(9339)),
+Box(Box(9340)),
+Box(Box(9341)),
+Box(Box(9342)),
+Box(Box(9343)),
+Box(Box(9344)),
+Box(Box(9345)),
+Box(Box(9346)),
+Box(Box(9347)),
+Box(Box(9348)),
+Box(Box(9349)),
+Box(Box(9350)),
+Box(Box(9351)),
+Box(Box(9352)),
+Box(Box(9353)),
+Box(Box(9354)),
+Box(Box(9355)),
+Box(Box(9356)),
+Box(Box(9357)),
+Box(Box(9358)),
+Box(Box(9359)),
+Box(Box(9360)),
+Box(Box(9361)),
+Box(Box(9362)),
+Box(Box(9363)),
+Box(Box(9364)),
+Box(Box(9365)),
+Box(Box(9366)),
+Box(Box(9367)),
+Box(Box(9368)),
+Box(Box(9369)),
+Box(Box(9370)),
+Box(Box(9371)),
+Box(Box(9372)),
+Box(Box(9373)),
+Box(Box(9374)),
+Box(Box(9375)),
+Box(Box(9376)),
+Box(Box(9377)),
+Box(Box(9378)),
+Box(Box(9379)),
+Box(Box(9380)),
+Box(Box(9381)),
+Box(Box(9382)),
+Box(Box(9383)),
+Box(Box(9384)),
+Box(Box(9385)),
+Box(Box(9386)),
+Box(Box(9387)),
+Box(Box(9388)),
+Box(Box(9389)),
+Box(Box(9390)),
+Box(Box(9391)),
+Box(Box(9392)),
+Box(Box(9393)),
+Box(Box(9394)),
+Box(Box(9395)),
+Box(Box(9396)),
+Box(Box(9397)),
+Box(Box(9398)),
+Box(Box(9399)),
+Box(Box(9400)),
+Box(Box(9401)),
+Box(Box(9402)),
+Box(Box(9403)),
+Box(Box(9404)),
+Box(Box(9405)),
+Box(Box(9406)),
+Box(Box(9407)),
+Box(Box(9408)),
+Box(Box(9409)),
+Box(Box(9410)),
+Box(Box(9411)),
+Box(Box(9412)),
+Box(Box(9413)),
+Box(Box(9414)),
+Box(Box(9415)),
+Box(Box(9416)),
+Box(Box(9417)),
+Box(Box(9418)),
+Box(Box(9419)),
+Box(Box(9420)),
+Box(Box(9421)),
+Box(Box(9422)),
+Box(Box(9423)),
+Box(Box(9424)),
+Box(Box(9425)),
+Box(Box(9426)),
+Box(Box(9427)),
+Box(Box(9428)),
+Box(Box(9429)),
+Box(Box(9430)),
+Box(Box(9431)),
+Box(Box(9432)),
+Box(Box(9433)),
+Box(Box(9434)),
+Box(Box(9435)),
+Box(Box(9436)),
+Box(Box(9437)),
+Box(Box(9438)),
+Box(Box(9439)),
+Box(Box(9440)),
+Box(Box(9441)),
+Box(Box(9442)),
+Box(Box(9443)),
+Box(Box(9444)),
+Box(Box(9445)),
+Box(Box(9446)),
+Box(Box(9447)),
+Box(Box(9448)),
+Box(Box(9449)),
+Box(Box(9450)),
+Box(Box(9451)),
+Box(Box(9452)),
+Box(Box(9453)),
+Box(Box(9454)),
+Box(Box(9455)),
+Box(Box(9456)),
+Box(Box(9457)),
+Box(Box(9458)),
+Box(Box(9459)),
+Box(Box(9460)),
+Box(Box(9461)),
+Box(Box(9462)),
+Box(Box(9463)),
+Box(Box(9464)),
+Box(Box(9465)),
+Box(Box(9466)),
+Box(Box(9467)),
+Box(Box(9468)),
+Box(Box(9469)),
+Box(Box(9470)),
+Box(Box(9471)),
+Box(Box(9472)),
+Box(Box(9473)),
+Box(Box(9474)),
+Box(Box(9475)),
+Box(Box(9476)),
+Box(Box(9477)),
+Box(Box(9478)),
+Box(Box(9479)),
+Box(Box(9480)),
+Box(Box(9481)),
+Box(Box(9482)),
+Box(Box(9483)),
+Box(Box(9484)),
+Box(Box(9485)),
+Box(Box(9486)),
+Box(Box(9487)),
+Box(Box(9488)),
+Box(Box(9489)),
+Box(Box(9490)),
+Box(Box(9491)),
+Box(Box(9492)),
+Box(Box(9493)),
+Box(Box(9494)),
+Box(Box(9495)),
+Box(Box(9496)),
+Box(Box(9497)),
+Box(Box(9498)),
+Box(Box(9499)),
+Box(Box(9500)),
+Box(Box(9501)),
+Box(Box(9502)),
+Box(Box(9503)),
+Box(Box(9504)),
+Box(Box(9505)),
+Box(Box(9506)),
+Box(Box(9507)),
+Box(Box(9508)),
+Box(Box(9509)),
+Box(Box(9510)),
+Box(Box(9511)),
+Box(Box(9512)),
+Box(Box(9513)),
+Box(Box(9514)),
+Box(Box(9515)),
+Box(Box(9516)),
+Box(Box(9517)),
+Box(Box(9518)),
+Box(Box(9519)),
+Box(Box(9520)),
+Box(Box(9521)),
+Box(Box(9522)),
+Box(Box(9523)),
+Box(Box(9524)),
+Box(Box(9525)),
+Box(Box(9526)),
+Box(Box(9527)),
+Box(Box(9528)),
+Box(Box(9529)),
+Box(Box(9530)),
+Box(Box(9531)),
+Box(Box(9532)),
+Box(Box(9533)),
+Box(Box(9534)),
+Box(Box(9535)),
+Box(Box(9536)),
+Box(Box(9537)),
+Box(Box(9538)),
+Box(Box(9539)),
+Box(Box(9540)),
+Box(Box(9541)),
+Box(Box(9542)),
+Box(Box(9543)),
+Box(Box(9544)),
+Box(Box(9545)),
+Box(Box(9546)),
+Box(Box(9547)),
+Box(Box(9548)),
+Box(Box(9549)),
+Box(Box(9550)),
+Box(Box(9551)),
+Box(Box(9552)),
+Box(Box(9553)),
+Box(Box(9554)),
+Box(Box(9555)),
+Box(Box(9556)),
+Box(Box(9557)),
+Box(Box(9558)),
+Box(Box(9559)),
+Box(Box(9560)),
+Box(Box(9561)),
+Box(Box(9562)),
+Box(Box(9563)),
+Box(Box(9564)),
+Box(Box(9565)),
+Box(Box(9566)),
+Box(Box(9567)),
+Box(Box(9568)),
+Box(Box(9569)),
+Box(Box(9570)),
+Box(Box(9571)),
+Box(Box(9572)),
+Box(Box(9573)),
+Box(Box(9574)),
+Box(Box(9575)),
+Box(Box(9576)),
+Box(Box(9577)),
+Box(Box(9578)),
+Box(Box(9579)),
+Box(Box(9580)),
+Box(Box(9581)),
+Box(Box(9582)),
+Box(Box(9583)),
+Box(Box(9584)),
+Box(Box(9585)),
+Box(Box(9586)),
+Box(Box(9587)),
+Box(Box(9588)),
+Box(Box(9589)),
+Box(Box(9590)),
+Box(Box(9591)),
+Box(Box(9592)),
+Box(Box(9593)),
+Box(Box(9594)),
+Box(Box(9595)),
+Box(Box(9596)),
+Box(Box(9597)),
+Box(Box(9598)),
+Box(Box(9599)),
+Box(Box(9600)),
+Box(Box(9601)),
+Box(Box(9602)),
+Box(Box(9603)),
+Box(Box(9604)),
+Box(Box(9605)),
+Box(Box(9606)),
+Box(Box(9607)),
+Box(Box(9608)),
+Box(Box(9609)),
+Box(Box(9610)),
+Box(Box(9611)),
+Box(Box(9612)),
+Box(Box(9613)),
+Box(Box(9614)),
+Box(Box(9615)),
+Box(Box(9616)),
+Box(Box(9617)),
+Box(Box(9618)),
+Box(Box(9619)),
+Box(Box(9620)),
+Box(Box(9621)),
+Box(Box(9622)),
+Box(Box(9623)),
+Box(Box(9624)),
+Box(Box(9625)),
+Box(Box(9626)),
+Box(Box(9627)),
+Box(Box(9628)),
+Box(Box(9629)),
+Box(Box(9630)),
+Box(Box(9631)),
+Box(Box(9632)),
+Box(Box(9633)),
+Box(Box(9634)),
+Box(Box(9635)),
+Box(Box(9636)),
+Box(Box(9637)),
+Box(Box(9638)),
+Box(Box(9639)),
+Box(Box(9640)),
+Box(Box(9641)),
+Box(Box(9642)),
+Box(Box(9643)),
+Box(Box(9644)),
+Box(Box(9645)),
+Box(Box(9646)),
+Box(Box(9647)),
+Box(Box(9648)),
+Box(Box(9649)),
+Box(Box(9650)),
+Box(Box(9651)),
+Box(Box(9652)),
+Box(Box(9653)),
+Box(Box(9654)),
+Box(Box(9655)),
+Box(Box(9656)),
+Box(Box(9657)),
+Box(Box(9658)),
+Box(Box(9659)),
+Box(Box(9660)),
+Box(Box(9661)),
+Box(Box(9662)),
+Box(Box(9663)),
+Box(Box(9664)),
+Box(Box(9665)),
+Box(Box(9666)),
+Box(Box(9667)),
+Box(Box(9668)),
+Box(Box(9669)),
+Box(Box(9670)),
+Box(Box(9671)),
+Box(Box(9672)),
+Box(Box(9673)),
+Box(Box(9674)),
+Box(Box(9675)),
+Box(Box(9676)),
+Box(Box(9677)),
+Box(Box(9678)),
+Box(Box(9679)),
+Box(Box(9680)),
+Box(Box(9681)),
+Box(Box(9682)),
+Box(Box(9683)),
+Box(Box(9684)),
+Box(Box(9685)),
+Box(Box(9686)),
+Box(Box(9687)),
+Box(Box(9688)),
+Box(Box(9689)),
+Box(Box(9690)),
+Box(Box(9691)),
+Box(Box(9692)),
+Box(Box(9693)),
+Box(Box(9694)),
+Box(Box(9695)),
+Box(Box(9696)),
+Box(Box(9697)),
+Box(Box(9698)),
+Box(Box(9699)),
+Box(Box(9700)),
+Box(Box(9701)),
+Box(Box(9702)),
+Box(Box(9703)),
+Box(Box(9704)),
+Box(Box(9705)),
+Box(Box(9706)),
+Box(Box(9707)),
+Box(Box(9708)),
+Box(Box(9709)),
+Box(Box(9710)),
+Box(Box(9711)),
+Box(Box(9712)),
+Box(Box(9713)),
+Box(Box(9714)),
+Box(Box(9715)),
+Box(Box(9716)),
+Box(Box(9717)),
+Box(Box(9718)),
+Box(Box(9719)),
+Box(Box(9720)),
+Box(Box(9721)),
+Box(Box(9722)),
+Box(Box(9723)),
+Box(Box(9724)),
+Box(Box(9725)),
+Box(Box(9726)),
+Box(Box(9727)),
+Box(Box(9728)),
+Box(Box(9729)),
+Box(Box(9730)),
+Box(Box(9731)),
+Box(Box(9732)),
+Box(Box(9733)),
+Box(Box(9734)),
+Box(Box(9735)),
+Box(Box(9736)),
+Box(Box(9737)),
+Box(Box(9738)),
+Box(Box(9739)),
+Box(Box(9740)),
+Box(Box(9741)),
+Box(Box(9742)),
+Box(Box(9743)),
+Box(Box(9744)),
+Box(Box(9745)),
+Box(Box(9746)),
+Box(Box(9747)),
+Box(Box(9748)),
+Box(Box(9749)),
+Box(Box(9750)),
+Box(Box(9751)),
+Box(Box(9752)),
+Box(Box(9753)),
+Box(Box(9754)),
+Box(Box(9755)),
+Box(Box(9756)),
+Box(Box(9757)),
+Box(Box(9758)),
+Box(Box(9759)),
+Box(Box(9760)),
+Box(Box(9761)),
+Box(Box(9762)),
+Box(Box(9763)),
+Box(Box(9764)),
+Box(Box(9765)),
+Box(Box(9766)),
+Box(Box(9767)),
+Box(Box(9768)),
+Box(Box(9769)),
+Box(Box(9770)),
+Box(Box(9771)),
+Box(Box(9772)),
+Box(Box(9773)),
+Box(Box(9774)),
+Box(Box(9775)),
+Box(Box(9776)),
+Box(Box(9777)),
+Box(Box(9778)),
+Box(Box(9779)),
+Box(Box(9780)),
+Box(Box(9781)),
+Box(Box(9782)),
+Box(Box(9783)),
+Box(Box(9784)),
+Box(Box(9785)),
+Box(Box(9786)),
+Box(Box(9787)),
+Box(Box(9788)),
+Box(Box(9789)),
+Box(Box(9790)),
+Box(Box(9791)),
+Box(Box(9792)),
+Box(Box(9793)),
+Box(Box(9794)),
+Box(Box(9795)),
+Box(Box(9796)),
+Box(Box(9797)),
+Box(Box(9798)),
+Box(Box(9799)),
+Box(Box(9800)),
+Box(Box(9801)),
+Box(Box(9802)),
+Box(Box(9803)),
+Box(Box(9804)),
+Box(Box(9805)),
+Box(Box(9806)),
+Box(Box(9807)),
+Box(Box(9808)),
+Box(Box(9809)),
+Box(Box(9810)),
+Box(Box(9811)),
+Box(Box(9812)),
+Box(Box(9813)),
+Box(Box(9814)),
+Box(Box(9815)),
+Box(Box(9816)),
+Box(Box(9817)),
+Box(Box(9818)),
+Box(Box(9819)),
+Box(Box(9820)),
+Box(Box(9821)),
+Box(Box(9822)),
+Box(Box(9823)),
+Box(Box(9824)),
+Box(Box(9825)),
+Box(Box(9826)),
+Box(Box(9827)),
+Box(Box(9828)),
+Box(Box(9829)),
+Box(Box(9830)),
+Box(Box(9831)),
+Box(Box(9832)),
+Box(Box(9833)),
+Box(Box(9834)),
+Box(Box(9835)),
+Box(Box(9836)),
+Box(Box(9837)),
+Box(Box(9838)),
+Box(Box(9839)),
+Box(Box(9840)),
+Box(Box(9841)),
+Box(Box(9842)),
+Box(Box(9843)),
+Box(Box(9844)),
+Box(Box(9845)),
+Box(Box(9846)),
+Box(Box(9847)),
+Box(Box(9848)),
+Box(Box(9849)),
+Box(Box(9850)),
+Box(Box(9851)),
+Box(Box(9852)),
+Box(Box(9853)),
+Box(Box(9854)),
+Box(Box(9855)),
+Box(Box(9856)),
+Box(Box(9857)),
+Box(Box(9858)),
+Box(Box(9859)),
+Box(Box(9860)),
+Box(Box(9861)),
+Box(Box(9862)),
+Box(Box(9863)),
+Box(Box(9864)),
+Box(Box(9865)),
+Box(Box(9866)),
+Box(Box(9867)),
+Box(Box(9868)),
+Box(Box(9869)),
+Box(Box(9870)),
+Box(Box(9871)),
+Box(Box(9872)),
+Box(Box(9873)),
+Box(Box(9874)),
+Box(Box(9875)),
+Box(Box(9876)),
+Box(Box(9877)),
+Box(Box(9878)),
+Box(Box(9879)),
+Box(Box(9880)),
+Box(Box(9881)),
+Box(Box(9882)),
+Box(Box(9883)),
+Box(Box(9884)),
+Box(Box(9885)),
+Box(Box(9886)),
+Box(Box(9887)),
+Box(Box(9888)),
+Box(Box(9889)),
+Box(Box(9890)),
+Box(Box(9891)),
+Box(Box(9892)),
+Box(Box(9893)),
+Box(Box(9894)),
+Box(Box(9895)),
+Box(Box(9896)),
+Box(Box(9897)),
+Box(Box(9898)),
+Box(Box(9899)),
+Box(Box(9900)),
+Box(Box(9901)),
+Box(Box(9902)),
+Box(Box(9903)),
+Box(Box(9904)),
+Box(Box(9905)),
+Box(Box(9906)),
+Box(Box(9907)),
+Box(Box(9908)),
+Box(Box(9909)),
+Box(Box(9910)),
+Box(Box(9911)),
+Box(Box(9912)),
+Box(Box(9913)),
+Box(Box(9914)),
+Box(Box(9915)),
+Box(Box(9916)),
+Box(Box(9917)),
+Box(Box(9918)),
+Box(Box(9919)),
+Box(Box(9920)),
+Box(Box(9921)),
+Box(Box(9922)),
+Box(Box(9923)),
+Box(Box(9924)),
+Box(Box(9925)),
+Box(Box(9926)),
+Box(Box(9927)),
+Box(Box(9928)),
+Box(Box(9929)),
+Box(Box(9930)),
+Box(Box(9931)),
+Box(Box(9932)),
+Box(Box(9933)),
+Box(Box(9934)),
+Box(Box(9935)),
+Box(Box(9936)),
+Box(Box(9937)),
+Box(Box(9938)),
+Box(Box(9939)),
+Box(Box(9940)),
+Box(Box(9941)),
+Box(Box(9942)),
+Box(Box(9943)),
+Box(Box(9944)),
+Box(Box(9945)),
+Box(Box(9946)),
+Box(Box(9947)),
+Box(Box(9948)),
+Box(Box(9949)),
+Box(Box(9950)),
+Box(Box(9951)),
+Box(Box(9952)),
+Box(Box(9953)),
+Box(Box(9954)),
+Box(Box(9955)),
+Box(Box(9956)),
+Box(Box(9957)),
+Box(Box(9958)),
+Box(Box(9959)),
+Box(Box(9960)),
+Box(Box(9961)),
+Box(Box(9962)),
+Box(Box(9963)),
+Box(Box(9964)),
+Box(Box(9965)),
+Box(Box(9966)),
+Box(Box(9967)),
+Box(Box(9968)),
+Box(Box(9969)),
+Box(Box(9970)),
+Box(Box(9971)),
+Box(Box(9972)),
+Box(Box(9973)),
+Box(Box(9974)),
+Box(Box(9975)),
+Box(Box(9976)),
+Box(Box(9977)),
+Box(Box(9978)),
+Box(Box(9979)),
+Box(Box(9980)),
+Box(Box(9981)),
+Box(Box(9982)),
+Box(Box(9983)),
+Box(Box(9984)),
+Box(Box(9985)),
+Box(Box(9986)),
+Box(Box(9987)),
+Box(Box(9988)),
+Box(Box(9989)),
+Box(Box(9990)),
+Box(Box(9991)),
+Box(Box(9992)),
+Box(Box(9993)),
+Box(Box(9994)),
+Box(Box(9995)),
+Box(Box(9996)),
+Box(Box(9997)),
+Box(Box(9998)),
+Box(Box(9999)),
+];
+
+// 10,000 elements.
+const list2 = [
+Box(Box(0)),
+Box(Box(1)),
+Box(Box(2)),
+Box(Box(3)),
+Box(Box(4)),
+Box(Box(5)),
+Box(Box(6)),
+Box(Box(7)),
+Box(Box(8)),
+Box(Box(9)),
+Box(Box(10)),
+Box(Box(11)),
+Box(Box(12)),
+Box(Box(13)),
+Box(Box(14)),
+Box(Box(15)),
+Box(Box(16)),
+Box(Box(17)),
+Box(Box(18)),
+Box(Box(19)),
+Box(Box(20)),
+Box(Box(21)),
+Box(Box(22)),
+Box(Box(23)),
+Box(Box(24)),
+Box(Box(25)),
+Box(Box(26)),
+Box(Box(27)),
+Box(Box(28)),
+Box(Box(29)),
+Box(Box(30)),
+Box(Box(31)),
+Box(Box(32)),
+Box(Box(33)),
+Box(Box(34)),
+Box(Box(35)),
+Box(Box(36)),
+Box(Box(37)),
+Box(Box(38)),
+Box(Box(39)),
+Box(Box(40)),
+Box(Box(41)),
+Box(Box(42)),
+Box(Box(43)),
+Box(Box(44)),
+Box(Box(45)),
+Box(Box(46)),
+Box(Box(47)),
+Box(Box(48)),
+Box(Box(49)),
+Box(Box(50)),
+Box(Box(51)),
+Box(Box(52)),
+Box(Box(53)),
+Box(Box(54)),
+Box(Box(55)),
+Box(Box(56)),
+Box(Box(57)),
+Box(Box(58)),
+Box(Box(59)),
+Box(Box(60)),
+Box(Box(61)),
+Box(Box(62)),
+Box(Box(63)),
+Box(Box(64)),
+Box(Box(65)),
+Box(Box(66)),
+Box(Box(67)),
+Box(Box(68)),
+Box(Box(69)),
+Box(Box(70)),
+Box(Box(71)),
+Box(Box(72)),
+Box(Box(73)),
+Box(Box(74)),
+Box(Box(75)),
+Box(Box(76)),
+Box(Box(77)),
+Box(Box(78)),
+Box(Box(79)),
+Box(Box(80)),
+Box(Box(81)),
+Box(Box(82)),
+Box(Box(83)),
+Box(Box(84)),
+Box(Box(85)),
+Box(Box(86)),
+Box(Box(87)),
+Box(Box(88)),
+Box(Box(89)),
+Box(Box(90)),
+Box(Box(91)),
+Box(Box(92)),
+Box(Box(93)),
+Box(Box(94)),
+Box(Box(95)),
+Box(Box(96)),
+Box(Box(97)),
+Box(Box(98)),
+Box(Box(99)),
+Box(Box(100)),
+Box(Box(101)),
+Box(Box(102)),
+Box(Box(103)),
+Box(Box(104)),
+Box(Box(105)),
+Box(Box(106)),
+Box(Box(107)),
+Box(Box(108)),
+Box(Box(109)),
+Box(Box(110)),
+Box(Box(111)),
+Box(Box(112)),
+Box(Box(113)),
+Box(Box(114)),
+Box(Box(115)),
+Box(Box(116)),
+Box(Box(117)),
+Box(Box(118)),
+Box(Box(119)),
+Box(Box(120)),
+Box(Box(121)),
+Box(Box(122)),
+Box(Box(123)),
+Box(Box(124)),
+Box(Box(125)),
+Box(Box(126)),
+Box(Box(127)),
+Box(Box(128)),
+Box(Box(129)),
+Box(Box(130)),
+Box(Box(131)),
+Box(Box(132)),
+Box(Box(133)),
+Box(Box(134)),
+Box(Box(135)),
+Box(Box(136)),
+Box(Box(137)),
+Box(Box(138)),
+Box(Box(139)),
+Box(Box(140)),
+Box(Box(141)),
+Box(Box(142)),
+Box(Box(143)),
+Box(Box(144)),
+Box(Box(145)),
+Box(Box(146)),
+Box(Box(147)),
+Box(Box(148)),
+Box(Box(149)),
+Box(Box(150)),
+Box(Box(151)),
+Box(Box(152)),
+Box(Box(153)),
+Box(Box(154)),
+Box(Box(155)),
+Box(Box(156)),
+Box(Box(157)),
+Box(Box(158)),
+Box(Box(159)),
+Box(Box(160)),
+Box(Box(161)),
+Box(Box(162)),
+Box(Box(163)),
+Box(Box(164)),
+Box(Box(165)),
+Box(Box(166)),
+Box(Box(167)),
+Box(Box(168)),
+Box(Box(169)),
+Box(Box(170)),
+Box(Box(171)),
+Box(Box(172)),
+Box(Box(173)),
+Box(Box(174)),
+Box(Box(175)),
+Box(Box(176)),
+Box(Box(177)),
+Box(Box(178)),
+Box(Box(179)),
+Box(Box(180)),
+Box(Box(181)),
+Box(Box(182)),
+Box(Box(183)),
+Box(Box(184)),
+Box(Box(185)),
+Box(Box(186)),
+Box(Box(187)),
+Box(Box(188)),
+Box(Box(189)),
+Box(Box(190)),
+Box(Box(191)),
+Box(Box(192)),
+Box(Box(193)),
+Box(Box(194)),
+Box(Box(195)),
+Box(Box(196)),
+Box(Box(197)),
+Box(Box(198)),
+Box(Box(199)),
+Box(Box(200)),
+Box(Box(201)),
+Box(Box(202)),
+Box(Box(203)),
+Box(Box(204)),
+Box(Box(205)),
+Box(Box(206)),
+Box(Box(207)),
+Box(Box(208)),
+Box(Box(209)),
+Box(Box(210)),
+Box(Box(211)),
+Box(Box(212)),
+Box(Box(213)),
+Box(Box(214)),
+Box(Box(215)),
+Box(Box(216)),
+Box(Box(217)),
+Box(Box(218)),
+Box(Box(219)),
+Box(Box(220)),
+Box(Box(221)),
+Box(Box(222)),
+Box(Box(223)),
+Box(Box(224)),
+Box(Box(225)),
+Box(Box(226)),
+Box(Box(227)),
+Box(Box(228)),
+Box(Box(229)),
+Box(Box(230)),
+Box(Box(231)),
+Box(Box(232)),
+Box(Box(233)),
+Box(Box(234)),
+Box(Box(235)),
+Box(Box(236)),
+Box(Box(237)),
+Box(Box(238)),
+Box(Box(239)),
+Box(Box(240)),
+Box(Box(241)),
+Box(Box(242)),
+Box(Box(243)),
+Box(Box(244)),
+Box(Box(245)),
+Box(Box(246)),
+Box(Box(247)),
+Box(Box(248)),
+Box(Box(249)),
+Box(Box(250)),
+Box(Box(251)),
+Box(Box(252)),
+Box(Box(253)),
+Box(Box(254)),
+Box(Box(255)),
+Box(Box(256)),
+Box(Box(257)),
+Box(Box(258)),
+Box(Box(259)),
+Box(Box(260)),
+Box(Box(261)),
+Box(Box(262)),
+Box(Box(263)),
+Box(Box(264)),
+Box(Box(265)),
+Box(Box(266)),
+Box(Box(267)),
+Box(Box(268)),
+Box(Box(269)),
+Box(Box(270)),
+Box(Box(271)),
+Box(Box(272)),
+Box(Box(273)),
+Box(Box(274)),
+Box(Box(275)),
+Box(Box(276)),
+Box(Box(277)),
+Box(Box(278)),
+Box(Box(279)),
+Box(Box(280)),
+Box(Box(281)),
+Box(Box(282)),
+Box(Box(283)),
+Box(Box(284)),
+Box(Box(285)),
+Box(Box(286)),
+Box(Box(287)),
+Box(Box(288)),
+Box(Box(289)),
+Box(Box(290)),
+Box(Box(291)),
+Box(Box(292)),
+Box(Box(293)),
+Box(Box(294)),
+Box(Box(295)),
+Box(Box(296)),
+Box(Box(297)),
+Box(Box(298)),
+Box(Box(299)),
+Box(Box(300)),
+Box(Box(301)),
+Box(Box(302)),
+Box(Box(303)),
+Box(Box(304)),
+Box(Box(305)),
+Box(Box(306)),
+Box(Box(307)),
+Box(Box(308)),
+Box(Box(309)),
+Box(Box(310)),
+Box(Box(311)),
+Box(Box(312)),
+Box(Box(313)),
+Box(Box(314)),
+Box(Box(315)),
+Box(Box(316)),
+Box(Box(317)),
+Box(Box(318)),
+Box(Box(319)),
+Box(Box(320)),
+Box(Box(321)),
+Box(Box(322)),
+Box(Box(323)),
+Box(Box(324)),
+Box(Box(325)),
+Box(Box(326)),
+Box(Box(327)),
+Box(Box(328)),
+Box(Box(329)),
+Box(Box(330)),
+Box(Box(331)),
+Box(Box(332)),
+Box(Box(333)),
+Box(Box(334)),
+Box(Box(335)),
+Box(Box(336)),
+Box(Box(337)),
+Box(Box(338)),
+Box(Box(339)),
+Box(Box(340)),
+Box(Box(341)),
+Box(Box(342)),
+Box(Box(343)),
+Box(Box(344)),
+Box(Box(345)),
+Box(Box(346)),
+Box(Box(347)),
+Box(Box(348)),
+Box(Box(349)),
+Box(Box(350)),
+Box(Box(351)),
+Box(Box(352)),
+Box(Box(353)),
+Box(Box(354)),
+Box(Box(355)),
+Box(Box(356)),
+Box(Box(357)),
+Box(Box(358)),
+Box(Box(359)),
+Box(Box(360)),
+Box(Box(361)),
+Box(Box(362)),
+Box(Box(363)),
+Box(Box(364)),
+Box(Box(365)),
+Box(Box(366)),
+Box(Box(367)),
+Box(Box(368)),
+Box(Box(369)),
+Box(Box(370)),
+Box(Box(371)),
+Box(Box(372)),
+Box(Box(373)),
+Box(Box(374)),
+Box(Box(375)),
+Box(Box(376)),
+Box(Box(377)),
+Box(Box(378)),
+Box(Box(379)),
+Box(Box(380)),
+Box(Box(381)),
+Box(Box(382)),
+Box(Box(383)),
+Box(Box(384)),
+Box(Box(385)),
+Box(Box(386)),
+Box(Box(387)),
+Box(Box(388)),
+Box(Box(389)),
+Box(Box(390)),
+Box(Box(391)),
+Box(Box(392)),
+Box(Box(393)),
+Box(Box(394)),
+Box(Box(395)),
+Box(Box(396)),
+Box(Box(397)),
+Box(Box(398)),
+Box(Box(399)),
+Box(Box(400)),
+Box(Box(401)),
+Box(Box(402)),
+Box(Box(403)),
+Box(Box(404)),
+Box(Box(405)),
+Box(Box(406)),
+Box(Box(407)),
+Box(Box(408)),
+Box(Box(409)),
+Box(Box(410)),
+Box(Box(411)),
+Box(Box(412)),
+Box(Box(413)),
+Box(Box(414)),
+Box(Box(415)),
+Box(Box(416)),
+Box(Box(417)),
+Box(Box(418)),
+Box(Box(419)),
+Box(Box(420)),
+Box(Box(421)),
+Box(Box(422)),
+Box(Box(423)),
+Box(Box(424)),
+Box(Box(425)),
+Box(Box(426)),
+Box(Box(427)),
+Box(Box(428)),
+Box(Box(429)),
+Box(Box(430)),
+Box(Box(431)),
+Box(Box(432)),
+Box(Box(433)),
+Box(Box(434)),
+Box(Box(435)),
+Box(Box(436)),
+Box(Box(437)),
+Box(Box(438)),
+Box(Box(439)),
+Box(Box(440)),
+Box(Box(441)),
+Box(Box(442)),
+Box(Box(443)),
+Box(Box(444)),
+Box(Box(445)),
+Box(Box(446)),
+Box(Box(447)),
+Box(Box(448)),
+Box(Box(449)),
+Box(Box(450)),
+Box(Box(451)),
+Box(Box(452)),
+Box(Box(453)),
+Box(Box(454)),
+Box(Box(455)),
+Box(Box(456)),
+Box(Box(457)),
+Box(Box(458)),
+Box(Box(459)),
+Box(Box(460)),
+Box(Box(461)),
+Box(Box(462)),
+Box(Box(463)),
+Box(Box(464)),
+Box(Box(465)),
+Box(Box(466)),
+Box(Box(467)),
+Box(Box(468)),
+Box(Box(469)),
+Box(Box(470)),
+Box(Box(471)),
+Box(Box(472)),
+Box(Box(473)),
+Box(Box(474)),
+Box(Box(475)),
+Box(Box(476)),
+Box(Box(477)),
+Box(Box(478)),
+Box(Box(479)),
+Box(Box(480)),
+Box(Box(481)),
+Box(Box(482)),
+Box(Box(483)),
+Box(Box(484)),
+Box(Box(485)),
+Box(Box(486)),
+Box(Box(487)),
+Box(Box(488)),
+Box(Box(489)),
+Box(Box(490)),
+Box(Box(491)),
+Box(Box(492)),
+Box(Box(493)),
+Box(Box(494)),
+Box(Box(495)),
+Box(Box(496)),
+Box(Box(497)),
+Box(Box(498)),
+Box(Box(499)),
+Box(Box(500)),
+Box(Box(501)),
+Box(Box(502)),
+Box(Box(503)),
+Box(Box(504)),
+Box(Box(505)),
+Box(Box(506)),
+Box(Box(507)),
+Box(Box(508)),
+Box(Box(509)),
+Box(Box(510)),
+Box(Box(511)),
+Box(Box(512)),
+Box(Box(513)),
+Box(Box(514)),
+Box(Box(515)),
+Box(Box(516)),
+Box(Box(517)),
+Box(Box(518)),
+Box(Box(519)),
+Box(Box(520)),
+Box(Box(521)),
+Box(Box(522)),
+Box(Box(523)),
+Box(Box(524)),
+Box(Box(525)),
+Box(Box(526)),
+Box(Box(527)),
+Box(Box(528)),
+Box(Box(529)),
+Box(Box(530)),
+Box(Box(531)),
+Box(Box(532)),
+Box(Box(533)),
+Box(Box(534)),
+Box(Box(535)),
+Box(Box(536)),
+Box(Box(537)),
+Box(Box(538)),
+Box(Box(539)),
+Box(Box(540)),
+Box(Box(541)),
+Box(Box(542)),
+Box(Box(543)),
+Box(Box(544)),
+Box(Box(545)),
+Box(Box(546)),
+Box(Box(547)),
+Box(Box(548)),
+Box(Box(549)),
+Box(Box(550)),
+Box(Box(551)),
+Box(Box(552)),
+Box(Box(553)),
+Box(Box(554)),
+Box(Box(555)),
+Box(Box(556)),
+Box(Box(557)),
+Box(Box(558)),
+Box(Box(559)),
+Box(Box(560)),
+Box(Box(561)),
+Box(Box(562)),
+Box(Box(563)),
+Box(Box(564)),
+Box(Box(565)),
+Box(Box(566)),
+Box(Box(567)),
+Box(Box(568)),
+Box(Box(569)),
+Box(Box(570)),
+Box(Box(571)),
+Box(Box(572)),
+Box(Box(573)),
+Box(Box(574)),
+Box(Box(575)),
+Box(Box(576)),
+Box(Box(577)),
+Box(Box(578)),
+Box(Box(579)),
+Box(Box(580)),
+Box(Box(581)),
+Box(Box(582)),
+Box(Box(583)),
+Box(Box(584)),
+Box(Box(585)),
+Box(Box(586)),
+Box(Box(587)),
+Box(Box(588)),
+Box(Box(589)),
+Box(Box(590)),
+Box(Box(591)),
+Box(Box(592)),
+Box(Box(593)),
+Box(Box(594)),
+Box(Box(595)),
+Box(Box(596)),
+Box(Box(597)),
+Box(Box(598)),
+Box(Box(599)),
+Box(Box(600)),
+Box(Box(601)),
+Box(Box(602)),
+Box(Box(603)),
+Box(Box(604)),
+Box(Box(605)),
+Box(Box(606)),
+Box(Box(607)),
+Box(Box(608)),
+Box(Box(609)),
+Box(Box(610)),
+Box(Box(611)),
+Box(Box(612)),
+Box(Box(613)),
+Box(Box(614)),
+Box(Box(615)),
+Box(Box(616)),
+Box(Box(617)),
+Box(Box(618)),
+Box(Box(619)),
+Box(Box(620)),
+Box(Box(621)),
+Box(Box(622)),
+Box(Box(623)),
+Box(Box(624)),
+Box(Box(625)),
+Box(Box(626)),
+Box(Box(627)),
+Box(Box(628)),
+Box(Box(629)),
+Box(Box(630)),
+Box(Box(631)),
+Box(Box(632)),
+Box(Box(633)),
+Box(Box(634)),
+Box(Box(635)),
+Box(Box(636)),
+Box(Box(637)),
+Box(Box(638)),
+Box(Box(639)),
+Box(Box(640)),
+Box(Box(641)),
+Box(Box(642)),
+Box(Box(643)),
+Box(Box(644)),
+Box(Box(645)),
+Box(Box(646)),
+Box(Box(647)),
+Box(Box(648)),
+Box(Box(649)),
+Box(Box(650)),
+Box(Box(651)),
+Box(Box(652)),
+Box(Box(653)),
+Box(Box(654)),
+Box(Box(655)),
+Box(Box(656)),
+Box(Box(657)),
+Box(Box(658)),
+Box(Box(659)),
+Box(Box(660)),
+Box(Box(661)),
+Box(Box(662)),
+Box(Box(663)),
+Box(Box(664)),
+Box(Box(665)),
+Box(Box(666)),
+Box(Box(667)),
+Box(Box(668)),
+Box(Box(669)),
+Box(Box(670)),
+Box(Box(671)),
+Box(Box(672)),
+Box(Box(673)),
+Box(Box(674)),
+Box(Box(675)),
+Box(Box(676)),
+Box(Box(677)),
+Box(Box(678)),
+Box(Box(679)),
+Box(Box(680)),
+Box(Box(681)),
+Box(Box(682)),
+Box(Box(683)),
+Box(Box(684)),
+Box(Box(685)),
+Box(Box(686)),
+Box(Box(687)),
+Box(Box(688)),
+Box(Box(689)),
+Box(Box(690)),
+Box(Box(691)),
+Box(Box(692)),
+Box(Box(693)),
+Box(Box(694)),
+Box(Box(695)),
+Box(Box(696)),
+Box(Box(697)),
+Box(Box(698)),
+Box(Box(699)),
+Box(Box(700)),
+Box(Box(701)),
+Box(Box(702)),
+Box(Box(703)),
+Box(Box(704)),
+Box(Box(705)),
+Box(Box(706)),
+Box(Box(707)),
+Box(Box(708)),
+Box(Box(709)),
+Box(Box(710)),
+Box(Box(711)),
+Box(Box(712)),
+Box(Box(713)),
+Box(Box(714)),
+Box(Box(715)),
+Box(Box(716)),
+Box(Box(717)),
+Box(Box(718)),
+Box(Box(719)),
+Box(Box(720)),
+Box(Box(721)),
+Box(Box(722)),
+Box(Box(723)),
+Box(Box(724)),
+Box(Box(725)),
+Box(Box(726)),
+Box(Box(727)),
+Box(Box(728)),
+Box(Box(729)),
+Box(Box(730)),
+Box(Box(731)),
+Box(Box(732)),
+Box(Box(733)),
+Box(Box(734)),
+Box(Box(735)),
+Box(Box(736)),
+Box(Box(737)),
+Box(Box(738)),
+Box(Box(739)),
+Box(Box(740)),
+Box(Box(741)),
+Box(Box(742)),
+Box(Box(743)),
+Box(Box(744)),
+Box(Box(745)),
+Box(Box(746)),
+Box(Box(747)),
+Box(Box(748)),
+Box(Box(749)),
+Box(Box(750)),
+Box(Box(751)),
+Box(Box(752)),
+Box(Box(753)),
+Box(Box(754)),
+Box(Box(755)),
+Box(Box(756)),
+Box(Box(757)),
+Box(Box(758)),
+Box(Box(759)),
+Box(Box(760)),
+Box(Box(761)),
+Box(Box(762)),
+Box(Box(763)),
+Box(Box(764)),
+Box(Box(765)),
+Box(Box(766)),
+Box(Box(767)),
+Box(Box(768)),
+Box(Box(769)),
+Box(Box(770)),
+Box(Box(771)),
+Box(Box(772)),
+Box(Box(773)),
+Box(Box(774)),
+Box(Box(775)),
+Box(Box(776)),
+Box(Box(777)),
+Box(Box(778)),
+Box(Box(779)),
+Box(Box(780)),
+Box(Box(781)),
+Box(Box(782)),
+Box(Box(783)),
+Box(Box(784)),
+Box(Box(785)),
+Box(Box(786)),
+Box(Box(787)),
+Box(Box(788)),
+Box(Box(789)),
+Box(Box(790)),
+Box(Box(791)),
+Box(Box(792)),
+Box(Box(793)),
+Box(Box(794)),
+Box(Box(795)),
+Box(Box(796)),
+Box(Box(797)),
+Box(Box(798)),
+Box(Box(799)),
+Box(Box(800)),
+Box(Box(801)),
+Box(Box(802)),
+Box(Box(803)),
+Box(Box(804)),
+Box(Box(805)),
+Box(Box(806)),
+Box(Box(807)),
+Box(Box(808)),
+Box(Box(809)),
+Box(Box(810)),
+Box(Box(811)),
+Box(Box(812)),
+Box(Box(813)),
+Box(Box(814)),
+Box(Box(815)),
+Box(Box(816)),
+Box(Box(817)),
+Box(Box(818)),
+Box(Box(819)),
+Box(Box(820)),
+Box(Box(821)),
+Box(Box(822)),
+Box(Box(823)),
+Box(Box(824)),
+Box(Box(825)),
+Box(Box(826)),
+Box(Box(827)),
+Box(Box(828)),
+Box(Box(829)),
+Box(Box(830)),
+Box(Box(831)),
+Box(Box(832)),
+Box(Box(833)),
+Box(Box(834)),
+Box(Box(835)),
+Box(Box(836)),
+Box(Box(837)),
+Box(Box(838)),
+Box(Box(839)),
+Box(Box(840)),
+Box(Box(841)),
+Box(Box(842)),
+Box(Box(843)),
+Box(Box(844)),
+Box(Box(845)),
+Box(Box(846)),
+Box(Box(847)),
+Box(Box(848)),
+Box(Box(849)),
+Box(Box(850)),
+Box(Box(851)),
+Box(Box(852)),
+Box(Box(853)),
+Box(Box(854)),
+Box(Box(855)),
+Box(Box(856)),
+Box(Box(857)),
+Box(Box(858)),
+Box(Box(859)),
+Box(Box(860)),
+Box(Box(861)),
+Box(Box(862)),
+Box(Box(863)),
+Box(Box(864)),
+Box(Box(865)),
+Box(Box(866)),
+Box(Box(867)),
+Box(Box(868)),
+Box(Box(869)),
+Box(Box(870)),
+Box(Box(871)),
+Box(Box(872)),
+Box(Box(873)),
+Box(Box(874)),
+Box(Box(875)),
+Box(Box(876)),
+Box(Box(877)),
+Box(Box(878)),
+Box(Box(879)),
+Box(Box(880)),
+Box(Box(881)),
+Box(Box(882)),
+Box(Box(883)),
+Box(Box(884)),
+Box(Box(885)),
+Box(Box(886)),
+Box(Box(887)),
+Box(Box(888)),
+Box(Box(889)),
+Box(Box(890)),
+Box(Box(891)),
+Box(Box(892)),
+Box(Box(893)),
+Box(Box(894)),
+Box(Box(895)),
+Box(Box(896)),
+Box(Box(897)),
+Box(Box(898)),
+Box(Box(899)),
+Box(Box(900)),
+Box(Box(901)),
+Box(Box(902)),
+Box(Box(903)),
+Box(Box(904)),
+Box(Box(905)),
+Box(Box(906)),
+Box(Box(907)),
+Box(Box(908)),
+Box(Box(909)),
+Box(Box(910)),
+Box(Box(911)),
+Box(Box(912)),
+Box(Box(913)),
+Box(Box(914)),
+Box(Box(915)),
+Box(Box(916)),
+Box(Box(917)),
+Box(Box(918)),
+Box(Box(919)),
+Box(Box(920)),
+Box(Box(921)),
+Box(Box(922)),
+Box(Box(923)),
+Box(Box(924)),
+Box(Box(925)),
+Box(Box(926)),
+Box(Box(927)),
+Box(Box(928)),
+Box(Box(929)),
+Box(Box(930)),
+Box(Box(931)),
+Box(Box(932)),
+Box(Box(933)),
+Box(Box(934)),
+Box(Box(935)),
+Box(Box(936)),
+Box(Box(937)),
+Box(Box(938)),
+Box(Box(939)),
+Box(Box(940)),
+Box(Box(941)),
+Box(Box(942)),
+Box(Box(943)),
+Box(Box(944)),
+Box(Box(945)),
+Box(Box(946)),
+Box(Box(947)),
+Box(Box(948)),
+Box(Box(949)),
+Box(Box(950)),
+Box(Box(951)),
+Box(Box(952)),
+Box(Box(953)),
+Box(Box(954)),
+Box(Box(955)),
+Box(Box(956)),
+Box(Box(957)),
+Box(Box(958)),
+Box(Box(959)),
+Box(Box(960)),
+Box(Box(961)),
+Box(Box(962)),
+Box(Box(963)),
+Box(Box(964)),
+Box(Box(965)),
+Box(Box(966)),
+Box(Box(967)),
+Box(Box(968)),
+Box(Box(969)),
+Box(Box(970)),
+Box(Box(971)),
+Box(Box(972)),
+Box(Box(973)),
+Box(Box(974)),
+Box(Box(975)),
+Box(Box(976)),
+Box(Box(977)),
+Box(Box(978)),
+Box(Box(979)),
+Box(Box(980)),
+Box(Box(981)),
+Box(Box(982)),
+Box(Box(983)),
+Box(Box(984)),
+Box(Box(985)),
+Box(Box(986)),
+Box(Box(987)),
+Box(Box(988)),
+Box(Box(989)),
+Box(Box(990)),
+Box(Box(991)),
+Box(Box(992)),
+Box(Box(993)),
+Box(Box(994)),
+Box(Box(995)),
+Box(Box(996)),
+Box(Box(997)),
+Box(Box(998)),
+Box(Box(999)),
+Box(Box(1000)),
+Box(Box(1001)),
+Box(Box(1002)),
+Box(Box(1003)),
+Box(Box(1004)),
+Box(Box(1005)),
+Box(Box(1006)),
+Box(Box(1007)),
+Box(Box(1008)),
+Box(Box(1009)),
+Box(Box(1010)),
+Box(Box(1011)),
+Box(Box(1012)),
+Box(Box(1013)),
+Box(Box(1014)),
+Box(Box(1015)),
+Box(Box(1016)),
+Box(Box(1017)),
+Box(Box(1018)),
+Box(Box(1019)),
+Box(Box(1020)),
+Box(Box(1021)),
+Box(Box(1022)),
+Box(Box(1023)),
+Box(Box(1024)),
+Box(Box(1025)),
+Box(Box(1026)),
+Box(Box(1027)),
+Box(Box(1028)),
+Box(Box(1029)),
+Box(Box(1030)),
+Box(Box(1031)),
+Box(Box(1032)),
+Box(Box(1033)),
+Box(Box(1034)),
+Box(Box(1035)),
+Box(Box(1036)),
+Box(Box(1037)),
+Box(Box(1038)),
+Box(Box(1039)),
+Box(Box(1040)),
+Box(Box(1041)),
+Box(Box(1042)),
+Box(Box(1043)),
+Box(Box(1044)),
+Box(Box(1045)),
+Box(Box(1046)),
+Box(Box(1047)),
+Box(Box(1048)),
+Box(Box(1049)),
+Box(Box(1050)),
+Box(Box(1051)),
+Box(Box(1052)),
+Box(Box(1053)),
+Box(Box(1054)),
+Box(Box(1055)),
+Box(Box(1056)),
+Box(Box(1057)),
+Box(Box(1058)),
+Box(Box(1059)),
+Box(Box(1060)),
+Box(Box(1061)),
+Box(Box(1062)),
+Box(Box(1063)),
+Box(Box(1064)),
+Box(Box(1065)),
+Box(Box(1066)),
+Box(Box(1067)),
+Box(Box(1068)),
+Box(Box(1069)),
+Box(Box(1070)),
+Box(Box(1071)),
+Box(Box(1072)),
+Box(Box(1073)),
+Box(Box(1074)),
+Box(Box(1075)),
+Box(Box(1076)),
+Box(Box(1077)),
+Box(Box(1078)),
+Box(Box(1079)),
+Box(Box(1080)),
+Box(Box(1081)),
+Box(Box(1082)),
+Box(Box(1083)),
+Box(Box(1084)),
+Box(Box(1085)),
+Box(Box(1086)),
+Box(Box(1087)),
+Box(Box(1088)),
+Box(Box(1089)),
+Box(Box(1090)),
+Box(Box(1091)),
+Box(Box(1092)),
+Box(Box(1093)),
+Box(Box(1094)),
+Box(Box(1095)),
+Box(Box(1096)),
+Box(Box(1097)),
+Box(Box(1098)),
+Box(Box(1099)),
+Box(Box(1100)),
+Box(Box(1101)),
+Box(Box(1102)),
+Box(Box(1103)),
+Box(Box(1104)),
+Box(Box(1105)),
+Box(Box(1106)),
+Box(Box(1107)),
+Box(Box(1108)),
+Box(Box(1109)),
+Box(Box(1110)),
+Box(Box(1111)),
+Box(Box(1112)),
+Box(Box(1113)),
+Box(Box(1114)),
+Box(Box(1115)),
+Box(Box(1116)),
+Box(Box(1117)),
+Box(Box(1118)),
+Box(Box(1119)),
+Box(Box(1120)),
+Box(Box(1121)),
+Box(Box(1122)),
+Box(Box(1123)),
+Box(Box(1124)),
+Box(Box(1125)),
+Box(Box(1126)),
+Box(Box(1127)),
+Box(Box(1128)),
+Box(Box(1129)),
+Box(Box(1130)),
+Box(Box(1131)),
+Box(Box(1132)),
+Box(Box(1133)),
+Box(Box(1134)),
+Box(Box(1135)),
+Box(Box(1136)),
+Box(Box(1137)),
+Box(Box(1138)),
+Box(Box(1139)),
+Box(Box(1140)),
+Box(Box(1141)),
+Box(Box(1142)),
+Box(Box(1143)),
+Box(Box(1144)),
+Box(Box(1145)),
+Box(Box(1146)),
+Box(Box(1147)),
+Box(Box(1148)),
+Box(Box(1149)),
+Box(Box(1150)),
+Box(Box(1151)),
+Box(Box(1152)),
+Box(Box(1153)),
+Box(Box(1154)),
+Box(Box(1155)),
+Box(Box(1156)),
+Box(Box(1157)),
+Box(Box(1158)),
+Box(Box(1159)),
+Box(Box(1160)),
+Box(Box(1161)),
+Box(Box(1162)),
+Box(Box(1163)),
+Box(Box(1164)),
+Box(Box(1165)),
+Box(Box(1166)),
+Box(Box(1167)),
+Box(Box(1168)),
+Box(Box(1169)),
+Box(Box(1170)),
+Box(Box(1171)),
+Box(Box(1172)),
+Box(Box(1173)),
+Box(Box(1174)),
+Box(Box(1175)),
+Box(Box(1176)),
+Box(Box(1177)),
+Box(Box(1178)),
+Box(Box(1179)),
+Box(Box(1180)),
+Box(Box(1181)),
+Box(Box(1182)),
+Box(Box(1183)),
+Box(Box(1184)),
+Box(Box(1185)),
+Box(Box(1186)),
+Box(Box(1187)),
+Box(Box(1188)),
+Box(Box(1189)),
+Box(Box(1190)),
+Box(Box(1191)),
+Box(Box(1192)),
+Box(Box(1193)),
+Box(Box(1194)),
+Box(Box(1195)),
+Box(Box(1196)),
+Box(Box(1197)),
+Box(Box(1198)),
+Box(Box(1199)),
+Box(Box(1200)),
+Box(Box(1201)),
+Box(Box(1202)),
+Box(Box(1203)),
+Box(Box(1204)),
+Box(Box(1205)),
+Box(Box(1206)),
+Box(Box(1207)),
+Box(Box(1208)),
+Box(Box(1209)),
+Box(Box(1210)),
+Box(Box(1211)),
+Box(Box(1212)),
+Box(Box(1213)),
+Box(Box(1214)),
+Box(Box(1215)),
+Box(Box(1216)),
+Box(Box(1217)),
+Box(Box(1218)),
+Box(Box(1219)),
+Box(Box(1220)),
+Box(Box(1221)),
+Box(Box(1222)),
+Box(Box(1223)),
+Box(Box(1224)),
+Box(Box(1225)),
+Box(Box(1226)),
+Box(Box(1227)),
+Box(Box(1228)),
+Box(Box(1229)),
+Box(Box(1230)),
+Box(Box(1231)),
+Box(Box(1232)),
+Box(Box(1233)),
+Box(Box(1234)),
+Box(Box(1235)),
+Box(Box(1236)),
+Box(Box(1237)),
+Box(Box(1238)),
+Box(Box(1239)),
+Box(Box(1240)),
+Box(Box(1241)),
+Box(Box(1242)),
+Box(Box(1243)),
+Box(Box(1244)),
+Box(Box(1245)),
+Box(Box(1246)),
+Box(Box(1247)),
+Box(Box(1248)),
+Box(Box(1249)),
+Box(Box(1250)),
+Box(Box(1251)),
+Box(Box(1252)),
+Box(Box(1253)),
+Box(Box(1254)),
+Box(Box(1255)),
+Box(Box(1256)),
+Box(Box(1257)),
+Box(Box(1258)),
+Box(Box(1259)),
+Box(Box(1260)),
+Box(Box(1261)),
+Box(Box(1262)),
+Box(Box(1263)),
+Box(Box(1264)),
+Box(Box(1265)),
+Box(Box(1266)),
+Box(Box(1267)),
+Box(Box(1268)),
+Box(Box(1269)),
+Box(Box(1270)),
+Box(Box(1271)),
+Box(Box(1272)),
+Box(Box(1273)),
+Box(Box(1274)),
+Box(Box(1275)),
+Box(Box(1276)),
+Box(Box(1277)),
+Box(Box(1278)),
+Box(Box(1279)),
+Box(Box(1280)),
+Box(Box(1281)),
+Box(Box(1282)),
+Box(Box(1283)),
+Box(Box(1284)),
+Box(Box(1285)),
+Box(Box(1286)),
+Box(Box(1287)),
+Box(Box(1288)),
+Box(Box(1289)),
+Box(Box(1290)),
+Box(Box(1291)),
+Box(Box(1292)),
+Box(Box(1293)),
+Box(Box(1294)),
+Box(Box(1295)),
+Box(Box(1296)),
+Box(Box(1297)),
+Box(Box(1298)),
+Box(Box(1299)),
+Box(Box(1300)),
+Box(Box(1301)),
+Box(Box(1302)),
+Box(Box(1303)),
+Box(Box(1304)),
+Box(Box(1305)),
+Box(Box(1306)),
+Box(Box(1307)),
+Box(Box(1308)),
+Box(Box(1309)),
+Box(Box(1310)),
+Box(Box(1311)),
+Box(Box(1312)),
+Box(Box(1313)),
+Box(Box(1314)),
+Box(Box(1315)),
+Box(Box(1316)),
+Box(Box(1317)),
+Box(Box(1318)),
+Box(Box(1319)),
+Box(Box(1320)),
+Box(Box(1321)),
+Box(Box(1322)),
+Box(Box(1323)),
+Box(Box(1324)),
+Box(Box(1325)),
+Box(Box(1326)),
+Box(Box(1327)),
+Box(Box(1328)),
+Box(Box(1329)),
+Box(Box(1330)),
+Box(Box(1331)),
+Box(Box(1332)),
+Box(Box(1333)),
+Box(Box(1334)),
+Box(Box(1335)),
+Box(Box(1336)),
+Box(Box(1337)),
+Box(Box(1338)),
+Box(Box(1339)),
+Box(Box(1340)),
+Box(Box(1341)),
+Box(Box(1342)),
+Box(Box(1343)),
+Box(Box(1344)),
+Box(Box(1345)),
+Box(Box(1346)),
+Box(Box(1347)),
+Box(Box(1348)),
+Box(Box(1349)),
+Box(Box(1350)),
+Box(Box(1351)),
+Box(Box(1352)),
+Box(Box(1353)),
+Box(Box(1354)),
+Box(Box(1355)),
+Box(Box(1356)),
+Box(Box(1357)),
+Box(Box(1358)),
+Box(Box(1359)),
+Box(Box(1360)),
+Box(Box(1361)),
+Box(Box(1362)),
+Box(Box(1363)),
+Box(Box(1364)),
+Box(Box(1365)),
+Box(Box(1366)),
+Box(Box(1367)),
+Box(Box(1368)),
+Box(Box(1369)),
+Box(Box(1370)),
+Box(Box(1371)),
+Box(Box(1372)),
+Box(Box(1373)),
+Box(Box(1374)),
+Box(Box(1375)),
+Box(Box(1376)),
+Box(Box(1377)),
+Box(Box(1378)),
+Box(Box(1379)),
+Box(Box(1380)),
+Box(Box(1381)),
+Box(Box(1382)),
+Box(Box(1383)),
+Box(Box(1384)),
+Box(Box(1385)),
+Box(Box(1386)),
+Box(Box(1387)),
+Box(Box(1388)),
+Box(Box(1389)),
+Box(Box(1390)),
+Box(Box(1391)),
+Box(Box(1392)),
+Box(Box(1393)),
+Box(Box(1394)),
+Box(Box(1395)),
+Box(Box(1396)),
+Box(Box(1397)),
+Box(Box(1398)),
+Box(Box(1399)),
+Box(Box(1400)),
+Box(Box(1401)),
+Box(Box(1402)),
+Box(Box(1403)),
+Box(Box(1404)),
+Box(Box(1405)),
+Box(Box(1406)),
+Box(Box(1407)),
+Box(Box(1408)),
+Box(Box(1409)),
+Box(Box(1410)),
+Box(Box(1411)),
+Box(Box(1412)),
+Box(Box(1413)),
+Box(Box(1414)),
+Box(Box(1415)),
+Box(Box(1416)),
+Box(Box(1417)),
+Box(Box(1418)),
+Box(Box(1419)),
+Box(Box(1420)),
+Box(Box(1421)),
+Box(Box(1422)),
+Box(Box(1423)),
+Box(Box(1424)),
+Box(Box(1425)),
+Box(Box(1426)),
+Box(Box(1427)),
+Box(Box(1428)),
+Box(Box(1429)),
+Box(Box(1430)),
+Box(Box(1431)),
+Box(Box(1432)),
+Box(Box(1433)),
+Box(Box(1434)),
+Box(Box(1435)),
+Box(Box(1436)),
+Box(Box(1437)),
+Box(Box(1438)),
+Box(Box(1439)),
+Box(Box(1440)),
+Box(Box(1441)),
+Box(Box(1442)),
+Box(Box(1443)),
+Box(Box(1444)),
+Box(Box(1445)),
+Box(Box(1446)),
+Box(Box(1447)),
+Box(Box(1448)),
+Box(Box(1449)),
+Box(Box(1450)),
+Box(Box(1451)),
+Box(Box(1452)),
+Box(Box(1453)),
+Box(Box(1454)),
+Box(Box(1455)),
+Box(Box(1456)),
+Box(Box(1457)),
+Box(Box(1458)),
+Box(Box(1459)),
+Box(Box(1460)),
+Box(Box(1461)),
+Box(Box(1462)),
+Box(Box(1463)),
+Box(Box(1464)),
+Box(Box(1465)),
+Box(Box(1466)),
+Box(Box(1467)),
+Box(Box(1468)),
+Box(Box(1469)),
+Box(Box(1470)),
+Box(Box(1471)),
+Box(Box(1472)),
+Box(Box(1473)),
+Box(Box(1474)),
+Box(Box(1475)),
+Box(Box(1476)),
+Box(Box(1477)),
+Box(Box(1478)),
+Box(Box(1479)),
+Box(Box(1480)),
+Box(Box(1481)),
+Box(Box(1482)),
+Box(Box(1483)),
+Box(Box(1484)),
+Box(Box(1485)),
+Box(Box(1486)),
+Box(Box(1487)),
+Box(Box(1488)),
+Box(Box(1489)),
+Box(Box(1490)),
+Box(Box(1491)),
+Box(Box(1492)),
+Box(Box(1493)),
+Box(Box(1494)),
+Box(Box(1495)),
+Box(Box(1496)),
+Box(Box(1497)),
+Box(Box(1498)),
+Box(Box(1499)),
+Box(Box(1500)),
+Box(Box(1501)),
+Box(Box(1502)),
+Box(Box(1503)),
+Box(Box(1504)),
+Box(Box(1505)),
+Box(Box(1506)),
+Box(Box(1507)),
+Box(Box(1508)),
+Box(Box(1509)),
+Box(Box(1510)),
+Box(Box(1511)),
+Box(Box(1512)),
+Box(Box(1513)),
+Box(Box(1514)),
+Box(Box(1515)),
+Box(Box(1516)),
+Box(Box(1517)),
+Box(Box(1518)),
+Box(Box(1519)),
+Box(Box(1520)),
+Box(Box(1521)),
+Box(Box(1522)),
+Box(Box(1523)),
+Box(Box(1524)),
+Box(Box(1525)),
+Box(Box(1526)),
+Box(Box(1527)),
+Box(Box(1528)),
+Box(Box(1529)),
+Box(Box(1530)),
+Box(Box(1531)),
+Box(Box(1532)),
+Box(Box(1533)),
+Box(Box(1534)),
+Box(Box(1535)),
+Box(Box(1536)),
+Box(Box(1537)),
+Box(Box(1538)),
+Box(Box(1539)),
+Box(Box(1540)),
+Box(Box(1541)),
+Box(Box(1542)),
+Box(Box(1543)),
+Box(Box(1544)),
+Box(Box(1545)),
+Box(Box(1546)),
+Box(Box(1547)),
+Box(Box(1548)),
+Box(Box(1549)),
+Box(Box(1550)),
+Box(Box(1551)),
+Box(Box(1552)),
+Box(Box(1553)),
+Box(Box(1554)),
+Box(Box(1555)),
+Box(Box(1556)),
+Box(Box(1557)),
+Box(Box(1558)),
+Box(Box(1559)),
+Box(Box(1560)),
+Box(Box(1561)),
+Box(Box(1562)),
+Box(Box(1563)),
+Box(Box(1564)),
+Box(Box(1565)),
+Box(Box(1566)),
+Box(Box(1567)),
+Box(Box(1568)),
+Box(Box(1569)),
+Box(Box(1570)),
+Box(Box(1571)),
+Box(Box(1572)),
+Box(Box(1573)),
+Box(Box(1574)),
+Box(Box(1575)),
+Box(Box(1576)),
+Box(Box(1577)),
+Box(Box(1578)),
+Box(Box(1579)),
+Box(Box(1580)),
+Box(Box(1581)),
+Box(Box(1582)),
+Box(Box(1583)),
+Box(Box(1584)),
+Box(Box(1585)),
+Box(Box(1586)),
+Box(Box(1587)),
+Box(Box(1588)),
+Box(Box(1589)),
+Box(Box(1590)),
+Box(Box(1591)),
+Box(Box(1592)),
+Box(Box(1593)),
+Box(Box(1594)),
+Box(Box(1595)),
+Box(Box(1596)),
+Box(Box(1597)),
+Box(Box(1598)),
+Box(Box(1599)),
+Box(Box(1600)),
+Box(Box(1601)),
+Box(Box(1602)),
+Box(Box(1603)),
+Box(Box(1604)),
+Box(Box(1605)),
+Box(Box(1606)),
+Box(Box(1607)),
+Box(Box(1608)),
+Box(Box(1609)),
+Box(Box(1610)),
+Box(Box(1611)),
+Box(Box(1612)),
+Box(Box(1613)),
+Box(Box(1614)),
+Box(Box(1615)),
+Box(Box(1616)),
+Box(Box(1617)),
+Box(Box(1618)),
+Box(Box(1619)),
+Box(Box(1620)),
+Box(Box(1621)),
+Box(Box(1622)),
+Box(Box(1623)),
+Box(Box(1624)),
+Box(Box(1625)),
+Box(Box(1626)),
+Box(Box(1627)),
+Box(Box(1628)),
+Box(Box(1629)),
+Box(Box(1630)),
+Box(Box(1631)),
+Box(Box(1632)),
+Box(Box(1633)),
+Box(Box(1634)),
+Box(Box(1635)),
+Box(Box(1636)),
+Box(Box(1637)),
+Box(Box(1638)),
+Box(Box(1639)),
+Box(Box(1640)),
+Box(Box(1641)),
+Box(Box(1642)),
+Box(Box(1643)),
+Box(Box(1644)),
+Box(Box(1645)),
+Box(Box(1646)),
+Box(Box(1647)),
+Box(Box(1648)),
+Box(Box(1649)),
+Box(Box(1650)),
+Box(Box(1651)),
+Box(Box(1652)),
+Box(Box(1653)),
+Box(Box(1654)),
+Box(Box(1655)),
+Box(Box(1656)),
+Box(Box(1657)),
+Box(Box(1658)),
+Box(Box(1659)),
+Box(Box(1660)),
+Box(Box(1661)),
+Box(Box(1662)),
+Box(Box(1663)),
+Box(Box(1664)),
+Box(Box(1665)),
+Box(Box(1666)),
+Box(Box(1667)),
+Box(Box(1668)),
+Box(Box(1669)),
+Box(Box(1670)),
+Box(Box(1671)),
+Box(Box(1672)),
+Box(Box(1673)),
+Box(Box(1674)),
+Box(Box(1675)),
+Box(Box(1676)),
+Box(Box(1677)),
+Box(Box(1678)),
+Box(Box(1679)),
+Box(Box(1680)),
+Box(Box(1681)),
+Box(Box(1682)),
+Box(Box(1683)),
+Box(Box(1684)),
+Box(Box(1685)),
+Box(Box(1686)),
+Box(Box(1687)),
+Box(Box(1688)),
+Box(Box(1689)),
+Box(Box(1690)),
+Box(Box(1691)),
+Box(Box(1692)),
+Box(Box(1693)),
+Box(Box(1694)),
+Box(Box(1695)),
+Box(Box(1696)),
+Box(Box(1697)),
+Box(Box(1698)),
+Box(Box(1699)),
+Box(Box(1700)),
+Box(Box(1701)),
+Box(Box(1702)),
+Box(Box(1703)),
+Box(Box(1704)),
+Box(Box(1705)),
+Box(Box(1706)),
+Box(Box(1707)),
+Box(Box(1708)),
+Box(Box(1709)),
+Box(Box(1710)),
+Box(Box(1711)),
+Box(Box(1712)),
+Box(Box(1713)),
+Box(Box(1714)),
+Box(Box(1715)),
+Box(Box(1716)),
+Box(Box(1717)),
+Box(Box(1718)),
+Box(Box(1719)),
+Box(Box(1720)),
+Box(Box(1721)),
+Box(Box(1722)),
+Box(Box(1723)),
+Box(Box(1724)),
+Box(Box(1725)),
+Box(Box(1726)),
+Box(Box(1727)),
+Box(Box(1728)),
+Box(Box(1729)),
+Box(Box(1730)),
+Box(Box(1731)),
+Box(Box(1732)),
+Box(Box(1733)),
+Box(Box(1734)),
+Box(Box(1735)),
+Box(Box(1736)),
+Box(Box(1737)),
+Box(Box(1738)),
+Box(Box(1739)),
+Box(Box(1740)),
+Box(Box(1741)),
+Box(Box(1742)),
+Box(Box(1743)),
+Box(Box(1744)),
+Box(Box(1745)),
+Box(Box(1746)),
+Box(Box(1747)),
+Box(Box(1748)),
+Box(Box(1749)),
+Box(Box(1750)),
+Box(Box(1751)),
+Box(Box(1752)),
+Box(Box(1753)),
+Box(Box(1754)),
+Box(Box(1755)),
+Box(Box(1756)),
+Box(Box(1757)),
+Box(Box(1758)),
+Box(Box(1759)),
+Box(Box(1760)),
+Box(Box(1761)),
+Box(Box(1762)),
+Box(Box(1763)),
+Box(Box(1764)),
+Box(Box(1765)),
+Box(Box(1766)),
+Box(Box(1767)),
+Box(Box(1768)),
+Box(Box(1769)),
+Box(Box(1770)),
+Box(Box(1771)),
+Box(Box(1772)),
+Box(Box(1773)),
+Box(Box(1774)),
+Box(Box(1775)),
+Box(Box(1776)),
+Box(Box(1777)),
+Box(Box(1778)),
+Box(Box(1779)),
+Box(Box(1780)),
+Box(Box(1781)),
+Box(Box(1782)),
+Box(Box(1783)),
+Box(Box(1784)),
+Box(Box(1785)),
+Box(Box(1786)),
+Box(Box(1787)),
+Box(Box(1788)),
+Box(Box(1789)),
+Box(Box(1790)),
+Box(Box(1791)),
+Box(Box(1792)),
+Box(Box(1793)),
+Box(Box(1794)),
+Box(Box(1795)),
+Box(Box(1796)),
+Box(Box(1797)),
+Box(Box(1798)),
+Box(Box(1799)),
+Box(Box(1800)),
+Box(Box(1801)),
+Box(Box(1802)),
+Box(Box(1803)),
+Box(Box(1804)),
+Box(Box(1805)),
+Box(Box(1806)),
+Box(Box(1807)),
+Box(Box(1808)),
+Box(Box(1809)),
+Box(Box(1810)),
+Box(Box(1811)),
+Box(Box(1812)),
+Box(Box(1813)),
+Box(Box(1814)),
+Box(Box(1815)),
+Box(Box(1816)),
+Box(Box(1817)),
+Box(Box(1818)),
+Box(Box(1819)),
+Box(Box(1820)),
+Box(Box(1821)),
+Box(Box(1822)),
+Box(Box(1823)),
+Box(Box(1824)),
+Box(Box(1825)),
+Box(Box(1826)),
+Box(Box(1827)),
+Box(Box(1828)),
+Box(Box(1829)),
+Box(Box(1830)),
+Box(Box(1831)),
+Box(Box(1832)),
+Box(Box(1833)),
+Box(Box(1834)),
+Box(Box(1835)),
+Box(Box(1836)),
+Box(Box(1837)),
+Box(Box(1838)),
+Box(Box(1839)),
+Box(Box(1840)),
+Box(Box(1841)),
+Box(Box(1842)),
+Box(Box(1843)),
+Box(Box(1844)),
+Box(Box(1845)),
+Box(Box(1846)),
+Box(Box(1847)),
+Box(Box(1848)),
+Box(Box(1849)),
+Box(Box(1850)),
+Box(Box(1851)),
+Box(Box(1852)),
+Box(Box(1853)),
+Box(Box(1854)),
+Box(Box(1855)),
+Box(Box(1856)),
+Box(Box(1857)),
+Box(Box(1858)),
+Box(Box(1859)),
+Box(Box(1860)),
+Box(Box(1861)),
+Box(Box(1862)),
+Box(Box(1863)),
+Box(Box(1864)),
+Box(Box(1865)),
+Box(Box(1866)),
+Box(Box(1867)),
+Box(Box(1868)),
+Box(Box(1869)),
+Box(Box(1870)),
+Box(Box(1871)),
+Box(Box(1872)),
+Box(Box(1873)),
+Box(Box(1874)),
+Box(Box(1875)),
+Box(Box(1876)),
+Box(Box(1877)),
+Box(Box(1878)),
+Box(Box(1879)),
+Box(Box(1880)),
+Box(Box(1881)),
+Box(Box(1882)),
+Box(Box(1883)),
+Box(Box(1884)),
+Box(Box(1885)),
+Box(Box(1886)),
+Box(Box(1887)),
+Box(Box(1888)),
+Box(Box(1889)),
+Box(Box(1890)),
+Box(Box(1891)),
+Box(Box(1892)),
+Box(Box(1893)),
+Box(Box(1894)),
+Box(Box(1895)),
+Box(Box(1896)),
+Box(Box(1897)),
+Box(Box(1898)),
+Box(Box(1899)),
+Box(Box(1900)),
+Box(Box(1901)),
+Box(Box(1902)),
+Box(Box(1903)),
+Box(Box(1904)),
+Box(Box(1905)),
+Box(Box(1906)),
+Box(Box(1907)),
+Box(Box(1908)),
+Box(Box(1909)),
+Box(Box(1910)),
+Box(Box(1911)),
+Box(Box(1912)),
+Box(Box(1913)),
+Box(Box(1914)),
+Box(Box(1915)),
+Box(Box(1916)),
+Box(Box(1917)),
+Box(Box(1918)),
+Box(Box(1919)),
+Box(Box(1920)),
+Box(Box(1921)),
+Box(Box(1922)),
+Box(Box(1923)),
+Box(Box(1924)),
+Box(Box(1925)),
+Box(Box(1926)),
+Box(Box(1927)),
+Box(Box(1928)),
+Box(Box(1929)),
+Box(Box(1930)),
+Box(Box(1931)),
+Box(Box(1932)),
+Box(Box(1933)),
+Box(Box(1934)),
+Box(Box(1935)),
+Box(Box(1936)),
+Box(Box(1937)),
+Box(Box(1938)),
+Box(Box(1939)),
+Box(Box(1940)),
+Box(Box(1941)),
+Box(Box(1942)),
+Box(Box(1943)),
+Box(Box(1944)),
+Box(Box(1945)),
+Box(Box(1946)),
+Box(Box(1947)),
+Box(Box(1948)),
+Box(Box(1949)),
+Box(Box(1950)),
+Box(Box(1951)),
+Box(Box(1952)),
+Box(Box(1953)),
+Box(Box(1954)),
+Box(Box(1955)),
+Box(Box(1956)),
+Box(Box(1957)),
+Box(Box(1958)),
+Box(Box(1959)),
+Box(Box(1960)),
+Box(Box(1961)),
+Box(Box(1962)),
+Box(Box(1963)),
+Box(Box(1964)),
+Box(Box(1965)),
+Box(Box(1966)),
+Box(Box(1967)),
+Box(Box(1968)),
+Box(Box(1969)),
+Box(Box(1970)),
+Box(Box(1971)),
+Box(Box(1972)),
+Box(Box(1973)),
+Box(Box(1974)),
+Box(Box(1975)),
+Box(Box(1976)),
+Box(Box(1977)),
+Box(Box(1978)),
+Box(Box(1979)),
+Box(Box(1980)),
+Box(Box(1981)),
+Box(Box(1982)),
+Box(Box(1983)),
+Box(Box(1984)),
+Box(Box(1985)),
+Box(Box(1986)),
+Box(Box(1987)),
+Box(Box(1988)),
+Box(Box(1989)),
+Box(Box(1990)),
+Box(Box(1991)),
+Box(Box(1992)),
+Box(Box(1993)),
+Box(Box(1994)),
+Box(Box(1995)),
+Box(Box(1996)),
+Box(Box(1997)),
+Box(Box(1998)),
+Box(Box(1999)),
+Box(Box(2000)),
+Box(Box(2001)),
+Box(Box(2002)),
+Box(Box(2003)),
+Box(Box(2004)),
+Box(Box(2005)),
+Box(Box(2006)),
+Box(Box(2007)),
+Box(Box(2008)),
+Box(Box(2009)),
+Box(Box(2010)),
+Box(Box(2011)),
+Box(Box(2012)),
+Box(Box(2013)),
+Box(Box(2014)),
+Box(Box(2015)),
+Box(Box(2016)),
+Box(Box(2017)),
+Box(Box(2018)),
+Box(Box(2019)),
+Box(Box(2020)),
+Box(Box(2021)),
+Box(Box(2022)),
+Box(Box(2023)),
+Box(Box(2024)),
+Box(Box(2025)),
+Box(Box(2026)),
+Box(Box(2027)),
+Box(Box(2028)),
+Box(Box(2029)),
+Box(Box(2030)),
+Box(Box(2031)),
+Box(Box(2032)),
+Box(Box(2033)),
+Box(Box(2034)),
+Box(Box(2035)),
+Box(Box(2036)),
+Box(Box(2037)),
+Box(Box(2038)),
+Box(Box(2039)),
+Box(Box(2040)),
+Box(Box(2041)),
+Box(Box(2042)),
+Box(Box(2043)),
+Box(Box(2044)),
+Box(Box(2045)),
+Box(Box(2046)),
+Box(Box(2047)),
+Box(Box(2048)),
+Box(Box(2049)),
+Box(Box(2050)),
+Box(Box(2051)),
+Box(Box(2052)),
+Box(Box(2053)),
+Box(Box(2054)),
+Box(Box(2055)),
+Box(Box(2056)),
+Box(Box(2057)),
+Box(Box(2058)),
+Box(Box(2059)),
+Box(Box(2060)),
+Box(Box(2061)),
+Box(Box(2062)),
+Box(Box(2063)),
+Box(Box(2064)),
+Box(Box(2065)),
+Box(Box(2066)),
+Box(Box(2067)),
+Box(Box(2068)),
+Box(Box(2069)),
+Box(Box(2070)),
+Box(Box(2071)),
+Box(Box(2072)),
+Box(Box(2073)),
+Box(Box(2074)),
+Box(Box(2075)),
+Box(Box(2076)),
+Box(Box(2077)),
+Box(Box(2078)),
+Box(Box(2079)),
+Box(Box(2080)),
+Box(Box(2081)),
+Box(Box(2082)),
+Box(Box(2083)),
+Box(Box(2084)),
+Box(Box(2085)),
+Box(Box(2086)),
+Box(Box(2087)),
+Box(Box(2088)),
+Box(Box(2089)),
+Box(Box(2090)),
+Box(Box(2091)),
+Box(Box(2092)),
+Box(Box(2093)),
+Box(Box(2094)),
+Box(Box(2095)),
+Box(Box(2096)),
+Box(Box(2097)),
+Box(Box(2098)),
+Box(Box(2099)),
+Box(Box(2100)),
+Box(Box(2101)),
+Box(Box(2102)),
+Box(Box(2103)),
+Box(Box(2104)),
+Box(Box(2105)),
+Box(Box(2106)),
+Box(Box(2107)),
+Box(Box(2108)),
+Box(Box(2109)),
+Box(Box(2110)),
+Box(Box(2111)),
+Box(Box(2112)),
+Box(Box(2113)),
+Box(Box(2114)),
+Box(Box(2115)),
+Box(Box(2116)),
+Box(Box(2117)),
+Box(Box(2118)),
+Box(Box(2119)),
+Box(Box(2120)),
+Box(Box(2121)),
+Box(Box(2122)),
+Box(Box(2123)),
+Box(Box(2124)),
+Box(Box(2125)),
+Box(Box(2126)),
+Box(Box(2127)),
+Box(Box(2128)),
+Box(Box(2129)),
+Box(Box(2130)),
+Box(Box(2131)),
+Box(Box(2132)),
+Box(Box(2133)),
+Box(Box(2134)),
+Box(Box(2135)),
+Box(Box(2136)),
+Box(Box(2137)),
+Box(Box(2138)),
+Box(Box(2139)),
+Box(Box(2140)),
+Box(Box(2141)),
+Box(Box(2142)),
+Box(Box(2143)),
+Box(Box(2144)),
+Box(Box(2145)),
+Box(Box(2146)),
+Box(Box(2147)),
+Box(Box(2148)),
+Box(Box(2149)),
+Box(Box(2150)),
+Box(Box(2151)),
+Box(Box(2152)),
+Box(Box(2153)),
+Box(Box(2154)),
+Box(Box(2155)),
+Box(Box(2156)),
+Box(Box(2157)),
+Box(Box(2158)),
+Box(Box(2159)),
+Box(Box(2160)),
+Box(Box(2161)),
+Box(Box(2162)),
+Box(Box(2163)),
+Box(Box(2164)),
+Box(Box(2165)),
+Box(Box(2166)),
+Box(Box(2167)),
+Box(Box(2168)),
+Box(Box(2169)),
+Box(Box(2170)),
+Box(Box(2171)),
+Box(Box(2172)),
+Box(Box(2173)),
+Box(Box(2174)),
+Box(Box(2175)),
+Box(Box(2176)),
+Box(Box(2177)),
+Box(Box(2178)),
+Box(Box(2179)),
+Box(Box(2180)),
+Box(Box(2181)),
+Box(Box(2182)),
+Box(Box(2183)),
+Box(Box(2184)),
+Box(Box(2185)),
+Box(Box(2186)),
+Box(Box(2187)),
+Box(Box(2188)),
+Box(Box(2189)),
+Box(Box(2190)),
+Box(Box(2191)),
+Box(Box(2192)),
+Box(Box(2193)),
+Box(Box(2194)),
+Box(Box(2195)),
+Box(Box(2196)),
+Box(Box(2197)),
+Box(Box(2198)),
+Box(Box(2199)),
+Box(Box(2200)),
+Box(Box(2201)),
+Box(Box(2202)),
+Box(Box(2203)),
+Box(Box(2204)),
+Box(Box(2205)),
+Box(Box(2206)),
+Box(Box(2207)),
+Box(Box(2208)),
+Box(Box(2209)),
+Box(Box(2210)),
+Box(Box(2211)),
+Box(Box(2212)),
+Box(Box(2213)),
+Box(Box(2214)),
+Box(Box(2215)),
+Box(Box(2216)),
+Box(Box(2217)),
+Box(Box(2218)),
+Box(Box(2219)),
+Box(Box(2220)),
+Box(Box(2221)),
+Box(Box(2222)),
+Box(Box(2223)),
+Box(Box(2224)),
+Box(Box(2225)),
+Box(Box(2226)),
+Box(Box(2227)),
+Box(Box(2228)),
+Box(Box(2229)),
+Box(Box(2230)),
+Box(Box(2231)),
+Box(Box(2232)),
+Box(Box(2233)),
+Box(Box(2234)),
+Box(Box(2235)),
+Box(Box(2236)),
+Box(Box(2237)),
+Box(Box(2238)),
+Box(Box(2239)),
+Box(Box(2240)),
+Box(Box(2241)),
+Box(Box(2242)),
+Box(Box(2243)),
+Box(Box(2244)),
+Box(Box(2245)),
+Box(Box(2246)),
+Box(Box(2247)),
+Box(Box(2248)),
+Box(Box(2249)),
+Box(Box(2250)),
+Box(Box(2251)),
+Box(Box(2252)),
+Box(Box(2253)),
+Box(Box(2254)),
+Box(Box(2255)),
+Box(Box(2256)),
+Box(Box(2257)),
+Box(Box(2258)),
+Box(Box(2259)),
+Box(Box(2260)),
+Box(Box(2261)),
+Box(Box(2262)),
+Box(Box(2263)),
+Box(Box(2264)),
+Box(Box(2265)),
+Box(Box(2266)),
+Box(Box(2267)),
+Box(Box(2268)),
+Box(Box(2269)),
+Box(Box(2270)),
+Box(Box(2271)),
+Box(Box(2272)),
+Box(Box(2273)),
+Box(Box(2274)),
+Box(Box(2275)),
+Box(Box(2276)),
+Box(Box(2277)),
+Box(Box(2278)),
+Box(Box(2279)),
+Box(Box(2280)),
+Box(Box(2281)),
+Box(Box(2282)),
+Box(Box(2283)),
+Box(Box(2284)),
+Box(Box(2285)),
+Box(Box(2286)),
+Box(Box(2287)),
+Box(Box(2288)),
+Box(Box(2289)),
+Box(Box(2290)),
+Box(Box(2291)),
+Box(Box(2292)),
+Box(Box(2293)),
+Box(Box(2294)),
+Box(Box(2295)),
+Box(Box(2296)),
+Box(Box(2297)),
+Box(Box(2298)),
+Box(Box(2299)),
+Box(Box(2300)),
+Box(Box(2301)),
+Box(Box(2302)),
+Box(Box(2303)),
+Box(Box(2304)),
+Box(Box(2305)),
+Box(Box(2306)),
+Box(Box(2307)),
+Box(Box(2308)),
+Box(Box(2309)),
+Box(Box(2310)),
+Box(Box(2311)),
+Box(Box(2312)),
+Box(Box(2313)),
+Box(Box(2314)),
+Box(Box(2315)),
+Box(Box(2316)),
+Box(Box(2317)),
+Box(Box(2318)),
+Box(Box(2319)),
+Box(Box(2320)),
+Box(Box(2321)),
+Box(Box(2322)),
+Box(Box(2323)),
+Box(Box(2324)),
+Box(Box(2325)),
+Box(Box(2326)),
+Box(Box(2327)),
+Box(Box(2328)),
+Box(Box(2329)),
+Box(Box(2330)),
+Box(Box(2331)),
+Box(Box(2332)),
+Box(Box(2333)),
+Box(Box(2334)),
+Box(Box(2335)),
+Box(Box(2336)),
+Box(Box(2337)),
+Box(Box(2338)),
+Box(Box(2339)),
+Box(Box(2340)),
+Box(Box(2341)),
+Box(Box(2342)),
+Box(Box(2343)),
+Box(Box(2344)),
+Box(Box(2345)),
+Box(Box(2346)),
+Box(Box(2347)),
+Box(Box(2348)),
+Box(Box(2349)),
+Box(Box(2350)),
+Box(Box(2351)),
+Box(Box(2352)),
+Box(Box(2353)),
+Box(Box(2354)),
+Box(Box(2355)),
+Box(Box(2356)),
+Box(Box(2357)),
+Box(Box(2358)),
+Box(Box(2359)),
+Box(Box(2360)),
+Box(Box(2361)),
+Box(Box(2362)),
+Box(Box(2363)),
+Box(Box(2364)),
+Box(Box(2365)),
+Box(Box(2366)),
+Box(Box(2367)),
+Box(Box(2368)),
+Box(Box(2369)),
+Box(Box(2370)),
+Box(Box(2371)),
+Box(Box(2372)),
+Box(Box(2373)),
+Box(Box(2374)),
+Box(Box(2375)),
+Box(Box(2376)),
+Box(Box(2377)),
+Box(Box(2378)),
+Box(Box(2379)),
+Box(Box(2380)),
+Box(Box(2381)),
+Box(Box(2382)),
+Box(Box(2383)),
+Box(Box(2384)),
+Box(Box(2385)),
+Box(Box(2386)),
+Box(Box(2387)),
+Box(Box(2388)),
+Box(Box(2389)),
+Box(Box(2390)),
+Box(Box(2391)),
+Box(Box(2392)),
+Box(Box(2393)),
+Box(Box(2394)),
+Box(Box(2395)),
+Box(Box(2396)),
+Box(Box(2397)),
+Box(Box(2398)),
+Box(Box(2399)),
+Box(Box(2400)),
+Box(Box(2401)),
+Box(Box(2402)),
+Box(Box(2403)),
+Box(Box(2404)),
+Box(Box(2405)),
+Box(Box(2406)),
+Box(Box(2407)),
+Box(Box(2408)),
+Box(Box(2409)),
+Box(Box(2410)),
+Box(Box(2411)),
+Box(Box(2412)),
+Box(Box(2413)),
+Box(Box(2414)),
+Box(Box(2415)),
+Box(Box(2416)),
+Box(Box(2417)),
+Box(Box(2418)),
+Box(Box(2419)),
+Box(Box(2420)),
+Box(Box(2421)),
+Box(Box(2422)),
+Box(Box(2423)),
+Box(Box(2424)),
+Box(Box(2425)),
+Box(Box(2426)),
+Box(Box(2427)),
+Box(Box(2428)),
+Box(Box(2429)),
+Box(Box(2430)),
+Box(Box(2431)),
+Box(Box(2432)),
+Box(Box(2433)),
+Box(Box(2434)),
+Box(Box(2435)),
+Box(Box(2436)),
+Box(Box(2437)),
+Box(Box(2438)),
+Box(Box(2439)),
+Box(Box(2440)),
+Box(Box(2441)),
+Box(Box(2442)),
+Box(Box(2443)),
+Box(Box(2444)),
+Box(Box(2445)),
+Box(Box(2446)),
+Box(Box(2447)),
+Box(Box(2448)),
+Box(Box(2449)),
+Box(Box(2450)),
+Box(Box(2451)),
+Box(Box(2452)),
+Box(Box(2453)),
+Box(Box(2454)),
+Box(Box(2455)),
+Box(Box(2456)),
+Box(Box(2457)),
+Box(Box(2458)),
+Box(Box(2459)),
+Box(Box(2460)),
+Box(Box(2461)),
+Box(Box(2462)),
+Box(Box(2463)),
+Box(Box(2464)),
+Box(Box(2465)),
+Box(Box(2466)),
+Box(Box(2467)),
+Box(Box(2468)),
+Box(Box(2469)),
+Box(Box(2470)),
+Box(Box(2471)),
+Box(Box(2472)),
+Box(Box(2473)),
+Box(Box(2474)),
+Box(Box(2475)),
+Box(Box(2476)),
+Box(Box(2477)),
+Box(Box(2478)),
+Box(Box(2479)),
+Box(Box(2480)),
+Box(Box(2481)),
+Box(Box(2482)),
+Box(Box(2483)),
+Box(Box(2484)),
+Box(Box(2485)),
+Box(Box(2486)),
+Box(Box(2487)),
+Box(Box(2488)),
+Box(Box(2489)),
+Box(Box(2490)),
+Box(Box(2491)),
+Box(Box(2492)),
+Box(Box(2493)),
+Box(Box(2494)),
+Box(Box(2495)),
+Box(Box(2496)),
+Box(Box(2497)),
+Box(Box(2498)),
+Box(Box(2499)),
+Box(Box(2500)),
+Box(Box(2501)),
+Box(Box(2502)),
+Box(Box(2503)),
+Box(Box(2504)),
+Box(Box(2505)),
+Box(Box(2506)),
+Box(Box(2507)),
+Box(Box(2508)),
+Box(Box(2509)),
+Box(Box(2510)),
+Box(Box(2511)),
+Box(Box(2512)),
+Box(Box(2513)),
+Box(Box(2514)),
+Box(Box(2515)),
+Box(Box(2516)),
+Box(Box(2517)),
+Box(Box(2518)),
+Box(Box(2519)),
+Box(Box(2520)),
+Box(Box(2521)),
+Box(Box(2522)),
+Box(Box(2523)),
+Box(Box(2524)),
+Box(Box(2525)),
+Box(Box(2526)),
+Box(Box(2527)),
+Box(Box(2528)),
+Box(Box(2529)),
+Box(Box(2530)),
+Box(Box(2531)),
+Box(Box(2532)),
+Box(Box(2533)),
+Box(Box(2534)),
+Box(Box(2535)),
+Box(Box(2536)),
+Box(Box(2537)),
+Box(Box(2538)),
+Box(Box(2539)),
+Box(Box(2540)),
+Box(Box(2541)),
+Box(Box(2542)),
+Box(Box(2543)),
+Box(Box(2544)),
+Box(Box(2545)),
+Box(Box(2546)),
+Box(Box(2547)),
+Box(Box(2548)),
+Box(Box(2549)),
+Box(Box(2550)),
+Box(Box(2551)),
+Box(Box(2552)),
+Box(Box(2553)),
+Box(Box(2554)),
+Box(Box(2555)),
+Box(Box(2556)),
+Box(Box(2557)),
+Box(Box(2558)),
+Box(Box(2559)),
+Box(Box(2560)),
+Box(Box(2561)),
+Box(Box(2562)),
+Box(Box(2563)),
+Box(Box(2564)),
+Box(Box(2565)),
+Box(Box(2566)),
+Box(Box(2567)),
+Box(Box(2568)),
+Box(Box(2569)),
+Box(Box(2570)),
+Box(Box(2571)),
+Box(Box(2572)),
+Box(Box(2573)),
+Box(Box(2574)),
+Box(Box(2575)),
+Box(Box(2576)),
+Box(Box(2577)),
+Box(Box(2578)),
+Box(Box(2579)),
+Box(Box(2580)),
+Box(Box(2581)),
+Box(Box(2582)),
+Box(Box(2583)),
+Box(Box(2584)),
+Box(Box(2585)),
+Box(Box(2586)),
+Box(Box(2587)),
+Box(Box(2588)),
+Box(Box(2589)),
+Box(Box(2590)),
+Box(Box(2591)),
+Box(Box(2592)),
+Box(Box(2593)),
+Box(Box(2594)),
+Box(Box(2595)),
+Box(Box(2596)),
+Box(Box(2597)),
+Box(Box(2598)),
+Box(Box(2599)),
+Box(Box(2600)),
+Box(Box(2601)),
+Box(Box(2602)),
+Box(Box(2603)),
+Box(Box(2604)),
+Box(Box(2605)),
+Box(Box(2606)),
+Box(Box(2607)),
+Box(Box(2608)),
+Box(Box(2609)),
+Box(Box(2610)),
+Box(Box(2611)),
+Box(Box(2612)),
+Box(Box(2613)),
+Box(Box(2614)),
+Box(Box(2615)),
+Box(Box(2616)),
+Box(Box(2617)),
+Box(Box(2618)),
+Box(Box(2619)),
+Box(Box(2620)),
+Box(Box(2621)),
+Box(Box(2622)),
+Box(Box(2623)),
+Box(Box(2624)),
+Box(Box(2625)),
+Box(Box(2626)),
+Box(Box(2627)),
+Box(Box(2628)),
+Box(Box(2629)),
+Box(Box(2630)),
+Box(Box(2631)),
+Box(Box(2632)),
+Box(Box(2633)),
+Box(Box(2634)),
+Box(Box(2635)),
+Box(Box(2636)),
+Box(Box(2637)),
+Box(Box(2638)),
+Box(Box(2639)),
+Box(Box(2640)),
+Box(Box(2641)),
+Box(Box(2642)),
+Box(Box(2643)),
+Box(Box(2644)),
+Box(Box(2645)),
+Box(Box(2646)),
+Box(Box(2647)),
+Box(Box(2648)),
+Box(Box(2649)),
+Box(Box(2650)),
+Box(Box(2651)),
+Box(Box(2652)),
+Box(Box(2653)),
+Box(Box(2654)),
+Box(Box(2655)),
+Box(Box(2656)),
+Box(Box(2657)),
+Box(Box(2658)),
+Box(Box(2659)),
+Box(Box(2660)),
+Box(Box(2661)),
+Box(Box(2662)),
+Box(Box(2663)),
+Box(Box(2664)),
+Box(Box(2665)),
+Box(Box(2666)),
+Box(Box(2667)),
+Box(Box(2668)),
+Box(Box(2669)),
+Box(Box(2670)),
+Box(Box(2671)),
+Box(Box(2672)),
+Box(Box(2673)),
+Box(Box(2674)),
+Box(Box(2675)),
+Box(Box(2676)),
+Box(Box(2677)),
+Box(Box(2678)),
+Box(Box(2679)),
+Box(Box(2680)),
+Box(Box(2681)),
+Box(Box(2682)),
+Box(Box(2683)),
+Box(Box(2684)),
+Box(Box(2685)),
+Box(Box(2686)),
+Box(Box(2687)),
+Box(Box(2688)),
+Box(Box(2689)),
+Box(Box(2690)),
+Box(Box(2691)),
+Box(Box(2692)),
+Box(Box(2693)),
+Box(Box(2694)),
+Box(Box(2695)),
+Box(Box(2696)),
+Box(Box(2697)),
+Box(Box(2698)),
+Box(Box(2699)),
+Box(Box(2700)),
+Box(Box(2701)),
+Box(Box(2702)),
+Box(Box(2703)),
+Box(Box(2704)),
+Box(Box(2705)),
+Box(Box(2706)),
+Box(Box(2707)),
+Box(Box(2708)),
+Box(Box(2709)),
+Box(Box(2710)),
+Box(Box(2711)),
+Box(Box(2712)),
+Box(Box(2713)),
+Box(Box(2714)),
+Box(Box(2715)),
+Box(Box(2716)),
+Box(Box(2717)),
+Box(Box(2718)),
+Box(Box(2719)),
+Box(Box(2720)),
+Box(Box(2721)),
+Box(Box(2722)),
+Box(Box(2723)),
+Box(Box(2724)),
+Box(Box(2725)),
+Box(Box(2726)),
+Box(Box(2727)),
+Box(Box(2728)),
+Box(Box(2729)),
+Box(Box(2730)),
+Box(Box(2731)),
+Box(Box(2732)),
+Box(Box(2733)),
+Box(Box(2734)),
+Box(Box(2735)),
+Box(Box(2736)),
+Box(Box(2737)),
+Box(Box(2738)),
+Box(Box(2739)),
+Box(Box(2740)),
+Box(Box(2741)),
+Box(Box(2742)),
+Box(Box(2743)),
+Box(Box(2744)),
+Box(Box(2745)),
+Box(Box(2746)),
+Box(Box(2747)),
+Box(Box(2748)),
+Box(Box(2749)),
+Box(Box(2750)),
+Box(Box(2751)),
+Box(Box(2752)),
+Box(Box(2753)),
+Box(Box(2754)),
+Box(Box(2755)),
+Box(Box(2756)),
+Box(Box(2757)),
+Box(Box(2758)),
+Box(Box(2759)),
+Box(Box(2760)),
+Box(Box(2761)),
+Box(Box(2762)),
+Box(Box(2763)),
+Box(Box(2764)),
+Box(Box(2765)),
+Box(Box(2766)),
+Box(Box(2767)),
+Box(Box(2768)),
+Box(Box(2769)),
+Box(Box(2770)),
+Box(Box(2771)),
+Box(Box(2772)),
+Box(Box(2773)),
+Box(Box(2774)),
+Box(Box(2775)),
+Box(Box(2776)),
+Box(Box(2777)),
+Box(Box(2778)),
+Box(Box(2779)),
+Box(Box(2780)),
+Box(Box(2781)),
+Box(Box(2782)),
+Box(Box(2783)),
+Box(Box(2784)),
+Box(Box(2785)),
+Box(Box(2786)),
+Box(Box(2787)),
+Box(Box(2788)),
+Box(Box(2789)),
+Box(Box(2790)),
+Box(Box(2791)),
+Box(Box(2792)),
+Box(Box(2793)),
+Box(Box(2794)),
+Box(Box(2795)),
+Box(Box(2796)),
+Box(Box(2797)),
+Box(Box(2798)),
+Box(Box(2799)),
+Box(Box(2800)),
+Box(Box(2801)),
+Box(Box(2802)),
+Box(Box(2803)),
+Box(Box(2804)),
+Box(Box(2805)),
+Box(Box(2806)),
+Box(Box(2807)),
+Box(Box(2808)),
+Box(Box(2809)),
+Box(Box(2810)),
+Box(Box(2811)),
+Box(Box(2812)),
+Box(Box(2813)),
+Box(Box(2814)),
+Box(Box(2815)),
+Box(Box(2816)),
+Box(Box(2817)),
+Box(Box(2818)),
+Box(Box(2819)),
+Box(Box(2820)),
+Box(Box(2821)),
+Box(Box(2822)),
+Box(Box(2823)),
+Box(Box(2824)),
+Box(Box(2825)),
+Box(Box(2826)),
+Box(Box(2827)),
+Box(Box(2828)),
+Box(Box(2829)),
+Box(Box(2830)),
+Box(Box(2831)),
+Box(Box(2832)),
+Box(Box(2833)),
+Box(Box(2834)),
+Box(Box(2835)),
+Box(Box(2836)),
+Box(Box(2837)),
+Box(Box(2838)),
+Box(Box(2839)),
+Box(Box(2840)),
+Box(Box(2841)),
+Box(Box(2842)),
+Box(Box(2843)),
+Box(Box(2844)),
+Box(Box(2845)),
+Box(Box(2846)),
+Box(Box(2847)),
+Box(Box(2848)),
+Box(Box(2849)),
+Box(Box(2850)),
+Box(Box(2851)),
+Box(Box(2852)),
+Box(Box(2853)),
+Box(Box(2854)),
+Box(Box(2855)),
+Box(Box(2856)),
+Box(Box(2857)),
+Box(Box(2858)),
+Box(Box(2859)),
+Box(Box(2860)),
+Box(Box(2861)),
+Box(Box(2862)),
+Box(Box(2863)),
+Box(Box(2864)),
+Box(Box(2865)),
+Box(Box(2866)),
+Box(Box(2867)),
+Box(Box(2868)),
+Box(Box(2869)),
+Box(Box(2870)),
+Box(Box(2871)),
+Box(Box(2872)),
+Box(Box(2873)),
+Box(Box(2874)),
+Box(Box(2875)),
+Box(Box(2876)),
+Box(Box(2877)),
+Box(Box(2878)),
+Box(Box(2879)),
+Box(Box(2880)),
+Box(Box(2881)),
+Box(Box(2882)),
+Box(Box(2883)),
+Box(Box(2884)),
+Box(Box(2885)),
+Box(Box(2886)),
+Box(Box(2887)),
+Box(Box(2888)),
+Box(Box(2889)),
+Box(Box(2890)),
+Box(Box(2891)),
+Box(Box(2892)),
+Box(Box(2893)),
+Box(Box(2894)),
+Box(Box(2895)),
+Box(Box(2896)),
+Box(Box(2897)),
+Box(Box(2898)),
+Box(Box(2899)),
+Box(Box(2900)),
+Box(Box(2901)),
+Box(Box(2902)),
+Box(Box(2903)),
+Box(Box(2904)),
+Box(Box(2905)),
+Box(Box(2906)),
+Box(Box(2907)),
+Box(Box(2908)),
+Box(Box(2909)),
+Box(Box(2910)),
+Box(Box(2911)),
+Box(Box(2912)),
+Box(Box(2913)),
+Box(Box(2914)),
+Box(Box(2915)),
+Box(Box(2916)),
+Box(Box(2917)),
+Box(Box(2918)),
+Box(Box(2919)),
+Box(Box(2920)),
+Box(Box(2921)),
+Box(Box(2922)),
+Box(Box(2923)),
+Box(Box(2924)),
+Box(Box(2925)),
+Box(Box(2926)),
+Box(Box(2927)),
+Box(Box(2928)),
+Box(Box(2929)),
+Box(Box(2930)),
+Box(Box(2931)),
+Box(Box(2932)),
+Box(Box(2933)),
+Box(Box(2934)),
+Box(Box(2935)),
+Box(Box(2936)),
+Box(Box(2937)),
+Box(Box(2938)),
+Box(Box(2939)),
+Box(Box(2940)),
+Box(Box(2941)),
+Box(Box(2942)),
+Box(Box(2943)),
+Box(Box(2944)),
+Box(Box(2945)),
+Box(Box(2946)),
+Box(Box(2947)),
+Box(Box(2948)),
+Box(Box(2949)),
+Box(Box(2950)),
+Box(Box(2951)),
+Box(Box(2952)),
+Box(Box(2953)),
+Box(Box(2954)),
+Box(Box(2955)),
+Box(Box(2956)),
+Box(Box(2957)),
+Box(Box(2958)),
+Box(Box(2959)),
+Box(Box(2960)),
+Box(Box(2961)),
+Box(Box(2962)),
+Box(Box(2963)),
+Box(Box(2964)),
+Box(Box(2965)),
+Box(Box(2966)),
+Box(Box(2967)),
+Box(Box(2968)),
+Box(Box(2969)),
+Box(Box(2970)),
+Box(Box(2971)),
+Box(Box(2972)),
+Box(Box(2973)),
+Box(Box(2974)),
+Box(Box(2975)),
+Box(Box(2976)),
+Box(Box(2977)),
+Box(Box(2978)),
+Box(Box(2979)),
+Box(Box(2980)),
+Box(Box(2981)),
+Box(Box(2982)),
+Box(Box(2983)),
+Box(Box(2984)),
+Box(Box(2985)),
+Box(Box(2986)),
+Box(Box(2987)),
+Box(Box(2988)),
+Box(Box(2989)),
+Box(Box(2990)),
+Box(Box(2991)),
+Box(Box(2992)),
+Box(Box(2993)),
+Box(Box(2994)),
+Box(Box(2995)),
+Box(Box(2996)),
+Box(Box(2997)),
+Box(Box(2998)),
+Box(Box(2999)),
+Box(Box(3000)),
+Box(Box(3001)),
+Box(Box(3002)),
+Box(Box(3003)),
+Box(Box(3004)),
+Box(Box(3005)),
+Box(Box(3006)),
+Box(Box(3007)),
+Box(Box(3008)),
+Box(Box(3009)),
+Box(Box(3010)),
+Box(Box(3011)),
+Box(Box(3012)),
+Box(Box(3013)),
+Box(Box(3014)),
+Box(Box(3015)),
+Box(Box(3016)),
+Box(Box(3017)),
+Box(Box(3018)),
+Box(Box(3019)),
+Box(Box(3020)),
+Box(Box(3021)),
+Box(Box(3022)),
+Box(Box(3023)),
+Box(Box(3024)),
+Box(Box(3025)),
+Box(Box(3026)),
+Box(Box(3027)),
+Box(Box(3028)),
+Box(Box(3029)),
+Box(Box(3030)),
+Box(Box(3031)),
+Box(Box(3032)),
+Box(Box(3033)),
+Box(Box(3034)),
+Box(Box(3035)),
+Box(Box(3036)),
+Box(Box(3037)),
+Box(Box(3038)),
+Box(Box(3039)),
+Box(Box(3040)),
+Box(Box(3041)),
+Box(Box(3042)),
+Box(Box(3043)),
+Box(Box(3044)),
+Box(Box(3045)),
+Box(Box(3046)),
+Box(Box(3047)),
+Box(Box(3048)),
+Box(Box(3049)),
+Box(Box(3050)),
+Box(Box(3051)),
+Box(Box(3052)),
+Box(Box(3053)),
+Box(Box(3054)),
+Box(Box(3055)),
+Box(Box(3056)),
+Box(Box(3057)),
+Box(Box(3058)),
+Box(Box(3059)),
+Box(Box(3060)),
+Box(Box(3061)),
+Box(Box(3062)),
+Box(Box(3063)),
+Box(Box(3064)),
+Box(Box(3065)),
+Box(Box(3066)),
+Box(Box(3067)),
+Box(Box(3068)),
+Box(Box(3069)),
+Box(Box(3070)),
+Box(Box(3071)),
+Box(Box(3072)),
+Box(Box(3073)),
+Box(Box(3074)),
+Box(Box(3075)),
+Box(Box(3076)),
+Box(Box(3077)),
+Box(Box(3078)),
+Box(Box(3079)),
+Box(Box(3080)),
+Box(Box(3081)),
+Box(Box(3082)),
+Box(Box(3083)),
+Box(Box(3084)),
+Box(Box(3085)),
+Box(Box(3086)),
+Box(Box(3087)),
+Box(Box(3088)),
+Box(Box(3089)),
+Box(Box(3090)),
+Box(Box(3091)),
+Box(Box(3092)),
+Box(Box(3093)),
+Box(Box(3094)),
+Box(Box(3095)),
+Box(Box(3096)),
+Box(Box(3097)),
+Box(Box(3098)),
+Box(Box(3099)),
+Box(Box(3100)),
+Box(Box(3101)),
+Box(Box(3102)),
+Box(Box(3103)),
+Box(Box(3104)),
+Box(Box(3105)),
+Box(Box(3106)),
+Box(Box(3107)),
+Box(Box(3108)),
+Box(Box(3109)),
+Box(Box(3110)),
+Box(Box(3111)),
+Box(Box(3112)),
+Box(Box(3113)),
+Box(Box(3114)),
+Box(Box(3115)),
+Box(Box(3116)),
+Box(Box(3117)),
+Box(Box(3118)),
+Box(Box(3119)),
+Box(Box(3120)),
+Box(Box(3121)),
+Box(Box(3122)),
+Box(Box(3123)),
+Box(Box(3124)),
+Box(Box(3125)),
+Box(Box(3126)),
+Box(Box(3127)),
+Box(Box(3128)),
+Box(Box(3129)),
+Box(Box(3130)),
+Box(Box(3131)),
+Box(Box(3132)),
+Box(Box(3133)),
+Box(Box(3134)),
+Box(Box(3135)),
+Box(Box(3136)),
+Box(Box(3137)),
+Box(Box(3138)),
+Box(Box(3139)),
+Box(Box(3140)),
+Box(Box(3141)),
+Box(Box(3142)),
+Box(Box(3143)),
+Box(Box(3144)),
+Box(Box(3145)),
+Box(Box(3146)),
+Box(Box(3147)),
+Box(Box(3148)),
+Box(Box(3149)),
+Box(Box(3150)),
+Box(Box(3151)),
+Box(Box(3152)),
+Box(Box(3153)),
+Box(Box(3154)),
+Box(Box(3155)),
+Box(Box(3156)),
+Box(Box(3157)),
+Box(Box(3158)),
+Box(Box(3159)),
+Box(Box(3160)),
+Box(Box(3161)),
+Box(Box(3162)),
+Box(Box(3163)),
+Box(Box(3164)),
+Box(Box(3165)),
+Box(Box(3166)),
+Box(Box(3167)),
+Box(Box(3168)),
+Box(Box(3169)),
+Box(Box(3170)),
+Box(Box(3171)),
+Box(Box(3172)),
+Box(Box(3173)),
+Box(Box(3174)),
+Box(Box(3175)),
+Box(Box(3176)),
+Box(Box(3177)),
+Box(Box(3178)),
+Box(Box(3179)),
+Box(Box(3180)),
+Box(Box(3181)),
+Box(Box(3182)),
+Box(Box(3183)),
+Box(Box(3184)),
+Box(Box(3185)),
+Box(Box(3186)),
+Box(Box(3187)),
+Box(Box(3188)),
+Box(Box(3189)),
+Box(Box(3190)),
+Box(Box(3191)),
+Box(Box(3192)),
+Box(Box(3193)),
+Box(Box(3194)),
+Box(Box(3195)),
+Box(Box(3196)),
+Box(Box(3197)),
+Box(Box(3198)),
+Box(Box(3199)),
+Box(Box(3200)),
+Box(Box(3201)),
+Box(Box(3202)),
+Box(Box(3203)),
+Box(Box(3204)),
+Box(Box(3205)),
+Box(Box(3206)),
+Box(Box(3207)),
+Box(Box(3208)),
+Box(Box(3209)),
+Box(Box(3210)),
+Box(Box(3211)),
+Box(Box(3212)),
+Box(Box(3213)),
+Box(Box(3214)),
+Box(Box(3215)),
+Box(Box(3216)),
+Box(Box(3217)),
+Box(Box(3218)),
+Box(Box(3219)),
+Box(Box(3220)),
+Box(Box(3221)),
+Box(Box(3222)),
+Box(Box(3223)),
+Box(Box(3224)),
+Box(Box(3225)),
+Box(Box(3226)),
+Box(Box(3227)),
+Box(Box(3228)),
+Box(Box(3229)),
+Box(Box(3230)),
+Box(Box(3231)),
+Box(Box(3232)),
+Box(Box(3233)),
+Box(Box(3234)),
+Box(Box(3235)),
+Box(Box(3236)),
+Box(Box(3237)),
+Box(Box(3238)),
+Box(Box(3239)),
+Box(Box(3240)),
+Box(Box(3241)),
+Box(Box(3242)),
+Box(Box(3243)),
+Box(Box(3244)),
+Box(Box(3245)),
+Box(Box(3246)),
+Box(Box(3247)),
+Box(Box(3248)),
+Box(Box(3249)),
+Box(Box(3250)),
+Box(Box(3251)),
+Box(Box(3252)),
+Box(Box(3253)),
+Box(Box(3254)),
+Box(Box(3255)),
+Box(Box(3256)),
+Box(Box(3257)),
+Box(Box(3258)),
+Box(Box(3259)),
+Box(Box(3260)),
+Box(Box(3261)),
+Box(Box(3262)),
+Box(Box(3263)),
+Box(Box(3264)),
+Box(Box(3265)),
+Box(Box(3266)),
+Box(Box(3267)),
+Box(Box(3268)),
+Box(Box(3269)),
+Box(Box(3270)),
+Box(Box(3271)),
+Box(Box(3272)),
+Box(Box(3273)),
+Box(Box(3274)),
+Box(Box(3275)),
+Box(Box(3276)),
+Box(Box(3277)),
+Box(Box(3278)),
+Box(Box(3279)),
+Box(Box(3280)),
+Box(Box(3281)),
+Box(Box(3282)),
+Box(Box(3283)),
+Box(Box(3284)),
+Box(Box(3285)),
+Box(Box(3286)),
+Box(Box(3287)),
+Box(Box(3288)),
+Box(Box(3289)),
+Box(Box(3290)),
+Box(Box(3291)),
+Box(Box(3292)),
+Box(Box(3293)),
+Box(Box(3294)),
+Box(Box(3295)),
+Box(Box(3296)),
+Box(Box(3297)),
+Box(Box(3298)),
+Box(Box(3299)),
+Box(Box(3300)),
+Box(Box(3301)),
+Box(Box(3302)),
+Box(Box(3303)),
+Box(Box(3304)),
+Box(Box(3305)),
+Box(Box(3306)),
+Box(Box(3307)),
+Box(Box(3308)),
+Box(Box(3309)),
+Box(Box(3310)),
+Box(Box(3311)),
+Box(Box(3312)),
+Box(Box(3313)),
+Box(Box(3314)),
+Box(Box(3315)),
+Box(Box(3316)),
+Box(Box(3317)),
+Box(Box(3318)),
+Box(Box(3319)),
+Box(Box(3320)),
+Box(Box(3321)),
+Box(Box(3322)),
+Box(Box(3323)),
+Box(Box(3324)),
+Box(Box(3325)),
+Box(Box(3326)),
+Box(Box(3327)),
+Box(Box(3328)),
+Box(Box(3329)),
+Box(Box(3330)),
+Box(Box(3331)),
+Box(Box(3332)),
+Box(Box(3333)),
+Box(Box(3334)),
+Box(Box(3335)),
+Box(Box(3336)),
+Box(Box(3337)),
+Box(Box(3338)),
+Box(Box(3339)),
+Box(Box(3340)),
+Box(Box(3341)),
+Box(Box(3342)),
+Box(Box(3343)),
+Box(Box(3344)),
+Box(Box(3345)),
+Box(Box(3346)),
+Box(Box(3347)),
+Box(Box(3348)),
+Box(Box(3349)),
+Box(Box(3350)),
+Box(Box(3351)),
+Box(Box(3352)),
+Box(Box(3353)),
+Box(Box(3354)),
+Box(Box(3355)),
+Box(Box(3356)),
+Box(Box(3357)),
+Box(Box(3358)),
+Box(Box(3359)),
+Box(Box(3360)),
+Box(Box(3361)),
+Box(Box(3362)),
+Box(Box(3363)),
+Box(Box(3364)),
+Box(Box(3365)),
+Box(Box(3366)),
+Box(Box(3367)),
+Box(Box(3368)),
+Box(Box(3369)),
+Box(Box(3370)),
+Box(Box(3371)),
+Box(Box(3372)),
+Box(Box(3373)),
+Box(Box(3374)),
+Box(Box(3375)),
+Box(Box(3376)),
+Box(Box(3377)),
+Box(Box(3378)),
+Box(Box(3379)),
+Box(Box(3380)),
+Box(Box(3381)),
+Box(Box(3382)),
+Box(Box(3383)),
+Box(Box(3384)),
+Box(Box(3385)),
+Box(Box(3386)),
+Box(Box(3387)),
+Box(Box(3388)),
+Box(Box(3389)),
+Box(Box(3390)),
+Box(Box(3391)),
+Box(Box(3392)),
+Box(Box(3393)),
+Box(Box(3394)),
+Box(Box(3395)),
+Box(Box(3396)),
+Box(Box(3397)),
+Box(Box(3398)),
+Box(Box(3399)),
+Box(Box(3400)),
+Box(Box(3401)),
+Box(Box(3402)),
+Box(Box(3403)),
+Box(Box(3404)),
+Box(Box(3405)),
+Box(Box(3406)),
+Box(Box(3407)),
+Box(Box(3408)),
+Box(Box(3409)),
+Box(Box(3410)),
+Box(Box(3411)),
+Box(Box(3412)),
+Box(Box(3413)),
+Box(Box(3414)),
+Box(Box(3415)),
+Box(Box(3416)),
+Box(Box(3417)),
+Box(Box(3418)),
+Box(Box(3419)),
+Box(Box(3420)),
+Box(Box(3421)),
+Box(Box(3422)),
+Box(Box(3423)),
+Box(Box(3424)),
+Box(Box(3425)),
+Box(Box(3426)),
+Box(Box(3427)),
+Box(Box(3428)),
+Box(Box(3429)),
+Box(Box(3430)),
+Box(Box(3431)),
+Box(Box(3432)),
+Box(Box(3433)),
+Box(Box(3434)),
+Box(Box(3435)),
+Box(Box(3436)),
+Box(Box(3437)),
+Box(Box(3438)),
+Box(Box(3439)),
+Box(Box(3440)),
+Box(Box(3441)),
+Box(Box(3442)),
+Box(Box(3443)),
+Box(Box(3444)),
+Box(Box(3445)),
+Box(Box(3446)),
+Box(Box(3447)),
+Box(Box(3448)),
+Box(Box(3449)),
+Box(Box(3450)),
+Box(Box(3451)),
+Box(Box(3452)),
+Box(Box(3453)),
+Box(Box(3454)),
+Box(Box(3455)),
+Box(Box(3456)),
+Box(Box(3457)),
+Box(Box(3458)),
+Box(Box(3459)),
+Box(Box(3460)),
+Box(Box(3461)),
+Box(Box(3462)),
+Box(Box(3463)),
+Box(Box(3464)),
+Box(Box(3465)),
+Box(Box(3466)),
+Box(Box(3467)),
+Box(Box(3468)),
+Box(Box(3469)),
+Box(Box(3470)),
+Box(Box(3471)),
+Box(Box(3472)),
+Box(Box(3473)),
+Box(Box(3474)),
+Box(Box(3475)),
+Box(Box(3476)),
+Box(Box(3477)),
+Box(Box(3478)),
+Box(Box(3479)),
+Box(Box(3480)),
+Box(Box(3481)),
+Box(Box(3482)),
+Box(Box(3483)),
+Box(Box(3484)),
+Box(Box(3485)),
+Box(Box(3486)),
+Box(Box(3487)),
+Box(Box(3488)),
+Box(Box(3489)),
+Box(Box(3490)),
+Box(Box(3491)),
+Box(Box(3492)),
+Box(Box(3493)),
+Box(Box(3494)),
+Box(Box(3495)),
+Box(Box(3496)),
+Box(Box(3497)),
+Box(Box(3498)),
+Box(Box(3499)),
+Box(Box(3500)),
+Box(Box(3501)),
+Box(Box(3502)),
+Box(Box(3503)),
+Box(Box(3504)),
+Box(Box(3505)),
+Box(Box(3506)),
+Box(Box(3507)),
+Box(Box(3508)),
+Box(Box(3509)),
+Box(Box(3510)),
+Box(Box(3511)),
+Box(Box(3512)),
+Box(Box(3513)),
+Box(Box(3514)),
+Box(Box(3515)),
+Box(Box(3516)),
+Box(Box(3517)),
+Box(Box(3518)),
+Box(Box(3519)),
+Box(Box(3520)),
+Box(Box(3521)),
+Box(Box(3522)),
+Box(Box(3523)),
+Box(Box(3524)),
+Box(Box(3525)),
+Box(Box(3526)),
+Box(Box(3527)),
+Box(Box(3528)),
+Box(Box(3529)),
+Box(Box(3530)),
+Box(Box(3531)),
+Box(Box(3532)),
+Box(Box(3533)),
+Box(Box(3534)),
+Box(Box(3535)),
+Box(Box(3536)),
+Box(Box(3537)),
+Box(Box(3538)),
+Box(Box(3539)),
+Box(Box(3540)),
+Box(Box(3541)),
+Box(Box(3542)),
+Box(Box(3543)),
+Box(Box(3544)),
+Box(Box(3545)),
+Box(Box(3546)),
+Box(Box(3547)),
+Box(Box(3548)),
+Box(Box(3549)),
+Box(Box(3550)),
+Box(Box(3551)),
+Box(Box(3552)),
+Box(Box(3553)),
+Box(Box(3554)),
+Box(Box(3555)),
+Box(Box(3556)),
+Box(Box(3557)),
+Box(Box(3558)),
+Box(Box(3559)),
+Box(Box(3560)),
+Box(Box(3561)),
+Box(Box(3562)),
+Box(Box(3563)),
+Box(Box(3564)),
+Box(Box(3565)),
+Box(Box(3566)),
+Box(Box(3567)),
+Box(Box(3568)),
+Box(Box(3569)),
+Box(Box(3570)),
+Box(Box(3571)),
+Box(Box(3572)),
+Box(Box(3573)),
+Box(Box(3574)),
+Box(Box(3575)),
+Box(Box(3576)),
+Box(Box(3577)),
+Box(Box(3578)),
+Box(Box(3579)),
+Box(Box(3580)),
+Box(Box(3581)),
+Box(Box(3582)),
+Box(Box(3583)),
+Box(Box(3584)),
+Box(Box(3585)),
+Box(Box(3586)),
+Box(Box(3587)),
+Box(Box(3588)),
+Box(Box(3589)),
+Box(Box(3590)),
+Box(Box(3591)),
+Box(Box(3592)),
+Box(Box(3593)),
+Box(Box(3594)),
+Box(Box(3595)),
+Box(Box(3596)),
+Box(Box(3597)),
+Box(Box(3598)),
+Box(Box(3599)),
+Box(Box(3600)),
+Box(Box(3601)),
+Box(Box(3602)),
+Box(Box(3603)),
+Box(Box(3604)),
+Box(Box(3605)),
+Box(Box(3606)),
+Box(Box(3607)),
+Box(Box(3608)),
+Box(Box(3609)),
+Box(Box(3610)),
+Box(Box(3611)),
+Box(Box(3612)),
+Box(Box(3613)),
+Box(Box(3614)),
+Box(Box(3615)),
+Box(Box(3616)),
+Box(Box(3617)),
+Box(Box(3618)),
+Box(Box(3619)),
+Box(Box(3620)),
+Box(Box(3621)),
+Box(Box(3622)),
+Box(Box(3623)),
+Box(Box(3624)),
+Box(Box(3625)),
+Box(Box(3626)),
+Box(Box(3627)),
+Box(Box(3628)),
+Box(Box(3629)),
+Box(Box(3630)),
+Box(Box(3631)),
+Box(Box(3632)),
+Box(Box(3633)),
+Box(Box(3634)),
+Box(Box(3635)),
+Box(Box(3636)),
+Box(Box(3637)),
+Box(Box(3638)),
+Box(Box(3639)),
+Box(Box(3640)),
+Box(Box(3641)),
+Box(Box(3642)),
+Box(Box(3643)),
+Box(Box(3644)),
+Box(Box(3645)),
+Box(Box(3646)),
+Box(Box(3647)),
+Box(Box(3648)),
+Box(Box(3649)),
+Box(Box(3650)),
+Box(Box(3651)),
+Box(Box(3652)),
+Box(Box(3653)),
+Box(Box(3654)),
+Box(Box(3655)),
+Box(Box(3656)),
+Box(Box(3657)),
+Box(Box(3658)),
+Box(Box(3659)),
+Box(Box(3660)),
+Box(Box(3661)),
+Box(Box(3662)),
+Box(Box(3663)),
+Box(Box(3664)),
+Box(Box(3665)),
+Box(Box(3666)),
+Box(Box(3667)),
+Box(Box(3668)),
+Box(Box(3669)),
+Box(Box(3670)),
+Box(Box(3671)),
+Box(Box(3672)),
+Box(Box(3673)),
+Box(Box(3674)),
+Box(Box(3675)),
+Box(Box(3676)),
+Box(Box(3677)),
+Box(Box(3678)),
+Box(Box(3679)),
+Box(Box(3680)),
+Box(Box(3681)),
+Box(Box(3682)),
+Box(Box(3683)),
+Box(Box(3684)),
+Box(Box(3685)),
+Box(Box(3686)),
+Box(Box(3687)),
+Box(Box(3688)),
+Box(Box(3689)),
+Box(Box(3690)),
+Box(Box(3691)),
+Box(Box(3692)),
+Box(Box(3693)),
+Box(Box(3694)),
+Box(Box(3695)),
+Box(Box(3696)),
+Box(Box(3697)),
+Box(Box(3698)),
+Box(Box(3699)),
+Box(Box(3700)),
+Box(Box(3701)),
+Box(Box(3702)),
+Box(Box(3703)),
+Box(Box(3704)),
+Box(Box(3705)),
+Box(Box(3706)),
+Box(Box(3707)),
+Box(Box(3708)),
+Box(Box(3709)),
+Box(Box(3710)),
+Box(Box(3711)),
+Box(Box(3712)),
+Box(Box(3713)),
+Box(Box(3714)),
+Box(Box(3715)),
+Box(Box(3716)),
+Box(Box(3717)),
+Box(Box(3718)),
+Box(Box(3719)),
+Box(Box(3720)),
+Box(Box(3721)),
+Box(Box(3722)),
+Box(Box(3723)),
+Box(Box(3724)),
+Box(Box(3725)),
+Box(Box(3726)),
+Box(Box(3727)),
+Box(Box(3728)),
+Box(Box(3729)),
+Box(Box(3730)),
+Box(Box(3731)),
+Box(Box(3732)),
+Box(Box(3733)),
+Box(Box(3734)),
+Box(Box(3735)),
+Box(Box(3736)),
+Box(Box(3737)),
+Box(Box(3738)),
+Box(Box(3739)),
+Box(Box(3740)),
+Box(Box(3741)),
+Box(Box(3742)),
+Box(Box(3743)),
+Box(Box(3744)),
+Box(Box(3745)),
+Box(Box(3746)),
+Box(Box(3747)),
+Box(Box(3748)),
+Box(Box(3749)),
+Box(Box(3750)),
+Box(Box(3751)),
+Box(Box(3752)),
+Box(Box(3753)),
+Box(Box(3754)),
+Box(Box(3755)),
+Box(Box(3756)),
+Box(Box(3757)),
+Box(Box(3758)),
+Box(Box(3759)),
+Box(Box(3760)),
+Box(Box(3761)),
+Box(Box(3762)),
+Box(Box(3763)),
+Box(Box(3764)),
+Box(Box(3765)),
+Box(Box(3766)),
+Box(Box(3767)),
+Box(Box(3768)),
+Box(Box(3769)),
+Box(Box(3770)),
+Box(Box(3771)),
+Box(Box(3772)),
+Box(Box(3773)),
+Box(Box(3774)),
+Box(Box(3775)),
+Box(Box(3776)),
+Box(Box(3777)),
+Box(Box(3778)),
+Box(Box(3779)),
+Box(Box(3780)),
+Box(Box(3781)),
+Box(Box(3782)),
+Box(Box(3783)),
+Box(Box(3784)),
+Box(Box(3785)),
+Box(Box(3786)),
+Box(Box(3787)),
+Box(Box(3788)),
+Box(Box(3789)),
+Box(Box(3790)),
+Box(Box(3791)),
+Box(Box(3792)),
+Box(Box(3793)),
+Box(Box(3794)),
+Box(Box(3795)),
+Box(Box(3796)),
+Box(Box(3797)),
+Box(Box(3798)),
+Box(Box(3799)),
+Box(Box(3800)),
+Box(Box(3801)),
+Box(Box(3802)),
+Box(Box(3803)),
+Box(Box(3804)),
+Box(Box(3805)),
+Box(Box(3806)),
+Box(Box(3807)),
+Box(Box(3808)),
+Box(Box(3809)),
+Box(Box(3810)),
+Box(Box(3811)),
+Box(Box(3812)),
+Box(Box(3813)),
+Box(Box(3814)),
+Box(Box(3815)),
+Box(Box(3816)),
+Box(Box(3817)),
+Box(Box(3818)),
+Box(Box(3819)),
+Box(Box(3820)),
+Box(Box(3821)),
+Box(Box(3822)),
+Box(Box(3823)),
+Box(Box(3824)),
+Box(Box(3825)),
+Box(Box(3826)),
+Box(Box(3827)),
+Box(Box(3828)),
+Box(Box(3829)),
+Box(Box(3830)),
+Box(Box(3831)),
+Box(Box(3832)),
+Box(Box(3833)),
+Box(Box(3834)),
+Box(Box(3835)),
+Box(Box(3836)),
+Box(Box(3837)),
+Box(Box(3838)),
+Box(Box(3839)),
+Box(Box(3840)),
+Box(Box(3841)),
+Box(Box(3842)),
+Box(Box(3843)),
+Box(Box(3844)),
+Box(Box(3845)),
+Box(Box(3846)),
+Box(Box(3847)),
+Box(Box(3848)),
+Box(Box(3849)),
+Box(Box(3850)),
+Box(Box(3851)),
+Box(Box(3852)),
+Box(Box(3853)),
+Box(Box(3854)),
+Box(Box(3855)),
+Box(Box(3856)),
+Box(Box(3857)),
+Box(Box(3858)),
+Box(Box(3859)),
+Box(Box(3860)),
+Box(Box(3861)),
+Box(Box(3862)),
+Box(Box(3863)),
+Box(Box(3864)),
+Box(Box(3865)),
+Box(Box(3866)),
+Box(Box(3867)),
+Box(Box(3868)),
+Box(Box(3869)),
+Box(Box(3870)),
+Box(Box(3871)),
+Box(Box(3872)),
+Box(Box(3873)),
+Box(Box(3874)),
+Box(Box(3875)),
+Box(Box(3876)),
+Box(Box(3877)),
+Box(Box(3878)),
+Box(Box(3879)),
+Box(Box(3880)),
+Box(Box(3881)),
+Box(Box(3882)),
+Box(Box(3883)),
+Box(Box(3884)),
+Box(Box(3885)),
+Box(Box(3886)),
+Box(Box(3887)),
+Box(Box(3888)),
+Box(Box(3889)),
+Box(Box(3890)),
+Box(Box(3891)),
+Box(Box(3892)),
+Box(Box(3893)),
+Box(Box(3894)),
+Box(Box(3895)),
+Box(Box(3896)),
+Box(Box(3897)),
+Box(Box(3898)),
+Box(Box(3899)),
+Box(Box(3900)),
+Box(Box(3901)),
+Box(Box(3902)),
+Box(Box(3903)),
+Box(Box(3904)),
+Box(Box(3905)),
+Box(Box(3906)),
+Box(Box(3907)),
+Box(Box(3908)),
+Box(Box(3909)),
+Box(Box(3910)),
+Box(Box(3911)),
+Box(Box(3912)),
+Box(Box(3913)),
+Box(Box(3914)),
+Box(Box(3915)),
+Box(Box(3916)),
+Box(Box(3917)),
+Box(Box(3918)),
+Box(Box(3919)),
+Box(Box(3920)),
+Box(Box(3921)),
+Box(Box(3922)),
+Box(Box(3923)),
+Box(Box(3924)),
+Box(Box(3925)),
+Box(Box(3926)),
+Box(Box(3927)),
+Box(Box(3928)),
+Box(Box(3929)),
+Box(Box(3930)),
+Box(Box(3931)),
+Box(Box(3932)),
+Box(Box(3933)),
+Box(Box(3934)),
+Box(Box(3935)),
+Box(Box(3936)),
+Box(Box(3937)),
+Box(Box(3938)),
+Box(Box(3939)),
+Box(Box(3940)),
+Box(Box(3941)),
+Box(Box(3942)),
+Box(Box(3943)),
+Box(Box(3944)),
+Box(Box(3945)),
+Box(Box(3946)),
+Box(Box(3947)),
+Box(Box(3948)),
+Box(Box(3949)),
+Box(Box(3950)),
+Box(Box(3951)),
+Box(Box(3952)),
+Box(Box(3953)),
+Box(Box(3954)),
+Box(Box(3955)),
+Box(Box(3956)),
+Box(Box(3957)),
+Box(Box(3958)),
+Box(Box(3959)),
+Box(Box(3960)),
+Box(Box(3961)),
+Box(Box(3962)),
+Box(Box(3963)),
+Box(Box(3964)),
+Box(Box(3965)),
+Box(Box(3966)),
+Box(Box(3967)),
+Box(Box(3968)),
+Box(Box(3969)),
+Box(Box(3970)),
+Box(Box(3971)),
+Box(Box(3972)),
+Box(Box(3973)),
+Box(Box(3974)),
+Box(Box(3975)),
+Box(Box(3976)),
+Box(Box(3977)),
+Box(Box(3978)),
+Box(Box(3979)),
+Box(Box(3980)),
+Box(Box(3981)),
+Box(Box(3982)),
+Box(Box(3983)),
+Box(Box(3984)),
+Box(Box(3985)),
+Box(Box(3986)),
+Box(Box(3987)),
+Box(Box(3988)),
+Box(Box(3989)),
+Box(Box(3990)),
+Box(Box(3991)),
+Box(Box(3992)),
+Box(Box(3993)),
+Box(Box(3994)),
+Box(Box(3995)),
+Box(Box(3996)),
+Box(Box(3997)),
+Box(Box(3998)),
+Box(Box(3999)),
+Box(Box(4000)),
+Box(Box(4001)),
+Box(Box(4002)),
+Box(Box(4003)),
+Box(Box(4004)),
+Box(Box(4005)),
+Box(Box(4006)),
+Box(Box(4007)),
+Box(Box(4008)),
+Box(Box(4009)),
+Box(Box(4010)),
+Box(Box(4011)),
+Box(Box(4012)),
+Box(Box(4013)),
+Box(Box(4014)),
+Box(Box(4015)),
+Box(Box(4016)),
+Box(Box(4017)),
+Box(Box(4018)),
+Box(Box(4019)),
+Box(Box(4020)),
+Box(Box(4021)),
+Box(Box(4022)),
+Box(Box(4023)),
+Box(Box(4024)),
+Box(Box(4025)),
+Box(Box(4026)),
+Box(Box(4027)),
+Box(Box(4028)),
+Box(Box(4029)),
+Box(Box(4030)),
+Box(Box(4031)),
+Box(Box(4032)),
+Box(Box(4033)),
+Box(Box(4034)),
+Box(Box(4035)),
+Box(Box(4036)),
+Box(Box(4037)),
+Box(Box(4038)),
+Box(Box(4039)),
+Box(Box(4040)),
+Box(Box(4041)),
+Box(Box(4042)),
+Box(Box(4043)),
+Box(Box(4044)),
+Box(Box(4045)),
+Box(Box(4046)),
+Box(Box(4047)),
+Box(Box(4048)),
+Box(Box(4049)),
+Box(Box(4050)),
+Box(Box(4051)),
+Box(Box(4052)),
+Box(Box(4053)),
+Box(Box(4054)),
+Box(Box(4055)),
+Box(Box(4056)),
+Box(Box(4057)),
+Box(Box(4058)),
+Box(Box(4059)),
+Box(Box(4060)),
+Box(Box(4061)),
+Box(Box(4062)),
+Box(Box(4063)),
+Box(Box(4064)),
+Box(Box(4065)),
+Box(Box(4066)),
+Box(Box(4067)),
+Box(Box(4068)),
+Box(Box(4069)),
+Box(Box(4070)),
+Box(Box(4071)),
+Box(Box(4072)),
+Box(Box(4073)),
+Box(Box(4074)),
+Box(Box(4075)),
+Box(Box(4076)),
+Box(Box(4077)),
+Box(Box(4078)),
+Box(Box(4079)),
+Box(Box(4080)),
+Box(Box(4081)),
+Box(Box(4082)),
+Box(Box(4083)),
+Box(Box(4084)),
+Box(Box(4085)),
+Box(Box(4086)),
+Box(Box(4087)),
+Box(Box(4088)),
+Box(Box(4089)),
+Box(Box(4090)),
+Box(Box(4091)),
+Box(Box(4092)),
+Box(Box(4093)),
+Box(Box(4094)),
+Box(Box(4095)),
+Box(Box(4096)),
+Box(Box(4097)),
+Box(Box(4098)),
+Box(Box(4099)),
+Box(Box(4100)),
+Box(Box(4101)),
+Box(Box(4102)),
+Box(Box(4103)),
+Box(Box(4104)),
+Box(Box(4105)),
+Box(Box(4106)),
+Box(Box(4107)),
+Box(Box(4108)),
+Box(Box(4109)),
+Box(Box(4110)),
+Box(Box(4111)),
+Box(Box(4112)),
+Box(Box(4113)),
+Box(Box(4114)),
+Box(Box(4115)),
+Box(Box(4116)),
+Box(Box(4117)),
+Box(Box(4118)),
+Box(Box(4119)),
+Box(Box(4120)),
+Box(Box(4121)),
+Box(Box(4122)),
+Box(Box(4123)),
+Box(Box(4124)),
+Box(Box(4125)),
+Box(Box(4126)),
+Box(Box(4127)),
+Box(Box(4128)),
+Box(Box(4129)),
+Box(Box(4130)),
+Box(Box(4131)),
+Box(Box(4132)),
+Box(Box(4133)),
+Box(Box(4134)),
+Box(Box(4135)),
+Box(Box(4136)),
+Box(Box(4137)),
+Box(Box(4138)),
+Box(Box(4139)),
+Box(Box(4140)),
+Box(Box(4141)),
+Box(Box(4142)),
+Box(Box(4143)),
+Box(Box(4144)),
+Box(Box(4145)),
+Box(Box(4146)),
+Box(Box(4147)),
+Box(Box(4148)),
+Box(Box(4149)),
+Box(Box(4150)),
+Box(Box(4151)),
+Box(Box(4152)),
+Box(Box(4153)),
+Box(Box(4154)),
+Box(Box(4155)),
+Box(Box(4156)),
+Box(Box(4157)),
+Box(Box(4158)),
+Box(Box(4159)),
+Box(Box(4160)),
+Box(Box(4161)),
+Box(Box(4162)),
+Box(Box(4163)),
+Box(Box(4164)),
+Box(Box(4165)),
+Box(Box(4166)),
+Box(Box(4167)),
+Box(Box(4168)),
+Box(Box(4169)),
+Box(Box(4170)),
+Box(Box(4171)),
+Box(Box(4172)),
+Box(Box(4173)),
+Box(Box(4174)),
+Box(Box(4175)),
+Box(Box(4176)),
+Box(Box(4177)),
+Box(Box(4178)),
+Box(Box(4179)),
+Box(Box(4180)),
+Box(Box(4181)),
+Box(Box(4182)),
+Box(Box(4183)),
+Box(Box(4184)),
+Box(Box(4185)),
+Box(Box(4186)),
+Box(Box(4187)),
+Box(Box(4188)),
+Box(Box(4189)),
+Box(Box(4190)),
+Box(Box(4191)),
+Box(Box(4192)),
+Box(Box(4193)),
+Box(Box(4194)),
+Box(Box(4195)),
+Box(Box(4196)),
+Box(Box(4197)),
+Box(Box(4198)),
+Box(Box(4199)),
+Box(Box(4200)),
+Box(Box(4201)),
+Box(Box(4202)),
+Box(Box(4203)),
+Box(Box(4204)),
+Box(Box(4205)),
+Box(Box(4206)),
+Box(Box(4207)),
+Box(Box(4208)),
+Box(Box(4209)),
+Box(Box(4210)),
+Box(Box(4211)),
+Box(Box(4212)),
+Box(Box(4213)),
+Box(Box(4214)),
+Box(Box(4215)),
+Box(Box(4216)),
+Box(Box(4217)),
+Box(Box(4218)),
+Box(Box(4219)),
+Box(Box(4220)),
+Box(Box(4221)),
+Box(Box(4222)),
+Box(Box(4223)),
+Box(Box(4224)),
+Box(Box(4225)),
+Box(Box(4226)),
+Box(Box(4227)),
+Box(Box(4228)),
+Box(Box(4229)),
+Box(Box(4230)),
+Box(Box(4231)),
+Box(Box(4232)),
+Box(Box(4233)),
+Box(Box(4234)),
+Box(Box(4235)),
+Box(Box(4236)),
+Box(Box(4237)),
+Box(Box(4238)),
+Box(Box(4239)),
+Box(Box(4240)),
+Box(Box(4241)),
+Box(Box(4242)),
+Box(Box(4243)),
+Box(Box(4244)),
+Box(Box(4245)),
+Box(Box(4246)),
+Box(Box(4247)),
+Box(Box(4248)),
+Box(Box(4249)),
+Box(Box(4250)),
+Box(Box(4251)),
+Box(Box(4252)),
+Box(Box(4253)),
+Box(Box(4254)),
+Box(Box(4255)),
+Box(Box(4256)),
+Box(Box(4257)),
+Box(Box(4258)),
+Box(Box(4259)),
+Box(Box(4260)),
+Box(Box(4261)),
+Box(Box(4262)),
+Box(Box(4263)),
+Box(Box(4264)),
+Box(Box(4265)),
+Box(Box(4266)),
+Box(Box(4267)),
+Box(Box(4268)),
+Box(Box(4269)),
+Box(Box(4270)),
+Box(Box(4271)),
+Box(Box(4272)),
+Box(Box(4273)),
+Box(Box(4274)),
+Box(Box(4275)),
+Box(Box(4276)),
+Box(Box(4277)),
+Box(Box(4278)),
+Box(Box(4279)),
+Box(Box(4280)),
+Box(Box(4281)),
+Box(Box(4282)),
+Box(Box(4283)),
+Box(Box(4284)),
+Box(Box(4285)),
+Box(Box(4286)),
+Box(Box(4287)),
+Box(Box(4288)),
+Box(Box(4289)),
+Box(Box(4290)),
+Box(Box(4291)),
+Box(Box(4292)),
+Box(Box(4293)),
+Box(Box(4294)),
+Box(Box(4295)),
+Box(Box(4296)),
+Box(Box(4297)),
+Box(Box(4298)),
+Box(Box(4299)),
+Box(Box(4300)),
+Box(Box(4301)),
+Box(Box(4302)),
+Box(Box(4303)),
+Box(Box(4304)),
+Box(Box(4305)),
+Box(Box(4306)),
+Box(Box(4307)),
+Box(Box(4308)),
+Box(Box(4309)),
+Box(Box(4310)),
+Box(Box(4311)),
+Box(Box(4312)),
+Box(Box(4313)),
+Box(Box(4314)),
+Box(Box(4315)),
+Box(Box(4316)),
+Box(Box(4317)),
+Box(Box(4318)),
+Box(Box(4319)),
+Box(Box(4320)),
+Box(Box(4321)),
+Box(Box(4322)),
+Box(Box(4323)),
+Box(Box(4324)),
+Box(Box(4325)),
+Box(Box(4326)),
+Box(Box(4327)),
+Box(Box(4328)),
+Box(Box(4329)),
+Box(Box(4330)),
+Box(Box(4331)),
+Box(Box(4332)),
+Box(Box(4333)),
+Box(Box(4334)),
+Box(Box(4335)),
+Box(Box(4336)),
+Box(Box(4337)),
+Box(Box(4338)),
+Box(Box(4339)),
+Box(Box(4340)),
+Box(Box(4341)),
+Box(Box(4342)),
+Box(Box(4343)),
+Box(Box(4344)),
+Box(Box(4345)),
+Box(Box(4346)),
+Box(Box(4347)),
+Box(Box(4348)),
+Box(Box(4349)),
+Box(Box(4350)),
+Box(Box(4351)),
+Box(Box(4352)),
+Box(Box(4353)),
+Box(Box(4354)),
+Box(Box(4355)),
+Box(Box(4356)),
+Box(Box(4357)),
+Box(Box(4358)),
+Box(Box(4359)),
+Box(Box(4360)),
+Box(Box(4361)),
+Box(Box(4362)),
+Box(Box(4363)),
+Box(Box(4364)),
+Box(Box(4365)),
+Box(Box(4366)),
+Box(Box(4367)),
+Box(Box(4368)),
+Box(Box(4369)),
+Box(Box(4370)),
+Box(Box(4371)),
+Box(Box(4372)),
+Box(Box(4373)),
+Box(Box(4374)),
+Box(Box(4375)),
+Box(Box(4376)),
+Box(Box(4377)),
+Box(Box(4378)),
+Box(Box(4379)),
+Box(Box(4380)),
+Box(Box(4381)),
+Box(Box(4382)),
+Box(Box(4383)),
+Box(Box(4384)),
+Box(Box(4385)),
+Box(Box(4386)),
+Box(Box(4387)),
+Box(Box(4388)),
+Box(Box(4389)),
+Box(Box(4390)),
+Box(Box(4391)),
+Box(Box(4392)),
+Box(Box(4393)),
+Box(Box(4394)),
+Box(Box(4395)),
+Box(Box(4396)),
+Box(Box(4397)),
+Box(Box(4398)),
+Box(Box(4399)),
+Box(Box(4400)),
+Box(Box(4401)),
+Box(Box(4402)),
+Box(Box(4403)),
+Box(Box(4404)),
+Box(Box(4405)),
+Box(Box(4406)),
+Box(Box(4407)),
+Box(Box(4408)),
+Box(Box(4409)),
+Box(Box(4410)),
+Box(Box(4411)),
+Box(Box(4412)),
+Box(Box(4413)),
+Box(Box(4414)),
+Box(Box(4415)),
+Box(Box(4416)),
+Box(Box(4417)),
+Box(Box(4418)),
+Box(Box(4419)),
+Box(Box(4420)),
+Box(Box(4421)),
+Box(Box(4422)),
+Box(Box(4423)),
+Box(Box(4424)),
+Box(Box(4425)),
+Box(Box(4426)),
+Box(Box(4427)),
+Box(Box(4428)),
+Box(Box(4429)),
+Box(Box(4430)),
+Box(Box(4431)),
+Box(Box(4432)),
+Box(Box(4433)),
+Box(Box(4434)),
+Box(Box(4435)),
+Box(Box(4436)),
+Box(Box(4437)),
+Box(Box(4438)),
+Box(Box(4439)),
+Box(Box(4440)),
+Box(Box(4441)),
+Box(Box(4442)),
+Box(Box(4443)),
+Box(Box(4444)),
+Box(Box(4445)),
+Box(Box(4446)),
+Box(Box(4447)),
+Box(Box(4448)),
+Box(Box(4449)),
+Box(Box(4450)),
+Box(Box(4451)),
+Box(Box(4452)),
+Box(Box(4453)),
+Box(Box(4454)),
+Box(Box(4455)),
+Box(Box(4456)),
+Box(Box(4457)),
+Box(Box(4458)),
+Box(Box(4459)),
+Box(Box(4460)),
+Box(Box(4461)),
+Box(Box(4462)),
+Box(Box(4463)),
+Box(Box(4464)),
+Box(Box(4465)),
+Box(Box(4466)),
+Box(Box(4467)),
+Box(Box(4468)),
+Box(Box(4469)),
+Box(Box(4470)),
+Box(Box(4471)),
+Box(Box(4472)),
+Box(Box(4473)),
+Box(Box(4474)),
+Box(Box(4475)),
+Box(Box(4476)),
+Box(Box(4477)),
+Box(Box(4478)),
+Box(Box(4479)),
+Box(Box(4480)),
+Box(Box(4481)),
+Box(Box(4482)),
+Box(Box(4483)),
+Box(Box(4484)),
+Box(Box(4485)),
+Box(Box(4486)),
+Box(Box(4487)),
+Box(Box(4488)),
+Box(Box(4489)),
+Box(Box(4490)),
+Box(Box(4491)),
+Box(Box(4492)),
+Box(Box(4493)),
+Box(Box(4494)),
+Box(Box(4495)),
+Box(Box(4496)),
+Box(Box(4497)),
+Box(Box(4498)),
+Box(Box(4499)),
+Box(Box(4500)),
+Box(Box(4501)),
+Box(Box(4502)),
+Box(Box(4503)),
+Box(Box(4504)),
+Box(Box(4505)),
+Box(Box(4506)),
+Box(Box(4507)),
+Box(Box(4508)),
+Box(Box(4509)),
+Box(Box(4510)),
+Box(Box(4511)),
+Box(Box(4512)),
+Box(Box(4513)),
+Box(Box(4514)),
+Box(Box(4515)),
+Box(Box(4516)),
+Box(Box(4517)),
+Box(Box(4518)),
+Box(Box(4519)),
+Box(Box(4520)),
+Box(Box(4521)),
+Box(Box(4522)),
+Box(Box(4523)),
+Box(Box(4524)),
+Box(Box(4525)),
+Box(Box(4526)),
+Box(Box(4527)),
+Box(Box(4528)),
+Box(Box(4529)),
+Box(Box(4530)),
+Box(Box(4531)),
+Box(Box(4532)),
+Box(Box(4533)),
+Box(Box(4534)),
+Box(Box(4535)),
+Box(Box(4536)),
+Box(Box(4537)),
+Box(Box(4538)),
+Box(Box(4539)),
+Box(Box(4540)),
+Box(Box(4541)),
+Box(Box(4542)),
+Box(Box(4543)),
+Box(Box(4544)),
+Box(Box(4545)),
+Box(Box(4546)),
+Box(Box(4547)),
+Box(Box(4548)),
+Box(Box(4549)),
+Box(Box(4550)),
+Box(Box(4551)),
+Box(Box(4552)),
+Box(Box(4553)),
+Box(Box(4554)),
+Box(Box(4555)),
+Box(Box(4556)),
+Box(Box(4557)),
+Box(Box(4558)),
+Box(Box(4559)),
+Box(Box(4560)),
+Box(Box(4561)),
+Box(Box(4562)),
+Box(Box(4563)),
+Box(Box(4564)),
+Box(Box(4565)),
+Box(Box(4566)),
+Box(Box(4567)),
+Box(Box(4568)),
+Box(Box(4569)),
+Box(Box(4570)),
+Box(Box(4571)),
+Box(Box(4572)),
+Box(Box(4573)),
+Box(Box(4574)),
+Box(Box(4575)),
+Box(Box(4576)),
+Box(Box(4577)),
+Box(Box(4578)),
+Box(Box(4579)),
+Box(Box(4580)),
+Box(Box(4581)),
+Box(Box(4582)),
+Box(Box(4583)),
+Box(Box(4584)),
+Box(Box(4585)),
+Box(Box(4586)),
+Box(Box(4587)),
+Box(Box(4588)),
+Box(Box(4589)),
+Box(Box(4590)),
+Box(Box(4591)),
+Box(Box(4592)),
+Box(Box(4593)),
+Box(Box(4594)),
+Box(Box(4595)),
+Box(Box(4596)),
+Box(Box(4597)),
+Box(Box(4598)),
+Box(Box(4599)),
+Box(Box(4600)),
+Box(Box(4601)),
+Box(Box(4602)),
+Box(Box(4603)),
+Box(Box(4604)),
+Box(Box(4605)),
+Box(Box(4606)),
+Box(Box(4607)),
+Box(Box(4608)),
+Box(Box(4609)),
+Box(Box(4610)),
+Box(Box(4611)),
+Box(Box(4612)),
+Box(Box(4613)),
+Box(Box(4614)),
+Box(Box(4615)),
+Box(Box(4616)),
+Box(Box(4617)),
+Box(Box(4618)),
+Box(Box(4619)),
+Box(Box(4620)),
+Box(Box(4621)),
+Box(Box(4622)),
+Box(Box(4623)),
+Box(Box(4624)),
+Box(Box(4625)),
+Box(Box(4626)),
+Box(Box(4627)),
+Box(Box(4628)),
+Box(Box(4629)),
+Box(Box(4630)),
+Box(Box(4631)),
+Box(Box(4632)),
+Box(Box(4633)),
+Box(Box(4634)),
+Box(Box(4635)),
+Box(Box(4636)),
+Box(Box(4637)),
+Box(Box(4638)),
+Box(Box(4639)),
+Box(Box(4640)),
+Box(Box(4641)),
+Box(Box(4642)),
+Box(Box(4643)),
+Box(Box(4644)),
+Box(Box(4645)),
+Box(Box(4646)),
+Box(Box(4647)),
+Box(Box(4648)),
+Box(Box(4649)),
+Box(Box(4650)),
+Box(Box(4651)),
+Box(Box(4652)),
+Box(Box(4653)),
+Box(Box(4654)),
+Box(Box(4655)),
+Box(Box(4656)),
+Box(Box(4657)),
+Box(Box(4658)),
+Box(Box(4659)),
+Box(Box(4660)),
+Box(Box(4661)),
+Box(Box(4662)),
+Box(Box(4663)),
+Box(Box(4664)),
+Box(Box(4665)),
+Box(Box(4666)),
+Box(Box(4667)),
+Box(Box(4668)),
+Box(Box(4669)),
+Box(Box(4670)),
+Box(Box(4671)),
+Box(Box(4672)),
+Box(Box(4673)),
+Box(Box(4674)),
+Box(Box(4675)),
+Box(Box(4676)),
+Box(Box(4677)),
+Box(Box(4678)),
+Box(Box(4679)),
+Box(Box(4680)),
+Box(Box(4681)),
+Box(Box(4682)),
+Box(Box(4683)),
+Box(Box(4684)),
+Box(Box(4685)),
+Box(Box(4686)),
+Box(Box(4687)),
+Box(Box(4688)),
+Box(Box(4689)),
+Box(Box(4690)),
+Box(Box(4691)),
+Box(Box(4692)),
+Box(Box(4693)),
+Box(Box(4694)),
+Box(Box(4695)),
+Box(Box(4696)),
+Box(Box(4697)),
+Box(Box(4698)),
+Box(Box(4699)),
+Box(Box(4700)),
+Box(Box(4701)),
+Box(Box(4702)),
+Box(Box(4703)),
+Box(Box(4704)),
+Box(Box(4705)),
+Box(Box(4706)),
+Box(Box(4707)),
+Box(Box(4708)),
+Box(Box(4709)),
+Box(Box(4710)),
+Box(Box(4711)),
+Box(Box(4712)),
+Box(Box(4713)),
+Box(Box(4714)),
+Box(Box(4715)),
+Box(Box(4716)),
+Box(Box(4717)),
+Box(Box(4718)),
+Box(Box(4719)),
+Box(Box(4720)),
+Box(Box(4721)),
+Box(Box(4722)),
+Box(Box(4723)),
+Box(Box(4724)),
+Box(Box(4725)),
+Box(Box(4726)),
+Box(Box(4727)),
+Box(Box(4728)),
+Box(Box(4729)),
+Box(Box(4730)),
+Box(Box(4731)),
+Box(Box(4732)),
+Box(Box(4733)),
+Box(Box(4734)),
+Box(Box(4735)),
+Box(Box(4736)),
+Box(Box(4737)),
+Box(Box(4738)),
+Box(Box(4739)),
+Box(Box(4740)),
+Box(Box(4741)),
+Box(Box(4742)),
+Box(Box(4743)),
+Box(Box(4744)),
+Box(Box(4745)),
+Box(Box(4746)),
+Box(Box(4747)),
+Box(Box(4748)),
+Box(Box(4749)),
+Box(Box(4750)),
+Box(Box(4751)),
+Box(Box(4752)),
+Box(Box(4753)),
+Box(Box(4754)),
+Box(Box(4755)),
+Box(Box(4756)),
+Box(Box(4757)),
+Box(Box(4758)),
+Box(Box(4759)),
+Box(Box(4760)),
+Box(Box(4761)),
+Box(Box(4762)),
+Box(Box(4763)),
+Box(Box(4764)),
+Box(Box(4765)),
+Box(Box(4766)),
+Box(Box(4767)),
+Box(Box(4768)),
+Box(Box(4769)),
+Box(Box(4770)),
+Box(Box(4771)),
+Box(Box(4772)),
+Box(Box(4773)),
+Box(Box(4774)),
+Box(Box(4775)),
+Box(Box(4776)),
+Box(Box(4777)),
+Box(Box(4778)),
+Box(Box(4779)),
+Box(Box(4780)),
+Box(Box(4781)),
+Box(Box(4782)),
+Box(Box(4783)),
+Box(Box(4784)),
+Box(Box(4785)),
+Box(Box(4786)),
+Box(Box(4787)),
+Box(Box(4788)),
+Box(Box(4789)),
+Box(Box(4790)),
+Box(Box(4791)),
+Box(Box(4792)),
+Box(Box(4793)),
+Box(Box(4794)),
+Box(Box(4795)),
+Box(Box(4796)),
+Box(Box(4797)),
+Box(Box(4798)),
+Box(Box(4799)),
+Box(Box(4800)),
+Box(Box(4801)),
+Box(Box(4802)),
+Box(Box(4803)),
+Box(Box(4804)),
+Box(Box(4805)),
+Box(Box(4806)),
+Box(Box(4807)),
+Box(Box(4808)),
+Box(Box(4809)),
+Box(Box(4810)),
+Box(Box(4811)),
+Box(Box(4812)),
+Box(Box(4813)),
+Box(Box(4814)),
+Box(Box(4815)),
+Box(Box(4816)),
+Box(Box(4817)),
+Box(Box(4818)),
+Box(Box(4819)),
+Box(Box(4820)),
+Box(Box(4821)),
+Box(Box(4822)),
+Box(Box(4823)),
+Box(Box(4824)),
+Box(Box(4825)),
+Box(Box(4826)),
+Box(Box(4827)),
+Box(Box(4828)),
+Box(Box(4829)),
+Box(Box(4830)),
+Box(Box(4831)),
+Box(Box(4832)),
+Box(Box(4833)),
+Box(Box(4834)),
+Box(Box(4835)),
+Box(Box(4836)),
+Box(Box(4837)),
+Box(Box(4838)),
+Box(Box(4839)),
+Box(Box(4840)),
+Box(Box(4841)),
+Box(Box(4842)),
+Box(Box(4843)),
+Box(Box(4844)),
+Box(Box(4845)),
+Box(Box(4846)),
+Box(Box(4847)),
+Box(Box(4848)),
+Box(Box(4849)),
+Box(Box(4850)),
+Box(Box(4851)),
+Box(Box(4852)),
+Box(Box(4853)),
+Box(Box(4854)),
+Box(Box(4855)),
+Box(Box(4856)),
+Box(Box(4857)),
+Box(Box(4858)),
+Box(Box(4859)),
+Box(Box(4860)),
+Box(Box(4861)),
+Box(Box(4862)),
+Box(Box(4863)),
+Box(Box(4864)),
+Box(Box(4865)),
+Box(Box(4866)),
+Box(Box(4867)),
+Box(Box(4868)),
+Box(Box(4869)),
+Box(Box(4870)),
+Box(Box(4871)),
+Box(Box(4872)),
+Box(Box(4873)),
+Box(Box(4874)),
+Box(Box(4875)),
+Box(Box(4876)),
+Box(Box(4877)),
+Box(Box(4878)),
+Box(Box(4879)),
+Box(Box(4880)),
+Box(Box(4881)),
+Box(Box(4882)),
+Box(Box(4883)),
+Box(Box(4884)),
+Box(Box(4885)),
+Box(Box(4886)),
+Box(Box(4887)),
+Box(Box(4888)),
+Box(Box(4889)),
+Box(Box(4890)),
+Box(Box(4891)),
+Box(Box(4892)),
+Box(Box(4893)),
+Box(Box(4894)),
+Box(Box(4895)),
+Box(Box(4896)),
+Box(Box(4897)),
+Box(Box(4898)),
+Box(Box(4899)),
+Box(Box(4900)),
+Box(Box(4901)),
+Box(Box(4902)),
+Box(Box(4903)),
+Box(Box(4904)),
+Box(Box(4905)),
+Box(Box(4906)),
+Box(Box(4907)),
+Box(Box(4908)),
+Box(Box(4909)),
+Box(Box(4910)),
+Box(Box(4911)),
+Box(Box(4912)),
+Box(Box(4913)),
+Box(Box(4914)),
+Box(Box(4915)),
+Box(Box(4916)),
+Box(Box(4917)),
+Box(Box(4918)),
+Box(Box(4919)),
+Box(Box(4920)),
+Box(Box(4921)),
+Box(Box(4922)),
+Box(Box(4923)),
+Box(Box(4924)),
+Box(Box(4925)),
+Box(Box(4926)),
+Box(Box(4927)),
+Box(Box(4928)),
+Box(Box(4929)),
+Box(Box(4930)),
+Box(Box(4931)),
+Box(Box(4932)),
+Box(Box(4933)),
+Box(Box(4934)),
+Box(Box(4935)),
+Box(Box(4936)),
+Box(Box(4937)),
+Box(Box(4938)),
+Box(Box(4939)),
+Box(Box(4940)),
+Box(Box(4941)),
+Box(Box(4942)),
+Box(Box(4943)),
+Box(Box(4944)),
+Box(Box(4945)),
+Box(Box(4946)),
+Box(Box(4947)),
+Box(Box(4948)),
+Box(Box(4949)),
+Box(Box(4950)),
+Box(Box(4951)),
+Box(Box(4952)),
+Box(Box(4953)),
+Box(Box(4954)),
+Box(Box(4955)),
+Box(Box(4956)),
+Box(Box(4957)),
+Box(Box(4958)),
+Box(Box(4959)),
+Box(Box(4960)),
+Box(Box(4961)),
+Box(Box(4962)),
+Box(Box(4963)),
+Box(Box(4964)),
+Box(Box(4965)),
+Box(Box(4966)),
+Box(Box(4967)),
+Box(Box(4968)),
+Box(Box(4969)),
+Box(Box(4970)),
+Box(Box(4971)),
+Box(Box(4972)),
+Box(Box(4973)),
+Box(Box(4974)),
+Box(Box(4975)),
+Box(Box(4976)),
+Box(Box(4977)),
+Box(Box(4978)),
+Box(Box(4979)),
+Box(Box(4980)),
+Box(Box(4981)),
+Box(Box(4982)),
+Box(Box(4983)),
+Box(Box(4984)),
+Box(Box(4985)),
+Box(Box(4986)),
+Box(Box(4987)),
+Box(Box(4988)),
+Box(Box(4989)),
+Box(Box(4990)),
+Box(Box(4991)),
+Box(Box(4992)),
+Box(Box(4993)),
+Box(Box(4994)),
+Box(Box(4995)),
+Box(Box(4996)),
+Box(Box(4997)),
+Box(Box(4998)),
+Box(Box(4999)),
+Box(Box(5000)),
+Box(Box(5001)),
+Box(Box(5002)),
+Box(Box(5003)),
+Box(Box(5004)),
+Box(Box(5005)),
+Box(Box(5006)),
+Box(Box(5007)),
+Box(Box(5008)),
+Box(Box(5009)),
+Box(Box(5010)),
+Box(Box(5011)),
+Box(Box(5012)),
+Box(Box(5013)),
+Box(Box(5014)),
+Box(Box(5015)),
+Box(Box(5016)),
+Box(Box(5017)),
+Box(Box(5018)),
+Box(Box(5019)),
+Box(Box(5020)),
+Box(Box(5021)),
+Box(Box(5022)),
+Box(Box(5023)),
+Box(Box(5024)),
+Box(Box(5025)),
+Box(Box(5026)),
+Box(Box(5027)),
+Box(Box(5028)),
+Box(Box(5029)),
+Box(Box(5030)),
+Box(Box(5031)),
+Box(Box(5032)),
+Box(Box(5033)),
+Box(Box(5034)),
+Box(Box(5035)),
+Box(Box(5036)),
+Box(Box(5037)),
+Box(Box(5038)),
+Box(Box(5039)),
+Box(Box(5040)),
+Box(Box(5041)),
+Box(Box(5042)),
+Box(Box(5043)),
+Box(Box(5044)),
+Box(Box(5045)),
+Box(Box(5046)),
+Box(Box(5047)),
+Box(Box(5048)),
+Box(Box(5049)),
+Box(Box(5050)),
+Box(Box(5051)),
+Box(Box(5052)),
+Box(Box(5053)),
+Box(Box(5054)),
+Box(Box(5055)),
+Box(Box(5056)),
+Box(Box(5057)),
+Box(Box(5058)),
+Box(Box(5059)),
+Box(Box(5060)),
+Box(Box(5061)),
+Box(Box(5062)),
+Box(Box(5063)),
+Box(Box(5064)),
+Box(Box(5065)),
+Box(Box(5066)),
+Box(Box(5067)),
+Box(Box(5068)),
+Box(Box(5069)),
+Box(Box(5070)),
+Box(Box(5071)),
+Box(Box(5072)),
+Box(Box(5073)),
+Box(Box(5074)),
+Box(Box(5075)),
+Box(Box(5076)),
+Box(Box(5077)),
+Box(Box(5078)),
+Box(Box(5079)),
+Box(Box(5080)),
+Box(Box(5081)),
+Box(Box(5082)),
+Box(Box(5083)),
+Box(Box(5084)),
+Box(Box(5085)),
+Box(Box(5086)),
+Box(Box(5087)),
+Box(Box(5088)),
+Box(Box(5089)),
+Box(Box(5090)),
+Box(Box(5091)),
+Box(Box(5092)),
+Box(Box(5093)),
+Box(Box(5094)),
+Box(Box(5095)),
+Box(Box(5096)),
+Box(Box(5097)),
+Box(Box(5098)),
+Box(Box(5099)),
+Box(Box(5100)),
+Box(Box(5101)),
+Box(Box(5102)),
+Box(Box(5103)),
+Box(Box(5104)),
+Box(Box(5105)),
+Box(Box(5106)),
+Box(Box(5107)),
+Box(Box(5108)),
+Box(Box(5109)),
+Box(Box(5110)),
+Box(Box(5111)),
+Box(Box(5112)),
+Box(Box(5113)),
+Box(Box(5114)),
+Box(Box(5115)),
+Box(Box(5116)),
+Box(Box(5117)),
+Box(Box(5118)),
+Box(Box(5119)),
+Box(Box(5120)),
+Box(Box(5121)),
+Box(Box(5122)),
+Box(Box(5123)),
+Box(Box(5124)),
+Box(Box(5125)),
+Box(Box(5126)),
+Box(Box(5127)),
+Box(Box(5128)),
+Box(Box(5129)),
+Box(Box(5130)),
+Box(Box(5131)),
+Box(Box(5132)),
+Box(Box(5133)),
+Box(Box(5134)),
+Box(Box(5135)),
+Box(Box(5136)),
+Box(Box(5137)),
+Box(Box(5138)),
+Box(Box(5139)),
+Box(Box(5140)),
+Box(Box(5141)),
+Box(Box(5142)),
+Box(Box(5143)),
+Box(Box(5144)),
+Box(Box(5145)),
+Box(Box(5146)),
+Box(Box(5147)),
+Box(Box(5148)),
+Box(Box(5149)),
+Box(Box(5150)),
+Box(Box(5151)),
+Box(Box(5152)),
+Box(Box(5153)),
+Box(Box(5154)),
+Box(Box(5155)),
+Box(Box(5156)),
+Box(Box(5157)),
+Box(Box(5158)),
+Box(Box(5159)),
+Box(Box(5160)),
+Box(Box(5161)),
+Box(Box(5162)),
+Box(Box(5163)),
+Box(Box(5164)),
+Box(Box(5165)),
+Box(Box(5166)),
+Box(Box(5167)),
+Box(Box(5168)),
+Box(Box(5169)),
+Box(Box(5170)),
+Box(Box(5171)),
+Box(Box(5172)),
+Box(Box(5173)),
+Box(Box(5174)),
+Box(Box(5175)),
+Box(Box(5176)),
+Box(Box(5177)),
+Box(Box(5178)),
+Box(Box(5179)),
+Box(Box(5180)),
+Box(Box(5181)),
+Box(Box(5182)),
+Box(Box(5183)),
+Box(Box(5184)),
+Box(Box(5185)),
+Box(Box(5186)),
+Box(Box(5187)),
+Box(Box(5188)),
+Box(Box(5189)),
+Box(Box(5190)),
+Box(Box(5191)),
+Box(Box(5192)),
+Box(Box(5193)),
+Box(Box(5194)),
+Box(Box(5195)),
+Box(Box(5196)),
+Box(Box(5197)),
+Box(Box(5198)),
+Box(Box(5199)),
+Box(Box(5200)),
+Box(Box(5201)),
+Box(Box(5202)),
+Box(Box(5203)),
+Box(Box(5204)),
+Box(Box(5205)),
+Box(Box(5206)),
+Box(Box(5207)),
+Box(Box(5208)),
+Box(Box(5209)),
+Box(Box(5210)),
+Box(Box(5211)),
+Box(Box(5212)),
+Box(Box(5213)),
+Box(Box(5214)),
+Box(Box(5215)),
+Box(Box(5216)),
+Box(Box(5217)),
+Box(Box(5218)),
+Box(Box(5219)),
+Box(Box(5220)),
+Box(Box(5221)),
+Box(Box(5222)),
+Box(Box(5223)),
+Box(Box(5224)),
+Box(Box(5225)),
+Box(Box(5226)),
+Box(Box(5227)),
+Box(Box(5228)),
+Box(Box(5229)),
+Box(Box(5230)),
+Box(Box(5231)),
+Box(Box(5232)),
+Box(Box(5233)),
+Box(Box(5234)),
+Box(Box(5235)),
+Box(Box(5236)),
+Box(Box(5237)),
+Box(Box(5238)),
+Box(Box(5239)),
+Box(Box(5240)),
+Box(Box(5241)),
+Box(Box(5242)),
+Box(Box(5243)),
+Box(Box(5244)),
+Box(Box(5245)),
+Box(Box(5246)),
+Box(Box(5247)),
+Box(Box(5248)),
+Box(Box(5249)),
+Box(Box(5250)),
+Box(Box(5251)),
+Box(Box(5252)),
+Box(Box(5253)),
+Box(Box(5254)),
+Box(Box(5255)),
+Box(Box(5256)),
+Box(Box(5257)),
+Box(Box(5258)),
+Box(Box(5259)),
+Box(Box(5260)),
+Box(Box(5261)),
+Box(Box(5262)),
+Box(Box(5263)),
+Box(Box(5264)),
+Box(Box(5265)),
+Box(Box(5266)),
+Box(Box(5267)),
+Box(Box(5268)),
+Box(Box(5269)),
+Box(Box(5270)),
+Box(Box(5271)),
+Box(Box(5272)),
+Box(Box(5273)),
+Box(Box(5274)),
+Box(Box(5275)),
+Box(Box(5276)),
+Box(Box(5277)),
+Box(Box(5278)),
+Box(Box(5279)),
+Box(Box(5280)),
+Box(Box(5281)),
+Box(Box(5282)),
+Box(Box(5283)),
+Box(Box(5284)),
+Box(Box(5285)),
+Box(Box(5286)),
+Box(Box(5287)),
+Box(Box(5288)),
+Box(Box(5289)),
+Box(Box(5290)),
+Box(Box(5291)),
+Box(Box(5292)),
+Box(Box(5293)),
+Box(Box(5294)),
+Box(Box(5295)),
+Box(Box(5296)),
+Box(Box(5297)),
+Box(Box(5298)),
+Box(Box(5299)),
+Box(Box(5300)),
+Box(Box(5301)),
+Box(Box(5302)),
+Box(Box(5303)),
+Box(Box(5304)),
+Box(Box(5305)),
+Box(Box(5306)),
+Box(Box(5307)),
+Box(Box(5308)),
+Box(Box(5309)),
+Box(Box(5310)),
+Box(Box(5311)),
+Box(Box(5312)),
+Box(Box(5313)),
+Box(Box(5314)),
+Box(Box(5315)),
+Box(Box(5316)),
+Box(Box(5317)),
+Box(Box(5318)),
+Box(Box(5319)),
+Box(Box(5320)),
+Box(Box(5321)),
+Box(Box(5322)),
+Box(Box(5323)),
+Box(Box(5324)),
+Box(Box(5325)),
+Box(Box(5326)),
+Box(Box(5327)),
+Box(Box(5328)),
+Box(Box(5329)),
+Box(Box(5330)),
+Box(Box(5331)),
+Box(Box(5332)),
+Box(Box(5333)),
+Box(Box(5334)),
+Box(Box(5335)),
+Box(Box(5336)),
+Box(Box(5337)),
+Box(Box(5338)),
+Box(Box(5339)),
+Box(Box(5340)),
+Box(Box(5341)),
+Box(Box(5342)),
+Box(Box(5343)),
+Box(Box(5344)),
+Box(Box(5345)),
+Box(Box(5346)),
+Box(Box(5347)),
+Box(Box(5348)),
+Box(Box(5349)),
+Box(Box(5350)),
+Box(Box(5351)),
+Box(Box(5352)),
+Box(Box(5353)),
+Box(Box(5354)),
+Box(Box(5355)),
+Box(Box(5356)),
+Box(Box(5357)),
+Box(Box(5358)),
+Box(Box(5359)),
+Box(Box(5360)),
+Box(Box(5361)),
+Box(Box(5362)),
+Box(Box(5363)),
+Box(Box(5364)),
+Box(Box(5365)),
+Box(Box(5366)),
+Box(Box(5367)),
+Box(Box(5368)),
+Box(Box(5369)),
+Box(Box(5370)),
+Box(Box(5371)),
+Box(Box(5372)),
+Box(Box(5373)),
+Box(Box(5374)),
+Box(Box(5375)),
+Box(Box(5376)),
+Box(Box(5377)),
+Box(Box(5378)),
+Box(Box(5379)),
+Box(Box(5380)),
+Box(Box(5381)),
+Box(Box(5382)),
+Box(Box(5383)),
+Box(Box(5384)),
+Box(Box(5385)),
+Box(Box(5386)),
+Box(Box(5387)),
+Box(Box(5388)),
+Box(Box(5389)),
+Box(Box(5390)),
+Box(Box(5391)),
+Box(Box(5392)),
+Box(Box(5393)),
+Box(Box(5394)),
+Box(Box(5395)),
+Box(Box(5396)),
+Box(Box(5397)),
+Box(Box(5398)),
+Box(Box(5399)),
+Box(Box(5400)),
+Box(Box(5401)),
+Box(Box(5402)),
+Box(Box(5403)),
+Box(Box(5404)),
+Box(Box(5405)),
+Box(Box(5406)),
+Box(Box(5407)),
+Box(Box(5408)),
+Box(Box(5409)),
+Box(Box(5410)),
+Box(Box(5411)),
+Box(Box(5412)),
+Box(Box(5413)),
+Box(Box(5414)),
+Box(Box(5415)),
+Box(Box(5416)),
+Box(Box(5417)),
+Box(Box(5418)),
+Box(Box(5419)),
+Box(Box(5420)),
+Box(Box(5421)),
+Box(Box(5422)),
+Box(Box(5423)),
+Box(Box(5424)),
+Box(Box(5425)),
+Box(Box(5426)),
+Box(Box(5427)),
+Box(Box(5428)),
+Box(Box(5429)),
+Box(Box(5430)),
+Box(Box(5431)),
+Box(Box(5432)),
+Box(Box(5433)),
+Box(Box(5434)),
+Box(Box(5435)),
+Box(Box(5436)),
+Box(Box(5437)),
+Box(Box(5438)),
+Box(Box(5439)),
+Box(Box(5440)),
+Box(Box(5441)),
+Box(Box(5442)),
+Box(Box(5443)),
+Box(Box(5444)),
+Box(Box(5445)),
+Box(Box(5446)),
+Box(Box(5447)),
+Box(Box(5448)),
+Box(Box(5449)),
+Box(Box(5450)),
+Box(Box(5451)),
+Box(Box(5452)),
+Box(Box(5453)),
+Box(Box(5454)),
+Box(Box(5455)),
+Box(Box(5456)),
+Box(Box(5457)),
+Box(Box(5458)),
+Box(Box(5459)),
+Box(Box(5460)),
+Box(Box(5461)),
+Box(Box(5462)),
+Box(Box(5463)),
+Box(Box(5464)),
+Box(Box(5465)),
+Box(Box(5466)),
+Box(Box(5467)),
+Box(Box(5468)),
+Box(Box(5469)),
+Box(Box(5470)),
+Box(Box(5471)),
+Box(Box(5472)),
+Box(Box(5473)),
+Box(Box(5474)),
+Box(Box(5475)),
+Box(Box(5476)),
+Box(Box(5477)),
+Box(Box(5478)),
+Box(Box(5479)),
+Box(Box(5480)),
+Box(Box(5481)),
+Box(Box(5482)),
+Box(Box(5483)),
+Box(Box(5484)),
+Box(Box(5485)),
+Box(Box(5486)),
+Box(Box(5487)),
+Box(Box(5488)),
+Box(Box(5489)),
+Box(Box(5490)),
+Box(Box(5491)),
+Box(Box(5492)),
+Box(Box(5493)),
+Box(Box(5494)),
+Box(Box(5495)),
+Box(Box(5496)),
+Box(Box(5497)),
+Box(Box(5498)),
+Box(Box(5499)),
+Box(Box(5500)),
+Box(Box(5501)),
+Box(Box(5502)),
+Box(Box(5503)),
+Box(Box(5504)),
+Box(Box(5505)),
+Box(Box(5506)),
+Box(Box(5507)),
+Box(Box(5508)),
+Box(Box(5509)),
+Box(Box(5510)),
+Box(Box(5511)),
+Box(Box(5512)),
+Box(Box(5513)),
+Box(Box(5514)),
+Box(Box(5515)),
+Box(Box(5516)),
+Box(Box(5517)),
+Box(Box(5518)),
+Box(Box(5519)),
+Box(Box(5520)),
+Box(Box(5521)),
+Box(Box(5522)),
+Box(Box(5523)),
+Box(Box(5524)),
+Box(Box(5525)),
+Box(Box(5526)),
+Box(Box(5527)),
+Box(Box(5528)),
+Box(Box(5529)),
+Box(Box(5530)),
+Box(Box(5531)),
+Box(Box(5532)),
+Box(Box(5533)),
+Box(Box(5534)),
+Box(Box(5535)),
+Box(Box(5536)),
+Box(Box(5537)),
+Box(Box(5538)),
+Box(Box(5539)),
+Box(Box(5540)),
+Box(Box(5541)),
+Box(Box(5542)),
+Box(Box(5543)),
+Box(Box(5544)),
+Box(Box(5545)),
+Box(Box(5546)),
+Box(Box(5547)),
+Box(Box(5548)),
+Box(Box(5549)),
+Box(Box(5550)),
+Box(Box(5551)),
+Box(Box(5552)),
+Box(Box(5553)),
+Box(Box(5554)),
+Box(Box(5555)),
+Box(Box(5556)),
+Box(Box(5557)),
+Box(Box(5558)),
+Box(Box(5559)),
+Box(Box(5560)),
+Box(Box(5561)),
+Box(Box(5562)),
+Box(Box(5563)),
+Box(Box(5564)),
+Box(Box(5565)),
+Box(Box(5566)),
+Box(Box(5567)),
+Box(Box(5568)),
+Box(Box(5569)),
+Box(Box(5570)),
+Box(Box(5571)),
+Box(Box(5572)),
+Box(Box(5573)),
+Box(Box(5574)),
+Box(Box(5575)),
+Box(Box(5576)),
+Box(Box(5577)),
+Box(Box(5578)),
+Box(Box(5579)),
+Box(Box(5580)),
+Box(Box(5581)),
+Box(Box(5582)),
+Box(Box(5583)),
+Box(Box(5584)),
+Box(Box(5585)),
+Box(Box(5586)),
+Box(Box(5587)),
+Box(Box(5588)),
+Box(Box(5589)),
+Box(Box(5590)),
+Box(Box(5591)),
+Box(Box(5592)),
+Box(Box(5593)),
+Box(Box(5594)),
+Box(Box(5595)),
+Box(Box(5596)),
+Box(Box(5597)),
+Box(Box(5598)),
+Box(Box(5599)),
+Box(Box(5600)),
+Box(Box(5601)),
+Box(Box(5602)),
+Box(Box(5603)),
+Box(Box(5604)),
+Box(Box(5605)),
+Box(Box(5606)),
+Box(Box(5607)),
+Box(Box(5608)),
+Box(Box(5609)),
+Box(Box(5610)),
+Box(Box(5611)),
+Box(Box(5612)),
+Box(Box(5613)),
+Box(Box(5614)),
+Box(Box(5615)),
+Box(Box(5616)),
+Box(Box(5617)),
+Box(Box(5618)),
+Box(Box(5619)),
+Box(Box(5620)),
+Box(Box(5621)),
+Box(Box(5622)),
+Box(Box(5623)),
+Box(Box(5624)),
+Box(Box(5625)),
+Box(Box(5626)),
+Box(Box(5627)),
+Box(Box(5628)),
+Box(Box(5629)),
+Box(Box(5630)),
+Box(Box(5631)),
+Box(Box(5632)),
+Box(Box(5633)),
+Box(Box(5634)),
+Box(Box(5635)),
+Box(Box(5636)),
+Box(Box(5637)),
+Box(Box(5638)),
+Box(Box(5639)),
+Box(Box(5640)),
+Box(Box(5641)),
+Box(Box(5642)),
+Box(Box(5643)),
+Box(Box(5644)),
+Box(Box(5645)),
+Box(Box(5646)),
+Box(Box(5647)),
+Box(Box(5648)),
+Box(Box(5649)),
+Box(Box(5650)),
+Box(Box(5651)),
+Box(Box(5652)),
+Box(Box(5653)),
+Box(Box(5654)),
+Box(Box(5655)),
+Box(Box(5656)),
+Box(Box(5657)),
+Box(Box(5658)),
+Box(Box(5659)),
+Box(Box(5660)),
+Box(Box(5661)),
+Box(Box(5662)),
+Box(Box(5663)),
+Box(Box(5664)),
+Box(Box(5665)),
+Box(Box(5666)),
+Box(Box(5667)),
+Box(Box(5668)),
+Box(Box(5669)),
+Box(Box(5670)),
+Box(Box(5671)),
+Box(Box(5672)),
+Box(Box(5673)),
+Box(Box(5674)),
+Box(Box(5675)),
+Box(Box(5676)),
+Box(Box(5677)),
+Box(Box(5678)),
+Box(Box(5679)),
+Box(Box(5680)),
+Box(Box(5681)),
+Box(Box(5682)),
+Box(Box(5683)),
+Box(Box(5684)),
+Box(Box(5685)),
+Box(Box(5686)),
+Box(Box(5687)),
+Box(Box(5688)),
+Box(Box(5689)),
+Box(Box(5690)),
+Box(Box(5691)),
+Box(Box(5692)),
+Box(Box(5693)),
+Box(Box(5694)),
+Box(Box(5695)),
+Box(Box(5696)),
+Box(Box(5697)),
+Box(Box(5698)),
+Box(Box(5699)),
+Box(Box(5700)),
+Box(Box(5701)),
+Box(Box(5702)),
+Box(Box(5703)),
+Box(Box(5704)),
+Box(Box(5705)),
+Box(Box(5706)),
+Box(Box(5707)),
+Box(Box(5708)),
+Box(Box(5709)),
+Box(Box(5710)),
+Box(Box(5711)),
+Box(Box(5712)),
+Box(Box(5713)),
+Box(Box(5714)),
+Box(Box(5715)),
+Box(Box(5716)),
+Box(Box(5717)),
+Box(Box(5718)),
+Box(Box(5719)),
+Box(Box(5720)),
+Box(Box(5721)),
+Box(Box(5722)),
+Box(Box(5723)),
+Box(Box(5724)),
+Box(Box(5725)),
+Box(Box(5726)),
+Box(Box(5727)),
+Box(Box(5728)),
+Box(Box(5729)),
+Box(Box(5730)),
+Box(Box(5731)),
+Box(Box(5732)),
+Box(Box(5733)),
+Box(Box(5734)),
+Box(Box(5735)),
+Box(Box(5736)),
+Box(Box(5737)),
+Box(Box(5738)),
+Box(Box(5739)),
+Box(Box(5740)),
+Box(Box(5741)),
+Box(Box(5742)),
+Box(Box(5743)),
+Box(Box(5744)),
+Box(Box(5745)),
+Box(Box(5746)),
+Box(Box(5747)),
+Box(Box(5748)),
+Box(Box(5749)),
+Box(Box(5750)),
+Box(Box(5751)),
+Box(Box(5752)),
+Box(Box(5753)),
+Box(Box(5754)),
+Box(Box(5755)),
+Box(Box(5756)),
+Box(Box(5757)),
+Box(Box(5758)),
+Box(Box(5759)),
+Box(Box(5760)),
+Box(Box(5761)),
+Box(Box(5762)),
+Box(Box(5763)),
+Box(Box(5764)),
+Box(Box(5765)),
+Box(Box(5766)),
+Box(Box(5767)),
+Box(Box(5768)),
+Box(Box(5769)),
+Box(Box(5770)),
+Box(Box(5771)),
+Box(Box(5772)),
+Box(Box(5773)),
+Box(Box(5774)),
+Box(Box(5775)),
+Box(Box(5776)),
+Box(Box(5777)),
+Box(Box(5778)),
+Box(Box(5779)),
+Box(Box(5780)),
+Box(Box(5781)),
+Box(Box(5782)),
+Box(Box(5783)),
+Box(Box(5784)),
+Box(Box(5785)),
+Box(Box(5786)),
+Box(Box(5787)),
+Box(Box(5788)),
+Box(Box(5789)),
+Box(Box(5790)),
+Box(Box(5791)),
+Box(Box(5792)),
+Box(Box(5793)),
+Box(Box(5794)),
+Box(Box(5795)),
+Box(Box(5796)),
+Box(Box(5797)),
+Box(Box(5798)),
+Box(Box(5799)),
+Box(Box(5800)),
+Box(Box(5801)),
+Box(Box(5802)),
+Box(Box(5803)),
+Box(Box(5804)),
+Box(Box(5805)),
+Box(Box(5806)),
+Box(Box(5807)),
+Box(Box(5808)),
+Box(Box(5809)),
+Box(Box(5810)),
+Box(Box(5811)),
+Box(Box(5812)),
+Box(Box(5813)),
+Box(Box(5814)),
+Box(Box(5815)),
+Box(Box(5816)),
+Box(Box(5817)),
+Box(Box(5818)),
+Box(Box(5819)),
+Box(Box(5820)),
+Box(Box(5821)),
+Box(Box(5822)),
+Box(Box(5823)),
+Box(Box(5824)),
+Box(Box(5825)),
+Box(Box(5826)),
+Box(Box(5827)),
+Box(Box(5828)),
+Box(Box(5829)),
+Box(Box(5830)),
+Box(Box(5831)),
+Box(Box(5832)),
+Box(Box(5833)),
+Box(Box(5834)),
+Box(Box(5835)),
+Box(Box(5836)),
+Box(Box(5837)),
+Box(Box(5838)),
+Box(Box(5839)),
+Box(Box(5840)),
+Box(Box(5841)),
+Box(Box(5842)),
+Box(Box(5843)),
+Box(Box(5844)),
+Box(Box(5845)),
+Box(Box(5846)),
+Box(Box(5847)),
+Box(Box(5848)),
+Box(Box(5849)),
+Box(Box(5850)),
+Box(Box(5851)),
+Box(Box(5852)),
+Box(Box(5853)),
+Box(Box(5854)),
+Box(Box(5855)),
+Box(Box(5856)),
+Box(Box(5857)),
+Box(Box(5858)),
+Box(Box(5859)),
+Box(Box(5860)),
+Box(Box(5861)),
+Box(Box(5862)),
+Box(Box(5863)),
+Box(Box(5864)),
+Box(Box(5865)),
+Box(Box(5866)),
+Box(Box(5867)),
+Box(Box(5868)),
+Box(Box(5869)),
+Box(Box(5870)),
+Box(Box(5871)),
+Box(Box(5872)),
+Box(Box(5873)),
+Box(Box(5874)),
+Box(Box(5875)),
+Box(Box(5876)),
+Box(Box(5877)),
+Box(Box(5878)),
+Box(Box(5879)),
+Box(Box(5880)),
+Box(Box(5881)),
+Box(Box(5882)),
+Box(Box(5883)),
+Box(Box(5884)),
+Box(Box(5885)),
+Box(Box(5886)),
+Box(Box(5887)),
+Box(Box(5888)),
+Box(Box(5889)),
+Box(Box(5890)),
+Box(Box(5891)),
+Box(Box(5892)),
+Box(Box(5893)),
+Box(Box(5894)),
+Box(Box(5895)),
+Box(Box(5896)),
+Box(Box(5897)),
+Box(Box(5898)),
+Box(Box(5899)),
+Box(Box(5900)),
+Box(Box(5901)),
+Box(Box(5902)),
+Box(Box(5903)),
+Box(Box(5904)),
+Box(Box(5905)),
+Box(Box(5906)),
+Box(Box(5907)),
+Box(Box(5908)),
+Box(Box(5909)),
+Box(Box(5910)),
+Box(Box(5911)),
+Box(Box(5912)),
+Box(Box(5913)),
+Box(Box(5914)),
+Box(Box(5915)),
+Box(Box(5916)),
+Box(Box(5917)),
+Box(Box(5918)),
+Box(Box(5919)),
+Box(Box(5920)),
+Box(Box(5921)),
+Box(Box(5922)),
+Box(Box(5923)),
+Box(Box(5924)),
+Box(Box(5925)),
+Box(Box(5926)),
+Box(Box(5927)),
+Box(Box(5928)),
+Box(Box(5929)),
+Box(Box(5930)),
+Box(Box(5931)),
+Box(Box(5932)),
+Box(Box(5933)),
+Box(Box(5934)),
+Box(Box(5935)),
+Box(Box(5936)),
+Box(Box(5937)),
+Box(Box(5938)),
+Box(Box(5939)),
+Box(Box(5940)),
+Box(Box(5941)),
+Box(Box(5942)),
+Box(Box(5943)),
+Box(Box(5944)),
+Box(Box(5945)),
+Box(Box(5946)),
+Box(Box(5947)),
+Box(Box(5948)),
+Box(Box(5949)),
+Box(Box(5950)),
+Box(Box(5951)),
+Box(Box(5952)),
+Box(Box(5953)),
+Box(Box(5954)),
+Box(Box(5955)),
+Box(Box(5956)),
+Box(Box(5957)),
+Box(Box(5958)),
+Box(Box(5959)),
+Box(Box(5960)),
+Box(Box(5961)),
+Box(Box(5962)),
+Box(Box(5963)),
+Box(Box(5964)),
+Box(Box(5965)),
+Box(Box(5966)),
+Box(Box(5967)),
+Box(Box(5968)),
+Box(Box(5969)),
+Box(Box(5970)),
+Box(Box(5971)),
+Box(Box(5972)),
+Box(Box(5973)),
+Box(Box(5974)),
+Box(Box(5975)),
+Box(Box(5976)),
+Box(Box(5977)),
+Box(Box(5978)),
+Box(Box(5979)),
+Box(Box(5980)),
+Box(Box(5981)),
+Box(Box(5982)),
+Box(Box(5983)),
+Box(Box(5984)),
+Box(Box(5985)),
+Box(Box(5986)),
+Box(Box(5987)),
+Box(Box(5988)),
+Box(Box(5989)),
+Box(Box(5990)),
+Box(Box(5991)),
+Box(Box(5992)),
+Box(Box(5993)),
+Box(Box(5994)),
+Box(Box(5995)),
+Box(Box(5996)),
+Box(Box(5997)),
+Box(Box(5998)),
+Box(Box(5999)),
+Box(Box(6000)),
+Box(Box(6001)),
+Box(Box(6002)),
+Box(Box(6003)),
+Box(Box(6004)),
+Box(Box(6005)),
+Box(Box(6006)),
+Box(Box(6007)),
+Box(Box(6008)),
+Box(Box(6009)),
+Box(Box(6010)),
+Box(Box(6011)),
+Box(Box(6012)),
+Box(Box(6013)),
+Box(Box(6014)),
+Box(Box(6015)),
+Box(Box(6016)),
+Box(Box(6017)),
+Box(Box(6018)),
+Box(Box(6019)),
+Box(Box(6020)),
+Box(Box(6021)),
+Box(Box(6022)),
+Box(Box(6023)),
+Box(Box(6024)),
+Box(Box(6025)),
+Box(Box(6026)),
+Box(Box(6027)),
+Box(Box(6028)),
+Box(Box(6029)),
+Box(Box(6030)),
+Box(Box(6031)),
+Box(Box(6032)),
+Box(Box(6033)),
+Box(Box(6034)),
+Box(Box(6035)),
+Box(Box(6036)),
+Box(Box(6037)),
+Box(Box(6038)),
+Box(Box(6039)),
+Box(Box(6040)),
+Box(Box(6041)),
+Box(Box(6042)),
+Box(Box(6043)),
+Box(Box(6044)),
+Box(Box(6045)),
+Box(Box(6046)),
+Box(Box(6047)),
+Box(Box(6048)),
+Box(Box(6049)),
+Box(Box(6050)),
+Box(Box(6051)),
+Box(Box(6052)),
+Box(Box(6053)),
+Box(Box(6054)),
+Box(Box(6055)),
+Box(Box(6056)),
+Box(Box(6057)),
+Box(Box(6058)),
+Box(Box(6059)),
+Box(Box(6060)),
+Box(Box(6061)),
+Box(Box(6062)),
+Box(Box(6063)),
+Box(Box(6064)),
+Box(Box(6065)),
+Box(Box(6066)),
+Box(Box(6067)),
+Box(Box(6068)),
+Box(Box(6069)),
+Box(Box(6070)),
+Box(Box(6071)),
+Box(Box(6072)),
+Box(Box(6073)),
+Box(Box(6074)),
+Box(Box(6075)),
+Box(Box(6076)),
+Box(Box(6077)),
+Box(Box(6078)),
+Box(Box(6079)),
+Box(Box(6080)),
+Box(Box(6081)),
+Box(Box(6082)),
+Box(Box(6083)),
+Box(Box(6084)),
+Box(Box(6085)),
+Box(Box(6086)),
+Box(Box(6087)),
+Box(Box(6088)),
+Box(Box(6089)),
+Box(Box(6090)),
+Box(Box(6091)),
+Box(Box(6092)),
+Box(Box(6093)),
+Box(Box(6094)),
+Box(Box(6095)),
+Box(Box(6096)),
+Box(Box(6097)),
+Box(Box(6098)),
+Box(Box(6099)),
+Box(Box(6100)),
+Box(Box(6101)),
+Box(Box(6102)),
+Box(Box(6103)),
+Box(Box(6104)),
+Box(Box(6105)),
+Box(Box(6106)),
+Box(Box(6107)),
+Box(Box(6108)),
+Box(Box(6109)),
+Box(Box(6110)),
+Box(Box(6111)),
+Box(Box(6112)),
+Box(Box(6113)),
+Box(Box(6114)),
+Box(Box(6115)),
+Box(Box(6116)),
+Box(Box(6117)),
+Box(Box(6118)),
+Box(Box(6119)),
+Box(Box(6120)),
+Box(Box(6121)),
+Box(Box(6122)),
+Box(Box(6123)),
+Box(Box(6124)),
+Box(Box(6125)),
+Box(Box(6126)),
+Box(Box(6127)),
+Box(Box(6128)),
+Box(Box(6129)),
+Box(Box(6130)),
+Box(Box(6131)),
+Box(Box(6132)),
+Box(Box(6133)),
+Box(Box(6134)),
+Box(Box(6135)),
+Box(Box(6136)),
+Box(Box(6137)),
+Box(Box(6138)),
+Box(Box(6139)),
+Box(Box(6140)),
+Box(Box(6141)),
+Box(Box(6142)),
+Box(Box(6143)),
+Box(Box(6144)),
+Box(Box(6145)),
+Box(Box(6146)),
+Box(Box(6147)),
+Box(Box(6148)),
+Box(Box(6149)),
+Box(Box(6150)),
+Box(Box(6151)),
+Box(Box(6152)),
+Box(Box(6153)),
+Box(Box(6154)),
+Box(Box(6155)),
+Box(Box(6156)),
+Box(Box(6157)),
+Box(Box(6158)),
+Box(Box(6159)),
+Box(Box(6160)),
+Box(Box(6161)),
+Box(Box(6162)),
+Box(Box(6163)),
+Box(Box(6164)),
+Box(Box(6165)),
+Box(Box(6166)),
+Box(Box(6167)),
+Box(Box(6168)),
+Box(Box(6169)),
+Box(Box(6170)),
+Box(Box(6171)),
+Box(Box(6172)),
+Box(Box(6173)),
+Box(Box(6174)),
+Box(Box(6175)),
+Box(Box(6176)),
+Box(Box(6177)),
+Box(Box(6178)),
+Box(Box(6179)),
+Box(Box(6180)),
+Box(Box(6181)),
+Box(Box(6182)),
+Box(Box(6183)),
+Box(Box(6184)),
+Box(Box(6185)),
+Box(Box(6186)),
+Box(Box(6187)),
+Box(Box(6188)),
+Box(Box(6189)),
+Box(Box(6190)),
+Box(Box(6191)),
+Box(Box(6192)),
+Box(Box(6193)),
+Box(Box(6194)),
+Box(Box(6195)),
+Box(Box(6196)),
+Box(Box(6197)),
+Box(Box(6198)),
+Box(Box(6199)),
+Box(Box(6200)),
+Box(Box(6201)),
+Box(Box(6202)),
+Box(Box(6203)),
+Box(Box(6204)),
+Box(Box(6205)),
+Box(Box(6206)),
+Box(Box(6207)),
+Box(Box(6208)),
+Box(Box(6209)),
+Box(Box(6210)),
+Box(Box(6211)),
+Box(Box(6212)),
+Box(Box(6213)),
+Box(Box(6214)),
+Box(Box(6215)),
+Box(Box(6216)),
+Box(Box(6217)),
+Box(Box(6218)),
+Box(Box(6219)),
+Box(Box(6220)),
+Box(Box(6221)),
+Box(Box(6222)),
+Box(Box(6223)),
+Box(Box(6224)),
+Box(Box(6225)),
+Box(Box(6226)),
+Box(Box(6227)),
+Box(Box(6228)),
+Box(Box(6229)),
+Box(Box(6230)),
+Box(Box(6231)),
+Box(Box(6232)),
+Box(Box(6233)),
+Box(Box(6234)),
+Box(Box(6235)),
+Box(Box(6236)),
+Box(Box(6237)),
+Box(Box(6238)),
+Box(Box(6239)),
+Box(Box(6240)),
+Box(Box(6241)),
+Box(Box(6242)),
+Box(Box(6243)),
+Box(Box(6244)),
+Box(Box(6245)),
+Box(Box(6246)),
+Box(Box(6247)),
+Box(Box(6248)),
+Box(Box(6249)),
+Box(Box(6250)),
+Box(Box(6251)),
+Box(Box(6252)),
+Box(Box(6253)),
+Box(Box(6254)),
+Box(Box(6255)),
+Box(Box(6256)),
+Box(Box(6257)),
+Box(Box(6258)),
+Box(Box(6259)),
+Box(Box(6260)),
+Box(Box(6261)),
+Box(Box(6262)),
+Box(Box(6263)),
+Box(Box(6264)),
+Box(Box(6265)),
+Box(Box(6266)),
+Box(Box(6267)),
+Box(Box(6268)),
+Box(Box(6269)),
+Box(Box(6270)),
+Box(Box(6271)),
+Box(Box(6272)),
+Box(Box(6273)),
+Box(Box(6274)),
+Box(Box(6275)),
+Box(Box(6276)),
+Box(Box(6277)),
+Box(Box(6278)),
+Box(Box(6279)),
+Box(Box(6280)),
+Box(Box(6281)),
+Box(Box(6282)),
+Box(Box(6283)),
+Box(Box(6284)),
+Box(Box(6285)),
+Box(Box(6286)),
+Box(Box(6287)),
+Box(Box(6288)),
+Box(Box(6289)),
+Box(Box(6290)),
+Box(Box(6291)),
+Box(Box(6292)),
+Box(Box(6293)),
+Box(Box(6294)),
+Box(Box(6295)),
+Box(Box(6296)),
+Box(Box(6297)),
+Box(Box(6298)),
+Box(Box(6299)),
+Box(Box(6300)),
+Box(Box(6301)),
+Box(Box(6302)),
+Box(Box(6303)),
+Box(Box(6304)),
+Box(Box(6305)),
+Box(Box(6306)),
+Box(Box(6307)),
+Box(Box(6308)),
+Box(Box(6309)),
+Box(Box(6310)),
+Box(Box(6311)),
+Box(Box(6312)),
+Box(Box(6313)),
+Box(Box(6314)),
+Box(Box(6315)),
+Box(Box(6316)),
+Box(Box(6317)),
+Box(Box(6318)),
+Box(Box(6319)),
+Box(Box(6320)),
+Box(Box(6321)),
+Box(Box(6322)),
+Box(Box(6323)),
+Box(Box(6324)),
+Box(Box(6325)),
+Box(Box(6326)),
+Box(Box(6327)),
+Box(Box(6328)),
+Box(Box(6329)),
+Box(Box(6330)),
+Box(Box(6331)),
+Box(Box(6332)),
+Box(Box(6333)),
+Box(Box(6334)),
+Box(Box(6335)),
+Box(Box(6336)),
+Box(Box(6337)),
+Box(Box(6338)),
+Box(Box(6339)),
+Box(Box(6340)),
+Box(Box(6341)),
+Box(Box(6342)),
+Box(Box(6343)),
+Box(Box(6344)),
+Box(Box(6345)),
+Box(Box(6346)),
+Box(Box(6347)),
+Box(Box(6348)),
+Box(Box(6349)),
+Box(Box(6350)),
+Box(Box(6351)),
+Box(Box(6352)),
+Box(Box(6353)),
+Box(Box(6354)),
+Box(Box(6355)),
+Box(Box(6356)),
+Box(Box(6357)),
+Box(Box(6358)),
+Box(Box(6359)),
+Box(Box(6360)),
+Box(Box(6361)),
+Box(Box(6362)),
+Box(Box(6363)),
+Box(Box(6364)),
+Box(Box(6365)),
+Box(Box(6366)),
+Box(Box(6367)),
+Box(Box(6368)),
+Box(Box(6369)),
+Box(Box(6370)),
+Box(Box(6371)),
+Box(Box(6372)),
+Box(Box(6373)),
+Box(Box(6374)),
+Box(Box(6375)),
+Box(Box(6376)),
+Box(Box(6377)),
+Box(Box(6378)),
+Box(Box(6379)),
+Box(Box(6380)),
+Box(Box(6381)),
+Box(Box(6382)),
+Box(Box(6383)),
+Box(Box(6384)),
+Box(Box(6385)),
+Box(Box(6386)),
+Box(Box(6387)),
+Box(Box(6388)),
+Box(Box(6389)),
+Box(Box(6390)),
+Box(Box(6391)),
+Box(Box(6392)),
+Box(Box(6393)),
+Box(Box(6394)),
+Box(Box(6395)),
+Box(Box(6396)),
+Box(Box(6397)),
+Box(Box(6398)),
+Box(Box(6399)),
+Box(Box(6400)),
+Box(Box(6401)),
+Box(Box(6402)),
+Box(Box(6403)),
+Box(Box(6404)),
+Box(Box(6405)),
+Box(Box(6406)),
+Box(Box(6407)),
+Box(Box(6408)),
+Box(Box(6409)),
+Box(Box(6410)),
+Box(Box(6411)),
+Box(Box(6412)),
+Box(Box(6413)),
+Box(Box(6414)),
+Box(Box(6415)),
+Box(Box(6416)),
+Box(Box(6417)),
+Box(Box(6418)),
+Box(Box(6419)),
+Box(Box(6420)),
+Box(Box(6421)),
+Box(Box(6422)),
+Box(Box(6423)),
+Box(Box(6424)),
+Box(Box(6425)),
+Box(Box(6426)),
+Box(Box(6427)),
+Box(Box(6428)),
+Box(Box(6429)),
+Box(Box(6430)),
+Box(Box(6431)),
+Box(Box(6432)),
+Box(Box(6433)),
+Box(Box(6434)),
+Box(Box(6435)),
+Box(Box(6436)),
+Box(Box(6437)),
+Box(Box(6438)),
+Box(Box(6439)),
+Box(Box(6440)),
+Box(Box(6441)),
+Box(Box(6442)),
+Box(Box(6443)),
+Box(Box(6444)),
+Box(Box(6445)),
+Box(Box(6446)),
+Box(Box(6447)),
+Box(Box(6448)),
+Box(Box(6449)),
+Box(Box(6450)),
+Box(Box(6451)),
+Box(Box(6452)),
+Box(Box(6453)),
+Box(Box(6454)),
+Box(Box(6455)),
+Box(Box(6456)),
+Box(Box(6457)),
+Box(Box(6458)),
+Box(Box(6459)),
+Box(Box(6460)),
+Box(Box(6461)),
+Box(Box(6462)),
+Box(Box(6463)),
+Box(Box(6464)),
+Box(Box(6465)),
+Box(Box(6466)),
+Box(Box(6467)),
+Box(Box(6468)),
+Box(Box(6469)),
+Box(Box(6470)),
+Box(Box(6471)),
+Box(Box(6472)),
+Box(Box(6473)),
+Box(Box(6474)),
+Box(Box(6475)),
+Box(Box(6476)),
+Box(Box(6477)),
+Box(Box(6478)),
+Box(Box(6479)),
+Box(Box(6480)),
+Box(Box(6481)),
+Box(Box(6482)),
+Box(Box(6483)),
+Box(Box(6484)),
+Box(Box(6485)),
+Box(Box(6486)),
+Box(Box(6487)),
+Box(Box(6488)),
+Box(Box(6489)),
+Box(Box(6490)),
+Box(Box(6491)),
+Box(Box(6492)),
+Box(Box(6493)),
+Box(Box(6494)),
+Box(Box(6495)),
+Box(Box(6496)),
+Box(Box(6497)),
+Box(Box(6498)),
+Box(Box(6499)),
+Box(Box(6500)),
+Box(Box(6501)),
+Box(Box(6502)),
+Box(Box(6503)),
+Box(Box(6504)),
+Box(Box(6505)),
+Box(Box(6506)),
+Box(Box(6507)),
+Box(Box(6508)),
+Box(Box(6509)),
+Box(Box(6510)),
+Box(Box(6511)),
+Box(Box(6512)),
+Box(Box(6513)),
+Box(Box(6514)),
+Box(Box(6515)),
+Box(Box(6516)),
+Box(Box(6517)),
+Box(Box(6518)),
+Box(Box(6519)),
+Box(Box(6520)),
+Box(Box(6521)),
+Box(Box(6522)),
+Box(Box(6523)),
+Box(Box(6524)),
+Box(Box(6525)),
+Box(Box(6526)),
+Box(Box(6527)),
+Box(Box(6528)),
+Box(Box(6529)),
+Box(Box(6530)),
+Box(Box(6531)),
+Box(Box(6532)),
+Box(Box(6533)),
+Box(Box(6534)),
+Box(Box(6535)),
+Box(Box(6536)),
+Box(Box(6537)),
+Box(Box(6538)),
+Box(Box(6539)),
+Box(Box(6540)),
+Box(Box(6541)),
+Box(Box(6542)),
+Box(Box(6543)),
+Box(Box(6544)),
+Box(Box(6545)),
+Box(Box(6546)),
+Box(Box(6547)),
+Box(Box(6548)),
+Box(Box(6549)),
+Box(Box(6550)),
+Box(Box(6551)),
+Box(Box(6552)),
+Box(Box(6553)),
+Box(Box(6554)),
+Box(Box(6555)),
+Box(Box(6556)),
+Box(Box(6557)),
+Box(Box(6558)),
+Box(Box(6559)),
+Box(Box(6560)),
+Box(Box(6561)),
+Box(Box(6562)),
+Box(Box(6563)),
+Box(Box(6564)),
+Box(Box(6565)),
+Box(Box(6566)),
+Box(Box(6567)),
+Box(Box(6568)),
+Box(Box(6569)),
+Box(Box(6570)),
+Box(Box(6571)),
+Box(Box(6572)),
+Box(Box(6573)),
+Box(Box(6574)),
+Box(Box(6575)),
+Box(Box(6576)),
+Box(Box(6577)),
+Box(Box(6578)),
+Box(Box(6579)),
+Box(Box(6580)),
+Box(Box(6581)),
+Box(Box(6582)),
+Box(Box(6583)),
+Box(Box(6584)),
+Box(Box(6585)),
+Box(Box(6586)),
+Box(Box(6587)),
+Box(Box(6588)),
+Box(Box(6589)),
+Box(Box(6590)),
+Box(Box(6591)),
+Box(Box(6592)),
+Box(Box(6593)),
+Box(Box(6594)),
+Box(Box(6595)),
+Box(Box(6596)),
+Box(Box(6597)),
+Box(Box(6598)),
+Box(Box(6599)),
+Box(Box(6600)),
+Box(Box(6601)),
+Box(Box(6602)),
+Box(Box(6603)),
+Box(Box(6604)),
+Box(Box(6605)),
+Box(Box(6606)),
+Box(Box(6607)),
+Box(Box(6608)),
+Box(Box(6609)),
+Box(Box(6610)),
+Box(Box(6611)),
+Box(Box(6612)),
+Box(Box(6613)),
+Box(Box(6614)),
+Box(Box(6615)),
+Box(Box(6616)),
+Box(Box(6617)),
+Box(Box(6618)),
+Box(Box(6619)),
+Box(Box(6620)),
+Box(Box(6621)),
+Box(Box(6622)),
+Box(Box(6623)),
+Box(Box(6624)),
+Box(Box(6625)),
+Box(Box(6626)),
+Box(Box(6627)),
+Box(Box(6628)),
+Box(Box(6629)),
+Box(Box(6630)),
+Box(Box(6631)),
+Box(Box(6632)),
+Box(Box(6633)),
+Box(Box(6634)),
+Box(Box(6635)),
+Box(Box(6636)),
+Box(Box(6637)),
+Box(Box(6638)),
+Box(Box(6639)),
+Box(Box(6640)),
+Box(Box(6641)),
+Box(Box(6642)),
+Box(Box(6643)),
+Box(Box(6644)),
+Box(Box(6645)),
+Box(Box(6646)),
+Box(Box(6647)),
+Box(Box(6648)),
+Box(Box(6649)),
+Box(Box(6650)),
+Box(Box(6651)),
+Box(Box(6652)),
+Box(Box(6653)),
+Box(Box(6654)),
+Box(Box(6655)),
+Box(Box(6656)),
+Box(Box(6657)),
+Box(Box(6658)),
+Box(Box(6659)),
+Box(Box(6660)),
+Box(Box(6661)),
+Box(Box(6662)),
+Box(Box(6663)),
+Box(Box(6664)),
+Box(Box(6665)),
+Box(Box(6666)),
+Box(Box(6667)),
+Box(Box(6668)),
+Box(Box(6669)),
+Box(Box(6670)),
+Box(Box(6671)),
+Box(Box(6672)),
+Box(Box(6673)),
+Box(Box(6674)),
+Box(Box(6675)),
+Box(Box(6676)),
+Box(Box(6677)),
+Box(Box(6678)),
+Box(Box(6679)),
+Box(Box(6680)),
+Box(Box(6681)),
+Box(Box(6682)),
+Box(Box(6683)),
+Box(Box(6684)),
+Box(Box(6685)),
+Box(Box(6686)),
+Box(Box(6687)),
+Box(Box(6688)),
+Box(Box(6689)),
+Box(Box(6690)),
+Box(Box(6691)),
+Box(Box(6692)),
+Box(Box(6693)),
+Box(Box(6694)),
+Box(Box(6695)),
+Box(Box(6696)),
+Box(Box(6697)),
+Box(Box(6698)),
+Box(Box(6699)),
+Box(Box(6700)),
+Box(Box(6701)),
+Box(Box(6702)),
+Box(Box(6703)),
+Box(Box(6704)),
+Box(Box(6705)),
+Box(Box(6706)),
+Box(Box(6707)),
+Box(Box(6708)),
+Box(Box(6709)),
+Box(Box(6710)),
+Box(Box(6711)),
+Box(Box(6712)),
+Box(Box(6713)),
+Box(Box(6714)),
+Box(Box(6715)),
+Box(Box(6716)),
+Box(Box(6717)),
+Box(Box(6718)),
+Box(Box(6719)),
+Box(Box(6720)),
+Box(Box(6721)),
+Box(Box(6722)),
+Box(Box(6723)),
+Box(Box(6724)),
+Box(Box(6725)),
+Box(Box(6726)),
+Box(Box(6727)),
+Box(Box(6728)),
+Box(Box(6729)),
+Box(Box(6730)),
+Box(Box(6731)),
+Box(Box(6732)),
+Box(Box(6733)),
+Box(Box(6734)),
+Box(Box(6735)),
+Box(Box(6736)),
+Box(Box(6737)),
+Box(Box(6738)),
+Box(Box(6739)),
+Box(Box(6740)),
+Box(Box(6741)),
+Box(Box(6742)),
+Box(Box(6743)),
+Box(Box(6744)),
+Box(Box(6745)),
+Box(Box(6746)),
+Box(Box(6747)),
+Box(Box(6748)),
+Box(Box(6749)),
+Box(Box(6750)),
+Box(Box(6751)),
+Box(Box(6752)),
+Box(Box(6753)),
+Box(Box(6754)),
+Box(Box(6755)),
+Box(Box(6756)),
+Box(Box(6757)),
+Box(Box(6758)),
+Box(Box(6759)),
+Box(Box(6760)),
+Box(Box(6761)),
+Box(Box(6762)),
+Box(Box(6763)),
+Box(Box(6764)),
+Box(Box(6765)),
+Box(Box(6766)),
+Box(Box(6767)),
+Box(Box(6768)),
+Box(Box(6769)),
+Box(Box(6770)),
+Box(Box(6771)),
+Box(Box(6772)),
+Box(Box(6773)),
+Box(Box(6774)),
+Box(Box(6775)),
+Box(Box(6776)),
+Box(Box(6777)),
+Box(Box(6778)),
+Box(Box(6779)),
+Box(Box(6780)),
+Box(Box(6781)),
+Box(Box(6782)),
+Box(Box(6783)),
+Box(Box(6784)),
+Box(Box(6785)),
+Box(Box(6786)),
+Box(Box(6787)),
+Box(Box(6788)),
+Box(Box(6789)),
+Box(Box(6790)),
+Box(Box(6791)),
+Box(Box(6792)),
+Box(Box(6793)),
+Box(Box(6794)),
+Box(Box(6795)),
+Box(Box(6796)),
+Box(Box(6797)),
+Box(Box(6798)),
+Box(Box(6799)),
+Box(Box(6800)),
+Box(Box(6801)),
+Box(Box(6802)),
+Box(Box(6803)),
+Box(Box(6804)),
+Box(Box(6805)),
+Box(Box(6806)),
+Box(Box(6807)),
+Box(Box(6808)),
+Box(Box(6809)),
+Box(Box(6810)),
+Box(Box(6811)),
+Box(Box(6812)),
+Box(Box(6813)),
+Box(Box(6814)),
+Box(Box(6815)),
+Box(Box(6816)),
+Box(Box(6817)),
+Box(Box(6818)),
+Box(Box(6819)),
+Box(Box(6820)),
+Box(Box(6821)),
+Box(Box(6822)),
+Box(Box(6823)),
+Box(Box(6824)),
+Box(Box(6825)),
+Box(Box(6826)),
+Box(Box(6827)),
+Box(Box(6828)),
+Box(Box(6829)),
+Box(Box(6830)),
+Box(Box(6831)),
+Box(Box(6832)),
+Box(Box(6833)),
+Box(Box(6834)),
+Box(Box(6835)),
+Box(Box(6836)),
+Box(Box(6837)),
+Box(Box(6838)),
+Box(Box(6839)),
+Box(Box(6840)),
+Box(Box(6841)),
+Box(Box(6842)),
+Box(Box(6843)),
+Box(Box(6844)),
+Box(Box(6845)),
+Box(Box(6846)),
+Box(Box(6847)),
+Box(Box(6848)),
+Box(Box(6849)),
+Box(Box(6850)),
+Box(Box(6851)),
+Box(Box(6852)),
+Box(Box(6853)),
+Box(Box(6854)),
+Box(Box(6855)),
+Box(Box(6856)),
+Box(Box(6857)),
+Box(Box(6858)),
+Box(Box(6859)),
+Box(Box(6860)),
+Box(Box(6861)),
+Box(Box(6862)),
+Box(Box(6863)),
+Box(Box(6864)),
+Box(Box(6865)),
+Box(Box(6866)),
+Box(Box(6867)),
+Box(Box(6868)),
+Box(Box(6869)),
+Box(Box(6870)),
+Box(Box(6871)),
+Box(Box(6872)),
+Box(Box(6873)),
+Box(Box(6874)),
+Box(Box(6875)),
+Box(Box(6876)),
+Box(Box(6877)),
+Box(Box(6878)),
+Box(Box(6879)),
+Box(Box(6880)),
+Box(Box(6881)),
+Box(Box(6882)),
+Box(Box(6883)),
+Box(Box(6884)),
+Box(Box(6885)),
+Box(Box(6886)),
+Box(Box(6887)),
+Box(Box(6888)),
+Box(Box(6889)),
+Box(Box(6890)),
+Box(Box(6891)),
+Box(Box(6892)),
+Box(Box(6893)),
+Box(Box(6894)),
+Box(Box(6895)),
+Box(Box(6896)),
+Box(Box(6897)),
+Box(Box(6898)),
+Box(Box(6899)),
+Box(Box(6900)),
+Box(Box(6901)),
+Box(Box(6902)),
+Box(Box(6903)),
+Box(Box(6904)),
+Box(Box(6905)),
+Box(Box(6906)),
+Box(Box(6907)),
+Box(Box(6908)),
+Box(Box(6909)),
+Box(Box(6910)),
+Box(Box(6911)),
+Box(Box(6912)),
+Box(Box(6913)),
+Box(Box(6914)),
+Box(Box(6915)),
+Box(Box(6916)),
+Box(Box(6917)),
+Box(Box(6918)),
+Box(Box(6919)),
+Box(Box(6920)),
+Box(Box(6921)),
+Box(Box(6922)),
+Box(Box(6923)),
+Box(Box(6924)),
+Box(Box(6925)),
+Box(Box(6926)),
+Box(Box(6927)),
+Box(Box(6928)),
+Box(Box(6929)),
+Box(Box(6930)),
+Box(Box(6931)),
+Box(Box(6932)),
+Box(Box(6933)),
+Box(Box(6934)),
+Box(Box(6935)),
+Box(Box(6936)),
+Box(Box(6937)),
+Box(Box(6938)),
+Box(Box(6939)),
+Box(Box(6940)),
+Box(Box(6941)),
+Box(Box(6942)),
+Box(Box(6943)),
+Box(Box(6944)),
+Box(Box(6945)),
+Box(Box(6946)),
+Box(Box(6947)),
+Box(Box(6948)),
+Box(Box(6949)),
+Box(Box(6950)),
+Box(Box(6951)),
+Box(Box(6952)),
+Box(Box(6953)),
+Box(Box(6954)),
+Box(Box(6955)),
+Box(Box(6956)),
+Box(Box(6957)),
+Box(Box(6958)),
+Box(Box(6959)),
+Box(Box(6960)),
+Box(Box(6961)),
+Box(Box(6962)),
+Box(Box(6963)),
+Box(Box(6964)),
+Box(Box(6965)),
+Box(Box(6966)),
+Box(Box(6967)),
+Box(Box(6968)),
+Box(Box(6969)),
+Box(Box(6970)),
+Box(Box(6971)),
+Box(Box(6972)),
+Box(Box(6973)),
+Box(Box(6974)),
+Box(Box(6975)),
+Box(Box(6976)),
+Box(Box(6977)),
+Box(Box(6978)),
+Box(Box(6979)),
+Box(Box(6980)),
+Box(Box(6981)),
+Box(Box(6982)),
+Box(Box(6983)),
+Box(Box(6984)),
+Box(Box(6985)),
+Box(Box(6986)),
+Box(Box(6987)),
+Box(Box(6988)),
+Box(Box(6989)),
+Box(Box(6990)),
+Box(Box(6991)),
+Box(Box(6992)),
+Box(Box(6993)),
+Box(Box(6994)),
+Box(Box(6995)),
+Box(Box(6996)),
+Box(Box(6997)),
+Box(Box(6998)),
+Box(Box(6999)),
+Box(Box(7000)),
+Box(Box(7001)),
+Box(Box(7002)),
+Box(Box(7003)),
+Box(Box(7004)),
+Box(Box(7005)),
+Box(Box(7006)),
+Box(Box(7007)),
+Box(Box(7008)),
+Box(Box(7009)),
+Box(Box(7010)),
+Box(Box(7011)),
+Box(Box(7012)),
+Box(Box(7013)),
+Box(Box(7014)),
+Box(Box(7015)),
+Box(Box(7016)),
+Box(Box(7017)),
+Box(Box(7018)),
+Box(Box(7019)),
+Box(Box(7020)),
+Box(Box(7021)),
+Box(Box(7022)),
+Box(Box(7023)),
+Box(Box(7024)),
+Box(Box(7025)),
+Box(Box(7026)),
+Box(Box(7027)),
+Box(Box(7028)),
+Box(Box(7029)),
+Box(Box(7030)),
+Box(Box(7031)),
+Box(Box(7032)),
+Box(Box(7033)),
+Box(Box(7034)),
+Box(Box(7035)),
+Box(Box(7036)),
+Box(Box(7037)),
+Box(Box(7038)),
+Box(Box(7039)),
+Box(Box(7040)),
+Box(Box(7041)),
+Box(Box(7042)),
+Box(Box(7043)),
+Box(Box(7044)),
+Box(Box(7045)),
+Box(Box(7046)),
+Box(Box(7047)),
+Box(Box(7048)),
+Box(Box(7049)),
+Box(Box(7050)),
+Box(Box(7051)),
+Box(Box(7052)),
+Box(Box(7053)),
+Box(Box(7054)),
+Box(Box(7055)),
+Box(Box(7056)),
+Box(Box(7057)),
+Box(Box(7058)),
+Box(Box(7059)),
+Box(Box(7060)),
+Box(Box(7061)),
+Box(Box(7062)),
+Box(Box(7063)),
+Box(Box(7064)),
+Box(Box(7065)),
+Box(Box(7066)),
+Box(Box(7067)),
+Box(Box(7068)),
+Box(Box(7069)),
+Box(Box(7070)),
+Box(Box(7071)),
+Box(Box(7072)),
+Box(Box(7073)),
+Box(Box(7074)),
+Box(Box(7075)),
+Box(Box(7076)),
+Box(Box(7077)),
+Box(Box(7078)),
+Box(Box(7079)),
+Box(Box(7080)),
+Box(Box(7081)),
+Box(Box(7082)),
+Box(Box(7083)),
+Box(Box(7084)),
+Box(Box(7085)),
+Box(Box(7086)),
+Box(Box(7087)),
+Box(Box(7088)),
+Box(Box(7089)),
+Box(Box(7090)),
+Box(Box(7091)),
+Box(Box(7092)),
+Box(Box(7093)),
+Box(Box(7094)),
+Box(Box(7095)),
+Box(Box(7096)),
+Box(Box(7097)),
+Box(Box(7098)),
+Box(Box(7099)),
+Box(Box(7100)),
+Box(Box(7101)),
+Box(Box(7102)),
+Box(Box(7103)),
+Box(Box(7104)),
+Box(Box(7105)),
+Box(Box(7106)),
+Box(Box(7107)),
+Box(Box(7108)),
+Box(Box(7109)),
+Box(Box(7110)),
+Box(Box(7111)),
+Box(Box(7112)),
+Box(Box(7113)),
+Box(Box(7114)),
+Box(Box(7115)),
+Box(Box(7116)),
+Box(Box(7117)),
+Box(Box(7118)),
+Box(Box(7119)),
+Box(Box(7120)),
+Box(Box(7121)),
+Box(Box(7122)),
+Box(Box(7123)),
+Box(Box(7124)),
+Box(Box(7125)),
+Box(Box(7126)),
+Box(Box(7127)),
+Box(Box(7128)),
+Box(Box(7129)),
+Box(Box(7130)),
+Box(Box(7131)),
+Box(Box(7132)),
+Box(Box(7133)),
+Box(Box(7134)),
+Box(Box(7135)),
+Box(Box(7136)),
+Box(Box(7137)),
+Box(Box(7138)),
+Box(Box(7139)),
+Box(Box(7140)),
+Box(Box(7141)),
+Box(Box(7142)),
+Box(Box(7143)),
+Box(Box(7144)),
+Box(Box(7145)),
+Box(Box(7146)),
+Box(Box(7147)),
+Box(Box(7148)),
+Box(Box(7149)),
+Box(Box(7150)),
+Box(Box(7151)),
+Box(Box(7152)),
+Box(Box(7153)),
+Box(Box(7154)),
+Box(Box(7155)),
+Box(Box(7156)),
+Box(Box(7157)),
+Box(Box(7158)),
+Box(Box(7159)),
+Box(Box(7160)),
+Box(Box(7161)),
+Box(Box(7162)),
+Box(Box(7163)),
+Box(Box(7164)),
+Box(Box(7165)),
+Box(Box(7166)),
+Box(Box(7167)),
+Box(Box(7168)),
+Box(Box(7169)),
+Box(Box(7170)),
+Box(Box(7171)),
+Box(Box(7172)),
+Box(Box(7173)),
+Box(Box(7174)),
+Box(Box(7175)),
+Box(Box(7176)),
+Box(Box(7177)),
+Box(Box(7178)),
+Box(Box(7179)),
+Box(Box(7180)),
+Box(Box(7181)),
+Box(Box(7182)),
+Box(Box(7183)),
+Box(Box(7184)),
+Box(Box(7185)),
+Box(Box(7186)),
+Box(Box(7187)),
+Box(Box(7188)),
+Box(Box(7189)),
+Box(Box(7190)),
+Box(Box(7191)),
+Box(Box(7192)),
+Box(Box(7193)),
+Box(Box(7194)),
+Box(Box(7195)),
+Box(Box(7196)),
+Box(Box(7197)),
+Box(Box(7198)),
+Box(Box(7199)),
+Box(Box(7200)),
+Box(Box(7201)),
+Box(Box(7202)),
+Box(Box(7203)),
+Box(Box(7204)),
+Box(Box(7205)),
+Box(Box(7206)),
+Box(Box(7207)),
+Box(Box(7208)),
+Box(Box(7209)),
+Box(Box(7210)),
+Box(Box(7211)),
+Box(Box(7212)),
+Box(Box(7213)),
+Box(Box(7214)),
+Box(Box(7215)),
+Box(Box(7216)),
+Box(Box(7217)),
+Box(Box(7218)),
+Box(Box(7219)),
+Box(Box(7220)),
+Box(Box(7221)),
+Box(Box(7222)),
+Box(Box(7223)),
+Box(Box(7224)),
+Box(Box(7225)),
+Box(Box(7226)),
+Box(Box(7227)),
+Box(Box(7228)),
+Box(Box(7229)),
+Box(Box(7230)),
+Box(Box(7231)),
+Box(Box(7232)),
+Box(Box(7233)),
+Box(Box(7234)),
+Box(Box(7235)),
+Box(Box(7236)),
+Box(Box(7237)),
+Box(Box(7238)),
+Box(Box(7239)),
+Box(Box(7240)),
+Box(Box(7241)),
+Box(Box(7242)),
+Box(Box(7243)),
+Box(Box(7244)),
+Box(Box(7245)),
+Box(Box(7246)),
+Box(Box(7247)),
+Box(Box(7248)),
+Box(Box(7249)),
+Box(Box(7250)),
+Box(Box(7251)),
+Box(Box(7252)),
+Box(Box(7253)),
+Box(Box(7254)),
+Box(Box(7255)),
+Box(Box(7256)),
+Box(Box(7257)),
+Box(Box(7258)),
+Box(Box(7259)),
+Box(Box(7260)),
+Box(Box(7261)),
+Box(Box(7262)),
+Box(Box(7263)),
+Box(Box(7264)),
+Box(Box(7265)),
+Box(Box(7266)),
+Box(Box(7267)),
+Box(Box(7268)),
+Box(Box(7269)),
+Box(Box(7270)),
+Box(Box(7271)),
+Box(Box(7272)),
+Box(Box(7273)),
+Box(Box(7274)),
+Box(Box(7275)),
+Box(Box(7276)),
+Box(Box(7277)),
+Box(Box(7278)),
+Box(Box(7279)),
+Box(Box(7280)),
+Box(Box(7281)),
+Box(Box(7282)),
+Box(Box(7283)),
+Box(Box(7284)),
+Box(Box(7285)),
+Box(Box(7286)),
+Box(Box(7287)),
+Box(Box(7288)),
+Box(Box(7289)),
+Box(Box(7290)),
+Box(Box(7291)),
+Box(Box(7292)),
+Box(Box(7293)),
+Box(Box(7294)),
+Box(Box(7295)),
+Box(Box(7296)),
+Box(Box(7297)),
+Box(Box(7298)),
+Box(Box(7299)),
+Box(Box(7300)),
+Box(Box(7301)),
+Box(Box(7302)),
+Box(Box(7303)),
+Box(Box(7304)),
+Box(Box(7305)),
+Box(Box(7306)),
+Box(Box(7307)),
+Box(Box(7308)),
+Box(Box(7309)),
+Box(Box(7310)),
+Box(Box(7311)),
+Box(Box(7312)),
+Box(Box(7313)),
+Box(Box(7314)),
+Box(Box(7315)),
+Box(Box(7316)),
+Box(Box(7317)),
+Box(Box(7318)),
+Box(Box(7319)),
+Box(Box(7320)),
+Box(Box(7321)),
+Box(Box(7322)),
+Box(Box(7323)),
+Box(Box(7324)),
+Box(Box(7325)),
+Box(Box(7326)),
+Box(Box(7327)),
+Box(Box(7328)),
+Box(Box(7329)),
+Box(Box(7330)),
+Box(Box(7331)),
+Box(Box(7332)),
+Box(Box(7333)),
+Box(Box(7334)),
+Box(Box(7335)),
+Box(Box(7336)),
+Box(Box(7337)),
+Box(Box(7338)),
+Box(Box(7339)),
+Box(Box(7340)),
+Box(Box(7341)),
+Box(Box(7342)),
+Box(Box(7343)),
+Box(Box(7344)),
+Box(Box(7345)),
+Box(Box(7346)),
+Box(Box(7347)),
+Box(Box(7348)),
+Box(Box(7349)),
+Box(Box(7350)),
+Box(Box(7351)),
+Box(Box(7352)),
+Box(Box(7353)),
+Box(Box(7354)),
+Box(Box(7355)),
+Box(Box(7356)),
+Box(Box(7357)),
+Box(Box(7358)),
+Box(Box(7359)),
+Box(Box(7360)),
+Box(Box(7361)),
+Box(Box(7362)),
+Box(Box(7363)),
+Box(Box(7364)),
+Box(Box(7365)),
+Box(Box(7366)),
+Box(Box(7367)),
+Box(Box(7368)),
+Box(Box(7369)),
+Box(Box(7370)),
+Box(Box(7371)),
+Box(Box(7372)),
+Box(Box(7373)),
+Box(Box(7374)),
+Box(Box(7375)),
+Box(Box(7376)),
+Box(Box(7377)),
+Box(Box(7378)),
+Box(Box(7379)),
+Box(Box(7380)),
+Box(Box(7381)),
+Box(Box(7382)),
+Box(Box(7383)),
+Box(Box(7384)),
+Box(Box(7385)),
+Box(Box(7386)),
+Box(Box(7387)),
+Box(Box(7388)),
+Box(Box(7389)),
+Box(Box(7390)),
+Box(Box(7391)),
+Box(Box(7392)),
+Box(Box(7393)),
+Box(Box(7394)),
+Box(Box(7395)),
+Box(Box(7396)),
+Box(Box(7397)),
+Box(Box(7398)),
+Box(Box(7399)),
+Box(Box(7400)),
+Box(Box(7401)),
+Box(Box(7402)),
+Box(Box(7403)),
+Box(Box(7404)),
+Box(Box(7405)),
+Box(Box(7406)),
+Box(Box(7407)),
+Box(Box(7408)),
+Box(Box(7409)),
+Box(Box(7410)),
+Box(Box(7411)),
+Box(Box(7412)),
+Box(Box(7413)),
+Box(Box(7414)),
+Box(Box(7415)),
+Box(Box(7416)),
+Box(Box(7417)),
+Box(Box(7418)),
+Box(Box(7419)),
+Box(Box(7420)),
+Box(Box(7421)),
+Box(Box(7422)),
+Box(Box(7423)),
+Box(Box(7424)),
+Box(Box(7425)),
+Box(Box(7426)),
+Box(Box(7427)),
+Box(Box(7428)),
+Box(Box(7429)),
+Box(Box(7430)),
+Box(Box(7431)),
+Box(Box(7432)),
+Box(Box(7433)),
+Box(Box(7434)),
+Box(Box(7435)),
+Box(Box(7436)),
+Box(Box(7437)),
+Box(Box(7438)),
+Box(Box(7439)),
+Box(Box(7440)),
+Box(Box(7441)),
+Box(Box(7442)),
+Box(Box(7443)),
+Box(Box(7444)),
+Box(Box(7445)),
+Box(Box(7446)),
+Box(Box(7447)),
+Box(Box(7448)),
+Box(Box(7449)),
+Box(Box(7450)),
+Box(Box(7451)),
+Box(Box(7452)),
+Box(Box(7453)),
+Box(Box(7454)),
+Box(Box(7455)),
+Box(Box(7456)),
+Box(Box(7457)),
+Box(Box(7458)),
+Box(Box(7459)),
+Box(Box(7460)),
+Box(Box(7461)),
+Box(Box(7462)),
+Box(Box(7463)),
+Box(Box(7464)),
+Box(Box(7465)),
+Box(Box(7466)),
+Box(Box(7467)),
+Box(Box(7468)),
+Box(Box(7469)),
+Box(Box(7470)),
+Box(Box(7471)),
+Box(Box(7472)),
+Box(Box(7473)),
+Box(Box(7474)),
+Box(Box(7475)),
+Box(Box(7476)),
+Box(Box(7477)),
+Box(Box(7478)),
+Box(Box(7479)),
+Box(Box(7480)),
+Box(Box(7481)),
+Box(Box(7482)),
+Box(Box(7483)),
+Box(Box(7484)),
+Box(Box(7485)),
+Box(Box(7486)),
+Box(Box(7487)),
+Box(Box(7488)),
+Box(Box(7489)),
+Box(Box(7490)),
+Box(Box(7491)),
+Box(Box(7492)),
+Box(Box(7493)),
+Box(Box(7494)),
+Box(Box(7495)),
+Box(Box(7496)),
+Box(Box(7497)),
+Box(Box(7498)),
+Box(Box(7499)),
+Box(Box(7500)),
+Box(Box(7501)),
+Box(Box(7502)),
+Box(Box(7503)),
+Box(Box(7504)),
+Box(Box(7505)),
+Box(Box(7506)),
+Box(Box(7507)),
+Box(Box(7508)),
+Box(Box(7509)),
+Box(Box(7510)),
+Box(Box(7511)),
+Box(Box(7512)),
+Box(Box(7513)),
+Box(Box(7514)),
+Box(Box(7515)),
+Box(Box(7516)),
+Box(Box(7517)),
+Box(Box(7518)),
+Box(Box(7519)),
+Box(Box(7520)),
+Box(Box(7521)),
+Box(Box(7522)),
+Box(Box(7523)),
+Box(Box(7524)),
+Box(Box(7525)),
+Box(Box(7526)),
+Box(Box(7527)),
+Box(Box(7528)),
+Box(Box(7529)),
+Box(Box(7530)),
+Box(Box(7531)),
+Box(Box(7532)),
+Box(Box(7533)),
+Box(Box(7534)),
+Box(Box(7535)),
+Box(Box(7536)),
+Box(Box(7537)),
+Box(Box(7538)),
+Box(Box(7539)),
+Box(Box(7540)),
+Box(Box(7541)),
+Box(Box(7542)),
+Box(Box(7543)),
+Box(Box(7544)),
+Box(Box(7545)),
+Box(Box(7546)),
+Box(Box(7547)),
+Box(Box(7548)),
+Box(Box(7549)),
+Box(Box(7550)),
+Box(Box(7551)),
+Box(Box(7552)),
+Box(Box(7553)),
+Box(Box(7554)),
+Box(Box(7555)),
+Box(Box(7556)),
+Box(Box(7557)),
+Box(Box(7558)),
+Box(Box(7559)),
+Box(Box(7560)),
+Box(Box(7561)),
+Box(Box(7562)),
+Box(Box(7563)),
+Box(Box(7564)),
+Box(Box(7565)),
+Box(Box(7566)),
+Box(Box(7567)),
+Box(Box(7568)),
+Box(Box(7569)),
+Box(Box(7570)),
+Box(Box(7571)),
+Box(Box(7572)),
+Box(Box(7573)),
+Box(Box(7574)),
+Box(Box(7575)),
+Box(Box(7576)),
+Box(Box(7577)),
+Box(Box(7578)),
+Box(Box(7579)),
+Box(Box(7580)),
+Box(Box(7581)),
+Box(Box(7582)),
+Box(Box(7583)),
+Box(Box(7584)),
+Box(Box(7585)),
+Box(Box(7586)),
+Box(Box(7587)),
+Box(Box(7588)),
+Box(Box(7589)),
+Box(Box(7590)),
+Box(Box(7591)),
+Box(Box(7592)),
+Box(Box(7593)),
+Box(Box(7594)),
+Box(Box(7595)),
+Box(Box(7596)),
+Box(Box(7597)),
+Box(Box(7598)),
+Box(Box(7599)),
+Box(Box(7600)),
+Box(Box(7601)),
+Box(Box(7602)),
+Box(Box(7603)),
+Box(Box(7604)),
+Box(Box(7605)),
+Box(Box(7606)),
+Box(Box(7607)),
+Box(Box(7608)),
+Box(Box(7609)),
+Box(Box(7610)),
+Box(Box(7611)),
+Box(Box(7612)),
+Box(Box(7613)),
+Box(Box(7614)),
+Box(Box(7615)),
+Box(Box(7616)),
+Box(Box(7617)),
+Box(Box(7618)),
+Box(Box(7619)),
+Box(Box(7620)),
+Box(Box(7621)),
+Box(Box(7622)),
+Box(Box(7623)),
+Box(Box(7624)),
+Box(Box(7625)),
+Box(Box(7626)),
+Box(Box(7627)),
+Box(Box(7628)),
+Box(Box(7629)),
+Box(Box(7630)),
+Box(Box(7631)),
+Box(Box(7632)),
+Box(Box(7633)),
+Box(Box(7634)),
+Box(Box(7635)),
+Box(Box(7636)),
+Box(Box(7637)),
+Box(Box(7638)),
+Box(Box(7639)),
+Box(Box(7640)),
+Box(Box(7641)),
+Box(Box(7642)),
+Box(Box(7643)),
+Box(Box(7644)),
+Box(Box(7645)),
+Box(Box(7646)),
+Box(Box(7647)),
+Box(Box(7648)),
+Box(Box(7649)),
+Box(Box(7650)),
+Box(Box(7651)),
+Box(Box(7652)),
+Box(Box(7653)),
+Box(Box(7654)),
+Box(Box(7655)),
+Box(Box(7656)),
+Box(Box(7657)),
+Box(Box(7658)),
+Box(Box(7659)),
+Box(Box(7660)),
+Box(Box(7661)),
+Box(Box(7662)),
+Box(Box(7663)),
+Box(Box(7664)),
+Box(Box(7665)),
+Box(Box(7666)),
+Box(Box(7667)),
+Box(Box(7668)),
+Box(Box(7669)),
+Box(Box(7670)),
+Box(Box(7671)),
+Box(Box(7672)),
+Box(Box(7673)),
+Box(Box(7674)),
+Box(Box(7675)),
+Box(Box(7676)),
+Box(Box(7677)),
+Box(Box(7678)),
+Box(Box(7679)),
+Box(Box(7680)),
+Box(Box(7681)),
+Box(Box(7682)),
+Box(Box(7683)),
+Box(Box(7684)),
+Box(Box(7685)),
+Box(Box(7686)),
+Box(Box(7687)),
+Box(Box(7688)),
+Box(Box(7689)),
+Box(Box(7690)),
+Box(Box(7691)),
+Box(Box(7692)),
+Box(Box(7693)),
+Box(Box(7694)),
+Box(Box(7695)),
+Box(Box(7696)),
+Box(Box(7697)),
+Box(Box(7698)),
+Box(Box(7699)),
+Box(Box(7700)),
+Box(Box(7701)),
+Box(Box(7702)),
+Box(Box(7703)),
+Box(Box(7704)),
+Box(Box(7705)),
+Box(Box(7706)),
+Box(Box(7707)),
+Box(Box(7708)),
+Box(Box(7709)),
+Box(Box(7710)),
+Box(Box(7711)),
+Box(Box(7712)),
+Box(Box(7713)),
+Box(Box(7714)),
+Box(Box(7715)),
+Box(Box(7716)),
+Box(Box(7717)),
+Box(Box(7718)),
+Box(Box(7719)),
+Box(Box(7720)),
+Box(Box(7721)),
+Box(Box(7722)),
+Box(Box(7723)),
+Box(Box(7724)),
+Box(Box(7725)),
+Box(Box(7726)),
+Box(Box(7727)),
+Box(Box(7728)),
+Box(Box(7729)),
+Box(Box(7730)),
+Box(Box(7731)),
+Box(Box(7732)),
+Box(Box(7733)),
+Box(Box(7734)),
+Box(Box(7735)),
+Box(Box(7736)),
+Box(Box(7737)),
+Box(Box(7738)),
+Box(Box(7739)),
+Box(Box(7740)),
+Box(Box(7741)),
+Box(Box(7742)),
+Box(Box(7743)),
+Box(Box(7744)),
+Box(Box(7745)),
+Box(Box(7746)),
+Box(Box(7747)),
+Box(Box(7748)),
+Box(Box(7749)),
+Box(Box(7750)),
+Box(Box(7751)),
+Box(Box(7752)),
+Box(Box(7753)),
+Box(Box(7754)),
+Box(Box(7755)),
+Box(Box(7756)),
+Box(Box(7757)),
+Box(Box(7758)),
+Box(Box(7759)),
+Box(Box(7760)),
+Box(Box(7761)),
+Box(Box(7762)),
+Box(Box(7763)),
+Box(Box(7764)),
+Box(Box(7765)),
+Box(Box(7766)),
+Box(Box(7767)),
+Box(Box(7768)),
+Box(Box(7769)),
+Box(Box(7770)),
+Box(Box(7771)),
+Box(Box(7772)),
+Box(Box(7773)),
+Box(Box(7774)),
+Box(Box(7775)),
+Box(Box(7776)),
+Box(Box(7777)),
+Box(Box(7778)),
+Box(Box(7779)),
+Box(Box(7780)),
+Box(Box(7781)),
+Box(Box(7782)),
+Box(Box(7783)),
+Box(Box(7784)),
+Box(Box(7785)),
+Box(Box(7786)),
+Box(Box(7787)),
+Box(Box(7788)),
+Box(Box(7789)),
+Box(Box(7790)),
+Box(Box(7791)),
+Box(Box(7792)),
+Box(Box(7793)),
+Box(Box(7794)),
+Box(Box(7795)),
+Box(Box(7796)),
+Box(Box(7797)),
+Box(Box(7798)),
+Box(Box(7799)),
+Box(Box(7800)),
+Box(Box(7801)),
+Box(Box(7802)),
+Box(Box(7803)),
+Box(Box(7804)),
+Box(Box(7805)),
+Box(Box(7806)),
+Box(Box(7807)),
+Box(Box(7808)),
+Box(Box(7809)),
+Box(Box(7810)),
+Box(Box(7811)),
+Box(Box(7812)),
+Box(Box(7813)),
+Box(Box(7814)),
+Box(Box(7815)),
+Box(Box(7816)),
+Box(Box(7817)),
+Box(Box(7818)),
+Box(Box(7819)),
+Box(Box(7820)),
+Box(Box(7821)),
+Box(Box(7822)),
+Box(Box(7823)),
+Box(Box(7824)),
+Box(Box(7825)),
+Box(Box(7826)),
+Box(Box(7827)),
+Box(Box(7828)),
+Box(Box(7829)),
+Box(Box(7830)),
+Box(Box(7831)),
+Box(Box(7832)),
+Box(Box(7833)),
+Box(Box(7834)),
+Box(Box(7835)),
+Box(Box(7836)),
+Box(Box(7837)),
+Box(Box(7838)),
+Box(Box(7839)),
+Box(Box(7840)),
+Box(Box(7841)),
+Box(Box(7842)),
+Box(Box(7843)),
+Box(Box(7844)),
+Box(Box(7845)),
+Box(Box(7846)),
+Box(Box(7847)),
+Box(Box(7848)),
+Box(Box(7849)),
+Box(Box(7850)),
+Box(Box(7851)),
+Box(Box(7852)),
+Box(Box(7853)),
+Box(Box(7854)),
+Box(Box(7855)),
+Box(Box(7856)),
+Box(Box(7857)),
+Box(Box(7858)),
+Box(Box(7859)),
+Box(Box(7860)),
+Box(Box(7861)),
+Box(Box(7862)),
+Box(Box(7863)),
+Box(Box(7864)),
+Box(Box(7865)),
+Box(Box(7866)),
+Box(Box(7867)),
+Box(Box(7868)),
+Box(Box(7869)),
+Box(Box(7870)),
+Box(Box(7871)),
+Box(Box(7872)),
+Box(Box(7873)),
+Box(Box(7874)),
+Box(Box(7875)),
+Box(Box(7876)),
+Box(Box(7877)),
+Box(Box(7878)),
+Box(Box(7879)),
+Box(Box(7880)),
+Box(Box(7881)),
+Box(Box(7882)),
+Box(Box(7883)),
+Box(Box(7884)),
+Box(Box(7885)),
+Box(Box(7886)),
+Box(Box(7887)),
+Box(Box(7888)),
+Box(Box(7889)),
+Box(Box(7890)),
+Box(Box(7891)),
+Box(Box(7892)),
+Box(Box(7893)),
+Box(Box(7894)),
+Box(Box(7895)),
+Box(Box(7896)),
+Box(Box(7897)),
+Box(Box(7898)),
+Box(Box(7899)),
+Box(Box(7900)),
+Box(Box(7901)),
+Box(Box(7902)),
+Box(Box(7903)),
+Box(Box(7904)),
+Box(Box(7905)),
+Box(Box(7906)),
+Box(Box(7907)),
+Box(Box(7908)),
+Box(Box(7909)),
+Box(Box(7910)),
+Box(Box(7911)),
+Box(Box(7912)),
+Box(Box(7913)),
+Box(Box(7914)),
+Box(Box(7915)),
+Box(Box(7916)),
+Box(Box(7917)),
+Box(Box(7918)),
+Box(Box(7919)),
+Box(Box(7920)),
+Box(Box(7921)),
+Box(Box(7922)),
+Box(Box(7923)),
+Box(Box(7924)),
+Box(Box(7925)),
+Box(Box(7926)),
+Box(Box(7927)),
+Box(Box(7928)),
+Box(Box(7929)),
+Box(Box(7930)),
+Box(Box(7931)),
+Box(Box(7932)),
+Box(Box(7933)),
+Box(Box(7934)),
+Box(Box(7935)),
+Box(Box(7936)),
+Box(Box(7937)),
+Box(Box(7938)),
+Box(Box(7939)),
+Box(Box(7940)),
+Box(Box(7941)),
+Box(Box(7942)),
+Box(Box(7943)),
+Box(Box(7944)),
+Box(Box(7945)),
+Box(Box(7946)),
+Box(Box(7947)),
+Box(Box(7948)),
+Box(Box(7949)),
+Box(Box(7950)),
+Box(Box(7951)),
+Box(Box(7952)),
+Box(Box(7953)),
+Box(Box(7954)),
+Box(Box(7955)),
+Box(Box(7956)),
+Box(Box(7957)),
+Box(Box(7958)),
+Box(Box(7959)),
+Box(Box(7960)),
+Box(Box(7961)),
+Box(Box(7962)),
+Box(Box(7963)),
+Box(Box(7964)),
+Box(Box(7965)),
+Box(Box(7966)),
+Box(Box(7967)),
+Box(Box(7968)),
+Box(Box(7969)),
+Box(Box(7970)),
+Box(Box(7971)),
+Box(Box(7972)),
+Box(Box(7973)),
+Box(Box(7974)),
+Box(Box(7975)),
+Box(Box(7976)),
+Box(Box(7977)),
+Box(Box(7978)),
+Box(Box(7979)),
+Box(Box(7980)),
+Box(Box(7981)),
+Box(Box(7982)),
+Box(Box(7983)),
+Box(Box(7984)),
+Box(Box(7985)),
+Box(Box(7986)),
+Box(Box(7987)),
+Box(Box(7988)),
+Box(Box(7989)),
+Box(Box(7990)),
+Box(Box(7991)),
+Box(Box(7992)),
+Box(Box(7993)),
+Box(Box(7994)),
+Box(Box(7995)),
+Box(Box(7996)),
+Box(Box(7997)),
+Box(Box(7998)),
+Box(Box(7999)),
+Box(Box(8000)),
+Box(Box(8001)),
+Box(Box(8002)),
+Box(Box(8003)),
+Box(Box(8004)),
+Box(Box(8005)),
+Box(Box(8006)),
+Box(Box(8007)),
+Box(Box(8008)),
+Box(Box(8009)),
+Box(Box(8010)),
+Box(Box(8011)),
+Box(Box(8012)),
+Box(Box(8013)),
+Box(Box(8014)),
+Box(Box(8015)),
+Box(Box(8016)),
+Box(Box(8017)),
+Box(Box(8018)),
+Box(Box(8019)),
+Box(Box(8020)),
+Box(Box(8021)),
+Box(Box(8022)),
+Box(Box(8023)),
+Box(Box(8024)),
+Box(Box(8025)),
+Box(Box(8026)),
+Box(Box(8027)),
+Box(Box(8028)),
+Box(Box(8029)),
+Box(Box(8030)),
+Box(Box(8031)),
+Box(Box(8032)),
+Box(Box(8033)),
+Box(Box(8034)),
+Box(Box(8035)),
+Box(Box(8036)),
+Box(Box(8037)),
+Box(Box(8038)),
+Box(Box(8039)),
+Box(Box(8040)),
+Box(Box(8041)),
+Box(Box(8042)),
+Box(Box(8043)),
+Box(Box(8044)),
+Box(Box(8045)),
+Box(Box(8046)),
+Box(Box(8047)),
+Box(Box(8048)),
+Box(Box(8049)),
+Box(Box(8050)),
+Box(Box(8051)),
+Box(Box(8052)),
+Box(Box(8053)),
+Box(Box(8054)),
+Box(Box(8055)),
+Box(Box(8056)),
+Box(Box(8057)),
+Box(Box(8058)),
+Box(Box(8059)),
+Box(Box(8060)),
+Box(Box(8061)),
+Box(Box(8062)),
+Box(Box(8063)),
+Box(Box(8064)),
+Box(Box(8065)),
+Box(Box(8066)),
+Box(Box(8067)),
+Box(Box(8068)),
+Box(Box(8069)),
+Box(Box(8070)),
+Box(Box(8071)),
+Box(Box(8072)),
+Box(Box(8073)),
+Box(Box(8074)),
+Box(Box(8075)),
+Box(Box(8076)),
+Box(Box(8077)),
+Box(Box(8078)),
+Box(Box(8079)),
+Box(Box(8080)),
+Box(Box(8081)),
+Box(Box(8082)),
+Box(Box(8083)),
+Box(Box(8084)),
+Box(Box(8085)),
+Box(Box(8086)),
+Box(Box(8087)),
+Box(Box(8088)),
+Box(Box(8089)),
+Box(Box(8090)),
+Box(Box(8091)),
+Box(Box(8092)),
+Box(Box(8093)),
+Box(Box(8094)),
+Box(Box(8095)),
+Box(Box(8096)),
+Box(Box(8097)),
+Box(Box(8098)),
+Box(Box(8099)),
+Box(Box(8100)),
+Box(Box(8101)),
+Box(Box(8102)),
+Box(Box(8103)),
+Box(Box(8104)),
+Box(Box(8105)),
+Box(Box(8106)),
+Box(Box(8107)),
+Box(Box(8108)),
+Box(Box(8109)),
+Box(Box(8110)),
+Box(Box(8111)),
+Box(Box(8112)),
+Box(Box(8113)),
+Box(Box(8114)),
+Box(Box(8115)),
+Box(Box(8116)),
+Box(Box(8117)),
+Box(Box(8118)),
+Box(Box(8119)),
+Box(Box(8120)),
+Box(Box(8121)),
+Box(Box(8122)),
+Box(Box(8123)),
+Box(Box(8124)),
+Box(Box(8125)),
+Box(Box(8126)),
+Box(Box(8127)),
+Box(Box(8128)),
+Box(Box(8129)),
+Box(Box(8130)),
+Box(Box(8131)),
+Box(Box(8132)),
+Box(Box(8133)),
+Box(Box(8134)),
+Box(Box(8135)),
+Box(Box(8136)),
+Box(Box(8137)),
+Box(Box(8138)),
+Box(Box(8139)),
+Box(Box(8140)),
+Box(Box(8141)),
+Box(Box(8142)),
+Box(Box(8143)),
+Box(Box(8144)),
+Box(Box(8145)),
+Box(Box(8146)),
+Box(Box(8147)),
+Box(Box(8148)),
+Box(Box(8149)),
+Box(Box(8150)),
+Box(Box(8151)),
+Box(Box(8152)),
+Box(Box(8153)),
+Box(Box(8154)),
+Box(Box(8155)),
+Box(Box(8156)),
+Box(Box(8157)),
+Box(Box(8158)),
+Box(Box(8159)),
+Box(Box(8160)),
+Box(Box(8161)),
+Box(Box(8162)),
+Box(Box(8163)),
+Box(Box(8164)),
+Box(Box(8165)),
+Box(Box(8166)),
+Box(Box(8167)),
+Box(Box(8168)),
+Box(Box(8169)),
+Box(Box(8170)),
+Box(Box(8171)),
+Box(Box(8172)),
+Box(Box(8173)),
+Box(Box(8174)),
+Box(Box(8175)),
+Box(Box(8176)),
+Box(Box(8177)),
+Box(Box(8178)),
+Box(Box(8179)),
+Box(Box(8180)),
+Box(Box(8181)),
+Box(Box(8182)),
+Box(Box(8183)),
+Box(Box(8184)),
+Box(Box(8185)),
+Box(Box(8186)),
+Box(Box(8187)),
+Box(Box(8188)),
+Box(Box(8189)),
+Box(Box(8190)),
+Box(Box(8191)),
+Box(Box(8192)),
+Box(Box(8193)),
+Box(Box(8194)),
+Box(Box(8195)),
+Box(Box(8196)),
+Box(Box(8197)),
+Box(Box(8198)),
+Box(Box(8199)),
+Box(Box(8200)),
+Box(Box(8201)),
+Box(Box(8202)),
+Box(Box(8203)),
+Box(Box(8204)),
+Box(Box(8205)),
+Box(Box(8206)),
+Box(Box(8207)),
+Box(Box(8208)),
+Box(Box(8209)),
+Box(Box(8210)),
+Box(Box(8211)),
+Box(Box(8212)),
+Box(Box(8213)),
+Box(Box(8214)),
+Box(Box(8215)),
+Box(Box(8216)),
+Box(Box(8217)),
+Box(Box(8218)),
+Box(Box(8219)),
+Box(Box(8220)),
+Box(Box(8221)),
+Box(Box(8222)),
+Box(Box(8223)),
+Box(Box(8224)),
+Box(Box(8225)),
+Box(Box(8226)),
+Box(Box(8227)),
+Box(Box(8228)),
+Box(Box(8229)),
+Box(Box(8230)),
+Box(Box(8231)),
+Box(Box(8232)),
+Box(Box(8233)),
+Box(Box(8234)),
+Box(Box(8235)),
+Box(Box(8236)),
+Box(Box(8237)),
+Box(Box(8238)),
+Box(Box(8239)),
+Box(Box(8240)),
+Box(Box(8241)),
+Box(Box(8242)),
+Box(Box(8243)),
+Box(Box(8244)),
+Box(Box(8245)),
+Box(Box(8246)),
+Box(Box(8247)),
+Box(Box(8248)),
+Box(Box(8249)),
+Box(Box(8250)),
+Box(Box(8251)),
+Box(Box(8252)),
+Box(Box(8253)),
+Box(Box(8254)),
+Box(Box(8255)),
+Box(Box(8256)),
+Box(Box(8257)),
+Box(Box(8258)),
+Box(Box(8259)),
+Box(Box(8260)),
+Box(Box(8261)),
+Box(Box(8262)),
+Box(Box(8263)),
+Box(Box(8264)),
+Box(Box(8265)),
+Box(Box(8266)),
+Box(Box(8267)),
+Box(Box(8268)),
+Box(Box(8269)),
+Box(Box(8270)),
+Box(Box(8271)),
+Box(Box(8272)),
+Box(Box(8273)),
+Box(Box(8274)),
+Box(Box(8275)),
+Box(Box(8276)),
+Box(Box(8277)),
+Box(Box(8278)),
+Box(Box(8279)),
+Box(Box(8280)),
+Box(Box(8281)),
+Box(Box(8282)),
+Box(Box(8283)),
+Box(Box(8284)),
+Box(Box(8285)),
+Box(Box(8286)),
+Box(Box(8287)),
+Box(Box(8288)),
+Box(Box(8289)),
+Box(Box(8290)),
+Box(Box(8291)),
+Box(Box(8292)),
+Box(Box(8293)),
+Box(Box(8294)),
+Box(Box(8295)),
+Box(Box(8296)),
+Box(Box(8297)),
+Box(Box(8298)),
+Box(Box(8299)),
+Box(Box(8300)),
+Box(Box(8301)),
+Box(Box(8302)),
+Box(Box(8303)),
+Box(Box(8304)),
+Box(Box(8305)),
+Box(Box(8306)),
+Box(Box(8307)),
+Box(Box(8308)),
+Box(Box(8309)),
+Box(Box(8310)),
+Box(Box(8311)),
+Box(Box(8312)),
+Box(Box(8313)),
+Box(Box(8314)),
+Box(Box(8315)),
+Box(Box(8316)),
+Box(Box(8317)),
+Box(Box(8318)),
+Box(Box(8319)),
+Box(Box(8320)),
+Box(Box(8321)),
+Box(Box(8322)),
+Box(Box(8323)),
+Box(Box(8324)),
+Box(Box(8325)),
+Box(Box(8326)),
+Box(Box(8327)),
+Box(Box(8328)),
+Box(Box(8329)),
+Box(Box(8330)),
+Box(Box(8331)),
+Box(Box(8332)),
+Box(Box(8333)),
+Box(Box(8334)),
+Box(Box(8335)),
+Box(Box(8336)),
+Box(Box(8337)),
+Box(Box(8338)),
+Box(Box(8339)),
+Box(Box(8340)),
+Box(Box(8341)),
+Box(Box(8342)),
+Box(Box(8343)),
+Box(Box(8344)),
+Box(Box(8345)),
+Box(Box(8346)),
+Box(Box(8347)),
+Box(Box(8348)),
+Box(Box(8349)),
+Box(Box(8350)),
+Box(Box(8351)),
+Box(Box(8352)),
+Box(Box(8353)),
+Box(Box(8354)),
+Box(Box(8355)),
+Box(Box(8356)),
+Box(Box(8357)),
+Box(Box(8358)),
+Box(Box(8359)),
+Box(Box(8360)),
+Box(Box(8361)),
+Box(Box(8362)),
+Box(Box(8363)),
+Box(Box(8364)),
+Box(Box(8365)),
+Box(Box(8366)),
+Box(Box(8367)),
+Box(Box(8368)),
+Box(Box(8369)),
+Box(Box(8370)),
+Box(Box(8371)),
+Box(Box(8372)),
+Box(Box(8373)),
+Box(Box(8374)),
+Box(Box(8375)),
+Box(Box(8376)),
+Box(Box(8377)),
+Box(Box(8378)),
+Box(Box(8379)),
+Box(Box(8380)),
+Box(Box(8381)),
+Box(Box(8382)),
+Box(Box(8383)),
+Box(Box(8384)),
+Box(Box(8385)),
+Box(Box(8386)),
+Box(Box(8387)),
+Box(Box(8388)),
+Box(Box(8389)),
+Box(Box(8390)),
+Box(Box(8391)),
+Box(Box(8392)),
+Box(Box(8393)),
+Box(Box(8394)),
+Box(Box(8395)),
+Box(Box(8396)),
+Box(Box(8397)),
+Box(Box(8398)),
+Box(Box(8399)),
+Box(Box(8400)),
+Box(Box(8401)),
+Box(Box(8402)),
+Box(Box(8403)),
+Box(Box(8404)),
+Box(Box(8405)),
+Box(Box(8406)),
+Box(Box(8407)),
+Box(Box(8408)),
+Box(Box(8409)),
+Box(Box(8410)),
+Box(Box(8411)),
+Box(Box(8412)),
+Box(Box(8413)),
+Box(Box(8414)),
+Box(Box(8415)),
+Box(Box(8416)),
+Box(Box(8417)),
+Box(Box(8418)),
+Box(Box(8419)),
+Box(Box(8420)),
+Box(Box(8421)),
+Box(Box(8422)),
+Box(Box(8423)),
+Box(Box(8424)),
+Box(Box(8425)),
+Box(Box(8426)),
+Box(Box(8427)),
+Box(Box(8428)),
+Box(Box(8429)),
+Box(Box(8430)),
+Box(Box(8431)),
+Box(Box(8432)),
+Box(Box(8433)),
+Box(Box(8434)),
+Box(Box(8435)),
+Box(Box(8436)),
+Box(Box(8437)),
+Box(Box(8438)),
+Box(Box(8439)),
+Box(Box(8440)),
+Box(Box(8441)),
+Box(Box(8442)),
+Box(Box(8443)),
+Box(Box(8444)),
+Box(Box(8445)),
+Box(Box(8446)),
+Box(Box(8447)),
+Box(Box(8448)),
+Box(Box(8449)),
+Box(Box(8450)),
+Box(Box(8451)),
+Box(Box(8452)),
+Box(Box(8453)),
+Box(Box(8454)),
+Box(Box(8455)),
+Box(Box(8456)),
+Box(Box(8457)),
+Box(Box(8458)),
+Box(Box(8459)),
+Box(Box(8460)),
+Box(Box(8461)),
+Box(Box(8462)),
+Box(Box(8463)),
+Box(Box(8464)),
+Box(Box(8465)),
+Box(Box(8466)),
+Box(Box(8467)),
+Box(Box(8468)),
+Box(Box(8469)),
+Box(Box(8470)),
+Box(Box(8471)),
+Box(Box(8472)),
+Box(Box(8473)),
+Box(Box(8474)),
+Box(Box(8475)),
+Box(Box(8476)),
+Box(Box(8477)),
+Box(Box(8478)),
+Box(Box(8479)),
+Box(Box(8480)),
+Box(Box(8481)),
+Box(Box(8482)),
+Box(Box(8483)),
+Box(Box(8484)),
+Box(Box(8485)),
+Box(Box(8486)),
+Box(Box(8487)),
+Box(Box(8488)),
+Box(Box(8489)),
+Box(Box(8490)),
+Box(Box(8491)),
+Box(Box(8492)),
+Box(Box(8493)),
+Box(Box(8494)),
+Box(Box(8495)),
+Box(Box(8496)),
+Box(Box(8497)),
+Box(Box(8498)),
+Box(Box(8499)),
+Box(Box(8500)),
+Box(Box(8501)),
+Box(Box(8502)),
+Box(Box(8503)),
+Box(Box(8504)),
+Box(Box(8505)),
+Box(Box(8506)),
+Box(Box(8507)),
+Box(Box(8508)),
+Box(Box(8509)),
+Box(Box(8510)),
+Box(Box(8511)),
+Box(Box(8512)),
+Box(Box(8513)),
+Box(Box(8514)),
+Box(Box(8515)),
+Box(Box(8516)),
+Box(Box(8517)),
+Box(Box(8518)),
+Box(Box(8519)),
+Box(Box(8520)),
+Box(Box(8521)),
+Box(Box(8522)),
+Box(Box(8523)),
+Box(Box(8524)),
+Box(Box(8525)),
+Box(Box(8526)),
+Box(Box(8527)),
+Box(Box(8528)),
+Box(Box(8529)),
+Box(Box(8530)),
+Box(Box(8531)),
+Box(Box(8532)),
+Box(Box(8533)),
+Box(Box(8534)),
+Box(Box(8535)),
+Box(Box(8536)),
+Box(Box(8537)),
+Box(Box(8538)),
+Box(Box(8539)),
+Box(Box(8540)),
+Box(Box(8541)),
+Box(Box(8542)),
+Box(Box(8543)),
+Box(Box(8544)),
+Box(Box(8545)),
+Box(Box(8546)),
+Box(Box(8547)),
+Box(Box(8548)),
+Box(Box(8549)),
+Box(Box(8550)),
+Box(Box(8551)),
+Box(Box(8552)),
+Box(Box(8553)),
+Box(Box(8554)),
+Box(Box(8555)),
+Box(Box(8556)),
+Box(Box(8557)),
+Box(Box(8558)),
+Box(Box(8559)),
+Box(Box(8560)),
+Box(Box(8561)),
+Box(Box(8562)),
+Box(Box(8563)),
+Box(Box(8564)),
+Box(Box(8565)),
+Box(Box(8566)),
+Box(Box(8567)),
+Box(Box(8568)),
+Box(Box(8569)),
+Box(Box(8570)),
+Box(Box(8571)),
+Box(Box(8572)),
+Box(Box(8573)),
+Box(Box(8574)),
+Box(Box(8575)),
+Box(Box(8576)),
+Box(Box(8577)),
+Box(Box(8578)),
+Box(Box(8579)),
+Box(Box(8580)),
+Box(Box(8581)),
+Box(Box(8582)),
+Box(Box(8583)),
+Box(Box(8584)),
+Box(Box(8585)),
+Box(Box(8586)),
+Box(Box(8587)),
+Box(Box(8588)),
+Box(Box(8589)),
+Box(Box(8590)),
+Box(Box(8591)),
+Box(Box(8592)),
+Box(Box(8593)),
+Box(Box(8594)),
+Box(Box(8595)),
+Box(Box(8596)),
+Box(Box(8597)),
+Box(Box(8598)),
+Box(Box(8599)),
+Box(Box(8600)),
+Box(Box(8601)),
+Box(Box(8602)),
+Box(Box(8603)),
+Box(Box(8604)),
+Box(Box(8605)),
+Box(Box(8606)),
+Box(Box(8607)),
+Box(Box(8608)),
+Box(Box(8609)),
+Box(Box(8610)),
+Box(Box(8611)),
+Box(Box(8612)),
+Box(Box(8613)),
+Box(Box(8614)),
+Box(Box(8615)),
+Box(Box(8616)),
+Box(Box(8617)),
+Box(Box(8618)),
+Box(Box(8619)),
+Box(Box(8620)),
+Box(Box(8621)),
+Box(Box(8622)),
+Box(Box(8623)),
+Box(Box(8624)),
+Box(Box(8625)),
+Box(Box(8626)),
+Box(Box(8627)),
+Box(Box(8628)),
+Box(Box(8629)),
+Box(Box(8630)),
+Box(Box(8631)),
+Box(Box(8632)),
+Box(Box(8633)),
+Box(Box(8634)),
+Box(Box(8635)),
+Box(Box(8636)),
+Box(Box(8637)),
+Box(Box(8638)),
+Box(Box(8639)),
+Box(Box(8640)),
+Box(Box(8641)),
+Box(Box(8642)),
+Box(Box(8643)),
+Box(Box(8644)),
+Box(Box(8645)),
+Box(Box(8646)),
+Box(Box(8647)),
+Box(Box(8648)),
+Box(Box(8649)),
+Box(Box(8650)),
+Box(Box(8651)),
+Box(Box(8652)),
+Box(Box(8653)),
+Box(Box(8654)),
+Box(Box(8655)),
+Box(Box(8656)),
+Box(Box(8657)),
+Box(Box(8658)),
+Box(Box(8659)),
+Box(Box(8660)),
+Box(Box(8661)),
+Box(Box(8662)),
+Box(Box(8663)),
+Box(Box(8664)),
+Box(Box(8665)),
+Box(Box(8666)),
+Box(Box(8667)),
+Box(Box(8668)),
+Box(Box(8669)),
+Box(Box(8670)),
+Box(Box(8671)),
+Box(Box(8672)),
+Box(Box(8673)),
+Box(Box(8674)),
+Box(Box(8675)),
+Box(Box(8676)),
+Box(Box(8677)),
+Box(Box(8678)),
+Box(Box(8679)),
+Box(Box(8680)),
+Box(Box(8681)),
+Box(Box(8682)),
+Box(Box(8683)),
+Box(Box(8684)),
+Box(Box(8685)),
+Box(Box(8686)),
+Box(Box(8687)),
+Box(Box(8688)),
+Box(Box(8689)),
+Box(Box(8690)),
+Box(Box(8691)),
+Box(Box(8692)),
+Box(Box(8693)),
+Box(Box(8694)),
+Box(Box(8695)),
+Box(Box(8696)),
+Box(Box(8697)),
+Box(Box(8698)),
+Box(Box(8699)),
+Box(Box(8700)),
+Box(Box(8701)),
+Box(Box(8702)),
+Box(Box(8703)),
+Box(Box(8704)),
+Box(Box(8705)),
+Box(Box(8706)),
+Box(Box(8707)),
+Box(Box(8708)),
+Box(Box(8709)),
+Box(Box(8710)),
+Box(Box(8711)),
+Box(Box(8712)),
+Box(Box(8713)),
+Box(Box(8714)),
+Box(Box(8715)),
+Box(Box(8716)),
+Box(Box(8717)),
+Box(Box(8718)),
+Box(Box(8719)),
+Box(Box(8720)),
+Box(Box(8721)),
+Box(Box(8722)),
+Box(Box(8723)),
+Box(Box(8724)),
+Box(Box(8725)),
+Box(Box(8726)),
+Box(Box(8727)),
+Box(Box(8728)),
+Box(Box(8729)),
+Box(Box(8730)),
+Box(Box(8731)),
+Box(Box(8732)),
+Box(Box(8733)),
+Box(Box(8734)),
+Box(Box(8735)),
+Box(Box(8736)),
+Box(Box(8737)),
+Box(Box(8738)),
+Box(Box(8739)),
+Box(Box(8740)),
+Box(Box(8741)),
+Box(Box(8742)),
+Box(Box(8743)),
+Box(Box(8744)),
+Box(Box(8745)),
+Box(Box(8746)),
+Box(Box(8747)),
+Box(Box(8748)),
+Box(Box(8749)),
+Box(Box(8750)),
+Box(Box(8751)),
+Box(Box(8752)),
+Box(Box(8753)),
+Box(Box(8754)),
+Box(Box(8755)),
+Box(Box(8756)),
+Box(Box(8757)),
+Box(Box(8758)),
+Box(Box(8759)),
+Box(Box(8760)),
+Box(Box(8761)),
+Box(Box(8762)),
+Box(Box(8763)),
+Box(Box(8764)),
+Box(Box(8765)),
+Box(Box(8766)),
+Box(Box(8767)),
+Box(Box(8768)),
+Box(Box(8769)),
+Box(Box(8770)),
+Box(Box(8771)),
+Box(Box(8772)),
+Box(Box(8773)),
+Box(Box(8774)),
+Box(Box(8775)),
+Box(Box(8776)),
+Box(Box(8777)),
+Box(Box(8778)),
+Box(Box(8779)),
+Box(Box(8780)),
+Box(Box(8781)),
+Box(Box(8782)),
+Box(Box(8783)),
+Box(Box(8784)),
+Box(Box(8785)),
+Box(Box(8786)),
+Box(Box(8787)),
+Box(Box(8788)),
+Box(Box(8789)),
+Box(Box(8790)),
+Box(Box(8791)),
+Box(Box(8792)),
+Box(Box(8793)),
+Box(Box(8794)),
+Box(Box(8795)),
+Box(Box(8796)),
+Box(Box(8797)),
+Box(Box(8798)),
+Box(Box(8799)),
+Box(Box(8800)),
+Box(Box(8801)),
+Box(Box(8802)),
+Box(Box(8803)),
+Box(Box(8804)),
+Box(Box(8805)),
+Box(Box(8806)),
+Box(Box(8807)),
+Box(Box(8808)),
+Box(Box(8809)),
+Box(Box(8810)),
+Box(Box(8811)),
+Box(Box(8812)),
+Box(Box(8813)),
+Box(Box(8814)),
+Box(Box(8815)),
+Box(Box(8816)),
+Box(Box(8817)),
+Box(Box(8818)),
+Box(Box(8819)),
+Box(Box(8820)),
+Box(Box(8821)),
+Box(Box(8822)),
+Box(Box(8823)),
+Box(Box(8824)),
+Box(Box(8825)),
+Box(Box(8826)),
+Box(Box(8827)),
+Box(Box(8828)),
+Box(Box(8829)),
+Box(Box(8830)),
+Box(Box(8831)),
+Box(Box(8832)),
+Box(Box(8833)),
+Box(Box(8834)),
+Box(Box(8835)),
+Box(Box(8836)),
+Box(Box(8837)),
+Box(Box(8838)),
+Box(Box(8839)),
+Box(Box(8840)),
+Box(Box(8841)),
+Box(Box(8842)),
+Box(Box(8843)),
+Box(Box(8844)),
+Box(Box(8845)),
+Box(Box(8846)),
+Box(Box(8847)),
+Box(Box(8848)),
+Box(Box(8849)),
+Box(Box(8850)),
+Box(Box(8851)),
+Box(Box(8852)),
+Box(Box(8853)),
+Box(Box(8854)),
+Box(Box(8855)),
+Box(Box(8856)),
+Box(Box(8857)),
+Box(Box(8858)),
+Box(Box(8859)),
+Box(Box(8860)),
+Box(Box(8861)),
+Box(Box(8862)),
+Box(Box(8863)),
+Box(Box(8864)),
+Box(Box(8865)),
+Box(Box(8866)),
+Box(Box(8867)),
+Box(Box(8868)),
+Box(Box(8869)),
+Box(Box(8870)),
+Box(Box(8871)),
+Box(Box(8872)),
+Box(Box(8873)),
+Box(Box(8874)),
+Box(Box(8875)),
+Box(Box(8876)),
+Box(Box(8877)),
+Box(Box(8878)),
+Box(Box(8879)),
+Box(Box(8880)),
+Box(Box(8881)),
+Box(Box(8882)),
+Box(Box(8883)),
+Box(Box(8884)),
+Box(Box(8885)),
+Box(Box(8886)),
+Box(Box(8887)),
+Box(Box(8888)),
+Box(Box(8889)),
+Box(Box(8890)),
+Box(Box(8891)),
+Box(Box(8892)),
+Box(Box(8893)),
+Box(Box(8894)),
+Box(Box(8895)),
+Box(Box(8896)),
+Box(Box(8897)),
+Box(Box(8898)),
+Box(Box(8899)),
+Box(Box(8900)),
+Box(Box(8901)),
+Box(Box(8902)),
+Box(Box(8903)),
+Box(Box(8904)),
+Box(Box(8905)),
+Box(Box(8906)),
+Box(Box(8907)),
+Box(Box(8908)),
+Box(Box(8909)),
+Box(Box(8910)),
+Box(Box(8911)),
+Box(Box(8912)),
+Box(Box(8913)),
+Box(Box(8914)),
+Box(Box(8915)),
+Box(Box(8916)),
+Box(Box(8917)),
+Box(Box(8918)),
+Box(Box(8919)),
+Box(Box(8920)),
+Box(Box(8921)),
+Box(Box(8922)),
+Box(Box(8923)),
+Box(Box(8924)),
+Box(Box(8925)),
+Box(Box(8926)),
+Box(Box(8927)),
+Box(Box(8928)),
+Box(Box(8929)),
+Box(Box(8930)),
+Box(Box(8931)),
+Box(Box(8932)),
+Box(Box(8933)),
+Box(Box(8934)),
+Box(Box(8935)),
+Box(Box(8936)),
+Box(Box(8937)),
+Box(Box(8938)),
+Box(Box(8939)),
+Box(Box(8940)),
+Box(Box(8941)),
+Box(Box(8942)),
+Box(Box(8943)),
+Box(Box(8944)),
+Box(Box(8945)),
+Box(Box(8946)),
+Box(Box(8947)),
+Box(Box(8948)),
+Box(Box(8949)),
+Box(Box(8950)),
+Box(Box(8951)),
+Box(Box(8952)),
+Box(Box(8953)),
+Box(Box(8954)),
+Box(Box(8955)),
+Box(Box(8956)),
+Box(Box(8957)),
+Box(Box(8958)),
+Box(Box(8959)),
+Box(Box(8960)),
+Box(Box(8961)),
+Box(Box(8962)),
+Box(Box(8963)),
+Box(Box(8964)),
+Box(Box(8965)),
+Box(Box(8966)),
+Box(Box(8967)),
+Box(Box(8968)),
+Box(Box(8969)),
+Box(Box(8970)),
+Box(Box(8971)),
+Box(Box(8972)),
+Box(Box(8973)),
+Box(Box(8974)),
+Box(Box(8975)),
+Box(Box(8976)),
+Box(Box(8977)),
+Box(Box(8978)),
+Box(Box(8979)),
+Box(Box(8980)),
+Box(Box(8981)),
+Box(Box(8982)),
+Box(Box(8983)),
+Box(Box(8984)),
+Box(Box(8985)),
+Box(Box(8986)),
+Box(Box(8987)),
+Box(Box(8988)),
+Box(Box(8989)),
+Box(Box(8990)),
+Box(Box(8991)),
+Box(Box(8992)),
+Box(Box(8993)),
+Box(Box(8994)),
+Box(Box(8995)),
+Box(Box(8996)),
+Box(Box(8997)),
+Box(Box(8998)),
+Box(Box(8999)),
+Box(Box(9000)),
+Box(Box(9001)),
+Box(Box(9002)),
+Box(Box(9003)),
+Box(Box(9004)),
+Box(Box(9005)),
+Box(Box(9006)),
+Box(Box(9007)),
+Box(Box(9008)),
+Box(Box(9009)),
+Box(Box(9010)),
+Box(Box(9011)),
+Box(Box(9012)),
+Box(Box(9013)),
+Box(Box(9014)),
+Box(Box(9015)),
+Box(Box(9016)),
+Box(Box(9017)),
+Box(Box(9018)),
+Box(Box(9019)),
+Box(Box(9020)),
+Box(Box(9021)),
+Box(Box(9022)),
+Box(Box(9023)),
+Box(Box(9024)),
+Box(Box(9025)),
+Box(Box(9026)),
+Box(Box(9027)),
+Box(Box(9028)),
+Box(Box(9029)),
+Box(Box(9030)),
+Box(Box(9031)),
+Box(Box(9032)),
+Box(Box(9033)),
+Box(Box(9034)),
+Box(Box(9035)),
+Box(Box(9036)),
+Box(Box(9037)),
+Box(Box(9038)),
+Box(Box(9039)),
+Box(Box(9040)),
+Box(Box(9041)),
+Box(Box(9042)),
+Box(Box(9043)),
+Box(Box(9044)),
+Box(Box(9045)),
+Box(Box(9046)),
+Box(Box(9047)),
+Box(Box(9048)),
+Box(Box(9049)),
+Box(Box(9050)),
+Box(Box(9051)),
+Box(Box(9052)),
+Box(Box(9053)),
+Box(Box(9054)),
+Box(Box(9055)),
+Box(Box(9056)),
+Box(Box(9057)),
+Box(Box(9058)),
+Box(Box(9059)),
+Box(Box(9060)),
+Box(Box(9061)),
+Box(Box(9062)),
+Box(Box(9063)),
+Box(Box(9064)),
+Box(Box(9065)),
+Box(Box(9066)),
+Box(Box(9067)),
+Box(Box(9068)),
+Box(Box(9069)),
+Box(Box(9070)),
+Box(Box(9071)),
+Box(Box(9072)),
+Box(Box(9073)),
+Box(Box(9074)),
+Box(Box(9075)),
+Box(Box(9076)),
+Box(Box(9077)),
+Box(Box(9078)),
+Box(Box(9079)),
+Box(Box(9080)),
+Box(Box(9081)),
+Box(Box(9082)),
+Box(Box(9083)),
+Box(Box(9084)),
+Box(Box(9085)),
+Box(Box(9086)),
+Box(Box(9087)),
+Box(Box(9088)),
+Box(Box(9089)),
+Box(Box(9090)),
+Box(Box(9091)),
+Box(Box(9092)),
+Box(Box(9093)),
+Box(Box(9094)),
+Box(Box(9095)),
+Box(Box(9096)),
+Box(Box(9097)),
+Box(Box(9098)),
+Box(Box(9099)),
+Box(Box(9100)),
+Box(Box(9101)),
+Box(Box(9102)),
+Box(Box(9103)),
+Box(Box(9104)),
+Box(Box(9105)),
+Box(Box(9106)),
+Box(Box(9107)),
+Box(Box(9108)),
+Box(Box(9109)),
+Box(Box(9110)),
+Box(Box(9111)),
+Box(Box(9112)),
+Box(Box(9113)),
+Box(Box(9114)),
+Box(Box(9115)),
+Box(Box(9116)),
+Box(Box(9117)),
+Box(Box(9118)),
+Box(Box(9119)),
+Box(Box(9120)),
+Box(Box(9121)),
+Box(Box(9122)),
+Box(Box(9123)),
+Box(Box(9124)),
+Box(Box(9125)),
+Box(Box(9126)),
+Box(Box(9127)),
+Box(Box(9128)),
+Box(Box(9129)),
+Box(Box(9130)),
+Box(Box(9131)),
+Box(Box(9132)),
+Box(Box(9133)),
+Box(Box(9134)),
+Box(Box(9135)),
+Box(Box(9136)),
+Box(Box(9137)),
+Box(Box(9138)),
+Box(Box(9139)),
+Box(Box(9140)),
+Box(Box(9141)),
+Box(Box(9142)),
+Box(Box(9143)),
+Box(Box(9144)),
+Box(Box(9145)),
+Box(Box(9146)),
+Box(Box(9147)),
+Box(Box(9148)),
+Box(Box(9149)),
+Box(Box(9150)),
+Box(Box(9151)),
+Box(Box(9152)),
+Box(Box(9153)),
+Box(Box(9154)),
+Box(Box(9155)),
+Box(Box(9156)),
+Box(Box(9157)),
+Box(Box(9158)),
+Box(Box(9159)),
+Box(Box(9160)),
+Box(Box(9161)),
+Box(Box(9162)),
+Box(Box(9163)),
+Box(Box(9164)),
+Box(Box(9165)),
+Box(Box(9166)),
+Box(Box(9167)),
+Box(Box(9168)),
+Box(Box(9169)),
+Box(Box(9170)),
+Box(Box(9171)),
+Box(Box(9172)),
+Box(Box(9173)),
+Box(Box(9174)),
+Box(Box(9175)),
+Box(Box(9176)),
+Box(Box(9177)),
+Box(Box(9178)),
+Box(Box(9179)),
+Box(Box(9180)),
+Box(Box(9181)),
+Box(Box(9182)),
+Box(Box(9183)),
+Box(Box(9184)),
+Box(Box(9185)),
+Box(Box(9186)),
+Box(Box(9187)),
+Box(Box(9188)),
+Box(Box(9189)),
+Box(Box(9190)),
+Box(Box(9191)),
+Box(Box(9192)),
+Box(Box(9193)),
+Box(Box(9194)),
+Box(Box(9195)),
+Box(Box(9196)),
+Box(Box(9197)),
+Box(Box(9198)),
+Box(Box(9199)),
+Box(Box(9200)),
+Box(Box(9201)),
+Box(Box(9202)),
+Box(Box(9203)),
+Box(Box(9204)),
+Box(Box(9205)),
+Box(Box(9206)),
+Box(Box(9207)),
+Box(Box(9208)),
+Box(Box(9209)),
+Box(Box(9210)),
+Box(Box(9211)),
+Box(Box(9212)),
+Box(Box(9213)),
+Box(Box(9214)),
+Box(Box(9215)),
+Box(Box(9216)),
+Box(Box(9217)),
+Box(Box(9218)),
+Box(Box(9219)),
+Box(Box(9220)),
+Box(Box(9221)),
+Box(Box(9222)),
+Box(Box(9223)),
+Box(Box(9224)),
+Box(Box(9225)),
+Box(Box(9226)),
+Box(Box(9227)),
+Box(Box(9228)),
+Box(Box(9229)),
+Box(Box(9230)),
+Box(Box(9231)),
+Box(Box(9232)),
+Box(Box(9233)),
+Box(Box(9234)),
+Box(Box(9235)),
+Box(Box(9236)),
+Box(Box(9237)),
+Box(Box(9238)),
+Box(Box(9239)),
+Box(Box(9240)),
+Box(Box(9241)),
+Box(Box(9242)),
+Box(Box(9243)),
+Box(Box(9244)),
+Box(Box(9245)),
+Box(Box(9246)),
+Box(Box(9247)),
+Box(Box(9248)),
+Box(Box(9249)),
+Box(Box(9250)),
+Box(Box(9251)),
+Box(Box(9252)),
+Box(Box(9253)),
+Box(Box(9254)),
+Box(Box(9255)),
+Box(Box(9256)),
+Box(Box(9257)),
+Box(Box(9258)),
+Box(Box(9259)),
+Box(Box(9260)),
+Box(Box(9261)),
+Box(Box(9262)),
+Box(Box(9263)),
+Box(Box(9264)),
+Box(Box(9265)),
+Box(Box(9266)),
+Box(Box(9267)),
+Box(Box(9268)),
+Box(Box(9269)),
+Box(Box(9270)),
+Box(Box(9271)),
+Box(Box(9272)),
+Box(Box(9273)),
+Box(Box(9274)),
+Box(Box(9275)),
+Box(Box(9276)),
+Box(Box(9277)),
+Box(Box(9278)),
+Box(Box(9279)),
+Box(Box(9280)),
+Box(Box(9281)),
+Box(Box(9282)),
+Box(Box(9283)),
+Box(Box(9284)),
+Box(Box(9285)),
+Box(Box(9286)),
+Box(Box(9287)),
+Box(Box(9288)),
+Box(Box(9289)),
+Box(Box(9290)),
+Box(Box(9291)),
+Box(Box(9292)),
+Box(Box(9293)),
+Box(Box(9294)),
+Box(Box(9295)),
+Box(Box(9296)),
+Box(Box(9297)),
+Box(Box(9298)),
+Box(Box(9299)),
+Box(Box(9300)),
+Box(Box(9301)),
+Box(Box(9302)),
+Box(Box(9303)),
+Box(Box(9304)),
+Box(Box(9305)),
+Box(Box(9306)),
+Box(Box(9307)),
+Box(Box(9308)),
+Box(Box(9309)),
+Box(Box(9310)),
+Box(Box(9311)),
+Box(Box(9312)),
+Box(Box(9313)),
+Box(Box(9314)),
+Box(Box(9315)),
+Box(Box(9316)),
+Box(Box(9317)),
+Box(Box(9318)),
+Box(Box(9319)),
+Box(Box(9320)),
+Box(Box(9321)),
+Box(Box(9322)),
+Box(Box(9323)),
+Box(Box(9324)),
+Box(Box(9325)),
+Box(Box(9326)),
+Box(Box(9327)),
+Box(Box(9328)),
+Box(Box(9329)),
+Box(Box(9330)),
+Box(Box(9331)),
+Box(Box(9332)),
+Box(Box(9333)),
+Box(Box(9334)),
+Box(Box(9335)),
+Box(Box(9336)),
+Box(Box(9337)),
+Box(Box(9338)),
+Box(Box(9339)),
+Box(Box(9340)),
+Box(Box(9341)),
+Box(Box(9342)),
+Box(Box(9343)),
+Box(Box(9344)),
+Box(Box(9345)),
+Box(Box(9346)),
+Box(Box(9347)),
+Box(Box(9348)),
+Box(Box(9349)),
+Box(Box(9350)),
+Box(Box(9351)),
+Box(Box(9352)),
+Box(Box(9353)),
+Box(Box(9354)),
+Box(Box(9355)),
+Box(Box(9356)),
+Box(Box(9357)),
+Box(Box(9358)),
+Box(Box(9359)),
+Box(Box(9360)),
+Box(Box(9361)),
+Box(Box(9362)),
+Box(Box(9363)),
+Box(Box(9364)),
+Box(Box(9365)),
+Box(Box(9366)),
+Box(Box(9367)),
+Box(Box(9368)),
+Box(Box(9369)),
+Box(Box(9370)),
+Box(Box(9371)),
+Box(Box(9372)),
+Box(Box(9373)),
+Box(Box(9374)),
+Box(Box(9375)),
+Box(Box(9376)),
+Box(Box(9377)),
+Box(Box(9378)),
+Box(Box(9379)),
+Box(Box(9380)),
+Box(Box(9381)),
+Box(Box(9382)),
+Box(Box(9383)),
+Box(Box(9384)),
+Box(Box(9385)),
+Box(Box(9386)),
+Box(Box(9387)),
+Box(Box(9388)),
+Box(Box(9389)),
+Box(Box(9390)),
+Box(Box(9391)),
+Box(Box(9392)),
+Box(Box(9393)),
+Box(Box(9394)),
+Box(Box(9395)),
+Box(Box(9396)),
+Box(Box(9397)),
+Box(Box(9398)),
+Box(Box(9399)),
+Box(Box(9400)),
+Box(Box(9401)),
+Box(Box(9402)),
+Box(Box(9403)),
+Box(Box(9404)),
+Box(Box(9405)),
+Box(Box(9406)),
+Box(Box(9407)),
+Box(Box(9408)),
+Box(Box(9409)),
+Box(Box(9410)),
+Box(Box(9411)),
+Box(Box(9412)),
+Box(Box(9413)),
+Box(Box(9414)),
+Box(Box(9415)),
+Box(Box(9416)),
+Box(Box(9417)),
+Box(Box(9418)),
+Box(Box(9419)),
+Box(Box(9420)),
+Box(Box(9421)),
+Box(Box(9422)),
+Box(Box(9423)),
+Box(Box(9424)),
+Box(Box(9425)),
+Box(Box(9426)),
+Box(Box(9427)),
+Box(Box(9428)),
+Box(Box(9429)),
+Box(Box(9430)),
+Box(Box(9431)),
+Box(Box(9432)),
+Box(Box(9433)),
+Box(Box(9434)),
+Box(Box(9435)),
+Box(Box(9436)),
+Box(Box(9437)),
+Box(Box(9438)),
+Box(Box(9439)),
+Box(Box(9440)),
+Box(Box(9441)),
+Box(Box(9442)),
+Box(Box(9443)),
+Box(Box(9444)),
+Box(Box(9445)),
+Box(Box(9446)),
+Box(Box(9447)),
+Box(Box(9448)),
+Box(Box(9449)),
+Box(Box(9450)),
+Box(Box(9451)),
+Box(Box(9452)),
+Box(Box(9453)),
+Box(Box(9454)),
+Box(Box(9455)),
+Box(Box(9456)),
+Box(Box(9457)),
+Box(Box(9458)),
+Box(Box(9459)),
+Box(Box(9460)),
+Box(Box(9461)),
+Box(Box(9462)),
+Box(Box(9463)),
+Box(Box(9464)),
+Box(Box(9465)),
+Box(Box(9466)),
+Box(Box(9467)),
+Box(Box(9468)),
+Box(Box(9469)),
+Box(Box(9470)),
+Box(Box(9471)),
+Box(Box(9472)),
+Box(Box(9473)),
+Box(Box(9474)),
+Box(Box(9475)),
+Box(Box(9476)),
+Box(Box(9477)),
+Box(Box(9478)),
+Box(Box(9479)),
+Box(Box(9480)),
+Box(Box(9481)),
+Box(Box(9482)),
+Box(Box(9483)),
+Box(Box(9484)),
+Box(Box(9485)),
+Box(Box(9486)),
+Box(Box(9487)),
+Box(Box(9488)),
+Box(Box(9489)),
+Box(Box(9490)),
+Box(Box(9491)),
+Box(Box(9492)),
+Box(Box(9493)),
+Box(Box(9494)),
+Box(Box(9495)),
+Box(Box(9496)),
+Box(Box(9497)),
+Box(Box(9498)),
+Box(Box(9499)),
+Box(Box(9500)),
+Box(Box(9501)),
+Box(Box(9502)),
+Box(Box(9503)),
+Box(Box(9504)),
+Box(Box(9505)),
+Box(Box(9506)),
+Box(Box(9507)),
+Box(Box(9508)),
+Box(Box(9509)),
+Box(Box(9510)),
+Box(Box(9511)),
+Box(Box(9512)),
+Box(Box(9513)),
+Box(Box(9514)),
+Box(Box(9515)),
+Box(Box(9516)),
+Box(Box(9517)),
+Box(Box(9518)),
+Box(Box(9519)),
+Box(Box(9520)),
+Box(Box(9521)),
+Box(Box(9522)),
+Box(Box(9523)),
+Box(Box(9524)),
+Box(Box(9525)),
+Box(Box(9526)),
+Box(Box(9527)),
+Box(Box(9528)),
+Box(Box(9529)),
+Box(Box(9530)),
+Box(Box(9531)),
+Box(Box(9532)),
+Box(Box(9533)),
+Box(Box(9534)),
+Box(Box(9535)),
+Box(Box(9536)),
+Box(Box(9537)),
+Box(Box(9538)),
+Box(Box(9539)),
+Box(Box(9540)),
+Box(Box(9541)),
+Box(Box(9542)),
+Box(Box(9543)),
+Box(Box(9544)),
+Box(Box(9545)),
+Box(Box(9546)),
+Box(Box(9547)),
+Box(Box(9548)),
+Box(Box(9549)),
+Box(Box(9550)),
+Box(Box(9551)),
+Box(Box(9552)),
+Box(Box(9553)),
+Box(Box(9554)),
+Box(Box(9555)),
+Box(Box(9556)),
+Box(Box(9557)),
+Box(Box(9558)),
+Box(Box(9559)),
+Box(Box(9560)),
+Box(Box(9561)),
+Box(Box(9562)),
+Box(Box(9563)),
+Box(Box(9564)),
+Box(Box(9565)),
+Box(Box(9566)),
+Box(Box(9567)),
+Box(Box(9568)),
+Box(Box(9569)),
+Box(Box(9570)),
+Box(Box(9571)),
+Box(Box(9572)),
+Box(Box(9573)),
+Box(Box(9574)),
+Box(Box(9575)),
+Box(Box(9576)),
+Box(Box(9577)),
+Box(Box(9578)),
+Box(Box(9579)),
+Box(Box(9580)),
+Box(Box(9581)),
+Box(Box(9582)),
+Box(Box(9583)),
+Box(Box(9584)),
+Box(Box(9585)),
+Box(Box(9586)),
+Box(Box(9587)),
+Box(Box(9588)),
+Box(Box(9589)),
+Box(Box(9590)),
+Box(Box(9591)),
+Box(Box(9592)),
+Box(Box(9593)),
+Box(Box(9594)),
+Box(Box(9595)),
+Box(Box(9596)),
+Box(Box(9597)),
+Box(Box(9598)),
+Box(Box(9599)),
+Box(Box(9600)),
+Box(Box(9601)),
+Box(Box(9602)),
+Box(Box(9603)),
+Box(Box(9604)),
+Box(Box(9605)),
+Box(Box(9606)),
+Box(Box(9607)),
+Box(Box(9608)),
+Box(Box(9609)),
+Box(Box(9610)),
+Box(Box(9611)),
+Box(Box(9612)),
+Box(Box(9613)),
+Box(Box(9614)),
+Box(Box(9615)),
+Box(Box(9616)),
+Box(Box(9617)),
+Box(Box(9618)),
+Box(Box(9619)),
+Box(Box(9620)),
+Box(Box(9621)),
+Box(Box(9622)),
+Box(Box(9623)),
+Box(Box(9624)),
+Box(Box(9625)),
+Box(Box(9626)),
+Box(Box(9627)),
+Box(Box(9628)),
+Box(Box(9629)),
+Box(Box(9630)),
+Box(Box(9631)),
+Box(Box(9632)),
+Box(Box(9633)),
+Box(Box(9634)),
+Box(Box(9635)),
+Box(Box(9636)),
+Box(Box(9637)),
+Box(Box(9638)),
+Box(Box(9639)),
+Box(Box(9640)),
+Box(Box(9641)),
+Box(Box(9642)),
+Box(Box(9643)),
+Box(Box(9644)),
+Box(Box(9645)),
+Box(Box(9646)),
+Box(Box(9647)),
+Box(Box(9648)),
+Box(Box(9649)),
+Box(Box(9650)),
+Box(Box(9651)),
+Box(Box(9652)),
+Box(Box(9653)),
+Box(Box(9654)),
+Box(Box(9655)),
+Box(Box(9656)),
+Box(Box(9657)),
+Box(Box(9658)),
+Box(Box(9659)),
+Box(Box(9660)),
+Box(Box(9661)),
+Box(Box(9662)),
+Box(Box(9663)),
+Box(Box(9664)),
+Box(Box(9665)),
+Box(Box(9666)),
+Box(Box(9667)),
+Box(Box(9668)),
+Box(Box(9669)),
+Box(Box(9670)),
+Box(Box(9671)),
+Box(Box(9672)),
+Box(Box(9673)),
+Box(Box(9674)),
+Box(Box(9675)),
+Box(Box(9676)),
+Box(Box(9677)),
+Box(Box(9678)),
+Box(Box(9679)),
+Box(Box(9680)),
+Box(Box(9681)),
+Box(Box(9682)),
+Box(Box(9683)),
+Box(Box(9684)),
+Box(Box(9685)),
+Box(Box(9686)),
+Box(Box(9687)),
+Box(Box(9688)),
+Box(Box(9689)),
+Box(Box(9690)),
+Box(Box(9691)),
+Box(Box(9692)),
+Box(Box(9693)),
+Box(Box(9694)),
+Box(Box(9695)),
+Box(Box(9696)),
+Box(Box(9697)),
+Box(Box(9698)),
+Box(Box(9699)),
+Box(Box(9700)),
+Box(Box(9701)),
+Box(Box(9702)),
+Box(Box(9703)),
+Box(Box(9704)),
+Box(Box(9705)),
+Box(Box(9706)),
+Box(Box(9707)),
+Box(Box(9708)),
+Box(Box(9709)),
+Box(Box(9710)),
+Box(Box(9711)),
+Box(Box(9712)),
+Box(Box(9713)),
+Box(Box(9714)),
+Box(Box(9715)),
+Box(Box(9716)),
+Box(Box(9717)),
+Box(Box(9718)),
+Box(Box(9719)),
+Box(Box(9720)),
+Box(Box(9721)),
+Box(Box(9722)),
+Box(Box(9723)),
+Box(Box(9724)),
+Box(Box(9725)),
+Box(Box(9726)),
+Box(Box(9727)),
+Box(Box(9728)),
+Box(Box(9729)),
+Box(Box(9730)),
+Box(Box(9731)),
+Box(Box(9732)),
+Box(Box(9733)),
+Box(Box(9734)),
+Box(Box(9735)),
+Box(Box(9736)),
+Box(Box(9737)),
+Box(Box(9738)),
+Box(Box(9739)),
+Box(Box(9740)),
+Box(Box(9741)),
+Box(Box(9742)),
+Box(Box(9743)),
+Box(Box(9744)),
+Box(Box(9745)),
+Box(Box(9746)),
+Box(Box(9747)),
+Box(Box(9748)),
+Box(Box(9749)),
+Box(Box(9750)),
+Box(Box(9751)),
+Box(Box(9752)),
+Box(Box(9753)),
+Box(Box(9754)),
+Box(Box(9755)),
+Box(Box(9756)),
+Box(Box(9757)),
+Box(Box(9758)),
+Box(Box(9759)),
+Box(Box(9760)),
+Box(Box(9761)),
+Box(Box(9762)),
+Box(Box(9763)),
+Box(Box(9764)),
+Box(Box(9765)),
+Box(Box(9766)),
+Box(Box(9767)),
+Box(Box(9768)),
+Box(Box(9769)),
+Box(Box(9770)),
+Box(Box(9771)),
+Box(Box(9772)),
+Box(Box(9773)),
+Box(Box(9774)),
+Box(Box(9775)),
+Box(Box(9776)),
+Box(Box(9777)),
+Box(Box(9778)),
+Box(Box(9779)),
+Box(Box(9780)),
+Box(Box(9781)),
+Box(Box(9782)),
+Box(Box(9783)),
+Box(Box(9784)),
+Box(Box(9785)),
+Box(Box(9786)),
+Box(Box(9787)),
+Box(Box(9788)),
+Box(Box(9789)),
+Box(Box(9790)),
+Box(Box(9791)),
+Box(Box(9792)),
+Box(Box(9793)),
+Box(Box(9794)),
+Box(Box(9795)),
+Box(Box(9796)),
+Box(Box(9797)),
+Box(Box(9798)),
+Box(Box(9799)),
+Box(Box(9800)),
+Box(Box(9801)),
+Box(Box(9802)),
+Box(Box(9803)),
+Box(Box(9804)),
+Box(Box(9805)),
+Box(Box(9806)),
+Box(Box(9807)),
+Box(Box(9808)),
+Box(Box(9809)),
+Box(Box(9810)),
+Box(Box(9811)),
+Box(Box(9812)),
+Box(Box(9813)),
+Box(Box(9814)),
+Box(Box(9815)),
+Box(Box(9816)),
+Box(Box(9817)),
+Box(Box(9818)),
+Box(Box(9819)),
+Box(Box(9820)),
+Box(Box(9821)),
+Box(Box(9822)),
+Box(Box(9823)),
+Box(Box(9824)),
+Box(Box(9825)),
+Box(Box(9826)),
+Box(Box(9827)),
+Box(Box(9828)),
+Box(Box(9829)),
+Box(Box(9830)),
+Box(Box(9831)),
+Box(Box(9832)),
+Box(Box(9833)),
+Box(Box(9834)),
+Box(Box(9835)),
+Box(Box(9836)),
+Box(Box(9837)),
+Box(Box(9838)),
+Box(Box(9839)),
+Box(Box(9840)),
+Box(Box(9841)),
+Box(Box(9842)),
+Box(Box(9843)),
+Box(Box(9844)),
+Box(Box(9845)),
+Box(Box(9846)),
+Box(Box(9847)),
+Box(Box(9848)),
+Box(Box(9849)),
+Box(Box(9850)),
+Box(Box(9851)),
+Box(Box(9852)),
+Box(Box(9853)),
+Box(Box(9854)),
+Box(Box(9855)),
+Box(Box(9856)),
+Box(Box(9857)),
+Box(Box(9858)),
+Box(Box(9859)),
+Box(Box(9860)),
+Box(Box(9861)),
+Box(Box(9862)),
+Box(Box(9863)),
+Box(Box(9864)),
+Box(Box(9865)),
+Box(Box(9866)),
+Box(Box(9867)),
+Box(Box(9868)),
+Box(Box(9869)),
+Box(Box(9870)),
+Box(Box(9871)),
+Box(Box(9872)),
+Box(Box(9873)),
+Box(Box(9874)),
+Box(Box(9875)),
+Box(Box(9876)),
+Box(Box(9877)),
+Box(Box(9878)),
+Box(Box(9879)),
+Box(Box(9880)),
+Box(Box(9881)),
+Box(Box(9882)),
+Box(Box(9883)),
+Box(Box(9884)),
+Box(Box(9885)),
+Box(Box(9886)),
+Box(Box(9887)),
+Box(Box(9888)),
+Box(Box(9889)),
+Box(Box(9890)),
+Box(Box(9891)),
+Box(Box(9892)),
+Box(Box(9893)),
+Box(Box(9894)),
+Box(Box(9895)),
+Box(Box(9896)),
+Box(Box(9897)),
+Box(Box(9898)),
+Box(Box(9899)),
+Box(Box(9900)),
+Box(Box(9901)),
+Box(Box(9902)),
+Box(Box(9903)),
+Box(Box(9904)),
+Box(Box(9905)),
+Box(Box(9906)),
+Box(Box(9907)),
+Box(Box(9908)),
+Box(Box(9909)),
+Box(Box(9910)),
+Box(Box(9911)),
+Box(Box(9912)),
+Box(Box(9913)),
+Box(Box(9914)),
+Box(Box(9915)),
+Box(Box(9916)),
+Box(Box(9917)),
+Box(Box(9918)),
+Box(Box(9919)),
+Box(Box(9920)),
+Box(Box(9921)),
+Box(Box(9922)),
+Box(Box(9923)),
+Box(Box(9924)),
+Box(Box(9925)),
+Box(Box(9926)),
+Box(Box(9927)),
+Box(Box(9928)),
+Box(Box(9929)),
+Box(Box(9930)),
+Box(Box(9931)),
+Box(Box(9932)),
+Box(Box(9933)),
+Box(Box(9934)),
+Box(Box(9935)),
+Box(Box(9936)),
+Box(Box(9937)),
+Box(Box(9938)),
+Box(Box(9939)),
+Box(Box(9940)),
+Box(Box(9941)),
+Box(Box(9942)),
+Box(Box(9943)),
+Box(Box(9944)),
+Box(Box(9945)),
+Box(Box(9946)),
+Box(Box(9947)),
+Box(Box(9948)),
+Box(Box(9949)),
+Box(Box(9950)),
+Box(Box(9951)),
+Box(Box(9952)),
+Box(Box(9953)),
+Box(Box(9954)),
+Box(Box(9955)),
+Box(Box(9956)),
+Box(Box(9957)),
+Box(Box(9958)),
+Box(Box(9959)),
+Box(Box(9960)),
+Box(Box(9961)),
+Box(Box(9962)),
+Box(Box(9963)),
+Box(Box(9964)),
+Box(Box(9965)),
+Box(Box(9966)),
+Box(Box(9967)),
+Box(Box(9968)),
+Box(Box(9969)),
+Box(Box(9970)),
+Box(Box(9971)),
+Box(Box(9972)),
+Box(Box(9973)),
+Box(Box(9974)),
+Box(Box(9975)),
+Box(Box(9976)),
+Box(Box(9977)),
+Box(Box(9978)),
+Box(Box(9979)),
+Box(Box(9980)),
+Box(Box(9981)),
+Box(Box(9982)),
+Box(Box(9983)),
+Box(Box(9984)),
+Box(Box(9985)),
+Box(Box(9986)),
+Box(Box(9987)),
+Box(Box(9988)),
+Box(Box(9989)),
+Box(Box(9990)),
+Box(Box(9991)),
+Box(Box(9992)),
+Box(Box(9993)),
+Box(Box(9994)),
+Box(Box(9995)),
+Box(Box(9996)),
+Box(Box(9997)),
+Box(Box(9998)),
+Box(Box(9999)),
+];
+
+confuse(x) {
+  try { throw x; } catch (e) { return e; }
+}
+
+main() {
+  if (!identical(confuse(list1), confuse(list2))) {
+    throw new Exception("list1 !== list2");
+  }
+}
diff --git a/tests/language_2/conditional_rewrite_test.dart b/tests/language_2/conditional_rewrite_test.dart
deleted file mode 100644
index 69a6398..0000000
--- a/tests/language_2/conditional_rewrite_test.dart
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "package:expect/expect.dart";
-
-// Test that dart2js does not rewrite conditional into logical operators
-// in cases where it changes which falsy value is returned.
-
-posFalse(x, y) => x != null ? y : false;
-negFalse(x, y) => x != null ? !y : false;
-posNull(x, y) => x != null ? y : null;
-negNull(x, y) => x != null ? !y : null;
-
-main() {
-  bool isCheckedMode = false;
-  assert((isCheckedMode = true));
-
-  Expect.equals(false, posFalse(null, false));
-  Expect.equals(false, negFalse(null, false));
-  Expect.equals(null, posNull(null, false));
-  Expect.equals(null, negNull(null, false));
-
-  Expect.equals(false, posFalse(null, true));
-  Expect.equals(false, negFalse(null, true));
-  Expect.equals(null, posNull(null, true));
-  Expect.equals(null, negNull(null, true));
-
-  Expect.equals(false, posFalse([], false));
-  Expect.equals(true, negFalse([], false));
-  Expect.equals(false, posNull([], false));
-  Expect.equals(true, negNull([], false));
-
-  Expect.equals(true, posFalse([], true));
-  Expect.equals(false, negFalse([], true));
-  Expect.equals(true, posNull([], true));
-  Expect.equals(false, negNull([], true));
-
-  if (!isCheckedMode) {
-    Expect.equals(null, posFalse([], null));
-    Expect.equals(true, negFalse([], null));
-    Expect.equals(null, posNull([], null));
-    Expect.equals(true, negNull([], null));
-
-    var y = {};
-    Expect.identical(y, posFalse([], y));
-    Expect.equals(true, negFalse([], y));
-    Expect.identical(y, posNull([], y));
-    Expect.equals(true, negNull([], y));
-  }
-}
diff --git a/tests/language_2/constructor12_test.dart b/tests/language_2/constructor12_test.dart
index 397cb19..3aa1289d 100644
--- a/tests/language_2/constructor12_test.dart
+++ b/tests/language_2/constructor12_test.dart
@@ -19,7 +19,7 @@
   A(p)
       : captured = (() => p),
         super(p++) {
-    // Make non-inlinable.
+    // Make constructor body non-inlinable.
     try {} catch (e) {}
 
     captured2 = () => p++;
@@ -49,8 +49,9 @@
   Expect.equals(3, b.z);
   Expect.isTrue(a is A<int>);
   Expect.isFalse(a is A<String>);
-  Expect.isTrue(a2 is A<int>);
-  Expect.isTrue(a2 is A<String>);
+  Expect.isFalse(a2 is A<int>);
+  Expect.isFalse(a2 is A<String>);
+  Expect.isTrue(a2 is A<Object>);
   Expect.equals(2, a.bar());
   Expect.equals(3, a2.bar());
   Expect.equals(3, a.foo());
@@ -61,7 +62,7 @@
   Expect.equals(1, a.typedList.length);
   Expect.equals(0, a2.typedList.length);
   Expect.isTrue(a.typedList is List<int>);
-  Expect.isTrue(a2.typedList is List<int>);
+  Expect.isFalse(a2.typedList is List<int>);
   Expect.isFalse(a.typedList is List<String>);
-  Expect.isTrue(a2.typedList is List<String>);
+  Expect.isFalse(a2.typedList is List<String>);
 }
diff --git a/tests/language_2/control_flow_collections/if_const_syntax_error_test.dart b/tests/language_2/control_flow_collections/if_const_syntax_error_test.dart
deleted file mode 100644
index 86cb887..0000000
--- a/tests/language_2/control_flow_collections/if_const_syntax_error_test.dart
+++ /dev/null
@@ -1,18 +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.
-
-// Check that 'if' in const collections is not enabled without the experimental
-// constant-update-2018 flag.
-
-// SharedOptions=--enable-experiment=no-constant-update-2018
-
-void main() {
-  // If cannot be used in a const collection.
-  const _ = [if (true) 1]; //# 00: compile-time error
-  const _ = [if (false) 1 else 2]; //# 01: compile-time error
-  const _ = {if (true) 1}; //# 02: compile-time error
-  const _ = {if (false) 1 else 2}; //# 03: compile-time error
-  const _ = {if (true) 1: 1}; //# 04: compile-time error
-  const _ = {if (false) 1: 1 else 2: 2}; //# 05: compile-time error
-}
diff --git a/tests/language_2/ct_const_test.dart b/tests/language_2/ct_const_test.dart
index 9e13145..defab06 100644
--- a/tests/language_2/ct_const_test.dart
+++ b/tests/language_2/ct_const_test.dart
@@ -1,7 +1,9 @@
 // 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.
-// All things regarding compile time constant expressions.
+
+// Test of apparent compile-time nature of constant evaluation. Constant Lists,
+// Maps and other objects should be identical independent of formation.
 
 import "package:expect/expect.dart";
 
@@ -70,7 +72,9 @@
     Expect.equals(true, identical(l1, l2));
 
     final evenNumbers = const <int>[2, 2 * 2, 2 * 3, 2 * 4, 2 * 5];
-    Expect.equals(true, !identical(evenNumbers, const [2, 4, 6, 8, 10]));
+    Expect.equals(true, identical(evenNumbers, const <int>[2, 4, 6, 8, 10]));
+    Expect.equals(
+        true, !identical(evenNumbers, const <dynamic>[2, 4, 6, 8, 10]));
 
     final c11dGermany1 = const {"black": 1, "red": 2, "yellow": 3};
     Expect.equals(true,
diff --git a/tests/language_2/expect_test.dart b/tests/language_2/expect_test.dart
index 48b1a35..c2d871e 100644
--- a/tests/language_2/expect_test.dart
+++ b/tests/language_2/expect_test.dart
@@ -9,7 +9,7 @@
   static testEquals(a) {
     try {
       Expect.equals("AB", a, "within testEquals");
-    } on Exception catch (msg) {
+    } on ExpectException catch (msg) {
       print(msg);
       return;
     }
@@ -20,7 +20,7 @@
   static testIsTrue(f) {
     try {
       Expect.isTrue(f);
-    } on Exception catch (msg) {
+    } on ExpectException catch (msg) {
       print(msg);
       return;
     }
@@ -31,7 +31,7 @@
   static testIsFalse(t) {
     try {
       Expect.isFalse(t);
-    } on Exception catch (msg) {
+    } on ExpectException catch (msg) {
       print(msg);
       return;
     }
@@ -43,7 +43,7 @@
     var ab = "${a}B";
     try {
       Expect.identical("AB", ab);
-    } on Exception catch (msg) {
+    } on ExpectException catch (msg) {
       print(msg);
       return;
     }
@@ -54,7 +54,7 @@
   static testFail() {
     try {
       Expect.fail("fail now");
-    } on Exception catch (msg) {
+    } on ExpectException catch (msg) {
       print(msg);
       return;
     }
diff --git a/tests/language_2/extension_methods/basic_static_extension_test.dart b/tests/language_2/extension_methods/basic_static_extension_test.dart
new file mode 100644
index 0000000..ce4fb5f
--- /dev/null
+++ b/tests/language_2/extension_methods/basic_static_extension_test.dart
@@ -0,0 +1,124 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+// Tests the syntax of extension methods, and that the extensions are
+// invocable, and that type variables are bound correctly.
+
+// There are no extension *conflicts*.
+// For each invocation,  there is exactly one extension member in scope
+// which applies.
+
+// Target types.
+class Unnamed {}
+
+class Named {}
+
+class UnnamedGeneric<T> {}
+
+class NamedGeneric<T> {}
+
+String str(String name, Object object) =>
+    "$name(${object == null ? "null" : "non-null"})";
+
+// Unnamed local extension.
+extension on Unnamed {
+  String get name => str("unnamed", this);
+}
+
+extension NamedExt on Named {
+  String get name => str("named", this);
+}
+
+extension<T> on UnnamedGeneric<T> {
+  String get name => str("unnamed generic", this);
+  List<T> get list => <T>[];
+}
+
+extension NamedGenericExt<T> on NamedGeneric<T> {
+  String get name => str("named generic", this);
+  List<T> get list => <T>[];
+}
+
+extension General on Object {
+  String get generalName => str("general", this);
+}
+
+extension GeneralGeneric<T> on T {
+  String get generalGenericName => str("general generic", this);
+  List<T> get generalList => <T>[];
+}
+
+main() {
+  // Unnamed.
+  Unnamed unnamed = Unnamed();
+  Unnamed unnamedNull = null;
+
+  Expect.equals("unnamed(non-null)", unnamed.name);
+  Expect.equals("unnamed(null)", unnamedNull.name);
+
+  Expect.equals("general(non-null)", unnamed.generalName);
+  Expect.equals("general(null)", unnamedNull.generalName);
+
+  Expect.equals("general generic(non-null)", unnamed.generalGenericName);
+  Expect.equals("general generic(null)", unnamedNull.generalGenericName);
+  Expect.type<List<Unnamed>>(unnamed.generalList);
+  Expect.type<List<Unnamed>>(unnamedNull.generalList);
+
+  // Named.
+  Named named = Named();
+  Named namedNull = null;
+
+  Expect.equals("named(non-null)", named.name);
+  Expect.equals("named(null)", namedNull.name);
+
+  Expect.equals("general(non-null)", named.generalName);
+  Expect.equals("general(null)", namedNull.generalName);
+
+  Expect.equals("general generic(non-null)", named.generalGenericName);
+  Expect.equals("general generic(null)", namedNull.generalGenericName);
+  Expect.type<List<Named>>(named.generalList);
+  Expect.type<List<Named>>(namedNull.generalList);
+
+  // Unnamed Generic.
+  UnnamedGeneric<num> unnamedGeneric = UnnamedGeneric<int>();
+  UnnamedGeneric<num> unnamedGenericNull = null;
+
+  Expect.equals("unnamed generic(non-null)", unnamedGeneric.name);
+  Expect.equals("unnamed generic(null)", unnamedGeneric.name);
+  Expect.type<List<num>>(unnamedGeneric.list);
+  Expect.notType<List<int>>(unnamedGeneric.list);
+  Expect.type<List<num>>(unnamedGenericNull.list);
+  Expect.notType<List<int>>(unnamedGenericNull.list);
+
+  Expect.equals("general(non-null)", unnamedGeneric.generalName);
+  Expect.equals("general(null)", unnamedGenericNull.generalName);
+
+  Expect.equals("general generic(non-null)", unnamedGeneric.generalGenericName);
+  Expect.equals("general generic(null)", unnamedGenericNull.generalGenericName);
+  Expect.type<List<UnnamedGeneric<num>>>(unnamedGeneric.generalList);
+  Expect.type<List<UnnamedGeneric<num>>>(unnamedGenericNull.generalList);
+
+  // Named Generic.
+  NamedGeneric<num> namedGeneric = NamedGeneric<int>();
+  NamedGeneric<num> namedGenericNull = null;
+
+  Expect.equals("named generic(non-null)", namedGeneric.name);
+  Expect.equals("named generic(null)", namedGenericNull.name);
+  Expect.type<List<num>>(namedGeneric.list);
+  Expect.notType<List<int>>(namedGeneric.list);
+  Expect.type<List<num>>(namedGenericNull.list);
+  Expect.notType<List<int>>(namedGenericNull.list);
+
+  Expect.equals("general(non-null)", namedGeneric.generalName);
+  Expect.equals("general(null)", namedGenericNull.generalName);
+
+  Expect.equals("general generic(non-null)", namedGeneric.generalGenericName);
+  Expect.equals("general generic(null)", namedGenericNull.generalGenericName);
+  Expect.type<List<NamedGeneric<num>>>(namedGeneric.generalList);
+  Expect.type<List<NamedGeneric<num>>>(namedGenericNull.generalList);
+}
diff --git a/tests/language_2/extension_methods/helpers/class_no_shadow.dart b/tests/language_2/extension_methods/helpers/class_no_shadow.dart
new file mode 100644
index 0000000..efc929a
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/class_no_shadow.dart
@@ -0,0 +1,23 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+const String instanceValue = "1";
+
+void checkInstanceValue(String other) {
+  Expect.equals(other, instanceValue);
+}
+
+// A class which has only its own instance methods
+class A {
+  String fieldInInstanceScope = instanceValue;
+  String get getterInInstanceScope => instanceValue;
+  set setterInInstanceScope(String x) {
+    checkInstanceValue(x);
+  }
+  String methodInInstanceScope() => instanceValue;
+}
diff --git a/tests/language_2/extension_methods/helpers/class_shadow.dart b/tests/language_2/extension_methods/helpers/class_shadow.dart
new file mode 100644
index 0000000..90bd522
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/class_shadow.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+import "class_no_shadow.dart";
+
+// A class which has its own instance methods, which also
+// shadows the global scope
+class AGlobal extends A {
+
+  String fieldInGlobalScope = instanceValue;
+  String get getterInGlobalScope => instanceValue;
+  set setterInGlobalScope(String x) {
+    checkInstanceValue(x);
+  }
+  String methodInGlobalScope() => instanceValue;
+}
diff --git a/tests/language_2/extension_methods/helpers/extension_all.dart b/tests/language_2/extension_methods/helpers/extension_all.dart
new file mode 100644
index 0000000..1154462
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/extension_all.dart
@@ -0,0 +1,46 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+import "class_no_shadow.dart";
+
+const double otherExtensionValue = 1.234;
+
+void checkOtherExtensionValue(double other) {
+  Expect.equals(other, otherExtensionValue);
+}
+
+// An extension which defines all symbols
+extension ExtraExt on A {
+  double get fieldInGlobalScope => otherExtensionValue;
+  double get getterInGlobalScope => otherExtensionValue;
+  set setterInGlobalScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInGlobalScope() => otherExtensionValue;
+
+  double get fieldInInstanceScope => otherExtensionValue;
+  double get getterInInstanceScope => otherExtensionValue;
+  set setterInInstanceScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInInstanceScope() => otherExtensionValue;
+
+  double get fieldInExtensionScope => otherExtensionValue;
+  double get getterInExtensionScope => otherExtensionValue;
+  set setterInExtensionScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInExtensionScope() => otherExtensionValue;
+
+  double get fieldInOtherExtensionScope => otherExtensionValue;
+  double get getterInOtherExtensionScope => otherExtensionValue;
+  set setterInOtherExtensionScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInOtherExtensionScope() => otherExtensionValue;
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/helpers/extension_global_instance.dart b/tests/language_2/extension_methods/helpers/extension_global_instance.dart
new file mode 100644
index 0000000..a874be0
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/extension_global_instance.dart
@@ -0,0 +1,39 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+import "class_no_shadow.dart";
+
+const double otherExtensionValue = 1.234;
+
+void checkOtherExtensionValue(double other) {
+  Expect.equals(other, otherExtensionValue);
+}
+
+// An extension which defines only global, instance and its own symbols
+extension ExtraExt on A {
+  double get fieldInGlobalScope => otherExtensionValue;
+  double get getterInGlobalScope => otherExtensionValue;
+  set setterInGlobalScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInGlobalScope() => otherExtensionValue;
+
+  double get fieldInInstanceScope => otherExtensionValue;
+  double get getterInInstanceScope => otherExtensionValue;
+  set setterInInstanceScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInInstanceScope() => otherExtensionValue;
+
+  double get fieldInOtherExtensionScope => otherExtensionValue;
+  double get getterInOtherExtensionScope => otherExtensionValue;
+  set setterInOtherExtensionScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInOtherExtensionScope() => otherExtensionValue;
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/helpers/extension_only.dart b/tests/language_2/extension_methods/helpers/extension_only.dart
new file mode 100644
index 0000000..fdf55ef
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/extension_only.dart
@@ -0,0 +1,25 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+import "class_no_shadow.dart";
+
+const double otherExtensionValue = 1.234;
+
+void checkOtherExtensionValue(double other) {
+  Expect.equals(other, otherExtensionValue);
+}
+
+// An extension which defines only its own symbols
+extension ExtraExt on A {
+  double get fieldInOtherExtensionScope => otherExtensionValue;
+  double get getterInOtherExtensionScope => otherExtensionValue;
+  set setterInOtherExtensionScope(double x) {
+    checkOtherExtensionValue(x);
+  }
+  double methodInOtherExtensionScope() => otherExtensionValue;
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/helpers/global_scope.dart b/tests/language_2/extension_methods/helpers/global_scope.dart
new file mode 100644
index 0000000..6c98097
--- /dev/null
+++ b/tests/language_2/extension_methods/helpers/global_scope.dart
@@ -0,0 +1,21 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+const int globalValue = 0;
+
+void checkGlobalValue(int x) {
+  Expect.equals(x, globalValue);
+}
+
+// Add symbols to the global scope
+int fieldInGlobalScope = globalValue;
+int get getterInGlobalScope => globalValue;
+set setterInGlobalScope(int x) {
+  checkGlobalValue(x);
+}
+int methodInGlobalScope() => globalValue;
diff --git a/tests/language_2/extension_methods/static_extension_bounds_error_test.dart b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
new file mode 100644
index 0000000..5ee6ce1
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_bounds_error_test.dart
@@ -0,0 +1,135 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests bounds checking for extension methods
+
+extension E1<T extends num> on T {
+  int get e1 => 1;
+}
+
+extension E2<T extends S, S extends num> on T {
+  int get e2 => 2;
+}
+
+extension E3<T> on T {
+  S f3<S extends T>(S x) => x;
+}
+
+extension E4<T extends Rec<T>> on T {
+  int get e4 => 4;
+}
+
+class Rec<T extends Rec<T>> {}
+
+class RecSolution extends Rec<RecSolution> {}
+
+
+void main() {
+  String s = "s";
+  int i = 0;
+  double d = 1.0;
+
+  // Inferred type of String does not satisfy the bound.
+  s.e1;
+//  ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E1(s).e1;
+//      ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E1<String>(s).e1;
+//              ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+  // Inferred types of int and double are ok
+  i.e1;
+  E1(i).e1;
+  E1<int>(i).e1;
+  d.e1;
+  E1(d).e1;
+  E1<double>(d).e1;
+
+  // Inferred type of String does not satisfy the bound.
+  s.e2;
+//  ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E2(s).e2;
+//      ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E2<String, num>(s).e2;
+//                   ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+  // Inferred types of int and double are ok
+  i.e2;
+  E2(i).e2;
+  E2<int, num>(i).e2;
+  d.e2;
+  E2(d).e2;
+  E2<double, num>(d).e2;
+
+  // Inferred type int for method type parameter doesn't match the inferred
+  // bound of String
+  s.f3(3);
+//  ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E3(s).f3(3);
+//      ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E3<String>(s).f3(3);
+//              ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+  // Inferred type int for method type parameter is ok
+  i.f3(3);
+  E3(i).f3(3);
+  E3<int>(i).f3(3);
+
+  // Inferred type int for method type parameter doesn't match the inferred
+  // bound of double
+  d.f3(3);
+//  ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E3(d).f3(3);
+//      ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E3<double>(d).f3(3);
+//              ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+
+  RecSolution recs = RecSolution();
+  Rec<dynamic> superRec = RecSolution(); // Super-bounded type.
+
+  // Inferred type of RecSolution is ok
+  recs.e4;
+  E4(recs).e4;
+  E4<RecSolution>(recs).e4;
+
+  // Inferred super-bounded type is invalid as type argument
+  superRec.e4;
+//         ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E4(superRec).e4;
+//             ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+  E4<Rec<dynamic>>(superRec).e4;
+//                           ^^
+// [analyzer] unspecified
+// [cfe] unspecified
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_getter_setter_test.dart b/tests/language_2/extension_methods/static_extension_getter_setter_test.dart
new file mode 100644
index 0000000..8358a18
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_getter_setter_test.dart
@@ -0,0 +1,147 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests interactions between getters and setters where one or both is defined
+// by an extension.
+
+import "package:expect/expect.dart";
+
+main() {
+  C c = C();
+  // v1: C get, C set
+  expectGet("C.v1", c.v1);
+  expectSet("C.v1=1", c.v1 = Result("1"));
+  // v2: C get, E1 set
+  expectGet("C.v2", c.v2);
+  expectSet("E1.v2=2", c.v2 = Result("2"));
+  // v3: E1 get, C set
+  expectGet("E1.v3", c.v3);
+  expectSet("C.v3=3", c.v3 = Result("3"));
+  // v4: E1 get, E1 set
+  expectGet("E1.v4", c.v4);
+  expectSet("E1.v4=4", c.v4 = Result("4"));
+  // v5: E1 get, E2 set
+  expectGet("E1.v5", c.v5);
+  expectSet("E2.v5=5", c.v5 = Result("5"));
+
+  expectSet("C.v1=C.v1+1", c.v1++);
+  expectSet("E1.v2=C.v2+1", c.v2++);
+  expectSet("C.v3=E1.v3+1", c.v3++);
+  expectSet("E1.v4=E1.v4+1", c.v4++);
+  expectSet("E2.v5=E1.v5+1", c.v5++);
+
+  expectSet("C.v1=C.v1+a", c.v1 += "a");
+  expectSet("C.v1=C.v1-b", c.v1 -= "b");
+
+  // Cascades work.
+  expectSet(
+      "E1.v4=E2.v4+[C.v1=[E1.v2=a]]",
+      c
+        ..v2 = Result("a")
+        ..v1 = Result("[$lastSetter]")
+        ..v4 += Result("[$lastSetter]"));
+
+  // Override used by all accesses of read/write operations
+  expectSet("E1.v1=E1.v1+1", E1(c).v1++);
+  expectSet("E1.v2=E1.v2+1", E1(c).v2++);
+  expectSet("E1.v3=E1.v3+1", E1(c).v3++);
+  // Same using `+= 1` instead of `++`.
+  expectSet("E1.v1=E1.v1+1", E1(c).v1 += 1);
+  expectSet("E1.v2=E1.v2+1", E1(c).v2 += 1);
+  expectSet("E1.v3=E1.v3+1", E1(c).v3 += 1);
+  // Same fully expanded.
+  expectSet("E1.v1=E1.v1+1", E1(c).v1 = E1(c).v1 + 1);
+  expectSet("E1.v2=E1.v2+1", E1(c).v2 = E1(c).v2 + 1);
+  expectSet("E1.v3=E1.v3+1", E1(c).v3 = E1(c).v3 + 1);
+}
+
+/// Expect the value of [result] to be the [expected] string
+expectGet(String expected, Result result) {
+  Expect.equals(expected, result.value);
+}
+
+/// Expect the [lastSetter] value set by evaluating [assignment] to be
+/// [expected].
+expectSet(String expected, void assignment) {
+  Expect.equals(expected, lastSetter);
+}
+
+/// Last value passed to any of our tested setters.
+String lastSetter = null;
+
+/// A type which supports a `+` operation accepting `int`,
+/// so we can test `+=` and `++`.
+class Result {
+  final String value;
+  Result(this.value);
+  Result operator +(Object o) => Result("$value+$o");
+  Result operator -(Object o) => Result("$value-$o");
+  String toString() => value;
+}
+
+/// Target type for extensions.
+///
+/// Declares [v1] getter and setter, [v2] getter and [v3] setter.
+class C {
+  Result get v1 => Result("C.v1");
+  void set v1(Result value) {
+    lastSetter = "C.v1=$value";
+  }
+
+  Result get v2 => Result("C.v2");
+
+  void set v3(Result value) {
+    lastSetter = "C.v3=$value";
+  }
+}
+
+/// Primary extension on [C].
+///
+/// Declares [v1], [v2] and [v3] getters and setters.
+///
+/// Declares [v4] getter and setter, and [v5] getter
+/// which are supplemented by a setter from the [E2] extension.
+extension E1 on C {
+  // Overlaps with C on both.
+  Result get v1 => Result("E1.v1");
+
+  void set v1(Result value) {
+    lastSetter = "E1.v1=$value";
+  }
+
+  // Overlaps with C on getter.
+  Result get v2 => Result("E1.v2");
+
+  void set v2(Result value) {
+    lastSetter = "E1.v2=$value";
+  }
+
+  // Overlaps with C on setter.
+  Result get v3 => Result("E1.v3");
+
+  void set v3(Result value) {
+    lastSetter = "E1.v3=$value";
+  }
+
+  // Overlaps with nothing.
+  Result get v4 => Result("E1.v4");
+  void set v4(Result value) {
+    lastSetter = "E1.v4=$value";
+  }
+
+  // Combines with E2 setter.
+  Result get v5 => Result("E1.v5");
+}
+
+/// A different extension than [E1] on [C].
+///
+/// Declares [v5] setter.
+/// Together with [E1], this defined both getter and setter.
+extension E2 on C {
+  void set v5(Result value) {
+    lastSetter = "E2.v5=$value";
+  }
+}
diff --git a/tests/language_2/extension_methods/static_extension_inference_test.dart b/tests/language_2/extension_methods/static_extension_inference_test.dart
new file mode 100644
index 0000000..98fc240
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_inference_test.dart
@@ -0,0 +1,184 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests extension method resolution type inference.
+
+import "package:expect/expect.dart";
+
+void main() {
+  List<num> numList = <int>[];
+  // Inference of E1(numList), implicit or explicit, is the same as
+  // for C1(numList), which infers `num`.
+  var numListInstance1 = C1<num>(numList);
+
+  Expect.type<List<num>>(numList.argList1);
+  sameType(numListInstance1.argDynList1, numList.argDynList1);
+  sameType(numListInstance1.selfList1, numList.selfList1);
+
+  Expect.type<List<num>>(E1(numList).argList1);
+  sameType(numListInstance1.argDynList1, E1(numList).argDynList1);
+  sameType(numListInstance1.selfList1, E1(numList).selfList1);
+
+  var numListInstance2 = C2<List<num>>(numList);
+
+  Expect.type<List<List<num>>>(numList.argList2);
+  sameType(numListInstance2.argDynList2, numList.argDynList2);
+  sameType(numListInstance2.selfList2, numList.selfList2);
+
+  Expect.type<List<List<num>>>(E2(numList).argList2);
+  sameType(numListInstance2.argDynList2, E2(numList).argDynList2);
+  sameType(numListInstance2.selfList2, E2(numList).selfList2);
+
+  Pair<int, double> pair = Pair(1, 2.5);
+  var pairInstance3 = C3<int, double>(pair);
+
+  Expect.type<List<int>>(pair.argList3);
+  Expect.type<List<double>>(pair.arg2List3);
+  sameType(pairInstance3.argDynList3, pair.argDynList3);
+  sameType(pairInstance3.arg2DynList3, pair.arg2DynList3);
+  sameType(pairInstance3.selfList3, pair.selfList3);
+
+  Expect.type<List<int>>(E3(pair).argList3);
+  Expect.type<List<double>>(E3(pair).arg2List3);
+  sameType(pairInstance3.argDynList3, E3(pair).argDynList3);
+  sameType(pairInstance3.arg2DynList3, E3(pair).arg2DynList3);
+  sameType(pairInstance3.selfList3, E3(pair).selfList3);
+
+  var pairInstance4 = C4<num>(pair);
+
+  Expect.type<List<num>>(pair.argList4);
+  sameType(pairInstance4.argDynList4, pair.argDynList4);
+  sameType(pairInstance4.selfList4, pair.selfList4);
+
+  Expect.type<List<num>>(E4(pair).argList4);
+  sameType(pairInstance4.argDynList4, E4(pair).argDynList4);
+  sameType(pairInstance4.selfList4, E4(pair).selfList4);
+
+  List<int> intList = <int>[1];
+  var intListInstance5 = C5<int>(intList);
+
+  Expect.type<List<int>>(intList.argList5);
+  sameType(intListInstance5.argDynList5, intList.argDynList5);
+  sameType(intListInstance5.selfList5, intList.selfList5);
+
+  Expect.type<List<int>>(E5(intList).argList5);
+  sameType(intListInstance5.argDynList5, E5(intList).argDynList5);
+  sameType(intListInstance5.selfList5, E5(intList).selfList5);
+}
+
+void sameType(o1, o2) {
+  Expect.equals(o1.runtimeType, o2.runtimeType);
+}
+
+extension E1<T> on List<T> {
+  List<T> get argList1 => <T>[];
+  List<Object> get argDynList1 => <T>[];
+  List<Object> get selfList1 {
+    var result = [this];
+    return result;
+  }
+}
+
+class C1<T> {
+  List<T> self;
+  C1(this.self);
+  List<T> get argList1 => <T>[];
+  List<Object> get argDynList1 => <T>[];
+  List<Object> get selfList1 {
+    var result = [self];
+    return result;
+  }
+}
+
+extension E2<T> on T {
+  List<T> get argList2 => <T>[];
+  List<Object> get argDynList2 => <T>[];
+  List<Object> get selfList2 {
+    var result = [this];
+    return result;
+  }
+}
+
+class C2<T> {
+  T self;
+  C2(this.self);
+  List<T> get argList2 => <T>[];
+  List<Object> get argDynList2 => <T>[];
+  List<Object> get selfList2 {
+    var result = [self];
+    return result;
+  }
+}
+
+extension E3<S, T> on Pair<T, S> {
+  List<T> get argList3 => <T>[];
+  List<Object> get argDynList3 => <T>[];
+  List<S> get arg2List3 => <S>[];
+  List<Object> get arg2DynList3 => <S>[];
+  List<Object> get selfList3 {
+    var result = [this];
+    return result;
+  }
+}
+
+class C3<T, S> {
+  Pair<T, S> self;
+  C3(this.self);
+  List<T> get argList3 => <T>[];
+  List<Object> get argDynList3 => <T>[];
+  List<S> get arg2List3 => <S>[];
+  List<Object> get arg2DynList3 => <S>[];
+  List<Object> get selfList3 {
+    var result = [self];
+    return result;
+  }
+}
+
+extension E4<T> on Pair<T, T> {
+  List<T> get argList4 => <T>[];
+  List<Object> get argDynList4 => <T>[];
+  List<Object> get selfList4 {
+    var result = [this];
+    return result;
+  }
+}
+
+class C4<T> {
+  Pair<T, T> self;
+  C4(this.self);
+  List<T> get argList4 => <T>[];
+  List<Object> get argDynList4 => <T>[];
+  List<Object> get selfList4 {
+    var result = [self];
+    return result;
+  }
+}
+
+extension E5<T extends num> on List<T> {
+  List<T> get argList5 => <T>[];
+  List<Object> get argDynList5 => <T>[];
+  List<Object> get selfList5 {
+    var result = [this];
+    return result;
+  }
+}
+
+class C5<T extends num> {
+  List<T> self;
+  C5(this.self);
+  List<T> get argList5 => <T>[];
+  List<Object> get argDynList5 => <T>[];
+  List<Object> get selfList5 {
+    var result = [this];
+    return result;
+  }
+}
+
+class Pair<A, B> {
+  final A first;
+  final B second;
+  Pair(this.first, this.second);
+}
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_0_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_0_test.dart
new file mode 100644
index 0000000..3110880
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_0_test.dart
@@ -0,0 +1,211 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test an extension MyExt with no members against:
+//   - a class A with only its own members
+//   - and another extension ExtraExt with only its own members
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with no overlapping symbols into scope.
+import "helpers/extension_only.dart";
+
+const bool extensionValue = true;
+
+// An extension which defines no members of its own
+extension MyExt on A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of the other extension (when present)
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+
+  }
+
+   void testIdentifiersOnThis() {
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = this.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = this.getterInInstanceScope;
+      checkInstanceValue(t0);
+      this.setterInInstanceScope = instanceValue;
+      String t2 = this.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension.
+    {
+      double t0 = this.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      this.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = this.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = self.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = self.getterInInstanceScope;
+      checkInstanceValue(t1);
+      self.setterInInstanceScope = instanceValue;
+      String t2 = self.methodInInstanceScope();
+      checkInstanceValue(t2);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension.
+    {
+      double t0 = self.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      self.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = self.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of the other extension (when present)
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    String t0 = a.fieldInInstanceScope;
+    checkInstanceValue(t0);
+    String t1 = a.getterInInstanceScope;
+    checkInstanceValue(t1);
+    a.setterInInstanceScope = instanceValue;
+    String t2 = a.methodInInstanceScope();
+    checkInstanceValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    double t0 = a.fieldInOtherExtensionScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInOtherExtensionScope;
+    checkOtherExtensionValue(t1);
+    a.setterInOtherExtensionScope = otherExtensionValue;
+    double t2 = a.methodInOtherExtensionScope();
+    checkOtherExtensionValue(t2);
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_1_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_1_test.dart
new file mode 100644
index 0000000..9bea1cf
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_1_test.dart
@@ -0,0 +1,247 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test an extension MyExt with no members against:
+//   - a class A with only its own members
+//   - and an extension ExtraExt which overlaps the global and class members
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt that overlaps the global and instance names
+// into scope.
+import "helpers/extension_global_instance.dart";
+
+const bool extensionValue = true;
+
+// An extension which defines no members of its own
+extension MyExt on A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of the other extension (when present)
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Global symbols prefixed by `this` resolve to the version on the other
+    // extension
+    {
+      double t0 = this.fieldInGlobalScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInGlobalScope;
+      checkOtherExtensionValue(t1);
+      this.setterInGlobalScope = otherExtensionValue;
+      double t2 = this.methodInGlobalScope();
+      checkOtherExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = this.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = this.getterInInstanceScope;
+      checkInstanceValue(t0);
+      this.setterInInstanceScope = instanceValue;
+      String t2 = this.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension.
+    {
+      double t0 = this.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      this.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = this.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Global symbols on an instance resolve to the version on the other
+    // extension
+    {
+      double t0 = self.fieldInGlobalScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInGlobalScope;
+      checkOtherExtensionValue(t1);
+      self.setterInGlobalScope = otherExtensionValue;
+      double t2 = self.methodInGlobalScope();
+      checkOtherExtensionValue(t2);
+    }
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = self.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = self.getterInInstanceScope;
+      checkInstanceValue(t1);
+      self.setterInInstanceScope = instanceValue;
+      String t2 = self.methodInInstanceScope();
+      checkInstanceValue(t2);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension.
+    {
+      double t0 = self.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      self.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = self.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of the other extension (when present)
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global symbols on an instance resolve to the version on the other
+  // extension
+  {
+    double t0 = a.fieldInGlobalScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInGlobalScope;
+    checkOtherExtensionValue(t1);
+    a.setterInGlobalScope = otherExtensionValue;
+    double t2 = a.methodInGlobalScope();
+    checkOtherExtensionValue(t2);
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    String t0 = a.fieldInInstanceScope;
+    checkInstanceValue(t0);
+    String t1 = a.getterInInstanceScope;
+    checkInstanceValue(t1);
+    a.setterInInstanceScope = instanceValue;
+    String t2 = a.methodInInstanceScope();
+    checkInstanceValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    double t0 = a.fieldInOtherExtensionScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInOtherExtensionScope;
+    checkOtherExtensionValue(t1);
+    a.setterInOtherExtensionScope = otherExtensionValue;
+    double t2 = a.methodInOtherExtensionScope();
+    checkOtherExtensionValue(t2);
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_2_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_2_test.dart
new file mode 100644
index 0000000..643581d
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_2_test.dart
@@ -0,0 +1,325 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test an extension MyExt with members whose names overlap with names from the
+// global, and instance scopes:
+//   - a class A with only its own members
+//   - an extension ExtraExt which has only its own members
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with no overlapping symbols into scope.
+import "helpers/extension_only.dart";
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// An extension which defines all members
+extension MyExt on A {
+  bool get fieldInGlobalScope => true;
+  bool get getterInGlobalScope => true;
+  set setterInGlobalScope(bool x) {
+    Expect.equals(true, x);
+  }
+  bool methodInGlobalScope() => true;
+
+  bool get fieldInInstanceScope => true;
+  bool get getterInInstanceScope => true;
+  set setterInInstanceScope(bool x) {
+    Expect.equals(true, x);
+  }
+  bool methodInInstanceScope() => true;
+
+  bool get fieldInExtensionScope => true;
+  bool get getterInExtensionScope => true;
+  set setterInExtensionScope(bool x) {
+    Expect.equals(true, x);
+  }
+  bool methodInExtensionScope() => true;
+
+  void testNakedIdentifiers() {
+    // Globals should resolve to local extension versions
+    {
+      bool t0 = fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInGlobalScope;
+      checkExtensionValue(t1);
+      setterInGlobalScope = extensionValue;
+      bool t2 = methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Un-prefixed instance members resolve to the local extension versions
+    {
+      bool t0 = fieldInInstanceScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInInstanceScope;
+      checkExtensionValue(t0);
+      setterInInstanceScope = extensionValue;
+      bool t2 = methodInInstanceScope();
+      checkExtensionValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in this extension
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension (unresolved identifier "id" gets turned into
+    // "this.id", which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Globals should resolve to local extension versions
+    {
+      bool t0 = this.fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = this.getterInGlobalScope;
+      checkExtensionValue(t1);
+      this.setterInGlobalScope = extensionValue;
+      bool t2 = this.methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      String t0 = this.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = this.getterInInstanceScope;
+      checkInstanceValue(t0);
+      this.setterInInstanceScope = instanceValue;
+      String t2 = this.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      bool t0 = this.fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = this.getterInExtensionScope;
+      checkExtensionValue(t1);
+      this.setterInExtensionScope = extensionValue;
+      bool t2 = this.methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = this.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      this.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = this.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Globals should resolve to local extension versions
+    {
+      bool t0 = self.fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = self.getterInGlobalScope;
+      checkExtensionValue(t1);
+      self.setterInGlobalScope = extensionValue;
+      bool t2 = self.methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      String t0 = self.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = self.getterInInstanceScope;
+      checkInstanceValue(t0);
+      self.setterInInstanceScope = instanceValue;
+      String t2 = self.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      bool t0 = self.fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = self.getterInExtensionScope;
+      checkExtensionValue(t1);
+      self.setterInExtensionScope = extensionValue;
+      bool t2 = self.methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = self.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      self.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = self.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of the other extension (when present)
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members defined only in this extension resolve correctly.
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members defined in the external extension resolve correctly
+    // (an unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global symbols on an instance resolve to the version on this
+  // extension
+  {
+    bool t0 = a.fieldInGlobalScope;
+    checkExtensionValue(t0);
+    bool t1 = a.getterInGlobalScope;
+    checkExtensionValue(t1);
+    a.setterInGlobalScope = extensionValue;
+    bool t2 = a.methodInGlobalScope();
+    checkExtensionValue(t2);
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    String t0 = a.fieldInInstanceScope;
+    checkInstanceValue(t0);
+    String t1 = a.getterInInstanceScope;
+    checkInstanceValue(t1);
+    a.setterInInstanceScope = instanceValue;
+    String t2 = a.methodInInstanceScope();
+    checkInstanceValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in this
+  // extension.
+  {
+    bool t0 = a.fieldInExtensionScope;
+    checkExtensionValue(t0);
+    bool t1 = a.getterInExtensionScope;
+    checkExtensionValue(t1);
+    a.setterInExtensionScope = extensionValue;
+    bool t2 = a.methodInExtensionScope();
+    checkExtensionValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    double t0 = a.fieldInOtherExtensionScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInOtherExtensionScope;
+    checkOtherExtensionValue(t1);
+    a.setterInOtherExtensionScope = otherExtensionValue;
+    double t2 = a.methodInOtherExtensionScope();
+    checkOtherExtensionValue(t2);
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
new file mode 100644
index 0000000..534222e
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_3_error_test.dart
@@ -0,0 +1,292 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test the error cases for an extension MyExt with member names
+// overlapping the global and instance scopes against:
+//   - a class A with only its own members
+//   - an extension ExtraExt which has global and instance members as well as
+//     its own
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with members that overlap the global and instance
+// names into scope.
+import "helpers/extension_global_instance.dart";
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// An extension which defines members of its own, as well members overlapping
+// the instance and global names.
+extension MyExt on A {
+  bool get fieldInGlobalScope => extensionValue;
+  bool get getterInGlobalScope => extensionValue;
+  set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInGlobalScope() => extensionValue;
+
+  bool get fieldInInstanceScope => extensionValue;
+  bool get getterInInstanceScope => extensionValue;
+  set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+
+  bool get fieldInExtensionScope => extensionValue;
+  bool get getterInExtensionScope => extensionValue;
+  set setterInExtensionScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInExtensionScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Globals should resolve to local extension versions
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Un-prefixed instance members resolve to the local extension versions
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members resolve to the extension methods in this extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension (unresolved identifier "id" gets turned into
+    // "this.id", which is then subject to extension method lookup).
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Prefixed globals are ambiguous
+    {
+      bool t0 = this.fieldInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = this.getterInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      this.setterInGlobalScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = this.methodInGlobalScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of either extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Prefixed globals are ambiguous
+    {
+      bool t0 = self.fieldInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = self.getterInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      self.setterInGlobalScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = self.methodInGlobalScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of either extension
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+    // Extension members resolve to the extension methods in the local
+    // extension.
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+
+   // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      // No errors: see static_extension_internal_resolution_3_test.dart
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global names come from both extensions and hence are ambiguous.
+  {
+    bool t0 = a.fieldInGlobalScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t0);
+    bool t1 = a.getterInGlobalScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t1);
+    a.setterInGlobalScope = extensionValue;
+    //^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+    // ^^^
+    // [cfe] unspecified
+    bool t2 = a.methodInGlobalScope();
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    checkExtensionValue(t2);
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    // No errors: see static_extension_internal_resolution_3_test.dart
+  }
+
+  // Extension members resolve to the extension methods in this
+  // extension.
+  {
+    // No errors: see static_extension_internal_resolution_3_test.dart
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    // No errors: see static_extension_internal_resolution_3_test.dart
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_3_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_3_test.dart
new file mode 100644
index 0000000..d1da8bf
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_3_test.dart
@@ -0,0 +1,309 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test the non error cases for an extension MyExt with member names
+// overlapping the global and instance scopes against:
+//   - a class A with only its own members
+//   - an extension ExtraExt which has global and instance members as well as
+//     its own
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with members that overlap the global and instance
+// names into scope.
+import "helpers/extension_global_instance.dart";
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// An extension which defines members of its own, as well members overlapping
+// the instance and global names.
+extension MyExt on A {
+  bool get fieldInGlobalScope => extensionValue;
+  bool get getterInGlobalScope => extensionValue;
+  set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInGlobalScope() => extensionValue;
+
+  bool get fieldInInstanceScope => extensionValue;
+  bool get getterInInstanceScope => extensionValue;
+  set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+
+  bool get fieldInExtensionScope => extensionValue;
+  bool get getterInExtensionScope => extensionValue;
+  set setterInExtensionScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInExtensionScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Globals should resolve to local extension versions
+    {
+      bool t0 = fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInGlobalScope;
+      checkExtensionValue(t1);
+      setterInGlobalScope = extensionValue;
+      bool t2 = methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Un-prefixed instance members resolve to the local extension versions
+    {
+      bool t0 = fieldInInstanceScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInInstanceScope;
+      checkExtensionValue(t0);
+      setterInInstanceScope = extensionValue;
+      bool t2 = methodInInstanceScope();
+      checkExtensionValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in this extension
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension (unresolved identifier "id" gets turned into
+    // "this.id", which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Prefixed globals are ambiguous
+    {
+      // Error cases tested in static_extension_internal_resolution_3_error_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of either extension
+    {
+      String t0 = this.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = this.getterInInstanceScope;
+      checkInstanceValue(t0);
+      this.setterInInstanceScope = instanceValue;
+      String t2 = this.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      bool t0 = this.fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = this.getterInExtensionScope;
+      checkExtensionValue(t1);
+      this.setterInExtensionScope = extensionValue;
+      bool t2 = this.methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = this.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      this.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = this.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Prefixed globals are ambiguous
+    {
+      // Error cases tested in static_extension_internal_resolution_3_error_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      String t0 = self.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = self.getterInInstanceScope;
+      checkInstanceValue(t0);
+      self.setterInInstanceScope = instanceValue;
+      String t2 = self.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members resolve to the extension methods on this extension
+    {
+      bool t0 = self.fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = self.getterInExtensionScope;
+      checkExtensionValue(t1);
+      self.setterInExtensionScope = extensionValue;
+      bool t2 = self.methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = self.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      self.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = self.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of either extension
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members defined internally resolve correctly.
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members defined elsewhere resolve correctly
+    // (an unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global names come from both extensions and hence are ambiguous.
+  {
+    // Error cases tested in static_extension_internal_resolution_3_error_test.dart
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    String t0 = a.fieldInInstanceScope;
+    checkInstanceValue(t0);
+    String t1 = a.getterInInstanceScope;
+    checkInstanceValue(t1);
+    a.setterInInstanceScope = instanceValue;
+    String t2 = a.methodInInstanceScope();
+    checkInstanceValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in this
+  // extension.
+  {
+    bool t0 = a.fieldInExtensionScope;
+    checkExtensionValue(t0);
+    bool t1 = a.getterInExtensionScope;
+    checkExtensionValue(t1);
+    a.setterInExtensionScope = extensionValue;
+    bool t2 = a.methodInExtensionScope();
+    checkExtensionValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    double t0 = a.fieldInOtherExtensionScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInOtherExtensionScope;
+    checkOtherExtensionValue(t1);
+    a.setterInOtherExtensionScope = otherExtensionValue;
+    double t2 = a.methodInOtherExtensionScope();
+    checkOtherExtensionValue(t2);
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
new file mode 100644
index 0000000..801a528
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_4_error_test.dart
@@ -0,0 +1,404 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test the error cases for an extension MyExt with member names
+// overlapping the global and instance scopes against:
+//   - a class A with only its own members
+//   - an extension ExtraExt which has members overlapping the global names,
+//     the instance names from A, and the extension names from MyExt, as well as
+//     its own names.
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with symbols that overlap the global, instance,
+// and extension names into scope.
+import "helpers/extension_all.dart";
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// An extension which defines its own members
+extension MyExt on A {
+  bool get fieldInGlobalScope => extensionValue;
+  bool get getterInGlobalScope => extensionValue;
+  set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInGlobalScope() => extensionValue;
+
+  bool get fieldInInstanceScope => extensionValue;
+  bool get getterInInstanceScope => extensionValue;
+  set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+
+  bool get fieldInExtensionScope => extensionValue;
+  bool get getterInExtensionScope => extensionValue;
+  set setterInExtensionScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInExtensionScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Globals should resolve to local extension versions
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Un-prefixed instance members resolve to the local extension versions
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Extension members resolve to the extension methods in this extension
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension (unresolved identifier "id" gets turned into
+    // "this.id", which is then subject to extension method lookup).
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Prefixed globals are ambiguous
+    {
+      bool t0 = this.fieldInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = this.getterInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      this.setterInGlobalScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = this.methodInGlobalScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of either extension
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Extension members are ambigious.
+    {
+      bool t0 = this.fieldInExtensionScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = this.getterInExtensionScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      this.setterInExtensionScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = this.methodInExtensionScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Prefixed globals are ambiguous
+    {
+      bool t0 = self.fieldInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = self.getterInGlobalScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      self.setterInGlobalScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = self.methodInGlobalScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Extension members are ambigious.
+    {
+      bool t0 = self.fieldInExtensionScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t0);
+      bool t1 = self.getterInExtensionScope;
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+      checkExtensionValue(t1);
+      self.setterInExtensionScope = extensionValue;
+      //   ^^^
+      // [cfe] unspecified
+      //   ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //   ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+      bool t2 = self.methodInExtensionScope();
+      //             ^^^
+      // [cfe] unspecified
+      //             ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of either extension
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+
+    // Extension members are ambiguous
+    {
+      bool t0 = fieldInExtensionScope;
+      //        ^^^
+      // [cfe] unspecified
+      //        ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //        ^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      //        ^^^
+      // [cfe] unspecified
+      //        ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //        ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+//    ^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+//    ^^^^^^^^^^^^^^^^^^^^^^
+// [analyzer] STATIC_WARNING.UNDEFINED_IDENTIFIER
+//              ^^^
+// [cfe] unspecified
+      bool t2 = methodInExtensionScope();
+      //        ^^^
+      // [cfe] unspecified
+      //        ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+      //        ^^^^^^^^^^^^^^^^^^^^^^
+      // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_METHOD
+      checkExtensionValue(t2);
+    }
+
+   // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      // No errors: see static_extension_internal_resolution_4_test.dart
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global names come from both extensions and hence are ambiguous.
+  {
+    bool t0 = a.fieldInGlobalScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t0);
+    bool t1 = a.getterInGlobalScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t1);
+    a.setterInGlobalScope = extensionValue;
+    //^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+    // ^^^
+    // [cfe] unspecified
+    bool t2 = a.methodInGlobalScope();
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    checkExtensionValue(t2);
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    // No errors: see static_extension_internal_resolution_4_test.dart
+  }
+
+  // Extension members are ambiguous
+  {
+    bool t0 = a.fieldInExtensionScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t0);
+    bool t1 = a.getterInExtensionScope;
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //          ^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_GETTER
+    checkExtensionValue(t1);
+    a.setterInExtensionScope = extensionValue;
+    //^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    //^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] STATIC_TYPE_WARNING.UNDEFINED_SETTER
+    // ^^^
+    // [cfe] unspecified
+    bool t2 = a.methodInExtensionScope();
+    //          ^^^
+    // [cfe] unspecified
+    //          ^^^^^^^^^^^^^^^^^^^^^^
+    // [analyzer] COMPILE_TIME_ERROR.AMBIGUOUS_EXTENSION_METHOD_ACCESS
+    checkExtensionValue(t2);
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    // No errors: see static_extension_internal_resolution_4_test.dart
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_4_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_4_test.dart
new file mode 100644
index 0000000..3cd6f90
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_4_test.dart
@@ -0,0 +1,284 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test the non error cases for an extension MyExt with member names
+// overlapping the global and instance scopes against:
+//   - a class A with only its own members
+//   - an extension ExtraExt which has members overlapping the global names,
+//     the instance names from A, and the extension names from MyExt, as well as
+//     its own names.
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class A with instance members into scope.
+import "helpers/class_no_shadow.dart";
+
+// Do Not Delete.
+// Bring an extension ExtraExt with symbols that overlap the global, instance,
+// and extension names into scope.
+import "helpers/extension_all.dart";
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// An extension which defines its own members
+extension MyExt on A {
+  bool get fieldInGlobalScope => extensionValue;
+  bool get getterInGlobalScope => extensionValue;
+  set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInGlobalScope() => extensionValue;
+
+  bool get fieldInInstanceScope => extensionValue;
+  bool get getterInInstanceScope => extensionValue;
+  set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+
+  bool get fieldInExtensionScope => extensionValue;
+  bool get getterInExtensionScope => extensionValue;
+  set setterInExtensionScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInExtensionScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Globals should resolve to local extension versions
+    {
+      bool t0 = fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInGlobalScope;
+      checkExtensionValue(t1);
+      setterInGlobalScope = extensionValue;
+      bool t2 = methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Un-prefixed instance members resolve to the local extension versions
+    {
+      bool t0 = fieldInInstanceScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInInstanceScope;
+      checkExtensionValue(t0);
+      setterInInstanceScope = extensionValue;
+      bool t2 = methodInInstanceScope();
+      checkExtensionValue(t0);
+    }
+
+    // Extension members resolve to the extension methods in this extension
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension (unresolved identifier "id" gets turned into
+    // "this.id", which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+
+  }
+
+  void testIdentifiersOnThis() {
+    // Prefixed globals are ambiguous
+    {
+      // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of either extension
+    {
+      String t0 = this.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = this.getterInInstanceScope;
+      checkInstanceValue(t0);
+      this.setterInInstanceScope = instanceValue;
+      String t2 = this.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members are ambigious.
+    {
+      // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = this.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = this.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      this.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = this.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void testIdentifiersOnInstance() {
+    A self = this;
+
+    // Prefixed globals are ambiguous
+    {
+      // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the extension
+    {
+      String t0 = self.fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = self.getterInInstanceScope;
+      checkInstanceValue(t0);
+      self.setterInInstanceScope = instanceValue;
+      String t2 = self.methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members are ambigious.
+    {
+      // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+    }
+
+    // Extension members not on this extension resolve to the extension methods
+    // in the other extension.
+    {
+      double t0 = self.fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = self.getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      self.setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = self.methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+    MyExt(this).testIdentifiersOnThis();
+    MyExt(this).testIdentifiersOnInstance();
+  }
+}
+
+
+class B extends A {
+  void testNakedIdentifiers() {
+    // Globals should resolve to the global name space, and not to the members
+    // of either extension
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Instance members resolve to the instance methods and not the members
+    // of the other extension (when present)
+    {
+      String t0 = fieldInInstanceScope;
+      checkInstanceValue(t0);
+      String t1 = getterInInstanceScope;
+      checkInstanceValue(t0);
+      setterInInstanceScope = instanceValue;
+      String t2 = methodInInstanceScope();
+      checkInstanceValue(t0);
+    }
+
+    // Extension members are ambigious.
+    {
+      // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+    }
+
+   // Extension members resolve to the extension methods in the other
+    // extension (unresolved identifier "id" gets turned into "this.id",
+    // which is then subject to extension method lookup).
+    {
+      double t0 = fieldInOtherExtensionScope;
+      checkOtherExtensionValue(t0);
+      double t1 = getterInOtherExtensionScope;
+      checkOtherExtensionValue(t1);
+      setterInOtherExtensionScope = otherExtensionValue;
+      double t2 = methodInOtherExtensionScope();
+      checkOtherExtensionValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new A();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+
+  // Check external resolution as well while we're here
+
+  // Global names come from both extensions and hence are ambiguous.
+  {
+    // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+  }
+
+  // Instance members resolve to the instance methods and not the members
+  // of the other extension (when present)
+  {
+    String t0 = a.fieldInInstanceScope;
+    checkInstanceValue(t0);
+    String t1 = a.getterInInstanceScope;
+    checkInstanceValue(t1);
+    a.setterInInstanceScope = instanceValue;
+    String t2 = a.methodInInstanceScope();
+    checkInstanceValue(t2);
+  }
+
+  // Extension members are ambigious.
+  {
+    // Error cases tested in static_extension_internal_resolution_4_error_test.dart
+  }
+
+  // Extension members resolve to the extension methods in the other
+  // extension.
+  {
+    double t0 = a.fieldInOtherExtensionScope;
+    checkOtherExtensionValue(t0);
+    double t1 = a.getterInOtherExtensionScope;
+    checkOtherExtensionValue(t1);
+    a.setterInOtherExtensionScope = otherExtensionValue;
+    double t2 = a.methodInOtherExtensionScope();
+    checkOtherExtensionValue(t2);
+  }
+
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_5_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_5_test.dart
new file mode 100644
index 0000000..1a567a4
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_5_test.dart
@@ -0,0 +1,161 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test the non error cases for an extension MyExt with member names
+// overlapping the instance scopes against:
+//   - a class AGlobal which overlaps the names from the global scope as well
+//     as providing its own members
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class AGlobal with instance members and global members into scope.
+import "helpers/class_shadow.dart";
+import "helpers/class_no_shadow.dart";
+
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+// Put the extension members in the global scope
+int fieldInExtensionScope = globalValue;
+int get getterInExtensionScope => globalValue;
+set setterInExtensionScope(int x) {
+  checkGlobalValue(x);
+}
+int methodInExtensionScope() => globalValue;
+
+// Put the superclass members in the global scope
+int fieldInInstanceScope = globalValue;
+int get getterInInstanceScope => globalValue;
+set setterInInstanceScope(int x) {
+  checkGlobalValue(x);
+}
+int methodInInstanceScope() => globalValue;
+
+// An extension which defines only its own members
+extension MyExt on AGlobal {
+
+  bool get fieldInExtensionScope => extensionValue;
+  bool get getterInExtensionScope => extensionValue;
+  set setterInExtensionScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInExtensionScope() => extensionValue;
+
+  bool get fieldInInstanceScope => extensionValue;
+  bool get getterInInstanceScope => extensionValue;
+  set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Members that are in the global namespace and the instance namespace
+    // resolve to the global namespace.
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Members that are in the global namespace and the local namespace resolve
+    // to the local namespace.
+    {
+      bool t0 = fieldInExtensionScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInExtensionScope;
+      checkExtensionValue(t1);
+      setterInExtensionScope = extensionValue;
+      bool t2 = methodInExtensionScope();
+      checkExtensionValue(t2);
+    }
+
+    // Members that are in the global namespace and the instance and the local
+    // namespace resolve to the local namespace.
+    {
+      bool t0 = fieldInInstanceScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInInstanceScope;
+      checkExtensionValue(t1);
+      setterInInstanceScope = extensionValue;
+      bool t2 = methodInInstanceScope();
+      checkExtensionValue(t2);
+    }
+  }
+
+  void instanceTest() {
+    MyExt(this).testNakedIdentifiers();
+  }
+}
+
+class B extends AGlobal {
+  void testNakedIdentifiers() {
+    // Members that are in the global namespace and the superclass namespace
+    // should resolve to the global name space, and not to the members of the
+    // superclass.
+    {
+      int t0 = fieldInGlobalScope;
+      checkGlobalValue(t0);
+      int t1 = getterInGlobalScope;
+      checkGlobalValue(t1);
+      setterInGlobalScope = globalValue;
+      int t2 = methodInGlobalScope();
+      checkGlobalValue(t2);
+    }
+
+    // Members that are in the global namespace and the extension namespace
+    // should resolve to the global name space, and not to the members of the
+    // extension.
+    {
+      int t0 = fieldInExtensionScope;
+      checkGlobalValue(t0);
+      int t1 = getterInExtensionScope;
+      checkGlobalValue(t1);
+      setterInExtensionScope = globalValue;
+      int t2 = methodInExtensionScope();
+      checkGlobalValue(t2);
+    }
+
+    // Members that are in the global namespace, and the superclass namespace,
+    // and the extension namespace, should resolve to the global name space, and
+    // not to the members of the extension nor the members of the superclass.
+    {
+      int t0 = fieldInInstanceScope;
+      checkGlobalValue(t0);
+      int t1 = getterInInstanceScope;
+      checkGlobalValue(t1);
+      setterInInstanceScope = globalValue;
+      int t2 = methodInInstanceScope();
+      checkGlobalValue(t2);
+    }
+  }
+}
+
+void main() {
+  var a = new AGlobal();
+  a.instanceTest();
+  new B().testNakedIdentifiers();
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
new file mode 100644
index 0000000..edfa8ef
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_6_error_test.dart
@@ -0,0 +1,118 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test various static error corner cases around internal resolution.
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class AGlobal with instance members and global members into scope.
+import "helpers/class_shadow.dart";
+
+extension GenericExtension<T> on T {
+  T get self => this;
+  // Check that capture is avoided when expanding out
+  // self references.
+  void shadowTypeParam<T>(T x) {
+    T y = self;
+    //    ^^^^
+    // [analyzer] STATIC_TYPE_WARNING.INVALID_ASSIGNMENT
+    //     ^^^
+    // [cfe] unspecified
+  }
+  void castToShadowedTypeParam<T>() {
+    dynamic s = self;
+    (s as T);
+  }
+
+  List<T> mkList() => <T>[];
+  void castToShadowedTypeList<T>() {
+    (mkList() as List<T>);
+  }
+}
+
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+extension StaticExt on AGlobal {
+  // Valid to overlap static names with the target type symbols
+  static bool get fieldInInstanceScope => extensionValue;
+  static bool get getterInInstanceScope => extensionValue;
+  static set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  static bool methodInInstanceScope() => extensionValue;
+
+  // Add the global symbols
+  static bool get fieldInGlobalScope => extensionValue;
+  static bool get getterInGlobalScope => extensionValue;
+  static set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  static bool methodInGlobalScope() => extensionValue;
+
+  // Invalid to overlap the static and extension scopes
+  bool get fieldInInstanceScope => extensionValue;
+  //       ^^^
+  // [analyzer] unspecified
+  // [cfe] unspecified
+  bool get getterInInstanceScope => extensionValue;
+  //       ^^^
+  // [analyzer] unspecified
+  // [cfe] unspecified
+  set setterInInstanceScope(bool x) {
+  //  ^^^
+  // [analyzer] unspecified
+  // [cfe] unspecified
+    checkExtensionValue(x);
+  }
+  bool methodInInstanceScope() => extensionValue;
+  //   ^^^
+  // [analyzer] unspecified
+  // [cfe] unspecified
+
+
+  void testNakedIdentifiers() {
+    // Symbols in the global scope and the local static scope resolve to
+    // the local static scope.
+    {
+      // No errors: see static_extension_internal_resolution_6_test.dart
+    }
+
+    // Symbols in the global scope, the instance scope, and the local static scope
+    // resolve to the local static scope.
+    {
+      // No errors: see static_extension_internal_resolution_6_test.dart
+    }
+  }
+  void instanceTest() {
+    StaticExt(this).testNakedIdentifiers();
+  }
+}
+
+void main() {
+  var a = new AGlobal();
+  a.instanceTest();
+
+  Expect.throwsCastError(() => 3.castToShadowedTypeParam<String>());
+  Expect.throwsCastError(() => 3.castToShadowedTypeList<String>());
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_internal_resolution_6_test.dart b/tests/language_2/extension_methods/static_extension_internal_resolution_6_test.dart
new file mode 100644
index 0000000..9c63c3b
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_internal_resolution_6_test.dart
@@ -0,0 +1,99 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests resolution of identifiers inside of extension methods
+
+// Test various non-error corner cases around internal resolution.
+
+import "package:expect/expect.dart";
+
+/////////////////////////////////////////////////////////////////////////
+// Note: These imports may be deliberately unused.  They bring certain
+// names into scope, in order to test that certain resolution choices are
+// made even in the presence of other symbols.
+/////////////////////////////////////////////////////////////////////////
+
+// Do Not Delete.
+// Bring global members into scope.
+import "helpers/global_scope.dart";
+
+// Do Not Delete.
+// Bring a class AGlobal with instance members and global members into scope.
+import "helpers/class_shadow.dart";
+
+extension GenericExtension<T> on T {
+  T get self => this;
+  void castToShadowedTypeParam<T>() {
+    dynamic s = self;
+    (s as T);
+  }
+
+  List<T> mkList() => <T>[];
+  void castToShadowedTypeList<T>() {
+    (mkList() as List<T>);
+  }
+}
+
+
+const bool extensionValue = true;
+
+void checkExtensionValue(bool x) {
+  Expect.equals(x, extensionValue);
+}
+
+extension StaticExt on AGlobal {
+  // Valid to overlap static names with the target type symbols
+  static bool get fieldInInstanceScope => extensionValue;
+  static bool get getterInInstanceScope => extensionValue;
+  static set setterInInstanceScope(bool x) {
+    checkExtensionValue(x);
+  }
+  static bool methodInInstanceScope() => extensionValue;
+
+  // Add the global symbols
+  static bool get fieldInGlobalScope => extensionValue;
+  static bool get getterInGlobalScope => extensionValue;
+  static set setterInGlobalScope(bool x) {
+    checkExtensionValue(x);
+  }
+  static bool methodInGlobalScope() => extensionValue;
+
+  void testNakedIdentifiers() {
+    // Symbols in the global scope and the local static scope resolve to
+    // the local static scope.
+    {
+      bool t0 = fieldInGlobalScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInGlobalScope;
+      checkExtensionValue(t1);
+      setterInGlobalScope = extensionValue;
+      bool t2 = methodInGlobalScope();
+      checkExtensionValue(t2);
+    }
+
+    // Symbols in the global scope, the instance scope, and the local static scope
+    // resolve to the local static scope.
+    {
+      bool t0 = fieldInInstanceScope;
+      checkExtensionValue(t0);
+      bool t1 = getterInInstanceScope;
+      checkExtensionValue(t1);
+      setterInInstanceScope = extensionValue;
+      bool t2 = methodInInstanceScope();
+      checkExtensionValue(t2);
+    }
+  }
+  void instanceTest() {
+    StaticExt(this).testNakedIdentifiers();
+  }
+}
+
+void main() {
+  var a = new AGlobal();
+  a.instanceTest();
+
+  Expect.throwsCastError(() => 3.castToShadowedTypeParam<String>());
+}
\ No newline at end of file
diff --git a/tests/language_2/extension_methods/static_extension_operators_test.dart b/tests/language_2/extension_methods/static_extension_operators_test.dart
new file mode 100644
index 0000000..ebada0d
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_operators_test.dart
@@ -0,0 +1,130 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+// Tests that static extensions can be used for all operators.
+
+void main() {
+  Object a = "a";
+  Object b = "b";
+  Object c = "c";
+
+  expect("(-a)", -a);
+  expect("(~a)", ~a);
+  expect("(a+b)", a + b);
+  expect("(a-b)", a - b);
+  expect("(a*b)", a * b);
+  expect("(a/b)", a / b);
+  expect("(a%b)", a % b);
+  expect("(a~/b)", a ~/ b);
+  expect("(a|b)", a | b);
+  expect("(a&b)", a & b);
+  expect("(a^b)", a ^ b);
+  expect("(a<b)", a < b);
+  expect("(a>b)", a > b);
+  expect("(a<=b)", a <= b);
+  expect("(a>=b)", a >= b);
+  expect("(a<<b)", a << b);
+  expect("(a>>b)", a >> b);
+  // expect("(a>>>b)", a >>> b);
+  expect("a(b)", a(b));
+  expect("a(b,c)", a(b, c));
+  expect("a[b]", a[b]);
+  expect("c", a[b] = c, "a[b]=c");
+
+  // Operator-assignment works and evaluates to its RHS value.
+  expect("(a.field+b)", a.field += b, "a.field=(a.field+b)");
+  expect("(a.field-b)", a.field -= b, "a.field=(a.field-b)");
+  expect("(a.field*b)", a.field *= b, "a.field=(a.field*b)");
+  expect("(a.field/b)", a.field /= b, "a.field=(a.field/b)");
+  expect("(a.field%b)", a.field %= b, "a.field=(a.field%b)");
+  expect("(a.field~/b)", a.field ~/= b, "a.field=(a.field~/b)");
+  expect("(a.field|b)", a.field |= b, "a.field=(a.field|b)");
+  expect("(a.field&b)", a.field &= b, "a.field=(a.field&b)");
+  expect("(a.field^b)", a.field ^= b, "a.field=(a.field^b)");
+  expect("(a.field<<b)", a.field <<= b, "a.field=(a.field<<b)");
+  expect("(a.field>>b)", a.field >>= b, "a.field=(a.field>>b)");
+  // expect("(a.field>>>b)", a.field >>>= b, "a.field=(a.field>>>b)");
+
+  // Even on index operations.
+  expect("(a[c]+b)", a[c] += b, "a[c]=(a[c]+b)");
+  expect("(a[c]-b)", a[c] -= b, "a[c]=(a[c]-b)");
+  expect("(a[c]*b)", a[c] *= b, "a[c]=(a[c]*b)");
+  expect("(a[c]/b)", a[c] /= b, "a[c]=(a[c]/b)");
+  expect("(a[c]%b)", a[c] %= b, "a[c]=(a[c]%b)");
+  expect("(a[c]~/b)", a[c] ~/= b, "a[c]=(a[c]~/b)");
+  expect("(a[c]|b)", a[c] |= b, "a[c]=(a[c]|b)");
+  expect("(a[c]&b)", a[c] &= b, "a[c]=(a[c]&b)");
+  expect("(a[c]^b)", a[c] ^= b, "a[c]=(a[c]^b)");
+  expect("(a[c]<<b)", a[c] <<= b, "a[c]=(a[c]<<b)");
+  expect("(a[c]>>b)", a[c] >>= b, "a[c]=(a[c]>>b)");
+  // expect("(a[c]>>>b)", a[c] >>>= b, "a[c]=(a[c]>>>b)");
+
+  // And ++/-- expands to their assignments.
+  expect("(a.field+1)", ++a.field, "a.field=(a.field+1)");
+  expect("(a.field-1)", --a.field, "a.field=(a.field-1)");
+  expect("a.field", a.field++, "a.field=(a.field+1)");
+  expect("a.field", a.field--, "a.field=(a.field-1)");
+  expect("(a[b]+1)", ++a[b], "a[b]=(a[b]+1)");
+  expect("(a[b]-1)", --a[b], "a[b]=(a[b]-1)");
+  expect("a[b]", a[b]++, "a[b]=(a[b]+1)");
+  expect("a[b]", a[b]--, "a[b]=(a[b]-1)");
+
+  // Combinations.
+  expect("(a+b[b(c)](a*b))", a + b[c[a] = b(c)](a * b), "c[a]=b(c)");
+
+  // Operator precedence is unaffected by being extensions.
+  expect("(c<((-a)|(b^((~c)&((a<<b)>>((c-a)+((((b*c)~/a)%b)/c)))))))",
+      c < -a | b ^ ~c & a << b >> c - a + b * c ~/ a % b / c);
+  expect("((((((((((((c/b)%a)~/c)*b)+a)-c)<<b)>>a)&(~c))^b)|(-a))>b)",
+      c / b % a ~/ c * b + a - c << b >> a & ~c ^ b | -a > b);
+}
+
+// Last value set by []= or setter.
+String setValue = "";
+
+void expect(String expect, Object value, [String expectSet]) {
+  Expect.equals(expect, value, "value");
+  if (expectSet != null) Expect.equals(expectSet, setValue, "assignment");
+}
+
+extension Ops on Object {
+  Object operator -() => "(-${this})";
+  Object operator ~() => "(~${this})";
+  Object operator +(Object other) => "(${this}+$other)";
+  Object operator -(Object other) => "(${this}-$other)";
+  Object operator *(Object other) => "(${this}*$other)";
+  Object operator /(Object other) => "(${this}/$other)";
+  Object operator %(Object other) => "(${this}%$other)";
+  Object operator ~/(Object other) => "(${this}~/$other)";
+  Object operator |(Object other) => "(${this}|$other)";
+  Object operator &(Object other) => "(${this}&$other)";
+  Object operator ^(Object other) => "(${this}^$other)";
+  Object operator <(Object other) => "(${this}<$other)";
+  Object operator >(Object other) => "(${this}>$other)";
+  Object operator <=(Object other) => "(${this}<=$other)";
+  Object operator >=(Object other) => "(${this}>=$other)";
+  Object operator <<(Object other) => "(${this}<<$other)";
+  Object operator >>(Object other) => "(${this}>>$other)";
+  // TODO: enable `>>>` when it has been implemented.
+  // String operator >>>(Object other) => "(${this}>>>$other)";
+
+  // Cannot make an extension method for `==` because it's declared by Object.
+
+  Object operator [](Object other) => "${this}[$other]";
+  void operator []=(Object other, Object value) {
+    setValue = "${this}[$other]=$value";
+  }
+
+  Object call([arg1, arg2]) =>
+      "${this}(${[arg1, arg2].where((x) => x != null).join(",")})";
+
+  Object get field => "${this}.field";
+  void set field(Object other) {
+    setValue = "${this}.field=$other";
+  }
+}
diff --git a/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
new file mode 100644
index 0000000..f7c38dc
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_resolution_failures_test.dart
@@ -0,0 +1,99 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests extension method resolution failures.
+
+import "package:expect/expect.dart";
+
+main() {
+  A a = C();
+  B1 b1 = C();
+  B2 b2 = C();
+  C c = C();
+
+  Expect.equals("EA.v1", a.v1);
+  Expect.equals("EB1.v1", b1.v1);
+  Expect.equals("EB2.v1", b2.v1);
+  Expect.equals("EC.v1", c.v1);
+
+  Expect.equals("EA.v2", a.v2);
+  Expect.equals("EB1.v2", b1.v2);
+  Expect.equals("EB2.v2", b2.v2);
+  c // Cannot determine which of EB1 and EB2's v2 is more specific
+    .v2 //# 01: compile-time error
+  ;
+
+  Expect.equals("EA.v3", a.v3);
+  Expect.equals("EA.v3", b1.v3);
+  Expect.equals("EA.v3", b2.v3);
+  Expect.equals("EA.v3", c.v3);
+
+
+  Iterable<num> i_num = <int>[];
+  Iterable<int> ii = <int>[];
+  List<num> ln = <int>[];
+  List<int> li = <int>[];
+
+  i_num // No `i_num` extension declared.
+    .i_num //# 02: compile-time error
+  ;
+
+  Expect.equals("Iterable<int>.i_num", ii.i_num);
+  Expect.equals("List<num>.i_num", ln.i_num);
+
+  li // Both apply, neither is more specific.
+    .i_num //# 03: compile-time error
+  ;
+
+  c // no most specific because both are equally specific.
+    .cs //# 04: compile-time error
+  ;
+}
+
+// Diamond class hierarchy.
+class A {}
+class B1 implements A {}
+class B2 implements A {}
+class C implements B1, B2 {}
+
+extension EA on A {
+  String get v1 => "EA.v1";
+  String get v2 => "EA.v2";
+  String get v3 => "EA.v3";
+}
+
+extension EB1 on B1 {
+  String get v1 => "EB1.v1";
+  String get v2 => "EB1.v2";
+}
+
+extension EB2 on B2 {
+  String get v1 => "EB2.v1";
+  String get v2 => "EB2.v2";
+}
+
+extension EC on C {
+  String get v1 => "EC.v1";
+}
+
+// Iterable<num>, Iterable<int>, List<num> and List<int> also forms diamond
+// hierarchy.
+extension II on Iterable<int> {
+  String get i_num => "Iterable<int>.i_num";
+}
+
+extension LN on List<num> {
+  String get i_num => "List<num>.i_num";
+}
+
+// Two exactly identical `on` types.
+extension C1 on C {
+  String get cs => "C1.cs";
+}
+
+extension C2 on C {
+  String get cs => "C2.cs";
+}
diff --git a/tests/language_2/extension_methods/static_extension_resolution_test.dart b/tests/language_2/extension_methods/static_extension_resolution_test.dart
new file mode 100644
index 0000000..e766025
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_resolution_test.dart
@@ -0,0 +1,232 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+import "package:expect/expect.dart";
+
+// Tests the resolution of multiple applicable extensions.
+
+String lastSetterValue;
+
+class SuperTarget {}
+
+class Target<T> extends SuperTarget {
+  String targetMethod() => "targetMethod";
+  String get targetGetter => "targetGetter";
+  void set targetSetter(String argument) {
+    lastSetterValue = "targetSetter: $argument";
+  }
+}
+
+class SubTarget<T> extends Target<T> {
+  String subTargetMethod() => "subTargetMethod";
+  String get subTargetGetter => "subTargetGetter";
+  void set subTargetSetter(String argument) {
+    lastSetterValue = "subTargetSetter: $argument";
+  }
+}
+
+extension E1<T> on SubTarget<T> {
+  static String name = "SubTarget<T>";
+
+  String e1() => "$name.e1";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+
+  List<T> get typedList => <T>[];
+}
+
+extension E2 on SubTarget<Object> {
+  static String name = "SubTarget<Object>";
+
+  String e1() => "$name.e1";
+  String e2() => "$name.e2";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+}
+
+extension E3<T> on Target<T> {
+  static String name = "Target<T>";
+
+  String e1() => "$name.e1";
+  String e2() => "$name.e2";
+  String e3() => "$name.e3";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+
+  List<T> get typedList => <T>[];
+}
+
+extension E4 on Target<Object> {
+  static String name = "Target<Object>";
+
+  String e1() => "$name.e1";
+  String e2() => "$name.e2";
+  String e3() => "$name.e3";
+  String e4() => "$name.e4";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+}
+
+extension E5<T> on T {
+  static String name = "T";
+
+  String e1() => "$name.e1";
+  String e2() => "$name.e2";
+  String e3() => "$name.e3";
+  String e4() => "$name.e4";
+  String e5() => "$name.e5";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+
+  List<T> get typedList => <T>[];
+}
+
+extension E6 on Object {
+  static String name = "Object";
+
+  String e1() => "$name.e1";
+  String e2() => "$name.e2";
+  String e3() => "$name.e3";
+  String e4() => "$name.e4";
+  String e5() => "$name.e5";
+  String e6() => "$name.e6";
+
+  String targetMethod() => "$name.targetMethod";
+  String get targetGetter => "$name.targetGetter";
+  void set targetSetter(String value) {
+    lastSetterValue = "$name.targetSetter: $value";
+  }
+
+  String subTargetMethod() => "$name.subTargetMethod";
+  String get subTargetGetter => "$name.subTargetGetter";
+  void set subTargetSetter(String value) {
+    lastSetterValue = "$name.subTargetSetter: $value";
+  }
+}
+
+main() {
+  SubTarget<num> s1 = SubTarget<int>();
+  Target<num> t1 = SubTarget<int>();
+  SuperTarget o1 = SubTarget<int>();
+  Target<int> ti1 = SubTarget<int>();
+  ;
+  SubTarget<int> si1 = SubTarget<int>();
+  ;
+
+  // Interface methods take precedence.
+
+  Expect.equals("targetGetter", s1.targetGetter);
+  Expect.equals("targetMethod", s1.targetMethod());
+  s1.targetSetter = "1";
+  Expect.equals("targetSetter: 1", lastSetterValue);
+
+  Expect.equals("subTargetGetter", s1.subTargetGetter);
+  Expect.equals("subTargetMethod", s1.subTargetMethod());
+  s1.subTargetSetter = "2";
+  Expect.equals("subTargetSetter: 2", lastSetterValue);
+
+  Expect.equals("targetGetter", t1.targetGetter);
+  Expect.equals("targetMethod", t1.targetMethod());
+  t1.targetSetter = "3";
+  Expect.equals("targetSetter: 3", lastSetterValue);
+
+  // Methods not on the instance resolve to extension methods.
+
+  Expect.equals("Target<T>.subTargetGetter", t1.subTargetGetter);
+  Expect.equals("Target<T>.subTargetMethod", t1.subTargetMethod());
+  t1.subTargetSetter = "4";
+  Expect.equals("Target<T>.subTargetSetter: 4", lastSetterValue);
+
+  Expect.type<List<int>>(ti1.typedList);
+  Expect.type<List<int>>(si1.typedList);
+  Expect.type<List<SuperTarget>>(o1.typedList);
+
+  // Extension methods can be called directly using override syntax.
+
+  Expect.equals("SubTarget<T>.targetGetter", E1<num>(si1).targetGetter);
+  Expect.equals("SubTarget<T>.targetMethod", E1<num>(si1).targetMethod());
+  E1<num>(si1).targetSetter = "5";
+  Expect.equals("SubTarget<T>.targetSetter: 5", lastSetterValue);
+
+  Expect.equals("SubTarget<T>.subTargetGetter", E1<num>(si1).subTargetGetter);
+  Expect.equals("SubTarget<T>.subTargetMethod", E1<num>(si1).subTargetMethod());
+  E1<num>(si1).subTargetSetter = "6";
+  Expect.equals("SubTarget<T>.subTargetSetter: 6", lastSetterValue);
+
+  Expect.type<List<num>>(E1<num>(si1).typedList);
+
+  // Applicable methods.
+  Expect.equals("SubTarget<T>.e1", s1.e1());
+  Expect.equals("SubTarget<Object>.e2", s1.e2());
+  Expect.equals("Target<T>.e3", s1.e3());
+  Expect.equals("Target<Object>.e4", s1.e4());
+  Expect.equals("T.e5", s1.e5());
+  Expect.equals("Object.e6", s1.e6());
+
+  Expect.equals("Target<T>.e1", t1.e1());
+  Expect.equals("Target<T>.e2", t1.e2());
+  Expect.equals("Target<T>.e3", t1.e3());
+  Expect.equals("Target<Object>.e4", t1.e4());
+  Expect.equals("T.e5", t1.e5());
+  Expect.equals("Object.e6", t1.e6());
+
+  Expect.equals("T.e1", o1.e1());
+  Expect.equals("T.e2", o1.e2());
+  Expect.equals("T.e3", o1.e3());
+  Expect.equals("T.e4", o1.e4());
+  Expect.equals("T.e5", o1.e5());
+  Expect.equals("Object.e6", o1.e6());
+}
diff --git a/tests/language_2/extension_methods/static_extension_silly_types_test.dart b/tests/language_2/extension_methods/static_extension_silly_types_test.dart
new file mode 100644
index 0000000..3b13f19
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_silly_types_test.dart
@@ -0,0 +1,159 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests extension methods on the non-function, non-class types.
+
+import "dart:async" show FutureOr;
+
+import "package:expect/expect.dart";
+
+void main() {
+  M m = C();
+  Object o = Object();
+  Function fun = () => null;
+  f() => 0;
+  String f1(int x) => "$x";
+  String f2([int x = 0, int y = 0]) => "${x + y}";
+  int i = 0;
+  Future<int> fi = Future<int>.value(0);
+  Future<Future<int>> ffi = Future<Future<int>>.value(fi);
+  FutureOr<FutureOr<int>> foi = 1;
+  Future<Null> fn = Future<Null>.value(null);
+  Null n = null;
+
+  // `on M` matches mixin interface.
+  Expect.equals(1, m.m);
+  // `on void` matches anything.
+  Expect.equals(2, o.v);
+  Expect.equals(2, n.v);
+  // `on dynamic` matches anything.
+  Expect.equals(3, o.d);
+  Expect.equals(3, n.d);
+  // `on Function` matches any function type and Function itself.
+  Expect.equals(4, f.f);
+  Expect.equals(4, fun.f);
+  Expect.equals(4, f1.f);
+  Expect.equals(4, f2.f);
+  // `on <function type>` matches those functions.
+  Expect.equals(5, f1.fu);
+  Expect.equals(5, f2.fu);
+  // `on FutureOr<int>` matches both future and not.
+  Expect.equals(6, i.fi);
+  Expect.equals(6, fi.fi);
+  // `on FutureOr<Object>` matches everything.
+  Expect.equals(7, o.fo);
+  Expect.equals(7, n.fo);
+  // `on FutureOr<Future<Object>>` matches any future or futureOr.
+  Expect.equals(8, fi.ffo);
+  Expect.equals(8, ffi.ffo);
+  // `on FutureOr<Null>` matches Null and FutureOr<Null>.
+  Expect.equals(9, fn.fn);
+  Expect.equals(9, n.fn);
+  // `on Null` does match null. No errors for receiver being null.
+  Expect.equals(10, n.n);
+
+  // Matching can deconstruct static function types.
+  Expect.equals(int, f1.parameterType);
+  Expect.equals(String, f1.returnType);
+  Expect.equals(int, f2.parameterType);
+  Expect.equals(String, f2.returnType);
+  // And static FutureOr types.
+  Expect.equals(int, i.futureType);
+  Expect.equals(int, fi.futureType);
+  Expect.equals(type<Future<int>>(), ffi.futureType);
+  Expect.equals(type<FutureOr<int>>(), foi.futureType);
+  // TODO: Update and enable when
+  //  https://github.com/dart-lang/language/issues/436
+  // is resolved.
+  // Expect.equals(dynamic, n.futureType); // Inference treats `null` as no hint.
+}
+
+Type type<T>() => T;
+
+mixin M {}
+
+class C = Object with M;
+
+
+extension on M {
+  int get m => 1;
+}
+
+extension on void {
+  int get v => 2;
+  testVoid() {
+    // No access on void. Static type of `this` is void!
+    this //
+      .toString() //# 01: compile-time error
+    ;
+  }
+}
+
+extension on dynamic {
+  int get d => 3;
+
+  void testDynamic() {
+    // Static type of `this` is dynamic, allows dynamic invocation.
+    this.arglebargle();
+  }
+}
+
+extension on Function {
+  int get f => 4;
+
+  void testFunction() {
+    // Static type of `this` is Function. Allows any dynamic invocation.
+    this();
+    this(1);
+    this(x: 1);
+    // No function can have both optional positional and named parameters.
+  }
+}
+
+extension on String Function(int) {
+  int get fu => 5;
+}
+
+extension on FutureOr<int> {
+  int get fi => 6;
+
+  void testFutureOr() {
+    var self = this;
+    // The `this` type can be type-promoted to both Future<int> and int.
+    if (self is Future<int>) {
+      self.then((int x) {});
+    } else if (self is int) {
+      self + 2;
+    }
+  }
+}
+
+extension on FutureOr<Object> {
+  int get fo => 7;
+}
+
+extension on FutureOr<Future<Object>> {
+  int get ffo => 8;
+}
+
+extension on FutureOr<Null> {
+  int get fn => 9;
+}
+
+extension on Null {
+  int get n => 10;
+}
+
+// TODO: Type `Never` when it's added.
+
+extension<T> on FutureOr<T> {
+  Type get futureType => T;
+}
+
+extension<R, T> on R Function(T) {
+  Type get returnType => R;
+  Type get parameterType => T;
+}
diff --git a/tests/language_2/extension_methods/static_extension_syntax_test.dart b/tests/language_2/extension_methods/static_extension_syntax_test.dart
new file mode 100644
index 0000000..2e6c811
--- /dev/null
+++ b/tests/language_2/extension_methods/static_extension_syntax_test.dart
@@ -0,0 +1,162 @@
+// 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.
+
+// SharedOptions=--enable-experiment=extension-methods
+
+// Tests extension declaration syntax combinations.
+
+import "package:expect/expect.dart";
+
+void checkStaticType<T>(T x) {
+  Expect.type<T>(x);
+}
+
+main() {
+  Object object = <int>[];
+  List<Object> list = <int>[];
+  List<num> numList = <int>[];
+  Pair<int, double> numPair = Pair(1, 2.5);
+  RecSolution recs = RecSolution();
+
+  Expect.equals(0, object.e0);
+  Expect.equals(0, list.e0);
+
+  Expect.equals(1, object.e1);
+  Expect.equals(1, list.e1);
+
+  Expect.equals(0, object.e4);
+  Expect.equals(0, list.e4);
+  Expect.equals(4, numList.e4);
+
+  Expect.equals(0, object.e5);
+  Expect.equals(0, list.e5);
+  Expect.equals(5, numList.e5);
+
+  Expect.equals(0, object.e6);
+  Expect.equals(6, list.e6);
+  Expect.equals(6, numList.e6);
+  checkStaticType<List<num>>(numList.list6);
+
+  Expect.equals(0, object.e7);
+  Expect.equals(7, list.e7);
+  Expect.equals(7, numList.e7);
+  checkStaticType<List<num>>(numList.list7);
+
+  Expect.equals(10, object.e10);
+  Expect.equals(10, numList.e10);
+  checkStaticType<List<Object>>(object.list10);
+  checkStaticType<List<List<num>>>(numList.list10);
+
+  Expect.equals(11, object.e11);
+  Expect.equals(11, numList.e11);
+  checkStaticType<List<Object>>(object.list11);
+  checkStaticType<List<List<num>>>(numList.list11);
+
+  Expect.equals(0, object.e14);
+  Expect.equals(14, numPair.e14);
+  Expect.type<List<num>>(numPair.list14);
+  checkStaticType<List<num>>(numPair.list14);
+
+  Expect.equals(0, object.e16);
+  Expect.equals(16, numPair.e16);
+  Expect.type<Map<int, double>>(numPair.map16);
+  checkStaticType<Map<int, double>>(numPair.map16);
+
+  Expect.equals(0, object.e17);
+  Expect.equals(0, list.e17);
+  Expect.equals(17, numList.e17);
+  Expect.type<List<num>>(numList.list17);
+  checkStaticType<List<num>>(numList.list17);
+
+  Expect.equals(0, object.e19);
+  Expect.equals(19, recs.e19);
+  Expect.type<RecSolution>(recs.list19);
+  checkStaticType<RecSolution>(recs.list19);
+
+  Expect.equals(0, object.e20);
+  Expect.equals(20, recs.e20);
+  Expect.type<RecSolution>(recs.list20);
+  checkStaticType<RecSolution>(recs.list20);
+}
+
+extension on Object {
+  int get e0 => 0;
+  // Fallbacks to test cases where other extensions do not apply.
+  int get e4 => 0;
+  int get e5 => 0;
+  int get e6 => 0;
+  int get e7 => 0;
+  int get e14 => 0;
+  int get e16 => 0;
+  int get e17 => 0;
+  int get e19 => 0;
+  int get e20 => 0;
+}
+
+extension E1 on Object {
+  int get e1 => 1;
+}
+
+extension on List<num> {
+  int get e4 => 4;
+}
+
+extension E5 on List<num> {
+  int get e5 => 5;
+}
+
+extension<T> on List<T> {
+  int get e6 => 6;
+  List<T> get list6 => <T>[];
+}
+
+extension E7<T> on List<T> {
+  int get e7 => 7;
+  List<T> get list7 => <T>[];
+}
+
+extension<T> on T {
+  int get e10 => 10;
+  List<T> get list10 => <T>[];
+}
+
+extension E11<T> on T {
+  int get e11 => 11;
+  List<T> get list11 => <T>[];
+}
+
+extension<T> on Pair<T, T> {
+  int get e14 => 14;
+  List<T> get list14 => <T>[];
+}
+
+extension E16<S, T> on Pair<S, T> {
+  int get e16 => 16;
+  Map<S, T> get map16 => <S, T>{};
+}
+
+extension<T extends num> on List<T> {
+  int get e17 => 17;
+  List<T> get list17 => <T>[];
+}
+
+extension <T extends Rec<T>> on T {
+  int get e19 => 19;
+  List<T> get list19 => <T>[];
+}
+
+extension E20<T extends Rec<T>> on T {
+  int get e20 => 20;
+  List<T> get list20 => <T>[];
+}
+
+class Pair<A, B> {
+  final A first;
+  final B second;
+  const Pair(this.first, this.second);
+}
+
+class Rec<T extends Rec<T>> {}
+
+class RecSolution extends Rec<RecSolution> {}
diff --git a/tests/language_2/extension_methods/syntax/extension_methods.dart b/tests/language_2/extension_methods/syntax/extension_methods_test.dart
similarity index 100%
rename from tests/language_2/extension_methods/syntax/extension_methods.dart
rename to tests/language_2/extension_methods/syntax/extension_methods_test.dart
diff --git a/tests/language_2/first_class_types_literals_test.dart b/tests/language_2/first_class_types_literals_test.dart
index a3b8186..ced302f 100644
--- a/tests/language_2/first_class_types_literals_test.dart
+++ b/tests/language_2/first_class_types_literals_test.dart
@@ -41,6 +41,7 @@
   Expect.equals(String, 'hest'.runtimeType);
   Expect.equals(double, (0.5).runtimeType);
   Expect.equals(bool, true.runtimeType);
+  Expect.equals(Object, Object().runtimeType);
   Expect.equals(C, new C().runtimeType); // //# 01: ok
   Expect.equals(D, new D().runtimeType); // //# 02: ok
 
diff --git a/tests/language_2/future_or_function_test.dart b/tests/language_2/future_or_function_test.dart
new file mode 100644
index 0000000..2fddb22
--- /dev/null
+++ b/tests/language_2/future_or_function_test.dart
@@ -0,0 +1,10 @@
+// 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:expect/expect.dart';
+
+main() {
+  Expect.subtype<void Function(), FutureOr<void Function()>>();
+}
diff --git a/tests/language_2/generic_function_bounds_test.dart b/tests/language_2/generic_function_bounds_test.dart
index 3ff16d7..c48483b 100644
--- a/tests/language_2/generic_function_bounds_test.dart
+++ b/tests/language_2/generic_function_bounds_test.dart
@@ -5,74 +5,113 @@
 import 'dart:math';
 import 'package:expect/expect.dart';
 
+Type getType<T>() => T;
+
 void testInstantiateToBounds() {
   f<T extends num, U extends T>() => [T, U];
   g<T extends List<U>, U extends int>() => [T, U];
-  h<T extends num, U extends T>(T x, U y) => h.runtimeType.toString();
+  h<T extends U, U extends num>(T x, U y) => [T, U];
 
+  // Check that instantiate to bounds creates the correct type arguments
+  // during dynamic calls.
   Expect.listEquals([num, num], (f as dynamic)());
-  Expect.equals('List<int>|int', (g as dynamic)().join('|'));
-  Expect.equals('<T extends num, U extends T>(T, U) => String',
-      (h as dynamic)(null, null));
+  Expect.listEquals([getType<List<int>>(), int], (g as dynamic)());
+  Expect.listEquals([num, num], (h as dynamic)(null, null));
 
+  // Check that when instantiate to bounds creates a super-bounded type argument
+  // during a dynamic call, an error is thrown.
   i<T extends Iterable<T>>() => null;
   j<T extends Iterable<S>, S extends T>() => null;
-  Expect.throws(
-      () => (i as dynamic)(), (e) => '$e'.contains('Instantiate to bounds'));
-  Expect.throws(
-      () => (j as dynamic)(), (e) => '$e'.contains('Instantiate to bounds'));
+  Expect.throwsTypeError(() => (i as dynamic)(), "Super bounded type argument");
+  Expect.throwsTypeError(() => (j as dynamic)(), "Super bounded type argument");
 }
 
 void testChecksBound() {
   f<T extends num>(T x) => x;
-  Expect.equals((f as dynamic)(42), 42);
-  Expect.throws(() => (f as dynamic)('42'));
-
-  msg(t1, t2, tf) => Expect.throws(() => (f as dynamic)<Object>(42),
-      (e) => '$e' == 'type `Object` does not extend `num` of `T');
-
   g<T extends U, U extends num>(T x, U y) => x;
-  Expect.equals((g as dynamic)(42.0, 100), 42.0);
-  Expect.throws(() => (g as dynamic)('hi', 100));
-  Expect.throws(() => (g as dynamic)<double, int>(42.0, 100),
-      (e) => '$e' == 'type `double` does not extend `int` of `T`.');
 
-  Expect.throws(() => (g as dynamic)<num, Object>(42.0, 100),
-      (e) => '$e' == 'type `Object` does not extend `num` of `U`.');
+  // Check that arguments are checked against the correct types when instantiate
+  // to bounds produces a type argument during a dynamic call.
+  Expect.equals((f as dynamic)(42), 42);
+  Expect.equals((g as dynamic)(42.0, 100), 42.0);
+  Expect.throwsTypeError(() => (f as dynamic)('42'), "Argument check");
+  Expect.throwsTypeError(() => (g as dynamic)('hi', 100), "Argument check");
+
+  // Check that an actual type argument is checked against the bound during a
+  // dynamic call.
+  Expect.equals((f as dynamic)<int>(42), 42);
+  Expect.equals((g as dynamic)<double, num>(42.0, 100), 42.0);
+  Expect.throwsTypeError(() => (g as dynamic)<double, int>(42.0, 100),
+      "Type argument bounds check");
+  Expect.throwsTypeError(
+      () => (f as dynamic)<Object>(42), "Type argument bounds check");
+  Expect.throwsTypeError(() => (g as dynamic)<double, int>(42.0, 100),
+      "Type argument bounds check");
+  Expect.throwsTypeError(() => (g as dynamic)<num, Object>(42.0, 100),
+      "Type argument bounds check");
 }
 
-typedef G<U> = T Function<T extends U>(T x);
+typedef G<U> = num Function<T extends U>(T x);
+
+typedef F<U> = Object Function<T extends U>(T x);
 
 void testSubtype() {
-  f<T extends num>(T x) => x + 2;
-
+  num f<T extends num>(T x) => x + 2;
   dynamic d = f;
-  Expect.equals(d(40.0), 42.0);
-  Expect.equals((f as G<int>)(40), 42);
-  Expect.equals((d as G<int>)(40), 42);
-  Expect.equals((f as G<double>)(40.0), 42.0);
-  Expect.equals((d as G<double>)(40.0), 42.0);
 
-  d as G<Null>;
-  Expect.throws(() => d as G);
-  Expect.throws(() => d as G<Object>);
-  Expect.throws(() => d as G<String>);
+  // Check that casting to an equal generic function type works
+  Expect.equals((f as G<num>)(40), 42);
+  Expect.equals((d as G<num>)(40), 42);
+
+  // Check that casting to a more general generic function type works
+  Expect.equals((f as F<num>)(40), 42);
+  Expect.equals((d as F<num>)(40), 42);
+
+  // Check that casting to a generic function with more specific bounds fails
+  Expect.throwsCastError(
+      () => (f as G<int>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (d as G<int>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (f as G<double>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (d as G<double>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (f as G<Null>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (d as G<Null>), "Generic functions are invariant");
+
+  // Check that casting to a generic function with a more general bound fails
+  Expect.throwsCastError(
+      () => (f as G<Object>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (d as G<Object>), "Generic functions are invariant");
+
+  // Check that casting to a generic function with an unrelated bound fails
+  Expect.throwsCastError(
+      () => (f as G<String>), "Generic functions are invariant");
+  Expect.throwsCastError(
+      () => (d as G<String>), "Generic functions are invariant");
 }
 
 void testToString() {
-  // TODO(jmesserly): I don't think the cast on `y` should be required.
-  num f<T extends num, U extends T>(T x, U y) => min(x, y as num);
+  num f<T extends num, U extends T>(T x, U y) => min(x, y);
   num g<T, U>(T x, U y) => max(x as num, y as num);
   String h<T, U>(T x, U y) => h.runtimeType.toString();
-  Expect.equals(
-      f.runtimeType.toString(), '<T extends num, U extends T>(T, U) => num');
-  Expect.equals(g.runtimeType.toString(), '<T, U>(T, U) => num');
-  Expect.equals(h(42, 123.0), '<T, U>(T, U) => String');
+
+  // Check that generic method types are printed in a reasonable way
+  Expect.isTrue(
+      new RegExp(r'<(\w+) extends num, (\w+) extends \1>\(\1, \2\) => num')
+          .hasMatch(f.runtimeType.toString()));
+  Expect.isTrue(new RegExp(r'<(\w+), (\w+)>\(\1, \2\) => num')
+      .hasMatch(g.runtimeType.toString()));
+  Expect.isTrue(
+      new RegExp(r'<(\w+), (\w+)>\(\1, \2\) => String').hasMatch(h(42, 123.0)));
 }
 
 main() {
-  testInstantiateToBounds();
-  testToString();
-  testChecksBound();
-  testSubtype();
+  testInstantiateToBounds(); //# 01: ok
+  testToString(); //# 02: ok
+  testChecksBound(); //# 03: ok
+  testSubtype(); //# 04: ok
 }
diff --git a/tests/language_2/generic_instanceof2_test.dart b/tests/language_2/generic_instanceof2_test.dart
index 2998bc7..e8a28e3 100644
--- a/tests/language_2/generic_instanceof2_test.dart
+++ b/tests/language_2/generic_instanceof2_test.dart
@@ -38,11 +38,13 @@
   Expect.isTrue(foo_int_num.FooString() is Foo<int, String>);
 
   var foo_raw = new Foo();
-  Expect.isTrue(foo_raw is Foo<int, num>);
-  Expect.isTrue(foo_raw is Foo<int, String>);
+  Expect.isTrue(foo_raw is! Foo<int, num>);
+  Expect.isTrue(foo_raw is! Foo<int, String>);
+  Expect.isTrue(foo_raw is Foo<dynamic, dynamic>);
   // foo_raw.FooString() returns a Foo<dynamic, String>
   Expect.isTrue(foo_raw.FooString() is! Foo<int, num>);
-  Expect.isTrue(foo_raw.FooString() is Foo<int, String>);
+  Expect.isTrue(foo_raw.FooString() is! Foo<int, String>);
+  Expect.isTrue(foo_raw.FooString() is Foo<dynamic, String>);
 
   var moo_int_num = new Moo<int, num>();
   Expect.isTrue(moo_int_num is Moo<int, num>);
@@ -52,11 +54,13 @@
   Expect.isTrue(moo_int_num.MooString() is Moo<int, String>);
 
   var moo_raw = new Moo();
-  Expect.isTrue(moo_raw is Moo<int, num>);
-  Expect.isTrue(moo_raw is Moo<int, String>);
+  Expect.isTrue(moo_raw is! Moo<int, num>);
+  Expect.isTrue(moo_raw is! Moo<int, String>);
+  Expect.isTrue(moo_raw is Moo<dynamic, dynamic>);
   // moo_raw.MooString() returns a Moo<dynamic, String>
   Expect.isTrue(moo_raw.MooString() is! Moo<int, num>);
-  Expect.isTrue(moo_raw.MooString() is Moo<int, String>);
+  Expect.isTrue(moo_raw.MooString() is! Moo<int, String>);
+  Expect.isTrue(moo_raw.MooString() is Moo<dynamic, String>);
 }
 
 main() {
diff --git a/tests/language_2/inv_cse_licm.dart b/tests/language_2/inv_cse_licm.dart
index 6bb89445..43624cb 100644
--- a/tests/language_2/inv_cse_licm.dart
+++ b/tests/language_2/inv_cse_licm.dart
@@ -2,17 +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=--deterministic --enable-inlining-annotations --optimization_counter_threshold=10
+// VMOptions=--deterministic--optimization_counter_threshold=10
 
 import 'dart:typed_data';
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 // Tests a few situations in which invariant instructions
 // can be subject to CSE and LICM.
 
-@NeverInline
+@pragma('vm:never-inline')
 int cse1(Int32List a, int n) {
   int x = a[0];
   for (int i = 0; i < n; i++) {
@@ -23,7 +21,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int cse2(Int32List a, int n) {
   int x = a[0];
   for (int i = 0; i < n; i++) {
@@ -35,7 +33,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm1(Int32List a, int n) {
   int x = 0;
   for (int i = 0; i < n; i++) {
@@ -46,7 +44,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm2(Int32List a) {
   int x = 0;
   for (int i = 0; i < 16; i++) {
@@ -57,7 +55,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm3(Int32List a, bool cond) {
   int x = 0;
   for (int i = 0; i < 16; i++) {
@@ -69,7 +67,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm3_brk(Int32List a, bool cond) {
   int x = 0;
   for (int i = 0; i < 16; i++) {
@@ -84,7 +82,7 @@
 
 int global;
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm4(Int32List a) {
   int x = 0;
   for (int i = 0; i < 16; i++) {
@@ -97,7 +95,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm5(Int32List a) {
   int x = 0;
   // Anything in the loop header can be LICMed.
@@ -107,7 +105,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm6(Int32List a, int n) {
   int x = 0;
   int i = 0;
@@ -119,7 +117,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm7(Int32List a, int n) {
   int x = 0;
   int i = 0;
@@ -132,7 +130,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm8(Int32List a, int n) {
   int x = 0;
   int i = 0;
@@ -144,7 +142,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm9(Int32List a) {
   int x = 0;
   int i = 0;
@@ -157,7 +155,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm10(Int32List a, bool cond) {
   int x = 0;
   int i = 0;
@@ -172,7 +170,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm10_brk(Int32List a, bool cond) {
   int x = 0;
   int i = 0;
@@ -187,7 +185,7 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm11(Int32List a) {
   int x = 0;
   while (true) {
@@ -198,12 +196,12 @@
   return x;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int foo() {
   return global--;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int licm12(Int32List a) {
   int x = 0;
   int i = 0;
diff --git a/tests/language_2/language_2_analyzer.status b/tests/language_2/language_2_analyzer.status
index 2a073ac..57ab84a 100644
--- a/tests/language_2/language_2_analyzer.status
+++ b/tests/language_2/language_2_analyzer.status
@@ -71,12 +71,10 @@
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test: CompileTimeError
 mixin_super_use_test: CompileTimeError
-mock_writable_final_private_field_test: CompileTimeError # failing-by-design, see Issue #34377
 nested_generic_closure_test: CompileTimeError # Issue #28515
 no_main_test/01: Fail # failing-by-design, the analyzer has no restriction that a library include a main function.
 no_such_constructor2_test: StaticWarning
 override_inheritance_field_test/42: CompileTimeError
-parser_quirks_test: CompileTimeError
 part_of_multiple_libs_test/01: MissingCompileTimeError # Issue 33227
 part_refers_to_core_library_test/01: MissingCompileTimeError # Issue 29709
 prefix_shadow_test/01: MissingCompileTimeError # Issue 33005
diff --git a/tests/language_2/language_2_dart2js.status b/tests/language_2/language_2_dart2js.status
index 8f1b289..c60a962 100644
--- a/tests/language_2/language_2_dart2js.status
+++ b/tests/language_2/language_2_dart2js.status
@@ -29,7 +29,6 @@
 compile_time_constant_static5_test/16: CompileTimeError
 compile_time_constant_static5_test/21: CompileTimeError
 compile_time_constant_static5_test/23: CompileTimeError
-conditional_rewrite_test: RuntimeError
 config_import_corelib_test: CompileTimeError # we need a special platform.dill file for categories=all. Once we fix that, all dart:* are supported when using '--categories=all' so this will become a RuntimeError, OK.
 config_import_test: RuntimeError # Test flag is not passed to the compiler.
 const_constructor3_test/04: MissingCompileTimeError # OK - Subtype check uses JS number semantics.
@@ -40,7 +39,6 @@
 const_map3_test/00: MissingCompileTimeError
 const_switch_test/02: RuntimeError, OK # constant identity based on JS constants
 const_switch_test/04: RuntimeError, OK # constant identity based on JS constants
-constructor12_test: RuntimeError
 constructor_named_arguments_test/none: RuntimeError
 covariant_subtyping_test: Crash # Unsupported operation: Unsupported type parameter type node E.
 ct_const_test: RuntimeError
@@ -74,7 +72,6 @@
 function_subtype_inline2_test: RuntimeError
 generic_function_bounds_test: RuntimeError
 generic_function_dcall_test/01: RuntimeError
-generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_methods_bounds_test/02: MissingRuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
@@ -160,7 +157,6 @@
 mixin_illegal_superclass_test/30: MissingCompileTimeError
 mixin_method_override_test/G5: Skip # Issue 34354
 mock_writable_final_field_test: RuntimeError # Issue 30847
-mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
 named_parameters_default_eq_test/none: RuntimeError
 nan_identical_test: RuntimeError # Issue 11551
@@ -170,7 +166,6 @@
 number_identity2_test: RuntimeError
 number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 numbers_test: RuntimeError, OK # non JS number semantics
-parser_quirks_test: CompileTimeError
 partial_instantiation_eager_bounds_check_test: RuntimeError # Issue #34295
 partial_tearoff_instantiation_test/05: Pass # for the wrong reason.
 partial_tearoff_instantiation_test/06: Pass # for the wrong reason.
@@ -251,6 +246,10 @@
 stacktrace_test: RuntimeError
 
 [ $compiler == dart2js && $system == windows ]
+canonicalization_hashing_memoize_array_test: Skip # Issue 37631
+canonicalization_hashing_memoize_instance_test: Skip # Issue 37631
+canonicalization_hashing_shallow_collision_array_test: Skip # Issue 37631
+canonicalization_hashing_shallow_collision_instance_test: Skip # Issue 37631
 string_literals_test: Pass, RuntimeError # Failures on dart2js-win7-chrome-4-4-be and dart2js-win7-ie11ff-4-4-be
 
 [ $compiler == dart2js && $checked ]
@@ -455,7 +454,6 @@
 mixin_mixin_test: RuntimeError
 mixin_type_parameters_super_test: RuntimeError
 mock_writable_final_field_test: RuntimeError # Issue 30847
-mock_writable_final_private_field_test: RuntimeError # Issue 17526, 30847
 modulo_test: RuntimeError # non JS number semantics
 nan_identical_test: RuntimeError # Issue 11551
 no_main_test/01: CompileTimeError
diff --git a/tests/language_2/language_2_dartdevc.status b/tests/language_2/language_2_dartdevc.status
index b2b9294..f23a8de 100644
--- a/tests/language_2/language_2_dartdevc.status
+++ b/tests/language_2/language_2_dartdevc.status
@@ -40,6 +40,7 @@
 execute_finally6_test: RuntimeError # Issue 29920
 expect_test: RuntimeError # Issue 29920
 export_private_test/01: MissingCompileTimeError # Issue 29920
+extension_methods/*: SkipByDesign # Analyzer DDC is expected to be turned down before releasing extension methods.
 f_bounded_quantification2_test: CompileTimeError # Issue 34583
 f_bounded_quantification3_test: RuntimeError # Issue 29920
 f_bounded_quantification4_test: CompileTimeError # Issue 34583
@@ -104,7 +105,6 @@
 mixin_method_override_test/01: MissingCompileTimeError
 mixin_super_2_test: CompileTimeError # Issue 34806
 mixin_super_use_test: CompileTimeError # Issue 34806
-mock_writable_final_private_field_test: CompileTimeError # Issue 30848
 nested_generic_closure_test: CompileTimeError
 nnbd/*: Skip
 override_inheritance_field_test/42: CompileTimeError
@@ -245,7 +245,6 @@
 mixin_illegal_superclass_test/30: MissingCompileTimeError
 mixin_super_2_test: RuntimeError # Issue 34807
 mixin_super_use_test: RuntimeError # Issue 34808
-mock_writable_final_private_field_test: RuntimeError
 multiline_newline_test/04: MissingCompileTimeError
 multiline_newline_test/04r: MissingCompileTimeError
 multiline_newline_test/05: MissingCompileTimeError
@@ -308,7 +307,6 @@
 const_list_test: RuntimeError # Expect.equals(expected: <false>, actual: <true>) fails.
 const_switch_test/02: RuntimeError # Issue 29920; Expect.equals(expected: <0>, actual: <0.0>) fails.
 const_switch_test/04: RuntimeError # Ints and doubles are unified.; Expect.equals(expected: <1>, actual: <1.0>) fails.
-constructor12_test: RuntimeError # Issue 29920; ReferenceError: JSArrayOfT is not defined
 ct_const_test: RuntimeError # Issue 2992; RangeError: Maximum call stack size exceeded
 cyclic_type2_test: RuntimeError # Issue 29920; Uncaught ReferenceError: V is not defined
 cyclic_type_test/02: RuntimeError # Issue 29920; Uncaught RangeError: Maximum call stack size exceeded
@@ -370,7 +368,6 @@
 number_identity2_test: RuntimeError # Issue 29920; Expect.isTrue(false) fails.
 number_identity_test: CompileTimeError, OK # Error if web int literal cannot be represented exactly, see http://dartbug.com/33351
 numbers_test: RuntimeError # Issue 29920; Expect.equals(expected: <false>, actual: <true>) fails.
-parser_quirks_test: CompileTimeError
 regress_16640_test: RuntimeError # Issue 29920; Uncaught Error: type arguments should not be null: E => {
 regress_22443_test: RuntimeError # Uncaught Expect.isTrue(false) fails.
 stack_overflow_stacktrace_test: RuntimeError # Issue 29920; RangeError: Maximum call stack size exceeded
diff --git a/tests/language_2/language_2_kernel.status b/tests/language_2/language_2_kernel.status
index d17264f9..8c9269b 100644
--- a/tests/language_2/language_2_kernel.status
+++ b/tests/language_2/language_2_kernel.status
@@ -28,14 +28,12 @@
 compile_time_constant_static5_test/23: CompileTimeError
 conditional_import_string_test: CompileTimeError
 conditional_import_test: CompileTimeError
-conditional_rewrite_test: RuntimeError
 config_import_corelib_test: CompileTimeError
 config_import_test: RuntimeError
 const_list_test: RuntimeError
 const_locals_test: RuntimeError
 const_nested_test: RuntimeError
 const_string_test: RuntimeError
-constructor12_test: RuntimeError
 covariant_subtyping_test: RuntimeError
 ct_const_test: RuntimeError
 cyclic_type2_test: CompileTimeError
@@ -58,7 +56,6 @@
 function_propagation_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
 generic_function_bounds_test: RuntimeError
-generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError
 generic_no_such_method_dispatcher_test: CompileTimeError
@@ -115,7 +112,6 @@
 no_main_test/01: Crash
 no_such_method_mock_test: RuntimeError
 null_no_such_method_test: CompileTimeError
-parser_quirks_test: CompileTimeError
 regress_22443_test: RuntimeError
 regress_23408_test: CompileTimeError
 regress_29025_test: CompileTimeError
@@ -241,7 +237,6 @@
 multiline_newline_test/06: MissingCompileTimeError
 multiline_newline_test/06r: MissingCompileTimeError
 null_no_such_method_test: CompileTimeError
-parser_quirks_test: CompileTimeError
 regress_23408_test: CompileTimeError
 regress_29025_test: CompileTimeError
 regress_29405_test: CompileTimeError
@@ -589,7 +584,6 @@
 config_import_test: RuntimeError # KernelVM bug: Configurable imports.
 const_evaluation_test: SkipByDesign
 const_list_test: RuntimeError
-constructor12_test: RuntimeError
 constructor3_test: Fail, OK, Pass
 ct_const2_test: Skip # Incompatible flag: --compile_all
 ct_const_test: RuntimeError
@@ -620,7 +614,6 @@
 for_in_side_effects_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_methods_recursive_bound_test/03: Pass
 generic_methods_recursive_bound_test/03: MissingRuntimeError
@@ -691,7 +684,6 @@
 null_test/mirrors: Skip # Uses mirrors.
 null_test/none: SkipByDesign
 overridden_no_such_method_test: SkipByDesign
-parser_quirks_test: CompileTimeError # Issue 31533
 redirecting_factory_reflection_test: SkipByDesign
 regress_13462_0_test: SkipByDesign
 regress_13462_1_test: SkipByDesign
@@ -815,7 +807,6 @@
 [ $compiler == dartkp && $runtime == dart_precompiled && !$checked ]
 assertion_initializer_const_error_test/01: MissingCompileTimeError
 assertion_initializer_const_function_error_test/01: MissingCompileTimeError
-conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
 implicit_downcast_during_combiner_test: RuntimeError
 implicit_downcast_during_compound_assignment_test: RuntimeError
 implicit_downcast_during_conditional_expression_test: RuntimeError
@@ -886,7 +877,6 @@
 regress_30339_test: RuntimeError
 
 [ $runtime == vm && !$checked && ($compiler == dartk || $compiler == dartkb) ]
-conditional_rewrite_test: RuntimeError # Issue 31402 (Not)
 type_error_test: RuntimeError # Issue 31402 (Variable declaration)
 
 # ===== dartk + vm status lines =====
@@ -915,7 +905,6 @@
 const_locals_test: RuntimeError
 const_nested_test: RuntimeError # KernelVM bug: Constant evaluation.
 const_string_test: RuntimeError
-constructor12_test: RuntimeError
 constructor3_test: Fail, OK, Pass
 covariant_subtyping_test: RuntimeError
 ct_const2_test: Pass, Crash # Flaky
@@ -942,7 +931,6 @@
 for_in_side_effects_test/01: MissingCompileTimeError
 function_propagation_test: RuntimeError
 function_subtype_inline2_test: RuntimeError
-generic_instanceof2_test: RuntimeError
 generic_is_check_test: RuntimeError
 generic_no_such_method_dispatcher_simple_test: CompileTimeError # Issue 31533
 generic_no_such_method_dispatcher_test: CompileTimeError # Issue 31533
@@ -980,7 +968,6 @@
 no_main_test/01: DartkCrash
 no_such_method_mock_test: RuntimeError # Issue 31426
 null_no_such_method_test: CompileTimeError # Issue 31533
-parser_quirks_test: CompileTimeError # Issue 31533
 regress_22443_test: RuntimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_23408_test: RuntimeError, CompileTimeError # KernelVM bug: Deferred loading kernel issue 30273.
 regress_29025_test: CompileTimeError # Issue 31402 (Variable declaration)
@@ -1046,7 +1033,6 @@
 generic_function_bounds_test: RuntimeError # Issue 32076
 
 [ $compiler == dartkb || $compiler == dartkp ]
-mock_writable_final_private_field_test: CompileTimeError # Test uses Symbol("_...") which is a compile-time error.
 set_literals/invalid_set_literal_test/29: Pass # Gen_kernel does does constant
 set_literals/invalid_set_literal_test/30: Pass # evalutation, so these tests
 set_literals/invalid_set_literal_test/31: Pass # throw the expected errors. The
diff --git a/tests/language_2/mock_writable_final_private_field_test.dart b/tests/language_2/mock_writable_final_private_field_test.dart
deleted file mode 100644
index c592878..0000000
--- a/tests/language_2/mock_writable_final_private_field_test.dart
+++ /dev/null
@@ -1,44 +0,0 @@
-// 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 'package:expect/expect.dart';
-
-final values = <int>[];
-
-class Mock {
-  noSuchMethod(Invocation i) {
-    // See dartbug.com/34904 for why we have to do this dance with symbols.
-    var expected = i.isGetter ? const Symbol("_x") : const Symbol("_x=");
-    Expect.equals(expected.toString(), i.memberName.toString());
-    values.add(i.positionalArguments[0]);
-  }
-}
-
-class Foo {
-  // Prevent obfuscation of '_x'.
-  @pragma("vm:entry-point")
-  int _x;
-}
-
-class Bar extends Mock implements Foo {
-  final int _x = 42;
-}
-
-void main() {
-  {
-    Bar b = new Bar();
-    Expect.equals(b._x, 42);
-    b._x = 123;
-    Expect.listEquals([123], values);
-    values.clear();
-  }
-  {
-    // It works the same if called statically through the Foo interface.
-    Foo b = new Bar();
-    Expect.equals(b._x, 42);
-    b._x = 123;
-    Expect.listEquals([123], values);
-    values.clear();
-  }
-}
diff --git a/tests/language_2/nested_generic_closure_test.dart b/tests/language_2/nested_generic_closure_test.dart
index 1c5925c..c5ef032 100644
--- a/tests/language_2/nested_generic_closure_test.dart
+++ b/tests/language_2/nested_generic_closure_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.
 
-// TODO(37452): Avoid using unspecified 'toString' behaviour in language test.
-
 import 'package:expect/expect.dart';
 
 void foo(F f<F>(F f)) {}
@@ -11,7 +9,7 @@
 B bar<B>(B g<F>(F f)) => null;
 
 Function baz<B>() {
-  B foo<F>(F f) => null;
+  B foo<F>(B b, F f) => null;
   return foo;
 }
 
@@ -25,34 +23,27 @@
 }
 
 main() {
-  expectOne(
-    foo.runtimeType.toString(),
-    ["(<F>(F) => F) => void", "(<T1>(T1) => T1) => void"],
-  );
-  expectOne(
-    bar.runtimeType.toString(),
-    ["<B>(<F>(F) => B) => B", "<T1>(<T2>(T2) => T1) => T1"],
-  );
-  expectOne(
-    baz<int>().runtimeType.toString(),
-    ["<F>(F) => int", "<T1>(T1) => int"],
-  );
+  // Check the run-time type of the functions with generic parameters.
 
-  var c = new C<bool>();
-  expectOne(
-    c.foo.runtimeType.toString(),
-    ["(<F>(bool, F) => F) => void", "(<T1>(bool, T1) => T1) => void"],
-  );
-  expectOne(
-    c.bar.runtimeType.toString(),
-    ["<B>(<F>(bool, F) => B) => B", "<T1>(<T2>(bool, T2) => T1) => T1"],
-  );
-  expectOne(
-    c.baz<int>().runtimeType.toString(),
-    ["<F>(bool, F) => int", "<T1>(bool, T1) => int"],
-  );
-}
+  Expect.type<void Function(X Function<X>(X))>(foo);
 
-expectOne(String name, Iterable<String> names) {
-  Expect.isTrue(names.contains(name), '"$name" should be one of: ${names}');
+  Expect.isTrue(bar is X1 Function<X1>(X1 Function<X2>(X2)));
+
+  Expect.isTrue(baz<int>() is int Function<X1>(int, X1));
+  Expect.isTrue(baz<Object>() is Object Function<X1>(Object, X1));
+  Expect.isTrue(baz<Null>() is Null Function<X1>(Null, X1));
+
+  void testC<T>() {
+    var c = new C<T>();
+
+    Expect.type<void Function(F Function<F>(T, F))>(c.foo);
+
+    Expect.isTrue(c.bar is X1 Function<X1>(X1 Function<X2>(T, X2)));
+
+    Expect.isTrue(c.baz<int>() is int Function<X1>(T, X1));
+  }
+
+  testC<bool>();
+  testC<Object>();
+  testC<Null>();
 }
diff --git a/tests/language_2/nnbd/static_errors/non_null_assertion_test.dart b/tests/language_2/nnbd/static_errors/non_null_assertion_test.dart
new file mode 100644
index 0000000..670a5b0
--- /dev/null
+++ b/tests/language_2/nnbd/static_errors/non_null_assertion_test.dart
@@ -0,0 +1,13 @@
+// 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+void main() {
+  void x;
+  int i;
+  int? iq;
+  x!; //# 00: compile-time error
+  i!; //# 01: compile-time error
+  iq!; //# 02: ok
+}
diff --git a/tests/language_2/nnbd/static_errors/not_initialized_non_nullable_instance_field_test.dart b/tests/language_2/nnbd/static_errors/not_initialized_non_nullable_instance_field_test.dart
new file mode 100644
index 0000000..e48202d
--- /dev/null
+++ b/tests/language_2/nnbd/static_errors/not_initialized_non_nullable_instance_field_test.dart
@@ -0,0 +1,40 @@
+// 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+// Test that it is an error if an instance field with potentially non-nullable
+// type has no initializer expression and is not initialized in a constructor
+// via an initializing formal or an initializer list entry, unless the field is
+// marked with the `late` modifier.
+void main() {}
+
+class A {
+  int v = 0; //# 01: ok
+  int? v; //# 02: ok
+  int? v = 0; //# 03: ok
+  dynamic v; //# 04: ok
+  var v; //# 05: ok
+  void v; //# 06: ok
+
+  int v; A(this.v); //# 07: ok
+
+  int v; A() : v = 0; //# 08: ok
+
+  int v; //# 09: compile-time error
+
+  Never v; //# 10: compile-time error
+
+  int v; A(); //# 11: compile-time error
+
+  int v; A(this.v); A.second(); //# 12: compile-time error
+}
+
+class B<T> {
+  T v; //# 13: compile-time error
+
+  T? v; //# 14: ok
+
+  T v; B(this.v); //# 15: ok
+}
diff --git a/tests/language_2/nnbd/static_errors/nullable_function_types_test.dart b/tests/language_2/nnbd/static_errors/nullable_function_types_test.dart
index 714ecb8..dd994cd 100644
--- a/tests/language_2/nnbd/static_errors/nullable_function_types_test.dart
+++ b/tests/language_2/nnbd/static_errors/nullable_function_types_test.dart
@@ -14,7 +14,7 @@
   Function? nf2;
   C c1 = new C();
   C? nc1;
-  var nf3 = c1?.call;
+  var nf3 = nc1?.call;
   Object? object;
 
 
diff --git a/tests/language_2/nnbd/static_errors/this_reference_in_late_field_test.dart b/tests/language_2/nnbd/static_errors/this_reference_in_late_field_test.dart
new file mode 100644
index 0000000..84c36f4
--- /dev/null
+++ b/tests/language_2/nnbd/static_errors/this_reference_in_late_field_test.dart
@@ -0,0 +1,15 @@
+// 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:expect/expect.dart";
+
+// SharedOptions=--enable-experiment=non-nullable
+void main() {
+  final c = C();
+  Expect.identical(c, c);
+}
+
+class C {
+  var x = this; //# 00: compile-time error
+  late x = this; //# 01: ok
+}
diff --git a/tests/language_2/nnbd/static_errors/unchecked_use_of_nullable_test.dart b/tests/language_2/nnbd/static_errors/unchecked_use_of_nullable_test.dart
index 9043d0e..caa0b7e 100644
--- a/tests/language_2/nnbd/static_errors/unchecked_use_of_nullable_test.dart
+++ b/tests/language_2/nnbd/static_errors/unchecked_use_of_nullable_test.dart
@@ -206,3 +206,47 @@
   for(var i in dyn) {}; //# 160: ok
   await for(var i in dyn) {}; //# 161: ok
 }
+
+void nullUses() async {
+  List<Null> nullList;
+  Null _null;
+  _null.isEven; //# 162: compile-time error
+  _null.round(); //# 163: compile-time error
+  _null.toString(); //# 164: ok
+  _null.hashCode; //# 165: ok
+  _null.runtimeType; //# 166: ok
+  _null.noSuchMethod(Invocation.method(#toString, [])); //# 167: ok
+  _null + 4; //# 165: compile-time error
+  -_null; //# 169: compile-time error
+  _null++; //# 170: compile-time error
+  ++null; //# 171: compile-time error
+  _null..isEven; //# 172: compile-time error
+  _null[3]; //# 170: compile-time error
+  _null[3] = 0; //# 171: compile-time error
+  _null += 4; //# 172: compile-time error
+  _null ??= _null; //# 176: ok
+  _null.round; //# 177: compile-time error
+  _null.toString; //# 178: ok
+  _null.noSuchMethod; //# 179: ok
+  _null(); //# 180: compile-time error
+  nullList[3](); //# 178: compile-time error
+  nullList.single(); //# 182: compile-time error
+  throw _null; //# 183: compile-time error
+  _null || true; //# 184: compile-time error
+  true || _null; //# 185: compile-time error
+  _null && true; //# 186: compile-time error
+  true && _null; //# 187: compile-time error
+  !_null; //# 188: compile-time error
+  _null ? _null : _null; //# 189: compile-time error
+  if (_null) {} //# 190: compile-time error
+  while (_null) {} //# 191: compile-time error
+  for (;_null;) {} //# 192: compile-time error
+  do {} while (_null); //# 193: compile-time error
+  _null!; //# 194: ok
+  _null ?? _null; //# 195: ok
+  _null == _null; //# 196: ok
+  _null != _null; //# 197: ok
+  _null?.toString(); //# 198: ok
+  for(var i in _null) {}; //# 199: compile-time error
+  await for(var i in _null) {}; //# 200: compile-time error
+}
diff --git a/tests/language_2/nnbd/syntax/non_null_assertion_test.dart b/tests/language_2/nnbd/syntax/non_null_assertion_test.dart
new file mode 100644
index 0000000..e9c2717
--- /dev/null
+++ b/tests/language_2/nnbd/syntax/non_null_assertion_test.dart
@@ -0,0 +1,75 @@
+// 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.
+
+// SharedOptions=--enable-experiment=non-nullable
+
+// Test that the trailing "!" is accepted after a sampling of expression
+// syntaxes.  Verify that the compiler understands the resulting type to be
+// non-nullable by constructing a list containing the expression, and assigning
+// it to List<Object>.  Where possible, verify that the runtime implements the
+// proper null-check semantics by verifying that the presence of `null` causes
+// an exception to be thrown.
+import 'package:expect/expect.dart';
+
+class C {
+  const C();
+
+  Object? get x => null;
+
+  void f() {}
+}
+
+Object? f() => null;
+
+main() {
+  List<Object> listOfObject = [];
+
+  var x1 = [0!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x1;
+
+  var x2 = [true!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x2;
+
+  var x3 = ["foo"!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x3;
+
+  var x4 = [#foo!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x4;
+
+  var x5 = [[1]!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x5;
+
+  var x6 = [{1:2}!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x6;
+
+  var x7 = [{1}!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x7;
+
+  var x8 = [new C()!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x8;
+
+  var x9 = [const C()!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x9;
+
+  Expect.throws(() {
+      var x10 = [f()!];
+      listOfObject = x10;
+  });
+
+  C c = new C();
+  Expect.throws(() {
+      var x11 = [c.x!];
+      listOfObject = x11;
+  });
+
+  var g = f;
+  Expect.throws(() {
+      var x12 = [g()!];
+      listOfObject = x12;
+  });
+
+  int i = 0;
+  var x13 = [i++!]; // ignore: unnecessary_non_null_assertion
+  listOfObject = x13;
+}
diff --git a/tests/language_2/nnbd/syntax/null_assertion_test.dart b/tests/language_2/nnbd/syntax/null_assertion_test.dart
deleted file mode 100644
index 6acea53..0000000
--- a/tests/language_2/nnbd/syntax/null_assertion_test.dart
+++ /dev/null
@@ -1,75 +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.
-
-// SharedOptions=--enable-experiment=non-nullable
-
-// Test that the trailing "!" is accepted after a sampling of expression
-// syntaxes.  Verify that the compiler understands the resulting type to be
-// non-nullable by constructing a list containing the expression, and assigning
-// it to List<Object>.  Where possible, verify that the runtime implements the
-// proper null-check semantics by verifying that the presence of `null` causes
-// an exception to be thrown.
-import 'package:expect/expect.dart';
-
-class C {
-  const C();
-
-  Object? get x => null;
-
-  void f() {}
-}
-
-Object? f() => null;
-
-main() {
-  List<Object> listOfObject = [];
-
-  var x1 = [0!];
-  listOfObject = x1;
-
-  var x2 = [true!];
-  listOfObject = x2;
-
-  var x3 = ["foo"!];
-  listOfObject = x3;
-
-  var x4 = [#foo!];
-  listOfObject = x4;
-
-  var x5 = [[1]!];
-  listOfObject = x5;
-
-  var x6 = [{1:2}!];
-  listOfObject = x6;
-
-  var x7 = [{1}!];
-  listOfObject = x7;
-
-  var x8 = [new C()!];
-  listOfObject = x8;
-
-  var x9 = [const C()!];
-  listOfObject = x9;
-
-  Expect.throws(() {
-      var x10 = [f()!];
-      listOfObject = x10;
-  });
-
-  C c = new C();
-  Expect.throws(() {
-      var x11 = [c.x!];
-      listOfObject = x11;
-  });
-
-  var g = f;
-  Expect.throws(() {
-      var x12 = [g()!];
-      listOfObject = x12;
-  });
-
-  int i = 0;
-  var x13 = [i++!];
-  listOfObject = x13;
-}
diff --git a/tests/language_2/nnbd/syntax/required_modifier_error_test.dart b/tests/language_2/nnbd/syntax/required_modifier_error_test.dart
index 059b2d5..d471abb 100644
--- a/tests/language_2/nnbd/syntax/required_modifier_error_test.dart
+++ b/tests/language_2/nnbd/syntax/required_modifier_error_test.dart
@@ -15,7 +15,7 @@
 required //# 03: compile-time error
 class C1 {
   required //# 04: compile-time error
-  int f2;
+  int f2 = 0;
 }
 
 // Duplicate modifier
diff --git a/tests/language_2/parser_quirks_test.dart b/tests/language_2/parser_quirks_test.dart
deleted file mode 100644
index 49681df..0000000
--- a/tests/language_2/parser_quirks_test.dart
+++ /dev/null
@@ -1,29 +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.
-
-// Test that a Dart implementation doesn't turn dynamic errors into
-// compilation errors.
-
-f(x) {}
-
-class MyClass {
-  MyClass(x, y);
-
-  foo() {
-    var z;
-    // Neither y nor x are defined. So they are simply dynamic
-    // (getter) sends to this, not compile-time errors.
-    if (false) f(new MyClass(z, y[x.y.z]));
-    if (false) print(y[x.y.z]);
-  }
-}
-
-main() {
-  var x;
-  // We know the concrete type of f (a function closure) does not
-  // support the index operator. However, this is a dynamic error, so
-  // this program should compile.
-  if (false) print(f[x.y.z]);
-  new MyClass(0, 0).foo();
-}
diff --git a/tests/language_2/spread_collections/const_error_test.dart b/tests/language_2/spread_collections/const_error_test.dart
index 348c4c8..54548bc 100644
--- a/tests/language_2/spread_collections/const_error_test.dart
+++ b/tests/language_2/spread_collections/const_error_test.dart
@@ -10,6 +10,7 @@
 
 var nonConstList = <int>[];
 var nonConstMap = <int, String>{};
+var nonConstSet = <int>{};
 const dynamic nonIterable = 3;
 const dynamic nonMap = 3;
 
@@ -48,20 +49,22 @@
 void testSet() {
   // Must be constant.
   const _ = <int>{...nonConstList}; //# 09: compile-time error
+  const _ = <int>{...nonConstSet}; //# 10: compile-time error
 
   // Must be iterable.
-  const _ = <int>{...nonIterable}; //# 10: compile-time error
+  const _ = <int>{...nonIterable}; //# 11: compile-time error
 
   // Cannot be custom iterable type.
-  const _ = <int>{...ConstIterable()}; //# 11: compile-time error
+  const _ = <int>{...ConstIterable()}; //# 12: compile-time error
 
   // Cannot override operator.==().
   const obj = 0.1;
-  const _ = {...[0.1]}; //# 12: compile-time error
-  const _ = {...[Duration(seconds: 0)]}; //# 13: compile-time error
-  const _ = {...[obj]}; //# 14: compile-time error
+  const _ = {...[0.1]}; //# 13: compile-time error
+  const _ = {...[Duration(seconds: 0)]}; //# 14: compile-time error
+  const _ = {...[obj]}; //# 15: compile-time error
 
   // Cannot have collision.
-  const _ = {1, ...[1]}; //# 15: compile-time error
-  const _ = {...[1], ...[1]}; //# 16: compile-time error
+  const _ = {1, ...[1]}; //# 16: compile-time error
+  const _ = {...[1, 1, 3, 8]}; //# 17: compile-time error
+  const _ = {...[1], ...[1]}; //# 18: compile-time error
 }
diff --git a/tests/language_2/spread_collections/const_syntax_error_test.dart b/tests/language_2/spread_collections/const_syntax_error_test.dart
deleted file mode 100644
index 6684548..0000000
--- a/tests/language_2/spread_collections/const_syntax_error_test.dart
+++ /dev/null
@@ -1,26 +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.
-
-// Check that 'spread' in const collections is not enabled without the
-// experimental constant-update-2018 flag.
-
-// SharedOptions=--enable-experiment=no-constant-update-2018
-
-const constList = [1, 2, 3, 4];
-const constSet = {1, 2, 3, 4};
-const constMap = {1: 1, 2: 2, 3: 3, 4: 4};
-
-void main() {
-  var list = [1, 2, 3];
-  var set = {1, 2, 3};
-  var map = {1:1, 2:2, 3:3};
-
-  // Spread cannot be used in a const collection.
-  const _ = [...list]; //# 00: compile-time error
-  const _ = [...constList]; //# 01: compile-time error
-  const _ = {...set}; //# 02: compile-time error
-  const _ = {...constSet}; //# 03: compile-time error
-  const _ = {...map}; //# 04: compile-time error
-  const _ = {...constMap}; //# 05: compile-time error
-}
diff --git a/tests/language_2/this_as_covariant_call_checks_test.dart b/tests/language_2/this_as_covariant_call_checks_test.dart
index 28c79cc..db61f44 100644
--- a/tests/language_2/this_as_covariant_call_checks_test.dart
+++ b/tests/language_2/this_as_covariant_call_checks_test.dart
@@ -2,41 +2,39 @@
 // for 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-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--no-background-compilation --optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
-const NeverInline = "NeverInline";
-
 class A<T> {
   T field;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   set property(T v) {}
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void method(T x) {}
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testMethod(bool violateType) {
     A<dynamic> x = this;
     x.method(violateType ? 10 : "10");
   }
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testSetter(bool violateType) {
     A<dynamic> x = this;
     x.property = violateType ? 10 : "10";
   }
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testField(bool violateType) {
     A<dynamic> x = this;
     x.field = violateType ? 10 : "10";
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 void loop(A<String> obj, bool violateType) {
   for (var i = 0; i < 100; i++) {
     obj.testMethod(violateType);
diff --git a/tests/language_2/this_as_dynamic_call_checks_test.dart b/tests/language_2/this_as_dynamic_call_checks_test.dart
index dd215eb..cb9636c 100644
--- a/tests/language_2/this_as_dynamic_call_checks_test.dart
+++ b/tests/language_2/this_as_dynamic_call_checks_test.dart
@@ -2,41 +2,39 @@
 // for 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-background-compilation --enable-inlining-annotations --optimization-counter-threshold=10
+// VMOptions=--no-background-compilation --optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
-const NeverInline = "NeverInline";
-
 class A<T> {
   T field;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   set property(T v) {}
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void method(T x) {}
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testMethod({bool violateType: false}) {
     dynamic x = this;
     x.method(violateType ? 10 : "10");
   }
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testSetter({bool violateType: false}) {
     dynamic x = this;
     x.property = violateType ? 10 : "10";
   }
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void testField({bool violateType: false}) {
     dynamic x = this;
     x.field = violateType ? 10 : "10";
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 void loop(A<String> obj, {bool violateType: false}) {
   for (var i = 0; i < 100; i++) {
     obj.testMethod(violateType: violateType);
diff --git a/tests/language_2/try_catch_optimized5_test.dart b/tests/language_2/try_catch_optimized5_test.dart
index 5fd5be1..a9f0789 100644
--- a/tests/language_2/try_catch_optimized5_test.dart
+++ b/tests/language_2/try_catch_optimized5_test.dart
@@ -3,25 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown.
-// VMOptions=--optimization-counter-threshold=100 --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 // Test optional parameters updated inside try-catch
 
 import "package:expect/expect.dart";
 
-const noInline = "NeverInline";
-
-@noInline
+@pragma('vm:never-inline')
 m1(int b) {
   if (b == 1) throw 123;
 }
 
-@noInline
+@pragma('vm:never-inline')
 m2(int b) {
   if (b == 2) throw 456;
 }
 
-@noInline
+@pragma('vm:never-inline')
 test1(int b, [int state = 0]) {
   try {
     state++;
@@ -39,7 +37,7 @@
   return "no throw";
 }
 
-@noInline
+@pragma('vm:never-inline')
 test2(int b, [int state]) {
   state = 0;
   try {
diff --git a/tests/language_2/try_catch_regress_27483_test.dart b/tests/language_2/try_catch_regress_27483_test.dart
index c276857..06f1b00 100644
--- a/tests/language_2/try_catch_regress_27483_test.dart
+++ b/tests/language_2/try_catch_regress_27483_test.dart
@@ -3,25 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 // Dart test program for testing try/catch statement without any exceptions
 // being thrown.
-// VMOptions=--optimization-counter-threshold=100 --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization-counter-threshold=100 --no-background-compilation
 
 // Test local variables updated inside try-catch.
 
 import "package:expect/expect.dart";
 
-const noInline = "NeverInline";
-
-@noInline
+@pragma('vm:never-inline')
 m1(int b) {
   if (b == 1) throw 123;
 }
 
-@noInline
+@pragma('vm:never-inline')
 m2(int b) {
   if (b == 2) throw 456;
 }
 
-@noInline
+@pragma('vm:never-inline')
 test(b) {
   var state = 0;
   try {
diff --git a/tests/language_2/unsigned_right_shift_test.dart b/tests/language_2/unsigned_right_shift_test.dart
index bcedfd3..8a2723f 100644
--- a/tests/language_2/unsigned_right_shift_test.dart
+++ b/tests/language_2/unsigned_right_shift_test.dart
@@ -57,7 +57,7 @@
   Expect.isFalse(invocation.isAccessor);
   Expect.equals(#>>>, invocation.memberName);
   Expect.equals(1, invocation.positionalArguments.length);
-  Expect.identical(c2, invocation.positionalArguments[1]);
+  Expect.identical(c2, invocation.positionalArguments[0]);
   Expect.equals(0, invocation.namedArguments.length);
 
   invocation = (nsm >>>= c2);
@@ -65,7 +65,7 @@
   Expect.isFalse(invocation.isAccessor);
   Expect.equals(#>>>, invocation.memberName);
   Expect.equals(1, invocation.positionalArguments.length);
-  Expect.identical(c2, invocation.positionalArguments[1]);
+  Expect.identical(c2, invocation.positionalArguments[0]);
   Expect.equals(0, invocation.namedArguments.length);
 
   // And unimplemented interface methods.
@@ -75,7 +75,7 @@
   Expect.isFalse(invocation.isAccessor);
   Expect.equals(#>>>, invocation.memberName);
   Expect.equals(1, invocation.positionalArguments.length);
-  Expect.identical(c2, invocation.positionalArguments[1]);
+  Expect.identical(c2, invocation.positionalArguments[0]);
   Expect.equals(0, invocation.namedArguments.length);
 
   // If there is an interface, we must match it, even if the call
@@ -97,10 +97,28 @@
     Expect.identical(c2, (await fc1) >>> (await fc2));
     /// The operator itself can be async.
     var async = Async();
-    Expect.identical(c1, await (async >>> c2));
+    Expect.identical(c1, await (async >>> c1));
+
+    var asyncStar = AsyncStar();
+    int count = 0;
+    await for (var v in asyncStar >>> c1) {
+      count++;
+      Expect.identical(c1, v);
+    }
+    Expect.equals(1, count);
     asyncEnd();
   }();
 
+  {
+    var syncStar = SyncStar();
+    int count = 0;
+    for (var v in syncStar >>> c1) {
+      count++;
+      Expect.identical(c1, v);
+    }
+    Expect.equals(1, count);
+  }
+
   // >>> has same precedence as >> (and <<), is left associative.
   // Binds weaker than addition/multiplication, stronger than other bitwise
   // operators and comparisons.
@@ -108,10 +126,10 @@
   Expect.equals("((~*)>>>(~*))", "${~a >>> ~a}");
   Expect.equals("((*+*)>>>(*+*))", "${a + a >>> a + a}");
   Expect.equals("((*/*)>>>(*/*))", "${a / a >>> a / a}");
-  Expect.equals("((*>>*)>>>*)>>*)", "${a >> a >>> a >> a}");
+  Expect.equals("(((*>>*)>>>*)>>*)", "${a >> a >>> a >> a}");
   Expect.equals("((*&(*>>>*))&*)", "${a & a >>> a & a}");
-  Expect.equals("((*|(*>>>*)|)*)", "${a | a >>> a | a}");
-  Expect.equals("((*^(*>>>*)^)*)", "${a ^ a >>> a ^ a}");
+  Expect.equals("((*|(*>>>*))|*)", "${a | a >>> a | a}");
+  Expect.equals("((*^(*>>>*))^*)", "${a ^ a >>> a ^ a}");
   Expect.equals("(*<(*>>>*))", "${a < a >>> a}");
   Expect.equals("((*>>>*)<*)", "${a >>> a < a}");
 
@@ -146,14 +164,11 @@
   Object operator>>>(v1, v2) => null;  //# arg2: compile-time error
   Object operator>>>([v1]) => null;  //# argOpt: compile-time error
   Object operator>>>({v1}) => null;  //# argNam: compile-time error
-  // The operator must not be async* or sync*.
-  Stream<Object> operator>>>(v) async* {}  //# asyncstar: compile-time error
-  Iterable<Object> operator>>>(v) sync* {}  //# syncstar: compile-time error
 }
 
 /// Class with noSuchMethod and no `>>>` operator.
 class NSM {
-  dynamic noSuchMethod(Invocation i) {
+  dynamic noSuchMethod(Invocation invocation) {
     return invocation;
   }
 }
@@ -177,21 +192,38 @@
 
 /// Class with an `async` implementation of `operator >>>`
 class Async {
-  Future<C> operator>>>(C other) async => other;
+  Future<C> operator >>>(C value) async => value;
+}
+
+/// Class with an `async*` implementation of `operator >>>`
+class AsyncStar {
+  Stream<C> operator >>>(C value) async* {
+    yield value;
+  }
+}
+
+/// Class with a `sync*` implementation of `operator >>>`
+class SyncStar {
+  Iterable<C> operator >>>(C value) sync* {
+    yield value;
+  }
 }
 
 /// Helper class to record precedence and associativity of operators.
 class Assoc {
   final String ops;
   Assoc(this.ops);
-  Assoc operator~() => Assoc("(~${this}}");
-  Assoc operator+(Assoc other) => Assoc("(${this}+$other)");
-  Assoc operator/(Assoc other) => Assoc("(${this}/$other)");
-  Assoc operator&(Assoc other) => Assoc("(${this}&$other)");
-  Assoc operator|(Assoc other) => Assoc("(${this}|$other)");
-  Assoc operator^(Assoc other) => Assoc("(${this}^$other)");
-  Assoc operator>(Assoc other) => Assoc("(${this}>$other)");
-  Assoc operator>>(Assoc other) => Assoc("(${this}>>$other)");
-  Assoc operator>>>(Assoc other) => Assoc("(${this}>>>$other)");
+  Assoc operator ~() => Assoc("(~${this})");
+  Assoc operator +(Assoc other) => Assoc("(${this}+$other)");
+  Assoc operator /(Assoc other) => Assoc("(${this}/$other)");
+  Assoc operator &(Assoc other) => Assoc("(${this}&$other)");
+  Assoc operator |(Assoc other) => Assoc("(${this}|$other)");
+  Assoc operator ^(Assoc other) => Assoc("(${this}^$other)");
+  Assoc operator >(Assoc other) => Assoc("(${this}>$other)");
+  Assoc operator >>(Assoc other) => Assoc("(${this}>>$other)");
+  Assoc operator >>>(Assoc other) => Assoc("(${this}>>>$other)");
+  Assoc operator <(Assoc other) => Assoc("(${this}<$other)");
+  Assoc operator >=(Assoc other) => Assoc("(${this}>=$other)");
+  Assoc operator <=(Assoc other) => Assoc("(${this}<=$other)");
   String toString() => ops;
 }
diff --git a/tests/language_2/vm/create_array_instr_deopt2_test.dart b/tests/language_2/vm/create_array_instr_deopt2_test.dart
index 437aa4c..3108cb5 100644
--- a/tests/language_2/vm/create_array_instr_deopt2_test.dart
+++ b/tests/language_2/vm/create_array_instr_deopt2_test.dart
@@ -1,15 +1,13 @@
 // 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=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation --enable_inlining_annotations
-
-const NeverInline = "NeverInline";
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 foo(n) {
   return new List(n);
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 bar(n) {
   try {
     return foo(n);
diff --git a/tests/language_2/vm/create_array_instr_deopt_test.dart b/tests/language_2/vm/create_array_instr_deopt_test.dart
index ed83284..4e2a778 100644
--- a/tests/language_2/vm/create_array_instr_deopt_test.dart
+++ b/tests/language_2/vm/create_array_instr_deopt_test.dart
@@ -1,11 +1,9 @@
 // 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=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation --enable_inlining_annotations
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
-const NeverInline = "NeverInline";
-
-@NeverInline
+@pragma('vm:never-inline')
 foo(n) {
   try {
     return new List(n);
diff --git a/tests/language_2/vm/inline_heuristic_test.dart b/tests/language_2/vm/inline_heuristic_test.dart
index ca25125..91ec7ea 100755
--- a/tests/language_2/vm/inline_heuristic_test.dart
+++ b/tests/language_2/vm/inline_heuristic_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 file.
 
-// VMOptions=--deterministic --optimization_counter_threshold=10 --enable-inlining-annotations
+// VMOptions=--deterministic --optimization_counter_threshold=10
 
 // Test on specialized vs non-specialized inlining.
 
 import 'dart:core';
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 // To inline or not to inline, that is the question?
 int foo(int k) {
   switch (k) {
@@ -275,14 +273,14 @@
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int bar() {
   // Here we should inline! The inlined size is very small
   // after specialization for the constant arguments.
   return foo(1) + foo(12);
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int baz(int i) {
   // Here we should not inline! The inlined size is too large,
   // just keep the original method. In fact, we can use the cached
diff --git a/tests/language_2/vm/integer_type_propagation2_test.dart b/tests/language_2/vm/integer_type_propagation2_test.dart
index 05cfb34..a6d14e8 100644
--- a/tests/language_2/vm/integer_type_propagation2_test.dart
+++ b/tests/language_2/vm/integer_type_propagation2_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.
 // Test various optimizations and deoptimizations of optimizing compiler..
-// VMOptions=--enable-inlining-annotations --no-background-compilation --optimization-counter-threshold=1000
+// VMOptions=--no-background-compilation --optimization-counter-threshold=1000
 
 import "package:expect/expect.dart";
 import "dart:typed_data";
 
-const noInline = "NeverInline";
-const alwaysInline = "AlwaysInline";
-
 var list = new Uint32List(1);
 
-@noInline
+@pragma('vm:never-inline')
 testuint32(bool b) {
   var t;
   if (b) {
diff --git a/tests/language_2/vm/integer_type_propagation_test.dart b/tests/language_2/vm/integer_type_propagation_test.dart
index cdf6a0b..ccf9834 100644
--- a/tests/language_2/vm/integer_type_propagation_test.dart
+++ b/tests/language_2/vm/integer_type_propagation_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.
 // Test various optimizations and deoptimizations of optimizing compiler..
-// VMOptions=--enable-inlining-annotations --no-background-compilation --optimization-counter-threshold=1000
+// VMOptions=--no-background-compilation --optimization-counter-threshold=1000
 
 import "package:expect/expect.dart";
 
-const noInline = "NeverInline";
-
-@noInline
+@pragma('vm:never-inline')
 testuint32(y) {
   int x = y;
   if (x != null) {
diff --git a/tests/language_2/vm/lazy_deopt_with_exception_and_stacktrace_test.dart b/tests/language_2/vm/lazy_deopt_with_exception_and_stacktrace_test.dart
index cf629db..c1101a1 100644
--- a/tests/language_2/vm/lazy_deopt_with_exception_and_stacktrace_test.dart
+++ b/tests/language_2/vm/lazy_deopt_with_exception_and_stacktrace_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.
 // Test deoptimization on an optimistically hoisted smi check.
-// VMOptions=--optimization-counter-threshold=10  --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization-counter-threshold=10  --no-background-compilation
 
 // Test that lazy deoptimization works if the program returns to a function
 // that is scheduled for lazy deoptimization via an exception.
@@ -13,9 +13,7 @@
   dynamic x = 42;
 }
 
-const NeverInline = "NeverInline";
-
-@NeverInline
+@pragma('vm:never-inline')
 AA(C c, bool b) {
   if (b) {
     c.x = 2.5;
@@ -23,7 +21,7 @@
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 T1(C c, bool b) {
   try {
     AA(c, b);
@@ -35,7 +33,7 @@
   return c.x + 1;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 T2(C c, bool b) {
   try {
     AA(c, b);
diff --git a/tests/language_2/vm/lazy_deopt_with_exception_test.dart b/tests/language_2/vm/lazy_deopt_with_exception_test.dart
index 3ae0cb8..c040e54 100644
--- a/tests/language_2/vm/lazy_deopt_with_exception_test.dart
+++ b/tests/language_2/vm/lazy_deopt_with_exception_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.
 // Test deoptimization on an optimistically hoisted smi check.
-// VMOptions=--optimization-counter-threshold=10  --no-background-compilation --enable-inlining-annotations
+// VMOptions=--optimization-counter-threshold=10  --no-background-compilation
 
 // Test that lazy deoptimization works if the program returns to a function
 // that is scheduled for lazy deoptimization via an exception.
@@ -13,9 +13,7 @@
   dynamic x = 42;
 }
 
-const NeverInline = "NeverInline";
-
-@NeverInline
+@pragma('vm:never-inline')
 AA(C c, bool b) {
   if (b) {
     c.x = 2.5;
@@ -23,7 +21,7 @@
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 T1(C c, bool b) {
   try {
     AA(c, b);
@@ -31,7 +29,7 @@
   return c.x + 1;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 T2(C c, bool b) {
   try {
     AA(c, b);
diff --git a/tests/language_2/vm/load_elimination_any_use_creates_alias_test.dart b/tests/language_2/vm/load_elimination_any_use_creates_alias_test.dart
index 14b6e73..ff1639f 100644
--- a/tests/language_2/vm/load_elimination_any_use_creates_alias_test.dart
+++ b/tests/language_2/vm/load_elimination_any_use_creates_alias_test.dart
@@ -3,22 +3,19 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--no-use-osr --optimization-counter-threshold=10 --enable-inlining-annotations --no-background-compilation
+// VMOptions=--no-use-osr --optimization-counter-threshold=10 --no-background-compilation
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
 B G;
 
-@noInline
+@pragma('vm:never-inline')
 modify() {
   G.bval = 123;
 }
 
 class B {
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly() {
     G = this;
     modify();
@@ -32,10 +29,10 @@
   poly() => null;
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 foo(obj) => obj.poly();
 
-@noInline
+@pragma('vm:never-inline')
 test() {
   var b = new B();
 
diff --git a/tests/language_2/vm/load_elimination_has_loads_from_place_test.dart b/tests/language_2/vm/load_elimination_has_loads_from_place_test.dart
index cc01ad7..167e9c6 100644
--- a/tests/language_2/vm/load_elimination_has_loads_from_place_test.dart
+++ b/tests/language_2/vm/load_elimination_has_loads_from_place_test.dart
@@ -3,21 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr --enable-inlining-annotations --no-background-compilation
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 // Tests correct handling of redefinitions in aliasing computation.
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
 var H = true;
 
 class A {
   B bb;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     if (H) {
       bb = p;
@@ -31,16 +28,16 @@
 class B {
   int bval = -1;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     return bval;
   }
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 foo(obj, p) => obj.poly(p);
 
-@noInline
+@pragma('vm:never-inline')
 test() {
   A a = new A();
   B b = new B();
diff --git a/tests/language_2/vm/load_elimination_mark_stored_values_escaping_test.dart b/tests/language_2/vm/load_elimination_mark_stored_values_escaping_test.dart
index 86bec6f..13d3fed 100644
--- a/tests/language_2/vm/load_elimination_mark_stored_values_escaping_test.dart
+++ b/tests/language_2/vm/load_elimination_mark_stored_values_escaping_test.dart
@@ -3,27 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--no-use-osr --optimization-counter-threshold=10 --enable-inlining-annotations --no-background-compilation
+// VMOptions=--no-use-osr --optimization-counter-threshold=10 --no-background-compilation
 
 // Tests correct handling of redefinitions in aliasing computation.
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
 B G;
 
 class A {
   int val = -1;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     p.aa = this;
   }
 }
 
-@noInline
+@pragma('vm:never-inline')
 modify() {
   G.aa.val = 123;
 }
@@ -31,7 +28,7 @@
 class B {
   A aa;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     G = this;
     foo2(p, this);
@@ -39,13 +36,13 @@
   }
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 foo(obj, p) => obj.poly(p);
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 foo2(obj, p) => obj.poly(p);
 
-@noInline
+@pragma('vm:never-inline')
 testfunc() {
   var a = new A();
   var b = new B();
diff --git a/tests/language_2/vm/load_elimination_two_redefinitions_test.dart b/tests/language_2/vm/load_elimination_two_redefinitions_test.dart
index 9e15ebc..1f65bc2 100644
--- a/tests/language_2/vm/load_elimination_two_redefinitions_test.dart
+++ b/tests/language_2/vm/load_elimination_two_redefinitions_test.dart
@@ -3,21 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test correctness of side effects tracking used by load to load forwarding.
 
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr --enable-inlining-annotations --no-background-compilation
+// VMOptions=--optimization-counter-threshold=10 --no-use-osr --no-background-compilation
 
 // Tests correct handling of redefinitions in aliasing computation.
 
 import "package:expect/expect.dart";
 
-const alwaysInline = "AlwaysInline";
-const noInline = "NeverInline";
-
 var H = true;
 
 class A {
   B bb;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     if (H) {
       bb = p;
@@ -31,16 +28,16 @@
 class B {
   int bval = -1;
 
-  @alwaysInline
+  @pragma('vm:prefer-inline')
   poly(p) {
     return bval;
   }
 }
 
-@alwaysInline
+@pragma('vm:prefer-inline')
 foo(obj, p) => obj.poly(p);
 
-@noInline
+@pragma('vm:never-inline')
 test() {
   A a = new A();
   B b = new B();
diff --git a/tests/language_2/vm/optimized_stacktrace_test.dart b/tests/language_2/vm/optimized_stacktrace_test.dart
index 7683a01..675029f 100644
--- a/tests/language_2/vm/optimized_stacktrace_test.dart
+++ b/tests/language_2/vm/optimized_stacktrace_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--stacktrace-every=3 --optimization-counter-threshold=10 --enable-inlining-annotations --no-background-compilation
+// VMOptions=--stacktrace-every=3 --optimization-counter-threshold=10 --no-background-compilation
 
 // Test generating stacktraces with inlining and deferred code.
 // Regression test for issue dartbug.com/22331
@@ -25,9 +25,7 @@
   return value;
 }
 
-const NeverInline = 'NeverInline';
-
-@NeverInline
+@pragma('vm:never-inline')
 baz(x, y, z) => z;
 
 bar(o) {
diff --git a/tests/language_2/vm/osr_nonempty_stack_test.dart b/tests/language_2/vm/osr_nonempty_stack_test.dart
index f003579..d7c977a 100644
--- a/tests/language_2/vm/osr_nonempty_stack_test.dart
+++ b/tests/language_2/vm/osr_nonempty_stack_test.dart
@@ -9,10 +9,8 @@
 import 'dart:core';
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 class Z {
-  @NeverInline
+  @pragma('vm:never-inline')
   check(int a, int b, String c, List<int> d) {
     Expect.equals(a, 42);
     Expect.equals(b, global_bazz);
@@ -25,29 +23,29 @@
 int global_bazz = 123;
 int global_more_bazz = 456;
 
-@NeverInline
+@pragma('vm:never-inline')
 int bazz() {
   return ++global_bazz;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int more_bazz() {
   return ++global_more_bazz;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int bar(int i) {
   return i - 1;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 List<int> spread(int v, List<int> x) {
   return [v, ...x];
 }
 
 // Long running control-flow collection (block expression),
 // leaves the stack non-empty during a potential OSR.
-@NeverInline
+@pragma('vm:never-inline')
 List<int> test1(int n) {
   return spread(more_bazz(), [for (int i = 0; i < n; i++) i]);
 }
@@ -76,7 +74,7 @@
 
 // Long running control-flow collection (block expression),
 // leaves the stack non-empty during a potential OSR.
-@NeverInline
+@pragma('vm:never-inline')
 List<int> test4(int n) {
   var x = [10] +
       z.check(42, bazz(), 'abc',
@@ -86,7 +84,7 @@
 
 // Long running control-flow collection (block expression) inside outer
 // loop, also leaves the stack non-empty during a potential OSR.
-@NeverInline
+@pragma('vm:never-inline')
 List<int> test5(int m, int n) {
   List<int> x = [];
   for (int k = 0; k < m; k++) {
diff --git a/tests/language_2/vm/plus_null_37719_test.dart b/tests/language_2/vm/plus_null_37719_test.dart
new file mode 100755
index 0000000..66b8750
--- /dev/null
+++ b/tests/language_2/vm/plus_null_37719_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.
+
+// VMOptions=--deterministic
+
+import "package:expect/expect.dart";
+
+@pragma("vm:never-inline")
+foo(List<int> x) => x[1] + x[0];
+
+@pragma("vm:never-inline")
+bar(List<int> x) => 1 + x[0];
+
+@pragma("vm:never-inline")
+baz(List<int> x) => x[0] + 2;
+
+main() {
+  var x = new List<int>(2);
+
+  // Only first is null.
+  x[0] = null;
+  x[1] = 123;
+  try {
+    foo(x);
+  } on NoSuchMethodError catch (e) {
+    ;
+  }
+  try {
+    bar(x);
+  } on NoSuchMethodError catch (e) {
+    ;
+  }
+  try {
+    baz(x);
+  } on NoSuchMethodError catch (e) {
+    ;
+  }
+
+  // Only second is null.
+  x[0] = 456;
+  x[1] = null;
+  try {
+    foo(x);
+  } on NoSuchMethodError catch (e) {
+    ;
+  }
+  Expect.equals(457, bar(x));
+  Expect.equals(458, baz(x));
+
+  // Neither is null.
+  x[0] = 789;
+  x[1] = -1;
+  Expect.equals(788, foo(x));
+  Expect.equals(790, bar(x));
+  Expect.equals(791, baz(x));
+}
diff --git a/tests/language_2/vm/regress_27671_other.dart b/tests/language_2/vm/regress_27671_other.dart
index a180d18..e62d013 100644
--- a/tests/language_2/vm/regress_27671_other.dart
+++ b/tests/language_2/vm/regress_27671_other.dart
@@ -4,7 +4,7 @@
 
 import 'regress_27671_test.dart';
 
-@AlwaysInline
+@pragma('vm:prefer-inline')
 void check(f, x) {
   assert(f(x) && true);
 }
diff --git a/tests/language_2/vm/regress_27671_test.dart b/tests/language_2/vm/regress_27671_test.dart
index fa258da..99de5b9 100644
--- a/tests/language_2/vm/regress_27671_test.dart
+++ b/tests/language_2/vm/regress_27671_test.dart
@@ -2,22 +2,19 @@
 // for 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-inlining-annotations --optimization-counter-threshold=10 --no-background-compilation
+// VMOptions=--enable_asserts --optimization-counter-threshold=10 --no-background-compilation
 
 import 'package:expect/expect.dart';
 import 'regress_27671_other.dart';
 
-const AlwaysInline = "AlwaysInline";
-const NeverInline = "NeverInline";
-
-@AlwaysInline
+@pragma('vm:prefer-inline')
 bounce(x) {
   for (int i = 0; i < 10; i++) {
     check(f, x);
   }
 }
 
-@AlwaysInline
+@pragma('vm:prefer-inline')
 bool f(y) => y > 0;
 
 main() {
diff --git a/tests/language_2/vm/regress_34435_test.dart b/tests/language_2/vm/regress_34435_test.dart
index 8f15f8c..11e709b 100644
--- a/tests/language_2/vm/regress_34435_test.dart
+++ b/tests/language_2/vm/regress_34435_test.dart
@@ -2,11 +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=--optimization-filter=triggerBug --no-background-compilation --enable-inlining-annotations --optimization-counter-threshold=2
+// VMOptions=--optimization-filter=triggerBug --no-background-compilation --optimization-counter-threshold=2
 
-const String NeverInline = 'NeverInline';
-
-@NeverInline
+@pragma('vm:never-inline')
 dynamic triggerGC() {
   var a = [];
   for (int i = 0; i < 100; ++i) {
@@ -15,12 +13,12 @@
   return a;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 void fillLowerStackWithReturnAddresses() {
   recursive(20);
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 dynamic recursive(dynamic n) {
   if (n > 0) {
     recursive(n - 1);
@@ -29,7 +27,7 @@
 }
 
 class Box {
-  @NeverInline
+  @pragma('vm:never-inline')
   Box get value => global;
 }
 
@@ -39,7 +37,7 @@
   bool isTrue = true;
   bool hasProblem = true;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   void triggerBug(Box box) {
     triggerGC();
 
diff --git a/tests/language_2/vm/regress_36589_test.dart b/tests/language_2/vm/regress_36589_test.dart
index dc64419..2fe4932 100644
--- a/tests/language_2/vm/regress_36589_test.dart
+++ b/tests/language_2/vm/regress_36589_test.dart
@@ -8,27 +8,25 @@
 
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 List<int> mX = new List(1);
 
-@NeverInline
+@pragma('vm:never-inline')
 int foo() {
   return mX[8589934591];
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 foo_store() {
   mX[8589934591] = 0;
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 int bar() {
   List<int> x = new List(1);
   return x[8589934591];
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 bar_store() {
   List<int> x = new List(1);
   x[8589934591] = 0;
diff --git a/tests/language_2/vm/regress_36681_test.dart b/tests/language_2/vm/regress_36681_test.dart
index 8dbe171..c0721c2 100644
--- a/tests/language_2/vm/regress_36681_test.dart
+++ b/tests/language_2/vm/regress_36681_test.dart
@@ -8,11 +8,9 @@
 
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 double v = 0;
 
-@NeverInline
+@pragma('vm:never-inline')
 int foo(int a, int p, int q) {
   double p1 = 0;
   double p2 = 0;
diff --git a/tests/language_2/vm/regress_36803_test.dart b/tests/language_2/vm/regress_36803_test.dart
index 62ca189..0cbd09d 100755
--- a/tests/language_2/vm/regress_36803_test.dart
+++ b/tests/language_2/vm/regress_36803_test.dart
@@ -5,15 +5,13 @@
 // Don't LICM AOT's generic bounds check reference beyond other exception.
 // (dartbug.com/36803).
 //
-// VMOptions=--deterministic --optimization_level=3 --enable-inlining-annotations
+// VMOptions=--deterministic --optimization_level=3
 
 import "package:expect/expect.dart";
 
-const String NeverInline = 'NeverInline';
-
 String var1 = 'Hdi\u{1f600}T';
 
-@NeverInline
+@pragma('vm:never-inline')
 int foo() {
   List<int> a = [1, 2, 3, 4];
   int x = 0;
diff --git a/tests/language_2/vm/regress_licm_test.dart b/tests/language_2/vm/regress_licm_test.dart
index de211dd..2664484 100644
--- a/tests/language_2/vm/regress_licm_test.dart
+++ b/tests/language_2/vm/regress_licm_test.dart
@@ -2,13 +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-inlining-annotations --optimization-counter-threshold=1000 --no-background-compilation
+// VMOptions=--optimization-counter-threshold=1000 --no-background-compilation
 
 // Regression test for correct LICM and type propagation.
 
-const AlwaysInline = "AlwaysInline";
-const NeverInline = "NeverInline";
-
 class Attribute {
   final id = 123;
 }
@@ -18,7 +15,7 @@
   final String name;
   get attr;
 
-  @AlwaysInline
+  @pragma('vm:prefer-inline')
   int compareTo(other) {
     int nameCompare = name.compareTo(other.name);
     if (nameCompare != 0) return nameCompare;
diff --git a/tests/language_2/vm/regression_37408_test.dart b/tests/language_2/vm/regression_37408_test.dart
new file mode 100644
index 0000000..f4a295a
--- /dev/null
+++ b/tests/language_2/vm/regression_37408_test.dart
@@ -0,0 +1,31 @@
+// 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.
+
+// Issue #37408: AOT did not throw.
+
+import "package:expect/expect.dart";
+
+import 'dart:math';
+
+String var0 = '5Zso';
+
+double foo2(String par1) {
+  return atan2(0.16964141699241508, num.tryParse('\u2665vDil'));
+}
+
+class X0 {
+  void run() {
+    foo2(var0);
+  }
+}
+
+main() {
+  bool x = false;
+  try {
+    new X0().run();
+  } catch (exception, stackTrace) {
+    x = true;
+  }
+  Expect.isTrue(x);
+}
diff --git a/tests/language_2/vm/regression_37622_test.dart b/tests/language_2/vm/regression_37622_test.dart
new file mode 100755
index 0000000..3c88567
--- /dev/null
+++ b/tests/language_2/vm/regression_37622_test.dart
@@ -0,0 +1,37 @@
+// 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.
+
+// VMOptions=--deterministic
+
+// Issue #37622 found with fuzzing: internal compiler crash (division-by-zero).
+
+import 'dart:typed_data';
+
+import "package:expect/expect.dart";
+
+@pragma('vm:never-inline')
+int foo() {
+  int x = 0;
+  {
+    int loc0 = 67;
+    while (--loc0 > 0) {
+      --loc0;
+      x += (4 ~/ (Int32x4.wxwx >> loc0));
+      --loc0;
+      --loc0;
+    }
+  }
+}
+
+main() {
+  int x = 0;
+  bool d = false;
+  try {
+    x = foo();
+  } on IntegerDivisionByZeroException catch (e) {
+    d = true;
+  }
+  Expect.equals(x, 0);
+  Expect.isTrue(d);
+}
diff --git a/tests/language_2/vm/regression_37633_test.dart b/tests/language_2/vm/regression_37633_test.dart
new file mode 100755
index 0000000..3de7315
--- /dev/null
+++ b/tests/language_2/vm/regression_37633_test.dart
@@ -0,0 +1,27 @@
+// 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.
+
+// VMOptions=--deterministic --enable-inlining-annotations
+
+// Issue #37633 found with fuzzing: internal compiler crash (parallel move).
+
+import 'dart:math';
+
+import "package:expect/expect.dart";
+
+const String NeverInline = 'NeverInline';
+
+double foo0() {
+  return acos(0.9474715118880382);
+}
+
+@NeverInline
+double foo() {
+  return atan2(foo0(), foo0());
+}
+
+main() {
+  double x = foo();
+  Expect.approxEquals(x, 0.7853981633974483);
+}
diff --git a/tests/language_2/vm/smi_widening_test.dart b/tests/language_2/vm/smi_widening_test.dart
index 55106a8..b3fcfae 100644
--- a/tests/language_2/vm/smi_widening_test.dart
+++ b/tests/language_2/vm/smi_widening_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=--deterministic --optimization-counter-threshold=102 --enable-inlining-annotations --optimization-filter=Box_
+// VMOptions=--deterministic --optimization-counter-threshold=102 --optimization-filter=Box_
 
 import 'package:expect/expect.dart';
 
-const String NeverInline = 'NeverInline';
-const String AlwaysInline = 'AlwaysInline';
 const int kLimit = 100;
 
 main() {
@@ -20,14 +18,14 @@
   testMints(2048);
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 optimizeConstructor(int value) {
   for (int i = 0; i < kLimit; ++i) {
     new Box(milliseconds: value);
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 optimizeMicroseconds(int value) {
   final d = new Box(milliseconds: value);
   for (int i = 0; i < kLimit; ++i) {
@@ -35,7 +33,7 @@
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 optimizeMilliseconds(int value) {
   final d = new Box(seconds: value);
   for (int i = 0; i < kLimit; ++i) {
@@ -43,7 +41,7 @@
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 testMints(int value) {
   final d = new Box(seconds: value);
   for (int i = 0; i < kLimit; ++i) {
@@ -57,7 +55,7 @@
 class Box {
   final int _value;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   Box(
       {int days: 0,
       int hours: 0,
@@ -74,9 +72,9 @@
 
   Box._microseconds(this._value);
 
-  @NeverInline
+  @pragma('vm:never-inline')
   int get inMilliseconds => _value ~/ 1000;
 
-  @NeverInline
+  @pragma('vm:never-inline')
   int get inMicroseconds => _value;
 }
diff --git a/tests/language_2/vm/unregistered_closure_in_finally_test.dart b/tests/language_2/vm/unregistered_closure_in_finally_test.dart
index 135be5d..fa970af 100644
--- a/tests/language_2/vm/unregistered_closure_in_finally_test.dart
+++ b/tests/language_2/vm/unregistered_closure_in_finally_test.dart
@@ -1,23 +1,21 @@
 // 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=--no-background-compilation --enable-inlining-annotations
+// VMOptions=--no-background-compilation
 
-const NeverInline = 'NeverInline';
-
-@NeverInline
+@pragma('vm:never-inline')
 doSomething() {
   print("Hello!");
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 maybeThrow(bool doThrow) {
   if (doThrow) {
     throw new Exception();
   }
 }
 
-@NeverInline
+@pragma('vm:never-inline')
 run(action) {
   try { action(); } catch(e) {}
 }
diff --git a/tests/lib_2/async/stream_error_test.dart b/tests/lib_2/async/stream_error_test.dart
new file mode 100644
index 0000000..11f6a93
--- /dev/null
+++ b/tests/lib_2/async/stream_error_test.dart
@@ -0,0 +1,78 @@
+// 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:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() async {
+  var stack = StackTrace.fromString("some stack trace");
+  var error = MyError();
+
+  asyncStart();
+
+  {
+    // There is an error before any element.
+    var stream = Stream<int>.error(error, stack);
+    try {
+      await stream.first;
+      Expect.fail("didn't throw");
+    } on MyError catch (e, s) {
+      Expect.identical(error, e);
+      Expect.identical(stack, s);
+    }
+  }
+
+  {
+    // There is an error before any element.
+    var stream = Stream<int>.error(error, stack);
+    try {
+      await for (var _ in stream) {}
+      Expect.fail("didn't throw");
+    } on MyError catch (e, s) {
+      Expect.identical(error, e);
+      Expect.identical(stack, s);
+    }
+  }
+
+  {
+    // There is no second element or error.
+    var stream = Stream<int>.error(error, stack);
+    int errorCount = 0;
+    var noErrorStream = stream.handleError((e, s) {
+      Expect.identical(error, e);
+      Expect.identical(stack, s);
+      errorCount++;
+    }, test: (o) => o is MyError);
+    Expect.isTrue(await noErrorStream.isEmpty);
+    Expect.equals(1, errorCount);
+  }
+
+  {
+    // Works with subscriptions and pause-resume.
+    var stream = Stream<int>.error(error, stack);
+    int errorCount = 0;
+    var onDone = Completer();
+    var sub = stream.listen((v) {
+      Expect.fail("Value event");
+    }, onError: (e, s) {
+      Expect.identical(error, e);
+      Expect.identical(stack, s);
+      errorCount++;
+    }, onDone: () {
+      Expect.equals(1, errorCount);
+      onDone.complete();
+    });
+    sub.pause();
+    await Future.delayed(Duration(milliseconds: 10));
+    Expect.equals(0, errorCount);
+    Expect.isFalse(onDone.isCompleted);
+    sub.resume();
+    await onDone.future;
+  }
+
+  asyncEnd();
+}
+
+class MyError {}
diff --git a/tests/lib_2/async/stream_value_test.dart b/tests/lib_2/async/stream_value_test.dart
new file mode 100644
index 0000000..75b6c88
--- /dev/null
+++ b/tests/lib_2/async/stream_value_test.dart
@@ -0,0 +1,71 @@
+// 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:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+void main() async {
+  asyncStart();
+
+  {
+    // There is a first element.
+    var stream = Stream<int>.value(42);
+    var first = await stream.first;
+    Expect.equals(42, first);
+    // Is single-subscription.
+    Expect.throws(() => stream.first);
+  }
+
+  {
+    // There is no second element.
+    var stream = Stream<int>.value(42);
+    try {
+      await stream.skip(1).first;
+      Expect.fail("didn't throw");
+    } on Error {
+      // Success.
+    }
+  }
+
+  {
+    // There is still no second element.
+    var stream = Stream<int>.value(42);
+    try {
+      await stream.elementAt(1);
+      Expect.fail("didn't throw");
+    } on Error {
+      // Success.
+    }
+  }
+
+  {
+    // Works with await for.
+    var stream = Stream<int>.value(42);
+    var value = null;
+    await for (value in stream) {}
+    Expect.equals(42, value);
+  }
+
+  {
+    // Works with subscriptions and pause-resume.
+    var stream = Stream<int>.value(42);
+    var value;
+    var onDone = Completer();
+    var sub = stream.listen((v) {
+      value = v;
+    }, onDone: () {
+      Expect.equals(42, value);
+      onDone.complete();
+    });
+    sub.pause();
+    await Future.delayed(Duration(milliseconds: 10));
+    Expect.isNull(value);
+    Expect.isFalse(onDone.isCompleted);
+    sub.resume();
+    await onDone.future;
+  }
+
+  asyncEnd();
+}
diff --git a/tests/lib_2/isolate/spawn_function_test.dart b/tests/lib_2/isolate/spawn_function_test.dart
index 7a2a193..e93b4d6 100644
--- a/tests/lib_2/isolate/spawn_function_test.dart
+++ b/tests/lib_2/isolate/spawn_function_test.dart
@@ -9,23 +9,35 @@
 import 'package:unittest/unittest.dart';
 import "remote_unittest_helper.dart";
 
-child(args) {
+isolateEntryPoint(args) {
   var msg = args[0];
-  var reply = args[1];
-  reply.send('re: $msg');
+  var sendPort = args[1];
+  sendPort.send('re: $msg');
 }
 
 void main([args, port]) {
-  if (testRemote(main, port)) return;
+  if (testRemote(main, port)) {
+    return;
+  }
+
   test('message - reply chain', () async {
+    const String debugName = 'spawnedIsolate';
+
     ReceivePort port = new ReceivePort();
     port.listen(expectAsync((msg) {
       port.close();
       expect(msg, equals('re: hi'));
     }));
-    const String debugName = 'spawnedIsolate';
-    final i =
-        await Isolate.spawn(child, ['hi', port.sendPort], debugName: debugName);
-    expect(i.debugName, debugName);
+
+    // Start new isolate; paused so it's alive till we read the debugName.
+    // If the isolate runs to completion, the isolate might get cleaned up
+    // and debugName might be null.
+    final isolate = await Isolate.spawn(
+        isolateEntryPoint, ['hi', port.sendPort],
+        paused: true, debugName: debugName);
+
+    expect(isolate.debugName, debugName);
+
+    isolate.resume(isolate.pauseCapability);
   });
 }
diff --git a/tests/lib_2/isolate/spawn_uri_test.dart b/tests/lib_2/isolate/spawn_uri_test.dart
index e71fed7..51ea02b 100644
--- a/tests/lib_2/isolate/spawn_uri_test.dart
+++ b/tests/lib_2/isolate/spawn_uri_test.dart
@@ -10,16 +10,30 @@
 
 main() {
   test('isolate fromUri - send and reply', () async {
-    ReceivePort port = new ReceivePort();
+    const String debugName = 'spawnedIsolate';
+
+    final exitPort = ReceivePort();
+
+    final port = new ReceivePort();
     port.listen(expectAsync((msg) {
       expect(msg, equals('re: hi'));
       port.close();
     }));
 
-    const String debugName = 'spawnedIsolate';
-    final i = await Isolate.spawnUri(
+    // Start new isolate; paused so it's alive till we read the debugName.
+    // If the isolate runs to completion, the isolate might get cleaned up
+    // and debugName might be null.
+    final isolate = await Isolate.spawnUri(
         Uri.parse('spawn_uri_child_isolate.dart'), ['hi'], port.sendPort,
-        debugName: debugName);
-    expect(i.debugName, debugName);
+        paused: true, debugName: debugName, onExit: exitPort.sendPort);
+
+    expect(isolate.debugName, debugName);
+
+    isolate.resume(isolate.pauseCapability);
+
+    // Explicitly await spawned isolate exit to enforce main isolate not
+    // completing (and the stand-alone runtime exiting) before the spawned
+    // isolate is done.
+    await exitPort.first;
   });
 }
diff --git a/tests/lib_2/lib_2_kernel.status b/tests/lib_2/lib_2_kernel.status
index 2c6f12b..8fb892d 100644
--- a/tests/lib_2/lib_2_kernel.status
+++ b/tests/lib_2/lib_2_kernel.status
@@ -5,6 +5,7 @@
 # "$compiler == dartkp".
 
 convert/streamed_conversion_json_utf8_decode_test: Pass, Slow # Uses --verify_before_gc --verify_after_gc --old_gen_growth_rate=1 flags
+isolate/ping_pause_test: Skip # Issue https://dartbug.com/37787
 
 [ $builder_tag == asan ]
 isolate/non_fatal_exception_in_timer_callback_test: Pass, Fail # Issue 34724
@@ -14,18 +15,13 @@
 async/slow_consumer2_test: RuntimeError
 async/stream_distinct_test: RuntimeError
 async/timer_not_available_test: RuntimeError
-isolate/ping_pause_test: Skip # Timeout
 
 [ $compiler == dartkb ]
 convert/streamed_conversion_json_utf8_decode_test: Pass, Timeout # Please triage.
 isolate/isolate_complex_messages_test: Pass, Crash # runtime/vm/object.cc: 17395: error: expected: type_arguments.IsNull() || type_arguments.IsCanonical()
 isolate/mandel_isolate_test: Pass, Timeout # Please triage.
 isolate/spawn_uri_exported_main_test: Pass, RuntimeError # Please triage: Expect.fail('Isolate was not spawned successfully.')
-mirrors/*: Skip # Mirrors are not yet supported in bytecode modes.
-mirrors/invocation_fuzz_test/emptyarray: Skip # Times out, issue 32232
-mirrors/invocation_fuzz_test/false: Skip # Times out, issue 32232
 mirrors/library_uri_io_test: RuntimeError # Platform.script points to dill file.
-mirrors/method_mirror_location_test: Crash # runtime/lib/mirrors.cc: 1634: error: expected: token_pos != TokenPosition::kNoSource
 
 [ $compiler == fasta ]
 html/*: Skip # TODO(ahe): Make dart:html available.
@@ -87,7 +83,6 @@
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/ping_pause_test: Pass, Timeout
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 mirrors/*: SkipByDesign # Mirrors are not supported in AOT mode.
 
@@ -109,7 +104,6 @@
 isolate/deferred_in_isolate2_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/deferred_in_isolate_test: Skip # Times out. Deferred loading kernel issue 28335.
 isolate/issue_21398_parent_isolate2_test/01: Skip # Times out. Deferred loading kernel issue 28335.
-isolate/ping_pause_test: Pass, Timeout
 isolate/spawn_uri_nested_vm_test: Pass, Timeout
 isolate/static_function_test: Skip # Times out. Issue 31855. CompileTimeError. Issue 31402
 mirrors/apply3_test: RuntimeError
@@ -217,8 +211,6 @@
 [ $compiler == dartk || $compiler == dartkb ]
 async/slow_consumer2_test: RuntimeError # Issue 31402 (Invocation arguments)
 async/stream_distinct_test: RuntimeError
-isolate/ping_pause_test: RuntimeError
-isolate/ping_pause_test: Skip # Issues 32137 and 32138
 isolate/request_reply_test: Pass, Timeout
 isolate/stacktrace_message_test: RuntimeError
 mirrors/constructor_optional_args_test: RuntimeError
diff --git a/tests/lib_2/lib_2_precompiled.status b/tests/lib_2/lib_2_precompiled.status
index d93502d..eb79746 100644
--- a/tests/lib_2/lib_2_precompiled.status
+++ b/tests/lib_2/lib_2_precompiled.status
@@ -6,6 +6,5 @@
 async/future_or_strong_test: RuntimeError
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 isolate/compile_time_error_test/01: Skip # Issue 12587
-isolate/ping_pause_test: Skip # Resolve test issues
 isolate/ping_test: Skip # Resolve test issues
 mirrors/symbol_validation_test: RuntimeError # Issue 13596
diff --git a/tests/lib_2/mirrors/invocation_fuzz_test.dart b/tests/lib_2/mirrors/invocation_fuzz_test.dart
index 62c3141..575890b 100644
--- a/tests/lib_2/mirrors/invocation_fuzz_test.dart
+++ b/tests/lib_2/mirrors/invocation_fuzz_test.dart
@@ -11,6 +11,7 @@
 
 import 'dart:mirrors';
 import 'dart:async';
+import 'dart:io';
 
 // Methods to be skipped, by qualified name.
 var blacklist = [
@@ -30,22 +31,8 @@
   'dart.developer.debugger',
 
   // Don't run blocking io calls.
-  new RegExp(r".*Sync$"),
-
-  // These prevent the test from exiting.
   'dart.io.sleep',
-  'dart._http.HttpServer.HttpServer.listenOn',
-
-  // These either cause the VM to segfault or throw uncatchable API errors.
-  // TODO(15274): Fix them and remove from blacklist.
-  'dart.io.SystemEncoding.decode', // Windows only
-  'dart.io.SystemEncoding.encode', // Windows only
-
-  // These construct an object with an uninitialized native field.
-  // TODO(23869): We could make this safer, but making the failure non-fatal
-  //   would we worthless aside from this test.
-  'dart.io.X509Certificate.X509Certificate._',
-  'dart.io._X509Impl._X509Impl',
+  new RegExp(r".*Sync$"),
 
   // Don't call private methods in dart.async as they may circumvent the zoned
   // error handling below.
@@ -141,7 +128,8 @@
 doOneTask() {
   if (queue.length == 0) {
     print('Done');
-    return;
+    // Forcibly exit as we likely opened sockets and timers during the fuzzing.
+    exit(0);
   }
 
   var task = queue.removeLast();
diff --git a/tests/lib_2/mirrors/parameter_abstract_test.dart b/tests/lib_2/mirrors/parameter_abstract_test.dart
new file mode 100644
index 0000000..298f5e9
--- /dev/null
+++ b/tests/lib_2/mirrors/parameter_abstract_test.dart
@@ -0,0 +1,34 @@
+// 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.
+
+// BOGUS: Note that both AST and bytecode modes are missing default values.
+
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+const X = 'X';
+const Y = 'Y';
+const Z = 'Z';
+
+abstract class C {
+  foo1({@X int x: 1, @Y int y: 2, @Z int z: 3});
+}
+
+main() {
+  ClassMirror cm = reflectClass(C);
+
+  MethodMirror foo1 = cm.declarations[#foo1];
+  expect('Method(s(foo1) in s(C), abstract)', foo1);
+  expect(
+      'Parameter(s(x) in s(foo1), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      foo1.parameters[0]);
+  expect(
+      'Parameter(s(y) in s(foo1), optional, named, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      foo1.parameters[1]);
+  expect(
+      'Parameter(s(z) in s(foo1), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      foo1.parameters[2]);
+}
diff --git a/tests/lib_2/mirrors/parameter_optional_order_test.dart b/tests/lib_2/mirrors/parameter_optional_order_test.dart
new file mode 100644
index 0000000..74badd9
--- /dev/null
+++ b/tests/lib_2/mirrors/parameter_optional_order_test.dart
@@ -0,0 +1,107 @@
+// 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:mirrors';
+
+import 'package:expect/expect.dart';
+import 'stringify.dart';
+
+const X = 'X';
+const Y = 'Y';
+const Z = 'Z';
+
+class C {
+  positional1(u, v, w, [@X int x = 1, @Y int y = 2, @Z int z = 3]) {}
+  positional2(u, v, w, [@Y int y = 1, @Z int z = 2, @X int x = 3]) {}
+  positional3(u, v, w, [@Z int z = 1, @X int x = 2, @Y int y = 3]) {}
+
+  named1(u, v, w, {@X int x: 1, @Y int y: 2, @Z int z: 3}) {}
+  named2(u, v, w, {@Y int y: 1, @Z int z: 2, @X int x: 3}) {}
+  named3(u, v, w, {@Z int z: 1, @X int x: 2, @Y int y: 3}) {}
+}
+
+testPositional() {
+  ClassMirror cm = reflectClass(C);
+
+  MethodMirror positional1 = cm.declarations[#positional1];
+  expect('Method(s(positional1) in s(C))', positional1);
+  expect(
+      'Parameter(s(x) in s(positional1), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      positional1.parameters[3]);
+  expect(
+      'Parameter(s(y) in s(positional1), optional, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      positional1.parameters[4]);
+  expect(
+      'Parameter(s(z) in s(positional1), optional, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      positional1.parameters[5]);
+
+  MethodMirror positional2 = cm.declarations[#positional2];
+  expect('Method(s(positional2) in s(C))', positional2);
+  expect(
+      'Parameter(s(y) in s(positional2), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      positional2.parameters[3]);
+  expect(
+      'Parameter(s(z) in s(positional2), optional, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      positional2.parameters[4]);
+  expect(
+      'Parameter(s(x) in s(positional2), optional, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      positional2.parameters[5]);
+
+  MethodMirror positional3 = cm.declarations[#positional3];
+  expect('Method(s(positional3) in s(C))', positional3);
+  expect(
+      'Parameter(s(z) in s(positional3), optional, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      positional3.parameters[3]);
+  expect(
+      'Parameter(s(x) in s(positional3), optional, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      positional3.parameters[4]);
+  expect(
+      'Parameter(s(y) in s(positional3), optional, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      positional3.parameters[5]);
+}
+
+testNamed() {
+  ClassMirror cm = reflectClass(C);
+
+  MethodMirror named1 = cm.declarations[#named1];
+  expect('Method(s(named1) in s(C))', named1);
+  expect(
+      'Parameter(s(x) in s(named1), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      named1.parameters[3]);
+  expect(
+      'Parameter(s(y) in s(named1), optional, named, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      named1.parameters[4]);
+  expect(
+      'Parameter(s(z) in s(named1), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      named1.parameters[5]);
+
+  MethodMirror named2 = cm.declarations[#named2];
+  expect('Method(s(named2) in s(C))', named2);
+  expect(
+      'Parameter(s(y) in s(named2), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      named2.parameters[3]);
+  expect(
+      'Parameter(s(z) in s(named2), optional, named, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      named2.parameters[4]);
+  expect(
+      'Parameter(s(x) in s(named2), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      named2.parameters[5]);
+
+  MethodMirror named3 = cm.declarations[#named3];
+  expect('Method(s(named3) in s(C))', named3);
+  expect(
+      'Parameter(s(z) in s(named3), optional, named, value = Instance(value = 1), type = Class(s(int) in s(dart.core), top-level))',
+      named3.parameters[3]);
+  expect(
+      'Parameter(s(x) in s(named3), optional, named, value = Instance(value = 2), type = Class(s(int) in s(dart.core), top-level))',
+      named3.parameters[4]);
+  expect(
+      'Parameter(s(y) in s(named3), optional, named, value = Instance(value = 3), type = Class(s(int) in s(dart.core), top-level))',
+      named3.parameters[5]);
+}
+
+main() {
+  testPositional();
+  testNamed();
+}
diff --git a/tests/modular/issue37523/def.dart b/tests/modular/issue37523/def.dart
new file mode 100644
index 0000000..3cda2b0
--- /dev/null
+++ b/tests/modular/issue37523/def.dart
@@ -0,0 +1,15 @@
+// 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.
+
+class B {
+  const B();
+}
+
+class A {
+  final B b;
+  const A(this.b);
+}
+
+const ab = A(B());
+const b = B();
diff --git a/tests/modular/issue37523/main.dart b/tests/modular/issue37523/main.dart
new file mode 100644
index 0000000..ecf904f
--- /dev/null
+++ b/tests/modular/issue37523/main.dart
@@ -0,0 +1,15 @@
+// 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:expect/expect.dart';
+
+import 'def.dart';
+
+main() {
+  const v1 = A(B());
+  const v2 = ab;
+  const v3 = A(b);
+  Expect.equals(v1, v2);
+  Expect.equals(v2, v3);
+}
diff --git a/tests/modular/issue37523/modules.yaml b/tests/modular/issue37523/modules.yaml
new file mode 100644
index 0000000..23b5d70
--- /dev/null
+++ b/tests/modular/issue37523/modules.yaml
@@ -0,0 +1,8 @@
+# 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.
+
+dependencies:
+  main: [def, expect]
+flags:
+  - constant-update-2018
\ No newline at end of file
diff --git a/tests/modular/issue37794/main.dart b/tests/modular/issue37794/main.dart
new file mode 100644
index 0000000..d1c1e1c
--- /dev/null
+++ b/tests/modular/issue37794/main.dart
@@ -0,0 +1,16 @@
+// 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:expect/expect.dart';
+
+import 'module2.dart';
+import 'module1.dart';
+
+main() {
+  const x = B();
+  const y = A();
+  Expect.equals('foo', x.foo);
+  Expect.listEquals(['l', 'i', 's', 't'], x.list);
+  Expect.equals('foo', y.foo);
+  Expect.listEquals(['l', 'i', 's', 't'], y.list);
+}
diff --git a/tests/modular/issue37794/module1.dart b/tests/modular/issue37794/module1.dart
new file mode 100644
index 0000000..6a41a30
--- /dev/null
+++ b/tests/modular/issue37794/module1.dart
@@ -0,0 +1,16 @@
+// 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.
+
+class A {
+  final String foo;
+  final List<String> list;
+
+  const A(
+      [this.foo = 'foo',
+      this.list = const [
+        'l',
+        ...['i', 's'],
+        't'
+      ]]);
+}
diff --git a/tests/modular/issue37794/module2.dart b/tests/modular/issue37794/module2.dart
new file mode 100644
index 0000000..881d85a
--- /dev/null
+++ b/tests/modular/issue37794/module2.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.
+
+import 'module1.dart';
+
+class B extends A {
+  const B();
+}
diff --git a/tests/modular/issue37794/modules.yaml b/tests/modular/issue37794/modules.yaml
new file mode 100644
index 0000000..c4954a9
--- /dev/null
+++ b/tests/modular/issue37794/modules.yaml
@@ -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.
+
+dependencies:
+  main: [module1, module2, expect]
+  module2: [module1]
+flags:
+  - constant-update-2018
\ No newline at end of file
diff --git a/tests/modular/nested_constants/def.dart b/tests/modular/nested_constants/def.dart
new file mode 100644
index 0000000..3cda2b0
--- /dev/null
+++ b/tests/modular/nested_constants/def.dart
@@ -0,0 +1,15 @@
+// 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.
+
+class B {
+  const B();
+}
+
+class A {
+  final B b;
+  const A(this.b);
+}
+
+const ab = A(B());
+const b = B();
diff --git a/tests/modular/nested_constants/main.dart b/tests/modular/nested_constants/main.dart
new file mode 100644
index 0000000..6d4327c
--- /dev/null
+++ b/tests/modular/nested_constants/main.dart
@@ -0,0 +1,15 @@
+// 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:expect/expect.dart';
+
+import 'def.dart';
+
+const c1 = A(B());
+const c2 = ab;
+const c3 = A(b);
+
+main() {
+  Expect.equals(c1, c2);
+  Expect.equals(c2, c3);
+}
diff --git a/tests/modular/nested_constants/modules.yaml b/tests/modular/nested_constants/modules.yaml
new file mode 100644
index 0000000..61a7504
--- /dev/null
+++ b/tests/modular/nested_constants/modules.yaml
@@ -0,0 +1,10 @@
+# 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.
+#
+# Regression test: constants nested in other constants constructed in across
+# module context.
+dependencies:
+  main: [def, expect]
+flags:
+  - constant-update-2018
diff --git a/tests/standalone_2/assert_assignable_canon_test.dart b/tests/standalone_2/assert_assignable_canon_test.dart
index 7c34328..f32f5c8 100644
--- a/tests/standalone_2/assert_assignable_canon_test.dart
+++ b/tests/standalone_2/assert_assignable_canon_test.dart
@@ -2,20 +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.
 //
-// VMOptions=--enable-inlining-annotations --optimization-counter-threshold=10 --no-background-compilation
-
-const AlwaysInline = "AlwaysInline";
-const NeverInline = "NeverInline";
+// VMOptions=--optimization-counter-threshold=10 --no-background-compilation
 
 abstract class A<T extends A<T>> {
-  @AlwaysInline
+  @pragma('vm:prefer-inline')
   f(x) => new R<T>(x);
 }
 
 class B extends A<B> {}
 
 class R<T> {
-  @AlwaysInline
+  @pragma('vm:prefer-inline')
   R(T field);
 }
 
@@ -26,7 +23,7 @@
 // f will be inlined and T=B will be forwarded to AssertAssignable in the
 // R. However B will be wrapped in the TypeRef which breaks runtime TypeCheck
 // function (Instance::IsInstanceOf does not work for TypeRefs).
-@NeverInline
+@pragma('vm:never-inline')
 f(o) => new B().f(o);
 
 main() {
diff --git a/tests/standalone_2/io/client_socket_add_close_no_error_test.dart b/tests/standalone_2/io/client_socket_add_close_no_error_test.dart
index a70d779..7b92acc 100644
--- a/tests/standalone_2/io/client_socket_add_close_no_error_test.dart
+++ b/tests/standalone_2/io/client_socket_add_close_no_error_test.dart
@@ -15,7 +15,7 @@
     var completer = new Completer();
     server.listen((socket) {
       // The socket is 'paused' until the future completes.
-      completer.future.then((_) => socket.pipe(socket));
+      completer.future.then((_) => socket.cast<List<int>>().pipe(socket));
     });
     Socket.connect("127.0.0.1", server.port).then((client) {
       const int SIZE = 1024 * 1024;
diff --git a/tests/standalone_2/io/client_socket_destory_no_error_test.dart b/tests/standalone_2/io/client_socket_destory_no_error_test.dart
index 23d6473..37aaf49 100644
--- a/tests/standalone_2/io/client_socket_destory_no_error_test.dart
+++ b/tests/standalone_2/io/client_socket_destory_no_error_test.dart
@@ -13,7 +13,7 @@
 void clientSocketDestroyNoErrorTest() {
   ServerSocket.bind("127.0.0.1", 0).then((server) {
     server.listen((socket) {
-      socket.pipe(socket);
+      socket.cast<List<int>>().pipe(socket);
     });
     Socket.connect("127.0.0.1", server.port).then((client) {
       client.listen((data) {}, onDone: server.close);
diff --git a/tests/standalone_2/io/http_close_test.dart b/tests/standalone_2/io/http_close_test.dart
index 148f767..d07175f 100644
--- a/tests/standalone_2/io/http_close_test.dart
+++ b/tests/standalone_2/io/http_close_test.dart
@@ -13,7 +13,7 @@
 import "dart:typed_data";
 import "dart:math";
 
-void testClientAndServerCloseNoListen(int connections) {
+testClientAndServerCloseNoListen(int connections) {
   HttpServer.bind("127.0.0.1", 0).then((server) {
     int closed = 0;
     server.listen((request) {
@@ -28,7 +28,7 @@
         }
       });
     });
-    var client = new HttpClient();
+    var client = HttpClient();
     for (int i = 0; i < connections; i++) {
       client
           .get("127.0.0.1", server.port, "/")
@@ -38,10 +38,10 @@
   });
 }
 
-void testClientCloseServerListen(int connections) {
+testClientCloseServerListen(int connections) {
   HttpServer.bind("127.0.0.1", 0).then((server) {
     int closed = 0;
-    void check() {
+    check() {
       closed++;
       if (closed == connections * 2) {
         Expect.equals(0, server.connectionsInfo().active);
@@ -57,7 +57,7 @@
         request.response.done.then((_) => check());
       });
     });
-    var client = new HttpClient();
+    var client = HttpClient();
     for (int i = 0; i < connections; i++) {
       client
           .get("127.0.0.1", server.port, "/")
@@ -67,15 +67,15 @@
   });
 }
 
-void testClientCloseSendingResponse(int connections) {
-  var buffer = new Uint8List(64 * 1024);
-  var rand = new Random();
+testClientCloseSendingResponse(int connections) {
+  var buffer = Uint8List(64 * 1024);
+  var rand = Random();
   for (int i = 0; i < buffer.length; i++) {
     buffer[i] = rand.nextInt(256);
   }
   HttpServer.bind("127.0.0.1", 0).then((server) {
     int closed = 0;
-    void check() {
+    check() {
       closed++;
       // Wait for both server and client to see the connections as closed.
       if (closed == connections * 2) {
@@ -87,7 +87,7 @@
     }
 
     server.listen((request) {
-      var timer = new Timer.periodic(const Duration(milliseconds: 50), (_) {
+      var timer = Timer.periodic(const Duration(milliseconds: 50), (_) {
         request.response.add(buffer);
       });
       request.response.done.catchError((_) {}).whenComplete(() {
@@ -95,7 +95,7 @@
         timer.cancel();
       });
     });
-    var client = new HttpClient();
+    var client = HttpClient();
     for (int i = 0; i < connections; i++) {
       client
           .get("127.0.0.1", server.port, "/")
@@ -104,7 +104,7 @@
         // Ensure we don't accept the response until we have send the entire
         // request.
         var subscription = response.listen((_) {});
-        new Timer(const Duration(milliseconds: 20), () {
+        Timer(const Duration(milliseconds: 20), () {
           subscription.cancel();
           check();
         });
@@ -113,30 +113,37 @@
   });
 }
 
-void testClientCloseWhileSendingRequest(int connections) {
+// Closing the request early, before sending the full request payload should
+// result in an error on both server and client.
+testClientCloseWhileSendingRequest(int connections) {
   HttpServer.bind("127.0.0.1", 0).then((server) {
-    int errors = 0;
+    int serverErrors = 0;
+    int clientErrors = 0;
     server.listen((request) {
-      request.listen((_) {});
+      request.listen((_) {}, onError: (_) {
+        serverErrors++;
+        if (serverErrors == connections) {
+          server.close();
+        }
+      });
+    }, onDone: () {
+      Expect.equals(connections, clientErrors);
+      Expect.equals(connections, serverErrors);
     });
-    var client = new HttpClient();
-    int closed = 0;
+    var client = HttpClient();
     for (int i = 0; i < connections; i++) {
       client.post("127.0.0.1", server.port, "/").then((request) {
         request.contentLength = 110;
         request.write("0123456789");
         return request.close();
       }).catchError((_) {
-        closed++;
-        if (closed == connections) {
-          server.close();
-        }
+        clientErrors++;
       });
     }
   });
 }
 
-void main() {
+main() {
   testClientAndServerCloseNoListen(10);
   testClientCloseServerListen(10);
   testClientCloseSendingResponse(10);
diff --git a/tests/standalone_2/io/http_detach_socket_test.dart b/tests/standalone_2/io/http_detach_socket_test.dart
index 4314744..4bdbba5 100644
--- a/tests/standalone_2/io/http_detach_socket_test.dart
+++ b/tests/standalone_2/io/http_detach_socket_test.dart
@@ -151,7 +151,7 @@
       if (request.headers.value('upgrade') == 'mine') {
         asyncStart();
         request.response.detachSocket().then((socket) {
-          socket.pipe(socket).then((_) {
+          socket.cast<List<int>>().pipe(socket).then((_) {
             asyncEnd();
           });
         });
diff --git a/tests/standalone_2/io/http_parser_test.dart b/tests/standalone_2/io/http_parser_test.dart
index 9dc9311..d82f355 100644
--- a/tests/standalone_2/io/http_parser_test.dart
+++ b/tests/standalone_2/io/http_parser_test.dart
@@ -39,7 +39,7 @@
       int unparsedLength: 0,
       bool connectionClose: false,
       String expectedVersion: "1.1"}) {
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
     void reset() {
       _HttpParser httpParser = new _HttpParser.requestParser();
       controller = new StreamController(sync: true);
@@ -162,7 +162,7 @@
   static void _testParseInvalidRequest(String request) {
     _HttpParser httpParser;
     bool errorCalled;
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
 
     void reset() {
       httpParser = new _HttpParser.requestParser();
@@ -214,7 +214,7 @@
       bool upgrade: false,
       int unparsedLength: 0,
       String expectedVersion: "1.1"}) {
-    StreamController<List<int>> controller;
+    StreamController<Uint8List> controller;
     bool upgraded;
 
     void reset() {
@@ -309,7 +309,7 @@
   static void _testParseInvalidResponse(String response, [bool close = false]) {
     void testWrite(List<int> requestData, [int chunkSize = -1]) {
       _HttpParser httpParser = new _HttpParser.responseParser();
-      StreamController<List<int>> controller = new StreamController(sync: true);
+      StreamController<Uint8List> controller = new StreamController(sync: true);
       bool errorCalled = false;
       ;
 
diff --git a/tests/standalone_2/io/http_proxy_advanced_test.dart b/tests/standalone_2/io/http_proxy_advanced_test.dart
index 5f8758b..231d7ab 100644
--- a/tests/standalone_2/io/http_proxy_advanced_test.dart
+++ b/tests/standalone_2/io/http_proxy_advanced_test.dart
@@ -234,8 +234,8 @@
           Socket.connect(tmp[0], int.parse(tmp[1])).then((socket) {
             request.response.reasonPhrase = "Connection established";
             request.response.detachSocket().then((detached) {
-              socket.pipe(detached);
-              detached.pipe(socket);
+              socket.cast<List<int>>().pipe(detached);
+              detached.cast<List<int>>().pipe(socket);
             });
           });
         } else {
diff --git a/tests/standalone_2/io/http_proxy_test.dart b/tests/standalone_2/io/http_proxy_test.dart
index b153ead..a302eb0 100644
--- a/tests/standalone_2/io/http_proxy_test.dart
+++ b/tests/standalone_2/io/http_proxy_test.dart
@@ -222,8 +222,8 @@
           Socket.connect(tmp[0], int.parse(tmp[1])).then((socket) {
             request.response.reasonPhrase = "Connection established";
             request.response.detachSocket().then((detached) {
-              socket.pipe(detached);
-              detached.pipe(socket);
+              socket.cast<List<int>>().pipe(detached);
+              detached.cast<List<int>>().pipe(socket);
             });
           });
         } else {
diff --git a/tests/standalone_2/io/pipe_server_test.dart b/tests/standalone_2/io/pipe_server_test.dart
index 0b30e2e..b559452 100644
--- a/tests/standalone_2/io/pipe_server_test.dart
+++ b/tests/standalone_2/io/pipe_server_test.dart
@@ -51,7 +51,7 @@
         var dstFile = new File(dstFileName);
         dstFile.createSync();
         var fileOutput = dstFile.openWrite();
-        _socket.pipe(fileOutput).then((_) {
+        _socket.cast<List<int>>().pipe(fileOutput).then((_) {
           // Check that the resulting file is equal to the initial
           // file.
           bool result = compareFileContent(srcFileName, dstFileName);
@@ -109,7 +109,7 @@
 // stream to its output stream.
 class PipeServer extends TestingServer {
   void onConnection(Socket connection) {
-    connection.pipe(connection);
+    connection.cast<List<int>>().pipe(connection);
   }
 }
 
diff --git a/tests/standalone_2/io/secure_socket_alpn_test.dart b/tests/standalone_2/io/secure_socket_alpn_test.dart
index d8f997c..5fbc814 100644
--- a/tests/standalone_2/io/secure_socket_alpn_test.dart
+++ b/tests/standalone_2/io/secure_socket_alpn_test.dart
@@ -33,8 +33,7 @@
     List<String> serverProtocols, String selectedProtocol) {
   asyncStart();
   var sContext = serverContext()..setAlpnProtocols(serverProtocols, true);
-  SecureServerSocket
-      .bind('localhost', 0, sContext)
+  SecureServerSocket.bind('localhost', 0, sContext)
       .then((SecureServerSocket server) {
     asyncStart();
     server.first.then((SecureSocket socket) {
@@ -42,22 +41,21 @@
       socket
         ..write('server message')
         ..close();
-      socket.transform(ascii.decoder).join('').then((String s) {
+      ascii.decoder.bind(socket).join('').then((String s) {
         Expect.equals('client message', s);
         asyncEnd();
       });
     });
 
     asyncStart();
-    SecureSocket
-        .connect('localhost', server.port,
+    SecureSocket.connect('localhost', server.port,
             context: clientContext(), supportedProtocols: clientProtocols)
         .then((socket) {
       Expect.equals(selectedProtocol, socket.selectedProtocol);
       socket
         ..write('client message')
         ..close();
-      socket.transform(ascii.decoder).join('').then((String s) {
+      ascii.decoder.bind(socket).join('').then((String s) {
         Expect.equals('server message', s);
         server.close();
         asyncEnd();
@@ -108,8 +106,7 @@
     });
 
     asyncStart();
-    SecureSocket
-        .connect('localhost', server.port,
+    SecureSocket.connect('localhost', server.port,
             context: clientContext(), supportedProtocols: protocols)
         .then((socket) {
       Expect.fail(
diff --git a/tests/standalone_2/io/secure_socket_renegotiate_test.dart b/tests/standalone_2/io/secure_socket_renegotiate_test.dart
index d10e743..5ef9edf 100644
--- a/tests/standalone_2/io/secure_socket_renegotiate_test.dart
+++ b/tests/standalone_2/io/secure_socket_renegotiate_test.dart
@@ -26,14 +26,13 @@
       password: 'dartdart');
 
 Future<SecureServerSocket> runServer() {
-  return SecureServerSocket
-      .bind(HOST_NAME, 0, serverContext)
+  return SecureServerSocket.bind(HOST_NAME, 0, serverContext)
       .then((SecureServerSocket server) {
     server.listen((SecureSocket socket) {
       Expect.isNull(socket.peerCertificate);
 
       StreamIterator<String> input = new StreamIterator(
-          socket.transform(utf8.decoder).transform(new LineSplitter()));
+          utf8.decoder.bind(socket).transform(new LineSplitter()));
       input.moveNext().then((success) {
         Expect.isTrue(success);
         Expect.equals('first', input.current);
@@ -66,12 +65,15 @@
 
 void main() {
   runServer().then((SecureServerSocket server) {
-    var clientScript =
-        Platform.script.resolve('secure_socket_renegotiate_client.dart').toFilePath();
-    Process
-        .run(Platform.executable,
-        []..addAll(Platform.executableArguments)..addAll([clientScript, server.port.toString()])).then(
-            (ProcessResult result) {
+    var clientScript = Platform.script
+        .resolve('secure_socket_renegotiate_client.dart')
+        .toFilePath();
+    Process.run(
+            Platform.executable,
+            []
+              ..addAll(Platform.executableArguments)
+              ..addAll([clientScript, server.port.toString()]))
+        .then((ProcessResult result) {
       if (result.exitCode != 0) {
         print("Client failed, stdout:");
         print(result.stdout);
diff --git a/tests/standalone_2/io/socket_cross_process_test.dart b/tests/standalone_2/io/socket_cross_process_test.dart
index bdf8e2d..295f216 100644
--- a/tests/standalone_2/io/socket_cross_process_test.dart
+++ b/tests/standalone_2/io/socket_cross_process_test.dart
@@ -27,15 +27,14 @@
 Future makeServer() {
   return ServerSocket.bind(InternetAddress.loopbackIPv4, 0).then((server) {
     server.listen((request) {
-      request.pipe(request);
+      request.cast<List<int>>().pipe(request);
     });
     return server;
   });
 }
 
 Future runClientProcess(int port) {
-  return Process
-      .run(
+  return Process.run(
           Platform.executable,
           []
             ..addAll(Platform.executableArguments)
diff --git a/tests/standalone_2/io/test_extension_tester.dart b/tests/standalone_2/io/test_extension_tester.dart
index 2c34983..66380a7 100644
--- a/tests/standalone_2/io/test_extension_tester.dart
+++ b/tests/standalone_2/io/test_extension_tester.dart
@@ -4,6 +4,8 @@
 
 library test_extension_test;
 
+import 'dart:isolate';
+
 import "test_extension.dart";
 
 class Expect {
@@ -22,7 +24,9 @@
   }
 }
 
-main() {
+isolateHandler(_) {}
+
+main() async {
   Expect.equals('cat 13', new Cat(13).toString(), 'new Cat(13).toString()');
 
   Expect.equals(3, Cat.ifNull(null, 3), 'Cat.ifNull(null, 3)');
@@ -35,4 +39,6 @@
   } on String catch (e) {
     Expect.equals("ball", e);
   }
+
+  await Isolate.spawn(isolateHandler, []);
 }
diff --git a/tests/standalone_2/standalone_2.status b/tests/standalone_2/standalone_2.status
index 559025f..e92168c 100644
--- a/tests/standalone_2/standalone_2.status
+++ b/tests/standalone_2/standalone_2.status
@@ -5,7 +5,6 @@
 # Tests using the multitest feature where failure is expected should *also* be
 # listed in tests/lib/analyzer/analyze_tests.status without the "standalone"
 # prefix.
-io/http_close_test: Pass, RuntimeError # Issue 28380
 io/non_utf8_directory_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/non_utf8_file_test: Skip # Issue 33519. Temp files causing bots to go purple.
 io/non_utf8_link_test: Skip # Issue 33519. Temp files causing bots to go purple.
diff --git a/tests/standalone_2/standalone_2_kernel.status b/tests/standalone_2/standalone_2_kernel.status
index fa9f5d7..5c31cdf 100644
--- a/tests/standalone_2/standalone_2_kernel.status
+++ b/tests/standalone_2/standalone_2_kernel.status
@@ -77,7 +77,6 @@
 io/compile_all_test: Skip # We do not support --compile-all for precompilation
 io/file_fuzz_test: RuntimeError, Pass
 io/http_client_connect_test: Skip # Flaky.
-io/http_close_test: Crash
 io/http_content_length_test: Skip # Flaky.
 io/http_proxy_advanced_test: Skip # Flaky
 io/http_proxy_test: Skip # Flaky.
@@ -108,9 +107,6 @@
 [ $compiler == dartkp && $runtime == dart_precompiled && $system != windows ]
 io/namespace_test: RuntimeError
 
-[ $compiler == dartkp && $system == android ]
-io/http_close_test: Timeout # Issue 28380
-
 [ $mode == debug && $runtime == vm && ($compiler == dartk || $compiler == dartkb) ]
 io/file_lock_test: Slow, Pass
 io/raw_socket_test: Crash
diff --git a/third_party/llvm/BUILD.gn b/third_party/llvm/BUILD.gn
new file mode 100644
index 0000000..7442423
--- /dev/null
+++ b/third_party/llvm/BUILD.gn
@@ -0,0 +1,1576 @@
+# 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.
+
+declare_args() {
+  llvm_prefix = "//third_party/llvm"
+}
+
+template("llvm_library") {
+  config(target_name + "_config") {
+    visibility = [ ":*" ]
+    include_dirs = [ "include" ]
+    libs = [ "lib/lib${target_name}.a" ]
+  }
+
+  group(target_name) {
+    forward_variables_from(invoker, [ "deps" ])
+    public_configs = [ ":${target_name}_config" ]
+  }
+}
+
+llvm_library("LLVMDemangle") {
+}
+
+llvm_library("LLVMSupport") {
+  deps = [
+    ":LLVMDemangle",
+  ]
+}
+
+llvm_library("LLVMAArch64Utils") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBinaryFormat") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMDebugInfoMSF") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMDebugInfoCodeView") {
+  deps = [
+    ":LLVMDebugInfoMSF",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMC") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMDebugInfoCodeView",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAArch64AsmPrinter") {
+  deps = [
+    ":LLVMAArch64Utils",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAArch64Info") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAArch64Desc") {
+  deps = [
+    ":LLVMAArch64AsmPrinter",
+    ":LLVMAArch64Info",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMCParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAArch64AsmParser") {
+  deps = [
+    ":LLVMAArch64Desc",
+    ":LLVMAArch64Info",
+    ":LLVMAArch64Utils",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMCore") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBitReader") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMObject") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMBitReader",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMProfileData") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAnalysis") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMCore",
+    ":LLVMObject",
+    ":LLVMProfileData",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBitWriter") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMObject",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMTransformUtils") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAggressiveInstCombine") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMInstCombine") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMScalarOpts") {
+  deps = [
+    ":LLVMAggressiveInstCombine",
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMInstCombine",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMTarget") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMBitReader",
+    ":LLVMBitWriter",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMProfileData",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMAsmPrinter") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMBinaryFormat",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMDebugInfoCodeView",
+    ":LLVMDebugInfoMSF",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMSelectionDAG") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMGlobalISel") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMAArch64CodeGen") {
+  deps = [
+    ":LLVMAArch64AsmPrinter",
+    ":LLVMAArch64Desc",
+    ":LLVMAArch64Info",
+    ":LLVMAArch64Utils",
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMMCDisassembler") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAArch64Disassembler") {
+  deps = [
+    ":LLVMAArch64Desc",
+    ":LLVMAArch64Info",
+    ":LLVMAArch64Utils",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAMDGPUUtils") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAMDGPUAsmPrinter") {
+  deps = [
+    ":LLVMAMDGPUUtils",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAMDGPUInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAMDGPUDesc") {
+  deps = [
+    ":LLVMAMDGPUAsmPrinter",
+    ":LLVMAMDGPUInfo",
+    ":LLVMAMDGPUUtils",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAMDGPUAsmParser") {
+  deps = [
+    ":LLVMAMDGPUDesc",
+    ":LLVMAMDGPUInfo",
+    ":LLVMAMDGPUUtils",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAsmParser") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMIRReader") {
+  deps = [
+    ":LLVMAsmParser",
+    ":LLVMBitReader",
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLinker") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMVectorize") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMInstrumentation") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMProfileData",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMipo") {
+  deps = [
+    ":LLVMAggressiveInstCombine",
+    ":LLVMAnalysis",
+    ":LLVMBitReader",
+    ":LLVMBitWriter",
+    ":LLVMCore",
+    ":LLVMIRReader",
+    ":LLVMInstCombine",
+    ":LLVMInstrumentation",
+    ":LLVMLinker",
+    ":LLVMObject",
+    ":LLVMProfileData",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+    ":LLVMVectorize",
+  ]
+}
+
+llvm_library("LLVMAMDGPUCodeGen") {
+  deps = [
+    ":LLVMAMDGPUAsmPrinter",
+    ":LLVMAMDGPUDesc",
+    ":LLVMAMDGPUInfo",
+    ":LLVMAMDGPUUtils",
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMVectorize",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMAMDGPUDisassembler") {
+  deps = [
+    ":LLVMAMDGPUDesc",
+    ":LLVMAMDGPUInfo",
+    ":LLVMAMDGPUUtils",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARCAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARCInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARCDesc") {
+  deps = [
+    ":LLVMARCAsmPrinter",
+    ":LLVMARCInfo",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARCCodeGen") {
+  deps = [
+    ":LLVMARCAsmPrinter",
+    ":LLVMARCDesc",
+    ":LLVMARCInfo",
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMARCDisassembler") {
+  deps = [
+    ":LLVMARCInfo",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMUtils") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMAsmPrinter") {
+  deps = [
+    ":LLVMARMUtils",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMDesc") {
+  deps = [
+    ":LLVMARMAsmPrinter",
+    ":LLVMARMInfo",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMAsmParser") {
+  deps = [
+    ":LLVMARMDesc",
+    ":LLVMARMInfo",
+    ":LLVMARMUtils",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMARMCodeGen") {
+  deps = [
+    ":LLVMARMAsmPrinter",
+    ":LLVMARMDesc",
+    ":LLVMARMInfo",
+    ":LLVMARMUtils",
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMARMDisassembler") {
+  deps = [
+    ":LLVMARMDesc",
+    ":LLVMARMInfo",
+    ":LLVMARMUtils",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAVRAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAVRInfo") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAVRDesc") {
+  deps = [
+    ":LLVMAVRAsmPrinter",
+    ":LLVMAVRInfo",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAVRAsmParser") {
+  deps = [
+    ":LLVMAVRDesc",
+    ":LLVMAVRInfo",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMAVRCodeGen") {
+  deps = [
+    ":LLVMAVRAsmPrinter",
+    ":LLVMAVRDesc",
+    ":LLVMAVRInfo",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMAVRDisassembler") {
+  deps = [
+    ":LLVMAVRInfo",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBPFAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBPFInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBPFDesc") {
+  deps = [
+    ":LLVMBPFAsmPrinter",
+    ":LLVMBPFInfo",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBPFAsmParser") {
+  deps = [
+    ":LLVMBPFDesc",
+    ":LLVMBPFInfo",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMBPFCodeGen") {
+  deps = [
+    ":LLVMAsmPrinter",
+    ":LLVMBPFAsmPrinter",
+    ":LLVMBPFDesc",
+    ":LLVMBPFInfo",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMBPFDisassembler") {
+  deps = [
+    ":LLVMBPFInfo",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMCoroutines") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMCoverage") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMObject",
+    ":LLVMProfileData",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMDebugInfoDWARF") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMMC",
+    ":LLVMObject",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMDebugInfoPDB") {
+  deps = [
+    ":LLVMDebugInfoCodeView",
+    ":LLVMDebugInfoMSF",
+    ":LLVMObject",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMOption") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMDlltoolDriver") {
+  deps = [
+    ":LLVMObject",
+    ":LLVMOption",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRuntimeDyld") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMObject",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMExecutionEngine") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMObject",
+    ":LLVMRuntimeDyld",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMMCJIT") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMExecutionEngine",
+    ":LLVMObject",
+    ":LLVMRuntimeDyld",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMFuzzMutate") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMBitReader",
+    ":LLVMBitWriter",
+    ":LLVMCore",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMHexagonInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMHexagonDesc") {
+  deps = [
+    ":LLVMHexagonInfo",
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMHexagonAsmParser") {
+  deps = [
+    ":LLVMHexagonDesc",
+    ":LLVMHexagonInfo",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMHexagonCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMHexagonAsmParser",
+    ":LLVMHexagonDesc",
+    ":LLVMHexagonInfo",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMHexagonDisassembler") {
+  deps = [
+    ":LLVMHexagonDesc",
+    ":LLVMHexagonInfo",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMInterpreter") {
+  deps = [
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMExecutionEngine",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMObjCARCOpts") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMCore",
+    ":LLVMSupport",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMPasses") {
+  deps = [
+    ":LLVMAggressiveInstCombine",
+    ":LLVMAnalysis",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMInstCombine",
+    ":LLVMInstrumentation",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMVectorize",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMLTO") {
+  deps = [
+    ":LLVMAggressiveInstCombine",
+    ":LLVMAnalysis",
+    ":LLVMBitReader",
+    ":LLVMBitWriter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMInstCombine",
+    ":LLVMLinker",
+    ":LLVMMC",
+    ":LLVMObjCARCOpts",
+    ":LLVMObject",
+    ":LLVMPasses",
+    ":LLVMScalarOpts",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMLanaiInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLanaiAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLanaiDesc") {
+  deps = [
+    ":LLVMLanaiAsmPrinter",
+    ":LLVMLanaiInfo",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLanaiAsmParser") {
+  deps = [
+    ":LLVMLanaiDesc",
+    ":LLVMLanaiInfo",
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLanaiCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMLanaiAsmParser",
+    ":LLVMLanaiAsmPrinter",
+    ":LLVMLanaiDesc",
+    ":LLVMLanaiInfo",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMLanaiDisassembler") {
+  deps = [
+    ":LLVMLanaiDesc",
+    ":LLVMLanaiInfo",
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLibDriver") {
+  deps = [
+    ":LLVMBinaryFormat",
+    ":LLVMObject",
+    ":LLVMOption",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMLineEditor") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMIRParser") {
+  deps = [
+    ":LLVMAsmParser",
+    ":LLVMBinaryFormat",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMMSP430AsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMSP430Info") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMSP430Desc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMSP430AsmPrinter",
+    ":LLVMMSP430Info",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMSP430CodeGen") {
+  deps = [
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMMSP430AsmPrinter",
+    ":LLVMMSP430Desc",
+    ":LLVMMSP430Info",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMMipsAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMipsInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMipsDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMipsAsmPrinter",
+    ":LLVMMipsInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMipsAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMMipsDesc",
+    ":LLVMMipsInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMMipsCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMMipsAsmPrinter",
+    ":LLVMMipsDesc",
+    ":LLVMMipsInfo",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMMipsDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMMipsInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNVPTXAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNVPTXInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNVPTXDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMNVPTXAsmPrinter",
+    ":LLVMNVPTXInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNVPTXCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMNVPTXAsmPrinter",
+    ":LLVMNVPTXDesc",
+    ":LLVMNVPTXInfo",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMVectorize",
+    ":LLVMipo",
+  ]
+}
+
+llvm_library("LLVMX86Utils") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMX86AsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMX86Utils",
+  ]
+}
+
+llvm_library("LLVMX86Info") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMX86Desc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMObject",
+    ":LLVMSupport",
+    ":LLVMX86AsmPrinter",
+    ":LLVMX86Info",
+  ]
+}
+
+llvm_library("LLVMX86CodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMX86AsmPrinter",
+    ":LLVMX86Desc",
+    ":LLVMX86Info",
+    ":LLVMX86Utils",
+  ]
+}
+
+llvm_library("LLVMNios2AsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNios2Info") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNios2Desc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMNios2AsmPrinter",
+    ":LLVMNios2Info",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMNios2CodeGen") {
+  deps = [
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMGlobalISel",
+    ":LLVMMC",
+    ":LLVMNios2Desc",
+    ":LLVMNios2Info",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMObjectYAML") {
+  deps = [
+    ":LLVMDebugInfoCodeView",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMOrcJIT") {
+  deps = [
+    ":LLVMCore",
+    ":LLVMExecutionEngine",
+    ":LLVMMC",
+    ":LLVMObject",
+    ":LLVMRuntimeDyld",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMPowerPCAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMPowerPCInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMPowerPCDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMPowerPCAsmPrinter",
+    ":LLVMPowerPCInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMPowerPCAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMPowerPCDesc",
+    ":LLVMPowerPCInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMPowerPCCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMPowerPCAsmPrinter",
+    ":LLVMPowerPCDesc",
+    ":LLVMPowerPCInfo",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+  ]
+}
+
+llvm_library("LLVMPowerPCDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMPowerPCInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRISCVAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRISCVInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRISCVDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMRISCVAsmPrinter",
+    ":LLVMRISCVInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRISCVAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMRISCVDesc",
+    ":LLVMRISCVInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMRISCVCodeGen") {
+  deps = [
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMRISCVAsmPrinter",
+    ":LLVMRISCVDesc",
+    ":LLVMRISCVInfo",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMRISCVDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMRISCVInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSparcAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSparcInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSparcDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSparcAsmPrinter",
+    ":LLVMSparcInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSparcAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSparcDesc",
+    ":LLVMSparcInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSparcCodeGen") {
+  deps = [
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSparcAsmPrinter",
+    ":LLVMSparcDesc",
+    ":LLVMSparcInfo",
+    ":LLVMSupport",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMSparcDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMSparcInfo",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSymbolize") {
+  deps = [
+    ":LLVMDebugInfoDWARF",
+    ":LLVMDebugInfoPDB",
+    ":LLVMDemangle",
+    ":LLVMObject",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSystemZAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSystemZInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMSystemZDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMSystemZAsmPrinter",
+    ":LLVMSystemZInfo",
+  ]
+}
+
+llvm_library("LLVMSystemZAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+    ":LLVMSystemZDesc",
+    ":LLVMSystemZInfo",
+  ]
+}
+
+llvm_library("LLVMSystemZCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMSystemZAsmPrinter",
+    ":LLVMSystemZDesc",
+    ":LLVMSystemZInfo",
+    ":LLVMTarget",
+  ]
+}
+
+llvm_library("LLVMSystemZDisassembler") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+    ":LLVMSystemZDesc",
+    ":LLVMSystemZInfo",
+  ]
+}
+
+llvm_library("LLVMTableGen") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMTestingSupport") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyAsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+    ":LLVMWebAssemblyInfo",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMWebAssemblyAsmPrinter",
+    ":LLVMWebAssemblyInfo",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMScalarOpts",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMWebAssemblyAsmPrinter",
+    ":LLVMWebAssemblyDesc",
+    ":LLVMWebAssemblyInfo",
+  ]
+}
+
+llvm_library("LLVMWebAssemblyDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+    ":LLVMWebAssemblyInfo",
+  ]
+}
+
+llvm_library("LLVMWindowsManifest") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMX86AsmParser") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMMCParser",
+    ":LLVMSupport",
+    ":LLVMX86AsmPrinter",
+    ":LLVMX86Desc",
+    ":LLVMX86Info",
+  ]
+}
+
+llvm_library("LLVMX86Disassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+    ":LLVMX86Info",
+  ]
+}
+
+llvm_library("LLVMXCoreAsmPrinter") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMXCoreInfo") {
+  deps = [
+    ":LLVMSupport",
+  ]
+}
+
+llvm_library("LLVMXCoreDesc") {
+  deps = [
+    ":LLVMMC",
+    ":LLVMSupport",
+    ":LLVMXCoreAsmPrinter",
+    ":LLVMXCoreInfo",
+  ]
+}
+
+llvm_library("LLVMXCoreCodeGen") {
+  deps = [
+    ":LLVMAnalysis",
+    ":LLVMAsmPrinter",
+    ":LLVMCodeGen",
+    ":LLVMCore",
+    ":LLVMMC",
+    ":LLVMSelectionDAG",
+    ":LLVMSupport",
+    ":LLVMTarget",
+    ":LLVMTransformUtils",
+    ":LLVMXCoreAsmPrinter",
+    ":LLVMXCoreDesc",
+    ":LLVMXCoreInfo",
+  ]
+}
+
+llvm_library("LLVMXCoreDisassembler") {
+  deps = [
+    ":LLVMMCDisassembler",
+    ":LLVMSupport",
+    ":LLVMXCoreInfo",
+  ]
+}
diff --git a/tools/VERSION b/tools/VERSION
index 0bb2831..f100d4d 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -33,7 +33,7 @@
 MAJOR 2
 MINOR 5
 PATCH 0
-PRERELEASE 1
+PRERELEASE 2
 PRERELEASE_PATCH 0
-ABI_VERSION 7
-OLDEST_SUPPORTED_ABI_VERSION 5
+ABI_VERSION 11
+OLDEST_SUPPORTED_ABI_VERSION 11
diff --git a/tools/android/download_android_tools.py b/tools/android/download_android_tools.py
index e16989f..b264e58 100644
--- a/tools/android/download_android_tools.py
+++ b/tools/android/download_android_tools.py
@@ -25,80 +25,83 @@
 DEPOT_PATH = find_depot_tools.add_depot_tools_to_path()
 GSUTIL_PATH = os.path.join(DEPOT_PATH, 'gsutil.py')
 
-def RunCommand(command):
-  """Run command and return success (True) or failure."""
 
-  print 'Running %s' % (str(command))
-  if subprocess.call(command, shell=False) == 0:
-    return True
-  print 'Failed.'
-  return False
+def RunCommand(command):
+    """Run command and return success (True) or failure."""
+
+    print 'Running %s' % (str(command))
+    if subprocess.call(command, shell=False) == 0:
+        return True
+    print 'Failed.'
+    return False
 
 
 def GetInstalledVersion(version_stamp):
-  version_file = os.path.join(INSTALL_DIR, version_stamp)
-  if not os.path.exists(version_file):
-    return None
-  with open(version_file) as f:
-    return f.read().strip()
+    version_file = os.path.join(INSTALL_DIR, version_stamp)
+    if not os.path.exists(version_file):
+        return None
+    with open(version_file) as f:
+        return f.read().strip()
 
 
 def VersionStampName(tools_name):
-  if sys.platform.startswith('linux'):
-    return 'VERSION_LINUX_' + tools_name.upper()
-  elif sys.platform == 'darwin':
-    return 'VERSION_MACOSX_' + tools_name.upper()
-  else:
-    print('NOTE: Will not download android tools. Unsupported platform: ' + sys.platform)
-    sys.exit(0)
+    if sys.platform.startswith('linux'):
+        return 'VERSION_LINUX_' + tools_name.upper()
+    elif sys.platform == 'darwin':
+        return 'VERSION_MACOSX_' + tools_name.upper()
+    else:
+        print('NOTE: Will not download android tools. Unsupported platform: ' +
+              sys.platform)
+        sys.exit(0)
 
 
 def UpdateTools(tools_name):
-  """Downloads zipped tools from Google Cloud Storage and extracts them,
+    """Downloads zipped tools from Google Cloud Storage and extracts them,
      stamping current version."""
 
-  # Read latest version.
-  version_stamp = VersionStampName(tools_name)
-  version = ''
-  with open(os.path.join(THIS_DIR, version_stamp)) as f:
-    version = f.read().strip()
-  # Return if installed binaries are up to date.
-  if version == GetInstalledVersion(version_stamp):
-    return
+    # Read latest version.
+    version_stamp = VersionStampName(tools_name)
+    version = ''
+    with open(os.path.join(THIS_DIR, version_stamp)) as f:
+        version = f.read().strip()
+    # Return if installed binaries are up to date.
+    if version == GetInstalledVersion(version_stamp):
+        return
 
-  # Remove the old install directory checked out from git.
-  if os.path.exists(os.path.join(INSTALL_DIR, '.git')):
-    shutil.rmtree(INSTALL_DIR)
-  # Make sure that the install directory exists.
-  if not os.path.exists(INSTALL_DIR):
-    os.mkdir(INSTALL_DIR)
-  # Remove current installation.
-  tools_root = os.path.join(INSTALL_DIR, tools_name)
-  if os.path.exists(tools_root):
-    shutil.rmtree(tools_root)
+    # Remove the old install directory checked out from git.
+    if os.path.exists(os.path.join(INSTALL_DIR, '.git')):
+        shutil.rmtree(INSTALL_DIR)
+    # Make sure that the install directory exists.
+    if not os.path.exists(INSTALL_DIR):
+        os.mkdir(INSTALL_DIR)
+    # Remove current installation.
+    tools_root = os.path.join(INSTALL_DIR, tools_name)
+    if os.path.exists(tools_root):
+        shutil.rmtree(tools_root)
 
-  # Download tools from GCS.
-  archive_path = os.path.join(INSTALL_DIR, tools_name + '.tar.gz')
-  download_cmd = ['python', GSUTIL_PATH, 'cp',
-                  'gs://mojo/android/tool/%s.tar.gz' % version,
-                  archive_path]
-  if not RunCommand(download_cmd):
-    print ('WARNING: Failed to download Android tools.')
-    return
+    # Download tools from GCS.
+    archive_path = os.path.join(INSTALL_DIR, tools_name + '.tar.gz')
+    download_cmd = [
+        'python', GSUTIL_PATH, 'cp',
+        'gs://mojo/android/tool/%s.tar.gz' % version, archive_path
+    ]
+    if not RunCommand(download_cmd):
+        print('WARNING: Failed to download Android tools.')
+        return
 
-  print "Extracting Android tools (" + tools_name + ")"
-  with tarfile.open(archive_path) as arch:
-    arch.extractall(INSTALL_DIR)
-  os.remove(archive_path)
-  # Write version as the last step.
-  with open(os.path.join(INSTALL_DIR, version_stamp), 'w+') as f:
-    f.write('%s\n' % version)
+    print "Extracting Android tools (" + tools_name + ")"
+    with tarfile.open(archive_path) as arch:
+        arch.extractall(INSTALL_DIR)
+    os.remove(archive_path)
+    # Write version as the last step.
+    with open(os.path.join(INSTALL_DIR, version_stamp), 'w+') as f:
+        f.write('%s\n' % version)
 
 
 def main():
-  UpdateTools('sdk')
-  UpdateTools('ndk')
+    UpdateTools('sdk')
+    UpdateTools('ndk')
 
 
 if __name__ == '__main__':
-  sys.exit(main())
\ No newline at end of file
+    sys.exit(main())
diff --git a/tools/approve_results.dart b/tools/approve_results.dart
index c9dcf7d..ebf1dd1 100755
--- a/tools/approve_results.dart
+++ b/tools/approve_results.dart
@@ -451,32 +451,45 @@
       print("Loading list of try runs...");
     }
     final buildset = "buildset:patch/gerrit/$gerritHost/$changelist/$patchset";
-    final url = Uri.parse(
-        "https://cr-buildbucket.appspot.com/_ah/api/buildbucket/v1/search"
-        "?bucket=luci.dart.try"
-        "&tag=${Uri.encodeComponent(buildset)}"
-        "&fields=builds(id%2Ctags%2Cstatus%2Cstarted_ts)");
-    final client = new HttpClient();
-    final request =
-        await client.getUrl(url).timeout(const Duration(seconds: 30));
-    final response = await request.close().timeout(const Duration(seconds: 30));
-    if (response.statusCode != HttpStatus.ok) {
-      throw new Exception("Failed to request try runs for $gerrit");
+
+    Future<Map<String, dynamic>> searchBuilds(String cursor) async {
+      final url = Uri.parse(
+          "https://cr-buildbucket.appspot.com/_ah/api/buildbucket/v1/search"
+          "?bucket=luci.dart.try"
+          "&tag=${Uri.encodeComponent(buildset)}"
+          "&fields=builds(id%2Ctags%2Cstatus%2Cstarted_ts),next_cursor"
+          "&start_cursor=$cursor");
+      final client = new HttpClient();
+      final request =
+          await client.getUrl(url).timeout(const Duration(seconds: 30));
+      final response =
+          await request.close().timeout(const Duration(seconds: 30));
+      if (response.statusCode != HttpStatus.ok) {
+        throw new Exception("Failed to request try runs for $gerrit");
+      }
+      final Map<String, dynamic> object = await response
+          .cast<List<int>>()
+          .transform(new Utf8Decoder())
+          .transform(new JsonDecoder())
+          .first
+          .timeout(const Duration(seconds: 30));
+      client.close();
+      return object;
     }
-    final Map<String, dynamic> object = await response
-        .cast<List<int>>()
-        .transform(new Utf8Decoder())
-        .transform(new JsonDecoder())
-        .first
-        .timeout(const Duration(seconds: 30));
-    client.close();
-    final builds = object["builds"];
-    if (builds == null) {
-      stderr.writeln(
-          "error: $prefix$changelist has no try runs for patchset $patchset");
-      exitCode = 1;
-      return;
-    }
+
+    var cursor = "";
+    final builds = [];
+    do {
+      final object = await searchBuilds(cursor);
+      if (cursor.isEmpty && object["builds"] == null) {
+        stderr.writeln(
+            "error: $prefix$changelist has no try runs for patchset $patchset");
+        exitCode = 1;
+        return;
+      }
+      builds.addAll(object["builds"]);
+      cursor = object["next_cursor"];
+    } while (cursor != null);
 
     // Prefer the newest completed build.
     Map<String, dynamic> preferredBuild(
diff --git a/tools/archive_crash.py b/tools/archive_crash.py
index ef08b34..f266b2b 100755
--- a/tools/archive_crash.py
+++ b/tools/archive_crash.py
@@ -20,55 +20,60 @@
 from glob import glob
 
 GCS_FOLDER = 'dart-temp-crash-archive'
-GSUTIL='/b/build/scripts/slave/gsutil'
+GSUTIL = '/b/build/scripts/slave/gsutil'
+
 
 def CreateTarball(input_dir, tarname):
-  print 'Creating tar file: %s' % tarname
-  tar = tarfile.open(tarname, mode='w:gz')
-  tar.add(input_dir)
-  tar.close()
+    print 'Creating tar file: %s' % tarname
+    tar = tarfile.open(tarname, mode='w:gz')
+    tar.add(input_dir)
+    tar.close()
+
 
 def CopyToGCS(filename):
-  gs_location = 'gs://%s/%s/' % (GCS_FOLDER, uuid.uuid4())
-  cmd = [GSUTIL, 'cp', filename, gs_location]
-  print 'Running command: %s' % cmd
-  subprocess.check_call(cmd)
-  archived_filename = '%s%s' % (gs_location, filename.split('/').pop())
-  print 'Dump now available in %s' % archived_filename
+    gs_location = 'gs://%s/%s/' % (GCS_FOLDER, uuid.uuid4())
+    cmd = [GSUTIL, 'cp', filename, gs_location]
+    print 'Running command: %s' % cmd
+    subprocess.check_call(cmd)
+    archived_filename = '%s%s' % (gs_location, filename.split('/').pop())
+    print 'Dump now available in %s' % archived_filename
+
 
 def TEMPArchiveBuild():
-  if not 'PWD' in os.environ:
-    return
-  pwd = os.environ['PWD']
-  print pwd
-  if not 'vm-' in pwd:
-    return
-  if 'win' in pwd or 'release' in pwd:
-    return
-  files = glob('%s/out/Debug*/dart' % pwd)
-  files.extend(glob('%s/xcodebuild/Debug*/dart' % pwd))
-  print('Archiving: %s' % files)
-  for f in files:
-    CopyToGCS(f)
+    if not 'PWD' in os.environ:
+        return
+    pwd = os.environ['PWD']
+    print pwd
+    if not 'vm-' in pwd:
+        return
+    if 'win' in pwd or 'release' in pwd:
+        return
+    files = glob('%s/out/Debug*/dart' % pwd)
+    files.extend(glob('%s/xcodebuild/Debug*/dart' % pwd))
+    print('Archiving: %s' % files)
+    for f in files:
+        CopyToGCS(f)
+
 
 def Main():
-  TEMPArchiveBuild()
-  if utils.GuessOS() != 'linux':
-    print 'Currently only archiving crash dumps on linux'
-    return 0
-  print 'Looking for crash dumps'
-  num_dumps = 0
-  for v in os.listdir('/tmp'):
-    if v.startswith('coredump'):
-      fullpath = '/tmp/%s' % v
-      if os.path.isdir(fullpath):
-        num_dumps += 1
-        tarname = '%s.tar.gz' % fullpath
-        CreateTarball(fullpath, tarname)
-        CopyToGCS(tarname)
-        os.unlink(tarname)
-        shutil.rmtree(fullpath)
-  print 'Found %s core dumps' % num_dumps
+    TEMPArchiveBuild()
+    if utils.GuessOS() != 'linux':
+        print 'Currently only archiving crash dumps on linux'
+        return 0
+    print 'Looking for crash dumps'
+    num_dumps = 0
+    for v in os.listdir('/tmp'):
+        if v.startswith('coredump'):
+            fullpath = '/tmp/%s' % v
+            if os.path.isdir(fullpath):
+                num_dumps += 1
+                tarname = '%s.tar.gz' % fullpath
+                CreateTarball(fullpath, tarname)
+                CopyToGCS(tarname)
+                os.unlink(tarname)
+                shutil.rmtree(fullpath)
+    print 'Found %s core dumps' % num_dumps
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/bots/__init__.py b/tools/bots/__init__.py
index 3479377..91994d1 100644
--- a/tools/bots/__init__.py
+++ b/tools/bots/__init__.py
@@ -1,4 +1,3 @@
 # 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.
-
diff --git a/tools/bots/android.py b/tools/bots/android.py
index 21b6978..9ee7d81 100644
--- a/tools/bots/android.py
+++ b/tools/bots/android.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Android buildbot steps.
 """
@@ -17,47 +16,50 @@
 
 ANDROID_BUILDER = r'vm-android-(linux|mac|win)'
 
+
 def AndroidConfig(name, is_buildbot):
-  """Returns info for the current buildbot based on the name of the builder.
+    """Returns info for the current buildbot based on the name of the builder.
 
   Currently, this is just:
   - mode: always "release" (for now)
   - system: "linux", "mac", or "win"
   """
-  android_pattern = re.match(ANDROID_BUILDER, name)
-  if not android_pattern:
-    return None
+    android_pattern = re.match(ANDROID_BUILDER, name)
+    if not android_pattern:
+        return None
 
-  system = android_pattern.group(1)
-  if system == 'win': system = 'windows'
+    system = android_pattern.group(1)
+    if system == 'win': system = 'windows'
 
-  return bot.BuildInfo('none', 'vm', 'release', system, checked=True)
+    return bot.BuildInfo('none', 'vm', 'release', system, checked=True)
 
 
 def AndroidSteps(build_info):
-  # TODO(efortuna): Here's where we'll run tests.
-  #bot.RunTest('android', build_info, ['android'])
-  pass
+    # TODO(efortuna): Here's where we'll run tests.
+    #bot.RunTest('android', build_info, ['android'])
+    pass
+
 
 def BuildAndroid(build_info):
-  """
+    """
   Builds the android target.
 
   - build_info: the buildInfo object, containing information about what sort of
       build and test to be run.
   """
-  with bot.BuildStep('Build Android'):
-    # TODO(vsm): A temporary hack until we figure out why incremental builds are
-    # broken on Android.
-    if os.path.exists('./out/lastHooksTargetOS.txt'):
-      os.remove('./out/lastHooksTargetOS.txt')
-    targets = ['runtime']
-    args = [sys.executable, './tools/build.py',
-            '--arch=' + build_info.arch,
-            '--mode=' + build_info.mode,
-            '--os=android'] + targets
-    print 'Building Android: %s' % (' '.join(args))
-    bot.RunProcess(args)
+    with bot.BuildStep('Build Android'):
+        # TODO(vsm): A temporary hack until we figure out why incremental builds are
+        # broken on Android.
+        if os.path.exists('./out/lastHooksTargetOS.txt'):
+            os.remove('./out/lastHooksTargetOS.txt')
+        targets = ['runtime']
+        args = [
+            sys.executable, './tools/build.py', '--arch=' + build_info.arch,
+            '--mode=' + build_info.mode, '--os=android'
+        ] + targets
+        print 'Building Android: %s' % (' '.join(args))
+        bot.RunProcess(args)
+
 
 if __name__ == '__main__':
-  bot.RunBot(AndroidConfig, AndroidSteps, build_step=BuildAndroid)
+    bot.RunBot(AndroidConfig, AndroidSteps, build_step=BuildAndroid)
diff --git a/tools/bots/bot.py b/tools/bots/bot.py
index ff8edc3..e371239 100644
--- a/tools/bots/bot.py
+++ b/tools/bots/bot.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Shared code for use in the buildbot scripts.
 """
@@ -26,7 +25,7 @@
 
 
 class BuildInfo(object):
-  """
+    """
   Encapsulation of build information.
 
   - compiler: None or 'dart2js'
@@ -47,47 +46,61 @@
   - builder_tag: A tag indicating a special builder setup.
   - cps_ir: Run the compiler with the cps based backend
   """
-  def __init__(self, compiler, runtime, mode, system, checked=False,
-               host_checked=False, minified=False, shard_index=None,
-               total_shards=None, is_buildbot=False, test_set=None,
-               csp=None, arch=None, dart2js_full=False, builder_tag=None,
-               batch=False, cps_ir=False):
-    self.compiler = compiler
-    self.runtime = runtime
-    self.mode = mode
-    self.system = system
-    self.checked = checked
-    self.host_checked = host_checked
-    self.minified = minified
-    self.shard_index = shard_index
-    self.total_shards = total_shards
-    self.is_buildbot = is_buildbot
-    self.test_set = test_set
-    self.csp = csp
-    self.dart2js_full = dart2js_full
-    self.builder_tag = builder_tag
-    self.batch = batch
-    self.cps_ir = cps_ir
-    if (arch == None):
-      self.arch = 'ia32'
-    else:
-      self.arch = arch
 
-  def PrintBuildInfo(self):
-    shard_description = ""
-    if self.shard_index:
-      shard_description = " shard %s of %s" % (self.shard_index,
-                                               self.total_shards)
-    print ("compiler: %s, runtime: %s mode: %s, system: %s,"
-           " checked: %s, host-checked: %s, minified: %s, test-set: %s"
-           " arch: %s%s"
-           ) % (self.compiler, self.runtime, self.mode, self.system,
-                self.checked, self.host_checked, self.minified, self.test_set,
-                self.arch, shard_description)
+    def __init__(self,
+                 compiler,
+                 runtime,
+                 mode,
+                 system,
+                 checked=False,
+                 host_checked=False,
+                 minified=False,
+                 shard_index=None,
+                 total_shards=None,
+                 is_buildbot=False,
+                 test_set=None,
+                 csp=None,
+                 arch=None,
+                 dart2js_full=False,
+                 builder_tag=None,
+                 batch=False,
+                 cps_ir=False):
+        self.compiler = compiler
+        self.runtime = runtime
+        self.mode = mode
+        self.system = system
+        self.checked = checked
+        self.host_checked = host_checked
+        self.minified = minified
+        self.shard_index = shard_index
+        self.total_shards = total_shards
+        self.is_buildbot = is_buildbot
+        self.test_set = test_set
+        self.csp = csp
+        self.dart2js_full = dart2js_full
+        self.builder_tag = builder_tag
+        self.batch = batch
+        self.cps_ir = cps_ir
+        if (arch == None):
+            self.arch = 'ia32'
+        else:
+            self.arch = arch
+
+    def PrintBuildInfo(self):
+        shard_description = ""
+        if self.shard_index:
+            shard_description = " shard %s of %s" % (self.shard_index,
+                                                     self.total_shards)
+        print("compiler: %s, runtime: %s mode: %s, system: %s,"
+              " checked: %s, host-checked: %s, minified: %s, test-set: %s"
+              " arch: %s%s") % (self.compiler, self.runtime, self.mode,
+                                self.system, self.checked, self.host_checked,
+                                self.minified, self.test_set, self.arch,
+                                shard_description)
 
 
 class BuildStep(object):
-  """
+    """
   A context manager for handling build steps.
 
   When the context manager is entered, it prints the "@@@BUILD_STEP __@@@"
@@ -97,38 +110,41 @@
   If swallow_error is True, then this will catch and discard any OSError that
   is thrown. This lets you run later BuildSteps if the current one fails.
   """
-  def __init__(self, name, swallow_error=False):
-    self.name = name
-    self.swallow_error = swallow_error
 
-  def __enter__(self):
-    print '@@@BUILD_STEP %s@@@' % self.name
-    sys.stdout.flush()
+    def __init__(self, name, swallow_error=False):
+        self.name = name
+        self.swallow_error = swallow_error
 
-  def __exit__(self, type, value, traceback):
-    if value:
-      print '@@@STEP_FAILURE@@@'
-      sys.stdout.flush()
-      if self.swallow_error and isinstance(value, OSError):
-        return True
+    def __enter__(self):
+        print '@@@BUILD_STEP %s@@@' % self.name
+        sys.stdout.flush()
+
+    def __exit__(self, type, value, traceback):
+        if value:
+            print '@@@STEP_FAILURE@@@'
+            sys.stdout.flush()
+            if self.swallow_error and isinstance(value, OSError):
+                return True
 
 
 def BuildSDK(build_info):
-  """
+    """
   Builds the SDK.
 
   - build_info: the buildInfo object, containing information about what sort of
       build and test to be run.
   """
-  with BuildStep('Build SDK'):
-    args = [sys.executable, './tools/build.py', '--mode=' + build_info.mode,
-            '--arch=' + build_info.arch, 'create_sdk']
-    print 'Building SDK: %s' % (' '.join(args))
-    RunProcess(args)
+    with BuildStep('Build SDK'):
+        args = [
+            sys.executable, './tools/build.py', '--mode=' + build_info.mode,
+            '--arch=' + build_info.arch, 'create_sdk'
+        ]
+        print 'Building SDK: %s' % (' '.join(args))
+        RunProcess(args)
 
 
 def RunBot(parse_name, custom_steps, build_step=BuildSDK):
-  """
+    """
   The main function for running a buildbot.
 
   A buildbot script should invoke this once. The parse_name function will be
@@ -141,155 +157,156 @@
   This function will not return. It will call sys.exit() with an appropriate
   exit code.
   """
-  if len(sys.argv) == 0:
-    print 'Script pathname not known, giving up.'
-    sys.exit(1)
+    if len(sys.argv) == 0:
+        print 'Script pathname not known, giving up.'
+        sys.exit(1)
 
-  name, is_buildbot = GetBotName()
-  build_info = parse_name(name, is_buildbot)
-  if not build_info:
-    print 'Could not handle unfamiliar bot name "%s".' % name
-    sys.exit(1)
+    name, is_buildbot = GetBotName()
+    build_info = parse_name(name, is_buildbot)
+    if not build_info:
+        print 'Could not handle unfamiliar bot name "%s".' % name
+        sys.exit(1)
 
-  # Print out the buildinfo for easy debugging.
-  build_info.PrintBuildInfo()
+    # Print out the buildinfo for easy debugging.
+    build_info.PrintBuildInfo()
 
-  # Make sure we are in the dart directory
-  os.chdir(bot_utils.DART_DIR)
+    # Make sure we are in the dart directory
+    os.chdir(bot_utils.DART_DIR)
 
-  try:
-    Clobber()
-    if build_step:
-      build_step(build_info)
+    try:
+        Clobber()
+        if build_step:
+            build_step(build_info)
 
-    custom_steps(build_info)
-  except OSError as e:
-    sys.exit(e.errno)
+        custom_steps(build_info)
+    except OSError as e:
+        sys.exit(e.errno)
 
-  sys.exit(0)
+    sys.exit(0)
 
 
 def GetBotName():
-  """
+    """
   Gets the name of the current buildbot.
 
   Returns a tuple of the buildbot name and a flag to indicate if we are actually
   a buildbot (True), or just a user pretending to be one (False).
   """
-  # For testing the bot locally, allow the user to pass in a buildbot name.
-  parser = optparse.OptionParser()
-  parser.add_option('-n', '--name', dest='name', help='The name of the build'
-      'bot you would like to emulate (ex: vm-mac-debug)', default=None)
-  args, _ = parser.parse_args()
+    # For testing the bot locally, allow the user to pass in a buildbot name.
+    parser = optparse.OptionParser()
+    parser.add_option(
+        '-n',
+        '--name',
+        dest='name',
+        help='The name of the build'
+        'bot you would like to emulate (ex: vm-mac-debug)',
+        default=None)
+    args, _ = parser.parse_args()
 
-  if args.name:
-    return args.name, False
+    if args.name:
+        return args.name, False
 
-  name = os.environ.get(BUILDER_NAME)
-  if not name:
-    print 'Use -n $BUILDBOT_NAME for the bot you would like to emulate.'
-    sys.exit(1)
+    name = os.environ.get(BUILDER_NAME)
+    if not name:
+        print 'Use -n $BUILDBOT_NAME for the bot you would like to emulate.'
+        sys.exit(1)
 
-  return name, True
+    return name, True
 
 
 def Clobber(force=None):
-  """
+    """
   Clobbers the builder before we do the build, if appropriate.
 
   - mode: either 'debug' or 'release'
   """
-  if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
-    return
-  clobber_string = 'Clobber'
-  if force:
-    clobber_string = 'Clobber(always)'
+    if os.environ.get(BUILDER_CLOBBER) != "1" and not force:
+        return
+    clobber_string = 'Clobber'
+    if force:
+        clobber_string = 'Clobber(always)'
 
-  with BuildStep(clobber_string):
-    cmd = [sys.executable,
-           './tools/clean_output_directory.py']
-    print 'Clobbering %s' % (' '.join(cmd))
-    RunProcess(cmd)
+    with BuildStep(clobber_string):
+        cmd = [sys.executable, './tools/clean_output_directory.py']
+        print 'Clobbering %s' % (' '.join(cmd))
+        RunProcess(cmd)
 
 
 def RunTest(name, build_info, targets, flags=None, swallow_error=False):
-  """
+    """
   Runs test.py with the given settings.
   """
-  if not flags:
-    flags = []
+    if not flags:
+        flags = []
 
-  step_name = GetStepName(name, flags)
-  with BuildStep(step_name, swallow_error=swallow_error):
-    sys.stdout.flush()
+    step_name = GetStepName(name, flags)
+    with BuildStep(step_name, swallow_error=swallow_error):
+        sys.stdout.flush()
 
-    cmd = [
-      sys.executable, os.path.join(os.curdir, 'tools', 'test.py'),
-      '--step_name=' + step_name,
-      '--mode=' + build_info.mode,
-      '--compiler=' + build_info.compiler,
-      '--runtime=' + build_info.runtime,
-      '--arch=' + build_info.arch,
-      '--progress=buildbot',
-      '--write-result-log',
-      '-v', '--time', '--use-sdk', '--report'
-    ]
+        cmd = [
+            sys.executable,
+            os.path.join(os.curdir, 'tools',
+                         'test.py'), '--step_name=' + step_name,
+            '--mode=' + build_info.mode, '--compiler=' + build_info.compiler,
+            '--runtime=' + build_info.runtime, '--arch=' + build_info.arch,
+            '--progress=buildbot', '--write-result-log', '-v', '--time',
+            '--use-sdk', '--report'
+        ]
 
-    if build_info.checked:
-      cmd.append('--checked')
+        if build_info.checked:
+            cmd.append('--checked')
 
-    cmd.extend(flags)
-    cmd.extend(targets)
+        cmd.extend(flags)
+        cmd.extend(targets)
 
-    print 'Running: %s' % (' '.join(map(lambda arg: '"%s"' % arg, cmd)))
-    sys.stdout.flush()
-    RunProcess(cmd)
+        print 'Running: %s' % (' '.join(map(lambda arg: '"%s"' % arg, cmd)))
+        sys.stdout.flush()
+        RunProcess(cmd)
 
 
 def RunTestRunner(build_info, path):
-  """
+    """
   Runs the test package's runner on the package at 'path'.
   """
-  sdk_bin = os.path.join(
-      bot_utils.DART_DIR,
-      utils.GetBuildSdkBin(BUILD_OS, build_info.mode, build_info.arch))
+    sdk_bin = os.path.join(
+        bot_utils.DART_DIR,
+        utils.GetBuildSdkBin(BUILD_OS, build_info.mode, build_info.arch))
 
-  build_root = utils.GetBuildRoot(
-      BUILD_OS, build_info.mode, build_info.arch)
+    build_root = utils.GetBuildRoot(BUILD_OS, build_info.mode, build_info.arch)
 
-  dart_name = 'dart.exe' if build_info.system == 'windows' else 'dart'
-  dart_bin = os.path.join(sdk_bin, dart_name)
+    dart_name = 'dart.exe' if build_info.system == 'windows' else 'dart'
+    dart_bin = os.path.join(sdk_bin, dart_name)
 
-  test_bin = os.path.abspath(
-      os.path.join('third_party', 'pkg', 'test', 'bin', 'test.dart'))
+    test_bin = os.path.abspath(
+        os.path.join('third_party', 'pkg', 'test', 'bin', 'test.dart'))
 
-  with utils.ChangedWorkingDirectory(path):
-    args = [dart_bin, test_bin, '--reporter', 'expanded', '--no-color']
-    print("Running %s" % ' '.join(args))
-    RunProcess(args)
+    with utils.ChangedWorkingDirectory(path):
+        args = [dart_bin, test_bin, '--reporter', 'expanded', '--no-color']
+        print("Running %s" % ' '.join(args))
+        RunProcess(args)
 
 
 def RunProcess(command, env=None):
-  """
+    """
   Runs command.
 
   If a non-zero exit code is returned, raises an OSError with errno as the exit
   code.
   """
-  if env is None:
-    no_color_env = dict(os.environ)
-  else:
-    no_color_env = env
-  no_color_env['TERM'] = 'nocolor'
+    if env is None:
+        no_color_env = dict(os.environ)
+    else:
+        no_color_env = env
+    no_color_env['TERM'] = 'nocolor'
 
-  exit_code = subprocess.call(command, env=no_color_env)
-  if exit_code != 0:
-    raise OSError(exit_code)
+    exit_code = subprocess.call(command, env=no_color_env)
+    if exit_code != 0:
+        raise OSError(exit_code)
 
 
 def GetStepName(name, flags):
-  """
+    """
   Filters out flags with '=' as this breaks the /stats feature of the buildbot.
   """
-  flags = [x for x in flags if not '=' in x]
-  return ('%s tests %s' % (name, ' '.join(flags))).strip()
+    flags = [x for x in flags if not '=' in x]
+    return ('%s tests %s' % (name, ' '.join(flags))).strip()
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index 4a8b23a..fc840f3 100755
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -15,53 +15,57 @@
 DART_DIR = os.path.abspath(
     os.path.normpath(os.path.join(__file__, '..', '..', '..')))
 
+
 def GetUtils():
-  '''Dynamically load the tools/utils.py python module.'''
-  return imp.load_source('utils', os.path.join(DART_DIR, 'tools', 'utils.py'))
+    '''Dynamically load the tools/utils.py python module.'''
+    return imp.load_source('utils', os.path.join(DART_DIR, 'tools', 'utils.py'))
+
 
 SYSTEM_RENAMES = {
-  'win32': 'windows',
-  'windows': 'windows',
-  'win': 'windows',
-
-  'linux': 'linux',
-  'linux2': 'linux',
-  'lucid32': 'linux',
-  'lucid64': 'linux',
-
-  'darwin': 'macos',
-  'mac': 'macos',
-  'macos': 'macos',
+    'win32': 'windows',
+    'windows': 'windows',
+    'win': 'windows',
+    'linux': 'linux',
+    'linux2': 'linux',
+    'lucid32': 'linux',
+    'lucid64': 'linux',
+    'darwin': 'macos',
+    'mac': 'macos',
+    'macos': 'macos',
 }
 
 ARCH_RENAMES = {
-  'ia32': 'ia32',
-  'x64': 'x64',
-  'arm': 'arm',
-  'arm64': 'arm64',
+    'ia32': 'ia32',
+    'x64': 'x64',
+    'arm': 'arm',
+    'arm64': 'arm64',
 }
 
+
 class Channel(object):
-  BLEEDING_EDGE = 'be'
-  DEV = 'dev'
-  STABLE = 'stable'
-  TRY = 'try'
-  INTEGRATION = 'integration'
-  ALL_CHANNELS = [BLEEDING_EDGE, DEV, STABLE, TRY, INTEGRATION]
+    BLEEDING_EDGE = 'be'
+    DEV = 'dev'
+    STABLE = 'stable'
+    TRY = 'try'
+    INTEGRATION = 'integration'
+    ALL_CHANNELS = [BLEEDING_EDGE, DEV, STABLE, TRY, INTEGRATION]
+
 
 class ReleaseType(object):
-  RAW = 'raw'
-  SIGNED = 'signed'
-  RELEASE = 'release'
-  ALL_TYPES = [RAW, SIGNED, RELEASE]
+    RAW = 'raw'
+    SIGNED = 'signed'
+    RELEASE = 'release'
+    ALL_TYPES = [RAW, SIGNED, RELEASE]
+
 
 class Mode(object):
-  RELEASE = 'release'
-  DEBUG = 'debug'
-  ALL_MODES = [RELEASE, DEBUG]
+    RELEASE = 'release'
+    DEBUG = 'debug'
+    ALL_MODES = [RELEASE, DEBUG]
+
 
 class GCSNamer(object):
-  """
+    """
   This class is used for naming objects in our "gs://dart-archive/"
   GoogleCloudStorage bucket. It's structure is as follows:
 
@@ -80,281 +84,316 @@
     - /editor-eclipse-update
          /{index.html,features/,plugins/,artifacts.jar,content.jar}
   """
-  def __init__(self, channel=Channel.BLEEDING_EDGE,
-      release_type=ReleaseType.RAW, internal=False):
-    assert channel in Channel.ALL_CHANNELS
-    assert release_type in ReleaseType.ALL_TYPES
 
-    self.channel = channel
-    self.release_type = release_type
-    if internal:
-      self.bucket = 'gs://dart-archive-internal'
-    else:
-      self.bucket = 'gs://dart-archive'
+    def __init__(self,
+                 channel=Channel.BLEEDING_EDGE,
+                 release_type=ReleaseType.RAW,
+                 internal=False):
+        assert channel in Channel.ALL_CHANNELS
+        assert release_type in ReleaseType.ALL_TYPES
 
-  # Functions for quering complete gs:// filepaths
+        self.channel = channel
+        self.release_type = release_type
+        if internal:
+            self.bucket = 'gs://dart-archive-internal'
+        else:
+            self.bucket = 'gs://dart-archive'
 
-  def version_filepath(self, revision):
-    return '%s/channels/%s/%s/%s/VERSION' % (self.bucket, self.channel,
-        self.release_type, revision)
+    # Functions for quering complete gs:// filepaths
 
-  def editor_zipfilepath(self, revision, system, arch):
-    return '/'.join([self.editor_directory(revision),
-      self.editor_zipfilename(system, arch)])
+    def version_filepath(self, revision):
+        return '%s/channels/%s/%s/%s/VERSION' % (self.bucket, self.channel,
+                                                 self.release_type, revision)
 
-  def editor_installer_filepath(self, revision, system, arch, extension):
-    return '/'.join([self.editor_directory(revision),
-      self.editor_installer_filename(system, arch, extension)])
+    def editor_zipfilepath(self, revision, system, arch):
+        return '/'.join([
+            self.editor_directory(revision),
+            self.editor_zipfilename(system, arch)
+        ])
 
-  def editor_android_zipfilepath(self, revision):
-    return '/'.join([self.editor_directory(revision),
-      self.editor_android_zipfilename()])
+    def editor_installer_filepath(self, revision, system, arch, extension):
+        return '/'.join([
+            self.editor_directory(revision),
+            self.editor_installer_filename(system, arch, extension)
+        ])
 
-  def sdk_zipfilepath(self, revision, system, arch, mode):
-    return '/'.join([self.sdk_directory(revision),
-      self.sdk_zipfilename(system, arch, mode)])
+    def editor_android_zipfilepath(self, revision):
+        return '/'.join([
+            self.editor_directory(revision),
+            self.editor_android_zipfilename()
+        ])
 
-  def unstripped_filepath(self, revision, system, arch):
-    return '/'.join([self._variant_directory('unstripped', revision),
-                     system,
-                     arch,
-                     self.unstripped_filename(system)])
+    def sdk_zipfilepath(self, revision, system, arch, mode):
+        return '/'.join([
+            self.sdk_directory(revision),
+            self.sdk_zipfilename(system, arch, mode)
+        ])
 
-  def apidocs_zipfilepath(self, revision):
-    return '/'.join([self.apidocs_directory(revision),
-      self.dartdocs_zipfilename()])
+    def unstripped_filepath(self, revision, system, arch):
+        return '/'.join([
+            self._variant_directory('unstripped', revision), system, arch,
+            self.unstripped_filename(system)
+        ])
 
-  # Functions for querying gs:// directories
+    def apidocs_zipfilepath(self, revision):
+        return '/'.join(
+            [self.apidocs_directory(revision),
+             self.dartdocs_zipfilename()])
 
-  def sdk_directory(self, revision):
-    return self._variant_directory('sdk', revision)
+    # Functions for querying gs:// directories
 
-  def linux_packages_directory(self, revision):
-    return '/'.join([self._variant_directory('linux_packages', revision)])
+    def sdk_directory(self, revision):
+        return self._variant_directory('sdk', revision)
 
-  def src_directory(self, revision):
-    return self._variant_directory('src', revision)
+    def linux_packages_directory(self, revision):
+        return '/'.join([self._variant_directory('linux_packages', revision)])
 
-  def editor_directory(self, revision):
-    return self._variant_directory('editor', revision)
+    def src_directory(self, revision):
+        return self._variant_directory('src', revision)
 
-  def editor_eclipse_update_directory(self, revision):
-    return self._variant_directory('editor-eclipse-update', revision)
+    def editor_directory(self, revision):
+        return self._variant_directory('editor', revision)
 
-  def apidocs_directory(self, revision):
-    return self._variant_directory('api-docs', revision)
+    def editor_eclipse_update_directory(self, revision):
+        return self._variant_directory('editor-eclipse-update', revision)
 
-  def misc_directory(self, revision):
-    return self._variant_directory('misc', revision)
+    def apidocs_directory(self, revision):
+        return self._variant_directory('api-docs', revision)
 
-  def _variant_directory(self, name, revision):
-    return '%s/channels/%s/%s/%s/%s' % (self.bucket, self.channel,
-        self.release_type, revision, name)
+    def misc_directory(self, revision):
+        return self._variant_directory('misc', revision)
 
-  # Functions for quering filenames
+    def _variant_directory(self, name, revision):
+        return '%s/channels/%s/%s/%s/%s' % (self.bucket, self.channel,
+                                            self.release_type, revision, name)
 
-  def dartdocs_zipfilename(self):
-    return 'dartdocs-gen-api.zip'
+    # Functions for quering filenames
 
-  def editor_zipfilename(self, system, arch):
-    return 'darteditor-%s-%s.zip' % (
-        SYSTEM_RENAMES[system], ARCH_RENAMES[arch])
+    def dartdocs_zipfilename(self):
+        return 'dartdocs-gen-api.zip'
 
-  def editor_android_zipfilename(self):
-    return 'android.zip'
+    def editor_zipfilename(self, system, arch):
+        return 'darteditor-%s-%s.zip' % (SYSTEM_RENAMES[system],
+                                         ARCH_RENAMES[arch])
 
-  def editor_installer_filename(self, system, arch, extension):
-    assert extension in ['dmg', 'msi']
-    return 'darteditor-installer-%s-%s.%s' % (
-        SYSTEM_RENAMES[system], ARCH_RENAMES[arch], extension)
+    def editor_android_zipfilename(self):
+        return 'android.zip'
 
-  def sdk_zipfilename(self, system, arch, mode):
-    assert mode in Mode.ALL_MODES
-    return 'dartsdk-%s-%s-%s.zip' % (
-        SYSTEM_RENAMES[system], ARCH_RENAMES[arch], mode)
+    def editor_installer_filename(self, system, arch, extension):
+        assert extension in ['dmg', 'msi']
+        return 'darteditor-installer-%s-%s.%s' % (SYSTEM_RENAMES[system],
+                                                  ARCH_RENAMES[arch], extension)
 
-  def unstripped_filename(self, system):
-    return 'dart.exe' if system.startswith('win') else 'dart'
+    def sdk_zipfilename(self, system, arch, mode):
+        assert mode in Mode.ALL_MODES
+        return 'dartsdk-%s-%s-%s.zip' % (SYSTEM_RENAMES[system],
+                                         ARCH_RENAMES[arch], mode)
+
+    def unstripped_filename(self, system):
+        return 'dart.exe' if system.startswith('win') else 'dart'
+
 
 class GCSNamerApiDocs(object):
-  def __init__(self, channel=Channel.BLEEDING_EDGE):
-    assert channel in Channel.ALL_CHANNELS
 
-    self.channel = channel
-    self.bucket = 'gs://dartlang-api-docs'
+    def __init__(self, channel=Channel.BLEEDING_EDGE):
+        assert channel in Channel.ALL_CHANNELS
 
-  def dartdocs_dirpath(self, revision):
-    assert len('%s' % revision) > 0
-    if self.channel == Channel.BLEEDING_EDGE:
-      return '%s/gen-dartdocs/builds/%s' % (self.bucket, revision)
-    return '%s/gen-dartdocs/%s/%s' % (self.bucket, self.channel, revision)
+        self.channel = channel
+        self.bucket = 'gs://dartlang-api-docs'
 
-  def docs_latestpath(self, revision):
-    assert len('%s' % revision) > 0
-    return '%s/channels/%s/latest.txt' % (self.bucket, self.channel)
+    def dartdocs_dirpath(self, revision):
+        assert len('%s' % revision) > 0
+        if self.channel == Channel.BLEEDING_EDGE:
+            return '%s/gen-dartdocs/builds/%s' % (self.bucket, revision)
+        return '%s/gen-dartdocs/%s/%s' % (self.bucket, self.channel, revision)
+
+    def docs_latestpath(self, revision):
+        assert len('%s' % revision) > 0
+        return '%s/channels/%s/latest.txt' % (self.bucket, self.channel)
+
 
 def run(command, env=None, shell=False, throw_on_error=True):
-  print "Running command: ", command
+    print "Running command: ", command
 
-  p = subprocess.Popen(command, stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE, env=env, shell=shell)
-  (stdout, stderr) = p.communicate()
-  if throw_on_error and p.returncode != 0:
-    print >> sys.stderr, "Failed to execute '%s'. Exit code: %s." % (
-        command, p.returncode)
-    print >> sys.stderr, "stdout: ", stdout
-    print >> sys.stderr, "stderr: ", stderr
-    raise Exception("Failed to execute %s." % command)
-  return (stdout, stderr, p.returncode)
+    p = subprocess.Popen(
+        command,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        env=env,
+        shell=shell)
+    (stdout, stderr) = p.communicate()
+    if throw_on_error and p.returncode != 0:
+        print >> sys.stderr, "Failed to execute '%s'. Exit code: %s." % (
+            command, p.returncode)
+        print >> sys.stderr, "stdout: ", stdout
+        print >> sys.stderr, "stderr: ", stderr
+        raise Exception("Failed to execute %s." % command)
+    return (stdout, stderr, p.returncode)
+
 
 class GSUtil(object):
-  GSUTIL_IS_SHELL_SCRIPT = False
-  GSUTIL_PATH = None
-  USE_DART_REPO_VERSION = False
+    GSUTIL_IS_SHELL_SCRIPT = False
+    GSUTIL_PATH = None
+    USE_DART_REPO_VERSION = False
 
-  def _layzCalculateGSUtilPath(self):
-    if not GSUtil.GSUTIL_PATH:
-      buildbot_gsutil = '/b/build/scripts/slave/gsutil'
-      if platform.system() == 'Windows':
-        buildbot_gsutil = 'e:\\\\b\\build\\scripts\\slave\\gsutil'
-      if os.path.isfile(buildbot_gsutil) and not GSUtil.USE_DART_REPO_VERSION:
-        GSUtil.GSUTIL_IS_SHELL_SCRIPT = True
-        GSUtil.GSUTIL_PATH = buildbot_gsutil
-      else:
-        dart_gsutil = os.path.join(DART_DIR, 'third_party', 'gsutil', 'gsutil')
-        if os.path.isfile(dart_gsutil):
-          GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
-          GSUtil.GSUTIL_PATH = dart_gsutil
-        elif GSUtil.USE_DART_REPO_VERSION:
-          raise Exception("Dart repository version of gsutil required, "
-                          "but not found.")
+    def _layzCalculateGSUtilPath(self):
+        if not GSUtil.GSUTIL_PATH:
+            buildbot_gsutil = '/b/build/scripts/slave/gsutil'
+            if platform.system() == 'Windows':
+                buildbot_gsutil = 'e:\\\\b\\build\\scripts\\slave\\gsutil'
+            if os.path.isfile(
+                    buildbot_gsutil) and not GSUtil.USE_DART_REPO_VERSION:
+                GSUtil.GSUTIL_IS_SHELL_SCRIPT = True
+                GSUtil.GSUTIL_PATH = buildbot_gsutil
+            else:
+                dart_gsutil = os.path.join(DART_DIR, 'third_party', 'gsutil',
+                                           'gsutil')
+                if os.path.isfile(dart_gsutil):
+                    GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
+                    GSUtil.GSUTIL_PATH = dart_gsutil
+                elif GSUtil.USE_DART_REPO_VERSION:
+                    raise Exception(
+                        "Dart repository version of gsutil required, "
+                        "but not found.")
+                else:
+                    # We did not find gsutil, look in path
+                    possible_locations = list(os.environ['PATH'].split(
+                        os.pathsep))
+                    for directory in possible_locations:
+                        location = os.path.join(directory, 'gsutil')
+                        if os.path.isfile(location):
+                            GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
+                            GSUtil.GSUTIL_PATH = location
+                            break
+            assert GSUtil.GSUTIL_PATH
+
+    def execute(self, gsutil_args):
+        self._layzCalculateGSUtilPath()
+
+        if GSUtil.GSUTIL_IS_SHELL_SCRIPT:
+            gsutil_command = [GSUtil.GSUTIL_PATH]
         else:
-          # We did not find gsutil, look in path
-          possible_locations = list(os.environ['PATH'].split(os.pathsep))
-          for directory in possible_locations:
-            location = os.path.join(directory, 'gsutil')
-            if os.path.isfile(location):
-              GSUtil.GSUTIL_IS_SHELL_SCRIPT = False
-              GSUtil.GSUTIL_PATH = location
-              break
-      assert GSUtil.GSUTIL_PATH
+            gsutil_command = [sys.executable, GSUtil.GSUTIL_PATH]
 
-  def execute(self, gsutil_args):
-    self._layzCalculateGSUtilPath()
+        return run(
+            gsutil_command + gsutil_args,
+            shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and sys.platform == 'win32'))
 
-    if GSUtil.GSUTIL_IS_SHELL_SCRIPT:
-      gsutil_command = [GSUtil.GSUTIL_PATH]
-    else:
-      gsutil_command = [sys.executable, GSUtil.GSUTIL_PATH]
+    def upload(self,
+               local_path,
+               remote_path,
+               recursive=False,
+               public=False,
+               multithread=False):
+        assert remote_path.startswith('gs://')
 
-    return run(gsutil_command + gsutil_args,
-               shell=(GSUtil.GSUTIL_IS_SHELL_SCRIPT and
-                      sys.platform == 'win32'))
+        if multithread:
+            args = ['-m', 'cp']
+        else:
+            args = ['cp']
+        if public:
+            args += ['-a', 'public-read']
+        if recursive:
+            args += ['-R']
+        args += [local_path, remote_path]
+        self.execute(args)
 
-  def upload(self, local_path, remote_path, recursive=False,
-             public=False, multithread=False):
-    assert remote_path.startswith('gs://')
+    def cat(self, remote_path):
+        assert remote_path.startswith('gs://')
 
-    if multithread:
-      args = ['-m', 'cp']
-    else:
-      args = ['cp']
-    if public:
-      args += ['-a', 'public-read']
-    if recursive:
-      args += ['-R']
-    args += [local_path, remote_path]
-    self.execute(args)
+        args = ['cat', remote_path]
+        (stdout, _, _) = self.execute(args)
+        return stdout
 
-  def cat(self, remote_path):
-    assert remote_path.startswith('gs://')
+    def setGroupReadACL(self, remote_path, group):
+        args = ['acl', 'ch', '-g', '%s:R' % group, remote_path]
+        self.execute(args)
 
-    args = ['cat', remote_path]
-    (stdout, _, _) = self.execute(args)
-    return stdout
+    def setContentType(self, remote_path, content_type):
+        args = ['setmeta', '-h', 'Content-Type:%s' % content_type, remote_path]
+        self.execute(args)
 
-  def setGroupReadACL(self, remote_path, group):
-    args = ['acl', 'ch', '-g', '%s:R' % group, remote_path]
-    self.execute(args)
+    def remove(self, remote_path, recursive=False):
+        assert remote_path.startswith('gs://')
 
-  def setContentType(self, remote_path, content_type):
-    args = ['setmeta', '-h', 'Content-Type:%s' % content_type, remote_path]
-    self.execute(args)
+        args = ['rm']
+        if recursive:
+            args += ['-R']
+        args += [remote_path]
+        self.execute(args)
 
-  def remove(self, remote_path, recursive=False):
-    assert remote_path.startswith('gs://')
-
-    args = ['rm']
-    if recursive:
-      args += ['-R']
-    args += [remote_path]
-    self.execute(args)
 
 def CalculateMD5Checksum(filename):
-  """Calculate the MD5 checksum for filename."""
+    """Calculate the MD5 checksum for filename."""
 
-  md5 = hashlib.md5()
+    md5 = hashlib.md5()
 
-  with open(filename, 'rb') as f:
-    data = f.read(65536)
-    while len(data) > 0:
-      md5.update(data)
-      data = f.read(65536)
+    with open(filename, 'rb') as f:
+        data = f.read(65536)
+        while len(data) > 0:
+            md5.update(data)
+            data = f.read(65536)
 
-  return md5.hexdigest()
+    return md5.hexdigest()
+
 
 def CalculateSha256Checksum(filename):
-  """Calculate the sha256 checksum for filename."""
+    """Calculate the sha256 checksum for filename."""
 
-  sha = hashlib.sha256()
+    sha = hashlib.sha256()
 
-  with open(filename, 'rb') as f:
-    data = f.read(65536)
-    while len(data) > 0:
-      sha.update(data)
-      data = f.read(65536)
+    with open(filename, 'rb') as f:
+        data = f.read(65536)
+        while len(data) > 0:
+            sha.update(data)
+            data = f.read(65536)
 
-  return sha.hexdigest()
+    return sha.hexdigest()
+
 
 def CreateMD5ChecksumFile(filename, mangled_filename=None):
-  """Create and upload an MD5 checksum file for filename."""
-  if not mangled_filename:
-    mangled_filename = os.path.basename(filename)
+    """Create and upload an MD5 checksum file for filename."""
+    if not mangled_filename:
+        mangled_filename = os.path.basename(filename)
 
-  checksum = CalculateMD5Checksum(filename)
-  checksum_filename = '%s.md5sum' % filename
+    checksum = CalculateMD5Checksum(filename)
+    checksum_filename = '%s.md5sum' % filename
 
-  with open(checksum_filename, 'w') as f:
-    f.write('%s *%s' % (checksum, mangled_filename))
+    with open(checksum_filename, 'w') as f:
+        f.write('%s *%s' % (checksum, mangled_filename))
 
-  print "MD5 checksum of %s is %s" % (filename, checksum)
-  return checksum_filename
+    print "MD5 checksum of %s is %s" % (filename, checksum)
+    return checksum_filename
+
 
 def CreateSha256ChecksumFile(filename, mangled_filename=None):
-  """Create and upload an sha256 checksum file for filename."""
-  if not mangled_filename:
-    mangled_filename = os.path.basename(filename)
+    """Create and upload an sha256 checksum file for filename."""
+    if not mangled_filename:
+        mangled_filename = os.path.basename(filename)
 
-  checksum = CalculateSha256Checksum(filename)
-  checksum_filename = '%s.sha256sum' % filename
+    checksum = CalculateSha256Checksum(filename)
+    checksum_filename = '%s.sha256sum' % filename
 
-  with open(checksum_filename, 'w') as f:
-    f.write('%s *%s' % (checksum, mangled_filename))
+    with open(checksum_filename, 'w') as f:
+        f.write('%s *%s' % (checksum, mangled_filename))
 
-  print "SHA256 checksum of %s is %s" % (filename, checksum)
-  return checksum_filename
+    print "SHA256 checksum of %s is %s" % (filename, checksum)
+    return checksum_filename
+
 
 def GetChannelFromName(name):
-  """Get the channel from the name. Bleeding edge builders don't
+    """Get the channel from the name. Bleeding edge builders don't
       have a suffix."""
-  channel_name = string.split(name, '-').pop()
-  if channel_name in Channel.ALL_CHANNELS:
-    return channel_name
-  return Channel.BLEEDING_EDGE
+    channel_name = string.split(name, '-').pop()
+    if channel_name in Channel.ALL_CHANNELS:
+        return channel_name
+    return Channel.BLEEDING_EDGE
+
 
 def GetSystemFromName(name):
-  """Get the system from the name."""
-  for part in string.split(name, '-'):
-    if part in SYSTEM_RENAMES: return SYSTEM_RENAMES[part]
+    """Get the system from the name."""
+    for part in string.split(name, '-'):
+        if part in SYSTEM_RENAMES: return SYSTEM_RENAMES[part]
 
-  raise ValueError("Bot name '{}' does not have a system name in it.".format(name))
+    raise ValueError(
+        "Bot name '{}' does not have a system name in it.".format(name))
diff --git a/tools/bots/dart2js_dump_info.py b/tools/bots/dart2js_dump_info.py
index eb86385..e6e7115 100644
--- a/tools/bots/dart2js_dump_info.py
+++ b/tools/bots/dart2js_dump_info.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Buildbot steps for testing dart2js with --dump-info turned on
 """
@@ -16,69 +15,68 @@
 utils = bot_utils.GetUtils()
 HOST_OS = utils.GuessOS()
 
+
 def DumpConfig(name, is_buildbot):
-  """Returns info for the current buildbot.
+    """Returns info for the current buildbot.
   We only run this bot on linux, so all of this is just hard coded.
   """
-  return bot.BuildInfo('none', 'none', 'release', 'linux')
+    return bot.BuildInfo('none', 'none', 'release', 'linux')
+
 
 def Run(args):
-  print "Running: %s" % ' '.join(args)
-  sys.stdout.flush()
-  bot.RunProcess(args)
+    print "Running: %s" % ' '.join(args)
+    sys.stdout.flush()
+    bot.RunProcess(args)
+
 
 def DumpSteps(build_info):
-  build_root = utils.GetBuildRoot(HOST_OS, mode='release', arch='ia32')
-  compilations_dir = os.path.join(bot_utils.DART_DIR,
-                                  build_root,
-                                  'generated_compilations')
-  tests = ['html', 'samples']
+    build_root = utils.GetBuildRoot(HOST_OS, mode='release', arch='ia32')
+    compilations_dir = os.path.join(bot_utils.DART_DIR, build_root,
+                                    'generated_compilations')
+    tests = ['html', 'samples']
 
-  with bot.BuildStep('Cleaning out old compilations'):
-    print "Cleaning out %s" % compilations_dir
-    shutil.rmtree(compilations_dir, ignore_errors=True)
+    with bot.BuildStep('Cleaning out old compilations'):
+        print "Cleaning out %s" % compilations_dir
+        shutil.rmtree(compilations_dir, ignore_errors=True)
 
-  with utils.TempDir() as temp_dir:
-    normal_compilations = os.path.join(temp_dir, 'normal')
-    dump_compilations = os.path.join(temp_dir, 'dump')
-    normal_compilation_command = [sys.executable,
-                                  './tools/test.py',
-                                  '--arch=ia32',
-                                  '--mode=%s' % build_info.mode,
-                                  '-cdart2js',
-                                  '-rnone',
-                                  '--time',
-                                  '--use-sdk',
-                                  '--report',
-                                  '--progress=buildbot',
-                                  '-v'
-                                  ] + tests
-    with bot.BuildStep('Compiling without dump info'):
-      Run(normal_compilation_command)
-      pass
+    with utils.TempDir() as temp_dir:
+        normal_compilations = os.path.join(temp_dir, 'normal')
+        dump_compilations = os.path.join(temp_dir, 'dump')
+        normal_compilation_command = [
+            sys.executable, './tools/test.py', '--arch=ia32',
+            '--mode=%s' % build_info.mode, '-cdart2js', '-rnone', '--time',
+            '--use-sdk', '--report', '--progress=buildbot', '-v'
+        ] + tests
+        with bot.BuildStep('Compiling without dump info'):
+            Run(normal_compilation_command)
+            pass
 
-    with bot.BuildStep('Store normal compilation artifacts'):
-      args = ['mv', compilations_dir, normal_compilations]
-      Run(args)
+        with bot.BuildStep('Store normal compilation artifacts'):
+            args = ['mv', compilations_dir, normal_compilations]
+            Run(args)
 
-    with bot.BuildStep('Compiling with dump info'):
-      args = normal_compilation_command + ['--dart2js-options=--dump-info']
-      Run(args)
+        with bot.BuildStep('Compiling with dump info'):
+            args = normal_compilation_command + [
+                '--dart2js-options=--dump-info'
+            ]
+            Run(args)
 
-    with bot.BuildStep('Store normal compilation artifacts'):
-      args = ['mv', compilations_dir, dump_compilations]
-      Run(args)
+        with bot.BuildStep('Store normal compilation artifacts'):
+            args = ['mv', compilations_dir, dump_compilations]
+            Run(args)
 
-    with bot.BuildStep('Compare outputs'):
-      args = ['diff', '-rq', '-x', '*\.json',
-              normal_compilations, dump_compilations]
-      # Diff will return non zero and we will throw if there are any differences
-      Run(args)
+        with bot.BuildStep('Compare outputs'):
+            args = [
+                'diff', '-rq', '-x', '*\.json', normal_compilations,
+                dump_compilations
+            ]
+            # Diff will return non zero and we will throw if there are any differences
+            Run(args)
 
-    with bot.BuildStep('Validate dump files'):
-      # Do whatever you like :-), files are in dump_compilations
-      pass
+        with bot.BuildStep('Validate dump files'):
+            # Do whatever you like :-), files are in dump_compilations
+            pass
+
 
 if __name__ == '__main__':
-  bot.RunBot(DumpConfig, DumpSteps)
-
+    bot.RunBot(DumpConfig, DumpSteps)
diff --git a/tools/bots/dart_sdk.py b/tools/bots/dart_sdk.py
index 48564d8..ac91988 100755
--- a/tools/bots/dart_sdk.py
+++ b/tools/bots/dart_sdk.py
@@ -21,214 +21,247 @@
 (bot_name, _) = bot.GetBotName()
 CHANNEL = bot_utils.GetChannelFromName(bot_name)
 
+
 def BuildArchitectures():
- if BUILD_OS == 'linux':
-   return ['ia32', 'x64', 'arm', 'arm64']
- else:
-   return ['ia32', 'x64']
+    if BUILD_OS == 'linux':
+        return ['ia32', 'x64', 'arm', 'arm64']
+    else:
+        return ['ia32', 'x64']
+
 
 def BuildRootPath(path, arch=BUILD_ARCHITECTURE, build_mode='release'):
-  return os.path.join(bot_utils.DART_DIR,
-                      utils.GetBuildRoot(BUILD_OS, build_mode, arch), path)
+    return os.path.join(bot_utils.DART_DIR,
+                        utils.GetBuildRoot(BUILD_OS, build_mode, arch), path)
+
 
 def BuildDartdocAPIDocs(dirname):
-  dart_sdk = BuildRootPath('dart-sdk')
-  dart_exe =  os.path.join(dart_sdk, 'bin', 'dart')
-  dartdoc_dart = os.path.join(bot_utils.DART_DIR,
-                              'third_party', 'pkg', 'dartdoc', 'bin',
-                              'dartdoc.dart')
-  footer_file = os.path.join(bot_utils.DART_DIR,
-                              'tools', 'bots', 'dartdoc_footer.html')
-  url = 'https://api.dartlang.org/stable'
-  with bot.BuildStep('Build API docs by dartdoc'):
-    bot_utils.run([dart_exe, dartdoc_dart,
-                  '--sdk-docs', '--output', dirname, '--footer', footer_file,
-                  '--rel-canonical-prefix=' + url])
+    dart_sdk = BuildRootPath('dart-sdk')
+    dart_exe = os.path.join(dart_sdk, 'bin', 'dart')
+    dartdoc_dart = os.path.join(bot_utils.DART_DIR, 'third_party', 'pkg',
+                                'dartdoc', 'bin', 'dartdoc.dart')
+    footer_file = os.path.join(bot_utils.DART_DIR, 'tools', 'bots',
+                               'dartdoc_footer.html')
+    url = 'https://api.dartlang.org/stable'
+    with bot.BuildStep('Build API docs by dartdoc'):
+        bot_utils.run([
+            dart_exe, dartdoc_dart, '--sdk-docs', '--output', dirname,
+            '--footer', footer_file, '--rel-canonical-prefix=' + url
+        ])
+
 
 def CreateUploadVersionFile():
-  file_path = BuildRootPath('VERSION')
-  with open(file_path, 'w') as fd:
-    fd.write(utils.GetVersionFileContent())
-  DartArchiveUploadVersionFile(file_path)
+    file_path = BuildRootPath('VERSION')
+    with open(file_path, 'w') as fd:
+        fd.write(utils.GetVersionFileContent())
+    DartArchiveUploadVersionFile(file_path)
+
 
 def DartArchiveUploadVersionFile(version_file):
-  namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
-  revision = utils.GetArchiveVersion()
-  for revision in [revision, 'latest']:
-    destination = namer.version_filepath(revision)
-    DartArchiveFile(version_file, destination, checksum_files=False)
+    namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
+    revision = utils.GetArchiveVersion()
+    for revision in [revision, 'latest']:
+        destination = namer.version_filepath(revision)
+        DartArchiveFile(version_file, destination, checksum_files=False)
+
 
 def CreateAndUploadSDKZip(arch, sdk_path):
-  sdk_zip = BuildRootPath('dartsdk-%s-%s.zip' % (BUILD_OS, arch), arch=arch)
-  FileDelete(sdk_zip)
-  CreateZip(sdk_path, sdk_zip)
-  DartArchiveUploadSDKs(BUILD_OS, arch, sdk_zip)
+    sdk_zip = BuildRootPath('dartsdk-%s-%s.zip' % (BUILD_OS, arch), arch=arch)
+    FileDelete(sdk_zip)
+    CreateZip(sdk_path, sdk_zip)
+    DartArchiveUploadSDKs(BUILD_OS, arch, sdk_zip)
+
 
 def CopyAotBinaries(arch, sdk_path):
-  product_sdk_path = BuildRootPath('dart-sdk', arch=arch, build_mode='product')
-  # We don't support precompilation on ia32.
-  if arch != 'ia32':
-    with bot.BuildStep('Patching in PRODUCT built AOT binaries'):
-      CopyBetween(product_sdk_path, sdk_path, 'bin', 'utils', GuessExtension('gen_snapshot'))
-      CopyBetween(product_sdk_path, sdk_path, 'bin', GuessExtension('dartaotruntime'))
+    product_sdk_path = BuildRootPath(
+        'dart-sdk', arch=arch, build_mode='product')
+    # We don't support precompilation on ia32.
+    if arch != 'ia32':
+        with bot.BuildStep('Patching in PRODUCT built AOT binaries'):
+            CopyBetween(product_sdk_path, sdk_path, 'bin', 'utils',
+                        GuessExtension('gen_snapshot'))
+            CopyBetween(product_sdk_path, sdk_path, 'bin',
+                        GuessExtension('dartaotruntime'))
+
 
 def DartArchiveUploadSDKs(system, arch, sdk_zip):
-  namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
-  git_number = utils.GetArchiveVersion()
-  git_hash = 'hash/%s' % utils.GetGitRevision()
-  for revision in [git_number, git_hash, 'latest']:
-    path = namer.sdk_zipfilepath(revision, system, arch, 'release')
-    DartArchiveFile(sdk_zip, path, checksum_files=True)
+    namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
+    git_number = utils.GetArchiveVersion()
+    git_hash = 'hash/%s' % utils.GetGitRevision()
+    for revision in [git_number, git_hash, 'latest']:
+        path = namer.sdk_zipfilepath(revision, system, arch, 'release')
+        DartArchiveFile(sdk_zip, path, checksum_files=True)
+
 
 def DartArchiveUnstrippedBinaries():
-  namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
-  revision = utils.GetArchiveVersion()
-  binary = namer.unstripped_filename(BUILD_OS)
-  for arch in BuildArchitectures():
-    binary = BuildRootPath(binary, arch=arch)
-    gs_path = namer.unstripped_filepath(revision, BUILD_OS, arch)
-    DartArchiveFile(binary, gs_path)
+    namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
+    revision = utils.GetArchiveVersion()
+    binary = namer.unstripped_filename(BUILD_OS)
+    for arch in BuildArchitectures():
+        binary = BuildRootPath(binary, arch=arch)
+        gs_path = namer.unstripped_filepath(revision, BUILD_OS, arch)
+        DartArchiveFile(binary, gs_path)
+
 
 def CreateUploadAPIDocs():
-  dartdoc_dir = BuildRootPath('gen-dartdocs')
-  dartdoc_zip = BuildRootPath('dartdocs-api.zip')
-  if CHANNEL == bot_utils.Channel.TRY:
-    BuildDartdocAPIDocs(dartdoc_dir)
-  else:
-    UploadApiLatestFile()
-    BuildDartdocAPIDocs(dartdoc_dir)
-    UploadDartdocApiDocs(dartdoc_dir)
-    CreateZip(dartdoc_dir, dartdoc_zip)
-    DartArchiveUploadDartdocAPIDocs(dartdoc_zip)
+    dartdoc_dir = BuildRootPath('gen-dartdocs')
+    dartdoc_zip = BuildRootPath('dartdocs-api.zip')
+    if CHANNEL == bot_utils.Channel.TRY:
+        BuildDartdocAPIDocs(dartdoc_dir)
+    else:
+        UploadApiLatestFile()
+        BuildDartdocAPIDocs(dartdoc_dir)
+        UploadDartdocApiDocs(dartdoc_dir)
+        CreateZip(dartdoc_dir, dartdoc_zip)
+        DartArchiveUploadDartdocAPIDocs(dartdoc_zip)
+
 
 def DartArchiveUploadDartdocAPIDocs(api_zip):
-  namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
-  revision = utils.GetArchiveVersion()
-  for revision in [revision, 'latest']:
-    destination = (namer.apidocs_directory(revision) + '/' +
-        namer.dartdocs_zipfilename())
-    DartArchiveFile(api_zip, destination, checksum_files=False)
+    namer = bot_utils.GCSNamer(CHANNEL, bot_utils.ReleaseType.RAW)
+    revision = utils.GetArchiveVersion()
+    for revision in [revision, 'latest']:
+        destination = (namer.apidocs_directory(revision) + '/' +
+                       namer.dartdocs_zipfilename())
+        DartArchiveFile(api_zip, destination, checksum_files=False)
+
 
 def UploadDartdocApiDocs(dir_name):
-  apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL)
-  revision = utils.GetArchiveVersion()
-  dartdocs_destination_gcsdir = apidocs_namer.dartdocs_dirpath(revision)
+    apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL)
+    revision = utils.GetArchiveVersion()
+    dartdocs_destination_gcsdir = apidocs_namer.dartdocs_dirpath(revision)
 
-  # Return early if the documents have already been uploaded.
-  # This can happen if a build was forced, or a commit had no changes in the
-  # dart repository (e.g. DEPS file update).
-  if GsutilExists(dartdocs_destination_gcsdir):
-    print ("Not uploading api docs, since %s is already present."
-           % dartdocs_destination_gcsdir)
-    return
+    # Return early if the documents have already been uploaded.
+    # This can happen if a build was forced, or a commit had no changes in the
+    # dart repository (e.g. DEPS file update).
+    if GsutilExists(dartdocs_destination_gcsdir):
+        print("Not uploading api docs, since %s is already present." %
+              dartdocs_destination_gcsdir)
+        return
 
-  # Upload everything inside the built apidocs directory.
-  gsutil = bot_utils.GSUtil()
-  gsutil.upload(dir_name, dartdocs_destination_gcsdir, recursive=True,
-                public=True, multithread=True)
+    # Upload everything inside the built apidocs directory.
+    gsutil = bot_utils.GSUtil()
+    gsutil.upload(
+        dir_name,
+        dartdocs_destination_gcsdir,
+        recursive=True,
+        public=True,
+        multithread=True)
+
 
 def UploadApiLatestFile():
-  apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL)
-  revision = utils.GetArchiveVersion()
-  apidocs_destination_latestfile = apidocs_namer.docs_latestpath(revision)
-  # Update latest.txt to contain the newest revision.
-  with utils.TempDir('latest_file') as temp_dir:
-    latest_file = os.path.join(temp_dir, 'latest.txt')
-    with open(latest_file, 'w') as f:
-      f.write('%s' % revision)
-    DartArchiveFile(latest_file, apidocs_destination_latestfile)
+    apidocs_namer = bot_utils.GCSNamerApiDocs(CHANNEL)
+    revision = utils.GetArchiveVersion()
+    apidocs_destination_latestfile = apidocs_namer.docs_latestpath(revision)
+    # Update latest.txt to contain the newest revision.
+    with utils.TempDir('latest_file') as temp_dir:
+        latest_file = os.path.join(temp_dir, 'latest.txt')
+        with open(latest_file, 'w') as f:
+            f.write('%s' % revision)
+        DartArchiveFile(latest_file, apidocs_destination_latestfile)
+
 
 def GsutilExists(gsu_path):
-  # This is a little hackish, but it is basically a one off doing very
-  # specialized check that we don't use elsewhere.
-  gsutilTool = os.path.join(bot_utils.DART_DIR,
-                            'third_party', 'gsutil', 'gsutil')
-  (_, stderr, returncode) = bot_utils.run(
-      [gsutilTool, 'ls', gsu_path],
-      throw_on_error=False)
-  # If the returncode is nonzero and we can find a specific error message,
-  # we know there are no objects with a prefix of [gsu_path].
-  missing = (returncode and 'CommandException: One or more URLs matched no objects.' in stderr)
-  # Either the returncode has to be zero or the object must be missing,
-  # otherwise throw an exception.
-  if not missing and returncode:
-    raise Exception("Failed to determine whether %s exists" % gsu_path)
-  return not missing
+    # This is a little hackish, but it is basically a one off doing very
+    # specialized check that we don't use elsewhere.
+    gsutilTool = os.path.join(bot_utils.DART_DIR, 'third_party', 'gsutil',
+                              'gsutil')
+    (_, stderr, returncode) = bot_utils.run([gsutilTool, 'ls', gsu_path],
+                                            throw_on_error=False)
+    # If the returncode is nonzero and we can find a specific error message,
+    # we know there are no objects with a prefix of [gsu_path].
+    missing = (
+        returncode and
+        'CommandException: One or more URLs matched no objects.' in stderr)
+    # Either the returncode has to be zero or the object must be missing,
+    # otherwise throw an exception.
+    if not missing and returncode:
+        raise Exception("Failed to determine whether %s exists" % gsu_path)
+    return not missing
 
 
 def CreateZip(directory, target_file):
-  if 'win' in BUILD_OS:
-    CreateZipWindows(directory, target_file)
-  else:
-    CreateZipPosix(directory, target_file)
+    if 'win' in BUILD_OS:
+        CreateZipWindows(directory, target_file)
+    else:
+        CreateZipPosix(directory, target_file)
+
 
 def CreateZipPosix(directory, target_file):
-  with utils.ChangedWorkingDirectory(os.path.dirname(directory)):
-    command = ['zip', '-yrq9', target_file, os.path.basename(directory)]
-    Run(command)
+    with utils.ChangedWorkingDirectory(os.path.dirname(directory)):
+        command = ['zip', '-yrq9', target_file, os.path.basename(directory)]
+        Run(command)
+
 
 def CreateZipWindows(directory, target_file):
-  with utils.ChangedWorkingDirectory(os.path.dirname(directory)):
-    zip_win = os.path.join(bot_utils.DART_DIR, 'third_party', '7zip', '7za')
-    command = [zip_win, 'a', '-tzip', target_file, os.path.basename(directory)]
-    Run(command)
+    with utils.ChangedWorkingDirectory(os.path.dirname(directory)):
+        zip_win = os.path.join(bot_utils.DART_DIR, 'third_party', '7zip', '7za')
+        command = [
+            zip_win, 'a', '-tzip', target_file,
+            os.path.basename(directory)
+        ]
+        Run(command)
+
 
 def FileDelete(f):
-  if os.path.exists(f):
-    os.remove(f)
+    if os.path.exists(f):
+        os.remove(f)
+
 
 def CopyBetween(src_path, dst_path, *relatives):
-  try:
-    os.makedirs(os.path.join(dst_path, *relatives[:-1]))
-  except OSError:
-    # This is fine.
-    pass
-  shutil.copy2(
-      os.path.join(src_path, *relatives),
-      os.path.join(dst_path, *relatives[:-1]))
+    try:
+        os.makedirs(os.path.join(dst_path, *relatives[:-1]))
+    except OSError:
+        # This is fine.
+        pass
+    shutil.copy2(
+        os.path.join(src_path, *relatives),
+        os.path.join(dst_path, *relatives[:-1]))
+
 
 def GuessExtension(binary):
-  if 'win' in BUILD_OS:
-    return binary + '.exe'
-  return binary
+    if 'win' in BUILD_OS:
+        return binary + '.exe'
+    return binary
+
 
 def DartArchiveFile(local_path, remote_path, checksum_files=False):
-  gsutil = bot_utils.GSUtil()
-  gsutil.upload(local_path, remote_path, public=True)
-  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.
-    assert '/' in remote_path and not remote_path.endswith('/')
+    gsutil = bot_utils.GSUtil()
+    gsutil.upload(local_path, remote_path, public=True)
+    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.
+        assert '/' in remote_path and not remote_path.endswith('/')
 
-    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)
-    local_sha256 = bot_utils.CreateSha256ChecksumFile(local_path,
-                                                      mangled_filename)
-    gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True)
+        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)
+        local_sha256 = bot_utils.CreateSha256ChecksumFile(
+            local_path, mangled_filename)
+        gsutil.upload(local_sha256, remote_path + '.sha256sum', public=True)
+
 
 def Run(command, env=None):
-  print "Running %s" % ' '.join(command)
-  print "Environment %s" % env
-  return bot.RunProcess(command, env=env)
+    print "Running %s" % ' '.join(command)
+    print "Environment %s" % env
+    return bot.RunProcess(command, env=env)
+
 
 if __name__ == '__main__':
-  if len(sys.argv) > 1 and sys.argv[1] == 'api_docs':
-    if BUILD_OS == 'linux':
-      CreateUploadAPIDocs()
-  elif CHANNEL != bot_utils.Channel.TRY:
-    for arch in BuildArchitectures():
-      sdk_path = BuildRootPath('dart-sdk', arch=arch)
-      # Patch in all the PRODUCT built AOT binaries.
-      CopyAotBinaries(arch, sdk_path)
-      with bot.BuildStep('Create and upload sdk zip for ' + arch):
-        CreateAndUploadSDKZip(arch, sdk_path)
-    DartArchiveUnstrippedBinaries()
-    if BUILD_OS == 'linux':
-      CreateUploadVersionFile()
-  else:  # CHANNEL == bot_utils.Channel.TRY
-    # Patch in all the PRODUCT built AOT binaries.
-    for arch in BuildArchitectures():
-      sdk_path = BuildRootPath('dart-sdk', arch=arch)
-      CopyAotBinaries(arch, sdk_path)
+    if len(sys.argv) > 1 and sys.argv[1] == 'api_docs':
+        if BUILD_OS == 'linux':
+            CreateUploadAPIDocs()
+    elif CHANNEL != bot_utils.Channel.TRY:
+        for arch in BuildArchitectures():
+            sdk_path = BuildRootPath('dart-sdk', arch=arch)
+            # Patch in all the PRODUCT built AOT binaries.
+            CopyAotBinaries(arch, sdk_path)
+            with bot.BuildStep('Create and upload sdk zip for ' + arch):
+                CreateAndUploadSDKZip(arch, sdk_path)
+        DartArchiveUnstrippedBinaries()
+        if BUILD_OS == 'linux':
+            CreateUploadVersionFile()
+    else:  # CHANNEL == bot_utils.Channel.TRY
+        # Patch in all the PRODUCT built AOT binaries.
+        for arch in BuildArchitectures():
+            sdk_path = BuildRootPath('dart-sdk', arch=arch)
+            CopyAotBinaries(arch, sdk_path)
diff --git a/tools/bots/ddc_tests.py b/tools/bots/ddc_tests.py
index e00602b..ad7a131 100644
--- a/tools/bots/ddc_tests.py
+++ b/tools/bots/ddc_tests.py
@@ -13,30 +13,33 @@
 import bot
 import bot_utils
 
-TARGETS = [
-  'language_2',
-  'corelib_2',
-  'lib_2'
-]
+TARGETS = ['language_2', 'corelib_2', 'lib_2']
 
-FLAGS = [
-  '--strong'
-]
+FLAGS = ['--strong']
 
 if __name__ == '__main__':
-  with bot.BuildStep('Build SDK and dartdevc test packages'):
-    bot.RunProcess([sys.executable, './tools/build.py', '--mode=release',
-         '--arch=x64', 'dartdevc_test'])
+    with bot.BuildStep('Build SDK and dartdevc test packages'):
+        bot.RunProcess([
+            sys.executable, './tools/build.py', '--mode=release', '--arch=x64',
+            'dartdevc_test'
+        ])
 
-  with bot.BuildStep('Run tests'):
-    (bot_name, _) = bot.GetBotName()
-    system = bot_utils.GetSystemFromName(bot_name)
-    if system == 'linux':
-      bot.RunProcess([
-        'xvfb-run', sys.executable, './tools/test.py', '--strong', '-mrelease',
-        '-cdartdevc', '-rchrome', '-ax64', '--report', '--time', '--checked',
-        '--progress=buildbot', '--write-result-log'] + TARGETS )
-    else:
-      info = bot.BuildInfo('dartdevc', 'chrome', 'release', system,
-          arch='x64', checked=True)
-      bot.RunTest('dartdevc', info, TARGETS, flags=FLAGS)
+    with bot.BuildStep('Run tests'):
+        (bot_name, _) = bot.GetBotName()
+        system = bot_utils.GetSystemFromName(bot_name)
+        if system == 'linux':
+            bot.RunProcess([
+                'xvfb-run', sys.executable, './tools/test.py', '--strong',
+                '-mrelease', '-cdartdevc', '-rchrome', '-ax64', '--report',
+                '--time', '--checked', '--progress=buildbot',
+                '--write-result-log'
+            ] + TARGETS)
+        else:
+            info = bot.BuildInfo(
+                'dartdevc',
+                'chrome',
+                'release',
+                system,
+                arch='x64',
+                checked=True)
+            bot.RunTest('dartdevc', info, TARGETS, flags=FLAGS)
diff --git a/tools/bots/extend_results.dart b/tools/bots/extend_results.dart
index ac69dd9..d00c0cd 100644
--- a/tools/bots/extend_results.dart
+++ b/tools/bots/extend_results.dart
@@ -25,6 +25,8 @@
   final priorResults = await loadResultsMap(priorResultsPath);
   final flakes = await loadResultsMap(flakyPath);
   final priorFlakes = await loadResultsMap(priorFlakyPath);
+  final firstPriorResult =
+      priorResults.isEmpty ? null : priorResults.values.first;
 
   for (final String key in results.keys) {
     final Map<String, dynamic> result = results[key];
@@ -37,11 +39,13 @@
     result['builder_name'] = builderName;
     result['flaky'] = (flaky != null);
     result['previous_flaky'] = (priorFlaky != null);
+    if (firstPriorResult != null) {
+      result['previous_commit_hash'] = firstPriorResult['commit_hash'];
+      result['previous_commit_time'] = firstPriorResult['commit_time'];
+      result['previous_build_number'] = firstPriorResult['build_number'];
+    }
     if (priorResult != null) {
       result['previous_result'] = priorResult['result'];
-      result['previous_commit_hash'] = priorResult['commit_hash'];
-      result['previous_commit_time'] = priorResult['commit_time'];
-      result['previous_build_number'] = priorResult['build_number'];
     }
     result['changed'] = (result['result'] != result['previous_result'] ||
         result['flaky'] != result['previous_flaky']);
diff --git a/tools/bots/linux_distribution_support.py b/tools/bots/linux_distribution_support.py
index 28c26c7..9f2bb04 100644
--- a/tools/bots/linux_distribution_support.py
+++ b/tools/bots/linux_distribution_support.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Buildbot steps for src tarball generation and debian package generation
 
@@ -23,127 +22,138 @@
 HOST_OS = utils.GuessOS()
 SRC_BUILDER = r'debianpackage-linux'
 
+
 def SrcConfig(name, is_buildbot):
-  """Returns info for the current buildbot based on the name of the builder.
+    """Returns info for the current buildbot based on the name of the builder.
 
   Currently, since we only run this on linux, this is just:
   - mode: always "release"
   - system: always "linux"
   """
-  src_pattern = re.match(SRC_BUILDER, name)
-  if not src_pattern:
-    return None
-  return bot.BuildInfo('none', 'none', 'release', 'linux')
+    src_pattern = re.match(SRC_BUILDER, name)
+    if not src_pattern:
+        return None
+    return bot.BuildInfo('none', 'none', 'release', 'linux')
+
 
 def InstallFromDep(builddir):
-  for entry in os.listdir(builddir):
-    if entry.endswith("_amd64.deb"):
-      path = os.path.join(builddir, entry)
-      Run(['dpkg', '-i', path])
+    for entry in os.listdir(builddir):
+        if entry.endswith("_amd64.deb"):
+            path = os.path.join(builddir, entry)
+            Run(['dpkg', '-i', path])
+
 
 def UninstallDart():
-  Run(['dpkg', '-r', 'dart'])
+    Run(['dpkg', '-r', 'dart'])
+
 
 def CreateDartTestFile(tempdir):
-  filename = os.path.join(tempdir, 'test.dart')
-  with open(filename, 'w') as f:
-    f.write('import "dart:collection";\n\n')
-    f.write('void main() {\n')
-    f.write('  print("Hello world");\n')
-    f.write('}')
-  return filename
+    filename = os.path.join(tempdir, 'test.dart')
+    with open(filename, 'w') as f:
+        f.write('import "dart:collection";\n\n')
+        f.write('void main() {\n')
+        f.write('  print("Hello world");\n')
+        f.write('}')
+    return filename
+
 
 def Run(args):
-  print "Running: %s" % ' '.join(args)
-  sys.stdout.flush()
-  bot.RunProcess(args)
+    print "Running: %s" % ' '.join(args)
+    sys.stdout.flush()
+    bot.RunProcess(args)
+
 
 def TestInstallation(assume_installed=True):
-  paths = ['/usr/bin/dart']
-  for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
-    paths.append(os.path.join('/usr/lib/dart/bin', tool))
-  for path in paths:
-    if os.path.exists(path):
-      if not assume_installed:
-        print 'Assumed not installed, found %s' % path
-        sys.exit(1)
-    else:
-      if assume_installed:
-        print 'Assumed installed, but could not find %s' % path
-        sys.exit(1)
+    paths = ['/usr/bin/dart']
+    for tool in ['dart2js', 'pub', 'dart', 'dartanalyzer']:
+        paths.append(os.path.join('/usr/lib/dart/bin', tool))
+    for path in paths:
+        if os.path.exists(path):
+            if not assume_installed:
+                print 'Assumed not installed, found %s' % path
+                sys.exit(1)
+        else:
+            if assume_installed:
+                print 'Assumed installed, but could not find %s' % path
+                sys.exit(1)
+
 
 def SrcSteps(build_info):
-  # We always clobber the bot, to not leave old tarballs and packages
-  # floating around the out dir.
-  bot.Clobber(force=True)
+    # We always clobber the bot, to not leave old tarballs and packages
+    # floating around the out dir.
+    bot.Clobber(force=True)
 
-  version = utils.GetVersion()
-  builddir = os.path.join(bot_utils.DART_DIR,
-                          utils.GetBuildDir(HOST_OS),
-                          'src_and_installation')
+    version = utils.GetVersion()
+    builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
+                            'src_and_installation')
 
-  if not os.path.exists(builddir):
-    os.makedirs(builddir)
-  tarfilename = 'dart-%s.tar.gz' % version
-  tarfile = os.path.join(builddir, tarfilename)
+    if not os.path.exists(builddir):
+        os.makedirs(builddir)
+    tarfilename = 'dart-%s.tar.gz' % version
+    tarfile = os.path.join(builddir, tarfilename)
 
-  with bot.BuildStep('Validating linux system'):
-    print 'Validating that we are on debian jessie'
-    args = ['cat', '/etc/os-release']
-    (stdout, stderr, exitcode) = bot_utils.run(args)
-    if exitcode != 0:
-      print "Could not find linux system, exiting"
-      sys.exit(1)
-    if not "jessie" in stdout:
-      print "Trying to build debian bits but not on debian Jessie"
-      print "You can't fix this, please contact whesse@"
-      sys.exit(1)
+    with bot.BuildStep('Validating linux system'):
+        print 'Validating that we are on debian jessie'
+        args = ['cat', '/etc/os-release']
+        (stdout, stderr, exitcode) = bot_utils.run(args)
+        if exitcode != 0:
+            print "Could not find linux system, exiting"
+            sys.exit(1)
+        if not "jessie" in stdout:
+            print "Trying to build debian bits but not on debian Jessie"
+            print "You can't fix this, please contact whesse@"
+            sys.exit(1)
 
-  with bot.BuildStep('Create src tarball'):
-    print 'Building src tarball'
-    Run([sys.executable, './tools/create_tarball.py',
-         '--tar_filename', tarfile])
+    with bot.BuildStep('Create src tarball'):
+        print 'Building src tarball'
+        Run([
+            sys.executable, './tools/create_tarball.py', '--tar_filename',
+            tarfile
+        ])
 
-    print 'Building Debian packages'
-    Run([sys.executable, './tools/create_debian_packages.py',
-         '--tar_filename', tarfile,
-         '--out_dir', builddir])
+        print 'Building Debian packages'
+        Run([
+            sys.executable, './tools/create_debian_packages.py',
+            '--tar_filename', tarfile, '--out_dir', builddir
+        ])
 
-  with bot.BuildStep('Sanity check installation'):
-    if os.path.exists('/usr/bin/dart') or os.path.exists(
-        '/usr/lib/dart/bin/dart2js'):
-      print "Dart already installed, removing"
-      UninstallDart()
-    TestInstallation(assume_installed=False)
+    with bot.BuildStep('Sanity check installation'):
+        if os.path.exists('/usr/bin/dart') or os.path.exists(
+                '/usr/lib/dart/bin/dart2js'):
+            print "Dart already installed, removing"
+            UninstallDart()
+        TestInstallation(assume_installed=False)
 
-    InstallFromDep(builddir)
-    TestInstallation(assume_installed=True)
+        InstallFromDep(builddir)
+        TestInstallation(assume_installed=True)
 
-    # We build the runtime target to get everything we need to test the
-    # standalone target.
-    Run([sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'])
-    # Copy in the installed binary to avoid poluting /usr/bin (and having to
-    # run as root)
-    Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
+        # We build the runtime target to get everything we need to test the
+        # standalone target.
+        Run([
+            sys.executable, './tools/build.py', '-mrelease', '-ax64', 'runtime'
+        ])
+        # Copy in the installed binary to avoid poluting /usr/bin (and having to
+        # run as root)
+        Run(['cp', '/usr/bin/dart', 'out/ReleaseX64/dart'])
 
-    # We currently can't run the testing script on wheezy since the checked in
-    # binary is built on precise, see issue 18742
-    # TODO(18742): Run './tools/test.py' '-mrelease' 'standalone'
+        # We currently can't run the testing script on wheezy since the checked in
+        # binary is built on precise, see issue 18742
+        # TODO(18742): Run './tools/test.py' '-mrelease' 'standalone'
 
-    # Sanity check dart2js and the analyzer against a hello world program
-    with utils.TempDir() as temp_dir:
-      test_file = CreateDartTestFile(temp_dir)
-      Run(['/usr/lib/dart/bin/dart2js', test_file])
-      Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
-      Run(['/usr/lib/dart/bin/dart', test_file])
+        # Sanity check dart2js and the analyzer against a hello world program
+        with utils.TempDir() as temp_dir:
+            test_file = CreateDartTestFile(temp_dir)
+            Run(['/usr/lib/dart/bin/dart2js', test_file])
+            Run(['/usr/lib/dart/bin/dartanalyzer', test_file])
+            Run(['/usr/lib/dart/bin/dart', test_file])
 
-    # Sanity check that pub can start up and print the version
-    Run(['/usr/lib/dart/bin/pub', '--version'])
+        # Sanity check that pub can start up and print the version
+        Run(['/usr/lib/dart/bin/pub', '--version'])
 
-    UninstallDart()
-    TestInstallation(assume_installed=False)
+        UninstallDart()
+        TestInstallation(assume_installed=False)
 
 
 if __name__ == '__main__':
-  # We pass in None for build_step to avoid building the sdk.
-  bot.RunBot(SrcConfig, SrcSteps, build_step=None)
+    # We pass in None for build_step to avoid building the sdk.
+    bot.RunBot(SrcConfig, SrcSteps, build_step=None)
diff --git a/tools/bots/post_results_to_pubsub.dart b/tools/bots/post_results_to_pubsub.dart
new file mode 100644
index 0000000..a019b32
--- /dev/null
+++ b/tools/bots/post_results_to_pubsub.dart
@@ -0,0 +1,73 @@
+// 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 continuous integration testers to Cloud Pub/Sub.
+
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:args/args.dart';
+import 'package:http/http.dart' as http;
+
+void usage(ArgParser parser) {
+  print('''
+Usage: post_results_to_pubsub.dart [OPTIONS]
+Posts Dart CI results as messages to Google cloud pubsub
+
+The options are as follows:
+
+${parser.usage}''');
+  exit(1);
+}
+
+// Pubsub messages must be < 10MB long.  Because the JSON we send is
+// Base64 encoded, and we add a final record after checking the size,
+// the limit must be less than 3/4 of 10MB.
+const messageLengthLimit = 7000000;
+const postUrl =
+    'https://pubsub.googleapis.com/v1/projects/dart-ci/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');
+
+  final options = parser.parse(args);
+  if (options['help']) {
+    usage(parser);
+  }
+
+  var client = http.Client();
+
+  var lines = await File(options['result_file']).readAsLines();
+  var token = await File(options['auth_token']).readAsString();
+  // Construct pubsub messages.
+  var line = 0;
+  while (line < lines.length) {
+    var message = StringBuffer();
+    message.write('[');
+    message.write(lines[line++]);
+    var messageLines = 1;
+    while (message.length < messageLengthLimit && line < lines.length) {
+      message.write(',\n');
+      message.write(lines[line++]);
+      messageLines++;
+    }
+    message.write(']');
+    var base64data = base64Encode(utf8.encode(message.toString()));
+    var jsonMessage =
+        '{"messages": [{"attributes": {}, "data": "$base64data"}]}';
+    var headers = {'Authorization': 'Bearer $token'};
+    var response =
+        await client.post(postUrl, headers: headers, body: jsonMessage);
+    print('Sent pubsub message containing ${messageLines} results');
+    print('Status ${response.statusCode}');
+    print('Response: ${response.body}');
+  }
+  client.close();
+}
diff --git a/tools/bots/pub.py b/tools/bots/pub.py
index deb9b6d..7eda4b8 100755
--- a/tools/bots/pub.py
+++ b/tools/bots/pub.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Pub buildbot steps.
 
@@ -17,32 +16,35 @@
 
 PUB_BUILDER = r'pub-(linux|mac|win)'
 
+
 def PubConfig(name, is_buildbot):
-  """Returns info for the current buildbot based on the name of the builder.
+    """Returns info for the current buildbot based on the name of the builder.
 
   Currently, this is just:
   - mode: always release, we don't run pub in debug mode
   - system: "linux", "mac", or "win"
   - checked: always true
   """
-  pub_pattern = re.match(PUB_BUILDER, name)
-  if not pub_pattern:
-    return None
+    pub_pattern = re.match(PUB_BUILDER, name)
+    if not pub_pattern:
+        return None
 
-  system = pub_pattern.group(1)
-  mode = 'release'
-  if system == 'win': system = 'windows'
+    system = pub_pattern.group(1)
+    mode = 'release'
+    if system == 'win': system = 'windows'
 
-  return bot.BuildInfo('none', 'vm', mode, system, checked=True, arch='x64')
+    return bot.BuildInfo('none', 'vm', mode, system, checked=True, arch='x64')
+
 
 def PubSteps(build_info):
-  pub_location = os.path.join('third_party', 'pkg', 'pub')
-  with bot.BuildStep('Running pub tests'):
-    bot.RunTestRunner(build_info, pub_location)
+    pub_location = os.path.join('third_party', 'pkg', 'pub')
+    with bot.BuildStep('Running pub tests'):
+        bot.RunTestRunner(build_info, pub_location)
 
-  dartdoc_location = os.path.join('third_party', 'pkg', 'dartdoc')
-  with bot.BuildStep('Running dartdoc tests'):
-    bot.RunTestRunner(build_info, dartdoc_location)
+    dartdoc_location = os.path.join('third_party', 'pkg', 'dartdoc')
+    with bot.BuildStep('Running dartdoc tests'):
+        bot.RunTestRunner(build_info, dartdoc_location)
+
 
 if __name__ == '__main__':
-  bot.RunBot(PubConfig, PubSteps)
+    bot.RunBot(PubConfig, PubSteps)
diff --git a/tools/bots/pub_integration_test.py b/tools/bots/pub_integration_test.py
index 16d084a..6d71e1e 100755
--- a/tools/bots/pub_integration_test.py
+++ b/tools/bots/pub_integration_test.py
@@ -16,39 +16,41 @@
   test:
 """
 
+
 def Main():
-  parser = optparse.OptionParser()
-  parser.add_option('--mode', action='store', dest='mode', type='string',
-                    default='release')
+    parser = optparse.OptionParser()
+    parser.add_option(
+        '--mode', action='store', dest='mode', type='string', default='release')
 
-  (options, args) = parser.parse_args()
+    (options, args) = parser.parse_args()
 
-  out_dir_subfolder = 'DebugX64' if options.mode == 'debug' else 'ReleaseX64'
+    out_dir_subfolder = 'DebugX64' if options.mode == 'debug' else 'ReleaseX64'
 
-  out_dir = 'xcodebuild' if sys.platform == 'darwin' else 'out'
-  extension = '' if not sys.platform == 'win32' else '.bat'
-  pub = os.path.abspath(
-    '%s/%s/dart-sdk/bin/pub%s' % (out_dir, out_dir_subfolder, extension))
-  print(pub)
+    out_dir = 'xcodebuild' if sys.platform == 'darwin' else 'out'
+    extension = '' if not sys.platform == 'win32' else '.bat'
+    pub = os.path.abspath(
+        '%s/%s/dart-sdk/bin/pub%s' % (out_dir, out_dir_subfolder, extension))
+    print(pub)
 
-  working_dir = tempfile.mkdtemp()
-  try:
-    pub_cache_dir = working_dir + '/pub_cache'
-    env = os.environ.copy()
-    env['PUB_CACHE'] = pub_cache_dir
+    working_dir = tempfile.mkdtemp()
+    try:
+        pub_cache_dir = working_dir + '/pub_cache'
+        env = os.environ.copy()
+        env['PUB_CACHE'] = pub_cache_dir
 
-    with open(working_dir + '/pubspec.yaml', 'w') as pubspec_yaml:
-      pubspec_yaml.write(PUBSPEC)
+        with open(working_dir + '/pubspec.yaml', 'w') as pubspec_yaml:
+            pubspec_yaml.write(PUBSPEC)
 
-    exit_code = subprocess.call([pub, 'get'], cwd=working_dir, env=env)
-    if exit_code is not 0:
-      return exit_code
+        exit_code = subprocess.call([pub, 'get'], cwd=working_dir, env=env)
+        if exit_code is not 0:
+            return exit_code
 
-    exit_code = subprocess.call([pub, 'upgrade'], cwd=working_dir, env=env)
-    if exit_code is not 0:
-      return exit_code
-  finally:
-    shutil.rmtree(working_dir);
+        exit_code = subprocess.call([pub, 'upgrade'], cwd=working_dir, env=env)
+        if exit_code is not 0:
+            return exit_code
+    finally:
+        shutil.rmtree(working_dir)
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/bots/test_matrix.json b/tools/bots/test_matrix.json
index 5836ea1..da9071a 100644
--- a/tools/bots/test_matrix.json
+++ b/tools/bots/test_matrix.json
@@ -1,7 +1,7 @@
 {
   "global": {
-    "chrome": "65",
-    "firefox": "61"
+    "chrome": "76",
+    "firefox": "67"
   },
   "branches": [
     "analyzer-stable",
@@ -95,6 +95,39 @@
       "xcodebuild/ReleaseX64/dart2js_platform.dill",
       "xcodebuild/ReleaseX64/dart2js_platform_strong.dill"
     ],
+    "front-end": [
+      ".packages",
+      "out/ReleaseIA32/",
+      "out/ReleaseX64/",
+      "pkg/",
+      "runtime/tests/",
+      "samples-dev/",
+      "samples/",
+      "sdk/",
+      "tests/angular/",
+      "tests/co19_2/co19_2-analyzer.status",
+      "tests/co19_2/co19_2-dart2js.status",
+      "tests/co19_2/co19_2-kernel.status",
+      "tests/co19_2/co19_2-runtime.status",
+      "tests/compiler/",
+      "tests/corelib_2/",
+      "tests/dart/",
+      "tests/kernel/",
+      "tests/language_2/",
+      "tests/lib_2/",
+      "tests/light_unittest.dart",
+      "tests/search/",
+      "tests/standalone/",
+      "tests/standalone_2/",
+      "tests/ffi/",
+      "third_party/d8/",
+      "third_party/pkg/",
+      "third_party/pkg_tested/",
+      "third_party/requirejs/",
+      "tools/",
+      "xcodebuild/ReleaseIA32/",
+      "xcodebuild/ReleaseX64/"
+    ],
     "fuzzer": [
       "runtime/tools/dartfuzz/",
       "out/DebugIA32/",
@@ -128,6 +161,7 @@
       "out/DebugX64/",
       "out/DebugSIMARM/",
       "out/DebugSIMARM64/",
+      "out/DebugSIMARM_X64/",
       "out/DebugSIMDBC64/",
       "out/DebugAndroidARM/",
       "out/DebugAndroidARM64/",
@@ -135,6 +169,7 @@
       "out/ReleaseX64/",
       "out/ReleaseSIMARM/",
       "out/ReleaseSIMARM64/",
+      "out/ReleaseSIMARM_X64/",
       "out/ReleaseSIMDBC64/",
       "out/ReleaseAndroidARM/",
       "out/ReleaseAndroidARM64/",
@@ -143,15 +178,21 @@
       "out/ProductX64/",
       "out/ProductSIMARM/",
       "out/ProductSIMARM64/",
+      "out/ProductSIMARM_X64/",
       "out/ProductSIMDBC64/",
       "out/ProductAndroidARM/",
       "out/ProductAndroidARM64/",
       "xcodebuild/DebugIA32/",
+      "xcodebuild/DebugSIMARM/",
+      "xcodebuild/DebugSIMARM64/",
+      "xcodebuild/DebugSIMARM_X64/",
       "xcodebuild/DebugSIMDBC64/",
       "xcodebuild/DebugX64/",
       "xcodebuild/ProductX64/",
       "xcodebuild/ReleaseIA32/",
+      "xcodebuild/ReleaseSIMARM/",
       "xcodebuild/ReleaseSIMARM64/",
+      "xcodebuild/ReleaseSIMARM_X64/",
       "xcodebuild/ReleaseSIMDBC64/",
       "xcodebuild/ReleaseX64/",
       "samples/",
@@ -304,6 +345,11 @@
       "options": {
         "use-blobs": true
     }},
+    "dartkp-(linux|win|mac)-(debug|product|release)-(simarm|simarm64)-crossword": {
+      "options": {
+        "builder-tag": "crossword",
+        "use-blobs": true
+    }},
     "dartkp-win-(product|release)-x64": {
       "options": {
         "use-blobs": true
@@ -358,17 +404,20 @@
     "app_jitk-(linux|mac|win)-(debug|product|release)-(ia32|x64)": { },
     "dartkb-interpret-(linux|mac|win)-(debug|product|release)-(ia32|x64|arm|arm64|simarm|simarm64)": {
       "options": {
+        "builder-tag": "bytecode_interpreter",
         "vm-options": ["--enable_interpreter", "--compilation-counter-threshold=-1"]
     }},
     "dartkb-mixed-(linux|mac|win)-(debug|product|release)-(ia32|x64|arm|arm64|simarm|simarm64)": {
       "options": {
+        "builder-tag": "bytecode_mixed",
         "vm-options": ["--enable_interpreter"]
     }},
     "dartkb-compile-(linux|mac|win)-(debug|product|release)-(ia32|x64|arm|arm64|simarm|simarm64)": {
       "options": {
+        "builder-tag": "bytecode_compiler",
         "vm-options": ["--use_bytecode_compiler"]
     }},
-    "(dartdevc|dartdevk)-checked-(linux|mac|win)-(debug|product|release)-chrome": {
+    "(dartdevc|dartdevk)-checked-(linux|mac|win)-(debug|product|release)-(chrome|firefox)": {
       "options": {
         "checked": true,
         "use-sdk": true
@@ -408,23 +457,27 @@
           ]
         },
         {
+          "name": "fasta co19_2 tests",
+          "arguments": [
+            "-nfasta-${system}",
+            "co19_2"
+          ],
+          "fileset": "front-end",
+          "shards": 10
+        },
+        {
+          "name": "fasta sdk tests",
+          "arguments": ["-nfasta-${system}"],
+          "fileset": "front-end",
+          "shards": 5
+        },
+        {
           "name": "unit tests",
           "script": "tools/disguised_test.py",
           "arguments": [
             "-nunittest-asserts-${mode}-${system}",
              "pkg/(kernel|front_end|fasta)"
           ]
-        },
-        {
-          "name": "fasta sdk tests",
-          "arguments": ["-nfasta-${system}"]
-        },
-        {
-          "name": "fasta co19_2 tests",
-          "arguments": [
-            "-nfasta-${system}",
-            "co19_2"
-          ]
         }
       ]
     },
@@ -463,7 +516,16 @@
             "-ndartkb-mixed-linux-${mode}-${arch}"
           ],
           "fileset": "vm-kernel",
-          "shards": 10
+          "shards": 4
+        },
+        {
+          "name": "vm mixed mode co19 tests",
+          "arguments": [
+            "-ndartkb-mixed-linux-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 4
         },
         {
           "name": "vm bytecode compiler tests",
@@ -471,7 +533,16 @@
             "-ndartkb-compile-linux-${mode}-${arch}"
           ],
           "fileset": "vm-kernel",
-          "shards": 10
+          "shards": 4
+        },
+        {
+          "name": "vm bytecode compiler co19 tests",
+          "arguments": [
+            "-ndartkb-compile-linux-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 4
         },
         {
           "name": "vm interpreter tests",
@@ -479,7 +550,16 @@
             "-ndartkb-interpret-linux-${mode}-${arch}"
           ],
           "fileset": "vm-kernel",
-          "shards": 10
+          "shards": 4
+        },
+        {
+          "name": "vm interpreter co19 tests",
+          "arguments": [
+            "-ndartkb-interpret-linux-${mode}-${arch}",
+            "co19_2"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 4
         }
       ]
     },
@@ -887,7 +967,9 @@
             "corelib_2",
             "lib_2",
             "dartdevc_native"
-          ]
+          ],
+          "shards": 1,
+          "fileset": "dart2js"
         },
         {
           "name": "ddc kernel tests",
@@ -976,6 +1058,52 @@
     },
     {
       "builders": [
+        "ddk-linux-release-firefox"
+      ],
+      "meta": {
+        "description": "This configuration is used by the ddc builder group."
+      },
+      "steps": [
+        {
+          "name": "build dart",
+          "script": "tools/build.py",
+          "arguments": ["dart2js_bot", "dartdevc_test"]
+        },
+        {
+          "name": "ddk co19_2 tests",
+          "arguments": [
+            "-ndartdevk-checked-${system}-release-firefox",
+            "co19_2"
+          ],
+          "shards": 6,
+          "fileset": "dart2js"
+        },
+        {
+          "name": "ddc kernel tests",
+          "arguments": [
+            "-ndartdevk-checked-${system}-release-firefox",
+            "language_2",
+            "corelib_2",
+            "lib_2",
+            "dartdevc_native"
+          ]
+        },
+        {
+          "name": "ddc kernel modular tests",
+          "script": "out/ReleaseX64/dart-sdk/bin/dart",
+          "testRunner": true,
+          "arguments": [
+            "pkg/dev_compiler/test/modular_suite.dart",
+            "--configuration-name",
+            "dartdevk-${system}-release",
+            "--verbose",
+            "--use-sdk"
+          ]
+        }
+      ]
+    },
+    {
+      "builders": [
         "ddc-mac-release-chrome"
       ],
       "meta": {
@@ -995,7 +1123,9 @@
             "corelib_2",
             "lib_2",
             "dartdevc_native"
-          ]
+          ],
+          "shards": 1,
+          "fileset": "dart2js"
         },
         {
           "name": "ddc kernel tests",
@@ -2166,6 +2296,63 @@
           "testRunner": true
         }
       ]
+    },
+    {
+      "builders": [
+        "vm-kernel-precomp-mac-debug-simarm_x64",
+        "vm-kernel-precomp-mac-release-simarm_x64"
+      ],
+      "meta": {
+        "description": "This configuration runs tests for the simarm_x64 architecture."
+      },
+      "steps": [
+        {
+          "name": "configure dart for simarm_x64",
+          "script": "tools/gn.py",
+          "arguments": [
+            "--mode=${mode}",
+            "--arch=simarm_x64",
+            "--bytecode"
+          ]
+        },
+        {
+          "name": "configure dart for simarm",
+          "script": "tools/gn.py",
+          "arguments": [
+            "--mode=${mode}",
+            "--arch=simarm",
+            "--bytecode"
+          ]
+        },
+        {
+          "name": "build dart for simarm_x64",
+          "script": "tools/build.py",
+          "arguments": [
+            "--mode=${mode}",
+            "--arch=simarm_x64",
+            "gen_snapshot"
+          ]
+        },
+        {
+          "name": "build dart for simarm",
+          "script": "tools/build.py",
+          "arguments": [
+            "--mode=${mode}",
+            "--arch=simarm",
+            "dart_precompiled_runtime",
+            "vm_platform"
+          ]
+        },
+        {
+          "name": "vm tests",
+          "arguments": [
+            "-ndartkp-${system}-${mode}-simarm-crossword",
+            "--gen-snapshot=${build_root}/gen_snapshot"
+          ],
+          "fileset": "vm-kernel",
+          "shards": 10
+        }
+      ]
     }
   ]
 }
diff --git a/tools/bots/try_benchmarks.sh b/tools/bots/try_benchmarks.sh
index 5ec145e..e30eeb2 100755
--- a/tools/bots/try_benchmarks.sh
+++ b/tools/bots/try_benchmarks.sh
@@ -105,6 +105,7 @@
       pkg \
       runtime/bin \
       runtime/lib \
+      benchmarks \
       || (rm -f linux-ia32_profile.tar.gz; exit 1)
     strip -w \
       -K 'kDartVmSnapshotData' \
@@ -188,6 +189,7 @@
       pkg \
       runtime/bin \
       runtime/lib \
+      benchmarks \
       || (rm -f linux-ia32.tar.gz; exit 1)
   elif [ "$command" = linux-ia32-benchmark ]; then
     rm -rf tmp
@@ -219,6 +221,11 @@
     out/ReleaseIA32/run_vm_tests InitialRSS
     out/ReleaseIA32/run_vm_tests GenKernelKernelLoadKernel
     out/ReleaseIA32/run_vm_tests KernelServiceCompileAll
+    out/ReleaseIA32/dart --profile-period=10000 --packages=.packages benchmarks/Example/dart/Example.dart
+    out/ReleaseIA32/dart benchmarks/FfiBoringssl/dart/FfiBoringssl.dart
+    out/ReleaseIA32/dart benchmarks/FfiCall/dart/FfiCall.dart
+    out/ReleaseIA32/dart benchmarks/FfiMemory/dart/FfiMemory.dart
+    out/ReleaseIA32/dart benchmarks/FfiStruct/dart/FfiStruct.dart
     cd ..
     rm -rf tmp
   elif [ "$command" = linux-x64-build ] ||
@@ -264,6 +271,7 @@
       pkg \
       runtime/bin \
       runtime/lib \
+      benchmarks \
       || (rm -f linux-x64_profile.tar.gz; exit 1)
     strip -w \
       -K 'kDartVmSnapshotData' \
@@ -366,6 +374,7 @@
       pkg \
       runtime/bin \
       runtime/lib \
+      benchmarks \
       || (rm -f linux-x64.tar.gz; exit 1)
   elif [ "$command" = linux-x64-benchmark ] ||
        [ "$command" = linux-x64-bytecode-benchmark ]; then
@@ -403,6 +412,7 @@
     out/ReleaseX64/run_vm_tests InitialRSS
     out/ReleaseX64/run_vm_tests GenKernelKernelLoadKernel
     out/ReleaseX64/run_vm_tests KernelServiceCompileAll
+    out/ReleaseX64/dart --profile-period=10000 --packages=.packages benchmarks/Example/dart/Example.dart
     cd ..
     rm -rf tmp
   else
diff --git a/tools/bots/upload_debian_packages.py b/tools/bots/upload_debian_packages.py
index 04750c0..83a3056 100755
--- a/tools/bots/upload_debian_packages.py
+++ b/tools/bots/upload_debian_packages.py
@@ -4,50 +4,45 @@
 # for 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 os
 
-
 import bot
 import bot_utils
 
-
 utils = bot_utils.GetUtils()
 
-
 HOST_OS = utils.GuessOS()
 
 
 def ArchiveArtifacts(tarfile, builddir, channel):
-  namer = bot_utils.GCSNamer(channel=channel)
-  gsutil = bot_utils.GSUtil()
-  revision = utils.GetArchiveVersion()
-  # Archive the src tar to the src dir
-  remote_tarfile = '/'.join([namer.src_directory(revision),
-                             os.path.basename(tarfile)])
-  gsutil.upload(tarfile, remote_tarfile, public=True)
-  # 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)
-    # We expect a flat structure, not subdirectories
-    assert(os.path.isfile(full_path))
-    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)
+    namer = bot_utils.GCSNamer(channel=channel)
+    gsutil = bot_utils.GSUtil()
+    revision = utils.GetArchiveVersion()
+    # Archive the src tar to the src dir
+    remote_tarfile = '/'.join(
+        [namer.src_directory(revision),
+         os.path.basename(tarfile)])
+    gsutil.upload(tarfile, remote_tarfile, public=True)
+    # 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)
+        # We expect a flat structure, not subdirectories
+        assert (os.path.isfile(full_path))
+        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)
 
 
 if __name__ == '__main__':
-  bot_name, _ = bot.GetBotName()
-  channel = bot_utils.GetChannelFromName(bot_name)
-  if channel != bot_utils.Channel.BLEEDING_EDGE:
-    builddir = os.path.join(bot_utils.DART_DIR,
-                            utils.GetBuildDir(HOST_OS),
-                            'src_and_installation')
-    version = utils.GetVersion()
-    tarfilename = 'dart-%s.tar.gz' % version
-    tarfile = os.path.join(builddir, tarfilename)
-    ArchiveArtifacts(tarfile, builddir, channel)
-  else:
-    print 'Not uploading artifacts on bleeding edge'
+    bot_name, _ = bot.GetBotName()
+    channel = bot_utils.GetChannelFromName(bot_name)
+    if channel != bot_utils.Channel.BLEEDING_EDGE:
+        builddir = os.path.join(bot_utils.DART_DIR, utils.GetBuildDir(HOST_OS),
+                                'src_and_installation')
+        version = utils.GetVersion()
+        tarfilename = 'dart-%s.tar.gz' % version
+        tarfile = os.path.join(builddir, tarfilename)
+        ArchiveArtifacts(tarfile, builddir, channel)
+    else:
+        print 'Not uploading artifacts on bleeding edge'
diff --git a/tools/bots/version_checker.py b/tools/bots/version_checker.py
index d61668e..6c72aaf 100755
--- a/tools/bots/version_checker.py
+++ b/tools/bots/version_checker.py
@@ -15,71 +15,76 @@
 
 VERSION_BUILDER = r'versionchecker'
 
+
 def VersionConfig(name, is_buildbot):
-  version_pattern = re.match(VERSION_BUILDER, name)
-  if not version_pattern:
-      return None
-  # We don't really use this, but we create it anyway to use the standard
-  # bot execution model.
-  return bot.BuildInfo('none', 'none', 'release', 'linux')
+    version_pattern = re.match(VERSION_BUILDER, name)
+    if not version_pattern:
+        return None
+    # We don't really use this, but we create it anyway to use the standard
+    # bot execution model.
+    return bot.BuildInfo('none', 'none', 'release', 'linux')
+
 
 def GetLatestVersionFromGCS(channel):
-  namer = bot_utils.GCSNamer(channel=channel)
-  gsutil = bot_utils.GSUtil()
-  gcs_version_path = namer.version_filepath('latest')
-  print 'Getting latest version from: %s' % gcs_version_path
-  version_json = gsutil.cat(gcs_version_path)
-  version_map = json.loads(version_json)
-  return version_map['version']
+    namer = bot_utils.GCSNamer(channel=channel)
+    gsutil = bot_utils.GSUtil()
+    gcs_version_path = namer.version_filepath('latest')
+    print 'Getting latest version from: %s' % gcs_version_path
+    version_json = gsutil.cat(gcs_version_path)
+    version_map = json.loads(version_json)
+    return version_map['version']
+
 
 def ValidateChannelVersion(latest_version, channel):
-  repo_version = utils.ReadVersionFile()
-  assert repo_version.channel == channel
-  if channel == bot_utils.Channel.STABLE:
-    assert int(repo_version.prerelease) == 0
-    assert int(repo_version.prerelease_patch) == 0
+    repo_version = utils.ReadVersionFile()
+    assert repo_version.channel == channel
+    if channel == bot_utils.Channel.STABLE:
+        assert int(repo_version.prerelease) == 0
+        assert int(repo_version.prerelease_patch) == 0
 
-  version_re = r'(\d+)\.(\d+)\.(\d+)(-dev\.(\d+)\.(\d+))?'
+    version_re = r'(\d+)\.(\d+)\.(\d+)(-dev\.(\d+)\.(\d+))?'
 
-  latest_match = re.match(version_re, latest_version)
-  latest_major = int(latest_match.group(1))
-  latest_minor = int(latest_match.group(2))
-  latest_patch = int(latest_match.group(3))
-  # We don't use these on stable.
-  latest_prerelease = int(latest_match.group(5) or 0)
-  latest_prerelease_patch = int(latest_match.group(6) or 0)
+    latest_match = re.match(version_re, latest_version)
+    latest_major = int(latest_match.group(1))
+    latest_minor = int(latest_match.group(2))
+    latest_patch = int(latest_match.group(3))
+    # We don't use these on stable.
+    latest_prerelease = int(latest_match.group(5) or 0)
+    latest_prerelease_patch = int(latest_match.group(6) or 0)
 
-  if latest_major < int(repo_version.major):
-    return True
-  if latest_minor < int(repo_version.minor):
-    return True
-  if latest_patch < int(repo_version.patch):
-    return True
-  if latest_prerelease < int(repo_version.prerelease):
-    return True
-  if latest_prerelease_patch < int(repo_version.prerelease_patch):
-    return True
-  return False
+    if latest_major < int(repo_version.major):
+        return True
+    if latest_minor < int(repo_version.minor):
+        return True
+    if latest_patch < int(repo_version.patch):
+        return True
+    if latest_prerelease < int(repo_version.prerelease):
+        return True
+    if latest_prerelease_patch < int(repo_version.prerelease_patch):
+        return True
+    return False
+
 
 def VersionSteps(build_info):
-  with bot.BuildStep('Version file sanity checking'):
-    bot_name, _ = bot.GetBotName()
-    channel = bot_utils.GetChannelFromName(bot_name)
-    if channel == bot_utils.Channel.BLEEDING_EDGE:
-      print 'No sanity checking on bleeding edge'
-    else:
-      assert (channel == bot_utils.Channel.STABLE or
-              channel == bot_utils.Channel.DEV)
-      latest_version = GetLatestVersionFromGCS(channel)
-      version = utils.GetVersion()
-      print 'Latests version on GCS: %s' % latest_version
-      print 'Version currently building: %s' % version
-      if not ValidateChannelVersion(latest_version, channel):
-        print "Validation failed"
-        sys.exit(1)
-      else:
-        print 'Version file changed, sanity checks passed'
+    with bot.BuildStep('Version file sanity checking'):
+        bot_name, _ = bot.GetBotName()
+        channel = bot_utils.GetChannelFromName(bot_name)
+        if channel == bot_utils.Channel.BLEEDING_EDGE:
+            print 'No sanity checking on bleeding edge'
+        else:
+            assert (channel == bot_utils.Channel.STABLE or
+                    channel == bot_utils.Channel.DEV)
+            latest_version = GetLatestVersionFromGCS(channel)
+            version = utils.GetVersion()
+            print 'Latests version on GCS: %s' % latest_version
+            print 'Version currently building: %s' % version
+            if not ValidateChannelVersion(latest_version, channel):
+                print "Validation failed"
+                sys.exit(1)
+            else:
+                print 'Version file changed, sanity checks passed'
+
 
 if __name__ == '__main__':
-  # We pass in None for build_step to avoid building.
-  bot.RunBot(VersionConfig, VersionSteps, build_step=None)
+    # We pass in None for build_step to avoid building.
+    bot.RunBot(VersionConfig, VersionSteps, build_step=None)
diff --git a/tools/build.py b/tools/build.py
index 1782f2b..904c6560 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -16,10 +16,11 @@
 HOST_CPUS = utils.GuessCpus()
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
-AVAILABLE_ARCHS = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
-    'simarmv5te', 'armv5te', 'simarm64', 'arm64',
-    'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64', 'simarm_x64']
-
+AVAILABLE_ARCHS = [
+    'ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6', 'simarmv5te',
+    'armv5te', 'simarm64', 'arm64', 'simdbc', 'simdbc64', 'armsimdbc',
+    'armsimdbc64', 'simarm_x64'
+]
 
 usage = """\
 usage: %%prog [options] [targets]
@@ -29,315 +30,337 @@
 
 
 def BuildOptions():
-  result = optparse.OptionParser(usage=usage)
-  result.add_option("-a", "--arch",
-      help='Target architectures (comma-separated).',
-      metavar='[all,' + ','.join(AVAILABLE_ARCHS) + ']',
-      default=utils.GuessArchitecture())
-  result.add_option("-b", "--bytecode",
-      help='Build with the kernel bytecode interpreter. DEPRECATED.',
-      default=False,
-      action='store_true')
-  result.add_option("-j",
-      type=int,
-      help='Ninja -j option for Goma builds.',
-      default=1000)
-  result.add_option("-l",
-      type=int,
-      help='Ninja -l option for Goma builds.',
-      default=64)
-  result.add_option("-m", "--mode",
-      help='Build variants (comma-separated).',
-      metavar='[all,debug,release,product]',
-      default='debug')
-  result.add_option("--no-start-goma",
-      help="Don't try to start goma",
-      default=False,
-      action='store_true')
-  result.add_option("--os",
-      help='Target OSs (comma-separated).',
-      metavar='[all,host,android]',
-      default='host')
-  result.add_option("-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  return result
+    result = optparse.OptionParser(usage=usage)
+    result.add_option(
+        "-a",
+        "--arch",
+        help='Target architectures (comma-separated).',
+        metavar='[all,' + ','.join(AVAILABLE_ARCHS) + ']',
+        default=utils.GuessArchitecture())
+    result.add_option(
+        "-b",
+        "--bytecode",
+        help='Build with the kernel bytecode interpreter. DEPRECATED.',
+        default=False,
+        action='store_true')
+    result.add_option(
+        "-j", type=int, help='Ninja -j option for Goma builds.', default=1000)
+    result.add_option(
+        "-l", type=int, help='Ninja -l option for Goma builds.', default=64)
+    result.add_option(
+        "-m",
+        "--mode",
+        help='Build variants (comma-separated).',
+        metavar='[all,debug,release,product]',
+        default='debug')
+    result.add_option(
+        "--no-start-goma",
+        help="Don't try to start goma",
+        default=False,
+        action='store_true')
+    result.add_option(
+        "--os",
+        help='Target OSs (comma-separated).',
+        metavar='[all,host,android]',
+        default='host')
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    return result
 
 
 def ProcessOsOption(os_name):
-  if os_name == 'host':
-    return HOST_OS
-  return os_name
+    if os_name == 'host':
+        return HOST_OS
+    return os_name
 
 
 def ProcessOptions(options, args):
-  if options.arch == 'all':
-    options.arch = 'ia32,x64,simarm,simarm64,simdbc64'
-  if options.mode == 'all':
-    options.mode = 'debug,release,product'
-  if options.os == 'all':
-    options.os = 'host,android'
-  options.mode = options.mode.split(',')
-  options.arch = options.arch.split(',')
-  options.os = options.os.split(',')
-  for mode in options.mode:
-    if not mode in ['debug', 'release', 'product']:
-      print ("Unknown mode %s" % mode)
-      return False
-  for arch in options.arch:
-    if not arch in AVAILABLE_ARCHS:
-      print ("Unknown arch %s" % arch)
-      return False
-  options.os = [ProcessOsOption(os_name) for os_name in options.os]
-  for os_name in options.os:
-    if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']:
-      print ("Unknown os %s" % os_name)
-      return False
-    if os_name != HOST_OS:
-      if os_name != 'android':
-        print ("Unsupported target os %s" % os_name)
-        return False
-      if not HOST_OS in ['linux', 'macos']:
-        print ("Cross-compilation to %s is not supported on host os %s."
-               % (os_name, HOST_OS))
-        return False
-      if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64',
-                      'simdbc', 'simdbc64']:
-        print ("Cross-compilation to %s is not supported for architecture %s."
-               % (os_name, arch))
-        return False
-      # We have not yet tweaked the v8 dart build to work with the Android
-      # NDK/SDK, so don't try to build it.
-      if not args:
-        print ("For android builds you must specify a target, such as 'runtime'.")
-        return False
-  return True
+    if options.arch == 'all':
+        options.arch = 'ia32,x64,simarm,simarm64,simdbc64'
+    if options.mode == 'all':
+        options.mode = 'debug,release,product'
+    if options.os == 'all':
+        options.os = 'host,android'
+    options.mode = options.mode.split(',')
+    options.arch = options.arch.split(',')
+    options.os = options.os.split(',')
+    for mode in options.mode:
+        if not mode in ['debug', 'release', 'product']:
+            print("Unknown mode %s" % mode)
+            return False
+    for arch in options.arch:
+        if not arch in AVAILABLE_ARCHS:
+            print("Unknown arch %s" % arch)
+            return False
+    options.os = [ProcessOsOption(os_name) for os_name in options.os]
+    for os_name in options.os:
+        if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']:
+            print("Unknown os %s" % os_name)
+            return False
+        if os_name != HOST_OS:
+            if os_name != 'android':
+                print("Unsupported target os %s" % os_name)
+                return False
+            if not HOST_OS in ['linux', 'macos']:
+                print("Cross-compilation to %s is not supported on host os %s."
+                      % (os_name, HOST_OS))
+                return False
+            if not arch in [
+                    'ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'simdbc',
+                    'simdbc64'
+            ]:
+                print(
+                    "Cross-compilation to %s is not supported for architecture %s."
+                    % (os_name, arch))
+                return False
+            # We have not yet tweaked the v8 dart build to work with the Android
+            # NDK/SDK, so don't try to build it.
+            if not args:
+                print(
+                    "For android builds you must specify a target, such as 'runtime'."
+                )
+                return False
+    return True
 
 
 def NotifyBuildDone(build_config, success, start):
-  if not success:
-    print ("BUILD FAILED")
+    if not success:
+        print("BUILD FAILED")
 
-  sys.stdout.flush()
+    sys.stdout.flush()
 
-  # Display a notification if build time exceeded DART_BUILD_NOTIFICATION_DELAY.
-  notification_delay = float(
-    os.getenv('DART_BUILD_NOTIFICATION_DELAY', sys.float_info.max))
-  if (time.time() - start) < notification_delay:
-    return
+    # Display a notification if build time exceeded DART_BUILD_NOTIFICATION_DELAY.
+    notification_delay = float(
+        os.getenv('DART_BUILD_NOTIFICATION_DELAY', sys.float_info.max))
+    if (time.time() - start) < notification_delay:
+        return
 
-  if success:
-    message = 'Build succeeded.'
-  else:
-    message = 'Build failed.'
-  title = build_config
-
-  command = None
-  if HOST_OS == 'macos':
-    # Use AppleScript to display a UI non-modal notification.
-    script = 'display notification  "%s" with title "%s" sound name "Glass"' % (
-      message, title)
-    command = "osascript -e '%s' &" % script
-  elif HOST_OS == 'linux':
     if success:
-      icon = 'dialog-information'
+        message = 'Build succeeded.'
     else:
-      icon = 'dialog-error'
-    command = "notify-send -i '%s' '%s' '%s' &" % (icon, message, title)
-  elif HOST_OS == 'win32':
-    if success:
-      icon = 'info'
-    else:
-      icon = 'error'
-    command = ("powershell -command \""
-      "[reflection.assembly]::loadwithpartialname('System.Windows.Forms')"
-        "| Out-Null;"
-      "[reflection.assembly]::loadwithpartialname('System.Drawing')"
-        "| Out-Null;"
-      "$n = new-object system.windows.forms.notifyicon;"
-      "$n.icon = [system.drawing.systemicons]::information;"
-      "$n.visible = $true;"
-      "$n.showballoontip(%d, '%s', '%s', "
-      "[system.windows.forms.tooltipicon]::%s);\"") % (
-        5000, # Notification stays on for this many milliseconds
-        message, title, icon)
+        message = 'Build failed.'
+    title = build_config
 
-  if command:
-    # Ignore return code, if this command fails, it doesn't matter.
-    os.system(command)
+    command = None
+    if HOST_OS == 'macos':
+        # Use AppleScript to display a UI non-modal notification.
+        script = 'display notification  "%s" with title "%s" sound name "Glass"' % (
+            message, title)
+        command = "osascript -e '%s' &" % script
+    elif HOST_OS == 'linux':
+        if success:
+            icon = 'dialog-information'
+        else:
+            icon = 'dialog-error'
+        command = "notify-send -i '%s' '%s' '%s' &" % (icon, message, title)
+    elif HOST_OS == 'win32':
+        if success:
+            icon = 'info'
+        else:
+            icon = 'error'
+        command = (
+            "powershell -command \""
+            "[reflection.assembly]::loadwithpartialname('System.Windows.Forms')"
+            "| Out-Null;"
+            "[reflection.assembly]::loadwithpartialname('System.Drawing')"
+            "| Out-Null;"
+            "$n = new-object system.windows.forms.notifyicon;"
+            "$n.icon = [system.drawing.systemicons]::information;"
+            "$n.visible = $true;"
+            "$n.showballoontip(%d, '%s', '%s', "
+            "[system.windows.forms.tooltipicon]::%s);\"") % (
+                5000,  # Notification stays on for this many milliseconds
+                message,
+                title,
+                icon)
+
+    if command:
+        # Ignore return code, if this command fails, it doesn't matter.
+        os.system(command)
 
 
 def GenerateBuildfilesIfNeeded():
-  if os.path.exists(utils.GetBuildDir(HOST_OS)):
+    if os.path.exists(utils.GetBuildDir(HOST_OS)):
+        return True
+    command = [
+        'python',
+        os.path.join(DART_ROOT, 'tools', 'generate_buildfiles.py')
+    ]
+    print("Running " + ' '.join(command))
+    process = subprocess.Popen(command)
+    process.wait()
+    if process.returncode != 0:
+        print("Tried to generate missing buildfiles, but failed. "
+              "Try running manually:\n\t$ " + ' '.join(command))
+        return False
     return True
-  command = [
-    'python',
-    os.path.join(DART_ROOT, 'tools', 'generate_buildfiles.py')
-  ]
-  print ("Running " + ' '.join(command))
-  process = subprocess.Popen(command)
-  process.wait()
-  if process.returncode != 0:
-    print ("Tried to generate missing buildfiles, but failed. "
-           "Try running manually:\n\t$ " + ' '.join(command))
-    return False
-  return True
 
 
 def RunGNIfNeeded(out_dir, target_os, mode, arch):
-  if os.path.isfile(os.path.join(out_dir, 'args.gn')):
-    return
-  gn_os = 'host' if target_os == HOST_OS else target_os
-  gn_command = [
-    'python',
-    os.path.join(DART_ROOT, 'tools', 'gn.py'),
-    '-m', mode,
-    '-a', arch,
-    '--os', gn_os,
-    '-v',
-  ]
-  process = subprocess.Popen(gn_command)
-  process.wait()
-  if process.returncode != 0:
-    print ("Tried to run GN, but it failed. Try running it manually: \n\t$ " +
-           ' '.join(gn_command))
+    if os.path.isfile(os.path.join(out_dir, 'args.gn')):
+        return
+    gn_os = 'host' if target_os == HOST_OS else target_os
+    gn_command = [
+        'python',
+        os.path.join(DART_ROOT, 'tools', 'gn.py'),
+        '-m',
+        mode,
+        '-a',
+        arch,
+        '--os',
+        gn_os,
+        '-v',
+    ]
+    process = subprocess.Popen(gn_command)
+    process.wait()
+    if process.returncode != 0:
+        print("Tried to run GN, but it failed. Try running it manually: \n\t$ "
+              + ' '.join(gn_command))
 
 
 def UseGoma(out_dir):
-  args_gn = os.path.join(out_dir, 'args.gn')
-  return 'use_goma = true' in open(args_gn, 'r').read()
+    args_gn = os.path.join(out_dir, 'args.gn')
+    return 'use_goma = true' in open(args_gn, 'r').read()
 
 
 # Try to start goma, but don't bail out if we can't. Instead print an error
 # message, and let the build fail with its own error messages as well.
 goma_started = False
+
+
 def EnsureGomaStarted(out_dir):
-  global goma_started
-  if goma_started:
+    global goma_started
+    if goma_started:
+        return True
+    args_gn_path = os.path.join(out_dir, 'args.gn')
+    goma_dir = None
+    with open(args_gn_path, 'r') as fp:
+        for line in fp:
+            if 'goma_dir' in line:
+                words = line.split()
+                goma_dir = words[2][1:-1]  # goma_dir = "/path/to/goma"
+    if not goma_dir:
+        print('Could not find goma for ' + out_dir)
+        return False
+    if not os.path.exists(goma_dir) or not os.path.isdir(goma_dir):
+        print('Could not find goma at ' + goma_dir)
+        return False
+    goma_ctl = os.path.join(goma_dir, 'goma_ctl.py')
+    goma_ctl_command = [
+        'python',
+        goma_ctl,
+        'ensure_start',
+    ]
+    process = subprocess.Popen(goma_ctl_command)
+    process.wait()
+    if process.returncode != 0:
+        print(
+            "Tried to run goma_ctl.py, but it failed. Try running it manually: "
+            + "\n\t" + ' '.join(goma_ctl_command))
+        return False
+    goma_started = True
     return True
-  args_gn_path = os.path.join(out_dir, 'args.gn')
-  goma_dir = None
-  with open(args_gn_path, 'r') as fp:
-    for line in fp:
-      if 'goma_dir' in line:
-        words = line.split()
-        goma_dir = words[2][1:-1]  # goma_dir = "/path/to/goma"
-  if not goma_dir:
-    print ('Could not find goma for ' + out_dir)
-    return False
-  if not os.path.exists(goma_dir) or not os.path.isdir(goma_dir):
-    print ('Could not find goma at ' + goma_dir)
-    return False
-  goma_ctl = os.path.join(goma_dir, 'goma_ctl.py')
-  goma_ctl_command = [
-    'python',
-    goma_ctl,
-    'ensure_start',
-  ]
-  process = subprocess.Popen(goma_ctl_command)
-  process.wait()
-  if process.returncode != 0:
-    print ("Tried to run goma_ctl.py, but it failed. Try running it manually: "
-           + "\n\t" + ' '.join(goma_ctl_command))
-    return False
-  goma_started = True
-  return True
 
 
 # Returns a tuple (build_config, command to run, whether goma is used)
 def BuildOneConfig(options, targets, target_os, mode, arch):
-  build_config = utils.GetBuildConf(mode, arch, target_os)
-  out_dir = utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
-  using_goma = False
-  # TODO(zra): Remove auto-run of gn, replace with prompt for user to run
-  # gn.py manually.
-  RunGNIfNeeded(out_dir, target_os, mode, arch)
-  command = ['ninja', '-C', out_dir]
-  if options.verbose:
-    command += ['-v']
-  if UseGoma(out_dir):
-    if options.no_start_goma or EnsureGomaStarted(out_dir):
-      using_goma = True
-      command += [('-j%s' % str(options.j))]
-      command += [('-l%s' % str(options.l))]
-    else:
-      # If we couldn't ensure that goma is started, let the build start, but
-      # slowly so we can see any helpful error messages that pop out.
-      command += ['-j1']
-  command += targets
-  return (build_config, command, using_goma)
+    build_config = utils.GetBuildConf(mode, arch, target_os)
+    out_dir = utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
+    using_goma = False
+    # TODO(zra): Remove auto-run of gn, replace with prompt for user to run
+    # gn.py manually.
+    RunGNIfNeeded(out_dir, target_os, mode, arch)
+    command = ['ninja', '-C', out_dir]
+    if options.verbose:
+        command += ['-v']
+    if UseGoma(out_dir):
+        if options.no_start_goma or EnsureGomaStarted(out_dir):
+            using_goma = True
+            command += [('-j%s' % str(options.j))]
+            command += [('-l%s' % str(options.l))]
+        else:
+            # If we couldn't ensure that goma is started, let the build start, but
+            # slowly so we can see any helpful error messages that pop out.
+            command += ['-j1']
+    command += targets
+    return (build_config, command, using_goma)
 
 
 def RunOneBuildCommand(build_config, args):
-  start_time = time.time()
-  print (' '.join(args))
-  process = subprocess.Popen(args, stdin=None)
-  process.wait()
-  if process.returncode != 0:
-    NotifyBuildDone(build_config, success=False, start=start_time)
-    return 1
-  else:
-    NotifyBuildDone(build_config, success=True, start=start_time)
+    start_time = time.time()
+    print(' '.join(args))
+    process = subprocess.Popen(args, stdin=None)
+    process.wait()
+    if process.returncode != 0:
+        NotifyBuildDone(build_config, success=False, start=start_time)
+        return 1
+    else:
+        NotifyBuildDone(build_config, success=True, start=start_time)
 
-  return 0
+    return 0
 
 
 def RunOneGomaBuildCommand(args):
-  try:
-    print (' '.join(args))
-    process = subprocess.Popen(args, stdin=None)
-    process.wait()
-    print (' '.join(args) + " done.")
-    return process.returncode
-  except KeyboardInterrupt:
-    return 1
+    try:
+        print(' '.join(args))
+        process = subprocess.Popen(args, stdin=None)
+        process.wait()
+        print(' '.join(args) + " done.")
+        return process.returncode
+    except KeyboardInterrupt:
+        return 1
 
 
 def Main():
-  starttime = time.time()
-  # Parse the options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if not ProcessOptions(options, args):
-    parser.print_help()
-    return 1
-  # Determine which targets to build. By default we build the "all" target.
-  if len(args) == 0:
-    targets = ['all']
-  else:
-    targets = args
+    starttime = time.time()
+    # Parse the options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if not ProcessOptions(options, args):
+        parser.print_help()
+        return 1
+    # Determine which targets to build. By default we build the "all" target.
+    if len(args) == 0:
+        targets = ['all']
+    else:
+        targets = args
 
-  if not GenerateBuildfilesIfNeeded():
-    return 1
+    if not GenerateBuildfilesIfNeeded():
+        return 1
 
-  # Build all targets for each requested configuration.
-  configs = []
-  for target_os in options.os:
-    for mode in options.mode:
-      for arch in options.arch:
-        configs.append(BuildOneConfig(options, targets, target_os, mode, arch))
+    # Build all targets for each requested configuration.
+    configs = []
+    for target_os in options.os:
+        for mode in options.mode:
+            for arch in options.arch:
+                configs.append(
+                    BuildOneConfig(options, targets, target_os, mode, arch))
 
-  # Build regular configs.
-  goma_builds = []
-  for (build_config, args, goma) in configs:
-    if args is None:
-      return 1
-    if goma:
-      goma_builds.append(args)
-    elif RunOneBuildCommand(build_config, args) != 0:
-      return 1
+    # Build regular configs.
+    goma_builds = []
+    for (build_config, args, goma) in configs:
+        if args is None:
+            return 1
+        if goma:
+            goma_builds.append(args)
+        elif RunOneBuildCommand(build_config, args) != 0:
+            return 1
 
-  # Run goma builds in parallel.
-  pool = multiprocessing.Pool(multiprocessing.cpu_count())
-  results = pool.map(RunOneGomaBuildCommand, goma_builds, chunksize=1)
-  for r in results:
-    if r != 0:
-      return 1
+    # Run goma builds in parallel.
+    pool = multiprocessing.Pool(multiprocessing.cpu_count())
+    results = pool.map(RunOneGomaBuildCommand, goma_builds, chunksize=1)
+    for r in results:
+        if r != 0:
+            return 1
 
-  endtime = time.time()
-  print ("The build took %.3f seconds" % (endtime - starttime))
-  return 0
+    endtime = time.time()
+    print("The build took %.3f seconds" % (endtime - starttime))
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/buildtools/update.py b/tools/buildtools/update.py
index 936e729..a398225 100755
--- a/tools/buildtools/update.py
+++ b/tools/buildtools/update.py
@@ -2,7 +2,6 @@
 # Copyright 2017 The Dart project authors. All rights reserved.
 # Use of this source code is governed by a BSD-style license that can be
 # found in the LICENSE file.
-
 """Pulls down tools required to build Dart."""
 
 import errno
@@ -23,76 +22,67 @@
 
 
 def UpdateClangFormatOnWindows():
-  sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'clang-format.exe.sha1')
-  output_dir = os.path.join(BUILDTOOLS, 'win', 'clang-format.exe')
-  downloader_script = os.path.join(
-      DEPOT_PATH, 'download_from_google_storage.py')
-  download_cmd = [
-    'python',
-    downloader_script,
-    '--no_auth',
-    '--no_resume',
-    '--quiet',
-    '--platform=win',
-    '--bucket',
-    'chromium-clang-format',
-    '-s',
-    sha1_file,
-    '-o',
-    output_dir
-  ]
-  return subprocess.call(download_cmd)
+    sha1_file = os.path.join(TOOLS_BUILDTOOLS, 'win', 'clang-format.exe.sha1')
+    output_dir = os.path.join(BUILDTOOLS, 'win', 'clang-format.exe')
+    downloader_script = os.path.join(DEPOT_PATH,
+                                     'download_from_google_storage.py')
+    download_cmd = [
+        'python', downloader_script, '--no_auth', '--no_resume', '--quiet',
+        '--platform=win', '--bucket', 'chromium-clang-format', '-s', sha1_file,
+        '-o', output_dir
+    ]
+    return subprocess.call(download_cmd)
 
 
 def CreateSymlink(symlink, link_name):
-  try:
-    os.symlink(symlink, link_name)
-  except OSError, e:
-    if e.errno == errno.EEXIST:
-      os.remove(link_name)
-      os.symlink(symlink, link_name)
-    else:
-      raise e
+    try:
+        os.symlink(symlink, link_name)
+    except OSError, e:
+        if e.errno == errno.EEXIST:
+            os.remove(link_name)
+            os.symlink(symlink, link_name)
+        else:
+            raise e
 
 
 # On Mac and Linux we symlink clang-format and gn to the place where
 # 'git cl format' expects them to be.
 def LinksForGitCLFormat():
-  if sys.platform == 'darwin':
-    platform = 'darwin'
-    tools = 'mac'
-    toolchain = 'mac-x64'
-  elif sys.platform.startswith('linux'):
-    platform = 'linux'
-    tools = 'linux64'
-    toolchain = 'linux-x64'
-  else:
-    print 'Unknown platform: ' + sys.platform
-    return 1
+    if sys.platform == 'darwin':
+        platform = 'darwin'
+        tools = 'mac'
+        toolchain = 'mac-x64'
+    elif sys.platform.startswith('linux'):
+        platform = 'linux'
+        tools = 'linux64'
+        toolchain = 'linux-x64'
+    else:
+        print 'Unknown platform: ' + sys.platform
+        return 1
 
-  clang_format = os.path.join(
-      BUILDTOOLS, toolchain, 'clang', 'bin', 'clang-format')
-  gn = os.path.join(BUILDTOOLS, 'gn')
-  dest_dir = os.path.join(BUILDTOOLS, tools)
-  if not os.path.exists(dest_dir):
-    os.makedirs(dest_dir)
-  clang_format_dest = os.path.join(dest_dir, 'clang-format')
-  gn_dest = os.path.join(dest_dir, 'gn')
-  CreateSymlink(clang_format, clang_format_dest)
-  CreateSymlink(gn, gn_dest)
-  return 0
+    clang_format = os.path.join(BUILDTOOLS, toolchain, 'clang', 'bin',
+                                'clang-format')
+    gn = os.path.join(BUILDTOOLS, 'gn')
+    dest_dir = os.path.join(BUILDTOOLS, tools)
+    if not os.path.exists(dest_dir):
+        os.makedirs(dest_dir)
+    clang_format_dest = os.path.join(dest_dir, 'clang-format')
+    gn_dest = os.path.join(dest_dir, 'gn')
+    CreateSymlink(clang_format, clang_format_dest)
+    CreateSymlink(gn, gn_dest)
+    return 0
 
 
 def main(argv):
-  arch_id = platform.machine()
-  # Don't try to download binaries if we're on an arm machine.
-  if arch_id.startswith('arm') or arch_id.startswith('aarch64'):
-    print('Not downloading buildtools binaries for ' + arch_id)
-    return 0
-  if sys.platform.startswith('win'):
-    return UpdateClangFormatOnWindows()
-  return LinksForGitCLFormat()
+    arch_id = platform.machine()
+    # Don't try to download binaries if we're on an arm machine.
+    if arch_id.startswith('arm') or arch_id.startswith('aarch64'):
+        print('Not downloading buildtools binaries for ' + arch_id)
+        return 0
+    if sys.platform.startswith('win'):
+        return UpdateClangFormatOnWindows()
+    return LinksForGitCLFormat()
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/clean_output_directory.py b/tools/clean_output_directory.py
index f0f0426..e7233b0 100755
--- a/tools/clean_output_directory.py
+++ b/tools/clean_output_directory.py
@@ -11,17 +11,19 @@
 import subprocess
 import utils
 
+
 def Main():
-  build_root = utils.GetBuildRoot(utils.GuessOS())
-  print 'Deleting %s' % build_root
-  if sys.platform != 'win32':
-    shutil.rmtree(build_root, ignore_errors=True)
-  else:
-    # Intentionally ignore return value since a directory might be in use.
-    subprocess.call(['rmdir', '/Q', '/S', build_root],
-                    env=os.environ.copy(),
-                    shell=True)
-  return 0
+    build_root = utils.GetBuildRoot(utils.GuessOS())
+    print 'Deleting %s' % build_root
+    if sys.platform != 'win32':
+        shutil.rmtree(build_root, ignore_errors=True)
+    else:
+        # Intentionally ignore return value since a directory might be in use.
+        subprocess.call(['rmdir', '/Q', '/S', build_root],
+                        env=os.environ.copy(),
+                        shell=True)
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/copy_dart.py b/tools/copy_dart.py
index 5bd464c..2bfb582 100755
--- a/tools/copy_dart.py
+++ b/tools/copy_dart.py
@@ -11,129 +11,135 @@
 from os.path import basename, dirname, exists, isabs, join
 from glob import glob
 
-re_directive = re.compile(
-    r'^(library|import|part|native|resource)\s+(.*);$')
-re_comment = re.compile(
-    r'^(///|/\*| \*).*$')
+re_directive = re.compile(r'^(library|import|part|native|resource)\s+(.*);$')
+re_comment = re.compile(r'^(///|/\*| \*).*$')
+
 
 class Library(object):
-  def __init__(self, name, imports, sources, natives, code, comment):
-    self.name = name
-    self.imports = imports
-    self.sources = sources
-    self.natives = natives
-    self.code = code
-    self.comment = comment
+
+    def __init__(self, name, imports, sources, natives, code, comment):
+        self.name = name
+        self.imports = imports
+        self.sources = sources
+        self.natives = natives
+        self.code = code
+        self.comment = comment
+
 
 def parseLibrary(library):
-  """ Parses a .dart source file that is the root of a library, and returns
+    """ Parses a .dart source file that is the root of a library, and returns
       information about it: the name, the imports, included sources, and any
       code in the file.
   """
-  libraryname = None
-  imports = []
-  sources = []
-  natives = []
-  inlinecode = []
-  librarycomment = []
-  if exists(library):
-    # TODO(sigmund): stop parsing when import/source
-    for line in fileinput.input(library):
-      match = re_directive.match(line)
-      if match:
-        directive = match.group(1)
-        if directive == 'library':
-          assert libraryname is None
-          libraryname = match.group(2)
-        elif directive == 'part':
-          suffix = match.group(2)
-          if not suffix.startswith('of '):
-            sources.append(match.group(2).strip('"\''))
-        elif directive == 'import':
-          imports.append(match.group(2))
-        else:
-          raise Exception('unknown directive %s in %s' % (directive, line))
-      else:
-        # Check for library comment.
-        if not libraryname and re_comment.match(line):
-          librarycomment.append(line)
-        else:
-          inlinecode.append(line)
-    fileinput.close()
-  return Library(libraryname, imports, sources, natives, inlinecode,
-                 librarycomment)
+    libraryname = None
+    imports = []
+    sources = []
+    natives = []
+    inlinecode = []
+    librarycomment = []
+    if exists(library):
+        # TODO(sigmund): stop parsing when import/source
+        for line in fileinput.input(library):
+            match = re_directive.match(line)
+            if match:
+                directive = match.group(1)
+                if directive == 'library':
+                    assert libraryname is None
+                    libraryname = match.group(2)
+                elif directive == 'part':
+                    suffix = match.group(2)
+                    if not suffix.startswith('of '):
+                        sources.append(match.group(2).strip('"\''))
+                elif directive == 'import':
+                    imports.append(match.group(2))
+                else:
+                    raise Exception(
+                        'unknown directive %s in %s' % (directive, line))
+            else:
+                # Check for library comment.
+                if not libraryname and re_comment.match(line):
+                    librarycomment.append(line)
+                else:
+                    inlinecode.append(line)
+        fileinput.close()
+    return Library(libraryname, imports, sources, natives, inlinecode,
+                   librarycomment)
+
 
 def normjoin(*args):
-  return os.path.normpath(os.path.join(*args))
+    return os.path.normpath(os.path.join(*args))
+
 
 def mergefiles(srcs, dstfile):
-  for src in srcs:
-    with open(src, 'r') as s:
-      for line in s:
-        if not line.startswith('part of '):
-          dstfile.write(line)
-
-def main(outdir = None, *inputs):
-  if not outdir or not inputs:
-    print "Usage: %s OUTDIR INPUTS" % sys.argv[0]
-    print "  OUTDIR is the war directory to copy to"
-    print "  INPUTS is a list of files or patterns used to specify the input"
-    print "   .dart files"
-    print "This script should be run from the client root directory."
-    print "Files will be merged and copied to: OUTDIR/relative-path-of-file,"
-    print "except for dart files with absolute paths, which will be copied to"
-    print " OUTDIR/absolute-path-as-directories"
-    return 1
-
-  entry_libraries = []
-  for i in inputs:
-    entry_libraries.extend(glob(i))
-
-  for entrypoint in entry_libraries:
-    # Get the transitive set of dart files this entrypoint depends on, merging
-    # each library along the way.
-    worklist = [os.path.normpath(entrypoint)]
-    seen = set()
-    while len(worklist) > 0:
-      lib = worklist.pop()
-      if lib in seen:
-        continue
-
-      seen.add(lib)
-
-      if (dirname(dirname(lib)).endswith('dom/generated/src')
-          or dirname(lib).endswith('dom/src')):
-        continue
-
-      library = parseLibrary(lib)
-
-      # Ensure output directory exists
-      outpath = join(outdir, lib[1:] if isabs(lib) else lib)
-      dstpath = dirname(outpath)
-      if not exists(dstpath):
-        os.makedirs(dstpath)
+    for src in srcs:
+        with open(src, 'r') as s:
+            for line in s:
+                if not line.startswith('part of '):
+                    dstfile.write(line)
 
 
-      # Create file containing all imports, and inlining all sources
-      with open(outpath, 'w') as f:
-        if library.name:
-          if library.comment:
-            f.write('%s' % (''.join(library.comment)))
-          f.write("library %s;\n\n" % library.name)
-        else:
-          f.write("library %s;\n\n" % basename(lib))
-        for importfile in library.imports:
-          f.write("import %s;\n" % importfile)
-        f.write('%s' % (''.join(library.code)))
-        mergefiles([normjoin(dirname(lib), s) for s in library.sources], f)
+def main(outdir=None, *inputs):
+    if not outdir or not inputs:
+        print "Usage: %s OUTDIR INPUTS" % sys.argv[0]
+        print "  OUTDIR is the war directory to copy to"
+        print "  INPUTS is a list of files or patterns used to specify the input"
+        print "   .dart files"
+        print "This script should be run from the client root directory."
+        print "Files will be merged and copied to: OUTDIR/relative-path-of-file,"
+        print "except for dart files with absolute paths, which will be copied to"
+        print " OUTDIR/absolute-path-as-directories"
+        return 1
 
-      for suffix in library.imports:
-        m = re.match(r'[\'"]([^\'"]+)[\'"](\s+as\s+\w+)?.*$', suffix)
-        uri = m.group(1)
-        if not uri.startswith('dart:'):
-          worklist.append(normjoin(dirname(lib), uri))
+    entry_libraries = []
+    for i in inputs:
+        entry_libraries.extend(glob(i))
 
-  return 0
+    for entrypoint in entry_libraries:
+        # Get the transitive set of dart files this entrypoint depends on, merging
+        # each library along the way.
+        worklist = [os.path.normpath(entrypoint)]
+        seen = set()
+        while len(worklist) > 0:
+            lib = worklist.pop()
+            if lib in seen:
+                continue
+
+            seen.add(lib)
+
+            if (dirname(dirname(lib)).endswith('dom/generated/src') or
+                    dirname(lib).endswith('dom/src')):
+                continue
+
+            library = parseLibrary(lib)
+
+            # Ensure output directory exists
+            outpath = join(outdir, lib[1:] if isabs(lib) else lib)
+            dstpath = dirname(outpath)
+            if not exists(dstpath):
+                os.makedirs(dstpath)
+
+            # Create file containing all imports, and inlining all sources
+            with open(outpath, 'w') as f:
+                if library.name:
+                    if library.comment:
+                        f.write('%s' % (''.join(library.comment)))
+                    f.write("library %s;\n\n" % library.name)
+                else:
+                    f.write("library %s;\n\n" % basename(lib))
+                for importfile in library.imports:
+                    f.write("import %s;\n" % importfile)
+                f.write('%s' % (''.join(library.code)))
+                mergefiles([normjoin(dirname(lib), s) for s in library.sources],
+                           f)
+
+            for suffix in library.imports:
+                m = re.match(r'[\'"]([^\'"]+)[\'"](\s+as\s+\w+)?.*$', suffix)
+                uri = m.group(1)
+                if not uri.startswith('dart:'):
+                    worklist.append(normjoin(dirname(lib), uri))
+
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(main(*sys.argv[1:]))
+    sys.exit(main(*sys.argv[1:]))
diff --git a/tools/copy_tree.py b/tools/copy_tree.py
index d175b14..f5c5c56 100755
--- a/tools/copy_tree.py
+++ b/tools/copy_tree.py
@@ -10,147 +10,160 @@
 import shutil
 import sys
 
+
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to copy a file tree somewhere')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to copy a file tree somewhere')
 
-  parser.add_argument('--exclude_patterns', '-e',
-      type=str,
-      help='Patterns to exclude [passed to shutil.copytree]')
-  parser.add_argument('--from', '-f',
-      dest="copy_from",
-      type=str,
-      help='Source directory')
-  parser.add_argument('--gn', '-g',
-      dest='gn',
-      default=False,
-      action='store_true',
-      help='Output for GN for multiple sources, but do not copy anything.')
-  parser.add_argument('gn_paths',
-      metavar='name path ignore_pattern',
-      type=str,
-      nargs='*',
-      default=None,
-      help='When --gn is given, the specification of source paths to list.')
-  parser.add_argument('--to', '-t',
-      type=str,
-      help='Destination directory')
+    parser.add_argument(
+        '--exclude_patterns',
+        '-e',
+        type=str,
+        help='Patterns to exclude [passed to shutil.copytree]')
+    parser.add_argument(
+        '--from', '-f', dest="copy_from", type=str, help='Source directory')
+    parser.add_argument(
+        '--gn',
+        '-g',
+        dest='gn',
+        default=False,
+        action='store_true',
+        help='Output for GN for multiple sources, but do not copy anything.')
+    parser.add_argument(
+        'gn_paths',
+        metavar='name path ignore_pattern',
+        type=str,
+        nargs='*',
+        default=None,
+        help='When --gn is given, the specification of source paths to list.')
+    parser.add_argument('--to', '-t', type=str, help='Destination directory')
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def ValidateArgs(args):
-  if args.gn:
-    if args.exclude_patterns or args.copy_from or args.to:
-      print ("--gn mode does not accept other switches")
-      return False
-    if not args.gn_paths:
-      print ("--gn mode requires a list of source specifications")
-      return False
+    if args.gn:
+        if args.exclude_patterns or args.copy_from or args.to:
+            print("--gn mode does not accept other switches")
+            return False
+        if not args.gn_paths:
+            print("--gn mode requires a list of source specifications")
+            return False
+        return True
+    if not args.copy_from or not os.path.isdir(args.copy_from):
+        print("--from argument must refer to a directory")
+        return False
+    if not args.to:
+        print("--to is required")
+        return False
     return True
-  if not args.copy_from or not os.path.isdir(args.copy_from):
-    print ("--from argument must refer to a directory")
-    return False
-  if not args.to:
-    print ("--to is required")
-    return False
-  return True
 
 
 def CopyTree(src, dst, ignore=None):
-  names = os.listdir(src)
-  if ignore is not None:
-    ignored_names = ignore(src, names)
-  else:
-    ignored_names = set()
+    # Recusive helper method to collect errors but keep processing.
+    def copy_tree(src, dst, ignore, errors):
+        names = os.listdir(src)
+        if ignore is not None:
+            ignored_names = ignore(src, names)
+        else:
+            ignored_names = set()
 
-  if not os.path.exists(dst):
-    os.makedirs(dst)
-  errors = []
-  for name in names:
-    if name in ignored_names:
-      continue
-    srcname = os.path.join(src, name)
-    dstname = os.path.join(dst, name)
-    try:
-      if os.path.isdir(srcname):
-        CopyTree(srcname, dstname, ignore)
-      else:
-        shutil.copy(srcname, dstname)
-    except (IOError, os.error) as why:
-      errors.append((srcname, dstname, str(why)))
-    # catch the Error from the recursive CopyTree so that we can
-    # continue with other files
-    except Exception as err:
-      errors.extend(err.args[0])
-  try:
-    shutil.copystat(src, dst)
-  except WindowsError:
-    # can't copy file access times on Windows
-    pass
-  except OSError as why:
-    errors.extend((src, dst, str(why)))
-  if errors:
-    raise Error(errors)
+        if not os.path.exists(dst):
+            os.makedirs(dst)
+        for name in names:
+            if name in ignored_names:
+                continue
+            srcname = os.path.join(src, name)
+            dstname = os.path.join(dst, name)
+            try:
+                if os.path.isdir(srcname):
+                    copy_tree(srcname, dstname, ignore, errors)
+                else:
+                    shutil.copy(srcname, dstname)
+            except (IOError, os.error) as why:
+                errors.append((srcname, dstname, str(why)))
+        try:
+            shutil.copystat(src, dst)
+        except WindowsError:
+            # Can't copy file access times on Windows.
+            pass
+        except OSError as why:
+            errors.append((src, dst, str(why)))
+
+    # Format errors from file copies.
+    def format_error(error):
+        if len(error) == 1:
+            return "Error: {msg}".format(msg=str(error[0]))
+        return "From: {src}\nTo:   {dst}\n{msg}" \
+                .format(src=error[0], dst=error[1], msg=error[2])
+
+    errors = []
+    copy_tree(src, dst, ignore, errors)
+    if errors:
+        failures = "\n\n".join(format_error(error) for error in errors)
+        parts = ("Some file copies failed:", "=" * 78, failures)
+        msg = '\n'.join(parts)
+        raise RuntimeError(msg)
 
 
 def ListTree(src, ignore=None):
-  names = os.listdir(src)
-  if ignore is not None:
-    ignored_names = ignore(src, names)
-  else:
-    ignored_names = set()
-
-  srcnames = []
-  for name in names:
-    if name in ignored_names:
-      continue
-    srcname = os.path.join(src, name)
-    if os.path.isdir(srcname):
-      srcnames.extend(ListTree(srcname, ignore))
+    names = os.listdir(src)
+    if ignore is not None:
+        ignored_names = ignore(src, names)
     else:
-      srcnames.append(srcname)
-  return srcnames
+        ignored_names = set()
+
+    srcnames = []
+    for name in names:
+        if name in ignored_names:
+            continue
+        srcname = os.path.join(src, name)
+        if os.path.isdir(srcname):
+            srcnames.extend(ListTree(srcname, ignore))
+        else:
+            srcnames.append(srcname)
+    return srcnames
 
 
 # source_dirs is organized such that sources_dirs[n] is the path for the source
 # directory, and source_dirs[n+1] is a list of ignore patterns.
 def SourcesToGN(source_dirs):
-  if len(source_dirs) % 2 != 0:
-    print ("--gn list length should be a multiple of 2.")
-    return False
-  data = []
-  for i in range(0, len(source_dirs), 2):
-    path = source_dirs[i]
-    ignores = source_dirs[i + 1]
-    if ignores in ["{}"]:
-      sources = ListTree(path)
-    else:
-      patterns = ignores.split(',')
-      sources = ListTree(path, ignore=shutil.ignore_patterns(*patterns))
-    data.append(sources)
-  scope_data = {"sources": data}
-  print (gn_helpers.ToGNString(scope_data))
-  return True
+    if len(source_dirs) % 2 != 0:
+        print("--gn list length should be a multiple of 2.")
+        return False
+    data = []
+    for i in range(0, len(source_dirs), 2):
+        path = source_dirs[i]
+        ignores = source_dirs[i + 1]
+        if ignores in ["{}"]:
+            sources = ListTree(path)
+        else:
+            patterns = ignores.split(',')
+            sources = ListTree(path, ignore=shutil.ignore_patterns(*patterns))
+        data.append(sources)
+    scope_data = {"sources": data}
+    print(gn_helpers.ToGNString(scope_data))
+    return True
 
 
 def Main(argv):
-  args = ParseArgs(argv)
-  if not ValidateArgs(args):
-    return -1
+    args = ParseArgs(argv)
+    if not ValidateArgs(args):
+        return -1
 
-  if args.gn:
-    SourcesToGN(args.gn_paths)
+    if args.gn:
+        SourcesToGN(args.gn_paths)
+        return 0
+
+    if args.exclude_patterns == None:
+        CopyTree(args.copy_from, args.to)
+    else:
+        patterns = args.exclude_patterns.split(',')
+        CopyTree(
+            args.copy_from, args.to, ignore=shutil.ignore_patterns(*patterns))
     return 0
 
-  if args.exclude_patterns == None:
-    CopyTree(args.copy_from, args.to)
-  else:
-    patterns = args.exclude_patterns.split(',')
-    CopyTree(args.copy_from, args.to, ignore=shutil.ignore_patterns(*patterns))
-  return 0
-
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/create_debian_packages.py b/tools/create_debian_packages.py
index 5340393..e0e81bb1 100755
--- a/tools/create_debian_packages.py
+++ b/tools/create_debian_packages.py
@@ -22,131 +22,130 @@
 HOST_CPUS = utils.GuessCpus()
 DART_DIR = abspath(join(__file__, '..', '..'))
 
-def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option("--tar_filename",
-                    default=None,
-                    help="The tar file to build from.")
-  result.add_option("--out_dir",
-                    default=None,
-                    help="Where to put the packages.")
-  result.add_option("-a", "--arch",
-      help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,armel,armhf]',
-      default='x64')
-  result.add_option("-t", "--toolchain",
-      help='Cross-compilation toolchain prefix',
-      default=None)
 
-  return result
+def BuildOptions():
+    result = optparse.OptionParser()
+    result.add_option(
+        "--tar_filename", default=None, help="The tar file to build from.")
+    result.add_option(
+        "--out_dir", default=None, help="Where to put the packages.")
+    result.add_option(
+        "-a",
+        "--arch",
+        help='Target architectures (comma-separated).',
+        metavar='[all,ia32,x64,armel,armhf]',
+        default='x64')
+    result.add_option(
+        "-t",
+        "--toolchain",
+        help='Cross-compilation toolchain prefix',
+        default=None)
+
+    return result
+
 
 def RunBuildPackage(opt, cwd, toolchain=None):
-  env = os.environ.copy()
-  if toolchain != None:
-    env["TOOLCHAIN"] = '--toolchain=' + toolchain
-  cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
-  cmd.extend(opt)
-  process = subprocess.check_call(cmd, cwd=cwd, env=env)
+    env = os.environ.copy()
+    if toolchain != None:
+        env["TOOLCHAIN"] = '--toolchain=' + toolchain
+    cmd = ['dpkg-buildpackage', '-j%d' % HOST_CPUS]
+    cmd.extend(opt)
+    process = subprocess.check_call(cmd, cwd=cwd, env=env)
+
 
 def BuildDebianPackage(tarball, out_dir, arch, toolchain):
-  version = utils.GetVersion()
-  tarroot = 'dart-%s' % version
-  origtarname = 'dart_%s.orig.tar.gz' % version
+    version = utils.GetVersion()
+    tarroot = 'dart-%s' % version
+    origtarname = 'dart_%s.orig.tar.gz' % version
 
-  if not exists(tarball):
-    print 'Source tarball not found'
-    return -1
+    if not exists(tarball):
+        print 'Source tarball not found'
+        return -1
 
-  with utils.TempDir() as temp_dir:
-    origtarball = join(temp_dir, origtarname)
-    copyfile(tarball, origtarball)
+    with utils.TempDir() as temp_dir:
+        origtarball = join(temp_dir, origtarname)
+        copyfile(tarball, origtarball)
 
-    with tarfile.open(origtarball) as tar:
-      tar.extractall(path=temp_dir)
+        with tarfile.open(origtarball) as tar:
+            tar.extractall(path=temp_dir)
 
-    # Build source package.
-    print "Building source package"
-    RunBuildPackage(['-S', '-us', '-uc'], join(temp_dir, tarroot))
+        # Build source package.
+        print "Building source package"
+        RunBuildPackage(['-S', '-us', '-uc'], join(temp_dir, tarroot))
 
-    # Build 32-bit binary package.
-    if 'ia32' in arch:
-      print "Building i386 package"
-      RunBuildPackage(['-B', '-ai386', '-us', '-uc'], join(temp_dir, tarroot))
+        # Build 32-bit binary package.
+        if 'ia32' in arch:
+            print "Building i386 package"
+            RunBuildPackage(['-B', '-ai386', '-us', '-uc'],
+                            join(temp_dir, tarroot))
 
-    # Build 64-bit binary package.
-    if 'x64' in arch:
-      print "Building amd64 package"
-      RunBuildPackage(['-B', '-aamd64', '-us', '-uc'], join(temp_dir, tarroot))
+        # Build 64-bit binary package.
+        if 'x64' in arch:
+            print "Building amd64 package"
+            RunBuildPackage(['-B', '-aamd64', '-us', '-uc'],
+                            join(temp_dir, tarroot))
 
-    # Build armhf binary package.
-    if 'armhf' in arch:
-      print "Building armhf package"
-      RunBuildPackage(
-          ['-B', '-aarmhf', '-us', '-uc'], join(temp_dir, tarroot), toolchain)
+        # Build armhf binary package.
+        if 'armhf' in arch:
+            print "Building armhf package"
+            RunBuildPackage(['-B', '-aarmhf', '-us', '-uc'],
+                            join(temp_dir, tarroot), toolchain)
 
-    # Build armel binary package.
-    if 'armel' in arch:
-      print "Building armel package"
-      RunBuildPackage(
-          ['-B', '-aarmel', '-us', '-uc'], join(temp_dir, tarroot), toolchain)
+        # Build armel binary package.
+        if 'armel' in arch:
+            print "Building armel package"
+            RunBuildPackage(['-B', '-aarmel', '-us', '-uc'],
+                            join(temp_dir, tarroot), toolchain)
 
-    # Copy the Debian package files to the build directory.
-    debbase = 'dart_%s' % version
-    source_package = [
-      '%s-1.dsc' % debbase,
-      '%s.orig.tar.gz' % debbase,
-      '%s-1.debian.tar.xz' % debbase
-    ]
-    i386_package = [
-      '%s-1_i386.deb' % debbase
-    ]
-    amd64_package = [
-      '%s-1_amd64.deb' % debbase
-    ]
-    armhf_package = [
-      '%s-1_armhf.deb' % debbase
-    ]
-    armel_package = [
-      '%s-1_armel.deb' % debbase
-    ]
+        # Copy the Debian package files to the build directory.
+        debbase = 'dart_%s' % version
+        source_package = [
+            '%s-1.dsc' % debbase,
+            '%s.orig.tar.gz' % debbase,
+            '%s-1.debian.tar.xz' % debbase
+        ]
+        i386_package = ['%s-1_i386.deb' % debbase]
+        amd64_package = ['%s-1_amd64.deb' % debbase]
+        armhf_package = ['%s-1_armhf.deb' % debbase]
+        armel_package = ['%s-1_armel.deb' % debbase]
 
-    for name in source_package:
-      copyfile(join(temp_dir, name), join(out_dir, name))
-    if 'ia32' in arch:
-      for name in i386_package:
-        copyfile(join(temp_dir, name), join(out_dir, name))
-    if 'x64' in arch:
-      for name in amd64_package:
-        copyfile(join(temp_dir, name), join(out_dir, name))
-    if ('armhf' in arch):
-      for name in armhf_package:
-        copyfile(join(temp_dir, name), join(out_dir, name))
-    if ('armel' in arch):
-      for name in armel_package:
-        copyfile(join(temp_dir, name), join(out_dir, name))
+        for name in source_package:
+            copyfile(join(temp_dir, name), join(out_dir, name))
+        if 'ia32' in arch:
+            for name in i386_package:
+                copyfile(join(temp_dir, name), join(out_dir, name))
+        if 'x64' in arch:
+            for name in amd64_package:
+                copyfile(join(temp_dir, name), join(out_dir, name))
+        if ('armhf' in arch):
+            for name in armhf_package:
+                copyfile(join(temp_dir, name), join(out_dir, name))
+        if ('armel' in arch):
+            for name in armel_package:
+                copyfile(join(temp_dir, name), join(out_dir, name))
 
 
 def Main():
-  if HOST_OS != 'linux':
-    print 'Debian build only supported on linux'
-    return -1
+    if HOST_OS != 'linux':
+        print 'Debian build only supported on linux'
+        return -1
 
-  options, args = BuildOptions().parse_args()
-  out_dir = options.out_dir
-  tar_filename = options.tar_filename
-  if options.arch == 'all':
-    options.arch = 'ia32,x64,armhf'
-  arch = options.arch.split(',')
+    options, args = BuildOptions().parse_args()
+    out_dir = options.out_dir
+    tar_filename = options.tar_filename
+    if options.arch == 'all':
+        options.arch = 'ia32,x64,armhf'
+    arch = options.arch.split(',')
 
-  if not options.out_dir:
-    out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS))
+    if not options.out_dir:
+        out_dir = join(DART_DIR, utils.GetBuildDir(HOST_OS))
 
-  if not tar_filename:
-    tar_filename = join(DART_DIR,
-                        utils.GetBuildDir(HOST_OS),
-                        'dart-%s.tar.gz' % utils.GetVersion())
+    if not tar_filename:
+        tar_filename = join(DART_DIR, utils.GetBuildDir(HOST_OS),
+                            'dart-%s.tar.gz' % utils.GetVersion())
 
-  BuildDebianPackage(tar_filename, out_dir, arch, options.toolchain)
+    BuildDebianPackage(tar_filename, out_dir, arch, options.toolchain)
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/create_pkg_manifest.py b/tools/create_pkg_manifest.py
index c49eac8..0448ca9 100755
--- a/tools/create_pkg_manifest.py
+++ b/tools/create_pkg_manifest.py
@@ -19,98 +19,104 @@
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
 
+
 # Used in parsing the DEPS file.
 class VarImpl(object):
-  _env_vars = {
-    "host_cpu": "x64",
-    "host_os": "linux",
-  }
+    _env_vars = {
+        "host_cpu": "x64",
+        "host_os": "linux",
+    }
 
-  def __init__(self, local_scope):
-    self._local_scope = local_scope
+    def __init__(self, local_scope):
+        self._local_scope = local_scope
 
-  def Lookup(self, var_name):
-    """Implements the Var syntax."""
-    if var_name in self._local_scope.get("vars", {}):
-      return self._local_scope["vars"][var_name]
-    # Inject default values for env variables
-    if var_name in self._env_vars:
-      return self._env_vars[var_name]
-    raise Exception("Var is not defined: %s" % var_name)
+    def Lookup(self, var_name):
+        """Implements the Var syntax."""
+        if var_name in self._local_scope.get("vars", {}):
+            return self._local_scope["vars"][var_name]
+        # Inject default values for env variables
+        if var_name in self._env_vars:
+            return self._env_vars[var_name]
+        raise Exception("Var is not defined: %s" % var_name)
 
 
 def ParseDepsFile(deps_file):
-  local_scope = {}
-  var = VarImpl(local_scope)
-  global_scope = {
-    'Var': var.Lookup,
-    'deps_os': {},
-  }
-  # Read the content.
-  with open(deps_file, 'r') as fp:
-    deps_content = fp.read()
+    local_scope = {}
+    var = VarImpl(local_scope)
+    global_scope = {
+        'Var': var.Lookup,
+        'deps_os': {},
+    }
+    # Read the content.
+    with open(deps_file, 'r') as fp:
+        deps_content = fp.read()
 
-  # Eval the content.
-  exec(deps_content, global_scope, local_scope)
+    # Eval the content.
+    exec (deps_content, global_scope, local_scope)
 
-  # Extract the deps and filter.
-  deps = local_scope.get('deps', {})
-  filtered_deps = {}
-  for k, v in deps.iteritems():
-    if 'sdk/third_party/pkg' in k:
-      new_key = k.replace('sdk', 'third_party/dart', 1)
-      filtered_deps[new_key] = v
+    # Extract the deps and filter.
+    deps = local_scope.get('deps', {})
+    filtered_deps = {}
+    for k, v in deps.iteritems():
+        if 'sdk/third_party/pkg' in k:
+            new_key = k.replace('sdk', 'third_party/dart', 1)
+            filtered_deps[new_key] = v
 
-  return filtered_deps
+    return filtered_deps
 
 
 def WriteManifest(deps, manifest_file):
-  project_template = """
+    project_template = """
     <project name="%s"
              path="%s"
              remote="%s"
              revision="%s"/>
 """
-  warning = ('<!-- This file is generated by '
-             '//third_party/dart/tools/create_pkg_manifest.py. DO NOT EDIT -->\n')
-  with open(manifest_file, 'w') as manifest:
-    manifest.write('<?xml version="1.0" encoding="UTF-8"?>\n')
-    manifest.write(warning)
-    manifest.write('<manifest>\n')
-    manifest.write('  <projects>\n')
-    for path, remote in sorted(deps.iteritems()):
-      remote_components = remote.split('@')
-      remote_url = remote_components[0]
-      remote_version = remote_components[1]
-      manifest.write(
-          project_template % (path, path, remote_url, remote_version))
-    manifest.write('  </projects>\n')
-    manifest.write('</manifest>\n')
+    warning = (
+        '<!-- This file is generated by '
+        '//third_party/dart/tools/create_pkg_manifest.py. DO NOT EDIT -->\n')
+    with open(manifest_file, 'w') as manifest:
+        manifest.write('<?xml version="1.0" encoding="UTF-8"?>\n')
+        manifest.write(warning)
+        manifest.write('<manifest>\n')
+        manifest.write('  <projects>\n')
+        for path, remote in sorted(deps.iteritems()):
+            remote_components = remote.split('@')
+            remote_url = remote_components[0]
+            remote_version = remote_components[1]
+            manifest.write(
+                project_template % (path, path, remote_url, remote_version))
+        manifest.write('  </projects>\n')
+        manifest.write('</manifest>\n')
 
 
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to generate a jiri manifest for third_party/pkg.')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to generate a jiri manifest for third_party/pkg.')
 
-  parser.add_argument('--deps', '-d',
-      type=str,
-      help='Input DEPS file.',
-      default=os.path.join(DART_ROOT, 'DEPS'))
-  parser.add_argument('--output', '-o',
-      type=str,
-      help='Output jiri manifest.',
-      default=os.path.join(DART_ROOT, 'dart_third_party_pkg.manifest'))
+    parser.add_argument(
+        '--deps',
+        '-d',
+        type=str,
+        help='Input DEPS file.',
+        default=os.path.join(DART_ROOT, 'DEPS'))
+    parser.add_argument(
+        '--output',
+        '-o',
+        type=str,
+        help='Output jiri manifest.',
+        default=os.path.join(DART_ROOT, 'dart_third_party_pkg.manifest'))
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def Main(argv):
-  args = ParseArgs(argv)
-  deps = ParseDepsFile(args.deps)
-  WriteManifest(deps, args.output)
-  return 0
+    args = ParseArgs(argv)
+    deps = ParseDepsFile(args.deps)
+    WriteManifest(deps, args.output)
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/create_tarball.py b/tools/create_tarball.py
index 918f532..ee5630a 100755
--- a/tools/create_tarball.py
+++ b/tools/create_tarball.py
@@ -30,7 +30,6 @@
 
 import utils
 
-
 HOST_OS = utils.GuessOS()
 DART_DIR = abspath(join(__file__, '..', '..'))
 # Flags.
@@ -40,137 +39,149 @@
 versiondir = ''
 
 # Ignore Git/SVN files, checked-in binaries, backup files, etc..
-ignoredPaths = ['third_party/7zip', 'third_party/android_tools',
-                'third_party/clang', 'third_party/d8',
-                'third_party/firefox_jsshell']
+ignoredPaths = [
+    'third_party/7zip', 'third_party/android_tools', 'third_party/clang',
+    'third_party/d8', 'third_party/firefox_jsshell'
+]
 ignoredDirs = ['.svn', '.git']
 ignoredEndings = ['.mk', '.pyc', 'Makefile', '~']
 
-def BuildOptions():
-  result = optparse.OptionParser()
-  result.add_option("-v", "--verbose",
-      help='Verbose output.',
-      default=False, action="store_true")
-  result.add_option("--tar_filename",
-                    default=None,
-                    help="The output file.")
 
-  return result
+def BuildOptions():
+    result = optparse.OptionParser()
+    result.add_option(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
+    result.add_option("--tar_filename", default=None, help="The output file.")
+
+    return result
+
 
 def Filter(tar_info):
-  # Get the name of the file relative to the dart directory. Note the
-  # name from the TarInfo does not include a leading slash.
-  assert tar_info.name.startswith(DART_DIR[1:])
-  original_name = tar_info.name[len(DART_DIR):]
-  _, tail = split(original_name)
-  if tail in ignoredDirs:
-    return None
-  for path in ignoredPaths:
-    if original_name.startswith(path):
-      return None
-  for ending in ignoredEndings:
-    if original_name.endswith(ending):
-      return None
-  # Add the dart directory name with version. Place the debian
-  # directory one level over the rest which are placed in the
-  # directory 'dart'. This enables building the Debian packages
-  # out-of-the-box.
-  tar_info.name = join(versiondir, 'dart', original_name)
-  if verbose:
-    print 'Adding %s as %s' % (original_name, tar_info.name)
-  return tar_info
+    # Get the name of the file relative to the dart directory. Note the
+    # name from the TarInfo does not include a leading slash.
+    assert tar_info.name.startswith(DART_DIR[1:])
+    original_name = tar_info.name[len(DART_DIR):]
+    _, tail = split(original_name)
+    if tail in ignoredDirs:
+        return None
+    for path in ignoredPaths:
+        if original_name.startswith(path):
+            return None
+    for ending in ignoredEndings:
+        if original_name.endswith(ending):
+            return None
+    # Add the dart directory name with version. Place the debian
+    # directory one level over the rest which are placed in the
+    # directory 'dart'. This enables building the Debian packages
+    # out-of-the-box.
+    tar_info.name = join(versiondir, 'dart', original_name)
+    if verbose:
+        print 'Adding %s as %s' % (original_name, tar_info.name)
+    return tar_info
+
 
 def GenerateCopyright(filename):
-  with open(join(DART_DIR, 'LICENSE')) as lf:
-    license_lines = lf.readlines()
+    with open(join(DART_DIR, 'LICENSE')) as lf:
+        license_lines = lf.readlines()
 
-  with open(filename, 'w') as f:
-    f.write('Name: dart\n')
-    f.write('Maintainer: Dart Team <misc@dartlang.org>\n')
-    f.write('Source: https://code.google.com/p/dart/\n')
-    f.write('License:\n')
-    for line in license_lines:
-      f.write(' %s' % line)  # Line already contains trailing \n.
+    with open(filename, 'w') as f:
+        f.write('Name: dart\n')
+        f.write('Maintainer: Dart Team <misc@dartlang.org>\n')
+        f.write('Source: https://code.google.com/p/dart/\n')
+        f.write('License:\n')
+        for line in license_lines:
+            f.write(' %s' % line)  # Line already contains trailing \n.
+
 
 def GenerateChangeLog(filename, version):
-  with open(filename, 'w') as f:
-    f.write('dart (%s-1) UNRELEASED; urgency=low\n' % version)
-    f.write('\n')
-    f.write('  * Generated file.\n')
-    f.write('\n')
-    f.write(' -- Dart Team <misc@dartlang.org>  %s\n' %
-            datetime.datetime.utcnow().strftime('%a, %d %b %Y %X +0000'))
+    with open(filename, 'w') as f:
+        f.write('dart (%s-1) UNRELEASED; urgency=low\n' % version)
+        f.write('\n')
+        f.write('  * Generated file.\n')
+        f.write('\n')
+        f.write(' -- Dart Team <misc@dartlang.org>  %s\n' %
+                datetime.datetime.utcnow().strftime('%a, %d %b %Y %X +0000'))
+
 
 def GenerateEmpty(filename):
-  f = open(filename, 'w')
-  f.close()
+    f = open(filename, 'w')
+    f.close()
+
 
 def GenerateGitRevision(filename, git_revision):
-  with open(filename, 'w') as f:
-    f.write(str(git_revision))
+    with open(filename, 'w') as f:
+        f.write(str(git_revision))
 
 
 def CreateTarball(tarfilename):
-  global ignoredPaths  # Used for adding the output directory.
-  # Generate the name of the tarfile
-  version = utils.GetVersion()
-  global versiondir
-  versiondir = 'dart-%s' % version
-  debian_dir = 'tools/linux_dist_support/debian'
-  # Don't include the build directory in the tarball (ignored paths
-  # are relative to DART_DIR).
-  builddir = utils.GetBuildDir(HOST_OS)
-  ignoredPaths.append(builddir)
+    global ignoredPaths  # Used for adding the output directory.
+    # Generate the name of the tarfile
+    version = utils.GetVersion()
+    global versiondir
+    versiondir = 'dart-%s' % version
+    debian_dir = 'tools/linux_dist_support/debian'
+    # Don't include the build directory in the tarball (ignored paths
+    # are relative to DART_DIR).
+    builddir = utils.GetBuildDir(HOST_OS)
+    ignoredPaths.append(builddir)
 
-  print 'Creating tarball: %s' % tarfilename
-  with tarfile.open(tarfilename, mode='w:gz') as tar:
-    for f in listdir(DART_DIR):
-      tar.add(join(DART_DIR, f), filter=Filter)
-    for f in listdir(join(DART_DIR, debian_dir)):
-      tar.add(join(DART_DIR, debian_dir, f),
-              arcname='%s/debian/%s' % (versiondir, f))
+    print 'Creating tarball: %s' % tarfilename
+    with tarfile.open(tarfilename, mode='w:gz') as tar:
+        for f in listdir(DART_DIR):
+            tar.add(join(DART_DIR, f), filter=Filter)
+        for f in listdir(join(DART_DIR, debian_dir)):
+            tar.add(
+                join(DART_DIR, debian_dir, f),
+                arcname='%s/debian/%s' % (versiondir, f))
 
-    with utils.TempDir() as temp_dir:
-      # Generate and add debian/copyright
-      copyright_file = join(temp_dir, 'copyright')
-      GenerateCopyright(copyright_file)
-      tar.add(copyright_file, arcname='%s/debian/copyright' % versiondir)
+        with utils.TempDir() as temp_dir:
+            # Generate and add debian/copyright
+            copyright_file = join(temp_dir, 'copyright')
+            GenerateCopyright(copyright_file)
+            tar.add(copyright_file, arcname='%s/debian/copyright' % versiondir)
 
-      # Generate and add debian/changelog
-      change_log = join(temp_dir, 'changelog')
-      GenerateChangeLog(change_log, version)
-      tar.add(change_log, arcname='%s/debian/changelog' % versiondir)
+            # Generate and add debian/changelog
+            change_log = join(temp_dir, 'changelog')
+            GenerateChangeLog(change_log, version)
+            tar.add(change_log, arcname='%s/debian/changelog' % versiondir)
 
-      # For generated version file build dependency, add fake git reflog.
-      empty = join(temp_dir, 'empty')
-      GenerateEmpty(empty)
-      tar.add(empty, arcname='%s/dart/.git/logs/HEAD' % versiondir)
+            # For generated version file build dependency, add fake git reflog.
+            empty = join(temp_dir, 'empty')
+            GenerateEmpty(empty)
+            tar.add(empty, arcname='%s/dart/.git/logs/HEAD' % versiondir)
 
-      # For bleeding_edge add the GIT_REVISION file.
-      if utils.GetChannel() == 'be':
-        git_revision = join(temp_dir, 'GIT_REVISION')
-        GenerateGitRevision(git_revision, utils.GetGitRevision())
-        tar.add(git_revision, arcname='%s/dart/tools/GIT_REVISION' % versiondir)
+            # For bleeding_edge add the GIT_REVISION file.
+            if utils.GetChannel() == 'be':
+                git_revision = join(temp_dir, 'GIT_REVISION')
+                GenerateGitRevision(git_revision, utils.GetGitRevision())
+                tar.add(
+                    git_revision,
+                    arcname='%s/dart/tools/GIT_REVISION' % versiondir)
+
 
 def Main():
-  if HOST_OS != 'linux':
-    print 'Tarball can only be created on linux'
-    return -1
+    if HOST_OS != 'linux':
+        print 'Tarball can only be created on linux'
+        return -1
 
-  # Parse the options.
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
-  if options.verbose:
-    global verbose
-    verbose = True
+    # Parse the options.
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
+    if options.verbose:
+        global verbose
+        verbose = True
 
-  tar_filename = options.tar_filename
-  if not tar_filename:
-    tar_filename = join(DART_DIR,
-                        utils.GetBuildDir(HOST_OS),
-                        'dart-%s.tar.gz' % utils.GetVersion())
+    tar_filename = options.tar_filename
+    if not tar_filename:
+        tar_filename = join(DART_DIR, utils.GetBuildDir(HOST_OS),
+                            'dart-%s.tar.gz' % utils.GetVersion())
 
-  CreateTarball(tar_filename)
+    CreateTarball(tar_filename)
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/create_timestamp_file.py b/tools/create_timestamp_file.py
index 0a97edc..8f449a6 100755
--- a/tools/create_timestamp_file.py
+++ b/tools/create_timestamp_file.py
@@ -6,12 +6,14 @@
 import sys
 import os
 
+
 def main(args):
-  for file_name in args[1:]:
-    dir_name = os.path.dirname(file_name)
-    if not os.path.exists(dir_name):
-      os.mkdir(dir_name)
-    open(file_name, 'w').close()
+    for file_name in args[1:]:
+        dir_name = os.path.dirname(file_name)
+        if not os.path.exists(dir_name):
+            os.mkdir(dir_name)
+        open(file_name, 'w').close()
+
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/disguised_test.py b/tools/disguised_test.py
index 40e8a0c..e3d8f0a 100755
--- a/tools/disguised_test.py
+++ b/tools/disguised_test.py
@@ -16,7 +16,8 @@
 import subprocess
 import sys
 
-exit(subprocess.call([sys.executable,
-                      os.path.join(os.path.dirname(os.path.abspath(__file__)),
-                                   "test.py")] +
-                      sys.argv[1:]))
+exit(
+    subprocess.call([
+        sys.executable,
+        os.path.join(os.path.dirname(os.path.abspath(__file__)), "test.py")
+    ] + sys.argv[1:]))
diff --git a/tools/dom/PRESUBMIT.py b/tools/dom/PRESUBMIT.py
index 84ce197..f6a6439 100644
--- a/tools/dom/PRESUBMIT.py
+++ b/tools/dom/PRESUBMIT.py
@@ -1,7 +1,6 @@
 # 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.
-
 """
 Presubmit tests for dom tools.
 
@@ -11,50 +10,50 @@
 See: http://www.chromium.org/developers/how-tos/depottools/presubmit-scripts
 """
 
-
 import os
 
 
 def _AnySdkFiles(input_api):
-  """ Returns true if any of the changed files are in the sdk, meaning we should
+    """ Returns true if any of the changed files are in the sdk, meaning we should
   check that docs.dart was run.
   """
-  for f in input_api.change.AffectedFiles():
-    if f.LocalPath().find('sdk') > -1:
-      return True
-  return False
+    for f in input_api.change.AffectedFiles():
+        if f.LocalPath().find('sdk') > -1:
+            return True
+    return False
 
 
 def CheckChangeOnUpload(input_api, output_api):
-  results = []
-  # TODO(amouravski): uncomment this check once docs.dart is faster.
-  #  if _AnySdkFiles(input_api):
-  #    results.extend(CheckDocs(input_api, output_api))
-  return results
+    results = []
+    # TODO(amouravski): uncomment this check once docs.dart is faster.
+    #  if _AnySdkFiles(input_api):
+    #    results.extend(CheckDocs(input_api, output_api))
+    return results
 
 
 def CheckChangeOnCommit(input_api, output_api):
-  results = []
-  if _AnySdkFiles(input_api):
-    results.extend(CheckDocs(input_api, output_api))
-  return results
+    results = []
+    if _AnySdkFiles(input_api):
+        results.extend(CheckDocs(input_api, output_api))
+    return results
 
 
 def CheckDocs(input_api, output_api):
-  """Ensure that documentation has been generated if it needs to be generated.
+    """Ensure that documentation has been generated if it needs to be generated.
 
   Prompts with a warning if documentation needs to be generated.
   """
-  results = []
+    results = []
 
-  cmd = [os.path.join(input_api.PresubmitLocalPath(), 'dom.py'), 'test_docs']
+    cmd = [os.path.join(input_api.PresubmitLocalPath(), 'dom.py'), 'test_docs']
 
-  try:
-    input_api.subprocess.check_output(cmd,
-                                      stderr=input_api.subprocess.STDOUT)
-  except (OSError, input_api.subprocess.CalledProcessError), e:
-    results.append(output_api.PresubmitPromptWarning(
-        ('Docs test failed!%s\nYou should run `dom.py docs`' % (
-            e if input_api.verbose else ''))))
+    try:
+        input_api.subprocess.check_output(
+            cmd, stderr=input_api.subprocess.STDOUT)
+    except (OSError, input_api.subprocess.CalledProcessError), e:
+        results.append(
+            output_api.PresubmitPromptWarning(
+                ('Docs test failed!%s\nYou should run `dom.py docs`' %
+                 (e if input_api.verbose else ''))))
 
-  return results
+    return results
diff --git a/tools/dom/dom.py b/tools/dom/dom.py
index 1316ab1..8fa8254 100755
--- a/tools/dom/dom.py
+++ b/tools/dom/dom.py
@@ -16,199 +16,227 @@
 
 dart_out_dir = utils.GetBuildRoot(utils.GuessOS(), 'release', 'ia32')
 if utils.IsWindows():
-  dart_bin = os.path.join(dart_out_dir, 'dart.exe')
+    dart_bin = os.path.join(dart_out_dir, 'dart.exe')
 else:
-  dart_bin = os.path.join(dart_out_dir, 'dart')
+    dart_bin = os.path.join(dart_out_dir, 'dart')
 
-dart_dir = os.path.abspath(os.path.join(
-    os.path.dirname(os.path.realpath(__file__)),
-    os.path.pardir, os.path.pardir))
+dart_dir = os.path.abspath(
+    os.path.join(
+        os.path.dirname(os.path.realpath(__file__)), os.path.pardir,
+        os.path.pardir))
+
 
 def help():
-  print('Helper script to make it easy to perform common tasks encountered '
-     'during the life of a Dart DOM developer.\n'
-     '\n'
-     'For example, to re-generate DOM classes then run a specific test:\n'
-     '  dom.py gen test_drt html/element_test\n'
-     '\n'
-     'Or re-generate DOM classes and run the Dart analyzer:\n'
-     '  dom.py gen analyze\n')
-  print('Commands: ')
-  for cmd in sorted(commands.keys()):
-    print('\t%s - %s' % (cmd, commands[cmd][1]))
+    print('Helper script to make it easy to perform common tasks encountered '
+          'during the life of a Dart DOM developer.\n'
+          '\n'
+          'For example, to re-generate DOM classes then run a specific test:\n'
+          '  dom.py gen test_drt html/element_test\n'
+          '\n'
+          'Or re-generate DOM classes and run the Dart analyzer:\n'
+          '  dom.py gen analyze\n')
+    print('Commands: ')
+    for cmd in sorted(commands.keys()):
+        print('\t%s - %s' % (cmd, commands[cmd][1]))
+
 
 def analyze():
-  ''' Runs the dart analyzer. '''
-  return call([
-    os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dartanalyzer'),
-    os.path.join('tests', 'html', 'element_test.dart'),
-    '--dart-sdk=sdk',
-    '--show-package-warnings',
-  ])
+    ''' Runs the dart analyzer. '''
+    return call([
+        os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dartanalyzer'),
+        os.path.join('tests', 'html', 'element_test.dart'),
+        '--dart-sdk=sdk',
+        '--show-package-warnings',
+    ])
+
 
 def build():
-  ''' Builds the Dart binary '''
-  return call([
-    os.path.join('tools', 'build.py'),
-    '--mode=release',
-    '--arch=ia32',
-    'runtime',
-  ])
+    ''' Builds the Dart binary '''
+    return call([
+        os.path.join('tools', 'build.py'),
+        '--mode=release',
+        '--arch=ia32',
+        'runtime',
+    ])
+
 
 def dart2js():
-  compile_dart2js(argv.pop(0), True)
+    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'),
-  ])
+    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'
-  ])
+    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')
-  args = [
-    dart2js_path,
-    dart_file,
-    '--library-root=sdk/',
-    '-o%s' % out_file
-  ]
-  if checked:
-    args.append('--checked')
+    out_file = dart_file + '.js'
+    dart2js_path = os.path.join(dart_out_dir, 'dart-sdk', 'bin', 'dart2js')
+    args = [dart2js_path, dart_file, '--library-root=sdk/', '-o%s' % out_file]
+    if checked:
+        args.append('--checked')
 
-  call(args)
-  return out_file
+    call(args)
+    return out_file
+
 
 def gen():
-  os.chdir(os.path.join('tools', 'dom', 'scripts'))
-  result = call([os.path.join(os.getcwd(), 'dartdomgenerator.py'),
-      '--rebuild', '--parallel', '--systems=htmldart2js,htmldartium'])
-  os.chdir(os.path.join('..', '..', '..'))
-  return result
+    os.chdir(os.path.join('tools', 'dom', 'scripts'))
+    result = call([
+        os.path.join(os.getcwd(), 'dartdomgenerator.py'), '--rebuild',
+        '--parallel', '--systems=htmldart2js,htmldartium'
+    ])
+    os.chdir(os.path.join('..', '..', '..'))
+    return result
+
 
 def size_check():
-  ''' Displays the dart2js size of swarm. '''
-  dart_file = os.path.join('samples', 'swarm', 'swarm.dart')
-  out_file = compile_dart2js(dart_file, False)
+    ''' Displays the dart2js size of swarm. '''
+    dart_file = os.path.join('samples', 'swarm', 'swarm.dart')
+    out_file = compile_dart2js(dart_file, False)
 
-  return call([
-    'du',
-    '-kh',
-    '--apparent-size',
-    out_file,
-  ])
+    return call([
+        'du',
+        '-kh',
+        '--apparent-size',
+        out_file,
+    ])
 
-  os.remove(out_file)
-  os.remove(out_file + '.deps')
-  os.remove(out_file + '.map')
+    os.remove(out_file)
+    os.remove(out_file + '.deps')
+    os.remove(out_file + '.map')
+
 
 def test_ff():
-  test_dart2js('ff', argv)
+    test_dart2js('ff', argv)
+
 
 def test_drt():
-  test_dart2js('drt', argv)
+    test_dart2js('drt', argv)
+
 
 def test_chrome():
-  test_dart2js('chrome', argv)
+    test_dart2js('chrome', argv)
+
 
 def test_dart2js(browser, argv):
-  cmd = [
-    os.path.join('tools', 'test.py'),
-    '-c', 'dart2js',
-    '-r', browser,
-    '--mode=release',
-    '--checked',
-    '--arch=ia32',
-    '-v',
-  ]
-  if argv:
-    cmd.append(argv.pop(0))
-  else:
-    print(
-        'Test commands should be followed by tests to run. Defaulting to html')
-    cmd.append('html')
-  return call(cmd)
+    cmd = [
+        os.path.join('tools', 'test.py'),
+        '-c',
+        'dart2js',
+        '-r',
+        browser,
+        '--mode=release',
+        '--checked',
+        '--arch=ia32',
+        '-v',
+    ]
+    if argv:
+        cmd.append(argv.pop(0))
+    else:
+        print(
+            'Test commands should be followed by tests to run. Defaulting to html'
+        )
+        cmd.append('html')
+    return call(cmd)
+
 
 def test_server():
-  start_test_server(5400, os.path.join('out', 'ReleaseX64'))
+    start_test_server(5400, os.path.join('out', 'ReleaseX64'))
+
 
 def test_server_dartium():
-  start_test_server(5500, os.path.join('..', 'out', 'Release'))
+    start_test_server(5500, os.path.join('..', 'out', 'Release'))
+
 
 def start_test_server(port, build_directory):
-  print('Browse tests at '
-      '\033[94mhttp://localhost:%d/root_build/generated_tests/\033[0m' % port)
-  return call([
-    utils.CheckedInSdkExecutable(),
-    os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
-    '--port=%d' % port,
-    '--crossOriginPort=%d' % (port + 1),
-    '--network=0.0.0.0',
-    '--build-directory=%s' % build_directory
-  ])
+    print(
+        'Browse tests at '
+        '\033[94mhttp://localhost:%d/root_build/generated_tests/\033[0m' % port)
+    return call([
+        utils.CheckedInSdkExecutable(),
+        os.path.join('tools', 'testing', 'dart', 'http_server.dart'),
+        '--port=%d' % port,
+        '--crossOriginPort=%d' % (port + 1), '--network=0.0.0.0',
+        '--build-directory=%s' % build_directory
+    ])
 
 
 def call(args):
-  print ' '.join(args)
-  pipe = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  output, error = pipe.communicate()
-  if output:
-    print output
-  if error:
-    print error
-  return pipe.returncode
+    print ' '.join(args)
+    pipe = subprocess.Popen(
+        args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    output, error = pipe.communicate()
+    if output:
+        print output
+    if error:
+        print error
+    return pipe.returncode
+
 
 commands = {
-  '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.'],
-  # TODO(antonm): fix option name.
-  'test_drt': [test_drt, 'Run tests in checked mode in content shell.\n'
-      '\t\tOptionally provide name of test to run.'],
-  'test_ff': [test_ff, 'Run tests in checked mode in Firefox.\n'
-      '\t\tOptionally provide name of test to run.'],
-  'test_server': [test_server, 'Starts the testing server for manually '
-      'running browser tests.'],
-  'test_server_dartium': [test_server_dartium, 'Starts the testing server for '
-      'manually running browser tests from a dartium enlistment.'],
+    '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.'
+    ],
+    # TODO(antonm): fix option name.
+    'test_drt': [
+        test_drt, 'Run tests in checked mode in content shell.\n'
+        '\t\tOptionally provide name of test to run.'
+    ],
+    'test_ff': [
+        test_ff, 'Run tests in checked mode in Firefox.\n'
+        '\t\tOptionally provide name of test to run.'
+    ],
+    'test_server': [
+        test_server, 'Starts the testing server for manually '
+        'running browser tests.'
+    ],
+    'test_server_dartium': [
+        test_server_dartium, 'Starts the testing server for '
+        'manually running browser tests from a dartium enlistment.'
+    ],
 }
 
+
 def main():
-  success = True
-  argv.pop(0)
+    success = True
+    argv.pop(0)
 
-  if not argv:
-    help()
-    success = False
+    if not argv:
+        help()
+        success = False
 
-  while (argv):
-    # Make sure that we're always rooted in the dart root folder.
-    os.chdir(dart_dir)
-    command = argv.pop(0)
+    while (argv):
+        # Make sure that we're always rooted in the dart root folder.
+        os.chdir(dart_dir)
+        command = argv.pop(0)
 
-    if not command in commands:
-      help();
-      success = False
-      break
-    returncode = commands[command][0]()
-    success = success and not bool(returncode)
+        if not command in commands:
+            help()
+            success = False
+            break
+        returncode = commands[command][0]()
+        success = success and not bool(returncode)
 
-  sys.exit(not success)
+    sys.exit(not success)
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/tools/dom/new_scripts/code_generator_dart.py b/tools/dom/new_scripts/code_generator_dart.py
index c5a5709..6fdd2a9 100644
--- a/tools/dom/new_scripts/code_generator_dart.py
+++ b/tools/dom/new_scripts/code_generator_dart.py
@@ -25,7 +25,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Generate Blink C++ bindings (.h and .cpp files) for use by Dart:HTML.
 
 If run itself, caches Jinja templates (and creates dummy file for build,
@@ -48,7 +47,6 @@
 import re
 import sys
 
-
 # Path handling for libraries and templates
 # Paths have to be normalized because Jinja uses the exact template path to
 # determine the hash used in the cache filename, and we need a pre-caching step
@@ -58,8 +56,9 @@
 # is regenerated, which causes a race condition and breaks concurrent build,
 # since some compile processes will try to read the partially written cache.
 module_path, module_filename = os.path.split(os.path.realpath(__file__))
-third_party_dir = os.path.normpath(os.path.join(
-    module_path, os.pardir, os.pardir, os.pardir, os.pardir, os.pardir))
+third_party_dir = os.path.normpath(
+    os.path.join(module_path, os.pardir, os.pardir, os.pardir, os.pardir,
+                 os.pardir))
 templates_dir = os.path.normpath(os.path.join(module_path, 'templates'))
 
 # Make sure extension is .py, not .pyc or .pyo, so doesn't depend on caching
@@ -72,8 +71,8 @@
 
 # Add the base compiler scripts to the path here as in compiler.py
 dart_script_path = os.path.dirname(os.path.abspath(__file__))
-script_path = os.path.join(os.path.dirname(os.path.dirname(dart_script_path)),
-                          'scripts')
+script_path = os.path.join(
+    os.path.dirname(os.path.dirname(dart_script_path)), 'scripts')
 sys.path.extend([script_path])
 
 import jinja2
@@ -84,44 +83,41 @@
 from v8_globals import includes
 from dart_utilities import DartUtilities
 
-
 # TODO(jacobr): remove this hacked together list.
 INTERFACES_WITHOUT_RESOLVERS = frozenset([
-    'TypeConversions',
-    'GCObservation',
-    'InternalProfilers',
-    'InternalRuntimeFlags',
-    'InternalSettings',
-    'InternalSettingsGenerated',
-    'Internals',
-    'LayerRect',
-    'LayerRectList',
-    'MallocStatistics',
-    'TypeConversions'])
+    'TypeConversions', 'GCObservation', 'InternalProfilers',
+    'InternalRuntimeFlags', 'InternalSettings', 'InternalSettingsGenerated',
+    'Internals', 'LayerRect', 'LayerRectList', 'MallocStatistics',
+    'TypeConversions'
+])
+
 
 class CodeGeneratorDart(object):
+
     def __init__(self, interfaces_info, cache_dir):
         interfaces_info = interfaces_info or {}
         self.interfaces_info = interfaces_info
         self.jinja_env = initialize_jinja_env(cache_dir)
 
         # Set global type info
-        idl_types.set_ancestors(dict(
-            (interface_name, interface_info['ancestors'])
-            for interface_name, interface_info in interfaces_info.iteritems()
-            if interface_info['ancestors']))
-        IdlType.set_callback_interfaces(set(
-            interface_name
-            for interface_name, interface_info in interfaces_info.iteritems()
-            if interface_info['is_callback_interface']))
-        IdlType.set_implemented_as_interfaces(dict(
-            (interface_name, interface_info['implemented_as'])
-            for interface_name, interface_info in interfaces_info.iteritems()
-            if interface_info['implemented_as']))
-        IdlType.set_garbage_collected_types(set(
-            interface_name
-            for interface_name, interface_info in interfaces_info.iteritems()
-            if 'GarbageCollected' in interface_info['inherited_extended_attributes']))
+        idl_types.set_ancestors(
+            dict((interface_name, interface_info['ancestors'])
+                 for interface_name, interface_info in interfaces_info.
+                 iteritems()
+                 if interface_info['ancestors']))
+        IdlType.set_callback_interfaces(
+            set(interface_name for interface_name, interface_info in
+                interfaces_info.iteritems()
+                if interface_info['is_callback_interface']))
+        IdlType.set_implemented_as_interfaces(
+            dict((interface_name, interface_info['implemented_as'])
+                 for interface_name, interface_info in interfaces_info.
+                 iteritems()
+                 if interface_info['implemented_as']))
+        IdlType.set_garbage_collected_types(
+            set(interface_name for interface_name, interface_info in
+                interfaces_info.iteritems() if 'GarbageCollected' in
+                interface_info['inherited_extended_attributes']))
 
     def generate_code(self, definitions, interface_name, idl_pickle_filename,
                       only_if_changed):
@@ -158,7 +154,8 @@
         # Add includes for interface itself and any dependencies
         interface_info = self.interfaces_info[interface_name]
         template_contents['header_includes'].add(interface_info['include_path'])
-        template_contents['header_includes'] = sorted(template_contents['header_includes'])
+        template_contents['header_includes'] = sorted(
+            template_contents['header_includes'])
         includes.update(interface_info.get('dependencies_include_paths', []))
 
         # Remove includes that are not needed for Dart and trigger fatal
@@ -181,20 +178,29 @@
             idl_world['callback'] = idl_global_data['callback']
 
         if 'interface_name' in template_contents:
-            interface_global = {'name': template_contents['interface_name'],
-                                'parent_interface': template_contents['parent_interface'],
-                                'is_active_dom_object': template_contents['is_active_dom_object'],
-                                'is_event_target': template_contents['is_event_target'],
-                                'has_resolver': template_contents['interface_name'] not in INTERFACES_WITHOUT_RESOLVERS,
-                                'is_node': template_contents['is_node'],
-                                'conditional_string': template_contents['conditional_string'],
-                               }
+            interface_global = {
+                'name':
+                template_contents['interface_name'],
+                'parent_interface':
+                template_contents['parent_interface'],
+                'is_active_dom_object':
+                template_contents['is_active_dom_object'],
+                'is_event_target':
+                template_contents['is_event_target'],
+                'has_resolver':
+                template_contents['interface_name'] not in
+                INTERFACES_WITHOUT_RESOLVERS,
+                'is_node':
+                template_contents['is_node'],
+                'conditional_string':
+                template_contents['conditional_string'],
+            }
             idl_world['interface'] = interface_global
         else:
             callback_global = {'name': template_contents['cpp_class']}
             idl_world['callback'] = callback_global
 
-        write_pickle_file(idl_pickle_filename,  idl_world, only_if_changed)
+        write_pickle_file(idl_pickle_filename, idl_world, only_if_changed)
 
         # Render Jinja templates
         header_text = header_template.render(template_contents)
@@ -232,8 +238,10 @@
                             world['callbacks'].append(idl_world['callback'])
                     idl_pickle_file.close()
 
-        world['interfaces'] = sorted(world['interfaces'], key=lambda (x): x['name'])
-        world['callbacks'] = sorted(world['callbacks'], key=lambda (x): x['name'])
+        world['interfaces'] = sorted(
+            world['interfaces'], key=lambda (x): x['name'])
+        world['callbacks'] = sorted(
+            world['callbacks'], key=lambda (x): x['name'])
 
         template_contents = world
         template_contents['code_generator'] = module_pyname
@@ -259,7 +267,7 @@
         'blink_capitalize': DartUtilities.capitalize,
         'conditional': conditional_if_endif,
         'runtime_enabled': runtime_enabled_if,
-        })
+    })
     return jinja_env
 
 
@@ -268,8 +276,7 @@
     # Jinja2 filter to generate if/endif directive blocks
     if not conditional_string:
         return code
-    return ('#if %s\n' % conditional_string +
-            code +
+    return ('#if %s\n' % conditional_string + code +
             '#endif // %s\n' % conditional_string)
 
 
@@ -285,6 +292,7 @@
 
 ################################################################################
 
+
 def main(argv):
     # If file itself executed, cache templates
     try:
@@ -296,9 +304,11 @@
 
     # Cache templates
     jinja_env = initialize_jinja_env(cache_dir)
-    template_filenames = [filename for filename in os.listdir(templates_dir)
-                          # Skip .svn, directories, etc.
-                          if filename.endswith(('.cpp', '.h', '.template'))]
+    template_filenames = [
+        filename for filename in os.listdir(templates_dir)
+        # Skip .svn, directories, etc.
+        if filename.endswith(('.cpp', '.h', '.template'))
+    ]
     for template_filename in template_filenames:
         jinja_env.get_template(template_filename)
 
diff --git a/tools/dom/new_scripts/compiler.py b/tools/dom/new_scripts/compiler.py
index 2a6d09a..9a27581 100755
--- a/tools/dom/new_scripts/compiler.py
+++ b/tools/dom/new_scripts/compiler.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Compile an .idl file to Dart bindings (.h and .cpp files).
 
 Design doc: ??????
@@ -37,8 +36,8 @@
 import sys
 
 dart_script_path = os.path.dirname(os.path.abspath(__file__))
-script_path = os.path.join(os.path.dirname(os.path.dirname(dart_script_path)),
-                          'scripts')
+script_path = os.path.join(
+    os.path.dirname(os.path.dirname(dart_script_path)), 'scripts')
 sys.path.extend([script_path])
 
 from dart_compiler import IdlCompiler
@@ -58,7 +57,8 @@
     options, args = parser.parse_args()
     if options.output_directory is None:
         parser.error('Must specify output directory using --output-directory.')
-    options.write_file_only_if_changed = bool(options.write_file_only_if_changed)
+    options.write_file_only_if_changed = bool(
+        options.write_file_only_if_changed)
     options.generate_global = bool(options.generate_global)
     if len(args) != 1:
         # parser.error('Must specify exactly 1 input file as argument, but %d given.' % len(args))
@@ -74,13 +74,15 @@
 
 
 class IdlCompilerDart(IdlCompiler):
+
     def __init__(self, *args, **kwargs):
         IdlCompiler.__init__(self, *args, **kwargs)
 
         interfaces_info = self.interfaces_info
         self.output_directory = self.output_directory
 
-        self.code_generator = CodeGeneratorDart(interfaces_info, self.output_directory)
+        self.code_generator = CodeGeneratorDart(interfaces_info,
+                                                self.output_directory)
 
     def compile_file(self, idl_filename):
         interface_name = idl_filename_to_interface_name(idl_filename)
@@ -88,26 +90,32 @@
                                        'Dart%s.h' % interface_name)
         cpp_filename = os.path.join(self.output_directory,
                                     'Dart%s.cpp' % interface_name)
-        return self.compile_and_write(idl_filename, (header_filename, cpp_filename))
+        return self.compile_and_write(idl_filename,
+                                      (header_filename, cpp_filename))
 
     def generate_global(self):
-        global_header_filename = os.path.join(self.output_directory, 'DartWebkitClassIds.h')
-        global_cpp_filename = os.path.join(self.output_directory, 'DartWebkitClassIds.cpp')
-        self.generate_global_and_write((global_header_filename, global_cpp_filename))
+        global_header_filename = os.path.join(self.output_directory,
+                                              'DartWebkitClassIds.h')
+        global_cpp_filename = os.path.join(self.output_directory,
+                                           'DartWebkitClassIds.cpp')
+        self.generate_global_and_write((global_header_filename,
+                                        global_cpp_filename))
 
 
 def main():
     options, idl_filename = parse_options()
 
     if options.generate_global:
-        idl_compiler = IdlCompilerDart(options.output_directory,
-                                       interfaces_info_filename=options.interfaces_info_file,
-                                       only_if_changed=options.write_file_only_if_changed)
+        idl_compiler = IdlCompilerDart(
+            options.output_directory,
+            interfaces_info_filename=options.interfaces_info_file,
+            only_if_changed=options.write_file_only_if_changed)
         idl_compiler.generate_global()
     else:
-        idl_compiler = IdlCompilerDart(options.output_directory,
-                                       interfaces_info_filename=options.interfaces_info_file,
-                                       only_if_changed=options.write_file_only_if_changed)
+        idl_compiler = IdlCompilerDart(
+            options.output_directory,
+            interfaces_info_filename=options.interfaces_info_file,
+            only_if_changed=options.write_file_only_if_changed)
         idl_compiler.compile_file(idl_filename)
 
 
diff --git a/tools/dom/new_scripts/dart_compiler.py b/tools/dom/new_scripts/dart_compiler.py
index b766fb3..5dd2b34 100755
--- a/tools/dom/new_scripts/dart_compiler.py
+++ b/tools/dom/new_scripts/dart_compiler.py
@@ -26,7 +26,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Compile an .idl file to Blink C++ bindings (.h and .cpp files) for Dart:HTML.
 
 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler
@@ -40,7 +39,6 @@
 from idl_reader import IdlReader
 from utilities import write_file
 
-
 # TODO(terry): Temporary whitelist of IDL files to skip code generating. e.g.,
 #              adding 'Animation.idl' to this list will skip that IDL file.
 SKIP_IDL_FILES = ['']
@@ -48,8 +46,9 @@
 
 def parse_options():
     parser = OptionParser()
-    parser.add_option('--idl-attributes-file',
-                      help="location of bindings/IDLExtendedAttributes.txt")
+    parser.add_option(
+        '--idl-attributes-file',
+        help="location of bindings/IDLExtendedAttributes.txt")
     parser.add_option('--output-directory')
     parser.add_option('--interfaces-info-file')
     parser.add_option('--write-file-only-if-changed', type='int')
@@ -59,9 +58,12 @@
     options, args = parser.parse_args()
     if options.output_directory is None:
         parser.error('Must specify output directory using --output-directory.')
-    options.write_file_only_if_changed = bool(options.write_file_only_if_changed)
+    options.write_file_only_if_changed = bool(
+        options.write_file_only_if_changed)
     if len(args) != 1:
-        parser.error('Must specify exactly 1 input file as argument, but %d given.' % len(args))
+        parser.error(
+            'Must specify exactly 1 input file as argument, but %d given.' %
+            len(args))
     idl_filename = os.path.realpath(args[0])
     return options, idl_filename
 
@@ -82,8 +84,11 @@
     """
     __metaclass__ = abc.ABCMeta
 
-    def __init__(self, output_directory, code_generator=None,
-                 interfaces_info=None, interfaces_info_filename='',
+    def __init__(self,
+                 output_directory,
+                 code_generator=None,
+                 interfaces_info=None,
+                 interfaces_info_filename='',
                  only_if_changed=False):
         """
         Args:
diff --git a/tools/dom/new_scripts/dart_utilities.py b/tools/dom/new_scripts/dart_utilities.py
index 7a57a4f..73df127 100644
--- a/tools/dom/new_scripts/dart_utilities.py
+++ b/tools/dom/new_scripts/dart_utilities.py
@@ -25,7 +25,6 @@
 # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 """Functions shared by various parts of the code generator.
 
 Extends IdlType and IdlUnion type with |enum_validation_expression| property.
@@ -33,13 +32,11 @@
 Design doc: http://www.chromium.org/developers/design-documents/idl-compiler
 """
 
-
 ################################################################################
 # Utility function exposed for Dart CodeGenerator. Only 6 methods are special
 # to Dart the rest delegate to the v8_utilities functions.
 ################################################################################
 
-
 import v8_types  # Required
 import v8_utilities
 
@@ -47,11 +44,12 @@
 def _scoped_name(interface, definition, base_name):
     # partial interfaces are implemented as separate classes, with their members
     # implemented as static member functions
-    partial_interface_implemented_as = definition.extended_attributes.get('PartialInterfaceImplementedAs')
+    partial_interface_implemented_as = definition.extended_attributes.get(
+        'PartialInterfaceImplementedAs')
     if partial_interface_implemented_as:
         return '%s::%s' % (partial_interface_implemented_as, base_name)
     if (definition.is_static or
-        definition.name in ('Constructor', 'NamedConstructor')):
+            definition.name in ('Constructor', 'NamedConstructor')):
         return '%s::%s' % (v8_utilities.cpp_name(interface), base_name)
     return 'receiver->%s' % base_name
 
@@ -104,12 +102,16 @@
 
 def _call_with_arguments(member, call_with_values=None):
     # Optional parameter so setter can override with [SetterCallWith]
-    call_with_values = call_with_values or member.extended_attributes.get('CallWith')
+    call_with_values = call_with_values or member.extended_attributes.get(
+        'CallWith')
     if not call_with_values:
         return []
-    return [_CALL_WITH_ARGUMENTS[value]
-            for value in _CALL_WITH_VALUES
-            if v8_utilities.extended_attribute_value_contains(call_with_values, value)]
+    return [
+        _CALL_WITH_ARGUMENTS[value]
+        for value in _CALL_WITH_VALUES
+        if v8_utilities.extended_attribute_value_contains(
+            call_with_values, value)
+    ]
 
 
 # [DeprecateAs]
@@ -139,9 +141,11 @@
 
 
 class dart_utilities_monkey():
+
     def __init__(self):
         self.base_class_name = 'dart_utilities'
 
+
 DartUtilities = dart_utilities_monkey()
 
 DartUtilities.activity_logging_world_list = _activity_logging_world_list
diff --git a/tools/dom/new_scripts/dependency.py b/tools/dom/new_scripts/dependency.py
index 060277e..4f54d44 100644
--- a/tools/dom/new_scripts/dependency.py
+++ b/tools/dom/new_scripts/dependency.py
@@ -1,9 +1,11 @@
 builder = None
 
+
 def set_builder(created_builder):
-  global builder;
-  builder = created_builder
+    global builder
+    builder = created_builder
+
 
 def get_interfaces_info():
-  global builder;
-  return builder._info_collector.interfaces_info
+    global builder
+    return builder._info_collector.interfaces_info
diff --git a/tools/dom/scripts/all_tests.py b/tools/dom/scripts/all_tests.py
index f7d84fd..40a5a49 100755
--- a/tools/dom/scripts/all_tests.py
+++ b/tools/dom/scripts/all_tests.py
@@ -2,23 +2,17 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 entry point runs all script tests."""
 
 import logging.config
 import unittest
 
 if __name__ == '__main__':
-  logging.config.fileConfig('logging.conf')
-  suite = unittest.TestLoader().loadTestsFromNames([
-      'templateloader_test',
-      'pegparser_test',
-      'idlparser_test',
-      'idlnode_test',
-      'idlrenderer_test',
-      'database_test',
-      'databasebuilder_test',
-      'emitter_test',
-      'dartgenerator_test',
-      'multiemitter_test'])
-  unittest.TextTestRunner().run(suite)
+    logging.config.fileConfig('logging.conf')
+    suite = unittest.TestLoader().loadTestsFromNames([
+        'templateloader_test', 'pegparser_test', 'idlparser_test',
+        'idlnode_test', 'idlrenderer_test', 'database_test',
+        'databasebuilder_test', 'emitter_test', 'dartgenerator_test',
+        'multiemitter_test'
+    ])
+    unittest.TextTestRunner().run(suite)
diff --git a/tools/dom/scripts/css_code_generator.py b/tools/dom/scripts/css_code_generator.py
index 1d921ef..4bf4870 100644
--- a/tools/dom/scripts/css_code_generator.py
+++ b/tools/dom/scripts/css_code_generator.py
@@ -3,7 +3,6 @@
 # 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.
-
 """Generates CSSStyleDeclaration template file from css property definitions
 defined in WebKit."""
 
@@ -28,65 +27,74 @@
     'cssProperties.safari-7.1.3.txt',
     'cssProperties.mobileSafari-8.2.txt',
     'cssProperties.iPad4Air.onGoogleSites.txt',
-    ]
+]
 
 # Supported annotations for any specific CSS properties.
 annotated = {
-  'transition': '''@SupportedBrowser(SupportedBrowser.CHROME)
+    'transition':
+    '''@SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)'''
 }
 
+
 class Error:
-  def __init__(self, message):
-    self.message = message
-  def __repr__(self):
-    return self.message
+
+    def __init__(self, message):
+        self.message = message
+
+    def __repr__(self):
+        return self.message
+
 
 def camelCaseName(name):
-  """Convert a CSS property name to a lowerCamelCase name."""
-  name = name.replace('-webkit-', '')
-  words = []
-  for word in name.split('-'):
-    if words:
-      words.append(word.title())
-    else:
-      words.append(word)
-  return ''.join(words)
+    """Convert a CSS property name to a lowerCamelCase name."""
+    name = name.replace('-webkit-', '')
+    words = []
+    for word in name.split('-'):
+        if words:
+            words.append(word.title())
+        else:
+            words.append(word)
+    return ''.join(words)
+
 
 def dashifyName(camelName):
-  def fix(match):
-    return '-' + match.group(0).lower()
-  return re.sub(r'[A-Z]', fix, camelName)
+
+    def fix(match):
+        return '-' + match.group(0).lower()
+
+    return re.sub(r'[A-Z]', fix, camelName)
+
 
 def isCommentLine(line):
-  return line.strip() == '' or line.startswith('#') or line.startswith('//')
+    return line.strip() == '' or line.startswith('#') or line.startswith('//')
+
 
 def readCssProperties(filename):
-  data = open(filename).readlines()
-  data = sorted([d.strip() for d in set(data) if not isCommentLine(d)])
-  return data
+    data = open(filename).readlines()
+    data = sorted([d.strip() for d in set(data) if not isCommentLine(d)])
+    return data
+
 
 def GenerateCssTemplateFile():
-  data = open(SOURCE_PATH).readlines()
+    data = open(SOURCE_PATH).readlines()
 
-  # filter CSSPropertyNames.in to only the properties
-  # TODO(efortuna): do we also want CSSPropertyNames.in?
-  data = [d.strip() for d in data
-          if not isCommentLine(d)
-          and not '=' in d]
+    # filter CSSPropertyNames.in to only the properties
+    # TODO(efortuna): do we also want CSSPropertyNames.in?
+    data = [d.strip() for d in data if not isCommentLine(d) and not '=' in d]
 
-  browser_props = [readCssProperties(file) for file in BROWSER_PATHS]
-  universal_properties = reduce(
-        lambda a, b: set(a).intersection(b), browser_props)
-  universal_properties = universal_properties.difference(['cssText'])
-  universal_properties = universal_properties.intersection(
+    browser_props = [readCssProperties(file) for file in BROWSER_PATHS]
+    universal_properties = reduce(lambda a, b: set(a).intersection(b),
+                                  browser_props)
+    universal_properties = universal_properties.difference(['cssText'])
+    universal_properties = universal_properties.intersection(
         map(camelCaseName, data))
 
-  class_file = open(TEMPLATE_FILE, 'w')
+    class_file = open(TEMPLATE_FILE, 'w')
 
-  class_file.write("""
+    class_file.write("""
 // 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.
@@ -100,8 +108,7 @@
 part of $LIBRARYNAME;
 """ % SOURCE_PATH)
 
-
-  class_file.write("""
+    class_file.write("""
 $(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME $EXTENDS with
     $(CLASSNAME)Base $IMPLEMENTS {
   factory $CLASSNAME() => new CssStyleDeclaration.css('');
@@ -200,9 +207,9 @@
 $!MEMBERS
 """)
 
-  for camelName in sorted(universal_properties):
-    property = dashifyName(camelName)
-    class_file.write("""
+    for camelName in sorted(universal_properties):
+        property = dashifyName(camelName)
+        class_file.write("""
   /** Gets the value of "%s" */
   String get %s => this._%s;
 
@@ -213,11 +220,10 @@
   @Returns('String')
   @JSName('%s')
   String _%s;
-    """ % (property, camelName, camelName,
-           property, camelName, camelName,
+    """ % (property, camelName, camelName, property, camelName, camelName,
            camelName, camelName))
 
-  class_file.write("""
+    class_file.write("""
 }
 
 class _CssStyleDeclarationSet extends Object with CssStyleDeclarationBase {
@@ -240,7 +246,7 @@
 
 """)
 
-  class_file.write("""
+    class_file.write("""
   void _setAll(String propertyName, String value) {
     value = value == null ? '' : value;
     for (Element element in _elementIterable) {
@@ -249,17 +255,16 @@
   }
 """)
 
-
-  for camelName in sorted(universal_properties):
-    property = dashifyName(camelName)
-    class_file.write("""
+    for camelName in sorted(universal_properties):
+        property = dashifyName(camelName)
+        class_file.write("""
   /** Sets the value of "%s" */
   set %s(String value) {
     _setAll('%s', value);
   }
     """ % (property, camelName, camelName))
 
-  class_file.write("""
+    class_file.write("""
 
   // Important note: CssStyleDeclarationSet does NOT implement every method
   // available in CssStyleDeclaration. Some of the methods don't make so much
@@ -273,39 +278,39 @@
   void setProperty(String propertyName, String value, [String priority]);
 """)
 
-  class_lines = [];
+    class_lines = []
 
-  seen = set()
-  for prop in sorted(data, key=camelCaseName):
-    camel_case_name = camelCaseName(prop)
-    upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:];
-    css_name = prop.replace('-webkit-', '')
-    base_css_name = prop.replace('-webkit-', '')
+    seen = set()
+    for prop in sorted(data, key=camelCaseName):
+        camel_case_name = camelCaseName(prop)
+        upper_camel_case_name = camel_case_name[0].upper() + camel_case_name[1:]
+        css_name = prop.replace('-webkit-', '')
+        base_css_name = prop.replace('-webkit-', '')
 
-    if base_css_name in seen or base_css_name.startswith('-internal'):
-      continue
-    seen.add(base_css_name)
+        if base_css_name in seen or base_css_name.startswith('-internal'):
+            continue
+        seen.add(base_css_name)
 
-    comment = '  /** %s the value of "' + base_css_name + '" */'
-    class_lines.append('\n');
-    class_lines.append(comment % 'Gets')
-    if base_css_name in annotated:
-      class_lines.append(annotated[base_css_name])
-    class_lines.append("""
+        comment = '  /** %s the value of "' + base_css_name + '" */'
+        class_lines.append('\n')
+        class_lines.append(comment % 'Gets')
+        if base_css_name in annotated:
+            class_lines.append(annotated[base_css_name])
+        class_lines.append("""
   String get %s =>
     getPropertyValue('%s');
 
 """ % (camel_case_name, css_name))
 
-    class_lines.append(comment % 'Sets')
-    if base_css_name in annotated:
-      class_lines.append(annotated[base_css_name])
-    class_lines.append("""
+        class_lines.append(comment % 'Sets')
+        if base_css_name in annotated:
+            class_lines.append(annotated[base_css_name])
+        class_lines.append("""
   set %s(String value) {
     setProperty('%s', value, '');
   }
 """ % (camel_case_name, css_name))
 
-  class_file.write(''.join(class_lines));
-  class_file.write('}\n')
-  class_file.close()
+    class_file.write(''.join(class_lines))
+    class_file.write('}\n')
+    class_file.close()
diff --git a/tools/dom/scripts/dartdomgenerator.py b/tools/dom/scripts/dartdomgenerator.py
index 9148767..3e1368e 100755
--- a/tools/dom/scripts/dartdomgenerator.py
+++ b/tools/dom/scripts/dartdomgenerator.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 is the entry point to create Dart APIs from the IDL database."""
 
 import css_code_generator
@@ -13,9 +12,11 @@
 
 # dart_dir is the location of dart's enlistment dartium (dartium-git/src/dart)
 # and Dart (dart-git/dart).
-dart_dir = os.path.abspath(os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
+dart_dir = os.path.abspath(
+    os.path.normpath(os.path.join(os.path.dirname(__file__), '..', '..', '..')))
 sys.path.insert(1, os.path.join(dart_dir, 'tools/dom/new_scripts'))
-sys.path.insert(1, os.path.join(dart_dir, 'third_party/WebCore/bindings/scripts'))
+sys.path.insert(1, os.path.join(dart_dir,
+                                'third_party/WebCore/bindings/scripts'))
 
 # Dartium's third_party directory location is dartium-git/src/third_party
 # and Dart's third_party directory location is dart-git/dart/third_party.
@@ -25,17 +26,17 @@
 # If ply directory found then we're a Dart enlistment; third_party location
 # is dart-git/dart/third_party
 if not os.path.exists(ply_dir):
-  # For Dartium (ply directory is dartium-git/src/third_party/ply) third_party
-  # location is dartium-git/src/third_party
-  third_party_dir = os.path.join(dart_dir, '..', 'third_party')
-  assert(os.path.exists(third_party_dir))
+    # For Dartium (ply directory is dartium-git/src/third_party/ply) third_party
+    # location is dartium-git/src/third_party
+    third_party_dir = os.path.join(dart_dir, '..', 'third_party')
+    assert (os.path.exists(third_party_dir))
 else:
-  # It's Dart we need to make sure that tools in injected in our search path
-  # because this is where idl_parser is located for a Dart enlistment.  Dartium
-  # can figure out the tools directory because of the location of where the
-  # scripts blink scripts are located.
-  tools_dir = os.path.join(dart_dir, 'tools')
-  sys.path.insert(1, tools_dir)
+    # It's Dart we need to make sure that tools in injected in our search path
+    # because this is where idl_parser is located for a Dart enlistment.  Dartium
+    # can figure out the tools directory because of the location of where the
+    # scripts blink scripts are located.
+    tools_dir = os.path.join(dart_dir, 'tools')
+    sys.path.insert(1, tools_dir)
 
 sys.path.insert(1, third_party_dir)
 
@@ -66,141 +67,153 @@
 
 import utils
 
-
 _logger = logging.getLogger('dartdomgenerator')
 
+
 class GeneratorOptions(object):
-  def __init__(self, templates, database, type_registry, renamer,
-      metadata, dart_js_interop):
-    self.templates = templates
-    self.database = database
-    self.type_registry = type_registry
-    self.renamer = renamer
-    self.metadata = metadata;
-    self.dart_js_interop = dart_js_interop
+
+    def __init__(self, templates, database, type_registry, renamer, metadata,
+                 dart_js_interop):
+        self.templates = templates
+        self.database = database
+        self.type_registry = type_registry
+        self.renamer = renamer
+        self.metadata = metadata
+        self.dart_js_interop = dart_js_interop
+
 
 def LoadDatabase(database_dir, use_database_cache):
-  common_database = database.Database(database_dir)
-  if use_database_cache:
-    common_database.LoadFromCache()
-  else:
-    common_database.Load()
-  return common_database
+    common_database = database.Database(database_dir)
+    if use_database_cache:
+        common_database.LoadFromCache()
+    else:
+        common_database.Load()
+    return common_database
+
 
 def GenerateFromDatabase(common_database,
                          dart2js_output_dir,
                          update_dom_metadata=False,
-                         logging_level=logging.WARNING, dart_js_interop=False):
-  print '\n ----- Accessing DOM using %s -----\n' % ('dart:js' if dart_js_interop else 'C++')
+                         logging_level=logging.WARNING,
+                         dart_js_interop=False):
+    print '\n ----- Accessing DOM using %s -----\n' % (
+        'dart:js' if dart_js_interop else 'C++')
 
-  start_time = time.time()
-
-  current_dir = os.path.dirname(__file__)
-  auxiliary_dir = os.path.join(current_dir, '..', 'src')
-  template_dir = os.path.join(current_dir, '..', 'templates')
-
-  _logger.setLevel(logging_level)
-
-  generator = dartgenerator.DartGenerator(logging_level)
-  generator.LoadAuxiliary(auxiliary_dir)
-
-  generator.FilterMembersWithUnidentifiedTypes(common_database)
-  webkit_database = common_database.Clone()
-
-  # Generate Dart interfaces for the WebKit DOM.
-  generator.FilterInterfaces(database = webkit_database,
-                             or_annotations = ['WebKit', 'Dart'],
-                             exclude_displaced = ['WebKit'],
-                             exclude_suppressed = ['WebKit', 'Dart'])
-  generator.FixEventTargets(webkit_database)
-  generator.AddMissingArguments(webkit_database)
-  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)
-  renamer = HtmlRenamer(webkit_database, metadata)
-  type_registry = TypeRegistry(webkit_database, renamer)
-
-  print 'GenerateFromDatabase %s seconds' % round((time.time() - start_time), 2)
-
-  def RunGenerator(dart_libraries, dart_output_dir,
-                   template_loader, backend_factory, dart_js_interop):
-    options = GeneratorOptions(
-        template_loader, webkit_database, type_registry, renamer,
-        metadata, dart_js_interop)
-    dart_library_emitter = DartLibraryEmitter(
-        emitters, dart_output_dir, dart_libraries)
-    event_generator = HtmlEventGenerator(webkit_database, renamer, metadata,
-        template_loader)
-
-    def generate_interface(interface, gl_constants=None):
-      backend = backend_factory(interface)
-      interface_generator = HtmlDartInterfaceGenerator(
-          options, dart_library_emitter, event_generator, interface, backend)
-      interface_generator.Generate()
-      if len(backend._gl_constants) > 0 and not(gl_constants is None):
-          gl_constants.extend(backend._gl_constants)
-
-    generator.Generate(webkit_database, common_database, generate_interface)
-
-    dart_library_emitter.EmitLibraries(auxiliary_dir, dart_js_interop)
-
-  if dart2js_output_dir:
-    template_paths = ['html/dart2js', 'html/impl', 'html/interface', '']
-    template_loader = TemplateLoader(template_dir,
-                                     template_paths,
-                                     {'DARTIUM': False,
-                                      'DART2JS': True,
-                                      'JSINTEROP': False})
-    backend_options = GeneratorOptions(
-        template_loader, webkit_database, type_registry, renamer,
-        metadata, dart_js_interop)
-    backend_factory = lambda interface:\
-        Dart2JSBackend(interface, backend_options, logging_level)
-
-    dart_output_dir = os.path.join(dart2js_output_dir, 'dart')
-    dart_libraries = DartLibraries(
-        HTML_LIBRARY_NAMES, template_loader, 'dart2js', dart2js_output_dir, dart_js_interop)
-
-    print '\nGenerating dart2js:\n'
     start_time = time.time()
 
-    RunGenerator(dart_libraries, dart_output_dir, template_loader,
-                 backend_factory, dart_js_interop)
+    current_dir = os.path.dirname(__file__)
+    auxiliary_dir = os.path.join(current_dir, '..', 'src')
+    template_dir = os.path.join(current_dir, '..', 'templates')
 
-    print 'Generated dart2js in %s seconds' % round(time.time() - start_time, 2)
+    _logger.setLevel(logging_level)
 
-  emitters.Flush()
+    generator = dartgenerator.DartGenerator(logging_level)
+    generator.LoadAuxiliary(auxiliary_dir)
 
-  if update_dom_metadata:
-    metadata.Flush()
+    generator.FilterMembersWithUnidentifiedTypes(common_database)
+    webkit_database = common_database.Clone()
 
-  monitored.FinishMonitoring(dart2js_output_dir, _logger)
+    # Generate Dart interfaces for the WebKit DOM.
+    generator.FilterInterfaces(
+        database=webkit_database,
+        or_annotations=['WebKit', 'Dart'],
+        exclude_displaced=['WebKit'],
+        exclude_suppressed=['WebKit', 'Dart'])
+    generator.FixEventTargets(webkit_database)
+    generator.AddMissingArguments(webkit_database)
+    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)
+    renamer = HtmlRenamer(webkit_database, metadata)
+    type_registry = TypeRegistry(webkit_database, renamer)
+
+    print 'GenerateFromDatabase %s seconds' % round(
+        (time.time() - start_time), 2)
+
+    def RunGenerator(dart_libraries, dart_output_dir, template_loader,
+                     backend_factory, dart_js_interop):
+        options = GeneratorOptions(template_loader, webkit_database,
+                                   type_registry, renamer, metadata,
+                                   dart_js_interop)
+        dart_library_emitter = DartLibraryEmitter(emitters, dart_output_dir,
+                                                  dart_libraries)
+        event_generator = HtmlEventGenerator(webkit_database, renamer, metadata,
+                                             template_loader)
+
+        def generate_interface(interface, gl_constants=None):
+            backend = backend_factory(interface)
+            interface_generator = HtmlDartInterfaceGenerator(
+                options, dart_library_emitter, event_generator, interface,
+                backend)
+            interface_generator.Generate()
+            if len(backend._gl_constants) > 0 and not (gl_constants is None):
+                gl_constants.extend(backend._gl_constants)
+
+        generator.Generate(webkit_database, common_database, generate_interface)
+
+        dart_library_emitter.EmitLibraries(auxiliary_dir, dart_js_interop)
+
+    if dart2js_output_dir:
+        template_paths = ['html/dart2js', 'html/impl', 'html/interface', '']
+        template_loader = TemplateLoader(template_dir, template_paths, {
+            'DARTIUM': False,
+            'DART2JS': True,
+            'JSINTEROP': False
+        })
+        backend_options = GeneratorOptions(template_loader, webkit_database,
+                                           type_registry, renamer, metadata,
+                                           dart_js_interop)
+        backend_factory = lambda interface:\
+            Dart2JSBackend(interface, backend_options, logging_level)
+
+        dart_output_dir = os.path.join(dart2js_output_dir, 'dart')
+        dart_libraries = DartLibraries(HTML_LIBRARY_NAMES, template_loader,
+                                       'dart2js', dart2js_output_dir,
+                                       dart_js_interop)
+
+        print '\nGenerating dart2js:\n'
+        start_time = time.time()
+
+        RunGenerator(dart_libraries, dart_output_dir, template_loader,
+                     backend_factory, dart_js_interop)
+
+        print 'Generated dart2js in %s seconds' % round(
+            time.time() - start_time, 2)
+
+    emitters.Flush()
+
+    if update_dom_metadata:
+        metadata.Flush()
+
+    monitored.FinishMonitoring(dart2js_output_dir, _logger)
+
 
 def GenerateSingleFile(library_path, output_dir, generated_output_dir=None):
-  library_dir = os.path.dirname(library_path)
-  library_filename = os.path.basename(library_path)
-  copy_dart_script = os.path.relpath('../../copy_dart.py',
-      library_dir)
-  output_dir = os.path.relpath(output_dir, library_dir)
-  if not os.path.exists(library_dir):
-      os.makedirs(library_dir)
-  command = ' '.join(['cd', library_dir, ';',
-                      copy_dart_script, output_dir, library_filename])
-  subprocess.call([command], shell=True)
-  prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt')
-  sdk_file = os.path.join(library_dir, output_dir, library_filename)
-  formatCommand = ' '.join([prebuilt_dartfmt, '-w', sdk_file])
-  subprocess.call([formatCommand], shell=True)
+    library_dir = os.path.dirname(library_path)
+    library_filename = os.path.basename(library_path)
+    copy_dart_script = os.path.relpath('../../copy_dart.py', library_dir)
+    output_dir = os.path.relpath(output_dir, library_dir)
+    if not os.path.exists(library_dir):
+        os.makedirs(library_dir)
+    command = ' '.join([
+        'cd', library_dir, ';', copy_dart_script, output_dir, library_filename
+    ])
+    subprocess.call([command], shell=True)
+    prebuilt_dartfmt = os.path.join(utils.CheckedInSdkPath(), 'bin', 'dartfmt')
+    sdk_file = os.path.join(library_dir, output_dir, library_filename)
+    formatCommand = ' '.join([prebuilt_dartfmt, '-w', sdk_file])
+    subprocess.call([formatCommand], shell=True)
+
 
 def UpdateCssProperties():
-  """Regenerate the CssStyleDeclaration template file with the current CSS
+    """Regenerate the CssStyleDeclaration template file with the current CSS
   properties."""
-  _logger.info('Updating Css Properties.')
-  css_code_generator.GenerateCssTemplateFile()
+    _logger.info('Updating Css Properties.')
+    css_code_generator.GenerateCssTemplateFile()
+
 
 CACHED_PATCHES = """
 // START_OF_CACHED_PATCHES
@@ -221,90 +234,126 @@
 };
 """
 
+
 def main():
-  parser = optparse.OptionParser()
-  parser.add_option('--parallel', dest='parallel',
-                    action='store_true', default=False,
-                    help='Use fremontcut in parallel mode.')
-  parser.add_option('--systems', dest='systems',
-                    action='store', type='string',
-                    default='htmldart2js,htmldartium,_blink',
-                    help='Systems to generate (htmldart2js, htmldartium, _blink)')
-  parser.add_option('--output-dir', dest='output_dir',
-                    action='store', type='string',
-                    default=None,
-                    help='Directory to put the generated files')
-  parser.add_option('--use-database-cache', dest='use_database_cache',
-                    action='store_true',
-                    default=False,
-                    help='''Use the cached database from the previous run to
+    parser = optparse.OptionParser()
+    parser.add_option(
+        '--parallel',
+        dest='parallel',
+        action='store_true',
+        default=False,
+        help='Use fremontcut in parallel mode.')
+    parser.add_option(
+        '--systems',
+        dest='systems',
+        action='store',
+        type='string',
+        default='htmldart2js,htmldartium,_blink',
+        help='Systems to generate (htmldart2js, htmldartium, _blink)')
+    parser.add_option(
+        '--output-dir',
+        dest='output_dir',
+        action='store',
+        type='string',
+        default=None,
+        help='Directory to put the generated files')
+    parser.add_option(
+        '--use-database-cache',
+        dest='use_database_cache',
+        action='store_true',
+        default=False,
+        help='''Use the cached database from the previous run to
                     improve startup performance''')
-  parser.add_option('--update-dom-metadata', dest='update_dom_metadata',
-                    action='store_true',
-                    default=False,
-                    help='''Update the metadata list of DOM APIs''')
-  parser.add_option('--verbose', dest='logging_level',
-                    action='store_false', default=logging.WARNING,
-                    help='Output all informational messages')
-  parser.add_option('--examine', dest='examine_idls',
-                    action='store_true', default=None,
-                    help='Analyze IDL files')
-  parser.add_option('--logging', dest='logging', type='int',
-                    action='store', default=logging.NOTSET,
-                    help='Level of logging 20 is Info, 30 is Warnings, 40 is Errors')
-  parser.add_option('--gen-interop', dest='dart_js_interop',
-                    action='store_true', default=False,
-                    help='Use Javascript objects (dart:js) accessing the DOM in _blink')
-  parser.add_option('--no-cached-patches', dest='no_cached_patches',
-                    action='store_true', default=False,
-                    help='Do not generate the sdk/lib/js/cached_patches.dart file')
+    parser.add_option(
+        '--update-dom-metadata',
+        dest='update_dom_metadata',
+        action='store_true',
+        default=False,
+        help='''Update the metadata list of DOM APIs''')
+    parser.add_option(
+        '--verbose',
+        dest='logging_level',
+        action='store_false',
+        default=logging.WARNING,
+        help='Output all informational messages')
+    parser.add_option(
+        '--examine',
+        dest='examine_idls',
+        action='store_true',
+        default=None,
+        help='Analyze IDL files')
+    parser.add_option(
+        '--logging',
+        dest='logging',
+        type='int',
+        action='store',
+        default=logging.NOTSET,
+        help='Level of logging 20 is Info, 30 is Warnings, 40 is Errors')
+    parser.add_option(
+        '--gen-interop',
+        dest='dart_js_interop',
+        action='store_true',
+        default=False,
+        help='Use Javascript objects (dart:js) accessing the DOM in _blink')
+    parser.add_option(
+        '--no-cached-patches',
+        dest='no_cached_patches',
+        action='store_true',
+        default=False,
+        help='Do not generate the sdk/lib/js/cached_patches.dart file')
 
-  (options, args) = parser.parse_args()
+    (options, args) = parser.parse_args()
 
-  current_dir = os.path.dirname(__file__)
-  database_dir = os.path.join(current_dir, '..', 'database')
-  logging.config.fileConfig(os.path.join(current_dir, 'logging.conf'))
-  systems = options.systems.split(',')
+    current_dir = os.path.dirname(__file__)
+    database_dir = os.path.join(current_dir, '..', 'database')
+    logging.config.fileConfig(os.path.join(current_dir, 'logging.conf'))
+    systems = options.systems.split(',')
 
-  output_dir = options.output_dir or os.path.join(
-      current_dir, '..', '..', '..', utils.GetBuildDir(utils.GuessOS()),
-      'generated')
+    output_dir = options.output_dir or os.path.join(
+        current_dir, '..', '..', '..', utils.GetBuildDir(utils.GuessOS()),
+        'generated')
 
-  dart2js_output_dir = None
-  if 'htmldart2js' in systems:
-    dart2js_output_dir = os.path.join(output_dir, 'dart2js')
+    dart2js_output_dir = None
+    if 'htmldart2js' in systems:
+        dart2js_output_dir = os.path.join(output_dir, 'dart2js')
 
-  logging_level = options.logging_level \
-    if options.logging == logging.NOTSET else options.logging
+    logging_level = options.logging_level \
+      if options.logging == logging.NOTSET else options.logging
 
-  start_time = time.time()
+    start_time = time.time()
 
-  UpdateCssProperties()
+    UpdateCssProperties()
 
-  # Parse the IDL and create the database.
-  database = fremontcutbuilder.main(options.parallel, logging_level=logging_level, examine_idls=options.examine_idls)
+    # Parse the IDL and create the database.
+    database = fremontcutbuilder.main(
+        options.parallel,
+        logging_level=logging_level,
+        examine_idls=options.examine_idls)
 
-  GenerateFromDatabase(database,
-                       dart2js_output_dir,
-                       options.update_dom_metadata,
-                       logging_level,
-                       options.dart_js_interop)
+    GenerateFromDatabase(database, dart2js_output_dir,
+                         options.update_dom_metadata, logging_level,
+                         options.dart_js_interop)
 
-  file_generation_start_time = time.time()
+    file_generation_start_time = time.time()
 
-  if 'htmldart2js' in systems:
-    _logger.info('Generating dart2js single files.')
+    if 'htmldart2js' in systems:
+        _logger.info('Generating dart2js single files.')
 
-    for library_name in HTML_LIBRARY_NAMES:
-      GenerateSingleFile(
-          os.path.join(dart2js_output_dir, '%s_dart2js.dart' % library_name),
-          os.path.join('..', '..', '..', 'sdk', 'lib', library_name, 'dart2js'))
+        for library_name in HTML_LIBRARY_NAMES:
+            GenerateSingleFile(
+                os.path.join(dart2js_output_dir,
+                             '%s_dart2js.dart' % library_name),
+                os.path.join('..', '..', '..', 'sdk', 'lib', library_name,
+                             'dart2js'))
 
-  print '\nGenerating single file %s seconds' % round(time.time() - file_generation_start_time, 2)
+    print '\nGenerating single file %s seconds' % round(
+        time.time() - file_generation_start_time, 2)
 
-  end_time = time.time()
+    end_time = time.time()
 
-  print '\nDone (dartdomgenerator) %s seconds' % round(end_time - start_time, 2)
+    print '\nDone (dartdomgenerator) %s seconds' % round(
+        end_time - start_time, 2)
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/dom/scripts/dartgenerator.py b/tools/dom/scripts/dartgenerator.py
index 8faa945..eb5674e 100755
--- a/tools/dom/scripts/dartgenerator.py
+++ b/tools/dom/scripts/dartgenerator.py
@@ -2,7 +2,6 @@
 # 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 module generates Dart APIs from the IDL database."""
 
 import emitter
@@ -16,102 +15,109 @@
 
 _logger = logging.getLogger('dartgenerator')
 
-def MergeNodes(node, other):
-  node.operations.extend(other.operations)
-  for attribute in other.attributes:
-    if not node.has_attribute(attribute):
-      node.attributes.append(attribute)
 
-  node.constants.extend(other.constants)
+def MergeNodes(node, other):
+    node.operations.extend(other.operations)
+    for attribute in other.attributes:
+        if not node.has_attribute(attribute):
+            node.attributes.append(attribute)
+
+    node.constants.extend(other.constants)
+
 
 class DartGenerator(object):
-  """Utilities to generate Dart APIs and corresponding JavaScript."""
+    """Utilities to generate Dart APIs and corresponding JavaScript."""
 
-  def __init__(self, logging_level=logging.WARNING):
-    self._auxiliary_files = {}
-    self._dart_templates_re = re.compile(r'[\w.:]+<([\w \.<>:]+)>')
-    _logger.setLevel(logging_level)
+    def __init__(self, logging_level=logging.WARNING):
+        self._auxiliary_files = {}
+        self._dart_templates_re = re.compile(r'[\w.:]+<([\w \.<>:]+)>')
+        _logger.setLevel(logging_level)
 
-  def _StripModules(self, type_name):
-    return type_name.split('::')[-1]
+    def _StripModules(self, type_name):
+        return type_name.split('::')[-1]
 
-  def _IsCompoundType(self, database, type_name):
-    if IsRegisteredType(type_name):
-      return True
+    def _IsCompoundType(self, database, type_name):
+        if IsRegisteredType(type_name):
+            return True
 
-    # References a typedef - normally a union type.
-    if database.HasTypeDef(type_name):
-      return True
+        # References a typedef - normally a union type.
+        if database.HasTypeDef(type_name):
+            return True
 
-    if type_name.endswith('?'):
-      return self._IsCompoundType(database, type_name[:-len('?')])
+        if type_name.endswith('?'):
+            return self._IsCompoundType(database, type_name[:-len('?')])
 
-    if type_name.endswith('[]'):
-      return self._IsCompoundType(database, type_name[:-len('[]')])
+        if type_name.endswith('[]'):
+            return self._IsCompoundType(database, type_name[:-len('[]')])
 
-    stripped_type_name = self._StripModules(type_name)
-    if (database.HasInterface(stripped_type_name) or
-        database.HasDictionary(stripped_type_name)):
-      return True
+        stripped_type_name = self._StripModules(type_name)
+        if (database.HasInterface(stripped_type_name) or
+                database.HasDictionary(stripped_type_name)):
+            return True
 
-    if database.HasEnum(stripped_type_name):
-      return True
+        if database.HasEnum(stripped_type_name):
+            return True
 
-    dart_template_match = self._dart_templates_re.match(type_name)
-    if dart_template_match:
-      # Dart templates
-      parent_type_name = type_name[0 : dart_template_match.start(1) - 1]
-      sub_type_name = dart_template_match.group(1)
-      return (self._IsCompoundType(database, parent_type_name) and
-              self._IsCompoundType(database, sub_type_name))
-    return False
+        dart_template_match = self._dart_templates_re.match(type_name)
+        if dart_template_match:
+            # Dart templates
+            parent_type_name = type_name[0:dart_template_match.start(1) - 1]
+            sub_type_name = dart_template_match.group(1)
+            return (self._IsCompoundType(database, parent_type_name) and
+                    self._IsCompoundType(database, sub_type_name))
+        return False
 
-  def _IsDartType(self, type_name):
-    return '.' in type_name
+    def _IsDartType(self, type_name):
+        return '.' in type_name
 
-  def LoadAuxiliary(self, auxiliary_dir):
-    def Visitor(_, dirname, names):
-      for name in names:
-        if name.endswith('.dart'):
-          name = name[0:-5]  # strip off ".dart"
-        self._auxiliary_files[name] = os.path.join(dirname, name)
-    os.path.walk(auxiliary_dir, Visitor, None)
+    def LoadAuxiliary(self, auxiliary_dir):
 
-  def FilterMembersWithUnidentifiedTypes(self, database):
-    """Removes unidentified types.
+        def Visitor(_, dirname, names):
+            for name in names:
+                if name.endswith('.dart'):
+                    name = name[0:-5]  # strip off ".dart"
+                self._auxiliary_files[name] = os.path.join(dirname, name)
+
+        os.path.walk(auxiliary_dir, Visitor, None)
+
+    def FilterMembersWithUnidentifiedTypes(self, database):
+        """Removes unidentified types.
 
     Removes constants, attributes, operations and parents with unidentified
     types.
     """
 
-    for interface in database.GetInterfaces():
-      def IsIdentified(idl_node):
-        node_name = idl_node.id if idl_node.id else 'parent'
-        for idl_type in idl_node.all(idlnode.IDLType):
-          type_name = idl_type.id
-          if (type_name is not None and
-              self._IsCompoundType(database, type_name)):
-            continue
-          # Ignore constructor warnings.
-          if not (interface.id in ['Window', 'WorkerContext',
-              'WorkerGlobalScope'] and
-              type_name.endswith('Constructor')):
-            _logger.warn('removing %s in %s which has unidentified type %s' %
-                       (node_name, interface.id, type_name))
-          return False
-        return True
+        for interface in database.GetInterfaces():
 
-      interface.constants = filter(IsIdentified, interface.constants)
-      interface.attributes = filter(IsIdentified, interface.attributes)
-      interface.operations = filter(IsIdentified, interface.operations)
-      interface.parents = filter(IsIdentified, interface.parents)
+            def IsIdentified(idl_node):
+                node_name = idl_node.id if idl_node.id else 'parent'
+                for idl_type in idl_node.all(idlnode.IDLType):
+                    type_name = idl_type.id
+                    if (type_name is not None and
+                            self._IsCompoundType(database, type_name)):
+                        continue
+                    # Ignore constructor warnings.
+                    if not (interface.id in [
+                            'Window', 'WorkerContext', 'WorkerGlobalScope'
+                    ] and type_name.endswith('Constructor')):
+                        _logger.warn(
+                            'removing %s in %s which has unidentified type %s' %
+                            (node_name, interface.id, type_name))
+                    return False
+                return True
 
-  def FilterInterfaces(self, database,
-                       and_annotations=[],
-                       or_annotations=[],
-                       exclude_displaced=[],
-                       exclude_suppressed=[]):
-    """Filters a database to remove interfaces and members that are missing
+            interface.constants = filter(IsIdentified, interface.constants)
+            interface.attributes = filter(IsIdentified, interface.attributes)
+            interface.operations = filter(IsIdentified, interface.operations)
+            interface.parents = filter(IsIdentified, interface.parents)
+
+    def FilterInterfaces(self,
+                         database,
+                         and_annotations=[],
+                         or_annotations=[],
+                         exclude_displaced=[],
+                         exclude_suppressed=[]):
+        """Filters a database to remove interfaces and members that are missing
     annotations.
 
     The FremontCut IDLs use annotations to specify implementation
@@ -131,142 +137,149 @@
         is marked as suppressed it will always be filtered.
     """
 
-    # Filter interfaces and members whose annotations don't match.
-    for interface in database.GetInterfaces():
-      def HasAnnotations(idl_node):
-        """Utility for determining if an IDLNode has all
+        # Filter interfaces and members whose annotations don't match.
+        for interface in database.GetInterfaces():
+
+            def HasAnnotations(idl_node):
+                """Utility for determining if an IDLNode has all
         the required annotations"""
-        for a in exclude_displaced:
-          if (a in idl_node.annotations
-              and 'via' in idl_node.annotations[a]):
-            return False
-        for a in exclude_suppressed:
-          if (a in idl_node.annotations
-              and 'suppressed' in idl_node.annotations[a]):
-            return False
-        for a in or_annotations:
-          if a in idl_node.annotations:
+                for a in exclude_displaced:
+                    if (a in idl_node.annotations and
+                            'via' in idl_node.annotations[a]):
+                        return False
+                for a in exclude_suppressed:
+                    if (a in idl_node.annotations and
+                            'suppressed' in idl_node.annotations[a]):
+                        return False
+                for a in or_annotations:
+                    if a in idl_node.annotations:
+                        return True
+                if and_annotations == []:
+                    return False
+                for a in and_annotations:
+                    if a not in idl_node.annotations:
+                        return False
+                return True
+
+            if HasAnnotations(interface):
+                interface.constants = filter(HasAnnotations,
+                                             interface.constants)
+                interface.attributes = filter(HasAnnotations,
+                                              interface.attributes)
+                interface.operations = filter(HasAnnotations,
+                                              interface.operations)
+                interface.parents = filter(HasAnnotations, interface.parents)
+            else:
+                database.DeleteInterface(interface.id)
+
+        self.FilterMembersWithUnidentifiedTypes(database)
+
+    def Generate(self, database, super_database, generate_interface):
+        self._database = database
+
+        # Collect interfaces
+        interfaces = []
+        for interface in database.GetInterfaces():
+            if not MatchSourceFilter(interface):
+                # Skip this interface since it's not present in the required source
+                _logger.info('Omitting interface - %s' % interface.id)
+                continue
+            interfaces.append(interface)
+
+        # All web_gl constants from WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers are generated
+        # in a synthesized class WebGL.  Those IDLConstants are in web_gl_constants.
+        web_gl_constants = []
+
+        # Render all interfaces into Dart and save them in files.
+        for interface in self._PreOrderInterfaces(interfaces):
+            interface_name = interface.id
+            auxiliary_file = self._auxiliary_files.get(interface_name)
+            if auxiliary_file is not None:
+                _logger.info('Skipping %s because %s exists' % (interface_name,
+                                                                auxiliary_file))
+                continue
+
+            _logger.info('Generating %s' % interface.id)
+            generate_interface(interface, gl_constants=web_gl_constants)
+
+        # Generate the WEB_GL constants
+        web_gl_constants_interface = IDLInterface(None, "WebGL")
+        web_gl_constants_interface.constants = web_gl_constants
+        self._database._all_interfaces['WebGL'] = web_gl_constants_interface
+        generate_interface(web_gl_constants_interface)
+
+    def _PreOrderInterfaces(self, interfaces):
+        """Returns the interfaces in pre-order, i.e. parents first."""
+        seen = set()
+        ordered = []
+
+        def visit(interface):
+            if interface.id in seen:
+                return
+            seen.add(interface.id)
+            for parent in interface.parents:
+                if IsDartCollectionType(parent.type.id):
+                    continue
+                if self._database.HasInterface(parent.type.id):
+                    parent_interface = self._database.GetInterface(
+                        parent.type.id)
+                    visit(parent_interface)
+            ordered.append(interface)
+
+        for interface in interfaces:
+            visit(interface)
+        return ordered
+
+    def IsEventTarget(self, database, interface):
+        if interface.id == 'EventTarget':
             return True
-        if and_annotations == []:
-          return False
-        for a in and_annotations:
-          if a not in idl_node.annotations:
-            return False
-        return True
+        for parent in interface.parents:
+            parent_name = parent.type.id
+            if database.HasInterface(parent_name):
+                parent_interface = database.GetInterface(parent.type.id)
+                if self.IsEventTarget(database, parent_interface):
+                    return True
+        return False
 
-      if HasAnnotations(interface):
-        interface.constants = filter(HasAnnotations, interface.constants)
-        interface.attributes = filter(HasAnnotations, interface.attributes)
-        interface.operations = filter(HasAnnotations, interface.operations)
-        interface.parents = filter(HasAnnotations, interface.parents)
-      else:
-        database.DeleteInterface(interface.id)
+    def FixEventTargets(self, database):
+        for interface in database.GetInterfaces():
+            if self.IsEventTarget(database, interface):
+                # Add as an attribute for easy querying in generation code.
+                interface.ext_attrs['EventTarget'] = None
+            elif 'EventTarget' in interface.ext_attrs:
+                # Create fake EventTarget parent interface for interfaces that have
+                # 'EventTarget' extended attribute.
+                ast = [('Annotation', [('Id', 'WebKit')]),
+                       ('InterfaceType', ('ScopedName', 'EventTarget'))]
+                interface.parents.append(idlnode.IDLParentInterface(ast))
 
-    self.FilterMembersWithUnidentifiedTypes(database)
+    def AddMissingArguments(self, database):
+        ARG = idlnode.IDLArgument([('Type', ('ScopedName', 'object')),
+                                   ('Id', 'arg')])
+        for interface in database.GetInterfaces():
+            for operation in interface.operations:
+                call_with = operation.ext_attrs.get('CallWith', [])
+                if not (isinstance(call_with, list)):
+                    call_with = [call_with]
+                constructor_with = operation.ext_attrs.get(
+                    'ConstructorCallWith', [])
+                if not (isinstance(constructor_with, list)):
+                    constructor_with = [constructor_with]
+                call_with = call_with + constructor_with
 
-  def Generate(self, database, super_database, generate_interface):
-    self._database = database
+                if 'ScriptArguments' in call_with:
+                    operation.arguments.append(ARG)
 
-    # Collect interfaces
-    interfaces = []
-    for interface in database.GetInterfaces():
-      if not MatchSourceFilter(interface):
-        # Skip this interface since it's not present in the required source
-        _logger.info('Omitting interface - %s' % interface.id)
-        continue
-      interfaces.append(interface)
+    def CleanupOperationArguments(self, database):
+        for interface in database.GetInterfaces():
+            for operation in interface.operations:
+                # TODO(terry): Hack to remove 3rd arguments in setInterval/setTimeout.
+                if ((operation.id == 'setInterval' or operation.id == 'setTimeout') and \
+                    operation.arguments[0].type.id == 'any'):
+                    operation.arguments.pop(2)
 
-    # All web_gl constants from WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers are generated
-    # in a synthesized class WebGL.  Those IDLConstants are in web_gl_constants.
-    web_gl_constants = []
-
-    # Render all interfaces into Dart and save them in files.
-    for interface in self._PreOrderInterfaces(interfaces):
-      interface_name = interface.id
-      auxiliary_file = self._auxiliary_files.get(interface_name)
-      if auxiliary_file is not None:
-        _logger.info('Skipping %s because %s exists' % (
-            interface_name, auxiliary_file))
-        continue
-
-      _logger.info('Generating %s' % interface.id)
-      generate_interface(interface, gl_constants = web_gl_constants)
-
-    # Generate the WEB_GL constants
-    web_gl_constants_interface = IDLInterface(None, "WebGL")
-    web_gl_constants_interface.constants = web_gl_constants
-    self._database._all_interfaces['WebGL'] = web_gl_constants_interface
-    generate_interface(web_gl_constants_interface)
-
-  def _PreOrderInterfaces(self, interfaces):
-    """Returns the interfaces in pre-order, i.e. parents first."""
-    seen = set()
-    ordered = []
-    def visit(interface):
-      if interface.id in seen:
-        return
-      seen.add(interface.id)
-      for parent in interface.parents:
-        if IsDartCollectionType(parent.type.id):
-          continue
-        if self._database.HasInterface(parent.type.id):
-          parent_interface = self._database.GetInterface(parent.type.id)
-          visit(parent_interface)
-      ordered.append(interface)
-
-    for interface in interfaces:
-      visit(interface)
-    return ordered
-
-  def IsEventTarget(self, database, interface):
-    if interface.id == 'EventTarget':
-      return True
-    for parent in interface.parents:
-      parent_name = parent.type.id
-      if database.HasInterface(parent_name):
-        parent_interface = database.GetInterface(parent.type.id)
-        if self.IsEventTarget(database, parent_interface):
-          return True
-    return False
-
-  def FixEventTargets(self, database):
-    for interface in database.GetInterfaces():
-      if self.IsEventTarget(database, interface):
-        # Add as an attribute for easy querying in generation code.
-        interface.ext_attrs['EventTarget'] = None
-      elif 'EventTarget' in interface.ext_attrs:
-        # Create fake EventTarget parent interface for interfaces that have
-        # 'EventTarget' extended attribute.
-        ast = [('Annotation', [('Id', 'WebKit')]),
-               ('InterfaceType', ('ScopedName', 'EventTarget'))]
-        interface.parents.append(idlnode.IDLParentInterface(ast))
-
-  def AddMissingArguments(self, database):
-    ARG = idlnode.IDLArgument([('Type', ('ScopedName', 'object')), ('Id', 'arg')])
-    for interface in database.GetInterfaces():
-      for operation in interface.operations:
-        call_with = operation.ext_attrs.get('CallWith', [])
-        if not(isinstance(call_with, list)):
-          call_with = [call_with]
-        constructor_with = operation.ext_attrs.get('ConstructorCallWith', [])
-        if not(isinstance(constructor_with, list)):
-          constructor_with = [constructor_with]
-        call_with = call_with + constructor_with
-
-        if 'ScriptArguments' in call_with:
-          operation.arguments.append(ARG)
-
-  def CleanupOperationArguments(self, database):
-    for interface in database.GetInterfaces():
-      for operation in interface.operations:
-        # TODO(terry): Hack to remove 3rd arguments in setInterval/setTimeout.
-        if ((operation.id == 'setInterval' or operation.id == 'setTimeout') and \
-            operation.arguments[0].type.id == 'any'):
-          operation.arguments.pop(2)
-
-        # Massage any operation argument type that is IDLEnum to String.
-        for index, argument in enumerate(operation.arguments):
-          type_name = argument.type.id
-          if database.HasEnum(type_name):
-            operation.arguments[index].type = IDLType('DOMString')
-
+                # Massage any operation argument type that is IDLEnum to String.
+                for index, argument in enumerate(operation.arguments):
+                    type_name = argument.type.id
+                    if database.HasEnum(type_name):
+                        operation.arguments[index].type = IDLType('DOMString')
diff --git a/tools/dom/scripts/dartgenerator_test.py b/tools/dom/scripts/dartgenerator_test.py
index f065eb2..cfd7b2e 100755
--- a/tools/dom/scripts/dartgenerator_test.py
+++ b/tools/dom/scripts/dartgenerator_test.py
@@ -2,7 +2,6 @@
 # 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 for dartgenerator."""
 
 import logging.config
@@ -19,76 +18,75 @@
 
 class DartGeneratorTestCase(unittest.TestCase):
 
-  def _InDatabase(self, interface_name):
-    return os.path.exists(os.path.join(self._database_dir,
-                                       '%s.idl' % interface_name))
+    def _InDatabase(self, interface_name):
+        return os.path.exists(
+            os.path.join(self._database_dir, '%s.idl' % interface_name))
 
-  def _FilePathForDartInterface(self, interface_name):
-    return os.path.join(self._generator._output_dir, 'src', 'interface',
-                        '%s.dart' % interface_name)
+    def _FilePathForDartInterface(self, interface_name):
+        return os.path.join(self._generator._output_dir, 'src', 'interface',
+                            '%s.dart' % interface_name)
 
-  def _InOutput(self, interface_name):
-    return os.path.exists(
-        self._FilePathForDartInterface(interface_name))
+    def _InOutput(self, interface_name):
+        return os.path.exists(self._FilePathForDartInterface(interface_name))
 
-  def _ReadOutputFile(self, interface_name):
-    self.assertTrue(self._InOutput(interface_name))
-    file_path = self._FilePathForDartInterface(interface_name)
-    f = open(file_path, 'r')
-    content = f.read()
-    f.close()
-    return content, file_path
+    def _ReadOutputFile(self, interface_name):
+        self.assertTrue(self._InOutput(interface_name))
+        file_path = self._FilePathForDartInterface(interface_name)
+        f = open(file_path, 'r')
+        content = f.read()
+        f.close()
+        return content, file_path
 
-  def _AssertOutputSansHeaderEquals(self, interface_name, expected_content):
-    full_actual_content, file_path = self._ReadOutputFile(interface_name)
-    # Remove file header comments in // or multiline /* ... */ syntax.
-    header_re = re.compile(r'^(\s*(//.*|/\*([^*]|\*[^/])*\*/)\s*)*')
-    actual_content = header_re.sub('', full_actual_content)
-    if expected_content != actual_content:
-      msg = """
+    def _AssertOutputSansHeaderEquals(self, interface_name, expected_content):
+        full_actual_content, file_path = self._ReadOutputFile(interface_name)
+        # Remove file header comments in // or multiline /* ... */ syntax.
+        header_re = re.compile(r'^(\s*(//.*|/\*([^*]|\*[^/])*\*/)\s*)*')
+        actual_content = header_re.sub('', full_actual_content)
+        if expected_content != actual_content:
+            msg = """
 FILE: %s
 EXPECTED:
 %s
 ACTUAL:
 %s
 """ % (file_path, expected_content, actual_content)
-      self.fail(msg)
+            self.fail(msg)
 
-  def _AssertOutputContains(self, interface_name, expected_content):
-    actual_content, file_path = self._ReadOutputFile(interface_name)
-    if expected_content not in actual_content:
-      msg = """
+    def _AssertOutputContains(self, interface_name, expected_content):
+        actual_content, file_path = self._ReadOutputFile(interface_name)
+        if expected_content not in actual_content:
+            msg = """
 STRING: %s
 Was found not in output file: %s
 FILE CONTENT:
 %s
 """ % (expected_content, file_path, actual_content)
-      self.fail(msg)
+            self.fail(msg)
 
-  def _AssertOutputDoesNotContain(self, interface_name, expected_content):
-    actual_content, file_path = self._ReadOutputFile(interface_name)
-    if expected_content in actual_content:
-      msg = """
+    def _AssertOutputDoesNotContain(self, interface_name, expected_content):
+        actual_content, file_path = self._ReadOutputFile(interface_name)
+        if expected_content in actual_content:
+            msg = """
 STRING: %s
 Was found in output file: %s
 FILE CONTENT:
 %s
 """ % (expected_content, file_path, actual_content)
-      self.fail(msg)
+            self.fail(msg)
 
-  def setUp(self):
-    self._working_dir = tempfile.mkdtemp()
-    self._output_dir = os.path.join(self._working_dir, 'output')
-    self._database_dir = os.path.join(self._working_dir, 'database')
-    self._auxiliary_dir = os.path.join(self._working_dir, 'auxiliary')
-    self.assertFalse(os.path.exists(self._database_dir))
+    def setUp(self):
+        self._working_dir = tempfile.mkdtemp()
+        self._output_dir = os.path.join(self._working_dir, 'output')
+        self._database_dir = os.path.join(self._working_dir, 'database')
+        self._auxiliary_dir = os.path.join(self._working_dir, 'auxiliary')
+        self.assertFalse(os.path.exists(self._database_dir))
 
-    # Create database and add one interface.
-    db = database.Database(self._database_dir)
-    os.mkdir(self._auxiliary_dir)
-    self.assertTrue(os.path.exists(self._database_dir))
+        # Create database and add one interface.
+        db = database.Database(self._database_dir)
+        os.mkdir(self._auxiliary_dir)
+        self.assertTrue(os.path.exists(self._database_dir))
 
-    content = """
+        content = """
     module shapes {
       @A1 @A2
       interface Shape {
@@ -120,50 +118,50 @@
     };
     """
 
-    parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
-    ast = parser.parse(content)
-    idl_file = idlnode.IDLFile(ast)
-    for interface in idl_file.interfaces:
-      db.AddInterface(interface)
-    db.Save()
+        parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+        ast = parser.parse(content)
+        idl_file = idlnode.IDLFile(ast)
+        for interface in idl_file.interfaces:
+            db.AddInterface(interface)
+        db.Save()
 
-    self.assertTrue(self._InDatabase('Shape'))
-    self.assertTrue(self._InDatabase('Rectangle'))
-    self.assertTrue(self._InDatabase('Line'))
+        self.assertTrue(self._InDatabase('Shape'))
+        self.assertTrue(self._InDatabase('Rectangle'))
+        self.assertTrue(self._InDatabase('Line'))
 
-    self._database = database.Database(self._database_dir)
-    self._generator = dartgenerator.DartGenerator(self._auxiliary_dir,
-                                                  '../templates',
-                                                  'test')
+        self._database = database.Database(self._database_dir)
+        self._generator = dartgenerator.DartGenerator(self._auxiliary_dir,
+                                                      '../templates', 'test')
 
-  def tearDown(self):
-    shutil.rmtree(self._database_dir)
-    shutil.rmtree(self._auxiliary_dir)
+    def tearDown(self):
+        shutil.rmtree(self._database_dir)
+        shutil.rmtree(self._auxiliary_dir)
 
-  def testBasicGeneration(self):
-    # Generate all interfaces:
-    self._database.Load()
-    self._generator.Generate(self._database, self._output_dir)
-    self._generator.Flush()
+    def testBasicGeneration(self):
+        # Generate all interfaces:
+        self._database.Load()
+        self._generator.Generate(self._database, self._output_dir)
+        self._generator.Flush()
 
-    self.assertTrue(self._InOutput('Shape'))
-    self.assertTrue(self._InOutput('Rectangle'))
-    self.assertTrue(self._InOutput('Line'))
+        self.assertTrue(self._InOutput('Shape'))
+        self.assertTrue(self._InOutput('Rectangle'))
+        self.assertTrue(self._InOutput('Line'))
 
-  def testFilterByAnnotations(self):
-    self._database.Load()
-    self._generator.FilterInterfaces(self._database, ['A1', 'A2'], ['A3'])
-    self._generator.Generate(self._database, self._output_dir)
-    self._generator.Flush()
+    def testFilterByAnnotations(self):
+        self._database.Load()
+        self._generator.FilterInterfaces(self._database, ['A1', 'A2'], ['A3'])
+        self._generator.Generate(self._database, self._output_dir)
+        self._generator.Flush()
 
-    # Only interfaces with (@A1 and @A2) or @A3 should be generated:
-    self.assertTrue(self._InOutput('Shape'))
-    self.assertTrue(self._InOutput('Rectangle'))
-    self.assertFalse(self._InOutput('Line'))
+        # Only interfaces with (@A1 and @A2) or @A3 should be generated:
+        self.assertTrue(self._InOutput('Shape'))
+        self.assertTrue(self._InOutput('Rectangle'))
+        self.assertFalse(self._InOutput('Line'))
 
-    # Only members with (@A1 and @A2) or @A3 should be generated:
-    # TODO(sra): make th
-    self._AssertOutputSansHeaderEquals('Shape', """interface Shape {
+        # Only members with (@A1 and @A2) or @A3 should be generated:
+        # TODO(sra): make th
+        self._AssertOutputSansHeaderEquals(
+            'Shape', """interface Shape {
 
   final int attr;
 
@@ -171,66 +169,58 @@
 }
 """)
 
-    self._AssertOutputContains('Rectangle',
-                               'interface Rectangle extends shapes::Shape')
+        self._AssertOutputContains('Rectangle',
+                                   'interface Rectangle extends shapes::Shape')
 
-  def testTypeRenames(self):
-    self._database.Load()
-    # Translate 'Shape' to spanish:
-    self._generator.RenameTypes(self._database, {'Shape': 'Forma'}, False)
-    self._generator.Generate(self._database, self._output_dir)
-    self._generator.Flush()
+    def testTypeRenames(self):
+        self._database.Load()
+        # Translate 'Shape' to spanish:
+        self._generator.RenameTypes(self._database, {'Shape': 'Forma'}, False)
+        self._generator.Generate(self._database, self._output_dir)
+        self._generator.Flush()
 
-    # Validate that all references to Shape have been converted:
-    self._AssertOutputContains('Forma',
-                               'interface Forma')
-    self._AssertOutputContains('Forma', 'Forma create();')
-    self._AssertOutputContains('Forma',
-                               'bool compare(Forma s);')
-    self._AssertOutputContains('Rectangle',
-                               'interface Rectangle extends Forma')
+        # Validate that all references to Shape have been converted:
+        self._AssertOutputContains('Forma', 'interface Forma')
+        self._AssertOutputContains('Forma', 'Forma create();')
+        self._AssertOutputContains('Forma', 'bool compare(Forma s);')
+        self._AssertOutputContains('Rectangle',
+                                   'interface Rectangle extends Forma')
 
-  def testQualifiedDartTypes(self):
-    self._database.Load()
-    self._generator.FilterMembersWithUnidentifiedTypes(self._database)
-    self._generator.Generate(self._database, self._output_dir)
-    self._generator.Flush()
+    def testQualifiedDartTypes(self):
+        self._database.Load()
+        self._generator.FilterMembersWithUnidentifiedTypes(self._database)
+        self._generator.Generate(self._database, self._output_dir)
+        self._generator.Flush()
 
-    # Verify primitive conversions are working:
-    self._AssertOutputContains('Shape',
-                               'static const int CONSTANT = 1')
-    self._AssertOutputContains('Shape',
-                               'final String strAttr;')
+        # Verify primitive conversions are working:
+        self._AssertOutputContains('Shape', 'static const int CONSTANT = 1')
+        self._AssertOutputContains('Shape', 'final String strAttr;')
 
-    # Verify interface names are converted:
-    self._AssertOutputContains('Shape',
-                               'interface Shape {')
-    self._AssertOutputContains('Shape',
-                               ' Shape create();')
-    # TODO(sra): Why is this broken? Output contains qualified type.
-    #self._AssertOutputContains('Shape',
-    #                           'void addLine(Line line);')
-    self._AssertOutputContains('Shape',
-                               'Rectangle createRectangle();')
-    # TODO(sra): Why is this broken? Output contains qualified type.
-    #self._AssertOutputContains('Rectangle',
-    #                           'interface Rectangle extends Shape')
-    # Verify dart names are preserved:
-    # TODO(vsm): Re-enable when package / namespaces are enabled.
-    # self._AssertOutputContains('shapes', 'Shape',
-    #   'void someDartType(File file);')
+        # Verify interface names are converted:
+        self._AssertOutputContains('Shape', 'interface Shape {')
+        self._AssertOutputContains('Shape', ' Shape create();')
+        # TODO(sra): Why is this broken? Output contains qualified type.
+        #self._AssertOutputContains('Shape',
+        #                           'void addLine(Line line);')
+        self._AssertOutputContains('Shape', 'Rectangle createRectangle();')
+        # TODO(sra): Why is this broken? Output contains qualified type.
+        #self._AssertOutputContains('Rectangle',
+        #                           'interface Rectangle extends Shape')
+        # Verify dart names are preserved:
+        # TODO(vsm): Re-enable when package / namespaces are enabled.
+        # self._AssertOutputContains('shapes', 'Shape',
+        #   'void someDartType(File file);')
 
-    # Verify that unidentified types are not removed:
-    self._AssertOutputDoesNotContain('Shape',
-                                     'someUnidentifiedType')
+        # Verify that unidentified types are not removed:
+        self._AssertOutputDoesNotContain('Shape', 'someUnidentifiedType')
 
-    # Verify template conversion:
-    # TODO(vsm): Re-enable when core collections are supported.
-    # self._AssertOutputContains('rectangles', 'Rectangle',
-    #  'void someTemplatedType(List<Shape> list)')
+        # Verify template conversion:
+        # TODO(vsm): Re-enable when core collections are supported.
+        # self._AssertOutputContains('rectangles', 'Rectangle',
+        #  'void someTemplatedType(List<Shape> list)')
 
 
 if __name__ == '__main__':
-  logging.config.fileConfig('logging.conf')
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig('logging.conf')
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/dartmetadata.py b/tools/dom/scripts/dartmetadata.py
index a5a92f1..f7a6bcb 100644
--- a/tools/dom/scripts/dartmetadata.py
+++ b/tools/dom/scripts/dartmetadata.py
@@ -2,7 +2,6 @@
 # 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 module provides shared functionality to provide Dart metadata for
 DOM APIs.
 """
@@ -27,882 +26,928 @@
 #   -TYPE:            add annotations only if there are no member annotations.
 #   TYPE:             add regardless of member annotations.
 
-_dart2js_annotations = monitored.Dict('dartmetadata._dart2js_annotations', {
+_dart2js_annotations = monitored.Dict(
+    'dartmetadata._dart2js_annotations',
+    {
+        'AnimationEffectTiming.duration': [
+            "@Creates('Null')",
+            "@Returns('num|String')",
+        ],
+        'ArrayBufferView': [
+            "@Creates('TypedData')",
+            "@Returns('TypedData|Null')",
+        ],
+        'CanvasRenderingContext2D.createImageData': [
+            "@Creates('ImageData|=Object')",
+        ],
+        'CanvasRenderingContext2D.getImageData': [
+            "@Creates('ImageData|=Object')",
+        ],
+        'CanvasRenderingContext2D.webkitGetImageDataHD': [
+            "@Creates('ImageData|=Object')",
+        ],
+        'CanvasRenderingContext2D.fillStyle': [
+            "@Creates('String|CanvasGradient|CanvasPattern')",
+            "@Returns('String|CanvasGradient|CanvasPattern')",
+        ],
+        'CanvasRenderingContext2D.strokeStyle': [
+            "@Creates('String|CanvasGradient|CanvasPattern')",
+            "@Returns('String|CanvasGradient|CanvasPattern')",
+        ],
+        'CryptoKey.algorithm': [
+            "@Creates('Null')",
+        ],
+        'CustomEvent._detail': [
+            "@Creates('Null')",
+        ],
 
-    'AnimationEffectTiming.duration': [
-      "@Creates('Null')",
-      "@Returns('num|String')",
-     ],
+        # Normally Window is never null, but starting from a <template> element in
+        # JavaScript, this will be null:
+        #     template.content.ownerDocument.defaultView
+        'Document.window': [
+            "@Creates('Window|=Object|Null')",
+            "@Returns('Window|=Object|Null')",
+        ],
+        'Document.getElementsByClassName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'Document.getElementsByName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'Document.getElementsByTagName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
 
-    'ArrayBufferView': [
-      "@Creates('TypedData')",
-      "@Returns('TypedData|Null')",
-    ],
+        # querysSelectorAll never returns `null`.
+        'Document.querySelectorAll': [
+            "@Creates('NodeList')",
+            "@Returns('NodeList')",
+        ],
+        'DocumentFragment.querySelectorAll': [
+            "@Creates('NodeList')",
+            "@Returns('NodeList')",
+        ],
+        'Element.querySelectorAll': [
+            "@Creates('NodeList')",
+            "@Returns('NodeList')",
+        ],
+        'Element.getBoundingClientRect': [
+            "@Creates('_DomRect')",
+            "@Returns('_DomRect|Null')",  # TODO(sra): Verify and remove Null.
+        ],
+        'Element.getClientRects': [
+            "@Creates('DomRectList')",
+            "@Returns('DomRectList|Null')",
+        ],
 
-    'CanvasRenderingContext2D.createImageData': [
-      "@Creates('ImageData|=Object')",
-    ],
+        # Methods returning Window can return a local window, or a cross-frame
+        # window (=Object) that needs wrapping.
+        'Window': [
+            "@Creates('Window|=Object')",
+            "@Returns('Window|=Object')",
+        ],
+        'Window.openDatabase': [
+            "@Creates('SqlDatabase')",
+        ],
+        'Window.showModalDialog': [
+            "@Creates('Null')",
+        ],
+        'Element.webkitGetRegionFlowRanges': [
+            "@Creates('JSExtendableArray')",
+            "@Returns('JSExtendableArray')",
+        ],
+        'Element.getElementsByClassName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'Element.getElementsByName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'Element.getElementsByTagName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        "ErrorEvent.error": [
+            "@Creates('Null')",  # Only returns values created elsewhere.
+        ],
 
-    'CanvasRenderingContext2D.getImageData': [
-      "@Creates('ImageData|=Object')",
-    ],
+        # To be in callback with the browser-created Event, we had to have called
+        # addEventListener on the target, so we avoid
+        'Event.currentTarget': [
+            "@Creates('Null')",
+            "@Returns('EventTarget|=Object|Null')",
+        ],
 
-    'CanvasRenderingContext2D.webkitGetImageDataHD': [
-      "@Creates('ImageData|=Object')",
-    ],
+        # Only nodes in the DOM bubble and have target !== currentTarget.
+        'Event.target': [
+            "@Creates('Node')",
+            "@Returns('EventTarget|=Object')",
+        ],
 
-    'CanvasRenderingContext2D.fillStyle': [
-      "@Creates('String|CanvasGradient|CanvasPattern')",
-      "@Returns('String|CanvasGradient|CanvasPattern')",
-    ],
+        # TODO(sra): Investigate how ExtendableMessageEvent.data is different from
+        # MessageEvent.data. It might be necessary to put in a method to translate
+        # the JavaScript wire type into a Dart type.
+        'ExtendableMessageEvent.data': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
 
-    'CanvasRenderingContext2D.strokeStyle': [
-      "@Creates('String|CanvasGradient|CanvasPattern')",
-      "@Returns('String|CanvasGradient|CanvasPattern')",
-    ],
+        # TODO(sra): We could determine the following by parsing the compound IDL
+        # type.
+        'ExtendableMessageEvent.source': [
+            "@Creates('Client|ServiceWorker|MessagePort')",
+            "@Returns('Client|ServiceWorker|MessagePort|Null')",
+        ],
+        'File.lastModifiedDate': [
+            "@Creates('Null')",  # JS date object.
+        ],
+        'FocusEvent.relatedTarget': [
+            "@Creates('Null')",
+        ],
+        'Gamepad.buttons': [
+            "@Creates('JSExtendableArray|GamepadButton')",
+            "@Returns('JSExtendableArray')",
+        ],
+        'HTMLCanvasElement.getContext': [
+            "@Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')",
+            "@Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')",
+        ],
+        'HTMLInputElement.valueAsDate': [
+            "@Creates('Null')",  # JS date object.
+        ],
 
-    'CryptoKey.algorithm': [
-      "@Creates('Null')",
-    ],
+        # Rather than have the result of an IDBRequest as a union over all possible
+        # results, we mark the result as instantiating any classes, and mark
+        # each operation with the classes that it could cause to be asynchronously
+        # instantiated.
+        'IDBRequest.result': ["@Creates('Null')"],
 
-    'CustomEvent._detail': [
-      "@Creates('Null')",
-    ],
+        # The source is usually a participant in the operation that generated the
+        # IDBRequest.
+        'IDBRequest.source': ["@Creates('Null')"],
+        'IDBFactory.open': ["@Creates('Database')"],
+        'IDBFactory.webkitGetDatabaseNames': ["@Creates('DomStringList')"],
+        'IDBObjectStore.put': ["@_annotation_Creates_IDBKey"],
+        'IDBObjectStore.add': ["@_annotation_Creates_IDBKey"],
+        'IDBObjectStore.get': ["@annotation_Creates_SerializedScriptValue"],
+        'IDBObjectStore.openCursor': ["@Creates('Cursor')"],
+        'IDBIndex.get': ["@annotation_Creates_SerializedScriptValue"],
+        'IDBIndex.getKey': [
+            "@annotation_Creates_SerializedScriptValue",
+            # The source is the object store behind the index.
+            "@Creates('ObjectStore')",
+        ],
+        'IDBIndex.openCursor': ["@Creates('Cursor')"],
+        'IDBIndex.openKeyCursor': ["@Creates('Cursor')"],
+        'IDBCursorWithValue.value': [
+            '@annotation_Creates_SerializedScriptValue',
+            '@annotation_Returns_SerializedScriptValue',
+        ],
+        'IDBCursor.key': [
+            "@_annotation_Creates_IDBKey",
+            "@_annotation_Returns_IDBKey",
+        ],
+        'IDBCursor.primaryKey': [
+            "@_annotation_Creates_IDBKey",
+            "@_annotation_Returns_IDBKey",
+        ],
+        'IDBCursor.source': [
+            "@Creates('Null')",
+            "@Returns('ObjectStore|Index|Null')",
+        ],
+        'IDBDatabase.version': [
+            "@Creates('int|String|Null')",
+            "@Returns('int|String|Null')",
+        ],
+        'IDBIndex.keyPath': [
+            "@annotation_Creates_SerializedScriptValue",
+        ],
+        'IDBKeyRange.lower': [
+            "@annotation_Creates_SerializedScriptValue",
+        ],
+        'IDBKeyRange.upper': [
+            "@annotation_Creates_SerializedScriptValue",
+        ],
+        'IDBObjectStore.keyPath': [
+            "@annotation_Creates_SerializedScriptValue",
+        ],
+        '+IDBOpenDBRequest': [
+            "@Returns('Request')",
+            "@Creates('Request')",
+        ],
+        '+IDBRequest': [
+            "@Returns('Request')",
+            "@Creates('Request')",
+        ],
+        'IDBVersionChangeEvent.newVersion': [
+            "@Creates('int|String|Null')",
+            "@Returns('int|String|Null')",
+        ],
+        'IDBVersionChangeEvent.oldVersion': [
+            "@Creates('int|String|Null')",
+            "@Returns('int|String|Null')",
+        ],
+        'ImageData.data': [
+            "@Creates('NativeUint8ClampedList')",
+            "@Returns('NativeUint8ClampedList')",
+        ],
+        'MediaStream.getAudioTracks': [
+            "@Creates('JSExtendableArray|MediaStreamTrack')",
+            "@Returns('JSExtendableArray')",
+        ],
+        'MediaStream.getVideoTracks': [
+            "@Creates('JSExtendableArray|MediaStreamTrack')",
+            "@Returns('JSExtendableArray')",
+        ],
+        'MessageEvent.data': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
+        'MessageEvent.ports': ["@Creates('JSExtendableArray')"],
+        'MessageEvent.source': [
+            "@Creates('Null')",
+            "@Returns('EventTarget|=Object')",
+        ],
+        'Metadata.modificationTime': [
+            "@Creates('Null')",  # JS date object.
+        ],
+        'MouseEvent.relatedTarget': [
+            "@Creates('Node')",
+            "@Returns('EventTarget|=Object|Null')",
+        ],
+        'Notification.data': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
+        'PopStateEvent.state': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
+        'RTCStatsReport.timestamp': [
+            "@Creates('Null')",  # JS date object.
+        ],
+        'SerializedScriptValue': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
+        'ServiceWorkerMessageEvent.data': [
+            "@annotation_Creates_SerializedScriptValue",
+            "@annotation_Returns_SerializedScriptValue",
+        ],
+        'ServiceWorkerMessageEvent.source': [
+            "@Creates('Null')",
+            "@Returns('ServiceWorker|MessagePort')",
+        ],
+        'ShadowRoot.getElementsByClassName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'ShadowRoot.getElementsByName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
+        'ShadowRoot.getElementsByTagName': [
+            "@Creates('NodeList|HtmlCollection')",
+            "@Returns('NodeList|HtmlCollection')",
+        ],
 
-    # Normally Window is never null, but starting from a <template> element in
-    # JavaScript, this will be null:
-    #     template.content.ownerDocument.defaultView
-    'Document.window': [
-      "@Creates('Window|=Object|Null')",
-      "@Returns('Window|=Object|Null')",
-    ],
-
-    'Document.getElementsByClassName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'Document.getElementsByName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'Document.getElementsByTagName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    # querysSelectorAll never returns `null`.
-    'Document.querySelectorAll': [
-      "@Creates('NodeList')",
-      "@Returns('NodeList')",
-    ],
-    'DocumentFragment.querySelectorAll': [
-      "@Creates('NodeList')",
-      "@Returns('NodeList')",
-    ],
-    'Element.querySelectorAll': [
-      "@Creates('NodeList')",
-      "@Returns('NodeList')",
-    ],
-    'Element.getBoundingClientRect': [
-        "@Creates('_DomRect')",
-        "@Returns('_DomRect|Null')", # TODO(sra): Verify and remove Null.
-    ],
-    'Element.getClientRects': [
-        "@Creates('DomRectList')",
-        "@Returns('DomRectList|Null')",
-    ],
-
-    # Methods returning Window can return a local window, or a cross-frame
-    # window (=Object) that needs wrapping.
-    'Window': [
-      "@Creates('Window|=Object')",
-      "@Returns('Window|=Object')",
-    ],
-
-    'Window.openDatabase': [
-      "@Creates('SqlDatabase')",
-    ],
-
-    'Window.showModalDialog': [
-      "@Creates('Null')",
-    ],
-
-    'Element.webkitGetRegionFlowRanges': [
-      "@Creates('JSExtendableArray')",
-      "@Returns('JSExtendableArray')",
-    ],
-
-    'Element.getElementsByClassName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'Element.getElementsByName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'Element.getElementsByTagName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    "ErrorEvent.error": [
-      "@Creates('Null')", # Only returns values created elsewhere.
-    ],
-
-    # To be in callback with the browser-created Event, we had to have called
-    # addEventListener on the target, so we avoid
-    'Event.currentTarget': [
-      "@Creates('Null')",
-      "@Returns('EventTarget|=Object|Null')",
-    ],
-
-    # Only nodes in the DOM bubble and have target !== currentTarget.
-    'Event.target': [
-      "@Creates('Node')",
-      "@Returns('EventTarget|=Object')",
-    ],
-
-    # TODO(sra): Investigate how ExtendableMessageEvent.data is different from
-    # MessageEvent.data. It might be necessary to put in a method to translate
-    # the JavaScript wire type into a Dart type.
-    'ExtendableMessageEvent.data': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    # TODO(sra): We could determine the following by parsing the compound IDL
-    # type.
-    'ExtendableMessageEvent.source': [
-      "@Creates('Client|ServiceWorker|MessagePort')",
-      "@Returns('Client|ServiceWorker|MessagePort|Null')",
-    ],
-
-    'File.lastModifiedDate': [
-      "@Creates('Null')", # JS date object.
-    ],
-
-    'FocusEvent.relatedTarget': [
-      "@Creates('Null')",
-    ],
-
-    'Gamepad.buttons': [
-        "@Creates('JSExtendableArray|GamepadButton')",
-        "@Returns('JSExtendableArray')",
-    ],
-
-    'HTMLCanvasElement.getContext': [
-      "@Creates('CanvasRenderingContext2D|RenderingContext|RenderingContext2')",
-      "@Returns('CanvasRenderingContext2D|RenderingContext|RenderingContext2|Null')",
-    ],
-
-    'HTMLInputElement.valueAsDate': [
-      "@Creates('Null')", # JS date object.
-    ],
-
-    # Rather than have the result of an IDBRequest as a union over all possible
-    # results, we mark the result as instantiating any classes, and mark
-    # each operation with the classes that it could cause to be asynchronously
-    # instantiated.
-    'IDBRequest.result': ["@Creates('Null')"],
-
-    # The source is usually a participant in the operation that generated the
-    # IDBRequest.
-    'IDBRequest.source':  ["@Creates('Null')"],
-
-    'IDBFactory.open': ["@Creates('Database')"],
-    'IDBFactory.webkitGetDatabaseNames': ["@Creates('DomStringList')"],
-
-    'IDBObjectStore.put': ["@_annotation_Creates_IDBKey"],
-    'IDBObjectStore.add': ["@_annotation_Creates_IDBKey"],
-    'IDBObjectStore.get': ["@annotation_Creates_SerializedScriptValue"],
-    'IDBObjectStore.openCursor': ["@Creates('Cursor')"],
-
-    'IDBIndex.get': ["@annotation_Creates_SerializedScriptValue"],
-    'IDBIndex.getKey': [
-      "@annotation_Creates_SerializedScriptValue",
-      # The source is the object store behind the index.
-      "@Creates('ObjectStore')",
-    ],
-    'IDBIndex.openCursor': ["@Creates('Cursor')"],
-    'IDBIndex.openKeyCursor': ["@Creates('Cursor')"],
-
-    'IDBCursorWithValue.value': [
-      '@annotation_Creates_SerializedScriptValue',
-      '@annotation_Returns_SerializedScriptValue',
-    ],
-
-    'IDBCursor.key': [
-      "@_annotation_Creates_IDBKey",
-      "@_annotation_Returns_IDBKey",
-    ],
-
-    'IDBCursor.primaryKey': [
-      "@_annotation_Creates_IDBKey",
-      "@_annotation_Returns_IDBKey",
-    ],
-
-    'IDBCursor.source': [
-      "@Creates('Null')",
-      "@Returns('ObjectStore|Index|Null')",
-    ],
-
-    'IDBDatabase.version': [
-      "@Creates('int|String|Null')",
-      "@Returns('int|String|Null')",
-    ],
-
-    'IDBIndex.keyPath': [
-      "@annotation_Creates_SerializedScriptValue",
-    ],
-
-    'IDBKeyRange.lower': [
-      "@annotation_Creates_SerializedScriptValue",
-    ],
-
-    'IDBKeyRange.upper': [
-      "@annotation_Creates_SerializedScriptValue",
-    ],
-
-    'IDBObjectStore.keyPath': [
-      "@annotation_Creates_SerializedScriptValue",
-    ],
-
-    '+IDBOpenDBRequest': [
-      "@Returns('Request')",
-      "@Creates('Request')",
-    ],
-
-    '+IDBRequest': [
-      "@Returns('Request')",
-      "@Creates('Request')",
-    ],
-
-    'IDBVersionChangeEvent.newVersion': [
-      "@Creates('int|String|Null')",
-      "@Returns('int|String|Null')",
-    ],
-
-    'IDBVersionChangeEvent.oldVersion': [
-      "@Creates('int|String|Null')",
-      "@Returns('int|String|Null')",
-    ],
-
-    'ImageData.data': [
-      "@Creates('NativeUint8ClampedList')",
-      "@Returns('NativeUint8ClampedList')",
-    ],
-
-    'MediaStream.getAudioTracks': [
-      "@Creates('JSExtendableArray|MediaStreamTrack')",
-      "@Returns('JSExtendableArray')",
-    ],
-
-    'MediaStream.getVideoTracks': [
-      "@Creates('JSExtendableArray|MediaStreamTrack')",
-      "@Returns('JSExtendableArray')",
-    ],
-
-    'MessageEvent.data': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    'MessageEvent.ports': ["@Creates('JSExtendableArray')"],
-
-    'MessageEvent.source': [
-      "@Creates('Null')",
-      "@Returns('EventTarget|=Object')",
-    ],
-
-    'Metadata.modificationTime': [
-      "@Creates('Null')", # JS date object.
-    ],
-
-    'MouseEvent.relatedTarget': [
-      "@Creates('Node')",
-      "@Returns('EventTarget|=Object|Null')",
-    ],
-
-    'Notification.data': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    'PopStateEvent.state': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    'RTCStatsReport.timestamp': [
-      "@Creates('Null')", # JS date object.
-    ],
-
-    'SerializedScriptValue': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    'ServiceWorkerMessageEvent.data': [
-      "@annotation_Creates_SerializedScriptValue",
-      "@annotation_Returns_SerializedScriptValue",
-    ],
-
-    'ServiceWorkerMessageEvent.source': [
-      "@Creates('Null')",
-      "@Returns('ServiceWorker|MessagePort')",
-     ],
-
-    'ShadowRoot.getElementsByClassName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'ShadowRoot.getElementsByName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    'ShadowRoot.getElementsByTagName': [
-      "@Creates('NodeList|HtmlCollection')",
-      "@Returns('NodeList|HtmlCollection')",
-    ],
-
-    # Touch targets are Elements in a Document, or the Document.
-    'Touch.target': [
-      "@Creates('Element|Document')",
-      "@Returns('Element|Document')",
-    ],
-
-    'TrackEvent.track': [
-      "@Creates('Null')",
-    ],
-
-    'VTTCue.line': [
-       "@Creates('Null')",
-       "@Returns('num|String')",
-    ],
-
-    'VTTCue.position': [
-       "@Creates('Null')",
-       "@Returns('num|String')",
-    ],
-
-    'WebGLRenderingContext.getBufferParameter': [
-      "@Creates('int|Null')",
-      "@Returns('int|Null')",
-    ],
-
-    'WebGLRenderingContext.getFramebufferAttachmentParameter': [
-      "@Creates('int|Renderbuffer|Texture|Null')",
-      "@Returns('int|Renderbuffer|Texture|Null')",
-    ],
-
-    'WebGLRenderingContext.getProgramParameter': [
-      "@Creates('int|bool|Null')",
-      "@Returns('int|bool|Null')",
-    ],
-
-    'WebGLRenderingContext.getRenderbufferParameter': [
-      "@Creates('int|Null')",
-      "@Returns('int|Null')",
-    ],
-
-    'WebGLRenderingContext.getShaderParameter': [
-      "@Creates('int|bool|Null')",
-      "@Returns('int|bool|Null')",
-    ],
-
-    'WebGLRenderingContext.getTexParameter': [
-      "@Creates('int|Null')",
-      "@Returns('int|Null')",
-    ],
-
-    'WebGLRenderingContext.getUniform': [
-      "@Creates('Null|num|String|bool|JSExtendableArray|"
-                "NativeFloat32List|NativeInt32List|NativeUint32List')",
-      "@Returns('Null|num|String|bool|JSExtendableArray|"
-                "NativeFloat32List|NativeInt32List|NativeUint32List')",
-    ],
-
-    'WebGLRenderingContext.getVertexAttrib': [
-      "@Creates('Null|num|bool|NativeFloat32List|Buffer')",
-      "@Returns('Null|num|bool|NativeFloat32List|Buffer')",
-    ],
-
-    'WebGLRenderingContext.getParameter': [
-      # Taken from http://www.khronos.org/registry/webgl/specs/latest/
-      # Section 5.14.3 Setting and getting state
-      "@Creates('Null|num|String|bool|JSExtendableArray|"
-                "NativeFloat32List|NativeInt32List|NativeUint32List|"
-                "Framebuffer|Renderbuffer|Texture')",
-      "@Returns('Null|num|String|bool|JSExtendableArray|"
-                "NativeFloat32List|NativeInt32List|NativeUint32List|"
-                "Framebuffer|Renderbuffer|Texture')",
-    ],
-
-    'WebGLRenderingContext.getContextAttributes': [
-      "@Creates('ContextAttributes|Null')",
-    ],
-
-    'XMLHttpRequest.response': [
-      "@Creates('NativeByteBuffer|Blob|Document|=Object|JSExtendableArray"
-                "|String|num')",
-    ],
-}, dart2jsOnly=True)
+        # Touch targets are Elements in a Document, or the Document.
+        'Touch.target': [
+            "@Creates('Element|Document')",
+            "@Returns('Element|Document')",
+        ],
+        'TrackEvent.track': [
+            "@Creates('Null')",
+        ],
+        'VTTCue.line': [
+            "@Creates('Null')",
+            "@Returns('num|String')",
+        ],
+        'VTTCue.position': [
+            "@Creates('Null')",
+            "@Returns('num|String')",
+        ],
+        'WebGLRenderingContext.getBufferParameter': [
+            "@Creates('int|Null')",
+            "@Returns('int|Null')",
+        ],
+        'WebGLRenderingContext.getFramebufferAttachmentParameter': [
+            "@Creates('int|Renderbuffer|Texture|Null')",
+            "@Returns('int|Renderbuffer|Texture|Null')",
+        ],
+        'WebGLRenderingContext.getProgramParameter': [
+            "@Creates('int|bool|Null')",
+            "@Returns('int|bool|Null')",
+        ],
+        'WebGLRenderingContext.getRenderbufferParameter': [
+            "@Creates('int|Null')",
+            "@Returns('int|Null')",
+        ],
+        'WebGLRenderingContext.getShaderParameter': [
+            "@Creates('int|bool|Null')",
+            "@Returns('int|bool|Null')",
+        ],
+        'WebGLRenderingContext.getTexParameter': [
+            "@Creates('int|Null')",
+            "@Returns('int|Null')",
+        ],
+        'WebGLRenderingContext.getUniform': [
+            "@Creates('Null|num|String|bool|JSExtendableArray|"
+            "NativeFloat32List|NativeInt32List|NativeUint32List')",
+            "@Returns('Null|num|String|bool|JSExtendableArray|"
+            "NativeFloat32List|NativeInt32List|NativeUint32List')",
+        ],
+        'WebGLRenderingContext.getVertexAttrib': [
+            "@Creates('Null|num|bool|NativeFloat32List|Buffer')",
+            "@Returns('Null|num|bool|NativeFloat32List|Buffer')",
+        ],
+        'WebGLRenderingContext.getParameter': [
+            # Taken from http://www.khronos.org/registry/webgl/specs/latest/
+            # Section 5.14.3 Setting and getting state
+            "@Creates('Null|num|String|bool|JSExtendableArray|"
+            "NativeFloat32List|NativeInt32List|NativeUint32List|"
+            "Framebuffer|Renderbuffer|Texture')",
+            "@Returns('Null|num|String|bool|JSExtendableArray|"
+            "NativeFloat32List|NativeInt32List|NativeUint32List|"
+            "Framebuffer|Renderbuffer|Texture')",
+        ],
+        'WebGLRenderingContext.getContextAttributes': [
+            "@Creates('ContextAttributes|Null')",
+        ],
+        'XMLHttpRequest.response': [
+            "@Creates('NativeByteBuffer|Blob|Document|=Object|JSExtendableArray"
+            "|String|num')",
+        ],
+    },
+    dart2jsOnly=True)
 
 _blink_experimental_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
 ]
 
 _indexed_db_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.FIREFOX, '15')",
-  "@SupportedBrowser(SupportedBrowser.IE, '10')",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX, '15')",
+    "@SupportedBrowser(SupportedBrowser.IE, '10')",
 ]
 
 _file_system_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
 ]
 
 _all_but_ie9_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-  "@SupportedBrowser(SupportedBrowser.IE, '10')",
-  "@SupportedBrowser(SupportedBrowser.SAFARI)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+    "@SupportedBrowser(SupportedBrowser.IE, '10')",
+    "@SupportedBrowser(SupportedBrowser.SAFARI)",
 ]
 
 _history_annotations = _all_but_ie9_annotations
 
 _no_ie_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-  "@SupportedBrowser(SupportedBrowser.SAFARI)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+    "@SupportedBrowser(SupportedBrowser.SAFARI)",
 ]
 
 _performance_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-  "@SupportedBrowser(SupportedBrowser.IE)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+    "@SupportedBrowser(SupportedBrowser.IE)",
 ]
 
-_rtc_annotations = [ # Note: Firefox nightly builds also support this.
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
+_rtc_annotations = [  # Note: Firefox nightly builds also support this.
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
 ]
 
 _shadow_dom_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME, '26')",
+    "@SupportedBrowser(SupportedBrowser.CHROME, '26')",
 ]
 
 _speech_recognition_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
+    "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
 ]
 
-_svg_annotations = _all_but_ie9_annotations;
+_svg_annotations = _all_but_ie9_annotations
 
 _web_sql_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.SAFARI)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.SAFARI)",
 ]
 
 _webgl_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
 ]
 
 _web_audio_annotations = _webgl_annotations
 
 _webkit_experimental_annotations = [
-  "@SupportedBrowser(SupportedBrowser.CHROME)",
-  "@SupportedBrowser(SupportedBrowser.SAFARI)",
+    "@SupportedBrowser(SupportedBrowser.CHROME)",
+    "@SupportedBrowser(SupportedBrowser.SAFARI)",
 ]
 
 # Annotations to be placed on generated members.
 # The table is indexed as:
 #   INTERFACE:     annotations to be added to the interface declaration
 #   INTERFACE.MEMBER: annotation to be added to the member declaration
-_annotations = monitored.Dict('dartmetadata._annotations', {
-  'CSSHostRule': _shadow_dom_annotations,
-  'WebKitCSSMatrix': _webkit_experimental_annotations,
-  'Crypto': _webkit_experimental_annotations,
-  'Database': _web_sql_annotations,
-  'DatabaseSync': _web_sql_annotations,
-  'ApplicationCache': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-    "@SupportedBrowser(SupportedBrowser.IE, '10')",
-    "@SupportedBrowser(SupportedBrowser.OPERA)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'AudioBufferSourceNode': _web_audio_annotations,
-  'AudioContext': _web_audio_annotations,
-  'DOMFileSystem': _file_system_annotations,
-  'DOMFileSystemSync': _file_system_annotations,
-  'Window.indexedDB': _indexed_db_annotations,
-  'Window.openDatabase': _web_sql_annotations,
-  'Window.performance': _performance_annotations,
-  'Window.webkitNotifications': _webkit_experimental_annotations,
-  'Window.webkitRequestFileSystem': _file_system_annotations,
-  'Window.webkitResolveLocalFileSystemURL': _file_system_annotations,
-  'Element.createShadowRoot': [
-    "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
-  ],
-  'Element.ontransitionend': _all_but_ie9_annotations,
-  # Placeholder to add experimental flag, implementation for this is
-  # pending in a separate CL.
-  'Element.webkitMatchesSelector': [],
-  'Event.clipboardData': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'FormData': _all_but_ie9_annotations,
-  'HashChangeEvent': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'History.pushState': _history_annotations,
-  'History.replaceState': _history_annotations,
-  'HTMLContentElement': _shadow_dom_annotations,
-  'HTMLDataListElement': _all_but_ie9_annotations,
-  'HTMLDetailsElement': _webkit_experimental_annotations,
-  'HTMLEmbedElement': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.IE)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'HTMLKeygenElement': _webkit_experimental_annotations,
-  'HTMLMeterElement': _no_ie_annotations,
-  'HTMLObjectElement': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.IE)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'HTMLOutputElement': _no_ie_annotations,
-  'HTMLProgressElement': _all_but_ie9_annotations,
-  'HTMLShadowElement': _shadow_dom_annotations,
-  'HTMLTemplateElement': _blink_experimental_annotations,
-  'HTMLTrackElement': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.IE, '10')",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'IDBFactory': _indexed_db_annotations,
-  'IDBDatabase': _indexed_db_annotations,
-  'MediaStream': _rtc_annotations,
-  'MediaStreamEvent': _rtc_annotations,
-  'MediaStreamTrack': _rtc_annotations,
-  'MediaStreamTrackEvent': _rtc_annotations,
-  'MediaSource': [
-    # TODO(alanknight): This works on Firefox 33 behind a flag and in Safari
-    # desktop, but not mobile. On theory that static false positives are worse
-    # than negatives, leave those out for now. Update once they're available.
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.IE, '11')",
-  ],
-  'MutationObserver': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-  'Performance': _performance_annotations,
-  'PopStateEvent': _history_annotations,
-  'RTCIceCandidate': _rtc_annotations,
-  'RTCPeerConnection': _rtc_annotations,
-  'RTCSessionDescription': _rtc_annotations,
-  'ShadowRoot': _shadow_dom_annotations,
-  'SpeechRecognition': _speech_recognition_annotations,
-  'SpeechRecognitionAlternative': _speech_recognition_annotations,
-  'SpeechRecognitionError': _speech_recognition_annotations,
-  'SpeechRecognitionEvent': _speech_recognition_annotations,
-  'SpeechRecognitionResult': _speech_recognition_annotations,
-  'SVGAltGlyphElement': _no_ie_annotations,
-  'SVGAnimateElement': _no_ie_annotations,
-  'SVGAnimateMotionElement': _no_ie_annotations,
-  'SVGAnimateTransformElement': _no_ie_annotations,
-  'SVGFEBlendElement': _svg_annotations,
-  'SVGFEColorMatrixElement': _svg_annotations,
-  'SVGFEComponentTransferElement': _svg_annotations,
-  'SVGFEConvolveMatrixElement': _svg_annotations,
-  'SVGFEDiffuseLightingElement': _svg_annotations,
-  'SVGFEDisplacementMapElement': _svg_annotations,
-  'SVGFEDistantLightElement': _svg_annotations,
-  'SVGFEFloodElement': _svg_annotations,
-  'SVGFEFuncAElement': _svg_annotations,
-  'SVGFEFuncBElement': _svg_annotations,
-  'SVGFEFuncGElement': _svg_annotations,
-  'SVGFEFuncRElement': _svg_annotations,
-  'SVGFEGaussianBlurElement': _svg_annotations,
-  'SVGFEImageElement': _svg_annotations,
-  'SVGFEMergeElement': _svg_annotations,
-  'SVGFEMergeNodeElement': _svg_annotations,
-  'SVGFEMorphologyElement': _svg_annotations,
-  'SVGFEOffsetElement': _svg_annotations,
-  'SVGFEPointLightElement': _svg_annotations,
-  'SVGFESpecularLightingElement': _svg_annotations,
-  'SVGFESpotLightElement': _svg_annotations,
-  'SVGFETileElement': _svg_annotations,
-  'SVGFETurbulenceElement': _svg_annotations,
-  'SVGFilterElement': _svg_annotations,
-  'SVGForeignObjectElement': _no_ie_annotations,
-  'SVGSetElement': _no_ie_annotations,
-  'SQLTransaction': _web_sql_annotations,
-  'SQLTransactionSync': _web_sql_annotations,
-  'WebGLRenderingContext': _webgl_annotations,
-  'WebSocket': _all_but_ie9_annotations,
-  'Worker': _all_but_ie9_annotations,
-  'XMLHttpRequest.overrideMimeType': _no_ie_annotations,
-  'XMLHttpRequest.response': _all_but_ie9_annotations,
-  'XMLHttpRequestEventTarget.onloadend': _all_but_ie9_annotations,
-  'XMLHttpRequestEventTarget.onprogress': _all_but_ie9_annotations,
-  'XSLTProcessor': [
-    "@SupportedBrowser(SupportedBrowser.CHROME)",
-    "@SupportedBrowser(SupportedBrowser.FIREFOX)",
-    "@SupportedBrowser(SupportedBrowser.SAFARI)",
-  ],
-})
+_annotations = monitored.Dict(
+    'dartmetadata._annotations',
+    {
+        'CSSHostRule':
+        _shadow_dom_annotations,
+        'WebKitCSSMatrix':
+        _webkit_experimental_annotations,
+        'Crypto':
+        _webkit_experimental_annotations,
+        'Database':
+        _web_sql_annotations,
+        'DatabaseSync':
+        _web_sql_annotations,
+        'ApplicationCache': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+            "@SupportedBrowser(SupportedBrowser.IE, '10')",
+            "@SupportedBrowser(SupportedBrowser.OPERA)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'AudioBufferSourceNode':
+        _web_audio_annotations,
+        'AudioContext':
+        _web_audio_annotations,
+        'DOMFileSystem':
+        _file_system_annotations,
+        'DOMFileSystemSync':
+        _file_system_annotations,
+        'Window.indexedDB':
+        _indexed_db_annotations,
+        'Window.openDatabase':
+        _web_sql_annotations,
+        'Window.performance':
+        _performance_annotations,
+        'Window.webkitNotifications':
+        _webkit_experimental_annotations,
+        'Window.webkitRequestFileSystem':
+        _file_system_annotations,
+        'Window.webkitResolveLocalFileSystemURL':
+        _file_system_annotations,
+        'Element.createShadowRoot': [
+            "@SupportedBrowser(SupportedBrowser.CHROME, '25')",
+        ],
+        'Element.ontransitionend':
+        _all_but_ie9_annotations,
+        # Placeholder to add experimental flag, implementation for this is
+        # pending in a separate CL.
+        'Element.webkitMatchesSelector': [],
+        'Event.clipboardData': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'FormData':
+        _all_but_ie9_annotations,
+        'HashChangeEvent': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'History.pushState':
+        _history_annotations,
+        'History.replaceState':
+        _history_annotations,
+        'HTMLContentElement':
+        _shadow_dom_annotations,
+        'HTMLDataListElement':
+        _all_but_ie9_annotations,
+        'HTMLDetailsElement':
+        _webkit_experimental_annotations,
+        'HTMLEmbedElement': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.IE)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'HTMLKeygenElement':
+        _webkit_experimental_annotations,
+        'HTMLMeterElement':
+        _no_ie_annotations,
+        'HTMLObjectElement': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.IE)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'HTMLOutputElement':
+        _no_ie_annotations,
+        'HTMLProgressElement':
+        _all_but_ie9_annotations,
+        'HTMLShadowElement':
+        _shadow_dom_annotations,
+        'HTMLTemplateElement':
+        _blink_experimental_annotations,
+        'HTMLTrackElement': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.IE, '10')",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'IDBFactory':
+        _indexed_db_annotations,
+        'IDBDatabase':
+        _indexed_db_annotations,
+        'MediaStream':
+        _rtc_annotations,
+        'MediaStreamEvent':
+        _rtc_annotations,
+        'MediaStreamTrack':
+        _rtc_annotations,
+        'MediaStreamTrackEvent':
+        _rtc_annotations,
+        'MediaSource': [
+            # TODO(alanknight): This works on Firefox 33 behind a flag and in Safari
+            # desktop, but not mobile. On theory that static false positives are worse
+            # than negatives, leave those out for now. Update once they're available.
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.IE, '11')",
+        ],
+        'MutationObserver': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+        'Performance':
+        _performance_annotations,
+        'PopStateEvent':
+        _history_annotations,
+        'RTCIceCandidate':
+        _rtc_annotations,
+        'RTCPeerConnection':
+        _rtc_annotations,
+        'RTCSessionDescription':
+        _rtc_annotations,
+        'ShadowRoot':
+        _shadow_dom_annotations,
+        'SpeechRecognition':
+        _speech_recognition_annotations,
+        'SpeechRecognitionAlternative':
+        _speech_recognition_annotations,
+        'SpeechRecognitionError':
+        _speech_recognition_annotations,
+        'SpeechRecognitionEvent':
+        _speech_recognition_annotations,
+        'SpeechRecognitionResult':
+        _speech_recognition_annotations,
+        'SVGAltGlyphElement':
+        _no_ie_annotations,
+        'SVGAnimateElement':
+        _no_ie_annotations,
+        'SVGAnimateMotionElement':
+        _no_ie_annotations,
+        'SVGAnimateTransformElement':
+        _no_ie_annotations,
+        'SVGFEBlendElement':
+        _svg_annotations,
+        'SVGFEColorMatrixElement':
+        _svg_annotations,
+        'SVGFEComponentTransferElement':
+        _svg_annotations,
+        'SVGFEConvolveMatrixElement':
+        _svg_annotations,
+        'SVGFEDiffuseLightingElement':
+        _svg_annotations,
+        'SVGFEDisplacementMapElement':
+        _svg_annotations,
+        'SVGFEDistantLightElement':
+        _svg_annotations,
+        'SVGFEFloodElement':
+        _svg_annotations,
+        'SVGFEFuncAElement':
+        _svg_annotations,
+        'SVGFEFuncBElement':
+        _svg_annotations,
+        'SVGFEFuncGElement':
+        _svg_annotations,
+        'SVGFEFuncRElement':
+        _svg_annotations,
+        'SVGFEGaussianBlurElement':
+        _svg_annotations,
+        'SVGFEImageElement':
+        _svg_annotations,
+        'SVGFEMergeElement':
+        _svg_annotations,
+        'SVGFEMergeNodeElement':
+        _svg_annotations,
+        'SVGFEMorphologyElement':
+        _svg_annotations,
+        'SVGFEOffsetElement':
+        _svg_annotations,
+        'SVGFEPointLightElement':
+        _svg_annotations,
+        'SVGFESpecularLightingElement':
+        _svg_annotations,
+        'SVGFESpotLightElement':
+        _svg_annotations,
+        'SVGFETileElement':
+        _svg_annotations,
+        'SVGFETurbulenceElement':
+        _svg_annotations,
+        'SVGFilterElement':
+        _svg_annotations,
+        'SVGForeignObjectElement':
+        _no_ie_annotations,
+        'SVGSetElement':
+        _no_ie_annotations,
+        'SQLTransaction':
+        _web_sql_annotations,
+        'SQLTransactionSync':
+        _web_sql_annotations,
+        'WebGLRenderingContext':
+        _webgl_annotations,
+        'WebSocket':
+        _all_but_ie9_annotations,
+        'Worker':
+        _all_but_ie9_annotations,
+        'XMLHttpRequest.overrideMimeType':
+        _no_ie_annotations,
+        'XMLHttpRequest.response':
+        _all_but_ie9_annotations,
+        'XMLHttpRequestEventTarget.onloadend':
+        _all_but_ie9_annotations,
+        'XMLHttpRequestEventTarget.onprogress':
+        _all_but_ie9_annotations,
+        'XSLTProcessor': [
+            "@SupportedBrowser(SupportedBrowser.CHROME)",
+            "@SupportedBrowser(SupportedBrowser.FIREFOX)",
+            "@SupportedBrowser(SupportedBrowser.SAFARI)",
+        ],
+    })
 
 # TODO(blois): minimize noise and enable by default.
 _monitor_type_metadata = False
 
+
 class DartMetadata(object):
-  def __init__(self, api_status_path, doc_comments_path,
-               logging_level=logging.WARNING):
-    _logger.setLevel(logging_level)
-    self._api_status_path = api_status_path
-    status_file = open(self._api_status_path, 'r+')
-    self._types = json.load(status_file)
-    status_file.close()
 
-    comments_file = open(doc_comments_path, 'r+')
-    self._doc_comments = json.load(comments_file)
-    comments_file.close()
+    def __init__(self,
+                 api_status_path,
+                 doc_comments_path,
+                 logging_level=logging.WARNING):
+        _logger.setLevel(logging_level)
+        self._api_status_path = api_status_path
+        status_file = open(self._api_status_path, 'r+')
+        self._types = json.load(status_file)
+        status_file.close()
 
-    if _monitor_type_metadata:
-      monitored_interfaces = {}
-      for interface_id, interface_data in self._types.iteritems():
-        monitored_interface = interface_data.copy()
-        monitored_interface['members'] = monitored.Dict(
-            'dartmetadata.%s' % interface_id, interface_data['members'])
+        comments_file = open(doc_comments_path, 'r+')
+        self._doc_comments = json.load(comments_file)
+        comments_file.close()
 
-        monitored_interfaces[interface_id] = monitored_interface
+        if _monitor_type_metadata:
+            monitored_interfaces = {}
+            for interface_id, interface_data in self._types.iteritems():
+                monitored_interface = interface_data.copy()
+                monitored_interface['members'] = monitored.Dict(
+                    'dartmetadata.%s' % interface_id, interface_data['members'])
 
-      self._monitored_types = monitored.Dict('dartmetadata._monitored_types',
-          monitored_interfaces)
-    else:
-      self._monitored_types = self._types
+                monitored_interfaces[interface_id] = monitored_interface
 
-  def GetFormattedMetadata(self, library_name, interface, member_id=None,
-      indentation=''):
-    """ Gets all comments and annotations for an interface or member.
+            self._monitored_types = monitored.Dict(
+                'dartmetadata._monitored_types', monitored_interfaces)
+        else:
+            self._monitored_types = self._types
+
+    def GetFormattedMetadata(self,
+                             library_name,
+                             interface,
+                             member_id=None,
+                             indentation=''):
+        """ Gets all comments and annotations for an interface or member.
     """
-    return self.FormatMetadata(
-        self.GetMetadata(library_name, interface, member_id),
-        indentation)
+        return self.FormatMetadata(
+            self.GetMetadata(library_name, interface, member_id), indentation)
 
-  def GetMetadata(self, library_name, interface,
-        member_name=None, source_member_name=None):
-    """ Gets all comments and annotations for an interface or member.
+    def GetMetadata(self,
+                    library_name,
+                    interface,
+                    member_name=None,
+                    source_member_name=None):
+        """ Gets all comments and annotations for an interface or member.
 
     Args:
       source_member_name: If the member is dependent on a different member
         then this is used to apply the support annotations from the other
         member.
     """
-    annotations = self._GetComments(library_name, interface, member_name)
-    annotations = annotations + self._GetCommonAnnotations(
-        interface, member_name, source_member_name)
+        annotations = self._GetComments(library_name, interface, member_name)
+        annotations = annotations + self._GetCommonAnnotations(
+            interface, member_name, source_member_name)
 
-    return annotations
+        return annotations
 
-  def GetDart2JSMetadata(self, idl_type, library_name,
-      interface, member_name,):
-    """ Gets all annotations for Dart2JS members- including annotations for
+    def GetDart2JSMetadata(
+            self,
+            idl_type,
+            library_name,
+            interface,
+            member_name,
+    ):
+        """ Gets all annotations for Dart2JS members- including annotations for
     both dart2js and dartium.
     """
-    annotations = self.GetMetadata(library_name, interface, member_name)
+        annotations = self.GetMetadata(library_name, interface, member_name)
 
-    ann2 = self._GetDart2JSSpecificAnnotations(idl_type, interface.id, member_name)
-    if ann2:
-      if annotations:
-        annotations.extend(ann2)
-      else:
-        annotations = ann2
-    return annotations
+        ann2 = self._GetDart2JSSpecificAnnotations(idl_type, interface.id,
+                                                   member_name)
+        if ann2:
+            if annotations:
+                annotations.extend(ann2)
+            else:
+                annotations = ann2
+        return annotations
 
-  def IsSuppressed(self, interface, member_name):
-    annotations = self._GetSupportLevelAnnotations(interface.id, member_name)
-    return any(
-        annotation.startswith('@removed') for annotation in annotations)
+    def IsSuppressed(self, interface, member_name):
+        annotations = self._GetSupportLevelAnnotations(interface.id,
+                                                       member_name)
+        return any(
+            annotation.startswith('@removed') for annotation in annotations)
 
-  def _GetCommonAnnotations(self, interface, member_name=None,
-      source_member_name=None):
-    annotations = []
-    if member_name:
-      key = '%s.%s' % (interface.id, member_name)
-      dom_name = '%s.%s' % (interface.javascript_binding_name, member_name)
-      # DomName annotation is needed for dblclick ACX plugin analyzer.
-      if member_name == 'dblclickEvent' or member_name == 'ondblclick':
-        annotations.append("@DomName('" + dom_name + "')")
-    else:
-      key = interface.id
-
-    if key in _annotations:
-      annotations.extend(_annotations[key])
-
-    if (not member_name and
-        interface.javascript_binding_name.startswith('WebKit') and
-        interface.id not in html_interface_renames):
-      annotations.extend(_webkit_experimental_annotations)
-
-    if (member_name and member_name.startswith('webkit') and
-        key not in renamed_html_members):
-      annotations.extend(_webkit_experimental_annotations)
-
-    if source_member_name:
-      member_name = source_member_name
-
-    support_annotations = self._GetSupportLevelAnnotations(
-        interface.id, member_name)
-
-    for annotation in support_annotations:
-      if annotation not in annotations:
-        annotations.append(annotation)
-
-    return annotations
-
-  def _GetComments(self, library_name, interface, member_name=None):
-    """ Gets all comments for the interface or member and returns a list. """
-
-    # Add documentation from JSON.
-    comments = []
-    library_name = 'dart.dom.%s' % library_name
-    if library_name in self._doc_comments:
-      library_info = self._doc_comments[library_name]
-      if interface.id in library_info:
-        interface_info = library_info[interface.id]
+    def _GetCommonAnnotations(self,
+                              interface,
+                              member_name=None,
+                              source_member_name=None):
+        annotations = []
         if member_name:
-          if 'members' in interface_info and member_name in interface_info['members']:
-            comments = interface_info['members'][member_name]
-        elif 'comment' in interface_info:
-          comments = interface_info['comment']
+            key = '%s.%s' % (interface.id, member_name)
+            dom_name = '%s.%s' % (interface.javascript_binding_name,
+                                  member_name)
+            # DomName annotation is needed for dblclick ACX plugin analyzer.
+            if member_name == 'dblclickEvent' or member_name == 'ondblclick':
+                annotations.append("@DomName('" + dom_name + "')")
+        else:
+            key = interface.id
 
-    if comments:
-      comments = ['\n'.join(comments)]
+        if key in _annotations:
+            annotations.extend(_annotations[key])
 
-    return comments
+        if (not member_name and
+                interface.javascript_binding_name.startswith('WebKit') and
+                interface.id not in html_interface_renames):
+            annotations.extend(_webkit_experimental_annotations)
 
+        if (member_name and member_name.startswith('webkit') and
+                key not in renamed_html_members):
+            annotations.extend(_webkit_experimental_annotations)
 
-  def AnyConversionAnnotations(self, idl_type, interface_name, member_name):
-    if (_annotations.get('%s.%s' % (interface_name, member_name)) or
-        self._GetDart2JSSpecificAnnotations(idl_type, interface_name, member_name)):
-      return True
-    else:
-      return False
+        if source_member_name:
+            member_name = source_member_name
 
-  def FormatMetadata(self, metadata, indentation):
-    if metadata:
-      newline = '\n%s' % indentation
-      result = newline.join(metadata) + newline
-      return result
-    return ''
+        support_annotations = self._GetSupportLevelAnnotations(
+            interface.id, member_name)
 
-  def _GetDart2JSSpecificAnnotations(self, idl_type, interface_name, member_name):
-    """ Finds dart2js-specific annotations. This does not include ones shared with
+        for annotation in support_annotations:
+            if annotation not in annotations:
+                annotations.append(annotation)
+
+        return annotations
+
+    def _GetComments(self, library_name, interface, member_name=None):
+        """ Gets all comments for the interface or member and returns a list. """
+
+        # Add documentation from JSON.
+        comments = []
+        library_name = 'dart.dom.%s' % library_name
+        if library_name in self._doc_comments:
+            library_info = self._doc_comments[library_name]
+            if interface.id in library_info:
+                interface_info = library_info[interface.id]
+                if member_name:
+                    if 'members' in interface_info and member_name in interface_info[
+                            'members']:
+                        comments = interface_info['members'][member_name]
+                elif 'comment' in interface_info:
+                    comments = interface_info['comment']
+
+        if comments:
+            comments = ['\n'.join(comments)]
+
+        return comments
+
+    def AnyConversionAnnotations(self, idl_type, interface_name, member_name):
+        if (_annotations.get('%s.%s' % (interface_name, member_name)) or
+                self._GetDart2JSSpecificAnnotations(idl_type, interface_name,
+                                                    member_name)):
+            return True
+        else:
+            return False
+
+    def FormatMetadata(self, metadata, indentation):
+        if metadata:
+            newline = '\n%s' % indentation
+            result = newline.join(metadata) + newline
+            return result
+        return ''
+
+    def _GetDart2JSSpecificAnnotations(self, idl_type, interface_name,
+                                       member_name):
+        """ Finds dart2js-specific annotations. This does not include ones shared with
     dartium.
     """
-    ann1 = _dart2js_annotations.get("%s.%s" % (interface_name, member_name))
-    if ann1:
-      ann2 = _dart2js_annotations.get('+' + idl_type)
-      if ann2:
-        return ann2 + ann1
-      ann2 = _dart2js_annotations.get(idl_type)
-      if ann2:
-        return ann2 + ann1
-      return ann1
+        ann1 = _dart2js_annotations.get("%s.%s" % (interface_name, member_name))
+        if ann1:
+            ann2 = _dart2js_annotations.get('+' + idl_type)
+            if ann2:
+                return ann2 + ann1
+            ann2 = _dart2js_annotations.get(idl_type)
+            if ann2:
+                return ann2 + ann1
+            return ann1
 
-    ann2 = _dart2js_annotations.get('-' + idl_type)
-    if ann2:
-      return ann2
-    ann2 = _dart2js_annotations.get(idl_type)
-    return ann2
+        ann2 = _dart2js_annotations.get('-' + idl_type)
+        if ann2:
+            return ann2
+        ann2 = _dart2js_annotations.get(idl_type)
+        return ann2
 
-  def _GetSupportInfo(self, interface_id, member_id=None):
-    """ Looks up the interface or member in the DOM status list and returns the
+    def _GetSupportInfo(self, interface_id, member_id=None):
+        """ Looks up the interface or member in the DOM status list and returns the
     support level for it.
     """
-    if interface_id in self._monitored_types:
-      type_info = self._monitored_types[interface_id]
-    else:
-      type_info = {
-        'members': {},
-        'support_level': 'untriaged',
-      }
-      self._types[interface_id] = type_info
+        if interface_id in self._monitored_types:
+            type_info = self._monitored_types[interface_id]
+        else:
+            type_info = {
+                'members': {},
+                'support_level': 'untriaged',
+            }
+            self._types[interface_id] = type_info
 
-    if not member_id:
-      return type_info
+        if not member_id:
+            return type_info
 
-    members = type_info['members']
+        members = type_info['members']
 
-    if member_id in members:
-      member_info = members[member_id]
-    else:
-      if member_id == interface_id:
-        member_info = {}
-      else:
-        member_info = {'support_level': 'untriaged'}
-      members[member_id] = member_info
+        if member_id in members:
+            member_info = members[member_id]
+        else:
+            if member_id == interface_id:
+                member_info = {}
+            else:
+                member_info = {'support_level': 'untriaged'}
+            members[member_id] = member_info
 
-    return member_info
+        return member_info
 
-  def _GetSupportLevelAnnotations(self, interface_id, member_id=None):
-    """ Gets annotations for API support status.
+    def _GetSupportLevelAnnotations(self, interface_id, member_id=None):
+        """ Gets annotations for API support status.
     """
-    support_info = self._GetSupportInfo(interface_id, member_id)
+        support_info = self._GetSupportInfo(interface_id, member_id)
 
-    dart_action = support_info.get('dart_action')
-    support_level = support_info.get('support_level')
-    comment = support_info.get('comment')
-    annotations = []
-    # TODO(blois): should add an annotation for the comment, but keeping out
-    # to keep the initial diff a bit more localized.
-    #if comment:
-    #  annotations.append('// %s' % comment)
+        dart_action = support_info.get('dart_action')
+        support_level = support_info.get('support_level')
+        comment = support_info.get('comment')
+        annotations = []
+        # TODO(blois): should add an annotation for the comment, but keeping out
+        # to keep the initial diff a bit more localized.
+        #if comment:
+        #  annotations.append('// %s' % comment)
 
-    if dart_action:
-      if dart_action == 'unstable':
-        annotations.append('@Unstable()')
-      elif dart_action == 'suppress':
-        if comment:
-          annotations.append('// %s' % comment)
-        anAnnotation = 'deprecated'
-        if member_id:
-          anAnnotation = 'removed'
-        annotations.append('@%s // %s' % (anAnnotation, support_level))
-        pass
-      elif dart_action == 'stable':
-        pass
-      else:
-        _logger.warn('Unknown dart_action - %s:%s' % (interface_id, member_id))
-    elif support_level == 'stable':
-      pass
-    elif support_level == 'deprecated':
-      if comment:
-        annotations.append('// %s' % comment)
-      annotations.append('@deprecated')
-    elif support_level is None:
-      pass
-    else:
-      _logger.warn('Unknown support_level - %s:%s' % (interface_id, member_id))
+        if dart_action:
+            if dart_action == 'unstable':
+                annotations.append('@Unstable()')
+            elif dart_action == 'suppress':
+                if comment:
+                    annotations.append('// %s' % comment)
+                anAnnotation = 'deprecated'
+                if member_id:
+                    anAnnotation = 'removed'
+                annotations.append('@%s // %s' % (anAnnotation, support_level))
+                pass
+            elif dart_action == 'stable':
+                pass
+            else:
+                _logger.warn(
+                    'Unknown dart_action - %s:%s' % (interface_id, member_id))
+        elif support_level == 'stable':
+            pass
+        elif support_level == 'deprecated':
+            if comment:
+                annotations.append('// %s' % comment)
+            annotations.append('@deprecated')
+        elif support_level is None:
+            pass
+        else:
+            _logger.warn(
+                'Unknown support_level - %s:%s' % (interface_id, member_id))
 
-    return annotations
+        return annotations
 
-  def Flush(self):
-    json_file = open(self._api_status_path, 'w+')
-    json.dump(self._types, json_file, indent=2, separators=(',', ': '), sort_keys=True)
-    json_file.close()
+    def Flush(self):
+        json_file = open(self._api_status_path, 'w+')
+        json.dump(
+            self._types,
+            json_file,
+            indent=2,
+            separators=(',', ': '),
+            sort_keys=True)
+        json_file.close()
diff --git a/tools/dom/scripts/database.py b/tools/dom/scripts/database.py
index e5f1e6c..2ec7589 100755
--- a/tools/dom/scripts/database.py
+++ b/tools/dom/scripts/database.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-
 """Module to manage IDL files."""
 
 import copy
@@ -19,7 +18,7 @@
 
 
 class Database(object):
-  """The Database class manages a collection of IDL files stored
+    """The Database class manages a collection of IDL files stored
   inside a directory.
 
   Each IDL is describing a single interface. The IDL files are written in the
@@ -29,315 +28,316 @@
   Database operations include adding, updating and removing IDL files.
   """
 
-  def __init__(self, root_dir):
-    """Initializes a Database over a given directory.
+    def __init__(self, root_dir):
+        """Initializes a Database over a given directory.
 
     Args:
       root_dir -- a directory. If directory does not exist, it will
       be created.
     """
-    self._root_dir = root_dir
-    if not os.path.exists(root_dir):
-      _logger.debug('creating root directory %s' % root_dir)
-      os.makedirs(root_dir)
-    self._all_interfaces = {}
-    self._interfaces_to_delete = []
-    self._enums = {}
-    self._all_dictionaries = {}
-    # TODO(terry): Hack to remember all typedef unions.
-    self._all_type_defs = {}
+        self._root_dir = root_dir
+        if not os.path.exists(root_dir):
+            _logger.debug('creating root directory %s' % root_dir)
+            os.makedirs(root_dir)
+        self._all_interfaces = {}
+        self._interfaces_to_delete = []
+        self._enums = {}
+        self._all_dictionaries = {}
+        # TODO(terry): Hack to remember all typedef unions.
+        self._all_type_defs = {}
 
-  def Clone(self):
-    new_database = Database(self._root_dir)
-    new_database._all_interfaces = copy.deepcopy(self._all_interfaces)
-    new_database._interfaces_to_delete = copy.deepcopy(
-        self._interfaces_to_delete)
-    new_database._enums = copy.deepcopy(self._enums)
-    new_database._all_dictionaries = copy.deepcopy(self._all_dictionaries)
-    new_database._all_type_defs = copy.deepcopy(self._all_type_defs)
+    def Clone(self):
+        new_database = Database(self._root_dir)
+        new_database._all_interfaces = copy.deepcopy(self._all_interfaces)
+        new_database._interfaces_to_delete = copy.deepcopy(
+            self._interfaces_to_delete)
+        new_database._enums = copy.deepcopy(self._enums)
+        new_database._all_dictionaries = copy.deepcopy(self._all_dictionaries)
+        new_database._all_type_defs = copy.deepcopy(self._all_type_defs)
 
-    return new_database
+        return new_database
 
-  def Delete(self):
-    """Deletes the database by deleting its directory"""
-    if os.path.exists(self._root_dir):
-      shutil.rmtree(self._root_dir)
-    # reset in-memory constructs
-    self._all_interfaces = {}
+    def Delete(self):
+        """Deletes the database by deleting its directory"""
+        if os.path.exists(self._root_dir):
+            shutil.rmtree(self._root_dir)
+        # reset in-memory constructs
+        self._all_interfaces = {}
 
-  def _ScanForInterfaces(self):
-    """Iteratores over the database files and lists all interface names.
+    def _ScanForInterfaces(self):
+        """Iteratores over the database files and lists all interface names.
 
     Return:
       A list of interface names.
     """
-    res = []
+        res = []
 
-    def Visitor(_, dirname, names):
-      for name in names:
-        if os.path.isfile(os.path.join(dirname, name)):
-          root, ext = os.path.splitext(name)
-          if ext == '.idl':
-            res.append(root)
+        def Visitor(_, dirname, names):
+            for name in names:
+                if os.path.isfile(os.path.join(dirname, name)):
+                    root, ext = os.path.splitext(name)
+                    if ext == '.idl':
+                        res.append(root)
 
-    os.path.walk(self._root_dir, Visitor, None)
-    return res
+        os.path.walk(self._root_dir, Visitor, None)
+        return res
 
-  def _FilePath(self, interface_name):
-    """Calculates the file path that a given interface should
+    def _FilePath(self, interface_name):
+        """Calculates the file path that a given interface should
     be saved to.
 
     Args:
       interface_name -- the name of the interface.
     """
-    return os.path.join(self._root_dir, '%s.idl' % interface_name)
+        return os.path.join(self._root_dir, '%s.idl' % interface_name)
 
-  def _LoadInterfaceFile(self, interface_name):
-    """Loads an interface from the database.
+    def _LoadInterfaceFile(self, interface_name):
+        """Loads an interface from the database.
 
     Returns:
       An IDLInterface instance or None if the interface is not found.
     Args:
       interface_name -- the name of the interface.
     """
-    file_name = self._FilePath(interface_name)
-    _logger.info('loading %s' % file_name)
-    if not os.path.exists(file_name):
-      return None
+        file_name = self._FilePath(interface_name)
+        _logger.info('loading %s' % file_name)
+        if not os.path.exists(file_name):
+            return None
 
-    f = open(file_name, 'r')
-    content = f.read()
-    f.close()
+        f = open(file_name, 'r')
+        content = f.read()
+        f.close()
 
-    # Parse file:
-    idl_file = idlnode.IDLFile(self._idlparser.parse(content), file_name)
+        # Parse file:
+        idl_file = idlnode.IDLFile(self._idlparser.parse(content), file_name)
 
-    if not idl_file.interfaces:
-      raise RuntimeError('No interface found in %s' % file_name)
-    elif len(idl_file.interfaces) > 1:
-      raise RuntimeError('Expected one interface in %s' % file_name)
+        if not idl_file.interfaces:
+            raise RuntimeError('No interface found in %s' % file_name)
+        elif len(idl_file.interfaces) > 1:
+            raise RuntimeError('Expected one interface in %s' % file_name)
 
-    interface = idl_file.interfaces[0]
-    self._all_interfaces[interface_name] = interface
-    return interface
+        interface = idl_file.interfaces[0]
+        self._all_interfaces[interface_name] = interface
+        return interface
 
-  def Load(self):
-    """Loads all interfaces into memory.
+    def Load(self):
+        """Loads all interfaces into memory.
     """
-    # FIXME: Speed this up by multi-threading.
-    for (interface_name) in self._ScanForInterfaces():
-      self._LoadInterfaceFile(interface_name)
-    self.Cache()
+        # FIXME: Speed this up by multi-threading.
+        for (interface_name) in self._ScanForInterfaces():
+            self._LoadInterfaceFile(interface_name)
+        self.Cache()
 
-  def Cache(self):
-    """Serialize the database using pickle for faster startup in the future
+    def Cache(self):
+        """Serialize the database using pickle for faster startup in the future
     """
-    output_file = open(os.path.join(self._root_dir, 'cache.pickle'), 'wb')
-    pickle.dump(self._all_interfaces, output_file)
-    pickle.dump(self._interfaces_to_delete, output_file)
+        output_file = open(os.path.join(self._root_dir, 'cache.pickle'), 'wb')
+        pickle.dump(self._all_interfaces, output_file)
+        pickle.dump(self._interfaces_to_delete, output_file)
 
-  def LoadFromCache(self):
-    """Deserialize the database using pickle for fast startup
+    def LoadFromCache(self):
+        """Deserialize the database using pickle for fast startup
     """
-    input_file_name = os.path.join(self._root_dir, 'cache.pickle')
-    if not os.path.isfile(input_file_name):
-      self.Load()
-      return
-    input_file = open(input_file_name, 'rb')
-    self._all_interfaces = pickle.load(input_file)
-    self._interfaces_to_delete = pickle.load(input_file)
-    input_file.close()
+        input_file_name = os.path.join(self._root_dir, 'cache.pickle')
+        if not os.path.isfile(input_file_name):
+            self.Load()
+            return
+        input_file = open(input_file_name, 'rb')
+        self._all_interfaces = pickle.load(input_file)
+        self._interfaces_to_delete = pickle.load(input_file)
+        input_file.close()
 
-  def Save(self):
-    """Saves all in-memory interfaces into files."""
-    for interface in self._all_interfaces.values():
-      self._SaveInterfaceFile(interface)
-    for interface_name in self._interfaces_to_delete:
-      self._DeleteInterfaceFile(interface_name)
+    def Save(self):
+        """Saves all in-memory interfaces into files."""
+        for interface in self._all_interfaces.values():
+            self._SaveInterfaceFile(interface)
+        for interface_name in self._interfaces_to_delete:
+            self._DeleteInterfaceFile(interface_name)
 
-  def _SaveInterfaceFile(self, interface):
-    """Saves an interface into the database.
+    def _SaveInterfaceFile(self, interface):
+        """Saves an interface into the database.
 
     Args:
       interface -- an IDLInterface instance.
     """
 
-    interface_name = interface.id
+        interface_name = interface.id
 
-    # Actual saving
-    file_path = self._FilePath(interface_name)
-    _logger.debug('writing %s' % file_path)
+        # Actual saving
+        file_path = self._FilePath(interface_name)
+        _logger.debug('writing %s' % file_path)
 
-    dir_name = os.path.dirname(file_path)
-    if not os.path.exists(dir_name):
-      _logger.debug('creating directory %s' % dir_name)
-      os.mkdir(dir_name)
+        dir_name = os.path.dirname(file_path)
+        if not os.path.exists(dir_name):
+            _logger.debug('creating directory %s' % dir_name)
+            os.mkdir(dir_name)
 
-    # Render the IDLInterface object into text.
-    text = idlrenderer.render(interface)
+        # Render the IDLInterface object into text.
+        text = idlrenderer.render(interface)
 
-    f = open(file_path, 'w')
-    f.write(text)
-    f.close()
+        f = open(file_path, 'w')
+        f.write(text)
+        f.close()
 
-  def HasInterface(self, interface_name):
-    """Returns True if the interface is in memory"""
-    return interface_name in self._all_interfaces
+    def HasInterface(self, interface_name):
+        """Returns True if the interface is in memory"""
+        return interface_name in self._all_interfaces
 
-  def GetInterface(self, interface_name):
-    """Returns an IDLInterface corresponding to the interface_name
+    def GetInterface(self, interface_name):
+        """Returns an IDLInterface corresponding to the interface_name
     from memory.
 
     Args:
       interface_name -- the name of the interface.
     """
-    if interface_name not in self._all_interfaces:
-      raise RuntimeError('Interface %s is not loaded' % interface_name)
-    return self._all_interfaces[interface_name]
+        if interface_name not in self._all_interfaces:
+            raise RuntimeError('Interface %s is not loaded' % interface_name)
+        return self._all_interfaces[interface_name]
 
-  def AddInterface(self, interface):
-    """Returns an IDLInterface corresponding to the interface_name
+    def AddInterface(self, interface):
+        """Returns an IDLInterface corresponding to the interface_name
     from memory.
 
     Args:
       interface -- the name of the interface.
     """
-    interface_name = interface.id
-    if interface_name in self._all_interfaces:
-      raise RuntimeError('Interface %s already exists' % interface_name)
-    self._all_interfaces[interface_name] = interface
+        interface_name = interface.id
+        if interface_name in self._all_interfaces:
+            raise RuntimeError('Interface %s already exists' % interface_name)
+        self._all_interfaces[interface_name] = interface
 
-  def GetInterfaces(self):
-    """Returns a list of all loaded interfaces."""
-    res = []
-    for _, interface in sorted(self._all_interfaces.items()):
-      res.append(interface)
-    return res
+    def GetInterfaces(self):
+        """Returns a list of all loaded interfaces."""
+        res = []
+        for _, interface in sorted(self._all_interfaces.items()):
+            res.append(interface)
+        return res
 
-  def DeleteInterface(self, interface_name):
-    """Deletes an interface from the database. File is deleted when
+    def DeleteInterface(self, interface_name):
+        """Deletes an interface from the database. File is deleted when
     Save() is called.
 
     Args:
       interface_name -- the name of the interface.
     """
-    if interface_name not in self._all_interfaces:
-      raise RuntimeError('Interface %s not found' % interface_name)
-    self._interfaces_to_delete.append(interface_name)
-    del self._all_interfaces[interface_name]
+        if interface_name not in self._all_interfaces:
+            raise RuntimeError('Interface %s not found' % interface_name)
+        self._interfaces_to_delete.append(interface_name)
+        del self._all_interfaces[interface_name]
 
-  def _DeleteInterfaceFile(self, interface_name):
-    """Actual file deletion"""
-    file_path = self._FilePath(interface_name)
-    if os.path.exists(file_path):
-      _logger.debug('deleting %s' % file_path)
-      os.remove(file_path)
+    def _DeleteInterfaceFile(self, interface_name):
+        """Actual file deletion"""
+        file_path = self._FilePath(interface_name)
+        if os.path.exists(file_path):
+            _logger.debug('deleting %s' % file_path)
+            os.remove(file_path)
 
-  def Hierarchy(self, interface):
-    yield interface
-    for parent in interface.parents:
-      parent_name = parent.type.id
-      if not self.HasInterface(parent.type.id):
-        continue
-      for parent_interface in self.Hierarchy(self.GetInterface(parent.type.id)):
-        yield parent_interface
+    def Hierarchy(self, interface):
+        yield interface
+        for parent in interface.parents:
+            parent_name = parent.type.id
+            if not self.HasInterface(parent.type.id):
+                continue
+            for parent_interface in self.Hierarchy(
+                    self.GetInterface(parent.type.id)):
+                yield parent_interface
 
-  def HasEnum(self, enum_name):
-    return enum_name in self._enums
+    def HasEnum(self, enum_name):
+        return enum_name in self._enums
 
-  def GetEnum(self, enum_name):
-    return self._enums[enum_name]
+    def GetEnum(self, enum_name):
+        return self._enums[enum_name]
 
-  def AddEnum(self, enum):
-    self._enums[enum.id] = enum
+    def AddEnum(self, enum):
+        self._enums[enum.id] = enum
 
-  def HasDictionary(self, dictionary_name):
-    """Returns True if the dictionary is in memory"""
-    return dictionary_name in self._all_dictionaries
+    def HasDictionary(self, dictionary_name):
+        """Returns True if the dictionary is in memory"""
+        return dictionary_name in self._all_dictionaries
 
-  def GetDictionary(self, dictionary_name):
-    """Returns an IDLDictionary corresponding to the dictionary_name
+    def GetDictionary(self, dictionary_name):
+        """Returns an IDLDictionary corresponding to the dictionary_name
     from memory.
 
     Args:
       dictionary_name -- the name of the dictionary.
     """
-    if dictionary_name not in self._all_dictionaries:
-      raise RuntimeError('Dictionary %s is not loaded' % dictionary_name)
-    return self._all_dictionaries[dictionary_name]
+        if dictionary_name not in self._all_dictionaries:
+            raise RuntimeError('Dictionary %s is not loaded' % dictionary_name)
+        return self._all_dictionaries[dictionary_name]
 
-  def AddDictionary(self, dictionary):
-    """Returns an IDLDictionary corresponding to the dictionary_name
+    def AddDictionary(self, dictionary):
+        """Returns an IDLDictionary corresponding to the dictionary_name
     from memory.
 
     Args:
       dictionary -- the name of the dictionary.
     """
-    dictionary_name = dictionary.id
-    if dictionary_name in self._all_dictionaries:
-      raise RuntimeError('Dictionary %s already exists' % dictionary_name)
-    self._all_dictionaries[dictionary_name] = dictionary
+        dictionary_name = dictionary.id
+        if dictionary_name in self._all_dictionaries:
+            raise RuntimeError('Dictionary %s already exists' % dictionary_name)
+        self._all_dictionaries[dictionary_name] = dictionary
 
-  def GetDictionaries(self):
-    """Returns a list of all loaded dictionaries."""
-    res = []
-    for _, dictionary in sorted(self._all_dictionaries.items()):
-      res.append(dictionary)
-    return res
+    def GetDictionaries(self):
+        """Returns a list of all loaded dictionaries."""
+        res = []
+        for _, dictionary in sorted(self._all_dictionaries.items()):
+            res.append(dictionary)
+        return res
 
-  def HasTypeDef(self, type_def_name):
-    """Returns True if the typedef is in memory"""
-    return type_def_name in self._all_type_defs
+    def HasTypeDef(self, type_def_name):
+        """Returns True if the typedef is in memory"""
+        return type_def_name in self._all_type_defs
 
-  def GetTypeDef(self, type_def_name):
-    """Returns an IDLTypeDef corresponding to the type_def_name
+    def GetTypeDef(self, type_def_name):
+        """Returns an IDLTypeDef corresponding to the type_def_name
     from memory.
 
     Args:
       type_def_name -- the name of the typedef.
     """
-    if type_def_name not in self._all_type_defs:
-      raise RuntimeError('Typedef %s is not loaded' % type_def_name)
-    return self._all_type_defs[type_def_name]
+        if type_def_name not in self._all_type_defs:
+            raise RuntimeError('Typedef %s is not loaded' % type_def_name)
+        return self._all_type_defs[type_def_name]
 
-  def AddTypeDef(self, type_def):
-    """Add only a typedef that a unions they map to any (no type)."""
-    type_def_name = type_def.id
-    if type_def_name in self._all_type_defs:
-      raise RuntimeError('Typedef %s already exists' % type_def_name)
-    self._all_type_defs[type_def_name] = type_def
-    print '  Added typedef %s' % type_def_name
+    def AddTypeDef(self, type_def):
+        """Add only a typedef that a unions they map to any (no type)."""
+        type_def_name = type_def.id
+        if type_def_name in self._all_type_defs:
+            raise RuntimeError('Typedef %s already exists' % type_def_name)
+        self._all_type_defs[type_def_name] = type_def
+        print '  Added typedef %s' % type_def_name
 
-  def TransitiveSecondaryParents(self, interface, propagate_event_target):
-    """Returns a list of all non-primary parents.
+    def TransitiveSecondaryParents(self, interface, propagate_event_target):
+        """Returns a list of all non-primary parents.
 
     The list contains the interface objects for interfaces defined in the
     database, and the name for undefined interfaces.
     """
-    def walk(parents, walk_result):
-      for parent in parents:
-        parent_name = parent.type.id
-        if IsDartCollectionType(parent_name):
-          if not(parent_name in walk_result):
-            walk_result.append(parent_name)
-          continue
-        if self.HasInterface(parent_name):
-          parent_interface = self.GetInterface(parent_name)
-          if not(parent_interface in walk_result):
-            # Interface has multi-inherited don't add interfaces more than once
-            # to our parent result list.
-            walk_result.append(parent_interface)
-          walk(parent_interface.parents, walk_result)
-      return walk_result
 
-    result = []
-    if interface.parents:
-      parent = interface.parents[0]
-      if (IsPureInterface(parent.type.id, self) or
-          (propagate_event_target and parent.type.id == 'EventTarget')):
-        result = walk(interface.parents, [])
-      else:
-        result = walk(interface.parents[1:], [])
+        def walk(parents, walk_result):
+            for parent in parents:
+                parent_name = parent.type.id
+                if IsDartCollectionType(parent_name):
+                    if not (parent_name in walk_result):
+                        walk_result.append(parent_name)
+                    continue
+                if self.HasInterface(parent_name):
+                    parent_interface = self.GetInterface(parent_name)
+                    if not (parent_interface in walk_result):
+                        # Interface has multi-inherited don't add interfaces more than once
+                        # to our parent result list.
+                        walk_result.append(parent_interface)
+                    walk(parent_interface.parents, walk_result)
+            return walk_result
 
-    return result
+        result = []
+        if interface.parents:
+            parent = interface.parents[0]
+            if (IsPureInterface(parent.type.id, self) or
+                (propagate_event_target and parent.type.id == 'EventTarget')):
+                result = walk(interface.parents, [])
+            else:
+                result = walk(interface.parents[1:], [])
 
+        return result
diff --git a/tools/dom/scripts/database_test.py b/tools/dom/scripts/database_test.py
index de75160..85c6e3e 100755
--- a/tools/dom/scripts/database_test.py
+++ b/tools/dom/scripts/database_test.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 for database module."""
 
 import logging.config
@@ -17,77 +16,76 @@
 
 class DatabaseTestCase(unittest.TestCase):
 
-  def _ParseInterface(self, content):
-    ast = self._idl_parser.parse(content)
-    return idlnode.IDLFile(ast).interfaces[0]
+    def _ParseInterface(self, content):
+        ast = self._idl_parser.parse(content)
+        return idlnode.IDLFile(ast).interfaces[0]
 
-  def _ListInterfaces(self, db):
-    res = []
-    for interface in db.GetInterfaces():
-      name = interface.id
-      res.append(name)
-    return res
+    def _ListInterfaces(self, db):
+        res = []
+        for interface in db.GetInterfaces():
+            name = interface.id
+            res.append(name)
+        return res
 
-  def setUp(self):
-    self._idl_parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+    def setUp(self):
+        self._idl_parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
 
-    working_dir = tempfile.mkdtemp()
-    self._database_dir = os.path.join(working_dir, 'database')
-    self.assertFalse(os.path.exists(self._database_dir))
+        working_dir = tempfile.mkdtemp()
+        self._database_dir = os.path.join(working_dir, 'database')
+        self.assertFalse(os.path.exists(self._database_dir))
 
-    # Create database and add one interface.
-    db = database.Database(self._database_dir)
-    interface = self._ParseInterface('interface I1 {};')
-    db.AddInterface(interface)
-    db.Save()
-    self.assertTrue(
-        os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
+        # Create database and add one interface.
+        db = database.Database(self._database_dir)
+        interface = self._ParseInterface('interface I1 {};')
+        db.AddInterface(interface)
+        db.Save()
+        self.assertTrue(
+            os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
 
-  def tearDown(self):
-    shutil.rmtree(self._database_dir)
+    def tearDown(self):
+        shutil.rmtree(self._database_dir)
 
-  def testCreate(self):
-    self.assertTrue(os.path.exists(self._database_dir))
+    def testCreate(self):
+        self.assertTrue(os.path.exists(self._database_dir))
 
-  def testListInterfaces(self):
-    db = database.Database(self._database_dir)
-    db.Load()
-    self.assertEquals(self._ListInterfaces(db), ['I1'])
+    def testListInterfaces(self):
+        db = database.Database(self._database_dir)
+        db.Load()
+        self.assertEquals(self._ListInterfaces(db), ['I1'])
 
-  def testHasInterface(self):
-    db = database.Database(self._database_dir)
-    db.Load()
-    self.assertTrue(db.HasInterface('I1'))
-    self.assertFalse(db.HasInterface('I2'))
+    def testHasInterface(self):
+        db = database.Database(self._database_dir)
+        db.Load()
+        self.assertTrue(db.HasInterface('I1'))
+        self.assertFalse(db.HasInterface('I2'))
 
-  def testAddInterface(self):
-    db = database.Database(self._database_dir)
-    db.Load()
-    interface = self._ParseInterface('interface I2 {};')
-    db.AddInterface(interface)
-    db.Save()
-    self.assertTrue(
-        os.path.exists(os.path.join(self._database_dir, 'I2.idl')))
-    self.assertEquals(self._ListInterfaces(db),
-                      ['I1', 'I2'])
+    def testAddInterface(self):
+        db = database.Database(self._database_dir)
+        db.Load()
+        interface = self._ParseInterface('interface I2 {};')
+        db.AddInterface(interface)
+        db.Save()
+        self.assertTrue(
+            os.path.exists(os.path.join(self._database_dir, 'I2.idl')))
+        self.assertEquals(self._ListInterfaces(db), ['I1', 'I2'])
 
-  def testDeleteInterface(self):
-    db = database.Database(self._database_dir)
-    db.Load()
-    db.DeleteInterface('I1')
-    db.Save()
-    self.assertFalse(
-        os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
-    self.assertEquals(self._ListInterfaces(db), [])
+    def testDeleteInterface(self):
+        db = database.Database(self._database_dir)
+        db.Load()
+        db.DeleteInterface('I1')
+        db.Save()
+        self.assertFalse(
+            os.path.exists(os.path.join(self._database_dir, 'I1.idl')))
+        self.assertEquals(self._ListInterfaces(db), [])
 
-  def testGetInterface(self):
-    db = database.Database(self._database_dir)
-    db.Load()
-    interface = db.GetInterface('I1')
-    self.assertEquals(interface.id, 'I1')
+    def testGetInterface(self):
+        db = database.Database(self._database_dir)
+        db.Load()
+        interface = db.GetInterface('I1')
+        self.assertEquals(interface.id, 'I1')
 
 
 if __name__ == '__main__':
-  logging.config.fileConfig('logging.conf')
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig('logging.conf')
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/databasebuilder.py b/tools/dom/scripts/databasebuilder.py
index 5c3ab8c..0636a47 100755
--- a/tools/dom/scripts/databasebuilder.py
+++ b/tools/dom/scripts/databasebuilder.py
@@ -34,16 +34,17 @@
 
 
 class DatabaseBuilderOptions(object):
-  """Used in specifying options when importing new interfaces"""
+    """Used in specifying options when importing new interfaces"""
 
-  def __init__(self,
-      idl_defines=[],
-      source=None, source_attributes={},
-      rename_operation_arguments_on_merge=False,
-      add_new_interfaces=True,
-      obsolete_old_declarations=False,
-      logging_level=logging.WARNING):
-    """Constructor.
+    def __init__(self,
+                 idl_defines=[],
+                 source=None,
+                 source_attributes={},
+                 rename_operation_arguments_on_merge=False,
+                 add_new_interfaces=True,
+                 obsolete_old_declarations=False,
+                 logging_level=logging.WARNING):
+        """Constructor.
     Args:
       idl_defines -- list of definitions for the idl gcc pre-processor
       source -- the origin of the IDL file, used for annotating the
@@ -58,21 +59,23 @@
       obsolete_old_declarations -- when True, if a declaration
         from a certain source is not re-declared, it will be removed.
     """
-    self.source = source
-    self.source_attributes = source_attributes
-    self.idl_defines = idl_defines
-    self.rename_operation_arguments_on_merge = \
-        rename_operation_arguments_on_merge
-    self.add_new_interfaces = add_new_interfaces
-    self.obsolete_old_declarations = obsolete_old_declarations
-    _logger.setLevel(logging_level)
+        self.source = source
+        self.source_attributes = source_attributes
+        self.idl_defines = idl_defines
+        self.rename_operation_arguments_on_merge = \
+            rename_operation_arguments_on_merge
+        self.add_new_interfaces = add_new_interfaces
+        self.obsolete_old_declarations = obsolete_old_declarations
+        _logger.setLevel(logging_level)
 
 
 def format_exception(e):
     exception_list = traceback.format_stack()
     exception_list = exception_list[:-2]
     exception_list.extend(traceback.format_tb(sys.exc_info()[2]))
-    exception_list.extend(traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]))
+    exception_list.extend(
+        traceback.format_exception_only(sys.exc_info()[0],
+                                        sys.exc_info()[1]))
 
     exception_str = "Traceback (most recent call last):\n"
     exception_str += "".join(exception_list)
@@ -84,40 +87,41 @@
 
 # Compile IDL using Blink's IDL compiler.
 def _compile_idl_file(build, file_name, import_options):
-  try:
-    idl_file_fullpath = os.path.realpath(file_name)
-    idl_definition = build.idl_compiler.compile_file(idl_file_fullpath)
-    return idl_definition
-  except Exception as err:
-    print 'ERROR: idl_compiler.py: ' + os.path.basename(file_name)
-    print err
-    print
-    print 'Stack Dump:'
-    print format_exception(err)
+    try:
+        idl_file_fullpath = os.path.realpath(file_name)
+        idl_definition = build.idl_compiler.compile_file(idl_file_fullpath)
+        return idl_definition
+    except Exception as err:
+        print 'ERROR: idl_compiler.py: ' + os.path.basename(file_name)
+        print err
+        print
+        print 'Stack Dump:'
+        print format_exception(err)
 
-  return 1
+    return 1
 
 
 # Create the Model (IDLFile) from the new AST of the compiled IDL file.
 def _load_idl_file(build, file_name, import_options):
-  try:
-    # Compute interface name from IDL filename (it's one for one in WebKit).
-    name = os.path.splitext(os.path.basename(file_name))[0]
+    try:
+        # Compute interface name from IDL filename (it's one for one in WebKit).
+        name = os.path.splitext(os.path.basename(file_name))[0]
 
-    idl_definition = new_asts[name]
-    return IDLFile(idl_definition, file_name)
-  except Exception as err:
-    print 'ERROR: loading AST from cache: ' + os.path.basename(file_name)
-    print err
-    print
-    print 'Stack Dump:'
-    print format_exception(err)
+        idl_definition = new_asts[name]
+        return IDLFile(idl_definition, file_name)
+    except Exception as err:
+        print 'ERROR: loading AST from cache: ' + os.path.basename(file_name)
+        print err
+        print
+        print 'Stack Dump:'
+        print format_exception(err)
 
-  return 1
+    return 1
 
 
 # New IDL parser builder.
 class Build():
+
     def __init__(self, provider):
         # TODO(terry): Consider using the generator to do the work today we're
         #              driven by the databasebuilder.  Blink compiler requires
@@ -126,18 +130,22 @@
         #              then we'd have a real output directory. Today we use the
         #              compiler to only create an AST.
         self.output_directory = tempfile.mkdtemp()
-        attrib_file = os.path.join('Source', idl_validator.EXTENDED_ATTRIBUTES_FILENAME)
+        attrib_file = os.path.join('Source',
+                                   idl_validator.EXTENDED_ATTRIBUTES_FILENAME)
         # Create compiler.
-        self.idl_compiler = compiler.IdlCompilerDart(self.output_directory,
-                                            attrib_file,
-                                            interfaces_info=provider._info_collector.interfaces_info,
-                                            only_if_changed=True)
+        self.idl_compiler = compiler.IdlCompilerDart(
+            self.output_directory,
+            attrib_file,
+            interfaces_info=provider._info_collector.interfaces_info,
+            only_if_changed=True)
 
     def format_exception(self, e):
         exception_list = traceback.format_stack()
         exception_list = exception_list[:-2]
         exception_list.extend(traceback.format_tb(sys.exc_info()[2]))
-        exception_list.extend(traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]))
+        exception_list.extend(
+            traceback.format_exception_only(sys.exc_info()[0],
+                                            sys.exc_info()[1]))
 
         exception_str = "Traceback (most recent call last):\n"
         exception_str += "".join(exception_list)
@@ -163,188 +171,193 @@
 
 
 class DatabaseBuilder(object):
-  def __init__(self, database):
-    """DatabaseBuilder is used for importing and merging interfaces into
+
+    def __init__(self, database):
+        """DatabaseBuilder is used for importing and merging interfaces into
     the Database"""
-    self._info_collector = InterfaceInfoCollector()
+        self._info_collector = InterfaceInfoCollector()
 
-    self._database = database
-    self._imported_interfaces = []
-    self._impl_stmts = []
-    self.conditionals_met = set()
+        self._database = database
+        self._imported_interfaces = []
+        self._impl_stmts = []
+        self.conditionals_met = set()
 
-    # Spin up the new IDL parser.
-    self.build = Build(self)
+        # Spin up the new IDL parser.
+        self.build = Build(self)
 
-    # Global typedef to mapping.
-    self.global_type_defs = monitored.Dict('databasebuilder.global_type_defs', {
-      'Transferable' : 'MessagePort',
-    })
+        # Global typedef to mapping.
+        self.global_type_defs = monitored.Dict(
+            'databasebuilder.global_type_defs', {
+                'Transferable': 'MessagePort',
+            })
 
-  # TODO(terry): Consider keeping richer type information (e.g.,
-  #              IdlArrayOrSequenceType from the Blink parser) instead of just
-  #              a type name.
-  def _resolve_type_defs(self, idl_file):
-    for type_node in idl_file.all(IDLType):
-      resolved = False
-      type_name = type_node.id
-      for typedef in self.global_type_defs:
-        seq_name_typedef = 'sequence<%s>' % typedef
-        if type_name == typedef:
-          type_node.id = self.global_type_defs[typedef]
-          resolved = True
-        elif type_name == seq_name_typedef:
-          type_node.id = 'sequence<%s>' % self.global_type_defs[typedef]
-          resolved = True
-      if not(resolved):
-        for typedef in idl_file.typeDefs:
-          if type_name == typedef.id:
-            type_node.id = typedef.type.id
-            resolved = True
+    # TODO(terry): Consider keeping richer type information (e.g.,
+    #              IdlArrayOrSequenceType from the Blink parser) instead of just
+    #              a type name.
+    def _resolve_type_defs(self, idl_file):
+        for type_node in idl_file.all(IDLType):
+            resolved = False
+            type_name = type_node.id
+            for typedef in self.global_type_defs:
+                seq_name_typedef = 'sequence<%s>' % typedef
+                if type_name == typedef:
+                    type_node.id = self.global_type_defs[typedef]
+                    resolved = True
+                elif type_name == seq_name_typedef:
+                    type_node.id = 'sequence<%s>' % self.global_type_defs[
+                        typedef]
+                    resolved = True
+            if not (resolved):
+                for typedef in idl_file.typeDefs:
+                    if type_name == typedef.id:
+                        type_node.id = typedef.type.id
+                        resolved = True
 
-  def _strip_ext_attributes(self, idl_file):
-    """Strips unuseful extended attributes."""
-    for ext_attrs in idl_file.all(IDLExtAttrs):
-      # TODO: Decide which attributes are uninteresting.
-      pass
+    def _strip_ext_attributes(self, idl_file):
+        """Strips unuseful extended attributes."""
+        for ext_attrs in idl_file.all(IDLExtAttrs):
+            # TODO: Decide which attributes are uninteresting.
+            pass
 
-  def _rename_types(self, idl_file, import_options):
-    """Rename interface and type names with names provided in the
+    def _rename_types(self, idl_file, import_options):
+        """Rename interface and type names with names provided in the
     options. Also clears scopes from scoped names"""
 
-    strip_modules = lambda name: name.split('::')[-1]
+        strip_modules = lambda name: name.split('::')[-1]
 
-    def rename_node(idl_node):
-      idl_node.reset_id(strip_modules(idl_node.id))
+        def rename_node(idl_node):
+            idl_node.reset_id(strip_modules(idl_node.id))
 
-    def rename_ext_attrs(ext_attrs_node):
-      for type_valued_attribute_name in ['DartSupplemental']:
-        if type_valued_attribute_name in ext_attrs_node:
-          value = ext_attrs_node[type_valued_attribute_name]
-          if isinstance(value, str):
-            ext_attrs_node[type_valued_attribute_name] = strip_modules(value)
+        def rename_ext_attrs(ext_attrs_node):
+            for type_valued_attribute_name in ['DartSupplemental']:
+                if type_valued_attribute_name in ext_attrs_node:
+                    value = ext_attrs_node[type_valued_attribute_name]
+                    if isinstance(value, str):
+                        ext_attrs_node[
+                            type_valued_attribute_name] = strip_modules(value)
 
-    map(rename_node, idl_file.all(IDLInterface))
-    map(rename_node, idl_file.all(IDLType))
-    map(rename_ext_attrs, idl_file.all(IDLExtAttrs))
+        map(rename_node, idl_file.all(IDLInterface))
+        map(rename_node, idl_file.all(IDLType))
+        map(rename_ext_attrs, idl_file.all(IDLExtAttrs))
 
-  def _annotate(self, interface, import_options):
-    """Adds @ annotations based on the source and source_attributes
+    def _annotate(self, interface, import_options):
+        """Adds @ annotations based on the source and source_attributes
     members of import_options."""
 
-    source = import_options.source
-    if not source:
-      return
+        source = import_options.source
+        if not source:
+            return
 
-    def add_source_annotation(idl_node):
-      annotation = IDLAnnotation(
-        copy.deepcopy(import_options.source_attributes))
-      idl_node.annotations[source] = annotation
-      if ((isinstance(idl_node, IDLInterface) or
-           isinstance(idl_node, IDLMember)) and
-          idl_node.is_fc_suppressed):
-        annotation['suppressed'] = None
+        def add_source_annotation(idl_node):
+            annotation = IDLAnnotation(
+                copy.deepcopy(import_options.source_attributes))
+            idl_node.annotations[source] = annotation
+            if ((isinstance(idl_node, IDLInterface) or
+                 isinstance(idl_node, IDLMember)) and
+                    idl_node.is_fc_suppressed):
+                annotation['suppressed'] = None
 
-    add_source_annotation(interface)
+        add_source_annotation(interface)
 
-    map(add_source_annotation, interface.parents)
-    map(add_source_annotation, interface.constants)
-    map(add_source_annotation, interface.attributes)
-    map(add_source_annotation, interface.operations)
+        map(add_source_annotation, interface.parents)
+        map(add_source_annotation, interface.constants)
+        map(add_source_annotation, interface.attributes)
+        map(add_source_annotation, interface.operations)
 
-  def _sign(self, node):
-    """Computes a unique signature for the node, for merging purposed, by
+    def _sign(self, node):
+        """Computes a unique signature for the node, for merging purposed, by
     concatenating types and names in the declaration."""
-    if isinstance(node, IDLType):
-      res = node.id
-      if res.startswith('unsigned '):
-        res = res[len('unsigned '):]
-      return res
+        if isinstance(node, IDLType):
+            res = node.id
+            if res.startswith('unsigned '):
+                res = res[len('unsigned '):]
+            return res
 
-    res = []
-    if isinstance(node, IDLInterface):
-      res = ['interface', node.id]
-    elif isinstance(node, IDLParentInterface):
-      res = ['parent', self._sign(node.type)]
-    elif isinstance(node, IDLOperation):
-      res = ['op']
-      for special in node.specials:
-        res.append(special)
-      if node.id is not None:
-        res.append(node.id)
-      for arg in node.arguments:
-        res.append(self._sign(arg.type))
-      res.append(self._sign(node.type))
-    elif isinstance(node, IDLAttribute):
-      res = []
-      if node.is_read_only:
-        res.append('readonly')
-      res.append(node.id)
-      res.append(self._sign(node.type))
-    elif isinstance(node, IDLConstant):
-      res = []
-      res.append('const')
-      res.append(node.id)
-      res.append(node.value)
-      res.append(self._sign(node.type))
-    else:
-      raise TypeError("Can't sign input of type %s" % type(node))
-    return ':'.join(res)
+        res = []
+        if isinstance(node, IDLInterface):
+            res = ['interface', node.id]
+        elif isinstance(node, IDLParentInterface):
+            res = ['parent', self._sign(node.type)]
+        elif isinstance(node, IDLOperation):
+            res = ['op']
+            for special in node.specials:
+                res.append(special)
+            if node.id is not None:
+                res.append(node.id)
+            for arg in node.arguments:
+                res.append(self._sign(arg.type))
+            res.append(self._sign(node.type))
+        elif isinstance(node, IDLAttribute):
+            res = []
+            if node.is_read_only:
+                res.append('readonly')
+            res.append(node.id)
+            res.append(self._sign(node.type))
+        elif isinstance(node, IDLConstant):
+            res = []
+            res.append('const')
+            res.append(node.id)
+            res.append(node.value)
+            res.append(self._sign(node.type))
+        else:
+            raise TypeError("Can't sign input of type %s" % type(node))
+        return ':'.join(res)
 
-  def _build_signatures_map(self, idl_node_list):
-    """Creates a hash table mapping signatures to idl_nodes for the
+    def _build_signatures_map(self, idl_node_list):
+        """Creates a hash table mapping signatures to idl_nodes for the
     given list of nodes"""
-    res = {}
-    for idl_node in idl_node_list:
-      sig = self._sign(idl_node)
-      if sig is None:
-        continue
-      if sig in res:
-        op = res[sig]
-        # Only report if the operations that match are either both suppressed
-        # or both not suppressed.  Optional args aren't part of type signature
-        # for this routine. Suppressing a non-optional type and supplementing
-        # with an optional type appear the same.
-        if idl_node.is_fc_suppressed == op.is_fc_suppressed:
-          raise RuntimeError('Warning: Multiple members have the same '
-                           '  signature: "%s"' % sig)
-      res[sig] = idl_node
-    return res
+        res = {}
+        for idl_node in idl_node_list:
+            sig = self._sign(idl_node)
+            if sig is None:
+                continue
+            if sig in res:
+                op = res[sig]
+                # Only report if the operations that match are either both suppressed
+                # or both not suppressed.  Optional args aren't part of type signature
+                # for this routine. Suppressing a non-optional type and supplementing
+                # with an optional type appear the same.
+                if idl_node.is_fc_suppressed == op.is_fc_suppressed:
+                    raise RuntimeError(
+                        'Warning: Multiple members have the same '
+                        '  signature: "%s"' % sig)
+            res[sig] = idl_node
+        return res
 
-  def _get_parent_interfaces(self, interface):
-    """Return a list of all the parent interfaces of a given interface"""
-    res = []
+    def _get_parent_interfaces(self, interface):
+        """Return a list of all the parent interfaces of a given interface"""
+        res = []
 
-    def recurse(current_interface):
-      if current_interface in res:
-        return
-      res.append(current_interface)
-      for parent in current_interface.parents:
-        parent_name = parent.type.id
-        if self._database.HasInterface(parent_name):
-          recurse(self._database.GetInterface(parent_name))
+        def recurse(current_interface):
+            if current_interface in res:
+                return
+            res.append(current_interface)
+            for parent in current_interface.parents:
+                parent_name = parent.type.id
+                if self._database.HasInterface(parent_name):
+                    recurse(self._database.GetInterface(parent_name))
 
-    recurse(interface)
-    return res[1:]
+        recurse(interface)
+        return res[1:]
 
-  def _merge_ext_attrs(self, old_attrs, new_attrs):
-    """Merges two sets of extended attributes.
+    def _merge_ext_attrs(self, old_attrs, new_attrs):
+        """Merges two sets of extended attributes.
 
     Returns: True if old_attrs has changed.
     """
-    changed = False
-    for (name, value) in new_attrs.items():
-      if name in old_attrs and old_attrs[name] == value:
-        pass # Identical
-      else:
-        if name == 'ImplementedAs' and name in old_attrs:
-          continue
-        old_attrs[name] = value
-        changed = True
-    return changed
+        changed = False
+        for (name, value) in new_attrs.items():
+            if name in old_attrs and old_attrs[name] == value:
+                pass  # Identical
+            else:
+                if name == 'ImplementedAs' and name in old_attrs:
+                    continue
+                old_attrs[name] = value
+                changed = True
+        return changed
 
-  def _merge_nodes(self, old_list, new_list, import_options):
-    """Merges two lists of nodes. Annotates nodes with the source of each
+    def _merge_nodes(self, old_list, new_list, import_options):
+        """Merges two lists of nodes. Annotates nodes with the source of each
     node.
 
     Returns:
@@ -355,676 +368,722 @@
       new_list -- list containing more nodes.
       import_options -- controls how merging is done.
     """
-    changed = False
+        changed = False
 
-    source = import_options.source
+        source = import_options.source
 
-    old_signatures_map = self._build_signatures_map(old_list)
-    new_signatures_map = self._build_signatures_map(new_list)
+        old_signatures_map = self._build_signatures_map(old_list)
+        new_signatures_map = self._build_signatures_map(new_list)
 
-    # Merge new items
-    for (sig, new_node) in new_signatures_map.items():
-      if sig not in old_signatures_map:
-        # New node:
-        old_list.append(new_node)
-        changed = True
-      else:
-        # Merge old and new nodes:
-        old_node = old_signatures_map[sig]
-        if (source not in old_node.annotations
-            and source in new_node.annotations):
-          old_node.annotations[source] = new_node.annotations[source]
-          changed = True
-        # Maybe rename arguments:
-        if isinstance(old_node, IDLOperation):
-          for i in range(0, len(old_node.arguments)):
-            old_arg = old_node.arguments[i]
-            new_arg = new_node.arguments[i]
+        # Merge new items
+        for (sig, new_node) in new_signatures_map.items():
+            if sig not in old_signatures_map:
+                # New node:
+                old_list.append(new_node)
+                changed = True
+            else:
+                # Merge old and new nodes:
+                old_node = old_signatures_map[sig]
+                if (source not in old_node.annotations and
+                        source in new_node.annotations):
+                    old_node.annotations[source] = new_node.annotations[source]
+                    changed = True
+                # Maybe rename arguments:
+                if isinstance(old_node, IDLOperation):
+                    for i in range(0, len(old_node.arguments)):
+                        old_arg = old_node.arguments[i]
+                        new_arg = new_node.arguments[i]
 
-            old_arg_name = old_arg.id
-            new_arg_name = new_arg.id
-            if (old_arg_name != new_arg_name
-                and (old_arg_name == 'arg'
-                     or old_arg_name.endswith('Arg')
-                     or import_options.rename_operation_arguments_on_merge)):
-              old_node.arguments[i].id = new_arg_name
-              changed = True
+                        old_arg_name = old_arg.id
+                        new_arg_name = new_arg.id
+                        if (old_arg_name != new_arg_name and
+                            (old_arg_name == 'arg' or
+                             old_arg_name.endswith('Arg') or
+                             import_options.rename_operation_arguments_on_merge)
+                           ):
+                            old_node.arguments[i].id = new_arg_name
+                            changed = True
 
-            if self._merge_ext_attrs(old_arg.ext_attrs, new_arg.ext_attrs):
-              changed = True
+                        if self._merge_ext_attrs(old_arg.ext_attrs,
+                                                 new_arg.ext_attrs):
+                            changed = True
 
-            # Merge in [Default=Undefined] and DOMString a = null handling in
-            # IDL.  The IDL model (IDLArgument) coalesces these two different
-            # default value syntaxes into the default_value* models.
-            old_default_value = old_arg.default_value
-            new_default_value = new_arg.default_value
-            old_default_value_is_null = old_arg.default_value_is_null
-            new_default_value_is_null = new_arg.default_value_is_null
-            if old_default_value != new_default_value:
-              old_arg.default_value = new_default_value
-              changed = True
-            if old_default_value_is_null != new_default_value_is_null:
-              old_arg.default_value_is_null = new_default_value_is_null
-              changed = True
+                        # Merge in [Default=Undefined] and DOMString a = null handling in
+                        # IDL.  The IDL model (IDLArgument) coalesces these two different
+                        # default value syntaxes into the default_value* models.
+                        old_default_value = old_arg.default_value
+                        new_default_value = new_arg.default_value
+                        old_default_value_is_null = old_arg.default_value_is_null
+                        new_default_value_is_null = new_arg.default_value_is_null
+                        if old_default_value != new_default_value:
+                            old_arg.default_value = new_default_value
+                            changed = True
+                        if old_default_value_is_null != new_default_value_is_null:
+                            old_arg.default_value_is_null = new_default_value_is_null
+                            changed = True
 
-            # Merge in any optional argument differences.
-            old_optional = old_arg.optional
-            new_optional = new_arg.optional
-            if old_optional != new_optional:
-              old_arg.optional = new_optional
-              changed = True
-        # Maybe merge annotations:
-        if (isinstance(old_node, IDLAttribute) or
-            isinstance(old_node, IDLOperation)):
-          if self._merge_ext_attrs(old_node.ext_attrs, new_node.ext_attrs):
-            changed = True
+                        # Merge in any optional argument differences.
+                        old_optional = old_arg.optional
+                        new_optional = new_arg.optional
+                        if old_optional != new_optional:
+                            old_arg.optional = new_optional
+                            changed = True
+                # Maybe merge annotations:
+                if (isinstance(old_node, IDLAttribute) or
+                        isinstance(old_node, IDLOperation)):
+                    if self._merge_ext_attrs(old_node.ext_attrs,
+                                             new_node.ext_attrs):
+                        changed = True
 
-    # Remove annotations on obsolete items from the same source
-    if import_options.obsolete_old_declarations:
-      for (sig, old_node) in old_signatures_map.items():
-        if (source in old_node.annotations
-            and sig not in new_signatures_map):
-          _logger.warn('%s not available in %s anymore' %
-            (sig, source))
-          del old_node.annotations[source]
-          changed = True
+        # Remove annotations on obsolete items from the same source
+        if import_options.obsolete_old_declarations:
+            for (sig, old_node) in old_signatures_map.items():
+                if (source in old_node.annotations and
+                        sig not in new_signatures_map):
+                    _logger.warn(
+                        '%s not available in %s anymore' % (sig, source))
+                    del old_node.annotations[source]
+                    changed = True
 
-    return changed
+        return changed
 
-  def _merge_interfaces(self, old_interface, new_interface, import_options):
-    """Merges the new_interface into the old_interface, annotating the
+    def _merge_interfaces(self, old_interface, new_interface, import_options):
+        """Merges the new_interface into the old_interface, annotating the
     interface with the sources of each change."""
 
-    changed = False
+        changed = False
 
-    source = import_options.source
-    if (source and source not in old_interface.annotations and
-        source in new_interface.annotations and
-        not new_interface.is_supplemental):
-      old_interface.annotations[source] = new_interface.annotations[source]
-      changed = True
+        source = import_options.source
+        if (source and source not in old_interface.annotations and
+                source in new_interface.annotations and
+                not new_interface.is_supplemental):
+            old_interface.annotations[source] = new_interface.annotations[
+                source]
+            changed = True
 
-    def merge_list(what):
-      old_list = old_interface.__dict__[what]
-      new_list = new_interface.__dict__[what]
+        def merge_list(what):
+            old_list = old_interface.__dict__[what]
+            new_list = new_interface.__dict__[what]
 
-      if what != 'parents' and old_interface.id != new_interface.id:
-        for node in new_list:
-          node.doc_js_interface_name = old_interface.id
-          node.ext_attrs['ImplementedBy'] = new_interface.id
+            if what != 'parents' and old_interface.id != new_interface.id:
+                for node in new_list:
+                    node.doc_js_interface_name = old_interface.id
+                    node.ext_attrs['ImplementedBy'] = new_interface.id
 
-      changed = self._merge_nodes(old_list, new_list, import_options)
+            changed = self._merge_nodes(old_list, new_list, import_options)
 
-      # Delete list items with zero remaining annotations.
-      if changed and import_options.obsolete_old_declarations:
+            # Delete list items with zero remaining annotations.
+            if changed and import_options.obsolete_old_declarations:
 
-        def has_annotations(idl_node):
-          return len(idl_node.annotations)
+                def has_annotations(idl_node):
+                    return len(idl_node.annotations)
 
-        old_interface.__dict__[what] = filter(has_annotations, old_list)
+                old_interface.__dict__[what] = filter(has_annotations, old_list)
 
-      return changed
+            return changed
 
-    # Smartly merge various declarations:
-    if merge_list('parents'):
-      changed = True
-    if merge_list('constants'):
-      changed = True
-    if merge_list('attributes'):
-      changed = True
-    if merge_list('operations'):
-      changed = True
+        # Smartly merge various declarations:
+        if merge_list('parents'):
+            changed = True
+        if merge_list('constants'):
+            changed = True
+        if merge_list('attributes'):
+            changed = True
+        if merge_list('operations'):
+            changed = True
 
-    if self._merge_ext_attrs(old_interface.ext_attrs, new_interface.ext_attrs):
-      changed = True
+        if self._merge_ext_attrs(old_interface.ext_attrs,
+                                 new_interface.ext_attrs):
+            changed = True
 
-    _logger.info('merged interface %s (changed=%s, supplemental=%s)' %
-      (old_interface.id, changed, new_interface.is_supplemental))
+        _logger.info('merged interface %s (changed=%s, supplemental=%s)' %
+                     (old_interface.id, changed, new_interface.is_supplemental))
 
-    return changed
+        return changed
 
-  def _merge_impl_stmt(self, impl_stmt, import_options):
-    """Applies "X implements Y" statemetns on the proper places in the
+    def _merge_impl_stmt(self, impl_stmt, import_options):
+        """Applies "X implements Y" statemetns on the proper places in the
     database"""
-    implementor_name = impl_stmt.implementor.id
-    implemented_name = impl_stmt.implemented.id
-    _logger.info('merging impl stmt %s implements %s' %
-                 (implementor_name, implemented_name))
+        implementor_name = impl_stmt.implementor.id
+        implemented_name = impl_stmt.implemented.id
+        _logger.info('merging impl stmt %s implements %s' % (implementor_name,
+                                                             implemented_name))
 
-    source = import_options.source
-    if self._database.HasInterface(implementor_name):
-      interface = self._database.GetInterface(implementor_name)
-      if interface.parents is None:
-        interface.parents = []
-      for parent in interface.parents:
-        if parent.type.id == implemented_name:
-          if source and source not in parent.annotations:
-            parent.annotations[source] = IDLAnnotation(
-                import_options.source_attributes)
-          return
-      # not found, so add new one
-      parent = IDLParentInterface(None)
-      parent.type = IDLType(implemented_name)
-      if source:
-        parent.annotations[source] = IDLAnnotation(
-            import_options.source_attributes)
-      interface.parents.append(parent)
+        source = import_options.source
+        if self._database.HasInterface(implementor_name):
+            interface = self._database.GetInterface(implementor_name)
+            if interface.parents is None:
+                interface.parents = []
+            for parent in interface.parents:
+                if parent.type.id == implemented_name:
+                    if source and source not in parent.annotations:
+                        parent.annotations[source] = IDLAnnotation(
+                            import_options.source_attributes)
+                    return
+            # not found, so add new one
+            parent = IDLParentInterface(None)
+            parent.type = IDLType(implemented_name)
+            if source:
+                parent.annotations[source] = IDLAnnotation(
+                    import_options.source_attributes)
+            interface.parents.append(parent)
 
-  def merge_imported_interfaces(self):
-    """Merges all imported interfaces and loads them into the DB."""
-    imported_interfaces = self._imported_interfaces
+    def merge_imported_interfaces(self):
+        """Merges all imported interfaces and loads them into the DB."""
+        imported_interfaces = self._imported_interfaces
 
-    # Step 1: Pre process imported interfaces
-    for interface, import_options in imported_interfaces:
-      self._annotate(interface, import_options)
+        # Step 1: Pre process imported interfaces
+        for interface, import_options in imported_interfaces:
+            self._annotate(interface, import_options)
 
-    # Step 2: Add all new interfaces and merge overlapping ones
-    for interface, import_options in imported_interfaces:
-      if not interface.is_supplemental:
-        if self._database.HasInterface(interface.id):
-          old_interface = self._database.GetInterface(interface.id)
-          self._merge_interfaces(old_interface, interface, import_options)
+        # Step 2: Add all new interfaces and merge overlapping ones
+        for interface, import_options in imported_interfaces:
+            if not interface.is_supplemental:
+                if self._database.HasInterface(interface.id):
+                    old_interface = self._database.GetInterface(interface.id)
+                    self._merge_interfaces(old_interface, interface,
+                                           import_options)
+                else:
+                    if import_options.add_new_interfaces:
+                        self._database.AddInterface(interface)
+
+        # Step 3: Merge in supplemental interfaces
+        for interface, import_options in imported_interfaces:
+            if interface.is_supplemental:
+                target = interface.id
+                if self._database.HasInterface(target):
+                    old_interface = self._database.GetInterface(target)
+                    self._merge_interfaces(old_interface, interface,
+                                           import_options)
+                else:
+                    _logger.warning("Supplemental target '%s' not found",
+                                    target)
+
+        # Step 4: Resolve 'implements' statements
+        for impl_stmt, import_options in self._impl_stmts:
+            self._merge_impl_stmt(impl_stmt, import_options)
+
+        self._impl_stmts = []
+        self._imported_interfaces = []
+
+    def _compute_dart_idl_implements(self, idl_filename):
+        full_path = os.path.realpath(idl_filename)
+
+        with open(full_path) as f:
+            idl_file_contents = f.read()
+
+        implements_re = (r'^\s*' r'(\w+)\s+' r'implements\s+' r'(\w+)\s*' r';')
+
+        implements_matches = re.finditer(implements_re, idl_file_contents,
+                                         re.MULTILINE)
+        return [match.groups() for match in implements_matches]
+
+    # Compile the IDL file with the Blink compiler and remember each AST for the
+    # IDL.
+    def _blink_compile_idl_files(self, file_paths, import_options, is_dart_idl):
+        if not (is_dart_idl):
+            start_time = time.time()
+
+            # Compute information for individual files
+            # Information is stored in global variables interfaces_info and
+            # partial_interface_files.
+            for file_path in file_paths:
+                self._info_collector.collect_info(file_path)
+
+            end_time = time.time()
+            print 'Compute dependencies %s seconds' % round(
+                (end_time - start_time), 2)
         else:
-          if import_options.add_new_interfaces:
-            self._database.AddInterface(interface)
+            # Compute the interface_info for dart.idl for implements defined.  This
+            # file is special in that more than one interface can exist in this file.
+            implement_pairs = self._compute_dart_idl_implements(file_paths[0])
 
-    # Step 3: Merge in supplemental interfaces
-    for interface, import_options in imported_interfaces:
-      if interface.is_supplemental:
-        target = interface.id
-        if self._database.HasInterface(target):
-          old_interface = self._database.GetInterface(target)
-          self._merge_interfaces(old_interface, interface, import_options)
+            self._info_collector.interfaces_info['__dart_idl___'] = {
+                'implement_pairs': implement_pairs,
+            }
+
+        # Parse the IDL files serially.
+        start_time = time.time()
+
+        for file_path in file_paths:
+            file_path = os.path.normpath(file_path)
+            ast = _compile_idl_file(self.build, file_path, import_options)
+            self._process_ast(
+                os.path.splitext(os.path.basename(file_path))[0], ast)
+
+        end_time = time.time()
+        print 'Compiled %s IDL files in %s seconds' % (
+            len(file_paths), round((end_time - start_time), 2))
+
+    def _process_ast(self, filename, ast):
+        if len(ast) == 1:
+            ast = ast.values()[0]
         else:
-          _logger.warning("Supplemental target '%s' not found", target)
+            print 'ERROR: Processing AST: ' + os.path.basename(file_name)
+        new_asts[filename] = ast
 
-    # Step 4: Resolve 'implements' statements
-    for impl_stmt, import_options in self._impl_stmts:
-      self._merge_impl_stmt(impl_stmt, import_options)
+    def import_idl_files(self, file_paths, import_options, is_dart_idl):
+        self._blink_compile_idl_files(file_paths, import_options, is_dart_idl)
 
-    self._impl_stmts = []
-    self._imported_interfaces = []
+        start_time = time.time()
 
-  def _compute_dart_idl_implements(self, idl_filename):
-    full_path = os.path.realpath(idl_filename)
+        # Parse the IDL files in serial.
+        for file_path in file_paths:
+            file_path = os.path.normpath(file_path)
+            idl_file = _load_idl_file(self.build, file_path, import_options)
+            _logger.info('Processing %s' % os.path.splitext(
+                os.path.basename(file_path))[0])
+            self._process_idl_file(idl_file, import_options, is_dart_idl)
 
-    with open(full_path) as f:
-        idl_file_contents = f.read()
+        end_time = time.time()
 
-    implements_re = (r'^\s*'
-                     r'(\w+)\s+'
-                     r'implements\s+'
-                     r'(\w+)\s*'
-                     r';')
+        for warning in report_unions_to_any():
+            _logger.warning(warning)
 
-    implements_matches = re.finditer(implements_re, idl_file_contents, re.MULTILINE)
-    return [match.groups() for match in implements_matches]
+        print 'Total %s files %sprocessed in databasebuilder in %s seconds' % \
+        (len(file_paths), '', round((end_time - start_time), 2))
 
-  # Compile the IDL file with the Blink compiler and remember each AST for the
-  # IDL.
-  def _blink_compile_idl_files(self, file_paths, import_options, is_dart_idl):
-    if not(is_dart_idl):
-      start_time = time.time()
+    def _process_idl_file(self, idl_file, import_options, dart_idl=False):
+        # TODO(terry): strip_ext_attributes on an idl_file does nothing.
+        #self._strip_ext_attributes(idl_file)
+        self._resolve_type_defs(idl_file)
+        self._rename_types(idl_file, import_options)
 
-    # Compute information for individual files
-    # Information is stored in global variables interfaces_info and
-    # partial_interface_files.
-      for file_path in file_paths:
-        self._info_collector.collect_info(file_path)
+        def enabled(idl_node):
+            return self._is_node_enabled(idl_node, import_options.idl_defines)
 
-      end_time = time.time()
-      print 'Compute dependencies %s seconds' % round((end_time - start_time), 2)
-    else:
-      # Compute the interface_info for dart.idl for implements defined.  This
-      # file is special in that more than one interface can exist in this file.
-      implement_pairs = self._compute_dart_idl_implements(file_paths[0])
+        for interface in idl_file.interfaces:
+            if not self._is_node_enabled(interface, import_options.idl_defines):
+                _logger.info('skipping interface %s (source=%s)' %
+                             (interface.id, import_options.source))
+                continue
 
-      self._info_collector.interfaces_info['__dart_idl___'] = {
-        'implement_pairs': implement_pairs,
-      }
+            _logger.info('importing interface %s (source=%s file=%s)' %
+                         (interface.id, import_options.source,
+                          os.path.basename(idl_file.filename)))
 
-    # Parse the IDL files serially.
-    start_time = time.time()
+            interface.attributes = filter(enabled, interface.attributes)
+            interface.operations = filter(enabled, interface.operations)
+            self._imported_interfaces.append((interface, import_options))
 
-    for file_path in file_paths:
-      file_path = os.path.normpath(file_path)
-      ast = _compile_idl_file(self.build, file_path, import_options)
-      self._process_ast(os.path.splitext(os.path.basename(file_path))[0], ast)
+        # If an IDL dictionary then there is no implementsStatements.
+        if hasattr(idl_file, 'implementsStatements'):
+            for implStmt in idl_file.implementsStatements:
+                self._impl_stmts.append((implStmt, import_options))
 
-    end_time = time.time()
-    print 'Compiled %s IDL files in %s seconds' % (len(file_paths),
-                                                  round((end_time - start_time), 2))
+        for enum in idl_file.enums:
+            self._database.AddEnum(enum)
 
-  def _process_ast(self, filename, ast):
-    if len(ast) == 1:
-      ast = ast.values()[0]
-    else:
-      print 'ERROR: Processing AST: ' + os.path.basename(file_name)
-    new_asts[filename] = ast
+        for dictionary in idl_file.dictionaries:
+            self._database.AddDictionary(dictionary)
 
-  def import_idl_files(self, file_paths, import_options, is_dart_idl):
-    self._blink_compile_idl_files(file_paths, import_options, is_dart_idl)
+        # TODO(terry): Hack to remember all typedef unions they're mapped to any
+        #              - no type.
+        for typedef in idl_file.typeDefs:
+            self._database.AddTypeDef(typedef)
 
-    start_time = time.time()
+    def _is_node_enabled(self, node, idl_defines):
+        if not 'Conditional' in node.ext_attrs:
+            return True
 
-    # Parse the IDL files in serial.
-    for file_path in file_paths:
-      file_path = os.path.normpath(file_path)
-      idl_file = _load_idl_file(self.build, file_path, import_options)
-      _logger.info('Processing %s' % os.path.splitext(os.path.basename(file_path))[0])
-      self._process_idl_file(idl_file, import_options, is_dart_idl)
+        def enabled(condition):
+            return 'ENABLE_%s' % condition in idl_defines
 
-    end_time = time.time()
+        conditional = node.ext_attrs['Conditional']
+        if conditional.find('&') != -1:
+            for condition in conditional.split('&'):
+                condition = condition.strip()
+                self.conditionals_met.add(condition)
+                if not enabled(condition):
+                    return False
+            return True
 
-    for warning in report_unions_to_any():
-      _logger.warning(warning)
+        for condition in conditional.split('|'):
+            condition = condition.strip()
+            self.conditionals_met.add(condition)
+            if enabled(condition):
+                return True
+        return False
 
-    print 'Total %s files %sprocessed in databasebuilder in %s seconds' % \
-    (len(file_paths), '', round((end_time - start_time), 2))
-
-  def _process_idl_file(self, idl_file, import_options, dart_idl = False):
-    # TODO(terry): strip_ext_attributes on an idl_file does nothing.
-    #self._strip_ext_attributes(idl_file)
-    self._resolve_type_defs(idl_file)
-    self._rename_types(idl_file, import_options)
-
-    def enabled(idl_node):
-      return self._is_node_enabled(idl_node, import_options.idl_defines)
-
-    for interface in idl_file.interfaces:
-      if not self._is_node_enabled(interface, import_options.idl_defines):
-        _logger.info('skipping interface %s (source=%s)'
-          % (interface.id, import_options.source))
-        continue
-
-      _logger.info('importing interface %s (source=%s file=%s)'
-        % (interface.id, import_options.source, os.path.basename(idl_file.filename)))
-
-      interface.attributes = filter(enabled, interface.attributes)
-      interface.operations = filter(enabled, interface.operations)
-      self._imported_interfaces.append((interface, import_options))
-
-    # If an IDL dictionary then there is no implementsStatements.
-    if hasattr(idl_file, 'implementsStatements'):
-      for implStmt in idl_file.implementsStatements:
-        self._impl_stmts.append((implStmt, import_options))
-
-    for enum in idl_file.enums:
-      self._database.AddEnum(enum)
-
-    for dictionary in idl_file.dictionaries:
-      self._database.AddDictionary(dictionary)
-
-    # TODO(terry): Hack to remember all typedef unions they're mapped to any
-    #              - no type.
-    for typedef in idl_file.typeDefs:
-      self._database.AddTypeDef(typedef)
-
-  def _is_node_enabled(self, node, idl_defines):
-    if not 'Conditional' in node.ext_attrs:
-      return True
-
-    def enabled(condition):
-      return 'ENABLE_%s' % condition in idl_defines
-
-    conditional = node.ext_attrs['Conditional']
-    if conditional.find('&') != -1:
-      for condition in conditional.split('&'):
-        condition = condition.strip()
-        self.conditionals_met.add(condition)
-        if not enabled(condition):
-          return False
-      return True
-
-    for condition in conditional.split('|'):
-      condition = condition.strip()
-      self.conditionals_met.add(condition)
-      if enabled(condition):
-        return True
-    return False
-
-  def fix_displacements(self, source):
-    """E.g. In W3C, something is declared on HTMLDocument but in WebKit
+    def fix_displacements(self, source):
+        """E.g. In W3C, something is declared on HTMLDocument but in WebKit
     its on Document, so we need to mark that something in HTMLDocument
     with @WebKit(via=Document). The 'via' attribute specifies the
     parent interface that has the declaration."""
 
-    for interface in self._database.GetInterfaces():
-      changed = False
+        for interface in self._database.GetInterfaces():
+            changed = False
 
-      _logger.info('fixing displacements in %s' % interface.id)
+            _logger.info('fixing displacements in %s' % interface.id)
 
-      for parent_interface in self._get_parent_interfaces(interface):
-        _logger.info('scanning parent %s of %s' %
-          (parent_interface.id, interface.id))
+            for parent_interface in self._get_parent_interfaces(interface):
+                _logger.info('scanning parent %s of %s' % (parent_interface.id,
+                                                           interface.id))
 
-        def fix_nodes(local_list, parent_list):
-          changed = False
-          parent_signatures_map = self._build_signatures_map(
-            parent_list)
-          for idl_node in local_list:
-            sig = self._sign(idl_node)
-            if sig in parent_signatures_map:
-              parent_member = parent_signatures_map[sig]
-              if (source in parent_member.annotations
-                  and source not in idl_node.annotations
-                  and _VIA_ANNOTATION_ATTR_NAME
-                      not in parent_member.annotations[source]):
-                idl_node.annotations[source] = IDLAnnotation(
-                    {_VIA_ANNOTATION_ATTR_NAME: parent_interface.id})
-                changed = True
-          return changed
+                def fix_nodes(local_list, parent_list):
+                    changed = False
+                    parent_signatures_map = self._build_signatures_map(
+                        parent_list)
+                    for idl_node in local_list:
+                        sig = self._sign(idl_node)
+                        if sig in parent_signatures_map:
+                            parent_member = parent_signatures_map[sig]
+                            if (source in parent_member.annotations and
+                                    source not in idl_node.annotations and
+                                    _VIA_ANNOTATION_ATTR_NAME not in
+                                    parent_member.annotations[source]):
+                                idl_node.annotations[source] = IDLAnnotation({
+                                    _VIA_ANNOTATION_ATTR_NAME:
+                                    parent_interface.id
+                                })
+                                changed = True
+                    return changed
 
-        changed = fix_nodes(interface.constants,
-                  parent_interface.constants) or changed
-        changed = fix_nodes(interface.attributes,
-                  parent_interface.attributes) or changed
-        changed = fix_nodes(interface.operations,
-                  parent_interface.operations) or changed
-      if changed:
-        _logger.info('fixed displaced declarations in %s' %
-          interface.id)
+                changed = fix_nodes(interface.constants,
+                                    parent_interface.constants) or changed
+                changed = fix_nodes(interface.attributes,
+                                    parent_interface.attributes) or changed
+                changed = fix_nodes(interface.operations,
+                                    parent_interface.operations) or changed
+            if changed:
+                _logger.info(
+                    'fixed displaced declarations in %s' % interface.id)
 
-  def normalize_annotations(self, sources):
-    """Makes the IDLs less verbose by removing annotation attributes
+    def normalize_annotations(self, sources):
+        """Makes the IDLs less verbose by removing annotation attributes
     that are identical to the ones defined at the interface level.
 
     Args:
       sources -- list of source names to normalize."""
-    for interface in self._database.GetInterfaces():
-      _logger.debug('normalizing annotations for %s' % interface.id)
-      for source in sources:
-        if (source not in interface.annotations or
-            not interface.annotations[source]):
-          continue
-        top_level_annotation = interface.annotations[source]
+        for interface in self._database.GetInterfaces():
+            _logger.debug('normalizing annotations for %s' % interface.id)
+            for source in sources:
+                if (source not in interface.annotations or
+                        not interface.annotations[source]):
+                    continue
+                top_level_annotation = interface.annotations[source]
 
-        def normalize(idl_node):
-          if (source in idl_node.annotations
-              and idl_node.annotations[source]):
-            annotation = idl_node.annotations[source]
-            for name, value in annotation.items():
-              if (name in top_level_annotation
-                  and value == top_level_annotation[name]):
-                del annotation[name]
+                def normalize(idl_node):
+                    if (source in idl_node.annotations and
+                            idl_node.annotations[source]):
+                        annotation = idl_node.annotations[source]
+                        for name, value in annotation.items():
+                            if (name in top_level_annotation and
+                                    value == top_level_annotation[name]):
+                                del annotation[name]
 
-        map(normalize, interface.parents)
-        map(normalize, interface.constants)
-        map(normalize, interface.attributes)
-        map(normalize, interface.operations)
+                map(normalize, interface.parents)
+                map(normalize, interface.constants)
+                map(normalize, interface.attributes)
+                map(normalize, interface.operations)
 
-  def map_dictionaries(self):
-    """Changes the type of operations/constructors arguments from an IDL
+    def map_dictionaries(self):
+        """Changes the type of operations/constructors arguments from an IDL
        dictionary to a Dictionary.  The IDL dictionary is just an enums of
        strings which are checked at run-time."""
-    def dictionary_to_map(type_node):
-      if self._database.HasDictionary(type_node.id):
-        type_node.dictionary = type_node.id
-        type_node.id = 'Dictionary'
 
-    def all_types(node):
-      map(dictionary_to_map, node.all(IDLType))
+        def dictionary_to_map(type_node):
+            if self._database.HasDictionary(type_node.id):
+                type_node.dictionary = type_node.id
+                type_node.id = 'Dictionary'
 
-    for interface in self._database.GetInterfaces():
-      map(all_types, interface.all(IDLExtAttrFunctionValue))
-      map(all_types, interface.attributes)
-      map(all_types, interface.operations)
+        def all_types(node):
+            map(dictionary_to_map, node.all(IDLType))
 
-  def fetch_constructor_data(self, options):
-    window_interface = self._database.GetInterface('Window')
-    for attr in window_interface.attributes:
-      type = attr.type.id
-      if not type.endswith('Constructor'):
-        continue
-      type = re.sub('(Constructor)+$', '', type)
-      # TODO(antonm): Ideally we'd like to have pristine copy of WebKit IDLs and fetch
-      # this information directly from it.  Unfortunately right now database is massaged
-      # a lot so it's difficult to maintain necessary information on Window itself.
-      interface = self._database.GetInterface(type)
-      if 'V8EnabledPerContext' in attr.ext_attrs:
-        interface.ext_attrs['synthesizedV8EnabledPerContext'] = \
-            attr.ext_attrs['V8EnabledPerContext']
-      if 'V8EnabledAtRuntime' in attr.ext_attrs:
-        interface.ext_attrs['synthesizedV8EnabledAtRuntime'] = \
-            attr.ext_attrs['V8EnabledAtRuntime'] or attr.id
+        for interface in self._database.GetInterfaces():
+            map(all_types, interface.all(IDLExtAttrFunctionValue))
+            map(all_types, interface.attributes)
+            map(all_types, interface.operations)
 
-  # Iterate of the database looking for relationships between dictionaries and
-  # interfaces marked with NoInterfaceObject.  This mechanism can be used for
-  # other IDL analysis.
-  def examine_database(self):
-    # Contains list of dictionary structure: {'dictionary': dictionary, 'usages': []}
-    self._diag_dictionaries = [];
-    self._dictionaries_used_types = [];
+    def fetch_constructor_data(self, options):
+        window_interface = self._database.GetInterface('Window')
+        for attr in window_interface.attributes:
+            type = attr.type.id
+            if not type.endswith('Constructor'):
+                continue
+            type = re.sub('(Constructor)+$', '', type)
+            # TODO(antonm): Ideally we'd like to have pristine copy of WebKit IDLs and fetch
+            # this information directly from it.  Unfortunately right now database is massaged
+            # a lot so it's difficult to maintain necessary information on Window itself.
+            interface = self._database.GetInterface(type)
+            if 'V8EnabledPerContext' in attr.ext_attrs:
+                interface.ext_attrs['synthesizedV8EnabledPerContext'] = \
+                    attr.ext_attrs['V8EnabledPerContext']
+            if 'V8EnabledAtRuntime' in attr.ext_attrs:
+                interface.ext_attrs['synthesizedV8EnabledAtRuntime'] = \
+                    attr.ext_attrs['V8EnabledAtRuntime'] or attr.id
 
-    # Record any dictionary.
-    for dictionary in self._database.GetDictionaries():
-      self._diag_dictionaries.append({'dictionary': dictionary, 'usages': []});
+    # Iterate of the database looking for relationships between dictionaries and
+    # interfaces marked with NoInterfaceObject.  This mechanism can be used for
+    # other IDL analysis.
+    def examine_database(self):
+        # Contains list of dictionary structure: {'dictionary': dictionary, 'usages': []}
+        self._diag_dictionaries = []
+        self._dictionaries_used_types = []
 
-    # Contains list of NoInterfaceObject structures: {'no_interface_object': dictionary, 'usages': []}
-    self._diag_no_interfaces = [];
-    self._no_interfaces_used_types = [];
+        # Record any dictionary.
+        for dictionary in self._database.GetDictionaries():
+            self._diag_dictionaries.append({
+                'dictionary': dictionary,
+                'usages': []
+            })
 
-    # Record any interface with Blink IDL Extended Attribute 'NoInterfaceObject'.
-    for interface in self._database.GetInterfaces():
-      if interface.is_no_interface_object:
-        self._diag_no_interfaces.append({'no_interface_object': interface, 'usages': []});
+        # Contains list of NoInterfaceObject structures: {'no_interface_object': dictionary, 'usages': []}
+        self._diag_no_interfaces = []
+        self._no_interfaces_used_types = []
 
-    for interface in self._database.GetInterfaces():
-      self._constructors(interface)
-      self._constructors(interface, check_dictionaries=False)
+        # Record any interface with Blink IDL Extended Attribute 'NoInterfaceObject'.
+        for interface in self._database.GetInterfaces():
+            if interface.is_no_interface_object:
+                self._diag_no_interfaces.append({
+                    'no_interface_object':
+                    interface,
+                    'usages': []
+                })
 
-      for attribute in interface.attributes:
-        self._attribute_operation(interface, attribute)
-        self._attribute_operation(interface, attribute, check_dictionaries=False)
+        for interface in self._database.GetInterfaces():
+            self._constructors(interface)
+            self._constructors(interface, check_dictionaries=False)
 
-      for operation in interface.operations:
-        self._attribute_operation(interface, operation)
-        self._attribute_operation(interface, operation, check_dictionaries=False)
+            for attribute in interface.attributes:
+                self._attribute_operation(interface, attribute)
+                self._attribute_operation(
+                    interface, attribute, check_dictionaries=False)
 
-    # Report all dictionaries and their usage.
-    self._output_examination()
-    # Report all interface marked with NoInterfaceObject and their usage.
-    self._output_examination(check_dictionaries=False)
+            for operation in interface.operations:
+                self._attribute_operation(interface, operation)
+                self._attribute_operation(
+                    interface, operation, check_dictionaries=False)
 
-    print '\nKey:'
-    print '  (READ-ONLY) - read-only attribute has relationship'
-    print '  (GET/SET)   - attribute has relationship'
-    print '  RETURN      - operation\'s returned value has relationship'
-    print '  (ARGUMENT)  - operation\'s argument(s) has relationship'
-    print ''
-    print '  (New)       - After dictionary name if constructor(s) exist'
-    print '  (Ops,Props,New) after a NoInterfaceObject name is defined as:'
-    print '    Ops       - number of operations for a NoInterfaceObject'
-    print '    Props     - number of properties for a NoInterfaceObject'
-    print '    New       - T(#) number constructors for a NoInterfaceObject'
-    print '                F no constructors for a NoInterfaceObject'
-    print '                e.g., an interface 5 operations, 3 properties and 2'
-    print '                      constructors would display (5,3,T(2))'
+        # Report all dictionaries and their usage.
+        self._output_examination()
+        # Report all interface marked with NoInterfaceObject and their usage.
+        self._output_examination(check_dictionaries=False)
 
-    print '\n\nExamination Complete\n'
+        print '\nKey:'
+        print '  (READ-ONLY) - read-only attribute has relationship'
+        print '  (GET/SET)   - attribute has relationship'
+        print '  RETURN      - operation\'s returned value has relationship'
+        print '  (ARGUMENT)  - operation\'s argument(s) has relationship'
+        print ''
+        print '  (New)       - After dictionary name if constructor(s) exist'
+        print '  (Ops,Props,New) after a NoInterfaceObject name is defined as:'
+        print '    Ops       - number of operations for a NoInterfaceObject'
+        print '    Props     - number of properties for a NoInterfaceObject'
+        print '    New       - T(#) number constructors for a NoInterfaceObject'
+        print '                F no constructors for a NoInterfaceObject'
+        print '                e.g., an interface 5 operations, 3 properties and 2'
+        print '                      constructors would display (5,3,T(2))'
 
-  def _output_examination(self, check_dictionaries=True):
-    # Output diagnostics. First columns is Dictionary or NoInterfaceObject e.g.,
-    # |  Dictionary  |  Used In Interface  |  Usage Operation/Attribute  |
-    print '\n\n'
-    title_bar = ['Dictionary', 'Used In Interface', 'Usage Operation/Attribute'] if check_dictionaries \
-                else ['NoInterfaceObject (Ops,Props,New)', 'Used In Interface', 'Usage Operation/Attribute']
-    self._tabulate_title(title_bar)
-    diags = self._diag_dictionaries if check_dictionaries else self._diag_no_interfaces
-    for diag in diags:
-      if not(check_dictionaries):
-        interface = diag['no_interface_object']
-        ops_count = len(interface.operations)
-        properties_count = len(interface.attributes)
-        any_constructors = 'Constructor' in interface.ext_attrs
-        constructors = 'T(%s)' % len(interface.ext_attrs['Constructor']) if any_constructors else 'F'
-        interface_detail = '%s (%s,%s,%s)' % \
-            (diag['no_interface_object'].id,
-             ops_count,
-             properties_count,
-             constructors)
-        self._tabulate([interface_detail, '', ''])
-      else:
-        dictionary = diag['dictionary']
-        any_constructors = 'Constructor' in dictionary.ext_attrs
-        self._tabulate(['%s%s' % (dictionary.id, ' (New)' if any_constructors else ''), '', ''])
-      for usage in diag['usages']:
-        detail = ''
-        if 'attribute' in usage:
-          attribute_type = 'READ-ONLY' if not usage['argument'] else 'GET/SET'
-          detail = '(%s) %s' % (attribute_type, usage['attribute'])
-        elif 'operation' in usage:
-          detail = '%s %s%s' % ('RETURN' if usage['result'] else '',
-                                         usage['operation'],
-                                         '(ARGUMENT)' if usage['argument'] else '')
-        self._tabulate([None, usage['interface'], detail])
-      self._tabulate_break()
+        print '\n\nExamination Complete\n'
 
-  # operation_or_attribute either IDLOperation or IDLAttribute if None then
-  # its a constructor (IDLExtAttrFunctionValue).
-  def _mark_usage(self, interface, operation_or_attribute = None, check_dictionaries=True):
-    for diag in self._diag_dictionaries if check_dictionaries else self._diag_no_interfaces:
-      for usage in diag['usages']:
-        if not usage['interface']:
-          usage['interface'] = interface.id
-          if isinstance(operation_or_attribute, IDLOperation):
-            usage['operation'] = operation_or_attribute.id
-            if check_dictionaries:
-              usage['result'] = hasattr(operation_or_attribute.type, 'dictionary') and \
-                operation_or_attribute.type.dictionary == diag['dictionary'].id
+    def _output_examination(self, check_dictionaries=True):
+        # Output diagnostics. First columns is Dictionary or NoInterfaceObject e.g.,
+        # |  Dictionary  |  Used In Interface  |  Usage Operation/Attribute  |
+        print '\n\n'
+        title_bar = ['Dictionary', 'Used In Interface', 'Usage Operation/Attribute'] if check_dictionaries \
+                    else ['NoInterfaceObject (Ops,Props,New)', 'Used In Interface', 'Usage Operation/Attribute']
+        self._tabulate_title(title_bar)
+        diags = self._diag_dictionaries if check_dictionaries else self._diag_no_interfaces
+        for diag in diags:
+            if not (check_dictionaries):
+                interface = diag['no_interface_object']
+                ops_count = len(interface.operations)
+                properties_count = len(interface.attributes)
+                any_constructors = 'Constructor' in interface.ext_attrs
+                constructors = 'T(%s)' % len(interface.ext_attrs['Constructor']
+                                            ) if any_constructors else 'F'
+                interface_detail = '%s (%s,%s,%s)' % \
+                    (diag['no_interface_object'].id,
+                     ops_count,
+                     properties_count,
+                     constructors)
+                self._tabulate([interface_detail, '', ''])
             else:
-              usage['result'] = operation_or_attribute.type.id == diag['no_interface_object'].id
-            usage['argument'] = False
-            for argument in operation_or_attribute.arguments:
-              if check_dictionaries:
-                arg = hasattr(argument.type, 'dictionary') and argument.type.dictionary == diag['dictionary'].id
-              else:
-                arg = argument.type.id == diag['no_interface_object'].id
-              if arg:
-                usage['argument'] = arg
-          elif isinstance(operation_or_attribute, IDLAttribute):
-            usage['attribute'] = operation_or_attribute.id
-            usage['result'] = True
-            usage['argument'] = not operation_or_attribute.is_read_only
-          elif not operation_or_attribute:
-            # Its a constructor only argument is dictionary or interface with NoInterfaceObject.
-            usage['operation'] = 'constructor'
-            usage['result'] = False
-            usage['argument'] = True
+                dictionary = diag['dictionary']
+                any_constructors = 'Constructor' in dictionary.ext_attrs
+                self._tabulate([
+                    '%s%s' % (dictionary.id,
+                              ' (New)' if any_constructors else ''), '', ''
+                ])
+            for usage in diag['usages']:
+                detail = ''
+                if 'attribute' in usage:
+                    attribute_type = 'READ-ONLY' if not usage[
+                        'argument'] else 'GET/SET'
+                    detail = '(%s) %s' % (attribute_type, usage['attribute'])
+                elif 'operation' in usage:
+                    detail = '%s %s%s' % ('RETURN' if usage['result'] else '',
+                                          usage['operation'], '(ARGUMENT)'
+                                          if usage['argument'] else '')
+                self._tabulate([None, usage['interface'], detail])
+            self._tabulate_break()
 
-  def _remember_usage(self, node, check_dictionaries=True):
-    if check_dictionaries:
-      used_types = self._dictionaries_used_types
-      diag_list = self._diag_dictionaries
-      diag_name = 'dictionary'
-    else:
-      used_types = self._no_interfaces_used_types
-      diag_list = self._diag_no_interfaces
-      diag_name = 'no_interface_object'
+    # operation_or_attribute either IDLOperation or IDLAttribute if None then
+    # its a constructor (IDLExtAttrFunctionValue).
+    def _mark_usage(self,
+                    interface,
+                    operation_or_attribute=None,
+                    check_dictionaries=True):
+        for diag in self._diag_dictionaries if check_dictionaries else self._diag_no_interfaces:
+            for usage in diag['usages']:
+                if not usage['interface']:
+                    usage['interface'] = interface.id
+                    if isinstance(operation_or_attribute, IDLOperation):
+                        usage['operation'] = operation_or_attribute.id
+                        if check_dictionaries:
+                            usage['result'] = hasattr(operation_or_attribute.type, 'dictionary') and \
+                              operation_or_attribute.type.dictionary == diag['dictionary'].id
+                        else:
+                            usage[
+                                'result'] = operation_or_attribute.type.id == diag[
+                                    'no_interface_object'].id
+                        usage['argument'] = False
+                        for argument in operation_or_attribute.arguments:
+                            if check_dictionaries:
+                                arg = hasattr(
+                                    argument.type, 'dictionary'
+                                ) and argument.type.dictionary == diag[
+                                    'dictionary'].id
+                            else:
+                                arg = argument.type.id == diag[
+                                    'no_interface_object'].id
+                            if arg:
+                                usage['argument'] = arg
+                    elif isinstance(operation_or_attribute, IDLAttribute):
+                        usage['attribute'] = operation_or_attribute.id
+                        usage['result'] = True
+                        usage[
+                            'argument'] = not operation_or_attribute.is_read_only
+                    elif not operation_or_attribute:
+                        # Its a constructor only argument is dictionary or interface with NoInterfaceObject.
+                        usage['operation'] = 'constructor'
+                        usage['result'] = False
+                        usage['argument'] = True
 
-    if len(used_types) > 0:
-      normalized_used = list(set(used_types))
-      for recorded_id in normalized_used:
-        for diag in diag_list:
-          if diag[diag_name].id == recorded_id:
-            diag['usages'].append({'interface': None, 'node': node})
+    def _remember_usage(self, node, check_dictionaries=True):
+        if check_dictionaries:
+            used_types = self._dictionaries_used_types
+            diag_list = self._diag_dictionaries
+            diag_name = 'dictionary'
+        else:
+            used_types = self._no_interfaces_used_types
+            diag_list = self._diag_no_interfaces
+            diag_name = 'no_interface_object'
 
-  # Iterator function to look for any IDLType that is a dictionary then remember
-  # that dictionary.
-  def _dictionary_used(self, type_node):
-    if hasattr(type_node, 'dictionary'):
-      dictionary_id = type_node.dictionary
-      if self._database.HasDictionary(dictionary_id):
-        for diag_dictionary in self._diag_dictionaries:
-          if diag_dictionary['dictionary'].id == dictionary_id:
-            # Record the dictionary that was referenced.
-            self._dictionaries_used_types.append(dictionary_id)
-            return
+        if len(used_types) > 0:
+            normalized_used = list(set(used_types))
+            for recorded_id in normalized_used:
+                for diag in diag_list:
+                    if diag[diag_name].id == recorded_id:
+                        diag['usages'].append({'interface': None, 'node': node})
 
-      # If we get to this point, the IDL dictionary was never defined ... oops.
-      print 'DIAGNOSE_ERROR: IDL Dictionary %s doesn\'t exist.' % dictionary_id
+    # Iterator function to look for any IDLType that is a dictionary then remember
+    # that dictionary.
+    def _dictionary_used(self, type_node):
+        if hasattr(type_node, 'dictionary'):
+            dictionary_id = type_node.dictionary
+            if self._database.HasDictionary(dictionary_id):
+                for diag_dictionary in self._diag_dictionaries:
+                    if diag_dictionary['dictionary'].id == dictionary_id:
+                        # Record the dictionary that was referenced.
+                        self._dictionaries_used_types.append(dictionary_id)
+                        return
 
-  # Iterator function to look for any IDLType that is an interface marked with
-  # NoInterfaceObject then remember that interface.
-  def _no_interface_used(self, type_node):
-    if hasattr(type_node, 'id'):
-      no_interface_id = type_node.id
-      if self._database.HasInterface(no_interface_id):
-        no_interface = self._database.GetInterface(no_interface_id)
-        if no_interface.is_no_interface_object:
-          for diag_no_interface in self._diag_no_interfaces:
-            if diag_no_interface['no_interface_object'].id == no_interface_id:
-              # Record the interface marked with NoInterfaceObject.
-              self._no_interfaces_used_types.append(no_interface_id)
-              return
+            # If we get to this point, the IDL dictionary was never defined ... oops.
+            print 'DIAGNOSE_ERROR: IDL Dictionary %s doesn\'t exist.' % dictionary_id
 
-  def _constructors(self, interface, check_dictionaries=True):
-    if check_dictionaries:
-      self._dictionaries_used_types = []
-      constructor_function = self._dictionary_constructor_types
-    else:
-      self._no_interfaces_used_types = [];
-      constructor_function = self._no_interface_constructor_types
+    # Iterator function to look for any IDLType that is an interface marked with
+    # NoInterfaceObject then remember that interface.
+    def _no_interface_used(self, type_node):
+        if hasattr(type_node, 'id'):
+            no_interface_id = type_node.id
+            if self._database.HasInterface(no_interface_id):
+                no_interface = self._database.GetInterface(no_interface_id)
+                if no_interface.is_no_interface_object:
+                    for diag_no_interface in self._diag_no_interfaces:
+                        if diag_no_interface[
+                                'no_interface_object'].id == no_interface_id:
+                            # Record the interface marked with NoInterfaceObject.
+                            self._no_interfaces_used_types.append(
+                                no_interface_id)
+                            return
 
-    map(constructor_function, interface.all(IDLExtAttrFunctionValue))
+    def _constructors(self, interface, check_dictionaries=True):
+        if check_dictionaries:
+            self._dictionaries_used_types = []
+            constructor_function = self._dictionary_constructor_types
+        else:
+            self._no_interfaces_used_types = []
+            constructor_function = self._no_interface_constructor_types
 
-    self._mark_usage(interface, check_dictionaries=check_dictionaries)
+        map(constructor_function, interface.all(IDLExtAttrFunctionValue))
 
-  # Scan an attribute or operation for a dictionary or interface with NoInterfaceObject
-  # reference.  
-  def _attribute_operation(self, interface, operation_attribute, check_dictionaries=True):
-    if check_dictionaries:
-      self._dictionaries_used_types = []
-      used = self._dictionary_used
-    else:
-      self._no_interfaces_used_types = [];
-      used = self._no_interface_used
+        self._mark_usage(interface, check_dictionaries=check_dictionaries)
 
-    map(used, operation_attribute.all(IDLType))
+    # Scan an attribute or operation for a dictionary or interface with NoInterfaceObject
+    # reference.
+    def _attribute_operation(self,
+                             interface,
+                             operation_attribute,
+                             check_dictionaries=True):
+        if check_dictionaries:
+            self._dictionaries_used_types = []
+            used = self._dictionary_used
+        else:
+            self._no_interfaces_used_types = []
+            used = self._no_interface_used
 
-    self._remember_usage(operation_attribute, check_dictionaries=check_dictionaries)
-    self._mark_usage(interface, operation_attribute, check_dictionaries=check_dictionaries)
+        map(used, operation_attribute.all(IDLType))
 
-  # Iterator function for map to iterate over all constructor types
-  # (IDLExtAttrFunctionValue) that have a dictionary reference.
-  def _dictionary_constructor_types(self, node):
-    self._dictionaries_used_types = []
-    map(self._dictionary_used, node.all(IDLType))
-    self._remember_usage(node)
+        self._remember_usage(
+            operation_attribute, check_dictionaries=check_dictionaries)
+        self._mark_usage(
+            interface,
+            operation_attribute,
+            check_dictionaries=check_dictionaries)
 
-  # Iterator function for map to iterate over all constructor types
-  # (IDLExtAttrFunctionValue) that reference an interface with NoInterfaceObject.
-  def _no_interface_constructor_types(self, node):
-    self._no_interfaces_used_types = [];
-    map(self._no_interface_used, node.all(IDLType))
-    self._remember_usage(node, check_dictionaries=False)
+    # Iterator function for map to iterate over all constructor types
+    # (IDLExtAttrFunctionValue) that have a dictionary reference.
+    def _dictionary_constructor_types(self, node):
+        self._dictionaries_used_types = []
+        map(self._dictionary_used, node.all(IDLType))
+        self._remember_usage(node)
 
-  # Maximum width of each column.
-  def _TABULATE_WIDTH(self):
-    return 45
+    # Iterator function for map to iterate over all constructor types
+    # (IDLExtAttrFunctionValue) that reference an interface with NoInterfaceObject.
+    def _no_interface_constructor_types(self, node):
+        self._no_interfaces_used_types = []
+        map(self._no_interface_used, node.all(IDLType))
+        self._remember_usage(node, check_dictionaries=False)
 
-  def _tabulate_title(self, row_title):
-    title_separator = "=" * self._TABULATE_WIDTH()
-    self._tabulate([title_separator, title_separator, title_separator])
-    self._tabulate(row_title)
-    self._tabulate([title_separator, title_separator, title_separator])
+    # Maximum width of each column.
+    def _TABULATE_WIDTH(self):
+        return 45
 
-  def _tabulate_break(self):
-    break_separator = "-" * self._TABULATE_WIDTH()
-    self._tabulate([break_separator, break_separator, break_separator])
+    def _tabulate_title(self, row_title):
+        title_separator = "=" * self._TABULATE_WIDTH()
+        self._tabulate([title_separator, title_separator, title_separator])
+        self._tabulate(row_title)
+        self._tabulate([title_separator, title_separator, title_separator])
 
-  def _tabulate(self, columns):
-    """Tabulate a list of columns for a row.  Each item in columns is a column
+    def _tabulate_break(self):
+        break_separator = "-" * self._TABULATE_WIDTH()
+        self._tabulate([break_separator, break_separator, break_separator])
+
+    def _tabulate(self, columns):
+        """Tabulate a list of columns for a row.  Each item in columns is a column
        value each column will be padded up to _TABULATE_WIDTH.  Each
        column starts/ends with a vertical bar '|' the format a row:
 
            | columns[0] | columns[1] | columns[2] | ... |
     """
-    if len(columns) > 0:
-      for column in columns:
-        value = '' if not column else column
-        sys.stdout.write('|{0:^{1}}'.format(value, self._TABULATE_WIDTH()))
-    else:
-      sys.stdout.write('|{0:^{1}}'.format('', self._TABULATE_WIDTH()))
+        if len(columns) > 0:
+            for column in columns:
+                value = '' if not column else column
+                sys.stdout.write('|{0:^{1}}'.format(value,
+                                                    self._TABULATE_WIDTH()))
+        else:
+            sys.stdout.write('|{0:^{1}}'.format('', self._TABULATE_WIDTH()))
 
-    sys.stdout.write('|\n')
+        sys.stdout.write('|\n')
diff --git a/tools/dom/scripts/databasebuilder_test.py b/tools/dom/scripts/databasebuilder_test.py
index 6a3d273..c1132a1 100755
--- a/tools/dom/scripts/databasebuilder_test.py
+++ b/tools/dom/scripts/databasebuilder_test.py
@@ -16,75 +16,80 @@
 
 class DatabaseBuilderTestCase(unittest.TestCase):
 
-  def _create_input(self, idl_file_name, content):
-    file_name = os.path.join(self._input_dir, idl_file_name)
-    f = open(file_name, 'w')
-    f.write(content)
-    f.close()
-    return file_name
+    def _create_input(self, idl_file_name, content):
+        file_name = os.path.join(self._input_dir, idl_file_name)
+        f = open(file_name, 'w')
+        f.write(content)
+        f.close()
+        return file_name
 
-  def _assert_interface_exists(self, path):
-    file_path = os.path.join(self._database_dir, path)
-    self.assertTrue(os.path.exists(file_path))
+    def _assert_interface_exists(self, path):
+        file_path = os.path.join(self._database_dir, path)
+        self.assertTrue(os.path.exists(file_path))
 
-  def _assert_content_equals(self, path, expected_content):
-    def clean(content):
-      return ' '.join(filter(len, map(str.strip, content.split('\n'))))
-    file_path = os.path.join(self._database_dir, path)
-    self.assertTrue(os.path.exists(file_path))
-    f = open(file_path, 'r')
-    actual_content = f.read()
-    f.close()
-    if clean(actual_content) != clean(expected_content):
-      msg = '''
+    def _assert_content_equals(self, path, expected_content):
+
+        def clean(content):
+            return ' '.join(filter(len, map(str.strip, content.split('\n'))))
+
+        file_path = os.path.join(self._database_dir, path)
+        self.assertTrue(os.path.exists(file_path))
+        f = open(file_path, 'r')
+        actual_content = f.read()
+        f.close()
+        if clean(actual_content) != clean(expected_content):
+            msg = '''
 FILE: %s
 EXPECTED:
 %s
 ACTUAL:
 %s
 ''' % (file_path, expected_content, actual_content)
-      self.fail(msg)
+            self.fail(msg)
 
-  def setUp(self):
-    working_dir = tempfile.mkdtemp()
-    self._database_dir = os.path.join(working_dir, 'database')
-    self.assertFalse(os.path.exists(self._database_dir))
+    def setUp(self):
+        working_dir = tempfile.mkdtemp()
+        self._database_dir = os.path.join(working_dir, 'database')
+        self.assertFalse(os.path.exists(self._database_dir))
 
-    self._input_dir = os.path.join(working_dir, 'inputdir')
-    os.makedirs(self._input_dir)
+        self._input_dir = os.path.join(working_dir, 'inputdir')
+        os.makedirs(self._input_dir)
 
-    self._db = database.Database(self._database_dir)
-    self.assertTrue(os.path.exists(self._database_dir))
+        self._db = database.Database(self._database_dir)
+        self.assertTrue(os.path.exists(self._database_dir))
 
-    self._builder = DatabaseBuilder(self._db)
+        self._builder = DatabaseBuilder(self._db)
 
-  def tearDown(self):
-    shutil.rmtree(self._database_dir)
+    def tearDown(self):
+        shutil.rmtree(self._database_dir)
 
-  def test_basic_import(self):
-    file_name = self._create_input('input.idl', '''
+    def test_basic_import(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         interface I {
           attribute int a;
         };
       };''')
-    self._builder.import_idl_file(file_name)
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_interface_exists('I.idl')
+        self._builder.import_idl_file(file_name)
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_interface_exists('I.idl')
 
-  def test_splitting(self):
-    file_name = self._create_input('input.idl', '''
+    def test_splitting(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         interface I {
           readonly attribute int a;
           int o(in int x, in optional int y);
         };
       };''')
-    self._builder.import_idl_file(file_name)
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(file_name)
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       interface I {
         /* Attributes */
         getter attribute int a;
@@ -94,19 +99,21 @@
         int o(in int x, in int y);
       };''')
 
-  def test_renames(self):
-    file_name = self._create_input('input.idl', '''
+    def test_renames(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         [Constructor(in T x)] interface I {
           T op(T x);
           readonly attribute N::T attr;
         };
       };''')
-    options = DatabaseBuilderOptions(type_rename_map={'I': 'i', 'T': 't'})
-    self._builder.import_idl_file(file_name, options)
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('i.idl', '''
+        options = DatabaseBuilderOptions(type_rename_map={'I': 'i', 'T': 't'})
+        self._builder.import_idl_file(file_name, options)
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'i.idl', '''
       [Constructor(in t x)] interface i {
         /* Attributes */
         getter attribute t attr;
@@ -114,8 +121,9 @@
         t op(in t x);
       };''')
 
-  def test_type_defs(self):
-    file_name = self._create_input('input.idl', '''
+    def test_type_defs(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         typedef T S;
         interface I : S {
@@ -123,11 +131,12 @@
           readonly attribute S attr;
         };
       };''')
-    options = DatabaseBuilderOptions()
-    self._builder.import_idl_file(file_name, options)
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        options = DatabaseBuilderOptions()
+        self._builder.import_idl_file(file_name, options)
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       interface I :
         T {
         /* Attributes */
@@ -136,8 +145,9 @@
         T op(in T x);
       };''')
 
-  def test_merge(self):
-    file_name1 = self._create_input('input1.idl', '''
+    def test_merge(self):
+        file_name1 = self._create_input(
+            'input1.idl', '''
       module M {
         interface I {
           const int CONST_BOTH = 0;
@@ -156,10 +166,12 @@
           int op_both_arg_rename(int arg);
         };
       };''')
-    self._builder.import_idl_file(file_name1,
-      DatabaseBuilderOptions(source='1st',
-        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
-    file_name2 = self._create_input('input2.idl', '''
+        self._builder.import_idl_file(
+            file_name1,
+            DatabaseBuilderOptions(
+                source='1st', idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+        file_name2 = self._create_input(
+            'input2.idl', '''
       module M {
         interface I {
           const int CONST_BOTH = 0;
@@ -178,13 +190,15 @@
           int op_both_arg_rename(int betterName);
         };
       };''')
-    self._builder.import_idl_file(file_name2,
-      DatabaseBuilderOptions(source='2nd',
-        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
-    self._builder.set_same_signatures({'int': 'long'})
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(
+            file_name2,
+            DatabaseBuilderOptions(
+                source='2nd', idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+        self._builder.set_same_signatures({'int': 'long'})
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       @1st(module=M) @2nd(module=M) interface I {
         /* Constants */
         @1st @2nd const int CONST_BOTH = 0;
@@ -211,35 +225,41 @@
         @2nd int op_only_second();
       };''')
 
-  def test_mergeDartName(self):
-    file_name1 = self._create_input('input1.idl', '''
+    def test_mergeDartName(self):
+        file_name1 = self._create_input(
+            'input1.idl', '''
       module M {
         interface I {
           [ImplementationFunction=foo] int member(in int a);
         };
       };''')
-    self._builder.import_idl_file(file_name1,
-      DatabaseBuilderOptions(source='1st',
-        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
-    file_name2 = self._create_input('input2.idl', '''
+        self._builder.import_idl_file(
+            file_name1,
+            DatabaseBuilderOptions(
+                source='1st', idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+        file_name2 = self._create_input(
+            'input2.idl', '''
       module M {
         interface I {
           [DartName=bar] int member(in int a);
         };
       };''')
-    self._builder.import_idl_file(file_name2,
-      DatabaseBuilderOptions(source='2nd',
-        idl_syntax=idlparser.FREMONTCUT_SYNTAX))
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(
+            file_name2,
+            DatabaseBuilderOptions(
+                source='2nd', idl_syntax=idlparser.FREMONTCUT_SYNTAX))
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       @1st(module=M) @2nd(module=M) interface I {
         /* Operations */
         @1st @2nd [DartName=bar, ImplementationFunction=foo] int member(in int a);
       };''')
 
-  def test_supplemental(self):
-    file_name = self._create_input('input1.idl', '''
+    def test_supplemental(self):
+        file_name = self._create_input(
+            'input1.idl', '''
       module M {
         interface I {
           readonly attribute int a;
@@ -248,63 +268,71 @@
           readonly attribute int b;
         };
       };''')
-    self._builder.import_idl_file(file_name,
-      DatabaseBuilderOptions(source='Src'))
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(file_name,
+                                      DatabaseBuilderOptions(source='Src'))
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       @Src(module=M) [Supplemental] interface I {
         /* Attributes */
         @Src getter attribute int a;
         @Src getter attribute int b;
       };''')
 
-  def test_impl_stmt(self):
-    file_name = self._create_input('input.idl', '''
+    def test_impl_stmt(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         interface I {};
         I implements J;
       };''')
-    self._builder.import_idl_file(file_name,
-      DatabaseBuilderOptions(source='Src'))
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(file_name,
+                                      DatabaseBuilderOptions(source='Src'))
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       @Src(module=M) interface I :
         @Src J {
       };''')
 
-  def test_obsolete(self):
-    file_name1 = self._create_input('input1.idl', '''
+    def test_obsolete(self):
+        file_name1 = self._create_input(
+            'input1.idl', '''
       module M {
         interface I {
           readonly attribute int keep;
           readonly attribute int obsolete; // Would be removed
         };
       };''')
-    self._builder.import_idl_file(file_name1,
-      DatabaseBuilderOptions(source='src'))
-    file_name2 = self._create_input('input2.idl', '''
+        self._builder.import_idl_file(file_name1,
+                                      DatabaseBuilderOptions(source='src'))
+        file_name2 = self._create_input(
+            'input2.idl', '''
       module M {
         interface I {
           readonly attribute int keep;
           readonly attribute int new;
         };
       };''')
-    self._builder.import_idl_file(file_name2,
-      DatabaseBuilderOptions(source='src',
-                   obsolete_old_declarations=True))
-    self._builder.merge_imported_interfaces([])
-    self._db.Save()
-    self._assert_content_equals('I.idl', '''
+        self._builder.import_idl_file(
+            file_name2,
+            DatabaseBuilderOptions(
+                source='src', obsolete_old_declarations=True))
+        self._builder.merge_imported_interfaces([])
+        self._db.Save()
+        self._assert_content_equals(
+            'I.idl', '''
       @src(module=M) interface I {
         /* Attributes */
         @src getter attribute int keep;
         @src getter attribute int new;
       };''')
 
-  def test_annotation_normalization(self):
-    file_name = self._create_input('input.idl', '''
+    def test_annotation_normalization(self):
+        file_name = self._create_input(
+            'input.idl', '''
       module M {
         interface I : J{
           const int C = 0;
@@ -312,17 +340,19 @@
           int op();
         };
       };''')
-    self._builder.import_idl_file(file_name,
-      DatabaseBuilderOptions(source='Src', source_attributes={'x': 'y'}))
-    self._builder.merge_imported_interfaces([])
-    interface = self._db.GetInterface('I')
-    interface.parents[0].annotations['Src']['x'] = 'u'
-    interface.constants[0].annotations['Src']['z'] = 'w'
-    interface.attributes[0].annotations['Src']['x'] = 'u'
-    self._db.Save()
+        self._builder.import_idl_file(
+            file_name,
+            DatabaseBuilderOptions(source='Src', source_attributes={'x': 'y'}))
+        self._builder.merge_imported_interfaces([])
+        interface = self._db.GetInterface('I')
+        interface.parents[0].annotations['Src']['x'] = 'u'
+        interface.constants[0].annotations['Src']['z'] = 'w'
+        interface.attributes[0].annotations['Src']['x'] = 'u'
+        self._db.Save()
 
-    # Before normalization
-    self._assert_content_equals('I.idl', '''
+        # Before normalization
+        self._assert_content_equals(
+            'I.idl', '''
       @Src(module=M, x=y)
       interface I : @Src(x=u) J {
         /* Constants */
@@ -333,12 +363,13 @@
         @Src(x=y) int op();
       };''')
 
-    # Normalize
-    self._builder.normalize_annotations(['Src'])
-    self._db.Save()
+        # Normalize
+        self._builder.normalize_annotations(['Src'])
+        self._db.Save()
 
-    # After normalization
-    self._assert_content_equals('I.idl', '''
+        # After normalization
+        self._assert_content_equals(
+            'I.idl', '''
       @Src(module=M, x=y)
       interface I : @Src(x=u) J {
         /* Constants */
@@ -349,29 +380,32 @@
         @Src int op();
       };''')
 
-  def test_fix_displacements(self):
-    file_name1 = self._create_input('input1.idl', '''
+    def test_fix_displacements(self):
+        file_name1 = self._create_input(
+            'input1.idl', '''
       module M {
         interface I {};
         interface J : I {
           readonly attribute int attr;
         };
       };''')
-    self._builder.import_idl_file(file_name1,
-      DatabaseBuilderOptions(source='1st'))
-    file_name2 = self._create_input('input2.idl', '''
+        self._builder.import_idl_file(file_name1,
+                                      DatabaseBuilderOptions(source='1st'))
+        file_name2 = self._create_input(
+            'input2.idl', '''
       module M {
         interface I {
           readonly attribute int attr;
         };
         interface J : I {};
       };''')
-    self._builder.import_idl_file(file_name2,
-      DatabaseBuilderOptions(source='2nd'))
-    self._builder.merge_imported_interfaces([])
-    self._builder.fix_displacements('2nd')
-    self._db.Save()
-    self._assert_content_equals('J.idl', '''
+        self._builder.import_idl_file(file_name2,
+                                      DatabaseBuilderOptions(source='2nd'))
+        self._builder.merge_imported_interfaces([])
+        self._builder.fix_displacements('2nd')
+        self._db.Save()
+        self._assert_content_equals(
+            'J.idl', '''
       @1st(module=M) @2nd(module=M) interface J :
         @1st @2nd I {
         /* Attributes */
@@ -382,6 +416,6 @@
 
 
 if __name__ == "__main__":
-  logging.config.fileConfig("logging.conf")
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig("logging.conf")
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/emitter.py b/tools/dom/scripts/emitter.py
index 792458f..d6d1734 100755
--- a/tools/dom/scripts/emitter.py
+++ b/tools/dom/scripts/emitter.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-
 """Templating to help generate structured text."""
 
 import logging
@@ -12,26 +11,26 @@
 
 
 def Format(template, **parameters):
-  """Create a string using the same template syntax as Emitter.Emit."""
-  e = Emitter()
-  e._Emit(template, parameters)
-  return ''.join(e.Fragments())
+    """Create a string using the same template syntax as Emitter.Emit."""
+    e = Emitter()
+    e._Emit(template, parameters)
+    return ''.join(e.Fragments())
 
 
 class Emitter(object):
-  """An Emitter collects string fragments to be assembled into a single string.
+    """An Emitter collects string fragments to be assembled into a single string.
   """
 
-  def __init__(self, bindings=None):
-    self._items = []     # A new list
-    self._bindings = bindings or Emitter.Frame({}, None)
+    def __init__(self, bindings=None):
+        self._items = []  # A new list
+        self._bindings = bindings or Emitter.Frame({}, None)
 
-  def EmitRaw(self, item):
-    """Emits literal string with no substitition."""
-    self._items.append(item)
+    def EmitRaw(self, item):
+        """Emits literal string with no substitition."""
+        self._items.append(item)
 
-  def Emit(self, template_source, **parameters):
-    """Emits a template, substituting named parameters and returning emitters to
+    def Emit(self, template_source, **parameters):
+        """Emits a template, substituting named parameters and returning emitters to
     fill the named holes.
 
     Ordinary substitution occurs at $NAME or $(NAME).  If there is no parameter
@@ -56,162 +55,166 @@
     The emitters for the holes remember the parameters passed to the initial
     call to Emit.  Holes can be used to provide a binding context.
     """
-    return self._Emit(template_source, parameters)
+        return self._Emit(template_source, parameters)
 
-  def _Emit(self, template_source, parameters):
-    """Implementation of Emit, with map in place of named parameters."""
-    template = self._ParseTemplate(template_source)
+    def _Emit(self, template_source, parameters):
+        """Implementation of Emit, with map in place of named parameters."""
+        template = self._ParseTemplate(template_source)
 
-    parameter_bindings = self._bindings.Extend(parameters)
+        parameter_bindings = self._bindings.Extend(parameters)
 
-    hole_names = template._holes
+        hole_names = template._holes
 
-    if hole_names:
-      hole_map = {}
-      replacements = {}
-      for name in hole_names:
-        emitter = Emitter(parameter_bindings)
-        replacements[name] = emitter._items
-        hole_map[name] = emitter
-      full_bindings = parameter_bindings.Extend(replacements)
-    else:
-      full_bindings = parameter_bindings
+        if hole_names:
+            hole_map = {}
+            replacements = {}
+            for name in hole_names:
+                emitter = Emitter(parameter_bindings)
+                replacements[name] = emitter._items
+                hole_map[name] = emitter
+            full_bindings = parameter_bindings.Extend(replacements)
+        else:
+            full_bindings = parameter_bindings
 
-    self._ApplyTemplate(template, full_bindings)
+        self._ApplyTemplate(template, full_bindings)
 
-    # Return None, a singleton or tuple of the hole names.
-    if not hole_names:
-      return None
-    if len(hole_names) == 1:
-      return hole_map[hole_names[0]]
-    else:
-      return tuple(hole_map[name] for name in hole_names)
+        # Return None, a singleton or tuple of the hole names.
+        if not hole_names:
+            return None
+        if len(hole_names) == 1:
+            return hole_map[hole_names[0]]
+        else:
+            return tuple(hole_map[name] for name in hole_names)
 
-  def Fragments(self):
-    """Returns a list of all the string fragments emitted."""
-    def _FlattenTo(item, output):
-      if isinstance(item, list):
-        for subitem in item:
-          _FlattenTo(subitem, output)
-      elif isinstance(item, Emitter.DeferredLookup):
-        value = item._environment.Lookup(item._lookup._name,
-                                         item._lookup._value_if_missing)
-        _FlattenTo(value, output)
-      else:
-        output.append(str(item))
+    def Fragments(self):
+        """Returns a list of all the string fragments emitted."""
 
-    output = []
-    _FlattenTo(self._items, output)
-    return output
+        def _FlattenTo(item, output):
+            if isinstance(item, list):
+                for subitem in item:
+                    _FlattenTo(subitem, output)
+            elif isinstance(item, Emitter.DeferredLookup):
+                value = item._environment.Lookup(item._lookup._name,
+                                                 item._lookup._value_if_missing)
+                _FlattenTo(value, output)
+            else:
+                output.append(str(item))
 
-  def Bind(self, var, template_source, **parameters):
-    """Adds a binding for var to this emitter."""
-    template = self._ParseTemplate(template_source)
-    if template._holes:
-      raise RuntimeError('Cannot have holes in Emitter.Bind')
-    bindings = self._bindings.Extend(parameters)
-    value = Emitter(bindings)
-    value._ApplyTemplate(template, bindings)
-    self._bindings = self._bindings.Extend({var: value._items})
-    return value
+        output = []
+        _FlattenTo(self._items, output)
+        return output
 
-  def _ParseTemplate(self, source):
-    """Converts the template string into a Template object."""
-    # TODO(sra): Cache the parsing.
-    items = []
-    holes = []
+    def Bind(self, var, template_source, **parameters):
+        """Adds a binding for var to this emitter."""
+        template = self._ParseTemplate(template_source)
+        if template._holes:
+            raise RuntimeError('Cannot have holes in Emitter.Bind')
+        bindings = self._bindings.Extend(parameters)
+        value = Emitter(bindings)
+        value._ApplyTemplate(template, bindings)
+        self._bindings = self._bindings.Extend({var: value._items})
+        return value
 
-    # Break source into a sequence of text fragments and substitution lookups.
-    pos = 0
-    while True:
-      match = Emitter._SUBST_RE.search(source, pos)
-      if not match:
-        items.append(source[pos:])
-        break
-      text_fragment = source[pos : match.start()]
-      if text_fragment:
-        items.append(text_fragment)
-      pos = match.end()
-      term = match.group()
-      name = match.group(1) or match.group(2)    # $NAME and $(NAME)
-      if name:
-        item = Emitter.Lookup(name, term, term)
-        items.append(item)
-        continue
-      name = match.group(3) or match.group(4)    # $!NAME and $(!NAME)
-      if name:
-        item = Emitter.Lookup(name, term, term)
-        items.append(item)
-        holes.append(name)
-        continue
-      name = match.group(5) or match.group(6)    # $?NAME and $(?NAME)
-      if name:
-        item = Emitter.Lookup(name, term, '')
-        items.append(item)
-        holes.append(name)
-        continue
-      raise RuntimeError('Unexpected group')
+    def _ParseTemplate(self, source):
+        """Converts the template string into a Template object."""
+        # TODO(sra): Cache the parsing.
+        items = []
+        holes = []
 
-    if len(holes) != len(set(holes)):
-      raise RuntimeError('Cannot have repeated holes %s' % holes)
-    return Emitter.Template(items, holes)
+        # Break source into a sequence of text fragments and substitution lookups.
+        pos = 0
+        while True:
+            match = Emitter._SUBST_RE.search(source, pos)
+            if not match:
+                items.append(source[pos:])
+                break
+            text_fragment = source[pos:match.start()]
+            if text_fragment:
+                items.append(text_fragment)
+            pos = match.end()
+            term = match.group()
+            name = match.group(1) or match.group(2)  # $NAME and $(NAME)
+            if name:
+                item = Emitter.Lookup(name, term, term)
+                items.append(item)
+                continue
+            name = match.group(3) or match.group(4)  # $!NAME and $(!NAME)
+            if name:
+                item = Emitter.Lookup(name, term, term)
+                items.append(item)
+                holes.append(name)
+                continue
+            name = match.group(5) or match.group(6)  # $?NAME and $(?NAME)
+            if name:
+                item = Emitter.Lookup(name, term, '')
+                items.append(item)
+                holes.append(name)
+                continue
+            raise RuntimeError('Unexpected group')
 
-  _SUBST_RE = re.compile(
-      #  $FOO    $(FOO)      $!FOO    $(!FOO)      $?FOO     $(?FOO)
-      r'\$(\w+)|\$\((\w+)\)|\$!(\w+)|\$\(!(\w+)\)|\$\?(\w+)|\$\(\?(\w+)\)')
+        if len(holes) != len(set(holes)):
+            raise RuntimeError('Cannot have repeated holes %s' % holes)
+        return Emitter.Template(items, holes)
 
-  def _ApplyTemplate(self, template, bindings):
-    """Emits the items from the parsed template."""
-    result = []
-    for item in template._items:
-      if isinstance(item, str):
-        if item:
-          result.append(item)
-      elif isinstance(item, Emitter.Lookup):
-        # Bind lookup to the current environment (bindings)
-        # TODO(sra): More space efficient to do direct lookup.
-        result.append(Emitter.DeferredLookup(item, bindings))
-      else:
-        raise RuntimeError('Unexpected template element')
-    # Collected fragments are in a sublist, so self._items contains one element
-    # (sublist) per template application.
-    self._items.append(result)
+    _SUBST_RE = re.compile(
+        #  $FOO    $(FOO)      $!FOO    $(!FOO)      $?FOO     $(?FOO)
+        r'\$(\w+)|\$\((\w+)\)|\$!(\w+)|\$\(!(\w+)\)|\$\?(\w+)|\$\(\?(\w+)\)')
 
-  class Lookup(object):
-    """An element of a parsed template."""
-    def __init__(self, name, original, default):
-      self._name = name
-      self._original = original
-      self._value_if_missing = default
+    def _ApplyTemplate(self, template, bindings):
+        """Emits the items from the parsed template."""
+        result = []
+        for item in template._items:
+            if isinstance(item, str):
+                if item:
+                    result.append(item)
+            elif isinstance(item, Emitter.Lookup):
+                # Bind lookup to the current environment (bindings)
+                # TODO(sra): More space efficient to do direct lookup.
+                result.append(Emitter.DeferredLookup(item, bindings))
+            else:
+                raise RuntimeError('Unexpected template element')
+        # Collected fragments are in a sublist, so self._items contains one element
+        # (sublist) per template application.
+        self._items.append(result)
 
-  class DeferredLookup(object):
-    """A lookup operation that is deferred until final string generation."""
-    # TODO(sra): A deferred lookup will be useful when we add expansions that
-    # have behaviour condtional on the contents, e.g. adding separators between
-    # a list of items.
-    def __init__(self, lookup, environment):
-      self._lookup = lookup
-      self._environment = environment
+    class Lookup(object):
+        """An element of a parsed template."""
 
-  class Template(object):
-    """A parsed template."""
-    def __init__(self, items, holes):
-      self._items = items  # strings and lookups
-      self._holes = holes
+        def __init__(self, name, original, default):
+            self._name = name
+            self._original = original
+            self._value_if_missing = default
 
+    class DeferredLookup(object):
+        """A lookup operation that is deferred until final string generation."""
 
-  class Frame(object):
-    """A Frame is a set of bindings derived from a parent."""
-    def __init__(self, map, parent):
-      self._map = map
-      self._parent = parent
+        # TODO(sra): A deferred lookup will be useful when we add expansions that
+        # have behaviour condtional on the contents, e.g. adding separators between
+        # a list of items.
+        def __init__(self, lookup, environment):
+            self._lookup = lookup
+            self._environment = environment
 
-    def Lookup(self, name, default):
-      if name in self._map:
-        return self._map[name]
-      if self._parent:
-        return self._parent.Lookup(name, default)
-      return default
+    class Template(object):
+        """A parsed template."""
 
-    def Extend(self, map):
-      return Emitter.Frame(map, self)
+        def __init__(self, items, holes):
+            self._items = items  # strings and lookups
+            self._holes = holes
+
+    class Frame(object):
+        """A Frame is a set of bindings derived from a parent."""
+
+        def __init__(self, map, parent):
+            self._map = map
+            self._parent = parent
+
+        def Lookup(self, name, default):
+            if name in self._map:
+                return self._map[name]
+            if self._parent:
+                return self._parent.Lookup(name, default)
+            return default
+
+        def Extend(self, map):
+            return Emitter.Frame(map, self)
diff --git a/tools/dom/scripts/emitter_test.py b/tools/dom/scripts/emitter_test.py
index 8247e3f..db0e219 100755
--- a/tools/dom/scripts/emitter_test.py
+++ b/tools/dom/scripts/emitter_test.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 for emitter module."""
 
 import logging.config
@@ -12,89 +11,88 @@
 
 class EmitterTestCase(unittest.TestCase):
 
-  def setUp(self):
-    pass
+    def setUp(self):
+        pass
 
-  def tearDown(self):
-    pass
+    def tearDown(self):
+        pass
 
-  def check(self, e, expected):
-    self.assertEquals(''.join(e.Fragments()), expected)
+    def check(self, e, expected):
+        self.assertEquals(''.join(e.Fragments()), expected)
 
-  def testExample(self):
-    e = emitter.Emitter()
-    body = e.Emit('$TYPE $NAME() {\n'
-                  '  $!BODY\n'
-                  '}\n',
-                  TYPE='int', NAME='foo')
-    body.Emit('return $VALUE;', VALUE='100')
-    self.check(e,
-               'int foo() {\n'
-               '  return 100;\n'
-               '}\n')
+    def testExample(self):
+        e = emitter.Emitter()
+        body = e.Emit('$TYPE $NAME() {\n'
+                      '  $!BODY\n'
+                      '}\n',
+                      TYPE='int',
+                      NAME='foo')
+        body.Emit('return $VALUE;', VALUE='100')
+        self.check(e, 'int foo() {\n' '  return 100;\n' '}\n')
 
-  def testTemplateErrorDuplicate(self):
-    try:
-      e = emitter.Emitter()
-      b = e.Emit('$(A)$(!B)$(A)$(!B)')   # $(!B) is duplicated
-    except RuntimeError, ex:
-      return
-    raise AssertionError('Expected error')
+    def testTemplateErrorDuplicate(self):
+        try:
+            e = emitter.Emitter()
+            b = e.Emit('$(A)$(!B)$(A)$(!B)')  # $(!B) is duplicated
+        except RuntimeError, ex:
+            return
+        raise AssertionError('Expected error')
 
-  def testTemplate1(self):
-    e = emitter.Emitter()
-    e.Emit('-$A+$B-$A+$B-', A='1', B='2')
-    self.check(e, '-1+2-1+2-')
+    def testTemplate1(self):
+        e = emitter.Emitter()
+        e.Emit('-$A+$B-$A+$B-', A='1', B='2')
+        self.check(e, '-1+2-1+2-')
 
-  def testTemplate2(self):
-    e = emitter.Emitter()
-    r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y')
-    self.assertEquals(None, r)
-    self.check(e, '1x2y3x4y5')
+    def testTemplate2(self):
+        e = emitter.Emitter()
+        r = e.Emit('1$(A)2$(B)3$(A)4$(B)5', A='x', B='y')
+        self.assertEquals(None, r)
+        self.check(e, '1x2y3x4y5')
 
-  def testTemplate3(self):
-    e = emitter.Emitter()
-    b = e.Emit('1$(A)2$(!B)3$(A)4$(B)5', A='x')
-    b.Emit('y')
-    self.check(e, '1x2y3x4y5')
-    self.check(b, 'y')
+    def testTemplate3(self):
+        e = emitter.Emitter()
+        b = e.Emit('1$(A)2$(!B)3$(A)4$(B)5', A='x')
+        b.Emit('y')
+        self.check(e, '1x2y3x4y5')
+        self.check(b, 'y')
 
-  def testTemplate4(self):
-    e = emitter.Emitter()
-    (a, b) = e.Emit('$!A$!B$A$B')   # pair of holes.
-    a.Emit('x')
-    b.Emit('y')
-    self.check(e, 'xyxy')
+    def testTemplate4(self):
+        e = emitter.Emitter()
+        (a, b) = e.Emit('$!A$!B$A$B')  # pair of holes.
+        a.Emit('x')
+        b.Emit('y')
+        self.check(e, 'xyxy')
 
-  def testMissing(self):
-    # Behaviour of Undefined parameters depends on form.
-    e = emitter.Emitter();
-    e.Emit('$A $?B $(C) $(?D)')
-    self.check(e, '$A  $(C) ')
+    def testMissing(self):
+        # Behaviour of Undefined parameters depends on form.
+        e = emitter.Emitter()
+        e.Emit('$A $?B $(C) $(?D)')
+        self.check(e, '$A  $(C) ')
 
-  def testHoleScopes(self):
-    e = emitter.Emitter()
-    # Holes have scope.  They remember the bindings of the template application
-    # in which they are created.  Create two holes which inherit bindings for C
-    # and D.
-    (a, b) = e.Emit('[$!A][$!B]$C$D$E', C='1', D='2')
-    e.Emit('  $A$B$C$D')  # Bindings are local to the Emit
-    self.check(e, '[][]12$E  $A$B$C$D')
+    def testHoleScopes(self):
+        e = emitter.Emitter()
+        # Holes have scope.  They remember the bindings of the template application
+        # in which they are created.  Create two holes which inherit bindings for C
+        # and D.
+        (a, b) = e.Emit('[$!A][$!B]$C$D$E', C='1', D='2')
+        e.Emit('  $A$B$C$D')  # Bindings are local to the Emit
+        self.check(e, '[][]12$E  $A$B$C$D')
 
-    # Holes are not bound within holes.  That would too easily lead to infinite
-    # expansions.
-    a.Emit('$A$C$D')   # $A12
-    b.Emit('$D$C$B')   # 21$B
-    self.check(e, '[$A12][21$B]12$E  $A$B$C$D')
-    # EmitRaw avoids interpolation.
-    a.EmitRaw('$C$D')
-    b.EmitRaw('$D$C')
-    self.check(e, '[$A12$C$D][21$B$D$C]12$E  $A$B$C$D')
+        # Holes are not bound within holes.  That would too easily lead to infinite
+        # expansions.
+        a.Emit('$A$C$D')  # $A12
+        b.Emit('$D$C$B')  # 21$B
+        self.check(e, '[$A12][21$B]12$E  $A$B$C$D')
+        # EmitRaw avoids interpolation.
+        a.EmitRaw('$C$D')
+        b.EmitRaw('$D$C')
+        self.check(e, '[$A12$C$D][21$B$D$C]12$E  $A$B$C$D')
 
-  def testFormat(self):
-    self.assertEquals(emitter.Format('$A$B', A=1, B=2), '12')
+    def testFormat(self):
+        self.assertEquals(emitter.Format('$A$B', A=1, B=2), '12')
+
 
 if __name__ == '__main__':
-  logging.config.fileConfig('logging.conf')
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig('logging.conf')
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/fremontcutbuilder.py b/tools/dom/scripts/fremontcutbuilder.py
index 0bb4b69..a9ce07c 100755
--- a/tools/dom/scripts/fremontcutbuilder.py
+++ b/tools/dom/scripts/fremontcutbuilder.py
@@ -22,29 +22,30 @@
 # We list all ENABLE flags used in IDL in one of these two lists.
 FEATURE_DISABLED = [
     'ENABLE_CUSTOM_SCHEME_HANDLER',
-    'ENABLE_MEDIA_CAPTURE', # Only enabled on Android.
-    'ENABLE_ORIENTATION_EVENTS', # Only enabled on Android.
+    'ENABLE_MEDIA_CAPTURE',  # Only enabled on Android.
+    'ENABLE_ORIENTATION_EVENTS',  # Only enabled on Android.
     'ENABLE_WEBVTT_REGIONS',
 ]
 
 FEATURE_DEFINES = [
-    'ENABLE_CALENDAR_PICKER', # Not on Android
+    'ENABLE_CALENDAR_PICKER',  # Not on Android
     'ENABLE_ENCRYPTED_MEDIA_V2',
-    'ENABLE_INPUT_SPEECH', # Not on Android
-    'ENABLE_LEGACY_NOTIFICATIONS', # Not on Android
-    'ENABLE_NAVIGATOR_CONTENT_UTILS', # Not on Android
-    'ENABLE_NOTIFICATIONS', # Not on Android
+    'ENABLE_INPUT_SPEECH',  # Not on Android
+    'ENABLE_LEGACY_NOTIFICATIONS',  # Not on Android
+    'ENABLE_NAVIGATOR_CONTENT_UTILS',  # Not on Android
+    'ENABLE_NOTIFICATIONS',  # Not on Android
     'ENABLE_SVG_FONTS',
-    'ENABLE_WEB_AUDIO', # Not on Android
+    'ENABLE_WEB_AUDIO',  # Not on Android
 ]
 
 
 # Resolve all typedefs encountered while parsing (see idlnode.py), resolve any typedefs not resolved
 # during parsing.  This must be done before the database is created, merged, and augmented to
-# exact type matching.  Typedefs can be encountered in any IDL and usage can cross IDL boundaries. 
+# exact type matching.  Typedefs can be encountered in any IDL and usage can cross IDL boundaries.
 def ResolveAllTypedefs(all_interfaces):
     # Resolve all typedefs.
     for interface, db_Opts in all_interfaces:
+
         def IsIdentified(idl_node):
             node_name = idl_node.id if idl_node.id else 'parent'
             for idl_type in idl_node.all(idlnode.IDLType):
@@ -62,145 +63,155 @@
         interface.operations = filter(IsIdentified, interface.operations)
         interface.parents = filter(IsIdentified, interface.parents)
 
-def build_database(idl_files, database_dir, feature_defines=None,
-                   logging_level=logging.WARNING, examine_idls=False):
-  """This code reconstructs the FremontCut IDL database from W3C,
+
+def build_database(idl_files,
+                   database_dir,
+                   feature_defines=None,
+                   logging_level=logging.WARNING,
+                   examine_idls=False):
+    """This code reconstructs the FremontCut IDL database from W3C,
   WebKit and Dart IDL files."""
-  current_dir = os.path.dirname(__file__)
-  logging.config.fileConfig(os.path.join(current_dir, "logging.conf"))
+    current_dir = os.path.dirname(__file__)
+    logging.config.fileConfig(os.path.join(current_dir, "logging.conf"))
 
-  _logger.setLevel(logging_level)
+    _logger.setLevel(logging_level)
 
-  db = database.Database(database_dir)
+    db = database.Database(database_dir)
 
-  # Delete all existing IDLs in the DB.
-  db.Delete()
+    # Delete all existing IDLs in the DB.
+    db.Delete()
 
-  builder = databasebuilder.DatabaseBuilder(db)
-  dependency.set_builder(builder)
+    builder = databasebuilder.DatabaseBuilder(db)
+    dependency.set_builder(builder)
 
-  # TODO(vsm): Move this to a README.
-  # This is the Chrome revision.
-  webkit_revision = '63'
+    # TODO(vsm): Move this to a README.
+    # This is the Chrome revision.
+    webkit_revision = '63'
 
-  # TODO(vsm): Reconcile what is exposed here and inside WebKit code
-  # generation.  We need to recheck this periodically for now.
-  webkit_defines = [ 'LANGUAGE_DART', 'LANGUAGE_JAVASCRIPT' ]
+    # TODO(vsm): Reconcile what is exposed here and inside WebKit code
+    # generation.  We need to recheck this periodically for now.
+    webkit_defines = ['LANGUAGE_DART', 'LANGUAGE_JAVASCRIPT']
 
-  if feature_defines is None:
-    feature_defines = FEATURE_DEFINES
+    if feature_defines is None:
+        feature_defines = FEATURE_DEFINES
 
-  webkit_options = databasebuilder.DatabaseBuilderOptions(
-      # TODO(vsm): What else should we define as on when processing IDL?
-      idl_defines=webkit_defines + feature_defines,
-      source='WebKit',
-      source_attributes={'revision': webkit_revision},
-      logging_level=logging_level)
+    webkit_options = databasebuilder.DatabaseBuilderOptions(
+        # TODO(vsm): What else should we define as on when processing IDL?
+        idl_defines=webkit_defines + feature_defines,
+        source='WebKit',
+        source_attributes={'revision': webkit_revision},
+        logging_level=logging_level)
 
-  # Import WebKit IDLs.
-  builder.import_idl_files(idl_files, webkit_options, False)
+    # Import WebKit IDLs.
+    builder.import_idl_files(idl_files, webkit_options, False)
 
-  # Import Dart idl:
-  dart_options = databasebuilder.DatabaseBuilderOptions(
-    source='Dart',
-    rename_operation_arguments_on_merge=True,
-    logging_level=logging_level)
+    # Import Dart idl:
+    dart_options = databasebuilder.DatabaseBuilderOptions(
+        source='Dart',
+        rename_operation_arguments_on_merge=True,
+        logging_level=logging_level)
 
-  utilities.KNOWN_COMPONENTS = frozenset(['core', 'modules', 'dart'])
+    utilities.KNOWN_COMPONENTS = frozenset(['core', 'modules', 'dart'])
 
-  builder.import_idl_files(
-      [ os.path.join(current_dir, '..', 'idl', 'dart', 'dart.idl') ],
-      dart_options, True)
+    builder.import_idl_files(
+        [os.path.join(current_dir, '..', 'idl', 'dart', 'dart.idl')],
+        dart_options, True)
 
-  start_time = time.time()
+    start_time = time.time()
 
-  # All typedefs MUST be resolved here before any database fixups (merging, implements, etc.)
-  ResolveAllTypedefs(builder._imported_interfaces)
+    # All typedefs MUST be resolved here before any database fixups (merging, implements, etc.)
+    ResolveAllTypedefs(builder._imported_interfaces)
 
-  # Merging:
-  builder.merge_imported_interfaces()
+    # Merging:
+    builder.merge_imported_interfaces()
 
-  builder.fetch_constructor_data(webkit_options)
-  builder.fix_displacements('WebKit')
+    builder.fetch_constructor_data(webkit_options)
+    builder.fix_displacements('WebKit')
 
-  # Cleanup:
-  builder.normalize_annotations(['WebKit', 'Dart'])
+    # Cleanup:
+    builder.normalize_annotations(['WebKit', 'Dart'])
 
-  # Map any IDL defined dictionaries to Dictionary.
-  builder.map_dictionaries()
+    # Map any IDL defined dictionaries to Dictionary.
+    builder.map_dictionaries()
 
-  # Examine all IDL and produce a diagnoses of areas (e.g., list dictionaries
-  # declared and usage, etc.)
-  if examine_idls:
-    builder.examine_database()
+    # Examine all IDL and produce a diagnoses of areas (e.g., list dictionaries
+    # declared and usage, etc.)
+    if examine_idls:
+        builder.examine_database()
 
-  conditionals_met = set(
-      'ENABLE_' + conditional for conditional in builder.conditionals_met)
-  known_conditionals = set(FEATURE_DEFINES + FEATURE_DISABLED)
+    conditionals_met = set(
+        'ENABLE_' + conditional for conditional in builder.conditionals_met)
+    known_conditionals = set(FEATURE_DEFINES + FEATURE_DISABLED)
 
-  unused_conditionals = known_conditionals - conditionals_met
-  if unused_conditionals:
-    _logger.warning('There are some unused conditionals %s' %
-        sorted(unused_conditionals))
-    _logger.warning('Please update fremontcutbuilder.py')
+    unused_conditionals = known_conditionals - conditionals_met
+    if unused_conditionals:
+        _logger.warning('There are some unused conditionals %s' %
+                        sorted(unused_conditionals))
+        _logger.warning('Please update fremontcutbuilder.py')
 
-  unknown_conditionals = conditionals_met - known_conditionals
-  if unknown_conditionals:
-    _logger.warning('There are some unknown conditionals %s' %
-        sorted(unknown_conditionals))
-    _logger.warning('Please update fremontcutbuilder.py')
+    unknown_conditionals = conditionals_met - known_conditionals
+    if unknown_conditionals:
+        _logger.warning('There are some unknown conditionals %s' %
+                        sorted(unknown_conditionals))
+        _logger.warning('Please update fremontcutbuilder.py')
 
-  print 'Merging interfaces %s seconds' % round(time.time() - start_time, 2)
+    print 'Merging interfaces %s seconds' % round(time.time() - start_time, 2)
 
-  return db
+    return db
+
 
 def main(parallel=False, logging_level=logging.WARNING, examine_idls=False):
-  current_dir = os.path.dirname(__file__)
+    current_dir = os.path.dirname(__file__)
 
-  idl_files = []
+    idl_files = []
 
-  # Check default location in a regular dart enlistment.
-  webcore_dir = os.path.join(current_dir, '..', '..', '..', 'third_party',
-                             'WebCore')
+    # Check default location in a regular dart enlistment.
+    webcore_dir = os.path.join(current_dir, '..', '..', '..', 'third_party',
+                               'WebCore')
 
-  if not os.path.exists(webcore_dir):
-    # Check default location in a dartium enlistment.
-    webcore_dir = os.path.join(current_dir, '..', '..', '..', '..',
-                               'third_party', 'WebKit', 'Source')
+    if not os.path.exists(webcore_dir):
+        # Check default location in a dartium enlistment.
+        webcore_dir = os.path.join(current_dir, '..', '..', '..', '..',
+                                   'third_party', 'WebKit', 'Source')
 
-  if not os.path.exists(webcore_dir):
-    raise RuntimeError('directory not found: %s' % webcore_dir)
+    if not os.path.exists(webcore_dir):
+        raise RuntimeError('directory not found: %s' % webcore_dir)
 
-  DIRS_TO_IGNORE = [
-      'bindings', # Various test IDLs
-      'testing', # IDLs to expose testing APIs
-      'networkinfo', # Not yet used in Blink yet
-      'vibration', # Not yet used in Blink yet
-      'inspector',
-  ]
+    DIRS_TO_IGNORE = [
+        'bindings',  # Various test IDLs
+        'testing',  # IDLs to expose testing APIs
+        'networkinfo',  # Not yet used in Blink yet
+        'vibration',  # Not yet used in Blink yet
+        'inspector',
+    ]
 
-  # TODO(terry): Integrate this into the htmlrenamer's _removed_html_interfaces
-  #              (if possible).
-  FILES_TO_IGNORE = [
-      'InspectorFrontendHostFileSystem.idl',  # Uses interfaces in inspector dir (which is ignored)
-      'WebKitGamepad.idl',                    # Gamepad.idl is the new one.
-      'WebKitGamepadList.idl',                # GamepadList is the new one.
-  ]
+    # TODO(terry): Integrate this into the htmlrenamer's _removed_html_interfaces
+    #              (if possible).
+    FILES_TO_IGNORE = [
+        'InspectorFrontendHostFileSystem.idl',  # Uses interfaces in inspector dir (which is ignored)
+        'WebKitGamepad.idl',  # Gamepad.idl is the new one.
+        'WebKitGamepadList.idl',  # GamepadList is the new one.
+    ]
 
-  def visitor(arg, dir_name, names):
-    if os.path.basename(dir_name) in DIRS_TO_IGNORE:
-      names[:] = [] # Do not go underneath
-    for name in names:
-      file_name = os.path.join(dir_name, name)
-      (interface, ext) = os.path.splitext(file_name)
-      if ext == '.idl' and not(name in FILES_TO_IGNORE):
-        idl_files.append(file_name)
+    def visitor(arg, dir_name, names):
+        if os.path.basename(dir_name) in DIRS_TO_IGNORE:
+            names[:] = []  # Do not go underneath
+        for name in names:
+            file_name = os.path.join(dir_name, name)
+            (interface, ext) = os.path.splitext(file_name)
+            if ext == '.idl' and not (name in FILES_TO_IGNORE):
+                idl_files.append(file_name)
 
-  os.path.walk(webcore_dir, visitor, webcore_dir)
+    os.path.walk(webcore_dir, visitor, webcore_dir)
 
-  database_dir = os.path.join(current_dir, '..', 'database')
+    database_dir = os.path.join(current_dir, '..', 'database')
 
-  return build_database(idl_files, database_dir, logging_level=logging_level, examine_idls=examine_idls)
+    return build_database(
+        idl_files,
+        database_dir,
+        logging_level=logging_level,
+        examine_idls=examine_idls)
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/dom/scripts/generate_blink_file.py b/tools/dom/scripts/generate_blink_file.py
index f736035..6414f7a 100644
--- a/tools/dom/scripts/generate_blink_file.py
+++ b/tools/dom/scripts/generate_blink_file.py
@@ -3,7 +3,6 @@
 # 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.
-
 """Generates sdk/lib/_blink/dartium/_blink_dartium.dart file."""
 
 import os
@@ -24,9 +23,9 @@
     # Consider adding this method so there is a fast path to access only
     # element children.
     # 'NonDocumentTypeChildNode.nextElementSibling',
-    'Node.appendChild', # actually not removed, just native implementation.
+    'Node.appendChild',  # actually not removed, just native implementation.
     'Node.cloneNode',
-    'Node.insertBefore',    
+    'Node.insertBefore',
     'Node.lastChild',
     'Node.firstChild',
     'Node.parentElement',
@@ -42,12 +41,10 @@
     'Location.href',
     'Location.hash',
     'Node.querySelector',
-
     'HTMLElement.hidden',
     'HTMLElement.style',
     'Element.attributes',
     'Window.innerWidth',
-
     'NodeList.length',
     'NodeList.item',
     'ParentNode.children',
@@ -56,16 +53,13 @@
     'Event.target',
     'MouseEvent.clientY',
     'MouseEvent.clientX',
-
     'Node.nodeType',
     'Node.textContent',
-
     'HTMLCollection.length',
     'HTMLCollection.item',
     'Node.lastElementChild',
     'Node.firstElementChild',
     'HTMLElement_tabIndex',
-
     'Element.clientWidth',
     'Element.clientHeight',
     'Document.body',
@@ -80,24 +74,22 @@
     #'Document.createEvent',
     #'Document.initEvent',
     #'EventTarget.dispatchEvent',
-     ])
+])
 
 # Uncomment out this line  to short circuited native methods and run all of
 # dart:html through JS interop except for createElement which is slightly more
 # tightly natively wired.
 # _js_custom_members = Set([])
 
-
 # Expose built-in methods support by an instance that is not shown in the IDL.
 _additional_methods = {
-  # Support propertyIsEnumerable (available on all objects only needed by
-  # CSSStyleDeclaration decides if style property is supported (handling
-  # camelcase and inject hyphens between camelcase).
-  # Format of dictionary is 'operation name', arguments, returns value (True or False)
-  'CSSStyleDeclaration': ('propertyIsEnumerable', 1, True), 
+    # Support propertyIsEnumerable (available on all objects only needed by
+    # CSSStyleDeclaration decides if style property is supported (handling
+    # camelcase and inject hyphens between camelcase).
+    # Format of dictionary is 'operation name', arguments, returns value (True or False)
+    'CSSStyleDeclaration': ('propertyIsEnumerable', 1, True),
 }
 
-
 HEADER = """/* 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.
@@ -305,279 +297,356 @@
 #(interface_name)
 
 #
-CONSTRUCTOR_0 = ['  constructorCallback_0_()',
-                 ' => Blink_JsNative_DomException.callConstructor0("%s");\n\n',
-                 ' native "Blink_Constructor_%s";\n\n']
+CONSTRUCTOR_0 = [
+    '  constructorCallback_0_()',
+    ' => Blink_JsNative_DomException.callConstructor0("%s");\n\n',
+    ' native "Blink_Constructor_%s";\n\n'
+]
 
 #(argument_count, arguments, interface_name, arguments)
-CONSTRUCTOR_ARGS = ['  constructorCallback_%s_(%s)',
-   ' => Blink_JsNative_DomException.callConstructor("%s", [%s]);\n\n',
-   ' native "Blink_Constructor_Args_%s" /* %s */;\n\n']
+CONSTRUCTOR_ARGS = [
+    '  constructorCallback_%s_(%s)',
+    ' => Blink_JsNative_DomException.callConstructor("%s", [%s]);\n\n',
+    ' native "Blink_Constructor_Args_%s" /* %s */;\n\n'
+]
 
 #(attribute_name, attribute_name)
-ATTRIBUTE_GETTER = ['  %s_Getter_(mthis)',
-                    ' => Blink_JsNative_DomException.getProperty(mthis /* %s */, "%s");\n\n',
-                    ' native "Blink_Getter_%s_%s";\n\n'
-                    ]
+ATTRIBUTE_GETTER = [
+    '  %s_Getter_(mthis)',
+    ' => Blink_JsNative_DomException.getProperty(mthis /* %s */, "%s");\n\n',
+    ' native "Blink_Getter_%s_%s";\n\n'
+]
 
-ATTRIBUTE_SETTER = ['  %s_Setter_(mthis, __arg_0)',
-                    ' => Blink_JsNative_DomException.setProperty(mthis /* %s */, "%s", __arg_0);\n\n',
-                    ' native "Blink_Setter_%s_%s";\n\n'
-                    ]
+ATTRIBUTE_SETTER = [
+    '  %s_Setter_(mthis, __arg_0)',
+    ' => Blink_JsNative_DomException.setProperty(mthis /* %s */, "%s", __arg_0);\n\n',
+    ' native "Blink_Setter_%s_%s";\n\n'
+]
 
 #(operation_name, operationName)
-OPERATION_0 = ['  %s_Callback_0_(mthis)',
-               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", []);\n\n',
-               ' native "Blink_Operation_0_%s_%s";\n\n'
-               ]
+OPERATION_0 = [
+    '  %s_Callback_0_(mthis)',
+    ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", []);\n\n',
+    ' native "Blink_Operation_0_%s_%s";\n\n'
+]
 
 # getter, setter, deleter, propertyQuery code, and propertyIsEnumerable
-OPERATION_1 = ['  $%s_Callback_1_(mthis, __arg_0)',
-               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0]);\n\n',
-               ' native "Blink_Operation_1_%s_%s";\n\n'
-               ]
+OPERATION_1 = [
+    '  $%s_Callback_1_(mthis, __arg_0)',
+    ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0]);\n\n',
+    ' native "Blink_Operation_1_%s_%s";\n\n'
+]
 
-OPERATION_2 = ['  $%s_Callback_2_(mthis, __arg_0, __arg_1)',
-               ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0, __arg_1]);\n\n',
-               ' native "Blink_Operation_2_%s_%s";\n\n']
+OPERATION_2 = [
+    '  $%s_Callback_2_(mthis, __arg_0, __arg_1)',
+    ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [__arg_0, __arg_1]);\n\n',
+    ' native "Blink_Operation_2_%s_%s";\n\n'
+]
 
-OPERATION_PQ = ['  $%s_Callback_1_(mthis, __arg_0)',
-                ' => Blink_JsNative_DomException.propertyQuery(mthis, __arg_0); /* %s */ \n\n',
-                ' native "Blink_Operation_PQ_%s";\n\n']
+OPERATION_PQ = [
+    '  $%s_Callback_1_(mthis, __arg_0)',
+    ' => Blink_JsNative_DomException.propertyQuery(mthis, __arg_0); /* %s */ \n\n',
+    ' native "Blink_Operation_PQ_%s";\n\n'
+]
 
 #(operation_name, argument_count, arguments, operation_name, arguments)
 ARGUMENT_NUM = "__arg_%s"
-OPERATION_ARGS = ['  %s_Callback_%s_(mthis, %s)',
-                  ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [%s]);\n\n',
-                  ' native "Blink_Operation_%s_%s"; /* %s */\n\n']
-
-
+OPERATION_ARGS = [
+    '  %s_Callback_%s_(mthis, %s)',
+    ' => Blink_JsNative_DomException.callMethod(mthis /* %s */, "%s", [%s]);\n\n',
+    ' native "Blink_Operation_%s_%s"; /* %s */\n\n'
+]
 
 # get class property to make static call.
 CLASS_STATIC = 'Blink_JsNative_DomException.getProperty(js.context, "%s")'
 
 # name, classname_getproperty, name
-STATIC_ATTRIBUTE_GETTER = ['  %s_Getter_()',
-                           ' => Blink_JsNative_DomException.getProperty(%s /* %s */, "%s");\n\n',
-                           ' /* %s */ native "Blink_Static_getter_%s_%s"']
+STATIC_ATTRIBUTE_GETTER = [
+    '  %s_Getter_()',
+    ' => Blink_JsNative_DomException.getProperty(%s /* %s */, "%s");\n\n',
+    ' /* %s */ native "Blink_Static_getter_%s_%s"'
+]
 
 # name, classname_getproperty, name
-STATIC_OPERATION_0 = ['  %s_Callback_0_()',
-                      ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", []);\n\n',
-                      ' /* %s */ native "Blink_Static_Operation_0_%s_%s']
+STATIC_OPERATION_0 = [
+    '  %s_Callback_0_()',
+    ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", []);\n\n',
+    ' /* %s */ native "Blink_Static_Operation_0_%s_%s'
+]
 
 # name, argsCount, args, classname_getproperty, name, args
-STATIC_OPERATION_ARGS = ['  %s_Callback_%s_(%s)',
-                         ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", [%s]);\n\n',
-                         ' /* %s */ native "Blink_Static_Operations_%s_%s" /* %s */ \n\n']
+STATIC_OPERATION_ARGS = [
+    '  %s_Callback_%s_(%s)',
+    ' => Blink_JsNative_DomException.callMethod(%s /* %s */, "%s", [%s]);\n\n',
+    ' /* %s */ native "Blink_Static_Operations_%s_%s" /* %s */ \n\n'
+]
 
 CLASS_DEFINITION_END = """}
 
 """
 
+
 def ConstantOutputOrder(a, b):
-  """Canonical output ordering for constants."""
-  return cmp(a.id, b.id)
+    """Canonical output ordering for constants."""
+    return cmp(a.id, b.id)
+
 
 def generate_parameter_entries(param_infos):
-    optional_default_args = 0;
+    optional_default_args = 0
     for argument in param_infos:
-      if argument.is_optional:
-        optional_default_args += 1
+        if argument.is_optional:
+            optional_default_args += 1
 
     arg_count = len(param_infos)
     min_arg_count = arg_count - optional_default_args
     lb = min_arg_count - 2 if min_arg_count > 2 else 0
     return (lb, arg_count + 1)
 
+
 constructor_renames = {
     'RTCPeerConnection': 'webkitRTCPeerConnection',
     'SpeechRecognition': 'webkitSpeechRecognition',
 }
 
+
 def rename_constructor(name):
-  return constructor_renames[name] if name in constructor_renames else name
+    return constructor_renames[name] if name in constructor_renames else name
 
 
 def _Find_Match(interface_id, member, member_prefix, candidates):
-  member_name = interface_id + '.' + member
-  if member_name in candidates:
-    return member_name
-  member_name = interface_id + '.' + member_prefix + member
-  if member_name in candidates:
-    return member_name
-  member_name = interface_id + '.*'
-  if member_name in candidates:
-    return member_name
+    member_name = interface_id + '.' + member
+    if member_name in candidates:
+        return member_name
+    member_name = interface_id + '.' + member_prefix + member
+    if member_name in candidates:
+        return member_name
+    member_name = interface_id + '.*'
+    if member_name in candidates:
+        return member_name
+
 
 def _Is_Native(interface, member):
-  return _Find_Match(interface, member, '', _js_custom_members)
+    return _Find_Match(interface, member, '', _js_custom_members)
+
 
 def Select_Stub(template, is_native):
-  if is_native:
-    return template[0] + template[2]
-  else:
-    return template[0] + template[1]
+    if is_native:
+        return template[0] + template[2]
+    else:
+        return template[0] + template[1]
+
 
 def Generate_Blink(output_dir, database, type_registry):
-  blink_filename = os.path.join(output_dir, '_blink_dartium.dart')
-  blink_file = open(blink_filename, 'w')
+    blink_filename = os.path.join(output_dir, '_blink_dartium.dart')
+    blink_file = open(blink_filename, 'w')
 
-  blink_file.write(HEADER);
+    blink_file.write(HEADER)
 
-  interfaces = database.GetInterfaces()
-  for interface in interfaces:
-    name = interface.id
-    resolver_entry = '  if (s == "%s") return Blink%s.instance;\n' % (name, name)
-    blink_file.write(resolver_entry)
+    interfaces = database.GetInterfaces()
+    for interface in interfaces:
+        name = interface.id
+        resolver_entry = '  if (s == "%s") return Blink%s.instance;\n' % (name,
+                                                                          name)
+        blink_file.write(resolver_entry)
 
-  blink_file.write(END_RESOLVER);
+    blink_file.write(END_RESOLVER)
 
-  for interface in interfaces:
-    name = interface.id
+    for interface in interfaces:
+        name = interface.id
 
-    if interface.parents and len(interface.parents) > 0 and interface.parents[0].id:
-      extends = interface.parents[0].id
-      class_def = CLASS_DEFINITION_EXTENDS % (name, extends, name)
-    else:
-      class_def = CLASS_DEFINITION % (name, name)
-    blink_file.write(class_def);
+        if interface.parents and len(
+                interface.parents) > 0 and interface.parents[0].id:
+            extends = interface.parents[0].id
+            class_def = CLASS_DEFINITION_EXTENDS % (name, extends, name)
+        else:
+            class_def = CLASS_DEFINITION % (name, name)
+        blink_file.write(class_def)
 
-    analyzed_constructors = AnalyzeConstructor(interface)
-    if analyzed_constructors:
-      _Emit_Blink_Constructors(blink_file, analyzed_constructors)
-    elif 'Constructor' in interface.ext_attrs:
-      # Zero parameter constructor.
-      blink_file.write(Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) % rename_constructor(name))
+        analyzed_constructors = AnalyzeConstructor(interface)
+        if analyzed_constructors:
+            _Emit_Blink_Constructors(blink_file, analyzed_constructors)
+        elif 'Constructor' in interface.ext_attrs:
+            # Zero parameter constructor.
+            blink_file.write(
+                Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) %
+                rename_constructor(name))
 
-    _Process_Attributes(blink_file, interface, interface.attributes)
-    _Process_Operations(blink_file, interface, interface.operations, True)
+        _Process_Attributes(blink_file, interface, interface.attributes)
+        _Process_Operations(blink_file, interface, interface.operations, True)
 
-    _Emit_Extra_Operations(blink_file, name)
+        _Emit_Extra_Operations(blink_file, name)
 
-    secondary_parents = database.TransitiveSecondaryParents(interface, False)
-    for secondary in secondary_parents:
-      _Process_Attributes(blink_file, secondary, secondary.attributes)
-      _Process_Operations(blink_file, secondary, secondary.operations, False)
+        secondary_parents = database.TransitiveSecondaryParents(
+            interface, False)
+        for secondary in secondary_parents:
+            _Process_Attributes(blink_file, secondary, secondary.attributes)
+            _Process_Operations(blink_file, secondary, secondary.operations,
+                                False)
 
-    blink_file.write(CLASS_DEFINITION_END);
+        blink_file.write(CLASS_DEFINITION_END)
 
-  blink_file.write(BLINK_UTILS)
+    blink_file.write(BLINK_UTILS)
 
-  blink_file.close()
+    blink_file.close()
+
 
 def _Emit_Extra_Operations(blink_file, interface_name):
-  if (interface_name in _additional_methods):
-    (name, arg_count, return_value) = _additional_methods[interface_name]
-    exposed_name = ''.join(['__get', '___', name]) if return_value else name
-    blink_file.write(Select_Stub(OPERATION_1, False) % (exposed_name, interface_name, name))
+    if (interface_name in _additional_methods):
+        (name, arg_count, return_value) = _additional_methods[interface_name]
+        exposed_name = ''.join(['__get', '___', name]) if return_value else name
+        blink_file.write(
+            Select_Stub(OPERATION_1, False) % (exposed_name, interface_name,
+                                               name))
+
 
 def _Emit_Blink_Constructors(blink_file, analyzed_constructors):
-  (arg_min_count, arg_max_count) = generate_parameter_entries(analyzed_constructors.param_infos)
-  name = analyzed_constructors.js_name
-  if not(name):
-    name = analyzed_constructors.type_name
+    (arg_min_count, arg_max_count) = generate_parameter_entries(
+        analyzed_constructors.param_infos)
+    name = analyzed_constructors.js_name
+    if not (name):
+        name = analyzed_constructors.type_name
 
-  for callback_index in range(arg_min_count, arg_max_count):
-    if callback_index == 0:
-      blink_file.write(Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) % (rename_constructor(name)))
-    else:
-      arguments = []
-      for i in range(0, callback_index):
-        arguments.append(ARGUMENT_NUM % i)
-      argument_list = ', '.join(arguments)
-      blink_file.write(
-        Select_Stub(CONSTRUCTOR_ARGS, _Is_Native(name, 'constructor')) % (callback_index, argument_list, rename_constructor(name), argument_list))
+    for callback_index in range(arg_min_count, arg_max_count):
+        if callback_index == 0:
+            blink_file.write(
+                Select_Stub(CONSTRUCTOR_0, _Is_Native(name, 'constructor')) %
+                (rename_constructor(name)))
+        else:
+            arguments = []
+            for i in range(0, callback_index):
+                arguments.append(ARGUMENT_NUM % i)
+            argument_list = ', '.join(arguments)
+            blink_file.write(
+                Select_Stub(CONSTRUCTOR_ARGS, _Is_Native(name, 'constructor')) %
+                (callback_index, argument_list, rename_constructor(name),
+                 argument_list))
+
 
 def _Process_Attributes(blink_file, interface, attributes):
-  # Emit an interface's attributes and operations.
-  for attribute in sorted(attributes, ConstantOutputOrder):
-    name = attribute.id
-    is_native = _Is_Native(interface.id, name)
-    if attribute.is_read_only:
-      if attribute.is_static:
-        class_property = CLASS_STATIC % interface.id
-        blink_file.write(Select_Stub(STATIC_ATTRIBUTE_GETTER, is_native) % (name, class_property, interface.id, name))
-      else:
-        blink_file.write(Select_Stub(ATTRIBUTE_GETTER, is_native) % (name, interface.id, name))
-    else:
-      blink_file.write(Select_Stub(ATTRIBUTE_GETTER, is_native) % (name, interface.id, name))
-      blink_file.write(Select_Stub(ATTRIBUTE_SETTER, is_native) % (name, interface.id, name))
+    # Emit an interface's attributes and operations.
+    for attribute in sorted(attributes, ConstantOutputOrder):
+        name = attribute.id
+        is_native = _Is_Native(interface.id, name)
+        if attribute.is_read_only:
+            if attribute.is_static:
+                class_property = CLASS_STATIC % interface.id
+                blink_file.write(
+                    Select_Stub(STATIC_ATTRIBUTE_GETTER, is_native) %
+                    (name, class_property, interface.id, name))
+            else:
+                blink_file.write(
+                    Select_Stub(ATTRIBUTE_GETTER, is_native) %
+                    (name, interface.id, name))
+        else:
+            blink_file.write(
+                Select_Stub(ATTRIBUTE_GETTER, is_native) % (name, interface.id,
+                                                            name))
+            blink_file.write(
+                Select_Stub(ATTRIBUTE_SETTER, is_native) % (name, interface.id,
+                                                            name))
 
-def _Process_Operations(blink_file, interface, operations, primary_interface = False):
-  analyzeOperations = []
 
-  for operation in sorted(operations, ConstantOutputOrder):
-    if len(analyzeOperations) == 0:
-      analyzeOperations.append(operation)
-    else:
-      if analyzeOperations[0].id == operation.id:
-        # Handle overloads
-        analyzeOperations.append(operation)
-      else:
-        _Emit_Blink_Operation(blink_file, interface, analyzeOperations, primary_interface)
-        analyzeOperations = [operation]
-  if len(analyzeOperations) > 0:
-    _Emit_Blink_Operation(blink_file, interface, analyzeOperations, primary_interface)
+def _Process_Operations(blink_file,
+                        interface,
+                        operations,
+                        primary_interface=False):
+    analyzeOperations = []
+
+    for operation in sorted(operations, ConstantOutputOrder):
+        if len(analyzeOperations) == 0:
+            analyzeOperations.append(operation)
+        else:
+            if analyzeOperations[0].id == operation.id:
+                # Handle overloads
+                analyzeOperations.append(operation)
+            else:
+                _Emit_Blink_Operation(blink_file, interface, analyzeOperations,
+                                      primary_interface)
+                analyzeOperations = [operation]
+    if len(analyzeOperations) > 0:
+        _Emit_Blink_Operation(blink_file, interface, analyzeOperations,
+                              primary_interface)
+
 
 # List of DartName operations to not emit (e.g., For now only WebGL2RenderingContextBase
 # has readPixels in both WebGLRenderingContextBase and WebGL2RenderingContextBase.
 # Furthermore, readPixels has the exact same number of arguments - in Javascript
 # there is no typing so they're the same.
 suppressed_operations = {
-    'WebGL2RenderingContextBase': [ 'readPixels2', 'texImage2D2' ],
+    'WebGL2RenderingContextBase': ['readPixels2', 'texImage2D2'],
 }
 
+
 def _Suppress_Secondary_Interface_Operation(interface, analyzed):
-  if interface.id in suppressed_operations:
-    # Should this DartName (name property) be suppressed on this interface?
-    return analyzed.name in suppressed_operations[interface.id]
-  return False
+    if interface.id in suppressed_operations:
+        # Should this DartName (name property) be suppressed on this interface?
+        return analyzed.name in suppressed_operations[interface.id]
+    return False
 
-def _Emit_Blink_Operation(blink_file, interface, analyzeOperations, primary_interface):
-  analyzed = AnalyzeOperation(interface, analyzeOperations)
 
-  if not(primary_interface) and _Suppress_Secondary_Interface_Operation(interface, analyzed):
-    return
+def _Emit_Blink_Operation(blink_file, interface, analyzeOperations,
+                          primary_interface):
+    analyzed = AnalyzeOperation(interface, analyzeOperations)
 
-  (arg_min_count, arg_max_count) = generate_parameter_entries(analyzed.param_infos)
-  name = analyzed.js_name
+    if not (primary_interface) and _Suppress_Secondary_Interface_Operation(
+            interface, analyzed):
+        return
 
-  is_native = _Is_Native(interface.id, name)
+    (arg_min_count,
+     arg_max_count) = generate_parameter_entries(analyzed.param_infos)
+    name = analyzed.js_name
 
-  operation = analyzeOperations[0]
-  if (name.startswith('__') and \
-      ('getter' in operation.specials or \
-       'setter' in operation.specials or \
-       'deleter' in operation.specials)):
-    if name == '__propertyQuery__':
-      blink_file.write(Select_Stub(OPERATION_PQ, is_native) % (name, interface.id))
-    else:
-      arg_min_count = arg_max_count
-      if arg_max_count == 2:
-        blink_file.write(Select_Stub(OPERATION_1, is_native) % (name, interface.id, name))
-      elif arg_max_count == 3:
-        blink_file.write(Select_Stub(OPERATION_2, is_native) % (name, interface.id, name))
-      else:
-        print "FATAL ERROR: _blink emitter operator %s.%s" % (interface.id, name)
-        exit
+    is_native = _Is_Native(interface.id, name)
 
-    return
+    operation = analyzeOperations[0]
+    if (name.startswith('__') and \
+        ('getter' in operation.specials or \
+         'setter' in operation.specials or \
+         'deleter' in operation.specials)):
+        if name == '__propertyQuery__':
+            blink_file.write(
+                Select_Stub(OPERATION_PQ, is_native) % (name, interface.id))
+        else:
+            arg_min_count = arg_max_count
+            if arg_max_count == 2:
+                blink_file.write(
+                    Select_Stub(OPERATION_1, is_native) % (name, interface.id,
+                                                           name))
+            elif arg_max_count == 3:
+                blink_file.write(
+                    Select_Stub(OPERATION_2, is_native) % (name, interface.id,
+                                                           name))
+            else:
+                print "FATAL ERROR: _blink emitter operator %s.%s" % (
+                    interface.id, name)
+                exit
 
-  for callback_index in range(arg_min_count, arg_max_count):
-    if callback_index == 0:
-      if operation.is_static:
-        class_property = CLASS_STATIC % interface.id
-        blink_file.write(Select_Stub(STATIC_OPERATION_0, is_native) % (name, class_property, interface.id, name))
-      else:
-        blink_file.write(Select_Stub(OPERATION_0, is_native) % (name, interface.id, name))
-    else:
-      arguments = []
-      for i in range(0, callback_index):
-        arguments.append(ARGUMENT_NUM % i)
-      argument_list = ', '.join(arguments)
-      if operation.is_static:
-        class_property = CLASS_STATIC % interface.id
-        blink_file.write(Select_Stub(STATIC_OPERATION_ARGS, is_native) % (name, callback_index, argument_list, class_property, interface.id, name, argument_list))
-      else:
-        blink_file.write(Select_Stub(OPERATION_ARGS, is_native) % (name, callback_index, argument_list, interface.id, name, argument_list))
+        return
+
+    for callback_index in range(arg_min_count, arg_max_count):
+        if callback_index == 0:
+            if operation.is_static:
+                class_property = CLASS_STATIC % interface.id
+                blink_file.write(
+                    Select_Stub(STATIC_OPERATION_0, is_native) %
+                    (name, class_property, interface.id, name))
+            else:
+                blink_file.write(
+                    Select_Stub(OPERATION_0, is_native) % (name, interface.id,
+                                                           name))
+        else:
+            arguments = []
+            for i in range(0, callback_index):
+                arguments.append(ARGUMENT_NUM % i)
+            argument_list = ', '.join(arguments)
+            if operation.is_static:
+                class_property = CLASS_STATIC % interface.id
+                blink_file.write(
+                    Select_Stub(STATIC_OPERATION_ARGS, is_native) %
+                    (name, callback_index, argument_list, class_property,
+                     interface.id, name, argument_list))
+            else:
+                blink_file.write(
+                    Select_Stub(OPERATION_ARGS, is_native) %
+                    (name, callback_index, argument_list, interface.id, name,
+                     argument_list))
diff --git a/tools/dom/scripts/generator.py b/tools/dom/scripts/generator.py
index 2ab2be7..65e9e75 100644
--- a/tools/dom/scripts/generator.py
+++ b/tools/dom/scripts/generator.py
@@ -2,7 +2,6 @@
 # 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 module provides shared functionality for systems to generate
 Dart APIs from the IDL database."""
 
@@ -52,46 +51,47 @@
     'WindowImageBitmapFactories',
     'WindowPagePopup',
     'WindowTimers',
-    ])
+])
 
-_safe_interfaces = monitored.Set('generator._safe_interfaces', [
-    'double',
-    'Float32Array',
-    'Float64Array',
-    'Int8Array',
-    'Int16Array',
-    'Int32Array',
-    'Uint8Array',
-    'Uint8ClampedArray',
-    'Uint16Array',
-    'Uint32Array',
-    'ArrayBufferView',
-    'ArrayBuffer',
-    'SourceBuffer', # IDL lies about this class being a pure interface.
-    'Console', # this one is a bit of a hack as our console implementation
-              # in dart:html is non-standard for legacy reasons.
-    'AudioContext',
-    'AudioSourceNode',
-    'WebGLVertexArrayObjectOES', # Added a polyfill for this.
-    # Types where we can get access to the prototype easily enough.
-    # We might consider in the future treating these are regular interface types.
-    'StereoPannerNode',
-    'PannerNode',
-    'AudioNode',
-    'FontFaceSet',
-    'MemoryInfo',
-    'ConsoleBase',
-    'Geolocation',
-    'Animation',
-    'SourceBufferList',
-    'GamepadList',
+_safe_interfaces = monitored.Set(
+    'generator._safe_interfaces',
+    [
+        'double',
+        'Float32Array',
+        'Float64Array',
+        'Int8Array',
+        'Int16Array',
+        'Int32Array',
+        'Uint8Array',
+        'Uint8ClampedArray',
+        'Uint16Array',
+        'Uint32Array',
+        'ArrayBufferView',
+        'ArrayBuffer',
+        'SourceBuffer',  # IDL lies about this class being a pure interface.
+        'Console',  # this one is a bit of a hack as our console implementation
+        # in dart:html is non-standard for legacy reasons.
+        'AudioContext',
+        'AudioSourceNode',
+        'WebGLVertexArrayObjectOES',  # Added a polyfill for this.
+        # Types where we can get access to the prototype easily enough.
+        # We might consider in the future treating these are regular interface types.
+        'StereoPannerNode',
+        'PannerNode',
+        'AudioNode',
+        'FontFaceSet',
+        'MemoryInfo',
+        'ConsoleBase',
+        'Geolocation',
+        'Animation',
+        'SourceBufferList',
+        'GamepadList',
 
-    # The following classes are enabled just to get the build to go.
-    # SpeechRecognitionResultList isn't really allowed but the codegen creates
-    # invalid output otherwise.
-
-    'SpeechRecognitionResultList',
-    'SQLResultSetRowList',
+        # The following classes are enabled just to get the build to go.
+        # SpeechRecognitionResultList isn't really allowed but the codegen creates
+        # invalid output otherwise.
+        'SpeechRecognitionResultList',
+        'SQLResultSetRowList',
     ])
 
 # These are interfaces that we have to treat as safe for dart2js and dartium
@@ -187,20 +187,22 @@
 # Classes we should just suppress?
 # SpeechGrammarList and friends
 
+
 def IsPureInterface(interface_name, database):
-  if (interface_name in _pure_interfaces):
-    return True
-  if (interface_name in _safe_interfaces or
-      interface_name in _safe_interfaces_legacy or
-      database.HasInterface(interface_name)):
-    return False
+    if (interface_name in _pure_interfaces):
+        return True
+    if (interface_name in _safe_interfaces or
+            interface_name in _safe_interfaces_legacy or
+            database.HasInterface(interface_name)):
+        return False
 
-  interface = database.GetInterface(interface_name)
+    interface = database.GetInterface(interface_name)
 
-  if 'Constructor' in interface.ext_attrs:
-    return False
+    if 'Constructor' in interface.ext_attrs:
+        return False
 
-  return interface.is_no_interface_object
+    return interface.is_no_interface_object
+
 
 #
 # Classes which have native constructors but which we are suppressing because
@@ -208,41 +210,46 @@
 #
 _suppressed_native_constructors = monitored.Set(
     'generator._suppressed_native_constructors', [
-  'DocumentFragment',
-  'Range',
-  'Text',
-  ])
+        'DocumentFragment',
+        'Range',
+        'Text',
+    ])
 
 _custom_types = monitored.Set('generator._custom_types',
                               typed_array_renames.keys())
 
+
 def IsCustomType(interface_name):
-  return interface_name in _custom_types
+    return interface_name in _custom_types
+
 
 _methods_with_named_formals = monitored.Set(
     'generator._methods_with_named_formals', [
-  'DirectoryEntry.getDirectory',
-  'DirectoryEntry.getFile',
-  'Entry.copyTo',
-  'Entry.moveTo',
-  'HTMLInputElement.setRangeText',
-  'HTMLTextAreaElement.setRangeText',
-  'XMLHttpRequest.open',
-  ])
+        'DirectoryEntry.getDirectory',
+        'DirectoryEntry.getFile',
+        'Entry.copyTo',
+        'Entry.moveTo',
+        'HTMLInputElement.setRangeText',
+        'HTMLTextAreaElement.setRangeText',
+        'XMLHttpRequest.open',
+    ])
+
 
 def hasNamedFormals(full_name):
-  return full_name in _methods_with_named_formals
+    return full_name in _methods_with_named_formals
+
 
 def ReturnValueConversionHack(idl_type, value, interface_name):
-  if idl_type == 'SVGMatrix':
-    return '%sTearOff::create(%s)' % (idl_type, value)
-  elif ((idl_type == 'SVGAngle' and interface_name != 'SVGAnimatedAngle')
-      or (idl_type == 'SVGTransform' and interface_name == 'SVGSVGElement')):
-    # Somewhere in the IDL it probably specifies whether we need to call
-    # create or not.
-    return 'SVGPropertyTearOff<%s>::create(%s)' % (idl_type, value)
+    if idl_type == 'SVGMatrix':
+        return '%sTearOff::create(%s)' % (idl_type, value)
+    elif ((idl_type == 'SVGAngle' and interface_name != 'SVGAnimatedAngle') or
+          (idl_type == 'SVGTransform' and interface_name == 'SVGSVGElement')):
+        # Somewhere in the IDL it probably specifies whether we need to call
+        # create or not.
+        return 'SVGPropertyTearOff<%s>::create(%s)' % (idl_type, value)
 
-  return value
+    return value
+
 
 #
 # Renames for attributes that have names that are not legal Dart names.
@@ -255,365 +262,392 @@
 # Interface version of the DOM needs to delegate typed array constructors to a
 # factory provider.
 #
-interface_factories = monitored.Dict('generator.interface_factories', {
-})
-
+interface_factories = monitored.Dict('generator.interface_factories', {})
 
 #
 # Custom native specs for the dart2js dom.
 #
 _dart2js_dom_custom_native_specs = monitored.Dict(
-      'generator._dart2js_dom_custom_native_specs', {
+    'generator._dart2js_dom_custom_native_specs',
+    {
 
-    # Nodes with different tags in different browsers can be listed as multiple
-    # tags here provided there is not conflict in usage (e.g. browser X has tag
-    # T and no other browser has tag T).
-
-    'AnalyserNode': 'AnalyserNode,RealtimeAnalyserNode',
-    'AudioContext': 'AudioContext,webkitAudioContext',
-
-    'ChannelMergerNode': 'ChannelMergerNode,AudioChannelMerger',
-    'ChannelSplitterNode': 'ChannelSplitterNode,AudioChannelSplitter',
-
-    'DOMRect': 'ClientRect,DOMRect',
-
-    'DOMRectList': 'ClientRectList,DOMRectList',
-
-    'CSSStyleDeclaration':
+        # Nodes with different tags in different browsers can be listed as multiple
+        # tags here provided there is not conflict in usage (e.g. browser X has tag
+        # T and no other browser has tag T).
+        'AnalyserNode':
+        'AnalyserNode,RealtimeAnalyserNode',
+        'AudioContext':
+        'AudioContext,webkitAudioContext',
+        'ChannelMergerNode':
+        'ChannelMergerNode,AudioChannelMerger',
+        'ChannelSplitterNode':
+        'ChannelSplitterNode,AudioChannelSplitter',
+        'DOMRect':
+        'ClientRect,DOMRect',
+        'DOMRectList':
+        'ClientRectList,DOMRectList',
+        'CSSStyleDeclaration':
         #                    IE                   Firefox
         'CSSStyleDeclaration,MSStyleCSSProperties,CSS2Properties',
-
-    'ApplicationCache':
+        'ApplicationCache':
         'ApplicationCache,DOMApplicationCache,OfflineResourceList',
-
-    'Event':
+        'Event':
         'Event,InputEvent',
-
-    'HTMLTableCellElement':
+        'HTMLTableCellElement':
         'HTMLTableCellElement,HTMLTableDataCellElement,HTMLTableHeaderCellElement',
-
-    'GainNode': 'GainNode,AudioGainNode',
-
-    'IDBOpenDBRequest':
+        'GainNode':
+        'GainNode,AudioGainNode',
+        'IDBOpenDBRequest':
         'IDBOpenDBRequest,IDBVersionChangeRequest',
-
-    'MouseEvent': 'MouseEvent,DragEvent',
-
-    'MutationObserver': 'MutationObserver,WebKitMutationObserver',
-
-    'NamedNodeMap': 'NamedNodeMap,MozNamedAttrMap',
-
-    'NodeList': 'NodeList,RadioNodeList',
-
-    'OscillatorNode': 'OscillatorNode,Oscillator',
-
-    'PannerNode': 'PannerNode,AudioPannerNode,webkitAudioPannerNode',
-
-    'RTCPeerConnection': 'RTCPeerConnection,webkitRTCPeerConnection,mozRTCPeerConnection',
-
-    'RTCIceCandidate': 'RTCIceCandidate,mozRTCIceCandidate',
-
-    'RTCSessionDescription': 'RTCSessionDescription,mozRTCSessionDescription',
-
-    'RTCDataChannel': 'RTCDataChannel,DataChannel',
-
-    'ScriptProcessorNode': 'ScriptProcessorNode,JavaScriptAudioNode',
-
-    'TransitionEvent': 'TransitionEvent,WebKitTransitionEvent',
-
-    'CSSKeyframeRule':
+        'MouseEvent':
+        'MouseEvent,DragEvent',
+        'MutationObserver':
+        'MutationObserver,WebKitMutationObserver',
+        'NamedNodeMap':
+        'NamedNodeMap,MozNamedAttrMap',
+        'NodeList':
+        'NodeList,RadioNodeList',
+        'OscillatorNode':
+        'OscillatorNode,Oscillator',
+        'PannerNode':
+        'PannerNode,AudioPannerNode,webkitAudioPannerNode',
+        'RTCPeerConnection':
+        'RTCPeerConnection,webkitRTCPeerConnection,mozRTCPeerConnection',
+        'RTCIceCandidate':
+        'RTCIceCandidate,mozRTCIceCandidate',
+        'RTCSessionDescription':
+        'RTCSessionDescription,mozRTCSessionDescription',
+        'RTCDataChannel':
+        'RTCDataChannel,DataChannel',
+        'ScriptProcessorNode':
+        'ScriptProcessorNode,JavaScriptAudioNode',
+        'TransitionEvent':
+        'TransitionEvent,WebKitTransitionEvent',
+        'CSSKeyframeRule':
         'CSSKeyframeRule,MozCSSKeyframeRule,WebKitCSSKeyframeRule',
-
-    'CSSKeyframesRule':
+        'CSSKeyframesRule':
         'CSSKeyframesRule,MozCSSKeyframesRule,WebKitCSSKeyframesRule',
 
-    # webgl extensions are sometimes named directly after the getExtension
-    # parameter (e.g on Firefox).
-
-    'ANGLEInstancedArrays': 'ANGLEInstancedArrays,ANGLE_instanced_arrays',
-    'EXTsRGB': 'EXTsRGB,EXT_sRGB',
-    'EXTBlendMinMax': 'EXTBlendMinMax,EXT_blend_minmax',
-    'EXTFragDepth': 'EXTFragDepth,EXT_frag_depth',
-    'EXTShaderTextureLOD': 'EXTShaderTextureLOD,EXT_shader_texture_lod',
-    'EXTTextureFilterAnisotropic':
+        # webgl extensions are sometimes named directly after the getExtension
+        # parameter (e.g on Firefox).
+        'ANGLEInstancedArrays':
+        'ANGLEInstancedArrays,ANGLE_instanced_arrays',
+        'EXTsRGB':
+        'EXTsRGB,EXT_sRGB',
+        'EXTBlendMinMax':
+        'EXTBlendMinMax,EXT_blend_minmax',
+        'EXTFragDepth':
+        'EXTFragDepth,EXT_frag_depth',
+        'EXTShaderTextureLOD':
+        'EXTShaderTextureLOD,EXT_shader_texture_lod',
+        'EXTTextureFilterAnisotropic':
         'EXTTextureFilterAnisotropic,EXT_texture_filter_anisotropic',
-    'OESElementIndexUint': 'OESElementIndexUint,OES_element_index_uint',
-    'OESStandardDerivatives': 'OESStandardDerivatives,OES_standard_derivatives',
-    'OESTextureFloat': 'OESTextureFloat,OES_texture_float',
-    'OESTextureFloatLinear': 'OESTextureFloatLinear,OES_texture_float_linear',
-    'OESTextureHalfFloat': 'OESTextureHalfFloat,OES_texture_half_float',
-    'OESTextureHalfFloatLinear':
+        'OESElementIndexUint':
+        'OESElementIndexUint,OES_element_index_uint',
+        'OESStandardDerivatives':
+        'OESStandardDerivatives,OES_standard_derivatives',
+        'OESTextureFloat':
+        'OESTextureFloat,OES_texture_float',
+        'OESTextureFloatLinear':
+        'OESTextureFloatLinear,OES_texture_float_linear',
+        'OESTextureHalfFloat':
+        'OESTextureHalfFloat,OES_texture_half_float',
+        'OESTextureHalfFloatLinear':
         'OESTextureHalfFloatLinear,OES_texture_half_float_linear',
-    'OESVertexArrayObject':
+        'OESVertexArrayObject':
         'OESVertexArrayObject,OES_vertex_array_object',
-    'WebGLCompressedTextureATC':
+        'WebGLCompressedTextureATC':
         'WebGLCompressedTextureATC,WEBGL_compressed_texture_atc',
-    'WebGLCompressedTextureETC1':
+        'WebGLCompressedTextureETC1':
         'WebGLCompressedTextureETC1,WEBGL_compressed_texture_etc1',
-    'WebGLCompressedTexturePVRTC':
+        'WebGLCompressedTexturePVRTC':
         'WebGLCompressedTexturePVRTC,WEBGL_compressed_texture_pvrtc',
-    'WebGLCompressedTextureS3TC':
+        'WebGLCompressedTextureS3TC':
         'WebGLCompressedTextureS3TC,WEBGL_compressed_texture_s3tc',
-    'WebGLDebugRendererInfo': 'WebGLDebugRendererInfo,WEBGL_debug_renderer_info',
-    'WebGLDebugShaders': 'WebGLDebugShaders,WEBGL_debug_shaders',
-    'WebGLDepthTexture': 'WebGLDepthTexture,WEBGL_depth_texture',
-    'WebGLDrawBuffers': 'WebGLDrawBuffers,WEBGL_draw_buffers',
-    'WebGLLoseContext':
+        'WebGLDebugRendererInfo':
+        'WebGLDebugRendererInfo,WEBGL_debug_renderer_info',
+        'WebGLDebugShaders':
+        'WebGLDebugShaders,WEBGL_debug_shaders',
+        'WebGLDepthTexture':
+        'WebGLDepthTexture,WEBGL_depth_texture',
+        'WebGLDrawBuffers':
+        'WebGLDrawBuffers,WEBGL_draw_buffers',
+        'WebGLLoseContext':
         'WebGLLoseContext,WebGLExtensionLoseContext,WEBGL_lose_context',
+    },
+    dart2jsOnly=True)
 
 
-}, dart2jsOnly=True)
-
 def IsRegisteredType(type_name):
-  return type_name in _idl_type_registry
+    return type_name in _idl_type_registry
+
 
 def MakeNativeSpec(javascript_binding_name):
-  if javascript_binding_name in _dart2js_dom_custom_native_specs:
-    return _dart2js_dom_custom_native_specs[javascript_binding_name]
-  else:
-    # Make the class 'hidden' so it is dynamically patched at runtime.  This
-    # is useful for browser compat.
-    return javascript_binding_name
+    if javascript_binding_name in _dart2js_dom_custom_native_specs:
+        return _dart2js_dom_custom_native_specs[javascript_binding_name]
+    else:
+        # Make the class 'hidden' so it is dynamically patched at runtime.  This
+        # is useful for browser compat.
+        return javascript_binding_name
 
 
 def MatchSourceFilter(thing):
-  return 'WebKit' in thing.annotations or 'Dart' in thing.annotations
+    return 'WebKit' in thing.annotations or 'Dart' in thing.annotations
 
 
 class ParamInfo(object):
-  """Holder for various information about a parameter of a Dart operation.
+    """Holder for various information about a parameter of a Dart operation.
 
   Attributes:
     name: Name of parameter.
     type_id: Original type id.  None for merged types.
     is_optional: Parameter optionality.
   """
-  def __init__(self, name, type_id, is_optional):
-    self.name = name
-    self.type_id = type_id
-    self.is_optional = is_optional
 
-  def Copy(self):
-    return ParamInfo(self.name, self.type_id, self.is_optional)
+    def __init__(self, name, type_id, is_optional):
+        self.name = name
+        self.type_id = type_id
+        self.is_optional = is_optional
 
-  def __repr__(self):
-    content = 'name = %s, type_id = %s, is_optional = %s' % (
-        self.name, self.type_id, self.is_optional)
-    return '<ParamInfo(%s)>' % content
+    def Copy(self):
+        return ParamInfo(self.name, self.type_id, self.is_optional)
+
+    def __repr__(self):
+        content = 'name = %s, type_id = %s, is_optional = %s' % (
+            self.name, self.type_id, self.is_optional)
+        return '<ParamInfo(%s)>' % content
+
 
 def GetCallbackHandlers(interface):
-  callback_handlers = []
-  callback_handlers = [operation for operation in interface.operations
-      if operation.id == 'handleEvent' or operation.id == 'handleMessage']
-  if callback_handlers == []:
-    callback_handlers = [operation for operation in interface.operations
-                         if operation.id == 'handleItem']
-  return callback_handlers
+    callback_handlers = []
+    callback_handlers = [
+        operation for operation in interface.operations
+        if operation.id == 'handleEvent' or operation.id == 'handleMessage'
+    ]
+    if callback_handlers == []:
+        callback_handlers = [
+            operation for operation in interface.operations
+            if operation.id == 'handleItem'
+        ]
+    return callback_handlers
+
 
 def GetCallbackInfo(interface):
-  """For the given interface, find operations that take callbacks (for use in
+    """For the given interface, find operations that take callbacks (for use in
   auto-transforming callbacks into futures)."""
-  callback_handlers = GetCallbackHandlers(interface)
-  return AnalyzeOperation(interface, callback_handlers)
+    callback_handlers = GetCallbackHandlers(interface)
+    return AnalyzeOperation(interface, callback_handlers)
+
 
 # Given a list of overloaded arguments, render dart arguments.
 def _BuildArguments(args, interface, constructor=False):
-  def IsOptional(argument):
-    if 'Callback' in argument.ext_attrs:
-      # Optional callbacks arguments are treated as optional arguments.
-      return argument.optional
-    if constructor:
-      # FIXME: Optional constructors arguments should not be treated as
-      # optional arguments.
-      return argument.optional
-    if 'DartForceOptional' in argument.ext_attrs:
-      return True
-    return False
 
-  # Given a list of overloaded arguments, choose a suitable name.
-  def OverloadedName(args):
-    return '_OR_'.join(sorted(set(arg.id for arg in args)))
+    def IsOptional(argument):
+        if 'Callback' in argument.ext_attrs:
+            # Optional callbacks arguments are treated as optional arguments.
+            return argument.optional
+        if constructor:
+            # FIXME: Optional constructors arguments should not be treated as
+            # optional arguments.
+            return argument.optional
+        if 'DartForceOptional' in argument.ext_attrs:
+            return True
+        return False
 
-  def DartType(idl_type_name):
-    if idl_type_name in _idl_type_registry:
-      return _idl_type_registry[idl_type_name].dart_type or idl_type_name
-    return idl_type_name
+    # Given a list of overloaded arguments, choose a suitable name.
+    def OverloadedName(args):
+        return '_OR_'.join(sorted(set(arg.id for arg in args)))
 
-  # Given a list of overloaded arguments, choose a suitable type.
-  def OverloadedType(args):
-    type_ids = sorted(set(arg.type.id for arg in args))
-    if len(set(DartType(arg.type.id) for arg in args)) == 1:
-      return type_ids[0]
-    else:
-      return None
+    def DartType(idl_type_name):
+        if idl_type_name in _idl_type_registry:
+            return _idl_type_registry[idl_type_name].dart_type or idl_type_name
+        return idl_type_name
 
-  result = []
+    # Given a list of overloaded arguments, choose a suitable type.
+    def OverloadedType(args):
+        type_ids = sorted(set(arg.type.id for arg in args))
+        if len(set(DartType(arg.type.id) for arg in args)) == 1:
+            return type_ids[0]
+        else:
+            return None
 
-  is_optional = False
-  for arg_tuple in map(lambda *x: x, *args):
-    is_optional = is_optional or any(arg is None or IsOptional(arg) for arg in arg_tuple)
+    result = []
 
-    filtered = filter(None, arg_tuple)
-    type_id = OverloadedType(filtered)
-    name = OverloadedName(filtered)
-    result.append(ParamInfo(name, type_id, is_optional))
+    is_optional = False
+    for arg_tuple in map(lambda *x: x, *args):
+        is_optional = is_optional or any(
+            arg is None or IsOptional(arg) for arg in arg_tuple)
 
-  return result
+        filtered = filter(None, arg_tuple)
+        type_id = OverloadedType(filtered)
+        name = OverloadedName(filtered)
+        result.append(ParamInfo(name, type_id, is_optional))
+
+    return result
+
 
 # Argument default value is one that we suppress
 # FIXME(leafp) We may wish to eliminate this special treatment of optional
 # arguments entirely, since default values are being used more pervasively
 # in the IDL now.
 def HasSuppressedOptionalDefault(argument):
-  return (argument.default_value == 'Undefined') or argument.default_value_is_null
+    return (
+        argument.default_value == 'Undefined') or argument.default_value_is_null
+
 
 def IsOptional(argument):
-  return argument.optional and (not(HasSuppressedOptionalDefault(argument))) \
-         or 'DartForceOptional' in argument.ext_attrs
+    return argument.optional and (not(HasSuppressedOptionalDefault(argument))) \
+           or 'DartForceOptional' in argument.ext_attrs
+
 
 def AnalyzeOperation(interface, operations):
-  """Makes operation calling convention decision for a set of overloads.
+    """Makes operation calling convention decision for a set of overloads.
 
   Returns: An OperationInfo object.
   """
-  # split operations with optional args into multiple operations
-  split_operations = []
-  for operation in operations:
-    for i in range(0, len(operation.arguments)):
-      if IsOptional(operation.arguments[i]):
-        new_operation = copy.deepcopy(operation)
-        new_operation.arguments = new_operation.arguments[:i]
-        split_operations.append(new_operation)
-    split_operations.append(operation)
+    # split operations with optional args into multiple operations
+    split_operations = []
+    for operation in operations:
+        for i in range(0, len(operation.arguments)):
+            if IsOptional(operation.arguments[i]):
+                new_operation = copy.deepcopy(operation)
+                new_operation.arguments = new_operation.arguments[:i]
+                split_operations.append(new_operation)
+        split_operations.append(operation)
 
-  # Zip together arguments from each overload by position, then convert
-  # to a dart argument.
-  info = OperationInfo()
-  info.operations = operations
-  info.overloads = split_operations
-  info.declared_name = operations[0].id
-  info.name = operations[0].ext_attrs.get('DartName', info.declared_name)
-  info.constructor_name = None
-  info.js_name = info.declared_name
-  info.type_name = operations[0].type.id   # TODO: widen.
-  info.param_infos = _BuildArguments([op.arguments for op in split_operations], interface)
-  full_name = '%s.%s' % (interface.id, info.declared_name)
-  info.requires_named_arguments = full_name in _methods_with_named_formals
-  # The arguments in that the original operation took as callbacks (for
-  # conversion to futures).
-  info.callback_args = []
-  return info
+    # Zip together arguments from each overload by position, then convert
+    # to a dart argument.
+    info = OperationInfo()
+    info.operations = operations
+    info.overloads = split_operations
+    info.declared_name = operations[0].id
+    info.name = operations[0].ext_attrs.get('DartName', info.declared_name)
+    info.constructor_name = None
+    info.js_name = info.declared_name
+    info.type_name = operations[0].type.id  # TODO: widen.
+    info.param_infos = _BuildArguments(
+        [op.arguments for op in split_operations], interface)
+    full_name = '%s.%s' % (interface.id, info.declared_name)
+    info.requires_named_arguments = full_name in _methods_with_named_formals
+    # The arguments in that the original operation took as callbacks (for
+    # conversion to futures).
+    info.callback_args = []
+    return info
+
 
 def ConvertToFuture(info):
-  """Given an OperationInfo object, convert the operation's signature so that it
+    """Given an OperationInfo object, convert the operation's signature so that it
   instead uses futures instead of callbacks."""
-  new_info = copy.deepcopy(info)
-  def IsNotCallbackType(param):
-    type_id = param.type_id
-    if type_id is None:
-      return False
-    else:
-      return 'Callback' not in type_id
+    new_info = copy.deepcopy(info)
 
-  # Success callback is the first argument (change if this no longer holds).
-  new_info.callback_args = filter(
-      lambda x: not IsNotCallbackType(x), new_info.param_infos)
-  new_info.param_infos = filter(IsNotCallbackType, new_info.param_infos)
-  new_info.type_name = 'Future'
+    def IsNotCallbackType(param):
+        type_id = param.type_id
+        if type_id is None:
+            return False
+        else:
+            return 'Callback' not in type_id
 
-  return new_info
+    # Success callback is the first argument (change if this no longer holds).
+    new_info.callback_args = filter(lambda x: not IsNotCallbackType(x),
+                                    new_info.param_infos)
+    new_info.param_infos = filter(IsNotCallbackType, new_info.param_infos)
+    new_info.type_name = 'Future'
+
+    return new_info
 
 
 def AnalyzeConstructor(interface):
-  """Returns an OperationInfo object for the constructor.
+    """Returns an OperationInfo object for the constructor.
 
   Returns None if the interface has no Constructor.
   """
-  if interface.id in _suppressed_native_constructors:
-    return None
+    if interface.id in _suppressed_native_constructors:
+        return None
 
-  if 'Constructor' in interface.ext_attrs:
-    name = None
-    overloads = interface.ext_attrs['Constructor']
-    idl_args = [[] if f is None else f.arguments for f in overloads]
-  elif 'NamedConstructor' in interface.ext_attrs:
-    func_value = interface.ext_attrs.get('NamedConstructor')
-    idl_args = [func_value.arguments]
-    name = func_value.id
-  else:
-    return None
+    if 'Constructor' in interface.ext_attrs:
+        name = None
+        overloads = interface.ext_attrs['Constructor']
+        idl_args = [[] if f is None else f.arguments for f in overloads]
+    elif 'NamedConstructor' in interface.ext_attrs:
+        func_value = interface.ext_attrs.get('NamedConstructor')
+        idl_args = [func_value.arguments]
+        name = func_value.id
+    else:
+        return None
 
-  info = OperationInfo()
-  info.overloads = None
-  info.idl_args = idl_args
-  info.declared_name = name
-  info.name = name
-  info.constructor_name = ('_' if interface.id in custom_html_constructors
-      else None)
-  info.js_name = name
-  info.type_name = interface.id
-  info.param_infos = _BuildArguments(idl_args, interface, constructor=True)
-  info.requires_named_arguments = False
-  info.pure_dart_constructor = False
-  return info
+    info = OperationInfo()
+    info.overloads = None
+    info.idl_args = idl_args
+    info.declared_name = name
+    info.name = name
+    info.constructor_name = ('_' if interface.id in custom_html_constructors
+                             else None)
+    info.js_name = name
+    info.type_name = interface.id
+    info.param_infos = _BuildArguments(idl_args, interface, constructor=True)
+    info.requires_named_arguments = False
+    info.pure_dart_constructor = False
+    return info
+
 
 def IsDartListType(type):
-  return type == 'List' or type.startswith('sequence<')
+    return type == 'List' or type.startswith('sequence<')
+
 
 def IsDartCollectionType(type):
-  return IsDartListType(type)
+    return IsDartListType(type)
+
 
 def FindMatchingAttribute(interface, attr1):
-  matches = [attr2 for attr2 in interface.attributes
-             if attr1.id == attr2.id]
-  if matches:
-    assert len(matches) == 1
-    return matches[0]
-  return None
+    matches = [attr2 for attr2 in interface.attributes if attr1.id == attr2.id]
+    if matches:
+        assert len(matches) == 1
+        return matches[0]
+    return None
 
 
 def DartDomNameOfAttribute(attr):
-  """Returns the Dart name for an IDLAttribute.
+    """Returns the Dart name for an IDLAttribute.
 
   attr.id is the 'native' or JavaScript name.
 
   To ensure uniformity, work with the true IDL name until as late a possible,
   e.g. translate to the Dart name when generating Dart code.
   """
-  name = attr.id
-  name = _dart_attribute_renames.get(name, name)
-  name = attr.ext_attrs.get('DartName', None) or name
-  return name
+    name = attr.id
+    name = _dart_attribute_renames.get(name, name)
+    name = attr.ext_attrs.get('DartName', None) or name
+    return name
 
 
 def TypeOrNothing(dart_type, comment=None):
-  """Returns string for declaring something with |dart_type| in a context
+    """Returns string for declaring something with |dart_type| in a context
   where a type may be omitted.
   The string is empty or has a trailing space.
   """
-  if dart_type == 'dynamic':
-    if comment:
-      return '/*%s*/ ' % comment   # Just a comment foo(/*T*/ x)
+    if dart_type == 'dynamic':
+        if comment:
+            return '/*%s*/ ' % comment  # Just a comment foo(/*T*/ x)
+        else:
+            return ''  # foo(x) looks nicer than foo(var|dynamic x)
     else:
-      return ''                    # foo(x) looks nicer than foo(var|dynamic x)
-  else:
-    return dart_type + ' '
+        return dart_type + ' '
 
 
 def TypeOrVar(dart_type, comment=None):
-  """Returns string for declaring something with |dart_type| in a context
+    """Returns string for declaring something with |dart_type| in a context
   where if a type is omitted, 'var' must be used instead."""
-  if dart_type == 'dynamic':
-    if comment:
-      return 'var /*%s*/' % comment   # e.g.  var /*T*/ x;
+    if dart_type == 'dynamic':
+        if comment:
+            return 'var /*%s*/' % comment  # e.g.  var /*T*/ x;
+        else:
+            return 'var'  # e.g.  var x;
     else:
-      return 'var'                    # e.g.  var x;
-  else:
-    return dart_type
+        return dart_type
 
 
 class OperationInfo(object):
-  """Holder for various derived information from a set of overloaded operations.
+    """Holder for various derived information from a set of overloaded operations.
 
   Attributes:
     overloads: A list of IDL operation overloads with the same name.
@@ -626,11 +660,11 @@
         calls.
   """
 
-  def __init__(self):
-    self.factory_parameters = None
+    def __init__(self):
+        self.factory_parameters = None
 
-  def ParametersAsDecVarLists(self, rename_type, force_optional=False):
-    """ Returns a tuple (required, optional, named), where:
+    def ParametersAsDecVarLists(self, rename_type, force_optional=False):
+        """ Returns a tuple (required, optional, named), where:
       required is a list of parameter declarations corresponding to the
         required parameters
       optional is a list of parameter declarations corresponding to the
@@ -642,221 +676,255 @@
         variable in a parameter list.  That is, dec + var is a valid
         parameter declaration.
     """
-    def FormatParam(param):
-      # Is the type a typedef if so it's a union so it's dynamic.
-      # TODO(terry): This may have to change for dart2js for code shaking the
-      #              return types (unions) needs to be emitted with @create
-      #              annotations and/or with JS('type1|type2',...)
-      if hasattr(rename_type, 'im_self') and rename_type.im_self._database.HasTypeDef(param.type_id):
-        dart_type = 'dynamic'
-      else:
-        dart_type = rename_type(param.type_id) if param.type_id else 'dynamic'
-      # Special handling for setlike IDL forEach operation.
-      if dart_type is None and param.type_id.endswith('ForEachCallback'):
-        dart_type = param.type_id
-      return (TypeOrNothing(dart_type, param.type_id), param.name)
-    required = []
-    optional = []
-    for param_info in self.param_infos:
-      if param_info.is_optional:
-        optional.append(FormatParam(param_info))
-      else:
-        if optional:
-          raise Exception('Optional parameters cannot precede required ones: '
-                          + str(param_info))
-        required.append(FormatParam(param_info))
-    needs_named = optional and self.requires_named_arguments and not force_optional
-    return (required, optional, needs_named)
 
-  def ParametersAsDecStringList(self, rename_type, force_optional=False):
-    """Returns a list of strings where each string corresponds to a parameter
+        def FormatParam(param):
+            # Is the type a typedef if so it's a union so it's dynamic.
+            # TODO(terry): This may have to change for dart2js for code shaking the
+            #              return types (unions) needs to be emitted with @create
+            #              annotations and/or with JS('type1|type2',...)
+            if hasattr(rename_type,
+                       'im_self') and rename_type.im_self._database.HasTypeDef(
+                           param.type_id):
+                dart_type = 'dynamic'
+            else:
+                dart_type = rename_type(
+                    param.type_id) if param.type_id else 'dynamic'
+            # Special handling for setlike IDL forEach operation.
+            if dart_type is None and param.type_id.endswith('ForEachCallback'):
+                dart_type = param.type_id
+            return (TypeOrNothing(dart_type, param.type_id), param.name)
+
+        required = []
+        optional = []
+        for param_info in self.param_infos:
+            if param_info.is_optional:
+                optional.append(FormatParam(param_info))
+            else:
+                if optional:
+                    raise Exception(
+                        'Optional parameters cannot precede required ones: ' +
+                        str(param_info))
+                required.append(FormatParam(param_info))
+        needs_named = optional and self.requires_named_arguments and not force_optional
+        return (required, optional, needs_named)
+
+    def ParametersAsDecStringList(self, rename_type, force_optional=False):
+        """Returns a list of strings where each string corresponds to a parameter
     declaration.  All of the optional/named parameters if any will appear as
     a single entry at the end of the list.
     """
-    (required, optional, needs_named) = \
-        self.ParametersAsDecVarLists(rename_type, force_optional)
-    def FormatParam(dec):
-        return dec[0] + dec[1]
-    argtexts = map(FormatParam, required)
-    if optional:
-      left_bracket, right_bracket = '{}' if needs_named else '[]'
-      argtexts.append(
-          left_bracket +
-          ', '.join(map(FormatParam, optional)) +
-          right_bracket)
-    return argtexts
+        (required, optional, needs_named) = \
+            self.ParametersAsDecVarLists(rename_type, force_optional)
 
-  def ParametersAsDeclaration(self, rename_type, force_optional=False):
-    p_list = self.ParametersAsDecStringList(rename_type, force_optional)
-    return ', '.join(p_list)
+        def FormatParam(dec):
+            return dec[0] + dec[1]
 
-  def NumberOfRequiredInDart(self):
-    """ Returns a number of required arguments in Dart declaration of
+        argtexts = map(FormatParam, required)
+        if optional:
+            left_bracket, right_bracket = '{}' if needs_named else '[]'
+            argtexts.append(left_bracket +
+                            ', '.join(map(FormatParam, optional)) +
+                            right_bracket)
+        return argtexts
+
+    def ParametersAsDeclaration(self, rename_type, force_optional=False):
+        p_list = self.ParametersAsDecStringList(rename_type, force_optional)
+        return ', '.join(p_list)
+
+    def NumberOfRequiredInDart(self):
+        """ Returns a number of required arguments in Dart declaration of
     the operation.
     """
-    return len(filter(lambda i: not i.is_optional, self.param_infos))
+        return len(filter(lambda i: not i.is_optional, self.param_infos))
 
-  def ParametersAsArgumentList(self, parameter_count=None, ignore_named_parameters=False):
-    """Returns a string of the parameter names suitable for passing the
+    def ParametersAsArgumentList(self,
+                                 parameter_count=None,
+                                 ignore_named_parameters=False):
+        """Returns a string of the parameter names suitable for passing the
     parameters as arguments.
     """
-    def param_name(param_info):
-      if self.requires_named_arguments and param_info.is_optional and not ignore_named_parameters:
-        return '%s : %s' % (param_info.name, param_info.name)
-      else:
-        return param_info.name
 
-    if parameter_count is None:
-      parameter_count = len(self.param_infos)
-    return ', '.join(map(param_name, self.param_infos[:parameter_count]))
+        def param_name(param_info):
+            if self.requires_named_arguments and param_info.is_optional and not ignore_named_parameters:
+                return '%s : %s' % (param_info.name, param_info.name)
+            else:
+                return param_info.name
 
-  """ Check if a parameter to a Future API is a Dictionary argument and if its optional.
+        if parameter_count is None:
+            parameter_count = len(self.param_infos)
+        return ', '.join(map(param_name, self.param_infos[:parameter_count]))
+
+    """ Check if a parameter to a Future API is a Dictionary argument and if its optional.
       Used for any Promised based operation to correctly convert from Map to Dictionary then
       perform the PromiseToFuture call.
   """
-  def dictionaryArgumentName(self, parameter_count=None):
-      parameter_count = len(self.param_infos)
-      for argument in self.param_infos[:parameter_count]:
-        if argument.type_id == 'Dictionary':
-          return [argument.name, argument.is_optional]
-      return None
 
-  def isCallback(self, type_registry, type_id):
-    if type_id and not type_id.endswith('[]'):
-      callback_type = type_registry._database._all_interfaces[type_id]
-      return callback_type.operations[0].id == 'handleEvent' if len(callback_type.operations) > 0 else False
-    else:
-      return False
+    def dictionaryArgumentName(self, parameter_count=None):
+        parameter_count = len(self.param_infos)
+        for argument in self.param_infos[:parameter_count]:
+            if argument.type_id == 'Dictionary':
+                return [argument.name, argument.is_optional]
+        return None
 
-  def ParametersAsListOfVariables(self, parameter_count=None, type_registry=None, dart_js_interop=False, backend = None):
-    """Returns a list of the first parameter_count parameter names
+    def isCallback(self, type_registry, type_id):
+        if type_id and not type_id.endswith('[]'):
+            callback_type = type_registry._database._all_interfaces[type_id]
+            return callback_type.operations[0].id == 'handleEvent' if len(
+                callback_type.operations) > 0 else False
+        else:
+            return False
+
+    def ParametersAsListOfVariables(self,
+                                    parameter_count=None,
+                                    type_registry=None,
+                                    dart_js_interop=False,
+                                    backend=None):
+        """Returns a list of the first parameter_count parameter names
     as raw variables.
     """
-    isRemoveOperation = self.name == 'removeEventListener' or self.name == 'removeListener'
+        isRemoveOperation = self.name == 'removeEventListener' or self.name == 'removeListener'
 
-    if parameter_count is None:
-      parameter_count = len(self.param_infos)
-    if not type_registry:
-      return [p.name for p in self.param_infos[:parameter_count]]
-    else:
-      parameters = []
-      for p in self.param_infos[:parameter_count]:
-        type_id = p.type_id
-        # Unwrap the type to get the JsObject if Type is:
-        #
-        #    - type_id is None then it's probably a union type or overloaded
-        #      it's a dynamic/any type
-        #    - type is Object
-        #
-        if (wrap_unwrap_type_blink(type_id, type_registry)):
-          type_is_callback = self.isCallback(type_registry, type_id)
-          if (dart_js_interop and type_id == 'EventListener' and
-              self.name in ['addEventListener', 'removeEventListener']):
-              # Events fired need use a JSFunction not a anonymous closure to
-              # insure the event can really be removed.
-              parameters.append('js.allowInterop(%s)' % p.name)
-          elif dart_js_interop and type_is_callback and not(isRemoveOperation):
-            # Any remove operation that has a a callback doesn't need wrapping.
-            # TODO(terry): Kind of hacky but handles all the cases we care about
-            callback_type = type_registry._database._all_interfaces[type_id]
-            callback_args_decl = []
-            callback_args_call = []
-            for callback_arg in callback_type.operations[0].arguments:
-              if dart_js_interop:
-                dart_type = '' # For non-primitives we will be passing JsObject for non-primitives, so ignore types
-              else:
-                dart_type = type_registry.DartType(callback_arg.type.id) + ' '
-              callback_args_decl.append('%s%s' % (dart_type, callback_arg.id))
-              if wrap_unwrap_type_blink(callback_arg.type.id, type_registry):
-                callback_args_call.append(callback_arg.id)
-              else:
-                callback_args_call.append(callback_arg.id)
-            parameters.append('(%s) => %s(%s)' %
-                              (", ".join(callback_args_decl),
-                              p.name,
-                              ", ".join(callback_args_call)))
-          else:
-            parameters.append(p.name)
+        if parameter_count is None:
+            parameter_count = len(self.param_infos)
+        if not type_registry:
+            return [p.name for p in self.param_infos[:parameter_count]]
         else:
-          if dart_js_interop:
-            conversion = backend._InputConversion(p.type_id, self.declared_name)
-            passParam = p.name
-            if conversion:
-              # Need to pass the IDL Dictionary from Dart Map to JavaScript object.
-              passParam = '{0}({1})'.format(conversion.function_name, p.name)
-          else:
-            passParam = p.name
-          parameters.append(passParam)
+            parameters = []
+            for p in self.param_infos[:parameter_count]:
+                type_id = p.type_id
+                # Unwrap the type to get the JsObject if Type is:
+                #
+                #    - type_id is None then it's probably a union type or overloaded
+                #      it's a dynamic/any type
+                #    - type is Object
+                #
+                if (wrap_unwrap_type_blink(type_id, type_registry)):
+                    type_is_callback = self.isCallback(type_registry, type_id)
+                    if (dart_js_interop and type_id == 'EventListener' and
+                            self.name in [
+                                'addEventListener', 'removeEventListener'
+                            ]):
+                        # Events fired need use a JSFunction not a anonymous closure to
+                        # insure the event can really be removed.
+                        parameters.append('js.allowInterop(%s)' % p.name)
+                    elif dart_js_interop and type_is_callback and not (
+                            isRemoveOperation):
+                        # Any remove operation that has a a callback doesn't need wrapping.
+                        # TODO(terry): Kind of hacky but handles all the cases we care about
+                        callback_type = type_registry._database._all_interfaces[
+                            type_id]
+                        callback_args_decl = []
+                        callback_args_call = []
+                        for callback_arg in callback_type.operations[
+                                0].arguments:
+                            if dart_js_interop:
+                                dart_type = ''  # For non-primitives we will be passing JsObject for non-primitives, so ignore types
+                            else:
+                                dart_type = type_registry.DartType(
+                                    callback_arg.type.id) + ' '
+                            callback_args_decl.append(
+                                '%s%s' % (dart_type, callback_arg.id))
+                            if wrap_unwrap_type_blink(callback_arg.type.id,
+                                                      type_registry):
+                                callback_args_call.append(callback_arg.id)
+                            else:
+                                callback_args_call.append(callback_arg.id)
+                        parameters.append(
+                            '(%s) => %s(%s)' % (", ".join(callback_args_decl),
+                                                p.name,
+                                                ", ".join(callback_args_call)))
+                    else:
+                        parameters.append(p.name)
+                else:
+                    if dart_js_interop:
+                        conversion = backend._InputConversion(
+                            p.type_id, self.declared_name)
+                        passParam = p.name
+                        if conversion:
+                            # Need to pass the IDL Dictionary from Dart Map to JavaScript object.
+                            passParam = '{0}({1})'.format(
+                                conversion.function_name, p.name)
+                    else:
+                        passParam = p.name
+                    parameters.append(passParam)
 
-      return parameters
+            return parameters
 
-  def ParametersAsStringOfVariables(self, parameter_count=None):
-    """Returns a string containing the first parameter_count parameter names
+    def ParametersAsStringOfVariables(self, parameter_count=None):
+        """Returns a string containing the first parameter_count parameter names
     as raw variables, comma separated.
     """
-    return ', '.join(self.ParametersAsListOfVariables(parameter_count))
+        return ', '.join(self.ParametersAsListOfVariables(parameter_count))
 
-  def IsStatic(self):
-    is_static = self.overloads[0].is_static
-    assert any([is_static == o.is_static for o in self.overloads])
-    return is_static
+    def IsStatic(self):
+        is_static = self.overloads[0].is_static
+        assert any([is_static == o.is_static for o in self.overloads])
+        return is_static
 
-  def _ConstructorFullName(self, rename_type):
-    if self.constructor_name:
-      return rename_type(self.type_name) + '.' + self.constructor_name
-    else:
-      # TODO(antonm): temporary ugly hack.
-      # While in transition phase we allow both DOM's ArrayBuffer
-      # and dart:typed_data's ByteBuffer for IDLs' ArrayBuffers,
-      # hence ArrayBuffer is mapped to dynamic in arguments and return
-      # values.  To compensate for that when generating ArrayBuffer itself,
-      # we need to lie a bit:
-      if self.type_name == 'ArrayBuffer': return 'ByteBuffer'
-      return rename_type(self.type_name)
+    def _ConstructorFullName(self, rename_type):
+        if self.constructor_name:
+            return rename_type(self.type_name) + '.' + self.constructor_name
+        else:
+            # TODO(antonm): temporary ugly hack.
+            # While in transition phase we allow both DOM's ArrayBuffer
+            # and dart:typed_data's ByteBuffer for IDLs' ArrayBuffers,
+            # hence ArrayBuffer is mapped to dynamic in arguments and return
+            # values.  To compensate for that when generating ArrayBuffer itself,
+            # we need to lie a bit:
+            if self.type_name == 'ArrayBuffer': return 'ByteBuffer'
+            return rename_type(self.type_name)
+
 
 def ConstantOutputOrder(a, b):
-  """Canonical output ordering for constants."""
-  return cmp(a.id, b.id)
+    """Canonical output ordering for constants."""
+    return cmp(a.id, b.id)
 
 
 def _FormatNameList(names):
-  """Returns JavaScript array literal expression with one name per line."""
-  #names = sorted(names)
-  if len(names) <= 1:
-    expression_string = str(names)  # e.g.  ['length']
-  else:
-    expression_string = ',\n   '.join(str(names).split(','))
-    expression_string = expression_string.replace('[', '[\n    ')
-  return expression_string
+    """Returns JavaScript array literal expression with one name per line."""
+    #names = sorted(names)
+    if len(names) <= 1:
+        expression_string = str(names)  # e.g.  ['length']
+    else:
+        expression_string = ',\n   '.join(str(names).split(','))
+        expression_string = expression_string.replace('[', '[\n    ')
+    return expression_string
 
 
 def IndentText(text, indent):
-  """Format lines of text with indent."""
-  def FormatLine(line):
-    if line.strip():
-      return '%s%s\n' % (indent, line)
-    else:
-      return '\n'
-  return ''.join(FormatLine(line) for line in text.split('\n'))
+    """Format lines of text with indent."""
+
+    def FormatLine(line):
+        if line.strip():
+            return '%s%s\n' % (indent, line)
+        else:
+            return '\n'
+
+    return ''.join(FormatLine(line) for line in text.split('\n'))
+
 
 # Given a sorted sequence of type identifiers, return an appropriate type
 # name
 def TypeName(type_ids, interface):
-  # Dynamically type this field for now.
-  return 'dynamic'
+    # Dynamically type this field for now.
+    return 'dynamic'
+
 
 # ------------------------------------------------------------------------------
 
+
 class Conversion(object):
-  """Represents a way of converting between types."""
-  def __init__(self, name, input_type, output_type):
-    # input_type is the type of the API input (and the argument type of the
-    # conversion function)
-    # output_type is the type of the API output (and the result type of the
-    # conversion function)
-    self.function_name = name
-    self.input_type = input_type
-    self.output_type = output_type
+    """Represents a way of converting between types."""
+
+    def __init__(self, name, input_type, output_type):
+        # input_type is the type of the API input (and the argument type of the
+        # conversion function)
+        # output_type is the type of the API output (and the result type of the
+        # conversion function)
+        self.function_name = name
+        self.input_type = input_type
+        self.output_type = output_type
+
 
 #  "TYPE DIRECTION INTERFACE.MEMBER" -> conversion
 #     Specific member of interface
@@ -870,930 +938,1179 @@
 #
 
 _serialize_SSV = Conversion('convertDartToNative_SerializedScriptValue',
-                           'dynamic', 'dynamic')
+                            'dynamic', 'dynamic')
 
-dart2js_conversions = monitored.Dict('generator.dart2js_conversions', {
-    # Used to convert Dart function to a JS callback typedef (old style).
-    'Callback set': Conversion('convertDartClosureToJS', 'dynamic', 'dynamic'),
-    'Date get':
-      Conversion('convertNativeToDart_DateTime', 'dynamic', 'DateTime'),
-    'Date set':
-      Conversion('convertDartToNative_DateTime', 'DateTime', 'dynamic'),
-    # Wrap non-local Windows.  We need to check EventTarget (the base type)
-    # as well.  Note, there are no functions that take a non-local Window
-    # as a parameter / setter.
-    'Window get':
-      Conversion('_convertNativeToDart_Window', 'dynamic', 'WindowBase'),
-    'EventTarget get':
-      Conversion('_convertNativeToDart_EventTarget', 'dynamic',
-                 'EventTarget'),
-    'EventTarget set':
-      Conversion('_convertDartToNative_EventTarget', 'EventTarget',
-                 'dynamic'),
+dart2js_conversions = monitored.Dict(
+    'generator.dart2js_conversions',
+    {
+        # Used to convert Dart function to a JS callback typedef (old style).
+        'Callback set':
+        Conversion('convertDartClosureToJS', 'dynamic', 'dynamic'),
+        'Date get':
+        Conversion('convertNativeToDart_DateTime', 'dynamic', 'DateTime'),
+        'Date set':
+        Conversion('convertDartToNative_DateTime', 'DateTime', 'dynamic'),
+        # Wrap non-local Windows.  We need to check EventTarget (the base type)
+        # as well.  Note, there are no functions that take a non-local Window
+        # as a parameter / setter.
+        'Window get':
+        Conversion('_convertNativeToDart_Window', 'dynamic', 'WindowBase'),
+        'EventTarget get':
+        Conversion('_convertNativeToDart_EventTarget', 'dynamic',
+                   'EventTarget'),
+        'EventTarget set':
+        Conversion('_convertDartToNative_EventTarget', 'EventTarget',
+                   'dynamic'),
+        'WebGLContextAttributes get':
+        Conversion('convertNativeToDart_ContextAttributes', 'dynamic',
+                   'ContextAttributes'),
+        'ImageData get':
+        Conversion('convertNativeToDart_ImageData', 'dynamic', 'ImageData'),
+        'ImageData set':
+        Conversion('convertDartToNative_ImageData', 'ImageData', 'dynamic'),
+        'Dictionary get':
+        Conversion('convertNativeToDart_Dictionary', 'dynamic', 'Map'),
+        'Dictionary set':
+        Conversion('convertDartToNative_Dictionary', 'Map', 'dynamic'),
+        'sequence<DOMString> set':
+        Conversion('convertDartToNative_StringArray', 'List<String>', 'List'),
+        'any set IDBObjectStore.add':
+        _serialize_SSV,
+        'any set IDBObjectStore.put':
+        _serialize_SSV,
+        'any set IDBCursor.update':
+        _serialize_SSV,
+        'any get SQLResultSetRowList.item':
+        Conversion('convertNativeToDart_Dictionary', 'dynamic', 'Map'),
 
-    'WebGLContextAttributes get':
-      Conversion('convertNativeToDart_ContextAttributes', 'dynamic',
-                 'ContextAttributes'),
+        # postMessage
+        'SerializedScriptValue set':
+        _serialize_SSV,
+        'any set CompositorWorkerGlobalScope.postMessage':
+        _serialize_SSV,
+        'any set DedicatedWorkerGlobalScope.postMessage':
+        _serialize_SSV,
+        'any set MessagePort.postMessage':
+        _serialize_SSV,
+        'any set Window.postMessage':
+        _serialize_SSV,
+        'any set _DOMWindowCrossFrame.postMessage':
+        _serialize_SSV,
+        'any set Worker.postMessage':
+        _serialize_SSV,
+        'any set ServiceWorker.postMessage':
+        _serialize_SSV,
+        '* get CustomEvent.detail':
+        Conversion('convertNativeToDart_SerializedScriptValue', 'dynamic',
+                   'dynamic'),
 
-    'ImageData get':
-      Conversion('convertNativeToDart_ImageData', 'dynamic', 'ImageData'),
-    'ImageData set':
-      Conversion('convertDartToNative_ImageData', 'ImageData', 'dynamic'),
+        # receiving message via MessageEvent
+        '* get MessageEvent.data':
+        Conversion('convertNativeToDart_SerializedScriptValue', 'dynamic',
+                   'dynamic'),
 
-    'Dictionary get':
-      Conversion('convertNativeToDart_Dictionary', 'dynamic', 'Map'),
-    'Dictionary set':
-      Conversion('convertDartToNative_Dictionary', 'Map', 'dynamic'),
+        # TODO(alanknight): This generates two variations for dart2js, because of
+        # the optional argument, but not in Dartium. Should do the same for both.
+        'any set History.pushState':
+        _serialize_SSV,
+        'any set History.replaceState':
+        _serialize_SSV,
+        '* get History.state':
+        Conversion('convertNativeToDart_SerializedScriptValue', 'dynamic',
+                   'dynamic'),
+        '* get PopStateEvent.state':
+        Conversion('convertNativeToDart_SerializedScriptValue', 'dynamic',
+                   'dynamic'),
 
-    'sequence<DOMString> set':
-      Conversion('convertDartToNative_StringArray', 'List<String>', 'List'),
+        # IDBAny is problematic.  Some uses are just a union of other IDB types,
+        # which need no conversion..  Others include data values which require
+        # serialized script value processing.
+        '* get IDBCursorWithValue.value':
+        Conversion('_convertNativeToDart_IDBAny', 'dynamic', 'dynamic'),
 
-    'any set IDBObjectStore.add': _serialize_SSV,
-    'any set IDBObjectStore.put': _serialize_SSV,
-    'any set IDBCursor.update': _serialize_SSV,
+        # This is problematic.  The result property of IDBRequest is used for
+        # all requests.  Read requests like IDBDataStore.getObject need
+        # conversion, but other requests like opening a database return
+        # something that does not need conversion.
+        '* get IDBRequest.result':
+        Conversion('_convertNativeToDart_IDBAny', 'dynamic', 'dynamic'),
 
-    'any get SQLResultSetRowList.item' :
-      Conversion('convertNativeToDart_Dictionary', 'dynamic', 'Map'),
+        # "source: On getting, returns the IDBObjectStore or IDBIndex that the
+        # cursor is iterating. ...".  So we should not try to convert it.
+        '* get IDBCursor.source':
+        None,
 
-    # postMessage
-    'SerializedScriptValue set': _serialize_SSV,
-    'any set CompositorWorkerGlobalScope.postMessage': _serialize_SSV,
-    'any set DedicatedWorkerGlobalScope.postMessage': _serialize_SSV,
-    'any set MessagePort.postMessage': _serialize_SSV,
-    'any set Window.postMessage': _serialize_SSV,
-    'any set _DOMWindowCrossFrame.postMessage': _serialize_SSV,
-    'any set Worker.postMessage': _serialize_SSV,
-    'any set ServiceWorker.postMessage': _serialize_SSV,
+        # Should be either a DOMString, an Array of DOMStrings or null.
+        '* get IDBObjectStore.keyPath':
+        None,
+        '* get XMLHttpRequest.response':
+        Conversion('_convertNativeToDart_XHR_Response', 'dynamic', 'dynamic'),
+    },
+    dart2jsOnly=True)
 
-    '* get CustomEvent.detail':
-      Conversion('convertNativeToDart_SerializedScriptValue',
-                 'dynamic', 'dynamic'),
-
-    # receiving message via MessageEvent
-    '* get MessageEvent.data':
-      Conversion('convertNativeToDart_SerializedScriptValue',
-                 'dynamic', 'dynamic'),
-
-    # TODO(alanknight): This generates two variations for dart2js, because of
-    # the optional argument, but not in Dartium. Should do the same for both.
-    'any set History.pushState': _serialize_SSV,
-
-    'any set History.replaceState': _serialize_SSV,
-
-    '* get History.state':
-      Conversion('convertNativeToDart_SerializedScriptValue',
-                 'dynamic', 'dynamic'),
-
-    '* get PopStateEvent.state':
-      Conversion('convertNativeToDart_SerializedScriptValue',
-                 'dynamic', 'dynamic'),
-
-    # IDBAny is problematic.  Some uses are just a union of other IDB types,
-    # which need no conversion..  Others include data values which require
-    # serialized script value processing.
-    '* get IDBCursorWithValue.value':
-      Conversion('_convertNativeToDart_IDBAny', 'dynamic', 'dynamic'),
-
-    # This is problematic.  The result property of IDBRequest is used for
-    # all requests.  Read requests like IDBDataStore.getObject need
-    # conversion, but other requests like opening a database return
-    # something that does not need conversion.
-    '* get IDBRequest.result':
-      Conversion('_convertNativeToDart_IDBAny', 'dynamic', 'dynamic'),
-
-    # "source: On getting, returns the IDBObjectStore or IDBIndex that the
-    # cursor is iterating. ...".  So we should not try to convert it.
-    '* get IDBCursor.source': None,
-
-    # Should be either a DOMString, an Array of DOMStrings or null.
-    '* get IDBObjectStore.keyPath': None,
-
-    '* get XMLHttpRequest.response':
-      Conversion('_convertNativeToDart_XHR_Response',
-                 'dynamic', 'dynamic'),
-}, dart2jsOnly=True)
 
 def FindConversion(idl_type, direction, interface, member):
-  table = dart2js_conversions
-  return (table.get('%s %s %s.%s' % (idl_type, direction, interface, member)) or
-          table.get('* %s %s.%s' % (direction, interface, member)) or
-          table.get('%s %s %s.*' % (idl_type, direction, interface)) or
-          table.get('%s %s' % (idl_type, direction)))
-  return None
+    table = dart2js_conversions
+    return (table.get('%s %s %s.%s' % (idl_type, direction, interface, member))
+            or table.get('* %s %s.%s' % (direction, interface, member)) or
+            table.get('%s %s %s.*' % (idl_type, direction, interface)) or
+            table.get('%s %s' % (idl_type, direction)))
+    return None
 
 
 # ------------------------------------------------------------------------------
 
+
 class IDLTypeInfo(object):
-  def __init__(self, idl_type, data):
-    self._idl_type = idl_type
-    self._data = data
 
-  def idl_type(self):
-    return self._idl_type
+    def __init__(self, idl_type, data):
+        self._idl_type = idl_type
+        self._data = data
 
-  def dart_type(self):
-    return self._data.dart_type or self._idl_type
+    def idl_type(self):
+        return self._idl_type
 
-  def narrow_dart_type(self):
-    return self.dart_type()
+    def dart_type(self):
+        return self._data.dart_type or self._idl_type
 
-  def interface_name(self):
-    raise NotImplementedError()
+    def narrow_dart_type(self):
+        return self.dart_type()
 
-  def implementation_name(self):
-    raise NotImplementedError()
+    def interface_name(self):
+        raise NotImplementedError()
 
-  def has_generated_interface(self):
-    raise NotImplementedError()
+    def implementation_name(self):
+        raise NotImplementedError()
 
-  def list_item_type(self):
-    raise NotImplementedError()
+    def has_generated_interface(self):
+        raise NotImplementedError()
 
-  def merged_interface(self):
-    return None
+    def list_item_type(self):
+        raise NotImplementedError()
 
-  def merged_into(self):
-    return None
+    def merged_interface(self):
+        return None
 
-  def native_type(self):
-    return self._data.native_type or self._idl_type
+    def merged_into(self):
+        return None
 
-  def bindings_class(self):
-    return 'Dart%s' % self.idl_type()
+    def native_type(self):
+        return self._data.native_type or self._idl_type
 
-  def vector_to_dart_template_parameter(self):
-    return self.native_type()
+    def bindings_class(self):
+        return 'Dart%s' % self.idl_type()
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    cls = self.bindings_class()
+    def vector_to_dart_template_parameter(self):
+        return self.native_type()
 
-    if 'Callback' in idl_node.ext_attrs:
-      return '%s.release()', 'OwnPtr<%s>' % self.native_type(), cls, 'create'
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        cls = self.bindings_class()
 
-    # This is a hack to handle property references correctly.
-    if (self.native_type() in ['SVGPropertyTearOff<SVGAngle>',
-          'SVGPropertyTearOff<SVGAngle>*', 'SVGMatrixTearOff']
-        and (callback_name != 'createSVGTransformFromMatrixCallback'
-          or interface_name != 'SVGTransformList')):
-      argument_expression_template = '%s->propertyReference()'
-      type = '%s*' % self.native_type()
-    elif self.custom_to_native():
-      type = 'RefPtr<%s>' % self.native_type()
-      argument_expression_template = '%s.get()'
-    else:
-      type = '%s*' % self.native_type()
-      argument_expression_template = '%s'
-    return argument_expression_template, type, cls, 'toNative'
+        if 'Callback' in idl_node.ext_attrs:
+            return '%s.release()', 'OwnPtr<%s>' % self.native_type(
+            ), cls, 'create'
 
-  def pass_native_by_ref(self): return False
+        # This is a hack to handle property references correctly.
+        if (self.native_type() in [
+                'SVGPropertyTearOff<SVGAngle>', 'SVGPropertyTearOff<SVGAngle>*',
+                'SVGMatrixTearOff'
+        ] and (callback_name != 'createSVGTransformFromMatrixCallback' or
+               interface_name != 'SVGTransformList')):
+            argument_expression_template = '%s->propertyReference()'
+            type = '%s*' % self.native_type()
+        elif self.custom_to_native():
+            type = 'RefPtr<%s>' % self.native_type()
+            argument_expression_template = '%s.get()'
+        else:
+            type = '%s*' % self.native_type()
+            argument_expression_template = '%s'
+        return argument_expression_template, type, cls, 'toNative'
 
-  def custom_to_native(self):
-    return self._data.custom_to_native
+    def pass_native_by_ref(self):
+        return False
 
-  def parameter_type(self):
-    return '%s*' % self.native_type()
+    def custom_to_native(self):
+        return self._data.custom_to_native
 
-  def webcore_includes(self):
-    WTF_INCLUDES = [
-        'ArrayBuffer',
-        'ArrayBufferView',
-        'Float32Array',
-        'Float64Array',
-        'Int8Array',
-        'Int16Array',
-        'Int32Array',
-        'Uint8Array',
-        'Uint8ClampedArray',
-        'Uint16Array',
-        'Uint32Array',
-    ]
+    def parameter_type(self):
+        return '%s*' % self.native_type()
 
-    if self._idl_type in WTF_INCLUDES:
-      return ['<wtf/%s.h>' % self.native_type()]
+    def webcore_includes(self):
+        WTF_INCLUDES = [
+            'ArrayBuffer',
+            'ArrayBufferView',
+            'Float32Array',
+            'Float64Array',
+            'Int8Array',
+            'Int16Array',
+            'Int32Array',
+            'Uint8Array',
+            'Uint8ClampedArray',
+            'Uint16Array',
+            'Uint32Array',
+        ]
 
-    # TODO(vsm): Why does this need special casing?
-    if self._idl_type == 'AnalyserNode':
-      return ['"AnalyserNode.h"', '<wtf/Uint8Array.h>']
+        if self._idl_type in WTF_INCLUDES:
+            return ['<wtf/%s.h>' % self.native_type()]
 
-    if not self._idl_type.startswith('SVG'):
-      return ['"%s.h"' % self.native_type()]
+        # TODO(vsm): Why does this need special casing?
+        if self._idl_type == 'AnalyserNode':
+            return ['"AnalyserNode.h"', '<wtf/Uint8Array.h>']
 
-    include = self._idl_type
-    return ['"%s.h"' % include] + _svg_supplemental_includes
+        if not self._idl_type.startswith('SVG'):
+            return ['"%s.h"' % self.native_type()]
 
-  def receiver(self):
-    return 'receiver->'
+        include = self._idl_type
+        return ['"%s.h"' % include] + _svg_supplemental_includes
 
-  def conversion_includes(self):
-    includes = [self._idl_type] + (self._data.conversion_includes or [])
-    return ['"Dart%s.h"' % include for include in includes]
+    def receiver(self):
+        return 'receiver->'
 
-  def to_dart_conversion(self, value, interface_name=None, attributes=None):
-    return 'Dart%s::toDart(%s)' % (self._idl_type, value)
+    def conversion_includes(self):
+        includes = [self._idl_type] + (self._data.conversion_includes or [])
+        return ['"Dart%s.h"' % include for include in includes]
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup,
-                                interface_name=None, attributes=None):
-    auto_dart_scope='true' if auto_dart_scope_setup else 'false'
-    return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
-                                                   ReturnValueConversionHack(self._idl_type, value, interface_name),
-                                                   auto_dart_scope)
+    def to_dart_conversion(self, value, interface_name=None, attributes=None):
+        return 'Dart%s::toDart(%s)' % (self._idl_type, value)
 
-  def custom_to_dart(self):
-    return self._data.custom_to_dart
+    def return_to_dart_conversion(self,
+                                  value,
+                                  auto_dart_scope_setup,
+                                  interface_name=None,
+                                  attributes=None):
+        auto_dart_scope = 'true' if auto_dart_scope_setup else 'false'
+        return 'Dart%s::returnToDart(args, %s, %s)' % (
+            self._idl_type,
+            ReturnValueConversionHack(self._idl_type, value,
+                                      interface_name), auto_dart_scope)
+
+    def custom_to_dart(self):
+        return self._data.custom_to_dart
 
 
 class InterfaceIDLTypeInfo(IDLTypeInfo):
-  def __init__(self, idl_type, data, dart_interface_name, type_registry):
-    super(InterfaceIDLTypeInfo, self).__init__(idl_type, data)
-    self._dart_interface_name = dart_interface_name
-    self._type_registry = type_registry
 
-  def dart_type(self):
-    if self._data.dart_type:
-      return self._data.dart_type
-    if self.list_item_type() and not self.has_generated_interface():
-      return 'List<%s>' % self._type_registry.TypeInfo(self._data.item_type).dart_type()
-    return self._dart_interface_name
+    def __init__(self, idl_type, data, dart_interface_name, type_registry):
+        super(InterfaceIDLTypeInfo, self).__init__(idl_type, data)
+        self._dart_interface_name = dart_interface_name
+        self._type_registry = type_registry
 
-  def narrow_dart_type(self):
-    if self.list_item_type():
-      return self.implementation_name()
-    # TODO(podivilov): only primitive and collection types should override
-    # dart_type.
-    if self._data.dart_type != None:
-      return self.dart_type()
-    if IsPureInterface(self.idl_type(), self._type_registry._database):
-      return self.idl_type()
-    return self.interface_name()
+    def dart_type(self):
+        if self._data.dart_type:
+            return self._data.dart_type
+        if self.list_item_type() and not self.has_generated_interface():
+            return 'List<%s>' % self._type_registry.TypeInfo(
+                self._data.item_type).dart_type()
+        return self._dart_interface_name
 
-  def interface_name(self):
-    return self._dart_interface_name
+    def narrow_dart_type(self):
+        if self.list_item_type():
+            return self.implementation_name()
+        # TODO(podivilov): only primitive and collection types should override
+        # dart_type.
+        if self._data.dart_type != None:
+            return self.dart_type()
+        if IsPureInterface(self.idl_type(), self._type_registry._database):
+            return self.idl_type()
+        return self.interface_name()
 
-  def implementation_name(self):
-    implementation_name = self._dart_interface_name
+    def interface_name(self):
+        return self._dart_interface_name
 
-    if not self.has_generated_interface():
-      implementation_name = '_%s' % implementation_name
+    def implementation_name(self):
+        implementation_name = self._dart_interface_name
 
-    return implementation_name
+        if not self.has_generated_interface():
+            implementation_name = '_%s' % implementation_name
 
-  def native_type(self):
-    database = self._type_registry._database
+        return implementation_name
 
-    if database.HasInterface(self.idl_type()):
-      interface = database.GetInterface(self.idl_type())
-      if 'ImplementedAs' in interface.ext_attrs:
-        return interface.ext_attrs['ImplementedAs']
-    return super(InterfaceIDLTypeInfo, self).native_type()
+    def native_type(self):
+        database = self._type_registry._database
 
-  def has_generated_interface(self):
-    return not self._data.suppress_interface
+        if database.HasInterface(self.idl_type()):
+            interface = database.GetInterface(self.idl_type())
+            if 'ImplementedAs' in interface.ext_attrs:
+                return interface.ext_attrs['ImplementedAs']
+        return super(InterfaceIDLTypeInfo, self).native_type()
 
-  def list_item_type(self):
-    return self._data.item_type
+    def has_generated_interface(self):
+        return not self._data.suppress_interface
 
-  def list_item_type_nullable(self):
-    return self._data.item_type_nullable
+    def list_item_type(self):
+        return self._data.item_type
 
-  def merged_interface(self):
-    # All constants, attributes, and operations of merged interface should be
-    # added to this interface. Merged idl interface does not have corresponding
-    # Dart generated interface, and all references to merged idl interface
-    # (e.g. parameter types, return types, parent interfaces) should be replaced
-    # with this interface. There are two important restrictions:
-    # 1) Merged and target interfaces shouldn't have common members, otherwise
-    # there would be duplicated declarations in generated Dart code.
-    # 2) Merged interface should be direct child of target interface, so the
-    # children of merged interface are not affected by the merge.
-    # As a consequence, target interface implementation and its direct children
-    # interface implementations should implement merged attribute accessors and
-    # operations. For example, SVGElement and Element implementation classes
-    # should implement HTMLElement.insertAdjacentElement(),
-    # HTMLElement.innerHTML, etc.
-    return self._data.merged_interface
+    def list_item_type_nullable(self):
+        return self._data.item_type_nullable
 
-  def merged_into(self):
-    return self._data.merged_into
+    def merged_interface(self):
+        # All constants, attributes, and operations of merged interface should be
+        # added to this interface. Merged idl interface does not have corresponding
+        # Dart generated interface, and all references to merged idl interface
+        # (e.g. parameter types, return types, parent interfaces) should be replaced
+        # with this interface. There are two important restrictions:
+        # 1) Merged and target interfaces shouldn't have common members, otherwise
+        # there would be duplicated declarations in generated Dart code.
+        # 2) Merged interface should be direct child of target interface, so the
+        # children of merged interface are not affected by the merge.
+        # As a consequence, target interface implementation and its direct children
+        # interface implementations should implement merged attribute accessors and
+        # operations. For example, SVGElement and Element implementation classes
+        # should implement HTMLElement.insertAdjacentElement(),
+        # HTMLElement.innerHTML, etc.
+        return self._data.merged_interface
+
+    def merged_into(self):
+        return self._data.merged_into
 
 
 class CallbackIDLTypeInfo(IDLTypeInfo):
-  def __init__(self, idl_type, data):
-    super(CallbackIDLTypeInfo, self).__init__(idl_type, data)
 
-  def interface_name(self):
-    return self.dart_type()
+    def __init__(self, idl_type, data):
+        super(CallbackIDLTypeInfo, self).__init__(idl_type, data)
 
-  def implementation_name(self):
-    return self.dart_type()
+    def interface_name(self):
+        return self.dart_type()
 
-  def list_item_type(self):
-    return self._data.item_type
+    def implementation_name(self):
+        return self.dart_type()
+
+    def list_item_type(self):
+        return self._data.item_type
 
 
 def array_type(data_type):
-  matched = re.match(r'([\w\d_\s]+)\[\]', data_type)
-  if not matched:
-      return None
-  return matched.group(1)
+    matched = re.match(r'([\w\d_\s]+)\[\]', data_type)
+    if not matched:
+        return None
+    return matched.group(1)
+
 
 class SequenceIDLTypeInfo(IDLTypeInfo):
-  def __init__(self, idl_type, data, item_info):
-    super(SequenceIDLTypeInfo, self).__init__(idl_type, data)
-    self._item_info = item_info
 
-  def dart_type(self):
-    darttype = self._item_info.dart_type()
-    return 'List' if darttype is None else 'List<%s>' % darttype
+    def __init__(self, idl_type, data, item_info):
+        super(SequenceIDLTypeInfo, self).__init__(idl_type, data)
+        self._item_info = item_info
 
-  def interface_name(self):
-    return self.dart_type()
+    def dart_type(self):
+        darttype = self._item_info.dart_type()
+        return 'List' if darttype is None else 'List<%s>' % darttype
 
-  def implementation_name(self):
-    return self.dart_type()
+    def interface_name(self):
+        return self.dart_type()
 
-  def vector_to_dart_template_parameter(self):
-    raise Exception('sequences of sequences are not supported yet')
+    def implementation_name(self):
+        return self.dart_type()
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    item_native_type = self._item_info.vector_to_dart_template_parameter()
-    if isinstance(self._item_info, PrimitiveIDLTypeInfo):
-      return '%s', 'Vector<%s>' % item_native_type, 'DartUtilities', 'toNativeVector<%s>' % item_native_type
-    return '%s', 'Vector< RefPtr<%s> >' % item_native_type, 'DartUtilities', 'toNativeVector< RefPtr<%s> >' % item_native_type
+    def vector_to_dart_template_parameter(self):
+        raise Exception('sequences of sequences are not supported yet')
 
-  def parameter_type(self):
-    native_type = self.native_type()
-    if array_type(native_type):
-      return 'const Vector<RefPtr<%s> > &' % array_type(native_type)
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        item_native_type = self._item_info.vector_to_dart_template_parameter()
+        if isinstance(self._item_info, PrimitiveIDLTypeInfo):
+            return '%s', 'Vector<%s>' % item_native_type, 'DartUtilities', 'toNativeVector<%s>' % item_native_type
+        return '%s', 'Vector< RefPtr<%s> >' % item_native_type, 'DartUtilities', 'toNativeVector< RefPtr<%s> >' % item_native_type
 
-    return native_type
+    def parameter_type(self):
+        native_type = self.native_type()
+        if array_type(native_type):
+            return 'const Vector<RefPtr<%s> > &' % array_type(native_type)
 
-  def pass_native_by_ref(self): return True
+        return native_type
 
-  def to_dart_conversion(self, value, interface_name=None, attributes=None):
-    if isinstance(self._item_info, PrimitiveIDLTypeInfo):
-      return 'DartDOMWrapper::vectorToDart(%s)' % value
-    return 'DartDOMWrapper::vectorToDart<%s>(%s)' % (self._item_info.bindings_class(), value)
+    def pass_native_by_ref(self):
+        return True
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup=True,
-                                interface_name=None, attributes=None):
-    return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
-        value,
-        interface_name,
-        attributes)
+    def to_dart_conversion(self, value, interface_name=None, attributes=None):
+        if isinstance(self._item_info, PrimitiveIDLTypeInfo):
+            return 'DartDOMWrapper::vectorToDart(%s)' % value
+        return 'DartDOMWrapper::vectorToDart<%s>(%s)' % (
+            self._item_info.bindings_class(), value)
 
-  def conversion_includes(self):
-    return self._item_info.conversion_includes()
+    def return_to_dart_conversion(self,
+                                  value,
+                                  auto_dart_scope_setup=True,
+                                  interface_name=None,
+                                  attributes=None):
+        return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
+            value, interface_name, attributes)
+
+    def conversion_includes(self):
+        return self._item_info.conversion_includes()
 
 
 class DOMStringArrayTypeInfo(SequenceIDLTypeInfo):
-  def __init__(self, data, item_info):
-    super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', data, item_info)
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    return '%s', 'RefPtr<DOMStringList>', 'DartDOMStringList', 'toNative'
+    def __init__(self, data, item_info):
+        super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', data,
+                                                     item_info)
 
-  def pass_native_by_ref(self): return False
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        return '%s', 'RefPtr<DOMStringList>', 'DartDOMStringList', 'toNative'
 
-  def implementation_name(self):
-    return ""
+    def pass_native_by_ref(self):
+        return False
+
+    def implementation_name(self):
+        return ""
 
 
 class PrimitiveIDLTypeInfo(IDLTypeInfo):
-  def __init__(self, idl_type, data):
-    super(PrimitiveIDLTypeInfo, self).__init__(idl_type, data)
 
-  def vector_to_dart_template_parameter(self):
-    # Ugly hack. Usually IDLs floats are treated as C++ doubles, however
-    # sequence<float> should map to Vector<float>
-    if self.idl_type() == 'float': return 'float'
-    return self.native_type()
+    def __init__(self, idl_type, data):
+        super(PrimitiveIDLTypeInfo, self).__init__(idl_type, data)
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    type = self.native_type()
-    if type == 'SerializedScriptValue':
-      type = 'RefPtr<%s>' % type
-    if type == 'String':
-      type = 'DartStringAdapter'
-    target_type = self._capitalized_native_type()
-    if self.idl_type() == 'Date':
-      target_type = 'Date'
-    return '%s', type, 'DartUtilities', 'dartTo%s' % target_type
+    def vector_to_dart_template_parameter(self):
+        # Ugly hack. Usually IDLs floats are treated as C++ doubles, however
+        # sequence<float> should map to Vector<float>
+        if self.idl_type() == 'float': return 'float'
+        return self.native_type()
 
-  def parameter_type(self):
-    if self.native_type() == 'String':
-      return 'const String&'
-    return self.native_type()
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        type = self.native_type()
+        if type == 'SerializedScriptValue':
+            type = 'RefPtr<%s>' % type
+        if type == 'String':
+            type = 'DartStringAdapter'
+        target_type = self._capitalized_native_type()
+        if self.idl_type() == 'Date':
+            target_type = 'Date'
+        return '%s', type, 'DartUtilities', 'dartTo%s' % target_type
 
-  def conversion_includes(self):
-    return []
+    def parameter_type(self):
+        if self.native_type() == 'String':
+            return 'const String&'
+        return self.native_type()
 
-  def to_dart_conversion(self, value, interface_name=None, attributes=None):
-    # TODO(antonm): if there are more instances of the case
-    # when conversion depends on both Dart type and C++ type,
-    # consider introducing a corresponding argument/class.
-    if self.idl_type() == 'Date':
-      function_name = 'date'
-    else:
-      function_name = self._capitalized_native_type()
-      function_name = function_name[0].lower() + function_name[1:]
-    function_name = 'DartUtilities::%sToDart' % function_name
-    if attributes and 'TreatReturnedNullStringAs' in attributes:
-      function_name += 'WithNullCheck'
-    return '%s(%s)' % (function_name, value)
+    def conversion_includes(self):
+        return []
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup=True,
-                                interface_name=None, attributes=None):
-    return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
-        value,
-        interface_name,
-        attributes)
+    def to_dart_conversion(self, value, interface_name=None, attributes=None):
+        # TODO(antonm): if there are more instances of the case
+        # when conversion depends on both Dart type and C++ type,
+        # consider introducing a corresponding argument/class.
+        if self.idl_type() == 'Date':
+            function_name = 'date'
+        else:
+            function_name = self._capitalized_native_type()
+            function_name = function_name[0].lower() + function_name[1:]
+        function_name = 'DartUtilities::%sToDart' % function_name
+        if attributes and 'TreatReturnedNullStringAs' in attributes:
+            function_name += 'WithNullCheck'
+        return '%s(%s)' % (function_name, value)
 
-  def webcore_getter_name(self):
-    return self._data.webcore_getter_name
+    def return_to_dart_conversion(self,
+                                  value,
+                                  auto_dart_scope_setup=True,
+                                  interface_name=None,
+                                  attributes=None):
+        return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
+            value, interface_name, attributes)
 
-  def webcore_setter_name(self):
-    return self._data.webcore_setter_name
+    def webcore_getter_name(self):
+        return self._data.webcore_getter_name
 
-  def _capitalized_native_type(self):
-    return re.sub(r'(^| )([a-z])', lambda x: x.group(2).upper(), self.native_type())
+    def webcore_setter_name(self):
+        return self._data.webcore_setter_name
+
+    def _capitalized_native_type(self):
+        return re.sub(r'(^| )([a-z])', lambda x: x.group(2).upper(),
+                      self.native_type())
 
 
 class SVGTearOffIDLTypeInfo(InterfaceIDLTypeInfo):
-  def __init__(self, idl_type, data, interface_name, type_registry):
-    super(SVGTearOffIDLTypeInfo, self).__init__(
-        idl_type, data, interface_name, type_registry)
 
-  def native_type(self):
-    if self._data.native_type:
-      return self._data.native_type
-    tear_off_type = 'SVGPropertyTearOff'
-    if self._idl_type.endswith('List'):
-      tear_off_type = 'SVGListPropertyTearOff'
-    return '%s<%s>' % (tear_off_type, self._idl_type)
+    def __init__(self, idl_type, data, interface_name, type_registry):
+        super(SVGTearOffIDLTypeInfo,
+              self).__init__(idl_type, data, interface_name, type_registry)
 
-  def receiver(self):
-    return 'receiver->'
+    def native_type(self):
+        if self._data.native_type:
+            return self._data.native_type
+        tear_off_type = 'SVGPropertyTearOff'
+        if self._idl_type.endswith('List'):
+            tear_off_type = 'SVGListPropertyTearOff'
+        return '%s<%s>' % (tear_off_type, self._idl_type)
 
-  def to_conversion_cast(self, value, interface_name, attributes):
-    svg_primitive_types = ['SVGLength', 'SVGMatrix',
-        'SVGNumber', 'SVGPoint', 'SVGRect', 'SVGTransform']
+    def receiver(self):
+        return 'receiver->'
 
-    # This is a hack. We either need to figure out the right way to derive this
-    # information from the IDL or remove this generator.
-    if self.idl_type() != 'SVGTransformList':
-      return value
+    def to_conversion_cast(self, value, interface_name, attributes):
+        svg_primitive_types = [
+            'SVGLength', 'SVGMatrix', 'SVGNumber', 'SVGPoint', 'SVGRect',
+            'SVGTransform'
+        ]
 
-    conversion_cast = 'static_cast<%s*>(%s)'
-    conversion_cast = conversion_cast % (self.native_type(), value)
-    return '%s' % (conversion_cast)
+        # This is a hack. We either need to figure out the right way to derive this
+        # information from the IDL or remove this generator.
+        if self.idl_type() != 'SVGTransformList':
+            return value
 
-  def to_dart_conversion(self, value, interface_name, attributes):
-    return 'Dart%s::toDart(%s)' % (self._idl_type, self.to_conversion_cast(value, interface_name, attributes))
+        conversion_cast = 'static_cast<%s*>(%s)'
+        conversion_cast = conversion_cast % (self.native_type(), value)
+        return '%s' % (conversion_cast)
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup,
-                                interface_name, attr):
-    auto_dart_scope='true' if auto_dart_scope_setup else 'false'
-    return 'Dart%s::returnToDart(args, %s, %s)' % (self._idl_type,
-                                                   self.to_conversion_cast(
-                                                       ReturnValueConversionHack(self._idl_type, value, interface_name),
-                                                       interface_name,
-                                                       attr),
-                                                   auto_dart_scope)
+    def to_dart_conversion(self, value, interface_name, attributes):
+        return 'Dart%s::toDart(%s)' % (self._idl_type,
+                                       self.to_conversion_cast(
+                                           value, interface_name, attributes))
 
-  def argument_expression(self, name, interface_name):
-    return name
+    def return_to_dart_conversion(self, value, auto_dart_scope_setup,
+                                  interface_name, attr):
+        auto_dart_scope = 'true' if auto_dart_scope_setup else 'false'
+        return 'Dart%s::returnToDart(args, %s, %s)' % (
+            self._idl_type,
+            self.to_conversion_cast(
+                ReturnValueConversionHack(self._idl_type, value,
+                                          interface_name), interface_name,
+                attr), auto_dart_scope)
+
+    def argument_expression(self, name, interface_name):
+        return name
+
 
 class TypedListIDLTypeInfo(InterfaceIDLTypeInfo):
-  def __init__(self, idl_type, data, interface_name, type_registry):
-    super(TypedListIDLTypeInfo, self).__init__(
-        idl_type, data, interface_name, type_registry)
 
-  def conversion_includes(self):
-    return [ '"wtf/%s.h"' % self._idl_type ]
+    def __init__(self, idl_type, data, interface_name, type_registry):
+        super(TypedListIDLTypeInfo,
+              self).__init__(idl_type, data, interface_name, type_registry)
 
-  def to_dart_conversion(self, value, interface_name, attributes):
-    return 'DartUtilities::arrayBufferViewToDart(%s)' % value
+    def conversion_includes(self):
+        return ['"wtf/%s.h"' % self._idl_type]
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup,
-                                interface_name, attributes):
-    return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
-        value,
-        interface_name,
-        attributes)
+    def to_dart_conversion(self, value, interface_name, attributes):
+        return 'DartUtilities::arrayBufferViewToDart(%s)' % value
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
+    def return_to_dart_conversion(self, value, auto_dart_scope_setup,
+                                  interface_name, attributes):
+        return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
+            value, interface_name, attributes)
+
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
 class BasicTypedListIDLTypeInfo(InterfaceIDLTypeInfo):
-  def __init__(self, idl_type, data, interface_name, type_registry):
-    super(BasicTypedListIDLTypeInfo, self).__init__(
-        idl_type, data, interface_name, type_registry)
 
-  def conversion_includes(self):
-    return []
+    def __init__(self, idl_type, data, interface_name, type_registry):
+        super(BasicTypedListIDLTypeInfo,
+              self).__init__(idl_type, data, interface_name, type_registry)
 
-  def to_dart_conversion(self, value, interface_name, attributes):
-    function_name = 'DartUtilities::%sToDart' % self._idl_type
-    function_name = function_name[0].lower() + function_name[1:]
-    return '%s(%s)' % (function_name, value)
+    def conversion_includes(self):
+        return []
 
-  def return_to_dart_conversion(self, value, auto_dart_scope_setup,
-                                interface_name, attributes):
-    return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
-        value,
-        interface_name,
-        attributes)
+    def to_dart_conversion(self, value, interface_name, attributes):
+        function_name = 'DartUtilities::%sToDart' % self._idl_type
+        function_name = function_name[0].lower() + function_name[1:]
+        return '%s(%s)' % (function_name, value)
 
-  def to_native_info(self, idl_node, interface_name, callback_name):
-    return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
+    def return_to_dart_conversion(self, value, auto_dart_scope_setup,
+                                  interface_name, attributes):
+        return 'Dart_SetReturnValue(args, %s)' % self.to_dart_conversion(
+            value, interface_name, attributes)
+
+    def to_native_info(self, idl_node, interface_name, callback_name):
+        return '%s.get()', 'RefPtr<%s>' % self._idl_type, 'DartUtilities', 'dartTo%s' % self._idl_type
 
 
 class TypeData(object):
-  def __init__(self, clazz, dart_type=None, native_type=None,
-               merged_interface=None, merged_into=None,
-               custom_to_dart=False, custom_to_native=False,
-               conversion_includes=None,
-               webcore_getter_name='getAttribute',
-               webcore_setter_name='setAttribute',
-               item_type=None, item_type_nullable=False,
-               suppress_interface=False):
-    self.clazz = clazz
-    self.dart_type = dart_type
-    self.native_type = native_type
-    self.merged_interface = merged_interface
-    self.merged_into = merged_into
-    self.custom_to_dart = custom_to_dart
-    self.custom_to_native = custom_to_native
-    self.conversion_includes = conversion_includes
-    self.webcore_getter_name = webcore_getter_name
-    self.webcore_setter_name = webcore_setter_name
-    self.item_type = item_type
-    self.item_type_nullable = item_type_nullable
-    self.suppress_interface = suppress_interface
+
+    def __init__(self,
+                 clazz,
+                 dart_type=None,
+                 native_type=None,
+                 merged_interface=None,
+                 merged_into=None,
+                 custom_to_dart=False,
+                 custom_to_native=False,
+                 conversion_includes=None,
+                 webcore_getter_name='getAttribute',
+                 webcore_setter_name='setAttribute',
+                 item_type=None,
+                 item_type_nullable=False,
+                 suppress_interface=False):
+        self.clazz = clazz
+        self.dart_type = dart_type
+        self.native_type = native_type
+        self.merged_interface = merged_interface
+        self.merged_into = merged_into
+        self.custom_to_dart = custom_to_dart
+        self.custom_to_native = custom_to_native
+        self.conversion_includes = conversion_includes
+        self.webcore_getter_name = webcore_getter_name
+        self.webcore_setter_name = webcore_setter_name
+        self.item_type = item_type
+        self.item_type_nullable = item_type_nullable
+        self.suppress_interface = suppress_interface
 
 
 def TypedListTypeData(item_type):
-  return TypeData(clazz='TypedList', item_type=item_type)
+    return TypeData(clazz='TypedList', item_type=item_type)
 
 
-_idl_type_registry = monitored.Dict('generator._idl_type_registry', {
-    'boolean': TypeData(clazz='Primitive', dart_type='bool', native_type='bool',
-                        webcore_getter_name='hasAttribute',
-                        webcore_setter_name='setBooleanAttribute'),
-    'byte': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
-    'octet': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
-    'short': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
-    'unsigned short': TypeData(clazz='Primitive', dart_type='int',
-        native_type='int'),
-    'int': TypeData(clazz='Primitive', dart_type='int'),
-    'long': TypeData(clazz='Primitive', dart_type='int', native_type='int',
-        webcore_getter_name='getIntegralAttribute',
-        webcore_setter_name='setIntegralAttribute'),
-    'unsigned long': TypeData(clazz='Primitive', dart_type='int',
-                              native_type='unsigned',
-                              webcore_getter_name='getUnsignedIntegralAttribute',
-                              webcore_setter_name='setUnsignedIntegralAttribute'),
-    'long long': TypeData(clazz='Primitive', dart_type='int'),
-    'unsigned long long': TypeData(clazz='Primitive', dart_type='int'),
-    'float': TypeData(clazz='Primitive', dart_type='num', native_type='double'),
-    'double': TypeData(clazz='Primitive', dart_type='num'),
+_idl_type_registry = monitored.Dict(
+    'generator._idl_type_registry',
+    {
+        'boolean':
+        TypeData(
+            clazz='Primitive',
+            dart_type='bool',
+            native_type='bool',
+            webcore_getter_name='hasAttribute',
+            webcore_setter_name='setBooleanAttribute'),
+        'byte':
+        TypeData(clazz='Primitive', dart_type='int', native_type='int'),
+        'octet':
+        TypeData(clazz='Primitive', dart_type='int', native_type='int'),
+        'short':
+        TypeData(clazz='Primitive', dart_type='int', native_type='int'),
+        'unsigned short':
+        TypeData(clazz='Primitive', dart_type='int', native_type='int'),
+        'int':
+        TypeData(clazz='Primitive', dart_type='int'),
+        'long':
+        TypeData(
+            clazz='Primitive',
+            dart_type='int',
+            native_type='int',
+            webcore_getter_name='getIntegralAttribute',
+            webcore_setter_name='setIntegralAttribute'),
+        'unsigned long':
+        TypeData(
+            clazz='Primitive',
+            dart_type='int',
+            native_type='unsigned',
+            webcore_getter_name='getUnsignedIntegralAttribute',
+            webcore_setter_name='setUnsignedIntegralAttribute'),
+        'long long':
+        TypeData(clazz='Primitive', dart_type='int'),
+        'unsigned long long':
+        TypeData(clazz='Primitive', dart_type='int'),
+        'float':
+        TypeData(clazz='Primitive', dart_type='num', native_type='double'),
+        'double':
+        TypeData(clazz='Primitive', dart_type='num'),
+        'any':
+        TypeData(
+            clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
+        'Array':
+        TypeData(clazz='Primitive', dart_type='List'),
+        'custom':
+        TypeData(clazz='Primitive', dart_type='dynamic'),
+        'DOMRect':
+        TypeData(
+            clazz='Interface', dart_type='Rectangle', suppress_interface=True),
+        'Date':
+        TypeData(clazz='Primitive', dart_type='DateTime', native_type='double'),
+        'Promise':
+        TypeData(
+            clazz='Primitive', dart_type='Future', native_type='ScriptPromise'),
+        'DOMObject':
+        TypeData(
+            clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
+        'DOMString':
+        TypeData(clazz='Primitive', dart_type='String', native_type='String'),
+        'ScriptURLString':
+        TypeData(clazz='Primitive', dart_type='String', native_type='String'),
+        # TODO(vsm): This won't actually work until we convert the Map to
+        # a native JS Map for JS DOM.
+        'Dictionary':
+        TypeData(clazz='Primitive', dart_type='Map'),
+        'DOMTimeStamp':
+        TypeData(
+            clazz='Primitive',
+            dart_type='int',
+            native_type='unsigned long long'),
+        'object':
+        TypeData(
+            clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
+        'PositionOptions':
+        TypeData(clazz='Primitive', dart_type='Object'),
+        # TODO(sra): Come up with some meaningful name so that where this appears in
+        # the documentation, the user is made aware that only a limited subset of
+        # serializable types are actually permitted.
+        'SerializedScriptValue':
+        TypeData(clazz='Primitive', dart_type='dynamic'),
+        'sequence':
+        TypeData(clazz='Primitive', dart_type='List'),
+        'sequence<any>':
+        TypeData(clazz='Primitive', dart_type='List'),
+        'void':
+        TypeData(clazz='Primitive', dart_type='void'),
+        'CSSRule':
+        TypeData(clazz='Interface', conversion_includes=['CSSImportRule']),
+        'DOMStringMap':
+        TypeData(clazz='Interface', dart_type='Map<String, String>'),
+        'Window':
+        TypeData(clazz='Interface', custom_to_dart=True),
+        'Element':
+        TypeData(
+            clazz='Interface',
+            merged_interface='HTMLElement',
+            custom_to_dart=True),
+        'EventListener':
+        TypeData(clazz='Interface', custom_to_native=True),
+        'EventHandler':
+        TypeData(clazz='Interface', custom_to_native=True),
+        'EventTarget':
+        TypeData(clazz='Interface', custom_to_native=True),
+        'HTMLElement':
+        TypeData(clazz='Interface', merged_into='Element', custom_to_dart=True),
+        'IDBAny':
+        TypeData(clazz='Interface', dart_type='dynamic', custom_to_native=True),
+        'MutationRecordArray':
+        TypeData(
+            clazz='Interface',  # C++ pass by pointer.
+            native_type='MutationRecordArray',
+            dart_type='List<MutationRecord>'),
+        'StyleSheet':
+        TypeData(clazz='Interface', conversion_includes=['CSSStyleSheet']),
+        'SVGElement':
+        TypeData(clazz='Interface', custom_to_dart=True),
+        'CSSRuleList':
+        TypeData(
+            clazz='Interface', item_type='CSSRule', suppress_interface=True),
+        'CSSValueList':
+        TypeData(
+            clazz='Interface', item_type='CSSValue', suppress_interface=True),
+        'MimeTypeArray':
+        TypeData(clazz='Interface', item_type='MimeType'),
+        'PluginArray':
+        TypeData(clazz='Interface', item_type='Plugin'),
+        'DOMRectList':
+        TypeData(
+            clazz='Interface',
+            item_type='DOMRect',
+            dart_type='List<Rectangle>',
+            custom_to_native=True),
+        'DOMStringList':
+        TypeData(
+            clazz='Interface',
+            item_type='DOMString',
+            dart_type='List<String>',
+            custom_to_native=True),
+        'FileList':
+        TypeData(clazz='Interface', item_type='File', dart_type='List<File>'),
+        # Handle new FrozenArray Web IDL builtin
+        # TODO(terry): Consider automating this mechanism to map the conversion from FrozenArray<xxx>
+        #              to List<xxx>. Some caveats for double, unsigned int and dictionary.
+        'FrozenArray<BackgroundFetchSettledFetch>':
+        TypeData(
+            clazz='Primitive',
+            item_type='BackgroundFetchSettledFetch',
+            dart_type='List<BackgroundFetchSettledFetch>'),
+        'FrozenArray<DOMString>':
+        TypeData(
+            clazz='Primitive',
+            item_type='DOMString',
+            dart_type='List<String>',
+            custom_to_native=True),
+        'FrozenArray<double>':
+        TypeData(clazz='Primitive', item_type='double', dart_type='List<num>'),
+        'FrozenArray<Entry>':
+        TypeData(clazz='Primitive', item_type='Entry', dart_type='List<Entry>'),
+        'FrozenArray<FillLightMode>':
+        TypeData(
+            clazz='Primitive', item_type='FillLightMode', dart_type='List'),
+        'FrozenArray<FontFace>':
+        TypeData(
+            clazz='Primitive', item_type='FontFace',
+            dart_type='List<FontFace>'),
+        'FrozenArray<GamepadButton>':
+        TypeData(
+            clazz='Primitive',
+            item_type='GamepadButton',
+            dart_type='List<GamepadButton>'),
+        'FrozenArray<Landmark>':
+        TypeData(clazz='Primitive', item_type='Landmark', dart_type='List'),
+        'FrozenArray<MediaImage>':
+        TypeData(clazz='Primitive', item_type='MediaImage', dart_type='List'),
+        'FrozenArray<MediaStream>':
+        TypeData(
+            clazz='Primitive',
+            item_type='MediaStream',
+            dart_type='List<MediaStream>'),
+        'FrozenArray<MessagePort>':
+        TypeData(
+            clazz='Primitive',
+            item_type='MessagePort',
+            dart_type='List<MessagePort>'),
+        'FrozenArray<NotificationAction>':
+        TypeData(
+            clazz='Primitive', item_type='NotificationAction',
+            dart_type='List'),
+        'FrozenArray<PaymentDetailsModifier>':
+        TypeData(
+            clazz='Primitive',
+            item_type='PaymentDetailsModifier',
+            dart_type='List'),
+        'FrozenArray<PaymentMethodData>':
+        TypeData(
+            clazz='Primitive', item_type='PaymentMethodData', dart_type='List'),
+        'FrozenArray<PerformanceServerTiming>':
+        TypeData(
+            clazz='Primitive',
+            item_type='PerformanceServerTiming',
+            dart_type='List<PerformanceServerTiming>'),
+        'FrozenArray<Point2D>':
+        TypeData(clazz='Primitive', item_type='Point2D', dart_type='List'),
+        'FrozenArray<PresentationConnection>':
+        TypeData(
+            clazz='Primitive',
+            item_type='PresentationConnection',
+            dart_type='List<PresentationConnection>'),
+        'FrozenArray<TaskAttributionTiming>':
+        TypeData(
+            clazz='Primitive',
+            item_type='TaskAttributionTiming',
+            dart_type='List<TaskAttributionTiming>'),
+        'FrozenArray<unsigned long>':
+        TypeData(
+            clazz='Primitive', item_type='unsigned long',
+            dart_type='List<int>'),
+        'FrozenArray<USBEndpoint>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBEndpoint',
+            dart_type='List<USBEndpoint>'),
+        'FrozenArray<USBInterface>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBInterface',
+            dart_type='List<USBInterface>'),
+        'FrozenArray<USBConfiguration>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBConfiguration',
+            dart_type='List<USBConfiguration>'),
+        'FrozenArray<USBAlternateInterface>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBAlternateInterface',
+            dart_type='List<USBAlternateInterface>'),
+        'FrozenArray<USBIsochronousInTransferPacket>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBIsochronousInTransferPacket',
+            dart_type='List<USBIsochronousInTransferPacket>'),
+        'FrozenArray<USBIsochronousOutTransferPacket>':
+        TypeData(
+            clazz='Primitive',
+            item_type='USBIsochronousOutTransferPacket',
+            dart_type='List<USBIsochronousOutTransferPacket>'),
+        'FrozenArray<VRStageBoundsPoint>':
+        TypeData(
+            clazz='Primitive',
+            item_type='VRStageBoundsPoint',
+            dart_type='List<VRStageBoundsPoint>'),
+        'Future':
+        TypeData(clazz='Interface', dart_type='Future'),
+        'GamepadList':
+        TypeData(
+            clazz='Interface',
+            item_type='Gamepad',
+            item_type_nullable=True,
+            suppress_interface=True),
+        'GLenum':
+        TypeData(clazz='Primitive', dart_type='int', native_type='unsigned'),
+        'GLboolean':
+        TypeData(clazz='Primitive', dart_type='bool', native_type='bool'),
+        'GLbitfield':
+        TypeData(clazz='Primitive', dart_type='int', native_type='unsigned'),
+        'GLshort':
+        TypeData(clazz='Primitive', dart_type='int', native_type='short'),
+        'GLint':
+        TypeData(clazz='Primitive', dart_type='int', native_type='long'),
+        'GLsizei':
+        TypeData(clazz='Primitive', dart_type='int', native_type='long'),
+        'GLintptr':
+        TypeData(clazz='Primitive', dart_type='int'),
+        'GLsizeiptr':
+        TypeData(clazz='Primitive', dart_type='int'),
+        'GLushort':
+        TypeData(clazz='Primitive', dart_type='int', native_type='int'),
+        'GLuint':
+        TypeData(clazz='Primitive', dart_type='int', native_type='unsigned'),
+        'GLfloat':
+        TypeData(clazz='Primitive', dart_type='num', native_type='float'),
+        'GLclampf':
+        TypeData(clazz='Primitive', dart_type='num', native_type='float'),
+        'HTMLCollection':
+        TypeData(clazz='Interface', item_type='Node', dart_type='List<Node>'),
+        'NamedNodeMap':
+        TypeData(clazz='Interface', item_type='Node'),
+        'NodeList':
+        TypeData(
+            clazz='Interface',
+            item_type='Node',
+            suppress_interface=False,
+            dart_type='List<Node>'),
+        'NotificationAction':
+        TypedListTypeData(''),
+        'SVGElementInstanceList':
+        TypeData(
+            clazz='Interface',
+            item_type='SVGElementInstance',
+            suppress_interface=True),
+        'SourceBufferList':
+        TypeData(clazz='Interface', item_type='SourceBuffer'),
+        'SpeechGrammarList':
+        TypeData(clazz='Interface', item_type='SpeechGrammar'),
+        'SpeechInputResultList':
+        TypeData(
+            clazz='Interface',
+            item_type='SpeechInputResult',
+            suppress_interface=True),
+        'SpeechRecognitionResultList':
+        TypeData(
+            clazz='Interface',
+            item_type='SpeechRecognitionResult',
+            suppress_interface=True),
+        'SQLResultSetRowList':
+        TypeData(clazz='Interface', item_type='Dictionary'),
+        'StyleSheetList':
+        TypeData(
+            clazz='Interface', item_type='StyleSheet', suppress_interface=True),
+        'TextTrackCueList':
+        TypeData(clazz='Interface', item_type='TextTrackCue'),
+        'TextTrackList':
+        TypeData(clazz='Interface', item_type='TextTrack'),
+        'TouchList':
+        TypeData(clazz='Interface', item_type='Touch'),
+        'Float32Array':
+        TypedListTypeData('double'),
+        'Float64Array':
+        TypedListTypeData('double'),
+        'Int8Array':
+        TypedListTypeData('int'),
+        'Int16Array':
+        TypedListTypeData('int'),
+        'Int32Array':
+        TypedListTypeData('int'),
+        'Uint8Array':
+        TypedListTypeData('int'),
+        'Uint8ClampedArray':
+        TypedListTypeData('int'),
+        'Uint16Array':
+        TypedListTypeData('int'),
+        'Uint32Array':
+        TypedListTypeData('int'),
+        'ArrayBufferView':
+        TypeData(clazz='BasicTypedList'),
+        'ArrayBuffer':
+        TypeData(clazz='BasicTypedList'),
+        'SVGAngle':
+        TypeData(
+            clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGAngle>'),
+        'SVGLength':
+        TypeData(clazz='SVGTearOff', native_type='SVGLengthTearOff'),
+        'SVGLengthList':
+        TypeData(
+            clazz='SVGTearOff',
+            item_type='SVGLength',
+            native_type='SVGLengthListTearOff'),
+        'SVGMatrix':
+        TypeData(clazz='SVGTearOff', native_type='SVGMatrixTearOff'),
+        'SVGNumber':
+        TypeData(clazz='SVGTearOff', native_type='SVGNumberTearOff'),
+        'SVGNumberList':
+        TypeData(
+            clazz='SVGTearOff',
+            item_type='SVGNumber',
+            native_type='SVGNumberListTearOff'),
+        'SVGPathSegList':
+        TypeData(
+            clazz='SVGTearOff',
+            item_type='SVGPathSeg',
+            native_type='SVGPathSegListPropertyTearOff'),
+        'SVGPoint':
+        TypeData(clazz='SVGTearOff', native_type='SVGPointTearOff'),
+        'SVGPointList':
+        TypeData(clazz='SVGTearOff', native_type='SVGPointListTearOff'),
+        'SVGPreserveAspectRatio':
+        TypeData(
+            clazz='SVGTearOff', native_type='SVGPreserveAspectRatioTearOff'),
+        'SVGRect':
+        TypeData(clazz='SVGTearOff', native_type='SVGRectTearOff'),
+        'SVGStringList':
+        TypeData(
+            clazz='SVGTearOff',
+            item_type='DOMString',
+            native_type='SVGStringListTearOff'),
+        'SVGTransform':
+        TypeData(
+            clazz='SVGTearOff', native_type="SVGPropertyTearOff<SVGTransform>"),
+        'SVGTransformList':
+        TypeData(
+            clazz='SVGTearOff',
+            item_type='SVGTransform',
+            native_type='SVGTransformListPropertyTearOff'),
 
-    'any': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
-    'Array': TypeData(clazz='Primitive', dart_type='List'),
-    'custom': TypeData(clazz='Primitive', dart_type='dynamic'),
-    'DOMRect': TypeData(clazz='Interface',
-         dart_type='Rectangle', suppress_interface=True),
-    'Date': TypeData(clazz='Primitive', dart_type='DateTime', native_type='double'),
-    'Promise': TypeData(clazz='Primitive', dart_type='Future', native_type='ScriptPromise'),
-    'DOMObject': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
-    'DOMString': TypeData(clazz='Primitive', dart_type='String', native_type='String'),
-    'ScriptURLString': TypeData(clazz='Primitive', dart_type='String', native_type='String'),
-    # TODO(vsm): This won't actually work until we convert the Map to
-    # a native JS Map for JS DOM.
-    'Dictionary': TypeData(clazz='Primitive', dart_type='Map'),
-    'DOMTimeStamp': TypeData(clazz='Primitive', dart_type='int', native_type='unsigned long long'),
-    'object': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
-    'PositionOptions': TypeData(clazz='Primitive', dart_type='Object'),
-    # TODO(sra): Come up with some meaningful name so that where this appears in
-    # the documentation, the user is made aware that only a limited subset of
-    # serializable types are actually permitted.
-    'SerializedScriptValue': TypeData(clazz='Primitive', dart_type='dynamic'),
-    'sequence': TypeData(clazz='Primitive', dart_type='List'),
-    'sequence<any>': TypeData(clazz='Primitive', dart_type='List'),
-    'void': TypeData(clazz='Primitive', dart_type='void'),
-
-    'CSSRule': TypeData(clazz='Interface', conversion_includes=['CSSImportRule']),
-    'DOMStringMap': TypeData(clazz='Interface', dart_type='Map<String, String>'),
-    'Window': TypeData(clazz='Interface', custom_to_dart=True),
-    'Element': TypeData(clazz='Interface', merged_interface='HTMLElement',
-        custom_to_dart=True),
-    'EventListener': TypeData(clazz='Interface', custom_to_native=True),
-    'EventHandler': TypeData(clazz='Interface', custom_to_native=True),
-    'EventTarget': TypeData(clazz='Interface', custom_to_native=True),
-    'HTMLElement': TypeData(clazz='Interface', merged_into='Element',
-        custom_to_dart=True),
-    'IDBAny': TypeData(clazz='Interface', dart_type='dynamic', custom_to_native=True),
-    'MutationRecordArray': TypeData(clazz='Interface',  # C++ pass by pointer.
-        native_type='MutationRecordArray', dart_type='List<MutationRecord>'),
-    'StyleSheet': TypeData(clazz='Interface', conversion_includes=['CSSStyleSheet']),
-    'SVGElement': TypeData(clazz='Interface', custom_to_dart=True),
-    'CSSRuleList': TypeData(clazz='Interface',
-        item_type='CSSRule', suppress_interface=True),
-    'CSSValueList': TypeData(clazz='Interface',
-        item_type='CSSValue', suppress_interface=True),
-    'MimeTypeArray': TypeData(clazz='Interface', item_type='MimeType'),
-    'PluginArray': TypeData(clazz='Interface', item_type='Plugin'),
-    'DOMRectList': TypeData(clazz='Interface',
-        item_type='DOMRect', dart_type='List<Rectangle>',
-        custom_to_native = True),
-    'DOMStringList': TypeData(clazz='Interface', item_type='DOMString',
-        dart_type='List<String>', custom_to_native=True),
-    'FileList': TypeData(clazz='Interface', item_type='File',
-        dart_type='List<File>'),
-    # Handle new FrozenArray Web IDL builtin
-    # TODO(terry): Consider automating this mechanism to map the conversion from FrozenArray<xxx>
-    #              to List<xxx>. Some caveats for double, unsigned int and dictionary.
-    'FrozenArray<BackgroundFetchSettledFetch>': TypeData(clazz='Primitive', item_type='BackgroundFetchSettledFetch',
-        dart_type='List<BackgroundFetchSettledFetch>'),
-    'FrozenArray<DOMString>': TypeData(clazz='Primitive', item_type='DOMString',
-        dart_type='List<String>', custom_to_native=True),
-    'FrozenArray<double>': TypeData(clazz='Primitive', item_type='double',
-        dart_type='List<num>'),
-    'FrozenArray<Entry>': TypeData(clazz='Primitive', item_type='Entry',
-        dart_type='List<Entry>'),
-    'FrozenArray<FillLightMode>': TypeData(clazz='Primitive', item_type='FillLightMode',
-        dart_type='List'),
-    'FrozenArray<FontFace>': TypeData(clazz='Primitive', item_type='FontFace',
-        dart_type='List<FontFace>'),
-    'FrozenArray<GamepadButton>': TypeData(clazz='Primitive', item_type='GamepadButton',
-        dart_type='List<GamepadButton>'),
-    'FrozenArray<Landmark>': TypeData(clazz='Primitive', item_type='Landmark',
-        dart_type='List'),
-    'FrozenArray<MediaImage>': TypeData(clazz='Primitive', item_type='MediaImage',
-        dart_type='List'),
-    'FrozenArray<MediaStream>': TypeData(clazz='Primitive', item_type='MediaStream',
-        dart_type='List<MediaStream>'),
-    'FrozenArray<MessagePort>': TypeData(clazz='Primitive', item_type='MessagePort',
-        dart_type='List<MessagePort>'),
-    'FrozenArray<NotificationAction>': TypeData(clazz='Primitive', item_type='NotificationAction',
-        dart_type='List'),
-    'FrozenArray<PaymentDetailsModifier>': TypeData(clazz='Primitive', item_type='PaymentDetailsModifier',
-        dart_type='List'),
-    'FrozenArray<PaymentMethodData>':TypeData(clazz='Primitive', item_type='PaymentMethodData',
-        dart_type='List'),
-    'FrozenArray<PerformanceServerTiming>': TypeData(clazz='Primitive', item_type='PerformanceServerTiming',
-        dart_type='List<PerformanceServerTiming>'),
-    'FrozenArray<Point2D>': TypeData(clazz='Primitive', item_type='Point2D',
-        dart_type='List'),
-    'FrozenArray<PresentationConnection>': TypeData(clazz='Primitive', item_type='PresentationConnection',
-        dart_type='List<PresentationConnection>'),
-    'FrozenArray<TaskAttributionTiming>': TypeData(clazz='Primitive', item_type='TaskAttributionTiming',
-        dart_type='List<TaskAttributionTiming>'),
-    'FrozenArray<unsigned long>': TypeData(clazz='Primitive', item_type='unsigned long',
-        dart_type='List<int>'),
-    'FrozenArray<USBEndpoint>': TypeData(clazz='Primitive', item_type='USBEndpoint',
-        dart_type='List<USBEndpoint>'),
-    'FrozenArray<USBInterface>': TypeData(clazz='Primitive', item_type='USBInterface',
-        dart_type='List<USBInterface>'),
-    'FrozenArray<USBConfiguration>': TypeData(clazz='Primitive', item_type='USBConfiguration',
-        dart_type='List<USBConfiguration>'),
-    'FrozenArray<USBAlternateInterface>':TypeData(clazz='Primitive', item_type='USBAlternateInterface',
-        dart_type='List<USBAlternateInterface>'),
-    'FrozenArray<USBIsochronousInTransferPacket>':TypeData(clazz='Primitive', item_type='USBIsochronousInTransferPacket',
-        dart_type='List<USBIsochronousInTransferPacket>'), 
-    'FrozenArray<USBIsochronousOutTransferPacket>':TypeData(clazz='Primitive', item_type='USBIsochronousOutTransferPacket',
-        dart_type='List<USBIsochronousOutTransferPacket>'),  
-    'FrozenArray<VRStageBoundsPoint>': TypeData(clazz='Primitive', item_type='VRStageBoundsPoint',
-        dart_type='List<VRStageBoundsPoint>'),
-    'Future': TypeData(clazz='Interface', dart_type='Future'),
-    'GamepadList': TypeData(clazz='Interface', item_type='Gamepad',
-        item_type_nullable=True, suppress_interface=True),
-    'GLenum': TypeData(clazz='Primitive', dart_type='int',
-        native_type='unsigned'),
-    'GLboolean': TypeData(clazz='Primitive', dart_type='bool',
-        native_type='bool'),
-    'GLbitfield': TypeData(clazz='Primitive', dart_type='int',
-        native_type='unsigned'),
-    'GLshort': TypeData(clazz='Primitive', dart_type='int', native_type='short'),
-    'GLint': TypeData(clazz='Primitive', dart_type='int',
-        native_type='long'),
-    'GLsizei': TypeData(clazz='Primitive', dart_type='int',
-        native_type='long'),
-    'GLintptr': TypeData(clazz='Primitive', dart_type='int'),
-    'GLsizeiptr': TypeData(clazz='Primitive', dart_type='int'),
-    'GLushort': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
-    'GLuint': TypeData(clazz='Primitive', dart_type='int',
-        native_type='unsigned'),
-    'GLfloat': TypeData(clazz='Primitive', dart_type='num', native_type='float'),
-    'GLclampf': TypeData(clazz='Primitive', dart_type='num', native_type='float'),
-    'HTMLCollection': TypeData(clazz='Interface', item_type='Node',
-        dart_type='List<Node>'),
-    'NamedNodeMap': TypeData(clazz='Interface', item_type='Node'),
-    'NodeList': TypeData(clazz='Interface', item_type='Node',
-                         suppress_interface=False, dart_type='List<Node>'),
-    'NotificationAction': TypedListTypeData(''),
-    'SVGElementInstanceList': TypeData(clazz='Interface',
-        item_type='SVGElementInstance', suppress_interface=True),
-    'SourceBufferList': TypeData(clazz='Interface', item_type='SourceBuffer'),
-    'SpeechGrammarList': TypeData(clazz='Interface', item_type='SpeechGrammar'),
-    'SpeechInputResultList': TypeData(clazz='Interface',
-        item_type='SpeechInputResult', suppress_interface=True),
-    'SpeechRecognitionResultList': TypeData(clazz='Interface',
-        item_type='SpeechRecognitionResult', suppress_interface=True),
-    'SQLResultSetRowList': TypeData(clazz='Interface', item_type='Dictionary'),
-    'StyleSheetList': TypeData(clazz='Interface',
-        item_type='StyleSheet', suppress_interface=True),
-    'TextTrackCueList': TypeData(clazz='Interface', item_type='TextTrackCue'),
-    'TextTrackList': TypeData(clazz='Interface', item_type='TextTrack'),
-    'TouchList': TypeData(clazz='Interface', item_type='Touch'),
-
-    'Float32Array': TypedListTypeData('double'),
-    'Float64Array': TypedListTypeData('double'),
-    'Int8Array': TypedListTypeData('int'),
-    'Int16Array': TypedListTypeData('int'),
-    'Int32Array': TypedListTypeData('int'),
-    'Uint8Array': TypedListTypeData('int'),
-    'Uint8ClampedArray': TypedListTypeData('int'),
-    'Uint16Array': TypedListTypeData('int'),
-    'Uint32Array': TypedListTypeData('int'),
-
-    'ArrayBufferView': TypeData(clazz='BasicTypedList'),
-    'ArrayBuffer': TypeData(clazz='BasicTypedList'),
-
-    'SVGAngle': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<SVGAngle>'),
-    'SVGLength': TypeData(clazz='SVGTearOff', native_type='SVGLengthTearOff'),
-    'SVGLengthList': TypeData(clazz='SVGTearOff', item_type='SVGLength', native_type='SVGLengthListTearOff'),
-    'SVGMatrix': TypeData(clazz='SVGTearOff', native_type='SVGMatrixTearOff'),
-    'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGNumberTearOff'),
-    'SVGNumberList': TypeData(clazz='SVGTearOff', item_type='SVGNumber', native_type='SVGNumberListTearOff'),
-    'SVGPathSegList': TypeData(clazz='SVGTearOff', item_type='SVGPathSeg',
-        native_type='SVGPathSegListPropertyTearOff'),
-    'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPointTearOff'),
-    'SVGPointList': TypeData(clazz='SVGTearOff', native_type='SVGPointListTearOff'),
-    'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff', native_type='SVGPreserveAspectRatioTearOff'),
-    'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGRectTearOff'),
-    'SVGStringList': TypeData(clazz='SVGTearOff', item_type='DOMString',
-        native_type='SVGStringListTearOff'),
-    'SVGTransform': TypeData(clazz='SVGTearOff', native_type="SVGPropertyTearOff<SVGTransform>"),
-    'SVGTransformList': TypeData(clazz='SVGTearOff', item_type='SVGTransform',
-        native_type='SVGTransformListPropertyTearOff'),
-
-     # Add any setlike forEach Callback types here.
-    'FontFaceSetForEachCallback': TypeData(clazz='Interface', item_type='FontFaceSetForEachCallback'),
-})
+        # Add any setlike forEach Callback types here.
+        'FontFaceSetForEachCallback':
+        TypeData(clazz='Interface', item_type='FontFaceSetForEachCallback'),
+    })
 
 _svg_supplemental_includes = [
     '"core/svg/properties/SVGPropertyTraits.h"',
 ]
 
+
 class TypeRegistry(object):
-  def __init__(self, database, renamer=None):
-    self._database = database
-    self._renamer = renamer
-    self._cache = {}
 
-  def HasInterface(self, type_name):
-    return self._database.HasInterface(type_name)
+    def __init__(self, database, renamer=None):
+        self._database = database
+        self._renamer = renamer
+        self._cache = {}
 
-  def HasTypeDef(self, type_def_name):
-    return self._database.HasTypeDef(type_def_name)
+    def HasInterface(self, type_name):
+        return self._database.HasInterface(type_name)
 
-  def TypeInfo(self, type_name):
-    if not type_name in self._cache:
-      self._cache[type_name] = self._TypeInfo(type_name)
-    return self._cache[type_name]
+    def HasTypeDef(self, type_def_name):
+        return self._database.HasTypeDef(type_def_name)
 
-  def DartType(self, type_name):
-    return self.TypeInfo(type_name).dart_type()
+    def TypeInfo(self, type_name):
+        if not type_name in self._cache:
+            self._cache[type_name] = self._TypeInfo(type_name)
+        return self._cache[type_name]
 
-  def _TypeInfo(self, type_name):
-    match = re.match(r'(?:sequence<([\w ]+)>|(\w+)\[\])$', type_name)
+    def DartType(self, type_name):
+        return self.TypeInfo(type_name).dart_type()
 
-    if match and self._database.HasDictionary(match.group(1)):
-      interface = self._database.GetDictionary(match.group(1))
+    def _TypeInfo(self, type_name):
+        match = re.match(r'(?:sequence<([\w ]+)>|(\w+)\[\])$', type_name)
 
-    # sequence<any> should not be List<Object>
-    if match and match.group(1) != 'any' and not(self._database.HasDictionary(match.group(1))):
-      type_data = TypeData('Sequence')
-      if self.HasTypeDef(match.group(1) or match.group(2)):
-        # It's a typedef (union)
-        item_info = self.TypeInfo('any')
-      else:
-        item_info = self.TypeInfo(match.group(1) or match.group(2))
-      # TODO(vsm): Generalize this code.
-      if 'SourceInfo' in type_name:
-        type_data.native_type = 'const Vector<RefPtr<SourceInfo> >& '
-      return SequenceIDLTypeInfo(type_name, type_data, item_info)
+        if match and self._database.HasDictionary(match.group(1)):
+            interface = self._database.GetDictionary(match.group(1))
 
-    if not type_name in _idl_type_registry:
-      if self._database.HasEnum(type_name):
-        return PrimitiveIDLTypeInfo(
-            type_name,
-            TypeData(clazz='Primitive', dart_type='String', native_type='String'))
-      if self._database.HasInterface(type_name):
-        interface = self._database.GetInterface(type_name)
-      elif self._database.HasDictionary(type_name):
-          type_data = _idl_type_registry.get('Dictionary')
-          class_name = '%sIDLTypeInfo' % type_data.clazz
-          return globals()[class_name](type_name, type_data)
-      elif type_name.startswith('sequence<('):
-        if type_name.find(' or ') != -1:
-          # Union type of sequence is an any type (no type).
-          type_data = TypeData('Sequence')
-          item_info = self.TypeInfo('any')
-          return SequenceIDLTypeInfo(type_name, type_data, item_info)
-      elif match and self._database.HasDictionary(match.group(1)):
-          return SequenceIDLTypeInfo(type_name,
-              TypeData('Sequence'), self.TypeInfo(match.group(1)))
-      elif type_name.startswith('sequence<sequence<'):
-        # TODO(terry): Cleanup up list of list, etc.
-        type_data = TypeData('Sequence')
-        item_info = self.TypeInfo('any')
-        return SequenceIDLTypeInfo(type_name, type_data, item_info)
-      elif self.HasTypeDef(type_name):
-        # It's a typedef (implied union)
-        return self.TypeInfo('any')
-      else:
-        print "ERROR: Unexpected interface, or type not found. %s" % type_name
+        # sequence<any> should not be List<Object>
+        if match and match.group(1) != 'any' and not (
+                self._database.HasDictionary(match.group(1))):
+            type_data = TypeData('Sequence')
+            if self.HasTypeDef(match.group(1) or match.group(2)):
+                # It's a typedef (union)
+                item_info = self.TypeInfo('any')
+            else:
+                item_info = self.TypeInfo(match.group(1) or match.group(2))
+            # TODO(vsm): Generalize this code.
+            if 'SourceInfo' in type_name:
+                type_data.native_type = 'const Vector<RefPtr<SourceInfo> >& '
+            return SequenceIDLTypeInfo(type_name, type_data, item_info)
 
-      if 'Callback' in interface.ext_attrs:
-        return CallbackIDLTypeInfo(type_name, TypeData('Callback',
-            self._renamer.DartifyTypeName(type_name)))
-      return InterfaceIDLTypeInfo(
-          type_name,
-          TypeData('Interface'),
-          self._renamer.RenameInterface(interface),
-          self)
+        if not type_name in _idl_type_registry:
+            if self._database.HasEnum(type_name):
+                return PrimitiveIDLTypeInfo(
+                    type_name,
+                    TypeData(
+                        clazz='Primitive',
+                        dart_type='String',
+                        native_type='String'))
+            if self._database.HasInterface(type_name):
+                interface = self._database.GetInterface(type_name)
+            elif self._database.HasDictionary(type_name):
+                type_data = _idl_type_registry.get('Dictionary')
+                class_name = '%sIDLTypeInfo' % type_data.clazz
+                return globals()[class_name](type_name, type_data)
+            elif type_name.startswith('sequence<('):
+                if type_name.find(' or ') != -1:
+                    # Union type of sequence is an any type (no type).
+                    type_data = TypeData('Sequence')
+                    item_info = self.TypeInfo('any')
+                    return SequenceIDLTypeInfo(type_name, type_data, item_info)
+            elif match and self._database.HasDictionary(match.group(1)):
+                return SequenceIDLTypeInfo(type_name, TypeData('Sequence'),
+                                           self.TypeInfo(match.group(1)))
+            elif type_name.startswith('sequence<sequence<'):
+                # TODO(terry): Cleanup up list of list, etc.
+                type_data = TypeData('Sequence')
+                item_info = self.TypeInfo('any')
+                return SequenceIDLTypeInfo(type_name, type_data, item_info)
+            elif self.HasTypeDef(type_name):
+                # It's a typedef (implied union)
+                return self.TypeInfo('any')
+            else:
+                print "ERROR: Unexpected interface, or type not found. %s" % type_name
 
-    if (self._database.HasDictionary(type_name)):
-      type_data = _idl_type_registry.get('Dictionary')
-    else:
-      type_data = _idl_type_registry.get(type_name)
+            if 'Callback' in interface.ext_attrs:
+                return CallbackIDLTypeInfo(
+                    type_name,
+                    TypeData('Callback',
+                             self._renamer.DartifyTypeName(type_name)))
+            return InterfaceIDLTypeInfo(
+                type_name, TypeData('Interface'),
+                self._renamer.RenameInterface(interface), self)
 
-    if type_data.clazz == 'Interface':
-      if self._database.HasInterface(type_name):
-        dart_interface_name = self._renamer.RenameInterface(
-            self._database.GetInterface(type_name))
-      else:
-        dart_interface_name = self._renamer.DartifyTypeName(type_name)
-      return InterfaceIDLTypeInfo(type_name, type_data, dart_interface_name,
-                                  self)
+        if (self._database.HasDictionary(type_name)):
+            type_data = _idl_type_registry.get('Dictionary')
+        else:
+            type_data = _idl_type_registry.get(type_name)
 
-    if type_data.clazz == 'SVGTearOff':
-      dart_interface_name = self._renamer.RenameInterface(
-          self._database.GetInterface(type_name))
-      return SVGTearOffIDLTypeInfo(
-          type_name, type_data, dart_interface_name, self)
+        if type_data.clazz == 'Interface':
+            if self._database.HasInterface(type_name):
+                dart_interface_name = self._renamer.RenameInterface(
+                    self._database.GetInterface(type_name))
+            else:
+                dart_interface_name = self._renamer.DartifyTypeName(type_name)
+            return InterfaceIDLTypeInfo(type_name, type_data,
+                                        dart_interface_name, self)
 
-    if type_data.clazz == 'TypedList':
-      dart_interface_name = self._renamer.RenameInterfaceId(type_name)
-      return TypedListIDLTypeInfo(
-          type_name, type_data, dart_interface_name, self)
+        if type_data.clazz == 'SVGTearOff':
+            dart_interface_name = self._renamer.RenameInterface(
+                self._database.GetInterface(type_name))
+            return SVGTearOffIDLTypeInfo(type_name, type_data,
+                                         dart_interface_name, self)
 
-    if type_data.clazz == 'BasicTypedList':
-      if type_name == 'ArrayBuffer':
-        dart_interface_name = 'ByteBuffer'
-      else:
-        dart_interface_name = self._renamer.RenameInterfaceId(type_name)
-      return BasicTypedListIDLTypeInfo(
-          type_name, type_data, dart_interface_name, self)
+        if type_data.clazz == 'TypedList':
+            dart_interface_name = self._renamer.RenameInterfaceId(type_name)
+            return TypedListIDLTypeInfo(type_name, type_data,
+                                        dart_interface_name, self)
 
-    class_name = '%sIDLTypeInfo' % type_data.clazz
-    return globals()[class_name](type_name, type_data)
+        if type_data.clazz == 'BasicTypedList':
+            if type_name == 'ArrayBuffer':
+                dart_interface_name = 'ByteBuffer'
+            else:
+                dart_interface_name = self._renamer.RenameInterfaceId(type_name)
+            return BasicTypedListIDLTypeInfo(type_name, type_data,
+                                             dart_interface_name, self)
+
+        class_name = '%sIDLTypeInfo' % type_data.clazz
+        return globals()[class_name](type_name, type_data)
+
 
 def isList(return_type):
-  return return_type.startswith('List<') if return_type else False
+    return return_type.startswith('List<') if return_type else False
+
 
 def get_list_type(return_type):
-  # Get the list type NNNN inside of List<NNNN>
-  return return_type[5:-1] if isList(return_type) else return_type
+    # Get the list type NNNN inside of List<NNNN>
+    return return_type[5:-1] if isList(return_type) else return_type
+
 
 # TODO(jacobr): remove these obsolete methods as we don't actually
 # perform any wrapping.
 def wrap_unwrap_list_blink(return_type, type_registry):
-  """Return True if the type is the list type is a blink know
+    """Return True if the type is the list type is a blink know
      type e.g., List<Node>, List<FontFace>, etc."""
-  if isList(return_type):
-    list_type = get_list_type(return_type)
-    if type_registry.HasInterface(list_type):
-      return True;
+    if isList(return_type):
+        list_type = get_list_type(return_type)
+        if type_registry.HasInterface(list_type):
+            return True
+
 
 def wrap_unwrap_type_blink(return_type, type_registry):
     """Returns True if the type is a blink type that requires wrap_jso or
     unwrap_jso"""
     if return_type and return_type.startswith('Html'):
         return_type = return_type.replace('Html', 'HTML', 1)
-    return (not(return_type) or
-            return_type == 'Object' or
+    return (not (return_type) or return_type == 'Object' or
             return_type == 'dynamic')
 
+
 def wrap_type_blink(return_type, type_registry):
     """Returns True if the type is a blink type that requires wrap_jso but
     NOT unwrap_jso"""
-    return (return_type == 'Map' or
-            return_type == 'Rectangle')
+    return (return_type == 'Map' or return_type == 'Rectangle')
+
 
 def wrap_return_type_blink(return_type, type_name, type_registry):
     """Returns True if we should wrap the returned value. This checks
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index 7f7574c6..824ec92 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -2,7 +2,6 @@
 # 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 module provides shared functionality for the system to generate
 dart:html APIs from the IDL database."""
 
@@ -27,490 +26,507 @@
 # while the subtype (e.g., Window) provides full access to the
 # corresponding objects if there are from the same frame.
 _secure_base_types = {
-  'Window': 'WindowBase',
-  'Location': 'LocationBase',
-  'History': 'HistoryBase',
+    'Window': 'WindowBase',
+    'Location': 'LocationBase',
+    'History': 'HistoryBase',
 }
 
 _custom_factories = [
-  'Notification',
-  'EventSource',
+    'Notification',
+    'EventSource',
 ]
 
+
 class HtmlDartGenerator(object):
-  def __init__(self, interface, options, dart_use_blink, logger):
-    self._dart_use_blink = dart_use_blink
-    self._database = options.database
-    self._interface = interface
-    self._type_registry = options.type_registry
-    self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
-    self._renamer = options.renamer
-    self._metadata = options.metadata
-    self._library_name = self._renamer.GetLibraryName(self._interface)
-    _logger.setLevel(logger.level)
 
-  def EmitSupportCheck(self):
-    if self.HasSupportCheck():
-      check = self.GetSupportCheck()
-      if type(check) != tuple:
-        signature = 'get supported'
-      else:
-        signature = check[0]
-        check = check[1]
-      self._members_emitter.Emit('\n'
-          '  /// Checks if this type is supported on the current platform.\n'
-          '  static bool $SIGNATURE => $SUPPORT_CHECK;\n',
-          SIGNATURE=signature, SUPPORT_CHECK=check)
+    def __init__(self, interface, options, dart_use_blink, logger):
+        self._dart_use_blink = dart_use_blink
+        self._database = options.database
+        self._interface = interface
+        self._type_registry = options.type_registry
+        self._interface_type_info = self._type_registry.TypeInfo(
+            self._interface.id)
+        self._renamer = options.renamer
+        self._metadata = options.metadata
+        self._library_name = self._renamer.GetLibraryName(self._interface)
+        _logger.setLevel(logger.level)
 
-  def EmitEventGetter(self, events_class_name):
-    self._members_emitter.Emit(
-        "EventTarget.removeEventListener, EventTarget.dispatchEvent')"
-        "\n  @deprecated"
-        "\n  $TYPE get on =>\n    new $TYPE(this);\n",
-        TYPE=events_class_name)
+    def EmitSupportCheck(self):
+        if self.HasSupportCheck():
+            check = self.GetSupportCheck()
+            if type(check) != tuple:
+                signature = 'get supported'
+            else:
+                signature = check[0]
+                check = check[1]
+            self._members_emitter.Emit(
+                '\n'
+                '  /// Checks if this type is supported on the current platform.\n'
+                '  static bool $SIGNATURE => $SUPPORT_CHECK;\n',
+                SIGNATURE=signature,
+                SUPPORT_CHECK=check)
 
-  def AddMembers(self, interface, declare_only=False, dart_js_interop=False):
-    if self._interface.id == 'WebGLRenderingContextBase' or self._interface.id == 'WebGL2RenderingContextBase' or \
-        self._interface.id == 'WebGLDrawBuffers':
-      # Constants in classes WebGLRenderingContextBase, WebGL2RenderingContext, WebGLDrawBuffers are consolidated into
-      # one synthesized class (WebGL).
-      self._gl_constants.extend(interface.constants);
-    else:
-      for const in sorted(interface.constants, ConstantOutputOrder):
-        self.AddConstant(const)
+    def EmitEventGetter(self, events_class_name):
+        self._members_emitter.Emit(
+            "EventTarget.removeEventListener, EventTarget.dispatchEvent')"
+            "\n  @deprecated"
+            "\n  $TYPE get on =>\n    new $TYPE(this);\n",
+            TYPE=events_class_name)
 
-    for attr in sorted(interface.attributes, ConstantOutputOrder):
-      if attr.type.id != 'EventHandler' and attr.type.id != 'EventListener':
-        self.AddAttribute(attr, declare_only)
+    def AddMembers(self, interface, declare_only=False, dart_js_interop=False):
+        if self._interface.id == 'WebGLRenderingContextBase' or self._interface.id == 'WebGL2RenderingContextBase' or \
+            self._interface.id == 'WebGLDrawBuffers':
+            # Constants in classes WebGLRenderingContextBase, WebGL2RenderingContext, WebGLDrawBuffers are consolidated into
+            # one synthesized class (WebGL).
+            self._gl_constants.extend(interface.constants)
+        else:
+            for const in sorted(interface.constants, ConstantOutputOrder):
+                self.AddConstant(const)
 
-    # The implementation should define an indexer if the interface directly
-    # extends List.
-    element_type = None
-    requires_indexer = False
-    if self._interface_type_info.list_item_type():
-      self.AddIndexer(self._interface_type_info.list_item_type(),
-                      self._interface_type_info.list_item_type_nullable())
-    else:
-      for parent in self._database.Hierarchy(self._interface):
-        if parent == self._interface:
-          continue
-        parent_type_info = self._type_registry.TypeInfo(parent.id)
-        if parent_type_info.list_item_type():
-          self.AmendIndexer(parent_type_info.list_item_type())
-          break
+        for attr in sorted(interface.attributes, ConstantOutputOrder):
+            if attr.type.id != 'EventHandler' and attr.type.id != 'EventListener':
+                self.AddAttribute(attr, declare_only)
 
-    # Group overloaded operations by name.
-    self._AddRenamedOverloads(interface)
-    operationsByName = self._OperationsByName(interface)
-    if self.OmitOperationOverrides():
-      self._RemoveShadowingOperationsWithSameSignature(operationsByName,
-          interface)
+        # The implementation should define an indexer if the interface directly
+        # extends List.
+        element_type = None
+        requires_indexer = False
+        if self._interface_type_info.list_item_type():
+            self.AddIndexer(self._interface_type_info.list_item_type(),
+                            self._interface_type_info.list_item_type_nullable())
+        else:
+            for parent in self._database.Hierarchy(self._interface):
+                if parent == self._interface:
+                    continue
+                parent_type_info = self._type_registry.TypeInfo(parent.id)
+                if parent_type_info.list_item_type():
+                    self.AmendIndexer(parent_type_info.list_item_type())
+                    break
 
-    # Generate operations.
-    for id in sorted(operationsByName.keys()):
-      operations = operationsByName[id]
-      info = AnalyzeOperation(interface, operations)
-      self.AddOperation(info, declare_only, dart_js_interop)
-      if ('%s.%s' % (interface.id, info.declared_name) in
-          convert_to_future_members):
-        self.AddOperation(ConvertToFuture(info), declare_only)
+        # Group overloaded operations by name.
+        self._AddRenamedOverloads(interface)
+        operationsByName = self._OperationsByName(interface)
+        if self.OmitOperationOverrides():
+            self._RemoveShadowingOperationsWithSameSignature(
+                operationsByName, interface)
 
-  def AddSecondaryMembers(self, interface):
-    secondary_parents = self._database.TransitiveSecondaryParents(interface,
-                          not self._dart_use_blink)
-    remove_duplicate_parents = list(set(secondary_parents))
-    if len(secondary_parents) != len(remove_duplicate_parents):
-      secondary_parents = remove_duplicate_parents
-      parent_list = ", ".join(["  %s" % (parent.id) for parent in secondary_parents])
-      _logger.warn('Interface %s has duplicate parent interfaces %s - ' \
-                   'ignoring duplicates. Please file a bug with the dart:html team.' % (interface.id, parent_list))
+        # Generate operations.
+        for id in sorted(operationsByName.keys()):
+            operations = operationsByName[id]
+            info = AnalyzeOperation(interface, operations)
+            self.AddOperation(info, declare_only, dart_js_interop)
+            if ('%s.%s' % (interface.id,
+                           info.declared_name) in convert_to_future_members):
+                self.AddOperation(ConvertToFuture(info), declare_only)
 
-    for parent_interface in sorted(secondary_parents):
-      if isinstance(parent_interface, str):
-        continue
+    def AddSecondaryMembers(self, interface):
+        secondary_parents = self._database.TransitiveSecondaryParents(
+            interface, not self._dart_use_blink)
+        remove_duplicate_parents = list(set(secondary_parents))
+        if len(secondary_parents) != len(remove_duplicate_parents):
+            secondary_parents = remove_duplicate_parents
+            parent_list = ", ".join(
+                ["  %s" % (parent.id) for parent in secondary_parents])
+            _logger.warn('Interface %s has duplicate parent interfaces %s - ' \
+                         'ignoring duplicates. Please file a bug with the dart:html team.' % (interface.id, parent_list))
 
-      for attr in sorted(parent_interface.attributes, ConstantOutputOrder):
-        if not FindMatchingAttribute(interface, attr):
-          if attr.type.id != 'EventHandler':
-            self.SecondaryContext(parent_interface)
-            self.AddAttribute(attr)
+        for parent_interface in sorted(secondary_parents):
+            if isinstance(parent_interface, str):
+                continue
 
-      # Group overloaded operations by name.
-      operationsByName =self._OperationsByName(parent_interface)
+            for attr in sorted(parent_interface.attributes,
+                               ConstantOutputOrder):
+                if not FindMatchingAttribute(interface, attr):
+                    if attr.type.id != 'EventHandler':
+                        self.SecondaryContext(parent_interface)
+                        self.AddAttribute(attr)
 
-      if self.OmitOperationOverrides():
-        self._RemoveShadowingOperationsWithSameSignature(operationsByName,
-            interface)
+            # Group overloaded operations by name.
+            operationsByName = self._OperationsByName(parent_interface)
 
-      # Generate operations.
-      for id in sorted(operationsByName.keys()):
-        if not any(op.id == id for op in interface.operations):
-          operations = operationsByName[id]
-          info = AnalyzeOperation(interface, operations)
-          self.SecondaryContext(parent_interface)
-          self.AddOperation(info)
+            if self.OmitOperationOverrides():
+                self._RemoveShadowingOperationsWithSameSignature(
+                    operationsByName, interface)
 
-  def _RemoveShadowingOperationsWithSameSignature(self, operationsByName,
-      interface):
-    if not interface.parents:
-      return
+            # Generate operations.
+            for id in sorted(operationsByName.keys()):
+                if not any(op.id == id for op in interface.operations):
+                    operations = operationsByName[id]
+                    info = AnalyzeOperation(interface, operations)
+                    self.SecondaryContext(parent_interface)
+                    self.AddOperation(info)
 
-    parent_name = interface.parents[0].type.id
-    parent = self._database.GetInterface(parent_name)
-    if parent == self._interface or parent == interface:
-      return
+    def _RemoveShadowingOperationsWithSameSignature(self, operationsByName,
+                                                    interface):
+        if not interface.parents:
+            return
 
-    # Never remove operations that are added as a result of an implements they
-    # are pure interfaces (mixins to this interface).
-    if (IsPureInterface(parent_name, self._database)):
-      return
+        parent_name = interface.parents[0].type.id
+        parent = self._database.GetInterface(parent_name)
+        if parent == self._interface or parent == interface:
+            return
 
-    for operation in parent.operations:
-      if operation.id in operationsByName:
-        operations = operationsByName[operation.id]
-        for existing_operation in operations:
-          if existing_operation.SameSignatureAs(operation):
-            del operationsByName[operation.id]
+        # Never remove operations that are added as a result of an implements they
+        # are pure interfaces (mixins to this interface).
+        if (IsPureInterface(parent_name, self._database)):
+            return
 
-  def _AddRenamedOverloads(self, interface):
-    """The IDL has a number of functions with the same name but that accept
+        for operation in parent.operations:
+            if operation.id in operationsByName:
+                operations = operationsByName[operation.id]
+                for existing_operation in operations:
+                    if existing_operation.SameSignatureAs(operation):
+                        del operationsByName[operation.id]
+
+    def _AddRenamedOverloads(self, interface):
+        """The IDL has a number of functions with the same name but that accept
     different types. This is fine for JavaScript, but results in vague type
     signatures for Dart. We rename some of these (by adding a new identical
     operation with a different DartName), but leave the original version as
     well in some cases."""
-    potential_added_operations = set()
-    operations_by_name = self._OperationsByName(interface)
-    already_renamed = [operation.ext_attrs['DartName'] if 'DartName' in
-        operation.ext_attrs else '' for operation in interface.operations]
+        potential_added_operations = set()
+        operations_by_name = self._OperationsByName(interface)
+        already_renamed = [
+            operation.ext_attrs['DartName']
+            if 'DartName' in operation.ext_attrs else ''
+            for operation in interface.operations
+        ]
 
-    added_operations = []
-    for operation in interface.operations:
-      full_operation_str = self._GetStringRepresentation(interface, operation)
-      if (full_operation_str in renamed_overloads and
-          renamed_overloads[full_operation_str] not in already_renamed):
-        if '%s.%s' % (interface.id, operation.id) in overloaded_and_renamed:
-          cloned_operation = deepcopy(operation)
-          cloned_operation.ext_attrs['DartName'] = renamed_overloads[
-              full_operation_str]
-          added_operations.append(cloned_operation)
-        else:
-          dart_name = renamed_overloads[full_operation_str]
-          if not dart_name:
-            continue
+        added_operations = []
+        for operation in interface.operations:
+            full_operation_str = self._GetStringRepresentation(
+                interface, operation)
+            if (full_operation_str in renamed_overloads and
+                    renamed_overloads[full_operation_str] not in already_renamed
+               ):
+                if '%s.%s' % (interface.id,
+                              operation.id) in overloaded_and_renamed:
+                    cloned_operation = deepcopy(operation)
+                    cloned_operation.ext_attrs['DartName'] = renamed_overloads[
+                        full_operation_str]
+                    added_operations.append(cloned_operation)
+                else:
+                    dart_name = renamed_overloads[full_operation_str]
+                    if not dart_name:
+                        continue
 
-          operation.ext_attrs['DartName'] = dart_name
-          potential_added_operations.add(operation.id)
-      self._EnsureNoMultipleTypeSignatures(interface, operation,
-          operations_by_name)
-    interface.operations += added_operations
-    self._AddDesiredOverloadedOperations(potential_added_operations, interface,
-        operations_by_name)
+                    operation.ext_attrs['DartName'] = dart_name
+                    potential_added_operations.add(operation.id)
+            self._EnsureNoMultipleTypeSignatures(interface, operation,
+                                                 operations_by_name)
+        interface.operations += added_operations
+        self._AddDesiredOverloadedOperations(potential_added_operations,
+                                             interface, operations_by_name)
 
-  def _AddDesiredOverloadedOperations(self, potential_added_operations,
-      interface, original_operations_by_name):
-    """For some cases we desire to keep the overloaded version in dart, for
+    def _AddDesiredOverloadedOperations(self, potential_added_operations,
+                                        interface, original_operations_by_name):
+        """For some cases we desire to keep the overloaded version in dart, for
     simplicity of API, and explain the parameters accepted in documentation."""
-    updated_operations_by_name = self._OperationsByName(interface)
-    for operation_id in potential_added_operations:
-      if (operation_id not in updated_operations_by_name and
-          '%s.%s' % (interface.id, operation_id) in keep_overloaded_members):
-        for operation in original_operations_by_name[operation_id]:
-          cloned_operation = deepcopy(operation)
-          cloned_operation.ext_attrs['DartName'] = operation_id
-          interface.operations.append(cloned_operation)
+        updated_operations_by_name = self._OperationsByName(interface)
+        for operation_id in potential_added_operations:
+            if (operation_id not in updated_operations_by_name and '%s.%s' %
+                (interface.id, operation_id) in keep_overloaded_members):
+                for operation in original_operations_by_name[operation_id]:
+                    cloned_operation = deepcopy(operation)
+                    cloned_operation.ext_attrs['DartName'] = operation_id
+                    interface.operations.append(cloned_operation)
 
-  def _EnsureNoMultipleTypeSignatures(self, interface, operation,
-      operations_by_name):
-    """Make sure that there is now at most one operation with a particular
+    def _EnsureNoMultipleTypeSignatures(self, interface, operation,
+                                        operations_by_name):
+        """Make sure that there is now at most one operation with a particular
     operation.id. If not, stop library generation, and throw an error, requiring
     programmer input about the best name change before proceeding."""
-    operation_str = '%s.%s' % (interface.id, operation.id)
+        operation_str = '%s.%s' % (interface.id, operation.id)
 
-    if (operation.id in operations_by_name and
-        len(operations_by_name[operation.id]) > 1 and
-        len(filter(lambda overload: overload.startswith(operation_str),
-            renamed_overloads.keys())) == 0 and
-        operation_str not in keep_overloaded_members and
-        operation_str not in overloaded_and_renamed and
-        operation_str not in renamed_html_members and
-        operation_str not in private_html_members and
-        operation_str not in removed_html_members and
-        operation.id != '__getter__' and
-        operation.id != '__setter__' and
-        operation.id != '__delete__'):
-      _logger.warn('Multiple type signatures for %s.%s. Please file a bug with'
-          ' the dart:html team to determine if one of these functions should be'
-          ' renamed.' % (
-          interface.id, operation.id))
+        if (operation.id in operations_by_name and
+                len(operations_by_name[operation.id]) > 1 and len(
+                    filter(lambda overload: overload.startswith(operation_str),
+                           renamed_overloads.keys())) == 0 and
+                operation_str not in keep_overloaded_members and
+                operation_str not in overloaded_and_renamed and
+                operation_str not in renamed_html_members and
+                operation_str not in private_html_members and
+                operation_str not in removed_html_members and
+                operation.id != '__getter__' and
+                operation.id != '__setter__' and operation.id != '__delete__'):
+            _logger.warn(
+                'Multiple type signatures for %s.%s. Please file a bug with'
+                ' the dart:html team to determine if one of these functions should be'
+                ' renamed.' % (interface.id, operation.id))
 
-  def _GetStringRepresentation(self, interface, operation):
-    """Given an IDLOperation, return a object-independent representation of the
+    def _GetStringRepresentation(self, interface, operation):
+        """Given an IDLOperation, return a object-independent representation of the
     operations's signature."""
-    return '%s.%s(%s)' % (interface.id, operation.id, ', '.join(
-        ['%s %s' % (arg.type.id, arg.id) for arg in operation.arguments]))
+        return '%s.%s(%s)' % (interface.id, operation.id, ', '.join(
+            ['%s %s' % (arg.type.id, arg.id) for arg in operation.arguments]))
 
-  def _OperationsByName(self, interface):
-    operationsByName = {}
-    for operation in interface.operations:
-      name = operation.ext_attrs.get('DartName', operation.id)
-      operationsByName.setdefault(name, []).append(operation)
-    return operationsByName
+    def _OperationsByName(self, interface):
+        operationsByName = {}
+        for operation in interface.operations:
+            name = operation.ext_attrs.get('DartName', operation.id)
+            operationsByName.setdefault(name, []).append(operation)
+        return operationsByName
 
-  def OmitOperationOverrides(self):
-    return False
+    def OmitOperationOverrides(self):
+        return False
 
-  def AddConstant(self, constant):
-    const_name = self._renamer.RenameMember(
-        self._interface.id, constant, constant.id, 'get:', dartify_name=False)
-    if not const_name:
-      return
+    def AddConstant(self, constant):
+        const_name = self._renamer.RenameMember(
+            self._interface.id,
+            constant,
+            constant.id,
+            'get:',
+            dartify_name=False)
+        if not const_name:
+            return
 
-    annotations = self._metadata.GetFormattedMetadata(
-        self._library_name, self._interface, constant.id, '  ')
+        annotations = self._metadata.GetFormattedMetadata(
+            self._library_name, self._interface, constant.id, '  ')
 
-    type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
-    self._members_emitter.Emit(
-        '\n  $(ANNOTATIONS)static const $TYPE$NAME = $VALUE;\n',
-        ANNOTATIONS=annotations,
-        NAME=const_name,
-        TYPE=type,
-        VALUE=constant.value)
+        type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id)
+        self._members_emitter.Emit(
+            '\n  $(ANNOTATIONS)static const $TYPE$NAME = $VALUE;\n',
+            ANNOTATIONS=annotations,
+            NAME=const_name,
+            TYPE=type,
+            VALUE=constant.value)
 
-  def AddAttribute(self, attribute, declare_only=False):
-    """ Adds an attribute to the generated class.
+    def AddAttribute(self, attribute, declare_only=False):
+        """ Adds an attribute to the generated class.
     Arguments:
       attribute - The attribute which is to be added.
       declare_only- True if the attribute should be declared as an abstract
         member and not include invocation code.
     """
-    dom_name = DartDomNameOfAttribute(attribute)
-    attr_name = self._renamer.RenameMember(
-      self._interface.id, attribute, dom_name, 'get:')
-    if not attr_name:
-      return
+        dom_name = DartDomNameOfAttribute(attribute)
+        attr_name = self._renamer.RenameMember(self._interface.id, attribute,
+                                               dom_name, 'get:')
+        if not attr_name:
+            return
 
-    html_setter_name = self._renamer.RenameMember(
-        self._interface.id, attribute, dom_name, 'set:')
-    read_only = (attribute.is_read_only or 'Replaceable' in attribute.ext_attrs
-                 or not html_setter_name)
+        html_setter_name = self._renamer.RenameMember(
+            self._interface.id, attribute, dom_name, 'set:')
+        read_only = (attribute.is_read_only or
+                     'Replaceable' in attribute.ext_attrs or
+                     not html_setter_name)
 
-    # We don't yet handle inconsistent renames of the getter and setter yet.
-    assert(not html_setter_name or attr_name == html_setter_name)
+        # We don't yet handle inconsistent renames of the getter and setter yet.
+        assert (not html_setter_name or attr_name == html_setter_name)
 
-    if declare_only:
-      self.DeclareAttribute(attribute,
-          self.SecureOutputType(attribute.type.id), attr_name, read_only)
-    else:
-      self.EmitAttribute(attribute, attr_name, read_only)
+        if declare_only:
+            self.DeclareAttribute(attribute,
+                                  self.SecureOutputType(attribute.type.id),
+                                  attr_name, read_only)
+        else:
+            self.EmitAttribute(attribute, attr_name, read_only)
 
-  def AddOperation(self, info, declare_only=False, dart_js_interop=False):
-    # TODO(terry): Hack window has 2 overloaded getter one returns Window and
-    #              and other object (we'll always return Window)?
-    if self._interface.id == "Window" and info.name == '__getter__':
-      info.operations[1].type = info.operations[0].type;
-
-    """ Adds an operation to the generated class.
+    def AddOperation(self, info, declare_only=False, dart_js_interop=False):
+        # TODO(terry): Hack window has 2 overloaded getter one returns Window and
+        #              and other object (we'll always return Window)?
+        if self._interface.id == "Window" and info.name == '__getter__':
+            info.operations[1].type = info.operations[0].type
+        """ Adds an operation to the generated class.
     Arguments:
       info - The operation info of the operation to be added.
       declare_only- True if the operation should be declared as an abstract
         member and not include invocation code.
     """
-    # FIXME: When we pass in operations[0] below, we're assuming all
-    # overloaded operations have the same security attributes.  This
-    # is currently true, but we should consider filtering earlier or
-    # merging the relevant data into info itself.
-    method_name = self._renamer.RenameMember(self._interface.id,
-                                             info.operations[0],
-                                             info.name,
-                                             'call:')
-    if not method_name:
-      if info.name == 'item':
-        # FIXME: item should be renamed to operator[], not removed.
-        self.EmitOperation(info, '_item')
-      return
+        # FIXME: When we pass in operations[0] below, we're assuming all
+        # overloaded operations have the same security attributes.  This
+        # is currently true, but we should consider filtering earlier or
+        # merging the relevant data into info itself.
+        method_name = self._renamer.RenameMember(
+            self._interface.id, info.operations[0], info.name, 'call:')
+        if not method_name:
+            if info.name == 'item':
+                # FIXME: item should be renamed to operator[], not removed.
+                self.EmitOperation(info, '_item')
+            return
 
-    if declare_only:
-      self.DeclareOperation(info,
-          self.SecureOutputType(info.type_name), method_name)
-    else:
-      self.EmitOperation(info, method_name, dart_js_interop)
+        if declare_only:
+            self.DeclareOperation(info, self.SecureOutputType(info.type_name),
+                                  method_name)
+        else:
+            self.EmitOperation(info, method_name, dart_js_interop)
 
-  def _GenerateOverloadDispatcher(self,
-      info,
-      signatures,
-      is_void,
-      declaration,
-      generate_call,
-      is_optional,
-      emitter,
-      can_omit_type_check=lambda type, pos: False):
+    def _GenerateOverloadDispatcher(
+            self,
+            info,
+            signatures,
+            is_void,
+            declaration,
+            generate_call,
+            is_optional,
+            emitter,
+            can_omit_type_check=lambda type, pos: False):
 
-    parameter_names = [p.name for p in info.param_infos]
-    number_of_required_in_dart = info.NumberOfRequiredInDart()
+        parameter_names = [p.name for p in info.param_infos]
+        number_of_required_in_dart = info.NumberOfRequiredInDart()
 
-    body_emitter = emitter.Emit(
-        '\n'
-        '  $DECLARATION {\n'
-        '$!BODY'
-        '  }\n',
-        DECLARATION=declaration)
+        body_emitter = emitter.Emit('\n'
+                                    '  $DECLARATION {\n'
+                                    '$!BODY'
+                                    '  }\n',
+                                    DECLARATION=declaration)
 
-    version = [0]
-    def GenerateCall(signature_index, argument_count, checks):
-      if checks:
-        (stmts_emitter, call_emitter) = body_emitter.Emit(
-            '    if ($CHECKS) {\n$!STMTS$!CALL    }\n',
-            INDENT='      ',
-            CHECKS=' && '.join(checks))
-      else:
-        (stmts_emitter, call_emitter) = body_emitter.Emit(
-            '$!STMTS$!CALL',
-            INDENT='    ');
+        version = [0]
 
-      if is_void:
-        call_emitter = call_emitter.Emit('$(INDENT)$!CALL;\n$(INDENT)return;\n')
-      else:
-        call_emitter = call_emitter.Emit('$(INDENT)return $!CALL;\n')
+        def GenerateCall(signature_index, argument_count, checks):
+            if checks:
+                (stmts_emitter, call_emitter) = body_emitter.Emit(
+                    '    if ($CHECKS) {\n$!STMTS$!CALL    }\n',
+                    INDENT='      ',
+                    CHECKS=' && '.join(checks))
+            else:
+                (stmts_emitter, call_emitter) = body_emitter.Emit(
+                    '$!STMTS$!CALL', INDENT='    ')
 
-      version[0] += 1
-      generate_call(stmts_emitter, call_emitter,
-          version[0], signature_index, argument_count)
+            if is_void:
+                call_emitter = call_emitter.Emit(
+                    '$(INDENT)$!CALL;\n$(INDENT)return;\n')
+            else:
+                call_emitter = call_emitter.Emit('$(INDENT)return $!CALL;\n')
 
-    def IsTypeChecking(interface_argument):
-      return 'LegacyInterfaceTypeChecking' in interface_argument.ext_attrs or \
-      self._database.HasInterface(interface_argument.id)
+            version[0] += 1
+            generate_call(stmts_emitter, call_emitter, version[0],
+                          signature_index, argument_count)
 
-    def GenerateChecksAndCall(signature_index, argument_count):
-      checks = []
-      typechecked_interface = IsTypeChecking(self._interface)
+        def IsTypeChecking(interface_argument):
+            return 'LegacyInterfaceTypeChecking' in interface_argument.ext_attrs or \
+            self._database.HasInterface(interface_argument.id)
 
-      for i in reversed(range(0, argument_count)):
-        argument = signatures[signature_index][i]
-        parameter_name = parameter_names[i]
+        def GenerateChecksAndCall(signature_index, argument_count):
+            checks = []
+            typechecked_interface = IsTypeChecking(self._interface)
 
-        test_type = self._NarrowToImplementationType(argument.type.id)
+            for i in reversed(range(0, argument_count)):
+                argument = signatures[signature_index][i]
+                parameter_name = parameter_names[i]
 
-        if test_type in ['dynamic', 'Object']:
-          checks.append('%s != null' % parameter_name)
-        elif not can_omit_type_check(test_type, i):
-          typechecked = typechecked_interface or IsTypeChecking(argument)
-          converts_null = \
-              ('TreatNullAs' in argument.ext_attrs) or \
-              (argument.default_value is not None) or \
-              (argument.default_value_is_null)
-          if argument.type.nullable or converts_null or not typechecked:
-            checks.append('(%s is %s || %s == null)' % (
-                parameter_name, test_type, parameter_name))
-          else:
-            checks.append('(%s is %s)' % (
-                parameter_name, test_type))
-        elif i >= number_of_required_in_dart and not argument.type.nullable:
-          checks.append('%s != null' % parameter_name)
+                test_type = self._NarrowToImplementationType(argument.type.id)
 
-      # There can be multiple presence checks.  We need them all since a later
-      # optional argument could have been passed by name, leaving 'holes'.
-      checks.extend(['%s == null' % name for name in parameter_names[argument_count:]])
+                if test_type in ['dynamic', 'Object']:
+                    checks.append('%s != null' % parameter_name)
+                elif not can_omit_type_check(test_type, i):
+                    typechecked = typechecked_interface or IsTypeChecking(
+                        argument)
+                    converts_null = \
+                        ('TreatNullAs' in argument.ext_attrs) or \
+                        (argument.default_value is not None) or \
+                        (argument.default_value_is_null)
+                    if argument.type.nullable or converts_null or not typechecked:
+                        checks.append(
+                            '(%s is %s || %s == null)' %
+                            (parameter_name, test_type, parameter_name))
+                    else:
+                        checks.append(
+                            '(%s is %s)' % (parameter_name, test_type))
+                elif i >= number_of_required_in_dart and not argument.type.nullable:
+                    checks.append('%s != null' % parameter_name)
 
-      GenerateCall(signature_index, argument_count, checks)
+            # There can be multiple presence checks.  We need them all since a later
+            # optional argument could have been passed by name, leaving 'holes'.
+            checks.extend([
+                '%s == null' % name for name in parameter_names[argument_count:]
+            ])
 
-    # TODO: Optimize the dispatch to avoid repeated checks.
-    if len(signatures) > 1:
-      index_swaps = {}
-      for signature_index, signature in enumerate(signatures):
-        for argument_position, argument in enumerate(signature):
-          if argument.type.id != 'ArrayBuffer':
-            continue
-          candidates = enumerate(
-              signatures[signature_index + 1:], signature_index + 1)
-          for candidate_index, candidate in candidates:
-            if len(candidate) <= argument_position:
-              continue
-            if candidate[argument_position].type.id != 'ArrayBufferView':
-              continue
-            if len(index_swaps):
-              raise Exception('Cannot deal with more than a single swap')
-            index_swaps[candidate_index] = signature_index
-            index_swaps[signature_index] = candidate_index
+            GenerateCall(signature_index, argument_count, checks)
 
-      for signature_index in range(len(signatures)):
-        signature_index = index_swaps.get(signature_index, signature_index)
-        signature = signatures[signature_index]
-        for argument_position, argument in enumerate(signature):
-          if is_optional(signature_index, argument):
-            GenerateChecksAndCall(signature_index, argument_position)
-        GenerateChecksAndCall(signature_index, len(signature))
-      body_emitter.Emit(
-          '    throw new ArgumentError("Incorrect number or type of arguments");'
-          '\n');
-    else:
-      signature = signatures[0]
-      argument_count = len(signature)
-      for argument_position, argument in list(enumerate(signature))[::-1]:
-        if is_optional(0, argument):
-          check = '%s != null' % parameter_names[argument_position]
-          # argument_count instead of argument_position + 1 is used here to cover one
-          # complicated case with the effectively optional argument in the middle.
-          # Consider foo(x, optional y, [Default=NullString] optional z)
-          # (as of now it's modelled after HTMLMediaElement.webkitAddKey).
-          # y is optional in WebCore, while z is not.
-          # In this case, if y was actually passed, we'd like to emit foo(x, y, z) invocation,
-          # not foo(x, y).
-          GenerateCall(0, argument_count, [check])
-          argument_count = argument_position
-      GenerateCall(0, argument_count, [])
+        # TODO: Optimize the dispatch to avoid repeated checks.
+        if len(signatures) > 1:
+            index_swaps = {}
+            for signature_index, signature in enumerate(signatures):
+                for argument_position, argument in enumerate(signature):
+                    if argument.type.id != 'ArrayBuffer':
+                        continue
+                    candidates = enumerate(signatures[signature_index + 1:],
+                                           signature_index + 1)
+                    for candidate_index, candidate in candidates:
+                        if len(candidate) <= argument_position:
+                            continue
+                        if candidate[
+                                argument_position].type.id != 'ArrayBufferView':
+                            continue
+                        if len(index_swaps):
+                            raise Exception(
+                                'Cannot deal with more than a single swap')
+                        index_swaps[candidate_index] = signature_index
+                        index_swaps[signature_index] = candidate_index
 
-  def _GenerateDispatcherBody(self,
-      info,
-      operations,
-      declaration,
-      generate_call,
-      is_optional,
-      can_omit_type_check=lambda type, pos: False):
+            for signature_index in range(len(signatures)):
+                signature_index = index_swaps.get(signature_index,
+                                                  signature_index)
+                signature = signatures[signature_index]
+                for argument_position, argument in enumerate(signature):
+                    if is_optional(signature_index, argument):
+                        GenerateChecksAndCall(signature_index,
+                                              argument_position)
+                GenerateChecksAndCall(signature_index, len(signature))
+            body_emitter.Emit(
+                '    throw new ArgumentError("Incorrect number or type of arguments");'
+                '\n')
+        else:
+            signature = signatures[0]
+            argument_count = len(signature)
+            for argument_position, argument in list(enumerate(signature))[::-1]:
+                if is_optional(0, argument):
+                    check = '%s != null' % parameter_names[argument_position]
+                    # argument_count instead of argument_position + 1 is used here to cover one
+                    # complicated case with the effectively optional argument in the middle.
+                    # Consider foo(x, optional y, [Default=NullString] optional z)
+                    # (as of now it's modelled after HTMLMediaElement.webkitAddKey).
+                    # y is optional in WebCore, while z is not.
+                    # In this case, if y was actually passed, we'd like to emit foo(x, y, z) invocation,
+                    # not foo(x, y).
+                    GenerateCall(0, argument_count, [check])
+                    argument_count = argument_position
+            GenerateCall(0, argument_count, [])
 
-    def GenerateCall(
-        stmts_emitter, call_emitter, version, signature_index, argument_count):
-      generate_call(
-          stmts_emitter, call_emitter,
-          version, operations[signature_index], argument_count)
+    def _GenerateDispatcherBody(self,
+                                info,
+                                operations,
+                                declaration,
+                                generate_call,
+                                is_optional,
+                                can_omit_type_check=lambda type, pos: False):
 
-    def IsOptional(signature_index, argument):
-      return is_optional(argument)
+        def GenerateCall(stmts_emitter, call_emitter, version, signature_index,
+                         argument_count):
+            generate_call(stmts_emitter, call_emitter, version,
+                          operations[signature_index], argument_count)
 
-    emitter = self._members_emitter
+        def IsOptional(signature_index, argument):
+            return is_optional(argument)
 
-    self._GenerateOverloadDispatcher(
-        info,
-        [operation.arguments for operation in operations],
-        operations[0].type.id == 'void',
-        declaration,
-        GenerateCall,
-        IsOptional,
-        emitter,
-        can_omit_type_check)
+        emitter = self._members_emitter
 
-  def AdditionalImplementedInterfaces(self):
-    # TODO: Include all implemented interfaces, including other Lists.
-    implements = []
-    if self._interface_type_info.list_item_type():
-      item_type = self._type_registry.TypeInfo(
-          self._interface_type_info.list_item_type()).dart_type()
-      implements.append('List<%s>' % item_type)
-    return implements
+        self._GenerateOverloadDispatcher(
+            info, [operation.arguments for operation in operations],
+            operations[0].type.id == 'void', declaration, GenerateCall,
+            IsOptional, emitter, can_omit_type_check)
 
-  def Mixins(self):
-    mixins = []
-    if self._interface_type_info.list_item_type():
-      item_type = self._type_registry.TypeInfo(
-          self._interface_type_info.list_item_type()).dart_type()
-      mixins.append('ListMixin<%s>' % item_type)
-      mixins.append('ImmutableListMixin<%s>' % item_type)
+    def AdditionalImplementedInterfaces(self):
+        # TODO: Include all implemented interfaces, including other Lists.
+        implements = []
+        if self._interface_type_info.list_item_type():
+            item_type = self._type_registry.TypeInfo(
+                self._interface_type_info.list_item_type()).dart_type()
+            implements.append('List<%s>' % item_type)
+        return implements
 
-    return mixins
+    def Mixins(self):
+        mixins = []
+        if self._interface_type_info.list_item_type():
+            item_type = self._type_registry.TypeInfo(
+                self._interface_type_info.list_item_type()).dart_type()
+            mixins.append('ListMixin<%s>' % item_type)
+            mixins.append('ImmutableListMixin<%s>' % item_type)
 
+        return mixins
 
-  def AddConstructors(self,
-      constructors, factory_name, factory_constructor_name):
-    """ Adds all of the constructors.
+    def AddConstructors(self, constructors, factory_name,
+                        factory_constructor_name):
+        """ Adds all of the constructors.
     Arguments:
       constructors - List of the constructors to be added.
       factory_name - Name of the factory for this class.
@@ -518,456 +534,489 @@
           factory_name to call (calls an autogenerated FactoryProvider
           if unspecified)
     """
-    for constructor_info in constructors:
-      self._AddConstructor(
-          constructor_info, factory_name, factory_constructor_name)
+        for constructor_info in constructors:
+            self._AddConstructor(constructor_info, factory_name,
+                                 factory_constructor_name)
 
-  def _AddConstructor(self,
-      constructor_info, factory_name, factory_constructor_name):
-    # Hack to ignore the constructor used by JavaScript.
-    if ((self._interface.id == 'HTMLImageElement' or
-         self._interface.id == 'Blob' or
-         self._interface.id == 'DOMException')
-      and not constructor_info.pure_dart_constructor):
-      return
+    def _AddConstructor(self, constructor_info, factory_name,
+                        factory_constructor_name):
+        # Hack to ignore the constructor used by JavaScript.
+        if ((self._interface.id == 'HTMLImageElement' or
+             self._interface.id == 'Blob' or
+             self._interface.id == 'DOMException') and
+                not constructor_info.pure_dart_constructor):
+            return
 
-    if self.GenerateCustomFactory(constructor_info):
-      return
+        if self.GenerateCustomFactory(constructor_info):
+            return
 
-    metadata = self._metadata.GetFormattedMetadata(
-        self._library_name, self._interface, self._interface.id, '  ')
+        metadata = self._metadata.GetFormattedMetadata(
+            self._library_name, self._interface, self._interface.id, '  ')
 
-    if not factory_constructor_name:
-      factory_constructor_name = '_create'
-      factory_parameters = constructor_info.ParametersAsArgumentList()
-    else:
-      factory_parameters = ', '.join(constructor_info.factory_parameters)
-
-    def InputType(type_name):
-      conversion = self._InputConversion(
-          type_name, constructor_info.declared_name)
-      if conversion:
-        return conversion.input_type
-      else:
-        return self._NarrowInputType(type_name) if type_name else 'dynamic'
-
-    if constructor_info.pure_dart_constructor:
-      # TODO(antonm): use common dispatcher generation for this case as well.
-      has_optional = any(param_info.is_optional
-          for param_info in constructor_info.param_infos)
-      factory_call = self.MakeFactoryCall(
-          factory_name, factory_constructor_name, factory_parameters,
-          constructor_info)
-      if not has_optional:
-        self._members_emitter.Emit(
-            '\n  $(METADATA)'
-            'factory $CTOR($PARAMS) => '
-            '$FACTORY_CALL;\n',
-            CTOR=constructor_info._ConstructorFullName(self._DartType),
-            PARAMS=constructor_info.ParametersAsDeclaration(InputType),
-            FACTORY_CALL=factory_call,
-            METADATA=metadata)
-      else:
-        inits = self._members_emitter.Emit(
-            '\n  $(METADATA)'
-            'factory $CONSTRUCTOR($PARAMS) {\n'
-            '    $CONSTRUCTOR e = $FACTORY_CALL;\n'
-            '$!INITS'
-            '    return e;\n'
-            '  }\n',
-            CONSTRUCTOR=constructor_info._ConstructorFullName(self._DartType),
-            METADATA=metadata,
-            FACTORY_CALL=factory_call,
-            PARAMS=constructor_info.ParametersAsDeclaration(InputType))
-
-        for index, param_info in enumerate(constructor_info.param_infos):
-          if param_info.is_optional:
-            inits.Emit('    if ($E != null) e.$E = $E;\n', E=param_info.name)
-    else:
-      custom_factory_ctr = self._interface.id in _custom_factories
-      if self._interface_type_info.has_generated_interface():
-        constructor_full_name = constructor_info._ConstructorFullName(
-          self._DartType)
-      else:
-        # The interface is suppress_interface so use the implementation_name not
-        # the dart_type.
-        constructor_full_name = self._interface_type_info.implementation_name()
-        factory_name = constructor_full_name
-
-      def GenerateCall(
-          stmts_emitter, call_emitter,
-          version, signature_index, argument_count):
-        name = emitter.Format('_create_$VERSION', VERSION=version)
-        arguments = constructor_info.idl_args[signature_index][:argument_count]
-        args = None
-        call_template = ''
-        if self._dart_use_blink:
-            type_ids = [p.type.id for p in arguments]
-            base_name, rs = \
-                self.DeriveNativeEntry("constructorCallback", 'Constructor', argument_count)
-            qualified_name = \
-                self.DeriveQualifiedBlinkName(self._interface.id,
-                                              base_name)
-            args = constructor_info.ParametersAsArgumentList(argument_count)
-
-            # Handle converting Maps to Dictionaries, etc.
-            (factory_params, converted_arguments, calling_params) = self._ConvertArgumentTypes(
-                stmts_emitter, arguments, argument_count, constructor_info)
-            args = ', '.join(converted_arguments)
-            call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
+        if not factory_constructor_name:
+            factory_constructor_name = '_create'
+            factory_parameters = constructor_info.ParametersAsArgumentList()
         else:
-            qualified_name = emitter.Format(
-                '$FACTORY.$NAME',
-                FACTORY=factory_name,
-                NAME=name)
-            (factory_params, converted_arguments, calling_params) = self._ConvertArgumentTypes(
-                stmts_emitter, arguments, argument_count, constructor_info)
-            args = ', '.join(converted_arguments)
-            call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
-        call_emitter.Emit(call_template, FACTORY_NAME=qualified_name, FACTORY_PARAMS=args)
-        self.EmitStaticFactoryOverload(constructor_info, name, arguments)
+            factory_parameters = ', '.join(constructor_info.factory_parameters)
 
-      def IsOptional(signature_index, argument):
-        return self.IsConstructorArgumentOptional(argument)
+        def InputType(type_name):
+            conversion = self._InputConversion(type_name,
+                                               constructor_info.declared_name)
+            if conversion:
+                return conversion.input_type
+            else:
+                return self._NarrowInputType(
+                    type_name) if type_name else 'dynamic'
 
-      entry_declaration = emitter.Format(
-          '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
-          FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
-                           'static %s' % constructor_full_name),
-          CTOR=(('' if not custom_factory_ctr else '_factory')
-                + constructor_full_name),
-          METADATA=metadata,
-          PARAMS=constructor_info.ParametersAsDeclaration(InputType))
+        if constructor_info.pure_dart_constructor:
+            # TODO(antonm): use common dispatcher generation for this case as well.
+            has_optional = any(param_info.is_optional
+                               for param_info in constructor_info.param_infos)
+            factory_call = self.MakeFactoryCall(
+                factory_name, factory_constructor_name, factory_parameters,
+                constructor_info)
+            if not has_optional:
+                self._members_emitter.Emit(
+                    '\n  $(METADATA)'
+                    'factory $CTOR($PARAMS) => '
+                    '$FACTORY_CALL;\n',
+                    CTOR=constructor_info._ConstructorFullName(self._DartType),
+                    PARAMS=constructor_info.ParametersAsDeclaration(InputType),
+                    FACTORY_CALL=factory_call,
+                    METADATA=metadata)
+            else:
+                inits = self._members_emitter.Emit(
+                    '\n  $(METADATA)'
+                    'factory $CONSTRUCTOR($PARAMS) {\n'
+                    '    $CONSTRUCTOR e = $FACTORY_CALL;\n'
+                    '$!INITS'
+                    '    return e;\n'
+                    '  }\n',
+                    CONSTRUCTOR=constructor_info._ConstructorFullName(
+                        self._DartType),
+                    METADATA=metadata,
+                    FACTORY_CALL=factory_call,
+                    PARAMS=constructor_info.ParametersAsDeclaration(InputType))
 
-      overload_emitter = self._members_emitter
-      overload_declaration = entry_declaration
+                for index, param_info in enumerate(
+                        constructor_info.param_infos):
+                    if param_info.is_optional:
+                        inits.Emit(
+                            '    if ($E != null) e.$E = $E;\n',
+                            E=param_info.name)
+        else:
+            custom_factory_ctr = self._interface.id in _custom_factories
+            if self._interface_type_info.has_generated_interface():
+                constructor_full_name = constructor_info._ConstructorFullName(
+                    self._DartType)
+            else:
+                # The interface is suppress_interface so use the implementation_name not
+                # the dart_type.
+                constructor_full_name = self._interface_type_info.implementation_name(
+                )
+                factory_name = constructor_full_name
 
-      self._GenerateOverloadDispatcher(
-          constructor_info,
-          constructor_info.idl_args,
-          False,
-          overload_declaration,
-          GenerateCall,
-          IsOptional,
-          overload_emitter)
+            def GenerateCall(stmts_emitter, call_emitter, version,
+                             signature_index, argument_count):
+                name = emitter.Format('_create_$VERSION', VERSION=version)
+                arguments = constructor_info.idl_args[
+                    signature_index][:argument_count]
+                args = None
+                call_template = ''
+                if self._dart_use_blink:
+                    type_ids = [p.type.id for p in arguments]
+                    base_name, rs = \
+                        self.DeriveNativeEntry("constructorCallback", 'Constructor', argument_count)
+                    qualified_name = \
+                        self.DeriveQualifiedBlinkName(self._interface.id,
+                                                      base_name)
+                    args = constructor_info.ParametersAsArgumentList(
+                        argument_count)
 
-  def _AddFutureifiedOperation(self, info, html_name):
-    """Given a API function that uses callbacks, convert it to using Futures.
+                    # Handle converting Maps to Dictionaries, etc.
+                    (factory_params, converted_arguments,
+                     calling_params) = self._ConvertArgumentTypes(
+                         stmts_emitter, arguments, argument_count,
+                         constructor_info)
+                    args = ', '.join(converted_arguments)
+                    call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
+                else:
+                    qualified_name = emitter.Format(
+                        '$FACTORY.$NAME', FACTORY=factory_name, NAME=name)
+                    (factory_params, converted_arguments,
+                     calling_params) = self._ConvertArgumentTypes(
+                         stmts_emitter, arguments, argument_count,
+                         constructor_info)
+                    args = ', '.join(converted_arguments)
+                    call_template = '$FACTORY_NAME($FACTORY_PARAMS)'
+                call_emitter.Emit(
+                    call_template,
+                    FACTORY_NAME=qualified_name,
+                    FACTORY_PARAMS=args)
+                self.EmitStaticFactoryOverload(constructor_info, name,
+                                               arguments)
+
+            def IsOptional(signature_index, argument):
+                return self.IsConstructorArgumentOptional(argument)
+
+            entry_declaration = emitter.Format(
+                '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)',
+                FACTORY_KEYWORD=('factory' if not custom_factory_ctr else
+                                 'static %s' % constructor_full_name),
+                CTOR=(('' if not custom_factory_ctr else '_factory') +
+                      constructor_full_name),
+                METADATA=metadata,
+                PARAMS=constructor_info.ParametersAsDeclaration(InputType))
+
+            overload_emitter = self._members_emitter
+            overload_declaration = entry_declaration
+
+            self._GenerateOverloadDispatcher(constructor_info,
+                                             constructor_info.idl_args, False,
+                                             overload_declaration, GenerateCall,
+                                             IsOptional, overload_emitter)
+
+    def _AddFutureifiedOperation(self, info, html_name):
+        """Given a API function that uses callbacks, convert it to using Futures.
 
     This conversion assumes the success callback is always provided before the
     error callback (and so far in the DOM API, this is the case)."""
-    callback_info = GetCallbackInfo(
-        self._database.GetInterface(info.callback_args[0].type_id))
+        callback_info = GetCallbackInfo(
+            self._database.GetInterface(info.callback_args[0].type_id))
 
-    # Generated private members never have named arguments.
-    ignore_named_parameters = True if html_name.startswith('_') else False
+        # Generated private members never have named arguments.
+        ignore_named_parameters = True if html_name.startswith('_') else False
 
-    # If more than one callback then the second argument is the error callback.
-    # Some error callbacks have 2 args (e.g., executeSql) where the second arg
-    # is the error - this is the argument we want.
-    error_callback = ""
-    if len(info.callback_args) > 1:
-      error_callback_info = GetCallbackInfo(
-            self._database.GetInterface(info.callback_args[1].type_id))
-      error_callbackNames = []
-      for paramInfo in error_callback_info.param_infos:
-          error_callbackNames.append(paramInfo.name)
-      errorCallbackVariables = ", ".join(error_callbackNames)
-      errorName = error_callback_info.param_infos[-1].name
-      error_callback = (',\n        %s(%s) { completer.completeError(%s); }' %
-                        (('%s : ' % info.callback_args[1].name
-                          if info.requires_named_arguments and
-                             info.callback_args[1].is_optional and not(ignore_named_parameters) else ''),
-                         errorCallbackVariables, errorName))
+        # If more than one callback then the second argument is the error callback.
+        # Some error callbacks have 2 args (e.g., executeSql) where the second arg
+        # is the error - this is the argument we want.
+        error_callback = ""
+        if len(info.callback_args) > 1:
+            error_callback_info = GetCallbackInfo(
+                self._database.GetInterface(info.callback_args[1].type_id))
+            error_callbackNames = []
+            for paramInfo in error_callback_info.param_infos:
+                error_callbackNames.append(paramInfo.name)
+            errorCallbackVariables = ", ".join(error_callbackNames)
+            errorName = error_callback_info.param_infos[-1].name
+            error_callback = (
+                ',\n        %s(%s) { completer.completeError(%s); }' % (
+                    ('%s : ' % info.callback_args[1].name
+                     if info.requires_named_arguments and
+                     info.callback_args[1].is_optional and
+                     not (ignore_named_parameters) else ''),
+                    errorCallbackVariables, errorName))
 
-    extensions = GetDDC_Extension(self._interface, info.declared_name)
-    if extensions:
-      ddc_extensions = "\n".join(extensions);
-    else:
-      ddc_extensions = ''
-
-    # Some callbacks have more than one parameters.  If so use all of
-    # those parameters.  However, if more than one argument use the
-    # type of the last argument to be returned e.g., executeSql the callback
-    # is (transaction, resultSet) and only the resultSet is returned SqlResultSet.
-    callbackArgsLen = len(callback_info.param_infos)
-    future_generic = ''
-    callbackVariables = ''
-    completerVariable = ''
-    if callbackArgsLen == 1:
-      callbackVariables = 'value'
-      completerVariable = callbackVariables
-      if callback_info.param_infos[0].type_id:
-        future_generic = '<%s>' % self._DartType(callback_info.param_infos[0].type_id)
-    elif callbackArgsLen > 1:
-      callbackNames = []
-      for paramInfo in callback_info.param_infos:
-        callbackNames.append(paramInfo.name)
-      callbackVariables = ",".join(callbackNames)
-      completerVariable = callbackNames[-1]
-      future_generic = '<%s>' % self._DartType(callback_info.param_infos[-1].type_id)
-
-    param_list = info.ParametersAsArgumentList(None, ignore_named_parameters)
-    dictionary_argument = info.dictionaryArgumentName();
-
-    convert_map = ''
-    if dictionary_argument is not None:
-      mapArg = dictionary_argument[0]
-      tempVariable = '%s_dict' % mapArg
-      mapArgOptional = dictionary_argument[1]
-
-      if not(extensions):
-        if not(param_list.endswith(', mapArg') or param_list.endswith(', options') or param_list == mapArg):
-          print "ERROR: %s.%s - Last parameter or only parameter %s is not of type Map" % (self._interface.id, html_name, mapArg)
-        param_list = '%s_dict' % param_list
-
-        if mapArgOptional:
-          convert_map = '    var %s = null;\n'\
-                        '    if (%s != null) {\n'\
-                        '      %s = convertDartToNative_Dictionary(%s);\n'\
-                        '    }\n' % (tempVariable, mapArg, tempVariable, mapArg)
+        extensions = GetDDC_Extension(self._interface, info.declared_name)
+        if extensions:
+            ddc_extensions = "\n".join(extensions)
         else:
-          convert_map = '    var %s = convertDartToNative_Dictionary(%s);\n' % (tempVariable, mapArg)
+            ddc_extensions = ''
 
-    metadata = ''
-    if '_RenamingAnnotation' in dir(self):
-      metadata = (self._RenamingAnnotation(info.declared_name, html_name) +
-          self._Metadata(info.type_name, info.declared_name, None))
-    self._members_emitter.Emit(
-        '\n'
-        '  $METADATA$MODIFIERS$TYPE$FUTURE_GENERIC $NAME($PARAMS) {\n'
-        '    $CONVERT_DICTIONARY'
-        '    var completer = new Completer$(FUTURE_GENERIC)();\n'
-        '    $ORIGINAL_FUNCTION($PARAMS_LIST\n'
-        '        $NAMED_PARAM($VARIABLE_NAME) { '
-        '$DDC_EXTENSION\n'
-        'completer.complete($COMPLETER_NAME); }'
-        '$ERROR_CALLBACK);\n'
-        '    return completer.future;\n'
-        '  }\n',
-        METADATA=metadata,
-        MODIFIERS='static ' if info.IsStatic() else '',
-        TYPE=self.SecureOutputType(info.type_name),
-        NAME=html_name[1:],
-        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType
-            if '_NarrowInputType' in dir(self) else self._DartType),
-        CONVERT_DICTIONARY=convert_map,
-        PARAMS_LIST='' if param_list == '' else param_list + ',',
-        NAMED_PARAM=('%s : ' % info.callback_args[0].name
-            if info.requires_named_arguments and
-              info.callback_args[0].is_optional and not(ignore_named_parameters) else ''),
-        VARIABLE_NAME=callbackVariables,
-        COMPLETER_NAME=completerVariable,
-        DDC_EXTENSION=ddc_extensions,
-        ERROR_CALLBACK=error_callback,
-        FUTURE_GENERIC=future_generic,
-        ORIGINAL_FUNCTION=html_name)
+        # Some callbacks have more than one parameters.  If so use all of
+        # those parameters.  However, if more than one argument use the
+        # type of the last argument to be returned e.g., executeSql the callback
+        # is (transaction, resultSet) and only the resultSet is returned SqlResultSet.
+        callbackArgsLen = len(callback_info.param_infos)
+        future_generic = ''
+        callbackVariables = ''
+        completerVariable = ''
+        if callbackArgsLen == 1:
+            callbackVariables = 'value'
+            completerVariable = callbackVariables
+            if callback_info.param_infos[0].type_id:
+                future_generic = '<%s>' % self._DartType(
+                    callback_info.param_infos[0].type_id)
+        elif callbackArgsLen > 1:
+            callbackNames = []
+            for paramInfo in callback_info.param_infos:
+                callbackNames.append(paramInfo.name)
+            callbackVariables = ",".join(callbackNames)
+            completerVariable = callbackNames[-1]
+            future_generic = '<%s>' % self._DartType(
+                callback_info.param_infos[-1].type_id)
 
-  def EmitHelpers(self, base_class):
-    if not self._members_emitter:
-      return
+        param_list = info.ParametersAsArgumentList(None,
+                                                   ignore_named_parameters)
+        dictionary_argument = info.dictionaryArgumentName()
 
-    if self._interface.id not in custom_html_constructors:
-      self._members_emitter.Emit(
-          '  // To suppress missing implicit constructor warnings.\n'
-          '  factory $CLASSNAME._() { '
-          'throw new UnsupportedError("Not supported"); }\n',
-          CLASSNAME=self._interface_type_info.implementation_name())
+        convert_map = ''
+        if dictionary_argument is not None:
+            mapArg = dictionary_argument[0]
+            tempVariable = '%s_dict' % mapArg
+            mapArgOptional = dictionary_argument[1]
 
-  def DeclareAttribute(self, attribute, type_name, attr_name, read_only):
-    """ Declares an attribute but does not include the code to invoke it.
+            if not (extensions):
+                if not (param_list.endswith(', mapArg') or
+                        param_list.endswith(', options') or
+                        param_list == mapArg):
+                    print "ERROR: %s.%s - Last parameter or only parameter %s is not of type Map" % (
+                        self._interface.id, html_name, mapArg)
+                param_list = '%s_dict' % param_list
+
+                if mapArgOptional:
+                    convert_map = '    var %s = null;\n'\
+                                  '    if (%s != null) {\n'\
+                                  '      %s = convertDartToNative_Dictionary(%s);\n'\
+                                  '    }\n' % (tempVariable, mapArg, tempVariable, mapArg)
+                else:
+                    convert_map = '    var %s = convertDartToNative_Dictionary(%s);\n' % (
+                        tempVariable, mapArg)
+
+        metadata = ''
+        if '_RenamingAnnotation' in dir(self):
+            metadata = (
+                self._RenamingAnnotation(info.declared_name, html_name) +
+                self._Metadata(info.type_name, info.declared_name, None))
+        self._members_emitter.Emit(
+            '\n'
+            '  $METADATA$MODIFIERS$TYPE$FUTURE_GENERIC $NAME($PARAMS) {\n'
+            '    $CONVERT_DICTIONARY'
+            '    var completer = new Completer$(FUTURE_GENERIC)();\n'
+            '    $ORIGINAL_FUNCTION($PARAMS_LIST\n'
+            '        $NAMED_PARAM($VARIABLE_NAME) { '
+            '$DDC_EXTENSION\n'
+            'completer.complete($COMPLETER_NAME); }'
+            '$ERROR_CALLBACK);\n'
+            '    return completer.future;\n'
+            '  }\n',
+            METADATA=metadata,
+            MODIFIERS='static ' if info.IsStatic() else '',
+            TYPE=self.SecureOutputType(info.type_name),
+            NAME=html_name[1:],
+            PARAMS=info.
+            ParametersAsDeclaration(self._NarrowInputType if '_NarrowInputType'
+                                    in dir(self) else self._DartType),
+            CONVERT_DICTIONARY=convert_map,
+            PARAMS_LIST='' if param_list == '' else param_list + ',',
+            NAMED_PARAM=('%s : ' % info.callback_args[0].name
+                         if info.requires_named_arguments and
+                         info.callback_args[0].is_optional and
+                         not (ignore_named_parameters) else ''),
+            VARIABLE_NAME=callbackVariables,
+            COMPLETER_NAME=completerVariable,
+            DDC_EXTENSION=ddc_extensions,
+            ERROR_CALLBACK=error_callback,
+            FUTURE_GENERIC=future_generic,
+            ORIGINAL_FUNCTION=html_name)
+
+    def EmitHelpers(self, base_class):
+        if not self._members_emitter:
+            return
+
+        if self._interface.id not in custom_html_constructors:
+            self._members_emitter.Emit(
+                '  // To suppress missing implicit constructor warnings.\n'
+                '  factory $CLASSNAME._() { '
+                'throw new UnsupportedError("Not supported"); }\n',
+                CLASSNAME=self._interface_type_info.implementation_name())
+
+    def DeclareAttribute(self, attribute, type_name, attr_name, read_only):
+        """ Declares an attribute but does not include the code to invoke it.
     """
-    if read_only:
-      # HACK(terry): Element is not abstract for Dartium so isContentEditable
-      # must have a body see impl_Element.darttemplate
-      if (self._interface.id == 'Element' and
-          attr_name == 'isContentEditable' and
-          self._dart_js_interop):
-        return
-      else:
-        template = '\n  $TYPE get $NAME;\n'
-    else:
-      template = '\n  $TYPE $NAME;\n'
+        if read_only:
+            # HACK(terry): Element is not abstract for Dartium so isContentEditable
+            # must have a body see impl_Element.darttemplate
+            if (self._interface.id == 'Element' and
+                    attr_name == 'isContentEditable' and self._dart_js_interop):
+                return
+            else:
+                template = '\n  $TYPE get $NAME;\n'
+        else:
+            template = '\n  $TYPE $NAME;\n'
 
-    self._members_emitter.Emit(template,
-        NAME=attr_name,
-        TYPE=type_name)
+        self._members_emitter.Emit(template, NAME=attr_name, TYPE=type_name)
 
-  def DeclareOperation(self, operation, return_type_name, method_name):
-    """ Declares an operation but does not include the code to invoke it.
+    def DeclareOperation(self, operation, return_type_name, method_name):
+        """ Declares an operation but does not include the code to invoke it.
     Arguments:
       operation - The operation to be declared.
       return_type_name - The name of the return type.
       method_name - The name of the method.
     """
-      # HACK(terry): Element is not abstract for Dartium so click
-      # must have a body see impl_Element.darttemplate
-    if (self._interface.id == 'Element' and
-        method_name == 'click' and
-        self._dart_js_interop):
-      return
-    else:
-      template = '\n  $TYPE $NAME($PARAMS);\n'
+        # HACK(terry): Element is not abstract for Dartium so click
+        # must have a body see impl_Element.darttemplate
+        if (self._interface.id == 'Element' and method_name == 'click' and
+                self._dart_js_interop):
+            return
+        else:
+            template = '\n  $TYPE $NAME($PARAMS);\n'
 
-    self._members_emitter.Emit(
-             template,
-             TYPE=return_type_name,
-             NAME=method_name,
-             PARAMS=operation.ParametersAsDeclaration(self._DartType))
+        self._members_emitter.Emit(
+            template,
+            TYPE=return_type_name,
+            NAME=method_name,
+            PARAMS=operation.ParametersAsDeclaration(self._DartType))
 
-  def EmitListMixin(self, element_name, nullable):
-    # TODO(sra): Use separate mixins for mutable implementations of List<T>.
-    # TODO(sra): Use separate mixins for typed array implementations of List<T>.
-    template_file = 'immutable_list_mixin.darttemplate'
-    has_length = False
-    has_length_setter = False
+    def EmitListMixin(self, element_name, nullable):
+        # TODO(sra): Use separate mixins for mutable implementations of List<T>.
+        # TODO(sra): Use separate mixins for typed array implementations of List<T>.
+        template_file = 'immutable_list_mixin.darttemplate'
+        has_length = False
+        has_length_setter = False
 
-    def _HasExplicitIndexedGetter(self):
-      return any(op.id == 'getItem' for op in self._interface.operations)
+        def _HasExplicitIndexedGetter(self):
+            return any(op.id == 'getItem' for op in self._interface.operations)
 
-    def _HasCustomIndexedGetter(self):
-      return 'CustomIndexedGetter' in self._interface.ext_attrs
+        def _HasCustomIndexedGetter(self):
+            return 'CustomIndexedGetter' in self._interface.ext_attrs
 
-    def _HasNativeIndexedGetter(self):
-      return not (_HasCustomIndexedGetter(self) or _HasExplicitIndexedGetter(self))
+        def _HasNativeIndexedGetter(self):
+            return not (_HasCustomIndexedGetter(self) or
+                        _HasExplicitIndexedGetter(self))
 
-    if _HasExplicitIndexedGetter(self):
-      getter_name = 'getItem'
-    else:
-      getter_name = '_nativeIndexedGetter'
+        if _HasExplicitIndexedGetter(self):
+            getter_name = 'getItem'
+        else:
+            getter_name = '_nativeIndexedGetter'
 
-    for attr in self._interface.attributes:
-      if attr.id == 'length':
-        has_length = True
-        has_length_setter = not attr.is_read_only
+        for attr in self._interface.attributes:
+            if attr.id == 'length':
+                has_length = True
+                has_length_setter = not attr.is_read_only
 
-    has_num_items = any(attr.id == 'numberOfItems'
-        for attr in self._interface.attributes)
+        has_num_items = any(
+            attr.id == 'numberOfItems' for attr in self._interface.attributes)
 
-    template = self._template_loader.Load(
-        template_file,
-        {
-          'DEFINE_LENGTH_AS_NUM_ITEMS': not has_length and has_num_items,
-          'DEFINE_LENGTH_SETTER': not has_length_setter,
-          'USE_NATIVE_INDEXED_GETTER': _HasNativeIndexedGetter(self) or _HasExplicitIndexedGetter(self),
-        })
-    if nullable:
-        element_js = element_name + "|Null"
-    else:
-        element_js = element_name
-    self._members_emitter.Emit(template, E=element_name, EJS=element_js,
-                               GETTER=getter_name)
+        template = self._template_loader.Load(
+            template_file, {
+                'DEFINE_LENGTH_AS_NUM_ITEMS':
+                not has_length and has_num_items,
+                'DEFINE_LENGTH_SETTER':
+                not has_length_setter,
+                'USE_NATIVE_INDEXED_GETTER':
+                _HasNativeIndexedGetter(self) or
+                _HasExplicitIndexedGetter(self),
+            })
+        if nullable:
+            element_js = element_name + "|Null"
+        else:
+            element_js = element_name
+        self._members_emitter.Emit(
+            template, E=element_name, EJS=element_js, GETTER=getter_name)
 
-  def SecureOutputType(self, type_name, is_dart_type=False,
-      can_narrow_type=False):
-    """ Converts the type name to the secure type name for return types.
+    def SecureOutputType(self,
+                         type_name,
+                         is_dart_type=False,
+                         can_narrow_type=False):
+        """ Converts the type name to the secure type name for return types.
     Arguments:
       can_narrow_type - True if the output type can be narrowed further than
         what would be accepted for input, used to narrow num APIs down to double
         or int.
     """
-    if is_dart_type:
-      dart_name = type_name
-    else:
-      type_info = self._TypeInfo(type_name)
-      dart_name = type_info.dart_type()
-      if can_narrow_type and dart_name == 'num':
-        dart_name = type_info.native_type()
-
-    # We only need to secure Window.  Only local History and Location are
-    # returned in generated code.
-    assert(dart_name != 'HistoryBase' and dart_name != 'LocationBase')
-    if dart_name == 'Window':
-      return _secure_base_types[dart_name]
-    return dart_name
-
-  def SecureBaseName(self, type_name):
-    if type_name in _secure_base_types:
-      return _secure_base_types[type_name]
-
-  def is_DOM_type(self, type_name):
-    try:
-        self._type_registry.TypeInfo(type_name)
-        return True
-    except RuntimeError:
-        return False
-
-  def _NarrowToImplementationType(self, type_name):
-    return self._type_registry.TypeInfo(type_name).narrow_dart_type()
-
-  def _NarrowInputType(self, type_name):
-    return self._NarrowToImplementationType(type_name)
-
-  def _DartType(self, type_name):
-    return self._type_registry.DartType(type_name)
-
-  def _TypeInfo(self, type_name):
-    return self._type_registry.TypeInfo(type_name)
-
-  def _CallbackConvert(self, argType, info):
-    if self._database.HasInterface(argType):
-      interface = self._database.GetInterface(argType)
-      if "Callback" in interface.ext_attrs:
-          return interface.ext_attrs['Callback']
-    return None
-
-  def _ConvertArgumentTypes(self, stmts_emitter, arguments, argument_count, info):
-    temp_version = [0]
-    converted_arguments = []
-    target_parameters = []
-    calling_parameters = []
-    for position, arg in enumerate(arguments[:argument_count]):
-      callBackInfo = self._CallbackConvert(arg.type.id, info)   # Returns callback arity (# of parameters)
-      if callBackInfo is None:
-        conversion = self._InputConversion(arg.type.id, info.declared_name)
-      else:
-        conversion = self._InputConversion('Callback', info.declared_name)
-
-      param_name = arguments[position].id
-      if conversion:
-        temp_version[0] += 1
-        temp_name = '%s_%s' % (param_name, temp_version[0])
-        temp_type = conversion.output_type
-        stmts_emitter.Emit(
-            '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n' if callBackInfo is None else '$(INDENT)$TYPE $NAME = $CONVERT($ARG, $ARITY);\n',
-            TYPE=TypeOrVar(temp_type),
-            NAME=temp_name,
-            CONVERT=conversion.function_name,
-            ARG=info.param_infos[position].name,
-            ARITY=callBackInfo)
-        converted_arguments.append(temp_name)
-        param_type = temp_type
-        verified_type = temp_type  # verified by assignment in checked mode.
-      else:
-        converted_arguments.append(info.param_infos[position].name)
-        if self._database.HasTypeDef(arg.type.id):
-          param_type = 'dynamic'
+        if is_dart_type:
+            dart_name = type_name
         else:
-          param_type = self._NarrowInputType(arg.type.id)
-          # Verified by argument checking on entry to the dispatcher.
+            type_info = self._TypeInfo(type_name)
+            dart_name = type_info.dart_type()
+            if can_narrow_type and dart_name == 'num':
+                dart_name = type_info.native_type()
 
-          verified_type = self._InputType(
-              info.param_infos[position].type_id, info)
-          # The native method does not need an argument type if we know the type.
-          # But we do need the native methods to have correct function types, so
-          # be conservative.
-          if param_type == verified_type:
-            if param_type in ['String', 'num', 'int', 'double', 'bool', 'Object']:
-              param_type = 'dynamic'
+        # We only need to secure Window.  Only local History and Location are
+        # returned in generated code.
+        assert (dart_name != 'HistoryBase' and dart_name != 'LocationBase')
+        if dart_name == 'Window':
+            return _secure_base_types[dart_name]
+        return dart_name
 
-      target_parameters.append(
-          '%s%s' % (TypeOrNothing(param_type), param_name))
-      calling_parameters.append(',%s ' % param_name)
+    def SecureBaseName(self, type_name):
+        if type_name in _secure_base_types:
+            return _secure_base_types[type_name]
 
-    return target_parameters, converted_arguments, calling_parameters
+    def is_DOM_type(self, type_name):
+        try:
+            self._type_registry.TypeInfo(type_name)
+            return True
+        except RuntimeError:
+            return False
 
-  def _InputType(self, type_name, info):
-    conversion = self._InputConversion(type_name, info.declared_name)
-    if conversion:
-      return conversion.input_type
-    else:
-      # If typedef it's a union return dynamic.
-      if self._database.HasTypeDef(type_name):
-        return 'dynamic'
-      else:
-        return self._NarrowInputType(type_name) if type_name else 'dynamic'
+    def _NarrowToImplementationType(self, type_name):
+        return self._type_registry.TypeInfo(type_name).narrow_dart_type()
+
+    def _NarrowInputType(self, type_name):
+        return self._NarrowToImplementationType(type_name)
+
+    def _DartType(self, type_name):
+        return self._type_registry.DartType(type_name)
+
+    def _TypeInfo(self, type_name):
+        return self._type_registry.TypeInfo(type_name)
+
+    def _CallbackConvert(self, argType, info):
+        if self._database.HasInterface(argType):
+            interface = self._database.GetInterface(argType)
+            if "Callback" in interface.ext_attrs:
+                return interface.ext_attrs['Callback']
+        return None
+
+    def _ConvertArgumentTypes(self, stmts_emitter, arguments, argument_count,
+                              info):
+        temp_version = [0]
+        converted_arguments = []
+        target_parameters = []
+        calling_parameters = []
+        for position, arg in enumerate(arguments[:argument_count]):
+            callBackInfo = self._CallbackConvert(
+                arg.type.id, info)  # Returns callback arity (# of parameters)
+            if callBackInfo is None:
+                conversion = self._InputConversion(arg.type.id,
+                                                   info.declared_name)
+            else:
+                conversion = self._InputConversion('Callback',
+                                                   info.declared_name)
+
+            param_name = arguments[position].id
+            if conversion:
+                temp_version[0] += 1
+                temp_name = '%s_%s' % (param_name, temp_version[0])
+                temp_type = conversion.output_type
+                stmts_emitter.Emit(
+                    '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n'
+                    if callBackInfo is None else
+                    '$(INDENT)$TYPE $NAME = $CONVERT($ARG, $ARITY);\n',
+                    TYPE=TypeOrVar(temp_type),
+                    NAME=temp_name,
+                    CONVERT=conversion.function_name,
+                    ARG=info.param_infos[position].name,
+                    ARITY=callBackInfo)
+                converted_arguments.append(temp_name)
+                param_type = temp_type
+                verified_type = temp_type  # verified by assignment in checked mode.
+            else:
+                converted_arguments.append(info.param_infos[position].name)
+                if self._database.HasTypeDef(arg.type.id):
+                    param_type = 'dynamic'
+                else:
+                    param_type = self._NarrowInputType(arg.type.id)
+                    # Verified by argument checking on entry to the dispatcher.
+
+                    verified_type = self._InputType(
+                        info.param_infos[position].type_id, info)
+                    # The native method does not need an argument type if we know the type.
+                    # But we do need the native methods to have correct function types, so
+                    # be conservative.
+                    if param_type == verified_type:
+                        if param_type in [
+                                'String', 'num', 'int', 'double', 'bool',
+                                'Object'
+                        ]:
+                            param_type = 'dynamic'
+
+            target_parameters.append(
+                '%s%s' % (TypeOrNothing(param_type), param_name))
+            calling_parameters.append(',%s ' % param_name)
+
+        return target_parameters, converted_arguments, calling_parameters
+
+    def _InputType(self, type_name, info):
+        conversion = self._InputConversion(type_name, info.declared_name)
+        if conversion:
+            return conversion.input_type
+        else:
+            # If typedef it's a union return dynamic.
+            if self._database.HasTypeDef(type_name):
+                return 'dynamic'
+            else:
+                return self._NarrowInputType(
+                    type_name) if type_name else 'dynamic'
diff --git a/tools/dom/scripts/htmleventgenerator.py b/tools/dom/scripts/htmleventgenerator.py
index 827a79d..f9c14c4 100644
--- a/tools/dom/scripts/htmleventgenerator.py
+++ b/tools/dom/scripts/htmleventgenerator.py
@@ -2,7 +2,6 @@
 # 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 module provides functionality to generate dart:html event classes."""
 
 import logging
@@ -14,424 +13,456 @@
 # We can automatically extract most event names by checking for
 # onEventName methods in the IDL but some events aren't listed so we need
 # to manually add them here so that they are easy for users to find.
-_html_manual_events = monitored.Dict('htmleventgenerator._html_manual_events', {
-  'Element': ['ontouchleave', 'ontouchenter', 'ontransitionend'],
-  'HTMLCanvasElement': ['onwebglcontextlost', 'onwebglcontextrestored'],
-  'Window': ['onDOMContentLoaded']
-})
+_html_manual_events = monitored.Dict(
+    'htmleventgenerator._html_manual_events', {
+        'Element': ['ontouchleave', 'ontouchenter', 'ontransitionend'],
+        'HTMLCanvasElement': ['onwebglcontextlost', 'onwebglcontextrestored'],
+        'Window': ['onDOMContentLoaded']
+    })
 
 # These event names must be camel case when attaching event listeners
 # using addEventListener even though the onEventName properties in the DOM for
 # them are not camel case.
 _on_attribute_to_event_name_mapping = monitored.Dict(
     'htmleventgenerator._on_attribute_to_event_name_mapping', {
-  'webkitanimationend': 'webkitAnimationEnd',
-  'webkitanimationiteration': 'webkitAnimationIteration',
-  'webkitanimationstart': 'webkitAnimationStart',
-  'webkitspeechchange': 'webkitSpeechChange',
-})
+        'webkitanimationend': 'webkitAnimationEnd',
+        'webkitanimationiteration': 'webkitAnimationIteration',
+        'webkitanimationstart': 'webkitAnimationStart',
+        'webkitspeechchange': 'webkitSpeechChange',
+    })
 
-_html_event_types = monitored.Dict('htmleventgenerator._html_event_types', {
-  '*.abort': ('abort', 'Event'),
-  '*.beforecopy': ('beforeCopy', 'Event'),
-  '*.beforecut': ('beforeCut', 'Event'),
-  '*.beforepaste': ('beforePaste', 'Event'),
-  '*.beforeunload': ('beforeUnload', 'Event'),
-  '*.blur': ('blur', 'Event'),
-  '*.canplay': ('canPlay', 'Event'),
-  '*.canplaythrough': ('canPlayThrough', 'Event'),
-  '*.change': ('change', 'Event'),
-  '*.click': ('click', 'MouseEvent'),
-  '*.contextmenu': ('contextMenu', 'MouseEvent'),
-  '*.copy': ('copy', 'ClipboardEvent'),
-  '*.cut': ('cut', 'ClipboardEvent'),
-  '*.dblclick': ('doubleClick', 'Event'),
-  '*.drag': ('drag', 'MouseEvent'),
-  '*.dragend': ('dragEnd', 'MouseEvent'),
-  '*.dragenter': ('dragEnter', 'MouseEvent'),
-  '*.dragleave': ('dragLeave', 'MouseEvent'),
-  '*.dragover': ('dragOver', 'MouseEvent'),
-  '*.dragstart': ('dragStart', 'MouseEvent'),
-  '*.drop': ('drop', 'MouseEvent'),
-  '*.durationchange': ('durationChange', 'Event'),
-  '*.emptied': ('emptied', 'Event'),
-  '*.ended': ('ended', 'Event'),
-  '*.error': ('error', 'Event'),
-  '*.focus': ('focus', 'Event'),
-  # Should be HashChangeEvent, but IE does not support it.
-  '*.hashchange': ('hashChange', 'Event'),
-  '*.input': ('input', 'Event'),
-  '*.invalid': ('invalid', 'Event'),
-  '*.keydown': ('keyDown', 'KeyboardEvent'),
-  '*.keypress': ('keyPress', 'KeyboardEvent'),
-  '*.keyup': ('keyUp', 'KeyboardEvent'),
-  '*.load': ('load', 'Event'),
-  '*.loadeddata': ('loadedData', 'Event'),
-  '*.loadedmetadata': ('loadedMetadata', 'Event'),
-  '*.message': ('message', 'MessageEvent'),
-  '*.mousedown': ('mouseDown', 'MouseEvent'),
-  '*.mouseenter': ('mouseEnter', 'MouseEvent'),
-  '*.mouseleave': ('mouseLeave', 'MouseEvent'),
-  '*.mousemove': ('mouseMove', 'MouseEvent'),
-  '*.mouseout': ('mouseOut', 'MouseEvent'),
-  '*.mouseover': ('mouseOver', 'MouseEvent'),
-  '*.mouseup': ('mouseUp', 'MouseEvent'),
-  '*.mousewheel': ('mouseWheel', 'WheelEvent'),
-  '*.offline': ('offline', 'Event'),
-  '*.online': ('online', 'Event'),
-  '*.paste': ('paste', 'ClipboardEvent'),
-  '*.pause': ('pause', 'Event'),
-  '*.play': ('play', 'Event'),
-  '*.playing': ('playing', 'Event'),
-  '*.popstate': ('popState', 'PopStateEvent'),
-  '*.ratechange': ('rateChange', 'Event'),
-  '*.reset': ('reset', 'Event'),
-  '*.resize': ('resize', 'Event'),
-  '*.scroll': ('scroll', 'Event'),
-  '*.search': ('search', 'Event'),
-  '*.seeked': ('seeked', 'Event'),
-  '*.seeking': ('seeking', 'Event'),
-  '*.select': ('select', 'Event'),
-  '*.selectstart': ('selectStart', 'Event'),
-  '*.stalled': ('stalled', 'Event'),
-  '*.storage': ('storage', 'StorageEvent'),
-  '*.submit': ('submit', 'Event'),
-  '*.suspend': ('suspend', 'Event'),
-  '*.timeupdate': ('timeUpdate', 'Event'),
-  '*.touchcancel': ('touchCancel', 'TouchEvent'),
-  '*.touchend': ('touchEnd', 'TouchEvent'),
-  '*.touchenter': ('touchEnter', 'TouchEvent'),
-  '*.touchleave': ('touchLeave', 'TouchEvent'),
-  '*.touchmove': ('touchMove', 'TouchEvent'),
-  '*.touchstart': ('touchStart', 'TouchEvent'),
-  '*.unload': ('unload', 'Event'),
-  '*.volumechange': ('volumeChange', 'Event'),
-  '*.waiting': ('waiting', 'Event'),
-  '*.webkitAnimationEnd': ('animationEnd', 'AnimationEvent'),
-  '*.webkitAnimationIteration': ('animationIteration', 'AnimationEvent'),
-  '*.webkitAnimationStart': ('animationStart', 'AnimationEvent'),
-  '*.transitionend': ('transitionEnd', 'TransitionEvent'),
-  '*.webkitfullscreenchange': ('fullscreenChange', 'Event'),
-  '*.webkitfullscreenerror': ('fullscreenError', 'Event'),
-  '*.wheel': ('wheel', 'WheelEvent'),
-  'AbstractWorker.error': ('error', 'Event'),
-  'AccessibleNode.accessibleclick': ('accessibleClick', 'Event'),
-  'AccessibleNode.accessiblecontextmenu': ('accessibleContextMenu', 'Event'),
-  'AccessibleNode.accessibledecrement': ('accessibleDecrement', 'Event'),
-  'AccessibleNode.accessiblefocus': ('accessibleFocus', 'Event'),
-  'AccessibleNode.accessibleincrement': ('accessibleIncrement', 'Event'),
-  'AccessibleNode.accessiblescrollintoview': ('accessibleScrollIntoView', 'Event'),
-  'Animation.finish': ('finish', 'Event'),
-  'Animation.cancel': ('cancel', 'Event'),
-  'AudioContext.complete': ('complete', 'Event'),
-  'ApplicationCache.cached': ('cached', 'Event'),
-  'ApplicationCache.checking': ('checking', 'Event'),
-  'ApplicationCache.downloading': ('downloading', 'Event'),
-  'ApplicationCache.noupdate': ('noUpdate', 'Event'),
-  'ApplicationCache.obsolete': ('obsolete', 'Event'),
-  'ApplicationCache.progress': ('progress', 'ProgressEvent'),
-  'ApplicationCache.updateready': ('updateReady', 'Event'),
-  'CompositorWorker.error': ('error', 'Event'),
-  'Document.readystatechange': ('readyStateChange', 'Event'),
-  'Document.securitypolicyviolation': ('securityPolicyViolation', 'SecurityPolicyViolationEvent'),
-  'Document.selectionchange': ('selectionChange', 'Event'),
-  'Document.pointerlockchange': ('pointerLockChange', 'Event'),
-  'Document.pointerlockerror': ('pointerLockError', 'Event'),
-  'EventSource.open': ('open', 'Event'),
-  'FileReader.abort': ('abort', 'ProgressEvent'),
-  'FileReader.error': ('error', 'ProgressEvent'),
-  'FileReader.load': ('load', 'ProgressEvent'),
-  'FileReader.loadend': ('loadEnd', 'ProgressEvent'),
-  'FileReader.loadstart': ('loadStart', 'ProgressEvent'),
-  'FileReader.progress': ('progress', 'ProgressEvent'),
-  'FileWriter.abort': ('abort', 'ProgressEvent'),
-  'FileWriter.progress': ('progress', 'ProgressEvent'),
-  'FileWriter.write': ('write', 'ProgressEvent'),
-  'FileWriter.writeend': ('writeEnd', 'ProgressEvent'),
-  'FileWriter.writestart': ('writeStart', 'ProgressEvent'),
-  'FontFaceSet.loading': ('loading', 'FontFaceSetLoadEvent'),
-  'FontFaceSet.loadingdone': ('loadingDone', 'FontFaceSetLoadEvent'),
-  'FontFaceSet.loadingerror': ('loadingError', 'FontFaceSetLoadEvent'),
-  'HTMLBodyElement.storage': ('storage', 'StorageEvent'),
-  'HTMLCanvasElement.webglcontextlost': ('webGlContextLost', 'gl.ContextEvent'),
-  'HTMLCanvasElement.webglcontextrestored': ('webGlContextRestored', 'gl.ContextEvent'),
-  'HTMLInputElement.webkitSpeechChange': ('speechChange', 'Event'),
-  'HTMLFormElement.autocomplete': ('autocomplete', 'Event'),
-  'HTMLFormElement.autocompleteerror': ('autocompleteError', 'AutocompleteErrorEvent'),
-  'HTMLMediaElement.loadstart': ('loadStart', 'Event'),
-  'HTMLMediaElement.progress': ('progress', 'Event'),
-  'HTMLMediaElement.show': ('show', 'Event'),
-  'HTMLMediaElement.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
-  'HTMLMediaElement.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
-  'HTMLMediaElement.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
-  'HTMLMediaElement.webkitneedkey': ('needKey', 'MediaKeyEvent'),
-  'IDBDatabase.close': ('close', 'Event'),
-  'IDBDatabase.versionchange': ('versionChange', 'VersionChangeEvent'),
-  'IDBOpenDBRequest.blocked': ('blocked', 'Event'),
-  'IDBOpenDBRequest.upgradeneeded': ('upgradeNeeded', 'VersionChangeEvent'),
-  'IDBRequest.success': ('success', 'Event'),
-  'IDBTransaction.complete': ('complete', 'Event'),
-  'MediaKeySession.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
-  'MediaKeySession.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
-  'MediaKeySession.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
-  'MediaStream.addtrack': ('addTrack', 'Event'),
-  'MediaStream.removetrack': ('removeTrack', 'Event'),
-  'MediaStreamTrack.mute': ('mute', 'Event'),
-  'MediaStreamTrack.unmute': ('unmute', 'Event'),
-  'MIDIAccess.connect': ('connect', 'MidiConnectionEvent'),
-  'MIDIAccess.disconnect': ('disconnect', 'MidiConnectionEvent'),
-  'MIDIInput.midimessage': ('midiMessage', 'MidiMessageEvent'),
-  'MIDIPort.disconnect': ('disconnect', 'MidiConnectionEvent'),
-  'Notification.click': ('click', 'Event'),
-  'Notification.close': ('close', 'Event'),
-  'Notification.display': ('display', 'Event'),
-  'Notification.show': ('show', 'Event'),
-  'Performance.webkitresourcetimingbufferfull':
-      ('resourceTimingBufferFull', 'Event'),
-  'RTCDTMFSender.tonechange': ('toneChange', 'RtcDtmfToneChangeEvent'),
-  'RTCDataChannel.close': ('close', 'Event'),
-  'RTCDataChannel.open': ('open', 'Event'),
-  'RTCPeerConnection.addstream': ('addStream', 'MediaStreamEvent'),
-  'RTCPeerConnection.datachannel': ('dataChannel', 'RtcDataChannelEvent'),
-  'RTCPeerConnection.icecandidate': ('iceCandidate', 'RtcPeerConnectionIceEvent'),
-  'RTCPeerConnection.iceconnectionstatechange': ('iceConnectionStateChange', 'Event'),
-  'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
-  'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
-  'RTCPeerConnection.signalingstatechange': ('signalingStateChange', 'Event'),
-  'ScriptProcessorNode.audioprocess': ('audioProcess', 'AudioProcessingEvent'),
-  'ServiceWorkerGlobalScope.activate': ('activate', 'Event'),
-  'ServiceWorkerGlobalScope.fetch': ('fetch', 'Event'),
-  'ServiceWorkerGlobalScope.install': ('install', 'Event'),
-  'ServiceWorkerGlobalScope.foreignfetch': ('foreignfetch', 'ForeignFetchEvent'),
-  'SharedWorker.error': ('error', 'Event'),
-  'SharedWorkerGlobalScope.connect': ('connect', 'Event'),
-  'SpeechRecognition.audioend': ('audioEnd', 'Event'),
-  'SpeechRecognition.audiostart': ('audioStart', 'Event'),
-  'SpeechRecognition.end': ('end', 'Event'),
-  'SpeechRecognition.error': ('error', 'SpeechRecognitionError'),
-  'SpeechRecognition.nomatch': ('noMatch', 'SpeechRecognitionEvent'),
-  'SpeechRecognition.result': ('result', 'SpeechRecognitionEvent'),
-  'SpeechRecognition.soundend': ('soundEnd', 'Event'),
-  'SpeechRecognition.soundstart': ('soundStart', 'Event'),
-  'SpeechRecognition.speechend': ('speechEnd', 'Event'),
-  'SpeechRecognition.speechstart': ('speechStart', 'Event'),
-  'SpeechRecognition.start': ('start', 'Event'),
-  'SpeechSynthesisUtterance.boundary': ('boundary', 'SpeechSynthesisEvent'),
-  'SpeechSynthesisUtterance.end': ('end', 'SpeechSynthesisEvent'),
-  'SpeechSynthesisUtterance.mark': ('mark', 'SpeechSynthesisEvent'),
-  'SpeechSynthesisUtterance.resume': ('resume', 'SpeechSynthesisEvent'),
-  'SpeechSynthesisUtterance.start': ('start', 'SpeechSynthesisEvent'),
-  'TextTrack.cuechange': ('cueChange', 'Event'),
-  'TextTrackCue.enter': ('enter', 'Event'),
-  'TextTrackCue.exit': ('exit', 'Event'),
-  'TextTrackList.addtrack': ('addTrack', 'TrackEvent'),
-  'WebSocket.close': ('close', 'CloseEvent'),
-  'WebSocket.open': ('open', 'Event'), # should be OpenEvent, but not exposed.
-  'Window.DOMContentLoaded': ('contentLoaded', 'Event'),
-  'Window.devicemotion': ('deviceMotion', 'DeviceMotionEvent'),
-  'Window.deviceorientation': ('deviceOrientation', 'DeviceOrientationEvent'),
-  'Window.loadstart': ('loadStart', 'Event'),
-  'Window.pagehide': ('pageHide', 'Event'),
-  'Window.pageshow': ('pageShow', 'Event'),
-  'Window.progress': ('progress', 'Event'),
-  'Window.webkittransitionend': ('webkitTransitionEnd', 'TransitionEvent'),
-  'Window.wheel': ('wheel', 'WheelEvent'),
-  'Worker.error': ('error', 'Event'),
-  'XMLHttpRequestEventTarget.abort': ('abort', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.error': ('error', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.load': ('load', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.loadend': ('loadEnd', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.loadstart': ('loadStart', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.progress': ('progress', 'ProgressEvent'),
-  'XMLHttpRequestEventTarget.timeout': ('timeout', 'ProgressEvent'),
-  'XMLHttpRequest.readystatechange': ('readyStateChange', 'Event'),
-})
+_html_event_types = monitored.Dict(
+    'htmleventgenerator._html_event_types',
+    {
+        '*.abort': ('abort', 'Event'),
+        '*.beforecopy': ('beforeCopy', 'Event'),
+        '*.beforecut': ('beforeCut', 'Event'),
+        '*.beforepaste': ('beforePaste', 'Event'),
+        '*.beforeunload': ('beforeUnload', 'Event'),
+        '*.blur': ('blur', 'Event'),
+        '*.canplay': ('canPlay', 'Event'),
+        '*.canplaythrough': ('canPlayThrough', 'Event'),
+        '*.change': ('change', 'Event'),
+        '*.click': ('click', 'MouseEvent'),
+        '*.contextmenu': ('contextMenu', 'MouseEvent'),
+        '*.copy': ('copy', 'ClipboardEvent'),
+        '*.cut': ('cut', 'ClipboardEvent'),
+        '*.dblclick': ('doubleClick', 'Event'),
+        '*.drag': ('drag', 'MouseEvent'),
+        '*.dragend': ('dragEnd', 'MouseEvent'),
+        '*.dragenter': ('dragEnter', 'MouseEvent'),
+        '*.dragleave': ('dragLeave', 'MouseEvent'),
+        '*.dragover': ('dragOver', 'MouseEvent'),
+        '*.dragstart': ('dragStart', 'MouseEvent'),
+        '*.drop': ('drop', 'MouseEvent'),
+        '*.durationchange': ('durationChange', 'Event'),
+        '*.emptied': ('emptied', 'Event'),
+        '*.ended': ('ended', 'Event'),
+        '*.error': ('error', 'Event'),
+        '*.focus': ('focus', 'Event'),
+        # Should be HashChangeEvent, but IE does not support it.
+        '*.hashchange': ('hashChange', 'Event'),
+        '*.input': ('input', 'Event'),
+        '*.invalid': ('invalid', 'Event'),
+        '*.keydown': ('keyDown', 'KeyboardEvent'),
+        '*.keypress': ('keyPress', 'KeyboardEvent'),
+        '*.keyup': ('keyUp', 'KeyboardEvent'),
+        '*.load': ('load', 'Event'),
+        '*.loadeddata': ('loadedData', 'Event'),
+        '*.loadedmetadata': ('loadedMetadata', 'Event'),
+        '*.message': ('message', 'MessageEvent'),
+        '*.mousedown': ('mouseDown', 'MouseEvent'),
+        '*.mouseenter': ('mouseEnter', 'MouseEvent'),
+        '*.mouseleave': ('mouseLeave', 'MouseEvent'),
+        '*.mousemove': ('mouseMove', 'MouseEvent'),
+        '*.mouseout': ('mouseOut', 'MouseEvent'),
+        '*.mouseover': ('mouseOver', 'MouseEvent'),
+        '*.mouseup': ('mouseUp', 'MouseEvent'),
+        '*.mousewheel': ('mouseWheel', 'WheelEvent'),
+        '*.offline': ('offline', 'Event'),
+        '*.online': ('online', 'Event'),
+        '*.paste': ('paste', 'ClipboardEvent'),
+        '*.pause': ('pause', 'Event'),
+        '*.play': ('play', 'Event'),
+        '*.playing': ('playing', 'Event'),
+        '*.popstate': ('popState', 'PopStateEvent'),
+        '*.ratechange': ('rateChange', 'Event'),
+        '*.reset': ('reset', 'Event'),
+        '*.resize': ('resize', 'Event'),
+        '*.scroll': ('scroll', 'Event'),
+        '*.search': ('search', 'Event'),
+        '*.seeked': ('seeked', 'Event'),
+        '*.seeking': ('seeking', 'Event'),
+        '*.select': ('select', 'Event'),
+        '*.selectstart': ('selectStart', 'Event'),
+        '*.stalled': ('stalled', 'Event'),
+        '*.storage': ('storage', 'StorageEvent'),
+        '*.submit': ('submit', 'Event'),
+        '*.suspend': ('suspend', 'Event'),
+        '*.timeupdate': ('timeUpdate', 'Event'),
+        '*.touchcancel': ('touchCancel', 'TouchEvent'),
+        '*.touchend': ('touchEnd', 'TouchEvent'),
+        '*.touchenter': ('touchEnter', 'TouchEvent'),
+        '*.touchleave': ('touchLeave', 'TouchEvent'),
+        '*.touchmove': ('touchMove', 'TouchEvent'),
+        '*.touchstart': ('touchStart', 'TouchEvent'),
+        '*.unload': ('unload', 'Event'),
+        '*.volumechange': ('volumeChange', 'Event'),
+        '*.waiting': ('waiting', 'Event'),
+        '*.webkitAnimationEnd': ('animationEnd', 'AnimationEvent'),
+        '*.webkitAnimationIteration': ('animationIteration', 'AnimationEvent'),
+        '*.webkitAnimationStart': ('animationStart', 'AnimationEvent'),
+        '*.transitionend': ('transitionEnd', 'TransitionEvent'),
+        '*.webkitfullscreenchange': ('fullscreenChange', 'Event'),
+        '*.webkitfullscreenerror': ('fullscreenError', 'Event'),
+        '*.wheel': ('wheel', 'WheelEvent'),
+        'AbstractWorker.error': ('error', 'Event'),
+        'AccessibleNode.accessibleclick': ('accessibleClick', 'Event'),
+        'AccessibleNode.accessiblecontextmenu':
+        ('accessibleContextMenu', 'Event'),
+        'AccessibleNode.accessibledecrement': ('accessibleDecrement', 'Event'),
+        'AccessibleNode.accessiblefocus': ('accessibleFocus', 'Event'),
+        'AccessibleNode.accessibleincrement': ('accessibleIncrement', 'Event'),
+        'AccessibleNode.accessiblescrollintoview':
+        ('accessibleScrollIntoView', 'Event'),
+        'Animation.finish': ('finish', 'Event'),
+        'Animation.cancel': ('cancel', 'Event'),
+        'AudioContext.complete': ('complete', 'Event'),
+        'ApplicationCache.cached': ('cached', 'Event'),
+        'ApplicationCache.checking': ('checking', 'Event'),
+        'ApplicationCache.downloading': ('downloading', 'Event'),
+        'ApplicationCache.noupdate': ('noUpdate', 'Event'),
+        'ApplicationCache.obsolete': ('obsolete', 'Event'),
+        'ApplicationCache.progress': ('progress', 'ProgressEvent'),
+        'ApplicationCache.updateready': ('updateReady', 'Event'),
+        'CompositorWorker.error': ('error', 'Event'),
+        'Document.readystatechange': ('readyStateChange', 'Event'),
+        'Document.securitypolicyviolation':
+        ('securityPolicyViolation', 'SecurityPolicyViolationEvent'),
+        'Document.selectionchange': ('selectionChange', 'Event'),
+        'Document.pointerlockchange': ('pointerLockChange', 'Event'),
+        'Document.pointerlockerror': ('pointerLockError', 'Event'),
+        'EventSource.open': ('open', 'Event'),
+        'FileReader.abort': ('abort', 'ProgressEvent'),
+        'FileReader.error': ('error', 'ProgressEvent'),
+        'FileReader.load': ('load', 'ProgressEvent'),
+        'FileReader.loadend': ('loadEnd', 'ProgressEvent'),
+        'FileReader.loadstart': ('loadStart', 'ProgressEvent'),
+        'FileReader.progress': ('progress', 'ProgressEvent'),
+        'FileWriter.abort': ('abort', 'ProgressEvent'),
+        'FileWriter.progress': ('progress', 'ProgressEvent'),
+        'FileWriter.write': ('write', 'ProgressEvent'),
+        'FileWriter.writeend': ('writeEnd', 'ProgressEvent'),
+        'FileWriter.writestart': ('writeStart', 'ProgressEvent'),
+        'FontFaceSet.loading': ('loading', 'FontFaceSetLoadEvent'),
+        'FontFaceSet.loadingdone': ('loadingDone', 'FontFaceSetLoadEvent'),
+        'FontFaceSet.loadingerror': ('loadingError', 'FontFaceSetLoadEvent'),
+        'HTMLBodyElement.storage': ('storage', 'StorageEvent'),
+        'HTMLCanvasElement.webglcontextlost':
+        ('webGlContextLost', 'gl.ContextEvent'),
+        'HTMLCanvasElement.webglcontextrestored':
+        ('webGlContextRestored', 'gl.ContextEvent'),
+        'HTMLInputElement.webkitSpeechChange': ('speechChange', 'Event'),
+        'HTMLFormElement.autocomplete': ('autocomplete', 'Event'),
+        'HTMLFormElement.autocompleteerror':
+        ('autocompleteError', 'AutocompleteErrorEvent'),
+        'HTMLMediaElement.loadstart': ('loadStart', 'Event'),
+        'HTMLMediaElement.progress': ('progress', 'Event'),
+        'HTMLMediaElement.show': ('show', 'Event'),
+        'HTMLMediaElement.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
+        'HTMLMediaElement.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
+        'HTMLMediaElement.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
+        'HTMLMediaElement.webkitneedkey': ('needKey', 'MediaKeyEvent'),
+        'IDBDatabase.close': ('close', 'Event'),
+        'IDBDatabase.versionchange': ('versionChange', 'VersionChangeEvent'),
+        'IDBOpenDBRequest.blocked': ('blocked', 'Event'),
+        'IDBOpenDBRequest.upgradeneeded':
+        ('upgradeNeeded', 'VersionChangeEvent'),
+        'IDBRequest.success': ('success', 'Event'),
+        'IDBTransaction.complete': ('complete', 'Event'),
+        'MediaKeySession.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
+        'MediaKeySession.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
+        'MediaKeySession.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
+        'MediaStream.addtrack': ('addTrack', 'Event'),
+        'MediaStream.removetrack': ('removeTrack', 'Event'),
+        'MediaStreamTrack.mute': ('mute', 'Event'),
+        'MediaStreamTrack.unmute': ('unmute', 'Event'),
+        'MIDIAccess.connect': ('connect', 'MidiConnectionEvent'),
+        'MIDIAccess.disconnect': ('disconnect', 'MidiConnectionEvent'),
+        'MIDIInput.midimessage': ('midiMessage', 'MidiMessageEvent'),
+        'MIDIPort.disconnect': ('disconnect', 'MidiConnectionEvent'),
+        'Notification.click': ('click', 'Event'),
+        'Notification.close': ('close', 'Event'),
+        'Notification.display': ('display', 'Event'),
+        'Notification.show': ('show', 'Event'),
+        'Performance.webkitresourcetimingbufferfull':
+        ('resourceTimingBufferFull', 'Event'),
+        'RTCDTMFSender.tonechange': ('toneChange', 'RtcDtmfToneChangeEvent'),
+        'RTCDataChannel.close': ('close', 'Event'),
+        'RTCDataChannel.open': ('open', 'Event'),
+        'RTCPeerConnection.addstream': ('addStream', 'MediaStreamEvent'),
+        'RTCPeerConnection.datachannel': ('dataChannel', 'RtcDataChannelEvent'),
+        'RTCPeerConnection.icecandidate':
+        ('iceCandidate', 'RtcPeerConnectionIceEvent'),
+        'RTCPeerConnection.iceconnectionstatechange':
+        ('iceConnectionStateChange', 'Event'),
+        'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
+        'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
+        'RTCPeerConnection.signalingstatechange':
+        ('signalingStateChange', 'Event'),
+        'ScriptProcessorNode.audioprocess':
+        ('audioProcess', 'AudioProcessingEvent'),
+        'ServiceWorkerGlobalScope.activate': ('activate', 'Event'),
+        'ServiceWorkerGlobalScope.fetch': ('fetch', 'Event'),
+        'ServiceWorkerGlobalScope.install': ('install', 'Event'),
+        'ServiceWorkerGlobalScope.foreignfetch':
+        ('foreignfetch', 'ForeignFetchEvent'),
+        'SharedWorker.error': ('error', 'Event'),
+        'SharedWorkerGlobalScope.connect': ('connect', 'Event'),
+        'SpeechRecognition.audioend': ('audioEnd', 'Event'),
+        'SpeechRecognition.audiostart': ('audioStart', 'Event'),
+        'SpeechRecognition.end': ('end', 'Event'),
+        'SpeechRecognition.error': ('error', 'SpeechRecognitionError'),
+        'SpeechRecognition.nomatch': ('noMatch', 'SpeechRecognitionEvent'),
+        'SpeechRecognition.result': ('result', 'SpeechRecognitionEvent'),
+        'SpeechRecognition.soundend': ('soundEnd', 'Event'),
+        'SpeechRecognition.soundstart': ('soundStart', 'Event'),
+        'SpeechRecognition.speechend': ('speechEnd', 'Event'),
+        'SpeechRecognition.speechstart': ('speechStart', 'Event'),
+        'SpeechRecognition.start': ('start', 'Event'),
+        'SpeechSynthesisUtterance.boundary':
+        ('boundary', 'SpeechSynthesisEvent'),
+        'SpeechSynthesisUtterance.end': ('end', 'SpeechSynthesisEvent'),
+        'SpeechSynthesisUtterance.mark': ('mark', 'SpeechSynthesisEvent'),
+        'SpeechSynthesisUtterance.resume': ('resume', 'SpeechSynthesisEvent'),
+        'SpeechSynthesisUtterance.start': ('start', 'SpeechSynthesisEvent'),
+        'TextTrack.cuechange': ('cueChange', 'Event'),
+        'TextTrackCue.enter': ('enter', 'Event'),
+        'TextTrackCue.exit': ('exit', 'Event'),
+        'TextTrackList.addtrack': ('addTrack', 'TrackEvent'),
+        'WebSocket.close': ('close', 'CloseEvent'),
+        'WebSocket.open':
+        ('open', 'Event'),  # should be OpenEvent, but not exposed.
+        'Window.DOMContentLoaded': ('contentLoaded', 'Event'),
+        'Window.devicemotion': ('deviceMotion', 'DeviceMotionEvent'),
+        'Window.deviceorientation':
+        ('deviceOrientation', 'DeviceOrientationEvent'),
+        'Window.loadstart': ('loadStart', 'Event'),
+        'Window.pagehide': ('pageHide', 'Event'),
+        'Window.pageshow': ('pageShow', 'Event'),
+        'Window.progress': ('progress', 'Event'),
+        'Window.webkittransitionend':
+        ('webkitTransitionEnd', 'TransitionEvent'),
+        'Window.wheel': ('wheel', 'WheelEvent'),
+        'Worker.error': ('error', 'Event'),
+        'XMLHttpRequestEventTarget.abort': ('abort', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.error': ('error', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.load': ('load', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.loadend': ('loadEnd', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.loadstart': ('loadStart', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.progress': ('progress', 'ProgressEvent'),
+        'XMLHttpRequestEventTarget.timeout': ('timeout', 'ProgressEvent'),
+        'XMLHttpRequest.readystatechange': ('readyStateChange', 'Event'),
+    })
 
 # These classes require an explicit declaration for the "on" method even though
 # they don't declare any unique events, because the concrete class hierarchy
 # doesn't match the interface hierarchy.
 _html_explicit_event_classes = set(['DocumentFragment'])
 
+
 class HtmlEventGenerator(object):
 
-  def __init__(self, database, renamer, metadata, template_loader):
-    self._event_classes = set()
-    self._database = database
-    self._renamer = renamer
-    self._metadata = metadata
-    self._template_loader = template_loader
-    self._media_events = None
+    def __init__(self, database, renamer, metadata, template_loader):
+        self._event_classes = set()
+        self._database = database
+        self._renamer = renamer
+        self._metadata = metadata
+        self._template_loader = template_loader
+        self._media_events = None
 
-  def EmitStreamProviders(self, interface, custom_events,
-      members_emitter, library_name):
+    def EmitStreamProviders(self, interface, custom_events, members_emitter,
+                            library_name):
 
-    events = self._GetEvents(interface, custom_events)
-    if not events:
-      return
+        events = self._GetEvents(interface, custom_events)
+        if not events:
+            return
 
-    for event_info in events:
-      (dom_name, html_name, event_type) = event_info
-      annotation_name = dom_name + 'Event'
+        for event_info in events:
+            (dom_name, html_name, event_type) = event_info
+            annotation_name = dom_name + 'Event'
 
-      # If we're using a different provider, then don't declare one.
-      if self._GetEventRedirection(interface, html_name, event_type):
-        continue
+            # If we're using a different provider, then don't declare one.
+            if self._GetEventRedirection(interface, html_name, event_type):
+                continue
 
-      annotations = self._metadata.FormatMetadata(
-          self._metadata.GetMetadata(library_name, interface,
-              annotation_name, 'on' + dom_name), '  ')
+            annotations = self._metadata.FormatMetadata(
+                self._metadata.GetMetadata(library_name, interface,
+                                           annotation_name, 'on' + dom_name),
+                '  ')
 
-      members_emitter.Emit(
-          "\n"
-          "  $(ANNOTATIONS)static const EventStreamProvider<$TYPE> "
-          "$(NAME)Event = const EventStreamProvider<$TYPE>('$DOM_NAME');\n",
-          ANNOTATIONS=annotations,
-          NAME=html_name,
-          DOM_NAME=dom_name,
-          TYPE=event_type)
+            members_emitter.Emit(
+                "\n"
+                "  $(ANNOTATIONS)static const EventStreamProvider<$TYPE> "
+                "$(NAME)Event = const EventStreamProvider<$TYPE>('$DOM_NAME');\n",
+                ANNOTATIONS=annotations,
+                NAME=html_name,
+                DOM_NAME=dom_name,
+                TYPE=event_type)
 
-  def EmitStreamGetters(self, interface, custom_events,
-      members_emitter, library_name, stream_getter_signatures_emitter=None,
-      element_stream_getters_emitter=None):
+    def EmitStreamGetters(self,
+                          interface,
+                          custom_events,
+                          members_emitter,
+                          library_name,
+                          stream_getter_signatures_emitter=None,
+                          element_stream_getters_emitter=None):
 
-    events = self._GetEvents(interface, custom_events)
-    if not events:
-      return
+        events = self._GetEvents(interface, custom_events)
+        if not events:
+            return
 
-    for event_info in events:
-      (dom_name, html_name, event_type) = event_info
-      getter_name = 'on%s%s' % (html_name[:1].upper(), html_name[1:])
-      annotation_name = 'on' + dom_name
+        for event_info in events:
+            (dom_name, html_name, event_type) = event_info
+            getter_name = 'on%s%s' % (html_name[:1].upper(), html_name[1:])
+            annotation_name = 'on' + dom_name
 
-      # If the provider is declared elsewhere, point to that.
-      redirection = self._GetEventRedirection(interface, html_name, event_type)
-      if redirection:
-        provider = '%s.%sEvent' % (redirection, html_name)
-      else:
-        provider = html_name + 'Event'
+            # If the provider is declared elsewhere, point to that.
+            redirection = self._GetEventRedirection(interface, html_name,
+                                                    event_type)
+            if redirection:
+                provider = '%s.%sEvent' % (redirection, html_name)
+            else:
+                provider = html_name + 'Event'
 
-      annotations = self._metadata.GetFormattedMetadata(
-          library_name, interface, annotation_name, '  ')
+            annotations = self._metadata.GetFormattedMetadata(
+                library_name, interface, annotation_name, '  ')
 
-      isElement = False
-      for parent in self._database.Hierarchy(interface):
-        if parent.id == 'Element':
-          isElement = True
-      # We add the same event stream getters Element, ElementList, and
-      # _FrozenElementList. So, in impl_Element.darttemplate, we have two
-      # additional emitters to add the correct variation of the stream getter
-      # for that context.
-      for emitter in [members_emitter, stream_getter_signatures_emitter,
-          element_stream_getters_emitter]:
-        if emitter == None:
-          continue
-        elem_type = 'Element' if isElement else ''
-        call_name = 'forElement' if isElement else 'forTarget'
-        if emitter == element_stream_getters_emitter:
-          call_name = '_forElementList'
-        emitter.Emit(
-            "\n"
-            "  $(ANNOTATIONS)$(ELEM_TYPE)Stream<$TYPE> get $(NAME)$BODY;\n",
-            ANNOTATIONS=annotations,
-            ELEM_TYPE=elem_type,
-            NAME=getter_name,
-            BODY = ('' if emitter == stream_getter_signatures_emitter else
-                ' => %s.%s(this)' % (((''
-                if emitter != element_stream_getters_emitter else 'Element.')
-                  + provider), call_name)),
-            TYPE=event_type)
+            isElement = False
+            for parent in self._database.Hierarchy(interface):
+                if parent.id == 'Element':
+                    isElement = True
+            # We add the same event stream getters Element, ElementList, and
+            # _FrozenElementList. So, in impl_Element.darttemplate, we have two
+            # additional emitters to add the correct variation of the stream getter
+            # for that context.
+            for emitter in [
+                    members_emitter, stream_getter_signatures_emitter,
+                    element_stream_getters_emitter
+            ]:
+                if emitter == None:
+                    continue
+                elem_type = 'Element' if isElement else ''
+                call_name = 'forElement' if isElement else 'forTarget'
+                if emitter == element_stream_getters_emitter:
+                    call_name = '_forElementList'
+                emitter.Emit(
+                    "\n"
+                    "  $(ANNOTATIONS)$(ELEM_TYPE)Stream<$TYPE> get $(NAME)$BODY;\n",
+                    ANNOTATIONS=annotations,
+                    ELEM_TYPE=elem_type,
+                    NAME=getter_name,
+                    BODY=('' if emitter == stream_getter_signatures_emitter else
+                          ' => %s.%s(this)' % ((
+                              ('' if emitter != element_stream_getters_emitter
+                               else 'Element.') + provider), call_name)),
+                    TYPE=event_type)
 
-  def _GetRawEvents(self, interface):
-    all_interfaces = ([ interface ] +
-                      self._database.TransitiveSecondaryParents(interface,
-                                                                False))
-    events = set([])
-    for super_interface in all_interfaces:
-      events = events.union(
-        set([attr.id for attr in super_interface.attributes
-             if (attr.type.id == 'EventHandler'
-              or attr.type.id == 'EventListener')]))
-    return events
+    def _GetRawEvents(self, interface):
+        all_interfaces = (
+            [interface] + self._database.TransitiveSecondaryParents(
+                interface, False))
+        events = set([])
+        for super_interface in all_interfaces:
+            events = events.union(
+                set([
+                    attr.id
+                    for attr in super_interface.attributes
+                    if (attr.type.id == 'EventHandler' or
+                        attr.type.id == 'EventListener')
+                ]))
+        return events
 
-  def _GetEvents(self, interface, custom_events):
-    """ Gets a list of all of the events for the specified interface.
+    def _GetEvents(self, interface, custom_events):
+        """ Gets a list of all of the events for the specified interface.
     """
-    html_interface_name = interface.doc_js_name
+        html_interface_name = interface.doc_js_name
 
-    events = self._GetRawEvents(interface)
+        events = self._GetRawEvents(interface)
 
-    if html_interface_name in _html_manual_events:
-      events.update(_html_manual_events[html_interface_name])
+        if html_interface_name in _html_manual_events:
+            events.update(_html_manual_events[html_interface_name])
 
-    if not events and interface.id not in _html_explicit_event_classes :
-      return None
+        if not events and interface.id not in _html_explicit_event_classes:
+            return None
 
-    dom_event_names = set()
-    for event in events:
-      dom_name = event[2:]
-      dom_name = _on_attribute_to_event_name_mapping.get(dom_name, dom_name)
-      dom_event_names.add(dom_name)
+        dom_event_names = set()
+        for event in events:
+            dom_name = event[2:]
+            dom_name = _on_attribute_to_event_name_mapping.get(
+                dom_name, dom_name)
+            dom_event_names.add(dom_name)
 
-    events = []
-    for dom_name in sorted(dom_event_names):
-      event_info = self._FindEventInfo(html_interface_name, dom_name)
-      if not event_info:
-        continue
+        events = []
+        for dom_name in sorted(dom_event_names):
+            event_info = self._FindEventInfo(html_interface_name, dom_name)
+            if not event_info:
+                continue
 
-      (html_name, event_type) = event_info
-      if self._IsEventSuppressed(interface, html_name, event_type):
-        continue
+            (html_name, event_type) = event_info
+            if self._IsEventSuppressed(interface, html_name, event_type):
+                continue
 
-      full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
-      if not full_event_name in custom_events:
-        events.append((dom_name, html_name, event_type))
-    return events
+            full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
+            if not full_event_name in custom_events:
+                events.append((dom_name, html_name, event_type))
+        return events
 
-  def _HasEvent(self, events, event_name, event_type):
-    """ Checks if the event is declared in the list of events (from _GetEvents),
+    def _HasEvent(self, events, event_name, event_type):
+        """ Checks if the event is declared in the list of events (from _GetEvents),
     with the same event type.
     """
-    for (dom_name, html_name, found_type) in events:
-      if html_name == event_name and event_type == found_type:
-        return True
-    return False
+        for (dom_name, html_name, found_type) in events:
+            if html_name == event_name and event_type == found_type:
+                return True
+        return False
 
-  def _IsEventSuppressed(self, interface, event_name, event_type):
-    """ Checks if the event should not be emitted.
+    def _IsEventSuppressed(self, interface, event_name, event_type):
+        """ Checks if the event should not be emitted.
     """
-    if self._renamer.ShouldSuppressMember(interface, event_name, 'on:'):
-      return True
+        if self._renamer.ShouldSuppressMember(interface, event_name, 'on:'):
+            return True
 
-    if (interface.doc_js_name == 'Window' or
-        interface.doc_js_name == 'Element' or
-        interface.doc_js_name == 'Document' or
-        interface.doc_js_name == 'GlobalEventHandlers'):
-      media_interface = self._database.GetInterface('HTMLMediaElement')
-      if not self._media_events:
-        self._media_events = self._GetEvents(media_interface, [])
-      if self._HasEvent(self._media_events, event_name, event_type):
-        return True
+        if (interface.doc_js_name == 'Window' or
+                interface.doc_js_name == 'Element' or
+                interface.doc_js_name == 'Document' or
+                interface.doc_js_name == 'GlobalEventHandlers'):
+            media_interface = self._database.GetInterface('HTMLMediaElement')
+            if not self._media_events:
+                self._media_events = self._GetEvents(media_interface, [])
+            if self._HasEvent(self._media_events, event_name, event_type):
+                return True
 
-  def _GetEventRedirection(self, interface, event_name, event_type):
-    """ For events which are declared in one place, but exposed elsewhere,
+    def _GetEventRedirection(self, interface, event_name, event_type):
+        """ For events which are declared in one place, but exposed elsewhere,
     this gets the source of the event (where the provider is declared)
     """
-    if interface.doc_js_name == 'Window' or interface.doc_js_name == 'Document':
-      element_interface = self._database.GetInterface('Element')
-      element_events = self._GetEvents(element_interface, [])
-      if self._HasEvent(element_events, event_name, event_type):
-        return 'Element'
-    return None
+        if interface.doc_js_name == 'Window' or interface.doc_js_name == 'Document':
+            element_interface = self._database.GetInterface('Element')
+            element_events = self._GetEvents(element_interface, [])
+            if self._HasEvent(element_events, event_name, event_type):
+                return 'Element'
+        return None
 
-  def _FindEventInfo(self, html_interface_name, dom_event_name):
-    """ Finds the event info (event name and type).
+    def _FindEventInfo(self, html_interface_name, dom_event_name):
+        """ Finds the event info (event name and type).
     """
-    key = '%s.%s' % (html_interface_name, dom_event_name)
-    if key in _html_event_types:
-      return _html_event_types[key]
-    key = '*.%s' % dom_event_name
-    if key in _html_event_types:
-      return _html_event_types[key]
-    _logger.warn('Cannot resolve event type for %s.%s' %
-        (html_interface_name, dom_event_name))
-    return None
+        key = '%s.%s' % (html_interface_name, dom_event_name)
+        if key in _html_event_types:
+            return _html_event_types[key]
+        key = '*.%s' % dom_event_name
+        if key in _html_event_types:
+            return _html_event_types[key]
+        _logger.warn('Cannot resolve event type for %s.%s' %
+                     (html_interface_name, dom_event_name))
+        return None
diff --git a/tools/dom/scripts/htmlrenamer.py b/tools/dom/scripts/htmlrenamer.py
index d419464..623f5e9 100644
--- a/tools/dom/scripts/htmlrenamer.py
+++ b/tools/dom/scripts/htmlrenamer.py
@@ -21,588 +21,649 @@
     'Uint32Array': 'Uint32List',
 }
 
-html_interface_renames = monitored.Dict('htmlrenamer.html_interface_renames',
-                                        dict({
-    'Attr': '_Attr',
-    'BudgetService': '_BudgetService',
-    'CDATASection': 'CDataSection',
-    'Clipboard': '_Clipboard', # TODO(terry): Need to remove when ACX Clipboard is renamed to AcxClipboard.
-    'Database': 'SqlDatabase', # Avoid conflict with Index DB's Database.
-    'DatabaseSync': 'SqlDatabaseSync',
-    'DOMFileSystem': 'FileSystem',
-    'Entity': '_Entity', # Not sure if we want to expose this yet, may conflict with other libs.
-    'EntryCallback': '_EntryCallback',
-    'EntriesCallback': '_EntriesCallback',
-    'ErrorCallback': '_ErrorCallback',
-    'FileCallback': '_FileCallback',
-    'FileSystemCallback': '_FileSystemCallback',
-    'FileWriterCallback': '_FileWriterCallback',
-    'HTMLDocument' : 'HtmlDocument',
-    'HTMLElement' : 'HtmlElement',
-    'HTMLHtmlElement' : 'HtmlHtmlElement',
-    'IDBFactory': 'IdbFactory', # Manual to avoid name conflicts.
-    'Iterator': 'DomIterator',
-    'Key': 'CryptoKey',
-    'NamedNodeMap': '_NamedNodeMap',
-    'NavigatorUserMediaErrorCallback': '_NavigatorUserMediaErrorCallback',
-    'NavigatorUserMediaSuccessCallback': '_NavigatorUserMediaSuccessCallback',
-    'NotificationPermissionCallback': '_NotificationPermissionCallback',
-    'Position': 'Geoposition',
-    'PositionCallback': '_PositionCallback',
-    'PositionErrorCallback': '_PositionErrorCallback',
-    'Request': '_Request',
-    'Report': '_Report',
-    'RTCDTMFSender': 'RtcDtmfSender',
-    'RTCDTMFToneChangeEvent': 'RtcDtmfToneChangeEvent',
-    'RTCErrorCallback': '_RtcErrorCallback',
-    'RTCSessionDescriptionCallback': '_RtcSessionDescriptionCallback',
-    'SVGDocument': 'SvgDocument', # Manual to avoid name conflicts.
-    'SVGElement': 'SvgElement', # Manual to avoid name conflicts.
-    'SVGGradientElement': '_GradientElement',
-    'SVGSVGElement': 'SvgSvgElement', # Manual to avoid name conflicts.
-    'Stream': 'FileStream',
-    'StringCallback': '_StringCallback',
-    'WebGL2RenderingContext': 'RenderingContext2',
-    'WebGL2RenderingContextBase': 'RenderingContextBase2',
-    'WindowTimers': '_WindowTimers',
-    'XMLHttpRequest': 'HttpRequest',
-    'XMLHttpRequestUpload': 'HttpRequestUpload',
-    'XMLHttpRequestEventTarget': 'HttpRequestEventTarget',
-}, **typed_array_renames))
-
+html_interface_renames = monitored.Dict(
+    'htmlrenamer.html_interface_renames',
+    dict(
+        {
+            'Attr':
+            '_Attr',
+            'BudgetService':
+            '_BudgetService',
+            'CDATASection':
+            'CDataSection',
+            'Clipboard':
+            '_Clipboard',  # TODO(terry): Need to remove when ACX Clipboard is renamed to AcxClipboard.
+            'Database':
+            'SqlDatabase',  # Avoid conflict with Index DB's Database.
+            'DatabaseSync':
+            'SqlDatabaseSync',
+            'DOMFileSystem':
+            'FileSystem',
+            'Entity':
+            '_Entity',  # Not sure if we want to expose this yet, may conflict with other libs.
+            'EntryCallback':
+            '_EntryCallback',
+            'EntriesCallback':
+            '_EntriesCallback',
+            'ErrorCallback':
+            '_ErrorCallback',
+            'FileCallback':
+            '_FileCallback',
+            'FileSystemCallback':
+            '_FileSystemCallback',
+            'FileWriterCallback':
+            '_FileWriterCallback',
+            'HTMLDocument':
+            'HtmlDocument',
+            'HTMLElement':
+            'HtmlElement',
+            'HTMLHtmlElement':
+            'HtmlHtmlElement',
+            'IDBFactory':
+            'IdbFactory',  # Manual to avoid name conflicts.
+            'Iterator':
+            'DomIterator',
+            'Key':
+            'CryptoKey',
+            'NamedNodeMap':
+            '_NamedNodeMap',
+            'NavigatorUserMediaErrorCallback':
+            '_NavigatorUserMediaErrorCallback',
+            'NavigatorUserMediaSuccessCallback':
+            '_NavigatorUserMediaSuccessCallback',
+            'NotificationPermissionCallback':
+            '_NotificationPermissionCallback',
+            'Position':
+            'Geoposition',
+            'PositionCallback':
+            '_PositionCallback',
+            'PositionErrorCallback':
+            '_PositionErrorCallback',
+            'Request':
+            '_Request',
+            'Report':
+            '_Report',
+            'RTCDTMFSender':
+            'RtcDtmfSender',
+            'RTCDTMFToneChangeEvent':
+            'RtcDtmfToneChangeEvent',
+            'RTCErrorCallback':
+            '_RtcErrorCallback',
+            'RTCSessionDescriptionCallback':
+            '_RtcSessionDescriptionCallback',
+            'SVGDocument':
+            'SvgDocument',  # Manual to avoid name conflicts.
+            'SVGElement':
+            'SvgElement',  # Manual to avoid name conflicts.
+            'SVGGradientElement':
+            '_GradientElement',
+            'SVGSVGElement':
+            'SvgSvgElement',  # Manual to avoid name conflicts.
+            'Stream':
+            'FileStream',
+            'StringCallback':
+            '_StringCallback',
+            'WebGL2RenderingContext':
+            'RenderingContext2',
+            'WebGL2RenderingContextBase':
+            'RenderingContextBase2',
+            'WindowTimers':
+            '_WindowTimers',
+            'XMLHttpRequest':
+            'HttpRequest',
+            'XMLHttpRequestUpload':
+            'HttpRequestUpload',
+            'XMLHttpRequestEventTarget':
+            'HttpRequestEventTarget',
+        },
+        **typed_array_renames))
 
 # Some callback interfaces are not just a simple callback functions.  If the callback
 # interface is in this list then the interface is exposed as a class.
-_gen_callback_interfaces = [
-  'NodeFilter'
-]
+_gen_callback_interfaces = ['NodeFilter']
+
 
 def generateCallbackInterface(id):
-  return id in _gen_callback_interfaces
+    return id in _gen_callback_interfaces
+
 
 # Interfaces that are suppressed, but need to still exist for Dartium and to
 # properly wrap DOM objects if/when encountered.
 _removed_html_interfaces = [
-  'Bluetooth',
-  'BluetoothAdvertisingData',
-  'BluetoothCharacteristicProperties',
-  'BluetoothDevice',
-  'BluetoothRemoteGATTCharacteristic',
-  'BluetoothRemoteGATTServer',
-  'BluetoothRemoteGATTService',
-  'BluetoothUUID',
-  'Cache', # TODO: Symbol conflicts with Angular: dartbug.com/20937
-  'CanvasPath',
-  'CDataSection',
-  'CSSPrimitiveValue',
-  'CSSUnknownRule',
-  'CSSValue',
-  'Counter',
-  'DOMFileSystemSync', # Workers
-  'DatabaseSync', # Workers
-  'DirectoryEntrySync', # Workers
-  'DirectoryReaderSync', # Workers
-  'DocumentType',
-  'EntrySync', # Workers
-  'FileEntrySync', # Workers
-  'FileReaderSync', # Workers
-  'FileWriterSync', # Workers
-  'HTMLAllCollection',
-  'HTMLAppletElement',
-  'HTMLBaseFontElement',
-  'HTMLDirectoryElement',
-  'HTMLFontElement',
-  'HTMLFrameElement',
-  'HTMLFrameSetElement',
-  'HTMLMarqueeElement',
-  'IDBAny',
-  'Mojo',
-  'MojoHandle',
-  'MojoInterfaceInterceptor',
-  'MojoInterfaceRequestEvent',
-  'MojoWatcher',
-  'NFC',
-  'Notation',
-  'PagePopupController',
-  'RGBColor',
-  'RadioNodeList',  # Folded onto NodeList in dart2js.
-  'Rect',
-  'Response', # TODO: Symbol conflicts with Angular: dartbug.com/20937
-  'SQLTransactionSync', # Workers
-  'SQLTransactionSyncCallback', # Workers
-  'SVGAltGlyphDefElement', # Webkit only.
-  'SVGAltGlyphItemElement', # Webkit only.
-  'SVGAnimateColorElement', # Deprecated. Use AnimateElement instead.
-  'SVGColor',
-  'SVGComponentTransferFunctionElement', # Currently not supported anywhere.
-  'SVGCursorElement', # Webkit only.
-  'SVGFEDropShadowElement', # Webkit only for the following:
-  'SVGFontElement',
-  'SVGFontFaceElement',
-  'SVGFontFaceFormatElement',
-  'SVGFontFaceNameElement',
-  'SVGFontFaceSrcElement',
-  'SVGFontFaceUriElement',
-  'SVGGlyphElement',
-  'SVGGlyphRefElement',
-  'SVGHKernElement',
-  'SVGMPathElement',
-  'SVGPaint',
-  'SVGMissingGlyphElement',
-  'SVGTRefElement',
-  'SVGVKernElement',
-  'SubtleCrypto',
-  'USB',
-  'USBAlternateInterface',
-  'USBConfiguration',
-  'USBConnectionEvent',
-  'USBDevice',
-  'USBEndpoint',
-  'USBInTransferResult',
-  'USBInterface',
-  'USBIsochronousInTransferPacket',
-  'USBIsochronousInTransferResult',
-  'USBIsochronousOutTransferPacket',
-  'USBIsochronousOutTransferResult',
-  'USBOutTransferResult',
-  'WebKitCSSFilterValue',
-  'WebKitCSSMatrix',
-  'WebKitCSSMixFunctionValue',
-  'WebKitCSSTransformValue',
-  'WebKitMediaSource',
-  'WebKitNotification',
-  'WebGLRenderingContextBase',
-  'WebGL2RenderingContextBase',
-  'WebKitSourceBuffer',
-  'WebKitSourceBufferList',
-  'WorkerLocation', # Workers
-  'WorkerNavigator', # Workers
-  'Worklet', # Rendering Workers
-  'XMLHttpRequestProgressEvent',
-  # Obsolete event for NaCl.
-  'ResourceProgressEvent',
+    'Bluetooth',
+    'BluetoothAdvertisingData',
+    'BluetoothCharacteristicProperties',
+    'BluetoothDevice',
+    'BluetoothRemoteGATTCharacteristic',
+    'BluetoothRemoteGATTServer',
+    'BluetoothRemoteGATTService',
+    'BluetoothUUID',
+    'Cache',  # TODO: Symbol conflicts with Angular: dartbug.com/20937
+    'CanvasPath',
+    'CDataSection',
+    'CSSPrimitiveValue',
+    'CSSUnknownRule',
+    'CSSValue',
+    'Counter',
+    'DOMFileSystemSync',  # Workers
+    'DatabaseSync',  # Workers
+    'DirectoryEntrySync',  # Workers
+    'DirectoryReaderSync',  # Workers
+    'DocumentType',
+    'EntrySync',  # Workers
+    'FileEntrySync',  # Workers
+    'FileReaderSync',  # Workers
+    'FileWriterSync',  # Workers
+    'HTMLAllCollection',
+    'HTMLAppletElement',
+    'HTMLBaseFontElement',
+    'HTMLDirectoryElement',
+    'HTMLFontElement',
+    'HTMLFrameElement',
+    'HTMLFrameSetElement',
+    'HTMLMarqueeElement',
+    'IDBAny',
+    'Mojo',
+    'MojoHandle',
+    'MojoInterfaceInterceptor',
+    'MojoInterfaceRequestEvent',
+    'MojoWatcher',
+    'NFC',
+    'Notation',
+    'PagePopupController',
+    'RGBColor',
+    'RadioNodeList',  # Folded onto NodeList in dart2js.
+    'Rect',
+    'Response',  # TODO: Symbol conflicts with Angular: dartbug.com/20937
+    'SQLTransactionSync',  # Workers
+    'SQLTransactionSyncCallback',  # Workers
+    'SVGAltGlyphDefElement',  # Webkit only.
+    'SVGAltGlyphItemElement',  # Webkit only.
+    'SVGAnimateColorElement',  # Deprecated. Use AnimateElement instead.
+    'SVGColor',
+    'SVGComponentTransferFunctionElement',  # Currently not supported anywhere.
+    'SVGCursorElement',  # Webkit only.
+    'SVGFEDropShadowElement',  # Webkit only for the following:
+    'SVGFontElement',
+    'SVGFontFaceElement',
+    'SVGFontFaceFormatElement',
+    'SVGFontFaceNameElement',
+    'SVGFontFaceSrcElement',
+    'SVGFontFaceUriElement',
+    'SVGGlyphElement',
+    'SVGGlyphRefElement',
+    'SVGHKernElement',
+    'SVGMPathElement',
+    'SVGPaint',
+    'SVGMissingGlyphElement',
+    'SVGTRefElement',
+    'SVGVKernElement',
+    'SubtleCrypto',
+    'USB',
+    'USBAlternateInterface',
+    'USBConfiguration',
+    'USBConnectionEvent',
+    'USBDevice',
+    'USBEndpoint',
+    'USBInTransferResult',
+    'USBInterface',
+    'USBIsochronousInTransferPacket',
+    'USBIsochronousInTransferResult',
+    'USBIsochronousOutTransferPacket',
+    'USBIsochronousOutTransferResult',
+    'USBOutTransferResult',
+    'WebKitCSSFilterValue',
+    'WebKitCSSMatrix',
+    'WebKitCSSMixFunctionValue',
+    'WebKitCSSTransformValue',
+    'WebKitMediaSource',
+    'WebKitNotification',
+    'WebGLRenderingContextBase',
+    'WebGL2RenderingContextBase',
+    'WebKitSourceBuffer',
+    'WebKitSourceBufferList',
+    'WorkerLocation',  # Workers
+    'WorkerNavigator',  # Workers
+    'Worklet',  # Rendering Workers
+    'XMLHttpRequestProgressEvent',
+    # Obsolete event for NaCl.
+    'ResourceProgressEvent',
 ]
 
 for interface in _removed_html_interfaces:
-  html_interface_renames[interface] = '_' + interface
+    html_interface_renames[interface] = '_' + interface
 
 convert_to_future_members = monitored.Set(
-  'htmlrenamer.converted_to_future_members', [
-  'Database.changeVersion',
-  'Database.readTransaction',
-  'DataTransferItem.getAsString',
-  'DirectoryEntry.getDirectory',
-  'DirectoryEntry.getFile',
-  'DirectoryEntry.removeRecursively',
-  'Entry.copyTo',
-  'Entry.getMetadata',
-  'Entry.getParent',
-  'Entry.moveTo',
-  'Entry.remove',
-  'FileEntry.createWriter',
-  'FileEntry.file',
-  'FontLoader.notifyWhenFontsReady',
-  'MediaStreamTrack.getSources',
-  'Notification.requestPermission',
-  'SQLTransaction.executeSql',
-  'StorageInfo.requestQuota',
-  'StorageQuota.requestQuota',
-  'Window.webkitRequestFileSystem',
-  'Window.webkitResolveLocalFileSystemURL',
-  'WorkerGlobalScope.webkitRequestFileSystem',
-  'WorkerGlobalScope.webkitResolveLocalFileSystemURL',
-])
+    'htmlrenamer.converted_to_future_members', [
+        'Database.changeVersion',
+        'Database.readTransaction',
+        'DataTransferItem.getAsString',
+        'DirectoryEntry.getDirectory',
+        'DirectoryEntry.getFile',
+        'DirectoryEntry.removeRecursively',
+        'Entry.copyTo',
+        'Entry.getMetadata',
+        'Entry.getParent',
+        'Entry.moveTo',
+        'Entry.remove',
+        'FileEntry.createWriter',
+        'FileEntry.file',
+        'FontLoader.notifyWhenFontsReady',
+        'MediaStreamTrack.getSources',
+        'Notification.requestPermission',
+        'SQLTransaction.executeSql',
+        'StorageInfo.requestQuota',
+        'StorageQuota.requestQuota',
+        'Window.webkitRequestFileSystem',
+        'Window.webkitResolveLocalFileSystemURL',
+        'WorkerGlobalScope.webkitRequestFileSystem',
+        'WorkerGlobalScope.webkitResolveLocalFileSystemURL',
+    ])
 
 # DDC Exposed Classes
-ddc_extensions = monitored.Dict('ddcextensions.ddc_extensions', {
-  'DirectoryEntry': {
-      'getDirectory': [ '' ],
-      'getFile': [
-          'applyExtension(\'FileEntry\', value);',
-      ]
-  },
-  'Entry': {
-      'getMetadata': [
-          'applyExtension(\'Metadata\', value);',
-      ],
-      'getParent': [
-          'applyExtension(\'Entry\', value);',
-      ]
-  },
-  'FileEntry': {
-      'createWriter': [
-          'applyExtension(\'FileWriter\', value);'
-      ],
-      'file': [
-          'applyExtension(\'File\', value);'
-      ]
-  },
-  'SQLTransaction': {
-      'executeSql': [
-          'applyExtension(\'SQLResultSet\', resultSet);'
-          'applyExtension(\'SQLResultSetRowList\', resultSet.rows);'
-      ],
-  },
-  'Window': {
-      'webkitRequestFileSystem':[
-          'applyExtension(\'DOMFileSystem\', value);',
-          'applyExtension(\'DirectoryEntry\', value.root);',
-      ]
-  },
-})
+ddc_extensions = monitored.Dict(
+    'ddcextensions.ddc_extensions', {
+        'DirectoryEntry': {
+            'getDirectory': [''],
+            'getFile': [
+                'applyExtension(\'FileEntry\', value);',
+            ]
+        },
+        'Entry': {
+            'getMetadata': [
+                'applyExtension(\'Metadata\', value);',
+            ],
+            'getParent': [
+                'applyExtension(\'Entry\', value);',
+            ]
+        },
+        'FileEntry': {
+            'createWriter': ['applyExtension(\'FileWriter\', value);'],
+            'file': ['applyExtension(\'File\', value);']
+        },
+        'SQLTransaction': {
+            'executeSql': [
+                'applyExtension(\'SQLResultSet\', resultSet);'
+                'applyExtension(\'SQLResultSetRowList\', resultSet.rows);'
+            ],
+        },
+        'Window': {
+            'webkitRequestFileSystem': [
+                'applyExtension(\'DOMFileSystem\', value);',
+                'applyExtension(\'DirectoryEntry\', value.root);',
+            ]
+        },
+    })
+
 
 # DDC Extension for this interface operation?
 def GetDDC_Extension(interface, operationName):
-  if interface.id in ddc_extensions:
-    entry = ddc_extensions[interface.id]
-    if operationName in entry:
-      return entry[operationName]
-  return None
+    if interface.id in ddc_extensions:
+        entry = ddc_extensions[interface.id]
+        if operationName in entry:
+            return entry[operationName]
+    return None
 
 
 # Classes where we have customized constructors, but we need to keep the old
 # constructor for dispatch purposes.
 custom_html_constructors = monitored.Set(
-    'htmlrenamer.custom_html_constructors', [
-  'CompositionEvent',       # 45 Roll hide default constructor use Dart's custom
-  'CustomEvent',            # 45 Roll hide default constructor use Dart's custom
-  'Event',                  # 45 Roll hide default constructor use Dart's custom
-  'HashChangeEvent',        # 45 Roll hide default constructor use Dart's custom
-  'HTMLAudioElement',
-  'HTMLOptionElement',
-  'KeyboardEvent',          # 45 Roll hide default constructor use Dart's custom
-  'MessageEvent',           # 45 Roll hide default constructor use Dart's custom
-  'MouseEvent',             # 45 Roll hide default constructor use Dart's custom
-  'MutationObserver',
-  'StorageEvent',           # 45 Roll hide default constructor use Dart's custom
-  'UIEvent',                # 45 Roll hide default constructor use Dart's custom
-  'WheelEvent',             # 45 Roll hide default constructor use Dart's custom
-])
+    'htmlrenamer.custom_html_constructors',
+    [
+        'CompositionEvent',  # 45 Roll hide default constructor use Dart's custom
+        'CustomEvent',  # 45 Roll hide default constructor use Dart's custom
+        'Event',  # 45 Roll hide default constructor use Dart's custom
+        'HashChangeEvent',  # 45 Roll hide default constructor use Dart's custom
+        'HTMLAudioElement',
+        'HTMLOptionElement',
+        'KeyboardEvent',  # 45 Roll hide default constructor use Dart's custom
+        'MessageEvent',  # 45 Roll hide default constructor use Dart's custom
+        'MouseEvent',  # 45 Roll hide default constructor use Dart's custom
+        'MutationObserver',
+        'StorageEvent',  # 45 Roll hide default constructor use Dart's custom
+        'UIEvent',  # 45 Roll hide default constructor use Dart's custom
+        'WheelEvent',  # 45 Roll hide default constructor use Dart's custom
+    ])
 
 # Members from the standard dom that should not be exposed publicly in dart:html
 # but need to be exposed internally to implement dart:html on top of a standard
 # browser. They are exposed simply by placing an underscore in front of the
 # name.
-private_html_members = monitored.Set('htmlrenamer.private_html_members', [
-  'AudioNode.connect',
-  'Cache.add',
-  'Cache.delete',
-  'Cache.keys',
-  'Cache.match',
-  'Cache.matchAll',
-  'Cache.put',
-  'CanvasRenderingContext2D.arc',
-  'CanvasRenderingContext2D.drawImage',
-  'CanvasRenderingContext2D.getLineDash',
-  'Crypto.getRandomValues',
-  'CSSStyleDeclaration.getPropertyValue',
-  'CSSStyleDeclaration.setProperty',
-  'CSSStyleDeclaration.var',
-  'CompositionEvent.initCompositionEvent',
-  'CustomEvent.detail',
-  'CustomEvent.initCustomEvent',
-  'DataTransferItem.webkitGetAsEntry',
-  'DeviceOrientationEvent.initDeviceOrientationEvent',
-  'DirectoryEntry.createReader',
-  'DirectoryReader.readEntries',
-  'Document.createElement',
-  'Document.createElementNS',
-  'Document.createEvent',
-  'Document.createNodeIterator',
-  'Document.createTextNode',
-  'Document.createTouch',
-  'Document.createTouchList',
-  'Document.createTreeWalker',
-  'Document.querySelectorAll',
-  'DocumentFragment.querySelectorAll',
+private_html_members = monitored.Set(
+    'htmlrenamer.private_html_members',
+    [
+        'AudioNode.connect',
+        'Cache.add',
+        'Cache.delete',
+        'Cache.keys',
+        'Cache.match',
+        'Cache.matchAll',
+        'Cache.put',
+        'CanvasRenderingContext2D.arc',
+        'CanvasRenderingContext2D.drawImage',
+        'CanvasRenderingContext2D.getLineDash',
+        'Crypto.getRandomValues',
+        'CSSStyleDeclaration.getPropertyValue',
+        'CSSStyleDeclaration.setProperty',
+        'CSSStyleDeclaration.var',
+        'CompositionEvent.initCompositionEvent',
+        'CustomEvent.detail',
+        'CustomEvent.initCustomEvent',
+        'DataTransferItem.webkitGetAsEntry',
+        'DeviceOrientationEvent.initDeviceOrientationEvent',
+        'DirectoryEntry.createReader',
+        'DirectoryReader.readEntries',
+        'Document.createElement',
+        'Document.createElementNS',
+        'Document.createEvent',
+        'Document.createNodeIterator',
+        'Document.createTextNode',
+        'Document.createTouch',
+        'Document.createTouchList',
+        'Document.createTreeWalker',
+        'Document.querySelectorAll',
+        'DocumentFragment.querySelectorAll',
 
-  # Moved to HTMLDocument.
-  'Document.body',
-  'Document.caretRangeFromPoint',
-  'Document.elementFromPoint',
-  'Document.getCSSCanvasContext',
-  'Document.head',
-  'Document.lastModified',
-  'Document.preferredStylesheetSet',
-  'Document.referrer',
-  'Document.selectedStylesheetSet',
-  'Document.styleSheets',
-  'Document.title',
-  'Document.webkitCancelFullScreen',
-  'Document.webkitExitFullscreen',
-   # Not prefixed.
-  'Document.webkitFullscreenElement',
-  'Document.webkitFullscreenEnabled',
-  'Document.webkitHidden',
-  'Document.webkitIsFullScreen',
-  'Document.webkitVisibilityState',
-   # Not prefixed but requires custom implementation for cross-browser compatibility.
-  'Document.visibilityState',
-
-  'Element.animate',
-  'Element.children',
-  'Element.childElementCount',
-  'Element.firstElementChild',
-  'Element.getClientRects',
-  'Element.getElementsByTagName',
-  'Element.insertAdjacentHTML',
-  'Element.scrollIntoView',
-  'Element.scrollIntoViewIfNeeded',
-  'Element.getAttribute',
-  'Element.getAttributeNS',
-  'Element.hasAttribute',
-  'Element.hasAttributeNS',
-  'Element.removeAttribute',
-  'Element.removeAttributeNS',
-  'Element.setAttribute',
-  'Element.setAttributeNS',
-  'Element.innerHTML',
-  'Element.querySelectorAll',
-  # TODO(vsm): These have been converted from int to double in Chrome 36.
-  # Special case them so we run on 34, 35, and 36.
-  'Element.scrollLeft',
-  'Element.scrollTop',
-  'Element.scrollWidth',
-  'Element.scrollHeight',
-
-  'Event.initEvent',
-  'EventTarget.addEventListener',
-  'EventTarget.removeEventListener',
-  'FileReader.result',
-  'Geolocation.clearWatch',
-  'Geolocation.getCurrentPosition',
-  'Geolocation.watchPosition',
-  'HashChangeEvent.initHashChangeEvent',
-  'HTMLCanvasElement.toDataURL',
-  'HTMLTableElement.createCaption',
-  'HTMLTableElement.createTFoot',
-  'HTMLTableElement.createTHead',
-  'HTMLTableElement.createTBody',
-  'HTMLTableElement.insertRow',
-  'HTMLTableElement.rows',
-  'HTMLTableElement.tBodies',
-  'HTMLTableRowElement.cells',
-  'HTMLTableRowElement.insertCell',
-  'HTMLTableSectionElement.insertRow',
-  'HTMLTableSectionElement.rows',
-  'IDBCursor.delete',
-  'IDBCursor.update',
-  'IDBDatabase.createObjectStore',
-  'IDBFactory.deleteDatabase',
-  'IDBFactory.webkitGetDatabaseNames',
-  'IDBFactory.open',
-  'IDBIndex.count',
-  'IDBIndex.get',
-  'IDBIndex.getKey',
-  'IDBIndex.openCursor',
-  'IDBIndex.openKeyCursor',
-  'IDBObjectStore.add',
-  'IDBObjectStore.clear',
-  'IDBObjectStore.count',
-  'IDBObjectStore.createIndex',
-  'IDBObjectStore.delete',
-  'IDBObjectStore.get',
-  'IDBObjectStore.openCursor',
-  'IDBObjectStore.put',
-  'KeyboardEvent.initKeyboardEvent',
-  'KeyboardEvent.keyIdentifier',
-  'MediaKeys.createSession',
-  'MediaKeySession.update',
-  'MessageEvent.initMessageEvent',
-  'MessagePort.start',
-  'MouseEvent.initMouseEvent',
-  'MouseEvent.clientX',
-  'MouseEvent.clientY',
-  'MouseEvent.movementX',
-  'MouseEvent.movementY',
-  'MouseEvent.offsetX',
-  'MouseEvent.offsetY',
-  'MouseEvent.screenX',
-  'MouseEvent.screenY',
-  'MutationObserver.observe',
-  'Navigator.getGamepads',
-  'Node.attributes',
-  'Node.localName',
-  'Node.namespaceURI',
-  'Node.removeChild',
-  'Node.replaceChild',
-  'ParentNode.childElementCount',
-  'ParentNode.children',
-  'ParentNode.firstElementChild',
-  'ParentNode.lastElementChild',
-  'ParentNode.querySelectorAll',
-  'Range.getClientRects',
-  'Screen.availHeight',
-  'Screen.availLeft',
-  'Screen.availTop',
-  'Screen.availWidth',
-  'ShadowRoot.resetStyleInheritance',
-  'Storage.clear',
-  'Storage.getItem',
-  'Storage.key',
-  'Storage.length',
-  'Storage.removeItem',
-  'Storage.setItem',
-  'StorageEvent.initStorageEvent',
-  'SubtleCrypto.encrypt',
-  'SubtleCrypto.decrypt',
-  'SubtleCrypto.sign',
-  'SubtleCrypto.digest',
-  'SubtleCrypto.importKey',
-  'SubtleCrypto.unwrapKey',
-  'ShadowRoot.applyAuthorStyles',
-  'SpeechSynthesis.getVoices',
-
-  'TextEvent.initTextEvent',
-  # TODO(leafp): These have been converted from int to double in Chrome 37.
-  # client, page, and screen were already special cased, adding radiusX/radiusY.
-  # See impl_Touch.darttemplate for impedance matching code
-  'Touch.clientX',
-  'Touch.clientY',
-  'Touch.pageX',
-  'Touch.pageY',
-  'Touch.screenX',
-  'Touch.screenY',
-  'Touch.radiusX',
-  'Touch.radiusY',
-  'UIEvent.initUIEvent',
-  'UIEvent.layerX',
-  'UIEvent.layerY',
-  'UIEvent.pageX',
-  'UIEvent.pageY',
-  'UIEvent.which',
-  'KeyboardEvent.charCode',
-  'KeyboardEvent.keyCode',
-  'KeyboardEvent.which',
-
-  'WebGLRenderingContext.readPixels',
-  'WebGL2RenderingContext.readPixels',  
-  'WheelEvent.initWebKitWheelEvent',
-  'WheelEvent.deltaX',
-  'WheelEvent.deltaY',
-  'WorkerGlobalScope.webkitNotifications',
-  'Window.getComputedStyle',
-  'Window.clearInterval',
-  'Window.clearTimeout',
-  'Window.openDatabase',
-  # TODO(tll): These have been converted from int to double in Chrome 39 for
-  #            subpixel precision.  Special case for backward compatibility.
-  'Window.pageXOffset',
-  'Window.pageYOffset',
-  'Window.scrollX',
-  'Window.scrollY',
-
-  'WindowTimers.clearInterval',
-  'WindowTimers.clearTimeout',
-  'WindowTimers.setInterval',
-  'WindowTimers.setTimeout',
-  'Window.moveTo',
-  'Window.requestAnimationFrame',
-  'Window.setInterval',
-  'Window.setTimeout',
-])
+        # Moved to HTMLDocument.
+        'Document.body',
+        'Document.caretRangeFromPoint',
+        'Document.elementFromPoint',
+        'Document.getCSSCanvasContext',
+        'Document.head',
+        'Document.lastModified',
+        'Document.preferredStylesheetSet',
+        'Document.referrer',
+        'Document.selectedStylesheetSet',
+        'Document.styleSheets',
+        'Document.title',
+        'Document.webkitCancelFullScreen',
+        'Document.webkitExitFullscreen',
+        # Not prefixed.
+        'Document.webkitFullscreenElement',
+        'Document.webkitFullscreenEnabled',
+        'Document.webkitHidden',
+        'Document.webkitIsFullScreen',
+        'Document.webkitVisibilityState',
+        # Not prefixed but requires custom implementation for cross-browser compatibility.
+        'Document.visibilityState',
+        'Element.animate',
+        'Element.children',
+        'Element.childElementCount',
+        'Element.firstElementChild',
+        'Element.getClientRects',
+        'Element.getElementsByTagName',
+        'Element.insertAdjacentHTML',
+        'Element.scrollIntoView',
+        'Element.scrollIntoViewIfNeeded',
+        'Element.getAttribute',
+        'Element.getAttributeNS',
+        'Element.hasAttribute',
+        'Element.hasAttributeNS',
+        'Element.removeAttribute',
+        'Element.removeAttributeNS',
+        'Element.setAttribute',
+        'Element.setAttributeNS',
+        'Element.innerHTML',
+        'Element.querySelectorAll',
+        # TODO(vsm): These have been converted from int to double in Chrome 36.
+        # Special case them so we run on 34, 35, and 36.
+        'Element.scrollLeft',
+        'Element.scrollTop',
+        'Element.scrollWidth',
+        'Element.scrollHeight',
+        'Event.initEvent',
+        'EventTarget.addEventListener',
+        'EventTarget.removeEventListener',
+        'FileReader.result',
+        'Geolocation.clearWatch',
+        'Geolocation.getCurrentPosition',
+        'Geolocation.watchPosition',
+        'HashChangeEvent.initHashChangeEvent',
+        'HTMLCanvasElement.toDataURL',
+        'HTMLTableElement.createCaption',
+        'HTMLTableElement.createTFoot',
+        'HTMLTableElement.createTHead',
+        'HTMLTableElement.createTBody',
+        'HTMLTableElement.insertRow',
+        'HTMLTableElement.rows',
+        'HTMLTableElement.tBodies',
+        'HTMLTableRowElement.cells',
+        'HTMLTableRowElement.insertCell',
+        'HTMLTableSectionElement.insertRow',
+        'HTMLTableSectionElement.rows',
+        'IDBCursor.delete',
+        'IDBCursor.update',
+        'IDBDatabase.createObjectStore',
+        'IDBFactory.deleteDatabase',
+        'IDBFactory.webkitGetDatabaseNames',
+        'IDBFactory.open',
+        'IDBIndex.count',
+        'IDBIndex.get',
+        'IDBIndex.getKey',
+        'IDBIndex.openCursor',
+        'IDBIndex.openKeyCursor',
+        'IDBObjectStore.add',
+        'IDBObjectStore.clear',
+        'IDBObjectStore.count',
+        'IDBObjectStore.createIndex',
+        'IDBObjectStore.delete',
+        'IDBObjectStore.get',
+        'IDBObjectStore.openCursor',
+        'IDBObjectStore.put',
+        'KeyboardEvent.initKeyboardEvent',
+        'KeyboardEvent.keyIdentifier',
+        'MediaKeys.createSession',
+        'MediaKeySession.update',
+        'MessageEvent.initMessageEvent',
+        'MessagePort.start',
+        'MouseEvent.initMouseEvent',
+        'MouseEvent.clientX',
+        'MouseEvent.clientY',
+        'MouseEvent.movementX',
+        'MouseEvent.movementY',
+        'MouseEvent.offsetX',
+        'MouseEvent.offsetY',
+        'MouseEvent.screenX',
+        'MouseEvent.screenY',
+        'MutationObserver.observe',
+        'Navigator.getGamepads',
+        'Node.attributes',
+        'Node.localName',
+        'Node.namespaceURI',
+        'Node.removeChild',
+        'Node.replaceChild',
+        'ParentNode.childElementCount',
+        'ParentNode.children',
+        'ParentNode.firstElementChild',
+        'ParentNode.lastElementChild',
+        'ParentNode.querySelectorAll',
+        'Range.getClientRects',
+        'Screen.availHeight',
+        'Screen.availLeft',
+        'Screen.availTop',
+        'Screen.availWidth',
+        'ShadowRoot.resetStyleInheritance',
+        'Storage.clear',
+        'Storage.getItem',
+        'Storage.key',
+        'Storage.length',
+        'Storage.removeItem',
+        'Storage.setItem',
+        'StorageEvent.initStorageEvent',
+        'SubtleCrypto.encrypt',
+        'SubtleCrypto.decrypt',
+        'SubtleCrypto.sign',
+        'SubtleCrypto.digest',
+        'SubtleCrypto.importKey',
+        'SubtleCrypto.unwrapKey',
+        'ShadowRoot.applyAuthorStyles',
+        'SpeechSynthesis.getVoices',
+        'TextEvent.initTextEvent',
+        # TODO(leafp): These have been converted from int to double in Chrome 37.
+        # client, page, and screen were already special cased, adding radiusX/radiusY.
+        # See impl_Touch.darttemplate for impedance matching code
+        'Touch.clientX',
+        'Touch.clientY',
+        'Touch.pageX',
+        'Touch.pageY',
+        'Touch.screenX',
+        'Touch.screenY',
+        'Touch.radiusX',
+        'Touch.radiusY',
+        'UIEvent.initUIEvent',
+        'UIEvent.layerX',
+        'UIEvent.layerY',
+        'UIEvent.pageX',
+        'UIEvent.pageY',
+        'UIEvent.which',
+        'KeyboardEvent.charCode',
+        'KeyboardEvent.keyCode',
+        'KeyboardEvent.which',
+        'WebGLRenderingContext.readPixels',
+        'WebGL2RenderingContext.readPixels',
+        'WheelEvent.initWebKitWheelEvent',
+        'WheelEvent.deltaX',
+        'WheelEvent.deltaY',
+        'WorkerGlobalScope.webkitNotifications',
+        'Window.getComputedStyle',
+        'Window.clearInterval',
+        'Window.clearTimeout',
+        'Window.openDatabase',
+        # TODO(tll): These have been converted from int to double in Chrome 39 for
+        #            subpixel precision.  Special case for backward compatibility.
+        'Window.pageXOffset',
+        'Window.pageYOffset',
+        'Window.scrollX',
+        'Window.scrollY',
+        'WindowTimers.clearInterval',
+        'WindowTimers.clearTimeout',
+        'WindowTimers.setInterval',
+        'WindowTimers.setTimeout',
+        'Window.moveTo',
+        'Window.requestAnimationFrame',
+        'Window.setInterval',
+        'Window.setTimeout',
+    ])
 
 # Members from the standard dom that exist in the dart:html library with
 # identical functionality but with cleaner names.
-renamed_html_members = monitored.Dict('htmlrenamer.renamed_html_members', {
-    'ConsoleBase.assert': 'assertCondition',
-    'CSSKeyframesRule.insertRule': 'appendRule',
-    'DirectoryEntry.getDirectory': '_getDirectory',
-    'DirectoryEntry.getFile': '_getFile',
-    'Document.createCDATASection': 'createCDataSection',
-    'Document.defaultView': 'window',
-    'Window.CSS': 'css',
-    'Window.webkitNotifications': 'notifications',
-    'Window.webkitRequestFileSystem': '_requestFileSystem',
-    'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
-    'Navigator.webkitGetUserMedia': '_getUserMedia',
-    'Node.appendChild': 'append',
-    'Node.cloneNode': 'clone',
-    'Node.nextSibling': 'nextNode',
-    'Node.parentElement': 'parent',
-    'Node.previousSibling': 'previousNode',
-    'Node.textContent': 'text',
-    'SVGElement.className': '_svgClassName',
-    'SVGStopElement.offset': 'gradientOffset',
-    'URL.createObjectURL': 'createObjectUrl',
-    'URL.revokeObjectURL': 'revokeObjectUrl',
-    #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
-    #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync',
+renamed_html_members = monitored.Dict(
+    'htmlrenamer.renamed_html_members',
+    {
+        'ConsoleBase.assert': 'assertCondition',
+        'CSSKeyframesRule.insertRule': 'appendRule',
+        'DirectoryEntry.getDirectory': '_getDirectory',
+        'DirectoryEntry.getFile': '_getFile',
+        'Document.createCDATASection': 'createCDataSection',
+        'Document.defaultView': 'window',
+        'Window.CSS': 'css',
+        'Window.webkitNotifications': 'notifications',
+        'Window.webkitRequestFileSystem': '_requestFileSystem',
+        'Window.webkitResolveLocalFileSystemURL': 'resolveLocalFileSystemUrl',
+        'Navigator.webkitGetUserMedia': '_getUserMedia',
+        'Node.appendChild': 'append',
+        'Node.cloneNode': 'clone',
+        'Node.nextSibling': 'nextNode',
+        'Node.parentElement': 'parent',
+        'Node.previousSibling': 'previousNode',
+        'Node.textContent': 'text',
+        'SVGElement.className': '_svgClassName',
+        'SVGStopElement.offset': 'gradientOffset',
+        'URL.createObjectURL': 'createObjectUrl',
+        'URL.revokeObjectURL': 'revokeObjectUrl',
+        #'WorkerContext.webkitRequestFileSystem': '_requestFileSystem',
+        #'WorkerContext.webkitRequestFileSystemSync': '_requestFileSystemSync',
 
-    # OfflineAudioContext.suspend has an signature incompatible with shadowed
-    # base class method AudioContext.suspend.
-    'OfflineAudioContext.suspend': 'suspendFor',
-})
+        # OfflineAudioContext.suspend has an signature incompatible with shadowed
+        # base class method AudioContext.suspend.
+        'OfflineAudioContext.suspend': 'suspendFor',
+    })
 
 # Members that have multiple definitions, but their types are vary, so we rename
 # them to make them distinct.
-renamed_overloads = monitored.Dict('htmldartgenerator.renamed_overloads', {
-  'AudioContext.createBuffer(ArrayBuffer buffer, boolean mixToMono)':
-      'createBufferFromBuffer',
-  'CSS.supports(DOMString conditionText)': 'supportsCondition',
-  'DataTransferItemList.add(File file)': 'addFile',
-  'DataTransferItemList.add(DOMString data, DOMString type)': 'addData',
-  'FormData.append(DOMString name, Blob value, DOMString filename)':
-      'appendBlob',
-  'RTCDataChannel.send(ArrayBuffer data)': 'sendByteBuffer',
-  'RTCDataChannel.send(ArrayBufferView data)': 'sendTypedData',
-  'RTCDataChannel.send(Blob data)': 'sendBlob',
-  'RTCDataChannel.send(DOMString data)': 'sendString',
-  'SourceBuffer.appendBuffer(ArrayBufferView data)': 'appendTypedData',
-  'URL.createObjectURL(MediaSource source)':
-      'createObjectUrlFromSource',
-  'URL.createObjectURL(WebKitMediaSource source)':
-      '_createObjectUrlFromWebKitSource',
-  'URL.createObjectURL(MediaStream stream)': 'createObjectUrlFromStream',
-  'URL.createObjectURL(Blob blob)': 'createObjectUrlFromBlob',
-  'WebSocket.send(ArrayBuffer data)': 'sendByteBuffer',
-  'WebSocket.send(ArrayBufferView data)': 'sendTypedData',
-  'WebSocket.send(DOMString data)': 'sendString',
-  'WebSocket.send(Blob data)': 'sendBlob',
-  'Window.setInterval(DOMString handler, long timeout, any arguments)': '_setInterval_String',
-  'Window.setTimeout(DOMString handler, long timeout, any arguments)': '_setTimeout_String',
-  'WindowTimers.setInterval(DOMString handler, long timeout, any arguments)': '_setInterval_String',
-  'WindowTimers.setTimeout(DOMString handler, long timeout, any arguments)': '_setTimeout_String',
-})
+renamed_overloads = monitored.Dict(
+    'htmldartgenerator.renamed_overloads', {
+        'AudioContext.createBuffer(ArrayBuffer buffer, boolean mixToMono)':
+        'createBufferFromBuffer',
+        'CSS.supports(DOMString conditionText)':
+        'supportsCondition',
+        'DataTransferItemList.add(File file)':
+        'addFile',
+        'DataTransferItemList.add(DOMString data, DOMString type)':
+        'addData',
+        'FormData.append(DOMString name, Blob value, DOMString filename)':
+        'appendBlob',
+        'RTCDataChannel.send(ArrayBuffer data)':
+        'sendByteBuffer',
+        'RTCDataChannel.send(ArrayBufferView data)':
+        'sendTypedData',
+        'RTCDataChannel.send(Blob data)':
+        'sendBlob',
+        'RTCDataChannel.send(DOMString data)':
+        'sendString',
+        'SourceBuffer.appendBuffer(ArrayBufferView data)':
+        'appendTypedData',
+        'URL.createObjectURL(MediaSource source)':
+        'createObjectUrlFromSource',
+        'URL.createObjectURL(WebKitMediaSource source)':
+        '_createObjectUrlFromWebKitSource',
+        'URL.createObjectURL(MediaStream stream)':
+        'createObjectUrlFromStream',
+        'URL.createObjectURL(Blob blob)':
+        'createObjectUrlFromBlob',
+        'WebSocket.send(ArrayBuffer data)':
+        'sendByteBuffer',
+        'WebSocket.send(ArrayBufferView data)':
+        'sendTypedData',
+        'WebSocket.send(DOMString data)':
+        'sendString',
+        'WebSocket.send(Blob data)':
+        'sendBlob',
+        'Window.setInterval(DOMString handler, long timeout, any arguments)':
+        '_setInterval_String',
+        'Window.setTimeout(DOMString handler, long timeout, any arguments)':
+        '_setTimeout_String',
+        'WindowTimers.setInterval(DOMString handler, long timeout, any arguments)':
+        '_setInterval_String',
+        'WindowTimers.setTimeout(DOMString handler, long timeout, any arguments)':
+        '_setTimeout_String',
+    })
 
 # Members that have multiple definitions, but their types are identical (only
 # number of arguments vary), so we do not rename them as a _raw method.
 keep_overloaded_members = monitored.Set(
     'htmldartgenerator.keep_overloaded_members', [
-  'CanvasRenderingContext2D.putImageData',
-  'CanvasRenderingContext2D.webkitPutImageDataHD',
-  'DataTransferItemList.add',
-  'Document.createElement',
-  'Document.createElementNS',
-  'HTMLInputElement.setRangeText',
-  'HTMLTextAreaElement.setRangeText',
-  'IDBDatabase.transaction',
-  'RTCDataChannel.send',
-  'URL.createObjectURL',
-  'WebSocket.send',
-  'XMLHttpRequest.send'
-])
+        'CanvasRenderingContext2D.putImageData',
+        'CanvasRenderingContext2D.webkitPutImageDataHD',
+        'DataTransferItemList.add', 'Document.createElement',
+        'Document.createElementNS', 'HTMLInputElement.setRangeText',
+        'HTMLTextAreaElement.setRangeText', 'IDBDatabase.transaction',
+        'RTCDataChannel.send', 'URL.createObjectURL', 'WebSocket.send',
+        'XMLHttpRequest.send'
+    ])
 
 # Members that can be overloaded.
 overloaded_and_renamed = monitored.Set(
     'htmldartgenerator.overloaded_and_renamed', [
-  'CanvasRenderingContext2D.clip',
-  'CanvasRenderingContext2D.drawFocusIfNeeded',
-  'CanvasRenderingContext2D.fill',
-  'CanvasRenderingContext2D.isPointInPath',
-  'CanvasRenderingContext2D.isPointInStroke',
-  'CanvasRenderingContext2D.stroke',
-  'Navigator.sendBeacon',
-])
+        'CanvasRenderingContext2D.clip',
+        'CanvasRenderingContext2D.drawFocusIfNeeded',
+        'CanvasRenderingContext2D.fill',
+        'CanvasRenderingContext2D.isPointInPath',
+        'CanvasRenderingContext2D.isPointInStroke',
+        'CanvasRenderingContext2D.stroke',
+        'Navigator.sendBeacon',
+    ])
+
 
 def convertedFutureMembers(member):
-  return member in convert_to_future_members
+    return member in convert_to_future_members
+
 
 for member in convert_to_future_members:
-  if member in renamed_html_members:
-    renamed_html_members[member] = '_' + renamed_html_members[member]
-  else:
-    renamed_html_members[member] = '_' + member[member.find('.') + 1 :]
+    if member in renamed_html_members:
+        renamed_html_members[member] = '_' + renamed_html_members[member]
+    else:
+        renamed_html_members[member] = '_' + member[member.find('.') + 1:]
 
 # Members and classes from the dom that should be removed completely from
 # dart:html.  These could be expressed in the IDL instead but expressing this
@@ -613,591 +674,604 @@
 # Prepending ClassName with = will only match against direct class, not for
 # subclasses.
 # TODO(jacobr): cleanup and augment this list.
-removed_html_members = monitored.Set('htmlrenamer.removed_html_members', [
-    'Attr.textContent', # Not needed as it is the same as Node.textContent.
-    'AudioContext.decodeAudioData',
-    'AudioBufferSourceNode.looping', # TODO(vsm): Use deprecated IDL annotation
-    'CSSStyleDeclaration.getPropertyCSSValue',
-    'HTMLCanvasElement.toBlob',
-    'CanvasRenderingContext2D.clearShadow',
-    'CanvasRenderingContext2D.drawImageFromRect',
-    'CanvasRenderingContext2D.setAlpha',
-    'CanvasRenderingContext2D.setCompositeOperation',
-    'CanvasRenderingContext2D.setFillColor',
-    'CanvasRenderingContext2D.setLineCap',
-    'CanvasRenderingContext2D.setLineJoin',
-    'CanvasRenderingContext2D.setLineWidth',
-    'CanvasRenderingContext2D.setMiterLimit',
-    'CanvasRenderingContext2D.setShadow',
-    'CanvasRenderingContext2D.setStrokeColor',
-    # Disable the webKit version, imageSmoothingEnabled is exposed.
-    'CanvasRenderingContext2D.webkitImageSmoothingEnabled',
-    'CharacterData.remove',
-    'ChildNode.replaceWith',
-    'CSSStyleDeclaration.__getter__',
-    'CSSStyleDeclaration.__setter__',
-    'Window.call:blur',
-    'Window.call:focus',
-    'Window.clientInformation',
-    'Window.createImageBitmap',
-    'Window.get:frames',
-    'Window.get:length',
-    'Window.on:beforeUnload',
-    'Window.on:webkitTransitionEnd',
-    'Window.pagePopupController',
-    'Window.prompt',
-    'Window.webkitCancelAnimationFrame',
-    'Window.webkitCancelRequestAnimationFrame',
-    'Window.webkitIndexedDB',
-    'Window.webkitRequestAnimationFrame',
-    'Document.alinkColor',
-    'Document.all',
-    'Document.append',
-    'Document.applets',
-    'Document.bgColor',
-    'Document.clear',
-    'Document.createAttribute',
-    'Document.createAttributeNS',
-    'Document.createComment',
-    'Document.createExpression',
-    'Document.createNSResolver',
-    'Document.createProcessingInstruction',
-    'Document.designMode',
-    'Document.dir',
-    'Document.evaluate',
-    'Document.fgColor',
-    'Document.get:URL',
-    'Document.get:anchors',
-    'Document.get:characterSet',
-    'Document.get:compatMode',
-    'Document.get:defaultCharset',
-    'Document.get:doctype',
-    'Document.get:documentURI',
-    'Document.get:embeds',
-    'Document.get:forms',
-    'Document.get:inputEncoding',
-    'Document.get:links',
-    'Document.get:plugins',
-    'Document.get:scripts',
-    'Document.get:xmlEncoding',
-    'Document.getElementsByTagNameNS',
-    'Document.getOverrideStyle',
-    'Document.getSelection',
-    'Document.images',
-    'Document.linkColor',
-    'Document.location',
-    'Document.on:wheel',
-    'Document.open',
-    'Document.prepend',
-    'Document.register',
-    'Document.set:domain',
-    'Document.vlinkColor',
-    'Document.webkitCurrentFullScreenElement',
-    'Document.webkitFullScreenKeyboardInputAllowed',
-    'Document.write',
-    'Document.writeln',
-    'Document.xmlStandalone',
-    'Document.xmlVersion',
-    'DocumentFragment.children',
-    'DocumentType.*',
-    'DOMException.code',
-    'DOMException.ABORT_ERR',
-    'DOMException.DATA_CLONE_ERR',
-    'DOMException.DOMSTRING_SIZE_ERR',
-    'DOMException.HIERARCHY_REQUEST_ERR',
-    'DOMException.INDEX_SIZE_ERR',
-    'DOMException.INUSE_ATTRIBUTE_ERR',
-    'DOMException.INVALID_ACCESS_ERR',
-    'DOMException.INVALID_CHARACTER_ERR',
-    'DOMException.INVALID_MODIFICATION_ERR',
-    'DOMException.INVALID_NODE_TYPE_ERR',
-    'DOMException.INVALID_STATE_ERR',
-    'DOMException.NAMESPACE_ERR',
-    'DOMException.NETWORK_ERR',
-    'DOMException.NOT_FOUND_ERR',
-    'DOMException.NOT_SUPPORTED_ERR',
-    'DOMException.NO_DATA_ALLOWED_ERR',
-    'DOMException.NO_MODIFICATION_ALLOWED_ERR',
-    'DOMException.QUOTA_EXCEEDED_ERR',
-    'DOMException.SECURITY_ERR',
-    'DOMException.SYNTAX_ERR',
-    'DOMException.TIMEOUT_ERR',
-    'DOMException.TYPE_MISMATCH_ERR',
-    'DOMException.URL_MISMATCH_ERR',
-    'DOMException.VALIDATION_ERR',
-    'DOMException.WRONG_DOCUMENT_ERR',
-    'Element.accessKey',
-    'Element.append',
-    'Element.dataset',
-    'Element.get:classList',
-    'Element.getAttributeNode',
-    'Element.getAttributeNodeNS',
-    'Element.getElementsByTagNameNS',
-    'Element.innerText',
-    # TODO(terry): All offset* attributes are in both HTMLElement and Element
-    #              (it's a Chrome bug with a FIXME note to correct - sometime).
-    #              Until corrected these Element attributes must be ignored.
-    'Element.offsetParent',
-    'Element.offsetTop',
-    'Element.offsetLeft',
-    'Element.offsetWidth',
-    'Element.offsetHeight',
-    'Element.outerText',
-    'Element.prepend',
-    'Element.removeAttributeNode',
-    'Element.set:outerHTML',
-    'Element.setApplyScroll',
-    'Element.setAttributeNode',
-    'Element.setAttributeNodeNS',
-    'Element.setDistributeScroll',
-    'Element.webkitCreateShadowRoot',
-    'Element.webkitMatchesSelector',
-    'Element.webkitPseudo',
-    'Element.webkitShadowRoot',
-    '=Event.returnValue', # Only suppress on Event, allow for BeforeUnloadEvnt.
-    'Event.srcElement',
-    'EventSource.URL',
-    'FontFace.ready',
-    'FontFaceSet.load',
-    'FontFaceSet.ready',
-    'HTMLAnchorElement.charset',
-    'HTMLAnchorElement.coords',
-    'HTMLAnchorElement.rev',
-    'HTMLAnchorElement.shape',
-    'HTMLAnchorElement.text',
-    'HTMLAppletElement.*',
-    'HTMLAreaElement.noHref',
-    'HTMLBRElement.clear',
-    'HTMLBaseFontElement.*',
-    'HTMLBodyElement.aLink',
-    'HTMLBodyElement.background',
-    'HTMLBodyElement.bgColor',
-    'HTMLBodyElement.link',
-    'HTMLBodyElement.on:beforeUnload',
-    'HTMLBodyElement.text',
-    'HTMLBodyElement.vLink',
-    'HTMLDListElement.compact',
-    'HTMLDirectoryElement.*',
-    'HTMLDivElement.align',
-    'HTMLFontElement.*',
-    'HTMLFormControlsCollection.__getter__',
-    'HTMLFormElement.get:elements',
-    'HTMLFrameElement.*',
-    'HTMLFrameSetElement.*',
-    'HTMLHRElement.align',
-    'HTMLHRElement.noShade',
-    'HTMLHRElement.size',
-    'HTMLHRElement.width',
-    'HTMLHeadElement.profile',
-    'HTMLHeadingElement.align',
-    'HTMLHtmlElement.manifest',
-    'HTMLHtmlElement.version',
-    'HTMLIFrameElement.align',
-    'HTMLIFrameElement.frameBorder',
-    'HTMLIFrameElement.longDesc',
-    'HTMLIFrameElement.marginHeight',
-    'HTMLIFrameElement.marginWidth',
-    'HTMLIFrameElement.scrolling',
-    'HTMLImageElement.align',
-    'HTMLImageElement.hspace',
-    'HTMLImageElement.longDesc',
-    'HTMLImageElement.name',
-    'HTMLImageElement.vspace',
-    'HTMLInputElement.align',
-    'HTMLLegendElement.align',
-    'HTMLLinkElement.charset',
-    'HTMLLinkElement.rev',
-    'HTMLLinkElement.target',
-    'HTMLMarqueeElement.*',
-    'HTMLMenuElement.compact',
-    'HTMLMetaElement.scheme',
-    'HTMLOListElement.compact',
-    'HTMLObjectElement.align',
-    'HTMLObjectElement.archive',
-    'HTMLObjectElement.border',
-    'HTMLObjectElement.codeBase',
-    'HTMLObjectElement.codeType',
-    'HTMLObjectElement.declare',
-    'HTMLObjectElement.hspace',
-    'HTMLObjectElement.standby',
-    'HTMLObjectElement.vspace',
-    'HTMLOptionElement.text',
-    'HTMLOptionsCollection.*',
-    'HTMLParagraphElement.align',
-    'HTMLParamElement.type',
-    'HTMLParamElement.valueType',
-    'HTMLPreElement.width',
-    'HTMLScriptElement.text',
-    'HTMLSelectElement.options',
-    'HTMLSelectElement.selectedOptions',
-    'HTMLTableCaptionElement.align',
-    'HTMLTableCellElement.abbr',
-    'HTMLTableCellElement.align',
-    'HTMLTableCellElement.axis',
-    'HTMLTableCellElement.bgColor',
-    'HTMLTableCellElement.ch',
-    'HTMLTableCellElement.chOff',
-    'HTMLTableCellElement.height',
-    'HTMLTableCellElement.noWrap',
-    'HTMLTableCellElement.scope',
-    'HTMLTableCellElement.vAlign',
-    'HTMLTableCellElement.width',
-    'HTMLTableColElement.align',
-    'HTMLTableColElement.ch',
-    'HTMLTableColElement.chOff',
-    'HTMLTableColElement.vAlign',
-    'HTMLTableColElement.width',
-    'HTMLTableElement.align',
-    'HTMLTableElement.bgColor',
-    'HTMLTableElement.cellPadding',
-    'HTMLTableElement.cellSpacing',
-    'HTMLTableElement.frame',
-    'HTMLTableElement.rules',
-    'HTMLTableElement.summary',
-    'HTMLTableElement.width',
-    'HTMLTableRowElement.align',
-    'HTMLTableRowElement.bgColor',
-    'HTMLTableRowElement.ch',
-    'HTMLTableRowElement.chOff',
-    'HTMLTableRowElement.vAlign',
-    'HTMLTableSectionElement.align',
-    'HTMLTableSectionElement.ch',
-    'HTMLTableSectionElement.chOff',
-    'HTMLTableSectionElement.vAlign',
-    'HTMLTitleElement.text',
-    'HTMLUListElement.compact',
-    'HTMLUListElement.type',
-    'IDBDatabase.transaction', # We do this in a template without the generated implementation at all.
-    'Location.valueOf',
-    'MessageEvent.data',
-    'MouseEvent.webkitMovementX',
-    'MouseEvent.webkitMovementY',
-    'MouseEvent.x',
-    'MouseEvent.y',
-    'Navigator.bluetooth',
-    'Navigator.isProtocolHandlerRegistered',
-    'Navigator.unregisterProtocolHandler',
-    'Navigator.usb',
-    'Node.compareDocumentPosition',
-    'Node.get:DOCUMENT_POSITION_CONTAINED_BY',
-    'Node.get:DOCUMENT_POSITION_CONTAINS',
-    'Node.get:DOCUMENT_POSITION_DISCONNECTED',
-    'Node.get:DOCUMENT_POSITION_FOLLOWING',
-    'Node.get:DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC',
-    'Node.get:DOCUMENT_POSITION_PRECEDING',
-    'Node.get:childNodes',
-    'Node.get:prefix',
-    'Node.hasAttributes',
-    'Node.isDefaultNamespace',
-    'Node.isEqualNode',
-    'Node.isSameNode',
-    'Node.isSupported',
-    'Node.lookupNamespaceURI',
-    'Node.lookupPrefix',
-    'Node.normalize',
-    'Node.set:nodeValue',
-    'NodeFilter.acceptNode',
-    'NodeIterator.expandEntityReferences',
-    'NodeIterator.filter',
-    'NodeList.item',
-    'ParentNode.append',
-    'ParentNode.prepend',
-    'RTCPeerConnection.generateCertificate',
-    'ShadowRoot.getElementsByTagNameNS',
-    'SVGElement.getPresentationAttribute',
-    'SVGElementInstance.on:wheel',
-    'Touch.get:webkitRadiusX',
-    'Touch.get:webkitRadiusY',
-    'Touch.get:webkitForce',
-    'Touch.get:webkitRotationAngle',
-    'WheelEvent.wheelDelta',
-    'WheelEvent.wheelDeltaX',
-    'WheelEvent.wheelDeltaY',
-    'Window.on:wheel',
-    'WindowEventHandlers.on:beforeUnload',
-    'WorkerGlobalScope.webkitIndexedDB',
-    'XMLHttpRequest.open',
-# TODO(jacobr): should these be removed?
-    'Document.close',
-    'Document.hasFocus',
+removed_html_members = monitored.Set(
+    'htmlrenamer.removed_html_members',
+    [
+        'Attr.textContent',  # Not needed as it is the same as Node.textContent.
+        'AudioContext.decodeAudioData',
+        'AudioBufferSourceNode.looping',  # TODO(vsm): Use deprecated IDL annotation
+        'CSSStyleDeclaration.getPropertyCSSValue',
+        'HTMLCanvasElement.toBlob',
+        'CanvasRenderingContext2D.clearShadow',
+        'CanvasRenderingContext2D.drawImageFromRect',
+        'CanvasRenderingContext2D.setAlpha',
+        'CanvasRenderingContext2D.setCompositeOperation',
+        'CanvasRenderingContext2D.setFillColor',
+        'CanvasRenderingContext2D.setLineCap',
+        'CanvasRenderingContext2D.setLineJoin',
+        'CanvasRenderingContext2D.setLineWidth',
+        'CanvasRenderingContext2D.setMiterLimit',
+        'CanvasRenderingContext2D.setShadow',
+        'CanvasRenderingContext2D.setStrokeColor',
+        # Disable the webKit version, imageSmoothingEnabled is exposed.
+        'CanvasRenderingContext2D.webkitImageSmoothingEnabled',
+        'CharacterData.remove',
+        'ChildNode.replaceWith',
+        'CSSStyleDeclaration.__getter__',
+        'CSSStyleDeclaration.__setter__',
+        'Window.call:blur',
+        'Window.call:focus',
+        'Window.clientInformation',
+        'Window.createImageBitmap',
+        'Window.get:frames',
+        'Window.get:length',
+        'Window.on:beforeUnload',
+        'Window.on:webkitTransitionEnd',
+        'Window.pagePopupController',
+        'Window.prompt',
+        'Window.webkitCancelAnimationFrame',
+        'Window.webkitCancelRequestAnimationFrame',
+        'Window.webkitIndexedDB',
+        'Window.webkitRequestAnimationFrame',
+        'Document.alinkColor',
+        'Document.all',
+        'Document.append',
+        'Document.applets',
+        'Document.bgColor',
+        'Document.clear',
+        'Document.createAttribute',
+        'Document.createAttributeNS',
+        'Document.createComment',
+        'Document.createExpression',
+        'Document.createNSResolver',
+        'Document.createProcessingInstruction',
+        'Document.designMode',
+        'Document.dir',
+        'Document.evaluate',
+        'Document.fgColor',
+        'Document.get:URL',
+        'Document.get:anchors',
+        'Document.get:characterSet',
+        'Document.get:compatMode',
+        'Document.get:defaultCharset',
+        'Document.get:doctype',
+        'Document.get:documentURI',
+        'Document.get:embeds',
+        'Document.get:forms',
+        'Document.get:inputEncoding',
+        'Document.get:links',
+        'Document.get:plugins',
+        'Document.get:scripts',
+        'Document.get:xmlEncoding',
+        'Document.getElementsByTagNameNS',
+        'Document.getOverrideStyle',
+        'Document.getSelection',
+        'Document.images',
+        'Document.linkColor',
+        'Document.location',
+        'Document.on:wheel',
+        'Document.open',
+        'Document.prepend',
+        'Document.register',
+        'Document.set:domain',
+        'Document.vlinkColor',
+        'Document.webkitCurrentFullScreenElement',
+        'Document.webkitFullScreenKeyboardInputAllowed',
+        'Document.write',
+        'Document.writeln',
+        'Document.xmlStandalone',
+        'Document.xmlVersion',
+        'DocumentFragment.children',
+        'DocumentType.*',
+        'DOMException.code',
+        'DOMException.ABORT_ERR',
+        'DOMException.DATA_CLONE_ERR',
+        'DOMException.DOMSTRING_SIZE_ERR',
+        'DOMException.HIERARCHY_REQUEST_ERR',
+        'DOMException.INDEX_SIZE_ERR',
+        'DOMException.INUSE_ATTRIBUTE_ERR',
+        'DOMException.INVALID_ACCESS_ERR',
+        'DOMException.INVALID_CHARACTER_ERR',
+        'DOMException.INVALID_MODIFICATION_ERR',
+        'DOMException.INVALID_NODE_TYPE_ERR',
+        'DOMException.INVALID_STATE_ERR',
+        'DOMException.NAMESPACE_ERR',
+        'DOMException.NETWORK_ERR',
+        'DOMException.NOT_FOUND_ERR',
+        'DOMException.NOT_SUPPORTED_ERR',
+        'DOMException.NO_DATA_ALLOWED_ERR',
+        'DOMException.NO_MODIFICATION_ALLOWED_ERR',
+        'DOMException.QUOTA_EXCEEDED_ERR',
+        'DOMException.SECURITY_ERR',
+        'DOMException.SYNTAX_ERR',
+        'DOMException.TIMEOUT_ERR',
+        'DOMException.TYPE_MISMATCH_ERR',
+        'DOMException.URL_MISMATCH_ERR',
+        'DOMException.VALIDATION_ERR',
+        'DOMException.WRONG_DOCUMENT_ERR',
+        'Element.accessKey',
+        'Element.append',
+        'Element.dataset',
+        'Element.get:classList',
+        'Element.getAttributeNode',
+        'Element.getAttributeNodeNS',
+        'Element.getElementsByTagNameNS',
+        'Element.innerText',
+        # TODO(terry): All offset* attributes are in both HTMLElement and Element
+        #              (it's a Chrome bug with a FIXME note to correct - sometime).
+        #              Until corrected these Element attributes must be ignored.
+        'Element.offsetParent',
+        'Element.offsetTop',
+        'Element.offsetLeft',
+        'Element.offsetWidth',
+        'Element.offsetHeight',
+        'Element.outerText',
+        'Element.prepend',
+        'Element.removeAttributeNode',
+        'Element.set:outerHTML',
+        'Element.setApplyScroll',
+        'Element.setAttributeNode',
+        'Element.setAttributeNodeNS',
+        'Element.setDistributeScroll',
+        'Element.webkitCreateShadowRoot',
+        'Element.webkitMatchesSelector',
+        'Element.webkitPseudo',
+        'Element.webkitShadowRoot',
+        '=Event.returnValue',  # Only suppress on Event, allow for BeforeUnloadEvnt.
+        'Event.srcElement',
+        'EventSource.URL',
+        'FontFace.ready',
+        'FontFaceSet.load',
+        'FontFaceSet.ready',
+        'HTMLAnchorElement.charset',
+        'HTMLAnchorElement.coords',
+        'HTMLAnchorElement.rev',
+        'HTMLAnchorElement.shape',
+        'HTMLAnchorElement.text',
+        'HTMLAppletElement.*',
+        'HTMLAreaElement.noHref',
+        'HTMLBRElement.clear',
+        'HTMLBaseFontElement.*',
+        'HTMLBodyElement.aLink',
+        'HTMLBodyElement.background',
+        'HTMLBodyElement.bgColor',
+        'HTMLBodyElement.link',
+        'HTMLBodyElement.on:beforeUnload',
+        'HTMLBodyElement.text',
+        'HTMLBodyElement.vLink',
+        'HTMLDListElement.compact',
+        'HTMLDirectoryElement.*',
+        'HTMLDivElement.align',
+        'HTMLFontElement.*',
+        'HTMLFormControlsCollection.__getter__',
+        'HTMLFormElement.get:elements',
+        'HTMLFrameElement.*',
+        'HTMLFrameSetElement.*',
+        'HTMLHRElement.align',
+        'HTMLHRElement.noShade',
+        'HTMLHRElement.size',
+        'HTMLHRElement.width',
+        'HTMLHeadElement.profile',
+        'HTMLHeadingElement.align',
+        'HTMLHtmlElement.manifest',
+        'HTMLHtmlElement.version',
+        'HTMLIFrameElement.align',
+        'HTMLIFrameElement.frameBorder',
+        'HTMLIFrameElement.longDesc',
+        'HTMLIFrameElement.marginHeight',
+        'HTMLIFrameElement.marginWidth',
+        'HTMLIFrameElement.scrolling',
+        'HTMLImageElement.align',
+        'HTMLImageElement.hspace',
+        'HTMLImageElement.longDesc',
+        'HTMLImageElement.name',
+        'HTMLImageElement.vspace',
+        'HTMLInputElement.align',
+        'HTMLLegendElement.align',
+        'HTMLLinkElement.charset',
+        'HTMLLinkElement.rev',
+        'HTMLLinkElement.target',
+        'HTMLMarqueeElement.*',
+        'HTMLMenuElement.compact',
+        'HTMLMetaElement.scheme',
+        'HTMLOListElement.compact',
+        'HTMLObjectElement.align',
+        'HTMLObjectElement.archive',
+        'HTMLObjectElement.border',
+        'HTMLObjectElement.codeBase',
+        'HTMLObjectElement.codeType',
+        'HTMLObjectElement.declare',
+        'HTMLObjectElement.hspace',
+        'HTMLObjectElement.standby',
+        'HTMLObjectElement.vspace',
+        'HTMLOptionElement.text',
+        'HTMLOptionsCollection.*',
+        'HTMLParagraphElement.align',
+        'HTMLParamElement.type',
+        'HTMLParamElement.valueType',
+        'HTMLPreElement.width',
+        'HTMLScriptElement.text',
+        'HTMLSelectElement.options',
+        'HTMLSelectElement.selectedOptions',
+        'HTMLTableCaptionElement.align',
+        'HTMLTableCellElement.abbr',
+        'HTMLTableCellElement.align',
+        'HTMLTableCellElement.axis',
+        'HTMLTableCellElement.bgColor',
+        'HTMLTableCellElement.ch',
+        'HTMLTableCellElement.chOff',
+        'HTMLTableCellElement.height',
+        'HTMLTableCellElement.noWrap',
+        'HTMLTableCellElement.scope',
+        'HTMLTableCellElement.vAlign',
+        'HTMLTableCellElement.width',
+        'HTMLTableColElement.align',
+        'HTMLTableColElement.ch',
+        'HTMLTableColElement.chOff',
+        'HTMLTableColElement.vAlign',
+        'HTMLTableColElement.width',
+        'HTMLTableElement.align',
+        'HTMLTableElement.bgColor',
+        'HTMLTableElement.cellPadding',
+        'HTMLTableElement.cellSpacing',
+        'HTMLTableElement.frame',
+        'HTMLTableElement.rules',
+        'HTMLTableElement.summary',
+        'HTMLTableElement.width',
+        'HTMLTableRowElement.align',
+        'HTMLTableRowElement.bgColor',
+        'HTMLTableRowElement.ch',
+        'HTMLTableRowElement.chOff',
+        'HTMLTableRowElement.vAlign',
+        'HTMLTableSectionElement.align',
+        'HTMLTableSectionElement.ch',
+        'HTMLTableSectionElement.chOff',
+        'HTMLTableSectionElement.vAlign',
+        'HTMLTitleElement.text',
+        'HTMLUListElement.compact',
+        'HTMLUListElement.type',
+        'IDBDatabase.transaction',  # We do this in a template without the generated implementation at all.
+        'Location.valueOf',
+        'MessageEvent.data',
+        'MouseEvent.webkitMovementX',
+        'MouseEvent.webkitMovementY',
+        'MouseEvent.x',
+        'MouseEvent.y',
+        'Navigator.bluetooth',
+        'Navigator.isProtocolHandlerRegistered',
+        'Navigator.unregisterProtocolHandler',
+        'Navigator.usb',
+        'Node.compareDocumentPosition',
+        'Node.get:DOCUMENT_POSITION_CONTAINED_BY',
+        'Node.get:DOCUMENT_POSITION_CONTAINS',
+        'Node.get:DOCUMENT_POSITION_DISCONNECTED',
+        'Node.get:DOCUMENT_POSITION_FOLLOWING',
+        'Node.get:DOCUMENT_POSITION_IMPLEMENTATION_SPECIFIC',
+        'Node.get:DOCUMENT_POSITION_PRECEDING',
+        'Node.get:childNodes',
+        'Node.get:prefix',
+        'Node.hasAttributes',
+        'Node.isDefaultNamespace',
+        'Node.isEqualNode',
+        'Node.isSameNode',
+        'Node.isSupported',
+        'Node.lookupNamespaceURI',
+        'Node.lookupPrefix',
+        'Node.normalize',
+        'Node.set:nodeValue',
+        'NodeFilter.acceptNode',
+        'NodeIterator.expandEntityReferences',
+        'NodeIterator.filter',
+        'NodeList.item',
+        'ParentNode.append',
+        'ParentNode.prepend',
+        'RTCPeerConnection.generateCertificate',
+        'ShadowRoot.getElementsByTagNameNS',
+        'SVGElement.getPresentationAttribute',
+        'SVGElementInstance.on:wheel',
+        'Touch.get:webkitRadiusX',
+        'Touch.get:webkitRadiusY',
+        'Touch.get:webkitForce',
+        'Touch.get:webkitRotationAngle',
+        'WheelEvent.wheelDelta',
+        'WheelEvent.wheelDeltaX',
+        'WheelEvent.wheelDeltaY',
+        'Window.on:wheel',
+        'WindowEventHandlers.on:beforeUnload',
+        'WorkerGlobalScope.webkitIndexedDB',
+        'XMLHttpRequest.open',
+        # TODO(jacobr): should these be removed?
+        'Document.close',
+        'Document.hasFocus',
     ])
 
 # Manual dart: library name lookup.
-_library_names = monitored.Dict('htmlrenamer._library_names', {
-  'ANGLEInstancedArrays': 'web_gl',
-  'CHROMIUMSubscribeUniform': 'web_gl',
-  'Database': 'web_sql',
-  'Navigator': 'html',
-  'Window': 'html',
-  'AnalyserNode': 'web_audio',
-  'AudioBufferCallback': 'web_audio',
-  'AudioBuffer': 'web_audio',
-  'AudioBufferSourceNode': 'web_audio',
-  'AudioContext': 'web_audio',
-  'AudioDestinationNode': 'web_audio',
-  'AudioElement': 'web_audio',
-  'AudioListener': 'web_audio',
-  'AudioNode': 'web_audio',
-  'AudioParam': 'web_audio',
-  'AudioParamMap': 'web_audio',
-  'AudioProcessingEvent': 'web_audio',
-  'AudioScheduledSourceNode': 'web_audio',
-  'AudioSourceNode': 'web_audio',
-  'AudioTrack': 'web_audio',
-  'AudioTrackList': 'web_audio',
-  'AudioWorkletGlobalScope': 'web_audio',
-  'AudioWorkletNode': 'web_audio',
-  'AudioWorkletProcessor': 'web_audio',
-  'BaseAudioContext': 'web_audio',
-  'BiquadFilterNode': 'web_audio',
-  'ChannelMergerNode': 'web_audio',
-  'ChannelSplitterNode': 'web_audio',
-  'ConstantSourceNode': 'web_audio',
-  'ConvolverNode': 'web_audio',
-  'DelayNode': 'web_audio',
-  'DynamicsCompressorNode': 'web_audio',
-  'GainNode': 'web_audio',
-  'IIRFilterNode': 'web_audio',
-  'MediaElementAudioSourceNode': 'web_audio',
-  'MediaStreamAudioDestinationNode': 'web_audio',
-  'MediaStreamAudioSourceNode': 'web_audio',
-  'OfflineAudioCompletionEvent': 'web_audio',
-  'OfflineAudioContext': 'web_audio',
-  'OscillatorNode': 'web_audio',
-  'PannerNode': 'web_audio',
-  'PeriodicWave': 'web_audio',
-  'ScriptProcessorNode': 'web_audio',
-  'StereoPannerNode': 'web_audio',
-  'WaveShaperNode': 'web_audio',
-  'WindowWebAudio': 'web_audio',
-})
+_library_names = monitored.Dict(
+    'htmlrenamer._library_names', {
+        'ANGLEInstancedArrays': 'web_gl',
+        'CHROMIUMSubscribeUniform': 'web_gl',
+        'Database': 'web_sql',
+        'Navigator': 'html',
+        'Window': 'html',
+        'AnalyserNode': 'web_audio',
+        'AudioBufferCallback': 'web_audio',
+        'AudioBuffer': 'web_audio',
+        'AudioBufferSourceNode': 'web_audio',
+        'AudioContext': 'web_audio',
+        'AudioDestinationNode': 'web_audio',
+        'AudioElement': 'web_audio',
+        'AudioListener': 'web_audio',
+        'AudioNode': 'web_audio',
+        'AudioParam': 'web_audio',
+        'AudioParamMap': 'web_audio',
+        'AudioProcessingEvent': 'web_audio',
+        'AudioScheduledSourceNode': 'web_audio',
+        'AudioSourceNode': 'web_audio',
+        'AudioTrack': 'web_audio',
+        'AudioTrackList': 'web_audio',
+        'AudioWorkletGlobalScope': 'web_audio',
+        'AudioWorkletNode': 'web_audio',
+        'AudioWorkletProcessor': 'web_audio',
+        'BaseAudioContext': 'web_audio',
+        'BiquadFilterNode': 'web_audio',
+        'ChannelMergerNode': 'web_audio',
+        'ChannelSplitterNode': 'web_audio',
+        'ConstantSourceNode': 'web_audio',
+        'ConvolverNode': 'web_audio',
+        'DelayNode': 'web_audio',
+        'DynamicsCompressorNode': 'web_audio',
+        'GainNode': 'web_audio',
+        'IIRFilterNode': 'web_audio',
+        'MediaElementAudioSourceNode': 'web_audio',
+        'MediaStreamAudioDestinationNode': 'web_audio',
+        'MediaStreamAudioSourceNode': 'web_audio',
+        'OfflineAudioCompletionEvent': 'web_audio',
+        'OfflineAudioContext': 'web_audio',
+        'OscillatorNode': 'web_audio',
+        'PannerNode': 'web_audio',
+        'PeriodicWave': 'web_audio',
+        'ScriptProcessorNode': 'web_audio',
+        'StereoPannerNode': 'web_audio',
+        'WaveShaperNode': 'web_audio',
+        'WindowWebAudio': 'web_audio',
+    })
 
-_library_ids = monitored.Dict('htmlrenamer._library_names', {
-  'ANGLEInstancedArrays': 'WebGl',
-  'CHROMIUMSubscribeUniform': 'WebGl',
-  'Database': 'WebSql',
-  'Navigator': 'Html',
-  'Window': 'Html',
-  'AnalyserNode': 'WebAudio',
-  'AudioBufferCallback': 'WebAudio',
-  'AudioBuffer': 'WebAudio',
-  'AudioBufferSourceNode': 'WebAudio',
-  'AudioContext': 'WebAudio',
-  'AudioDestinationNode': 'WebAudio',
-  'AudioListener': 'WebAudio',
-  'AudioNode': 'WebAudio',
-  'AudioParam': 'WebAudio',
-  'AudioProcessingEvent': 'WebAudio',
-  'AudioSourceNode': 'WebAudio',
-  'BiquadFilterNode': 'WebAudio',
-  'ChannelMergerNode': 'WebAudio',
-  'ChannelSplitterNode': 'WebAudio',
-  'ConvolverNode': 'WebAudio',
-  'DelayNode': 'WebAudio',
-  'DynamicsCompressorNode': 'WebAudio',
-  'GainNode': 'WebAudio',
-  'IIRFilterNode': 'WebAudio',
-  'MediaElementAudioSourceNode': 'WebAudio',
-  'MediaStreamAudioDestinationNode': 'WebAudio',
-  'MediaStreamAudioSourceNode': 'WebAudio',
-  'OfflineAudioCompletionEvent': 'WebAudio',
-  'OfflineAudioContext': 'WebAudio',
-  'OscillatorNode': 'WebAudio',
-  'PannerNode': 'WebAudio',
-  'PeriodicWave': 'WebAudio',
-  'ScriptProcessorNode': 'WebAudio',
-  'StereoPannerNode': 'WebAudio',
-  'WaveShaperNode': 'WebAudio',
-  'WindowWebAudio': 'WebAudio',
-})
+_library_ids = monitored.Dict(
+    'htmlrenamer._library_names', {
+        'ANGLEInstancedArrays': 'WebGl',
+        'CHROMIUMSubscribeUniform': 'WebGl',
+        'Database': 'WebSql',
+        'Navigator': 'Html',
+        'Window': 'Html',
+        'AnalyserNode': 'WebAudio',
+        'AudioBufferCallback': 'WebAudio',
+        'AudioBuffer': 'WebAudio',
+        'AudioBufferSourceNode': 'WebAudio',
+        'AudioContext': 'WebAudio',
+        'AudioDestinationNode': 'WebAudio',
+        'AudioListener': 'WebAudio',
+        'AudioNode': 'WebAudio',
+        'AudioParam': 'WebAudio',
+        'AudioProcessingEvent': 'WebAudio',
+        'AudioSourceNode': 'WebAudio',
+        'BiquadFilterNode': 'WebAudio',
+        'ChannelMergerNode': 'WebAudio',
+        'ChannelSplitterNode': 'WebAudio',
+        'ConvolverNode': 'WebAudio',
+        'DelayNode': 'WebAudio',
+        'DynamicsCompressorNode': 'WebAudio',
+        'GainNode': 'WebAudio',
+        'IIRFilterNode': 'WebAudio',
+        'MediaElementAudioSourceNode': 'WebAudio',
+        'MediaStreamAudioDestinationNode': 'WebAudio',
+        'MediaStreamAudioSourceNode': 'WebAudio',
+        'OfflineAudioCompletionEvent': 'WebAudio',
+        'OfflineAudioContext': 'WebAudio',
+        'OscillatorNode': 'WebAudio',
+        'PannerNode': 'WebAudio',
+        'PeriodicWave': 'WebAudio',
+        'ScriptProcessorNode': 'WebAudio',
+        'StereoPannerNode': 'WebAudio',
+        'WaveShaperNode': 'WebAudio',
+        'WindowWebAudio': 'WebAudio',
+    })
+
 
 class HtmlRenamer(object):
-  def __init__(self, database, metadata):
-    self._database = database
-    self._metadata = metadata
 
-  def RenameInterface(self, interface):
-    if 'Callback' in interface.ext_attrs:
-      if interface.id in _removed_html_interfaces:
+    def __init__(self, database, metadata):
+        self._database = database
+        self._metadata = metadata
+
+    def RenameInterface(self, interface):
+        if 'Callback' in interface.ext_attrs:
+            if interface.id in _removed_html_interfaces:
+                return None
+
+        candidate = self.RenameInterfaceId(interface.id)
+        if candidate:
+            return candidate
+
+        if interface.id.startswith('HTML'):
+            if any(interface.id in ['Element', 'Document']
+                   for interface in self._database.Hierarchy(interface)):
+                return interface.id[len('HTML'):]
+        return self._DartifyName(interface.javascript_binding_name)
+
+    def RenameInterfaceId(self, interface_id):
+        if interface_id in html_interface_renames:
+            return html_interface_renames[interface_id]
         return None
 
-    candidate = self.RenameInterfaceId(interface.id)
-    if candidate:
-      return candidate
+    def isPrivate(self, interface, member):
+        return self._FindMatch(interface, member, '', private_html_members)
 
-    if interface.id.startswith('HTML'):
-      if any(interface.id in ['Element', 'Document']
-             for interface in self._database.Hierarchy(interface)):
-        return interface.id[len('HTML'):]
-    return self._DartifyName(interface.javascript_binding_name)
-
-  def RenameInterfaceId(self, interface_id):
-    if interface_id in html_interface_renames:
-      return html_interface_renames[interface_id]
-    return None;
-
-  def isPrivate(self, interface, member):
-    return self._FindMatch(interface, member, '', private_html_members)
-
-  def RenameMember(self, interface_name, member_node, member, member_prefix='',
-      dartify_name=True):
-    """
+    def RenameMember(self,
+                     interface_name,
+                     member_node,
+                     member,
+                     member_prefix='',
+                     dartify_name=True):
+        """
     Returns the name of the member in the HTML library or None if the member is
     suppressed in the HTML library
     """
-    interface = self._database.GetInterface(interface_name)
+        interface = self._database.GetInterface(interface_name)
 
-    if not member:
-      if 'ImplementedAs' in member_node.ext_attrs:
-        member = member_node.ext_attrs['ImplementedAs']
+        if not member:
+            if 'ImplementedAs' in member_node.ext_attrs:
+                member = member_node.ext_attrs['ImplementedAs']
 
-    if self.ShouldSuppressMember(interface, member, member_prefix):
-      return None
+        if self.ShouldSuppressMember(interface, member, member_prefix):
+            return None
 
-    if 'CheckSecurity' in member_node.ext_attrs:
-      return None
+        if 'CheckSecurity' in member_node.ext_attrs:
+            return None
 
-    name = self._FindMatch(interface, member, member_prefix,
-        renamed_html_members)
+        name = self._FindMatch(interface, member, member_prefix,
+                               renamed_html_members)
 
-    target_name = renamed_html_members[name] if name else member
-    if self._FindMatch(interface, member, member_prefix, private_html_members):
-      if not target_name.startswith('_'):  # e.g. _svgClassName
-        target_name = '_' + target_name
+        target_name = renamed_html_members[name] if name else member
+        if self._FindMatch(interface, member, member_prefix,
+                           private_html_members):
+            if not target_name.startswith('_'):  # e.g. _svgClassName
+                target_name = '_' + target_name
 
-    if not name and target_name.startswith('webkit'):
-      target_name = member[len('webkit'):]
-      target_name = target_name[:1].lower() + target_name[1:]
+        if not name and target_name.startswith('webkit'):
+            target_name = member[len('webkit'):]
+            target_name = target_name[:1].lower() + target_name[1:]
 
-    if dartify_name:
-      target_name = self._DartifyMemberName(target_name)
-    return target_name
+        if dartify_name:
+            target_name = self._DartifyMemberName(target_name)
+        return target_name
 
-  def ShouldSuppressMember(self, interface, member, member_prefix=''):
-    """ Returns true if the member should be suppressed."""
-    if self._FindMatch(interface, member, member_prefix, removed_html_members):
-      return True
-    if interface.id in _removed_html_interfaces:
-      return True
-    metadata_member = member
-    if member_prefix == 'on:':
-      metadata_member = 'on' + metadata_member.lower()
-    if self._metadata.IsSuppressed(interface, metadata_member):
-      return True
-    return False
+    def ShouldSuppressMember(self, interface, member, member_prefix=''):
+        """ Returns true if the member should be suppressed."""
+        if self._FindMatch(interface, member, member_prefix,
+                           removed_html_members):
+            return True
+        if interface.id in _removed_html_interfaces:
+            return True
+        metadata_member = member
+        if member_prefix == 'on:':
+            metadata_member = 'on' + metadata_member.lower()
+        if self._metadata.IsSuppressed(interface, metadata_member):
+            return True
+        return False
 
-  def ShouldSuppressInterface(self, interface):
-    """ Returns true if the interface should be suppressed."""
-    if interface.id in _removed_html_interfaces:
-      return True
+    def ShouldSuppressInterface(self, interface):
+        """ Returns true if the interface should be suppressed."""
+        if interface.id in _removed_html_interfaces:
+            return True
 
-  def _FindMatch(self, interface, member, member_prefix, candidates):
-    def find_match(interface_id):
-      member_name = interface_id + '.' + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface_id + '.' + member_prefix + member
-      if member_name in candidates:
-        return member_name
-      member_name = interface_id + '.*'
-      if member_name in candidates:
-        return member_name
+    def _FindMatch(self, interface, member, member_prefix, candidates):
 
-    # Check direct matches first
-    match = find_match('=%s' % interface.id)
-    if match:
-      return match
+        def find_match(interface_id):
+            member_name = interface_id + '.' + member
+            if member_name in candidates:
+                return member_name
+            member_name = interface_id + '.' + member_prefix + member
+            if member_name in candidates:
+                return member_name
+            member_name = interface_id + '.*'
+            if member_name in candidates:
+                return member_name
 
-    for interface in self._database.Hierarchy(interface):
-      match = find_match(interface.id)
-      if match:
-        return match
+        # Check direct matches first
+        match = find_match('=%s' % interface.id)
+        if match:
+            return match
 
-  def GetLibraryName(self, interface):
-    # Some types have attributes merged in from many other interfaces.
-    if interface.id in _library_names:
-      return _library_names[interface.id]
+        for interface in self._database.Hierarchy(interface):
+            match = find_match(interface.id)
+            if match:
+                return match
 
-    # Support for IDL conditional has been removed from indexed db, web_sql,
-    # svg and web_gl so we can no longer determine the library based on conditional.
-    # Use interface prefix to do that.  web_audio interfaces have no common prefix
-    # - all audio interfaces added to _library_names/_library_ids.
-    if interface.id.startswith("IDB"):
-      return 'indexed_db'
-    if interface.id.startswith("SQL"):
-      return 'web_sql'
-    if interface.id.startswith("SVG"):
-      return 'svg'
-    if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
-        or interface.id.startswith("EXT") \
-        or interface.id == "WebGL":    # Name of the synthesized class for WebGL constants.
-      return 'web_gl'
+    def GetLibraryName(self, interface):
+        # Some types have attributes merged in from many other interfaces.
+        if interface.id in _library_names:
+            return _library_names[interface.id]
 
-    if interface.id in typed_array_renames:
-      return 'typed_data'
+        # Support for IDL conditional has been removed from indexed db, web_sql,
+        # svg and web_gl so we can no longer determine the library based on conditional.
+        # Use interface prefix to do that.  web_audio interfaces have no common prefix
+        # - all audio interfaces added to _library_names/_library_ids.
+        if interface.id.startswith("IDB"):
+            return 'indexed_db'
+        if interface.id.startswith("SQL"):
+            return 'web_sql'
+        if interface.id.startswith("SVG"):
+            return 'svg'
+        if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
+            or interface.id.startswith("EXT") \
+            or interface.id == "WebGL":    # Name of the synthesized class for WebGL constants.
+            return 'web_gl'
 
-    return 'html'
+        if interface.id in typed_array_renames:
+            return 'typed_data'
 
-  def GetLibraryId(self, interface):
-    # Some types have attributes merged in from many other interfaces.
-    if interface.id in _library_ids:
-      return _library_ids[interface.id]
+        return 'html'
 
-    # Support for IDL conditional has been removed from indexed db, web_sql,
-    # svg and web_gl so we can no longer determine the library based on conditional.
-    # Use interface prefix to do that.  web_audio interfaces have no common prefix
-    # - all audio interfaces added to _library_names/_library_ids.
-    if interface.id.startswith("IDB"):
-      return 'IndexedDb'
-    if interface.id.startswith("SQL"):
-      return 'WebSql'
-    if interface.id.startswith("SVG"):
-      return 'Svg'
-    if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
-        or interface.id.startswith("EXT") \
-        or interface.id == 'WebGL':     # Name of the synthesized class for WebGL constants.
-      return 'WebGl'
+    def GetLibraryId(self, interface):
+        # Some types have attributes merged in from many other interfaces.
+        if interface.id in _library_ids:
+            return _library_ids[interface.id]
 
-    if interface.id in typed_array_renames:
-      return 'TypedData'
+        # Support for IDL conditional has been removed from indexed db, web_sql,
+        # svg and web_gl so we can no longer determine the library based on conditional.
+        # Use interface prefix to do that.  web_audio interfaces have no common prefix
+        # - all audio interfaces added to _library_names/_library_ids.
+        if interface.id.startswith("IDB"):
+            return 'IndexedDb'
+        if interface.id.startswith("SQL"):
+            return 'WebSql'
+        if interface.id.startswith("SVG"):
+            return 'Svg'
+        if interface.id.startswith("WebGL") or interface.id.startswith("OES") \
+            or interface.id.startswith("EXT") \
+            or interface.id == 'WebGL':     # Name of the synthesized class for WebGL constants.
+            return 'WebGl'
 
-    return 'Html'
+        if interface.id in typed_array_renames:
+            return 'TypedData'
 
-  def DartifyTypeName(self, type_name):
-    """Converts a DOM name to a Dart-friendly class name. """
+        return 'Html'
 
-    if type_name in html_interface_renames:
-      return html_interface_renames[type_name]
+    def DartifyTypeName(self, type_name):
+        """Converts a DOM name to a Dart-friendly class name. """
 
-    return self._DartifyName(type_name)
+        if type_name in html_interface_renames:
+            return html_interface_renames[type_name]
 
-  def _DartifyName(self, dart_name):
-    # Strip off any standard prefixes.
-    name = re.sub(r'^SVG', '', dart_name)
-    name = re.sub(r'^IDB', '', name)
-    # Don't Strip the synthesized class name WebGL contains all rendering/draw constants.
-    if name != 'WebGL':
-      name = re.sub(r'^WebGL', '', name)
-    name = re.sub(r'^WebKit', '', name)
+        return self._DartifyName(type_name)
 
-    return self._CamelCaseName(name)
+    def _DartifyName(self, dart_name):
+        # Strip off any standard prefixes.
+        name = re.sub(r'^SVG', '', dart_name)
+        name = re.sub(r'^IDB', '', name)
+        # Don't Strip the synthesized class name WebGL contains all rendering/draw constants.
+        if name != 'WebGL':
+            name = re.sub(r'^WebGL', '', name)
+        name = re.sub(r'^WebKit', '', name)
 
-  def _DartifyMemberName(self, member_name):
-    # Strip off any OpenGL ES suffixes.
-    name = re.sub(r'OES$', '', member_name)
-    return self._CamelCaseName(name)
+        return self._CamelCaseName(name)
 
-  def _CamelCaseName(self, name):
+    def _DartifyMemberName(self, member_name):
+        # Strip off any OpenGL ES suffixes.
+        name = re.sub(r'OES$', '', member_name)
+        return self._CamelCaseName(name)
 
-    def toLower(match):
-      return match.group(1) + match.group(2).lower() + match.group(3)
+    def _CamelCaseName(self, name):
 
-    # We're looking for a sequence of letters which start with capital letter
-    # then a series of caps and finishes with either the end of the string or
-    # a capital letter.
-    # The [0-9] check is for names such as 2D or 3D
-    # The following test cases should match as:
-    #   WebKitCSSFilterValue: WebKit(C)(SS)(F)ilterValue
-    #   XPathNSResolver: (X)()(P)ath(N)(S)(R)esolver (no change)
-    #   IFrameElement: (I)()(F)rameElement (no change)
-    return re.sub(r'([A-Z])([A-Z]{2,})([A-Z]|$)', toLower, name)
+        def toLower(match):
+            return match.group(1) + match.group(2).lower() + match.group(3)
+
+        # We're looking for a sequence of letters which start with capital letter
+        # then a series of caps and finishes with either the end of the string or
+        # a capital letter.
+        # The [0-9] check is for names such as 2D or 3D
+        # The following test cases should match as:
+        #   WebKitCSSFilterValue: WebKit(C)(SS)(F)ilterValue
+        #   XPathNSResolver: (X)()(P)ath(N)(S)(R)esolver (no change)
+        #   IFrameElement: (I)()(F)rameElement (no change)
+        return re.sub(r'([A-Z])([A-Z]{2,})([A-Z]|$)', toLower, name)
diff --git a/tools/dom/scripts/idlnode.py b/tools/dom/scripts/idlnode.py
index 6149474..6ce89a5 100644
--- a/tools/dom/scripts/idlnode.py
+++ b/tools/dom/scripts/idlnode.py
@@ -15,145 +15,146 @@
 # Report of union types mapped to any.
 _unions_to_any = []
 
+
 def report_unions_to_any():
-  global _unions_to_any
+    global _unions_to_any
 
-  warnings = []
-  for union_id in sorted(_unions_to_any):
-    warnings.append('Union type %s is mapped to \'any\'' % union_id)
+    warnings = []
+    for union_id in sorted(_unions_to_any):
+        warnings.append('Union type %s is mapped to \'any\'' % union_id)
 
-  return warnings
+    return warnings
+
 
 # Ugly but Chrome IDLs can reference typedefs in any IDL w/o an include.  So we
 # need to remember any typedef seen then alias any reference to a typedef.
 _typeDefsFixup = []
 
+
 def _addTypedef(typedef):
-  _typeDefsFixup.append(typedef)
+    _typeDefsFixup.append(typedef)
+
 
 def resolveTypedef(type):
-  """ Given a type if it's a known typedef (only typedef's that aren't union)
+    """ Given a type if it's a known typedef (only typedef's that aren't union)
       are remembered for fixup.  typedefs that are union type are mapped to
       any so those we don't need to alias.  typedefs referenced in the file
       where the typedef was defined are automatically aliased to the real type.
       This resolves typedef where the declaration is in another IDL file.
   """
-  for typedef in _typeDefsFixup:
-    if typedef.id == type.id:
-      return typedef.type
+    for typedef in _typeDefsFixup:
+        if typedef.id == type.id:
+            return typedef.type
 
-  return type
+    return type
 
 
 _operation_suffix_map = {
-  '__getter__': "Getter",
-  '__setter__': "Setter",
-  '__delete__': "Deleter",
+    '__getter__': "Getter",
+    '__setter__': "Setter",
+    '__delete__': "Deleter",
 }
 
+
 class IDLNode(object):
-  """Base class for all IDL elements.
+    """Base class for all IDL elements.
   IDLNode may contain various child nodes, and have properties. Examples
   of IDLNode are interfaces, interface members, function arguments,
   etc.
   """
 
-  def __init__(self, ast, id=None):
-    """Initializes an IDLNode from a PegParser AST output."""
-    if ast:
-      self.id = self._find_first(ast, 'Id') if ast is not None else None
-    else:
-      # Support synthesized IDLNode created w/o an AST (e.g., setlike support).
-      self.id = id
+    def __init__(self, ast, id=None):
+        """Initializes an IDLNode from a PegParser AST output."""
+        if ast:
+            self.id = self._find_first(ast, 'Id') if ast is not None else None
+        else:
+            # Support synthesized IDLNode created w/o an AST (e.g., setlike support).
+            self.id = id
 
-  def __repr__(self):
-    """Generates string of the form <class id extra extra ... 0x12345678>."""
-    extras = self._extra_repr()
-    if isinstance(extras, list):
-      extras = ' '.join([str(e) for e in extras])
-    try:
-      if self.id:
-        return '<%s %s 0x%x>' % (
-            type(self).__name__,
-            ('%s %s' % (self.id, extras)).strip(),
-            hash(self))
-      return '<%s %s 0x%x>' % (
-          type(self).__name__,
-          extras,
-          hash(self))
-    except Exception, e:
-      return "can't convert to string: %s" % e
+    def __repr__(self):
+        """Generates string of the form <class id extra extra ... 0x12345678>."""
+        extras = self._extra_repr()
+        if isinstance(extras, list):
+            extras = ' '.join([str(e) for e in extras])
+        try:
+            if self.id:
+                return '<%s %s 0x%x>' % (type(self).__name__,
+                                         ('%s %s' % (self.id, extras)).strip(),
+                                         hash(self))
+            return '<%s %s 0x%x>' % (type(self).__name__, extras, hash(self))
+        except Exception, e:
+            return "can't convert to string: %s" % e
 
-  def _extra_repr(self):
-    """Returns string of extra info for __repr__()."""
-    return ''
+    def _extra_repr(self):
+        """Returns string of extra info for __repr__()."""
+        return ''
 
-  def __cmp__(self, other):
-    """Override default compare operation.
+    def __cmp__(self, other):
+        """Override default compare operation.
     IDLNodes are equal if all their properties are equal."""
-    if other is None or not isinstance(other, IDLNode):
-      return 1
-    return self.__dict__.__cmp__(other.__dict__)
+        if other is None or not isinstance(other, IDLNode):
+            return 1
+        return self.__dict__.__cmp__(other.__dict__)
 
-  def reset_id(self, newId):
-    """Reset the id of the Node.  This is typically done during a normalization
+    def reset_id(self, newId):
+        """Reset the id of the Node.  This is typically done during a normalization
     phase (e.g., "DOMWindow" -> "Window")."""
-    self.id = newId
+        self.id = newId
 
-  def all(self, type_filter=None):
-    """Returns a list containing this node and all it child nodes
+    def all(self, type_filter=None):
+        """Returns a list containing this node and all it child nodes
     (recursive).
 
     Args:
       type_filter -- can be used to limit the results to a specific
         node type (e.g. IDLOperation).
     """
-    res = []
-    if type_filter is None or isinstance(self, type_filter):
-      res.append(self)
-    for v in self._all_subnodes():
-      if isinstance(v, IDLNode):
-        res.extend(v.all(type_filter))
-      elif isinstance(v, list):
-        for item in v:
-          if isinstance(item, IDLNode):
-            res.extend(item.all(type_filter))
-    return res
+        res = []
+        if type_filter is None or isinstance(self, type_filter):
+            res.append(self)
+        for v in self._all_subnodes():
+            if isinstance(v, IDLNode):
+                res.extend(v.all(type_filter))
+            elif isinstance(v, list):
+                for item in v:
+                    if isinstance(item, IDLNode):
+                        res.extend(item.all(type_filter))
+        return res
 
-  def _all_subnodes(self):
-    """Accessor used by all() to find subnodes."""
-    return self.__dict__.values()
+    def _all_subnodes(self):
+        """Accessor used by all() to find subnodes."""
+        return self.__dict__.values()
 
-  def to_dict(self):
-    """Converts the IDLNode and its children into a dictionary.
+    def to_dict(self):
+        """Converts the IDLNode and its children into a dictionary.
     This method is useful mostly for debugging and pretty printing.
     """
-    res = {}
-    for (k, v) in self.__dict__.items():
-      if v == None or v == False or v == [] or v == {}:
-        # Skip empty/false members.
-        continue
-      elif isinstance(v, IDLDictNode) and not len(v):
-        # Skip empty dict sub-nodes.
-        continue
-      elif isinstance(v, list):
-        # Convert lists:
-        new_v = []
-        for sub_node in v:
-          if isinstance(sub_node, IDLNode):
-            # Convert sub-node:
-            new_v.append(sub_node.to_dict())
-          else:
-            new_v.append(sub_node)
-        v = new_v
-      elif isinstance(v, IDLNode):
-        # Convert sub-node:
-        v = v.to_dict()
-      res[k] = v
-    return res
+        res = {}
+        for (k, v) in self.__dict__.items():
+            if v == None or v == False or v == [] or v == {}:
+                # Skip empty/false members.
+                continue
+            elif isinstance(v, IDLDictNode) and not len(v):
+                # Skip empty dict sub-nodes.
+                continue
+            elif isinstance(v, list):
+                # Convert lists:
+                new_v = []
+                for sub_node in v:
+                    if isinstance(sub_node, IDLNode):
+                        # Convert sub-node:
+                        new_v.append(sub_node.to_dict())
+                    else:
+                        new_v.append(sub_node)
+                v = new_v
+            elif isinstance(v, IDLNode):
+                # Convert sub-node:
+                v = v.to_dict()
+            res[k] = v
+        return res
 
-  def _find_all(self, ast, label, max_results=sys.maxint):
-    """Searches the AST for tuples with a given label. The PegParser
+    def _find_all(self, ast, label, max_results=sys.maxint):
+        """Searches the AST for tuples with a given label. The PegParser
     output is composed of lists and tuples, where the tuple 1st argument
     is a label. If ast root is a list, will search recursively inside each
     member in the list.
@@ -164,109 +165,111 @@
       res -- results are put into this list.
       max_results -- maximum number of results.
     """
-    res = []
-    if max_results <= 0:
-      return res
+        res = []
+        if max_results <= 0:
+            return res
 
-    if isinstance(ast, list):
-      for childAst in ast:
-        if childAst and \
-           not(isinstance(childAst, dict)) and \
-           not(isinstance(childAst, str)) and \
-           not(isinstance(childAst, tuple)) and \
-           childAst.__module__ == "idl_definitions":
-          field_name = self._convert_label_to_field(label)
-          if hasattr(childAst, field_name):
-            field_value = getattr(childAst, field_name)
-            # It's an IdlType we need the string name of the type.
-            if field_name == 'idl_type':
-              field_value =  getattr(field_value, 'base_type')
-            res.append(field_value)
-        else:
-          sub_res = self._find_all(childAst, label,
-                       max_results - len(res))
-          res.extend(sub_res)
-    elif isinstance(ast, tuple):
-      (nodeLabel, value) = ast
-      if nodeLabel == label:
-        res.append(value)
-    # TODO(terry): Seems bogus to check for so many things probably better to just
-    #              pass in blink_compile and drive it off from that...
-    elif (ast and not(isinstance(ast, dict)) and
-          not(isinstance(ast, str)) and
-          (ast.__module__ == "idl_definitions" or ast.__module__ == "idl_types")):
-      field_name = self._convert_label_to_field(label)
-      if hasattr(ast, field_name):
-        field_value = getattr(ast, field_name)
-        if field_value:
-          if label == 'Interface' or label == 'Enum' or label == "Dictionary":
-            for key in field_value:
-              value = field_value[key]
-              res.append(value)
-          elif isinstance(field_value, list):
-            for item in field_value:
-              res.append(item)
-          elif label == 'ParentInterface' or label == 'InterfaceType':
-            # Fetch the AST for the parent interface.
-            parent_idlnode = new_asts[field_value]
-            res.append(parent_idlnode.interfaces[field_value])
-          else:
-            res.append(field_value)
+        if isinstance(ast, list):
+            for childAst in ast:
+                if childAst and \
+                   not(isinstance(childAst, dict)) and \
+                   not(isinstance(childAst, str)) and \
+                   not(isinstance(childAst, tuple)) and \
+                   childAst.__module__ == "idl_definitions":
+                    field_name = self._convert_label_to_field(label)
+                    if hasattr(childAst, field_name):
+                        field_value = getattr(childAst, field_name)
+                        # It's an IdlType we need the string name of the type.
+                        if field_name == 'idl_type':
+                            field_value = getattr(field_value, 'base_type')
+                        res.append(field_value)
+                else:
+                    sub_res = self._find_all(childAst, label,
+                                             max_results - len(res))
+                    res.extend(sub_res)
+        elif isinstance(ast, tuple):
+            (nodeLabel, value) = ast
+            if nodeLabel == label:
+                res.append(value)
+        # TODO(terry): Seems bogus to check for so many things probably better to just
+        #              pass in blink_compile and drive it off from that...
+        elif (ast and not (isinstance(ast, dict)) and
+              not (isinstance(ast, str)) and
+              (ast.__module__ == "idl_definitions" or
+               ast.__module__ == "idl_types")):
+            field_name = self._convert_label_to_field(label)
+            if hasattr(ast, field_name):
+                field_value = getattr(ast, field_name)
+                if field_value:
+                    if label == 'Interface' or label == 'Enum' or label == "Dictionary":
+                        for key in field_value:
+                            value = field_value[key]
+                            res.append(value)
+                    elif isinstance(field_value, list):
+                        for item in field_value:
+                            res.append(item)
+                    elif label == 'ParentInterface' or label == 'InterfaceType':
+                        # Fetch the AST for the parent interface.
+                        parent_idlnode = new_asts[field_value]
+                        res.append(parent_idlnode.interfaces[field_value])
+                    else:
+                        res.append(field_value)
 
-    return res
+        return res
 
-  def _find_first(self, ast, label):
-    """Convenience method for _find_all(..., max_results=1).
+    def _find_first(self, ast, label):
+        """Convenience method for _find_all(..., max_results=1).
     Returns a single element instead of a list, or None if nothing
     is found."""
-    res = self._find_all(ast, label, max_results=1)
-    if len(res):
-      return res[0]
-    return None
+        res = self._find_all(ast, label, max_results=1)
+        if len(res):
+            return res[0]
+        return None
 
-  def _has(self, ast, label):
-    """Returns true if an element with the given label is
+    def _has(self, ast, label):
+        """Returns true if an element with the given label is
     in the AST by searching for it."""
-    return len(self._find_all(ast, label, max_results=1)) == 1
+        return len(self._find_all(ast, label, max_results=1)) == 1
 
-  # Mapping from original AST tuple names to new AST field names idl_definitions.Idl*.
-  def _convert_label_to_field(self, label):
-    label_field = {
-      # Keys old AST names, Values Blink IdlInterface names.
-      'ParentInterface': 'parent',
-      'Id': 'name',
-      'Interface': 'interfaces',
-      'Callback_Function': 'callback_functions',
-      'Callback': 'is_callback',
-      'Partial': 'is_partial',
-      'Operation': 'operations',
-      'Attribute': 'attributes',
-      'Const': 'constants',
-      'Type': 'idl_type',
-      'ExtAttrs':  'extended_attributes',
-      'Special': 'specials',
-      'ReturnType': 'idl_type',
-      'Argument': 'arguments',
-      'InterfaceType': 'name',
-      'ConstExpr': 'value',
-      'Static': 'is_static',
-      'ReadOnly': 'is_read_only',
-      'Optional': 'is_optional',
-      'Nullable': 'is_nullable',
-      'Enum': 'enumerations',
-      'Annotation': '',         # TODO(terry): Ignore annotation used for database cache.
-      'TypeDef': '',            # typedef in an IDL are already resolved.
-      'Dictionary': 'dictionaries',
-      'Member': 'members',
-      'Default': 'default_value',   # Dictionary member default value
-    }
-    result = label_field.get(label)
-    if result != '' and not(result):
-      print 'FATAL ERROR: AST mapping name not found %s.' % label
-    return result if result else ''
+    # Mapping from original AST tuple names to new AST field names idl_definitions.Idl*.
+    def _convert_label_to_field(self, label):
+        label_field = {
+            # Keys old AST names, Values Blink IdlInterface names.
+            'ParentInterface': 'parent',
+            'Id': 'name',
+            'Interface': 'interfaces',
+            'Callback_Function': 'callback_functions',
+            'Callback': 'is_callback',
+            'Partial': 'is_partial',
+            'Operation': 'operations',
+            'Attribute': 'attributes',
+            'Const': 'constants',
+            'Type': 'idl_type',
+            'ExtAttrs': 'extended_attributes',
+            'Special': 'specials',
+            'ReturnType': 'idl_type',
+            'Argument': 'arguments',
+            'InterfaceType': 'name',
+            'ConstExpr': 'value',
+            'Static': 'is_static',
+            'ReadOnly': 'is_read_only',
+            'Optional': 'is_optional',
+            'Nullable': 'is_nullable',
+            'Enum': 'enumerations',
+            'Annotation':
+            '',  # TODO(terry): Ignore annotation used for database cache.
+            'TypeDef': '',  # typedef in an IDL are already resolved.
+            'Dictionary': 'dictionaries',
+            'Member': 'members',
+            'Default': 'default_value',  # Dictionary member default value
+        }
+        result = label_field.get(label)
+        if result != '' and not (result):
+            print 'FATAL ERROR: AST mapping name not found %s.' % label
+        return result if result else ''
 
-  def _convert_all(self, ast, label, idlnode_ctor):
-    """Converts AST elements into IDLNode elements.
+    def _convert_all(self, ast, label, idlnode_ctor):
+        """Converts AST elements into IDLNode elements.
     Uses _find_all to find elements with a given label and converts
     them into IDLNodes with a given constructor.
     Returns:
@@ -277,511 +280,544 @@
       idlnode_ctor -- a constructor function of one of the IDLNode
         sub-classes.
     """
-    res = []
-    found = self._find_all(ast, label)
-    if not found:
-      return res
-    if not isinstance(found, list):
-      raise RuntimeError("Expected list but %s found" % type(found))
-    for childAst in found:
-      converted = idlnode_ctor(childAst)
-      res.append(converted)
-    return res
+        res = []
+        found = self._find_all(ast, label)
+        if not found:
+            return res
+        if not isinstance(found, list):
+            raise RuntimeError("Expected list but %s found" % type(found))
+        for childAst in found:
+            converted = idlnode_ctor(childAst)
+            res.append(converted)
+        return res
 
-  def _convert_first(self, ast, label, idlnode_ctor):
-    """Like _convert_all, but only converts the first found results."""
-    childAst = self._find_first(ast, label)
-    if not childAst:
-      return None
-    return idlnode_ctor(childAst)
+    def _convert_first(self, ast, label, idlnode_ctor):
+        """Like _convert_all, but only converts the first found results."""
+        childAst = self._find_first(ast, label)
+        if not childAst:
+            return None
+        return idlnode_ctor(childAst)
 
-  def _convert_ext_attrs(self, ast):
-    """Helper method for uniform conversion of extended attributes."""
-    self.ext_attrs = IDLExtAttrs(ast)
+    def _convert_ext_attrs(self, ast):
+        """Helper method for uniform conversion of extended attributes."""
+        self.ext_attrs = IDLExtAttrs(ast)
 
-  def _convert_annotations(self, ast):
-    """Helper method for uniform conversion of annotations."""
-    self.annotations = IDLAnnotations(ast)
+    def _convert_annotations(self, ast):
+        """Helper method for uniform conversion of annotations."""
+        self.annotations = IDLAnnotations(ast)
 
-  def _convert_constants(self, ast, js_name):
-    """Helper method for uniform conversion of dictionary members."""
-    self.members = IDLDictionaryMembers(ast, js_name)
+    def _convert_constants(self, ast, js_name):
+        """Helper method for uniform conversion of dictionary members."""
+        self.members = IDLDictionaryMembers(ast, js_name)
 
 
 class IDLDictNode(IDLNode):
-  """Base class for dictionary-like IDL nodes such as extended attributes
+    """Base class for dictionary-like IDL nodes such as extended attributes
   and annotations. The base class implements various dict interfaces."""
 
-  def __init__(self, ast):
-    IDLNode.__init__(self, None)
-    if ast is not None and isinstance(ast, dict):
-      self.__map = ast
-    else:
-      self.__map = {}
+    def __init__(self, ast):
+        IDLNode.__init__(self, None)
+        if ast is not None and isinstance(ast, dict):
+            self.__map = ast
+        else:
+            self.__map = {}
 
-  def __len__(self):
-    return len(self.__map)
+    def __len__(self):
+        return len(self.__map)
 
-  def __getitem__(self, key):
-    return self.__map[key]
+    def __getitem__(self, key):
+        return self.__map[key]
 
-  def __setitem__(self, key, value):
-    self.__map[key] = value
+    def __setitem__(self, key, value):
+        self.__map[key] = value
 
-  def __delitem__(self, key):
-    del self.__map[key]
+    def __delitem__(self, key):
+        del self.__map[key]
 
-  def __contains__(self, key):
-    return key in self.__map
+    def __contains__(self, key):
+        return key in self.__map
 
-  def __iter__(self):
-    return self.__map.__iter__()
+    def __iter__(self):
+        return self.__map.__iter__()
 
-  def get(self, key, default=None):
-    return self.__map.get(key, default)
+    def get(self, key, default=None):
+        return self.__map.get(key, default)
 
-  def setdefault(self, key, value=None):
-    return self.__map.setdefault(key, value)
+    def setdefault(self, key, value=None):
+        return self.__map.setdefault(key, value)
 
-  def items(self):
-    return self.__map.items()
+    def items(self):
+        return self.__map.items()
 
-  def keys(self):
-    return self.__map.keys()
+    def keys(self):
+        return self.__map.keys()
 
-  def values(self):
-    return self.__map.values()
+    def values(self):
+        return self.__map.values()
 
-  def clear(self):
-    self.__map = {}
+    def clear(self):
+        self.__map = {}
 
-  def to_dict(self):
-    """Overrides the default IDLNode.to_dict behavior.
+    def to_dict(self):
+        """Overrides the default IDLNode.to_dict behavior.
     The IDLDictNode members are copied into a new dictionary, and
     IDLNode members are recursively converted into dicts as well.
     """
-    res = {}
-    for (k, v) in self.__map.items():
-      if isinstance(v, IDLNode):
-        v = v.to_dict()
-      res[k] = v
-    return res
+        res = {}
+        for (k, v) in self.__map.items():
+            if isinstance(v, IDLNode):
+                v = v.to_dict()
+            res[k] = v
+        return res
 
-  def _all_subnodes(self):
-    # Usually an IDLDictNode does not contain further IDLNodes.
-    return []
+    def _all_subnodes(self):
+        # Usually an IDLDictNode does not contain further IDLNodes.
+        return []
 
 
 class IDLFile(IDLNode):
-  """IDLFile is the top-level node in each IDL file. It may contain interfaces."""
+    """IDLFile is the top-level node in each IDL file. It may contain interfaces."""
 
-  DART_IDL = 'dart.idl'
+    DART_IDL = 'dart.idl'
 
-  def __init__(self, ast, filename=None):
-    IDLNode.__init__(self, ast)
-    self.filename = filename
+    def __init__(self, ast, filename=None):
+        IDLNode.__init__(self, ast)
+        self.filename = filename
 
-    filename_basename = os.path.basename(filename)
+        filename_basename = os.path.basename(filename)
 
-    # Report of union types mapped to any.
+        # Report of union types mapped to any.
 
-    # Remember all the typedefs before we start walking the AST.  Some
-    # IDLs now have typedefs before interfaces.  So we need to remember
-    # to resolve the typedefs.
-    self.typeDefs = self._convert_all(ast, 'TypeDef', IDLTypeDef)
-    for typedefName in ast.typedefs:
-      typedef_type = ast.typedefs[typedefName]
-      # Ignore unions and dictionaries for now we just want normal typedefs to resolve our arguments/types.
-      if not(isinstance(typedef_type.idl_type, IdlUnionType)) and not(typedef_type.idl_type.base_type == 'Dictionary'):
-        _addTypedef(IDLTypeDef(typedef_type))
+        # Remember all the typedefs before we start walking the AST.  Some
+        # IDLs now have typedefs before interfaces.  So we need to remember
+        # to resolve the typedefs.
+        self.typeDefs = self._convert_all(ast, 'TypeDef', IDLTypeDef)
+        for typedefName in ast.typedefs:
+            typedef_type = ast.typedefs[typedefName]
+            # Ignore unions and dictionaries for now we just want normal typedefs to resolve our arguments/types.
+            if not (isinstance(typedef_type.idl_type, IdlUnionType)) and not (
+                    typedef_type.idl_type.base_type == 'Dictionary'):
+                _addTypedef(IDLTypeDef(typedef_type))
 
-    self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
-    self.dictionaries = self._convert_all(ast, 'Dictionary', IDLDictionary)
+        self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
+        self.dictionaries = self._convert_all(ast, 'Dictionary', IDLDictionary)
 
-    if len(ast.callback_functions) > 0:
-      callback_functions = self._convert_all(ast, 'Callback_Function', IDLCallbackFunction)
-      for callback_function in callback_functions:
-        for annotation in callback_function.annotations:
-          callback = callback_function.annotations[annotation]
-          cb_interface = IDLInterface(None, callback.name)
-          cb_interface.ext_attrs['Callback'] = len(callback.arguments)
-          op = IDLOperation(None, cb_interface.id, "handleEvent")
-          op.type = IDLType(callback.idl_type)
-          op.type = resolveTypedef(op.type)
+        if len(ast.callback_functions) > 0:
+            callback_functions = self._convert_all(ast, 'Callback_Function',
+                                                   IDLCallbackFunction)
+            for callback_function in callback_functions:
+                for annotation in callback_function.annotations:
+                    callback = callback_function.annotations[annotation]
+                    cb_interface = IDLInterface(None, callback.name)
+                    cb_interface.ext_attrs['Callback'] = len(callback.arguments)
+                    op = IDLOperation(None, cb_interface.id, "handleEvent")
+                    op.type = IDLType(callback.idl_type)
+                    op.type = resolveTypedef(op.type)
 
-          if len(callback.arguments) > 0:
-            op.arguments = self._convert_all(callback, 'Argument', IDLArgument)
+                    if len(callback.arguments) > 0:
+                        op.arguments = self._convert_all(
+                            callback, 'Argument', IDLArgument)
 
-          cb_interface.operations = [op]
-          self.interfaces.append(cb_interface)
+                    cb_interface.operations = [op]
+                    self.interfaces.append(cb_interface)
 
-    is_blink = not(isinstance(ast, list)) and ast.__module__ == 'idl_definitions'
+        is_blink = not (isinstance(
+            ast, list)) and ast.__module__ == 'idl_definitions'
 
-    if is_blink:
-      # implements is handled by the interface merging step (see the function
-      # merge_interface_dependencies).
-      for interface in self.interfaces:
-        blink_interface = ast.interfaces.get(interface.id)
-        if filename_basename == self.DART_IDL:
-          # Special handling for dart.idl we need to remember the interface,
-          # since we could have many (not one interface / file). Then build up
-          # the IDLImplementsStatement for any implements in dart.idl.
-          interface_info = dependency.get_interfaces_info()['__dart_idl___'];
+        if is_blink:
+            # implements is handled by the interface merging step (see the function
+            # merge_interface_dependencies).
+            for interface in self.interfaces:
+                blink_interface = ast.interfaces.get(interface.id)
+                if filename_basename == self.DART_IDL:
+                    # Special handling for dart.idl we need to remember the interface,
+                    # since we could have many (not one interface / file). Then build up
+                    # the IDLImplementsStatement for any implements in dart.idl.
+                    interface_info = dependency.get_interfaces_info(
+                    )['__dart_idl___']
 
-          self.implementsStatements = []
+                    self.implementsStatements = []
 
-          implement_pairs = interface_info['implement_pairs']
-          for implement_pair in implement_pairs:
-            interface_name = implement_pair[0]
-            implemented_name = implement_pair[1]
+                    implement_pairs = interface_info['implement_pairs']
+                    for implement_pair in implement_pairs:
+                        interface_name = implement_pair[0]
+                        implemented_name = implement_pair[1]
 
-            implementor = new_asts[interface_name].interfaces.get(interface_name)
-            implement_statement = self._createImplementsStatement(implementor,
-                                                                  implemented_name)
+                        implementor = new_asts[interface_name].interfaces.get(
+                            interface_name)
+                        implement_statement = self._createImplementsStatement(
+                            implementor, implemented_name)
 
-            self.implementsStatements.append(implement_statement)
-        elif interface.id in dependency.get_interfaces_info():
-          interface_info = dependency.get_interfaces_info()[interface.id]
+                        self.implementsStatements.append(implement_statement)
+                elif interface.id in dependency.get_interfaces_info():
+                    interface_info = dependency.get_interfaces_info()[interface.
+                                                                      id]
 
-          implements = interface_info['implements_interfaces'] if interface_info.has_key('implements_interfaces') else []
-          if not(blink_interface.is_partial) and len(implements) > 0:
-            implementor = new_asts[interface.id].interfaces.get(interface.id)
+                    implements = interface_info[
+                        'implements_interfaces'] if interface_info.has_key(
+                            'implements_interfaces') else []
+                    if not (blink_interface.is_partial) and len(implements) > 0:
+                        implementor = new_asts[interface.id].interfaces.get(
+                            interface.id)
 
-            self.implementsStatements = []
+                        self.implementsStatements = []
 
-            # TODO(terry): Need to handle more than one implements.
-            for implemented_name in implements:
-              implement_statement = self._createImplementsStatement(implementor,
-                                                                    implemented_name)
-              self.implementsStatements.append(implement_statement)
-          else:
-            self.implementsStatements = []
-    else:
-      self.implementsStatements = self._convert_all(ast, 'ImplStmt',
-        IDLImplementsStatement)
+                        # TODO(terry): Need to handle more than one implements.
+                        for implemented_name in implements:
+                            implement_statement = self._createImplementsStatement(
+                                implementor, implemented_name)
+                            self.implementsStatements.append(
+                                implement_statement)
+                    else:
+                        self.implementsStatements = []
+        else:
+            self.implementsStatements = self._convert_all(
+                ast, 'ImplStmt', IDLImplementsStatement)
 
-    # Record typedefs that are unions.
-    for typedefName in ast.typedefs:
-      typedef_type = ast.typedefs[typedefName]
-      if isinstance(typedef_type.idl_type, IdlUnionType):
-        self.typeDefs.append(IDLTypeDef(typedef_type))
-      elif typedef_type.idl_type.base_type == 'Dictionary':
-        dictionary = IDLDictionary(typedef_type, True)
-        self.dictionaries.append(dictionary)
+        # Record typedefs that are unions.
+        for typedefName in ast.typedefs:
+            typedef_type = ast.typedefs[typedefName]
+            if isinstance(typedef_type.idl_type, IdlUnionType):
+                self.typeDefs.append(IDLTypeDef(typedef_type))
+            elif typedef_type.idl_type.base_type == 'Dictionary':
+                dictionary = IDLDictionary(typedef_type, True)
+                self.dictionaries.append(dictionary)
 
-    self.enums = self._convert_all(ast, 'Enum', IDLEnum)
+        self.enums = self._convert_all(ast, 'Enum', IDLEnum)
 
-  def _createImplementsStatement(self, implementor, implemented_name):
-    implemented = new_asts[implemented_name].interfaces.get(implemented_name)
+    def _createImplementsStatement(self, implementor, implemented_name):
+        implemented = new_asts[implemented_name].interfaces.get(
+            implemented_name)
 
-    implement_statement = IDLImplementsStatement(implemented)
+        implement_statement = IDLImplementsStatement(implemented)
 
-    implement_statement.implementor = IDLType(implementor)
-    implement_statement.implemented = IDLType(implemented)
+        implement_statement.implementor = IDLType(implementor)
+        implement_statement.implemented = IDLType(implemented)
 
-    return implement_statement
+        return implement_statement
 
 
 class IDLModule(IDLNode):
-  """IDLModule has an id, and may contain interfaces, type defs and
+    """IDLModule has an id, and may contain interfaces, type defs and
   implements statements."""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    self._convert_ext_attrs(ast)
-    self._convert_annotations(ast)
-    self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
 
-    is_blink = ast.__module__ == 'idl_definitions'
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        self._convert_ext_attrs(ast)
+        self._convert_annotations(ast)
+        self.interfaces = self._convert_all(ast, 'Interface', IDLInterface)
 
-    # No reason to handle typedef they're already aliased in Blink's AST.
-    self.typeDefs = [] if is_blink else self._convert_all(ast, 'TypeDef', IDLTypeDef)
+        is_blink = ast.__module__ == 'idl_definitions'
 
-    self.enums = self._convert_all(ast, 'Enum', IDLNode)
+        # No reason to handle typedef they're already aliased in Blink's AST.
+        self.typeDefs = [] if is_blink else self._convert_all(
+            ast, 'TypeDef', IDLTypeDef)
 
-    if is_blink:
-      # implements is handled by the interface merging step (see the function
-      # merge_interface_dependencies).
-      for interface in self.interfaces:
-        interface_info = get_interfaces_info()[interface.id]
-        # TODO(terry): Same handling for implementsStatements as in IDLFile?
-        self.implementsStatements = interface_info['implements_interfaces']
-    else:
-      self.implementsStatements = self._convert_all(ast, 'ImplStmt',
-        IDLImplementsStatement)
+        self.enums = self._convert_all(ast, 'Enum', IDLNode)
+
+        if is_blink:
+            # implements is handled by the interface merging step (see the function
+            # merge_interface_dependencies).
+            for interface in self.interfaces:
+                interface_info = get_interfaces_info()[interface.id]
+                # TODO(terry): Same handling for implementsStatements as in IDLFile?
+                self.implementsStatements = interface_info[
+                    'implements_interfaces']
+        else:
+            self.implementsStatements = self._convert_all(
+                ast, 'ImplStmt', IDLImplementsStatement)
 
 
 class IDLExtAttrs(IDLDictNode):
-  """IDLExtAttrs is an IDLDictNode that stores IDL Extended Attributes.
+    """IDLExtAttrs is an IDLDictNode that stores IDL Extended Attributes.
   Modules, interfaces, members and arguments can all own IDLExtAttrs."""
-  def __init__(self, ast=None):
-    IDLDictNode.__init__(self, None)
-    if not ast:
-      return
-    if not(isinstance(ast, list)) and ast.__module__ == "idl_definitions":
-      # Pull out extended attributes from Blink AST.
-      for name, value in ast.extended_attributes.items():
-        # TODO(terry): Handle constructors...
-        if name == 'NamedConstructor' or name == 'Constructor':
-          for constructor in ast.constructors:
-            if constructor.name == 'NamedConstructor':
-              constructor_name = ast.extended_attributes['NamedConstructor']
-            else:
-              constructor_name = None
-            func_value = IDLExtAttrFunctionValue(constructor_name, constructor.arguments, True)
-            if name == 'Constructor':
-              self.setdefault('Constructor', []).append(func_value)
-            else:
-              self[name] = func_value
-        elif name == 'SetWrapperReferenceTo':
-          # NOTE: No need to process handling for GC wrapper.  But if its a reference
-          # to another type via an IdlArgument we'd need to convert to IDLArgument
-          # otherwise the type might be a reference to another type and the circularity
-          # will break deep_copy which is done later to the interfaces in the
-          # database.  If we every need SetWrapperReferenceTo then we'd need to
-          # convert IdlArgument to IDLArgument.
-          continue
+
+    def __init__(self, ast=None):
+        IDLDictNode.__init__(self, None)
+        if not ast:
+            return
+        if not (isinstance(ast, list)) and ast.__module__ == "idl_definitions":
+            # Pull out extended attributes from Blink AST.
+            for name, value in ast.extended_attributes.items():
+                # TODO(terry): Handle constructors...
+                if name == 'NamedConstructor' or name == 'Constructor':
+                    for constructor in ast.constructors:
+                        if constructor.name == 'NamedConstructor':
+                            constructor_name = ast.extended_attributes[
+                                'NamedConstructor']
+                        else:
+                            constructor_name = None
+                        func_value = IDLExtAttrFunctionValue(
+                            constructor_name, constructor.arguments, True)
+                        if name == 'Constructor':
+                            self.setdefault('Constructor',
+                                            []).append(func_value)
+                        else:
+                            self[name] = func_value
+                elif name == 'SetWrapperReferenceTo':
+                    # NOTE: No need to process handling for GC wrapper.  But if its a reference
+                    # to another type via an IdlArgument we'd need to convert to IDLArgument
+                    # otherwise the type might be a reference to another type and the circularity
+                    # will break deep_copy which is done later to the interfaces in the
+                    # database.  If we every need SetWrapperReferenceTo then we'd need to
+                    # convert IdlArgument to IDLArgument.
+                    continue
+                else:
+                    self[name] = value
         else:
-          self[name] = value
-    else:
-      ext_attrs_ast = self._find_first(ast, 'ExtAttrs')
-      if not ext_attrs_ast:
-        return
-      for ext_attr in self._find_all(ext_attrs_ast, 'ExtAttr'):
-        name = self._find_first(ext_attr, 'Id')
-        value = self._find_first(ext_attr, 'ExtAttrValue')
+            ext_attrs_ast = self._find_first(ast, 'ExtAttrs')
+            if not ext_attrs_ast:
+                return
+            for ext_attr in self._find_all(ext_attrs_ast, 'ExtAttr'):
+                name = self._find_first(ext_attr, 'Id')
+                value = self._find_first(ext_attr, 'ExtAttrValue')
 
-        if name == 'Constructor':
-          # There might be multiple constructor attributes, collect them
-          # as a list.  Represent plain Constructor attribute
-          # (without any signature) as None.
-          assert value is None
-          func_value = None
-          ctor_args = self._find_first(ext_attr, 'ExtAttrArgList')
-          if ctor_args:
-            func_value = IDLExtAttrFunctionValue(None, ctor_args)
-          self.setdefault('Constructor', []).append(func_value)
-          continue
-  
-        func_value = self._find_first(value, 'ExtAttrFunctionValue')
-        if func_value:
-          # E.g. NamedConstructor=Audio(optional DOMString src)
-          self[name] = IDLExtAttrFunctionValue(
-              func_value,
-              self._find_first(func_value, 'ExtAttrArgList'))
-          continue
+                if name == 'Constructor':
+                    # There might be multiple constructor attributes, collect them
+                    # as a list.  Represent plain Constructor attribute
+                    # (without any signature) as None.
+                    assert value is None
+                    func_value = None
+                    ctor_args = self._find_first(ext_attr, 'ExtAttrArgList')
+                    if ctor_args:
+                        func_value = IDLExtAttrFunctionValue(None, ctor_args)
+                    self.setdefault('Constructor', []).append(func_value)
+                    continue
 
-        self[name] = value
+                func_value = self._find_first(value, 'ExtAttrFunctionValue')
+                if func_value:
+                    # E.g. NamedConstructor=Audio(optional DOMString src)
+                    self[name] = IDLExtAttrFunctionValue(
+                        func_value,
+                        self._find_first(func_value, 'ExtAttrArgList'))
+                    continue
 
-  def _all_subnodes(self):
-    # Extended attributes may contain IDLNodes, e.g. IDLExtAttrFunctionValue
-    return self.values()
+                self[name] = value
+
+    def _all_subnodes(self):
+        # Extended attributes may contain IDLNodes, e.g. IDLExtAttrFunctionValue
+        return self.values()
 
 
 # IDLExtAttrFunctionValue is used for constructors defined in the IDL.
 class IDLExtAttrFunctionValue(IDLNode):
-  """IDLExtAttrFunctionValue."""
-  def __init__(self, func_value_ast, arg_list_ast, is_blink=False):
-    IDLNode.__init__(self, func_value_ast)
-    if is_blink:
-      # Blink path
-      self.id = func_value_ast   # func_value_ast is the function name for Blink.
-      self.arguments = []
-      for argument in arg_list_ast:
-        self.arguments.append(IDLArgument(argument))
-    else:
-      self.arguments = self._convert_all(arg_list_ast, 'Argument', IDLArgument)
+    """IDLExtAttrFunctionValue."""
+
+    def __init__(self, func_value_ast, arg_list_ast, is_blink=False):
+        IDLNode.__init__(self, func_value_ast)
+        if is_blink:
+            # Blink path
+            self.id = func_value_ast  # func_value_ast is the function name for Blink.
+            self.arguments = []
+            for argument in arg_list_ast:
+                self.arguments.append(IDLArgument(argument))
+        else:
+            self.arguments = self._convert_all(arg_list_ast, 'Argument',
+                                               IDLArgument)
 
 
 class IDLType(IDLNode):
-  """IDLType is used to describe constants, attributes and operations'
+    """IDLType is used to describe constants, attributes and operations'
   return and input types. IDLType matches AST labels such as ScopedName,
   StringType, VoidType, IntegerType, etc.
   NOTE: AST of None implies synthesize IDLType the id is passed in used by
         setlike."""
 
-  def __init__(self, ast, id=None):
-    global _unions_to_any
+    def __init__(self, ast, id=None):
+        global _unions_to_any
 
-    IDLNode.__init__(self, ast, id)
+        IDLNode.__init__(self, ast, id)
 
-    if not ast:
-      # Support synthesized IDLType with no AST (e.g., setlike support).
-      return
+        if not ast:
+            # Support synthesized IDLType with no AST (e.g., setlike support).
+            return
 
-    self.nullable = self._has(ast, 'Nullable')
-    # Search for a 'ScopedName' or any label ending with 'Type'.
-    if isinstance(ast, list):
-      self.id = self._find_first(ast, 'ScopedName')
-      if not self.id:
-        # FIXME: use regexp search instead
-        def findType(ast):
-          for label, childAst in ast:
-            if label.endswith('Type'):
-              type = self._label_to_type(label, ast)
-              if type != 'sequence':
-                return type
-              type_ast = self._find_first(childAst, 'Type')
-              if not type_ast:
-                return type
-              return 'sequence<%s>' % findType(type_ast)
-          raise Exception('No type declaration found in %s' % ast)
-        self.id = findType(ast)
-      # TODO(terry): Remove array_modifiers id has [] appended, keep for old
-      #              parsing.
-      array_modifiers = self._find_first(ast, 'ArrayModifiers')
-      if array_modifiers:
-        self.id += array_modifiers
-    elif isinstance(ast, tuple):
-      (label, value) = ast
-      if label == 'ScopedName':
-        self.id = value
-      else:
-        self.id = self._label_to_type(label, ast)
-    elif isinstance(ast, str):
-      self.id = ast
-    # New blink handling.
-    elif ast.__module__ == "idl_types":
-      if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) or \
-         isinstance(ast, IdlNullableType):
-        if isinstance(ast, IdlNullableType) and ast.inner_type.is_union_type:
-          # Report of union types mapped to any.
-          if not(self.id in _unions_to_any):
-            _unions_to_any.append(self.id)
-          # TODO(terry): For union types use any otherwise type is unionType is
-          #              not found and is removed during merging.
-          self.id = 'any'
-        else:
-          type_name = str(ast)
-          # TODO(terry): For now don't handle unrestricted types see
-          #              https://code.google.com/p/chromium/issues/detail?id=354298
-          type_name = type_name.replace('unrestricted ', '', 1);
+        self.nullable = self._has(ast, 'Nullable')
+        # Search for a 'ScopedName' or any label ending with 'Type'.
+        if isinstance(ast, list):
+            self.id = self._find_first(ast, 'ScopedName')
+            if not self.id:
+                # FIXME: use regexp search instead
+                def findType(ast):
+                    for label, childAst in ast:
+                        if label.endswith('Type'):
+                            type = self._label_to_type(label, ast)
+                            if type != 'sequence':
+                                return type
+                            type_ast = self._find_first(childAst, 'Type')
+                            if not type_ast:
+                                return type
+                            return 'sequence<%s>' % findType(type_ast)
+                    raise Exception('No type declaration found in %s' % ast)
 
-          # TODO(terry): Handled USVString as a DOMString.
-          type_name = type_name.replace('USVString', 'DOMString', 1)
-          type_name = type_name.replace('HTMLString', 'DOMString', 1)
+                self.id = findType(ast)
+            # TODO(terry): Remove array_modifiers id has [] appended, keep for old
+            #              parsing.
+            array_modifiers = self._find_first(ast, 'ArrayModifiers')
+            if array_modifiers:
+                self.id += array_modifiers
+        elif isinstance(ast, tuple):
+            (label, value) = ast
+            if label == 'ScopedName':
+                self.id = value
+            else:
+                self.id = self._label_to_type(label, ast)
+        elif isinstance(ast, str):
+            self.id = ast
+        # New blink handling.
+        elif ast.__module__ == "idl_types":
+            if isinstance(ast, IdlType) or isinstance(ast, IdlArrayOrSequenceType) or \
+               isinstance(ast, IdlNullableType):
+                if isinstance(ast,
+                              IdlNullableType) and ast.inner_type.is_union_type:
+                    # Report of union types mapped to any.
+                    if not (self.id in _unions_to_any):
+                        _unions_to_any.append(self.id)
+                    # TODO(terry): For union types use any otherwise type is unionType is
+                    #              not found and is removed during merging.
+                    self.id = 'any'
+                else:
+                    type_name = str(ast)
+                    # TODO(terry): For now don't handle unrestricted types see
+                    #              https://code.google.com/p/chromium/issues/detail?id=354298
+                    type_name = type_name.replace('unrestricted ', '', 1)
 
-          # TODO(terry); WindowTimers setInterval/setTimeout overloads with a
-          #              Function type - map to any until the IDL uses union.
-          type_name = type_name.replace('Function', 'any', 1)
+                    # TODO(terry): Handled USVString as a DOMString.
+                    type_name = type_name.replace('USVString', 'DOMString', 1)
+                    type_name = type_name.replace('HTMLString', 'DOMString', 1)
 
-          self.id = type_name
-      else:
-        # IdlUnionType
-        if ast.is_union_type:
-          if not(self.id in _unions_to_any):
-            _unions_to_any.append(self.id)
-          # TODO(terry): For union types use any otherwise type is unionType is
-          #              not found and is removed during merging.
-          self.id = 'any'
-          # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
-          #                            'typedef (Type1 or Type2) UnionType'
-          # Is a problem we need to extend IDLType and IDLTypeDef to handle more
-          # than one type.
-          #
-          # Also for typedef's e.g.,
-          #                 typedef (Type1 or Type2) UnionType
-          # should consider synthesizing a new interface (e.g., UnionType) that's
-          # both Type1 and Type2.
-    if not self.id:
-      print '>>>> __module__ %s' % ast.__module__
-      raise SyntaxError('Could not parse type %s' % (ast))
+                    # TODO(terry); WindowTimers setInterval/setTimeout overloads with a
+                    #              Function type - map to any until the IDL uses union.
+                    type_name = type_name.replace('Function', 'any', 1)
 
-  def _label_to_type(self, label, ast):
-    if label == 'LongLongType':
-      label = 'long long'
-    elif label.endswith('Type'):
-      # Omit 'Type' suffix and lowercase the rest.
-      label = '%s%s' % (label[0].lower(), label[1:-4])
+                    self.id = type_name
+            else:
+                # IdlUnionType
+                if ast.is_union_type:
+                    if not (self.id in _unions_to_any):
+                        _unions_to_any.append(self.id)
+                    # TODO(terry): For union types use any otherwise type is unionType is
+                    #              not found and is removed during merging.
+                    self.id = 'any'
+                    # TODO(terry): Any union type e.g. 'type1 or type2 or type2',
+                    #                            'typedef (Type1 or Type2) UnionType'
+                    # Is a problem we need to extend IDLType and IDLTypeDef to handle more
+                    # than one type.
+                    #
+                    # Also for typedef's e.g.,
+                    #                 typedef (Type1 or Type2) UnionType
+                    # should consider synthesizing a new interface (e.g., UnionType) that's
+                    # both Type1 and Type2.
+        if not self.id:
+            print '>>>> __module__ %s' % ast.__module__
+            raise SyntaxError('Could not parse type %s' % (ast))
 
-    # Add unsigned qualifier.
-    if self._has(ast, 'Unsigned'):
-      label = 'unsigned %s' % label
-    return label
+    def _label_to_type(self, label, ast):
+        if label == 'LongLongType':
+            label = 'long long'
+        elif label.endswith('Type'):
+            # Omit 'Type' suffix and lowercase the rest.
+            label = '%s%s' % (label[0].lower(), label[1:-4])
+
+        # Add unsigned qualifier.
+        if self._has(ast, 'Unsigned'):
+            label = 'unsigned %s' % label
+        return label
 
 
 class IDLEnum(IDLNode):
-  """IDLNode for 'enum [id] { [string]+ }'"""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    self._convert_annotations(ast)
-    if not(isinstance(ast, list)) and ast.__module__ == "idl_definitions":
-      # Blink AST
-      self.values = ast.values
-    else:
-      self.values = self._find_all(ast, 'StringLiteral')
+    """IDLNode for 'enum [id] { [string]+ }'"""
 
-    # TODO(terry): Need to handle emitting of enums for dart:html
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        self._convert_annotations(ast)
+        if not (isinstance(ast, list)) and ast.__module__ == "idl_definitions":
+            # Blink AST
+            self.values = ast.values
+        else:
+            self.values = self._find_all(ast, 'StringLiteral')
+
+        # TODO(terry): Need to handle emitting of enums for dart:html
+
 
 class IDLCallbackFunction(IDLNode):
-  """IDLNode for 'callback [type] [id]' declarations."""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    self._convert_annotations(ast)
-    self.type = self._convert_first(ast, 'Type', IDLType)
+    """IDLNode for 'callback [type] [id]' declarations."""
+
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        self._convert_annotations(ast)
+        self.type = self._convert_first(ast, 'Type', IDLType)
+
 
 class IDLTypeDef(IDLNode):
-  """IDLNode for 'typedef [type] [id]' declarations."""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    self._convert_annotations(ast)
-    self.type = self._convert_first(ast, 'Type', IDLType)
+    """IDLNode for 'typedef [type] [id]' declarations."""
+
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        self._convert_annotations(ast)
+        self.type = self._convert_first(ast, 'Type', IDLType)
 
 
 class IDLDictionary(IDLNode):
-  """IDLDictionary node contains members,
+    """IDLDictionary node contains members,
   as well as parent references."""
 
-  def __init__(self, ast, typedefDictionary=False):
-    IDLNode.__init__(self, ast)
+    def __init__(self, ast, typedefDictionary=False):
+        IDLNode.__init__(self, ast)
 
-    self.javascript_binding_name = self.id
-    if (typedefDictionary):
-        # Dictionary is a typedef to a union.
-        self._convert_ext_attrs(None)
-    else:
-        self._convert_ext_attrs(ast)
-        self._convert_constants(ast, self.id)
+        self.javascript_binding_name = self.id
+        if (typedefDictionary):
+            # Dictionary is a typedef to a union.
+            self._convert_ext_attrs(None)
+        else:
+            self._convert_ext_attrs(ast)
+            self._convert_constants(ast, self.id)
+
 
 class IDLDictionaryMembers(IDLDictNode):
-  """IDLDictionaryMembers specialization for a list of FremontCut dictionary values."""
-  def __init__(self, ast=None, js_name=None):
-    IDLDictNode.__init__(self, ast)
-    self.id = None
-    if not ast:
-      return
-    for member in self._find_all(ast, 'Member'):
-      name = self._find_first(member, 'Id')
-      value = IDLDictionaryMember(member, js_name)
-      self[name] = value
+    """IDLDictionaryMembers specialization for a list of FremontCut dictionary values."""
+
+    def __init__(self, ast=None, js_name=None):
+        IDLDictNode.__init__(self, ast)
+        self.id = None
+        if not ast:
+            return
+        for member in self._find_all(ast, 'Member'):
+            name = self._find_first(member, 'Id')
+            value = IDLDictionaryMember(member, js_name)
+            self[name] = value
+
 
 def generate_callback(interface_name, result_type, arguments):
-  syn_op = IDLOperation(None, interface_name, 'callback')
+    syn_op = IDLOperation(None, interface_name, 'callback')
 
-  syn_op.type = resolveTypedef(result_type)
-  syn_op.arguments = arguments
+    syn_op.type = resolveTypedef(result_type)
+    syn_op.arguments = arguments
 
-  return syn_op
+    return syn_op
+
 
 def generate_operation(interface_name, result_type_name, oper_name, arguments):
-  """ Synthesize an IDLOperation with no AST used for support of setlike."""
-  """ Arguments is a list of argument where each argument is:
+    """ Synthesize an IDLOperation with no AST used for support of setlike."""
+    """ Arguments is a list of argument where each argument is:
           [IDLType, argument_name, optional_boolean] """
 
-  syn_op = IDLOperation(None, interface_name, oper_name)
+    syn_op = IDLOperation(None, interface_name, oper_name)
 
-  syn_op.type = IDLType(None, result_type_name)
-  syn_op.type = resolveTypedef(syn_op.type)
+    syn_op.type = IDLType(None, result_type_name)
+    syn_op.type = resolveTypedef(syn_op.type)
 
-  for argument in arguments:
-    arg = IDLArgument(None, argument[1])
-    arg.type = argument[0]
-    arg.optional = argument[2] if len(argument) > 2 else False
-    syn_op.arguments.append(arg)
+    for argument in arguments:
+        arg = IDLArgument(None, argument[1])
+        arg.type = argument[0]
+        arg.optional = argument[2] if len(argument) > 2 else False
+        syn_op.arguments.append(arg)
 
-  return syn_op
+    return syn_op
+
 
 def generate_setLike_operations_properties(interface, set_like):
-  """
+    """
   Need to create (in our database) a number of operations.  This is a new IDL
   syntax, the implied operations for a set now use setlike<T> where T is a known
   type e.g., setlike<FontFace> setlike implies these operations are generated:
@@ -796,8 +832,8 @@
            boolean delete(FontFace value);
            void clear();
   """
-  setlike_ops = []
-  """
+    setlike_ops = []
+    """
   Need to create a typedef for a function callback e.g.,
   a setlike will need a callback that has the proper args in FontFaceSet that is
   three arguments, etc.
@@ -807,289 +843,318 @@
     
       void forEach(FontFaceSetForEachCallback callback, [Object thisArg]);
   """
-  callback_name = '%sForEachCallback' % interface.id
-  set_op = generate_operation(interface.id, 'void', 'forEach',
-                              [[IDLType(None, callback_name), 'callback'],
-                               [IDLType(None, 'any'), 'thisArg', True]])
-  setlike_ops.append(set_op)
-
-  set_op = generate_operation(interface.id, 'boolean', 'has',
-                              [[IDLType(None, set_like.value_type.base_type), 'arg']])
-  setlike_ops.append(set_op)
-
-  if not set_like.is_read_only:
-    set_op = generate_operation(interface.id, interface.id, 'add',
-                                [[IDLType(None, set_like.value_type.base_type), 'arg']])
-    setlike_ops.append(set_op)
-    set_op = generate_operation(interface.id, 'boolean', 'delete',
-                                [[IDLType(None, set_like.value_type.base_type), 'arg']])
-    setlike_ops.append(set_op)
-    set_op = generate_operation(interface.id, 'void', 'clear', [])
+    callback_name = '%sForEachCallback' % interface.id
+    set_op = generate_operation(interface.id, 'void', 'forEach',
+                                [[IDLType(None, callback_name), 'callback'],
+                                 [IDLType(None, 'any'), 'thisArg', True]])
     setlike_ops.append(set_op)
 
-  return setlike_ops
+    set_op = generate_operation(
+        interface.id, 'boolean', 'has',
+        [[IDLType(None, set_like.value_type.base_type), 'arg']])
+    setlike_ops.append(set_op)
+
+    if not set_like.is_read_only:
+        set_op = generate_operation(
+            interface.id, interface.id, 'add',
+            [[IDLType(None, set_like.value_type.base_type), 'arg']])
+        setlike_ops.append(set_op)
+        set_op = generate_operation(
+            interface.id, 'boolean', 'delete',
+            [[IDLType(None, set_like.value_type.base_type), 'arg']])
+        setlike_ops.append(set_op)
+        set_op = generate_operation(interface.id, 'void', 'clear', [])
+        setlike_ops.append(set_op)
+
+    return setlike_ops
+
 
 class IDLInterface(IDLNode):
-  """IDLInterface node contains operations, attributes, constants,
+    """IDLInterface node contains operations, attributes, constants,
   as well as parent references."""
 
-  def __init__(self, ast, id=None):
-    IDLNode.__init__(self, ast)
+    def __init__(self, ast, id=None):
+        IDLNode.__init__(self, ast)
 
-    if id:
-      self.id = id
+        if id:
+            self.id = id
 
-    self._convert_ext_attrs(ast)
-    self._convert_annotations(ast)
+        self._convert_ext_attrs(ast)
+        self._convert_annotations(ast)
 
-    self.parents = self._convert_all(ast, 'ParentInterface',
-      IDLParentInterface)
+        self.parents = self._convert_all(ast, 'ParentInterface',
+                                         IDLParentInterface)
 
-    javascript_interface_name = self.ext_attrs.get('InterfaceName', self.id)
-    self.javascript_binding_name = javascript_interface_name
-    self.doc_js_name = javascript_interface_name
+        javascript_interface_name = self.ext_attrs.get('InterfaceName', self.id)
+        self.javascript_binding_name = javascript_interface_name
+        self.doc_js_name = javascript_interface_name
 
-    if not (self._find_first(ast, 'Callback') is None):
-      self.ext_attrs['Callback'] = None
-    if not (self._find_first(ast, 'Partial') is None):
-      self.is_supplemental = True
-      self.ext_attrs['DartSupplemental'] = None
-    self.isMaplike = False
-    self.isMaplike_ro = False
-    self.maplike_key_value = [None, None]
-    if ast is not None and ast.maplike is not None:
-       self.isMaplike = True
-       self.isMaplike_ro = ast.maplike.is_read_only
-       self.maplike_key_value = [IDLType(ast.maplike.key_type), IDLType(ast.maplike.value_type)]
+        if not (self._find_first(ast, 'Callback') is None):
+            self.ext_attrs['Callback'] = None
+        if not (self._find_first(ast, 'Partial') is None):
+            self.is_supplemental = True
+            self.ext_attrs['DartSupplemental'] = None
+        self.isMaplike = False
+        self.isMaplike_ro = False
+        self.maplike_key_value = [None, None]
+        if ast is not None and ast.maplike is not None:
+            self.isMaplike = True
+            self.isMaplike_ro = ast.maplike.is_read_only
+            self.maplike_key_value = [
+                IDLType(ast.maplike.key_type),
+                IDLType(ast.maplike.value_type)
+            ]
 
-    self.operations = self._convert_all(ast, 'Operation',
-      lambda ast: IDLOperation(ast, self.doc_js_name))
+        self.operations = self._convert_all(
+            ast, 'Operation', lambda ast: IDLOperation(ast, self.doc_js_name))
 
-    if not(id) and ast.setlike:
-      setlike_ops = generate_setLike_operations_properties(self, ast.setlike)
-      for op in setlike_ops:
-        self.operations.append(op)
+        if not (id) and ast.setlike:
+            setlike_ops = generate_setLike_operations_properties(
+                self, ast.setlike)
+            for op in setlike_ops:
+                self.operations.append(op)
 
-    self.attributes = self._convert_all(ast, 'Attribute',
-      lambda ast: IDLAttribute(ast, self.doc_js_name))
-    self.constants = self._convert_all(ast, 'Const',
-      lambda ast: IDLConstant(ast, self.doc_js_name))
-    self.is_supplemental = 'DartSupplemental' in self.ext_attrs
-    self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs
-    # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
-    self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
-                            'DartSuppress' in self.ext_attrs
+        self.attributes = self._convert_all(
+            ast, 'Attribute', lambda ast: IDLAttribute(ast, self.doc_js_name))
+        self.constants = self._convert_all(
+            ast, 'Const', lambda ast: IDLConstant(ast, self.doc_js_name))
+        self.is_supplemental = 'DartSupplemental' in self.ext_attrs
+        self.is_no_interface_object = 'NoInterfaceObject' in self.ext_attrs
+        # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
+        self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
+                                'DartSuppress' in self.ext_attrs
 
-  def reset_id(self, new_id):
-    """Reset the id of the Interface and corresponding the JS names."""
-    if self.id != new_id:
-      self.id = new_id
-      self.doc_js_name = new_id
-      self.javascript_binding_name = new_id
-      for member in self.operations:
-        member.doc_js_interface_name = new_id
-      for member in self.attributes:
-        member.doc_js_interface_name = new_id
-      for member in self.constants:
-        member.doc_js_interface_name = new_id
+    def reset_id(self, new_id):
+        """Reset the id of the Interface and corresponding the JS names."""
+        if self.id != new_id:
+            self.id = new_id
+            self.doc_js_name = new_id
+            self.javascript_binding_name = new_id
+            for member in self.operations:
+                member.doc_js_interface_name = new_id
+            for member in self.attributes:
+                member.doc_js_interface_name = new_id
+            for member in self.constants:
+                member.doc_js_interface_name = new_id
 
-  def has_attribute(self, candidate):
-    for attribute in self.attributes:
-      if (attribute.id == candidate.id and
-          attribute.is_read_only == candidate.is_read_only):
-        return True
-    return False
+    def has_attribute(self, candidate):
+        for attribute in self.attributes:
+            if (attribute.id == candidate.id and
+                    attribute.is_read_only == candidate.is_read_only):
+                return True
+        return False
 
 
 class IDLParentInterface(IDLNode):
-  """This IDLNode specialization is for 'Interface Child : Parent {}'
+    """This IDLNode specialization is for 'Interface Child : Parent {}'
   declarations."""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    self._convert_annotations(ast)
-    self.type = self._convert_first(ast, 'InterfaceType', IDLType)
+
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        self._convert_annotations(ast)
+        self.type = self._convert_first(ast, 'InterfaceType', IDLType)
 
 
 class IDLMember(IDLNode):
-  """A base class for constants, attributes and operations."""
-  def __init__(self, ast, doc_js_interface_name, member_id=None):
-    if ast:
-      IDLNode.__init__(self, ast)
-    else:
-      # The ast is None to support synthesizing an IDLMember, member_id is only
-      # used when ast is None.
-      IDLNode.__init__(self, ast, member_id)
-      self.type = None
-      self.doc_js_interface_name = doc_js_interface_name
-      return
+    """A base class for constants, attributes and operations."""
 
-    self.type = self._convert_first(ast, 'Type', IDLType)
-    self.type = resolveTypedef(self.type)
+    def __init__(self, ast, doc_js_interface_name, member_id=None):
+        if ast:
+            IDLNode.__init__(self, ast)
+        else:
+            # The ast is None to support synthesizing an IDLMember, member_id is only
+            # used when ast is None.
+            IDLNode.__init__(self, ast, member_id)
+            self.type = None
+            self.doc_js_interface_name = doc_js_interface_name
+            return
 
-    self._convert_ext_attrs(ast)
-    self._convert_annotations(ast)
-    self.doc_js_interface_name = doc_js_interface_name
-    # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
-    self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
-                            'DartSuppress' in self.ext_attrs
-    self.is_static = self._has(ast, 'Static')
+        self.type = self._convert_first(ast, 'Type', IDLType)
+        self.type = resolveTypedef(self.type)
+
+        self._convert_ext_attrs(ast)
+        self._convert_annotations(ast)
+        self.doc_js_interface_name = doc_js_interface_name
+        # TODO(terry): Can eliminate Suppressed when we're only using blink parser.
+        self.is_fc_suppressed = 'Suppressed' in self.ext_attrs or \
+                                'DartSuppress' in self.ext_attrs
+        self.is_static = self._has(ast, 'Static')
+
 
 class IDLOperation(IDLMember):
-  """IDLNode specialization for 'type name(args)' declarations."""
-  def __init__(self, ast, doc_js_interface_name, id=None):
-    IDLMember.__init__(self, ast, doc_js_interface_name, id)
+    """IDLNode specialization for 'type name(args)' declarations."""
 
-    if not ast:
-      # Synthesize an IDLOperation with no ast used for setlike.
-      self.ext_attrs = IDLExtAttrs()
-      self.annotations = IDLAnnotations()
-      self.is_fc_suppressed = False
-      self.specials = []
-      self.is_static = False
-      self.arguments = []
-      return
+    def __init__(self, ast, doc_js_interface_name, id=None):
+        IDLMember.__init__(self, ast, doc_js_interface_name, id)
 
-    self.type = self._convert_first(ast, 'ReturnType', IDLType)
-    self.type = resolveTypedef(self.type)
+        if not ast:
+            # Synthesize an IDLOperation with no ast used for setlike.
+            self.ext_attrs = IDLExtAttrs()
+            self.annotations = IDLAnnotations()
+            self.is_fc_suppressed = False
+            self.specials = []
+            self.is_static = False
+            self.arguments = []
+            return
 
-    self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
-    self.specials = self._find_all(ast, 'Special')
-    # Special case: there are getters of the form
-    # getter <ReturnType>(args).  For now force the name to be __getter__,
-    # but it should be operator[] later.
-    if self.id is None:
-      if self.specials == ['getter']:
-        if self.ext_attrs.get('Custom') == 'PropertyQuery':
-          # Handling __propertyQuery__ the extended attribute is:
-          # [Custom=PropertyQuery] getter boolean (DOMString name);
-          self.id = '__propertyQuery__'
-        elif self.ext_attrs.get('ImplementedAs'):
-          self.id = self.ext_attrs.get('ImplementedAs')
-        else:
-          self.id = '__getter__'
-      elif self.specials == ['setter']:
-        self.id = '__setter__'
-        # Special case: if it's a setter, ignore 'declared' return type
-        self.type = IDLType([('VoidType', None)])
-      elif self.specials == ['deleter']:
-        self.id = '__delete__'
-      else:
-        raise Exception('Cannot handle %s: operation has no id' % ast)
+        self.type = self._convert_first(ast, 'ReturnType', IDLType)
+        self.type = resolveTypedef(self.type)
 
-      if len(self.arguments) >= 1 and (self.id in _operation_suffix_map) and not self.ext_attrs.get('ImplementedAs'):
-        arg = self.arguments[0]
-        operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed'
-        self.ext_attrs.setdefault('ImplementedAs', 'anonymous%s%s' % (operation_category, _operation_suffix_map[self.id]))
+        self.arguments = self._convert_all(ast, 'Argument', IDLArgument)
+        self.specials = self._find_all(ast, 'Special')
+        # Special case: there are getters of the form
+        # getter <ReturnType>(args).  For now force the name to be __getter__,
+        # but it should be operator[] later.
+        if self.id is None:
+            if self.specials == ['getter']:
+                if self.ext_attrs.get('Custom') == 'PropertyQuery':
+                    # Handling __propertyQuery__ the extended attribute is:
+                    # [Custom=PropertyQuery] getter boolean (DOMString name);
+                    self.id = '__propertyQuery__'
+                elif self.ext_attrs.get('ImplementedAs'):
+                    self.id = self.ext_attrs.get('ImplementedAs')
+                else:
+                    self.id = '__getter__'
+            elif self.specials == ['setter']:
+                self.id = '__setter__'
+                # Special case: if it's a setter, ignore 'declared' return type
+                self.type = IDLType([('VoidType', None)])
+            elif self.specials == ['deleter']:
+                self.id = '__delete__'
+            else:
+                raise Exception('Cannot handle %s: operation has no id' % ast)
 
-  def __repr__(self):
-    return '<IDLOperation(id = %s)>' % (self.id)
+            if len(self.arguments) >= 1 and (
+                    self.id in _operation_suffix_map
+            ) and not self.ext_attrs.get('ImplementedAs'):
+                arg = self.arguments[0]
+                operation_category = 'Named' if arg.type.id == 'DOMString' else 'Indexed'
+                self.ext_attrs.setdefault(
+                    'ImplementedAs', 'anonymous%s%s' %
+                    (operation_category, _operation_suffix_map[self.id]))
 
-  def _extra_repr(self):
-    return [self.arguments]
+    def __repr__(self):
+        return '<IDLOperation(id = %s)>' % (self.id)
 
-  def SameSignatureAs(self, operation):
-    if self.type != operation.type:
-      return False
-    return [a.type for a in self.arguments] == [a.type for a in operation.arguments]
+    def _extra_repr(self):
+        return [self.arguments]
+
+    def SameSignatureAs(self, operation):
+        if self.type != operation.type:
+            return False
+        return [a.type for a in self.arguments] == [
+            a.type for a in operation.arguments
+        ]
+
 
 class IDLAttribute(IDLMember):
-  """IDLNode specialization for 'attribute type name' declarations."""
-  def __init__(self, ast, doc_js_interface_name):
-    IDLMember.__init__(self, ast, doc_js_interface_name)
-    self.is_read_only = self._has(ast, 'ReadOnly')
-    # There are various ways to define exceptions for attributes:
+    """IDLNode specialization for 'attribute type name' declarations."""
 
-  def _extra_repr(self):
-    extra = []
-    if self.is_read_only: extra.append('readonly')
-    return extra
+    def __init__(self, ast, doc_js_interface_name):
+        IDLMember.__init__(self, ast, doc_js_interface_name)
+        self.is_read_only = self._has(ast, 'ReadOnly')
+        # There are various ways to define exceptions for attributes:
+
+    def _extra_repr(self):
+        extra = []
+        if self.is_read_only: extra.append('readonly')
+        return extra
 
 
 class IDLConstant(IDLMember):
-  """IDLNode specialization for 'const type name = value' declarations."""
-  def __init__(self, ast, doc_js_interface_name):
-    IDLMember.__init__(self, ast, doc_js_interface_name)
-    self.value = self._find_first(ast, 'ConstExpr')
+    """IDLNode specialization for 'const type name = value' declarations."""
+
+    def __init__(self, ast, doc_js_interface_name):
+        IDLMember.__init__(self, ast, doc_js_interface_name)
+        self.value = self._find_first(ast, 'ConstExpr')
 
 
 class IDLArgument(IDLNode):
-  """IDLNode specialization for operation arguments."""
-  def __init__(self, ast, id=None):
-    if ast:
-      IDLNode.__init__(self, ast)
-    else:
-      # Synthesize an IDLArgument with no ast used for setlike.
-      IDLNode.__init__(self, ast, id)
-      self.ext_attrs = IDLExtAttrs()
-      self.default_value = None
-      self.default_value_is_null = False
-      return
+    """IDLNode specialization for operation arguments."""
 
-    self.default_value = None
-    self.default_value_is_null = False
-    # Handle the 'argType arg = default'. IDL syntax changed from
-    # [default=NullString].
-    if not isinstance(ast, list):
-      if isinstance(ast.default_value, idl_definitions.IdlLiteral) and ast.default_value:
-        self.default_value = ast.default_value.value
-        self.default_value_is_null = ast.default_value.is_null
-      elif 'Default' in ast.extended_attributes:
-        # Work around [Default=Undefined] for arguments - only look in the model's
-        # default_value
-        self.default_value = ast.extended_attributes.get('Default')
+    def __init__(self, ast, id=None):
+        if ast:
+            IDLNode.__init__(self, ast)
+        else:
+            # Synthesize an IDLArgument with no ast used for setlike.
+            IDLNode.__init__(self, ast, id)
+            self.ext_attrs = IDLExtAttrs()
+            self.default_value = None
+            self.default_value_is_null = False
+            return
+
+        self.default_value = None
         self.default_value_is_null = False
+        # Handle the 'argType arg = default'. IDL syntax changed from
+        # [default=NullString].
+        if not isinstance(ast, list):
+            if isinstance(ast.default_value,
+                          idl_definitions.IdlLiteral) and ast.default_value:
+                self.default_value = ast.default_value.value
+                self.default_value_is_null = ast.default_value.is_null
+            elif 'Default' in ast.extended_attributes:
+                # Work around [Default=Undefined] for arguments - only look in the model's
+                # default_value
+                self.default_value = ast.extended_attributes.get('Default')
+                self.default_value_is_null = False
 
-    self.type = self._convert_first(ast, 'Type', IDLType)
-    self.type = resolveTypedef(self.type)
+        self.type = self._convert_first(ast, 'Type', IDLType)
+        self.type = resolveTypedef(self.type)
 
-    self.optional = self._has(ast, 'Optional')
-    self._convert_ext_attrs(ast)
-    # TODO(vsm): Recover this from the type instead.
-    if 'Callback' in self.type.id:
-      self.ext_attrs['Callback'] = None
+        self.optional = self._has(ast, 'Optional')
+        self._convert_ext_attrs(ast)
+        # TODO(vsm): Recover this from the type instead.
+        if 'Callback' in self.type.id:
+            self.ext_attrs['Callback'] = None
 
-  def __repr__(self):
-    return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id)
+    def __repr__(self):
+        return '<IDLArgument(type = %s, id = %s)>' % (self.type, self.id)
 
 
 class IDLDictionaryMember(IDLMember):
-  """IDLNode specialization for 'const type name = value' declarations."""
-  def __init__(self, ast, doc_js_interface_name):
-    IDLMember.__init__(self, ast, doc_js_interface_name)
-    default_value = self._find_first(ast, 'Default')
-    self.value = default_value.value if default_value else None
+    """IDLNode specialization for 'const type name = value' declarations."""
+
+    def __init__(self, ast, doc_js_interface_name):
+        IDLMember.__init__(self, ast, doc_js_interface_name)
+        default_value = self._find_first(ast, 'Default')
+        self.value = default_value.value if default_value else None
 
 
 class IDLImplementsStatement(IDLNode):
-  """IDLNode specialization for 'IMPLEMENTOR implements IMPLEMENTED' declarations."""
-  def __init__(self, ast):
-    IDLNode.__init__(self, ast)
-    if isinstance(ast, list) or ast.__module__ != 'idl_definitions':
-      self.implementor = self._convert_first(ast, 'ImplStmtImplementor', IDLType)
-      self.implemented = self._convert_first(ast, 'ImplStmtImplemented', IDLType)
+    """IDLNode specialization for 'IMPLEMENTOR implements IMPLEMENTED' declarations."""
+
+    def __init__(self, ast):
+        IDLNode.__init__(self, ast)
+        if isinstance(ast, list) or ast.__module__ != 'idl_definitions':
+            self.implementor = self._convert_first(ast, 'ImplStmtImplementor',
+                                                   IDLType)
+            self.implemented = self._convert_first(ast, 'ImplStmtImplemented',
+                                                   IDLType)
 
 
 class IDLAnnotations(IDLDictNode):
-  """IDLDictNode specialization for a list of FremontCut annotations."""
-  def __init__(self, ast=None):
-    IDLDictNode.__init__(self, ast)
-    self.id = None
-    if not ast:
-      return
-    for annotation in self._find_all(ast, 'Annotation'):
-      name = self._find_first(annotation, 'Id')
-      value = IDLAnnotation(annotation)
-      self[name] = value
+    """IDLDictNode specialization for a list of FremontCut annotations."""
+
+    def __init__(self, ast=None):
+        IDLDictNode.__init__(self, ast)
+        self.id = None
+        if not ast:
+            return
+        for annotation in self._find_all(ast, 'Annotation'):
+            name = self._find_first(annotation, 'Id')
+            value = IDLAnnotation(annotation)
+            self[name] = value
 
 
 class IDLAnnotation(IDLDictNode):
-  """IDLDictNode specialization for one annotation."""
-  def __init__(self, ast=None):
-    IDLDictNode.__init__(self, ast)
-    self.id = None
-    if not ast:
-      return
-    for arg in self._find_all(ast, 'AnnotationArg'):
-      name = self._find_first(arg, 'Id')
-      value = self._find_first(arg, 'AnnotationArgValue')
-      self[name] = value
+    """IDLDictNode specialization for one annotation."""
+
+    def __init__(self, ast=None):
+        IDLDictNode.__init__(self, ast)
+        self.id = None
+        if not ast:
+            return
+        for arg in self._find_all(ast, 'AnnotationArg'):
+            name = self._find_first(arg, 'Id')
+            value = self._find_first(arg, 'AnnotationArgValue')
+            self[name] = value
diff --git a/tools/dom/scripts/idlnode_test.py b/tools/dom/scripts/idlnode_test.py
index dc515b8..8c21546 100755
--- a/tools/dom/scripts/idlnode_test.py
+++ b/tools/dom/scripts/idlnode_test.py
@@ -12,8 +12,8 @@
 
 class IDLNodeTestCase(unittest.TestCase):
 
-  def _run_test(self, syntax, content, expected):
-    """Utility run tests and prints extra contextual information.
+    def _run_test(self, syntax, content, expected):
+        """Utility run tests and prints extra contextual information.
 
     Args:
       syntax -- IDL grammar to use (either idlparser.WEBKIT_SYNTAX,
@@ -22,28 +22,28 @@
       content -- input text for the parser.
       expected -- expected parse result.
     """
-    if syntax is None:
-      self._run_test(idlparser.WEBIDL_SYNTAX, content, expected)
-      self._run_test(idlparser.WEBKIT_SYNTAX, content, expected)
-      self._run_test(idlparser.FREMONTCUT_SYNTAX, content, expected)
-      return
+        if syntax is None:
+            self._run_test(idlparser.WEBIDL_SYNTAX, content, expected)
+            self._run_test(idlparser.WEBKIT_SYNTAX, content, expected)
+            self._run_test(idlparser.FREMONTCUT_SYNTAX, content, expected)
+            return
 
-    actual = None
-    error = None
-    ast = None
-    parseResult = None
-    try:
-      parser = idlparser.IDLParser(syntax)
-      ast = parser.parse(content)
-      node = idlnode.IDLFile(ast)
-      actual = node.to_dict() if node else None
-    except SyntaxError, e:
-      error = e
-      pass
-    if actual == expected:
-      return
-    else:
-      msg = '''
+        actual = None
+        error = None
+        ast = None
+        parseResult = None
+        try:
+            parser = idlparser.IDLParser(syntax)
+            ast = parser.parse(content)
+            node = idlnode.IDLFile(ast)
+            actual = node.to_dict() if node else None
+        except SyntaxError, e:
+            error = e
+            pass
+        if actual == expected:
+            return
+        else:
+            msg = '''
 SYNTAX  : %s
 CONTENT :
 %s
@@ -55,92 +55,364 @@
 AST   :
 %s
       ''' % (syntax, content, expected, actual, error, ast)
-      self.fail(msg)
+            self.fail(msg)
 
-  def test_empty_module(self):
-    self._run_test(
-      None,
-      'module TestModule {};',
-      {'modules': [{'id': 'TestModule'}]})
+    def test_empty_module(self):
+        self._run_test(None, 'module TestModule {};',
+                       {'modules': [{
+                           'id': 'TestModule'
+                       }]})
 
-  def test_empty_interface(self):
-    self._run_test(
-      None,
-      'module TestModule { interface Interface1 {}; };',
-      {'modules': [{'interfaces': [{'javascript_binding_name': 'Interface1', 'doc_js_name': 'Interface1', 'id': 'Interface1'}], 'id': 'TestModule'}]})
+    def test_empty_interface(self):
+        self._run_test(
+            None, 'module TestModule { interface Interface1 {}; };', {
+                'modules': [{
+                    'interfaces': [{
+                        'javascript_binding_name': 'Interface1',
+                        'doc_js_name': 'Interface1',
+                        'id': 'Interface1'
+                    }],
+                    'id':
+                    'TestModule'
+                }]
+            })
 
-  def test_gcc_preprocessor(self):
-    self._run_test(
-      idlparser.WEBKIT_SYNTAX,
-      '#if 1\nmodule TestModule {};\n#endif\n',
-      {'modules': [{'id': 'TestModule'}]})
+    def test_gcc_preprocessor(self):
+        self._run_test(idlparser.WEBKIT_SYNTAX,
+                       '#if 1\nmodule TestModule {};\n#endif\n',
+                       {'modules': [{
+                           'id': 'TestModule'
+                       }]})
 
-  def test_extended_attributes(self):
-    self._run_test(
-      idlparser.WEBKIT_SYNTAX,
-      'module M { interface [ExAt1, ExAt2] I {};};',
-      {'modules': [{'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'ext_attrs': {'ExAt1': None, 'ExAt2': None}, 'id': 'I'}], 'id': 'M'}]})
+    def test_extended_attributes(self):
+        self._run_test(
+            idlparser.WEBKIT_SYNTAX,
+            'module M { interface [ExAt1, ExAt2] I {};};', {
+                'modules': [{
+                    'interfaces': [{
+                        'javascript_binding_name': 'I',
+                        'doc_js_name': 'I',
+                        'ext_attrs': {
+                            'ExAt1': None,
+                            'ExAt2': None
+                        },
+                        'id': 'I'
+                    }],
+                    'id':
+                    'M'
+                }]
+            })
 
-  def test_implements_statement(self):
-    self._run_test(
-      idlparser.WEBIDL_SYNTAX,
-      'module M { X implements Y; };',
-      {'modules': [{'implementsStatements': [{'implementor': {'id': 'X'}, 'implemented': {'id': 'Y'}}], 'id': 'M'}]})
+    def test_implements_statement(self):
+        self._run_test(
+            idlparser.WEBIDL_SYNTAX, 'module M { X implements Y; };', {
+                'modules': [{
+                    'implementsStatements': [{
+                        'implementor': {
+                            'id': 'X'
+                        },
+                        'implemented': {
+                            'id': 'Y'
+                        }
+                    }],
+                    'id':
+                    'M'
+                }]
+            })
 
-  def test_attributes(self):
-    self._run_test(
-      idlparser.WEBIDL_SYNTAX,
-      '''interface I {
+    def test_attributes(self):
+        self._run_test(
+            idlparser.WEBIDL_SYNTAX, '''interface I {
         attribute long a1;
         readonly attribute DOMString a2;
         attribute any a3;
-      };''',
-      {'interfaces': [{'javascript_binding_name': 'I', 'attributes': [{'type': {'id': 'long'}, 'id': 'a1', 'doc_js_interface_name': 'I'}, {'type': {'id': 'DOMString'}, 'is_read_only': True, 'id': 'a2', 'doc_js_interface_name': 'I'}, {'type': {'id': 'any'}, 'id': 'a3', 'doc_js_interface_name': 'I'}], 'id': 'I', 'doc_js_name': 'I'}]})
+      };''', {
+                'interfaces': [{
+                    'javascript_binding_name':
+                    'I',
+                    'attributes': [{
+                        'type': {
+                            'id': 'long'
+                        },
+                        'id': 'a1',
+                        'doc_js_interface_name': 'I'
+                    },
+                                   {
+                                       'type': {
+                                           'id': 'DOMString'
+                                       },
+                                       'is_read_only': True,
+                                       'id': 'a2',
+                                       'doc_js_interface_name': 'I'
+                                   },
+                                   {
+                                       'type': {
+                                           'id': 'any'
+                                       },
+                                       'id': 'a3',
+                                       'doc_js_interface_name': 'I'
+                                   }],
+                    'id':
+                    'I',
+                    'doc_js_name':
+                    'I'
+                }]
+            })
 
-  def test_operations(self):
-    self._run_test(
-      idlparser.WEBIDL_SYNTAX,
-      '''interface I {
+    def test_operations(self):
+        self._run_test(
+            idlparser.WEBIDL_SYNTAX, '''interface I {
         [ExAttr] t1 op1();
         t2 op2(in int arg1, in long arg2);
         getter any item(in long index);
-      };''',
-      {'interfaces': [{'operations': [{'doc_js_interface_name': 'I', 'type': {'id': 't1'}, 'ext_attrs': {'ExAttr': None}, 'id': 'op1'}, {'doc_js_interface_name': 'I', 'type': {'id': 't2'}, 'id': 'op2', 'arguments': [{'type': {'id': 'int'}, 'id': 'arg1'}, {'type': {'id': 'long'}, 'id': 'arg2'}]}, {'specials': ['getter'], 'doc_js_interface_name': 'I', 'type': {'id': 'any'}, 'id': 'item', 'arguments': [{'type': {'id': 'long'}, 'id': 'index'}]}, {'is_stringifier': True, 'type': {'id': 'name'}, 'doc_js_interface_name': 'I'}], 'javascript_binding_name': 'I', 'id': 'I', 'doc_js_name': 'I'}]})
+      };''', {
+                'interfaces': [{
+                    'operations':
+                    [{
+                        'doc_js_interface_name': 'I',
+                        'type': {
+                            'id': 't1'
+                        },
+                        'ext_attrs': {
+                            'ExAttr': None
+                        },
+                        'id': 'op1'
+                    },
+                     {
+                         'doc_js_interface_name':
+                         'I',
+                         'type': {
+                             'id': 't2'
+                         },
+                         'id':
+                         'op2',
+                         'arguments': [{
+                             'type': {
+                                 'id': 'int'
+                             },
+                             'id': 'arg1'
+                         }, {
+                             'type': {
+                                 'id': 'long'
+                             },
+                             'id': 'arg2'
+                         }]
+                     },
+                     {
+                         'specials': ['getter'],
+                         'doc_js_interface_name': 'I',
+                         'type': {
+                             'id': 'any'
+                         },
+                         'id': 'item',
+                         'arguments': [{
+                             'type': {
+                                 'id': 'long'
+                             },
+                             'id': 'index'
+                         }]
+                     },
+                     {
+                         'is_stringifier': True,
+                         'type': {
+                             'id': 'name'
+                         },
+                         'doc_js_interface_name': 'I'
+                     }],
+                    'javascript_binding_name':
+                    'I',
+                    'id':
+                    'I',
+                    'doc_js_name':
+                    'I'
+                }]
+            })
 
-  def test_constants(self):
-    self._run_test(
-      None,
-      '''interface I {
+    def test_constants(self):
+        self._run_test(
+            None, '''interface I {
         const long c1 = 0;
         const long c2 = 1;
         const long c3 = 0x01;
         const long c4 = 10;
         const boolean b1 = false;
         const boolean b2 = true;
-      };''',
-      {'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'id': 'I', 'constants': [{'type': {'id': 'long'}, 'id': 'c1', 'value': '0', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c2', 'value': '1', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c3', 'value': '0x01', 'doc_js_interface_name': 'I'}, {'type': {'id': 'long'}, 'id': 'c4', 'value': '10', 'doc_js_interface_name': 'I'}, {'type': {'id': 'boolean'}, 'id': 'b1', 'value': 'false', 'doc_js_interface_name': 'I'}, {'type': {'id': 'boolean'}, 'id': 'b2', 'value': 'true', 'doc_js_interface_name': 'I'}]}]})
+      };''', {
+                'interfaces': [{
+                    'javascript_binding_name':
+                    'I',
+                    'doc_js_name':
+                    'I',
+                    'id':
+                    'I',
+                    'constants': [{
+                        'type': {
+                            'id': 'long'
+                        },
+                        'id': 'c1',
+                        'value': '0',
+                        'doc_js_interface_name': 'I'
+                    },
+                                  {
+                                      'type': {
+                                          'id': 'long'
+                                      },
+                                      'id': 'c2',
+                                      'value': '1',
+                                      'doc_js_interface_name': 'I'
+                                  },
+                                  {
+                                      'type': {
+                                          'id': 'long'
+                                      },
+                                      'id': 'c3',
+                                      'value': '0x01',
+                                      'doc_js_interface_name': 'I'
+                                  },
+                                  {
+                                      'type': {
+                                          'id': 'long'
+                                      },
+                                      'id': 'c4',
+                                      'value': '10',
+                                      'doc_js_interface_name': 'I'
+                                  },
+                                  {
+                                      'type': {
+                                          'id': 'boolean'
+                                      },
+                                      'id': 'b1',
+                                      'value': 'false',
+                                      'doc_js_interface_name': 'I'
+                                  },
+                                  {
+                                      'type': {
+                                          'id': 'boolean'
+                                      },
+                                      'id': 'b2',
+                                      'value': 'true',
+                                      'doc_js_interface_name': 'I'
+                                  }]
+                }]
+            })
 
-  def test_annotations(self):
-    self._run_test(
-      idlparser.FREMONTCUT_SYNTAX,
-      '@Ano1 @Ano2() @Ano3(x=1) @Ano4(x,y=2) interface I {};',
-      {'interfaces': [{'javascript_binding_name': 'I', 'doc_js_name': 'I', 'id': 'I', 'annotations': {'Ano4': {'y': '2', 'x': None}, 'Ano1': {}, 'Ano2': {}, 'Ano3': {'x': '1'}}}]})
-    self._run_test(
-      idlparser.FREMONTCUT_SYNTAX,
-      '''interface I : @Ano1 J {
+    def test_annotations(self):
+        self._run_test(
+            idlparser.FREMONTCUT_SYNTAX,
+            '@Ano1 @Ano2() @Ano3(x=1) @Ano4(x,y=2) interface I {};', {
+                'interfaces': [{
+                    'javascript_binding_name': 'I',
+                    'doc_js_name': 'I',
+                    'id': 'I',
+                    'annotations': {
+                        'Ano4': {
+                            'y': '2',
+                            'x': None
+                        },
+                        'Ano1': {},
+                        'Ano2': {},
+                        'Ano3': {
+                            'x': '1'
+                        }
+                    }
+                }]
+            })
+        self._run_test(
+            idlparser.FREMONTCUT_SYNTAX, '''interface I : @Ano1 J {
         @Ano2 attribute int someAttr;
         @Ano3 void someOp();
         @Ano3 const int someConst = 0;
-      };''',
-      {'interfaces': [{'operations': [{'annotations': {'Ano3': {}}, 'type': {'id': 'void'}, 'id': 'someOp', 'doc_js_interface_name': 'I'}], 'javascript_binding_name': 'I', 'parents': [{'type': {'id': 'J'}, 'annotations': {'Ano1': {}}}], 'attributes': [{'annotations': {'Ano2': {}}, 'type': {'id': 'int'}, 'id': 'someAttr', 'doc_js_interface_name': 'I'}], 'doc_js_name': 'I', 'id': 'I', 'constants': [{'annotations': {'Ano3': {}}, 'type': {'id': 'int'}, 'id': 'someConst', 'value': '0', 'doc_js_interface_name': 'I'}]}]})
+      };''', {
+                'interfaces': [{
+                    'operations': [{
+                        'annotations': {
+                            'Ano3': {}
+                        },
+                        'type': {
+                            'id': 'void'
+                        },
+                        'id': 'someOp',
+                        'doc_js_interface_name': 'I'
+                    }],
+                    'javascript_binding_name':
+                    'I',
+                    'parents': [{
+                        'type': {
+                            'id': 'J'
+                        },
+                        'annotations': {
+                            'Ano1': {}
+                        }
+                    }],
+                    'attributes': [{
+                        'annotations': {
+                            'Ano2': {}
+                        },
+                        'type': {
+                            'id': 'int'
+                        },
+                        'id': 'someAttr',
+                        'doc_js_interface_name': 'I'
+                    }],
+                    'doc_js_name':
+                    'I',
+                    'id':
+                    'I',
+                    'constants': [{
+                        'annotations': {
+                            'Ano3': {}
+                        },
+                        'type': {
+                            'id': 'int'
+                        },
+                        'id': 'someConst',
+                        'value': '0',
+                        'doc_js_interface_name': 'I'
+                    }]
+                }]
+            })
 
-  def test_inheritance(self):
-    self._run_test(
-      None,
-      'interface Shape {}; interface Rectangle : Shape {}; interface Square : Rectangle, Shape {};',
-      {'interfaces': [{'javascript_binding_name': 'Shape', 'doc_js_name': 'Shape', 'id': 'Shape'}, {'javascript_binding_name': 'Rectangle', 'doc_js_name': 'Rectangle', 'parents': [{'type': {'id': 'Shape'}}], 'id': 'Rectangle'}, {'javascript_binding_name': 'Square', 'doc_js_name': 'Square', 'parents': [{'type': {'id': 'Rectangle'}}, {'type': {'id': 'Shape'}}], 'id': 'Square'}]})
+    def test_inheritance(self):
+        self._run_test(
+            None,
+            'interface Shape {}; interface Rectangle : Shape {}; interface Square : Rectangle, Shape {};',
+            {
+                'interfaces': [{
+                    'javascript_binding_name': 'Shape',
+                    'doc_js_name': 'Shape',
+                    'id': 'Shape'
+                },
+                               {
+                                   'javascript_binding_name': 'Rectangle',
+                                   'doc_js_name': 'Rectangle',
+                                   'parents': [{
+                                       'type': {
+                                           'id': 'Shape'
+                                       }
+                                   }],
+                                   'id': 'Rectangle'
+                               },
+                               {
+                                   'javascript_binding_name':
+                                   'Square',
+                                   'doc_js_name':
+                                   'Square',
+                                   'parents': [{
+                                       'type': {
+                                           'id': 'Rectangle'
+                                       }
+                                   }, {
+                                       'type': {
+                                           'id': 'Shape'
+                                       }
+                                   }],
+                                   'id':
+                                   'Square'
+                               }]
+            })
+
 
 if __name__ == "__main__":
-  logging.config.fileConfig("logging.conf")
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig("logging.conf")
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/idlrenderer.py b/tools/dom/scripts/idlrenderer.py
index 0ad5074..40edc3d 100755
--- a/tools/dom/scripts/idlrenderer.py
+++ b/tools/dom/scripts/idlrenderer.py
@@ -7,184 +7,186 @@
 
 
 def render(idl_node, indent_str='  '):
-  output = []
-  indent_stack = []
+    output = []
+    indent_stack = []
 
-  def begin_indent():
-    indent_stack.append(indent_str)
-  def end_indent():
-    indent_stack.pop()
+    def begin_indent():
+        indent_stack.append(indent_str)
 
-  def sort(nodes):
-    return sorted(nodes, key=lambda node: node.id)
+    def end_indent():
+        indent_stack.pop()
 
-  def wln(node=None):
-    """Writes the given node and adds a new line."""
-    w(node)
-    output.append('\n')
+    def sort(nodes):
+        return sorted(nodes, key=lambda node: node.id)
 
-  def wsp(node):
-    """Writes the given node and adds a space if there was output."""
-    mark = len(output)
-    w(node)
-    if mark != len(output):
-      w(' ')
+    def wln(node=None):
+        """Writes the given node and adds a new line."""
+        w(node)
+        output.append('\n')
 
-  def w(node, list_separator=None):
-    """Writes the given node.
+    def wsp(node):
+        """Writes the given node and adds a space if there was output."""
+        mark = len(output)
+        w(node)
+        if mark != len(output):
+            w(' ')
+
+    def w(node, list_separator=None):
+        """Writes the given node.
 
     Args:
       node -- a string, IDLNode instance or a list of such.
       list_separator -- if provided, and node is a list,
         list_separator will be written between the list items.
     """
-    if node is None:
-      return
-    elif isinstance(node, str):
-      if output and output[-1].endswith('\n'):
-        # Auto-indent.
-        output.extend(indent_stack)
-      output.append(node)
-    elif isinstance(node, list):
-      for i in range(0, len(node)):
-        if i > 0:
-          w(list_separator)
-        w(node[i])
-    elif isinstance(node, IDLFile):
-      w(node.interfaces)
-      w(node.enums)
-      w(node.typeDefs)
-    elif isinstance(node, IDLModule):
-      wsp(node.annotations)
-      wsp(node.ext_attrs)
-      wln('module %s {' % node.id)
-      begin_indent()
-      w(node.interfaces)
-      w(node.enums)
-      w(node.typeDefs)
-      end_indent()
-      wln('};')
-    elif isinstance(node, IDLEnum):
-      w('enum %s {}' % node.id)
-      # TODO(antonm): emit values as well.
-    elif isinstance(node, IDLInterface):
-      if node.annotations:
-        wln(node.annotations)
-      if node.ext_attrs:
-        wln(node.ext_attrs)
-      w('interface %s' % node.id)
-      begin_indent()
-      begin_indent()
-      if node.parents:
-        wln(' :')
-        w(node.parents, ',\n')
-      wln(' {')
-      end_indent()
-      if node.constants:
-        wln()
-        wln('/* Constants */')
-        w(sort(node.constants))
-      if node.attributes:
-        wln()
-        wln('/* Attributes */')
-        w(sort(node.attributes))
-      if node.operations:
-        wln()
-        wln('/* Operations */')
-        w(sort(node.operations))
-      end_indent()
-      wln('};')
-    elif isinstance(node, IDLParentInterface):
-      wsp(node.annotations)
-      w(node.type.id)
-    elif isinstance(node, IDLAnnotations):
-      sep = ''
-      for (name, annotation) in sorted(node.items()):
-        w(sep)
-        sep = ' '
-        if annotation and len(annotation):
-          subRes = []
-          for (argName, argValue) in sorted(annotation.items()):
-            if argValue is None:
-              subRes.append(argName)
-            else:
-              subRes.append('%s=%s' % (argName, argValue))
-          w('@%s(%s)' % (name, ', '.join(subRes)))
+        if node is None:
+            return
+        elif isinstance(node, str):
+            if output and output[-1].endswith('\n'):
+                # Auto-indent.
+                output.extend(indent_stack)
+            output.append(node)
+        elif isinstance(node, list):
+            for i in range(0, len(node)):
+                if i > 0:
+                    w(list_separator)
+                w(node[i])
+        elif isinstance(node, IDLFile):
+            w(node.interfaces)
+            w(node.enums)
+            w(node.typeDefs)
+        elif isinstance(node, IDLModule):
+            wsp(node.annotations)
+            wsp(node.ext_attrs)
+            wln('module %s {' % node.id)
+            begin_indent()
+            w(node.interfaces)
+            w(node.enums)
+            w(node.typeDefs)
+            end_indent()
+            wln('};')
+        elif isinstance(node, IDLEnum):
+            w('enum %s {}' % node.id)
+            # TODO(antonm): emit values as well.
+        elif isinstance(node, IDLInterface):
+            if node.annotations:
+                wln(node.annotations)
+            if node.ext_attrs:
+                wln(node.ext_attrs)
+            w('interface %s' % node.id)
+            begin_indent()
+            begin_indent()
+            if node.parents:
+                wln(' :')
+                w(node.parents, ',\n')
+            wln(' {')
+            end_indent()
+            if node.constants:
+                wln()
+                wln('/* Constants */')
+                w(sort(node.constants))
+            if node.attributes:
+                wln()
+                wln('/* Attributes */')
+                w(sort(node.attributes))
+            if node.operations:
+                wln()
+                wln('/* Operations */')
+                w(sort(node.operations))
+            end_indent()
+            wln('};')
+        elif isinstance(node, IDLParentInterface):
+            wsp(node.annotations)
+            w(node.type.id)
+        elif isinstance(node, IDLAnnotations):
+            sep = ''
+            for (name, annotation) in sorted(node.items()):
+                w(sep)
+                sep = ' '
+                if annotation and len(annotation):
+                    subRes = []
+                    for (argName, argValue) in sorted(annotation.items()):
+                        if argValue is None:
+                            subRes.append(argName)
+                        else:
+                            subRes.append('%s=%s' % (argName, argValue))
+                    w('@%s(%s)' % (name, ', '.join(subRes)))
+                else:
+                    w('@%s' % name)
+        elif isinstance(node, IDLExtAttrs):
+            if len(node):
+                w('[')
+                i = 0
+                for k in sorted(node):
+                    if i > 0:
+                        w(', ')
+                    w(k)
+                    v = node[k]
+                    if v is not None:
+                        if isinstance(v, IDLExtAttrFunctionValue):
+                            if v.id:
+                                w('=')
+                            w(v)
+                        elif isinstance(v, list):
+                            assert k == 'Constructor'
+                            w(v[0])
+                            for c in v[1:]:
+                                w(', ')
+                                w(k)
+                                w(c)
+                        else:
+                            w('=%s' % v.__str__())
+                    i += 1
+                w(']')
+        elif isinstance(node, IDLExtAttrFunctionValue):
+            if node.id:
+                w(node.id)
+            w('(')
+            w(node.arguments, ', ')
+            w(')')
+        elif isinstance(node, IDLAttribute):
+            wsp(node.annotations)
+            wsp(node.ext_attrs)
+            if node.is_read_only:
+                w('readonly ')
+            w('attribute ')
+            w(node.type.id)
+            if (node.type.nullable):
+                w('?')
+            w(' ')
+            w(node.id)
+            wln(';')
+        elif isinstance(node, IDLConstant):
+            wsp(node.annotations)
+            wsp(node.ext_attrs)
+            wln('const %s %s = %s;' % (node.type.id, node.id, node.value))
+        elif isinstance(node, IDLOperation):
+            wsp(node.annotations)
+            wsp(node.ext_attrs)
+            if node.is_static:
+                w('static ')
+            if node.specials:
+                w(node.specials, ' ')
+                w(' ')
+            w(node.type.id)
+            if (node.type.nullable):
+                w('?')
+            w(' ')
+            w(node.id)
+            w('(')
+            w(node.arguments, ', ')
+            w(')')
+            wln(';')
+        elif isinstance(node, IDLArgument):
+            wsp(node.ext_attrs)
+            if (node.optional):
+                w('optional ')
+            w(node.type.id)
+            if node.type.nullable:
+                w('?')
+            w(' %s' % node.id)
         else:
-          w('@%s' % name)
-    elif isinstance(node, IDLExtAttrs):
-      if len(node):
-        w('[')
-        i = 0
-        for k in sorted(node):
-          if i > 0:
-            w(', ')
-          w(k)
-          v = node[k]
-          if v is not None:
-            if isinstance(v, IDLExtAttrFunctionValue):
-              if v.id:
-                w('=')
-              w(v)
-            elif isinstance(v, list):
-              assert k == 'Constructor'
-              w(v[0])
-              for c in v[1:]:
-                w(', '); w(k); w(c)
-            else:
-              w('=%s' % v.__str__())
-          i += 1
-        w(']')
-    elif isinstance(node, IDLExtAttrFunctionValue):
-      if node.id:
-        w(node.id)
-      w('(')
-      w(node.arguments, ', ')
-      w(')')
-    elif isinstance(node, IDLAttribute):
-      wsp(node.annotations)
-      wsp(node.ext_attrs)
-      if node.is_read_only:
-        w('readonly ')
-      w('attribute ')
-      w(node.type.id)
-      if (node.type.nullable):
-        w('?')
-      w(' ')
-      w(node.id)
-      wln(';')
-    elif isinstance(node, IDLConstant):
-      wsp(node.annotations)
-      wsp(node.ext_attrs)
-      wln('const %s %s = %s;' % (node.type.id, node.id, node.value))
-    elif isinstance(node, IDLOperation):
-      wsp(node.annotations)
-      wsp(node.ext_attrs)
-      if node.is_static:
-        w('static ')
-      if node.specials:
-        w(node.specials, ' ')
-        w(' ')
-      w(node.type.id)
-      if (node.type.nullable):
-        w('?')
-      w(' ')
-      w(node.id)
-      w('(')
-      w(node.arguments, ', ')
-      w(')')
-      wln(';')
-    elif isinstance(node, IDLArgument):
-      wsp(node.ext_attrs)
-      if (node.optional):
-        w('optional ')
-      w(node.type.id)
-      if node.type.nullable:
-        w('?')
-      w(' %s' % node.id)
-    else:
-      raise TypeError("Expected str or IDLNode but %s found" %
-        type(node))
+            raise TypeError("Expected str or IDLNode but %s found" % type(node))
 
-  w(idl_node)
-  return ''.join(output)
+    w(idl_node)
+    return ''.join(output)
diff --git a/tools/dom/scripts/idlrenderer_test.py b/tools/dom/scripts/idlrenderer_test.py
index ba788af..dd057c2 100755
--- a/tools/dom/scripts/idlrenderer_test.py
+++ b/tools/dom/scripts/idlrenderer_test.py
@@ -12,24 +12,24 @@
 
 class IDLRendererTestCase(unittest.TestCase):
 
-  def _run_test(self, input_text, expected_text):
-    """Parses input, renders it and compares the results"""
-    parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
-    idl_file = idlnode.IDLFile(parser.parse(input_text))
-    output_text = idlrenderer.render(idl_file)
+    def _run_test(self, input_text, expected_text):
+        """Parses input, renders it and compares the results"""
+        parser = idlparser.IDLParser(idlparser.FREMONTCUT_SYNTAX)
+        idl_file = idlnode.IDLFile(parser.parse(input_text))
+        output_text = idlrenderer.render(idl_file)
 
-    if output_text != expected_text:
-      msg = '''
+        if output_text != expected_text:
+            msg = '''
 EXPECTED:
 %s
 ACTUAL  :
 %s
 ''' % (expected_text, output_text)
-      self.fail(msg)
+            self.fail(msg)
 
-  def test_rendering(self):
-    input_text = \
-'''module M {
+    def test_rendering(self):
+        input_text = \
+    '''module M {
   [Constructor(long x)] interface I : @A J, K {
     attribute int attr;
     readonly attribute long attr2;
@@ -48,8 +48,8 @@
   @Y interface I {};
 };'''
 
-    expected_text = \
-'''module M {
+        expected_text = \
+    '''module M {
   [Constructor(in long x)]
   interface I :
       @A J,
@@ -75,9 +75,10 @@
   };
 };
 '''
-    self._run_test(input_text, expected_text)
+        self._run_test(input_text, expected_text)
+
 
 if __name__ == "__main__":
-  logging.config.fileConfig("logging.conf")
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig("logging.conf")
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/idlsync.py b/tools/dom/scripts/idlsync.py
index e5ac565..4402849 100755
--- a/tools/dom/scripts/idlsync.py
+++ b/tools/dom/scripts/idlsync.py
@@ -81,7 +81,7 @@
 ]
 IDL_EXT = '.idl'
 PY_EXT = '.py'
-LICENSE_FILE_PREFIX = 'LICENSE'    # e.g., LICENSE-APPLE, etc.
+LICENSE_FILE_PREFIX = 'LICENSE'  # e.g., LICENSE-APPLE, etc.
 
 # Look in any file in WebCore we copy from WebKit if this comment is in the file
 # then flag this as a special .py or .idl file that needs to be looked at.
@@ -92,123 +92,131 @@
 
 warning_messages = []
 
+
 # Is --dry_run passed in.
 def isDryRun():
-  global options
-  return options['dry_run'] is not None
+    global options
+    return options['dry_run'] is not None
+
 
 # Is --verbose passed in.
 def isVerbose():
-  global options
-  return options['verbose'] is not None
+    global options
+    return options['verbose'] is not None
+
 
 # If --WebKit= is specified then compute the directory of the Chromium
 # source.
 def chromiumDirectory():
-  global options
-  if options['chromium_dir'] is not None:
-    return os.path.expanduser(options['chromium_dir'])
-  return os.cwd()
+    global options
+    if options['chromium_dir'] is not None:
+        return os.path.expanduser(options['chromium_dir'])
+    return os.cwd()
+
 
 def RunCommand(cmd, valid_exits=[0]):
-  """Executes a shell command and return its stdout."""
-  if isVerbose():
-    print ' '.join(cmd)
-  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
-  output = pipe.communicate()
-  if pipe.returncode in valid_exits:
-    return output[0]
-  else:
-    print output[1]
-    print 'FAILED. RET_CODE=%d' % pipe.returncode
-    sys.exit(pipe.returncode)
+    """Executes a shell command and return its stdout."""
+    if isVerbose():
+        print ' '.join(cmd)
+    pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
+    output = pipe.communicate()
+    if pipe.returncode in valid_exits:
+        return output[0]
+    else:
+        print output[1]
+        print 'FAILED. RET_CODE=%d' % pipe.returncode
+        sys.exit(pipe.returncode)
+
 
 # returns True if // FIXMEDART: is in the file.
 def anyDartFixMe(filepath):
-  if os.path.exists(filepath):
-    data = open(filepath, 'r').read()
-    return data.find(DART_CHANGES) != -1
-  else:
-    return False
+    if os.path.exists(filepath):
+        data = open(filepath, 'r').read()
+        return data.find(DART_CHANGES) != -1
+    else:
+        return False
+
 
 # Give a base_dir compute the trailing directory after base_dir
 # returns the subpath from base_dir for the path passed in.
 def subpath(path, base_dir):
-  dir_portion = ''
-  head = path
-  while True:
-    head, tail = os.path.split(head)
-    dir_portion = os.path.join(tail, dir_portion)
-    if head == base_dir or tail == '':
-      break;
-  return dir_portion
+    dir_portion = ''
+    head = path
+    while True:
+        head, tail = os.path.split(head)
+        dir_portion = os.path.join(tail, dir_portion)
+        if head == base_dir or tail == '':
+            break
+    return dir_portion
+
 
 # Copy any file in source_dir (WebKit) to destination_dir (dart/third_party/WebCore)
 # source_dir is the src/third_party/WebKit/Source location (blink)
 # destination_dir is the src/dart/third_party/WebCore location
 # returns idls_copied, py_copied, other_copied
 def copy_files(source_dir, src_prefix, destination_dir):
-  original_cwd = os.getcwd()
-  try:
-    os.makedirs(destination_dir)
-  except OSError as e:
-    if e.errno != errno.EEXIST:
-      raise
-  os.chdir(destination_dir)
+    original_cwd = os.getcwd()
+    try:
+        os.makedirs(destination_dir)
+    except OSError as e:
+        if e.errno != errno.EEXIST:
+            raise
+    os.chdir(destination_dir)
 
-  idls = 0                  # *.idl files copied
-  pys = 0                   # *.py files copied
-  others = 0                # all other files copied
+    idls = 0  # *.idl files copied
+    pys = 0  # *.py files copied
+    others = 0  # all other files copied
 
-  for (root, _, files) in os.walk(source_dir, topdown=False):
-    dir_portion = subpath(root, source_dir)
-    for f in files:
-      # Never automatically add any Dart generator scripts (these are the original
-      # sources in WebCore) from WebKit to WebCore.
-      if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
-        if (f.endswith(IDL_EXT) or
-            f == IDL_EXTENDED_ATTRIBUTES_FILE or
-            f.endswith(PY_EXT) or
-            f.startswith(LICENSE_FILE_PREFIX)):
-          if f.endswith(IDL_EXT):
-            idls += 1
-          elif f.endswith(PY_EXT):
-            pys += 1
-          else:
-            others += 1
-          src_file = os.path.join(root, f)
+    for (root, _, files) in os.walk(source_dir, topdown=False):
+        dir_portion = subpath(root, source_dir)
+        for f in files:
+            # Never automatically add any Dart generator scripts (these are the original
+            # sources in WebCore) from WebKit to WebCore.
+            if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
+                if (f.endswith(IDL_EXT) or f == IDL_EXTENDED_ATTRIBUTES_FILE or
+                        f.endswith(PY_EXT) or
+                        f.startswith(LICENSE_FILE_PREFIX)):
+                    if f.endswith(IDL_EXT):
+                        idls += 1
+                    elif f.endswith(PY_EXT):
+                        pys += 1
+                    else:
+                        others += 1
+                    src_file = os.path.join(root, f)
 
-          # Compute the destination path using sdk/third_party/WebCore
-          subdir_root = src_file[src_file.rfind(src_prefix) + len(src_prefix):]
-          if subdir_root.startswith(os.path.sep):
-            subdir_root = subdir_root[1:]
-          dst_file = os.path.join(destination_dir, subdir_root)
+                    # Compute the destination path using sdk/third_party/WebCore
+                    subdir_root = src_file[src_file.rfind(src_prefix) +
+                                           len(src_prefix):]
+                    if subdir_root.startswith(os.path.sep):
+                        subdir_root = subdir_root[1:]
+                    dst_file = os.path.join(destination_dir, subdir_root)
 
-          # Need to make src/third_party/WebKit/Source/* to sdk/third_party/WebCore/*
+                    # Need to make src/third_party/WebKit/Source/* to sdk/third_party/WebCore/*
 
-          destination = os.path.dirname(dst_file)
-          if not os.path.exists(destination):
-            os.makedirs(destination)
+                    destination = os.path.dirname(dst_file)
+                    if not os.path.exists(destination):
+                        os.makedirs(destination)
 
-          has_Dart_fix_me = anyDartFixMe(dst_file)
+                    has_Dart_fix_me = anyDartFixMe(dst_file)
 
-          if not isDryRun():
-            copyfile(src_file, dst_file)
-          if isVerbose():
-            #print('...copying %s' % os.path.split(dst_file)[1])
-            print('...copying %s' % dst_file)
-          if f == IDL_EXTENDED_ATTRIBUTES_FILE:
-            warning_messages.append(dst_file)
-          else:
-            if has_Dart_fix_me:
-              warning_messages.append(dst_file)
-            if not (isDryRun() or has_Dart_fix_me):
-              # git add the file
-              RunCommand(['git', 'add', dst_file])
+                    if not isDryRun():
+                        copyfile(src_file, dst_file)
+                    if isVerbose():
+                        #print('...copying %s' % os.path.split(dst_file)[1])
+                        print('...copying %s' % dst_file)
+                    if f == IDL_EXTENDED_ATTRIBUTES_FILE:
+                        warning_messages.append(dst_file)
+                    else:
+                        if has_Dart_fix_me:
+                            warning_messages.append(dst_file)
+                        if not (isDryRun() or has_Dart_fix_me):
+                            # git add the file
+                            RunCommand(['git', 'add', dst_file])
 
-  os.chdir(original_cwd)
+    os.chdir(original_cwd)
 
-  return [idls, pys, others]
+    return [idls, pys, others]
+
 
 # Remove any file in webcore_dir that no longer exist in the webkit_dir
 # webcore_dir src/dart/third_party/WebCore location
@@ -216,177 +224,206 @@
 # only check if the subdir off from webcore_dir
 # return list of files deleted
 def remove_obsolete_webcore_files(webcore_dir, webkit_dir, subdir):
-  files_to_delete = []
+    files_to_delete = []
 
-  original_cwd = os.getcwd()
+    original_cwd = os.getcwd()
 
-  if os.path.exists(webcore_dir):
-    os.chdir(webcore_dir)
+    if os.path.exists(webcore_dir):
+        os.chdir(webcore_dir)
 
-    for (root, _, files) in os.walk(os.path.join(webcore_dir, subdir), topdown=False):
-      dir_portion = subpath(root, webcore_dir)
-      for f in files:
-        # Never automatically deleted any Dart generator scripts (these are the
-        # original sources in WebCore).
-        if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
-          check_file = os.path.join(dir_portion, f)
-          check_file_full_path = os.path.join(webkit_dir, check_file)
-          if not os.path.exists(check_file_full_path) and \
-             not(check_file_full_path.endswith(PYTHON_INITS)):
-            if not isDryRun():
-              # Remove the file using git
-              RunCommand(['git', 'rm', check_file])
-            files_to_delete.append(check_file)
+        for (root, _, files) in os.walk(
+                os.path.join(webcore_dir, subdir), topdown=False):
+            dir_portion = subpath(root, webcore_dir)
+            for f in files:
+                # Never automatically deleted any Dart generator scripts (these are the
+                # original sources in WebCore).
+                if dir_portion != DART_SDK_GENERATOR_SCRIPTS:
+                    check_file = os.path.join(dir_portion, f)
+                    check_file_full_path = os.path.join(webkit_dir, check_file)
+                    if not os.path.exists(check_file_full_path) and \
+                       not(check_file_full_path.endswith(PYTHON_INITS)):
+                        if not isDryRun():
+                            # Remove the file using git
+                            RunCommand(['git', 'rm', check_file])
+                        files_to_delete.append(check_file)
 
-  os.chdir(original_cwd)
+    os.chdir(original_cwd)
 
-  return files_to_delete
+    return files_to_delete
+
 
 def ParseOptions():
-  parser = optparse.OptionParser()
-  parser.add_option('--chromium', '-c', dest='chromium_dir', action='store', type='string',
-                    help='WebKit Chrome directory (e.g., --chromium=~/chrome63', default=None)
-  parser.add_option('--verbose', '-v', dest='verbose', action='store_true',
-                    help='Dump all information', default=None)
-  parser.add_option('--dry_run', '-d', dest='dry_run', action='store_true',
-                    help='Display results without adding, updating or deleting any files', default=None)
-  args, _ = parser.parse_args()
+    parser = optparse.OptionParser()
+    parser.add_option(
+        '--chromium',
+        '-c',
+        dest='chromium_dir',
+        action='store',
+        type='string',
+        help='WebKit Chrome directory (e.g., --chromium=~/chrome63',
+        default=None)
+    parser.add_option(
+        '--verbose',
+        '-v',
+        dest='verbose',
+        action='store_true',
+        help='Dump all information',
+        default=None)
+    parser.add_option(
+        '--dry_run',
+        '-d',
+        dest='dry_run',
+        action='store_true',
+        help='Display results without adding, updating or deleting any files',
+        default=None)
+    args, _ = parser.parse_args()
 
-  argOptions = {}
-  argOptions['chromium_dir'] = args.chromium_dir
-  argOptions['verbose'] = args.verbose
-  argOptions['dry_run'] = args.dry_run
-  return argOptions
+    argOptions = {}
+    argOptions['chromium_dir'] = args.chromium_dir
+    argOptions['verbose'] = args.verbose
+    argOptions['dry_run'] = args.dry_run
+    return argOptions
+
 
 # Fetch the DEPS file in src/dart/tools/deps/dartium.deps/DEPS from the GIT repro.
 def GetDepsFromGit():
-  req = requests.get(DEPS_GIT)
-  return req.text
+    req = requests.get(DEPS_GIT)
+    return req.text
+
 
 def ValidateGitRemotes():
-  #origin  https://chromium.googlesource.com/dart/dartium/src.git (fetch)
-  remotes_list = RunCommand(['git', 'remote', '--verbose']).split()
-  if (len(remotes_list) > 2 and
-      remotes_list[0] == 'origin' and remotes_list[1] == GIT_REMOTES_CHROMIUM):
-    return True
+    #origin  https://chromium.googlesource.com/dart/dartium/src.git (fetch)
+    remotes_list = RunCommand(['git', 'remote', '--verbose']).split()
+    if (len(remotes_list) > 2 and remotes_list[0] == 'origin' and
+            remotes_list[1] == GIT_REMOTES_CHROMIUM):
+        return True
 
-  print 'ERROR: Unable to find dart/dartium/src repository %s' % GIT_REMOTES_CHROMIUM
-  return False
+    print 'ERROR: Unable to find dart/dartium/src repository %s' % GIT_REMOTES_CHROMIUM
+    return False
+
 
 def getChromiumSHA():
-  cwd = os.getcwd()
-  chromiumDir = chromiumDirectory()
+    cwd = os.getcwd()
+    chromiumDir = chromiumDirectory()
 
-  webkit_dir = os.path.join(chromiumDir, WEBKIT_SOURCE)
-  os.chdir(webkit_dir)
+    webkit_dir = os.path.join(chromiumDir, WEBKIT_SOURCE)
+    os.chdir(webkit_dir)
 
-  if ValidateGitRemotes():
-    chromium_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
-  else:
-    chromium_sha = -1
+    if ValidateGitRemotes():
+        chromium_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
+    else:
+        chromium_sha = -1
 
-  os.chdir(cwd)
-  return chromium_sha
+    os.chdir(cwd)
+    return chromium_sha
+
 
 def getCurrentDartSHA():
-  cwd = os.getcwd()
+    cwd = os.getcwd()
 
-  if cwd.endswith('dart'):
-    # In src/dart
-    src_dir, _ = os.path.split(cwd)
-  elif cwd.endswith('sdk'):
-    src_dir = cwd
-  else:
-    src_dir = os.path.join(cwd, 'sdk')
-  os.chdir(src_dir)
+    if cwd.endswith('dart'):
+        # In src/dart
+        src_dir, _ = os.path.split(cwd)
+    elif cwd.endswith('sdk'):
+        src_dir = cwd
+    else:
+        src_dir = os.path.join(cwd, 'sdk')
+    os.chdir(src_dir)
 
-  if ValidateGitRemotes():
-    dart_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
-  else:
-    dart_sha = -1
+    if ValidateGitRemotes():
+        dart_sha = RunCommand(['git', 'log', '--format=format:%H', '-1'])
+    else:
+        dart_sha = -1
 
-  os.chdir(cwd)
-  return dart_sha
+    os.chdir(cwd)
+    return dart_sha
+
 
 # Returns the SHA of the Dartium/Chromiun in the DEPS file.
 def GetDEPSWebCoreGitRevision(deps, component):
-  """Returns a tuple with the (dartium chromium repo, latest revision)."""
-  foundIt = re.search(WEBKIT_SHA_PATTERN, deps)
-  #url_base, url_pattern = DEPS_PATTERNS[component]
-  #url = url_base + re.search(url_pattern, deps).group(1)
-  # Get the SHA for the Chromium/WebKit changes for Dartium.
-  #revision = url[len(url_base):]
-  revision = foundIt.group(1)[1:]
-  print '%s' % revision
-  return revision
+    """Returns a tuple with the (dartium chromium repo, latest revision)."""
+    foundIt = re.search(WEBKIT_SHA_PATTERN, deps)
+    #url_base, url_pattern = DEPS_PATTERNS[component]
+    #url = url_base + re.search(url_pattern, deps).group(1)
+    # Get the SHA for the Chromium/WebKit changes for Dartium.
+    #revision = url[len(url_base):]
+    revision = foundIt.group(1)[1:]
+    print '%s' % revision
+    return revision
+
 
 def copy_subdir(src, src_prefix, dest, subdir):
-  idls_deleted = remove_obsolete_webcore_files(dest, src, subdir)
-  print "%s files removed in WebCore %s" % (idls_deleted.__len__(), subdir)
-  if isVerbose():
-    for delete_file in idls_deleted:
-      print "    %s" % delete_file
+    idls_deleted = remove_obsolete_webcore_files(dest, src, subdir)
+    print "%s files removed in WebCore %s" % (idls_deleted.__len__(), subdir)
+    if isVerbose():
+        for delete_file in idls_deleted:
+            print "    %s" % delete_file
 
-  idls_copied, py_copied, other_copied = copy_files(os.path.join(src, subdir), src_prefix, dest)
-  if idls_copied > 0:
-    print "Copied %s IDLs to %s" % (idls_copied, subdir)
-  if py_copied > 0:
-    print "Copied %s PYs to %s" % (py_copied, subdir)
-  if other_copied > 0:
-    print "Copied %s other to %s\n" % (other_copied, subdir)
+    idls_copied, py_copied, other_copied = copy_files(
+        os.path.join(src, subdir), src_prefix, dest)
+    if idls_copied > 0:
+        print "Copied %s IDLs to %s" % (idls_copied, subdir)
+    if py_copied > 0:
+        print "Copied %s PYs to %s" % (py_copied, subdir)
+    if other_copied > 0:
+        print "Copied %s other to %s\n" % (other_copied, subdir)
+
 
 def main():
-  global options
-  options = ParseOptions()
+    global options
+    options = ParseOptions()
 
-  current_dir = os.path.dirname(os.path.abspath(__file__))
-  if not current_dir.endswith(SOURCE_FILE_DIR):
-    print 'ERROR: idlsync.py not run in proper directory (%s)\n', current_dir
+    current_dir = os.path.dirname(os.path.abspath(__file__))
+    if not current_dir.endswith(SOURCE_FILE_DIR):
+        print 'ERROR: idlsync.py not run in proper directory (%s)\n', current_dir
 
-  base_directory = current_dir[:current_dir.rfind(SOURCE_FILE_DIR)]
+    base_directory = current_dir[:current_dir.rfind(SOURCE_FILE_DIR)]
 
-  # Validate DEPS WebCore_rev SHA DOES NOT match the SHA of chromium master.
-  deps = GetDepsFromGit()
-  webcore_revision = GetDEPSWebCoreGitRevision(deps, 'webkit')
-  chromium_sha = getChromiumSHA()
-  if webcore_revision == chromium_sha:
-    print "ERROR: Nothing to update in WebCore, WebCore_rev SHA in DEPS " \
-          "matches Chromium GIT master SHA in %s" % options['webkit_dir']
-    return
+    # Validate DEPS WebCore_rev SHA DOES NOT match the SHA of chromium master.
+    deps = GetDepsFromGit()
+    webcore_revision = GetDEPSWebCoreGitRevision(deps, 'webkit')
+    chromium_sha = getChromiumSHA()
+    if webcore_revision == chromium_sha:
+        print "ERROR: Nothing to update in WebCore, WebCore_rev SHA in DEPS " \
+              "matches Chromium GIT master SHA in %s" % options['webkit_dir']
+        return
 
-  start_time = time.time()
+    start_time = time.time()
 
-  # Copy scripts from third_party/blink/tools to third_party/WebCore/blink/tools
-  #
-  # This also implies that the files:
-  #     WebCore/bindings/scripts/code_generator_web_agent_api.py
-  #     WebCore/bindings/scripts/utilities.py
-  #
-  # Need to have sys.path.append at beginning of the above files changed from:
-  #
-  #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', '..',
-  #                                 'third_party', 'blink', 'tools'))
-  # to
-  #
-  #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..',
-  #                                 'blink', 'tools'))
-  #
-  webkit_blink_dir = os.path.join(chromiumDirectory(), WEBKIT_BLINK_SOURCE)
-  webcore_blink_dir = os.path.join(base_directory, WEBCORE_BLINK_SOURCE)
-  copy_subdir(webkit_blink_dir, WEBKIT_BLINK_SOURCE, webcore_blink_dir, "")
+    # Copy scripts from third_party/blink/tools to third_party/WebCore/blink/tools
+    #
+    # This also implies that the files:
+    #     WebCore/bindings/scripts/code_generator_web_agent_api.py
+    #     WebCore/bindings/scripts/utilities.py
+    #
+    # Need to have sys.path.append at beginning of the above files changed from:
+    #
+    #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..', '..',
+    #                                 'third_party', 'blink', 'tools'))
+    # to
+    #
+    #    sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..',
+    #                                 'blink', 'tools'))
+    #
+    webkit_blink_dir = os.path.join(chromiumDirectory(), WEBKIT_BLINK_SOURCE)
+    webcore_blink_dir = os.path.join(base_directory, WEBCORE_BLINK_SOURCE)
+    copy_subdir(webkit_blink_dir, WEBKIT_BLINK_SOURCE, webcore_blink_dir, "")
 
-  chromium_webkit_dir = os.path.join(chromiumDirectory(), WEBKIT_SOURCE)
-  dart_webcore_dir = os.path.join(base_directory, WEBCORE_SOURCE)
-  for subdir in SUBDIRS:
-    copy_subdir(chromium_webkit_dir, WEBKIT_SOURCE, dart_webcore_dir, subdir)
+    chromium_webkit_dir = os.path.join(chromiumDirectory(), WEBKIT_SOURCE)
+    dart_webcore_dir = os.path.join(base_directory, WEBCORE_SOURCE)
+    for subdir in SUBDIRS:
+        copy_subdir(chromium_webkit_dir, WEBKIT_SOURCE, dart_webcore_dir,
+                    subdir)
 
-  end_time = time.time()
+    end_time = time.time()
 
-  print 'WARNING: File(s) contain FIXMEDART and are NOT "git add " please review:'
-  for warning in warning_messages:
-    print '    %s' % warning
+    print 'WARNING: File(s) contain FIXMEDART and are NOT "git add " please review:'
+    for warning in warning_messages:
+        print '    %s' % warning
 
-  print '\nDone idlsync completed in %s seconds' % round(end_time - start_time, 2)
+    print '\nDone idlsync completed in %s seconds' % round(
+        end_time - start_time, 2)
+
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/dom/scripts/monitored.py b/tools/dom/scripts/monitored.py
index d8316cf..55d4e11 100644
--- a/tools/dom/scripts/monitored.py
+++ b/tools/dom/scripts/monitored.py
@@ -2,78 +2,80 @@
 # 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.
-
-
 """This module provides maps and sets that report unused elements."""
 
 _monitored_values = []
 
 
 def FinishMonitoring(includeDart2jsOnly, logger):
-  for value in _monitored_values:
-    if value._dart2jsOnly and not includeDart2jsOnly:
-      continue
-    value.CheckUsage(logger)
+    for value in _monitored_values:
+        if value._dart2jsOnly and not includeDart2jsOnly:
+            continue
+        value.CheckUsage(logger)
+
 
 class MonitoredCollection(object):
-  def __init__(self, name, dart2jsOnly):
-    self.name = name
-    self._used_keys = set()
-    self._dart2jsOnly = dart2jsOnly
-    _monitored_values.append(self)
+
+    def __init__(self, name, dart2jsOnly):
+        self.name = name
+        self._used_keys = set()
+        self._dart2jsOnly = dart2jsOnly
+        _monitored_values.append(self)
+
 
 class Dict(MonitoredCollection):
-  """Wrapper for a dict that reports unused keys."""
+    """Wrapper for a dict that reports unused keys."""
 
-  def __init__(self, name, map, dart2jsOnly=False):
-    super(Dict, self).__init__(name, dart2jsOnly)
-    self._map = map
+    def __init__(self, name, map, dart2jsOnly=False):
+        super(Dict, self).__init__(name, dart2jsOnly)
+        self._map = map
 
-  def __getitem__(self, key):
-    self._used_keys.add(key)
-    return self._map[key]
+    def __getitem__(self, key):
+        self._used_keys.add(key)
+        return self._map[key]
 
-  def __setitem__(self, key, value):
-    self._map[key] = value
+    def __setitem__(self, key, value):
+        self._map[key] = value
 
-  def __contains__(self, key):
-    self._used_keys.add(key)
-    return key in self._map
+    def __contains__(self, key):
+        self._used_keys.add(key)
+        return key in self._map
 
-  def __iter__(self):
-    return self._map.__iter__()
+    def __iter__(self):
+        return self._map.__iter__()
 
-  def get(self, key, default=None):
-    self._used_keys.add(key)
-    return self._map.get(key, default)
+    def get(self, key, default=None):
+        self._used_keys.add(key)
+        return self._map.get(key, default)
 
-  def keys(self):
-    return self._map.keys()
+    def keys(self):
+        return self._map.keys()
 
-  def CheckUsage(self, logger):
-    for v in sorted(self._map.keys()):
-      if v not in self._used_keys:
-        logger.warn('dict \'%s\' has unused key \'%s\'' % (self.name, v))
+    def CheckUsage(self, logger):
+        for v in sorted(self._map.keys()):
+            if v not in self._used_keys:
+                logger.warn(
+                    'dict \'%s\' has unused key \'%s\'' % (self.name, v))
 
 
 class Set(MonitoredCollection):
-  """Wrapper for a set that reports unused keys."""
+    """Wrapper for a set that reports unused keys."""
 
-  def __init__(self, name, a_set, dart2jsOnly=False):
-    super(Set, self).__init__(name, dart2jsOnly)
-    self._set = a_set
+    def __init__(self, name, a_set, dart2jsOnly=False):
+        super(Set, self).__init__(name, dart2jsOnly)
+        self._set = a_set
 
-  def __contains__(self, key):
-    self._used_keys.add(key)
-    return key in self._set
+    def __contains__(self, key):
+        self._used_keys.add(key)
+        return key in self._set
 
-  def __iter__(self):
-    return self._set.__iter__()
+    def __iter__(self):
+        return self._set.__iter__()
 
-  def add(self, key):
-    self._set += [key]
+    def add(self, key):
+        self._set += [key]
 
-  def CheckUsage(self, logger):
-    for v in sorted(self._set):
-      if v not in self._used_keys:
-        logger.warn('set \'%s\' has unused key \'%s\'' % (self.name, v))
+    def CheckUsage(self, logger):
+        for v in sorted(self._set):
+            if v not in self._used_keys:
+                logger.warn('set \'%s\' has unused key \'%s\'' % (self.name, v))
diff --git a/tools/dom/scripts/multiemitter.py b/tools/dom/scripts/multiemitter.py
index 3764ebd..8318edb 100644
--- a/tools/dom/scripts/multiemitter.py
+++ b/tools/dom/scripts/multiemitter.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
-
 """Templating to help generate structured text."""
 
 import os
@@ -14,8 +13,9 @@
 
 _logger = logging.getLogger('multiemitter')
 
+
 class MultiEmitter(object):
-  """A set of Emitters that write to different files.
+    """A set of Emitters that write to different files.
 
   Each entry has a key.
 
@@ -24,15 +24,14 @@
 
   """
 
-  def __init__(self, logging_level=logging.WARNING):
-    self._key_to_emitter = {}     # key -> Emitter
-    self._filename_to_emitter = {}    # filename -> Emitter
+    def __init__(self, logging_level=logging.WARNING):
+        self._key_to_emitter = {}  # key -> Emitter
+        self._filename_to_emitter = {}  # filename -> Emitter
 
-    _logger.setLevel(logging_level)
+        _logger.setLevel(logging_level)
 
-
-  def FileEmitter(self, filename, key=None):
-    """Creates an emitter for writing to a file.
+    def FileEmitter(self, filename, key=None):
+        """Creates an emitter for writing to a file.
 
     When this MultiEmitter is flushed, the contents of the emitter are written
     to the file.
@@ -43,77 +42,80 @@
 
     Returns: the emitter.
     """
-    e = emitter.Emitter()
-    self._filename_to_emitter[filename] = e
-    if key:
-      self.Associate(key, e)
-    return e
+        e = emitter.Emitter()
+        self._filename_to_emitter[filename] = e
+        if key:
+            self.Associate(key, e)
+        return e
 
-  def Associate(self, key, emitter):
-    """Associates a key with an emitter."""
-    self._key_to_emitter[key] = emitter
+    def Associate(self, key, emitter):
+        """Associates a key with an emitter."""
+        self._key_to_emitter[key] = emitter
 
-  def Find(self, key):
-    """Returns the emitter associated with |key|."""
-    return self._key_to_emitter[key]
+    def Find(self, key):
+        """Returns the emitter associated with |key|."""
+        return self._key_to_emitter[key]
 
-  def Flush(self, writer=None):
-    """Writes all pending files.
+    def Flush(self, writer=None):
+        """Writes all pending files.
 
     Arguments:
       writer: a function called for each file and it's lines.
     """
-    if not writer:
-      writer = _WriteFile
-    for file in sorted(self._filename_to_emitter.keys()):
-      emitter = self._filename_to_emitter[file]
-      writer(file, emitter.Fragments())
+        if not writer:
+            writer = _WriteFile
+        for file in sorted(self._filename_to_emitter.keys()):
+            emitter = self._filename_to_emitter[file]
+            writer(file, emitter.Fragments())
 
 
 def _WriteFile(path, lines):
-  (dir, file) = os.path.split(path)
+    (dir, file) = os.path.split(path)
 
-  # Ensure dir exists.
-  if dir:
-    if not os.path.isdir(dir):
-      _logger.info('Mkdir - %s' % dir)
-      os.makedirs(dir)
+    # Ensure dir exists.
+    if dir:
+        if not os.path.isdir(dir):
+            _logger.info('Mkdir - %s' % dir)
+            os.makedirs(dir)
 
-  # If file exists and is unchanged, return.
-  new_contents = ''.join(lines)
-  if os.path.exists(path):
-    with open(path) as fd:
-      contents = fd.read()
-    if new_contents == contents:
-      _logger.info('Unchanged file %s' % path)
-      return
+    # If file exists and is unchanged, return.
+    new_contents = ''.join(lines)
+    if os.path.exists(path):
+        with open(path) as fd:
+            contents = fd.read()
+        if new_contents == contents:
+            _logger.info('Unchanged file %s' % path)
+            return
 
-  # Write the file.
-  num_attempts = 4
-  for i in range(num_attempts):
-    try:
-      _logger.info('Writing (attempt %d) - %s' % (i + 1, path))
-      with open(path, 'w') as fd:
-        fd.write(new_contents)
-      return
-    except IOError as error:
-      last_attempt = (i == (num_attempts - 1))
-      if not last_attempt:
-        # Sleep for 50 ms and try again
-        time.sleep(0.05)
-      else:
-        # FIXME(kustermann): Remove this later on.
-        # We try to get more debugging information to figure out why we
-        # sometimes get a "Permission denied" error when opening the file for
-        # writing. (hypothesis: Another process has already opened the file.)
-        _logger.info('Got exception (%s) ' % error)
+    # Write the file.
+    num_attempts = 4
+    for i in range(num_attempts):
+        try:
+            _logger.info('Writing (attempt %d) - %s' % (i + 1, path))
+            with open(path, 'w') as fd:
+                fd.write(new_contents)
+            return
+        except IOError as error:
+            last_attempt = (i == (num_attempts - 1))
+            if not last_attempt:
+                # Sleep for 50 ms and try again
+                time.sleep(0.05)
+            else:
+                # FIXME(kustermann): Remove this later on.
+                # We try to get more debugging information to figure out why we
+                # sometimes get a "Permission denied" error when opening the file for
+                # writing. (hypothesis: Another process has already opened the file.)
+                _logger.info('Got exception (%s) ' % error)
 
-        if sys.platform  == 'win32':
-          handle_file = r'E:\handle.exe'
-          if os.path.exists(handle_file):
-            _logger.info('Running handle.exe for debugging purposes')
-            subprocess.call([handle_file, '-a', r'E:\b\build\slave'])
-          else:
-            _logger.info("Couldn't find %s. Not printing open handles."
-                         % handle_file)
-        raise error
+                if sys.platform == 'win32':
+                    handle_file = r'E:\handle.exe'
+                    if os.path.exists(handle_file):
+                        _logger.info(
+                            'Running handle.exe for debugging purposes')
+                        subprocess.call(
+                            [handle_file, '-a', r'E:\b\build\slave'])
+                    else:
+                        _logger.info(
+                            "Couldn't find %s. Not printing open handles." %
+                            handle_file)
+                raise error
diff --git a/tools/dom/scripts/multiemitter_test.py b/tools/dom/scripts/multiemitter_test.py
index 00a28b7..0b114a5 100644
--- a/tools/dom/scripts/multiemitter_test.py
+++ b/tools/dom/scripts/multiemitter_test.py
@@ -2,7 +2,6 @@
 # Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
 # for 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 for emitter module."""
 
 import logging.config
@@ -13,35 +12,36 @@
 
 class MultiEmitterTestCase(unittest.TestCase):
 
-  def setUp(self):
-    pass
+    def setUp(self):
+        pass
 
-  def tearDown(self):
-    pass
+    def tearDown(self):
+        pass
 
-  def check(self, m, expected):
-    """Verifies that the multiemitter contains the expected contents.
+    def check(self, m, expected):
+        """Verifies that the multiemitter contains the expected contents.
 
     Expected is a list of (filename, content) pairs, sorted by filename.
     """
-    files = []
-    def _Collect(file, contents):
-      files.append((file, ''.join(contents)))
-    m.Flush(_Collect)
-    self.assertEquals(expected, files)
+        files = []
 
-  def testExample(self):
-    m = multiemitter.MultiEmitter()
-    e1 = m.FileEmitter('file1')
-    e2 = m.FileEmitter('file2', 'key2')
-    e1.Emit('Hi 1')
-    e2.Emit('Hi 2')
-    m.Find('key2').Emit('Bye 2')
-    self.check(m,
-               [('file1', 'Hi 1'),
-                ('file2', 'Hi 2Bye 2') ])
+        def _Collect(file, contents):
+            files.append((file, ''.join(contents)))
+
+        m.Flush(_Collect)
+        self.assertEquals(expected, files)
+
+    def testExample(self):
+        m = multiemitter.MultiEmitter()
+        e1 = m.FileEmitter('file1')
+        e2 = m.FileEmitter('file2', 'key2')
+        e1.Emit('Hi 1')
+        e2.Emit('Hi 2')
+        m.Find('key2').Emit('Bye 2')
+        self.check(m, [('file1', 'Hi 1'), ('file2', 'Hi 2Bye 2')])
+
 
 if __name__ == '__main__':
-  logging.config.fileConfig('logging.conf')
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig('logging.conf')
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 154fe5e..7ddfe3c 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -2,7 +2,6 @@
 # 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 module provides shared functionality for the system to generate
 Dart:html APIs from the IDL database."""
 
@@ -17,8 +16,9 @@
 
 _logger = logging.getLogger('systemhtml')
 
-HTML_LIBRARY_NAMES = ['html', 'indexed_db', 'svg',
-                      'web_audio', 'web_gl', 'web_sql']
+HTML_LIBRARY_NAMES = [
+    'html', 'indexed_db', 'svg', 'web_audio', 'web_gl', 'web_sql'
+]
 
 # The following two sets let us avoid shadowing fields with properties.
 # This information could be derived from the IDL files but would require
@@ -29,121 +29,128 @@
     'Element.isContentEditable',
     'AudioContext.createGain',
     'AudioContext.createScriptProcessor',
-    ])
-_safe_to_ignore_shadowing_members = monitored.Set('systemhtml._safe_to_ignore_shadowing_members', [
-    'SVGElement.tabIndex',
-    'SVGStyleElement.title',
+])
+_safe_to_ignore_shadowing_members = monitored.Set(
+    'systemhtml._safe_to_ignore_shadowing_members', [
+        'SVGElement.tabIndex',
+        'SVGStyleElement.title',
     ])
 
-_js_custom_members = monitored.Set('systemhtml._js_custom_members', [
-    'AudioContext.createGain',
-    'AudioContext.createScriptProcessor',
-    'CanvasRenderingContext2D.drawImage',
-    'CanvasRenderingContext2D.fillText',
-    'CanvasRenderingContext2D.lineDashOffset',
-    'CanvasRenderingContext2D.setLineDash',
-    'Console.memory',
-    'ConsoleBase.assertCondition',
-    'ConsoleBase.clear',
-    'ConsoleBase.count',
-    'ConsoleBase.debug',
-    'ConsoleBase.dir',
-    'ConsoleBase.dirxml',
-    'ConsoleBase.error',
-    'ConsoleBase.group',
-    'ConsoleBase.groupCollapsed',
-    'ConsoleBase.groupEnd',
-    'ConsoleBase.info',
-    'ConsoleBase.log',
-    'ConsoleBase.markTimeline',
-    'ConsoleBase.profile',
-    'ConsoleBase.profileEnd',
-    'ConsoleBase.table',
-    'ConsoleBase.time',
-    'ConsoleBase.timeEnd',
-    'ConsoleBase.timeStamp',
-    'ConsoleBase.trace',
-    'ConsoleBase.warn',
-    'WebKitCSSKeyframesRule.insertRule',
-    'CSSStyleDeclaration.setProperty',
-    'CSSStyleDeclaration.__propertyQuery__',
-    'Document.createNodeIterator',
-    'Document.createTreeWalker',
-    'DOMException.name',
-    'DOMException.toString',
-    # ListMixin already provides this method although the implementation
-    # is slower. As this class is obsolete anyway, we ignore the slowdown in
-    # DOMStringList performance.
-    'DOMStringList.contains',
-    'Element.animate',
-    'Element.createShadowRoot',
-    'Element.insertAdjacentElement',
-    'Element.insertAdjacentHTML',
-    'Element.insertAdjacentText',
-    'Element.remove',
-    'Element.shadowRoot',
-    'Element.matches',
-    'ElementEvents.mouseWheel',
-    'ElementEvents.transitionEnd',
-    'FileReader.result',
-    'HTMLAnchorElement.toString',
-    'HTMLAreaElement.toString',
-    'HTMLTableElement.createTBody',
-    'IDBCursor.next',
-    'IDBDatabase.transaction',
-    'IDBDatabase.transactionList',
-    'IDBDatabase.transactionStore',
-    'IDBDatabase.transactionStores',
-    'KeyboardEvent.initKeyboardEvent',
-    'Location.origin',
-    'Location.toString',
-    'MouseEvent.offsetX',
-    'MouseEvent.offsetY',
-    'Navigator.language',
-    'Navigator.webkitGetUserMedia',
-    'ScriptProcessorNode._setEventListener',
-    'URL.createObjectURL',
-    'URL.createObjectUrlFromSource',
-    'URL.createObjectUrlFromStream',
-    'URL.createObjectUrlFromBlob',
-    'URL.revokeObjectURL',
-    'URL.toString',
-    'WheelEvent.deltaMode',
-    'Window.cancelAnimationFrame',
-    'Window.console',
-    'Window.document',
-    'Window.indexedDB',
-    'Window.location',
-    'Window.open',
-    'Window.requestAnimationFrame',
-    'Window.scrollX',
-    'Window.scrollY'
-    # 'WorkerContext.indexedDB', # Workers
-    ], dart2jsOnly=True)
+_js_custom_members = monitored.Set(
+    'systemhtml._js_custom_members',
+    [
+        'AudioContext.createGain',
+        'AudioContext.createScriptProcessor',
+        'CanvasRenderingContext2D.drawImage',
+        'CanvasRenderingContext2D.fillText',
+        'CanvasRenderingContext2D.lineDashOffset',
+        'CanvasRenderingContext2D.setLineDash',
+        'Console.memory',
+        'ConsoleBase.assertCondition',
+        'ConsoleBase.clear',
+        'ConsoleBase.count',
+        'ConsoleBase.debug',
+        'ConsoleBase.dir',
+        'ConsoleBase.dirxml',
+        'ConsoleBase.error',
+        'ConsoleBase.group',
+        'ConsoleBase.groupCollapsed',
+        'ConsoleBase.groupEnd',
+        'ConsoleBase.info',
+        'ConsoleBase.log',
+        'ConsoleBase.markTimeline',
+        'ConsoleBase.profile',
+        'ConsoleBase.profileEnd',
+        'ConsoleBase.table',
+        'ConsoleBase.time',
+        'ConsoleBase.timeEnd',
+        'ConsoleBase.timeStamp',
+        'ConsoleBase.trace',
+        'ConsoleBase.warn',
+        'WebKitCSSKeyframesRule.insertRule',
+        'CSSStyleDeclaration.setProperty',
+        'CSSStyleDeclaration.__propertyQuery__',
+        'Document.createNodeIterator',
+        'Document.createTreeWalker',
+        'DOMException.name',
+        'DOMException.toString',
+        # ListMixin already provides this method although the implementation
+        # is slower. As this class is obsolete anyway, we ignore the slowdown in
+        # DOMStringList performance.
+        'DOMStringList.contains',
+        'Element.animate',
+        'Element.createShadowRoot',
+        'Element.insertAdjacentElement',
+        'Element.insertAdjacentHTML',
+        'Element.insertAdjacentText',
+        'Element.remove',
+        'Element.shadowRoot',
+        'Element.matches',
+        'ElementEvents.mouseWheel',
+        'ElementEvents.transitionEnd',
+        'FileReader.result',
+        'HTMLAnchorElement.toString',
+        'HTMLAreaElement.toString',
+        'HTMLTableElement.createTBody',
+        'IDBCursor.next',
+        'IDBDatabase.transaction',
+        'IDBDatabase.transactionList',
+        'IDBDatabase.transactionStore',
+        'IDBDatabase.transactionStores',
+        'KeyboardEvent.initKeyboardEvent',
+        'Location.origin',
+        'Location.toString',
+        'MouseEvent.offsetX',
+        'MouseEvent.offsetY',
+        'Navigator.language',
+        'Navigator.webkitGetUserMedia',
+        'ScriptProcessorNode._setEventListener',
+        'URL.createObjectURL',
+        'URL.createObjectUrlFromSource',
+        'URL.createObjectUrlFromStream',
+        'URL.createObjectUrlFromBlob',
+        'URL.revokeObjectURL',
+        'URL.toString',
+        'WheelEvent.deltaMode',
+        'Window.cancelAnimationFrame',
+        'Window.console',
+        'Window.document',
+        'Window.indexedDB',
+        'Window.location',
+        'Window.open',
+        'Window.requestAnimationFrame',
+        'Window.scrollX',
+        'Window.scrollY'
+        # 'WorkerContext.indexedDB', # Workers
+    ],
+    dart2jsOnly=True)
 
-_js_custom_constructors = monitored.Set('systemhtml._js_custom_constructors', [
-    'AudioContext',
-    'Blob',
-    'Comment',
-    'MutationObserver',
-    'PaymentRequest',
-    'RTCIceCandidate',
-    'RTCPeerConnection',
-    'RTCSessionDescription',
-    'SpeechRecognition',
-    ], dart2jsOnly=True)
+_js_custom_constructors = monitored.Set(
+    'systemhtml._js_custom_constructors', [
+        'AudioContext',
+        'Blob',
+        'Comment',
+        'MutationObserver',
+        'PaymentRequest',
+        'RTCIceCandidate',
+        'RTCPeerConnection',
+        'RTCSessionDescription',
+        'SpeechRecognition',
+    ],
+    dart2jsOnly=True)
 
 # Classes that offer only static methods, and therefore we should suppress
 # constructor creation.
 _static_classes = set(['Url'])
 
 # Callback typedefs with generic List (List<nnn>) convert to List
-_callback_list_generics_mapping = monitored.Set('systemhtml._callback_list_generics_mapping', [
-    'List<Entry>',
-    'List<IntersectionObserverEntry>',
-    'List<MutationRecord>',
-    'List<_Report>',
-])
+_callback_list_generics_mapping = monitored.Set(
+    'systemhtml._callback_list_generics_mapping', [
+        'List<Entry>',
+        'List<IntersectionObserverEntry>',
+        'List<MutationRecord>',
+        'List<_Report>',
+    ])
 
 
 # Information for generating element constructors.
@@ -154,332 +161,419 @@
 #   var c = new CanvasElement()..width = 100..height = 70;
 #
 class ElementConstructorInfo(object):
-  def __init__(self, name=None, tag=None,
-               params=[], opt_params=[],
-               factory_provider_name='document'):
-    self.name = name          # The constructor name 'h1' in 'HeadingElement.h1'
-    self.tag = tag or name    # The HTML or SVG tag
-    self.params = params
-    self.opt_params = opt_params
-    self.factory_provider_name = factory_provider_name
 
-  def ConstructorInfo(self, interface_name):
-    info = OperationInfo()
-    info.overloads = None
-    info.declared_name = interface_name
-    info.name = interface_name
-    info.constructor_name = self.name
-    info.js_name = None
-    info.type_name = interface_name
-    info.param_infos = map(lambda tXn: ParamInfo(tXn[1], tXn[0], True),
-                           self.opt_params)
-    info.requires_named_arguments = True
-    info.factory_parameters = ['"%s"' % self.tag]
-    info.pure_dart_constructor = True
-    return info
+    def __init__(self,
+                 name=None,
+                 tag=None,
+                 params=[],
+                 opt_params=[],
+                 factory_provider_name='document'):
+        self.name = name  # The constructor name 'h1' in 'HeadingElement.h1'
+        self.tag = tag or name  # The HTML or SVG tag
+        self.params = params
+        self.opt_params = opt_params
+        self.factory_provider_name = factory_provider_name
+
+    def ConstructorInfo(self, interface_name):
+        info = OperationInfo()
+        info.overloads = None
+        info.declared_name = interface_name
+        info.name = interface_name
+        info.constructor_name = self.name
+        info.js_name = None
+        info.type_name = interface_name
+        info.param_infos = map(lambda tXn: ParamInfo(tXn[1], tXn[0], True),
+                               self.opt_params)
+        info.requires_named_arguments = True
+        info.factory_parameters = ['"%s"' % self.tag]
+        info.pure_dart_constructor = True
+        return info
+
 
 _html_element_constructors = monitored.Dict(
-      'systemhtml._html_element_constructors', {
-  'HTMLAnchorElement' :
-    ElementConstructorInfo(tag='a', opt_params=[('DOMString', 'href')]),
-  'HTMLAreaElement': 'area',
-  'HTMLButtonElement': 'button',
-  'HTMLBRElement': 'br',
-  'HTMLBaseElement': 'base',
-  'HTMLBodyElement': 'body',
-  'HTMLButtonElement': 'button',
-  'HTMLCanvasElement':
-    ElementConstructorInfo(tag='canvas',
-                           opt_params=[('int', 'width'), ('int', 'height')]),
-  'HTMLContentElement': 'content',
-  'HTMLDataListElement': 'datalist',
-  'HTMLDListElement': 'dl',
-  'HTMLDetailsElement': 'details',
-  'HTMLDivElement': 'div',
-  'HTMLEmbedElement': 'embed',
-  'HTMLFieldSetElement': 'fieldset',
-  'HTMLFormElement': 'form',
-  'HTMLHRElement': 'hr',
-  'HTMLHeadElement': 'head',
-  'HTMLHeadingElement': [ElementConstructorInfo('h1'),
-                     ElementConstructorInfo('h2'),
-                     ElementConstructorInfo('h3'),
-                     ElementConstructorInfo('h4'),
-                     ElementConstructorInfo('h5'),
-                     ElementConstructorInfo('h6')],
-  'HTMLHtmlElement': 'html',
-  'HTMLIFrameElement': 'iframe',
-  'HTMLImageElement':
-    ElementConstructorInfo(tag='img',
-                           opt_params=[('DOMString', 'src'),
-                                       ('int', 'width'), ('int', 'height')]),
-  'HTMLKeygenElement': 'keygen',
-  'HTMLLIElement': 'li',
-  'HTMLLabelElement': 'label',
-  'HTMLLegendElement': 'legend',
-  'HTMLLinkElement': 'link',
-  'HTMLMapElement': 'map',
-  'HTMLMenuElement': 'menu',
-  'HTMLMetaElement': 'meta',
-  'HTMLMeterElement': 'meter',
-  'HTMLOListElement': 'ol',
-  'HTMLObjectElement': 'object',
-  'HTMLOptGroupElement': 'optgroup',
-  'HTMLOutputElement': 'output',
-  'HTMLParagraphElement': 'p',
-  'HTMLParamElement': 'param',
-  'HTMLPreElement': 'pre',
-  'HTMLProgressElement': 'progress',
-  'HTMLQuoteElement': 'q',
-  'HTMLScriptElement': 'script',
-  'HTMLSelectElement': 'select',
-  'HTMLShadowElement': 'shadow',
-  'HTMLSourceElement': 'source',
-  'HTMLSpanElement': 'span',
-  'HTMLStyleElement': 'style',
-  'HTMLTableCaptionElement': 'caption',
-  'HTMLTableCellElement': 'td',
-  'HTMLTableColElement': 'col',
-  'HTMLTableElement': 'table',
-  'HTMLTableRowElement': 'tr',
-  #'HTMLTableSectionElement'  <thead> <tbody> <tfoot>
-  'HTMLTemplateElement': 'template',
-  'HTMLTextAreaElement': 'textarea',
-  'HTMLTitleElement': 'title',
-  'HTMLTrackElement': 'track',
-  'HTMLUListElement': 'ul',
-  'HTMLVideoElement': 'video'
-})
+    'systemhtml._html_element_constructors',
+    {
+        'HTMLAnchorElement':
+        ElementConstructorInfo(tag='a', opt_params=[('DOMString', 'href')]),
+        'HTMLAreaElement':
+        'area',
+        'HTMLButtonElement':
+        'button',
+        'HTMLBRElement':
+        'br',
+        'HTMLBaseElement':
+        'base',
+        'HTMLBodyElement':
+        'body',
+        'HTMLButtonElement':
+        'button',
+        'HTMLCanvasElement':
+        ElementConstructorInfo(
+            tag='canvas', opt_params=[('int', 'width'), ('int', 'height')]),
+        'HTMLContentElement':
+        'content',
+        'HTMLDataListElement':
+        'datalist',
+        'HTMLDListElement':
+        'dl',
+        'HTMLDetailsElement':
+        'details',
+        'HTMLDivElement':
+        'div',
+        'HTMLEmbedElement':
+        'embed',
+        'HTMLFieldSetElement':
+        'fieldset',
+        'HTMLFormElement':
+        'form',
+        'HTMLHRElement':
+        'hr',
+        'HTMLHeadElement':
+        'head',
+        'HTMLHeadingElement': [
+            ElementConstructorInfo('h1'),
+            ElementConstructorInfo('h2'),
+            ElementConstructorInfo('h3'),
+            ElementConstructorInfo('h4'),
+            ElementConstructorInfo('h5'),
+            ElementConstructorInfo('h6')
+        ],
+        'HTMLHtmlElement':
+        'html',
+        'HTMLIFrameElement':
+        'iframe',
+        'HTMLImageElement':
+        ElementConstructorInfo(
+            tag='img',
+            opt_params=[('DOMString', 'src'), ('int', 'width'),
+                        ('int', 'height')]),
+        'HTMLKeygenElement':
+        'keygen',
+        'HTMLLIElement':
+        'li',
+        'HTMLLabelElement':
+        'label',
+        'HTMLLegendElement':
+        'legend',
+        'HTMLLinkElement':
+        'link',
+        'HTMLMapElement':
+        'map',
+        'HTMLMenuElement':
+        'menu',
+        'HTMLMetaElement':
+        'meta',
+        'HTMLMeterElement':
+        'meter',
+        'HTMLOListElement':
+        'ol',
+        'HTMLObjectElement':
+        'object',
+        'HTMLOptGroupElement':
+        'optgroup',
+        'HTMLOutputElement':
+        'output',
+        'HTMLParagraphElement':
+        'p',
+        'HTMLParamElement':
+        'param',
+        'HTMLPreElement':
+        'pre',
+        'HTMLProgressElement':
+        'progress',
+        'HTMLQuoteElement':
+        'q',
+        'HTMLScriptElement':
+        'script',
+        'HTMLSelectElement':
+        'select',
+        'HTMLShadowElement':
+        'shadow',
+        'HTMLSourceElement':
+        'source',
+        'HTMLSpanElement':
+        'span',
+        'HTMLStyleElement':
+        'style',
+        'HTMLTableCaptionElement':
+        'caption',
+        'HTMLTableCellElement':
+        'td',
+        'HTMLTableColElement':
+        'col',
+        'HTMLTableElement':
+        'table',
+        'HTMLTableRowElement':
+        'tr',
+        #'HTMLTableSectionElement'  <thead> <tbody> <tfoot>
+        'HTMLTemplateElement':
+        'template',
+        'HTMLTextAreaElement':
+        'textarea',
+        'HTMLTitleElement':
+        'title',
+        'HTMLTrackElement':
+        'track',
+        'HTMLUListElement':
+        'ul',
+        'HTMLVideoElement':
+        'video'
+    })
 
 _svg_element_constructors = monitored.Dict(
-      'systemhtml._svg_element_constructors', {
-  'SVGAElement': 'a',
-  'SVGAltGlyphElement': 'altGlyph',
-  'SVGAnimateElement': 'animate',
-  'SVGAnimateMotionElement': 'animateMotion',
-  'SVGAnimateTransformElement': 'animateTransform',
-  'SVGAnimationElement': 'animation',
-  'SVGCircleElement': 'circle',
-  'SVGClipPathElement': 'clipPath',
-  'SVGCursorElement': 'cursor',
-  'SVGDefsElement': 'defs',
-  'SVGDescElement': 'desc',
-  'SVGEllipseElement': 'ellipse',
-  'SVGFEBlendElement': 'feBlend',
-  'SVGFEColorMatrixElement': 'feColorMatrix',
-  'SVGFEComponentTransferElement': 'feComponentTransfer',
-  'SVGFEConvolveMatrixElement': 'feConvolveMatrix',
-  'SVGFEDiffuseLightingElement': 'feDiffuseLighting',
-  'SVGFEDisplacementMapElement': 'feDisplacementMap',
-  'SVGFEDistantLightElement': 'feDistantLight',
-  'SVGFEFloodElement': 'feFlood',
-  'SVGFEFuncAElement': 'feFuncA',
-  'SVGFEFuncBElement': 'feFuncB',
-  'SVGFEFuncGElement': 'feFuncG',
-  'SVGFEFuncRElement': 'feFuncR',
-  'SVGFEGaussianBlurElement': 'feGaussianBlur',
-  'SVGFEImageElement': 'feImage',
-  'SVGFEMergeElement': 'feMerge',
-  'SVGFEMergeNodeElement': 'feMergeNode',
-  'SVGFEMorphology': 'feMorphology',
-  'SVGFEOffsetElement': 'feOffset',
-  'SVGFEPointLightElement': 'fePointLight',
-  'SVGFESpecularLightingElement': 'feSpecularLighting',
-  'SVGFESpotLightElement': 'feSpotLight',
-  'SVGFETileElement': 'feTile',
-  'SVGFETurbulenceElement': 'feTurbulence',
-  'SVGFilterElement': 'filter',
-  'SVGForeignObjectElement': 'foreignObject',
-  'SVGGlyphElement': 'glyph',
-  'SVGGElement': 'g',
-  'SVGHKernElement': 'hkern',
-  'SVGImageElement': 'image',
-  'SVGLinearGradientElement': 'linearGradient',
-  'SVGLineElement': 'line',
-  'SVGMarkerElement': 'marker',
-  'SVGMaskElement': 'mask',
-  'SVGMPathElement': 'mpath',
-  'SVGPathElement': 'path',
-  'SVGPatternElement': 'pattern',
-  'SVGPolygonElement': 'polygon',
-  'SVGPolylineElement': 'polyline',
-  'SVGRadialGradientElement': 'radialGradient',
-  'SVGRectElement': 'rect',
-  'SVGScriptElement': 'script',
-  'SVGSetElement': 'set',
-  'SVGStopElement': 'stop',
-  'SVGStyleElement': 'style',
-  'SVGSwitchElement': 'switch',
-  'SVGSymbolElement': 'symbol',
-  'SVGTextElement': 'text',
-  'SVGTitleElement': 'title',
-  'SVGTRefElement': 'tref',
-  'SVGTSpanElement': 'tspan',
-  'SVGUseElement': 'use',
-  'SVGViewElement': 'view',
-  'SVGVKernElement': 'vkern',
-})
+    'systemhtml._svg_element_constructors', {
+        'SVGAElement': 'a',
+        'SVGAltGlyphElement': 'altGlyph',
+        'SVGAnimateElement': 'animate',
+        'SVGAnimateMotionElement': 'animateMotion',
+        'SVGAnimateTransformElement': 'animateTransform',
+        'SVGAnimationElement': 'animation',
+        'SVGCircleElement': 'circle',
+        'SVGClipPathElement': 'clipPath',
+        'SVGCursorElement': 'cursor',
+        'SVGDefsElement': 'defs',
+        'SVGDescElement': 'desc',
+        'SVGEllipseElement': 'ellipse',
+        'SVGFEBlendElement': 'feBlend',
+        'SVGFEColorMatrixElement': 'feColorMatrix',
+        'SVGFEComponentTransferElement': 'feComponentTransfer',
+        'SVGFEConvolveMatrixElement': 'feConvolveMatrix',
+        'SVGFEDiffuseLightingElement': 'feDiffuseLighting',
+        'SVGFEDisplacementMapElement': 'feDisplacementMap',
+        'SVGFEDistantLightElement': 'feDistantLight',
+        'SVGFEFloodElement': 'feFlood',
+        'SVGFEFuncAElement': 'feFuncA',
+        'SVGFEFuncBElement': 'feFuncB',
+        'SVGFEFuncGElement': 'feFuncG',
+        'SVGFEFuncRElement': 'feFuncR',
+        'SVGFEGaussianBlurElement': 'feGaussianBlur',
+        'SVGFEImageElement': 'feImage',
+        'SVGFEMergeElement': 'feMerge',
+        'SVGFEMergeNodeElement': 'feMergeNode',
+        'SVGFEMorphology': 'feMorphology',
+        'SVGFEOffsetElement': 'feOffset',
+        'SVGFEPointLightElement': 'fePointLight',
+        'SVGFESpecularLightingElement': 'feSpecularLighting',
+        'SVGFESpotLightElement': 'feSpotLight',
+        'SVGFETileElement': 'feTile',
+        'SVGFETurbulenceElement': 'feTurbulence',
+        'SVGFilterElement': 'filter',
+        'SVGForeignObjectElement': 'foreignObject',
+        'SVGGlyphElement': 'glyph',
+        'SVGGElement': 'g',
+        'SVGHKernElement': 'hkern',
+        'SVGImageElement': 'image',
+        'SVGLinearGradientElement': 'linearGradient',
+        'SVGLineElement': 'line',
+        'SVGMarkerElement': 'marker',
+        'SVGMaskElement': 'mask',
+        'SVGMPathElement': 'mpath',
+        'SVGPathElement': 'path',
+        'SVGPatternElement': 'pattern',
+        'SVGPolygonElement': 'polygon',
+        'SVGPolylineElement': 'polyline',
+        'SVGRadialGradientElement': 'radialGradient',
+        'SVGRectElement': 'rect',
+        'SVGScriptElement': 'script',
+        'SVGSetElement': 'set',
+        'SVGStopElement': 'stop',
+        'SVGStyleElement': 'style',
+        'SVGSwitchElement': 'switch',
+        'SVGSymbolElement': 'symbol',
+        'SVGTextElement': 'text',
+        'SVGTitleElement': 'title',
+        'SVGTRefElement': 'tref',
+        'SVGTSpanElement': 'tspan',
+        'SVGUseElement': 'use',
+        'SVGViewElement': 'view',
+        'SVGVKernElement': 'vkern',
+    })
 
 _element_constructors = {
-  'html': _html_element_constructors,
-  'indexed_db': {},
-  'svg': _svg_element_constructors,
-  'typed_data': {},
-  'web_audio': {},
-  'web_gl': {},
-  'web_sql': {},
+    'html': _html_element_constructors,
+    'indexed_db': {},
+    'svg': _svg_element_constructors,
+    'typed_data': {},
+    'web_audio': {},
+    'web_gl': {},
+    'web_sql': {},
 }
 
 _factory_ctr_strings = {
-  'html': {
-      'provider_name': 'document',
-      'constructor_name': 'createElement'
-  },
-  'indexed_db': {
-      'provider_name': 'document',
-      'constructor_name': 'createElement'
-  },
-  'svg': {
-    'provider_name': '_SvgElementFactoryProvider',
-    'constructor_name': 'createSvgElement_tag',
-  },
-  'typed_data': {
-      'provider_name': 'document',
-      'constructor_name': 'createElement'
-  },
-  'web_audio': {
-    'provider_name': 'document',
-    'constructor_name': 'createElement'
-  },
-  'web_gl': {
-    'provider_name': 'document',
-    'constructor_name': 'createElement'
-  },
-  'web_sql': {
-    'provider_name': 'document',
-    'constructor_name': 'createElement'
-  },
+    'html': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
+    'indexed_db': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
+    'svg': {
+        'provider_name': '_SvgElementFactoryProvider',
+        'constructor_name': 'createSvgElement_tag',
+    },
+    'typed_data': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
+    'web_audio': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
+    'web_gl': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
+    'web_sql': {
+        'provider_name': 'document',
+        'constructor_name': 'createElement'
+    },
 }
 
-def ElementConstructorInfos(typename, element_constructors,
+
+def ElementConstructorInfos(typename,
+                            element_constructors,
                             factory_provider_name='_Elements'):
-  """Returns list of ElementConstructorInfos about the convenience constructors
+    """Returns list of ElementConstructorInfos about the convenience constructors
   for an Element or SvgElement."""
-  # TODO(sra): Handle multiple and named constructors.
-  if typename not in element_constructors:
-    return []
-  infos = element_constructors[typename]
-  if isinstance(infos, str):
-    infos = ElementConstructorInfo(tag=infos,
-        factory_provider_name=factory_provider_name)
-  if not isinstance(infos, list):
-    infos = [infos]
-  return infos
+    # TODO(sra): Handle multiple and named constructors.
+    if typename not in element_constructors:
+        return []
+    infos = element_constructors[typename]
+    if isinstance(infos, str):
+        infos = ElementConstructorInfo(
+            tag=infos, factory_provider_name=factory_provider_name)
+    if not isinstance(infos, list):
+        infos = [infos]
+    return infos
+
 
 # ------------------------------------------------------------------------------
 def SvgSupportStr(tagName):
-  return 'Svg%s' % ElemSupportStr(tagName)
+    return 'Svg%s' % ElemSupportStr(tagName)
+
 
 def ElemSupportStr(tagName):
-  return "Element.isTagSupported('%s')" % tagName
+    return "Element.isTagSupported('%s')" % tagName
+
 
 _js_support_checks_basic_element_with_constructors = [
-  'HTMLContentElement',
-  'HTMLDataListElement',
-  'HTMLDetailsElement',
-  'HTMLEmbedElement',
-  'HTMLMeterElement',
-  'HTMLObjectElement',
-  'HTMLOutputElement',
-  'HTMLProgressElement',
-  'HTMLTemplateElement',
-  'HTMLTrackElement',
+    'HTMLContentElement',
+    'HTMLDataListElement',
+    'HTMLDetailsElement',
+    'HTMLEmbedElement',
+    'HTMLMeterElement',
+    'HTMLObjectElement',
+    'HTMLOutputElement',
+    'HTMLProgressElement',
+    'HTMLTemplateElement',
+    'HTMLTrackElement',
 ]
 
 _js_support_checks_additional_element = [
-  # IE creates keygen as Block elements
-  'HTMLKeygenElement',
-  'SVGAltGlyphElement',
-  'SVGAnimateElement',
-  'SVGAnimateMotionElement',
-  'SVGAnimateTransformElement',
-  'SVGCursorElement',
-  'SVGFEBlendElement',
-  'SVGFEColorMatrixElement',
-  'SVGFEComponentTransferElement',
-  'SVGFEConvolveMatrixElement',
-  'SVGFEDiffuseLightingElement',
-  'SVGFEDisplacementMapElement',
-  'SVGFEDistantLightElement',
-  'SVGFEFloodElement',
-  'SVGFEFuncAElement',
-  'SVGFEFuncBElement',
-  'SVGFEFuncGElement',
-  'SVGFEFuncRElement',
-  'SVGFEGaussianBlurElement',
-  'SVGFEImageElement',
-  'SVGFEMergeElement',
-  'SVGFEMergeNodeElement',
-  'SVGFEMorphology',
-  'SVGFEOffsetElement',
-  'SVGFEPointLightElement',
-  'SVGFESpecularLightingElement',
-  'SVGFESpotLightElement',
-  'SVGFETileElement',
-  'SVGFETurbulenceElement',
-  'SVGFilterElement',
-  'SVGForeignObjectElement',
-  'SVGSetElement',
+    # IE creates keygen as Block elements
+    'HTMLKeygenElement',
+    'SVGAltGlyphElement',
+    'SVGAnimateElement',
+    'SVGAnimateMotionElement',
+    'SVGAnimateTransformElement',
+    'SVGCursorElement',
+    'SVGFEBlendElement',
+    'SVGFEColorMatrixElement',
+    'SVGFEComponentTransferElement',
+    'SVGFEConvolveMatrixElement',
+    'SVGFEDiffuseLightingElement',
+    'SVGFEDisplacementMapElement',
+    'SVGFEDistantLightElement',
+    'SVGFEFloodElement',
+    'SVGFEFuncAElement',
+    'SVGFEFuncBElement',
+    'SVGFEFuncGElement',
+    'SVGFEFuncRElement',
+    'SVGFEGaussianBlurElement',
+    'SVGFEImageElement',
+    'SVGFEMergeElement',
+    'SVGFEMergeNodeElement',
+    'SVGFEMorphology',
+    'SVGFEOffsetElement',
+    'SVGFEPointLightElement',
+    'SVGFESpecularLightingElement',
+    'SVGFESpotLightElement',
+    'SVGFETileElement',
+    'SVGFETurbulenceElement',
+    'SVGFilterElement',
+    'SVGForeignObjectElement',
+    'SVGSetElement',
 ]
 
 js_support_checks = dict({
-    'Animation': "JS('bool', '!!(document.body.animate)')",
-    'AudioContext': "JS('bool', '!!(window.AudioContext ||"
-        " window.webkitAudioContext)')",
+    'Animation':
+    "JS('bool', '!!(document.body.animate)')",
+    'AudioContext':
+    "JS('bool', '!!(window.AudioContext ||"
+    " window.webkitAudioContext)')",
     'Crypto':
-        "JS('bool', '!!(window.crypto && window.crypto.getRandomValues)')",
-    'Database': "JS('bool', '!!(window.openDatabase)')",
-    'DOMPoint': "JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)')",
-    'ApplicationCache': "JS('bool', '!!(window.applicationCache)')",
-    'DOMFileSystem': "JS('bool', '!!(window.webkitRequestFileSystem)')",
-    'FormData': "JS('bool', '!!(window.FormData)')",
-    'HashChangeEvent': "Device.isEventTypeSupported('HashChangeEvent')",
-    'HTMLShadowElement': ElemSupportStr('shadow'),
-    'HTMLTemplateElement': ElemSupportStr('template'),
-    'MediaStreamEvent': "Device.isEventTypeSupported('MediaStreamEvent')",
-    'MediaStreamTrackEvent': "Device.isEventTypeSupported('MediaStreamTrackEvent')",
-    'MediaSource': "JS('bool', '!!(window.MediaSource)')",
-    'Notification': "JS('bool', '!!(window.Notification)')",
-    'Performance': "JS('bool', '!!(window.performance)')",
-    'SpeechRecognition': "JS('bool', '!!(window.SpeechRecognition || "
-        "window.webkitSpeechRecognition)')",
-    'SVGExternalResourcesRequired': ('supported(SvgElement element)',
-        "JS('bool', '#.externalResourcesRequired !== undefined && "
-        "#.externalResourcesRequired.animVal !== undefined', "
-        "element, element)"),
-    'SVGLangSpace': ('supported(SvgElement element)',
-        "JS('bool', '#.xmlspace !== undefined && #.xmllang !== undefined', "
-        "element, element)"),
-    'TouchList': "JS('bool', '!!document.createTouchList')",
-    'WebGLRenderingContext': "JS('bool', '!!(window.WebGLRenderingContext)')",
-    'WebSocket': "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
-    'Worker': "JS('bool', '(typeof window.Worker != \"undefined\")')",
-    'XSLTProcessor': "JS('bool', '!!(window.XSLTProcessor)')",
-  }.items() +
-  dict((key,
-        SvgSupportStr(_svg_element_constructors[key]) if key.startswith('SVG')
-            else ElemSupportStr(_html_element_constructors[key])) for key in
-    _js_support_checks_basic_element_with_constructors +
+    "JS('bool', '!!(window.crypto && window.crypto.getRandomValues)')",
+    'Database':
+    "JS('bool', '!!(window.openDatabase)')",
+    'DOMPoint':
+    "JS('bool', '!!(window.DOMPoint) || !!(window.WebKitPoint)')",
+    'ApplicationCache':
+    "JS('bool', '!!(window.applicationCache)')",
+    'DOMFileSystem':
+    "JS('bool', '!!(window.webkitRequestFileSystem)')",
+    'FormData':
+    "JS('bool', '!!(window.FormData)')",
+    'HashChangeEvent':
+    "Device.isEventTypeSupported('HashChangeEvent')",
+    'HTMLShadowElement':
+    ElemSupportStr('shadow'),
+    'HTMLTemplateElement':
+    ElemSupportStr('template'),
+    'MediaStreamEvent':
+    "Device.isEventTypeSupported('MediaStreamEvent')",
+    'MediaStreamTrackEvent':
+    "Device.isEventTypeSupported('MediaStreamTrackEvent')",
+    'MediaSource':
+    "JS('bool', '!!(window.MediaSource)')",
+    'Notification':
+    "JS('bool', '!!(window.Notification)')",
+    'Performance':
+    "JS('bool', '!!(window.performance)')",
+    'SpeechRecognition':
+    "JS('bool', '!!(window.SpeechRecognition || "
+    "window.webkitSpeechRecognition)')",
+    'SVGExternalResourcesRequired':
+    ('supported(SvgElement element)',
+     "JS('bool', '#.externalResourcesRequired !== undefined && "
+     "#.externalResourcesRequired.animVal !== undefined', "
+     "element, element)"),
+    'SVGLangSpace':
+    ('supported(SvgElement element)',
+     "JS('bool', '#.xmlspace !== undefined && #.xmllang !== undefined', "
+     "element, element)"),
+    'TouchList':
+    "JS('bool', '!!document.createTouchList')",
+    'WebGLRenderingContext':
+    "JS('bool', '!!(window.WebGLRenderingContext)')",
+    'WebSocket':
+    "JS('bool', 'typeof window.WebSocket != \"undefined\"')",
+    'Worker':
+    "JS('bool', '(typeof window.Worker != \"undefined\")')",
+    'XSLTProcessor':
+    "JS('bool', '!!(window.XSLTProcessor)')",
+}.items() + dict(
+    (key, SvgSupportStr(_svg_element_constructors[key]) if key.
+     startswith('SVG') else ElemSupportStr(_html_element_constructors[key]))
+    for key in _js_support_checks_basic_element_with_constructors +
     _js_support_checks_additional_element).items())
 
-
 # JavaScript element class names of elements for which createElement does not
 # always return exactly the right element, either because it might not be
 # supported, or some browser does something weird.
 _js_unreliable_element_factories = set(
     _js_support_checks_basic_element_with_constructors +
-    _js_support_checks_additional_element +
-    [
+    _js_support_checks_additional_element + [
         'HTMLEmbedElement',
         'HTMLObjectElement',
         'HTMLShadowElement',
@@ -488,175 +582,181 @@
 
 # ------------------------------------------------------------------------------
 
+
 class HtmlDartInterfaceGenerator(object):
-  """Generates dart interface and implementation for the DOM IDL interface."""
+    """Generates dart interface and implementation for the DOM IDL interface."""
 
-  def __init__(self, options, library_emitter, event_generator, interface,
-               backend):
-    self._renamer = options.renamer
-    self._database = options.database
-    self._template_loader = options.templates
-    self._type_registry = options.type_registry
-    self._options = options
-    self._library_emitter = library_emitter
-    self._event_generator = event_generator
-    self._interface = interface
-    self._backend = backend
-    self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
-    self._library_name = self._renamer.GetLibraryName(self._interface)
-    self._metadata = options.metadata
+    def __init__(self, options, library_emitter, event_generator, interface,
+                 backend):
+        self._renamer = options.renamer
+        self._database = options.database
+        self._template_loader = options.templates
+        self._type_registry = options.type_registry
+        self._options = options
+        self._library_emitter = library_emitter
+        self._event_generator = event_generator
+        self._interface = interface
+        self._backend = backend
+        self._interface_type_info = self._type_registry.TypeInfo(
+            self._interface.id)
+        self._library_name = self._renamer.GetLibraryName(self._interface)
+        self._metadata = options.metadata
 
-  def Generate(self):
-    if IsCustomType(self._interface.id):
-      pass
-    elif 'Callback' in self._interface.ext_attrs:
-      if len(GetCallbackHandlers(self._interface)) > 0:
-        self.GenerateCallback()
-      elif generateCallbackInterface(self._interface.id):
-        self.GenerateInterface()
-      else:
-        return
-    else:
-      self.GenerateInterface()
-
-  def GenerateCallback(self):
-    """Generates a typedef for the callback interface."""
-    typedef_name = self._renamer.RenameInterface(self._interface)
-    if not typedef_name:
-      return
-
-    info = GetCallbackInfo(self._interface)
-    code = self._library_emitter.FileEmitter(self._interface.id,
-        self._library_name)
-    code.Emit(self._template_loader.Load('callback.darttemplate'))
-
-    annotations = self._metadata.GetFormattedMetadata(self._library_name,
-        self._interface)
-
-    params = info.ParametersAsDeclaration(self._DartType);
-
-    types = params.split()
-    if len(types) > 0:
-      mapType = types[0] in _callback_list_generics_mapping
-      if mapType is True:
-        types[0] = 'List'
-        params = " ".join(types)
-
-    code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n',
-              ANNOTATIONS=annotations,
-              NAME=typedef_name,
-              PARAMS=params)
-    self._backend.GenerateCallback(info)
-
-  def GenerateInterface(self):
-    interface_name = self._interface_type_info.interface_name()
-
-    implementation_name = self._interface_type_info.implementation_name()
-    self._library_emitter.AddTypeEntry(self._library_name,
-                                       self._interface.id, implementation_name)
-
-    factory_provider = None
-    if interface_name in interface_factories:
-      factory_provider = interface_factories[interface_name]
-    factory_constructor_name = None
-
-    constructors = []
-    if interface_name in _static_classes:
-      constructor_info = None
-    else:
-      constructor_info = AnalyzeConstructor(self._interface)
-    if constructor_info:
-      constructors.append(constructor_info)
-      # TODO(antonm): consider removing it later.
-      factory_provider = interface_name
-
-    # HTML Elements and SVG Elements have convenience constructors.
-    infos = ElementConstructorInfos(self._interface.id,
-        _element_constructors[self._library_name], factory_provider_name=
-        _factory_ctr_strings[self._library_name]['provider_name'])
-
-    if infos:
-      factory_constructor_name = _factory_ctr_strings[
-          self._library_name]['constructor_name']
-
-    for info in infos:
-      constructors.append(info.ConstructorInfo(self._interface.id))
-      if factory_provider and factory_provider != info.factory_provider_name:
-        _logger.warn('Conflicting factory provider names: %s != %s' %
-          (factory_provider, info.factory_provider_name))
-      factory_provider = info.factory_provider_name
-
-    implementation_emitter = self._ImplementationEmitter()
-
-    base_type_info = None
-    if self._interface.parents:
-      supertype = self._interface.parents[0].type.id
-      if not IsDartCollectionType(supertype) and not IsPureInterface(supertype, self._database):
-        base_type_info = self._type_registry.TypeInfo(supertype)
-
-    if base_type_info:
-      base_class = base_type_info.implementation_name()
-    else:
-      base_class = self._backend.RootClassName()
-
-    implements = self._backend.AdditionalImplementedInterfaces()
-    for parent in self._interface.parents:
-      parent_type_info = self._type_registry.TypeInfo(parent.type.id)
-      if parent_type_info.interface_name() != base_class and \
-          parent_type_info != base_type_info:
-        implements.append(parent_type_info.interface_name())
-
-    secure_base_name = self._backend.SecureBaseName(interface_name)
-    if secure_base_name:
-      implements.append(secure_base_name)
-
-    implements_str = ''
-    if implements:
-      implements_str = ' implements ' + ', '.join(set(implements))
-
-    mixins = self._backend.Mixins()
-
-    mixins_str = ''
-    if mixins:
-      mixins_str = ' with ' + ', '.join(mixins)
-      if not base_class:
-        base_class = 'Interceptor'
-      elif (base_class == 'NativeFieldWrapperClass2' and
-            self._options.dart_js_interop and
-            not(isinstance(self._backend, Dart2JSBackend))):
-        base_class = 'DartHtmlDomObject'
-
-    annotations = self._metadata.GetFormattedMetadata(
-        self._library_name, self._interface, None, '')
-
-    class_modifiers = ''
-    if (self._renamer.ShouldSuppressInterface(self._interface) or
-      IsPureInterface(self._interface.id, self._database)):
-      # XMLHttpRequestProgressEvent can't be abstract we need to instantiate
-      # for JsInterop.
-      if (not(isinstance(self._backend, Dart2JSBackend)) and
-        (self._interface.id == 'XMLHttpRequestProgressEvent' or
-         self._interface.id == 'DOMStringMap')):
-        # Suppress abstract for XMLHttpRequestProgressEvent and DOMStringMap
-        # for Dartium.  Need to be able to instantiate the class; can't be abstract.
-        class_modifiers = ''
-      else:
-        # For Dartium w/ JsInterop these suppressed interfaces are needed to
-        # instanciate the internal classes.
-        if (self._renamer.ShouldSuppressInterface(self._interface) and
-            not(isinstance(self._backend, Dart2JSBackend)) and
-            self._options.dart_js_interop):
-          class_modifiers = ''
+    def Generate(self):
+        if IsCustomType(self._interface.id):
+            pass
+        elif 'Callback' in self._interface.ext_attrs:
+            if len(GetCallbackHandlers(self._interface)) > 0:
+                self.GenerateCallback()
+            elif generateCallbackInterface(self._interface.id):
+                self.GenerateInterface()
+            else:
+                return
         else:
-          class_modifiers = 'abstract '
+            self.GenerateInterface()
 
-    native_spec = ''
-    if not IsPureInterface(self._interface.id, self._database):
-      native_spec = self._backend.NativeSpec()
+    def GenerateCallback(self):
+        """Generates a typedef for the callback interface."""
+        typedef_name = self._renamer.RenameInterface(self._interface)
+        if not typedef_name:
+            return
 
-    class_name = self._interface_type_info.implementation_name()
+        info = GetCallbackInfo(self._interface)
+        code = self._library_emitter.FileEmitter(self._interface.id,
+                                                 self._library_name)
+        code.Emit(self._template_loader.Load('callback.darttemplate'))
 
-    js_interop_wrapper = '''
+        annotations = self._metadata.GetFormattedMetadata(
+            self._library_name, self._interface)
+
+        params = info.ParametersAsDeclaration(self._DartType)
+
+        types = params.split()
+        if len(types) > 0:
+            mapType = types[0] in _callback_list_generics_mapping
+            if mapType is True:
+                types[0] = 'List'
+                params = " ".join(types)
+
+        code.Emit(
+            '$(ANNOTATIONS)typedef void $NAME($PARAMS);\n',
+            ANNOTATIONS=annotations,
+            NAME=typedef_name,
+            PARAMS=params)
+        self._backend.GenerateCallback(info)
+
+    def GenerateInterface(self):
+        interface_name = self._interface_type_info.interface_name()
+
+        implementation_name = self._interface_type_info.implementation_name()
+        self._library_emitter.AddTypeEntry(
+            self._library_name, self._interface.id, implementation_name)
+
+        factory_provider = None
+        if interface_name in interface_factories:
+            factory_provider = interface_factories[interface_name]
+        factory_constructor_name = None
+
+        constructors = []
+        if interface_name in _static_classes:
+            constructor_info = None
+        else:
+            constructor_info = AnalyzeConstructor(self._interface)
+        if constructor_info:
+            constructors.append(constructor_info)
+            # TODO(antonm): consider removing it later.
+            factory_provider = interface_name
+
+        # HTML Elements and SVG Elements have convenience constructors.
+        infos = ElementConstructorInfos(
+            self._interface.id,
+            _element_constructors[self._library_name],
+            factory_provider_name=_factory_ctr_strings[self._library_name]
+            ['provider_name'])
+
+        if infos:
+            factory_constructor_name = _factory_ctr_strings[
+                self._library_name]['constructor_name']
+
+        for info in infos:
+            constructors.append(info.ConstructorInfo(self._interface.id))
+            if factory_provider and factory_provider != info.factory_provider_name:
+                _logger.warn('Conflicting factory provider names: %s != %s' %
+                             (factory_provider, info.factory_provider_name))
+            factory_provider = info.factory_provider_name
+
+        implementation_emitter = self._ImplementationEmitter()
+
+        base_type_info = None
+        if self._interface.parents:
+            supertype = self._interface.parents[0].type.id
+            if not IsDartCollectionType(supertype) and not IsPureInterface(
+                    supertype, self._database):
+                base_type_info = self._type_registry.TypeInfo(supertype)
+
+        if base_type_info:
+            base_class = base_type_info.implementation_name()
+        else:
+            base_class = self._backend.RootClassName()
+
+        implements = self._backend.AdditionalImplementedInterfaces()
+        for parent in self._interface.parents:
+            parent_type_info = self._type_registry.TypeInfo(parent.type.id)
+            if parent_type_info.interface_name() != base_class and \
+                parent_type_info != base_type_info:
+                implements.append(parent_type_info.interface_name())
+
+        secure_base_name = self._backend.SecureBaseName(interface_name)
+        if secure_base_name:
+            implements.append(secure_base_name)
+
+        implements_str = ''
+        if implements:
+            implements_str = ' implements ' + ', '.join(set(implements))
+
+        mixins = self._backend.Mixins()
+
+        mixins_str = ''
+        if mixins:
+            mixins_str = ' with ' + ', '.join(mixins)
+            if not base_class:
+                base_class = 'Interceptor'
+            elif (base_class == 'NativeFieldWrapperClass2' and
+                  self._options.dart_js_interop and
+                  not (isinstance(self._backend, Dart2JSBackend))):
+                base_class = 'DartHtmlDomObject'
+
+        annotations = self._metadata.GetFormattedMetadata(
+            self._library_name, self._interface, None, '')
+
+        class_modifiers = ''
+        if (self._renamer.ShouldSuppressInterface(self._interface) or
+                IsPureInterface(self._interface.id, self._database)):
+            # XMLHttpRequestProgressEvent can't be abstract we need to instantiate
+            # for JsInterop.
+            if (not (isinstance(self._backend, Dart2JSBackend)) and
+                (self._interface.id == 'XMLHttpRequestProgressEvent' or
+                 self._interface.id == 'DOMStringMap')):
+                # Suppress abstract for XMLHttpRequestProgressEvent and DOMStringMap
+                # for Dartium.  Need to be able to instantiate the class; can't be abstract.
+                class_modifiers = ''
+            else:
+                # For Dartium w/ JsInterop these suppressed interfaces are needed to
+                # instanciate the internal classes.
+                if (self._renamer.ShouldSuppressInterface(self._interface) and
+                        not (isinstance(self._backend, Dart2JSBackend)) and
+                        self._options.dart_js_interop):
+                    class_modifiers = ''
+                else:
+                    class_modifiers = 'abstract '
+
+        native_spec = ''
+        if not IsPureInterface(self._interface.id, self._database):
+            native_spec = self._backend.NativeSpec()
+
+        class_name = self._interface_type_info.implementation_name()
+
+        js_interop_wrapper = '''
 
   @Deprecated("Internal Use Only")
   external static Type get instanceRuntimeType;
@@ -665,8 +765,8 @@
   {0}.internal_() : super.internal_();
 
 '''.format(class_name)
-    if base_class == 'NativeFieldWrapperClass2' or base_class == 'DartHtmlDomObject':
-        js_interop_wrapper = '''
+        if base_class == 'NativeFieldWrapperClass2' or base_class == 'DartHtmlDomObject':
+            js_interop_wrapper = '''
 
   @Deprecated("Internal Use Only")
   external static Type get instanceRuntimeType;
@@ -674,112 +774,110 @@
   @Deprecated("Internal Use Only")
   {0}.internal_() {{ }}
 '''.format(class_name)
-        # Change to use the synthesized class so we can construct with a mixin
-        # classes prefixed with name of NativeFieldWrapperClass2 don't have a
-        # default constructor so classes with mixins can't be new'd.
-        if (self._options.templates._conditions['DARTIUM'] and
-            self._options.dart_js_interop and
-            (self._interface.id == 'NamedNodeMap' or
-             self._interface.id == 'CSSStyleDeclaration')):
-            base_class = 'DartHtmlDomObject'
+            # Change to use the synthesized class so we can construct with a mixin
+            # classes prefixed with name of NativeFieldWrapperClass2 don't have a
+            # default constructor so classes with mixins can't be new'd.
+            if (self._options.templates._conditions['DARTIUM'] and
+                    self._options.dart_js_interop and
+                (self._interface.id == 'NamedNodeMap' or
+                 self._interface.id == 'CSSStyleDeclaration')):
+                base_class = 'DartHtmlDomObject'
 
-    maplikeKeyType = ''
-    maplikeValueType = ''
-    if self._interface.isMaplike:
-        maplikeKeyType = self._type_registry.\
-            _TypeInfo(self._interface.maplike_key_value[0].id).dart_type()
-        maplikeValueType = 'dynamic'
-        mixins_str = " with MapMixin<%s, %s>" % (maplikeKeyType, maplikeValueType)
+        maplikeKeyType = ''
+        maplikeValueType = ''
+        if self._interface.isMaplike:
+            maplikeKeyType = self._type_registry.\
+                _TypeInfo(self._interface.maplike_key_value[0].id).dart_type()
+            maplikeValueType = 'dynamic'
+            mixins_str = " with MapMixin<%s, %s>" % (maplikeKeyType,
+                                                     maplikeValueType)
 
-    implementation_members_emitter = implementation_emitter.Emit(
-        self._backend.ImplementationTemplate(),
-        LIBRARYNAME='dart.dom.%s' % self._library_name,
-        ANNOTATIONS=annotations,
-        CLASS_MODIFIERS=class_modifiers,
-        CLASSNAME=class_name,
-        EXTENDS=' extends %s' % base_class if base_class else '',
-        IMPLEMENTS=implements_str,
-        MIXINS=mixins_str,
-        DOMNAME=self._interface.doc_js_name,
-        NATIVESPEC=native_spec,
-        KEYTYPE=maplikeKeyType,
-        VALUETYPE=maplikeValueType)
-    stream_getter_signatures_emitter = None
-    element_stream_getters_emitter = None
-    if type(implementation_members_emitter) == tuple:
-        # We add event stream getters for both Element and ElementList, so in
-        # impl_Element.darttemplate, we have two additional "holes" for emitters
-        # to fill in, with small variations. These store these specialized
-        # emitters.
-        assert len(implementation_members_emitter) == 3;
-        stream_getter_signatures_emitter = \
-            implementation_members_emitter[0]
-        element_stream_getters_emitter = implementation_members_emitter[1]
-        implementation_members_emitter = \
-            implementation_members_emitter[2]
-    self._backend.StartInterface(implementation_members_emitter)
-    self._backend.EmitHelpers(base_class)
-    self._event_generator.EmitStreamProviders(
-        self._interface,
-        self._backend.CustomJSMembers(),
-        implementation_members_emitter,
-        self._library_name)
-    self._backend.AddConstructors(
-        constructors, factory_provider, factory_constructor_name)
+        implementation_members_emitter = implementation_emitter.Emit(
+            self._backend.ImplementationTemplate(),
+            LIBRARYNAME='dart.dom.%s' % self._library_name,
+            ANNOTATIONS=annotations,
+            CLASS_MODIFIERS=class_modifiers,
+            CLASSNAME=class_name,
+            EXTENDS=' extends %s' % base_class if base_class else '',
+            IMPLEMENTS=implements_str,
+            MIXINS=mixins_str,
+            DOMNAME=self._interface.doc_js_name,
+            NATIVESPEC=native_spec,
+            KEYTYPE=maplikeKeyType,
+            VALUETYPE=maplikeValueType)
+        stream_getter_signatures_emitter = None
+        element_stream_getters_emitter = None
+        if type(implementation_members_emitter) == tuple:
+            # We add event stream getters for both Element and ElementList, so in
+            # impl_Element.darttemplate, we have two additional "holes" for emitters
+            # to fill in, with small variations. These store these specialized
+            # emitters.
+            assert len(implementation_members_emitter) == 3
+            stream_getter_signatures_emitter = \
+                implementation_members_emitter[0]
+            element_stream_getters_emitter = implementation_members_emitter[1]
+            implementation_members_emitter = \
+                implementation_members_emitter[2]
+        self._backend.StartInterface(implementation_members_emitter)
+        self._backend.EmitHelpers(base_class)
+        self._event_generator.EmitStreamProviders(
+            self._interface, self._backend.CustomJSMembers(),
+            implementation_members_emitter, self._library_name)
+        self._backend.AddConstructors(constructors, factory_provider,
+                                      factory_constructor_name)
 
-    isElement = False
-    for parent in self._database.Hierarchy(self._interface):
-      if parent.id == 'Element':
-        isElement = True
+        isElement = False
+        for parent in self._database.Hierarchy(self._interface):
+            if parent.id == 'Element':
+                isElement = True
 
-    # Write out the JsInterop code.
-    if (implementation_members_emitter and
-        self._options.templates._conditions['DARTIUM'] and
-        self._options.dart_js_interop and
-        not IsPureInterface(self._interface.id, self._database)):
-      implementation_members_emitter.Emit(js_interop_wrapper)
+        # Write out the JsInterop code.
+        if (implementation_members_emitter and
+                self._options.templates._conditions['DARTIUM'] and
+                self._options.dart_js_interop and
+                not IsPureInterface(self._interface.id, self._database)):
+            implementation_members_emitter.Emit(js_interop_wrapper)
 
-    if isElement and self._interface.id != 'Element':
-      implementation_members_emitter.Emit(
-          '  /**\n'
-          '   * Constructor instantiated by the DOM when a custom element has been created.\n'
-          '   *\n'
-          '   * This can only be called by subclasses from their created constructor.\n'
-          '   */\n'
-          '  $CLASSNAME.created() : super.created();\n',
-          CLASSNAME=self._interface_type_info.implementation_name())
+        if isElement and self._interface.id != 'Element':
+            implementation_members_emitter.Emit(
+                '  /**\n'
+                '   * Constructor instantiated by the DOM when a custom element has been created.\n'
+                '   *\n'
+                '   * This can only be called by subclasses from their created constructor.\n'
+                '   */\n'
+                '  $CLASSNAME.created() : super.created();\n',
+                CLASSNAME=self._interface_type_info.implementation_name())
 
-    self._backend.EmitSupportCheck()
+        self._backend.EmitSupportCheck()
 
-    merged_interface = self._interface_type_info.merged_interface()
-    if merged_interface:
-      self._backend.AddMembers(self._database.GetInterface(merged_interface),
-                               not self._backend.ImplementsMergedMembers())
+        merged_interface = self._interface_type_info.merged_interface()
+        if merged_interface:
+            self._backend.AddMembers(
+                self._database.GetInterface(merged_interface),
+                not self._backend.ImplementsMergedMembers())
 
-    self._backend.AddMembers(self._interface, False, self._options.dart_js_interop)
-    self._backend.AddSecondaryMembers(self._interface)
-    self._event_generator.EmitStreamGetters(
-        self._interface,
-        [],
-        implementation_members_emitter,
-        self._library_name, stream_getter_signatures_emitter,
-        element_stream_getters_emitter)
-    self._backend.FinishInterface()
+        self._backend.AddMembers(self._interface, False,
+                                 self._options.dart_js_interop)
+        self._backend.AddSecondaryMembers(self._interface)
+        self._event_generator.EmitStreamGetters(
+            self._interface, [], implementation_members_emitter,
+            self._library_name, stream_getter_signatures_emitter,
+            element_stream_getters_emitter)
+        self._backend.FinishInterface()
 
-  def _ImplementationEmitter(self):
-    basename = self._interface_type_info.implementation_name()
-    if (self._interface_type_info.merged_into() and
-        self._backend.ImplementsMergedMembers()):
-      # Merged members are implemented in target interface implementation.
-      return emitter.Emitter()
-    return self._library_emitter.FileEmitter(basename, self._library_name)
+    def _ImplementationEmitter(self):
+        basename = self._interface_type_info.implementation_name()
+        if (self._interface_type_info.merged_into() and
+                self._backend.ImplementsMergedMembers()):
+            # Merged members are implemented in target interface implementation.
+            return emitter.Emitter()
+        return self._library_emitter.FileEmitter(basename, self._library_name)
 
-  def _DartType(self, type_name):
-    return self._type_registry.DartType(type_name)
+    def _DartType(self, type_name):
+        return self._type_registry.DartType(type_name)
 
 
 # ------------------------------------------------------------------------------
-
 ''' TODO(terry): Current idl_parser (Chrome) doesn't keep the Promise type e.g.,
                  Promise<T> in the AST so there is no way to pull this out.  Need
                  to investigate getting the Chrome folks to fix.  However, they
@@ -787,934 +885,1154 @@
                  for this feature.  For now I have a table that maps to the
                  parameterized Promise type.
 '''
-promise_attributes = monitored.Dict('systemhtml.promise_attr_type', {
-  "Animation.finished": {"type": "Animation"},
-  "Animation.ready": {"type": "Animation"},
-  "BeforeInstallPromptEvent.userChoice": {"type": "dictionary"},
-  "FontFace.loaded": {"type": "FontFace"},
-  "FontFaceSet.ready": {"type": "FontFaceSet"},
-  "MediaKeySession.closed": {"type": "void"},
-  "PresentationReceiver.connectionList": {"type": "PresentationConnectionList"},
-  "ServiceWorkerContainer.ready": {"type": "ServiceWorkerRegistration"},
-})
+promise_attributes = monitored.Dict(
+    'systemhtml.promise_attr_type', {
+        "Animation.finished": {
+            "type": "Animation"
+        },
+        "Animation.ready": {
+            "type": "Animation"
+        },
+        "BeforeInstallPromptEvent.userChoice": {
+            "type": "dictionary"
+        },
+        "FontFace.loaded": {
+            "type": "FontFace"
+        },
+        "FontFaceSet.ready": {
+            "type": "FontFaceSet"
+        },
+        "MediaKeySession.closed": {
+            "type": "void"
+        },
+        "PresentationReceiver.connectionList": {
+            "type": "PresentationConnectionList"
+        },
+        "ServiceWorkerContainer.ready": {
+            "type": "ServiceWorkerRegistration"
+        },
+    })
 
-promise_operations = monitored.Dict('systemhtml.promise_oper_type', {
-  "Clipboard.read": { "type": "DataTransfer" },
-  "Clipboard.readText": { "type": "String" },
-  "FontFace.load": { "type": "FontFace"},
-  "FontFaceSet.load": { "type": "List<FontFace>" },
-  "OffscreenCanvas.load": { "type": "Blob" },
-  "BackgroundFetchManager.fetch": { "type": "BackgroundFetchRegistration" },
-  "BackgroundFetchManager.get": { "type": "BackgroundFetchRegistration" },
-  "BackgroundFetchManager.getIds": { "type": "List<String>" },
-  "BackgroundFetchRegistration.abort": { "type": "bool" },
-  "SyncManager.getTags": { "type": "List<String>" },
-  "BudgetService.getCost": { "type": "double" },
-  "BudgetService.getBudget": { "type": "BudgetState" },
-  "BudgetService.reserve": { "type": "bool" },
-  "Body.blob": { "type": "Blob" },
-  "Body.formData": { "type": "FormData" },
-  "Body.text": { "type": "String" },
-  "ImageCapture.getPhotoCapabilities": { "type": "PhotoCapabilities" },
-  "ImageCapture.getPhotoSettings": { "type": "dictionary" },
-  "ImageCapture.takePhoto": { "type": "Blob" },
-  "ImageCapture.grabFrame": { "type": "ImageBitmap" },
-  "Navigator.getInstalledRelatedApps": { "type": "RelatedApplication" },
-  "OffscreenCanvas.convertToBlob": { "type": "Blob" },
-  "MediaCapabilities.decodingInfo": { "type": "MediaCapabilitiesInfo" },
-  "MediaCapabilities.encodingInfo": { "type": "MediaCapabilitiesInfo" },
-  "MediaDevices.enumerateDevices": { "type": "List<MediaDeviceInfo>" },
-  "MediaDevices.getUserMedia": { "type": "MediaStream" },
-  "ServiceWorkerRegistration.getNotifications": { "type": "List<Notification>" },
-  "PaymentInstruments.delete": { "type": "bool" },
-  "PaymentInstruments.get": { "type": "dictionary" },
-  "PaymentInstruments.keys": { "type": "List<String>" },
-  "PaymentInstrumentshas.": { "type": "bool" },
-  "PaymentRequest.show": { "type": "PaymentResponse" },
-  "PaymentRequest.canMakePayment": { "type": "bool" },
-  "PaymentRequestEvent.openWindow": { "type": "WindowClient" },
-  "RTCPeerConnection.createOffer": { "type": "RtcSessionDescription" },
-  "RTCPeerConnection.createAnswer": { "type": "RtcSessionDescription" },
-  "RTCPeerConnection.getStats": { "type": "RtcStatsReport", "maplike": "RTCStatsReport"},
-  "RTCPeerConnection.generateCertificate": { "type": "RtcCertificate" },
-  "Permissions.query": { "type": "PermissionStatus" },
-  "Permissions.request": { "type": "PermissionStatus" },
-  "Permissions.revoke": { "type": "PermissionStatus" },
-  "Permissions.requestAll": { "type": "PermissionStatus" },
-  "PresentationRequest.start": { "type": "PresentationConnection" },
-  "PresentationRequest.reconnect": { "type": "PresentationConnection" },
-  "PresentationRequest.getAvailability": { "type": "PresentationAvailability" },
-  "PushManager.subscribe": { "type": "PushSubscription" },
-  "PushManager.getSubscription": { "type": "PushSubscription" },
-  "PushSubscription.unsubscribe": { "type": "bool" },
-  "StorageManager.persisted": { "type": "bool" },
-  "StorageManager.persist": { "type": "bool" },
-  "StorageManager.estimate": { "type": "dictionary" },
-  "RemotePlayback.watchAvailability": { "type": "int" },
-  "Clients.matchAll": { "type": "List<Client>" },
-  "Clients.openWindow": { "type": "WindowClient" },
-  "NavigationPreloadManager.getState": { "type": "dictionary" },
-  "ServiceWorkerContainer.register": { "type": "ServiceWorkerRegistration" },
-  "ServiceWorkerContainer.getRegistration": { "type": "ServiceWorkerRegistration" },
-  "ServiceWorkerContainer.getRegistrations": { "type": "List<ServiceWorkerRegistration>" },
-  "ServiceWorkerGlobalScope.fetch": { "type": "Response" },
-  "ServiceWorkerRegistration.unregister": { "type": "bool" },
-  "WindowClient.focus": { "type": "WindowClient" },
-  "WindowClient.navigate": { "type": "WindowClient" },
-  "BarcodeDetector.detect": { "type": "List<DetectedBarcode>" },
-  "FaceDetector.detect": { "type": "List<DetectedFace>" },
-  "TextDetector.detect": { "type": "List<DetectedText>" },
-  "BaseAudioContext.decodeAudioData": { "type": "AudioBuffer" },
-  "OfflineAudioContext.startRendering": { "type": "AudioBuffer" },
-})
+promise_operations = monitored.Dict(
+    'systemhtml.promise_oper_type', {
+        "Clipboard.read": {
+            "type": "DataTransfer"
+        },
+        "Clipboard.readText": {
+            "type": "String"
+        },
+        "FontFace.load": {
+            "type": "FontFace"
+        },
+        "FontFaceSet.load": {
+            "type": "List<FontFace>"
+        },
+        "OffscreenCanvas.load": {
+            "type": "Blob"
+        },
+        "BackgroundFetchManager.fetch": {
+            "type": "BackgroundFetchRegistration"
+        },
+        "BackgroundFetchManager.get": {
+            "type": "BackgroundFetchRegistration"
+        },
+        "BackgroundFetchManager.getIds": {
+            "type": "List<String>"
+        },
+        "BackgroundFetchRegistration.abort": {
+            "type": "bool"
+        },
+        "SyncManager.getTags": {
+            "type": "List<String>"
+        },
+        "BudgetService.getCost": {
+            "type": "double"
+        },
+        "BudgetService.getBudget": {
+            "type": "BudgetState"
+        },
+        "BudgetService.reserve": {
+            "type": "bool"
+        },
+        "Body.blob": {
+            "type": "Blob"
+        },
+        "Body.formData": {
+            "type": "FormData"
+        },
+        "Body.text": {
+            "type": "String"
+        },
+        "ImageCapture.getPhotoCapabilities": {
+            "type": "PhotoCapabilities"
+        },
+        "ImageCapture.getPhotoSettings": {
+            "type": "dictionary"
+        },
+        "ImageCapture.takePhoto": {
+            "type": "Blob"
+        },
+        "ImageCapture.grabFrame": {
+            "type": "ImageBitmap"
+        },
+        "Navigator.getInstalledRelatedApps": {
+            "type": "RelatedApplication"
+        },
+        "OffscreenCanvas.convertToBlob": {
+            "type": "Blob"
+        },
+        "MediaCapabilities.decodingInfo": {
+            "type": "MediaCapabilitiesInfo"
+        },
+        "MediaCapabilities.encodingInfo": {
+            "type": "MediaCapabilitiesInfo"
+        },
+        "MediaDevices.enumerateDevices": {
+            "type": "List<MediaDeviceInfo>"
+        },
+        "MediaDevices.getUserMedia": {
+            "type": "MediaStream"
+        },
+        "ServiceWorkerRegistration.getNotifications": {
+            "type": "List<Notification>"
+        },
+        "PaymentInstruments.delete": {
+            "type": "bool"
+        },
+        "PaymentInstruments.get": {
+            "type": "dictionary"
+        },
+        "PaymentInstruments.keys": {
+            "type": "List<String>"
+        },
+        "PaymentInstrumentshas.": {
+            "type": "bool"
+        },
+        "PaymentRequest.show": {
+            "type": "PaymentResponse"
+        },
+        "PaymentRequest.canMakePayment": {
+            "type": "bool"
+        },
+        "PaymentRequestEvent.openWindow": {
+            "type": "WindowClient"
+        },
+        "RTCPeerConnection.createOffer": {
+            "type": "RtcSessionDescription"
+        },
+        "RTCPeerConnection.createAnswer": {
+            "type": "RtcSessionDescription"
+        },
+        "RTCPeerConnection.getStats": {
+            "type": "RtcStatsReport",
+            "maplike": "RTCStatsReport"
+        },
+        "RTCPeerConnection.generateCertificate": {
+            "type": "RtcCertificate"
+        },
+        "Permissions.query": {
+            "type": "PermissionStatus"
+        },
+        "Permissions.request": {
+            "type": "PermissionStatus"
+        },
+        "Permissions.revoke": {
+            "type": "PermissionStatus"
+        },
+        "Permissions.requestAll": {
+            "type": "PermissionStatus"
+        },
+        "PresentationRequest.start": {
+            "type": "PresentationConnection"
+        },
+        "PresentationRequest.reconnect": {
+            "type": "PresentationConnection"
+        },
+        "PresentationRequest.getAvailability": {
+            "type": "PresentationAvailability"
+        },
+        "PushManager.subscribe": {
+            "type": "PushSubscription"
+        },
+        "PushManager.getSubscription": {
+            "type": "PushSubscription"
+        },
+        "PushSubscription.unsubscribe": {
+            "type": "bool"
+        },
+        "StorageManager.persisted": {
+            "type": "bool"
+        },
+        "StorageManager.persist": {
+            "type": "bool"
+        },
+        "StorageManager.estimate": {
+            "type": "dictionary"
+        },
+        "RemotePlayback.watchAvailability": {
+            "type": "int"
+        },
+        "Clients.matchAll": {
+            "type": "List<Client>"
+        },
+        "Clients.openWindow": {
+            "type": "WindowClient"
+        },
+        "NavigationPreloadManager.getState": {
+            "type": "dictionary"
+        },
+        "ServiceWorkerContainer.register": {
+            "type": "ServiceWorkerRegistration"
+        },
+        "ServiceWorkerContainer.getRegistration": {
+            "type": "ServiceWorkerRegistration"
+        },
+        "ServiceWorkerContainer.getRegistrations": {
+            "type": "List<ServiceWorkerRegistration>"
+        },
+        "ServiceWorkerGlobalScope.fetch": {
+            "type": "Response"
+        },
+        "ServiceWorkerRegistration.unregister": {
+            "type": "bool"
+        },
+        "WindowClient.focus": {
+            "type": "WindowClient"
+        },
+        "WindowClient.navigate": {
+            "type": "WindowClient"
+        },
+        "BarcodeDetector.detect": {
+            "type": "List<DetectedBarcode>"
+        },
+        "FaceDetector.detect": {
+            "type": "List<DetectedFace>"
+        },
+        "TextDetector.detect": {
+            "type": "List<DetectedText>"
+        },
+        "BaseAudioContext.decodeAudioData": {
+            "type": "AudioBuffer"
+        },
+        "OfflineAudioContext.startRendering": {
+            "type": "AudioBuffer"
+        },
+    })
 
 promise_generateCall = monitored.Set('systemhtml.promise_generateCall', [
-   "Navigator.requestKeyboardLock",
+    "Navigator.requestKeyboardLock",
 ])
 
+
 def _IsPromiseOperationGenerateCall(interface_operation):
     return interface_operation in promise_generateCall
 
+
 def _GetPromiseOperationType(interface_operation):
-  if interface_operation in promise_operations:
-    return promise_operations[interface_operation]
-  return None
+    if interface_operation in promise_operations:
+        return promise_operations[interface_operation]
+    return None
+
 
 def _GetPromiseAttributeType(interface_operation):
-  if interface_operation in promise_attributes:
-    return promise_attributes[interface_operation]
-  return None
+    if interface_operation in promise_attributes:
+        return promise_attributes[interface_operation]
+    return None
+
 
 class Dart2JSBackend(HtmlDartGenerator):
-  """Generates a dart2js class for the dart:html library from a DOM IDL
+    """Generates a dart2js class for the dart:html library from a DOM IDL
   interface.
   """
 
-  def __init__(self, interface, options, logging_level=logging.WARNING):
-    super(Dart2JSBackend, self).__init__(interface, options, False, _logger)
+    def __init__(self, interface, options, logging_level=logging.WARNING):
+        super(Dart2JSBackend, self).__init__(interface, options, False, _logger)
 
-    self._database = options.database
-    self._template_loader = options.templates
-    self._type_registry = options.type_registry
-    self._renamer = options.renamer
-    self._metadata = options.metadata
-    self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
-    self._current_secondary_parent = None
-    self._library_name = self._renamer.GetLibraryName(self._interface)
-    # Global constants for all WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers
-    self._gl_constants = []
-    _logger.setLevel(logging_level)
+        self._database = options.database
+        self._template_loader = options.templates
+        self._type_registry = options.type_registry
+        self._renamer = options.renamer
+        self._metadata = options.metadata
+        self._interface_type_info = self._type_registry.TypeInfo(
+            self._interface.id)
+        self._current_secondary_parent = None
+        self._library_name = self._renamer.GetLibraryName(self._interface)
+        # Global constants for all WebGLRenderingContextBase, WebGL2RenderingContextBase, WebGLDrawBuffers
+        self._gl_constants = []
+        _logger.setLevel(logging_level)
 
-  def ImplementsMergedMembers(self):
-    return True
+    def ImplementsMergedMembers(self):
+        return True
 
-  def GenerateCallback(self, info):
-    pass
+    def GenerateCallback(self, info):
+        pass
 
-  def AdditionalImplementedInterfaces(self):
-    implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces()
-    if self._interface_type_info.list_item_type() and self.HasIndexedGetter():
-      item_type = self._type_registry.TypeInfo(
-          self._interface_type_info.list_item_type()).dart_type()
-      implements.append('JavaScriptIndexingBehavior<%s>' % item_type)
-    return implements
+    def AdditionalImplementedInterfaces(self):
+        implements = super(Dart2JSBackend,
+                           self).AdditionalImplementedInterfaces()
+        if self._interface_type_info.list_item_type() and self.HasIndexedGetter(
+        ):
+            item_type = self._type_registry.TypeInfo(
+                self._interface_type_info.list_item_type()).dart_type()
+            implements.append('JavaScriptIndexingBehavior<%s>' % item_type)
+        return implements
 
-  def NativeSpec(self):
-    native_spec = MakeNativeSpec(self._interface.javascript_binding_name)
-    return '@Native("%s")\n' % native_spec
+    def NativeSpec(self):
+        native_spec = MakeNativeSpec(self._interface.javascript_binding_name)
+        return '@Native("%s")\n' % native_spec
 
-  def ImplementationTemplate(self):
-    template_file = ('impl_%s.darttemplate' %
-                     self._interface.doc_js_name)
-    template_file_content = self._template_loader.TryLoad(template_file)
-    if not(template_file_content):
-      if self._interface.isMaplike and self._interface.isMaplike_ro:
-          # TODO(terry): There are no mutable maplikes yet.
-          template_file_content = self._template_loader.Load('dart2js_maplike_impl.darttemplate')
-      else:
-        template_file_content = self._template_loader.Load('dart2js_impl.darttemplate')
-    return template_file_content
+    def ImplementationTemplate(self):
+        template_file = ('impl_%s.darttemplate' % self._interface.doc_js_name)
+        template_file_content = self._template_loader.TryLoad(template_file)
+        if not (template_file_content):
+            if self._interface.isMaplike and self._interface.isMaplike_ro:
+                # TODO(terry): There are no mutable maplikes yet.
+                template_file_content = self._template_loader.Load(
+                    'dart2js_maplike_impl.darttemplate')
+            else:
+                template_file_content = self._template_loader.Load(
+                    'dart2js_impl.darttemplate')
+        return template_file_content
 
-  def StartInterface(self, members_emitter):
-    self._members_emitter = members_emitter
+    def StartInterface(self, members_emitter):
+        self._members_emitter = members_emitter
 
-  def FinishInterface(self):
-    pass
+    def FinishInterface(self):
+        pass
 
-  def HasSupportCheck(self):
-    return self._interface.doc_js_name in js_support_checks
+    def HasSupportCheck(self):
+        return self._interface.doc_js_name in js_support_checks
 
-  def GetSupportCheck(self):
-    """Return a tuple of the support check function signature and the support
+    def GetSupportCheck(self):
+        """Return a tuple of the support check function signature and the support
     test itself. If no parameters are supplied, we assume the default."""
-    if self._interface.doc_js_name in _js_support_checks_additional_element:
-      if self._interface.doc_js_name in _svg_element_constructors:
-        lib_prefix = 'Svg'
-        constructors = _svg_element_constructors
-      else:
-        lib_prefix = ''
-        constructors = _html_element_constructors
-      return (js_support_checks.get(self._interface.doc_js_name) +
-          " && (new %sElement.tag('%s') is %s)" % (lib_prefix,
-        constructors[self._interface.doc_js_name],
-        self._renamer.RenameInterface(self._interface)))
-    return js_support_checks.get(self._interface.doc_js_name)
+        if self._interface.doc_js_name in _js_support_checks_additional_element:
+            if self._interface.doc_js_name in _svg_element_constructors:
+                lib_prefix = 'Svg'
+                constructors = _svg_element_constructors
+            else:
+                lib_prefix = ''
+                constructors = _html_element_constructors
+            return (js_support_checks.get(self._interface.doc_js_name) +
+                    " && (new %sElement.tag('%s') is %s)" %
+                    (lib_prefix, constructors[self._interface.doc_js_name],
+                     self._renamer.RenameInterface(self._interface)))
+        return js_support_checks.get(self._interface.doc_js_name)
 
-  def GenerateCustomFactory(self, constructor_info):
-    # Custom factory will be taken from the template.
-    return self._interface.doc_js_name in _js_custom_constructors
+    def GenerateCustomFactory(self, constructor_info):
+        # Custom factory will be taken from the template.
+        return self._interface.doc_js_name in _js_custom_constructors
 
-  def MakeFactoryCall(self, factory, method, arguments, constructor_info):
-    if factory is 'document' and method is 'createElement' \
-        and not ',' in arguments \
-        and not self._HasUnreliableFactoryConstructor():
-      return emitter.Format(
-          "JS('returns:$INTERFACE_NAME;creates:$INTERFACE_NAME;new:true',"
-          " '#.$METHOD(#)', $FACTORY, $ARGUMENTS)",
-          INTERFACE_NAME=self._interface_type_info.interface_name(),
-          FACTORY=factory,
-          METHOD=method,
-          ARGUMENTS=arguments)
-    return emitter.Format(
-        '$FACTORY.$METHOD($ARGUMENTS)',
-        FACTORY=factory,
-        METHOD=method,
-        ARGUMENTS=arguments)
+    def MakeFactoryCall(self, factory, method, arguments, constructor_info):
+        if factory is 'document' and method is 'createElement' \
+            and not ',' in arguments \
+            and not self._HasUnreliableFactoryConstructor():
+            return emitter.Format(
+                "JS('returns:$INTERFACE_NAME;creates:$INTERFACE_NAME;new:true',"
+                " '#.$METHOD(#)', $FACTORY, $ARGUMENTS)",
+                INTERFACE_NAME=self._interface_type_info.interface_name(),
+                FACTORY=factory,
+                METHOD=method,
+                ARGUMENTS=arguments)
+        return emitter.Format(
+            '$FACTORY.$METHOD($ARGUMENTS)',
+            FACTORY=factory,
+            METHOD=method,
+            ARGUMENTS=arguments)
 
-  def _HasUnreliableFactoryConstructor(self):
-    return self._interface.doc_js_name in _js_unreliable_element_factories
+    def _HasUnreliableFactoryConstructor(self):
+        return self._interface.doc_js_name in _js_unreliable_element_factories
 
-  def IsConstructorArgumentOptional(self, argument):
-    return argument.optional
+    def IsConstructorArgumentOptional(self, argument):
+        return argument.optional
 
-  def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
-    if self._interface_type_info.has_generated_interface():
-      # Use dart_type name, we're generating.
-      interface_name = self._interface_type_info.interface_name()
-    else:
-      # Use the implementation name the interface is suppressed.
-      interface_name = self._interface_type_info.implementation_name()
+    def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
+        if self._interface_type_info.has_generated_interface():
+            # Use dart_type name, we're generating.
+            interface_name = self._interface_type_info.interface_name()
+        else:
+            # Use the implementation name the interface is suppressed.
+            interface_name = self._interface_type_info.implementation_name()
 
-    index = len(arguments)
-    arguments = constructor_info.ParametersAsArgumentList(index)
-    if arguments:
-      arguments = ', ' + arguments
-    self._members_emitter.Emit(
-        "  static $INTERFACE_NAME $NAME($PARAMETERS) => "
-          "JS('$INTERFACE_NAME', 'new $CTOR_NAME($PLACEHOLDERS)'$ARGUMENTS);\n",
-        INTERFACE_NAME=interface_name,
-        NAME=name,
-        # TODO(antonm): add types to parameters.
-        PARAMETERS=constructor_info.ParametersAsArgumentList(index),
-        CTOR_NAME=constructor_info.name or self._interface.doc_js_name,
-        PLACEHOLDERS=','.join(['#'] * index),
-        ARGUMENTS=arguments)
-
-  def SecondaryContext(self, interface):
-    if interface is not self._current_secondary_parent:
-      self._current_secondary_parent = interface
-      self._members_emitter.Emit('\n  // From $WHERE\n', WHERE=interface.id)
-
-  def HasIndexedGetter(self):
-    ext_attrs = self._interface.ext_attrs
-    has_indexed_getter = 'CustomIndexedGetter' in ext_attrs
-    for operation in self._interface.operations:
-      if operation.id == 'item' and 'getter' in operation.specials \
-          and not self._OperationRequiresConversions(operation):
-        has_indexed_getter = True
-        break
-      if operation.id == '__getter__' and 'getter' in operation.specials \
-          and not self._OperationRequiresConversions(operation):
-        has_indexed_getter = True
-        break
-    return has_indexed_getter
-
-  def AddIndexer(self, element_type, nullable):
-    """Adds all the methods required to complete implementation of List."""
-    # We would like to simply inherit the implementation of everything except
-    # length, [], and maybe []=.  It is possible to extend from a base
-    # array implementation class only when there is no other implementation
-    # inheritance.  There might be no implementation inheritance other than
-    # DOMBaseWrapper for many classes, but there might be some where the
-    # array-ness is introduced by a non-root interface:
-    #
-    #   interface Y extends X, List<T> ...
-    #
-    # In the non-root case we have to choose between:
-    #
-    #   class YImpl extends XImpl { add List<T> methods; }
-    #
-    # and
-    #
-    #   class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
-    #
-
-    has_indexed_getter = self.HasIndexedGetter()
-
-    if has_indexed_getter:
-      indexed_getter = ('JS("%s%s", "#[#]", this, index)' %
-          (self.SecureOutputType(element_type), "|Null" if nullable else ""));
-    elif any(op.id == 'getItem' for op in self._interface.operations):
-      indexed_getter = 'this.getItem(index)'
-    elif any(op.id == 'item' for op in self._interface.operations):
-      indexed_getter = 'this.item(index)'
-    else:
-      indexed_getter = False
-
-    if indexed_getter:
-      self._members_emitter.Emit(
-          '\n'
-          '  $TYPE operator[](int index) {\n'
-          '    if (JS("bool", "# >>> 0 !== # || # >= #", index,\n'
-          '        index, index, length))\n'
-          '      throw new RangeError.index(index, this);\n'
-          '    return $INDEXED_GETTER;\n'
-          '  }',
-          INDEXED_GETTER=indexed_getter,
-          TYPE=self.SecureOutputType(element_type, False, True))
-
-    if 'CustomIndexedSetter' in self._interface.ext_attrs:
-      self._members_emitter.Emit(
-          '\n'
-          '  void operator[]=(int index, $TYPE value) {'
-          ' JS("void", "#[#] = #", this, index, value); }',
-          TYPE=self._NarrowInputType(element_type))
-    else:
-      theType = self._NarrowInputType(element_type)
-      if theType == 'DomRectList':
-          theType = '';
-
-      self._members_emitter.Emit(
-          '\n'
-          '  void operator[]=(int index, $TYPE value) {\n'
-          '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
-          '  }\n',
-          TYPE=theType)
-
-    self.EmitListMixin(self._DartType(element_type), nullable)
-
-  def EmitAttribute(self, attribute, html_name, read_only):
-    if self._HasCustomImplementation(attribute.id):
-      return
-
-    if IsPureInterface(self._interface.id, self._database):
-      self._AddInterfaceAttribute(attribute, html_name, read_only)
-      return
-
-    # If the attribute is shadowing, we can't generate a shadowing
-    # field (Issue 1633).
-    # TODO(sra): _FindShadowedAttribute does not take into account the html
-    #  renaming.  we should be looking for another attribute that has the same
-    #  html_name.  Two attributes with the same IDL name might not match if one
-    #  is renamed.
-    (super_attribute, super_attribute_interface) = self._FindShadowedAttribute(
-        attribute)
-    if self._ForcePropertyMember(html_name):
-      self._members_emitter.Emit('\n  // Using property as subclass shadows.');
-      self._AddAttributeUsingProperties(attribute, html_name, read_only)
-      return
-
-    if super_attribute:
-      if read_only or self._SafeToIgnoreShadowingMember(html_name):
-        if attribute.type.id == super_attribute.type.id:
-          # Compatible attribute, use the superclass property.  This works
-          # because JavaScript will do its own dynamic dispatch.
-          self._members_emitter.Emit(
-              '\n'
-              '  // Use implementation from $SUPER.\n'
-              '  // final $TYPE $NAME;\n',
-              SUPER=super_attribute_interface,
-              NAME=html_name,
-              TYPE=self.SecureOutputType(attribute.type.id, False, read_only))
-          return
-      self._members_emitter.Emit('\n  // Shadowing definition.')
-      self._AddAttributeUsingProperties(attribute, html_name, read_only)
-      return
-
-    # If the attribute is shadowed incompatibly in a subclass then we also
-    # can't just generate it as a field. In particular, this happens with
-    # DomMatrixReadOnly and its subclass DomMatrix. Force the superclass
-    # to generate getters. Hardcoding the known problem classes for now.
-    # TODO(alanknight): Fix this more generally.
-    if (self._interface.id == 'DOMMatrixReadOnly' or self._interface.id == 'DOMPointReadOnly'
-       or self._interface.id == 'DOMRectReadOnly'):
-        self._AddAttributeUsingProperties(attribute, html_name, read_only)
-        return
-
-    # If the type has a conversion we need a getter or setter to contain the
-    # conversion code.
-    if (self._OutputConversion(attribute.type.id, attribute.id) or
-        self._InputConversion(attribute.type.id, attribute.id)):
-      self._AddAttributeUsingProperties(attribute, html_name, read_only)
-      return
-
-    output_type = self.SecureOutputType(attribute.type.id, False, read_only)
-    input_type = self._NarrowInputType(attribute.type.id)
-    metadata = self._Metadata(attribute.type.id, attribute.id, output_type)
-    rename = self._RenamingAnnotation(attribute.id, html_name)
-    static_attribute = 'static' if attribute.is_static else ''
-    if not read_only:
-      if attribute.type.id == 'Promise':
-        _logger.warn('R/W member is a Promise: %s.%s' % (self._interface.id, html_name))
-      template = '\n  $RENAME$METADATA$STATIC $TYPE $NAME;\n'
-      self._members_emitter.Emit(
-          template,
-          RENAME=rename,
-          METADATA=metadata,
-          STATIC=static_attribute,
-          NAME=html_name,
-          TYPE=output_type)
-    else:
-      template = '\n  $RENAME$(ANNOTATIONS)final $TYPE $NAME;\n'
-      if attribute.type.id == 'Promise':
-          lookupOp = "%s.%s" % (self._interface.id, html_name)
-          promiseFound = _GetPromiseAttributeType(lookupOp)
-          promiseType = 'Future'
-          promiseCall = 'promiseToFuture'
-          if promiseFound is not (None):
-              if 'maplike' in promiseFound:
-                  promiseCall = 'promiseToFuture<dynamic>'
-                  promiseType = 'Future'
-              elif promiseFound['type'] == 'dictionary':
-                  # It's a dictionary so return as a Map.
-                  promiseCall = 'promiseToFutureAsMap'
-                  promiseType = 'Future<Map<String, dynamic>>'
-              else:
-                  paramType = promiseFound['type']
-                  promiseCall = 'promiseToFuture<%s>' % paramType
-                  promiseType = 'Future<%s>' % paramType
-
-          template = '\n  $RENAME$(ANNOTATIONS)$TYPE get $NAME => $PROMISE_CALL(JS("", "#.$NAME", this));\n'
-
-          self._members_emitter.Emit(template,
-                                     RENAME=rename,
-                                     ANNOTATIONS=metadata,
-                                     TYPE=promiseType,
-                                     PROMISE_CALL=promiseCall,
-                                     NAME=html_name)
-      else:
-        template = '\n  $RENAME$(ANNOTATIONS)$STATIC final $TYPE $NAME;\n'
-        # Need to use a getter for list.length properties so we can add a
-        # setter which throws an exception, satisfying List API.
-        if self._interface_type_info.list_item_type() and html_name == 'length':
-          template = ('\n  $RENAME$(ANNOTATIONS)$TYPE get $NAME => ' +
-              'JS("$TYPE", "#.$NAME", this);\n')
+        index = len(arguments)
+        arguments = constructor_info.ParametersAsArgumentList(index)
+        if arguments:
+            arguments = ', ' + arguments
         self._members_emitter.Emit(
-            template,
-            RENAME=rename,
-            ANNOTATIONS=metadata,
-            STATIC=static_attribute,
+            "  static $INTERFACE_NAME $NAME($PARAMETERS) => "
+            "JS('$INTERFACE_NAME', 'new $CTOR_NAME($PLACEHOLDERS)'$ARGUMENTS);\n",
+            INTERFACE_NAME=interface_name,
+            NAME=name,
+            # TODO(antonm): add types to parameters.
+            PARAMETERS=constructor_info.ParametersAsArgumentList(index),
+            CTOR_NAME=constructor_info.name or self._interface.doc_js_name,
+            PLACEHOLDERS=','.join(['#'] * index),
+            ARGUMENTS=arguments)
+
+    def SecondaryContext(self, interface):
+        if interface is not self._current_secondary_parent:
+            self._current_secondary_parent = interface
+            self._members_emitter.Emit(
+                '\n  // From $WHERE\n', WHERE=interface.id)
+
+    def HasIndexedGetter(self):
+        ext_attrs = self._interface.ext_attrs
+        has_indexed_getter = 'CustomIndexedGetter' in ext_attrs
+        for operation in self._interface.operations:
+            if operation.id == 'item' and 'getter' in operation.specials \
+                and not self._OperationRequiresConversions(operation):
+                has_indexed_getter = True
+                break
+            if operation.id == '__getter__' and 'getter' in operation.specials \
+                and not self._OperationRequiresConversions(operation):
+                has_indexed_getter = True
+                break
+        return has_indexed_getter
+
+    def AddIndexer(self, element_type, nullable):
+        """Adds all the methods required to complete implementation of List."""
+        # We would like to simply inherit the implementation of everything except
+        # length, [], and maybe []=.  It is possible to extend from a base
+        # array implementation class only when there is no other implementation
+        # inheritance.  There might be no implementation inheritance other than
+        # DOMBaseWrapper for many classes, but there might be some where the
+        # array-ness is introduced by a non-root interface:
+        #
+        #   interface Y extends X, List<T> ...
+        #
+        # In the non-root case we have to choose between:
+        #
+        #   class YImpl extends XImpl { add List<T> methods; }
+        #
+        # and
+        #
+        #   class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
+        #
+
+        has_indexed_getter = self.HasIndexedGetter()
+
+        if has_indexed_getter:
+            indexed_getter = ('JS("%s%s", "#[#]", this, index)' %
+                              (self.SecureOutputType(element_type),
+                               "|Null" if nullable else ""))
+        elif any(op.id == 'getItem' for op in self._interface.operations):
+            indexed_getter = 'this.getItem(index)'
+        elif any(op.id == 'item' for op in self._interface.operations):
+            indexed_getter = 'this.item(index)'
+        else:
+            indexed_getter = False
+
+        if indexed_getter:
+            self._members_emitter.Emit(
+                '\n'
+                '  $TYPE operator[](int index) {\n'
+                '    if (JS("bool", "# >>> 0 !== # || # >= #", index,\n'
+                '        index, index, length))\n'
+                '      throw new RangeError.index(index, this);\n'
+                '    return $INDEXED_GETTER;\n'
+                '  }',
+                INDEXED_GETTER=indexed_getter,
+                TYPE=self.SecureOutputType(element_type, False, True))
+
+        if 'CustomIndexedSetter' in self._interface.ext_attrs:
+            self._members_emitter.Emit(
+                '\n'
+                '  void operator[]=(int index, $TYPE value) {'
+                ' JS("void", "#[#] = #", this, index, value); }',
+                TYPE=self._NarrowInputType(element_type))
+        else:
+            theType = self._NarrowInputType(element_type)
+            if theType == 'DomRectList':
+                theType = ''
+
+            self._members_emitter.Emit(
+                '\n'
+                '  void operator[]=(int index, $TYPE value) {\n'
+                '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
+                '  }\n',
+                TYPE=theType)
+
+        self.EmitListMixin(self._DartType(element_type), nullable)
+
+    def EmitAttribute(self, attribute, html_name, read_only):
+        if self._HasCustomImplementation(attribute.id):
+            return
+
+        if IsPureInterface(self._interface.id, self._database):
+            self._AddInterfaceAttribute(attribute, html_name, read_only)
+            return
+
+        # If the attribute is shadowing, we can't generate a shadowing
+        # field (Issue 1633).
+        # TODO(sra): _FindShadowedAttribute does not take into account the html
+        #  renaming.  we should be looking for another attribute that has the same
+        #  html_name.  Two attributes with the same IDL name might not match if one
+        #  is renamed.
+        (super_attribute,
+         super_attribute_interface) = self._FindShadowedAttribute(attribute)
+        if self._ForcePropertyMember(html_name):
+            self._members_emitter.Emit(
+                '\n  // Using property as subclass shadows.')
+            self._AddAttributeUsingProperties(attribute, html_name, read_only)
+            return
+
+        if super_attribute:
+            if read_only or self._SafeToIgnoreShadowingMember(html_name):
+                if attribute.type.id == super_attribute.type.id:
+                    # Compatible attribute, use the superclass property.  This works
+                    # because JavaScript will do its own dynamic dispatch.
+                    self._members_emitter.Emit(
+                        '\n'
+                        '  // Use implementation from $SUPER.\n'
+                        '  // final $TYPE $NAME;\n',
+                        SUPER=super_attribute_interface,
+                        NAME=html_name,
+                        TYPE=self.SecureOutputType(attribute.type.id, False,
+                                                   read_only))
+                    return
+            self._members_emitter.Emit('\n  // Shadowing definition.')
+            self._AddAttributeUsingProperties(attribute, html_name, read_only)
+            return
+
+        # If the attribute is shadowed incompatibly in a subclass then we also
+        # can't just generate it as a field. In particular, this happens with
+        # DomMatrixReadOnly and its subclass DomMatrix. Force the superclass
+        # to generate getters. Hardcoding the known problem classes for now.
+        # TODO(alanknight): Fix this more generally.
+        if (self._interface.id == 'DOMMatrixReadOnly' or
+                self._interface.id == 'DOMPointReadOnly' or
+                self._interface.id == 'DOMRectReadOnly'):
+            self._AddAttributeUsingProperties(attribute, html_name, read_only)
+            return
+
+        # If the type has a conversion we need a getter or setter to contain the
+        # conversion code.
+        if (self._OutputConversion(attribute.type.id, attribute.id) or
+                self._InputConversion(attribute.type.id, attribute.id)):
+            self._AddAttributeUsingProperties(attribute, html_name, read_only)
+            return
+
+        output_type = self.SecureOutputType(attribute.type.id, False, read_only)
+        input_type = self._NarrowInputType(attribute.type.id)
+        metadata = self._Metadata(attribute.type.id, attribute.id, output_type)
+        rename = self._RenamingAnnotation(attribute.id, html_name)
+        static_attribute = 'static' if attribute.is_static else ''
+        if not read_only:
+            if attribute.type.id == 'Promise':
+                _logger.warn('R/W member is a Promise: %s.%s' %
+                             (self._interface.id, html_name))
+            template = '\n  $RENAME$METADATA$STATIC $TYPE $NAME;\n'
+            self._members_emitter.Emit(
+                template,
+                RENAME=rename,
+                METADATA=metadata,
+                STATIC=static_attribute,
+                NAME=html_name,
+                TYPE=output_type)
+        else:
+            template = '\n  $RENAME$(ANNOTATIONS)final $TYPE $NAME;\n'
+            if attribute.type.id == 'Promise':
+                lookupOp = "%s.%s" % (self._interface.id, html_name)
+                promiseFound = _GetPromiseAttributeType(lookupOp)
+                promiseType = 'Future'
+                promiseCall = 'promiseToFuture'
+                if promiseFound is not (None):
+                    if 'maplike' in promiseFound:
+                        promiseCall = 'promiseToFuture<dynamic>'
+                        promiseType = 'Future'
+                    elif promiseFound['type'] == 'dictionary':
+                        # It's a dictionary so return as a Map.
+                        promiseCall = 'promiseToFutureAsMap'
+                        promiseType = 'Future<Map<String, dynamic>>'
+                    else:
+                        paramType = promiseFound['type']
+                        promiseCall = 'promiseToFuture<%s>' % paramType
+                        promiseType = 'Future<%s>' % paramType
+
+                template = '\n  $RENAME$(ANNOTATIONS)$TYPE get $NAME => $PROMISE_CALL(JS("", "#.$NAME", this));\n'
+
+                self._members_emitter.Emit(
+                    template,
+                    RENAME=rename,
+                    ANNOTATIONS=metadata,
+                    TYPE=promiseType,
+                    PROMISE_CALL=promiseCall,
+                    NAME=html_name)
+            else:
+                template = '\n  $RENAME$(ANNOTATIONS)$STATIC final $TYPE $NAME;\n'
+                # Need to use a getter for list.length properties so we can add a
+                # setter which throws an exception, satisfying List API.
+                if self._interface_type_info.list_item_type(
+                ) and html_name == 'length':
+                    template = ('\n  $RENAME$(ANNOTATIONS)$TYPE get $NAME => ' +
+                                'JS("$TYPE", "#.$NAME", this);\n')
+                self._members_emitter.Emit(
+                    template,
+                    RENAME=rename,
+                    ANNOTATIONS=metadata,
+                    STATIC=static_attribute,
+                    NAME=html_name,
+                    TYPE=input_type if output_type == 'double' else output_type)
+
+    def _AddAttributeUsingProperties(self, attribute, html_name, read_only):
+        self._AddRenamingGetter(attribute, html_name)
+        if not read_only:
+            self._AddRenamingSetter(attribute, html_name)
+
+    def _AddInterfaceAttribute(self, attribute, html_name, read_only):
+        self._members_emitter.Emit(
+            '\n  $QUALIFIER$TYPE $NAME;'
+            '\n',
+            QUALIFIER='final ' if read_only else '',
             NAME=html_name,
-            TYPE=input_type if output_type == 'double' else output_type)
+            TYPE=self.SecureOutputType(attribute.type.id))
 
-  def _AddAttributeUsingProperties(self, attribute, html_name, read_only):
-    self._AddRenamingGetter(attribute, html_name)
-    if not read_only:
-      self._AddRenamingSetter(attribute, html_name)
+    def _AddRenamingGetter(self, attr, html_name):
 
-  def _AddInterfaceAttribute(self, attribute, html_name, read_only):
-    self._members_emitter.Emit(
-        '\n  $QUALIFIER$TYPE $NAME;'
-        '\n',
-        QUALIFIER='final ' if read_only else '',
-        NAME=html_name,
-        TYPE=self.SecureOutputType(attribute.type.id))
+        conversion = self._OutputConversion(attr.type.id, attr.id)
+        if conversion:
+            return self._AddConvertingGetter(attr, html_name, conversion)
+        return_type = self.SecureOutputType(attr.type.id)
+        native_type = self._NarrowToImplementationType(attr.type.id)
+        self._members_emitter.Emit(
+            # TODO(sra): Use metadata to provide native name.
+            '\n  $TYPE get $HTML_NAME => JS("$NATIVE_TYPE", "#.$NAME", this);'
+            '\n',
+            HTML_NAME=html_name,
+            NAME=attr.id,
+            TYPE=return_type,
+            NATIVE_TYPE=native_type)
 
-  def _AddRenamingGetter(self, attr, html_name):
+    def _AddRenamingSetter(self, attr, html_name):
 
-    conversion = self._OutputConversion(attr.type.id, attr.id)
-    if conversion:
-      return self._AddConvertingGetter(attr, html_name, conversion)
-    return_type = self.SecureOutputType(attr.type.id)
-    native_type = self._NarrowToImplementationType(attr.type.id)
-    self._members_emitter.Emit(
-        # TODO(sra): Use metadata to provide native name.
-        '\n  $TYPE get $HTML_NAME => JS("$NATIVE_TYPE", "#.$NAME", this);'
-        '\n',
-        HTML_NAME=html_name,
-        NAME=attr.id,
-        TYPE=return_type,
-        NATIVE_TYPE=native_type)
+        conversion = self._InputConversion(attr.type.id, attr.id)
+        if conversion:
+            return self._AddConvertingSetter(attr, html_name, conversion)
+        self._members_emitter.Emit(
+            # TODO(sra): Use metadata to provide native name.
+            '\n  set $HTML_NAME($TYPE value) {'
+            '\n    JS("void", "#.$NAME = #", this, value);'
+            '\n  }'
+            '\n',
+            HTML_NAME=html_name,
+            NAME=attr.id,
+            TYPE=self._NarrowInputType(attr.type.id))
 
-  def _AddRenamingSetter(self, attr, html_name):
+    def _AddConvertingGetter(self, attr, html_name, conversion):
+        self._members_emitter.Emit(
+            '\n  $(METADATA)$RETURN_TYPE get $HTML_NAME => '
+            '$CONVERT(this._get_$(HTML_NAME));'
+            "\n  @JSName('$NAME')"
+            '\n  $(JS_METADATA)final $NATIVE_TYPE _get_$HTML_NAME;'
+            '\n',
+            METADATA=self._metadata.GetFormattedMetadata(
+                self._library_name, self._interface, html_name, '  '),
+            JS_METADATA=self._Metadata(attr.type.id, html_name,
+                                       conversion.input_type),
+            CONVERT=conversion.function_name,
+            HTML_NAME=html_name,
+            NAME=attr.id,
+            RETURN_TYPE=conversion.output_type,
+            NATIVE_TYPE=conversion.input_type)
 
-    conversion = self._InputConversion(attr.type.id, attr.id)
-    if conversion:
-      return self._AddConvertingSetter(attr, html_name, conversion)
-    self._members_emitter.Emit(
-        # TODO(sra): Use metadata to provide native name.
-        '\n  set $HTML_NAME($TYPE value) {'
-        '\n    JS("void", "#.$NAME = #", this, value);'
-        '\n  }'
-        '\n',
-        HTML_NAME=html_name,
-        NAME=attr.id,
-        TYPE=self._NarrowInputType(attr.type.id))
+    def _AddConvertingSetter(self, attr, html_name, conversion):
+        self._members_emitter.Emit(
+            # TODO(sra): Use metadata to provide native name.
+            '\n  set $HTML_NAME($INPUT_TYPE value) {'
+            '\n    this._set_$HTML_NAME = $CONVERT(value);'
+            '\n  }'
+            '\n  set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {'
+            '\n    JS("void", "#.$NAME = #", this, value);'
+            '\n  }'
+            '\n',
+            CONVERT=conversion.function_name,
+            HTML_NAME=html_name,
+            NAME=attr.id,
+            INPUT_TYPE=conversion.input_type,
+            NATIVE_TYPE=conversion.output_type)
 
-  def _AddConvertingGetter(self, attr, html_name, conversion):
-    self._members_emitter.Emit(
-        '\n  $(METADATA)$RETURN_TYPE get $HTML_NAME => '
-        '$CONVERT(this._get_$(HTML_NAME));'
-        "\n  @JSName('$NAME')"
-        '\n  $(JS_METADATA)final $NATIVE_TYPE _get_$HTML_NAME;'
-        '\n',
-        METADATA=self._metadata.GetFormattedMetadata(
-            self._library_name, self._interface, html_name, '  '),
-        JS_METADATA=self._Metadata(attr.type.id, html_name, conversion.input_type),
-        CONVERT=conversion.function_name,
-        HTML_NAME=html_name,
-        NAME=attr.id,
-        RETURN_TYPE=conversion.output_type,
-        NATIVE_TYPE=conversion.input_type)
+    def AmendIndexer(self, element_type):
+        pass
 
-  def _AddConvertingSetter(self, attr, html_name, conversion):
-    self._members_emitter.Emit(
-        # TODO(sra): Use metadata to provide native name.
-        '\n  set $HTML_NAME($INPUT_TYPE value) {'
-        '\n    this._set_$HTML_NAME = $CONVERT(value);'
-        '\n  }'
-        '\n  set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {'
-        '\n    JS("void", "#.$NAME = #", this, value);'
-        '\n  }'
-        '\n',
-        CONVERT=conversion.function_name,
-        HTML_NAME=html_name,
-        NAME=attr.id,
-        INPUT_TYPE=conversion.input_type,
-        NATIVE_TYPE=conversion.output_type)
+    def RootClassName(self):
+        return 'Interceptor'
 
-  def AmendIndexer(self, element_type):
-    pass
+    def OmitOperationOverrides(self):
+        return True
 
-  def RootClassName(self):
-    return 'Interceptor'
-
-  def OmitOperationOverrides(self):
-    return True
-
-  def EmitOperation(self, info, html_name, dart_js_interop=False):
-    """
+    def EmitOperation(self, info, html_name, dart_js_interop=False):
+        """
     Arguments:
       info: An OperationInfo object.
     """
-    if self._HasCustomImplementation(info.name):
-      return
+        if self._HasCustomImplementation(info.name):
+            return
 
-    if IsPureInterface(self._interface.id, self._database):
-      self._AddInterfaceOperation(info, html_name)
-    elif info.callback_args:
-      self._AddFutureifiedOperation(info, html_name)
-    else:
-      if any(self._OperationRequiresConversions(op) for op in info.overloads):
-        lookupOp = "%s.%s" % (self._interface.id, html_name)
-        if (_GetPromiseOperationType(lookupOp) or info.type_name == 'Promise') and \
-          not _IsPromiseOperationGenerateCall(lookupOp):
-            self._AddDirectNativeOperation(info, html_name)
+        if IsPureInterface(self._interface.id, self._database):
+            self._AddInterfaceOperation(info, html_name)
+        elif info.callback_args:
+            self._AddFutureifiedOperation(info, html_name)
         else:
-          # Any conversions needed?
-          self._AddOperationWithConversions(info, html_name)
-      else:
-        self._AddDirectNativeOperation(info, html_name)
+            if any(
+                    self._OperationRequiresConversions(op)
+                    for op in info.overloads):
+                lookupOp = "%s.%s" % (self._interface.id, html_name)
+                if (_GetPromiseOperationType(lookupOp) or info.type_name == 'Promise') and \
+                  not _IsPromiseOperationGenerateCall(lookupOp):
+                    self._AddDirectNativeOperation(info, html_name)
+                else:
+                    # Any conversions needed?
+                    self._AddOperationWithConversions(info, html_name)
+            else:
+                self._AddDirectNativeOperation(info, html_name)
 
-  def _computeResultType(self, checkType):
-    # TODO(terry): Work around bug in dart2js compiler e.g.,
-    #     typedef void CustomElementConstructor();
-    #     CustomElementConstructor registerElement(String type, [Map options])
-    # Needs to become:
-    #     Function registerElement(String type, [Map options])
-    resultType = checkType
-    if self._database.HasInterface(resultType):
-        resultInterface = self._database.GetInterface(resultType)
-        if 'Callback' in resultInterface.ext_attrs:
-            resultType = 'Function'
-    return resultType
+    def _computeResultType(self, checkType):
+        # TODO(terry): Work around bug in dart2js compiler e.g.,
+        #     typedef void CustomElementConstructor();
+        #     CustomElementConstructor registerElement(String type, [Map options])
+        # Needs to become:
+        #     Function registerElement(String type, [Map options])
+        resultType = checkType
+        if self._database.HasInterface(resultType):
+            resultInterface = self._database.GetInterface(resultType)
+            if 'Callback' in resultInterface.ext_attrs:
+                resultType = 'Function'
+        return resultType
 
-  def _zeroArgs(self, argsNames):
-    return 'JS("", "#.$NAME()", this)'
+    def _zeroArgs(self, argsNames):
+        return 'JS("", "#.$NAME()", this)'
 
-  def _manyArgs(self, numberArgs, argsNames):
-    argsPound = "#" if numberArgs == 1 else ("#, " * numberArgs)[:-2]
-    return '    JS("", "#.$NAME(%s)", this, %s)' % (argsPound, argsNames)
+    def _manyArgs(self, numberArgs, argsNames):
+        argsPound = "#" if numberArgs == 1 else ("#, " * numberArgs)[:-2]
+        return '    JS("", "#.$NAME(%s)", this, %s)' % (argsPound, argsNames)
 
-  """ If argument conversionsMapToDictionary is a list first entry is argument
+    """ If argument conversionsMapToDictionary is a list first entry is argument
       name and second entry signals if argument is optional (True). """
-  def _promiseToFutureCode(self, argsNames, conversionsMapToDictionary=None):
-    numberArgs = argsNames.count(',') + 1
-    jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
-        self._manyArgs(numberArgs, argsNames)
 
-    futureTemplate = []
-    if conversionsMapToDictionary is None:
-      futureTemplate = [
-        '\n'
-        '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) => $PROMISE_CALL(', jsCall, ');\n'
-      ]
-    else:
-      mapArg = conversionsMapToDictionary[0]
-      tempVariable = '%s_dict' % mapArg
-      mapArgOptional = conversionsMapToDictionary[1]
-
-      if argsNames.endswith('%s' % mapArg):
-        argsNames = '%s_dict' % argsNames
+    def _promiseToFutureCode(self, argsNames, conversionsMapToDictionary=None):
+        numberArgs = argsNames.count(',') + 1
         jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
             self._manyArgs(numberArgs, argsNames)
-      if mapArgOptional:
-        futureTemplate = [
-          # We will need to convert the Map argument to a Dictionary, test if mapArg is there (optional) then convert.
-          '\n'
-          '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) {\n',
-          '    var ', tempVariable, ' = null;\n',
-          '    if (', mapArg, ' != null) {\n',
-          '      ', tempVariable, ' = convertDartToNative_Dictionary(', mapArg, ');\n',
-          '    }\n',
-          '    return $PROMISE_CALL(', jsCall, ');\n',
-          '  }\n'
-        ]
-      else:
-        futureTemplate = [
-          # We will need to convert the Map argument to a Dictionary, the Map argument is not optional.
-          '\n'
-          '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) {\n',
-          '    var ', tempVariable, ' = convertDartToNative_Dictionary(', mapArg, ');\n',
-          '    return $PROMISE_CALL(', jsCall, ');\n',
-          '  }\n'
-        ]
 
-    return "".join(futureTemplate)
-
-  def _AddDirectNativeOperation(self, info, html_name):
-    force_optional = True if html_name.startswith('_') else False
-    resultType = self._computeResultType(info.type_name)
-
-    if info.type_name == 'Promise' and not(force_optional):
-      lookupOp = "%s.%s" % (self._interface.id, html_name)
-      promiseFound = _GetPromiseOperationType(lookupOp)
-      promiseType = 'Future'
-      promiseCall = 'promiseToFuture'
-      if promiseFound is not(None):
-        paramType = promiseFound['type']
-        if 'maplike' in promiseFound:
-          if paramType == 'dictionary':
-            promiseCall = 'promiseToFuture<dynamic>'
-            promiseType = 'Future'
-          else:
-            promiseCall = 'promiseToFuture<%s>' % paramType
-            promiseType = 'Future<%s>' % paramType
-        elif paramType == 'dictionary':
-          # It's a dictionary so return as a Map.
-          promiseCall = 'promiseToFutureAsMap'
-          promiseType = 'Future<Map<String, dynamic>>'
+        futureTemplate = []
+        if conversionsMapToDictionary is None:
+            futureTemplate = [
+                '\n'
+                '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) => $PROMISE_CALL(',
+                jsCall, ');\n'
+            ]
         else:
-          promiseCall = 'promiseToFuture<%s>' % paramType
-          promiseType = 'Future<%s>' % paramType
+            mapArg = conversionsMapToDictionary[0]
+            tempVariable = '%s_dict' % mapArg
+            mapArgOptional = conversionsMapToDictionary[1]
 
-      argsNames = info.ParametersAsArgumentList()
-      dictionary_argument = info.dictionaryArgumentName();
-      codeTemplate = self._promiseToFutureCode(argsNames, dictionary_argument)
-      self._members_emitter.Emit(codeTemplate,
-        RENAME=self._RenamingAnnotation(info.declared_name, html_name),
-        METADATA=self._Metadata(info.type_name, info.declared_name,
-            self.SecureOutputType(info.type_name)),
-        MODIFIERS='static ' if info.IsStatic() else '',
-        TYPE=promiseType,
-        PROMISE_CALL=promiseCall,
-        NAME=html_name,
-        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
-    else:
-        self._members_emitter.Emit(
-        '\n'
-        '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
-        RENAME=self._RenamingAnnotation(info.declared_name, html_name),
-        METADATA=self._Metadata(info.type_name, info.declared_name,
-            self.SecureOutputType(info.type_name)),
-        MODIFIERS='static ' if info.IsStatic() else '',
-        TYPE=self.SecureOutputType(resultType, False, True),
-        NAME=html_name,
-        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType, force_optional))
+            if argsNames.endswith('%s' % mapArg):
+                argsNames = '%s_dict' % argsNames
+                jsCall = self._zeroArgs(argsNames) if len(argsNames) == 0 else \
+                    self._manyArgs(numberArgs, argsNames)
+            if mapArgOptional:
+                futureTemplate = [
+                    # We will need to convert the Map argument to a Dictionary, test if mapArg is there (optional) then convert.
+                    '\n'
+                    '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) {\n',
+                    '    var ',
+                    tempVariable,
+                    ' = null;\n',
+                    '    if (',
+                    mapArg,
+                    ' != null) {\n',
+                    '      ',
+                    tempVariable,
+                    ' = convertDartToNative_Dictionary(',
+                    mapArg,
+                    ');\n',
+                    '    }\n',
+                    '    return $PROMISE_CALL(',
+                    jsCall,
+                    ');\n',
+                    '  }\n'
+                ]
+            else:
+                futureTemplate = [
+                    # We will need to convert the Map argument to a Dictionary, the Map argument is not optional.
+                    '\n'
+                    '  $RENAME$METADATA$MODIFIERS $TYPE $NAME($PARAMS) {\n',
+                    '    var ',
+                    tempVariable,
+                    ' = convertDartToNative_Dictionary(',
+                    mapArg,
+                    ');\n',
+                    '    return $PROMISE_CALL(',
+                    jsCall,
+                    ');\n',
+                    '  }\n'
+                ]
 
-  def _AddOperationWithConversions(self, info, html_name):
-    # Assert all operations have same return type.
-    assert len(set([op.type.id for op in info.operations])) == 1
+        return "".join(futureTemplate)
 
-    resultType = self._computeResultType(info.type_name)
+    def _AddDirectNativeOperation(self, info, html_name):
+        force_optional = True if html_name.startswith('_') else False
+        resultType = self._computeResultType(info.type_name)
 
-    output_conversion = self._OutputConversion(resultType,
-                                               info.declared_name)
-    if output_conversion:
-      return_type = output_conversion.output_type
-      native_return_type = output_conversion.input_type
-    else:
-      return_type = resultType if resultType == 'Function' else self._NarrowInputType(resultType)
-      native_return_type = return_type
+        if info.type_name == 'Promise' and not (force_optional):
+            lookupOp = "%s.%s" % (self._interface.id, html_name)
+            promiseFound = _GetPromiseOperationType(lookupOp)
+            promiseType = 'Future'
+            promiseCall = 'promiseToFuture'
+            if promiseFound is not (None):
+                paramType = promiseFound['type']
+                if 'maplike' in promiseFound:
+                    if paramType == 'dictionary':
+                        promiseCall = 'promiseToFuture<dynamic>'
+                        promiseType = 'Future'
+                    else:
+                        promiseCall = 'promiseToFuture<%s>' % paramType
+                        promiseType = 'Future<%s>' % paramType
+                elif paramType == 'dictionary':
+                    # It's a dictionary so return as a Map.
+                    promiseCall = 'promiseToFutureAsMap'
+                    promiseType = 'Future<Map<String, dynamic>>'
+                else:
+                    promiseCall = 'promiseToFuture<%s>' % paramType
+                    promiseType = 'Future<%s>' % paramType
 
-    parameter_names = [param_info.name for param_info in info.param_infos]
-    parameter_types = [self._InputType(param_info.type_id, info)
-                       for param_info in info.param_infos]
-    operations = info.operations
+            argsNames = info.ParametersAsArgumentList()
+            dictionary_argument = info.dictionaryArgumentName()
+            codeTemplate = self._promiseToFutureCode(argsNames,
+                                                     dictionary_argument)
+            self._members_emitter.Emit(
+                codeTemplate,
+                RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+                METADATA=self._Metadata(info.type_name, info.declared_name,
+                                        self.SecureOutputType(info.type_name)),
+                MODIFIERS='static ' if info.IsStatic() else '',
+                TYPE=promiseType,
+                PROMISE_CALL=promiseCall,
+                NAME=html_name,
+                PARAMS=info.ParametersAsDeclaration(self._NarrowInputType,
+                                                    force_optional))
+        else:
+            self._members_emitter.Emit(
+                '\n'
+                '  $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n',
+                RENAME=self._RenamingAnnotation(info.declared_name, html_name),
+                METADATA=self._Metadata(info.type_name, info.declared_name,
+                                        self.SecureOutputType(info.type_name)),
+                MODIFIERS='static ' if info.IsStatic() else '',
+                TYPE=self.SecureOutputType(resultType, False, True),
+                NAME=html_name,
+                PARAMS=info.ParametersAsDeclaration(self._NarrowInputType,
+                                                    force_optional))
 
-    def InputType(type_name):
-        return self._InputType(type_name, info)
+    def _AddOperationWithConversions(self, info, html_name):
+        # Assert all operations have same return type.
+        assert len(set([op.type.id for op in info.operations])) == 1
 
-    def GenerateCall(
-        stmts_emitter, call_emitter, version, operation, argument_count):
-      target = '_%s_%d' % (
-          html_name[1:] if html_name.startswith('_') else html_name, version);
+        resultType = self._computeResultType(info.type_name)
 
-      (target_parameters, arguments, calling_params) = self._ConvertArgumentTypes(
-          stmts_emitter, operation.arguments, argument_count, info)
+        output_conversion = self._OutputConversion(resultType,
+                                                   info.declared_name)
+        if output_conversion:
+            return_type = output_conversion.output_type
+            native_return_type = output_conversion.input_type
+        else:
+            return_type = resultType if resultType == 'Function' else self._NarrowInputType(
+                resultType)
+            native_return_type = return_type
 
-      argument_list = ', '.join(arguments)
-      # TODO(sra): If the native method has zero type checks, we can 'inline' is
-      # and call it directly with a JS-expression.
-      call = '%s(%s)' % (target, argument_list)
-
-      if output_conversion:
-        call = '%s(%s)' % (output_conversion.function_name, call)
-
-      call_emitter.Emit(call)
-
-      if (native_return_type == 'Future'):
-        hashArgs = ''
-        if argument_count > 0:
-          if argument_count < 20:
-            hashArgs = '#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#'[:argument_count * 2 - 1]
-          else:
-            print "ERROR: Arguments exceede 20 - please fix Python code to handle more."
-        self._members_emitter.Emit(
-            '  $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) =>\n'
-            '      promiseToFuture(JS("", "#.$JSNAME($HASH_STR)", this$CALLING_PARAMS));\n',
-            RENAME=self._RenamingAnnotation(info.declared_name, target),
-            METADATA=self._Metadata(info.type_name, info.declared_name, None),
-            MODIFIERS='static ' if info.IsStatic() else '',
-            TYPE=TypeOrNothing(native_return_type),
-            TARGET=target,
-            PARAMS=', '.join(target_parameters),
-            JSNAME=operation.id,
-            HASH_STR=hashArgs,
-            CALLING_PARAMS=calling_params)
-      else:
-        self._members_emitter.Emit(
-            '  $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) native;\n',
-            RENAME=self._RenamingAnnotation(info.declared_name, target),
-            METADATA=self._Metadata(info.type_name, info.declared_name, None),
-            MODIFIERS='static ' if info.IsStatic() else '',
-            TYPE=TypeOrNothing(native_return_type),
-            TARGET=target,
-            PARAMS=', '.join(target_parameters))
-
-    # private methods don't need named arguments.
-    full_name = '%s.%s' % (self._interface.id, info.declared_name)
-    force_optional = False if hasNamedFormals(full_name) and not(html_name.startswith('_')) else True
-
-    declaration = '%s%s%s %s(%s)' % (
-        self._Metadata(info.type_name, info.declared_name, return_type),
-        'static ' if info.IsStatic() else '',
-        return_type,
-        html_name,
-        info.ParametersAsDeclaration(InputType, force_optional))
-    self._GenerateDispatcherBody(
-        info,
-        operations,
-        declaration,
-        GenerateCall,
-        IsOptional,
-        can_omit_type_check=lambda type, pos: type == parameter_types[pos])
-
-  def _AddInterfaceOperation(self, info, html_name):
-    self._members_emitter.Emit(
-        '\n'
-        '  $TYPE $NAME($PARAMS);\n',
-        TYPE=self.SecureOutputType(info.type_name, False, True),
-        NAME=html_name,
-        PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
-
-
-  def _OperationRequiresConversions(self, operation):
-    return (self._OperationRequiresOutputConversion(operation) or
-            self._OperationRequiresInputConversions(operation))
-
-  def _OperationRequiresOutputConversion(self, operation):
-    return self._OutputConversion(operation.type.id, operation.id)
-
-  def _OperationRequiresInputConversions(self, operation):
-    return any(self._InputConversion(arg.type.id, operation.id)
-               for arg in operation.arguments)
-
-  def _OutputConversion(self, idl_type, member):
-    return FindConversion(idl_type, 'get', self._interface.id, member)
-
-  def _InputConversion(self, idl_type, member):
-    return FindConversion(idl_type, 'set', self._interface.id, member)
-
-  def _HasCustomImplementation(self, member_name):
-    member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
-    return member_name in _js_custom_members
-
-  def _ForcePropertyMember(self, member_name):
-    member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
-    return member_name in _force_property_members
-
-  def _SafeToIgnoreShadowingMember(self, member_name):
-    member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
-    return member_name in _safe_to_ignore_shadowing_members
-
-  def _RenamingAnnotation(self, idl_name, member_name):
-    if member_name != idl_name:
-      return  "@JSName('%s')\n  " % idl_name
-    return ''
-
-  def _Metadata(self, idl_type, idl_member_name, dart_type, indent='  '):
-    anns = self._metadata.GetDart2JSMetadata(
-        idl_type, self._library_name, self._interface, idl_member_name)
-
-    if not self._metadata.AnyConversionAnnotations(
-        idl_type, self._interface.id, idl_member_name):
-      return_type = self.SecureOutputType(idl_type)
-      native_type = self._NarrowToImplementationType(idl_type)
-
-      if native_type != return_type:
-        anns = anns + [
-          "@Returns('%s|Null')" % native_type,
-          "@Creates('%s')" % native_type,
+        parameter_names = [param_info.name for param_info in info.param_infos]
+        parameter_types = [
+            self._InputType(param_info.type_id, info)
+            for param_info in info.param_infos
         ]
-    if dart_type == 'dynamic' or dart_type == 'Object':
-      def js_type_annotation(ann):
-        return re.search('^@.*Returns', ann) or re.search('^@.*Creates', ann)
-      if not filter(js_type_annotation, anns):
-        _logger.warn('Member with wildcard native type: %s.%s' %
-            (self._interface.id, idl_member_name))
+        operations = info.operations
 
-    return self._metadata.FormatMetadata(anns, indent);
+        def InputType(type_name):
+            return self._InputType(type_name, info)
 
-  def CustomJSMembers(self):
-    return _js_custom_members
+        def GenerateCall(stmts_emitter, call_emitter, version, operation,
+                         argument_count):
+            target = '_%s_%d' % (html_name[1:] if html_name.startswith('_') else
+                                 html_name, version)
 
-  def _FindShadowedAttribute(self, attr):
-    """Returns (attribute, superinterface) or (None, None)."""
-    def FindInParent(interface):
-      """Returns matching attribute in parent, or None."""
-      if interface.parents:
-        parent = interface.parents[0]
-        if IsDartCollectionType(parent.type.id):
-          return (None, None)
-        if IsPureInterface(parent.type.id, self._database):
-          return (None, None)
-        if self._database.HasInterface(parent.type.id):
-          interfaces_to_search_in = []
-          parent_interface_name = parent.type.id
-          interfaces_to_search_in.append(parent_interface_name)
-          parent_type_info = self._type_registry.TypeInfo(parent_interface_name)
-          if parent_type_info.merged_into():
-            # IDL parent was merged into another interface, which became a
-            # parent interface in Dart.
-            parent_interface_name = parent_type_info.merged_into()
-            interfaces_to_search_in.append(parent_interface_name)
-          elif parent_type_info.merged_interface():
-            # IDL parent has another interface that was merged into it.
-            interfaces_to_search_in.append(parent_type_info.merged_interface())
+            (target_parameters, arguments,
+             calling_params) = self._ConvertArgumentTypes(
+                 stmts_emitter, operation.arguments, argument_count, info)
 
-          for interface_name in interfaces_to_search_in:
-            interface = self._database.GetInterface(interface_name)
-            attr2 = FindMatchingAttribute(interface, attr)
-            if attr2:
-              return (attr2, parent_interface_name)
+            argument_list = ', '.join(arguments)
+            # TODO(sra): If the native method has zero type checks, we can 'inline' is
+            # and call it directly with a JS-expression.
+            call = '%s(%s)' % (target, argument_list)
 
-          return FindInParent(
-              self._database.GetInterface(parent_interface_name))
-      return (None, None)
+            if output_conversion:
+                call = '%s(%s)' % (output_conversion.function_name, call)
 
-    return FindInParent(self._interface) if attr else (None, None)
+            call_emitter.Emit(call)
+
+            if (native_return_type == 'Future'):
+                hashArgs = ''
+                if argument_count > 0:
+                    if argument_count < 20:
+                        hashArgs = '#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#,#' [:
+                                                                                argument_count
+                                                                                *
+                                                                                2
+                                                                                -
+                                                                                1]
+                    else:
+                        print "ERROR: Arguments exceede 20 - please fix Python code to handle more."
+                self._members_emitter.Emit(
+                    '  $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) =>\n'
+                    '      promiseToFuture(JS("", "#.$JSNAME($HASH_STR)", this$CALLING_PARAMS));\n',
+                    RENAME=self._RenamingAnnotation(info.declared_name, target),
+                    METADATA=self._Metadata(info.type_name, info.declared_name,
+                                            None),
+                    MODIFIERS='static ' if info.IsStatic() else '',
+                    TYPE=TypeOrNothing(native_return_type),
+                    TARGET=target,
+                    PARAMS=', '.join(target_parameters),
+                    JSNAME=operation.id,
+                    HASH_STR=hashArgs,
+                    CALLING_PARAMS=calling_params)
+            else:
+                self._members_emitter.Emit(
+                    '  $RENAME$METADATA$MODIFIERS$TYPE$TARGET($PARAMS) native;\n',
+                    RENAME=self._RenamingAnnotation(info.declared_name, target),
+                    METADATA=self._Metadata(info.type_name, info.declared_name,
+                                            None),
+                    MODIFIERS='static ' if info.IsStatic() else '',
+                    TYPE=TypeOrNothing(native_return_type),
+                    TARGET=target,
+                    PARAMS=', '.join(target_parameters))
+
+        # private methods don't need named arguments.
+        full_name = '%s.%s' % (self._interface.id, info.declared_name)
+        force_optional = False if hasNamedFormals(full_name) and not (
+            html_name.startswith('_')) else True
+
+        declaration = '%s%s%s %s(%s)' % (
+            self._Metadata(info.type_name, info.declared_name, return_type),
+            'static ' if info.IsStatic() else '', return_type, html_name,
+            info.ParametersAsDeclaration(InputType, force_optional))
+        self._GenerateDispatcherBody(
+            info,
+            operations,
+            declaration,
+            GenerateCall,
+            IsOptional,
+            can_omit_type_check=lambda type, pos: type == parameter_types[pos])
+
+    def _AddInterfaceOperation(self, info, html_name):
+        self._members_emitter.Emit(
+            '\n'
+            '  $TYPE $NAME($PARAMS);\n',
+            TYPE=self.SecureOutputType(info.type_name, False, True),
+            NAME=html_name,
+            PARAMS=info.ParametersAsDeclaration(self._NarrowInputType))
+
+    def _OperationRequiresConversions(self, operation):
+        return (self._OperationRequiresOutputConversion(operation) or
+                self._OperationRequiresInputConversions(operation))
+
+    def _OperationRequiresOutputConversion(self, operation):
+        return self._OutputConversion(operation.type.id, operation.id)
+
+    def _OperationRequiresInputConversions(self, operation):
+        return any(
+            self._InputConversion(arg.type.id, operation.id)
+            for arg in operation.arguments)
+
+    def _OutputConversion(self, idl_type, member):
+        return FindConversion(idl_type, 'get', self._interface.id, member)
+
+    def _InputConversion(self, idl_type, member):
+        return FindConversion(idl_type, 'set', self._interface.id, member)
+
+    def _HasCustomImplementation(self, member_name):
+        member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
+        return member_name in _js_custom_members
+
+    def _ForcePropertyMember(self, member_name):
+        member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
+        return member_name in _force_property_members
+
+    def _SafeToIgnoreShadowingMember(self, member_name):
+        member_name = '%s.%s' % (self._interface.doc_js_name, member_name)
+        return member_name in _safe_to_ignore_shadowing_members
+
+    def _RenamingAnnotation(self, idl_name, member_name):
+        if member_name != idl_name:
+            return "@JSName('%s')\n  " % idl_name
+        return ''
+
+    def _Metadata(self, idl_type, idl_member_name, dart_type, indent='  '):
+        anns = self._metadata.GetDart2JSMetadata(
+            idl_type, self._library_name, self._interface, idl_member_name)
+
+        if not self._metadata.AnyConversionAnnotations(
+                idl_type, self._interface.id, idl_member_name):
+            return_type = self.SecureOutputType(idl_type)
+            native_type = self._NarrowToImplementationType(idl_type)
+
+            if native_type != return_type:
+                anns = anns + [
+                    "@Returns('%s|Null')" % native_type,
+                    "@Creates('%s')" % native_type,
+                ]
+        if dart_type == 'dynamic' or dart_type == 'Object':
+
+            def js_type_annotation(ann):
+                return re.search('^@.*Returns', ann) or re.search(
+                    '^@.*Creates', ann)
+
+            if not filter(js_type_annotation, anns):
+                _logger.warn('Member with wildcard native type: %s.%s' %
+                             (self._interface.id, idl_member_name))
+
+        return self._metadata.FormatMetadata(anns, indent)
+
+    def CustomJSMembers(self):
+        return _js_custom_members
+
+    def _FindShadowedAttribute(self, attr):
+        """Returns (attribute, superinterface) or (None, None)."""
+
+        def FindInParent(interface):
+            """Returns matching attribute in parent, or None."""
+            if interface.parents:
+                parent = interface.parents[0]
+                if IsDartCollectionType(parent.type.id):
+                    return (None, None)
+                if IsPureInterface(parent.type.id, self._database):
+                    return (None, None)
+                if self._database.HasInterface(parent.type.id):
+                    interfaces_to_search_in = []
+                    parent_interface_name = parent.type.id
+                    interfaces_to_search_in.append(parent_interface_name)
+                    parent_type_info = self._type_registry.TypeInfo(
+                        parent_interface_name)
+                    if parent_type_info.merged_into():
+                        # IDL parent was merged into another interface, which became a
+                        # parent interface in Dart.
+                        parent_interface_name = parent_type_info.merged_into()
+                        interfaces_to_search_in.append(parent_interface_name)
+                    elif parent_type_info.merged_interface():
+                        # IDL parent has another interface that was merged into it.
+                        interfaces_to_search_in.append(
+                            parent_type_info.merged_interface())
+
+                    for interface_name in interfaces_to_search_in:
+                        interface = self._database.GetInterface(interface_name)
+                        attr2 = FindMatchingAttribute(interface, attr)
+                        if attr2:
+                            return (attr2, parent_interface_name)
+
+                    return FindInParent(
+                        self._database.GetInterface(parent_interface_name))
+            return (None, None)
+
+        return FindInParent(self._interface) if attr else (None, None)
+
 
 # ------------------------------------------------------------------------------
 
+
 class DartLibraryEmitter():
-  def __init__(self, multiemitter, dart_sources_dir, dart_libraries):
-    self._multiemitter = multiemitter
-    self._dart_sources_dir = dart_sources_dir
-    self._path_to_emitter = {}
-    self._dart_libraries = dart_libraries
 
-  def FileEmitter(self, basename, library_name, template=None):
-    aux_dir = os.path.join(self._dart_sources_dir, library_name)
-    path = os.path.join(aux_dir, '%s.dart' % basename)
-    if not path in self._path_to_emitter:
-      emitter = self._multiemitter.FileEmitter(path)
-      if not template is None:
-        emitter = emitter.Emit(template)
-      self._path_to_emitter[path] = emitter
+    def __init__(self, multiemitter, dart_sources_dir, dart_libraries):
+        self._multiemitter = multiemitter
+        self._dart_sources_dir = dart_sources_dir
+        self._path_to_emitter = {}
+        self._dart_libraries = dart_libraries
 
-      self._dart_libraries.AddFile(basename, library_name, path)
-    return self._path_to_emitter[path]
+    def FileEmitter(self, basename, library_name, template=None):
+        aux_dir = os.path.join(self._dart_sources_dir, library_name)
+        path = os.path.join(aux_dir, '%s.dart' % basename)
+        if not path in self._path_to_emitter:
+            emitter = self._multiemitter.FileEmitter(path)
+            if not template is None:
+                emitter = emitter.Emit(template)
+            self._path_to_emitter[path] = emitter
 
-  def AddTypeEntry(self, basename, idl_name, dart_name):
-    self._dart_libraries.AddTypeEntry(basename, idl_name, dart_name)
+            self._dart_libraries.AddFile(basename, library_name, path)
+        return self._path_to_emitter[path]
 
-  def EmitLibraries(self, auxiliary_dir, dart_js_interop):
-    self._dart_libraries.Emit(self._multiemitter, auxiliary_dir)
+    def AddTypeEntry(self, basename, idl_name, dart_name):
+        self._dart_libraries.AddTypeEntry(basename, idl_name, dart_name)
+
+    def EmitLibraries(self, auxiliary_dir, dart_js_interop):
+        self._dart_libraries.Emit(self._multiemitter, auxiliary_dir)
+
 
 # ------------------------------------------------------------------------------
 class DartLibrary():
-  def __init__(self, name, template_loader, library_type, output_dir, dart_js_interop):
-    self._template = template_loader.Load(
-        '%s_%s.darttemplate' % (name, library_type))
-    self._dart_path = os.path.join(
-        output_dir, '%s_%s.dart' % (name, library_type))
-    self._paths = []
-    self._typeMap = {}
-    self._dart_js_interop = dart_js_interop
 
-  def AddFile(self, path):
-    self._paths.append(path)
+    def __init__(self, name, template_loader, library_type, output_dir,
+                 dart_js_interop):
+        self._template = template_loader.Load(
+            '%s_%s.darttemplate' % (name, library_type))
+        self._dart_path = os.path.join(output_dir,
+                                       '%s_%s.dart' % (name, library_type))
+        self._paths = []
+        self._typeMap = {}
+        self._dart_js_interop = dart_js_interop
 
-  def AddTypeEntry(self, idl_name, dart_name):
-    self._typeMap[idl_name] = dart_name
+    def AddFile(self, path):
+        self._paths.append(path)
 
-  def Emit(self, emitter, auxiliary_dir):
-    def massage_path(path):
-      # The most robust way to emit path separators is to use / always.
-      return path.replace('\\', '/')
+    def AddTypeEntry(self, idl_name, dart_name):
+        self._typeMap[idl_name] = dart_name
 
-    library_emitter = emitter.FileEmitter(self._dart_path)
-    library_file_dir = os.path.dirname(self._dart_path)
-    auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir)
-    emitters = library_emitter.Emit(
-        self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
-    if isinstance(emitters, tuple):
-      imports_emitter, map_emitter = emitters
-    else:
-      imports_emitter, map_emitter = emitters, None
+    def Emit(self, emitter, auxiliary_dir):
 
-    for path in sorted(self._paths):
-      relpath = os.path.relpath(path, library_file_dir)
-      imports_emitter.Emit(
-          "part '$PATH';\n", PATH=massage_path(relpath))
+        def massage_path(path):
+            # The most robust way to emit path separators is to use / always.
+            return path.replace('\\', '/')
 
-    # Emit the $!TYPE_MAP
-    if map_emitter:
-      items = self._typeMap.items()
-      items.sort()
-      for (idl_name, dart_name) in items:
-        map_emitter.Emit(
-          "  '$IDL_NAME': () => $DART_NAME.instanceRuntimeType,\n",
-          IDL_NAME=idl_name,
-          DART_NAME=dart_name)
+        library_emitter = emitter.FileEmitter(self._dart_path)
+        library_file_dir = os.path.dirname(self._dart_path)
+        auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir)
+        emitters = library_emitter.Emit(
+            self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
+        if isinstance(emitters, tuple):
+            imports_emitter, map_emitter = emitters
+        else:
+            imports_emitter, map_emitter = emitters, None
+
+        for path in sorted(self._paths):
+            relpath = os.path.relpath(path, library_file_dir)
+            imports_emitter.Emit("part '$PATH';\n", PATH=massage_path(relpath))
+
+        # Emit the $!TYPE_MAP
+        if map_emitter:
+            items = self._typeMap.items()
+            items.sort()
+            for (idl_name, dart_name) in items:
+                map_emitter.Emit(
+                    "  '$IDL_NAME': () => $DART_NAME.instanceRuntimeType,\n",
+                    IDL_NAME=idl_name,
+                    DART_NAME=dart_name)
 
 
 # ------------------------------------------------------------------------------
 
+
 class DartLibraries():
-  def __init__(self, libraries, template_loader, library_type, output_dir, dart_js_interop):
-    self._libraries = {}
-    for library_name in libraries:
-      self._libraries[library_name] = DartLibrary(
-          library_name, template_loader, library_type, output_dir, dart_js_interop)
 
-  def AddFile(self, basename, library_name, path):
-    self._libraries[library_name].AddFile(path)
+    def __init__(self, libraries, template_loader, library_type, output_dir,
+                 dart_js_interop):
+        self._libraries = {}
+        for library_name in libraries:
+            self._libraries[library_name] = DartLibrary(
+                library_name, template_loader, library_type, output_dir,
+                dart_js_interop)
 
-  def AddTypeEntry(self, library_name, idl_name, dart_name):
-    self._libraries[library_name].AddTypeEntry(idl_name, dart_name)
+    def AddFile(self, basename, library_name, path):
+        self._libraries[library_name].AddFile(path)
 
-  def Emit(self, emitter, auxiliary_dir):
-    for lib in self._libraries.values():
-      lib.Emit(emitter, auxiliary_dir)
+    def AddTypeEntry(self, library_name, idl_name, dart_name):
+        self._libraries[library_name].AddTypeEntry(idl_name, dart_name)
+
+    def Emit(self, emitter, auxiliary_dir):
+        for lib in self._libraries.values():
+            lib.Emit(emitter, auxiliary_dir)
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 31276a7..5abcb92 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -2,7 +2,6 @@
 # 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 module provides shared functionality for the systems to generate
 native binding from the IDL database."""
 
@@ -18,11 +17,14 @@
 
 # TODO(vsm): This should be recoverable from IDL, but we appear to not
 # track the necessary info.
-_url_utils = ['hash', 'host', 'hostname', 'origin',
-              'password', 'pathname', 'port', 'protocol',
-              'search', 'username']
+_url_utils = [
+    'hash', 'host', 'hostname', 'origin', 'password', 'pathname', 'port',
+    'protocol', 'search', 'username'
+]
 
-_promise_to_future = Conversion('convertNativePromiseToDartFuture', 'dynamic', 'Future')
+_promise_to_future = Conversion('convertNativePromiseToDartFuture', 'dynamic',
+                                'Future')
+
 
 def array_type(data_type):
     matched = re.match(r'([\w\d_\s]+)\[\]', data_type)
@@ -30,665 +32,722 @@
         return None
     return matched.group(1)
 
+
 _sequence_matcher = re.compile('sequence\<(.+)\>')
 
+
 def TypeIdToBlinkName(interface_id, database):
-  # Maybe should use the type_registry here?
-  if database.HasEnum(interface_id):
-    return "DOMString" # All enums are strings.
+    # Maybe should use the type_registry here?
+    if database.HasEnum(interface_id):
+        return "DOMString"  # All enums are strings.
 
-  seq_match = _sequence_matcher.match(interface_id)
-  if seq_match is not None:
-    t = TypeIdToBlinkName(seq_match.group(1), database)
-    return "sequence<%s>" % t
+    seq_match = _sequence_matcher.match(interface_id)
+    if seq_match is not None:
+        t = TypeIdToBlinkName(seq_match.group(1), database)
+        return "sequence<%s>" % t
 
-  arr_match = array_type(interface_id)
-  if arr_match is not None:
-    t = TypeIdToBlinkName(arr_match, database)
-    return "%s[]" % t
+    arr_match = array_type(interface_id)
+    if arr_match is not None:
+        t = TypeIdToBlinkName(arr_match, database)
+        return "%s[]" % t
 
-  return interface_id
+    return interface_id
+
 
 def DeriveQualifiedName(library_name, name):
     return library_name + "." + name
 
+
 def DeriveBlinkClassName(name):
     return "Blink" + name
 
+
 _type_encoding_map = {
-  'long long': "ll",
-  'unsigned long': "ul",
-  'unsigned long long': "ull",
-  'unsigned short': "us",
+    'long long': "ll",
+    'unsigned long': "ul",
+    'unsigned long long': "ull",
+    'unsigned short': "us",
 }
 
+
 def EncodeType(t):
 
-  seq_match = _sequence_matcher.match(t)
-  if seq_match is not None:
-    t2 = EncodeType(seq_match.group(1))
-    t = "SEQ_%s_SEQ" % t2
-    return t
+    seq_match = _sequence_matcher.match(t)
+    if seq_match is not None:
+        t2 = EncodeType(seq_match.group(1))
+        t = "SEQ_%s_SEQ" % t2
+        return t
 
-  arr_match = array_type(t)
-  if arr_match is not None:
-    t = EncodeType(arr_match)
-    return "A_%s_A" % t
+    arr_match = array_type(t)
+    if arr_match is not None:
+        t = EncodeType(arr_match)
+        return "A_%s_A" % t
 
-  return _type_encoding_map.get(t) or t
+    return _type_encoding_map.get(t) or t
+
 
 class DartiumBackend(HtmlDartGenerator):
-  """Generates Dart implementation for one DOM IDL interface."""
+    """Generates Dart implementation for one DOM IDL interface."""
 
-  def __init__(self, interface, cpp_library_emitter, options, loggerParent):
-    super(DartiumBackend, self).__init__(interface, options, True, loggerParent)
+    def __init__(self, interface, cpp_library_emitter, options, loggerParent):
+        super(DartiumBackend, self).__init__(interface, options, True,
+                                             loggerParent)
 
-    self._interface = interface
-    self._cpp_library_emitter = cpp_library_emitter
-    self._database = options.database
-    self._template_loader = options.templates
-    self._type_registry = options.type_registry
-    self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
-    self._metadata = options.metadata
-    # These get initialized by StartInterface
-    self._cpp_header_emitter = None
-    self._cpp_impl_emitter = None
-    self._members_emitter = None
-    self._cpp_declarations_emitter = None
-    self._cpp_impl_includes = None
-    self._cpp_definitions_emitter = None
-    self._cpp_resolver_emitter = None
-    self._dart_js_interop = options.dart_js_interop
-    _logger.setLevel(loggerParent.level)
+        self._interface = interface
+        self._cpp_library_emitter = cpp_library_emitter
+        self._database = options.database
+        self._template_loader = options.templates
+        self._type_registry = options.type_registry
+        self._interface_type_info = self._type_registry.TypeInfo(
+            self._interface.id)
+        self._metadata = options.metadata
+        # These get initialized by StartInterface
+        self._cpp_header_emitter = None
+        self._cpp_impl_emitter = None
+        self._members_emitter = None
+        self._cpp_declarations_emitter = None
+        self._cpp_impl_includes = None
+        self._cpp_definitions_emitter = None
+        self._cpp_resolver_emitter = None
+        self._dart_js_interop = options.dart_js_interop
+        _logger.setLevel(loggerParent.level)
 
-  def ImplementsMergedMembers(self):
-    # We could not add merged functions to implementation class because
-    # underlying c++ object doesn't implement them. Merged functions are
-    # generated on merged interface implementation instead.
-    return False
-
-  def CustomJSMembers(self):
-    return {}
-
-  def _OutputConversion(self, idl_type, member):
-    conversion = FindConversion(idl_type, 'get', self._interface.id, member)
-    # TODO(jacobr) handle promise consistently in dart2js and dartium.
-    if idl_type == 'Promise':
-      return _promise_to_future
-    if conversion:
-      if conversion.function_name in ('convertNativeToDart_DateTime', 'convertNativeToDart_ImageData'):
-        return None
-    return conversion
-
-  def _InputConversion(self, idl_type, member):
-    return FindConversion(idl_type, 'set', self._interface.id, member)
-
-  def GenerateCallback(self, info):
-    return None
-
-  def ImplementationTemplate(self):
-    template = None
-    interface_name = self._interface.doc_js_name
-    if interface_name == self._interface.id or not self._database.HasInterface(interface_name):
-      template_file = 'impl_%s.darttemplate' % interface_name
-      template = self._template_loader.TryLoad(template_file)
-    if not template:
-      template = self._template_loader.Load('dart_implementation.darttemplate')
-    return template
-
-  def RootClassName(self):
-    return 'DartHtmlDomObject'
-
-  # This code matches up with the _generate_native_entry code in
-  # dart_utilities.py in the dartium repository.  Any changes to this
-  # should have matching changes on that end.
-  def DeriveNativeEntry(self, name, kind, count):
-    interface_id = self._interface.id
-    database = self._database
-    tag = ""
-    if kind == 'Getter':
-        tag = "%s_Getter" % name
-        blink_entry = tag
-    elif kind == 'Setter':
-        tag = "%s_Setter" % name
-        blink_entry = tag
-    elif kind == 'Constructor':
-        tag = "constructorCallback"
-        blink_entry = tag
-    elif kind == 'Method':
-        tag = "%s_Callback" % name
-        blink_entry = tag
-
-    interface_id = TypeIdToBlinkName(interface_id, database)
-
-    def mkPublic(s):
-      if s.startswith("_") or s.startswith("$"):
-        return "$" + s
-      return s
-
-    if count is not None:
-      arity = str(count)
-      dart_name = mkPublic("_".join([tag, arity]))
-    else:
-      dart_name = mkPublic(tag)
-    resolver_string = "_".join([interface_id, tag])
-
-    return (dart_name, resolver_string)
-
-
-  def DeriveNativeName(self, name, suffix=""):
-      fields = ['$' + name]
-      if suffix != "":
-          fields.append(suffix)
-      return "_".join(fields)
-
-  def DeriveQualifiedBlinkName(self, interface_name, name):
-      blinkClass = DeriveQualifiedName(
-        "_blink", DeriveBlinkClassName(interface_name))
-      blinkInstance = DeriveQualifiedName(blinkClass, "instance")
-      return DeriveQualifiedName(blinkInstance, name + "_")
-
-  def NativeSpec(self):
-    return ''
-
-  def StartInterface(self, members_emitter):
-    # Create emitters for c++ implementation.
-    if not IsPureInterface(self._interface.id, self._database) and \
-        not IsCustomType(self._interface.id):
-      self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
-        self._interface.id,
-        self._renamer.GetLibraryName(self._interface))
-      self._cpp_impl_emitter = \
-        self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
-    else:
-      self._cpp_header_emitter = emitter.Emitter()
-      self._cpp_impl_emitter = emitter.Emitter()
-
-    self._interface_type_info = self._TypeInfo(self._interface.id)
-    self._members_emitter = members_emitter
-
-    self._cpp_declarations_emitter = emitter.Emitter()
-
-    # This is a hack to work around a strange C++ compile error that we weren't
-    # able to track down the true cause of.
-    if self._interface.id == 'Timing':
-      self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
-
-    self._cpp_definitions_emitter = emitter.Emitter()
-    self._cpp_resolver_emitter = emitter.Emitter()
-
-    # We need to revisit our treatment of typed arrays, right now
-    # it is full of hacks.
-    if self._interface.ext_attrs.get('ConstructorTemplate') == 'TypedArray':
-      self._cpp_resolver_emitter.Emit(
-          '    if (name == "$(INTERFACE_NAME)_constructor_Callback")\n'
-          '        return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n',
-          INTERFACE_NAME=self._interface.id)
-
-      self._cpp_impl_includes.add('"DartArrayBufferViewCustom.h"');
-      self._cpp_definitions_emitter.Emit(
-        '\n'
-        'static void constructorCallback(Dart_NativeArguments args)\n'
-        '{\n'
-        '    WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n'
-        '}\n',
-        INTERFACE_NAME=self._interface.id);
-
-  def _EmitConstructorInfrastructure(self,
-      constructor_info, cpp_prefix, cpp_suffix, factory_method_name,
-      arguments=None, emit_to_native=False, is_custom=False):
-
-    constructor_callback_cpp_name = cpp_prefix + cpp_suffix
-
-    if arguments is None:
-        arguments = constructor_info.idl_args[0]
-        argument_count = len(arguments)
-    else:
-        argument_count = len(arguments)
-
-    typed_formals = constructor_info.ParametersAsArgumentList(argument_count)
-    parameters = constructor_info.ParametersAsStringOfVariables(argument_count)
-    interface_name =  self._interface_type_info.interface_name()
-
-    dart_native_name, constructor_callback_id = \
-        self.DeriveNativeEntry(cpp_suffix, 'Constructor', argument_count)
-
-    # Then we emit the impedance matching wrapper to call out to the
-    # toplevel wrapper
-    if not emit_to_native:
-        toplevel_name = \
-            self.DeriveQualifiedBlinkName(self._interface.id,
-                                          dart_native_name)
-        self._members_emitter.Emit(
-            '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
-            '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
-            INTERFACE_NAME=self._interface_type_info.interface_name(),
-            FACTORY_METHOD_NAME=factory_method_name,
-            PARAMETERS=typed_formals,
-            TOPLEVEL_NAME=toplevel_name,
-            OUTPARAMETERS=parameters)
-
-    self._cpp_resolver_emitter.Emit(
-        '    if (name == "$ID")\n'
-        '        return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n',
-        ID=constructor_callback_id,
-        WEBKIT_INTERFACE_NAME=self._interface.id,
-        CPP_CALLBACK=constructor_callback_cpp_name)
-
-  def GenerateCustomFactory(self, constructor_info):
-    if 'CustomConstructor' not in self._interface.ext_attrs:
+    def ImplementsMergedMembers(self):
+        # We could not add merged functions to implementation class because
+        # underlying c++ object doesn't implement them. Merged functions are
+        # generated on merged interface implementation instead.
         return False
 
-    annotations = self._metadata.GetFormattedMetadata(self._library_name,
-        self._interface, self._interface.id, '  ')
+    def CustomJSMembers(self):
+        return {}
 
-    self._members_emitter.Emit(
-        '\n  $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n',
-        ANNOTATIONS=annotations,
-        CTOR=constructor_info._ConstructorFullName(self._DartType),
-        PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
-        FACTORY_PARAMS= \
-            constructor_info.ParametersAsArgumentList())
+    def _OutputConversion(self, idl_type, member):
+        conversion = FindConversion(idl_type, 'get', self._interface.id, member)
+        # TODO(jacobr) handle promise consistently in dart2js and dartium.
+        if idl_type == 'Promise':
+            return _promise_to_future
+        if conversion:
+            if conversion.function_name in ('convertNativeToDart_DateTime',
+                                            'convertNativeToDart_ImageData'):
+                return None
+        return conversion
 
-    # MutationObserver has custom _create.  TODO(terry): Consider table but this is only one.
-    if self._interface.id != 'MutationObserver':
-        constructor_callback_cpp_name = 'constructorCallback'
-        self._EmitConstructorInfrastructure(
-            constructor_info, "", constructor_callback_cpp_name, '_create',
-            is_custom=True)
+    def _InputConversion(self, idl_type, member):
+        return FindConversion(idl_type, 'set', self._interface.id, member)
 
-        self._cpp_declarations_emitter.Emit(
-            '\n'
-            'void $CPP_CALLBACK(Dart_NativeArguments);\n',
+    def GenerateCallback(self, info):
+        return None
+
+    def ImplementationTemplate(self):
+        template = None
+        interface_name = self._interface.doc_js_name
+        if interface_name == self._interface.id or not self._database.HasInterface(
+                interface_name):
+            template_file = 'impl_%s.darttemplate' % interface_name
+            template = self._template_loader.TryLoad(template_file)
+        if not template:
+            template = self._template_loader.Load(
+                'dart_implementation.darttemplate')
+        return template
+
+    def RootClassName(self):
+        return 'DartHtmlDomObject'
+
+    # This code matches up with the _generate_native_entry code in
+    # dart_utilities.py in the dartium repository.  Any changes to this
+    # should have matching changes on that end.
+    def DeriveNativeEntry(self, name, kind, count):
+        interface_id = self._interface.id
+        database = self._database
+        tag = ""
+        if kind == 'Getter':
+            tag = "%s_Getter" % name
+            blink_entry = tag
+        elif kind == 'Setter':
+            tag = "%s_Setter" % name
+            blink_entry = tag
+        elif kind == 'Constructor':
+            tag = "constructorCallback"
+            blink_entry = tag
+        elif kind == 'Method':
+            tag = "%s_Callback" % name
+            blink_entry = tag
+
+        interface_id = TypeIdToBlinkName(interface_id, database)
+
+        def mkPublic(s):
+            if s.startswith("_") or s.startswith("$"):
+                return "$" + s
+            return s
+
+        if count is not None:
+            arity = str(count)
+            dart_name = mkPublic("_".join([tag, arity]))
+        else:
+            dart_name = mkPublic(tag)
+        resolver_string = "_".join([interface_id, tag])
+
+        return (dart_name, resolver_string)
+
+    def DeriveNativeName(self, name, suffix=""):
+        fields = ['$' + name]
+        if suffix != "":
+            fields.append(suffix)
+        return "_".join(fields)
+
+    def DeriveQualifiedBlinkName(self, interface_name, name):
+        blinkClass = DeriveQualifiedName("_blink",
+                                         DeriveBlinkClassName(interface_name))
+        blinkInstance = DeriveQualifiedName(blinkClass, "instance")
+        return DeriveQualifiedName(blinkInstance, name + "_")
+
+    def NativeSpec(self):
+        return ''
+
+    def StartInterface(self, members_emitter):
+        # Create emitters for c++ implementation.
+        if not IsPureInterface(self._interface.id, self._database) and \
+            not IsCustomType(self._interface.id):
+            self._cpp_header_emitter = self._cpp_library_emitter.CreateHeaderEmitter(
+                self._interface.id,
+                self._renamer.GetLibraryName(self._interface))
+            self._cpp_impl_emitter = \
+              self._cpp_library_emitter.CreateSourceEmitter(self._interface.id)
+        else:
+            self._cpp_header_emitter = emitter.Emitter()
+            self._cpp_impl_emitter = emitter.Emitter()
+
+        self._interface_type_info = self._TypeInfo(self._interface.id)
+        self._members_emitter = members_emitter
+
+        self._cpp_declarations_emitter = emitter.Emitter()
+
+        # This is a hack to work around a strange C++ compile error that we weren't
+        # able to track down the true cause of.
+        if self._interface.id == 'Timing':
+            self._cpp_impl_includes.add('"core/animation/TimedItem.h"')
+
+        self._cpp_definitions_emitter = emitter.Emitter()
+        self._cpp_resolver_emitter = emitter.Emitter()
+
+        # We need to revisit our treatment of typed arrays, right now
+        # it is full of hacks.
+        if self._interface.ext_attrs.get('ConstructorTemplate') == 'TypedArray':
+            self._cpp_resolver_emitter.Emit(
+                '    if (name == "$(INTERFACE_NAME)_constructor_Callback")\n'
+                '        return Dart$(INTERFACE_NAME)Internal::constructorCallback;\n',
+                INTERFACE_NAME=self._interface.id)
+
+            self._cpp_impl_includes.add('"DartArrayBufferViewCustom.h"')
+            self._cpp_definitions_emitter.Emit(
+                '\n'
+                'static void constructorCallback(Dart_NativeArguments args)\n'
+                '{\n'
+                '    WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n'
+                '}\n',
+                INTERFACE_NAME=self._interface.id)
+
+    def _EmitConstructorInfrastructure(self,
+                                       constructor_info,
+                                       cpp_prefix,
+                                       cpp_suffix,
+                                       factory_method_name,
+                                       arguments=None,
+                                       emit_to_native=False,
+                                       is_custom=False):
+
+        constructor_callback_cpp_name = cpp_prefix + cpp_suffix
+
+        if arguments is None:
+            arguments = constructor_info.idl_args[0]
+            argument_count = len(arguments)
+        else:
+            argument_count = len(arguments)
+
+        typed_formals = constructor_info.ParametersAsArgumentList(
+            argument_count)
+        parameters = constructor_info.ParametersAsStringOfVariables(
+            argument_count)
+        interface_name = self._interface_type_info.interface_name()
+
+        dart_native_name, constructor_callback_id = \
+            self.DeriveNativeEntry(cpp_suffix, 'Constructor', argument_count)
+
+        # Then we emit the impedance matching wrapper to call out to the
+        # toplevel wrapper
+        if not emit_to_native:
+            toplevel_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
+            self._members_emitter.Emit(
+                '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
+                '$TOPLEVEL_NAME($OUTPARAMETERS);\n',
+                INTERFACE_NAME=self._interface_type_info.interface_name(),
+                FACTORY_METHOD_NAME=factory_method_name,
+                PARAMETERS=typed_formals,
+                TOPLEVEL_NAME=toplevel_name,
+                OUTPARAMETERS=parameters)
+
+        self._cpp_resolver_emitter.Emit(
+            '    if (name == "$ID")\n'
+            '        return Dart$(WEBKIT_INTERFACE_NAME)Internal::$CPP_CALLBACK;\n',
+            ID=constructor_callback_id,
+            WEBKIT_INTERFACE_NAME=self._interface.id,
             CPP_CALLBACK=constructor_callback_cpp_name)
 
-    return True
+    def GenerateCustomFactory(self, constructor_info):
+        if 'CustomConstructor' not in self._interface.ext_attrs:
+            return False
 
-  def IsConstructorArgumentOptional(self, argument):
-    return IsOptional(argument)
+        annotations = self._metadata.GetFormattedMetadata(
+            self._library_name, self._interface, self._interface.id, '  ')
 
-  def MakeFactoryCall(self, factory, method, arguments, constructor_info):
-    return emitter.Format(
-        '$FACTORY.$METHOD($ARGUMENTS)',
-        FACTORY=factory,
-        METHOD=method,
-        ARGUMENTS=arguments)
+        self._members_emitter.Emit(
+            '\n  $(ANNOTATIONS)factory $CTOR($PARAMS) => _create($FACTORY_PARAMS);\n',
+            ANNOTATIONS=annotations,
+            CTOR=constructor_info._ConstructorFullName(self._DartType),
+            PARAMS=constructor_info.ParametersAsDeclaration(self._DartType),
+            FACTORY_PARAMS= \
+                constructor_info.ParametersAsArgumentList())
 
-  def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
-    constructor_callback_cpp_name = name + 'constructorCallback'
-    self._EmitConstructorInfrastructure(
-        constructor_info, name, 'constructorCallback', name, arguments,
-        emit_to_native=True,
-        is_custom=False)
+        # MutationObserver has custom _create.  TODO(terry): Consider table but this is only one.
+        if self._interface.id != 'MutationObserver':
+            constructor_callback_cpp_name = 'constructorCallback'
+            self._EmitConstructorInfrastructure(
+                constructor_info,
+                "",
+                constructor_callback_cpp_name,
+                '_create',
+                is_custom=True)
 
-    ext_attrs = self._interface.ext_attrs
+            self._cpp_declarations_emitter.Emit(
+                '\n'
+                'void $CPP_CALLBACK(Dart_NativeArguments);\n',
+                CPP_CALLBACK=constructor_callback_cpp_name)
 
-    create_function = 'create'
-    if 'NamedConstructor' in ext_attrs:
-      create_function = 'createForJSConstructor'
-    function_expression = '%s::%s' % (self._interface_type_info.native_type(), create_function)
+        return True
 
-  def HasSupportCheck(self):
-    # Need to omit a support check if it is conditional in JS.
-    return self._interface.doc_js_name in js_support_checks
+    def IsConstructorArgumentOptional(self, argument):
+        return IsOptional(argument)
 
-  def GetSupportCheck(self):
-    # Assume that everything is supported on Dartium.
-    value = js_support_checks.get(self._interface.doc_js_name)
-    if type(value) == tuple:
-      return (value[0], 'true')
-    else:
-      return 'true'
+    def MakeFactoryCall(self, factory, method, arguments, constructor_info):
+        return emitter.Format(
+            '$FACTORY.$METHOD($ARGUMENTS)',
+            FACTORY=factory,
+            METHOD=method,
+            ARGUMENTS=arguments)
 
-  def FinishInterface(self):
-    interface = self._interface
-    if interface.parents:
-      supertype = '%sClassId' % interface.parents[0].type.id
-    else:
-      supertype = '-1'
+    def EmitStaticFactoryOverload(self, constructor_info, name, arguments):
+        constructor_callback_cpp_name = name + 'constructorCallback'
+        self._EmitConstructorInfrastructure(
+            constructor_info,
+            name,
+            'constructorCallback',
+            name,
+            arguments,
+            emit_to_native=True,
+            is_custom=False)
 
-    self._GenerateCPPHeader()
+        ext_attrs = self._interface.ext_attrs
 
-    self._cpp_impl_emitter.Emit(
-        self._template_loader.Load('cpp_implementation.template'),
-        INTERFACE=self._interface.id,
-        SUPER_INTERFACE=supertype,
-        INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes),
-        CALLBACKS=self._cpp_definitions_emitter.Fragments(),
-        RESOLVER=self._cpp_resolver_emitter.Fragments(),
-        WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
-        WEBCORE_CLASS_NAME_ESCAPED=
-        self._interface_type_info.native_type().replace('<', '_').replace('>', '_'),
-        DART_IMPLEMENTATION_CLASS=self._interface_type_info.implementation_name(),
-        DART_IMPLEMENTATION_LIBRARY_ID='Dart%sLibraryId' % self._renamer.GetLibraryId(self._interface))
+        create_function = 'create'
+        if 'NamedConstructor' in ext_attrs:
+            create_function = 'createForJSConstructor'
+        function_expression = '%s::%s' % (
+            self._interface_type_info.native_type(), create_function)
 
-  def _GenerateCPPHeader(self):
-    to_native_emitter = emitter.Emitter()
-    if self._interface_type_info.custom_to_native():
-      return_type = 'PassRefPtr<NativeType>'
-      to_native_body = ';'
-      to_native_arg_body = ';'
-    else:
-      return_type = 'NativeType*'
-      to_native_body = emitter.Format(
-          '\n'
-          '    {\n'
-          '        DartDOMData* domData = DartDOMData::current();\n'
-          '        return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(domData, handle, exception);\n'
-          '    }',
-          INTERFACE=self._interface.id)
-      to_native_arg_body = emitter.Format(
-          '\n'
-          '    {\n'
-          '        return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(args, index, exception);\n'
-          '    }',
-          INTERFACE=self._interface.id)
+    def HasSupportCheck(self):
+        # Need to omit a support check if it is conditional in JS.
+        return self._interface.doc_js_name in js_support_checks
 
-    to_native_emitter.Emit(
-        '    static $RETURN_TYPE toNative(Dart_Handle handle, Dart_Handle& exception)$TO_NATIVE_BODY\n'
-        '\n'
-        '    static $RETURN_TYPE toNativeWithNullCheck(Dart_Handle handle, Dart_Handle& exception)\n'
-        '    {\n'
-        '        return Dart_IsNull(handle) ? 0 : toNative(handle, exception);\n'
-        '    }\n'
-        '\n'
-        '    static $RETURN_TYPE toNative(Dart_NativeArguments args, int index, Dart_Handle& exception)$TO_NATIVE_ARG_BODY\n'
-        '\n'
-        '    static $RETURN_TYPE toNativeWithNullCheck(Dart_NativeArguments args, int index, Dart_Handle& exception)\n'
-        '    {\n'
-        '        // toNative accounts for Null objects also.\n'
-        '        return toNative(args, index, exception);\n'
-        '    }\n',
-        RETURN_TYPE=return_type,
-        TO_NATIVE_BODY=to_native_body,
-        TO_NATIVE_ARG_BODY=to_native_arg_body,
-        INTERFACE=self._interface.id)
-
-    to_dart_emitter = emitter.Emitter()
-
-    ext_attrs = self._interface.ext_attrs
-
-    to_dart_emitter.Emit(
-        '    static Dart_Handle toDart(NativeType* value)\n'
-        '    {\n'
-        '        if (!value)\n'
-        '            return Dart_Null();\n'
-        '        DartDOMData* domData = DartDOMData::current();\n'
-        '        Dart_WeakPersistentHandle result =\n'
-        '            DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
-        '        if (result)\n'
-        '            return Dart_HandleFromWeakPersistent(result);\n'
-        '        return createWrapper(domData, value);\n'
-        '    }\n'
-        '    static void returnToDart(Dart_NativeArguments args,\n'
-        '                             NativeType* value,\n'
-        '                             bool autoDartScope = true)\n'
-        '    {\n'
-        '        if (value) {\n'
-        '            DartDOMData* domData = static_cast<DartDOMData*>(\n'
-        '                Dart_GetNativeIsolateData(args));\n'
-        '            Dart_WeakPersistentHandle result =\n'
-        '                DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
-        '            if (result)\n'
-        '                Dart_SetWeakHandleReturnValue(args, result);\n'
-        '            else {\n'
-        '                if (autoDartScope) {\n'
-        '                    Dart_SetReturnValue(args, createWrapper(domData, value));\n'
-        '                } else {\n'
-        '                    DartApiScope apiScope;\n'
-        '                    Dart_SetReturnValue(args, createWrapper(domData, value));\n'
-        '               }\n'
-        '            }\n'
-        '        }\n'
-        '    }\n',
-        INTERFACE=self._interface.id)
-
-    if ('CustomToV8' in ext_attrs or
-        'PureInterface' in ext_attrs or
-        'CPPPureInterface' in ext_attrs or
-        'SpecialWrapFor' in ext_attrs or
-        ('Custom' in ext_attrs and ext_attrs['Custom'] == 'Wrap') or
-        ('Custom' in ext_attrs and ext_attrs['Custom'] == 'ToV8') or
-        self._interface_type_info.custom_to_dart()):
-      to_dart_emitter.Emit(
-          '    static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value);\n')
-    else:
-      to_dart_emitter.Emit(
-          '    static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value)\n'
-          '    {\n'
-          '        return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domData, value, Dart$(INTERFACE)::dartClassId);\n'
-          '    }\n',
-          INTERFACE=self._interface.id)
-
-    webcore_includes = self._GenerateCPPIncludes(
-        self._interface_type_info.webcore_includes())
-
-    is_node_test = lambda interface: interface.id == 'Node'
-    is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
-    is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
-
-    def TypeCheckHelper(test):
-      return 'true' if any(map(test, self._database.Hierarchy(self._interface))) else 'false'
-
-    to_active_emitter = emitter.Emitter()
-    to_node_emitter = emitter.Emitter()
-    to_event_target_emitter = emitter.Emitter()
-
-    if (any(map(is_active_test, self._database.Hierarchy(self._interface)))):
-      to_active_emitter.Emit('return toNative(value);')
-    else:
-      to_active_emitter.Emit('return 0;')
-
-    if (any(map(is_node_test, self._database.Hierarchy(self._interface)))):
-      to_node_emitter.Emit('return toNative(value);')
-    else:
-      to_node_emitter.Emit('return 0;')
-
-    if (any(map(is_event_target_test, self._database.Hierarchy(self._interface)))):
-      to_event_target_emitter.Emit('return toNative(value);')
-    else:
-      to_event_target_emitter.Emit('return 0;')
-
-    v8_interface_include = ''
-    # V8AbstractWorker.h does not exist so we have to hard code this case.
-    if self._interface.id != 'AbstractWorker':
-      # FIXME: We need this to access the WrapperTypeInfo.
-      v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
-
-    self._cpp_header_emitter.Emit(
-        self._template_loader.Load('cpp_header.template'),
-        INTERFACE=self._interface.id,
-        WEBCORE_INCLUDES=webcore_includes,
-        V8_INTERFACE_INCLUDE=v8_interface_include,
-        WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
-        WEBCORE_CLASS_NAME_ESCAPED=
-        self._interface_type_info.native_type().replace('<', '_').replace('>', '_'),
-        DECLARATIONS=self._cpp_declarations_emitter.Fragments(),
-        IS_NODE=TypeCheckHelper(is_node_test),
-        IS_ACTIVE=TypeCheckHelper(is_active_test),
-        IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test),
-        TO_NODE=to_node_emitter.Fragments(),
-        TO_ACTIVE=to_active_emitter.Fragments(),
-        TO_EVENT_TARGET=to_event_target_emitter.Fragments(),
-        TO_NATIVE=to_native_emitter.Fragments(),
-        TO_DART=to_dart_emitter.Fragments())
-
-  def EmitAttribute(self, attribute, html_name, read_only):
-    self._AddGetter(attribute, html_name, read_only)
-    if not read_only:
-      self._AddSetter(attribute, html_name)
-
-  def _GenerateAutoSetupScope(self, idl_name, native_suffix):
-    return None
-
-  def _AddGetter(self, attr, html_name, read_only):
-    # Temporary hack to force dart:scalarlist clamped array for ImageData.data.
-    # TODO(antonm): solve in principled way.
-    if self._interface.id == 'ImageData' and html_name == 'data':
-      html_name = '_data'
-    type_info = self._TypeInfo(attr.type.id)
-
-    return_type = self.SecureOutputType(attr.type.id, False, False if self._dart_use_blink else True)
-    dictionary_returned = False
-    # Return type for dictionary is any (untyped).
-    if attr.type.id == 'Dictionary':
-      return_type = '';
-      dictionary_returned = True;
-
-    parameters = []
-    dart_declaration = '%s get %s' % (return_type, html_name)
-    is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
-                                     _IsCustomValue(attr, 'Getter'))
-
-    # Operation uses blink?
-    wrap_unwrap_list = [];
-    return_wrap_jso = False
-    if self._dart_use_blink:
-        # Unwrap the type to get the JsObject if Type is:
-        #
-        #    - known IDL type
-        #    - type_id is None then it's probably a union type or overloaded
-        #      it's a dynamic/any type
-        #    - type is Object
-        #
-        # JsObject maybe stored in the Dart class.
-        return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id, self._type_registry)
-    wrap_unwrap_list.append(return_wrap_jso)       # wrap_jso the returned object
-    wrap_unwrap_list.append(self._dart_use_blink)
-
-    # This seems to have been replaced with Custom=Getter (see above), but
-    # check to be sure we don't see the old syntax
-    assert(not ('CustomGetter' in attr.ext_attrs))
-    native_suffix = 'Getter'
-    auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
-    native_entry = \
-        self.DeriveNativeEntry(attr.id, 'Getter', None)
-    output_conversion = self._OutputConversion(attr.type.id, attr.id)
-
-    cpp_callback_name = self._GenerateNativeBinding(attr.id, 1,
-        dart_declaration, attr.is_static, return_type, parameters,
-        native_suffix, is_custom, auto_scope_setup, native_entry=native_entry,
-        wrap_unwrap_list=wrap_unwrap_list, dictionary_return=dictionary_returned,
-        output_conversion=output_conversion)
-    if is_custom:
-      return
-
-    if 'Reflect' in attr.ext_attrs:
-      webcore_function_name = self._TypeInfo(attr.type.id).webcore_getter_name()
-      if 'URL' in attr.ext_attrs:
-        if 'NonEmpty' in attr.ext_attrs:
-          webcore_function_name = 'getNonEmptyURLAttribute'
+    def GetSupportCheck(self):
+        # Assume that everything is supported on Dartium.
+        value = js_support_checks.get(self._interface.doc_js_name)
+        if type(value) == tuple:
+            return (value[0], 'true')
         else:
-          webcore_function_name = 'getURLAttribute'
-    elif 'ImplementedAs' in attr.ext_attrs:
-      webcore_function_name = attr.ext_attrs['ImplementedAs']
-    else:
-      if attr.id == 'operator':
-        webcore_function_name = '_operator'
-      elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString':
-        webcore_function_name = 'svgTarget'
-      elif attr.id == 'CSS':
-        webcore_function_name = 'css'
-      else:
-        webcore_function_name = self._ToWebKitName(attr.id)
+            return 'true'
 
-    function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, attr)
-    raises = ('RaisesException' in attr.ext_attrs and
-              attr.ext_attrs['RaisesException'] != 'Setter')
+    def FinishInterface(self):
+        interface = self._interface
+        if interface.parents:
+            supertype = '%sClassId' % interface.parents[0].type.id
+        else:
+            supertype = '-1'
 
-  def _AddSetter(self, attr, html_name):
-    return_type = 'void'
-    ptype = self._DartType(attr.type.id)
+        self._GenerateCPPHeader()
 
-    type_info = self._TypeInfo(attr.type.id)
+        self._cpp_impl_emitter.Emit(
+            self._template_loader.Load('cpp_implementation.template'),
+            INTERFACE=self._interface.id,
+            SUPER_INTERFACE=supertype,
+            INCLUDES=self._GenerateCPPIncludes(self._cpp_impl_includes),
+            CALLBACKS=self._cpp_definitions_emitter.Fragments(),
+            RESOLVER=self._cpp_resolver_emitter.Fragments(),
+            WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
+            WEBCORE_CLASS_NAME_ESCAPED=self._interface_type_info.native_type().
+            replace('<', '_').replace('>', '_'),
+            DART_IMPLEMENTATION_CLASS=self._interface_type_info.
+            implementation_name(),
+            DART_IMPLEMENTATION_LIBRARY_ID='Dart%sLibraryId' %
+            self._renamer.GetLibraryId(self._interface))
 
-    # Is the setter value a DartClass (that has a JsObject) or the type is
-    # None (it's a dynamic/any type) then unwrap_jso before passing to blink.
-    parameters = ['value']
+    def _GenerateCPPHeader(self):
+        to_native_emitter = emitter.Emitter()
+        if self._interface_type_info.custom_to_native():
+            return_type = 'PassRefPtr<NativeType>'
+            to_native_body = ';'
+            to_native_arg_body = ';'
+        else:
+            return_type = 'NativeType*'
+            to_native_body = emitter.Format(
+                '\n'
+                '    {\n'
+                '        DartDOMData* domData = DartDOMData::current();\n'
+                '        return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(domData, handle, exception);\n'
+                '    }',
+                INTERFACE=self._interface.id)
+            to_native_arg_body = emitter.Format(
+                '\n'
+                '    {\n'
+                '        return DartDOMWrapper::unwrapDartWrapper<Dart$INTERFACE>(args, index, exception);\n'
+                '    }',
+                INTERFACE=self._interface.id)
 
-    dart_declaration = 'set %s(%s value)' % (html_name, ptype)
-    is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
-                                     _IsCustomValue(attr, 'Setter'))
-    # This seems to have been replaced with Custom=Setter (see above), but
-    # check to be sure we don't see the old syntax
-    assert(not ('CustomSetter' in attr.ext_attrs))
-    assert(not ('V8CustomSetter' in attr.ext_attrs))
-    native_suffix = 'Setter'
-    auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
-    native_entry = \
-        self.DeriveNativeEntry(attr.id, 'Setter', None)
+        to_native_emitter.Emit(
+            '    static $RETURN_TYPE toNative(Dart_Handle handle, Dart_Handle& exception)$TO_NATIVE_BODY\n'
+            '\n'
+            '    static $RETURN_TYPE toNativeWithNullCheck(Dart_Handle handle, Dart_Handle& exception)\n'
+            '    {\n'
+            '        return Dart_IsNull(handle) ? 0 : toNative(handle, exception);\n'
+            '    }\n'
+            '\n'
+            '    static $RETURN_TYPE toNative(Dart_NativeArguments args, int index, Dart_Handle& exception)$TO_NATIVE_ARG_BODY\n'
+            '\n'
+            '    static $RETURN_TYPE toNativeWithNullCheck(Dart_NativeArguments args, int index, Dart_Handle& exception)\n'
+            '    {\n'
+            '        // toNative accounts for Null objects also.\n'
+            '        return toNative(args, index, exception);\n'
+            '    }\n',
+            RETURN_TYPE=return_type,
+            TO_NATIVE_BODY=to_native_body,
+            TO_NATIVE_ARG_BODY=to_native_arg_body,
+            INTERFACE=self._interface.id)
 
-    # setters return no object and if blink this must be unwrapped.?
-    wrap_unwrap_list = [False, self._dart_use_blink];
+        to_dart_emitter = emitter.Emitter()
 
-    cpp_callback_name = self._GenerateNativeBinding(attr.id, 2,
-        dart_declaration, attr.is_static, return_type, parameters,
-        native_suffix, is_custom, auto_scope_setup, native_entry=native_entry,
-        wrap_unwrap_list=wrap_unwrap_list)
-    if is_custom:
-      return
+        ext_attrs = self._interface.ext_attrs
 
-    if 'Reflect' in attr.ext_attrs:
-      webcore_function_name = self._TypeInfo(attr.type.id).webcore_setter_name()
-    else:
-      if 'ImplementedAs' in attr.ext_attrs:
-        attr_name = attr.ext_attrs['ImplementedAs']
-      else:
-        attr_name = attr.id
-      webcore_function_name = re.sub(r'^(xml|css|(?=[A-Z])|\w)',
-                                     lambda s: s.group(1).upper(),
-                                     attr_name)
-      webcore_function_name = 'set%s' % webcore_function_name
+        to_dart_emitter.Emit(
+            '    static Dart_Handle toDart(NativeType* value)\n'
+            '    {\n'
+            '        if (!value)\n'
+            '            return Dart_Null();\n'
+            '        DartDOMData* domData = DartDOMData::current();\n'
+            '        Dart_WeakPersistentHandle result =\n'
+            '            DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
+            '        if (result)\n'
+            '            return Dart_HandleFromWeakPersistent(result);\n'
+            '        return createWrapper(domData, value);\n'
+            '    }\n'
+            '    static void returnToDart(Dart_NativeArguments args,\n'
+            '                             NativeType* value,\n'
+            '                             bool autoDartScope = true)\n'
+            '    {\n'
+            '        if (value) {\n'
+            '            DartDOMData* domData = static_cast<DartDOMData*>(\n'
+            '                Dart_GetNativeIsolateData(args));\n'
+            '            Dart_WeakPersistentHandle result =\n'
+            '                DartDOMWrapper::lookupWrapper<Dart$(INTERFACE)>(domData, value);\n'
+            '            if (result)\n'
+            '                Dart_SetWeakHandleReturnValue(args, result);\n'
+            '            else {\n'
+            '                if (autoDartScope) {\n'
+            '                    Dart_SetReturnValue(args, createWrapper(domData, value));\n'
+            '                } else {\n'
+            '                    DartApiScope apiScope;\n'
+            '                    Dart_SetReturnValue(args, createWrapper(domData, value));\n'
+            '               }\n'
+            '            }\n'
+            '        }\n'
+            '    }\n',
+            INTERFACE=self._interface.id)
 
-    function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, attr)
-    raises = ('RaisesException' in attr.ext_attrs and
-              attr.ext_attrs['RaisesException'] != 'Getter')
+        if ('CustomToV8' in ext_attrs or 'PureInterface' in ext_attrs or
+                'CPPPureInterface' in ext_attrs or
+                'SpecialWrapFor' in ext_attrs or
+            ('Custom' in ext_attrs and ext_attrs['Custom'] == 'Wrap') or
+            ('Custom' in ext_attrs and ext_attrs['Custom'] == 'ToV8') or
+                self._interface_type_info.custom_to_dart()):
+            to_dart_emitter.Emit(
+                '    static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value);\n'
+            )
+        else:
+            to_dart_emitter.Emit(
+                '    static Dart_Handle createWrapper(DartDOMData* domData, NativeType* value)\n'
+                '    {\n'
+                '        return DartDOMWrapper::createWrapper<Dart$(INTERFACE)>(domData, value, Dart$(INTERFACE)::dartClassId);\n'
+                '    }\n',
+                INTERFACE=self._interface.id)
 
-  def AddIndexer(self, element_type, nullable):
-    """Adds all the methods required to complete implementation of List."""
-    # We would like to simply inherit the implementation of everything except
-    # length, [], and maybe []=.  It is possible to extend from a base
-    # array implementation class only when there is no other implementation
-    # inheritance.  There might be no implementation inheritance other than
-    # DOMBaseWrapper for many classes, but there might be some where the
-    # array-ness is introduced by a non-root interface:
-    #
-    #   interface Y extends X, List<T> ...
-    #
-    # In the non-root case we have to choose between:
-    #
-    #   class YImpl extends XImpl { add List<T> methods; }
-    #
-    # and
-    #
-    #   class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
-    #
-    dart_element_type = self._DartType(element_type)
-    if self._HasNativeIndexGetter():
-      self._EmitNativeIndexGetter(dart_element_type)
-    elif self._HasExplicitIndexedGetter():
-      self._EmitExplicitIndexedGetter(dart_element_type)
-    else:
-      is_custom = any((op.id == 'item' and _IsCustom(op)) for op in self._interface.operations)
+        webcore_includes = self._GenerateCPPIncludes(
+            self._interface_type_info.webcore_includes())
 
-      output_conversion = self._OutputConversion(element_type, 'item')
-      conversion_name = ''
-      if output_conversion:
-        conversion_name = output_conversion.function_name
+        is_node_test = lambda interface: interface.id == 'Node'
+        is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
+        is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
 
-      # First emit a toplevel function to do the native call
-      # Calls to this are emitted elsewhere,
-      dart_native_name, resolver_string = \
-          self.DeriveNativeEntry("item", 'Method', 1)
+        def TypeCheckHelper(test):
+            return 'true' if any(
+                map(test, self._database.Hierarchy(
+                    self._interface))) else 'false'
 
-      # Emit the method which calls the toplevel function, along with
-      # the [] operator.
-      dart_qualified_name = \
-          self.DeriveQualifiedBlinkName(self._interface.id,
-                                        dart_native_name)
+        to_active_emitter = emitter.Emitter()
+        to_node_emitter = emitter.Emitter()
+        to_event_target_emitter = emitter.Emitter()
 
-      type_info = self._TypeInfo(element_type)
-      blinkNativeIndexed = """
+        if (any(map(is_active_test,
+                    self._database.Hierarchy(self._interface)))):
+            to_active_emitter.Emit('return toNative(value);')
+        else:
+            to_active_emitter.Emit('return 0;')
+
+        if (any(map(is_node_test, self._database.Hierarchy(self._interface)))):
+            to_node_emitter.Emit('return toNative(value);')
+        else:
+            to_node_emitter.Emit('return 0;')
+
+        if (any(
+                map(is_event_target_test,
+                    self._database.Hierarchy(self._interface)))):
+            to_event_target_emitter.Emit('return toNative(value);')
+        else:
+            to_event_target_emitter.Emit('return 0;')
+
+        v8_interface_include = ''
+        # V8AbstractWorker.h does not exist so we have to hard code this case.
+        if self._interface.id != 'AbstractWorker':
+            # FIXME: We need this to access the WrapperTypeInfo.
+            v8_interface_include = '#include "V8%s.h"' % (self._interface.id)
+
+        self._cpp_header_emitter.Emit(
+            self._template_loader.Load('cpp_header.template'),
+            INTERFACE=self._interface.id,
+            WEBCORE_INCLUDES=webcore_includes,
+            V8_INTERFACE_INCLUDE=v8_interface_include,
+            WEBCORE_CLASS_NAME=self._interface_type_info.native_type(),
+            WEBCORE_CLASS_NAME_ESCAPED=self._interface_type_info.native_type().
+            replace('<', '_').replace('>', '_'),
+            DECLARATIONS=self._cpp_declarations_emitter.Fragments(),
+            IS_NODE=TypeCheckHelper(is_node_test),
+            IS_ACTIVE=TypeCheckHelper(is_active_test),
+            IS_EVENT_TARGET=TypeCheckHelper(is_event_target_test),
+            TO_NODE=to_node_emitter.Fragments(),
+            TO_ACTIVE=to_active_emitter.Fragments(),
+            TO_EVENT_TARGET=to_event_target_emitter.Fragments(),
+            TO_NATIVE=to_native_emitter.Fragments(),
+            TO_DART=to_dart_emitter.Fragments())
+
+    def EmitAttribute(self, attribute, html_name, read_only):
+        self._AddGetter(attribute, html_name, read_only)
+        if not read_only:
+            self._AddSetter(attribute, html_name)
+
+    def _GenerateAutoSetupScope(self, idl_name, native_suffix):
+        return None
+
+    def _AddGetter(self, attr, html_name, read_only):
+        # Temporary hack to force dart:scalarlist clamped array for ImageData.data.
+        # TODO(antonm): solve in principled way.
+        if self._interface.id == 'ImageData' and html_name == 'data':
+            html_name = '_data'
+        type_info = self._TypeInfo(attr.type.id)
+
+        return_type = self.SecureOutputType(
+            attr.type.id, False, False if self._dart_use_blink else True)
+        dictionary_returned = False
+        # Return type for dictionary is any (untyped).
+        if attr.type.id == 'Dictionary':
+            return_type = ''
+            dictionary_returned = True
+
+        parameters = []
+        dart_declaration = '%s get %s' % (return_type, html_name)
+        is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
+                                         _IsCustomValue(attr, 'Getter'))
+
+        # Operation uses blink?
+        wrap_unwrap_list = []
+        return_wrap_jso = False
+        if self._dart_use_blink:
+            # Unwrap the type to get the JsObject if Type is:
+            #
+            #    - known IDL type
+            #    - type_id is None then it's probably a union type or overloaded
+            #      it's a dynamic/any type
+            #    - type is Object
+            #
+            # JsObject maybe stored in the Dart class.
+            return_wrap_jso = wrap_return_type_blink(return_type, attr.type.id,
+                                                     self._type_registry)
+        wrap_unwrap_list.append(return_wrap_jso)  # wrap_jso the returned object
+        wrap_unwrap_list.append(self._dart_use_blink)
+
+        # This seems to have been replaced with Custom=Getter (see above), but
+        # check to be sure we don't see the old syntax
+        assert (not ('CustomGetter' in attr.ext_attrs))
+        native_suffix = 'Getter'
+        auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
+        native_entry = \
+            self.DeriveNativeEntry(attr.id, 'Getter', None)
+        output_conversion = self._OutputConversion(attr.type.id, attr.id)
+
+        cpp_callback_name = self._GenerateNativeBinding(
+            attr.id,
+            1,
+            dart_declaration,
+            attr.is_static,
+            return_type,
+            parameters,
+            native_suffix,
+            is_custom,
+            auto_scope_setup,
+            native_entry=native_entry,
+            wrap_unwrap_list=wrap_unwrap_list,
+            dictionary_return=dictionary_returned,
+            output_conversion=output_conversion)
+        if is_custom:
+            return
+
+        if 'Reflect' in attr.ext_attrs:
+            webcore_function_name = self._TypeInfo(
+                attr.type.id).webcore_getter_name()
+            if 'URL' in attr.ext_attrs:
+                if 'NonEmpty' in attr.ext_attrs:
+                    webcore_function_name = 'getNonEmptyURLAttribute'
+                else:
+                    webcore_function_name = 'getURLAttribute'
+        elif 'ImplementedAs' in attr.ext_attrs:
+            webcore_function_name = attr.ext_attrs['ImplementedAs']
+        else:
+            if attr.id == 'operator':
+                webcore_function_name = '_operator'
+            elif attr.id == 'target' and attr.type.id == 'SVGAnimatedString':
+                webcore_function_name = 'svgTarget'
+            elif attr.id == 'CSS':
+                webcore_function_name = 'css'
+            else:
+                webcore_function_name = self._ToWebKitName(attr.id)
+
+        function_expression = self._GenerateWebCoreFunctionExpression(
+            webcore_function_name, attr)
+        raises = ('RaisesException' in attr.ext_attrs and
+                  attr.ext_attrs['RaisesException'] != 'Setter')
+
+    def _AddSetter(self, attr, html_name):
+        return_type = 'void'
+        ptype = self._DartType(attr.type.id)
+
+        type_info = self._TypeInfo(attr.type.id)
+
+        # Is the setter value a DartClass (that has a JsObject) or the type is
+        # None (it's a dynamic/any type) then unwrap_jso before passing to blink.
+        parameters = ['value']
+
+        dart_declaration = 'set %s(%s value)' % (html_name, ptype)
+        is_custom = _IsCustom(attr) and (_IsCustomValue(attr, None) or
+                                         _IsCustomValue(attr, 'Setter'))
+        # This seems to have been replaced with Custom=Setter (see above), but
+        # check to be sure we don't see the old syntax
+        assert (not ('CustomSetter' in attr.ext_attrs))
+        assert (not ('V8CustomSetter' in attr.ext_attrs))
+        native_suffix = 'Setter'
+        auto_scope_setup = self._GenerateAutoSetupScope(attr.id, native_suffix)
+        native_entry = \
+            self.DeriveNativeEntry(attr.id, 'Setter', None)
+
+        # setters return no object and if blink this must be unwrapped.?
+        wrap_unwrap_list = [False, self._dart_use_blink]
+
+        cpp_callback_name = self._GenerateNativeBinding(
+            attr.id,
+            2,
+            dart_declaration,
+            attr.is_static,
+            return_type,
+            parameters,
+            native_suffix,
+            is_custom,
+            auto_scope_setup,
+            native_entry=native_entry,
+            wrap_unwrap_list=wrap_unwrap_list)
+        if is_custom:
+            return
+
+        if 'Reflect' in attr.ext_attrs:
+            webcore_function_name = self._TypeInfo(
+                attr.type.id).webcore_setter_name()
+        else:
+            if 'ImplementedAs' in attr.ext_attrs:
+                attr_name = attr.ext_attrs['ImplementedAs']
+            else:
+                attr_name = attr.id
+            webcore_function_name = re.sub(r'^(xml|css|(?=[A-Z])|\w)',
+                                           lambda s: s.group(1).upper(),
+                                           attr_name)
+            webcore_function_name = 'set%s' % webcore_function_name
+
+        function_expression = self._GenerateWebCoreFunctionExpression(
+            webcore_function_name, attr)
+        raises = ('RaisesException' in attr.ext_attrs and
+                  attr.ext_attrs['RaisesException'] != 'Getter')
+
+    def AddIndexer(self, element_type, nullable):
+        """Adds all the methods required to complete implementation of List."""
+        # We would like to simply inherit the implementation of everything except
+        # length, [], and maybe []=.  It is possible to extend from a base
+        # array implementation class only when there is no other implementation
+        # inheritance.  There might be no implementation inheritance other than
+        # DOMBaseWrapper for many classes, but there might be some where the
+        # array-ness is introduced by a non-root interface:
+        #
+        #   interface Y extends X, List<T> ...
+        #
+        # In the non-root case we have to choose between:
+        #
+        #   class YImpl extends XImpl { add List<T> methods; }
+        #
+        # and
+        #
+        #   class YImpl extends ListBase<T> { copies of transitive XImpl methods; }
+        #
+        dart_element_type = self._DartType(element_type)
+        if self._HasNativeIndexGetter():
+            self._EmitNativeIndexGetter(dart_element_type)
+        elif self._HasExplicitIndexedGetter():
+            self._EmitExplicitIndexedGetter(dart_element_type)
+        else:
+            is_custom = any((op.id == 'item' and _IsCustom(op))
+                            for op in self._interface.operations)
+
+            output_conversion = self._OutputConversion(element_type, 'item')
+            conversion_name = ''
+            if output_conversion:
+                conversion_name = output_conversion.function_name
+
+            # First emit a toplevel function to do the native call
+            # Calls to this are emitted elsewhere,
+            dart_native_name, resolver_string = \
+                self.DeriveNativeEntry("item", 'Method', 1)
+
+            # Emit the method which calls the toplevel function, along with
+            # the [] operator.
+            dart_qualified_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
+
+            type_info = self._TypeInfo(element_type)
+            blinkNativeIndexed = """
   $TYPE operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.index(index, this);
@@ -697,567 +756,639 @@
 
   $TYPE _nativeIndexedGetter(int index) => $(CONVERSION_NAME)($(DART_NATIVE_NAME)(this, index));
 """
-      blinkNativeIndexedGetter = \
-          ' $(DART_NATIVE_NAME)(this, index);\n'
-      self._members_emitter.Emit(blinkNativeIndexed,
-                                 DART_NATIVE_NAME=dart_qualified_name,
-                                 TYPE=self.SecureOutputType(element_type),
-                                 INTERFACE=self._interface.id,
-                                 CONVERSION_NAME=conversion_name)
+            blinkNativeIndexedGetter = \
+                ' $(DART_NATIVE_NAME)(this, index);\n'
+            self._members_emitter.Emit(
+                blinkNativeIndexed,
+                DART_NATIVE_NAME=dart_qualified_name,
+                TYPE=self.SecureOutputType(element_type),
+                INTERFACE=self._interface.id,
+                CONVERSION_NAME=conversion_name)
 
-    if self._HasNativeIndexSetter():
-      self._EmitNativeIndexSetter(dart_element_type)
-    else:
-      self._members_emitter.Emit(
-          '\n'
-          '  void operator[]=(int index, $TYPE value) {\n'
-          '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
-          '  }\n',
-          TYPE=dart_element_type)
+        if self._HasNativeIndexSetter():
+            self._EmitNativeIndexSetter(dart_element_type)
+        else:
+            self._members_emitter.Emit(
+                '\n'
+                '  void operator[]=(int index, $TYPE value) {\n'
+                '    throw new UnsupportedError("Cannot assign element of immutable List.");\n'
+                '  }\n',
+                TYPE=dart_element_type)
 
-    self.EmitListMixin(dart_element_type, nullable)
+        self.EmitListMixin(dart_element_type, nullable)
 
-  def AmendIndexer(self, element_type):
-    # If interface is marked as having native indexed
-    # getter or setter, we must emit overrides as it's not
-    # guaranteed that the corresponding methods in C++ would be
-    # virtual.  For example, as of time of writing, even though
-    # Uint8ClampedArray inherits from Uint8Array, ::set method
-    # is not virtual and accessing it through Uint8Array pointer
-    # would lead to wrong semantics (modulo vs. clamping.)
-    dart_element_type = self._DartType(element_type)
+    def AmendIndexer(self, element_type):
+        # If interface is marked as having native indexed
+        # getter or setter, we must emit overrides as it's not
+        # guaranteed that the corresponding methods in C++ would be
+        # virtual.  For example, as of time of writing, even though
+        # Uint8ClampedArray inherits from Uint8Array, ::set method
+        # is not virtual and accessing it through Uint8Array pointer
+        # would lead to wrong semantics (modulo vs. clamping.)
+        dart_element_type = self._DartType(element_type)
 
-    if self._HasNativeIndexGetter():
-      self._EmitNativeIndexGetter(dart_element_type)
-    if self._HasNativeIndexSetter():
-      self._EmitNativeIndexSetter(dart_element_type)
+        if self._HasNativeIndexGetter():
+            self._EmitNativeIndexGetter(dart_element_type)
+        if self._HasNativeIndexSetter():
+            self._EmitNativeIndexSetter(dart_element_type)
 
-  def _HasNativeIndexGetter(self):
-    return 'CustomIndexedGetter' in self._interface.ext_attrs
+    def _HasNativeIndexGetter(self):
+        return 'CustomIndexedGetter' in self._interface.ext_attrs
 
-  def _EmitNativeIndexGetter(self, element_type):
-    return_type = self.SecureOutputType(element_type, True)
-    parameters = ['index']
-    dart_declaration = '%s operator[](int index)' % return_type
-    self._GenerateNativeBinding('numericIndexGetter', 2,
-      dart_declaration, False, return_type, parameters,
-      'Callback', True, False)
+    def _EmitNativeIndexGetter(self, element_type):
+        return_type = self.SecureOutputType(element_type, True)
+        parameters = ['index']
+        dart_declaration = '%s operator[](int index)' % return_type
+        self._GenerateNativeBinding('numericIndexGetter', 2, dart_declaration,
+                                    False, return_type, parameters, 'Callback',
+                                    True, False)
 
-  def _HasExplicitIndexedGetter(self):
-    return any(op.id == 'getItem' for op in self._interface.operations)
+    def _HasExplicitIndexedGetter(self):
+        return any(op.id == 'getItem' for op in self._interface.operations)
 
-  def _EmitExplicitIndexedGetter(self, dart_element_type):
-    if any(op.id == 'getItem' for op in self._interface.operations):
-      indexed_getter = 'getItem'
+    def _EmitExplicitIndexedGetter(self, dart_element_type):
+        if any(op.id == 'getItem' for op in self._interface.operations):
+            indexed_getter = 'getItem'
 
-    self._members_emitter.Emit(
-        '\n'
-        '  $TYPE operator[](int index) {\n'
-        '    if (index < 0 || index >= length)\n'
-        '      throw new RangeError.index(index, this);\n'
-        '    return $INDEXED_GETTER(index);\n'
-        '  }\n',
-        TYPE=dart_element_type,
-        INDEXED_GETTER=indexed_getter)
+        self._members_emitter.Emit(
+            '\n'
+            '  $TYPE operator[](int index) {\n'
+            '    if (index < 0 || index >= length)\n'
+            '      throw new RangeError.index(index, this);\n'
+            '    return $INDEXED_GETTER(index);\n'
+            '  }\n',
+            TYPE=dart_element_type,
+            INDEXED_GETTER=indexed_getter)
 
-  def _HasNativeIndexSetter(self):
-    return 'CustomIndexedSetter' in self._interface.ext_attrs
+    def _HasNativeIndexSetter(self):
+        return 'CustomIndexedSetter' in self._interface.ext_attrs
 
-  def _EmitNativeIndexSetter(self, element_type):
-    return_type = 'void'
-    formals = ', '.join(['int index', '%s value' % element_type])
-    parameters = ['index', 'value']
-    dart_declaration = 'void operator[]=(%s)' % formals
-    self._GenerateNativeBinding('numericIndexSetter', 3,
-      dart_declaration, False, return_type, parameters,
-      'Callback', True, False)
+    def _EmitNativeIndexSetter(self, element_type):
+        return_type = 'void'
+        formals = ', '.join(['int index', '%s value' % element_type])
+        parameters = ['index', 'value']
+        dart_declaration = 'void operator[]=(%s)' % formals
+        self._GenerateNativeBinding('numericIndexSetter', 3, dart_declaration,
+                                    False, return_type, parameters, 'Callback',
+                                    True, False)
 
-  def _ChangePrivateOpMapArgToAny(self, operations):
-    # TODO(terry): Hack to map any operations marked as private to not
-    #              handle converting Map to native (JsObject) the public
-    #              members that call the private method will have done
-    #              conversions.
-    for operation in operations:
-      for arg in operation.arguments:
-        type = arg.type
-        if type.id == 'Dictionary':
-          type.id = 'any'
+    def _ChangePrivateOpMapArgToAny(self, operations):
+        # TODO(terry): Hack to map any operations marked as private to not
+        #              handle converting Map to native (JsObject) the public
+        #              members that call the private method will have done
+        #              conversions.
+        for operation in operations:
+            for arg in operation.arguments:
+                type = arg.type
+                if type.id == 'Dictionary':
+                    type.id = 'any'
 
-  def EmitOperation(self, info, html_name, dart_js_interop=False):
-    """
+    def EmitOperation(self, info, html_name, dart_js_interop=False):
+        """
     Arguments:
       info: An OperationInfo object.
     """
-    if self._renamer.isPrivate(self._interface, info.operations[0].id):
-      # Any private operations with Maps parameters changed to any type.
-      # The public method that delegates to this private operation has already
-      # converted from Map to native (JsObject) e.g., Element.animate.
-      self._ChangePrivateOpMapArgToAny(info.operations)
+        if self._renamer.isPrivate(self._interface, info.operations[0].id):
+            # Any private operations with Maps parameters changed to any type.
+            # The public method that delegates to this private operation has already
+            # converted from Map to native (JsObject) e.g., Element.animate.
+            self._ChangePrivateOpMapArgToAny(info.operations)
 
-    return_type = self.SecureOutputType(info.type_name, False, False if dart_js_interop else True)
+        return_type = self.SecureOutputType(info.type_name, False,
+                                            False if dart_js_interop else True)
 
-    formals = info.ParametersAsDeclaration(self._DartType)
+        formals = info.ParametersAsDeclaration(self._DartType)
 
-    parameters = info.ParametersAsListOfVariables(None,
-                                                  self._type_registry if self._dart_use_blink else None,
-                                                  dart_js_interop,
-                                                  self)
+        parameters = info.ParametersAsListOfVariables(
+            None, self._type_registry if self._dart_use_blink else None,
+            dart_js_interop, self)
 
-    operation = info.operations[0]
+        operation = info.operations[0]
 
-    output_conversion = self._OutputConversion(operation.type.id, operation.id)
+        output_conversion = self._OutputConversion(operation.type.id,
+                                                   operation.id)
 
-    dictionary_returned = False
-    # Return type for dictionary is any (untyped).
-    if operation.type.id == 'Dictionary':
-      return_type = '';
-      dictionary_returned = True;
+        dictionary_returned = False
+        # Return type for dictionary is any (untyped).
+        if operation.type.id == 'Dictionary':
+            return_type = ''
+            dictionary_returned = True
 
-    dart_declaration = '%s%s %s(%s)' % (
-        'static ' if info.IsStatic() else '',
-        return_type,
-        html_name,
-        formals)
+        dart_declaration = '%s%s %s(%s)' % ('static ' if info.IsStatic() else
+                                            '', return_type, html_name, formals)
 
-    is_custom = _IsCustom(operation)
-    has_optional_arguments = any(IsOptional(argument) for argument in operation.arguments)
-    needs_dispatcher = not is_custom and (len(info.operations) > 1 or has_optional_arguments)
+        is_custom = _IsCustom(operation)
+        has_optional_arguments = any(
+            IsOptional(argument) for argument in operation.arguments)
+        needs_dispatcher = not is_custom and (len(info.operations) > 1 or
+                                              has_optional_arguments)
 
-    # Operation uses blink?
-    wrap_unwrap_list = [];
-    return_wrap_jso = False
-    # return type wrapped?
-    if self._dart_use_blink:
-        # Wrap the type to store the JsObject if Type is:
-        #
-        #      it's a dynamic/any type
-        #    - type is Object
-        #
-        # JsObject maybe stored in the Dart class.
-        return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, self._type_registry)
-        return_type_info = self._type_registry.TypeInfo(info.type_name)
-    # wrap_jso the returned object
-    wrap_unwrap_list.append(return_wrap_jso)
-    wrap_unwrap_list.append(self._dart_use_blink)
+        # Operation uses blink?
+        wrap_unwrap_list = []
+        return_wrap_jso = False
+        # return type wrapped?
+        if self._dart_use_blink:
+            # Wrap the type to store the JsObject if Type is:
+            #
+            #      it's a dynamic/any type
+            #    - type is Object
+            #
+            # JsObject maybe stored in the Dart class.
+            return_wrap_jso = wrap_return_type_blink(
+                return_type, info.type_name, self._type_registry)
+            return_type_info = self._type_registry.TypeInfo(info.type_name)
+        # wrap_jso the returned object
+        wrap_unwrap_list.append(return_wrap_jso)
+        wrap_unwrap_list.append(self._dart_use_blink)
 
-    if info.callback_args:
-      self._AddFutureifiedOperation(info, html_name)
-    elif not needs_dispatcher:
-      # Bind directly to native implementation
-      argument_count = (0 if info.IsStatic() else 1) + len(info.param_infos)
-      native_suffix = 'Callback'
-      auto_scope_setup = self._GenerateAutoSetupScope(info.name, native_suffix)
-      native_entry = \
-          self.DeriveNativeEntry(operation.id, 'Method', len(info.param_infos))
-      cpp_callback_name = self._GenerateNativeBinding(
-        info.name, argument_count, dart_declaration,
-        info.IsStatic(), return_type, parameters,
-        native_suffix, is_custom, auto_scope_setup,
-        native_entry=native_entry,
-        wrap_unwrap_list=wrap_unwrap_list,
-        dictionary_return=dictionary_returned,
-        output_conversion=output_conversion)
-      if not is_custom:
-        self._GenerateOperationNativeCallback(operation, operation.arguments, cpp_callback_name, auto_scope_setup)
-    else:
-      self._GenerateDispatcher(info, info.operations, dart_declaration, html_name)
-
-  def _GenerateDispatcher(self, info, operations, dart_declaration, html_name):
-
-    def GenerateCall(
-        stmts_emitter, call_emitter, version, operation, argument_count):
-      native_suffix = 'Callback'
-      actuals = info.ParametersAsListOfVariables(argument_count,
-                                                 self._type_registry if self._dart_use_blink else None,
-                                                 self._dart_js_interop,
-                                                 self)
-      actuals_s = ", ".join(actuals)
-      formals=actuals
-      return_type = self.SecureOutputType(operation.type.id)
-
-      return_wrap_jso = False
-      if self._dart_use_blink:
-          return_wrap_jso = wrap_return_type_blink(return_type, info.type_name, self._type_registry)
-
-      native_suffix = 'Callback'
-      is_custom = _IsCustom(operation)
-      base_name = '_%s_%s' % (operation.id, version)
-      static = True
-      if not operation.is_static:
-        actuals = ['this'] + actuals
-        formals = ['mthis'] + formals
-      actuals_s = ", ".join(actuals)
-      formals_s = ", ".join(formals)
-      dart_declaration = '%s(%s)' % (
-        base_name, formals_s)
-      native_entry = \
-          self.DeriveNativeEntry(operation.id, 'Method', argument_count)
-      overload_base_name = native_entry[0]
-      overload_name = \
-          self.DeriveQualifiedBlinkName(self._interface.id,
-                                        overload_base_name)
-      call_emitter.Emit('$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
-      auto_scope_setup = \
-        self._GenerateAutoSetupScope(base_name, native_suffix)
-      cpp_callback_name = self._GenerateNativeBinding(
-        base_name, (0 if static else 1) + argument_count,
-        dart_declaration, static, return_type, formals,
-        native_suffix, is_custom, auto_scope_setup, emit_metadata=False,
-        emit_to_native=True, native_entry=native_entry)
-      if not is_custom:
-        self._GenerateOperationNativeCallback(operation,
-          operation.arguments[:argument_count], cpp_callback_name,
-          auto_scope_setup)
-
-
-    self._GenerateDispatcherBody(
-        info,
-        operations,
-        dart_declaration,
-        GenerateCall,
-        IsOptional)
-
-  def SecondaryContext(self, interface):
-    pass
-
-  def _GenerateOperationNativeCallback(self, operation, arguments, cpp_callback_name, auto_scope_setup=True):
-    webcore_function_name = operation.ext_attrs.get('ImplementedAs', operation.id)
-
-    function_expression = self._GenerateWebCoreFunctionExpression(webcore_function_name, operation, cpp_callback_name)
-
-  def _GenerateNativeBinding(self, idl_name, argument_count, dart_declaration,
-      static, return_type, parameters, native_suffix, is_custom,
-      auto_scope_setup=True, emit_metadata=True, emit_to_native=False,
-      native_entry=None, wrap_unwrap_list=[], dictionary_return=False, output_conversion=None):
-    metadata = []
-    if emit_metadata:
-      metadata = self._metadata.GetFormattedMetadata(
-          self._renamer.GetLibraryName(self._interface),
-          self._interface, idl_name, '  ')
-
-    if (native_entry):
-        dart_native_name, native_binding = native_entry
-    else:
-        dart_native_name = \
-            self.DeriveNativeName(idl_name, native_suffix)
-        native_binding_id = self._interface.id
-        native_binding_id = TypeIdToBlinkName(native_binding_id, self._database)
-        native_binding = \
-            '%s_%s_%s' % (native_binding_id, idl_name, native_suffix)
-
-    if not static:
-        formals = ", ".join(['mthis'] + parameters)
-        actuals = ", ".join(['this'] + parameters)
-    else:
-        formals = ", ".join(parameters)
-        actuals = ", ".join(parameters)
-
-    if not emit_to_native:
-        caller_emitter = self._members_emitter
-        full_dart_name = \
-            self.DeriveQualifiedBlinkName(self._interface.id,
-                                          dart_native_name)
-        if IsPureInterface(self._interface.id, self._database):
-            caller_emitter.Emit(
-                '\n'
-                '  $METADATA$DART_DECLARATION;\n',
-                METADATA=metadata,
-                DART_DECLARATION=dart_declaration)
+        if info.callback_args:
+            self._AddFutureifiedOperation(info, html_name)
+        elif not needs_dispatcher:
+            # Bind directly to native implementation
+            argument_count = (0 if info.IsStatic() else 1) + len(
+                info.param_infos)
+            native_suffix = 'Callback'
+            auto_scope_setup = self._GenerateAutoSetupScope(
+                info.name, native_suffix)
+            native_entry = \
+                self.DeriveNativeEntry(operation.id, 'Method', len(info.param_infos))
+            cpp_callback_name = self._GenerateNativeBinding(
+                info.name,
+                argument_count,
+                dart_declaration,
+                info.IsStatic(),
+                return_type,
+                parameters,
+                native_suffix,
+                is_custom,
+                auto_scope_setup,
+                native_entry=native_entry,
+                wrap_unwrap_list=wrap_unwrap_list,
+                dictionary_return=dictionary_returned,
+                output_conversion=output_conversion)
+            if not is_custom:
+                self._GenerateOperationNativeCallback(
+                    operation, operation.arguments, cpp_callback_name,
+                    auto_scope_setup)
         else:
-            emit_template = '''
+            self._GenerateDispatcher(info, info.operations, dart_declaration,
+                                     html_name)
+
+    def _GenerateDispatcher(self, info, operations, dart_declaration,
+                            html_name):
+
+        def GenerateCall(stmts_emitter, call_emitter, version, operation,
+                         argument_count):
+            native_suffix = 'Callback'
+            actuals = info.ParametersAsListOfVariables(
+                argument_count,
+                self._type_registry if self._dart_use_blink else None,
+                self._dart_js_interop, self)
+            actuals_s = ", ".join(actuals)
+            formals = actuals
+            return_type = self.SecureOutputType(operation.type.id)
+
+            return_wrap_jso = False
+            if self._dart_use_blink:
+                return_wrap_jso = wrap_return_type_blink(
+                    return_type, info.type_name, self._type_registry)
+
+            native_suffix = 'Callback'
+            is_custom = _IsCustom(operation)
+            base_name = '_%s_%s' % (operation.id, version)
+            static = True
+            if not operation.is_static:
+                actuals = ['this'] + actuals
+                formals = ['mthis'] + formals
+            actuals_s = ", ".join(actuals)
+            formals_s = ", ".join(formals)
+            dart_declaration = '%s(%s)' % (base_name, formals_s)
+            native_entry = \
+                self.DeriveNativeEntry(operation.id, 'Method', argument_count)
+            overload_base_name = native_entry[0]
+            overload_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              overload_base_name)
+            call_emitter.Emit(
+                '$NAME($ARGS)', NAME=overload_name, ARGS=actuals_s)
+            auto_scope_setup = \
+              self._GenerateAutoSetupScope(base_name, native_suffix)
+            cpp_callback_name = self._GenerateNativeBinding(
+                base_name, (0 if static else 1) + argument_count,
+                dart_declaration,
+                static,
+                return_type,
+                formals,
+                native_suffix,
+                is_custom,
+                auto_scope_setup,
+                emit_metadata=False,
+                emit_to_native=True,
+                native_entry=native_entry)
+            if not is_custom:
+                self._GenerateOperationNativeCallback(
+                    operation, operation.arguments[:argument_count],
+                    cpp_callback_name, auto_scope_setup)
+
+        self._GenerateDispatcherBody(info, operations, dart_declaration,
+                                     GenerateCall, IsOptional)
+
+    def SecondaryContext(self, interface):
+        pass
+
+    def _GenerateOperationNativeCallback(self,
+                                         operation,
+                                         arguments,
+                                         cpp_callback_name,
+                                         auto_scope_setup=True):
+        webcore_function_name = operation.ext_attrs.get('ImplementedAs',
+                                                        operation.id)
+
+        function_expression = self._GenerateWebCoreFunctionExpression(
+            webcore_function_name, operation, cpp_callback_name)
+
+    def _GenerateNativeBinding(self,
+                               idl_name,
+                               argument_count,
+                               dart_declaration,
+                               static,
+                               return_type,
+                               parameters,
+                               native_suffix,
+                               is_custom,
+                               auto_scope_setup=True,
+                               emit_metadata=True,
+                               emit_to_native=False,
+                               native_entry=None,
+                               wrap_unwrap_list=[],
+                               dictionary_return=False,
+                               output_conversion=None):
+        metadata = []
+        if emit_metadata:
+            metadata = self._metadata.GetFormattedMetadata(
+                self._renamer.GetLibraryName(self._interface), self._interface,
+                idl_name, '  ')
+
+        if (native_entry):
+            dart_native_name, native_binding = native_entry
+        else:
+            dart_native_name = \
+                self.DeriveNativeName(idl_name, native_suffix)
+            native_binding_id = self._interface.id
+            native_binding_id = TypeIdToBlinkName(native_binding_id,
+                                                  self._database)
+            native_binding = \
+                '%s_%s_%s' % (native_binding_id, idl_name, native_suffix)
+
+        if not static:
+            formals = ", ".join(['mthis'] + parameters)
+            actuals = ", ".join(['this'] + parameters)
+        else:
+            formals = ", ".join(parameters)
+            actuals = ", ".join(parameters)
+
+        if not emit_to_native:
+            caller_emitter = self._members_emitter
+            full_dart_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
+            if IsPureInterface(self._interface.id, self._database):
+                caller_emitter.Emit('\n'
+                                    '  $METADATA$DART_DECLARATION;\n',
+                                    METADATA=metadata,
+                                    DART_DECLARATION=dart_declaration)
+            else:
+                emit_template = '''
   $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);
   '''
-            if output_conversion and not dictionary_return:
-              conversion_template = '''
+                if output_conversion and not dictionary_return:
+                    conversion_template = '''
   $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS));
   '''
-              emit_template = conversion_template % output_conversion.function_name
+                    emit_template = conversion_template % output_conversion.function_name
 
-            elif wrap_unwrap_list and wrap_unwrap_list[0]:
-                if return_type == 'Rectangle':
-                    jso_util_method = 'make_dart_rectangle'
-                elif wrap_unwrap_list[0]:
-                    jso_util_method = ''
+                elif wrap_unwrap_list and wrap_unwrap_list[0]:
+                    if return_type == 'Rectangle':
+                        jso_util_method = 'make_dart_rectangle'
+                    elif wrap_unwrap_list[0]:
+                        jso_util_method = ''
 
-                if dictionary_return:
-                  emit_jso_template = '''
+                    if dictionary_return:
+                        emit_jso_template = '''
   $METADATA$DART_DECLARATION => convertNativeDictionaryToDartDictionary(%s($DART_NAME($ACTUALS)));
   '''
-                else:
-                  emit_jso_template = '''
+                    else:
+                        emit_jso_template = '''
   $METADATA$DART_DECLARATION => %s($DART_NAME($ACTUALS));
   '''
-                emit_template = emit_jso_template % jso_util_method
+                    emit_template = emit_jso_template % jso_util_method
 
-            if caller_emitter:
-              caller_emitter.Emit(emit_template,
-                                  METADATA=metadata,
-                                  DART_DECLARATION=dart_declaration,
-                                  DART_NAME=full_dart_name,
-                                  ACTUALS=actuals)
-    cpp_callback_name = '%s%s' % (idl_name, native_suffix)
+                if caller_emitter:
+                    caller_emitter.Emit(
+                        emit_template,
+                        METADATA=metadata,
+                        DART_DECLARATION=dart_declaration,
+                        DART_NAME=full_dart_name,
+                        ACTUALS=actuals)
+        cpp_callback_name = '%s%s' % (idl_name, native_suffix)
 
-    self._cpp_resolver_emitter.Emit(
-        '    if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n'
-        '        *autoSetupScope = $AUTO_SCOPE_SETUP;\n'
-        '        return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n'
-        '    }\n',
-        ARGC=argument_count,
-        NATIVE_BINDING=native_binding,
-        INTERFACE_NAME=self._interface.id,
-        AUTO_SCOPE_SETUP='true' if auto_scope_setup else 'false',
-        CPP_CALLBACK_NAME=cpp_callback_name)
+        self._cpp_resolver_emitter.Emit(
+            '    if (argumentCount == $ARGC && name == "$NATIVE_BINDING") {\n'
+            '        *autoSetupScope = $AUTO_SCOPE_SETUP;\n'
+            '        return Dart$(INTERFACE_NAME)Internal::$CPP_CALLBACK_NAME;\n'
+            '    }\n',
+            ARGC=argument_count,
+            NATIVE_BINDING=native_binding,
+            INTERFACE_NAME=self._interface.id,
+            AUTO_SCOPE_SETUP='true' if auto_scope_setup else 'false',
+            CPP_CALLBACK_NAME=cpp_callback_name)
 
-    if is_custom:
-      self._cpp_declarations_emitter.Emit(
-          '\n'
-          'void $CPP_CALLBACK_NAME(Dart_NativeArguments);\n',
-          CPP_CALLBACK_NAME=cpp_callback_name)
+        if is_custom:
+            self._cpp_declarations_emitter.Emit(
+                '\n'
+                'void $CPP_CALLBACK_NAME(Dart_NativeArguments);\n',
+                CPP_CALLBACK_NAME=cpp_callback_name)
 
-    return cpp_callback_name
+        return cpp_callback_name
 
-  def _GenerateWebCoreReflectionAttributeName(self, attr):
-    namespace = 'HTMLNames'
-    svg_exceptions = ['class', 'id', 'onabort', 'onclick', 'onerror', 'onload',
-                      'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover',
-                      'onmouseup', 'onresize', 'onscroll', 'onunload']
-    if self._interface.id.startswith('SVG') and not attr.id in svg_exceptions:
-      namespace = 'SVGNames'
-    self._cpp_impl_includes.add('"%s.h"' % namespace)
+    def _GenerateWebCoreReflectionAttributeName(self, attr):
+        namespace = 'HTMLNames'
+        svg_exceptions = [
+            'class', 'id', 'onabort', 'onclick', 'onerror', 'onload',
+            'onmousedown', 'onmousemove', 'onmouseout', 'onmouseover',
+            'onmouseup', 'onresize', 'onscroll', 'onunload'
+        ]
+        if self._interface.id.startswith(
+                'SVG') and not attr.id in svg_exceptions:
+            namespace = 'SVGNames'
+        self._cpp_impl_includes.add('"%s.h"' % namespace)
 
-    attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower()
-    return 'WebCore::%s::%sAttr' % (namespace, attribute_name)
+        attribute_name = attr.ext_attrs['Reflect'] or attr.id.lower()
+        return 'WebCore::%s::%sAttr' % (namespace, attribute_name)
 
-  def _IsStatic(self, attribute_name):
-    return False
+    def _IsStatic(self, attribute_name):
+        return False
 
-  def _GenerateWebCoreFunctionExpression(self, function_name, idl_node, cpp_callback_name=None):
-    return None
+    def _GenerateWebCoreFunctionExpression(self,
+                                           function_name,
+                                           idl_node,
+                                           cpp_callback_name=None):
+        return None
 
-  def _IsArgumentOptionalInWebCore(self, operation, argument):
-    if not IsOptional(argument):
-      return False
-    if 'Callback' in argument.ext_attrs:
-      return False
-    if operation.id in ['addEventListener', 'removeEventListener'] and argument.id == 'useCapture':
-      return False
-    if 'DartForceOptional' in argument.ext_attrs:
-      return False
-    if argument.type.id == 'Dictionary':
-      return False
-    return True
+    def _IsArgumentOptionalInWebCore(self, operation, argument):
+        if not IsOptional(argument):
+            return False
+        if 'Callback' in argument.ext_attrs:
+            return False
+        if operation.id in ['addEventListener', 'removeEventListener'
+                           ] and argument.id == 'useCapture':
+            return False
+        if 'DartForceOptional' in argument.ext_attrs:
+            return False
+        if argument.type.id == 'Dictionary':
+            return False
+        return True
 
-  def _GenerateCPPIncludes(self, includes):
-    return None
+    def _GenerateCPPIncludes(self, includes):
+        return None
 
-  def _ToWebKitName(self, name):
-    name = name[0].lower() + name[1:]
-    name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(),
-                  name)
-    return re.sub(r'^(create|exclusive)',
-                  lambda s: 'is' + s.group(1).capitalize(),
-                  name)
+    def _ToWebKitName(self, name):
+        name = name[0].lower() + name[1:]
+        name = re.sub(r'^(hTML|uRL|jS|xML|xSLT)', lambda s: s.group(1).lower(),
+                      name)
+        return re.sub(r'^(create|exclusive)',
+                      lambda s: 'is' + s.group(1).capitalize(), name)
+
 
 class CPPLibraryEmitter():
-  def __init__(self, emitters, cpp_sources_dir):
-    self._emitters = emitters
-    self._cpp_sources_dir = cpp_sources_dir
-    self._library_headers = dict((lib, []) for lib in HTML_LIBRARY_NAMES)
-    self._sources_list = []
 
-  def CreateHeaderEmitter(self, interface_name, library_name, is_callback=False):
-    path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name)
-    if not is_callback:
-      self._library_headers[library_name].append(path)
-    return self._emitters.FileEmitter(path)
+    def __init__(self, emitters, cpp_sources_dir):
+        self._emitters = emitters
+        self._cpp_sources_dir = cpp_sources_dir
+        self._library_headers = dict((lib, []) for lib in HTML_LIBRARY_NAMES)
+        self._sources_list = []
 
-  def CreateSourceEmitter(self, interface_name):
-    path = os.path.join(self._cpp_sources_dir, 'Dart%s.cpp' % interface_name)
-    self._sources_list.append(path)
-    return self._emitters.FileEmitter(path)
+    def CreateHeaderEmitter(self,
+                            interface_name,
+                            library_name,
+                            is_callback=False):
+        path = os.path.join(self._cpp_sources_dir, 'Dart%s.h' % interface_name)
+        if not is_callback:
+            self._library_headers[library_name].append(path)
+        return self._emitters.FileEmitter(path)
 
-  def EmitDerivedSources(self, template, output_dir):
-    partitions = 20 # FIXME: this should be configurable.
-    sources_count = len(self._sources_list)
-    for i in range(0, partitions):
-      file_path = os.path.join(output_dir, 'DartDerivedSources%02i.cpp' % (i + 1))
-      includes_emitter = self._emitters.FileEmitter(file_path).Emit(template)
-      for source_file in self._sources_list[i::partitions]:
-        path = os.path.relpath(source_file, output_dir)
-        includes_emitter.Emit('#include "$PATH"\n', PATH=path)
+    def CreateSourceEmitter(self, interface_name):
+        path = os.path.join(self._cpp_sources_dir,
+                            'Dart%s.cpp' % interface_name)
+        self._sources_list.append(path)
+        return self._emitters.FileEmitter(path)
 
-  def EmitResolver(self, template, output_dir):
-    for library_name in self._library_headers.keys():
-      file_path = os.path.join(output_dir, '%s_DartResolver.cpp' % library_name)
-      includes_emitter, body_emitter = self._emitters.FileEmitter(file_path).Emit(
-        template,
-        LIBRARY_NAME=library_name)
+    def EmitDerivedSources(self, template, output_dir):
+        partitions = 20  # FIXME: this should be configurable.
+        sources_count = len(self._sources_list)
+        for i in range(0, partitions):
+            file_path = os.path.join(output_dir,
+                                     'DartDerivedSources%02i.cpp' % (i + 1))
+            includes_emitter = self._emitters.FileEmitter(file_path).Emit(
+                template)
+            for source_file in self._sources_list[i::partitions]:
+                path = os.path.relpath(source_file, output_dir)
+                includes_emitter.Emit('#include "$PATH"\n', PATH=path)
 
-      headers = self._library_headers[library_name]
-      for header_file in headers:
-        path = os.path.relpath(header_file, output_dir)
-        includes_emitter.Emit('#include "$PATH"\n', PATH=path)
-        body_emitter.Emit(
-            '    if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argumentCount, autoSetupScope))\n'
-            '        return func;\n',
-            CLASS_NAME=os.path.splitext(os.path.basename(path))[0])
+    def EmitResolver(self, template, output_dir):
+        for library_name in self._library_headers.keys():
+            file_path = os.path.join(output_dir,
+                                     '%s_DartResolver.cpp' % library_name)
+            includes_emitter, body_emitter = self._emitters.FileEmitter(
+                file_path).Emit(
+                    template, LIBRARY_NAME=library_name)
 
-  def EmitClassIdTable(self, database, output_dir, type_registry, renamer):
-    def HasConverters(interface):
-      is_node_test = lambda interface: interface.id == 'Node'
-      is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
-      is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
+            headers = self._library_headers[library_name]
+            for header_file in headers:
+                path = os.path.relpath(header_file, output_dir)
+                includes_emitter.Emit('#include "$PATH"\n', PATH=path)
+                body_emitter.Emit(
+                    '    if (Dart_NativeFunction func = $CLASS_NAME::resolver(name, argumentCount, autoSetupScope))\n'
+                    '        return func;\n',
+                    CLASS_NAME=os.path.splitext(os.path.basename(path))[0])
 
-      return (any(map(is_node_test, database.Hierarchy(interface))) or
-              any(map(is_active_test, database.Hierarchy(interface))) or
-              any(map(is_event_target_test, database.Hierarchy(interface))))
+    def EmitClassIdTable(self, database, output_dir, type_registry, renamer):
 
+        def HasConverters(interface):
+            is_node_test = lambda interface: interface.id == 'Node'
+            is_active_test = lambda interface: 'ActiveDOMObject' in interface.ext_attrs
+            is_event_target_test = lambda interface: 'EventTarget' in interface.ext_attrs
 
-    path = os.path.join(output_dir, 'DartWebkitClassIds.h')
-    e = self._emitters.FileEmitter(path)
-    e.Emit('// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file\n');
-    e.Emit('// for details. All rights reserved. Use of this source code is governed by a\n');
-    e.Emit('// BSD-style license that can be found in the LICENSE file.\n');
-    e.Emit('// WARNING: Do not edit - generated code.\n');
-    e.Emit('// See dart/tools/dom/scripts/systemnative.py\n');
-    e.Emit('\n');
-    e.Emit('#ifndef DartWebkitClassIds_h\n');
-    e.Emit('#define DartWebkitClassIds_h\n');
-    e.Emit('\n');
-    e.Emit('namespace WebCore {\n');
-    e.Emit('\n');
-    e.Emit('enum {\n');
-    e.Emit('    _InvalidClassId = 0,\n');
-    e.Emit('    _HistoryCrossFrameClassId,\n');
-    e.Emit('    _LocationCrossFrameClassId,\n');
-    e.Emit('    _DOMWindowCrossFrameClassId,\n');
-    e.Emit('    _DateTimeClassId,\n');
-    e.Emit('    _JsObjectClassId,\n');
-    e.Emit('    _JsFunctionClassId,\n');
-    e.Emit('    _JsArrayClassId,\n');
-    e.Emit('    // New types that are not auto-generated should be added here.\n');
-    e.Emit('\n');
-    for interface in database.GetInterfaces():
-      e.Emit('    %sClassId,\n' % interface.id)
-    e.Emit('    NumWebkitClassIds\n');
-    e.Emit('};\n');
-    e.Emit('class ActiveDOMObject;\n'
-           'class EventTarget;\n'
-           'class Node;\n'
-           'typedef ActiveDOMObject* (*ToActiveDOMObject)(void* value);\n'
-           'typedef EventTarget* (*ToEventTarget)(void* value);\n'
-           'typedef Node* (*ToNode)(void* value);\n'
-           'typedef struct {\n'
-           '    const char* class_name;\n'
-           '    int library_id;\n'
-           '    int base_class_id;\n'
-           '    ToActiveDOMObject toActiveDOMObject;\n'
-           '    ToEventTarget toEventTarget;\n'
-           '    ToNode toNode;\n'
-           '} DartWrapperTypeInfo;\n'
-           'typedef DartWrapperTypeInfo _DartWebkitClassInfo[NumWebkitClassIds];\n'
-           '\n'
-           'extern _DartWebkitClassInfo DartWebkitClassInfo;\n'
-           '\n'
-           '} // namespace WebCore\n'
-           '#endif // DartWebkitClassIds_h\n');
+            return (
+                any(map(is_node_test, database.Hierarchy(interface))) or
+                any(map(is_active_test, database.Hierarchy(interface))) or
+                any(map(is_event_target_test, database.Hierarchy(interface))))
 
-    path = os.path.join(output_dir, 'DartWebkitClassIds.cpp')
-    e = self._emitters.FileEmitter(path)
-    e.Emit('// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file\n');
-    e.Emit('// for details. All rights reserved. Use of this source code is governed by a\n');
-    e.Emit('// BSD-style license that can be found in the LICENSE file.\n');
-    e.Emit('// WARNING: Do not edit - generated code.\n');
-    e.Emit('// See dart/tools/dom/scripts/systemnative.py\n');
-    e.Emit('\n');
-    e.Emit('#include "config.h"\n');
-    e.Emit('#include "DartWebkitClassIds.h"\n');
-    e.Emit('\n');
-    e.Emit('#include "bindings/dart/DartLibraryIds.h"\n');
-    for interface in database.GetInterfaces():
-      if HasConverters(interface):
-        e.Emit('#include "Dart%s.h"\n' % interface.id);
-    e.Emit('\n');
+        path = os.path.join(output_dir, 'DartWebkitClassIds.h')
+        e = self._emitters.FileEmitter(path)
+        e.Emit(
+            '// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file\n'
+        )
+        e.Emit(
+            '// for details. All rights reserved. Use of this source code is governed by a\n'
+        )
+        e.Emit('// BSD-style license that can be found in the LICENSE file.\n')
+        e.Emit('// WARNING: Do not edit - generated code.\n')
+        e.Emit('// See dart/tools/dom/scripts/systemnative.py\n')
+        e.Emit('\n')
+        e.Emit('#ifndef DartWebkitClassIds_h\n')
+        e.Emit('#define DartWebkitClassIds_h\n')
+        e.Emit('\n')
+        e.Emit('namespace WebCore {\n')
+        e.Emit('\n')
+        e.Emit('enum {\n')
+        e.Emit('    _InvalidClassId = 0,\n')
+        e.Emit('    _HistoryCrossFrameClassId,\n')
+        e.Emit('    _LocationCrossFrameClassId,\n')
+        e.Emit('    _DOMWindowCrossFrameClassId,\n')
+        e.Emit('    _DateTimeClassId,\n')
+        e.Emit('    _JsObjectClassId,\n')
+        e.Emit('    _JsFunctionClassId,\n')
+        e.Emit('    _JsArrayClassId,\n')
+        e.Emit(
+            '    // New types that are not auto-generated should be added here.\n'
+        )
+        e.Emit('\n')
+        for interface in database.GetInterfaces():
+            e.Emit('    %sClassId,\n' % interface.id)
+        e.Emit('    NumWebkitClassIds\n')
+        e.Emit('};\n')
+        e.Emit(
+            'class ActiveDOMObject;\n'
+            'class EventTarget;\n'
+            'class Node;\n'
+            'typedef ActiveDOMObject* (*ToActiveDOMObject)(void* value);\n'
+            'typedef EventTarget* (*ToEventTarget)(void* value);\n'
+            'typedef Node* (*ToNode)(void* value);\n'
+            'typedef struct {\n'
+            '    const char* class_name;\n'
+            '    int library_id;\n'
+            '    int base_class_id;\n'
+            '    ToActiveDOMObject toActiveDOMObject;\n'
+            '    ToEventTarget toEventTarget;\n'
+            '    ToNode toNode;\n'
+            '} DartWrapperTypeInfo;\n'
+            'typedef DartWrapperTypeInfo _DartWebkitClassInfo[NumWebkitClassIds];\n'
+            '\n'
+            'extern _DartWebkitClassInfo DartWebkitClassInfo;\n'
+            '\n'
+            '} // namespace WebCore\n'
+            '#endif // DartWebkitClassIds_h\n')
 
-    e.Emit('namespace WebCore {\n');
+        path = os.path.join(output_dir, 'DartWebkitClassIds.cpp')
+        e = self._emitters.FileEmitter(path)
+        e.Emit(
+            '// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file\n'
+        )
+        e.Emit(
+            '// for details. All rights reserved. Use of this source code is governed by a\n'
+        )
+        e.Emit('// BSD-style license that can be found in the LICENSE file.\n')
+        e.Emit('// WARNING: Do not edit - generated code.\n')
+        e.Emit('// See dart/tools/dom/scripts/systemnative.py\n')
+        e.Emit('\n')
+        e.Emit('#include "config.h"\n')
+        e.Emit('#include "DartWebkitClassIds.h"\n')
+        e.Emit('\n')
+        e.Emit('#include "bindings/dart/DartLibraryIds.h"\n')
+        for interface in database.GetInterfaces():
+            if HasConverters(interface):
+                e.Emit('#include "Dart%s.h"\n' % interface.id)
+        e.Emit('\n')
 
-    e.Emit('\n');
+        e.Emit('namespace WebCore {\n')
 
-    e.Emit('ActiveDOMObject* toNullActiveDOMObject(void* value) { return 0; }\n');
-    e.Emit('EventTarget* toNullEventTarget(void* value) { return 0; }\n');
-    e.Emit('Node* toNullNode(void* value) { return 0; }\n');
+        e.Emit('\n')
 
-    e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n")
+        e.Emit(
+            'ActiveDOMObject* toNullActiveDOMObject(void* value) { return 0; }\n'
+        )
+        e.Emit('EventTarget* toNullEventTarget(void* value) { return 0; }\n')
+        e.Emit('Node* toNullNode(void* value) { return 0; }\n')
 
-    e.Emit('    {\n'
-           '        "_InvalidClassId", -1, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "_HistoryCrossFrame", DartHtmlLibraryId, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "_LocationCrossFrame", DartHtmlLibraryId, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "_DOMWindowCrossFrame", DartHtmlLibraryId, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "DateTime", DartCoreLibraryId, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "JsObject", DartJsLibraryId, -1,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "JsFunction", DartJsLibraryId, _JsObjectClassId,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    {\n'
-           '        "JsArray", DartJsLibraryId, _JsObjectClassId,\n'
-           '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
-           '    },\n');
-    e.Emit('    // New types that are not auto-generated should be added here.\n');
-    for interface in database.GetInterfaces():
-      name = interface.id
-      type_info = type_registry.TypeInfo(name)
-      type_info.native_type().replace('<', '_').replace('>', '_')
-      e.Emit('    {\n')
-      e.Emit('        "%s", ' % type_info.implementation_name())
-      e.Emit('Dart%sLibraryId, ' % renamer.GetLibraryId(interface))
-      if interface.parents:
-        supertype = interface.parents[0].type.id
-        e.Emit('%sClassId,\n' % supertype)
-      else:
-        e.Emit(' -1,\n')
-      if HasConverters(interface):
-        e.Emit('        Dart%s::toActiveDOMObject, Dart%s::toEventTarget,'
-               ' Dart%s::toNode\n' % (name, name, name))
-      else:
-        e.Emit('        toNullActiveDOMObject, toNullEventTarget, toNullNode\n')
-      e.Emit('    },\n')
+        e.Emit("_DartWebkitClassInfo DartWebkitClassInfo = {\n")
 
-    e.Emit("};\n");
-    e.Emit('\n');
-    e.Emit('} // namespace WebCore\n');
+        e.Emit('    {\n'
+               '        "_InvalidClassId", -1, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "_HistoryCrossFrame", DartHtmlLibraryId, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "_LocationCrossFrame", DartHtmlLibraryId, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "_DOMWindowCrossFrame", DartHtmlLibraryId, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "DateTime", DartCoreLibraryId, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "JsObject", DartJsLibraryId, -1,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "JsFunction", DartJsLibraryId, _JsObjectClassId,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit('    {\n'
+               '        "JsArray", DartJsLibraryId, _JsObjectClassId,\n'
+               '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+               '    },\n')
+        e.Emit(
+            '    // New types that are not auto-generated should be added here.\n'
+        )
+        for interface in database.GetInterfaces():
+            name = interface.id
+            type_info = type_registry.TypeInfo(name)
+            type_info.native_type().replace('<', '_').replace('>', '_')
+            e.Emit('    {\n')
+            e.Emit('        "%s", ' % type_info.implementation_name())
+            e.Emit('Dart%sLibraryId, ' % renamer.GetLibraryId(interface))
+            if interface.parents:
+                supertype = interface.parents[0].type.id
+                e.Emit('%sClassId,\n' % supertype)
+            else:
+                e.Emit(' -1,\n')
+            if HasConverters(interface):
+                e.Emit(
+                    '        Dart%s::toActiveDOMObject, Dart%s::toEventTarget,'
+                    ' Dart%s::toNode\n' % (name, name, name))
+            else:
+                e.Emit(
+                    '        toNullActiveDOMObject, toNullEventTarget, toNullNode\n'
+                )
+            e.Emit('    },\n')
+
+        e.Emit("};\n")
+        e.Emit('\n')
+        e.Emit('} // namespace WebCore\n')
+
 
 def _IsOptionalStringArgumentInInitEventMethod(interface, operation, argument):
-  return (
-      interface.id.endswith('Event') and
-      operation.id.startswith('init') and
-      argument.default_value == 'Undefined' and
-      argument.type.id == 'DOMString')
+    return (interface.id.endswith('Event') and
+            operation.id.startswith('init') and
+            argument.default_value == 'Undefined' and
+            argument.type.id == 'DOMString')
+
 
 def _IsCustom(op_or_attr):
-  assert(isinstance(op_or_attr, IDLMember))
-  return 'Custom' in op_or_attr.ext_attrs or 'DartCustom' in op_or_attr.ext_attrs
+    assert (isinstance(op_or_attr, IDLMember))
+    return 'Custom' in op_or_attr.ext_attrs or 'DartCustom' in op_or_attr.ext_attrs
+
 
 def _IsCustomValue(op_or_attr, value):
-  if _IsCustom(op_or_attr):
-    return op_or_attr.ext_attrs.get('Custom') == value \
-           or op_or_attr.ext_attrs.get('DartCustom') == value
-  return False
+    if _IsCustom(op_or_attr):
+        return op_or_attr.ext_attrs.get('Custom') == value \
+               or op_or_attr.ext_attrs.get('DartCustom') == value
+    return False
diff --git a/tools/dom/scripts/templateloader.py b/tools/dom/scripts/templateloader.py
index 88ef894..fcbebe8 100644
--- a/tools/dom/scripts/templateloader.py
+++ b/tools/dom/scripts/templateloader.py
@@ -16,11 +16,12 @@
 
 import os
 
-class TemplateLoader(object):
-  """Loads template files from a path."""
 
-  def __init__(self, root, subpaths, conditions = {}):
-    """Initializes loader.
+class TemplateLoader(object):
+    """Loads template files from a path."""
+
+    def __init__(self, root, subpaths, conditions={}):
+        """Initializes loader.
 
     Args:
       root - a string, the directory under which the templates are stored.
@@ -28,92 +29,94 @@
       conditions - a dictionay from strings to booleans.  Any conditional
         expression must be a key in the map.
     """
-    self._root = root
-    self._subpaths = subpaths
-    self._conditions = conditions
-    self._cache = {}
+        self._root = root
+        self._subpaths = subpaths
+        self._conditions = conditions
+        self._cache = {}
 
-  def TryLoad(self, name, more_conditions={}):
-    """Returns content of template file as a string, or None of not found."""
-    conditions = dict(self._conditions, **more_conditions)
-    cache_key = (name, tuple(sorted(conditions.items())))
-    if cache_key in self._cache:
-      return self._cache[cache_key]
+    def TryLoad(self, name, more_conditions={}):
+        """Returns content of template file as a string, or None of not found."""
+        conditions = dict(self._conditions, **more_conditions)
+        cache_key = (name, tuple(sorted(conditions.items())))
+        if cache_key in self._cache:
+            return self._cache[cache_key]
 
-    for subpath in self._subpaths:
-      template_file = os.path.join(self._root, subpath, name)
-      if os.path.exists(template_file):
-        template = ''.join(open(template_file).readlines())
-        template = self._Preprocess(template, template_file, conditions)
-        self._cache[cache_key] = template
-        return template
+        for subpath in self._subpaths:
+            template_file = os.path.join(self._root, subpath, name)
+            if os.path.exists(template_file):
+                template = ''.join(open(template_file).readlines())
+                template = self._Preprocess(template, template_file, conditions)
+                self._cache[cache_key] = template
+                return template
 
-    return None
+        return None
 
-  def Load(self, name, more_conditions={}):
-    """Returns contents of template file as a string, or raises an exception."""
-    template = self.TryLoad(name, more_conditions)
-    if template is not None:  # Can be empty string
-      return template
-    raise Exception("Could not find template '%s' on %s / %s" % (
-        name, self._root, self._subpaths))
+    def Load(self, name, more_conditions={}):
+        """Returns contents of template file as a string, or raises an exception."""
+        template = self.TryLoad(name, more_conditions)
+        if template is not None:  # Can be empty string
+            return template
+        raise Exception("Could not find template '%s' on %s / %s" %
+                        (name, self._root, self._subpaths))
 
-  def _Preprocess(self, template, filename, conditions):
-    def error(lineno, message):
-      raise Exception('%s:%s: %s' % (filename, lineno, message))
+    def _Preprocess(self, template, filename, conditions):
 
-    lines = template.splitlines(True)
-    out = []
+        def error(lineno, message):
+            raise Exception('%s:%s: %s' % (filename, lineno, message))
 
-    condition_stack = []
-    active = True
-    seen_else = False
+        lines = template.splitlines(True)
+        out = []
 
-    for (lineno, full_line) in enumerate(lines):
-      line = full_line.strip()
+        condition_stack = []
+        active = True
+        seen_else = False
 
-      if line.startswith('$'):
-        words = line.split()
-        directive = words[0]
+        for (lineno, full_line) in enumerate(lines):
+            line = full_line.strip()
 
-        if directive == '$if':
-          if len(words) != 2:
-            error(lineno, '$if does not have single variable')
-          variable = words[1]
-          if variable in conditions:
-            condition_stack.append((active, seen_else))
-            active = active and conditions[variable]
-            seen_else = False
-          else:
-            error(lineno, "Unknown $if variable '%s'" % variable)
+            if line.startswith('$'):
+                words = line.split()
+                directive = words[0]
 
-        elif directive == '$else':
-          if not condition_stack:
-            error(lineno, '$else without $if')
-          if seen_else:
-            raise error(lineno, 'Double $else')
-          seen_else = True
-          (parentactive, _) = condition_stack[len(condition_stack) - 1]
-          active = not active and parentactive
+                if directive == '$if':
+                    if len(words) != 2:
+                        error(lineno, '$if does not have single variable')
+                    variable = words[1]
+                    if variable in conditions:
+                        condition_stack.append((active, seen_else))
+                        active = active and conditions[variable]
+                        seen_else = False
+                    else:
+                        error(lineno, "Unknown $if variable '%s'" % variable)
 
-        elif directive == '$endif':
-          if not condition_stack:
-            error(lineno, '$endif without $if')
-          (active, seen_else) = condition_stack.pop()
+                elif directive == '$else':
+                    if not condition_stack:
+                        error(lineno, '$else without $if')
+                    if seen_else:
+                        raise error(lineno, 'Double $else')
+                    seen_else = True
+                    (parentactive,
+                     _) = condition_stack[len(condition_stack) - 1]
+                    active = not active and parentactive
 
-        else:
-          # Something else, like '$!MEMBERS'
-          if active:
-            out.append(full_line)
-      elif line.startswith('//$'):
-        pass  # Ignore pre-processor comment.
+                elif directive == '$endif':
+                    if not condition_stack:
+                        error(lineno, '$endif without $if')
+                    (active, seen_else) = condition_stack.pop()
 
-      else:
-        if active:
-          out.append(full_line)
-        continue
+                else:
+                    # Something else, like '$!MEMBERS'
+                    if active:
+                        out.append(full_line)
+            elif line.startswith('//$'):
+                pass  # Ignore pre-processor comment.
 
-    if condition_stack:
-      error(len(lines), 'Unterminated $if')
+            else:
+                if active:
+                    out.append(full_line)
+                continue
 
-    return ''.join(out)
+        if condition_stack:
+            error(len(lines), 'Unterminated $if')
+
+        return ''.join(out)
diff --git a/tools/dom/scripts/templateloader_test.py b/tools/dom/scripts/templateloader_test.py
index 3fb644f..edcd759 100755
--- a/tools/dom/scripts/templateloader_test.py
+++ b/tools/dom/scripts/templateloader_test.py
@@ -7,52 +7,49 @@
 import unittest
 import templateloader
 
+
 class TemplateLoaderTestCase(unittest.TestCase):
 
-  def _preprocess(self, input_text, conds):
-    loader = templateloader.TemplateLoader('.', [], conds)
-    return loader._Preprocess(input_text, '<file>', conds)
+    def _preprocess(self, input_text, conds):
+        loader = templateloader.TemplateLoader('.', [], conds)
+        return loader._Preprocess(input_text, '<file>', conds)
 
-
-  def _preprocess_test(self, input_text, conds, expected_text):
-    output_text = self._preprocess(input_text, conds)
-    if output_text != expected_text:
-      msg = '''
+    def _preprocess_test(self, input_text, conds, expected_text):
+        output_text = self._preprocess(input_text, conds)
+        if output_text != expected_text:
+            msg = '''
 EXPECTED:
 %s
 ---
 ACTUAL  :
 %s
 ---''' % (expected_text, output_text)
-      self.fail(msg)
+            self.fail(msg)
 
+    def _preprocess_error_test(self, input_text, conds, expected_message):
+        threw = False
+        try:
+            output_text = self._preprocess(input_text, conds)
+        except Exception, e:
+            threw = True
+            if str(e).find(expected_message) == -1:
+                self.fail("'%s' does not contain '%s'" % (e, expected_message))
+        if not threw:
+            self.fail("missing error, expected '%s'" % expected_message)
 
-  def _preprocess_error_test(self, input_text, conds, expected_message):
-    threw = False
-    try:
-      output_text = self._preprocess(input_text, conds)
-    except Exception, e:
-      threw = True
-      if str(e).find(expected_message) == -1:
-        self.fail("'%s' does not contain '%s'" % (e, expected_message))
-    if not threw:
-      self.fail("missing error, expected '%s'" % expected_message)
-
-
-  def test_freevar(self):
-    input_text = '''$A
+    def test_freevar(self):
+        input_text = '''$A
 $B'''
-    self._preprocess_test(input_text, {}, input_text)
+        self._preprocess_test(input_text, {}, input_text)
 
-  def test_comments(self):
-    input_text = '''//$ comment 1
+    def test_comments(self):
+        input_text = '''//$ comment 1
 Hello
 //$ comment 2'''
-    self._preprocess_test(input_text, {}, 'Hello\n')
+        self._preprocess_test(input_text, {}, 'Hello\n')
 
-
-  def test_ite1(self):
-    input_text = '''
+    def test_ite1(self):
+        input_text = '''
         aaa
         $if A
         bbb
@@ -61,15 +58,15 @@
         $endif
         ddd
         '''
-    self._preprocess_test(input_text, {'A':True},
-        '''
+        self._preprocess_test(
+            input_text, {'A': True}, '''
         aaa
         bbb
         ddd
         ''')
 
-  def test_ite2(self):
-    input_text = '''
+    def test_ite2(self):
+        input_text = '''
         aaa
         $if A
         bbb
@@ -78,54 +75,55 @@
         $endif
         ddd
         '''
-    self._preprocess_test(input_text, {'A':False},
-        '''
+        self._preprocess_test(
+            input_text, {'A': False}, '''
         aaa
         ccc
         ddd
         ''')
 
-  def test_if1(self):
-    input_text = '''
+    def test_if1(self):
+        input_text = '''
        $if
        '''
-    self._preprocess_error_test(input_text, {},
-        '$if does not have single variable')
+        self._preprocess_error_test(input_text, {},
+                                    '$if does not have single variable')
 
-  def test_if2(self):
-    input_text = '''
+    def test_if2(self):
+        input_text = '''
        $if A
        '''
-    self._preprocess_error_test(input_text, {}, 'Unknown $if variable')
+        self._preprocess_error_test(input_text, {}, 'Unknown $if variable')
 
-  def test_else1(self):
-    input_text = '''
+    def test_else1(self):
+        input_text = '''
        $else
        '''
-    self._preprocess_error_test(input_text, {}, '$else without $if')
+        self._preprocess_error_test(input_text, {}, '$else without $if')
 
-  def test_else2(self):
-    input_text = '''
+    def test_else2(self):
+        input_text = '''
        $if A
        $else
        $else
        '''
-    self._preprocess_error_test(input_text, {'A':True}, 'Double $else')
+        self._preprocess_error_test(input_text, {'A': True}, 'Double $else')
 
-  def test_eof1(self):
-    input_text = '''
+    def test_eof1(self):
+        input_text = '''
        $if A
        '''
-    self._preprocess_error_test(input_text, {'A':True}, 'Unterminated')
+        self._preprocess_error_test(input_text, {'A': True}, 'Unterminated')
 
-  def test_eof2(self):
-    input_text = '''
+    def test_eof2(self):
+        input_text = '''
        $if A
        $else
        '''
-    self._preprocess_error_test(input_text, {'A':True}, 'Unterminated')
+        self._preprocess_error_test(input_text, {'A': True}, 'Unterminated')
+
 
 if __name__ == "__main__":
-  logging.config.fileConfig("logging.conf")
-  if __name__ == '__main__':
-    unittest.main()
+    logging.config.fileConfig("logging.conf")
+    if __name__ == '__main__':
+        unittest.main()
diff --git a/tools/dom/src/CrossFrameTypes.dart b/tools/dom/src/CrossFrameTypes.dart
index ba4a7f8..a2aa545 100644
--- a/tools/dom/src/CrossFrameTypes.dart
+++ b/tools/dom/src/CrossFrameTypes.dart
@@ -116,12 +116,14 @@
    *     var other = window.open('http://www.example.com', 'foo');
    *     // Closes other window, as it is script-closeable.
    *     other.close();
-   *     print(other.closed()); // 'true'
+   *     print(other.closed); // 'true'
    *
-   *     window.location('http://www.mysite.com', 'foo');
+   *     var newLocation = window.location
+   *         ..href = 'http://www.mysite.com';
+   *     window.location = newLocation;
    *     // Does not close this window, as the history has changed.
    *     window.close();
-   *     print(window.closed()); // 'false'
+   *     print(window.closed); // 'false'
    *
    * See also:
    *
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 740bc1c..2786eee 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1421,6 +1421,9 @@
   }
   String get innerHtml => _innerHtml;
 
+  @JSName('innerText')
+  String innerText;
+
   /**
    * This is an ease-of-use accessor for event streams which should only be
    * used when an explicit accessor is not available.
diff --git a/tools/dom/templates/html/impl/impl_PointerEvent.darttemplate b/tools/dom/templates/html/impl/impl_PointerEvent.darttemplate
new file mode 100644
index 0000000..f13070b
--- /dev/null
+++ b/tools/dom/templates/html/impl/impl_PointerEvent.darttemplate
@@ -0,0 +1,21 @@
+// 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.
+
+// WARNING: Do not edit - generated code.
+
+part of $LIBRARYNAME;
+
+$(ANNOTATIONS)$(NATIVESPEC)$(CLASS_MODIFIERS)class $CLASSNAME$EXTENDS$IMPLEMENTS {
+$!MEMBERS
+  /**
+   * PointerEvent used for both touch and mouse.  To check if touch is supported
+   * call the property TouchEvent.supported
+   */
+  static bool get supported {
+    try {
+      return PointerEvent('pointerover') is PointerEvent;
+    } catch (_) {}
+    return false;
+  }
+}
diff --git a/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate b/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
index 5a30fd4..89a5c90 100644
--- a/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
+++ b/tools/dom/templates/html/impl/impl_TouchEvent.darttemplate
@@ -10,9 +10,12 @@
 $!MEMBERS
   /**
    * Checks if touch events supported on the current platform.
-   *
-   * Note that touch events are only supported if the user is using a touch
-   * device.
    */
-  static bool get supported => Device.isEventTypeSupported('TouchEvent');
+   static bool get supported {
+    try {
+      return TouchEvent('touches') is TouchEvent;
+    } catch (_) {}
+
+    return false;
+  }
 }
diff --git a/tools/dom/templates/html/impl/impl_Window.darttemplate b/tools/dom/templates/html/impl/impl_Window.darttemplate
index 59d3c33..ec7d83c 100644
--- a/tools/dom/templates/html/impl/impl_Window.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Window.darttemplate
@@ -76,7 +76,7 @@
   // TODO: consider forcing users to do: window.location.assign('string').
   /**
    * Sets the window's location, which causes the browser to navigate to the new
-   * location. [value] may be a Location object or a String.
+   * location.
    */
   set location(value) {
     _location = value;
diff --git a/tools/download_abi_dills.py b/tools/download_abi_dills.py
index 5de464b..7ad544c 100644
--- a/tools/download_abi_dills.py
+++ b/tools/download_abi_dills.py
@@ -7,42 +7,44 @@
 
 
 def procWait(p):
-  while p.returncode is None:
-    p.communicate()
-    p.poll()
-  return p.returncode
+    while p.returncode is None:
+        p.communicate()
+        p.poll()
+    return p.returncode
 
 
 def findAbiVersion(version):
-  cmd = ['cipd', 'instances', 'dart/abiversions/%d' % version]
-  p = subprocess.Popen(cmd,
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.PIPE,
-                       shell = utils.IsWindows(),
-                       cwd = utils.DART_DIR)
-  return procWait(p) == 0
+    cmd = ['cipd', 'instances', 'dart/abiversions/%d' % version]
+    p = subprocess.Popen(
+        cmd,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        shell=utils.IsWindows(),
+        cwd=utils.DART_DIR)
+    return procWait(p) == 0
 
 
 def main():
-  abi_version = int(utils.GetAbiVersion())
-  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
-  cmd = ['cipd', 'ensure', '-root', 'tools/abiversions', '-ensure-file', '-']
-  ensure_file = ''
-  for i in range(oldest_abi_version, abi_version + 1):
-    if findAbiVersion(i):
-      ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
-  if not ensure_file:
-    return 0
-  p = subprocess.Popen(cmd,
-                       stdin = subprocess.PIPE,
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.PIPE,
-                       shell = utils.IsWindows(),
-                       cwd = utils.DART_DIR)
-  p.communicate(ensure_file)
-  p.stdin.close()
-  return procWait(p)
+    abi_version = int(utils.GetAbiVersion())
+    oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
+    cmd = ['cipd', 'ensure', '-root', 'tools/abiversions', '-ensure-file', '-']
+    ensure_file = ''
+    for i in range(oldest_abi_version, abi_version + 1):
+        if findAbiVersion(i):
+            ensure_file += '@Subdir %d\ndart/abiversions/%d latest\n\n' % (i, i)
+    if not ensure_file:
+        return 0
+    p = subprocess.Popen(
+        cmd,
+        stdin=subprocess.PIPE,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        shell=utils.IsWindows(),
+        cwd=utils.DART_DIR)
+    p.communicate(ensure_file)
+    p.stdin.close()
+    return procWait(p)
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/download_latest_dev_sdk.py b/tools/download_latest_dev_sdk.py
index 36bab55..1a30b5e 100755
--- a/tools/download_latest_dev_sdk.py
+++ b/tools/download_latest_dev_sdk.py
@@ -22,63 +22,69 @@
 DEFAULT_DART_VERSION = 'latest'
 BASE_URL = 'http://gsdview.appspot.com/dart-archive/channels/dev/raw/%s/sdk/%s'
 
+
 def host_os_for_sdk(host_os):
-  if host_os.startswith('macos'):
-    return 'mac'
-  if host_os.startswith('win'):
-    return 'windows'
-  return host_os
+    if host_os.startswith('macos'):
+        return 'mac'
+    if host_os.startswith('win'):
+        return 'windows'
+    return host_os
+
 
 # Python's zipfile doesn't preserve file permissions during extraction, so we
 # have to do it manually.
 def extract_file(zf, info, extract_dir):
-  try:
-    zf.extract(info.filename, path=extract_dir)
-    out_path = os.path.join(extract_dir, info.filename)
-    perm = info.external_attr >> 16L
-    os.chmod(out_path, perm)
-  except IOError as err:
-    if 'dart-sdk/bin/dart' in err.filename:
-      print('Failed to extract the new Dart SDK dart binary. ' +
-            'Kill stale instances (like the analyzer) and try the update again')
-      return False
-    raise
-  return True
+    try:
+        zf.extract(info.filename, path=extract_dir)
+        out_path = os.path.join(extract_dir, info.filename)
+        perm = info.external_attr >> 16L
+        os.chmod(out_path, perm)
+    except IOError as err:
+        if 'dart-sdk/bin/dart' in err.filename:
+            print(
+                'Failed to extract the new Dart SDK dart binary. ' +
+                'Kill stale instances (like the analyzer) and try the update again'
+            )
+            return False
+        raise
+    return True
+
 
 def main(argv):
-  host_os = host_os_for_sdk(HOST_OS)
-  zip_file = ('dartsdk-%s-x64-release.zip' % HOST_OS)
-  sha_file = zip_file + '.sha256sum'
-  sdk_path = os.path.join(DART_ROOT, 'tools', 'sdks')
-  local_sha_path = os.path.join(sdk_path, sha_file)
-  remote_sha_path = os.path.join(sdk_path, sha_file + '.remote')
-  zip_path = os.path.join(sdk_path, zip_file)
+    host_os = host_os_for_sdk(HOST_OS)
+    zip_file = ('dartsdk-%s-x64-release.zip' % HOST_OS)
+    sha_file = zip_file + '.sha256sum'
+    sdk_path = os.path.join(DART_ROOT, 'tools', 'sdks')
+    local_sha_path = os.path.join(sdk_path, sha_file)
+    remote_sha_path = os.path.join(sdk_path, sha_file + '.remote')
+    zip_path = os.path.join(sdk_path, zip_file)
 
-  sdk_version = DEFAULT_DART_VERSION
-  sha_url = (BASE_URL % (sdk_version, sha_file))
-  zip_url = (BASE_URL % (sdk_version, zip_file))
+    sdk_version = DEFAULT_DART_VERSION
+    sha_url = (BASE_URL % (sdk_version, sha_file))
+    zip_url = (BASE_URL % (sdk_version, zip_file))
 
-  local_sha = ''
-  if os.path.isfile(local_sha_path):
-    with open(local_sha_path, 'r') as fp:
-      local_sha = fp.read()
+    local_sha = ''
+    if os.path.isfile(local_sha_path):
+        with open(local_sha_path, 'r') as fp:
+            local_sha = fp.read()
 
-  remote_sha = ''
-  urllib.urlretrieve(sha_url, remote_sha_path)
-  with open(remote_sha_path, 'r') as fp:
-    remote_sha = fp.read()
-  os.remove(remote_sha_path)
+    remote_sha = ''
+    urllib.urlretrieve(sha_url, remote_sha_path)
+    with open(remote_sha_path, 'r') as fp:
+        remote_sha = fp.read()
+    os.remove(remote_sha_path)
 
-  if local_sha == '' or local_sha != remote_sha:
-    print 'Downloading prebuilt Dart SDK from: ' + zip_url
-    urllib.urlretrieve(zip_url, zip_path)
-    with zipfile.ZipFile(zip_path, 'r') as zf:
-      for info in zf.infolist():
-        if not extract_file(zf, info, sdk_path):
-          return -1
-    with open(local_sha_path, 'w') as fp:
-      fp.write(remote_sha)
-  return 0
+    if local_sha == '' or local_sha != remote_sha:
+        print 'Downloading prebuilt Dart SDK from: ' + zip_url
+        urllib.urlretrieve(zip_url, zip_path)
+        with zipfile.ZipFile(zip_path, 'r') as zf:
+            for info in zf.infolist():
+                if not extract_file(zf, info, sdk_path):
+                    return -1
+        with open(local_sha_path, 'w') as fp:
+            fp.write(remote_sha)
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/execute_recorded_testcases.py b/tools/execute_recorded_testcases.py
index f307277..3e8a41d 100755
--- a/tools/execute_recorded_testcases.py
+++ b/tools/execute_recorded_testcases.py
@@ -6,62 +6,68 @@
 import time
 import threading
 
+
 def run_command(name, executable, arguments, timeout_in_seconds):
-  print "Running %s: '%s'" % (name, [executable] + arguments)
+    print "Running %s: '%s'" % (name, [executable] + arguments)
 
-  # The timeout_handler will set this to True if the command times out.
-  timeout_value = {'did_timeout' : False}
+    # The timeout_handler will set this to True if the command times out.
+    timeout_value = {'did_timeout': False}
 
-  start = time.time()
+    start = time.time()
 
-  process = subprocess.Popen([executable] + arguments,
-                             stdout=subprocess.PIPE,
-                             stderr=subprocess.PIPE)
-  def timeout_handler():
-    timeout_value['did_timeout'] = True
-    process.kill()
-  timer = threading.Timer(timeout_in_seconds, timeout_handler)
-  timer.start()
+    process = subprocess.Popen(
+        [executable] + arguments,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE)
 
-  stdout, stderr = process.communicate()
-  exit_code = process.wait()
-  timer.cancel()
+    def timeout_handler():
+        timeout_value['did_timeout'] = True
+        process.kill()
 
-  end = time.time()
+    timer = threading.Timer(timeout_in_seconds, timeout_handler)
+    timer.start()
 
-  return (exit_code, stdout, stderr, end - start, timeout_value['did_timeout'])
+    stdout, stderr = process.communicate()
+    exit_code = process.wait()
+    timer.cancel()
+
+    end = time.time()
+
+    return (exit_code, stdout, stderr, end - start,
+            timeout_value['did_timeout'])
+
 
 def main(args):
-  recording_file = args[0]
-  result_file = args[1]
+    recording_file = args[0]
+    result_file = args[1]
 
-  with open(recording_file) as fd:
-    test_cases = json.load(fd)
+    with open(recording_file) as fd:
+        test_cases = json.load(fd)
 
-  for test_case in test_cases:
-    name = test_case['name']
-    command = test_case['command']
-    executable = command['executable']
-    arguments = command['arguments']
-    timeout_limit = command['timeout_limit']
+    for test_case in test_cases:
+        name = test_case['name']
+        command = test_case['command']
+        executable = command['executable']
+        arguments = command['arguments']
+        timeout_limit = command['timeout_limit']
 
-    exit_code, stdout, stderr, duration, did_timeout = (
-        run_command(name, executable, arguments, timeout_limit))
+        exit_code, stdout, stderr, duration, did_timeout = (run_command(
+            name, executable, arguments, timeout_limit))
 
-    test_case['command_output'] = {
-      'exit_code' : exit_code,
-      'stdout' : stdout,
-      'stderr' : stderr,
-      'duration' : duration,
-      'did_timeout' : did_timeout,
-    }
-  with open(result_file, 'w') as fd:
-    json.dump(test_cases, fd)
+        test_case['command_output'] = {
+            'exit_code': exit_code,
+            'stdout': stdout,
+            'stderr': stderr,
+            'duration': duration,
+            'did_timeout': did_timeout,
+        }
+    with open(result_file, 'w') as fd:
+        json.dump(test_cases, fd)
+
 
 if __name__ == '__main__':
-  if len(sys.argv) != 3:
-    print >> sys.stderr, ("Usage: %s <input-file.json> <output-file.json>"
-                          % sys.argv[0])
-    sys.exit(1)
-  sys.exit(main(sys.argv[1:]))
-
+    if len(sys.argv) != 3:
+        print >> sys.stderr, (
+            "Usage: %s <input-file.json> <output-file.json>" % sys.argv[0])
+        sys.exit(1)
+    sys.exit(main(sys.argv[1:]))
diff --git a/tools/experimental_features.yaml b/tools/experimental_features.yaml
index 7bd3a0f..6d4fdb3 100644
--- a/tools/experimental_features.yaml
+++ b/tools/experimental_features.yaml
@@ -72,6 +72,7 @@
 
 constant-update-2018:
   help: "Enhanced constant expressions"
+  enabledIn: '2.4.1'
 
 extension-methods:
   help: "Extension Methods"
diff --git a/tools/find_depot_tools.py b/tools/find_depot_tools.py
index 286349b..ed06c94 100644
--- a/tools/find_depot_tools.py
+++ b/tools/find_depot_tools.py
@@ -11,32 +11,33 @@
 
 
 def IsRealDepotTools(path):
-  return os.path.isfile(os.path.join(path, 'gclient.py'))
+    return os.path.isfile(os.path.join(path, 'gclient.py'))
 
 
 def add_depot_tools_to_path():
-  """Search for depot_tools and add it to sys.path."""
-  # First look if depot_tools is already in PYTHONPATH.
-  for i in sys.path:
-    if i.rstrip(os.sep).endswith('depot_tools') and IsRealDepotTools(i):
-      return i
-  # Then look if depot_tools is in PATH, common case.
-  for i in os.environ['PATH'].split(os.pathsep):
-    if IsRealDepotTools(i):
-      sys.path.append(i.rstrip(os.sep))
-      return i
-  # Rare case, it's not even in PATH, look upward up to root.
-  root_dir = os.path.dirname(os.path.abspath(__file__))
-  previous_dir = os.path.abspath(__file__)
-  while root_dir and root_dir != previous_dir:
-    i = os.path.join(root_dir, 'depot_tools')
-    if IsRealDepotTools(i):
-      sys.path.append(i)
-      return i
-    previous_dir = root_dir
-    root_dir = os.path.dirname(root_dir)
-  print >> sys.stderr, 'Failed to find depot_tools'
-  return None
+    """Search for depot_tools and add it to sys.path."""
+    # First look if depot_tools is already in PYTHONPATH.
+    for i in sys.path:
+        if i.rstrip(os.sep).endswith('depot_tools') and IsRealDepotTools(i):
+            return i
+    # Then look if depot_tools is in PATH, common case.
+    for i in os.environ['PATH'].split(os.pathsep):
+        if IsRealDepotTools(i):
+            sys.path.append(i.rstrip(os.sep))
+            return i
+    # Rare case, it's not even in PATH, look upward up to root.
+    root_dir = os.path.dirname(os.path.abspath(__file__))
+    previous_dir = os.path.abspath(__file__)
+    while root_dir and root_dir != previous_dir:
+        i = os.path.join(root_dir, 'depot_tools')
+        if IsRealDepotTools(i):
+            sys.path.append(i)
+            return i
+        previous_dir = root_dir
+        root_dir = os.path.dirname(root_dir)
+    print >> sys.stderr, 'Failed to find depot_tools'
+    return None
+
 
 add_depot_tools_to_path()
 
diff --git a/tools/gen_fuchsia_test_manifest.py b/tools/gen_fuchsia_test_manifest.py
index 9b3241a..fa754b5 100755
--- a/tools/gen_fuchsia_test_manifest.py
+++ b/tools/gen_fuchsia_test_manifest.py
@@ -14,70 +14,78 @@
 
 SCRIPT_DIR = os.path.dirname(sys.argv[0])
 DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
-FUCHSIA_ROOT= os.path.realpath(os.path.join(DART_ROOT, '..', '..'))
+FUCHSIA_ROOT = os.path.realpath(os.path.join(DART_ROOT, '..', '..'))
 
 FUCHSIA_TEST_MANIFEST_PREFIX = os.path.join('test', 'dart')
 
-EXCLUDE_DIRS = [ '.git', 'out', '.jiri' ]
+EXCLUDE_DIRS = ['.git', 'out', '.jiri']
 
-BINARY_FILES = [ 'dart', 'run_vm_tests', 'process_test' ]
+BINARY_FILES = ['dart', 'run_vm_tests', 'process_test']
+
 
 def parse_args(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script that generates Dart/Fuchsia test commands.')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script that generates Dart/Fuchsia test commands.')
 
-  parser.add_argument('--arch', '-a',
-      type=str,
-      help='Target architectures (comma-separated).',
-      metavar='[x64]',
-      default='x64')
-  parser.add_argument('--mode', '-m',
-      type=str,
-      help='Build variant',
-      metavar='[debug,release]',
-      default='debug')
-  parser.add_argument('--output', '-o',
-      type=str,
-      help='Path to output file prefix.')
-  parser.add_argument("-v", "--verbose",
-      help='Verbose output.',
-      default=False,
-      action="store_true")
+    parser.add_argument(
+        '--arch',
+        '-a',
+        type=str,
+        help='Target architectures (comma-separated).',
+        metavar='[x64]',
+        default='x64')
+    parser.add_argument(
+        '--mode',
+        '-m',
+        type=str,
+        help='Build variant',
+        metavar='[debug,release]',
+        default='debug')
+    parser.add_argument(
+        '--output', '-o', type=str, help='Path to output file prefix.')
+    parser.add_argument(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def fuchsia_arch(arch):
-  if arch is 'x64':
-    return 'x86-64'
-  return None
+    if arch is 'x64':
+        return 'x86-64'
+    return None
 
 
 def main(argv):
-  args = parse_args(argv)
+    args = parse_args(argv)
 
-  manifest_output = args.output + '.manifest'
-  with open(manifest_output, 'w') as manifest:
-    # Write the Dart tree.
-    for root, dirs, files in os.walk(DART_ROOT):
-      dirs[:] = [d for d in dirs if d not in EXCLUDE_DIRS]
-      for file in files:
-        filepath = os.path.join(root, file)
-        relpath = filepath[len(DART_ROOT) + 1:]
-        fuchsiapath = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX, relpath)
-        manifest.write('%s=%s\n' % (fuchsiapath, os.path.join(root, file)))
+    manifest_output = args.output + '.manifest'
+    with open(manifest_output, 'w') as manifest:
+        # Write the Dart tree.
+        for root, dirs, files in os.walk(DART_ROOT):
+            dirs[:] = [d for d in dirs if d not in EXCLUDE_DIRS]
+            for file in files:
+                filepath = os.path.join(root, file)
+                relpath = filepath[len(DART_ROOT) + 1:]
+                fuchsiapath = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX,
+                                           relpath)
+                manifest.write(
+                    '%s=%s\n' % (fuchsiapath, os.path.join(root, file)))
 
-    dart_conf = utils.GetBuildConf(args.mode, args.arch)
-    dart_out = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX, 'out', dart_conf)
-    fuchsia_conf = '%s-%s' % (args.mode, fuchsia_arch(args.arch))
-    fuchsia_out = os.path.join(FUCHSIA_ROOT, 'out', fuchsia_conf)
-    for file in BINARY_FILES:
-      manifest.write('%s=%s\n' % (os.path.join(dart_out, file),
-                                  os.path.join(fuchsia_out, file)))
+        dart_conf = utils.GetBuildConf(args.mode, args.arch)
+        dart_out = os.path.join(FUCHSIA_TEST_MANIFEST_PREFIX, 'out', dart_conf)
+        fuchsia_conf = '%s-%s' % (args.mode, fuchsia_arch(args.arch))
+        fuchsia_out = os.path.join(FUCHSIA_ROOT, 'out', fuchsia_conf)
+        for file in BINARY_FILES:
+            manifest.write('%s=%s\n' % (os.path.join(dart_out, file),
+                                        os.path.join(fuchsia_out, file)))
 
-  return 0
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/generate_buildfiles.py b/tools/generate_buildfiles.py
index 201c666..0bca73d 100755
--- a/tools/generate_buildfiles.py
+++ b/tools/generate_buildfiles.py
@@ -16,88 +16,97 @@
 
 
 def DisableBuildfiles():
-  return DART_DISABLE_BUILDFILES in os.environ
+    return DART_DISABLE_BUILDFILES in os.environ
 
 
 def Execute(args):
-  process = subprocess.Popen(args, cwd=DART_ROOT)
-  process.wait()
-  return process.returncode
+    process = subprocess.Popen(args, cwd=DART_ROOT)
+    process.wait()
+    return process.returncode
 
 
 def RunAndroidGn(options):
-  if not HOST_OS in ['linux', 'macos']:
-    return 0
-  gn_command = [
-    'python',
-    os.path.join(DART_ROOT, 'tools', 'gn.py'),
-    '-m', 'all',
-    '-a', 'arm,arm64',
-    '--os', 'android',
-  ]
-  if options.verbose:
-    gn_command.append('-v')
-    print (' '.join(gn_command))
-  return Execute(gn_command)
+    if not HOST_OS in ['linux', 'macos']:
+        return 0
+    gn_command = [
+        'python',
+        os.path.join(DART_ROOT, 'tools', 'gn.py'),
+        '-m',
+        'all',
+        '-a',
+        'arm,arm64',
+        '--os',
+        'android',
+    ]
+    if options.verbose:
+        gn_command.append('-v')
+        print(' '.join(gn_command))
+    return Execute(gn_command)
 
 
 def RunCrossGn(options):
-  if HOST_OS != 'linux':
-    return 0
-  gn_command = [
-    'python',
-    os.path.join(DART_ROOT, 'tools', 'gn.py'),
-    '-m', 'all',
-    '-a', 'arm,armsimdbc,arm64,armsimdbc64',
-  ]
-  if options.verbose:
-    gn_command.append('-v')
-    print (' '.join(gn_command))
-  return Execute(gn_command)
+    if HOST_OS != 'linux':
+        return 0
+    gn_command = [
+        'python',
+        os.path.join(DART_ROOT, 'tools', 'gn.py'),
+        '-m',
+        'all',
+        '-a',
+        'arm,armsimdbc,arm64,armsimdbc64',
+    ]
+    if options.verbose:
+        gn_command.append('-v')
+        print(' '.join(gn_command))
+    return Execute(gn_command)
 
 
 def RunHostGn(options):
-  gn_command = [
-    'python',
-    os.path.join(DART_ROOT, 'tools', 'gn.py'),
-    '-m', 'all',
-    '-a', 'all',
-  ]
-  if options.verbose:
-    gn_command.append('-v')
-    print (' '.join(gn_command))
-  return Execute(gn_command)
+    gn_command = [
+        'python',
+        os.path.join(DART_ROOT, 'tools', 'gn.py'),
+        '-m',
+        'all',
+        '-a',
+        'all',
+    ]
+    if options.verbose:
+        gn_command.append('-v')
+        print(' '.join(gn_command))
+    return Execute(gn_command)
 
 
 def RunGn(options):
-  status = RunHostGn(options)
-  if status != 0:
-    return status
-  status = RunCrossGn(options)
-  if status != 0:
-    return status
-  return RunAndroidGn(options)
+    status = RunHostGn(options)
+    if status != 0:
+        return status
+    status = RunCrossGn(options)
+    if status != 0:
+        return status
+    return RunAndroidGn(options)
 
 
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description="A script to generate Dart's build files.")
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description="A script to generate Dart's build files.")
 
-  parser.add_argument("-v", "--verbose",
-      help='Verbose output.',
-      default=False,
-      action="store_true")
+    parser.add_argument(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def main(argv):
-  # Check the environment and become a no-op if directed.
-  if DisableBuildfiles():
-    return 0
-  options = ParseArgs(argv)
-  RunGn(options)
+    # Check the environment and become a no-op if directed.
+    if DisableBuildfiles():
+        return 0
+    options = ParseArgs(argv)
+    RunGn(options)
 
 
 if __name__ == '__main__':
diff --git a/tools/generate_idefiles.py b/tools/generate_idefiles.py
index 728fdbb..6e8ead5 100755
--- a/tools/generate_idefiles.py
+++ b/tools/generate_idefiles.py
@@ -3,7 +3,6 @@
 # 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.
-
 """Script to generate configuration files for analysis servers of C++ and Dart.
 
 It generates compile_commands.json for C++ clang and intellij and
@@ -23,12 +22,12 @@
 
 
 def GenerateIdeFiles(options):
-  GenerateCompileCommands(options)
-  GenerateAnalysisOptions(options)
+    GenerateCompileCommands(options)
+    GenerateAnalysisOptions(options)
 
 
 def GenerateCompileCommands(options):
-  """Generate compile_commands.json for the C++ analysis servers.
+    """Generate compile_commands.json for the C++ analysis servers.
 
   compile_commands.json is used by the c++ clang and intellij language analysis
   servers used in IDEs such as Visual Studio Code and Emacs.
@@ -40,48 +39,48 @@
     success (0) or failure (non zero)
   """
 
-  fname = os.path.join(options.dir, "compile_commands.json")
+    fname = os.path.join(options.dir, "compile_commands.json")
 
-  if os.path.isfile(fname) and not options.force:
-    print fname + " already exists, use --force to override"
-    return
+    if os.path.isfile(fname) and not options.force:
+        print fname + " already exists, use --force to override"
+        return
 
-  gn_result = generate_buildfiles.RunGn(options)
-  if gn_result != 0:
-    return gn_result
+    gn_result = generate_buildfiles.RunGn(options)
+    if gn_result != 0:
+        return gn_result
 
-  out_folder = utils.GetBuildRoot(
-      HOST_OS, mode="debug", arch=options.arch, target_os=options.os)
+    out_folder = utils.GetBuildRoot(
+        HOST_OS, mode="debug", arch=options.arch, target_os=options.os)
 
-  if not os.path.isdir(out_folder):
-    return 1
+    if not os.path.isdir(out_folder):
+        return 1
 
-  command_set = json.loads(
-      subprocess.check_output(
-          ["ninja", "-C", out_folder, "-t", "compdb", "cxx", "cc", "h"]))
+    command_set = json.loads(
+        subprocess.check_output(
+            ["ninja", "-C", out_folder, "-t", "compdb", "cxx", "cc", "h"]))
 
-  commands = []
-  for obj in command_set:
-    command = obj["command"]
+    commands = []
+    for obj in command_set:
+        command = obj["command"]
 
-    # Skip precompiled mode, a lot of code is commented out in precompiled mode
-    if "-DDART_PRECOMPILED_RUNTIME" in command:
-      continue
+        # Skip precompiled mode, a lot of code is commented out in precompiled mode
+        if "-DDART_PRECOMPILED_RUNTIME" in command:
+            continue
 
-    # Remove warnings
-    command = command.replace("-Werror", "")
+        # Remove warnings
+        command = command.replace("-Werror", "")
 
-    obj["command"] = command
-    commands += [obj]
+        obj["command"] = command
+        commands += [obj]
 
-  with open(fname, "w") as f:
-    json.dump(commands, f, indent=4)
+    with open(fname, "w") as f:
+        json.dump(commands, f, indent=4)
 
-  return 0
+    return 0
 
 
 def GenerateAnalysisOptions(options):
-  """Generate analysis_optioms.yaml for the Dart analyzer.
+    """Generate analysis_optioms.yaml for the Dart analyzer.
 
   To prevent dartanalyzer from tripping on the non-Dart files when it is
   started from the root dart-sdk directory.
@@ -90,7 +89,7 @@
   Args:
     options: supported options include: force, dir
   """
-  contents = """analyzer:
+    contents = """analyzer:
   exclude:
     - docs/newsletter/20171103/**
     - out/**
@@ -109,46 +108,47 @@
     - tools/status_clean.dart
     - xcodebuild / **"""
 
-  fname = os.path.join(options.dir, "analysis_options.yaml")
+    fname = os.path.join(options.dir, "analysis_options.yaml")
 
-  if os.path.isfile(fname) and not options.force:
-    print fname + " already exists, use --force to override"
-    return
+    if os.path.isfile(fname) and not options.force:
+        print fname + " already exists, use --force to override"
+        return
 
-  with open(fname, "w") as f:
-    f.write(contents)
+    with open(fname, "w") as f:
+        f.write(contents)
 
 
 def main(argv):
-  parser = argparse.ArgumentParser(
-      description="Python script to generate compile_commands.json and "
-      "analysis_options.yaml which are used by the analysis servers for "
-      "c++ and Dart.")
+    parser = argparse.ArgumentParser(
+        description="Python script to generate compile_commands.json and "
+        "analysis_options.yaml which are used by the analysis servers for "
+        "c++ and Dart.")
 
-  parser.add_argument("-v", "--verbose",
-                      help="Verbose output.",
-                      action="store_true")
+    parser.add_argument(
+        "-v", "--verbose", help="Verbose output.", action="store_true")
 
-  parser.add_argument("-f", "--force",
-                      help="Override files.",
-                      action="store_true")
+    parser.add_argument(
+        "-f", "--force", help="Override files.", action="store_true")
 
-  parser.add_argument("-d", "--dir",
-                      help="Target directory.",
-                      default=utils.DART_DIR)
+    parser.add_argument(
+        "-d", "--dir", help="Target directory.", default=utils.DART_DIR)
 
-  parser.add_argument("-a", "--arch",
-                      help="Target architecture for runtime sources.",
-                      default="x64")
+    parser.add_argument(
+        "-a",
+        "--arch",
+        help="Target architecture for runtime sources.",
+        default="x64")
 
-  parser.add_argument("-s", "--os",
-                      help="Target operating system for runtime sources.",
-                      default=HOST_OS)
+    parser.add_argument(
+        "-s",
+        "--os",
+        help="Target operating system for runtime sources.",
+        default=HOST_OS)
 
-  options = parser.parse_args(argv[1:])
+    options = parser.parse_args(argv[1:])
 
-  return GenerateIdeFiles(options)
+    return GenerateIdeFiles(options)
 
 
 if __name__ == "__main__":
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/gn.py b/tools/gn.py
index 18725d2..908bda9 100755
--- a/tools/gn.py
+++ b/tools/gn.py
@@ -30,510 +30,530 @@
 
 DART_GN_ARGS = "DART_GN_ARGS"
 
+
 def UseASAN():
-  return DART_USE_ASAN in os.environ
+    return DART_USE_ASAN in os.environ
 
 
 def UseMSAN():
-  return DART_USE_MSAN in os.environ
+    return DART_USE_MSAN in os.environ
 
 
 def UseTSAN():
-  return DART_USE_TSAN in os.environ
+    return DART_USE_TSAN in os.environ
 
 
 def ToolchainPrefix(args):
-  if args.toolchain_prefix:
-    return args.toolchain_prefix
-  return os.environ.get(DART_USE_TOOLCHAIN)
+    if args.toolchain_prefix:
+        return args.toolchain_prefix
+    return os.environ.get(DART_USE_TOOLCHAIN)
 
 
 def TargetSysroot(args):
-  if args.target_sysroot:
-    return args.target_sysroot
-  return os.environ.get(DART_USE_SYSROOT)
+    if args.target_sysroot:
+        return args.target_sysroot
+    return os.environ.get(DART_USE_SYSROOT)
 
 
 def MakePlatformSDK():
-  return DART_MAKE_PLATFORM_SDK in os.environ
+    return DART_MAKE_PLATFORM_SDK in os.environ
 
 
 def GetGNArgs(args):
-  if args.gn_args != None:
-    return args.gn_args
-  args = os.environ.get(DART_GN_ARGS) or ""
-  return args.split()
+    if args.gn_args != None:
+        return args.gn_args
+    args = os.environ.get(DART_GN_ARGS) or ""
+    return args.split()
 
 
 def GetOutDir(mode, arch, target_os):
-  return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
+    return utils.GetBuildRoot(HOST_OS, mode, arch, target_os)
 
 
 def ToCommandLine(gn_args):
-  def merge(key, value):
-    if type(value) is bool:
-      return '%s=%s' % (key, 'true' if value else 'false')
-    elif type(value) is int:
-      return '%s=%d' % (key, value)
-    return '%s="%s"' % (key, value)
-  return [merge(x, y) for x, y in gn_args.iteritems()]
+
+    def merge(key, value):
+        if type(value) is bool:
+            return '%s=%s' % (key, 'true' if value else 'false')
+        elif type(value) is int:
+            return '%s=%d' % (key, value)
+        return '%s="%s"' % (key, value)
+
+    return [merge(x, y) for x, y in gn_args.iteritems()]
 
 
 def HostCpuForArch(arch):
-  if arch in ['ia32', 'arm', 'armv6', 'armv5te',
-              'simarm', 'simarmv6', 'simarmv5te', 'simdbc',
-              'armsimdbc', 'simarm_x64']:
-    return 'x86'
-  if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']:
-    return 'x64'
+    if arch in [
+            'ia32', 'arm', 'armv6', 'armv5te', 'simarm', 'simarmv6',
+            'simarmv5te', 'simdbc', 'armsimdbc', 'simarm_x64'
+    ]:
+        return 'x86'
+    if arch in ['x64', 'arm64', 'simarm64', 'simdbc64', 'armsimdbc64']:
+        return 'x64'
 
 
 # The C compiler's target.
 def TargetCpuForArch(arch, target_os):
-  if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te']:
-    return 'x86'
-  if arch in ['x64', 'simarm64', 'simarm_x64']:
-    return 'x64'
-  if arch == 'simdbc':
-    return 'arm' if target_os == 'android' else 'x86'
-  if arch in ['simdbc64']:
-    return 'arm64' if target_os == 'android' else 'x64'
-  if arch == 'armsimdbc':
-    return 'arm'
-  if arch == 'armsimdbc64':
-    return 'arm64'
-  return arch
+    if arch in ['ia32', 'simarm', 'simarmv6', 'simarmv5te']:
+        return 'x86'
+    if arch in ['x64', 'simarm64', 'simarm_x64']:
+        return 'x64'
+    if arch == 'simdbc':
+        return 'arm' if target_os == 'android' else 'x86'
+    if arch in ['simdbc64']:
+        return 'arm64' if target_os == 'android' else 'x64'
+    if arch == 'armsimdbc':
+        return 'arm'
+    if arch == 'armsimdbc64':
+        return 'arm64'
+    return arch
 
 
 # The Dart compiler's target.
 def DartTargetCpuForArch(arch):
-  if arch in ['ia32']:
-    return 'ia32'
-  if arch in ['x64']:
-    return 'x64'
-  if arch in ['arm', 'simarm', 'simarm_x64']:
-    return 'arm'
-  if arch in ['armv6', 'simarmv6']:
-    return 'armv6'
-  if arch in ['armv5te', 'simarmv5te']:
-    return 'armv5te'
-  if arch in ['arm64', 'simarm64']:
-    return 'arm64'
-  if arch in ['simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']:
-    return 'dbc'
-  return arch
+    if arch in ['ia32']:
+        return 'ia32'
+    if arch in ['x64']:
+        return 'x64'
+    if arch in ['arm', 'simarm', 'simarm_x64']:
+        return 'arm'
+    if arch in ['armv6', 'simarmv6']:
+        return 'armv6'
+    if arch in ['armv5te', 'simarmv5te']:
+        return 'armv5te'
+    if arch in ['arm64', 'simarm64']:
+        return 'arm64'
+    if arch in ['simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64']:
+        return 'dbc'
+    return arch
 
 
 def HostOsForGn(host_os):
-  if host_os.startswith('macos'):
-    return 'mac'
-  if host_os.startswith('win'):
-    return 'win'
-  return host_os
+    if host_os.startswith('macos'):
+        return 'mac'
+    if host_os.startswith('win'):
+        return 'win'
+    return host_os
 
 
 # Where string_map is formatted as X1=Y1,X2=Y2 etc.
 # If key is X1, returns Y1.
 def ParseStringMap(key, string_map):
-  for m in string_map.split(','):
-    l = m.split('=')
-    if l[0] == key:
-      return l[1]
-  return None
+    for m in string_map.split(','):
+        l = m.split('=')
+        if l[0] == key:
+            return l[1]
+    return None
 
 
 def UseSanitizer(args):
-  return args.asan or args.msan or args.tsan
+    return args.asan or args.msan or args.tsan
 
 
 def DontUseClang(args, target_os, host_cpu, target_cpu):
-  # We don't have clang on Windows.
-  return target_os == 'win'
+    # We don't have clang on Windows.
+    return target_os == 'win'
 
 
 def UseSysroot(args, gn_args):
-  # Don't try to use a Linux sysroot if we aren't on Linux.
-  if gn_args['target_os'] != 'linux':
-    return False
-  # Don't use the sysroot if we're given another sysroot.
-  if TargetSysroot(args):
-    return False
-  # Otherwise use the sysroot.
-  return True
+    # Don't try to use a Linux sysroot if we aren't on Linux.
+    if gn_args['target_os'] != 'linux':
+        return False
+    # Don't use the sysroot if we're given another sysroot.
+    if TargetSysroot(args):
+        return False
+    # Otherwise use the sysroot.
+    return True
+
 
 def ToGnArgs(args, mode, arch, target_os):
-  gn_args = {}
+    gn_args = {}
 
-  host_os = HostOsForGn(HOST_OS)
-  if target_os == 'host':
-    gn_args['target_os'] = host_os
-  else:
-    gn_args['target_os'] = target_os
+    host_os = HostOsForGn(HOST_OS)
+    if target_os == 'host':
+        gn_args['target_os'] = host_os
+    else:
+        gn_args['target_os'] = target_os
 
-  gn_args['host_cpu'] = HostCpuForArch(arch)
-  gn_args['target_cpu'] = TargetCpuForArch(arch, target_os)
-  gn_args['dart_target_arch'] = DartTargetCpuForArch(arch)
+    gn_args['host_cpu'] = HostCpuForArch(arch)
+    gn_args['target_cpu'] = TargetCpuForArch(arch, target_os)
+    gn_args['dart_target_arch'] = DartTargetCpuForArch(arch)
 
-  # Configure Crashpad library if it is used.
-  gn_args['dart_use_crashpad'] = (args.use_crashpad or
-      DART_USE_CRASHPAD in os.environ)
-  if gn_args['dart_use_crashpad']:
-    # Tell Crashpad's BUILD files which checkout layout to use.
-    gn_args['crashpad_dependencies'] = 'dart'
+    # Configure Crashpad library if it is used.
+    gn_args['dart_use_crashpad'] = (args.use_crashpad or
+                                    DART_USE_CRASHPAD in os.environ)
+    if gn_args['dart_use_crashpad']:
+        # Tell Crashpad's BUILD files which checkout layout to use.
+        gn_args['crashpad_dependencies'] = 'dart'
 
-  if arch != HostCpuForArch(arch):
-    # Training an app-jit snapshot under a simulator is slow. Use script
-    # snapshots instead.
-    gn_args['dart_snapshot_kind'] = 'kernel'
-  else:
-    gn_args['dart_snapshot_kind'] = 'app-jit'
+    if arch != HostCpuForArch(arch):
+        # Training an app-jit snapshot under a simulator is slow. Use script
+        # snapshots instead.
+        gn_args['dart_snapshot_kind'] = 'kernel'
+    else:
+        gn_args['dart_snapshot_kind'] = 'app-jit'
 
-  # We only want the fallback root certs in the standalone VM on
-  # Linux and Windows.
-  if gn_args['target_os'] in ['linux', 'win']:
-    gn_args['dart_use_fallback_root_certificates'] = True
+    # We only want the fallback root certs in the standalone VM on
+    # Linux and Windows.
+    if gn_args['target_os'] in ['linux', 'win']:
+        gn_args['dart_use_fallback_root_certificates'] = True
 
-  gn_args['dart_platform_bytecode'] = args.bytecode
+    gn_args['dart_platform_bytecode'] = args.bytecode
 
-  # Use tcmalloc only when targeting Linux and when not using ASAN.
-  gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux')
-                                  and not UseSanitizer(args))
+    # Use tcmalloc only when targeting Linux and when not using ASAN.
+    gn_args['dart_use_tcmalloc'] = ((gn_args['target_os'] == 'linux') and
+                                    not UseSanitizer(args))
 
-  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
-      # specifying a gnueabihf compiler in //build/toolchain/linux/BUILD.gn.
-      floatabi = 'hard' if args.arm_float_abi == '' else args.arm_float_abi
-      gn_args['arm_version'] = 7
-      gn_args['arm_float_abi'] = floatabi
-      gn_args['arm_use_neon'] = True
-    elif gn_args['target_cpu'] == 'armv6':
-      floatabi = 'softfp' if args.arm_float_abi == '' else args.arm_float_abi
-      gn_args['target_cpu'] = 'arm'
-      gn_args['arm_version'] = 6
-      gn_args['arm_float_abi'] = floatabi
-    elif gn_args['target_cpu'] == 'armv5te':
-      raise Exception("GN support for armv5te unimplemented")
+    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
+            # specifying a gnueabihf compiler in //build/toolchain/linux/BUILD.gn.
+            floatabi = 'hard' if args.arm_float_abi == '' else args.arm_float_abi
+            gn_args['arm_version'] = 7
+            gn_args['arm_float_abi'] = floatabi
+            gn_args['arm_use_neon'] = True
+        elif gn_args['target_cpu'] == 'armv6':
+            floatabi = 'softfp' if args.arm_float_abi == '' else args.arm_float_abi
+            gn_args['target_cpu'] = 'arm'
+            gn_args['arm_version'] = 6
+            gn_args['arm_float_abi'] = floatabi
+        elif gn_args['target_cpu'] == 'armv5te':
+            raise Exception("GN support for armv5te unimplemented")
 
-  gn_args['is_debug'] = mode == 'debug'
-  gn_args['is_release'] = mode == 'release'
-  gn_args['is_product'] = mode == 'product'
-  gn_args['dart_debug'] = mode == 'debug'
+    gn_args['is_debug'] = mode == 'debug'
+    gn_args['is_release'] = mode == 'release'
+    gn_args['is_product'] = mode == 'product'
+    gn_args['dart_debug'] = mode == 'debug'
 
-  # This setting is only meaningful for Flutter. Standalone builds of the VM
-  # should leave this set to 'develop', which causes the build to defer to
-  # 'is_debug', 'is_release' and 'is_product'.
-  if mode == 'product':
-    gn_args['dart_runtime_mode'] = 'release'
-  else:
-    gn_args['dart_runtime_mode'] = 'develop'
+    # This setting is only meaningful for Flutter. Standalone builds of the VM
+    # should leave this set to 'develop', which causes the build to defer to
+    # 'is_debug', 'is_release' and 'is_product'.
+    if mode == 'product':
+        gn_args['dart_runtime_mode'] = 'release'
+    else:
+        gn_args['dart_runtime_mode'] = 'develop'
 
-  gn_args['exclude_kernel_service'] = args.exclude_kernel_service
+    gn_args['exclude_kernel_service'] = args.exclude_kernel_service
 
-  dont_use_clang = DontUseClang(args, gn_args['target_os'],
-                                      gn_args['host_cpu'],
-                                      gn_args['target_cpu'])
-  gn_args['is_clang'] = args.clang and not dont_use_clang
+    dont_use_clang = DontUseClang(args, gn_args['target_os'],
+                                  gn_args['host_cpu'], gn_args['target_cpu'])
+    gn_args['is_clang'] = args.clang and not dont_use_clang
 
-  enable_code_coverage = args.code_coverage and gn_args['is_clang']
-  gn_args['dart_vm_code_coverage'] = enable_code_coverage
+    enable_code_coverage = args.code_coverage and gn_args['is_clang']
+    gn_args['dart_vm_code_coverage'] = enable_code_coverage
 
-  gn_args['is_asan'] = args.asan and gn_args['is_clang']
-  gn_args['is_msan'] = args.msan and gn_args['is_clang']
-  gn_args['is_tsan'] = args.tsan and gn_args['is_clang']
+    gn_args['is_asan'] = args.asan and gn_args['is_clang']
+    gn_args['is_msan'] = args.msan and gn_args['is_clang']
+    gn_args['is_tsan'] = args.tsan and gn_args['is_clang']
 
-  if not args.platform_sdk and not gn_args['target_cpu'].startswith('arm'):
-    gn_args['dart_platform_sdk'] = args.platform_sdk
-  gn_args['dart_stripped_binary'] = 'exe.stripped/dart'
-  gn_args['dartaotruntime_stripped_binary'] = 'exe.stripped/dartaotruntime'
-  gn_args['gen_snapshot_stripped_binary'] = 'exe.stripped/gen_snapshot'
+    if not args.platform_sdk and not gn_args['target_cpu'].startswith('arm'):
+        gn_args['dart_platform_sdk'] = args.platform_sdk
+    gn_args['dart_stripped_binary'] = 'exe.stripped/dart'
+    gn_args['dartaotruntime_stripped_binary'] = 'exe.stripped/dartaotruntime'
+    gn_args['gen_snapshot_stripped_binary'] = 'exe.stripped/gen_snapshot'
 
-  # Setup the user-defined sysroot.
-  if UseSysroot(args, gn_args):
-    gn_args['dart_use_debian_sysroot'] = True
-  else:
-    sysroot = TargetSysroot(args)
-    if sysroot:
-      gn_args['target_sysroot'] = ParseStringMap(arch, sysroot)
+    # Setup the user-defined sysroot.
+    if UseSysroot(args, gn_args):
+        gn_args['dart_use_debian_sysroot'] = True
+    else:
+        sysroot = TargetSysroot(args)
+        if sysroot:
+            gn_args['target_sysroot'] = ParseStringMap(arch, sysroot)
 
-    toolchain = ToolchainPrefix(args)
-    if toolchain:
-      gn_args['toolchain_prefix'] = ParseStringMap(arch, toolchain)
+        toolchain = ToolchainPrefix(args)
+        if toolchain:
+            gn_args['toolchain_prefix'] = ParseStringMap(arch, toolchain)
 
-  goma_dir = os.environ.get('GOMA_DIR')
-  goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
-  if args.goma and goma_dir:
-    gn_args['use_goma'] = True
-    gn_args['goma_dir'] = goma_dir
-  elif args.goma and os.path.exists(goma_home_dir):
-    gn_args['use_goma'] = True
-    gn_args['goma_dir'] = goma_home_dir
-  else:
-    gn_args['use_goma'] = False
-    gn_args['goma_dir'] = None
+    goma_dir = os.environ.get('GOMA_DIR')
+    goma_home_dir = os.path.join(os.getenv('HOME', ''), 'goma')
+    if args.goma and goma_dir:
+        gn_args['use_goma'] = True
+        gn_args['goma_dir'] = goma_dir
+    elif args.goma and os.path.exists(goma_home_dir):
+        gn_args['use_goma'] = True
+        gn_args['goma_dir'] = goma_home_dir
+    else:
+        gn_args['use_goma'] = False
+        gn_args['goma_dir'] = None
 
-  # Code coverage requires -O0 to be set.
-  if enable_code_coverage:
-    gn_args['dart_debug_optimization_level'] = 0
-    gn_args['debug_optimization_level'] = 0
-  elif args.debug_opt_level:
-    gn_args['dart_debug_optimization_level'] = args.debug_opt_level
-    gn_args['debug_optimization_level'] = args.debug_opt_level
+    # Code coverage requires -O0 to be set.
+    if enable_code_coverage:
+        gn_args['dart_debug_optimization_level'] = 0
+        gn_args['debug_optimization_level'] = 0
+    elif args.debug_opt_level:
+        gn_args['dart_debug_optimization_level'] = args.debug_opt_level
+        gn_args['debug_optimization_level'] = args.debug_opt_level
 
-  return gn_args
+    return gn_args
 
 
 def ProcessOsOption(os_name):
-  if os_name == 'host':
-    return HOST_OS
-  return os_name
+    if os_name == 'host':
+        return HOST_OS
+    return os_name
 
 
 def ProcessOptions(args):
-  if args.arch == 'all':
-    args.arch = 'ia32,x64,simarm,simarm64,simdbc64'
-  if args.mode == 'all':
-    args.mode = 'debug,release,product'
-  if args.os == 'all':
-    args.os = 'host,android'
-  args.mode = args.mode.split(',')
-  args.arch = args.arch.split(',')
-  args.os = args.os.split(',')
-  for mode in args.mode:
-    if not mode in ['debug', 'release', 'product']:
-      print ("Unknown mode %s" % mode)
-      return False
-  for arch in args.arch:
-    archs = ['ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6',
-             'simarmv5te', 'armv5te', 'simarm64', 'arm64',
-             'simdbc', 'simdbc64', 'armsimdbc', 'armsimdbc64','simarm_x64']
-    if not arch in archs:
-      print ("Unknown arch %s" % arch)
-      return False
-  oses = [ProcessOsOption(os_name) for os_name in args.os]
-  for os_name in oses:
-    if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']:
-      print ("Unknown os %s" % os_name)
-      return False
-    if os_name != HOST_OS:
-      if os_name != 'android':
-        print ("Unsupported target os %s" % os_name)
+    if args.arch == 'all':
+        args.arch = 'ia32,x64,simarm,simarm64,simdbc64'
+    if args.mode == 'all':
+        args.mode = 'debug,release,product'
+    if args.os == 'all':
+        args.os = 'host,android'
+    args.mode = args.mode.split(',')
+    args.arch = args.arch.split(',')
+    args.os = args.os.split(',')
+    for mode in args.mode:
+        if not mode in ['debug', 'release', 'product']:
+            print("Unknown mode %s" % mode)
+            return False
+    for arch in args.arch:
+        archs = [
+            'ia32', 'x64', 'simarm', 'arm', 'simarmv6', 'armv6', 'simarmv5te',
+            'armv5te', 'simarm64', 'arm64', 'simdbc', 'simdbc64', 'armsimdbc',
+            'armsimdbc64', 'simarm_x64'
+        ]
+        if not arch in archs:
+            print("Unknown arch %s" % arch)
+            return False
+    oses = [ProcessOsOption(os_name) for os_name in args.os]
+    for os_name in oses:
+        if not os_name in ['android', 'freebsd', 'linux', 'macos', 'win32']:
+            print("Unknown os %s" % os_name)
+            return False
+        if os_name != HOST_OS:
+            if os_name != 'android':
+                print("Unsupported target os %s" % os_name)
+                return False
+            if not HOST_OS in ['linux', 'macos']:
+                print("Cross-compilation to %s is not supported on host os %s."
+                      % (os_name, HOST_OS))
+                return False
+            if not arch in [
+                    'ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64', 'simdbc',
+                    'simdbc64'
+            ]:
+                print(
+                    "Cross-compilation to %s is not supported for architecture %s."
+                    % (os_name, arch))
+                return False
+    if HOST_OS != 'win' and args.use_crashpad:
+        print("Crashpad is only supported on Windows")
         return False
-      if not HOST_OS in ['linux', 'macos']:
-        print ("Cross-compilation to %s is not supported on host os %s."
-               % (os_name, HOST_OS))
-        return False
-      if not arch in ['ia32', 'x64', 'arm', 'armv6', 'armv5te', 'arm64',
-                      'simdbc', 'simdbc64']:
-        print ("Cross-compilation to %s is not supported for architecture %s."
-               % (os_name, arch))
-        return False
-  if HOST_OS != 'win' and args.use_crashpad:
-    print ("Crashpad is only supported on Windows")
-    return False
-  return True
+    return True
 
 
 def os_has_ide(host_os):
-  return host_os.startswith('win') or host_os.startswith('mac')
+    return host_os.startswith('win') or host_os.startswith('mac')
 
 
 def ide_switch(host_os):
-  if host_os.startswith('win'):
-    return '--ide=vs'
-  elif host_os.startswith('mac'):
-    return '--ide=xcode'
-  else:
-    return '--ide=json'
+    if host_os.startswith('win'):
+        return '--ide=vs'
+    elif host_os.startswith('mac'):
+        return '--ide=xcode'
+    else:
+        return '--ide=json'
 
 
 def parse_args(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to run `gn gen`.',
-      formatter_class=argparse.ArgumentDefaultsHelpFormatter)
-  common_group = parser.add_argument_group('Common Arguments')
-  other_group = parser.add_argument_group('Other Arguments')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to run `gn gen`.',
+        formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+    common_group = parser.add_argument_group('Common Arguments')
+    other_group = parser.add_argument_group('Other Arguments')
 
-  common_group.add_argument('--arch', '-a',
-      type=str,
-      help='Target architectures (comma-separated).',
-      metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,'
-              'simarm64,arm64,simdbc,armsimdbc,simarm_x64]',
-      default='x64')
-  common_group.add_argument('--mode', '-m',
-      type=str,
-      help='Build variants (comma-separated).',
-      metavar='[all,debug,release,product]',
-      default='debug')
-  common_group.add_argument('--os',
-      type=str,
-      help='Target OSs (comma-separated).',
-      metavar='[all,host,android]',
-      default='host')
-  common_group.add_argument("-v", "--verbose",
-      help='Verbose output.',
-      default=False,
-      action="store_true")
+    common_group.add_argument(
+        '--arch',
+        '-a',
+        type=str,
+        help='Target architectures (comma-separated).',
+        metavar='[all,ia32,x64,simarm,arm,simarmv6,armv6,simarmv5te,armv5te,'
+        'simarm64,arm64,simdbc,armsimdbc,simarm_x64]',
+        default='x64')
+    common_group.add_argument(
+        '--mode',
+        '-m',
+        type=str,
+        help='Build variants (comma-separated).',
+        metavar='[all,debug,release,product]',
+        default='debug')
+    common_group.add_argument(
+        '--os',
+        type=str,
+        help='Target OSs (comma-separated).',
+        metavar='[all,host,android]',
+        default='host')
+    common_group.add_argument(
+        "-v",
+        "--verbose",
+        help='Verbose output.',
+        default=False,
+        action="store_true")
 
-  other_group.add_argument('--arm-float-abi',
-      type=str,
-      help='The ARM float ABI (soft, softfp, hard)',
-      metavar='[soft,softfp,hard]',
-      default='')
-  other_group.add_argument('--asan',
-      help='Build with ASAN',
-      default=UseASAN(),
-      action='store_true')
-  other_group.add_argument('--no-asan',
-      help='Disable ASAN',
-      dest='asan',
-      action='store_false')
-  other_group.add_argument('--bytecode', '-b',
-      help='Include bytecode in the VMs platform dill',
-      default=False,
-      action="store_true")
-  other_group.add_argument('--clang',
-      help='Use Clang',
-      default=True,
-      action='store_true')
-  other_group.add_argument('--no-clang',
-      help='Disable Clang',
-      dest='clang',
-      action='store_false')
-  other_group.add_argument('--code-coverage',
-      help='Enable code coverage for the standalone VM',
-      default=False,
-      dest="code_coverage",
-      action='store_true')
-  other_group.add_argument('--debug-opt-level',
-      '-d',
-      help='The optimization level to use for debug builds',
-      type=str)
-  other_group.add_argument('--goma',
-      help='Use goma',
-      default=True,
-      action='store_true')
-  other_group.add_argument('--no-goma',
-      help='Disable goma',
-      dest='goma',
-      action='store_false')
-  other_group.add_argument('--ide',
-      help='Generate an IDE file.',
-      default=os_has_ide(HOST_OS),
-      action='store_true')
-  other_group.add_argument('--exclude-kernel-service',
-      help='Exclude the kernel service.',
-      default=False,
-      dest='exclude_kernel_service',
-      action='store_true')
-  other_group.add_argument('--msan',
-      help='Build with MSAN',
-      default=UseMSAN(),
-      action='store_true')
-  other_group.add_argument('--no-msan',
-      help='Disable MSAN',
-      dest='msan',
-      action='store_false')
-  other_group.add_argument('--gn-args',
-      help='Set extra GN args',
-      dest='gn_args',
-      action='append')
-  other_group.add_argument('--platform-sdk',
-      help='Directs the create_sdk target to create a smaller "Platform" SDK',
-      default=MakePlatformSDK(),
-      action='store_true')
-  other_group.add_argument('--target-sysroot', '-s',
-      type=str,
-      help='Comma-separated list of arch=/path/to/sysroot mappings')
-  other_group.add_argument('--toolchain-prefix', '-t',
-      type=str,
-      help='Comma-separated list of arch=/path/to/toolchain-prefix mappings')
-  other_group.add_argument('--tsan',
-      help='Build with TSAN',
-      default=UseTSAN(),
-      action='store_true')
-  other_group.add_argument('--no-tsan',
-      help='Disable TSAN',
-      dest='tsan',
-      action='store_false')
-  other_group.add_argument('--wheezy',
-      help='This flag is deprecated.',
-      default=True,
-      action='store_true')
-  other_group.add_argument('--no-wheezy',
-      help='This flag is deprecated',
-      dest='wheezy',
-      action='store_false')
-  other_group.add_argument('--workers', '-w',
-      type=int,
-      help='Number of simultaneous GN invocations',
-      dest='workers',
-      default=multiprocessing.cpu_count())
-  other_group.add_argument('--use-crashpad',
-      default=False,
-      dest='use_crashpad',
-      action='store_true')
+    other_group.add_argument(
+        '--arm-float-abi',
+        type=str,
+        help='The ARM float ABI (soft, softfp, hard)',
+        metavar='[soft,softfp,hard]',
+        default='')
+    other_group.add_argument(
+        '--asan',
+        help='Build with ASAN',
+        default=UseASAN(),
+        action='store_true')
+    other_group.add_argument(
+        '--no-asan', help='Disable ASAN', dest='asan', action='store_false')
+    other_group.add_argument(
+        '--bytecode',
+        '-b',
+        help='Include bytecode in the VMs platform dill',
+        default=False,
+        action="store_true")
+    other_group.add_argument(
+        '--clang', help='Use Clang', default=True, action='store_true')
+    other_group.add_argument(
+        '--no-clang', help='Disable Clang', dest='clang', action='store_false')
+    other_group.add_argument(
+        '--code-coverage',
+        help='Enable code coverage for the standalone VM',
+        default=False,
+        dest="code_coverage",
+        action='store_true')
+    other_group.add_argument(
+        '--debug-opt-level',
+        '-d',
+        help='The optimization level to use for debug builds',
+        type=str)
+    other_group.add_argument(
+        '--goma', help='Use goma', default=True, action='store_true')
+    other_group.add_argument(
+        '--no-goma', help='Disable goma', dest='goma', action='store_false')
+    other_group.add_argument(
+        '--ide',
+        help='Generate an IDE file.',
+        default=os_has_ide(HOST_OS),
+        action='store_true')
+    other_group.add_argument(
+        '--exclude-kernel-service',
+        help='Exclude the kernel service.',
+        default=False,
+        dest='exclude_kernel_service',
+        action='store_true')
+    other_group.add_argument(
+        '--msan',
+        help='Build with MSAN',
+        default=UseMSAN(),
+        action='store_true')
+    other_group.add_argument(
+        '--no-msan', help='Disable MSAN', dest='msan', action='store_false')
+    other_group.add_argument(
+        '--gn-args', help='Set extra GN args', dest='gn_args', action='append')
+    other_group.add_argument(
+        '--platform-sdk',
+        help='Directs the create_sdk target to create a smaller "Platform" SDK',
+        default=MakePlatformSDK(),
+        action='store_true')
+    other_group.add_argument(
+        '--target-sysroot',
+        '-s',
+        type=str,
+        help='Comma-separated list of arch=/path/to/sysroot mappings')
+    other_group.add_argument(
+        '--toolchain-prefix',
+        '-t',
+        type=str,
+        help='Comma-separated list of arch=/path/to/toolchain-prefix mappings')
+    other_group.add_argument(
+        '--tsan',
+        help='Build with TSAN',
+        default=UseTSAN(),
+        action='store_true')
+    other_group.add_argument(
+        '--no-tsan', help='Disable TSAN', dest='tsan', action='store_false')
+    other_group.add_argument(
+        '--wheezy',
+        help='This flag is deprecated.',
+        default=True,
+        action='store_true')
+    other_group.add_argument(
+        '--no-wheezy',
+        help='This flag is deprecated',
+        dest='wheezy',
+        action='store_false')
+    other_group.add_argument(
+        '--workers',
+        '-w',
+        type=int,
+        help='Number of simultaneous GN invocations',
+        dest='workers',
+        default=multiprocessing.cpu_count())
+    other_group.add_argument(
+        '--use-crashpad',
+        default=False,
+        dest='use_crashpad',
+        action='store_true')
 
-  options = parser.parse_args(args)
-  if not ProcessOptions(options):
-    parser.print_help()
-    return None
-  return options
+    options = parser.parse_args(args)
+    if not ProcessOptions(options):
+        parser.print_help()
+        return None
+    return options
 
 
 # Run the command, if it succeeds returns 0, if it fails, returns the commands
 # output as a string.
 def RunCommand(command):
-  try:
-    subprocess.check_output(
-        command, cwd=DART_ROOT, stderr=subprocess.STDOUT)
-    return 0
-  except subprocess.CalledProcessError as e:
-    return ("Command failed: " + ' '.join(command) + "\n" +
-            "output: " + e.output)
+    try:
+        subprocess.check_output(
+            command, cwd=DART_ROOT, stderr=subprocess.STDOUT)
+        return 0
+    except subprocess.CalledProcessError as e:
+        return ("Command failed: " + ' '.join(command) + "\n" + "output: " +
+                e.output)
 
 
 def Main(argv):
-  starttime = time.time()
-  args = parse_args(argv)
+    starttime = time.time()
+    args = parse_args(argv)
 
-  gn = os.path.join(DART_ROOT, 'buildtools',
-      'gn.exe' if utils.IsWindows() else 'gn')
-  if not os.path.isfile(gn):
-    print ("Couldn't find the gn binary at path: " + gn)
-    return 1
+    gn = os.path.join(DART_ROOT, 'buildtools',
+                      'gn.exe' if utils.IsWindows() else 'gn')
+    if not os.path.isfile(gn):
+        print("Couldn't find the gn binary at path: " + gn)
+        return 1
 
-  commands = []
-  for target_os in args.os:
-    for mode in args.mode:
-      for arch in args.arch:
-        out_dir = GetOutDir(mode, arch, target_os)
-        # TODO(infra): Re-enable --check. Many targets fail to use
-        # public_deps to re-expose header files to their dependents.
-        # See dartbug.com/32364
-        command = [gn, 'gen', out_dir]
-        gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os))
-        gn_args += GetGNArgs(args)
-        if args.verbose:
-          print ("gn gen --check in %s" % out_dir)
-        if args.ide:
-          command.append(ide_switch(HOST_OS))
-        command.append('--args=%s' % ' '.join(gn_args))
-        commands.append(command)
+    commands = []
+    for target_os in args.os:
+        for mode in args.mode:
+            for arch in args.arch:
+                out_dir = GetOutDir(mode, arch, target_os)
+                # TODO(infra): Re-enable --check. Many targets fail to use
+                # public_deps to re-expose header files to their dependents.
+                # See dartbug.com/32364
+                command = [gn, 'gen', out_dir]
+                gn_args = ToCommandLine(ToGnArgs(args, mode, arch, target_os))
+                gn_args += GetGNArgs(args)
+                if args.verbose:
+                    print("gn gen --check in %s" % out_dir)
+                if args.ide:
+                    command.append(ide_switch(HOST_OS))
+                command.append('--args=%s' % ' '.join(gn_args))
+                commands.append(command)
 
-  pool = multiprocessing.Pool(args.workers)
-  results = pool.map(RunCommand, commands, chunksize=1)
-  for r in results:
-    if r != 0:
-      print (r.strip())
-      return 1
+    pool = multiprocessing.Pool(args.workers)
+    results = pool.map(RunCommand, commands, chunksize=1)
+    for r in results:
+        if r != 0:
+            print(r.strip())
+            return 1
 
-  endtime = time.time()
-  if args.verbose:
-    print ("GN Time: %.3f seconds" % (endtime - starttime))
-  return 0
+    endtime = time.time()
+    if args.verbose:
+        print("GN Time: %.3f seconds" % (endtime - starttime))
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/gn_helpers.py b/tools/gn_helpers.py
index 3b0647d..f5c859d 100644
--- a/tools/gn_helpers.py
+++ b/tools/gn_helpers.py
@@ -1,39 +1,39 @@
 # Copyright 2014 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.
-
 """Helper functions useful when writing scripts that are run from GN's
 exec_script function."""
 
+
 class GNException(Exception):
-  pass
+    pass
 
 
-def ToGNString(value, allow_dicts = True):
-  """Prints the given value to stdout.
+def ToGNString(value, allow_dicts=True):
+    """Prints the given value to stdout.
 
   allow_dicts indicates if this function will allow converting dictionaries
   to GN scopes. This is only possible at the top level, you can't nest a
   GN scope in a list, so this should be set to False for recursive calls."""
-  if isinstance(value, str):
-    if value.find('\n') >= 0:
-      raise GNException("Trying to print a string with a newline in it.")
-    return '"' + value.replace('"', '\\"') + '"'
+    if isinstance(value, str):
+        if value.find('\n') >= 0:
+            raise GNException("Trying to print a string with a newline in it.")
+        return '"' + value.replace('"', '\\"') + '"'
 
-  if isinstance(value, list):
-    return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
+    if isinstance(value, list):
+        return '[ %s ]' % ', '.join(ToGNString(v) for v in value)
 
-  if isinstance(value, dict):
-    if not allow_dicts:
-      raise GNException("Attempting to recursively print a dictionary.")
-    result = ""
-    for key in value:
-      if not isinstance(key, str):
-        raise GNException("Dictionary key is not a string.")
-      result += "%s = %s\n" % (key, ToGNString(value[key], False))
-    return result
+    if isinstance(value, dict):
+        if not allow_dicts:
+            raise GNException("Attempting to recursively print a dictionary.")
+        result = ""
+        for key in value:
+            if not isinstance(key, str):
+                raise GNException("Dictionary key is not a string.")
+            result += "%s = %s\n" % (key, ToGNString(value[key], False))
+        return result
 
-  if isinstance(value, int):
-    return str(value)
+    if isinstance(value, int):
+        return str(value)
 
-  raise GNException("Unsupported type when printing to GN.")
+    raise GNException("Unsupported type when printing to GN.")
diff --git a/tools/list_dart_files.py b/tools/list_dart_files.py
index 7a9ee8a..d62550c 100755
--- a/tools/list_dart_files.py
+++ b/tools/list_dart_files.py
@@ -2,7 +2,6 @@
 # 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.
-
 """Tool for listing Dart source files.
 
 If the first argument is 'relative', the script produces paths relative to the
@@ -19,37 +18,38 @@
 
 
 def main(argv):
-  mode = argv[1]
-  if mode not in ['absolute', 'relative']:
-    raise Exception("First argument must be 'absolute' or 'relative'")
-  directory = argv[2]
-  if mode in 'absolute' and not os.path.isabs(directory):
-    directory = os.path.realpath(directory)
+    mode = argv[1]
+    if mode not in ['absolute', 'relative']:
+        raise Exception("First argument must be 'absolute' or 'relative'")
+    directory = argv[2]
+    if mode in 'absolute' and not os.path.isabs(directory):
+        directory = os.path.realpath(directory)
 
-  pattern = None
-  if len(argv) > 3:
-    pattern = re.compile(argv[3])
+    pattern = None
+    if len(argv) > 3:
+        pattern = re.compile(argv[3])
 
-  for root, directories, files in os.walk(directory):
-    # We only care about actual source files, not generated code or tests.
-    for skip_dir in ['.git', 'gen', 'test']:
-      if skip_dir in directories:
-        directories.remove(skip_dir)
+    for root, directories, files in os.walk(directory):
+        # We only care about actual source files, not generated code or tests.
+        for skip_dir in ['.git', 'gen', 'test']:
+            if skip_dir in directories:
+                directories.remove(skip_dir)
 
-    # If we are looking at the root directory, filter the immediate
-    # subdirectories by the given pattern.
-    if pattern and root == directory:
-      directories[:] = filter(pattern.match, directories)
+        # If we are looking at the root directory, filter the immediate
+        # subdirectories by the given pattern.
+        if pattern and root == directory:
+            directories[:] = filter(pattern.match, directories)
 
-    for filename in files:
-      if filename.endswith('.dart') and not filename.endswith('_test.dart'):
-        if mode in 'absolute':
-          fullname = os.path.join(directory, root, filename)
-        else:
-          fullname = os.path.relpath(os.path.join(root, filename))
-        fullname = fullname.replace(os.sep, '/')
-        print fullname
+        for filename in files:
+            if filename.endswith(
+                    '.dart') and not filename.endswith('_test.dart'):
+                if mode in 'absolute':
+                    fullname = os.path.join(directory, root, filename)
+                else:
+                    fullname = os.path.relpath(os.path.join(root, filename))
+                fullname = fullname.replace(os.sep, '/')
+                print fullname
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/list_files.py b/tools/list_files.py
index b63d6ab..2573bc1 100755
--- a/tools/list_files.py
+++ b/tools/list_files.py
@@ -2,7 +2,6 @@
 # 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.
-
 """Tool for listing files whose name match a pattern.
 
 If the first argument is 'relative', the script produces paths relative to the
@@ -19,25 +18,25 @@
 
 
 def main(argv):
-  mode = argv[1]
-  if mode not in ['absolute', 'relative']:
-    raise Exception("First argument must be 'absolute' or 'relative'")
-  pattern = re.compile(argv[2])
-  for directory in argv[3:]:
-    if mode in 'absolute' and not os.path.isabs(directory):
-      directory = os.path.realpath(directory)
-    for root, directories, files in os.walk(directory):
-      if '.git' in directories:
-        directories.remove('.git')
-      for filename in files:
-        if mode in 'absolute':
-          fullname = os.path.join(directory, root, filename)
-        else:
-          fullname = os.path.relpath(os.path.join(root, filename))
-        fullname = fullname.replace(os.sep, '/')
-        if re.search(pattern, fullname):
-          print fullname
+    mode = argv[1]
+    if mode not in ['absolute', 'relative']:
+        raise Exception("First argument must be 'absolute' or 'relative'")
+    pattern = re.compile(argv[2])
+    for directory in argv[3:]:
+        if mode in 'absolute' and not os.path.isabs(directory):
+            directory = os.path.realpath(directory)
+        for root, directories, files in os.walk(directory):
+            if '.git' in directories:
+                directories.remove('.git')
+            for filename in files:
+                if mode in 'absolute':
+                    fullname = os.path.join(directory, root, filename)
+                else:
+                    fullname = os.path.relpath(os.path.join(root, filename))
+                fullname = fullname.replace(os.sep, '/')
+                if re.search(pattern, fullname):
+                    print fullname
 
 
 if __name__ == '__main__':
-  sys.exit(main(sys.argv))
+    sys.exit(main(sys.argv))
diff --git a/tools/make_bundle_unittest.py b/tools/make_bundle_unittest.py
index 6d6ea21..d6c75a0 100755
--- a/tools/make_bundle_unittest.py
+++ b/tools/make_bundle_unittest.py
@@ -4,7 +4,6 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 #
-
 """Unit tests for make_bundle.py."""
 
 import os
@@ -19,63 +18,65 @@
 
 
 class BundleMakerTest(unittest.TestCase):
-  """Unit test class for BundleMaker."""
+    """Unit test class for BundleMaker."""
 
-  def setUp(self):
-    self._tempdir = tempfile.mkdtemp()
-    self._top_dir = path.normpath(path.join(path.dirname(sys.argv[0]),
-                                            os.pardir))
-    self._dest = path.join(self._tempdir, 'new_bundle')
+    def setUp(self):
+        self._tempdir = tempfile.mkdtemp()
+        self._top_dir = path.normpath(
+            path.join(path.dirname(sys.argv[0]), os.pardir))
+        self._dest = path.join(self._tempdir, 'new_bundle')
 
-  def tearDown(self):
-    shutil.rmtree(self._tempdir)
+    def tearDown(self):
+        shutil.rmtree(self._tempdir)
 
-  def testBuildOptions(self):
-    op = make_bundle.BundleMaker.BuildOptions()
-    op.parse_args(args=[])
+    def testBuildOptions(self):
+        op = make_bundle.BundleMaker.BuildOptions()
+        op.parse_args(args=[])
 
-  def testCheckOptions(self):
-    op = make_bundle.BundleMaker.BuildOptions()
-    options = make_bundle.BundleMaker.CheckOptions(op, self._top_dir,
-                                                   ['--dest', self._dest])
-    self.failUnless(path.exists(self._dest))
-    os.rmdir(self._dest)
-    self.assertEquals(self._dest, options['dest'])
-    self.assertEquals(self._top_dir, options['top_dir'])
-    self.failIf(options['verbose'])
-    self.failIf(options['skip_build'])
-    options = make_bundle.BundleMaker.CheckOptions(op, self._top_dir,
-                                                   ['--dest', self._dest, '-v'])
-    self.failUnless(path.exists(self._dest))
-    self.assertEquals(self._dest, options['dest'])
-    self.assertEquals(self._top_dir, options['top_dir'])
-    self.failUnless(options['verbose'])
-    self.failIf(options['skip_build'])
+    def testCheckOptions(self):
+        op = make_bundle.BundleMaker.BuildOptions()
+        options = make_bundle.BundleMaker.CheckOptions(op, self._top_dir,
+                                                       ['--dest', self._dest])
+        self.failUnless(path.exists(self._dest))
+        os.rmdir(self._dest)
+        self.assertEquals(self._dest, options['dest'])
+        self.assertEquals(self._top_dir, options['top_dir'])
+        self.failIf(options['verbose'])
+        self.failIf(options['skip_build'])
+        options = make_bundle.BundleMaker.CheckOptions(
+            op, self._top_dir, ['--dest', self._dest, '-v'])
+        self.failUnless(path.exists(self._dest))
+        self.assertEquals(self._dest, options['dest'])
+        self.assertEquals(self._top_dir, options['top_dir'])
+        self.failUnless(options['verbose'])
+        self.failIf(options['skip_build'])
 
-  def _RunCommand(self, *args):
-    proc = subprocess.Popen(args,
-                            cwd=self._dest,
-                            stdout=subprocess.PIPE,
-                            stderr=subprocess.STDOUT)
-    stdout = proc.communicate()[0]
-    self.assertEqual(0, proc.wait(), msg='%s\n%s' % (' '.join(args), stdout))
+    def _RunCommand(self, *args):
+        proc = subprocess.Popen(
+            args,
+            cwd=self._dest,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.STDOUT)
+        stdout = proc.communicate()[0]
+        self.assertEqual(
+            0, proc.wait(), msg='%s\n%s' % (' '.join(args), stdout))
 
-  def testMakeBundle(self):
-    os.mkdir(self._dest)
-    maker = make_bundle.BundleMaker(dest=self._dest, top_dir=self._top_dir)
-    self.assertEquals(0, maker.MakeBundle())
-    commands = [
-        './dart samples/hello.dart',
-        './dart samples/deltablue.dart',
-        './dart samples/mandelbrot.dart',
-        './dart samples/towers.dart',
+    def testMakeBundle(self):
+        os.mkdir(self._dest)
+        maker = make_bundle.BundleMaker(dest=self._dest, top_dir=self._top_dir)
+        self.assertEquals(0, maker.MakeBundle())
+        commands = [
+            './dart samples/hello.dart',
+            './dart samples/deltablue.dart',
+            './dart samples/mandelbrot.dart',
+            './dart samples/towers.dart',
         ]
-    for command in commands:
-      args = command.split(' ')
-      self._RunCommand(*args)
-      args.append('--arch=dartc')
-      self._RunCommand(*args)
+        for command in commands:
+            args = command.split(' ')
+            self._RunCommand(*args)
+            args.append('--arch=dartc')
+            self._RunCommand(*args)
 
 
 if __name__ == '__main__':
-  unittest.main()
+    unittest.main()
diff --git a/tools/make_version.py b/tools/make_version.py
index 05f72e8..8c11cb3 100755
--- a/tools/make_version.py
+++ b/tools/make_version.py
@@ -12,156 +12,169 @@
 from optparse import OptionParser
 import utils
 
+
 def debugLog(message):
-  print >> sys.stderr, message
-  sys.stderr.flush()
+    print >> sys.stderr, message
+    sys.stderr.flush()
+
 
 # When these files change, snapshots created by the VM are potentially no longer
 # backwards-compatible.
-VM_SNAPSHOT_FILES=[
-  # Header files.
-  'clustered_snapshot.h',
-  'datastream.h',
-  'image_snapshot.h',
-  'object.h',
-  'raw_object.h',
-  'snapshot.h',
-  'snapshot_ids.h',
-  'symbols.h',
-  # Source files.
-  'clustered_snapshot.cc',
-  'dart.cc',
-  'dart_api_impl.cc',
-  'image_snapshot.cc',
-  'object.cc',
-  'raw_object.cc',
-  'raw_object_snapshot.cc',
-  'snapshot.cc',
-  'symbols.cc',
+VM_SNAPSHOT_FILES = [
+    # Header files.
+    'clustered_snapshot.h',
+    'datastream.h',
+    'image_snapshot.h',
+    'object.h',
+    'raw_object.h',
+    'snapshot.h',
+    'snapshot_ids.h',
+    'symbols.h',
+    # Source files.
+    'clustered_snapshot.cc',
+    'dart.cc',
+    'dart_api_impl.cc',
+    'image_snapshot.cc',
+    'object.cc',
+    'raw_object.cc',
+    'raw_object_snapshot.cc',
+    'snapshot.cc',
+    'symbols.cc',
 ]
 
+
 def MakeVersionString(quiet, no_git_hash, custom_for_pub=None):
-  channel = utils.GetChannel()
-  if custom_for_pub and channel == 'be':
-    latest = utils.GetLatestDevTag()
-    if not latest:
-      # If grabbing the dev tag fails, then fall back on the VERSION file.
-      latest = utils.GetSemanticSDKVersion(no_git_hash=True)
-    if no_git_hash:
-      version_string = ("%s.%s" % (latest, custom_for_pub))
+    channel = utils.GetChannel()
+    if custom_for_pub and channel == 'be':
+        latest = utils.GetLatestDevTag()
+        if not latest:
+            # If grabbing the dev tag fails, then fall back on the VERSION file.
+            latest = utils.GetSemanticSDKVersion(no_git_hash=True)
+        if no_git_hash:
+            version_string = ("%s.%s" % (latest, custom_for_pub))
+        else:
+            git_hash = utils.GetShortGitHash()
+            version_string = ("%s.%s-%s" % (latest, custom_for_pub, git_hash))
     else:
-      git_hash = utils.GetShortGitHash()
-      version_string = ("%s.%s-%s" % (latest, custom_for_pub, git_hash))
-  else:
-    version_string = utils.GetSemanticSDKVersion(no_git_hash=no_git_hash)
-  if not quiet:
-    debugLog("Returning version string: %s " % version_string)
-  return version_string
+        version_string = utils.GetSemanticSDKVersion(no_git_hash=no_git_hash)
+    if not quiet:
+        debugLog("Returning version string: %s " % version_string)
+    return version_string
 
 
 def MakeSnapshotHashString():
-  vmhash = hashlib.md5()
-  for vmfilename in VM_SNAPSHOT_FILES:
-    vmfilepath = os.path.join(utils.DART_DIR, 'runtime', 'vm', vmfilename)
-    with open(vmfilepath) as vmfile:
-      vmhash.update(vmfile.read())
-  return vmhash.hexdigest()
+    vmhash = hashlib.md5()
+    for vmfilename in VM_SNAPSHOT_FILES:
+        vmfilepath = os.path.join(utils.DART_DIR, 'runtime', 'vm', vmfilename)
+        with open(vmfilepath) as vmfile:
+            vmhash.update(vmfile.read())
+    return vmhash.hexdigest()
 
 
-def MakeFile(quiet, output_file, input_file, no_git_hash, custom_for_pub, version_file=None):
-  if version_file:
-    version_string = utils.GetVersion(no_git_hash, version_file)
-  else:
-    version_string = MakeVersionString(quiet, no_git_hash, custom_for_pub)
+def MakeFile(quiet,
+             output_file,
+             input_file,
+             no_git_hash,
+             custom_for_pub,
+             version_file=None):
+    if version_file:
+        version_string = utils.GetVersion(no_git_hash, version_file)
+    else:
+        version_string = MakeVersionString(quiet, no_git_hash, custom_for_pub)
 
-  version_cc_text = open(input_file).read()
-  version_cc_text = version_cc_text.replace("{{VERSION_STR}}",
-                                            version_string)
-  version_time = utils.GetGitTimestamp()
-  if no_git_hash or version_time == None:
-    version_time = "Unknown timestamp"
-  version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}",
-                                            version_time)
-  abi_version = utils.GetAbiVersion(version_file)
-  version_cc_text = version_cc_text.replace("{{ABI_VERSION}}", abi_version)
-  oldest_supported_abi_version = utils.GetOldestSupportedAbiVersion(version_file)
-  version_cc_text = version_cc_text.replace("{{OLDEST_SUPPORTED_ABI_VERSION}}",
-                                            oldest_supported_abi_version)
-  snapshot_hash = MakeSnapshotHashString()
-  version_cc_text = version_cc_text.replace("{{SNAPSHOT_HASH}}",
-                                            snapshot_hash)
-  open(output_file, 'w').write(version_cc_text)
-  return True
+    version_cc_text = open(input_file).read()
+    version_cc_text = version_cc_text.replace("{{VERSION_STR}}", version_string)
+    version_time = utils.GetGitTimestamp()
+    if no_git_hash or version_time == None:
+        version_time = "Unknown timestamp"
+    version_cc_text = version_cc_text.replace("{{COMMIT_TIME}}", version_time)
+    abi_version = utils.GetAbiVersion(version_file)
+    version_cc_text = version_cc_text.replace("{{ABI_VERSION}}", abi_version)
+    oldest_supported_abi_version = utils.GetOldestSupportedAbiVersion(
+        version_file)
+    version_cc_text = version_cc_text.replace(
+        "{{OLDEST_SUPPORTED_ABI_VERSION}}", oldest_supported_abi_version)
+    snapshot_hash = MakeSnapshotHashString()
+    version_cc_text = version_cc_text.replace("{{SNAPSHOT_HASH}}",
+                                              snapshot_hash)
+    open(output_file, 'w').write(version_cc_text)
+    return True
 
 
 def main(args):
-  try:
-    # Parse input.
-    parser = OptionParser()
-    parser.add_option("--custom_for_pub",
-        action="store",
-        type="string",
-        help=("Generates a version string that works with pub that includes"
-              "the given string. This is silently ignored on channels other"
-              "than be"))
-    parser.add_option("--input",
-        action="store",
-        type="string",
-        help="input template file.")
-    parser.add_option("--no_git_hash",
-        action="store_true",
-        default=False,
-        help="Don't try to determine svn revision")
-    parser.add_option("--output",
-        action="store",
-        type="string",
-        help="output file name")
-    parser.add_option("-q", "--quiet",
-        action="store_true",
-        default=False,
-        help="disable console output")
-    parser.add_option("--version-file",
-        action="store",
-        type="string",
-        default=None,
-        help="Version file")
+    try:
+        # Parse input.
+        parser = OptionParser()
+        parser.add_option(
+            "--custom_for_pub",
+            action="store",
+            type="string",
+            help=("Generates a version string that works with pub that includes"
+                  "the given string. This is silently ignored on channels other"
+                  "than be"))
+        parser.add_option(
+            "--input",
+            action="store",
+            type="string",
+            help="input template file.")
+        parser.add_option(
+            "--no_git_hash",
+            action="store_true",
+            default=False,
+            help="Don't try to determine svn revision")
+        parser.add_option(
+            "--output", action="store", type="string", help="output file name")
+        parser.add_option(
+            "-q",
+            "--quiet",
+            action="store_true",
+            default=False,
+            help="disable console output")
+        parser.add_option(
+            "--version-file",
+            action="store",
+            type="string",
+            default=None,
+            help="Version file")
 
-    (options, args) = parser.parse_args()
+        (options, args) = parser.parse_args()
 
-    # If there is no input template, then write the bare version string to
-    # options.output. If there is no options.output, then write the version
-    # string to stdout.
-    if not options.input:
-      version_string = MakeVersionString(
-          options.quiet, options.no_git_hash, options.custom_for_pub)
-      if options.output:
-        open(options.output, 'w').write(version_string)
-      else:
-        print (version_string)
-      return 0
+        # If there is no input template, then write the bare version string to
+        # options.output. If there is no options.output, then write the version
+        # string to stdout.
+        if not options.input:
+            version_string = MakeVersionString(
+                options.quiet, options.no_git_hash, options.custom_for_pub)
+            if options.output:
+                open(options.output, 'w').write(version_string)
+            else:
+                print(version_string)
+            return 0
 
-    if not options.output:
-      sys.stderr.write('--output not specified\n')
-      return -1
-    if not options.input:
-      sys.stderr.write('--input not specified\n')
-      return -1
+        if not options.output:
+            sys.stderr.write('--output not specified\n')
+            return -1
+        if not options.input:
+            sys.stderr.write('--input not specified\n')
+            return -1
 
-    files = []
-    for arg in args:
-      files.append(arg)
+        files = []
+        for arg in args:
+            files.append(arg)
 
-    if not MakeFile(options.quiet, options.output, options.input,
-                    options.no_git_hash, options.custom_for_pub, options.version_file):
-      return -1
+        if not MakeFile(options.quiet, options.output, options.input,
+                        options.no_git_hash, options.custom_for_pub,
+                        options.version_file):
+            return -1
 
-    return 0
-  except Exception as inst:
-    sys.stderr.write('make_version.py exception\n')
-    sys.stderr.write(str(inst))
-    sys.stderr.write('\n')
-    return -1
+        return 0
+    except Exception as inst:
+        sys.stderr.write('make_version.py exception\n')
+        sys.stderr.write(str(inst))
+        sys.stderr.write('\n')
+        return -1
+
 
 if __name__ == '__main__':
-  exit_code = main(sys.argv)
-  sys.exit(exit_code)
+    exit_code = main(sys.argv)
+    sys.exit(exit_code)
diff --git a/tools/minidump.py b/tools/minidump.py
index e74be94..e0e7459 100644
--- a/tools/minidump.py
+++ b/tools/minidump.py
@@ -11,124 +11,117 @@
 
 
 class Enum(object):
-  def __init__(self, type, name2value):
-    self.name2value = name2value
-    self.value2name = {v: k for k, v in name2value.iteritems()}
-    self.type = type
 
-  def from_raw(self, v):
-    if v not in self.value2name:
-      return 'Unknown(' + str(v) + ')'
-    return self.value2name[v]
+    def __init__(self, type, name2value):
+        self.name2value = name2value
+        self.value2name = {v: k for k, v in name2value.iteritems()}
+        self.type = type
 
-  def to_raw(self, v):
-    return self.name2value[v]
+    def from_raw(self, v):
+        if v not in self.value2name:
+            return 'Unknown(' + str(v) + ')'
+        return self.value2name[v]
+
+    def to_raw(self, v):
+        return self.name2value[v]
 
 
 class Descriptor(object):
-  """A handy wrapper over ctypes.Structure"""
+    """A handy wrapper over ctypes.Structure"""
 
-  def __init__(self, fields):
-    self.fields = fields
-    self.ctype = Descriptor._GetCtype(fields)
-    self.size = ctypes.sizeof(self.ctype)
+    def __init__(self, fields):
+        self.fields = fields
+        self.ctype = Descriptor._GetCtype(fields)
+        self.size = ctypes.sizeof(self.ctype)
 
-  def Read(self, address):
-    return self.ctype.from_address(address)
+    def Read(self, address):
+        return self.ctype.from_address(address)
 
-  @staticmethod
-  def _GetCtype(fields):
-    raw_fields = []
-    wrappers = {}
-    for field in fields:
-      (name, type) = field
-      if isinstance(type, Enum):
-        raw_fields.append(('_raw_' + name, type.type))
-        wrappers[name] = type
-      else:
-        raw_fields.append(field)
+    @staticmethod
+    def _GetCtype(fields):
+        raw_fields = []
+        wrappers = {}
+        for field in fields:
+            (name, type) = field
+            if isinstance(type, Enum):
+                raw_fields.append(('_raw_' + name, type.type))
+                wrappers[name] = type
+            else:
+                raw_fields.append(field)
 
-    class Raw(ctypes.Structure):
-      _fields_ = raw_fields
-      _pack_ = 1
+        class Raw(ctypes.Structure):
+            _fields_ = raw_fields
+            _pack_ = 1
 
-      def __getattribute__(self, name):
-        if name in wrappers:
-          return wrappers[name].from_raw(getattr(self, '_raw_' + name))
-        else:
-          return ctypes.Structure.__getattribute__(self, name)
+            def __getattribute__(self, name):
+                if name in wrappers:
+                    return wrappers[name].from_raw(
+                        getattr(self, '_raw_' + name))
+                else:
+                    return ctypes.Structure.__getattribute__(self, name)
 
-      def __repr__(self):
-        return '{' + ', '.join('%s: %s' % (field, self.__getattribute__(field))
-                               for field, _ in fields) + '}'
+            def __repr__(self):
+                return '{' + ', '.join(
+                    '%s: %s' % (field, self.__getattribute__(field))
+                    for field, _ in fields) + '}'
 
-    return Raw
+        return Raw
 
 
 # Structures below are based on the information in the MSDN pages and
 # Breakpad/Crashpad sources.
 
+MINIDUMP_HEADER = Descriptor([('signature', ctypes.c_uint32),
+                              ('version', ctypes.c_uint32),
+                              ('stream_count', ctypes.c_uint32),
+                              ('stream_directories_rva', ctypes.c_uint32),
+                              ('checksum', ctypes.c_uint32),
+                              ('time_date_stampt', ctypes.c_uint32),
+                              ('flags', ctypes.c_uint64)])
 
-MINIDUMP_HEADER = Descriptor([
-  ('signature', ctypes.c_uint32),
-  ('version', ctypes.c_uint32),
-  ('stream_count', ctypes.c_uint32),
-  ('stream_directories_rva', ctypes.c_uint32),
-  ('checksum', ctypes.c_uint32),
-  ('time_date_stampt', ctypes.c_uint32),
-  ('flags', ctypes.c_uint64)
-])
-
-
-MINIDUMP_LOCATION_DESCRIPTOR = Descriptor([
-  ('data_size', ctypes.c_uint32),
-  ('rva', ctypes.c_uint32)
-])
-
+MINIDUMP_LOCATION_DESCRIPTOR = Descriptor([('data_size', ctypes.c_uint32),
+                                           ('rva', ctypes.c_uint32)])
 
 MINIDUMP_STREAM_TYPE = {
-  'MD_UNUSED_STREAM': 0,
-  'MD_RESERVED_STREAM_0': 1,
-  'MD_RESERVED_STREAM_1': 2,
-  'MD_THREAD_LIST_STREAM': 3,
-  'MD_MODULE_LIST_STREAM': 4,
-  'MD_MEMORY_LIST_STREAM': 5,
-  'MD_EXCEPTION_STREAM': 6,
-  'MD_SYSTEM_INFO_STREAM': 7,
-  'MD_THREAD_EX_LIST_STREAM': 8,
-  'MD_MEMORY_64_LIST_STREAM': 9,
-  'MD_COMMENT_STREAM_A': 10,
-  'MD_COMMENT_STREAM_W': 11,
-  'MD_HANDLE_DATA_STREAM': 12,
-  'MD_FUNCTION_TABLE_STREAM': 13,
-  'MD_UNLOADED_MODULE_LIST_STREAM': 14,
-  'MD_MISC_INFO_STREAM': 15,
-  'MD_MEMORY_INFO_LIST_STREAM': 16,
-  'MD_THREAD_INFO_LIST_STREAM': 17,
-  'MD_HANDLE_OPERATION_LIST_STREAM': 18,
+    'MD_UNUSED_STREAM': 0,
+    'MD_RESERVED_STREAM_0': 1,
+    'MD_RESERVED_STREAM_1': 2,
+    'MD_THREAD_LIST_STREAM': 3,
+    'MD_MODULE_LIST_STREAM': 4,
+    'MD_MEMORY_LIST_STREAM': 5,
+    'MD_EXCEPTION_STREAM': 6,
+    'MD_SYSTEM_INFO_STREAM': 7,
+    'MD_THREAD_EX_LIST_STREAM': 8,
+    'MD_MEMORY_64_LIST_STREAM': 9,
+    'MD_COMMENT_STREAM_A': 10,
+    'MD_COMMENT_STREAM_W': 11,
+    'MD_HANDLE_DATA_STREAM': 12,
+    'MD_FUNCTION_TABLE_STREAM': 13,
+    'MD_UNLOADED_MODULE_LIST_STREAM': 14,
+    'MD_MISC_INFO_STREAM': 15,
+    'MD_MEMORY_INFO_LIST_STREAM': 16,
+    'MD_THREAD_INFO_LIST_STREAM': 17,
+    'MD_HANDLE_OPERATION_LIST_STREAM': 18,
 }
 
-
-MINIDUMP_DIRECTORY = Descriptor([
-  ('stream_type', Enum(ctypes.c_uint32, MINIDUMP_STREAM_TYPE)),
-  ('location', MINIDUMP_LOCATION_DESCRIPTOR.ctype)
-])
-
+MINIDUMP_DIRECTORY = Descriptor([('stream_type',
+                                  Enum(ctypes.c_uint32, MINIDUMP_STREAM_TYPE)),
+                                 ('location',
+                                  MINIDUMP_LOCATION_DESCRIPTOR.ctype)])
 
 MINIDUMP_MISC_INFO_2 = Descriptor([
-  ('SizeOfInfo', ctypes.c_uint32),
-  ('Flags1', ctypes.c_uint32),
-  ('ProcessId', ctypes.c_uint32),
-  ('ProcessCreateTime', ctypes.c_uint32),
-  ('ProcessUserTime', ctypes.c_uint32),
-  ('ProcessKernelTime', ctypes.c_uint32),
-  ('ProcessorMaxMhz', ctypes.c_uint32),
-  ('ProcessorCurrentMhz', ctypes.c_uint32),
-  ('ProcessorMhzLimit', ctypes.c_uint32),
-  ('ProcessorMaxIdleState', ctypes.c_uint32),
-  ('ProcessorCurrentIdleState', ctypes.c_uint32),
-]);
-
+    ('SizeOfInfo', ctypes.c_uint32),
+    ('Flags1', ctypes.c_uint32),
+    ('ProcessId', ctypes.c_uint32),
+    ('ProcessCreateTime', ctypes.c_uint32),
+    ('ProcessUserTime', ctypes.c_uint32),
+    ('ProcessKernelTime', ctypes.c_uint32),
+    ('ProcessorMaxMhz', ctypes.c_uint32),
+    ('ProcessorCurrentMhz', ctypes.c_uint32),
+    ('ProcessorMhzLimit', ctypes.c_uint32),
+    ('ProcessorMaxIdleState', ctypes.c_uint32),
+    ('ProcessorCurrentIdleState', ctypes.c_uint32),
+])
 
 MINIDUMP_MISC1_PROCESS_ID = 0x00000001
 
@@ -136,55 +129,56 @@
 # A helper to get a raw address of the memory mapped buffer returned by
 # mmap.
 def BufferToAddress(buf):
-  obj = ctypes.py_object(buf)
-  address = ctypes.c_void_p()
-  length = ctypes.c_ssize_t()
-  ctypes.pythonapi.PyObject_AsReadBuffer(
-      obj, ctypes.byref(address), ctypes.byref(length))
-  return address.value
+    obj = ctypes.py_object(buf)
+    address = ctypes.c_void_p()
+    length = ctypes.c_ssize_t()
+    ctypes.pythonapi.PyObject_AsReadBuffer(obj, ctypes.byref(address),
+                                           ctypes.byref(length))
+    return address.value
 
 
 class MinidumpFile(object):
-  """Class for reading minidump files."""
-  _HEADER_MAGIC = 0x504d444d
+    """Class for reading minidump files."""
+    _HEADER_MAGIC = 0x504d444d
 
-  def __init__(self, minidump_name):
-    self.minidump_name = minidump_name
-    self.minidump_file = open(minidump_name, 'r')
-    self.minidump = mmap.mmap(self.minidump_file.fileno(), 0, access=mmap.ACCESS_READ)
-    self.minidump_address = BufferToAddress(self.minidump)
-    self.header = self.Read(MINIDUMP_HEADER, 0)
-    if self.header.signature != MinidumpFile._HEADER_MAGIC:
-      raise Exception('Unsupported minidump header magic')
-    self.directories = []
-    offset = self.header.stream_directories_rva
-    for _ in range(self.header.stream_count):
-      self.directories.append(self.Read(MINIDUMP_DIRECTORY, offset))
-      offset += MINIDUMP_DIRECTORY.size
+    def __init__(self, minidump_name):
+        self.minidump_name = minidump_name
+        self.minidump_file = open(minidump_name, 'r')
+        self.minidump = mmap.mmap(
+            self.minidump_file.fileno(), 0, access=mmap.ACCESS_READ)
+        self.minidump_address = BufferToAddress(self.minidump)
+        self.header = self.Read(MINIDUMP_HEADER, 0)
+        if self.header.signature != MinidumpFile._HEADER_MAGIC:
+            raise Exception('Unsupported minidump header magic')
+        self.directories = []
+        offset = self.header.stream_directories_rva
+        for _ in range(self.header.stream_count):
+            self.directories.append(self.Read(MINIDUMP_DIRECTORY, offset))
+            offset += MINIDUMP_DIRECTORY.size
 
-  def GetProcessId(self):
-    for dir in self.directories:
-      if dir.stream_type == 'MD_MISC_INFO_STREAM':
-        info = self.Read(MINIDUMP_MISC_INFO_2, dir.location.rva)
-        if info.Flags1 & MINIDUMP_MISC1_PROCESS_ID != 0:
-          return info.ProcessId
-    return -1
+    def GetProcessId(self):
+        for dir in self.directories:
+            if dir.stream_type == 'MD_MISC_INFO_STREAM':
+                info = self.Read(MINIDUMP_MISC_INFO_2, dir.location.rva)
+                if info.Flags1 & MINIDUMP_MISC1_PROCESS_ID != 0:
+                    return info.ProcessId
+        return -1
 
-  def Read(self, what, offset):
-    return what.Read(self.minidump_address + offset)
+    def Read(self, what, offset):
+        return what.Read(self.minidump_address + offset)
 
-  def __enter__(self):
-    return self
+    def __enter__(self):
+        return self
 
-  def __exit__(self, type, value, traceback):
-    self.minidump.close()
-    self.minidump_file.close()
+    def __exit__(self, type, value, traceback):
+        self.minidump.close()
+        self.minidump_file.close()
 
 
 # Returns process id of the crashed process recorded in the given minidump.
 def GetProcessIdFromDump(path):
-  try:
-    with MinidumpFile(path) as f:
-      return int(f.GetProcessId())
-  except:
-    return -1
+    try:
+        with MinidumpFile(path) as f:
+            return int(f.GetProcessId())
+    except:
+        return -1
diff --git a/tools/only_in_release_mode.py b/tools/only_in_release_mode.py
index a2babfd..4e6efc3 100644
--- a/tools/only_in_release_mode.py
+++ b/tools/only_in_release_mode.py
@@ -3,7 +3,6 @@
 # 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.
-
 """
 Wrapper around a build action that should only be executed in release mode.
 
@@ -24,27 +23,27 @@
 
 
 def Main():
-  # Throws an error if '--' is not in the argument list.
-  separator_index = sys.argv.index('--')
-  outputs = sys.argv[1:separator_index]
-  arguments = sys.argv[separator_index + 1:]
-  arguments[0] = os.path.normpath(arguments[0])
-  mode = os.getenv('DART_BUILD_MODE', 'release')
-  if mode != 'release':
-    print >> sys.stderr, 'Not running %s in mode=%s' % (arguments, mode)
-    for output in outputs:
-      with open(output, 'w'):
-        # Create an empty file to ensure that we don't rerun this
-        # command unnecessarily.
-        pass
-    return 0
-  else:
-    try:
-      subprocess.check_call(arguments)
-    except subprocess.CalledProcessError as e:
-      return e.returncode
-    return 0
+    # Throws an error if '--' is not in the argument list.
+    separator_index = sys.argv.index('--')
+    outputs = sys.argv[1:separator_index]
+    arguments = sys.argv[separator_index + 1:]
+    arguments[0] = os.path.normpath(arguments[0])
+    mode = os.getenv('DART_BUILD_MODE', 'release')
+    if mode != 'release':
+        print >> sys.stderr, 'Not running %s in mode=%s' % (arguments, mode)
+        for output in outputs:
+            with open(output, 'w'):
+                # Create an empty file to ensure that we don't rerun this
+                # command unnecessarily.
+                pass
+        return 0
+    else:
+        try:
+            subprocess.check_call(arguments)
+        except subprocess.CalledProcessError as e:
+            return e.returncode
+        return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch b/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch
new file mode 100644
index 0000000..3e47909
--- /dev/null
+++ b/tools/patches/flutter-engine/06c3d7ad3a33b7c4d42067c1a24c9279c321071f.patch
@@ -0,0 +1,221 @@
+diff --git a/runtime/dart_isolate.cc b/runtime/dart_isolate.cc
+index 96ac6facd..b649ca834 100644
+--- a/runtime/dart_isolate.cc
++++ b/runtime/dart_isolate.cc
+@@ -163,7 +163,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
+   }
+ 
+   auto* isolate_data = static_cast<std::shared_ptr<DartIsolate>*>(
+-      Dart_IsolateData(dart_isolate));
++      Dart_IsolateGroupData(dart_isolate));
+   if (isolate_data->get() != this) {
+     return false;
+   }
+@@ -174,7 +174,7 @@ bool DartIsolate::Initialize(Dart_Isolate dart_isolate, bool is_root_isolate) {
+   // We are entering a new scope (for the first time since initialization) and
+   // we want to restore the current scope to null when we exit out of this
+   // method. This balances the implicit Dart_EnterIsolate call made by
+-  // Dart_CreateIsolate (which calls the Initialize).
++  // Dart_CreateIsolateGroup (which calls the Initialize).
+   Dart_ExitIsolate();
+ 
+   tonic::DartIsolateScope scope(isolate());
+@@ -636,8 +636,8 @@ Dart_Isolate DartIsolate::DartCreateAndStartServiceIsolate(
+   return service_isolate->isolate();
+ }
+ 
+-// |Dart_IsolateCreateCallback|
+-Dart_Isolate DartIsolate::DartIsolateCreateCallback(
++// |Dart_IsolateGroupCreateCallback|
++Dart_Isolate DartIsolate::DartIsolateGroupCreateCallback(
+     const char* advisory_script_uri,
+     const char* advisory_script_entrypoint,
+     const char* package_root,
+@@ -720,14 +720,16 @@ DartIsolate::CreateDartVMAndEmbedderObjectPair(
+   }
+ 
+   // Create the Dart VM isolate and give it the embedder object as the baton.
+-  Dart_Isolate isolate = Dart_CreateIsolate(
++  Dart_Isolate isolate = Dart_CreateIsolateGroup(
+       advisory_script_uri,         //
+       advisory_script_entrypoint,  //
+       (*embedder_isolate)->GetIsolateSnapshot()->GetDataMapping(),
+       (*embedder_isolate)->GetIsolateSnapshot()->GetInstructionsMapping(),
+       (*embedder_isolate)->GetSharedSnapshot()->GetDataMapping(),
+       (*embedder_isolate)->GetSharedSnapshot()->GetInstructionsMapping(), flags,
+-      embedder_isolate.get(), error);
++      embedder_isolate.get(),  // isolate_group_data
++      embedder_isolate.get(),  // isolate_data
++      error);
+ 
+   if (isolate == nullptr) {
+     FML_DLOG(ERROR) << *error;
+@@ -775,10 +777,10 @@ void DartIsolate::DartIsolateShutdownCallback(
+   isolate_group_data->get()->OnShutdownCallback();
+ }
+ 
+-// |Dart_IsolateCleanupCallback|
+-void DartIsolate::DartIsolateCleanupCallback(
+-    std::shared_ptr<DartIsolate>* isolate_data) {
+-  delete isolate_data;
++// |Dart_IsolateGroupCleanupCallback|
++void DartIsolate::DartIsolateGroupCleanupCallback(
++    std::shared_ptr<DartIsolate>* isolate_group_data) {
++  delete isolate_group_data;
+ }
+ 
+ fml::RefPtr<const DartSnapshot> DartIsolate::GetIsolateSnapshot() const {
+diff --git a/runtime/dart_isolate.h b/runtime/dart_isolate.h
+index 60412972a..453810b1b 100644
+--- a/runtime/dart_isolate.h
++++ b/runtime/dart_isolate.h
+@@ -156,8 +156,8 @@ class DartIsolate : public UIDartState {
+ 
+   void OnShutdownCallback();
+ 
+-  // |Dart_IsolateCreateCallback|
+-  static Dart_Isolate DartIsolateCreateCallback(
++  // |Dart_IsolateGroupCreateCallback|
++  static Dart_Isolate DartIsolateGroupCreateCallback(
+       const char* advisory_script_uri,
+       const char* advisory_script_entrypoint,
+       const char* package_root,
+@@ -189,9 +189,9 @@ class DartIsolate : public UIDartState {
+       std::shared_ptr<DartIsolate>* isolate_group_data,
+       std::shared_ptr<DartIsolate>* isolate_data);
+ 
+-  // |Dart_IsolateCleanupCallback|
+-  static void DartIsolateCleanupCallback(
+-      std::shared_ptr<DartIsolate>* embedder_isolate);
++  // |Dart_IsolateGroupCleanupCallback|
++  static void DartIsolateGroupCleanupCallback(
++      std::shared_ptr<DartIsolate>* isolate_group_data);
+ 
+   FML_DISALLOW_COPY_AND_ASSIGN(DartIsolate);
+ };
+diff --git a/runtime/dart_vm.cc b/runtime/dart_vm.cc
+index 903e74b15..555d0c9ee 100644
+--- a/runtime/dart_vm.cc
++++ b/runtime/dart_vm.cc
+@@ -366,12 +366,13 @@ DartVM::DartVM(std::shared_ptr<const DartVMData> vm_data,
+     params.vm_snapshot_data = vm_data_->GetVMSnapshot().GetDataMapping();
+     params.vm_snapshot_instructions =
+         vm_data_->GetVMSnapshot().GetInstructionsMapping();
+-    params.create = reinterpret_cast<decltype(params.create)>(
+-        DartIsolate::DartIsolateCreateCallback);
+-    params.shutdown = reinterpret_cast<decltype(params.shutdown)>(
+-        DartIsolate::DartIsolateShutdownCallback);
+-    params.cleanup = reinterpret_cast<decltype(params.cleanup)>(
+-        DartIsolate::DartIsolateCleanupCallback);
++    params.create_group = reinterpret_cast<decltype(params.create_group)>(
++        DartIsolate::DartIsolateGroupCreateCallback);
++    params.shutdown_isolate =
++        reinterpret_cast<decltype(params.shutdown_isolate)>(
++            DartIsolate::DartIsolateShutdownCallback);
++    params.cleanup_group = reinterpret_cast<decltype(params.cleanup_group)>(
++        DartIsolate::DartIsolateGroupCleanupCallback);
+     params.thread_exit = ThreadExitCallback;
+     params.get_service_assets = GetVMServiceAssetsArchiveCallback;
+     params.entropy_source = dart::bin::GetEntropy;
+diff --git a/shell/platform/fuchsia/dart/dart_component_controller.cc b/shell/platform/fuchsia/dart/dart_component_controller.cc
+index 1c4f71050..c8e7cc5ab 100644
+--- a/shell/platform/fuchsia/dart/dart_component_controller.cc
++++ b/shell/platform/fuchsia/dart/dart_component_controller.cc
+@@ -324,12 +324,13 @@ bool DartComponentController::CreateIsolate(
+   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState(
+       namespace_fd, [this](Dart_Handle result) { MessageEpilogue(result); }));
+ 
+-  isolate_ = Dart_CreateIsolate(
++  isolate_ = Dart_CreateIsolateGroup(
+       url_.c_str(), label_.c_str(), isolate_snapshot_data,
+       isolate_snapshot_instructions, shared_snapshot_data,
+-      shared_snapshot_instructions, nullptr /* flags */, state, &error);
++      shared_snapshot_instructions, nullptr /* flags */,
++      state /* isolate_group_data */, state /* isolate_data */, &error);
+   if (!isolate_) {
+-    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", error);
++    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", error);
+     return false;
+   }
+ 
+diff --git a/shell/platform/fuchsia/dart/dart_runner.cc b/shell/platform/fuchsia/dart/dart_runner.cc
+index 200500d2c..b9ded3ac4 100644
+--- a/shell/platform/fuchsia/dart/dart_runner.cc
++++ b/shell/platform/fuchsia/dart/dart_runner.cc
+@@ -61,13 +61,13 @@ const char* kDartVMArgs[] = {
+     // clang-format on
+ };
+ 
+-Dart_Isolate IsolateCreateCallback(const char* uri,
+-                                   const char* name,
+-                                   const char* package_root,
+-                                   const char* package_config,
+-                                   Dart_IsolateFlags* flags,
+-                                   void* callback_data,
+-                                   char** error) {
++Dart_Isolate IsolateGroupCreateCallback(const char* uri,
++                                        const char* name,
++                                        const char* package_root,
++                                        const char* package_config,
++                                        Dart_IsolateFlags* flags,
++                                        void* callback_data,
++                                        char** error) {
+   if (std::string(uri) == DART_VM_SERVICE_ISOLATE_NAME) {
+ #if defined(DART_PRODUCT)
+     *error = strdup("The service isolate is not implemented in product mode");
+@@ -81,7 +81,7 @@ Dart_Isolate IsolateCreateCallback(const char* uri,
+   return NULL;
+ }
+ 
+-void IsolateShutdownCallback(void* callback_data) {
++void IsolateShutdownCallback(void* isolate_group_data, void* isolate_data) {
+   // The service isolate (and maybe later the kernel isolate) doesn't have an
+   // async loop.
+   auto dispatcher = async_get_default_dispatcher();
+@@ -92,8 +92,8 @@ void IsolateShutdownCallback(void* callback_data) {
+   }
+ }
+ 
+-void IsolateCleanupCallback(void* callback_data) {
+-  delete static_cast<std::shared_ptr<tonic::DartState>*>(callback_data);
++void IsolateGroupCleanupCallback(void* isolate_group_data) {
++  delete static_cast<std::shared_ptr<tonic::DartState>*>(isolate_group_data);
+ }
+ 
+ void RunApplication(
+@@ -167,9 +167,9 @@ DartRunner::DartRunner() : context_(sys::ComponentContext::Create()) {
+   params.vm_snapshot_data = vm_snapshot_data_.address();
+   params.vm_snapshot_instructions = vm_snapshot_instructions_.address();
+ #endif
+-  params.create = IsolateCreateCallback;
+-  params.shutdown = IsolateShutdownCallback;
+-  params.cleanup = IsolateCleanupCallback;
++  params.create_group = IsolateGroupCreateCallback;
++  params.shutdown_isolate = IsolateShutdownCallback;
++  params.cleanup_group = IsolateGroupCleanupCallback;
+   params.entropy_source = EntropySource;
+ #if !defined(DART_PRODUCT)
+   params.get_service_assets = GetVMServiceAssetsArchiveCallback;
+diff --git a/shell/platform/fuchsia/dart/service_isolate.cc b/shell/platform/fuchsia/dart/service_isolate.cc
+index 2e6eda265..5287d638f 100644
+--- a/shell/platform/fuchsia/dart/service_isolate.cc
++++ b/shell/platform/fuchsia/dart/service_isolate.cc
+@@ -123,14 +123,14 @@ Dart_Isolate CreateServiceIsolate(const char* uri,
+ #endif
+ 
+   auto state = new std::shared_ptr<tonic::DartState>(new tonic::DartState());
+-  Dart_Isolate isolate = Dart_CreateIsolate(
++  Dart_Isolate isolate = Dart_CreateIsolateGroup(
+       uri, DART_VM_SERVICE_ISOLATE_NAME, mapped_isolate_snapshot_data.address(),
+       mapped_isolate_snapshot_instructions.address(),
+       mapped_shared_snapshot_data.address(),
+-      mapped_shared_snapshot_instructions.address(), nullptr /* flags */, state,
+-      error);
++      mapped_shared_snapshot_instructions.address(), nullptr /* flags */,
++      state /* isolate_group_data */, state /* isolate_data */, error);
+   if (!isolate) {
+-    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolate failed: %s", *error);
++    FX_LOGF(ERROR, LOG_TAG, "Dart_CreateIsolateGroup failed: %s", *error);
+     return nullptr;
+   }
+ 
diff --git a/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch b/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch
new file mode 100644
index 0000000..bceade5
--- /dev/null
+++ b/tools/patches/flutter-engine/1e43d65d4ab6cb8b79562d83550d5e37f33abb50.patch
@@ -0,0 +1,39 @@
+diff --git a/DEPS b/DEPS
+index c395874b2..36f4de34b 100644
+--- a/DEPS
++++ b/DEPS
+@@ -96,6 +96,7 @@ vars = {
+   'dart_term_glyph_tag': '1.0.1',
+   'dart_test_reflective_loader_tag': '0.1.8',
+   'dart_test_tag': 'test-v1.6.4',
++  'dart_tflite_native_rev': '712b8a93fbb4caf83ffed37f154da88c2a517a91',
+   'dart_typed_data_tag': '1.1.6',
+   'dart_usage_tag': '3.4.0',
+   'dart_watcher_rev': '0.9.7+12-pub',
+@@ -343,6 +344,9 @@ deps = {
+   'src/third_party/dart/third_party/pkg/test':
+    Var('dart_git') + '/test.git' + '@' + Var('dart_test_tag'),
+ 
++  'src/third_party/dart/third_party/pkg/tflite_native':
++   Var('dart_git') + '/tflite_native.git' + '@' + Var('dart_tflite_native_rev'),
++
+   'src/third_party/dart/third_party/pkg/test_reflective_loader':
+    Var('dart_git') + '/test_reflective_loader.git' + '@' + Var('dart_test_reflective_loader_tag'),
+ 
+@@ -491,6 +495,16 @@ deps = {
+      'dep_type': 'cipd',
+    },
+ 
++   'src/third_party/dart/pkg/analysis_server/language_model': {
++     'packages': [
++       {
++        'package': 'dart/language_model',
++        'version': 'gABkW8D_-f45it57vQ_ZTKFwev16RcCjvrdTCytEnQgC',
++       }
++     ],
++     'dep_type': 'cipd',
++   },
++
+   'src/flutter/third_party/gn': {
+     'packages': [
+       {
diff --git a/tools/patches/flutter-engine/apply.sh b/tools/patches/flutter-engine/apply.sh
index 06811d4..0678c7c 100755
--- a/tools/patches/flutter-engine/apply.sh
+++ b/tools/patches/flutter-engine/apply.sh
@@ -64,12 +64,18 @@
     line="${line/@/ }"
     line=(${line})
     dependency_path=${line[0]}
+    repo=${line[1]}
     dependency_tag_or_hash=${line[2]}
 
     # Inside dependency compare HEAD to specified tag-or-hash by rev-parse'ing
     # them and comparing resulting hashes.
     # Note: tag^0 forces rev-parse to return commit hash rather then the hash of
     # the tag object itself.
+    if [ ! -e ${dependency_path} ]; then
+      pushd $(dirname ${dependency_path}) > /dev/null
+      git clone ${repo}
+      popd
+    fi
     pushd ${dependency_path} > /dev/null
     if [ $(git rev-parse HEAD) != $(git rev-parse ${dependency_tag_or_hash}^0) ]; then
       echo "${dependency_path} requires update to match DEPS file"
diff --git a/tools/promote.py b/tools/promote.py
index 8033ab9..cf31291 100644
--- a/tools/promote.py
+++ b/tools/promote.py
@@ -20,8 +20,9 @@
 DART_PATH = os.path.abspath(os.path.join(__file__, '..', '..'))
 DRY_RUN = False
 
+
 def BuildOptions():
-  usage = """usage: %prog promote [options]
+    usage = """usage: %prog promote [options]
   where:
     promote - Will promote builds from raw/signed locations to release
               locations.
@@ -30,137 +31,140 @@
         python editor/build/promote.py promote --channel=dev --revision=29962
   """
 
-  result = optparse.OptionParser(usage=usage)
+    result = optparse.OptionParser(usage=usage)
 
-  group = optparse.OptionGroup(
-      result, 'Promote', 'options used to promote code')
-  group.add_option(
-      '--revision', help='The svn revision to promote', action='store')
-  group.add_option(
-      '--channel', type='string', help='Channel to promote.', default=None)
-  group.add_option("--dry", help='Dry run', default=False, action="store_true")
-  result.add_option_group(group)
+    group = optparse.OptionGroup(result, 'Promote',
+                                 'options used to promote code')
+    group.add_option(
+        '--revision', help='The svn revision to promote', action='store')
+    group.add_option(
+        '--channel', type='string', help='Channel to promote.', default=None)
+    group.add_option(
+        "--dry", help='Dry run', default=False, action="store_true")
+    result.add_option_group(group)
 
-  return result
+    return result
 
 
 def main():
-  parser = BuildOptions()
-  (options, args) = parser.parse_args()
+    parser = BuildOptions()
+    (options, args) = parser.parse_args()
 
-  def die(msg):
-    print msg
-    parser.print_help()
-    sys.exit(1)
+    def die(msg):
+        print msg
+        parser.print_help()
+        sys.exit(1)
 
-  if not args:
-    die('At least one command must be specified')
+    if not args:
+        die('At least one command must be specified')
 
-  if args[0] == 'promote':
-    command = 'promote'
-    if options.revision is None:
-      die('You must specify a --revision to specify which revision to promote')
+    if args[0] == 'promote':
+        command = 'promote'
+        if options.revision is None:
+            die('You must specify a --revision to specify which revision to promote'
+               )
 
-    # Make sure options.channel is a valid
-    if not options.channel:
-      die('Specify --channel=be/dev/stable')
-    if options.channel not in bot_utils.Channel.ALL_CHANNELS:
-      die('You must supply a valid channel to --channel to promote')
-  else:
-    die('Invalid command specified: {0}.  See help below'.format(args[0]))
+        # Make sure options.channel is a valid
+        if not options.channel:
+            die('Specify --channel=be/dev/stable')
+        if options.channel not in bot_utils.Channel.ALL_CHANNELS:
+            die('You must supply a valid channel to --channel to promote')
+    else:
+        die('Invalid command specified: {0}.  See help below'.format(args[0]))
 
-  if options.dry:
-    global DRY_RUN
-    DRY_RUN = True
-  if command == 'promote':
-    _PromoteDartArchiveBuild(options.channel, options.revision)
+    if options.dry:
+        global DRY_RUN
+        DRY_RUN = True
+    if command == 'promote':
+        _PromoteDartArchiveBuild(options.channel, options.revision)
 
 
 def UpdateDocs():
-  try:
-    print 'Updating docs'
-    url = "http://api.dartlang.org/docs/releases/latest/?force_reload=true"
-    f = urllib.urlopen(url)
-    f.read()
-    print 'Successfully updated api docs'
-  except Exception as e:
-    print 'Could not update api docs, please manually update them'
-    print 'Failed with: %s' % e
+    try:
+        print 'Updating docs'
+        url = "http://api.dartlang.org/docs/releases/latest/?force_reload=true"
+        f = urllib.urlopen(url)
+        f.read()
+        print 'Successfully updated api docs'
+    except Exception as e:
+        print 'Could not update api docs, please manually update them'
+        print 'Failed with: %s' % e
 
 
 def _PromoteDartArchiveBuild(channel, revision):
-  # These namer objects will be used to create GCS object URIs. For the
-  # structure we use, please see tools/bots/bot_utils.py:GCSNamer
-  raw_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
-  signed_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.SIGNED)
-  release_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RELEASE)
+    # These namer objects will be used to create GCS object URIs. For the
+    # structure we use, please see tools/bots/bot_utils.py:GCSNamer
+    raw_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RAW)
+    signed_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.SIGNED)
+    release_namer = bot_utils.GCSNamer(channel, bot_utils.ReleaseType.RELEASE)
 
-  def promote(to_revision):
-    def safety_check_on_gs_path(gs_path, revision, channel):
-      if not (revision != None
-              and len(channel) > 0
-              and ('%s' % revision) in gs_path
-              and channel in gs_path):
-        raise Exception(
-            "InternalError: Sanity check failed on GS URI: %s" % gs_path)
+    def promote(to_revision):
 
-    def exists(gs_path):
-      (_, _, exit_code) = Gsutil(['ls', gs_path], throw_on_error=False)
-      # gsutil will exit 0 if the "directory" exists
-      return exit_code == 0
+        def safety_check_on_gs_path(gs_path, revision, channel):
+            if not (revision != None and len(channel) > 0 and
+                    ('%s' % revision) in gs_path and channel in gs_path):
+                raise Exception(
+                    "InternalError: Sanity check failed on GS URI: %s" %
+                    gs_path)
 
-    # Google cloud storage has read-after-write, read-after-update,
-    # and read-after-delete consistency, but not list after delete consistency.
-    # Because gsutil uses list to figure out if it should do the unix styly
-    # copy to or copy into, this means that if the directory is reported as
-    # still being there (after it has been deleted) gsutil will copy
-    # into the directory instead of to the directory.
-    def wait_for_delete_to_be_consistent_with_list(gs_path):
-      if DRY_RUN:
-        return
-      while exists(gs_path):
-        time.sleep(1)
+        def exists(gs_path):
+            (_, _, exit_code) = Gsutil(['ls', gs_path], throw_on_error=False)
+            # gsutil will exit 0 if the "directory" exists
+            return exit_code == 0
 
-    def remove_gs_directory(gs_path):
-      safety_check_on_gs_path(gs_path, to_revision, channel)
-      # Only delete existing directories
-      if exists(gs_path):
-        Gsutil(['-m', 'rm', '-R', '-f', gs_path])
-        wait_for_delete_to_be_consistent_with_list(gs_path)
+        # Google cloud storage has read-after-write, read-after-update,
+        # and read-after-delete consistency, but not list after delete consistency.
+        # Because gsutil uses list to figure out if it should do the unix styly
+        # copy to or copy into, this means that if the directory is reported as
+        # still being there (after it has been deleted) gsutil will copy
+        # into the directory instead of to the directory.
+        def wait_for_delete_to_be_consistent_with_list(gs_path):
+            if DRY_RUN:
+                return
+            while exists(gs_path):
+                time.sleep(1)
 
-    # Copy sdk directory.
-    from_loc = raw_namer.sdk_directory(revision)
-    to_loc = release_namer.sdk_directory(to_revision)
-    remove_gs_directory(to_loc)
-    Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
+        def remove_gs_directory(gs_path):
+            safety_check_on_gs_path(gs_path, to_revision, channel)
+            # Only delete existing directories
+            if exists(gs_path):
+                Gsutil(['-m', 'rm', '-R', '-f', gs_path])
+                wait_for_delete_to_be_consistent_with_list(gs_path)
 
-    # 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])
+        # Copy sdk directory.
+        from_loc = raw_namer.sdk_directory(revision)
+        to_loc = release_namer.sdk_directory(to_revision)
+        remove_gs_directory(to_loc)
+        Gsutil(['-m', 'cp', '-a', 'public-read', '-R', from_loc, to_loc])
 
-    # Copy wheezy 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])
+        # 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])
 
-    # 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])
+        # Copy wheezy 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])
 
-  promote(revision)
-  promote('latest')
+        # 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])
+
+    promote(revision)
+    promote('latest')
+
 
 def Gsutil(cmd, throw_on_error=True):
-  gsutilTool = join(DART_PATH, 'third_party', 'gsutil', 'gsutil')
-  command = [sys.executable, gsutilTool] + cmd
-  if DRY_RUN:
-    print "DRY runnning: %s" % command
-    return
-  return bot_utils.run(command, throw_on_error=throw_on_error)
+    gsutilTool = join(DART_PATH, 'third_party', 'gsutil', 'gsutil')
+    command = [sys.executable, gsutilTool] + cmd
+    if DRY_RUN:
+        print "DRY runnning: %s" % command
+        return
+    return bot_utils.run(command, throw_on_error=throw_on_error)
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/publish_pkg.py b/tools/publish_pkg.py
index dbc5b4f..2ecf2ba 100755
--- a/tools/publish_pkg.py
+++ b/tools/publish_pkg.py
@@ -10,7 +10,6 @@
 #
 # "pub" must be in PATH.
 
-
 import os
 import os.path
 import shutil
@@ -18,57 +17,57 @@
 import subprocess
 import tempfile
 
+
 def Main(argv):
-  HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
+    HOME = os.path.dirname(os.path.dirname(os.path.realpath(__file__)))
 
-  pkgName = os.path.basename(os.path.normpath(argv[1]))
+    pkgName = os.path.basename(os.path.normpath(argv[1]))
 
-  pubspec = os.path.join(HOME, argv[1], 'pubspec.yaml')
-  if not os.path.exists(pubspec):
-    print 'Error: did not find pubspec.yaml at ' + pubspec
-    return -1
-
-  with open(pubspec) as pubspecFile:
-    lines = pubspecFile.readlines()
-
-  version = None
-  foundSdkConstraint = False
-  inDependencies = False
-  for line in lines:
-    if line.startswith('dependencies:'):
-      inDependencies = True
-    elif line.startswith('environment:'):
-      foundSdkConstraint = True
-    elif line[0].isalpha():
-      inDependencies = False
-    if line.startswith('version:'):
-      version = line[len('version:'):].strip()
-    if inDependencies:
-      if line.endswith(': any'):
-        print 'Error in %s: should not use "any" version constraint: %s' % (
-            pubspec, line)
+    pubspec = os.path.join(HOME, argv[1], 'pubspec.yaml')
+    if not os.path.exists(pubspec):
+        print 'Error: did not find pubspec.yaml at ' + pubspec
         return -1
 
-  if not version:
-    print 'Error in %s: did not find package version.' % pubspec
-    return -1
+    with open(pubspec) as pubspecFile:
+        lines = pubspecFile.readlines()
 
-  if not foundSdkConstraint:
-    print 'Error in %s: did not find SDK version constraint.' % pubspec
-    return -1
+    version = None
+    foundSdkConstraint = False
+    inDependencies = False
+    for line in lines:
+        if line.startswith('dependencies:'):
+            inDependencies = True
+        elif line.startswith('environment:'):
+            foundSdkConstraint = True
+        elif line[0].isalpha():
+            inDependencies = False
+        if line.startswith('version:'):
+            version = line[len('version:'):].strip()
+        if inDependencies:
+            if line.endswith(': any'):
+                print 'Error in %s: should not use "any" version constraint: %s' % (
+                    pubspec, line)
+                return -1
 
-  tmpDir = tempfile.mkdtemp()
+    if not version:
+        print 'Error in %s: did not find package version.' % pubspec
+        return -1
 
-  #
-  # If pubspec.yaml exists, check that the SDK's version constraint is valid
-  #
-  shutil.copytree(os.path.join(HOME, argv[1]),
-                  os.path.join(tmpDir, pkgName))
+    if not foundSdkConstraint:
+        print 'Error in %s: did not find SDK version constraint.' % pubspec
+        return -1
 
-  if not os.path.exists(os.path.join(tmpDir, pkgName, 'LICENSE')):
-    with open(os.path.join(tmpDir, pkgName, 'LICENSE'), 'w') as licenseFile:
-      licenseFile.write(
-'''Copyright 2014, the Dart project authors. All rights reserved.
+    tmpDir = tempfile.mkdtemp()
+
+    #
+    # If pubspec.yaml exists, check that the SDK's version constraint is valid
+    #
+    shutil.copytree(os.path.join(HOME, argv[1]), os.path.join(tmpDir, pkgName))
+
+    if not os.path.exists(os.path.join(tmpDir, pkgName, 'LICENSE')):
+        with open(os.path.join(tmpDir, pkgName, 'LICENSE'), 'w') as licenseFile:
+            licenseFile.write(
+                '''Copyright 2014, the Dart project authors. All rights reserved.
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are
 met:
@@ -96,18 +95,19 @@
 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ''')
 
-  print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n'
+    print 'publishing version ' + version + ' of ' + argv[1] + ' to pub.\n'
 
-  # TODO(jmesserly): this code puts things in the pub cache. Useful for testing
-  # without actually uploading.
-  #cacheDir = os.path.join(
-  #    os.path.expanduser('~/.pub-cache/hosted/pub.dartlang.org'),
-  #    pkgName + '-' + version)
-  #print 'Moving to ' + cacheDir
-  #shutil.move(os.path.join(tmpDir, pkgName), cacheDir)
+    # TODO(jmesserly): this code puts things in the pub cache. Useful for testing
+    # without actually uploading.
+    #cacheDir = os.path.join(
+    #    os.path.expanduser('~/.pub-cache/hosted/pub.dartlang.org'),
+    #    pkgName + '-' + version)
+    #print 'Moving to ' + cacheDir
+    #shutil.move(os.path.join(tmpDir, pkgName), cacheDir)
 
-  subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName))
-  shutil.rmtree(tmpDir)
+    subprocess.call(['pub', 'publish'], cwd=os.path.join(tmpDir, pkgName))
+    shutil.rmtree(tmpDir)
+
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/revert.py b/tools/revert.py
index a602e10..59d383d 100755
--- a/tools/revert.py
+++ b/tools/revert.py
@@ -9,184 +9,211 @@
 import platform
 import subprocess
 import sys
-
 """A script used to revert one or a sequence of consecutive CLs, for svn and
 git-svn users.
 """
 
+
 def parse_args():
-  parser = optparse.OptionParser()
-  parser.add_option('--revisions', '-r', dest='rev_range', action='store',
-                    default=None, help='The revision number(s) of the commits '
-                    'you wish to undo. An individual number, or a range (8-10, '
-                    '8..10, or 8:10).')
-  args, _ = parser.parse_args()
-  revision_range = args.rev_range
-  if revision_range is None:
-    maybe_fail('You must specify at least one revision number to revert.')
-  if revision_range.find('-') > -1 or revision_range.find(':') > -1 or \
-      revision_range.find('..') > -1:
-    # We have a range of commits to revert.
-    split = revision_range.split('-')
-    if len(split) == 1:
-      split = revision_range.split(':')
-    if len(split) == 1:
-      split = revision_range.split('..')
-    start = int(split[0])
-    end = int(split[1])
-    if start > end:
-      temp = start
-      start = end
-      end = temp
-    if start != end:
-      maybe_fail('Warning: Are you sure you want to revert a range of '
-                 'revisions? If you just want to revert one CL, only specify '
-                 'one revision number.', user_input=True)
-  else:
-    start = end = int(revision_range)
-  return start, end
+    parser = optparse.OptionParser()
+    parser.add_option(
+        '--revisions',
+        '-r',
+        dest='rev_range',
+        action='store',
+        default=None,
+        help='The revision number(s) of the commits '
+        'you wish to undo. An individual number, or a range (8-10, '
+        '8..10, or 8:10).')
+    args, _ = parser.parse_args()
+    revision_range = args.rev_range
+    if revision_range is None:
+        maybe_fail('You must specify at least one revision number to revert.')
+    if revision_range.find('-') > -1 or revision_range.find(':') > -1 or \
+        revision_range.find('..') > -1:
+        # We have a range of commits to revert.
+        split = revision_range.split('-')
+        if len(split) == 1:
+            split = revision_range.split(':')
+        if len(split) == 1:
+            split = revision_range.split('..')
+        start = int(split[0])
+        end = int(split[1])
+        if start > end:
+            temp = start
+            start = end
+            end = temp
+        if start != end:
+            maybe_fail(
+                'Warning: Are you sure you want to revert a range of '
+                'revisions? If you just want to revert one CL, only specify '
+                'one revision number.',
+                user_input=True)
+    else:
+        start = end = int(revision_range)
+    return start, end
+
 
 def maybe_fail(msg, user_input=False):
-  """Determine if we have encountered a condition upon which our script cannot
+    """Determine if we have encountered a condition upon which our script cannot
   continue, and abort if so.
   Args:
     - msg: The error or user prompt message to print.
     - user_input: True if we require user confirmation to continue. We assume
                   that the user must enter y to proceed.
   """
-  if user_input:
-    force = raw_input(msg + ' (y/N) ')
-    if force != 'y':
-      sys.exit(0)
-  else:
-    print msg
-    sys.exit(1)
+    if user_input:
+        force = raw_input(msg + ' (y/N) ')
+        if force != 'y':
+            sys.exit(0)
+    else:
+        print msg
+        sys.exit(1)
+
 
 def has_new_code(is_git):
-  """Tests if there are any newer versions of files on the server.
+    """Tests if there are any newer versions of files on the server.
   Args:
     - is_git: True if we are working in a git repository.
   """
-  os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
-  if not is_git:
-    results, _ = run_cmd(['svn', 'st'])
-  else:
-    results, _ = run_cmd(['git', 'status'])
-  for line in results.split('\n'):
-    if not is_git and (not line.strip().startswith('?') and line != ''):
-      return True
-    elif is_git and ('Changes to be committed' in line or 
-        'Changes not staged for commit:' in line):
-      return True
-  if is_git:
-    p = subprocess.Popen(['git', 'log', '-1'], stdout=subprocess.PIPE,
-                         shell=(platform.system()=='Windows'))
-    output, _ = p.communicate()
-    if find_git_info(output) is None:
-      return True
-  return False
+    os.chdir(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
+    if not is_git:
+        results, _ = run_cmd(['svn', 'st'])
+    else:
+        results, _ = run_cmd(['git', 'status'])
+    for line in results.split('\n'):
+        if not is_git and (not line.strip().startswith('?') and line != ''):
+            return True
+        elif is_git and ('Changes to be committed' in line or
+                         'Changes not staged for commit:' in line):
+            return True
+    if is_git:
+        p = subprocess.Popen(['git', 'log', '-1'],
+                             stdout=subprocess.PIPE,
+                             shell=(platform.system() == 'Windows'))
+        output, _ = p.communicate()
+        if find_git_info(output) is None:
+            return True
+    return False
+
 
 def run_cmd(cmd_list, suppress_output=False, std_in=''):
-  """Run the specified command and print out any output to stdout."""
-  print ' '.join(cmd_list)
-  p = subprocess.Popen(cmd_list, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                       stdin=subprocess.PIPE,
-                       shell=(platform.system()=='Windows'))
-  output, stderr = p.communicate(std_in)
-  if output and not suppress_output:
-    print output
-  if stderr and not suppress_output:
-    print stderr
-  return output, stderr
+    """Run the specified command and print out any output to stdout."""
+    print ' '.join(cmd_list)
+    p = subprocess.Popen(
+        cmd_list,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        stdin=subprocess.PIPE,
+        shell=(platform.system() == 'Windows'))
+    output, stderr = p.communicate(std_in)
+    if output and not suppress_output:
+        print output
+    if stderr and not suppress_output:
+        print stderr
+    return output, stderr
+
 
 def runs_git():
-  """Returns True if we're standing in an svn-git repository."""
-  p = subprocess.Popen(['svn', 'info'], stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE,
-                       shell=(platform.system()=='Windows'))
-  output, err = p.communicate()
-  if err is not None and 'is not a working copy' in err:
-    p = subprocess.Popen(['git', 'status'], stdout=subprocess.PIPE,
-                         shell=(platform.system()=='Windows'))
-    output, _ = p.communicate()
-    if 'fatal: Not a git repository' in output:
-      maybe_fail('Error: not running git or svn.')
-    else:
-      return True
-  return False
+    """Returns True if we're standing in an svn-git repository."""
+    p = subprocess.Popen(['svn', 'info'],
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.PIPE,
+                         shell=(platform.system() == 'Windows'))
+    output, err = p.communicate()
+    if err is not None and 'is not a working copy' in err:
+        p = subprocess.Popen(['git', 'status'],
+                             stdout=subprocess.PIPE,
+                             shell=(platform.system() == 'Windows'))
+        output, _ = p.communicate()
+        if 'fatal: Not a git repository' in output:
+            maybe_fail('Error: not running git or svn.')
+        else:
+            return True
+    return False
+
 
 def find_git_info(git_log, rev_num=None):
-  """Determine the latest svn revision number if rev_num = None, or find the 
+    """Determine the latest svn revision number if rev_num = None, or find the
   git commit_id that corresponds to a particular svn revision number.
   """
-  for line in git_log.split('\n'):
-    tokens = line.split()
-    if len(tokens) == 2 and tokens[0] == 'commit':
-      current_commit_id = tokens[1]
-    elif len(tokens) > 0 and tokens[0] == 'git-svn-id:':
-      revision_number = int(tokens[1].split('@')[1])
-      if revision_number == rev_num:
-        return current_commit_id
-      if rev_num is None:
-        return revision_number
+    for line in git_log.split('\n'):
+        tokens = line.split()
+        if len(tokens) == 2 and tokens[0] == 'commit':
+            current_commit_id = tokens[1]
+        elif len(tokens) > 0 and tokens[0] == 'git-svn-id:':
+            revision_number = int(tokens[1].split('@')[1])
+            if revision_number == rev_num:
+                return current_commit_id
+            if rev_num is None:
+                return revision_number
+
 
 def revert(start, end, is_git):
-  """Revert the sequence of CLs.
+    """Revert the sequence of CLs.
   Args:
     - start: The first CL to revert.
     - end: The last CL to revert.
     - is_git: True if we are in a git-svn checkout.
   """
-  if not is_git:
-    _, err = run_cmd(['svn', 'merge', '-r', '%d:%d' % (end, start-1), '.'],
-                     std_in='p')
-    if 'Conflict discovered' in err:
-      maybe_fail('Please fix the above conflicts before submitting. Then create'
-             ' a CL and submit your changes to complete the revert.')
+    if not is_git:
+        _, err = run_cmd(
+            ['svn', 'merge', '-r',
+             '%d:%d' % (end, start - 1), '.'], std_in='p')
+        if 'Conflict discovered' in err:
+            maybe_fail(
+                'Please fix the above conflicts before submitting. Then create'
+                ' a CL and submit your changes to complete the revert.')
 
-  else:
-    # If we're running git, we have to use the log feature to find the commit
-    # id(s) that correspond to the particular revision number(s).
-    output, _ = run_cmd(['git', 'log', '-1'], suppress_output=True)
-    current_revision = find_git_info(output)
-    distance = (current_revision-start) + 1
-    output, _ = run_cmd(['git', 'log', '-%d' % distance], suppress_output=True)
-    reverts = [start]
-    commit_msg = '"Reverting %d"' % start
-    if end != start:
-      reverts = range(start, end + 1)
-      reverts.reverse()
-      commit_msg = '%s-%d"' % (commit_msg[:-1], end)
-    for the_revert in reverts:
-      git_commit_id = find_git_info(output, the_revert)
-      if git_commit_id is None:
-        maybe_fail('Error: Revision number not found. Is this earlier than your'
-                   ' git checkout history?')
-      _, err = run_cmd(['git', 'revert', '-n', git_commit_id])
-      if 'error: could not revert' in err or 'unmerged' in err:
-        command_sequence = ''
-        for a_revert in reverts:
-          git_commit_id = find_git_info(output, a_revert)
-          command_sequence += 'git revert -n %s\n' % git_commit_id
-        maybe_fail('There are conflicts while reverting. Please resolve these '
-                   'after manually running:\n' + command_sequence + 'and then '
-                   'create a CL and submit to complete the revert.')
-    run_cmd(['git', 'commit', '-m', commit_msg])
+    else:
+        # If we're running git, we have to use the log feature to find the commit
+        # id(s) that correspond to the particular revision number(s).
+        output, _ = run_cmd(['git', 'log', '-1'], suppress_output=True)
+        current_revision = find_git_info(output)
+        distance = (current_revision - start) + 1
+        output, _ = run_cmd(['git', 'log', '-%d' % distance],
+                            suppress_output=True)
+        reverts = [start]
+        commit_msg = '"Reverting %d"' % start
+        if end != start:
+            reverts = range(start, end + 1)
+            reverts.reverse()
+            commit_msg = '%s-%d"' % (commit_msg[:-1], end)
+        for the_revert in reverts:
+            git_commit_id = find_git_info(output, the_revert)
+            if git_commit_id is None:
+                maybe_fail(
+                    'Error: Revision number not found. Is this earlier than your'
+                    ' git checkout history?')
+            _, err = run_cmd(['git', 'revert', '-n', git_commit_id])
+            if 'error: could not revert' in err or 'unmerged' in err:
+                command_sequence = ''
+                for a_revert in reverts:
+                    git_commit_id = find_git_info(output, a_revert)
+                    command_sequence += 'git revert -n %s\n' % git_commit_id
+                maybe_fail(
+                    'There are conflicts while reverting. Please resolve these '
+                    'after manually running:\n' + command_sequence + 'and then '
+                    'create a CL and submit to complete the revert.')
+        run_cmd(['git', 'commit', '-m', commit_msg])
+
 
 def main():
-  revisions = parse_args()
-  git_user = runs_git()
-  if has_new_code(git_user):
-    maybe_fail('WARNING: This checkout has local modifications!! This could '
-         'result in a CL that is not just a revert and/or you could lose your'
-         ' local changes! Are you **SURE** you want to continue? ',
-       user_input=True)
-  if git_user:
-    run_cmd(['git', 'cl', 'rebase'])
-  run_cmd(['gclient', 'sync'])
-  revert(revisions[0], revisions[1], git_user)
-  print ('Now, create a CL and submit! The buildbots and your teammates thank '
-         'you!')
+    revisions = parse_args()
+    git_user = runs_git()
+    if has_new_code(git_user):
+        maybe_fail(
+            'WARNING: This checkout has local modifications!! This could '
+            'result in a CL that is not just a revert and/or you could lose your'
+            ' local changes! Are you **SURE** you want to continue? ',
+            user_input=True)
+    if git_user:
+        run_cmd(['git', 'cl', 'rebase'])
+    run_cmd(['gclient', 'sync'])
+    revert(revisions[0], revisions[1], git_user)
+    print('Now, create a CL and submit! The buildbots and your teammates thank '
+          'you!')
+
 
 if __name__ == '__main__':
-  main()
+    main()
diff --git a/tools/run_abi_tests.py b/tools/run_abi_tests.py
index f8d3053..4f4f049 100644
--- a/tools/run_abi_tests.py
+++ b/tools/run_abi_tests.py
@@ -5,6 +5,7 @@
 # Runs tests with old ABI versions and check if the results differ from the
 # current results.
 
+import argparse
 import json
 import os
 import subprocess
@@ -12,171 +13,188 @@
 import time
 import utils
 
-
 scriptDir = os.path.dirname(os.path.realpath(__file__))
 outDir = os.path.join(scriptDir, '..', 'out', 'ReleaseX64')
 abiDir = os.path.join(outDir, 'dart-sdk', 'lib', '_internal', 'abiversions')
 
 
+# Parse command line args to flags.
+def parseArgs():
+    parser = argparse.ArgumentParser(
+        'Runs test.py on all supported ABI versions')
+    parser.add_argument(
+        '--output-directory',
+        default=os.path.join(outDir, 'logs'),
+        metavar='DIR',
+        dest='logDir',
+        help='Directory to output restuls.json and logs.json to.')
+    return parser.parse_args()
+
+
 # Info about a running test.
 class Test:
-  def __init__(self, cmd, resultFile, logFile, version):
-    self.cmd = cmd  # The test command.
-    self.resultFile = resultFile  # The expected location of the result file.
-    self.logFile = logFile  # The expected location of the log file.
-    self.version = version  # The ABI version, or None.
+
+    def __init__(self, cmd, resultFile, logFile, version):
+        self.cmd = cmd  # The test command.
+        self.resultFile = resultFile  # The expected location of the result file.
+        self.logFile = logFile  # The expected location of the log file.
+        self.version = version  # The ABI version, or None.
 
 
 # Recursively make directories for the path.
 def makeDirs(path):
-  try:
-    os.makedirs(path)
-  except OSError:
-    pass
+    try:
+        os.makedirs(path)
+    except OSError:
+        pass
 
 
 # Build a Test object for the given version (or None).
 def buildTest(version):
-  testDir = os.path.join(
-    outDir, 'test%s' % ('' if version is None else str(version)))
-  logDir = os.path.join(testDir, 'logs')
-  makeDirs(logDir)
+    testDir = os.path.join(outDir,
+                           'test%s' % ('' if version is None else str(version)))
+    logDir = os.path.join(testDir, 'logs')
+    makeDirs(logDir)
 
-  vm_options = ['--enable-interpreter']
-  if version is not None:
-    vm_options += ['--use-abi-version=%d' % version]
-  cmd = [
-      'python',
-      os.path.join(scriptDir, 'test.py'),
-      '--compiler=dartkb',
-      '--mode=release',
-      '--write-results',
-      '--write-logs',
-      '--output_directory=%s' % logDir,
-      '--vm-options=%s' % ' '.join(vm_options),
-      'lib_2',
-  ]
+    vm_options = ['--enable-interpreter']
+    if version is not None:
+        vm_options += ['--use-abi-version=%d' % version]
+    cmd = [
+        'python',
+        os.path.join(scriptDir, 'test.py'),
+        '--compiler=dartkb',
+        '--mode=release',
+        '--write-results',
+        '--write-logs',
+        '--output_directory=%s' % logDir,
+        '--vm-options=%s' % ' '.join(vm_options),
+        'lib_2',
+    ]
 
-  resultFile = os.path.join(logDir, 'results.json')
-  logFile = os.path.join(logDir, 'logs.json')
-  return Test(cmd, resultFile, logFile, version)
+    resultFile = os.path.join(logDir, 'results.json')
+    logFile = os.path.join(logDir, 'logs.json')
+    return Test(cmd, resultFile, logFile, version)
 
 
 # Returns whether the dill files exist for an ABI version.
 def abiVersionExists(version):
-  return os.path.isdir(os.path.join(abiDir, str(version)))
+    return os.path.isdir(os.path.join(abiDir, str(version)))
 
 
 # Build tests for every supported version, and return a list of Test objects.
 def buildAllTests():
-  abi_version = int(utils.GetAbiVersion())
-  oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
-  tests = [buildTest(None)]
-  for version in xrange(oldest_abi_version, abi_version + 1):
-    if abiVersionExists(version):
-      tests.append(buildTest(version))
-  return tests
+    abi_version = int(utils.GetAbiVersion())
+    oldest_abi_version = int(utils.GetOldestSupportedAbiVersion())
+    tests = [buildTest(None)]
+    for version in xrange(oldest_abi_version, abi_version + 1):
+        if abiVersionExists(version):
+            tests.append(buildTest(version))
+    return tests
 
 
 # Run all tests, one by one, and wait for them all to complete.
 def runAllTests(tests):
-  for test in tests:
-    print('\n\n\n=== Running tests %s ===' % (
-        ('for ABI version %d' % test.version) if test.version is not None else
-        ('without an ABI version')))
-    print(subprocess.list2cmdline(test.cmd) + '\n\n')
-    proc = subprocess.Popen(test.cmd)
-    while proc.returncode is None:
-      time.sleep(1)
-      proc.communicate()
-      proc.poll()
+    for test in tests:
+        print('\n\n\n=== Running tests %s ===' % (
+            ('for ABI version %d' % test.version)
+            if test.version is not None else ('without an ABI version')))
+        print(subprocess.list2cmdline(test.cmd) + '\n\n')
+        proc = subprocess.Popen(test.cmd)
+        while proc.returncode is None:
+            time.sleep(1)
+            proc.communicate()
+            proc.poll()
 
 
 # Read a test result file or log file and convert JSON lines to a dictionary of
 # JSON records indexed by name. Assumes result and log files both use name key.
 def readTestFile(fileName):
-  with open(fileName, 'r') as f:
-    return { r['name']: r for r in [json.loads(line) for line in f]}
+    with open(fileName, 'r') as f:
+        return {r['name']: r for r in [json.loads(line) for line in f]}
 
 
 # Read the test result or log files for every version and return a dict like:
 # {name: {version: resultJson, ...}, ...}
 def readAllTestFiles(tests, nameGetter):
-  allRecords = {}
-  for test in tests:
-    records = readTestFile(nameGetter(test))
-    for name, result in records.items():
-      if name not in allRecords:
-        allRecords[name] = {}
-      allRecords[name][test.version] = result
-  return allRecords
+    allRecords = {}
+    for test in tests:
+        records = readTestFile(nameGetter(test))
+        for name, result in records.items():
+            if name not in allRecords:
+                allRecords[name] = {}
+            allRecords[name][test.version] = result
+    return allRecords
 
 
 # Pick any element of the dictionary, favoring the None key if it exists.
 def pickOne(d):
-  if None in d:
-    return d[None]
-  for v in d.values():
-    return v
-  return None
+    if None in d:
+        return d[None]
+    for v in d.values():
+        return v
+    return None
 
 
 # Diff the results of a test for each version and construct a new test result
 # that reports whether the test results match for each version.
 def diffResults(results):
-  outResult = pickOne(results)
-  exp = results[None]['result'] if None in results else None
-  outResult['expected'] = exp
-  outResult['result'] = exp
-  outResult['matches'] = True
-  diffs = []
-  for version, result in results.items():
-    if version is not None:
-      act = result['result']
-      if exp != act:
-        diffs.append(version)
-        outResult['result'] = act  # May be overwritten by other versions.
-        outResult['matches'] = False
-  return outResult, diffs
+    outResult = pickOne(results)
+    exp = results[None]['result'] if None in results else None
+    outResult['configuration'] = 'vm-dartkb-linux-release-x64-abi'
+    outResult['expected'] = exp
+    outResult['result'] = exp
+    outResult['matches'] = True
+    diffs = []
+    for version, result in results.items():
+        if version is not None:
+            act = result['result']
+            if exp != act:
+                diffs.append(version)
+                outResult[
+                    'result'] = act  # May be overwritten by other versions.
+                outResult['matches'] = False
+    return outResult, diffs
 
 
 # Create a log entry for a test that has diffs. Concatenate all the log records
 # and include which tests failed.
 def makeLog(diffs, results, logRecords):
-  result = pickOne(results)
-  logs = ["%s: %s" % (str(v), l['log']) for v, l in logRecords.items()]
-  return {
-    'name': result['name'],
-    'configuration': result['configuration'],
-    'result': result['result'],
-    'log': '\n\n\n'.join([repr(diffs)] + logs),
-  }
+    result = pickOne(results)
+    logs = ["%s: %s" % (str(v), l['log']) for v, l in logRecords.items()]
+    return {
+        'name': result['name'],
+        'configuration': 'vm-dartkb-linux-release-x64-abi',
+        'result': result['result'],
+        'log': '\n\n\n'.join([repr(diffs)] + logs),
+    }
 
 
 # Diff the results of all the tests and create the merged result and log files.
-def diffAllResults(tests):
-  allResults = readAllTestFiles(tests, lambda test: test.resultFile)
-  allLogs = readAllTestFiles(tests, lambda test: test.logFile)
-  logDir = os.path.join(outDir, 'logs')
-  makeDirs(logDir)
-  resultFileName = os.path.join(logDir, 'results.json')
-  logFileName = os.path.join(logDir, 'logs.json')
-  with open(resultFileName, 'w') as resultFile:
-    with open(logFileName, 'w') as logFile:
-      for name, results in allResults.items():
-        outResult, diffs = diffResults(results)
-        resultFile.write(json.dumps(outResult) + '\n')
-        if diffs:
-          logRecords = allLogs[name] if name in allLogs else []
-          logFile.write(json.dumps(makeLog(diffs, results, logRecords)) + '\n')
+def diffAllResults(tests, flags):
+    allResults = readAllTestFiles(tests, lambda test: test.resultFile)
+    allLogs = readAllTestFiles(tests, lambda test: test.logFile)
+    makeDirs(flags.logDir)
+    resultFileName = os.path.join(flags.logDir, 'results.json')
+    logFileName = os.path.join(flags.logDir, 'logs.json')
+    with open(resultFileName, 'w') as resultFile:
+        with open(logFileName, 'w') as logFile:
+            for name, results in allResults.items():
+                outResult, diffs = diffResults(results)
+                resultFile.write(json.dumps(outResult) + '\n')
+                if diffs:
+                    logRecords = allLogs[name] if name in allLogs else []
+                    logFile.write(
+                        json.dumps(makeLog(diffs, results, logRecords)) + '\n')
+    print('Log files emitted to %s and %s' % (resultFileName, logFileName))
 
 
 def main():
-  tests = buildAllTests()
-  runAllTests(tests)
-  diffAllResults(tests)
-  return 0
+    flags = parseArgs()
+    tests = buildAllTests()
+    runAllTests(tests)
+    diffAllResults(tests, flags)
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
diff --git a/tools/safari_factory_reset.py b/tools/safari_factory_reset.py
index 9276fa5..daf7e41 100755
--- a/tools/safari_factory_reset.py
+++ b/tools/safari_factory_reset.py
@@ -12,16 +12,16 @@
 
 
 def Main():
-  args = sys.argv[1:]
-  tools_dir = os.path.dirname(os.path.realpath(__file__))
-  dart_script_name = os.path.join(
-    tools_dir, 'testing', 'dart', 'reset_safari.dart');
-  command = [utils.CheckedInSdkExecutable(),
-             '--checked', dart_script_name] + args
-  exit_code = subprocess.call(command)
-  utils.DiagnoseExitCode(exit_code, command)
-  return exit_code
+    args = sys.argv[1:]
+    tools_dir = os.path.dirname(os.path.realpath(__file__))
+    dart_script_name = os.path.join(tools_dir, 'testing', 'dart',
+                                    'reset_safari.dart')
+    command = [utils.CheckedInSdkExecutable(), '--checked', dart_script_name
+              ] + args
+    exit_code = subprocess.call(command)
+    utils.DiagnoseExitCode(exit_code, command)
+    return exit_code
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/spec_parse.py b/tools/spec_parse.py
index ba87ff8..90a97e8 100755
--- a/tools/spec_parse.py
+++ b/tools/spec_parse.py
@@ -22,29 +22,30 @@
 
 
 def Help(missing):
-  print('Execution of the spec parser failed. Missing: ' + missing)
-  print('Please read the comment near the top of spec_parse.py.\n')
-  sys.exit(1)
+    print('Execution of the spec parser failed. Missing: ' + missing)
+    print('Please read the comment near the top of spec_parse.py.\n')
+    sys.exit(1)
 
 
 def Main():
-  args = sys.argv[1:]
-  tools_dir = os.path.dirname(os.path.realpath(__file__))
-  spec_parser_dir = os.path.join(tools_dir, 'spec_parser')
-  spec_parser_file = os.path.join(spec_parser_dir, 'SpecParser.class')
-  antlr_jar = '/usr/share/java/antlr4-runtime.jar'
-  class_path = string.join([spec_parser_dir, antlr_jar], ':')
-  command = ['java', '-cp', class_path, 'SpecParser'] + args
+    args = sys.argv[1:]
+    tools_dir = os.path.dirname(os.path.realpath(__file__))
+    spec_parser_dir = os.path.join(tools_dir, 'spec_parser')
+    spec_parser_file = os.path.join(spec_parser_dir, 'SpecParser.class')
+    antlr_jar = '/usr/share/java/antlr4-runtime.jar'
+    class_path = string.join([spec_parser_dir, antlr_jar], ':')
+    command = ['java', '-cp', class_path, 'SpecParser'] + args
 
-  if not os.path.exists(antlr_jar): Help(antlr_jar)
-  if not os.path.exists(spec_parser_file): Help('"make parser" in spec_parser')
+    if not os.path.exists(antlr_jar): Help(antlr_jar)
+    if not os.path.exists(spec_parser_file):
+        Help('"make parser" in spec_parser')
 
-  with utils.CoreDumpArchiver(args):
-    exit_code = subprocess.call(command)
+    with utils.CoreDumpArchiver(args):
+        exit_code = subprocess.call(command)
 
-  utils.DiagnoseExitCode(exit_code, command)
-  return exit_code
+    utils.DiagnoseExitCode(exit_code, command)
+    return exit_code
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/task_kill.py b/tools/task_kill.py
index 8c046b7..3c36acc 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -17,239 +17,259 @@
 
 import utils
 
-
 os_name = utils.GuessOS()
 
 POSIX_INFO = 'ps -p %s -o args'
 
 EXECUTABLE_NAMES = {
-  'win32': {
-    'chrome': 'chrome.exe',
-    'dart': 'dart.exe',
-    'dart_precompiled_runtime': 'dart_precompiled_runtime.exe',
-    'firefox': 'firefox.exe',
-    'gen_snapshot': 'gen_snapshot.exe',
-    'git': 'git.exe',
-    'iexplore': 'iexplore.exe',
-    'vctip': 'vctip.exe',
-    'mspdbsrv': 'mspdbsrv.exe',
-  },
-  'linux': {
-    'chrome': 'chrome',
-    'dart': 'dart',
-    'dart_precompiled_runtime': 'dart_precompiled_runtime',
-    'firefox': 'firefox',
-    'gen_snapshot': 'gen_snapshot',
-    'flutter_tester': 'flutter_tester',
-    'git': 'git',
-  },
-  'macos': {
-    'chrome': 'Chrome',
-    'chrome_helper': 'Chrome Helper',
-    'dart': 'dart',
-    'dart_precompiled_runtime': 'dart_precompiled_runtime',
-    'firefox': 'firefox',
-    'gen_snapshot': 'gen_snapshot',
-    'git': 'git',
-    'safari': 'Safari',
-  }
+    'win32': {
+        'chrome': 'chrome.exe',
+        'dart': 'dart.exe',
+        'dart_precompiled_runtime': 'dart_precompiled_runtime.exe',
+        'firefox': 'firefox.exe',
+        'gen_snapshot': 'gen_snapshot.exe',
+        'git': 'git.exe',
+        'iexplore': 'iexplore.exe',
+        'vctip': 'vctip.exe',
+        'mspdbsrv': 'mspdbsrv.exe',
+    },
+    'linux': {
+        'chrome': 'chrome',
+        'dart': 'dart',
+        'dart_precompiled_runtime': 'dart_precompiled_runtime',
+        'firefox': 'firefox',
+        'gen_snapshot': 'gen_snapshot',
+        'flutter_tester': 'flutter_tester',
+        'git': 'git',
+    },
+    'macos': {
+        'chrome': 'Chrome',
+        'chrome_helper': 'Chrome Helper',
+        'dart': 'dart',
+        'dart_precompiled_runtime': 'dart_precompiled_runtime',
+        'firefox': 'firefox',
+        'gen_snapshot': 'gen_snapshot',
+        'git': 'git',
+        'safari': 'Safari',
+    }
 }
 
 INFO_COMMAND = {
-  'win32': 'wmic process where Processid=%s get CommandLine',
-  'macos': POSIX_INFO,
-  'linux': POSIX_INFO,
+    'win32': 'wmic process where Processid=%s get CommandLine',
+    'macos': POSIX_INFO,
+    'linux': POSIX_INFO,
 }
 
 STACK_INFO_COMMAND = {
-  'win32': None,
-  'macos': '/usr/bin/sample %s 1 4000 -mayDie',
-  'linux': '/usr/bin/eu-stack -p %s',
+    'win32': None,
+    'macos': '/usr/bin/sample %s 1 4000 -mayDie',
+    'linux': '/usr/bin/eu-stack -p %s',
 }
 
+
 def GetOptions():
-  parser = optparse.OptionParser('usage: %prog [options]')
-  true_or_false = ['True', 'False']
-  parser.add_option("--kill_dart", default='True', type='choice',
-                    choices=true_or_false,
-                    help="Kill all dart processes")
-  parser.add_option("--kill_vc", default='True', type='choice',
-                    choices=true_or_false,
-                    help="Kill all git processes")
-  parser.add_option("--kill_vsbuild", default='False', type='choice',
-                    choices=true_or_false,
-                    help="Kill all visual studio build related processes")
-  parser.add_option("--kill_browsers", default='False', type='choice',
-                    choices=true_or_false,
-                    help="Kill all browser processes")
-  (options, args) = parser.parse_args()
-  return options
+    parser = optparse.OptionParser('usage: %prog [options]')
+    true_or_false = ['True', 'False']
+    parser.add_option(
+        "--kill_dart",
+        default='True',
+        type='choice',
+        choices=true_or_false,
+        help="Kill all dart processes")
+    parser.add_option(
+        "--kill_vc",
+        default='True',
+        type='choice',
+        choices=true_or_false,
+        help="Kill all git processes")
+    parser.add_option(
+        "--kill_vsbuild",
+        default='False',
+        type='choice',
+        choices=true_or_false,
+        help="Kill all visual studio build related processes")
+    parser.add_option(
+        "--kill_browsers",
+        default='False',
+        type='choice',
+        choices=true_or_false,
+        help="Kill all browser processes")
+    (options, args) = parser.parse_args()
+    return options
 
 
 def GetPidsPosix(process_name):
-  # This is to have only one posix command, on linux we could just do:
-  # pidof process_name
-  cmd = 'ps -e -o pid= -o comm='
-  # Sample output:
-  # 1 /sbin/launchd
-  # 80943 /Applications/Safari.app/Contents/MacOS/Safari
-  p = subprocess.Popen(cmd,
-                       stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE,
-                       shell=True)
-  output, stderr = p.communicate()
-  results = []
-  lines = output.splitlines()
-  for line in lines:
-    split = line.split()
-    # On mac this ps commands actually gives us the full path to non
-    # system binaries.
-    if len(split) >= 2 and " ".join(split[1:]).endswith(process_name):
-      results.append(split[0])
-  return results
+    # This is to have only one posix command, on linux we could just do:
+    # pidof process_name
+    cmd = 'ps -e -o pid= -o comm='
+    # Sample output:
+    # 1 /sbin/launchd
+    # 80943 /Applications/Safari.app/Contents/MacOS/Safari
+    p = subprocess.Popen(
+        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+    output, stderr = p.communicate()
+    results = []
+    lines = output.splitlines()
+    for line in lines:
+        split = line.split()
+        # On mac this ps commands actually gives us the full path to non
+        # system binaries.
+        if len(split) >= 2 and " ".join(split[1:]).endswith(process_name):
+            results.append(split[0])
+    return results
 
 
 def GetPidsWindows(process_name):
-  cmd = 'tasklist /FI "IMAGENAME eq %s" /NH' % process_name
-  # Sample output:
-  # dart.exe    4356 Console            1      6,800 K
-  p = subprocess.Popen(cmd,
-                       stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE,
-                       shell=True)
-  output, stderr = p.communicate()
-  results = []
-  lines = output.splitlines()
+    cmd = 'tasklist /FI "IMAGENAME eq %s" /NH' % process_name
+    # Sample output:
+    # dart.exe    4356 Console            1      6,800 K
+    p = subprocess.Popen(
+        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+    output, stderr = p.communicate()
+    results = []
+    lines = output.splitlines()
 
-  for line in lines:
-    split = line.split()
-    if len(split) > 2 and split[0] == process_name:
-      results.append(split[1])
-  return results
+    for line in lines:
+        split = line.split()
+        if len(split) > 2 and split[0] == process_name:
+            results.append(split[1])
+    return results
+
 
 def GetPids(process_name):
-  if os_name == "win32":
-    return GetPidsWindows(process_name)
-  else:
-    return GetPidsPosix(process_name)
+    if os_name == "win32":
+        return GetPidsWindows(process_name)
+    else:
+        return GetPidsPosix(process_name)
+
 
 def PrintPidStackInfo(pid):
-  command_pattern = STACK_INFO_COMMAND.get(os_name, False)
-  if command_pattern:
-    p = subprocess.Popen(command_pattern % pid,
-                         stdout=subprocess.PIPE,
-                         stderr=subprocess.PIPE,
-                         shell=True)
-    stdout, stderr = p.communicate()
-    stdout = stdout.splitlines()
-    stderr = stderr.splitlines()
+    command_pattern = STACK_INFO_COMMAND.get(os_name, False)
+    if command_pattern:
+        p = subprocess.Popen(
+            command_pattern % pid,
+            stdout=subprocess.PIPE,
+            stderr=subprocess.PIPE,
+            shell=True)
+        stdout, stderr = p.communicate()
+        stdout = stdout.splitlines()
+        stderr = stderr.splitlines()
 
-    print "  Stack:"
-    for line in stdout:
-      print "    %s" % line
-    if stderr:
-      print "  Stack (stderr):"
-      for line in stderr:
-        print "    %s" % line
+        print "  Stack:"
+        for line in stdout:
+            print "    %s" % line
+        if stderr:
+            print "  Stack (stderr):"
+            for line in stderr:
+                print "    %s" % line
+
 
 def PrintPidInfo(pid, dump_stacks):
-  # We assume that the list command will return lines in the format:
-  # EXECUTABLE_PATH ARGS
-  # There may be blank strings in the output
-  p = subprocess.Popen(INFO_COMMAND[os_name] % pid,
-                       stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE,
-                       shell=True)
-  output, stderr = p.communicate()
-  lines = output.splitlines()
+    # We assume that the list command will return lines in the format:
+    # EXECUTABLE_PATH ARGS
+    # There may be blank strings in the output
+    p = subprocess.Popen(
+        INFO_COMMAND[os_name] % pid,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.PIPE,
+        shell=True)
+    output, stderr = p.communicate()
+    lines = output.splitlines()
 
-  # Pop the header
-  lines.pop(0)
+    # Pop the header
+    lines.pop(0)
 
-  print "Hanging process info:"
-  print "  PID: %s" % pid
-  for line in lines:
-    # wmic will output a bunch of empty strings, we ignore these
-    if line: print "  Command line: %s" % line
+    print "Hanging process info:"
+    print "  PID: %s" % pid
+    for line in lines:
+        # wmic will output a bunch of empty strings, we ignore these
+        if line: print "  Command line: %s" % line
 
-  if dump_stacks:
-    PrintPidStackInfo(pid)
+    if dump_stacks:
+        PrintPidStackInfo(pid)
+
 
 def KillPosix(pid):
-  try:
-    os.kill(int(pid), signal.SIGKILL)
-  except:
-    # Ignore this, the process is already dead from killing another process.
-    pass
+    try:
+        os.kill(int(pid), signal.SIGKILL)
+    except:
+        # Ignore this, the process is already dead from killing another process.
+        pass
+
 
 def KillWindows(pid):
-  # os.kill is not available until python 2.7
-  cmd = "taskkill /F /PID %s" % pid
-  p = subprocess.Popen(cmd,
-                       stdout=subprocess.PIPE,
-                       stderr=subprocess.PIPE,
-                       shell=True)
-  p.communicate()
+    # os.kill is not available until python 2.7
+    cmd = "taskkill /F /PID %s" % pid
+    p = subprocess.Popen(
+        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
+    p.communicate()
+
 
 def Kill(name, dump_stacks=False):
-  if name not in EXECUTABLE_NAMES[os_name]:
-    return 0
-  print("***************** Killing %s *****************" % name)
-  platform_name = EXECUTABLE_NAMES[os_name][name]
-  pids = GetPids(platform_name)
-  for pid in pids:
-    PrintPidInfo(pid, dump_stacks)
-    if os_name == "win32":
-      KillWindows(pid)
-    else:
-      KillPosix(pid)
-    print("Killed pid: %s" % pid)
-  if len(pids) == 0:
-    print("  No %s processes found." % name)
-  return len(pids)
+    if name not in EXECUTABLE_NAMES[os_name]:
+        return 0
+    print("***************** Killing %s *****************" % name)
+    platform_name = EXECUTABLE_NAMES[os_name][name]
+    pids = GetPids(platform_name)
+    for pid in pids:
+        PrintPidInfo(pid, dump_stacks)
+        if os_name == "win32":
+            KillWindows(pid)
+        else:
+            KillPosix(pid)
+        print("Killed pid: %s" % pid)
+    if len(pids) == 0:
+        print("  No %s processes found." % name)
+    return len(pids)
+
 
 def KillBrowsers():
-  status = Kill('firefox')
-  # We don't give error on killing chrome. It happens quite often that the
-  # browser controller fails in killing chrome, so we silently do it here.
-  Kill('chrome')
-  status += Kill('chrome_helper')
-  status += Kill('iexplore')
-  status += Kill('safari')
-  return status
+    status = Kill('firefox')
+    # We don't give error on killing chrome. It happens quite often that the
+    # browser controller fails in killing chrome, so we silently do it here.
+    Kill('chrome')
+    status += Kill('chrome_helper')
+    status += Kill('iexplore')
+    status += Kill('safari')
+    return status
+
 
 def KillVCSystems():
-  status = Kill('git')
-  return status
+    status = Kill('git')
+    return status
+
 
 def KillVSBuild():
-  status = Kill('vctip')
-  status += Kill('mspdbsrv')
-  return status
+    status = Kill('vctip')
+    status += Kill('mspdbsrv')
+    return status
+
 
 def KillDart():
-  status = Kill("dart", dump_stacks=True)
-  status += Kill("gen_snapshot", dump_stacks=True)
-  status += Kill("dart_precompiled_runtime", dump_stacks=True)
-  status += Kill("flutter_tester", dump_stacks=True)
-  return status
+    status = Kill("dart", dump_stacks=True)
+    status += Kill("gen_snapshot", dump_stacks=True)
+    status += Kill("dart_precompiled_runtime", dump_stacks=True)
+    status += Kill("flutter_tester", dump_stacks=True)
+    return status
+
 
 def Main():
-  options = GetOptions()
-  status = 0
-  if options.kill_dart == 'True':
-    if os_name == "win32":
-      # TODO(24086): Add result of KillDart into status once pub hang is fixed.
-      KillDart()
-    else:
-      status += KillDart()
-  if options.kill_vc == 'True':
-    status += KillVCSystems()
-  if options.kill_vsbuild == 'True' and os_name == 'win32':
-    status += KillVSBuild()
-  if options.kill_browsers == 'True':
-    status += KillBrowsers()
-  return status
+    options = GetOptions()
+    status = 0
+    if options.kill_dart == 'True':
+        if os_name == "win32":
+            # TODO(24086): Add result of KillDart into status once pub hang is fixed.
+            KillDart()
+        else:
+            status += KillDart()
+    if options.kill_vc == 'True':
+        status += KillVCSystems()
+    if options.kill_vsbuild == 'True' and os_name == 'win32':
+        status += KillVSBuild()
+    if options.kill_browsers == 'True':
+        status += KillBrowsers()
+    return status
+
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/test.py b/tools/test.py
index 18f40e3..a60a095 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -12,30 +12,30 @@
 
 
 def Main():
-  args = sys.argv[1:]
+    args = sys.argv[1:]
 
-  tools_dir = os.path.dirname(os.path.realpath(__file__))
-  repo_dir = os.path.dirname(tools_dir)
-  dart_test_script = os.path.join(
-      repo_dir, 'pkg', 'test_runner', 'bin', 'test_runner.dart')
-  command = [utils.CheckedInSdkExecutable(), dart_test_script] + args
+    tools_dir = os.path.dirname(os.path.realpath(__file__))
+    repo_dir = os.path.dirname(tools_dir)
+    dart_test_script = os.path.join(repo_dir, 'pkg', 'test_runner', 'bin',
+                                    'test_runner.dart')
+    command = [utils.CheckedInSdkExecutable(), dart_test_script] + args
 
-  # The testing script potentially needs the android platform tools in PATH so
-  # we do that in ./tools/test.py (a similar logic exists in ./tools/build.py).
-  android_platform_tools = os.path.normpath(os.path.join(
-      tools_dir,
-      '../third_party/android_tools/sdk/platform-tools'))
-  if os.path.isdir(android_platform_tools):
-    os.environ['PATH'] = '%s%s%s' % (
-            os.environ['PATH'], os.pathsep, android_platform_tools)
+    # The testing script potentially needs the android platform tools in PATH so
+    # we do that in ./tools/test.py (a similar logic exists in ./tools/build.py).
+    android_platform_tools = os.path.normpath(
+        os.path.join(tools_dir,
+                     '../third_party/android_tools/sdk/platform-tools'))
+    if os.path.isdir(android_platform_tools):
+        os.environ['PATH'] = '%s%s%s' % (os.environ['PATH'], os.pathsep,
+                                         android_platform_tools)
 
-  with utils.FileDescriptorLimitIncreaser():
-    with utils.CoreDumpArchiver(args):
-      exit_code = subprocess.call(command)
+    with utils.FileDescriptorLimitIncreaser():
+        with utils.CoreDumpArchiver(args):
+            exit_code = subprocess.call(command)
 
-  utils.DiagnoseExitCode(exit_code, command)
-  return exit_code
+    utils.DiagnoseExitCode(exit_code, command)
+    return exit_code
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/tools/utils.py b/tools/utils.py
index 25bd8e7..2eb4289 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -21,256 +21,264 @@
 import uuid
 
 try:
-  # Not available on Windows.
-  import resource
+    # Not available on Windows.
+    import resource
 except:
-  pass
+    pass
 
-DART_DIR = os.path.abspath(
-    os.path.normpath(os.path.join(__file__, '..', '..')))
+DART_DIR = os.path.abspath(os.path.normpath(os.path.join(__file__, '..', '..')))
 
 
 def GetBotUtils():
-  '''Dynamically load the tools/bots/bot_utils.py python module.'''
-  return imp.load_source('bot_utils', os.path.join(DART_DIR, 'tools', 'bots', 'bot_utils.py'))
+    '''Dynamically load the tools/bots/bot_utils.py python module.'''
+    return imp.load_source(
+        'bot_utils', os.path.join(DART_DIR, 'tools', 'bots', 'bot_utils.py'))
 
 
 def GetMinidumpUtils():
-  '''Dynamically load the tools/minidump.py python module.'''
-  return imp.load_source('minidump', os.path.join(DART_DIR, 'tools', 'minidump.py'))
+    '''Dynamically load the tools/minidump.py python module.'''
+    return imp.load_source('minidump',
+                           os.path.join(DART_DIR, 'tools', 'minidump.py'))
 
 
 class Version(object):
-  def __init__(self, channel, major, minor, patch, prerelease,
-               prerelease_patch, abi_version, oldest_supported_abi_version):
-    self.channel = channel
-    self.major = major
-    self.minor = minor
-    self.patch = patch
-    self.prerelease = prerelease
-    self.prerelease_patch = prerelease_patch
-    self.abi_version = abi_version
-    self.oldest_supported_abi_version = oldest_supported_abi_version
+
+    def __init__(self, channel, major, minor, patch, prerelease,
+                 prerelease_patch, abi_version, oldest_supported_abi_version):
+        self.channel = channel
+        self.major = major
+        self.minor = minor
+        self.patch = patch
+        self.prerelease = prerelease
+        self.prerelease_patch = prerelease_patch
+        self.abi_version = abi_version
+        self.oldest_supported_abi_version = oldest_supported_abi_version
 
 
 # Try to guess the host operating system.
 def GuessOS():
-  os_id = platform.system()
-  if os_id == "Linux":
-    return "linux"
-  elif os_id == "Darwin":
-    return "macos"
-  elif os_id == "Windows" or os_id == "Microsoft":
-    # On Windows Vista platform.system() can return "Microsoft" with some
-    # versions of Python, see http://bugs.python.org/issue1082 for details.
-    return "win32"
-  elif os_id == 'FreeBSD':
-    return 'freebsd'
-  elif os_id == 'OpenBSD':
-    return 'openbsd'
-  elif os_id == 'SunOS':
-    return 'solaris'
-  else:
-    return None
+    os_id = platform.system()
+    if os_id == "Linux":
+        return "linux"
+    elif os_id == "Darwin":
+        return "macos"
+    elif os_id == "Windows" or os_id == "Microsoft":
+        # On Windows Vista platform.system() can return "Microsoft" with some
+        # versions of Python, see http://bugs.python.org/issue1082 for details.
+        return "win32"
+    elif os_id == 'FreeBSD':
+        return 'freebsd'
+    elif os_id == 'OpenBSD':
+        return 'openbsd'
+    elif os_id == 'SunOS':
+        return 'solaris'
+    else:
+        return None
 
 
 # Try to guess the host architecture.
 def GuessArchitecture():
-  os_id = platform.machine()
-  if os_id.startswith('armv5te'):
-    return 'armv5te'
-  elif os_id.startswith('armv6'):
-    return 'armv6'
-  elif os_id.startswith('arm'):
-    return 'arm'
-  elif os_id.startswith('aarch64'):
-    return 'arm64'
-  elif '64' in os_id:
-    return 'x64'
-  elif (not os_id) or (not re.match('(x|i[3-6])86', os_id) is None):
-    return 'ia32'
-  elif os_id == 'i86pc':
-    return 'ia32'
-  else:
-    guess_os = GuessOS()
-    print ("Warning: Guessing architecture %s based on os %s\n"\
-          % (os_id, guess_os))
-    if guess_os == 'win32':
-      return 'ia32'
-    return None
+    os_id = platform.machine()
+    if os_id.startswith('armv5te'):
+        return 'armv5te'
+    elif os_id.startswith('armv6'):
+        return 'armv6'
+    elif os_id.startswith('arm'):
+        return 'arm'
+    elif os_id.startswith('aarch64'):
+        return 'arm64'
+    elif '64' in os_id:
+        return 'x64'
+    elif (not os_id) or (not re.match('(x|i[3-6])86', os_id) is None):
+        return 'ia32'
+    elif os_id == 'i86pc':
+        return 'ia32'
+    else:
+        guess_os = GuessOS()
+        print ("Warning: Guessing architecture %s based on os %s\n"\
+              % (os_id, guess_os))
+        if guess_os == 'win32':
+            return 'ia32'
+        return None
 
 
 # Try to guess the number of cpus on this machine.
 def GuessCpus():
-  if os.getenv("DART_NUMBER_OF_CORES") is not None:
-    return int(os.getenv("DART_NUMBER_OF_CORES"))
-  if os.path.exists("/proc/cpuinfo"):
-    return int(subprocess.check_output("grep -E '^processor' /proc/cpuinfo | wc -l", shell=True))
-  if os.path.exists("/usr/bin/hostinfo"):
-    return int(subprocess.check_output('/usr/bin/hostinfo |'
-        ' grep "processors are logically available." |'
-        ' awk "{ print \$1 }"', shell=True))
-  win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
-  if win_cpu_count:
-    return int(win_cpu_count)
-  return 2
+    if os.getenv("DART_NUMBER_OF_CORES") is not None:
+        return int(os.getenv("DART_NUMBER_OF_CORES"))
+    if os.path.exists("/proc/cpuinfo"):
+        return int(
+            subprocess.check_output(
+                "grep -E '^processor' /proc/cpuinfo | wc -l", shell=True))
+    if os.path.exists("/usr/bin/hostinfo"):
+        return int(
+            subprocess.check_output(
+                '/usr/bin/hostinfo |'
+                ' grep "processors are logically available." |'
+                ' awk "{ print \$1 }"',
+                shell=True))
+    win_cpu_count = os.getenv("NUMBER_OF_PROCESSORS")
+    if win_cpu_count:
+        return int(win_cpu_count)
+    return 2
 
 
 def GetWindowsRegistryKeyName(name):
-  import win32process
-  # Check if python process is 64-bit or if it's 32-bit running in 64-bit OS.
-  # We need to know whether host is 64-bit so that we are looking in right
-  # registry for Visual Studio path.
-  if sys.maxsize > 2**32 or win32process.IsWow64Process():
-    wow6432Node = 'Wow6432Node\\'
-  else:
-    wow6432Node = ''
-  return r'SOFTWARE\%s%s' % (wow6432Node, name)
+    import win32process
+    # Check if python process is 64-bit or if it's 32-bit running in 64-bit OS.
+    # We need to know whether host is 64-bit so that we are looking in right
+    # registry for Visual Studio path.
+    if sys.maxsize > 2**32 or win32process.IsWow64Process():
+        wow6432Node = 'Wow6432Node\\'
+    else:
+        wow6432Node = ''
+    return r'SOFTWARE\%s%s' % (wow6432Node, name)
 
 
 # Try to guess Visual Studio location when buiding on Windows.
 def GuessVisualStudioPath():
-  defaultPath = r"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7" \
-                r"\IDE"
-  defaultExecutable = "devenv.com"
+    defaultPath = r"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7" \
+                  r"\IDE"
+    defaultExecutable = "devenv.com"
 
-  if not IsWindows():
-    return defaultPath, defaultExecutable
+    if not IsWindows():
+        return defaultPath, defaultExecutable
 
-  keyNamesAndExecutables = [
-    # Pair for non-Express editions.
-    (GetWindowsRegistryKeyName(r'Microsoft\VisualStudio'), 'devenv.com'),
-    # Pair for 2012 Express edition.
-    (GetWindowsRegistryKeyName(r'Microsoft\VSWinExpress'), 'VSWinExpress.exe'),
-    # Pair for pre-2012 Express editions.
-    (GetWindowsRegistryKeyName(r'Microsoft\VCExpress'), 'VCExpress.exe')]
+    keyNamesAndExecutables = [
+        # Pair for non-Express editions.
+        (GetWindowsRegistryKeyName(r'Microsoft\VisualStudio'), 'devenv.com'),
+        # Pair for 2012 Express edition.
+        (GetWindowsRegistryKeyName(r'Microsoft\VSWinExpress'),
+         'VSWinExpress.exe'),
+        # Pair for pre-2012 Express editions.
+        (GetWindowsRegistryKeyName(r'Microsoft\VCExpress'), 'VCExpress.exe')
+    ]
 
-  bestGuess = (0.0, (defaultPath, defaultExecutable))
+    bestGuess = (0.0, (defaultPath, defaultExecutable))
 
-  import _winreg
-  for (keyName, executable) in keyNamesAndExecutables:
-    try:
-      key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, keyName)
-    except WindowsError:
-      # Can't find this key - moving on the next one.
-      continue
-
-    try:
-      subkeyCounter = 0
-      while True:
+    import _winreg
+    for (keyName, executable) in keyNamesAndExecutables:
         try:
-          subkeyName = _winreg.EnumKey(key, subkeyCounter)
-          subkeyCounter += 1
+            key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, keyName)
         except WindowsError:
-          # Reached end of enumeration. Moving on the next key.
-          break
+            # Can't find this key - moving on the next one.
+            continue
 
-        match = re.match(r'^\d+\.\d+$', subkeyName)
-        if match:
-          with _winreg.OpenKey(key, subkeyName) as subkey:
-            try:
-              (installDir, registrytype) = _winreg.QueryValueEx(subkey,
-                                                                'InstallDir')
-            except WindowsError:
-              # Can't find value under the key - continue to the next key.
-              continue
-            isExpress = executable != 'devenv.com'
-            if not isExpress and subkeyName == '14.0':
-              # Stop search since if we found non-Express VS2015 version
-              # installed, which is preferred version.
-              return installDir, executable
-            else:
-              version = float(subkeyName)
-              # We prefer higher version of Visual Studio and given equal
-              # version numbers we prefer non-Express edition.
-              if version > bestGuess[0]:
-                bestGuess = (version, (installDir, executable))
-    finally:
-      _winreg.CloseKey(key)
-  return bestGuess[1]
+        try:
+            subkeyCounter = 0
+            while True:
+                try:
+                    subkeyName = _winreg.EnumKey(key, subkeyCounter)
+                    subkeyCounter += 1
+                except WindowsError:
+                    # Reached end of enumeration. Moving on the next key.
+                    break
+
+                match = re.match(r'^\d+\.\d+$', subkeyName)
+                if match:
+                    with _winreg.OpenKey(key, subkeyName) as subkey:
+                        try:
+                            (installDir, registrytype) = _winreg.QueryValueEx(
+                                subkey, 'InstallDir')
+                        except WindowsError:
+                            # Can't find value under the key - continue to the next key.
+                            continue
+                        isExpress = executable != 'devenv.com'
+                        if not isExpress and subkeyName == '14.0':
+                            # Stop search since if we found non-Express VS2015 version
+                            # installed, which is preferred version.
+                            return installDir, executable
+                        else:
+                            version = float(subkeyName)
+                            # We prefer higher version of Visual Studio and given equal
+                            # version numbers we prefer non-Express edition.
+                            if version > bestGuess[0]:
+                                bestGuess = (version, (installDir, executable))
+        finally:
+            _winreg.CloseKey(key)
+    return bestGuess[1]
 
 
 # Returns true if we're running under Windows.
 def IsWindows():
-  return GuessOS() == 'win32'
+    return GuessOS() == 'win32'
 
 
 # Reads a text file into an array of strings - one for each
 # line. Strips comments in the process.
 def ReadLinesFrom(name):
-  result = []
-  for line in open(name):
-    if '#' in line:
-      line = line[:line.find('#')]
-    line = line.strip()
-    if len(line) == 0:
-      continue
-    result.append(line)
-  return result
+    result = []
+    for line in open(name):
+        if '#' in line:
+            line = line[:line.find('#')]
+        line = line.strip()
+        if len(line) == 0:
+            continue
+        result.append(line)
+    return result
 
 
 # Filters out all arguments until the next '--' argument
 # occurs.
 def ListArgCallback(option, value, parser):
-   if value is None:
-     value = []
+    if value is None:
+        value = []
 
-   for arg in parser.rargs:
-     if arg[:2].startswith('--'):
-       break
-     value.append(arg)
+    for arg in parser.rargs:
+        if arg[:2].startswith('--'):
+            break
+        value.append(arg)
 
-   del parser.rargs[:len(value)]
-   setattr(parser.values, option.dest, value)
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
 
 
 # Filters out all argument until the first non '-' or the
 # '--' argument occurs.
 def ListDartArgCallback(option, value, parser):
-   if value is None:
-     value = []
+    if value is None:
+        value = []
 
-   for arg in parser.rargs:
-     if arg[:2].startswith('--') or arg[0] != '-':
-       break
-     value.append(arg)
+    for arg in parser.rargs:
+        if arg[:2].startswith('--') or arg[0] != '-':
+            break
+        value.append(arg)
 
-   del parser.rargs[:len(value)]
-   setattr(parser.values, option.dest, value)
+    del parser.rargs[:len(value)]
+    setattr(parser.values, option.dest, value)
 
 
 # Mapping table between build mode and build configuration.
 BUILD_MODES = {
-  'debug': 'Debug',
-  'release': 'Release',
-  'product': 'Product',
+    'debug': 'Debug',
+    'release': 'Release',
+    'product': 'Product',
 }
 
-
 # Mapping table between OS and build output location.
 BUILD_ROOT = {
-  'win32': os.path.join('out'),
-  'linux': os.path.join('out'),
-  'freebsd': os.path.join('out'),
-  'macos': os.path.join('xcodebuild'),
+    'win32': os.path.join('out'),
+    'linux': os.path.join('out'),
+    'freebsd': os.path.join('out'),
+    'macos': os.path.join('xcodebuild'),
 }
 
 ARCH_FAMILY = {
-  'ia32': 'ia32',
-  'x64': 'ia32',
-  'arm': 'arm',
-  'armv6': 'arm',
-  'armv5te': 'arm',
-  'arm64': 'arm',
-  'simarm': 'ia32',
-  'simarmv6': 'ia32',
-  'simarmv5te': 'ia32',
-  'simarm64': 'ia32',
-  'simdbc': 'ia32',
-  'simdbc64': 'ia32',
-  'armsimdbc': 'arm',
-  'armsimdbc64': 'arm',
-  'simarm_x64': 'ia32',
+    'ia32': 'ia32',
+    'x64': 'ia32',
+    'arm': 'arm',
+    'armv6': 'arm',
+    'armv5te': 'arm',
+    'arm64': 'arm',
+    'simarm': 'ia32',
+    'simarmv6': 'ia32',
+    'simarmv5te': 'ia32',
+    'simarm64': 'ia32',
+    'simdbc': 'ia32',
+    'simdbc64': 'ia32',
+    'armsimdbc': 'arm',
+    'armsimdbc64': 'arm',
+    'simarm_x64': 'ia32',
 }
 
 ARCH_GUESS = GuessArchitecture()
@@ -280,84 +288,83 @@
 
 
 def GetBuildbotGSUtilPath():
-  gsutil = '/b/build/scripts/slave/gsutil'
-  if platform.system() == 'Windows':
-    gsutil = 'e:\\\\b\\build\\scripts\\slave\\gsutil'
-  return gsutil
+    gsutil = '/b/build/scripts/slave/gsutil'
+    if platform.system() == 'Windows':
+        gsutil = 'e:\\\\b\\build\\scripts\\slave\\gsutil'
+    return gsutil
 
 
 def GetBuildMode(mode):
-  return BUILD_MODES[mode]
+    return BUILD_MODES[mode]
 
 
 def GetArchFamily(arch):
-  return ARCH_FAMILY[arch]
+    return ARCH_FAMILY[arch]
 
 
 def IsCrossBuild(target_os, arch):
-  host_arch = ARCH_GUESS
-  return ((GetArchFamily(host_arch) != GetArchFamily(arch)) or
-          (target_os != GuessOS()))
+    host_arch = ARCH_GUESS
+    return ((GetArchFamily(host_arch) != GetArchFamily(arch)) or
+            (target_os != GuessOS()))
 
 
 def GetBuildConf(mode, arch, conf_os=None):
-  if conf_os == 'android':
-    return '%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper())
-  else:
-    # Ask for a cross build if the host and target architectures don't match.
-    host_arch = ARCH_GUESS
-    cross_build = ''
-    if GetArchFamily(host_arch) != GetArchFamily(arch):
-      cross_build = 'X'
-    return '%s%s%s' % (GetBuildMode(mode), cross_build, arch.upper())
+    if conf_os == 'android':
+        return '%s%s%s' % (GetBuildMode(mode), conf_os.title(), arch.upper())
+    else:
+        # Ask for a cross build if the host and target architectures don't match.
+        host_arch = ARCH_GUESS
+        cross_build = ''
+        if GetArchFamily(host_arch) != GetArchFamily(arch):
+            cross_build = 'X'
+        return '%s%s%s' % (GetBuildMode(mode), cross_build, arch.upper())
 
 
 def GetBuildDir(host_os):
-  return BUILD_ROOT[host_os]
+    return BUILD_ROOT[host_os]
 
 
 def GetBuildRoot(host_os, mode=None, arch=None, target_os=None):
-  build_root = GetBuildDir(host_os)
-  if mode:
-    build_root = os.path.join(build_root,
-                              GetBuildConf(mode, arch, target_os))
-  return build_root
+    build_root = GetBuildDir(host_os)
+    if mode:
+        build_root = os.path.join(build_root, GetBuildConf(
+            mode, arch, target_os))
+    return build_root
 
 
 def GetBuildSdkBin(host_os, mode=None, arch=None, target_os=None):
-  build_root = GetBuildRoot(host_os, mode, arch, target_os)
-  return os.path.join(build_root, 'dart-sdk', 'bin')
+    build_root = GetBuildRoot(host_os, mode, arch, target_os)
+    return os.path.join(build_root, 'dart-sdk', 'bin')
 
 
 def GetBaseDir():
-  return BASE_DIR
+    return BASE_DIR
 
 
 def GetShortVersion():
-  version = ReadVersionFile()
-  return ('%s.%s.%s.%s.%s' % (
-      version.major, version.minor, version.patch, version.prerelease,
-      version.prerelease_patch))
+    version = ReadVersionFile()
+    return ('%s.%s.%s.%s.%s' % (version.major, version.minor, version.patch,
+                                version.prerelease, version.prerelease_patch))
 
 
 def GetSemanticSDKVersion(no_git_hash=False, version_file=None):
-  version = ReadVersionFile(version_file)
-  if not version:
-    return None
+    version = ReadVersionFile(version_file)
+    if not version:
+        return None
 
-  if version.channel == 'be':
-    postfix = '-edge' if no_git_hash else '-edge.%s' % GetGitRevision()
-  elif version.channel == 'dev':
-    postfix = '-dev.%s.%s' % (version.prerelease, version.prerelease_patch)
-  else:
-    assert version.channel == 'stable'
-    postfix = ''
+    if version.channel == 'be':
+        postfix = '-edge' if no_git_hash else '-edge.%s' % GetGitRevision()
+    elif version.channel == 'dev':
+        postfix = '-dev.%s.%s' % (version.prerelease, version.prerelease_patch)
+    else:
+        assert version.channel == 'stable'
+        postfix = ''
 
-  return '%s.%s.%s%s' % (version.major, version.minor, version.patch, postfix)
+    return '%s.%s.%s%s' % (version.major, version.minor, version.patch, postfix)
 
 
 def GetVersion(no_git_hash=False, version_file=None):
-  return GetSemanticSDKVersion(no_git_hash, version_file)
+    return GetSemanticSDKVersion(no_git_hash, version_file)
 
 
 # The editor used to produce the VERSION file put on gcs. We now produce this
@@ -369,70 +376,73 @@
 #  "revision": "535394c2657ede445142d8a92486d3899bbf49b5"
 #}
 def GetVersionFileContent():
-  result = {"date": str(datetime.date.today()),
-            "version": GetVersion(),
-            "revision": GetGitRevision()}
-  return json.dumps(result, indent=2)
+    result = {
+        "date": str(datetime.date.today()),
+        "version": GetVersion(),
+        "revision": GetGitRevision()
+    }
+    return json.dumps(result, indent=2)
 
 
 def GetChannel():
-  version = ReadVersionFile()
-  return version.channel
+    version = ReadVersionFile()
+    return version.channel
 
 
 def GetUserName():
-  key = 'USER'
-  if sys.platform == 'win32':
-    key = 'USERNAME'
-  return os.environ.get(key, '')
+    key = 'USER'
+    if sys.platform == 'win32':
+        key = 'USERNAME'
+    return os.environ.get(key, '')
 
 
 def GetAbiVersion(version_file=None):
-  version = ReadVersionFile(version_file)
-  return version.abi_version
+    version = ReadVersionFile(version_file)
+    return version.abi_version
 
 
 def GetOldestSupportedAbiVersion(version_file=None):
-  version = ReadVersionFile(version_file)
-  return version.oldest_supported_abi_version
+    version = ReadVersionFile(version_file)
+    return version.oldest_supported_abi_version
 
 
 def ReadVersionFile(version_file=None):
-  def match_against(pattern, file_content):
-    match = re.search(pattern, file_content, flags=re.MULTILINE)
-    if match:
-      return match.group(1)
-    return None
 
-  if version_file == None:
-    version_file = VERSION_FILE
+    def match_against(pattern, file_content):
+        match = re.search(pattern, file_content, flags=re.MULTILINE)
+        if match:
+            return match.group(1)
+        return None
 
-  try:
-    fd = open(version_file)
-    content = fd.read()
-    fd.close()
-  except:
-    print ("Warning: Couldn't read VERSION file (%s)" % version_file)
-    return None
+    if version_file == None:
+        version_file = VERSION_FILE
 
-  channel = match_against('^CHANNEL ([A-Za-z0-9]+)$', content)
-  major = match_against('^MAJOR (\d+)$', content)
-  minor = match_against('^MINOR (\d+)$', content)
-  patch = match_against('^PATCH (\d+)$', content)
-  prerelease = match_against('^PRERELEASE (\d+)$', content)
-  prerelease_patch = match_against('^PRERELEASE_PATCH (\d+)$', content)
-  abi_version = match_against('^ABI_VERSION (\d+)$', content)
-  oldest_supported_abi_version = match_against(
-      '^OLDEST_SUPPORTED_ABI_VERSION (\d+)$', content)
+    try:
+        fd = open(version_file)
+        content = fd.read()
+        fd.close()
+    except:
+        print("Warning: Couldn't read VERSION file (%s)" % version_file)
+        return None
 
-  if channel and major and minor and prerelease and prerelease_patch and \
-      abi_version and oldest_supported_abi_version:
-    return Version(
-        channel, major, minor, patch, prerelease, prerelease_patch, abi_version,
-        oldest_supported_abi_version)
-  else:
-    print ("Warning: VERSION file (%s) has wrong format" % version_file)
-    return None
+    channel = match_against('^CHANNEL ([A-Za-z0-9]+)$', content)
+    major = match_against('^MAJOR (\d+)$', content)
+    minor = match_against('^MINOR (\d+)$', content)
+    patch = match_against('^PATCH (\d+)$', content)
+    prerelease = match_against('^PRERELEASE (\d+)$', content)
+    prerelease_patch = match_against('^PRERELEASE_PATCH (\d+)$', content)
+    abi_version = match_against('^ABI_VERSION (\d+)$', content)
+    oldest_supported_abi_version = match_against(
+        '^OLDEST_SUPPORTED_ABI_VERSION (\d+)$', content)
+
+    if channel and major and minor and prerelease and prerelease_patch and \
+        abi_version and oldest_supported_abi_version:
+        return Version(channel, major, minor, patch, prerelease,
+                       prerelease_patch, abi_version,
+                       oldest_supported_abi_version)
+    else:
+        print("Warning: VERSION file (%s) has wrong format" % version_file)
+        return None
 
 
 # Our schema for releases and archiving is based on an increasing
@@ -445,747 +455,789 @@
 # we use the version number instead for archiving purposes.
 # The number on master is the count of commits on the master branch.
 def GetArchiveVersion():
-  version = ReadVersionFile()
-  if not version:
-    raise 'Could not get the archive version, parsing the version file failed'
-  if version.channel in ['be', 'integration']:
-    return GetGitNumber()
-  return GetSemanticSDKVersion()
+    version = ReadVersionFile()
+    if not version:
+        raise 'Could not get the archive version, parsing the version file failed'
+    if version.channel in ['be', 'integration']:
+        return GetGitNumber()
+    return GetSemanticSDKVersion()
 
 
 def GetGitRevision():
-  # When building from tarball use tools/GIT_REVISION
-  git_revision_file = os.path.join(DART_DIR, 'tools', 'GIT_REVISION')
-  try:
-    with open(git_revision_file) as fd:
-      return fd.read()
-  except:
-    pass
-  p = subprocess.Popen(['git', 'rev-parse', 'HEAD'],
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.STDOUT, shell=IsWindows(),
-                       cwd = DART_DIR)
-  output, _ = p.communicate()
-  output = output.strip()
-  # We expect a full git hash
-  if len(output) != 40:
-    print ("Warning: could not parse git commit, output was %s" % output)
-    return None
-  return output
+    # When building from tarball use tools/GIT_REVISION
+    git_revision_file = os.path.join(DART_DIR, 'tools', 'GIT_REVISION')
+    try:
+        with open(git_revision_file) as fd:
+            return fd.read()
+    except:
+        pass
+    p = subprocess.Popen(['git', 'rev-parse', 'HEAD'],
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT,
+                         shell=IsWindows(),
+                         cwd=DART_DIR)
+    output, _ = p.communicate()
+    output = output.strip()
+    # We expect a full git hash
+    if len(output) != 40:
+        print("Warning: could not parse git commit, output was %s" % output)
+        return None
+    return output
 
 
 def GetShortGitHash():
-  p = subprocess.Popen(['git', 'rev-parse', '--short', 'HEAD'],
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.STDOUT, shell=IsWindows(),
-                       cwd = DART_DIR)
-  output, _ = p.communicate()
-  output = output.strip()
-  if p.wait() != 0:
-    return None
-  return output
+    p = subprocess.Popen(['git', 'rev-parse', '--short', 'HEAD'],
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT,
+                         shell=IsWindows(),
+                         cwd=DART_DIR)
+    output, _ = p.communicate()
+    output = output.strip()
+    if p.wait() != 0:
+        return None
+    return output
 
 
 def GetLatestDevTag():
-  cmd = [
-    'git',
-    'for-each-ref',
-    'refs/tags/*dev*',
-    '--sort=-taggerdate',
-    "--format=%(refname:lstrip=2)",
-    '--count=1',
-  ]
-  p = subprocess.Popen(cmd,
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.STDOUT, shell=IsWindows(),
-                       cwd = DART_DIR)
-  output, _ = p.communicate()
-  if p.wait() != 0:
-    print ("Warning: Could not get the most recent dev branch tag %s" % output)
-    return None
-  return output.strip()
+    cmd = [
+        'git',
+        'for-each-ref',
+        'refs/tags/*dev*',
+        '--sort=-taggerdate',
+        "--format=%(refname:lstrip=2)",
+        '--count=1',
+    ]
+    p = subprocess.Popen(
+        cmd,
+        stdout=subprocess.PIPE,
+        stderr=subprocess.STDOUT,
+        shell=IsWindows(),
+        cwd=DART_DIR)
+    output, _ = p.communicate()
+    if p.wait() != 0:
+        print(
+            "Warning: Could not get the most recent dev branch tag %s" % output)
+        return None
+    return output.strip()
 
 
 def GetGitTimestamp():
-  p = subprocess.Popen(['git', 'log', '-n', '1', '--pretty=format:%cd'],
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.STDOUT, shell=IsWindows(),
-                       cwd = DART_DIR)
-  output, _ = p.communicate()
-  if p.wait() != 0:
-    return None
-  return output
+    p = subprocess.Popen(['git', 'log', '-n', '1', '--pretty=format:%cd'],
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT,
+                         shell=IsWindows(),
+                         cwd=DART_DIR)
+    output, _ = p.communicate()
+    if p.wait() != 0:
+        return None
+    return output
 
 
 # To eliminate clashing with older archived builds on bleeding edge we add
 # a base number bigger the largest svn revision (this also gives us an easy
 # way of seeing if an archive comes from git based or svn based commits).
 GIT_NUMBER_BASE = 100000
+
+
 def GetGitNumber():
-  p = subprocess.Popen(['git', 'rev-list', 'HEAD', '--count'],
-                       stdout = subprocess.PIPE,
-                       stderr = subprocess.STDOUT, shell=IsWindows(),
-                       cwd = DART_DIR)
-  output, _ = p.communicate()
-  try:
-    number = int(output)
-    return number + GIT_NUMBER_BASE
-  except:
-    print ("Warning: could not parse git count, output was %s" % output)
-  return None
+    p = subprocess.Popen(['git', 'rev-list', 'HEAD', '--count'],
+                         stdout=subprocess.PIPE,
+                         stderr=subprocess.STDOUT,
+                         shell=IsWindows(),
+                         cwd=DART_DIR)
+    output, _ = p.communicate()
+    try:
+        number = int(output)
+        return number + GIT_NUMBER_BASE
+    except:
+        print("Warning: could not parse git count, output was %s" % output)
+    return None
 
 
 def ParseGitInfoOutput(output):
-  """Given a git log, determine the latest corresponding svn revision."""
-  for line in output.split('\n'):
-    tokens = line.split()
-    if len(tokens) > 0 and tokens[0] == 'git-svn-id:':
-      return tokens[1].split('@')[1]
-  return None
+    """Given a git log, determine the latest corresponding svn revision."""
+    for line in output.split('\n'):
+        tokens = line.split()
+        if len(tokens) > 0 and tokens[0] == 'git-svn-id:':
+            return tokens[1].split('@')[1]
+    return None
 
 
 def ParseSvnInfoOutput(output):
-  revision_match = re.search('Last Changed Rev: (\d+)', output)
-  if revision_match:
-    return revision_match.group(1)
-  return None
+    revision_match = re.search('Last Changed Rev: (\d+)', output)
+    if revision_match:
+        return revision_match.group(1)
+    return None
 
 
 def RewritePathSeparator(path, workspace):
-  # Paths in test files are always specified using '/'
-  # as the path separator. Replace with the actual
-  # path separator before use.
-  if '/' in path:
-    split_path = path.split('/')
-    path = os.sep.join(split_path)
-    path = os.path.join(workspace, path)
-    if not os.path.exists(path):
-      raise Exception(path)
-  return path
+    # Paths in test files are always specified using '/'
+    # as the path separator. Replace with the actual
+    # path separator before use.
+    if '/' in path:
+        split_path = path.split('/')
+        path = os.sep.join(split_path)
+        path = os.path.join(workspace, path)
+        if not os.path.exists(path):
+            raise Exception(path)
+    return path
 
 
 def ParseTestOptions(pattern, source, workspace):
-  match = pattern.search(source)
-  if match:
-    return [RewritePathSeparator(o, workspace) for o in match.group(1).split(' ')]
-  else:
-    return None
+    match = pattern.search(source)
+    if match:
+        return [
+            RewritePathSeparator(o, workspace)
+            for o in match.group(1).split(' ')
+        ]
+    else:
+        return None
 
 
 def ParseTestOptionsMultiple(pattern, source, workspace):
-  matches = pattern.findall(source)
-  if matches:
-    result = []
-    for match in matches:
-      if len(match) > 0:
-        result.append(
-            [RewritePathSeparator(o, workspace) for o in match.split(' ')])
-      else:
-        result.append([])
-    return result
-  else:
-    return None
+    matches = pattern.findall(source)
+    if matches:
+        result = []
+        for match in matches:
+            if len(match) > 0:
+                result.append([
+                    RewritePathSeparator(o, workspace) for o in match.split(' ')
+                ])
+            else:
+                result.append([])
+        return result
+    else:
+        return None
 
 
 def Daemonize():
-  """
+    """
   Create a detached background process (daemon). Returns True for
   the daemon, False for the parent process.
   See: http://www.faqs.org/faqs/unix-faq/programmer/faq/
   "1.7 How do I get my program to act like a daemon?"
   """
-  if os.fork() > 0:
-    return False
-  os.setsid()
-  if os.fork() > 0:
-    exit(0)
-    raise
-  return True
+    if os.fork() > 0:
+        return False
+    os.setsid()
+    if os.fork() > 0:
+        exit(0)
+        raise
+    return True
 
 
 def PrintError(string):
-  """Writes and flushes a string to stderr."""
-  sys.stderr.write(string)
-  sys.stderr.write('\n')
+    """Writes and flushes a string to stderr."""
+    sys.stderr.write(string)
+    sys.stderr.write('\n')
 
 
 def CheckedUnlink(name):
-  """Unlink a file without throwing an exception."""
-  try:
-    os.unlink(name)
-  except OSError as e:
-    PrintError("os.unlink() " + str(e))
+    """Unlink a file without throwing an exception."""
+    try:
+        os.unlink(name)
+    except OSError as e:
+        PrintError("os.unlink() " + str(e))
 
 
 def Main():
-  print ("GuessOS() -> ", GuessOS())
-  print ("GuessArchitecture() -> ", GuessArchitecture())
-  print ("GuessCpus() -> ", GuessCpus())
-  print ("IsWindows() -> ", IsWindows())
-  print ("GuessVisualStudioPath() -> ", GuessVisualStudioPath())
-  print ("GetGitRevision() -> ", GetGitRevision())
-  print ("GetGitTimestamp() -> ", GetGitTimestamp())
-  print ("GetVersionFileContent() -> ", GetVersionFileContent())
-  print ("GetGitNumber() -> ", GetGitNumber())
+    print("GuessOS() -> ", GuessOS())
+    print("GuessArchitecture() -> ", GuessArchitecture())
+    print("GuessCpus() -> ", GuessCpus())
+    print("IsWindows() -> ", IsWindows())
+    print("GuessVisualStudioPath() -> ", GuessVisualStudioPath())
+    print("GetGitRevision() -> ", GetGitRevision())
+    print("GetGitTimestamp() -> ", GetGitTimestamp())
+    print("GetVersionFileContent() -> ", GetVersionFileContent())
+    print("GetGitNumber() -> ", GetGitNumber())
 
 
 class Error(Exception):
-  pass
+    pass
 
 
 class ToolError(Exception):
-  """Deprecated exception, use Error instead."""
+    """Deprecated exception, use Error instead."""
 
-  def __init__(self, value):
-    self.value = value
+    def __init__(self, value):
+        self.value = value
 
-  def __str__(self):
-    return repr(self.value)
+    def __str__(self):
+        return repr(self.value)
 
 
 def IsCrashExitCode(exit_code):
-  if IsWindows():
-    return 0x80000000 & exit_code
-  else:
-    return exit_code < 0
+    if IsWindows():
+        return 0x80000000 & exit_code
+    else:
+        return exit_code < 0
 
 
 def DiagnoseExitCode(exit_code, command):
-  if IsCrashExitCode(exit_code):
-    sys.stderr.write('Command: %s\nCRASHED with exit code %d (0x%x)\n' % (
-        ' '.join(command), exit_code, exit_code & 0xffffffff))
+    if IsCrashExitCode(exit_code):
+        sys.stderr.write('Command: %s\nCRASHED with exit code %d (0x%x)\n' %
+                         (' '.join(command), exit_code, exit_code & 0xffffffff))
 
 
 def Touch(name):
-  with file(name, 'a'):
-    os.utime(name, None)
+    with file(name, 'a'):
+        os.utime(name, None)
 
 
 def ExecuteCommand(cmd):
-  """Execute a command in a subprocess."""
-  print ('Executing: ' + ' '.join(cmd))
-  pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-      shell=IsWindows())
-  output = pipe.communicate()
-  if pipe.returncode != 0:
-    raise Exception('Execution failed: ' + str(output))
-  return pipe.returncode, output
+    """Execute a command in a subprocess."""
+    print('Executing: ' + ' '.join(cmd))
+    pipe = subprocess.Popen(
+        cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=IsWindows())
+    output = pipe.communicate()
+    if pipe.returncode != 0:
+        raise Exception('Execution failed: ' + str(output))
+    return pipe.returncode, output
 
 
 # The checked-in SDKs are documented at
 #     https://github.com/dart-lang/sdk/wiki/The-checked-in-SDK-in-tools
 def CheckedInSdkPath():
-  # We don't use the normal macos, linux, win32 directory names here, instead,
-  # we use the names that the download_from_google_storage script uses.
-  osdict = {'Darwin':'mac', 'Linux':'linux', 'Windows':'win'}
-  system = platform.system()
-  try:
-    osname = osdict[system]
-  except KeyError:
-    sys.stderr.write('WARNING: platform "%s" not supported\n' % system)
-    return None
-  tools_dir = os.path.dirname(os.path.realpath(__file__))
-  return os.path.join(tools_dir,
-                      'sdks',
-                      'dart-sdk')
+    # We don't use the normal macos, linux, win32 directory names here, instead,
+    # we use the names that the download_from_google_storage script uses.
+    osdict = {'Darwin': 'mac', 'Linux': 'linux', 'Windows': 'win'}
+    system = platform.system()
+    try:
+        osname = osdict[system]
+    except KeyError:
+        sys.stderr.write('WARNING: platform "%s" not supported\n' % system)
+        return None
+    tools_dir = os.path.dirname(os.path.realpath(__file__))
+    return os.path.join(tools_dir, 'sdks', 'dart-sdk')
 
 
 def CheckedInSdkExecutable():
-  name = 'dart'
-  if IsWindows():
-    name = 'dart.exe'
-  return os.path.join(CheckedInSdkPath(), 'bin', name)
+    name = 'dart'
+    if IsWindows():
+        name = 'dart.exe'
+    return os.path.join(CheckedInSdkPath(), 'bin', name)
+
 
 def CheckedInSdkCheckExecutable():
-  executable = CheckedInSdkExecutable()
-  canary_script = os.path.join(os.path.dirname(os.path.realpath(__file__)),
-                               'canary.dart')
-  try:
-    with open(os.devnull, 'wb') as silent_sink:
-      if 0 == subprocess.call([executable, canary_script], stdout=silent_sink):
-        return True
-  except OSError as e:
-    pass
-  return False
+    executable = CheckedInSdkExecutable()
+    canary_script = os.path.join(
+        os.path.dirname(os.path.realpath(__file__)), 'canary.dart')
+    try:
+        with open(os.devnull, 'wb') as silent_sink:
+            if 0 == subprocess.call([executable, canary_script],
+                                    stdout=silent_sink):
+                return True
+    except OSError as e:
+        pass
+    return False
 
 
 def CheckLinuxCoreDumpPattern(fatal=False):
-  core_pattern_file = '/proc/sys/kernel/core_pattern'
-  core_pattern = open(core_pattern_file).read()
+    core_pattern_file = '/proc/sys/kernel/core_pattern'
+    core_pattern = open(core_pattern_file).read()
 
-  expected_core_pattern = 'core.%p'
-  if core_pattern.strip() != expected_core_pattern:
-    message = ('Invalid core_pattern configuration. '
-        'The configuration of core dump handling is *not* correct for '
-        'a buildbot. The content of {0} must be "{1}" instead of "{2}".'
-        .format(core_pattern_file, expected_core_pattern, core_pattern))
-    if fatal:
-      raise Exception(message)
-    else:
-      print (message)
-      return False
-  return True
+    expected_core_pattern = 'core.%p'
+    if core_pattern.strip() != expected_core_pattern:
+        message = (
+            'Invalid core_pattern configuration. '
+            'The configuration of core dump handling is *not* correct for '
+            'a buildbot. The content of {0} must be "{1}" instead of "{2}".'.
+            format(core_pattern_file, expected_core_pattern, core_pattern))
+        if fatal:
+            raise Exception(message)
+        else:
+            print(message)
+            return False
+    return True
 
 
 class TempDir(object):
-  def __init__(self, prefix=''):
-    self._temp_dir = None
-    self._prefix = prefix
 
-  def __enter__(self):
-    self._temp_dir = tempfile.mkdtemp(self._prefix)
-    return self._temp_dir
+    def __init__(self, prefix=''):
+        self._temp_dir = None
+        self._prefix = prefix
 
-  def __exit__(self, *_):
-    shutil.rmtree(self._temp_dir, ignore_errors=True)
+    def __enter__(self):
+        self._temp_dir = tempfile.mkdtemp(self._prefix)
+        return self._temp_dir
+
+    def __exit__(self, *_):
+        shutil.rmtree(self._temp_dir, ignore_errors=True)
 
 
 class ChangedWorkingDirectory(object):
-  def __init__(self, working_directory):
-    self._working_directory = working_directory
 
-  def __enter__(self):
-    self._old_cwd = os.getcwd()
-    print ("Enter directory = ", self._working_directory)
-    os.chdir(self._working_directory)
+    def __init__(self, working_directory):
+        self._working_directory = working_directory
 
-  def __exit__(self, *_):
-    print ("Enter directory = ", self._old_cwd)
-    os.chdir(self._old_cwd)
+    def __enter__(self):
+        self._old_cwd = os.getcwd()
+        print("Enter directory = ", self._working_directory)
+        os.chdir(self._working_directory)
+
+    def __exit__(self, *_):
+        print("Enter directory = ", self._old_cwd)
+        os.chdir(self._old_cwd)
 
 
 class UnexpectedCrash(object):
-  def __init__(self, test, pid, *binaries):
-    self.test = test
-    self.pid = pid
-    self.binaries = binaries
 
-  def __str__(self):
-    return "Crash(%s: %s %s)" % (self.test, self.pid, ', '.join(self.binaries))
+    def __init__(self, test, pid, *binaries):
+        self.test = test
+        self.pid = pid
+        self.binaries = binaries
+
+    def __str__(self):
+        return "Crash(%s: %s %s)" % (self.test, self.pid, ', '.join(
+            self.binaries))
 
 
 class PosixCoreDumpEnabler(object):
-  def __init__(self):
-    self._old_limits = None
 
-  def __enter__(self):
-    self._old_limits = resource.getrlimit(resource.RLIMIT_CORE)
-    resource.setrlimit(resource.RLIMIT_CORE, (-1, -1))
+    def __init__(self):
+        self._old_limits = None
 
-  def __exit__(self, *_):
-    resource.setrlimit(resource.RLIMIT_CORE, self._old_limits)
+    def __enter__(self):
+        self._old_limits = resource.getrlimit(resource.RLIMIT_CORE)
+        resource.setrlimit(resource.RLIMIT_CORE, (-1, -1))
+
+    def __exit__(self, *_):
+        resource.setrlimit(resource.RLIMIT_CORE, self._old_limits)
 
 
 class LinuxCoreDumpEnabler(PosixCoreDumpEnabler):
-  def __enter__(self):
-    # Bump core limits to unlimited if core_pattern is correctly configured.
-    if CheckLinuxCoreDumpPattern(fatal=False):
-      super(LinuxCoreDumpEnabler, self).__enter__()
 
-  def __exit__(self, *args):
-    CheckLinuxCoreDumpPattern(fatal=False)
-    super(LinuxCoreDumpEnabler, self).__exit__(*args)
+    def __enter__(self):
+        # Bump core limits to unlimited if core_pattern is correctly configured.
+        if CheckLinuxCoreDumpPattern(fatal=False):
+            super(LinuxCoreDumpEnabler, self).__enter__()
+
+    def __exit__(self, *args):
+        CheckLinuxCoreDumpPattern(fatal=False)
+        super(LinuxCoreDumpEnabler, self).__exit__(*args)
 
 
 class WindowsCoreDumpEnabler(object):
-  """This enabler assumes that Dart binary was built with Crashpad support.
+    """This enabler assumes that Dart binary was built with Crashpad support.
   In this case DART_CRASHPAD_CRASHES_DIR environment variable allows to
   specify the location of Crashpad crashes database. Actual minidumps will
   be written into reports subfolder of the database.
   """
-  CRASHPAD_DB_FOLDER = os.path.join(DART_DIR, r'crashes')
-  DUMPS_FOLDER = os.path.join(CRASHPAD_DB_FOLDER, r'reports')
+    CRASHPAD_DB_FOLDER = os.path.join(DART_DIR, r'crashes')
+    DUMPS_FOLDER = os.path.join(CRASHPAD_DB_FOLDER, r'reports')
 
-  def __init__(self):
-    pass
+    def __init__(self):
+        pass
 
-  def __enter__(self):
-    print ("INFO: Enabling coredump archiving into %s" % (WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER))
-    os.environ['DART_CRASHPAD_CRASHES_DIR'] = WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER
+    def __enter__(self):
+        print("INFO: Enabling coredump archiving into %s" %
+              (WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER))
+        os.environ[
+            'DART_CRASHPAD_CRASHES_DIR'] = WindowsCoreDumpEnabler.CRASHPAD_DB_FOLDER
 
-  def __exit__(self, *_):
-    del os.environ['DART_CRASHPAD_CRASHES_DIR']
+    def __exit__(self, *_):
+        del os.environ['DART_CRASHPAD_CRASHES_DIR']
 
 
 def TryUnlink(file):
-  try:
-    os.unlink(file)
-  except Exception as error:
-    print ("ERROR: Failed to remove %s: %s" % (file, error))
+    try:
+        os.unlink(file)
+    except Exception as error:
+        print("ERROR: Failed to remove %s: %s" % (file, error))
 
 
 class BaseCoreDumpArchiver(object):
-  """This class reads coredumps file written by UnexpectedCrashDumpArchiver
+    """This class reads coredumps file written by UnexpectedCrashDumpArchiver
   into the current working directory and uploads all cores and binaries
   listed in it into Cloud Storage (see
   pkg/test_runner/lib/src/test_progress.dart).
   """
 
-  # test.dart will write a line for each unexpected crash into this file.
-  _UNEXPECTED_CRASHES_FILE = "unexpected-crashes"
+    # test.dart will write a line for each unexpected crash into this file.
+    _UNEXPECTED_CRASHES_FILE = "unexpected-crashes"
 
-  def __init__(self, search_dir, output_directory):
-    self._bucket = 'dart-temp-crash-archive'
-    self._binaries_dir = os.getcwd()
-    self._search_dir = search_dir
-    self._output_directory = output_directory
+    def __init__(self, search_dir, output_directory):
+        self._bucket = 'dart-temp-crash-archive'
+        self._binaries_dir = os.getcwd()
+        self._search_dir = search_dir
+        self._output_directory = output_directory
 
-  def _safe_cleanup(self):
-    try:
-      return self._cleanup();
-    except Exception as error:
-      print ("ERROR: Failure during cleanup: %s" % error)
-      return False
+    def _safe_cleanup(self):
+        try:
+            return self._cleanup()
+        except Exception as error:
+            print("ERROR: Failure during cleanup: %s" % error)
+            return False
 
-  def __enter__(self):
-    print ("INFO: Core dump archiving is activated")
+    def __enter__(self):
+        print("INFO: Core dump archiving is activated")
 
-    # Cleanup any stale files
-    if self._safe_cleanup():
-      print ("WARNING: Found and removed stale coredumps")
+        # Cleanup any stale files
+        if self._safe_cleanup():
+            print("WARNING: Found and removed stale coredumps")
 
-  def __exit__(self, *_):
-    try:
-      crashes = self._find_unexpected_crashes()
-      if crashes:
-        # If we get a ton of crashes, only archive 10 dumps.
-        archive_crashes = crashes[:10]
-        print ('Archiving coredumps for crash (if possible):')
-        for crash in archive_crashes:
-          print ('----> %s' % crash)
+    def __exit__(self, *_):
+        try:
+            crashes = self._find_unexpected_crashes()
+            if crashes:
+                # If we get a ton of crashes, only archive 10 dumps.
+                archive_crashes = crashes[:10]
+                print('Archiving coredumps for crash (if possible):')
+                for crash in archive_crashes:
+                    print('----> %s' % crash)
 
-        sys.stdout.flush()
+                sys.stdout.flush()
 
-        self._archive(archive_crashes)
-      else:
-        print ("INFO: No unexpected crashes recorded")
-        dumps = self._find_all_coredumps()
-        if dumps:
-          print ("INFO: However there are %d core dumps found" % len(dumps))
-          for dump in dumps:
-            print ("INFO:        -> %s" % dump)
-          print ()
-    except Exception as error:
-      print ("ERROR: Failed to archive crashes: %s" % error)
-      raise
+                self._archive(archive_crashes)
+            else:
+                print("INFO: No unexpected crashes recorded")
+                dumps = self._find_all_coredumps()
+                if dumps:
+                    print("INFO: However there are %d core dumps found" %
+                          len(dumps))
+                    for dump in dumps:
+                        print("INFO:        -> %s" % dump)
+                    print()
+        except Exception as error:
+            print("ERROR: Failed to archive crashes: %s" % error)
+            raise
 
-    finally:
-      self._safe_cleanup()
+        finally:
+            self._safe_cleanup()
 
-  def _archive(self, crashes):
-    files = set()
-    missing = []
-    for crash in crashes:
-      files.update(crash.binaries)
-      core = self._find_coredump_file(crash)
-      if core:
-        files.add(core)
-      else:
-        missing.append(crash)
-    if self._output_directory is not None and self._is_shard():
-      print (
-          "INFO: Moving collected dumps and binaries into output directory\n"
-          "INFO: They will be uploaded to isolate server. Look for \"isolated"
-          " out\" under the failed step on the build page.\n"
-          "INFO: For more information see runtime/docs/infra/coredumps.md")
-      self._move(files)
-    else:
-      print (
-          "INFO: Uploading collected dumps and binaries into Cloud Storage\n"
-          "INFO: Use `gsutil.py cp from-url to-path` to download them.\n"
-          "INFO: For more information see runtime/docs/infra/coredumps.md")
-      self._upload(files)
+    def _archive(self, crashes):
+        files = set()
+        missing = []
+        for crash in crashes:
+            files.update(crash.binaries)
+            core = self._find_coredump_file(crash)
+            if core:
+                files.add(core)
+            else:
+                missing.append(crash)
+        if self._output_directory is not None and self._is_shard():
+            print(
+                "INFO: Moving collected dumps and binaries into output directory\n"
+                "INFO: They will be uploaded to isolate server. Look for \"isolated"
+                " out\" under the failed step on the build page.\n"
+                "INFO: For more information see runtime/docs/infra/coredumps.md"
+            )
+            self._move(files)
+        else:
+            print(
+                "INFO: Uploading collected dumps and binaries into Cloud Storage\n"
+                "INFO: Use `gsutil.py cp from-url to-path` to download them.\n"
+                "INFO: For more information see runtime/docs/infra/coredumps.md"
+            )
+            self._upload(files)
 
-    if missing:
-      self._report_missing_crashes(missing, throw=True)
+        if missing:
+            self._report_missing_crashes(missing, throw=True)
 
-  # todo(athom): move the logic to decide where to copy core dumps into the recipes.
-  def _is_shard(self):
-    return 'BUILDBOT_BUILDERNAME' not in os.environ
+    # todo(athom): move the logic to decide where to copy core dumps into the recipes.
+    def _is_shard(self):
+        return 'BUILDBOT_BUILDERNAME' not in os.environ
 
-  def _report_missing_crashes(self, missing, throw=True):
-    missing_as_string = ', '.join([str(c) for c in missing])
-    other_files = list(glob.glob(os.path.join(self._search_dir, '*')))
-    sys.stderr.write(
-        "Could not find crash dumps for '%s' in search directory '%s'.\n"
-        "Existing files which *did not* match the pattern inside the search "
-        "directory are are:\n  %s\n"
-        % (missing_as_string, self._search_dir, '\n  '.join(other_files)))
-    # TODO: Figure out why windows coredump generation does not work.
-    # See http://dartbug.com/36469
-    if throw and GuessOS() != 'win32':
-      raise Exception('Missing crash dumps for: %s' % missing_as_string)
+    def _report_missing_crashes(self, missing, throw=True):
+        missing_as_string = ', '.join([str(c) for c in missing])
+        other_files = list(glob.glob(os.path.join(self._search_dir, '*')))
+        sys.stderr.write(
+            "Could not find crash dumps for '%s' in search directory '%s'.\n"
+            "Existing files which *did not* match the pattern inside the search "
+            "directory are are:\n  %s\n" % (missing_as_string, self._search_dir,
+                                            '\n  '.join(other_files)))
+        # TODO: Figure out why windows coredump generation does not work.
+        # See http://dartbug.com/36469
+        if throw and GuessOS() != 'win32':
+            raise Exception('Missing crash dumps for: %s' % missing_as_string)
 
-  def _get_file_name(self, file):
-    # Sanitize the name: actual cores follow 'core.%d' pattern, crashed
-    # binaries are copied next to cores and named
-    # 'binary.<mode>_<arch>_<binary_name>'.
-    # This should match the code in testing/dart/test_progress.dart
-    name = os.path.basename(file)
-    (prefix, suffix) = name.split('.', 1)
-    is_binary = prefix == 'binary'
-    if is_binary:
-      (mode, arch, binary_name) = suffix.split('_', 2)
-      name = binary_name
-    return (name, is_binary)
+    def _get_file_name(self, file):
+        # Sanitize the name: actual cores follow 'core.%d' pattern, crashed
+        # binaries are copied next to cores and named
+        # 'binary.<mode>_<arch>_<binary_name>'.
+        # This should match the code in testing/dart/test_progress.dart
+        name = os.path.basename(file)
+        (prefix, suffix) = name.split('.', 1)
+        is_binary = prefix == 'binary'
+        if is_binary:
+            (mode, arch, binary_name) = suffix.split('_', 2)
+            name = binary_name
+        return (name, is_binary)
 
-  def _move(self, files):
-    for file in files:
-      print ('+++ Moving %s to output_directory (%s)' % (file, self._output_directory))
-      (name, is_binary) = self._get_file_name(file)
-      destination = os.path.join(self._output_directory, name)
-      shutil.move(file, destination)
-      if is_binary and os.path.exists(file + '.pdb'):
-        # Also move a PDB file if there is one.
-        pdb = os.path.join(self._output_directory, name + '.pdb')
-        shutil.move(file + '.pdb', pdb)
+    def _move(self, files):
+        for file in files:
+            print('+++ Moving %s to output_directory (%s)' %
+                  (file, self._output_directory))
+            (name, is_binary) = self._get_file_name(file)
+            destination = os.path.join(self._output_directory, name)
+            shutil.move(file, destination)
+            if is_binary and os.path.exists(file + '.pdb'):
+                # Also move a PDB file if there is one.
+                pdb = os.path.join(self._output_directory, name + '.pdb')
+                shutil.move(file + '.pdb', pdb)
 
-  def _tar(self, file):
-    (name, is_binary) = self._get_file_name(file)
-    tarname = '%s.tar.gz' % name
+    def _tar(self, file):
+        (name, is_binary) = self._get_file_name(file)
+        tarname = '%s.tar.gz' % name
 
-    # Compress the file.
-    tar = tarfile.open(tarname, mode='w:gz')
-    tar.add(file, arcname=name)
-    if is_binary and os.path.exists(file + '.pdb'):
-      # Also add a PDB file if there is one.
-      tar.add(file + '.pdb', arcname=name + '.pdb')
-    tar.close()
-    return tarname
+        # Compress the file.
+        tar = tarfile.open(tarname, mode='w:gz')
+        tar.add(file, arcname=name)
+        if is_binary and os.path.exists(file + '.pdb'):
+            # Also add a PDB file if there is one.
+            tar.add(file + '.pdb', arcname=name + '.pdb')
+        tar.close()
+        return tarname
 
-  def _upload(self, files):
-    bot_utils = GetBotUtils()
-    gsutil = bot_utils.GSUtil()
-    storage_path = '%s/%s/' % (self._bucket, uuid.uuid4())
-    gs_prefix = 'gs://%s' % storage_path
-    http_prefix = 'https://storage.cloud.google.com/%s' % storage_path
+    def _upload(self, files):
+        bot_utils = GetBotUtils()
+        gsutil = bot_utils.GSUtil()
+        storage_path = '%s/%s/' % (self._bucket, uuid.uuid4())
+        gs_prefix = 'gs://%s' % storage_path
+        http_prefix = 'https://storage.cloud.google.com/%s' % storage_path
 
-    print ('\n--- Uploading into %s (%s) ---' % (gs_prefix, http_prefix))
-    for file in files:
-      tarname = self._tar(file)
+        print('\n--- Uploading into %s (%s) ---' % (gs_prefix, http_prefix))
+        for file in files:
+            tarname = self._tar(file)
 
-      # Remove / from absolute path to not have // in gs path.
-      gs_url = '%s%s' % (gs_prefix, tarname)
-      http_url = '%s%s' % (http_prefix, tarname)
+            # Remove / from absolute path to not have // in gs path.
+            gs_url = '%s%s' % (gs_prefix, tarname)
+            http_url = '%s%s' % (http_prefix, tarname)
 
-      try:
-        gsutil.upload(tarname, gs_url)
-        print ('+++ Uploaded %s (%s)' % (gs_url, http_url))
-      except Exception as error:
-        print ('!!! Failed to upload %s, error: %s' % (tarname, error))
+            try:
+                gsutil.upload(tarname, gs_url)
+                print('+++ Uploaded %s (%s)' % (gs_url, http_url))
+            except Exception as error:
+                print('!!! Failed to upload %s, error: %s' % (tarname, error))
 
-      TryUnlink(tarname)
+            TryUnlink(tarname)
 
-    print ('--- Done ---\n')
+        print('--- Done ---\n')
 
-  def _find_all_coredumps(self):
-    """Return coredumps that were recorded (if supported by the platform).
+    def _find_all_coredumps(self):
+        """Return coredumps that were recorded (if supported by the platform).
     This method will be overriden by concrete platform specific implementations.
     """
-    return []
+        return []
 
-  def _find_unexpected_crashes(self):
-    """Load coredumps file. Each line has the following format:
+    def _find_unexpected_crashes(self):
+        """Load coredumps file. Each line has the following format:
 
         test-name,pid,binary-file1,binary-file2,...
     """
-    try:
-      with open(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE) as f:
-        return [UnexpectedCrash(*ln.strip('\n').split(',')) for ln in f.readlines()]
-    except:
-      return []
+        try:
+            with open(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE) as f:
+                return [
+                    UnexpectedCrash(*ln.strip('\n').split(','))
+                    for ln in f.readlines()
+                ]
+        except:
+            return []
 
-  def _cleanup(self):
-    found = False
-    if os.path.exists(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE):
-      os.unlink(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE)
-      found = True
-    for binary in glob.glob(os.path.join(self._binaries_dir, 'binary.*')):
-      found = True
-      TryUnlink(binary)
+    def _cleanup(self):
+        found = False
+        if os.path.exists(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE):
+            os.unlink(BaseCoreDumpArchiver._UNEXPECTED_CRASHES_FILE)
+            found = True
+        for binary in glob.glob(os.path.join(self._binaries_dir, 'binary.*')):
+            found = True
+            TryUnlink(binary)
 
-    return found
+        return found
+
 
 class PosixCoreDumpArchiver(BaseCoreDumpArchiver):
-  def __init__(self, search_dir, output_directory):
-    super(PosixCoreDumpArchiver, self).__init__(search_dir, output_directory)
 
-  def _cleanup(self):
-    found = super(PosixCoreDumpArchiver, self)._cleanup()
-    for core in glob.glob(os.path.join(self._search_dir, 'core.*')):
-      found = True
-      TryUnlink(core)
-    return found
+    def __init__(self, search_dir, output_directory):
+        super(PosixCoreDumpArchiver, self).__init__(search_dir,
+                                                    output_directory)
 
-  def _find_coredump_file(self, crash):
-    core_filename = os.path.join(self._search_dir, 'core.%s' % crash.pid)
-    if os.path.exists(core_filename):
-      return core_filename
+    def _cleanup(self):
+        found = super(PosixCoreDumpArchiver, self)._cleanup()
+        for core in glob.glob(os.path.join(self._search_dir, 'core.*')):
+            found = True
+            TryUnlink(core)
+        return found
+
+    def _find_coredump_file(self, crash):
+        core_filename = os.path.join(self._search_dir, 'core.%s' % crash.pid)
+        if os.path.exists(core_filename):
+            return core_filename
 
 
 class LinuxCoreDumpArchiver(PosixCoreDumpArchiver):
-  def __init__(self, output_directory):
-    super(LinuxCoreDumpArchiver, self).__init__(os.getcwd(), output_directory)
+
+    def __init__(self, output_directory):
+        super(LinuxCoreDumpArchiver, self).__init__(os.getcwd(),
+                                                    output_directory)
 
 
 class MacOSCoreDumpArchiver(PosixCoreDumpArchiver):
-  def __init__(self, output_directory):
-    super(MacOSCoreDumpArchiver, self).__init__('/cores', output_directory)
+
+    def __init__(self, output_directory):
+        super(MacOSCoreDumpArchiver, self).__init__('/cores', output_directory)
 
 
 class WindowsCoreDumpArchiver(BaseCoreDumpArchiver):
-  def __init__(self, output_directory):
-    super(WindowsCoreDumpArchiver, self).__init__(
-        WindowsCoreDumpEnabler.DUMPS_FOLDER, output_directory)
-    self._dumps_by_pid = None
 
-  # Find CDB.exe in the win_toolchain that we are using.
-  def _find_cdb(self):
-    win_toolchain_json_path = os.path.join(
-        DART_DIR, 'build', 'win_toolchain.json')
-    if not os.path.exists(win_toolchain_json_path):
-      return None
+    def __init__(self, output_directory):
+        super(WindowsCoreDumpArchiver, self).__init__(
+            WindowsCoreDumpEnabler.DUMPS_FOLDER, output_directory)
+        self._dumps_by_pid = None
 
-    with open(win_toolchain_json_path, "r") as f:
-      win_toolchain_info = json.loads(f.read())
+    # Find CDB.exe in the win_toolchain that we are using.
+    def _find_cdb(self):
+        win_toolchain_json_path = os.path.join(DART_DIR, 'build',
+                                               'win_toolchain.json')
+        if not os.path.exists(win_toolchain_json_path):
+            return None
 
-    win_sdk_path = win_toolchain_info['win_sdk']
+        with open(win_toolchain_json_path, "r") as f:
+            win_toolchain_info = json.loads(f.read())
 
-    # We assume that we are running on 64-bit Windows.
-    # Note: x64 CDB can work with both X64 and IA32 dumps.
-    cdb_path = os.path.join(win_sdk_path, 'Debuggers', 'x64', 'cdb.exe')
-    if not os.path.exists(cdb_path):
-      return None
+        win_sdk_path = win_toolchain_info['win_sdk']
 
-    return cdb_path
+        # We assume that we are running on 64-bit Windows.
+        # Note: x64 CDB can work with both X64 and IA32 dumps.
+        cdb_path = os.path.join(win_sdk_path, 'Debuggers', 'x64', 'cdb.exe')
+        if not os.path.exists(cdb_path):
+            return None
 
-  CDBG_PROMPT_RE = re.compile(r'^\d+:\d+>')
+        return cdb_path
 
-  def _dump_all_stacks(self):
-    # On Windows due to crashpad integration crashes do not produce any
-    # stacktraces. Dump stack traces from dumps Crashpad collected using
-    # CDB (if available).
-    cdb_path = self._find_cdb()
-    if cdb_path is None:
-      return
+    CDBG_PROMPT_RE = re.compile(r'^\d+:\d+>')
 
-    dumps = self._find_all_coredumps()
-    if not dumps:
-      return
+    def _dump_all_stacks(self):
+        # On Windows due to crashpad integration crashes do not produce any
+        # stacktraces. Dump stack traces from dumps Crashpad collected using
+        # CDB (if available).
+        cdb_path = self._find_cdb()
+        if cdb_path is None:
+            return
 
-    print ("### Collected %d crash dumps" % len(dumps))
-    for dump in dumps:
-      print ()
-      print ("### Dumping stacks from %s using CDB" % dump)
-      cdb_output = subprocess.check_output(
-          '"%s" -z "%s" -kqm -c "!uniqstack -b -v -p;qd"' % (cdb_path, dump),
-          stderr=subprocess.STDOUT)
-      # Extract output of uniqstack from the whole output of CDB.
-      output = False
-      for line in cdb_output.split('\n'):
-        if re.match(WindowsCoreDumpArchiver.CDBG_PROMPT_RE, line):
-          output = True
-        elif line.startswith("quit:"):
-          break
-        elif output:
-          print (line)
-    print ()
-    print ("#############################################")
-    print ()
+        dumps = self._find_all_coredumps()
+        if not dumps:
+            return
 
+        print("### Collected %d crash dumps" % len(dumps))
+        for dump in dumps:
+            print()
+            print("### Dumping stacks from %s using CDB" % dump)
+            cdb_output = subprocess.check_output(
+                '"%s" -z "%s" -kqm -c "!uniqstack -b -v -p;qd"' % (cdb_path,
+                                                                   dump),
+                stderr=subprocess.STDOUT)
+            # Extract output of uniqstack from the whole output of CDB.
+            output = False
+            for line in cdb_output.split('\n'):
+                if re.match(WindowsCoreDumpArchiver.CDBG_PROMPT_RE, line):
+                    output = True
+                elif line.startswith("quit:"):
+                    break
+                elif output:
+                    print(line)
+        print()
+        print("#############################################")
+        print()
 
-  def __exit__(self, *args):
-    try:
-      self._dump_all_stacks()
-    except Exception as error:
-      print ("ERROR: Unable to dump stacks from dumps: %s" % error)
+    def __exit__(self, *args):
+        try:
+            self._dump_all_stacks()
+        except Exception as error:
+            print("ERROR: Unable to dump stacks from dumps: %s" % error)
 
-    super(WindowsCoreDumpArchiver, self).__exit__(*args)
+        super(WindowsCoreDumpArchiver, self).__exit__(*args)
 
+    def _cleanup(self):
+        found = super(WindowsCoreDumpArchiver, self)._cleanup()
+        for core in glob.glob(os.path.join(self._search_dir, '*')):
+            found = True
+            TryUnlink(core)
+        return found
 
-  def _cleanup(self):
-    found = super(WindowsCoreDumpArchiver, self)._cleanup()
-    for core in glob.glob(os.path.join(self._search_dir, '*')):
-      found = True
-      TryUnlink(core)
-    return found
+    def _find_all_coredumps(self):
+        pattern = os.path.join(self._search_dir, '*.dmp')
+        return [core_filename for core_filename in glob.glob(pattern)]
 
-  def _find_all_coredumps(self):
-    pattern = os.path.join(self._search_dir, '*.dmp')
-    return [core_filename for core_filename in glob.glob(pattern)]
+    def _find_coredump_file(self, crash):
+        if self._dumps_by_pid is None:
+            # If this function is invoked the first time then look through the directory
+            # that contains crashes for all dump files and collect pid -> filename
+            # mapping.
+            self._dumps_by_pid = {}
+            minidump = GetMinidumpUtils()
+            pattern = os.path.join(self._search_dir, '*.dmp')
+            for core_filename in glob.glob(pattern):
+                pid = minidump.GetProcessIdFromDump(core_filename)
+                if pid != -1:
+                    self._dumps_by_pid[str(pid)] = core_filename
+        if crash.pid in self._dumps_by_pid:
+            return self._dumps_by_pid[crash.pid]
 
-  def _find_coredump_file(self, crash):
-    if self._dumps_by_pid is None:
-      # If this function is invoked the first time then look through the directory
-      # that contains crashes for all dump files and collect pid -> filename
-      # mapping.
-      self._dumps_by_pid = {}
-      minidump = GetMinidumpUtils()
-      pattern = os.path.join(self._search_dir, '*.dmp')
-      for core_filename in glob.glob(pattern):
-        pid = minidump.GetProcessIdFromDump(core_filename)
-        if pid != -1:
-          self._dumps_by_pid[str(pid)] = core_filename
-    if crash.pid in self._dumps_by_pid:
-      return self._dumps_by_pid[crash.pid]
+    def _report_missing_crashes(self, missing, throw=True):
+        # Let's only print the debugging information and not throw. We'll do more
+        # validation for werfault.exe and throw afterwards.
+        super(WindowsCoreDumpArchiver, self)._report_missing_crashes(
+            missing, throw=False)
 
-  def _report_missing_crashes(self, missing, throw=True):
-    # Let's only print the debugging information and not throw. We'll do more
-    # validation for werfault.exe and throw afterwards.
-    super(WindowsCoreDumpArchiver, self)._report_missing_crashes(missing, throw=False)
+        if throw:
+            missing_as_string = ', '.join([str(c) for c in missing])
+            raise Exception('Missing crash dumps for: %s' % missing_as_string)
 
-    if throw:
-      missing_as_string = ', '.join([str(c) for c in missing])
-      raise Exception('Missing crash dumps for: %s' % missing_as_string)
 
 class IncreasedNumberOfFileDescriptors(object):
-  def __init__(self, nofiles):
-    self._old_limits = None
-    self._limits = (nofiles, nofiles)
 
-  def __enter__(self):
-    self._old_limits = resource.getrlimit(resource.RLIMIT_NOFILE)
-    resource.setrlimit(resource.RLIMIT_NOFILE, self._limits)
+    def __init__(self, nofiles):
+        self._old_limits = None
+        self._limits = (nofiles, nofiles)
 
-  def __exit__(self, *_):
-    resource.setrlimit(resource.RLIMIT_CORE, self._old_limits)
+    def __enter__(self):
+        self._old_limits = resource.getrlimit(resource.RLIMIT_NOFILE)
+        resource.setrlimit(resource.RLIMIT_NOFILE, self._limits)
+
+    def __exit__(self, *_):
+        resource.setrlimit(resource.RLIMIT_CORE, self._old_limits)
+
 
 @contextlib.contextmanager
 def NooptContextManager():
-  yield
+    yield
 
 
 def CoreDumpArchiver(args):
-  enabled = '--copy-coredumps' in args
-  prefix = '--output-directory='
-  output_directory = next((arg[len(prefix):] for arg in args if arg.startswith(prefix)), None)
+    enabled = '--copy-coredumps' in args
+    prefix = '--output-directory='
+    output_directory = next(
+        (arg[len(prefix):] for arg in args if arg.startswith(prefix)), None)
 
-  if not enabled:
-    return NooptContextManager()
+    if not enabled:
+        return NooptContextManager()
 
-  osname = GuessOS()
-  if osname == 'linux':
-    return contextlib.nested(LinuxCoreDumpEnabler(),
-                             LinuxCoreDumpArchiver(output_directory))
-  elif osname == 'macos':
-    return contextlib.nested(PosixCoreDumpEnabler(),
-                             MacOSCoreDumpArchiver(output_directory))
-  elif osname == 'win32':
-    return contextlib.nested(WindowsCoreDumpEnabler(),
-                             WindowsCoreDumpArchiver(output_directory))
-  else:
-    # We don't have support for MacOS yet.
-    return NooptContextManager()
+    osname = GuessOS()
+    if osname == 'linux':
+        return contextlib.nested(LinuxCoreDumpEnabler(),
+                                 LinuxCoreDumpArchiver(output_directory))
+    elif osname == 'macos':
+        return contextlib.nested(PosixCoreDumpEnabler(),
+                                 MacOSCoreDumpArchiver(output_directory))
+    elif osname == 'win32':
+        return contextlib.nested(WindowsCoreDumpEnabler(),
+                                 WindowsCoreDumpArchiver(output_directory))
+    else:
+        # We don't have support for MacOS yet.
+        return NooptContextManager()
+
 
 def FileDescriptorLimitIncreaser():
-  osname = GuessOS()
-  if osname == 'macos':
-    return IncreasedNumberOfFileDescriptors(nofiles=10000)
-  else:
-    assert osname in ('linux', 'win32')
-    # We don't have support for MacOS yet.
-    return NooptContextManager()
+    osname = GuessOS()
+    if osname == 'macos':
+        return IncreasedNumberOfFileDescriptors(nofiles=10000)
+    else:
+        assert osname in ('linux', 'win32')
+        # We don't have support for MacOS yet.
+        return NooptContextManager()
+
 
 if __name__ == "__main__":
-  import sys
-  Main()
+    import sys
+    Main()
diff --git a/tools/write_dartdoc_options_file.py b/tools/write_dartdoc_options_file.py
index 44f0278..b1d23f3 100755
--- a/tools/write_dartdoc_options_file.py
+++ b/tools/write_dartdoc_options_file.py
@@ -7,34 +7,34 @@
 import sys
 import utils
 
+
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to write a custom dartdoc_options.yaml to a file')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to write a custom dartdoc_options.yaml to a file')
 
-  parser.add_argument('--output', '-o',
-      type=str,
-      required=True,
-      help='File to write')
+    parser.add_argument(
+        '--output', '-o', type=str, required=True, help='File to write')
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def Main(argv):
-  args = ParseArgs(argv)
-  # TODO(jcollins-g): switch to version numbers when github has its tags synced
-  revision = utils.GetGitRevision()
-  if revision is None:
-    revision = 'master'
-  output = '''dartdoc:
+    args = ParseArgs(argv)
+    # TODO(jcollins-g): switch to version numbers when github has its tags synced
+    revision = utils.GetGitRevision()
+    if revision is None:
+        revision = 'master'
+    output = '''dartdoc:
   categoryOrder: ["Core", "VM", "Web"]
   linkToSource:
     root: '.'
     uriTemplate: 'https://github.com/dart-lang/sdk/blob/%s/sdk/%%f%%#L%%l%%'
 ''' % revision
-  with open(args.output, 'w') as f:
-    f.write(output)
-  return 0
+    with open(args.output, 'w') as f:
+        f.write(output)
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/write_revision_file.py b/tools/write_revision_file.py
index 698f82a..db85841 100755
--- a/tools/write_revision_file.py
+++ b/tools/write_revision_file.py
@@ -8,27 +8,26 @@
 import sys
 import utils
 
+
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to write the version string to a file')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to write the version string to a file')
 
-  parser.add_argument('--output', '-o',
-      type=str,
-      required=True,
-      help='File to write')
+    parser.add_argument(
+        '--output', '-o', type=str, required=True, help='File to write')
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def Main(argv):
-  args = ParseArgs(argv)
-  revision = utils.GetGitRevision()
-  if revision is not None:
-    with open(args.output, 'w') as f:
-      f.write('%s\n' % revision)
-  return 0
+    args = ParseArgs(argv)
+    revision = utils.GetGitRevision()
+    if revision is not None:
+        with open(args.output, 'w') as f:
+            f.write('%s\n' % revision)
+    return 0
 
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/write_version_file.py b/tools/write_version_file.py
index f655845..75cbc09 100755
--- a/tools/write_version_file.py
+++ b/tools/write_version_file.py
@@ -8,25 +8,25 @@
 import sys
 import utils
 
+
 def ParseArgs(args):
-  args = args[1:]
-  parser = argparse.ArgumentParser(
-      description='A script to write the version string to a file')
+    args = args[1:]
+    parser = argparse.ArgumentParser(
+        description='A script to write the version string to a file')
 
-  parser.add_argument('--output', '-o',
-      type=str,
-      required=True,
-      help='File to write')
+    parser.add_argument(
+        '--output', '-o', type=str, required=True, help='File to write')
 
-  return parser.parse_args(args)
+    return parser.parse_args(args)
 
 
 def Main(argv):
-  args = ParseArgs(argv)
-  version = utils.GetVersion()
-  with open(args.output, 'w') as versionFile:
-    versionFile.write(version + '\n')
-  return 0
+    args = ParseArgs(argv)
+    version = utils.GetVersion()
+    with open(args.output, 'w') as versionFile:
+        versionFile.write(version + '\n')
+    return 0
+
 
 if __name__ == '__main__':
-  sys.exit(Main(sys.argv))
+    sys.exit(Main(sys.argv))
diff --git a/tools/yaml2json.py b/tools/yaml2json.py
index 19cb288..f9f3519 100755
--- a/tools/yaml2json.py
+++ b/tools/yaml2json.py
@@ -9,18 +9,19 @@
 
 import utils
 
+
 def Main():
-  args = sys.argv[1:]
-  yaml2json_dart = os.path.relpath(
-    os.path.join(os.path.dirname(__file__), "yaml2json.dart"))
-  command = [utils.CheckedInSdkExecutable(), yaml2json_dart] + args
+    args = sys.argv[1:]
+    yaml2json_dart = os.path.relpath(
+        os.path.join(os.path.dirname(__file__), "yaml2json.dart"))
+    command = [utils.CheckedInSdkExecutable(), yaml2json_dart] + args
 
-  with utils.CoreDumpArchiver(args):
-    exit_code = subprocess.call(command)
+    with utils.CoreDumpArchiver(args):
+        exit_code = subprocess.call(command)
 
-  utils.DiagnoseExitCode(exit_code, command)
-  return exit_code
+    utils.DiagnoseExitCode(exit_code, command)
+    return exit_code
 
 
 if __name__ == '__main__':
-  sys.exit(Main())
+    sys.exit(Main())
diff --git a/utils/bazel/kernel_worker.dart b/utils/bazel/kernel_worker.dart
index e8d91fc..d13bb1a 100644
--- a/utils/bazel/kernel_worker.dart
+++ b/utils/bazel/kernel_worker.dart
@@ -372,5 +372,7 @@
 
 Uri _toUri(String uriString) {
   if (uriString == null) return null;
-  return Uri.base.resolve(uriString);
+  // Windows-style paths use '\', so convert them to '/' in case they've been
+  // concatenated with Unix-style paths.
+  return Uri.base.resolve(uriString.replaceAll("\\", "/"));
 }
diff --git a/utils/dartdevc/BUILD.gn b/utils/dartdevc/BUILD.gn
index 6069ad1..b7b63ce 100644
--- a/utils/dartdevc/BUILD.gn
+++ b/utils/dartdevc/BUILD.gn
@@ -26,10 +26,11 @@
   ]
 
   deps = [
-    ":dartdevc_sdk",
+    ":dartdevc_kernel_sdk",
+    ":dartdevc_kernel_sdk_outline",
   ]
 
-  inputs = [ sdk_summary ]
+  inputs = [ sdk_dill ]
 }
 
 sdk_lib_files = exec_script("../../tools/list_dart_files.py",
@@ -245,6 +246,8 @@
     ":dartdevc_files_stamp",
     ":dartdevc_sdk",
     ":dartdevc_kernel_sdk",
+    ":dartdevc_kernel_sdk_outline",
+    ":dartdevc_kernel_sdk_libraries_json",
     "../../pkg:pkg_files_stamp",
   ]
 
@@ -314,6 +317,51 @@
   ]
 }
 
+prebuilt_dart_action("dartdevc_kernel_sdk_outline") {
+  deps = [
+    "../../pkg:pkg_files_stamp",
+    ":dartdevc_files_stamp",
+    ":dartdevc_sdk_patch_stamp",
+  ]
+
+  inputs = [
+    "../../utils/bazel/kernel_worker.dart",
+    "$target_gen_dir/dartdevc_files.stamp",
+    "$root_gen_dir/pkg_files.stamp",
+  ]
+
+  outputs = [
+    sdk_dill,
+  ]
+
+  script = "../../utils/bazel/kernel_worker.dart"
+
+  args = [
+    "--summary-only",
+    "--target",
+    "ddc",
+    "--multi-root-scheme",
+    "org-dartlang-sdk",
+    "--multi-root",
+    rebase_path("../../sdk"),
+    "--libraries-file",
+    "file:///" + rebase_path("../../sdk/lib/libraries.json"),
+    "--output",
+    rebase_path(sdk_dill),
+    "--source",
+    "dart:core"
+  ]
+}
+
+copy("dartdevc_kernel_sdk_libraries_json") {
+  sources = [
+    rebase_path("../../sdk/lib/libraries.json"),
+  ]
+  outputs = [
+    sdk_libraries_json,
+  ]
+}
+
 # Compiles the DDC SDK's kernel summary and JS code.
 prebuilt_dart_action("dartdevc_kernel_sdk") {
   deps = [
@@ -323,14 +371,11 @@
   ]
 
   inputs = [
-    "../../pkg/dev_compiler/tool/kernel_sdk.dart",
     "$target_gen_dir/dartdevc_files.stamp",
     "$root_gen_dir/pkg_files.stamp",
   ]
 
   outputs = [
-    sdk_dill,
-    sdk_libraries_json,
     "$target_gen_dir/kernel/amd/dart_sdk.js",
     "$target_gen_dir/kernel/amd/dart_sdk.js.map",
     "$target_gen_dir/kernel/common/dart_sdk.js",
@@ -341,12 +386,36 @@
     "$target_gen_dir/kernel/legacy/dart_sdk.js.map",
   ]
 
-  script = "../../pkg/dev_compiler/tool/kernel_sdk.dart"
+  script = "../../pkg/dev_compiler/bin/dartdevc.dart"
 
   args = [
-    "--output",
-    rebase_path(sdk_dill),
-    "--libraries",
-    rebase_path("../../sdk/lib/libraries.json"),
+    "-k",
+    "--compile-sdk",
+    "dart:core",
+    "--no-summarize",
+    "--multi-root-scheme",
+    "org-dartlang-sdk",
+    "--multi-root",
+    "file:///" + rebase_path("../../sdk"),
+    "--multi-root-output-path",
+    rebase_path("$target_gen_dir/../../"),
+    "--libraries-file",
+    "org-dartlang-sdk:///lib/libraries.json",
+    "--modules",
+    "amd",
+    "-o",
+    rebase_path("$target_gen_dir/kernel/amd/dart_sdk.js"),
+    "--modules",
+    "common",
+    "-o",
+    rebase_path("$target_gen_dir/kernel/common/dart_sdk.js"),
+    "--modules",
+    "es6",
+    "-o",
+    rebase_path("$target_gen_dir/kernel/es6/dart_sdk.js"),
+    "--modules",
+    "legacy",
+    "-o",
+    rebase_path("$target_gen_dir/kernel/legacy/dart_sdk.js"),
   ]
 }